summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--.qmake.conf5
-rw-r--r--Studio/Content/Behavior Library/CameraLookAt.qml116
-rw-r--r--Studio/Content/Effect Library/AdditiveColorGradient.effect32
-rw-r--r--Studio/Content/Effect Library/BaseEffect.effect30
-rw-r--r--Studio/Content/Effect Library/Bloom.effect200
-rw-r--r--Studio/Content/Effect Library/Blur.effect47
-rw-r--r--Studio/Content/Effect Library/Brush Strokes.effect38
-rw-r--r--Studio/Content/Effect Library/ChromaticAberration.effect56
-rw-r--r--Studio/Content/Effect Library/ColorMaster.effect38
-rw-r--r--Studio/Content/Effect Library/Corona.effect97
-rw-r--r--Studio/Content/Effect Library/Depth Of Field Bokeh.effect302
-rw-r--r--Studio/Content/Effect Library/Depth Of Field HQ Blur.effect67
-rw-r--r--Studio/Content/Effect Library/Desaturate.effect35
-rw-r--r--Studio/Content/Effect Library/Distortion Ripple.effect50
-rw-r--r--Studio/Content/Effect Library/Distortion Sphere.effect46
-rw-r--r--Studio/Content/Effect Library/Distortion Spiral.effect51
-rw-r--r--Studio/Content/Effect Library/Edge Detect.effect81
-rw-r--r--Studio/Content/Effect Library/Emboss.effect41
-rw-r--r--Studio/Content/Effect Library/FXAA.effect51
-rw-r--r--Studio/Content/Effect Library/FrameFlipper.effect41
-rw-r--r--Studio/Content/Effect Library/FullScreenTextureOverlay.effect27
-rw-r--r--Studio/Content/Effect Library/Gaussian Blur.effect48
-rw-r--r--Studio/Content/Effect Library/HDRBloomTonemap.effect282
-rw-r--r--Studio/Content/Effect Library/LightTable.effect233
-rw-r--r--Studio/Content/Effect Library/Motion Blur.effect76
-rw-r--r--Studio/Content/Effect Library/SCurveTonemap.effect117
-rw-r--r--Studio/Content/Effect Library/SMAA1X.effect149
-rw-r--r--Studio/Content/Effect Library/Screen Space AO.effect90
-rw-r--r--Studio/Content/Effect Library/Sepia.effect64
-rw-r--r--Studio/Content/Effect Library/Stylize - Scatter.effect47
-rw-r--r--Studio/Content/Effect Library/Tilt Shift.effect111
-rw-r--r--Studio/Content/Effect Library/VignetteEffect.effect39
-rw-r--r--Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.ddsbin0 -> 179328 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.pngbin0 -> 26679 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/CircleBokeh.pngbin0 -> 1718 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/HexagonalBokeh.pngbin0 -> 910 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/SearchTex-yflipped.pngbin0 -> 180 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/brushnoise.ddsbin0 -> 65664 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/brushnoise.pngbin0 -> 61885 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/noise.ddsbin0 -> 4224 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/noise.pngbin0 -> 3251 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/noise3.ddsbin0 -> 349652 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/noise3.pngbin0 -> 9288 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/noiseUniform.ddsbin0 -> 262272 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/noiseUniform.pngbin0 -> 262990 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/ps_cloudlet.pngbin0 -> 2807 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/ps_glowDisc.pngbin0 -> 2329 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/ps_glowSphere.pngbin0 -> 2382 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/ps_rectangle.pngbin0 -> 1285 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/ps_sphere.ddsbin0 -> 16512 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/ps_sphere.pngbin0 -> 789 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/ps_star.pngbin0 -> 6760 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/snownoise.ddsbin0 -> 1048704 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/snownoise.pngbin0 -> 50015 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/starBokeh.pngbin0 -> 1326 bytes
-rw-r--r--Studio/Content/Effect Library/maps/effects/white.pngbin0 -> 189 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/DESCRIPTION.en_us.html22
-rw-r--r--Studio/Content/Font Library/titilliumweb/METADATA.pb107
-rw-r--r--Studio/Content/Font Library/titilliumweb/OFL.txt93
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-Black.ttfbin0 -> 49356 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-Bold.ttfbin0 -> 59908 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-BoldItalic.ttfbin0 -> 69796 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLight.ttfbin0 -> 63124 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLightItalic.ttfbin0 -> 67788 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-Italic.ttfbin0 -> 72416 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-Light.ttfbin0 -> 64032 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-LightItalic.ttfbin0 -> 71720 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-Regular.ttfbin0 -> 63752 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBold.ttfbin0 -> 63044 bytes
-rw-r--r--Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBoldItalic.ttfbin0 -> 71812 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1-mirror.pngbin0 -> 20716 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1.pngbin0 -> 20682 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2-mirror.pngbin0 -> 16960 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2.pngbin0 -> 16927 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3-mirror.pngbin0 -> 13242 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3.pngbin0 -> 13219 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4-mirror.pngbin0 -> 9122 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4.pngbin0 -> 9086 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-1.pngbin0 -> 20589 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-2.pngbin0 -> 13742 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-3.pngbin0 -> 9641 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1-inverse.pngbin0 -> 21355 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1.pngbin0 -> 21323 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2-inverse.pngbin0 -> 20946 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2.pngbin0 -> 20906 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3-inverse.pngbin0 -> 19449 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3.pngbin0 -> 19425 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4-inverse.pngbin0 -> 15421 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4.pngbin0 -> 15424 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5-inverse.pngbin0 -> 11673 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5.pngbin0 -> 11678 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1-mirror.pngbin0 -> 19304 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1.pngbin0 -> 19077 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2-mirror.pngbin0 -> 15431 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2.pngbin0 -> 15563 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3-mirror.pngbin0 -> 10641 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3.pngbin0 -> 10684 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4-mirror.pngbin0 -> 6791 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4.pngbin0 -> 6766 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-1.pngbin0 -> 16991 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-2.pngbin0 -> 9912 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-3.pngbin0 -> 7099 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-1.pngbin0 -> 5657 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-2.pngbin0 -> 5924 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-3.pngbin0 -> 7578 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-4.pngbin0 -> 6215 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-1.pngbin0 -> 848 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-2.pngbin0 -> 1049 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-3.pngbin0 -> 1061 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-1.pngbin0 -> 116581 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-2.pngbin0 -> 74198 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-3.pngbin0 -> 42908 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-ripple.pngbin0 -> 146951 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-twist.pngbin0 -> 116094 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-1.pngbin0 -> 2637 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-2.pngbin0 -> 3456 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-3.pngbin0 -> 3671 bytes
-rw-r--r--Studio/Content/Maps Library/Alpha Maps/misc alpha maps/splatter-1.pngbin0 -> 36062 bytes
-rw-r--r--Studio/Content/Maps Library/Automotive/indicators_icons.pngbin0 -> 49248 bytes
-rw-r--r--Studio/Content/Maps Library/Automotive/indicators_icons_extended.pngbin0 -> 34746 bytes
-rw-r--r--Studio/Content/Maps Library/Automotive/large_tic_marks.pngbin0 -> 82020 bytes
-rw-r--r--Studio/Content/Maps Library/Automotive/medium_tic_marks.pngbin0 -> 227788 bytes
-rw-r--r--Studio/Content/Maps Library/Automotive/small_tic_marks.pngbin0 -> 355557 bytes
-rw-r--r--Studio/Content/Maps Library/Bump Maps/bump.ddsbin0 -> 699192 bytes
-rw-r--r--Studio/Content/Maps Library/Bump Maps/bump.pngbin0 -> 1800502 bytes
-rw-r--r--Studio/Content/Maps Library/Bump Maps/rubber_hatch.ddsbin0 -> 1493 bytes
-rw-r--r--Studio/Content/Maps Library/Bump Maps/rubber_hatch.pngbin0 -> 221 bytes
-rw-r--r--Studio/Content/Maps Library/Concepting Maps/Finger-idle.pngbin0 -> 34325 bytes
-rw-r--r--Studio/Content/Maps Library/Concepting Maps/Finger-pressureDown.pngbin0 -> 34649 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/LICENSE-OpenfootageNET.txt7
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-1024.hdrbin0 -> 1601679 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-512.hdrbin0 -> 401151 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-1024.hdrbin0 -> 1759202 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-512.hdrbin0 -> 443546 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-1024.hdrbin0 -> 1719709 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-512.hdrbin0 -> 434178 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-1024.hdrbin0 -> 1659936 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-512.hdrbin0 -> 416212 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-1024.hdrbin0 -> 1954066 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-512.hdrbin0 -> 489367 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-1024.hdrbin0 -> 1625204 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-512.hdrbin0 -> 421718 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-1024.hdrbin0 -> 1553532 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-512.hdrbin0 -> 385303 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_garage-1024.hdrbin0 -> 1675239 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_garage-512.hdrbin0 -> 422659 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-1024.hdrbin0 -> 1659619 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-512.hdrbin0 -> 407359 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-1024.hdrbin0 -> 1459275 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-512.hdrbin0 -> 362018 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-1024.hdrbin0 -> 1704663 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-512.hdrbin0 -> 426013 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/TestEnvironment-1024.hdrbin0 -> 182979 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/TestEnvironment-2048.hdrbin0 -> 379796 bytes
-rw-r--r--Studio/Content/Maps Library/Environments/TestEnvironment-512.hdrbin0 -> 87897 bytes
-rw-r--r--Studio/Content/Maps Library/Logos/Qt/QT-badge.pngbin0 -> 26806 bytes
-rw-r--r--Studio/Content/Maps Library/Logos/Qt/QT-symbol-flatWhite.pngbin0 -> 4407 bytes
-rw-r--r--Studio/Content/Maps Library/Logos/Qt/QT-symbol.pngbin0 -> 4541 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-128X128.pngbin0 -> 4653 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-256X256.pngbin0 -> 6847 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-32X32.pngbin0 -> 3091 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-64X64.pngbin0 -> 3503 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-01p.pngbin0 -> 12282 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-02p.pngbin0 -> 13612 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-03p.pngbin0 -> 14342 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-05p.pngbin0 -> 15330 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-10p.pngbin0 -> 16056 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-15p.pngbin0 -> 16015 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-20p.pngbin0 -> 15761 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-25p.pngbin0 -> 15580 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-30p.pngbin0 -> 15358 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/circles/circle-stroke-50p.pngbin0 -> 14444 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/squares/square-stroke-01p.pngbin0 -> 308 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/squares/square-stroke-02p.pngbin0 -> 311 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/squares/square-stroke-03p.pngbin0 -> 315 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/squares/square-stroke-05p.pngbin0 -> 315 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/squares/square-stroke-10p.pngbin0 -> 315 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/squares/square-stroke-25p.pngbin0 -> 316 bytes
-rw-r--r--Studio/Content/Maps Library/Shapes/squares/square-stroke-50p.pngbin0 -> 317 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/flares/Flare1.pngbin0 -> 67124 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/flares/Flare2.pngbin0 -> 34096 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/flares/Flare3.pngbin0 -> 55247 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/flares/Flare4.pngbin0 -> 10293 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/flares/Flare5.pngbin0 -> 6013 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/glows/Glow-CircleBorder-1.pngbin0 -> 7713 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/glows/Glow-circle-1.pngbin0 -> 6956 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/glows/Glow-circle-2.pngbin0 -> 7378 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/glows/Glow-circle-3.pngbin0 -> 6261 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/grids/grid-01.pngbin0 -> 852 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/grids/grid-02.pngbin0 -> 860 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/grids/grid-03.pngbin0 -> 804 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/grids/grid-04.pngbin0 -> 4294 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Color.pngbin0 -> 56784 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing.pngbin0 -> 41008 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing2.pngbin0 -> 18027 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Ring.pngbin0 -> 40346 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/cloudy_smoke.pngbin0 -> 44892 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/smoke-1.pngbin0 -> 18747 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/smoke-2.pngbin0 -> 20493 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/smoke-3.pngbin0 -> 59584 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/smoke-4.pngbin0 -> 40489 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/smoke-5.pngbin0 -> 39949 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-1.pngbin0 -> 7036 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-2.pngbin0 -> 6210 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/streaks/streak_narrow.pngbin0 -> 5423 bytes
-rw-r--r--Studio/Content/Maps Library/Special Effects/streaks/streak_wide.pngbin0 -> 6723 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_01.jpgbin0 -> 10337 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_02.jpgbin0 -> 3546 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_03.jpgbin0 -> 13591 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Gold/Gold_01.jpgbin0 -> 19212 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Gold/Gold_02.jpgbin0 -> 4708 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Gold/Gold_03.jpgbin0 -> 6617 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-1.jpgbin0 -> 32092 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-2.jpgbin0 -> 14997 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-3.jpgbin0 -> 14187 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Smear.jpgbin0 -> 4726 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Underwater.jpgbin0 -> 7250 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Window.jpgbin0 -> 9044 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-ceiling_lights-1.pngbin0 -> 112135 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-dull-1.pngbin0 -> 20645 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-dull-2.pngbin0 -> 23688 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-dull-3.pngbin0 -> 29961 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1-alpha-25_orange.pngbin0 -> 14680 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1.pngbin0 -> 77525 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-shiny-2.pngbin0 -> 32372 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/Specular-shiny-3.pngbin0 -> 24469 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha01.pngbin0 -> 88912 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha02.pngbin0 -> 47456 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha03.pngbin0 -> 53691 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha04.pngbin0 -> 21654 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha05.pngbin0 -> 21903 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-100.pngbin0 -> 63791 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-25.pngbin0 -> 76845 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-50.pngbin0 -> 82405 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-75.pngbin0 -> 83333 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-90.pngbin0 -> 85058 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-100.pngbin0 -> 31276 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25.pngbin0 -> 21781 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25_refIVI.pngbin0 -> 21781 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50.pngbin0 -> 26114 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50_green.pngbin0 -> 24660 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-75.pngbin0 -> 28962 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-90.pngbin0 -> 30974 bytes
-rw-r--r--Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-blue.pngbin0 -> 12397 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Cork1.pngbin0 -> 620566 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Fabric1.pngbin0 -> 252560 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Fabric2.pngbin0 -> 334081 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Grass2.pngbin0 -> 639867 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Metal_Bronze.pngbin0 -> 50334 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Metal_Oxydized.pngbin0 -> 109861 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Metal_Streaks.pngbin0 -> 13744 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Paper05.pngbin0 -> 321820 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Scratched_Aluminum.pngbin0 -> 84991 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Stone1.pngbin0 -> 279846 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Water1.pngbin0 -> 484212 bytes
-rw-r--r--Studio/Content/Maps Library/Texture Maps/Wood7.pngbin0 -> 445815 bytes
-rw-r--r--Studio/Content/Maps Library/UV-Checker.pngbin0 -> 10586 bytes
-rw-r--r--Studio/Content/Material Library/aluminium_anodized.shader178
-rw-r--r--Studio/Content/Material Library/aluminium_anodized_emissive.shader214
-rw-r--r--Studio/Content/Material Library/aluminum.shader223
-rw-r--r--Studio/Content/Material Library/aluminum_anisotropic.shader260
-rw-r--r--Studio/Content/Material Library/aluminum_brushed.shader224
-rw-r--r--Studio/Content/Material Library/aluminum_emissive.shader230
-rw-r--r--Studio/Content/Material Library/aluminum_textured_aniso.shader263
-rw-r--r--Studio/Content/Material Library/asphalt.shader236
-rw-r--r--Studio/Content/Material Library/bamboo_natural_matte.shader236
-rw-r--r--Studio/Content/Material Library/bamboo_natural_matte_emissive.shader242
-rw-r--r--Studio/Content/Material Library/carbon_fiber.shader271
-rw-r--r--Studio/Content/Material Library/carbon_fiber_emissive.shader277
-rw-r--r--Studio/Content/Material Library/carpaint_blue_standard.shader231
-rw-r--r--Studio/Content/Material Library/carpaint_color_peel_2_layer.shader255
-rw-r--r--Studio/Content/Material Library/carpaint_yellow_standard.shader231
-rw-r--r--Studio/Content/Material Library/concrete.shader235
-rw-r--r--Studio/Content/Material Library/copper.shader178
-rw-r--r--Studio/Content/Material Library/leather_smoothed_black.shader236
-rw-r--r--Studio/Content/Material Library/maps/materials/art_paper_normal.pngbin0 -> 8361968 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/art_paper_trans.pngbin0 -> 7271168 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/asphalt.pngbin0 -> 1884467 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/asphalt_bump.pngbin0 -> 243515 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/bamboo_natural.pngbin0 -> 1520156 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/bamboo_natural_bump.pngbin0 -> 111006 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/bamboo_natural_spec.pngbin0 -> 279332 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/brushed_a.pngbin0 -> 3805351 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/brushed_a_full_contrast_scratched.pngbin0 -> 2972427 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/brushed_a_scratched_50_percent.pngbin0 -> 4574567 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/brushed_chrome.pngbin0 -> 4114475 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/brushed_chrome_spec.pngbin0 -> 2700298 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/brushed_full_contrast.pngbin0 -> 2272310 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/brushed_full_contrast_inverted.pngbin0 -> 2272900 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/bubinga.pngbin0 -> 1617388 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/bubinga_bump.pngbin0 -> 245002 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/bubinga_spec.pngbin0 -> 229002 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/carbon_fiber.pngbin0 -> 4709566 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/carbon_fiber_aniso.pngbin0 -> 308757 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/carbon_fiber_bump.pngbin0 -> 2657804 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/carbon_fiber_spec.pngbin0 -> 4172072 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/concentric_milled_steel.pngbin0 -> 4216 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/concentric_milled_steel_aniso.pngbin0 -> 368334 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/concrete_plain.pngbin0 -> 2107394 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/concrete_plain_bump.pngbin0 -> 184163 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing.pngbin0 -> 342369 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing_normal.pngbin0 -> 92373 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/emissive.pngbin0 -> 334 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/emissive_mask.pngbin0 -> 334 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/gentle_noise.pngbin0 -> 4577174 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/granite_black.pngbin0 -> 1900736 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/granite_yellow.pngbin0 -> 2405231 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/grunge_b.pngbin0 -> 6977465 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/grunge_b1.pngbin0 -> 5502762 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/grunge_d.pngbin0 -> 3945985 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/grunge_texture_01.pngbin0 -> 8759326 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/mahogany.pngbin0 -> 1832923 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/mahogany_bump.pngbin0 -> 357957 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/mahogany_floorboards.pngbin0 -> 2254134 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/mahogany_floorboards_bump.pngbin0 -> 178207 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/mahogany_floorboards_spec.pngbin0 -> 219675 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/mahogany_spec.pngbin0 -> 355461 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/metal_mesh.pngbin0 -> 359882 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/metal_mesh_bump.pngbin0 -> 21046 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/metal_mesh_spec.pngbin0 -> 291286 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/paper_diffuse.pngbin0 -> 6055975 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/paper_trans.pngbin0 -> 4718043 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/powdercoat_bump_01.pngbin0 -> 3822468 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/randomGradient1D.pngbin0 -> 618 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/randomGradient2D.pngbin0 -> 738 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/randomGradient3D.pngbin0 -> 748 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/randomGradient4D.pngbin0 -> 535 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/shadow.pngbin0 -> 334 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/smooth_black_leather.pngbin0 -> 429570 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/smooth_black_leather_bump.pngbin0 -> 223014 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/smooth_black_leather_spec.pngbin0 -> 219279 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/spherical_checker.pngbin0 -> 11066 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/studded_rubber_bump.pngbin0 -> 26901 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/teak.pngbin0 -> 1198746 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/teak_bump.pngbin0 -> 170908 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/teak_spec.pngbin0 -> 213868 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/walnut.pngbin0 -> 1633772 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/walnut_bump.pngbin0 -> 283457 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/walnut_spec.pngbin0 -> 181017 bytes
-rw-r--r--Studio/Content/Material Library/maps/materials/white_marble.pngbin0 -> 1342939 bytes
-rw-r--r--Studio/Content/Material Library/mesh_fence.shader236
-rw-r--r--Studio/Content/Material Library/metal_mesh_fine.shader234
-rw-r--r--Studio/Content/Material Library/paper_artistic.shader257
-rw-r--r--Studio/Content/Material Library/paper_office.shader255
-rw-r--r--Studio/Content/Material Library/plastic_structured_red.shader204
-rw-r--r--Studio/Content/Material Library/plastic_structured_red_emissive.shader228
-rw-r--r--Studio/Content/Material Library/porcelain.shader181
-rw-r--r--Studio/Content/Material Library/powder_coat.shader221
-rw-r--r--Studio/Content/Material Library/powder_coat_emissive.shader256
-rw-r--r--Studio/Content/Material Library/rubber_studded_black.shader219
-rw-r--r--Studio/Content/Material Library/rubber_studded_emissive.shader238
-rw-r--r--Studio/Content/Material Library/simple_glass.shader197
-rw-r--r--Studio/Content/Material Library/steel_milled_concentric.shader237
-rw-r--r--Studio/Content/Material Library/thin_glass_frosted.shader485
-rw-r--r--Studio/Content/Material Library/thin_glass_frosted_sp.shader246
-rw-r--r--Studio/Content/Material Library/thin_glass_refractive.shader202
-rw-r--r--Studio/Content/Material Library/walnut_matte.shader236
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_2.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_3.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_4.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_5.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_6.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_7.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_8.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_round_background.dae227
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_1.dae263
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_10.dae221
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_11.dae221
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_12.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_13.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_2.dae263
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_3.dae221
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_4.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_5.dae221
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_6.dae221
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_7.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_8.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Needles/needle_9.dae221
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_180.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_2.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_270.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_2.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_2.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_2.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_120_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_12_clock.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_240_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_2.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_2.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_50_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_60_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_1.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_extrude.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_small.dae179
-rw-r--r--Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_90_degrees.dae179
-rw-r--r--Studio/Content/Models Library/Electronics/Headphones.dae319
-rw-r--r--Studio/Content/Models Library/Media/DVD_cover-reflection.dae139
-rw-r--r--Studio/Content/Models Library/Media/DVD_cover.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Cubes/RoundedCube-1.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Cubes/RoundedCube-2.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Cubes/RoundedCube-3.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Cubes/RoundedCube-4.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Cubes/RoundedCube-5.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided-mirroredUVs.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-16X16.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-2X2.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-32X32.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-4X4.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-8X8.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-mirroredUVs.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/RoundedPlane-1.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/RoundedPlane-2.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3a.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3b.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-high-doublesided.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-high-inverted.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-high.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-low-doublesided.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-low-inverted.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-low.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-doublesided.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-inverted.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-medium.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Spheres/Sphere-planerUVprojection.dae139
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-1.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-2.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-3.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-4.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-5.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-6.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-7.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-8.dae147
-rw-r--r--Studio/Content/Models Library/Primitives/Torus/Torus.dae139
-rw-r--r--commoninclude.pri87
-rw-r--r--commonplatform.pri308
-rw-r--r--configure.json9
-rw-r--r--examples/examples.pro3
-rw-r--r--examples/studio3d/cppdatainput/cppdatainput.pro11
-rw-r--r--examples/studio3d/cppdatainput/main.cpp137
-rw-r--r--examples/studio3d/cppdatainput/presentation/datainput.uia17
-rw-r--r--examples/studio3d/cppdatainput/presentation/datainput.uip45
-rw-r--r--examples/studio3d/cppdatainput/res.qrc6
-rw-r--r--examples/studio3d/qmldatainput/doc/images/qmldatainput.pngbin0 -> 163178 bytes
-rw-r--r--examples/studio3d/qmldatainput/doc/src/qmldatainput.qdoc55
-rw-r--r--examples/studio3d/qmldatainput/main.cpp79
-rw-r--r--examples/studio3d/qmldatainput/presentation/Paper05.pngbin0 -> 321820 bytes
-rw-r--r--examples/studio3d/qmldatainput/presentation/datainput.uia22
-rw-r--r--examples/studio3d/qmldatainput/presentation/datainput.uip66
-rw-r--r--examples/studio3d/qmldatainput/presentation/fonts/TitilliumWeb-Regular.ttfbin0 -> 63752 bytes
-rw-r--r--examples/studio3d/qmldatainput/qml/qmldatainput/main.qml211
-rw-r--r--examples/studio3d/qmldatainput/qmldatainput.pro20
-rw-r--r--examples/studio3d/qmldatainput/qmldatainput.qrc8
-rw-r--r--examples/studio3d/simpleqml/doc/images/simpleqml.pngbin0 -> 405882 bytes
-rw-r--r--examples/studio3d/simpleqml/doc/src/simpleqml.qdoc51
-rw-r--r--examples/studio3d/simpleqml/main.cpp75
-rw-r--r--examples/studio3d/simpleqml/main.qml284
-rw-r--r--examples/studio3d/simpleqml/presentation/barrel.uia16
-rw-r--r--examples/studio3d/simpleqml/presentation/barrel.uip58
-rw-r--r--examples/studio3d/simpleqml/presentation/barrel/barrel.import18
-rw-r--r--examples/studio3d/simpleqml/presentation/barrel/meshes/Barrel.meshbin0 -> 280864 bytes
-rw-r--r--examples/studio3d/simpleqml/presentation/barrel_no_background.uip56
-rw-r--r--examples/studio3d/simpleqml/presentation/fonts/Arimo-Regular.ttfbin0 -> 43616 bytes
-rw-r--r--examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Diffuse.pngbin0 -> 789475 bytes
-rw-r--r--examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Emissive.pngbin0 -> 3150 bytes
-rw-r--r--examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Normal.pngbin0 -> 721686 bytes
-rw-r--r--examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Specular.pngbin0 -> 195862 bytes
-rw-r--r--examples/studio3d/simpleqml/simpleqml.pro16
-rw-r--r--examples/studio3d/simpleqml/simpleqml.qrc14
-rw-r--r--examples/studio3d/studio3d.pro9
-rw-r--r--ogl-runtime.pro32
-rw-r--r--platformres.qrc4
-rw-r--r--res.qrc117
-rw-r--r--res/DataModelMetadata/en-us/MetaData.xml567
-rw-r--r--res/Font/TitilliumWeb-Regular.ttfbin0 -> 63752 bytes
-rw-r--r--res/effectlib/Fxaa3_11.glsllib2073
-rw-r--r--res/effectlib/Fxaa3_8.glsllib1423
-rw-r--r--res/effectlib/SMAA.glsllib1444
-rw-r--r--res/effectlib/SSAOCustomMaterial.glsllib91
-rw-r--r--res/effectlib/abbeNumberIOR.glsllib36
-rw-r--r--res/effectlib/anisotropyConversion.glsllib46
-rw-r--r--res/effectlib/average.glsllib35
-rw-r--r--res/effectlib/blendColorLayers.glsllib45
-rw-r--r--res/effectlib/blur.glsllib295
-rw-r--r--res/effectlib/calculateRoughness.glsllib63
-rw-r--r--res/effectlib/coordinateSource.glsllib55
-rw-r--r--res/effectlib/cube.glsllib50
-rw-r--r--res/effectlib/customCurveLayer.glsllib42
-rw-r--r--res/effectlib/customMaterial.glsllib47
-rw-r--r--res/effectlib/customMaterialFragBody.glsllib84
-rw-r--r--res/effectlib/customMaterialFragBodyAO.glsllib90
-rw-r--r--res/effectlib/defaultMaterialBumpNoLod.glsllib52
-rw-r--r--res/effectlib/defaultMaterialFileBumpTexture.glsllib40
-rw-r--r--res/effectlib/defaultMaterialFileDisplacementTexture.glsllib40
-rw-r--r--res/effectlib/defaultMaterialFileNormalTexture.glsllib40
-rw-r--r--res/effectlib/defaultMaterialFresnel.glsllib44
-rw-r--r--res/effectlib/defaultMaterialLighting.glsllib80
-rw-r--r--res/effectlib/defaultMaterialPhysGlossyBSDF.glsllib43
-rw-r--r--res/effectlib/depthpass.glsllib80
-rw-r--r--res/effectlib/dfTint.glsllib35
-rw-r--r--res/effectlib/diffuseReflectionBSDF.glsllib66
-rw-r--r--res/effectlib/diffuseTransmissionBSDF.glsllib42
-rw-r--r--res/effectlib/directionalFactor.glsllib42
-rw-r--r--res/effectlib/distancefieldtext.frag28
-rw-r--r--res/effectlib/distancefieldtext.vert77
-rw-r--r--res/effectlib/distancefieldtext_core.frag11
-rw-r--r--res/effectlib/distancefieldtext_core.vert15
-rw-r--r--res/effectlib/distancefieldtext_dropshadow.frag47
-rw-r--r--res/effectlib/distancefieldtext_dropshadow.vert88
-rw-r--r--res/effectlib/distancefieldtext_dropshadow_core.frag28
-rw-r--r--res/effectlib/distancefieldtext_dropshadow_core.vert25
-rw-r--r--res/effectlib/effect.glsllib148
-rw-r--r--res/effectlib/evalBakedShadowMap.glsllib36
-rw-r--r--res/effectlib/evalEnvironmentMap.glsllib55
-rw-r--r--res/effectlib/evalLightmaps.glsllib56
-rw-r--r--res/effectlib/fileBumpTexture.glsllib119
-rw-r--r--res/effectlib/fileDisplacementTexture.glsllib71
-rw-r--r--res/effectlib/fileTexture.glsllib48
-rw-r--r--res/effectlib/flakeNoiseBumpTexture.glsllib46
-rw-r--r--res/effectlib/flakeNoiseTexture.glsllib66
-rw-r--r--res/effectlib/fresnelLayer.glsllib109
-rw-r--r--res/effectlib/funcareaLightVars.glsllib32
-rw-r--r--res/effectlib/funccalculateDiffuseAreaOld.glsllib29
-rw-r--r--res/effectlib/funccalculatePointLightAttenuation.glsllib4
-rw-r--r--res/effectlib/funccomputeMicroHit.glsllib50
-rw-r--r--res/effectlib/funcdiffuseReflectionBSDF.glsllib43
-rw-r--r--res/effectlib/funcdiffuseReflectionWrapBSDF.glsllib5
-rw-r--r--res/effectlib/funcgetTransformedUVCoords.glsllib4
-rw-r--r--res/effectlib/funcsampleAreaGlossyDefault.glsllib42
-rw-r--r--res/effectlib/funcsampleLightVars.glsllib29
-rw-r--r--res/effectlib/funcspecularBSDF.glsllib42
-rw-r--r--res/effectlib/gles2/SSAOCustomMaterial.glsllib100
-rw-r--r--res/effectlib/gles2/defaultMaterialBumpNoLod.glsllib52
-rw-r--r--res/effectlib/gles2/evalEnvironmentMap.glsllib37
-rw-r--r--res/effectlib/gles2/funcareaLightVars.glsllib29
-rw-r--r--res/effectlib/gles2/funcsampleLightVars.glsllib27
-rw-r--r--res/effectlib/gles2/microfacetBSDF.glsllib233
-rw-r--r--res/effectlib/gles2/monoChannel.glsllib58
-rw-r--r--res/effectlib/gles2/refraction.glsllib87
-rw-r--r--res/effectlib/gles2/sampleProbe.glsllib482
-rw-r--r--res/effectlib/gles2/shadowMapping.glsllib106
-rw-r--r--res/effectlib/gles2/tangentSpaceNormalTexture.glsllib97
-rw-r--r--res/effectlib/gradient3Recolor.glsllib73
-rw-r--r--res/effectlib/gradient3Texture.glsllib36
-rw-r--r--res/effectlib/gradientGetPosition.glsllib76
-rw-r--r--res/effectlib/luminance.glsllib62
-rw-r--r--res/effectlib/miNoise.glsllib113
-rw-r--r--res/effectlib/microfacetBSDF.glsllib259
-rw-r--r--res/effectlib/monoChannel.glsllib58
-rw-r--r--res/effectlib/normalizedMix.glsllib42
-rw-r--r--res/effectlib/perlinNoise.glsllib234
-rw-r--r--res/effectlib/perlinNoiseBumpTexture.glsllib49
-rw-r--r--res/effectlib/perlinNoiseTexture.glsllib11
-rw-r--r--res/effectlib/physGlossyBSDF.glsllib159
-rw-r--r--res/effectlib/random255.glsllib56
-rw-r--r--res/effectlib/refraction.glsllib87
-rw-r--r--res/effectlib/rotationTranslationScale.glsllib50
-rw-r--r--res/effectlib/sampleArea.glsllib180
-rw-r--r--res/effectlib/sampleLight.glsllib130
-rw-r--r--res/effectlib/sampleProbe.glsllib473
-rw-r--r--res/effectlib/screenSpaceAO.glsllib150
-rw-r--r--res/effectlib/screenSpaceDO.glsllib158
-rw-r--r--res/effectlib/shadowMapping.glsllib106
-rw-r--r--res/effectlib/shadowMappingFragment.glsllib10
-rw-r--r--res/effectlib/simpleGlossyBSDF.glsllib99
-rw-r--r--res/effectlib/specularBSDF.glsllib47
-rw-r--r--res/effectlib/spotEdf.glsllib42
-rw-r--r--res/effectlib/square.glsllib35
-rw-r--r--res/effectlib/tangentSpaceNormalTexture.glsllib91
-rw-r--r--res/effectlib/tessellationLinear.glsllib104
-rw-r--r--res/effectlib/tessellationLinearCM.glsllib174
-rw-r--r--res/effectlib/tessellationNPatch.glsllib290
-rw-r--r--res/effectlib/tessellationNPatchCM.glsllib194
-rw-r--r--res/effectlib/tessellationPath.glsllib183
-rw-r--r--res/effectlib/tessellationPhong.glsllib170
-rw-r--r--res/effectlib/tessellationPhongCM.glsllib179
-rw-r--r--res/effectlib/textureCoordinateInfo.glsllib54
-rw-r--r--res/effectlib/transformCoordinate.glsllib43
-rw-r--r--res/effectlib/vertexFragmentBase.glsllib61
-rw-r--r--res/effectlib/viewProperties.glsllib41
-rw-r--r--res/effectlib/weightedLayer.glsllib35
-rw-r--r--res/effectlib/wireframeCM.glsllib169
-rw-r--r--res/primitives/Cone.meshbin0 -> 5352 bytes
-rw-r--r--res/primitives/Cube.meshbin0 -> 1764 bytes
-rw-r--r--res/primitives/Cylinder.meshbin0 -> 15908 bytes
-rw-r--r--res/primitives/Rectangle.meshbin0 -> 900 bytes
-rw-r--r--res/primitives/Sphere.meshbin0 -> 177980 bytes
-rw-r--r--src/3rdparty/3rdparty.pro5
m---------src/3rdparty/EASTL0
-rw-r--r--src/3rdparty/color/CColor.cpp719
-rw-r--r--src/3rdparty/color/CColor.h298
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES2/gl2.h677
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES2/gl2ext.h2946
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES2/gl2platform.h30
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES3/gl3.h1213
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES3/gl31.h1528
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES3/gl32.h1829
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES3/gl3ext.h24
-rw-r--r--src/3rdparty/platformspecific/Android/jni/GLES3/gl3platform.h30
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/gl.h1543
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glcorearb.h4533
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glew.h16126
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glext.h11163
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glfuncdef.h343
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glu.h607
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glut.h771
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glx.h357
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxew.h1587
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxext.h941
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/nvogldebug.h794
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglew.h1363
-rw-r--r--src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglext.h421
-rw-r--r--src/api/api.pro5
-rw-r--r--src/api/studio3d/q3dscommandqueue.cpp346
-rw-r--r--src/api/studio3d/q3dscommandqueue_p.h172
-rw-r--r--src/api/studio3d/q3dsdatainput.cpp451
-rw-r--r--src/api/studio3d/q3dsdatainput.h97
-rw-r--r--src/api/studio3d/q3dsdatainput_p.h89
-rw-r--r--src/api/studio3d/q3dsdataoutput.cpp225
-rw-r--r--src/api/studio3d/q3dsdataoutput.h83
-rw-r--r--src/api/studio3d/q3dsdataoutput_p.h75
-rw-r--r--src/api/studio3d/q3dselement.cpp284
-rw-r--r--src/api/studio3d/q3dselement.h79
-rw-r--r--src/api/studio3d/q3dselement_p.h77
-rw-r--r--src/api/studio3d/q3dsgeometry.cpp152
-rw-r--r--src/api/studio3d/q3dsgeometry.h117
-rw-r--r--src/api/studio3d/q3dsgeometry_p.h67
-rw-r--r--src/api/studio3d/q3dsimagesequencegenerator.cpp56
-rw-r--r--src/api/studio3d/q3dsimagesequencegenerator_p.h67
-rw-r--r--src/api/studio3d/q3dsimagesequencegeneratorthread.cpp190
-rw-r--r--src/api/studio3d/q3dsimagesequencegeneratorthread_p.h90
-rw-r--r--src/api/studio3d/q3dspresentation.cpp2100
-rw-r--r--src/api/studio3d/q3dspresentation.h162
-rw-r--r--src/api/studio3d/q3dspresentation_p.h127
-rw-r--r--src/api/studio3d/q3dssceneelement.cpp436
-rw-r--r--src/api/studio3d/q3dssceneelement.h83
-rw-r--r--src/api/studio3d/q3dssceneelement_p.h81
-rw-r--r--src/api/studio3d/q3dssurfaceviewer.cpp722
-rw-r--r--src/api/studio3d/q3dssurfaceviewer.h118
-rw-r--r--src/api/studio3d/q3dssurfaceviewer_p.h107
-rw-r--r--src/api/studio3d/q3dsviewersettings.cpp401
-rw-r--r--src/api/studio3d/q3dsviewersettings.h104
-rw-r--r--src/api/studio3d/q3dsviewersettings_p.h88
-rw-r--r--src/api/studio3d/qstudio3dglobal.h61
-rw-r--r--src/api/studio3d/studio3d.pro64
-rw-r--r--src/api/studio3d/studioutils.cpp56
-rw-r--r--src/api/studio3d/studioutils_p.h52
-rw-r--r--src/api/studio3d/viewerqmlstreamproxy.cpp59
-rw-r--r--src/api/studio3d/viewerqmlstreamproxy_p.h57
-rw-r--r--src/api/studio3dqml/q3dsplugin.cpp62
-rw-r--r--src/api/studio3dqml/q3dsplugin.h60
-rw-r--r--src/api/studio3dqml/q3dspresentationitem.cpp160
-rw-r--r--src/api/studio3dqml/q3dspresentationitem_p.h76
-rw-r--r--src/api/studio3dqml/q3dsrenderer.cpp458
-rw-r--r--src/api/studio3dqml/q3dsrenderer_p.h110
-rw-r--r--src/api/studio3dqml/q3dsstudio3d.cpp535
-rw-r--r--src/api/studio3dqml/q3dsstudio3d_p.h137
-rw-r--r--src/api/studio3dqml/qmldir3
-rw-r--r--src/api/studio3dqml/studio3dqml.pro34
-rw-r--r--src/commoninclude.pri1
-rw-r--r--src/datamodel/DocumentResourceManagerCustomMaterialParser.h80
-rw-r--r--src/datamodel/DocumentResourceManagerRenderPluginParser.h80
-rw-r--r--src/datamodel/DocumentResourceManagerScriptParser.h137
-rw-r--r--src/datamodel/Qt3DSMetadata.cpp998
-rw-r--r--src/datamodel/Qt3DSMetadata.h386
-rw-r--r--src/dm/EASTL_new.cpp40
-rw-r--r--src/dm/Qt3DSDMPrefix.h81
-rw-r--r--src/dm/dm.pro58
-rw-r--r--src/dm/systems/ActionSystem.cpp131
-rw-r--r--src/dm/systems/ActionSystem.h84
-rw-r--r--src/dm/systems/HandleSystemBase.h169
-rw-r--r--src/dm/systems/HandleSystemTransactions.h88
-rw-r--r--src/dm/systems/Qt3DSDMActionCore.h99
-rw-r--r--src/dm/systems/Qt3DSDMActionInfo.h96
-rw-r--r--src/dm/systems/Qt3DSDMActionSystem.h68
-rw-r--r--src/dm/systems/Qt3DSDMAnimation.h841
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp579
-rw-r--r--src/dm/systems/Qt3DSDMComposerTypeDefinitions.h956
-rw-r--r--src/dm/systems/Qt3DSDMDataCore.h320
-rw-r--r--src/dm/systems/Qt3DSDMDataTypes.h891
-rw-r--r--src/dm/systems/Qt3DSDMErrors.h308
-rw-r--r--src/dm/systems/Qt3DSDMGuides.cpp222
-rw-r--r--src/dm/systems/Qt3DSDMGuides.h102
-rw-r--r--src/dm/systems/Qt3DSDMHandles.h459
-rw-r--r--src/dm/systems/Qt3DSDMMetaData.cpp4170
-rw-r--r--src/dm/systems/Qt3DSDMMetaData.h400
-rw-r--r--src/dm/systems/Qt3DSDMMetaDataTypes.h350
-rw-r--r--src/dm/systems/Qt3DSDMMetaDataValue.h251
-rw-r--r--src/dm/systems/Qt3DSDMPropertyDefinition.h75
-rw-r--r--src/dm/systems/Qt3DSDMSignalStructImpl.h305
-rw-r--r--src/dm/systems/Qt3DSDMSignalStructs.h89
-rw-r--r--src/dm/systems/Qt3DSDMSignalSystem.cpp184
-rw-r--r--src/dm/systems/Qt3DSDMSignalSystem.h52
-rw-r--r--src/dm/systems/Qt3DSDMSignals.h611
-rw-r--r--src/dm/systems/Qt3DSDMSlideCore.h239
-rw-r--r--src/dm/systems/Qt3DSDMSlideGraphCore.h89
-rw-r--r--src/dm/systems/Qt3DSDMSlides.h202
-rw-r--r--src/dm/systems/Qt3DSDMStringTable.cpp85
-rw-r--r--src/dm/systems/Qt3DSDMStringTable.h71
-rw-r--r--src/dm/systems/Qt3DSDMTestOps.h61
-rw-r--r--src/dm/systems/Qt3DSDMTransactions.h244
-rw-r--r--src/dm/systems/Qt3DSDMValue.cpp178
-rw-r--r--src/dm/systems/Qt3DSDMValue.h341
-rw-r--r--src/dm/systems/Qt3DSDMWStrOps.h40
-rw-r--r--src/dm/systems/Qt3DSDMWStrOpsImpl.h761
-rw-r--r--src/dm/systems/Qt3DSDMWindowsCompatibility.h182
-rw-r--r--src/dm/systems/Qt3DSDMXML.cpp1253
-rw-r--r--src/dm/systems/Qt3DSDMXML.h506
-rw-r--r--src/dm/systems/SignalsImpl.cpp1565
-rw-r--r--src/dm/systems/SignalsImpl.h50
-rw-r--r--src/dm/systems/SlideSystem.cpp867
-rw-r--r--src/dm/systems/SlideSystem.h179
-rw-r--r--src/dm/systems/StandardExtensions.h196
-rw-r--r--src/dm/systems/StudioAnimationSystem.cpp610
-rw-r--r--src/dm/systems/StudioAnimationSystem.h134
-rw-r--r--src/dm/systems/StudioCoreSystem.cpp409
-rw-r--r--src/dm/systems/StudioCoreSystem.h94
-rw-r--r--src/dm/systems/StudioFullSystem.cpp647
-rw-r--r--src/dm/systems/StudioFullSystem.h164
-rw-r--r--src/dm/systems/StudioPropertySystem.cpp233
-rw-r--r--src/dm/systems/StudioPropertySystem.h132
-rw-r--r--src/dm/systems/VectorTransactions.h235
-rw-r--r--src/dm/systems/cores/ActionCoreProducer.cpp289
-rw-r--r--src/dm/systems/cores/ActionCoreProducer.h125
-rw-r--r--src/dm/systems/cores/AnimationCoreProducer.cpp488
-rw-r--r--src/dm/systems/cores/AnimationCoreProducer.h148
-rw-r--r--src/dm/systems/cores/DataCoreProducer.cpp457
-rw-r--r--src/dm/systems/cores/DataCoreProducer.h175
-rw-r--r--src/dm/systems/cores/SimpleActionCore.cpp240
-rw-r--r--src/dm/systems/cores/SimpleActionCore.h165
-rw-r--r--src/dm/systems/cores/SimpleAnimationCore.cpp618
-rw-r--r--src/dm/systems/cores/SimpleAnimationCore.h230
-rw-r--r--src/dm/systems/cores/SimpleDataCore.cpp574
-rw-r--r--src/dm/systems/cores/SimpleDataCore.h373
-rw-r--r--src/dm/systems/cores/SimpleSlideCore.cpp420
-rw-r--r--src/dm/systems/cores/SimpleSlideCore.h408
-rw-r--r--src/dm/systems/cores/SimpleSlideGraphCore.cpp169
-rw-r--r--src/dm/systems/cores/SimpleSlideGraphCore.h134
-rw-r--r--src/dm/systems/cores/SlideCoreProducer.cpp562
-rw-r--r--src/dm/systems/cores/SlideCoreProducer.h190
-rw-r--r--src/dm/systems/cores/SlideGraphCoreProducer.cpp245
-rw-r--r--src/dm/systems/cores/SlideGraphCoreProducer.h98
-rw-r--r--src/engine/EnginePrefix.h143
-rw-r--r--src/engine/NVImageScaler.h311
-rw-r--r--src/engine/OpenKodeInclude.h49
-rw-r--r--src/engine/Qt3DSEGLInfo.h60
-rw-r--r--src/engine/Qt3DSEGLWindowSystem.h81
-rw-r--r--src/engine/Qt3DSPluginDLL.h128
-rw-r--r--src/engine/Qt3DSRenderRuntimeBinding.cpp1858
-rw-r--r--src/engine/Qt3DSRenderRuntimeBinding.h82
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImpl.h218
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp224
-rw-r--r--src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp1841
-rw-r--r--src/engine/Qt3DSRuntimeView.cpp862
-rw-r--r--src/engine/Qt3DSRuntimeView.h238
-rw-r--r--src/engine/Qt3DSTegraInputEngine.cpp124
-rw-r--r--src/engine/Qt3DSTegraInputEngine.h81
-rw-r--r--src/engine/Qt3DSWindowSystem.h57
-rw-r--r--src/event/EventFactory.cpp143
-rw-r--r--src/event/EventFactory.h87
-rw-r--r--src/event/EventPoller.cpp375
-rw-r--r--src/event/EventPoller.h103
-rw-r--r--src/event/EventPollingSystem.h87
-rw-r--r--src/event/EventSystem.h73
-rw-r--r--src/event/EventSystemC.cpp34
-rw-r--r--src/event/EventSystemC.h139
-rw-r--r--src/event/test/CanProviderDemo.cpp259
-rw-r--r--src/event/test/CanProviderDemo.h56
-rw-r--r--src/foundation/AutoDeallocatorAllocator.h99
-rw-r--r--src/foundation/ConvertUTF.cpp661
-rw-r--r--src/foundation/ConvertUTF.h179
-rw-r--r--src/foundation/EASTL_new.cpp75
-rw-r--r--src/foundation/FastAllocator.h115
-rw-r--r--src/foundation/FileTools.cpp550
-rw-r--r--src/foundation/FileTools.h124
-rw-r--r--src/foundation/IOStreams.cpp384
-rw-r--r--src/foundation/IOStreams.h278
-rw-r--r--src/foundation/LICENCE_SOCKET.TXT20
-rw-r--r--src/foundation/LICENSE_CONVERTUTF.TXT19
-rw-r--r--src/foundation/PoolingAllocator.h177
-rw-r--r--src/foundation/PreAllocatedAllocator.h88
-rw-r--r--src/foundation/Qt3DS.h59
-rw-r--r--src/foundation/Qt3DSAllocator.h195
-rw-r--r--src/foundation/Qt3DSAllocatorCallback.h100
-rw-r--r--src/foundation/Qt3DSAssert.h62
-rw-r--r--src/foundation/Qt3DSAtomic.h63
-rw-r--r--src/foundation/Qt3DSBasicTemplates.h113
-rw-r--r--src/foundation/Qt3DSBounds3.h443
-rw-r--r--src/foundation/Qt3DSBroadcastingAllocator.h113
-rw-r--r--src/foundation/Qt3DSContainers.h129
-rw-r--r--src/foundation/Qt3DSDataRef.h162
-rw-r--r--src/foundation/Qt3DSDiscriminatedUnion.h335
-rw-r--r--src/foundation/Qt3DSFPU.h97
-rw-r--r--src/foundation/Qt3DSFastIPC.h57
-rw-r--r--src/foundation/Qt3DSFlags.h360
-rw-r--r--src/foundation/Qt3DSFoundation.cpp237
-rw-r--r--src/foundation/Qt3DSFoundation.h120
-rw-r--r--src/foundation/Qt3DSIPC.h99
-rw-r--r--src/foundation/Qt3DSIndexableLinkedList.h309
-rw-r--r--src/foundation/Qt3DSIntrinsics.h50
-rw-r--r--src/foundation/Qt3DSInvasiveLinkedList.h361
-rw-r--r--src/foundation/Qt3DSInvasiveSet.h104
-rw-r--r--src/foundation/Qt3DSLogging.cpp44
-rw-r--r--src/foundation/Qt3DSLogging.h51
-rw-r--r--src/foundation/Qt3DSMat33.h385
-rw-r--r--src/foundation/Qt3DSMat44.h497
-rw-r--r--src/foundation/Qt3DSMath.h323
-rw-r--r--src/foundation/Qt3DSMathUtils.cpp181
-rw-r--r--src/foundation/Qt3DSMathUtils.h571
-rw-r--r--src/foundation/Qt3DSMemoryBuffer.h160
-rw-r--r--src/foundation/Qt3DSMutex.h376
-rw-r--r--src/foundation/Qt3DSNoCopy.h50
-rw-r--r--src/foundation/Qt3DSOption.h104
-rw-r--r--src/foundation/Qt3DSPerfTimer.cpp163
-rw-r--r--src/foundation/Qt3DSPerfTimer.h107
-rw-r--r--src/foundation/Qt3DSPlane.h134
-rw-r--r--src/foundation/Qt3DSPool.h159
-rw-r--r--src/foundation/Qt3DSPreprocessor.h375
-rw-r--r--src/foundation/Qt3DSQuat.h381
-rw-r--r--src/foundation/Qt3DSRefCounted.h199
-rw-r--r--src/foundation/Qt3DSSemaphore.h67
-rw-r--r--src/foundation/Qt3DSSimpleTypes.h125
-rw-r--r--src/foundation/Qt3DSStringTokenizer.h108
-rw-r--r--src/foundation/Qt3DSSync.h70
-rw-r--r--src/foundation/Qt3DSSystem.cpp139
-rw-r--r--src/foundation/Qt3DSSystem.h58
-rw-r--r--src/foundation/Qt3DSThread.h205
-rw-r--r--src/foundation/Qt3DSTime.h97
-rw-r--r--src/foundation/Qt3DSTransform.h195
-rw-r--r--src/foundation/Qt3DSUnionCast.h64
-rw-r--r--src/foundation/Qt3DSUtilities.h189
-rw-r--r--src/foundation/Qt3DSVec2.h321
-rw-r--r--src/foundation/Qt3DSVec3.h377
-rw-r--r--src/foundation/Qt3DSVec4.h373
-rw-r--r--src/foundation/Qt3DSVersionNumber.h67
-rw-r--r--src/foundation/SerializationTypes.h132
-rw-r--r--src/foundation/Socket.cpp472
-rw-r--r--src/foundation/Socket.h79
-rw-r--r--src/foundation/StrConvertUTF.h213
-rw-r--r--src/foundation/StringConversion.h226
-rw-r--r--src/foundation/StringConversionImpl.h219
-rw-r--r--src/foundation/StringTable.cpp700
-rw-r--r--src/foundation/StringTable.h311
-rw-r--r--src/foundation/StringTools.h614
-rw-r--r--src/foundation/TaggedPointer.h80
-rw-r--r--src/foundation/ThreadSafeQueue.h111
-rw-r--r--src/foundation/TrackingAllocator.cpp50
-rw-r--r--src/foundation/TrackingAllocator.h252
-rw-r--r--src/foundation/Utils.h382
-rw-r--r--src/foundation/XML.cpp948
-rw-r--r--src/foundation/XML.h680
-rw-r--r--src/foundation/linux/LICENSE.TXT7
-rw-r--r--src/foundation/linux/Qt3DSLinuxAoS.h157
-rw-r--r--src/foundation/linux/Qt3DSLinuxAtomic.cpp129
-rw-r--r--src/foundation/linux/Qt3DSLinuxFPU.cpp52
-rw-r--r--src/foundation/linux/Qt3DSLinuxFile.h48
-rw-r--r--src/foundation/linux/Qt3DSLinuxInlineAoS.h2666
-rw-r--r--src/foundation/linux/Qt3DSLinuxIntrinsics.h209
-rw-r--r--src/foundation/linux/Qt3DSLinuxMutex.cpp120
-rw-r--r--src/foundation/linux/Qt3DSLinuxSemaphore.cpp146
-rw-r--r--src/foundation/linux/Qt3DSLinuxString.h202
-rw-r--r--src/foundation/linux/Qt3DSLinuxSync.cpp137
-rw-r--r--src/foundation/linux/Qt3DSLinuxThread.cpp384
-rw-r--r--src/foundation/linux/Qt3DSLinuxTime.cpp111
-rw-r--r--src/foundation/linux/Qt3DSLinuxTrigConstants.h96
-rw-r--r--src/foundation/linux/SocketImpl.h424
-rw-r--r--src/foundation/linux/qt_attribution.json10
-rw-r--r--src/foundation/macos/Qt3DSUnixAtomic.cpp89
-rw-r--r--src/foundation/macos/Qt3DSUnixFPU.cpp61
-rw-r--r--src/foundation/macos/Qt3DSUnixMutex.cpp120
-rw-r--r--src/foundation/macos/Qt3DSUnixSemaphore.cpp146
-rw-r--r--src/foundation/macos/Qt3DSUnixSync.cpp137
-rw-r--r--src/foundation/macos/Qt3DSUnixTime.cpp108
-rw-r--r--src/foundation/qt/formatdiscovery.cpp126
-rw-r--r--src/foundation/qt_attribution.json22
-rw-r--r--src/foundation/windows/LICENSE.TXT7
-rw-r--r--src/foundation/windows/Qt3DSWindowsAoS.h126
-rw-r--r--src/foundation/windows/Qt3DSWindowsAtomic.cpp93
-rw-r--r--src/foundation/windows/Qt3DSWindowsFPU.cpp61
-rw-r--r--src/foundation/windows/Qt3DSWindowsFile.h48
-rw-r--r--src/foundation/windows/Qt3DSWindowsInclude.h93
-rw-r--r--src/foundation/windows/Qt3DSWindowsInlineAoS.h2715
-rw-r--r--src/foundation/windows/Qt3DSWindowsIntrinsics.h230
-rw-r--r--src/foundation/windows/Qt3DSWindowsMutex.cpp149
-rw-r--r--src/foundation/windows/Qt3DSWindowsSemaphore.cpp72
-rw-r--r--src/foundation/windows/Qt3DSWindowsString.h147
-rw-r--r--src/foundation/windows/Qt3DSWindowsSync.cpp74
-rw-r--r--src/foundation/windows/Qt3DSWindowsThread.cpp241
-rw-r--r--src/foundation/windows/Qt3DSWindowsTime.cpp92
-rw-r--r--src/foundation/windows/Qt3DSWindowsTrigConstants.h93
-rw-r--r--src/foundation/windows/SocketImpl.h506
-rw-r--r--src/foundation/windows/qt_attribution.json10
-rw-r--r--src/hdr/CUDABSDFMipmap.cpp145
-rw-r--r--src/hdr/CUDABSDFMipmap.h77
-rw-r--r--src/hdr/GLComputeMipMap.h74
-rw-r--r--src/hdr/GLComputeMipmap.cpp394
-rw-r--r--src/hdr/HDR.cpp30
-rw-r--r--src/hdr/HDR.h239
-rw-r--r--src/hdr/MipmapBSDF.cpp265
-rw-r--r--src/hdr/MipmapBSDF.cu404
-rw-r--r--src/hdr/MipmapBSDF.h104
-rw-r--r--src/importlib/Qt3DSImportContainers.h88
-rw-r--r--src/importlib/Qt3DSImportLibPrecompile.h56
-rw-r--r--src/importlib/Qt3DSImportMesh.cpp829
-rw-r--r--src/importlib/Qt3DSImportMesh.h530
-rw-r--r--src/importlib/Qt3DSImportMeshBuilder.cpp598
-rw-r--r--src/importlib/Qt3DSImportPath.cpp152
-rw-r--r--src/importlib/Qt3DSImportPath.h87
-rw-r--r--src/ogl-runtime-dylib/ogl-runtime-dylib.pro74
-rw-r--r--src/ogl-runtime-static/ogl-runtime-static.pro656
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/NvVec.h316
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/misc.h130
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/nv_math.cpp64
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/nv_math.h45
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/nv_matrix.cpp1030
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/nv_matrix.h117
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/nv_quat.cpp199
-rw-r--r--src/platformspecific/android/jni/libs/nv_math/nv_quat.h63
-rw-r--r--src/platformspecific/linux/assets/courier+lucida_256.abcbin0 -> 2048 bytes
-rw-r--r--src/platformspecific/linux/assets/courier+lucida_256.ddsbin0 -> 87509 bytes
-rw-r--r--src/platformspecific/linux/assets/courier+lucida_512.abcbin0 -> 2048 bytes
-rw-r--r--src/platformspecific/linux/assets/courier+lucida_512.ddsbin0 -> 349653 bytes
-rw-r--r--src/platformspecific/linux/assets/font.frag39
-rw-r--r--src/platformspecific/linux/assets/font.vert49
-rw-r--r--src/platformspecific/linux/libs/nv_color.h107
-rw-r--r--src/platformspecific/linux/libs/nv_debug.h86
-rw-r--r--src/platformspecific/linux/libs/nv_global.h36
-rw-r--r--src/platformspecific/linux/libs/nv_math/NvVec.h316
-rw-r--r--src/platformspecific/linux/libs/nv_math/misc.h130
-rw-r--r--src/platformspecific/linux/libs/nv_math/nv_math.cpp64
-rw-r--r--src/platformspecific/linux/libs/nv_math/nv_math.h45
-rw-r--r--src/platformspecific/linux/libs/nv_math/nv_matrix.cpp1030
-rw-r--r--src/platformspecific/linux/libs/nv_math/nv_matrix.h118
-rw-r--r--src/platformspecific/linux/libs/nv_math/nv_quat.cpp203
-rw-r--r--src/platformspecific/linux/libs/nv_math/nv_quat.h64
-rw-r--r--src/platformspecific/linux/libs/nv_types.h81
-rw-r--r--src/platformspecific/macos/assets/courier+lucida_256.abcbin0 -> 2048 bytes
-rw-r--r--src/platformspecific/macos/assets/courier+lucida_256.ddsbin0 -> 87509 bytes
-rw-r--r--src/platformspecific/macos/assets/courier+lucida_512.abcbin0 -> 2048 bytes
-rw-r--r--src/platformspecific/macos/assets/courier+lucida_512.ddsbin0 -> 349653 bytes
-rw-r--r--src/platformspecific/macos/assets/font.frag39
-rw-r--r--src/platformspecific/macos/assets/font.vert49
-rw-r--r--src/platformspecific/macos/libs/nv_color.h107
-rw-r--r--src/platformspecific/macos/libs/nv_debug.h86
-rw-r--r--src/platformspecific/macos/libs/nv_global.h36
-rw-r--r--src/platformspecific/macos/libs/nv_math/NvVec.h316
-rw-r--r--src/platformspecific/macos/libs/nv_math/misc.h130
-rw-r--r--src/platformspecific/macos/libs/nv_math/nv_math.cpp64
-rw-r--r--src/platformspecific/macos/libs/nv_math/nv_math.h45
-rw-r--r--src/platformspecific/macos/libs/nv_math/nv_matrix.cpp1030
-rw-r--r--src/platformspecific/macos/libs/nv_math/nv_matrix.h117
-rw-r--r--src/platformspecific/macos/libs/nv_math/nv_quat.cpp199
-rw-r--r--src/platformspecific/macos/libs/nv_math/nv_quat.h63
-rw-r--r--src/platformspecific/macos/libs/nv_types.h81
-rw-r--r--src/platformspecific/windows/assets/courier+lucida_256.abcbin0 -> 2048 bytes
-rw-r--r--src/platformspecific/windows/assets/courier+lucida_256.ddsbin0 -> 87509 bytes
-rw-r--r--src/platformspecific/windows/assets/courier+lucida_512.abcbin0 -> 2048 bytes
-rw-r--r--src/platformspecific/windows/assets/courier+lucida_512.ddsbin0 -> 349653 bytes
-rw-r--r--src/platformspecific/windows/assets/font.frag39
-rw-r--r--src/platformspecific/windows/assets/font.vert49
-rw-r--r--src/platformspecific/windows/libs/nv_color.h107
-rw-r--r--src/platformspecific/windows/libs/nv_config/nv_config.h278
-rw-r--r--src/platformspecific/windows/libs/nv_debug.h86
-rw-r--r--src/platformspecific/windows/libs/nv_global.h36
-rw-r--r--src/platformspecific/windows/libs/nv_math/NvVec.h316
-rw-r--r--src/platformspecific/windows/libs/nv_math/misc.h130
-rw-r--r--src/platformspecific/windows/libs/nv_math/nv_math.cpp64
-rw-r--r--src/platformspecific/windows/libs/nv_math/nv_math.h45
-rw-r--r--src/platformspecific/windows/libs/nv_math/nv_matrix.cpp1030
-rw-r--r--src/platformspecific/windows/libs/nv_math/nv_matrix.h117
-rw-r--r--src/platformspecific/windows/libs/nv_math/nv_quat.cpp199
-rw-r--r--src/platformspecific/windows/libs/nv_math/nv_quat.h63
-rw-r--r--src/platformspecific/windows/libs/nv_types.h81
-rw-r--r--src/platformspecific/windows/viewer/Resource.h43
-rw-r--r--src/qmlstreamer/q3dsincubationcontroller.h55
-rw-r--r--src/qmlstreamer/q3dsqmlstream.cpp106
-rw-r--r--src/qmlstreamer/q3dsqmlstream.h68
-rw-r--r--src/qmlstreamer/q3dsqmlstreamer_global.h41
-rw-r--r--src/qmlstreamer/q3dsqmlstreamerserviceimpl.cpp67
-rw-r--r--src/qmlstreamer/q3dsqmlstreamerserviceimpl.h52
-rw-r--r--src/qmlstreamer/q3dsqmlstreamproducer.cpp53
-rw-r--r--src/qmlstreamer/q3dsqmlstreamproducer.h61
-rw-r--r--src/qmlstreamer/q3dsqmlstreamproxy.cpp253
-rw-r--r--src/qmlstreamer/q3dsqmlstreamproxy.h79
-rw-r--r--src/qmlstreamer/q3dsqmlstreamrenderer.cpp483
-rw-r--r--src/qmlstreamer/q3dsqmlstreamrenderer.h124
-rw-r--r--src/qmlstreamer/q3dsqmlstreamservice.h80
-rw-r--r--src/qmlstreamer/q3dsqmlsubpresentationsettings.cpp78
-rw-r--r--src/qmlstreamer/q3dsqmlsubpresentationsettings.h55
-rw-r--r--src/qmlstreamer/qmlstreamer.pro50
-rw-r--r--src/render/Examples/Qt3DSRenderClearColorExample.cpp63
-rw-r--r--src/render/Examples/Qt3DSRenderExample.cpp491
-rw-r--r--src/render/Examples/Qt3DSRenderExample.h123
-rw-r--r--src/render/Examples/Qt3DSRenderExampleTools.cpp188
-rw-r--r--src/render/Examples/Qt3DSRenderExampleTools.h89
-rw-r--r--src/render/Examples/Qt3DSRenderRenderToTextureExample.cpp178
-rw-r--r--src/render/Examples/Qt3DSRenderSpinningCubeExample.cpp104
-rw-r--r--src/render/Qt3DSRenderAtomicCounterBuffer.cpp156
-rw-r--r--src/render/Qt3DSRenderAtomicCounterBuffer.h182
-rw-r--r--src/render/Qt3DSRenderAttribLayout.cpp57
-rw-r--r--src/render/Qt3DSRenderAttribLayout.h90
-rw-r--r--src/render/Qt3DSRenderBaseTypes.cpp1049
-rw-r--r--src/render/Qt3DSRenderBaseTypes.h2103
-rw-r--r--src/render/Qt3DSRenderComputeShader.cpp55
-rw-r--r--src/render/Qt3DSRenderComputeShader.h89
-rw-r--r--src/render/Qt3DSRenderConstantBuffer.cpp421
-rw-r--r--src/render/Qt3DSRenderConstantBuffer.h248
-rw-r--r--src/render/Qt3DSRenderContext.cpp1107
-rw-r--r--src/render/Qt3DSRenderContext.h1075
-rw-r--r--src/render/Qt3DSRenderDataBuffer.cpp158
-rw-r--r--src/render/Qt3DSRenderDataBuffer.h188
-rw-r--r--src/render/Qt3DSRenderDepthStencilState.cpp91
-rw-r--r--src/render/Qt3DSRenderDepthStencilState.h134
-rw-r--r--src/render/Qt3DSRenderDrawIndirectBuffer.cpp104
-rw-r--r--src/render/Qt3DSRenderDrawIndirectBuffer.h152
-rw-r--r--src/render/Qt3DSRenderDrawable.h54
-rw-r--r--src/render/Qt3DSRenderFragmentShader.cpp55
-rw-r--r--src/render/Qt3DSRenderFragmentShader.h89
-rw-r--r--src/render/Qt3DSRenderFrameBuffer.cpp300
-rw-r--r--src/render/Qt3DSRenderFrameBuffer.h277
-rw-r--r--src/render/Qt3DSRenderGeometryShader.cpp55
-rw-r--r--src/render/Qt3DSRenderGeometryShader.h89
-rw-r--r--src/render/Qt3DSRenderImageTexture.cpp103
-rw-r--r--src/render/Qt3DSRenderImageTexture.h143
-rw-r--r--src/render/Qt3DSRenderIndexBuffer.cpp100
-rw-r--r--src/render/Qt3DSRenderIndexBuffer.h138
-rw-r--r--src/render/Qt3DSRenderInputAssembler.cpp105
-rw-r--r--src/render/Qt3DSRenderInputAssembler.h157
-rw-r--r--src/render/Qt3DSRenderOcclusionQuery.cpp82
-rw-r--r--src/render/Qt3DSRenderOcclusionQuery.h120
-rw-r--r--src/render/Qt3DSRenderPathFontSpecification.cpp145
-rw-r--r--src/render/Qt3DSRenderPathFontSpecification.h165
-rw-r--r--src/render/Qt3DSRenderPathFontText.cpp191
-rw-r--r--src/render/Qt3DSRenderPathFontText.h139
-rw-r--r--src/render/Qt3DSRenderPathRender.cpp108
-rw-r--r--src/render/Qt3DSRenderPathRender.h114
-rw-r--r--src/render/Qt3DSRenderPathSpecification.cpp103
-rw-r--r--src/render/Qt3DSRenderPathSpecification.h141
-rw-r--r--src/render/Qt3DSRenderProgramPipeline.cpp134
-rw-r--r--src/render/Qt3DSRenderProgramPipeline.h138
-rw-r--r--src/render/Qt3DSRenderQueryBase.cpp54
-rw-r--r--src/render/Qt3DSRenderQueryBase.h127
-rw-r--r--src/render/Qt3DSRenderRasterizerState.cpp71
-rw-r--r--src/render/Qt3DSRenderRasterizerState.h94
-rw-r--r--src/render/Qt3DSRenderRenderBuffer.cpp114
-rw-r--r--src/render/Qt3DSRenderRenderBuffer.h158
-rw-r--r--src/render/Qt3DSRenderSampler.cpp84
-rw-r--r--src/render/Qt3DSRenderSampler.h124
-rw-r--r--src/render/Qt3DSRenderShader.h123
-rw-r--r--src/render/Qt3DSRenderShaderConstant.h448
-rw-r--r--src/render/Qt3DSRenderShaderProgram.cpp1248
-rw-r--r--src/render/Qt3DSRenderShaderProgram.h540
-rw-r--r--src/render/Qt3DSRenderStorageBuffer.cpp123
-rw-r--r--src/render/Qt3DSRenderStorageBuffer.h158
-rw-r--r--src/render/Qt3DSRenderSync.cpp87
-rw-r--r--src/render/Qt3DSRenderSync.h132
-rw-r--r--src/render/Qt3DSRenderTessellationShader.cpp74
-rw-r--r--src/render/Qt3DSRenderTessellationShader.h132
-rw-r--r--src/render/Qt3DSRenderTexture2D.cpp263
-rw-r--r--src/render/Qt3DSRenderTexture2D.h165
-rw-r--r--src/render/Qt3DSRenderTexture2DArray.cpp123
-rw-r--r--src/render/Qt3DSRenderTexture2DArray.h106
-rw-r--r--src/render/Qt3DSRenderTextureBase.cpp174
-rw-r--r--src/render/Qt3DSRenderTextureBase.h177
-rw-r--r--src/render/Qt3DSRenderTextureCube.cpp119
-rw-r--r--src/render/Qt3DSRenderTextureCube.h106
-rw-r--r--src/render/Qt3DSRenderTimerQuery.cpp75
-rw-r--r--src/render/Qt3DSRenderTimerQuery.h129
-rw-r--r--src/render/Qt3DSRenderVertexBuffer.cpp74
-rw-r--r--src/render/Qt3DSRenderVertexBuffer.h124
-rw-r--r--src/render/Qt3DSRenderVertexShader.cpp54
-rw-r--r--src/render/Qt3DSRenderVertexShader.h89
-rw-r--r--src/render/backends/Qt3DSRenderBackend.h2245
-rw-r--r--src/render/backends/gl/Q3DSRenderBackendGLES2.cpp902
-rw-r--r--src/render/backends/gl/Q3DSRenderBackendGLES2.h195
-rw-r--r--src/render/backends/gl/Qt3DSOpenGLExtensions.cpp170
-rw-r--r--src/render/backends/gl/Qt3DSOpenGLExtensions.h392
-rw-r--r--src/render/backends/gl/Qt3DSOpenGLPrefix.h48
-rw-r--r--src/render/backends/gl/Qt3DSOpenGLTokens.h408
-rw-r--r--src/render/backends/gl/Qt3DSOpenGLUtil.h2201
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGL3.cpp796
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGL3.h173
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGL4.cpp875
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGL4.h205
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp2230
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGLBase.h531
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h146
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h173
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h105
-rw-r--r--src/render/backends/gl/Qt3DSRenderContextGL.cpp91
-rw-r--r--src/render/backends/software/Qt3DSRenderBackendNULL.cpp588
-rw-r--r--src/render/backends/software/Qt3DSRenderBackendNULL.h46
-rw-r--r--src/render/glg/Qt3DSGLImplObjects.h83
-rw-r--r--src/runtime/Qt3DSActivationManager.cpp1027
-rw-r--r--src/runtime/Qt3DSActivationManager.h157
-rw-r--r--src/runtime/Qt3DSAnimationSystem.cpp432
-rw-r--r--src/runtime/Qt3DSAnimationSystem.h68
-rw-r--r--src/runtime/Qt3DSApplication.cpp2180
-rw-r--r--src/runtime/Qt3DSApplication.h261
-rw-r--r--src/runtime/Qt3DSApplicationValues.h369
-rw-r--r--src/runtime/Qt3DSAttributeHashes.cpp296
-rw-r--r--src/runtime/Qt3DSAttributeHashes.h286
-rw-r--r--src/runtime/Qt3DSAttributeHashes.txt249
-rw-r--r--src/runtime/Qt3DSCommandEventTypes.h83
-rw-r--r--src/runtime/Qt3DSCommandHelper.cpp129
-rw-r--r--src/runtime/Qt3DSCommandHelper.h55
-rw-r--r--src/runtime/Qt3DSComponentManager.cpp487
-rw-r--r--src/runtime/Qt3DSComponentManager.h143
-rw-r--r--src/runtime/Qt3DSElementHelper.cpp141
-rw-r--r--src/runtime/Qt3DSElementHelper.h57
-rw-r--r--src/runtime/Qt3DSElementSystem.cpp855
-rw-r--r--src/runtime/Qt3DSElementSystem.h616
-rw-r--r--src/runtime/Qt3DSEvent.h62
-rw-r--r--src/runtime/Qt3DSEventCallbacks.cpp258
-rw-r--r--src/runtime/Qt3DSEventCallbacks.h135
-rw-r--r--src/runtime/Qt3DSFrameworkTypes.h52
-rw-r--r--src/runtime/Qt3DSIComponentManager.h147
-rw-r--r--src/runtime/Qt3DSIInputSystem.h62
-rw-r--r--src/runtime/Qt3DSIScene.h160
-rw-r--r--src/runtime/Qt3DSIScriptBridge.h206
-rw-r--r--src/runtime/Qt3DSIStateful.h69
-rw-r--r--src/runtime/Qt3DSIText.h52
-rw-r--r--src/runtime/Qt3DSInputDefs.h413
-rw-r--r--src/runtime/Qt3DSInputEngine.cpp849
-rw-r--r--src/runtime/Qt3DSInputEngine.h125
-rw-r--r--src/runtime/Qt3DSInputEventTypes.h96
-rw-r--r--src/runtime/Qt3DSInputFrame.h118
-rw-r--r--src/runtime/Qt3DSKernelTypes.h225
-rw-r--r--src/runtime/Qt3DSLogicSystem.cpp293
-rw-r--r--src/runtime/Qt3DSLogicSystem.h60
-rw-r--r--src/runtime/Qt3DSOutputMemoryStream.cpp150
-rw-r--r--src/runtime/Qt3DSOutputMemoryStream.h123
-rw-r--r--src/runtime/Qt3DSParametersSystem.cpp171
-rw-r--r--src/runtime/Qt3DSParametersSystem.h66
-rw-r--r--src/runtime/Qt3DSPickFrame.h70
-rw-r--r--src/runtime/Qt3DSPresentation.cpp841
-rw-r--r--src/runtime/Qt3DSPresentation.h231
-rw-r--r--src/runtime/Qt3DSPresentationFrameData.cpp105
-rw-r--r--src/runtime/Qt3DSPresentationFrameData.h87
-rw-r--r--src/runtime/Qt3DSQmlElementHelper.cpp323
-rw-r--r--src/runtime/Qt3DSQmlElementHelper.h57
-rw-r--r--src/runtime/Qt3DSQmlEngine.cpp2690
-rw-r--r--src/runtime/Qt3DSQmlEngine.h226
-rw-r--r--src/runtime/Qt3DSRuntimeFactory.h108
-rw-r--r--src/runtime/Qt3DSSceneManager.h167
-rw-r--r--src/runtime/Qt3DSSlideSystem.cpp675
-rw-r--r--src/runtime/Qt3DSSlideSystem.h161
-rw-r--r--src/runtime/Qt3DSTimePolicy.cpp407
-rw-r--r--src/runtime/Qt3DSTimePolicy.h124
-rw-r--r--src/runtime/RuntimePrefix.h104
-rw-r--r--src/runtime/q3dsmaterialdefinitionparser.cpp138
-rw-r--r--src/runtime/q3dsmaterialdefinitionparser.h49
-rw-r--r--src/runtime/q3dsqmlbehavior.cpp123
-rw-r--r--src/runtime/q3dsqmlbehavior.h83
-rw-r--r--src/runtime/q3dsqmlscript.cpp742
-rw-r--r--src/runtime/q3dsqmlscript.h109
-rw-r--r--src/runtime/q3dsvariantconfig.cpp122
-rw-r--r--src/runtime/q3dsvariantconfig_p.h79
-rw-r--r--src/runtimerender/Qt3DSDistanceFieldGlyphCache.cpp518
-rw-r--r--src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager.cpp75
-rw-r--r--src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager_p.h75
-rw-r--r--src/runtimerender/Qt3DSDistanceFieldGlyphCache_p.h101
-rw-r--r--src/runtimerender/Qt3DSDistanceFieldRenderer.cpp1067
-rw-r--r--src/runtimerender/Qt3DSDistanceFieldRenderer.h171
-rw-r--r--src/runtimerender/Qt3DSFontDatabase.cpp106
-rw-r--r--src/runtimerender/Qt3DSFontDatabase_p.h82
-rw-r--r--src/runtimerender/Qt3DSOffscreenRenderKey.h153
-rw-r--r--src/runtimerender/Qt3DSOffscreenRenderManager.cpp498
-rw-r--r--src/runtimerender/Qt3DSOffscreenRenderManager.h256
-rw-r--r--src/runtimerender/Qt3DSOldNBustedRenderPlugin.cpp118
-rw-r--r--src/runtimerender/Qt3DSOldNBustedRenderPlugin.h102
-rw-r--r--src/runtimerender/Qt3DSOnscreenTextRenderer.cpp421
-rw-r--r--src/runtimerender/Qt3DSQtTextRenderer.cpp655
-rw-r--r--src/runtimerender/Qt3DSRender.h257
-rw-r--r--src/runtimerender/Qt3DSRenderClippingFrustum.cpp85
-rw-r--r--src/runtimerender/Qt3DSRenderClippingFrustum.h161
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.cpp858
-rw-r--r--src/runtimerender/Qt3DSRenderContextCore.h223
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialRenderContext.h94
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp1265
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.h69
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp2131
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialSystem.h174
-rw-r--r--src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp1931
-rw-r--r--src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.h123
-rw-r--r--src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp1532
-rw-r--r--src/runtimerender/Qt3DSRenderDynamicObjectSystem.h286
-rw-r--r--src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h622
-rw-r--r--src/runtimerender/Qt3DSRenderDynamicObjectSystemUtil.h126
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.cpp1872
-rw-r--r--src/runtimerender/Qt3DSRenderEffectSystem.h209
-rw-r--r--src/runtimerender/Qt3DSRenderEulerAngles.cpp383
-rw-r--r--src/runtimerender/Qt3DSRenderEulerAngles.h142
-rw-r--r--src/runtimerender/Qt3DSRenderGpuProfiler.cpp284
-rw-r--r--src/runtimerender/Qt3DSRenderGraphObjectPickQuery.h124
-rw-r--r--src/runtimerender/Qt3DSRenderGraphObjectSerializer.cpp670
-rw-r--r--src/runtimerender/Qt3DSRenderGraphObjectSerializer.h69
-rw-r--r--src/runtimerender/Qt3DSRenderGraphObjectTypes.h166
-rw-r--r--src/runtimerender/Qt3DSRenderImageScaler.cpp883
-rw-r--r--src/runtimerender/Qt3DSRenderImageScaler.h121
-rw-r--r--src/runtimerender/Qt3DSRenderImageTextureData.h138
-rw-r--r--src/runtimerender/Qt3DSRenderInputStreamFactory.cpp214
-rw-r--r--src/runtimerender/Qt3DSRenderInputStreamFactory.h69
-rw-r--r--src/runtimerender/Qt3DSRenderLightConstantProperties.h198
-rw-r--r--src/runtimerender/Qt3DSRenderMaterialHelpers.h94
-rw-r--r--src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h152
-rw-r--r--src/runtimerender/Qt3DSRenderMesh.h187
-rw-r--r--src/runtimerender/Qt3DSRenderPathManager.cpp1964
-rw-r--r--src/runtimerender/Qt3DSRenderPathManager.h121
-rw-r--r--src/runtimerender/Qt3DSRenderPathMath.h713
-rw-r--r--src/runtimerender/Qt3DSRenderPathRenderContext.h94
-rw-r--r--src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.cpp311
-rw-r--r--src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.h54
-rw-r--r--src/runtimerender/Qt3DSRenderPixelGraphicsTypes.cpp66
-rw-r--r--src/runtimerender/Qt3DSRenderPixelGraphicsTypes.h103
-rw-r--r--src/runtimerender/Qt3DSRenderPlugin.cpp936
-rw-r--r--src/runtimerender/Qt3DSRenderPlugin.h148
-rw-r--r--src/runtimerender/Qt3DSRenderPluginCInterface.h330
-rw-r--r--src/runtimerender/Qt3DSRenderPluginGraphObject.h60
-rw-r--r--src/runtimerender/Qt3DSRenderPluginPropertyValue.h182
-rw-r--r--src/runtimerender/Qt3DSRenderProfiler.h112
-rw-r--r--src/runtimerender/Qt3DSRenderRay.cpp164
-rw-r--r--src/runtimerender/Qt3DSRenderRay.h101
-rw-r--r--src/runtimerender/Qt3DSRenderRenderList.cpp124
-rw-r--r--src/runtimerender/Qt3DSRenderRenderList.h125
-rw-r--r--src/runtimerender/Qt3DSRenderRotationHelper.h193
-rw-r--r--src/runtimerender/Qt3DSRenderShaderCache.cpp770
-rw-r--r--src/runtimerender/Qt3DSRenderShaderCache.h160
-rw-r--r--src/runtimerender/Qt3DSRenderShaderCodeGenerator.cpp526
-rw-r--r--src/runtimerender/Qt3DSRenderShaderCodeGenerator.h175
-rw-r--r--src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.cpp671
-rw-r--r--src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.h140
-rw-r--r--src/runtimerender/Qt3DSRenderShaderKeys.h802
-rw-r--r--src/runtimerender/Qt3DSRenderShadowMap.cpp219
-rw-r--r--src/runtimerender/Qt3DSRenderShadowMap.h183
-rw-r--r--src/runtimerender/Qt3DSRenderSubPresentationHelper.h69
-rw-r--r--src/runtimerender/Qt3DSRenderSubpresentation.cpp127
-rw-r--r--src/runtimerender/Qt3DSRenderSubpresentation.h110
-rw-r--r--src/runtimerender/Qt3DSRenderTaggedPointer.h85
-rw-r--r--src/runtimerender/Qt3DSRenderTessModeValues.h74
-rw-r--r--src/runtimerender/Qt3DSRenderTextTextureAtlas.cpp126
-rw-r--r--src/runtimerender/Qt3DSRenderTextTextureAtlas.h63
-rw-r--r--src/runtimerender/Qt3DSRenderTextTextureCache.cpp289
-rw-r--r--src/runtimerender/Qt3DSRenderTextTextureCache.h74
-rw-r--r--src/runtimerender/Qt3DSRenderTextTypes.h193
-rw-r--r--src/runtimerender/Qt3DSRenderTextureAtlas.cpp364
-rw-r--r--src/runtimerender/Qt3DSRenderTextureAtlas.h102
-rw-r--r--src/runtimerender/Qt3DSRenderThreadPool.cpp277
-rw-r--r--src/runtimerender/Qt3DSRenderThreadPool.h127
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.cpp2089
-rw-r--r--src/runtimerender/Qt3DSRenderUIPLoader.h133
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp464
-rw-r--r--src/runtimerender/Qt3DSRenderUIPSharedTranslation.h485
-rw-r--r--src/runtimerender/Qt3DSRenderWidgets.cpp319
-rw-r--r--src/runtimerender/Qt3DSRenderWidgets.h181
-rw-r--r--src/runtimerender/Qt3DSRenderableImage.h77
-rw-r--r--src/runtimerender/Qt3DSRenderer.h249
-rw-r--r--src/runtimerender/Qt3DSRendererUtil.cpp119
-rw-r--r--src/runtimerender/Qt3DSRendererUtil.h62
-rw-r--r--src/runtimerender/Qt3DSTextRenderer.cpp87
-rw-r--r--src/runtimerender/Qt3DSTextRenderer.h150
-rw-r--r--src/runtimerender/android/DynamicLibLoader.h30
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp496
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderCamera.h177
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h147
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp74
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h148
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp160
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h113
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp61
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderEffect.h86
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderGraphObject.h77
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderImage.cpp152
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderImage.h114
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderLayer.cpp105
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderLayer.h203
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderLight.cpp55
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderLight.h90
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderLightmaps.cpp41
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderLightmaps.h77
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderMaterialDirty.h61
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderModel.cpp75
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderModel.h76
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderNode.cpp499
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderNode.h307
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderPath.cpp59
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderPath.h156
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderPathSubPath.h65
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderPresentation.cpp43
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderPresentation.h94
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderReferencedMaterial.h63
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderScene.cpp122
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderScene.h84
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderText.cpp68
-rw-r--r--src/runtimerender/graphobjects/Qt3DSRenderText.h76
-rw-r--r--src/runtimerender/linux/DynamicLibLoader.h92
-rw-r--r--src/runtimerender/macos/DynamicLibLoader.h30
-rw-r--r--src/runtimerender/q3dsqmlrender.cpp144
-rw-r--r--src/runtimerender/q3dsqmlrender.h101
-rw-r--r--src/runtimerender/qnx/DynamicLibLoader.h30
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp543
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRenderableObjects.h472
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp2051
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.h549
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp2220
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h182
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp261
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h115
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp1477
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h367
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp3007
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h452
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSVertexPipelineImpl.h463
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.cpp326
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.h85
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp1092
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h119
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.cpp538
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.h96
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp715
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.h184
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureBMP.cpp1262
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp695
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.h88
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureFreeImageCompat.h413
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureGIF.cpp851
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureHDR.cpp255
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.cpp277
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.h39
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.cpp599
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.h129
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.cpp101
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.h96
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp436
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h81
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.cpp174
-rw-r--r--src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.h126
-rw-r--r--src/runtimerender/windows/DynamicLibLoader.h80
-rw-r--r--src/src.pro10
-rw-r--r--src/state/Qt3DSState.h94
-rw-r--r--src/state/Qt3DSStateScriptContext.h123
-rw-r--r--src/state/Qt3DSStateTypes.h97
-rw-r--r--src/state/Qt3DSStateVisualBindingContextCommands.h348
-rw-r--r--src/system/Qt3DSArray.h135
-rw-r--r--src/system/Qt3DSArray.inl287
-rw-r--r--src/system/Qt3DSAssert.cpp93
-rw-r--r--src/system/Qt3DSAssert.h78
-rw-r--r--src/system/Qt3DSAudioPlayer.h42
-rw-r--r--src/system/Qt3DSBasicPluginDLL.h67
-rw-r--r--src/system/Qt3DSBezierEval.h182
-rw-r--r--src/system/Qt3DSBoundingBox.cpp150
-rw-r--r--src/system/Qt3DSBoundingBox.h85
-rw-r--r--src/system/Qt3DSCircularArray.h102
-rw-r--r--src/system/Qt3DSCircularArray.inl225
-rw-r--r--src/system/Qt3DSColor.cpp95
-rw-r--r--src/system/Qt3DSColor.h85
-rw-r--r--src/system/Qt3DSConfig.h49
-rw-r--r--src/system/Qt3DSCubicRoots.cpp38
-rw-r--r--src/system/Qt3DSCubicRoots.h78
-rw-r--r--src/system/Qt3DSCubicRootsImpl.h177
-rw-r--r--src/system/Qt3DSDLLManager.cpp220
-rw-r--r--src/system/Qt3DSDLLManager.h96
-rw-r--r--src/system/Qt3DSDataLogger.cpp151
-rw-r--r--src/system/Qt3DSDataLogger.h226
-rw-r--r--src/system/Qt3DSDataLogger.hpp96
-rw-r--r--src/system/Qt3DSDataLoggerEnums.h117
-rw-r--r--src/system/Qt3DSDataLoggerViewer.h71
-rw-r--r--src/system/Qt3DSEGLTimer.h70
-rw-r--r--src/system/Qt3DSEndian.h38
-rw-r--r--src/system/Qt3DSEulerAngles.cpp390
-rw-r--r--src/system/Qt3DSEulerAngles.h141
-rw-r--r--src/system/Qt3DSFNDTimer.h44
-rw-r--r--src/system/Qt3DSFile.cpp77
-rw-r--r--src/system/Qt3DSFile.h94
-rw-r--r--src/system/Qt3DSFileStream.cpp237
-rw-r--r--src/system/Qt3DSFileStream.h93
-rw-r--r--src/system/Qt3DSFixedArray.h87
-rw-r--r--src/system/Qt3DSFixedArray.inl150
-rw-r--r--src/system/Qt3DSFunctionWrappers.cpp65
-rw-r--r--src/system/Qt3DSFunctionWrappers.h416
-rw-r--r--src/system/Qt3DSHash.h105
-rw-r--r--src/system/Qt3DSIFileStream.h56
-rw-r--r--src/system/Qt3DSIStream.h162
-rw-r--r--src/system/Qt3DSITimer.h61
-rw-r--r--src/system/Qt3DSMacros.h189
-rw-r--r--src/system/Qt3DSMatrix.cpp897
-rw-r--r--src/system/Qt3DSMatrix.h146
-rw-r--r--src/system/Qt3DSMemory.cpp137
-rw-r--r--src/system/Qt3DSMemory.h183
-rw-r--r--src/system/Qt3DSMemoryFilter.cpp126
-rw-r--r--src/system/Qt3DSMemoryFilter.h69
-rw-r--r--src/system/Qt3DSMemoryHeap.cpp236
-rw-r--r--src/system/Qt3DSMemoryHeap.h133
-rw-r--r--src/system/Qt3DSMemoryManager.cpp453
-rw-r--r--src/system/Qt3DSMemoryManager.h133
-rw-r--r--src/system/Qt3DSMemoryPool.cpp298
-rw-r--r--src/system/Qt3DSMemoryPool.h104
-rw-r--r--src/system/Qt3DSMemoryProbe.cpp149
-rw-r--r--src/system/Qt3DSMemoryProbe.h144
-rw-r--r--src/system/Qt3DSMemorySettings.h131
-rw-r--r--src/system/Qt3DSMemoryStatistics.cpp647
-rw-r--r--src/system/Qt3DSMemoryStatistics.h137
-rw-r--r--src/system/Qt3DSMemoryTracker.cpp164
-rw-r--r--src/system/Qt3DSMemoryTracker.h104
-rw-r--r--src/system/Qt3DSPlatformSpecific.h207
-rw-r--r--src/system/Qt3DSTimer.cpp116
-rw-r--r--src/system/Qt3DSTimer.h142
-rw-r--r--src/system/Qt3DSTypes.cpp54
-rw-r--r--src/system/Qt3DSTypes.h121
-rw-r--r--src/system/Qt3DSVector3.cpp466
-rw-r--r--src/system/Qt3DSVector3.h117
-rw-r--r--src/system/SystemPrefix.h92
-rw-r--r--src/uipparser/Qt3DSIPresentation.h158
-rw-r--r--src/uipparser/Qt3DSUIPParser.h155
-rw-r--r--src/uipparser/Qt3DSUIPParserActionHelper.cpp738
-rw-r--r--src/uipparser/Qt3DSUIPParserActionHelper.h172
-rw-r--r--src/uipparser/Qt3DSUIPParserImpl.cpp2623
-rw-r--r--src/uipparser/Qt3DSUIPParserImpl.h679
-rw-r--r--src/uipparser/Qt3DSUIPParserObjectRefHelper.cpp1011
-rw-r--r--src/uipparser/Qt3DSUIPParserObjectRefHelper.h159
-rw-r--r--src/viewer/Qt3DSAudioPlayerImpl.cpp60
-rw-r--r--src/viewer/Qt3DSAudioPlayerImpl.h48
-rw-r--r--src/viewer/Qt3DSViewerApp.cpp1001
-rw-r--r--src/viewer/Qt3DSViewerApp.h525
-rw-r--r--src/viewer/Qt3DSViewerTimer.h120
-rw-r--r--src/viewer/qt3dsruntimeglobal.h45
-rw-r--r--src_dummy/main.cpp58
-rw-r--r--src_dummy/src_dummy.pro5
-rw-r--r--sync.profile10
-rw-r--r--testres.qrc14
-rw-r--r--tests/tests.pro1
-rw-r--r--tools/attributehashes/AttributeHashes.cpp344
-rw-r--r--tools/attributehashes/attributehashes.pro16
-rw-r--r--tools/tools.pro10
-rw-r--r--tools/viewer/Viewer.qrc14
-rw-r--r--tools/viewer/android/AndroidManifest.xml77
-rw-r--r--tools/viewer/main.cpp384
-rw-r--r--tools/viewer/qml/StyledButton.qml52
-rw-r--r--tools/viewer/qml/StyledMenu.qml95
-rw-r--r--tools/viewer/qml/StyledMenuButton.qml71
-rw-r--r--tools/viewer/qml/StyledMenuItem.qml159
-rw-r--r--tools/viewer/qml/StyledMenuSeparator.qml47
-rw-r--r--tools/viewer/qml/main.qml594
-rw-r--r--tools/viewer/remotedeploymentreceiver.cpp202
-rw-r--r--tools/viewer/remotedeploymentreceiver.h79
-rw-r--r--tools/viewer/resources/images/3D-studio-viewer.icobin0 -> 112324 bytes
-rw-r--r--tools/viewer/resources/images/3D-studio-viewer.svg38
-rw-r--r--tools/viewer/resources/images/arrow.pngbin0 -> 523 bytes
-rw-r--r--tools/viewer/resources/images/arrow@2x.pngbin0 -> 600 bytes
-rw-r--r--tools/viewer/resources/images/check.pngbin0 -> 502 bytes
-rw-r--r--tools/viewer/resources/images/check@2x.pngbin0 -> 638 bytes
-rw-r--r--tools/viewer/resources/images/viewer.icnsbin0 -> 161003 bytes
-rw-r--r--tools/viewer/viewer.cpp416
-rw-r--r--tools/viewer/viewer.h128
-rw-r--r--tools/viewer/viewer.pro49
-rw-r--r--utils.pri8
1465 files changed, 317085 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..5282d18
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "src/3rdparty/EASTL"]
+ path = src/3rdparty/EASTL
+ url = ../qt3dstudio-eastl.git
diff --git a/.qmake.conf b/.qmake.conf
new file mode 100644
index 0000000..37bf76e
--- /dev/null
+++ b/.qmake.conf
@@ -0,0 +1,5 @@
+load(qt_build_config)
+
+MODULE_VERSION = 2.4.0
+
+CMAKE_MODULE_TESTS=-
diff --git a/Studio/Content/Behavior Library/CameraLookAt.qml b/Studio/Content/Behavior Library/CameraLookAt.qml
new file mode 100644
index 0000000..a4d0c9d
--- /dev/null
+++ b/Studio/Content/Behavior Library/CameraLookAt.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*[[
+ <Property name="cameraTarget" formalName="Camera Target" type="ObjectRef" default="Scene.Layer.Camera" description="Object in scene the camera should look at" />
+ <Property name="startImmediately" formalName="Start Immediately?" type="Boolean" default="True" publishLevel="Advanced" description="Start immediately, or wait for\nthe Enable action to be called?" />
+
+ <Handler name="start" formalName="Start" category="CameraLookAt" description="Begin looking the target" />
+ <Handler name="stop" formalName="Stop" category="CameraLookAt" description="Stop looking the target" />
+]]*/
+
+import QtStudio3D.Behavior 1.0
+
+Behavior {
+ //External:
+ property string cameraTarget
+ property bool startImmediately
+ //Internal:
+ property bool running: false
+ property var updateFunction
+
+ function start() {
+ running = true;
+ }
+
+ function stop() {
+ running = false;
+ }
+
+ onInitialize: {
+ if (startImmediately)
+ start();
+ }
+
+ onUpdate: {
+ if (!running)
+ return;
+ var targetTransform = calculateGlobalTransform(cameraTarget);
+ var targetSpot = targetTransform.row(3).toVector3d();
+ var cameraTransform = calculateGlobalTransform();
+ var cameraSpot = cameraTransform.row(3).toVector3d();
+
+ var matrix = calculateGlobalTransform("parent").inverted();
+ matrix.m41 = 0;
+ matrix.m42 = 0;
+ matrix.m43 = 0;
+
+ var rotateRay = targetSpot
+ .minus(cameraSpot)
+ .times(matrix);
+
+ var rotation = lookAt(rotateRay);
+ setAttributeVector("rotation", rotation);
+ }
+
+ function getAttributeVector(name) {
+ var vec = Qt.vector3d(0, 0, 0);
+ getAttribute(name + ".x", vec.x);
+ getAttribute(name + ".y", vec.y);
+ getAttribute(name + ".z", vec.z);
+ return vec;
+ }
+
+ function setAttributeVector(name, vec) {
+ setAttribute(name + ".x", vec.x);
+ setAttribute(name + ".y", vec.y);
+ setAttribute(name + ".z", vec.z);
+ }
+}
diff --git a/Studio/Content/Effect Library/AdditiveColorGradient.effect b/Studio/Content/Effect Library/AdditiveColorGradient.effect
new file mode 100644
index 0000000..7131963
--- /dev/null
+++ b/Studio/Content/Effect Library/AdditiveColorGradient.effect
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property formalName="Top Color" name="top_color" type="Color" default="0.65 0.35 0.15" description="Top color of the gradient."/>
+ <Property formalName="Bottom Color" name="bottom_color" type="Color" default="0.05 0.35 0.75" description="Bottom color of the gradient."/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+
+void frag()
+{
+ vec4 origColor = texture2D_0(TexCoord);
+ vec2 uv = TexCoord.xy;
+
+ vec4 gradient = vec4(mix(vec4(bottom_color.rgb, 1.0), vec4(top_color.rgb, 1.0), uv.y));
+
+ gl_FragColor = origColor + gradient;
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/BaseEffect.effect b/Studio/Content/Effect Library/BaseEffect.effect
new file mode 100644
index 0000000..f0f5340
--- /dev/null
+++ b/Studio/Content/Effect Library/BaseEffect.effect
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+
+void frag()
+{
+ // save original fragments to a variable
+ vec4 original = texture2D_0(TexCoord);
+
+ //output the unmodified original fragments;
+ gl_FragColor = original;
+}
+
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/Bloom.effect b/Studio/Content/Effect Library/Bloom.effect
new file mode 100644
index 0000000..97f9c12
--- /dev/null
+++ b/Studio/Content/Effect Library/Bloom.effect
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="Threshold" formalName="Threshold of the luminocity pass" description="Objects brighter than this will\nbe part of the filter" min=".1" max=".98" default=".8" />
+ <Property name="PoissonRotation" hidden="True" default="0"/>
+ <Property name="PoissonDistance" hidden="True" default="4"/>
+ <Property name="Downsample2" filter="linear" clamp="clamp" type="Texture" />
+ <Property name="Downsample4" filter="linear" clamp="clamp" type="Texture" />
+ <Property name="Downsample8" filter="linear" clamp="clamp" type="Texture" />
+ <Property name="Downsample16" filter="linear" clamp="clamp" type="Texture" />
+ <Property name="DepthSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+varying float range;
+ </Shared>
+ <Shader name="CLEARPASS">
+ <VertexShader>
+// Range of possible values that we care about.
+void vert ()
+{
+
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // Luminosity pass with exponential color channel decay based on the threshold above.
+{
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="STENCILPASS">
+ <VertexShader>
+// Range of possible values that we care about.
+void vert ()
+{
+
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // Luminosity pass with exponential color channel decay based on the threshold above.
+{
+ gl_FragColor = texture2D_0(TexCoord);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="LUMINOSITY">
+ <VertexShader>
+// No op
+void vert ()
+{
+
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // Luminosity pass with exponential color channel decay based on the threshold above.
+{
+ vec4 color = texture2D_0(TexCoord);
+ float luminosity = dot(color.rgb, vec3(0.299, 0.587, 0.114));
+ float decay = min( 1.0, max( 0.0, (luminosity - Threshold) / range ) );
+ decay = decay * decay;
+ gl_FragColor = vec4( color.rgb * decay, color.a );
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLUR">
+ <VertexShader>
+
+vec2 ToRotatedPoissonTexCoord( vec3 poisson, vec2 inputTex, vec2 inc, mat2 rotation )
+{
+ vec2 rotatedPoisson = rotation * vec2( poisson.xy );
+ return vec2( inputTex.x + rotatedPoisson.x * inc.x, inputTex.y + rotatedPoisson.y * inc.y );
+}
+
+void SetupPoissonBlurCoordsRotation(float inBlurAmount, vec2 inTexInfo, float inRotationRadians )
+{
+ float incX = inBlurAmount / inTexInfo.x;
+ float incY = inBlurAmount / inTexInfo.y;
+ float rotCos = cos( inRotationRadians );
+ float rotSin = sin( inRotationRadians );
+ mat2 rotMatrix = mat2( rotCos, rotSin, -rotSin, rotCos );
+ vec2 incVec = vec2( incX, incY );
+
+ TexCoord0 = ToRotatedPoissonTexCoord( poisson0, TexCoord, incVec, rotMatrix );
+ TexCoord1 = ToRotatedPoissonTexCoord( poisson1, TexCoord, incVec, rotMatrix );
+ TexCoord2 = ToRotatedPoissonTexCoord( poisson2, TexCoord, incVec, rotMatrix );
+ TexCoord3 = ToRotatedPoissonTexCoord( poisson3, TexCoord, incVec, rotMatrix );
+ TexCoord4 = ToRotatedPoissonTexCoord( poisson4, TexCoord, incVec, rotMatrix );
+ TexCoord5 = ToRotatedPoissonTexCoord( poisson5, TexCoord, incVec, rotMatrix );
+ TexCoord6 = ToRotatedPoissonTexCoord( poisson6, TexCoord, incVec, rotMatrix );
+ TexCoord7 = ToRotatedPoissonTexCoord( poisson7, TexCoord, incVec, rotMatrix );
+}
+
+void vert ()
+{
+ SetupPoissonBlurCoordsRotation( PoissonDistance, Texture0Info.xy, PoissonRotation);
+}
+ </VertexShader>
+ <FragmentShader>
+vec4 PoissonBlur(sampler2D inSampler )
+{
+ float mult0 = (1.0 - poisson0.z);
+ float mult1 = (1.0 - poisson1.z);
+ float mult2 = (1.0 - poisson2.z);
+ float mult3 = (1.0 - poisson3.z);
+ float mult4 = (1.0 - poisson4.z);
+ float mult5 = (1.0 - poisson5.z);
+ float mult6 = (1.0 - poisson6.z);
+ float mult7 = (1.0 - poisson7.z);
+
+ float multTotal = mult0 + mult1 + mult2 + mult3 + mult4 + mult5 + mult6 + mult7;
+ float multMultiplier = ( multTotal > 0.0 ? 1.0 / multTotal : 0.0 );
+
+ vec4 outColor = GetTextureValue( inSampler, TexCoord0, 1.0 ) * (mult0 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord1, 1.0 ) * (mult1 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord2, 1.0 ) * (mult2 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord3, 1.0 ) * (mult3 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord4, 1.0 ) * (mult4 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord5, 1.0 ) * (mult5 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord6, 1.0 ) * (mult6 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord7, 1.0 ) * (mult7 * multMultiplier);
+ return outColor;
+}
+
+void frag()
+{
+ //Passing in 1.0 means the value will not get alpha-multiplied again
+ gl_FragColor = PoissonBlur( Texture0 );
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="COMBINER">
+ <FragmentShader>
+
+void frag()
+{
+ vec4 sourceColor = texture2D_0(TexCoord);
+
+
+ vec3 summation = texture2D_Downsample2(TexCoord).xyz
+ + texture2D_Downsample4(TexCoord).xyz
+ + texture2D_Downsample8(TexCoord).xyz
+ + texture2D_Downsample16(TexCoord).xyz;
+ gl_FragColor = vec4( clamp( sourceColor.x + summation.x, 0.0, sourceColor.a )
+ , clamp( sourceColor.y + summation.y, 0.0, sourceColor.a )
+ , clamp( sourceColor.z + summation.z, 0.0, sourceColor.a )
+ , sourceColor.a );
+
+ /*
+
+ gl_FragColor = vec4( texture2D_Downsample2(TexCoord).xyz
+ , sourceColor.a );
+ */
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="luminosity_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" lifetime="frame"/>
+ <Buffer name="luminosity_buffer2" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".5" lifetime="frame"/>
+ <Buffer name="downsample_buffer2" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".5" lifetime="frame"/>
+ <Buffer name="downsample_buffer4" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".25" lifetime="frame"/>
+ <Buffer name="downsample_buffer8" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".125" lifetime="frame"/>
+ <Buffer name="downsample_buffer16" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".0625" lifetime="frame"/>
+ <Pass shader="CLEARPASS" input="[source]" output="luminosity_buffer">
+ <RenderState name="Stencil" value="false"/>
+ </Pass>
+ <Pass shader="STENCILPASS" input="[source]" output="luminosity_buffer">
+ <RenderState name="Stencil" value="true"/>
+ </Pass>
+ <Pass shader="LUMINOSITY" input="luminosity_buffer" output="luminosity_buffer2">
+ <RenderState name="Stencil" value="false"/>
+ </Pass>
+ <Pass shader="BLUR" input="luminosity_buffer2" output="downsample_buffer2">
+ <SetParam name="PoissonDistance" value="4"/>
+ <SetParam name="PoissonRotation" value="0"/>
+ </Pass>
+ <Pass shader="BLUR" input="luminosity_buffer2" output="downsample_buffer4">
+ <SetParam name="PoissonDistance" value="4"/>
+ <SetParam name="PoissonRotation" value="0.62831"/>
+ </Pass>
+ <Pass shader="BLUR" input="luminosity_buffer2" output="downsample_buffer8">
+ <SetParam name="PoissonDistance" value="6"/>
+ <SetParam name="PoissonRotation" value="1.25663"/>
+ </Pass>
+ <Pass shader="BLUR" input="luminosity_buffer2" output="downsample_buffer16">
+ <SetParam name="PoissonDistance" value="10"/>
+ <SetParam name="PoissonRotation" value="1.88495"/>
+ </Pass>
+ <Pass shader="COMBINER" input="[source]">
+ <BufferInput param="Downsample2" value="downsample_buffer2"/>
+ <BufferInput param="Downsample4" value="downsample_buffer4"/>
+ <BufferInput param="Downsample8" value="downsample_buffer8"/>
+ <BufferInput param="Downsample16" value="downsample_buffer16"/>
+ <RenderState name="Stencil" value="false"/>
+ </Pass>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/Blur.effect b/Studio/Content/Effect Library/Blur.effect
new file mode 100644
index 0000000..2b9b988
--- /dev/null
+++ b/Studio/Content/Effect Library/Blur.effect
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="amount" formalName="Blur Amount" min="0" max="0.10" default="0.01" description="Amount of Blur"/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+void frag()
+{
+
+ vec4 c1 = texture2D_0(vec2(TexCoord.x - amount, TexCoord.y - amount));
+ vec4 c2 = texture2D_0(vec2(TexCoord.x + amount, TexCoord.y - amount));
+ vec4 c3 = texture2D_0(vec2(TexCoord.x - amount, TexCoord.y + amount));
+ vec4 c4 = texture2D_0(vec2(TexCoord.x + amount, TexCoord.y + amount));
+
+ vec4 f1 = vec4(mix(c1, c2, 0.5));
+ vec4 f2 = vec4(mix(c3, c4, 0.5));
+
+ vec4 c5 = texture2D_0(vec2(TexCoord.x - (amount * 2.0), TexCoord.y));
+ vec4 c6 = texture2D_0(vec2(TexCoord.x, TexCoord.y - (amount * 2.0)));
+ vec4 c7 = texture2D_0(vec2(TexCoord.x, TexCoord.y + (amount * 2.0)));
+ vec4 c8 = texture2D_0(vec2(TexCoord.x + (amount * 2.0), TexCoord.y));
+
+ vec4 f3 = vec4(mix(c5, c6, 0.5));
+ vec4 f4 = vec4(mix(c7, c8, 0.5));
+
+ vec4 r1 = vec4(mix(f1, f2, 0.5));
+ vec4 r2 = vec4(mix(f3, f4, 0.5));
+
+ gl_FragColor = vec4(mix(r1, r2, 0.5));
+
+
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/Brush Strokes.effect b/Studio/Content/Effect Library/Brush Strokes.effect
new file mode 100644
index 0000000..e6e0e1e
--- /dev/null
+++ b/Studio/Content/Effect Library/Brush Strokes.effect
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Simulates an artistic painting of the image-->
+ <Property name="NoiseSamp" formalName="Noise" filter="linear" clamp="repeat" type="Texture" default="./maps/effects/brushnoise.png" description="Texture to be used for the brush texture"/>
+ <Property name="brushAngle" formalName="Brush Angle" default="45" description="Amount to rotate the noise texture."/>
+ <Property name="brushLen" formalName="Stroke Length" min="0" max="3" default="1" description="How far to offset the image/'brush'."/>
+ <Property name="brushSize" formalName="Stroke Size" min="10" max="200" default="100" description="Scale the brush.\nSmaller values yield larger sizes."/>
+ </MetaData>
+ <Shaders>
+ <Shader>
+ <FragmentShader>
+void frag (void)
+{
+ if ( flagNoiseSamp != 0 ) {
+ float alpha = radians(brushAngle);
+ float cosAlpha = cos(alpha);
+ float sinAlpha = sin(alpha);
+ mat2 rotMat = mat2(cosAlpha, sinAlpha, -sinAlpha, cosAlpha);
+
+ vec2 uv0 = TexCoord / brushSize * 1000.0;
+ uv0 = (uv0.yx * rotMat).yx;
+
+ vec2 uv1 = texture2D_NoiseSamp(fract(uv0)).xy - 0.5;
+ uv1*= vec2(1.0, 0.01);
+ uv1*= rotMat;
+ vec2 uv2 = TexCoord + uv1 * 0.1 * brushLen;
+
+ vec2 halfPixelSize = 0.5 / Texture0Info.xy;
+ colorOutput(texture2D_0(clamp(uv2, halfPixelSize, 1.0-halfPixelSize)));
+ }
+ else
+ colorOutput(texture2D_0(TexCoord));
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+</Effect>
diff --git a/Studio/Content/Effect Library/ChromaticAberration.effect b/Studio/Content/Effect Library/ChromaticAberration.effect
new file mode 100644
index 0000000..6b553e7
--- /dev/null
+++ b/Studio/Content/Effect Library/ChromaticAberration.effect
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="Dispersion" formalName="Aberration Amount" description="Amount of Chromatic Aberration" default="0"/>
+ <Property name="FocusDepth" formalName="Focus Depth" description="Dispersion will scale in relation\nto distance from this depth" default="0"/>
+ <Property name="MaskSampler" formalName="Effect Mask" description="Grayscale texture to control where and how\nstrong on screen the aberration effect occurs" type="Texture" filter="linear" clamp="clamp" default="./maps/effects/white.png" />
+ <Property name="DepthDebug" formalName="Debug Dispersion Amount" type="Boolean" description="Allows you to see effect of controls.\nBlack objects will disperse less and\nwhite will disperse more" default="False"/>
+ <Property name="DepthSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="SourceSampler" type="Texture" filter="linear" clamp="clamp"/>
+ </MetaData>
+ <Shaders>
+ <Shader Name="DISPERSE">
+ <FragmentShader>
+#include "depthpass.glsllib"
+
+uniform vec2 CameraClipRange;
+
+void frag()
+{
+ vec4 depthSample = texture(DepthSampler, TexCoord);
+ float depthVal = getDepthValue( depthSample, CameraClipRange );
+ float rawDepth = depthValueToLinearDistance( depthVal, CameraClipRange );
+
+ float depthScale = abs(CameraClipRange.y - CameraClipRange.x);
+ float depthDisp = abs(rawDepth - FocusDepth) / depthScale;
+ float finalDisperse = Dispersion * depthDisp;
+ float effectAmt = texture(MaskSampler, TexCoord).x;
+
+ if ( DepthDebug )
+ {
+ gl_FragColor.rgb = vec3( depthDisp * effectAmt );
+ return;
+ }
+
+ gl_FragColor = texture(SourceSampler, TexCoord);
+
+ ivec2 texSize = textureSize( SourceSampler, 0 );
+ vec2 dispDir = normalize( TexCoord.xy - vec2(0.5) );
+ dispDir /= 2.0 * vec2( texSize );
+ vec3 mixColor;
+ mixColor = gl_FragColor.rgb;
+ mixColor.r = texture(SourceSampler, TexCoord+dispDir*finalDisperse).r;
+ mixColor.b = texture(SourceSampler, TexCoord-dispDir*finalDisperse).b;
+
+ gl_FragColor.rgb = mix( gl_FragColor.rgb, mixColor, effectAmt );
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="DISPERSE">
+ <BufferInput value="[source]" param="SourceSampler" />
+ <DepthInput param="DepthSampler"/>
+ </Pass>
+ </Passes>
+</Effect>
diff --git a/Studio/Content/Effect Library/ColorMaster.effect b/Studio/Content/Effect Library/ColorMaster.effect
new file mode 100644
index 0000000..20e5b4d
--- /dev/null
+++ b/Studio/Content/Effect Library/ColorMaster.effect
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="red" formalName="Red Amount" min="0" max="2.0" default="1.0" description="Amount of Red"/>
+ <Property name="green" formalName="Green Amount" min="0" max="2.0" default="1.0" description="Amount of Green"/>
+ <Property name="blue" formalName="Blue Amount" min="0" max="2.0" default="1.0" description="Amount of Blue"/>
+ <Property name="strength_gray" formalName="Saturation" min="-1" max="1" default="0.0" description="Strength of Color"/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+
+vec4 desaturate(vec3 color, float strength)
+{
+ vec3 lum = vec3(0.299, 0.587, 0.114);
+ // lum values based on: ITU-R BT.601
+ vec3 gray = vec3(dot(lum, color));
+ return vec4(mix(color, gray, -strength), 1.0);
+}
+void frag()
+{
+ vec4 sourceColor = texture2D_0(TexCoord);
+ vec4 basecolor = vec4(sourceColor.r*red,sourceColor.g*green,sourceColor.b*blue,sourceColor.a);
+ gl_FragColor = desaturate(basecolor.rgb,strength_gray);
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/Corona.effect b/Studio/Content/Effect Library/Corona.effect
new file mode 100644
index 0000000..fb50812
--- /dev/null
+++ b/Studio/Content/Effect Library/Corona.effect
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Creates a corona around a sprite.-->
+ <Property name="HBlurBias" formalName="Horizontal Blur" min="0" max="10" default="2" description="Amount of corona horizontally."/>
+ <Property name="VBlurBias" formalName="Vertical Blur" min="0" max="10" default="2" description="Amount of corona vertically."/>
+ <Property name="Trailfade" formalName="Fade Amount" min="0" max="1" default="0.8" description="0=no glow\n0.5=fade quickly\n1.0=persistent trails"/>
+ <Property name="GlowSampler" filter="nearest" clamp="clamp" type="Texture" />
+ <Property name="GlowCol" formalName="Glow Color" type="Color" default="1 0.6 0.0" description="The color to use for the glow."/>
+ <Property name="NoiseSamp" formalName="Noise" filter="linear" clamp="repeat" default="./maps/effects/noise.png" type="Texture" description="Texture to be used for the noise texture"/>
+ <Property name="NoiseScale" formalName="Noise Density" min="0" max="10" default="2" description="The density of the noise in corona.\nThe higher the value, the denser\nand smaller the noise;\nthe lower the value, the bigger the\nnoise scale."/>
+ <Property name="NoiseBright" formalName="Noise Brightness" min="0" max="5" default="4" description="Brightness of the noise."/>
+ <Property name="NoiseRatio" formalName="Noise Amount" min="0" max="1" default=".15" description="Magnitude of the noise."/>
+ <Property name="CrawlLen" formalName="Crawl Length" min="0" max="1" default=".3" description="Length of the corona trail in animation."/>
+ <Property name="CrawlAngle" formalName="Crawl Angle" default="0" description="Angle of the corona trail in animation."/>
+ <Property name="Sprite" filter="nearest" clamp="clamp" type="Texture" />
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+uniform float AppFrame; // frame number since app starts
+uniform float FPS;
+ </Shared>
+ <Shader name="CORONA_HBLUR">
+ <Shared>
+varying vec2 crawl; // corona crawl direction and magnitude
+ </Shared>
+ <VertexShader>
+void vert ()
+{
+ SetupHorizontalGaussianBlur(Texture0Info.x, HBlurBias, TexCoord);
+ // compute crawl
+ float alpha = radians(CrawlAngle + 180.0);
+ crawl = vec2(CrawlLen * sin(alpha), CrawlLen * cos(alpha));
+}
+ </VertexShader>
+ <FragmentShader>
+void frag()
+{
+ //Passing in 1.0 means the value will not get alpha-multiplied again
+ float OutCol = GaussianAlphaBlur( GlowSampler, 1.0 );
+ OutCol *= Trailfade; // fade away glow color
+ OutCol += texture2D_0( TexCoord ).a; // add glow color in the original tex area
+
+ vec2 nuv = NoiseScale * TexCoord3 + AppFrame / FPS * crawl;
+ vec4 noise = texture2D_NoiseSamp(fract(nuv));
+ float ns = (1.0 - NoiseRatio) + NoiseRatio * NoiseBright * noise.x;
+ OutCol *= ns;
+ gl_FragColor = vec4( OutCol );
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="CORONA_VBLUR">
+ <VertexShader>
+void vert ()
+{
+ SetupVerticalGaussianBlur( Texture0Info.y, VBlurBias, TexCoord );
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // PS_Blur_Vertical_9tap
+{
+ float OutCol = GaussianAlphaBlur( Texture0, Texture0Info.z );
+ gl_FragColor = OutCol * vec4(GlowCol.rgb, 1.0);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="CORONA_BLEND">
+ <VertexShader>
+void vert()
+{
+}
+ </VertexShader>
+ <FragmentShader>
+void frag ()
+{
+ vec4 src = texture2D_0( TexCoord );
+ vec4 dst = texture2D_Sprite(TexCoord);
+ colorOutput( src * (1.0 - dst.a) + dst );
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="glow_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size="0.55" lifetime="scene"/>
+ <Buffer name="temp_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size="0.55" lifetime="frame"/>
+
+ <Pass shader="CORONA_HBLUR" input="[source]" output="temp_buffer">
+ <BufferInput param="GlowSampler" value="glow_buffer"/>
+ </Pass>
+ <Pass shader="CORONA_VBLUR" input="temp_buffer" output="glow_buffer"/>
+
+ <Pass shader="CORONA_BLEND" input="glow_buffer">
+ <BufferInput param="Sprite" value="[source]"/>
+ </Pass>
+ </Passes>
+</Effect>
diff --git a/Studio/Content/Effect Library/Depth Of Field Bokeh.effect b/Studio/Content/Effect Library/Depth Of Field Bokeh.effect
new file mode 100644
index 0000000..c715258
--- /dev/null
+++ b/Studio/Content/Effect Library/Depth Of Field Bokeh.effect
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="FocusDistance" formalName="Focus Distance" description="Objects exactly distance +- &quot;In Focus Width&quot;\nfrom the camera will be in focus" default="600"/>
+ <Property name="FocusWidth" formalName="Depth of Field" description="Objects within this range of Focus\nDistance will be in focus" default="20"/>
+ <Property name="MaxBokehRadius" formalName="Max Bokeh Radius" description="Maximum radius of a Bokeh sprite" default="15"/>
+ <Property name="MaxCoCRadius" formalName="Max CoC Radius" description="Maximum radius of a CoC" default="15"/>
+ <Property name="MinBokehThreshold" formalName="Min Bokeh Threshold" description="Minimum luminance difference for\nBokeh detection" default="1.0"/>
+ <Property name="MaxBokehThreshold" formalName="Max Bokeh Threshold" description="Maximum luminance difference for\nBokeh detection" default="1000.0"/>
+ <Property name="MinCoCThreshold" formalName="Min CoC Threshold" description="Minimum CoC radius for Bokeh detection" default="3.0"/>
+ <Property name="DepthDebug" formalName="Debug Focus Rendering" type="Boolean" description="Allows you to see exactly how the Focus\nvariables work. Black objects are\nin focus, white are blurred" default="False"/>
+ <Property name="BokehShapeSampler" formalName="Bokeh shape" filter="linear" clamp="repeat" default="./maps/effects/HexagonalBokeh.png" type="Texture" description="Texture to be used for the bokeh shape"/>
+ <Property name="DepthSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="SourceSampler" type="Texture" filter="linear" clamp="clamp"/>
+ <Property name="BokehDetectSampler" type="Image2D" format="rgba32f" binding="1"/>
+ <Property name="BokehColorSampler" type="Image2D" format="rgba32f" binding="2"/>
+ <Property name="BokehSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="BokehPositionSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="BokehBufferSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="MergedBufferSampler" type="Texture" filter="linear" clamp="clamp"/>
+ <Property name="BokehCounter" type="Buffer" format="uvec4" usage="storage" binding="1" align="std140"/>
+
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+const float BlurAmount = 4.0;
+ </Shared>
+ <Shader name="CLEAR">
+ <VertexShader>
+void vert()
+{
+
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // Simple averaging box blur.
+{
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BOKEH_DETECT">
+ <VertexShader>
+
+void vert()
+{
+
+}
+
+ </VertexShader>
+ <FragmentShader>
+
+void frag() // Mix the input blur and the depth texture with the sprite
+{
+ vec4 sourceColor = textureLod(Texture0, TexCoord, 0.0);
+
+ float depthTap = getDepthValue( texture2D(DepthSampler, TexCoord), CameraClipRange );
+ float linearDepth = depthValueToLinearDistance( depthTap, CameraClipRange );
+ float FocusStart = FocusDistance - FocusWidth;
+ float FocusEnd = FocusDistance + FocusWidth;
+ float blur = clamp( abs(linearDepth - FocusDistance) / (FocusEnd-FocusStart), 0.00, 1.0);
+ //float blur = GetDepthMultiplier( TexCoord, DepthSampler, FocusDistance, FocusWidth, FocusWidth );
+ gl_FragColor = vec4( linearDepth, blur, 0.0, 1.0);
+
+ // use a 3x3 filter to compute luminance difference
+ vec3 avgColor = vec3(0);
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(1, 0)).xyz;
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(0, 1)).xyz;
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(-1, 0)).xyz;
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(0, -1)).xyz;
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(1, 1)).xyz;
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(1, -1)).xyz;
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(-1, -1)).xyz;
+ avgColor += textureLodOffset(Texture0, TexCoord, 0.0, ivec2(-1, 1)).xyz;
+ avgColor /= 8.0;
+
+ float currentLum = dot(vec3(0.2126, 0.7152, 0.0722), sourceColor.xyz);
+ float averageLum = dot(vec3(0.2126, 0.7152, 0.0722), avgColor);
+ //float currentLum = dot(vec3(1.0), sourceColor.xyz);
+ //float averageLum = dot(vec3(1.0), avgColor);
+ float lumDiff = max(currentLum - averageLum, 0.0);
+
+ float cocSize = blur * MaxCoCRadius;
+
+ if( lumDiff > MinBokehThreshold &amp;&amp; lumDiff &lt; MaxBokehThreshold &amp;&amp; cocSize > MinCoCThreshold )
+ {
+ ivec2 sourceSize, storeCoord;
+ sourceSize = ivec2(textureSize(Texture0, 0).xy);
+
+ uint add = uint(1);
+ int current = int(atomicAdd( BokehCounter_data[0].y, add));
+
+ storeCoord.y = int(floor(float(current/sourceSize.x)));
+ storeCoord.x = current - storeCoord.y*sourceSize.x;
+
+ imageStore(BokehDetectSampler, ivec2(storeCoord.xy), vec4(TexCoord.x * float(sourceSize.x), TexCoord.y * float(sourceSize.y), linearDepth, blur));
+
+ vec3 bokehColor = sourceColor.xyz / (cocSize);
+ imageStore(BokehColorSampler, ivec2(storeCoord.xy), vec4(bokehColor, 1.0));
+ }
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BOKEH_RENDER">
+ <VertexShader>
+out vec4 varColor;
+out float varRadius;
+out float varDepth;
+
+void vert()
+{
+ ivec2 bufSize, coord;
+ bufSize = textureSize(BokehPositionSampler,0).xy;
+ coord.y = int(floor(float(gl_InstanceID / bufSize.x)));
+ coord.x = gl_InstanceID - coord.y * bufSize.x;
+
+ varColor = texelFetch(BokehSampler, coord, 0);
+ vec4 pos = texelFetch(BokehPositionSampler, coord, 0);
+
+ varRadius = pos.w * MaxBokehRadius;
+ varDepth = pos.z;
+
+ // convert to NDC -1, 1 range
+ //pos.xy /= DestSize;
+ //pos.xy = pos.xy * 2.0 - 1.0;
+
+ vec4 pos1 = vec4( (attr_pos.xy + pos.xy) / DestSize.xy , 0.0, 1.0 );
+ gl_Position = pos1;
+}
+
+ </VertexShader>
+ <GeometryShader>
+#include "viewProperties.glsllib"
+
+in float varRadius[];
+in float varDepth[];
+in vec4 varColor[];
+out vec4 geColor;
+out float geDepth;
+out vec2 geUVPos;
+
+layout (points) in;
+layout (triangle_strip, max_vertices = 4) out;
+
+void main()
+{
+ gl_Layer = 0;
+ geColor = varColor[0];
+ geDepth = varDepth[0];
+ vec2 rcpSize = 1.0 / DestSize;
+
+ //emit triangle at pos.
+ vec2 offsetx = vec2(rcpSize.x * varRadius[0], 0.0);
+ vec2 offsety = vec2(0.0, rcpSize.y * varRadius[0]);
+ vec2 offsets = vec2(-1.0, -1.0); // Screen offset
+
+ // Expand point into a quad
+ gl_Position = vec4(offsets + 2.0*(gl_in[0].gl_Position.xy - offsetx - offsety),0.0 ,1.0);
+ geUVPos = vec2(0,0);
+ EmitVertex();
+ gl_Position = vec4(offsets + 2.0*(gl_in[0].gl_Position.xy + offsetx - offsety),0.0 ,1.0);
+ geUVPos = vec2(1,0);
+ EmitVertex();
+ gl_Position = vec4(offsets + 2.0*(gl_in[0].gl_Position.xy - offsetx + offsety),0.0 ,1.0);
+ geUVPos = vec2(0,1);
+ EmitVertex();
+ gl_Position = vec4(offsets + 2.0*(gl_in[0].gl_Position.xy + offsetx + offsety),0.0 ,1.0);
+ geUVPos = vec2(1,1);
+ EmitVertex();
+
+ EndPrimitive();
+}
+ </GeometryShader>
+ <FragmentShader>
+in vec4 geColor;
+in vec2 geUVPos;
+in float geDepth;
+
+void frag()
+{
+ float alpha = textureLod(BokehShapeSampler, geUVPos, 0.0 ).r;
+ vec2 bd = textureLod(Texture0, gl_FragCoord.xy/vec2(textureSize(Texture0, 0)), 0.0 ).xy;
+ float blur = bd.x;
+ float depth = bd.y;
+
+ float weight = clamp(depth - geDepth + 1.0, 0.0, 1.0);
+ weight = clamp( weight + blur, 0.0, 1.0);
+
+ gl_FragColor = vec4( geColor.xyz * alpha * weight, alpha * weight);
+}
+ </FragmentShader>
+ </Shader>
+
+<Shader name="MERGE">
+ <VertexShader>
+
+void vert()
+{
+ // reset bokeh counter
+ BokehCounter_data[0].y = uint(0);
+}
+ </VertexShader>
+ <FragmentShader>
+
+void frag() // Mix the input blur and the depth texture with the sprite
+{
+ vec4 sourceCol = texture2D( SourceSampler, TexCoord );
+
+ ivec2 storeCoord;
+ ivec2 sourceSize = textureSize(BokehBufferSampler, 0).xy;
+ storeCoord = ivec2(float(sourceSize.x) * TexCoord.x, float(sourceSize.y) * TexCoord.y);
+ vec4 bokehCol = texelFetch( BokehBufferSampler, storeCoord, 0 );
+ gl_FragColor = vec4( bokehCol.xyz + sourceCol.xyz, sourceCol.a );
+}
+ </FragmentShader>
+ </Shader>
+<Shader name="DOWNSAMPLE">
+ <VertexShader>
+void vert()
+{
+ SetupBoxBlurCoords(vec2(Texture0Info.xy));
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // Simple averaging box blur.
+{
+ gl_FragColor = BoxDepthBlur(DepthSampler, Texture0, Texture0Info.z, FocusDistance, FocusWidth, FocusWidth);
+}
+ </FragmentShader>
+ </Shader>
+<Shader name="BLUR">
+ <VertexShader>
+
+void vert()
+{
+ SetupPoissonBlurCoords( BlurAmount, DestSize.xy );
+}
+
+ </VertexShader>
+ <FragmentShader>
+
+void frag() // Mix the input blur and the depth texture with the sprite
+{
+ float centerMultiplier = GetDepthMultiplier( TexCoord, DepthSampler, FocusDistance, FocusWidth, FocusWidth );
+ if ( DepthDebug )
+ {
+ gl_FragColor = vec4( centerMultiplier,centerMultiplier,centerMultiplier, 1.0 );
+ }
+ else
+ {
+ vec4 blurColor = PoissonDepthBlur(Texture0, Texture0Info.z, DepthSampler, FocusDistance, FocusWidth, FocusWidth );
+ gl_FragColor = mix( texture2D(MergedBufferSampler,TexCoord), blurColor, centerMultiplier );
+ }
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+
+ <Passes>
+ <Buffer name="depthblur_buffer" type="fp16" format="rg" filter="nearest" wrap="clamp" size="1.0" lifetime="frame"/>
+ <Buffer name="bokeh_buffer" type="ubyte" format="rgba" filter="nearest" wrap="clamp" size="1.0" lifetime="scene"/>
+ <Buffer name="merged_buffer" type="ubyte" format="source" filter="nearest" wrap="clamp" size="1.0" lifetime="frame"/>
+ <Image name="bokeh_detect_image" type="fp16" format="rgba" filter="nearest" wrap="clamp" size="1.0" lifetime="scene" access="readwrite"/>
+ <Image name="bokeh_color_image" type="fp16" format="rgba" filter="nearest" wrap="clamp" size="1.0" lifetime="scene" access="readwrite"/>
+ <DataBuffer name="DrawIndirectBuffer" type="indirect" wrapName="BokehCounter" wrapType="storage" format="uint" size="4" lifetime="frame"/>
+ <Buffer name="downsample_buffer" type="ubyte" format="source" filter="linear" wrap="clamp" size=".5" lifetime="frame"/>
+
+ <Pass shader="CLEAR" input="[source]" output="bokeh_buffer">
+ </Pass>
+
+ <Pass shader="BOKEH_DETECT" input="[source]" output="depthblur_buffer">
+ <DepthInput param="DepthSampler"/>
+ <ImageInput value="bokeh_color_image" param="BokehColorSampler" usage="image"/>
+ <ImageInput value="bokeh_detect_image" param="BokehDetectSampler" usage="image"/>
+ <DataBufferInput param="BokehCounter" usage="storage"/>
+ </Pass>
+
+ <Pass shader="BOKEH_RENDER" input="depthblur_buffer" output="bokeh_buffer">
+ <ImageInput value="bokeh_color_image" param="BokehSampler" usage="texture" sync="true"/>
+ <ImageInput value="bokeh_detect_image" param="BokehPositionSampler" usage="texture" sync="true"/>
+ <DataBufferInput param="DrawIndirectBuffer" usage="indirect"/>
+ <Blending source="SrcAlpha" dest="One"/>
+ </Pass>
+
+ <Pass shader="MERGE" input="bokeh_buffer" output="merged_buffer">
+ <BufferInput value="[source]" param="SourceSampler" />
+ <BufferInput value="bokeh_buffer" param="BokehBufferSampler" />
+ <DataBufferInput param="BokehCounter" usage="storage"/>
+ </Pass>
+
+ <Pass shader="DOWNSAMPLE" input="merged_buffer" output="downsample_buffer">
+ <DepthInput param="DepthSampler"/>
+ </Pass>
+
+ <Pass shader="BLUR" input="downsample_buffer" output="[dest]" format="source">
+ <BufferInput value="merged_buffer" param="MergedBufferSampler" />
+ <DepthInput param="DepthSampler"/>
+ </Pass>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/Depth Of Field HQ Blur.effect b/Studio/Content/Effect Library/Depth Of Field HQ Blur.effect
new file mode 100644
index 0000000..6649bf7
--- /dev/null
+++ b/Studio/Content/Effect Library/Depth Of Field HQ Blur.effect
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="FocusDistance" formalName="Focus Distance" description="Objects exactly distance +- &quot;In Focus Width&quot;\nfrom the camera will be in focus" default="600"/>
+ <Property name="FocusWidth" formalName="Depth of Field" description="Objects within this range of Focus\nDistance will be in focus" default="20"/>
+ <Property name="DepthDebug" formalName="Debug Focus Rendering" type="Boolean" description="Allows you to see exactly how the Focus\nvariables work. Black objects are in\nfocus, white are blurred" default="False"/>
+ <Property name="DepthSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="SourceSampler" type="Texture" filter="linear" clamp="clamp"/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+const float BlurAmount = 4.0;
+ </Shared>
+ <Shader name="DOWNSAMPLE">
+ <VertexShader>
+void vert()
+{
+ SetupBoxBlurCoords(vec2(Texture0Info.xy));
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // Simple averaging box blur.
+{
+ gl_FragColor = BoxDepthBlur(DepthSampler, Texture0, Texture0Info.z, FocusDistance, FocusWidth, FocusWidth);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLUR">
+ <VertexShader>
+
+void vert()
+{
+ SetupPoissonBlurCoords( BlurAmount, DestSize.xy );
+}
+
+ </VertexShader>
+ <FragmentShader>
+
+void frag() // Mix the input blur and the depth texture with the sprite
+{
+ float centerMultiplier = GetDepthMultiplier( TexCoord, DepthSampler, FocusDistance, FocusWidth, FocusWidth );
+ if ( DepthDebug )
+ {
+ gl_FragColor = vec4( centerMultiplier,centerMultiplier,centerMultiplier, 1.0 );
+ }
+ else
+ {
+ vec4 blurColor = PoissonDepthBlur(Texture0, Texture0Info.z, DepthSampler, FocusDistance, FocusWidth, FocusWidth );
+ gl_FragColor = mix( texture2D_SourceSampler(TexCoord), blurColor, centerMultiplier );
+ }
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="downsample_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".5" lifetime="frame"/>
+ <Pass shader="DOWNSAMPLE" input="[source]" output="downsample_buffer">
+ <DepthInput param="DepthSampler"/>
+ </Pass>
+ <Pass shader="BLUR" input="downsample_buffer">
+ <BufferInput value="[source]" param="SourceSampler" />
+ <DepthInput param="DepthSampler"/>
+ </Pass>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/Desaturate.effect b/Studio/Content/Effect Library/Desaturate.effect
new file mode 100644
index 0000000..02c3119
--- /dev/null
+++ b/Studio/Content/Effect Library/Desaturate.effect
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="strenght_gray" formalName="Effect Strenght" min="0" max="1" default="1.0" description="Strenght of the Grayscale"/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+
+vec4 desaturate(vec3 color, float strenght)
+{
+ vec3 lum = vec3(0.299, 0.587, 0.114);
+ // lum values based on: ITU-R BT.601
+ vec3 gray = vec3(dot(lum, color));
+ return vec4(mix(color, gray, strenght), 1.0);
+}
+void frag()
+{
+ vec4 origColor = texture2D_0(TexCoord);
+
+ gl_FragColor = desaturate(origColor.rgb,strenght_gray);
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/Distortion Ripple.effect b/Studio/Content/Effect Library/Distortion Ripple.effect
new file mode 100644
index 0000000..0929be1
--- /dev/null
+++ b/Studio/Content/Effect Library/Distortion Ripple.effect
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Distorts the image in a ripple way.-->
+ <Property name="radius" formalName="Radius" min="0" max="100" default="100.0" description="Adjusts the spread between ripples."/>
+ <Property name="center" formalName="Center" type="Float2" default="0.5 0.5" description="Adjusts the focus point of the distortion."/>
+ <Property name="ripples" formalName="Wave Width" min="2" max="100" default="95.0" description="Adjusts the number of ripples."/>
+ <Property name="height" formalName="Wave Height" min="0" max="100" default="25.0" description="Adjusts the distortion amount."/>
+ <Property name="phase" formalName="Ripple Phase" default="0.0" description="The offset of each wave. Animate this\nproperty to see the waves move."/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+varying vec2 center_vec;
+float PI2 = radians(360.0);
+ </Shared>
+ <Shader>
+ <VertexShader>
+void vert ()
+{
+ center_vec = TexCoord - center;
+ //Multiply by x/y ratio so we see a sphere on the screen
+ //instead of an ellipse.
+ center_vec.y *= Texture0Info.y / Texture0Info.x;
+}
+ </VertexShader>
+ <FragmentShader>
+<![CDATA[
+void frag()
+{
+ float dist_to_center = length(center_vec) * 100.0 / radius;;
+
+ vec2 texc;
+ if(dist_to_center > 1.0) {
+ texc = TexCoord;
+ } else {
+ float r = PI2 * (1.0 - dist_to_center);
+ float distortion = sin(r * (100.0-ripples) + radians(phase));
+ texc = TexCoord - ( TexCoord - center ) * distortion * height / 800.0;
+ }
+
+ if ( texc.x < 0.0 || texc.x > 1.0 || texc.y < 0.0 || texc.y > 1.0 )
+ gl_FragColor = vec4(0.0);
+ else
+ colorOutput(texture2D_0(texc));
+}
+]]>
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+</Effect>
diff --git a/Studio/Content/Effect Library/Distortion Sphere.effect b/Studio/Content/Effect Library/Distortion Sphere.effect
new file mode 100644
index 0000000..3ed1e70
--- /dev/null
+++ b/Studio/Content/Effect Library/Distortion Sphere.effect
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Distorts the image in a spherical way.-->
+ <Property name="radius" formalName="Radius" min="0" max="1" default=".3" description="Adjusts the distorted area."/>
+ <Property name="height" formalName="Height" min="-1" max="1" default=".3" description="Adjusts the distortion amount."/>
+ <Property name="center" formalName="Center" type="Float2" default="0.5 0.5" description="Adjusts the focus point of the distortion."/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+varying vec2 center_vec;
+ </Shared>
+ <Shader>
+ <VertexShader>
+void vert ()
+{
+ center_vec = TexCoord - center;
+ //Multiply by x/y ratio so we see a sphere on the screen
+ //instead of an ellipse.
+ center_vec.y *= Texture0Info.y / Texture0Info.x;
+}
+ </VertexShader>
+ <FragmentShader>
+<![CDATA[
+void frag()
+{
+ float dist_to_center = length(center_vec) / radius;;
+
+ vec2 texc;
+ if(dist_to_center > 1.0) {
+ texc = TexCoord;
+ } else {
+ float distortion = 1.0 - dist_to_center * dist_to_center;
+ texc = TexCoord - (TexCoord - center) * distortion * height;
+ }
+
+ if ( texc.x < 0.0 || texc.x > 1.0 || texc.y < 0.0 || texc.y > 1.0 )
+ gl_FragColor = vec4(0.0);
+ else
+ colorOutput(texture2D_0(texc));
+}
+]]>
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+</Effect> \ No newline at end of file
diff --git a/Studio/Content/Effect Library/Distortion Spiral.effect b/Studio/Content/Effect Library/Distortion Spiral.effect
new file mode 100644
index 0000000..a5a9697
--- /dev/null
+++ b/Studio/Content/Effect Library/Distortion Spiral.effect
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Distorts the image in a spiraling way.-->
+ <Property name="radius" formalName="Radius" min="0" max="1" default=".3" description="Adjusts the distorted area."/>
+ <Property name="spiral" formalName="Spiral" min="-10" max="10" default="1.0" description="Adjusts the spiraling amount."/>
+ <Property name="center" formalName="Center" type="Float2" default="0.5 0.5" description="Adjusts the focus point of the distortion."/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+varying vec2 center_vec;
+float PI2 = radians(360.0);
+ </Shared>
+ <Shader>
+ <VertexShader>
+void vert ()
+{
+ center_vec = TexCoord - center;
+ //Multiply by x/y ratio so we see a sphere on the screen
+ //instead of an ellipse.
+ center_vec.y *= Texture0Info.y / Texture0Info.x;
+}
+ </VertexShader>
+ <FragmentShader>
+<![CDATA[
+void frag()
+{
+ float dist_to_center = length(center_vec) / radius;;
+
+ vec2 texc;
+ if(dist_to_center > 1.0) {
+ texc = TexCoord;
+ } else {
+ float rotation_amount = (1.0 - dist_to_center) * (1.0 - dist_to_center);
+ float r = PI2 * rotation_amount * spiral / 4.0;
+ float cos_r = cos(r);
+ float sin_r = sin(r);
+ mat2 rotation = mat2(cos_r, sin_r, -sin_r, cos_r);
+ texc = center + rotation * (TexCoord - center);
+ }
+
+ if ( texc.x < 0.0 || texc.x > 1.0 || texc.y < 0.0 || texc.y > 1.0 )
+ gl_FragColor = vec4(0.0);
+ else
+ colorOutput(texture2D_0(texc));
+}
+]]>
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+</Effect> \ No newline at end of file
diff --git a/Studio/Content/Effect Library/Edge Detect.effect b/Studio/Content/Effect Library/Edge Detect.effect
new file mode 100644
index 0000000..2b200d0
--- /dev/null
+++ b/Studio/Content/Effect Library/Edge Detect.effect
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Smooth, unchanging areas of the image are turned black, while areas of the image with sharp color changes are brightened to highlight the 'edges' in the image.-->
+ <Property name="amount" formalName="Amount" min="0" max="1" default="1" description="0 = no effect\n1 = maximum effect"/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+////////////////////////////////////////////////////////////
+// vert / frag shaders.
+
+varying vec4 TexCoordBLL; //Bottom Left and Bottom Tap
+varying vec4 TexCoordTLT; //Top Left and Top Tap
+varying vec4 TexCoordTRR; //Upper Right and Right Tap
+varying vec4 TexCoordBRB; //Bottom Right and Bottom Tap
+ </Shared>
+ <Shader>
+ <VertexShader>
+void vert()
+{
+ //Pass Through the Texture Taps
+ float deltax = 1.0/Texture0Info.x;
+ float deltay = 1.0/Texture0Info.y;
+
+ //Bottom Left
+ TexCoordBLL.x = TexCoord.s - deltax;
+ TexCoordBLL.y = TexCoord.t - deltay;
+
+ //Left
+ TexCoordBLL.z = TexCoord.s - deltax;
+ TexCoordBLL.w = TexCoord.t;
+
+ //Top Left
+ TexCoordTLT.x = TexCoord.s - deltax;
+ TexCoordTLT.y = TexCoord.t + deltay;
+
+ //Top
+ TexCoordTLT.z = TexCoord.s;
+ TexCoordTLT.w = TexCoord.t + deltay;
+
+ //Upper Right
+ TexCoordTRR.x = TexCoord.s + deltax;
+ TexCoordTRR.y = TexCoord.t + deltay;
+
+ //Right
+ TexCoordTRR.z = TexCoord.s + deltax;
+ TexCoordTRR.w = TexCoord.t;
+
+ //Bottom Right
+ TexCoordBRB.x = TexCoord.s + deltax;
+ TexCoordBRB.y = TexCoord.t - deltay;
+
+ //Bottom
+ TexCoordBRB.z = TexCoord.s;
+ TexCoordBRB.w = TexCoord.t - deltay;
+}
+ </VertexShader>
+ <FragmentShader>
+void frag (void)
+{
+ vec4 centerTap = texture2D_0(TexCoord);
+ vec4 edgeTap = texture2D_0(TexCoordBLL.xy) +
+ texture2D_0(TexCoordBLL.zw) +
+ texture2D_0(TexCoordTLT.xy) +
+ texture2D_0(TexCoordTLT.zw) +
+ texture2D_0(TexCoordTRR.xy) +
+ texture2D_0(TexCoordTRR.zw) +
+ texture2D_0(TexCoordBRB.xy) +
+ texture2D_0(TexCoordBRB.zw);
+ vec3 edgeDetect = 8.0*(centerTap.rgb + -0.125*edgeTap.rgb);
+ edgeDetect = clamp(edgeDetect, 0.0, centerTap.a);
+
+ colorOutput(vec4(mix(centerTap.rgb, edgeDetect, amount), centerTap.a));
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+</Effect>
+
+
+
diff --git a/Studio/Content/Effect Library/Emboss.effect b/Studio/Content/Effect Library/Emboss.effect
new file mode 100644
index 0000000..876db3a
--- /dev/null
+++ b/Studio/Content/Effect Library/Emboss.effect
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="amount" formalName="Amount" min="0" max="0.01" default="0.003" description="Amount"/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+
+void frag()
+{
+ vec4 origColor = texture2D_0(TexCoord);
+
+ float step_w = amount;
+ float step_h = amount;
+
+ vec4 t1 = texture2D_0(vec2(TexCoord.x - step_w, TexCoord.y - step_h));
+ vec4 t2 = texture2D_0(vec2(TexCoord.x, TexCoord.y - step_h));
+ vec4 t3 = texture2D_0(vec2(TexCoord.x - step_w, TexCoord.y));
+ vec4 t4 = texture2D_0(TexCoord);
+
+ vec3 rr = -4.0 * t1.rgb - 4.0 * t2.rgb - 4.0 * t3.rgb + 12.0 * t4.rgb;
+ float y = (rr.r + rr.g + rr.b) / 3.0;
+
+ vec4 result = vec4(vec3(y, y, y) + 0.3, origColor.a);
+
+ gl_FragColor = result;
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/FXAA.effect b/Studio/Content/Effect Library/FXAA.effect
new file mode 100644
index 0000000..0434a38
--- /dev/null
+++ b/Studio/Content/Effect Library/FXAA.effect
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="Sprite" filter="nearest" clamp="clamp" type="Texture" />
+ </MetaData>
+ <Shaders>
+ <Shader name="RGBL">
+ <FragmentShader>
+void frag() // Create RGBL buffer
+{
+ vec4 color = texture2D_0(TexCoord);
+ color.a = dot(color.rgb, vec3(0.299, 0.587, 0.114));
+ gl_FragColor = color;
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLUR">
+ <FragmentShader>
+#define FXAA_VERION 311
+#define FXAA_PC 1
+#define FXAA_GLSL_130 1
+#define FXAA_LINEAR 1
+#if FXAA_VERION >= 311
+#include "Fxaa3_11.glsllib"
+#else
+#include "Fxaa3_8.glsllib"
+#endif
+
+void frag() // Mix the input blur and the depth texture with the sprite
+{
+ float sprightA = texture2D_Sprite( TexCoord ).a;
+#if FXAA_VERION >= 311
+ vec4 aaPix = FxaaPixelShader( TexCoord, vec4(0.0,0.0,0.0,0.0), Texture0, Texture0, Texture0, vec2(1.0 / DestSize.x, 1.0 / DestSize.y),
+ vec4(0,0,0,0), vec4(0,0,0,0), vec4(0,0,0,0), 0.75, 0.166, 0.0833, 8.0, 0.125, 0.05, vec4(0,0,0,0) );
+#else
+ vec4 aaPix = FxaaPixelShader( TexCoord, vec4(0.0,0.0,0.0,0.0), Texture0, vec2(1.0 / DestSize.x, 1.0 / DestSize.y), vec4(0,0,0,0) );
+#endif
+ gl_FragColor = vec4(aaPix.rgb, sprightA );
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="rgbl_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" lifetime="frame"/>
+ <Pass shader="RGBL" input="[source]" output="rgbl_buffer"/>
+ <Pass shader="BLUR" input="rgbl_buffer">
+ <BufferInput param="Sprite" value="[source]"/>
+ </Pass>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/FrameFlipper.effect b/Studio/Content/Effect Library/FrameFlipper.effect
new file mode 100644
index 0000000..6529e6c
--- /dev/null
+++ b/Studio/Content/Effect Library/FrameFlipper.effect
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="horflip" formalName="Flip Horizontally" type="Boolean" description="Flip Frame horizontally" default="False"/>
+ <Property name="verflip" formalName="Flip Vertically" type="Boolean" description="Flip Frame vertically" default="False"/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+void frag()
+{
+ float yflippedCoord = 1.0 - TexCoord.y;
+ float xflippedCoord = 1.0 - TexCoord.x;
+ vec2 flippedCoord = TexCoord;
+
+ if(horflip || verflip){
+ if(horflip){
+ flippedCoord.x = xflippedCoord;
+ }
+ if(verflip){
+ flippedCoord.y = yflippedCoord;
+ }
+ }
+
+ vec4 origColor = texture2D_0(flippedCoord);
+
+ gl_FragColor = origColor;
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/FullScreenTextureOverlay.effect b/Studio/Content/Effect Library/FullScreenTextureOverlay.effect
new file mode 100644
index 0000000..42be3f3
--- /dev/null
+++ b/Studio/Content/Effect Library/FullScreenTextureOverlay.effect
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="Overlay" formalName="Overlay Texture" description="Overlay texture" type="Texture" clamp="repeat" />
+ <Property name="overlay_repeat" formalName="Repeat" min="0" max="50" default="1" description="Times to repeat the image over screen."/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+
+void frag()
+{
+ vec4 smp = texture(Overlay, TexCoord.xy*overlay_repeat);
+ gl_FragColor = smp;
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/Gaussian Blur.effect b/Studio/Content/Effect Library/Gaussian Blur.effect
new file mode 100644
index 0000000..958d9fe
--- /dev/null
+++ b/Studio/Content/Effect Library/Gaussian Blur.effect
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Quickly blurs by an adjustable amount. Gaussian refers to the bell-shaped curve that is generated when the shader applies a weighted average to the pixels. The Gaussian Blur filter adds low-frequency detail and can produce a hazy effect.-->
+ <Property name="BlurBias" formalName="Blurriness" min="0" max="10" default="2" description="0 = no blur\n10 = maximum blur" />
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+ </Shared>
+ <Shader name="HBLUR">
+ <VertexShader>
+void vert()
+{
+ SetupHorizontalGaussianBlur(Texture0Info.x, BlurBias, TexCoord);
+}
+ </VertexShader>
+ <FragmentShader>
+void frag()
+{
+ gl_FragColor = GaussianBlur(Texture0, Texture0Info.z);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="VBLUR">
+ <VertexShader>
+void vert()
+{
+ SetupVerticalGaussianBlur(Texture0Info.y, BlurBias, TexCoord);
+}
+ </VertexShader>
+ <FragmentShader>
+
+void frag() // PS_Blur_Vertical_9tap
+{
+ vec4 fragColor = GaussianBlur(Texture0, Texture0Info.z);
+ colorOutput(fragColor);
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="temp_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size="1.0" lifetime="frame"/>
+ <Pass name="1" shader="HBLUR" input="[source]" output="temp_buffer"/>
+ <Pass name="2" shader="VBLUR" input="temp_buffer"/>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/HDRBloomTonemap.effect b/Studio/Content/Effect Library/HDRBloomTonemap.effect
new file mode 100644
index 0000000..4424393
--- /dev/null
+++ b/Studio/Content/Effect Library/HDRBloomTonemap.effect
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="GammaValue" formalName="Gamma" default="2.2" min="0.1" max="4"/>
+ <Property name="Exposure" min="-9" max="9" default="0"/>
+
+ <Property name="BloomThreshold" formalName="Bloom Threshold" description="Objects brighter than this will\ngenerate a bloom" default="1.0" />
+ <Property name="BlurFalloff" formalName="Bloom Falloff" description="Size of the bloom. Smaller\nnumber means larger bloom." default="0" min="0" max="10"/>
+
+ <Property name="TonemappingLerp" formalName="Effect Amount" description="Adjust between no change and\nfull effect." default="1" min="0" max="1" hidden="True"/>
+
+ <!--
+ <Property name="Key" formalName="Luminance Key" min="0" max="1" default="0.04"/>
+ <Property name="expLum" formalName="Exposure Luminance" default="2.0"/>
+ <Property name="TonemappingLod" formalName="Tonemapping adaptation rate" default="10" min="0" max="20"/>
+ -->
+ <Property name="ChannelThreshold" formalName="Channel Threshold" hidden="True" description="Channel threshold" default="1.0" />
+ <Property name="PoissonRotation" hidden="True" default="0"/>
+ <Property name="PoissonDistance" hidden="True" default="4"/>
+ <Property name="Downsample2" filter="linear" clamp="clamp" type="Texture" />
+ <Property name="Downsample4" filter="linear" clamp="clamp" type="Texture" />
+
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+#include "luminance.glsllib"
+float get_blur_falloff() { return exp2( -BlurFalloff ); }
+float get_exposure() { return exp2( Exposure ); }
+ </Shared>
+ <Shader name="LUMINOSITY">
+ <VertexShader>
+vec2 ToRotatedPoissonTexCoord( vec3 poisson, vec2 inputTex, vec2 inc, mat2 rotation )
+{
+ vec2 rotatedPoisson = rotation * vec2( poisson.xy );
+ return vec2( inputTex.x + rotatedPoisson.x * inc.x, inputTex.y + rotatedPoisson.y * inc.y );
+}
+
+void SetupPoissonBlurCoordsRotation(float inBlurAmount, vec2 inTexInfo, float inRotationRadians )
+{
+ float incX = inBlurAmount / inTexInfo.x;
+ float incY = inBlurAmount / inTexInfo.y;
+ float rotCos = cos( inRotationRadians );
+ float rotSin = sin( inRotationRadians );
+ mat2 rotMatrix = mat2( rotCos, rotSin, -rotSin, rotCos );
+ vec2 incVec = vec2( incX, incY );
+
+ TexCoord0 = ToRotatedPoissonTexCoord( poisson0, TexCoord, incVec, rotMatrix );
+ TexCoord1 = ToRotatedPoissonTexCoord( poisson1, TexCoord, incVec, rotMatrix );
+ TexCoord2 = ToRotatedPoissonTexCoord( poisson2, TexCoord, incVec, rotMatrix );
+ TexCoord3 = ToRotatedPoissonTexCoord( poisson3, TexCoord, incVec, rotMatrix );
+ TexCoord4 = ToRotatedPoissonTexCoord( poisson4, TexCoord, incVec, rotMatrix );
+ TexCoord5 = ToRotatedPoissonTexCoord( poisson5, TexCoord, incVec, rotMatrix );
+ TexCoord6 = ToRotatedPoissonTexCoord( poisson6, TexCoord, incVec, rotMatrix );
+ TexCoord7 = ToRotatedPoissonTexCoord( poisson7, TexCoord, incVec, rotMatrix );
+}
+// No op
+void vert ()
+{
+ SetupPoissonBlurCoordsRotation( 5.0 * get_blur_falloff(), Texture0Info.xy, 0.0);
+}
+ </VertexShader>
+ <FragmentShader>
+
+float cutoff( float color )
+{
+ return color >= BloomThreshold ? color : 0.0;
+}
+vec4 cutoffColor( sampler2D inSampler, vec2 texCoord )
+{
+ vec4 color = GetTextureValue(inSampler, texCoord, 1.0);
+ vec3 exposed_color = color.xyz * get_exposure();
+ vec3 cutoff_color = vec3( cutoff( color.x ), cutoff( color.y ), cutoff( color.z ) );
+ float pixelMult = dot( cutoff_color, cutoff_color ) > 0.0 ? 1.0 : 0.0;
+ return vec4( exposed_color.xyz, color.a ) * pixelMult;
+}
+
+vec4 PoissonBlur(sampler2D inSampler )
+{
+ //flatten out the poisson for this step, we really just want to smear.
+ float mult0 = 1.0;
+ float mult1 = mult0;
+ float mult2 = mult0;
+ float mult3 = mult2;
+ float mult4 = mult2;
+ float mult5 = mult2;
+ float mult6 = mult2;
+ float mult7 = mult2;
+
+ float multTotal = mult0 + mult1 + mult2 + mult3 + mult4 + mult5 + mult6 + mult7;
+ float multMultiplier = ( multTotal > 0.0 ? 1.0 / multTotal : 0.0 );
+
+ vec4 outColor = cutoffColor( inSampler, TexCoord0 ) * (mult0 * multMultiplier);
+ outColor += cutoffColor( inSampler, TexCoord1 ) * (mult1 * multMultiplier);
+ outColor += cutoffColor( inSampler, TexCoord2 ) * (mult2 * multMultiplier);
+ outColor += cutoffColor( inSampler, TexCoord3 ) * (mult3 * multMultiplier);
+ outColor += cutoffColor( inSampler, TexCoord4 ) * (mult4 * multMultiplier);
+ outColor += cutoffColor( inSampler, TexCoord5 ) * (mult5 * multMultiplier);
+ outColor += cutoffColor( inSampler, TexCoord6 ) * (mult6 * multMultiplier);
+ outColor += cutoffColor( inSampler, TexCoord7 ) * (mult7 * multMultiplier);
+ return outColor;
+}
+
+void frag() // Luminosity pass with exponential color channel decay based on the threshold above.
+{
+ gl_FragColor = PoissonBlur( Texture0 );
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLUR">
+ <VertexShader>
+
+vec2 ToRotatedPoissonTexCoord( vec3 poisson, vec2 inputTex, vec2 inc, mat2 rotation )
+{
+ vec2 rotatedPoisson = rotation * vec2( poisson.xy );
+ return vec2( inputTex.x + rotatedPoisson.x * inc.x, inputTex.y + rotatedPoisson.y * inc.y );
+}
+
+void SetupPoissonBlurCoordsRotation(float inBlurAmount, vec2 inTexInfo, float inRotationRadians )
+{
+ float incX = inBlurAmount / inTexInfo.x;
+ float incY = inBlurAmount / inTexInfo.y;
+ float rotCos = cos( inRotationRadians );
+ float rotSin = sin( inRotationRadians );
+ mat2 rotMatrix = mat2( rotCos, rotSin, -rotSin, rotCos );
+ vec2 incVec = vec2( incX, incY );
+
+ TexCoord0 = ToRotatedPoissonTexCoord( poisson0, TexCoord, incVec, rotMatrix );
+ TexCoord1 = ToRotatedPoissonTexCoord( poisson1, TexCoord, incVec, rotMatrix );
+ TexCoord2 = ToRotatedPoissonTexCoord( poisson2, TexCoord, incVec, rotMatrix );
+ TexCoord3 = ToRotatedPoissonTexCoord( poisson3, TexCoord, incVec, rotMatrix );
+ TexCoord4 = ToRotatedPoissonTexCoord( poisson4, TexCoord, incVec, rotMatrix );
+ TexCoord5 = ToRotatedPoissonTexCoord( poisson5, TexCoord, incVec, rotMatrix );
+ TexCoord6 = ToRotatedPoissonTexCoord( poisson6, TexCoord, incVec, rotMatrix );
+ TexCoord7 = ToRotatedPoissonTexCoord( poisson7, TexCoord, incVec, rotMatrix );
+}
+
+void vert ()
+{
+ SetupPoissonBlurCoordsRotation( PoissonDistance, Texture0Info.xy, PoissonRotation);
+}
+ </VertexShader>
+ <FragmentShader>
+vec4 PoissonBlur(sampler2D inSampler )
+{
+ float mult0 = (1.0 - poisson0.z);
+ float mult1 = (1.0 - poisson1.z);
+ float mult2 = (1.0 - poisson2.z);
+ float mult3 = (1.0 - poisson3.z);
+ float mult4 = (1.0 - poisson4.z);
+ float mult5 = (1.0 - poisson5.z);
+ float mult6 = (1.0 - poisson6.z);
+ float mult7 = (1.0 - poisson7.z);
+
+ float multTotal = mult0 + mult1 + mult2 + mult3 + mult4 + mult5 + mult6 + mult7;
+ float multMultiplier = ( multTotal > 0.0 ? 1.0 / multTotal : 0.0 ) * get_blur_falloff();
+
+ vec4 outColor = GetTextureValue( inSampler, TexCoord0, 1.0 ) * (mult0 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord1, 1.0 ) * (mult1 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord2, 1.0 ) * (mult2 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord3, 1.0 ) * (mult3 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord4, 1.0 ) * (mult4 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord5, 1.0 ) * (mult5 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord6, 1.0 ) * (mult6 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord7, 1.0 ) * (mult7 * multMultiplier);
+ return outColor;
+}
+
+void frag()
+{
+ //Passing in 1.0 means the value will not get alpha-multiplied again
+ gl_FragColor = PoissonBlur( Texture0 );
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="COMBINER">
+ <FragmentShader>
+ /*
+
+float GetAdaptedLuminance( sampler2D inSampler )
+{
+
+ vec3 col = textureLod( inSampler, TexCoord, TonemappingLod).rgb;
+ return luminance( col );
+}
+
+vec3 GetTonemappedReinhard( sampler2D inSampler, vec3 inSource, vec3 inBlurred )
+{
+ // adapted luminance value
+ float adpLm = GetAdaptedLuminance( inSampler );
+ // luminance of current color
+ float curLm = luminance( inSource.rgb );
+ // relative luminance
+ float relLm = Key/adpLm;
+ // displayable value D
+ float D = (relLm * (1.0 + relLm/(expLum*expLum)) / (1.0 + relLm));
+ // tone map result
+ vec3 color = inBlurred.xyz * relLm;
+ //vec3 gamaColor = pow(color, vec3(1.0/2.2));
+
+ //return gamaColor;
+ return vec3(relLm, relLm, relLm );
+}
+
+vec3 GetTonemappedReinhardSimple( vec3 inSource, vec3 inBlurred )
+{
+ vec3 texColor = inBlurred * 1.0; // Hardcoded Exposure Adjustment
+ texColor = texColor/(1.0 + texColor);
+ vec3 retColor = pow( texColor, vec3(1.0/2.2) );
+ return retColor;
+}
+*/
+
+void frag()
+{
+ vec4 sourceColor = texture2D_0(TexCoord);
+
+
+ vec4 summation = texture2D_Downsample2(TexCoord)
+ + texture2D_Downsample4(TexCoord);
+
+ vec3 bloom_result = sourceColor.xyz * get_exposure() + summation.xyz;
+
+ //Threshold defines the white point for the image which shouldn't be adaptive.
+ vec3 thresholded = clamp( bloom_result.xyz, 0.0, ChannelThreshold ) / ChannelThreshold;
+
+ vec3 tonemapped = pow( thresholded, vec3( 1.0 / GammaValue ) );
+
+ vec3 final_color = mix( thresholded, tonemapped, TonemappingLerp );
+
+ float resultAlpha = max( summation.a, sourceColor.a );
+
+ gl_FragColor = vec4( final_color, resultAlpha );
+
+ /*
+ gl_FragColor = vec4( texture2D_Downsample2(TexCoord).xyz
+ , 1.0 );
+ */
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="Passthrough">
+ <VertexShader>
+void vert ()
+{
+}
+ </VertexShader>
+ <FragmentShader>
+void frag()
+{
+ //Passing in 1.0 means the value will not get alpha-multiplied again
+ gl_FragColor = GetTextureValue( Texture0, TexCoord, 1.0 );
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="luminosity_buffer2" format="source" filter="linear" wrap="clamp" size=".5" lifetime="scene"/>
+ <Buffer name="downsample_buffer2" format="source" filter="linear" wrap="clamp" size=".5" lifetime="scene"/>
+ <Buffer name="downsample_buffer4" format="source" filter="linear" wrap="clamp" size=".25" lifetime="scene"/>
+ <Pass shader="LUMINOSITY" input="[source]" output='downsample_buffer2' >
+ </Pass>
+ <Pass shader="LUMINOSITY" input="downsample_buffer2" output='luminosity_buffer2' >
+ </Pass>
+ <!--<Pass shader='Passthrough' input='luminosity_buffer2' />-->
+
+ <Pass shader="BLUR" input="luminosity_buffer2" output="downsample_buffer2">
+ <SetParam name="PoissonDistance" value="4"/>
+ <SetParam name="PoissonRotation" value="0"/>
+ </Pass>
+ <Pass shader="BLUR" input="luminosity_buffer2" output="downsample_buffer4">
+ <SetParam name="PoissonDistance" value="4"/>
+ <SetParam name="PoissonRotation" value="0.62831"/>
+ </Pass>
+ <Pass shader="COMBINER" input="[source]">
+ <BufferInput param="Downsample2" value="downsample_buffer2"/>
+ <BufferInput param="Downsample4" value="downsample_buffer4"/>
+ <RenderState name="Stencil" value="false"/>
+ </Pass>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/LightTable.effect b/Studio/Content/Effect Library/LightTable.effect
new file mode 100644
index 0000000..91f5913
--- /dev/null
+++ b/Studio/Content/Effect Library/LightTable.effect
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="SurfDist" formalName="Distance to Surface" description="Distance from camera to the paper surface" default="100"/>
+ <Property name="BlurDist" formalName="Distance to Full Blur" description="Distance from the paper surface that\ncorresponds to fully blurred" default="100"/>
+ <Property name="MaxBlur" formalName="Max Blur Radius" description="Blur radius defined as 'full blur'" min="1" max="100" default="50"/>
+ <Property name="OverlayDif" formalName="Diffuse Texture" description="Texture overlay color for the paper surface" type="Texture" clamp="repeat" />
+ <Property name="OverlayTrn" formalName="Translucent Texture" description="Texture overlay translucency for the\npaper surface" type="Texture" clamp="repeat" />
+ <Property name="OverlayNrm" formalName="Normal Texture" description="Texture overlay normal for the paper\nsurface" type="Texture" clamp="repeat" />
+ <Property name="OverlayScale" formalName="Texture Scale" description="Texture overlay scaling factor" type="Float2" default="1 1"/>
+ <Property name="OverlayRot" formalName="Texture Rotation" description="Texture overlay rotation angle" default="0" min="0" max="360"/>
+ <Property name="OverlayTrans" formalName="Translucency blocking" description="How much translucency through the overlay" default="2.0"/>
+ <Property name="LightCol" formalName="Light Color" description="Color of the backlight" type="Color" default="1 1 1"/>
+ <Property name="LightBrt" formalName="Light Brightness" description="Brightness of the backlight" default="1.0"/>
+ <Property name="LightExp" formalName="Light Exposure" descriptoin="Pre-emptive exposure operation to prevent\nblowout" default="1.0"/>
+
+ <Property name="DimplePos" formalName="Dimple Position" description="On-screen position of a depth\n'pressure dimple'" type="Float2" default="0 0"/>
+ <Property name="DimpleDepth" formalName="Dimple Pressure" description="How deep the 'pressure dimple' goes" default="0"/>
+ <Property name="DimpleSize" formalName="Dimple Size" description="How big the pressure dimple is in\nonscreen pixels" default="1" min="1" max="1000"/>
+
+ <!-- Internal buffers plus a few extra options -->
+ <Property name="DepthSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="DistBuffer" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="BlurBuffer" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="SrcSampler" type="Texture" filter="linear" clamp="clamp"/>
+ <Property name="HalfSampler" type="Texture" filter="linear" clamp="clamp"/>
+ <Property name="BlurDebug" formalName="Debug Blur Amt" type="Boolean" default="False"/>
+ <Property name="DepthDebug" formalName="Debug Depth Map" type="Boolean" default="False"/>
+ </MetaData>
+<Shaders>
+ <Shared>
+#include "depthpass.glsllib"
+
+uniform vec2 CameraClipRange;
+ </Shared>
+ <Shader name="DOWNSAMPALPHA">
+ <FragmentShader>
+void frag()
+{
+ // Simple averaging blur, but makes sure to include the alpha channel from the blur weights
+ // Only need to do this once to actually set the alphas in the blur buffers.
+ vec4 smp0 = textureOffset(Texture0, TexCoord.xy, ivec2(-1,-1));
+ vec4 smp1 = textureOffset(Texture0, TexCoord.xy, ivec2(0,-1));
+ vec4 smp2 = textureOffset(Texture0, TexCoord.xy, ivec2(-1,0));
+ vec4 smp3 = texture(Texture0, TexCoord.xy);
+
+ smp0.w *= textureOffset(DistBuffer, TexCoord.xy, ivec2(-1,-1)).w;
+ smp1.w *= textureOffset(DistBuffer, TexCoord.xy, ivec2(0,-1)).w;
+ smp2.w *= textureOffset(DistBuffer, TexCoord.xy, ivec2(-1,0)).w;
+ smp3.w *= texture(DistBuffer, TexCoord.xy).w;
+
+ gl_FragColor = 0.25 * (smp0 + smp1 + smp2 + smp3);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="DOWNSAMPLE">
+ <FragmentShader>
+void frag() // Simple averaging blur.
+{
+ vec4 smp0 = textureOffset(Texture0, TexCoord.xy, ivec2(-1,-1));
+ vec4 smp1 = textureOffset(Texture0, TexCoord.xy, ivec2(0,-1));
+ vec4 smp2 = textureOffset(Texture0, TexCoord.xy, ivec2(-1,0));
+ vec4 smp3 = texture(Texture0, TexCoord.xy);
+
+ gl_FragColor = 0.25 * (smp0 + smp1 + smp2 + smp3);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="FINDBLURAMT">
+ <FragmentShader>
+void frag()
+{
+ float planeDepth = SurfDist;
+
+ vec2 dvec = gl_FragCoord.xy - vec2(DimplePos);
+ float dimple = dot(dvec, dvec) / (DimpleSize * DimpleSize);
+ planeDepth += exp2(-dimple) * DimpleDepth;
+
+ vec4 depthSample = texture(DepthSampler, TexCoord);
+ float depthVal = getDepthValue( depthSample, CameraClipRange );
+ float rawDepth = depthValueToLinearDistance( depthVal, CameraClipRange );
+
+ if (DepthDebug)
+ {
+ gl_FragColor = vec4( (rawDepth - CameraClipRange.x) / (CameraClipRange.y - CameraClipRange.x) );
+ return;
+ }
+
+ float blurAmt = smoothstep(0.0, 1.0, (rawDepth - planeDepth) / BlurDist);
+ gl_FragColor = vec4(blurAmt, blurAmt, blurAmt, 1.0 - blurAmt);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLURX">
+ <FragmentShader>
+void frag()
+{
+ vec4 smp = texture(DistBuffer, TexCoord.xy);
+ float sigma = clamp(smp.x * MaxBlur * 0.25, 1.0, 25.0);
+ int smpCount = int(ceil( sigma ));
+ vec4 value = texture(BlurBuffer, TexCoord.xy);
+ float wtsum = 1.0;
+ for (int i = 1; i &lt;= smpCount; ++i)
+ {
+ // Base 2 Gaussian blur
+ float wt = float(i) / (sigma * 0.5);
+ wt = exp2( -wt*wt );
+ value += wt * textureOffset(BlurBuffer, TexCoord.xy, ivec2(-i,0));
+ value += wt * textureOffset(BlurBuffer, TexCoord.xy, ivec2(i,0));
+ wtsum += wt * 2.0;
+ }
+
+ gl_FragColor = value / wtsum;
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLURY">
+ <FragmentShader>
+void frag()
+{
+ vec4 smp = texture(DistBuffer, TexCoord.xy);
+
+ float sigma = clamp(smp.x * MaxBlur * 0.25, 1.0, 25.0);
+ int smpCount = int(ceil( sigma ));
+ vec4 value = texture(BlurBuffer, TexCoord.xy);
+ value.w *= smp.w;
+ float wtsum = 1.0;
+ for (int i = 1; i &lt;= smpCount; ++i)
+ {
+ // Base 2 Gaussian blur
+ float wt = float(i) / (sigma * 0.5);
+ wt = exp2( -wt*wt );
+ value += wt * textureOffset(BlurBuffer, TexCoord.xy, ivec2(0,-i));
+ value += wt * textureOffset(BlurBuffer, TexCoord.xy, ivec2(0,i));
+ wtsum += wt * 2.0;
+ }
+
+ gl_FragColor = value / wtsum;
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="COMBINE">
+ <FragmentShader>
+void frag()
+{
+ float blurFac = texture(DistBuffer, TexCoord.xy).x;
+ float lod = log2(MaxBlur * blurFac);
+ float fac0 = clamp(lod, 0.0, 1.0);
+ float fac1 = clamp(lod-1.0, 0.0, 1.0);
+
+ if (BlurDebug || DepthDebug)
+ {
+ gl_FragColor = vec4(blurFac);
+ return;
+ }
+
+ vec4 result = texture(SrcSampler, TexCoord.xy);
+ vec4 lvl1 = texture(HalfSampler, TexCoord.xy);
+ vec4 fullBlr = texture(BlurBuffer, TexCoord.xy);
+
+ // Basically this says that if the blur factor is really small (less than 2 pixels)
+ // we favor the full resolution. If it's between 2 and 4 pixels, we favor the half-res
+ // version (which is like one mip level down)... anything beyond that, we use the bottom
+ // level which actually has the proper local blur.
+ result = mix(mix(result, lvl1, fac0), fullBlr, fac1);
+
+ // Transform the texture (assuming rotation about the center of the texture)
+ float cosX = cos(OverlayRot * 0.01745329251);
+ float sinX = sin(OverlayRot * 0.01745329251);
+ mat3x3 texMat = mat3x3( 1.0, 0.0, -0.5, 0.0, 1.0, -0.5, 0.0, 0.0, 1.0 );
+ texMat *= mat3x3( cosX, -sinX, 0.0, sinX, cosX, 0.0, 0.0, 0.0, 1.0);
+ texMat *= mat3x3( 1.0, 0.0, 0.5, 0.0, 1.0, 0.5, 0.0, 0.0, 1.0 );
+ texMat *= mat3x3( OverlayScale.x, 0.0, 0.0, 0.0, OverlayScale.y, 0.0, 0.0, 0.0, 1.0);
+ vec3 texForm = texMat * vec3(TexCoord.xy, 1.0);
+ vec4 overSmp = texture(OverlayDif, texForm.xy);
+ float overTrn = 1.0 - texture(OverlayTrn, texForm.xy).x;
+ float nDotL = (texture(OverlayNrm, texForm.xy).z - 0.5) * 2.0;
+
+ // Want to see how much of a "difference" there is between the light
+ // color and the object color.
+ // We are basically acting as if the objects on the layer are occluders
+ // so the alpha as a result of blurring is like a transparency.
+ // The behavior is that the brighter the light is, the more of a "gap" there is
+ vec3 backlight = LightCol.rgb * LightBrt;
+
+ // Assume that the color map I'm using already tells us what N.dot.L is (for now)
+ float translucency = exp2( -overTrn * OverlayTrans );
+
+// vec3 colorDelta = backlight - result.rgb;
+// float deltaC = dot(colorDelta, colorDelta) * (1.0 - result.w) * LightBrt / LightExp;
+// result.rgb -= result.rgb * smoothstep(deltaC, 1.0, result.w);
+
+// gl_FragColor = vec4( result.rgb, 1.0 );
+// return;
+
+ backlight *= mix(vec3(1.0), result.rgb, result.w);
+ backlight *= nDotL * translucency * overSmp.rgb;
+
+ backlight = vec3(1.0) - exp2(-6.28*backlight/LightExp);
+
+ gl_FragColor = vec4(backlight, 1.0);
+}
+ </FragmentShader>
+ </Shader>
+</Shaders>
+<Passes>
+ <Buffer name="halfBuffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".5" lifetime="frame"/>
+ <Buffer name="qtrBuffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".25" lifetime="frame"/>
+ <Buffer name="tempqtr" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".25" lifetime="frame"/>
+ <Buffer name="blurweights" type="ubyte" format="rgba" filter="linear" wrap="clamp" size="1" lifetime="frame"/>
+ <Pass shader="FINDBLURAMT" output="blurweights">
+ <DepthInput param="DepthSampler"/>
+ </Pass>
+ <Pass shader="DOWNSAMPALPHA" input="[source]" output="halfBuffer">
+ <BufferInput param="DistBuffer" value="blurweights" />
+ </Pass>
+ <Pass shader="DOWNSAMPLE" input="halfBuffer" output="qtrBuffer"/>
+ <Pass shader="BLURX" output="tempqtr">
+ <BufferInput param="BlurBuffer" value="qtrBuffer" />
+ <BufferInput param="DistBuffer" value="blurweights" />
+ </Pass>
+ <Pass shader="BLURY" output="qtrBuffer">
+ <BufferInput param="BlurBuffer" value="tempqtr" />
+ <BufferInput param="DistBuffer" value="blurweights" />
+ </Pass>
+ <Pass shader="COMBINE">
+ <BufferInput param="SrcSampler" value="[source]" />
+ <BufferInput param="HalfSampler" value="halfBuffer" />
+ <BufferInput param="BlurBuffer" value="qtrBuffer" />
+ <BufferInput param="DistBuffer" value="blurweights" />
+ </Pass>
+</Passes>
+</Effect>
diff --git a/Studio/Content/Effect Library/Motion Blur.effect b/Studio/Content/Effect Library/Motion Blur.effect
new file mode 100644
index 0000000..6d8d4cf
--- /dev/null
+++ b/Studio/Content/Effect Library/Motion Blur.effect
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Create an apparent streaking for rapidly moving objects in the layer.-->
+ <Property name="fadeAmount" formalName="Fade Amount" min="0" max="1" default=".05" description="0 = object trails persist\n1.0 = object trails fade out\nimmediately (no trail)" />
+ <Property name="GlowSampler" type="Texture" filter="nearest" clamp="clamp" />
+ <Property name="Sprite" type="Texture" filter="nearest" clamp="clamp" />
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+ </Shared>
+
+ <Shader name="HBLUR">
+ <VertexShader>
+void vert()
+{
+ SetupHorizontalGaussianBlur3Tap( Texture0Info.x, 1.0, TexCoord );
+}
+ </VertexShader>
+ <FragmentShader>
+void frag()
+{
+ vec4 src = texture2D_0(TexCoord);
+
+ float Trailfade = 1.0 - fadeAmount;
+ vec4 OutCol = GaussianBlur3TapPremultiplied( GlowSampler ) * Trailfade;
+
+ // change the color so that it looks different. saturate it a bit.
+ float srcSum = dot(vec3(1.0), src.rgb);
+ src.rgb = src.rgb * 0.7 + vec3(srcSum,srcSum,srcSum) * 0.3;
+ gl_FragColor.rgb = (1.0 - src.a) * OutCol.rgb + src.rgb;
+ gl_FragColor.a = src.a + OutCol.a;
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="VBLUR">
+ <VertexShader>
+void vert()
+{
+ SetupVerticalGaussianBlur3Tap( Texture0Info.y, 1.0, TexCoord );
+}
+ </VertexShader>
+ <FragmentShader>
+void frag() // PS_Blur_Vertical
+{
+ vec4 OutCol = GaussianBlur3TapPremultiplied( Texture0 );
+ gl_FragColor = OutCol;
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLEND">
+ <FragmentShader>
+void frag()
+{
+ vec4 src = texture2D_0(TexCoord);
+ vec4 dst = texture2D_Sprite(TexCoord);
+
+ colorOutput(src * (1.0-dst.a) + dst);
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="glow_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".25" lifetime="scene"/>
+ <Buffer name="temp_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".25" lifetime="frame"/>
+
+ <Pass name="1" shader="HBLUR" input="[source]" output="temp_buffer">
+ <BufferInput param="GlowSampler" value="glow_buffer"/>
+ </Pass>
+ <Pass name="2" shader="VBLUR" input="temp_buffer" output="glow_buffer"/>
+ <Pass name="pass3_Composite" shader="BLEND" input="glow_buffer">
+ <BufferInput param="Sprite" value="[source]"/>
+ </Pass>
+ </Passes>
+</Effect>
diff --git a/Studio/Content/Effect Library/SCurveTonemap.effect b/Studio/Content/Effect Library/SCurveTonemap.effect
new file mode 100644
index 0000000..fc0259b
--- /dev/null
+++ b/Studio/Content/Effect Library/SCurveTonemap.effect
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="Shoulder" formalName="Shoulder Slope" type="Float" default="1" min="0" max="3"/>
+ <Property name="ShoulderWt" formalName="Shoulder Emphasis" type="Float" default="0" min="-1" max="1"/>
+ <Property name="Toe" formalName="Toe Slope" type="Float" default="1" min="0" max="3"/>
+ <Property name="ToeWt" formalName="Toe Emphasis" type="Float" default="0" min="-1" max="1"/>
+ <Property name="Contrast" formalName="Contrast Boost" type="Float" default="0" min="-1" max="2"/>
+ <Property name="Saturation" formalName="Saturation Level" type="Float" default="1" min="0" max="2"/>
+ <Property name="GammaValue" formalName="Gamma" type="Float" default="2.2" min="0.1" max="8"/>
+ <Property name="UseExposure" formalName="Use Exposure" type="Boolean" default="False"/>
+ <Property name="WhiteVal" formalName="White Point" type="Float" default="1.0" min="0.01" max="128.0">
+ <ShowIfEqual property="UseExposure" value="False"/>
+ </Property>
+ <Property name="ExposeVal" formalName="Exposure Value" type="Float" default="1.0" min="0.01" max="16.0">
+ <ShowIfEqual property="UseExposure" value="True"/>
+ </Property>
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "luminance.glsllib"
+
+float remapLum( float inLum, float whitePt )
+{
+ return clamp( inLum / whitePt, 0.0, 1.0 );
+}
+
+float exposeLum( float inLum, float exposure )
+{
+ return 1.0 - exp2( -inLum / exposure );
+}
+
+vec3 gammaCorrect( vec3 inColor, float gammaExp )
+{
+ return pow( inColor, vec3( 1.0 / gammaExp ) );
+}
+
+vec3 adjSaturation( vec3 inRGB, float satFactor )
+{
+ // Must be done in linear space (before gamma correction)
+ float P = sqrt( luminance( inRGB * inRGB ) );
+ vec3 outCol;
+ outCol = (inRGB - vec3(P)) * satFactor;
+ outCol += vec3(P);
+ return outCol;
+}
+
+ </Shared>
+<Shader name="TONEMAP">
+<FragmentShader>
+float curveCompute( float inLum, float slope0, float slope1 )
+{
+ float a1 = slope0;
+ float a2 = 3.0 - 2.0 * slope0 - slope1;
+ float a3 = slope1 + slope0 - 2.0;
+
+ // Cubic curve fit. This results in a curve that is 0 where inColor is 0
+ // equals 1 when inColor is 1, and the derivative at 0 is slope0 and the
+ // derivative at 1 is slope1
+ return ((((a3 * inLum) + a2)*inLum) + a1)*inLum;
+}
+
+float toeEmphasize( float inParam )
+{
+ float a1 = 1.0 - ToeWt;
+ float a2 = 2.0 * ToeWt;
+ float a3 = -ToeWt;
+
+ return ((((a3 * inParam) + a2) * inParam) + a1) * inParam;
+}
+
+float shoulderEmphasize( float inParam )
+{
+ float a1 = 1.0;
+ float a2 = ShoulderWt;
+ float a3 = -ShoulderWt;
+
+ return ((((a3 * inParam) + a2) * inParam) + a1) * inParam;
+}
+
+void frag()
+{
+ // k = shadow slope, m = midtone slope, n = highlight slope
+ float k = Toe;
+ float m = 1.0 + Contrast;
+ float n = Shoulder;
+
+ //vec4 sourceColor = texture(SourceSampler, TexCoord);
+ vec4 sourceColor = texture(Texture0, TexCoord);
+ vec3 sourceSep = RGBToYPbPr(sourceColor.rgb);
+
+ float lum = sourceSep.r;
+
+ if (UseExposure)
+ lum = exposeLum( lum, ExposeVal );
+ else
+ lum = remapLum( lum, WhiteVal );
+
+ float param0 = toeEmphasize( 2.0 * lum ); // Parametrization for Curve Part 1
+ float param1 = shoulderEmphasize( 2.0 * lum - 1.0 ); // Parametrization for Curve Part 2
+
+ float lum0 = 0.5 * curveCompute( param0, k, m );
+ float lum1 = 0.5 * curveCompute( param1, m, n ) + 0.5;
+ sourceSep.r = (lum > 0.5) ? lum1 : lum0;
+
+ // Convert back to RGB and gamma correct
+ vec3 finalColor = YPbPrToRGB( sourceSep );
+ finalColor = gammaCorrect( adjSaturation( finalColor, Saturation ), GammaValue );
+ gl_FragColor = vec4( finalColor, sourceColor.a );
+}
+</FragmentShader>
+</Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="TONEMAP" input="[source]" />
+ </Passes>
+</Effect> \ No newline at end of file
diff --git a/Studio/Content/Effect Library/SMAA1X.effect b/Studio/Content/Effect Library/SMAA1X.effect
new file mode 100644
index 0000000..66ee8f6
--- /dev/null
+++ b/Studio/Content/Effect Library/SMAA1X.effect
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="searchTex" filter="nearest" clamp="clamp" type="Texture" default="./maps/effects/SearchTex-yflipped.png" hidden="True"/>
+ <Property name="areaTex" filter="linear" clamp="clamp" type="Texture" default="./maps/effects/AreaTex-yflipped.png" hidden="True"/>
+ <Property name="blendTex" filter="linear" clamp="clamp" type="Texture" hidden="True"/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+vec2 pixelIncrements;
+#define SMAA_PIXEL_SIZE pixelIncrements
+#define SMAA_HLSL_3 0
+#define SMAA_HLSL_4 0
+#define SMAA_HLSL_4_1 0
+#define SMAA_GLSL_3 1
+#define SMAA_GLSL_4 0
+#define SMAA_PRESET_LOW 0
+#define SMAA_PRESET_MEDIUM 0
+#define SMAA_PRESET_HIGH 1
+#define SMAA_PRESET_ULTRA 0
+#define SMAA_PRESET_CUSTOM 0
+ vec2 pixelSizes;
+ </Shared>
+ <Shader name="EdgeDetect">
+ <VertexShader>
+#define SMAA_ONLY_COMPILE_VS 1
+#include "SMAA.glsllib"
+
+out float4 svPosition;
+out float4 offset[3];
+
+void vert ()
+{
+ pixelIncrements = vec2( 1.0 / Texture0Info.x, 1.0 / Texture0Info.y );
+ float4 tempOffset[3];
+ float4 tempPos;
+ SMAAEdgeDetectionVS(gl_Position, tempPos, TexCoord, tempOffset);
+
+ offset[0] = tempOffset[0];
+ offset[1] = tempOffset[1];
+ offset[2] = tempOffset[2];
+ svPosition = tempPos;
+}
+ </VertexShader>
+ <FragmentShader>
+#define SMAA_ONLY_COMPILE_PS 1
+#include "SMAA.glsllib"
+
+in float4 svPosition;
+in float4 offset[3];
+
+
+void frag()
+{
+ pixelIncrements = vec2( 1.0 / Texture0Info.x, 1.0 / Texture0Info.y );
+ gl_FragColor = SMAALumaEdgeDetectionPS(TexCoord, offset, Texture0);
+}
+ </FragmentShader>
+ </Shader>
+
+ <Shader name="BlendingWeightCalculation">
+
+ <VertexShader>
+#define SMAA_ONLY_COMPILE_VS 1
+#include "SMAA.glsllib"
+out float4 svPosition;
+out float4 offset[3];
+out float2 pixcoord;
+void vert()
+{
+ pixelIncrements = vec2( 1.0 / Texture0Info.x, 1.0 / Texture0Info.y );
+ float4 tempOffset[3];
+ float4 tempPos;
+ float2 tempPixCoord;
+ SMAABlendingWeightCalculationVS(gl_Position, tempPos, TexCoord, tempPixCoord, tempOffset);
+
+
+ offset[0] = tempOffset[0];
+ offset[1] = tempOffset[1];
+ offset[2] = tempOffset[2];
+ svPosition = tempPos;
+ pixcoord = tempPixCoord;
+}
+ </VertexShader>
+ <FragmentShader>
+#define SMAA_ONLY_COMPILE_PS 1
+#include "SMAA.glsllib"
+in float4 svPosition;
+in float4 offset[3];
+in float2 pixcoord;
+//Required for temporal
+int4 subsampleIndices;
+
+void frag()
+{
+ pixelIncrements = vec2( 1.0 / Texture0Info.x, 1.0 / Texture0Info.y );
+ gl_FragColor = SMAABlendingWeightCalculationPS(TexCoord, pixcoord, offset, Texture0, areaTex, searchTex, subsampleIndices);
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="NeighborhoodBlending">
+ <VertexShader>
+#define SMAA_ONLY_COMPILE_VS 1
+#include "SMAA.glsllib"
+
+out float4 svPosition;
+out float4 offset[2];
+
+void vert ()
+{
+ pixelIncrements = vec2( 1.0 / Texture0Info.x, 1.0 / Texture0Info.y );
+ float4 tempOffset[2];
+ float4 tempPos;
+ SMAANeighborhoodBlendingVS(gl_Position, tempPos, TexCoord, tempOffset);
+ offset[0] = tempOffset[0];
+ offset[1] = tempOffset[1];
+ svPosition = tempPos;
+}
+ </VertexShader>
+ <FragmentShader>
+#define SMAA_ONLY_COMPILE_PS 1
+#include "SMAA.glsllib"
+
+in float4 svPosition;
+in float4 offset[2];
+void frag()
+{
+ pixelIncrements = vec2( 1.0 / Texture0Info.x, 1.0 / Texture0Info.y );
+ gl_FragColor = SMAANeighborhoodBlendingPS(TexCoord, offset, Texture0, blendTex);
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="edges_buffer" type="ubyte" format="rg" filter="linear" wrap="clamp" lifetime="scene"/>
+ <Buffer name="blend_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" lifetime="scene"/>
+ <Buffer name="stencil_buffer" format='depth24stencil8' lifetime="frame" />
+ <Pass shader="EdgeDetect" input='[source]' output='edges_buffer'>
+ <DepthStencil buffer='stencil_buffer' flags='clear-stencil' stencil-fail='replace' depth-fail='replace' depth-pass='replace' stencil-function='always' reference='1'/>
+ </Pass>
+ <Pass shader="BlendingWeightCalculation" input='edges_buffer' output='blend_buffer' >
+ <DepthStencil buffer='stencil_buffer' stencil-fail='keep' depth-fail='keep' depth-pass='keep' stencil-function='equal' reference='1'/>
+ </Pass>
+ <Pass shader='NeighborhoodBlending' input='[source]' >
+ <BufferInput param='blendTex' value="blend_buffer"/>
+ </Pass>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/Screen Space AO.effect b/Studio/Content/Effect Library/Screen Space AO.effect
new file mode 100644
index 0000000..84da723
--- /dev/null
+++ b/Studio/Content/Effect Library/Screen Space AO.effect
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="FilterSize" formalName="Filter Size" description="Range to shoot samples for conversion" default="4"/>
+ <Property name="DistScale" formalName="Distance Scale" description="Divisor for distances during filtering;\nlarger equals more subtle" default="8"/>
+ <Property name="DistBias" formalName="Distance Bias" description="Depth bias to prevent self-shadowing artifacts" default="1"/>
+ <Property name="DebugView" formalName="Debug SSAO effect" type="Boolean" description="Allows you to see the effect of\nthe filter directly to help setup\nparameters" default="False"/>
+ <Property name="DepthSampler" type="Texture" filter="nearest" clamp="clamp"/>
+ <Property name="SourceSampler" type="Texture" filter="linear" clamp="clamp"/>
+ </MetaData>
+
+ <Shaders>
+
+ <Shader name="SSAO">
+ <FragmentShader>
+#include "depthpass.glsllib"
+uniform vec2 CameraClipRange;
+
+void frag( void )
+{
+ float ret = 16.0;
+
+ vec3 kernel[16];
+
+ // Not particularly random set of samples, I know, which means some risk
+ // of artifacts due to regularity.
+ kernel[0] = vec3(0.355512, -0.709318, -0.102371);
+ kernel[1] = vec3(0.534186, 0.71511, -0.115167);
+ kernel[2] = vec3(-0.87866, 0.157139, -0.115167);
+ kernel[3] = vec3(0.140679, -0.475516, -0.0639818);
+ kernel[4] = vec3(-0.0796121, 0.158842, -0.677075);
+ kernel[5] = vec3(-0.0759516, -0.101676, -0.483625);
+ kernel[6] = vec3(0.12493, -0.0223423, -0.483625);
+ kernel[7] = vec3(-0.0720074, 0.243395, -0.967251);
+ kernel[8] = vec3(-0.207641, 0.414286, 0.187755);
+ kernel[9] = vec3(-0.277332, -0.371262, 0.187755);
+ kernel[10] = vec3(0.63864, -0.114214, 0.262857);
+ kernel[11] = vec3(-0.184051, 0.622119, 0.262857);
+ kernel[12] = vec3(0.110007, -0.219486, 0.435574);
+ kernel[13] = vec3(0.235085, 0.314707, 0.696918);
+ kernel[14] = vec3(-0.290012, 0.0518654, 0.522688);
+ kernel[15] = vec3(0.0975089, -0.329594, 0.609803);
+
+ ivec2 iCoords = ivec2( gl_FragCoord.xy + vec2(0.5, 0.5) );
+ float depth = getDepthValue(texelFetch(DepthSampler, iCoords, 0), CameraClipRange);
+ depth = depthValueToLinearDistance( depth, CameraClipRange );
+
+ for( int i = 15; i >= 0; --i )
+ {
+ // Note -- this cheap 2D trick is partially correct, but what we really need is to
+ // get the actual position, shoot the ray in 3d and re-project to get the actual
+ // 3D distance between points.
+ vec3 ray = kernel[i] * FilterSize;
+ ivec2 newSamp = ivec2( iCoords + ray.xy );
+ float sampleDepth = getDepthValue( texelFetch(DepthSampler, newSamp, 0), CameraClipRange );
+ sampleDepth = depthValueToLinearDistance( sampleDepth, CameraClipRange );
+
+ // Occlusion is applied based on a Cauchy distribution filter
+ float occlDist = max(sampleDepth - depth - DistBias, 0.0) / DistScale;
+
+ // This gives us an occlusion based on distance where the closest stuff
+ // occludes the most, but the extra little subtraction of a yet tighter
+ // Cauchy lobe means that we avoid the super-close stuff in order to limit
+ // self occlusion. The 1.5 multiplier is to assure that the maximum possible
+ // effect of a given sample is 1.0 exactly.
+ float occlFactor = 1.0 / ( 1.0 + occlDist*occlDist*0.04 );
+ occlFactor -= 1.0 / ( 1.0 + occlDist*occlDist );
+ ret -= 1.5 * occlFactor;
+
+ }
+ ret /= 16.0;
+
+ vec4 backColor = texture2D_SourceSampler(TexCoord);
+ if (DebugView)
+ {
+ backColor = vec4( 1.0 );
+ }
+
+ gl_FragColor = vec4( ret,ret,ret, 1.0 ) * backColor;
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="SSAO">
+ <BufferInput value="[source]" param="SourceSampler" />
+ <DepthInput param="DepthSampler" />
+ </Pass>
+ </Passes>
+</Effect>
diff --git a/Studio/Content/Effect Library/Sepia.effect b/Studio/Content/Effect Library/Sepia.effect
new file mode 100644
index 0000000..3129e33
--- /dev/null
+++ b/Studio/Content/Effect Library/Sepia.effect
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <!--Name of the effect is implicitly the file stem with extension -->
+ <!--Metadata stands for properties, events, and handlers and has the same format as the viewer's metadata file
+ and the data inserted at the top of lua files-->
+ <MetaData>
+ <!--Properties are automatically translated into the effect format when we generate the effect's GLSL file -->
+ <!--Colorizes the image to a faded brown color, simulating old film coloration.-->
+ <Property name="amount" formalName="Amount" min="0" max="1" default="1" description="0 = no change to image\n1 = full sepia effect" />
+ </MetaData>
+ <!-- default shader doesn't need to be named-->
+ <Shaders>
+ <!-- an implicit #include "effect.glsllib" is done at the top of all the produced shader files -->
+ <!-- Shared sections are pasted at the top of the files after the uniform declarations. Here you put your
+ varying declarations as well as functions that all the shaders need to use-->
+ <!--Sepia doesn't share anything so all of the shared sections could be omitted and you would get the same
+ code-->
+ <Shared></Shared>
+ <!--Shared data that you want all vertex shaders to see -->
+ <VertexShaderShared></VertexShaderShared>
+ <!--Shared data that you all fragment shaders to see -->
+ <FragmentShaderShared></FragmentShaderShared>
+ <!-- shaders can have names. No name means the shader gets its integer index as its name-->
+ <Shader name="main">
+ <!-- Shaders can also have Shared sections that are shared between the vertex and fragment shaders
+ of only precisely this shader-->
+ <!--no vertex shader or empty vertex shader means just output a vert(){} for the vertex shader-->
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+void frag()
+{
+ mat3 sepiaMat = mat3(0.0);
+
+ sepiaMat[0][0] = 0.393;
+ sepiaMat[1][0] = 0.769;
+ sepiaMat[2][0] = 0.189;
+
+ sepiaMat[0][1] = 0.349;
+ sepiaMat[1][1] = 0.686;
+ sepiaMat[2][1] = 0.168;
+
+ sepiaMat[0][2] = 0.272;
+ sepiaMat[1][2] = 0.534;
+ sepiaMat[2][2] = 0.131;
+
+ vec4 origColor = texture2D_0(TexCoord);
+ vec3 sepiaColor = sepiaMat*origColor.rgb;
+ sepiaColor = clamp( sepiaColor.rgb, 0.0, origColor.a );
+
+ colorOutput(vec4(mix( origColor.rgb, sepiaColor, amount ), origColor.a));
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <!-- if there is only one shader then we can assume there is only one pass and we can go from there -->
+ <!-- for this example, however, I am demonstrating the pass xml elements-->
+ <Passes>
+ <!-- single pass, input is the special source name and output is the special destination name which is assumed
+ for the last pass -->
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/Stylize - Scatter.effect b/Studio/Content/Effect Library/Stylize - Scatter.effect
new file mode 100644
index 0000000..7bd30b5
--- /dev/null
+++ b/Studio/Content/Effect Library/Stylize - Scatter.effect
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <!--Scatters the pixels in a layer, creating a blurry or smeared appearance. Without changing the color of each individual pixel, the Scatter effect redistributes the pixels randomly, but in the same general area as their original positions.-->
+ <Property name="NoiseSamp" formalName="Noise" filter="linear" clamp="repeat" type="Texture" default="./maps/effects/brushnoise.png" hidden="True"/>
+ <Property name="Amount" formalName="Scatter Amount" min="0" max="127" default="20.0" description="Determines how much to scatter."/>
+ <Property name="dir" formalName="Grain" list="Both:Horizontal:Vertical" default="Both" description="The direction in which to scatter the\npixels, horizontally or vertically.\nSelect Both to scatter pixels in all directions."/>
+ <Property name="isRand" formalName="Randomize Every Frame" type="Boolean" default="False" description="Specifies whether scattering changes at\neach frame. To animate scattering without\nkeyframes, select the Randomize Every Frame\noption."/>
+ </MetaData>
+ <Shaders>
+ <Shader>
+ <FragmentShader>
+uniform float AppFrame; // frame number since app starts
+void frag (void)
+{
+ float size = 15.0;
+ float amount = Amount / 127.0 * 0.4;
+
+ vec2 uv = TexCoord * size;
+ if (isRand)
+ uv = fract(uv + 0.031 * AppFrame);
+
+ uv = texture2D_NoiseSamp(fract(uv)).xy - 0.5;
+
+ if (dir == 0) { // both directions
+ uv *= (vec2(1.5, 0.15) * amount);
+
+ } else if (dir == 1) { // x direction
+ uv *= (vec2(1.3, 0.0) * amount);
+
+ } else { // y direction
+ uv *= (vec2(0.0, 0.29) * amount);
+ }
+
+ uv += TexCoord;
+
+ // shift half of a pixel size of the source to avoid the artifact on upper right borders.
+ // FBO size is bigger than the sprite, so clamping to [0, 1] will introduce artifacts
+ // (when OpenGL glTexParameter is set to linear). Lets not rely on OpenGL to clamp. we
+ // do it here.
+ vec2 halfPixelSize = 0.5 / Texture0Info.xy;
+ colorOutput(texture2D_0(clamp(uv, halfPixelSize, 1.0-halfPixelSize)));
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+</Effect>
diff --git a/Studio/Content/Effect Library/Tilt Shift.effect b/Studio/Content/Effect Library/Tilt Shift.effect
new file mode 100644
index 0000000..ddd9f60
--- /dev/null
+++ b/Studio/Content/Effect Library/Tilt Shift.effect
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="FocusPos" formalName="Focus Position" description="Height of the focus bar in\nnormalized coordinates" min="0" max="1" default=".5"/>
+ <Property name="FocusWidth" formalName="Focus Width" description="Objects within this range of Focus Distance\nwill be in focus" min="0" max="1" default=".2"/>
+ <Property name="BlurDebug" formalName="Debug Rendering" type="Boolean" description="Allows you to see exactly how the Focus\nvariables work. Black objects are in\nfocus, white are blurred" default="False"/>
+ <Property name="BlurAmount" formalName="Blur Amount" description="Increase the amount of blur. Amounts\nabove 4 may cause artifacts" min="0" max="10" default="4" />
+ <Property name="SourceSampler" type="Texture" filter="linear" clamp="clamp"/>
+ <Property name="VerticalEffect" formalName="Vertical" type='Boolean' description="Makes the effect work vertically\ninstead of horizontally" default="False"/>
+ <Property name="InvertBlur" formalName="Invert Blur" type="Boolean" description="Inverts the blur area so the center\nis blurred vs. the outer" default="False"/>
+ </MetaData>
+ <Shaders>
+ <Shared>
+#include "blur.glsllib"
+
+float AdvancedGetTiltShiftMultiplier(vec2 inTexCoord, float inFocusBarHeight, float inFocusWidth, bool inVertical, bool inInvert )
+{
+ //For now, you can't rotate the focus blur but in time you will be able to.
+ float texPos = inVertical ? inTexCoord.x : inTexCoord.y;
+ float focusDiff = max( 0.0, abs( texPos - inFocusBarHeight ) - (inFocusWidth/2.0) ) / inFocusWidth;
+ float retval = clamp( focusDiff, 0.0, 1.0 );
+ return inInvert ? 1.0 - retval : retval;
+}
+
+ </Shared>
+ <Shader name="DOWNSAMPLE">
+ <VertexShader>
+void vert()
+{
+ SetupBoxBlurCoords(vec2(Texture0Info.xy));
+}
+ </VertexShader>
+ <FragmentShader>
+
+vec4 AdvancedBoxTiltShiftBlur( sampler2D inBlurSampler, float inBlurSamplerAlphaFlag
+ , float inFocusBarHeight, float inFocusWidth
+ , bool inVertical, bool inInvert )
+{
+ float mult0 = .25 * AdvancedGetTiltShiftMultiplier( TexCoord0, inFocusBarHeight, inFocusWidth, inVertical, inInvert );
+ float mult1 = .25 * AdvancedGetTiltShiftMultiplier( TexCoord1, inFocusBarHeight, inFocusWidth, inVertical, inInvert );
+ float mult2 = .25 * AdvancedGetTiltShiftMultiplier( TexCoord2, inFocusBarHeight, inFocusWidth, inVertical, inInvert );
+ float mult3 = .25 * AdvancedGetTiltShiftMultiplier( TexCoord3, inFocusBarHeight, inFocusWidth, inVertical, inInvert );
+ float multTotal = mult0 + mult1 + mult2 + mult3;
+ float totalDivisor = multTotal != 0.0 ? 1.0 / multTotal : 0.0;
+ vec4 OutCol = GetTextureValuePreMult(inBlurSampler, TexCoord0) * mult0;
+ OutCol += GetTextureValuePreMult(inBlurSampler, TexCoord1) * mult1;
+ OutCol += GetTextureValuePreMult(inBlurSampler, TexCoord2) * mult2;
+ OutCol += GetTextureValuePreMult(inBlurSampler, TexCoord3) * mult3;
+ return OutCol * totalDivisor;
+}
+void frag() // Simple averaging box blur.
+{
+ gl_FragColor = AdvancedBoxTiltShiftBlur(Texture0, Texture0Info.z, FocusPos, FocusWidth, VerticalEffect, InvertBlur );
+}
+ </FragmentShader>
+ </Shader>
+ <Shader name="BLUR">
+ <VertexShader>
+
+void vert()
+{
+ SetupPoissonBlurCoords( BlurAmount, DestSize.xy );
+}
+
+ </VertexShader>
+ <FragmentShader>
+
+vec4 AdvancedPoissonTiltShiftBlur(sampler2D inSampler, float inAlphaFlag, float inBarHeight, float inFocusWidth, bool inVertical, bool inInvert )
+{
+ float mult0 = (1.0 - poisson0.z) * AdvancedGetTiltShiftMultiplier( TexCoord0, inBarHeight, inFocusWidth, inVertical, inInvert );
+ float mult1 = (1.0 - poisson1.z) * AdvancedGetTiltShiftMultiplier( TexCoord1, inBarHeight, inFocusWidth, inVertical, inInvert );
+ float mult2 = (1.0 - poisson2.z) * AdvancedGetTiltShiftMultiplier( TexCoord2, inBarHeight, inFocusWidth, inVertical, inInvert );
+ float mult3 = (1.0 - poisson3.z) * AdvancedGetTiltShiftMultiplier( TexCoord3, inBarHeight, inFocusWidth, inVertical, inInvert );
+ float mult4 = (1.0 - poisson4.z) * AdvancedGetTiltShiftMultiplier( TexCoord4, inBarHeight, inFocusWidth, inVertical, inInvert );
+
+ float multTotal = mult0 + mult1 + mult2 + mult3 + mult4;
+ float multMultiplier = multTotal > 0.0 ? 1.0 / multTotal : 0.0;
+
+ vec4 outColor = GetTextureValuePreMult( inSampler, TexCoord0 ) * (mult0 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord1 ) * (mult1 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord2 ) * (mult2 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord3 ) * (mult3 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord4 ) * (mult4 * multMultiplier);
+ return outColor;
+}
+
+void frag() // Mix the input blur and the depth texture with the sprite
+{
+ float centerMultiplier = AdvancedGetTiltShiftMultiplier( TexCoord, FocusPos, FocusWidth, VerticalEffect, InvertBlur );
+ if ( BlurDebug )
+ {
+ gl_FragColor = vec4( centerMultiplier,centerMultiplier,centerMultiplier, 1.0 );
+ }
+ else
+ {
+ vec4 blurColor = AdvancedPoissonTiltShiftBlur(Texture0, Texture0Info.z, FocusPos, FocusWidth, VerticalEffect, InvertBlur );
+ gl_FragColor = mix( texture2D_SourceSampler(TexCoord), blurColor, centerMultiplier );
+ }
+}
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Buffer name="downsample_buffer" type="ubyte" format="rgba" filter="linear" wrap="clamp" size=".5" lifetime="frame"/>
+ <Pass shader="DOWNSAMPLE" input="[source]" output="downsample_buffer"/>
+ <Pass shader="BLUR" input="downsample_buffer">
+ <BufferInput value="[source]" param="SourceSampler" />
+ </Pass>
+ </Passes>
+</Effect>
+
diff --git a/Studio/Content/Effect Library/VignetteEffect.effect b/Studio/Content/Effect Library/VignetteEffect.effect
new file mode 100644
index 0000000..7fbf7db
--- /dev/null
+++ b/Studio/Content/Effect Library/VignetteEffect.effect
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Effect>
+ <MetaData>
+ <Property name="vig_color" formalName="Vignet Color" type="Color" default="0.5 0.5 0.5" description="The color to use for the Vignetting."/>
+ <Property name="vig_strength" formalName="Strength" min="0" max="15" default="15.0" description="Strength of Vignetting."/>
+ <Property name="vig_radius" formalName="Radius" min="0" max="5" default="0.35" description="Size of Vignetting."/>
+ </MetaData>
+ <Shaders>
+ <Shared></Shared>
+ <VertexShaderShared></VertexShaderShared>
+ <FragmentShaderShared></FragmentShaderShared>
+ <Shader name="main">
+ <VertexShader></VertexShader>
+ <FragmentShader><![CDATA[
+
+void frag()
+{
+ vec4 origColor = texture2D_0(TexCoord);
+ vec2 uv = TexCoord.xy;
+ vec2 center = vec2(0.5);
+
+ vec4 bg = origColor;
+
+ uv *= 1.0 - uv.yx;
+ float vig = uv.x * uv.y * vig_strength;
+ vig = pow(vig, vig_radius);
+
+ vec4 vigColor = vec4(vig_color.rgb, vig) * vig;
+ gl_FragColor = mix(origColor, vigColor, 1.0 - vig);
+}
+ ]]></FragmentShader>
+ </Shader>
+ </Shaders>
+ <Passes>
+ <Pass shader="main" input="[source]" output="[dest]"/>
+ </Passes>
+</Effect>
+
+
diff --git a/Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.dds b/Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.dds
new file mode 100644
index 0000000..2f248cb
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.dds
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.png b/Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.png
new file mode 100644
index 0000000..1d20d45
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/AreaTex-yflipped.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/CircleBokeh.png b/Studio/Content/Effect Library/maps/effects/CircleBokeh.png
new file mode 100644
index 0000000..c7da55e
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/CircleBokeh.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/HexagonalBokeh.png b/Studio/Content/Effect Library/maps/effects/HexagonalBokeh.png
new file mode 100644
index 0000000..5a2a7e6
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/HexagonalBokeh.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/SearchTex-yflipped.png b/Studio/Content/Effect Library/maps/effects/SearchTex-yflipped.png
new file mode 100644
index 0000000..b2f664c
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/SearchTex-yflipped.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/brushnoise.dds b/Studio/Content/Effect Library/maps/effects/brushnoise.dds
new file mode 100644
index 0000000..4fdc704
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/brushnoise.dds
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/brushnoise.png b/Studio/Content/Effect Library/maps/effects/brushnoise.png
new file mode 100644
index 0000000..43e2034
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/brushnoise.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/noise.dds b/Studio/Content/Effect Library/maps/effects/noise.dds
new file mode 100644
index 0000000..fdb5f20
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/noise.dds
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/noise.png b/Studio/Content/Effect Library/maps/effects/noise.png
new file mode 100644
index 0000000..69dd166
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/noise.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/noise3.dds b/Studio/Content/Effect Library/maps/effects/noise3.dds
new file mode 100644
index 0000000..31156b5
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/noise3.dds
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/noise3.png b/Studio/Content/Effect Library/maps/effects/noise3.png
new file mode 100644
index 0000000..f4857de
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/noise3.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/noiseUniform.dds b/Studio/Content/Effect Library/maps/effects/noiseUniform.dds
new file mode 100644
index 0000000..760ed6c
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/noiseUniform.dds
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/noiseUniform.png b/Studio/Content/Effect Library/maps/effects/noiseUniform.png
new file mode 100644
index 0000000..c9f2969
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/noiseUniform.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/ps_cloudlet.png b/Studio/Content/Effect Library/maps/effects/ps_cloudlet.png
new file mode 100644
index 0000000..d7cc2d6
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/ps_cloudlet.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/ps_glowDisc.png b/Studio/Content/Effect Library/maps/effects/ps_glowDisc.png
new file mode 100644
index 0000000..5cca911
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/ps_glowDisc.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/ps_glowSphere.png b/Studio/Content/Effect Library/maps/effects/ps_glowSphere.png
new file mode 100644
index 0000000..15c3363
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/ps_glowSphere.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/ps_rectangle.png b/Studio/Content/Effect Library/maps/effects/ps_rectangle.png
new file mode 100644
index 0000000..3f13ad1
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/ps_rectangle.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/ps_sphere.dds b/Studio/Content/Effect Library/maps/effects/ps_sphere.dds
new file mode 100644
index 0000000..5f58782
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/ps_sphere.dds
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/ps_sphere.png b/Studio/Content/Effect Library/maps/effects/ps_sphere.png
new file mode 100644
index 0000000..774c1f4
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/ps_sphere.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/ps_star.png b/Studio/Content/Effect Library/maps/effects/ps_star.png
new file mode 100644
index 0000000..3cd9da4
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/ps_star.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/snownoise.dds b/Studio/Content/Effect Library/maps/effects/snownoise.dds
new file mode 100644
index 0000000..070ba68
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/snownoise.dds
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/snownoise.png b/Studio/Content/Effect Library/maps/effects/snownoise.png
new file mode 100644
index 0000000..1042b3d
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/snownoise.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/starBokeh.png b/Studio/Content/Effect Library/maps/effects/starBokeh.png
new file mode 100644
index 0000000..661d868
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/starBokeh.png
Binary files differ
diff --git a/Studio/Content/Effect Library/maps/effects/white.png b/Studio/Content/Effect Library/maps/effects/white.png
new file mode 100644
index 0000000..18cca06
--- /dev/null
+++ b/Studio/Content/Effect Library/maps/effects/white.png
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/DESCRIPTION.en_us.html b/Studio/Content/Font Library/titilliumweb/DESCRIPTION.en_us.html
new file mode 100644
index 0000000..99c6c3b
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/DESCRIPTION.en_us.html
@@ -0,0 +1,22 @@
+<p>Titillium is born inside the Accademia di Belle Arti di Urbino as a
+didactic project Course Type design of the Master of Visual Design Campi
+Visivi.</p>
+
+<p>The aim of the project is the creation of a collective fonts released under
+OFL. Each academic year, a dozen students work on the project, developing it
+further and solving problems. Any type designer interested in the amendment or
+revision of Titillium is invited to co-operate with us, or develop their own
+variants of the typeface according to the terms specified in the Open Font
+license. We also ask all graphic designers who use Titillium in their projects
+to <a href="mailto:segreteria@accademiadiurbino.it">email us some examples</a>
+of the typeface family in use, in order to prepare a case histories
+database.</p>
+
+<p>Three years after the birth of Titillium, the project is still evolving,
+and even we don’t know what it will become in the future.</p>
+
+<p>Special thanks go to:<br/>
+Prof. Luciano Perondi, design and curation<br/>
+Prof. Marcello Signorile, coordination<br/>
+Prof. Manuel Zanettin, web project supervision<br/>
+Diego Giusti, design of the first prototype</p> \ No newline at end of file
diff --git a/Studio/Content/Font Library/titilliumweb/METADATA.pb b/Studio/Content/Font Library/titilliumweb/METADATA.pb
new file mode 100644
index 0000000..e4faa35
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/METADATA.pb
@@ -0,0 +1,107 @@
+name: "Titillium Web"
+designer: "Multiple Designers"
+license: "OFL"
+category: "SANS_SERIF"
+date_added: "2012-10-01"
+fonts {
+ name: "Titillium Web"
+ style: "normal"
+ weight: 200
+ filename: "TitilliumWeb-ExtraLight.ttf"
+ post_script_name: "TitilliumWeb-Thin"
+ full_name: "Titillium WebThin"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "italic"
+ weight: 200
+ filename: "TitilliumWeb-ExtraLightItalic.ttf"
+ post_script_name: "TitilliumWeb-ThinItalic"
+ full_name: "Titillium WebThin Italic"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "normal"
+ weight: 300
+ filename: "TitilliumWeb-Light.ttf"
+ post_script_name: "TitilliumWeb-Light"
+ full_name: "Titillium WebLight"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "italic"
+ weight: 300
+ filename: "TitilliumWeb-LightItalic.ttf"
+ post_script_name: "TitilliumWeb-LightItalic"
+ full_name: "Titillium WebLight Italic"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "normal"
+ weight: 400
+ filename: "TitilliumWeb-Regular.ttf"
+ post_script_name: "TitilliumWeb-Regular"
+ full_name: "Titillium Web"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "italic"
+ weight: 400
+ filename: "TitilliumWeb-Italic.ttf"
+ post_script_name: "TitilliumWeb-Italic"
+ full_name: "Titillium WebItalic"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "normal"
+ weight: 600
+ filename: "TitilliumWeb-SemiBold.ttf"
+ post_script_name: "TitilliumWeb-SemiBold"
+ full_name: "Titillium WebSemiBold"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "italic"
+ weight: 600
+ filename: "TitilliumWeb-SemiBoldItalic.ttf"
+ post_script_name: "TitilliumWeb-SemiBoldItalic"
+ full_name: "Titillium WebSemiBold Italic"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "normal"
+ weight: 700
+ filename: "TitilliumWeb-Bold.ttf"
+ post_script_name: "TitilliumWeb-Bold"
+ full_name: "Titillium WebBold"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "italic"
+ weight: 700
+ filename: "TitilliumWeb-BoldItalic.ttf"
+ post_script_name: "TitilliumWeb-BoldItalic"
+ full_name: "Titillium WebBold Italic"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+fonts {
+ name: "Titillium Web"
+ style: "normal"
+ weight: 900
+ filename: "TitilliumWeb-Black.ttf"
+ post_script_name: "TitilliumWeb-Black"
+ full_name: "Titillium WebBlack"
+ copyright: "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino (titillium@campivisivi.net) and students of MA course of Visual design. Some rights reserved."
+}
+subsets: "menu"
+subsets: "latin"
+subsets: "latin-ext"
diff --git a/Studio/Content/Font Library/titilliumweb/OFL.txt b/Studio/Content/Font Library/titilliumweb/OFL.txt
new file mode 100644
index 0000000..bbaa23a
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/OFL.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino and students of MA course of Visual design. Some rights reserved.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Black.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Black.ttf
new file mode 100644
index 0000000..fc5c4b5
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Black.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Bold.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Bold.ttf
new file mode 100644
index 0000000..0af0fe7
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Bold.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-BoldItalic.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-BoldItalic.ttf
new file mode 100644
index 0000000..77425ea
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-BoldItalic.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLight.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLight.ttf
new file mode 100644
index 0000000..2b506ef
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLight.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLightItalic.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLightItalic.ttf
new file mode 100644
index 0000000..c1be5ba
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-ExtraLightItalic.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Italic.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Italic.ttf
new file mode 100644
index 0000000..42f2c10
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Italic.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Light.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Light.ttf
new file mode 100644
index 0000000..ca67971
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Light.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-LightItalic.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-LightItalic.ttf
new file mode 100644
index 0000000..2ea724f
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-LightItalic.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Regular.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Regular.ttf
new file mode 100644
index 0000000..6da8219
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-Regular.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBold.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBold.ttf
new file mode 100644
index 0000000..dfdcdbe
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBold.ttf
Binary files differ
diff --git a/Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBoldItalic.ttf b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBoldItalic.ttf
new file mode 100644
index 0000000..b68a669
--- /dev/null
+++ b/Studio/Content/Font Library/titilliumweb/TitilliumWeb-SemiBoldItalic.ttf
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1-mirror.png
new file mode 100644
index 0000000..80b313c
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1.png
new file mode 100644
index 0000000..7b195d7
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2-mirror.png
new file mode 100644
index 0000000..2af3c6d
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2.png
new file mode 100644
index 0000000..4361272
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3-mirror.png
new file mode 100644
index 0000000..212ffaa
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3.png
new file mode 100644
index 0000000..3912277
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4-mirror.png
new file mode 100644
index 0000000..725f16a
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4.png
new file mode 100644
index 0000000..2df8229
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-4.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-1.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-1.png
new file mode 100644
index 0000000..46d3382
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-2.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-2.png
new file mode 100644
index 0000000..335f51a
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-3.png b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-3.png
new file mode 100644
index 0000000..0c5c019
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-horizontal/horizontal-reflected-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1-inverse.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1-inverse.png
new file mode 100644
index 0000000..26f56a3
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1-inverse.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1.png
new file mode 100644
index 0000000..d0426ae
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2-inverse.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2-inverse.png
new file mode 100644
index 0000000..9636fac
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2-inverse.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2.png
new file mode 100644
index 0000000..e684345
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3-inverse.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3-inverse.png
new file mode 100644
index 0000000..d02fa20
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3-inverse.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3.png
new file mode 100644
index 0000000..c8f498f
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4-inverse.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4-inverse.png
new file mode 100644
index 0000000..a6be42a
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4-inverse.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4.png
new file mode 100644
index 0000000..7ee5ec7
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-4.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5-inverse.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5-inverse.png
new file mode 100644
index 0000000..6063490
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5-inverse.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5.png b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5.png
new file mode 100644
index 0000000..fa44f1b
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-spherical/sphere-gradient-5.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1-mirror.png
new file mode 100644
index 0000000..7ad3eea
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1.png
new file mode 100644
index 0000000..539db23
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2-mirror.png
new file mode 100644
index 0000000..58c56cb
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2.png
new file mode 100644
index 0000000..4930262
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3-mirror.png
new file mode 100644
index 0000000..241f50d
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3.png
new file mode 100644
index 0000000..ab0a8aa
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4-mirror.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4-mirror.png
new file mode 100644
index 0000000..29da8ca
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4-mirror.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4.png
new file mode 100644
index 0000000..8f0de38
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-4.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-1.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-1.png
new file mode 100644
index 0000000..ca40b4d
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-2.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-2.png
new file mode 100644
index 0000000..62c826d
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-3.png b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-3.png
new file mode 100644
index 0000000..ce2f4b4
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/gradients-vertical/vertical-reflected-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-1.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-1.png
new file mode 100644
index 0000000..62b35d1
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-2.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-2.png
new file mode 100644
index 0000000..6594540
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-3.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-3.png
new file mode 100644
index 0000000..a8e0861
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-4.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-4.png
new file mode 100644
index 0000000..407ee80
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/circles-4.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-1.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-1.png
new file mode 100644
index 0000000..9956bef
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-2.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-2.png
new file mode 100644
index 0000000..8c1cd63
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-3.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-3.png
new file mode 100644
index 0000000..058fb0e
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-1.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-1.png
new file mode 100644
index 0000000..d79b233
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-2.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-2.png
new file mode 100644
index 0000000..6c99681
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-3.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-3.png
new file mode 100644
index 0000000..3836453
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-radial-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-ripple.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-ripple.png
new file mode 100644
index 0000000..2a505a4
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-ripple.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-twist.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-twist.png
new file mode 100644
index 0000000..0c918db
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rays-twist.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-1.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-1.png
new file mode 100644
index 0000000..ce45c18
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-2.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-2.png
new file mode 100644
index 0000000..3c568b9
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-3.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-3.png
new file mode 100644
index 0000000..b8a369f
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/rounded-boxes-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/splatter-1.png b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/splatter-1.png
new file mode 100644
index 0000000..458c620
--- /dev/null
+++ b/Studio/Content/Maps Library/Alpha Maps/misc alpha maps/splatter-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Automotive/indicators_icons.png b/Studio/Content/Maps Library/Automotive/indicators_icons.png
new file mode 100644
index 0000000..381065c
--- /dev/null
+++ b/Studio/Content/Maps Library/Automotive/indicators_icons.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Automotive/indicators_icons_extended.png b/Studio/Content/Maps Library/Automotive/indicators_icons_extended.png
new file mode 100644
index 0000000..75980ae
--- /dev/null
+++ b/Studio/Content/Maps Library/Automotive/indicators_icons_extended.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Automotive/large_tic_marks.png b/Studio/Content/Maps Library/Automotive/large_tic_marks.png
new file mode 100644
index 0000000..24c4268
--- /dev/null
+++ b/Studio/Content/Maps Library/Automotive/large_tic_marks.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Automotive/medium_tic_marks.png b/Studio/Content/Maps Library/Automotive/medium_tic_marks.png
new file mode 100644
index 0000000..b165ec3
--- /dev/null
+++ b/Studio/Content/Maps Library/Automotive/medium_tic_marks.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Automotive/small_tic_marks.png b/Studio/Content/Maps Library/Automotive/small_tic_marks.png
new file mode 100644
index 0000000..42d4e78
--- /dev/null
+++ b/Studio/Content/Maps Library/Automotive/small_tic_marks.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Bump Maps/bump.dds b/Studio/Content/Maps Library/Bump Maps/bump.dds
new file mode 100644
index 0000000..97ddbf4
--- /dev/null
+++ b/Studio/Content/Maps Library/Bump Maps/bump.dds
Binary files differ
diff --git a/Studio/Content/Maps Library/Bump Maps/bump.png b/Studio/Content/Maps Library/Bump Maps/bump.png
new file mode 100644
index 0000000..2ede489
--- /dev/null
+++ b/Studio/Content/Maps Library/Bump Maps/bump.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Bump Maps/rubber_hatch.dds b/Studio/Content/Maps Library/Bump Maps/rubber_hatch.dds
new file mode 100644
index 0000000..8c3b0a3
--- /dev/null
+++ b/Studio/Content/Maps Library/Bump Maps/rubber_hatch.dds
Binary files differ
diff --git a/Studio/Content/Maps Library/Bump Maps/rubber_hatch.png b/Studio/Content/Maps Library/Bump Maps/rubber_hatch.png
new file mode 100644
index 0000000..93966fc
--- /dev/null
+++ b/Studio/Content/Maps Library/Bump Maps/rubber_hatch.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Concepting Maps/Finger-idle.png b/Studio/Content/Maps Library/Concepting Maps/Finger-idle.png
new file mode 100644
index 0000000..2c988fe
--- /dev/null
+++ b/Studio/Content/Maps Library/Concepting Maps/Finger-idle.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Concepting Maps/Finger-pressureDown.png b/Studio/Content/Maps Library/Concepting Maps/Finger-pressureDown.png
new file mode 100644
index 0000000..0a60ef1
--- /dev/null
+++ b/Studio/Content/Maps Library/Concepting Maps/Finger-pressureDown.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/LICENSE-OpenfootageNET.txt b/Studio/Content/Maps Library/Environments/LICENSE-OpenfootageNET.txt
new file mode 100644
index 0000000..eb66a5c
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/LICENSE-OpenfootageNET.txt
@@ -0,0 +1,7 @@
+All HDRI maps from come from www.openfootage.net and are licensed under
+a Creative Commons Attribution 4.0 International License.
+http://creativecommons.org/licenses/by/4.0/
+
+All files have been (slightly) renamed for consistency.
+The -1024 and -512 images are simply smaller versions, useful for
+improved performance (and decreased max specular shininess). \ No newline at end of file
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-1024.hdr
new file mode 100644
index 0000000..bc65d42
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-512.hdr
new file mode 100644
index 0000000..7119b26
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Gerlos-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-1024.hdr
new file mode 100644
index 0000000..f58b29a
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-512.hdr
new file mode 100644
index 0000000..c653195
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Grado-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-1024.hdr
new file mode 100644
index 0000000..41e6664
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-512.hdr
new file mode 100644
index 0000000..ae61081
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Hintersee-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-1024.hdr
new file mode 100644
index 0000000..9e73ce7
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-512.hdr
new file mode 100644
index 0000000..655a217
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Pinzgau-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-1024.hdr
new file mode 100644
index 0000000..84be86c
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-512.hdr
new file mode 100644
index 0000000..3f935c4
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Streetautumn-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-1024.hdr
new file mode 100644
index 0000000..3072d3a
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-512.hdr
new file mode 100644
index 0000000..4c33103
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_Thumersbach-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-1024.hdr
new file mode 100644
index 0000000..e231281
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-512.hdr
new file mode 100644
index 0000000..abdebdb
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_fieldairport-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_garage-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_garage-1024.hdr
new file mode 100644
index 0000000..01e9e38
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_garage-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_garage-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_garage-512.hdr
new file mode 100644
index 0000000..015b478
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_garage-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-1024.hdr
new file mode 100644
index 0000000..ac513a4
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-512.hdr
new file mode 100644
index 0000000..df12f02
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_lowerAustria01-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-1024.hdr
new file mode 100644
index 0000000..e891be8
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-512.hdr
new file mode 100644
index 0000000..dec5040
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNET_trainstation-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-1024.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-1024.hdr
new file mode 100644
index 0000000..55d4107
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-512.hdr b/Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-512.hdr
new file mode 100644
index 0000000..8c66ff8
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/OpenfootageNet_LADEFENSE-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/TestEnvironment-1024.hdr b/Studio/Content/Maps Library/Environments/TestEnvironment-1024.hdr
new file mode 100644
index 0000000..34bd6b6
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/TestEnvironment-1024.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/TestEnvironment-2048.hdr b/Studio/Content/Maps Library/Environments/TestEnvironment-2048.hdr
new file mode 100644
index 0000000..6213f54
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/TestEnvironment-2048.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Environments/TestEnvironment-512.hdr b/Studio/Content/Maps Library/Environments/TestEnvironment-512.hdr
new file mode 100644
index 0000000..5885a91
--- /dev/null
+++ b/Studio/Content/Maps Library/Environments/TestEnvironment-512.hdr
Binary files differ
diff --git a/Studio/Content/Maps Library/Logos/Qt/QT-badge.png b/Studio/Content/Maps Library/Logos/Qt/QT-badge.png
new file mode 100644
index 0000000..0486310
--- /dev/null
+++ b/Studio/Content/Maps Library/Logos/Qt/QT-badge.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Logos/Qt/QT-symbol-flatWhite.png b/Studio/Content/Maps Library/Logos/Qt/QT-symbol-flatWhite.png
new file mode 100644
index 0000000..9b718ec
--- /dev/null
+++ b/Studio/Content/Maps Library/Logos/Qt/QT-symbol-flatWhite.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Logos/Qt/QT-symbol.png b/Studio/Content/Maps Library/Logos/Qt/QT-symbol.png
new file mode 100644
index 0000000..752a2e2
--- /dev/null
+++ b/Studio/Content/Maps Library/Logos/Qt/QT-symbol.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-128X128.png b/Studio/Content/Maps Library/Shapes/circles/circle-128X128.png
new file mode 100644
index 0000000..67da57e
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-128X128.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-256X256.png b/Studio/Content/Maps Library/Shapes/circles/circle-256X256.png
new file mode 100644
index 0000000..bf79cf9
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-256X256.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-32X32.png b/Studio/Content/Maps Library/Shapes/circles/circle-32X32.png
new file mode 100644
index 0000000..b23983f
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-32X32.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-64X64.png b/Studio/Content/Maps Library/Shapes/circles/circle-64X64.png
new file mode 100644
index 0000000..88d2b89
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-64X64.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-01p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-01p.png
new file mode 100644
index 0000000..747d23b
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-01p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-02p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-02p.png
new file mode 100644
index 0000000..7185b47
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-02p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-03p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-03p.png
new file mode 100644
index 0000000..9da886f
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-03p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-05p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-05p.png
new file mode 100644
index 0000000..942e01d
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-05p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-10p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-10p.png
new file mode 100644
index 0000000..3632401
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-10p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-15p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-15p.png
new file mode 100644
index 0000000..420a679
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-15p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-20p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-20p.png
new file mode 100644
index 0000000..1993667
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-20p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-25p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-25p.png
new file mode 100644
index 0000000..80bce1e
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-25p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-30p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-30p.png
new file mode 100644
index 0000000..356c106
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-30p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/circles/circle-stroke-50p.png b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-50p.png
new file mode 100644
index 0000000..2d46966
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/circles/circle-stroke-50p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/squares/square-stroke-01p.png b/Studio/Content/Maps Library/Shapes/squares/square-stroke-01p.png
new file mode 100644
index 0000000..91df0ff
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/squares/square-stroke-01p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/squares/square-stroke-02p.png b/Studio/Content/Maps Library/Shapes/squares/square-stroke-02p.png
new file mode 100644
index 0000000..65b7ea4
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/squares/square-stroke-02p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/squares/square-stroke-03p.png b/Studio/Content/Maps Library/Shapes/squares/square-stroke-03p.png
new file mode 100644
index 0000000..4df981b
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/squares/square-stroke-03p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/squares/square-stroke-05p.png b/Studio/Content/Maps Library/Shapes/squares/square-stroke-05p.png
new file mode 100644
index 0000000..f29dd9f
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/squares/square-stroke-05p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/squares/square-stroke-10p.png b/Studio/Content/Maps Library/Shapes/squares/square-stroke-10p.png
new file mode 100644
index 0000000..1480345
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/squares/square-stroke-10p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/squares/square-stroke-25p.png b/Studio/Content/Maps Library/Shapes/squares/square-stroke-25p.png
new file mode 100644
index 0000000..803a1b6
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/squares/square-stroke-25p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Shapes/squares/square-stroke-50p.png b/Studio/Content/Maps Library/Shapes/squares/square-stroke-50p.png
new file mode 100644
index 0000000..cd3353b
--- /dev/null
+++ b/Studio/Content/Maps Library/Shapes/squares/square-stroke-50p.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/flares/Flare1.png b/Studio/Content/Maps Library/Special Effects/flares/Flare1.png
new file mode 100644
index 0000000..bc3cdf6
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/flares/Flare1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/flares/Flare2.png b/Studio/Content/Maps Library/Special Effects/flares/Flare2.png
new file mode 100644
index 0000000..f804ccb
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/flares/Flare2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/flares/Flare3.png b/Studio/Content/Maps Library/Special Effects/flares/Flare3.png
new file mode 100644
index 0000000..bcc5a96
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/flares/Flare3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/flares/Flare4.png b/Studio/Content/Maps Library/Special Effects/flares/Flare4.png
new file mode 100644
index 0000000..8885292
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/flares/Flare4.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/flares/Flare5.png b/Studio/Content/Maps Library/Special Effects/flares/Flare5.png
new file mode 100644
index 0000000..7d10d4b
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/flares/Flare5.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/glows/Glow-CircleBorder-1.png b/Studio/Content/Maps Library/Special Effects/glows/Glow-CircleBorder-1.png
new file mode 100644
index 0000000..ebfe2e0
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/glows/Glow-CircleBorder-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-1.png b/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-1.png
new file mode 100644
index 0000000..a710707
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-2.png b/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-2.png
new file mode 100644
index 0000000..dadc917
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-3.png b/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-3.png
new file mode 100644
index 0000000..0254541
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/glows/Glow-circle-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/grids/grid-01.png b/Studio/Content/Maps Library/Special Effects/grids/grid-01.png
new file mode 100644
index 0000000..43347f5
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/grids/grid-01.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/grids/grid-02.png b/Studio/Content/Maps Library/Special Effects/grids/grid-02.png
new file mode 100644
index 0000000..16fda6d
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/grids/grid-02.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/grids/grid-03.png b/Studio/Content/Maps Library/Special Effects/grids/grid-03.png
new file mode 100644
index 0000000..e3d4aef
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/grids/grid-03.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/grids/grid-04.png b/Studio/Content/Maps Library/Special Effects/grids/grid-04.png
new file mode 100644
index 0000000..ab3ee26
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/grids/grid-04.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Color.png b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Color.png
new file mode 100644
index 0000000..f08d7d2
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Color.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing.png b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing.png
new file mode 100644
index 0000000..59e3b6e
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing2.png b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing2.png
new file mode 100644
index 0000000..03d2e3d
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_RainbowRing2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Ring.png b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Ring.png
new file mode 100644
index 0000000..98d7ae1
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/lens flares/LensFlare_Ring.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/cloudy_smoke.png b/Studio/Content/Maps Library/Special Effects/smoke/cloudy_smoke.png
new file mode 100644
index 0000000..3501fbf
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/cloudy_smoke.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/smoke-1.png b/Studio/Content/Maps Library/Special Effects/smoke/smoke-1.png
new file mode 100644
index 0000000..520880a
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/smoke-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/smoke-2.png b/Studio/Content/Maps Library/Special Effects/smoke/smoke-2.png
new file mode 100644
index 0000000..e2e658f
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/smoke-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/smoke-3.png b/Studio/Content/Maps Library/Special Effects/smoke/smoke-3.png
new file mode 100644
index 0000000..a798d8a
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/smoke-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/smoke-4.png b/Studio/Content/Maps Library/Special Effects/smoke/smoke-4.png
new file mode 100644
index 0000000..70b2327
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/smoke-4.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/smoke-5.png b/Studio/Content/Maps Library/Special Effects/smoke/smoke-5.png
new file mode 100644
index 0000000..13582e2
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/smoke-5.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-1.png b/Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-1.png
new file mode 100644
index 0000000..b0f0f19
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-2.png b/Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-2.png
new file mode 100644
index 0000000..f2f13d0
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/smoke/smoke-puff-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/streaks/streak_narrow.png b/Studio/Content/Maps Library/Special Effects/streaks/streak_narrow.png
new file mode 100644
index 0000000..222cefd
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/streaks/streak_narrow.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Special Effects/streaks/streak_wide.png b/Studio/Content/Maps Library/Special Effects/streaks/streak_wide.png
new file mode 100644
index 0000000..c6fe1b6
--- /dev/null
+++ b/Studio/Content/Maps Library/Special Effects/streaks/streak_wide.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_01.jpg b/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_01.jpg
new file mode 100644
index 0000000..1cd729c
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_01.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_02.jpg b/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_02.jpg
new file mode 100644
index 0000000..299f6a2
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_02.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_03.jpg b/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_03.jpg
new file mode 100644
index 0000000..0a96914
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Chrome/Chrome_03.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_01.jpg b/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_01.jpg
new file mode 100644
index 0000000..0f8485d
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_01.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_02.jpg b/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_02.jpg
new file mode 100644
index 0000000..c5ad0a7
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_02.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_03.jpg b/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_03.jpg
new file mode 100644
index 0000000..74963de
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Gold/Gold_03.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-1.jpg b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-1.jpg
new file mode 100644
index 0000000..8b1a8b0
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-1.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-2.jpg b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-2.jpg
new file mode 100644
index 0000000..40747b6
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-2.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-3.jpg b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-3.jpg
new file mode 100644
index 0000000..77cff7b
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Environment-3.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Smear.jpg b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Smear.jpg
new file mode 100644
index 0000000..3d8c64a
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Smear.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Underwater.jpg b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Underwater.jpg
new file mode 100644
index 0000000..49e6b62
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Underwater.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Window.jpg b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Window.jpg
new file mode 100644
index 0000000..f688c9f
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Misc/Reflection_Window.jpg
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-ceiling_lights-1.png b/Studio/Content/Maps Library/Specular Reflection/Specular-ceiling_lights-1.png
new file mode 100644
index 0000000..443f881
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-ceiling_lights-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-dull-1.png b/Studio/Content/Maps Library/Specular Reflection/Specular-dull-1.png
new file mode 100644
index 0000000..84772ff
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-dull-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-dull-2.png b/Studio/Content/Maps Library/Specular Reflection/Specular-dull-2.png
new file mode 100644
index 0000000..5d89372
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-dull-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-dull-3.png b/Studio/Content/Maps Library/Specular Reflection/Specular-dull-3.png
new file mode 100644
index 0000000..bc9645d
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-dull-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1-alpha-25_orange.png b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1-alpha-25_orange.png
new file mode 100644
index 0000000..9f2a64b
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1-alpha-25_orange.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1.png b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1.png
new file mode 100644
index 0000000..2e2a275
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-2.png b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-2.png
new file mode 100644
index 0000000..7e5af56
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-3.png b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-3.png
new file mode 100644
index 0000000..dbc17ad
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/Specular-shiny-3.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha01.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha01.png
new file mode 100644
index 0000000..9b5b3e9
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha01.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha02.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha02.png
new file mode 100644
index 0000000..b808d12
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha02.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha03.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha03.png
new file mode 100644
index 0000000..ad218fc
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha03.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha04.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha04.png
new file mode 100644
index 0000000..d4a3db6
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha04.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha05.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha05.png
new file mode 100644
index 0000000..cca1067
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Glass-alpha05.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-100.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-100.png
new file mode 100644
index 0000000..13a5d11
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-100.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-25.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-25.png
new file mode 100644
index 0000000..77add09
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-25.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-50.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-50.png
new file mode 100644
index 0000000..7fbef27
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-50.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-75.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-75.png
new file mode 100644
index 0000000..52c595c
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-75.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-90.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-90.png
new file mode 100644
index 0000000..1a38b49
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-dull-1-alpha-90.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-100.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-100.png
new file mode 100644
index 0000000..81f09fe
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-100.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25.png
new file mode 100644
index 0000000..54dc410
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25_refIVI.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25_refIVI.png
new file mode 100644
index 0000000..54dc410
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-25_refIVI.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50.png
new file mode 100644
index 0000000..3ffe405
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50_green.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50_green.png
new file mode 100644
index 0000000..4cda0d3
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-50_green.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-75.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-75.png
new file mode 100644
index 0000000..b99c502
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-75.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-90.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-90.png
new file mode 100644
index 0000000..9065eaf
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-90.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-blue.png b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-blue.png
new file mode 100644
index 0000000..35e07da
--- /dev/null
+++ b/Studio/Content/Maps Library/Specular Reflection/With Alpha/Specular-shiny-1-alpha-blue.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Cork1.png b/Studio/Content/Maps Library/Texture Maps/Cork1.png
new file mode 100644
index 0000000..b27b27d
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Cork1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Fabric1.png b/Studio/Content/Maps Library/Texture Maps/Fabric1.png
new file mode 100644
index 0000000..65dcf40
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Fabric1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Fabric2.png b/Studio/Content/Maps Library/Texture Maps/Fabric2.png
new file mode 100644
index 0000000..74156f6
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Fabric2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Grass2.png b/Studio/Content/Maps Library/Texture Maps/Grass2.png
new file mode 100644
index 0000000..ed8189d
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Grass2.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Metal_Bronze.png b/Studio/Content/Maps Library/Texture Maps/Metal_Bronze.png
new file mode 100644
index 0000000..119cad6
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Metal_Bronze.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Metal_Oxydized.png b/Studio/Content/Maps Library/Texture Maps/Metal_Oxydized.png
new file mode 100644
index 0000000..bca8c2f
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Metal_Oxydized.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Metal_Streaks.png b/Studio/Content/Maps Library/Texture Maps/Metal_Streaks.png
new file mode 100644
index 0000000..f2a6d49
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Metal_Streaks.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Paper05.png b/Studio/Content/Maps Library/Texture Maps/Paper05.png
new file mode 100644
index 0000000..e70749d
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Paper05.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Scratched_Aluminum.png b/Studio/Content/Maps Library/Texture Maps/Scratched_Aluminum.png
new file mode 100644
index 0000000..ebabbfe
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Scratched_Aluminum.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Stone1.png b/Studio/Content/Maps Library/Texture Maps/Stone1.png
new file mode 100644
index 0000000..454ab58
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Stone1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Water1.png b/Studio/Content/Maps Library/Texture Maps/Water1.png
new file mode 100644
index 0000000..2d0ea4e
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Water1.png
Binary files differ
diff --git a/Studio/Content/Maps Library/Texture Maps/Wood7.png b/Studio/Content/Maps Library/Texture Maps/Wood7.png
new file mode 100644
index 0000000..9d9a219
--- /dev/null
+++ b/Studio/Content/Maps Library/Texture Maps/Wood7.png
Binary files differ
diff --git a/Studio/Content/Maps Library/UV-Checker.png b/Studio/Content/Maps Library/UV-Checker.png
new file mode 100644
index 0000000..fd3fa9c
--- /dev/null
+++ b/Studio/Content/Maps Library/UV-Checker.png
Binary files differ
diff --git a/Studio/Content/Material Library/aluminium_anodized.shader b/Studio/Content/Material Library/aluminium_anodized.shader
new file mode 100644
index 0000000..17da9fb
--- /dev/null
+++ b/Studio/Content/Material Library/aluminium_anodized.shader
@@ -0,0 +1,178 @@
+<Material name="aluminium_anodized" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.300000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Base color" name="base_color" type="Color" default="0.7 0.7 0.7" description="Color of the material" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 0
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = fresnelLayer( normal, vec3( 22, 22, 22 ), 1.000000, base_color.rgb, layers[0].layer, layers[0].base, alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="4"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/aluminium_anodized_emissive.shader b/Studio/Content/Material Library/aluminium_anodized_emissive.shader
new file mode 100644
index 0000000..1c3233f
--- /dev/null
+++ b/Studio/Content/Material Library/aluminium_anodized_emissive.shader
@@ -0,0 +1,214 @@
+<Material name="aluminium_anodized_emissive" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.300000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Base color" name="base_color" type="Color" default="0.7 0.7 0.7" description="Color of the material" category="Material"/>
+ <Property formalName="Intensity" name="intensity" description="Emission intensity" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Emission Color" name="emission_color" description="Color of the emission" type="Color" default="0 0 0" category="Material"/>
+ <Property formalName="Emissive Map" name="emissive_texture" description="Emissive texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive" default="./maps/materials/emissive.png" category="Material"/>
+ <Property formalName="Emissive Map Mask" name="emissive_mask_texture" description="Emissive mask texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive_mask" default="./maps/materials/emissive_mask.png" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+#include "monoChannel.glsllib"
+#include "fileTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3(1.0) * vec3( vec3( ( intensity *( emission_color.rgb * ( fileTexture(emissive_texture, vec3(0.0), vec3(1.0), mono_alpha, tmp3, vec2(0.0, 1.0), vec2(0.0, 1.0), wrap_repeat, wrap_repeat, gamma_default ).tint * fileTexture(emissive_mask_texture, vec3(0.0), vec3(1.0), mono_alpha, tmp3, vec2(0.0, 1.0), vec2(0.0, 1.0), wrap_repeat, wrap_repeat, gamma_default ).tint ) ) ) ) ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp3 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( 1.000000, 1.000000, 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = fresnelLayer( normal, vec3( 22, 22, 22 ), 1.000000, base_color.rgb, layers[0].layer, layers[0].base, alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="4"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/aluminum.shader b/Studio/Content/Material Library/aluminum.shader
new file mode 100644
index 0000000..e2a5bea
--- /dev/null
+++ b/Studio/Content/Material Library/aluminum.shader
@@ -0,0 +1,223 @@
+<Material name="aluminum" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflection_texture" description="Reflection texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/grunge_b.png" category="Material"/>
+ <Property formalName="Reflection Map Offset" name="reflection_map_offset" hidden="True" type="Float" default="0.500000" description="Reflection texture value offset" category="Material"/>
+ <Property formalName="Reflection Map Scale" name="reflection_map_scale" hidden="True" type="Float" default="0.300000" description="Reflection texture value scale" category="Material"/>
+ <Property formalName="Tiling" name="tiling" type="Vector" default="1 1 1" description="Texture Tiling size" category="Material"/>
+ <Property formalName="Roughness Map" name="roughness_texture" description="Roughness texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="roughness" default="./maps/materials/grunge_d.png" category="Material"/>
+ <Property formalName="Roughness Map Offset" name="roughness_map_offset" hidden="True" type="Float" default="0.160000" description="Roughness texture value offset" category="Material"/>
+ <Property formalName="Roughness Map Scale" name="roughness_map_scale" hidden="True" type="Float" default="0.400000" description="Roughness texture value scale" category="Material"/>
+ <Property formalName="Metal Color" name="metal_color" type="Color" default="0.95 0.95 0.95" description="Base color of the material" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/grunge_d.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" min="0" max="2" default="0.500000" description="Scale value for bump amount" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp1;
+float tmp2;
+float ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "weightedLayer.glsllib"
+#include "fileTexture.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, tmp2, tmp2, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, tmp2, tmp2 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, tmp2, tmp2, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, tmp2, tmp2 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( fileBumpTexture(bump_texture, bump_amount, mono_average, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmp1 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), tiling ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp2 = fileTexture(roughness_texture, vec3( roughness_map_offset ), vec3( roughness_map_scale ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).mono;
+ ftmp0 = fileTexture(reflection_texture, vec3( reflection_map_offset ), vec3( reflection_map_scale ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).mono;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( ftmp0, metal_color.rgb, layers[0].layer, layers[0].base, alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="4"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/aluminum_anisotropic.shader b/Studio/Content/Material Library/aluminum_anisotropic.shader
new file mode 100644
index 0000000..b5fed9f
--- /dev/null
+++ b/Studio/Content/Material Library/aluminum_anisotropic.shader
@@ -0,0 +1,260 @@
+<Material name="aluminum_anisotropic" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" description="Refractive index of the material" type="Float" default="8.000000" category="Material"/>
+ <Property formalName="Diffuse Map" name="reflection_texture" description="Reflection texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/concentric_milled_steel.png" category="Material"/>
+ <Property formalName="Reflection Map Offset" name="reflection_map_offset" hidden="True" type="Float" default="1.000000" description="Reflection texture value offset" category="Material"/>
+ <Property formalName="Reflection Map Scale" name="reflection_map_scale" hidden="True" type="Float" default="1.000000" description="Reflection texture value scale" category="Material"/>
+ <Property formalName="Tiling" name="tiling" type="Float2" default="8 5" description="Texture Tiling size" category="Material"/>
+ <Property formalName="Roughness Map Offset" name="roughness_map_offset" hidden="True" type="Float" default="0.000000" description="Roughness texture value offset" category="Material"/>
+ <Property formalName="Roughness Map Scale" name="roughness_map_scale" hidden="True" type="Float" default="1.000000" description="Roughness texture value scale" category="Material"/>
+ <Property formalName="Anisotropy" name="anisotropy" type="Float" default="0.800000" description="Anisotropy" category="Material"/>
+ <Property formalName="Anisotropy Map" name="aniso_rot_texture" description="Anisotropy rot texture of the material" type="Texture" filter="linear" minfilter="linear" clamp="repeat" usage="anisotropy" default="./maps/materials/concentric_milled_steel_aniso.png" category="Material"/>
+ <Property formalName="Roughness Map Offset" name="aniso_tex_color_offset" hidden="True" type="Float" default="0.000000" description="Roughness texture value offset" category="Material"/>
+ <Property formalName="Roughness Map Scale" name="aniso_tex_color_scale" hidden="True" type="Float" default="1.000000" description="Roughness texture value scale" category="Material"/>
+ <Property formalName="Base Weight" name="base_weight" description="Base weight" hidden="True" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/concentric_milled_steel.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" min="0" max="2" default="0.000000" description="Scale value for bump amount" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+struct anisotropy_return
+{
+ float roughness_u;
+ float roughness_v;
+ vec3 tangent_u;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+texture_return tmp4;
+anisotropy_return tmp5;
+vec3 tmp6;
+vec3 tmp8;
+float ftmp0;
+float ftmp1;
+vec3 ftmp2;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "fileTexture.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "anisotropyConversion.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, ftmp0, ftmp1, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, ftmp0, ftmp1 );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, ftmp0, ftmp1, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, ftmp0, ftmp1 );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( tmp8 );
+}
+
+void computeTemporaries()
+{
+ tmp3 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( tiling[0], tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp4 = fileTexture(reflection_texture, vec3( reflection_map_offset ), vec3( reflection_map_scale ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear );
+ tmp5 = anisotropyConversion( fileTexture(reflection_texture, vec3( roughness_map_offset ), vec3( roughness_map_scale ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).mono, anisotropy, fileTexture(aniso_rot_texture, vec3( aniso_tex_color_offset ), vec3( aniso_tex_color_scale ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).mono, tangent, false );
+ tmp6 = tmp4.tint;
+ tmp8 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = tmp5.roughness_u;
+ ftmp1 = tmp5.roughness_v;
+ ftmp2 = tmp5.tangent_u;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( base_weight, vec4( tmp6, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp8, vec3( material_ior ), tmp4.mono, vec4( tmp6, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( ftmp2, cross(tmp8, ftmp2), tmp8 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/aluminum_brushed.shader b/Studio/Content/Material Library/aluminum_brushed.shader
new file mode 100644
index 0000000..594b4fa
--- /dev/null
+++ b/Studio/Content/Material Library/aluminum_brushed.shader
@@ -0,0 +1,224 @@
+<Material name="aluminum_brushed" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Brush Map" name="brush_texture" description="Brush texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="brush" default="./maps/materials/brushed_full_contrast.png" category="Material"/>
+ <Property formalName="Tiling" name="tiling" description="Texture tiling size" type="Vector" default="3 3 3" category="Material"/>
+ <Property formalName="Roughness Map U" name="roughness_texture_u" description="Horizontal roughness texture" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="roughness" default="./maps/materials/brushed_full_contrast.png" category="Material"/>
+ <Property formalName="Brush strength" name="brushing_strength" description="Strength of the brush stroke" type="Float" default="0.500000" category="Material"/>
+ <Property formalName="Roughness Map V" name="roughness_texture_v" description="Vertical roughness texture" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="roughness" default="./maps/materials/brushed_full_contrast.png" category="Material"/>
+ <Property formalName="Reflection Stretch" name="reflection_stretch" description="Reflection stretch" type="Float" default="0.500000" category="Material"/>
+ <Property formalName="Metal Color" name="metal_color" description="Base color of the material" type="Color" default="0.95 0.95 0.95" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/brushed_a.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" description="Scale value for bump amount" type="Float" default="0.400000" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp1;
+float ftmp0;
+float ftmp1;
+float ftmp2;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "weightedLayer.glsllib"
+#include "fileTexture.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, ftmp1, ftmp2, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, ftmp1, ftmp2 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, ftmp1, ftmp2, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, ftmp1, ftmp2 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( fileBumpTexture(bump_texture, bump_amount, mono_average, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmp1 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), tiling ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ ftmp0 = fileTexture(brush_texture, vec3( 0.5, 0.5, 0.5 ), vec3( 0.5, 0.5, 0.5 ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).mono;
+ ftmp1 = fileTexture(roughness_texture_u, vec3( 0.12, 0.12, 0.12 ), vec3( ( 0.800000*brushing_strength ) ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).mono;
+ ftmp2 = fileTexture(roughness_texture_v, vec3( ( 0.150000+( 0.400000*reflection_stretch ) ) ), vec3( ( 0.100000+( reflection_stretch*0.300000 ) ) ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).mono;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( ftmp0, metal_color.rgb, layers[0].layer, layers[0].base, alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="4"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/aluminum_emissive.shader b/Studio/Content/Material Library/aluminum_emissive.shader
new file mode 100644
index 0000000..ed48012
--- /dev/null
+++ b/Studio/Content/Material Library/aluminum_emissive.shader
@@ -0,0 +1,230 @@
+<Material name="aluminum" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflection_texture" description="Reflection texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/grunge_b.png" category="Material"/>
+ <Property formalName="Reflection Map Offset" name="reflection_map_offset" hidden="True" type="Float" default="0.500000" description="Reflection texture value offset" category="Material"/>
+ <Property formalName="Reflection Map Scale" name="reflection_map_scale" hidden="True" type="Float" default="0.300000" description="Reflection texture value scale" category="Material"/>
+ <Property formalName="Tiling" name="tiling" type="Vector" default="1 1 1" description="Texture Tiling size" category="Material"/>
+ <Property formalName="Roughness Map" name="roughness_texture" description="Roughness texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="roughness" default="./maps/materials/grunge_d.png" category="Material"/>
+ <Property formalName="Roughness Map Offset" name="roughness_map_offset" hidden="True" type="Float" default="0.160000" description="Roughness texture value offset" category="Material"/>
+ <Property formalName="Roughness Map Scale" name="roughness_map_scale" hidden="True" type="Float" default="0.400000" description="Roughness texture value scale" category="Material"/>
+ <Property formalName="Metal Color" name="metal_color" type="Color" default="0.95 0.95 0.95" description="Base color of the material" category="Material"/>
+ <Property formalName="Intensity" name="intensity" description="Emission intensity" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Emission Color" name="emission_color" description="Color of the emission" type="Color" default="0 0 0" category="Material"/>
+ <Property formalName="Emissive Map" name="emissive_texture" description="Emissive texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive" default="./maps/materials/emissive.png" category="Material"/>
+ <Property formalName="Emissive Map Mask" name="emissive_mask_texture" description="Emissive mask texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive_mask" default="./maps/materials/emissive_mask.png" category="Material"/>
+ <Property formalName="Emissive Mask Offset" name="emissive_mask_offset" description="Offset of the emissive mask texture" type="Vector" default="0 0 0" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/grunge_d.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" min="0" max="2" default="0.500000" description="Scale value for bump amount" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp1;
+texture_coordinate_info tmp2;
+float tmp3;
+float ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "weightedLayer.glsllib"
+#include "fileTexture.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 1.0, 1.0, 1.0) * vec3( vec3( ( intensity*( emission_color.rgb *( fileTexture(emissive_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, transformCoordinate( rotationTranslationScale( vec3( 0.0, 0.0, 0.0 ), vec3( 0.0, 0.0, 0.0 ), vec3( 1.0, 1.0, 1.0 ) ), tmp1 ), vec2( 0.0, 1.0 ), vec2( 0.0, 1.0 ), wrap_repeat, wrap_repeat, gamma_default ).tint*fileTexture(emissive_mask_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, transformCoordinate( rotationTranslationScale( vec3( 0.0, 0.0, 0.0 ), emissive_mask_offset, vec3( 1.0, 1.0, 1.0 ) ), tmp1 ), vec2( 0.0, 1.0 ), vec2( 0.0, 1.0 ), wrap_repeat, wrap_repeat, gamma_default ).tint ) ) ) ) ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, tmp3, tmp3, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, tmp3, tmp3 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, tmp3, tmp3, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, tmp3, tmp3 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.0 );
+}
+
+vec3 computeNormal()
+{
+ return( fileBumpTexture(bump_texture, bump_amount, mono_average, tmp2, vec2( 0.0, 1.0 ), vec2( 0.0, 1.0 ), wrap_repeat, wrap_repeat, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmp1 = textureCoordinateInfo( texCoord0, tangent, binormal );
+ tmp2 = transformCoordinate( rotationTranslationScale( vec3( 0.0, 0.0, 0.0 ), vec3( 0.0, 0.0, 0.0 ), tiling ), tmp1 );
+ tmp3 = fileTexture(roughness_texture, vec3( roughness_map_offset ), vec3( roughness_map_scale ), mono_luminance, tmp2, vec2( 0.0, 1.0 ), vec2( 0.0, 1.0 ), wrap_repeat, wrap_repeat, gamma_default ).mono;
+ ftmp0 = fileTexture(reflection_texture, vec3( reflection_map_offset ), vec3( reflection_map_scale ), mono_luminance, tmp2, vec2( 0.0, 1.0 ), vec2( 0.0, 1.0 ), wrap_repeat, wrap_repeat, gamma_default ).mono;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( ftmp0, metal_color.rgb, layers[0].layer, layers[0].base, alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="4"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/aluminum_textured_aniso.shader b/Studio/Content/Material Library/aluminum_textured_aniso.shader
new file mode 100644
index 0000000..ed9fb88
--- /dev/null
+++ b/Studio/Content/Material Library/aluminum_textured_aniso.shader
@@ -0,0 +1,263 @@
+<Material name="aluminum_anisotropic" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" description="Refractive index of the material" type="Float" default="8.000000" category="Material"/>
+ <Property formalName="Diffuse Map" name="reflection_texture" description="Reflection texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/concentric_milled_steel.png" category="Material"/>
+ <Property formalName="Reflection Map Offset" name="reflection_map_offset" hidden="True" type="Float" default="1.000000" description="Reflection texture value offset" category="Material"/>
+ <Property formalName="Reflection Map Scale" name="reflection_map_scale" hidden="True" type="Float" default="1.000000" description="Reflection texture value scale" category="Material"/>
+ <Property formalName="Tiling" name="tiling" type="Float2" default="1 1" description="Texture Tiling size" category="Material"/>
+ <Property formalName="Roughness Map Offset" name="roughness_map_offset" hidden="True" type="Float" default="0.000000" description="Roughness texture value offset" category="Material"/>
+ <Property formalName="Roughness Map Scale" name="roughness_map_scale" hidden="True" type="Float" default="1.000000" description="Roughness texture value scale" category="Material"/>
+ <Property formalName="Anisotropy" name="anisotropy" type="Float" default="0.800000" description="Anisotropy" category="Material"/>
+ <Property formalName="Anisotropy Map" name="aniso_rot_texture" description="Anisotropy rot texture of the material" type="Texture" filter="linear" minfilter="linear" clamp="repeat" usage="anisotropy" default="./maps/materials/concentric_milled_steel_aniso.png" category="Material"/>
+ <Property formalName="Roughness Map Offset" name="aniso_tex_color_offset" hidden="True" type="Float" default="0.000000" description="Roughness texture value offset" category="Material"/>
+ <Property formalName="Roughness Map Scale" name="aniso_tex_color_scale" hidden="True" type="Float" default="1.000000" description="Roughness texture value scale" category="Material"/>
+ <Property formalName="Anisotropy Tiling" name="aniso_tiling" description="Anisotropy Tiling" type="Float2" default="1 1" category="Material"/>
+ <Property formalName="Base Weight" name="base_weight" description="Base weight" hidden="True" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/concentric_milled_steel.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" min="0" max="2" default="0.000000" description="Scale value for bump amount" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+struct anisotropy_return
+{
+ float roughness_u;
+ float roughness_v;
+ vec3 tangent_u;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+texture_coordinate_info tmp4;
+texture_return tmp5;
+anisotropy_return tmp7;
+vec3 tmp8;
+vec3 tmp10;
+float ftmp0;
+float ftmp1;
+vec3 ftmp2;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "fileTexture.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "anisotropyConversion.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, ftmp0, ftmp1, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, ftmp0, ftmp1 );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, ftmp0, ftmp1, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, ftmp0, ftmp1 );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( tmp10 );
+}
+
+void computeTemporaries()
+{
+ tmp2 = textureCoordinateInfo( texCoord0, tangent, binormal );
+ tmp4 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( tiling[0], tiling[1], 1.000000 ) ), tmp2 );
+ tmp5 = fileTexture(reflection_texture, vec3( reflection_map_offset ), vec3( reflection_map_scale ), mono_luminance, tmp4, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear );
+ tmp7 = anisotropyConversion( fileTexture(reflection_texture, vec3( roughness_map_offset ), vec3( roughness_map_scale ), mono_luminance, tmp4, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).mono, anisotropy, fileTexture(aniso_rot_texture, vec3( aniso_tex_color_offset ), vec3( aniso_tex_color_scale ), mono_luminance, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( aniso_tiling[0], aniso_tiling[1], 1.000000 ) ), tmp2 ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).mono, tangent, false );
+ tmp8 = tmp5.tint;
+ tmp10 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp4, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = tmp7.roughness_u;
+ ftmp1 = tmp7.roughness_v;
+ ftmp2 = tmp7.tangent_u;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( base_weight, vec4( tmp8, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp10, vec3( material_ior ), tmp5.mono, vec4( tmp8, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( ftmp2, cross(tmp10, ftmp2), tmp10 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/asphalt.shader b/Studio/Content/Material Library/asphalt.shader
new file mode 100644
index 0000000..da37ed4
--- /dev/null
+++ b/Studio/Content/Material Library/asphalt.shader
@@ -0,0 +1,236 @@
+<Material name="asphalt" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="2.000000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.250000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflect_texture" description="Reflectivity texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/asphalt_bump.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="4 4" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/asphalt.png" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/asphalt_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="7.000000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 tmp5;
+vec3 ftmp0;
+vec3 ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fileTexture.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp5, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp5, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp5 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = fileTexture(reflect_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp1 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp1, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp5, vec3( material_ior ), 1.000000, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/bamboo_natural_matte.shader b/Studio/Content/Material Library/bamboo_natural_matte.shader
new file mode 100644
index 0000000..28ab611
--- /dev/null
+++ b/Studio/Content/Material Library/bamboo_natural_matte.shader
@@ -0,0 +1,236 @@
+<Material name="bamboo_natural_matte" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.500000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.300000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflect_texture" description="Reflectivity texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/bamboo_natural_spec.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="4 4" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/bamboo_natural.png" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/bamboo_natural_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="0.150000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 tmp5;
+vec3 ftmp0;
+vec3 ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fileTexture.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp5, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp5, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp5 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = fileTexture(reflect_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp1 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp1, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp5, vec3( material_ior ), 1.000000, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/bamboo_natural_matte_emissive.shader b/Studio/Content/Material Library/bamboo_natural_matte_emissive.shader
new file mode 100644
index 0000000..7096c14
--- /dev/null
+++ b/Studio/Content/Material Library/bamboo_natural_matte_emissive.shader
@@ -0,0 +1,242 @@
+<Material name="bamboo_natural_matte_emissive" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.500000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.300000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflect_texture" description="Reflectivity texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/bamboo_natural_spec.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="4 4" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/bamboo_natural.png" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/bamboo_natural_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="0.150000" description="Value determining the bumpiness" category="Material"/>
+ <Property formalName="Intensity" name="intensity" description="Emission intensity" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Emission Color" name="emission_color" description="Color of the emission" type="Color" default="0 0 0" category="Material"/>
+ <Property formalName="Emissive Map" name="emissive_texture" description="Emissive texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive" default="./maps/materials/emissive.png" category="Material"/>
+ <Property formalName="Emissive Mask Map" name="emissive_mask_texture" description="Emissive mask texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive_mask" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+texture_coordinate_info tmp3;
+vec3 tmp6;
+vec3 ftmp0;
+vec3 ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fileTexture.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3(1.0) * vec3( vec3( ( intensity *( emission_color.rgb * fileTexture(emissive_texture, vec3(0.0), vec3(1.0), mono_alpha, transformCoordinate( rotationTranslationScale( vec3(0.0), vec3(0.0), vec3(1.0) ), tmp2 ), vec2(0.0, 1.0), vec2(0.0, 1.0), wrap_repeat, wrap_repeat, gamma_default ).tint ) ) ) ) );
+}
+
+void computeFrontLayerColor(in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor)
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp6, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp6, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = textureCoordinateInfo( texCoord0, tangent, binormal );
+ tmp3 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), tmp2 );
+ tmp6 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = fileTexture(reflect_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp1 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp1, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp6, vec3( material_ior ), 1.000000, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp6, tangent), tmp6 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp6, tangent), tmp6 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/carbon_fiber.shader b/Studio/Content/Material Library/carbon_fiber.shader
new file mode 100644
index 0000000..fd3eca3
--- /dev/null
+++ b/Studio/Content/Material Library/carbon_fiber.shader
@@ -0,0 +1,271 @@
+<Material name="carbon_fiber" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Coat ior" name="coat_ior" type="Float" default="1.250000" description="Index of refraction of the coating layer" category="Material"/>
+ <Property formalName="Coat Glossy weight" name="coat_weight" type="Float" min="0.000000" max="1.000000" default="1.000000" description="Strength of the coating's glossy reflection.\n0 = no reflection\n1 = maximum reflectivity" category="Material"/>
+ <Property formalName="Coat Roughness" name="coat_roughness" type="Float" min="0.000000" max="1.000000" default="0.000000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Base ior" name="base_ior" type="Float" default="1.650000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glossy Weight" name="base_weight" type="Float" min="0.000000" max="1.000000" default="0.500000" description="Strength of glossy reflection at incident angles.\n0 = no reflection\n1 = maximum reflectivity" category="Material"/>
+ <Property formalName="Roughness" name="base_roughness" type="Float" min="0.000000" max="1.000000" default="0.100000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Anisotropy" name="anisotropy" type="Float" min="0.000000" max="0.999000" default="0.800000" description="The anisotropy of the roughness" category="Material"/>
+ <Property formalName="Anisotropy Map" description="Anisotropy transformation texture" name="anisotropy_rotation_texture" type="Texture" filter="linear" minfilter="linear" clamp="repeat" usage="anisotropy" default="./maps/materials/carbon_fiber_aniso.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="12 12" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflect_texture" description="Reflectivity texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/carbon_fiber_spec.png" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/carbon_fiber.png" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/carbon_fiber_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="1.000000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct anisotropy_return
+{
+ float roughness_u;
+ float roughness_v;
+ vec3 tangent_u;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+anisotropy_return tmp4;
+vec3 tmp6;
+float ftmp0;
+float ftmp1;
+vec3 ftmp2;
+vec3 ftmp3;
+vec3 ftmp4;
+ vec4 tmpShadowTerm;
+
+layer_result layers[3];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "fileTexture.glsllib"
+#include "anisotropyConversion.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, coat_roughness, coat_roughness, scatter_reflect );
+
+ layers[1].layer += tmpShadowTerm * microfacetBSDF( layers[1].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, ftmp0, ftmp1, scatter_reflect );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp6, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, coat_roughness, coat_roughness );
+
+ layers[1].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[1].tanFrame, varWorldPos, lightIdx, viewDir, ftmp0, ftmp1 );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[2].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, coat_roughness, coat_roughness, scatter_reflect );
+
+ layers[1].layer += tmpShadowTerm * microfacetSampledBSDF( layers[1].tanFrame, viewDir, ftmp0, ftmp1, scatter_reflect );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp6, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, coat_roughness, coat_roughness );
+
+ layers[1].layer += tmpShadowTerm * sampleGlossyAniso( layers[1].tanFrame, viewDir, ftmp0, ftmp1 );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * sampleDiffuse( layers[2].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp3 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp4 = anisotropyConversion( base_roughness, anisotropy, fileTexture(anisotropy_rotation_texture, vec3( 0, 0, 0 ), vec3( 3.14, 3.14, 3.14 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).mono, tangent, false );
+ tmp6 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = tmp4.roughness_u;
+ ftmp1 = tmp4.roughness_v;
+ ftmp2 = fileTexture(reflect_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp3 = tmp4.tangent_u;
+ ftmp4 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp4, 1.0).rgb, layers[2].layer, layers[2].base, alpha );
+ color = fresnelLayer( tmp6, vec3( base_ior ), base_weight, vec4( ftmp2, 1.0).rgb, layers[1].layer, color, color.a );
+ color = fresnelLayer( normal, vec3( coat_ior ), coat_weight, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( ftmp3, cross(tmp6, ftmp3), tmp6 ) );
+ layers[2].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[2].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[2].tanFrame = orthoNormalize( mat3( tangent, cross(tmp6, tangent), tmp6 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="3"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/carbon_fiber_emissive.shader b/Studio/Content/Material Library/carbon_fiber_emissive.shader
new file mode 100644
index 0000000..fae9b7b
--- /dev/null
+++ b/Studio/Content/Material Library/carbon_fiber_emissive.shader
@@ -0,0 +1,277 @@
+<Material name="carbon_fiber" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Coat ior" name="coat_ior" type="Float" default="1.250000" description="Index of refraction of the coating layer" category="Material"/>
+ <Property formalName="Coat Glossy weight" name="coat_weight" type="Float" min="0.000000" max="1.000000" default="1.000000" description="Strength of the coating's glossy reflection.\n0 = no reflection\n1 = maximum reflectivity" category="Material"/>
+ <Property formalName="Coat Roughness" name="coat_roughness" type="Float" min="0.000000" max="1.000000" default="0.000000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Base ior" name="base_ior" type="Float" default="1.650000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glossy Weight" name="base_weight" type="Float" min="0.000000" max="1.000000" default="0.500000" description="Strength of glossy reflection at incident angles.\n0 = no reflection\n1 = maximum reflectivity" category="Material"/>
+ <Property formalName="Roughness" name="base_roughness" type="Float" min="0.000000" max="1.000000" default="0.100000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Anisotropy" name="anisotropy" type="Float" min="0.000000" max="0.999000" default="0.800000" description="The anisotropy of the roughness" category="Material"/>
+ <Property formalName="Anisotropy Map" description="Anisotropy transformation texture" name="anisotropy_rotation_texture" type="Texture" filter="linear" minfilter="linear" clamp="repeat" usage="anisotropy" default="./maps/materials/carbon_fiber_aniso.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="12 12" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflect_texture" description="Reflectivity texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/carbon_fiber_spec.png" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/carbon_fiber.png" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/carbon_fiber_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="1.000000" description="Value determining the bumpiness" category="Material"/>
+ <Property formalName="Intensity" name="intensity" description="Emission intensity" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Emission Color" name="emission_color" description="Color of the emission" type="Color" default="0 0 0" category="Material"/>
+ <Property formalName="Emissive Map" name="emissive_texture" description="Emissive texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive" default="./maps/materials/emissive.png" category="Material"/>
+ <Property formalName="Emissive Mask Map" name="emissive_mask_texture" description="Emissive mask texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive_mask" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct anisotropy_return
+{
+ float roughness_u;
+ float roughness_v;
+ vec3 tangent_u;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+texture_coordinate_info tmp4;
+anisotropy_return tmp5;
+vec3 tmp7;
+float ftmp0;
+float ftmp1;
+vec3 ftmp2;
+vec3 ftmp3;
+vec3 ftmp4;
+ vec4 tmpShadowTerm;
+
+layer_result layers[3];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "fileTexture.glsllib"
+#include "anisotropyConversion.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 1.0, 1.0, 1.0) * vec3( vec3( ( intensity *( emission_color.rgb * fileTexture(emissive_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( 1.000000, 1.000000, 1.000000 ) ), tmp3 ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).tint ) ) ) ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, coat_roughness, coat_roughness, scatter_reflect );
+
+ layers[1].layer += tmpShadowTerm * microfacetBSDF( layers[1].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, ftmp0, ftmp1, scatter_reflect );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp7, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, coat_roughness, coat_roughness );
+
+ layers[1].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[1].tanFrame, varWorldPos, lightIdx, viewDir, ftmp0, ftmp1 );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[2].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, coat_roughness, coat_roughness, scatter_reflect );
+
+ layers[1].layer += tmpShadowTerm * microfacetSampledBSDF( layers[1].tanFrame, viewDir, ftmp0, ftmp1, scatter_reflect );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp7, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, coat_roughness, coat_roughness );
+
+ layers[1].layer += tmpShadowTerm * sampleGlossyAniso( layers[1].tanFrame, viewDir, ftmp0, ftmp1 );
+
+ layers[2].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[2].layer += tmpShadowTerm * sampleDiffuse( layers[2].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp3 = textureCoordinateInfo( texCoord0, tangent, binormal );
+ tmp4 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), tmp3 );
+ tmp5 = anisotropyConversion( base_roughness, anisotropy, fileTexture(anisotropy_rotation_texture, vec3( 0, 0, 0 ), vec3( 3.14, 3.14, 3.14 ), mono_luminance, tmp4, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).mono, tangent, false );
+ tmp7 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp4, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = tmp5.roughness_u;
+ ftmp1 = tmp5.roughness_v;
+ ftmp2 = fileTexture(reflect_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp4, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp3 = tmp5.tangent_u;
+ ftmp4 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp4, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp4, 1.0).rgb, layers[2].layer, layers[2].base, alpha );
+ color = fresnelLayer( tmp7, vec3( base_ior ), base_weight, vec4( ftmp2, 1.0).rgb, layers[1].layer, color, color.a );
+ color = fresnelLayer( normal, vec3( coat_ior ), coat_weight, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( ftmp3, cross(tmp7, ftmp3), tmp7 ) );
+ layers[2].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[2].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[2].tanFrame = orthoNormalize( mat3( tangent, cross(tmp7, tangent), tmp7 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="3"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/carpaint_blue_standard.shader b/Studio/Content/Material Library/carpaint_blue_standard.shader
new file mode 100644
index 0000000..b28a814
--- /dev/null
+++ b/Studio/Content/Material Library/carpaint_blue_standard.shader
@@ -0,0 +1,231 @@
+<Material name="carpaint_blue_standard" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Gradient1D Map" description="Gradient texture of the material" hidden="True" name="randomGradient1D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient1D.png"/>
+ <Property formalName="Gradient2D Map" description="Gradient texture of the material" hidden="True" name="randomGradient2D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient2D.png"/>
+ <Property formalName="Gradient3D Map" description="Gradient texture of the material" hidden="True" name="randomGradient3D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient3D.png"/>
+ <Property formalName="Gradient4D Map" description="Gradient texture of the material" hidden="True" name="randomGradient4D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient4D.png"/>
+ <Property formalName="Unit Conversion Factor" name="unit_conversion" description="Unit conversion factor" type="Float" default="1.000000" category="Other"/>
+ <Property formalName="Normal Base Color" name="normal_base_color" description="Base color of the material" type="Color" default="0.0427 0.1538 0.353" category="Material"/>
+ <Property formalName="Grazing Base Color" name="grazing_base_color" description="Grazing base color of the material" type="Color" default="0.0021 0.0074 0.017" category="Material"/>
+ <Property formalName="Orange Peel Amount" name="peel_amount" description="Orange peel bumpiness of the material" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Orange Peel Size" name="peel_size" description="Orange peel bump size" type="Float" default="0.100000" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define texture_coordinate_uvw 0
+#define texture_coordinate_world 1
+#define texture_coordinate_object 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 ftmp0;
+float ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "cube.glsllib"
+#include "random255.glsllib"
+#include "perlinNoise.glsllib"
+#include "perlinNoiseBumpTexture.glsllib"
+#include "coordinateSource.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "miNoise.glsllib"
+#include "flakeNoiseTexture.glsllib"
+#include "directionalFactor.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, 0.000000, 0.000000, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 ) );
+ layers[1].layer += tmpShadowTerm * microfacetBSDF( layers[1].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, 0.200000, 0.200000, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, 0.000000, 0.000000 );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx ) );
+ layers[1].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[1].tanFrame, varWorldPos, lightIdx, viewDir, 0.200000, 0.200000 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, 0.000000, 0.000000, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor );
+ layers[1].layer += tmpShadowTerm * microfacetSampledBSDF( layers[1].tanFrame, viewDir, 0.200000, 0.200000, scatter_reflect );
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, 0.000000, 0.000000 );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, sampleDiffuse( layers[1].tanFrame ) * aoFactor );
+ layers[1].layer += tmpShadowTerm * sampleGlossyAniso( layers[1].tanFrame, viewDir, 0.200000, 0.200000 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = coordinateSource(texture_coordinate_object, 0 );
+ ftmp0 = perlinNoiseBumpTexture( tmp2, ( peel_amount/10.000000 ), ( peel_size*unit_conversion ), false, false, 0.000000, 1, false, vec3( 0.000000, 0.000000, 0.000000 ), 1.000000, 0.000000, 1.000000, normal );
+ ftmp1 = flakeNoiseTexture(tmp2, 0.000000, ( unit_conversion*0.002000 ), 0.350000 ).mono;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( ftmp1, vec4( vec3( 1, 0.117, 0.087 ), 1.0).rgb, layers[1].layer, layers[1].base * vec4( vec3( 1, 1, 1 ), 1.0), alpha );
+ color = fresnelLayer( ftmp0, vec3( 1.5, 1.5, 1.5 ), 1.000000, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(ftmp0, tangent), ftmp0 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/carpaint_color_peel_2_layer.shader b/Studio/Content/Material Library/carpaint_color_peel_2_layer.shader
new file mode 100644
index 0000000..c435306
--- /dev/null
+++ b/Studio/Content/Material Library/carpaint_color_peel_2_layer.shader
@@ -0,0 +1,255 @@
+<Material name="carpaint_color_peel_2_layer" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Gradient1D Map" description="Gradient texture of the material" hidden="True" name="randomGradient1D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient1D.png"/>
+ <Property formalName="Gradient2D Map" description="Gradient texture of the material" hidden="True" name="randomGradient2D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient2D.png"/>
+ <Property formalName="Gradient3D Map" description="Gradient texture of the material" hidden="True" name="randomGradient3D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient3D.png"/>
+ <Property formalName="Gradient4D Map" description="Gradient texture of the material" hidden="True" name="randomGradient4D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient4D.png"/>
+ <Property formalName="Coat Index of refraction" name="coating_ior" description="Index of refraction of the coat" type="Float" default="1.500000" category="Top coat"/>
+ <Property formalName="Coat Weight" name="coat_weight" description="Weight of the coat" type="Float" default="1.000000" category="Top coat"/>
+ <Property formalName="Coat Micro roughness" name="coat_roughness" description="Micro roughness of the coat" type="Float" default="0.000000" category="Top coat"/>
+ <Property formalName="Coat Color" name="coat_color" description="Base color of the coat" type="Color" default="1 1 1" category="Top coat"/>
+ <Property formalName="Flake Weight" name="flake_intensity" description="Intensity of the flakes" type="Float" default="0.500000" category="Flake layer"/>
+ <Property formalName="Flake size" name="flake_size" description="Size of the flakes" type="Float" default="0.002000" category="Flake layer"/>
+ <Property formalName="Flake amount" name="flake_amount" description="Amount of flakes" type="Float" default="0.220000" category="Flake layer"/>
+ <Property formalName="Flake Micro roughness" name="flake_roughness" description="Micro roughness of the flakes" type="Float" default="0.200000" category="Flake layer"/>
+ <Property formalName="Flake Color" name="flake_color" type="Color" description="Base color of the flakes" default="1 0.7 0.02" category="Flake layer"/>
+ <Property formalName="Base Color" name="base_color" type="Color" description="Base color of the material" default="0.1 0.001 0.001" category="Base paint"/>
+ <Property formalName="Flake Macro roughness" name="flake_bumpiness" description="Bumpiness of the flakes" type="Float" default="0.600000" category="Flake layer"/>
+ <Property formalName="Orange Peel Size" name="peel_size" description="Orange peel bump size" type="Float" default="1.000000" category="Top coat"/>
+ <Property formalName="Orange Peel Amount" name="peel_amount" description="Orange peel amount" type="Float" default="0.010000" category="Top coat"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define texture_coordinate_uvw 0
+#define texture_coordinate_world 1
+#define texture_coordinate_object 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 ftmp0;
+vec3 ftmp1;
+float ftmp2;
+float ftmp3;
+ vec4 tmpShadowTerm;
+
+layer_result layers[3];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "cube.glsllib"
+#include "random255.glsllib"
+#include "perlinNoise.glsllib"
+#include "perlinNoiseBumpTexture.glsllib"
+#include "coordinateSource.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "miNoise.glsllib"
+#include "flakeNoiseBumpTexture.glsllib"
+#include "flakeNoiseTexture.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, coat_roughness, coat_roughness, scatter_reflect );
+
+ layers[1].layer += tmpShadowTerm * microfacetBSDF( layers[1].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, flake_roughness, flake_roughness, scatter_reflect );
+
+ layers[2].base += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+ layers[2].layer += tmpShadowTerm * microfacetBSDF( layers[2].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, 0.300000, 0.300000, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, coat_roughness, coat_roughness );
+
+ layers[1].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[1].tanFrame, varWorldPos, lightIdx, viewDir, flake_roughness, flake_roughness );
+
+ layers[2].base += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[2].tanFrame, varWorldPos, lightIdx );
+ layers[2].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[2].tanFrame, varWorldPos, lightIdx, viewDir, 0.300000, 0.300000 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, coat_roughness, coat_roughness, scatter_reflect );
+
+ layers[1].layer += tmpShadowTerm * microfacetSampledBSDF( layers[1].tanFrame, viewDir, flake_roughness, flake_roughness, scatter_reflect );
+
+ layers[2].base += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+ layers[2].layer += tmpShadowTerm * microfacetSampledBSDF( layers[2].tanFrame, viewDir, 0.300000, 0.300000, scatter_reflect );
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, coat_roughness, coat_roughness );
+
+ layers[1].layer += tmpShadowTerm * sampleGlossyAniso( layers[1].tanFrame, viewDir, flake_roughness, flake_roughness );
+
+ layers[2].base += tmpShadowTerm * sampleDiffuse( layers[2].tanFrame ) * aoFactor;
+ layers[2].layer += tmpShadowTerm * sampleGlossyAniso( layers[2].tanFrame, viewDir, 0.300000, 0.300000 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0f : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = coordinateSource(texture_coordinate_object, 0 );
+ ftmp0 = perlinNoiseBumpTexture( tmp2, peel_amount, peel_size, false, false, 0.000000, 1, false, vec3( 0.000000, 0.000000, 0.000000 ), 1.000000, 0.000000, 1.000000, normal );
+ ftmp1 = flakeNoiseBumpTexture(tmp2, flake_size, flake_bumpiness, normal );
+ ftmp2 = flakeNoiseTexture(tmp2, flake_intensity, flake_size, flake_amount ).mono;
+ ftmp3 = flakeNoiseTexture(tmp2, 0.000000, 0.002200, 1.000000 ).mono;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( ftmp3, vec4( vec3( 1, 0.01, 0.01 ), 1.0).rgb, layers[2].layer, layers[2].base * vec4( base_color.rgb, 1.0), alpha );
+ color = weightedLayer( ftmp2, flake_color.rgb, layers[1].layer, color, color.a );
+ color = fresnelLayer( ftmp0, vec3( coating_ior ), coat_weight, coat_color.rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(ftmp0, tangent), ftmp0 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(ftmp1, tangent), ftmp1 ) );
+ layers[2].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[2].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[2].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="3"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/carpaint_yellow_standard.shader b/Studio/Content/Material Library/carpaint_yellow_standard.shader
new file mode 100644
index 0000000..7e79511
--- /dev/null
+++ b/Studio/Content/Material Library/carpaint_yellow_standard.shader
@@ -0,0 +1,231 @@
+<Material name="carpaint_yellow_standard" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Gradient1D Map" description="Gradient texture of the material" hidden="True" name="randomGradient1D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient1D.png"/>
+ <Property formalName="Gradient2D Map" description="Gradient texture of the material" hidden="True" name="randomGradient2D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient2D.png"/>
+ <Property formalName="Gradient3D Map" description="Gradient texture of the material" hidden="True" name="randomGradient3D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient3D.png"/>
+ <Property formalName="Gradient4D Map" description="Gradient texture of the material" hidden="True" name="randomGradient4D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient4D.png"/>
+ <Property formalName="Unit Conversion Factor" name="unit_conversion" description="Unit conversion factor" type="Float" default="1.000000" category="Other"/>
+ <Property formalName="Normal Base Color" name="normal_base_color" description="Base color of the material" type="Color" default="0.659 0.4261 0.0494" category="Material"/>
+ <Property formalName="Grazing Base Color" name="grazing_base_color" description="Grazing base color of the material" type="Color" default="0.393 0.2654 0.0549" category="Material"/>
+ <Property formalName="Orange Peel Amount" name="peel_amount" description="Orange peel bumpiness of the material" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Orange Peel Size" name="peel_size" description="Orange peel bump size" type="Float" default="0.100000" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define texture_coordinate_uvw 0
+#define texture_coordinate_world 1
+#define texture_coordinate_object 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 ftmp0;
+float ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "cube.glsllib"
+#include "random255.glsllib"
+#include "perlinNoise.glsllib"
+#include "perlinNoiseBumpTexture.glsllib"
+#include "coordinateSource.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "miNoise.glsllib"
+#include "flakeNoiseTexture.glsllib"
+#include "directionalFactor.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, 0.000000, 0.000000, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 ) );
+ layers[1].layer += tmpShadowTerm * microfacetBSDF( layers[1].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, 0.200000, 0.200000, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, 0.000000, 0.000000 );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx ) );
+ layers[1].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[1].tanFrame, varWorldPos, lightIdx, viewDir, 0.200000, 0.200000 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, 0.000000, 0.000000, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor );
+ layers[1].layer += tmpShadowTerm * microfacetSampledBSDF( layers[1].tanFrame, viewDir, 0.200000, 0.200000, scatter_reflect );
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, 0.000000, 0.000000 );
+
+ layers[1].base += tmpShadowTerm * directionalFactor( normal, viewDir, normal_base_color.rgb, grazing_base_color.rgb, 5.000000, sampleDiffuse( layers[1].tanFrame ) * aoFactor );
+ layers[1].layer += tmpShadowTerm * sampleGlossyAniso( layers[1].tanFrame, viewDir, 0.200000, 0.200000 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = coordinateSource(texture_coordinate_object, 0 );
+ ftmp0 = perlinNoiseBumpTexture( tmp2, ( peel_amount/10.000000 ), ( peel_size*unit_conversion ), false, false, 0.000000, 1, false, vec3( 0.000000, 0.000000, 0.000000 ), 1.000000, 0.000000, 1.000000, normal );
+ ftmp1 = flakeNoiseTexture(tmp2, 0.000000, ( unit_conversion*0.002000 ), 0.350000 ).mono;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( ftmp1, vec4( vec3( 1, 0.117, 0.087 ), 1.0).rgb, layers[1].layer, layers[1].base * vec4( vec3( 1, 1, 1 ), 1.0), alpha );
+ color = fresnelLayer( ftmp0, vec3( 1.5, 1.5, 1.5 ), 1.000000, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(ftmp0, tangent), ftmp0 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/concrete.shader b/Studio/Content/Material Library/concrete.shader
new file mode 100644
index 0000000..1bcdadc
--- /dev/null
+++ b/Studio/Content/Material Library/concrete.shader
@@ -0,0 +1,235 @@
+<Material name="concrete" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.500000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.350000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/concrete_plain_bump.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="5 2" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/concrete_plain.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="6.000000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+vec3 tmp6;
+vec3 ftmp0;
+vec3 ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fileTexture.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp6, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp6, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp3 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp6 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = fileTexture(bump_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp1 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp1, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp6, vec3( material_ior ), 1.000000, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp6, tangent), tmp6 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp6, tangent), tmp6 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/copper.shader b/Studio/Content/Material Library/copper.shader
new file mode 100644
index 0000000..cf9e1ad
--- /dev/null
+++ b/Studio/Content/Material Library/copper.shader
@@ -0,0 +1,178 @@
+<Material name="copper" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.000000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Metal Color" name="metal_color" type="Color" default="0.805 0.395 0.305" description="Color of the material" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 0
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = fresnelLayer( normal, vec3( 25.65, 25.65, 25.65 ), 1.000000, metal_color.rgb, layers[0].layer, layers[0].base, alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="4"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/leather_smoothed_black.shader b/Studio/Content/Material Library/leather_smoothed_black.shader
new file mode 100644
index 0000000..8d45669
--- /dev/null
+++ b/Studio/Content/Material Library/leather_smoothed_black.shader
@@ -0,0 +1,236 @@
+<Material name="leather_smoothed_black" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.400000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.300000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflect_texture" description="Reflectivity texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/smooth_black_leather_spec.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="4 4" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/smooth_black_leather.png" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/smooth_black_leather_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="2.000000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 tmp5;
+vec3 ftmp0;
+vec3 ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fileTexture.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp5, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp5, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp5 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = fileTexture(reflect_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp1 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp1, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp5, vec3( material_ior ), 1.000000, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/maps/materials/art_paper_normal.png b/Studio/Content/Material Library/maps/materials/art_paper_normal.png
new file mode 100644
index 0000000..7a26860
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/art_paper_normal.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/art_paper_trans.png b/Studio/Content/Material Library/maps/materials/art_paper_trans.png
new file mode 100644
index 0000000..8465c27
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/art_paper_trans.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/asphalt.png b/Studio/Content/Material Library/maps/materials/asphalt.png
new file mode 100644
index 0000000..f04e623
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/asphalt.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/asphalt_bump.png b/Studio/Content/Material Library/maps/materials/asphalt_bump.png
new file mode 100644
index 0000000..002ba88
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/asphalt_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/bamboo_natural.png b/Studio/Content/Material Library/maps/materials/bamboo_natural.png
new file mode 100644
index 0000000..1e35a39
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/bamboo_natural.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/bamboo_natural_bump.png b/Studio/Content/Material Library/maps/materials/bamboo_natural_bump.png
new file mode 100644
index 0000000..07e813a
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/bamboo_natural_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/bamboo_natural_spec.png b/Studio/Content/Material Library/maps/materials/bamboo_natural_spec.png
new file mode 100644
index 0000000..b139113
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/bamboo_natural_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/brushed_a.png b/Studio/Content/Material Library/maps/materials/brushed_a.png
new file mode 100644
index 0000000..c0602ca
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/brushed_a.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/brushed_a_full_contrast_scratched.png b/Studio/Content/Material Library/maps/materials/brushed_a_full_contrast_scratched.png
new file mode 100644
index 0000000..93c9ab8
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/brushed_a_full_contrast_scratched.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/brushed_a_scratched_50_percent.png b/Studio/Content/Material Library/maps/materials/brushed_a_scratched_50_percent.png
new file mode 100644
index 0000000..f132e25
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/brushed_a_scratched_50_percent.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/brushed_chrome.png b/Studio/Content/Material Library/maps/materials/brushed_chrome.png
new file mode 100644
index 0000000..d262e81
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/brushed_chrome.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/brushed_chrome_spec.png b/Studio/Content/Material Library/maps/materials/brushed_chrome_spec.png
new file mode 100644
index 0000000..93fca97
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/brushed_chrome_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/brushed_full_contrast.png b/Studio/Content/Material Library/maps/materials/brushed_full_contrast.png
new file mode 100644
index 0000000..a7864fe
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/brushed_full_contrast.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/brushed_full_contrast_inverted.png b/Studio/Content/Material Library/maps/materials/brushed_full_contrast_inverted.png
new file mode 100644
index 0000000..928a0d6
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/brushed_full_contrast_inverted.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/bubinga.png b/Studio/Content/Material Library/maps/materials/bubinga.png
new file mode 100644
index 0000000..59d65d2
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/bubinga.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/bubinga_bump.png b/Studio/Content/Material Library/maps/materials/bubinga_bump.png
new file mode 100644
index 0000000..cdb722c
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/bubinga_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/bubinga_spec.png b/Studio/Content/Material Library/maps/materials/bubinga_spec.png
new file mode 100644
index 0000000..ebc7d65
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/bubinga_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/carbon_fiber.png b/Studio/Content/Material Library/maps/materials/carbon_fiber.png
new file mode 100644
index 0000000..69e2ba5
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/carbon_fiber.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/carbon_fiber_aniso.png b/Studio/Content/Material Library/maps/materials/carbon_fiber_aniso.png
new file mode 100644
index 0000000..8bd7a30
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/carbon_fiber_aniso.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/carbon_fiber_bump.png b/Studio/Content/Material Library/maps/materials/carbon_fiber_bump.png
new file mode 100644
index 0000000..e1cca48
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/carbon_fiber_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/carbon_fiber_spec.png b/Studio/Content/Material Library/maps/materials/carbon_fiber_spec.png
new file mode 100644
index 0000000..5c50a00
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/carbon_fiber_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/concentric_milled_steel.png b/Studio/Content/Material Library/maps/materials/concentric_milled_steel.png
new file mode 100644
index 0000000..56101f2
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/concentric_milled_steel.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/concentric_milled_steel_aniso.png b/Studio/Content/Material Library/maps/materials/concentric_milled_steel_aniso.png
new file mode 100644
index 0000000..f6071d9
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/concentric_milled_steel_aniso.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/concrete_plain.png b/Studio/Content/Material Library/maps/materials/concrete_plain.png
new file mode 100644
index 0000000..fb16072
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/concrete_plain.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/concrete_plain_bump.png b/Studio/Content/Material Library/maps/materials/concrete_plain_bump.png
new file mode 100644
index 0000000..e20f1cd
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/concrete_plain_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing.png b/Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing.png
new file mode 100644
index 0000000..ab36204
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing_normal.png b/Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing_normal.png
new file mode 100644
index 0000000..3b96bbf
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/cyclone_mesh_fencing_normal.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/emissive.png b/Studio/Content/Material Library/maps/materials/emissive.png
new file mode 100644
index 0000000..599b1cc
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/emissive.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/emissive_mask.png b/Studio/Content/Material Library/maps/materials/emissive_mask.png
new file mode 100644
index 0000000..599b1cc
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/emissive_mask.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/gentle_noise.png b/Studio/Content/Material Library/maps/materials/gentle_noise.png
new file mode 100644
index 0000000..a163c82
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/gentle_noise.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/granite_black.png b/Studio/Content/Material Library/maps/materials/granite_black.png
new file mode 100644
index 0000000..629cc91
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/granite_black.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/granite_yellow.png b/Studio/Content/Material Library/maps/materials/granite_yellow.png
new file mode 100644
index 0000000..cdf8c19
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/granite_yellow.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/grunge_b.png b/Studio/Content/Material Library/maps/materials/grunge_b.png
new file mode 100644
index 0000000..fa43782
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/grunge_b.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/grunge_b1.png b/Studio/Content/Material Library/maps/materials/grunge_b1.png
new file mode 100644
index 0000000..c4e4429
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/grunge_b1.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/grunge_d.png b/Studio/Content/Material Library/maps/materials/grunge_d.png
new file mode 100644
index 0000000..c62a5a0
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/grunge_d.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/grunge_texture_01.png b/Studio/Content/Material Library/maps/materials/grunge_texture_01.png
new file mode 100644
index 0000000..d256719
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/grunge_texture_01.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/mahogany.png b/Studio/Content/Material Library/maps/materials/mahogany.png
new file mode 100644
index 0000000..f438a63
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/mahogany.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/mahogany_bump.png b/Studio/Content/Material Library/maps/materials/mahogany_bump.png
new file mode 100644
index 0000000..3f4f0d0
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/mahogany_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/mahogany_floorboards.png b/Studio/Content/Material Library/maps/materials/mahogany_floorboards.png
new file mode 100644
index 0000000..c9fc35a
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/mahogany_floorboards.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/mahogany_floorboards_bump.png b/Studio/Content/Material Library/maps/materials/mahogany_floorboards_bump.png
new file mode 100644
index 0000000..5a54372
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/mahogany_floorboards_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/mahogany_floorboards_spec.png b/Studio/Content/Material Library/maps/materials/mahogany_floorboards_spec.png
new file mode 100644
index 0000000..0784bb8
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/mahogany_floorboards_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/mahogany_spec.png b/Studio/Content/Material Library/maps/materials/mahogany_spec.png
new file mode 100644
index 0000000..c82144d
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/mahogany_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/metal_mesh.png b/Studio/Content/Material Library/maps/materials/metal_mesh.png
new file mode 100644
index 0000000..f722347
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/metal_mesh.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/metal_mesh_bump.png b/Studio/Content/Material Library/maps/materials/metal_mesh_bump.png
new file mode 100644
index 0000000..756d9c4
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/metal_mesh_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/metal_mesh_spec.png b/Studio/Content/Material Library/maps/materials/metal_mesh_spec.png
new file mode 100644
index 0000000..7444604
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/metal_mesh_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/paper_diffuse.png b/Studio/Content/Material Library/maps/materials/paper_diffuse.png
new file mode 100644
index 0000000..3fbd653
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/paper_diffuse.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/paper_trans.png b/Studio/Content/Material Library/maps/materials/paper_trans.png
new file mode 100644
index 0000000..6bf7c50
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/paper_trans.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/powdercoat_bump_01.png b/Studio/Content/Material Library/maps/materials/powdercoat_bump_01.png
new file mode 100644
index 0000000..769f549
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/powdercoat_bump_01.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/randomGradient1D.png b/Studio/Content/Material Library/maps/materials/randomGradient1D.png
new file mode 100644
index 0000000..0d37132
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/randomGradient1D.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/randomGradient2D.png b/Studio/Content/Material Library/maps/materials/randomGradient2D.png
new file mode 100644
index 0000000..8b60ca6
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/randomGradient2D.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/randomGradient3D.png b/Studio/Content/Material Library/maps/materials/randomGradient3D.png
new file mode 100644
index 0000000..c22e1ba
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/randomGradient3D.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/randomGradient4D.png b/Studio/Content/Material Library/maps/materials/randomGradient4D.png
new file mode 100644
index 0000000..ad282d8
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/randomGradient4D.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/shadow.png b/Studio/Content/Material Library/maps/materials/shadow.png
new file mode 100644
index 0000000..599b1cc
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/shadow.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/smooth_black_leather.png b/Studio/Content/Material Library/maps/materials/smooth_black_leather.png
new file mode 100644
index 0000000..ce82635
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/smooth_black_leather.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/smooth_black_leather_bump.png b/Studio/Content/Material Library/maps/materials/smooth_black_leather_bump.png
new file mode 100644
index 0000000..1c71529
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/smooth_black_leather_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/smooth_black_leather_spec.png b/Studio/Content/Material Library/maps/materials/smooth_black_leather_spec.png
new file mode 100644
index 0000000..7e289c1
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/smooth_black_leather_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/spherical_checker.png b/Studio/Content/Material Library/maps/materials/spherical_checker.png
new file mode 100644
index 0000000..e42394d
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/spherical_checker.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/studded_rubber_bump.png b/Studio/Content/Material Library/maps/materials/studded_rubber_bump.png
new file mode 100644
index 0000000..b751476
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/studded_rubber_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/teak.png b/Studio/Content/Material Library/maps/materials/teak.png
new file mode 100644
index 0000000..5d1a63b
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/teak.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/teak_bump.png b/Studio/Content/Material Library/maps/materials/teak_bump.png
new file mode 100644
index 0000000..cd2496a
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/teak_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/teak_spec.png b/Studio/Content/Material Library/maps/materials/teak_spec.png
new file mode 100644
index 0000000..8751288
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/teak_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/walnut.png b/Studio/Content/Material Library/maps/materials/walnut.png
new file mode 100644
index 0000000..abe5704
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/walnut.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/walnut_bump.png b/Studio/Content/Material Library/maps/materials/walnut_bump.png
new file mode 100644
index 0000000..a6434fd
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/walnut_bump.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/walnut_spec.png b/Studio/Content/Material Library/maps/materials/walnut_spec.png
new file mode 100644
index 0000000..b03a1dc
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/walnut_spec.png
Binary files differ
diff --git a/Studio/Content/Material Library/maps/materials/white_marble.png b/Studio/Content/Material Library/maps/materials/white_marble.png
new file mode 100644
index 0000000..472b33e
--- /dev/null
+++ b/Studio/Content/Material Library/maps/materials/white_marble.png
Binary files differ
diff --git a/Studio/Content/Material Library/mesh_fence.shader b/Studio/Content/Material Library/mesh_fence.shader
new file mode 100644
index 0000000..df5d817
--- /dev/null
+++ b/Studio/Content/Material Library/mesh_fence.shader
@@ -0,0 +1,236 @@
+<Material name="mesh_fence" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="15.000000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glossiness" name="glossy_weight" type="Float" min="0.000000" max="1.000000" default="0.500000" description="Reflectivity factor at incident angles" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.250000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/cyclone_mesh_fencing.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="3 3" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/cyclone_mesh_fencing_normal.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="2.000000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+texture_return tmp4;
+vec3 tmp5;
+vec3 ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "tangentSpaceNormalTexture.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp5, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp5, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( tmp4.mono );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp3 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp4 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb );
+ tmp5 = tangentSpaceNormalTexture( bump_texture, bump_amount, false, false, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat );
+ ftmp0 = tmp4.tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp0, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp5, vec3( material_ior ), glossy_weight, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="13"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/metal_mesh_fine.shader b/Studio/Content/Material Library/metal_mesh_fine.shader
new file mode 100644
index 0000000..f4e2d9f
--- /dev/null
+++ b/Studio/Content/Material Library/metal_mesh_fine.shader
@@ -0,0 +1,234 @@
+<Material name="metal_mesh_fine" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="15.000000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.000000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/metal_mesh.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="75 75" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/metal_mesh_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="13.000000" description="Value determining the bumpiness" category="Material"/>
+ <Property formalName="Cutout Opacity Map" name="cutout_opacity_texture" description="Cutout opacity texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="cutout" default="./maps/materials/metal_mesh_spec.png" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 tmp4;
+vec3 tmp6;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp6, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp6, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( fileTexture(cutout_opacity_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).mono );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp4 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmp6 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( tmp4, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp6, vec3( material_ior ), 1.000000, vec4( tmp4, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp6, tangent), tmp6 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp6, tangent), tmp6 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="13"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/paper_artistic.shader b/Studio/Content/Material Library/paper_artistic.shader
new file mode 100644
index 0000000..6c7b075
--- /dev/null
+++ b/Studio/Content/Material Library/paper_artistic.shader
@@ -0,0 +1,257 @@
+<Material name="paper_artistic" version="1.0">
+ <MetaData >
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Translucency Falloff" name="uTranslucentFalloff" description="Falloff of the translucency of the\nmaterial" type="Float" default="0.0" category="Material"/>
+ <Property formalName="Diffuse Light Bend" name="uDiffuseLightWrap" description="Diffuse light bend of the material" type="Float" min="0.0" max="1.0" default="0.0" category="Material"/>
+ <Property formalName="Transparency" name="uOpacity" description="Transparency of the material" type="Float" min="0.0" max="100.0" default="100.0" category="Material"/>
+ <Property formalName="Transmission Weight" name="transmission_weight" type="Float" default="0.200000" description="Value determining transmission" category="Material"/>
+ <Property formalName="Transmission Map" name="transmission_texture" description="Transmission texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="transmission" default="./maps/materials/art_paper_trans.png" category="Textures"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="5 5" description="Scaling of the textures" category="Textures"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/paper_diffuse.png" category="Textures"/>
+ <Property formalName="Reflection Weight" name="reflection_weight" type="Float" default="0.800000" description="Value determining reflection" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/art_paper_normal.png" category="Textures"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="0.500000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define color_layer_blend 0
+#define color_layer_add 1
+#define color_layer_multiply 2
+#define color_layer_screen 3
+#define color_layer_overlay 4
+#define color_layer_brightness 5
+#define color_layer_color 6
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct bsdf_component
+{
+ float weight;
+ vec4 component;
+};
+
+
+struct color_layer
+{
+ vec3 layer_color;
+ float weight;
+ int mode;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp1;
+vec3 tmp2;
+vec3 ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "tangentSpaceNormalTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "normalizedMix.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "diffuseTransmissionBSDF.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileTexture.glsllib"
+#include "blendColorLayers.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * normalizedMix( bsdf_component[2]( bsdf_component(transmission_weight, diffuseTransmissionBSDF( -normal, lightDir, viewDir, lightDiffuse, vec4( ftmp0, 1.0), uTranslucentFalloff, uDiffuseLightWrap )) ,bsdf_component(reflection_weight, diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 )) ) );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * normalizedMix( bsdf_component[2]( bsdf_component(transmission_weight, lightDiffuse * sampleAreaDiffuseTransmissive( layers[0].tanFrame, varWorldPos, lightIdx, vec4( ftmp0, 1.0), uTranslucentFalloff, uDiffuseLightWrap )) ,bsdf_component(reflection_weight, lightDiffuse * sampleAreaDiffuse( layers[0].tanFrame, varWorldPos, lightIdx )) ) );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].base += tmpShadowTerm * sampleDiffuse( layers[0].tanFrame ) * aoFactor;
+
+#endif
+}
+
+void computeFrontLayerRnmColor( in vec3 normal, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+#if QT3DS_ENABLE_RNM
+ layers[0].base += tmpShadowTerm * diffuseRNM( normal, rnmX, rnmY, rnmZ );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerRnmColor( in vec3 normal, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+#if QT3DS_ENABLE_RNM
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( tangentSpaceNormalTexture( bump_texture, bump_amount, false, false, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat ) );
+}
+
+void computeTemporaries()
+{
+ tmp1 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp2 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ ftmp0 = blendColorLayers( color_layer[1]( color_layer(blendColorLayers( color_layer[1]( color_layer(fileTexture(transmission_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint, 1.000000, color_layer_blend ) ), tmp2, mono_average ).tint, 1.000000, color_layer_multiply ) ), vec3( 1, 1, 1 ), mono_average ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = layers[0].base * vec4( tmp2, 1.0);
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( tangentFrame( normal, varWorldPos ) );
+}
+
+vec4 computeOpacity(in vec4 color)
+{
+ vec4 rgba = color;
+ rgba.a = uOpacity * 0.01;
+ return rgba;
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="257"/>
+ <LayerKey count="1"/>
+ <Pass >
+ <Blending source="SrcAlpha" dest="OneMinusSrcAlpha"/>
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/paper_office.shader b/Studio/Content/Material Library/paper_office.shader
new file mode 100644
index 0000000..6f183a5
--- /dev/null
+++ b/Studio/Content/Material Library/paper_office.shader
@@ -0,0 +1,255 @@
+<Material name="paper_office" version="1.0">
+ <MetaData >
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Translucency Falloff" name="uTranslucentFalloff" description="Falloff of the translucency of the\nmaterial" type="Float" default="0.0" category="Material"/>
+ <Property formalName="Diffuse Light Bend" name="uDiffuseLightWrap" description="Diffuse light bend of the material" type="Float" min="0.0" max="1.0" default="0.0" category="Material"/>
+ <Property formalName="Transparency" name="uOpacity" description="Transparency of the material" type="Float" min="0.0" max="100.0" default="100.0" category="Material"/>
+ <Property formalName="Transmission Weight" name="transmission_weight" type="Float" default="0.200000" description="Value determining transmission" category="Material"/>
+ <Property formalName="Transmission Map" name="transmission_texture" description="Transmission texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="transmission" default="./maps/materials/paper_trans.png" category="Textures"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="1 1" description="Scaling of the textures" category="Textures"/>
+ <Property formalName="Paper Color" name="paper_color" type="Color" default="0.531 0.531 0.531" description="Color of the paper" category="Material"/>
+ <Property formalName="Reflection Weight" name="reflection_weight" type="Float" default="0.800000" description="Value determining reflection" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/paper_diffuse.png" category="Textures"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="0.500000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define color_layer_blend 0
+#define color_layer_add 1
+#define color_layer_multiply 2
+#define color_layer_screen 3
+#define color_layer_overlay 4
+#define color_layer_brightness 5
+#define color_layer_color 6
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct bsdf_component
+{
+ float weight;
+ vec4 component;
+};
+
+
+struct color_layer
+{
+ vec3 layer_color;
+ float weight;
+ int mode;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp1;
+vec3 ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "normalizedMix.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "diffuseTransmissionBSDF.glsllib"
+#include "fileTexture.glsllib"
+#include "blendColorLayers.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * normalizedMix( bsdf_component[2]( bsdf_component(transmission_weight, diffuseTransmissionBSDF( -normal, lightDir, viewDir, lightDiffuse, vec4( ftmp0, 1.0), uTranslucentFalloff, uDiffuseLightWrap )) ,bsdf_component(reflection_weight, diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 )) ) );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * normalizedMix( bsdf_component[2]( bsdf_component(transmission_weight, lightDiffuse * sampleAreaDiffuseTransmissive( layers[0].tanFrame, varWorldPos, lightIdx, vec4( ftmp0, 1.0), uTranslucentFalloff, uDiffuseLightWrap )) ,bsdf_component(reflection_weight, lightDiffuse * sampleAreaDiffuse( layers[0].tanFrame, varWorldPos, lightIdx )) ) );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].base += tmpShadowTerm * sampleDiffuse( layers[0].tanFrame ) * aoFactor;
+
+#endif
+}
+
+void computeFrontLayerRnmColor( in vec3 normal, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+#if QT3DS_ENABLE_RNM
+ layers[0].base += tmpShadowTerm * diffuseRNM( normal, rnmX, rnmY, rnmZ );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerRnmColor( in vec3 normal, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+#if QT3DS_ENABLE_RNM
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( fileBumpTexture(bump_texture, bump_amount, mono_average, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmp1 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ ftmp0 = blendColorLayers( color_layer[1]( color_layer(blendColorLayers( color_layer[1]( color_layer(fileTexture(transmission_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp1, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).tint, 0.700000, color_layer_blend ) ), paper_color.rgb, mono_average ).tint, 1.000000, color_layer_multiply ) ), vec3( 1, 1, 1 ), mono_average ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = layers[0].base * vec4( paper_color.rgb, 1.0);
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( tangentFrame( normal, varWorldPos ) );
+}
+
+vec4 computeOpacity(in vec4 color)
+{
+ vec4 rgba = color;
+ rgba.a = uOpacity * 0.01;
+ return rgba;
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="257"/>
+ <LayerKey count="1"/>
+ <Pass >
+ <Blending source="SrcAlpha" dest="OneMinusSrcAlpha"/>
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/plastic_structured_red.shader b/Studio/Content/Material Library/plastic_structured_red.shader
new file mode 100644
index 0000000..1e6b798
--- /dev/null
+++ b/Studio/Content/Material Library/plastic_structured_red.shader
@@ -0,0 +1,204 @@
+<Material name="plastic_structured_red" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Gradient1D Map" description="Gradient texture of the material" hidden="True" name="randomGradient1D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient1D.png"/>
+ <Property formalName="Gradient2D Map" description="Gradient texture of the material" hidden="True" name="randomGradient2D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient2D.png"/>
+ <Property formalName="Gradient3D Map" description="Gradient texture of the material" hidden="True" name="randomGradient3D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient3D.png"/>
+ <Property formalName="Gradient4D Map" description="Gradient texture of the material" hidden="True" name="randomGradient4D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient4D.png"/>
+ <Property formalName="Index of Refraction" name="material_ior" description="Refractive index of the material" type="Float" default="1.800000" category="Material"/>
+ <Property formalName="Roughness" name="roughness" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" type="Float" default="0.250000" category="Material"/>
+ <Property formalName="Color" name="diffuse_color" description="Color of the material" type="Color" default="0.451 0.04 0.035" category="Material"/>
+ <Property formalName="Texture Scale" name="texture_scaling" description="Scaling of the texture" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_factor" description="Bumpiness of the material" type="Float" default="0.400000" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define texture_coordinate_uvw 0
+#define texture_coordinate_world 1
+#define texture_coordinate_object 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "cube.glsllib"
+#include "random255.glsllib"
+#include "perlinNoise.glsllib"
+#include "perlinNoiseBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "coordinateSource.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[0].tanFrame, varWorldPos, lightIdx );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleDiffuse( layers[0].tanFrame ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( perlinNoiseBumpTexture( transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( ( texture_scaling*10.000000 ) ) ), coordinateSource(texture_coordinate_object, 0 ) ), bump_factor, 1.000000, false, false, 0.000000, 6, true, vec3( 0.000000, 0.000000, 0.000000 ), 0.070000, 0.300000, 1.000000, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = fresnelLayer( normal, vec3( material_ior ), 0.350000, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, layers[0].base * vec4( diffuse_color.rgb, 1.0), alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/plastic_structured_red_emissive.shader b/Studio/Content/Material Library/plastic_structured_red_emissive.shader
new file mode 100644
index 0000000..f85719e
--- /dev/null
+++ b/Studio/Content/Material Library/plastic_structured_red_emissive.shader
@@ -0,0 +1,228 @@
+<Material name="plastic_structured_red_emissive" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Gradient1D Map" description="Gradient texture of the material" hidden="True" name="randomGradient1D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient1D.png"/>
+ <Property formalName="Gradient2D Map" description="Gradient texture of the material" hidden="True" name="randomGradient2D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient2D.png"/>
+ <Property formalName="Gradient3D Map" description="Gradient texture of the material" hidden="True" name="randomGradient3D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient3D.png"/>
+ <Property formalName="Gradient4D Map" description="Gradient texture of the material" hidden="True" name="randomGradient4D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient4D.png"/>
+ <Property formalName="Index of Refraction" name="material_ior" description="Refractive index of the material" type="Float" default="1.800000" category="Material"/>
+ <Property formalName="Roughness" name="roughness" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" type="Float" default="0.250000" category="Material"/>
+ <Property formalName="Color" name="diffuse_color" description="Color of the material" type="Color" default="0.451 0.04 0.035" category="Material"/>
+ <Property formalName="Intensity" name="intensity" description="Emission intensity" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Emission Color" name="emission_color" description="Color of the emission" type="Color" default="0 0 0" category="Material"/>
+ <Property formalName="Emissive Map" name="emissive_texture" description="Emissive texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive" default="./maps/materials/emissive.png" category="Material"/>
+ <Property formalName="Texture Scale" name="texture_scaling" description="Scaling of the texture" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_factor" description="Bumpiness of the material" type="Float" default="0.400000" category="Material"/>
+ <Property formalName="Emissive Mask Map" name="emissive_mask_texture" description="Emissive mask texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive_mask" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define texture_coordinate_uvw 0
+#define texture_coordinate_world 1
+#define texture_coordinate_object 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "cube.glsllib"
+#include "random255.glsllib"
+#include "perlinNoise.glsllib"
+#include "perlinNoiseBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "coordinateSource.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+#include "monoChannel.glsllib"
+#include "fileTexture.glsllib"
+#include "textureCoordinateInfo.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 1.0, 1.0, 1.0) * vec3( vec3( ( intensity * ( emission_color.rgb * fileTexture(emissive_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( 1.000000, 1.000000, 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).tint ) ) ) ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[0].tanFrame, varWorldPos, lightIdx );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleDiffuse( layers[0].tanFrame ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( perlinNoiseBumpTexture( transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( ( texture_scaling*10.000000 ) ) ), coordinateSource(texture_coordinate_object, 0 ) ), bump_factor, 1.000000, false, false, 0.000000, 6, true, vec3( 0.000000, 0.000000, 0.000000 ), 0.070000, 0.300000, 1.000000, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = fresnelLayer( normal, vec3( material_ior ), 0.350000, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, layers[0].base * vec4( diffuse_color.rgb, 1.0), alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/porcelain.shader b/Studio/Content/Material Library/porcelain.shader
new file mode 100644
index 0000000..8b5978e
--- /dev/null
+++ b/Studio/Content/Material Library/porcelain.shader
@@ -0,0 +1,181 @@
+<Material name="porcelain" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.500000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glossiness" name="glossy_weight" type="Float" min="0.000000" max="1.000000" default="1.000000" description="Strength of glossy reflection" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.150000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Porcelain Color" name="porcelain_color" type="Color" default="0.92 0.92 0.92" description="Color of the material" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 0
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[0].tanFrame, varWorldPos, lightIdx );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleDiffuse( layers[0].tanFrame ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = fresnelLayer( normal, vec3( material_ior ), glossy_weight, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, layers[0].base * vec4( porcelain_color.rgb, 1.0), alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/powder_coat.shader b/Studio/Content/Material Library/powder_coat.shader
new file mode 100644
index 0000000..c26fa04
--- /dev/null
+++ b/Studio/Content/Material Library/powder_coat.shader
@@ -0,0 +1,221 @@
+<Material name="powder_coat" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" description="Refractive index of the material" type="Float" default="5.000000" category="Material"/>
+ <Property formalName="Glossiness" name="glossy_weight" description="Reflectivity of the material at the\nincident lighting angles.\n0.0 = no reflection\n1.0 = totally reflective" type="Float" default="0.500000" category="Material"/>
+ <Property formalName="Roughness" name="roughness" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Reflectivity" name="reflectivity" description="Reflectivity of the material" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Diffuse Weight" name="diffuse_weight" description="Diffuse weight of the material" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Powdercoat Color" name="powdercoat_diffuse_color" description="Color of the powdercoat" type="Color" default="0.046 0.046 0.054" category="Material"/>
+ <Property formalName="Bump Map" name="powdercoat_bump_texture" description="Bump texture of the powdercoat" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/powdercoat_bump_01.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_factor" description="Bumpiness of the material" type="Float" default="2.000000" category="Material"/>
+ <Property formalName="Texture Scale" name="texture_scaling" description="Scaling of the texture" type="Vector" default="3 3 3" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+vec3 ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( fileBumpTexture(powdercoat_bump_texture, bump_factor, mono_average, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), texture_scaling ), textureCoordinateInfo( texCoord0, tangent, binormal ) ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal ) );
+}
+
+void computeTemporaries()
+{
+ ftmp0 = vec3( reflectivity );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( diffuse_weight, powdercoat_diffuse_color.rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( normal, vec3( material_ior ), glossy_weight, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/powder_coat_emissive.shader b/Studio/Content/Material Library/powder_coat_emissive.shader
new file mode 100644
index 0000000..4056079
--- /dev/null
+++ b/Studio/Content/Material Library/powder_coat_emissive.shader
@@ -0,0 +1,256 @@
+<Material name="powder_coat_emisssive" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" description="Refractive index of the material" type="Float" default="5.000000" category="Material"/>
+ <Property formalName="Glossiness" name="glossy_weight" description="Reflectivity of the material at the\nincident lighting angles.\n0.0 = no reflection\n1.0 = totally reflective" type="Float" default="0.500000" category="Material"/>
+ <Property formalName="Roughness" name="roughness" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Reflectivity" name="reflectivity" description="Reflectivity of the material" type="Float" default="0.100000" category="Material"/>
+ <Property formalName="Diffuse Weight" name="diffuse_weight" description="Diffuse weight of the material" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Powdercoat Color" name="powdercoat_diffuse_color" description="Color of the powdercoat" type="Color" default="0.046 0.046 0.054" category="Material"/>
+ <Property formalName="Emissive Map" name="emissive_texture" description="Emissive texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive" default="./maps/materials/emissive.png" category="Material"/>
+ <Property formalName="Emission Color" name="emission_color" description="Color of the emission" type="Color" default="0 0 0" category="Material"/>
+ <Property formalName="Intensity" name="intensity" description="Emission intensity" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Bump Map" name="powdercoat_bump_texture" description="Bump texture of the powdercoat" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/powdercoat_bump_01.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_factor" description="Bumpiness of the material" type="Float" default="2.000000" category="Material"/>
+ <Property formalName="Texture Scale" name="texture_scaling" description="Scaling of the texture" type="Vector" default="3 3 3" category="Material"/>
+ <Property formalName="Emissive Mask Map" name="emissive_mask_texture" description="Emissive mask texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive_mask" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+vec3 ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+#include "fileTexture.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 1.0, 1.0, 1.0) * vec3( vec3( ( ( fileTexture(emissive_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( 1.000000, 1.000000, 1.000000 ) ), tmp3 ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).tint * emission_color.rgb ) * intensity ) ) ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+void computeFrontLayerRnmColor( in vec3 normal, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+#if QT3DS_ENABLE_RNM
+ layers[0].layer += tmpShadowTerm * glossyRNM( normal, rnmX, rnmY, rnmZ );
+
+ layers[1].layer += tmpShadowTerm * diffuseRNM( normal, rnmX, rnmY, rnmZ );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerRnmColor( in vec3 normal, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+#if QT3DS_ENABLE_RNM
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( fileBumpTexture(powdercoat_bump_texture, bump_factor, mono_average, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), texture_scaling ), tmp3 ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmp3 = textureCoordinateInfo( texCoord0, tangent, binormal );
+ ftmp0 = vec3( reflectivity );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( diffuse_weight, powdercoat_diffuse_color.rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( normal, vec3( material_ior ), glossy_weight, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(normal, tangent), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/rubber_studded_black.shader b/Studio/Content/Material Library/rubber_studded_black.shader
new file mode 100644
index 0000000..a2af7d0
--- /dev/null
+++ b/Studio/Content/Material Library/rubber_studded_black.shader
@@ -0,0 +1,219 @@
+<Material name="rubber_studded_black" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.800000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glossiness" name="glossy_weight" type="Float" min="0.000000" max="1.000000" default="0.500000" description="Reflectivity of the material at the\nincident lighting angles.\n0.0 = no reflection\n1.0 = totally reflective" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.250000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Base color" name="base_color" type="Color" default="0 0 0" description="Color of the material" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/studded_rubber_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="9.000000" description="Value determining the bumpiness" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="10 7" description="Scaling of the textures" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+// temporary declarations
+vec3 tmp4;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp4, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp4, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp4 = fileBumpTexture(bump_texture, bump_amount, mono_average, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.0, base_color.rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp4, vec3( material_ior ), glossy_weight, vec3(1.0), layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp4, tangent), tmp4 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp4, tangent), tmp4 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/rubber_studded_emissive.shader b/Studio/Content/Material Library/rubber_studded_emissive.shader
new file mode 100644
index 0000000..de45c93
--- /dev/null
+++ b/Studio/Content/Material Library/rubber_studded_emissive.shader
@@ -0,0 +1,238 @@
+<Material name="rubber_studded_emissive" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.800000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glossiness" name="glossy_weight" type="Float" min="0.000000" max="1.000000" default="0.500000" description="Reflectivity of the material at the\nincident lighting angles.\n0.0 = no reflection\n1.0 = totally reflective" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.250000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Base color" name="base_color" type="Color" default="0 0 0" description="Color of the material" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/studded_rubber_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="9.000000" description="Value determining the bumpiness" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="10 7" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Intensity" name="intensity" description="Emission intensity" type="Float" default="1.000000" category="Material"/>
+ <Property formalName="Emission Color" name="emission_color" description="Color of the emission" type="Color" default="0 0 0" category="Material"/>
+ <Property formalName="Emissive Map" name="emissive_texture" description="Emissive texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive" default="./maps/materials/emissive.png" category="Material"/>
+ <Property formalName="Emissive Map Mask" name="emissive_mask_texture" description="Emissive mask texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="emissive_mask" default="./maps/materials/emissive_mask.png" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+vec3 tmp5;
+texture_coordinate_info tmp6;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+#include "fileTexture.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 1.0, 1.0, 1.0) * vec3( vec3( ( intensity * ( emission_color.rgb * ( fileTexture(emissive_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, tmp6, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).tint*fileTexture(emissive_mask_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, tmp6, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_default ).tint ) ) ) ) ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp5, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp5, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp3 = textureCoordinateInfo( texCoord0, tangent, binormal );
+ tmp5 = fileBumpTexture(bump_texture, bump_amount, mono_average, transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), tmp3 ), vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ tmp6 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( 1.000000, 1.000000, 1.000000 ) ), tmp3 );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, base_color.rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp5, vec3( material_ior ), glossy_weight, vec4( vec3( 1, 1, 1 ), 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/simple_glass.shader b/Studio/Content/Material Library/simple_glass.shader
new file mode 100644
index 0000000..09aa2c9
--- /dev/null
+++ b/Studio/Content/Material Library/simple_glass.shader
@@ -0,0 +1,197 @@
+<Material name="simple_glass" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Fresnel Power" name="uFresnelPower" description="Fresnel power of the material" type="Float" default="1.0" category="Material"/>
+ <Property formalName="Minimum Opacity" name="uMinOpacity" description="Minimum opacity of the material" type="Float" default="0.5" category="Material"/>
+ <Property formalName="Reflectivity" name="reflectivity_amount" type="Float" min="0.000000" max="1.000000" default="1.000000" description="Reflectivity factor" category="Material"/>
+ <Property formalName="Glass ior" name="glass_ior" hidden="True" type="Float" default="1.100000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glass Color" name="glass_color" type="Color" default="0.9 0.9 0.9" description="Color of the material" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 0
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+vec3 ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "abbeNumberIOR.glsllib"
+#include "fresnelLayer.glsllib"
+#include "refraction.glsllib"
+
+bool evalTwoSided()
+{
+ return( true );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, 0.000000, 0.000000, scatter_reflect_transmit );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, 0.000000, 0.000000 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, 0.000000, 0.000000, scatter_reflect_transmit );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, 0.000000, 0.000000 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( true ? 1.0 : luminance( vec3( abbeNumberIOR(glass_ior, 0.000000 ) ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ ftmp0 = vec3( reflectivity_amount );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = layers[0].base * vec4( ftmp0, 1.0);
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( tangentFrame( normal, varWorldPos ) );
+}
+
+vec4 computeGlass(in vec3 normal, in float materialIOR, in float alpha, in vec4 color)
+{
+ vec4 rgba = color;
+ float ratio = simpleFresnel( normal, materialIOR, uFresnelPower );
+ vec3 absorb_color = ( log( glass_color.rgb )/-1.000000 );
+ // prevent log(0) -> inf number issue
+ if ( isinf(absorb_color.r) ) absorb_color.r = 1.0;
+ if ( isinf(absorb_color.g) ) absorb_color.g = 1.0;
+ if ( isinf(absorb_color.b) ) absorb_color.b = 1.0;
+ rgba.rgb = mix(vec3(1.0) - absorb_color, rgba.rgb * (vec3(1.0) - absorb_color), ratio);
+ rgba.a = mix(uMinOpacity, alpha, ratio);
+ return rgba;
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="36"/>
+ <LayerKey count="1"/>
+ <Pass >
+ <Blending source="SrcAlpha" dest="OneMinusSrcAlpha"/>
+ <RenderState name="CullFace"/>
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/steel_milled_concentric.shader b/Studio/Content/Material Library/steel_milled_concentric.shader
new file mode 100644
index 0000000..3cf9585
--- /dev/null
+++ b/Studio/Content/Material Library/steel_milled_concentric.shader
@@ -0,0 +1,237 @@
+<Material name="steel_milled_concentric" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="20.000000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/concentric_milled_steel.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="8 5" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Anisotropy" name="anisotropy" type="Float" min="0.010000" max="100.000000" default="0.800000" description="The anisotropy of the roughness" category="Material"/>
+ <Property formalName="Anisotropy Rot Map" name="anisotropy_rot_texture" description="Anisotropy rot texture of the material" type="Texture" filter="linear" minfilter="linear" clamp="repeat" usage="anisotropy" default="./maps/materials/concentric_milled_steel_aniso.png" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct anisotropy_return
+{
+ float roughness_u;
+ float roughness_v;
+ vec3 tangent_u;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp3;
+texture_return tmp4;
+anisotropy_return tmp5;
+float ftmp0;
+float ftmp1;
+vec3 ftmp2;
+vec3 ftmp3;
+vec3 ftmp4;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "monoChannel.glsllib"
+#include "fileTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "anisotropyConversion.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDF( normal, lightDir, viewDir, lightDiffuse, 0.000000 );
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, ftmp0, ftmp1, scatter_reflect );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[0].tanFrame, varWorldPos, lightIdx );
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, ftmp0, ftmp1 );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * diffuseReflectionBSDFEnvironment( normal, 0.000000 ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, ftmp0, ftmp1, scatter_reflect );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleDiffuse( layers[0].tanFrame ) * aoFactor;
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, ftmp0, ftmp1 );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp3 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp4 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear );
+ tmp5 = anisotropyConversion( tmp4.mono, anisotropy, fileTexture(anisotropy_rot_texture, vec3( -1, -1, -1 ), vec3( 1, 1, 1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).mono, tangent, false );
+ ftmp0 = tmp5.roughness_u;
+ ftmp1 = tmp5.roughness_v;
+ ftmp2 = fileTexture(diffuse_texture, vec3( 1, 1, 1 ), vec3( -1, -1, -1 ), mono_luminance, tmp3, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp3 = tmp5.tangent_u;
+ ftmp4 = tmp4.tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = fresnelLayer( normal, vec3( material_ior ), 1.000000, vec4( ftmp2, 1.0).rgb, layers[0].layer, layers[0].base * vec4( ftmp4, 1.0), alpha );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( ftmp3, cross(normal, ftmp3), normal ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="1"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/thin_glass_frosted.shader b/Studio/Content/Material Library/thin_glass_frosted.shader
new file mode 100644
index 0000000..b66c4cd
--- /dev/null
+++ b/Studio/Content/Material Library/thin_glass_frosted.shader
@@ -0,0 +1,485 @@
+<Material name="thin_glass_frosted" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Fresnel Power" name="uFresnelPower" description="Fresnel power of the material" type="Float" default="1.0" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="1.000000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Reflectivity" name="reflectivity_amount" type="Float" min="0.000000" max="1.000000" default="0.100000" description="Reflectivity factor" category="Material"/>
+ <Property formalName="Glass ior" name="glass_ior" type="Float" default="1.100000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glass Color" name="glass_color" type="Color" default="0.9 0.9 0.9" description="Color of the material" category="Material"/>
+ <Property formalName="Glass Bump map" name="glass_bump" description="Additional bump map for surface" type="Texture" clamp="repeat" category="Material"/>
+ <Property formalName="Glass Bump Factor" name="glass_bfactor" description="Bump map factor" default="0.0" category="Material"/>
+ <Property formalName="Glass Bump Inside" name="glass_binside" description="Use bump map for internal lighting only" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Blur Width" name="blur_size" type="Float" default="8" min="1" max="50" description="Amount of blurring behind the glass" category="Material"/>
+ <Property formalName="Gradient1D Map" description="Gradient texture of the material" hidden="True" name="randomGradient1D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient1D.png"/>
+ <Property formalName="Gradient2D Map" description="Gradient texture of the material" hidden="True" name="randomGradient2D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient2D.png"/>
+ <Property formalName="Gradient3D Map" description="Gradient texture of the material" hidden="True" name="randomGradient3D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient3D.png"/>
+ <Property formalName="Gradient4D Map" description="Gradient texture of the material" hidden="True" name="randomGradient4D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient4D.png"/>
+ <Property formalName="Refract Depth" name="refract_depth" type="Float" default="5" min="0" max="20" description="Degree of bend from refraction. Allows\ncontrol of refraction without affecting\nlighting" category="Refraction"/>
+ <Property formalName="Bump Coordinates" name="bumpCoords" description="Bump coordinates of the refraction" type="Vector" default="1 1 1" category="Refraction"/>
+ <Property formalName="Bump Scale" name="bumpScale" description="Scale of the bumps" type="Float" min="0.000000" max="5.000000" default="0.500000" category="Refraction"/>
+ <Property formalName="Bump Bands" name="bumpBands" description="Bump bands of the refraction" type="Long" min="1.000000" max="10.000000" default="1" category="Refraction"/>
+ <Property formalName="Light Position" name="intLightPos" type="Float2" description="Position in UV space of the band-light" default="0.5 0" category="Translucent Lighting"/>
+ <Property formalName="Light Color" name="intLightCol" type="Color" description="Color of the band-light" default="0.9 0.9 0.9" category="Translucent Lighting"/>
+ <Property formalName="Light Brightness" name="intLightBrt" type="Float" description="Brightness of the band-light" default="0" category="Translucent Lighting"/>
+ <Property formalName="Light Rotation" name="intLightRot" type="Float" description="Angle the lightsource is oriented.\nBand is perpendicular to this" default="0" min="0" max="360" category="Translucent Lighting"/>
+ <Property formalName="Falloff rate" name="intLightFall" type="Float" description="Rate at which intensity drops off" default="2.0" category="Translucent Lighting"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader name="MAIN">
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define texture_coordinate_uvw 0
+#define texture_coordinate_world 1
+#define texture_coordinate_object 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 0
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+// temporary declarations
+texture_coordinate_info tmp0;
+texture_coordinate_info tmp1;
+vec3 ftmp0;
+vec3 ftmp1;
+vec3 ftmp2;
+vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "cube.glsllib"
+#include "random255.glsllib"
+#include "perlinNoise.glsllib"
+#include "perlinNoiseBumpTexture.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "coordinateSource.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "abbeNumberIOR.glsllib"
+#include "average.glsllib"
+#include "perlinNoiseTexture.glsllib"
+#include "fresnelLayer.glsllib"
+#include "refraction.glsllib"
+
+uniform sampler2D refractiveTexture;
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect_transmit );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect_transmit );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( abbeNumberIOR(glass_ior, 0.000000 ) ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ if ( glass_bfactor > 0.0 )
+ {
+ ftmp2 = fileBumpTexture(glass_bump, glass_bfactor, mono_average, tmp0, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ if (!glass_binside) { normal = ftmp2; }
+ }
+
+ return( perlinNoiseBumpTexture( tmp1, bumpScale, 1.000000, false, false, 0.000000, bumpBands, false, vec3( 0.000000, 0.000000, 0.000000 ), 0.5, 0.0, 1.000000, normal ) );
+}
+
+void computeTemporaries()
+{
+ //tmp0 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), refractCoords ), coordinateSource(texture_coordinate_world, 0 ) );
+ //ftmp1 = perlinNoiseBumpTexture( tmp0, refractScale, 1.000000, false, false, 0.000000, 1, false, vec3( 0.000000, 0.000000, 0.000000 ), 1.0, 0.5, 1.000000, viewDir );
+ tmp0 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), bumpCoords ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp1 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), bumpCoords ), coordinateSource(texture_coordinate_world, 0 ) );
+ ftmp1 = viewDir;
+ ftmp0 = vec3( reflectivity_amount );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = layers[0].base * vec4( ftmp0, 1.0);
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( tangentFrame( normal, varWorldPos ) );
+}
+
+vec3 getRefractUV( in vec2 baseUV, in vec3 normal, in float materialIOR, in float refractDepth )
+{
+ // Real honest-to-goodness refraction!
+ vec3 refractedDir = refract( -viewDir, normal, 1.0 / materialIOR );
+ float thickness = refractDepth / clamp( dot(viewDir, normal), 0.0001, 1.0 );
+
+ // This will do an "AA" version of that loss due to critical angle and TIR
+ // fakes the same effect than using the glsl refract.
+ float weight = smoothstep( 0.0, 1.0, abs(dot(viewDir, normal)) * 100.0 );
+
+ // Trace out the refracted ray and the straight view ray
+ refractedDir *= thickness;
+ vec3 rawDir = -viewDir * thickness;
+
+ vec3 displace = refractedDir - rawDir;
+ vec3 newUV = vec3(baseUV + displace.xy, weight);
+ return newUV;
+}
+
+vec4 doFakeInnerLight( in vec3 normal, in vec3 absorb_color )
+{
+ vec3 lightColor = intLightCol.rgb * intLightBrt;
+
+ float cosRot = cos(intLightRot * 0.01745329251);
+ float sinRot = sin(intLightRot * 0.01745329251);
+ vec2 uvDir = vec2(sinRot, cosRot);
+
+ vec2 dvec = texCoord0.xy - intLightPos;
+ float dist = dot( dvec, uvDir );
+ float fallRate = log2( max( abs(intLightFall), 1.01 ) );
+ vec3 fallCol = exp2( -abs(dist) * fallRate / absorb_color );
+
+ vec3 projDir = (tangent * uvDir.x + binormal * uvDir.y) * dist * intLightFall - surfNormal * refract_depth;
+ projDir = normalize(projDir);
+
+ vec4 retVal = vec4(lightColor * fallCol, 1.0);
+ retVal *= abs(dot( projDir, -ftmp2 ));
+ retVal.a = pow( retVal.a, uFresnelPower );
+ retVal.a *= clamp( intLightBrt * exp2(-dist * fallRate), 0.0, 1.0 );
+
+ return retVal;
+}
+
+vec4 computeGlass(in vec3 normal, in float materialIOR, in float alpha, in vec4 color)
+{
+ vec4 rgba = color;
+ float ratio = simpleFresnel( normal, materialIOR, uFresnelPower );
+ vec3 absorb_color = ( log( glass_color.rgb ) * -1.000000 );
+ // prevent log(0) -> inf number issue
+ if ( isinf(absorb_color.r) ) absorb_color.r = 1.0;
+ if ( isinf(absorb_color.g) ) absorb_color.g = 1.0;
+ if ( isinf(absorb_color.b) ) absorb_color.b = 1.0;
+ rgba.rgb *= (vec3(1.0) - absorb_color);
+
+ vec2 texSize = vec2( textureSize( refractiveTexture, 0 ) );
+ vec3 newUV = vec3((gl_FragCoord.xy * 0.5) / texSize, 0.0);
+ vec4 value = texture( refractiveTexture, newUV.xy );
+
+ newUV = getRefractUV( newUV.xy, normal, materialIOR, 0.01 * refract_depth );
+ vec4 refractValue = texture( refractiveTexture, newUV.xy );
+
+ vec3 refractColor = refractValue.a * refractValue.rgb + (1.0 - refractValue.a) * value.rgb;
+ refractColor = refractColor * (vec3(1.0) - absorb_color);
+ vec4 internalColor = doFakeInnerLight( normal, glass_color.rgb );
+ refractColor += internalColor.rgb * internalColor.a;
+
+ rgba = vec4(mix(refractColor, rgba.rgb, ratio), 1.0);
+ return rgba;
+}
+
+ </FragmentShader>
+ </Shader>
+ <Shader name="NOOP">
+<VertexShader>
+</VertexShader>
+<FragmentShader>
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+
+vec3 texCoord0;
+
+void main()
+{
+
+ // This is a bit silly, but the thing is that a buffer blit takes place on this
+ // pass, and if you do a buffer blit on a pass that outputs to lower-resolution,
+ // it only blits a smaller portion of the backbuffer that occupies that number of
+ // pixels. So we need a dummy no-op pass that is full-res in order to blit everything.
+</FragmentShader>
+ </Shader>
+ <Shader name="PREBLUR">
+<VertexShader>
+</VertexShader>
+<FragmentShader>
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+
+vec3 texCoord0;
+
+uniform sampler2D OriginBuffer;
+
+void main()
+{
+ vec2 texSize = vec2( textureSize( OriginBuffer, 0 ) );
+ texSize = vec2(1.0) / texSize;
+ texCoord0.z = 0.0;
+ texCoord0.xy = vec2(gl_FragCoord.xy * 2.0 * texSize);
+
+ float wtSum = 0.0;
+ vec4 totSum = vec4(0.0);
+ for (int ix = -1; ix &lt;= 1; ++ix)
+ {
+ for (int iy = -1; iy &lt;= 1; ++iy)
+ {
+ float wt = float(ix*ix + iy*iy) * 4.0;
+ wt = exp2( -wt );
+ vec2 texOfs = vec2(ix, iy) * texSize;
+ totSum += wt * texture( OriginBuffer, texCoord0.xy + texOfs );
+ wtSum += wt;
+ }
+ }
+
+ totSum /= wtSum;
+ gl_FragColor = totSum;
+ // No close paren because the generator adds it for us.
+
+</FragmentShader>
+ </Shader>
+ <Shader name="BLURX">
+<VertexShader>
+</VertexShader>
+<FragmentShader>
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+
+vec3 texCoord0;
+
+uniform sampler2D BlurBuffer;
+
+void main()
+{
+ vec2 texSize = vec2( textureSize( BlurBuffer, 0 ) );
+ texSize = vec2(1.0) / texSize;
+ texCoord0.z = 0.0;
+ texCoord0.xy = vec2(gl_FragCoord.xy * texSize);
+
+ float sigma = clamp(blur_size * 0.5, 0.5, 100.0);
+ int smpCount = int(ceil( sigma ));
+ vec4 value = texture(BlurBuffer, texCoord0.xy);
+ float wtsum = 1.0;
+ for (int i = 1; i &lt;= smpCount; ++i)
+ {
+ // Base 2 Gaussian blur
+ float wt = float(i) / (sigma * 0.5);
+ wt = exp2( -wt*wt );
+ vec2 texOfs = vec2(i, 0) * texSize;
+ value += wt * texture(BlurBuffer, texCoord0.xy+texOfs);
+ value += wt * texture(BlurBuffer, texCoord0.xy-texOfs);
+ wtsum += wt * 2.0;
+ }
+
+ gl_FragColor = value / wtsum;
+ gl_FragColor.a = 1.0;
+
+ // No close paren because the generator adds it for us.
+</FragmentShader>
+ </Shader>
+ <Shader name="BLURY">
+<VertexShader>
+</VertexShader>
+<FragmentShader>
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+
+vec3 texCoord0;
+
+uniform sampler2D BlurBuffer;
+uniform sampler2D OriginBuffer;
+
+void main()
+{
+ vec2 texSize = vec2( textureSize( BlurBuffer, 0 ) );
+ texSize = vec2(1.0) / texSize;
+ texCoord0.z = 0.0;
+ texCoord0.xy = vec2(gl_FragCoord.xy * texSize);
+
+ float sigma = clamp(blur_size * 0.5, 0.5, 100.0);
+ int smpCount = int(ceil( sigma ));
+ vec4 value = texture(BlurBuffer, texCoord0.xy);
+
+ float wtsum = 1.0;
+ for (int i = 1; i &lt;= smpCount; ++i)
+ {
+ // Base 2 Gaussian blur
+ float wt = float(i) / (sigma * 0.5);
+ wt = exp2( -wt*wt );
+ vec2 texOfs = vec2(0, i) * texSize;
+ vec4 posValue = texture(BlurBuffer, texCoord0.xy+texOfs);
+ vec4 negValue = texture(BlurBuffer, texCoord0.xy-texOfs);
+ posValue = posValue.a * posValue + (1.0 - posValue.a) * texture(OriginBuffer, texCoord0.xy+texOfs);
+ negValue = negValue.a * negValue + (1.0 - negValue.a) * texture(OriginBuffer, texCoord0.xy-texOfs);
+
+ value += wt * posValue;
+ value += wt * negValue;
+ wtsum += wt * 2.0;
+ }
+
+ gl_FragColor = (value / wtsum);
+ gl_FragColor.a = 1.0;
+
+ // No close paren because the generator adds it for us.
+</FragmentShader>
+ </Shader>
+
+ </Shaders>
+<Passes >
+ <ShaderKey value="20"/>
+ <LayerKey count="1"/>
+ <Buffer name="frame_buffer" format="source" filter="linear" wrap="clamp" size="1.0" lifetime="frame"/>
+ <Buffer name="dummy_buffer" type="ubyte" format="rgba" wrap="clamp" size="1.0" lifetime="frame"/>
+ <Buffer name="temp_buffer" type="fp16" format="rgba" filter="linear" wrap="clamp" size="0.5" lifetime="frame"/>
+ <Buffer name="temp_blurX" type="fp16" format="rgba" filter="linear" wrap="clamp" size="0.5" lifetime="frame"/>
+ <Buffer name="temp_blurY" type="fp16" format="rgba" filter="linear" wrap="clamp" size="0.5" lifetime="frame"/>
+ <Pass shader="NOOP" output="dummy_buffer">
+ <BufferBlit dest="frame_buffer"/>
+ </Pass>
+ <Pass shader="PREBLUR" output="temp_buffer">
+ <BufferInput value="frame_buffer" param="OriginBuffer"/>
+ </Pass>
+ <Pass shader="BLURX" output="temp_blurX">
+ <BufferInput value="temp_buffer" param="BlurBuffer"/>
+ </Pass>
+ <Pass shader="BLURY" output="temp_blurY">
+ <BufferInput value="temp_blurX" param="BlurBuffer"/>
+ <BufferInput value="temp_buffer" param="OriginBuffer"/>
+ </Pass>
+ <Pass shader="MAIN">
+ <BufferInput value="temp_blurY" param="refractiveTexture"/>
+ <Blending source="SrcAlpha" dest="OneMinusSrcAlpha"/>
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/thin_glass_frosted_sp.shader b/Studio/Content/Material Library/thin_glass_frosted_sp.shader
new file mode 100644
index 0000000..6619ec2
--- /dev/null
+++ b/Studio/Content/Material Library/thin_glass_frosted_sp.shader
@@ -0,0 +1,246 @@
+<Material name="thin_glass_frosted_sp" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Gradient1D Map" description="Gradient texture of the material" hidden="True" name="randomGradient1D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient1D.png"/>
+ <Property formalName="Gradient2D Map" description="Gradient texture of the material" hidden="True" name="randomGradient2D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient2D.png"/>
+ <Property formalName="Gradient3D Map" description="Gradient texture of the material" hidden="True" name="randomGradient3D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient3D.png"/>
+ <Property formalName="Gradient4D Map" description="Gradient texture of the material" hidden="True" name="randomGradient4D" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="gradient" default="./maps/materials/randomGradient4D.png"/>
+ <Property formalName="Noise Coordinates" name="noiseCoords" description="Coordinates of the noise" type="Vector" default="1 1 1" category="Material"/>
+ <Property formalName="Noise Scale" name="noiseScale" description="Scaling of the noise" type="Float" min="0.000000" max="40.000000" default="2.000000" category="Material"/>
+ <Property formalName="Bump Coordinates" name="bumpCoords" description="Bump coordinates of the refraction" type="Vector" default="1 1 1" category="Material"/>
+ <Property formalName="Bump Scale" name="bumpScale" description="Scale of the bumps" type="Float" min="0.000000" max="1.000000" default="0.500000" category="Material"/>
+ <Property formalName="Bump Bands" name="bumpBands" description="Bump bands of the material" type="Long" min="1.000000" max="10.000000" default="1" category="Material"/>
+ <Property formalName="Fresnel Power" name="uFresnelPower" description="Fresnel power of the material" type="Float" default="1.0" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.000000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Blur Width" name="blur_size" description="Width of the blur" type="Float" default="8" min="0.000000" max="20.00000" category="Material"/>
+ <Property formalName="Reflectivity" name="reflectivity_amount" type="Float" min="0.000000" max="1.000000" default="1.000000" description="Reflectivity factor" category="Material"/>
+ <Property formalName="Glass ior" name="glass_ior" type="Float" default="1.100000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glass Color" name="glass_color" type="Color" default="0.9 0.9 0.9" description="Color of the material" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define texture_coordinate_uvw 0
+#define texture_coordinate_world 1
+#define texture_coordinate_object 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 0
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+// add structure defines
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp0;
+texture_coordinate_info tmp1;
+vec3 ftmp0;
+vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "cube.glsllib"
+#include "random255.glsllib"
+#include "perlinNoise.glsllib"
+#include "perlinNoiseBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "coordinateSource.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "abbeNumberIOR.glsllib"
+#include "average.glsllib"
+#include "perlinNoiseTexture.glsllib"
+#include "fresnelLayer.glsllib"
+#include "refraction.glsllib"
+
+uniform sampler2D refractiveTexture;
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect_transmit );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect_transmit );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( abbeNumberIOR(glass_ior, 0.000000 ) ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ //return( normal );
+ return( perlinNoiseBumpTexture( tmp1, bumpScale, 1.000000, false, false, 0.000000, bumpBands, false, vec3( 0.000000, 0.000000, 0.000000 ), 0.5, 0.0, 1.000000, normal ) );
+}
+
+void computeTemporaries()
+{
+ tmp0 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), noiseCoords ), coordinateSource(texture_coordinate_world, 0 ) );
+ tmp1 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), bumpCoords ), coordinateSource(texture_coordinate_world, 0 ) );
+ ftmp0 = vec3( reflectivity_amount );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = layers[0].base * vec4( ftmp0, 1.0);
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( tangentFrame( normal, varWorldPos ) );
+}
+
+vec4 computeGlass(in vec3 normal, in float materialIOR, in float alpha, in vec4 color)
+{
+ vec4 rgba = color;
+ float ratio = simpleFresnel( normal, materialIOR, uFresnelPower );
+ vec3 absorb_color = ( log( glass_color.rgb )/-1.000000 );
+ // prevent log(0) -> inf number issue
+ if ( isinf(absorb_color.r) ) absorb_color.r = 1.0;
+ if ( isinf(absorb_color.g) ) absorb_color.g = 1.0;
+ if ( isinf(absorb_color.b) ) absorb_color.b = 1.0;
+ rgba.rgb *= (vec3(1.0) - absorb_color);
+
+ vec3 refractDir = perlinNoiseBumpTexture( tmp0, noiseScale, 1.000000, false, false, 0.000000, 1, false, vec3( 0.000000, 0.000000, 0.000000 ), 1.0, 0.5, 1.000000, normalize(viewDir) );
+
+ vec3 refractColor = refractBlur( refractiveTexture, normalize(refractDir), materialIOR, blur_size ) * (vec3(1.0) - absorb_color);
+ rgba = vec4(mix(refractColor, rgba.rgb, ratio), 1.0);
+ return rgba;
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="20"/>
+ <LayerKey count="1"/>
+ <Buffer name="temp_buffer" format="source" filter="linear" wrap="clamp" size="1.0" lifetime="frame"/>
+ <Pass >
+ <BufferBlit dest="temp_buffer"/>
+ <BufferInput value="temp_buffer" param="refractiveTexture"/>
+ <Blending source="SrcAlpha" dest="OneMinusSrcAlpha"/>
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/thin_glass_refractive.shader b/Studio/Content/Material Library/thin_glass_refractive.shader
new file mode 100644
index 0000000..16cf172
--- /dev/null
+++ b/Studio/Content/Material Library/thin_glass_refractive.shader
@@ -0,0 +1,202 @@
+<Material name="thin_glass_refractive" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Fresnel Power" name="uFresnelPower" description="Fresnel power of the material" type="Float" default="1.0" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.000000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Reflectivity" name="reflectivity_amount" type="Float" min="0.000000" max="1.000000" default="1.000000" description="Reflectivity factor" category="Material"/>
+ <Property formalName="Glass ior" name="glass_ior" type="Float" default="1.100000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Glass Color" name="glass_color" type="Color" default="0.9 0.9 0.9" description="Color of the material" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 0
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+// temporary declarations
+vec3 ftmp0;
+ vec4 tmpShadowTerm;
+
+layer_result layers[1];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "luminance.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "abbeNumberIOR.glsllib"
+#include "fresnelLayer.glsllib"
+#include "refraction.glsllib"
+
+uniform sampler2D refractiveTexture;
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect_transmit );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect_transmit );
+
+#else
+ layers[0].base += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( abbeNumberIOR(glass_ior, 0.000000 ) ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ ftmp0 = vec3( reflectivity_amount );
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = layers[0].base * vec4( ftmp0, 1.0);
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( tangentFrame( normal, varWorldPos ) );
+}
+
+vec4 computeGlass(in vec3 normal, in float materialIOR, in float alpha, in vec4 color)
+{
+ vec4 rgba = color;
+ float ratio = simpleFresnel( normal, materialIOR, uFresnelPower );
+ vec3 absorb_color = ( log( glass_color.rgb )/-1.000000 );
+ // prevent log(0) -> inf number issue
+ if ( isinf(absorb_color.r) ) absorb_color.r = 1.0;
+ if ( isinf(absorb_color.g) ) absorb_color.g = 1.0;
+ if ( isinf(absorb_color.b) ) absorb_color.b = 1.0;
+ rgba.rgb *= (vec3(1.0) - absorb_color);
+ vec3 refractColor = refraction( refractiveTexture, materialIOR ) * (vec3(1.0) - absorb_color);
+ rgba = vec4(mix(refractColor, rgba.rgb, ratio), 1.0);
+ return rgba;
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="20"/>
+ <LayerKey count="1"/>
+ <Buffer name="temp_buffer" format="source" filter="linear" wrap="clamp" size="1.0" lifetime="scene"/>
+ <Pass >
+ <BufferBlit dest="temp_buffer"/>
+ <BufferInput value="temp_buffer" param="refractiveTexture"/>
+ <Blending source="SrcAlpha" dest="OneMinusSrcAlpha"/>
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Material Library/walnut_matte.shader b/Studio/Content/Material Library/walnut_matte.shader
new file mode 100644
index 0000000..4541241
--- /dev/null
+++ b/Studio/Content/Material Library/walnut_matte.shader
@@ -0,0 +1,236 @@
+<Material name="walnut_matte" version="1.0">
+ <MetaData >
+ <Property formalName="Environment Map" name="uEnvironmentTexture" description="Environment texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="environment" default="./maps/materials/spherical_checker.png" category="Material"/>
+ <Property formalName="Enable Environment" name="uEnvironmentMappingEnabled" description="Enable environment mapping" type="Boolean" default="True" category="Material"/>
+ <Property formalName="Baked Shadow Map" name="uBakedShadowTexture" description="Baked shadow texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="shadow" default="./maps/materials/shadow.png" category="Material"/>
+ <Property formalName="Shadow Mapping" name="uShadowMappingEnabled" description="Enable shadow mapping" type="Boolean" default="False" category="Material"/>
+ <Property formalName="Index of Refraction" name="material_ior" type="Float" default="1.500000" description="Index of refraction of the material" category="Material"/>
+ <Property formalName="Roughness" name="roughness" type="Float" min="0.000000" max="1.000000" default="0.250000" description="Roughness of the material.\n0 = fully specular\n1 = fully diffuse" category="Material"/>
+ <Property formalName="Reflectivity Map" name="reflect_texture" description="Reflectivity texture for the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="specular" default="./maps/materials/walnut_spec.png" category="Material"/>
+ <Property formalName="Tiling" name="texture_tiling" type="Float2" default="10 7" description="Scaling of the textures" category="Material"/>
+ <Property formalName="Diffuse Map" name="diffuse_texture" description="Diffuse texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="diffuse" default="./maps/materials/walnut.png" category="Material"/>
+ <Property formalName="Bump Map" name="bump_texture" description="Bump texture of the material" type="Texture" filter="linear" minfilter="linearMipmapLinear" clamp="repeat" usage="bump" default="./maps/materials/walnut_bump.png" category="Material"/>
+ <Property formalName="Bump Amount" name="bump_amount" type="Float" default="0.400000" description="Value determining the bumpiness" category="Material"/>
+ </MetaData>
+ <Shaders type="GLSL" version="330">
+ <Shader>
+ <Shared> </Shared>
+<VertexShader>
+ </VertexShader>
+ <FragmentShader>
+
+// add enum defines
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define gamma_default 0
+#define gamma_linear 1
+#define gamma_srgb 2
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+
+#define QT3DS_ENABLE_UV0 1
+#define QT3DS_ENABLE_WORLD_POSITION 1
+#define QT3DS_ENABLE_TEXTAN 1
+#define QT3DS_ENABLE_BINORMAL 1
+
+#include "vertexFragmentBase.glsllib"
+
+// set shader output
+out vec4 fragColor;
+
+// add structure defines
+struct layer_result
+{
+ vec4 base;
+ vec4 layer;
+ mat3 tanFrame;
+};
+
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+
+struct texture_return
+{
+ vec3 tint;
+ float mono;
+};
+
+
+// temporary declarations
+texture_coordinate_info tmp2;
+vec3 tmp5;
+vec3 ftmp0;
+vec3 ftmp1;
+ vec4 tmpShadowTerm;
+
+layer_result layers[2];
+
+#include "SSAOCustomMaterial.glsllib"
+#include "sampleLight.glsllib"
+#include "sampleProbe.glsllib"
+#include "sampleArea.glsllib"
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "fileBumpTexture.glsllib"
+#include "transformCoordinate.glsllib"
+#include "rotationTranslationScale.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#include "square.glsllib"
+#include "calculateRoughness.glsllib"
+#include "evalBakedShadowMap.glsllib"
+#include "evalEnvironmentMap.glsllib"
+#include "microfacetBSDF.glsllib"
+#include "physGlossyBSDF.glsllib"
+#include "simpleGlossyBSDF.glsllib"
+#include "fileTexture.glsllib"
+#include "weightedLayer.glsllib"
+#include "diffuseReflectionBSDF.glsllib"
+#include "fresnelLayer.glsllib"
+
+bool evalTwoSided()
+{
+ return( false );
+}
+
+vec3 computeFrontMaterialEmissive()
+{
+ return( vec3( 0, 0, 0 ) );
+}
+
+void computeFrontLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * microfacetBSDF( layers[0].tanFrame, lightDir, viewDir, lightSpecular, materialIOR, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDF( tmp5, lightDir, viewDir, lightDiffuse, 0.000000 );
+
+#endif
+}
+
+void computeFrontAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].layer += tmpShadowTerm * lightSpecular * sampleAreaGlossy( layers[0].tanFrame, varWorldPos, lightIdx, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * lightDiffuse * sampleAreaDiffuse( layers[1].tanFrame, varWorldPos, lightIdx );
+
+#endif
+}
+
+void computeFrontLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].layer += tmpShadowTerm * microfacetSampledBSDF( layers[0].tanFrame, viewDir, roughness, roughness, scatter_reflect );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * diffuseReflectionBSDFEnvironment( tmp5, 0.000000 ) * aoFactor;
+
+#else
+ layers[0].layer += tmpShadowTerm * sampleGlossyAniso( layers[0].tanFrame, viewDir, roughness, roughness );
+
+ layers[1].base += tmpShadowTerm * vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[1].layer += tmpShadowTerm * sampleDiffuse( layers[1].tanFrame ) * aoFactor;
+
+#endif
+}
+
+vec3 computeBackMaterialEmissive()
+{
+ return( vec3(0, 0, 0) );
+}
+
+void computeBackLayerColor( in vec3 normal, in vec3 lightDir, in vec3 viewDir, in vec3 lightDiffuse, in vec3 lightSpecular, in float materialIOR, float aoFactor )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackAreaColor( in int lightIdx, in vec4 lightDiffuse, in vec4 lightSpecular )
+{
+#if QT3DS_ENABLE_CG_LIGHTING
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+void computeBackLayerEnvironment( in vec3 normal, in vec3 viewDir, float aoFactor )
+{
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#else
+ layers[0].base += vec4( 0.0, 0.0, 0.0, 1.0 );
+ layers[0].layer += vec4( 0.0, 0.0, 0.0, 1.0 );
+#endif
+}
+
+float computeIOR()
+{
+ return( false ? 1.0 : luminance( vec3( 1, 1, 1 ) ) );
+}
+
+float evalCutout()
+{
+ return( 1.000000 );
+}
+
+vec3 computeNormal()
+{
+ return( normal );
+}
+
+void computeTemporaries()
+{
+ tmp2 = transformCoordinate( rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, 0.000000 ), vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) ), textureCoordinateInfo( texCoord0, tangent, binormal ) );
+ tmp5 = fileBumpTexture(bump_texture, bump_amount, mono_average, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, normal );
+ ftmp0 = fileTexture(reflect_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_linear ).tint;
+ ftmp1 = fileTexture(diffuse_texture, vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_luminance, tmp2, vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), wrap_repeat, wrap_repeat, gamma_srgb ).tint;
+ tmpShadowTerm = evalBakedShadowMap( texCoord0 );
+}
+
+vec4 computeLayerWeights( in float alpha )
+{
+ vec4 color;
+ color = weightedLayer( 1.000000, vec4( ftmp1, 1.0).rgb, layers[1].layer, layers[1].base, alpha );
+ color = fresnelLayer( tmp5, vec3( material_ior ), 1.000000, vec4( ftmp0, 1.0).rgb, layers[0].layer, color, color.a );
+ return color;
+}
+
+
+void initializeLayerVariables(void)
+{
+ // clear layers
+ layers[0].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[0].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+ layers[1].base = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].layer = vec4(0.0, 0.0, 0.0, 1.0);
+ layers[1].tanFrame = orthoNormalize( mat3( tangent, cross(tmp5, tangent), tmp5 ) );
+}
+
+ </FragmentShader>
+ </Shader>
+ </Shaders>
+<Passes >
+ <ShaderKey value="5"/>
+ <LayerKey count="2"/>
+ <Pass >
+ </Pass>
+</Passes>
+</Material>
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_1.dae
new file mode 100644
index 0000000..9a1879a
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:35:05</created>
+ <modified>2018-03-08T09:35:05</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape1" name="qt_gauge_background_Shape1">
+ <mesh>
+ <source id="qt_gauge_background_Shape1-positions" name="qt_gauge_background_Shape1-positions">
+ <float_array id="qt_gauge_background_Shape1-positions-array" count="3801">-2.102264 0 25.8367 41.75381 0 -25.83701 44.4072 0 25.79055 71.28171 0 0.5044861 45.44565 0 -25.79097 -71.28104 0 0.5046463 -41.75305 0 -25.83701 -45.44492 0 -25.79095 -44.40652 0 25.79055 5.887665 0 25.83669 3.084137 0 -25.8369 -34.11917 0 -25.8367 -34.38049 0 25.83649 -53.02365 0 -25.37735 -53.02365 0 25.37708 -70.20746 0 -6.96402 -52.65521 0 -5.615967 -63.22852 0 -19.82542 -62.6123 0 -5.777908 -66.32043 0 -15.29803 -62.64407 0 -15.43774 -53.82657 0 -14.8929 -58.22586 0 -23.90677 -59.14819 0 -16.42346 -61.71759 0 -21.40051 -57.86176 0 -20.41306 -52.36142 0 -20.89781 -63.16452 0 19.31659 -68.89737 0 9.847778 -62.60654 0 9.688622 -52.91245 0 8.119537 -58.31204 0 23.81316 -58.3121 0 9.688622 -58.89331 0 17.30406 -63.10428 0 15.99818 -54.07486 0 18.16059 -37.16895 0 -5.194565 -17.24109 0 -25.83673 -17.94196 0 25.83646 -19.14502 0 -7.036789 2.766174 0 -2.992325 34.3812 0 25.83649 34.11984 0 -25.8367 18.64349 0 25.83636 18.64349 0 -25.83673 18.52383 0 -4.785583 37.16971 0 -6.500153 53.02426 0 25.37708 53.02426 0 -25.37733 54.11783 0 -3.948639 70.2081 0 -6.96402 63.22922 0 -19.82542 62.94223 0 -6.459366 53.42624 0 -13.98279 62.64462 0 -15.43774 58.22653 0 -23.90677 58.72543 0 -16.5939 52.85318 0 -20.73274 58.24069 0 -20.77866 61.71823 0 -21.40051 66.32114 0 -15.29805 63.16519 0 19.31659 62.20627 0 7.523155 52.62253 0 9.688622 58.31271 0 23.81316 58.31277 0 9.688622 58.31277 0 17.30406 53.76883 0 19.03349 62.60721 0 15.83269 68.89804 0 9.847778 52.02457 0 1.857986 47.38651 0 -5.370331 45.99203 0 3.788338 38.9537 0 -25.83682 34.33456 0 -18.80209 40.70291 0 -18.1601 64.01633 0 -15.31009 62.64035 0 -12.55576 65.1088 0 -11.25836 52.68436 0 -9.656448 58.31406 0 -5.395447 57.66623 0 -11.12474 59.7023 0 -20.80048 58.26242 0 -19.2399 60.34006 0 -19.21291 51.99161 0 -16.47609 56.61942 0 -15.36 56.02243 0 -18.54332 55.98099 0 -24.82382 53.00711 0 -23.72507 55.99844 0 -22.73483 60.21823 0 -22.60703 58.22781 0 -22.11998 64.51724 0 -18.12996 62.67282 0 -17.5775 63.1127 0 17.42032 60.54794 0 16.84551 60.58884 0 19.4319 62.4769 0 1.474998 58.89114 0 1.667068 58.31271 0 20.41583 56.05319 0 17.63319 56.05325 0 21.22458 53.05185 0 15.9107 55.97665 0 13.71091 58.31271 0 13.66183 60.53696 0 13.53786 71.17093 0 -3.229767 67.36288 0 -6.909515 68.06174 0 -1.875992 66.17838 0 14.95012 2.173065 0 25.83683 -0.4353333 0 14.34845 -9.181091 0 25.83668 -48.95465 0 25.66786 -50.3002 0 20.67001 -46.02176 0 3.724434 -47.90057 0 14.46272 -53.10239 0 14.63776 -62.61929 0 -12.51405 -60.01306 0 -12.58708 -51.97476 0 -17.21564 -60.36856 0 -19.19049 -62.51212 0 -20.67816 -52.97318 0 -23.73546 -55.98038 0 -24.82381 -71.17023 0 -3.229767 -68.04071 0 -1.834305 -70.57779 0 4.910515 -60.53632 0 8.677925 -59.94376 0 3.836395 -56.5791 0 8.552788 -49.05847 0 -25.66812 -48.73425 0 -23.99231 -38.953 0 -25.83684 -40.70224 0 -18.03194 -45.73557 0 -15.59177 -45.86816 0 -21.52899 -43.4129 0 -25.83253 -26.6665 0 -25.83667 -6.798126 0 -25.83685 34.57584 0 9.757103 11.14417 0 -25.83685 26.80734 0 -25.83667 48.95529 0 25.66778 53.09274 0 22.61985 50.28018 0 20.75208 39.91409 0 25.83199 41.41452 0 11.84309 47.88174 0 14.58749 49.05917 0 -25.66814 48.76822 0 -23.98193 47.33499 0 -11.76941 45.76956 0 -15.65027 45.90207 0 -21.51862 43.41367 0 -25.83253 68.40994 0 -11.26927 61.16934 0 -15.42801 59.99399 0 -12.63934 61.15524 0 -18.32555 62.51279 0 -20.67818 56.60532 0 -20.74609 60.59219 0 22.15009 55.96725 0 8.638145 56.66202 0 3.923355 59.93637 0 8.467003 55.98965 0 24.81421 66.44998 0 2.502403 70.57846 0 4.91066 65.18515 0 8.461891 63.01614 0 12.31636 65.21896 0 13.89244 -9.938446 0 -4.614014 -17.48639 0 5.351601 -7.531006 0 9.941078 -39.91339 0 25.83209 -34.57532 0 14.16616 -41.41388 0 12.00265 -55.98901 0 24.81411 -53.11285 0 22.55757 -56.08432 0 21.16238 -56.9361 0 -5.498428 -52.58273 0 -9.828857 -57.66223 0 -11.15034 -68.40924 0 -11.26926 -67.34183 0 -6.867798 -65.08789 0 -11.21666 -64.51657 0 -18.12996 -64.01563 0 -15.31009 -62.67215 0 -17.5775 -58.27588 0 -18.54297 -57.31311 0 -15.4523 -56.02554 0 -18.40627 -61.19788 0 -15.41747 -61.18375 0 -18.315 -60.21759 0 -22.60703 -59.67557 0 -20.7641 -58.19006 0 -22.09544 -55.90823 0 -20.69637 -55.95358 0 -22.74521 -66.1777 0 14.95012 -63.1593 0 17.42326 -65.25452 0 13.91503 -65.22348 0 8.672455 -63.06744 0 3.852333 -66.43991 0 2.583801 -52.49792 0 -0.5362244 -57.59 0 1.547462 -60.59155 0 22.14996 -58.36197 0 20.4157 -60.63803 0 19.43198 -63.10175 0 13.56714 -61.23383 0 16.84847 -60.5972 0 13.66196 -58.36206 0 13.67113 -56.73041 0 17.53134 -56.0954 0 13.7484 -47.28983 0 -5.434219 -47.36237 0 -11.76782 -26.76273 0 25.83641 -26.95804 0 9.798355 -34.33405 0 -16.07381 -27.03815 0 -4.756607 -26.8262 0 -16.15675 -17.42288 0 -16.15675 -6.850891 0 -15.89569 26.83347 0 25.83641 26.82736 0 9.832146 18.63968 0 9.832405 11.42453 0 25.83656 11.19025 0 10.01989 5.648682 0 14.34843 3.06012 0 -15.89575 11.13272 0 -4.382492 11.13708 0 -16.00439 18.63968 0 -16.00433 27.0195 0 -4.605774 27.02908 0 -16.16638 64.74802 0 11.94588 -11.10898 0 3.853378 -38.6517 0 16.3583 -55.17456 0 22.7068 -56.202 0 -9.211365 -66.78574 0 -9.75325 -63.79443 0 -17.26378 -57.04404 0 -17.6051 -61.51434 0 -17.30374 -59.48328 0 -21.92523 -56.76294 0 -21.9493 -64.957 0 15.67852 -64.99057 0 4.701401 -56.18387 0 -1.329742 -59.82693 0 20.74358 -61.4953 0 14.88115 -56.95053 0 15.02742 -48.54608 0 -9.327042 -29.64233 0 15.93772 -29.6178 0 -12.56992 -10.97632 0 -12.52769 24.03421 0 15.10435 9.219971 0 15.98008 8.68512 0 -12.4826 24.09122 0 -12.54866 48.18613 0 -0.4372559 38.06723 0 -20.26384 63.91043 0 -12.9949 56.46646 0 -9.172668 59.51602 0 -19.58554 55.06943 0 -17.21594 55.15005 0 -23.68857 59.49167 0 -21.9325 63.79507 0 -17.26381 61.36868 0 18.2448 59.86557 0 -0.9028854 56.81631 0 19.80939 55.16312 0 15.46737 59.80411 0 14.88015 68.69504 0 -4.13765 64.94693 0 15.67775 2.708405 0 16.82346 -5.150024 0 15.98008 -50.72726 0 23.00726 -48.27661 0 -0.8972931 -44.89899 0 9.89061 -50.50977 0 17.09837 -56.95047 0 19.79089 -61.28159 0 -13.25983 -58.32532 0 -13.01328 -63.90363 0 -12.9825 -54.93277 0 -19.04333 -59.51617 0 -19.44864 -61.25018 0 -19.30739 -55.13943 0 -23.69164 -64.76645 0 12.20244 -68.68814 0 -4.125275 -68.24393 0 1.524986 -61.23935 0 4.950867 -58.17343 0 4.498177 -61.50739 0 18.2458 -59.81485 0 12.16016 -55.29147 0 12.35684 -50.42218 0 -24.32735 -38.06665 0 -19.73398 -48.13174 0 -14.7365 -44.10202 0 -18.11746 -46.36667 0 -23.95876 -23.85413 0 3.811127 -23.77573 0 -19.38954 -3.272339 0 -19.31229 29.65451 0 4.675529 13.56879 0 4.741852 13.57016 0 -19.34448 29.60916 0 -19.88431 50.72177 0 23.02568 38.65231 0 15.49134 44.89389 0 9.897842 50.49857 0 17.35876 50.43277 0 -24.32426 48.57022 0 -9.299896 44.11264 0 -18.13834 48.13394 0 -14.6109 46.37723 0 -23.9557 66.79239 0 -9.765671 61.27969 0 -13.27539 58.19809 0 -13.00887 61.5065 0 -17.30688 61.24228 0 -19.31052 56.90836 0 -19.46054 56.89841 0 -21.95348 59.81607 0 20.74358 55.06992 0 4.566711 58.42349 0 4.52195 55.1691 0 22.72522 56.79367 0 12.16016 61.23105 0 11.8736 64.87173 0 4.222534 68.25058 0 1.512947 66.10251 0 11.18953 63.93588 0 10.33479 64.01071 0 13.82565 -6.20517 0 1.363617 -14.19647 0 -0.5975266 -13.2695 0 11.11494 -41.15433 0 19.73153 -36.93958 0 20.3733 -37.82907 0 9.103172 -56.44308 0 23.11243 -54.3992 0 23.87132 -54.60406 0 21.11086 -58.50241 0 -8.113678 -54.75919 0 -7.677216 -55.16846 0 -11.50746 -66.61777 0 -11.94119 -68.19879 0 -8.705322 -65.47211 0 -8.493149 -63.52707 0 -18.34555 -64.64102 0 -16.64998 -63.2807 0 -16.51196 -57.27206 0 -18.86615 -57.85669 0 -17.01698 -56.04688 0 -16.7435 -62.05737 0 -18.36893 -61.96219 0 -16.51196 -60.66022 0 -16.89261 -59.0928 0 -22.67865 -60.34717 0 -21.67789 -58.87201 0 -21.36267 -57.33871 0 -22.73114 -57.27206 0 -21.36259 -55.44135 0 -21.63231 -66.36942 0 13.73646 -64.38663 0 16.98131 -64.10675 0 15.9611 -66.45322 0 6.293106 -64.00998 0 6.640778 -64.36676 0 1.265671 -55.00516 0 2.047676 -54.75922 0 -3.306458 -58.50241 0 -2.730988 -61.00204 0 20.57217 -59.24655 0 21.83909 -59.3504 0 19.56992 -61.91946 0 13.05305 -62.19199 0 15.51562 -60.4606 0 15.78574 -57.37762 0 13.05293 -57.6571 0 15.93452 -55.91556 0 16.08752 -50.43991 0 -11.6972 -50.20633 0 -7.677216 -44.97751 0 -8.20607 -31.98117 0 8.470833 -31.46857 0 20.37295 -25.41794 0 19.10812 -31.35086 0 -17.7628 -31.91562 0 -9.781754 -25.64218 0 -10.09799 -12.95364 0 -17.76282 -14.1965 0 -10.09799 -6.02951 0 -9.401642 21.99646 0 19.10812 28.10818 0 19.10822 21.96011 0 7.296104 7.921143 0 20.3731 12.47583 0 19.10809 7.348755 0 8.850922 6.657654 0 -17.76295 6.645996 0 -9.401688 12.43948 0 -9.691376 21.99646 0 -17.76282 21.96014 0 -9.69133 28.62088 0 -9.997055 49.67276 0 3.592964 50.3168 0 -2.393646 44.60123 0 -2.216461 40.0488 0 -22.36913 36.47409 0 -22.55875 37.48135 0 -15.86821 64.82492 0 -13.74658 63.28134 0 -14.15439 63.64883 0 -10.8759 55.09439 0 -11.32803 55.3967 0 -7.396866 58.90872 0 -8.224915 60.36942 0 -20.1673 58.94229 0 -20.06636 59.20401 0 -18.6003 54.06924 0 -18.36081 54.33554 0 -15.99486 56.69107 0 -17.0451 56.42654 0 -23.80421 54.39981 0 -24.41792 54.39499 0 -22.75354 60.34781 0 -21.67789 59.09341 0 -22.67863 58.94223 0 -21.42804 64.64169 0 -16.64998 63.5278 0 -18.34554 63.28134 0 -16.51196 62.02914 0 18.8123 61.9202 0 17.3191 60.18179 0 18.16523 60.91092 0 2.556656 60.86966 0 -2.842209 57.79282 0 -2.393646 57.3782 0 21.34314 57.37827 0 18.80836 55.68527 0 19.32868 54.34518 0 13.68552 54.54953 0 16.8857 56.44382 0 15.93452 59.24728 0 13.05293 59.24728 0 15.78574 60.89377 0 15.50775 69.827 0 -2.21109 69.37912 0 -5.341125 66.75259 0 -4.860718 64.01065 0 15.95311 64.38736 0 16.98131 66.37009 0 13.73646 0.7460632 0 20.37339 4.183105 0 20.37339 2.90799 0 10.11578 -2.291534 0 8.851051 -9.707184 0 19.10831 -3.926422 0 20.37333 -52.04156 0 21.07216 -51.45969 0 24.21294 -48.63031 0 23.75606 -44.60059 0 -2.001144 -50.20633 0 -3.306458 -49.89966 0 2.680023 -42.26978 0 5.10685 -47.92026 0 9.092194 -44.5665 0 15.41885 -48.30447 0 19.50485 -51.1312 0 13.82214 -52.04156 0 17.82228 -55.91553 0 19.16285 -57.65704 0 18.80836 -57.37759 0 21.34314 -60.33047 0 -14.34528 -61.96216 0 -14.15439 -61.61118 0 -11.14413 -59.61258 0 -10.76466 -56.80566 0 -13.71573 -58.63712 0 -14.36864 -63.5939 0 -10.76466 -63.28067 0 -14.15439 -64.82425 0 -13.74658 -54.23398 0 -17.56302 -53.9798 0 -19.52327 -56.35916 0 -19.81117 -59.28101 0 -18.38242 -58.87207 0 -19.81125 -60.36877 0 -20.1673 -61.45734 0 -20.10718 -61.98856 0 -19.54465 -60.3912 0 -18.28143 -54.30557 0 -22.7812 -54.39917 0 -24.41794 -56.42587 0 -23.80421 -64.10678 0 14.14988 -64.00995 0 11.0546 -66.10184 0 11.18964 -66.69763 0 -4.749496 -69.37842 0 -5.341125 -69.82632 0 -2.21109 -69.586 0 1.152946 -68.58981 0 4.590836 -66.37292 0 -1.005989 -61.74927 0 1.645302 -61.91953 0 6.640778 -60.0054 0 6.640778 -58.31213 0 6.640907 -56.46667 0 5.727966 -59.61258 0 1.012535 -60.4606 0 18.1651 -62.19199 0 17.32684 -62.02853 0 18.8123 -59.35043 0 14.31665 -59.24661 0 11.0546 -60.89304 0 11.0546 -54.60413 0 14.78589 -54.57214 0 11.09061 -56.6188 0 11.0546 -48.39548 0 -24.93513 -51.45969 0 -24.75955 -51.3006 0 -23.24834 -37.48062 0 -14.89395 -36.47336 0 -21.7998 -40.0481 0 -22.36913 -44.53506 0 -12.05605 -49.56763 0 -17.12894 -50.26422 0 -14.72498 -43.14883 0 -20.79076 -47.10403 0 -18.9577 -41.92136 0 -14.45399 -48.51123 0 -22.60367 -44.43933 0 -24.25864 -46.04211 0 -24.99681 -21.5043 0 11.11493 -21.72852 0 -0.5975266 -28.62012 0 0.9836197 -21.72852 0 -14.6409 -21.36407 0 -21.79974 -28.05527 0 -21.79974 -0.8299255 0 -13.9446 -0.8182678 0 -21.7999 -8.456848 0 -21.79984 31.46921 0 12.37998 31.98184 0 0.7681732 25.52243 0 1.073753 15.45499 0 12.37998 15.41867 0 1.073914 9.800842 0 1.363457 15.41867 0 -14.2343 15.45502 0 -21.79984 9.812531 0 -21.7999 31.91635 0 -15.29892 31.35153 0 -22.55869 25.55875 0 -21.79974 48.63095 0 23.75614 51.46036 0 24.21294 51.98697 0 21.23808 37.82974 0 7.622948 36.94022 0 19.10838 41.155 0 19.73153 44.56717 0 15.41885 47.86893 0 9.372543 42.27042 0 4.891418 51.98697 0 18.30422 51.07986 0 14.41895 48.30515 0 19.50485 51.39005 0 -23.22066 51.46036 0 -24.75955 48.39621 0 -24.93513 44.97824 0 -8.421371 50.49252 0 -7.396866 50.36581 0 -11.51779 41.92209 0 -14.6693 47.19345 0 -18.93002 43.14951 0 -20.79076 50.19016 0 -14.35582 49.65701 0 -16.91151 44.5358 0 -12.27135 46.04282 0 -24.99683 44.44009 0 -24.25864 48.60068 0 -22.576 65.52707 0 -8.604385 68.19949 0 -8.705322 66.61844 0 -11.94119 61.66617 0 -11.25539 61.9628 0 -14.15439 60.25339 0 -14.37341 58.38443 0 -14.39679 56.55588 0 -13.5363 59.66751 0 -10.8759 60.58316 0 -16.92073 61.9628 0 -16.51196 62.05801 0 -18.36893 60.31418 0 -18.30956 61.98917 0 -19.54466 61.45804 0 -20.10716 57.42831 0 -18.43385 57.51797 0 -20.06628 55.70645 0 -19.87506 55.70645 0 -21.60463 57.51791 0 -21.42796 57.33939 0 -22.73114 59.24728 0 19.56992 59.24722 0 21.83899 61.00266 0 20.57217 54.46225 0 1.349876 54.01944 0 6.008202 56.61948 0 6.640778 58.31284 0 6.640907 59.88449 0 5.604454 57.03403 0 1.349876 54.54953 0 21.2767 54.39981 0 23.87132 56.4437 0 23.11253 57.37827 0 14.31652 57.37827 0 11.0546 55.48099 0 11.0546 61.92014 0 13.72253 61.66977 0 10.33466 60.00613 0 11.0546 64.246 0 0.5219879 63.76022 0 5.604454 66.45383 0 6.293106 66.42783 0 -1.117195 68.59048 0 4.59095 69.5867 0 1.153107 65.06467 0 10.58203 64.04721 0 12.25031 65.08347 0 12.88336 -10.27731 0 0.1589279 -13.79276 0 4.862991 -9.342865 0 6.618385 -39.19858 0 20.25311 -36.9505 0 14.82417 -39.79785 0 14.03135 -55.55829 0 23.58833 -54.33664 0 22.54708 -55.60953 0 21.97865 -56.74628 0 -7.731812 -54.79141 0 -9.664902 -57.02435 0 -10.15347 -67.45621 0 -10.40984 -66.92435 0 -8.463181 -65.95938 0 -10.35678 -64.13013 0 -17.7079 -63.939 0 -16.50545 -63.33044 0 -17.50703 -57.54279 0 -18.05417 -57.04883 0 -16.72821 -56.55133 0 -17.98579 -61.98386 0 -17.51288 -61.29559 0 -16.56609 -61.29785 0 -17.79781 -59.83557 0 -22.25325 -59.62631 0 -21.45941 -58.95346 0 -22.04887 -57.41333 0 -22.06194 -56.39984 0 -21.44792 -56.41653 0 -22.3075 -65.51144 0 15.42719 -64.18359 0 16.57326 -65.17389 0 14.94614 -65.17062 0 6.416054 -64.15442 0 4.089104 -65.61111 0 3.622704 -54.75055 0 -0.8126984 -56.74634 0 -3.140366 -56.98349 0 -0.03636169 -60.15268 0 21.37327 -59.17905 0 20.64462 -60.17865 0 20.15058 -62.14487 0 14.34156 -61.30316 0 15.82087 -61.05936 0 14.40895 -57.54086 0 14.44617 -56.79041 0 16.14974 -56.54486 0 14.48431 -50.22827 0 -9.712341 -47.67401 0 -7.754944 -47.73239 0 -10.41379 -31.9324 0 14.6658 -28.42575 0 20.09718 -28.55389 0 13.08463 -31.82111 0 -14.15279 -28.59357 0 -9.308426 -28.45239 0 -14.23181 -13.71387 0 -14.23183 -10.23349 0 -9.213394 -9.044312 0 -14.05772 25.23544 0 19.78082 25.22635 0 12.79111 21.63132 0 12.791 10.14566 0 20.09719 10.00256 0 13.17975 7.533173 0 14.76105 6.338898 0 -14.05782 9.81778 0 -9.111786 9.820709 0 -14.13026 21.63132 0 -14.13017 25.35452 0 -9.260605 25.36362 0 -14.20662 49.88864 0 0.4343109 47.60788 0 -2.783554 47.06992 0 1.110924 38.45779 0 -22.5356 36.54276 0 -19.24713 39.15207 0 -19.01001 63.98544 0 -14.02884 63.36124 0 -12.69264 64.39005 0 -12.21123 54.93259 0 -9.549957 57.35892 0 -7.68956 57.10757 0 -10.13644 59.64975 0 -20.08691 58.99905 0 -19.34355 59.8909 0 -19.34544 53.86148 0 -17.10309 55.7803 0 -16.5481 55.53812 0 -17.93486 55.55472 0 -24.16711 54.28488 0 -23.64096 55.55356 0 -23.23509 59.83627 0 -22.25325 58.97147 0 -22.06522 59.64438 0 -21.47577 64.13089 0 -17.7079 63.33115 0 -17.50703 63.93961 0 -16.50545 62.10464 0 18.04335 60.99014 0 17.7587 61.01743 0 18.82314 61.01303 0 0.06309509 59.19589 0 -2.939987 59.38181 0 0.1751022 57.47165 0 20.11086 56.48776 0 18.8876 56.48764 0 20.44246 54.30984 0 15.47471 55.59634 0 16.34956 55.54526 0 14.60441 59.15378 0 14.40907 60.12607 0 15.81879 60.12607 0 14.33948 69.73361 0 -3.772079 68.01175 0 -5.368393 68.30771 0 -3.272491 64.16013 0 16.57142 65.51212 0 15.42719 65.15036 0 14.94405 2.540802 0 20.41367 3.993256 0 15.07711 1.519257 0 15.07722 -5.978668 0 13.17975 -6.772369 0 20.09742 -2.81778 0 14.76083 -51.78534 0 22.75942 -49.93073 0 24.17608 -50.45316 0 22.09091 -47.57971 0 -2.957932 -50.09323 0 -0.6545715 -47.12616 0 0.9365463 -45.24655 0 7.008217 -46.20901 0 12.04186 -43.25626 0 10.60838 -49.44138 0 16.26451 -51.70322 0 16.09953 -50.3717 0 18.89452 -56.79041 0 18.84603 -57.54089 0 20.11086 -56.54486 0 20.40102 -61.21313 0 -14.17851 -61.87225 0 -12.75969 -60.77408 0 -12.80742 -58.08496 0 -12.17567 -57.80746 0 -14.0981 -59.10349 0 -12.71838 -63.34711 0 -12.66483 -63.98483 0 -14.02884 -64.37592 0 -12.18338 -53.81345 0 -18.37918 -55.43246 0 -19.86203 -55.49606 0 -18.83063 -59.00052 0 -19.03554 -59.63174 0 -20.02313 -59.9097 0 -19.29095 -61.77158 0 -19.88133 -61.16742 0 -18.84268 -60.83316 0 -19.20094 -54.26196 0 -23.6479 -55.55399 0 -24.16711 -55.53061 0 -23.242 -64.08945 0 12.82767 -65.08279 0 10.76212 -65.10696 0 12.9644 -67.9975 0 -5.340561 -69.73297 0 -3.772064 -68.29349 0 -3.244659 -69.23535 0 2.916008 -67.39444 0 1.822151 -68.05606 0 -0.1222 -62.03415 0 4.184128 -60.94553 0 6.502838 -60.72733 0 4.184128 -57.46579 0 6.274643 -58.00024 0 3.165344 -59.02222 0 4.026131 -61.30316 0 17.76078 -62.17212 0 18.04519 -61.08667 0 18.82302 -59.17911 0 12.86916 -60.12543 0 10.7284 -60.1514 0 12.86928 -54.37991 0 13.31181 -55.8212 0 10.73724 -55.6535 0 12.98647 -49.87204 0 -24.87686 -51.60004 0 -23.98672 -49.76678 0 -24.10867 -36.54199 0 -18.05489 -38.45703 0 -22.34586 -39.15128 0 -18.76645 -46.96124 0 -14.93036 -49.849 0 -15.85997 -47.57782 0 -13.34431 -44.99069 0 -19.66235 -44.75055 0 -16.7944 -42.53186 0 -17.85822 -46.35828 0 -23.05568 -45.1752 0 -24.82875 -47.53976 0 -23.98759 -21.09869 0 4.863106 -25.29611 0 0.06404114 -25.24005 0 6.523193 -21.06366 0 -17.99156 -25.06378 0 -22.20343 -25.15491 0 -17.99156 -0.3894653 0 -17.81755 -4.748291 0 -22.20358 -4.75119 0 -17.81752 31.93301 0 6.785629 28.58054 0 0.4282608 28.45236 0 6.86203 15.74399 0 6.86216 12.47263 0 0.5768051 12.48175 0 6.934349 15.74402 0 -17.88998 12.48471 0 -22.20358 12.47565 0 -17.89001 31.82181 0 -19.10475 28.43204 0 -22.39317 28.57321 0 -18.15607 49.93143 0 24.17608 51.77213 0 22.80099 50.44003 0 22.13245 36.9512 0 12.87283 39.19925 0 19.93688 39.79855 0 13.66129 46.19662 0 12.11208 45.23434 0 7.024353 43.25699 0 10.55443 51.67709 0 16.68542 49.42905 0 16.41354 50.35861 0 19.01515 51.62302 0 -23.9798 49.87277 0 -24.87686 49.7897 0 -24.10173 47.74612 0 -7.738708 50.28159 0 -9.597382 47.71439 0 -10.42276 44.77359 0 -16.84132 45.01358 0 -19.65544 42.53256 0 -17.91203 49.85312 0 -15.52359 46.98416 0 -14.92981 47.55984 0 -13.30586 45.17599 0 -24.82874 46.3812 0 -23.04872 47.56265 0 -23.98067 66.93857 0 -8.491013 67.45688 0 -10.40984 65.97366 0 -10.3846 61.88644 0 -12.78751 61.19437 0 -14.18556 60.76877 0 -12.84227 57.50638 0 -14.06026 58.03653 0 -12.15866 59.05423 0 -12.75327 61.27682 0 -16.57315 61.98441 0 -17.51288 61.27902 0 -17.80486 61.14865 0 -18.84973 61.77231 0 -19.88133 60.81442 0 -19.20798 57.49741 0 -19.30188 56.70364 0 -20.01376 56.50546 0 -19.0643 56.70364 0 -21.45734 57.47525 0 -22.07829 56.48331 0 -22.30057 59.15378 0 20.64462 60.15335 0 21.37327 60.15335 0 20.15058 53.88071 0 3.319893 55.50778 0 6.344856 55.79422 0 4.110191 59.09067 0 6.243805 58.56161 0 3.218681 57.60806 0 4.110191 54.32339 0 22.58875 55.55893 0 23.58833 55.59634 0 22.02009 57.47165 0 12.86916 56.43668 0 10.72814 56.43668 0 12.86928 62.0148 0 12.22453 60.70792 0 10.54829 60.9462 0 12.72086 63.88651 0 3.01194 65.10861 0 6.156761 65.58151 0 3.43679 67.40866 0 1.794189 69.23605 0 2.916168 68.07028 0 -0.1498566 66.68637 0 8.930733 63.79941 0 8.109253 62.7822 0 10.3009 62.9382 0 14.08326 63.95547 0 15.06012 66.66544 0 12.22002 -4.789642 0 -4.14447 -14.36844 0 -5.50528 -18.00079 0 -0.8641052 -17.48874 0 13.17367 -12.08737 0 16.43704 -3.152435 0 3.949677 -42.20456 0 25.81831 -37.36234 0 25.83668 -34.36649 0 20.33263 -35.22964 0 6.674187 -39.59546 0 5.200737 -42.90945 0 18.29214 -57.19064 0 24.37939 -54.62674 0 25.13939 -53.01617 0 24.05006 -53.41779 0 20.73409 -55.14825 0 19.87791 -57.05048 0 22.3839 -59.14706 0 -5.576645 -54.82925 0 -5.554413 -52.56964 0 -7.73172 -52.96399 0 -12.06042 -55.85257 0 -12.94452 -59.60031 0 -9.049164 -67.36157 0 -13.38594 -69.38422 0 -9.08345 -68.84097 0 -6.968719 -65.57758 0 -6.555634 -64.23193 0 -9.144043 -65.72617 0 -13.11491 -63.79724 0 -19.10574 -65.36487 0 -16.87004 -64.91916 0 -15.2901 -63.29254 0 -15.38589 -62.63281 0 -16.55296 -62.83502 0 -18.56514 -58.08652 0 -19.45209 -58.5683 0 -17.5787 -58.2196 0 -15.77997 -56.03851 0 -15.2749 -55.04422 0 -17.03201 -56.91919 0 -19.45204 -61.96426 0 -15.38589 -60.28949 0 -15.71965 -60.28311 0 -17.47113 -62.08987 0 -19.05466 -59.26105 0 -23.28015 -61.05118 0 -21.9572 -60.55048 0 -20.97505 -58.84579 0 -20.61758 -58.08649 0 -21.34471 -58.2251 0 -22.86696 -56.91919 0 -20.61749 -54.57507 0 -20.70457 -54.65649 0 -22.03648 -57.01926 0 -23.32646 -67.62924 0 12.42905 -64.6528 0 17.28736 -63.16797 0 18.18182 -63.12665 0 16.76101 -64.09988 0 15.1511 -66.66476 0 12.22013 -66.68576 0 8.930733 -63.95468 0 8.951981 -62.9375 0 6.778717 -62.98953 0 0.2603836 -64.99142 0 -0.7819977 -67.65912 0 5.831764 -52.62482 0 3.09478 -52.56964 0 -3.328674 -59.60031 0 -1.529526 -55.56369 0 4.48951 -61.823 0 20.91447 -59.43344 0 23.09319 -58.3121 0 21.86414 -58.51178 0 19.04925 -59.77335 0 18.71117 -61.66916 0 19.6479 -62.9375 0 11.88051 -63.12662 0 14.93652 -62.17096 0 16.52693 -60.22659 0 17.07388 -59.77335 0 15.31575 -61.50565 0 11.88051 -58.3121 0 11.88051 -58.51178 0 15.3531 -57.70346 0 17.42091 -55.65182 0 17.70068 -55.14825 0 15.66166 -57.09445 0 11.88051 -50.24277 0 -5.554413 -43.49411 0 -5.319931 -43.47772 0 -9.487488 -50.54926 0 -13.43401 -30.79715 0 25.83643 -22.42752 0 25.83633 -22.94431 0 16.43701 -31.06155 0 3.37941 -34.10275 0 -20.38684 -35.06064 0 -11.61221 -31.04517 0 -4.714722 -23.2807 0 -5.50528 -23.2807 0 -11.94421 -30.19785 0 -20.38683 -17.23456 0 -20.38684 -18.00079 0 -11.94421 -2.567444 0 -10.89969 -11.37994 0 -20.38686 22.70853 0 25.83633 30.79782 0 25.83643 30.29324 0 16.75325 23.18857 0 3.198692 18.59552 0 3.198853 18.65002 0 16.75336 8.410767 0 25.83654 14.8588 0 25.83642 14.41208 0 16.75327 7.920349 0 3.949661 4.866425 0 7.402809 5.900726 0 20.33298 3.071075 0 -20.38698 3.053528 0 -10.89972 7.744659 0 -4.144501 14.35757 0 -4.579071 14.35757 0 -11.33426 7.762207 0 -20.38698 18.64999 0 -20.38686 18.59552 0 -11.33424 23.18857 0 -4.579025 31.06223 0 -5.037674 31.04581 0 -11.98257 23.24307 0 -20.38683 52.09433 0 5.226265 52.63321 0 -1.023369 50.62778 0 -4.975769 43.49472 0 -5.642883 42.44083 0 0.08347321 49.16684 0 6.699677 40.55862 0 -25.83691 36.84042 0 -25.83675 34.10342 0 -22.5345 35.06137 0 -14.20932 39.27847 0 -13.86221 41.52127 0 -21.85548 64.91977 0 -15.2901 63.29318 0 -15.38589 62.63345 0 -14.17798 62.70578 0 -10.35309 64.31393 0 -9.310867 65.72684 0 -13.1149 52.85251 0 -11.79128 53.08646 0 -7.311188 56.38431 0 -4.975769 60.24637 0 -5.743469 59.77023 0 -9.216003 55.69711 0 -12.67538 60.55112 0 -20.97504 58.95084 0 -20.76309 58.23544 0 -20.07101 58.36447 0 -18.20529 59.62094 0 -18.15086 61.00436 0 -20.20738 52.15268 0 -18.0955 52.44321 0 -15.2944 55.29807 0 -14.86346 57.61185 0 -15.82217 57.19717 0 -17.62672 54.75272 0 -19.40562 57.15683 0 -24.41708 54.62741 0 -25.13965 53.01682 0 -24.60072 52.99326 0 -22.6514 54.83432 0 -21.99495 57.01987 0 -23.32646 61.05185 0 -21.9572 59.26175 0 -23.28015 58.22574 0 -22.86696 58.23544 0 -21.44275 65.36557 0 -16.87004 63.79788 0 -19.10574 62.83572 0 -18.56514 62.63345 0 -16.55296 63.16861 0 18.18193 62.93826 0 16.74946 61.50632 0 16.51514 59.57437 0 17.07388 59.57437 0 18.71117 61.66977 0 19.6479 62.37283 0 4.462463 62.61838 0 -1.791229 56.96927 0 -1.023369 60.54196 0 4.462463 58.31271 0 21.86423 58.31277 0 19.04925 57.05124 0 17.42091 55.02206 0 18.10767 55.02206 0 20.12666 57.05112 0 22.3839 52.85342 0 13.51216 53.3356 0 17.53916 57.05118 0 15.3531 54.71567 0 12.03851 58.31277 0 11.88051 58.31277 0 15.31575 61.50632 0 14.82001 59.53043 0 11.88051 71.32834 0 -1.413101 70.80045 0 -5.046432 68.84164 0 -6.968719 65.65958 0 -6.722473 66.06876 0 -3.537247 69.74832 0 -0.591713 64.65347 0 17.28736 67.62997 0 12.42905 0.2806702 0 25.83673 3.925201 0 25.83663 0.8415833 0 7.402695 -1.357483 0 20.3329 -13.45639 0 25.83652 -5.326294 0 25.83665 -51.0994 0 25.54933 -46.69016 0 25.7444 -47.95572 0 22.38723 -52.15231 0 19.3575 -49.28796 0 6.121033 -42.44022 0 0.4062805 -49.98401 0 11.36259 -46.23706 0 18.67293 -52.97455 0 12.11758 -53.41779 0 16.41134 -62.63278 0 -14.17798 -62.62381 0 -10.18626 -60.93817 0 -10.18626 -59.43234 0 -14.47015 -52.51074 0 -16.14792 -52.01886 0 -18.6579 -61.00372 0 -20.20738 -59.73685 0 -18.06122 -62.17261 0 -21.00676 -62.83215 0 -20.31699 -52.85934 0 -22.69293 -53.01617 0 -24.60072 -54.62671 0 -25.13965 -57.15619 0 -24.41708 -70.7998 0 -5.046432 -71.32764 0 -1.413101 -69.74762 0 -0.591713 -65.98672 0 -3.370407 -71.03928 0 2.623932 -69.87201 0 7.330009 -61.50565 0 8.951981 -59.52975 0 8.951981 -59.12042 0 6.778717 -60.97269 0 0.1968307 -57.50375 0 8.951981 -55.24606 0 8.452522 -47.1055 0 -25.74469 -51.09937 0 -25.54961 -50.34351 0 -22.72659 -47.09668 0 -24.96492 -36.83972 0 -25.83675 -40.55786 0 -25.83691 -41.5206 0 -21.85548 -39.27771 0 -13.34952 -42.27124 0 -12.03452 -48.84451 0 -18.25409 -43.78156 0 -23.0061 -48.51361 0 -20.90654 -42.63745 0 -25.83708 -44.2814 0 -25.8187 -22.14719 0 -25.8367 -30.69266 0 -25.83669 -1.681763 0 -25.83688 -12.05466 0 -25.83678 34.3671 0 16.75343 35.23032 0 2.898392 14.8588 0 -25.83678 7.289368 0 -25.83688 30.69333 0 -25.83669 22.70853 0 -25.8367 46.69083 0 25.7444 51.10007 0 25.54933 53.01682 0 24.05006 53.3356 0 20.98283 52.07016 0 19.6853 47.95633 0 22.38723 37.36301 0 25.83668 42.20523 0 25.81831 42.91006 0 18.29214 39.59616 0 4.561707 46.23764 0 18.67304 49.90683 0 11.86205 51.10007 0 -25.54961 47.10617 0 -25.74469 47.09732 0 -24.96492 50.47733 0 -22.68507 50.43777 0 -13.11743 43.4783 0 -9.810455 42.27188 0 -12.35747 48.97836 0 -18.16515 48.64743 0 -20.86504 43.7822 0 -23.00609 44.28214 0 -25.8187 42.63821 0 -25.83708 69.38492 0 -9.08345 67.36227 0 -13.38594 61.96494 0 -15.38589 60.17349 0 -15.76186 59.27243 0 -14.51236 61.02017 0 -10.35309 62.09055 0 -19.05466 60.16708 0 -17.51335 62.83279 0 -20.31699 62.17331 0 -21.00676 57.51596 0 -20.763 55.33774 0 -20.75792 59.43411 0 23.09319 61.8237 0 20.91447 54.63419 0 8.793869 57.09518 0 8.951981 57.50449 0 6.778717 55.57596 0 0.5448608 59.12112 0 8.951981 60.94101 0 8.109253 54.62741 0 25.13939 57.19131 0 24.37939 67.65976 0 5.831764 65.02957 0 -1.106949 69.87271 0 7.330009 71.03995 0 2.623932</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape1-positions-array" count="1267" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape1-normals" name="qt_gauge_background_Shape1-normals">
+ <float_array id="qt_gauge_background_Shape1-normals-array" count="3801">0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape1-normals-array" count="1267" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape1-tangents" name="qt_gauge_background_Shape1-tangents">
+ <float_array id="qt_gauge_background_Shape1-tangents-array" count="3801">0 0 -1 0 0 1 -0.01260745 0 -0.9999205 -0.9935571 0 -0.1133327 -0.02785987 0 0.9996118 0.9997049 0 -0.02429235 0 0 1 0.02383522 0 0.9997159 0.02020502 0 -0.9997959 0 0 -1 0 0 1 0 0 1 0 0 -1 0.08916057 0 0.9960173 0.1466643 0 -0.9891863 0.9321503 0 0.3620715 -0.9993009 0 0.03738545 0.7784584 0 0.6276962 -0.9980543 0 -0.06235104 0.8545139 0 0.5194285 -0.07970234 0 -0.9968187 -0.4066759 0 0.9135725 0.4305852 0 0.90255 0.8937225 0 0.4486201 0.6410966 0 0.7674602 -0.7139259 0 0.7002212 -0.6008786 0 0.7993403 0.8063708 0 -0.5914103 0.9325656 0 -0.3610004 -0.8936189 0 0.4488266 0.8075466 0 -0.5898038 0.5402644 0 -0.8414953 -0.874168 0 0.4856236 -0.9769267 0 0.2135747 -0.9995703 0 -0.02931151 -0.5285107 0 0.8489267 0.9681548 0 -0.2503522 0 0 1 0 0 -1 -0.3053188 0 0.9522502 -0.7609697 0 -0.6487874 0 0 -1 0 0 1 0 0 -1 0 0 1 -0.863438 0 0.5044551 0.4646458 0 0.8854966 -0.08916477 0 -0.9960169 -0.1466589 0 0.9891871 -0.8917305 0 -0.4525668 -0.9554536 0 0.2951414 -0.78462 0 0.619977 -0.9976022 0 -0.06920877 0.8001988 0 -0.5997348 0.9999498 0 -0.01001496 -0.517826 0 0.855486 -0.4982067 0 0.8670583 -0.5727214 0 0.8197501 0.9999688 0 -0.007903802 -0.6543154 0 0.7562218 -0.8782489 0 0.4782038 -0.7658761 0 -0.6429882 0.8785176 0 -0.4777099 -0.7467219 0 0.6651363 -0.4507326 0 -0.892659 -0.874168 0 0.4856236 0.1794932 0 0.9837592 0.9604509 0 -0.2784495 0.9825681 0 0.185903 -0.897544 0 -0.4409249 -0.9997856 0 0.02070738 -0.1208385 0 0.9926722 0.7219188 0 -0.6919778 0 0 1 0.998088 0 -0.0618095 -0.9492245 0 -0.3145996 -0.02211997 0 0.9997553 0.999991 0 -0.004251518 -0.9258534 0 -0.3778828 0.9969123 0 0.07852284 -0.2125105 0 -0.9771588 -0.6719027 0 0.7406394 0.2014363 0 0.9795016 0.9994736 0 -0.03244234 -0.8280388 0 -0.5606708 0.99509 0 0.09897456 -0.3517631 0 -0.9360891 -0.6151551 0 0.7884062 -0.3269067 0 0.9450566 0.9999386 0 0.01108197 -0.5363994 0 -0.8439643 -0.6147988 0 0.788684 0.9999961 0 -0.002778108 -0.8294945 0 0.5585149 0.9866686 0 0.1627425 -0.9973165 0 0.07321074 0.3259042 0 0.9454028 0.5791694 0 -0.8152072 -0.9993939 0 -0.03481275 0.8137143 0 -0.581265 -1 0 0 0.2080347 0 0.9781214 0.7289122 0 -0.6846072 0.9965955 0 -0.082446 -0.8367852 0 0.5475313 1 0 0 -0.7976804 0 0.6030804 -0.9962671 0 0.08632413 0.04000427 0 0.9991995 0.6402839 0 -0.7681384 -0.8375099 0 -0.5464221 0 0 -1 0.9835178 0 0.1808112 0 0 -1 0.05518124 0 -0.9984764 -0.5909002 0 0.8067446 -0.5915855 0 -0.8062423 0.8299831 0 -0.5577885 0.9987159 0 0.05066066 0.9999671 0 -0.00810633 -0.9331217 0 -0.3595608 -0.8937159 0 -0.4486333 0.8481463 0 -0.5297621 0.6954672 0 0.7185579 -0.9940918 0 0.1085421 0.2272199 0 0.9738435 0.9798385 0 0.1997913 -0.5885444 0 -0.8084649 0.9802354 0 -0.1978348 -0.2720622 0 -0.9622797 -0.9630079 0 0.2694732 -0.3963617 0 -0.9180944 0.03917609 0 0.9992323 -0.6182151 0 -0.7860089 0 0 1 0.9778533 0 -0.2092914 -0.7164021 0 0.6976876 0.5777822 0 0.816191 0.005863732 0 0.9999828 0 0 1 0 0 1 -0.9995552 0 -0.02982244 0 0 1 0 0 1 -0.03381734 0 -0.999428 -0.9985938 0 -0.05301372 0.5119505 0 0.859015 -0.001836253 0 -0.9999983 -0.974149 0 0.2259066 -0.9277007 0 -0.3733248 -0.05797994 0 0.9983177 0.5070604 0 -0.8619105 0.3984741 0 0.9171796 -0.6854603 0 -0.72811 -0.2315945 0 0.9728124 -0.01593374 0 0.999873 -0.9132681 0 0.407359 -0.0528604 0 0.9986019 0.9331507 0 -0.3594854 0.6148087 0 0.7886762 -0.74849 0 0.6631461 0.01856248 0 0.9998277 -0.631463 0 -0.775406 -0.1160269 0 -0.9932461 -0.9591236 0 0.2829873 -0.5112596 0 -0.8594263 -0.2321856 0 -0.9726715 -0.9398749 0 0.3415189 -0.9599887 0 -0.2800387 -0.298107 0 0.9545324 0.9933305 0 -0.1153022 -0.6787136 0 -0.7344031 -0.09081781 0 0.9958675 0.996593 0 -0.08247683 -0.8186874 0 -0.5742395 0.006013717 0 -0.9999819 -0.9994271 0 0.03384627 0.9660729 0 0.2582696 0.340199 0 -0.9403535 -0.9979085 0 0.06464185 0.8081669 0 0.5889535 0.03535449 0 -0.9993748 -0.9999805 0 0.006242693 0.7040615 0 0.7101391 0.8962276 0 0.4435945 0.06716741 0 -0.9977417 -0.9242809 0 0.381713 0.8049255 0 0.5933759 -0.02211773 0 -0.9997554 -0.9992637 0 0.03836682 0.9789886 0 0.2039149 0.3399401 0 -0.9404471 -0.8138134 0 0.5811262 -0.0411589 0 -0.9991526 -0.6837371 0 0.7297284 0.5754953 0 0.8178051 0.2343969 0 -0.972141 -0.9906162 0 0.1366728 -0.07778157 0 -0.9969704 -0.4794892 0 0.8775478 0.8666207 0 -0.4989674 -0.9999347 0 -0.01142495 -0.7307696 0 0.6826242 -0.1739345 0 -0.9847572 -0.9990156 0 0.04436052 0.918551 0 0.3953025 -0.9993899 0 -0.03492551 0.8371642 0 -0.5469516 0.7082649 0 -0.7059468 -0.9994079 0 0.03440698 0.6403137 0 0.7681135 0.9952919 0 0.09692244 0.3245391 0 -0.9458723 -0.8950853 0 0.445895 0.999611 0 0.02788848 0.1127622 0 -0.993622 -0.8961977 0 0.4436549 0.04066929 0 -0.9991727 -0.5062365 0 0.8623947 0 0 -1 -0.8557513 0 0.5173874 0.9985652 0 0.05354951 -0.01045243 0 -0.9999454 -0.7650812 0 0.6439338 0.9990105 0 0.04447606 -0.7591695 0 0.650893 0 0 -1 -0.8941516 0 0.4477643 0.9999778 0 -0.006656758 0 0 -1 -0.9020548 0 0.4316215 0.9937174 0 -0.1119183 0.999997 0 0.002439373 -0.07007144 0 -0.997542 -0.823237 0 0.5676979 0.9999972 0 0.002353647 -0.006982113 0 -0.9999756 -0.7213642 0 0.6925559 0.9740904 0 0.2261591 0.9755864 0 0.2196162 -0.9902857 0 -0.1390474 -0.9168961 0 -0.3991259 -0.9385112 0 -0.3452487 0.6996698 0 -0.7144664 0.7977513 0 -0.6029866 0.669123 0 -0.7431517 0.4068931 0 -0.9134758 0.6814402 0 -0.7318738 0.1706485 0 -0.985332 0.4128707 0 -0.9107896 -0.9945318 0 -0.1044346 -0.339329 0 0.9406678 -0.8881936 0 -0.4594695 0.6389839 0 -0.7692201 0.7016061 0 -0.712565 0.2232648 0 -0.9747578 0.4855433 0 -0.8742126 0.583452 0 -0.8121476 0.5284737 0 -0.8489497 -0.9685571 0 0.2487913 -0.9756433 0 0.2193633 0.5574074 0 -0.8302391 0.5407935 0 -0.8411554 -0.4556883 0 0.8901394 0.9855413 0 0.1694356 0.9973786 0 0.07235999 0.2388517 0 -0.971056 0.9662213 0 0.2577139 -0.09302122 0 -0.9956641 0.7635913 0 0.6456999 0.6813233 0 0.7319826 0.7976259 0 0.6031525 0.2640166 0 0.9645181 -0.6440178 0 0.7650105 -0.4179129 0 0.9084871 -0.008601255 0 -0.999963 0.5866375 0 -0.8098497 -0.332024 0 0.9432709 -0.7505571 0 -0.6608055 -0.9989121 0 -0.04663253 0.9588992 0 -0.2837471 0.2280645 0 -0.973646 0.9472924 0 0.3203704 0.9928083 0 -0.1197148 0.6152695 0 0.7883168 0.9859526 0 0.1670256 0.9972357 0 0.07430364 -0.9612075 0 0.2758264 -0.4957414 0 0.8684702 -0.5102863 0 0.8600046 -0.6252272 0 0.7804428 0.7401804 0 -0.6724083 -0.0497765 0 0.9987604 -0.6784627 0 0.7346349 0.8694136 0 0.494085 -0.8143318 0 -0.5803997 0.694288 0 -0.7196973 -0.9290068 0 0.3700627 0.9216332 0 0.3880622 -0.7445274 0 0.6675919 -0.7233569 0 0.6904744 0.7067044 0 0.707509 -0.7403327 0 0.6722407 0.1633978 0 0.9865603 0.8668192 0 -0.4986226 -0.9999568 0 0.009292651 -0.3566734 0 0.9342291 -0.4581779 0 0.8888605 -0.4602959 0 0.8877656 -0.6794729 0 0.7337006 -0.6980135 0 0.7160846 -0.5560915 0 0.8311211 -0.3322978 0 0.9431745 -0.8242274 0 -0.566259 0.8385781 0 -0.5447814 -0.8618927 0 0.5070907 0.4960808 0 0.8682763 -0.2780001 0 0.9605811 -0.8843528 0 -0.4668191 -0.8909818 0 0.454039 0.4689053 0 0.8832484 0.5879108 0 -0.8089258 -0.9934883 0 0.1139343 -0.6266386 0 0.77931 0.8354147 0 -0.5496201 -0.9543379 0 -0.2987292 -0.9799745 0 -0.1991232 -0.2600811 0 0.9655868 -0.9308465 0 -0.3654106 0.1477699 0 -0.9890218 0.7236268 0 -0.6901915 -0.9324494 0 0.3613005 0.1593044 0 -0.9872295 -0.7227449 0 0.6911149 -0.4086676 0 0.9126833 0.7756052 0 -0.6312183 -0.3168388 0 -0.9484794 0.5051674 0 -0.8630214 -0.9983154 0 0.05802111 0.6599439 0 0.7513149 0.2836831 0 -0.9589181 -0.997278 0 0.07373259 0.7532283 0 0.6577592 -0.2576824 0 0.9662297 0.9999981 0 -0.001968825 -0.9286384 0 -0.3709861 -0.4736908 0 0.8806912 0.9988859 0 0.04719028 -0.6533734 0 -0.7570358 -0.2124818 0 0.977165 0.9998686 0 -0.01621097 -0.5893799 0 -0.807856 -0.8771349 0 -0.480244 -0.1866586 0 0.9824248 0.9674765 0 -0.252961 -0.726539 0 -0.6871252 -0.2016481 0 0.979458 0.9987528 0 -0.04992769 -0.9486619 0 -0.3162919 -0.3365955 0 0.9416493 0.9265255 0 -0.376232 -0.9963326 0 0.08556434 0.08092675 0 0.9967201 0.8175327 0 -0.5758822 -0.4969853 0 -0.8677589 -0.290049 0 0.9570118 0.9930289 0 -0.1178713 -0.9938414 0 -0.1108121 0.09736245 0 0.995249 0.5692414 0 -0.8221704 -0.8917515 0 0.4525254 0.895296 0 0.4454718 0.6891703 0 -0.7245994 -0.09542131 0 0.995437 0.9984017 0 -0.05651539 -0.8843283 0 -0.4668656 0.9960618 0 0.08866163 -0.08329372 0 -0.996525 -0.871134 0 0.4910454 -0.6861326 0 0.7274765 0.9984069 0 0.05642468 -0.5740494 0 -0.8188207 -0.9850418 0 -0.1723158 -0.3248048 0 0.9457811 0.9170337 0 -0.3988097 -0.993206 0 -0.1163692 -0.2409995 0 0.9705252 0.9308567 0 -0.3653844 -0.9943634 0 0.1060257 0.03068006 0 0.9995293 0.6253532 0 -0.7803419 -0.999969 0 0.007871803 0.09025813 0 0.9959184 0.8869915 0 -0.4617858 -0.9916225 0 -0.12917 -0.1410559 0 0.9900016 0.8269996 0 -0.5622025 -0.9775987 0 -0.2104773 -0.2178523 0 0.9759818 0.8394022 0 -0.5435107 -0.2033467 0 0.9791068 0.9098001 0 -0.4150467 -0.9982146 0 -0.05972986 0.123088 0 0.9923958 0.922904 0 -0.38503 -0.9995135 0 0.03118847 -0.9963198 0 -0.08571419 -0.09102083 0 0.995849 0.8612837 0 -0.5081244 -0.9949861 0 -0.1000131 -0.1258842 0 0.9920449 0.7908832 0 -0.6119671 0.9976726 0 0.06818694 0.1424664 0 -0.9897996 -0.8030999 0 0.5958444 0.1040661 0 -0.9945704 -0.9997851 0 0.02073001 0.8829254 0 0.4695133 0.3186973 0 -0.9478565 -0.9985096 0 0.05457578 0.8743344 0 0.4853239 -0.9958851 0 -0.09062513 0.1475325 0 0.9890572 0.7278083 0 -0.6857807 -0.1110051 0 -0.9938198 -0.9969307 0 0.07828968 0.7352651 0 0.6777797 -0.9866291 0 -0.1629818 0.3576046 0 0.9338731 0.610947 0 -0.7916715 0.3842895 0 -0.9232126 -0.989236 0 -0.146329 0.3838104 0 0.9234119 0.7473437 0 -0.6644376 -0.9808062 0 -0.1949853 0.06781985 0 0.9976976 0.9005243 0 -0.4348057 -0.9735824 0 -0.2283362 -0.009897522 0 0.999951 0.9952143 0 0.0977164 -0.427329 0 -0.9040962 -0.6185987 0 0.7857071 0.9991626 0 0.04091591 0.05831869 0 -0.998298 -0.8504412 0 0.5260702 0.9971372 0 0.07561347 -0.08864045 0 -0.9960637 -0.8113793 0 0.5845199 -0.999805 0 -0.0197478 0.4558591 0 0.890052 0.8286374 0 -0.5597857 -0.9976314 0 -0.06878707 -0.03757416 0 0.9992938 0.8357129 0 -0.5491666 0.9982154 0 -0.0597167 0.01993756 0 -0.9998012 -0.7145157 0 0.6996194 -0.9720004 0 0.2349793 0.8101014 0 0.5862897 -0.7035642 0 -0.7106317 -0.02243526 0 0.9997483 0.9993582 0 -0.03582288 -0.9629878 0 -0.2695448 -0.7612671 0 -0.6484384 -0.3193743 0 0.9476286 0.9810437 0 0.1937864 -0.9886651 0 0.1501374 0.0240993 0 0.9997096 0.674448 0 -0.7383224 0.3057806 0 -0.952102 -0.9990918 0 0.04260946 0.5322011 0 0.846618 -0.5382964 0 -0.8427556 -0.8649759 0 0.5018135 0.9648507 0 0.2627987 0.9436054 0 -0.3310722 -0.9698741 0 -0.2436065 -0.5403157 0 0.8414624 0.3404906 0 -0.9402479 -0.9960475 0 0.08882227 0.7492663 0 0.6622688 -0.1856483 0 -0.9826163 -0.9979288 0 0.06432827 0.8932523 0 0.4495557 0.6785141 0 0.7345874 0.3565911 0 -0.9342605 -0.9623104 0 -0.2719536 0.9916706 0 0.1287996 -0.1755278 0 -0.9844745 -0.9612466 0 0.2756901 0.8889368 0 0.4580298 0.2271054 0 -0.9738702 -0.7506306 0 0.6607222 0.9188505 0 0.3946058 0.2686595 0 -0.9632352 -0.8858152 0 0.4640381 -0.5836117 0 -0.8120329 -0.6497951 0 0.7601094 0.901297 0 -0.4332017 0.9987365 0 0.05025333 -0.2122495 0 -0.9772155 -0.5318141 0 0.8468611 0.9999141 0 0.01310878 0.2630158 0 -0.9647915 -0.8722945 0 0.4889808 0.4139285 0 -0.9103094 -0.9754077 0 -0.2204082 0.5590657 0 0.8291234 -0.9807904 0 0.1950648 0.9180859 0 0.3963816 -0.4648927 0 -0.885367 -0.9937633 0 -0.1115102 0.1402225 0 0.99012 0.959431 0 -0.2819434 0.3971649 0 0.9177473 0.8580838 0 -0.5135096 -0.9813468 0 0.1922456 0.4326363 0 -0.9015685 -0.9996178 0 0.02764595 -0.0113802 0 0.9999352 0.9930681 0 0.1175403 0.3479783 0 -0.9375026 -0.9256777 0 0.3783131 0.9886291 0 0.1503744 0.2722261 0 -0.9622333 -0.8945452 0 0.4469776 -0.03943483 0 -0.9992221 -0.9839066 0 -0.1786837 0.4892096 0 0.8721662 0.9586281 0 0.2846615 0.2654009 0 -0.9641381 -0.9703859 0 0.2415597 0.7641636 0 -0.6450225 -0.9762881 0 -0.2164755 -0.4571079 0 0.8894112 -0.5224012 0 -0.8526998 -0.6767334 0 0.7362281 0.9842968 0 -0.1765213 0.2054697 0 0.9786635 0.6124472 0 -0.7905115 -0.5588269 0 -0.8292843 0.997902 0 0.06474242 -0.1823295 0 -0.9832375 -0.8536402 0 0.5208632 0.9808766 0 0.1946307 0.1084693 0 -0.9940998 -0.7955437 0 0.6058963 0.9935951 0 0.1129988 0.102181 0 -0.9947658 -0.7320787 0 0.6812201 0.9965809 0 0.08262267 0.09944052 0 -0.9950435 -0.8922094 0 0.4516219 0.9986312 0 0.05230431 0.1663855 0 -0.9860608 -0.9010885 0 0.4336353 0.9960631 0 0.08864741 0.1346893 0 -0.9908879 -0.8264941 0 0.5629454 0.9996916 0 -0.02483407 -0.05660115 0 -0.9983969 -0.7704973 0 0.6374433 -0.3072869 0 0.9516169 0.9764787 0 0.215614 -0.5005265 0 -0.8657212 -0.9862853 0 -0.1650495 -0.3443258 0 0.9388502 0.9759309 0 -0.21808 0.897009 0 0.4420122 0.6653666 0 -0.7465167 -0.9851618 0 0.1716284 0.9821672 0 -0.1880097 -0.77037 0 -0.6375971 0.23197 0 0.9727229 0.9559948 0 0.2933836 0.07369091 0 -0.9972811 -0.5132763 0 0.8582234 -0.2394615 0 0.9709059 0.995437 0 -0.09542081 -0.3817234 0 -0.9242766 0.605947 0 0.795505 0.3157555 0 -0.9488406 -0.9777973 0 -0.2095532 0.9607843 0 -0.2772968 -0.5955796 0 -0.8032963 0.32368 0 0.9461666 -0.1903701 0 -0.9817124 -0.5289696 0 0.8486408 0.8042321 0 -0.5943154 -0.08006301 0 0.9967898 0.9167705 0 -0.3994144 -0.9238769 0 -0.3826899 0.9898223 0 0.1423087 0.04053457 0 -0.9991781 -0.9477508 0 0.3190117 -0.357886 0 -0.9337653 -0.6811806 0 0.7321154 0.950566 0 -0.3105226 -0.4479844 0 0.8940414 0.9997671 0 0.02158165 -0.5864922 0 -0.8099549 0.5434097 0 0.8394676 0.8406928 0 -0.5415123 -0.8131597 0 -0.5820407 0.9968472 0 0.07934544 -0.06436185 0 -0.9979266 -0.7122488 0 0.7019271 -0.1461224 0 0.9892665 0.997855 0 -0.06546229 -0.449327 0 -0.8933674 -0.9962363 0 -0.08667906 0.4571248 0 0.8894026 0.4446305 0 -0.8957141 -0.9590848 0 -0.283119 -0.2206209 0 0.9753596 0.9507226 0 -0.3100427 0.4546968 0 0.8906463 0.8745543 0 -0.4849275 -0.9790533 0 0.2036041 -0.9854704 0 -0.1698474 0.2371818 0 0.9714653 0.7901657 0 -0.6128933 0.997925 0 0.06438633 0.3275759 0 -0.9448249 -0.8847991 0 0.4659727 0.9980092 0 0.06306876 -0.2168272 0 -0.97621 -0.8709521 0 0.4913679 -0.9897375 0 -0.1428974 -0.3790406 0 0.9253801 0.9563935 0 -0.2920811 -0.9476655 0 0.3192651 0.9330799 0 0.3596691 0.6517067 0 -0.7584711 0.9983892 0 0.0567365 -0.06393393 0 -0.9979541 0.9415403 0 -0.3369004 0.9974892 0 0.07081929 -0.1311417 0 -0.9913636 0.8427542 0 -0.5382986 -0.9918916 0 -0.1270871 0.2669777 0 0.9637027 -0.8970831 0 0.4418619 -0.9434495 0 -0.3315162 -0.008571791 0 0.9999633 -0.8584937 0 0.5128241 -0.9964076 0 -0.08468651 0.07402877 0 0.9972561 -0.7533638 0 0.657604 0.6696923 0 -0.7426387 -0.9674254 0 -0.2531563 -0.5897975 0 -0.8075512 0.7375392 0 -0.6753043 -0.9979515 0 -0.06397468 -0.4643269 0 -0.8856639 0.5547561 0 -0.832013 -0.9792146 0 -0.2028271 -0.6114112 0 -0.791313 0.09347472 0 -0.9956217 -0.9964008 0 0.0847674 -0.9159267 0 -0.4013456 0.6794635 0 -0.7337093 -0.9975003 0 -0.07066211 -0.2272615 0 -0.9738338 0.04309994 0 -0.9990708 -0.8368648 0 0.5474096 -0.718843 0 -0.6951725 0.5821802 0 -0.8130598 -0.6385999 0 0.7695389 -0.9588388 0 0.2839509 -0.9997257 0 -0.02341869 0.2128345 0 0.9770883 -0.8668044 0 0.4986484 -0.1218201 0 0.9925522 0.9967778 0 -0.08021282 0.8505719 0 0.5258588 -0.8706224 0 -0.4919519 0.269781 0 0.9629217 -0.8600937 0 0.510136 0.6291028 0 -0.7773221 -0.9977314 0 0.06732039 -0.7347506 0 -0.6783373 0.6863691 0 -0.7272533 -0.9990584 0 0.04338527 -0.8011775 0 -0.5984268 0.04942688 0 -0.9987777 -0.9865727 0 0.1633228 -0.8004839 0 -0.5993542 0.1857591 0 -0.9825953 -0.9604896 0 0.2783159 -0.9343192 0 -0.3564375 0.6073226 0 -0.7944553 -0.9462773 0 0.3233562 -0.8187506 0 -0.5741493 0.4606441 0 -0.8875849 -0.9979488 0 0.06401705 -0.6208336 0 -0.7839424 -0.9668996 0 0.255157 0.8795112 0 0.4758782 -0.6935573 0 0.7204015 -0.9760625 0 0.2174901 0.9360624 0 0.3518339 -0.5857373 0 0.8105009 0.4889721 0 -0.8722994 -0.9634523 0 0.26788 -0.8233826 0 -0.5674867 0.5308923 0 -0.8474393 -0.9415792 0 0.3367917 -0.7933064 0 -0.6088226 -0.5546261 0 0.8320997 0.9963581 0 -0.08526762 0.8111561 0 0.5848297 0.9889044 0 0.1485535 -0.1975671 0 -0.9802894 0.7562302 0 -0.6543056 0.9997096 0 0.02409742 -0.1865531 0 -0.9824449 0.8529422 0 -0.5220054 0.04731359 0 -0.9988801 -0.9231828 0 0.3843612 -0.8326096 0 -0.5538603 0.9972991 0 0.07344748 -0.1393391 0 -0.9902447 0.5393328 0 -0.8420927 -0.3179193 0 -0.9481178 -0.8168201 0 0.5768924 -0.8377015 0 -0.5461284 0.8387881 0 0.544458 0.06568065 0 -0.9978407 0.7470708 0 -0.6647445 0.679522 0 0.7336551 0.07344279 0 -0.9972994 0.9483914 0 -0.3171021 0.7376189 0 0.6752173 0.106429 0 -0.9943203 0.9823192 0 -0.1872138 0.5257423 0 0.8506439 0.9000294 0 -0.4358292 0.8547037 0 0.5191161 -0.6942164 0 0.7197664 0.9411473 0 -0.3379968 0.9123422 0 0.4094285 -0.3408898 0 0.9401033 0.9449048 0 -0.3273452 0.8875145 0 0.4607798 -0.3274656 0 -0.9448631 -0.9421113 0 0.3353004 -0.9143601 0 -0.404902 0.6641778 0 -0.7475747 -0.9249615 0 0.3800607 -0.8592009 0 -0.5116384 -0.3530167 0 0.935617 0.9216416 0 -0.3880423 0.9127063 0 0.4086163 -0.6296394 0 -0.7768875 0.5821802 0 0.8130598 -0.9636446 0 -0.2671875 -0.9977089 0 -0.06765318 0.4028722 0 0.9152562 -0.8265509 0 0.562862 0.9017645 0 -0.4322277 -0.9220834 0 -0.3869912 -0.4632917 0 -0.8862059 0.1503239 0 -0.9886368 -0.8367955 0 0.5475156 -0.9580552 0 -0.2865838 0.9932175 0 0.1162709 -0.04915558 0 -0.9987911 0.847104 0 -0.5314272 0.9732482 0 -0.2297562 -0.8197149 0 -0.5727717 0.4003839 0 -0.9163475 0.7600053 0 0.6499169 0.7224076 0 -0.6914674 0.9970589 0 -0.07663917 0.9989603 0 0.04558884 -0.348063 0 -0.9374712 0.8327673 0 -0.5536231 0.9999242 0 0.01231494 -0.3123599 0 -0.9499638 0.6654233 0 -0.7464663 -0.9245082 0 0.3811622 0.9393656 0 0.3429173 0.3543646 0 0.9351073 -0.2028507 0 0.9792097 0.9997113 0 -0.02402603 0.8608869 0 0.5087963 -0.5347384 0 0.8450177 0.8686886 0 -0.4953586 0.3532665 0 0.9355227 -0.5621647 0 0.8270253 0.9982556 0 -0.05904016 0.3719491 0 0.9282531 0.7325062 0 -0.6807604 -0.9995217 0 -0.03092615 0.2473209 0 -0.9689336 0.06777965 0 0.9977003 0.8387111 0 -0.5445766 0.7544468 0 0.6563613 -0.5993191 0 0.8005102 0.9977414 0 -0.06717252 0.9129803 0 0.4080036 0.9188965 0 0.3944987 -0.3530212 0 -0.9356153 0.91255 0 -0.4089651 -0.8295914 0 -0.558371 -0.6237094 0 0.7816563 -0.9935588 0 -0.1133182 0.3057288 0 -0.9521186 -0.9827589 0 0.1848915 -0.8316172 0 -0.5553493 -0.931902 0 0.3627103 0.9693226 0 0.245792 -0.4860351 0 0.8739393 0.9971244 0 0.07578206 0.5330378 0 -0.8460914 0.8081222 0 -0.5890148 -0.7004921 0 0.7136602 0.9805076 0 -0.1964809 0.9034182 0 0.4287606 -0.7201322 0 0.6938369 0.9447524 0 -0.3277849 0.866911 0 0.498463 0.6972101 0 0.7168669 -0.1799983 0 -0.9836669 0.3164994 0 -0.9485927 -0.6678329 0 0.7443113 0.990058 0 -0.1406598 0.6656765 0 0.7462405 0.4748941 0 0.880043 0.5376964 0 -0.8431385 0.9291536 0 -0.3696939 0.9049953 0 -0.4254215 -0.7736292 0 -0.6336386 0.162903 0 -0.9866421 -0.9521391 0 0.3056651 0.4949328 0 0.8689312 -0.02457634 0 0.999698 -0.134011 0 0.9909798 0.9404763 0 -0.3398594 0.8904669 0 0.455048 -0.4500408 0 0.893008 0.9149343 0 -0.4036027 0.7118769 0 0.7023042 -0.4866803 0 0.8735801 0.8709479 0 -0.4913754 0.7108811 0 0.7033122 -0.7472205 0 0.6645763 0.9551313 0 -0.2961826 0.8762881 0 0.4817874 -0.7160361 0 0.6980633 0.9653852 0 -0.2608282 0.8959279 0 0.4441994 -0.5456944 0 0.8379843 0.9381778 0 -0.3461538 0.7990333 0 0.6012868 -0.1195843 0 0.992824 0.9043907 0 -0.4267055 0.8577107 0 0.5141327 -0.8367657 0 -0.5475611 0.1358942 0 0.9907234 -0.9536848 0 0.3008078 0.79525 0 -0.6062816 -0.9927281 0 0.1203786 -0.8474858 0 -0.5308181 -0.8266414 0 0.562729 0.9736665 0 0.2279772 0.3722825 0 0.9281195 0.4909479 0 0.8711889 0.762935 0 -0.6464752 0.9964494 0 0.08419329 -0.1810013 0 0.9834829 0.6972036 0 -0.7168732 0.3270243 0 0.9450159 -0.9886676 0 -0.1501212 0.02457535 0 0.999698 -0.7953225 0 0.6061865 -0.7671351 0 0.6414856 0.9026229 0 0.4304322 0.141776 0 0.9898988 0.4068731 0 0.9134847 0.5101672 0 -0.8600752 0.9153461 0 0.402668 0.494932 0 -0.8689317 -0.9543079 0 -0.2988249 -0.02105393 0 -0.9997783 -0.965841 0 0.2591356 0.669687 0 0.7426435 -0.6030404 0 0.7977106 -0.2938303 0 0.9558576 0.9997972 0 -0.02013715 0.6466374 0 0.7627975 0.8259983 0 -0.5636726 -0.9414407 0 -0.3371786 0.2860723 0 -0.958208 -0.995624 0 -0.0934492 0.09345829 0 0.9956232 -0.9095889 0 0.4155094 -0.9999209 0 0.01257433 0.7325406 0 0.6807233 0.2330581 0 0.9724628 -0.08075501 0 0.996734 0.9911063 0 -0.1330727 0.7011958 0 0.7129688 -0.9905786 0 -0.1369452 0.05530856 0 0.9984693 -0.641465 0 0.7671523 0.2624863 0 -0.9649357 -0.8706722 0 0.4918637 -0.8692352 0 -0.4943988 0.6187398 0 -0.785596 -0.9805136 0 0.1964511 -0.5332119 0 -0.8459817 -0.9346596 0 0.3555439 0.9781831 0 0.2077448 -0.4507513 0 0.8926496 -0.02526099 0 -0.9996809 -0.9434579 0 0.3314924 -0.855255 0 -0.5182074 -0.6858571 0 0.7277363 0.9756924 0 -0.2191444 0.8931976 0 0.4496643 -0.09132107 0 0.9958215 0.9376465 0 -0.3475904 0.947865 0 0.3186721 0.7369764 0 -0.6759184 -0.9994492 0 0.03318508 -0.742068 0 -0.6703247 -0.5941875 0 -0.8043266 -0.8295953 0 0.5583652 -0.9941728 0 0.1077982 -0.3830192 0 0.9237404 -0.2466161 0 0.9691132 0.9791748 0 -0.2030189 0.9990285 0 0.04406939 -0.4971718 0 -0.8676521 -0.7563517 0 -0.6541652 -0.1507421 0 0.9885731 -0.1972368 0 0.9803559 0.9832496 0 -0.1822643 1 0 3.00413e-4 -0.8488111 0 -0.5286963 -0.8073758 0 -0.5900375 0.01260745 0 -0.9999205 0.001797396 0 -0.9999984 -0.9999968 0 -0.00254504 -0.9962078 0 0.08700592 0.9738217 0 0.2273134 0.9728732 0 0.2313391 0.4507326 0 -0.892659 0.2322477 0 -0.9726567 -0.9999841 0 -0.005634232 -0.9863046 0 0.1649343 0.8479822 0 0.5300247 0.7843208 0 0.6203554 0.05798294 0 -0.9983176 -0.02656333 0 -0.9996471 -0.9991831 0 -0.0404118 -0.9857176 0 0.1684067 0.6931645 0 0.7207794 0.73506 0 0.678002 0.8782473 0 0.4782068 0.913267 0 0.4073614 -0.003439245 0 -0.9999941 0.1742323 0 -0.9847046 -0.901117 0 0.433576 -0.9478526 0 0.318709 0.7845876 0 0.620018 0.8295038 0 0.5585011 0.0056623 0 -0.999984 -0.1042653 0 -0.9945495 -0.999949 0 -0.01009704 -0.9866735 0 0.1627129 0.9737209 0 0.2277447 0.9569643 0 0.2902058 0.5695836 0 -0.8219334 0.1378514 0 -0.9904529 -0.8690644 0 0.4946989 -0.7602376 0 0.6496451 0.07604955 0 -0.997104 -0.3156539 0 -0.9488744 -0.6782982 0 0.7347868 -0.6323551 0 0.7746787 0.5178372 0 0.8554792 0.6148128 0 0.7886731 0.3424935 0 -0.9395202 0.1738824 0 -0.9847664 -0.9721181 0 0.2344916 -0.9989706 0 0.04536285 -0.2119659 0 -0.9772771 -0.006157603 0 -0.999981 -0.4444432 0 0.895807 -0.4788372 0 0.8779037 0.8975356 0 -0.440942 0.8375099 0 -0.5464221 -0.9999954 0 0.003038907 -0.9987866 0 -0.04924722 -0.6480089 0 0.7616328 -0.7687049 0 0.6396036 -0.3830282 0 -0.9237366 0.2151481 0 -0.9765814 -0.9935941 0 0.1130082 -0.9997648 0 -0.02168545 0.9028525 0 0.4299505 0.9362134 0 0.3514321 -0.9983657 0 -0.05714865 -0.9996704 0 0.02567375 0.8157778 0 -0.5783654 0.8235648 0 -0.5672222 0.7658689 0 -0.6429968 0.6315052 0 -0.7753716 -1 0 0 -0.9940438 0 0.1089816 0.8478371 0 0.5302568 0.2049559 0 0.9787712 0.9887916 0 0.1493022 0.9998351 0 0.01815978 0.4929239 0 -0.8700724 0.2183828 0 -0.9758632 -0.914435 0 0.4047329 -0.890854 0 0.4542898 1 0 0 0.9960616 0 0.08866411 0.097737 0 -0.9952123 0.1550973 0 -0.9878992 -0.918822 0 0.3946721 -0.8817944 0 0.471634 0.02550687 0 -0.9996746 0.03009619 0 -0.999547 -0.5625748 0 0.8267464 -0.4633218 0 0.8861901 0 0 -1 0 0 -1 -0.8827694 0 0.4698066 -0.842546 0 0.5386244 0.9999955 0 -0.003012625 0.9869972 0 0.1607375 0.0781179 0 -0.9969441 -0.1954092 0 -0.9807218 -0.7646722 0 0.6444195 -0.7819871 0 0.6232947 0.9999993 0 -0.001198328 0.9907205 0 0.1359153 -0.8290359 0 0.5591953 -0.7041305 0 0.7100706 0 0 -1 0 0 -1 -0.9119029 0 0.410406 -0.8767515 0 0.4809437 0.9999597 0 -0.008977829 0.9999989 0 -0.0014948 0 0 -1 0 0 -1 -0.9064645 0 0.4222821 -0.8803916 0 0.4742474 0.9801939 0 -0.19804 0.9991143 0 -0.04207859 0.9999971 0 0.002396638 0.9999991 0 0.001319405 -0.2254716 0 -0.9742497 -0.06084455 0 -0.9981473 -0.8437245 0 0.5367765 -0.7923041 0 0.6101263 0.9999993 0 -0.001192732 0.9999553 0 0.00945527 0.04423747 0 -0.999021 -0.1062294 0 -0.9943416 -0.6670071 0 0.7450513 -0.7443796 0 0.6677566 -0.9930673 0 0.117547 -0.9784098 0 -0.2066742 -0.2823294 0 0.9593175 -0.06986167 0 0.9975567 0.7806248 0 -0.6249999 0.6758635 0 -0.7370268 0 0 1 0 0 1 0.9999876 0 0.004971913 0.9877088 0 -0.156305 -0.9613403 0 -0.2753632 -0.9763456 0 -0.2162158 0.005672818 0 0.9999839 -0.1042566 0 0.9945504 0.9999607 0 0.008865931 0.9995591 0 -0.02969166 -0.9011549 0 -0.4334972 -0.9488064 0 -0.3158581 0.9673979 0 0.2532614 0.9856184 0 -0.1689862 -0.4127743 0 -0.9108334 -0.1772548 0 -0.984165 -0.6559591 0 0.7547965 -0.61868 0 0.7856431 0.3425043 0 0.9395163 0.04968677 0 0.9987648 0.9999725 0 0.007417426 0.9951706 0 -0.09816089 -0.8668449 0 -0.4985779 -0.8315396 0 -0.5554655 0.9664866 0 0.2567172 0.9341104 0 -0.3569843 -0.4257246 0 -0.9048528 -0.4221643 0 -0.9065193 -0.5599371 0 0.8285351 -0.5618194 0 0.8272599 -0.4305752 0 0.9025547 -0.2272241 0 0.9738425 0.999954 0 0.009587739 0.9999167 0 0.01290325 -0.5373243 0 -0.8433757 -0.5012131 0 -0.8653239 -0.6411139 0 0.7674458 -0.5755199 0 0.8177878 0.9999997 0 7.63079e-4 0.9999365 0 -0.01126486 -0.8545117 0 0.5194322 -0.8049134 0 0.5933922 0.9545544 0 0.2980368 0.9992626 0 0.03839654 -0.9999955 0 -0.003012318 -0.9678173 0 0.2516539 0.5268821 0 0.8499384 0.228364 0 0.9735758 0.744555 0 -0.6675611 0.1959564 0 -0.9806126 -0.9985225 0 -0.05434028 -0.9990632 0 -0.04327529 0.7160855 0 -0.6980125 0.8610623 0 -0.5084995 -1 0 0 -1 0 0 0.09223182 0 0.9957376 0.4180226 0 0.9084367 0.6573424 0 -0.7535921 0.7579122 0 -0.6523566 0.9981816 0 -0.06027821 0.9851564 0 -0.171659 -0.8397258 0 0.5430107 -0.7984667 0 0.602039 1 0 0 1 0 0 -0.6770032 0 0.7359801 -0.8547237 0 0.5190832 -0.9997045 0 -0.02431028 -0.979832 0 0.199823 -0.003439322 0 0.9999941 0.109155 0 0.9940247 0.6828212 0 -0.7305856 0.605823 0 -0.7955995 -0.8063708 0 -0.5914103 -0.8666117 0 -0.4989832 0 0 -1 -1.13213e-4 0 -1 0.983289 0 0.1820515 0.9883353 0 0.1522935 0 0 -1 0 0 -1 0.08916197 0 -0.9960171 0.03377988 0 -0.9994293 -0.6921183 0 0.7217841 -0.5781941 0 0.8158992 -0.4828534 0 -0.8757012 -0.6796186 0 -0.7335656 0.7421903 0 -0.6701892 0.9300354 0 -0.3674698 0.9998794 0 0.01553156 0.9845534 0 0.1750848 0.9999598 0 -0.008962818 0.9999981 0 0.001940293 -0.9348569 0 -0.3550247 -0.9555916 0 -0.2946941 -0.6901891 0 -0.7236291 -0.9995329 0 0.03056126 0.8581304 0 -0.5134318 0.8727295 0 -0.488204 0.6543656 0 0.7561783 0.7484447 0 0.6631972 -0.9636175 0 0.2672852 -0.9987675 0 0.04963367 0.1466763 0 0.9891845 0.3269033 0 0.9450578 0.9554536 0 0.2951414 0.9962671 0 0.08632413 -0.581611 0 -0.813467 -0.5989048 0 -0.8008202 0.9935561 0 -0.1133412 0.95999 0 -0.2800344 -0.5561176 0 -0.8311036 0.2627059 0 -0.964876 -0.9635169 0 0.2676476 -0.9622846 0 0.2720447 -0.6735622 0 -0.7391305 -0.0750039 0 -0.9971832 0.02784967 0 0.9996121 0.0579725 0 0.9983182 -0.6715288 0 -0.7409784 -0.5106557 0 -0.8597853 0 0 1 0 0 1 0.9983001 0 -0.05828356 0.9567054 0 -0.291058 -0.8015536 0 0.5979229 -0.6504407 0 0.759557 0.8128592 0 0.5824602 0.2290371 0 0.9734177 0 0 1 0.01593318 0 0.9998731 0 0 1 0 0 1 0 0 1 0 0 1 -0.9999988 0 0.001552241 -0.9954781 0 -0.09499167 0 0 1 0 0 1 0 0 1 0 0 1 -0.02020502 0 -0.9997959 -0.0551415 0 -0.9984785 -0.9999843 0 0.005611235 -0.9891738 0 -0.1467485 0.3582526 0 0.9336247 0.5754566 0 0.8178323 0 0 -1 -0.00597051 0 -0.9999822 -0.9806448 0 0.1957953 -0.9702047 0 0.2422866 -0.9684854 0 -0.2490701 -0.8026781 0 -0.5964125 -0.08917261 0 0.9960162 -0.03916768 0 0.9992327 0.4473061 0 -0.8943809 0.6044741 0 -0.7966248 0.2781395 0 0.9605407 0.4528655 0 0.8915788 -0.7540408 0 -0.6568276 -0.616862 0 -0.7870713 -0.03143989 0 0.9995056 -0.574385 0 0.8185853 -0.02382212 0 0.9997162 -0.005863732 0 0.9999828 -0.9321594 0 0.3620482 -0.8962263 0 0.4435971 0.07606313 0 0.997103 -0.317853 0 0.94814 0.9671634 0 -0.2541555 0.9123139 0 -0.4094915 0.5605534 0 0.8281183 0.6349694 0 0.7725373 -0.7784111 0 0.6277548 -0.6954828 0 0.7185428 0.02159678 0 0.9997668 -0.009328851 0 0.9999565 -0.5402644 0 -0.8414953 -0.7082844 0 -0.7059272 -0.4063973 0 -0.9136965 0.2680572 0 -0.963403 -0.9635195 0 0.2676383 -0.9520191 0 0.3060385 -0.6735622 0 -0.7391305 -0.3354634 0 -0.9420532 -0.1466589 0 -0.9891871 -0.34026 0 -0.9403314 -0.955606 0 0.2946476 -0.9305363 0 0.3661996 -0.9325618 0 -0.3610103 -0.9802378 0 -0.1978228</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape1-tangents-array" count="1267" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape1-binormals" name="qt_gauge_background_Shape1-binormals">
+ <float_array id="qt_gauge_background_Shape1-binormals-array" count="3801">-1 0 0 1 0 0 -0.9999206 0 0.01260745 -0.1133327 0 0.9935571 0.9996119 0 0.02785987 -0.02429235 0 -0.999705 1 0 0 0.9997159 0 -0.02383522 -0.9997959 0 -0.02020502 -1 0 0 1 0 0 1 0 0 -1 0 0 0.9960173 0 -0.08916057 -0.9891863 0 -0.1466643 0.3620715 0 -0.9321503 0.03738546 0 0.999301 0.6276963 0 -0.7784585 -0.06235104 0 0.9980543 0.5194285 0 -0.8545139 -0.9968188 0 0.07970234 0.9135725 0 0.4066759 0.90255 0 -0.4305851 0.4486201 0 -0.8937225 0.7674602 0 -0.6410966 0.7002212 0 0.713926 0.7993403 0 0.6008786 -0.5914103 0 -0.8063709 -0.3610004 0 -0.9325656 0.4488266 0 0.8936189 -0.5898038 0 -0.8075466 -0.8414953 0 -0.5402644 0.4856236 0 0.874168 0.2135748 0 0.9769268 -0.02931151 0 0.9995704 0.8489267 0 0.5285107 -0.2503522 0 -0.9681548 1 0 0 -1 0 0 0.9522502 0 0.3053188 -0.6487874 0 0.7609698 -1 0 0 1 0 0 -1 0 0 1 0 0 0.504455 0 0.863438 0.8854967 0 -0.4646459 -0.996017 0 0.08916478 0.9891872 0 0.1466589 -0.4525669 0 0.8917306 0.2951414 0 0.9554537 0.6199771 0 0.78462 -0.06920877 0 0.9976022 -0.5997348 0 -0.8001989 -0.01001496 0 -0.9999499 0.855486 0 0.517826 0.8670583 0 0.4982068 0.8197501 0 0.5727214 -0.007903801 0 -0.9999688 0.7562218 0 0.6543154 0.4782039 0 0.8782489 -0.6429882 0 0.7658761 -0.4777099 0 -0.8785176 0.6651363 0 0.7467219 -0.892659 0 0.4507326 0.4856236 0 0.874168 0.9837593 0 -0.1794932 -0.2784495 0 -0.9604509 0.185903 0 -0.9825682 -0.4409249 0 0.897544 0.02070738 0 0.9997856 0.9926722 0 0.1208385 -0.6919778 0 -0.7219188 1 0 0 -0.0618095 0 -0.998088 -0.3145996 0 0.9492245 0.9997554 0 0.02211997 -0.004251519 0 -0.9999911 -0.3778828 0 0.9258536 0.07852284 0 -0.9969124 -0.9771588 0 0.2125105 0.7406394 0 0.6719027 0.9795016 0 -0.2014363 -0.03244234 0 -0.9994737 -0.5606709 0 0.8280388 0.09897457 0 -0.9950901 -0.9360891 0 0.3517631 0.7884061 0 0.615155 0.9450566 0 0.3269067 0.01108197 0 -0.9999386 -0.8439643 0 0.5363994 0.788684 0 0.6147988 -0.002778108 0 -0.9999962 0.558515 0 0.8294946 0.1627425 0 -0.9866686 0.07321074 0 0.9973165 0.9454029 0 -0.3259042 -0.8152073 0 -0.5791694 -0.03481275 0 0.9993939 -0.581265 0 -0.8137143 0 0 1 0.9781215 0 -0.2080347 -0.6846072 0 -0.7289122 -0.082446 0 -0.9965956 0.5475313 0 0.8367853 0 0 -1 0.6030805 0 0.7976804 0.08632413 0 0.9962672 0.9991995 0 -0.04000427 -0.7681383 0 -0.6402839 -0.5464221 0 0.8375099 -1 0 0 0.1808112 0 -0.9835179 -1 0 0 -0.9984764 0 -0.05518125 0.8067446 0 0.5909002 -0.8062423 0 0.5915855 -0.5577886 0 -0.8299831 0.05066067 0 -0.998716 -0.008106329 0 -0.9999672 -0.3595608 0 0.9331217 -0.4486333 0 0.893716 -0.5297621 0 -0.8481463 0.7185579 0 -0.6954672 0.1085422 0 0.9940919 0.9738435 0 -0.2272199 0.1997913 0 -0.9798385 -0.8084649 0 0.5885444 -0.1978348 0 -0.9802354 -0.9622797 0 0.2720622 0.2694732 0 0.963008 -0.9180945 0 0.3963617 0.9992324 0 -0.03917609 -0.786009 0 0.6182151 1 0 0 -0.2092914 0 -0.9778534 0.6976876 0 0.7164022 0.816191 0 -0.5777822 0.9999828 0 -0.005863732 1 0 0 1 0 0 -0.02982244 0 0.9995552 1 0 0 1 0 0 -0.9994281 0 0.03381734 -0.05301372 0 0.9985938 0.859015 0 -0.5119504 -0.9999983 0 0.001836253 0.2259066 0 0.974149 -0.3733248 0 0.9277007 0.9983178 0 0.05797993 -0.8619105 0 -0.5070603 0.9171796 0 -0.3984741 -0.72811 0 0.6854603 0.9728125 0 0.2315945 0.9998732 0 0.01593374 0.407359 0 0.9132681 0.9986019 0 0.0528604 -0.3594854 0 -0.9331507 0.7886763 0 -0.6148087 0.6631461 0 0.74849 0.9998277 0 -0.01856248 -0.775406 0 0.6314631 -0.9932461 0 0.1160269 0.2829873 0 0.9591237 -0.8594264 0 0.5112596 -0.9726715 0 0.2321856 0.3415189 0 0.9398749 -0.2800387 0 0.9599887 0.9545325 0 0.2981071 -0.1153022 0 -0.9933305 -0.7344031 0 0.6787136 0.9958676 0 0.09081781 -0.08247683 0 -0.996593 -0.5742395 0 0.8186874 -0.9999819 0 -0.006013717 0.03384627 0 0.9994271 0.2582696 0 -0.9660729 -0.9403535 0 -0.340199 0.06464185 0 0.9979085 0.5889535 0 -0.808167 -0.9993748 0 -0.0353545 0.006242693 0 0.9999805 0.710139 0 -0.7040614 0.4435945 0 -0.8962277 -0.9977417 0 -0.06716741 0.3817131 0 0.9242809 0.5933759 0 -0.8049256 -0.9997554 0 0.02211773 0.03836682 0 0.9992638 0.2039149 0 -0.9789886 -0.9404471 0 -0.3399401 0.5811262 0 0.8138135 -0.9991526 0 0.0411589 0.7297284 0 0.6837371 0.8178051 0 -0.5754954 -0.972141 0 -0.2343969 0.1366728 0 0.9906163 -0.9969705 0 0.07778157 0.8775477 0 0.4794892 -0.4989674 0 -0.8666207 -0.01142495 0 0.9999347 0.6826242 0 0.7307696 -0.9847572 0 0.1739345 0.04436053 0 0.9990157 0.3953024 0 -0.918551 -0.03492551 0 0.9993899 -0.5469517 0 -0.8371642 -0.7059468 0 -0.7082648 0.03440697 0 0.9994079 0.7681135 0 -0.6403137 0.09692244 0 -0.9952919 -0.9458723 0 -0.3245391 0.445895 0 0.8950853 0.02788848 0 -0.9996111 -0.9936221 0 -0.1127622 0.443655 0 0.8961978 -0.9991727 0 -0.04066929 0.8623947 0 0.5062365 -1 0 0 0.5173874 0 0.8557514 0.05354951 0 -0.9985653 -0.9999455 0 0.01045243 0.6439338 0 0.7650812 0.04447606 0 -0.9990105 0.650893 0 0.7591695 -1 0 0 0.4477643 0 0.8941516 -0.006656759 0 -0.9999779 -1 0 0 0.4316215 0 0.9020548 -0.1119183 0 -0.9937175 0.002439373 0 -0.9999971 -0.9975421 0 0.07007144 0.5676979 0 0.823237 0.002353647 0 -0.9999973 -0.9999756 0 0.006982113 0.6925559 0 0.7213642 0.2261591 0 -0.9740905 0.2196162 0 -0.9755864 -0.1390474 0 0.9902858 -0.3991259 0 0.9168961 -0.3452487 0 0.9385113 -0.7144664 0 -0.6996698 -0.6029866 0 -0.7977513 -0.7431517 0 -0.669123 -0.9134758 0 -0.406893 -0.7318738 0 -0.6814402 -0.985332 0 -0.1706485 -0.9107897 0 -0.4128708 -0.1044346 0 0.9945318 0.9406679 0 0.339329 -0.4594695 0 0.8881936 -0.7692201 0 -0.6389839 -0.712565 0 -0.7016061 -0.9747579 0 -0.2232648 -0.8742127 0 -0.4855433 -0.8121476 0 -0.583452 -0.8489498 0 -0.5284737 0.2487913 0 0.9685571 0.2193633 0 0.9756433 -0.8302392 0 -0.5574074 -0.8411554 0 -0.5407935 0.8901395 0 0.4556883 0.1694356 0 -0.9855413 0.07235999 0 -0.9973786 -0.971056 0 -0.2388517 0.2577139 0 -0.9662213 -0.9956642 0 0.09302123 0.6456999 0 -0.7635913 0.7319826 0 -0.6813233 0.6031525 0 -0.7976259 0.9645182 0 -0.2640166 0.7650105 0 0.6440178 0.9084871 0 0.4179129 -0.999963 0 0.008601256 -0.8098497 0 -0.5866374 0.943271 0 0.332024 -0.6608056 0 0.7505572 -0.04663253 0 0.9989121 -0.2837471 0 -0.9588992 -0.973646 0 -0.2280645 0.3203704 0 -0.9472924 -0.1197148 0 -0.9928083 0.7883168 0 -0.6152695 0.1670256 0 -0.9859526 0.07430364 0 -0.9972357 0.2758265 0 0.9612076 0.8684702 0 0.4957414 0.8600046 0 0.5102863 0.7804428 0 0.6252272 -0.6724083 0 -0.7401804 0.9987604 0 0.0497765 0.7346349 0 0.6784627 0.494085 0 -0.8694136 -0.5803996 0 0.8143318 -0.7196974 0 -0.694288 0.3700626 0 0.9290068 0.3880622 0 -0.9216332 0.6675919 0 0.7445274 0.6904744 0 0.7233568 0.7075089 0 -0.7067044 0.6722407 0 0.7403327 0.9865603 0 -0.1633978 -0.4986227 0 -0.8668192 0.009292651 0 0.9999568 0.9342292 0 0.3566735 0.8888605 0 0.4581779 0.8877656 0 0.460296 0.7337006 0 0.6794729 0.7160846 0 0.6980135 0.8311211 0 0.5560915 0.9431745 0 0.3322978 -0.566259 0 0.8242274 -0.5447814 0 -0.838578 0.5070907 0 0.8618927 0.8682764 0 -0.4960808 0.9605811 0 0.2780001 -0.4668191 0 0.8843529 0.454039 0 0.8909818 0.8832484 0 -0.4689053 -0.8089257 0 -0.5879108 0.1139343 0 0.9934883 0.77931 0 0.6266386 -0.5496201 0 -0.8354148 -0.2987293 0 0.954338 -0.1991232 0 0.9799744 0.9655868 0 0.2600811 -0.3654106 0 0.9308465 -0.9890218 0 -0.1477699 -0.6901914 0 -0.7236268 0.3613006 0 0.9324494 -0.9872296 0 -0.1593044 0.691115 0 0.7227449 0.9126833 0 0.4086676 -0.6312183 0 -0.7756053 -0.9484795 0 0.3168388 -0.8630214 0 -0.5051674 0.05802111 0 0.9983154 0.7513149 0 -0.6599439 -0.9589181 0 -0.2836831 0.07373259 0 0.9972781 0.6577592 0 -0.7532283 0.9662298 0 0.2576824 -0.001968825 0 -0.9999981 -0.3709861 0 0.9286385 0.8806912 0 0.4736909 0.04719028 0 -0.9988859 -0.7570359 0 0.6533734 0.977165 0 0.2124818 -0.01621098 0 -0.9998687 -0.807856 0 0.5893799 -0.480244 0 0.877135 0.9824249 0 0.1866586 -0.252961 0 -0.9674765 -0.6871252 0 0.726539 0.9794581 0 0.2016481 -0.04992769 0 -0.9987528 -0.316292 0 0.948662 0.9416494 0 0.3365955 -0.3762321 0 -0.9265255 0.08556435 0 0.9963326 0.9967201 0 -0.08092675 -0.5758821 0 -0.8175327 -0.8677589 0 0.4969853 0.9570119 0 0.290049 -0.1178713 0 -0.993029 -0.1108121 0 0.9938415 0.995249 0 -0.09736245 -0.8221705 0 -0.5692414 0.4525255 0 0.8917516 0.4454719 0 -0.895296 -0.7245994 0 -0.6891703 0.9954371 0 0.09542132 -0.05651539 0 -0.9984018 -0.4668657 0 0.8843283 0.08866163 0 -0.9960619 -0.996525 0 0.08329372 0.4910454 0 0.871134 0.7274766 0 0.6861326 0.05642468 0 -0.9984069 -0.8188207 0 0.5740494 -0.1723158 0 0.9850418 0.9457811 0 0.3248048 -0.3988097 0 -0.9170337 -0.1163692 0 0.9932061 0.9705253 0 0.2409995 -0.3653844 0 -0.9308568 0.1060257 0 0.9943635 0.9995292 0 -0.03068006 -0.7803419 0 -0.6253532 0.007871803 0 0.999969 0.9959184 0 -0.09025814 -0.4617858 0 -0.8869915 -0.12917 0 0.9916226 0.9900017 0 0.1410559 -0.5622025 0 -0.8269996 -0.2104774 0 0.9775988 0.9759818 0 0.2178523 -0.5435107 0 -0.8394022 0.9791068 0 0.2033468 -0.4150467 0 -0.9098002 -0.05972986 0 0.9982147 0.9923958 0 -0.123088 -0.38503 0 -0.9229041 0.03118847 0 0.9995135 -0.08571419 0 0.9963198 0.995849 0 0.09102082 -0.5081244 0 -0.8612837 -0.1000131 0 0.9949861 0.992045 0 0.1258842 -0.6119671 0 -0.7908832 0.06818694 0 -0.9976726 -0.9897997 0 -0.1424664 0.5958444 0 0.8030999 -0.9945704 0 -0.1040661 0.02073001 0 0.9997851 0.4695134 0 -0.8829255 -0.9478565 0 -0.3186973 0.05457579 0 0.9985096 0.4853239 0 -0.8743344 -0.09062513 0 0.9958851 0.9890573 0 -0.1475326 -0.6857807 0 -0.7278083 -0.9938198 0 0.1110051 0.07828968 0 0.9969307 0.6777797 0 -0.7352651 -0.1629818 0 0.9866291 0.9338732 0 -0.3576047 -0.7916716 0 -0.610947 -0.9232126 0 -0.3842895 -0.146329 0 0.989236 0.923412 0 -0.3838104 -0.6644377 0 -0.7473437 -0.1949853 0 0.9808062 0.9976976 0 -0.06781985 -0.4348058 0 -0.9005243 -0.2283362 0 0.9735823 0.9999511 0 0.009897522 0.09771641 0 -0.9952143 -0.9040962 0 0.4273291 0.7857071 0 0.6185987 0.04091591 0 -0.9991626 -0.998298 0 -0.05831869 0.5260702 0 0.8504412 0.07561347 0 -0.9971372 -0.9960637 0 0.08864045 0.5845199 0 0.8113794 -0.0197478 0 0.999805 0.890052 0 -0.4558591 -0.5597857 0 -0.8286374 -0.06878707 0 0.9976314 0.9992939 0 0.03757416 -0.5491666 0 -0.835713 -0.0597167 0 -0.9982154 -0.9998012 0 -0.01993756 0.6996194 0 0.7145157 0.2349793 0 0.9720004 0.5862898 0 -0.8101015 -0.7106317 0 0.7035642 0.9997483 0 0.02243526 -0.03582288 0 -0.9993582 -0.2695448 0 0.9629879 -0.6484385 0 0.7612672 0.9476287 0 0.3193744 0.1937864 0 -0.9810438 0.1501374 0 0.9886652 0.9997097 0 -0.02409931 -0.7383224 0 -0.674448 -0.952102 0 -0.3057806 0.04260946 0 0.9990918 0.8466181 0 -0.5322011 -0.8427556 0 0.5382964 0.5018135 0 0.8649759 0.2627987 0 -0.9648507 -0.3310722 0 -0.9436055 -0.2436065 0 0.9698741 0.8414625 0 0.5403157 -0.940248 0 -0.3404906 0.08882227 0 0.9960476 0.6622688 0 -0.7492663 -0.9826163 0 0.1856483 0.06432827 0 0.9979289 0.4495558 0 -0.8932524 0.7345874 0 -0.6785141 -0.9342605 0 -0.3565911 -0.2719536 0 0.9623104 0.1287996 0 -0.9916707 -0.9844745 0 0.1755278 0.2756901 0 0.9612466 0.4580299 0 -0.8889369 -0.9738703 0 -0.2271055 0.6607221 0 0.7506306 0.3946058 0 -0.9188506 -0.9632352 0 -0.2686595 0.4640381 0 0.8858153 -0.8120329 0 0.5836117 0.7601094 0 0.6497951 -0.4332017 0 -0.901297 0.05025333 0 -0.9987366 -0.9772155 0 0.2122495 0.8468611 0 0.5318141 0.01310879 0 -0.9999142 -0.9647915 0 -0.2630158 0.4889809 0 0.8722946 -0.9103094 0 -0.4139285 -0.2204082 0 0.9754078 0.8291234 0 -0.5590657 0.1950648 0 0.9807904 0.3963816 0 -0.9180859 -0.8853671 0 0.4648927 -0.1115102 0 0.9937633 0.99012 0 -0.1402225 -0.2819434 0 -0.9594311 0.9177473 0 -0.3971649 -0.5135096 0 -0.8580838 0.1922456 0 0.9813468 -0.9015685 0 -0.4326363 0.02764595 0 0.9996178 0.9999353 0 0.0113802 0.1175403 0 -0.9930682 -0.9375026 0 -0.3479783 0.3783131 0 0.9256777 0.1503744 0 -0.9886292 -0.9622333 0 -0.2722261 0.4469776 0 0.8945451 -0.9992222 0 0.03943483 -0.1786837 0 0.9839066 0.8721663 0 -0.4892096 0.2846615 0 -0.9586282 -0.9641382 0 -0.2654009 0.2415597 0 0.970386 -0.6450226 0 -0.7641636 -0.2164755 0 0.9762881 0.8894113 0 0.457108 -0.8526998 0 0.5224012 0.7362282 0 0.6767334 -0.1765213 0 -0.9842969 0.9786636 0 -0.2054697 -0.7905115 0 -0.6124472 -0.8292844 0 0.5588269 0.06474242 0 -0.997902 -0.9832375 0 0.1823295 0.5208632 0 0.8536403 0.1946307 0 -0.9808767 -0.9940998 0 -0.1084693 0.6058962 0 0.7955437 0.1129988 0 -0.9935951 -0.9947658 0 -0.102181 0.6812201 0 0.7320787 0.08262267 0 -0.996581 -0.9950435 0 -0.09944052 0.4516219 0 0.8922094 0.05230432 0 -0.9986313 -0.9860608 0 -0.1663855 0.4336353 0 0.9010885 0.0886474 0 -0.9960631 -0.9908879 0 -0.1346893 0.5629454 0 0.8264941 -0.02483407 0 -0.9996916 -0.9983969 0 0.05660115 0.6374433 0 0.7704973 0.951617 0 0.3072869 0.215614 0 -0.9764787 -0.8657212 0 0.5005265 -0.1650495 0 0.9862853 0.9388502 0 0.3443258 -0.21808 0 -0.9759309 0.4420123 0 -0.897009 -0.7465167 0 -0.6653666 0.1716284 0 0.9851618 -0.1880097 0 -0.9821672 -0.6375971 0 0.7703699 0.9727229 0 -0.23197 0.2933837 0 -0.9559949 -0.9972811 0 -0.07369091 0.8582234 0 0.5132763 0.970906 0 0.2394615 -0.09542081 0 -0.995437 -0.9242766 0 0.3817234 0.795505 0 -0.605947 -0.9488406 0 -0.3157555 -0.2095532 0 0.9777973 -0.2772968 0 -0.9607843 -0.8032963 0 0.5955796 0.9461666 0 -0.32368 -0.9817125 0 0.1903701 0.8486409 0 0.5289695 -0.5943154 0 -0.8042321 0.9967899 0 0.08006301 -0.3994145 0 -0.9167706 -0.3826899 0 0.9238769 0.1423087 0 -0.9898224 -0.9991782 0 -0.04053457 0.3190118 0 0.9477509 -0.9337654 0 0.357886 0.7321154 0 0.6811806 -0.3105226 0 -0.950566 0.8940414 0 0.4479844 0.02158166 0 -0.9997672 -0.8099549 0 0.5864922 0.8394676 0 -0.5434098 -0.5415123 0 -0.8406928 -0.5820407 0 0.8131597 0.07934544 0 -0.9968472 -0.9979267 0 0.06436186 0.7019271 0 0.7122488 0.9892666 0 0.1461224 -0.06546229 0 -0.9978551 -0.8933675 0 0.449327 -0.08667906 0 0.9962363 0.8894026 0 -0.4571249 -0.8957141 0 -0.4446305 -0.283119 0 0.9590848 0.9753597 0 0.2206209 -0.3100427 0 -0.9507227 0.8906463 0 -0.4546968 -0.4849275 0 -0.8745543 0.2036041 0 0.9790534 -0.1698474 0 0.9854704 0.9714653 0 -0.2371818 -0.6128933 0 -0.7901657 0.06438633 0 -0.997925 -0.9448249 0 -0.3275759 0.4659728 0 0.8847991 0.06306875 0 -0.9980093 -0.9762101 0 0.2168272 0.4913679 0 0.8709521 -0.1428974 0 0.9897375 0.9253801 0 0.3790406 -0.2920811 0 -0.9563935 0.3192651 0 0.9476655 0.3596691 0 -0.9330799 -0.7584711 0 -0.6517066 0.0567365 0 -0.9983892 -0.9979542 0 0.06393393 -0.3369004 0 -0.9415404 0.0708193 0 -0.9974892 -0.9913636 0 0.1311417 -0.5382986 0 -0.8427542 -0.1270871 0 0.9918916 0.9637028 0 -0.2669778 0.4418619 0 0.8970831 -0.3315162 0 0.9434495 0.9999633 0 0.008571791 0.5128241 0 0.8584937 -0.08468652 0 0.9964076 0.9972562 0 -0.07402878 0.657604 0 0.7533638 -0.7426387 0 -0.6696923 -0.2531563 0 0.9674255 -0.8075512 0 0.5897975 -0.6753044 0 -0.7375392 -0.06397468 0 0.9979516 -0.8856639 0 0.4643269 -0.832013 0 -0.5547562 -0.2028271 0 0.9792146 -0.7913131 0 0.6114112 -0.9956217 0 -0.09347472 0.08476739 0 0.9964008 -0.4013456 0 0.9159267 -0.7337093 0 -0.6794636 -0.07066211 0 0.9975003 -0.9738339 0 0.2272616 -0.9990708 0 -0.04309994 0.5474096 0 0.8368649 -0.6951725 0 0.718843 -0.8130599 0 -0.5821802 0.7695389 0 0.6385999 0.2839509 0 0.9588389 -0.02341869 0 0.9997258 0.9770883 0 -0.2128345 0.4986484 0 0.8668044 0.9925523 0 0.1218201 -0.08021282 0 -0.9967778 0.5258588 0 -0.8505719 -0.4919519 0 0.8706224 0.9629218 0 -0.269781 0.510136 0 0.8600938 -0.7773221 0 -0.6291028 0.06732039 0 0.9977314 -0.6783373 0 0.7347507 -0.7272533 0 -0.6863691 0.04338527 0 0.9990585 -0.5984268 0 0.8011776 -0.9987777 0 -0.04942688 0.1633228 0 0.9865727 -0.5993542 0 0.8004839 -0.9825953 0 -0.1857591 0.2783159 0 0.9604897 -0.3564375 0 0.9343193 -0.7944553 0 -0.6073226 0.3233562 0 0.9462774 -0.5741493 0 0.8187507 -0.887585 0 -0.4606442 0.06401704 0 0.9979488 -0.7839423 0 0.6208336 0.255157 0 0.9668996 0.4758782 0 -0.8795112 0.7204015 0 0.6935573 0.2174901 0 0.9760625 0.3518339 0 -0.9360625 0.8105009 0 0.5857373 -0.8722996 0 -0.4889721 0.26788 0 0.9634523 -0.5674866 0 0.8233826 -0.8474393 0 -0.5308923 0.3367918 0 0.9415792 -0.6088226 0 0.7933064 0.8320997 0 0.5546261 -0.08526762 0 -0.9963581 0.5848296 0 -0.8111562 0.1485535 0 -0.9889045 -0.9802894 0 0.1975671 -0.6543056 0 -0.7562304 0.02409742 0 -0.9997097 -0.982445 0 0.1865531 -0.5220054 0 -0.8529422 -0.9988801 0 -0.04731359 0.3843612 0 0.9231829 -0.5538603 0 0.8326096 0.07344749 0 -0.9972992 -0.9902447 0 0.1393391 -0.8420927 0 -0.5393328 -0.9481179 0 0.3179193 0.5768924 0 0.8168201 -0.5461284 0 0.8377015 0.544458 0 -0.8387881 -0.9978407 0 -0.06568065 -0.6647445 0 -0.7470708 0.7336552 0 -0.679522 -0.9972994 0 -0.07344279 -0.3171021 0 -0.9483914 0.6752173 0 -0.7376189 -0.9943203 0 -0.106429 -0.1872138 0 -0.9823192 0.8506439 0 -0.5257423 -0.4358292 0 -0.9000294 0.5191161 0 -0.8547037 0.7197664 0 0.6942164 -0.3379968 0 -0.9411473 0.4094285 0 -0.9123422 0.9401034 0 0.3408898 -0.3273453 0 -0.9449049 0.4607798 0 -0.8875146 -0.9448632 0 0.3274656 0.3353005 0 0.9421114 -0.404902 0 0.9143601 -0.7475747 0 -0.6641778 0.3800607 0 0.9249615 -0.5116384 0 0.859201 0.935617 0 0.3530167 -0.3880423 0 -0.9216416 0.4086163 0 -0.9127063 -0.7768875 0 0.6296394 0.8130599 0 -0.5821802 -0.2671875 0 0.9636446 -0.06765318 0 0.9977089 0.9152563 0 -0.4028722 0.562862 0 0.826551 -0.4322277 0 -0.9017645 -0.3869913 0 0.9220834 -0.8862059 0 0.4632917 -0.9886368 0 -0.1503239 0.5475156 0 0.8367955 -0.2865838 0 0.9580552 0.116271 0 -0.9932176 -0.9987912 0 0.04915558 -0.5314272 0 -0.847104 -0.2297562 0 -0.9732483 -0.5727717 0 0.8197149 -0.9163475 0 -0.4003839 0.6499169 0 -0.7600053 -0.6914675 0 -0.7224076 -0.07663918 0 -0.997059 0.04558884 0 -0.9989603 -0.9374712 0 0.348063 -0.5536231 0 -0.8327674 0.01231494 0 -0.9999242 -0.9499638 0 0.3123599 -0.7464663 0 -0.6654233 0.3811622 0 0.9245083 0.3429173 0 -0.9393656 0.9351074 0 -0.3543646 0.9792097 0 0.2028507 -0.02402603 0 -0.9997113 0.5087963 0 -0.8608869 0.8450177 0 0.5347384 -0.4953586 0 -0.8686887 0.9355227 0 -0.3532665 0.8270253 0 0.5621647 -0.05904016 0 -0.9982557 0.9282531 0 -0.3719491 -0.6807604 0 -0.7325062 -0.03092615 0 0.9995217 -0.9689336 0 -0.2473209 0.9977004 0 -0.06777965 -0.5445766 0 -0.8387111 0.6563613 0 -0.7544467 0.8005102 0 0.5993191 -0.06717252 0 -0.9977415 0.4080036 0 -0.9129803 0.3944987 0 -0.9188965 -0.9356154 0 0.3530212 -0.4089651 0 -0.91255 -0.558371 0 0.8295914 0.7816563 0 0.6237094 -0.1133182 0 0.9935588 -0.9521186 0 -0.3057288 0.1848914 0 0.982759 -0.5553493 0 0.8316172 0.3627103 0 0.931902 0.2457921 0 -0.9693227 0.8739393 0 0.4860351 0.07578205 0 -0.9971245 -0.8460914 0 -0.5330378 -0.5890148 0 -0.8081222 0.7136602 0 0.7004921 -0.1964809 0 -0.9805077 0.4287606 0 -0.9034182 0.6938369 0 0.7201322 -0.3277849 0 -0.9447524 0.498463 0 -0.8669109 0.7168669 0 -0.6972101 -0.983667 0 0.1799983 -0.9485927 0 -0.3164994 0.7443113 0 0.6678329 -0.1406598 0 -0.990058 0.7462404 0 -0.6656765 0.880043 0 -0.4748941 -0.8431385 0 -0.5376964 -0.3696939 0 -0.9291536 -0.4254215 0 -0.9049954 -0.6336386 0 0.7736292 -0.9866421 0 -0.162903 0.3056651 0 0.9521392 0.8689312 0 -0.4949328 0.999698 0 0.02457634 0.9909799 0 0.134011 -0.3398594 0 -0.9404764 0.455048 0 -0.8904669 0.893008 0 0.4500408 -0.4036028 0 -0.9149344 0.7023042 0 -0.7118769 0.8735802 0 0.4866803 -0.4913754 0 -0.8709479 0.7033123 0 -0.7108811 0.6645762 0 0.7472205 -0.2961826 0 -0.9551314 0.4817874 0 -0.8762881 0.6980633 0 0.7160361 -0.2608281 0 -0.9653853 0.4441995 0 -0.895928 0.8379843 0 0.5456944 -0.3461538 0 -0.9381778 0.6012868 0 -0.7990333 0.9928241 0 0.1195843 -0.4267055 0 -0.9043908 0.5141327 0 -0.8577107 -0.5475611 0 0.8367657 0.9907234 0 -0.1358942 0.3008078 0 0.9536848 -0.6062816 0 -0.79525 0.1203786 0 0.9927281 -0.530818 0 0.8474858 0.5627291 0 0.8266414 0.2279772 0 -0.9736665 0.9281195 0 -0.3722825 0.8711891 0 -0.4909479 -0.6464752 0 -0.762935 0.08419329 0 -0.9964495 0.983483 0 0.1810013 -0.7168732 0 -0.6972036 0.945016 0 -0.3270243 -0.1501212 0 0.9886676 0.999698 0 -0.02457535 0.6061865 0 0.7953226 0.6414856 0 0.7671352 0.4304323 0 -0.9026229 0.9898988 0 -0.141776 0.9134847 0 -0.4068731 -0.8600752 0 -0.5101672 0.402668 0 -0.9153461 -0.8689318 0 -0.4949321 -0.298825 0 0.954308 -0.9997784 0 0.02105393 0.2591356 0 0.965841 0.7426435 0 -0.669687 0.7977106 0 0.6030405 0.9558576 0 0.2938302 -0.02013715 0 -0.9997972 0.7627976 0 -0.6466374 -0.5636726 0 -0.8259983 -0.3371786 0 0.9414407 -0.958208 0 -0.2860723 -0.09344921 0 0.9956241 0.9956233 0 -0.0934583 0.4155094 0 0.9095889 0.01257433 0 0.999921 0.6807233 0 -0.7325407 0.9724628 0 -0.2330581 0.9967341 0 0.08075503 -0.1330727 0 -0.9911063 0.7129688 0 -0.7011958 -0.1369452 0 0.9905787 0.9984694 0 -0.05530857 0.7671523 0 0.641465 -0.9649357 0 -0.2624863 0.4918637 0 0.8706723 -0.4943989 0 0.8692352 -0.785596 0 -0.6187398 0.1964511 0 0.9805137 -0.8459817 0 0.5332119 0.3555439 0 0.9346596 0.2077448 0 -0.9781832 0.8926496 0 0.4507513 -0.9996809 0 0.02526099 0.3314924 0 0.9434579 -0.5182074 0 0.855255 0.7277362 0 0.6858571 -0.2191444 0 -0.9756925 0.4496644 0 -0.8931977 0.9958215 0 0.09132107 -0.3475904 0 -0.9376464 0.3186721 0 -0.9478651 -0.6759184 0 -0.7369764 0.03318508 0 0.9994493 -0.6703247 0 0.7420679 -0.8043267 0 0.5941875 0.5583652 0 0.8295953 0.1077982 0 0.9941728 0.9237404 0 0.3830192 0.9691133 0 0.2466162 -0.2030189 0 -0.9791749 0.0440694 0 -0.9990286 -0.8676522 0 0.4971718 -0.6541651 0 0.7563517 0.9885731 0 0.1507421 0.9803559 0 0.1972369 -0.1822643 0 -0.9832497 3.00413e-4 0 -1 -0.5286963 0 0.8488111 -0.5900375 0 0.8073758 -0.9999206 0 -0.01260745 -0.9999984 0 -0.001797396 -0.00254504 0 0.9999968 0.08700592 0 0.9962079 0.2273134 0 -0.9738216 0.2313391 0 -0.9728733 -0.892659 0 -0.4507326 -0.9726567 0 -0.2322477 -0.005634231 0 0.9999842 0.1649343 0 0.9863046 0.5300246 0 -0.8479823 0.6203554 0 -0.7843208 -0.9983176 0 -0.05798294 -0.9996471 0 0.02656333 -0.0404118 0 0.9991831 0.1684067 0 0.9857177 0.7207795 0 -0.6931645 0.6780021 0 -0.73506 0.4782068 0 -0.8782474 0.4073614 0 -0.9132671 -0.9999941 0 0.003439245 -0.9847047 0 -0.1742323 0.433576 0 0.901117 0.318709 0 0.9478526 0.6200181 0 -0.7845876 0.5585011 0 -0.8295038 -0.999984 0 -0.0056623 -0.9945496 0 0.1042653 -0.01009704 0 0.9999491 0.1627129 0 0.9866735 0.2277448 0 -0.973721 0.2902058 0 -0.9569643 -0.8219334 0 -0.5695835 -0.9904529 0 -0.1378514 0.4946989 0 0.8690645 0.6496451 0 0.7602376 -0.9971041 0 -0.07604955 -0.9488745 0 0.3156539 0.7347868 0 0.6782982 0.7746788 0 0.6323552 0.8554793 0 -0.5178372 0.7886732 0 -0.6148128 -0.9395202 0 -0.3424935 -0.9847664 0 -0.1738824 0.2344916 0 0.9721182 0.04536285 0 0.9989706 -0.9772771 0 0.2119659 -0.9999811 0 0.006157604 0.8958071 0 0.4444433 0.8779038 0 0.4788372 -0.440942 0 -0.8975356 -0.5464221 0 -0.8375099 0.003038907 0 0.9999954 -0.04924722 0 0.9987866 0.7616329 0 0.6480089 0.6396036 0 0.768705 -0.9237368 0 0.3830282 -0.9765815 0 -0.2151481 0.1130082 0 0.9935942 -0.02168545 0 0.9997649 0.4299505 0 -0.9028525 0.3514321 0 -0.9362134 -0.05714865 0 0.9983658 0.02567375 0 0.9996704 -0.5783654 0 -0.8157779 -0.5672222 0 -0.8235648 -0.6429968 0 -0.765869 -0.7753716 0 -0.6315053 0 0 1 0.1089816 0 0.9940438 0.5302567 0 -0.8478372 0.9787712 0 -0.2049559 0.1493022 0 -0.9887916 0.01815978 0 -0.9998351 -0.8700724 0 -0.4929239 -0.9758633 0 -0.2183829 0.4047329 0 0.914435 0.4542898 0 0.8908539 0 0 -1 0.08866411 0 -0.9960617 -0.9952123 0 -0.09773701 -0.9878992 0 -0.1550974 0.3946721 0 0.9188221 0.471634 0 0.8817944 -0.9996747 0 -0.02550687 -0.9995471 0 -0.03009619 0.8267465 0 0.5625748 0.8861901 0 0.4633218 -1 0 0 -1 0 0 0.4698066 0 0.8827694 0.5386244 0 0.842546 -0.003012625 0 -0.9999955 0.1607375 0 -0.9869972 -0.9969441 0 -0.07811791 -0.9807219 0 0.1954092 0.6444195 0 0.7646722 0.6232947 0 0.7819871 -0.001198328 0 -0.9999993 0.1359153 0 -0.9907205 0.5591953 0 0.829036 0.7100706 0 0.7041305 -1 0 0 -1 0 0 0.410406 0 0.9119029 0.4809437 0 0.8767515 -0.008977829 0 -0.9999598 -0.0014948 0 -0.999999 -1 0 0 -1 0 0 0.4222821 0 0.9064645 0.4742474 0 0.8803916 -0.1980401 0 -0.980194 -0.04207859 0 -0.9991144 0.002396638 0 -0.9999971 0.001319405 0 -0.9999992 -0.9742497 0 0.2254716 -0.9981473 0 0.06084456 0.5367765 0 0.8437245 0.6101264 0 0.7923042 -0.001192732 0 -0.9999993 0.00945527 0 -0.9999553 -0.9990211 0 -0.04423747 -0.9943417 0 0.1062294 0.7450514 0 0.6670071 0.6677566 0 0.7443796 0.117547 0 0.9930673 -0.2066742 0 0.9784098 0.9593176 0 0.2823294 0.9975567 0 0.06986167 -0.6249999 0 -0.7806249 -0.7370268 0 -0.6758635 1 0 0 1 0 0 0.004971914 0 -0.9999877 -0.156305 0 -0.9877089 -0.2753632 0 0.9613403 -0.2162158 0 0.9763456 0.9999839 0 -0.005672818 0.9945505 0 0.1042566 0.00886593 0 -0.9999607 -0.02969166 0 -0.9995592 -0.4334972 0 0.901155 -0.3158581 0 0.9488065 0.2532614 0 -0.967398 -0.1689862 0 -0.9856185 -0.9108334 0 0.4127743 -0.9841651 0 0.1772548 0.7547965 0 0.6559591 0.7856432 0 0.6186799 0.9395163 0 -0.3425043 0.9987649 0 -0.04968677 0.007417427 0 -0.9999726 -0.0981609 0 -0.9951707 -0.4985779 0 0.866845 -0.5554655 0 0.8315397 0.2567172 0 -0.9664866 -0.3569843 0 -0.9341105 -0.9048529 0 0.4257246 -0.9065194 0 0.4221643 0.8285351 0 0.5599371 0.82726 0 0.5618194 0.9025548 0 0.4305752 0.9738425 0 0.2272241 0.009587739 0 -0.999954 0.01290325 0 -0.9999168 -0.8433757 0 0.5373243 -0.865324 0 0.5012131 0.7674458 0 0.6411139 0.8177878 0 0.5755199 7.63079e-4 0 -0.9999998 -0.01126486 0 -0.9999366 0.5194322 0 0.8545117 0.5933923 0 0.8049135 0.2980368 0 -0.9545544 0.03839654 0 -0.9992626 -0.003012318 0 0.9999955 0.2516539 0 0.9678174 0.8499383 0 -0.5268822 0.9735758 0 -0.228364 -0.6675611 0 -0.7445551 -0.9806126 0 -0.1959564 -0.05434028 0 0.9985225 -0.04327529 0 0.9990632 -0.6980125 0 -0.7160856 -0.5084995 0 -0.8610623 0 0 1 0 0 1 0.9957376 0 -0.09223182 0.9084367 0 -0.4180225 -0.7535921 0 -0.6573424 -0.6523566 0 -0.7579122 -0.06027821 0 -0.9981816 -0.1716591 0 -0.9851565 0.5430107 0 0.8397258 0.602039 0 0.7984667 0 0 -1 0 0 -1 0.7359802 0 0.6770032 0.5190831 0 0.8547238 -0.02431028 0 0.9997045 0.199823 0 0.9798321 0.9999942 0 0.003439322 0.9940248 0 -0.109155 -0.7305856 0 -0.6828212 -0.7955995 0 -0.605823 -0.5914103 0 0.8063709 -0.4989832 0 0.8666117 -1 0 0 -1 0 1.13213e-4 0.1820515 0 -0.9832891 0.1522935 0 -0.9883353 -1 0 0 -1 0 0 -0.9960172 0 -0.08916197 -0.9994293 0 -0.03377988 0.7217841 0 0.6921183 0.8158993 0 0.5781941 -0.8757012 0 0.4828534 -0.7335656 0 0.6796186 -0.6701892 0 -0.7421903 -0.3674699 0 -0.9300355 0.01553156 0 -0.9998795 0.1750848 0 -0.9845534 -0.008962818 0 -0.9999598 0.001940293 0 -0.9999982 -0.3550247 0 0.934857 -0.2946942 0 0.9555917 -0.7236291 0 0.6901891 0.03056126 0 0.9995329 -0.5134318 0 -0.8581304 -0.488204 0 -0.8727295 0.7561783 0 -0.6543656 0.6631972 0 -0.7484447 0.2672852 0 0.9636176 0.04963367 0 0.9987675 0.9891846 0 -0.1466763 0.9450579 0 -0.3269033 0.2951413 0 -0.9554536 0.08632413 0 -0.9962672 -0.8134671 0 0.581611 -0.8008202 0 0.5989048 -0.1133412 0 -0.9935562 -0.2800344 0 -0.95999 -0.8311036 0 0.5561176 -0.9648761 0 -0.2627059 0.2676477 0 0.9635169 0.2720447 0 0.9622846 -0.7391305 0 0.6735622 -0.9971833 0 0.07500391 0.9996122 0 -0.02784967 0.9983182 0 -0.05797249 -0.7409784 0 0.6715289 -0.8597853 0 0.5106558 1 0 0 1 0 0 -0.05828356 0 -0.9983001 -0.291058 0 -0.9567054 0.5979229 0 0.8015537 0.759557 0 0.6504407 0.5824602 0 -0.8128593 0.9734177 0 -0.2290371 1 0 0 0.9998731 0 -0.01593318 1 0 0 1 0 0 1 0 0 1 0 0 0.001552242 0 0.9999988 -0.09499168 0 0.9954781 1 0 0 1 0 0 1 0 0 1 0 0 -0.9997959 0 0.02020502 -0.9984786 0 0.05514151 0.005611235 0 0.9999843 -0.1467485 0 0.9891739 0.9336247 0 -0.3582526 0.8178324 0 -0.5754566 -1 0 0 -0.9999822 0 0.00597051 0.1957953 0 0.9806449 0.2422866 0 0.9702047 -0.2490702 0 0.9684855 -0.5964125 0 0.8026781 0.9960163 0 0.08917261 0.9992326 0 0.03916768 -0.894381 0 -0.4473062 -0.7966248 0 -0.6044741 0.9605407 0 -0.2781395 0.8915789 0 -0.4528656 -0.6568276 0 0.7540408 -0.7870713 0 0.6168621 0.9995057 0 0.03143989 0.8185854 0 0.5743849 0.9997162 0 0.02382212 0.9999828 0 0.005863732 0.3620482 0 0.9321594 0.4435971 0 0.8962263 0.9971031 0 -0.07606313 0.9481401 0 0.3178529 -0.2541555 0 -0.9671634 -0.4094916 0 -0.912314 0.8281183 0 -0.5605534 0.7725374 0 -0.6349694 0.6277548 0 0.7784111 0.7185428 0 0.6954827 0.9997668 0 -0.02159678 0.9999565 0 0.009328851 -0.8414953 0 0.5402644 -0.7059272 0 0.7082844 -0.9136965 0 0.4063973 -0.9634031 0 -0.2680573 0.2676383 0 0.9635195 0.3060386 0 0.9520192 -0.7391305 0 0.6735622 -0.9420533 0 0.3354634 -0.9891872 0 0.1466589 -0.9403314 0 0.34026 0.2946476 0 0.955606 0.3661996 0 0.9305363 -0.3610103 0 0.9325619 -0.1978228 0 0.9802378</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape1-binormals-array" count="1267" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape1-map1" name="qt_gauge_background_Shape1-map1">
+ <float_array id="qt_gauge_background_Shape1-map1-array" count="2534">0.9999981 0.5 0 0.7963016 1 0.8079517 0.5 1 0 0.807952 0.5 0 0 0.2036991 0 0.1920486 1 0.1920483 0.9999981 0.53125 0 0.53125 0 0.25 0.9999981 0.25 0.005730992 0.125 0.994269 0.125 0.375 0.00685697 0.3913216 0.1331608 0.1053022 0.0625 0.3881879 0.06379133 0.1875 0.03944851 0.2012496 0.06357051 0.211794 0.125 0.03172571 0.09375 0.1821749 0.08792569 0.09375 0.0663463 0.1049675 0.09688761 0.09558597 0.135207 0.8946977 0.0625 0.6875 0.01489333 0.6875 0.06383147 0.6571326 0.1313682 0.9682743 0.09375 0.6875 0.09375 0.8348728 0.089701 0.8095983 0.06036426 0.8514459 0.1232702 0.3994771 0.2410492 0 0.375 0.9999981 0.375 0.3638252 0.3666188 0.4420946 0.5192688 0.9999981 0.75 0 0.75 0.9999981 0.625 0 0.625 0.407392 0.6290491 0.3742105 0.7589508 0.994269 0.875 0.005730951 0.875 0.423588 0.8770246 0.375 0.993143 0.1053022 0.9375 0.375 0.9385024 0.2294063 0.8722063 0.2012496 0.9364295 0.03172569 0.90625 0.1788762 0.9091249 0.09878051 0.868214 0.09789252 0.9057478 0.09375 0.9336537 0.1875 0.9605515 0.8946977 0.9375 0.6455938 0.9333748 0.6875 0.8666074 0.9682743 0.90625 0.6875 0.9062501 0.8348728 0.9062501 0.8683389 0.8745934 0.8063985 0.9361686 0.6875 0.9851066 0.7311121 0.9511969 0.5745755 0.4226038 0.8165936 0.2305188 0.9396637 0.1154837 0.3217428 0.1084508 0.3111072 0.03465997 0.1653013 0.05565587 0.1593068 0.1025845 0.1648939 0.07150733 0.07575551 0.0854964 0.07511215 0.1045289 0.8038125 0.04739975 0.5909162 0.04710919 0.4742689 0.1085772 0.9020644 0.08325297 0.7879841 0.07157348 0.7908148 0.103236 0.3195043 0.1617877 0.8084334 0.2932534 0.2567454 0.293384 0.2575628 0.4234198 0.7923084 0.6675631 0.8092507 0.5639058 0.2584373 0.5607224 0.2571569 0.6677271 0.4915403 0.8357001 0.1078514 0.7655979 0.2481584 0.9452138 0.3224923 0.8933864 0.1211598 0.9147134 0.1668384 0.8836544 0.04138254 0.8843539 0.07561494 0.9145575 0.1653013 0.9443442 0.8535441 0.9274829 0.482527 0.9170672 0.8835204 0.8958249 0.7993311 0.884307 0.7879672 0.9166391 0.4199305 0.9787446 0.8037957 0.9525254 0.8255701 0.5189754 0.8092507 0.4644441 0.9453309 0.1464991 0.4826379 0.1636648 0.6914255 0.1872278 0.8309107 0.1481387 0.8831638 0.103236 0.243396 0.07306226 0.2481678 0.0936578 0.2483976 0.05482828 0.1314742 0.117293 0.1238088 0.08528036 0.1262971 0.07326718 0.04132304 0.1157148 0.736077 0.0486704 0.4201697 0.02129744 0.5292323 0.02436829 0.595812 0.07335655 0.5870495 0.0947158 0.8535609 0.0715459 0.7353273 0.08328055 0.7391334 0.1147942 0.02912833 0.1487852 0.118106 0.2344024 0.2148204 0.1646745 0.1493908 0.1926282 0.03633149 0.1770432 0.5737581 0.3338117 0.1247698 0.3339757 0.1262672 0.4773087 0.590489 0.706827 0.5917694 0.5944203 0.1256443 0.5946463 0.1151952 0.7064425 0.9456873 0.8534582 0.7998112 0.7694812 0.6915653 0.812732 0.83595 0.8517784 0.02918784 0.8512837 0.3200299 0.8383755 0.1489873 0.8074408 0.2172506 0.8353364 0.03639101 0.8230259 0.3108681 0.9653821 0.2430964 0.9269196 0.2482539 0.9054502 0.1648334 0.9284325 0.1262366 0.9266727 0.123401 0.8964652 0.0750311 0.8964097 0.9020644 0.9166667 0.5883777 0.8836584 0.5875097 0.9070208 0.9400203 0.8844736 0.7353273 0.8956667 0.7297819 0.9265814 0.5816494 0.952059 0.5289931 0.9756738 0.6635248 0.9545115 0.73835 0.9390171 0.7686195 0.9547469 0.4107113 0.4307589 0.603567 0.3781738 0.6923835 0.4475313 0.999999 0.2210242 0.7741527 0.2583339 0.7323484 0.2115833 0.9812716 0.109375 0.9367766 0.1295528 0.9100981 0.1092702 0.3935968 0.1033359 0.3097933 0.1336654 0.2842202 0.09827727 0.28125 0.02315274 0.3678285 0.03054034 0.2817029 0.04665671 0.1464011 0.05097425 0.2024864 0.05412663 0.1590134 0.06359971 0.1411584 0.09400307 0.2009681 0.1007097 0.143803 0.1096803 0.2016423 0.07364567 0.1447426 0.07396945 0.06273785 0.08004815 0.09876781 0.08397642 0.07198705 0.09455569 0.09948382 0.1104973 0.05941164 0.1101361 0.7910988 0.03869667 0.838745 0.06017216 0.7690591 0.04500029 0.6676019 0.04521665 0.5745506 0.06062054 0.5497736 0.03674184 0.4896257 0.1342561 0.5299461 0.09878042 0.931486 0.078125 0.8956506 0.09340224 0.8776169 0.0777372 0.7625552 0.06038178 0.8260581 0.07339518 0.76439 0.07783028 0.7645701 0.09340224 0.8392714 0.1047691 0.766063 0.1091937 0.3948389 0.17054 0.2722705 0.1700346 0.9999981 0.3125 0.6896247 0.3121871 0.1889381 0.2598782 0.4079525 0.3116297 0.1873317 0.3121832 0.1873317 0.3782503 0.1923854 0.4519031 0.9999981 0.6875 0.6902812 0.6876836 0.6902812 0.62949 0.9999981 0.578125 0.6939135 0.5775915 0.7776762 0.5386186 0.1923854 0.5220495 0.4151926 0.5775568 0.1902831 0.5783198 0.190283 0.62949 0.4108713 0.6882372 0.1871461 0.6879374 0.5359586 0.8624415 0.3960759 0.8301295 0.5733122 0.8204135 0 0.7731508 0.1361389 0.7401219 0.1485654 0.7839718 0.2024864 0.9458734 0.2570224 0.9363993 0.2808958 0.9534851 0.3131299 0.8670384 0.3955892 0.9062589 0.2847152 0.9017458 0.09806392 0.9162055 0.1276716 0.9058991 0.1287871 0.9206488 0.1811553 0.8622122 0.2027544 0.894453 0.1411504 0.8902941 0.01872832 0.890625 0.04063476 0.8697066 0.05961252 0.8901724 0.06273784 0.9199519 0.07151264 0.9057027 0.1464011 0.9490258 0.1590134 0.9364003 0.8386879 0.9394985 0.826001 0.921822 0.8776168 0.9219151 0.5285498 0.9352602 0.532264 0.9102795 0.8956506 0.90625 0.8412398 0.8905089 0.9113015 0.8905089 0.8079098 0.8695989 0.7653351 0.8899751 0.76439 0.90625 0.761991 0.9217455 0.4375 0.9965715 0.3670215 0.9696015 0.4629655 0.9744236 0.7910988 0.9613034 0.9999981 0.515625 0.7776762 0.4980636 0.9999981 0.4375 0.9971345 0.1585242 0.900077 0.1496739 0.5720752 0.1793744 0.7799501 0.1663918 0.7832734 0.1300448 0.2578295 0.06374253 0.2564161 0.08189965 0.1668442 0.137901 0.1292209 0.07914811 0.09952612 0.06442315 0.04043388 0.1305254 0.01872835 0.109375 0.4375 0.003428485 0.4637726 0.02571815 0.59375 0.007446665 0.6679362 0.07825454 0.5742446 0.08238274 0.6655192 0.1058235 0.002865496 0.1585243 0.03563474 0.1611263 0 0.2268495 0.1510459 0.2160284 0.1982691 0.1813682 0.08337148 0.1800383 0 0.1978738 0 0.3125 0 0.453125 0.6888274 0.7416661 0 0.578125 0 0.6875 0.9971345 0.8414758 0.9379801 0.8703029 0.9016629 0.8501818 0.999999 0.7789758 0.729256 0.7884167 0.7823671 0.8334726 0.002865475 0.841476 0.03583563 0.839106 0.2722396 0.8297701 0.197137 0.8188637 0.08357236 0.8201939 0 0.8021268 0.28125 0.9768473 0.201438 0.9261512 0.2554047 0.9179626 0.1445383 0.9258274 0.09952612 0.9355769 0.09852183 0.8943553 0.931486 0.921875 0.6671712 0.8899097 0.5759277 0.8947499 0.6638591 0.9175609 0.9812716 0.890625 0.5482016 0.9633235 0.59375 0.9925534 0.7159277 0.9615413 0.7 0.945425 0.7675582 0.9459459 0.5263928 0.4567676 0.4884372 0.4010938 0.7151031 0.4075521 0.8820308 0.2135688 0.8942697 0.2405528 0.6761714 0.2364507 0.9487654 0.1067708 0.962597 0.1198917 0.9085454 0.1195826 0.3429855 0.09242428 0.3514323 0.1185026 0.277309 0.115651 0.265625 0.0361845 0.3334896 0.02406776 0.3356418 0.04386813 0.1427707 0.05801871 0.1744998 0.04995615 0.1804615 0.05913507 0.1349038 0.100996 0.1706893 0.09692259 0.1759809 0.1095313 0.1423183 0.06825821 0.1804615 0.06832107 0.173096 0.07739134 0.05999845 0.08819154 0.08207086 0.07883782 0.08659141 0.0898498 0.05898032 0.1004111 0.08659141 0.100996 0.08137126 0.11375 0.7652137 0.03659404 0.8328022 0.05194131 0.808881 0.05337995 0.6211719 0.03601072 0.6285156 0.05405413 0.524496 0.05156872 0.5396268 0.1167888 0.4360157 0.1185026 0.4471522 0.09242429 0.9022939 0.07552084 0.9241215 0.08723959 0.8787208 0.08651621 0.7526042 0.06861801 0.8002623 0.06671987 0.8054876 0.07878183 0.7526042 0.1002604 0.8083693 0.09831308 0.8113302 0.1104462 0.2736371 0.1485938 0.3514323 0.1502214 0.3411979 0.1866489 0.6639315 0.2771917 0.8942693 0.2786677 0.8697902 0.3229167 0.1562511 0.2791241 0.3107035 0.277648 0.3045838 0.3213542 0.1562511 0.408776 0.3045838 0.4010938 0.3180602 0.4579915 0.8697902 0.6522657 0.8697902 0.6979167 0.6412029 0.652989 0.8942693 0.5532292 0.8697902 0.5859375 0.6712881 0.5511947 0.1562511 0.5483333 0.3180602 0.5462989 0.3124541 0.5866609 0.1562511 0.6522656 0.3124541 0.652989 0.3065369 0.6993927 0.5695313 0.8460568 0.4536806 0.850544 0.4571094 0.810725 0.06711087 0.7800916 0.06343906 0.7565639 0.1929175 0.7611223 0.2306868 0.9513204 0.2260853 0.9408649 0.2895312 0.9434252 0.2807812 0.8838282 0.3568576 0.8859347 0.3408333 0.9104018 0.1113044 0.9213129 0.1116782 0.9106351 0.1400501 0.9124579 0.1446823 0.8766863 0.1904687 0.8785417 0.1701445 0.8949519 0.03821372 0.8932292 0.02683007 0.8801084 0.05967332 0.878956 0.08207086 0.9211622 0.05999844 0.9118085 0.08532634 0.9106351 0.1744998 0.9500439 0.1427707 0.9419813 0.1804615 0.9408649 0.8682359 0.9316303 0.8351611 0.931382 0.8515355 0.9192709 0.5494792 0.9243508 0.445 0.9240633 0.4536805 0.9026273 0.9145255 0.8997396 0.8639822 0.8997396 0.874052 0.8879451 0.7648438 0.8786089 0.8267789 0.8800325 0.8083694 0.8932292 0.7526042 0.9127604 0.8054876 0.9127604 0.8001102 0.9242309 0.4552605 0.9871467 0.3985938 0.9841507 0.4059375 0.965048 0.8087289 0.9459459 0.8328022 0.9480587 0.7652137 0.963406 0.8942693 0.508125 0.8942692 0.5271875 0.6957673 0.5202572 0.6712881 0.4840332 0.8697902 0.4323698 0.8942692 0.4755729 0.9077926 0.1374354 0.9692065 0.1403705 0.9599097 0.1614855 0.4612761 0.189275 0.4360156 0.1502214 0.5518664 0.1523575 0.5988281 0.2055132 0.6759548 0.1661478 0.7985677 0.1897969 0.8776401 0.1637552 0.7674913 0.143778 0.8449004 0.1374354 0.8708431 0.1104462 0.8639822 0.09831309 0.9145255 0.1002604 0.2223917 0.07968862 0.2260853 0.06832107 0.2843397 0.07076623 0.2916834 0.08468991 0.2345746 0.1042448 0.2219393 0.09148549 0.2916834 0.05695295 0.2260853 0.05913507 0.2306868 0.04867965 0.1601215 0.1221615 0.1221861 0.1239323 0.1166151 0.1073558 0.1442667 0.08700035 0.1166151 0.0898498 0.1113044 0.07868718 0.1124686 0.07110345 0.1195676 0.06873842 0.146221 0.07926597 0.05913763 0.1216625 0.0268301 0.1198917 0.03821374 0.1067708 0.7738301 0.05337995 0.7139323 0.05405413 0.7159278 0.03845863 0.4080897 0.03533017 0.3985938 0.01584932 0.4552604 0.01285334 0.5203646 0.01452758 0.5882292 0.02112529 0.4805376 0.0375925 0.5318397 0.06980448 0.6285156 0.06861801 0.6285156 0.08195312 0.6285156 0.09375 0.6108507 0.1066065 0.5196002 0.08468991 0.8515356 0.07878183 0.8353133 0.06671987 0.868236 0.06836978 0.7770599 0.08651621 0.7139323 0.08723959 0.7139323 0.07576906 0.7861406 0.1195826 0.7146267 0.1198054 0.7139323 0.1055469 0.01727787 0.164568 0.02022058 0.1403706 0.0500989 0.1425977 0.2117716 0.2388779 0.07812649 0.2434364 0.06711086 0.2199087 0.2666928 0.1897313 0.1685217 0.1546709 0.2150434 0.1498177 0.09765727 0.1983066 0.1331314 0.1718342 0.2202869 0.2079404 0.06257463 0.1620307 0.0305479 0.1893158 0.0160843 0.1809636 0.7151031 0.3501823 0.4884372 0.3486198 0.5190361 0.3006073 0.2166675 0.3486198 0.07812649 0.3501823 0.07812648 0.3020833 0.230144 0.4942155 0.07812649 0.49625 0.07812648 0.4401042 0.7395823 0.7213323 0.5148695 0.7228084 0.5207866 0.6778067 0.7395822 0.6066927 0.5207866 0.6074161 0.5263928 0.568278 0.2245378 0.6074161 0.07812649 0.6066927 0.07812648 0.5703125 0.2039331 0.722352 0.06343906 0.720876 0.07812648 0.6770834 0.9599097 0.8385146 0.9692065 0.8596295 0.9110017 0.8621798 0.6475257 0.7635493 0.8697906 0.7594472 0.8820308 0.7864312 0.7985676 0.8102031 0.6813802 0.8334906 0.5946614 0.7944869 0.8542294 0.8621798 0.7790364 0.8558604 0.8776401 0.8362448 0.05063458 0.858021 0.02022056 0.8596296 0.01727786 0.8354324 0.3370312 0.813351 0.3568576 0.851768 0.2771094 0.8508855 0.2161203 0.7920597 0.1336671 0.8287845 0.09765727 0.8016938 0.2221875 0.8496615 0.1727293 0.8459476 0.2625261 0.8102687 0.0160843 0.8190368 0.0305479 0.8106847 0.06311032 0.838588 0.3334896 0.9565101 0.3334896 0.9759322 0.265625 0.9638156 0.2821875 0.929612 0.2260853 0.9316789 0.2218469 0.9197696 0.2213945 0.9067488 0.2380469 0.8940104 0.2895312 0.9156883 0.1725512 0.9220669 0.1804615 0.9316789 0.1423183 0.9317417 0.1456762 0.9201922 0.1195676 0.9312616 0.1124686 0.9288966 0.1432695 0.9000877 0.1116782 0.9007128 0.1153781 0.8880925 0.08190695 0.8880925 0.08532633 0.9007128 0.05898031 0.899589 0.8787206 0.9127604 0.9241215 0.9127604 0.9022938 0.9244792 0.5261285 0.8794243 0.616276 0.8763392 0.6285156 0.8944532 0.6285156 0.9062501 0.6084635 0.9171997 0.5261285 0.8973409 0.9117546 0.8800325 0.962597 0.8801084 0.9487654 0.8932292 0.7770599 0.8997396 0.7139323 0.8997396 0.7139323 0.8865215 0.7655627 0.931382 0.7 0.9296372 0.7139323 0.918047 0.5101042 0.9475855 0.6084635 0.9442011 0.6211719 0.9639893 0.4783854 0.9627857 0.5882292 0.9788747 0.5203646 0.9854724 0.704633 0.953545 0.7370718 0.9462006 0.749169 0.9536753 0.5030823 0.4283977 0.5941139 0.4039063 0.6280819 0.434908 0.8919914 0.2264571 0.7868807 0.2420476 0.7715816 0.2228055 0.9570162 0.1126552 0.9364974 0.1211665 0.9257066 0.112578 0.3503753 0.1046588 0.3129666 0.118278 0.3035111 0.102722 0.2982162 0.02991837 0.3367099 0.0335493 0.2987542 0.04054734 0.1559431 0.05344132 0.1797648 0.05462326 0.1606529 0.0589386 0.150617 0.09910946 0.1762769 0.102551 0.1519399 0.1060172 0.1605398 0.0683201 0.1794139 0.07296456 0.1550266 0.07309949 0.0694706 0.08292323 0.08511446 0.08441111 0.07303002 0.08925235 0.07277548 0.09998158 0.08493957 0.1070719 0.06802304 0.1069257 0.799441 0.04346578 0.8217738 0.05297246 0.7890877 0.04569004 0.6240104 0.04571275 0.5791383 0.05304785 0.5699586 0.04264348 0.4842752 0.1185624 0.4392295 0.1046588 0.4992989 0.1030064 0.9150355 0.08105469 0.899892 0.08770978 0.8910015 0.08087385 0.7775396 0.067048 0.8061674 0.07291189 0.7788459 0.07461037 0.7795663 0.09912254 0.8125365 0.1043513 0.7803065 0.1060621 0.3120486 0.1500684 0.3499284 0.1678634 0.2984744 0.1674565 0.7838205 0.2770076 0.8889308 0.3014378 0.7532215 0.3010688 0.226114 0.277692 0.3198636 0.3007922 0.2245841 0.3011612 0.2245841 0.4042122 0.3217028 0.4287036 0.2279532 0.436744 0.882811 0.6760873 0.7475394 0.6762681 0.7475394 0.6504543 0.8889308 0.5699479 0.7550607 0.5694393 0.7856596 0.5519913 0.2279532 0.5446477 0.3236704 0.5683962 0.2265517 0.5689048 0.2265517 0.6504543 0.3207896 0.6766372 0.2250724 0.6764563 0.5084071 0.8475617 0.446135 0.8316714 0.5215039 0.8279235 0.06388827 0.7688101 0.1275273 0.7551976 0.132117 0.7730319 0.2276924 0.9456959 0.2543729 0.9414223 0.262867 0.9485153 0.315191 0.8827011 0.3511936 0.899605 0.3038411 0.8978544 0.1116757 0.9157478 0.1256664 0.9110312 0.1260255 0.9174275 0.1690221 0.8752393 0.1797627 0.8886077 0.1529255 0.88692 0.03187692 0.8873448 0.04234111 0.8784682 0.05007198 0.8870568 0.0694706 0.9170768 0.07271375 0.9108689 0.08479819 0.9157102 0.1559431 0.9465587 0.1606529 0.9410614 0.1797649 0.9453768 0.8502232 0.9325395 0.8436705 0.9249028 0.8653136 0.9249649 0.501224 0.9250618 0.4431076 0.9124019 0.5033941 0.9136977 0.8895627 0.9003906 0.865518 0.8935357 0.8959801 0.8935357 0.7994682 0.8783625 0.8163986 0.8873259 0.7826262 0.88697 0.7788459 0.9121094 0.8061293 0.9188833 0.7775015 0.9188833 0.4270052 0.9861875 0.3966016 0.9740217 0.4361849 0.9760525 0.8217357 0.946859 0.799441 0.9565343 0.7890497 0.9541414 0.8950505 0.5179427 0.7917794 0.5273299 0.7917793 0.5113143 0.7550607 0.4583456 0.8889307 0.4535482 0.7856596 0.4810995 0.9406055 0.1389409 0.9680643 0.1519324 0.9275517 0.1485726 0.4427604 0.1685199 0.4873351 0.1510093 0.5181293 0.17168 0.6356228 0.1847745 0.7330837 0.178141 0.7053384 0.1987115 0.8147985 0.1556215 0.8115615 0.1397928 0.8656971 0.14914 0.8647157 0.1043513 0.8895627 0.09912254 0.8951778 0.1060621 0.2256186 0.07353888 0.253075 0.06894711 0.2521516 0.07659809 0.264377 0.09533264 0.2271753 0.0972659 0.2538744 0.08823656 0.2549109 0.05867216 0.2276924 0.05430414 0.2634051 0.05157926 0.1443269 0.1250911 0.1156304 0.1138116 0.1355904 0.1133689 0.1316267 0.08895455 0.11291 0.08437346 0.1270796 0.08243714 0.1151033 0.06961595 0.1348076 0.07400873 0.1288219 0.07600343 0.0422072 0.1216865 0.03187694 0.1126552 0.04993807 0.1130979 0.7482427 0.05350066 0.7081161 0.04632473 0.750737 0.04615618 0.3971396 0.02607283 0.4270052 0.01381253 0.4367229 0.02404209 0.5557943 0.01722433 0.5351084 0.03021973 0.4971526 0.02569593 0.5809742 0.06781916 0.6258464 0.0754032 0.5809742 0.07692378 0.6214302 0.0996464 0.5612586 0.09592305 0.5779144 0.08880269 0.8437085 0.07291188 0.8502612 0.06698594 0.8653138 0.07454832 0.7490501 0.08770978 0.7076172 0.08111675 0.7490501 0.0809359 0.7576137 0.121145 0.7077908 0.1111037 0.7513204 0.112272 0.01838107 0.1527031 0.03565133 0.1402315 0.03340568 0.1537162 0.1506001 0.2448025 0.06756012 0.2311902 0.1368305 0.2269683 0.2110693 0.1728288 0.1930788 0.1527107 0.2417622 0.1685331 0.1194944 0.186287 0.1749954 0.1882301 0.1544083 0.2034167 0.05382783 0.1767592 0.01947094 0.185434 0.0357488 0.1692316 0.5941139 0.3530078 0.5012432 0.3237651 0.6262428 0.3241557 0.151824 0.3530078 0.07031403 0.3245248 0.151824 0.3241341 0.1551932 0.4977726 0.07031403 0.4671615 0.1551932 0.4666528 0.631321 0.7229924 0.5082889 0.6991122 0.6328002 0.6987431 0.6328002 0.6094387 0.5111697 0.5868923 0.6342017 0.5867114 0.1537916 0.6094387 0.07031403 0.5872201 0.1537916 0.5874009 0.1302812 0.722308 0.06664217 0.6984482 0.1486405 0.6988172 0.9680642 0.8480676 0.9414077 0.8609629 0.9283539 0.8513312 0.7491204 0.7579523 0.8858716 0.7735429 0.7644202 0.7771945 0.7344401 0.8217686 0.6359375 0.8151351 0.7042968 0.8012885 0.8228998 0.8600206 0.8176848 0.8442882 0.8680294 0.8507638 0.03578524 0.8599232 0.01838105 0.8472971 0.0335396 0.8464387 0.3502431 0.832634 0.314273 0.8502988 0.2983008 0.8324133 0.1740877 0.8119246 0.1196283 0.8138679 0.1533667 0.7965836 0.1995886 0.8473138 0.2110796 0.8273259 0.2425065 0.8313367 0.01947094 0.8145665 0.05396175 0.8233958 0.03588272 0.8309233 0.3361719 0.9665452 0.2982162 0.9700817 0.2982162 0.9595473 0.252537 0.9311475 0.2254824 0.9263257 0.2514774 0.9233611 0.2279072 0.9006325 0.264707 0.9043257 0.2532002 0.9114165 0.1792777 0.9269 0.1605398 0.9316798 0.1548904 0.9267651 0.1346714 0.9258558 0.1151033 0.9303841 0.1286857 0.9238611 0.1264713 0.9005703 0.1126941 0.8950399 0.1310681 0.8936597 0.08475721 0.8950399 0.07245921 0.9004456 0.06815696 0.893535 0.899892 0.9121094 0.9150355 0.9189454 0.8910015 0.9189454 0.564247 0.8753732 0.6227865 0.8867085 0.5795465 0.8887038 0.6208333 0.9116697 0.5622938 0.9079841 0.5795465 0.9013405 0.9372997 0.8787373 0.9570162 0.8873448 0.9265089 0.8873259 0.7490501 0.9003906 0.7076172 0.8931799 0.7490501 0.8931799 0.736573 0.9320413 0.7041341 0.9229367 0.7461759 0.9245968 0.5582877 0.9450805 0.6189974 0.953851 0.5663607 0.9571451 0.5345703 0.9698748 0.5557943 0.9827757 0.4966146 0.9743986 0.6719052 0.9661205 0.6569336 0.9444737 0.699349 0.9373871 0.7725408 0.9384744 0.7914476 0.9455609 0.735562 0.9659747 0.4197981 0.4666293 0.3934636 0.3998958 0.483281 0.3745899 0.7549468 0.3781576 0.8180976 0.4157878 0.5764382 0.4780355 0.9999995 0.2065362 0.9999986 0.2355121 0.8934882 0.2574312 0.6291661 0.2545606 0.6006508 0.2241449 0.8542641 0.2014835 0.9747729 0.1015625 0.9877703 0.1171875 0.9663722 0.1289676 0.901251 0.1278476 0.8846807 0.1157919 0.9354124 0.1025391 0.3920825 0.0879333 0.392513 0.1180143 0.3503776 0.1337565 0.2666081 0.1310091 0.2494987 0.1108854 0.3248819 0.08477575 0.234375 0.03130062 0.328125 0.01500485 0.3680729 0.01919172 0.3731372 0.04313352 0.323046 0.05250807 0.2412655 0.04254523 0.1258517 0.05673712 0.1669506 0.04521138 0.199171 0.04816749 0.2022533 0.05905245 0.1796677 0.06364865 0.1374175 0.06314034 0.1235647 0.09532204 0.1598189 0.09196583 0.1946276 0.0943948 0.204401 0.1095898 0.1703971 0.1165169 0.1235647 0.1034541 0.2022533 0.06830633 0.1957949 0.07997423 0.1619007 0.08001921 0.1279449 0.06833209 0.04723178 0.08689907 0.07824393 0.07319723 0.09646142 0.07705317 0.1010105 0.09003269 0.08693822 0.09532204 0.05578987 0.09417629 0.1010105 0.1034541 0.09932546 0.1197851 0.07354958 0.1192177 0.04689628 0.1025767 0.7392994 0.026795 0.8428982 0.05059833 0.8581247 0.06068714 0.8243656 0.06020836 0.7932057 0.05342778 0.7355621 0.03402526 0.6719052 0.03387943 0.6732422 0.05443905 0.6311849 0.06152562 0.5050382 0.0611634 0.4848689 0.04721689 0.6119336 0.02709818 0.5598959 0.1333722 0.4355859 0.1337565 0.4704028 0.08477575 0.5868815 0.112898 0.9130919 0.0703125 0.9498801 0.0859375 0.9253516 0.09375 0.8686485 0.09235895 0.8621033 0.08356988 0.8864946 0.0711289 0.7299154 0.06152562 0.7890556 0.06020837 0.8198333 0.06686626 0.8304205 0.08041233 0.7963947 0.08356988 0.7299154 0.07150124 0.7299154 0.09375001 0.7971151 0.09235895 0.8371343 0.09799045 0.8425506 0.1122838 0.8030864 0.1157919 0.7299154 0.1022331 0.392513 0.1499674 0.3970508 0.1969841 0.3163998 0.1970982 0.240026 0.147832 0.9999981 0.28125 0.9999981 0.34375 0.8180976 0.3401498 0.5654031 0.2835987 0.1054701 0.2587225 0.2752805 0.2557378 0.408763 0.2837128 0.3934636 0.337806 0.2688547 0.337806 0.1054701 0.2859268 0.1054701 0.3784635 0.2688547 0.3745899 0.2890695 0.482111 0.1054701 0.4192513 0.9999981 0.65625 0.9999981 0.71875 0.8242174 0.7141873 0.5619092 0.6615473 0.5619092 0.6295486 0.8242174 0.6284635 0.9999981 0.5546875 0.9999981 0.6015625 0.8242174 0.5989388 0.5764382 0.5551775 0.6432609 0.5339014 0.893488 0.538177 0.1054701 0.524323 0.2890695 0.5212712 0.4197981 0.5539535 0.4113889 0.6000239 0.2806603 0.6000239 0.1054701 0.5570052 0.1054701 0.6284635 0.2806603 0.6295486 0.4113889 0.6615473 0.402513 0.7164013 0.2681125 0.7162873 0.1054701 0.6604623 0.6011393 0.8629277 0.4801953 0.8666819 0.4037109 0.8527105 0.3908008 0.8030159 0.5016146 0.7956738 0.6296549 0.8425322 0 0.7847262 0 0.7615754 0.06390781 0.7412776 0.2250203 0.7442623 0.2317389 0.7736416 0.07705211 0.7908919 0.199171 0.9518326 0.2022533 0.9409475 0.2256286 0.9363513 0.2996484 0.9368557 0.3198177 0.9480592 0.2412655 0.9574548 0.2718164 0.8682097 0.3585156 0.8698395 0.4037109 0.8928148 0.3888541 0.9197212 0.3216536 0.9164035 0.254707 0.8880274 0.09646141 0.9229469 0.0981949 0.9106945 0.1115871 0.9057111 0.1476931 0.9066095 0.1487473 0.9153625 0.1113176 0.9261045 0.1498165 0.8633343 0.2040234 0.8653581 0.2123633 0.8852475 0.1938104 0.9013667 0.1588886 0.8984774 0.1244631 0.8814486 0.025227 0.8984375 0.01222964 0.8828125 0.02297677 0.8710324 0.06165006 0.8691899 0.07435312 0.8820161 0.04689626 0.8974233 0.07824393 0.9268028 0.04723177 0.913101 0.05578986 0.9058238 0.0850406 0.9057111 0.1669506 0.9547886 0.1258517 0.9432629 0.1374175 0.9368596 0.1796677 0.9363513 0.8581247 0.9393128 0.8241374 0.9384744 0.8196051 0.9284987 0.8304205 0.9150391 0.8621032 0.9150391 0.8864945 0.9288711 0.5863607 0.9345356 0.4653385 0.9362464 0.4801953 0.8968902 0.5863607 0.92178 0.9253516 0.9062501 0.8686485 0.9062501 0.8371343 0.897461 0.8504242 0.8833249 0.8894944 0.8833249 0.9354124 0.897461 0.7614908 0.8682159 0.8394195 0.8715752 0.7971151 0.8974609 0.7329752 0.8811895 0.7299154 0.90625 0.7963947 0.90625 0.7867986 0.9284987 0.7299154 0.9147331 0.46875 0.9982858 0.40625 0.9948573 0.3680729 0.9808083 0.3699089 0.9574338 0.4315495 0.9602844 0.485625 0.9869383 0.8428982 0.9494017 0.7392994 0.973205 0.9999981 0.5078125 0.9999981 0.5234375 0.6432609 0.505861 0.893488 0.4949349 0.9999981 0.40625 0.9999981 0.46875 0.9957018 0.1417621 0.9985672 0.1752862 0.9335119 0.1663272 0.8746101 0.1366636 0.618457 0.1566193 0.5078646 0.2043262 0.7198893 0.15177 0.86163 0.1783009 0.7345052 0.1309357 0.8175987 0.1278476 0.2256286 0.06364865 0.3028767 0.06371164 0.3028767 0.07545498 0.2199751 0.08594568 0.1875065 0.1341667 0.138933 0.1375935 0.1113176 0.07389562 0.1504824 0.08382492 0.09663806 0.06538473 0.1024142 0.06346157 0.06084653 0.131738 0.02297679 0.1289677 0.01222967 0.1171875 0.02522703 0.1015625 0.40625 0.005142728 0.46875 0.001714243 0.485625 0.0130617 0.4347778 0.04028288 0.546875 0.003723333 0.640625 0.01117 0.6732422 0.07150124 0.6732422 0.08526693 0.6311849 0.08811849 0.5038142 0.07521455 0.6732422 0.09938151 0.6635742 0.1151105 0.001432748 0.1752864 0.004298244 0.1417621 0.06019582 0.1492653 0.01661196 0.1744824 0 0.2384248 0 0.2152743 0.07705211 0.2091086 0.2416607 0.2263585 0.2671096 0.2055034 0.1467475 0.1597086 0.0547863 0.1933573 0.09541707 0.1620139 0 0.2007864 0 0.1949612 0 0.34375 0 0.28125 0 0.4921875 0 0.4140625 0.8242176 0.7425689 0.5560935 0.7454394 0 0.6015625 0 0.5546875 0 0.71875 0 0.65625 0.9985672 0.8247138 0.9957018 0.8582379 0.9663721 0.8710324 0.9060647 0.8715752 0.8809538 0.8627591 0.933512 0.8336728 0.9999986 0.7644879 0.9999995 0.7934638 0.8542641 0.7985165 0.5882811 0.7758552 0.8616301 0.8216991 0.7295573 0.8476875 0.004298213 0.858238 0.001432738 0.8247139 0.01661195 0.825518 0.06099936 0.8516626 0.2461523 0.8513868 0.3101498 0.8029018 0.2608596 0.7944966 0.148469 0.8412192 0.09622062 0.838914 0.0547863 0.8066432 0 0.8050394 0 0.7992142 0.328125 0.9849951 0.234375 0.9686994 0.2022533 0.9316937 0.1949777 0.9192131 0.2191579 0.9129357 0.2996484 0.9251123 0.1279449 0.9316679 0.1610835 0.9191681 0.1024142 0.9365385 0.09663806 0.9346153 0.0981949 0.9006989 0.09829306 0.8855242 0.9498801 0.9140625 0.9130919 0.9296875 0.6701823 0.880622 0.6732422 0.8977669 0.6311849 0.9006186 0.5105469 0.8871832 0.6732422 0.9118816 0.6569336 0.92456 0.9877703 0.8828125 0.9747729 0.8984375 0.6119336 0.9729018 0.4785807 0.9530444 0.640625 0.98883 0.546875 0.9962767</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape1-map1-array" count="1267" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape1-textangents">
+ <float_array id="qt_gauge_background_Shape1-textangents-array" count="14256">-0.01883977 0 0.9998225 -0.01748238 0 0.9998472 0.001471107 0 0.9999989 0.0317907 0 0.9994946 -0.01748238 0 0.9998472 -0.002873173 0 0.9999957 0.002330902 0 0.9999973 0.001471107 0 0.9999989 0.001471107 0 0.9999989 0.002330902 0 0.9999973 -2.03961e-4 0 0.9999998 -0.003617775 0 0.9999932 0.0317907 0 0.9994946 0.001471107 0 0.9999989 -0.003617775 0 0.9999932 0.007021161 0 0.9999753 0 0 0.9999999 0 0 0.9999999 0.002410374 0 0.9999971 -6.06377e-4 0 0.9999996 0 0 0.9999999 0 0 0.9999999 -0.002117234 0 0.9999977 0.002410374 0 0.9999971 0.002410374 0 0.9999971 -0.002117234 0 0.9999977 -2.03961e-4 0 0.9999998 0.002330902 0 0.9999973 -6.06377e-4 0 0.9999996 0.002410374 0 0.9999971 0.002330902 0 0.9999973 -0.002873173 0 0.9999957 0 0 0.9999999 0.002468505 0 0.9999967 -0.002373842 0 0.9999971 0 0 0.9999999 0.002468505 0 0.9999967 0.007021161 0 0.9999753 -0.003617775 0 0.9999932 -0.002373842 0 0.9999971 -0.002373842 0 0.9999971 -0.003617775 0 0.9999932 -2.03961e-4 0 0.9999998 -0.002117234 0 0.9999977 0 0 0.9999999 -0.002373842 0 0.9999971 -0.002117234 0 0.9999977 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.006024944 0 0.9999818 0.006606746 0 0.9999782 0.004885656 0 0.999988 -0.009223325 0 0.9999573 0.006606746 0 0.9999782 0.02412052 0 0.9997091 0.03511409 0 0.9993833 0.004885656 0 0.999988 0.004885656 0 0.999988 0.03511409 0 0.9993833 0.01821868 0 0.999834 9.39363e-4 0 0.9999995 -0.009223325 0 0.9999573 0.004885656 0 0.999988 9.39363e-4 0 0.9999995 -0.003781973 0 0.9999927 0.1398229 0 0.9901766 0.09563368 0 0.9954165 0.08250221 0 0.9965909 0.0749849 0 0.9971846 0.09563368 0 0.9954165 0.02701436 0 0.999635 0.02729583 0 0.9996274 0.08250221 0 0.9965909 0.08250221 0 0.9965909 0.02729583 0 0.9996274 0.01821868 0 0.999834 0.03511409 0 0.9993833 0.0749849 0 0.9971846 0.08250221 0 0.9965909 0.03511409 0 0.9993833 0.02412052 0 0.9997091 0 0 0.9999999 -8.21801e-4 0 0.9999996 0.005302156 0 0.9999858 0.004960677 0 0.9999875 -8.21801e-4 0 0.9999996 -0.003781973 0 0.9999927 9.39363e-4 0 0.9999995 0.005302156 0 0.9999858 0.005302156 0 0.9999858 9.39363e-4 0 0.9999995 0.01821868 0 0.999834 0.02729583 0 0.9996274 0.004960677 0 0.9999875 0.005302156 0 0.9999858 0.02729583 0 0.9996274 0.02701436 0 0.999635 0 0 0.9999999 0.01719688 0 0.9998521 0.01820803 0 0.9998342 0 0 0.9999999 0.01719688 0 0.9998521 0.05981902 0 0.9982092 0.08009655 0 0.9967871 0.01820803 0 0.9998342 0.01820803 0 0.9998342 0.08009655 0 0.9967871 0.04519426 0 0.9989782 0.00772822 0 0.99997 0 0 0.9999999 0.01820803 0 0.9998342 0.00772822 0 0.99997 0 0 0.9999999 0.3359013 0 0.9418971 0.2222058 0 0.9749998 0.1114198 0 0.9937733 0.2220397 0 0.9750376 0.2222058 0 0.9749998 0.07086123 0 0.9974862 0.04661954 0 0.9989128 0.1114198 0 0.9937733 0.1114198 0 0.9937733 0.04661954 0 0.9989128 0.04519426 0 0.9989782 0.08009655 0 0.9967871 0.2220397 0 0.9750376 0.1114198 0 0.9937733 0.08009655 0 0.9967871 0.05981902 0 0.9982092 0 0 0.9999999 0 0 0.9999999 0.01024577 0 0.9999475 0.0130777 0 0.9999145 0 0 0.9999999 0 0 0.9999999 0.00772822 0 0.99997 0.01024577 0 0.9999475 0.01024577 0 0.9999475 0.00772822 0 0.99997 0.04519426 0 0.9989782 0.04661954 0 0.9989128 0.0130777 0 0.9999145 0.01024577 0 0.9999475 0.04661954 0 0.9989128 0.07086123 0 0.9974862 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0.02828729 0 0.9995998 0.04532848 0 0.9989722 0.02578811 0 0.9996673 0.03334555 0 0.9994438 0.04532848 0 0.9989722 0.03840816 0 0.9992621 0.02505765 0 0.9996859 0.02578811 0 0.9996673 0.02578811 0 0.9996673 0.02505765 0 0.9996859 0.01388914 0 0.9999035 0.01180292 0 0.9999301 0.03334555 0 0.9994438 0.02578811 0 0.9996673 0.01180292 0 0.9999301 0.01148487 0 0.9999339 -0.08577254 0 0.9963146 -0.02676813 0 0.9996417 0.007405161 0 0.9999725 0.02511295 0 0.9996846 -0.02676813 0 0.9996417 -0.01252065 0 0.9999216 0.003082898 0 0.9999952 0.007405161 0 0.9999725 0.007405161 0 0.9999725 0.003082898 0 0.9999952 0.01388914 0 0.9999035 0.02505765 0 0.9996859 0.02511295 0 0.9996846 0.007405161 0 0.9999725 0.02505765 0 0.9996859 0.03840816 0 0.9992621 0 0 0.9999999 0.002308159 0 0.9999973 0.005457678 0 0.9999851 -0.001722294 0 0.9999985 0.002308159 0 0.9999973 0.01148487 0 0.9999339 0.01180292 0 0.9999301 0.005457678 0 0.9999851 0.005457678 0 0.9999851 0.01180292 0 0.9999301 0.01388914 0 0.9999035 0.003082898 0 0.9999952 -0.001722294 0 0.9999985 0.005457678 0 0.9999851 0.003082898 0 0.9999952 -0.01252065 0 0.9999216 0.01630293 0 0.9998671 0.1567831 0 0.987633 0.09427358 0 0.9955463 0.1400757 0 0.9901407 0.1567831 0 0.987633 0.05839311 0 0.9982936 0.04523758 0 0.9989762 0.09427358 0 0.9955463 0.09427358 0 0.9955463 0.04523758 0 0.9989762 0.01812367 0 0.9998357 0.04468976 0 0.9990008 0.1400757 0 0.9901407 0.09427358 0 0.9955463 0.04468976 0 0.9990008 0.06858326 0 0.9976454 0.02828729 0 0.9995998 -7.39891e-4 0 0.9999996 0.007791536 0 0.9999697 -6.89053e-4 0 0.9999998 -7.39891e-4 0 0.9999996 -5.3519e-4 0 0.9999997 0.003427541 0 0.999994 0.007791536 0 0.9999697 0.007791536 0 0.9999697 0.003427541 0 0.999994 0.01812367 0 0.9998357 0.04523758 0 0.9989762 -6.89053e-4 0 0.9999998 0.007791536 0 0.9999697 0.04523758 0 0.9989762 0.05839311 0 0.9982936 0 0 0.9999999 0.01768041 0 0.9998435 0.008598601 0 0.9999629 -5.11692e-4 0 0.9999998 0.01768041 0 0.9998435 0.06858326 0 0.9976454 0.04468976 0 0.9990008 0.008598601 0 0.9999629 0.008598601 0 0.9999629 0.04468976 0 0.9990008 0.01812367 0 0.9998357 0.003427541 0 0.999994 -5.11692e-4 0 0.9999998 0.008598601 0 0.9999629 0.003427541 0 0.999994 -5.3519e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.01630293 0 0.9998671 0.1400757 0 0.9901407 0.06814682 0 0.9976753 0.03697535 0 0.999316 0.1400757 0 0.9901407 0.06858326 0 0.9976454 0.04246972 0 0.9990978 0.06814682 0 0.9976753 0.06814682 0 0.9976753 0.04246972 0 0.9990978 0.01996363 0 0.9998006 0.03354349 0 0.9994373 0.03697535 0 0.999316 0.06814682 0 0.9976753 0.03354349 0 0.9994373 0.01326744 0 0.9999119 0 0 0.9999999 0 0 0.9999999 0.007950084 0 0.9999683 0.01768041 0 0.9998435 0 0 0.9999999 0 0 0.9999999 0.004786012 0 0.9999885 0.007950084 0 0.9999683 0.007950084 0 0.9999683 0.004786012 0 0.9999885 0.01996363 0 0.9998006 0.04246972 0 0.9990978 0.01768041 0 0.9998435 0.007950084 0 0.9999683 0.04246972 0 0.9990978 0.06858326 0 0.9976454 0 0 0.9999999 0.005040619 0 0.9999871 0.007896812 0 0.9999688 0 0 0.9999999 0.005040619 0 0.9999871 0.01326744 0 0.9999119 0.03354349 0 0.9994373 0.007896812 0 0.9999688 0.007896812 0 0.9999688 0.03354349 0 0.9994373 0.01996363 0 0.9998006 0.004786012 0 0.9999885 0 0 0.9999999 0.007896812 0 0.9999688 0.004786012 0 0.9999885 0 0 0.9999999 -0.03912016 0 0.9992346 -0.03516039 0 0.9993816 -0.02397191 0 0.9997126 -0.03562174 0 0.9993653 -0.03516039 0 0.9993816 -0.001467794 0 0.9999989 3.29222e-4 0 0.9999999 -0.02397191 0 0.9997126 -0.02397191 0 0.9997126 3.29222e-4 0 0.9999999 -0.002890125 0 0.9999958 -0.01174113 0 0.9999311 -0.03562174 0 0.9993653 -0.02397191 0 0.9997126 -0.01174113 0 0.9999311 -0.01629663 0 0.9998671 -0.2261525 0 0.9740919 -0.004728409 0 0.9999887 0.02673769 0 0.9996424 0.04762619 0 0.9988652 -0.004728409 0 0.9999887 -0.005389479 0 0.9999855 0.01779513 0 0.9998415 0.02673769 0 0.9996424 0.02673769 0 0.9996424 0.01779513 0 0.9998415 -0.002890125 0 0.9999958 3.29222e-4 0 0.9999999 0.04762619 0 0.9988652 0.02673769 0 0.9996424 3.29222e-4 0 0.9999999 -0.001467794 0 0.9999989 0 0 0.9999999 -0.003839481 0 0.9999924 0.001921765 0 0.9999981 -0.002349805 0 0.9999971 -0.003839481 0 0.9999924 -0.01629663 0 0.9998671 -0.01174113 0 0.9999311 0.001921765 0 0.9999981 0.001921765 0 0.9999981 -0.01174113 0 0.9999311 -0.002890125 0 0.9999958 0.01779513 0 0.9998415 -0.002349805 0 0.9999971 0.001921765 0 0.9999981 0.01779513 0 0.9998415 -0.005389479 0 0.9999855 -0.03912016 0 0.9992346 -0.03562174 0 0.9993653 -0.01884491 0 0.9998223 -0.01674236 0 0.9998599 -0.03562174 0 0.9993653 -0.01629663 0 0.9998671 -0.01180148 0 0.9999303 -0.01884491 0 0.9998223 -0.01884491 0 0.9998223 -0.01180148 0 0.9999303 -0.009524679 0 0.9999546 -0.01034316 0 0.9999463 -0.01674236 0 0.9998599 -0.01884491 0 0.9998223 -0.01034316 0 0.9999463 -0.005515532 0 0.9999846 0 0 0.9999999 0 0 0.9999999 -0.002577625 0 0.9999965 -0.003839481 0 0.9999924 0 0 0.9999999 0 0 0.9999999 -0.002300428 0 0.9999972 -0.002577625 0 0.9999965 -0.002577625 0 0.9999965 -0.002300428 0 0.9999972 -0.009524679 0 0.9999546 -0.01180148 0 0.9999303 -0.003839481 0 0.9999924 -0.002577625 0 0.9999965 -0.01180148 0 0.9999303 -0.01629663 0 0.9998671 0 0 0.9999999 -8.6946e-4 0 0.9999996 -0.002550258 0 0.9999967 0 0 0.9999999 -8.6946e-4 0 0.9999996 -0.005515532 0 0.9999846 -0.01034316 0 0.9999463 -0.002550258 0 0.9999967 -0.002550258 0 0.9999967 -0.01034316 0 0.9999463 -0.009524679 0 0.9999546 -0.002300428 0 0.9999972 0 0 0.9999999 -0.002550258 0 0.9999967 -0.002300428 0 0.9999972 0 0 0.9999999 0.01885335 0 0.9998221 -0.07412723 0 0.9972488 -0.05246595 0 0.9986227 -0.03208454 0 0.9994851 -0.07412723 0 0.9972488 -0.1014883 0 0.9948367 -0.09059021 0 0.9958882 -0.05246595 0 0.9986227 -0.05246595 0 0.9986227 -0.09059021 0 0.9958882 -0.05627676 0 0.9984152 -0.02712956 0 0.9996319 -0.03208454 0 0.9994851 -0.05246595 0 0.9986227 -0.02712956 0 0.9996319 -0.00740652 0 0.9999725 -0.1737191 0 0.9847953 -0.1681351 0 0.9857639 -0.1185289 0 0.9929506 -0.1744229 0 0.9846708 -0.1681351 0 0.9857639 -0.07463499 0 0.9972109 -0.06176024 0 0.9980909 -0.1185289 0 0.9929506 -0.1185289 0 0.9929506 -0.06176024 0 0.9980909 -0.05627676 0 0.9984152 -0.09059021 0 0.9958882 -0.1744229 0 0.9846708 -0.1185289 0 0.9929506 -0.09059021 0 0.9958882 -0.1014883 0 0.9948367 0 0 0.9999999 -0.002476185 0 0.9999968 -0.01636499 0 0.999866 -0.01837931 0 0.999831 -0.002476185 0 0.9999968 -0.00740652 0 0.9999725 -0.02712956 0 0.9996319 -0.01636499 0 0.999866 -0.01636499 0 0.999866 -0.02712956 0 0.9996319 -0.05627676 0 0.9984152 -0.06176024 0 0.9980909 -0.01837931 0 0.999831 -0.01636499 0 0.999866 -0.06176024 0 0.9980909 -0.07463499 0 0.9972109 0.01885335 0 0.9998221 0.0176233 0 0.9998447 0.01365025 0 0.9999067 0.05529651 0 0.99847 0.0176233 0 0.9998447 0.003891197 0 0.9999923 0.005877873 0 0.9999827 0.01365025 0 0.9999067 0.01365025 0 0.9999067 0.005877873 0 0.9999827 0.005016274 0 0.9999874 0.01052688 0 0.9999445 0.05529651 0 0.99847 0.01365025 0 0.9999067 0.01052688 0 0.9999445 0.02399765 0 0.999712 0 0 0.9999999 0 0 0.9999999 0.002477599 0 0.9999969 -9.2707e-4 0 0.9999994 0 0 0.9999999 0 0 0.9999999 -4.77306e-4 0 0.9999998 0.002477599 0 0.9999969 0.002477599 0 0.9999969 -4.77306e-4 0 0.9999998 0.005016274 0 0.9999874 0.005877873 0 0.9999827 -9.2707e-4 0 0.9999994 0.002477599 0 0.9999969 0.005877873 0 0.9999827 0.003891197 0 0.9999923 0 0 0.9999999 0.005330923 0 0.9999858 0.001811389 0 0.9999983 0 0 0.9999999 0.005330923 0 0.9999858 0.02399765 0 0.999712 0.01052688 0 0.9999445 0.001811389 0 0.9999983 0.001811389 0 0.9999983 0.01052688 0 0.9999445 0.005016274 0 0.9999874 -4.77306e-4 0 0.9999998 0 0 0.9999999 0.001811389 0 0.9999983 -4.77306e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.1737191 0 0.9847953 -0.01008286 0 0.9999491 -0.008375363 0 0.9999649 -0.05839752 0 0.9982933 -0.01008286 0 0.9999491 9.14993e-4 0 0.9999995 4.17544e-4 0 0.9999999 -0.008375363 0 0.9999649 -0.008375363 0 0.9999649 4.17544e-4 0 0.9999999 -0.001877753 0 0.9999983 -0.007460501 0 0.9999722 -0.05839752 0 0.9982933 -0.008375363 0 0.9999649 -0.007460501 0 0.9999722 -0.02319377 0 0.999731 0 0 0.9999999 0 0 0.9999999 -8.45062e-4 0 0.9999995 0.001458215 0 0.9999988 0 0 0.9999999 0 0 0.9999999 -5.24836e-4 0 0.9999998 -8.45062e-4 0 0.9999995 -8.45062e-4 0 0.9999995 -5.24836e-4 0 0.9999998 -0.001877753 0 0.9999983 4.17544e-4 0 0.9999999 0.001458215 0 0.9999988 -8.45062e-4 0 0.9999995 4.17544e-4 0 0.9999999 9.14993e-4 0 0.9999995 0 0 0.9999999 -0.005177594 0 0.9999865 -0.00257081 0 0.9999965 0 0 0.9999999 -0.005177594 0 0.9999865 -0.02319377 0 0.999731 -0.007460501 0 0.9999722 -0.00257081 0 0.9999965 -0.00257081 0 0.9999965 -0.007460501 0 0.9999722 -0.001877753 0 0.9999983 -5.24836e-4 0 0.9999998 0 0 0.9999999 -0.00257081 0 0.9999965 -5.24836e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.004960677 0 0.9999875 0.006637753 0 0.9999778 0 0 0.9999999 0.004960677 0 0.9999875 0.02701436 0 0.999635 0.02750251 0 0.9996217 0.006637753 0 0.9999778 0.006637753 0 0.9999778 0.02750251 0 0.9996217 0.01920786 0 0.9998155 0.003759927 0 0.9999928 0 0 0.9999999 0.006637753 0 0.9999778 0.003759927 0 0.9999928 0 0 0.9999999 0.1398229 0 0.9901766 0.05624119 0 0.9984171 0.0697112 0 0.9975671 0.09563368 0 0.9954165 0.05624119 0 0.9984171 0.02467567 0 0.9996955 0.03256086 0 0.9994698 0.0697112 0 0.9975671 0.0697112 0 0.9975671 0.03256086 0 0.9994698 0.01920786 0 0.9998155 0.02750251 0 0.9996217 0.09563368 0 0.9954165 0.0697112 0 0.9975671 0.02750251 0 0.9996217 0.02701436 0 0.999635 0 0 0.9999999 0 0 0.9999999 0.009219494 0 0.9999574 0.004968539 0 0.9999876 0 0 0.9999999 0 0 0.9999999 0.003759927 0 0.9999928 0.009219494 0 0.9999574 0.009219494 0 0.9999574 0.003759927 0 0.9999928 0.01920786 0 0.9998155 0.03256086 0 0.9994698 0.004968539 0 0.9999876 0.009219494 0 0.9999574 0.03256086 0 0.9994698 0.02467567 0 0.9996955 -0.1754599 0 0.9844865 -0.1388723 0 0.9903103 -0.07111984 0 0.9974678 -0.06134399 0 0.9981167 -0.1388723 0 0.9903103 -0.05529641 0 0.9984699 -0.04061933 0 0.9991748 -0.07111984 0 0.9974678 -0.07111984 0 0.9974678 -0.04061933 0 0.9991748 -0.01986078 0 0.9998027 -0.03622689 0 0.9993436 -0.06134399 0 0.9981167 -0.07111984 0 0.9974678 -0.03622689 0 0.9993436 -0.03304328 0 0.9994538 0 0 0.9999999 0 0 0.9999999 -0.008821841 0 0.999961 -0.01238314 0 0.9999233 0 0 0.9999999 0 0 0.9999999 -0.004736478 0 0.9999887 -0.008821841 0 0.999961 -0.008821841 0 0.999961 -0.004736478 0 0.9999887 -0.01986078 0 0.9998027 -0.04061933 0 0.9991748 -0.01238314 0 0.9999233 -0.008821841 0 0.999961 -0.04061933 0 0.9991748 -0.05529641 0 0.9984699 0 0 0.9999999 -0.007615969 0 0.999971 -0.008397966 0 0.9999645 0 0 0.9999999 -0.007615969 0 0.999971 -0.03304328 0 0.9994538 -0.03622689 0 0.9993436 -0.008397966 0 0.9999645 -0.008397966 0 0.9999645 -0.03622689 0 0.9993436 -0.01986078 0 0.9998027 -0.004736478 0 0.9999887 0 0 0.9999999 -0.008397966 0 0.9999645 -0.004736478 0 0.9999887 0 0 0.9999999 -0.06067236 0 0.9981577 -0.05259047 0 0.9986161 -0.02841316 0 0.9995961 -0.02749278 0 0.999622 -0.05259047 0 0.9986161 -0.0224443 0 0.9997481 -0.01644096 0 0.9998648 -0.02841316 0 0.9995961 -0.02841316 0 0.9995961 -0.01644096 0 0.9998648 -0.007930527 0 0.9999686 -0.01376516 0 0.9999052 -0.02749278 0 0.999622 -0.02841316 0 0.9995961 -0.01376516 0 0.9999052 -0.01081198 0 0.9999416 0 0 0.9999999 0 0 0.9999999 -0.003611557 0 0.9999933 -0.005293087 0 0.9999858 0 0 0.9999999 0 0 0.9999999 -0.00303405 0 0.9999952 -0.003611557 0 0.9999933 -0.003611557 0 0.9999933 -0.00303405 0 0.9999952 -0.007930527 0 0.9999686 -0.01644096 0 0.9998648 -0.005293087 0 0.9999858 -0.003611557 0 0.9999933 -0.01644096 0 0.9998648 -0.0224443 0 0.9997481 0 0 0.9999999 -0.00197244 0 0.9999979 -0.003864292 0 0.9999924 0 0 0.9999999 -0.00197244 0 0.9999979 -0.01081198 0 0.9999416 -0.01376516 0 0.9999052 -0.003864292 0 0.9999924 -0.003864292 0 0.9999924 -0.01376516 0 0.9999052 -0.007930527 0 0.9999686 -0.00303405 0 0.9999952 0 0 0.9999999 -0.003864292 0 0.9999924 -0.00303405 0 0.9999952 0 0 0.9999999 0.03404864 0 0.9994202 0.02321586 0 0.9997303 0.02519781 0 0.9996824 0.03060854 0 0.9995314 0.02321586 0 0.9997303 0.01235523 0 0.9999235 0.01629109 0 0.9998672 0.02519781 0 0.9996824 0.02519781 0 0.9996824 0.01629109 0 0.9998672 0.009138476 0 0.9999581 0.01286319 0 0.9999172 0.03060854 0 0.9995314 0.02519781 0 0.9996824 0.01286319 0 0.9999172 0.01406413 0 0.999901 -0.08657958 0 0.9962449 -0.03176843 0 0.9994951 0.002894114 0 0.9999956 -0.002068622 0 0.9999978 -0.03176843 0 0.9994951 -0.01725478 0 0.999851 -0.002420465 0 0.9999969 0.002894114 0 0.9999956 0.002894114 0 0.9999956 -0.002420465 0 0.9999969 0.009138476 0 0.9999581 0.01629109 0 0.9998672 -0.002068622 0 0.9999978 0.002894114 0 0.9999956 0.01629109 0 0.9998672 0.01235523 0 0.9999235 0 0 0.9999999 0.003680642 0 0.9999931 0.002027897 0 0.9999978 -0.004211805 0 0.9999911 0.003680642 0 0.9999931 0.01406413 0 0.999901 0.01286319 0 0.9999172 0.002027897 0 0.9999978 0.002027897 0 0.9999978 0.01286319 0 0.9999172 0.009138476 0 0.9999581 -0.002420465 0 0.9999969 -0.004211805 0 0.9999911 0.002027897 0 0.9999978 -0.002420465 0 0.9999969 -0.01725478 0 0.999851 0.1352684 0 0.9908089 0.05138426 0 0.9986789 0.06431107 0 0.9979299 0.09024207 0 0.9959199 0.05138426 0 0.9986789 0.02248242 0 0.9997472 0.02925651 0 0.9995719 0.06431107 0 0.9979299 0.06431107 0 0.9979299 0.02925651 0 0.9995719 0.01754467 0 0.999846 0.02584925 0 0.9996659 0.09024207 0 0.9959199 0.06431107 0 0.9979299 0.02584925 0 0.9996659 0.0259974 0 0.9996619 0.03404864 0 0.9994202 0.01518664 0 0.9998846 0.009231769 0 0.9999573 0.007427324 0 0.9999723 0.01518664 0 0.9998846 0.007684278 0 0.9999704 0.00515335 0 0.9999866 0.009231769 0 0.9999573 0.009231769 0 0.9999573 0.00515335 0 0.9999866 0.01754467 0 0.999846 0.02925651 0 0.9995719 0.007427324 0 0.9999723 0.009231769 0 0.9999573 0.02925651 0 0.9995719 0.02248242 0 0.9997472 0 0 0.9999999 0.004900399 0 0.9999878 0.006919148 0 0.9999759 0.001770907 0 0.9999985 0.004900399 0 0.9999878 0.0259974 0 0.9996619 0.02584925 0 0.9996659 0.006919148 0 0.9999759 0.006919148 0 0.9999759 0.02584925 0 0.9996659 0.01754467 0 0.999846 0.00515335 0 0.9999866 0.001770907 0 0.9999985 0.006919148 0 0.9999759 0.00515335 0 0.9999866 0.007684278 0 0.9999704 0.1101202 0 0.9939183 0.09732879 0 0.9952522 0.05518785 0 0.9984758 0.05062972 0 0.9987174 0.09732879 0 0.9952522 0.04118062 0 0.9991518 0.03096169 0 0.9995205 0.05518785 0 0.9984758 0.05518785 0 0.9984758 0.03096169 0 0.9995205 0.01521961 0 0.9998841 0.02807245 0 0.9996059 0.05062972 0 0.9987174 0.05518785 0 0.9984758 0.02807245 0 0.9996059 0.02535072 0 0.9996786 0 0 0.9999999 0 0 0.9999999 0.006601189 0 0.9999781 0.00951097 0 0.9999546 0 0 0.9999999 0 0 0.9999999 0.003630092 0 0.9999933 0.006601189 0 0.9999781 0.006601189 0 0.9999781 0.003630092 0 0.9999933 0.01521961 0 0.9998841 0.03096169 0 0.9995205 0.00951097 0 0.9999546 0.006601189 0 0.9999781 0.03096169 0 0.9995205 0.04118062 0 0.9991518 0 0 0.9999999 0.005603025 0 0.9999843 0.006415476 0 0.9999793 0 0 0.9999999 0.005603025 0 0.9999843 0.02535072 0 0.9996786 0.02807245 0 0.9996059 0.006415476 0 0.9999793 0.006415476 0 0.9999793 0.02807245 0 0.9996059 0.01521961 0 0.9998841 0.003630092 0 0.9999933 0 0 0.9999999 0.006415476 0 0.9999793 0.003630092 0 0.9999933 0 0 0.9999999 -0.06132749 0 0.9981177 -0.05263024 0 0.9986141 -0.02809802 0 0.9996051 -0.02468202 0 0.9996954 -0.05263024 0 0.9986141 -0.02207579 0 0.9997563 -0.01601496 0 0.9998717 -0.02809802 0 0.9996051 -0.02809802 0 0.9996051 -0.01601496 0 0.9998717 -0.0079144 0 0.9999686 -0.01274377 0 0.9999188 -0.02468202 0 0.9996954 -0.02809802 0 0.9996051 -0.01274377 0 0.9999188 -0.01229476 0 0.9999243 0 0 0.9999999 0 0 0.9999999 -0.003476502 0 0.9999938 -0.005125195 0 0.9999868 0 0 0.9999999 0 0 0.9999999 -0.00320437 0 0.9999947 -0.003476502 0 0.9999938 -0.003476502 0 0.9999938 -0.00320437 0 0.9999947 -0.0079144 0 0.9999686 -0.01601496 0 0.9998717 -0.005125195 0 0.9999868 -0.003476502 0 0.9999938 -0.01601496 0 0.9998717 -0.02207579 0 0.9997563 0 0 0.9999999 -0.002619098 0 0.9999966 -0.002432803 0 0.999997 0 0 0.9999999 -0.002619098 0 0.9999966 -0.01229476 0 0.9999243 -0.01274377 0 0.9999188 -0.002432803 0 0.999997 -0.002432803 0 0.999997 -0.01274377 0 0.9999188 -0.0079144 0 0.9999686 -0.00320437 0 0.9999947 0 0 0.9999999 -0.002432803 0 0.999997 -0.00320437 0 0.9999947 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.02715787 0 0.9996311 0.01461857 0 0.9998931 0.03660866 0 0.9993296 0.0696838 0 0.9975691 0.01461857 0 0.9998931 0.05410007 0 0.9985355 0.0684663 0 0.9976534 0.03660866 0 0.9993296 0.03660866 0 0.9993296 0.0684663 0 0.9976534 0.0390145 0 0.9992387 0.01819146 0 0.9998345 0.0696838 0 0.9975691 0.03660866 0 0.9993296 0.01819146 0 0.9998345 0.02492489 0 0.9996892 0.2702791 0 0.962782 0.1820696 0 0.9832855 0.1638832 0 0.9864797 0.1550067 0 0.9879134 0.1820696 0 0.9832855 0.05202673 0 0.9986457 0.05265174 0 0.9986128 0.1638832 0 0.9864797 0.1638832 0 0.9864797 0.05265174 0 0.9986128 0.0390145 0 0.9992387 0.0684663 0 0.9976534 0.1550067 0 0.9879134 0.1638832 0 0.9864797 0.0684663 0 0.9976534 0.05410007 0 0.9985355 0 0 0.9999999 0.004168725 0 0.9999912 0.01372652 0 0.9999058 0.009454342 0 0.9999553 0.004168725 0 0.9999912 0.02492489 0 0.9996892 0.01819146 0 0.9998345 0.01372652 0 0.9999058 0.01372652 0 0.9999058 0.01819146 0 0.9998345 0.0390145 0 0.9992387 0.05265174 0 0.9986128 0.009454342 0 0.9999553 0.01372652 0 0.9999058 0.05265174 0 0.9986128 0.05202673 0 0.9986457 -0.02829218 0 0.9995997 7.23013e-4 0 0.9999996 -0.01716057 0 0.9998527 -0.03362282 0 0.9994346 7.23013e-4 0 0.9999996 5.36654e-4 0 0.9999996 -0.005228527 0 0.9999863 -0.01716057 0 0.9998527 -0.01716057 0 0.9998527 -0.005228527 0 0.9999863 -0.00382016 0 0.9999926 -0.007352976 0 0.9999728 -0.03362282 0 0.9994346 -0.01716057 0 0.9998527 -0.007352976 0 0.9999728 -0.01185445 0 0.9999295 0 0 0.9999999 0 0 0.9999999 -0.001471263 0 0.9999988 5.49798e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 -1.58928e-4 0 0.9999998 -0.001471263 0 0.9999988 -0.001471263 0 0.9999988 -1.58928e-4 0 0.9999998 -0.00382016 0 0.9999926 -0.005228527 0 0.9999863 5.49798e-4 0 0.9999997 -0.001471263 0 0.9999988 -0.005228527 0 0.9999863 5.36654e-4 0 0.9999996 0 0 1 -0.002449128 0 0.999997 -0.001365493 0 0.9999989 0 0 0.9999999 -0.002449128 0 0.999997 -0.01185445 0 0.9999295 -0.007352976 0 0.9999728 -0.001365493 0 0.9999989 -0.001365493 0 0.9999989 -0.007352976 0 0.9999728 -0.00382016 0 0.9999926 -1.58928e-4 0 0.9999998 0 0 0.9999999 -0.001365493 0 0.9999989 -1.58928e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.226185 0 0.9740844 0.004832483 0 0.9999883 0.04030405 0 0.9991874 0.143379 0 0.9896679 0.004832483 0 0.9999883 0.005552977 0 0.9999845 0.01473076 0 0.9998913 0.04030405 0 0.9991874 0.04030405 0 0.9991874 0.01473076 0 0.9998913 0.005271368 0 0.9999861 0.01940672 0 0.9998117 0.143379 0 0.9896679 0.04030405 0 0.9991874 0.01940672 0 0.9998117 0.06172637 0 0.9980932 0 0 0.9999999 0 0 0.9999999 0.003964943 0 0.9999921 0.002378395 0 0.999997 0 0 0.9999999 0 0 0.9999999 -8.47985e-4 0 0.9999995 0.003964943 0 0.9999921 0.003964943 0 0.9999921 -8.47985e-4 0 0.9999995 0.005271368 0 0.9999861 0.01473076 0 0.9998913 0.002378395 0 0.999997 0.003964943 0 0.9999921 0.01473076 0 0.9998913 0.005552977 0 0.9999845 0 0 0.9999999 0.01082615 0 0.9999415 0.005171742 0 0.9999865 0 0 0.9999999 0.01082615 0 0.9999415 0.06172637 0 0.9980932 0.01940672 0 0.9998117 0.005171742 0 0.9999865 0.005171742 0 0.9999865 0.01940672 0 0.9998117 0.005271368 0 0.9999861 -8.47985e-4 0 0.9999995 0 0 0.9999999 0.005171742 0 0.9999865 -8.47985e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.03908723 0 0.9992358 0.02252954 0 0.9997463 0.03124303 0 0.9995118 0.01691968 0 0.9998568 0.02252954 0 0.9997463 0.1024786 0 0.9947352 0.1168748 0 0.9931467 0.03124303 0 0.9995118 0.03124303 0 0.9995118 0.1168748 0 0.9931467 0.08013946 0 0.9967837 0.02022542 0 0.9997955 0.01691968 0 0.9998568 0.03124303 0 0.9995118 0.02022542 0 0.9997955 0.005881784 0 0.9999826 0.4394023 0 0.8982903 0.3403908 0 0.9402841 0.2664806 0 0.9638403 0.266611 0 0.9638042 0.3403908 0 0.9402841 0.118857 0 0.9929114 0.09268197 0 0.9956958 0.2664806 0 0.9638403 0.2664806 0 0.9638403 0.09268197 0 0.9956958 0.08013946 0 0.9967837 0.1168748 0 0.9931467 0.266611 0 0.9638042 0.2664806 0 0.9638403 0.1168748 0 0.9931467 0.1024786 0 0.9947352 0 0 0.9999999 0.001028423 0 0.9999994 0.02349344 0 0.999724 0.0223938 0 0.9997493 0.001028423 0 0.9999994 0.005881784 0 0.9999826 0.02022542 0 0.9997955 0.02349344 0 0.999724 0.02349344 0 0.999724 0.02022542 0 0.9997955 0.08013946 0 0.9967837 0.09268197 0 0.9956958 0.0223938 0 0.9997493 0.02349344 0 0.999724 0.09268197 0 0.9956958 0.118857 0 0.9929114 0.226185 0 0.9740844 -0.0476486 0 0.9988642 -0.02633902 0 0.999653 0.004832483 0 0.9999883 -0.0476486 0 0.9988642 0.00148558 0 0.9999989 3.34988e-4 0 0.9999999 -0.02633902 0 0.999653 -0.02633902 0 0.999653 3.34988e-4 0 0.9999999 0.003942457 0 0.9999922 -0.01686227 0 0.9998577 0.004832483 0 0.9999883 -0.02633902 0 0.999653 -0.01686227 0 0.9998577 0.005552977 0 0.9999845 0.03908723 0 0.9992358 0.03590414 0 0.9993552 0.0243325 0 0.9997039 0.03505118 0 0.9993854 0.03590414 0 0.9993552 0.01873213 0 0.9998245 0.01194048 0 0.9999287 0.0243325 0 0.9997039 0.0243325 0 0.9997039 0.01194048 0 0.9999287 0.003942457 0 0.9999922 3.34988e-4 0 0.9999999 0.03505118 0 0.9993854 0.0243325 0 0.9997039 3.34988e-4 0 0.9999999 0.00148558 0 0.9999989 0 0 0.9999999 0.002378395 0 0.999997 -0.002378091 0 0.9999971 0.005385564 0 0.9999854 0.002378395 0 0.999997 0.005552977 0 0.9999845 -0.01686227 0 0.9998577 -0.002378091 0 0.9999971 -0.002378091 0 0.9999971 -0.01686227 0 0.9998577 0.003942457 0 0.9999922 0.01194048 0 0.9999287 0.005385564 0 0.9999854 -0.002378091 0 0.9999971 0.01194048 0 0.9999287 0.01873213 0 0.9998245 -0.02829218 0 0.9995997 6.52658e-4 0 0.9999997 -0.007824891 0 0.9999693 7.23013e-4 0 0.9999996 6.52658e-4 0 0.9999997 -0.0583345 0 0.998297 -0.04529991 0 0.9989734 -0.007824891 0 0.9999693 -0.007824891 0 0.9999693 -0.04529991 0 0.9989734 -0.01824543 0 0.9998335 -0.003418387 0 0.9999941 7.23013e-4 0 0.9999996 -0.007824891 0 0.9999693 -0.003418387 0 0.9999941 5.36654e-4 0 0.9999996 -0.01624622 0 0.9998679 -0.1400736 0 0.9901411 -0.09422903 0 0.9955505 -0.1567137 0 0.987644 -0.1400736 0 0.9901411 -0.06862319 0 0.9976426 -0.04476793 0 0.9989974 -0.09422903 0 0.9955505 -0.09422903 0 0.9955505 -0.04476793 0 0.9989974 -0.01824543 0 0.9998335 -0.04529991 0 0.9989734 -0.1567137 0 0.987644 -0.09422903 0 0.9955505 -0.04529991 0 0.9989734 -0.0583345 0 0.998297 0 0 0.9999999 5.49798e-4 0 0.9999997 -0.008641045 0 0.9999626 -0.01771826 0 0.9998429 5.49798e-4 0 0.9999997 5.36654e-4 0 0.9999996 -0.003418387 0 0.9999941 -0.008641045 0 0.9999626 -0.008641045 0 0.9999626 -0.003418387 0 0.9999941 -0.01824543 0 0.9998335 -0.04476793 0 0.9989974 -0.01771826 0 0.9998429 -0.008641045 0 0.9999626 -0.04476793 0 0.9989974 -0.06862319 0 0.9976426 0.1737721 0 0.9847859 0.1647899 0 0.9863286 0.1183713 0 0.9929693 0.0569475 0 0.9983771 0.1647899 0 0.9863286 0.06946055 0 0.9975848 0.06283982 0 0.9980236 0.1183713 0 0.9929693 0.1183713 0 0.9929693 0.06283982 0 0.9980236 0.03631408 0 0.9993404 0.04061988 0 0.9991746 0.0569475 0 0.9983771 0.1183713 0 0.9929693 0.04061988 0 0.9991746 0.02071619 0 0.9997854 0 0 0.9999999 0 0 0.9999999 0.01496414 0 0.999888 0.01644049 0 0.9998648 0 0 0.9999999 0 0 0.9999999 0.007800667 0 0.9999694 0.01496414 0 0.999888 0.01496414 0 0.999888 0.007800667 0 0.9999694 0.03631408 0 0.9993404 0.06283982 0 0.9980236 0.01644049 0 0.9998648 0.01496414 0 0.999888 0.06283982 0 0.9980236 0.06946055 0 0.9975848 0 0 0.9999999 0.004232885 0 0.9999909 0.009010695 0 0.9999593 0 0 0.9999999 0.004232885 0 0.9999909 0.02071619 0 0.9997854 0.04061988 0 0.9991746 0.009010695 0 0.9999593 0.009010695 0 0.9999593 0.04061988 0 0.9991746 0.03631408 0 0.9993404 0.007800667 0 0.9999694 0 0 0.9999999 0.009010695 0 0.9999593 0.007800667 0 0.9999694 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.01160175 0 0.9999326 -0.07100715 0 0.9974757 -0.02864254 0 0.9995896 -0.0279181 0 0.9996101 -0.07100715 0 0.9974757 0.002472344 0 0.9999968 0.01944888 0 0.9998109 -0.02864254 0 0.9995896 -0.02864254 0 0.9995896 0.01944888 0 0.9998109 0.01637555 0 0.9998659 -0.01223653 0 0.999925 -0.0279181 0 0.9996101 -0.02864254 0 0.9995896 -0.01223653 0 0.999925 -0.006491993 0 0.9999788 0.08577371 0 0.9963147 0.02692852 0 0.9996374 0.08140261 0 0.9966813 0.1081358 0 0.9941361 0.02692852 0 0.9996374 0.01284539 0 0.9999174 0.03247673 0 0.9994725 0.08140261 0 0.9966813 0.08140261 0 0.9966813 0.03247673 0 0.9994725 0.01637555 0 0.9998659 0.01944888 0 0.9998109 0.1081358 0 0.9941361 0.08140261 0 0.9966813 0.01944888 0 0.9998109 0.002472344 0 0.9999968 0 0 1 -0.001791804 0 0.9999983 0.005440229 0 0.9999852 0.001841426 0 0.9999983 -0.001791804 0 0.9999983 -0.006491993 0 0.9999788 -0.01223653 0 0.999925 0.005440229 0 0.9999852 0.005440229 0 0.9999852 -0.01223653 0 0.999925 0.01637555 0 0.9998659 0.03247673 0 0.9994725 0.001841426 0 0.9999983 0.005440229 0 0.9999852 0.03247673 0 0.9994725 0.01284539 0 0.9999174 0 0 0.9999999 0.01644049 0 0.9998648 0.01616828 0 0.9998692 0.002468505 0 0.9999967 0.01644049 0 0.9998648 0.06946055 0 0.9975848 0.05904617 0 0.9982552 0.01616828 0 0.9998692 0.01616828 0 0.9998692 0.05904617 0 0.9982552 0.0554409 0 0.998462 0.02754541 0 0.9996205 0.002468505 0 0.9999967 0.01616828 0 0.9998692 0.02754541 0 0.9996205 0.007021161 0 0.9999753 0.1737721 0 0.9847859 0.174385 0 0.9846776 0.1164185 0 0.9932002 0.1647899 0 0.9863286 0.174385 0 0.9846776 0.1014966 0 0.9948358 0.09060293 0 0.995887 0.1164185 0 0.9932002 0.1164185 0 0.9932002 0.09060293 0 0.995887 0.0554409 0 0.998462 0.05904617 0 0.9982552 0.1647899 0 0.9863286 0.1164185 0 0.9932002 0.05904617 0 0.9982552 0.06946055 0 0.9975848 -0.01883977 0 0.9998225 0.0317907 0 0.9994946 0.05274846 0 0.9986078 0.07414891 0 0.9972471 0.0317907 0 0.9994946 0.007021161 0 0.9999753 0.02754541 0 0.9996205 0.05274846 0 0.9986078 0.05274846 0 0.9986078 0.02754541 0 0.9996205 0.0554409 0 0.998462 0.09060293 0 0.995887 0.07414891 0 0.9972471 0.05274846 0 0.9986078 0.09060293 0 0.995887 0.1014966 0 0.9948358 -0.254628 0 0.967039 -0.1790708 0 0.9838362 -0.03780822 0 0.9992851 -0.1412445 0 0.9899747 -0.1790708 0 0.9838362 -0.01095122 0 0.99994 0.02468543 0 0.9996952 -0.03780822 0 0.9992851 -0.03780822 0 0.9992851 0.02468543 0 0.9996952 0.001526937 0 0.9999988 -0.03026288 0 0.9995419 -0.1412445 0 0.9899747 -0.03780822 0 0.9992851 -0.03026288 0 0.9995419 -0.03862027 0 0.9992539 0.1352684 0 0.9908089 0.09024207 0 0.9959199 0.07936166 0 0.9968459 0.07572991 0 0.9971284 0.09024207 0 0.9959199 0.0259974 0 0.9996619 0.02400321 0 0.9997119 0.07936166 0 0.9968459 0.07936166 0 0.9968459 0.02400321 0 0.9997119 0.001526937 0 0.9999988 0.02468543 0 0.9996952 0.07572991 0 0.9971284 0.07936166 0 0.9968459 0.02468543 0 0.9996952 -0.01095122 0 0.99994 0 0 0.9999999 -0.007210869 0 0.9999738 -0.001791019 0 0.9999983 0.004900399 0 0.9999878 -0.007210869 0 0.9999738 -0.03862027 0 0.9992539 -0.03026288 0 0.9995419 -0.001791019 0 0.9999983 -0.001791019 0 0.9999983 -0.03026288 0 0.9995419 0.001526937 0 0.9999988 0.02400321 0 0.9997119 0.004900399 0 0.9999878 -0.001791019 0 0.9999983 0.02400321 0 0.9997119 0.0259974 0 0.9996619 0 0 0.9999999 0 0 0.9999999 -0.01058058 0 0.9999439 -0.007210869 0 0.9999738 0 0 0.9999999 0 0 0.9999999 -0.006386513 0 0.9999794 -0.01058058 0 0.9999439 -0.01058058 0 0.9999439 -0.006386513 0 0.9999794 -0.03155454 0 0.999502 -0.04322232 0 0.9990655 -0.007210869 0 0.9999738 -0.01058058 0 0.9999439 -0.04322232 0 0.9990655 -0.03862027 0 0.9992539 0 0 0.9999999 -0.00870376 0 0.999962 -0.01500465 0 0.9998874 0 0 0.9999999 -0.00870376 0 0.999962 -0.04306044 0 0.9990724 -0.05415211 0 0.9985327 -0.01500465 0 0.9998874 -0.01500465 0 0.9998874 -0.05415211 0 0.9985327 -0.03155454 0 0.999502 -0.006386513 0 0.9999794 0 0 0.9999999 -0.01500465 0 0.9998874 -0.006386513 0 0.9999794 0 0 0.9999999 -0.254628 0 0.967039 -0.1412445 0 0.9899747 -0.108515 0 0.9940948 -0.09799606 0 0.9951867 -0.1412445 0 0.9899747 -0.03862027 0 0.9992539 -0.04322232 0 0.9990655 -0.108515 0 0.9940948 -0.108515 0 0.9940948 -0.04322232 0 0.9990655 -0.03155454 0 0.999502 -0.05415211 0 0.9985327 -0.09799606 0 0.9951867 -0.108515 0 0.9940948 -0.05415211 0 0.9985327 -0.04306044 0 0.9990724 0 0 0.9999999 0.0130777 0 0.9999145 0.01504914 0 0.9998867 -4.10736e-4 0 0.9999998 0.0130777 0 0.9999145 0.07086123 0 0.9974862 0.06126711 0 0.9981213 0.01504914 0 0.9998867 0.01504914 0 0.9998867 0.06126711 0 0.9981213 0.048237 0 0.9988359 0.01468083 0 0.9998922 -4.10736e-4 0 0.9999998 0.01504914 0 0.9998867 0.01468083 0 0.9998922 -8.97982e-4 0 0.9999995 0.3359013 0 0.9418971 0.1239396 0 0.9922897 0.1483771 0 0.9889307 0.2222058 0 0.9749998 0.1239396 0 0.9922897 0.05830511 0 0.9982988 0.06381287 0 0.9979619 0.1483771 0 0.9889307 0.1483771 0 0.9889307 0.06381287 0 0.9979619 0.048237 0 0.9988359 0.06126711 0 0.9981213 0.2222058 0 0.9749998 0.1483771 0 0.9889307 0.06126711 0 0.9981213 0.07086123 0 0.9974862 -0.006024944 0 0.9999818 -1.29797e-4 0 0.9999999 0.024004 0 0.9997119 0.01858355 0 0.9998272 -1.29797e-4 0 0.9999999 -8.97982e-4 0 0.9999995 0.01468083 0 0.9998922 0.024004 0 0.9997119 0.024004 0 0.9997119 0.01468083 0 0.9998922 0.048237 0 0.9988359 0.06381287 0 0.9979619 0.01858355 0 0.9998272 0.024004 0 0.9997119 0.06381287 0 0.9979619 0.05830511 0 0.9982988 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -7.75746e-4 0 0.9999997 -8.21801e-4 0 0.9999996 0 0 0.9999999 0 0 0.9999999 -7.90212e-4 0 0.9999996 -7.75746e-4 0 0.9999997 -7.75746e-4 0 0.9999997 -7.90212e-4 0 0.9999996 -0.002376741 0 0.9999972 -0.003521449 0 0.9999937 -8.21801e-4 0 0.9999996 -7.75746e-4 0 0.9999997 -0.003521449 0 0.9999937 -0.003781973 0 0.9999927 0 0 0.9999999 -0.001284362 0 0.9999991 -0.001107414 0 0.9999992 0 0 0.9999999 -0.001284362 0 0.9999991 -0.00468209 0 0.9999888 -0.004324153 0 0.9999905 -0.001107414 0 0.9999992 -0.001107414 0 0.9999992 -0.004324153 0 0.9999905 -0.002376741 0 0.9999972 -7.90212e-4 0 0.9999996 0 0 0.9999999 -0.001107414 0 0.9999992 -7.90212e-4 0 0.9999996 0 0 0.9999999 -0.006024944 0 0.9999818 -0.009223325 0 0.9999573 -0.007026307 0 0.9999751 -0.009242021 0 0.9999572 -0.009223325 0 0.9999573 -0.003781973 0 0.9999927 -0.003521449 0 0.9999937 -0.007026307 0 0.9999751 -0.007026307 0 0.9999751 -0.003521449 0 0.9999937 -0.002376741 0 0.9999972 -0.004324153 0 0.9999905 -0.009242021 0 0.9999572 -0.007026307 0 0.9999751 -0.004324153 0 0.9999905 -0.00468209 0 0.9999888 -0.006024944 0 0.9999818 -0.009242021 0 0.9999572 -0.004555798 0 0.9999896 -1.29797e-4 0 0.9999999 -0.009242021 0 0.9999572 -0.00468209 0 0.9999888 -0.002868707 0 0.9999958 -0.004555798 0 0.9999896 -0.004555798 0 0.9999896 -0.002868707 0 0.9999958 -0.00126359 0 0.9999992 -0.002559158 0 0.9999966 -1.29797e-4 0 0.9999999 -0.004555798 0 0.9999896 -0.002559158 0 0.9999966 -8.97982e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 -6.92175e-4 0 0.9999996 -0.001284362 0 0.9999991 0 0 0.9999999 0 0 0.9999999 -1.30957e-4 0 0.9999999 -6.92175e-4 0 0.9999996 -6.92175e-4 0 0.9999996 -1.30957e-4 0 0.9999999 -0.00126359 0 0.9999992 -0.002868707 0 0.9999958 -0.001284362 0 0.9999991 -6.92175e-4 0 0.9999996 -0.002868707 0 0.9999958 -0.00468209 0 0.9999888 0 0 0.9999999 -4.10736e-4 0 0.9999998 -6.35303e-4 0 0.9999996 0 0 0.9999999 -4.10736e-4 0 0.9999998 -8.97982e-4 0 0.9999995 -0.002559158 0 0.9999966 -6.35303e-4 0 0.9999996 -6.35303e-4 0 0.9999996 -0.002559158 0 0.9999966 -0.00126359 0 0.9999992 -1.30957e-4 0 0.9999999 0 0 0.9999999 -6.35303e-4 0 0.9999996 -1.30957e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.001186864 0 0.9999992 0.002308159 0 0.9999973 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0.001186864 0 0.9999992 0.001186864 0 0.9999992 0 0 0.9999998 0.003542509 0 0.9999936 0.006888631 0 0.999976 0.002308159 0 0.9999973 0.001186864 0 0.9999992 0.006888631 0 0.999976 0.01148487 0 0.9999339 0 0 0.9999999 -5.11692e-4 0 0.9999998 0.001425348 0 0.9999988 0 0 0.9999999 -5.11692e-4 0 0.9999998 -5.3519e-4 0 0.9999997 0.005187594 0 0.9999865 0.001425348 0 0.9999988 0.001425348 0 0.9999988 0.005187594 0 0.9999865 0.003542509 0 0.9999936 0 0 0.9999998 0 0 0.9999999 0.001425348 0 0.9999988 0 0 0.9999998 0 0 0.9999999 0.02828729 0 0.9995998 0.03334555 0 0.9994438 0.01696736 0 0.9998561 -7.39891e-4 0 0.9999996 0.03334555 0 0.9994438 0.01148487 0 0.9999339 0.006888631 0 0.999976 0.01696736 0 0.9998561 0.01696736 0 0.9998561 0.006888631 0 0.999976 0.003542509 0 0.9999936 0.005187594 0 0.9999865 -7.39891e-4 0 0.9999996 0.01696736 0 0.9998561 0.005187594 0 0.9999865 -5.3519e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.006021916 0 0.9999818 -0.01134132 0 0.9999357 0 0 0.9999999 0 0 0.9999999 -4.00575e-4 0 0.9999998 -0.006021916 0 0.9999818 -0.006021916 0 0.9999818 -4.00575e-4 0 0.9999998 -0.006639176 0 0.9999779 -0.02140445 0 0.9997709 -0.01134132 0 0.9999357 -0.006021916 0 0.9999818 -0.02140445 0 0.9997709 -0.06181927 0 0.9980873 0 0 0.9999999 -0.002349805 0 0.9999971 -0.003874465 0 0.9999923 0 0 0.9999999 -0.002349805 0 0.9999971 -0.005389479 0 0.9999855 -0.01590552 0 0.9998735 -0.003874465 0 0.9999923 -0.003874465 0 0.9999923 -0.01590552 0 0.9998735 -0.006639176 0 0.9999779 -4.00575e-4 0 0.9999998 0 0 0.9999999 -0.003874465 0 0.9999923 -4.00575e-4 0 0.9999998 0 0 0.9999999 -0.2261525 0 0.9740919 -0.1430347 0 0.9897178 -0.04141565 0 0.9991419 -0.004728409 0 0.9999887 -0.1430347 0 0.9897178 -0.06181927 0 0.9980873 -0.02140445 0 0.9997709 -0.04141565 0 0.9991419 -0.04141565 0 0.9991419 -0.02140445 0 0.9997709 -0.006639176 0 0.9999779 -0.01590552 0 0.9998735 -0.004728409 0 0.9999887 -0.04141565 0 0.9991419 -0.01590552 0 0.9998735 -0.005389479 0 0.9999855 -0.2261525 0 0.9740919 -0.3969273 0 0.91785 -0.2798918 0 0.9600315 -0.1430347 0 0.9897178 -0.3969273 0 0.91785 -0.3648961 0 0.9310483 -0.2620487 0 0.9650546 -0.2798918 0 0.9600315 -0.2798918 0 0.9600315 -0.2620487 0 0.9650546 -0.1468944 0 0.9891521 -0.1081281 0 0.994137 -0.1430347 0 0.9897178 -0.2798918 0 0.9600315 -0.1081281 0 0.994137 -0.06181927 0 0.9980873 0.01630293 0 0.9998671 0.03697535 0 0.999316 -0.1525451 0 0.9882965 -0.2876214 0 0.9577442 0.03697535 0 0.999316 0.01326744 0 0.9999119 -0.05604259 0 0.9984284 -0.1525451 0 0.9882965 -0.1525451 0 0.9882965 -0.05604259 0 0.9984284 -0.1468944 0 0.9891521 -0.2620487 0 0.9650546 -0.2876214 0 0.9577442 -0.1525451 0 0.9882965 -0.2620487 0 0.9650546 -0.3648961 0 0.9310483 0 0 0.9999999 -0.01134132 0 0.9999357 -0.03046868 0 0.9995357 0.005040619 0 0.9999871 -0.01134132 0 0.9999357 -0.06181927 0 0.9980873 -0.1081281 0 0.994137 -0.03046868 0 0.9995357 -0.03046868 0 0.9995357 -0.1081281 0 0.994137 -0.1468944 0 0.9891521 -0.05604259 0 0.9984284 0.005040619 0 0.9999871 -0.03046868 0 0.9995357 -0.05604259 0 0.9984284 0.01326744 0 0.9999119 0 0 0.9999999 -0.01877853 0 0.9998236 -0.03011357 0 0.9995465 -8.6946e-4 0 0.9999996 -0.01877853 0 0.9998236 -0.1002326 0 0.994964 -0.1260096 0 0.9920291 -0.03011357 0 0.9995465 -0.03011357 0 0.9995465 -0.1260096 0 0.9920291 -0.08173254 0 0.9966543 -0.02033423 0 0.9997932 -8.6946e-4 0 0.9999996 -0.03011357 0 0.9995465 -0.02033423 0 0.9997932 -0.005515532 0 0.9999846 -0.4394111 0 0.898286 -0.2666114 0 0.9638041 -0.2787544 0 0.9603624 -0.3110168 0 0.9504044 -0.2666114 0 0.9638041 -0.1024004 0 0.9947433 -0.1172791 0 0.993099 -0.2787544 0 0.9603624 -0.2787544 0 0.9603624 -0.1172791 0 0.993099 -0.08173254 0 0.9966543 -0.1260096 0 0.9920291 -0.3110168 0 0.9504044 -0.2787544 0 0.9603624 -0.1260096 0 0.9920291 -0.1002326 0 0.994964 -0.03912016 0 0.9992346 -0.01674236 0 0.9998599 -0.03121649 0 0.9995126 -0.02253644 0 0.999746 -0.01674236 0 0.9998599 -0.005515532 0 0.9999846 -0.02033423 0 0.9997932 -0.03121649 0 0.9995126 -0.03121649 0 0.9995126 -0.02033423 0 0.9997932 -0.08173254 0 0.9966543 -0.1172791 0 0.993099 -0.02253644 0 0.999746 -0.03121649 0 0.9995126 -0.1172791 0 0.993099 -0.1024004 0 0.9947433 0 0 0.9999999 0 0 0.9999999 0.001812571 0 0.9999982 -0.002476185 0 0.9999968 0 0 0.9999999 0 0 0.9999999 0.001557294 0 0.9999987 0.001812571 0 0.9999982 0.001812571 0 0.9999982 0.001557294 0 0.9999987 -1.21542e-4 0 0.9999999 0.002595719 0 0.9999965 -0.002476185 0 0.9999968 0.001812571 0 0.9999982 0.002595719 0 0.9999965 -0.00740652 0 0.9999725 0 0 0.9999999 -9.2707e-4 0 0.9999994 -0.001462822 0 0.9999987 0 0 0.9999999 -9.2707e-4 0 0.9999994 0.003891197 0 0.9999923 -0.001706324 0 0.9999985 -0.001462822 0 0.9999987 -0.001462822 0 0.9999987 -0.001706324 0 0.9999985 -1.21542e-4 0 0.9999999 0.001557294 0 0.9999987 0 0 0.9999999 -0.001462822 0 0.9999987 0.001557294 0 0.9999987 0 0 0.9999999 0.01885335 0 0.9998221 -0.03208454 0 0.9994851 -0.001820551 0 0.9999983 0.0176233 0 0.9998447 -0.03208454 0 0.9994851 -0.00740652 0 0.9999725 0.002595719 0 0.9999965 -0.001820551 0 0.9999983 -0.001820551 0 0.9999983 0.002595719 0 0.9999965 -1.21542e-4 0 0.9999999 -0.001706324 0 0.9999985 0.0176233 0 0.9998447 -0.001820551 0 0.9999983 -0.001706324 0 0.9999985 0.003891197 0 0.9999923 0 0 0.9999999 -0.001722294 0 0.9999985 -0.005286734 0 0.9999859 0.00176268 0 0.9999983 -0.001722294 0 0.9999985 -0.01252065 0 0.9999216 -0.03218311 0 0.9994819 -0.005286734 0 0.9999859 -0.005286734 0 0.9999859 -0.03218311 0 0.9994819 -0.01633145 0 0.9998666 0.01215887 0 0.9999259 0.00176268 0 0.9999983 -0.005286734 0 0.9999859 0.01215887 0 0.9999259 0.006393277 0 0.9999794 -0.08577254 0 0.9963146 -0.1081344 0 0.9941363 -0.08129621 0 0.9966899 -0.02676813 0 0.9996417 -0.1081344 0 0.9941363 -0.002457688 0 0.999997 -0.01946907 0 0.9998104 -0.08129621 0 0.9966899 -0.08129621 0 0.9966899 -0.01946907 0 0.9998104 -0.01633145 0 0.9998666 -0.03218311 0 0.9994819 -0.02676813 0 0.9996417 -0.08129621 0 0.9966899 -0.03218311 0 0.9994819 -0.01252065 0 0.9999216 0.01158967 0 0.9999326 0.0278497 0 0.999612 0.02865808 0 0.9995892 0.07100523 0 0.9974759 0.0278497 0 0.999612 0.006393277 0 0.9999794 0.01215887 0 0.9999259 0.02865808 0 0.9995892 0.02865808 0 0.9995892 0.01215887 0 0.9999259 -0.01633145 0 0.9998666 -0.01946907 0 0.9998104 0.07100523 0 0.9974759 0.02865808 0 0.9995892 -0.01946907 0 0.9998104 -0.002457688 0 0.999997 0.01158967 0 0.9999326 -0.0400889 0 0.9991961 -0.02405773 0 0.9997106 0.0278497 0 0.999612 -0.0400889 0 0.9991961 0.03124885 0 0.9995117 0.0140957 0 0.9999006 -0.02405773 0 0.9997106 -0.02405773 0 0.9997106 0.0140957 0 0.9999006 0.003643503 0 0.9999934 -0.004425245 0 0.9999901 0.0278497 0 0.999612 -0.02405773 0 0.9997106 -0.004425245 0 0.9999901 0.006393277 0 0.9999794 0.01885335 0 0.9998221 0.05529651 0 0.99847 0.0502535 0 0.9987363 0.09306638 0 0.9956599 0.05529651 0 0.99847 0.02399765 0 0.999712 0.02154123 0 0.9997679 0.0502535 0 0.9987363 0.0502535 0 0.9987363 0.02154123 0 0.9997679 0.003643503 0 0.9999934 0.0140957 0 0.9999006 0.09306638 0 0.9956599 0.0502535 0 0.9987363 0.0140957 0 0.9999006 0.03124885 0 0.9995117 0 0 0.9999999 0.00176268 0 0.9999983 0.00226407 0 0.9999974 0.005330923 0 0.9999858 0.00176268 0 0.9999983 0.006393277 0 0.9999794 -0.004425245 0 0.9999901 0.00226407 0 0.9999974 0.00226407 0 0.9999974 -0.004425245 0 0.9999901 0.003643503 0 0.9999934 0.02154123 0 0.9997679 0.005330923 0 0.9999858 0.00226407 0 0.9999974 0.02154123 0 0.9997679 0.02399765 0 0.999712 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.01282408 0 0.9999176 -0.005177594 0 0.9999865 0 0 0.9999999 0 0 0.9999999 -0.008251144 0 0.9999658 -0.01282408 0 0.9999176 -0.01282408 0 0.9999176 -0.008251144 0 0.9999658 -0.03847696 0 0.9992595 -0.04992381 0 0.9987531 -0.005177594 0 0.9999865 -0.01282408 0 0.9999176 -0.04992381 0 0.9987531 -0.02319377 0 0.999731 0 0 0.9999999 -0.01837931 0 0.999831 -0.01572074 0 0.9998764 0 0 0.9999999 -0.01837931 0 0.999831 -0.07463499 0 0.9972109 -0.05915779 0 0.9982486 -0.01572074 0 0.9998764 -0.01572074 0 0.9998764 -0.05915779 0 0.9982486 -0.03847696 0 0.9992595 -0.008251144 0 0.9999658 0 0 0.9999999 -0.01572074 0 0.9998764 -0.008251144 0 0.9999658 0 0 0.9999999 -0.1737191 0 0.9847953 -0.05839752 0 0.9982933 -0.1227319 0 0.9924399 -0.1681351 0 0.9857639 -0.05839752 0 0.9982933 -0.02319377 0 0.999731 -0.04992381 0 0.9987531 -0.1227319 0 0.9924399 -0.1227319 0 0.9924399 -0.04992381 0 0.9987531 -0.03847696 0 0.9992595 -0.05915779 0 0.9982486 -0.1681351 0 0.9857639 -0.1227319 0 0.9924399 -0.05915779 0 0.9982486 -0.07463499 0 0.9972109 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.7550594 0 0.6556565 0.06835908 0 0.9976608 0.03476287 0 0.9993955 0.3411446 0 0.9400107 0.06835908 0 0.9976608 -0.1028965 0 0.994692 -0.1065937 0 0.9943026 0.03476287 0 0.9993955 0.03476287 0 0.9993955 -0.1065937 0 0.9943026 -0.07181128 0 0.9974183 0.01616747 0 0.9998692 0.3411446 0 0.9400107 0.03476287 0 0.9993955 0.01616747 0 0.9998692 0.1240269 0 0.9922788 -0.4394111 0 0.898286 -0.3110168 0 0.9504044 -0.2392785 0 0.970951 -0.2055218 0 0.9786525 -0.3110168 0 0.9504044 -0.1002326 0 0.994964 -0.1161601 0 0.9932305 -0.2392785 0 0.970951 -0.2392785 0 0.970951 -0.1161601 0 0.9932305 -0.07181128 0 0.9974183 -0.1065937 0 0.9943026 -0.2055218 0 0.9786525 -0.2392785 0 0.970951 -0.1065937 0 0.9943026 -0.1028965 0 0.994692 0 0 0.9999999 0.01904768 0 0.9998185 -0.02260747 0 0.9997444 -0.01877853 0 0.9998236 0.01904768 0 0.9998185 0.1240269 0 0.9922788 0.01616747 0 0.9998692 -0.02260747 0 0.9997444 -0.02260747 0 0.9997444 0.01616747 0 0.9998692 -0.07181128 0 0.9974183 -0.1161601 0 0.9932305 -0.01877853 0 0.9998236 -0.02260747 0 0.9997444 -0.1161601 0 0.9932305 -0.1002326 0 0.994964 0 0 0.9999999 -0.01238314 0 0.9999233 -0.01297878 0 0.9999157 -0.004026076 0 0.9999917 -0.01238314 0 0.9999233 -0.05529641 0 0.9984699 -0.04768499 0 0.9988624 -0.01297878 0 0.9999157 -0.01297878 0 0.9999157 -0.04768499 0 0.9988624 -0.03595468 0 0.9993533 -0.01776228 0 0.9998422 -0.004026076 0 0.9999917 -0.01297878 0 0.9999157 -0.01776228 0 0.9998422 -0.02432029 0 0.9997042 -0.1754599 0 0.9844865 -0.1327287 0 0.9911525 -0.1330269 0 0.9911124 -0.1388723 0 0.9903103 -0.1327287 0 0.9911525 -0.05209723 0 0.998642 -0.06215586 0 0.9980665 -0.1330269 0 0.9911124 -0.1330269 0 0.9911124 -0.06215586 0 0.9980665 -0.03595468 0 0.9993533 -0.04768499 0 0.9988624 -0.1388723 0 0.9903103 -0.1330269 0 0.9911124 -0.04768499 0 0.9988624 -0.05529641 0 0.9984699 0.02713668 0 0.9996318 -0.0691762 0 0.9976044 -0.03589234 0 0.9993557 -0.01463085 0 0.9998929 -0.0691762 0 0.9976044 -0.02432029 0 0.9997042 -0.01776228 0 0.9998422 -0.03589234 0 0.9993557 -0.03589234 0 0.9993557 -0.01776228 0 0.9998422 -0.03595468 0 0.9993533 -0.06215586 0 0.9980665 -0.01463085 0 0.9998929 -0.03589234 0 0.9993557 -0.06215586 0 0.9980665 -0.05209723 0 0.998642 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0.02713668 0 0.9996318 0.02121163 0 0.999775 -0.04301087 0 0.9990745 -0.0691762 0 0.9976044 0.02121163 0 0.999775 -0.01722264 0 0.9998518 -0.02327252 0 0.9997292 -0.04301087 0 0.9990745 -0.04301087 0 0.9990745 -0.02327252 0 0.9997292 -0.02579471 0 0.9996672 -0.02381928 0 0.9997163 -0.0691762 0 0.9976044 -0.04301087 0 0.9990745 -0.02381928 0 0.9997163 -0.02432029 0 0.9997042 0 0 0.9999999 0 0 0.9999999 -0.007573397 0 0.9999712 -0.002302737 0 0.9999972 0 0 0.9999999 0 0 0.9999999 -0.007962156 0 0.9999682 -0.007573397 0 0.9999712 -0.007573397 0 0.9999712 -0.007962156 0 0.9999682 -0.02579471 0 0.9996672 -0.02327252 0 0.9997292 -0.002302737 0 0.9999972 -0.007573397 0 0.9999712 -0.02327252 0 0.9997292 -0.01722264 0 0.9998518 0 0 0.9999999 -0.004026076 0 0.9999917 -0.006861055 0 0.9999763 0 0 0.9999999 -0.004026076 0 0.9999917 -0.02432029 0 0.9997042 -0.02381928 0 0.9997163 -0.006861055 0 0.9999763 -0.006861055 0 0.9999763 -0.02381928 0 0.9997163 -0.02579471 0 0.9996672 -0.007962156 0 0.9999682 0 0 0.9999999 -0.006861055 0 0.9999763 -0.007962156 0 0.9999682 0 0 0.9999999 0 0 0.9999999 -0.002302737 0 0.9999972 0.0347153 0 0.9993972 0.01904768 0 0.9998185 -0.002302737 0 0.9999972 -0.01722264 0 0.9998518 0.03395005 0 0.9994234 0.0347153 0 0.9993972 0.0347153 0 0.9993972 0.03395005 0 0.9994234 0.1792201 0 0.983809 0.1936058 0 0.9810793 0.01904768 0 0.9998185 0.0347153 0 0.9993972 0.1936058 0 0.9810793 0.1240269 0 0.9922788 0.02713668 0 0.9996318 0.3473159 0 0.9377481 0.1906415 0 0.9816597 0.02121163 0 0.999775 0.3473159 0 0.9377481 0.6193281 0 0.7851322 0.4706091 0 0.8823418 0.1906415 0 0.9816597 0.1906415 0 0.9816597 0.4706091 0 0.8823418 0.1792201 0 0.983809 0.03395005 0 0.9994234 0.02121163 0 0.999775 0.1906415 0 0.9816597 0.03395005 0 0.9994234 -0.01722264 0 0.9998518 0.7550594 0 0.6556565 0.3411446 0 0.9400107 0.6164441 0 0.7873987 0.8647105 0 0.5022706 0.3411446 0 0.9400107 0.1240269 0 0.9922788 0.1936058 0 0.9810793 0.6164441 0 0.7873987 0.6164441 0 0.7873987 0.1936058 0 0.9810793 0.1792201 0 0.983809 0.4706091 0 0.8823418 0.8647105 0 0.5022706 0.6164441 0 0.7873987 0.4706091 0 0.8823418 0.6193281 0 0.7851322 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.005293087 0 0.9999858 -0.007528889 0 0.9999716 -0.007615969 0 0.999971 -0.005293087 0 0.9999858 -0.0224443 0 0.9997481 -0.01777758 0 0.9998419 -0.007528889 0 0.9999716 -0.007528889 0 0.9999716 -0.01777758 0 0.9998419 -0.01355274 0 0.9999082 -0.008589496 0 0.9999632 -0.007615969 0 0.999971 -0.007528889 0 0.9999716 -0.008589496 0 0.9999632 -0.03304328 0 0.9994538 -0.06067236 0 0.9981577 -0.04340853 0 0.9990573 -0.04566287 0 0.9989569 -0.05259047 0 0.9986161 -0.04340853 0 0.9990573 -0.01637038 0 0.9998659 -0.02004711 0 0.9997989 -0.04566287 0 0.9989569 -0.04566287 0 0.9989569 -0.02004711 0 0.9997989 -0.01355274 0 0.9999082 -0.01777758 0 0.9998419 -0.05259047 0 0.9986161 -0.04566287 0 0.9989569 -0.01777758 0 0.9998419 -0.0224443 0 0.9997481 -0.1754599 0 0.9844865 -0.06134399 0 0.9981167 -0.009295042 0 0.9999568 -0.01209109 0 0.9999267 -0.06134399 0 0.9981167 -0.03304328 0 0.9994538 -0.008589496 0 0.9999632 -0.009295042 0 0.9999568 -0.009295042 0 0.9999568 -0.008589496 0 0.9999632 -0.01355274 0 0.9999082 -0.02004711 0 0.9997989 -0.01209109 0 0.9999267 -0.009295042 0 0.9999568 -0.02004711 0 0.9997989 -0.01637038 0 0.9998659 0 0 0.9999999 0.00951097 0 0.9999546 0.007798405 0 0.9999694 -0.00197244 0 0.9999979 0.00951097 0 0.9999546 0.04118062 0 0.9991518 0.03635703 0 0.9993389 0.007798405 0 0.9999694 0.007798405 0 0.9999694 0.03635703 0 0.9993389 0.02973564 0 0.9995577 0.007589316 0 0.999971 -0.00197244 0 0.9999979 0.007798405 0 0.9999694 0.007589316 0 0.999971 -0.01081198 0 0.9999416 0.1101202 0 0.9939183 0.07587612 0 0.9971172 0.08002693 0 0.9967927 0.09732879 0 0.9952522 0.07587612 0 0.9971172 0.03799581 0 0.9992778 0.03979686 0 0.9992078 0.08002693 0 0.9967927 0.08002693 0 0.9967927 0.03979686 0 0.9992078 0.02973564 0 0.9995577 0.03635703 0 0.9993389 0.09732879 0 0.9952522 0.08002693 0 0.9967927 0.03635703 0 0.9993389 0.04118062 0 0.9991518 -0.06067236 0 0.9981577 -0.02749278 0 0.999622 0.00750587 0 0.9999717 0.003820407 0 0.9999927 -0.02749278 0 0.999622 -0.01081198 0 0.9999416 0.007589316 0 0.999971 0.00750587 0 0.9999717 0.00750587 0 0.9999717 0.007589316 0 0.999971 0.02973564 0 0.9995577 0.03979686 0 0.9992078 0.003820407 0 0.9999927 0.00750587 0 0.9999717 0.03979686 0 0.9992078 0.03799581 0 0.9992778 -0.08657958 0 0.9962449 -0.07094157 0 0.9974805 -0.03786304 0 0.9992828 -0.03176843 0 0.9994951 -0.07094157 0 0.9974805 -0.02965709 0 0.9995601 -0.02331126 0 0.9997281 -0.03786304 0 0.9992828 -0.03786304 0 0.9992828 -0.02331126 0 0.9997281 -0.01267324 0 0.9999196 -0.02089266 0 0.9997815 -0.03176843 0 0.9994951 -0.03786304 0 0.9992828 -0.02089266 0 0.9997815 -0.01725478 0 0.999851 0 0 0.9999999 0 0 0.9999999 -0.00551633 0 0.9999847 -0.007181107 0 0.999974 0 0 0.9999999 0 0 0.9999999 -0.003102591 0 0.9999951 -0.00551633 0 0.9999847 -0.00551633 0 0.9999847 -0.003102591 0 0.9999951 -0.01267324 0 0.9999196 -0.02331126 0 0.9997281 -0.007181107 0 0.999974 -0.00551633 0 0.9999847 -0.02331126 0 0.9997281 -0.02965709 0 0.9995601 0 0 0.9999999 -0.004211805 0 0.9999911 -0.005378994 0 0.9999853 0 0 0.9999999 -0.004211805 0 0.9999911 -0.01725478 0 0.999851 -0.02089266 0 0.9997815 -0.005378994 0 0.9999853 -0.005378994 0 0.9999853 -0.02089266 0 0.9997815 -0.01267324 0 0.9999196 -0.003102591 0 0.9999951 0 0 0.9999999 -0.005378994 0 0.9999853 -0.003102591 0 0.9999951 0 0 0.9999999 0.03404864 0 0.9994202 0.03060854 0 0.9995314 0.01771241 0 0.999843 0.01518664 0 0.9998846 0.03060854 0 0.9995314 0.01406413 0 0.999901 0.01104797 0 0.9999388 0.01771241 0 0.999843 0.01771241 0 0.999843 0.01104797 0 0.9999388 0.005963255 0 0.9999821 0.009698105 0 0.9999528 0.01518664 0 0.9998846 0.01771241 0 0.999843 0.009698105 0 0.9999528 0.007684278 0 0.9999704 0 0 0.9999999 0 0 0.9999999 0.002675001 0 0.9999963 0.003680642 0 0.9999931 0 0 0.9999999 0 0 0.9999999 0.001474011 0 0.9999989 0.002675001 0 0.9999963 0.002675001 0 0.9999963 0.001474011 0 0.9999989 0.005963255 0 0.9999821 0.01104797 0 0.9999388 0.003680642 0 0.9999931 0.002675001 0 0.9999963 0.01104797 0 0.9999388 0.01406413 0 0.999901 0 0 0.9999999 0.001770907 0 0.9999985 0.002469953 0 0.9999968 0 0 0.9999999 0.001770907 0 0.9999985 0.007684278 0 0.9999704 0.009698105 0 0.9999528 0.002469953 0 0.9999968 0.002469953 0 0.9999968 0.009698105 0 0.9999528 0.005963255 0 0.9999821 0.001474011 0 0.9999989 0 0 0.9999999 0.002469953 0 0.9999968 0.001474011 0 0.9999989 0 0 0.9999999 0 0 0.9999999 -0.005125195 0 0.9999868 -0.003305779 0 0.9999945 0.005603025 0 0.9999843 -0.005125195 0 0.9999868 -0.02207579 0 0.9997563 -0.02137971 0 0.9997714 -0.003305779 0 0.9999945 -0.003305779 0 0.9999945 -0.02137971 0 0.9997714 -0.01775949 0 0.9998422 -9.91459e-4 0 0.9999994 0.005603025 0 0.9999843 -0.003305779 0 0.9999945 -9.91459e-4 0 0.9999994 0.02535072 0 0.9996786 -0.06132749 0 0.9981177 -0.04418546 0 0.9990233 -0.04665677 0 0.9989109 -0.05263024 0 0.9986141 -0.04418546 0 0.9990233 -0.02149955 0 0.9997688 -0.0224782 0 0.9997473 -0.04665677 0 0.9989109 -0.04665677 0 0.9989109 -0.0224782 0 0.9997473 -0.01775949 0 0.9998422 -0.02137971 0 0.9997714 -0.05263024 0 0.9986141 -0.04665677 0 0.9989109 -0.02137971 0 0.9997714 -0.02207579 0 0.9997563 0.1101202 0 0.9939183 0.05062972 0 0.9987174 -0.003970676 0 0.9999921 0.006401322 0 0.9999794 0.05062972 0 0.9987174 0.02535072 0 0.9996786 -9.91459e-4 0 0.9999994 -0.003970676 0 0.9999921 -0.003970676 0 0.9999921 -9.91459e-4 0 0.9999994 -0.01775949 0 0.9998422 -0.0224782 0 0.9997473 0.006401322 0 0.9999794 -0.003970676 0 0.9999921 -0.0224782 0 0.9997473 -0.02149955 0 0.9997688 0 0 0.9999999 0.009454342 0 0.9999553 0.01239362 0 0.9999232 -0.002619098 0 0.9999966 0.009454342 0 0.9999553 0.05202673 0 0.9986457 0.05398559 0 0.9985417 0.01239362 0 0.9999232 0.01239362 0 0.9999232 0.05398559 0 0.9985417 0.04174658 0 0.9991282 0.00922825 0 0.9999574 -0.002619098 0 0.9999966 0.01239362 0 0.9999232 0.00922825 0 0.9999574 -0.01229476 0 0.9999243 0.2702791 0 0.962782 0.1066524 0 0.9942964 0.1317542 0 0.9912824 0.1820696 0 0.9832855 0.1066524 0 0.9942964 0.04866835 0 0.9988151 0.05462566 0 0.9985068 0.1317542 0 0.9912824 0.1317542 0 0.9912824 0.05462566 0 0.9985068 0.04174658 0 0.9991282 0.05398559 0 0.9985417 0.1820696 0 0.9832855 0.1317542 0 0.9912824 0.05398559 0 0.9985417 0.05202673 0 0.9986457 -0.06132749 0 0.9981177 -0.02468202 0 0.9996954 0.01596769 0 0.9998725 0.005891751 0 0.9999827 -0.02468202 0 0.9996954 -0.01229476 0 0.9999243 0.00922825 0 0.9999574 0.01596769 0 0.9998725 0.01596769 0 0.9998725 0.00922825 0 0.9999574 0.04174658 0 0.9991282 0.05462566 0 0.9985068 0.005891751 0 0.9999827 0.01596769 0 0.9998725 0.05462566 0 0.9985068 0.04866835 0 0.9988151 0.006035781 0 0.9999818 -0.01856911 0 0.9998276 -0.02405027 0 0.9997108 1.38294e-4 0 1 -0.01856911 0 0.9998276 -0.05831985 0 0.998298 -0.06403448 0 0.9979477 -0.02405027 0 0.9997108 -0.02405027 0 0.9997108 -0.06403448 0 0.9979477 -0.04904365 0 0.9987967 -0.01501849 0 0.9998871 1.38294e-4 0 1 -0.02405027 0 0.9997108 -0.01501849 0 0.9998871 8.9225e-4 0 0.9999995 -0.3359164 0 0.9418918 -0.2242668 0 0.9745278 -0.149144 0 0.9888155 -0.1239521 0 0.9922882 -0.2242668 0 0.9745278 -0.07463703 0 0.9972107 -0.06327102 0 0.9979963 -0.149144 0 0.9888155 -0.149144 0 0.9888155 -0.06327102 0 0.9979963 -0.04904365 0 0.9987967 -0.06403448 0 0.9979477 -0.1239521 0 0.9922882 -0.149144 0 0.9888155 -0.06403448 0 0.9979477 -0.05831985 0 0.998298 0 0 0.9999999 4.16625e-4 0 0.9999998 -0.0161423 0 0.9998696 -0.01460662 0 0.9998933 4.16625e-4 0 0.9999998 8.9225e-4 0 0.9999995 -0.01501849 0 0.9998871 -0.0161423 0 0.9998696 -0.0161423 0 0.9998696 -0.01501849 0 0.9998871 -0.04904365 0 0.9987967 -0.06327102 0 0.9979963 -0.01460662 0 0.9998933 -0.0161423 0 0.9998696 -0.06327102 0 0.9979963 -0.07463703 0 0.9972107 0 0 0.9999999 -0.007181107 0 0.999974 -0.005248039 0 0.9999861 6.04524e-4 0 0.9999996 -0.007181107 0 0.999974 -0.02965709 0 0.9995601 -0.02499919 0 0.9996874 -0.005248039 0 0.9999861 -0.005248039 0 0.9999861 -0.02499919 0 0.9996874 -0.01671649 0 0.9998602 -9.56426e-4 0 0.9999995 6.04524e-4 0 0.9999996 -0.005248039 0 0.9999861 -9.56426e-4 0 0.9999995 0.003470933 0 0.999994 -0.08657958 0 0.9962449 -0.06391584 0 0.9979553 -0.06538501 0 0.9978602 -0.07094157 0 0.9974805 -0.06391584 0 0.9979553 -0.02315164 0 0.9997319 -0.03183398 0 0.9994932 -0.06538501 0 0.9978602 -0.06538501 0 0.9978602 -0.03183398 0 0.9994932 -0.01671649 0 0.9998602 -0.02499919 0 0.9996874 -0.07094157 0 0.9974805 -0.06538501 0 0.9978602 -0.02499919 0 0.9996874 -0.02965709 0 0.9995601 0.006035781 0 0.9999818 0.009184712 0 0.9999576 -0.004579363 0 0.9999895 -0.006606041 0 0.9999782 0.009184712 0 0.9999576 0.003470933 0 0.999994 -9.56426e-4 0 0.9999995 -0.004579363 0 0.9999895 -0.004579363 0 0.9999895 -9.56426e-4 0 0.9999995 -0.01671649 0 0.9998602 -0.03183398 0 0.9994932 -0.006606041 0 0.9999782 -0.004579363 0 0.9999895 -0.03183398 0 0.9994932 -0.02315164 0 0.9997319 0.006035781 0 0.9999818 0.009320168 0 0.9999565 0.007030973 0 0.9999751 0.009184712 0 0.9999576 0.009320168 0 0.9999565 0.004816276 0 0.9999883 0.004378976 0 0.9999902 0.007030973 0 0.9999751 0.007030973 0 0.9999751 0.004378976 0 0.9999902 0.002361082 0 0.9999972 0.003710837 0 0.999993 0.009184712 0 0.9999576 0.007030973 0 0.9999751 0.003710837 0 0.999993 0.003470933 0 0.999994 0 0 0.9999999 0 0 0.9999999 0.001108441 0 0.9999992 0.001335954 0 0.9999989 0 0 0.9999999 0 0 0.9999999 7.69157e-4 0 0.9999996 0.001108441 0 0.9999992 0.001108441 0 0.9999992 7.69157e-4 0 0.9999996 0.002361082 0 0.9999972 0.004378976 0 0.9999902 0.001335954 0 0.9999989 0.001108441 0 0.9999992 0.004378976 0 0.9999902 0.004816276 0 0.9999883 0 0 0.9999999 6.04524e-4 0 0.9999996 0.001045421 0 0.9999993 0 0 0.9999999 6.04524e-4 0 0.9999996 0.003470933 0 0.999994 0.003710837 0 0.999993 0.001045421 0 0.9999993 0.001045421 0 0.9999993 0.003710837 0 0.999993 0.002361082 0 0.9999972 7.69157e-4 0 0.9999996 0 0 0.9999999 0.001045421 0 0.9999993 7.69157e-4 0 0.9999996 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 6.67979e-4 0 0.9999997 4.16625e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 1.70329e-4 0 0.9999999 6.67979e-4 0 0.9999997 6.67979e-4 0 0.9999997 1.70329e-4 0 0.9999999 0.001359916 0 0.999999 0.002643393 0 0.9999963 4.16625e-4 0 0.9999998 6.67979e-4 0 0.9999997 0.002643393 0 0.9999963 8.9225e-4 0 0.9999995 0 0 0.9999999 0.001335954 0 0.9999989 7.5563e-4 0 0.9999996 0 0 0.9999999 0.001335954 0 0.9999989 0.004816276 0 0.9999883 0.003029729 0 0.9999954 7.5563e-4 0 0.9999996 7.5563e-4 0 0.9999996 0.003029729 0 0.9999954 0.001359916 0 0.999999 1.70329e-4 0 0.9999999 0 0 0.9999999 7.5563e-4 0 0.9999996 1.70329e-4 0 0.9999999 0 0 0.9999999 0.006035781 0 0.9999818 1.38294e-4 0 1 0.004627169 0 0.9999892 0.009320168 0 0.9999565 1.38294e-4 0 1 8.9225e-4 0 0.9999995 0.002643393 0 0.9999963 0.004627169 0 0.9999892 0.004627169 0 0.9999892 0.002643393 0 0.9999963 0.001359916 0 0.999999 0.003029729 0 0.9999954 0.009320168 0 0.9999565 0.004627169 0 0.9999892 0.003029729 0 0.9999954 0.004816276 0 0.9999883 0 0 0.9999999 0.0223938 0 0.9997493 0.02422229 0 0.9997066 -0.01808362 0 0.9998364 0.0223938 0 0.9997493 0.118857 0 0.9929114 0.1171403 0 0.9931153 0.02422229 0 0.9997066 0.02422229 0 0.9997066 0.1171403 0 0.9931153 0.07387806 0 0.9972673 -0.01333674 0 0.9999111 -0.01808362 0 0.9998364 0.02422229 0 0.9997066 -0.01333674 0 0.9999111 -0.1219354 0 0.992538 0.4394023 0 0.8982903 0.2055127 0 0.9786544 0.2397977 0 0.9708229 0.3403908 0 0.9402841 0.2055127 0 0.9786544 0.1029348 0 0.9946881 0.1076652 0 0.9941872 0.2397977 0 0.9708229 0.2397977 0 0.9708229 0.1076652 0 0.9941872 0.07387806 0 0.9972673 0.1171403 0 0.9931153 0.3403908 0 0.9402841 0.2397977 0 0.9708229 0.1171403 0 0.9931153 0.118857 0 0.9929114 -0.7550608 0 0.6556548 -0.3403253 0 0.9403077 -0.03292647 0 0.9994578 -0.06837759 0 0.9976594 -0.3403253 0 0.9403077 -0.1219354 0 0.992538 -0.01333674 0 0.9999111 -0.03292647 0 0.9994578 -0.03292647 0 0.9994578 -0.01333674 0 0.9999111 0.07387806 0 0.9972673 0.1076652 0 0.9941872 -0.06837759 0 0.9976594 -0.03292647 0 0.9994578 0.1076652 0 0.9941872 0.1029348 0 0.9946881 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.00717057 0 0.9999741 0.004168725 0 0.9999912 0 0 0.9999999 0 0 0.9999999 0.008172476 0 0.9999665 0.00717057 0 0.9999741 0.00717057 0 0.9999741 0.008172476 0 0.9999665 0.0261897 0 0.999657 0.02427305 0 0.9997054 0.004168725 0 0.9999912 0.00717057 0 0.9999741 0.02427305 0 0.9997054 0.02492489 0 0.9996892 0 0 0.9999999 0.002200701 0 0.9999974 0.007590775 0 0.999971 0 0 0.9999999 0.002200701 0 0.9999974 0.01689509 0 0.9998572 0.02347645 0 0.9997244 0.007590775 0 0.999971 0.007590775 0 0.999971 0.02347645 0 0.9997244 0.0261897 0 0.999657 0.008172476 0 0.9999665 0 0 0.9999999 0.007590775 0 0.999971 0.008172476 0 0.9999665 0 0 0.9999999 -0.02715787 0 0.9996311 0.0696838 0 0.9975691 0.04339397 0 0.999058 -0.02145573 0 0.9997697 0.0696838 0 0.9975691 0.02492489 0 0.9996892 0.02427305 0 0.9997054 0.04339397 0 0.999058 0.04339397 0 0.999058 0.02427305 0 0.9997054 0.0261897 0 0.999657 0.02347645 0 0.9997244 -0.02145573 0 0.9997697 0.04339397 0 0.999058 0.02347645 0 0.9997244 0.01689509 0 0.9998572 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.7550608 0 0.6556548 -0.8646719 0 0.502337 -0.6165534 0 0.7873132 -0.3403253 0 0.9403077 -0.8646719 0 0.502337 -0.6193175 0 0.7851406 -0.4708182 0 0.8822303 -0.6165534 0 0.7873132 -0.6165534 0 0.7873132 -0.4708182 0 0.8822303 -0.1797343 0 0.9837152 -0.193566 0 0.9810872 -0.3403253 0 0.9403077 -0.6165534 0 0.7873132 -0.193566 0 0.9810872 -0.1219354 0 0.992538 -0.02715787 0 0.9996311 -0.02145573 0 0.9997697 -0.1909652 0 0.9815968 -0.3473425 0 0.9377384 -0.02145573 0 0.9997697 0.01689509 0 0.9998572 -0.03451218 0 0.9994043 -0.1909652 0 0.9815968 -0.1909652 0 0.9815968 -0.03451218 0 0.9994043 -0.1797343 0 0.9837152 -0.4708182 0 0.8822303 -0.3473425 0 0.9377384 -0.1909652 0 0.9815968 -0.4708182 0 0.8822303 -0.6193175 0 0.7851406 0 0 0.9999999 -0.01808362 0 0.9998364 -0.03478953 0 0.9993947 0.002200701 0 0.9999974 -0.01808362 0 0.9998364 -0.1219354 0 0.992538 -0.193566 0 0.9810872 -0.03478953 0 0.9993947 -0.03478953 0 0.9993947 -0.193566 0 0.9810872 -0.1797343 0 0.9837152 -0.03451218 0 0.9994043 0.002200701 0 0.9999974 -0.03478953 0 0.9993947 -0.03451218 0 0.9994043 0.01689509 0 0.9998572 0 0 1 0.001841426 0 0.9999983 -0.005479925 0 0.9999849 -0.002449128 0 0.999997 0.001841426 0 0.9999983 0.01284539 0 0.9999174 -0.0027953 0 0.9999961 -0.005479925 0 0.9999849 -0.005479925 0 0.9999849 -0.0027953 0 0.9999961 -0.01388385 0 0.9999036 -0.01196214 0 0.9999284 -0.002449128 0 0.999997 -0.005479925 0 0.9999849 -0.01196214 0 0.9999284 -0.01185445 0 0.9999295 0.08577371 0 0.9963147 -0.02511933 0 0.9996844 -0.00720115 0 0.999974 0.02692852 0 0.9996374 -0.02511933 0 0.9996844 -0.03842073 0 0.9992616 -0.0251183 0 0.9996845 -0.00720115 0 0.999974 -0.00720115 0 0.999974 -0.0251183 0 0.9996845 -0.01388385 0 0.9999036 -0.0027953 0 0.9999961 0.02692852 0 0.9996374 -0.00720115 0 0.999974 -0.0027953 0 0.9999961 0.01284539 0 0.9999174 -0.02829218 0 0.9995997 -0.03362282 0 0.9994346 -0.0259233 0 0.9996638 -0.04534278 0 0.9989715 -0.03362282 0 0.9994346 -0.01185445 0 0.9999295 -0.01196214 0 0.9999284 -0.0259233 0 0.9996638 -0.0259233 0 0.9996638 -0.01196214 0 0.9999284 -0.01388385 0 0.9999036 -0.0251183 0 0.9996845 -0.04534278 0 0.9989715 -0.0259233 0 0.9996638 -0.0251183 0 0.9996845 -0.03842073 0 0.9992616 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.009456045 0 0.9999552 -0.004128905 0 0.9999914 0 0 0.9999999 0 0 0.9999999 -0.0048938 0 0.999988 -0.009456045 0 0.9999552 -0.009456045 0 0.9999552 -0.0048938 0 0.999988 -0.01989944 0 0.999802 -0.03354169 0 0.9994373 -0.004128905 0 0.9999914 -0.009456045 0 0.9999552 -0.03354169 0 0.9994373 -0.01254183 0 0.9999213 0 0 0.9999999 -0.01771826 0 0.9998429 -0.00796906 0 0.9999682 0 0 0.9999999 -0.01771826 0 0.9998429 -0.06862319 0 0.9976426 -0.0424068 0 0.9991004 -0.00796906 0 0.9999682 -0.00796906 0 0.9999682 -0.0424068 0 0.9991004 -0.01989944 0 0.999802 -0.0048938 0 0.999988 0 0 0.9999999 -0.00796906 0 0.9999682 -0.0048938 0 0.999988 0 0 0.9999999 -0.01624622 0 0.9998679 -0.03642421 0 0.9993363 -0.06829426 0 0.9976652 -0.1400736 0 0.9901411 -0.03642421 0 0.9993363 -0.01254183 0 0.9999213 -0.03354169 0 0.9994373 -0.06829426 0 0.9976652 -0.06829426 0 0.9976652 -0.03354169 0 0.9994373 -0.01989944 0 0.999802 -0.0424068 0 0.9991004 -0.1400736 0 0.9901411 -0.06829426 0 0.9976652 -0.0424068 0 0.9991004 -0.06862319 0 0.9976426 0 0 0.9999999 -0.004128905 0 0.9999914 0.03194974 0 0.9994894 0.01082615 0 0.9999415 -0.004128905 0 0.9999914 -0.01254183 0 0.9999213 0.05837937 0 0.9982945 0.03194974 0 0.9994894 0.03194974 0 0.9994894 0.05837937 0 0.9982945 0.1487554 0 0.988874 0.1098533 0 0.9939478 0.01082615 0 0.9999415 0.03194974 0 0.9994894 0.1098533 0 0.9939478 0.06172637 0 0.9980932 -0.01624622 0 0.9998679 0.2875531 0 0.9577647 0.153494 0 0.9881495 -0.03642421 0 0.9993363 0.2875531 0 0.9577647 0.3648541 0 0.9310648 0.2625365 0 0.964922 0.153494 0 0.9881495 0.153494 0 0.9881495 0.2625365 0 0.964922 0.1487554 0 0.988874 0.05837937 0 0.9982945 -0.03642421 0 0.9993363 0.153494 0 0.9881495 0.05837937 0 0.9982945 -0.01254183 0 0.9999213 0.226185 0 0.9740844 0.143379 0 0.9896679 0.2807688 0 0.9597754 0.3969618 0 0.9178351 0.143379 0 0.9896679 0.06172637 0 0.9980932 0.1098533 0 0.9939478 0.2807688 0 0.9597754 0.2807688 0 0.9597754 0.1098533 0 0.9939478 0.1487554 0 0.988874 0.2625365 0 0.964922 0.3969618 0 0.9178351 0.2807688 0 0.9597754 0.2625365 0 0.964922 0.3648541 0 0.9310648 0 0 0.9999999 0 0 0.9999999 1.21043e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 1.21043e-4 0 0.9999999 1.21043e-4 0 0.9999999 0 0 0.9999999 -1.51196e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 1.21043e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 -1.51196e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -1.51196e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.00264919 0 0.9999964 0.001028423 0 0.9999994 0 0 0.9999999 0 0 0.9999999 0.002254257 0 0.9999974 0.00264919 0 0.9999964 0.00264919 0 0.9999964 0.002254257 0 0.9999974 0.01008676 0 0.9999491 0.01077517 0 0.9999418 0.001028423 0 0.9999994 0.00264919 0 0.9999964 0.01077517 0 0.9999418 0.005881784 0 0.9999826 0 0 0.9999999 0.005385564 0 0.9999854 0.002872802 0 0.9999958 0 0 0.9999999 0.005385564 0 0.9999854 0.01873213 0 0.9998245 0.0125441 0 0.9999213 0.002872802 0 0.9999958 0.002872802 0 0.9999958 0.0125441 0 0.9999213 0.01008676 0 0.9999491 0.002254257 0 0.9999974 0 0 0.9999999 0.002872802 0 0.9999958 0.002254257 0 0.9999974 0 0 0.9999999 0.03908723 0 0.9992358 0.01691968 0 0.9998568 0.01952134 0 0.9998094 0.03590414 0 0.9993552 0.01691968 0 0.9998568 0.005881784 0 0.9999826 0.01077517 0 0.9999418 0.01952134 0 0.9998094 0.01952134 0 0.9998094 0.01077517 0 0.9999418 0.01008676 0 0.9999491 0.0125441 0 0.9999213 0.03590414 0 0.9993552 0.01952134 0 0.9998094 0.0125441 0 0.9999213 0.01873213 0 0.9998245 0 0 0.9999999 0 0 0.9999999 0.001566785 0 0.9999986 0.004232885 0 0.9999909 0 0 0.9999999 0 0 0.9999999 -0.001493394 0 0.9999988 0.001566785 0 0.9999986 0.001566785 0 0.9999986 -0.001493394 0 0.9999988 -5.94875e-4 0 0.9999997 0.005865605 0 0.9999828 0.004232885 0 0.9999909 0.001566785 0 0.9999986 0.005865605 0 0.9999828 0.02071619 0 0.9997854 0 0 0.9999999 -0.001446917 0 0.9999988 0.001438954 0 0.9999988 0 0 0.9999999 -0.001446917 0 0.9999988 -9.04389e-4 0 0.9999995 -0.001992554 0 0.999998 0.001438954 0 0.9999988 0.001438954 0 0.9999988 -0.001992554 0 0.999998 -5.94875e-4 0 0.9999997 -0.001493394 0 0.9999988 0 0 0.9999999 0.001438954 0 0.9999988 -0.001493394 0 0.9999988 0 0 0.9999999 0.1737721 0 0.9847859 0.0569475 0 0.9983771 0.007296007 0 0.9999734 0.01014148 0 0.9999484 0.0569475 0 0.9983771 0.02071619 0 0.9997854 0.005865605 0 0.9999828 0.007296007 0 0.9999734 0.007296007 0 0.9999734 0.005865605 0 0.9999828 -5.94875e-4 0 0.9999997 -0.001992554 0 0.999998 0.01014148 0 0.9999484 0.007296007 0 0.9999734 -0.001992554 0 0.999998 -9.04389e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.01460662 0 0.9998933 -0.01149562 0 0.9999339 0 0 0.9999999 -0.01460662 0 0.9998933 -0.07463703 0 0.9972107 -0.04950729 0 0.9987738 -0.01149562 0 0.9999339 -0.01149562 0 0.9999339 -0.04950729 0 0.9987738 -0.04665047 0 0.9989112 -0.008510688 0 0.9999637 0 0 0.9999999 -0.01149562 0 0.9999339 -0.008510688 0 0.9999637 0 0 0.9999999 -0.3359164 0 0.9418918 -0.2220178 0 0.9750426 -0.1137022 0 0.9935148 -0.2242668 0 0.9745278 -0.2220178 0 0.9750426 -0.05979739 0 0.9982105 -0.08063262 0 0.9967439 -0.1137022 0 0.9935148 -0.1137022 0 0.9935148 -0.08063262 0 0.9967439 -0.04665047 0 0.9989112 -0.04950729 0 0.9987738 -0.2242668 0 0.9745278 -0.1137022 0 0.9935148 -0.04950729 0 0.9987738 -0.07463703 0 0.9972107 0 0 0.9999999 0 0 0.9999999 -0.01840895 0 0.9998305 -0.01716357 0 0.9998527 0 0 0.9999999 0 0 0.9999999 -0.008510688 0 0.9999637 -0.01840895 0 0.9998305 -0.01840895 0 0.9998305 -0.008510688 0 0.9999637 -0.04665047 0 0.9989112 -0.08063262 0 0.9967439 -0.01716357 0 0.9998527 -0.01840895 0 0.9998305 -0.08063262 0 0.9967439 -0.05979739 0 0.9982105 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 -0.002169623 0 0.9999976 -0.00390476 0 0.9999923 0 0 0.9999999 0 0 0.9999999 2.07261e-4 0 0.9999998 -0.002169623 0 0.9999976 -0.002169623 0 0.9999976 2.07261e-4 0 0.9999998 -0.004964609 0 0.9999876 -0.01105647 0 0.9999389 -0.00390476 0 0.9999923 -0.002169623 0 0.9999976 -0.01105647 0 0.9999389 -0.02260412 0 0.9997445 0 0 0.9999999 -6.06377e-4 0 0.9999996 -0.001283237 0 0.9999991 0 0 0.9999999 -6.06377e-4 0 0.9999996 -0.002873173 0 0.9999957 -0.003733175 0 0.9999929 -0.001283237 0 0.9999991 -0.001283237 0 0.9999991 -0.003733175 0 0.9999929 -0.004964609 0 0.9999876 2.07261e-4 0 0.9999998 0 0 0.9999999 -0.001283237 0 0.9999991 2.07261e-4 0 0.9999998 0 0 0.9999999 -0.01883977 0 0.9998225 -0.05513195 0 0.9984791 -0.01339747 0 0.9999101 -0.01748238 0 0.9998472 -0.05513195 0 0.9984791 -0.02260412 0 0.9997445 -0.01105647 0 0.9999389 -0.01339747 0 0.9999101 -0.01339747 0 0.9999101 -0.01105647 0 0.9999389 -0.004964609 0 0.9999876 -0.003733175 0 0.9999929 -0.01748238 0 0.9998472 -0.01339747 0 0.9999101 -0.003733175 0 0.9999929 -0.002873173 0 0.9999957 0 0 1 -0.00390476 0 0.9999923 -0.004983252 0 0.9999875 -0.001791804 0 0.9999983 -0.00390476 0 0.9999923 -0.02260412 0 0.9997445 -0.02260621 0 0.9997444 -0.004983252 0 0.9999875 -0.004983252 0 0.9999875 -0.02260621 0 0.9997444 -0.003719408 0 0.999993 0.004306071 0 0.9999906 -0.001791804 0 0.9999983 -0.004983252 0 0.9999875 0.004306071 0 0.9999906 -0.006491993 0 0.9999788 -0.01883977 0 0.9998225 -0.09306581 0 0.9956599 -0.05015917 0 0.9987411 -0.05513195 0 0.9984791 -0.09306581 0 0.9956599 -0.03125302 0 0.9995115 -0.01407915 0 0.9999009 -0.05015917 0 0.9987411 -0.05015917 0 0.9987411 -0.01407915 0 0.9999009 -0.003719408 0 0.999993 -0.02260621 0 0.9997444 -0.05513195 0 0.9984791 -0.05015917 0 0.9987411 -0.02260621 0 0.9997444 -0.02260412 0 0.9997445 -0.01160175 0 0.9999326 -0.0279181 0 0.9996101 0.02398781 0 0.9997123 0.04008357 0 0.9991963 -0.0279181 0 0.9996101 -0.006491993 0 0.9999788 0.004306071 0 0.9999906 0.02398781 0 0.9997123 0.02398781 0 0.9997123 0.004306071 0 0.9999906 -0.003719408 0 0.999993 -0.01407915 0 0.9999009 0.04008357 0 0.9991963 0.02398781 0 0.9997123 -0.01407915 0 0.9999009 -0.03125302 0 0.9995115</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape1-textangents-array" count="4752" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape1-texbinormals">
+ <float_array id="qt_gauge_background_Shape1-texbinormals-array" count="14256">0.9998225 0 0.01883977 0.9998472 0 0.01748238 0.999999 0 -0.001471107 0.9994946 0 -0.0317907 0.9998472 0 0.01748238 0.9999959 0 0.002873173 0.9999974 0 -0.002330902 0.999999 0 -0.001471107 0.999999 0 -0.001471107 0.9999974 0 -0.002330902 1 0 2.03961e-4 0.9999935 0 0.003617776 0.9994946 0 -0.0317907 0.999999 0 -0.001471107 0.9999935 0 0.003617776 0.9999754 0 -0.007021162 1 0 0 1 0 0 0.9999972 0 -0.002410374 0.9999999 0 6.06377e-4 1 0 0 1 0 0 0.9999979 0 0.002117234 0.9999972 0 -0.002410374 0.9999972 0 -0.002410374 0.9999979 0 0.002117234 1 0 2.03961e-4 0.9999974 0 -0.002330902 0.9999999 0 6.06377e-4 0.9999972 0 -0.002410374 0.9999974 0 -0.002330902 0.9999959 0 0.002873173 1 0 0 0.999997 0 -0.002468506 0.9999972 0 0.002373843 1 0 0 0.999997 0 -0.002468506 0.9999754 0 -0.007021162 0.9999935 0 0.003617776 0.9999972 0 0.002373843 0.9999972 0 0.002373843 0.9999935 0 0.003617776 1 0 2.03961e-4 0.9999979 0 0.002117234 1 0 0 0.9999972 0 0.002373843 0.9999979 0 0.002117234 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999819 0 0.006024945 0.9999782 0 -0.006606747 0.9999881 0 -0.004885656 0.9999575 0 0.009223326 0.9999782 0 -0.006606747 0.9997091 0 -0.02412052 0.9993833 0 -0.03511409 0.9999881 0 -0.004885656 0.9999881 0 -0.004885656 0.9993833 0 -0.03511409 0.9998341 0 -0.01821868 0.9999996 0 -9.39363e-4 0.9999575 0 0.009223326 0.9999881 0 -0.004885656 0.9999996 0 -9.39363e-4 0.9999929 0 0.003781974 0.9901766 0 -0.1398229 0.9954166 0 -0.09563369 0.9965909 0 -0.08250221 0.9971848 0 -0.07498491 0.9954166 0 -0.09563369 0.999635 0 -0.02701436 0.9996274 0 -0.02729583 0.9965909 0 -0.08250221 0.9965909 0 -0.08250221 0.9996274 0 -0.02729583 0.9998341 0 -0.01821868 0.9993833 0 -0.03511409 0.9971848 0 -0.07498491 0.9965909 0 -0.08250221 0.9993833 0 -0.03511409 0.9997091 0 -0.02412052 1 0 0 0.9999997 0 8.21801e-4 0.999986 0 -0.005302157 0.9999878 0 -0.004960678 0.9999997 0 8.21801e-4 0.9999929 0 0.003781974 0.9999996 0 -9.39363e-4 0.999986 0 -0.005302157 0.999986 0 -0.005302157 0.9999996 0 -9.39363e-4 0.9998341 0 -0.01821868 0.9996274 0 -0.02729583 0.9999878 0 -0.004960678 0.999986 0 -0.005302157 0.9996274 0 -0.02729583 0.999635 0 -0.02701436 1 0 0 0.9998521 0 -0.01719688 0.9998342 0 -0.01820803 1 0 0 0.9998521 0 -0.01719688 0.9982092 0 -0.05981902 0.9967871 0 -0.08009655 0.9998342 0 -0.01820803 0.9998342 0 -0.01820803 0.9967871 0 -0.08009655 0.9989782 0 -0.04519426 0.9999701 0 -0.007728222 1 0 0 0.9998342 0 -0.01820803 0.9999701 0 -0.007728222 1 0 0 0.9418972 0 -0.3359014 0.9749998 0 -0.2222058 0.9937735 0 -0.1114198 0.9750377 0 -0.2220397 0.9749998 0 -0.2222058 0.9974862 0 -0.07086123 0.9989128 0 -0.04661954 0.9937735 0 -0.1114198 0.9937735 0 -0.1114198 0.9989128 0 -0.04661954 0.9989782 0 -0.04519426 0.9967871 0 -0.08009655 0.9750377 0 -0.2220397 0.9937735 0 -0.1114198 0.9967871 0 -0.08009655 0.9982092 0 -0.05981902 1 0 0 1 0 0 0.9999476 0 -0.01024578 0.9999145 0 -0.0130777 1 0 0 1 0 0 0.9999701 0 -0.007728222 0.9999476 0 -0.01024578 0.9999476 0 -0.01024578 0.9999701 0 -0.007728222 0.9989782 0 -0.04519426 0.9989128 0 -0.04661954 0.9999145 0 -0.0130777 0.9999476 0 -0.01024578 0.9989128 0 -0.04661954 0.9974862 0 -0.07086123 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9995998 0 -0.02828729 0.9989722 0 -0.04532848 0.9996675 0 -0.02578811 0.9994439 0 -0.03334556 0.9989722 0 -0.04532848 0.9992622 0 -0.03840816 0.9996861 0 -0.02505765 0.9996675 0 -0.02578811 0.9996675 0 -0.02578811 0.9996861 0 -0.02505765 0.9999036 0 -0.01388914 0.9999304 0 -0.01180292 0.9994439 0 -0.03334556 0.9996675 0 -0.02578811 0.9999304 0 -0.01180292 0.9999341 0 -0.01148487 0.9963148 0 0.08577254 0.9996417 0 0.02676813 0.9999726 0 -0.007405162 0.9996847 0 -0.02511295 0.9996417 0 0.02676813 0.9999217 0 0.01252065 0.9999954 0 -0.003082898 0.9999726 0 -0.007405162 0.9999726 0 -0.007405162 0.9999954 0 -0.003082898 0.9999036 0 -0.01388914 0.9996861 0 -0.02505765 0.9996847 0 -0.02511295 0.9999726 0 -0.007405162 0.9996861 0 -0.02505765 0.9992622 0 -0.03840816 1 0 0 0.9999974 0 -0.002308159 0.9999851 0 -0.005457678 0.9999986 0 0.001722295 0.9999974 0 -0.002308159 0.9999341 0 -0.01148487 0.9999304 0 -0.01180292 0.9999851 0 -0.005457678 0.9999851 0 -0.005457678 0.9999304 0 -0.01180292 0.9999036 0 -0.01388914 0.9999954 0 -0.003082898 0.9999986 0 0.001722295 0.9999851 0 -0.005457678 0.9999954 0 -0.003082898 0.9999217 0 0.01252065 0.9998672 0 -0.01630293 0.9876331 0 -0.1567832 0.9955463 0 -0.09427359 0.9901409 0 -0.1400757 0.9876331 0 -0.1567832 0.9982937 0 -0.05839312 0.9989763 0 -0.04523759 0.9955463 0 -0.09427359 0.9955463 0 -0.09427359 0.9989763 0 -0.04523759 0.9998358 0 -0.01812367 0.999001 0 -0.04468977 0.9901409 0 -0.1400757 0.9955463 0 -0.09427359 0.999001 0 -0.04468977 0.9976454 0 -0.06858326 0.9995998 0 -0.02828729 0.9999998 0 7.39891e-4 0.9999697 0 -0.007791536 0.9999998 0 6.89053e-4 0.9999998 0 7.39891e-4 0.9999999 0 5.35191e-4 0.9999942 0 -0.003427542 0.9999697 0 -0.007791536 0.9999697 0 -0.007791536 0.9999942 0 -0.003427542 0.9998358 0 -0.01812367 0.9989763 0 -0.04523759 0.9999998 0 6.89053e-4 0.9999697 0 -0.007791536 0.9989763 0 -0.04523759 0.9982937 0 -0.05839312 1 0 0 0.9998437 0 -0.01768041 0.999963 0 -0.008598601 0.9999999 0 5.11692e-4 0.9998437 0 -0.01768041 0.9976454 0 -0.06858326 0.999001 0 -0.04468977 0.999963 0 -0.008598601 0.999963 0 -0.008598601 0.999001 0 -0.04468977 0.9998358 0 -0.01812367 0.9999942 0 -0.003427542 0.9999999 0 5.11692e-4 0.999963 0 -0.008598601 0.9999942 0 -0.003427542 0.9999999 0 5.35191e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998672 0 -0.01630293 0.9901409 0 -0.1400757 0.9976753 0 -0.06814682 0.9993163 0 -0.03697535 0.9901409 0 -0.1400757 0.9976454 0 -0.06858326 0.9990978 0 -0.04246972 0.9976753 0 -0.06814682 0.9976753 0 -0.06814682 0.9990978 0 -0.04246972 0.9998007 0 -0.01996363 0.9994373 0 -0.03354349 0.9993163 0 -0.03697535 0.9976753 0 -0.06814682 0.9994373 0 -0.03354349 0.9999121 0 -0.01326744 1 0 0 1 0 0 0.9999684 0 -0.007950085 0.9998437 0 -0.01768041 1 0 0 1 0 0 0.9999886 0 -0.004786012 0.9999684 0 -0.007950085 0.9999684 0 -0.007950085 0.9999886 0 -0.004786012 0.9998007 0 -0.01996363 0.9990978 0 -0.04246972 0.9998437 0 -0.01768041 0.9999684 0 -0.007950085 0.9990978 0 -0.04246972 0.9976454 0 -0.06858326 1 0 0 0.9999874 0 -0.00504062 0.9999689 0 -0.007896813 1 0 0 0.9999874 0 -0.00504062 0.9999121 0 -0.01326744 0.9994373 0 -0.03354349 0.9999689 0 -0.007896813 0.9999689 0 -0.007896813 0.9994373 0 -0.03354349 0.9998007 0 -0.01996363 0.9999886 0 -0.004786012 1 0 0 0.9999689 0 -0.007896813 0.9999886 0 -0.004786012 1 0 0 0.9992346 0 0.03912016 0.9993817 0 0.0351604 0.9997127 0 0.02397191 0.9993653 0 0.03562174 0.9993817 0 0.0351604 0.999999 0 0.001467794 0.9999999 0 -3.29222e-4 0.9997127 0 0.02397191 0.9997127 0 0.02397191 0.9999999 0 -3.29222e-4 0.9999959 0 0.002890125 0.9999311 0 0.01174113 0.9993653 0 0.03562174 0.9997127 0 0.02397191 0.9999311 0 0.01174113 0.9998673 0 0.01629663 0.974092 0 0.2261525 0.9999889 0 0.004728409 0.9996425 0 -0.02673769 0.9988653 0 -0.04762619 0.9999889 0 0.004728409 0.9999855 0 0.005389479 0.9998417 0 -0.01779513 0.9996425 0 -0.02673769 0.9996425 0 -0.02673769 0.9998417 0 -0.01779513 0.9999959 0 0.002890125 0.9999999 0 -3.29222e-4 0.9988653 0 -0.04762619 0.9996425 0 -0.02673769 0.9999999 0 -3.29222e-4 0.999999 0 0.001467794 1 0 0 0.9999927 0 0.003839482 0.9999982 0 -0.001921765 0.9999973 0 0.002349806 0.9999927 0 0.003839482 0.9998673 0 0.01629663 0.9999311 0 0.01174113 0.9999982 0 -0.001921765 0.9999982 0 -0.001921765 0.9999311 0 0.01174113 0.9999959 0 0.002890125 0.9998417 0 -0.01779513 0.9999973 0 0.002349806 0.9999982 0 -0.001921765 0.9998417 0 -0.01779513 0.9999855 0 0.005389479 0.9992346 0 0.03912016 0.9993653 0 0.03562174 0.9998225 0 0.01884492 0.9998599 0 0.01674236 0.9993653 0 0.03562174 0.9998673 0 0.01629663 0.9999304 0 0.01180148 0.9998225 0 0.01884492 0.9998225 0 0.01884492 0.9999304 0 0.01180148 0.9999547 0 0.00952468 0.9999465 0 0.01034317 0.9998599 0 0.01674236 0.9998225 0 0.01884492 0.9999465 0 0.01034317 0.9999849 0 0.005515533 1 0 0 1 0 0 0.9999968 0 0.002577626 0.9999927 0 0.003839482 1 0 0 1 0 0 0.9999974 0 0.002300428 0.9999968 0 0.002577626 0.9999968 0 0.002577626 0.9999974 0 0.002300428 0.9999547 0 0.00952468 0.9999304 0 0.01180148 0.9999927 0 0.003839482 0.9999968 0 0.002577626 0.9999304 0 0.01180148 0.9998673 0 0.01629663 1 0 0 0.9999996 0 8.6946e-4 0.9999968 0 0.002550258 1 0 0 0.9999996 0 8.6946e-4 0.9999849 0 0.005515533 0.9999465 0 0.01034317 0.9999968 0 0.002550258 0.9999968 0 0.002550258 0.9999465 0 0.01034317 0.9999547 0 0.00952468 0.9999974 0 0.002300428 1 0 0 0.9999968 0 0.002550258 0.9999974 0 0.002300428 1 0 0 0.9998223 0 -0.01885335 0.9972488 0 0.07412723 0.9986228 0 0.05246596 0.9994853 0 0.03208454 0.9972488 0 0.07412723 0.9948368 0 0.1014883 0.9958882 0 0.09059021 0.9986228 0 0.05246596 0.9986228 0 0.05246596 0.9958882 0 0.09059021 0.9984153 0 0.05627676 0.9996319 0 0.02712957 0.9994853 0 0.03208454 0.9986228 0 0.05246596 0.9996319 0 0.02712957 0.9999726 0 0.007406521 0.9847953 0 0.1737191 0.985764 0 0.1681351 0.9929506 0 0.1185289 0.9846709 0 0.1744229 0.985764 0 0.1681351 0.9972109 0 0.07463499 0.998091 0 0.06176024 0.9929506 0 0.1185289 0.9929506 0 0.1185289 0.998091 0 0.06176024 0.9984153 0 0.05627676 0.9958882 0 0.09059021 0.9846709 0 0.1744229 0.9929506 0 0.1185289 0.9958882 0 0.09059021 0.9948368 0 0.1014883 1 0 0 0.999997 0 0.002476186 0.9998662 0 0.01636499 0.9998311 0 0.01837931 0.999997 0 0.002476186 0.9999726 0 0.007406521 0.9996319 0 0.02712957 0.9998662 0 0.01636499 0.9998662 0 0.01636499 0.9996319 0 0.02712957 0.9984153 0 0.05627676 0.998091 0 0.06176024 0.9998311 0 0.01837931 0.9998662 0 0.01636499 0.998091 0 0.06176024 0.9972109 0 0.07463499 0.9998223 0 -0.01885335 0.9998447 0 -0.0176233 0.9999068 0 -0.01365025 0.9984701 0 -0.05529651 0.9998447 0 -0.0176233 0.9999925 0 -0.003891198 0.9999827 0 -0.005877873 0.9999068 0 -0.01365025 0.9999068 0 -0.01365025 0.9999827 0 -0.005877873 0.9999874 0 -0.005016274 0.9999446 0 -0.01052688 0.9984701 0 -0.05529651 0.9999068 0 -0.01365025 0.9999446 0 -0.01052688 0.9997121 0 -0.02399765 1 0 0 1 0 0 0.999997 0 -0.002477599 0.9999996 0 9.2707e-4 1 0 0 1 0 0 0.9999999 0 4.77306e-4 0.999997 0 -0.002477599 0.999997 0 -0.002477599 0.9999999 0 4.77306e-4 0.9999874 0 -0.005016274 0.9999827 0 -0.005877873 0.9999996 0 9.2707e-4 0.999997 0 -0.002477599 0.9999827 0 -0.005877873 0.9999925 0 -0.003891198 1 0 0 0.9999858 0 -0.005330923 0.9999985 0 -0.001811389 1 0 0 0.9999858 0 -0.005330923 0.9997121 0 -0.02399765 0.9999446 0 -0.01052688 0.9999985 0 -0.001811389 0.9999985 0 -0.001811389 0.9999446 0 -0.01052688 0.9999874 0 -0.005016274 0.9999999 0 4.77306e-4 1 0 0 0.9999985 0 -0.001811389 0.9999999 0 4.77306e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9847953 0 0.1737191 0.9999492 0 0.01008286 0.999965 0 0.008375364 0.9982935 0 0.05839752 0.9999492 0 0.01008286 0.9999996 0 -9.14993e-4 1 0 -4.17544e-4 0.999965 0 0.008375364 0.999965 0 0.008375364 1 0 -4.17544e-4 0.9999983 0 0.001877753 0.9999722 0 0.007460501 0.9982935 0 0.05839752 0.999965 0 0.008375364 0.9999722 0 0.007460501 0.999731 0 0.02319377 1 0 0 1 0 0 0.9999997 0 8.45062e-4 0.9999989 0 -0.001458215 1 0 0 1 0 0 0.9999999 0 5.24836e-4 0.9999997 0 8.45062e-4 0.9999997 0 8.45062e-4 0.9999999 0 5.24836e-4 0.9999983 0 0.001877753 1 0 -4.17544e-4 0.9999989 0 -0.001458215 0.9999997 0 8.45062e-4 1 0 -4.17544e-4 0.9999996 0 -9.14993e-4 1 0 0 0.9999866 0 0.005177595 0.9999968 0 0.002570811 1 0 0 0.9999866 0 0.005177595 0.999731 0 0.02319377 0.9999722 0 0.007460501 0.9999968 0 0.002570811 0.9999968 0 0.002570811 0.9999722 0 0.007460501 0.9999983 0 0.001877753 0.9999999 0 5.24836e-4 1 0 0 0.9999968 0 0.002570811 0.9999999 0 5.24836e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999878 0 -0.004960678 0.9999781 0 -0.006637754 1 0 0 0.9999878 0 -0.004960678 0.999635 0 -0.02701436 0.9996218 0 -0.02750252 0.9999781 0 -0.006637754 0.9999781 0 -0.006637754 0.9996218 0 -0.02750252 0.9998155 0 -0.01920786 0.999993 0 -0.003759927 1 0 0 0.9999781 0 -0.006637754 0.999993 0 -0.003759927 1 0 0 0.9901766 0 -0.1398229 0.9984173 0 -0.0562412 0.9975672 0 -0.06971121 0.9954166 0 -0.09563369 0.9984173 0 -0.0562412 0.9996955 0 -0.02467567 0.9994698 0 -0.03256086 0.9975672 0 -0.06971121 0.9975672 0 -0.06971121 0.9994698 0 -0.03256086 0.9998155 0 -0.01920786 0.9996218 0 -0.02750252 0.9954166 0 -0.09563369 0.9975672 0 -0.06971121 0.9996218 0 -0.02750252 0.999635 0 -0.02701436 1 0 0 1 0 0 0.9999575 0 -0.009219495 0.9999877 0 -0.004968539 1 0 0 1 0 0 0.999993 0 -0.003759927 0.9999575 0 -0.009219495 0.9999575 0 -0.009219495 0.999993 0 -0.003759927 0.9998155 0 -0.01920786 0.9994698 0 -0.03256086 0.9999877 0 -0.004968539 0.9999575 0 -0.009219495 0.9994698 0 -0.03256086 0.9996955 0 -0.02467567 0.9844866 0 0.1754599 0.9903104 0 0.1388723 0.9974678 0 0.07111984 0.9981167 0 0.06134399 0.9903104 0 0.1388723 0.99847 0 0.05529641 0.9991748 0 0.04061933 0.9974678 0 0.07111984 0.9974678 0 0.07111984 0.9991748 0 0.04061933 0.9998028 0 0.01986079 0.9993436 0 0.03622689 0.9981167 0 0.06134399 0.9974678 0 0.07111984 0.9993436 0 0.03622689 0.999454 0 0.03304328 1 0 0 1 0 0 0.9999611 0 0.008821842 0.9999234 0 0.01238314 1 0 0 1 0 0 0.9999888 0 0.004736478 0.9999611 0 0.008821842 0.9999611 0 0.008821842 0.9999888 0 0.004736478 0.9998028 0 0.01986079 0.9991748 0 0.04061933 0.9999234 0 0.01238314 0.9999611 0 0.008821842 0.9991748 0 0.04061933 0.99847 0 0.05529641 1 0 0 0.999971 0 0.007615969 0.9999648 0 0.008397968 1 0 0 0.999971 0 0.007615969 0.999454 0 0.03304328 0.9993436 0 0.03622689 0.9999648 0 0.008397968 0.9999648 0 0.008397968 0.9993436 0 0.03622689 0.9998028 0 0.01986079 0.9999888 0 0.004736478 1 0 0 0.9999648 0 0.008397968 0.9999888 0 0.004736478 1 0 0 0.9981577 0 0.06067236 0.9986162 0 0.05259047 0.9995963 0 0.02841316 0.999622 0 0.02749278 0.9986162 0 0.05259047 0.9997482 0 0.0224443 0.9998649 0 0.01644096 0.9995963 0 0.02841316 0.9995963 0 0.02841316 0.9998649 0 0.01644096 0.9999686 0 0.007930527 0.9999053 0 0.01376517 0.999622 0 0.02749278 0.9995963 0 0.02841316 0.9999053 0 0.01376517 0.9999416 0 0.01081198 1 0 0 1 0 0 0.9999935 0 0.003611557 0.9999861 0 0.005293088 1 0 0 1 0 0 0.9999955 0 0.003034051 0.9999935 0 0.003611557 0.9999935 0 0.003611557 0.9999955 0 0.003034051 0.9999686 0 0.007930527 0.9998649 0 0.01644096 0.9999861 0 0.005293088 0.9999935 0 0.003611557 0.9998649 0 0.01644096 0.9997482 0 0.0224443 1 0 0 0.9999982 0 0.00197244 0.9999925 0 0.003864293 1 0 0 0.9999982 0 0.00197244 0.9999416 0 0.01081198 0.9999053 0 0.01376517 0.9999925 0 0.003864293 0.9999925 0 0.003864293 0.9999053 0 0.01376517 0.9999686 0 0.007930527 0.9999955 0 0.003034051 1 0 0 0.9999925 0 0.003864293 0.9999955 0 0.003034051 1 0 0 0.9994202 0 -0.03404864 0.9997305 0 -0.02321587 0.9996825 0 -0.02519781 0.9995314 0 -0.03060854 0.9997305 0 -0.02321587 0.9999237 0 -0.01235523 0.9998673 0 -0.01629109 0.9996825 0 -0.02519781 0.9996825 0 -0.02519781 0.9998673 0 -0.01629109 0.9999583 0 -0.009138478 0.9999173 0 -0.01286319 0.9995314 0 -0.03060854 0.9996825 0 -0.02519781 0.9999173 0 -0.01286319 0.9999011 0 -0.01406414 0.996245 0 0.08657958 0.9994953 0 0.03176843 0.9999958 0 -0.002894115 0.9999979 0 0.002068623 0.9994953 0 0.03176843 0.9998512 0 0.01725478 0.9999971 0 0.002420465 0.9999958 0 -0.002894115 0.9999958 0 -0.002894115 0.9999971 0 0.002420465 0.9999583 0 -0.009138478 0.9998673 0 -0.01629109 0.9999979 0 0.002068623 0.9999958 0 -0.002894115 0.9998673 0 -0.01629109 0.9999237 0 -0.01235523 1 0 0 0.9999933 0 -0.003680643 0.999998 0 -0.002027897 0.9999912 0 0.004211805 0.9999933 0 -0.003680643 0.9999011 0 -0.01406414 0.9999173 0 -0.01286319 0.999998 0 -0.002027897 0.999998 0 -0.002027897 0.9999173 0 -0.01286319 0.9999583 0 -0.009138478 0.9999971 0 0.002420465 0.9999912 0 0.004211805 0.999998 0 -0.002027897 0.9999971 0 0.002420465 0.9998512 0 0.01725478 0.9908091 0 -0.1352684 0.998679 0 -0.05138427 0.9979299 0 -0.06431107 0.9959199 0 -0.09024207 0.998679 0 -0.05138427 0.9997473 0 -0.02248242 0.999572 0 -0.02925651 0.9979299 0 -0.06431107 0.9979299 0 -0.06431107 0.999572 0 -0.02925651 0.9998461 0 -0.01754467 0.9996659 0 -0.02584925 0.9959199 0 -0.09024207 0.9979299 0 -0.06431107 0.9996659 0 -0.02584925 0.9996621 0 -0.02599741 0.9994202 0 -0.03404864 0.9998847 0 -0.01518664 0.9999574 0 -0.009231769 0.9999724 0 -0.007427325 0.9998847 0 -0.01518664 0.9999705 0 -0.007684279 0.9999867 0 -0.005153351 0.9999574 0 -0.009231769 0.9999574 0 -0.009231769 0.9999867 0 -0.005153351 0.9998461 0 -0.01754467 0.999572 0 -0.02925651 0.9999724 0 -0.007427325 0.9999574 0 -0.009231769 0.999572 0 -0.02925651 0.9997473 0 -0.02248242 1 0 0 0.9999881 0 -0.0049004 0.9999762 0 -0.00691915 0.9999985 0 -0.001770907 0.9999881 0 -0.0049004 0.9996621 0 -0.02599741 0.9996659 0 -0.02584925 0.9999762 0 -0.00691915 0.9999762 0 -0.00691915 0.9996659 0 -0.02584925 0.9998461 0 -0.01754467 0.9999867 0 -0.005153351 0.9999985 0 -0.001770907 0.9999762 0 -0.00691915 0.9999867 0 -0.005153351 0.9999705 0 -0.007684279 0.9939183 0 -0.1101202 0.9952523 0 -0.0973288 0.998476 0 -0.05518787 0.9987175 0 -0.05062972 0.9952523 0 -0.0973288 0.9991517 0 -0.04118062 0.9995207 0 -0.03096169 0.998476 0 -0.05518787 0.998476 0 -0.05518787 0.9995207 0 -0.03096169 0.9998842 0 -0.01521961 0.999606 0 -0.02807245 0.9987175 0 -0.05062972 0.998476 0 -0.05518787 0.999606 0 -0.02807245 0.9996786 0 -0.02535072 1 0 0 1 0 0 0.9999783 0 -0.006601191 0.9999548 0 -0.009510972 1 0 0 1 0 0 0.9999935 0 -0.003630093 0.9999783 0 -0.006601191 0.9999783 0 -0.006601191 0.9999935 0 -0.003630093 0.9998842 0 -0.01521961 0.9995207 0 -0.03096169 0.9999548 0 -0.009510972 0.9999783 0 -0.006601191 0.9995207 0 -0.03096169 0.9991517 0 -0.04118062 1 0 0 0.9999844 0 -0.005603025 0.9999795 0 -0.006415477 1 0 0 0.9999844 0 -0.005603025 0.9996786 0 -0.02535072 0.999606 0 -0.02807245 0.9999795 0 -0.006415477 0.9999795 0 -0.006415477 0.999606 0 -0.02807245 0.9998842 0 -0.01521961 0.9999935 0 -0.003630093 1 0 0 0.9999795 0 -0.006415477 0.9999935 0 -0.003630093 1 0 0 0.9981178 0 0.06132749 0.9986141 0 0.05263024 0.9996052 0 0.02809802 0.9996954 0 0.02468202 0.9986141 0 0.05263024 0.9997564 0 0.02207579 0.9998719 0 0.01601496 0.9996052 0 0.02809802 0.9996052 0 0.02809802 0.9998719 0 0.01601496 0.9999688 0 0.007914401 0.9999189 0 0.01274377 0.9996954 0 0.02468202 0.9996052 0 0.02809802 0.9999189 0 0.01274377 0.9999244 0 0.01229476 1 0 0 1 0 0 0.999994 0 0.003476503 0.9999869 0 0.005125196 1 0 0 1 0 0 0.9999949 0 0.003204371 0.999994 0 0.003476503 0.999994 0 0.003476503 0.9999949 0 0.003204371 0.9999688 0 0.007914401 0.9998719 0 0.01601496 0.9999869 0 0.005125196 0.999994 0 0.003476503 0.9998719 0 0.01601496 0.9997564 0 0.02207579 1 0 0 0.9999966 0 0.002619098 0.9999971 0 0.002432804 1 0 0 0.9999966 0 0.002619098 0.9999244 0 0.01229476 0.9999189 0 0.01274377 0.9999971 0 0.002432804 0.9999971 0 0.002432804 0.9999189 0 0.01274377 0.9999688 0 0.007914401 0.9999949 0 0.003204371 1 0 0 0.9999971 0 0.002432804 0.9999949 0 0.003204371 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9996312 0 0.02715787 0.9998932 0 -0.01461857 0.9993297 0 -0.03660866 0.9975692 0 -0.06968381 0.9998932 0 -0.01461857 0.9985355 0 -0.05410007 0.9976535 0 -0.06846631 0.9993297 0 -0.03660866 0.9993297 0 -0.03660866 0.9976535 0 -0.06846631 0.9992387 0 -0.0390145 0.9998346 0 -0.01819146 0.9975692 0 -0.06968381 0.9993297 0 -0.03660866 0.9998346 0 -0.01819146 0.9996893 0 -0.0249249 0.9627821 0 -0.2702792 0.9832857 0 -0.1820696 0.9864798 0 -0.1638832 0.9879134 0 -0.1550067 0.9832857 0 -0.1820696 0.9986457 0 -0.05202674 0.998613 0 -0.05265175 0.9864798 0 -0.1638832 0.9864798 0 -0.1638832 0.998613 0 -0.05265175 0.9992387 0 -0.0390145 0.9976535 0 -0.06846631 0.9879134 0 -0.1550067 0.9864798 0 -0.1638832 0.9976535 0 -0.06846631 0.9985355 0 -0.05410007 1 0 0 0.9999914 0 -0.004168725 0.9999058 0 -0.01372652 0.9999553 0 -0.009454342 0.9999914 0 -0.004168725 0.9996893 0 -0.0249249 0.9998346 0 -0.01819146 0.9999058 0 -0.01372652 0.9999058 0 -0.01372652 0.9998346 0 -0.01819146 0.9992387 0 -0.0390145 0.998613 0 -0.05265175 0.9999553 0 -0.009454342 0.9999058 0 -0.01372652 0.998613 0 -0.05265175 0.9986457 0 -0.05202674 0.9995998 0 0.02829219 0.9999998 0 -7.23013e-4 0.9998528 0 0.01716057 0.9994346 0 0.03362282 0.9999998 0 -7.23013e-4 0.9999999 0 -5.36654e-4 0.9999864 0 0.005228527 0.9998528 0 0.01716057 0.9998528 0 0.01716057 0.9999864 0 0.005228527 0.9999927 0 0.003820161 0.9999731 0 0.007352978 0.9994346 0 0.03362282 0.9998528 0 0.01716057 0.9999731 0 0.007352978 0.9999298 0 0.01185445 1 0 0 1 0 0 0.9999989 0 0.001471263 0.9999999 0 -5.49798e-4 1 0 0 1 0 0 1 0 1.58928e-4 0.9999989 0 0.001471263 0.9999989 0 0.001471263 1 0 1.58928e-4 0.9999927 0 0.003820161 0.9999864 0 0.005228527 0.9999999 0 -5.49798e-4 0.9999989 0 0.001471263 0.9999864 0 0.005228527 0.9999999 0 -5.36654e-4 1 0 0 0.9999971 0 0.002449128 0.9999991 0 0.001365493 1 0 0 0.9999971 0 0.002449128 0.9999298 0 0.01185445 0.9999731 0 0.007352978 0.9999991 0 0.001365493 0.9999991 0 0.001365493 0.9999731 0 0.007352978 0.9999927 0 0.003820161 1 0 1.58928e-4 1 0 0 0.9999991 0 0.001365493 1 0 1.58928e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9740844 0 -0.226185 0.9999884 0 -0.004832483 0.9991875 0 -0.04030405 0.9896679 0 -0.143379 0.9999884 0 -0.004832483 0.9999846 0 -0.005552977 0.9998915 0 -0.01473076 0.9991875 0 -0.04030405 0.9991875 0 -0.04030405 0.9998915 0 -0.01473076 0.9999861 0 -0.005271368 0.9998117 0 -0.01940672 0.9896679 0 -0.143379 0.9991875 0 -0.04030405 0.9998117 0 -0.01940672 0.9980931 0 -0.06172637 1 0 0 1 0 0 0.9999922 0 -0.003964943 0.9999972 0 -0.002378395 1 0 0 1 0 0 0.9999997 0 8.47985e-4 0.9999922 0 -0.003964943 0.9999922 0 -0.003964943 0.9999997 0 8.47985e-4 0.9999861 0 -0.005271368 0.9998915 0 -0.01473076 0.9999972 0 -0.002378395 0.9999922 0 -0.003964943 0.9998915 0 -0.01473076 0.9999846 0 -0.005552977 1 0 0 0.9999414 0 -0.01082615 0.9999866 0 -0.005171743 1 0 0 0.9999414 0 -0.01082615 0.9980931 0 -0.06172637 0.9998117 0 -0.01940672 0.9999866 0 -0.005171743 0.9999866 0 -0.005171743 0.9998117 0 -0.01940672 0.9999861 0 -0.005271368 0.9999997 0 8.47985e-4 1 0 0 0.9999866 0 -0.005171743 0.9999997 0 8.47985e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9992358 0 -0.03908723 0.9997463 0 -0.02252954 0.9995118 0 -0.03124303 0.9998569 0 -0.01691968 0.9997463 0 -0.02252954 0.9947353 0 -0.1024786 0.9931467 0 -0.1168748 0.9995118 0 -0.03124303 0.9995118 0 -0.03124303 0.9931467 0 -0.1168748 0.9967837 0 -0.08013945 0.9997955 0 -0.02022542 0.9998569 0 -0.01691968 0.9995118 0 -0.03124303 0.9997955 0 -0.02022542 0.9999827 0 -0.005881785 0.8982904 0 -0.4394024 0.9402841 0 -0.3403908 0.9638403 0 -0.2664806 0.9638042 0 -0.266611 0.9402841 0 -0.3403908 0.9929114 0 -0.118857 0.9956958 0 -0.09268197 0.9638403 0 -0.2664806 0.9638403 0 -0.2664806 0.9956958 0 -0.09268197 0.9967837 0 -0.08013945 0.9931467 0 -0.1168748 0.9638042 0 -0.266611 0.9638403 0 -0.2664806 0.9931467 0 -0.1168748 0.9947353 0 -0.1024786 1 0 0 0.9999995 0 -0.001028423 0.9997241 0 -0.02349345 0.9997492 0 -0.02239379 0.9999995 0 -0.001028423 0.9999827 0 -0.005881785 0.9997955 0 -0.02022542 0.9997241 0 -0.02349345 0.9997241 0 -0.02349345 0.9997955 0 -0.02022542 0.9967837 0 -0.08013945 0.9956958 0 -0.09268197 0.9997492 0 -0.02239379 0.9997241 0 -0.02349345 0.9956958 0 -0.09268197 0.9929114 0 -0.118857 0.9740844 0 -0.226185 0.9988642 0 0.0476486 0.9996532 0 0.02633902 0.9999884 0 -0.004832483 0.9988642 0 0.0476486 0.999999 0 -0.00148558 0.9999999 0 -3.34988e-4 0.9996532 0 0.02633902 0.9996532 0 0.02633902 0.9999999 0 -3.34988e-4 0.9999923 0 -0.003942457 0.9998578 0 0.01686227 0.9999884 0 -0.004832483 0.9996532 0 0.02633902 0.9998578 0 0.01686227 0.9999846 0 -0.005552977 0.9992358 0 -0.03908723 0.9993553 0 -0.03590414 0.999704 0 -0.02433251 0.9993855 0 -0.03505119 0.9993553 0 -0.03590414 0.9998246 0 -0.01873213 0.9999288 0 -0.01194049 0.999704 0 -0.02433251 0.999704 0 -0.02433251 0.9999288 0 -0.01194049 0.9999923 0 -0.003942457 0.9999999 0 -3.34988e-4 0.9993855 0 -0.03505119 0.999704 0 -0.02433251 0.9999999 0 -3.34988e-4 0.999999 0 -0.00148558 1 0 0 0.9999972 0 -0.002378395 0.9999972 0 0.002378091 0.9999856 0 -0.005385565 0.9999972 0 -0.002378395 0.9999846 0 -0.005552977 0.9998578 0 0.01686227 0.9999972 0 0.002378091 0.9999972 0 0.002378091 0.9998578 0 0.01686227 0.9999923 0 -0.003942457 0.9999288 0 -0.01194049 0.9999856 0 -0.005385565 0.9999972 0 0.002378091 0.9999288 0 -0.01194049 0.9998246 0 -0.01873213 0.9995998 0 0.02829219 0.9999999 0 -6.52659e-4 0.9999695 0 0.007824892 0.9999998 0 -7.23013e-4 0.9999999 0 -6.52659e-4 0.9982972 0 0.05833451 0.9989734 0 0.04529991 0.9999695 0 0.007824892 0.9999695 0 0.007824892 0.9989734 0 0.04529991 0.9998336 0 0.01824543 0.9999942 0 0.003418387 0.9999998 0 -7.23013e-4 0.9999695 0 0.007824892 0.9999942 0 0.003418387 0.9999999 0 -5.36654e-4 0.9998681 0 0.01624623 0.9901412 0 0.1400736 0.9955506 0 0.09422904 0.9876441 0 0.1567137 0.9901412 0 0.1400736 0.9976427 0 0.06862319 0.9989974 0 0.04476793 0.9955506 0 0.09422904 0.9955506 0 0.09422904 0.9989974 0 0.04476793 0.9998336 0 0.01824543 0.9989734 0 0.04529991 0.9876441 0 0.1567137 0.9955506 0 0.09422904 0.9989734 0 0.04529991 0.9982972 0 0.05833451 1 0 0 0.9999999 0 -5.49798e-4 0.9999627 0 0.008641046 0.9998431 0 0.01771826 0.9999999 0 -5.49798e-4 0.9999999 0 -5.36654e-4 0.9999942 0 0.003418387 0.9999627 0 0.008641046 0.9999627 0 0.008641046 0.9999942 0 0.003418387 0.9998336 0 0.01824543 0.9989974 0 0.04476793 0.9998431 0 0.01771826 0.9999627 0 0.008641046 0.9989974 0 0.04476793 0.9976427 0 0.06862319 0.984786 0 -0.1737721 0.9863288 0 -0.1647899 0.9929695 0 -0.1183713 0.9983772 0 -0.05694751 0.9863288 0 -0.1647899 0.9975848 0 -0.06946055 0.9980237 0 -0.06283983 0.9929695 0 -0.1183713 0.9929695 0 -0.1183713 0.9980237 0 -0.06283983 0.9993405 0 -0.03631408 0.9991747 0 -0.04061988 0.9983772 0 -0.05694751 0.9929695 0 -0.1183713 0.9991747 0 -0.04061988 0.9997855 0 -0.02071619 1 0 0 1 0 0 0.9998881 0 -0.01496414 0.9998649 0 -0.01644049 1 0 0 1 0 0 0.9999697 0 -0.007800669 0.9998881 0 -0.01496414 0.9998881 0 -0.01496414 0.9999697 0 -0.007800669 0.9993405 0 -0.03631408 0.9980237 0 -0.06283983 0.9998649 0 -0.01644049 0.9998881 0 -0.01496414 0.9980237 0 -0.06283983 0.9975848 0 -0.06946055 1 0 0 0.9999911 0 -0.004232885 0.9999595 0 -0.009010696 1 0 0 0.9999911 0 -0.004232885 0.9997855 0 -0.02071619 0.9991747 0 -0.04061988 0.9999595 0 -0.009010696 0.9999595 0 -0.009010696 0.9991747 0 -0.04061988 0.9993405 0 -0.03631408 0.9999697 0 -0.007800669 1 0 0 0.9999595 0 -0.009010696 0.9999697 0 -0.007800669 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999328 0 0.01160175 0.9974759 0 0.07100715 0.9995898 0 0.02864254 0.9996102 0 0.0279181 0.9974759 0 0.07100715 0.999997 0 -0.002472345 0.9998109 0 -0.01944888 0.9995898 0 0.02864254 0.9995898 0 0.02864254 0.9998109 0 -0.01944888 0.999866 0 -0.01637555 0.9999252 0 0.01223653 0.9996102 0 0.0279181 0.9995898 0 0.02864254 0.9999252 0 0.01223653 0.999979 0 0.006491994 0.9963147 0 -0.08577371 0.9996374 0 -0.02692852 0.9966814 0 -0.08140261 0.9941362 0 -0.1081358 0.9996374 0 -0.02692852 0.9999175 0 -0.0128454 0.9994725 0 -0.03247673 0.9966814 0 -0.08140261 0.9966814 0 -0.08140261 0.9994725 0 -0.03247673 0.999866 0 -0.01637555 0.9998109 0 -0.01944888 0.9941362 0 -0.1081358 0.9966814 0 -0.08140261 0.9998109 0 -0.01944888 0.999997 0 -0.002472345 1 0 0 0.9999985 0 0.001791805 0.9999853 0 -0.00544023 0.9999984 0 -0.001841426 0.9999985 0 0.001791805 0.999979 0 0.006491994 0.9999252 0 0.01223653 0.9999853 0 -0.00544023 0.9999853 0 -0.00544023 0.9999252 0 0.01223653 0.999866 0 -0.01637555 0.9994725 0 -0.03247673 0.9999984 0 -0.001841426 0.9999853 0 -0.00544023 0.9994725 0 -0.03247673 0.9999175 0 -0.0128454 1 0 0 0.9998649 0 -0.01644049 0.9998693 0 -0.01616828 0.999997 0 -0.002468506 0.9998649 0 -0.01644049 0.9975848 0 -0.06946055 0.9982553 0 -0.05904618 0.9998693 0 -0.01616828 0.9998693 0 -0.01616828 0.9982553 0 -0.05904618 0.998462 0 -0.0554409 0.9996206 0 -0.02754542 0.999997 0 -0.002468506 0.9998693 0 -0.01616828 0.9996206 0 -0.02754542 0.9999754 0 -0.007021162 0.984786 0 -0.1737721 0.9846776 0 -0.174385 0.9932003 0 -0.1164185 0.9863288 0 -0.1647899 0.9846776 0 -0.174385 0.9948359 0 -0.1014966 0.9958871 0 -0.09060293 0.9932003 0 -0.1164185 0.9932003 0 -0.1164185 0.9958871 0 -0.09060293 0.998462 0 -0.0554409 0.9982553 0 -0.05904618 0.9863288 0 -0.1647899 0.9932003 0 -0.1164185 0.9982553 0 -0.05904618 0.9975848 0 -0.06946055 0.9998225 0 0.01883977 0.9994946 0 -0.0317907 0.9986079 0 -0.05274847 0.9972472 0 -0.07414892 0.9994946 0 -0.0317907 0.9999754 0 -0.007021162 0.9996206 0 -0.02754542 0.9986079 0 -0.05274847 0.9986079 0 -0.05274847 0.9996206 0 -0.02754542 0.998462 0 -0.0554409 0.9958871 0 -0.09060293 0.9972472 0 -0.07414892 0.9986079 0 -0.05274847 0.9958871 0 -0.09060293 0.9948359 0 -0.1014966 0.9670391 0 0.254628 0.9838363 0 0.1790709 0.999285 0 0.03780822 0.9899748 0 0.1412445 0.9838363 0 0.1790709 0.9999401 0 0.01095122 0.9996953 0 -0.02468543 0.999285 0 0.03780822 0.999285 0 0.03780822 0.9996953 0 -0.02468543 0.9999989 0 -0.001526937 0.999542 0 0.03026288 0.9899748 0 0.1412445 0.999285 0 0.03780822 0.999542 0 0.03026288 0.999254 0 0.03862027 0.9908091 0 -0.1352684 0.9959199 0 -0.09024207 0.9968459 0 -0.07936166 0.9971284 0 -0.07572991 0.9959199 0 -0.09024207 0.9996621 0 -0.02599741 0.9997119 0 -0.02400321 0.9968459 0 -0.07936166 0.9968459 0 -0.07936166 0.9997119 0 -0.02400321 0.9999989 0 -0.001526937 0.9996953 0 -0.02468543 0.9971284 0 -0.07572991 0.9968459 0 -0.07936166 0.9996953 0 -0.02468543 0.9999401 0 0.01095122 1 0 0 0.999974 0 0.007210871 0.9999984 0 0.001791019 0.9999881 0 -0.0049004 0.999974 0 0.007210871 0.999254 0 0.03862027 0.999542 0 0.03026288 0.9999984 0 0.001791019 0.9999984 0 0.001791019 0.999542 0 0.03026288 0.9999989 0 -0.001526937 0.9997119 0 -0.02400321 0.9999881 0 -0.0049004 0.9999984 0 0.001791019 0.9997119 0 -0.02400321 0.9996621 0 -0.02599741 1 0 0 1 0 0 0.9999441 0 0.01058058 0.999974 0 0.007210871 1 0 0 1 0 0 0.9999797 0 0.006386515 0.9999441 0 0.01058058 0.9999441 0 0.01058058 0.9999797 0 0.006386515 0.9995021 0 0.03155454 0.9990655 0 0.04322232 0.999974 0 0.007210871 0.9999441 0 0.01058058 0.9990655 0 0.04322232 0.999254 0 0.03862027 1 0 0 0.9999622 0 0.008703761 0.9998875 0 0.01500465 1 0 0 0.9999622 0 0.008703761 0.9990725 0 0.04306044 0.9985327 0 0.05415211 0.9998875 0 0.01500465 0.9998875 0 0.01500465 0.9985327 0 0.05415211 0.9995021 0 0.03155454 0.9999797 0 0.006386515 1 0 0 0.9998875 0 0.01500465 0.9999797 0 0.006386515 1 0 0 0.9670391 0 0.254628 0.9899748 0 0.1412445 0.9940949 0 0.108515 0.9951869 0 0.09799607 0.9899748 0 0.1412445 0.999254 0 0.03862027 0.9990655 0 0.04322232 0.9940949 0 0.108515 0.9940949 0 0.108515 0.9990655 0 0.04322232 0.9995021 0 0.03155454 0.9985327 0 0.05415211 0.9951869 0 0.09799607 0.9940949 0 0.108515 0.9985327 0 0.05415211 0.9990725 0 0.04306044 1 0 0 0.9999145 0 -0.0130777 0.9998868 0 -0.01504915 0.9999999 0 4.10736e-4 0.9999145 0 -0.0130777 0.9974862 0 -0.07086123 0.9981215 0 -0.06126712 0.9998868 0 -0.01504915 0.9998868 0 -0.01504915 0.9981215 0 -0.06126712 0.998836 0 -0.04823701 0.9998923 0 -0.01468083 0.9999999 0 4.10736e-4 0.9998868 0 -0.01504915 0.9998923 0 -0.01468083 0.9999996 0 8.97983e-4 0.9418972 0 -0.3359014 0.9922898 0 -0.1239396 0.9889309 0 -0.1483771 0.9749998 0 -0.2222058 0.9922898 0 -0.1239396 0.9982988 0 -0.05830511 0.9979619 0 -0.06381287 0.9889309 0 -0.1483771 0.9889309 0 -0.1483771 0.9979619 0 -0.06381287 0.998836 0 -0.04823701 0.9981215 0 -0.06126712 0.9749998 0 -0.2222058 0.9889309 0 -0.1483771 0.9981215 0 -0.06126712 0.9974862 0 -0.07086123 0.9999819 0 0.006024945 1 0 1.29797e-4 0.9997119 0 -0.024004 0.9998274 0 -0.01858355 1 0 1.29797e-4 0.9999996 0 8.97983e-4 0.9998923 0 -0.01468083 0.9997119 0 -0.024004 0.9997119 0 -0.024004 0.9998923 0 -0.01468083 0.998836 0 -0.04823701 0.9979619 0 -0.06381287 0.9998274 0 -0.01858355 0.9997119 0 -0.024004 0.9979619 0 -0.06381287 0.9982988 0 -0.05830511 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999997 0 7.75746e-4 0.9999997 0 8.21801e-4 1 0 0 1 0 0 0.9999998 0 7.90212e-4 0.9999997 0 7.75746e-4 0.9999997 0 7.75746e-4 0.9999998 0 7.90212e-4 0.9999972 0 0.002376741 0.9999938 0 0.00352145 0.9999997 0 8.21801e-4 0.9999997 0 7.75746e-4 0.9999938 0 0.00352145 0.9999929 0 0.003781974 1 0 0 0.9999992 0 0.001284363 0.9999995 0 0.001107414 1 0 0 0.9999992 0 0.001284363 0.999989 0 0.004682091 0.9999906 0 0.004324153 0.9999995 0 0.001107414 0.9999995 0 0.001107414 0.9999906 0 0.004324153 0.9999972 0 0.002376741 0.9999998 0 7.90212e-4 1 0 0 0.9999995 0 0.001107414 0.9999998 0 7.90212e-4 1 0 0 0.9999819 0 0.006024945 0.9999575 0 0.009223326 0.9999753 0 0.007026309 0.9999573 0 0.009242021 0.9999575 0 0.009223326 0.9999929 0 0.003781974 0.9999938 0 0.00352145 0.9999753 0 0.007026309 0.9999753 0 0.007026309 0.9999938 0 0.00352145 0.9999972 0 0.002376741 0.9999906 0 0.004324153 0.9999573 0 0.009242021 0.9999753 0 0.007026309 0.9999906 0 0.004324153 0.999989 0 0.004682091 0.9999819 0 0.006024945 0.9999573 0 0.009242021 0.9999896 0 0.004555798 1 0 1.29797e-4 0.9999573 0 0.009242021 0.999989 0 0.004682091 0.9999959 0 0.002868707 0.9999896 0 0.004555798 0.9999896 0 0.004555798 0.9999959 0 0.002868707 0.9999992 0 0.00126359 0.9999967 0 0.002559159 1 0 1.29797e-4 0.9999896 0 0.004555798 0.9999967 0 0.002559159 0.9999996 0 8.97983e-4 1 0 0 1 0 0 0.9999998 0 6.92175e-4 0.9999992 0 0.001284363 1 0 0 1 0 0 1 0 1.30957e-4 0.9999998 0 6.92175e-4 0.9999998 0 6.92175e-4 1 0 1.30957e-4 0.9999992 0 0.00126359 0.9999959 0 0.002868707 0.9999992 0 0.001284363 0.9999998 0 6.92175e-4 0.9999959 0 0.002868707 0.999989 0 0.004682091 1 0 0 0.9999999 0 4.10736e-4 0.9999998 0 6.35303e-4 1 0 0 0.9999999 0 4.10736e-4 0.9999996 0 8.97983e-4 0.9999967 0 0.002559159 0.9999998 0 6.35303e-4 0.9999998 0 6.35303e-4 0.9999967 0 0.002559159 0.9999992 0 0.00126359 1 0 1.30957e-4 1 0 0 0.9999998 0 6.35303e-4 1 0 1.30957e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999993 0 -0.001186864 0.9999974 0 -0.002308159 1 0 0 1 0 0 1 0 0 0.9999993 0 -0.001186864 0.9999993 0 -0.001186864 1 0 0 0.9999937 0 -0.00354251 0.9999763 0 -0.006888633 0.9999974 0 -0.002308159 0.9999993 0 -0.001186864 0.9999763 0 -0.006888633 0.9999341 0 -0.01148487 1 0 0 0.9999999 0 5.11692e-4 0.999999 0 -0.001425348 1 0 0 0.9999999 0 5.11692e-4 0.9999999 0 5.35191e-4 0.9999866 0 -0.005187594 0.999999 0 -0.001425348 0.999999 0 -0.001425348 0.9999866 0 -0.005187594 0.9999937 0 -0.00354251 1 0 0 1 0 0 0.999999 0 -0.001425348 1 0 0 1 0 0 0.9995998 0 -0.02828729 0.9994439 0 -0.03334556 0.9998561 0 -0.01696736 0.9999998 0 7.39891e-4 0.9994439 0 -0.03334556 0.9999341 0 -0.01148487 0.9999763 0 -0.006888633 0.9998561 0 -0.01696736 0.9998561 0 -0.01696736 0.9999763 0 -0.006888633 0.9999937 0 -0.00354251 0.9999866 0 -0.005187594 0.9999998 0 7.39891e-4 0.9998561 0 -0.01696736 0.9999866 0 -0.005187594 0.9999999 0 5.35191e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999819 0 0.006021917 0.9999357 0 0.01134132 1 0 0 1 0 0 1 0 4.00575e-4 0.9999819 0 0.006021917 0.9999819 0 0.006021917 1 0 4.00575e-4 0.9999779 0 0.006639176 0.999771 0 0.02140445 0.9999357 0 0.01134132 0.9999819 0 0.006021917 0.999771 0 0.02140445 0.9980874 0 0.06181927 1 0 0 0.9999973 0 0.002349806 0.9999925 0 0.003874466 1 0 0 0.9999973 0 0.002349806 0.9999855 0 0.005389479 0.9998735 0 0.01590552 0.9999925 0 0.003874466 0.9999925 0 0.003874466 0.9998735 0 0.01590552 0.9999779 0 0.006639176 1 0 4.00575e-4 1 0 0 0.9999925 0 0.003874466 1 0 4.00575e-4 1 0 0 0.974092 0 0.2261525 0.9897177 0 0.1430347 0.9991421 0 0.04141565 0.9999889 0 0.004728409 0.9897177 0 0.1430347 0.9980874 0 0.06181927 0.999771 0 0.02140445 0.9991421 0 0.04141565 0.9991421 0 0.04141565 0.999771 0 0.02140445 0.9999779 0 0.006639176 0.9998735 0 0.01590552 0.9999889 0 0.004728409 0.9991421 0 0.04141565 0.9998735 0 0.01590552 0.9999855 0 0.005389479 0.974092 0 0.2261525 0.9178501 0 0.3969274 0.9600316 0 0.2798918 0.9897177 0 0.1430347 0.9178501 0 0.3969274 0.9310483 0 0.3648961 0.9650548 0 0.2620487 0.9600316 0 0.2798918 0.9600316 0 0.2798918 0.9650548 0 0.2620487 0.9891523 0 0.1468944 0.994137 0 0.1081281 0.9897177 0 0.1430347 0.9600316 0 0.2798918 0.994137 0 0.1081281 0.9980874 0 0.06181927 0.9998672 0 -0.01630293 0.9993163 0 -0.03697535 0.9882965 0 0.1525451 0.9577442 0 0.2876214 0.9993163 0 -0.03697535 0.9999121 0 -0.01326744 0.9984285 0 0.05604259 0.9882965 0 0.1525451 0.9882965 0 0.1525451 0.9984285 0 0.05604259 0.9891523 0 0.1468944 0.9650548 0 0.2620487 0.9577442 0 0.2876214 0.9882965 0 0.1525451 0.9650548 0 0.2620487 0.9310483 0 0.3648961 1 0 0 0.9999357 0 0.01134132 0.9995358 0 0.03046869 0.9999874 0 -0.00504062 0.9999357 0 0.01134132 0.9980874 0 0.06181927 0.994137 0 0.1081281 0.9995358 0 0.03046869 0.9995358 0 0.03046869 0.994137 0 0.1081281 0.9891523 0 0.1468944 0.9984285 0 0.05604259 0.9999874 0 -0.00504062 0.9995358 0 0.03046869 0.9984285 0 0.05604259 0.9999121 0 -0.01326744 1 0 0 0.9998237 0 0.01877853 0.9995465 0 0.03011357 0.9999996 0 8.6946e-4 0.9998237 0 0.01877853 0.9949641 0 0.1002326 0.9920291 0 0.1260096 0.9995465 0 0.03011357 0.9995465 0 0.03011357 0.9920291 0 0.1260096 0.9966544 0 0.08173255 0.9997932 0 0.02033423 0.9999996 0 8.6946e-4 0.9995465 0 0.03011357 0.9997932 0 0.02033423 0.9999849 0 0.005515533 0.898286 0 0.4394111 0.9638041 0 0.2666114 0.9603624 0 0.2787544 0.9504045 0 0.3110168 0.9638041 0 0.2666114 0.9947433 0 0.1024005 0.993099 0 0.1172791 0.9603624 0 0.2787544 0.9603624 0 0.2787544 0.993099 0 0.1172791 0.9966544 0 0.08173255 0.9920291 0 0.1260096 0.9504045 0 0.3110168 0.9603624 0 0.2787544 0.9920291 0 0.1260096 0.9949641 0 0.1002326 0.9992346 0 0.03912016 0.9998599 0 0.01674236 0.9995127 0 0.0312165 0.999746 0 0.02253644 0.9998599 0 0.01674236 0.9999849 0 0.005515533 0.9997932 0 0.02033423 0.9995127 0 0.0312165 0.9995127 0 0.0312165 0.9997932 0 0.02033423 0.9966544 0 0.08173255 0.993099 0 0.1172791 0.999746 0 0.02253644 0.9995127 0 0.0312165 0.993099 0 0.1172791 0.9947433 0 0.1024005 1 0 0 1 0 0 0.9999985 0 -0.001812572 0.999997 0 0.002476186 1 0 0 1 0 0 0.9999988 0 -0.001557294 0.9999985 0 -0.001812572 0.9999985 0 -0.001812572 0.9999988 0 -0.001557294 1 0 1.21542e-4 0.9999967 0 -0.002595719 0.999997 0 0.002476186 0.9999985 0 -0.001812572 0.9999967 0 -0.002595719 0.9999726 0 0.007406521 1 0 0 0.9999996 0 9.2707e-4 0.999999 0 0.001462822 1 0 0 0.9999996 0 9.2707e-4 0.9999925 0 -0.003891198 0.9999986 0 0.001706324 0.999999 0 0.001462822 0.999999 0 0.001462822 0.9999986 0 0.001706324 1 0 1.21542e-4 0.9999988 0 -0.001557294 1 0 0 0.999999 0 0.001462822 0.9999988 0 -0.001557294 1 0 0 0.9998223 0 -0.01885335 0.9994853 0 0.03208454 0.9999983 0 0.001820551 0.9998447 0 -0.0176233 0.9994853 0 0.03208454 0.9999726 0 0.007406521 0.9999967 0 -0.002595719 0.9999983 0 0.001820551 0.9999983 0 0.001820551 0.9999967 0 -0.002595719 1 0 1.21542e-4 0.9999986 0 0.001706324 0.9998447 0 -0.0176233 0.9999983 0 0.001820551 0.9999986 0 0.001706324 0.9999925 0 -0.003891198 1 0 0 0.9999986 0 0.001722295 0.9999861 0 0.005286735 0.9999985 0 -0.00176268 0.9999986 0 0.001722295 0.9999217 0 0.01252065 0.999482 0 0.03218311 0.9999861 0 0.005286735 0.9999861 0 0.005286735 0.999482 0 0.03218311 0.9998667 0 0.01633145 0.9999261 0 -0.01215887 0.9999985 0 -0.00176268 0.9999861 0 0.005286735 0.9999261 0 -0.01215887 0.9999796 0 -0.006393278 0.9963148 0 0.08577254 0.9941363 0 0.1081344 0.99669 0 0.08129621 0.9996417 0 0.02676813 0.9941363 0 0.1081344 0.9999971 0 0.002457688 0.9998105 0 0.01946907 0.99669 0 0.08129621 0.99669 0 0.08129621 0.9998105 0 0.01946907 0.9998667 0 0.01633145 0.999482 0 0.03218311 0.9996417 0 0.02676813 0.99669 0 0.08129621 0.999482 0 0.03218311 0.9999217 0 0.01252065 0.9999328 0 -0.01158967 0.9996121 0 -0.0278497 0.9995893 0 -0.02865808 0.997476 0 -0.07100523 0.9996121 0 -0.0278497 0.9999796 0 -0.006393278 0.9999261 0 -0.01215887 0.9995893 0 -0.02865808 0.9995893 0 -0.02865808 0.9999261 0 -0.01215887 0.9998667 0 0.01633145 0.9998105 0 0.01946907 0.997476 0 -0.07100523 0.9995893 0 -0.02865808 0.9998105 0 0.01946907 0.9999971 0 0.002457688 0.9999328 0 -0.01158967 0.9991961 0 0.0400889 0.9997107 0 0.02405773 0.9996121 0 -0.0278497 0.9991961 0 0.0400889 0.9995117 0 -0.03124885 0.9999007 0 -0.0140957 0.9997107 0 0.02405773 0.9997107 0 0.02405773 0.9999007 0 -0.0140957 0.9999934 0 -0.003643503 0.9999903 0 0.004425245 0.9996121 0 -0.0278497 0.9997107 0 0.02405773 0.9999903 0 0.004425245 0.9999796 0 -0.006393278 0.9998223 0 -0.01885335 0.9984701 0 -0.05529651 0.9987366 0 -0.05025351 0.9956599 0 -0.09306638 0.9984701 0 -0.05529651 0.9997121 0 -0.02399765 0.999768 0 -0.02154124 0.9987366 0 -0.05025351 0.9987366 0 -0.05025351 0.999768 0 -0.02154124 0.9999934 0 -0.003643503 0.9999007 0 -0.0140957 0.9956599 0 -0.09306638 0.9987366 0 -0.05025351 0.9999007 0 -0.0140957 0.9995117 0 -0.03124885 1 0 0 0.9999985 0 -0.00176268 0.9999975 0 -0.00226407 0.9999858 0 -0.005330923 0.9999985 0 -0.00176268 0.9999796 0 -0.006393278 0.9999903 0 0.004425245 0.9999975 0 -0.00226407 0.9999975 0 -0.00226407 0.9999903 0 0.004425245 0.9999934 0 -0.003643503 0.999768 0 -0.02154124 0.9999858 0 -0.005330923 0.9999975 0 -0.00226407 0.999768 0 -0.02154124 0.9997121 0 -0.02399765 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999179 0 0.01282408 0.9999866 0 0.005177595 1 0 0 1 0 0 0.999966 0 0.008251145 0.9999179 0 0.01282408 0.9999179 0 0.01282408 0.999966 0 0.008251145 0.9992595 0 0.03847696 0.9987531 0 0.04992381 0.9999866 0 0.005177595 0.9999179 0 0.01282408 0.9987531 0 0.04992381 0.999731 0 0.02319377 1 0 0 0.9998311 0 0.01837931 0.9998764 0 0.01572074 1 0 0 0.9998311 0 0.01837931 0.9972109 0 0.07463499 0.9982488 0 0.0591578 0.9998764 0 0.01572074 0.9998764 0 0.01572074 0.9982488 0 0.0591578 0.9992595 0 0.03847696 0.999966 0 0.008251145 1 0 0 0.9998764 0 0.01572074 0.999966 0 0.008251145 1 0 0 0.9847953 0 0.1737191 0.9982935 0 0.05839752 0.9924399 0 0.1227319 0.985764 0 0.1681351 0.9982935 0 0.05839752 0.999731 0 0.02319377 0.9987531 0 0.04992381 0.9924399 0 0.1227319 0.9924399 0 0.1227319 0.9987531 0 0.04992381 0.9992595 0 0.03847696 0.9982488 0 0.0591578 0.985764 0 0.1681351 0.9924399 0 0.1227319 0.9982488 0 0.0591578 0.9972109 0 0.07463499 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.6556565 0 -0.7550594 0.9976608 0 -0.06835908 0.9993957 0 -0.03476287 0.9400108 0 -0.3411446 0.9976608 0 -0.06835908 0.9946921 0 0.1028965 0.9943026 0 0.1065937 0.9993957 0 -0.03476287 0.9993957 0 -0.03476287 0.9943026 0 0.1065937 0.9974182 0 0.07181127 0.9998694 0 -0.01616747 0.9400108 0 -0.3411446 0.9993957 0 -0.03476287 0.9998694 0 -0.01616747 0.9922789 0 -0.1240269 0.898286 0 0.4394111 0.9504045 0 0.3110168 0.970951 0 0.2392785 0.9786526 0 0.2055219 0.9504045 0 0.3110168 0.9949641 0 0.1002326 0.9932306 0 0.1161601 0.970951 0 0.2392785 0.970951 0 0.2392785 0.9932306 0 0.1161601 0.9974182 0 0.07181127 0.9943026 0 0.1065937 0.9786526 0 0.2055219 0.970951 0 0.2392785 0.9943026 0 0.1065937 0.9946921 0 0.1028965 1 0 0 0.9998186 0 -0.01904769 0.9997444 0 0.02260747 0.9998237 0 0.01877853 0.9998186 0 -0.01904769 0.9922789 0 -0.1240269 0.9998694 0 -0.01616747 0.9997444 0 0.02260747 0.9997444 0 0.02260747 0.9998694 0 -0.01616747 0.9974182 0 0.07181127 0.9932306 0 0.1161601 0.9998237 0 0.01877853 0.9997444 0 0.02260747 0.9932306 0 0.1161601 0.9949641 0 0.1002326 1 0 0 0.9999234 0 0.01238314 0.9999158 0 0.01297878 0.999992 0 0.004026077 0.9999234 0 0.01238314 0.99847 0 0.05529641 0.9988625 0 0.04768499 0.9999158 0 0.01297878 0.9999158 0 0.01297878 0.9988625 0 0.04768499 0.9993535 0 0.03595469 0.9998423 0 0.01776228 0.999992 0 0.004026077 0.9999158 0 0.01297878 0.9998423 0 0.01776228 0.9997043 0 0.02432029 0.9844866 0 0.1754599 0.9911525 0 0.1327287 0.9911125 0 0.1330269 0.9903104 0 0.1388723 0.9911525 0 0.1327287 0.998642 0 0.05209723 0.9980665 0 0.06215586 0.9911125 0 0.1330269 0.9911125 0 0.1330269 0.9980665 0 0.06215586 0.9993535 0 0.03595469 0.9988625 0 0.04768499 0.9903104 0 0.1388723 0.9911125 0 0.1330269 0.9988625 0 0.04768499 0.99847 0 0.05529641 0.9996318 0 -0.02713669 0.9976045 0 0.06917621 0.9993557 0 0.03589234 0.999893 0 0.01463086 0.9976045 0 0.06917621 0.9997043 0 0.02432029 0.9998423 0 0.01776228 0.9993557 0 0.03589234 0.9993557 0 0.03589234 0.9998423 0 0.01776228 0.9993535 0 0.03595469 0.9980665 0 0.06215586 0.999893 0 0.01463086 0.9993557 0 0.03589234 0.9980665 0 0.06215586 0.998642 0 0.05209723 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9996318 0 -0.02713669 0.9997751 0 -0.02121163 0.9990746 0 0.04301087 0.9976045 0 0.06917621 0.9997751 0 -0.02121163 0.9998518 0 0.01722264 0.9997292 0 0.02327252 0.9990746 0 0.04301087 0.9990746 0 0.04301087 0.9997292 0 0.02327252 0.9996673 0 0.02579472 0.9997163 0 0.02381928 0.9976045 0 0.06917621 0.9990746 0 0.04301087 0.9997163 0 0.02381928 0.9997043 0 0.02432029 1 0 0 1 0 0 0.9999713 0 0.007573398 0.9999974 0 0.002302737 1 0 0 1 0 0 0.9999683 0 0.007962157 0.9999713 0 0.007573398 0.9999713 0 0.007573398 0.9999683 0 0.007962157 0.9996673 0 0.02579472 0.9997292 0 0.02327252 0.9999974 0 0.002302737 0.9999713 0 0.007573398 0.9997292 0 0.02327252 0.9998518 0 0.01722264 1 0 0 0.999992 0 0.004026077 0.9999765 0 0.006861057 1 0 0 0.999992 0 0.004026077 0.9997043 0 0.02432029 0.9997163 0 0.02381928 0.9999765 0 0.006861057 0.9999765 0 0.006861057 0.9997163 0 0.02381928 0.9996673 0 0.02579472 0.9999683 0 0.007962157 1 0 0 0.9999765 0 0.006861057 0.9999683 0 0.007962157 1 0 0 1 0 0 0.9999974 0 0.002302737 0.9993973 0 -0.0347153 0.9998186 0 -0.01904769 0.9999974 0 0.002302737 0.9998518 0 0.01722264 0.9994236 0 -0.03395005 0.9993973 0 -0.0347153 0.9993973 0 -0.0347153 0.9994236 0 -0.03395005 0.9838091 0 -0.1792201 0.9810795 0 -0.1936059 0.9998186 0 -0.01904769 0.9993973 0 -0.0347153 0.9810795 0 -0.1936059 0.9922789 0 -0.1240269 0.9996318 0 -0.02713669 0.9377482 0 -0.3473159 0.9816598 0 -0.1906415 0.9997751 0 -0.02121163 0.9377482 0 -0.3473159 0.7851323 0 -0.6193282 0.8823418 0 -0.4706091 0.9816598 0 -0.1906415 0.9816598 0 -0.1906415 0.8823418 0 -0.4706091 0.9838091 0 -0.1792201 0.9994236 0 -0.03395005 0.9997751 0 -0.02121163 0.9816598 0 -0.1906415 0.9994236 0 -0.03395005 0.9998518 0 0.01722264 0.6556565 0 -0.7550594 0.9400108 0 -0.3411446 0.7873988 0 -0.6164441 0.5022706 0 -0.8647105 0.9400108 0 -0.3411446 0.9922789 0 -0.1240269 0.9810795 0 -0.1936059 0.7873988 0 -0.6164441 0.7873988 0 -0.6164441 0.9810795 0 -0.1936059 0.9838091 0 -0.1792201 0.8823418 0 -0.4706091 0.5022706 0 -0.8647105 0.7873988 0 -0.6164441 0.8823418 0 -0.4706091 0.7851323 0 -0.6193282 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999861 0 0.005293088 0.9999717 0 0.007528891 0.999971 0 0.007615969 0.9999861 0 0.005293088 0.9997482 0 0.0224443 0.999842 0 0.01777758 0.9999717 0 0.007528891 0.9999717 0 0.007528891 0.999842 0 0.01777758 0.9999082 0 0.01355274 0.9999632 0 0.008589496 0.999971 0 0.007615969 0.9999717 0 0.007528891 0.9999632 0 0.008589496 0.999454 0 0.03304328 0.9981577 0 0.06067236 0.9990575 0 0.04340854 0.9989569 0 0.04566287 0.9986162 0 0.05259047 0.9990575 0 0.04340854 0.9998661 0 0.01637038 0.9997991 0 0.02004711 0.9989569 0 0.04566287 0.9989569 0 0.04566287 0.9997991 0 0.02004711 0.9999082 0 0.01355274 0.999842 0 0.01777758 0.9986162 0 0.05259047 0.9989569 0 0.04566287 0.999842 0 0.01777758 0.9997482 0 0.0224443 0.9844866 0 0.1754599 0.9981167 0 0.06134399 0.9999568 0 0.009295042 0.999927 0 0.0120911 0.9981167 0 0.06134399 0.999454 0 0.03304328 0.9999632 0 0.008589496 0.9999568 0 0.009295042 0.9999568 0 0.009295042 0.9999632 0 0.008589496 0.9999082 0 0.01355274 0.9997991 0 0.02004711 0.999927 0 0.0120911 0.9999568 0 0.009295042 0.9997991 0 0.02004711 0.9998661 0 0.01637038 1 0 0 0.9999548 0 -0.009510972 0.9999697 0 -0.007798407 0.9999982 0 0.00197244 0.9999548 0 -0.009510972 0.9991517 0 -0.04118062 0.9993389 0 -0.03635703 0.9999697 0 -0.007798407 0.9999697 0 -0.007798407 0.9993389 0 -0.03635703 0.9995579 0 -0.02973565 0.9999713 0 -0.007589318 0.9999982 0 0.00197244 0.9999697 0 -0.007798407 0.9999713 0 -0.007589318 0.9999416 0 0.01081198 0.9939183 0 -0.1101202 0.9971173 0 -0.07587613 0.9967927 0 -0.08002693 0.9952523 0 -0.0973288 0.9971173 0 -0.07587613 0.9992779 0 -0.03799582 0.9992078 0 -0.03979686 0.9967927 0 -0.08002693 0.9967927 0 -0.08002693 0.9992078 0 -0.03979686 0.9995579 0 -0.02973565 0.9993389 0 -0.03635703 0.9952523 0 -0.0973288 0.9967927 0 -0.08002693 0.9993389 0 -0.03635703 0.9991517 0 -0.04118062 0.9981577 0 0.06067236 0.999622 0 0.02749278 0.9999719 0 -0.007505871 0.9999928 0 -0.003820407 0.999622 0 0.02749278 0.9999416 0 0.01081198 0.9999713 0 -0.007589318 0.9999719 0 -0.007505871 0.9999719 0 -0.007505871 0.9999713 0 -0.007589318 0.9995579 0 -0.02973565 0.9992078 0 -0.03979686 0.9999928 0 -0.003820407 0.9999719 0 -0.007505871 0.9992078 0 -0.03979686 0.9992779 0 -0.03799582 0.996245 0 0.08657958 0.9974805 0 0.07094157 0.999283 0 0.03786304 0.9994953 0 0.03176843 0.9974805 0 0.07094157 0.9995602 0 0.0296571 0.9997283 0 0.02331127 0.999283 0 0.03786304 0.999283 0 0.03786304 0.9997283 0 0.02331127 0.9999197 0 0.01267324 0.9997818 0 0.02089266 0.9994953 0 0.03176843 0.999283 0 0.03786304 0.9997818 0 0.02089266 0.9998512 0 0.01725478 1 0 0 1 0 0 0.9999848 0 0.00551633 0.9999743 0 0.007181109 1 0 0 1 0 0 0.9999953 0 0.003102591 0.9999848 0 0.00551633 0.9999848 0 0.00551633 0.9999953 0 0.003102591 0.9999197 0 0.01267324 0.9997283 0 0.02331127 0.9999743 0 0.007181109 0.9999848 0 0.00551633 0.9997283 0 0.02331127 0.9995602 0 0.0296571 1 0 0 0.9999912 0 0.004211805 0.9999856 0 0.005378995 1 0 0 0.9999912 0 0.004211805 0.9998512 0 0.01725478 0.9997818 0 0.02089266 0.9999856 0 0.005378995 0.9999856 0 0.005378995 0.9997818 0 0.02089266 0.9999197 0 0.01267324 0.9999953 0 0.003102591 1 0 0 0.9999856 0 0.005378995 0.9999953 0 0.003102591 1 0 0 0.9994202 0 -0.03404864 0.9995314 0 -0.03060854 0.9998431 0 -0.01771241 0.9998847 0 -0.01518664 0.9995314 0 -0.03060854 0.9999011 0 -0.01406414 0.999939 0 -0.01104797 0.9998431 0 -0.01771241 0.9998431 0 -0.01771241 0.999939 0 -0.01104797 0.9999822 0 -0.005963256 0.999953 0 -0.009698106 0.9998847 0 -0.01518664 0.9998431 0 -0.01771241 0.999953 0 -0.009698106 0.9999705 0 -0.007684279 1 0 0 1 0 0 0.9999964 0 -0.002675001 0.9999933 0 -0.003680643 1 0 0 1 0 0 0.9999989 0 -0.001474012 0.9999964 0 -0.002675001 0.9999964 0 -0.002675001 0.9999989 0 -0.001474012 0.9999822 0 -0.005963256 0.999939 0 -0.01104797 0.9999933 0 -0.003680643 0.9999964 0 -0.002675001 0.999939 0 -0.01104797 0.9999011 0 -0.01406414 1 0 0 0.9999985 0 -0.001770907 0.999997 0 -0.002469954 1 0 0 0.9999985 0 -0.001770907 0.9999705 0 -0.007684279 0.999953 0 -0.009698106 0.999997 0 -0.002469954 0.999997 0 -0.002469954 0.999953 0 -0.009698106 0.9999822 0 -0.005963256 0.9999989 0 -0.001474012 1 0 0 0.999997 0 -0.002469954 0.9999989 0 -0.001474012 1 0 0 1 0 0 0.9999869 0 0.005125196 0.9999946 0 0.00330578 0.9999844 0 -0.005603025 0.9999869 0 0.005125196 0.9997564 0 0.02207579 0.9997715 0 0.02137971 0.9999946 0 0.00330578 0.9999946 0 0.00330578 0.9997715 0 0.02137971 0.9998423 0 0.01775949 0.9999995 0 9.91459e-4 0.9999844 0 -0.005603025 0.9999946 0 0.00330578 0.9999995 0 9.91459e-4 0.9996786 0 -0.02535072 0.9981178 0 0.06132749 0.9990234 0 0.04418546 0.998911 0 0.04665678 0.9986141 0 0.05263024 0.9990234 0 0.04418546 0.9997689 0 0.02149955 0.9997474 0 0.0224782 0.998911 0 0.04665678 0.998911 0 0.04665678 0.9997474 0 0.0224782 0.9998423 0 0.01775949 0.9997715 0 0.02137971 0.9986141 0 0.05263024 0.998911 0 0.04665678 0.9997715 0 0.02137971 0.9997564 0 0.02207579 0.9939183 0 -0.1101202 0.9987175 0 -0.05062972 0.9999921 0 0.003970676 0.9999796 0 -0.006401323 0.9987175 0 -0.05062972 0.9996786 0 -0.02535072 0.9999995 0 9.91459e-4 0.9999921 0 0.003970676 0.9999921 0 0.003970676 0.9999995 0 9.91459e-4 0.9998423 0 0.01775949 0.9997474 0 0.0224782 0.9999796 0 -0.006401323 0.9999921 0 0.003970676 0.9997474 0 0.0224782 0.9997689 0 0.02149955 1 0 0 0.9999553 0 -0.009454342 0.9999233 0 -0.01239362 0.9999966 0 0.002619098 0.9999553 0 -0.009454342 0.9986457 0 -0.05202674 0.9985418 0 -0.05398559 0.9999233 0 -0.01239362 0.9999233 0 -0.01239362 0.9985418 0 -0.05398559 0.9991282 0 -0.04174658 0.9999574 0 -0.00922825 0.9999966 0 0.002619098 0.9999233 0 -0.01239362 0.9999574 0 -0.00922825 0.9999244 0 0.01229476 0.9627821 0 -0.2702792 0.9942964 0 -0.1066524 0.9912824 0 -0.1317542 0.9832857 0 -0.1820696 0.9942964 0 -0.1066524 0.998815 0 -0.04866835 0.998507 0 -0.05462567 0.9912824 0 -0.1317542 0.9912824 0 -0.1317542 0.998507 0 -0.05462567 0.9991282 0 -0.04174658 0.9985418 0 -0.05398559 0.9832857 0 -0.1820696 0.9912824 0 -0.1317542 0.9985418 0 -0.05398559 0.9986457 0 -0.05202674 0.9981178 0 0.06132749 0.9996954 0 0.02468202 0.9998725 0 -0.01596769 0.9999827 0 -0.005891751 0.9996954 0 0.02468202 0.9999244 0 0.01229476 0.9999574 0 -0.00922825 0.9998725 0 -0.01596769 0.9998725 0 -0.01596769 0.9999574 0 -0.00922825 0.9991282 0 -0.04174658 0.998507 0 -0.05462567 0.9999827 0 -0.005891751 0.9998725 0 -0.01596769 0.998507 0 -0.05462567 0.998815 0 -0.04866835 0.9999819 0 -0.006035781 0.9998276 0 0.01856911 0.9997109 0 0.02405027 1 0 -1.38294e-4 0.9998276 0 0.01856911 0.9982979 0 0.05831984 0.9979477 0 0.06403448 0.9997109 0 0.02405027 0.9997109 0 0.02405027 0.9979477 0 0.06403448 0.9987967 0 0.04904365 0.9998872 0 0.01501849 1 0 -1.38294e-4 0.9997109 0 0.02405027 0.9998872 0 0.01501849 0.9999997 0 -8.9225e-4 0.9418919 0 0.3359164 0.9745278 0 0.2242668 0.9888155 0 0.149144 0.9922882 0 0.1239521 0.9745278 0 0.2242668 0.9972108 0 0.07463703 0.9979964 0 0.06327103 0.9888155 0 0.149144 0.9888155 0 0.149144 0.9979964 0 0.06327103 0.9987967 0 0.04904365 0.9979477 0 0.06403448 0.9922882 0 0.1239521 0.9888155 0 0.149144 0.9979477 0 0.06403448 0.9982979 0 0.05831984 1 0 0 0.9999999 0 -4.16625e-4 0.9998697 0 0.0161423 0.9998934 0 0.01460662 0.9999999 0 -4.16625e-4 0.9999997 0 -8.9225e-4 0.9998872 0 0.01501849 0.9998697 0 0.0161423 0.9998697 0 0.0161423 0.9998872 0 0.01501849 0.9987967 0 0.04904365 0.9979964 0 0.06327103 0.9998934 0 0.01460662 0.9998697 0 0.0161423 0.9979964 0 0.06327103 0.9972108 0 0.07463703 1 0 0 0.9999743 0 0.007181109 0.9999863 0 0.00524804 0.9999999 0 -6.04524e-4 0.9999743 0 0.007181109 0.9995602 0 0.0296571 0.9996876 0 0.02499919 0.9999863 0 0.00524804 0.9999863 0 0.00524804 0.9996876 0 0.02499919 0.9998603 0 0.01671649 0.9999996 0 9.56426e-4 0.9999999 0 -6.04524e-4 0.9999863 0 0.00524804 0.9999996 0 9.56426e-4 0.999994 0 -0.003470933 0.996245 0 0.08657958 0.9979553 0 0.06391584 0.9978602 0 0.06538501 0.9974805 0 0.07094157 0.9979553 0 0.06391584 0.999732 0 0.02315164 0.9994932 0 0.03183398 0.9978602 0 0.06538501 0.9978602 0 0.06538501 0.9994932 0 0.03183398 0.9998603 0 0.01671649 0.9996876 0 0.02499919 0.9974805 0 0.07094157 0.9978602 0 0.06538501 0.9996876 0 0.02499919 0.9995602 0 0.0296571 0.9999819 0 -0.006035781 0.9999579 0 -0.009184713 0.9999895 0 0.004579363 0.9999782 0 0.006606041 0.9999579 0 -0.009184713 0.999994 0 -0.003470933 0.9999996 0 9.56426e-4 0.9999895 0 0.004579363 0.9999895 0 0.004579363 0.9999996 0 9.56426e-4 0.9998603 0 0.01671649 0.9994932 0 0.03183398 0.9999782 0 0.006606041 0.9999895 0 0.004579363 0.9994932 0 0.03183398 0.999732 0 0.02315164 0.9999819 0 -0.006035781 0.9999567 0 -0.009320169 0.9999753 0 -0.007030975 0.9999579 0 -0.009184713 0.9999567 0 -0.009320169 0.9999885 0 -0.004816277 0.9999905 0 -0.004378977 0.9999753 0 -0.007030975 0.9999753 0 -0.007030975 0.9999905 0 -0.004378977 0.9999972 0 -0.002361082 0.9999932 0 -0.003710838 0.9999579 0 -0.009184713 0.9999753 0 -0.007030975 0.9999932 0 -0.003710838 0.999994 0 -0.003470933 1 0 0 1 0 0 0.9999995 0 -0.001108441 0.9999991 0 -0.001335955 1 0 0 1 0 0 0.9999998 0 -7.69157e-4 0.9999995 0 -0.001108441 0.9999995 0 -0.001108441 0.9999998 0 -7.69157e-4 0.9999972 0 -0.002361082 0.9999905 0 -0.004378977 0.9999991 0 -0.001335955 0.9999995 0 -0.001108441 0.9999905 0 -0.004378977 0.9999885 0 -0.004816277 1 0 0 0.9999999 0 -6.04524e-4 0.9999995 0 -0.001045421 1 0 0 0.9999999 0 -6.04524e-4 0.999994 0 -0.003470933 0.9999932 0 -0.003710838 0.9999995 0 -0.001045421 0.9999995 0 -0.001045421 0.9999932 0 -0.003710838 0.9999972 0 -0.002361082 0.9999998 0 -7.69157e-4 1 0 0 0.9999995 0 -0.001045421 0.9999998 0 -7.69157e-4 1 0 0 1 0 0 1 0 0 0.9999999 0 -6.67979e-4 0.9999999 0 -4.16625e-4 1 0 0 1 0 0 1 0 -1.70329e-4 0.9999999 0 -6.67979e-4 0.9999999 0 -6.67979e-4 1 0 -1.70329e-4 0.9999991 0 -0.001359916 0.9999966 0 -0.002643393 0.9999999 0 -4.16625e-4 0.9999999 0 -6.67979e-4 0.9999966 0 -0.002643393 0.9999997 0 -8.9225e-4 1 0 0 0.9999991 0 -0.001335955 0.9999997 0 -7.5563e-4 1 0 0 0.9999991 0 -0.001335955 0.9999885 0 -0.004816277 0.9999954 0 -0.003029729 0.9999997 0 -7.5563e-4 0.9999997 0 -7.5563e-4 0.9999954 0 -0.003029729 0.9999991 0 -0.001359916 1 0 -1.70329e-4 1 0 0 0.9999997 0 -7.5563e-4 1 0 -1.70329e-4 1 0 0 0.9999819 0 -0.006035781 1 0 -1.38294e-4 0.9999893 0 -0.00462717 0.9999567 0 -0.009320169 1 0 -1.38294e-4 0.9999997 0 -8.9225e-4 0.9999966 0 -0.002643393 0.9999893 0 -0.00462717 0.9999893 0 -0.00462717 0.9999966 0 -0.002643393 0.9999991 0 -0.001359916 0.9999954 0 -0.003029729 0.9999567 0 -0.009320169 0.9999893 0 -0.00462717 0.9999954 0 -0.003029729 0.9999885 0 -0.004816277 1 0 0 0.9997492 0 -0.02239379 0.9997067 0 -0.0242223 0.9998366 0 0.01808362 0.9997492 0 -0.02239379 0.9929114 0 -0.118857 0.9931154 0 -0.1171403 0.9997067 0 -0.0242223 0.9997067 0 -0.0242223 0.9931154 0 -0.1171403 0.9972673 0 -0.07387806 0.9999111 0 0.01333674 0.9998366 0 0.01808362 0.9997067 0 -0.0242223 0.9999111 0 0.01333674 0.9925381 0 0.1219355 0.8982904 0 -0.4394024 0.9786545 0 -0.2055127 0.9708229 0 -0.2397977 0.9402841 0 -0.3403908 0.9786545 0 -0.2055127 0.9946882 0 -0.1029348 0.9941872 0 -0.1076652 0.9708229 0 -0.2397977 0.9708229 0 -0.2397977 0.9941872 0 -0.1076652 0.9972673 0 -0.07387806 0.9931154 0 -0.1171403 0.9402841 0 -0.3403908 0.9708229 0 -0.2397977 0.9931154 0 -0.1171403 0.9929114 0 -0.118857 0.6556548 0 0.7550608 0.9403079 0 0.3403254 0.9994578 0 0.03292647 0.9976596 0 0.0683776 0.9403079 0 0.3403254 0.9925381 0 0.1219355 0.9999111 0 0.01333674 0.9994578 0 0.03292647 0.9994578 0 0.03292647 0.9999111 0 0.01333674 0.9972673 0 -0.07387806 0.9941872 0 -0.1076652 0.9976596 0 0.0683776 0.9994578 0 0.03292647 0.9941872 0 -0.1076652 0.9946882 0 -0.1029348 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999744 0 -0.007170572 0.9999914 0 -0.004168725 1 0 0 1 0 0 0.9999666 0 -0.008172477 0.9999744 0 -0.007170572 0.9999744 0 -0.007170572 0.9999666 0 -0.008172477 0.999657 0 -0.0261897 0.9997054 0 -0.02427305 0.9999914 0 -0.004168725 0.9999744 0 -0.007170572 0.9997054 0 -0.02427305 0.9996893 0 -0.0249249 1 0 0 0.9999977 0 -0.002200702 0.9999713 0 -0.007590777 1 0 0 0.9999977 0 -0.002200702 0.9998574 0 -0.01689509 0.9997244 0 -0.02347645 0.9999713 0 -0.007590777 0.9999713 0 -0.007590777 0.9997244 0 -0.02347645 0.999657 0 -0.0261897 0.9999666 0 -0.008172477 1 0 0 0.9999713 0 -0.007590777 0.9999666 0 -0.008172477 1 0 0 0.9996312 0 0.02715787 0.9975692 0 -0.06968381 0.9990581 0 -0.04339397 0.9997698 0 0.02145573 0.9975692 0 -0.06968381 0.9996893 0 -0.0249249 0.9997054 0 -0.02427305 0.9990581 0 -0.04339397 0.9990581 0 -0.04339397 0.9997054 0 -0.02427305 0.999657 0 -0.0261897 0.9997244 0 -0.02347645 0.9997698 0 0.02145573 0.9990581 0 -0.04339397 0.9997244 0 -0.02347645 0.9998574 0 -0.01689509 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.6556548 0 0.7550608 0.502337 0 0.864672 0.7873132 0 0.6165533 0.9403079 0 0.3403254 0.502337 0 0.864672 0.7851406 0 0.6193175 0.8822303 0 0.4708182 0.7873132 0 0.6165533 0.7873132 0 0.6165533 0.8822303 0 0.4708182 0.9837153 0 0.1797343 0.9810873 0 0.193566 0.9403079 0 0.3403254 0.7873132 0 0.6165533 0.9810873 0 0.193566 0.9925381 0 0.1219355 0.9996312 0 0.02715787 0.9997698 0 0.02145573 0.9815969 0 0.1909652 0.9377384 0 0.3473425 0.9997698 0 0.02145573 0.9998574 0 -0.01689509 0.9994044 0 0.03451218 0.9815969 0 0.1909652 0.9815969 0 0.1909652 0.9994044 0 0.03451218 0.9837153 0 0.1797343 0.8822303 0 0.4708182 0.9377384 0 0.3473425 0.9815969 0 0.1909652 0.8822303 0 0.4708182 0.7851406 0 0.6193175 1 0 0 0.9998366 0 0.01808362 0.9993947 0 0.03478953 0.9999977 0 -0.002200702 0.9998366 0 0.01808362 0.9925381 0 0.1219355 0.9810873 0 0.193566 0.9993947 0 0.03478953 0.9993947 0 0.03478953 0.9810873 0 0.193566 0.9837153 0 0.1797343 0.9994044 0 0.03451218 0.9999977 0 -0.002200702 0.9993947 0 0.03478953 0.9994044 0 0.03451218 0.9998574 0 -0.01689509 1 0 0 0.9999984 0 -0.001841426 0.999985 0 0.005479925 0.9999971 0 0.002449128 0.9999984 0 -0.001841426 0.9999175 0 -0.0128454 0.9999961 0 0.0027953 0.999985 0 0.005479925 0.999985 0 0.005479925 0.9999961 0 0.0027953 0.9999037 0 0.01388386 0.9999285 0 0.01196214 0.9999971 0 0.002449128 0.999985 0 0.005479925 0.9999285 0 0.01196214 0.9999298 0 0.01185445 0.9963147 0 -0.08577371 0.9996845 0 0.02511934 0.9999741 0 0.007201151 0.9996374 0 -0.02692852 0.9996845 0 0.02511934 0.9992617 0 0.03842073 0.9996845 0 0.0251183 0.9999741 0 0.007201151 0.9999741 0 0.007201151 0.9996845 0 0.0251183 0.9999037 0 0.01388386 0.9999961 0 0.0027953 0.9996374 0 -0.02692852 0.9999741 0 0.007201151 0.9999961 0 0.0027953 0.9999175 0 -0.0128454 0.9995998 0 0.02829219 0.9994346 0 0.03362282 0.9996639 0 0.0259233 0.9989716 0 0.04534279 0.9994346 0 0.03362282 0.9999298 0 0.01185445 0.9999285 0 0.01196214 0.9996639 0 0.0259233 0.9996639 0 0.0259233 0.9999285 0 0.01196214 0.9999037 0 0.01388386 0.9996845 0 0.0251183 0.9989716 0 0.04534279 0.9996639 0 0.0259233 0.9996845 0 0.0251183 0.9992617 0 0.03842073 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999553 0 0.009456046 0.9999915 0 0.004128905 1 0 0 1 0 0 0.9999881 0 0.0048938 0.9999553 0 0.009456046 0.9999553 0 0.009456046 0.9999881 0 0.0048938 0.999802 0 0.01989944 0.9994373 0 0.03354169 0.9999915 0 0.004128905 0.9999553 0 0.009456046 0.9994373 0 0.03354169 0.9999214 0 0.01254183 1 0 0 0.9998431 0 0.01771826 0.9999683 0 0.007969061 1 0 0 0.9998431 0 0.01771826 0.9976427 0 0.06862319 0.9991004 0 0.0424068 0.9999683 0 0.007969061 0.9999683 0 0.007969061 0.9991004 0 0.0424068 0.999802 0 0.01989944 0.9999881 0 0.0048938 1 0 0 0.9999683 0 0.007969061 0.9999881 0 0.0048938 1 0 0 0.9998681 0 0.01624623 0.9993364 0 0.03642422 0.9976653 0 0.06829426 0.9901412 0 0.1400736 0.9993364 0 0.03642422 0.9999214 0 0.01254183 0.9994373 0 0.03354169 0.9976653 0 0.06829426 0.9976653 0 0.06829426 0.9994373 0 0.03354169 0.999802 0 0.01989944 0.9991004 0 0.0424068 0.9901412 0 0.1400736 0.9976653 0 0.06829426 0.9991004 0 0.0424068 0.9976427 0 0.06862319 1 0 0 0.9999915 0 0.004128905 0.9994895 0 -0.03194975 0.9999414 0 -0.01082615 0.9999915 0 0.004128905 0.9999214 0 0.01254183 0.9982945 0 -0.05837937 0.9994895 0 -0.03194975 0.9994895 0 -0.03194975 0.9982945 0 -0.05837937 0.988874 0 -0.1487554 0.9939478 0 -0.1098533 0.9999414 0 -0.01082615 0.9994895 0 -0.03194975 0.9939478 0 -0.1098533 0.9980931 0 -0.06172637 0.9998681 0 0.01624623 0.9577647 0 -0.2875531 0.9881496 0 -0.153494 0.9993364 0 0.03642422 0.9577647 0 -0.2875531 0.9310648 0 -0.3648541 0.9649221 0 -0.2625365 0.9881496 0 -0.153494 0.9881496 0 -0.153494 0.9649221 0 -0.2625365 0.988874 0 -0.1487554 0.9982945 0 -0.05837937 0.9993364 0 0.03642422 0.9881496 0 -0.153494 0.9982945 0 -0.05837937 0.9999214 0 0.01254183 0.9740844 0 -0.226185 0.9896679 0 -0.143379 0.9597754 0 -0.2807688 0.9178351 0 -0.3969618 0.9896679 0 -0.143379 0.9980931 0 -0.06172637 0.9939478 0 -0.1098533 0.9597754 0 -0.2807688 0.9597754 0 -0.2807688 0.9939478 0 -0.1098533 0.988874 0 -0.1487554 0.9649221 0 -0.2625365 0.9178351 0 -0.3969618 0.9597754 0 -0.2807688 0.9649221 0 -0.2625365 0.9310648 0 -0.3648541 1 0 0 1 0 0 1 0 -1.21043e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -1.21043e-4 1 0 -1.21043e-4 1 0 0 1 0 1.51196e-4 1 0 0 1 0 0 1 0 -1.21043e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1.51196e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1.51196e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999965 0 -0.002649191 0.9999995 0 -0.001028423 1 0 0 1 0 0 0.9999976 0 -0.002254257 0.9999965 0 -0.002649191 0.9999965 0 -0.002649191 0.9999976 0 -0.002254257 0.9999492 0 -0.01008676 0.999942 0 -0.01077517 0.9999995 0 -0.001028423 0.9999965 0 -0.002649191 0.999942 0 -0.01077517 0.9999827 0 -0.005881785 1 0 0 0.9999856 0 -0.005385565 0.9999959 0 -0.002872802 1 0 0 0.9999856 0 -0.005385565 0.9998246 0 -0.01873213 0.9999214 0 -0.0125441 0.9999959 0 -0.002872802 0.9999959 0 -0.002872802 0.9999214 0 -0.0125441 0.9999492 0 -0.01008676 0.9999976 0 -0.002254257 1 0 0 0.9999959 0 -0.002872802 0.9999976 0 -0.002254257 1 0 0 0.9992358 0 -0.03908723 0.9998569 0 -0.01691968 0.9998095 0 -0.01952134 0.9993553 0 -0.03590414 0.9998569 0 -0.01691968 0.9999827 0 -0.005881785 0.999942 0 -0.01077517 0.9998095 0 -0.01952134 0.9998095 0 -0.01952134 0.999942 0 -0.01077517 0.9999492 0 -0.01008676 0.9999214 0 -0.0125441 0.9993553 0 -0.03590414 0.9998095 0 -0.01952134 0.9999214 0 -0.0125441 0.9998246 0 -0.01873213 1 0 0 1 0 0 0.9999989 0 -0.001566786 0.9999911 0 -0.004232885 1 0 0 1 0 0 0.9999989 0 0.001493394 0.9999989 0 -0.001566786 0.9999989 0 -0.001566786 0.9999989 0 0.001493394 0.9999998 0 5.94875e-4 0.9999828 0 -0.005865606 0.9999911 0 -0.004232885 0.9999989 0 -0.001566786 0.9999828 0 -0.005865606 0.9997855 0 -0.02071619 1 0 0 0.999999 0 0.001446918 0.999999 0 -0.001438955 1 0 0 0.999999 0 0.001446918 0.9999996 0 9.04389e-4 0.9999981 0 0.001992554 0.999999 0 -0.001438955 0.999999 0 -0.001438955 0.9999981 0 0.001992554 0.9999998 0 5.94875e-4 0.9999989 0 0.001493394 1 0 0 0.999999 0 -0.001438955 0.9999989 0 0.001493394 1 0 0 0.984786 0 -0.1737721 0.9983772 0 -0.05694751 0.9999735 0 -0.007296008 0.9999486 0 -0.01014149 0.9983772 0 -0.05694751 0.9997855 0 -0.02071619 0.9999828 0 -0.005865606 0.9999735 0 -0.007296008 0.9999735 0 -0.007296008 0.9999828 0 -0.005865606 0.9999998 0 5.94875e-4 0.9999981 0 0.001992554 0.9999486 0 -0.01014149 0.9999735 0 -0.007296008 0.9999981 0 0.001992554 0.9999996 0 9.04389e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998934 0 0.01460662 0.999934 0 0.01149562 1 0 0 0.9998934 0 0.01460662 0.9972108 0 0.07463703 0.9987739 0 0.04950729 0.999934 0 0.01149562 0.999934 0 0.01149562 0.9987739 0 0.04950729 0.9989113 0 0.04665047 0.9999638 0 0.008510689 1 0 0 0.999934 0 0.01149562 0.9999638 0 0.008510689 1 0 0 0.9418919 0 0.3359164 0.9750426 0 0.2220178 0.993515 0 0.1137023 0.9745278 0 0.2242668 0.9750426 0 0.2220178 0.9982106 0 0.0597974 0.996744 0 0.08063263 0.993515 0 0.1137023 0.993515 0 0.1137023 0.996744 0 0.08063263 0.9989113 0 0.04665047 0.9987739 0 0.04950729 0.9745278 0 0.2242668 0.993515 0 0.1137023 0.9987739 0 0.04950729 0.9972108 0 0.07463703 1 0 0 1 0 0 0.9998305 0 0.01840895 0.9998527 0 0.01716357 1 0 0 1 0 0 0.9999638 0 0.008510689 0.9998305 0 0.01840895 0.9998305 0 0.01840895 0.9999638 0 0.008510689 0.9989113 0 0.04665047 0.996744 0 0.08063263 0.9998527 0 0.01716357 0.9998305 0 0.01840895 0.996744 0 0.08063263 0.9982106 0 0.0597974 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999977 0 0.002169623 0.9999924 0 0.00390476 1 0 0 1 0 0 1 0 -2.07261e-4 0.9999977 0 0.002169623 0.9999977 0 0.002169623 1 0 -2.07261e-4 0.9999877 0 0.00496461 0.999939 0 0.01105647 0.9999924 0 0.00390476 0.9999977 0 0.002169623 0.999939 0 0.01105647 0.9997446 0 0.02260412 1 0 0 0.9999999 0 6.06377e-4 0.9999992 0 0.001283237 1 0 0 0.9999999 0 6.06377e-4 0.9999959 0 0.002873173 0.999993 0 0.003733175 0.9999992 0 0.001283237 0.9999992 0 0.001283237 0.999993 0 0.003733175 0.9999877 0 0.00496461 1 0 -2.07261e-4 1 0 0 0.9999992 0 0.001283237 1 0 -2.07261e-4 1 0 0 0.9998225 0 0.01883977 0.9984791 0 0.05513195 0.9999104 0 0.01339748 0.9998472 0 0.01748238 0.9984791 0 0.05513195 0.9997446 0 0.02260412 0.999939 0 0.01105647 0.9999104 0 0.01339748 0.9999104 0 0.01339748 0.999939 0 0.01105647 0.9999877 0 0.00496461 0.999993 0 0.003733175 0.9998472 0 0.01748238 0.9999104 0 0.01339748 0.999993 0 0.003733175 0.9999959 0 0.002873173 1 0 0 0.9999924 0 0.00390476 0.9999876 0 0.004983253 0.9999985 0 0.001791805 0.9999924 0 0.00390476 0.9997446 0 0.02260412 0.9997445 0 0.02260621 0.9999876 0 0.004983253 0.9999876 0 0.004983253 0.9997445 0 0.02260621 0.9999931 0 0.003719408 0.9999908 0 -0.004306072 0.9999985 0 0.001791805 0.9999876 0 0.004983253 0.9999908 0 -0.004306072 0.999979 0 0.006491994 0.9998225 0 0.01883977 0.99566 0 0.09306582 0.9987413 0 0.05015918 0.9984791 0 0.05513195 0.99566 0 0.09306582 0.9995116 0 0.03125302 0.9999009 0 0.01407915 0.9987413 0 0.05015918 0.9987413 0 0.05015918 0.9999009 0 0.01407915 0.9999931 0 0.003719408 0.9997445 0 0.02260621 0.9984791 0 0.05513195 0.9987413 0 0.05015918 0.9997445 0 0.02260621 0.9997446 0 0.02260412 0.9999328 0 0.01160175 0.9996102 0 0.0279181 0.9997123 0 -0.02398781 0.9991964 0 -0.04008357 0.9996102 0 0.0279181 0.999979 0 0.006491994 0.9999908 0 -0.004306072 0.9997123 0 -0.02398781 0.9997123 0 -0.02398781 0.9999908 0 -0.004306072 0.9999931 0 0.003719408 0.9999009 0 0.01407915 0.9991964 0 -0.04008357 0.9997123 0 -0.02398781 0.9999009 0 0.01407915 0.9995116 0 0.03125302</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape1-texbinormals-array" count="4752" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape1-vertices" name="qt_gauge_background_Shape1-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape1-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape1-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape1-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape1-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="2376">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape1-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape1-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape1-texbinormals" offset="2" set="0"/>
+ <p>931 931 1 337 337 2 69 69 0 69 69 0 337 337 2 936 936 3 169 169 5 634 634 6 931 931 4 931 931 4 634 634 6 337 337 7 634 634 9 238 70 10 337 337 8 337 337 8 238 70 10 636 636 11 337 337 13 636 636 14 936 936 12 936 936 12 636 636 14 171 171 15 62 62 16 933 933 17 932 932 19 932 932 19 933 933 17 338 338 18 933 933 20 170 170 21 338 338 23 338 338 23 170 170 21 635 635 22 635 635 25 238 70 26 338 338 24 338 338 24 238 70 26 634 634 27 932 932 28 338 338 29 169 169 31 169 169 31 338 338 29 634 634 30 68 68 32 935 935 33 934 934 35 934 934 35 935 935 33 339 339 34 935 935 36 171 171 37 339 339 39 339 339 39 171 171 37 636 636 38 339 339 40 636 636 41 635 635 43 635 635 43 636 636 41 238 70 42 934 934 44 339 339 45 170 170 47 170 170 47 339 339 45 635 635 46 40 40 48 937 937 49 942 942 51 942 942 51 937 937 49 340 340 50 172 172 53 637 637 54 937 937 52 937 937 52 637 637 54 340 340 55 637 637 57 239 71 58 340 340 56 340 340 56 239 71 58 639 639 59 340 340 61 639 639 62 942 942 60 942 942 60 639 639 62 174 174 63 39 39 64 939 939 65 938 938 67 938 938 67 939 939 65 341 341 66 939 939 68 173 173 69 341 341 71 341 341 71 173 173 69 638 638 70 638 638 73 239 71 74 341 341 72 341 341 72 239 71 74 637 637 75 938 938 76 341 341 77 172 172 79 172 172 79 341 341 77 637 637 78 38 38 80 941 941 81 940 940 83 940 940 83 941 941 81 342 342 82 941 941 84 174 174 85 342 342 87 342 342 87 174 174 85 639 639 86 342 342 88 639 639 89 638 638 91 638 638 91 639 639 89 239 71 90 940 940 92 342 342 93 173 173 95 173 173 95 342 342 93 638 638 94 943 943 97 343 343 98 8 8 96 8 8 96 343 343 98 948 948 99 943 943 100 175 175 101 343 343 103 343 343 103 175 175 101 640 640 102 640 640 105 240 72 106 343 343 104 343 343 104 240 72 106 642 642 107 343 343 109 642 642 110 948 948 108 948 948 108 642 642 110 177 177 111 945 945 113 344 344 114 12 12 112 12 12 112 344 344 114 944 944 115 176 176 117 641 641 118 945 945 116 945 945 116 641 641 118 344 344 119 641 641 121 240 72 122 344 344 120 344 344 120 240 72 122 640 640 123 344 344 125 640 640 126 944 944 124 944 944 124 640 640 126 175 175 127 36 36 128 947 947 129 946 946 131 946 946 131 947 947 129 345 345 130 947 947 132 177 177 133 345 345 135 345 345 135 177 177 133 642 642 134 345 345 136 642 642 137 641 641 139 641 641 139 642 642 137 240 72 138 946 946 140 345 345 141 176 176 143 176 176 143 345 345 141 641 641 142 949 949 145 346 346 146 31 31 144 31 31 144 346 346 146 954 954 147 949 949 148 178 178 149 346 346 151 346 346 151 178 178 149 643 643 150 643 643 153 241 73 154 346 346 152 346 346 152 241 73 154 645 645 155 346 346 157 645 645 158 954 954 156 954 954 156 645 645 158 180 180 159 14 14 160 951 951 161 950 950 163 950 950 163 951 951 161 347 347 162 951 951 164 179 179 165 347 347 167 347 347 167 179 179 165 644 644 166 644 644 169 241 73 170 347 347 168 347 347 168 241 73 170 643 643 171 347 347 173 643 643 174 950 950 172 950 950 172 643 643 174 178 178 175 35 35 176 953 953 177 952 952 179 952 952 179 953 953 177 348 348 178 953 953 180 180 180 181 348 348 183 348 348 183 180 180 181 645 645 182 348 348 184 645 645 185 644 644 187 644 644 187 645 645 185 241 73 186 348 348 189 644 644 190 952 952 188 952 952 188 644 644 190 179 179 191 18 18 192 955 955 193 960 960 195 960 960 195 955 955 193 349 349 194 955 955 196 181 181 197 349 349 199 349 349 199 181 181 197 646 646 198 349 349 200 646 646 201 648 648 203 648 648 203 646 646 201 242 74 202 349 349 205 648 648 206 960 960 204 960 960 204 648 648 206 183 183 207 957 957 209 350 350 210 16 16 208 16 16 208 350 350 210 956 956 211 182 182 213 647 647 214 957 957 212 957 957 212 647 647 214 350 350 215 647 647 217 242 74 218 350 350 216 350 350 216 242 74 218 646 646 219 350 350 221 646 646 222 956 956 220 956 956 220 646 646 222 181 181 223 21 21 224 959 959 225 958 958 227 958 958 227 959 959 225 351 351 226 959 959 228 183 183 229 351 351 231 351 351 231 183 183 229 648 648 230 351 351 232 648 648 233 647 647 235 647 647 235 648 648 233 242 74 234 351 351 237 647 647 238 958 958 236 958 958 236 647 647 238 182 182 239 19 19 240 961 961 241 966 966 243 966 966 243 961 961 241 352 352 242 961 961 244 184 184 245 352 352 247 352 352 247 184 184 245 649 649 246 352 352 248 649 649 249 651 651 251 651 651 251 649 649 249 243 75 250 966 966 252 352 352 253 186 186 255 186 186 255 352 352 253 651 651 254 15 15 256 963 963 257 962 962 259 962 962 259 963 963 257 353 353 258 963 963 260 185 185 261 353 353 263 353 353 263 185 185 261 650 650 262 650 650 265 243 75 266 353 353 264 353 353 264 243 75 266 649 649 267 353 353 269 649 649 270 962 962 268 962 962 268 649 649 270 184 184 271 18 18 272 965 965 273 964 964 275 964 964 275 965 965 273 354 354 274 186 186 277 651 651 278 965 965 276 965 965 276 651 651 278 354 354 279 651 651 281 243 75 282 354 354 280 354 354 280 243 75 282 650 650 283 354 354 285 650 650 286 964 964 284 964 964 284 650 650 286 185 185 287 17 17 288 967 967 289 972 972 291 972 972 291 967 967 289 355 355 290 967 967 292 187 187 293 355 355 295 355 355 295 187 187 293 652 652 294 355 355 296 652 652 297 654 654 299 654 654 299 652 652 297 244 76 298 972 972 300 355 355 301 189 189 303 189 189 303 355 355 301 654 654 302 19 19 304 969 969 305 968 968 307 968 968 307 969 969 305 356 356 306 969 969 308 188 188 309 356 356 311 356 356 311 188 188 309 653 653 310 653 653 313 244 76 314 356 356 312 356 356 312 244 76 314 652 652 315 968 968 316 356 356 317 187 187 319 187 187 319 356 356 317 652 652 318 971 971 321 357 357 322 20 20 320 20 20 320 357 357 322 970 970 323 189 189 325 654 654 326 971 971 324 971 971 324 654 654 326 357 357 327 654 654 329 244 76 330 357 357 328 357 357 328 244 76 330 653 653 331 357 357 333 653 653 334 970 970 332 970 970 332 653 653 334 188 188 335 25 25 336 973 973 337 978 978 339 978 978 339 973 973 337 358 358 338 973 973 340 190 190 341 358 358 343 358 358 343 190 190 341 655 655 342 358 358 344 655 655 345 657 657 347 657 657 347 655 655 345 245 77 346 978 978 348 358 358 349 192 192 351 192 192 351 358 358 349 657 657 350 975 975 353 359 359 354 23 23 352 23 23 352 359 359 354 974 974 355 191 191 357 656 656 358 975 975 356 975 975 356 656 656 358 359 359 359 656 656 361 245 77 362 359 359 360 359 359 360 245 77 362 655 655 363 359 359 365 655 655 366 974 974 364 974 974 364 655 655 366 190 190 367 21 21 368 977 977 369 976 976 371 976 976 371 977 977 369 360 360 370 977 977 372 192 192 373 360 360 375 360 360 375 192 192 373 657 657 374 657 657 377 245 77 378 360 360 376 360 360 376 245 77 378 656 656 379 360 360 381 656 656 382 976 976 380 976 976 380 656 656 382 191 191 383 17 17 384 972 972 385 982 982 387 982 982 387 972 972 385 361 361 386 972 972 388 189 189 389 361 361 391 361 361 391 189 189 389 658 658 390 361 361 392 658 658 393 660 660 395 660 660 395 658 658 393 246 78 394 982 982 396 361 361 397 194 194 399 194 194 399 361 361 397 660 660 398 979 979 401 362 362 402 20 20 400 20 20 400 362 362 402 971 971 403 979 979 404 193 193 405 362 362 407 362 362 407 193 193 405 659 659 406 659 659 409 246 78 410 362 362 408 362 362 408 246 78 410 658 658 411 362 362 413 658 658 414 971 971 412 971 971 412 658 658 414 189 189 415 981 981 417 363 363 418 23 23 416 23 23 416 363 363 418 980 980 419 194 194 421 660 660 422 981 981 420 981 981 420 660 660 422 363 363 423 660 660 425 246 78 426 363 363 424 363 363 424 246 78 426 659 659 427 363 363 429 659 659 430 980 980 428 980 980 428 659 659 430 193 193 431 22 22 432 983 983 433 988 988 435 988 988 435 983 983 433 364 364 434 983 983 436 195 195 437 364 364 439 364 364 439 195 195 437 661 661 438 661 661 441 247 79 442 364 364 440 364 364 440 247 79 442 663 663 443 988 988 444 364 364 445 197 197 447 197 197 447 364 364 445 663 663 446 24 24 448 985 985 449 984 984 451 984 984 451 985 985 449 365 365 450 196 196 453 662 662 454 985 985 452 985 985 452 662 662 454 365 365 455 365 365 456 662 662 457 661 661 459 661 661 459 662 662 457 247 79 458 984 984 460 365 365 461 195 195 463 195 195 463 365 365 461 661 661 462 25 25 464 987 987 465 986 986 467 986 986 467 987 987 465 366 366 466 987 987 468 197 197 469 366 366 471 366 366 471 197 197 469 663 663 470 663 663 473 247 79 474 366 366 472 366 366 472 247 79 474 662 662 475 986 986 476 366 366 477 196 196 479 196 196 479 366 366 477 662 662 478 22 22 480 988 988 481 992 992 483 992 992 483 988 988 481 367 367 482 988 988 484 197 197 485 367 367 487 367 367 487 197 197 485 664 664 486 664 664 489 248 80 490 367 367 488 367 367 488 248 80 490 666 666 491 367 367 493 666 666 494 992 992 492 992 992 492 666 666 494 199 199 495 989 989 497 368 368 498 25 25 496 25 25 496 368 368 498 987 987 499 198 198 501 665 665 502 989 989 500 989 989 500 665 665 502 368 368 503 665 665 505 248 80 506 368 368 504 368 368 504 248 80 506 664 664 507 368 368 509 664 664 510 987 987 508 987 987 508 664 664 510 197 197 511 26 26 512 991 991 513 990 990 515 990 990 515 991 991 513 369 369 514 991 991 516 199 199 517 369 369 519 369 369 519 199 199 517 666 666 518 369 369 520 666 666 521 665 665 523 665 665 523 666 666 521 248 80 522 990 990 524 369 369 525 198 198 527 198 198 527 369 369 525 665 665 526 28 28 528 993 993 529 998 998 531 998 998 531 993 993 529 370 370 530 993 993 532 200 200 533 370 370 535 370 370 535 200 200 533 667 667 534 370 370 536 667 667 537 669 669 539 669 669 539 667 667 537 249 81 538 998 998 540 370 370 541 202 202 543 202 202 543 370 370 541 669 669 542 27 27 544 995 995 545 994 994 547 994 994 547 995 995 545 371 371 546 995 995 548 201 201 549 371 371 551 371 371 551 201 201 549 668 668 550 668 668 553 249 81 554 371 371 552 371 371 552 249 81 554 667 667 555 371 371 557 667 667 558 994 994 556 994 994 556 667 667 558 200 200 559 997 997 561 372 372 562 34 34 560 34 34 560 372 372 562 996 996 563 202 202 565 669 669 566 997 997 564 997 997 564 669 669 566 372 372 567 669 669 569 249 81 570 372 372 568 372 372 568 249 81 570 668 668 571 372 372 573 668 668 574 996 996 572 996 996 572 668 668 574 201 201 575 28 28 576 999 999 577 1004 1004 579 1004 1004 579 999 999 577 373 373 578 999 999 580 203 203 581 373 373 583 373 373 583 203 203 581 670 670 582 670 670 585 250 82 586 373 373 584 373 373 584 250 82 586 672 672 587 373 373 589 672 672 590 1004 1004 588 1004 1004 588 672 672 590 205 205 591 29 29 592 1001 1001 593 1000 1000 595 1000 1000 595 1001 1001 593 374 374 594 1001 1001 596 204 204 597 374 374 599 374 374 599 204 204 597 671 671 598 671 671 601 250 82 602 374 374 600 374 374 600 250 82 602 670 670 603 1000 1000 604 374 374 605 203 203 607 203 203 607 374 374 605 670 670 606 18 18 608 1003 1003 609 1002 1002 611 1002 1002 611 1003 1003 609 375 375 610 1003 1003 612 205 205 613 375 375 615 375 375 615 205 205 613 672 672 614 375 375 616 672 672 617 671 671 619 671 671 619 672 672 617 250 82 618 1002 1002 620 375 375 621 204 204 623 204 204 623 375 375 621 671 671 622 30 30 624 1005 1005 625 1008 1008 627 1008 1008 627 1005 1005 625 376 376 626 1005 1005 628 206 206 629 376 376 631 376 376 631 206 206 629 673 673 630 376 376 632 673 673 633 675 675 635 675 675 635 673 673 633 251 83 634 1008 1008 636 376 376 637 207 207 639 207 207 639 376 376 637 675 675 638 956 956 641 377 377 642 16 16 640 16 16 640 377 377 642 1006 1006 643 181 181 645 674 674 646 956 956 644 956 956 644 674 674 646 377 377 647 674 674 649 251 83 650 377 377 648 377 377 648 251 83 650 673 673 651 377 377 653 673 673 654 1006 1006 652 1006 1006 652 673 673 654 206 206 655 18 18 656 1007 1007 657 955 955 659 955 955 659 1007 1007 657 378 378 658 207 207 661 675 675 662 1007 1007 660 1007 1007 660 675 675 662 378 378 663 675 675 665 251 83 666 378 378 664 378 378 664 251 83 666 674 674 667 955 955 668 378 378 669 181 181 671 181 181 671 378 378 669 674 674 670 27 27 672 1009 1009 673 1014 1014 675 1014 1014 675 1009 1009 673 379 379 674 1009 1009 676 208 208 677 379 379 679 379 379 679 208 208 677 676 676 678 676 676 681 252 84 682 379 379 680 379 379 680 252 84 682 678 678 683 1014 1014 684 379 379 685 210 210 687 210 210 687 379 379 685 678 678 686 31 31 688 1011 1011 689 1010 1010 691 1010 1010 691 1011 1011 689 380 380 690 209 209 693 677 677 694 1011 1011 692 1011 1011 692 677 677 694 380 380 695 380 380 696 677 677 697 676 676 699 676 676 699 677 677 697 252 84 698 1010 1010 700 380 380 701 208 208 703 208 208 703 380 380 701 676 676 702 33 33 704 1013 1013 705 1012 1012 707 1012 1012 707 1013 1013 705 381 381 706 1013 1013 708 210 210 709 381 381 711 381 381 711 210 210 709 678 678 710 381 381 712 678 678 713 677 677 715 677 677 715 678 678 713 252 84 714 1012 1012 716 381 381 717 209 209 719 209 209 719 381 381 717 677 677 718 29 29 720 1015 1015 721 1020 1020 723 1020 1020 723 1015 1015 721 382 382 722 1015 1015 724 211 211 725 382 382 727 382 382 727 211 211 725 679 679 726 382 382 728 679 679 729 681 681 731 681 681 731 679 679 729 253 85 730 1020 1020 732 382 382 733 213 213 735 213 213 735 382 382 733 681 681 734 1017 1017 737 383 383 738 34 34 736 34 34 736 383 383 738 1016 1016 739 212 212 741 680 680 742 1017 1017 740 1017 1017 740 680 680 742 383 383 743 680 680 745 253 85 746 383 383 744 383 383 744 253 85 746 679 679 747 383 383 749 679 679 750 1016 1016 748 1016 1016 748 679 679 750 211 211 751 33 33 752 1019 1019 753 1018 1018 755 1018 1018 755 1019 1019 753 384 384 754 213 213 757 681 681 758 1019 1019 756 1019 1019 756 681 681 758 384 384 759 681 681 761 253 85 762 384 384 760 384 384 760 253 85 762 680 680 763 1018 1018 764 384 384 765 212 212 767 212 212 767 384 384 765 680 680 766 32 32 768 1021 1021 769 1026 1026 771 1026 1026 771 1021 1021 769 385 385 770 1021 1021 772 214 214 773 385 385 775 385 385 775 214 214 773 682 682 774 385 385 776 682 682 777 684 684 779 684 684 779 682 682 777 254 86 778 1026 1026 780 385 385 781 216 216 783 216 216 783 385 385 781 684 684 782 1023 1023 785 386 386 786 33 33 784 33 33 784 386 386 786 1022 1022 787 215 215 789 683 683 790 1023 1023 788 1023 1023 788 683 683 790 386 386 791 683 683 793 254 86 794 386 386 792 386 386 792 254 86 794 682 682 795 386 386 797 682 682 798 1022 1022 796 1022 1022 796 682 682 798 214 214 799 35 35 800 1025 1025 801 1024 1024 803 1024 1024 803 1025 1025 801 387 387 802 216 216 805 684 684 806 1025 1025 804 1025 1025 804 684 684 806 387 387 807 684 684 809 254 86 810 387 387 808 387 387 808 254 86 810 683 683 811 1024 1024 812 387 387 813 215 215 815 215 215 815 387 387 813 683 683 814 21 21 816 958 958 817 1030 1030 819 1030 1030 819 958 958 817 388 388 818 958 958 820 182 182 821 388 388 823 388 388 823 182 182 821 685 685 822 388 388 824 685 685 825 687 687 827 687 687 827 685 685 825 255 87 826 1030 1030 828 388 388 829 218 218 831 218 218 831 388 388 829 687 687 830 16 16 832 1027 1027 833 957 957 835 957 957 835 1027 1027 833 389 389 834 217 217 837 686 686 838 1027 1027 836 1027 1027 836 686 686 838 389 389 839 686 686 841 255 87 842 389 389 840 389 389 840 255 87 842 685 685 843 389 389 845 685 685 846 957 957 844 957 957 844 685 685 846 182 182 847 36 36 848 1029 1029 849 1028 1028 851 1028 1028 851 1029 1029 849 390 390 850 1029 1029 852 218 218 853 390 390 855 390 390 855 218 218 853 687 687 854 390 390 856 687 687 857 686 686 859 686 686 859 687 687 857 255 87 858 1028 1028 860 390 390 861 217 217 863 217 217 863 390 390 861 686 686 862 36 36 864 946 946 865 1034 1034 867 1034 1034 867 946 946 865 391 391 866 946 946 868 176 176 869 391 391 871 391 391 871 176 176 869 688 688 870 391 391 872 688 688 873 690 690 875 690 690 875 688 688 873 256 88 874 1034 1034 876 391 391 877 220 220 879 220 220 879 391 391 877 690 690 878 1031 1031 881 392 392 882 12 12 880 12 12 880 392 392 882 945 945 883 219 219 885 689 689 886 1031 1031 884 1031 1031 884 689 689 886 392 392 887 689 689 889 256 88 890 392 392 888 392 392 888 256 88 890 688 688 891 392 392 893 688 688 894 945 945 892 945 945 892 688 688 894 176 176 895 38 38 896 1033 1033 897 1032 1032 899 1032 1032 899 1033 1033 897 393 393 898 220 220 901 690 690 902 1033 1033 900 1033 1033 900 690 690 902 393 393 903 690 690 905 256 88 906 393 393 904 393 393 904 256 88 906 689 689 907 1032 1032 908 393 393 909 219 219 911 219 219 911 393 393 909 689 689 910 11 11 912 1035 1035 913 1040 1040 915 1040 1040 915 1035 1035 913 394 394 914 1035 1035 916 221 221 917 394 394 919 394 394 919 221 221 917 691 691 918 394 394 920 691 691 921 693 693 923 693 693 923 691 691 921 257 89 922 1040 1040 924 394 394 925 223 223 927 223 223 927 394 394 925 693 693 926 1037 1037 929 395 395 930 36 36 928 36 36 928 395 395 930 1036 1036 931 222 222 933 692 692 934 1037 1037 932 1037 1037 932 692 692 934 395 395 935 692 692 937 257 89 938 395 395 936 395 395 936 257 89 938 691 691 939 395 395 941 691 691 942 1036 1036 940 1036 1036 940 691 691 942 221 221 943 39 39 944 1039 1039 945 1038 1038 947 1038 1038 947 1039 1039 945 396 396 946 223 223 949 693 693 950 1039 1039 948 1039 1039 948 693 693 950 396 396 951 693 693 953 257 89 954 396 396 952 396 396 952 257 89 954 692 692 955 1038 1038 956 396 396 957 222 222 959 222 222 959 396 396 957 692 692 958 37 37 960 1041 1041 961 1044 1044 963 1044 1044 963 1041 1041 961 397 397 962 1041 1041 964 224 224 965 397 397 967 397 397 967 224 224 965 694 694 966 397 397 968 694 694 969 696 696 971 696 696 971 694 694 969 258 90 970 1044 1044 972 397 397 973 225 225 975 225 225 975 397 397 973 696 696 974 938 938 977 398 398 978 39 39 976 39 39 976 398 398 978 1042 1042 979 172 172 981 695 695 982 938 938 980 938 938 980 695 695 982 398 398 983 695 695 985 258 90 986 398 398 984 398 398 984 258 90 986 694 694 987 398 398 989 694 694 990 1042 1042 988 1042 1042 988 694 694 990 224 224 991 40 40 992 1043 1043 993 937 937 995 937 937 995 1043 1043 993 399 399 994 1043 1043 996 225 225 997 399 399 999 399 399 999 225 225 997 696 696 998 399 399 1000 696 696 1001 695 695 1003 695 695 1003 696 696 1001 258 90 1002 937 937 1004 399 399 1005 172 172 1007 172 172 1007 399 399 1005 695 695 1006 1045 1045 1009 400 400 1010 43 43 1008 43 43 1008 400 400 1010 1050 1050 1011 226 226 1013 697 697 1014 1045 1045 1012 1045 1045 1012 697 697 1014 400 400 1015 697 697 1017 259 91 1018 400 400 1016 400 400 1016 259 91 1018 699 699 1019 400 400 1021 699 699 1022 1050 1050 1020 1050 1050 1020 699 699 1022 228 228 1023 41 41 1024 1047 1047 1025 1046 1046 1027 1046 1046 1027 1047 1047 1025 401 401 1026 227 227 1029 698 698 1030 1047 1047 1028 1047 1047 1028 698 698 1030 401 401 1031 698 698 1033 259 91 1034 401 401 1032 401 401 1032 259 91 1034 697 697 1035 1046 1046 1036 401 401 1037 226 226 1039 226 226 1039 401 401 1037 697 697 1038 45 45 1040 1049 1049 1041 1048 1048 1043 1048 1048 1043 1049 1049 1041 402 402 1042 1049 1049 1044 228 228 1045 402 402 1047 402 402 1047 228 228 1045 699 699 1046 402 402 1048 699 699 1049 698 698 1051 698 698 1051 699 699 1049 259 91 1050 1048 1048 1052 402 402 1053 227 227 1055 227 227 1055 402 402 1053 698 698 1054 1051 1051 1057 403 403 1058 9 9 1056 9 9 1056 403 403 1058 1056 1056 1059 229 229 1061 700 700 1062 1051 1051 1060 1051 1051 1060 700 700 1062 403 403 1063 700 700 1065 260 92 1066 403 403 1064 403 403 1064 260 92 1066 702 702 1067 403 403 1069 702 702 1070 1056 1056 1068 1056 1056 1068 702 702 1070 231 231 1071 43 43 1072 1053 1053 1073 1052 1052 1075 1052 1052 1075 1053 1053 1073 404 404 1074 230 230 1077 701 701 1078 1053 1053 1076 1053 1053 1076 701 701 1078 404 404 1079 701 701 1081 260 92 1082 404 404 1080 404 404 1080 260 92 1082 700 700 1083 1052 1052 1084 404 404 1085 229 229 1087 229 229 1087 404 404 1085 700 700 1086 40 40 1088 1055 1055 1089 1054 1054 1091 1054 1054 1091 1055 1055 1089 405 405 1090 1055 1055 1092 231 231 1093 405 405 1095 405 405 1095 231 231 1093 702 702 1094 405 405 1096 702 702 1097 701 701 1099 701 701 1099 702 702 1097 260 92 1098 1054 1054 1100 405 405 1101 230 230 1103 230 230 1103 405 405 1101 701 701 1102 10 10 1104 1057 1057 1105 1062 1062 1107 1062 1062 1107 1057 1057 1105 406 406 1106 1057 1057 1108 232 232 1109 406 406 1111 406 406 1111 232 232 1109 703 703 1110 406 406 1112 703 703 1113 705 705 1115 705 705 1115 703 703 1113 261 93 1114 1062 1062 1116 406 406 1117 234 234 1119 234 234 1119 406 406 1117 705 705 1118 1059 1059 1121 407 407 1122 40 40 1120 40 40 1120 407 407 1122 1058 1058 1123 233 233 1125 704 704 1126 1059 1059 1124 1059 1059 1124 704 704 1126 407 407 1127 704 704 1129 261 93 1130 407 407 1128 407 407 1128 261 93 1130 703 703 1131 407 407 1133 703 703 1134 1058 1058 1132 1058 1058 1132 703 703 1134 232 232 1135 45 45 1136 1061 1061 1137 1060 1060 1139 1060 1060 1139 1061 1061 1137 408 408 1138 234 234 1141 705 705 1142 1061 1061 1140 1061 1061 1140 705 705 1142 408 408 1143 705 705 1145 261 93 1146 408 408 1144 408 408 1144 261 93 1146 704 704 1147 1060 1060 1148 408 408 1149 233 233 1151 233 233 1151 408 408 1149 704 704 1150 44 44 1152 1063 1063 1153 1068 1068 1155 1068 1068 1155 1063 1063 1153 409 409 1154 1063 1063 1156 235 235 1157 409 409 1159 409 409 1159 235 235 1157 706 706 1158 409 409 1160 706 706 1161 708 708 1163 708 708 1163 706 706 1161 262 94 1162 1068 1068 1164 409 409 1165 237 237 1167 237 237 1167 409 409 1165 708 708 1166 1065 1065 1169 410 410 1170 45 45 1168 45 45 1168 410 410 1170 1064 1064 1171 236 236 1173 707 707 1174 1065 1065 1172 1065 1065 1172 707 707 1174 410 410 1175 707 707 1177 262 94 1178 410 410 1176 410 410 1176 262 94 1178 706 706 1179 410 410 1181 706 706 1182 1064 1064 1180 1064 1064 1180 706 706 1182 235 235 1183 46 46 1184 1067 1067 1185 1066 1066 1187 1066 1066 1187 1067 1067 1185 411 411 1186 237 237 1189 708 708 1190 1067 1067 1188 1067 1067 1188 708 708 1190 411 411 1191 411 411 1192 708 708 1193 707 707 1195 707 707 1195 708 708 1193 262 94 1194 1066 1066 1196 411 411 1197 236 236 1199 236 236 1199 411 411 1197 707 707 1198 63 63 1200 1069 1069 1201 1074 1074 1203 1074 1074 1203 1069 1069 1201 412 412 1202 1069 1069 1204 70 238 1205 412 412 1207 412 412 1207 70 238 1205 709 709 1206 412 412 1208 709 709 1209 711 711 1211 711 711 1211 709 709 1209 263 95 1210 1074 1074 1212 412 412 1213 72 240 1215 72 240 1215 412 412 1213 711 711 1214 1071 1071 1217 413 413 1218 49 49 1216 49 49 1216 413 413 1218 1070 1070 1219 71 239 1221 710 710 1222 1071 1071 1220 1071 1071 1220 710 710 1222 413 413 1223 710 710 1225 263 95 1226 413 413 1224 413 413 1224 263 95 1226 709 709 1227 413 413 1229 709 709 1230 1070 1070 1228 1070 1070 1228 709 709 1230 70 238 1231 46 46 1232 1073 1073 1233 1072 1072 1235 1072 1072 1235 1073 1073 1233 414 414 1234 72 240 1237 711 711 1238 1073 1073 1236 1073 1073 1236 711 711 1238 414 414 1239 414 414 1240 711 711 1241 710 710 1243 710 710 1243 711 711 1241 263 95 1242 1072 1072 1244 414 414 1245 71 239 1247 71 239 1247 414 414 1245 710 710 1246 1075 1075 1249 415 415 1250 1 1 1248 1 1 1248 415 415 1250 1080 1080 1251 1075 1075 1252 73 241 1253 415 415 1255 415 415 1255 73 241 1253 712 712 1254 712 712 1257 264 96 1258 415 415 1256 415 415 1256 264 96 1258 714 714 1259 415 415 1261 714 714 1262 1080 1080 1260 1080 1080 1260 714 714 1262 75 243 1263 1077 1077 1265 416 416 1266 42 42 1264 42 42 1264 416 416 1266 1076 1076 1267 74 242 1269 713 713 1270 1077 1077 1268 1077 1077 1268 713 713 1270 416 416 1271 713 713 1273 264 96 1274 416 416 1272 416 416 1272 264 96 1274 712 712 1275 416 416 1277 712 712 1278 1076 1076 1276 1076 1076 1276 712 712 1278 73 241 1279 46 46 1280 1079 1079 1281 1078 1078 1283 1078 1078 1283 1079 1079 1281 417 417 1282 1079 1079 1284 75 243 1285 417 417 1287 417 417 1287 75 243 1285 714 714 1286 417 417 1288 714 714 1289 713 713 1291 713 713 1291 714 714 1289 264 96 1290 1078 1078 1292 417 417 1293 74 242 1295 74 242 1295 417 417 1293 713 713 1294 1081 1081 1297 418 418 1298 60 60 1296 60 60 1296 418 418 1298 1086 1086 1299 76 244 1301 715 715 1302 1081 1081 1300 1081 1081 1300 715 715 1302 418 418 1303 715 715 1305 265 97 1306 418 418 1304 418 418 1304 265 97 1306 717 717 1307 418 418 1309 717 717 1310 1086 1086 1308 1086 1086 1308 717 717 1310 78 246 1311 54 54 1312 1083 1083 1313 1082 1082 1315 1082 1082 1315 1083 1083 1313 419 419 1314 77 245 1317 716 716 1318 1083 1083 1316 1083 1083 1316 716 716 1318 419 419 1319 716 716 1321 265 97 1322 419 419 1320 419 419 1320 265 97 1322 715 715 1323 1082 1082 1324 419 419 1325 76 244 1327 76 244 1327 419 419 1325 715 715 1326 52 52 1328 1085 1085 1329 1084 1084 1331 1084 1084 1331 1085 1085 1329 420 420 1330 1085 1085 1332 78 246 1333 420 420 1335 420 420 1335 78 246 1333 717 717 1334 420 420 1336 717 717 1337 716 716 1339 716 716 1339 717 717 1337 265 97 1338 1084 1084 1340 420 420 1341 77 245 1343 77 245 1343 420 420 1341 716 716 1342 53 53 1344 1087 1087 1345 1092 1092 1347 1092 1092 1347 1087 1087 1345 421 421 1346 1087 1087 1348 79 247 1349 421 421 1351 421 421 1351 79 247 1349 718 718 1350 421 421 1352 718 718 1353 720 720 1355 720 720 1355 718 718 1353 266 98 1354 1092 1092 1356 421 421 1357 81 249 1359 81 249 1359 421 421 1357 720 720 1358 1089 1089 1361 422 422 1362 49 49 1360 49 49 1360 422 422 1362 1088 1088 1363 80 248 1365 719 719 1366 1089 1089 1364 1089 1089 1364 719 719 1366 422 422 1367 719 719 1369 266 98 1370 422 422 1368 422 422 1368 266 98 1370 718 718 1371 422 422 1373 718 718 1374 1088 1088 1372 1088 1088 1372 718 718 1374 79 247 1375 52 52 1376 1091 1091 1377 1090 1090 1379 1090 1090 1379 1091 1091 1377 423 423 1378 81 249 1381 720 720 1382 1091 1091 1380 1091 1091 1380 720 720 1382 423 423 1383 423 423 1384 720 720 1385 719 719 1387 719 719 1387 720 720 1385 266 98 1386 1090 1090 1388 423 423 1389 80 248 1391 80 248 1391 423 423 1389 719 719 1390 59 59 1392 1093 1093 1393 1098 1098 1395 1098 1098 1395 1093 1093 1393 424 424 1394 1093 1093 1396 82 250 1397 424 424 1399 424 424 1399 82 250 1397 721 721 1398 424 424 1400 721 721 1401 723 723 1403 723 723 1403 721 721 1401 267 99 1402 1098 1098 1404 424 424 1405 84 252 1407 84 252 1407 424 424 1405 723 723 1406 58 58 1408 1095 1095 1409 1094 1094 1411 1094 1094 1411 1095 1095 1409 425 425 1410 83 251 1413 722 722 1414 1095 1095 1412 1095 1095 1412 722 722 1414 425 425 1415 722 722 1417 267 99 1418 425 425 1416 425 425 1416 267 99 1418 721 721 1419 425 425 1421 721 721 1422 1094 1094 1420 1094 1094 1420 721 721 1422 82 250 1423 56 56 1424 1097 1097 1425 1096 1096 1427 1096 1096 1427 1097 1097 1425 426 426 1426 84 252 1429 723 723 1430 1097 1097 1428 1097 1097 1428 723 723 1430 426 426 1431 426 426 1432 723 723 1433 722 722 1435 722 722 1435 723 723 1433 267 99 1434 1096 1096 1436 426 426 1437 83 251 1439 83 251 1439 426 426 1437 722 722 1438 1099 1099 1441 427 427 1442 57 57 1440 57 57 1440 427 427 1442 1104 1104 1443 85 253 1445 724 724 1446 1099 1099 1444 1099 1099 1444 724 724 1446 427 427 1447 724 724 1449 268 100 1450 427 427 1448 427 427 1448 268 100 1450 726 726 1451 427 427 1453 726 726 1454 1104 1104 1452 1104 1104 1452 726 726 1454 87 255 1455 1101 1101 1457 428 428 1458 53 53 1456 53 53 1456 428 428 1458 1100 1100 1459 86 254 1461 725 725 1462 1101 1101 1460 1101 1101 1460 725 725 1462 428 428 1463 725 725 1465 268 100 1466 428 428 1464 428 428 1464 268 100 1466 724 724 1467 428 428 1469 724 724 1470 1100 1100 1468 1100 1100 1468 724 724 1470 85 253 1471 56 56 1472 1103 1103 1473 1102 1102 1475 1102 1102 1475 1103 1103 1473 429 429 1474 1103 1103 1476 87 255 1477 429 429 1479 429 429 1479 87 255 1477 726 726 1478 429 429 1480 726 726 1481 725 725 1483 725 725 1483 726 726 1481 268 100 1482 1102 1102 1484 429 429 1485 86 254 1487 86 254 1487 429 429 1485 725 725 1486 55 55 1488 1105 1105 1489 1110 1110 1491 1110 1110 1491 1105 1105 1489 430 430 1490 1105 1105 1492 88 256 1493 430 430 1495 430 430 1495 88 256 1493 727 727 1494 430 430 1496 727 727 1497 729 729 1499 729 729 1499 727 727 1497 269 101 1498 1110 1110 1500 430 430 1501 90 258 1503 90 258 1503 430 430 1501 729 729 1502 1107 1107 1505 431 431 1506 48 48 1504 48 48 1504 431 431 1506 1106 1106 1507 1107 1107 1508 89 257 1509 431 431 1511 431 431 1511 89 257 1509 728 728 1510 728 728 1513 269 101 1514 431 431 1512 431 431 1512 269 101 1514 727 727 1515 431 431 1517 727 727 1518 1106 1106 1516 1106 1106 1516 727 727 1518 88 256 1519 57 57 1520 1109 1109 1521 1108 1108 1523 1108 1108 1523 1109 1109 1521 432 432 1522 90 258 1525 729 729 1526 1109 1109 1524 1109 1109 1524 729 729 1526 432 432 1527 729 729 1529 269 101 1530 432 432 1528 432 432 1528 269 101 1530 728 728 1531 432 432 1533 728 728 1534 1108 1108 1532 1108 1108 1532 728 728 1534 89 257 1535 59 59 1536 1111 1111 1537 1093 1093 1539 1093 1093 1539 1111 1111 1537 433 433 1538 1111 1111 1540 91 259 1541 433 433 1543 433 433 1543 91 259 1541 730 730 1542 433 433 1544 730 730 1545 732 732 1547 732 732 1547 730 730 1545 270 102 1546 433 433 1549 732 732 1550 1093 1093 1548 1093 1093 1548 732 732 1550 82 250 1551 55 55 1552 1113 1113 1553 1112 1112 1555 1112 1112 1555 1113 1113 1553 434 434 1554 1113 1113 1556 92 260 1557 434 434 1559 434 434 1559 92 260 1557 731 731 1558 731 731 1561 270 102 1562 434 434 1560 434 434 1560 270 102 1562 730 730 1563 1112 1112 1564 434 434 1565 91 259 1567 91 259 1567 434 434 1565 730 730 1566 1094 1094 1569 435 435 1570 58 58 1568 58 58 1568 435 435 1570 1114 1114 1571 1094 1094 1572 82 250 1573 435 435 1575 435 435 1575 82 250 1573 732 732 1574 732 732 1577 270 102 1578 435 435 1576 435 435 1576 270 102 1578 731 731 1579 435 435 1581 731 731 1582 1114 1114 1580 1114 1114 1580 731 731 1582 92 260 1583 60 60 1584 1115 1115 1585 1081 1081 1587 1081 1081 1587 1115 1115 1585 436 436 1586 1115 1115 1588 93 261 1589 436 436 1591 436 436 1591 93 261 1589 733 733 1590 733 733 1593 271 103 1594 436 436 1592 436 436 1592 271 103 1594 735 735 1595 1081 1081 1596 436 436 1597 76 244 1599 76 244 1599 436 436 1597 735 735 1598 51 51 1600 1117 1117 1601 1116 1116 1603 1116 1116 1603 1117 1117 1601 437 437 1602 1117 1117 1604 94 262 1605 437 437 1607 437 437 1607 94 262 1605 734 734 1606 437 437 1608 734 734 1609 733 733 1611 733 733 1611 734 734 1609 271 103 1610 1116 1116 1612 437 437 1613 93 261 1615 93 261 1615 437 437 1613 733 733 1614 1082 1082 1617 438 438 1618 54 54 1616 54 54 1616 438 438 1618 1118 1118 1619 76 244 1621 735 735 1622 1082 1082 1620 1082 1082 1620 735 735 1622 438 438 1623 735 735 1625 271 103 1626 438 438 1624 438 438 1624 271 103 1626 734 734 1627 438 438 1629 734 734 1630 1118 1118 1628 1118 1118 1628 734 734 1630 94 262 1631 1119 1119 1633 439 439 1634 61 61 1632 61 61 1632 439 439 1634 1124 1124 1635 95 263 1637 736 736 1638 1119 1119 1636 1119 1119 1636 736 736 1638 439 439 1639 736 736 1641 272 104 1642 439 439 1640 439 439 1640 272 104 1642 738 738 1643 439 439 1645 738 738 1646 1124 1124 1644 1124 1124 1644 738 738 1646 97 265 1647 68 68 1648 1121 1121 1649 1120 1120 1651 1120 1120 1651 1121 1121 1649 440 440 1650 96 264 1653 737 737 1654 1121 1121 1652 1121 1121 1652 737 737 1654 440 440 1655 737 737 1657 272 104 1658 440 440 1656 440 440 1656 272 104 1658 736 736 1659 1120 1120 1660 440 440 1661 95 263 1663 95 263 1663 440 440 1661 736 736 1662 66 66 1664 1123 1123 1665 1122 1122 1667 1122 1122 1667 1123 1123 1665 441 441 1666 1123 1123 1668 97 265 1669 441 441 1671 441 441 1671 97 265 1669 738 738 1670 441 441 1672 738 738 1673 737 737 1675 737 737 1675 738 738 1673 272 104 1674 1122 1122 1676 441 441 1677 96 264 1679 96 264 1679 441 441 1677 737 737 1678 62 62 1680 1125 1125 1681 1128 1128 1683 1128 1128 1683 1125 1125 1681 442 442 1682 1125 1125 1684 98 266 1685 442 442 1687 442 442 1687 98 266 1685 739 739 1686 442 442 1688 739 739 1689 741 741 1691 741 741 1691 739 739 1689 273 105 1690 1128 1128 1692 442 442 1693 99 267 1695 99 267 1695 442 442 1693 741 741 1694 1090 1090 1697 443 443 1698 52 52 1696 52 52 1696 443 443 1698 1126 1126 1699 80 248 1701 740 740 1702 1090 1090 1700 1090 1090 1700 740 740 1702 443 443 1703 740 740 1705 273 105 1706 443 443 1704 443 443 1704 273 105 1706 739 739 1707 443 443 1709 739 739 1710 1126 1126 1708 1126 1126 1708 739 739 1710 98 266 1711 1127 1127 1713 444 444 1714 49 49 1712 49 49 1712 444 444 1714 1089 1089 1715 99 267 1717 741 741 1718 1127 1127 1716 1127 1127 1716 741 741 1718 444 444 1719 741 741 1721 273 105 1722 444 444 1720 444 444 1720 273 105 1722 740 740 1723 1089 1089 1724 444 444 1725 80 248 1727 80 248 1727 444 444 1725 740 740 1726 64 64 1728 1129 1129 1729 1134 1134 1731 1134 1134 1731 1129 1129 1729 445 445 1730 1129 1129 1732 100 268 1733 445 445 1735 445 445 1735 100 268 1733 742 742 1734 445 445 1736 742 742 1737 744 744 1739 744 744 1739 742 742 1737 274 106 1738 1134 1134 1740 445 445 1741 102 270 1743 102 270 1743 445 445 1741 744 744 1742 1131 1131 1745 446 446 1746 66 66 1744 66 66 1744 446 446 1746 1130 1130 1747 101 269 1749 743 743 1750 1131 1131 1748 1131 1131 1748 743 743 1750 446 446 1751 743 743 1753 274 106 1754 446 446 1752 446 446 1752 274 106 1754 742 742 1755 446 446 1757 742 742 1758 1130 1130 1756 1130 1130 1756 742 742 1758 100 268 1759 1133 1133 1761 447 447 1762 67 67 1760 67 67 1760 447 447 1762 1132 1132 1763 102 270 1765 744 744 1766 1133 1133 1764 1133 1133 1764 744 744 1766 447 447 1767 744 744 1769 274 106 1770 447 447 1768 447 447 1768 274 106 1770 743 743 1771 447 447 1773 743 743 1774 1132 1132 1772 1132 1132 1772 743 743 1774 101 269 1775 63 63 1776 1135 1135 1777 1138 1138 1779 1138 1138 1779 1135 1135 1777 448 448 1778 103 271 1781 745 745 1782 1135 1135 1780 1135 1135 1780 745 745 1782 448 448 1783 448 448 1784 745 745 1785 747 747 1787 747 747 1787 745 745 1785 275 107 1786 1138 1138 1788 448 448 1789 104 272 1791 104 272 1791 448 448 1789 747 747 1790 67 67 1792 1132 1132 1793 1136 1136 1795 1136 1136 1795 1132 1132 1793 449 449 1794 1132 1132 1796 101 269 1797 449 449 1799 449 449 1799 101 269 1797 746 746 1798 746 746 1801 275 107 1802 449 449 1800 449 449 1800 275 107 1802 745 745 1803 1136 1136 1804 449 449 1805 103 271 1807 103 271 1807 449 449 1805 745 745 1806 66 66 1808 1137 1137 1809 1131 1131 1811 1131 1131 1811 1137 1137 1809 450 450 1810 104 272 1813 747 747 1814 1137 1137 1812 1137 1137 1812 747 747 1814 450 450 1815 747 747 1817 275 107 1818 450 450 1816 450 450 1816 275 107 1818 746 746 1819 1131 1131 1820 450 450 1821 101 269 1823 101 269 1823 450 450 1821 746 746 1822 65 65 1824 1139 1139 1825 1142 1142 1827 1142 1142 1827 1139 1139 1825 451 451 1826 1139 1139 1828 105 273 1829 451 451 1831 451 451 1831 105 273 1829 748 748 1830 451 451 1832 748 748 1833 750 750 1835 750 750 1835 748 748 1833 276 108 1834 1142 1142 1836 451 451 1837 106 274 1839 106 274 1839 451 451 1837 750 750 1838 1122 1122 1841 452 452 1842 66 66 1840 66 66 1840 452 452 1842 1140 1140 1843 96 264 1845 749 749 1846 1122 1122 1844 1122 1122 1844 749 749 1846 452 452 1847 749 749 1849 276 108 1850 452 452 1848 452 452 1848 276 108 1850 748 748 1851 452 452 1853 748 748 1854 1140 1140 1852 1140 1140 1852 748 748 1854 105 273 1855 68 68 1856 1141 1141 1857 1121 1121 1859 1121 1121 1859 1141 1141 1857 453 453 1858 106 274 1861 750 750 1862 1141 1141 1860 1141 1141 1860 750 750 1862 453 453 1863 750 750 1865 276 108 1866 453 453 1864 453 453 1864 276 108 1866 749 749 1867 1121 1121 1868 453 453 1869 96 264 1871 96 264 1871 453 453 1869 749 749 1870 3 3 1872 1143 1143 1873 1148 1148 1875 1148 1148 1875 1143 1143 1873 454 454 1874 1143 1143 1876 107 275 1877 454 454 1879 454 454 1879 107 275 1877 751 751 1878 454 454 1880 751 751 1881 753 753 1883 753 753 1883 751 751 1881 277 109 1882 1148 1148 1884 454 454 1885 109 277 1887 109 277 1887 454 454 1885 753 753 1886 1145 1145 1889 455 455 1890 50 50 1888 50 50 1888 455 455 1890 1144 1144 1891 108 276 1893 752 752 1894 1145 1145 1892 1145 1145 1892 752 752 1894 455 455 1895 752 752 1897 277 109 1898 455 455 1896 455 455 1896 277 109 1898 751 751 1899 455 455 1901 751 751 1902 1144 1144 1900 1144 1144 1900 751 751 1902 107 275 1903 52 52 1904 1147 1147 1905 1146 1146 1907 1146 1146 1907 1147 1147 1905 456 456 1906 109 277 1909 753 753 1910 1147 1147 1908 1147 1147 1908 753 753 1910 456 456 1911 753 753 1913 277 109 1914 456 456 1912 456 456 1912 277 109 1914 752 752 1915 1146 1146 1916 456 456 1917 108 276 1919 108 276 1919 456 456 1917 752 752 1918 1120 1120 1921 457 457 1922 68 68 1920 68 68 1920 457 457 1922 935 935 1923 95 263 1925 754 754 1926 1120 1120 1924 1120 1120 1924 754 754 1926 457 457 1927 754 754 1929 278 110 1930 457 457 1928 457 457 1928 278 110 1930 756 756 1931 457 457 1933 756 756 1934 935 935 1932 935 935 1932 756 756 1934 171 171 1935 61 61 1936 1149 1149 1937 1119 1119 1939 1119 1119 1939 1149 1149 1937 458 458 1938 110 278 1941 755 755 1942 1149 1149 1940 1149 1149 1940 755 755 1942 458 458 1943 755 755 1945 278 110 1946 458 458 1944 458 458 1944 278 110 1946 754 754 1947 1119 1119 1948 458 458 1949 95 263 1951 95 263 1951 458 458 1949 754 754 1950 69 69 1952 936 936 1953 1150 1150 1955 1150 1150 1955 936 936 1953 459 459 1954 936 936 1956 171 171 1957 459 459 1959 459 459 1959 171 171 1957 756 756 1958 459 459 1960 756 756 1961 755 755 1963 755 755 1963 756 756 1961 278 110 1962 1150 1150 1964 459 459 1965 110 278 1967 110 278 1967 459 459 1965 755 755 1966 0 0 1968 1151 1151 1969 1154 1154 1971 1154 1154 1971 1151 1151 1969 460 460 1970 1151 1151 1972 111 279 1973 460 460 1975 460 460 1975 111 279 1973 757 757 1974 757 757 1977 279 111 1978 460 460 1976 460 460 1976 279 111 1978 759 759 1979 460 460 1981 759 759 1982 1154 1154 1980 1154 1154 1980 759 759 1982 112 280 1983 1056 1056 1985 461 461 1986 9 9 1984 9 9 1984 461 461 1986 1152 1152 1987 231 231 1989 758 758 1990 1056 1056 1988 1056 1056 1988 758 758 1990 461 461 1991 758 758 1993 279 111 1994 461 461 1992 461 461 1992 279 111 1994 757 757 1995 461 461 1997 757 757 1998 1152 1152 1996 1152 1152 1996 757 757 1998 111 279 1999 40 40 2000 1153 1153 2001 1055 1055 2003 1055 1055 2003 1153 1153 2001 462 462 2002 1153 1153 2004 112 280 2005 462 462 2007 462 462 2007 112 280 2005 759 759 2006 462 462 2008 759 759 2009 758 758 2011 758 758 2011 759 759 2009 279 111 2010 1055 1055 2012 462 462 2013 231 231 2015 231 231 2015 462 462 2013 758 758 2014 40 40 2016 942 942 2017 1153 1153 2019 1153 1153 2019 942 942 2017 463 463 2018 942 942 2020 174 174 2021 463 463 2023 463 463 2023 174 174 2021 760 760 2022 463 463 2024 760 760 2025 762 762 2027 762 762 2027 760 760 2025 280 112 2026 1153 1153 2028 463 463 2029 112 280 2031 112 280 2031 463 463 2029 762 762 2030 38 38 2032 1155 1155 2033 941 941 2035 941 941 2035 1155 1155 2033 464 464 2034 1155 1155 2036 113 281 2037 464 464 2039 464 464 2039 113 281 2037 761 761 2038 761 761 2041 280 112 2042 464 464 2040 464 464 2040 280 112 2042 760 760 2043 464 464 2045 760 760 2046 941 941 2044 941 941 2044 760 760 2046 174 174 2047 1154 1154 2049 465 465 2050 0 0 2048 0 0 2048 465 465 2050 1156 1156 2051 112 280 2053 762 762 2054 1154 1154 2052 1154 1154 2052 762 762 2054 465 465 2055 762 762 2057 280 112 2058 465 465 2056 465 465 2056 280 112 2058 761 761 2059 465 465 2061 761 761 2062 1156 1156 2060 1156 1156 2060 761 761 2062 113 281 2063 35 35 2064 952 952 2065 1160 1160 2067 1160 1160 2067 952 952 2065 466 466 2066 952 952 2068 179 179 2069 466 466 2071 466 466 2071 179 179 2069 763 763 2070 466 466 2072 763 763 2073 765 765 2075 765 765 2075 763 763 2073 281 113 2074 1160 1160 2076 466 466 2077 115 283 2079 115 283 2079 466 466 2077 765 765 2078 1157 1157 2081 467 467 2082 14 14 2080 14 14 2080 467 467 2082 951 951 2083 114 282 2085 764 764 2086 1157 1157 2084 1157 1157 2084 764 764 2086 467 467 2087 764 764 2089 281 113 2090 467 467 2088 467 467 2088 281 113 2090 763 763 2091 467 467 2093 763 763 2094 951 951 2092 951 951 2092 763 763 2094 179 179 2095 8 8 2096 1159 1159 2097 1158 1158 2099 1158 1158 2099 1159 1159 2097 468 468 2098 115 283 2101 765 765 2102 1159 1159 2100 1159 1159 2100 765 765 2102 468 468 2103 468 468 2104 765 765 2105 764 764 2107 764 764 2107 765 765 2105 281 113 2106 1158 1158 2108 468 468 2109 114 282 2111 114 282 2111 468 468 2109 764 764 2110 36 36 2112 1028 1028 2113 1162 1162 2115 1162 1162 2115 1028 1028 2113 469 469 2114 1028 1028 2116 217 217 2117 469 469 2119 469 469 2119 217 217 2117 766 766 2118 766 766 2121 282 114 2122 469 469 2120 469 469 2120 282 114 2122 768 768 2123 469 469 2125 768 768 2126 1162 1162 2124 1162 1162 2124 768 768 2126 116 284 2127 16 16 2128 1006 1006 2129 1027 1027 2131 1027 1027 2131 1006 1006 2129 470 470 2130 1006 1006 2132 206 206 2133 470 470 2135 470 470 2135 206 206 2133 767 767 2134 767 767 2137 282 114 2138 470 470 2136 470 470 2136 282 114 2138 766 766 2139 1027 1027 2140 470 470 2141 217 217 2143 217 217 2143 470 470 2141 766 766 2142 30 30 2144 1161 1161 2145 1005 1005 2147 1005 1005 2147 1161 1161 2145 471 471 2146 1161 1161 2148 116 284 2149 471 471 2151 471 471 2151 116 284 2149 768 768 2150 471 471 2152 768 768 2153 767 767 2155 767 767 2155 768 768 2153 282 114 2154 1005 1005 2156 471 471 2157 206 206 2159 206 206 2159 471 471 2157 767 767 2158 36 36 2160 1162 1162 2161 947 947 2163 947 947 2163 1162 1162 2161 472 472 2162 1162 1162 2164 116 284 2165 472 472 2167 472 472 2167 116 284 2165 769 769 2166 472 472 2168 769 769 2169 771 771 2171 771 771 2171 769 769 2169 283 115 2170 472 472 2173 771 771 2174 947 947 2172 947 947 2172 771 771 2174 177 177 2175 1163 1163 2177 473 473 2178 30 30 2176 30 30 2176 473 473 2178 1161 1161 2179 117 285 2181 770 770 2182 1163 1163 2180 1163 1163 2180 770 770 2182 473 473 2183 770 770 2185 283 115 2186 473 473 2184 473 473 2184 283 115 2186 769 769 2187 473 473 2189 769 769 2190 1161 1161 2188 1161 1161 2188 769 769 2190 116 284 2191 8 8 2192 948 948 2193 1164 1164 2195 1164 1164 2195 948 948 2193 474 474 2194 948 948 2196 177 177 2197 474 474 2199 474 474 2199 177 177 2197 771 771 2198 474 474 2200 771 771 2201 770 770 2203 770 770 2203 771 771 2201 283 115 2202 1164 1164 2204 474 474 2205 117 285 2207 117 285 2207 474 474 2205 770 770 2206 8 8 2208 1164 1164 2209 1159 1159 2211 1159 1159 2211 1164 1164 2209 475 475 2210 117 285 2213 772 772 2214 1164 1164 2212 1164 1164 2212 772 772 2214 475 475 2215 475 475 2216 772 772 2217 774 774 2219 774 774 2219 772 772 2217 284 116 2218 1159 1159 2220 475 475 2221 115 283 2223 115 283 2223 475 475 2221 774 774 2222 30 30 2224 1165 1165 2225 1163 1163 2227 1163 1163 2227 1165 1165 2225 476 476 2226 1165 1165 2228 118 286 2229 476 476 2231 476 476 2231 118 286 2229 773 773 2230 476 476 2232 773 773 2233 772 772 2235 772 772 2235 773 773 2233 284 116 2234 1163 1163 2236 476 476 2237 117 285 2239 117 285 2239 476 476 2237 772 772 2238 1160 1160 2241 477 477 2242 35 35 2240 35 35 2240 477 477 2242 1166 1166 2243 115 283 2245 774 774 2246 1160 1160 2244 1160 1160 2244 774 774 2246 477 477 2247 774 774 2249 284 116 2250 477 477 2248 477 477 2248 284 116 2250 773 773 2251 477 477 2253 773 773 2254 1166 1166 2252 1166 1166 2252 773 773 2254 118 286 2255 1024 1024 2257 478 478 2258 35 35 2256 35 35 2256 478 478 2258 953 953 2259 215 215 2261 775 775 2262 1024 1024 2260 1024 1024 2260 775 775 2262 478 478 2263 775 775 2265 285 117 2266 478 478 2264 478 478 2264 285 117 2266 777 777 2267 478 478 2269 777 777 2270 953 953 2268 953 953 2268 777 777 2270 180 180 2271 33 33 2272 1012 1012 2273 1023 1023 2275 1023 1023 2275 1012 1012 2273 479 479 2274 209 209 2277 776 776 2278 1012 1012 2276 1012 1012 2276 776 776 2278 479 479 2279 776 776 2281 285 117 2282 479 479 2280 479 479 2280 285 117 2282 775 775 2283 1023 1023 2284 479 479 2285 215 215 2287 215 215 2287 479 479 2285 775 775 2286 31 31 2288 954 954 2289 1011 1011 2291 1011 1011 2291 954 954 2289 480 480 2290 954 954 2292 180 180 2293 480 480 2295 480 480 2295 180 180 2293 777 777 2294 480 480 2296 777 777 2297 776 776 2299 776 776 2299 777 777 2297 285 117 2298 1011 1011 2300 480 480 2301 209 209 2303 209 209 2303 480 480 2301 776 776 2302 23 23 2304 980 980 2305 1170 1170 2307 1170 1170 2307 980 980 2305 481 481 2306 980 980 2308 193 193 2309 481 481 2311 481 481 2311 193 193 2309 778 778 2310 481 481 2312 778 778 2313 780 780 2315 780 780 2315 778 778 2313 286 118 2314 1170 1170 2316 481 481 2317 120 288 2319 120 288 2319 481 481 2317 780 780 2318 20 20 2320 1167 1167 2321 979 979 2323 979 979 2323 1167 1167 2321 482 482 2322 119 287 2325 779 779 2326 1167 1167 2324 1167 1167 2324 779 779 2326 482 482 2327 779 779 2329 286 118 2330 482 482 2328 482 482 2328 286 118 2330 778 778 2331 482 482 2333 778 778 2334 979 979 2332 979 979 2332 778 778 2334 193 193 2335 18 18 2336 1169 1169 2337 1168 1168 2339 1168 1168 2339 1169 1169 2337 483 483 2338 1169 1169 2340 120 288 2341 483 483 2343 483 483 2343 120 288 2341 780 780 2342 483 483 2344 780 780 2345 779 779 2347 779 779 2347 780 780 2345 286 118 2346 1168 1168 2348 483 483 2349 119 287 2351 119 287 2351 483 483 2349 779 779 2350 18 18 2352 960 960 2353 1169 1169 2355 1169 1169 2355 960 960 2353 484 484 2354 960 960 2356 183 183 2357 484 484 2359 484 484 2359 183 183 2357 781 781 2358 484 484 2360 781 781 2361 783 783 2363 783 783 2363 781 781 2361 287 119 2362 1169 1169 2364 484 484 2365 120 288 2367 120 288 2367 484 484 2365 783 783 2366 21 21 2368 976 976 2369 959 959 2371 959 959 2371 976 976 2369 485 485 2370 976 976 2372 191 191 2373 485 485 2375 485 485 2375 191 191 2373 782 782 2374 782 782 2377 287 119 2378 485 485 2376 485 485 2376 287 119 2378 781 781 2379 485 485 2381 781 781 2382 959 959 2380 959 959 2380 781 781 2382 183 183 2383 23 23 2384 1170 1170 2385 975 975 2387 975 975 2387 1170 1170 2385 486 486 2386 120 288 2389 783 783 2390 1170 1170 2388 1170 1170 2388 783 783 2390 486 486 2391 783 783 2393 287 119 2394 486 486 2392 486 486 2392 287 119 2394 782 782 2395 975 975 2396 486 486 2397 191 191 2399 191 191 2399 486 486 2397 782 782 2398 18 18 2400 1168 1168 2401 965 965 2403 965 965 2403 1168 1168 2401 487 487 2402 1168 1168 2404 119 287 2405 487 487 2407 487 487 2407 119 287 2405 784 784 2406 487 487 2408 784 784 2409 786 786 2411 786 786 2411 784 784 2409 288 120 2410 965 965 2412 487 487 2413 186 186 2415 186 186 2415 487 487 2413 786 786 2414 20 20 2416 970 970 2417 1167 1167 2419 1167 1167 2419 970 970 2417 488 488 2418 970 970 2420 188 188 2421 488 488 2423 488 488 2423 188 188 2421 785 785 2422 785 785 2425 288 120 2426 488 488 2424 488 488 2424 288 120 2426 784 784 2427 488 488 2429 784 784 2430 1167 1167 2428 1167 1167 2428 784 784 2430 119 287 2431 966 966 2433 489 489 2434 19 19 2432 19 19 2432 489 489 2434 969 969 2435 186 186 2437 786 786 2438 966 966 2436 966 966 2436 786 786 2438 489 489 2439 786 786 2441 288 120 2442 489 489 2440 489 489 2440 288 120 2442 785 785 2443 489 489 2445 785 785 2446 969 969 2444 969 969 2444 785 785 2446 188 188 2447 21 21 2448 1171 1171 2449 977 977 2451 977 977 2451 1171 1171 2449 490 490 2450 1171 1171 2452 121 289 2453 490 490 2455 490 490 2455 121 289 2453 787 787 2454 787 787 2457 289 121 2458 490 490 2456 490 490 2456 289 121 2458 789 789 2459 490 490 2461 789 789 2462 977 977 2460 977 977 2460 789 789 2462 192 192 2463 990 990 2465 491 491 2466 26 26 2464 26 26 2464 491 491 2466 1172 1172 2467 198 198 2469 788 788 2470 990 990 2468 990 990 2468 788 788 2470 491 491 2471 788 788 2473 289 121 2474 491 491 2472 491 491 2472 289 121 2474 787 787 2475 491 491 2477 787 787 2478 1172 1172 2476 1172 1172 2476 787 787 2478 121 289 2479 25 25 2480 978 978 2481 989 989 2483 989 989 2483 978 978 2481 492 492 2482 978 978 2484 192 192 2485 492 492 2487 492 492 2487 192 192 2485 789 789 2486 492 492 2488 789 789 2489 788 788 2491 788 788 2491 789 789 2489 289 121 2490 989 989 2492 492 492 2493 198 198 2495 198 198 2495 492 492 2493 788 788 2494 23 23 2496 974 974 2497 1174 1174 2499 1174 1174 2499 974 974 2497 493 493 2498 974 974 2500 190 190 2501 493 493 2503 493 493 2503 190 190 2501 790 790 2502 493 493 2504 790 790 2505 792 792 2507 792 792 2507 790 790 2505 290 122 2506 493 493 2509 792 792 2510 1174 1174 2508 1174 1174 2508 792 792 2510 122 290 2511 986 986 2513 494 494 2514 25 25 2512 25 25 2512 494 494 2514 973 973 2515 196 196 2517 791 791 2518 986 986 2516 986 986 2516 791 791 2518 494 494 2519 791 791 2521 290 122 2522 494 494 2520 494 494 2520 290 122 2522 790 790 2523 494 494 2525 790 790 2526 973 973 2524 973 973 2524 790 790 2526 190 190 2527 24 24 2528 1173 1173 2529 985 985 2531 985 985 2531 1173 1173 2529 495 495 2530 1173 1173 2532 122 290 2533 495 495 2535 495 495 2535 122 290 2533 792 792 2534 495 495 2536 792 792 2537 791 791 2539 791 791 2539 792 792 2537 290 122 2538 985 985 2540 495 495 2541 196 196 2543 196 196 2543 495 495 2541 791 791 2542 1175 1175 2545 496 496 2546 24 24 2544 24 24 2544 496 496 2546 1173 1173 2547 123 291 2549 793 793 2550 1175 1175 2548 1175 1175 2548 793 793 2550 496 496 2551 793 793 2553 291 123 2554 496 496 2552 496 496 2552 291 123 2554 795 795 2555 496 496 2557 795 795 2558 1173 1173 2556 1173 1173 2556 795 795 2558 122 290 2559 982 982 2561 497 497 2562 17 17 2560 17 17 2560 497 497 2562 1176 1176 2563 194 194 2565 794 794 2566 982 982 2564 982 982 2564 794 794 2566 497 497 2567 794 794 2569 291 123 2570 497 497 2568 497 497 2568 291 123 2570 793 793 2571 497 497 2573 793 793 2574 1176 1176 2572 1176 1176 2572 793 793 2574 123 291 2575 23 23 2576 1174 1174 2577 981 981 2579 981 981 2579 1174 1174 2577 498 498 2578 1174 1174 2580 122 290 2581 498 498 2583 498 498 2583 122 290 2581 795 795 2582 498 498 2584 795 795 2585 794 794 2587 794 794 2587 795 795 2585 291 123 2586 981 981 2588 498 498 2589 194 194 2591 194 194 2591 498 498 2589 794 794 2590 26 26 2592 1177 1177 2593 991 991 2595 991 991 2595 1177 1177 2593 499 499 2594 1177 1177 2596 124 292 2597 499 499 2599 499 499 2599 124 292 2597 796 796 2598 796 796 2601 292 124 2602 499 499 2600 499 499 2600 292 124 2602 798 798 2603 499 499 2605 798 798 2606 991 991 2604 991 991 2604 798 798 2606 199 199 2607 1179 1179 2609 500 500 2610 13 13 2608 13 13 2608 500 500 2610 1178 1178 2611 125 293 2613 797 797 2614 1179 1179 2612 1179 1179 2612 797 797 2614 500 500 2615 797 797 2617 292 124 2618 500 500 2616 500 500 2616 292 124 2618 796 796 2619 500 500 2621 796 796 2622 1178 1178 2620 1178 1178 2620 796 796 2622 124 292 2623 22 22 2624 992 992 2625 1180 1180 2627 1180 1180 2627 992 992 2625 501 501 2626 992 992 2628 199 199 2629 501 501 2631 501 501 2631 199 199 2629 798 798 2630 501 501 2632 798 798 2633 797 797 2635 797 797 2635 798 798 2633 292 124 2634 1180 1180 2636 501 501 2637 125 293 2639 125 293 2639 501 501 2637 797 797 2638 34 34 2640 1016 1016 2641 997 997 2643 997 997 2643 1016 1016 2641 502 502 2642 1016 1016 2644 211 211 2645 502 502 2647 502 502 2647 211 211 2645 799 799 2646 502 502 2648 799 799 2649 801 801 2651 801 801 2651 799 799 2649 293 125 2650 997 997 2652 502 502 2653 202 202 2655 202 202 2655 502 502 2653 801 801 2654 1000 1000 2657 503 503 2658 29 29 2656 29 29 2656 503 503 2658 1015 1015 2659 203 203 2661 800 800 2662 1000 1000 2660 1000 1000 2660 800 800 2662 503 503 2663 800 800 2665 293 125 2666 503 503 2664 503 503 2664 293 125 2666 799 799 2667 503 503 2669 799 799 2670 1015 1015 2668 1015 1015 2668 799 799 2670 211 211 2671 998 998 2673 504 504 2674 28 28 2672 28 28 2672 504 504 2674 999 999 2675 202 202 2677 801 801 2678 998 998 2676 998 998 2676 801 801 2678 504 504 2679 801 801 2681 293 125 2682 504 504 2680 504 504 2680 293 125 2682 800 800 2683 504 504 2685 800 800 2686 999 999 2684 999 999 2684 800 800 2686 203 203 2687 18 18 2688 964 964 2689 1184 1184 2691 1184 1184 2691 964 964 2689 505 505 2690 964 964 2692 185 185 2693 505 505 2695 505 505 2695 185 185 2693 802 802 2694 802 802 2697 294 126 2698 505 505 2696 505 505 2696 294 126 2698 804 804 2699 505 505 2701 804 804 2702 1184 1184 2700 1184 1184 2700 804 804 2702 127 295 2703 1181 1181 2705 506 506 2706 15 15 2704 15 15 2704 506 506 2706 963 963 2707 126 294 2709 803 803 2710 1181 1181 2708 1181 1181 2708 803 803 2710 506 506 2711 803 803 2713 294 126 2714 506 506 2712 506 506 2712 294 126 2714 802 802 2715 506 506 2717 802 802 2718 963 963 2716 963 963 2716 802 802 2718 185 185 2719 5 5 2720 1183 1183 2721 1182 1182 2723 1182 1182 2723 1183 1183 2721 507 507 2722 1183 1183 2724 127 295 2725 507 507 2727 507 507 2727 127 295 2725 804 804 2726 507 507 2728 804 804 2729 803 803 2731 803 803 2731 804 804 2729 294 126 2730 1182 1182 2732 507 507 2733 126 294 2735 126 294 2735 507 507 2733 803 803 2734 1185 1185 2737 508 508 2738 5 5 2736 5 5 2736 508 508 2738 1183 1183 2739 128 296 2741 805 805 2742 1185 1185 2740 1185 1185 2740 805 805 2742 508 508 2743 805 805 2745 295 127 2746 508 508 2744 508 508 2744 295 127 2746 807 807 2747 508 508 2749 807 807 2750 1183 1183 2748 1183 1183 2748 807 807 2750 127 295 2751 28 28 2752 1004 1004 2753 1186 1186 2755 1186 1186 2755 1004 1004 2753 509 509 2754 1004 1004 2756 205 205 2757 509 509 2759 509 509 2759 205 205 2757 806 806 2758 509 509 2760 806 806 2761 805 805 2763 805 805 2763 806 806 2761 295 127 2762 1186 1186 2764 509 509 2765 128 296 2767 128 296 2767 509 509 2765 805 805 2766 18 18 2768 1184 1184 2769 1003 1003 2771 1003 1003 2771 1184 1184 2769 510 510 2770 1184 1184 2772 127 295 2773 510 510 2775 510 510 2775 127 295 2773 807 807 2774 510 510 2776 807 807 2777 806 806 2779 806 806 2779 807 807 2777 295 127 2778 510 510 2781 806 806 2782 1003 1003 2780 1003 1003 2780 806 806 2782 205 205 2783 18 18 2784 1002 1002 2785 1190 1190 2787 1190 1190 2787 1002 1002 2785 511 511 2786 1002 1002 2788 204 204 2789 511 511 2791 511 511 2791 204 204 2789 808 808 2790 511 511 2792 808 808 2793 810 810 2795 810 810 2795 808 808 2793 296 128 2794 1190 1190 2796 511 511 2797 130 298 2799 130 298 2799 511 511 2797 810 810 2798 29 29 2800 1187 1187 2801 1001 1001 2803 1001 1001 2803 1187 1187 2801 512 512 2802 1187 1187 2804 129 297 2805 512 512 2807 512 512 2807 129 297 2805 809 809 2806 809 809 2809 296 128 2810 512 512 2808 512 512 2808 296 128 2810 808 808 2811 512 512 2813 808 808 2814 1001 1001 2812 1001 1001 2812 808 808 2814 204 204 2815 32 32 2816 1189 1189 2817 1188 1188 2819 1188 1188 2819 1189 1189 2817 513 513 2818 1189 1189 2820 130 298 2821 513 513 2823 513 513 2823 130 298 2821 810 810 2822 810 810 2825 296 128 2826 513 513 2824 513 513 2824 296 128 2826 809 809 2827 1188 1188 2828 513 513 2829 129 297 2831 129 297 2831 513 513 2829 809 809 2830 32 32 2832 1191 1191 2833 1189 1189 2835 1189 1189 2835 1191 1191 2833 514 514 2834 1191 1191 2836 131 299 2837 514 514 2839 514 514 2839 131 299 2837 811 811 2838 811 811 2841 297 129 2842 514 514 2840 514 514 2840 297 129 2842 813 813 2843 514 514 2845 813 813 2846 1189 1189 2844 1189 1189 2844 813 813 2846 130 298 2847 30 30 2848 1008 1008 2849 1192 1192 2851 1192 1192 2851 1008 1008 2849 515 515 2850 207 207 2853 812 812 2854 1008 1008 2852 1008 1008 2852 812 812 2854 515 515 2855 812 812 2857 297 129 2858 515 515 2856 515 515 2856 297 129 2858 811 811 2859 1192 1192 2860 515 515 2861 131 299 2863 131 299 2863 515 515 2861 811 811 2862 18 18 2864 1190 1190 2865 1007 1007 2867 1007 1007 2867 1190 1190 2865 516 516 2866 1190 1190 2868 130 298 2869 516 516 2871 516 516 2871 130 298 2869 813 813 2870 516 516 2872 813 813 2873 812 812 2875 812 812 2875 813 813 2873 297 129 2874 1007 1007 2876 516 516 2877 207 207 2879 207 207 2879 516 516 2877 812 812 2878 33 33 2880 1018 1018 2881 1013 1013 2883 1013 1013 2883 1018 1018 2881 517 517 2882 212 212 2885 814 814 2886 1018 1018 2884 1018 1018 2884 814 814 2886 517 517 2887 814 814 2889 298 130 2890 517 517 2888 517 517 2888 298 130 2890 816 816 2891 1013 1013 2892 517 517 2893 210 210 2895 210 210 2895 517 517 2893 816 816 2894 34 34 2896 996 996 2897 1017 1017 2899 1017 1017 2899 996 996 2897 518 518 2898 996 996 2900 201 201 2901 518 518 2903 518 518 2903 201 201 2901 815 815 2902 518 518 2904 815 815 2905 814 814 2907 814 814 2907 815 815 2905 298 130 2906 1017 1017 2908 518 518 2909 212 212 2911 212 212 2911 518 518 2909 814 814 2910 1014 1014 2913 519 519 2914 27 27 2912 27 27 2912 519 519 2914 995 995 2915 210 210 2917 816 816 2918 1014 1014 2916 1014 1014 2916 816 816 2918 519 519 2919 816 816 2921 298 130 2922 519 519 2920 519 519 2920 298 130 2922 815 815 2923 519 519 2925 815 815 2926 995 995 2924 995 995 2924 815 815 2926 201 201 2927 33 33 2928 1022 1022 2929 1019 1019 2931 1019 1019 2931 1022 1022 2929 520 520 2930 1022 1022 2932 214 214 2933 520 520 2935 520 520 2935 214 214 2933 817 817 2934 520 520 2936 817 817 2937 819 819 2939 819 819 2939 817 817 2937 299 131 2938 1019 1019 2940 520 520 2941 213 213 2943 213 213 2943 520 520 2941 819 819 2942 1188 1188 2945 521 521 2946 32 32 2944 32 32 2944 521 521 2946 1021 1021 2947 129 297 2949 818 818 2950 1188 1188 2948 1188 1188 2948 818 818 2950 521 521 2951 818 818 2953 299 131 2954 521 521 2952 521 521 2952 299 131 2954 817 817 2955 521 521 2957 817 817 2958 1021 1021 2956 1021 1021 2956 817 817 2958 214 214 2959 1020 1020 2961 522 522 2962 29 29 2960 29 29 2960 522 522 2962 1187 1187 2963 213 213 2965 819 819 2966 1020 1020 2964 1020 1020 2964 819 819 2966 522 522 2967 819 819 2969 299 131 2970 522 522 2968 522 522 2968 299 131 2970 818 818 2971 522 522 2973 818 818 2974 1187 1187 2972 1187 1187 2972 818 818 2974 129 297 2975 35 35 2976 1166 1166 2977 1025 1025 2979 1025 1025 2979 1166 1166 2977 523 523 2978 1166 1166 2980 118 286 2981 523 523 2983 523 523 2983 118 286 2981 820 820 2982 523 523 2984 820 820 2985 822 822 2987 822 822 2987 820 820 2985 300 132 2986 1025 1025 2988 523 523 2989 216 216 2991 216 216 2991 523 523 2989 822 822 2990 1192 1192 2993 524 524 2994 30 30 2992 30 30 2992 524 524 2994 1165 1165 2995 131 299 2997 821 821 2998 1192 1192 2996 1192 1192 2996 821 821 2998 524 524 2999 821 821 3001 300 132 3002 524 524 3000 524 524 3000 300 132 3002 820 820 3003 524 524 3005 820 820 3006 1165 1165 3004 1165 1165 3004 820 820 3006 118 286 3007 1026 1026 3009 525 525 3010 32 32 3008 32 32 3008 525 525 3010 1191 1191 3011 216 216 3013 822 822 3014 1026 1026 3012 1026 1026 3012 822 822 3014 525 525 3015 822 822 3017 300 132 3018 525 525 3016 525 525 3016 300 132 3018 821 821 3019 525 525 3021 821 821 3022 1191 1191 3020 1191 1191 3020 821 821 3022 131 299 3023 7 7 3024 1193 1193 3025 1196 1196 3027 1196 1196 3027 1193 1193 3025 526 526 3026 1193 1193 3028 132 300 3029 526 526 3031 526 526 3031 132 300 3029 823 823 3030 526 526 3032 823 823 3033 825 825 3035 825 825 3035 823 823 3033 301 133 3034 1196 1196 3036 526 526 3037 133 301 3039 133 301 3039 526 526 3037 825 825 3038 1178 1178 3041 527 527 3042 13 13 3040 13 13 3040 527 527 3042 1194 1194 3043 124 292 3045 824 824 3046 1178 1178 3044 1178 1178 3044 824 824 3046 527 527 3047 824 824 3049 301 133 3050 527 527 3048 527 527 3048 301 133 3050 823 823 3051 527 527 3053 823 823 3054 1194 1194 3052 1194 1194 3052 823 823 3054 132 300 3055 26 26 3056 1195 1195 3057 1177 1177 3059 1177 1177 3059 1195 1195 3057 528 528 3058 133 301 3061 825 825 3062 1195 1195 3060 1195 1195 3060 825 825 3062 528 528 3063 825 825 3065 301 133 3066 528 528 3064 528 528 3064 301 133 3066 824 824 3067 1177 1177 3068 528 528 3069 124 292 3071 124 292 3071 528 528 3069 824 824 3070 36 36 3072 1036 1036 3073 1200 1200 3075 1200 1200 3075 1036 1036 3073 529 529 3074 1036 1036 3076 221 221 3077 529 529 3079 529 529 3079 221 221 3077 826 826 3078 529 529 3080 826 826 3081 828 828 3083 828 828 3083 826 826 3081 302 134 3082 1200 1200 3084 529 529 3085 135 303 3087 135 303 3087 529 529 3085 828 828 3086 1197 1197 3089 530 530 3090 11 11 3088 11 11 3088 530 530 3090 1035 1035 3091 134 302 3093 827 827 3094 1197 1197 3092 1197 1197 3092 827 827 3094 530 530 3095 827 827 3097 302 134 3098 530 530 3096 530 530 3096 302 134 3098 826 826 3099 530 530 3101 826 826 3102 1035 1035 3100 1035 1035 3100 826 826 3102 221 221 3103 1199 1199 3105 531 531 3106 6 6 3104 6 6 3104 531 531 3106 1198 1198 3107 135 303 3109 828 828 3110 1199 1199 3108 1199 1199 3108 828 828 3110 531 531 3111 828 828 3113 302 134 3114 531 531 3112 531 531 3112 302 134 3114 827 827 3115 1198 1198 3116 531 531 3117 134 302 3119 134 302 3119 531 531 3117 827 827 3118 36 36 3120 1201 1201 3121 1029 1029 3123 1029 1029 3123 1201 1201 3121 532 532 3122 1201 1201 3124 136 304 3125 532 532 3127 532 532 3127 136 304 3125 829 829 3126 532 532 3128 829 829 3129 831 831 3131 831 831 3131 829 829 3129 303 135 3130 1029 1029 3132 532 532 3133 218 218 3135 218 218 3135 532 532 3133 831 831 3134 26 26 3136 1172 1172 3137 1202 1202 3139 1202 1202 3139 1172 1172 3137 533 533 3138 1172 1172 3140 121 289 3141 533 533 3143 533 533 3143 121 289 3141 830 830 3142 830 830 3145 303 135 3146 533 533 3144 533 533 3144 303 135 3146 829 829 3147 533 533 3149 829 829 3150 1202 1202 3148 1202 1202 3148 829 829 3150 136 304 3151 21 21 3152 1030 1030 3153 1171 1171 3155 1171 1171 3155 1030 1030 3153 534 534 3154 218 218 3157 831 831 3158 1030 1030 3156 1030 1030 3156 831 831 3158 534 534 3159 831 831 3161 303 135 3162 534 534 3160 534 534 3160 303 135 3162 830 830 3163 534 534 3165 830 830 3166 1171 1171 3164 1171 1171 3164 830 830 3166 121 289 3167 6 6 3168 1203 1203 3169 1199 1199 3171 1199 1199 3171 1203 1203 3169 535 535 3170 1203 1203 3172 137 305 3173 535 535 3175 535 535 3175 137 305 3173 832 832 3174 832 832 3177 304 136 3178 535 535 3176 535 535 3176 304 136 3178 834 834 3179 1199 1199 3180 535 535 3181 135 303 3183 135 303 3183 535 535 3181 834 834 3182 26 26 3184 1202 1202 3185 1204 1204 3187 1204 1204 3187 1202 1202 3185 536 536 3186 1202 1202 3188 136 304 3189 536 536 3191 536 536 3191 136 304 3189 833 833 3190 536 536 3192 833 833 3193 832 832 3195 832 832 3195 833 833 3193 304 136 3194 1204 1204 3196 536 536 3197 137 305 3199 137 305 3199 536 536 3197 832 832 3198 36 36 3200 1200 1200 3201 1201 1201 3203 1201 1201 3203 1200 1200 3201 537 537 3202 1200 1200 3204 135 303 3205 537 537 3207 537 537 3207 135 303 3205 834 834 3206 537 537 3208 834 834 3209 833 833 3211 833 833 3211 834 834 3209 304 136 3210 1201 1201 3212 537 537 3213 136 304 3215 136 304 3215 537 537 3213 833 833 3214 26 26 3216 1204 1204 3217 1195 1195 3219 1195 1195 3219 1204 1204 3217 538 538 3218 1204 1204 3220 137 305 3221 538 538 3223 538 538 3223 137 305 3221 835 835 3222 538 538 3224 835 835 3225 837 837 3227 837 837 3227 835 835 3225 305 137 3226 1195 1195 3228 538 538 3229 133 301 3231 133 301 3231 538 538 3229 837 837 3230 6 6 3232 1205 1205 3233 1203 1203 3235 1203 1203 3235 1205 1205 3233 539 539 3234 1205 1205 3236 138 306 3237 539 539 3239 539 539 3239 138 306 3237 836 836 3238 836 836 3241 305 137 3242 539 539 3240 539 539 3240 305 137 3242 835 835 3243 539 539 3245 835 835 3246 1203 1203 3244 1203 1203 3244 835 835 3246 137 305 3247 1196 1196 3249 540 540 3250 7 7 3248 7 7 3248 540 540 3250 1206 1206 3251 133 301 3253 837 837 3254 1196 1196 3252 1196 1196 3252 837 837 3254 540 540 3255 837 837 3257 305 137 3258 540 540 3256 540 540 3256 305 137 3258 836 836 3259 540 540 3261 836 836 3262 1206 1206 3260 1206 1206 3260 836 836 3262 138 306 3263 38 38 3264 940 940 3265 1033 1033 3267 1033 1033 3267 940 940 3265 541 541 3266 940 940 3268 173 173 3269 541 541 3271 541 541 3271 173 173 3269 838 838 3270 541 541 3272 838 838 3273 840 840 3275 840 840 3275 838 838 3273 306 138 3274 1033 1033 3276 541 541 3277 220 220 3279 220 220 3279 541 541 3277 840 840 3278 1038 1038 3281 542 542 3282 39 39 3280 39 39 3280 542 542 3282 939 939 3283 222 222 3285 839 839 3286 1038 1038 3284 1038 1038 3284 839 839 3286 542 542 3287 839 839 3289 306 138 3290 542 542 3288 542 542 3288 306 138 3290 838 838 3291 542 542 3293 838 838 3294 939 939 3292 939 939 3292 838 838 3294 173 173 3295 36 36 3296 1034 1034 3297 1037 1037 3299 1037 1037 3299 1034 1034 3297 543 543 3298 220 220 3301 840 840 3302 1034 1034 3300 1034 1034 3300 840 840 3302 543 543 3303 840 840 3305 306 138 3306 543 543 3304 543 543 3304 306 138 3306 839 839 3307 1037 1037 3308 543 543 3309 222 222 3311 222 222 3311 543 543 3309 839 839 3310 39 39 3312 1042 1042 3313 1039 1039 3315 1039 1039 3315 1042 1042 3313 544 544 3314 1042 1042 3316 224 224 3317 544 544 3319 544 544 3319 224 224 3317 841 841 3318 544 544 3320 841 841 3321 843 843 3323 843 843 3323 841 841 3321 307 139 3322 1039 1039 3324 544 544 3325 223 223 3327 223 223 3327 544 544 3325 843 843 3326 1207 1207 3329 545 545 3330 37 37 3328 37 37 3328 545 545 3330 1041 1041 3331 139 307 3333 842 842 3334 1207 1207 3332 1207 1207 3332 842 842 3334 545 545 3335 842 842 3337 307 139 3338 545 545 3336 545 545 3336 307 139 3338 841 841 3339 545 545 3341 841 841 3342 1041 1041 3340 1041 1041 3340 841 841 3342 224 224 3343 11 11 3344 1040 1040 3345 1208 1208 3347 1208 1208 3347 1040 1040 3345 546 546 3346 223 223 3349 843 843 3350 1040 1040 3348 1040 1040 3348 843 843 3350 546 546 3351 546 546 3352 843 843 3353 842 842 3355 842 842 3355 843 843 3353 307 139 3354 1208 1208 3356 546 546 3357 139 307 3359 139 307 3359 546 546 3357 842 842 3358 40 40 3360 1058 1058 3361 1043 1043 3363 1043 1043 3363 1058 1058 3361 547 547 3362 1058 1058 3364 232 232 3365 547 547 3367 547 547 3367 232 232 3365 844 844 3366 547 547 3368 844 844 3369 846 846 3371 846 846 3371 844 844 3369 308 140 3370 1043 1043 3372 547 547 3373 225 225 3375 225 225 3375 547 547 3373 846 846 3374 1209 1209 3377 548 548 3378 10 10 3376 10 10 3376 548 548 3378 1057 1057 3379 140 308 3381 845 845 3382 1209 1209 3380 1209 1209 3380 845 845 3382 548 548 3383 845 845 3385 308 140 3386 548 548 3384 548 548 3384 308 140 3386 844 844 3387 548 548 3389 844 844 3390 1057 1057 3388 1057 1057 3388 844 844 3390 232 232 3391 37 37 3392 1044 1044 3393 1210 1210 3395 1210 1210 3395 1044 1044 3393 549 549 3394 1044 1044 3396 225 225 3397 549 549 3399 549 549 3399 225 225 3397 846 846 3398 549 549 3400 846 846 3401 845 845 3403 845 845 3403 846 846 3401 308 140 3402 1210 1210 3404 549 549 3405 140 308 3407 140 308 3407 549 549 3405 845 845 3406 41 41 3408 1211 1211 3409 1047 1047 3411 1047 1047 3411 1211 1211 3409 550 550 3410 1211 1211 3412 141 309 3413 550 550 3415 550 550 3415 141 309 3413 847 847 3414 550 550 3416 847 847 3417 849 849 3419 849 849 3419 847 847 3417 309 141 3418 1047 1047 3420 550 550 3421 227 227 3423 227 227 3423 550 550 3421 849 849 3422 1066 1066 3425 551 551 3426 46 46 3424 46 46 3424 551 551 3426 1212 1212 3427 236 236 3429 848 848 3430 1066 1066 3428 1066 1066 3428 848 848 3430 551 551 3431 848 848 3433 309 141 3434 551 551 3432 551 551 3432 309 141 3434 847 847 3435 551 551 3437 847 847 3438 1212 1212 3436 1212 1212 3436 847 847 3438 141 309 3439 45 45 3440 1048 1048 3441 1065 1065 3443 1065 1065 3443 1048 1048 3441 552 552 3442 227 227 3445 849 849 3446 1048 1048 3444 1048 1048 3444 849 849 3446 552 552 3447 849 849 3449 309 141 3450 552 552 3448 552 552 3448 309 141 3450 848 848 3451 1065 1065 3452 552 552 3453 236 236 3455 236 236 3455 552 552 3453 848 848 3454 43 43 3456 1050 1050 3457 1053 1053 3459 1053 1053 3459 1050 1050 3457 553 553 3458 1050 1050 3460 228 228 3461 553 553 3463 553 553 3463 228 228 3461 850 850 3462 553 553 3464 850 850 3465 852 852 3467 852 852 3467 850 850 3465 310 142 3466 1053 1053 3468 553 553 3469 230 230 3471 230 230 3471 553 553 3469 852 852 3470 1060 1060 3473 554 554 3474 45 45 3472 45 45 3472 554 554 3474 1049 1049 3475 233 233 3477 851 851 3478 1060 1060 3476 1060 1060 3476 851 851 3478 554 554 3479 851 851 3481 310 142 3482 554 554 3480 554 554 3480 310 142 3482 850 850 3483 554 554 3485 850 850 3486 1049 1049 3484 1049 1049 3484 850 850 3486 228 228 3487 40 40 3488 1054 1054 3489 1059 1059 3491 1059 1059 3491 1054 1054 3489 555 555 3490 230 230 3493 852 852 3494 1054 1054 3492 1054 1054 3492 852 852 3494 555 555 3495 852 852 3497 310 142 3498 555 555 3496 555 555 3496 310 142 3498 851 851 3499 1059 1059 3500 555 555 3501 233 233 3503 233 233 3503 555 555 3501 851 851 3502 45 45 3504 1064 1064 3505 1061 1061 3507 1061 1061 3507 1064 1064 3505 556 556 3506 1064 1064 3508 235 235 3509 556 556 3511 556 556 3511 235 235 3509 853 853 3510 556 556 3512 853 853 3513 855 855 3515 855 855 3515 853 853 3513 311 143 3514 1061 1061 3516 556 556 3517 234 234 3519 234 234 3519 556 556 3517 855 855 3518 1213 1213 3521 557 557 3522 44 44 3520 44 44 3520 557 557 3522 1063 1063 3523 142 310 3525 854 854 3526 1213 1213 3524 1213 1213 3524 854 854 3526 557 557 3527 854 854 3529 311 143 3530 557 557 3528 557 557 3528 311 143 3530 853 853 3531 557 557 3533 853 853 3534 1063 1063 3532 1063 1063 3532 853 853 3534 235 235 3535 10 10 3536 1062 1062 3537 1214 1214 3539 1214 1214 3539 1062 1062 3537 558 558 3538 234 234 3541 855 855 3542 1062 1062 3540 1062 1062 3540 855 855 3542 558 558 3543 558 558 3544 855 855 3545 854 854 3547 854 854 3547 855 855 3545 311 143 3546 1214 1214 3548 558 558 3549 142 310 3551 142 310 3551 558 558 3549 854 854 3550 46 46 3552 1078 1078 3553 1067 1067 3555 1067 1067 3555 1078 1078 3553 559 559 3554 1078 1078 3556 74 242 3557 559 559 3559 559 559 3559 74 242 3557 856 856 3558 559 559 3560 856 856 3561 858 858 3563 858 858 3563 856 856 3561 312 144 3562 1067 1067 3564 559 559 3565 237 237 3567 237 237 3567 559 559 3565 858 858 3566 1215 1215 3569 560 560 3570 42 42 3568 42 42 3568 560 560 3570 1077 1077 3571 143 311 3573 857 857 3574 1215 1215 3572 1215 1215 3572 857 857 3574 560 560 3575 857 857 3577 312 144 3578 560 560 3576 560 560 3576 312 144 3578 856 856 3579 560 560 3581 856 856 3582 1077 1077 3580 1077 1077 3580 856 856 3582 74 242 3583 44 44 3584 1068 1068 3585 1216 1216 3587 1216 1216 3587 1068 1068 3585 561 561 3586 237 237 3589 858 858 3590 1068 1068 3588 1068 1068 3588 858 858 3590 561 561 3591 561 561 3592 858 858 3593 857 857 3595 857 857 3595 858 858 3593 312 144 3594 1216 1216 3596 561 561 3597 143 311 3599 143 311 3599 561 561 3597 857 857 3598 2 2 3600 1217 1217 3601 1222 1222 3603 1222 1222 3603 1217 1217 3601 562 562 3602 1217 1217 3604 144 312 3605 562 562 3607 562 562 3607 144 312 3605 859 859 3606 562 562 3608 859 859 3609 861 861 3611 861 861 3611 859 859 3609 313 145 3610 562 562 3613 861 861 3614 1222 1222 3612 1222 1222 3612 861 861 3614 146 314 3615 1219 1219 3617 563 563 3618 47 47 3616 47 47 3616 563 563 3618 1218 1218 3619 145 313 3621 860 860 3622 1219 1219 3620 1219 1219 3620 860 860 3622 563 563 3623 860 860 3625 313 145 3626 563 563 3624 563 563 3624 313 145 3626 859 859 3627 563 563 3629 859 859 3630 1218 1218 3628 1218 1218 3628 859 859 3630 144 312 3631 67 67 3632 1221 1221 3633 1220 1220 3635 1220 1220 3635 1221 1221 3633 564 564 3634 1221 1221 3636 146 314 3637 564 564 3639 564 564 3639 146 314 3637 861 861 3638 564 564 3640 861 861 3641 860 860 3643 860 860 3643 861 861 3641 313 145 3642 1220 1220 3644 564 564 3645 145 313 3647 145 313 3647 564 564 3645 860 860 3646 46 46 3648 1212 1212 3649 1226 1226 3651 1226 1226 3651 1212 1212 3649 565 565 3650 1212 1212 3652 141 309 3653 565 565 3655 565 565 3655 141 309 3653 862 862 3654 565 565 3656 862 862 3657 864 864 3659 864 864 3659 862 862 3657 314 146 3658 1226 1226 3660 565 565 3661 148 316 3663 148 316 3663 565 565 3661 864 864 3662 1223 1223 3665 566 566 3666 41 41 3664 41 41 3664 566 566 3666 1211 1211 3667 147 315 3669 863 863 3670 1223 1223 3668 1223 1223 3668 863 863 3670 566 566 3671 863 863 3673 314 146 3674 566 566 3672 566 566 3672 314 146 3674 862 862 3675 566 566 3677 862 862 3678 1211 1211 3676 1211 1211 3676 862 862 3678 141 309 3679 1225 1225 3681 567 567 3682 2 2 3680 2 2 3680 567 567 3682 1224 1224 3683 148 316 3685 864 864 3686 1225 1225 3684 1225 1225 3684 864 864 3686 567 567 3687 864 864 3689 314 146 3690 567 567 3688 567 567 3688 314 146 3690 863 863 3691 1224 1224 3692 567 567 3693 147 315 3695 147 315 3695 567 567 3693 863 863 3694 2 2 3696 1227 1227 3697 1225 1225 3699 1225 1225 3699 1227 1227 3697 568 568 3698 1227 1227 3700 149 317 3701 568 568 3703 568 568 3703 149 317 3701 865 865 3702 568 568 3704 865 865 3705 867 867 3707 867 867 3707 865 865 3705 315 147 3706 1225 1225 3708 568 568 3709 148 316 3711 148 316 3711 568 568 3709 867 867 3710 1074 1074 3713 569 569 3714 63 63 3712 63 63 3712 569 569 3714 1228 1228 3715 72 240 3717 866 866 3718 1074 1074 3716 1074 1074 3716 866 866 3718 569 569 3719 866 866 3721 315 147 3722 569 569 3720 569 569 3720 315 147 3722 865 865 3723 569 569 3725 865 865 3726 1228 1228 3724 1228 1228 3724 865 865 3726 149 317 3727 46 46 3728 1226 1226 3729 1073 1073 3731 1073 1073 3731 1226 1226 3729 570 570 3730 1226 1226 3732 148 316 3733 570 570 3735 570 570 3735 148 316 3733 867 867 3734 570 570 3736 867 867 3737 866 866 3739 866 866 3739 867 867 3737 315 147 3738 1073 1073 3740 570 570 3741 72 240 3743 72 240 3743 570 570 3741 866 866 3742 1136 1136 3745 571 571 3746 67 67 3744 67 67 3744 571 571 3746 1221 1221 3747 103 271 3749 868 868 3750 1136 1136 3748 1136 1136 3748 868 868 3750 571 571 3751 868 868 3753 316 148 3754 571 571 3752 571 571 3752 316 148 3754 870 870 3755 571 571 3757 870 870 3758 1221 1221 3756 1221 1221 3756 870 870 3758 146 314 3759 63 63 3760 1228 1228 3761 1135 1135 3763 1135 1135 3763 1228 1228 3761 572 572 3762 1228 1228 3764 149 317 3765 572 572 3767 572 572 3767 149 317 3765 869 869 3766 572 572 3768 869 869 3769 868 868 3771 868 868 3771 869 869 3769 316 148 3770 1135 1135 3772 572 572 3773 103 271 3775 103 271 3775 572 572 3773 868 868 3774 2 2 3776 1222 1222 3777 1227 1227 3779 1227 1227 3779 1222 1222 3777 573 573 3778 1222 1222 3780 146 314 3781 573 573 3783 573 573 3783 146 314 3781 870 870 3782 573 573 3784 870 870 3785 869 869 3787 869 869 3787 870 870 3785 316 148 3786 573 573 3789 869 869 3790 1227 1227 3788 1227 1227 3788 869 869 3790 149 317 3791 57 57 3792 1108 1108 3793 1232 1232 3795 1232 1232 3795 1108 1108 3793 574 574 3794 1108 1108 3796 89 257 3797 574 574 3799 574 574 3799 89 257 3797 871 871 3798 871 871 3801 317 149 3802 574 574 3800 574 574 3800 317 149 3802 873 873 3803 574 574 3805 873 873 3806 1232 1232 3804 1232 1232 3804 873 873 3806 151 319 3807 1229 1229 3809 575 575 3810 48 48 3808 48 48 3808 575 575 3810 1107 1107 3811 150 318 3813 872 872 3814 1229 1229 3812 1229 1229 3812 872 872 3814 575 575 3815 872 872 3817 317 149 3818 575 575 3816 575 575 3816 317 149 3818 871 871 3819 575 575 3821 871 871 3822 1107 1107 3820 1107 1107 3820 871 871 3822 89 257 3823 4 4 3824 1231 1231 3825 1230 1230 3827 1230 1230 3827 1231 1231 3825 576 576 3826 1231 1231 3828 151 319 3829 576 576 3831 576 576 3831 151 319 3829 873 873 3830 576 576 3832 873 873 3833 872 872 3835 872 872 3835 873 873 3833 317 149 3834 1230 1230 3836 576 576 3837 150 318 3839 150 318 3839 576 576 3837 872 872 3838 46 46 3840 1072 1072 3841 1234 1234 3843 1234 1234 3843 1072 1072 3841 577 577 3842 1072 1072 3844 71 239 3845 577 577 3847 577 577 3847 71 239 3845 874 874 3846 577 577 3848 874 874 3849 876 876 3851 876 876 3851 874 874 3849 318 150 3850 1234 1234 3852 577 577 3853 152 320 3855 152 320 3855 577 577 3853 876 876 3854 49 49 3856 1088 1088 3857 1071 1071 3859 1071 1071 3859 1088 1088 3857 578 578 3858 1088 1088 3860 79 247 3861 578 578 3863 578 578 3863 79 247 3861 875 875 3862 875 875 3865 318 150 3866 578 578 3864 578 578 3864 318 150 3866 874 874 3867 1071 1071 3868 578 578 3869 71 239 3871 71 239 3871 578 578 3869 874 874 3870 53 53 3872 1233 1233 3873 1087 1087 3875 1087 1087 3875 1233 1233 3873 579 579 3874 1233 1233 3876 152 320 3877 579 579 3879 579 579 3879 152 320 3877 876 876 3878 579 579 3880 876 876 3881 875 875 3883 875 875 3883 876 876 3881 318 150 3882 1087 1087 3884 579 579 3885 79 247 3887 79 247 3887 579 579 3885 875 875 3886 46 46 3888 1235 1235 3889 1079 1079 3891 1079 1079 3891 1235 1235 3889 580 580 3890 1235 1235 3892 153 321 3893 580 580 3895 580 580 3895 153 321 3893 877 877 3894 580 580 3896 877 877 3897 879 879 3899 879 879 3899 877 877 3897 319 151 3898 1079 1079 3900 580 580 3901 75 243 3903 75 243 3903 580 580 3901 879 879 3902 57 57 3904 1237 1237 3905 1236 1236 3907 1236 1236 3907 1237 1237 3905 581 581 3906 1237 1237 3908 154 322 3909 581 581 3911 581 581 3911 154 322 3909 878 878 3910 581 581 3912 878 878 3913 877 877 3915 877 877 3915 878 878 3913 319 151 3914 1236 1236 3916 581 581 3917 153 321 3919 153 321 3919 581 581 3917 877 877 3918 1 1 3920 1080 1080 3921 1238 1238 3923 1238 1238 3923 1080 1080 3921 582 582 3922 1080 1080 3924 75 243 3925 582 582 3927 582 582 3927 75 243 3925 879 879 3926 879 879 3929 319 151 3930 582 582 3928 582 582 3928 319 151 3930 878 878 3931 1238 1238 3932 582 582 3933 154 322 3935 154 322 3935 582 582 3933 878 878 3934 53 53 3936 1100 1100 3937 1233 1233 3939 1233 1233 3939 1100 1100 3937 583 583 3938 85 253 3941 880 880 3942 1100 1100 3940 1100 1100 3940 880 880 3942 583 583 3943 880 880 3945 320 152 3946 583 583 3944 583 583 3944 320 152 3946 882 882 3947 583 583 3949 882 882 3950 1233 1233 3948 1233 1233 3948 882 882 3950 152 320 3951 57 57 3952 1236 1236 3953 1099 1099 3955 1099 1099 3955 1236 1236 3953 584 584 3954 153 321 3957 881 881 3958 1236 1236 3956 1236 1236 3956 881 881 3958 584 584 3959 881 881 3961 320 152 3962 584 584 3960 584 584 3960 320 152 3962 880 880 3963 1099 1099 3964 584 584 3965 85 253 3967 85 253 3967 584 584 3965 880 880 3966 46 46 3968 1234 1234 3969 1235 1235 3971 1235 1235 3971 1234 1234 3969 585 585 3970 1234 1234 3972 152 320 3973 585 585 3975 585 585 3975 152 320 3973 882 882 3974 585 585 3976 882 882 3977 881 881 3979 881 881 3979 882 882 3977 320 152 3978 1235 1235 3980 585 585 3981 153 321 3983 153 321 3983 585 585 3981 881 881 3982 1239 1239 3985 586 586 3986 4 4 3984 4 4 3984 586 586 3986 1231 1231 3987 155 323 3989 883 883 3990 1239 1239 3988 1239 1239 3988 883 883 3990 586 586 3991 883 883 3993 321 153 3994 586 586 3992 586 586 3992 321 153 3994 885 885 3995 586 586 3997 885 885 3998 1231 1231 3996 1231 1231 3996 885 885 3998 151 319 3999 1 1 4000 1238 1238 4001 1240 1240 4003 1240 1240 4003 1238 1238 4001 587 587 4002 154 322 4005 884 884 4006 1238 1238 4004 1238 1238 4004 884 884 4006 587 587 4007 884 884 4009 321 153 4010 587 587 4008 587 587 4008 321 153 4010 883 883 4011 1240 1240 4012 587 587 4013 155 323 4015 155 323 4015 587 587 4013 883 883 4014 57 57 4016 1232 1232 4017 1237 1237 4019 1237 1237 4019 1232 1232 4017 588 588 4018 1232 1232 4020 151 319 4021 588 588 4023 588 588 4023 151 319 4021 885 885 4022 588 588 4024 885 885 4025 884 884 4027 884 884 4027 885 885 4025 321 153 4026 1237 1237 4028 588 588 4029 154 322 4031 154 322 4031 588 588 4029 884 884 4030 52 52 4032 1146 1146 4033 1085 1085 4035 1085 1085 4035 1146 1146 4033 589 589 4034 108 276 4037 886 886 4038 1146 1146 4036 1146 1146 4036 886 886 4038 589 589 4039 886 886 4041 322 154 4042 589 589 4040 589 589 4040 322 154 4042 888 888 4043 589 589 4045 888 888 4046 1085 1085 4044 1085 1085 4044 888 888 4046 78 246 4047 50 50 4048 1241 1241 4049 1145 1145 4051 1145 1145 4051 1241 1241 4049 590 590 4050 156 324 4053 887 887 4054 1241 1241 4052 1241 1241 4052 887 887 4054 590 590 4055 887 887 4057 322 154 4058 590 590 4056 590 590 4056 322 154 4058 886 886 4059 1145 1145 4060 590 590 4061 108 276 4063 108 276 4063 590 590 4061 886 886 4062 60 60 4064 1086 1086 4065 1242 1242 4067 1242 1242 4067 1086 1086 4065 591 591 4066 1086 1086 4068 78 246 4069 591 591 4071 591 591 4071 78 246 4069 888 888 4070 591 591 4072 888 888 4073 887 887 4075 887 887 4075 888 888 4073 322 154 4074 1242 1242 4076 591 591 4077 156 324 4079 156 324 4079 591 591 4077 887 887 4078 52 52 4080 1084 1084 4081 1246 1246 4083 1246 1246 4083 1084 1084 4081 592 592 4082 1084 1084 4084 77 245 4085 592 592 4087 592 592 4087 77 245 4085 889 889 4086 592 592 4088 889 889 4089 891 891 4091 891 891 4091 889 889 4089 323 155 4090 1246 1246 4092 592 592 4093 158 326 4095 158 326 4095 592 592 4093 891 891 4094 54 54 4096 1243 1243 4097 1083 1083 4099 1083 1083 4099 1243 1243 4097 593 593 4098 157 325 4101 890 890 4102 1243 1243 4100 1243 1243 4100 890 890 4102 593 593 4103 890 890 4105 323 155 4106 593 593 4104 593 593 4104 323 155 4106 889 889 4107 593 593 4109 889 889 4110 1083 1083 4108 1083 1083 4108 889 889 4110 77 245 4111 56 56 4112 1245 1245 4113 1244 1244 4115 1244 1244 4115 1245 1245 4113 594 594 4114 1245 1245 4116 158 326 4117 594 594 4119 594 594 4119 158 326 4117 891 891 4118 594 594 4120 891 891 4121 890 890 4123 890 890 4123 891 891 4121 323 155 4122 1244 1244 4124 594 594 4125 157 325 4127 157 325 4127 594 594 4125 890 890 4126 56 56 4128 1102 1102 4129 1245 1245 4131 1245 1245 4131 1102 1102 4129 595 595 4130 86 254 4133 892 892 4134 1102 1102 4132 1102 1102 4132 892 892 4134 595 595 4135 892 892 4137 324 156 4138 595 595 4136 595 595 4136 324 156 4138 894 894 4139 595 595 4141 894 894 4142 1245 1245 4140 1245 1245 4140 894 894 4142 158 326 4143 53 53 4144 1092 1092 4145 1101 1101 4147 1101 1101 4147 1092 1092 4145 596 596 4146 81 249 4149 893 893 4150 1092 1092 4148 1092 1092 4148 893 893 4150 596 596 4151 893 893 4153 324 156 4154 596 596 4152 596 596 4152 324 156 4154 892 892 4155 1101 1101 4156 596 596 4157 86 254 4159 86 254 4159 596 596 4157 892 892 4158 52 52 4160 1246 1246 4161 1091 1091 4163 1091 1091 4163 1246 1246 4161 597 597 4162 1246 1246 4164 158 326 4165 597 597 4167 597 597 4167 158 326 4165 894 894 4166 597 597 4168 894 894 4169 893 893 4171 893 893 4171 894 894 4169 324 156 4170 1091 1091 4172 597 597 4173 81 249 4175 81 249 4175 597 597 4173 893 893 4174 56 56 4176 1244 1244 4177 1248 1248 4179 1248 1248 4179 1244 1244 4177 598 598 4178 157 325 4181 895 895 4182 1244 1244 4180 1244 1244 4180 895 895 4182 598 598 4183 895 895 4185 325 157 4186 598 598 4184 598 598 4184 325 157 4186 897 897 4187 598 598 4189 897 897 4190 1248 1248 4188 1248 1248 4188 897 897 4190 159 327 4191 1118 1118 4193 599 599 4194 54 54 4192 54 54 4192 599 599 4194 1243 1243 4195 94 262 4197 896 896 4198 1118 1118 4196 1118 1118 4196 896 896 4198 599 599 4199 896 896 4201 325 157 4202 599 599 4200 599 599 4200 325 157 4202 895 895 4203 1243 1243 4204 599 599 4205 157 325 4207 157 325 4207 599 599 4205 895 895 4206 51 51 4208 1247 1247 4209 1117 1117 4211 1117 1117 4211 1247 1247 4209 600 600 4210 1247 1247 4212 159 327 4213 600 600 4215 600 600 4215 159 327 4213 897 897 4214 600 600 4216 897 897 4217 896 896 4219 896 896 4219 897 897 4217 325 157 4218 1117 1117 4220 600 600 4221 94 262 4223 94 262 4223 600 600 4221 896 896 4222 56 56 4224 1248 1248 4225 1097 1097 4227 1097 1097 4227 1248 1248 4225 601 601 4226 1248 1248 4228 159 327 4229 601 601 4231 601 601 4231 159 327 4229 898 898 4230 601 601 4232 898 898 4233 900 900 4235 900 900 4235 898 898 4233 326 158 4234 1097 1097 4236 601 601 4237 84 252 4239 84 252 4239 601 601 4237 900 900 4238 1249 1249 4241 602 602 4242 51 51 4240 51 51 4240 602 602 4242 1247 1247 4243 160 328 4245 899 899 4246 1249 1249 4244 1249 1249 4244 899 899 4246 602 602 4247 899 899 4249 326 158 4250 602 602 4248 602 602 4248 326 158 4250 898 898 4251 602 602 4253 898 898 4254 1247 1247 4252 1247 1247 4252 898 898 4254 159 327 4255 1098 1098 4257 603 603 4258 59 59 4256 59 59 4256 603 603 4258 1250 1250 4259 84 252 4261 900 900 4262 1098 1098 4260 1098 1098 4260 900 900 4262 603 603 4263 900 900 4265 326 158 4266 603 603 4264 603 603 4264 326 158 4266 899 899 4267 603 603 4269 899 899 4270 1250 1250 4268 1250 1250 4268 899 899 4270 160 328 4271 56 56 4272 1096 1096 4273 1103 1103 4275 1103 1103 4275 1096 1096 4273 604 604 4274 1096 1096 4276 83 251 4277 604 604 4279 604 604 4279 83 251 4277 901 901 4278 604 604 4280 901 901 4281 903 903 4283 903 903 4283 901 901 4281 327 159 4282 1103 1103 4284 604 604 4285 87 255 4287 87 255 4287 604 604 4285 903 903 4286 58 58 4288 1251 1251 4289 1095 1095 4291 1095 1095 4291 1251 1251 4289 605 605 4290 161 329 4293 902 902 4294 1251 1251 4292 1251 1251 4292 902 902 4294 605 605 4295 902 902 4297 327 159 4298 605 605 4296 605 605 4296 327 159 4298 901 901 4299 605 605 4301 901 901 4302 1095 1095 4300 1095 1095 4300 901 901 4302 83 251 4303 57 57 4304 1104 1104 4305 1252 1252 4307 1252 1252 4307 1104 1104 4305 606 606 4306 1104 1104 4308 87 255 4309 606 606 4311 606 606 4311 87 255 4309 903 903 4310 606 606 4312 903 903 4313 902 902 4315 902 902 4315 903 903 4313 327 159 4314 1252 1252 4316 606 606 4317 161 329 4319 161 329 4319 606 606 4317 902 902 4318 57 57 4320 1252 1252 4321 1109 1109 4323 1109 1109 4323 1252 1252 4321 607 607 4322 1252 1252 4324 161 329 4325 607 607 4327 607 607 4327 161 329 4325 904 904 4326 607 607 4328 904 904 4329 906 906 4331 906 906 4331 904 904 4329 328 160 4330 1109 1109 4332 607 607 4333 90 258 4335 90 258 4335 607 607 4333 906 906 4334 1114 1114 4337 608 608 4338 58 58 4336 58 58 4336 608 608 4338 1251 1251 4339 92 260 4341 905 905 4342 1114 1114 4340 1114 1114 4340 905 905 4342 608 608 4343 905 905 4345 328 160 4346 608 608 4344 608 608 4344 328 160 4346 904 904 4347 608 608 4349 904 904 4350 1251 1251 4348 1251 1251 4348 904 904 4350 161 329 4351 55 55 4352 1110 1110 4353 1113 1113 4355 1113 1113 4355 1110 1110 4353 609 609 4354 90 258 4357 906 906 4358 1110 1110 4356 1110 1110 4356 906 906 4358 609 609 4359 906 906 4361 328 160 4362 609 609 4360 609 609 4360 328 160 4362 905 905 4363 1113 1113 4364 609 609 4365 92 260 4367 92 260 4367 609 609 4365 905 905 4366 66 66 4368 1130 1130 4369 1123 1123 4371 1123 1123 4371 1130 1130 4369 610 610 4370 1130 1130 4372 100 268 4373 610 610 4375 610 610 4375 100 268 4373 907 907 4374 610 610 4376 907 907 4377 909 909 4379 909 909 4379 907 907 4377 329 161 4378 1123 1123 4380 610 610 4381 97 265 4383 97 265 4383 610 610 4381 909 909 4382 64 64 4384 1253 1253 4385 1129 1129 4387 1129 1129 4387 1253 1253 4385 611 611 4386 1253 1253 4388 162 330 4389 611 611 4391 611 611 4391 162 330 4389 908 908 4390 908 908 4393 329 161 4394 611 611 4392 611 611 4392 329 161 4394 907 907 4395 611 611 4397 907 907 4398 1129 1129 4396 1129 1129 4396 907 907 4398 100 268 4399 61 61 4400 1124 1124 4401 1254 1254 4403 1254 1254 4403 1124 1124 4401 612 612 4402 1124 1124 4404 97 265 4405 612 612 4407 612 612 4407 97 265 4405 909 909 4406 909 909 4409 329 161 4410 612 612 4408 612 612 4408 329 161 4410 908 908 4411 1254 1254 4412 612 612 4413 162 330 4415 162 330 4415 612 612 4413 908 908 4414 49 49 4416 1070 1070 4417 1258 1258 4419 1258 1258 4419 1070 1070 4417 613 613 4418 1070 1070 4420 70 238 4421 613 613 4423 613 613 4423 70 238 4421 910 910 4422 613 613 4424 910 910 4425 912 912 4427 912 912 4427 910 910 4425 330 162 4426 1258 1258 4428 613 613 4429 164 332 4431 164 332 4431 613 613 4429 912 912 4430 1255 1255 4433 614 614 4434 63 63 4432 63 63 4432 614 614 4434 1069 1069 4435 163 331 4437 911 911 4438 1255 1255 4436 1255 1255 4436 911 911 4438 614 614 4439 911 911 4441 330 162 4442 614 614 4440 614 614 4440 330 162 4442 910 910 4443 614 614 4445 910 910 4446 1069 1069 4444 1069 1069 4444 910 910 4446 70 238 4447 65 65 4448 1257 1257 4449 1256 1256 4451 1256 1256 4451 1257 1257 4449 615 615 4450 1257 1257 4452 164 332 4453 615 615 4455 615 615 4455 164 332 4453 912 912 4454 615 615 4456 912 912 4457 911 911 4459 911 911 4459 912 912 4457 330 162 4458 1256 1256 4460 615 615 4461 163 331 4463 163 331 4463 615 615 4461 911 911 4462 65 65 4464 1259 1259 4465 1257 1257 4467 1257 1257 4467 1259 1259 4465 616 616 4466 1259 1259 4468 165 333 4469 616 616 4471 616 616 4471 165 333 4469 913 913 4470 913 913 4473 331 163 4474 616 616 4472 616 616 4472 331 163 4474 915 915 4475 616 616 4477 915 915 4478 1257 1257 4476 1257 1257 4476 915 915 4478 164 332 4479 1128 1128 4481 617 617 4482 62 62 4480 62 62 4480 617 617 4482 1260 1260 4483 99 267 4485 914 914 4486 1128 1128 4484 1128 1128 4484 914 914 4486 617 617 4487 914 914 4489 331 163 4490 617 617 4488 617 617 4488 331 163 4490 913 913 4491 617 617 4493 913 913 4494 1260 1260 4492 1260 1260 4492 913 913 4494 165 333 4495 49 49 4496 1258 1258 4497 1127 1127 4499 1127 1127 4499 1258 1258 4497 618 618 4498 1258 1258 4500 164 332 4501 618 618 4503 618 618 4503 164 332 4501 915 915 4502 618 618 4504 915 915 4505 914 914 4507 914 914 4507 915 915 4505 331 163 4506 1127 1127 4508 618 618 4509 99 267 4511 99 267 4511 618 618 4509 914 914 4510 67 67 4512 1220 1220 4513 1133 1133 4515 1133 1133 4515 1220 1220 4513 619 619 4514 145 313 4517 916 916 4518 1220 1220 4516 1220 1220 4516 916 916 4518 619 619 4519 619 619 4520 916 916 4521 918 918 4523 918 918 4523 916 916 4521 332 164 4522 1133 1133 4524 619 619 4525 102 270 4527 102 270 4527 619 619 4525 918 918 4526 47 47 4528 1261 1261 4529 1219 1219 4531 1219 1219 4531 1261 1261 4529 620 620 4530 166 334 4533 917 917 4534 1261 1261 4532 1261 1261 4532 917 917 4534 620 620 4535 917 917 4537 332 164 4538 620 620 4536 620 620 4536 332 164 4538 916 916 4539 1219 1219 4540 620 620 4541 145 313 4543 145 313 4543 620 620 4541 916 916 4542 1134 1134 4545 621 621 4546 64 64 4544 64 64 4544 621 621 4546 1262 1262 4547 102 270 4549 918 918 4550 1134 1134 4548 1134 1134 4548 918 918 4550 621 621 4551 918 918 4553 332 164 4554 621 621 4552 621 621 4552 332 164 4554 917 917 4555 1262 1262 4556 621 621 4557 166 334 4559 166 334 4559 621 621 4557 917 917 4558 66 66 4560 1140 1140 4561 1137 1137 4563 1137 1137 4563 1140 1140 4561 622 622 4562 1140 1140 4564 105 273 4565 622 622 4567 622 622 4567 105 273 4565 919 919 4566 622 622 4568 919 919 4569 921 921 4571 921 921 4571 919 919 4569 333 165 4570 1137 1137 4572 622 622 4573 104 272 4575 104 272 4575 622 622 4573 921 921 4574 1256 1256 4577 623 623 4578 65 65 4576 65 65 4576 623 623 4578 1139 1139 4579 163 331 4581 920 920 4582 1256 1256 4580 1256 1256 4580 920 920 4582 623 623 4583 920 920 4585 333 165 4586 623 623 4584 623 623 4584 333 165 4586 919 919 4587 623 623 4589 919 919 4590 1139 1139 4588 1139 1139 4588 919 919 4590 105 273 4591 1138 1138 4593 624 624 4594 63 63 4592 63 63 4592 624 624 4594 1255 1255 4595 104 272 4597 921 921 4598 1138 1138 4596 1138 1138 4596 921 921 4598 624 624 4599 921 921 4601 333 165 4602 624 624 4600 624 624 4600 333 165 4602 920 920 4603 1255 1255 4604 624 624 4605 163 331 4607 163 331 4607 624 624 4605 920 920 4606 68 68 4608 934 934 4609 1141 1141 4611 1141 1141 4611 934 934 4609 625 625 4610 934 934 4612 170 170 4613 625 625 4615 625 625 4615 170 170 4613 922 922 4614 625 625 4616 922 922 4617 924 924 4619 924 924 4619 922 922 4617 334 166 4618 1141 1141 4620 625 625 4621 106 274 4623 106 274 4623 625 625 4621 924 924 4622 62 62 4624 1260 1260 4625 933 933 4627 933 933 4627 1260 1260 4625 626 626 4626 165 333 4629 923 923 4630 1260 1260 4628 1260 1260 4628 923 923 4630 626 626 4631 923 923 4633 334 166 4634 626 626 4632 626 626 4632 334 166 4634 922 922 4635 626 626 4637 922 922 4638 933 933 4636 933 933 4636 922 922 4638 170 170 4639 1142 1142 4641 627 627 4642 65 65 4640 65 65 4640 627 627 4642 1259 1259 4643 106 274 4645 924 924 4646 1142 1142 4644 1142 1142 4644 924 924 4646 627 627 4647 924 924 4649 334 166 4650 627 627 4648 627 627 4648 334 166 4650 923 923 4651 627 627 4653 923 923 4654 1259 1259 4652 1259 1259 4652 923 923 4654 165 333 4655 52 52 4656 1126 1126 4657 1264 1264 4659 1264 1264 4659 1126 1126 4657 628 628 4658 1126 1126 4660 98 266 4661 628 628 4663 628 628 4663 98 266 4661 925 925 4662 628 628 4664 925 925 4665 927 927 4667 927 927 4667 925 925 4665 335 167 4666 1264 1264 4668 628 628 4669 167 335 4671 167 335 4671 628 628 4669 927 927 4670 932 932 4673 629 629 4674 62 62 4672 62 62 4672 629 629 4674 1125 1125 4675 169 169 4677 926 926 4678 932 932 4676 932 932 4676 926 926 4678 629 629 4679 926 926 4681 335 167 4682 629 629 4680 629 629 4680 335 167 4682 925 925 4683 629 629 4685 925 925 4686 1125 1125 4684 1125 1125 4684 925 925 4686 98 266 4687 69 69 4688 1263 1263 4689 931 931 4691 931 931 4691 1263 1263 4689 630 630 4690 167 335 4693 927 927 4694 1263 1263 4692 1263 1263 4692 927 927 4694 630 630 4695 927 927 4697 335 167 4698 630 630 4696 630 630 4696 335 167 4698 926 926 4699 931 931 4700 630 630 4701 169 169 4703 169 169 4703 630 630 4701 926 926 4702 52 52 4704 1264 1264 4705 1147 1147 4707 1147 1147 4707 1264 1264 4705 631 631 4706 1264 1264 4708 167 335 4709 631 631 4711 631 631 4711 167 335 4709 928 928 4710 631 631 4712 928 928 4713 930 930 4715 930 930 4715 928 928 4713 336 168 4714 1147 1147 4716 631 631 4717 109 277 4719 109 277 4719 631 631 4717 930 930 4718 69 69 4720 1265 1265 4721 1263 1263 4723 1263 1263 4723 1265 1265 4721 632 632 4722 1265 1265 4724 168 336 4725 632 632 4727 632 632 4727 168 336 4725 929 929 4726 632 632 4728 929 929 4729 928 928 4731 928 928 4731 929 929 4729 336 168 4730 1263 1263 4732 632 632 4733 167 335 4735 167 335 4735 632 632 4733 928 928 4734 1148 1148 4737 633 633 4738 3 3 4736 3 3 4736 633 633 4738 1266 1266 4739 109 277 4741 930 930 4742 1148 1148 4740 1148 1148 4740 930 930 4742 633 633 4743 930 930 4745 336 168 4746 633 633 4744 633 633 4744 336 168 4746 929 929 4747 633 633 4749 929 929 4750 1266 1266 4748 1266 1266 4748 929 929 4750 168 336 4751</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape1</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_1" name="qt_gauge_background_1" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_1</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_2.dae
new file mode 100644
index 0000000..d274195
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_2.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:36:00</created>
+ <modified>2018-03-08T09:36:00</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape2" name="qt_gauge_background_Shape2">
+ <mesh>
+ <source id="qt_gauge_background_Shape2-positions" name="qt_gauge_background_Shape2-positions">
+ <float_array id="qt_gauge_background_Shape2-positions-array" count="1959">-2.155396 0 23.5936 -2.155273 0 -30.75792 49.08948 0 30.90694 72.66016 0 10.54279 -72.66016 0 10.54279 -49.08948 0 30.90695 6.035065 0 23.64778 6.035095 0 -30.65718 -36.78552 0 -20.90288 -36.05463 0 28.82109 -54.36932 0 -11.02127 -55.88412 0 30.25842 -67.13791 0 0.1253357 -53.97705 0 0.6258545 -64.27261 0 25.51559 -62.267 0 1.842239 -71.68723 0 16.767 -65.18817 0 14.10814 -55.39926 0 15.42847 -38.01624 0 2.665482 -18.39261 0 -27.7876 -18.39255 0 25.34071 -18.0947 0 -0.06558228 3.540344 0 -2.737213 36.05463 0 28.82109 36.78552 0 -20.90294 19.11102 0 25.35666 19.11108 0 -27.758 18.98843 0 -0.05897522 38.0163 0 2.665482 55.88409 0 30.25842 54.36932 0 -11.02129 55.1778 0 1.842255 67.13788 0 0.1253204 64.27264 0 25.51559 62.49738 0 0.6258392 64.53931 0 13.7258 54.87488 0 16.35866 71.68726 0 16.767 19.10712 0 12.33641 11.67682 0 11.93564 11.71091 0 -29.63734 11.51566 0 -14.74202 27.66095 0 -24.8084 19.10718 0 -13.2419 27.64026 0 -11.5457 53.99451 0 8.075821 48.53143 0 0.9778442 47.89172 0 10.19463 45.901 0 -16.22243 36.86377 0 -9.123535 46.02185 0 -6.701904 53.9306 0 -3.887222 59.61017 0 0.8303223 60.06287 0 -3.944458 59.74219 0 14.94102 59.75745 0 21.6524 59.7514 0 7.826691 64.37518 0 0.6735535 63.52588 0 5.684937 66.96259 0 7.159958 -18.36139 0 12.32124 -9.411804 0 24.19826 -8.773529 0 11.90154 -7.599152 0 -0.8266754 -52.76935 0 30.9897 -50.95273 0 21.38141 -53.91693 0 5.843582 -47.92645 0 10.09451 -58.26218 0 0.8303223 -67.00644 0 7.220032 -70.76559 0 5.790543 -45.901 0 -16.2224 -17.77444 0 -13.24524 -27.58908 0 -24.81133 -7.630341 0 -14.76915 -9.411743 0 -29.72623 27.71844 0 0.6885834 11.50168 0 -0.8127441 52.76935 0 30.9897 55.78717 0 24.77158 50.91803 0 21.44321 43.42932 0 30.155 44.2359 0 17.70172 61.57959 0 -5.54126 59.83636 0 28.53659 73.03143 0 13.70857 69.38397 0 11.93011 70.76556 0 5.790543 68.51416 0 21.11615 68.66016 0 16.51833 64.29114 0 19.4572 2.227234 0 23.42583 5.835022 0 11.55603 -0.3904419 0 11.53564 -43.42935 0 30.15501 -36.18903 0 18.43385 -44.23587 0 17.70172 -59.83636 0 28.53659 -55.82184 0 24.70976 -59.81476 0 21.59062 -61.57965 0 -5.54126 -64.36826 0 0.7940674 -60.03345 0 -3.862198 -68.51416 0 21.11613 -64.35742 0 19.479 -68.70395 0 16.54013 -73.03143 0 13.70857 -69.42783 0 11.95193 -63.58533 0 7.877151 -61.07211 0 14.90099 -59.60782 0 7.937469 -53.8183 0 -3.969467 -48.44168 0 0.8573303 -46.02191 0 -6.701904 -27.51578 0 27.0451 -27.65579 0 13.32805 -36.86377 0 -9.123505 -27.64737 0 0.687912 -27.55783 0 -11.54611 5.835052 0 -19.58893 2.227325 0 -31.04041 -0.4016418 0 -19.62726 27.58765 0 27.04668 36.18903 0 18.43384 27.72089 0 13.3295 11.71088 0 24.24608 67.19666 0 19.16278 2.789368 0 15.55989 -41.33316 0 21.25995 -58.37891 0 24.72829 -62.31912 0 -3.242233 -67.20959 0 19.16925 -70.36203 0 14.21724 -61.39035 0 10.34979 -49.26578 0 -3.485672 -30.53922 0 18.9088 -30.67175 0 -6.867798 2.789459 0 -22.25517 30.55518 0 18.90915 13.97421 0 16.15033 9.464325 0 -20.65816 24.67145 0 -16.5773 49.66241 0 5.885376 42.92157 0 -10.77762 58.04858 0 -2.937927 61.28656 0 18.95946 58.00031 0 10.36163 65.30273 0 4.843185 -12.18362 0 16.11691 -5.14032 0 7.668274 -53.36771 0 25.80357 -49.64606 0 5.434464 -47.60657 0 16.05968 -61.54993 0 18.94762 -57.77979 0 -2.937943 -65.31357 0 5.282257 -68.97067 0 8.700027 -57.69693 0 5.014023 -42.92157 0 -10.7776 -24.54074 0 8.559326 -24.39755 0 -16.57803 -10.86313 0 -9.517227 -5.266266 0 -20.71509 24.69446 0 8.562469 9.460175 0 7.695999 13.92236 0 -9.50882 30.68951 0 -6.867676 53.35748 0 25.82191 41.33307 0 21.25995 47.59631 0 16.07802 49.29242 0 -3.461304 62.32117 0 -3.266617 58.36865 0 24.74663 61.13501 0 4.981186 70.34906 0 14.21075 68.9577 0 8.693558 66.10901 0 21.38527 69.13855 0 18.43304 66.18335 0 17.45181 0.7644348 0 18.55585 4.287781 0 18.57655 3.100372 0 9.296677 -44.68738 0 24.79459 -39.31366 0 24.52872 -39.85193 0 14.65553 -60.52194 0 25.14189 -57.41199 0 27.12131 -57.30917 0 21.67548 -59.84296 0 -6.02887 -64.03442 0 -2.101547 -62.54272 0 -1.34259 -69.13858 0 18.43304 -66.10901 0 21.38527 -66.30023 0 17.51001 -71.46921 0 12.69305 -71.05447 0 15.35477 -68.3735 0 14.39812 -61.86258 0 6.899231 -62.76105 0 11.959 -59.40814 0 12.19623 -50.82422 0 -6.428925 -51.4668 0 -1.561874 -45.37827 0 -2.07254 -32.97928 0 12.96336 -32.62411 0 23.19888 -26.05612 0 20.8721 -32.95358 0 -12.23746 -33.16248 0 -3.438278 -26.00302 0 -4.57988 3.100433 0 -15.64537 4.287811 0 -25.64319 0.7644958 0 -25.68167 26.19983 0 20.87529 32.62408 0 23.19888 32.97931 0 12.96335 10.63318 0 18.97498 15.84247 0 19.46251 15.80527 0 10.08586 12.7886 0 -23.0159 8.119537 0 -25.06868 7.652588 0 -14.06218 29.12177 0 -18.57748 22.54828 0 -20.63152 22.51105 0 -10.3766 51.46893 0 9.903641 51.70618 0 3.814499 45.91547 0 4.536819 47.35278 0 -11.33672 40.61725 0 -14.30048 40.82617 0 -6.31282 56.72931 0 -5.588989 56.73352 0 -1.342606 60.3255 0 -1.56189 62.41241 0 21.55484 62.4613 0 16.99329 58.95544 0 18.048 56.73346 0 6.899231 56.67932 0 12.36107 60.57086 0 11.90085 66.15295 0 3.341614 64.11688 0 2.982849 65.24023 0 8.064896 -14.32745 0 10.06345 -14.56076 0 19.43407 -7.91452 0 18.92903 -2.229614 0 4.225327 -9.717865 0 4.737 -3.845215 0 13.74863 -53.88193 0 21.87259 -54.52203 0 28.11816 -51.63058 0 27.25464 -45.91537 0 4.536835 -51.46671 0 2.982849 -51.56149 0 9.126419 -44.40411 0 11.40544 -50.41037 0 15.62282 -47.9819 0 21.36214 -59.40817 0 17.88315 -62.93835 0 17.05147 -62.41245 0 21.55484 -59.94678 0 -1.34259 -56.13391 0 -1.561874 -56.72934 0 -5.588989 -65.35699 0 8.735413 -64.09836 0 3.814484 -66.15295 0 3.341614 -67.60767 0 10.71597 -68.58649 0 5.608246 -70.52609 0 9.435852 -56.77191 0 8.514099 -56.13382 0 2.982864 -59.78928 0 3.814484 -40.82614 0 -6.312805 -40.61728 0 -14.30045 -47.35272 0 -11.33669 -22.22437 0 14.74957 -22.17117 0 5.286087 -29.3306 0 5.978424 -21.99115 0 -10.37776 -22.04437 0 -20.63741 -29.1218 0 -18.57744 -13.60284 0 -16.27753 -13.54965 0 -5.838226 -5.521088 0 -6.675613 -4.025238 0 -25.14667 -9.951141 0 -23.06873 -2.229584 0 -14.09422 29.33063 0 5.978424 22.51093 0 5.29126 22.5481 0 14.75674 12.75137 0 4.759445 7.652557 0 4.242584 8.119568 0 13.78659 10.16623 0 -6.664215 15.8053 0 -5.833069 15.84253 0 -16.26422 26.16272 0 -4.578705 33.16254 0 -3.438263 32.95361 0 -12.23746 51.63055 0 27.25464 54.52203 0 28.11816 53.78937 0 22.03745 39.85199 0 14.65555 39.31366 0 24.52872 44.68738 0 24.7946 47.98193 0 21.36215 50.31775 0 15.78769 44.40417 0 11.40543 45.3783 0 -2.07254 51.70618 0 -1.342606 50.82422 0 -6.428955 62.56122 0 -1.56189 64.03436 0 -2.101547 59.84296 0 -6.02887 57.21655 0 21.84036 57.41199 0 27.12131 60.52191 0 25.14189 62.28406 0 8.218704 61.8811 0 2.982864 59.00952 0 3.814484 68.25677 0 14.3399 71.0545 0 15.35477 71.46924 0 12.69305 70.52606 0 9.435822 68.58649 0 5.608246 67.49091 0 10.65779 67.77966 0 20.05745 67.82355 0 17.98912 65.9469 0 19.38725 2.604187 0 19.02779 4.123108 0 13.79962 1.586945 0 13.78967 -42.25055 0 24.92996 -39.14398 0 19.54681 -42.56824 0 19.35283 -58.98825 0 26.33081 -57.21259 0 24.55089 -58.96252 0 23.24167 -62.07806 0 -4.34697 -63.38489 0 -1.59903 -61.36011 0 -3.717316 -67.77954 0 20.05745 -65.97623 0 19.40179 -67.85281 0 18.00365 -71.51456 0 14.03658 -69.61652 0 15.22482 -69.90796 0 13.33885 -62.37381 0 9.300064 -61.17361 0 12.3912 -60.58878 0 9.35939 -51.2688 0 -3.872162 -48.68875 0 -1.646606 -47.8078 0 -4.839783 -33.07758 0 18.25937 -29.23083 0 22.28703 -29.31964 0 16.25699 -33.38898 0 -7.961288 -29.3522 0 -3.631546 -29.29999 0 -8.923538 4.123138 0 -20.50157 2.604248 0 -25.79517 1.587006 0 -20.52002 29.26678 0 22.28784 33.07751 0 18.2594 29.35553 0 16.2578 12.94135 0 19.68944 16.13876 0 14.48595 12.93207 0 14.2937 10.39996 0 -24.41058 7.751801 0 -19.7323 10.2832 0 -17.87456 25.94574 0 -20.18465 22.17401 0 -15.17696 25.93634 0 -14.33369 51.48969 0 6.712158 48.88281 0 3.588623 48.64026 0 7.505066 44.21704 0 -13.19153 40.28619 0 -10.13156 44.26917 0 -8.913925 56.36084 0 -3.607361 58.76965 0 -1.464127 58.92603 0 -3.662216 62.61365 0 19.315 60.62531 0 17.31969 60.61304 0 20.17319 56.34821 0 9.400589 58.81732 0 12.41788 58.83087 0 9.285538 65.0744 0 3.081909 64.65845 0 5.432205 66.0755 0 5.980438 -14.88565 0 14.46074 -10.98334 0 19.64958 -10.7449 0 14.25935 -6.040833 0 4.000504 -6.659241 0 9.558899 -2.813904 0 9.371902 -54.47733 0 25.24812 -53.15295 0 28.10509 -52.45572 0 24.0162 -48.82303 0 3.380722 -51.45303 0 5.697601 -48.66357 0 7.31076 -47.60837 0 13.25772 -49.14294 0 18.4129 -46.06268 0 16.56129 -61.21793 0 17.293 -62.73294 0 19.32956 -60.72626 0 20.13196 -58.16476 0 -1.464111 -56.21094 0 -3.66217 -58.8313 0 -3.607346 -64.68317 0 6.42012 -65.0697 0 3.28981 -66.1048 0 6.148087 -68.04214 0 8.185486 -69.71857 0 7.528397 -69.10339 0 10.30115 -56.2215 0 5.544525 -58.12537 0 3.200134 -58.64508 0 6.364761 -40.28625 0 -10.13156 -44.21698 0 -13.1915 -44.26923 0 -8.913925 -21.82788 0 10.15567 -25.90356 0 5.050018 -25.91684 0 10.55632 -21.55783 0 -15.17867 -25.81973 0 -20.1861 -25.8064 0 -14.33395 -13.88846 0 -11.16669 -9.35437 0 -5.684082 -9.367645 0 -11.7608 -6.942627 0 -24.48279 -6.099121 0 -17.91901 -2.858826 0 -19.78448 25.9884 0 5.0513 22.17383 0 10.16273 25.99774 0 10.55812 10.2739 0 4.022919 7.751831 0 9.398956 10.39062 0 9.591248 12.81531 0 -5.675964 16.13885 0 -11.16209 12.82462 0 -11.74719 29.39209 0 -3.631256 33.38898 0 -7.961304 29.33984 0 -8.923264 53.15295 0 28.10507 54.4541 0 25.28934 52.4325 0 24.05742 39.14386 0 19.5468 42.25061 0 24.92996 42.56818 0 19.35283 49.11969 0 18.45413 47.58502 0 13.29892 46.06256 0 16.56129 48.7486 0 -1.591797 51.32867 0 -3.817337 47.80768 0 -4.839798 63.38947 0 -1.65387 62.07806 0 -4.346954 61.36475 0 -3.772171 57.18933 0 24.59209 58.98822 0 26.33081 58.93933 0 23.28287 62.25916 0 5.470673 60.49377 0 3.200134 60.59454 0 6.290909 69.58728 0 15.21025 71.51453 0 14.03656 69.87866 0 13.32433 69.71851 0 7.528412 68.01294 0 8.170975 69.07416 0 10.28658 66.47034 0 23.41458 70.29089 0 18.83028 70.21912 0 16.7771 66.91956 0 15.72177 64.35144 0 17.04521 64.27161 0 22.01741 0.287384 0 23.45862 4.023376 0 23.49049 6.048462 0 16.92262 5.167847 0 5.854965 1.042023 0 5.845901 -1.346863 0 16.88725 -46.50787 0 30.60857 -39.92221 0 29.55595 -36.04779 0 23.8615 -36.62631 0 12.06999 -41.56342 0 11.42007 -46.60437 0 23.73465 -62.03439 0 27.20915 -57.75937 0 29.53925 -55.89072 0 27.66614 -55.60217 0 21.02518 -57.95621 0 19.21349 -61.75082 0 23.55106 -58.15863 0 -8.308792 -64.58765 0 -2.727081 -65.47253 0 0.5228271 -63.43939 0 1.149841 -61.42456 0 -1.275879 -57.87735 0 -6.618988 -70.29086 0 18.83028 -66.47028 0 23.41458 -64.2717 0 22.01741 -64.61664 0 17.13248 -67.0947 0 15.80908 -70.21915 0 16.7771 -73.04404 0 12.25397 -72.58997 0 15.13635 -67.60934 0 12.89003 -71.08447 0 11.20065 -63.08173 0 4.992157 -64.15921 0 10.78021 -62.96796 0 14.6261 -58.84113 0 15.13054 -57.8219 0 11.02139 -61.05768 0 4.992157 -53.95547 0 -6.719009 -53.88943 0 -1.604813 -51.50406 0 0.6678314 -44.44452 0 1.25795 -42.45187 0 -3.430878 -49.67242 0 -8.995895 -31.89481 0 27.96014 -22.99069 0 26.14795 -23.56549 0 18.50821 -31.88004 0 8.479996 -36.78546 0 -14.15274 -37.09888 0 -4.248978 -31.9259 0 1.239166 -23.48569 0 0.3158722 -23.4407 0 -6.692245 -31.61249 0 -15.8988 5.167877 0 -12.88399 6.048492 0 -25.35722 4.023437 0 -30.92757 0.2874756 0 -30.98683 -1.391846 0 -25.42482 1.042023 0 -12.90086 23.27808 0 26.15433 31.89478 0 27.96014 36.04779 0 23.8615 36.62634 0 12.06999 31.88 0 8.479996 23.82599 0 18.51399 8.621521 0 23.89294 15.23132 0 24.72728 19.11768 0 17.93724 19.06183 0 6.901672 14.71753 0 6.698334 8.998932 0 17.08528 15.23138 0 -28.82169 8.621521 0 -30.23813 8.298431 0 -9.294144 14.77347 0 -20.4465 32.18732 0 -22.96461 23.2782 0 -26.41322 19.1178 0 -19.47308 19.06195 0 -7.333817 23.77026 0 -6.690506 31.61243 0 -15.89883 54.21167 0 11.57484 54.33856 0 4.992157 51.86328 0 1.149841 44.44452 0 1.25795 44.01788 0 7.021622 51.21967 0 13.04381 50.25653 0 -13.67027 41.38373 0 -18.64442 36.7854 0 -14.15276 37.09875 0 -4.249008 42.45178 0 -3.430878 49.67236 0 -8.995911 53.95538 0 -6.719025 54.33862 0 -1.275894 57.67419 0 1.149841 61.2149 0 0.6678162 61.54236 0 -1.604828 57.87726 0 -6.619003 61.82422 0 14.53882 57.59302 0 15.37781 57.72729 0 19.46077 61.75073 0 23.55104 61.77991 0 10.57829 57.67419 0 4.992157 65.47247 0 0.5228271 63.46716 0 0.6678314 63.1095 0 2.973511 63.89404 0 9.006943 66.1037 0 10.07527 67.33087 0 4.078308 -18.26776 0 6.889587 -18.39258 0 17.92114 -13.7944 0 24.6954 -5.460297 0 23.83557 -5.48999 0 17.0396 -12.6752 0 6.677185 -2.872162 0 -1.265686 -12.26617 0 -0.4757538 -54.29141 0 30.73547 -51.10602 0 31.04042 -49.91885 0 25.14693 -52.57874 0 18.49602 -53.88934 0 2.973511 -54.35049 0 9.641586 -51.35846 0 12.64343 -44.01785 0 7.021622 -60.21857 0 1.149841 -56.20569 0 0.6678314 -67.33093 0 4.078308 -66.27887 0 10.31566 -69.1857 0 3.007553 -71.91223 0 8.345306 -41.38373 0 -18.64438 -50.2565 0 -13.67024 -17.84818 0 -7.336594 -17.92807 0 -19.48378 -22.99084 0 -26.42502 -32.18732 0 -22.96455 -2.872131 0 -9.312439 -12.39105 0 -20.47638 -5.460205 0 -30.34482 -13.7944 0 -28.88091 31.92584 0 1.239166 23.7702 0 0.3186493 14.71756 0 -0.4636841 8.298431 0 -1.254517 51.10602 0 31.04042 54.29138 0 30.73547 55.89069 0 27.66614 55.46332 0 21.27249 52.43982 0 18.7433 49.91882 0 25.14693 39.92218 0 29.55595 46.50787 0 30.60857 46.60437 0 23.73465 41.56348 0 11.42007 64.58765 0 -2.727097 58.15857 0 -8.308823 57.75934 0 29.53925 62.03442 0 27.20915 72.58997 0 15.13635 73.04407 0 12.25397 71.08447 0 11.20065 67.43414 0 12.80276 71.91223 0 8.345306 69.18567 0 3.007553</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape2-positions-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape2-normals" name="qt_gauge_background_Shape2-normals">
+ <float_array id="qt_gauge_background_Shape2-normals-array" count="1959">0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape2-normals-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape2-tangents" name="qt_gauge_background_Shape2-tangents">
+ <float_array id="qt_gauge_background_Shape2-tangents-array" count="1959">-0.07302122 0 -0.9973304 0.09330218 0 0.9956378 0.1148113 0 -0.9933873 -0.9757445 0 0.2189126 0.94667 0 0.3222046 -0.06604243 0 -0.9978168 0.07794897 0 -0.9969574 -0.1599342 0 0.9871277 0.4091239 0 0.9124788 -0.1866661 0 -0.9824234 0.5414825 0 0.840712 0.3580809 0 -0.9336906 0.745488 0 0.666519 0.9992295 0 0.03924766 0.6910339 0 -0.7228223 -0.9335626 0 0.3584144 0.8748792 0 -0.4843412 0.955376 0 0.2953926 -0.7361247 0 0.6768459 0.2138919 0 -0.9768573 0.2313195 0 0.9728778 -0.1729125 0 -0.9849372 0.07019955 0 0.997533 -0.9825294 0 0.1861075 0.2026706 0 -0.979247 -0.4408641 0 0.8975739 0.1601304 0 -0.9870959 -0.3071149 0 0.9516724 0.9999489 0 0.01010511 -0.9892538 0 -0.1462082 -0.2869269 0 -0.9579525 -0.5820705 0 0.8131383 -0.9662915 0 -0.2574505 -0.8151953 0 0.5791862 -0.6033904 0 -0.7974459 -0.03271378 0 -0.9994648 -0.6425431 0 0.7662496 0.6717768 0 -0.7407536 -0.8281688 0 -0.5604788 -0.9999982 0 0.001885268 0.8648108 0 0.5020978 -0.2257109 0 0.9741943 -0.8610632 0 -0.5084979 -0.3772451 0 0.9261134 0.9999985 0 0.001704347 -0.7819801 0 -0.6233034 -0.9980796 0 0.06194472 -0.05155348 0 0.9986702 0.6336562 0 -0.7736148 -0.5055592 0 0.8627919 0.9998786 0 -0.01558087 -0.6755522 0 -0.7373121 0.9999617 0 0.008750372 -0.1628401 0 -0.9866525 -0.8451901 0 0.5344658 0.1896731 0 0.9818473 0.7336172 0 -0.6795629 -0.8049151 0 0.59339 0.1360845 0 0.9906972 0.9884133 0 -0.1517863 -0.959237 0 -0.2826028 0.9998515 0 0.0172349 -0.1127136 0 -0.9936275 -0.8426302 0 0.5384927 0.09247523 0 0.995715 0.1647453 0 -0.9863361 -0.9643129 0 0.2647653 0.9999538 0 0.009611822 -0.5962379 0 -0.8028078 -0.1611851 0 -0.9869242 0.9947084 0 -0.1027386 0.8696376 0 0.4936907 0.4725267 0 0.8813163 -0.9999222 0 -0.01247743 0.3311383 0 0.9435822 -0.7536991 0 0.6572197 0.1546608 0 0.9879676 -0.1297544 0 0.9915462 -0.1079088 0 0.9941608 -0.03047901 0 -0.9995354 -0.9993611 0 0.03573926 0.8711488 0 0.4910191 0.1683687 0 -0.9857241 -0.930836 0 0.3654372 -0.6831798 0 0.7302503 -0.4347324 0 -0.9005597 -0.9553737 0 -0.2954 0.3942278 0 0.9190128 -0.9123188 0 0.4094806 -0.7472845 0 -0.6645042 -0.1637507 0 0.9865018 0.9996876 0 0.02499346 -0.01690154 0 -0.9998572 -0.99921 0 0.03974055 0.969739 0 0.244144 -0.1457546 0 -0.9893208 -0.9996616 0 0.02601268 0.9201856 0 0.3914824 0.5169624 0 -0.8560081 -0.9997287 0 -0.02329186 0.7877971 0 0.6159349 0.6289421 0 0.7774521 0.2385363 0 -0.9711336 -0.8806871 0 -0.4736985 0.7895508 0 -0.6136852 -0.9994303 0 0.03375151 0.4136013 0 0.9104581 0.9999625 0 -0.008664404 -0.4584592 0 0.8887154 0.9851042 0 0.1719586 0.1434941 0 -0.9896512 -0.8653667 0 0.5011392 0.9987578 0 -0.0498287 0.06176153 0 -0.9980909 -0.6755554 0 0.7373093 -0.2045415 0 -0.9788579 -0.7848311 0 0.6197097 0.9998788 0 0.01556869 -0.1277856 0 -0.9918018 -0.7626103 0 0.6468582 -0.9950858 0 -0.09901604 -0.06270028 0 0.9980324 0.9857258 0 -0.1683586 0.2027612 0 -0.9792282 -0.9996616 0 -0.02601261 0.7590708 0 0.6510081 0.1135672 0 -0.9935303 -0.8378127 0 0.5459578 -0.9985773 0 -0.0533226 -0.9701496 0 -0.2425072 -0.9347089 0 -0.3554142 0.9770112 0 0.2131882 -0.8416259 0 -0.540061 0.1548636 0 -0.9879359 0.7297664 0 -0.6836966 0.1894588 0 -0.9818887 0.2478624 0 -0.9687953 0.3733327 0 -0.9276975 -0.7959561 0 0.6053544 -0.9343708 0 -0.356302 -0.9599542 0 -0.2801569 0.9702925 0 0.2419349 0.9428991 0 0.3330784 -0.412234 0 0.911078 0.8811295 0 0.4728751 0.3686998 0 -0.9295485 -0.2587872 0 0.9659344 0.5028243 0 -0.8643887 0.9917011 0 -0.1285645 0.5225834 0 -0.8525882 0.9711575 0 -0.238439 0.4476267 0 -0.8942205 0.9282377 0 0.3719875 0.9999998 0 -6.426e-4 0.9804577 0 0.1967299 -0.9675368 0 -0.2527302 -0.874726 0 0.4846178 0.4847017 0 0.8746795 -0.3383504 0 0.9410202 -0.2380977 0 0.9712412 -0.5071485 0 0.8618587 -0.4420276 0 0.8970014 0.4786911 0 -0.8779834 0.913647 0 -0.4065085 0.9383122 0 0.3457893 0.9763287 0 0.2162923 -0.9607285 0 -0.2774902 -0.9281939 0 -0.3720968 -0.9960116 0 -0.08922427 0.6162761 0 -0.7875301 -0.8418427 0 0.539723 -0.9601999 0 -0.2793138 -0.8336849 0 0.5522404 0.1299315 0 -0.991523 -0.3992253 0 0.9168529 -0.7953325 0 -0.6061734 0.8373062 0 0.5467343 0.622205 0 0.7828543 0.3198502 0 -0.9474681 -0.9926199 0 -0.1212671 -0.248478 0 0.9686375 0.9994064 0 -0.03445205 -0.9476812 0 -0.3192184 -0.05546863 0 0.9984604 0.9994205 0 0.03403908 -0.8656802 0 -0.5005975 -0.6126709 0 0.7903381 0.9970045 0 0.07734324 -0.6877123 0 -0.7259833 -0.6012735 0 -0.7990433 -0.6119075 0 0.7909294 0.8951416 0 0.445782 -0.7669732 0 0.6416791 0.9977667 0 0.06679462 -0.3029995 0 -0.9529907 -0.9994308 0 -0.03373472 0.09000021 0 0.9959417 0.5681039 0 -0.8229568 -0.9780715 0 -0.2082694 -0.2627038 0 0.9648765 0.9232365 0 -0.3842321 -0.9852166 0 -0.1713134 0.03048642 0 0.9995352 0.7514724 0 -0.6597645 -0.9998278 0 -0.01855742 0.2595156 0 0.9657389 0.8164847 0 -0.577367 -0.9948564 0 -0.1012951 0.05065771 0 0.9987161 0.7965343 0 -0.6045933 0.9785357 0 0.2060774 0.08990578 0 -0.9959503 -0.9875406 0 0.1573647 -0.4183339 0 0.9082933 0.9958131 0 0.09141273 -0.6726844 0 -0.7399295 -0.295695 0 0.9552824 0.9982323 0 0.05943287 -0.8258419 0 -0.5639018 0.5042243 0 -0.8635727 -0.997634 0 -0.06874825 0.8230726 0 0.5679362 0.4515123 0 -0.8922649 -0.9976542 0 -0.06845459 0.7560849 0 0.6544736 0.9999789 0 0.006502155 0.07974758 0 -0.9968151 -0.7366718 0 0.6762504 0.5091105 0 -0.8607012 -0.9968618 0 -0.07916108 0.6027936 0 0.7978972 -0.9831484 0 -0.1828092 0.05957624 0 0.9982238 0.8321861 0 -0.5544965 0.9959884 0 0.08948222 -0.1750339 0 -0.9845624 -0.7885113 0 0.6150203 -0.9883462 0 -0.152223 -0.02656147 0 0.9996472 0.8325716 0 -0.5539175 0.2340991 0 -0.9722127 -0.9764175 0 0.2158908 0.9282488 0 0.37196 -0.9920391 0 -0.1259305 -0.0601341 0 0.9981903 0.8551755 0 -0.5183386 0.05888743 0 -0.9982646 -0.8444425 0 0.5356462 0.9733431 0 0.2293541 -0.9847978 0 -0.1737048 0.009551078 0 0.9999544 0.9690395 0 -0.2469057 0.3694755 0 -0.9292405 -0.9999873 0 0.005036077 0.5309363 0 0.8474117 -0.5004665 0 -0.8657559 -0.9104642 0 0.413588 0.9285512 0 0.3712044 0.3100263 0 -0.950728 -0.9959594 0 0.08980492 0.6449136 0 0.7642555 0.0680351 0 0.9976829 0.9993282 0 -0.03664941 -0.6859756 0 -0.7276246 0.9601632 0 0.2794399 0.4752525 0 -0.8798495 -0.9998528 0 0.01715664 0.9855781 0 -0.1692215 -0.861428 0 -0.5078797 -0.5196423 0 0.8543839 0.9832527 0 0.1822474 -0.1084526 0 -0.9941016 -0.9123801 0 0.4093441 0.9901536 0 0.1399855 -0.2944126 0 -0.9556784 -0.6178236 0 0.7863167 0.9962963 0 0.085987 0.06312252 0 -0.9980058 -0.8016499 0 0.5977938 0.9959515 0 0.08989241 -0.1186956 0 -0.9929307 -0.7880084 0 0.6156644 -0.9984421 0 -0.05579691 -0.03671752 0 0.9993257 0.7975342 0 -0.6032737 -0.2218869 0 -0.9750724 -0.8007658 0 0.5989775 0.9939413 0 -0.1099123 0.2673035 0 -0.9636124 -0.9976144 0 -0.06903309 0.7726562 0 0.6348248 0.2849628 0 -0.9585386 -0.9998147 0 0.01924905 0.8794166 0 0.4760529 -0.3495249 0 0.9369271 0.9980468 0 0.06247027 -0.8314924 0 -0.5555361 -0.2815192 0 0.9595556 0.9987492 0 0.05000114 -0.6758988 0 -0.7369945 -0.4876817 0 0.8730215 0.9997118 0 -0.02400732 -0.8301062 0 -0.5576054 -0.989682 0 -0.143281 -0.1353622 0 0.9907962 0.9318335 0 -0.362886 0.9312607 0 0.3643537 0.673335 0 -0.7393375 -0.9519671 0 0.3062004 -0.1412118 0 0.9899794 0.9885645 0 -0.1507984 -0.4660919 0 -0.8847363 0.1103753 0 0.99389 0.7539782 0 -0.6568994 -0.8291011 0 0.5590987 -0.9999511 0 -0.009892106 0.4482932 0 0.8938866 0.761452 0 -0.6482213 0.9999589 0 -0.009061512 -0.1547243 0 -0.9879577 -0.8422544 0 0.5390802 -0.5474257 0 0.8368543 0.9441595 0 0.3294886 -0.3688911 0 -0.9294726 0.9208676 0 -0.3898755 -0.9758592 0 -0.2184006 0.2282736 0 0.973597 -0.8216286 0 0.5700231 0.8692204 0 0.4944249 0.1767838 0 0.9842497 -0.9963471 0 -0.08539624 0.7950026 0 0.6066061 -0.8272143 0 0.5618865 -0.975483 0 -0.2200747 0.3524703 0 0.935823 -0.8393577 0 0.5435795 -0.9333829 0 -0.3588822 -0.1134986 0 0.9935382 -0.9308389 0 0.3654298 0.9228594 0 0.3851369 -0.9249534 0 -0.3800805 -0.4439028 0 -0.8960749 -0.8215804 0 -0.5700926 -0.0476412 0 0.9988645 -0.8755372 0 0.4831507 0.2113511 0 -0.9774102 -0.821616 0 0.5700414 -0.8883279 0 -0.4592096 0.7614 0 -0.6482824 -0.9991832 0 0.04040933 -0.7773138 0 -0.6291131 0.03813866 0 -0.9992725 -0.9951671 0 0.09819587 -0.6805252 0 -0.7327247 -0.05599014 0 -0.9984313 -0.9407518 0 0.339096 -0.9085241 0 -0.4178325 0.3171983 0 -0.9483592 -0.930171 0 0.3671264 -0.8318128 0 -0.5550563 -0.4704368 0 0.8824337 0.997428 0 -0.07167512 0.8219275 0 0.5695922 -0.9430184 0 -0.3327407 -0.05597441 0 0.9984322 -0.9110789 0 0.412232 -0.9654197 0 -0.2607006 0.5865168 0 0.8099371 -0.8720185 0 0.489473 0.9699565 0 0.2432784 -0.07459101 0 -0.9972142 0.9593494 0 -0.282221 0.9375696 0 0.3477976 -0.5336206 0 -0.845724 0.8711 0 -0.4911057 -0.4781484 0 0.8782791 0.9910643 0 -0.1333853 0.8456789 0 0.533692 0.8741417 0 0.485671 -0.2825354 0 -0.9592569 0.81035 0 -0.5859461 0.114402 0 -0.9934345 -0.9389798 0 0.3439723 -0.636592 0 -0.7712008 -0.08446458 0 0.9964265 0.9374748 0 -0.348053 0.8743931 0 0.4852182 0.4904898 0 -0.871447 -0.938911 0 0.34416 -0.7916273 0 -0.6110043 0.9603442 0 -0.2788171 -0.2177922 0 -0.9759952 0.8271178 0 -0.5620286 0.5242005 0 -0.8515949 -0.9451791 0 0.3265523 -0.7905979 0 -0.6123356 0.9516415 0 -0.3072107 -0.7423613 0 -0.6699998 0.5908201 0 -0.8068034 0.3717213 0 -0.9283444 -0.9912733 0 0.131823 -0.8907489 0 -0.4544958 0.9887726 0 0.1494283 -0.05914421 0 -0.9982494 0.8858974 0 -0.4638813 0.9949821 0 -0.100053 -0.853832 0 -0.5205486 0.3090053 0 -0.9510603 0.9981472 0 0.06084532 -0.09160844 0 -0.9957951 0.8209768 0 -0.5709616 -0.9991 0 -0.04241763 0.1273879 0 0.991853 -0.5370228 0 0.8435677 -0.7986651 0 0.6017757 0.9626993 0 0.2705736 0.7381928 0 0.6745898 0.6818635 0 0.7314794 0.8565532 0 -0.5160588 0.996582 0 0.08260924 -0.1286882 0 0.9916851 0.9983378 0 -0.05763448 0.8184815 0 0.5745329 -0.2825386 0 0.9592559 0.8741342 0 -0.4856844 0.8103351 0 0.5859667 -0.5298258 0 0.8481065 0.9285528 0 -0.3712003 0.8234321 0 0.5674147 -0.4550542 0 0.8904638 0.9339927 0 -0.3572922 0.8469289 0 0.5317061 0.4716525 0 -0.8817845 -0.9404824 0 0.3398423 -0.8320903 0 -0.5546401 0.9047113 0 -0.4260252 -0.8993635 0 -0.4372018 0.3605529 0 -0.9327388 0.929578 0 0.3686255 -0.5782692 0 -0.8158461 0.8372703 0 -0.5467893 0.9692461 0 0.2460933 -0.7475108 0 -0.6642496 0.8976572 0 -0.4406945 -0.9654011 0 -0.2607694 0.5738285 0 0.8189755 -0.8978405 0 0.4403209 -0.9324628 0 -0.3612661 0.3172021 0 0.948358 -0.835919 0 0.5488528 -0.9912734 0 -0.1318223 0.3620487 0 0.9321592 -0.8856813 0 0.4642937 0.3524831 0 -0.9358182 -0.9754865 0 0.2200591 -0.8393515 0 -0.543589 -0.8568732 0 0.5155272 0.9951548 0 0.09832047 0.3005282 0 0.9537729 -0.996448 0 -0.08421087 0.02684934 0 0.9996395 -0.6803997 0 0.7328412 -0.9208197 0 0.3899885 0.9228444 0 -0.3851729 -0.4673199 0 0.8840883 -0.1269729 0 -0.9919062 -0.9333786 0 0.3588934 -0.931695 0 -0.3632415 -0.1667791 0 0.9859943 0.936987 0 -0.3493641 0.9243874 0 0.3814549 -0.8158565 0 -0.5782544 0.2113376 0 0.9774131 -0.8833292 0 0.4687531 0.8565485 0 0.5160665 0.6934868 0 -0.7204693 0.9973386 0 -0.07290889 -0.6910289 0 -0.7228271 -0.7895477 0 -0.6136892 0.00688019 0 0.9999763 -0.4161276 0 0.9093062 0.9984023 0 0.0565058 0.9999709 0 0.007628543 -0.05517225 0 -0.9984769 0.03597981 0 -0.9993525 -0.999998 0 -0.0019921 -0.9932219 0 0.1162332 0.9601528 0 0.2794755 0.9844028 0 0.1759291 -0.1148171 0 -0.9933866 -0.1683729 0 -0.9857234 -0.9999991 0 -0.001378325 -0.9976475 0 0.06855236 0.9268122 0 0.3755252 0.9308344 0 0.3654413 0.6033904 0 -0.7974459 0.4347376 0 -0.9005572 -0.9999968 0 0.002542844 -0.9982276 0 -0.05951177 0.8286397 0 0.5597823 0.711515 0 0.7026709 0.5820664 0 0.8131412 0.6831891 0 0.7302415 0.2321587 0 -0.9726779 0.3576814 0 -0.9338437 -0.9653865 0 -0.2608234 -0.7876978 0 -0.6160618 0.8281688 0 -0.5604788 0.7472768 0 -0.6645129 -1 0 -2.61715e-4 -0.9939537 0 0.1098001 0.6657302 0 0.7461926 0.1545165 0 0.9879902 0.9757482 0 0.218896 0.9553737 0 -0.2954 -0.4494326 0 0.8933142 -0.4130103 0 0.9107264 0.9681399 0 0.2504099 0.9810155 0 0.1939292 0.227192 0 -0.97385 0.1023527 0 -0.9947482 -0.8763211 0 0.4817275 -0.8971876 0 0.4416496 0.9954053 0 -0.09575136 0.9995478 0 0.03006964 0.0169717 0 -0.999856 0.09972635 0 -0.9950149 -0.8086148 0 0.5883385 -0.532069 0 0.846701 -0.202672 0 -0.9792467 -0.1944773 0 -0.980907 -0.7972716 0 0.6036207 -0.7539471 0 0.6569351 1 0 0 0.9988389 0 0.04817584 -0.2280237 0 -0.9736556 -0.08904141 0 -0.9960279 -0.7783025 0 0.6278894 -0.7317136 0 0.6816122 -0.9873791 0 -0.1583747 -0.9993161 0 -0.03697695 -0.1332115 0 0.9910876 0.02760687 0 0.9996189 0.989909 0 -0.1417045 0.977734 0 -0.2098479 0.1880091 0 -0.9821673 0.2074681 0 -0.9782418 -0.9999991 0 0.001378325 -0.9976472 0 -0.06855728 0.6878185 0 0.7258827 0.7995166 0 0.600644 0.09436424 0 -0.9955377 0.1354282 0 -0.9907872 -0.9999996 0 -8.96678e-4 -0.9999653 0 0.008332787 0.8453121 0 0.5342729 0.8872117 0 0.4613626 -0.2644106 0 0.9644102 -0.1908912 0 0.9816112 -0.8093574 0 -0.5873164 -0.8683672 0 -0.4959218 -0.4091239 0 0.9124788 -0.3438427 0 0.9390273 0.9999997 0 -8.10373e-4 0.9999707 0 0.007654893 -0.8111207 0 -0.5848787 -0.738691 0 -0.6740442 -0.9905264 0 0.1373225 -0.9938332 0 -0.1108854 -0.204489 0 0.9788689 0.06837678 0 0.9976596 0.5874085 0 -0.8092906 0.6503518 0 -0.7596331 -0.5414876 0 0.8407087 -0.472529 0 0.8813151 1 0 0 0.9988401 0 -0.04815088 -0.8086244 0 -0.5883252 -0.5320715 0 -0.8466994 0.9954033 0 0.09577234 0.988012 0 -0.1543769 -0.2672744 0 -0.9636204 -0.1007513 0 -0.9949116 -0.9192917 0 0.393577 -0.7743341 0 0.632777 0.2868598 0 0.9579726 0.1991618 0 0.9799666 0.7361114 0 -0.6768604 0.6897062 0 -0.7240893 -0.7519452 0 0.6592256 -0.8066015 0 0.5910956 0.2321631 0 0.9726769 -0.006301549 0 0.9999801 0.9676489 0 -0.2523005 0.9939148 0 -0.1101514 -0.919156 0 -0.3938938 -0.9929343 0 -0.118665 0.9996906 0 0.02487526 0.9999845 0 0.005569472 -0.1389793 0 -0.9902953 -0.09140006 0 -0.9958143 -0.8912724 0 0.4534684 -0.8012196 0 0.5983704 0.2236642 0 0.9746663 0.07498009 0 0.997185 0.2869269 0 -0.9579525 0.03047901 0 -0.9995354 -0.9897921 0 0.1425185 -0.8711915 0 0.4909433 0.9993029 0 -0.03733356 0.9935473 0 0.1134189 -0.5674946 0 -0.8233771 -0.6180514 0 -0.7861377 -0.3202156 0 -0.9473447 -0.07876826 0 -0.996893 0.9988099 0 0.0487719 0.9734742 0 -0.228797 0.8151939 0 0.5791882 0.9123229 0 0.4094716 0.4408617 0 0.8975751 0.5055619 0 0.8627904 -0.9994257 0 -0.03388517 -0.9996969 0 0.02461777 0.284115 0 0.9587902 0.3726911 0 0.9279555 -0.7159114 0 0.6981911 -0.767911 0 0.6405565 0.1240302 0 0.9922784 0.189388 0 0.9819023 -0.2280193 0 0.9736566 -0.09328731 0 0.9956392 -0.09433759 0 0.9955403 -0.1366208 0 0.9906234 0.06604995 0 -0.9978163 -0.1647485 0 -0.9863356 -0.9999968 0 -0.002542844 -0.9957442 0 0.09215962 0.699672 0 0.7144642 0.9654814 0 0.260472 0.1866675 0 -0.9824231 0.145758 0 -0.9893203 -0.9448886 0 0.327392 -0.9201872 0 0.3914787 -0.745492 0 0.6665146 -0.6289463 0 0.7774487 -0.3580809 0 -0.9336906 -0.5169571 0 -0.8560113 -0.8748861 0 -0.4843286 -0.9999623 0 -0.008685382 0.3852803 0 0.9227996 0.4085058 0 0.9127557 -0.94667 0 0.3222046 -0.8696376 0 0.4936907</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape2-tangents-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape2-binormals" name="qt_gauge_background_Shape2-binormals">
+ <float_array id="qt_gauge_background_Shape2-binormals-array" count="1959">-0.9973304 0 0.07302122 0.9956378 0 -0.09330218 -0.9933873 0 -0.1148113 0.2189126 0 0.9757445 0.3222046 0 -0.9466701 -0.9978169 0 0.06604243 -0.9969574 0 -0.07794897 0.9871277 0 0.1599342 0.9124789 0 -0.4091239 -0.9824234 0 0.1866661 0.840712 0 -0.5414826 -0.9336906 0 -0.3580809 0.666519 0 -0.745488 0.03924766 0 -0.9992296 -0.7228223 0 -0.6910339 0.3584144 0 0.9335626 -0.4843412 0 -0.8748793 0.2953926 0 -0.955376 0.6768459 0 0.7361248 -0.9768574 0 -0.2138919 0.9728779 0 -0.2313195 -0.9849373 0 0.1729125 0.997533 0 -0.07019955 0.1861075 0 0.9825294 -0.979247 0 -0.2026706 0.8975739 0 0.4408641 -0.9870959 0 -0.1601304 0.9516726 0 0.3071149 0.01010511 0 -0.999949 -0.1462082 0 0.9892539 -0.9579525 0 0.2869269 0.8131384 0 0.5820705 -0.2574506 0 0.9662915 0.5791861 0 0.8151954 -0.7974459 0 0.6033905 -0.9994648 0 0.03271378 0.7662496 0 0.6425431 -0.7407536 0 -0.6717768 -0.5604788 0 0.8281687 0.001885268 0 0.9999983 0.5020978 0 -0.8648108 0.9741943 0 0.2257109 -0.5084979 0 0.8610632 0.9261135 0 0.3772452 0.001704347 0 -0.9999986 -0.6233034 0 0.7819802 0.06194472 0 0.9980796 0.9986703 0 0.05155348 -0.7736148 0 -0.6336562 0.8627919 0 0.5055592 -0.01558087 0 -0.9998787 -0.7373121 0 0.6755522 0.008750373 0 -0.9999617 -0.9866526 0 0.1628401 0.5344658 0 0.8451902 0.9818473 0 -0.1896731 -0.6795629 0 -0.7336172 0.5933899 0 0.8049151 0.9906973 0 -0.1360845 -0.1517863 0 -0.9884133 -0.2826028 0 0.959237 0.0172349 0 -0.9998515 -0.9936276 0 0.1127136 0.5384927 0 0.8426301 0.9957151 0 -0.09247524 -0.9863362 0 -0.1647453 0.2647653 0 0.964313 0.009611823 0 -0.9999538 -0.8028079 0 0.5962379 -0.9869242 0 0.1611851 -0.1027386 0 -0.9947085 0.4936907 0 -0.8696376 0.8813164 0 -0.4725268 -0.01247743 0 0.9999222 0.9435822 0 -0.3311383 0.6572197 0 0.7536991 0.9879676 0 -0.1546608 0.9915462 0 0.1297544 0.9941608 0 0.1079088 -0.9995354 0 0.03047901 0.03573926 0 0.9993612 0.4910191 0 -0.8711488 -0.9857242 0 -0.1683687 0.3654372 0 0.930836 0.7302502 0 0.6831797 -0.9005598 0 0.4347325 -0.2954 0 0.9553738 0.9190127 0 -0.3942278 0.4094807 0 0.9123189 -0.6645043 0 0.7472845 0.9865018 0 0.1637507 0.02499346 0 -0.9996877 -0.9998572 0 0.01690154 0.03974055 0 0.9992101 0.2441441 0 -0.9697391 -0.9893209 0 0.1457546 0.02601269 0 0.9996616 0.3914824 0 -0.9201856 -0.8560082 0 -0.5169624 -0.02329186 0 0.9997287 0.6159348 0 -0.7877972 0.7774521 0 -0.6289421 -0.9711336 0 -0.2385363 -0.4736985 0 0.8806871 -0.6136852 0 -0.7895508 0.03375151 0 0.9994304 0.9104581 0 -0.4136013 -0.008664405 0 -0.9999626 0.8887155 0 0.4584593 0.1719586 0 -0.9851042 -0.9896512 0 -0.1434941 0.5011392 0 0.8653667 -0.0498287 0 -0.9987578 -0.998091 0 -0.06176154 0.7373093 0 0.6755553 -0.9788579 0 0.2045415 0.6197097 0 0.7848312 0.01556869 0 -0.9998789 -0.9918018 0 0.1277856 0.6468582 0 0.7626103 -0.09901604 0 0.9950858 0.9980324 0 0.06270028 -0.1683586 0 -0.9857258 -0.9792283 0 -0.2027612 -0.02601261 0 0.9996616 0.6510081 0 -0.7590708 -0.9935303 0 -0.1135672 0.5459579 0 0.8378127 -0.0533226 0 0.9985774 -0.2425072 0 0.9701496 -0.3554142 0 0.934709 0.2131882 0 -0.9770111 -0.540061 0 0.8416259 -0.9879358 0 -0.1548636 -0.6836966 0 -0.7297664 -0.9818887 0 -0.1894588 -0.9687953 0 -0.2478624 -0.9276975 0 -0.3733327 0.6053544 0 0.7959561 -0.3563021 0 0.9343708 -0.2801569 0 0.9599543 0.2419349 0 -0.9702924 0.3330784 0 -0.9428992 0.911078 0 0.412234 0.4728751 0 -0.8811296 -0.9295486 0 -0.3686998 0.9659344 0 0.2587872 -0.8643887 0 -0.5028243 -0.1285645 0 -0.9917012 -0.8525882 0 -0.5225834 -0.238439 0 -0.9711575 -0.8942205 0 -0.4476267 0.3719875 0 -0.9282378 -6.426e-4 0 -0.9999998 0.1967299 0 -0.9804577 -0.2527302 0 0.9675368 0.4846178 0 0.8747261 0.8746796 0 -0.4847017 0.9410203 0 0.3383504 0.9712413 0 0.2380978 0.8618587 0 0.5071485 0.8970016 0 0.4420277 -0.8779835 0 -0.4786911 -0.4065085 0 -0.913647 0.3457893 0 -0.9383123 0.2162922 0 -0.9763287 -0.2774902 0 0.9607285 -0.3720968 0 0.9281939 -0.08922427 0 0.9960116 -0.7875301 0 -0.6162761 0.539723 0 0.8418427 -0.2793138 0 0.9601999 0.5522404 0 0.8336849 -0.991523 0 -0.1299315 0.9168529 0 0.3992253 -0.6061735 0 0.7953325 0.5467343 0 -0.8373061 0.7828544 0 -0.6222051 -0.9474682 0 -0.3198502 -0.1212671 0 0.9926199 0.9686376 0 0.248478 -0.03445205 0 -0.9994064 -0.3192184 0 0.9476812 0.9984604 0 0.05546863 0.03403908 0 -0.9994205 -0.5005975 0 0.8656802 0.7903382 0 0.6126709 0.07734324 0 -0.9970045 -0.7259833 0 0.6877123 -0.7990433 0 0.6012735 0.7909294 0 0.6119075 0.445782 0 -0.8951416 0.6416791 0 0.7669733 0.06679463 0 -0.9977667 -0.9529907 0 0.3029995 -0.03373472 0 0.9994309 0.9959418 0 -0.09000021 -0.8229569 0 -0.5681039 -0.2082694 0 0.9780715 0.9648765 0 0.2627038 -0.3842321 0 -0.9232365 -0.1713134 0 0.9852167 0.9995353 0 -0.03048642 -0.6597645 0 -0.7514724 -0.01855742 0 0.9998278 0.965739 0 -0.2595156 -0.577367 0 -0.8164848 -0.1012951 0 0.9948564 0.9987161 0 -0.05065772 -0.6045933 0 -0.7965344 0.2060774 0 -0.9785357 -0.9959503 0 -0.08990578 0.1573647 0 0.9875407 0.9082934 0 0.4183339 0.09141273 0 -0.9958131 -0.7399295 0 0.6726844 0.9552824 0 0.295695 0.05943287 0 -0.9982323 -0.5639018 0 0.8258419 -0.8635728 0 -0.5042243 -0.06874824 0 0.9976341 0.5679362 0 -0.8230727 -0.892265 0 -0.4515124 -0.06845459 0 0.9976543 0.6544735 0 -0.7560849 0.006502156 0 -0.999979 -0.9968151 0 -0.07974758 0.6762505 0 0.7366719 -0.8607011 0 -0.5091105 -0.07916109 0 0.9968619 0.7978972 0 -0.6027936 -0.1828092 0 0.9831485 0.9982238 0 -0.05957625 -0.5544965 0 -0.8321861 0.08948222 0 -0.9959885 -0.9845625 0 0.1750339 0.6150203 0 0.7885113 -0.152223 0 0.9883462 0.9996472 0 0.02656147 -0.5539175 0 -0.8325716 -0.9722127 0 -0.2340991 0.2158909 0 0.9764176 0.37196 0 -0.9282488 -0.1259305 0 0.9920391 0.9981903 0 0.06013411 -0.5183386 0 -0.8551755 -0.9982646 0 -0.05888743 0.5356463 0 0.8444425 0.2293541 0 -0.9733431 -0.1737048 0 0.9847978 0.9999544 0 -0.009551078 -0.2469057 0 -0.9690396 -0.9292405 0 -0.3694755 0.005036077 0 0.9999874 0.8474117 0 -0.5309364 -0.865756 0 0.5004666 0.413588 0 0.9104642 0.3712044 0 -0.9285511 -0.950728 0 -0.3100263 0.08980492 0 0.9959594 0.7642555 0 -0.6449136 0.9976829 0 -0.0680351 -0.03664941 0 -0.9993283 -0.7276246 0 0.6859756 0.2794399 0 -0.9601632 -0.8798495 0 -0.4752525 0.01715664 0 0.9998529 -0.1692215 0 -0.9855781 -0.5078797 0 0.8614281 0.8543839 0 0.5196422 0.1822474 0 -0.9832527 -0.9941017 0 0.1084526 0.4093442 0 0.9123802 0.1399855 0 -0.9901536 -0.9556784 0 0.2944126 0.7863168 0 0.6178237 0.085987 0 -0.9962963 -0.9980058 0 -0.06312252 0.5977938 0 0.8016499 0.08989242 0 -0.9959515 -0.9929308 0 0.1186956 0.6156644 0 0.7880085 -0.05579692 0 0.9984422 0.9993257 0 0.03671752 -0.6032737 0 -0.7975342 -0.9750725 0 0.221887 0.5989776 0 0.8007658 -0.1099123 0 -0.9939413 -0.9636124 0 -0.2673035 -0.06903309 0 0.9976144 0.6348248 0 -0.7726561 -0.9585386 0 -0.2849628 0.01924906 0 0.9998147 0.4760529 0 -0.8794166 0.9369271 0 0.3495249 0.06247027 0 -0.9980468 -0.5555361 0 0.8314924 0.9595556 0 0.2815192 0.05000114 0 -0.9987493 -0.7369944 0 0.6758988 0.8730215 0 0.4876817 -0.02400732 0 -0.9997118 -0.5576054 0 0.8301062 -0.143281 0 0.9896821 0.9907963 0 0.1353622 -0.362886 0 -0.9318336 0.3643537 0 -0.9312607 -0.7393376 0 -0.673335 0.3062004 0 0.9519671 0.9899794 0 0.1412118 -0.1507984 0 -0.9885646 -0.8847364 0 0.4660919 0.99389 0 -0.1103753 -0.6568995 0 -0.7539782 0.5590987 0 0.8291011 -0.009892106 0 0.9999511 0.8938866 0 -0.4482932 -0.6482214 0 -0.761452 -0.009061512 0 -0.9999589 -0.9879577 0 0.1547243 0.5390802 0 0.8422545 0.8368544 0 0.5474257 0.3294886 0 -0.9441596 -0.9294726 0 0.3688911 -0.3898755 0 -0.9208676 -0.2184006 0 0.9758592 0.973597 0 -0.2282736 0.5700232 0 0.8216287 0.4944249 0 -0.8692204 0.9842497 0 -0.1767838 -0.08539624 0 0.9963471 0.6066061 0 -0.7950026 0.5618865 0 0.8272143 -0.2200747 0 0.975483 0.935823 0 -0.3524703 0.5435795 0 0.8393577 -0.3588822 0 0.9333829 0.9935381 0 0.1134986 0.3654298 0 0.9308389 0.3851369 0 -0.9228595 -0.3800805 0 0.9249534 -0.896075 0 0.4439028 -0.5700927 0 0.8215805 0.9988645 0 0.0476412 0.4831507 0 0.8755373 -0.9774103 0 -0.2113511 0.5700414 0 0.8216161 -0.4592097 0 0.888328 -0.6482824 0 -0.7614 0.04040933 0 0.9991833 -0.6291131 0 0.7773138 -0.9992725 0 -0.03813867 0.09819587 0 0.9951671 -0.7327247 0 0.6805252 -0.9984313 0 0.05599014 0.339096 0 0.9407518 -0.4178325 0 0.9085241 -0.9483593 0 -0.3171984 0.3671264 0 0.9301711 -0.5550564 0 0.8318129 0.8824337 0 0.4704368 -0.07167512 0 -0.9974281 0.5695922 0 -0.8219275 -0.3327407 0 0.9430184 0.9984322 0 0.05597441 0.412232 0 0.9110789 -0.2607006 0 0.9654197 0.8099371 0 -0.5865168 0.489473 0 0.8720185 0.2432784 0 -0.9699565 -0.9972143 0 0.07459101 -0.282221 0 -0.9593495 0.3477976 0 -0.9375697 -0.845724 0 0.5336206 -0.4911057 0 -0.8711001 0.8782791 0 0.4781484 -0.1333853 0 -0.9910643 0.533692 0 -0.845679 0.485671 0 -0.8741418 -0.9592569 0 0.2825354 -0.5859461 0 -0.8103501 -0.9934345 0 -0.114402 0.3439723 0 0.9389798 -0.7712008 0 0.636592 0.9964266 0 0.08446459 -0.348053 0 -0.9374748 0.4852182 0 -0.8743932 -0.871447 0 -0.4904898 0.3441601 0 0.9389111 -0.6110043 0 0.7916273 -0.2788171 0 -0.9603443 -0.9759952 0 0.2177922 -0.5620286 0 -0.8271179 -0.8515949 0 -0.5242004 0.3265523 0 0.9451792 -0.6123356 0 0.790598 -0.3072107 0 -0.9516416 -0.6699998 0 0.7423612 -0.8068034 0 -0.5908201 -0.9283445 0 -0.3717213 0.131823 0 0.9912733 -0.4544958 0 0.8907489 0.1494283 0 -0.9887726 -0.9982495 0 0.05914421 -0.4638813 0 -0.8858975 -0.100053 0 -0.9949821 -0.5205486 0 0.8538321 -0.9510604 0 -0.3090053 0.06084532 0 -0.9981472 -0.9957952 0 0.09160843 -0.5709616 0 -0.8209769 -0.04241763 0 0.9991 0.991853 0 -0.1273879 0.8435677 0 0.5370228 0.6017757 0 0.7986652 0.2705736 0 -0.9626993 0.6745898 0 -0.7381928 0.7314795 0 -0.6818635 -0.5160588 0 -0.8565532 0.08260924 0 -0.9965821 0.9916852 0 0.1286882 -0.05763449 0 -0.9983379 0.5745329 0 -0.8184815 0.9592559 0 0.2825386 -0.4856844 0 -0.8741343 0.5859667 0 -0.8103352 0.8481065 0 0.5298257 -0.3712003 0 -0.9285529 0.5674148 0 -0.8234321 0.8904638 0 0.4550542 -0.3572922 0 -0.9339927 0.5317061 0 -0.846929 -0.8817846 0 -0.4716525 0.3398423 0 0.9404824 -0.5546401 0 0.8320904 -0.4260253 0 -0.9047113 -0.4372018 0 0.8993635 -0.9327388 0 -0.3605529 0.3686255 0 -0.929578 -0.8158461 0 0.5782691 -0.5467893 0 -0.8372703 0.2460933 0 -0.9692461 -0.6642496 0 0.7475109 -0.4406945 0 -0.8976572 -0.2607694 0 0.9654011 0.8189755 0 -0.5738285 0.440321 0 0.8978405 -0.3612661 0 0.9324628 0.9483581 0 -0.3172021 0.5488528 0 0.835919 -0.1318223 0 0.9912733 0.9321592 0 -0.3620487 0.4642937 0 0.8856813 -0.9358182 0 -0.3524831 0.2200591 0 0.9754866 -0.543589 0 0.8393515 0.5155272 0 0.8568732 0.09832048 0 -0.9951549 0.953773 0 -0.3005282 -0.08421087 0 0.996448 0.9996395 0 -0.02684934 0.7328413 0 0.6803997 0.3899886 0 0.9208198 -0.3851729 0 -0.9228445 0.8840883 0 0.4673199 -0.9919063 0 0.1269729 0.3588934 0 0.9333786 -0.3632415 0 0.931695 0.9859943 0 0.1667791 -0.3493641 0 -0.9369871 0.3814549 0 -0.9243875 -0.5782545 0 0.8158565 0.9774132 0 -0.2113376 0.4687531 0 0.8833292 0.5160665 0 -0.8565486 -0.7204694 0 -0.6934868 -0.07290889 0 -0.9973386 -0.7228271 0 0.6910289 -0.6136892 0 0.7895477 0.9999763 0 -0.00688019 0.9093063 0 0.4161277 0.0565058 0 -0.9984023 0.007628543 0 -0.9999709 -0.9984769 0 0.05517226 -0.9993525 0 -0.03597981 -0.0019921 0 0.9999981 0.1162332 0 0.993222 0.2794755 0 -0.9601529 0.1759291 0 -0.984403 -0.9933867 0 0.1148171 -0.9857234 0 0.1683729 -0.001378324 0 0.999999 0.06855235 0 0.9976475 0.3755252 0 -0.9268123 0.3654413 0 -0.9308345 -0.7974459 0 -0.6033905 -0.9005572 0 -0.4347376 0.002542844 0 0.9999968 -0.05951177 0 0.9982276 0.5597823 0 -0.8286397 0.7026709 0 -0.711515 0.8131412 0 -0.5820664 0.7302415 0 -0.6831892 -0.972678 0 -0.2321587 -0.9338437 0 -0.3576814 -0.2608233 0 0.9653866 -0.6160618 0 0.7876979 -0.5604788 0 -0.8281687 -0.6645129 0 -0.7472768 -2.61715e-4 0 1 0.1098001 0 0.9939538 0.7461926 0 -0.6657302 0.9879902 0 -0.1545165 0.218896 0 -0.9757482 -0.2954 0 -0.9553738 0.8933142 0 0.4494326 0.9107264 0 0.4130103 0.2504099 0 -0.96814 0.1939292 0 -0.9810156 -0.97385 0 -0.227192 -0.9947482 0 -0.1023527 0.4817275 0 0.8763211 0.4416496 0 0.8971877 -0.09575137 0 -0.9954054 0.03006964 0 -0.9995479 -0.999856 0 -0.0169717 -0.9950149 0 -0.09972636 0.5883385 0 0.8086149 0.846701 0 0.532069 -0.9792467 0 0.202672 -0.980907 0 0.1944773 0.6036207 0 0.7972717 0.6569351 0 0.7539471 0 0 -1 0.04817585 0 -0.9988389 -0.9736556 0 0.2280237 -0.9960279 0 0.0890414 0.6278895 0 0.7783026 0.6816122 0 0.7317136 -0.1583747 0 0.9873792 -0.03697696 0 0.9993162 0.9910876 0 0.1332115 0.9996189 0 -0.02760688 -0.1417045 0 -0.9899091 -0.2098479 0 -0.977734 -0.9821674 0 -0.1880091 -0.9782418 0 -0.2074681 0.001378324 0 0.999999 -0.06855728 0 0.9976472 0.7258826 0 -0.6878185 0.600644 0 -0.7995167 -0.9955378 0 -0.09436424 -0.9907871 0 -0.1354282 -8.96678e-4 0 0.9999997 0.008332787 0 0.9999653 0.5342729 0 -0.8453121 0.4613626 0 -0.8872117 0.9644102 0 0.2644106 0.9816112 0 0.1908912 -0.5873165 0 0.8093574 -0.4959218 0 0.8683673 0.9124789 0 0.4091239 0.9390273 0 0.3438427 -8.10373e-4 0 -0.9999998 0.007654893 0 -0.9999707 -0.5848787 0 0.8111207 -0.6740442 0 0.738691 0.1373225 0 0.9905264 -0.1108854 0 0.9938332 0.978869 0 0.2044891 0.9976596 0 -0.06837678 -0.8092906 0 -0.5874085 -0.7596332 0 -0.6503519 0.8407088 0 0.5414876 0.8813152 0 0.4725291 0 0 -1 -0.04815089 0 -0.9988401 -0.5883253 0 0.8086244 -0.8466994 0 0.5320715 0.09577234 0 -0.9954033 -0.1543769 0 -0.9880121 -0.9636205 0 0.2672745 -0.9949117 0 0.1007513 0.393577 0 0.9192917 0.632777 0 0.7743341 0.9579726 0 -0.2868598 0.9799667 0 -0.1991618 -0.6768604 0 -0.7361114 -0.7240893 0 -0.6897063 0.6592256 0 0.7519452 0.5910956 0 0.8066016 0.9726769 0 -0.2321631 0.9999802 0 0.006301549 -0.2523005 0 -0.9676489 -0.1101514 0 -0.9939148 -0.3938938 0 0.919156 -0.118665 0 0.9929344 0.02487526 0 -0.9996907 0.005569472 0 -0.9999846 -0.9902953 0 0.1389793 -0.9958143 0 0.09140006 0.4534684 0 0.8912724 0.5983704 0 0.8012196 0.9746664 0 -0.2236642 0.9971851 0 -0.0749801 -0.9579525 0 -0.2869269 -0.9995354 0 -0.03047901 0.1425185 0 0.9897922 0.4909434 0 0.8711916 -0.03733356 0 -0.9993029 0.1134189 0 -0.9935473 -0.8233771 0 0.5674946 -0.7861377 0 0.6180514 -0.9473447 0 0.3202156 -0.996893 0 0.07876826 0.0487719 0 -0.9988099 -0.228797 0 -0.9734741 0.5791882 0 -0.815194 0.4094716 0 -0.9123229 0.8975751 0 -0.4408617 0.8627903 0 -0.5055619 -0.03388517 0 0.9994257 0.02461777 0 0.9996969 0.9587903 0 -0.284115 0.9279555 0 -0.3726911 0.6981912 0 0.7159114 0.6405565 0 0.767911 0.9922785 0 -0.1240302 0.9819024 0 -0.189388 0.9736566 0 0.2280193 0.9956393 0 0.09328731 0.9955403 0 0.09433759 0.9906235 0 0.1366208 -0.9978164 0 -0.06604995 -0.9863356 0 0.1647485 -0.002542844 0 0.9999968 0.09215963 0 0.9957443 0.7144642 0 -0.699672 0.260472 0 -0.9654814 -0.9824232 0 -0.1866675 -0.9893203 0 -0.145758 0.327392 0 0.9448887 0.3914787 0 0.9201873 0.6665146 0 0.745492 0.7774487 0 0.6289463 -0.9336906 0 0.3580809 -0.8560113 0 0.5169571 -0.4843286 0 0.8748862 -0.008685382 0 0.9999623 0.9227996 0 -0.3852803 0.9127557 0 -0.4085058 0.3222046 0 0.9466701 0.4936908 0 0.8696377</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape2-binormals-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape2-map1" name="qt_gauge_background_Shape2-map1">
+ <float_array id="qt_gauge_background_Shape2-map1-array" count="1306">0.8721752 0.5 0 0.5000011 1 0.8432242 0.6872078 1 0.6872078 0 1 0.1567758 0.8738099 0.53125 0.003032419 0.53125 0.1570931 0.25 0.9650815 0.25 0.3204279 0.125 0.9927033 0.125 0.5 0.03517868 0.509196 0.1331608 0.9234734 0.0625 0.5286463 0.07681997 0.75 0.004410611 0.7247784 0.05696676 0.7458915 0.1234941 0.54181 0.2416333 0.04409654 0.375 0.8979102 0.375 0.4981391 0.3770245 0.4554188 0.5240613 0.9650815 0.75 0.1570923 0.75 0.8979102 0.625 0.04409542 0.625 0.4982449 0.6290491 0.5418101 0.7583667 0.9927033 0.875 0.3204278 0.875 0.5286463 0.875 0.5 0.9648213 0.9234734 0.9375 0.509196 0.9247458 0.7186646 0.938623 0.7607657 0.8729415 0.75 0.9955894 0.8055809 0.9568848 0.7478206 0.5190658 0.8394004 0.2187674 0.8951741 0.1033354 0.4472638 0.0761548 0.8056843 0.04302703 0.7265704 0.02148031 0.664682 0.08277771 0.4433982 0.1650577 0.8015083 0.2923385 0.3892002 0.291549 0.143028 0.5190661 0.8015083 0.7076615 0.7572052 0.5946463 0.1684793 0.5639963 0.2336944 0.6675631 0.5932961 0.8375165 0.3266289 0.7918245 0.4521564 0.8946322 0.802714 0.9165324 0.6648716 0.8941822 0.5766047 0.9440008 0.7566582 0.4175228 0.6217088 0.4653907 0.9121571 0.1371948 0.5860857 0.1625945 0.7561352 0.176242 0.8025245 0.08167769 0.4521564 0.1071946 0.5836254 0.05592502 0.6387075 0.03093294 0.5793625 0.107879 0.3266292 0.2081755 0.6359068 0.3332157 0.2336929 0.3341895 0.3467669 0.426172 0.167548 0.4645349 0.6359516 0.6677209 0.6221704 0.5640767 0.3468905 0.5945107 0.389202 0.7085716 0.91245 0.8627353 0.8394004 0.7812327 0.7564281 0.8236881 0.4437878 0.8351232 0.4468742 0.9238592 0.895467 0.8965948 0.5788376 0.9154872 0.726467 0.9784316 0.6386042 0.9689789 0.8367367 0.9665447 0.7620204 0.9672585 0.8115323 0.9369884 0.8729925 0.515625 0.6837075 0.5389237 0.6833234 0.4984453 0.9825407 0.2033879 0.7943259 0.2536792 0.7827401 0.1986432 0.9580883 0.09375 0.895028 0.1209825 0.845646 0.09343462 0.4102139 0.08008934 0.5117964 0.06189945 0.4372432 0.0915886 0.8367367 0.0334553 0.8118811 0.06256094 0.7623693 0.03244388 0.7186039 0.002205306 0.6917583 0.02768944 0.6251443 0.06786029 0.7374567 0.08494073 0.6261085 0.09489225 0.4355285 0.133828 0.5128977 0.1707803 0.391838 0.1868142 0.9314958 0.3125 0.7118168 0.312045 0.3527173 0.2494672 0.5101879 0.3121029 0.3139784 0.3127121 0.1855118 0.5389239 0.001516209 0.5156255 0.1847922 0.4983692 0.9314958 0.6875 0.7943259 0.7463208 0.7118208 0.6880315 0.8858601 0.578125 0.6959421 0.62949 0.689777 0.5786258 0.02356392 0.578125 0.2626176 0.5778967 0.1005939 0.6875 0.2866066 0.62949 0.313985 0.6878477 0.6283209 0.8669589 0.5148245 0.82983 0.6622027 0.8254827 0.23876 0.8125 0.352717 0.7505327 0.3918378 0.8131858 0.4368434 0.8669354 0.5124654 0.9051239 0.4359283 0.9086117 0.7380964 0.9060214 0.8466345 0.9061765 0.6243371 0.9060839 0.5098695 0.9381478 0.5900902 0.9317363 0.6135866 0.9557329 0.6957183 0.3752121 0.8850427 0.4375 0.6891732 0.4414719 0.4859688 0.4483546 0.9963517 0.1408879 0.8415787 0.152994 0.5926273 0.1335687 0.6606022 0.1742814 0.5124654 0.1040381 0.6145475 0.04396942 0.5936039 0.01758934 0.2387605 0.1875 0.2865886 0.3792014 0.1005948 0.3125 0.2622194 0.4481426 0.02204827 0.4375005 0.5101988 0.6883805 0.4861919 0.578168 0.9963517 0.8591121 0.8960165 0.8787817 0.8425672 0.8467702 0.9825407 0.7966121 0.7827401 0.8013568 0.4102139 0.9199107 0.9580883 0.90625 0.7186039 0.9977947 0.6914094 0.9720129 0.5936039 0.9824107 0.8443985 0.9494292 0.7904753 0.9715582 0.7782446 0.9497968 0.7950433 0.508125 0.7955282 0.5271875 0.6478433 0.521071 0.8969827 0.1943747 0.8924167 0.2318228 0.7335348 0.2291576 0.9044675 0.08854167 0.9347974 0.1107758 0.8457823 0.1105145 0.4022828 0.0921963 0.4653476 0.0631014 0.4777213 0.07494645 0.7904754 0.02844177 0.8443984 0.05057079 0.7791749 0.04940949 0.706039 0.01304238 0.7412533 0.01542094 0.7294149 0.03531858 0.6095071 0.07956831 0.6904134 0.0734622 0.6942066 0.09624916 0.3958856 0.1534896 0.4742149 0.1502214 0.46605 0.1916001 0.7064729 0.2758655 0.871148 0.2772862 0.8316371 0.3229167 0.3019426 0.2760417 0.4442123 0.274621 0.4259572 0.3232784 0.2490157 0.5210712 0.08796054 0.5271878 0.08706097 0.5081256 0.8316371 0.6770834 0.871148 0.7227138 0.706473 0.7241346 0.8018977 0.5703125 0.8090475 0.6066927 0.6604615 0.6074161 0.1289124 0.5859375 0.09714709 0.5532292 0.2743314 0.5520085 0.2005647 0.6979167 0.1670423 0.6522656 0.3332672 0.652989 0.6575484 0.8497939 0.5601822 0.8514063 0.5717331 0.8120512 0.3174131 0.8229167 0.2689569 0.7760417 0.3982497 0.7774624 0.409316 0.886643 0.4777213 0.885573 0.4742149 0.9099847 0.8471099 0.9243065 0.7709123 0.9245012 0.7877779 0.9006739 0.6095071 0.8855729 0.6968427 0.8852052 0.689483 0.9116532 0.5523825 0.9512972 0.5468842 0.9357524 0.6281459 0.9433868 0.660102 0.4026273 0.8086429 0.4010417 0.8010081 0.4491406 0.5667509 0.484847 0.5749326 0.4339555 0.7181741 0.4767969 0.8489364 0.1338066 0.9507404 0.1304166 0.9363191 0.1471871 0.5717331 0.1879488 0.5468842 0.1502213 0.6451206 0.149577 0.6815654 0.1982201 0.7490014 0.1574004 0.8420966 0.1719843 0.7851417 0.09624916 0.7718426 0.07225712 0.8471099 0.07569358 0.4777213 0.09258914 0.4742149 0.1185026 0.4093161 0.113357 0.638868 0.05581951 0.5601822 0.06437353 0.5523824 0.04870274 0.6705374 0.04052351 0.5886256 0.0321639 0.6539556 0.01945239 0.6353289 0.1141658 0.5468842 0.1185026 0.5601822 0.09365923 0.3982499 0.2225376 0.2689574 0.2239583 0.3174134 0.1770833 0.7337372 0.3489583 0.5837119 0.34932 0.5947828 0.3006626 0.3332487 0.350544 0.1670431 0.3501823 0.2005654 0.3020833 0.2367549 0.4075521 0.405834 0.4079138 0.3924434 0.4624773 0.095616 0.4755735 0.1281625 0.4323701 0.2738186 0.4848472 0.5947828 0.6993374 0.5837948 0.652989 0.7338012 0.6522657 0.5752921 0.5866609 0.5670274 0.5520085 0.7189357 0.5532292 0.392626 0.5690918 0.4059167 0.6074161 0.2368731 0.6066927 0.4259759 0.6778067 0.4442121 0.7253791 0.3019421 0.7239584 0.9363191 0.8528128 0.9507405 0.8695835 0.8515726 0.8655644 0.7335349 0.7708424 0.8924167 0.7681772 0.8969827 0.8056253 0.8420966 0.8280158 0.7516376 0.8419706 0.6815654 0.80178 0.46605 0.8083999 0.4777213 0.8514062 0.3958855 0.8465105 0.4742149 0.9251795 0.4653475 0.9368986 0.4022828 0.9078037 0.8484185 0.8888564 0.9347973 0.8892242 0.9044675 0.9114584 0.6306053 0.9232962 0.5468842 0.9205576 0.5601822 0.9010417 0.7284846 0.9638878 0.7412533 0.9845791 0.7060389 0.9869577 0.6539556 0.9805476 0.5886256 0.9678361 0.6696069 0.9586827 0.8198588 0.9610988 0.7859712 0.9613634 0.8100067 0.9482246 0.8030564 0.5179427 0.7196705 0.5275334 0.719473 0.5115178 0.8984085 0.2121277 0.811999 0.233721 0.8089768 0.2102168 0.9215196 0.09930854 0.8922444 0.1114109 0.8716395 0.09924322 0.4294968 0.07740331 0.4735613 0.06879635 0.4396234 0.08270966 0.8198588 0.03890119 0.8102393 0.05157704 0.7862037 0.03843811 0.7237414 0.01324304 0.7417694 0.02645184 0.7134495 0.02458129 0.6478968 0.07609379 0.6973244 0.08425076 0.6488451 0.0882252 0.4371475 0.1512923 0.4728603 0.1691012 0.4216758 0.1748141 0.7914089 0.2749492 0.8554862 0.3010924 0.7588131 0.3007372 0.3714971 0.2730823 0.4411211 0.3005165 0.3561103 0.3008717 0.1710674 0.5275337 0.0860538 0.5179431 0.1707011 0.5115181 0.8554863 0.6989076 0.7914089 0.7250509 0.7588132 0.6992629 0.8135114 0.5872201 0.7304821 0.6094387 0.72757 0.5874009 0.1079999 0.569948 0.1833676 0.5521949 0.2128086 0.5696428 0.1754825 0.6760873 0.2559473 0.6504543 0.2696011 0.6762682 0.606516 0.8499355 0.5565706 0.8322185 0.6191954 0.8305709 0.2877425 0.8007813 0.3367955 0.7737927 0.3565319 0.8011365 0.4413817 0.8833144 0.4757781 0.8994102 0.4405051 0.9007478 0.8088515 0.9255708 0.7761314 0.9120229 0.8225738 0.9119743 0.6495041 0.882955 0.6977508 0.8997355 0.6476642 0.8998274 0.5484084 0.9426863 0.5860492 0.9394338 0.5947561 0.9494908 0.7300909 0.3988339 0.8128473 0.4260873 0.7269812 0.4277076 0.5631561 0.4589454 0.6518211 0.4554745 0.6488317 0.4816089 0.9033959 0.1300004 0.9494114 0.1385209 0.883545 0.1430197 0.5532461 0.1681884 0.5902929 0.1503142 0.6160884 0.1692718 0.7111834 0.1764435 0.793947 0.1655341 0.7643394 0.1864682 0.7757049 0.08394949 0.8090841 0.07361876 0.8219147 0.08725652 0.4757781 0.1047 0.4405051 0.1177045 0.4413817 0.09989561 0.6018459 0.06039932 0.5517329 0.05734513 0.5974365 0.05031079 0.6300154 0.03714374 0.6204803 0.02544129 0.6648759 0.03004903 0.587845 0.1179067 0.5503584 0.1049675 0.6009611 0.1014354 0.3367958 0.2262073 0.2877429 0.1992187 0.3565321 0.1988636 0.6612523 0.351653 0.5799372 0.323954 0.6676589 0.3238636 0.2559432 0.3534889 0.1754833 0.3245248 0.2695969 0.3246152 0.320093 0.4056113 0.408298 0.4364259 0.3105926 0.4363355 0.1067981 0.4535486 0.2121216 0.4585492 0.1824626 0.4813033 0.5799578 0.6766233 0.6613531 0.6504543 0.6676749 0.6764425 0.5635153 0.5698236 0.6493038 0.5521948 0.652378 0.5701287 0.4084283 0.5870957 0.320143 0.6094387 0.3107863 0.5869149 0.4411256 0.6997548 0.3714967 0.7269177 0.3561147 0.6993996 0.9494114 0.8614792 0.9040549 0.8698424 0.8842041 0.8568231 0.811999 0.766279 0.8984085 0.7878723 0.8089769 0.7897832 0.7946061 0.8343087 0.7118424 0.8233993 0.7643395 0.8135319 0.4737369 0.8313057 0.438024 0.8491146 0.4216757 0.825186 0.4726847 0.9312351 0.4294967 0.9225968 0.4387468 0.9173219 0.8929034 0.8884319 0.9215197 0.9006915 0.8722986 0.9005995 0.5866641 0.9231273 0.5503584 0.9111291 0.5997802 0.9118137 0.7415369 0.9733498 0.7237414 0.986757 0.7132169 0.9752203 0.6204802 0.9745587 0.6297828 0.9626578 0.6646433 0.9697526 0.880105 0.9520223 0.7933683 0.9810671 0.7622671 0.9797406 0.7505809 0.9547999 0.7717426 0.9373465 0.8561352 0.9370112 0.8725839 0.5078125 0.8734012 0.5234375 0.7687307 0.5381771 0.5928096 0.535122 0.5926642 0.5070817 0.7679341 0.4952409 0.9912704 0.1800818 0.9738111 0.2266939 0.8822492 0.2535218 0.6921892 0.2510796 0.6817987 0.2175261 0.8806939 0.1803861 0.9407809 0.078125 0.9753958 0.109375 0.9444784 0.1215947 0.835385 0.1221157 0.8064139 0.1061172 0.8806584 0.08012132 0.3653209 0.1025447 0.455107 0.05763401 0.5071909 0.05247354 0.5175748 0.06885248 0.4787878 0.08254595 0.3925934 0.1050057 0.7933683 0.01893296 0.880105 0.04797765 0.8561352 0.06298884 0.7731382 0.06085085 0.7519765 0.04400954 0.7622672 0.02025941 0.7029059 0.001102653 0.7343019 0.003307959 0.7053007 0.04051214 0.6841192 0.01503885 0.5790128 0.07128294 0.6715643 0.06395971 0.7330607 0.07205586 0.741127 0.1001029 0.6754211 0.10703 0.5790128 0.08503903 0.3909941 0.1316596 0.4735282 0.1337565 0.5098672 0.1499674 0.5193039 0.1979457 0.4443309 0.2114887 0.3545879 0.1607682 0.9482887 0.28125 0.914703 0.34375 0.7931908 0.3398438 0.6347833 0.2833363 0.2705322 0.25 0.4312491 0.2478689 0.5190028 0.2830251 0.5042391 0.3403863 0.39218 0.3406923 0.2426112 0.2851562 0.2931705 0.5351222 0.09193903 0.5381773 0.002274314 0.5234377 7.58105e-4 0.5078133 0.09043179 0.4949356 0.2929009 0.5070819 0.914703 0.65625 0.9482887 0.71875 0.8822492 0.7464782 0.6921893 0.7489204 0.6347833 0.7166637 0.7932068 0.6604623 0.879835 0.5546875 0.8918852 0.6015625 0.7839845 0.6284635 0.6095454 0.6295487 0.606295 0.6000239 0.771331 0.5582291 0.03382967 0.6015625 0.01329817 0.5546875 0.3505727 0.5563982 0.1688739 0.5989388 0.1288431 0.71875 0.07234463 0.65625 0.1844403 0.6284635 0.38192 0.6295486 0.392208 0.6615473 0.2426106 0.7148438 0.6842711 0.8684341 0.5790128 0.8692969 0.5175748 0.852474 0.5193039 0.8020543 0.611466 0.7991548 0.7077615 0.8480996 0.2795939 0.84375 0.1979262 0.78125 0.2705317 0.75 0.431249 0.7521311 0.4443308 0.7885113 0.3545877 0.8392318 0.390994 0.8683404 0.4787878 0.8692969 0.5175748 0.8919662 0.5098672 0.9160293 0.4735282 0.9182549 0.3925934 0.8949943 0.7316651 0.9201709 0.7450812 0.8914145 0.8103681 0.8923273 0.8806584 0.9198787 0.6683357 0.9198697 0.5790128 0.8919662 0.5071909 0.9475265 0.5098673 0.9313364 0.5467345 0.928906 0.6432098 0.9342377 0.6602925 0.9492552 0.5640427 0.9601567 0.6093519 0.3758485 0.7838034 0.375 0.8914764 0.40625 0.8786089 0.46875 0.7703692 0.4670833 0.6059561 0.4138564 0.478949 0.4804801 0.4915798 0.4166363 0.9945275 0.1329439 0.9981759 0.1488318 0.9032765 0.1578601 0.7949443 0.1426637 0.5467345 0.1337565 0.6533579 0.1306224 0.7013594 0.1509568 0.611466 0.2008452 0.5175748 0.09074216 0.5098673 0.1180143 0.5640427 0.03984333 0.664136 0.04955421 0.5468019 0.02638401 0.6404059 0.00879467 0.1979268 0.21875 0.2795942 0.15625 0.381876 0.3787001 0.1844114 0.3781576 0.07234567 0.34375 0.1288439 0.28125 0.3502802 0.4804802 0.1685385 0.4157879 0.01102414 0.4687508 0.03307241 0.4062503 0.5190027 0.7169749 0.5042834 0.6615473 0.4917733 0.6000239 0.4791277 0.5563981 0.9981759 0.8511682 0.9945275 0.8670561 0.9444783 0.8784053 0.8393392 0.8769408 0.7988985 0.8563927 0.9032765 0.84214 0.9738111 0.7733061 0.9912704 0.8199182 0.8806939 0.8196139 0.6817988 0.7824739 0.4551069 0.942366 0.3653208 0.8974553 0.9753958 0.890625 0.9407809 0.921875 0.7343019 0.9966921 0.7029059 0.9988973 0.6841192 0.9849612 0.7039052 0.9582973 0.6404059 0.9912053 0.5468019 0.973616</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape2-map1-array" count="653" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape2-textangents">
+ <float_array id="qt_gauge_background_Shape2-textangents-array" count="7200">-0.01367634 0 0.9999064 -0.01075229 0 0.9999421 -0.01003095 0 0.9999495 -0.012504 0 0.9999217 -0.01075229 0 0.9999421 -0.0050086 0 0.9999875 -0.008450897 0 0.9999642 -0.01003095 0 0.9999495 -0.01003095 0 0.9999495 -0.008450897 0 0.9999642 -0.006887449 0 0.9999763 -0.009012658 0 0.9999593 -0.012504 0 0.9999217 -0.01003095 0 0.9999495 -0.009012658 0 0.9999593 -0.005887163 0 0.9999827 -0.2422391 0 0.9702165 -0.1029391 0 0.9946876 -0.01950653 0 0.9998097 -0.02506092 0 0.9996858 -0.1029391 0 0.9946876 -0.04511987 0 0.9989815 -0.0111557 0 0.9999378 -0.01950653 0 0.9998097 -0.01950653 0 0.9998097 -0.0111557 0 0.9999378 -0.006887449 0 0.9999763 -0.008450897 0 0.9999642 -0.02506092 0 0.9996858 -0.01950653 0 0.9998097 -0.008450897 0 0.9999642 -0.0050086 0 0.9999875 0 0 0.9999999 -0.001229496 0 0.9999992 -0.003065992 0 0.9999952 -0.00787075 0 0.999969 -0.001229496 0 0.9999992 -0.005887163 0 0.9999827 -0.009012658 0 0.9999593 -0.003065992 0 0.9999952 -0.003065992 0 0.9999952 -0.009012658 0 0.9999593 -0.006887449 0 0.9999763 -0.0111557 0 0.9999378 -0.00787075 0 0.999969 -0.003065992 0 0.9999952 -0.0111557 0 0.9999378 -0.04511987 0 0.9989815 -0.1431279 0 0.9897042 -0.03901037 0 0.9992387 -0.08511462 0 0.9963712 -0.1264854 0 0.9919685 -0.03901037 0 0.9992387 0.04023223 0 0.9991903 0.01612961 0 0.9998699 -0.08511462 0 0.9963712 -0.08511462 0 0.9963712 0.01612961 0 0.9998699 0.002558745 0 0.9999967 -0.03145622 0 0.9995051 -0.1264854 0 0.9919685 -0.08511462 0 0.9963712 -0.03145622 0 0.9995051 -0.04921702 0 0.998788 0.09682198 0 0.9953017 0.09174301 0 0.9957827 0.08607902 0 0.9962883 0.08759881 0 0.9961558 0.09174301 0 0.9957827 0.03576641 0 0.9993601 0.0280341 0 0.999607 0.08607902 0 0.9962883 0.08607902 0 0.9962883 0.0280341 0 0.999607 0.002558745 0 0.9999967 0.01612961 0 0.9998699 0.08759881 0 0.9961558 0.08607902 0 0.9962883 0.01612961 0 0.9998699 0.04023223 0 0.9991903 0 0 0.9999999 -0.009790589 0 0.9999521 -0.00113281 0 0.9999993 0.006975519 0 0.9999757 -0.009790589 0 0.9999521 -0.04921702 0 0.998788 -0.03145622 0 0.9995051 -0.00113281 0 0.9999993 -0.00113281 0 0.9999993 -0.03145622 0 0.9995051 0.002558745 0 0.9999967 0.0280341 0 0.999607 0.006975519 0 0.9999757 -0.00113281 0 0.9999993 0.0280341 0 0.999607 0.03576641 0 0.9993601 0.09933729 0 0.9950538 0.01705508 0 0.9998544 0.01019941 0 0.9999478 0.05045885 0 0.9987262 0.01705508 0 0.9998544 0.01446276 0 0.9998953 0.0163776 0 0.9998658 0.01019941 0 0.9999478 0.01019941 0 0.9999478 0.0163776 0 0.9998658 0.0109429 0 0.9999401 0.01030315 0 0.9999468 0.05045885 0 0.9987262 0.01019941 0 0.9999478 0.01030315 0 0.9999468 0.02454965 0 0.9996986 0.08389317 0 0.9964748 0.05309606 0 0.9985894 0.04261599 0 0.9990914 0.03626223 0 0.9993422 0.05309606 0 0.9985894 0.01614967 0 0.9998695 0.01433089 0 0.9998972 0.04261599 0 0.9990914 0.04261599 0 0.9990914 0.01433089 0 0.9998972 0.0109429 0 0.9999401 0.0163776 0 0.9998658 0.03626223 0 0.9993422 0.04261599 0 0.9990914 0.0163776 0 0.9998658 0.01446276 0 0.9998953 0 0 0.9999999 0.004338131 0 0.9999905 0.005718149 0 0.9999835 0.002826207 0 0.9999958 0.004338131 0 0.9999905 0.02454965 0 0.9996986 0.01030315 0 0.9999468 0.005718149 0 0.9999835 0.005718149 0 0.9999835 0.01030315 0 0.9999468 0.0109429 0 0.9999401 0.01433089 0 0.9998972 0.002826207 0 0.9999958 0.005718149 0 0.9999835 0.01433089 0 0.9998972 0.01614967 0 0.9998695 0.01371067 0 0.9999059 -0.00776518 0 0.9999698 -0.005910711 0 0.9999825 0.005603383 0 0.9999843 -0.00776518 0 0.9999698 -0.04043504 0 0.9991821 -0.02411428 0 0.9997091 -0.005910711 0 0.9999825 -0.005910711 0 0.9999825 -0.02411428 0 0.9997091 -0.01155306 0 0.9999332 -0.003062053 0 0.9999951 0.005603383 0 0.9999843 -0.005910711 0 0.9999825 -0.003062053 0 0.9999951 0.002946466 0 0.9999955 -0.1618397 0 0.9868169 -0.09690414 0 0.9952938 -0.04902431 0 0.9987976 -0.09589599 0 0.9953914 -0.09690414 0 0.9952938 -0.02819271 0 0.9996024 -0.02179095 0 0.9997625 -0.04902431 0 0.9987976 -0.04902431 0 0.9987976 -0.02179095 0 0.9997625 -0.01155306 0 0.9999332 -0.02411428 0 0.9997091 -0.09589599 0 0.9953914 -0.04902431 0 0.9987976 -0.02411428 0 0.9997091 -0.04043504 0 0.9991821 0 0 0.9999999 6.54478e-4 0 0.9999997 -0.006188972 0 0.9999807 -0.004779551 0 0.9999884 6.54478e-4 0 0.9999997 0.002946466 0 0.9999955 -0.003062053 0 0.9999951 -0.006188972 0 0.9999807 -0.006188972 0 0.9999807 -0.003062053 0 0.9999951 -0.01155306 0 0.9999332 -0.02179095 0 0.9997625 -0.004779551 0 0.9999884 -0.006188972 0 0.9999807 -0.02179095 0 0.9997625 -0.02819271 0 0.9996024 -0.07901151 0 0.9968737 -0.07579947 0 0.9971231 -0.07052787 0 0.9975099 -0.07261103 0 0.9973604 -0.07579947 0 0.9971231 -0.123309 0 0.9923682 -0.099328 0 0.9950548 -0.07052787 0 0.9975099 -0.07052787 0 0.9975099 -0.099328 0 0.9950548 -0.0577277 0 0.9983323 -0.038374 0 0.9992635 -0.07261103 0 0.9973604 -0.07052787 0 0.9975099 -0.038374 0 0.9992635 -0.03714307 0 0.9993099 -0.1587955 0 0.9873115 -0.08679088 0 0.9962265 -0.0884654 0 0.9960792 -0.1245504 0 0.9922133 -0.08679088 0 0.9962265 -0.05032137 0 0.998733 -0.04776878 0 0.9988584 -0.0884654 0 0.9960792 -0.0884654 0 0.9960792 -0.04776878 0 0.9988584 -0.0577277 0 0.9983323 -0.099328 0 0.9950548 -0.1245504 0 0.9922133 -0.0884654 0 0.9960792 -0.099328 0 0.9950548 -0.123309 0 0.9923682 0 0 0.9999999 -0.008121109 0 0.999967 -0.01895975 0 0.9998203 -0.01322239 0 0.9999126 -0.008121109 0 0.999967 -0.03714307 0 0.9993099 -0.038374 0 0.9992635 -0.01895975 0 0.9998203 -0.01895975 0 0.9998203 -0.038374 0 0.9992635 -0.0577277 0 0.9983323 -0.04776878 0 0.9988584 -0.01322239 0 0.9999126 -0.01895975 0 0.9998203 -0.04776878 0 0.9988584 -0.05032137 0 0.998733 0.2422442 0 0.9702153 0.02508596 0 0.9996853 0.02067369 0 0.9997863 0.1037698 0 0.9946012 0.02508596 0 0.9996853 0.004988839 0 0.9999875 0.009018784 0 0.9999593 0.02067369 0 0.9997863 0.02067369 0 0.9997863 0.009018784 0 0.9999593 0.007802528 0 0.9999696 0.01297089 0 0.9999159 0.1037698 0 0.9946012 0.02067369 0 0.9997863 0.01297089 0 0.9999159 0.04682354 0 0.9989031 0.01371067 0 0.9999059 0.01252614 0 0.9999214 0.01012272 0 0.9999486 0.01078191 0 0.9999418 0.01252614 0 0.9999214 0.005907148 0 0.9999825 0.008366709 0 0.9999649 0.01012272 0 0.9999486 0.01012272 0 0.9999486 0.008366709 0 0.9999649 0.007802528 0 0.9999696 0.009018784 0 0.9999593 0.01078191 0 0.9999418 0.01012272 0 0.9999486 0.009018784 0 0.9999593 0.004988839 0 0.9999875 0 0 0.9999999 0.008612079 0 0.9999629 0.00395492 0 0.9999921 0.00125882 0 0.9999992 0.008612079 0 0.9999629 0.04682354 0 0.9989031 0.01297089 0 0.9999159 0.00395492 0 0.9999921 0.00395492 0 0.9999921 0.01297089 0 0.9999159 0.007802528 0 0.9999696 0.008366709 0 0.9999649 0.00125882 0 0.9999992 0.00395492 0 0.9999921 0.008366709 0 0.9999649 0.005907148 0 0.9999825 -0.07097245 0 0.9974782 -0.153546 0 0.9881414 -0.06568841 0 0.9978402 -0.0808579 0 0.9967256 -0.153546 0 0.9881414 0.0186701 0 0.9998256 0.05649782 0 0.9984027 -0.06568841 0 0.9978402 -0.06568841 0 0.9978402 0.05649782 0 0.9984027 0.04966707 0 0.9987658 -0.01823486 0 0.9998338 -0.0808579 0 0.9967256 -0.06568841 0 0.9978402 -0.01823486 0 0.9998338 -0.02339222 0 0.9997264 0.2422442 0 0.9702153 0.1037698 0 0.9946012 0.1986301 0 0.9800745 0.2601513 0 0.9655678 0.1037698 0 0.9946012 0.04682354 0 0.9989031 0.06746516 0 0.9977217 0.1986301 0 0.9800745 0.1986301 0 0.9800745 0.06746516 0 0.9977217 0.04966707 0 0.9987658 0.05649782 0 0.9984027 0.2601513 0 0.9655678 0.1986301 0 0.9800745 0.05649782 0 0.9984027 0.0186701 0 0.9998256 0 0 0.9999999 -0.005034201 0 0.9999872 0.01549611 0 0.9998799 0.008612079 0 0.9999629 -0.005034201 0 0.9999872 -0.02339222 0 0.9997264 -0.01823486 0 0.9998338 0.01549611 0 0.9998799 0.01549611 0 0.9998799 -0.01823486 0 0.9998338 0.04966707 0 0.9987658 0.06746516 0 0.9977217 0.008612079 0 0.9999629 0.01549611 0 0.9998799 0.06746516 0 0.9977217 0.04682354 0 0.9989031 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.07901151 0 0.9968737 -0.08214403 0 0.9966204 -0.04610861 0 0.9989364 -0.03625904 0 0.9993423 -0.08214403 0 0.9966204 -0.0443394 0 0.9990165 -0.03294398 0 0.9994572 -0.04610861 0 0.9989364 -0.04610861 0 0.9989364 -0.03294398 0 0.9994572 -0.02481306 0 0.9996921 -0.02491413 0 0.9996895 -0.03625904 0 0.9993423 -0.04610861 0 0.9989364 -0.02491413 0 0.9996895 -0.01268964 0 0.9999195 0 0 0.9999999 0 0 0.9999999 -0.01186577 0 0.9999295 -0.01172862 0 0.9999311 0 0 0.9999999 0 0 0.9999999 -0.005673022 0 0.9999838 -0.01186577 0 0.9999295 -0.01186577 0 0.9999295 -0.005673022 0 0.9999838 -0.02481306 0 0.9996921 -0.03294398 0 0.9994572 -0.01172862 0 0.9999311 -0.01186577 0 0.9999295 -0.03294398 0 0.9994572 -0.0443394 0 0.9990165 0 0 0.9999999 -0.003065143 0 0.9999952 -0.006338729 0 0.9999797 0 0 0.9999999 -0.003065143 0 0.9999952 -0.01268964 0 0.9999195 -0.02491413 0 0.9996895 -0.006338729 0 0.9999797 -0.006338729 0 0.9999797 -0.02491413 0 0.9996895 -0.02481306 0 0.9996921 -0.005673022 0 0.9999838 0 0 0.9999999 -0.006338729 0 0.9999797 -0.005673022 0 0.9999838 0 0 0.9999999 0 0 0.9999999 0.002826207 0 0.9999958 0.003707368 0 0.999993 0 0 0.9999999 0.002826207 0 0.9999958 0.01614967 0 0.9998695 0.01226022 0 0.9999248 0.003707368 0 0.999993 0.003707368 0 0.999993 0.01226022 0 0.9999248 0.01083497 0 0.9999412 0.002098081 0 0.9999976 0 0 0.9999999 0.003707368 0 0.999993 0.002098081 0 0.9999976 0 0 0.9999999 0.08389317 0 0.9964748 0.04585619 0 0.998948 0.02634457 0 0.9996527 0.05309606 0 0.9985894 0.04585619 0 0.998948 0.01376249 0 0.9999052 0.01832265 0 0.999832 0.02634457 0 0.9996527 0.02634457 0 0.9996527 0.01832265 0 0.999832 0.01083497 0 0.9999412 0.01226022 0 0.9999248 0.05309606 0 0.9985894 0.02634457 0 0.9996527 0.01226022 0 0.9999248 0.01614967 0 0.9998695 0 0 0.9999999 0 0 0.9999999 0.005162503 0 0.9999865 0.002767271 0 0.999996 0 0 0.9999999 0 0 0.9999999 0.002098081 0 0.9999976 0.005162503 0 0.9999865 0.005162503 0 0.9999865 0.002098081 0 0.9999976 0.01083497 0 0.9999412 0.01832265 0 0.999832 0.002767271 0 0.999996 0.005162503 0 0.9999865 0.01832265 0 0.999832 0.01376249 0 0.9999052 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.005203973 0 0.9999862 0.001279718 0 0.9999991 0.007495579 0 0.9999718 -0.005203973 0 0.9999862 -0.02767373 0 0.999617 -0.02609698 0 0.9996594 0.001279718 0 0.9999991 0.001279718 0 0.9999991 -0.02609698 0 0.9996594 -0.002495314 0 0.9999968 0.03082635 0 0.9995247 0.007495579 0 0.9999718 0.001279718 0 0.9999991 0.03082635 0 0.9995247 0.04034363 0 0.9991858 -0.162698 0 0.9866759 -0.08160616 0 0.9966646 -0.08613724 0 0.9962833 -0.08705343 0 0.9962036 -0.08160616 0 0.9966646 0.01143526 0 0.9999346 -0.02666047 0 0.9996445 -0.08613724 0 0.9962833 -0.08613724 0 0.9962833 -0.02666047 0 0.9996445 -0.002495314 0 0.9999968 -0.02609698 0 0.9996594 -0.08705343 0 0.9962036 -0.08613724 0 0.9962833 -0.02609698 0 0.9996594 -0.02767373 0 0.999617 0.272683 0 0.962104 0.1504505 0 0.9886175 0.03929478 0 0.9992277 0.1917124 0 0.9814511 0.1504505 0 0.9886175 0.04034363 0 0.9991858 0.03082635 0 0.9995247 0.03929478 0 0.9992277 0.03929478 0 0.9992277 0.03082635 0 0.9995247 -0.002495314 0 0.9999968 -0.02666047 0 0.9996445 0.1917124 0 0.9814511 0.03929478 0 0.9992277 -0.02666047 0 0.9996445 0.01143526 0 0.9999346 0.04610957 0 0.9989364 0 0 0.9999998 -0.004624793 0 0.9999892 0.01842407 0 0.9998303 0 0 0.9999998 -0.01436605 0 0.9998967 -0.01974165 0 0.999805 -0.004624793 0 0.9999892 -0.004624793 0 0.9999892 -0.01974165 0 0.999805 -0.01160709 0 0.9999326 -1.77873e-4 0 0.9999998 0.01842407 0 0.9998303 -0.004624793 0 0.9999892 -1.77873e-4 0 0.9999998 0.009519669 0 0.9999546 -0.08389555 0 0.9964746 -0.05309166 0 0.9985896 -0.02631497 0 0.9996536 -0.04568532 0 0.9989558 -0.05309166 0 0.9985896 -0.0161577 0 0.9998695 -0.01312598 0 0.9999137 -0.02631497 0 0.9996536 -0.02631497 0 0.9996536 -0.01312598 0 0.9999137 -0.01160709 0 0.9999326 -0.01974165 0 0.999805 -0.04568532 0 0.9989558 -0.02631497 0 0.9996536 -0.01974165 0 0.999805 -0.01436605 0 0.9998967 0 0 0.9999999 0.002197067 0 0.9999976 -0.003329276 0 0.9999943 -0.002825516 0 0.9999958 0.002197067 0 0.9999976 0.009519669 0 0.9999546 -1.77873e-4 0 0.9999998 -0.003329276 0 0.9999943 -0.003329276 0 0.9999943 -1.77873e-4 0 0.9999998 -0.01160709 0 0.9999326 -0.01312598 0 0.9999137 -0.002825516 0 0.9999958 -0.003329276 0 0.9999943 -0.01312598 0 0.9999137 -0.0161577 0 0.9998695 0.09682198 0 0.9953017 -0.02359419 0 0.9997216 0.004684595 0 0.9999889 0.05459291 0 0.9985088 -0.02359419 0 0.9997216 0.01338237 0 0.9999104 0.01532353 0 0.9998826 0.004684595 0 0.9999889 0.004684595 0 0.9999889 0.01532353 0 0.9998826 0.009947606 0 0.9999505 0.007149492 0 0.9999744 0.05459291 0 0.9985088 0.004684595 0 0.9999889 0.007149492 0 0.9999744 0.02128067 0 0.9997734 0.04610957 0 0.9989364 0.04025182 0 0.9991896 0.03554489 0 0.9993681 0.0340103 0 0.9994215 0.04025182 0 0.9991896 0.01811307 0 0.9998359 0.01436066 0 0.9998968 0.03554489 0 0.9993681 0.03554489 0 0.9993681 0.01436066 0 0.9998968 0.009947606 0 0.9999505 0.01532353 0 0.9998826 0.0340103 0 0.9994215 0.03554489 0 0.9993681 0.01532353 0 0.9998826 0.01338237 0 0.9999104 0 0 0.9999999 0.004981895 0 0.9999876 0.005399055 0 0.9999853 0.004578968 0 0.9999894 0.004981895 0 0.9999876 0.02128067 0 0.9997734 0.007149492 0 0.9999744 0.005399055 0 0.9999853 0.005399055 0 0.9999853 0.007149492 0 0.9999744 0.009947606 0 0.9999505 0.01436066 0 0.9998968 0.004578968 0 0.9999894 0.005399055 0 0.9999853 0.01436066 0 0.9998968 0.01811307 0 0.9998359 -0.03194991 0 0.9994895 -0.002700417 0 0.9999962 -0.007618185 0 0.9999709 -0.02334037 0 0.9997275 -0.002700417 0 0.9999962 -0.03654576 0 0.999332 -0.02146531 0 0.9997696 -0.007618185 0 0.9999709 -0.007618185 0 0.9999709 -0.02146531 0 0.9997696 -0.0188563 0 0.9998223 -0.005663779 0 0.9999838 -0.02334037 0 0.9997275 -0.007618185 0 0.9999709 -0.005663779 0 0.9999838 -0.008664258 0 0.9999623 -0.162698 0 0.9866759 -0.08705343 0 0.9962036 -0.04449805 0 0.9990094 -0.08702502 0 0.9962061 -0.08705343 0 0.9962036 -0.02767373 0 0.999617 -0.02743057 0 0.9996237 -0.04449805 0 0.9990094 -0.04449805 0 0.9990094 -0.02743057 0 0.9996237 -0.0188563 0 0.9998223 -0.02146531 0 0.9997696 -0.08702502 0 0.9962061 -0.04449805 0 0.9990094 -0.02146531 0 0.9997696 -0.03654576 0 0.999332 0 0 0.9999999 -0.002276503 0 0.9999973 -0.007304559 0 0.9999732 -0.005203973 0 0.9999862 -0.002276503 0 0.9999973 -0.008664258 0 0.9999623 -0.005663779 0 0.9999838 -0.007304559 0 0.9999732 -0.007304559 0 0.9999732 -0.005663779 0 0.9999838 -0.0188563 0 0.9998223 -0.02743057 0 0.9996237 -0.005203973 0 0.9999862 -0.007304559 0 0.9999732 -0.02743057 0 0.9996237 -0.02767373 0 0.999617 0 0 0.9999999 -0.002857842 0 0.9999958 -0.005113205 0 0.9999868 0 0 0.9999999 -0.002857842 0 0.9999958 -0.01630538 0 0.9998671 -0.01292446 0 0.9999165 -0.005113205 0 0.9999868 -0.005113205 0 0.9999868 -0.01292446 0 0.9999165 -0.01006252 0 0.9999494 -0.002141256 0 0.9999976 0 0 0.9999999 -0.005113205 0 0.9999868 -0.002141256 0 0.9999976 0 0 0.9999999 -0.03194991 0 0.9994895 -0.03504559 0 0.9993857 -0.02793062 0 0.9996099 -0.03095829 0 0.9995207 -0.03504559 0 0.9993857 -0.01610589 0 0.9998701 -0.01379123 0 0.9999048 -0.02793062 0 0.9996099 -0.02793062 0 0.9996099 -0.01379123 0 0.9999048 -0.01006252 0 0.9999494 -0.01292446 0 0.9999165 -0.03095829 0 0.9995207 -0.02793062 0 0.9996099 -0.01292446 0 0.9999165 -0.01630538 0 0.9998671 0 0 0.9999999 0 0 0.9999999 -0.003781773 0 0.9999927 -0.004193188 0 0.9999911 0 0 0.9999999 0 0 0.9999999 -0.002141256 0 0.9999976 -0.003781773 0 0.9999927 -0.003781773 0 0.9999927 -0.002141256 0 0.9999976 -0.01006252 0 0.9999494 -0.01379123 0 0.9999048 -0.004193188 0 0.9999911 -0.003781773 0 0.9999927 -0.01379123 0 0.9999048 -0.01610589 0 0.9998701 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.07899165 0 0.9968752 0.004329796 0 0.9999905 0.004544992 0 0.9999896 0.03624751 0 0.9993428 0.004329796 0 0.9999905 -7.17276e-4 0 0.9999998 6.76436e-4 0 0.9999997 0.004544992 0 0.9999896 0.004544992 0 0.9999896 6.76436e-4 0 0.9999997 -9.29383e-4 0 0.9999995 0.001542246 0 0.9999987 0.03624751 0 0.9993428 0.004544992 0 0.9999896 0.001542246 0 0.9999987 0.01268237 0 0.9999195 0 0 0.9999999 0 0 0.9999999 8.71327e-4 0 0.9999995 -9.69898e-4 0 0.9999993 0 0 0.9999999 0 0 0.9999999 -8.67134e-4 0 0.9999995 8.71327e-4 0 0.9999995 8.71327e-4 0 0.9999995 -8.67134e-4 0 0.9999995 -9.29383e-4 0 0.9999995 6.76436e-4 0 0.9999997 -9.69898e-4 0 0.9999993 8.71327e-4 0 0.9999995 6.76436e-4 0 0.9999997 -7.17276e-4 0 0.9999998 0 0 0.9999999 0.003064311 0 0.9999952 0.001283035 0 0.999999 0 0 0.9999999 0.003064311 0 0.9999952 0.01268237 0 0.9999195 0.001542246 0 0.9999987 0.001283035 0 0.999999 0.001283035 0 0.999999 0.001542246 0 0.9999987 -9.29383e-4 0 0.9999995 -8.67134e-4 0 0.9999995 0 0 0.9999999 0.001283035 0 0.999999 -8.67134e-4 0 0.9999995 0 0 0.9999999 0.07899165 0 0.9968752 0.07719314 0 0.9970163 0.06666087 0 0.9977756 0.07312292 0 0.9973229 0.07719314 0 0.9970163 0.04207153 0 0.9991146 0.03527318 0 0.9993777 0.06666087 0 0.9977756 0.06666087 0 0.9977756 0.03527318 0 0.9993777 0.01947789 0 0.9998102 0.04202331 0 0.9991166 0.07312292 0 0.9973229 0.06666087 0 0.9977756 0.04202331 0 0.9991166 0.03877137 0 0.999248 0 0 0.9999999 0 0 0.9999999 0.007735276 0 0.9999699 0.01057031 0 0.9999441 0 0 0.9999999 0 0 0.9999999 0.007937471 0 0.9999683 0.007735276 0 0.9999699 0.007735276 0 0.9999699 0.007937471 0 0.9999683 0.01947789 0 0.9998102 0.03527318 0 0.9993777 0.01057031 0 0.9999441 0.007735276 0 0.9999699 0.03527318 0 0.9993777 0.04207153 0 0.9991146 0 0 0.9999999 0.0102921 0 0.999947 0.01168892 0 0.9999317 0 0 0.9999999 0.0102921 0 0.999947 0.03877137 0 0.999248 0.04202331 0 0.9991166 0.01168892 0 0.9999317 0.01168892 0 0.9999317 0.04202331 0 0.9991166 0.01947789 0 0.9998102 0.007937471 0 0.9999683 0 0 0.9999999 0.01168892 0 0.9999317 0.007937471 0 0.9999683 0 0 0.9999999 -0.01367634 0 0.9999064 -0.012504 0 0.9999217 -0.006742117 0 0.9999771 -0.005566157 0 0.9999844 -0.012504 0 0.9999217 -0.005887163 0 0.9999827 -0.004061968 0 0.9999916 -0.006742117 0 0.9999771 -0.006742117 0 0.9999771 -0.004061968 0 0.9999916 -0.001987857 0 0.999998 -0.003442733 0 0.9999939 -0.005566157 0 0.9999844 -0.006742117 0 0.9999771 -0.003442733 0 0.9999939 -0.002853884 0 0.9999958 0 0 0.9999999 0 0 0.9999999 -0.001117081 0 0.9999993 -0.001229496 0 0.9999992 0 0 0.9999999 0 0 0.9999999 -4.87965e-4 0 0.9999998 -0.001117081 0 0.9999993 -0.001117081 0 0.9999993 -4.87965e-4 0 0.9999998 -0.001987857 0 0.999998 -0.004061968 0 0.9999916 -0.001229496 0 0.9999992 -0.001117081 0 0.9999993 -0.004061968 0 0.9999916 -0.005887163 0 0.9999827 0 0 0.9999999 -6.22753e-4 0 0.9999997 -7.98086e-4 0 0.9999995 0 0 0.9999999 -6.22753e-4 0 0.9999997 -0.002853884 0 0.9999958 -0.003442733 0 0.9999939 -7.98086e-4 0 0.9999995 -7.98086e-4 0 0.9999995 -0.003442733 0 0.9999939 -0.001987857 0 0.999998 -4.87965e-4 0 0.9999998 0 0 0.9999999 -7.98086e-4 0 0.9999995 -4.87965e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.1587901 0 0.9873123 0.08848766 0 0.9960772 0.08731166 0 0.996181 0.1197362 0 0.9928057 0.08848766 0 0.9960772 0.0485091 0 0.9988227 0.04783036 0 0.9988555 0.08731166 0 0.996181 0.08731166 0 0.996181 0.04783036 0 0.9988555 0.02582118 0 0.9996665 0.03374936 0 0.9994303 0.1197362 0 0.9928057 0.08731166 0 0.996181 0.03374936 0 0.9994303 0.04661221 0 0.998913 0 0 0.9999999 0 0 0.9999999 0.01309804 0 0.9999142 0.01357649 0 0.9999077 0 0 0.9999999 0 0 0.9999999 0.003390581 0 0.9999942 0.01309804 0 0.9999142 0.01309804 0 0.9999142 0.003390581 0 0.9999942 0.02582118 0 0.9996665 0.04783036 0 0.9988555 0.01357649 0 0.9999077 0.01309804 0 0.9999142 0.04783036 0 0.9988555 0.0485091 0 0.9988227 0 0 0.9999999 0.0104798 0 0.9999452 0.006438939 0 0.9999791 0 0 0.9999999 0.0104798 0 0.9999452 0.04661221 0 0.998913 0.03374936 0 0.9994303 0.006438939 0 0.9999791 0.006438939 0 0.9999791 0.03374936 0 0.9994303 0.02582118 0 0.9996665 0.003390581 0 0.9999942 0 0 0.9999999 0.006438939 0 0.9999791 0.003390581 0 0.9999942 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.002717328 0 0.9999961 -0.007821522 0 0.9999694 0 0 0.9999999 0 0 0.9999999 0.001698302 0 0.9999984 -0.002717328 0 0.9999961 -0.002717328 0 0.9999961 0.001698302 0 0.9999984 0 0 0.9999999 -0.01082879 0 0.9999413 -0.007821522 0 0.9999694 -0.002717328 0 0.9999961 -0.01082879 0 0.9999413 -0.03481764 0 0.9993936 0 0 0.9999999 -6.12563e-4 0 0.9999997 -1.92264e-4 0 0.9999999 0 0 0.9999999 -6.12563e-4 0 0.9999997 -1.38027e-4 0 0.9999998 0.003601321 0 0.9999935 -1.92264e-4 0 0.9999999 -1.92264e-4 0 0.9999999 0.003601321 0 0.9999935 0 0 0.9999999 0.001698302 0 0.9999984 0 0 0.9999999 -1.92264e-4 0 0.9999999 0.001698302 0 0.9999984 0 0 0.9999999 -0.1431279 0 0.9897042 -0.06593389 0 0.9978239 -0.006493379 0 0.9999789 -0.01816502 0 0.9998348 -0.06593389 0 0.9978239 -0.03481764 0 0.9993936 -0.01082879 0 0.9999413 -0.006493379 0 0.9999789 -0.006493379 0 0.9999789 -0.01082879 0 0.9999413 0 0 0.9999999 0.003601321 0 0.9999935 -0.01816502 0 0.9998348 -0.006493379 0 0.9999789 0.003601321 0 0.9999935 -1.38027e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 -0.0110217 0 0.9999393 -0.009790589 0 0.9999521 0 0 0.9999999 0 0 0.9999999 -0.005131572 0 0.9999868 -0.0110217 0 0.9999393 -0.0110217 0 0.9999393 -0.005131572 0 0.9999868 -0.02139783 0 0.999771 -0.04075496 0 0.9991692 -0.009790589 0 0.9999521 -0.0110217 0 0.9999393 -0.04075496 0 0.9991692 -0.04921702 0 0.998788 0 0 0.9999999 -0.007821522 0 0.9999694 -0.00910399 0 0.9999585 0 0 0.9999999 -0.007821522 0 0.9999694 -0.03481764 0 0.9993936 -0.03813635 0 0.9992725 -0.00910399 0 0.9999585 -0.00910399 0 0.9999585 -0.03813635 0 0.9992725 -0.02139783 0 0.999771 -0.005131572 0 0.9999868 0 0 0.9999999 -0.00910399 0 0.9999585 -0.005131572 0 0.9999868 0 0 0.9999999 -0.1431279 0 0.9897042 -0.1264854 0 0.9919685 -0.07079507 0 0.9974908 -0.06593389 0 0.9978239 -0.1264854 0 0.9919685 -0.04921702 0 0.998788 -0.04075496 0 0.9991692 -0.07079507 0 0.9974908 -0.07079507 0 0.9974908 -0.04075496 0 0.9991692 -0.02139783 0 0.999771 -0.03813635 0 0.9992725 -0.06593389 0 0.9978239 -0.07079507 0 0.9974908 -0.03813635 0 0.9992725 -0.03481764 0 0.9993936 0 0 0.9999999 -0.004779551 0 0.9999884 0 0 0.9999999 0.009501798 0 0.9999547 -0.004779551 0 0.9999884 -0.02819271 0 0.9996024 -0.02445981 0 0.9997008 0 0 0.9999999 0 0 0.9999999 -0.02445981 0 0.9997008 -0.003548316 0 0.9999936 0.02282707 0 0.9997394 0.009501798 0 0.9999547 0 0 0.9999999 0.02282707 0 0.9997394 0.03868642 0 0.9992514 -0.1618397 0 0.9868169 -0.07032952 0 0.9975238 -0.07978476 0 0.9968121 -0.09690414 0 0.9952938 -0.07032952 0 0.9975238 -0.03194262 0 0.9994897 -0.01509206 0 0.999886 -0.07978476 0 0.9968121 -0.07978476 0 0.9968121 -0.01509206 0 0.999886 -0.003548316 0 0.9999936 -0.02445981 0 0.9997008 -0.09690414 0 0.9952938 -0.07978476 0 0.9968121 -0.02445981 0 0.9997008 -0.02819271 0 0.9996024 0.09933729 0 0.9950538 0.09481879 0 0.9954945 0.05592053 0 0.9984352 0.01623275 0 0.9998682 0.09481879 0 0.9954945 0.03868642 0 0.9992514 0.02282707 0 0.9997394 0.05592053 0 0.9984352 0.05592053 0 0.9984352 0.02282707 0 0.9997394 -0.003548316 0 0.9999936 -0.01509206 0 0.999886 0.01623275 0 0.9998682 0.05592053 0 0.9984352 -0.01509206 0 0.999886 -0.03194262 0 0.9994897 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.008425878 0 0.9999644 0.004338131 0 0.9999905 0 0 0.9999999 0 0 0.9999999 0.006623889 0 0.9999779 0.008425878 0 0.9999644 0.008425878 0 0.9999644 0.006623889 0 0.9999779 0.01814403 0 0.9998354 0.02906835 0 0.9995773 0.004338131 0 0.9999905 0.008425878 0 0.9999644 0.02906835 0 0.9995773 0.02454965 0 0.9996986 0 0 0.9999999 0.009501798 0 0.9999547 0.008227958 0 0.999966 0 0 0.9999999 0.009501798 0 0.9999547 0.03868642 0 0.9992514 0.03379307 0 0.9994289 0.008227958 0 0.999966 0.008227958 0 0.999966 0.03379307 0 0.9994289 0.01814403 0 0.9998354 0.006623889 0 0.9999779 0 0 0.9999999 0.008227958 0 0.999966 0.006623889 0 0.9999779 0 0 0.9999999 0.09933729 0 0.9950538 0.05045885 0 0.9987262 0.05487501 0 0.9984931 0.09481879 0 0.9954945 0.05045885 0 0.9987262 0.02454965 0 0.9996986 0.02906835 0 0.9995773 0.05487501 0 0.9984931 0.05487501 0 0.9984931 0.02906835 0 0.9995773 0.01814403 0 0.9998354 0.03379307 0 0.9994289 0.09481879 0 0.9954945 0.05487501 0 0.9984931 0.03379307 0 0.9994289 0.03868642 0 0.9992514 0 0 0.9999999 0 0 0.9999999 0.00101114 0 0.9999995 6.54478e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 5.30274e-4 0 0.9999998 0.00101114 0 0.9999995 0.00101114 0 0.9999995 5.30274e-4 0 0.9999998 0.002110732 0 0.9999977 0.003562057 0 0.9999934 6.54478e-4 0 0.9999997 0.00101114 0 0.9999995 0.003562057 0 0.9999934 0.002946466 0 0.9999955 0 0 0.9999999 0.00125882 0 0.9999992 0.001324115 0 0.999999 0 0 0.9999999 0.00125882 0 0.9999992 0.005907148 0 0.9999825 0.00443042 0 0.9999901 0.001324115 0 0.999999 0.001324115 0 0.999999 0.00443042 0 0.9999901 0.002110732 0 0.9999977 5.30274e-4 0 0.9999998 0 0 0.9999999 0.001324115 0 0.999999 5.30274e-4 0 0.9999998 0 0 0.9999999 0.01371067 0 0.9999059 0.005603383 0 0.9999843 0.006836467 0 0.9999764 0.01252614 0 0.9999214 0.005603383 0 0.9999843 0.002946466 0 0.9999955 0.003562057 0 0.9999934 0.006836467 0 0.9999764 0.006836467 0 0.9999764 0.003562057 0 0.9999934 0.002110732 0 0.9999977 0.00443042 0 0.9999901 0.01252614 0 0.9999214 0.006836467 0 0.9999764 0.00443042 0 0.9999901 0.005907148 0 0.9999825 0 0 0.9999999 0 0 0.9999999 -0.01096071 0 0.9999399 -0.008121109 0 0.999967 0 0 0.9999999 0 0 0.9999999 -0.007627022 0 0.9999707 -0.01096071 0 0.9999399 -0.01096071 0 0.9999399 -0.007627022 0 0.9999707 -0.01982939 0 0.9998034 -0.04115903 0 0.9991527 -0.008121109 0 0.999967 -0.01096071 0 0.9999399 -0.04115903 0 0.9991527 -0.03714307 0 0.9993099 0 0 0.9999999 -0.01172862 0 0.9999311 -0.008498417 0 0.9999638 0 0 1 -0.01172862 0 0.9999311 -0.0443394 0 0.9990165 -0.03702537 0 0.9993143 -0.008498417 0 0.9999638 -0.008498417 0 0.9999638 -0.03702537 0 0.9993143 -0.01982939 0 0.9998034 -0.007627022 0 0.9999707 0 0 1 -0.008498417 0 0.9999638 -0.007627022 0 0.9999707 0 0 0.9999999 -0.07901151 0 0.9968737 -0.07261103 0 0.9973604 -0.06727734 0 0.9977343 -0.08214403 0 0.9966204 -0.07261103 0 0.9973604 -0.03714307 0 0.9993099 -0.04115903 0 0.9991527 -0.06727734 0 0.9977343 -0.06727734 0 0.9977343 -0.04115903 0 0.9991527 -0.01982939 0 0.9998034 -0.03702537 0 0.9993143 -0.08214403 0 0.9966204 -0.06727734 0 0.9977343 -0.03702537 0 0.9993143 -0.0443394 0 0.9990165 0 0 0.9999999 0 0 0.9999999 -0.007100578 0 0.9999747 -0.01073827 0 0.9999423 0 0 0.9999999 0 0 0.9999999 -0.003105136 0 0.9999951 -0.007100578 0 0.9999747 -0.007100578 0 0.9999747 -0.003105136 0 0.9999951 -0.0242375 0 0.9997063 -0.03410456 0 0.9994183 -0.01073827 0 0.9999423 -0.007100578 0 0.9999747 -0.03410456 0 0.9994183 -0.0470473 0 0.9988927 0 0 0.9999999 -0.01322239 0 0.9999126 -0.007145118 0 0.9999743 0 0 0.9999999 -0.01322239 0 0.9999126 -0.05032137 0 0.998733 -0.04020057 0 0.9991916 -0.007145118 0 0.9999743 -0.007145118 0 0.9999743 -0.04020057 0 0.9991916 -0.0242375 0 0.9997063 -0.003105136 0 0.9999951 0 0 0.9999999 -0.007145118 0 0.9999743 -0.003105136 0 0.9999951 0 0 0.9999999 -0.1587955 0 0.9873115 -0.1194997 0 0.9928342 -0.0858706 0 0.9963063 -0.08679088 0 0.9962265 -0.1194997 0 0.9928342 -0.0470473 0 0.9988927 -0.03410456 0 0.9994183 -0.0858706 0 0.9963063 -0.0858706 0 0.9963063 -0.03410456 0 0.9994183 -0.0242375 0 0.9997063 -0.04020057 0 0.9991916 -0.08679088 0 0.9962265 -0.0858706 0 0.9963063 -0.04020057 0 0.9991916 -0.05032137 0 0.998733 0 0 0.9999999 -0.01073827 0 0.9999423 -0.007276044 0 0.9999735 -0.005034201 0 0.9999872 -0.01073827 0 0.9999423 -0.0470473 0 0.9988927 -0.03676098 0 0.9993241 -0.007276044 0 0.9999735 -0.007276044 0 0.9999735 -0.03676098 0 0.9993241 -0.01278649 0 0.9999182 -0.002369841 0 0.9999971 -0.005034201 0 0.9999872 -0.007276044 0 0.9999735 -0.002369841 0 0.9999971 -0.02339222 0 0.9997264 -0.1587955 0 0.9873115 -0.1394962 0 0.9902226 -0.08083902 0 0.9967271 -0.1194997 0 0.9928342 -0.1394962 0 0.9902226 -0.05399392 0 0.9985413 -0.03172894 0 0.9994965 -0.08083902 0 0.9967271 -0.08083902 0 0.9967271 -0.03172894 0 0.9994965 -0.01278649 0 0.9999182 -0.03676098 0 0.9993241 -0.1194997 0 0.9928342 -0.08083902 0 0.9967271 -0.03676098 0 0.9993241 -0.0470473 0 0.9988927 -0.07097245 0 0.9974782 -0.0808579 0 0.9967256 0.01280434 0 0.999918 0.04048834 0 0.99918 -0.0808579 0 0.9967256 -0.02339222 0 0.9997264 -0.002369841 0 0.9999971 0.01280434 0 0.999918 0.01280434 0 0.999918 -0.002369841 0 0.9999971 -0.01278649 0 0.9999182 -0.03172894 0 0.9994965 0.04048834 0 0.99918 0.01280434 0 0.999918 -0.03172894 0 0.9994965 -0.05399392 0 0.9985413 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.00128991 0 0.999999 -0.003065143 0 0.9999952 0 0 0.9999999 0 0 0.9999999 8.67846e-4 0 0.9999995 -0.00128991 0 0.999999 -0.00128991 0 0.999999 8.67846e-4 0 0.9999995 9.06821e-4 0 0.9999995 -0.001556193 0 0.9999987 -0.003065143 0 0.9999952 -0.00128991 0 0.999999 -0.001556193 0 0.9999987 -0.01268964 0 0.9999195 0 0 0.9999999 9.62149e-4 0 0.9999993 -8.72912e-4 0 0.9999995 0 0 0.9999999 9.62149e-4 0 0.9999993 7.28339e-4 0 0.9999998 -6.81345e-4 0 0.9999997 -8.72912e-4 0 0.9999995 -8.72912e-4 0 0.9999995 -6.81345e-4 0 0.9999997 9.06821e-4 0 0.9999995 8.67846e-4 0 0.9999995 0 0 0.9999999 -8.72912e-4 0 0.9999995 8.67846e-4 0 0.9999995 0 0 0.9999999 -0.07901151 0 0.9968737 -0.03625904 0 0.9993423 -0.004558282 0 0.9999894 -0.004340648 0 0.9999905 -0.03625904 0 0.9993423 -0.01268964 0 0.9999195 -0.001556193 0 0.9999987 -0.004558282 0 0.9999894 -0.004558282 0 0.9999894 -0.001556193 0 0.9999987 9.06821e-4 0 0.9999995 -6.81345e-4 0 0.9999997 -0.004340648 0 0.9999905 -0.004558282 0 0.9999894 -6.81345e-4 0 0.9999997 7.28339e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.272683 0 0.962104 0.1034871 0 0.9946309 0.1153881 0 0.9933204 0.1504505 0 0.9886175 0.1034871 0 0.9946309 0.04549634 0 0.9989645 0.05726993 0 0.9983587 0.1153881 0 0.9933204 0.1153881 0 0.9933204 0.05726993 0 0.9983587 0.033627 0 0.9994345 0.04584014 0 0.9989488 0.1504505 0 0.9886175 0.1153881 0 0.9933204 0.04584014 0 0.9989488 0.04034363 0 0.9991858 0 0 0.9999999 0 0 0.9999999 0.01589239 0 0.9998736 0.009206073 0 0.9999575 0 0 0.9999999 0 0 0.9999999 0.006892395 0 0.9999762 0.01589239 0 0.9998736 0.01589239 0 0.9998736 0.006892395 0 0.9999762 0.033627 0 0.9994345 0.05726993 0 0.9983587 0.009206073 0 0.9999575 0.01589239 0 0.9998736 0.05726993 0 0.9983587 0.04549634 0 0.9989645 0 0 0.9999999 0.007495579 0 0.9999718 0.01128124 0 0.9999363 0 0 0.9999999 0.007495579 0 0.9999718 0.04034363 0 0.9991858 0.04584014 0 0.9989488 0.01128124 0 0.9999363 0.01128124 0 0.9999363 0.04584014 0 0.9989488 0.033627 0 0.9994345 0.006892395 0 0.9999762 0 0 0.9999999 0.01128124 0 0.9999363 0.006892395 0 0.9999762 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.002941338 0 0.9999955 0.002197067 0 0.9999976 0 0 0.9999999 0 0 0.9999999 0.001749056 0 0.9999984 0.002941338 0 0.9999955 0.002941338 0 0.9999955 0.001749056 0 0.9999984 0.007122213 0 0.9999745 0.01179921 0 0.9999302 0.002197067 0 0.9999976 0.002941338 0 0.9999955 0.01179921 0 0.9999302 0.009519669 0 0.9999546 0 0 0.9999999 0.004578968 0 0.9999894 0.003227907 0 0.9999947 0 0 0.9999999 0.004578968 0 0.9999894 0.01811307 0 0.9998359 0.01363814 0 0.9999069 0.003227907 0 0.9999947 0.003227907 0 0.9999947 0.01363814 0 0.9999069 0.007122213 0 0.9999745 0.001749056 0 0.9999984 0 0 0.9999999 0.003227907 0 0.9999947 0.001749056 0 0.9999984 0 0 0.9999999 0.04610957 0 0.9989364 0.01842407 0 0.9998303 0.02208378 0 0.999756 0.04025182 0 0.9991896 0.01842407 0 0.9998303 0.009519669 0 0.9999546 0.01179921 0 0.9999302 0.02208378 0 0.999756 0.02208378 0 0.999756 0.01179921 0 0.9999302 0.007122213 0 0.9999745 0.01363814 0 0.9999069 0.04025182 0 0.9991896 0.02208378 0 0.999756 0.01363814 0 0.9999069 0.01811307 0 0.9998359 0 0 0.9999999 0 0 0.9999999 0.006021251 0 0.9999817 0.004981895 0 0.9999876 0 0 0.9999999 0 0 0.9999999 0.003399095 0 0.9999942 0.006021251 0 0.9999817 0.006021251 0 0.9999817 0.003399095 0 0.9999942 0.0141711 0 0.9998996 0.02486521 0 0.9996908 0.004981895 0 0.9999876 0.006021251 0 0.9999817 0.02486521 0 0.9996908 0.02128067 0 0.9997734 0 0 0.9999999 0.006975519 0 0.9999757 0.007346406 0 0.9999729 0 0 0.9999999 0.006975519 0 0.9999757 0.03576641 0 0.9993601 0.02757534 0 0.9996197 0.007346406 0 0.9999729 0.007346406 0 0.9999729 0.02757534 0 0.9996197 0.0141711 0 0.9998996 0.003399095 0 0.9999942 0 0 0.9999999 0.007346406 0 0.9999729 0.003399095 0 0.9999942 0 0 0.9999999 0.09682198 0 0.9953017 0.05459291 0 0.9985088 0.0471472 0 0.9988879 0.09174301 0 0.9957827 0.05459291 0 0.9985088 0.02128067 0 0.9997734 0.02486521 0 0.9996908 0.0471472 0 0.9988879 0.0471472 0 0.9988879 0.02486521 0 0.9996908 0.0141711 0 0.9998996 0.02757534 0 0.9996197 0.09174301 0 0.9957827 0.0471472 0 0.9988879 0.02757534 0 0.9996197 0.03576641 0 0.9993601 0 0 0.9999999 0 0 0.9999999 -0.002265539 0 0.9999974 -0.002276503 0 0.9999973 0 0 0.9999999 0 0 0.9999999 -0.001605564 0 0.9999986 -0.002265539 0 0.9999974 -0.002265539 0 0.9999974 -0.001605564 0 0.9999986 -0.006456846 0 0.9999791 -0.01070218 0 0.9999427 -0.002276503 0 0.9999973 -0.002265539 0 0.9999974 -0.01070218 0 0.9999427 -0.008664258 0 0.9999623 0 0 0.9999999 -0.004193188 0 0.9999911 -0.002947578 0 0.9999955 0 0 0.9999999 -0.004193188 0 0.9999911 -0.01610589 0 0.9998701 -0.012362 0 0.9999234 -0.002947578 0 0.9999955 -0.002947578 0 0.9999955 -0.012362 0 0.9999234 -0.006456846 0 0.9999791 -0.001605564 0 0.9999986 0 0 0.9999999 -0.002947578 0 0.9999955 -0.001605564 0 0.9999986 0 0 0.9999999 -0.03194991 0 0.9994895 -0.02334037 0 0.9997275 -0.02003259 0 0.9997993 -0.03504559 0 0.9993857 -0.02334037 0 0.9997275 -0.008664258 0 0.9999623 -0.01070218 0 0.9999427 -0.02003259 0 0.9997993 -0.02003259 0 0.9997993 -0.01070218 0 0.9999427 -0.006456846 0 0.9999791 -0.012362 0 0.9999234 -0.03504559 0 0.9993857 -0.02003259 0 0.9997993 -0.012362 0 0.9999234 -0.01610589 0 0.9998701 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.09933326 0 0.9950542 -0.0162279 0 0.9998682 -0.05649642 0 0.9984028 -0.09556612 0 0.9954231 -0.0162279 0 0.9998682 0.03194277 0 0.9994897 0.01485272 0 0.9998897 -0.05649642 0 0.9984028 -0.05649642 0 0.9984028 0.01485272 0 0.9998897 0.002904823 0 0.9999958 -0.02403983 0 0.999711 -0.09556612 0 0.9954231 -0.05649642 0 0.9984028 -0.02403983 0 0.999711 -0.03998084 0 0.9992004 0.1618366 0 0.9868175 0.09726384 0 0.9952586 0.07968272 0 0.9968202 0.07032416 0 0.9975242 0.09726384 0 0.9952586 0.02892029 0 0.9995818 0.02430591 0 0.9997046 0.07968272 0 0.9968202 0.07968272 0 0.9968202 0.02430591 0 0.9997046 0.002904823 0 0.9999958 0.01485272 0 0.9998897 0.07032416 0 0.9975242 0.07968272 0 0.9968202 0.01485272 0 0.9998897 0.03194277 0 0.9994897 0 0 0.9999999 -0.01007959 0 0.9999491 -6.80194e-4 0 0.9999997 0.00502152 0 0.9999872 -0.01007959 0 0.9999491 -0.03998084 0 0.9992004 -0.02403983 0 0.999711 -6.80194e-4 0 0.9999997 -6.80194e-4 0 0.9999997 -0.02403983 0 0.999711 0.002904823 0 0.9999958 0.02430591 0 0.9997046 0.00502152 0 0.9999872 -6.80194e-4 0 0.9999997 0.02430591 0 0.9997046 0.02892029 0 0.9995818 0 0 0.9999999 -0.002825516 0 0.9999958 -0.005736996 0 0.9999834 -0.00433684 0 0.9999905 -0.002825516 0 0.9999958 -0.0161577 0 0.9998695 -0.01433656 0 0.9998972 -0.005736996 0 0.9999834 -0.005736996 0 0.9999834 -0.01433656 0 0.9998972 -0.01092149 0 0.9999403 -0.01031886 0 0.9999467 -0.00433684 0 0.9999905 -0.005736996 0 0.9999834 -0.01031886 0 0.9999467 -0.02455297 0 0.9996986 -0.08389555 0 0.9964746 -0.03627457 0 0.9993417 -0.04260398 0 0.999092 -0.05309166 0 0.9985896 -0.03627457 0 0.9993417 -0.01447534 0 0.9998952 -0.01636807 0 0.999866 -0.04260398 0 0.999092 -0.04260398 0 0.999092 -0.01636807 0 0.999866 -0.01092149 0 0.9999403 -0.01433656 0 0.9998972 -0.05309166 0 0.9985896 -0.04260398 0 0.999092 -0.01433656 0 0.9998972 -0.0161577 0 0.9998695 -0.09933326 0 0.9950542 -0.0504625 0 0.998726 -0.0101919 0 0.999948 -0.01705643 0 0.9998544 -0.0504625 0 0.998726 -0.02455297 0 0.9996986 -0.01031886 0 0.9999467 -0.0101919 0 0.999948 -0.0101919 0 0.999948 -0.01031886 0 0.9999467 -0.01092149 0 0.9999403 -0.01636807 0 0.999866 -0.01705643 0 0.9998544 -0.0101919 0 0.999948 -0.01636807 0 0.999866 -0.01447534 0 0.9998952 -0.09933326 0 0.9950542 -0.09556612 0 0.9954231 -0.05529069 0 0.9984701 -0.0504625 0 0.998726 -0.09556612 0 0.9954231 -0.03998084 0 0.9992004 -0.03440891 0 0.9994078 -0.05529069 0 0.9984701 -0.05529069 0 0.9984701 -0.03440891 0 0.9994078 -0.01837481 0 0.9998311 -0.02921424 0 0.9995731 -0.0504625 0 0.998726 -0.05529069 0 0.9984701 -0.02921424 0 0.9995731 -0.02455297 0 0.9996986 0 0 0.9999999 0 0 0.9999999 -0.008455953 0 0.9999641 -0.01007959 0 0.9999491 0 0 0.9999999 0 0 0.9999999 -0.006698585 0 0.9999775 -0.008455953 0 0.9999641 -0.008455953 0 0.9999641 -0.006698585 0 0.9999775 -0.01837481 0 0.9998311 -0.03440891 0 0.9994078 -0.01007959 0 0.9999491 -0.008455953 0 0.9999641 -0.03440891 0 0.9994078 -0.03998084 0 0.9992004 0 0 0.9999999 -0.00433684 0 0.9999905 -0.00845703 0 0.9999642 0 0 0.9999999 -0.00433684 0 0.9999905 -0.02455297 0 0.9996986 -0.02921424 0 0.9995731 -0.00845703 0 0.9999642 -0.00845703 0 0.9999642 -0.02921424 0 0.9995731 -0.01837481 0 0.9998311 -0.006698585 0 0.9999775 0 0 0.9999999 -0.00845703 0 0.9999642 -0.006698585 0 0.9999775 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.006323755 0 0.9999799 0.003064311 0 0.9999952 0 0 0.9999999 0 0 0.9999999 0.006668813 0 0.9999776 0.006323755 0 0.9999799 0.006323755 0 0.9999799 0.006668813 0 0.9999776 0.02436743 0 0.999703 0.02482668 0 0.9996917 0.003064311 0 0.9999952 0.006323755 0 0.9999799 0.02482668 0 0.9996917 0.01268237 0 0.9999195 0 0 0.9999999 0.01057031 0 0.9999441 0.009601946 0 0.9999539 0 0 0.9999999 0.01057031 0 0.9999441 0.04207153 0 0.9991146 0.03891523 0 0.9992425 0.009601946 0 0.9999539 0.009601946 0 0.9999539 0.03891523 0 0.9992425 0.02436743 0 0.999703 0.006668813 0 0.9999776 0 0 0.9999999 0.009601946 0 0.9999539 0.006668813 0 0.9999776 0 0 0.9999999 0.07899165 0 0.9968752 0.03624751 0 0.9993428 0.04264451 0 0.9990902 0.07719314 0 0.9970163 0.03624751 0 0.9993428 0.01268237 0 0.9999195 0.02482668 0 0.9996917 0.04264451 0 0.9990902 0.04264451 0 0.9990902 0.02482668 0 0.9996917 0.02436743 0 0.999703 0.03891523 0 0.9992425 0.07719314 0 0.9970163 0.04264451 0 0.9990902 0.03891523 0 0.9992425 0.04207153 0 0.9991146 0 0 0.9999999 0.01357649 0 0.9999077 0.01830306 0 0.9998324 0.0102921 0 0.999947 0.01357649 0 0.9999077 0.0485091 0 0.9988227 0.05241767 0 0.9986252 0.01830306 0 0.9998324 0.01830306 0 0.9998324 0.05241767 0 0.9986252 0.06123878 0 0.9981232 0.04066202 0 0.999173 0.0102921 0 0.999947 0.01830306 0 0.9998324 0.04066202 0 0.999173 0.03877137 0 0.999248 0.1587901 0 0.9873123 0.1245375 0 0.9922149 0.09093148 0 0.9958571 0.08848766 0 0.9960772 0.1245375 0 0.9922149 0.1233639 0 0.9923615 0.1005962 0 0.9949273 0.09093148 0 0.9958571 0.09093148 0 0.9958571 0.1005962 0 0.9949273 0.06123878 0 0.9981232 0.05241767 0 0.9986252 0.08848766 0 0.9960772 0.09093148 0 0.9958571 0.05241767 0 0.9986252 0.0485091 0 0.9988227 0.07899165 0 0.9968752 0.07312292 0 0.9973229 0.07160374 0 0.9974331 0.07580934 0 0.9971223 0.07312292 0 0.9973229 0.03877137 0 0.999248 0.04066202 0 0.999173 0.07160374 0 0.9974331 0.07160374 0 0.9974331 0.04066202 0 0.999173 0.06123878 0 0.9981232 0.1005962 0 0.9949273 0.07580934 0 0.9971223 0.07160374 0 0.9974331 0.1005962 0 0.9949273 0.1233639 0 0.9923615 0 0 0.9999999 0.00502152 0 0.9999872 0.006655698 0 0.9999778 -6.22753e-4 0 0.9999997 0.00502152 0 0.9999872 0.02892029 0 0.9995818 0.02246688 0 0.9997475 0.006655698 0 0.9999778 0.006655698 0 0.9999778 0.02246688 0 0.9997475 0.01180804 0 0.9999303 0.003387612 0 0.9999942 -6.22753e-4 0 0.9999997 0.006655698 0 0.9999778 0.003387612 0 0.9999942 -0.002853884 0 0.9999958 0.1618366 0 0.9868175 0.09588819 0 0.995392 0.04957815 0 0.9987701 0.09726384 0 0.9952586 0.09588819 0 0.995392 0.04044118 0 0.9991818 0.02435791 0 0.9997032 0.04957815 0 0.9987701 0.04957815 0 0.9987701 0.02435791 0 0.9997032 0.01180804 0 0.9999303 0.02246688 0 0.9997475 0.09726384 0 0.9952586 0.04957815 0 0.9987701 0.02246688 0 0.9997475 0.02892029 0 0.9995818 -0.01367634 0 0.9999064 -0.005566157 0 0.9999844 0.006042219 0 0.9999817 0.007789853 0 0.9999696 -0.005566157 0 0.9999844 -0.002853884 0 0.9999958 0.003387612 0 0.9999942 0.006042219 0 0.9999817 0.006042219 0 0.9999817 0.003387612 0 0.9999942 0.01180804 0 0.9999303 0.02435791 0 0.9997032 0.007789853 0 0.9999696 0.006042219 0 0.9999817 0.02435791 0 0.9997032 0.04044118 0 0.9991818 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.00787075 0 0.999969 -0.01497322 0 0.9998879 0.004907165 0 0.999988 -0.00787075 0 0.999969 -0.04511987 0 0.9989815 -0.06691912 0 0.9977583 -0.01497322 0 0.9998879 -0.01497322 0 0.9998879 -0.06691912 0 0.9977583 -0.04953818 0 0.9987721 0.01839601 0 0.9998308 0.004907165 0 0.999988 -0.01497322 0 0.9998879 0.01839601 0 0.9998308 0.02287993 0 0.9997382 -0.2422391 0 0.9702165 -0.26013 0 0.9655735 -0.1983999 0 0.9801211 -0.1029391 0 0.9946876 -0.26013 0 0.9655735 -0.01869373 0 0.9998252 -0.05634973 0 0.9984111 -0.1983999 0 0.9801211 -0.1983999 0 0.9801211 -0.05634973 0 0.9984111 -0.04953818 0 0.9987721 -0.06691912 0 0.9977583 -0.1029391 0 0.9946876 -0.1983999 0 0.9801211 -0.06691912 0 0.9977583 -0.04511987 0 0.9989815 0.07097931 0 0.9974778 0.08052669 0 0.9967524 0.06567251 0 0.9978412 0.1535513 0 0.9881406 0.08052669 0 0.9967524 0.02287993 0 0.9997382 0.01839601 0 0.9998308 0.06567251 0 0.9978412 0.06567251 0 0.9978412 0.01839601 0 0.9998308 -0.04953818 0 0.9987721 -0.05634973 0 0.9984111 0.1535513 0 0.9881406 0.06567251 0 0.9978412 -0.05634973 0 0.9984111 -0.01869373 0 0.9998252 0.07097931 0 0.9974778 -0.04048919 0 0.99918 -0.01310303 0 0.9999142 0.08052669 0 0.9967524 -0.04048919 0 0.99918 0.05398744 0 0.9985415 0.03172199 0 0.9994968 -0.01310303 0 0.9999142 -0.01310303 0 0.9999142 0.03172199 0 0.9994968 0.01253204 0 0.9999214 0.001767451 0 0.9999984 0.08052669 0 0.9967524 -0.01310303 0 0.9999142 0.001767451 0 0.9999984 0.02287993 0 0.9997382 0.1587901 0 0.9873123 0.1197362 0 0.9928057 0.08100068 0 0.996714 0.1395043 0 0.9902215 0.1197362 0 0.9928057 0.04661221 0 0.998913 0.03680999 0 0.9993223 0.08100068 0 0.996714 0.08100068 0 0.996714 0.03680999 0 0.9993223 0.01253204 0 0.9999214 0.03172199 0 0.9994968 0.1395043 0 0.9902215 0.08100068 0 0.996714 0.03172199 0 0.9994968 0.05398744 0 0.9985415 0 0 0.9999999 0.004907165 0 0.999988 0.006795528 0 0.9999769 0.0104798 0 0.9999452 0.004907165 0 0.999988 0.02287993 0 0.9997382 0.001767451 0 0.9999984 0.006795528 0 0.9999769 0.006795528 0 0.9999769 0.001767451 0 0.9999984 0.01253204 0 0.9999214 0.03680999 0 0.9993223 0.0104798 0 0.9999452 0.006795528 0 0.9999769 0.03680999 0 0.9993223 0.04661221 0 0.998913</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape2-textangents-array" count="2400" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape2-texbinormals">
+ <float_array id="qt_gauge_background_Shape2-texbinormals-array" count="7200">0.9999065 0 0.01367634 0.9999422 0 0.01075229 0.9999498 0 0.01003095 0.9999219 0 0.012504 0.9999422 0 0.01075229 0.9999875 0 0.0050086 0.9999643 0 0.008450898 0.9999498 0 0.01003095 0.9999498 0 0.01003095 0.9999643 0 0.008450898 0.9999763 0 0.006887449 0.9999594 0 0.009012659 0.9999219 0 0.012504 0.9999498 0 0.01003095 0.9999594 0 0.009012659 0.9999827 0 0.005887163 0.9702166 0 0.2422391 0.9946877 0 0.1029391 0.9998098 0 0.01950653 0.9996859 0 0.02506092 0.9946877 0 0.1029391 0.9989817 0 0.04511987 0.9999378 0 0.0111557 0.9998098 0 0.01950653 0.9998098 0 0.01950653 0.9999378 0 0.0111557 0.9999763 0 0.006887449 0.9999643 0 0.008450898 0.9996859 0 0.02506092 0.9998098 0 0.01950653 0.9999643 0 0.008450898 0.9999875 0 0.0050086 1 0 0 0.9999993 0 0.001229496 0.9999953 0 0.003065992 0.9999691 0 0.00787075 0.9999993 0 0.001229496 0.9999827 0 0.005887163 0.9999594 0 0.009012659 0.9999953 0 0.003065992 0.9999953 0 0.003065992 0.9999594 0 0.009012659 0.9999763 0 0.006887449 0.9999378 0 0.0111557 0.9999691 0 0.00787075 0.9999953 0 0.003065992 0.9999378 0 0.0111557 0.9989817 0 0.04511987 0.9897043 0 0.1431279 0.9992388 0 0.03901037 0.9963712 0 0.08511462 0.9919686 0 0.1264854 0.9992388 0 0.03901037 0.9991904 0 -0.04023223 0.99987 0 -0.01612961 0.9963712 0 0.08511462 0.9963712 0 0.08511462 0.99987 0 -0.01612961 0.9999968 0 -0.002558745 0.9995052 0 0.03145622 0.9919686 0 0.1264854 0.9963712 0 0.08511462 0.9995052 0 0.03145622 0.9987881 0 0.04921703 0.9953018 0 -0.09682199 0.9957828 0 -0.09174301 0.9962884 0 -0.08607902 0.9961559 0 -0.08759882 0.9957828 0 -0.09174301 0.9993603 0 -0.03576642 0.999607 0 -0.0280341 0.9962884 0 -0.08607902 0.9962884 0 -0.08607902 0.999607 0 -0.0280341 0.9999968 0 -0.002558745 0.99987 0 -0.01612961 0.9961559 0 -0.08759882 0.9962884 0 -0.08607902 0.99987 0 -0.01612961 0.9991904 0 -0.04023223 1 0 0 0.9999521 0 0.009790589 0.9999993 0 0.00113281 0.9999757 0 -0.00697552 0.9999521 0 0.009790589 0.9987881 0 0.04921703 0.9995052 0 0.03145622 0.9999993 0 0.00113281 0.9999993 0 0.00113281 0.9995052 0 0.03145622 0.9999968 0 -0.002558745 0.999607 0 -0.0280341 0.9999757 0 -0.00697552 0.9999993 0 0.00113281 0.999607 0 -0.0280341 0.9993603 0 -0.03576642 0.9950539 0 -0.0993373 0.9998546 0 -0.01705509 0.9999481 0 -0.01019941 0.9987262 0 -0.05045886 0.9998546 0 -0.01705509 0.9998955 0 -0.01446277 0.9998659 0 -0.0163776 0.9999481 0 -0.01019941 0.9999481 0 -0.01019941 0.9998659 0 -0.0163776 0.9999402 0 -0.0109429 0.999947 0 -0.01030315 0.9987262 0 -0.05045886 0.9999481 0 -0.01019941 0.999947 0 -0.01030315 0.9996986 0 -0.02454965 0.9964748 0 -0.08389317 0.9985895 0 -0.05309606 0.9990916 0 -0.042616 0.9993424 0 -0.03626223 0.9985895 0 -0.05309606 0.9998696 0 -0.01614967 0.9998973 0 -0.01433089 0.9990916 0 -0.042616 0.9990916 0 -0.042616 0.9998973 0 -0.01433089 0.9999402 0 -0.0109429 0.9998659 0 -0.0163776 0.9993424 0 -0.03626223 0.9990916 0 -0.042616 0.9998659 0 -0.0163776 0.9998955 0 -0.01446277 1 0 0 0.9999906 0 -0.004338131 0.9999837 0 -0.00571815 0.9999961 0 -0.002826208 0.9999906 0 -0.004338131 0.9996986 0 -0.02454965 0.999947 0 -0.01030315 0.9999837 0 -0.00571815 0.9999837 0 -0.00571815 0.999947 0 -0.01030315 0.9999402 0 -0.0109429 0.9998973 0 -0.01433089 0.9999961 0 -0.002826208 0.9999837 0 -0.00571815 0.9998973 0 -0.01433089 0.9998696 0 -0.01614967 0.9999061 0 -0.01371068 0.9999698 0 0.00776518 0.9999825 0 0.005910712 0.9999844 0 -0.005603384 0.9999698 0 0.00776518 0.9991822 0 0.04043505 0.9997092 0 0.02411429 0.9999825 0 0.005910712 0.9999825 0 0.005910712 0.9997092 0 0.02411429 0.9999333 0 0.01155306 0.9999954 0 0.003062053 0.9999844 0 -0.005603384 0.9999825 0 0.005910712 0.9999954 0 0.003062053 0.9999957 0 -0.002946467 0.9868171 0 0.1618398 0.9952938 0 0.09690414 0.9987976 0 0.04902431 0.9953914 0 0.095896 0.9952938 0 0.09690414 0.9996025 0 0.02819272 0.9997625 0 0.02179095 0.9987976 0 0.04902431 0.9987976 0 0.04902431 0.9997625 0 0.02179095 0.9999333 0 0.01155306 0.9997092 0 0.02411429 0.9953914 0 0.095896 0.9987976 0 0.04902431 0.9997092 0 0.02411429 0.9991822 0 0.04043505 1 0 0 0.9999999 0 -6.54478e-4 0.9999809 0 0.006188973 0.9999886 0 0.004779552 0.9999999 0 -6.54478e-4 0.9999957 0 -0.002946467 0.9999954 0 0.003062053 0.9999809 0 0.006188973 0.9999809 0 0.006188973 0.9999954 0 0.003062053 0.9999333 0 0.01155306 0.9997625 0 0.02179095 0.9999886 0 0.004779552 0.9999809 0 0.006188973 0.9997625 0 0.02179095 0.9996025 0 0.02819272 0.9968737 0 0.07901151 0.9971232 0 0.07579947 0.9975099 0 0.07052787 0.9973603 0 0.07261103 0.9971232 0 0.07579947 0.9923683 0 0.123309 0.9950548 0 0.09932801 0.9975099 0 0.07052787 0.9975099 0 0.07052787 0.9950548 0 0.09932801 0.9983324 0 0.05772771 0.9992635 0 0.038374 0.9973603 0 0.07261103 0.9975099 0 0.07052787 0.9992635 0 0.038374 0.99931 0 0.03714307 0.9873115 0 0.1587955 0.9962266 0 0.08679088 0.9960793 0 0.08846541 0.9922133 0 0.1245504 0.9962266 0 0.08679088 0.9987331 0 0.05032138 0.9988585 0 0.04776879 0.9960793 0 0.08846541 0.9960793 0 0.08846541 0.9988585 0 0.04776879 0.9983324 0 0.05772771 0.9950548 0 0.09932801 0.9922133 0 0.1245504 0.9960793 0 0.08846541 0.9950548 0 0.09932801 0.9923683 0 0.123309 1 0 0 0.999967 0 0.008121109 0.9998202 0 0.01895975 0.9999126 0 0.01322239 0.999967 0 0.008121109 0.99931 0 0.03714307 0.9992635 0 0.038374 0.9998202 0 0.01895975 0.9998202 0 0.01895975 0.9992635 0 0.038374 0.9983324 0 0.05772771 0.9988585 0 0.04776879 0.9999126 0 0.01322239 0.9998202 0 0.01895975 0.9988585 0 0.04776879 0.9987331 0 0.05032138 0.9702154 0 -0.2422442 0.9996853 0 -0.02508596 0.9997863 0 -0.02067368 0.9946014 0 -0.1037698 0.9996853 0 -0.02508596 0.9999875 0 -0.004988839 0.9999594 0 -0.009018785 0.9997863 0 -0.02067368 0.9997863 0 -0.02067368 0.9999594 0 -0.009018785 0.9999696 0 -0.007802528 0.999916 0 -0.01297089 0.9946014 0 -0.1037698 0.9997863 0 -0.02067368 0.999916 0 -0.01297089 0.9989032 0 -0.04682355 0.9999061 0 -0.01371068 0.9999216 0 -0.01252614 0.9999489 0 -0.01012272 0.9999419 0 -0.01078191 0.9999216 0 -0.01252614 0.9999827 0 -0.005907148 0.999965 0 -0.00836671 0.9999489 0 -0.01012272 0.9999489 0 -0.01012272 0.999965 0 -0.00836671 0.9999696 0 -0.007802528 0.9999594 0 -0.009018785 0.9999419 0 -0.01078191 0.9999489 0 -0.01012272 0.9999594 0 -0.009018785 0.9999875 0 -0.004988839 1 0 0 0.999963 0 -0.008612079 0.9999922 0 -0.003954921 0.9999992 0 -0.00125882 0.999963 0 -0.008612079 0.9989032 0 -0.04682355 0.999916 0 -0.01297089 0.9999922 0 -0.003954921 0.9999922 0 -0.003954921 0.999916 0 -0.01297089 0.9999696 0 -0.007802528 0.999965 0 -0.00836671 0.9999992 0 -0.00125882 0.9999922 0 -0.003954921 0.999965 0 -0.00836671 0.9999827 0 -0.005907148 0.9974783 0 0.07097246 0.9881415 0 0.153546 0.9978402 0 0.06568841 0.9967257 0 0.08085791 0.9881415 0 0.153546 0.9998257 0 -0.0186701 0.9984027 0 -0.05649782 0.9978402 0 0.06568841 0.9978402 0 0.06568841 0.9984027 0 -0.05649782 0.9987659 0 -0.04966708 0.9998338 0 0.01823486 0.9967257 0 0.08085791 0.9978402 0 0.06568841 0.9998338 0 0.01823486 0.9997264 0 0.02339222 0.9702154 0 -0.2422442 0.9946014 0 -0.1037698 0.9800746 0 -0.1986301 0.9655679 0 -0.2601513 0.9946014 0 -0.1037698 0.9989032 0 -0.04682355 0.9977217 0 -0.06746516 0.9800746 0 -0.1986301 0.9800746 0 -0.1986301 0.9977217 0 -0.06746516 0.9987659 0 -0.04966708 0.9984027 0 -0.05649782 0.9655679 0 -0.2601513 0.9800746 0 -0.1986301 0.9984027 0 -0.05649782 0.9998257 0 -0.0186701 1 0 0 0.9999874 0 0.005034203 0.99988 0 -0.01549611 0.999963 0 -0.008612079 0.9999874 0 0.005034203 0.9997264 0 0.02339222 0.9998338 0 0.01823486 0.99988 0 -0.01549611 0.99988 0 -0.01549611 0.9998338 0 0.01823486 0.9987659 0 -0.04966708 0.9977217 0 -0.06746516 0.999963 0 -0.008612079 0.99988 0 -0.01549611 0.9977217 0 -0.06746516 0.9989032 0 -0.04682355 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9968737 0 0.07901151 0.9966205 0 0.08214404 0.9989365 0 0.04610862 0.9993424 0 0.03625904 0.9966205 0 0.08214404 0.9990166 0 0.0443394 0.9994573 0 0.03294398 0.9989365 0 0.04610862 0.9989365 0 0.04610862 0.9994573 0 0.03294398 0.9996921 0 0.02481306 0.9996896 0 0.02491414 0.9993424 0 0.03625904 0.9989365 0 0.04610862 0.9996896 0 0.02491414 0.9999195 0 0.01268964 1 0 0 1 0 0 0.9999297 0 0.01186577 0.9999312 0 0.01172863 1 0 0 1 0 0 0.999984 0 0.005673023 0.9999297 0 0.01186577 0.9999297 0 0.01186577 0.999984 0 0.005673023 0.9996921 0 0.02481306 0.9994573 0 0.03294398 0.9999312 0 0.01172863 0.9999297 0 0.01186577 0.9994573 0 0.03294398 0.9990166 0 0.0443394 1 0 0 0.9999954 0 0.003065143 0.99998 0 0.00633873 1 0 0 0.9999954 0 0.003065143 0.9999195 0 0.01268964 0.9996896 0 0.02491414 0.99998 0 0.00633873 0.99998 0 0.00633873 0.9996896 0 0.02491414 0.9996921 0 0.02481306 0.999984 0 0.005673023 1 0 0 0.99998 0 0.00633873 0.999984 0 0.005673023 1 0 0 1 0 0 0.9999961 0 -0.002826208 0.9999931 0 -0.003707369 1 0 0 0.9999961 0 -0.002826208 0.9998696 0 -0.01614967 0.9999248 0 -0.01226022 0.9999931 0 -0.003707369 0.9999931 0 -0.003707369 0.9999248 0 -0.01226022 0.9999413 0 -0.01083497 0.9999979 0 -0.002098082 1 0 0 0.9999931 0 -0.003707369 0.9999979 0 -0.002098082 1 0 0 0.9964748 0 -0.08389317 0.9989481 0 -0.04585619 0.999653 0 -0.02634458 0.9985895 0 -0.05309606 0.9989481 0 -0.04585619 0.9999053 0 -0.01376249 0.9998322 0 -0.01832265 0.999653 0 -0.02634458 0.999653 0 -0.02634458 0.9998322 0 -0.01832265 0.9999413 0 -0.01083497 0.9999248 0 -0.01226022 0.9985895 0 -0.05309606 0.999653 0 -0.02634458 0.9999248 0 -0.01226022 0.9998696 0 -0.01614967 1 0 0 1 0 0 0.9999868 0 -0.005162504 0.9999962 0 -0.002767272 1 0 0 1 0 0 0.9999979 0 -0.002098082 0.9999868 0 -0.005162504 0.9999868 0 -0.005162504 0.9999979 0 -0.002098082 0.9999413 0 -0.01083497 0.9998322 0 -0.01832265 0.9999962 0 -0.002767272 0.9999868 0 -0.005162504 0.9998322 0 -0.01832265 0.9999053 0 -0.01376249 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999865 0 0.005203974 0.9999992 0 -0.001279718 0.9999719 0 -0.00749558 0.9999865 0 0.005203974 0.999617 0 0.02767373 0.9996594 0 0.02609698 0.9999992 0 -0.001279718 0.9999992 0 -0.001279718 0.9996594 0 0.02609698 0.999997 0 0.002495315 0.9995248 0 -0.03082635 0.9999719 0 -0.00749558 0.9999992 0 -0.001279718 0.9995248 0 -0.03082635 0.9991859 0 -0.04034364 0.9866759 0 0.162698 0.9966646 0 0.08160616 0.9962833 0 0.08613724 0.9962037 0 0.08705343 0.9966646 0 0.08160616 0.9999347 0 -0.01143526 0.9996446 0 0.02666047 0.9962833 0 0.08613724 0.9962833 0 0.08613724 0.9996446 0 0.02666047 0.999997 0 0.002495315 0.9996594 0 0.02609698 0.9962037 0 0.08705343 0.9962833 0 0.08613724 0.9996594 0 0.02609698 0.999617 0 0.02767373 0.962104 0 -0.272683 0.9886176 0 -0.1504505 0.9992277 0 -0.03929478 0.9814512 0 -0.1917125 0.9886176 0 -0.1504505 0.9991859 0 -0.04034364 0.9995248 0 -0.03082635 0.9992277 0 -0.03929478 0.9992277 0 -0.03929478 0.9995248 0 -0.03082635 0.999997 0 0.002495315 0.9996446 0 0.02666047 0.9814512 0 -0.1917125 0.9992277 0 -0.03929478 0.9996446 0 0.02666047 0.9999347 0 -0.01143526 0.9989364 0 -0.04610957 1 0 0 0.9999894 0 0.004624793 0.9998304 0 -0.01842407 1 0 0 0.9998968 0 0.01436606 0.9998052 0 0.01974165 0.9999894 0 0.004624793 0.9999894 0 0.004624793 0.9998052 0 0.01974165 0.9999327 0 0.01160709 1 0 1.77873e-4 0.9998304 0 -0.01842407 0.9999894 0 0.004624793 1 0 1.77873e-4 0.9999548 0 -0.00951967 0.9964746 0 0.08389555 0.9985897 0 0.05309166 0.9996538 0 0.02631498 0.998956 0 0.04568532 0.9985897 0 0.05309166 0.9998695 0 0.0161577 0.9999139 0 0.01312598 0.9996538 0 0.02631498 0.9996538 0 0.02631498 0.9999139 0 0.01312598 0.9999327 0 0.01160709 0.9998052 0 0.01974165 0.998956 0 0.04568532 0.9996538 0 0.02631498 0.9998052 0 0.01974165 0.9998968 0 0.01436606 1 0 0 0.9999976 0 -0.002197067 0.9999945 0 0.003329277 0.9999961 0 0.002825517 0.9999976 0 -0.002197067 0.9999548 0 -0.00951967 1 0 1.77873e-4 0.9999945 0 0.003329277 0.9999945 0 0.003329277 1 0 1.77873e-4 0.9999327 0 0.01160709 0.9999139 0 0.01312598 0.9999961 0 0.002825517 0.9999945 0 0.003329277 0.9999139 0 0.01312598 0.9998695 0 0.0161577 0.9953018 0 -0.09682199 0.9997217 0 0.02359419 0.999989 0 -0.004684595 0.9985088 0 -0.05459291 0.9997217 0 0.02359419 0.9999105 0 -0.01338237 0.9998827 0 -0.01532353 0.999989 0 -0.004684595 0.999989 0 -0.004684595 0.9998827 0 -0.01532353 0.9999506 0 -0.009947606 0.9999744 0 -0.007149492 0.9985088 0 -0.05459291 0.999989 0 -0.004684595 0.9999744 0 -0.007149492 0.9997736 0 -0.02128067 0.9989364 0 -0.04610957 0.9991896 0 -0.04025182 0.9993681 0 -0.03554489 0.9994215 0 -0.0340103 0.9991896 0 -0.04025182 0.999836 0 -0.01811307 0.9998969 0 -0.01436066 0.9993681 0 -0.03554489 0.9993681 0 -0.03554489 0.9998969 0 -0.01436066 0.9999506 0 -0.009947606 0.9998827 0 -0.01532353 0.9994215 0 -0.0340103 0.9993681 0 -0.03554489 0.9998827 0 -0.01532353 0.9999105 0 -0.01338237 1 0 0 0.9999877 0 -0.004981896 0.9999855 0 -0.005399056 0.9999895 0 -0.004578968 0.9999877 0 -0.004981896 0.9997736 0 -0.02128067 0.9999744 0 -0.007149492 0.9999855 0 -0.005399056 0.9999855 0 -0.005399056 0.9999744 0 -0.007149492 0.9999506 0 -0.009947606 0.9998969 0 -0.01436066 0.9999895 0 -0.004578968 0.9999855 0 -0.005399056 0.9998969 0 -0.01436066 0.999836 0 -0.01811307 0.9994895 0 0.03194991 0.9999964 0 0.002700417 0.999971 0 0.007618186 0.9997276 0 0.02334037 0.9999964 0 0.002700417 0.9993321 0 0.03654576 0.9997696 0 0.02146531 0.999971 0 0.007618186 0.999971 0 0.007618186 0.9997696 0 0.02146531 0.9998223 0 0.0188563 0.999984 0 0.00566378 0.9997276 0 0.02334037 0.999971 0 0.007618186 0.999984 0 0.00566378 0.9999626 0 0.00866426 0.9866759 0 0.162698 0.9962037 0 0.08705343 0.9990095 0 0.04449805 0.9962062 0 0.08702503 0.9962037 0 0.08705343 0.999617 0 0.02767373 0.9996237 0 0.02743057 0.9990095 0 0.04449805 0.9990095 0 0.04449805 0.9996237 0 0.02743057 0.9998223 0 0.0188563 0.9997696 0 0.02146531 0.9962062 0 0.08702503 0.9990095 0 0.04449805 0.9997696 0 0.02146531 0.9993321 0 0.03654576 1 0 0 0.9999975 0 0.002276503 0.9999734 0 0.00730456 0.9999865 0 0.005203974 0.9999975 0 0.002276503 0.9999626 0 0.00866426 0.999984 0 0.00566378 0.9999734 0 0.00730456 0.9999734 0 0.00730456 0.999984 0 0.00566378 0.9998223 0 0.0188563 0.9996237 0 0.02743057 0.9999865 0 0.005203974 0.9999734 0 0.00730456 0.9996237 0 0.02743057 0.999617 0 0.02767373 1 0 0 0.999996 0 0.002857843 0.9999869 0 0.005113206 1 0 0 0.999996 0 0.002857843 0.9998671 0 0.01630538 0.9999166 0 0.01292446 0.9999869 0 0.005113206 0.9999869 0 0.005113206 0.9999166 0 0.01292446 0.9999495 0 0.01006252 0.9999977 0 0.002141257 1 0 0 0.9999869 0 0.005113206 0.9999977 0 0.002141257 1 0 0 0.9994895 0 0.03194991 0.9993858 0 0.03504559 0.9996099 0 0.02793062 0.9995207 0 0.0309583 0.9993858 0 0.03504559 0.9998703 0 0.01610589 0.999905 0 0.01379123 0.9996099 0 0.02793062 0.9996099 0 0.02793062 0.999905 0 0.01379123 0.9999495 0 0.01006252 0.9999166 0 0.01292446 0.9995207 0 0.0309583 0.9996099 0 0.02793062 0.9999166 0 0.01292446 0.9998671 0 0.01630538 1 0 0 1 0 0 0.9999928 0 0.003781774 0.9999912 0 0.004193188 1 0 0 1 0 0 0.9999977 0 0.002141257 0.9999928 0 0.003781774 0.9999928 0 0.003781774 0.9999977 0 0.002141257 0.9999495 0 0.01006252 0.999905 0 0.01379123 0.9999912 0 0.004193188 0.9999928 0 0.003781774 0.999905 0 0.01379123 0.9998703 0 0.01610589 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9968753 0 -0.07899165 0.9999907 0 -0.004329796 0.9999897 0 -0.004544993 0.9993429 0 -0.03624751 0.9999907 0 -0.004329796 0.9999998 0 7.17276e-4 0.9999998 0 -6.76436e-4 0.9999897 0 -0.004544993 0.9999897 0 -0.004544993 0.9999998 0 -6.76436e-4 0.9999996 0 9.29383e-4 0.9999989 0 -0.001542246 0.9993429 0 -0.03624751 0.9999897 0 -0.004544993 0.9999989 0 -0.001542246 0.9999197 0 -0.01268238 1 0 0 1 0 0 0.9999997 0 -8.71327e-4 0.9999996 0 9.69898e-4 1 0 0 1 0 0 0.9999997 0 8.67134e-4 0.9999997 0 -8.71327e-4 0.9999997 0 -8.71327e-4 0.9999997 0 8.67134e-4 0.9999996 0 9.29383e-4 0.9999998 0 -6.76436e-4 0.9999996 0 9.69898e-4 0.9999997 0 -8.71327e-4 0.9999998 0 -6.76436e-4 0.9999998 0 7.17276e-4 1 0 0 0.9999953 0 -0.003064312 0.9999992 0 -0.001283035 1 0 0 0.9999953 0 -0.003064312 0.9999197 0 -0.01268238 0.9999989 0 -0.001542246 0.9999992 0 -0.001283035 0.9999992 0 -0.001283035 0.9999989 0 -0.001542246 0.9999996 0 9.29383e-4 0.9999997 0 8.67134e-4 1 0 0 0.9999992 0 -0.001283035 0.9999997 0 8.67134e-4 1 0 0 0.9968753 0 -0.07899165 0.9970163 0 -0.07719314 0.9977757 0 -0.06666087 0.997323 0 -0.07312293 0.9970163 0 -0.07719314 0.9991146 0 -0.04207153 0.9993778 0 -0.03527319 0.9977757 0 -0.06666087 0.9977757 0 -0.06666087 0.9993778 0 -0.03527319 0.9998103 0 -0.01947789 0.9991167 0 -0.04202332 0.997323 0 -0.07312293 0.9977757 0 -0.06666087 0.9991167 0 -0.04202332 0.9992481 0 -0.03877138 1 0 0 1 0 0 0.9999701 0 -0.007735278 0.9999442 0 -0.01057031 1 0 0 1 0 0 0.9999686 0 -0.007937473 0.9999701 0 -0.007735278 0.9999701 0 -0.007735278 0.9999686 0 -0.007937473 0.9998103 0 -0.01947789 0.9993778 0 -0.03527319 0.9999442 0 -0.01057031 0.9999701 0 -0.007735278 0.9993778 0 -0.03527319 0.9991146 0 -0.04207153 1 0 0 0.9999471 0 -0.0102921 0.9999318 0 -0.01168892 1 0 0 0.9999471 0 -0.0102921 0.9992481 0 -0.03877138 0.9991167 0 -0.04202332 0.9999318 0 -0.01168892 0.9999318 0 -0.01168892 0.9991167 0 -0.04202332 0.9998103 0 -0.01947789 0.9999686 0 -0.007937473 1 0 0 0.9999318 0 -0.01168892 0.9999686 0 -0.007937473 1 0 0 0.9999065 0 0.01367634 0.9999219 0 0.012504 0.9999773 0 0.006742118 0.9999845 0 0.005566158 0.9999219 0 0.012504 0.9999827 0 0.005887163 0.9999918 0 0.004061969 0.9999773 0 0.006742118 0.9999773 0 0.006742118 0.9999918 0 0.004061969 0.9999981 0 0.001987858 0.9999941 0 0.003442734 0.9999845 0 0.005566158 0.9999773 0 0.006742118 0.9999941 0 0.003442734 0.999996 0 0.002853884 1 0 0 1 0 0 0.9999994 0 0.001117081 0.9999993 0 0.001229496 1 0 0 1 0 0 0.9999999 0 4.87965e-4 0.9999994 0 0.001117081 0.9999994 0 0.001117081 0.9999999 0 4.87965e-4 0.9999981 0 0.001987858 0.9999918 0 0.004061969 0.9999993 0 0.001229496 0.9999994 0 0.001117081 0.9999918 0 0.004061969 0.9999827 0 0.005887163 1 0 0 0.9999998 0 6.22753e-4 0.9999997 0 7.98086e-4 1 0 0 0.9999998 0 6.22753e-4 0.999996 0 0.002853884 0.9999941 0 0.003442734 0.9999997 0 7.98086e-4 0.9999997 0 7.98086e-4 0.9999941 0 0.003442734 0.9999981 0 0.001987858 0.9999999 0 4.87965e-4 1 0 0 0.9999997 0 7.98086e-4 0.9999999 0 4.87965e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9873124 0 -0.1587901 0.9960773 0 -0.08848766 0.9961811 0 -0.08731166 0.9928058 0 -0.1197362 0.9960773 0 -0.08848766 0.9988228 0 -0.04850911 0.9988555 0 -0.04783036 0.9961811 0 -0.08731166 0.9961811 0 -0.08731166 0.9988555 0 -0.04783036 0.9996666 0 -0.02582118 0.9994304 0 -0.03374936 0.9928058 0 -0.1197362 0.9961811 0 -0.08731166 0.9994304 0 -0.03374936 0.998913 0 -0.04661221 1 0 0 1 0 0 0.9999143 0 -0.01309804 0.9999079 0 -0.01357649 1 0 0 1 0 0 0.9999943 0 -0.003390581 0.9999143 0 -0.01309804 0.9999143 0 -0.01309804 0.9999943 0 -0.003390581 0.9996666 0 -0.02582118 0.9988555 0 -0.04783036 0.9999079 0 -0.01357649 0.9999143 0 -0.01309804 0.9988555 0 -0.04783036 0.9988228 0 -0.04850911 1 0 0 0.9999452 0 -0.0104798 0.9999793 0 -0.00643894 1 0 0 0.9999452 0 -0.0104798 0.998913 0 -0.04661221 0.9994304 0 -0.03374936 0.9999793 0 -0.00643894 0.9999793 0 -0.00643894 0.9994304 0 -0.03374936 0.9996666 0 -0.02582118 0.9999943 0 -0.003390581 1 0 0 0.9999793 0 -0.00643894 0.9999943 0 -0.003390581 1 0 0 1 0 0 1 0 0 0.9999964 0 0.002717329 0.9999695 0 0.007821523 1 0 0 1 0 0 0.9999986 0 -0.001698303 0.9999964 0 0.002717329 0.9999964 0 0.002717329 0.9999986 0 -0.001698303 1 0 0 0.9999415 0 0.01082879 0.9999695 0 0.007821523 0.9999964 0 0.002717329 0.9999415 0 0.01082879 0.9993938 0 0.03481764 1 0 0 0.9999998 0 6.12564e-4 1 0 1.92264e-4 1 0 0 0.9999998 0 6.12564e-4 1 0 1.38027e-4 0.9999935 0 -0.003601321 1 0 1.92264e-4 1 0 1.92264e-4 0.9999935 0 -0.003601321 1 0 0 0.9999986 0 -0.001698303 1 0 0 1 0 1.92264e-4 0.9999986 0 -0.001698303 1 0 0 0.9897043 0 0.1431279 0.9978241 0 0.0659339 0.999979 0 0.006493379 0.9998351 0 0.01816502 0.9978241 0 0.0659339 0.9993938 0 0.03481764 0.9999415 0 0.01082879 0.999979 0 0.006493379 0.999979 0 0.006493379 0.9999415 0 0.01082879 1 0 0 0.9999935 0 -0.003601321 0.9998351 0 0.01816502 0.999979 0 0.006493379 0.9999935 0 -0.003601321 1 0 1.38027e-4 1 0 0 1 0 0 0.9999393 0 0.0110217 0.9999521 0 0.009790589 1 0 0 1 0 0 0.9999869 0 0.005131572 0.9999393 0 0.0110217 0.9999393 0 0.0110217 0.9999869 0 0.005131572 0.9997711 0 0.02139783 0.9991692 0 0.04075496 0.9999521 0 0.009790589 0.9999393 0 0.0110217 0.9991692 0 0.04075496 0.9987881 0 0.04921703 1 0 0 0.9999695 0 0.007821523 0.9999586 0 0.009103991 1 0 0 0.9999695 0 0.007821523 0.9993938 0 0.03481764 0.9992726 0 0.03813636 0.9999586 0 0.009103991 0.9999586 0 0.009103991 0.9992726 0 0.03813636 0.9997711 0 0.02139783 0.9999869 0 0.005131572 1 0 0 0.9999586 0 0.009103991 0.9999869 0 0.005131572 1 0 0 0.9897043 0 0.1431279 0.9919686 0 0.1264854 0.9974909 0 0.07079508 0.9978241 0 0.0659339 0.9919686 0 0.1264854 0.9987881 0 0.04921703 0.9991692 0 0.04075496 0.9974909 0 0.07079508 0.9974909 0 0.07079508 0.9991692 0 0.04075496 0.9997711 0 0.02139783 0.9992726 0 0.03813636 0.9978241 0 0.0659339 0.9974909 0 0.07079508 0.9992726 0 0.03813636 0.9993938 0 0.03481764 1 0 0 0.9999886 0 0.004779552 1 0 0 0.9999549 0 -0.0095018 0.9999886 0 0.004779552 0.9996025 0 0.02819272 0.9997008 0 0.02445981 1 0 0 1 0 0 0.9997008 0 0.02445981 0.9999937 0 0.003548316 0.9997395 0 -0.02282707 0.9999549 0 -0.0095018 1 0 0 0.9997395 0 -0.02282707 0.9992514 0 -0.03868642 0.9868171 0 0.1618398 0.9975239 0 0.07032952 0.9968121 0 0.07978476 0.9952938 0 0.09690414 0.9975239 0 0.07032952 0.9994897 0 0.03194262 0.9998862 0 0.01509207 0.9968121 0 0.07978476 0.9968121 0 0.07978476 0.9998862 0 0.01509207 0.9999937 0 0.003548316 0.9997008 0 0.02445981 0.9952938 0 0.09690414 0.9968121 0 0.07978476 0.9997008 0 0.02445981 0.9996025 0 0.02819272 0.9950539 0 -0.0993373 0.9954946 0 -0.09481879 0.9984353 0 -0.05592054 0.9998683 0 -0.01623275 0.9954946 0 -0.09481879 0.9992514 0 -0.03868642 0.9997395 0 -0.02282707 0.9984353 0 -0.05592054 0.9984353 0 -0.05592054 0.9997395 0 -0.02282707 0.9999937 0 0.003548316 0.9998862 0 0.01509207 0.9998683 0 -0.01623275 0.9984353 0 -0.05592054 0.9998862 0 0.01509207 0.9994897 0 0.03194262 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999646 0 -0.00842588 0.9999906 0 -0.004338131 1 0 0 1 0 0 0.9999781 0 -0.00662389 0.9999646 0 -0.00842588 0.9999646 0 -0.00842588 0.9999781 0 -0.00662389 0.9998355 0 -0.01814403 0.9995775 0 -0.02906835 0.9999906 0 -0.004338131 0.9999646 0 -0.00842588 0.9995775 0 -0.02906835 0.9996986 0 -0.02454965 1 0 0 0.9999549 0 -0.0095018 0.9999662 0 -0.00822796 1 0 0 0.9999549 0 -0.0095018 0.9992514 0 -0.03868642 0.9994289 0 -0.03379307 0.9999662 0 -0.00822796 0.9999662 0 -0.00822796 0.9994289 0 -0.03379307 0.9998355 0 -0.01814403 0.9999781 0 -0.00662389 1 0 0 0.9999662 0 -0.00822796 0.9999781 0 -0.00662389 1 0 0 0.9950539 0 -0.0993373 0.9987262 0 -0.05045886 0.9984933 0 -0.05487501 0.9954946 0 -0.09481879 0.9987262 0 -0.05045886 0.9996986 0 -0.02454965 0.9995775 0 -0.02906835 0.9984933 0 -0.05487501 0.9984933 0 -0.05487501 0.9995775 0 -0.02906835 0.9998355 0 -0.01814403 0.9994289 0 -0.03379307 0.9954946 0 -0.09481879 0.9984933 0 -0.05487501 0.9994289 0 -0.03379307 0.9992514 0 -0.03868642 1 0 0 1 0 0 0.9999995 0 -0.00101114 0.9999999 0 -6.54478e-4 1 0 0 1 0 0 0.9999999 0 -5.30274e-4 0.9999995 0 -0.00101114 0.9999995 0 -0.00101114 0.9999999 0 -5.30274e-4 0.9999978 0 -0.002110732 0.9999937 0 -0.003562058 0.9999999 0 -6.54478e-4 0.9999995 0 -0.00101114 0.9999937 0 -0.003562058 0.9999957 0 -0.002946467 1 0 0 0.9999992 0 -0.00125882 0.9999992 0 -0.001324115 1 0 0 0.9999992 0 -0.00125882 0.9999827 0 -0.005907148 0.9999903 0 -0.00443042 0.9999992 0 -0.001324115 0.9999992 0 -0.001324115 0.9999903 0 -0.00443042 0.9999978 0 -0.002110732 0.9999999 0 -5.30274e-4 1 0 0 0.9999992 0 -0.001324115 0.9999999 0 -5.30274e-4 1 0 0 0.9999061 0 -0.01371068 0.9999844 0 -0.005603384 0.9999766 0 -0.006836469 0.9999216 0 -0.01252614 0.9999844 0 -0.005603384 0.9999957 0 -0.002946467 0.9999937 0 -0.003562058 0.9999766 0 -0.006836469 0.9999766 0 -0.006836469 0.9999937 0 -0.003562058 0.9999978 0 -0.002110732 0.9999903 0 -0.00443042 0.9999216 0 -0.01252614 0.9999766 0 -0.006836469 0.9999903 0 -0.00443042 0.9999827 0 -0.005907148 1 0 0 1 0 0 0.99994 0 0.01096071 0.999967 0 0.008121109 1 0 0 1 0 0 0.9999709 0 0.007627024 0.99994 0 0.01096071 0.99994 0 0.01096071 0.9999709 0 0.007627024 0.9998034 0 0.01982939 0.9991527 0 0.04115903 0.999967 0 0.008121109 0.99994 0 0.01096071 0.9991527 0 0.04115903 0.99931 0 0.03714307 1 0 0 0.9999312 0 0.01172863 0.9999639 0 0.008498418 1 0 0 0.9999312 0 0.01172863 0.9990166 0 0.0443394 0.9993143 0 0.03702537 0.9999639 0 0.008498418 0.9999639 0 0.008498418 0.9993143 0 0.03702537 0.9998034 0 0.01982939 0.9999709 0 0.007627024 1 0 0 0.9999639 0 0.008498418 0.9999709 0 0.007627024 1 0 0 0.9968737 0 0.07901151 0.9973603 0 0.07261103 0.9977344 0 0.06727734 0.9966205 0 0.08214404 0.9973603 0 0.07261103 0.99931 0 0.03714307 0.9991527 0 0.04115903 0.9977344 0 0.06727734 0.9977344 0 0.06727734 0.9991527 0 0.04115903 0.9998034 0 0.01982939 0.9993143 0 0.03702537 0.9966205 0 0.08214404 0.9977344 0 0.06727734 0.9993143 0 0.03702537 0.9990166 0 0.0443394 1 0 0 1 0 0 0.9999748 0 0.00710058 0.9999424 0 0.01073827 1 0 0 1 0 0 0.9999952 0 0.003105136 0.9999748 0 0.00710058 0.9999748 0 0.00710058 0.9999952 0 0.003105136 0.9997063 0 0.0242375 0.9994183 0 0.03410456 0.9999424 0 0.01073827 0.9999748 0 0.00710058 0.9994183 0 0.03410456 0.9988927 0 0.0470473 1 0 0 0.9999126 0 0.01322239 0.9999745 0 0.00714512 1 0 0 0.9999126 0 0.01322239 0.9987331 0 0.05032138 0.9991917 0 0.04020058 0.9999745 0 0.00714512 0.9999745 0 0.00714512 0.9991917 0 0.04020058 0.9997063 0 0.0242375 0.9999952 0 0.003105136 1 0 0 0.9999745 0 0.00714512 0.9999952 0 0.003105136 1 0 0 0.9873115 0 0.1587955 0.9928343 0 0.1194997 0.9963064 0 0.0858706 0.9962266 0 0.08679088 0.9928343 0 0.1194997 0.9988927 0 0.0470473 0.9994183 0 0.03410456 0.9963064 0 0.0858706 0.9963064 0 0.0858706 0.9994183 0 0.03410456 0.9997063 0 0.0242375 0.9991917 0 0.04020058 0.9962266 0 0.08679088 0.9963064 0 0.0858706 0.9991917 0 0.04020058 0.9987331 0 0.05032138 1 0 0 0.9999424 0 0.01073827 0.9999735 0 0.007276044 0.9999874 0 0.005034203 0.9999424 0 0.01073827 0.9988927 0 0.0470473 0.9993241 0 0.03676098 0.9999735 0 0.007276044 0.9999735 0 0.007276044 0.9993241 0 0.03676098 0.9999183 0 0.01278649 0.9999972 0 0.002369841 0.9999874 0 0.005034203 0.9999735 0 0.007276044 0.9999972 0 0.002369841 0.9997264 0 0.02339222 0.9873115 0 0.1587955 0.9902226 0 0.1394962 0.9967272 0 0.08083902 0.9928343 0 0.1194997 0.9902226 0 0.1394962 0.9985414 0 0.05399392 0.9994966 0 0.03172894 0.9967272 0 0.08083902 0.9967272 0 0.08083902 0.9994966 0 0.03172894 0.9999183 0 0.01278649 0.9993241 0 0.03676098 0.9928343 0 0.1194997 0.9967272 0 0.08083902 0.9993241 0 0.03676098 0.9988927 0 0.0470473 0.9974783 0 0.07097246 0.9967257 0 0.08085791 0.9999181 0 -0.01280435 0.99918 0 -0.04048834 0.9967257 0 0.08085791 0.9997264 0 0.02339222 0.9999972 0 0.002369841 0.9999181 0 -0.01280435 0.9999181 0 -0.01280435 0.9999972 0 0.002369841 0.9999183 0 0.01278649 0.9994966 0 0.03172894 0.99918 0 -0.04048834 0.9999181 0 -0.01280435 0.9994966 0 0.03172894 0.9985414 0 0.05399392 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999992 0 0.00128991 0.9999954 0 0.003065143 1 0 0 1 0 0 0.9999997 0 -8.67846e-4 0.9999992 0 0.00128991 0.9999992 0 0.00128991 0.9999997 0 -8.67846e-4 0.9999996 0 -9.06821e-4 0.9999989 0 0.001556193 0.9999954 0 0.003065143 0.9999992 0 0.00128991 0.9999989 0 0.001556193 0.9999195 0 0.01268964 1 0 0 0.9999996 0 -9.6215e-4 0.9999997 0 8.72913e-4 1 0 0 0.9999996 0 -9.6215e-4 0.9999998 0 -7.28339e-4 0.9999998 0 6.81345e-4 0.9999997 0 8.72913e-4 0.9999997 0 8.72913e-4 0.9999998 0 6.81345e-4 0.9999996 0 -9.06821e-4 0.9999997 0 -8.67846e-4 1 0 0 0.9999997 0 8.72913e-4 0.9999997 0 -8.67846e-4 1 0 0 0.9968737 0 0.07901151 0.9993424 0 0.03625904 0.9999896 0 0.004558283 0.9999906 0 0.004340649 0.9993424 0 0.03625904 0.9999195 0 0.01268964 0.9999989 0 0.001556193 0.9999896 0 0.004558283 0.9999896 0 0.004558283 0.9999989 0 0.001556193 0.9999996 0 -9.06821e-4 0.9999998 0 6.81345e-4 0.9999906 0 0.004340649 0.9999896 0 0.004558283 0.9999998 0 6.81345e-4 0.9999998 0 -7.28339e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.962104 0 -0.272683 0.9946308 0 -0.1034871 0.9933205 0 -0.1153881 0.9886176 0 -0.1504505 0.9946308 0 -0.1034871 0.9989645 0 -0.04549634 0.9983587 0 -0.05726993 0.9933205 0 -0.1153881 0.9933205 0 -0.1153881 0.9983587 0 -0.05726993 0.9994345 0 -0.033627 0.9989488 0 -0.04584014 0.9886176 0 -0.1504505 0.9933205 0 -0.1153881 0.9989488 0 -0.04584014 0.9991859 0 -0.04034364 1 0 0 1 0 0 0.9998738 0 -0.01589239 0.9999576 0 -0.009206074 1 0 0 1 0 0 0.9999763 0 -0.006892396 0.9998738 0 -0.01589239 0.9998738 0 -0.01589239 0.9999763 0 -0.006892396 0.9994345 0 -0.033627 0.9983587 0 -0.05726993 0.9999576 0 -0.009206074 0.9998738 0 -0.01589239 0.9983587 0 -0.05726993 0.9989645 0 -0.04549634 1 0 0 0.9999719 0 -0.00749558 0.9999365 0 -0.01128124 1 0 0 0.9999719 0 -0.00749558 0.9991859 0 -0.04034364 0.9989488 0 -0.04584014 0.9999365 0 -0.01128124 0.9999365 0 -0.01128124 0.9989488 0 -0.04584014 0.9994345 0 -0.033627 0.9999763 0 -0.006892396 1 0 0 0.9999365 0 -0.01128124 0.9999763 0 -0.006892396 1 0 0 1 0 0 1 0 0 0.9999957 0 -0.002941338 0.9999976 0 -0.002197067 1 0 0 1 0 0 0.9999985 0 -0.001749056 0.9999957 0 -0.002941338 0.9999957 0 -0.002941338 0.9999985 0 -0.001749056 0.9999747 0 -0.007122214 0.9999304 0 -0.01179922 0.9999976 0 -0.002197067 0.9999957 0 -0.002941338 0.9999304 0 -0.01179922 0.9999548 0 -0.00951967 1 0 0 0.9999895 0 -0.004578968 0.9999949 0 -0.003227907 1 0 0 0.9999895 0 -0.004578968 0.999836 0 -0.01811307 0.999907 0 -0.01363814 0.9999949 0 -0.003227907 0.9999949 0 -0.003227907 0.999907 0 -0.01363814 0.9999747 0 -0.007122214 0.9999985 0 -0.001749056 1 0 0 0.9999949 0 -0.003227907 0.9999985 0 -0.001749056 1 0 0 0.9989364 0 -0.04610957 0.9998304 0 -0.01842407 0.9997562 0 -0.02208378 0.9991896 0 -0.04025182 0.9998304 0 -0.01842407 0.9999548 0 -0.00951967 0.9999304 0 -0.01179922 0.9997562 0 -0.02208378 0.9997562 0 -0.02208378 0.9999304 0 -0.01179922 0.9999747 0 -0.007122214 0.999907 0 -0.01363814 0.9991896 0 -0.04025182 0.9997562 0 -0.02208378 0.999907 0 -0.01363814 0.999836 0 -0.01811307 1 0 0 1 0 0 0.9999819 0 -0.006021252 0.9999877 0 -0.004981896 1 0 0 1 0 0 0.9999943 0 -0.003399095 0.9999819 0 -0.006021252 0.9999819 0 -0.006021252 0.9999943 0 -0.003399095 0.9998997 0 -0.0141711 0.9996908 0 -0.02486522 0.9999877 0 -0.004981896 0.9999819 0 -0.006021252 0.9996908 0 -0.02486522 0.9997736 0 -0.02128067 1 0 0 0.9999757 0 -0.00697552 0.9999731 0 -0.007346408 1 0 0 0.9999757 0 -0.00697552 0.9993603 0 -0.03576642 0.9996198 0 -0.02757535 0.9999731 0 -0.007346408 0.9999731 0 -0.007346408 0.9996198 0 -0.02757535 0.9998997 0 -0.0141711 0.9999943 0 -0.003399095 1 0 0 0.9999731 0 -0.007346408 0.9999943 0 -0.003399095 1 0 0 0.9953018 0 -0.09682199 0.9985088 0 -0.05459291 0.998888 0 -0.04714721 0.9957828 0 -0.09174301 0.9985088 0 -0.05459291 0.9997736 0 -0.02128067 0.9996908 0 -0.02486522 0.998888 0 -0.04714721 0.998888 0 -0.04714721 0.9996908 0 -0.02486522 0.9998997 0 -0.0141711 0.9996198 0 -0.02757535 0.9957828 0 -0.09174301 0.998888 0 -0.04714721 0.9996198 0 -0.02757535 0.9993603 0 -0.03576642 1 0 0 1 0 0 0.9999975 0 0.002265539 0.9999975 0 0.002276503 1 0 0 1 0 0 0.9999987 0 0.001605564 0.9999975 0 0.002265539 0.9999975 0 0.002265539 0.9999987 0 0.001605564 0.9999792 0 0.006456847 0.9999427 0 0.01070218 0.9999975 0 0.002276503 0.9999975 0 0.002265539 0.9999427 0 0.01070218 0.9999626 0 0.00866426 1 0 0 0.9999912 0 0.004193188 0.9999956 0 0.002947579 1 0 0 0.9999912 0 0.004193188 0.9998703 0 0.01610589 0.9999236 0 0.01236201 0.9999956 0 0.002947579 0.9999956 0 0.002947579 0.9999236 0 0.01236201 0.9999792 0 0.006456847 0.9999987 0 0.001605564 1 0 0 0.9999956 0 0.002947579 0.9999987 0 0.001605564 1 0 0 0.9994895 0 0.03194991 0.9997276 0 0.02334037 0.9997994 0 0.02003259 0.9993858 0 0.03504559 0.9997276 0 0.02334037 0.9999626 0 0.00866426 0.9999427 0 0.01070218 0.9997994 0 0.02003259 0.9997994 0 0.02003259 0.9999427 0 0.01070218 0.9999792 0 0.006456847 0.9999236 0 0.01236201 0.9993858 0 0.03504559 0.9997994 0 0.02003259 0.9999236 0 0.01236201 0.9998703 0 0.01610589 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9950543 0 0.09933328 0.9998684 0 0.0162279 0.9984029 0 0.05649643 0.9954231 0 0.09556612 0.9998684 0 0.0162279 0.9994897 0 -0.03194277 0.9998897 0 -0.01485272 0.9984029 0 0.05649643 0.9984029 0 0.05649643 0.9998897 0 -0.01485272 0.9999958 0 -0.002904823 0.9997111 0 0.02403983 0.9954231 0 0.09556612 0.9984029 0 0.05649643 0.9997111 0 0.02403983 0.9992005 0 0.03998085 0.9868177 0 -0.1618366 0.9952587 0 -0.09726384 0.9968203 0 -0.07968273 0.9975242 0 -0.07032416 0.9952587 0 -0.09726384 0.9995818 0 -0.02892029 0.9997046 0 -0.02430591 0.9968203 0 -0.07968273 0.9968203 0 -0.07968273 0.9997046 0 -0.02430591 0.9999958 0 -0.002904823 0.9998897 0 -0.01485272 0.9975242 0 -0.07032416 0.9968203 0 -0.07968273 0.9998897 0 -0.01485272 0.9994897 0 -0.03194277 1 0 0 0.9999492 0 0.01007959 0.9999998 0 6.80194e-4 0.9999874 0 -0.005021521 0.9999492 0 0.01007959 0.9992005 0 0.03998085 0.9997111 0 0.02403983 0.9999998 0 6.80194e-4 0.9999998 0 6.80194e-4 0.9997111 0 0.02403983 0.9999958 0 -0.002904823 0.9997046 0 -0.02430591 0.9999874 0 -0.005021521 0.9999998 0 6.80194e-4 0.9997046 0 -0.02430591 0.9995818 0 -0.02892029 1 0 0 0.9999961 0 0.002825517 0.9999836 0 0.005736997 0.9999906 0 0.00433684 0.9999961 0 0.002825517 0.9998695 0 0.0161577 0.9998973 0 0.01433656 0.9999836 0 0.005736997 0.9999836 0 0.005736997 0.9998973 0 0.01433656 0.9999405 0 0.01092149 0.9999468 0 0.01031886 0.9999906 0 0.00433684 0.9999836 0 0.005736997 0.9999468 0 0.01031886 0.9996986 0 0.02455297 0.9964746 0 0.08389555 0.9993419 0 0.03627458 0.999092 0 0.04260398 0.9985897 0 0.05309166 0.9993419 0 0.03627458 0.9998953 0 0.01447534 0.9998661 0 0.01636807 0.999092 0 0.04260398 0.999092 0 0.04260398 0.9998661 0 0.01636807 0.9999405 0 0.01092149 0.9998973 0 0.01433656 0.9985897 0 0.05309166 0.999092 0 0.04260398 0.9998973 0 0.01433656 0.9998695 0 0.0161577 0.9950543 0 0.09933328 0.998726 0 0.05046251 0.9999481 0 0.0101919 0.9998546 0 0.01705643 0.998726 0 0.05046251 0.9996986 0 0.02455297 0.9999468 0 0.01031886 0.9999481 0 0.0101919 0.9999481 0 0.0101919 0.9999468 0 0.01031886 0.9999405 0 0.01092149 0.9998661 0 0.01636807 0.9998546 0 0.01705643 0.9999481 0 0.0101919 0.9998661 0 0.01636807 0.9998953 0 0.01447534 0.9950543 0 0.09933328 0.9954231 0 0.09556612 0.9984703 0 0.0552907 0.998726 0 0.05046251 0.9954231 0 0.09556612 0.9992005 0 0.03998085 0.9994078 0 0.03440891 0.9984703 0 0.0552907 0.9984703 0 0.0552907 0.9994078 0 0.03440891 0.9998312 0 0.01837481 0.9995732 0 0.02921424 0.998726 0 0.05046251 0.9984703 0 0.0552907 0.9995732 0 0.02921424 0.9996986 0 0.02455297 1 0 0 1 0 0 0.9999642 0 0.008455954 0.9999492 0 0.01007959 1 0 0 1 0 0 0.9999776 0 0.006698586 0.9999642 0 0.008455954 0.9999642 0 0.008455954 0.9999776 0 0.006698586 0.9998312 0 0.01837481 0.9994078 0 0.03440891 0.9999492 0 0.01007959 0.9999642 0 0.008455954 0.9994078 0 0.03440891 0.9992005 0 0.03998085 1 0 0 0.9999906 0 0.00433684 0.9999643 0 0.008457031 1 0 0 0.9999906 0 0.00433684 0.9996986 0 0.02455297 0.9995732 0 0.02921424 0.9999643 0 0.008457031 0.9999643 0 0.008457031 0.9995732 0 0.02921424 0.9998312 0 0.01837481 0.9999776 0 0.006698586 1 0 0 0.9999643 0 0.008457031 0.9999776 0 0.006698586 1 0 0 1 0 0 1 0 0 0.9999801 0 -0.006323757 0.9999953 0 -0.003064312 1 0 0 1 0 0 0.9999778 0 -0.006668814 0.9999801 0 -0.006323757 0.9999801 0 -0.006323757 0.9999778 0 -0.006668814 0.9997032 0 -0.02436744 0.9996918 0 -0.02482668 0.9999953 0 -0.003064312 0.9999801 0 -0.006323757 0.9996918 0 -0.02482668 0.9999197 0 -0.01268238 1 0 0 0.9999442 0 -0.01057031 0.9999539 0 -0.009601946 1 0 0 0.9999442 0 -0.01057031 0.9991146 0 -0.04207153 0.9992426 0 -0.03891524 0.9999539 0 -0.009601946 0.9999539 0 -0.009601946 0.9992426 0 -0.03891524 0.9997032 0 -0.02436744 0.9999778 0 -0.006668814 1 0 0 0.9999539 0 -0.009601946 0.9999778 0 -0.006668814 1 0 0 0.9968753 0 -0.07899165 0.9993429 0 -0.03624751 0.9990903 0 -0.04264451 0.9970163 0 -0.07719314 0.9993429 0 -0.03624751 0.9999197 0 -0.01268238 0.9996918 0 -0.02482668 0.9990903 0 -0.04264451 0.9990903 0 -0.04264451 0.9996918 0 -0.02482668 0.9997032 0 -0.02436744 0.9992426 0 -0.03891524 0.9970163 0 -0.07719314 0.9990903 0 -0.04264451 0.9992426 0 -0.03891524 0.9991146 0 -0.04207153 1 0 0 0.9999079 0 -0.01357649 0.9998326 0 -0.01830307 0.9999471 0 -0.0102921 0.9999079 0 -0.01357649 0.9988228 0 -0.04850911 0.9986253 0 -0.05241767 0.9998326 0 -0.01830307 0.9998326 0 -0.01830307 0.9986253 0 -0.05241767 0.9981232 0 -0.06123878 0.999173 0 -0.04066202 0.9999471 0 -0.0102921 0.9998326 0 -0.01830307 0.999173 0 -0.04066202 0.9992481 0 -0.03877138 0.9873124 0 -0.1587901 0.9922149 0 -0.1245375 0.9958572 0 -0.09093149 0.9960773 0 -0.08848766 0.9922149 0 -0.1245375 0.9923615 0 -0.1233639 0.9949274 0 -0.1005962 0.9958572 0 -0.09093149 0.9958572 0 -0.09093149 0.9949274 0 -0.1005962 0.9981232 0 -0.06123878 0.9986253 0 -0.05241767 0.9960773 0 -0.08848766 0.9958572 0 -0.09093149 0.9986253 0 -0.05241767 0.9988228 0 -0.04850911 0.9968753 0 -0.07899165 0.997323 0 -0.07312293 0.9974332 0 -0.07160375 0.9971223 0 -0.07580934 0.997323 0 -0.07312293 0.9992481 0 -0.03877138 0.999173 0 -0.04066202 0.9974332 0 -0.07160375 0.9974332 0 -0.07160375 0.999173 0 -0.04066202 0.9981232 0 -0.06123878 0.9949274 0 -0.1005962 0.9971223 0 -0.07580934 0.9974332 0 -0.07160375 0.9949274 0 -0.1005962 0.9923615 0 -0.1233639 1 0 0 0.9999874 0 -0.005021521 0.9999779 0 -0.006655699 0.9999998 0 6.22753e-4 0.9999874 0 -0.005021521 0.9995818 0 -0.02892029 0.9997476 0 -0.02246688 0.9999779 0 -0.006655699 0.9999779 0 -0.006655699 0.9997476 0 -0.02246688 0.9999303 0 -0.01180804 0.9999943 0 -0.003387612 0.9999998 0 6.22753e-4 0.9999779 0 -0.006655699 0.9999943 0 -0.003387612 0.999996 0 0.002853884 0.9868177 0 -0.1618366 0.9953921 0 -0.0958882 0.9987704 0 -0.04957816 0.9952587 0 -0.09726384 0.9953921 0 -0.0958882 0.9991819 0 -0.04044119 0.9997033 0 -0.02435792 0.9987704 0 -0.04957816 0.9987704 0 -0.04957816 0.9997033 0 -0.02435792 0.9999303 0 -0.01180804 0.9997476 0 -0.02246688 0.9952587 0 -0.09726384 0.9987704 0 -0.04957816 0.9997476 0 -0.02246688 0.9995818 0 -0.02892029 0.9999065 0 0.01367634 0.9999845 0 0.005566158 0.9999818 0 -0.006042219 0.9999697 0 -0.007789853 0.9999845 0 0.005566158 0.999996 0 0.002853884 0.9999943 0 -0.003387612 0.9999818 0 -0.006042219 0.9999818 0 -0.006042219 0.9999943 0 -0.003387612 0.9999303 0 -0.01180804 0.9997033 0 -0.02435792 0.9999697 0 -0.007789853 0.9999818 0 -0.006042219 0.9997033 0 -0.02435792 0.9991819 0 -0.04044119 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999691 0 0.00787075 0.999888 0 0.01497322 0.999988 0 -0.004907165 0.9999691 0 0.00787075 0.9989817 0 0.04511987 0.9977585 0 0.06691913 0.999888 0 0.01497322 0.999888 0 0.01497322 0.9977585 0 0.06691913 0.9987723 0 0.04953819 0.9998308 0 -0.01839601 0.999988 0 -0.004907165 0.999888 0 0.01497322 0.9998308 0 -0.01839601 0.9997382 0 -0.02287993 0.9702166 0 0.2422391 0.9655737 0 0.26013 0.9801211 0 0.1983999 0.9946877 0 0.1029391 0.9655737 0 0.26013 0.9998253 0 0.01869373 0.9984111 0 0.05634974 0.9801211 0 0.1983999 0.9801211 0 0.1983999 0.9984111 0 0.05634974 0.9987723 0 0.04953819 0.9977585 0 0.06691913 0.9946877 0 0.1029391 0.9801211 0 0.1983999 0.9977585 0 0.06691913 0.9989817 0 0.04511987 0.9974778 0 -0.07097931 0.9967524 0 -0.08052669 0.9978413 0 -0.06567252 0.9881408 0 -0.1535513 0.9967524 0 -0.08052669 0.9997382 0 -0.02287993 0.9998308 0 -0.01839601 0.9978413 0 -0.06567252 0.9978413 0 -0.06567252 0.9998308 0 -0.01839601 0.9987723 0 0.04953819 0.9984111 0 0.05634974 0.9881408 0 -0.1535513 0.9978413 0 -0.06567252 0.9984111 0 0.05634974 0.9998253 0 0.01869373 0.9974778 0 -0.07097931 0.99918 0 0.04048919 0.9999142 0 0.01310303 0.9967524 0 -0.08052669 0.99918 0 0.04048919 0.9985416 0 -0.05398744 0.9994968 0 -0.03172199 0.9999142 0 0.01310303 0.9999142 0 0.01310303 0.9994968 0 -0.03172199 0.9999215 0 -0.01253205 0.9999985 0 -0.001767452 0.9967524 0 -0.08052669 0.9999142 0 0.01310303 0.9999985 0 -0.001767452 0.9997382 0 -0.02287993 0.9873124 0 -0.1587901 0.9928058 0 -0.1197362 0.9967141 0 -0.08100069 0.9902215 0 -0.1395043 0.9928058 0 -0.1197362 0.998913 0 -0.04661221 0.9993223 0 -0.03680999 0.9967141 0 -0.08100069 0.9967141 0 -0.08100069 0.9993223 0 -0.03680999 0.9999215 0 -0.01253205 0.9994968 0 -0.03172199 0.9902215 0 -0.1395043 0.9967141 0 -0.08100069 0.9994968 0 -0.03172199 0.9985416 0 -0.05398744 1 0 0 0.999988 0 -0.004907165 0.999977 0 -0.006795529 0.9999452 0 -0.0104798 0.999988 0 -0.004907165 0.9997382 0 -0.02287993 0.9999985 0 -0.001767452 0.999977 0 -0.006795529 0.999977 0 -0.006795529 0.9999985 0 -0.001767452 0.9999215 0 -0.01253205 0.9993223 0 -0.03680999 0.9999452 0 -0.0104798 0.999977 0 -0.006795529 0.9993223 0 -0.03680999 0.998913 0 -0.04661221</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape2-texbinormals-array" count="2400" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape2-vertices" name="qt_gauge_background_Shape2-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape2-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape2-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape2-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape2-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="1200">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape2-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape2-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape2-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape2-texbinormals" offset="2" set="0"/>
+ <p>34 34 0 477 477 1 482 482 3 482 482 3 477 477 1 177 177 2 477 477 4 89 89 5 177 177 7 177 177 7 89 89 5 327 327 6 177 177 8 327 327 9 329 329 11 329 329 11 327 327 9 127 39 10 482 482 12 177 177 13 91 91 15 91 91 15 177 177 13 329 329 14 38 38 16 479 479 17 478 478 19 478 478 19 479 479 17 178 178 18 479 479 20 90 90 21 178 178 23 178 178 23 90 90 21 328 328 22 178 178 24 328 328 25 327 327 27 327 327 27 328 328 25 127 39 26 478 478 28 178 178 29 89 89 31 89 89 31 178 178 29 327 327 30 36 36 32 481 481 33 480 480 35 480 480 35 481 481 33 179 179 34 481 481 36 91 91 37 179 179 39 179 179 39 91 91 37 329 329 38 329 329 41 127 39 42 179 179 40 179 179 40 127 39 42 328 328 43 179 179 45 328 328 46 480 480 44 480 480 44 328 328 46 90 90 47 483 483 49 180 180 50 0 0 48 0 0 48 180 180 50 488 488 51 92 92 53 330 330 54 483 483 52 483 483 52 330 330 54 180 180 55 330 330 57 128 40 58 180 180 56 180 180 56 128 40 58 332 332 59 180 180 61 332 332 62 488 488 60 488 488 60 332 332 62 94 94 63 485 485 65 181 181 66 6 6 64 6 6 64 181 181 66 484 484 67 93 93 69 331 331 70 485 485 68 485 485 68 331 331 70 181 181 71 331 331 73 128 40 74 181 181 72 181 181 72 128 40 74 330 330 75 181 181 77 330 330 78 484 484 76 484 484 76 330 330 78 92 92 79 23 23 80 487 487 81 486 486 83 486 486 83 487 487 81 182 182 82 487 487 84 94 94 85 182 182 87 182 182 87 94 94 85 332 332 86 182 182 88 332 332 89 331 331 91 331 331 91 332 332 89 128 40 90 486 486 92 182 182 93 93 93 95 93 93 95 182 182 93 331 331 94 5 5 96 489 489 97 494 494 99 494 494 99 489 489 97 183 183 98 489 489 100 95 95 101 183 183 103 183 183 103 95 95 101 333 333 102 333 333 105 129 41 106 183 183 104 183 183 104 129 41 106 335 335 107 183 183 109 335 335 110 494 494 108 494 494 108 335 335 110 97 97 111 491 491 113 184 184 114 9 9 112 9 9 112 184 184 114 490 490 115 96 96 117 334 334 118 491 491 116 491 491 116 334 334 118 184 184 119 334 334 121 129 41 122 184 184 120 184 184 120 129 41 122 333 333 123 184 184 125 333 333 126 490 490 124 490 490 124 333 333 126 95 95 127 19 19 128 493 493 129 492 492 131 492 492 131 493 493 129 185 185 130 493 493 132 97 97 133 185 185 135 185 185 135 97 97 133 335 335 134 185 185 136 335 335 137 334 334 139 334 334 139 335 335 137 129 41 138 492 492 140 185 185 141 96 96 143 96 96 143 185 185 141 334 334 142 14 14 144 495 495 145 500 500 147 500 500 147 495 495 145 186 186 146 98 98 149 336 336 150 495 495 148 495 495 148 336 336 150 186 186 151 336 336 153 130 42 154 186 186 152 186 186 152 130 42 154 338 338 155 186 186 157 338 338 158 500 500 156 500 500 156 338 338 158 100 100 159 11 11 160 497 497 161 496 496 163 496 496 163 497 497 161 187 187 162 497 497 164 99 99 165 187 187 167 187 187 167 99 99 165 337 337 166 187 187 168 337 337 169 336 336 171 336 336 171 337 337 169 130 42 170 496 496 172 187 187 173 98 98 175 98 98 175 187 187 173 336 336 174 18 18 176 499 499 177 498 498 179 498 498 179 499 499 177 188 188 178 499 499 180 100 100 181 188 188 183 188 188 183 100 100 181 338 338 182 188 188 184 338 338 185 337 337 187 337 337 187 338 338 185 130 42 186 498 498 188 188 188 189 99 99 191 99 99 191 188 188 189 337 337 190 10 10 192 501 501 193 506 506 195 506 506 195 501 501 193 189 189 194 501 501 196 101 101 197 189 189 199 189 189 199 101 101 197 339 339 198 189 189 200 339 339 201 341 341 203 341 341 203 339 339 201 131 43 202 506 506 204 189 189 205 103 103 207 103 103 207 189 189 205 341 341 206 12 12 208 503 503 209 502 502 211 502 502 211 503 503 209 190 190 210 503 503 212 102 102 213 190 190 215 190 190 215 102 102 213 340 340 214 340 340 217 131 43 218 190 190 216 190 190 216 131 43 218 339 339 219 190 190 221 339 339 222 502 502 220 502 502 220 339 339 222 101 101 223 15 15 224 505 505 225 504 504 227 504 504 227 505 505 225 191 191 226 103 103 229 341 341 230 505 505 228 505 505 228 341 341 230 191 191 231 341 341 233 131 43 234 191 191 232 191 191 232 131 43 234 340 340 235 191 191 237 340 340 238 504 504 236 504 504 236 340 340 238 102 102 239 16 16 240 507 507 241 512 512 243 512 512 243 507 507 241 192 192 242 507 507 244 104 104 245 192 192 247 192 192 247 104 104 245 342 342 246 192 192 248 342 342 249 344 344 251 344 344 251 342 342 249 132 44 250 512 512 252 192 192 253 106 106 255 106 106 255 192 192 253 344 344 254 14 14 256 509 509 257 508 508 259 508 508 259 509 509 257 193 193 258 509 509 260 105 105 261 193 193 263 193 193 263 105 105 261 343 343 262 193 193 264 343 343 265 342 342 267 342 342 267 343 343 265 132 44 266 508 508 268 193 193 269 104 104 271 104 104 271 193 193 269 342 342 270 17 17 272 511 511 273 510 510 275 510 510 275 511 511 273 194 194 274 106 106 277 344 344 278 511 511 276 511 511 276 344 344 278 194 194 279 344 344 281 132 44 282 194 194 280 194 194 280 132 44 282 343 343 283 194 194 285 343 343 286 510 510 284 510 510 284 343 343 286 105 105 287 4 4 288 513 513 289 516 516 291 516 516 291 513 513 289 195 195 290 513 513 292 107 107 293 195 195 295 195 195 295 107 107 293 345 345 294 195 195 296 345 345 297 347 347 299 347 347 299 345 345 297 133 45 298 516 516 300 195 195 301 108 108 303 108 108 303 195 195 301 347 347 302 512 512 305 196 196 306 16 16 304 16 16 304 196 196 306 514 514 307 106 106 309 346 346 310 512 512 308 512 512 308 346 346 310 196 196 311 346 346 313 133 45 314 196 196 312 196 196 312 133 45 314 345 345 315 196 196 317 345 345 318 514 514 316 514 514 316 345 345 318 107 107 319 17 17 320 515 515 321 511 511 323 511 511 323 515 515 321 197 197 322 108 108 325 347 347 326 515 515 324 515 515 324 347 347 326 197 197 327 197 197 328 347 347 329 346 346 331 346 346 331 347 347 329 133 45 330 511 511 332 197 197 333 106 106 335 106 106 335 197 197 333 346 346 334 15 15 336 517 517 337 522 522 339 522 522 339 517 517 337 198 198 338 517 517 340 109 109 341 198 198 343 198 198 343 109 109 341 348 348 342 198 198 344 348 348 345 350 350 347 350 350 347 348 348 345 134 46 346 522 522 348 198 198 349 111 111 351 111 111 351 198 198 349 350 350 350 519 519 353 199 199 354 17 17 352 17 17 352 199 199 354 518 518 355 110 110 357 349 349 358 519 519 356 519 519 356 349 349 358 199 199 359 349 349 361 134 46 362 199 199 360 199 199 360 134 46 362 348 348 363 199 199 365 348 348 366 518 518 364 518 518 364 348 348 366 109 109 367 18 18 368 521 521 369 520 520 371 520 520 371 521 521 369 200 200 370 111 111 373 350 350 374 521 521 372 521 521 372 350 350 374 200 200 375 350 350 377 134 46 378 200 200 376 200 200 376 134 46 378 349 349 379 520 520 380 200 200 381 110 110 383 110 110 383 200 200 381 349 349 382 10 10 384 523 523 385 528 528 387 528 528 387 523 523 385 201 201 386 523 523 388 112 112 389 201 201 391 201 201 391 112 112 389 351 351 390 351 351 393 135 47 394 201 201 392 201 201 392 135 47 394 353 353 395 201 201 397 353 353 398 528 528 396 528 528 396 353 353 398 114 114 399 13 13 400 525 525 401 524 524 403 524 524 403 525 525 401 202 202 402 113 113 405 352 352 406 525 525 404 525 525 404 352 352 406 202 202 407 352 352 409 135 47 410 202 202 408 202 202 408 135 47 410 351 351 411 524 524 412 202 202 413 112 112 415 112 112 415 202 202 413 351 351 414 19 19 416 527 527 417 526 526 419 526 526 419 527 527 417 203 203 418 527 527 420 114 114 421 203 203 423 203 203 423 114 114 421 353 353 422 203 203 424 353 353 425 352 352 427 352 352 427 353 353 425 135 47 426 526 526 428 203 203 429 113 113 431 113 113 431 203 203 429 352 352 430 19 19 432 492 492 433 532 532 435 532 532 435 492 492 433 204 204 434 492 492 436 96 96 437 204 204 439 204 204 439 96 96 437 354 354 438 204 204 440 354 354 441 356 356 443 356 356 443 354 354 441 136 48 442 532 532 444 204 204 445 116 116 447 116 116 447 204 204 445 356 356 446 9 9 448 529 529 449 491 491 451 491 491 451 529 529 449 205 205 450 115 115 453 355 355 454 529 529 452 529 529 452 355 355 454 205 205 455 355 355 457 136 48 458 205 205 456 205 205 456 136 48 458 354 354 459 491 491 460 205 205 461 96 96 463 96 96 463 205 205 461 354 354 462 21 21 464 531 531 465 530 530 467 530 530 467 531 531 465 206 206 466 116 116 469 356 356 470 531 531 468 531 531 468 356 356 470 206 206 471 356 356 473 136 48 474 206 206 472 206 206 472 136 48 474 355 355 475 530 530 476 206 206 477 115 115 479 115 115 479 206 206 477 355 355 478 8 8 480 533 533 481 538 538 483 538 538 483 533 533 481 207 207 482 533 533 484 117 117 485 207 207 487 207 207 487 117 117 485 357 357 486 207 207 488 357 357 489 359 359 491 359 359 491 357 357 489 137 49 490 538 538 492 207 207 493 119 119 495 119 119 495 207 207 493 359 359 494 19 19 496 535 535 497 534 534 499 534 534 499 535 535 497 208 208 498 118 118 501 358 358 502 535 535 500 535 535 500 358 358 502 208 208 503 358 358 505 137 49 506 208 208 504 208 208 504 137 49 506 357 357 507 208 208 509 357 357 510 534 534 508 534 534 508 357 357 510 117 117 511 22 22 512 537 537 513 536 536 515 536 536 515 537 537 513 209 209 514 119 119 517 359 359 518 537 537 516 537 537 516 359 359 518 209 209 519 359 359 521 137 49 522 209 209 520 209 209 520 137 49 522 358 358 523 536 536 524 209 209 525 118 118 527 118 118 527 209 209 525 358 358 526 23 23 528 539 539 529 544 544 531 544 544 531 539 539 529 210 210 530 539 539 532 120 120 533 210 210 535 210 210 535 120 120 533 360 360 534 210 210 536 360 360 537 362 362 539 362 362 539 360 360 537 138 50 538 544 544 540 210 210 541 122 122 543 122 122 543 210 210 541 362 362 542 541 541 545 211 211 546 7 7 544 7 7 544 211 211 546 540 540 547 121 121 549 361 361 550 541 541 548 541 541 548 361 361 550 211 211 551 361 361 553 138 50 554 211 211 552 211 211 552 138 50 554 360 360 555 211 211 557 360 360 558 540 540 556 540 540 556 360 360 558 120 120 559 1 1 560 543 543 561 542 542 563 542 542 563 543 543 561 212 212 562 122 122 565 362 362 566 543 543 564 543 543 564 362 362 566 212 212 567 362 362 569 138 50 570 212 212 568 212 212 568 138 50 570 361 361 571 542 542 572 212 212 573 121 121 575 121 121 575 212 212 573 361 361 574 26 26 576 545 545 577 550 550 579 550 550 579 545 545 577 213 213 578 545 545 580 123 123 581 213 213 583 213 213 583 123 123 581 363 363 582 363 363 585 139 51 586 213 213 584 213 213 584 139 51 586 365 365 587 213 213 589 365 365 590 550 550 588 550 550 588 365 365 590 125 125 591 24 24 592 547 547 593 546 546 595 546 546 595 547 547 593 214 214 594 547 547 596 124 124 597 214 214 599 214 214 599 124 124 597 364 364 598 364 364 601 139 51 602 214 214 600 214 214 600 139 51 602 363 363 603 214 214 605 363 363 606 546 546 604 546 546 604 363 363 606 123 123 607 29 29 608 549 549 609 548 548 611 548 548 611 549 549 609 215 215 610 549 549 612 125 125 613 215 215 615 215 215 615 125 125 613 365 365 614 215 215 616 365 365 617 364 364 619 364 364 619 365 365 617 139 51 618 548 548 620 215 215 621 124 124 623 124 124 623 215 215 621 364 364 622 551 551 625 216 216 626 6 6 624 6 6 624 216 216 626 556 556 627 551 551 628 126 126 629 216 216 631 216 216 631 126 126 629 366 366 630 366 366 633 140 52 634 216 216 632 216 216 632 140 52 634 368 368 635 216 216 637 368 368 638 556 556 636 556 556 636 368 368 638 40 128 639 553 553 641 217 217 642 26 26 640 26 26 640 217 217 642 552 552 643 39 127 645 367 367 646 553 553 644 553 553 644 367 367 646 217 217 647 367 367 649 140 52 650 217 217 648 217 217 648 140 52 650 366 366 651 217 217 653 366 366 654 552 552 652 552 552 652 366 366 654 126 126 655 28 28 656 555 555 657 554 554 659 554 554 659 555 555 657 218 218 658 555 555 660 40 128 661 218 218 663 218 218 663 40 128 661 368 368 662 218 218 664 368 368 665 367 367 667 367 367 667 368 368 665 140 52 666 554 554 668 218 218 669 39 127 671 39 127 671 218 218 669 367 367 670 557 557 673 219 219 674 27 27 672 27 27 672 219 219 674 560 560 675 41 129 677 369 369 678 557 557 676 557 557 676 369 369 678 219 219 679 369 369 681 141 53 682 219 219 680 219 219 680 141 53 682 371 371 683 219 219 685 371 371 686 560 560 684 560 560 684 371 371 686 42 130 687 7 7 688 540 540 689 558 558 691 558 558 691 540 540 689 220 220 690 120 120 693 370 370 694 540 540 692 540 540 692 370 370 694 220 220 695 370 370 697 141 53 698 220 220 696 220 220 696 141 53 698 369 369 699 558 558 700 220 220 701 41 129 703 41 129 703 220 220 701 369 369 702 23 23 704 559 559 705 539 539 707 539 539 707 559 559 705 221 221 706 559 559 708 42 130 709 221 221 711 221 221 711 42 130 709 371 371 710 221 221 712 371 371 713 370 370 715 370 370 715 371 371 713 141 53 714 539 539 716 221 221 717 120 120 719 120 120 719 221 221 717 370 370 718 25 25 720 561 561 721 566 566 723 566 566 723 561 561 721 222 222 722 561 561 724 43 131 725 222 222 727 222 222 727 43 131 725 372 372 726 372 372 729 142 54 730 222 222 728 222 222 728 142 54 730 374 374 731 222 222 733 374 374 734 566 566 732 566 566 732 374 374 734 45 133 735 563 563 737 223 223 738 27 27 736 27 27 736 223 223 738 562 562 739 44 132 741 373 373 742 563 563 740 563 563 740 373 373 742 223 223 743 373 373 745 142 54 746 223 223 744 223 223 744 142 54 746 372 372 747 562 562 748 223 223 749 43 131 751 43 131 751 223 223 749 372 372 750 28 28 752 565 565 753 564 564 755 564 564 755 565 565 753 224 224 754 565 565 756 45 133 757 224 224 759 224 224 759 45 133 757 374 374 758 224 224 760 374 374 761 373 373 763 373 373 763 374 374 761 142 54 762 564 564 764 224 224 765 44 132 767 44 132 767 224 224 765 373 373 766 37 37 768 567 567 769 572 572 771 572 572 771 567 567 769 225 225 770 567 567 772 46 134 773 225 225 775 225 225 775 46 134 773 375 375 774 225 225 776 375 375 777 377 377 779 377 377 779 375 375 777 143 55 778 572 572 780 225 225 781 48 136 783 48 136 783 225 225 781 377 377 782 569 569 785 226 226 786 32 32 784 32 32 784 226 226 786 568 568 787 47 135 789 376 376 790 569 569 788 569 569 788 376 376 790 226 226 791 376 376 793 143 55 794 226 226 792 226 226 792 143 55 794 375 375 795 226 226 797 375 375 798 568 568 796 568 568 796 375 375 798 46 134 799 29 29 800 571 571 801 570 570 803 570 570 803 571 571 801 227 227 802 48 136 805 377 377 806 571 571 804 571 571 804 377 377 806 227 227 807 227 227 808 377 377 809 376 376 811 376 376 811 377 377 809 143 55 810 570 570 812 227 227 813 47 135 815 47 135 815 227 227 813 376 376 814 31 31 816 573 573 817 578 578 819 578 578 819 573 573 817 228 228 818 573 573 820 49 137 821 228 228 823 228 228 823 49 137 821 378 378 822 228 228 824 378 378 825 380 380 827 380 380 827 378 378 825 144 56 826 578 578 828 228 228 829 51 139 831 51 139 831 228 228 829 380 380 830 25 25 832 575 575 833 574 574 835 574 574 835 575 575 833 229 229 834 50 138 837 379 379 838 575 575 836 575 575 836 379 379 838 229 229 839 379 379 841 144 56 842 229 229 840 229 229 840 144 56 842 378 378 843 574 574 844 229 229 845 49 137 847 49 137 847 229 229 845 378 378 846 29 29 848 577 577 849 576 576 851 576 576 851 577 577 849 230 230 850 577 577 852 51 139 853 230 230 855 230 230 855 51 139 853 380 380 854 230 230 856 380 380 857 379 379 859 379 379 859 380 380 857 144 56 858 576 576 860 230 230 861 50 138 863 50 138 863 230 230 861 379 379 862 31 31 864 579 579 865 584 584 867 584 584 867 579 579 865 231 231 866 579 579 868 52 140 869 231 231 871 231 231 871 52 140 869 381 381 870 231 231 872 381 381 873 383 383 875 383 383 875 381 381 873 145 57 874 231 231 877 383 383 878 584 584 876 584 584 876 383 383 878 54 142 879 581 581 881 232 232 882 32 32 880 32 32 880 232 232 882 580 580 883 53 141 885 382 382 886 581 581 884 581 581 884 382 382 886 232 232 887 382 382 889 145 57 890 232 232 888 232 232 888 145 57 890 381 381 891 232 232 893 381 381 894 580 580 892 580 580 892 381 381 894 52 140 895 35 35 896 583 583 897 582 582 899 582 582 899 583 583 897 233 233 898 583 583 900 54 142 901 233 233 903 233 233 903 54 142 901 383 383 902 233 233 904 383 383 905 382 382 907 382 382 907 383 383 905 145 57 906 582 582 908 233 233 909 53 141 911 53 141 911 233 233 909 382 382 910 34 34 912 482 482 913 588 588 915 588 588 915 482 482 913 234 234 914 482 482 916 91 91 917 234 234 919 234 234 919 91 91 917 384 384 918 234 234 920 384 384 921 386 386 923 386 386 923 384 384 921 146 58 922 588 588 924 234 234 925 56 144 927 56 144 927 234 234 925 386 386 926 36 36 928 585 585 929 481 481 931 481 481 931 585 585 929 235 235 930 55 143 933 385 385 934 585 585 932 585 585 932 385 385 934 235 235 935 385 385 937 146 58 938 235 235 936 235 235 936 146 58 938 384 384 939 235 235 941 384 384 942 481 481 940 481 481 940 384 384 942 91 91 943 37 37 944 587 587 945 586 586 947 586 586 947 587 587 945 236 236 946 56 144 949 386 386 950 587 587 948 587 587 948 386 386 950 236 236 951 386 386 953 146 58 954 236 236 952 236 236 952 146 58 954 385 385 955 586 586 956 236 236 957 55 143 959 55 143 959 236 236 957 385 385 958 32 32 960 568 568 961 590 590 963 590 590 963 568 568 961 237 237 962 568 568 964 46 134 965 237 237 967 237 237 967 46 134 965 387 387 966 237 237 968 387 387 969 389 389 971 389 389 971 387 387 969 147 59 970 590 590 972 237 237 973 57 145 975 57 145 975 237 237 973 389 389 974 586 586 977 238 238 978 37 37 976 37 37 976 238 238 978 567 567 979 55 143 981 388 388 982 586 586 980 586 586 980 388 388 982 238 238 983 388 388 985 147 59 986 238 238 984 238 238 984 147 59 986 387 387 987 238 238 989 387 387 990 567 567 988 567 567 988 387 387 990 46 134 991 36 36 992 589 589 993 585 585 995 585 585 995 589 589 993 239 239 994 57 145 997 389 389 998 589 589 996 589 589 996 389 389 998 239 239 999 389 389 1001 147 59 1002 239 239 1000 239 239 1000 147 59 1002 388 388 1003 585 585 1004 239 239 1005 55 143 1007 55 143 1007 239 239 1005 388 388 1006 591 591 1009 240 240 1010 33 33 1008 33 33 1008 240 240 1010 596 596 1011 58 146 1013 390 390 1014 591 591 1012 591 591 1012 390 390 1014 240 240 1015 390 390 1017 148 60 1018 240 240 1016 240 240 1016 148 60 1018 392 392 1019 240 240 1021 392 392 1022 596 596 1020 596 596 1020 392 392 1022 60 148 1023 35 35 1024 593 593 1025 592 592 1027 592 592 1027 593 593 1025 241 241 1026 593 593 1028 59 147 1029 241 241 1031 241 241 1031 59 147 1029 391 391 1030 391 391 1033 148 60 1034 241 241 1032 241 241 1032 148 60 1034 390 390 1035 592 592 1036 241 241 1037 58 146 1039 58 146 1039 241 241 1037 390 390 1038 36 36 1040 595 595 1041 594 594 1043 594 594 1043 595 595 1041 242 242 1042 595 595 1044 60 148 1045 242 242 1047 242 242 1047 60 148 1045 392 392 1046 242 242 1048 392 392 1049 391 391 1051 391 391 1051 392 392 1049 148 60 1050 594 594 1052 242 242 1053 59 147 1055 59 147 1055 242 242 1053 391 391 1054 22 22 1056 597 597 1057 602 602 1059 602 602 1059 597 597 1057 243 243 1058 597 597 1060 61 149 1061 243 243 1063 243 243 1063 61 149 1061 393 393 1062 243 243 1064 393 393 1065 395 395 1067 395 395 1067 393 393 1065 149 61 1066 602 602 1068 243 243 1069 63 151 1071 63 151 1071 243 243 1069 395 395 1070 599 599 1073 244 244 1074 21 21 1072 21 21 1072 244 244 1074 598 598 1075 62 150 1077 394 394 1078 599 599 1076 599 599 1076 394 394 1078 244 244 1079 394 394 1081 149 61 1082 244 244 1080 244 244 1080 149 61 1082 393 393 1083 244 244 1085 393 393 1086 598 598 1084 598 598 1084 393 393 1086 61 149 1087 0 0 1088 601 601 1089 600 600 1091 600 600 1091 601 601 1089 245 245 1090 63 151 1093 395 395 1094 601 601 1092 601 601 1092 395 395 1094 245 245 1095 395 395 1097 149 61 1098 245 245 1096 245 245 1096 149 61 1098 394 394 1099 600 600 1100 245 245 1101 62 150 1103 62 150 1103 245 245 1101 394 394 1102 23 23 1104 603 603 1105 487 487 1107 487 487 1107 603 603 1105 246 246 1106 64 152 1109 396 396 1110 603 603 1108 603 603 1108 396 396 1110 246 246 1111 396 396 1113 150 62 1114 246 246 1112 246 246 1112 150 62 1114 398 398 1115 246 246 1117 398 398 1118 487 487 1116 487 487 1116 398 398 1118 94 94 1119 22 22 1120 602 602 1121 604 604 1123 604 604 1123 602 602 1121 247 247 1122 63 151 1125 397 397 1126 602 602 1124 602 602 1124 397 397 1126 247 247 1127 397 397 1129 150 62 1130 247 247 1128 247 247 1128 150 62 1130 396 396 1131 604 604 1132 247 247 1133 64 152 1135 64 152 1135 247 247 1133 396 396 1134 0 0 1136 488 488 1137 601 601 1139 601 601 1139 488 488 1137 248 248 1138 488 488 1140 94 94 1141 248 248 1143 248 248 1143 94 94 1141 398 398 1142 248 248 1144 398 398 1145 397 397 1147 397 397 1147 398 398 1145 150 62 1146 601 601 1148 248 248 1149 63 151 1151 63 151 1151 248 248 1149 397 397 1150 18 18 1152 498 498 1153 608 608 1155 608 608 1155 498 498 1153 249 249 1154 498 498 1156 99 99 1157 249 249 1159 249 249 1159 99 99 1157 399 399 1158 249 249 1160 399 399 1161 401 401 1163 401 401 1163 399 399 1161 151 63 1162 608 608 1164 249 249 1165 66 154 1167 66 154 1167 249 249 1165 401 401 1166 605 605 1169 250 250 1170 11 11 1168 11 11 1168 250 250 1170 497 497 1171 65 153 1173 400 400 1174 605 605 1172 605 605 1172 400 400 1174 250 250 1175 400 400 1177 151 63 1178 250 250 1176 250 250 1176 151 63 1178 399 399 1179 250 250 1181 399 399 1182 497 497 1180 497 497 1180 399 399 1182 99 99 1183 607 607 1185 251 251 1186 5 5 1184 5 5 1184 251 251 1186 606 606 1187 66 154 1189 401 401 1190 607 607 1188 607 607 1188 401 401 1190 251 251 1191 401 401 1193 151 63 1194 251 251 1192 251 251 1192 151 63 1194 400 400 1195 251 251 1197 400 400 1198 606 606 1196 606 606 1196 400 400 1198 65 153 1199 19 19 1200 526 526 1201 612 612 1203 612 612 1203 526 526 1201 252 252 1202 526 526 1204 113 113 1205 252 252 1207 252 252 1207 113 113 1205 402 402 1206 402 402 1209 152 64 1210 252 252 1208 252 252 1208 152 64 1210 404 404 1211 252 252 1213 404 404 1214 612 612 1212 612 612 1212 404 404 1214 68 156 1215 13 13 1216 609 609 1217 525 525 1219 525 525 1219 609 609 1217 253 253 1218 67 155 1221 403 403 1222 609 609 1220 609 609 1220 403 403 1222 253 253 1223 403 403 1225 152 64 1226 253 253 1224 253 253 1224 152 64 1226 402 402 1227 525 525 1228 253 253 1229 113 113 1231 113 113 1231 253 253 1229 402 402 1230 18 18 1232 611 611 1233 610 610 1235 610 610 1235 611 611 1233 254 254 1234 611 611 1236 68 156 1237 254 254 1239 254 254 1239 68 156 1237 404 404 1238 254 254 1240 404 404 1241 403 403 1243 403 403 1243 404 404 1241 152 64 1242 610 610 1244 254 254 1245 67 155 1247 67 155 1247 254 254 1245 403 403 1246 19 19 1248 612 612 1249 493 493 1251 493 493 1251 612 612 1249 255 255 1250 612 612 1252 68 156 1253 255 255 1255 255 255 1255 68 156 1253 405 405 1254 255 255 1256 405 405 1257 407 407 1259 407 407 1259 405 405 1257 153 65 1258 493 493 1260 255 255 1261 97 97 1263 97 97 1263 255 255 1261 407 407 1262 608 608 1265 256 256 1266 18 18 1264 18 18 1264 256 256 1266 611 611 1267 66 154 1269 406 406 1270 608 608 1268 608 608 1268 406 406 1270 256 256 1271 406 406 1273 153 65 1274 256 256 1272 256 256 1272 153 65 1274 405 405 1275 256 256 1277 405 405 1278 611 611 1276 611 611 1276 405 405 1278 68 156 1279 5 5 1280 494 494 1281 607 607 1283 607 607 1283 494 494 1281 257 257 1282 494 494 1284 97 97 1285 257 257 1287 257 257 1287 97 97 1285 407 407 1286 257 257 1288 407 407 1289 406 406 1291 406 406 1291 407 407 1289 153 65 1290 607 607 1292 257 257 1293 66 154 1295 66 154 1295 257 257 1293 406 406 1294 18 18 1296 520 520 1297 499 499 1299 499 499 1299 520 520 1297 258 258 1298 110 110 1301 408 408 1302 520 520 1300 520 520 1300 408 408 1302 258 258 1303 408 408 1305 154 66 1306 258 258 1304 258 258 1304 154 66 1306 410 410 1307 258 258 1309 410 410 1310 499 499 1308 499 499 1308 410 410 1310 100 100 1311 17 17 1312 510 510 1313 519 519 1315 519 519 1315 510 510 1313 259 259 1314 510 510 1316 105 105 1317 259 259 1319 259 259 1319 105 105 1317 409 409 1318 409 409 1321 154 66 1322 259 259 1320 259 259 1320 154 66 1322 408 408 1323 519 519 1324 259 259 1325 110 110 1327 110 110 1327 259 259 1325 408 408 1326 14 14 1328 500 500 1329 509 509 1331 509 509 1331 500 500 1329 260 260 1330 500 500 1332 100 100 1333 260 260 1335 260 260 1335 100 100 1333 410 410 1334 260 260 1336 410 410 1337 409 409 1339 409 409 1339 410 410 1337 154 66 1338 509 509 1340 260 260 1341 105 105 1343 105 105 1343 260 260 1341 409 409 1342 15 15 1344 613 613 1345 505 505 1347 505 505 1347 613 613 1345 261 261 1346 613 613 1348 69 157 1349 261 261 1351 261 261 1351 69 157 1349 411 411 1350 261 261 1352 411 411 1353 413 413 1355 413 413 1355 411 411 1353 155 67 1354 505 505 1356 261 261 1357 103 103 1359 103 103 1359 261 261 1357 413 413 1358 524 524 1361 262 262 1362 13 13 1360 13 13 1360 262 262 1362 614 614 1363 112 112 1365 412 412 1366 524 524 1364 524 524 1364 412 412 1366 262 262 1367 412 412 1369 155 67 1370 262 262 1368 262 262 1368 155 67 1370 411 411 1371 262 262 1373 411 411 1374 614 614 1372 614 614 1372 411 411 1374 69 157 1375 10 10 1376 506 506 1377 523 523 1379 523 523 1379 506 506 1377 263 263 1378 103 103 1381 413 413 1382 506 506 1380 506 506 1380 413 413 1382 263 263 1383 263 263 1384 413 413 1385 412 412 1387 412 412 1387 413 413 1385 155 67 1386 523 523 1388 263 263 1389 112 112 1391 112 112 1391 263 263 1389 412 412 1390 17 17 1392 518 518 1393 616 616 1395 616 616 1395 518 518 1393 264 264 1394 518 518 1396 109 109 1397 264 264 1399 264 264 1399 109 109 1397 414 414 1398 264 264 1400 414 414 1401 416 416 1403 416 416 1403 414 414 1401 156 68 1402 616 616 1404 264 264 1405 70 158 1407 70 158 1407 264 264 1405 416 416 1406 504 504 1409 265 265 1410 15 15 1408 15 15 1408 265 265 1410 517 517 1411 102 102 1413 415 415 1414 504 504 1412 504 504 1412 415 415 1414 265 265 1415 415 415 1417 156 68 1418 265 265 1416 265 265 1416 156 68 1418 414 414 1419 265 265 1421 414 414 1422 517 517 1420 517 517 1420 414 414 1422 109 109 1423 615 615 1425 266 266 1426 12 12 1424 12 12 1424 266 266 1426 503 503 1427 70 158 1429 416 416 1430 615 615 1428 615 615 1428 416 416 1430 266 266 1431 416 416 1433 156 68 1434 266 266 1432 266 266 1432 156 68 1434 415 415 1435 266 266 1437 415 415 1438 503 503 1436 503 503 1436 415 415 1438 102 102 1439 17 17 1440 616 616 1441 515 515 1443 515 515 1443 616 616 1441 267 267 1442 70 158 1445 417 417 1446 616 616 1444 616 616 1444 417 417 1446 267 267 1447 267 267 1448 417 417 1449 419 419 1451 419 419 1451 417 417 1449 157 69 1450 515 515 1452 267 267 1453 108 108 1455 108 108 1455 267 267 1453 419 419 1454 12 12 1456 617 617 1457 615 615 1459 615 615 1459 617 617 1457 268 268 1458 617 617 1460 71 159 1461 268 268 1463 268 268 1463 71 159 1461 418 418 1462 268 268 1464 418 418 1465 417 417 1467 417 417 1467 418 418 1465 157 69 1466 615 615 1468 268 268 1469 70 158 1471 70 158 1471 268 268 1469 417 417 1470 516 516 1473 269 269 1474 4 4 1472 4 4 1472 269 269 1474 618 618 1475 108 108 1477 419 419 1478 516 516 1476 516 516 1476 419 419 1478 269 269 1479 419 419 1481 157 69 1482 269 269 1480 269 269 1480 157 69 1482 418 418 1483 269 269 1485 418 418 1486 618 618 1484 618 618 1484 418 418 1486 71 159 1487 18 18 1488 610 610 1489 521 521 1491 521 521 1491 610 610 1489 270 270 1490 610 610 1492 67 155 1493 270 270 1495 270 270 1495 67 155 1493 420 420 1494 270 270 1496 420 420 1497 422 422 1499 422 422 1499 420 420 1497 158 70 1498 521 521 1500 270 270 1501 111 111 1503 111 111 1503 270 270 1501 422 422 1502 614 614 1505 271 271 1506 13 13 1504 13 13 1504 271 271 1506 609 609 1507 614 614 1508 69 157 1509 271 271 1511 271 271 1511 69 157 1509 421 421 1510 421 421 1513 158 70 1514 271 271 1512 271 271 1512 158 70 1514 420 420 1515 271 271 1517 420 420 1518 609 609 1516 609 609 1516 420 420 1518 67 155 1519 522 522 1521 272 272 1522 15 15 1520 15 15 1520 272 272 1522 613 613 1523 111 111 1525 422 422 1526 522 522 1524 522 522 1524 422 422 1526 272 272 1527 422 422 1529 158 70 1530 272 272 1528 272 272 1528 158 70 1530 421 421 1531 272 272 1533 421 421 1534 613 613 1532 613 613 1532 421 421 1534 69 157 1535 19 19 1536 534 534 1537 527 527 1539 527 527 1539 534 534 1537 273 273 1538 534 534 1540 117 117 1541 273 273 1543 273 273 1543 117 117 1541 423 423 1542 273 273 1544 423 423 1545 425 425 1547 425 425 1547 423 423 1545 159 71 1546 527 527 1548 273 273 1549 114 114 1551 114 114 1551 273 273 1549 425 425 1550 8 8 1552 619 619 1553 533 533 1555 533 533 1555 619 619 1553 274 274 1554 619 619 1556 72 160 1557 274 274 1559 274 274 1559 72 160 1557 424 424 1558 424 424 1561 159 71 1562 274 274 1560 274 274 1560 159 71 1562 423 423 1563 274 274 1565 423 423 1566 533 533 1564 533 533 1564 423 423 1566 117 117 1567 10 10 1568 528 528 1569 620 620 1571 620 620 1571 528 528 1569 275 275 1570 528 528 1572 114 114 1573 275 275 1575 275 275 1575 114 114 1573 425 425 1574 275 275 1576 425 425 1577 424 424 1579 424 424 1579 425 425 1577 159 71 1578 620 620 1580 275 275 1581 72 160 1583 72 160 1583 275 275 1581 424 424 1582 21 21 1584 598 598 1585 531 531 1587 531 531 1587 598 598 1585 276 276 1586 598 598 1588 61 149 1589 276 276 1591 276 276 1591 61 149 1589 426 426 1590 276 276 1592 426 426 1593 428 428 1595 428 428 1595 426 426 1593 160 72 1594 531 531 1596 276 276 1597 116 116 1599 116 116 1599 276 276 1597 428 428 1598 536 536 1601 277 277 1602 22 22 1600 22 22 1600 277 277 1602 597 597 1603 118 118 1605 427 427 1606 536 536 1604 536 536 1604 427 427 1606 277 277 1607 427 427 1609 160 72 1610 277 277 1608 277 277 1608 160 72 1610 426 426 1611 277 277 1613 426 426 1614 597 597 1612 597 597 1612 426 426 1614 61 149 1615 19 19 1616 532 532 1617 535 535 1619 535 535 1619 532 532 1617 278 278 1618 116 116 1621 428 428 1622 532 532 1620 532 532 1620 428 428 1622 278 278 1623 428 428 1625 160 72 1626 278 278 1624 278 278 1624 160 72 1626 427 427 1627 535 535 1628 278 278 1629 118 118 1631 118 118 1631 278 278 1629 427 427 1630 22 22 1632 621 621 1633 537 537 1635 537 537 1635 621 621 1633 279 279 1634 621 621 1636 73 161 1637 279 279 1639 279 279 1639 73 161 1637 429 429 1638 279 279 1640 429 429 1641 431 431 1643 431 431 1643 429 429 1641 161 73 1642 537 537 1644 279 279 1645 119 119 1647 119 119 1647 279 279 1645 431 431 1646 623 623 1649 280 280 1650 20 20 1648 20 20 1648 280 280 1650 622 622 1651 74 162 1653 430 430 1654 623 623 1652 623 623 1652 430 430 1654 280 280 1655 430 430 1657 161 73 1658 280 280 1656 280 280 1656 161 73 1658 429 429 1659 280 280 1661 429 429 1662 622 622 1660 622 622 1660 429 429 1662 73 161 1663 8 8 1664 538 538 1665 624 624 1667 624 624 1667 538 538 1665 281 281 1666 119 119 1669 431 431 1670 538 538 1668 538 538 1668 431 431 1670 281 281 1671 431 431 1673 161 73 1674 281 281 1672 281 281 1672 161 73 1674 430 430 1675 624 624 1676 281 281 1677 74 162 1679 74 162 1679 281 281 1677 430 430 1678 20 20 1680 622 622 1681 626 626 1683 626 626 1683 622 622 1681 282 282 1682 622 622 1684 73 161 1685 282 282 1687 282 282 1687 73 161 1685 432 432 1686 282 282 1688 432 432 1689 434 434 1691 434 434 1691 432 432 1689 162 74 1690 626 626 1692 282 282 1693 75 163 1695 75 163 1695 282 282 1693 434 434 1694 604 604 1697 283 283 1698 22 22 1696 22 22 1696 283 283 1698 621 621 1699 64 152 1701 433 433 1702 604 604 1700 604 604 1700 433 433 1702 283 283 1703 433 433 1705 162 74 1706 283 283 1704 283 283 1704 162 74 1706 432 432 1707 283 283 1709 432 432 1710 621 621 1708 621 621 1708 432 432 1710 73 161 1711 23 23 1712 625 625 1713 603 603 1715 603 603 1715 625 625 1713 284 284 1714 75 163 1717 434 434 1718 625 625 1716 625 625 1716 434 434 1718 284 284 1719 434 434 1721 162 74 1722 284 284 1720 284 284 1720 162 74 1722 433 433 1723 603 603 1724 284 284 1725 64 152 1727 64 152 1727 284 284 1725 433 433 1726 627 627 1729 285 285 1730 1 1 1728 1 1 1728 285 285 1730 543 543 1731 76 164 1733 435 435 1734 627 627 1732 627 627 1732 435 435 1734 285 285 1735 435 435 1737 163 75 1738 285 285 1736 285 285 1736 163 75 1738 437 437 1739 285 285 1741 437 437 1742 543 543 1740 543 543 1740 437 437 1742 122 122 1743 20 20 1744 626 626 1745 628 628 1747 628 628 1747 626 626 1745 286 286 1746 75 163 1749 436 436 1750 626 626 1748 626 626 1748 436 436 1750 286 286 1751 436 436 1753 163 75 1754 286 286 1752 286 286 1752 163 75 1754 435 435 1755 628 628 1756 286 286 1757 76 164 1759 76 164 1759 286 286 1757 435 435 1758 23 23 1760 544 544 1761 625 625 1763 625 625 1763 544 544 1761 287 287 1762 544 544 1764 122 122 1765 287 287 1767 287 287 1767 122 122 1765 437 437 1766 287 287 1768 437 437 1769 436 436 1771 436 436 1771 437 437 1769 163 75 1770 625 625 1772 287 287 1773 75 163 1775 75 163 1775 287 287 1773 436 436 1774 29 29 1776 629 629 1777 549 549 1779 549 549 1779 629 629 1777 288 288 1778 629 629 1780 77 165 1781 288 288 1783 288 288 1783 77 165 1781 438 438 1782 438 438 1785 164 76 1786 288 288 1784 288 288 1784 164 76 1786 440 440 1787 288 288 1789 440 440 1790 549 549 1788 549 549 1788 440 440 1790 125 125 1791 554 554 1793 289 289 1794 28 28 1792 28 28 1792 289 289 1794 630 630 1795 39 127 1797 439 439 1798 554 554 1796 554 554 1796 439 439 1798 289 289 1799 439 439 1801 164 76 1802 289 289 1800 289 289 1800 164 76 1802 438 438 1803 289 289 1805 438 438 1806 630 630 1804 630 630 1804 438 438 1806 77 165 1807 26 26 1808 550 550 1809 553 553 1811 553 553 1811 550 550 1809 290 290 1810 550 550 1812 125 125 1813 290 290 1815 290 290 1815 125 125 1813 440 440 1814 290 290 1816 440 440 1817 439 439 1819 439 439 1819 440 440 1817 164 76 1818 553 553 1820 290 290 1821 39 127 1823 39 127 1823 290 290 1821 439 439 1822 28 28 1824 631 631 1825 555 555 1827 555 555 1827 631 631 1825 291 291 1826 631 631 1828 78 166 1829 291 291 1831 291 291 1831 78 166 1829 441 441 1830 441 441 1833 165 77 1834 291 291 1832 291 291 1832 165 77 1834 443 443 1835 291 291 1837 443 443 1838 555 555 1836 555 555 1836 443 443 1838 40 128 1839 23 23 1840 486 486 1841 632 632 1843 632 632 1843 486 486 1841 292 292 1842 93 93 1845 442 442 1846 486 486 1844 486 486 1844 442 442 1846 292 292 1847 442 442 1849 165 77 1850 292 292 1848 292 292 1848 165 77 1850 441 441 1851 292 292 1853 441 441 1854 632 632 1852 632 632 1852 441 441 1854 78 166 1855 6 6 1856 556 556 1857 485 485 1859 485 485 1859 556 556 1857 293 293 1858 556 556 1860 40 128 1861 293 293 1863 293 293 1863 40 128 1861 443 443 1862 293 293 1864 443 443 1865 442 442 1867 442 442 1867 443 443 1865 165 77 1866 485 485 1868 293 293 1869 93 93 1871 93 93 1871 293 293 1869 442 442 1870 632 632 1873 294 294 1874 23 23 1872 23 23 1872 294 294 1874 559 559 1875 632 632 1876 78 166 1877 294 294 1879 294 294 1879 78 166 1877 444 444 1878 444 444 1881 166 78 1882 294 294 1880 294 294 1880 166 78 1882 446 446 1883 294 294 1885 446 446 1886 559 559 1884 559 559 1884 446 446 1886 42 130 1887 564 564 1889 295 295 1890 28 28 1888 28 28 1888 295 295 1890 631 631 1891 44 132 1893 445 445 1894 564 564 1892 564 564 1892 445 445 1894 295 295 1895 445 445 1897 166 78 1898 295 295 1896 295 295 1896 166 78 1898 444 444 1899 295 295 1901 444 444 1902 631 631 1900 631 631 1900 444 444 1902 78 166 1903 27 27 1904 560 560 1905 563 563 1907 563 563 1907 560 560 1905 296 296 1906 560 560 1908 42 130 1909 296 296 1911 296 296 1911 42 130 1909 446 446 1910 296 296 1912 446 446 1913 445 445 1915 445 445 1915 446 446 1913 166 78 1914 563 563 1916 296 296 1917 44 132 1919 44 132 1919 296 296 1917 445 445 1918 28 28 1920 630 630 1921 565 565 1923 565 565 1923 630 630 1921 297 297 1922 630 630 1924 77 165 1925 297 297 1927 297 297 1927 77 165 1925 447 447 1926 447 447 1929 167 79 1930 297 297 1928 297 297 1928 167 79 1930 449 449 1931 297 297 1933 449 449 1934 565 565 1932 565 565 1932 449 449 1934 45 133 1935 29 29 1936 576 576 1937 629 629 1939 629 629 1939 576 576 1937 298 298 1938 50 138 1941 448 448 1942 576 576 1940 576 576 1940 448 448 1942 298 298 1943 448 448 1945 167 79 1946 298 298 1944 298 298 1944 167 79 1946 447 447 1947 298 298 1949 447 447 1950 629 629 1948 629 629 1948 447 447 1950 77 165 1951 25 25 1952 566 566 1953 575 575 1955 575 575 1955 566 566 1953 299 299 1954 566 566 1956 45 133 1957 299 299 1959 299 299 1959 45 133 1957 449 449 1958 299 299 1960 449 449 1961 448 448 1963 448 448 1963 449 449 1961 167 79 1962 575 575 1964 299 299 1965 50 138 1967 50 138 1967 299 299 1965 448 448 1966 633 633 1969 300 300 1970 2 2 1968 2 2 1968 300 300 1970 638 638 1971 79 167 1973 450 450 1974 633 633 1972 633 633 1972 450 450 1974 300 300 1975 450 450 1977 168 80 1978 300 300 1976 300 300 1976 168 80 1978 452 452 1979 300 300 1981 452 452 1982 638 638 1980 638 638 1980 452 452 1982 81 169 1983 635 635 1985 301 301 1986 30 30 1984 30 30 1984 301 301 1986 634 634 1987 80 168 1989 451 451 1990 635 635 1988 635 635 1988 451 451 1990 301 301 1991 451 451 1993 168 80 1994 301 301 1992 301 301 1992 168 80 1994 450 450 1995 301 301 1997 450 450 1998 634 634 1996 634 634 1996 450 450 1998 79 167 1999 37 37 2000 637 637 2001 636 636 2003 636 636 2003 637 637 2001 302 302 2002 637 637 2004 81 169 2005 302 302 2007 302 302 2007 81 169 2005 452 452 2006 302 302 2008 452 452 2009 451 451 2011 451 451 2011 452 452 2009 168 80 2010 636 636 2012 302 302 2013 80 168 2015 80 168 2015 302 302 2013 451 451 2014 29 29 2016 548 548 2017 642 642 2019 642 642 2019 548 548 2017 303 303 2018 548 548 2020 124 124 2021 303 303 2023 303 303 2023 124 124 2021 453 453 2022 303 303 2024 453 453 2025 455 455 2027 455 455 2027 453 453 2025 169 81 2026 642 642 2028 303 303 2029 83 171 2031 83 171 2031 303 303 2029 455 455 2030 639 639 2033 304 304 2034 24 24 2032 24 24 2032 304 304 2034 547 547 2035 82 170 2037 454 454 2038 639 639 2036 639 639 2036 454 454 2038 304 304 2039 454 454 2041 169 81 2042 304 304 2040 304 304 2040 169 81 2042 453 453 2043 304 304 2045 453 453 2046 547 547 2044 547 547 2044 453 453 2046 124 124 2047 2 2 2048 641 641 2049 640 640 2051 640 640 2051 641 641 2049 305 305 2050 83 171 2053 455 455 2054 641 641 2052 641 641 2052 455 455 2054 305 305 2055 455 455 2057 169 81 2058 305 305 2056 305 305 2056 169 81 2058 454 454 2059 640 640 2060 305 305 2061 82 170 2063 82 170 2063 305 305 2061 454 454 2062 2 2 2064 638 638 2065 641 641 2067 641 641 2067 638 638 2065 306 306 2066 638 638 2068 81 169 2069 306 306 2071 306 306 2071 81 169 2069 456 456 2070 306 306 2072 456 456 2073 458 458 2075 458 458 2075 456 456 2073 170 82 2074 641 641 2076 306 306 2077 83 171 2079 83 171 2079 306 306 2077 458 458 2078 572 572 2081 307 307 2082 37 37 2080 37 37 2080 307 307 2082 637 637 2083 48 136 2085 457 457 2086 572 572 2084 572 572 2084 457 457 2086 307 307 2087 457 457 2089 170 82 2090 307 307 2088 307 307 2088 170 82 2090 456 456 2091 307 307 2093 456 456 2094 637 637 2092 637 637 2092 456 456 2094 81 169 2095 29 29 2096 642 642 2097 571 571 2099 571 571 2099 642 642 2097 308 308 2098 642 642 2100 83 171 2101 308 308 2103 308 308 2103 83 171 2101 458 458 2102 308 308 2104 458 458 2105 457 457 2107 457 457 2107 458 458 2105 170 82 2106 571 571 2108 308 308 2109 48 136 2111 48 136 2111 308 308 2109 457 457 2110 29 29 2112 570 570 2113 577 577 2115 577 577 2115 570 570 2113 309 309 2114 570 570 2116 47 135 2117 309 309 2119 309 309 2119 47 135 2117 459 459 2118 309 309 2120 459 459 2121 461 461 2123 461 461 2123 459 459 2121 171 83 2122 577 577 2124 309 309 2125 51 139 2127 51 139 2127 309 309 2125 461 461 2126 32 32 2128 580 580 2129 569 569 2131 569 569 2131 580 580 2129 310 310 2130 580 580 2132 52 140 2133 310 310 2135 310 310 2135 52 140 2133 460 460 2134 460 460 2137 171 83 2138 310 310 2136 310 310 2136 171 83 2138 459 459 2139 569 569 2140 310 310 2141 47 135 2143 47 135 2143 310 310 2141 459 459 2142 31 31 2144 578 578 2145 579 579 2147 579 579 2147 578 578 2145 311 311 2146 51 139 2149 461 461 2150 578 578 2148 578 578 2148 461 461 2150 311 311 2151 461 461 2153 171 83 2154 311 311 2152 311 311 2152 171 83 2154 460 460 2155 311 311 2157 460 460 2158 579 579 2156 579 579 2156 460 460 2158 52 140 2159 592 592 2161 312 312 2162 35 35 2160 35 35 2160 312 312 2162 583 583 2163 58 146 2165 462 462 2166 592 592 2164 592 592 2164 462 462 2166 312 312 2167 462 462 2169 172 84 2170 312 312 2168 312 312 2168 172 84 2170 464 464 2171 312 312 2173 464 464 2174 583 583 2172 583 583 2172 464 464 2174 54 142 2175 33 33 2176 643 643 2177 591 591 2179 591 591 2179 643 643 2177 313 313 2178 84 172 2181 463 463 2182 643 643 2180 643 643 2180 463 463 2182 313 313 2183 463 463 2185 172 84 2186 313 313 2184 313 313 2184 172 84 2186 462 462 2187 591 591 2188 313 313 2189 58 146 2191 58 146 2191 313 313 2189 462 462 2190 31 31 2192 584 584 2193 644 644 2195 644 644 2195 584 584 2193 314 314 2194 584 584 2196 54 142 2197 314 314 2199 314 314 2199 54 142 2197 464 464 2198 314 314 2200 464 464 2201 463 463 2203 463 463 2203 464 464 2201 172 84 2202 644 644 2204 314 314 2205 84 172 2207 84 172 2207 314 314 2205 463 463 2206 37 37 2208 636 636 2209 587 587 2211 587 587 2211 636 636 2209 315 315 2210 636 636 2212 80 168 2213 315 315 2215 315 315 2215 80 168 2213 465 465 2214 315 315 2216 465 465 2217 467 467 2219 467 467 2219 465 465 2217 173 85 2218 587 587 2220 315 315 2221 56 144 2223 56 144 2223 315 315 2221 467 467 2222 30 30 2224 645 645 2225 635 635 2227 635 635 2227 645 645 2225 316 316 2226 645 645 2228 85 173 2229 316 316 2231 316 316 2231 85 173 2229 466 466 2230 316 316 2232 466 466 2233 465 465 2235 465 465 2235 466 466 2233 173 85 2234 635 635 2236 316 316 2237 80 168 2239 80 168 2239 316 316 2237 465 465 2238 34 34 2240 588 588 2241 646 646 2243 646 646 2243 588 588 2241 317 317 2242 56 144 2245 467 467 2246 588 588 2244 588 588 2244 467 467 2246 317 317 2247 467 467 2249 173 85 2250 317 317 2248 317 317 2248 173 85 2250 466 466 2251 317 317 2253 466 466 2254 646 646 2252 646 646 2252 466 466 2254 85 173 2255 36 36 2256 594 594 2257 589 589 2259 589 589 2259 594 594 2257 318 318 2258 594 594 2260 59 147 2261 318 318 2263 318 318 2263 59 147 2261 468 468 2262 318 318 2264 468 468 2265 470 470 2267 470 470 2267 468 468 2265 174 86 2266 589 589 2268 318 318 2269 57 145 2271 57 145 2271 318 318 2269 470 470 2270 582 582 2273 319 319 2274 35 35 2272 35 35 2272 319 319 2274 593 593 2275 53 141 2277 469 469 2278 582 582 2276 582 582 2276 469 469 2278 319 319 2279 469 469 2281 174 86 2282 319 319 2280 319 319 2280 174 86 2282 468 468 2283 319 319 2285 468 468 2286 593 593 2284 593 593 2284 468 468 2286 59 147 2287 32 32 2288 590 590 2289 581 581 2291 581 581 2291 590 590 2289 320 320 2290 57 145 2293 470 470 2294 590 590 2292 590 590 2292 470 470 2294 320 320 2295 470 470 2297 174 86 2298 320 320 2296 320 320 2296 174 86 2298 469 469 2299 581 581 2300 320 320 2301 53 141 2303 53 141 2303 320 320 2301 469 469 2302 36 36 2304 480 480 2305 650 650 2307 650 650 2307 480 480 2305 321 321 2306 480 480 2308 90 90 2309 321 321 2311 321 321 2311 90 90 2309 471 471 2310 321 321 2312 471 471 2313 473 473 2315 473 473 2315 471 471 2313 175 87 2314 321 321 2317 473 473 2318 650 650 2316 650 650 2316 473 473 2318 87 175 2319 647 647 2321 322 322 2322 38 38 2320 38 38 2320 322 322 2322 479 479 2323 86 174 2325 472 472 2326 647 647 2324 647 647 2324 472 472 2326 322 322 2327 472 472 2329 175 87 2330 322 322 2328 322 322 2328 175 87 2330 471 471 2331 322 322 2333 471 471 2334 479 479 2332 479 479 2332 471 471 2334 90 90 2335 3 3 2336 649 649 2337 648 648 2339 648 648 2339 649 649 2337 323 323 2338 649 649 2340 87 175 2341 323 323 2343 323 323 2343 87 175 2341 473 473 2342 323 323 2344 473 473 2345 472 472 2347 472 472 2347 473 473 2345 175 87 2346 648 648 2348 323 323 2349 86 174 2351 86 174 2351 323 323 2349 472 472 2350 651 651 2353 324 324 2354 3 3 2352 3 3 2352 324 324 2354 649 649 2355 88 176 2357 474 474 2358 651 651 2356 651 651 2356 474 474 2358 324 324 2359 474 474 2361 176 88 2362 324 324 2360 324 324 2360 176 88 2362 476 476 2363 324 324 2365 476 476 2366 649 649 2364 649 649 2364 476 476 2366 87 175 2367 33 33 2368 596 596 2369 652 652 2371 652 652 2371 596 596 2369 325 325 2370 596 596 2372 60 148 2373 325 325 2375 325 325 2375 60 148 2373 475 475 2374 325 325 2376 475 475 2377 474 474 2379 474 474 2379 475 475 2377 176 88 2378 652 652 2380 325 325 2381 88 176 2383 88 176 2383 325 325 2381 474 474 2382 36 36 2384 650 650 2385 595 595 2387 595 595 2387 650 650 2385 326 326 2386 650 650 2388 87 175 2389 326 326 2391 326 326 2391 87 175 2389 476 476 2390 326 326 2392 476 476 2393 475 475 2395 475 475 2395 476 476 2393 176 88 2394 326 326 2397 475 475 2398 595 595 2396 595 595 2396 475 475 2398 60 148 2399</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape2</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_2" name="qt_gauge_background_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape2">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_3.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_3.dae
new file mode 100644
index 0000000..073a136
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_3.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:36:18</created>
+ <modified>2018-03-08T09:36:18</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape3" name="qt_gauge_background_Shape3">
+ <mesh>
+ <source id="qt_gauge_background_Shape3-positions" name="qt_gauge_background_Shape3-positions">
+ <float_array id="qt_gauge_background_Shape3-positions-array" count="2607">2.155396 0 34.01403 1.52588e-4 0 -34.34952 73.07397 0 -3.726303 3.073151 0 -34.31323 -0.91745 0 -34.34901 -73.07397 0 -3.726303 -6.080292 0 -34.311 -6.035034 0 33.90572 -36.78528 0 -31.46436 -36.7851 0 23.22266 -68.76404 0 -12.24535 -36.78516 0 -10.66832 -54.73877 0 -24.29688 -52.7113 0 -9.559219 -53.81027 0 16.67396 -64.62256 0 10.54277 -55.17773 0 9.96109 -62.03052 0 10.71364 -62.47845 0 -10.58582 -71.95142 0 1.432167 -64.62189 0 0.4266357 -55.17773 0 0.09967041 -39.48962 0 9.561295 -3.20401 0 -13.69267 -19.11102 0 -33.8587 -18.98831 0 -11.23125 -19.11096 0 30.48822 -21.07352 0 10.62139 -4.245575 0 13.08913 36.7851 0 23.22266 36.78528 0 -31.46436 39.48969 0 -10.27956 18.43787 0 -33.85924 20.47778 0 -11.23125 18.39252 0 30.52008 17.79678 0 10.62138 36.78519 0 9.654793 68.76404 0 -12.24536 54.73877 0 -24.29689 55.1778 0 -10.5858 53.81027 0 16.67396 52.7113 0 8.934502 64.62256 0 10.54277 62.80624 0 -11.71783 61.94733 0 9.96109 55.17773 0 0.09967041 64.62189 0 -0.4538727 71.95142 0 1.432167 27.59344 0 -33.0726 17.98315 0 -22.47107 27.76236 0 -21.96837 -2.377594 0 -26.22107 -2.654846 0 -34.34431 -5.903015 0 -26.13127 17.74313 0 20.21754 6.902252 0 11.16702 7.574188 0 21.94544 -3.248016 0 0.04548645 7.011017 0 -0.1148453 17.92792 0 0.01759338 27.7623 0 -0.04254913 53.96405 0 -16.36391 59.6449 0 -11.65779 60.42719 0 -16.42801 45.93771 0 -28.64067 37.0062 0 -20.77626 46.14706 0 -19.123 53.6398 0 13.12267 45.7865 0 8.851906 45.85635 0 14.69471 54.02631 0 -5.564247 48.64044 0 -11.55579 48.64038 0 -4.026093 68.86667 0 5.870506 68.85571 0 1.294762 65.68646 0 5.732582 53.78632 0 4.145798 58.14838 0 10.3339 59.53979 0 5.683449 59.74774 0 0.06443024 59.76221 0 -5.655724 65.21194 0 -11.81981 63.86182 0 -7.272087 67.78201 0 -6.195946 -48.64038 0 10.41529 -45.93771 0 -28.64066 -58.2001 0 -11.44904 -59.84183 0 13.91862 -54.02628 0 5.683449 -68.8667 0 5.870514 -67.78207 0 -6.111763 -71.91571 0 -7.292732 -53.78632 0 -4.026588 -48.64038 0 4.143188 -11.71542 0 -34.20241 -27.66077 0 -33.07256 27.58881 0 27.07761 30.38754 0 -11.00365 -0.207489 0 -34.34946 -1.535736 0 -26.22153 10.21634 0 -11.48061 7.747284 0 -22.95561 9.624084 0 -34.20399 1.228668 0 -26.13239 0.4233704 0 -34.34589 -2.227234 0 34.34951 0.356781 0 25.81667 9.411804 0 32.80487 37.0061 0 0.03121185 62.72528 0 -18.37877 45.84467 0 19.72489 46.00748 0 1.49218 63.03561 0 5.676323 73.21249 0 -1.331772 69.77225 0 -2.616112 71.91571 0 -7.29274 59.84186 0 13.91862 63.1106 0 10.481 59.49503 0 13.20661 -11.71088 0 32.7093 -5.879913 0 25.77545 -11.59433 0 21.91653 -45.84467 0 19.7249 -37.0061 0 16.27421 -46.07736 0 14.72046 -53.72412 0 -16.26404 -45.78659 0 -10.01392 -45.92615 0 -19.1188 -62.72528 0 -18.37877 -65.19672 0 -11.71091 -60.3894 0 -16.34723 -53.87979 0 13.22256 -59.5578 0 10.51026 -59.51196 0 13.25497 -59.74774 0 5.760483 -63.03003 0 7.314667 -63.10504 0 10.55748 -65.68646 0 5.81675 -73.21249 0 -1.331779 -68.85577 0 1.35083 -69.77225 0 -2.560043 -63.84653 0 -5.578758 -59.76227 0 0.120491 -59.59146 0 -5.564255 -37.00616 0 -0.01863861 -46.00748 0 -1.432663 -19.10715 0 -22.47101 -11.43787 0 -11.48059 -11.49756 0 -22.95515 -36.78522 0 -20.80014 -27.64008 0 -11.02754 -27.64008 0 -21.96835 -27.66061 0 27.07442 -19.28058 0 20.21465 -27.82471 0 18.28252 -30.42743 0 9.822685 -27.82477 0 0.05992126 -19.26663 0 0.04278564 -13.53729 0 11.16652 -11.53534 0 0.1985016 36.78513 0 16.27656 27.53772 0 9.825043 27.53766 0 18.28251 61.13168 0 12.84105 -9.47757 0 26.35213 -42.93771 0 16.94705 -48.746 0 -15.56586 -63.10367 0 -15.74257 -57.93234 0 12.71884 -61.03281 0 7.834412 -64.20932 0 7.844925 -70.5271 0 -0.8689804 -61.20062 0 -3.705322 -42.91708 0 -3.78186 -13.91675 0 -18.94562 -30.66617 0 -18.11528 -24.71265 0 21.91579 -31.2399 0 3.580093 -14.33304 0 3.855675 30.64252 0 15.0596 24.44583 0 -25.8855 -3.423401 0 -27.92786 10.72385 0 17.93709 3.325989 0 3.810371 24.43298 0 3.569618 58.12537 0 -15.36412 42.95856 0 -22.95142 48.72534 0 12.67497 49.81946 0 -7.28495 67.67841 0 4.146133 57.66159 0 7.19297 58.00775 0 -3.721931 66.02127 0 -8.036568 57.64276 0 12.68324 -14.33722 0 17.93105 -49.30872 0 12.99538 -42.90637 0 -22.9585 -57.82962 0 -15.31892 -61.13 0 12.85537 -58.00772 0 3.89994 -67.67834 0 4.162743 -66.01675 0 -7.696182 -69.7478 0 -5.045265 -57.67258 0 -7.26844 -49.81937 0 7.208862 -49.28806 0 -0.2013321 -9.467316 0 -27.2511 -24.67133 0 -25.88548 -31.23993 0 15.0589 -24.70856 0 -3.674622 -8.935791 0 -3.732788 24.39148 0 21.91649 31.22809 0 -18.10818 -1.489868 0 -27.9357 11.40485 0 -18.94571 5.503571 0 -27.25217 -0.6357117 0 -27.92892 -2.802643 0 27.86354 5.253052 0 26.41336 11.26443 0 -3.780304 31.22812 0 -3.686722 63.10822 0 -15.76649 49.3295 0 -15.87987 42.88565 0 16.94776 42.91711 0 3.681717 49.28806 0 0.3659439 64.211 0 7.51413 61.03452 0 3.883347 61.20517 0 -7.923744 70.52719 0 -0.885582 69.74786 0 -5.061867 58.8461 0 14.26223 62.30066 0 12.11967 61.73819 0 11.83627 -12.78854 0 27.79377 -8.119537 0 29.66825 -7.772278 0 21.59415 -47.24069 0 17.0703 -40.61694 0 19.01022 -41.08609 0 14.60133 -50.89807 0 -19.06633 -50.52603 0 -13.06978 -44.44876 0 -14.09871 -60.50223 0 -18.79977 -65.17368 0 -14.58206 -63.07492 0 -13.71089 -56.47736 0 14.07317 -56.73346 0 11.83625 -60.09225 0 11.96524 -61.64798 0 9.206161 -59.00952 0 8.627419 -62.15744 0 5.389565 -64.54501 0 8.721771 -63.2789 0 9.206177 -64.49442 0 5.38958 -71.71472 0 -2.13237 -71.22217 0 0.08450317 -68.43918 0 -0.4604797 -61.99466 0 -6.450073 -62.39008 0 -2.237106 -59.00952 0 -2.292618 -41.08612 0 1.213074 -40.61694 0 -6.12159 -47.05435 0 -6.359032 -15.84256 0 -24.52831 -15.80527 0 -16.00954 -10.11594 0 -16.50031 -32.95346 0 -23.1993 -32.95343 0 -15.24994 -26.16263 0 -15.69083 -29.12152 0 22.70297 -22.5481 0 24.96821 -22.88336 0 17.88867 -32.95337 0 -1.686409 -34.14291 0 5.992302 -27.25549 0 6.171249 -15.8053 0 -1.786972 -16.71808 0 6.500298 -10.82623 0 6.927841 32.95334 0 18.33369 32.95337 0 12.89157 25.94971 0 13.64863 29.12164 0 -28.20207 22.05334 0 -28.86317 22.41684 0 -20.43616 -3.83075 0 -23.12267 -2.199036 0 -30.4635 -4.368469 0 -30.44649 13.60278 0 22.73695 13.31628 0 15.06982 5.221283 0 15.95251 0.7816772 0 -2.194969 0.6116638 0 6.927856 8.706665 0 6.500313 22.41684 0 -1.786972 21.93787 0 6.171257 29.12161 0 5.998573 56.89581 0 -18.24971 56.73352 0 -13.71091 60.47971 0 -13.9263 47.42648 0 -23.96014 40.61707 0 -26.05148 41.08621 0 -18.46158 50.71225 0 14.51754 50.52597 0 11.19511 44.44876 0 11.78875 51.70615 0 -4.235168 51.70615 0 -8.942711 46.35867 0 -8.45015 66.76233 0 6.590164 69.39893 0 3.092514 66.70868 0 2.732018 56.73343 0 4.434532 55.91345 0 7.986282 59.72964 0 8.627419 56.73346 0 -6.450081 56.73346 0 -2.292618 60.58435 0 -2.386627 67.19955 0 -9.379532 64.67126 0 -9.607849 65.74643 0 -5.344414 59.74707 0 11.83625 55.91345 0 11.64487 56.47733 0 14.07317 -10.8262 0 15.94453 -16.71808 0 15.06982 -15.8425 0 22.7226 -45.63831 0 12.23225 -51.70618 0 11.83625 -50.71228 0 14.51754 -40.617 0 -18.52533 -40.61707 0 -26.05148 -47.42651 0 -23.96014 -60.07883 0 -13.71091 -55.91351 0 -13.51952 -56.89584 0 -18.24971 -61.72318 0 11.96526 -62.30063 0 12.11966 -58.8461 0 14.26223 -56.73346 0 6.495819 -56.73346 0 2.491982 -60.58429 0 2.547501 -66.70859 0 2.881531 -69.39893 0 3.092514 -66.76233 0 6.590179 -65.74637 0 -4.74514 -64.63055 0 -8.942703 -67.19962 0 -9.379532 -68.00815 0 -3.302528 -69.72577 0 -7.502579 -71.20532 0 -4.524673 -56.73343 0 -4.235168 -55.91348 0 -8.301567 -59.82867 0 -8.942711 -51.70615 0 4.434532 -51.70615 0 8.627419 -46.35867 0 8.129288 -45.63831 0 3.155624 -50.52594 0 -3.866394 -51.70615 0 0.09968567 -7.613586 0 -22.18387 -8.139954 0 -30.39812 -12.7886 0 -29.38602 -22.51089 0 -20.43616 -22.54819 0 -28.86305 -29.12164 0 -28.20206 -27.25549 0 13.64862 -34.14288 0 12.88529 -32.95334 0 18.33369 -22.88342 0 1.841774 -22.51089 0 -6.488701 -29.12161 0 -6.38813 -7.05191 0 2.269318 -6.881897 0 -6.970474 -12.75134 0 -6.562485 21.93781 0 17.88867 22.04422 0 24.97458 29.12155 0 22.70298 27.14911 0 -15.69084 34.14297 0 -15.18617 32.9534 0 -23.19931 -0.8380737 0 -30.46442 -1.241058 0 -30.46419 -2.321136 0 -23.13231 6.303162 0 -16.50043 14.69574 0 -16.00955 13.62326 0 -24.52853 2.520416 0 -22.18454 10.03198 0 -29.38693 4.488708 0 -30.39969 -0.7173767 0 -30.46442 -1.322693 0 -23.12332 0.6569519 0 -30.44806 -3.220123 0 22.91213 -4.287781 0 30.33889 -0.7644653 0 30.38026 4.025269 0 29.7521 9.951111 0 27.85061 2.109894 0 21.62864 13.31635 0 1.841774 14.69577 0 -6.562492 6.111694 0 -6.970482 32.9534 0 1.669083 34.14294 0 -6.324379 27.14905 0 -6.488701 63.11563 0 -13.92628 65.17371 0 -14.58206 60.50223 0 -18.79977 45.63837 0 -14.48473 51.70621 0 -13.71091 50.89804 0 -19.06633 40.61694 0 14.6076 40.61694 0 19.01021 47.24063 0 17.0703 41.08612 0 -1.172897 40.61694 0 5.74324 47.05435 0 6.043732 45.63828 0 -3.115456 50.52594 0 3.912132 51.70615 0 0.09967804 64.49445 0 4.790298 63.29388 0 8.627441 64.54498 0 8.721779 61.66296 0 6.495827 62.15744 0 2.39798 59.00952 0 2.491989 62.39014 0 -5.228676 62.03537 0 -9.607857 59.00952 0 -8.942719 68.43924 0 -0.609993 71.22223 0 0.08450317 71.71472 0 -2.13237 71.20532 0 -4.524673 69.72577 0 -7.502579 68.00818 0 -3.452049 60.65042 0 13.39243 62.14539 0 11.92191 60.47165 0 13.13255 -10.3999 0 29.01297 -7.781708 0 25.7761 -10.31308 0 24.26726 -44.18875 0 18.18079 -40.35104 0 16.70487 -44.30609 0 15.91568 -51.05203 0 -16.10158 -47.50082 0 -13.30476 -47.59381 0 -17.17543 -63.02048 0 -16.9631 -64.20285 0 -14.03563 -61.94766 0 -16.19524 -56.29776 0 13.08527 -58.71121 0 11.88327 -58.66458 0 13.11751 -60.43549 0 9.03215 -60.56287 0 6.903313 -62.02924 0 7.497765 -63.85803 0 9.055756 -63.82462 0 7.497772 -64.86795 0 6.926926 -71.67685 0 -1.07782 -69.74017 0 0.04358673 -70.11304 0 -1.548058 -62.4068 0 -4.514259 -60.621 0 -2.03952 -60.52216 0 -4.528145 -40.35107 0 -2.134193 -44.14215 0 -6.548569 -44.25949 0 -2.643318 -16.13876 0 -20.48857 -12.80276 0 -15.70457 -12.8121 0 -20.69408 -33.33658 0 -19.38116 -29.33975 0 -15.08147 -29.33978 0 -19.83173 -25.94543 0 24.18684 -22.26697 0 21.23599 -26.02924 0 20.27763 -33.634 0 2.08326 -30.63077 0 6.463303 -29.61301 0 2.127983 -16.3576 0 2.185104 -13.74884 0 7.108482 -12.98029 0 2.291985 33.33649 0 15.70607 29.28656 0 12.91677 29.28656 0 16.47971 25.82187 0 -29.03796 21.66641 0 -24.41646 25.91272 0 -24.16325 -2.897614 0 -26.68581 -3.043335 0 -30.48775 -4.361389 0 -26.67232 13.83005 0 19.02799 9.040924 0 15.06645 9.292633 0 19.70377 0.3252869 0 2.18998 4.820251 0 7.108475 4.862671 0 2.083099 21.63751 0 2.102844 25.79291 0 6.464867 25.91263 0 2.059662 56.4024 0 -16.05772 58.80814 0 -13.8717 59.09882 0 -16.11156 44.23532 0 -25.46429 40.3512 0 -22.06752 44.3526 0 -21.22711 51.00552 0 13.03608 47.5007 0 11.2291 47.54733 0 13.62886 51.54904 0 -6.593864 48.99368 0 -9.183311 48.99365 0 -6.020958 68.1597 0 4.862839 68.12234 0 2.796921 66.71173 0 4.772705 56.15677 0 6.054512 58.0553 0 8.727173 58.62051 0 6.664551 56.36179 0 -4.528145 58.83423 0 -2.076897 58.83423 0 -4.551651 65.87476 0 -9.581924 65.21344 0 -7.487198 66.86389 0 -7.096123 58.05966 0 11.80318 56.09271 0 13.03741 58.57828 0 13.08527 -13.74878 0 15.06446 -16.36694 0 19.0244 -12.98956 0 19.69022 -48.81357 0 11.95003 -51.30057 0 13.19637 -47.84473 0 13.73974 -40.23383 0 -22.08347 -44.23532 0 -25.46428 -44.23529 0 -21.24304 -58.14267 0 -13.77002 -56.19742 0 -16.00989 -58.99857 0 -16.05772 -62.14163 0 11.95415 -60.65042 0 13.39244 -60.46793 0 13.16479 -56.36176 0 4.689087 -58.83423 0 2.266617 -58.83423 0 4.702957 -68.12238 0 2.83429 -68.15964 0 4.862839 -66.7117 0 4.810089 -65.20328 0 -6.721367 -65.86459 0 -9.415642 -66.86392 0 -6.946297 -68.82724 0 -5.405754 -70.66599 0 -5.964951 -69.67416 0 -3.813568 -56.15674 0 -5.983818 -58.08011 0 -9.146172 -58.64529 0 -6.593864 -51.54901 0 6.664551 -48.99362 0 8.762932 -48.99362 0 6.090271 -47.79816 0 -0.5775986 -51.254 0 -1.877472 -48.81357 0 1.849312 -7.758575 0 -26.40617 -10.40506 0 -30.15788 -10.2735 0 -25.24295 -22.17389 0 -24.41641 -25.94556 0 -29.03793 -25.93622 0 -24.16325 -30.6308 0 12.91521 -33.63397 0 15.70451 -29.61301 0 16.47971 -22.25766 0 -2.06881 -25.93619 0 -6.914162 -26.0293 0 -2.043663 -6.57193 0 -2.082367 -10.08121 0 -7.151993 -10.12369 0 -1.980362 21.54437 0 21.23759 25.81952 0 24.18843 25.79291 0 20.27763 30.60422 0 -15.06554 33.63394 0 -19.36526 29.58643 0 -19.83173 -0.9632263 0 -30.49307 -1.897491 0 -26.68867 -1.591797 0 -26.68886 10.55664 0 -15.70459 14.18002 0 -20.48865 9.579529 0 -20.69427 6.227478 0 -25.24374 7.139191 0 -30.15918 3.276489 0 -26.40729 -1.263702 0 -26.68658 -0.1748962 0 -26.67343 -0.3378601 0 -30.48904 -4.153046 0 26.5415 -2.604156 0 30.4979 -1.616882 0 26.56136 6.942688 0 29.09062 6.069153 0 24.31508 2.828918 0 25.83219 14.10327 0 -2.08725 10.50879 0 -7.151993 9.263489 0 -2.189255 33.63391 0 -2.0709 30.60422 0 -6.898224 29.58636 0 -2.111984 64.21301 0 -14.08948 63.02045 0 -16.9631 61.95782 0 -16.24907 48.81363 0 -14.01131 51.34708 0 -16.26187 47.8912 0 -17.27194 40.23367 0 16.70644 44.18875 0 18.18079 44.18875 0 15.91724 40.35104 0 2.149345 44.14218 0 6.113815 44.25952 0 2.674225 47.79819 0 0.698761 51.25397 0 2.038429 48.81354 0 -1.689728 63.82837 0 6.75351 63.86179 0 8.911064 64.86795 0 6.777115 62.03299 0 4.665588 60.56287 0 2.22924 60.43924 0 4.689102 62.41693 0 -7.458275 60.53235 0 -9.47274 60.62103 0 -6.842247 69.74017 0 0.006202698 71.67685 0 -1.077812 70.11301 0 -1.585434 70.66602 0 -5.964951 68.82721 0 -5.44313 69.67416 0 -3.850945 57.04099 0 15.30862 62.32999 0 12.37348 63.64832 0 10.53304 62.67059 0 10.34429 60.97379 0 11.8215 57.31317 0 14.54912 -15.23129 0 31.74696 -8.62149 0 33.41547 -6.048492 0 30.02255 -5.347504 0 20.80042 -8.613098 0 18.01832 -14.77341 0 25.77539 -50.03262 0 18.14506 -41.38327 0 21.41644 -36.78513 0 19.18552 -37.66907 0 13.47523 -42.84198 0 13.00774 -49.50452 0 15.80659 -54.08942 0 -19.51114 -53.37878 0 -13.20444 -49.2251 0 -9.85939 -41.9581 0 -10.26959 -41.95813 0 -15.74208 -49.7832 0 -21.75536 -58.89767 0 -21.4644 -66.06595 0 -15.23932 -66.66553 0 -11.9548 -63.94791 0 -11.30672 -61.72266 0 -13.60394 -58.25027 0 -19.44449 -53.75262 0 14.61294 -54.33859 0 11.82149 -57.67416 0 10.34428 -61.00513 0 10.65018 -61.04135 0 12.01497 -57.3132 0 14.54912 -57.67413 0 7.83448 -61.76498 0 3.525024 -63.54926 0 4.685287 -62.60858 0 9.235497 -63.64835 0 10.53304 -62.6481 0 10.6502 -65.41388 0 3.608536 -65.46982 0 7.975998 -73.28033 0 -2.465057 -72.79477 0 -0.1061401 -70.43488 0 1.444595 -67.15164 0 1.044632 -67.72626 0 -1.538788 -71.50214 0 -3.230797 -63.37985 0 -7.955795 -64.15311 0 -3.075577 -61.82315 0 0.1829758 -57.67416 0 0.09968567 -57.67413 0 -3.017487 -61.13992 0 -7.955803 -37.6691 0 4.371254 -36.78516 0 -4.64518 -49.22507 0 -5.486954 -42.84195 0 3.212326 -19.11777 0 -27.43924 -19.06186 0 -17.5439 -14.71759 0 -11.29843 -8.042938 0 -11.93111 -8.225891 0 -18.59424 -14.7735 0 -27.65274 -36.78525 0 -25.40276 -36.78522 0 -16.34746 -31.61227 0 -10.89058 -23.77017 0 -11.12651 -23.7702 0 -17.3763 -31.6123 0 -26.28073 -32.18695 0 25.1465 -23.27805 0 28.89285 -19.11771 0 24.62186 -19.75571 0 15.99857 -24.50903 0 15.25121 -31.61221 0 20.69309 -34.35455 0 9.704948 -26.32245 0 10.11945 -24.50906 0 4.752106 -31.61224 0 -4.711815 -19.06186 0 -4.862671 -19.75574 0 4.834366 -16.85031 0 10.88607 -9.91684 0 11.63918 -8.433044 0 5.4757 -14.71759 0 -4.881119 36.78513 0 19.18552 36.78516 0 13.48461 31.61224 0 9.714333 23.36078 0 10.11945 23.36078 0 15.25121 31.61218 0 20.69308 32.1871 0 -32.39674 23.00888 0 -33.54309 17.94443 0 -27.43944 18.6669 0 -17.5439 24.25937 0 -17.3763 31.6123 0 -26.28075 -3.057281 0 -21.40639 -1.657593 0 -30.4352 -1.617859 0 -34.34851 -4.113831 0 -34.33298 -6.094147 0 -30.39742 -5.301819 0 -21.16003 17.92792 0 24.63341 17.72327 0 15.99857 11.72177 0 10.88607 2.092834 0 11.64118 2.647491 0 18.03691 12.39096 0 25.80755 -3.234039 0 -5.493103 -3.489105 0 5.4757 11.72177 0 4.834366 2.528046 0 -5.493103 18.66687 0 -4.881119 17.72327 0 4.752106 31.61224 0 4.493073 24.25934 0 -4.862671 54.08936 0 -19.51114 54.33862 0 -13.60396 57.67413 0 -11.30673 61.35361 0 -11.74226 61.87375 0 -13.92703 58.25027 0 -19.44447 50.40411 0 -26.6769 41.38345 0 -30.22443 36.78525 0 -25.40277 37.66907 0 -16.25182 42.84201 0 -15.75888 49.7832 0 -21.75536 53.75259 0 14.61294 53.37872 0 11.42197 49.22504 0 8.896927 41.95807 0 9.119469 41.95807 0 12.90469 49.50452 0 15.80659 54.33856 0 -3.017487 54.33859 0 -7.955811 51.86325 0 -11.30673 44.88049 0 -11.33421 44.88046 0 -6.506454 51.86322 0 -1.969658 66.83667 0 8.296021 70.60684 0 3.503464 70.43484 0 1.444603 67.15164 0 0.8203506 65.41388 0 3.271812 65.46979 0 7.975998 54.33856 0 2.169029 53.37872 0 6.387131 55.87512 0 9.944763 60.09406 0 10.34428 60.9332 0 7.83448 57.67413 0 3.216858 57.67413 0 0.09968567 61.76501 0 -0.04129791 61.82318 0 -3.383362 57.67416 0 -7.955811 66.66556 0 -11.9548 64.00897 0 -11.74225 63.44092 0 -9.576691 64.15314 0 -4.572563 66.57605 0 -3.794395 68.52393 0 -8.764961 -44.88049 0 10.27036 -51.86325 0 10.34428 -41.38345 0 -30.22441 -50.40411 0 -26.67688 -60.30078 0 -11.30673 -55.87515 0 -10.90721 -62.32996 0 12.37348 -57.04099 0 15.30862 -54.33859 0 7.834473 -54.33859 0 3.216858 -70.60684 0 3.503464 -66.83667 0 8.296021 -68.52393 0 -8.764961 -66.57602 0 -3.45768 -70.66403 0 -9.596199 -72.66907 0 -5.335808 -54.33859 0 -1.969658 -53.37872 0 -6.508469 -44.88049 0 6.376762 -51.86325 0 2.169029 -8.639618 0 -34.27492 -15.23135 0 -34.07111 -23.27814 0 -33.54286 -32.1871 0 -32.39673 22.99066 0 28.90559 32.18695 0 25.1465 26.16281 0 -11.12651 34.35455 0 -10.79494 -0.07226562 0 -34.34952 -0.4682922 0 -34.34932 -2.22522 0 -21.40668 -0.7834778 0 -30.43571 4.808868 0 -11.93115 14.94336 0 -11.29843 12.43674 0 -27.65326 3.202026 0 -18.59459 13.88501 0 -34.07214 5.928864 0 -34.27696 2.266113 0 -30.39909 -0.2695923 0 -21.16066 1.33075 0 -34.33501 0.07260132 0 -34.34952 -4.023376 0 34.22025 -0.287384 0 34.28397 1.391876 0 30.09523 -1.221649 0 20.81857 5.460266 0 33.53017 13.79437 0 31.81067 36.78516 0 4.429245 37.66904 0 -4.503731 66.06595 0 -15.23932 58.89767 0 -21.4644 41.38327 0 21.41644 50.03262 0 18.14506 49.22504 0 5.365623 42.84195 0 -3.251755 63.54929 0 3.188309 62.63104 0 7.83448 72.79477 0 -0.1061401 73.28033 0 -2.465057 71.50214 0 -3.230797 67.72629 0 -1.763069 72.66907 0 -5.335808 70.66403 0 -9.596199</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape3-positions-array" count="869" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape3-normals" name="qt_gauge_background_Shape3-normals">
+ <float_array id="qt_gauge_background_Shape3-normals-array" count="2607">0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape3-normals-array" count="869" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape3-tangents" name="qt_gauge_background_Shape3-tangents">
+ <float_array id="qt_gauge_background_Shape3-tangents-array" count="2607">-0.1098349 0 -0.9939498 0 0 1 -0.9868778 0 0.1614689 -0.01269988 0 0.9999194 6.7944e-4 0 0.9999998 0.9697826 0 0.2439707 0.01117301 0 0.9999376 0.1862263 0 -0.9825069 0.198726 0 0.9800551 0.3656164 0 -0.9307656 0.7428604 0 0.6694463 -1 0 0 0.4812889 0 0.876562 0.3919671 0 -0.9199792 0.3892756 0 -0.9211213 0.7122614 0 -0.7019143 -0.1148447 0 0.9933835 0.9313153 0 -0.3642139 -0.8912157 0 0.4535797 0.8768688 0 -0.4807298 0.9911603 0 0.1326695 -0.9656236 0 0.2599443 0.8842996 0 -0.4669199 0.6076991 0 0.7941674 0.05466568 0 0.9985047 -0.9999333 0 -0.01154771 0.3575423 0 -0.9338969 -0.9712576 0 0.2380308 -0.9899438 0 -0.1414611 -0.385974 0 -0.9225097 -0.260357 0 0.9655124 -0.9537389 0 -0.3006363 -0.06899856 0 0.9976168 0.9612311 0 -0.2757441 -0.2702333 0 -0.9627949 0.08984556 0 0.9959557 0.1029369 0 0.9946879 -0.8126097 0 0.5828082 -0.5629124 0 0.8265166 -0.9526755 0 -0.303989 -0.3628778 0 -0.9318367 0.9673489 0 0.2534485 -0.6239993 0 -0.7814249 0.01681485 0 -0.9998586 -0.4681699 0 0.8836385 -0.7805451 0 0.6250994 -0.4498513 0 0.8931035 -0.8387708 0 -0.5444847 -0.1455614 0 0.9893492 0.9999696 0 -0.007794436 -0.7950752 0 -0.6065108 -0.9901821 0 -0.1397838 0.004046465 0 0.9999918 0.9989979 0 -0.04475706 -0.9991256 0 0.04180883 0.05819433 0 0.9983053 0.6215071 0 -0.7834086 0.9999968 0 0.002523568 -0.7243411 0 0.6894418 0.9888133 0 0.1491588 -0.7623815 0 0.6471278 0.9992083 0 0.03978289 -0.1753727 0 -0.9845021 -0.8656318 0 0.5006811 -0.4024913 0 0.9154238 0.9988616 0 -0.04770242 -0.7133414 0 -0.7008167 -0.997148 0 0.07547067 -0.01309196 0 0.9999143 0.4172923 0 -0.9087723 -0.9925672 0 0.1216977 -0.07704881 0 0.9970273 0.5506591 0 -0.8347302 -0.766861 0 -0.6418132 -0.09446408 0 0.9955283 0.9939207 0 -0.110098 0.9631219 0 0.2690655 0.1687265 0 -0.9856629 -0.8392928 0 0.5436798 -0.01699952 0 -0.9998555 -0.7407199 0 0.671814 0.09247034 0 0.9957154 0.9837284 0 -0.179662 -0.8936536 0 -0.4487574 0.03851925 0 0.9992579 0.3284586 0 0.9445184 -0.0675868 0 -0.9977134 0.5275569 0 -0.8495197 -0.9896231 0 -0.1436879 0.8057055 0 -0.5923164 0.9630623 0 -0.2692786 0.8786574 0 0.4774528 -0.9657938 0 -0.2593113 -0.5107316 0 0.8597402 0.02356769 0 0.9997222 0.1066989 0 0.9942914 -0.3694264 0 -0.92926 0.02906974 0 -0.9995774 4.51365e-4 0 0.9999999 -0.989902 0 -0.1417534 0.08303152 0 -0.9965469 0.7077237 0 0.7064893 -0.03092946 0 0.9995216 0.9716887 0 0.2362649 -0.01198918 0 0.9999281 0.07178237 0 -0.9974203 -0.9719608 0 0.2351428 -0.1805319 0 -0.9835691 -0.9987405 0 -0.05017447 -0.68482 0 0.7287123 -0.3545242 0 -0.9350468 -0.7692273 0 0.6389753 0.9793454 0 0.2021943 -0.9465348 0 -0.3226017 0.3348227 0 0.9422811 -0.9332352 0 0.359266 -0.4445413 0 -0.8957584 -0.09632916 0 0.9953495 0.6836204 0 0.7298377 0.2636875 0 -0.9646082 -0.9992132 0 -0.03966152 0.7943334 0 0.6074821 0.3529556 0 -0.9356401 -0.9971318 0 0.07568535 0.4678591 0 0.8838031 0.9937314 0 -0.1117937 -0.04489447 0 -0.9989917 -0.6480839 0 0.7615689 0.6276111 0 0.778527 0.1638073 0 -0.9864924 -0.8994052 0 -0.4371158 -0.9958434 0 0.09108164 0.08777936 0 0.9961399 0.6297876 0 -0.7767674 -0.7071731 0 0.7070404 0.9810549 0 -0.1937299 0.04493295 0 -0.99899 0.9924672 0 0.1225106 0.9982131 0 -0.05975529 -0.05927446 0 -0.9982417 -0.4466049 0 0.8947313 0.9812678 0 0.1926486 -0.03030548 0 -0.9995407 -0.7989068 0 0.6014549 -0.9887888 0 -0.1493205 0.7832984 0 -0.6216459 0.9999977 0 -0.0021376 -0.05545561 0 -0.9984612 -0.7999137 0 0.6001151 1 0 0 -0.0344599 0 -0.9994061 -0.764675 0 0.6444161 0.3918691 0 -0.920021 -0.9993178 0 0.03693072 0.6747495 0 0.7380468 0.02996695 0 -0.9995509 -0.8166747 0 0.5770983 0.9991299 0 0.04170759 0.08434889 0 -0.9964363 -0.8620727 0 0.5067847 -1 0 0 0.02716128 0 0.9996311 0.5873568 0 -0.8093281 -0.7533878 0 -0.6575764 -0.9448461 0 -0.3275146 -0.7021656 0 -0.7120137 0.226287 0 -0.9740607 0.9976852 0 0.0680016 -0.2187414 0 0.9757829 -0.8948896 0 0.4462876 -0.960398 0 0.278632 0.1787148 0 -0.9839009 0.5569954 0 -0.8305156 -0.5403142 0 0.8414634 0.5703677 0 -0.8213895 0.4283498 0 -0.903613 -0.8788644 0 -0.4770717 0.5301311 0 -0.8479157 0.6364516 0 -0.7713166 -0.2333444 0 0.9723942 0.916495 0 0.4000461 -0.9208862 0 0.3898315 -0.3313606 0 0.9435042 0.4751518 0 -0.8799038 0.4646232 0 -0.8855085 0.3734408 0 -0.927654 0.8915243 0 0.452973 -0.1564182 0 0.9876909 -0.3710446 0 0.9286151 -0.8301802 0 0.5574951 0.6033329 0 -0.7974895 0.439879 0 -0.8980571 0.9955356 0 -0.09438649 0.903727 0 0.4281092 0.9795743 0 0.2010827 0.9037437 0 0.4280739 -0.3111608 0 0.9503573 -0.9801809 0 -0.1981045 0.6651841 0 -0.7466794 -0.4323227 0 0.901719 0.9484232 0 -0.3170071 -0.7677832 0 0.6407097 0.364635 0 0.9311505 -0.6465256 0 0.7628923 0.3001824 0 -0.9538818 0.2448573 0 0.9695591 -0.4432453 0 0.8964004 -0.5070176 0 0.8619357 0.9619201 0 0.2733309 -0.5480386 0 0.836453 -0.5724652 0 0.819929 0.23195 0 -0.9727277 -0.9796193 0 -0.2008632 0.9794477 0 0.2016984 -0.9674204 0 -0.2531753 -0.9407567 0 0.3390824 -0.8924587 0 -0.4511291 0.6995619 0 -0.714572 -0.8456694 0 0.5337072 -0.5122143 0 0.8588577 -0.5575541 0 0.8301406 -0.8350747 0 0.5501365 -0.9639392 0 -0.2661227 0.09062383 0 -0.9958852 0.5127059 0 -0.8585643 -0.2180135 0 -0.9759457 0.8933349 0 -0.4493915 -0.6167127 0 0.7871883 -0.3585813 0 0.9334985 -0.7497757 0 -0.6616921 0.7012325 0 0.7129327 0.4342409 0 0.9007968 0.786532 0 -0.6175495 -0.715264 0 -0.6988543 -0.4546199 0 0.8906855 0.9962542 0 0.08647254 -0.7248161 0 -0.6889424 -0.3419313 0 0.939725 0.9934139 0 0.1145809 -0.3779118 0 -0.9258416 -0.9986543 0 -0.05186066 0.0774425 0 0.9969968 0.699299 0 -0.7148293 -0.5892656 0 -0.8079394 -0.4904953 0 0.8714438 0.910641 0 0.4131986 0.9838738 0 0.178864 -0.02376772 0 -0.9997175 -0.6280556 0 0.7781685 0.1420596 0 0.9898581 0.7429406 0 -0.6693573 -0.998156 0 0.06070009 -0.43723 0 0.8993497 0.9525817 0 -0.304283 -0.9717276 0 -0.2361046 -0.9993557 0 0.0358901 0.02759852 0 0.9996191 0.5448368 0 -0.8385421 -0.9780787 0 -0.2082355 -0.1109988 0 0.9938205 0.8282205 0 -0.5604024 0.9767272 0 0.2144854 0.1202429 0 -0.9927445 -0.7991655 0 0.601111 -0.9973227 0 -0.07312625 -0.1010494 0 0.9948814 0.8411629 0 -0.5407819 -0.9950035 0 -0.09984033 -0.04657014 0 0.998915 0.7933783 0 -0.6087289 -0.4232831 0 0.9059975 0.9971751 0 0.07511189 -0.6047767 0 -0.7963951 -0.9840879 0 -0.1776823 -0.1329163 0 0.9911273 0.8638773 0 -0.5037023 -0.9904709 0 -0.1377225 -0.2006624 0 0.9796604 0.9068826 0 -0.4213834 0.9895355 0 0.14429 -0.006872268 0 -0.9999764 -0.646953 0 0.7625299 0.2455615 0 -0.969381 -0.9962355 0 -0.08668774 0.7293685 0 0.684121 0.9673767 0 0.2533422 0.02870573 0 -0.9995879 -0.9999982 0 0.001875927 0.998128 0 0.06115982 7.8875e-4 0 -0.9999997 -0.6776058 0 0.7354253 -0.9946272 0 -0.1035219 -0.04287714 0 0.9990804 0.7543569 0 -0.6564645 -0.9805145 0 -0.1964468 -0.07594256 0 0.9971122 0.7752831 0 -0.6316139 -0.9755896 0 -0.2196017 0.07727519 0 0.9970098 0.8453618 0 -0.5341942 0.4263602 0 -0.9045535 -0.9977806 0 -0.06658673 0.6461692 0 0.7631942 0.9809631 0 0.1941941 -0.01123431 0 -0.9999369 -0.5106072 0 0.8598141 0.9977891 0 -0.06645925 0.08835497 0 -0.9960891 -0.6778134 0 0.735234 0.7774521 0 0.6289421 0.2255823 0 -0.9742241 -0.9999989 0 0.001495454 -0.9420921 0 -0.3353542 -0.3269066 0 0.9450567 0.8706229 0 -0.491951 -0.9818098 0 -0.1898673 -0.1021496 0 0.994769 0.7776867 0 -0.6286521 0.1510201 0 -0.9885307 -0.9688375 0 0.2476974 0.843064 0 0.5378132 0.01959637 0 -0.999808 -0.9918161 0 0.1276748 0.425518 0 0.90495 0.2883398 0 -0.9575282 -0.9960811 0 0.0884442 0.728328 0 0.6852286 0.08853151 0 -0.9960734 -0.9582953 0 0.2857797 0.2617831 0 0.9651267 0.9942513 0 0.1070718 -0.1601934 0 -0.9870856 -0.6482802 0 0.7614019 0.03051664 0 0.9995343 0.9935645 0 -0.1132674 -0.7216479 0 -0.6922603 0.02653674 0 -0.9996478 -0.6107325 0 0.791837 0.5604205 0 -0.8282082 0.979486 0 0.2015124 0.1066652 0 -0.994295 -0.7763338 0 0.630322 0.033396 0 -0.9994422 -0.8192187 0 0.5734813 0.9995958 0 0.02843013 0.9642517 0 0.2649879 0.3578635 0 -0.9337739 -0.990617 0 0.1366672 0.9318294 0 -0.3628968 -0.8531449 0 -0.521674 -0.4212138 0 0.9069614 0.9496874 0 0.3131993 0.3632036 0 -0.9317098 -0.8930608 0 0.4499359 -0.9975267 0 0.07028926 -0.04989615 0 0.9987544 0.6119961 0 -0.7908608 0.8655759 0 -0.5007778 -0.9390614 0 -0.3437495 -0.5175548 0 0.8556501 0.9994109 0 -0.0343186 -0.1054673 0 -0.9944228 -0.8548174 0 0.5189288 0.9964347 0 0.08436748 0.05140735 0 -0.9986778 -0.7851762 0 0.6192725 0.2123312 0 -0.9771977 -0.9840948 0 0.1776441 0.4852895 0 0.8743535 0.9874379 0 0.1580076 0.1232643 0 -0.9923739 -0.8146969 0 0.579887 0.9939722 0 0.1096328 0.05664568 0 -0.9983943 -0.8674838 0 0.4974655 -0.9931698 0 -0.1166782 0.2038617 0 0.9789997 0.5888896 0 -0.8082135 -0.1780869 0 0.9840148 0.9926633 0 -0.1209111 -0.7071709 0 -0.7070427 0.2231927 0 -0.9747744 -0.9852196 0 -0.1712961 0.979614 0 0.2008889 -0.1839113 0 0.9829429 0.9934367 0 -0.1143829 -0.6880619 0 -0.725652 0.6364917 0 0.7712836 0.2579234 0 -0.9661654 -0.9568646 0 -0.2905343 -0.9897047 0 -0.1431247 0.9515048 0 0.3076339 0.04116393 0 -0.9991524 -0.9685151 0 -0.2489548 -0.09402772 0 0.9955696 0.9759825 0 -0.2178491 0.2211208 0 0.9752464 0.6733479 0 -0.7393257 -0.9856841 0 0.1686029 0.9805268 0 0.1963852 0.1394186 0 -0.9902335 -0.8349156 0 0.550378 0.9838461 0 0.1790165 0.1600704 0 -0.9871056 -0.8736647 0 0.4865286 0.1470934 0 0.9891226 0.7416934 0 -0.6707391 -0.8685288 0 0.4956386 -0.147466 0 0.9890671 0.9902351 0 -0.1394077 -0.5124545 0 -0.8587144 -0.9837324 0 -0.17964 0.226195 0 0.974082 0.353433 0 -0.9354598 -0.9763858 0 -0.2160344 -0.1045445 0 0.9945202 0.76969 0 -0.6384178 -0.8701667 0 0.4927574 0.9321113 0 0.3621719 0.5260875 0 -0.8504305 -0.9469806 0 -0.3212908 -0.4468001 0 0.8946338 0.9864878 0 0.1638347 0.9801689 0 0.1981641 0.1052334 0 -0.9944476 -0.8381656 0 0.5454159 0.9999278 0 0.01201673 -0.08953559 0 -0.9959836 -0.7933966 0 0.608705 -0.4280658 0 0.9037476 0.9312968 0 0.3642613 -0.3231486 0 -0.9463482 0.9364995 0 -0.3506689 -0.9165571 0 -0.3999038 0.2328534 0 0.9725118 -0.5454442 0 -0.8381472 0.8308219 0 0.5565383 0.4040025 0 0.9147579 -0.9424782 0 -0.3342675 3.40993e-4 0 0.9999999 -0.9282371 0 0.3719891 -0.6819861 0 -0.7313651 0.1276968 0 0.9918132 -0.601899 0 0.7985722 0.06068694 0 -0.9981568 -0.8868865 0 0.4619875 -0.8131367 0 -0.5820728 0.9789436 0 0.2041308 -0.9194946 0 -0.3931026 -0.3646209 0 -0.9311561 -0.05668815 0 0.9983919 0.8511987 0 -0.5248435 0.4781711 0 0.8782667 -0.8598402 0 0.5105633 0.8141317 0 0.5806802 -0.3200792 0 0.9473908 -0.8939198 0 0.448227 0.2245561 0 0.9744612 -0.8125107 0 0.5829463 0.1631605 0 -0.9865995 -0.8282576 0 0.5603475 -0.8538012 0 -0.5205992 0.5945183 0 -0.8040821 -0.9292565 0 0.3694352 -0.7715398 0 -0.6361811 -0.5345312 0 0.8451488 0.9034391 0 -0.4287164 0.6468222 0 0.7626408 0.5553817 0 -0.8315956 -0.9515556 0 0.3074768 -0.8454114 0 -0.5341157 0.3805086 0 -0.9247774 -0.9222233 0 0.3866577 -0.7912759 0 -0.6114593 -0.8597661 0 -0.5106881 0.3235969 0 0.946195 -0.7794615 0 0.6264501 0.5289665 0 -0.8486427 -0.9981732 0 0.06041799 -0.6658953 0 -0.7460452 0.5929882 0 -0.8052111 -0.998644 0 0.0520599 -0.7562742 0 -0.6542549 -0.1632061 0 0.986592 0.870401 0 -0.4923435 0.7232551 0 0.690581 0.9156213 0 0.4020418 -0.4670303 0 -0.8842413 0.7612887 0 -0.648413 -0.6663618 0 0.7456286 0.9949646 0 0.1002271 0.8011214 0 0.5985019 -0.2908495 0 0.9567688 0.8767867 0 -0.4808795 0.7770213 0 0.6294744 0.5145859 0 -0.8574388 -0.8897553 0 0.4564378 -0.7471238 0 -0.664685 0.490012 0 -0.8717157 -0.8874847 0 0.4608372 -0.7142394 0 -0.6999014 0.124591 0 -0.9922082 -0.935417 0 0.3535464 -0.6090087 0 -0.7931635 0.8813919 0 0.4723858 -0.3601258 0 -0.9329038 0.7776466 0 -0.6287016 -0.03285413 0 0.9994602 0.8111101 0 -0.5848935 0.6293025 0 0.7771605 -0.383797 0 0.9234175 0.9890966 0 -0.1472679 0.837167 0 0.5469474 -0.8186197 0 0.574336 0.8986252 0 0.4387171 0.5439096 0 0.8391438 0.6271667 0 -0.7788851 -0.9983262 0 0.05783359 -0.482628 0 -0.8758255 0.4055211 0 -0.9140857 -0.9197967 0 0.3923952 -0.7084898 0 -0.7057211 0.9588291 0 -0.2839837 -0.1571719 0 -0.9875713 0.7447807 0 -0.6673094 0.9981821 0 0.06027002 -0.0347371 0 -0.9993965 0.3948279 0 -0.9187551 0.9985314 0 0.05417634 -0.3781735 0 -0.9257347 0.7938332 0 -0.6081356 0.9936932 0 0.1121332 -0.01015436 0 -0.9999484 0.4532276 0 -0.8913948 -0.3487629 0 0.937211 0.8813919 0 -0.4723858 0.7905396 0 0.6124109 -0.999694 0 -0.024738 0.1022195 0 0.9947619 -0.5342612 0 0.8453195 0.8231618 0 -0.5678069 -0.5454241 0 0.8381602 0.4233969 0 -0.9059443 -0.3917355 0 0.9200779 0.9178593 0 -0.3969058 0.6968409 0 0.7172258 0.8964319 0 -0.4431815 -0.8185868 0 -0.5743829 0.5564348 0 -0.8308913 -0.6441628 0 0.7648884 0.9601769 0 0.2793927 0.6628058 0 0.7487914 0.5597571 0 0.8286568 0.7281867 0 -0.6853788 0.9982176 0 -0.05967998 -0.6366986 0 0.7711127 0.9986452 0 -0.05203631 0.56987 0 0.8217348 0.3682166 0 -0.92974 -0.9779037 0 0.209056 -0.8045336 0 -0.5939071 0.4309027 0 0.9023984 0.647062 0 -0.7624374 0.9742597 0 -0.2254286 -0.146551 0 0.9892031 0.9513176 0 -0.3082122 0.9280101 0 0.3725551 -0.5356679 0 0.8444288 0.9202902 0 -0.3912364 0.8059753 0 0.5919492 0.9978447 0 0.06561969 -0.1665836 0 -0.9860273 0.6577851 0 -0.7532056 -0.5767345 0 0.8169317 0.923874 0 -0.3826968 0.7771423 0 0.6293249 -0.5391523 0 0.8422083 0.9542304 0 -0.2990726 0.8277499 0 0.5610972 0.2591773 0 -0.9658298 -0.8527982 0 0.5222406 -0.7600148 0 -0.6499057 -0.9985803 0 -0.05326762 0.3859878 0 0.9225039 -0.7240971 0 0.6896981 0.9813338 0 0.1923124 -0.6977219 0 -0.7163688 0.9966752 0 0.08147773 -0.9967704 0 -0.08030393 0.4622323 0 0.8867589 -0.6917617 0 0.7221259 -0.8329926 0 0.5532842 0.8520552 0 0.523452 0.3546998 0 0.9349802 -0.8631722 0 -0.5049096 -0.3596818 0 0.933075 -0.9933001 0 -0.1155633 0.4054999 0 -0.9140951 -0.9952457 0 0.09739584 -0.7393851 0 -0.6732828 -0.8327791 0 0.5536055 0.8441315 0 0.5361362 -0.2331367 0 0.972444 -0.4821452 0 0.8760913 0.9977255 0 -0.06740837 0.6223768 0 0.7827178 -0.5290017 0 0.8486207 0.9986102 0 -0.05270435 0.6922238 0 0.7216829 -0.9152737 0 0.4028324 0.9789478 0 -0.2041106 -0.3868307 0 0.9221508 -0.997522 0 -0.07035498 0.03896029 0 0.9992408 -0.6954673 0 0.7185578 0.1236975 0 -0.99232 -0.6819843 0 0.7313668 -0.6202945 0 -0.784369 0.5349928 0 -0.8448566 -0.8572907 0 0.5148326 -0.6002618 0 -0.7998036 -0.4050926 0 -0.9142757 -0.6396608 0 0.7686573 -0.9743775 0 0.2249189 0.8053989 0 -0.5927331 -0.9020559 0 -0.4316191 -0.7464894 0 -0.6653973 -0.7099493 0 0.7042528 0.9358564 0 -0.3523817 0.804311 0 0.5942086 -0.1278032 0 0.9917996 0.9265 0 -0.3762949 0.8798617 0 0.4752298 -0.824467 0 -0.56591 0.1631605 0 0.9865995 -0.860584 0 0.5093086 0.728197 0 0.6853678 0.5844447 0 -0.8114336 0.998153 0 0.06075025 -0.3892756 0 -0.9211213 -0.5275569 0 -0.8495197 -0.009984153 0 0.9999502 -0.2967133 0 0.9549666 0.8860187 0 0.4636495 0.5240484 0 0.8516885 0.3086078 0 -0.9511894 0.2228319 0 -0.9748569 -0.999994 0 0.003465775 -0.9943225 0 -0.1064088 0.748462 0 0.6631777 0.7718135 0 0.635849 0.3628778 0 -0.9318367 0.3545228 0 -0.9350474 -1 0 0 -0.9730765 0 0.2304826 0.7168243 0 0.6972539 0.3021117 0 0.9532725 0.99092 0 -0.1344531 0.9936904 0 -0.1121578 -0.08578505 0 -0.9963137 -0.06663409 0 -0.9977775 -0.7002275 0 0.7139198 -0.5643213 0 0.8255553 0.5629103 0 0.826518 0.68482 0 0.7287123 0.1371436 0 -0.9905512 0.3079329 0 -0.9514081 -0.9700466 0 -0.2429187 -0.8228291 0 -0.5682889 -0.9996091 0 -0.02795954 -0.9503431 0 0.3112041 0.1517169 0 0.988424 0.09622828 0 0.9953593 0.7961165 0 -0.6051434 0.5072421 0 -0.8618036 -0.6484749 0 0.761236 -0.7424133 0 0.6699421 0.969714 0 -0.2442431 0.9767654 0 -0.2143113 -0.009984466 0 -0.9999502 0.1988625 0 -0.9800274 0.9703919 0 0.2415358 0.9950043 0 -0.09983196 0.9868778 0 0.1614689 0.9465354 0 -0.3225999 0.008194879 0 -0.9999664 -0.1768477 0 -0.9842382 -0.5349205 0 0.8449024 -0.3615186 0 0.9323649 0.9459816 0 0.3242202 0.9925832 0 0.1215676 -0.08673263 0 -0.9962316 -0.00996326 0 -0.9999504 -0.7805422 0 0.6251031 -0.8394117 0 0.5434961 -0.9436307 0 -0.3310002 -0.998861 0 -0.04771525 0.7596507 0 -0.6503313 0.8263524 0 -0.5631534 0.9999994 0 0.001050614 0.9999578 0 -0.009191227 -0.01572946 0 -0.9998763 -0.1315494 0 -0.9913096 -0.6984822 0 0.7156274 -0.8202454 0 0.5720118 1 0 0 1 0 0 -0.04292668 0 -0.9990782 -0.02556554 0 -0.9996731 -0.7892024 0 0.6141332 -0.7355194 0 0.6775036 0.385974 0 -0.9225097 0.3832426 0 -0.9236477 -0.9999993 0 0.00114967 -0.9937099 0 0.1119852 0.8030571 0 0.5959021 0.5369301 0 0.8436267 0.02796411 0 -0.9996089 0.07210648 0 -0.9973969 -0.863023 0 0.5051647 -0.7832583 0 0.6216965 0.9999333 0 0.01154771 0.9948306 0 0.1015483 0.0625498 0 -0.9980418 0.1294552 0 -0.9915853 -0.876212 0 0.4819259 -0.8474364 0 0.530897 -1 0 0 -1 0 0 0.01150909 0 0.9999338 0.07031033 0 0.9975252 0.6396265 0 -0.7686859 0.5091837 0 -0.8606579 -0.1987291 0 0.9800545 -0.1020885 0 0.9947753 0.9970591 0 0.07663597 0.9905082 0 -0.1374534 -0.8516573 0 -0.5240991 -0.7459714 0 -0.665978 -0.9998191 0 -0.01901833 -0.9857164 0 -0.1684138 7.18923e-4 0 0.9999997 0.007770431 0 0.9999698 0.9999937 0 0.003540201 0.9927666 0 -0.1200602 -0.9969 0 0.07867931 -0.9999889 0 0.004708902 0.04352842 0 0.9990522 0.09811562 0 0.995175 0.5831219 0 -0.8123847 0.6255528 0 -0.7801819 0.9999933 0 0.003662277 0.9990159 0 0.04435398 -0.6897359 0 0.724061 -0.7681447 0 0.6402762 0.9616602 0 0.2742438 0.9990671 0 0.04318501 -0.7063385 0 0.7078742 -0.8089422 0 0.5878881 0.9909183 0 0.1344651 0.9909157 0 -0.1344844 -0.2774571 0 -0.960738 -0.04937622 0 -0.9987803 -0.921291 0 0.3888739 -0.8108893 0 0.5851995 -0.4812889 0 0.876562 -0.3284586 0 0.9445184 1 0 0 0.9894373 0 -0.1449616 -0.8530151 0 -0.5218863 -0.5864058 0 -0.8100174 -0.9996086 0 0.02797433 -0.9884214 0 0.151734 -0.01077731 0 0.9999419 0.06971834 0 0.9975667 0.53198 0 -0.8467569 0.2915395 0 -0.9565588 -0.9656206 0 0.2599555 -0.9915821 0 -0.1294791 -0.2125363 0 0.9771532 0.0588277 0 0.9982682 0.5734172 0 -0.8192635 0.5379059 0 -0.8430049 -0.7122614 0 -0.7019143 -0.8056996 0 -0.5923244 0.008199744 0 0.9999664 -0.2681991 0 0.9633635 0.9781437 0 -0.2079301 0.9953683 0 0.0961352 0.9267014 0 0.3757986 0.9838639 0 0.1789184 0.3041856 0 -0.9526128 0.005332756 0 -0.9999858 -0.9026201 0 0.4304381 -0.7975538 0 0.6032478 0 0 -1 -0.05233959 0 -0.9986293 -0.7230626 0 0.6907825 -0.7404117 0 0.6721536 0.1371526 0 0.9905499 0.0643404 0 0.997928 0.9587663 0 -0.2841958 0.9942275 0 -0.1072927 -0.863157 0 -0.5049357 -0.9607388 0 -0.2774543 0.1304067 0 0.9914606 -0.02202918 0 0.9997573 0.26036 0 0.9655116 0.4024913 0 0.9154238 -0.3142754 0 -0.9493318 0.2269657 0 -0.9739027 0.6239943 0 -0.7814289 0.4445452 0 -0.8957564 -0.9302019 0 -0.3670483 -0.992079 0 0.1256159 0.8387708 0 -0.5444847 0.7668553 0 -0.64182 0.9976286 0 -0.06882656 0.9104113 0 -0.4137044 0.8126081 0 0.5828104 0.9332347 0 0.3592672 -0.9267042 0 -0.3757916 -0.9867815 0 -0.1620566 -0.5086131 0 0.8609952 -0.5223412 0 0.8527366 0.01409881 0 0.9999006 0.03731883 0 0.9993034 0.07557709 0 0.99714 0.1476729 0 0.9890363 -0.3312892 0 -0.9435293 -0.387213 0 -0.9219903 0.01842006 0 -0.9998303 0.05253867 0 -0.9986189 0 0 1 5.26562e-4 0 0.9999999 -0.992046 0 -0.1258756 -0.9844387 0 -0.1757283 0.2147091 0 -0.976678 0.03851042 0 -0.9992582 0.7188716 0 0.6951428 0.6923315 0 0.7215796 -0.0467121 0 0.9989084 -0.01974261 0 0.9998051 0.9793984 0 0.2019374 0.9574681 0 0.288539 -0.01249574 0 0.9999219 -0.01035267 0 0.9999464 0.1544766 0 -0.9879965 -0.03376898 0 -0.9994297 -0.9815435 0 0.191239 -0.9535783 0 0.3011453 -0.1448649 0 -0.9894514 -0.2212325 0 -0.9752211 -1 0 0 -0.9894835 0 -0.1446461 -0.7428587 0 0.6694482 -0.6276111 0 0.778527 -0.3656164 0 -0.9307656 -0.3529541 0 -0.9356406 -0.7153375 0 0.6987791 -0.8318152 0 0.5550527 0.9592677 0 0.2824988 0.982879 0 0.184252 -0.8768688 0 -0.4807298 -0.9982131 0 -0.05975489 0.3006548 0 0.953733 0.3848304 0 0.9229873 -0.9697826 0 0.2439707 -0.8786568 0 0.477454</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape3-tangents-array" count="869" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape3-binormals" name="qt_gauge_background_Shape3-binormals">
+ <float_array id="qt_gauge_background_Shape3-binormals-array" count="2607">-0.9939499 0 0.1098349 1 0 0 0.1614689 0 0.9868778 0.9999194 0 0.01269988 0.9999998 0 -6.7944e-4 0.2439707 0 -0.9697827 0.9999376 0 -0.01117301 -0.9825069 0 -0.1862263 0.9800551 0 -0.198726 -0.9307656 0 -0.3656164 0.6694463 0 -0.7428604 0 0 1 0.8765621 0 -0.481289 -0.9199793 0 -0.3919671 -0.9211214 0 -0.3892757 -0.7019144 0 -0.7122614 0.9933835 0 0.1148447 -0.3642139 0 -0.9313154 0.4535797 0 0.8912157 -0.4807298 0 -0.8768688 0.1326695 0 -0.9911603 0.2599443 0 0.9656236 -0.4669199 0 -0.8842996 0.7941674 0 -0.607699 0.9985047 0 -0.05466568 -0.01154771 0 0.9999334 -0.933897 0 -0.3575423 0.2380308 0 0.9712576 -0.1414611 0 0.9899438 -0.9225097 0 0.385974 0.9655125 0 0.260357 -0.3006363 0 0.9537389 0.9976168 0 0.06899856 -0.2757441 0 -0.9612311 -0.962795 0 0.2702334 0.9959558 0 -0.08984557 0.9946879 0 -0.1029369 0.5828082 0 0.8126097 0.8265166 0 0.5629124 -0.3039891 0 0.9526755 -0.9318367 0 0.3628778 0.2534485 0 -0.9673489 -0.7814249 0 0.6239994 -0.9998586 0 -0.01681485 0.8836384 0 0.4681699 0.6250994 0 0.7805452 0.8931035 0 0.4498512 -0.5444847 0 0.8387709 0.9893493 0 0.1455614 -0.007794437 0 -0.9999697 -0.6065108 0 0.7950752 -0.1397838 0 0.9901822 0.9999918 0 -0.004046465 -0.04475706 0 -0.9989979 0.04180883 0 0.9991257 0.9983054 0 -0.05819434 -0.7834086 0 -0.621507 0.002523568 0 -0.9999968 0.6894418 0 0.7243411 0.1491588 0 -0.9888132 0.6471278 0 0.7623816 0.03978289 0 -0.9992084 -0.9845021 0 0.1753727 0.500681 0 0.8656319 0.9154238 0 0.4024913 -0.04770242 0 -0.9988617 -0.7008167 0 0.7133414 0.07547066 0 0.997148 0.9999143 0 0.01309196 -0.9087723 0 -0.4172923 0.1216977 0 0.9925673 0.9970273 0 0.07704882 -0.8347303 0 -0.5506591 -0.6418132 0 0.7668611 0.9955283 0 0.09446409 -0.110098 0 -0.9939207 0.2690655 0 -0.9631219 -0.9856629 0 -0.1687265 0.5436798 0 0.8392928 -0.9998555 0 0.01699951 0.671814 0 0.7407199 0.9957154 0 -0.09247034 -0.179662 0 -0.9837284 -0.4487574 0 0.8936537 0.9992579 0 -0.03851925 0.9445184 0 -0.3284587 -0.9977134 0 0.0675868 -0.8495197 0 -0.5275569 -0.1436879 0 0.9896231 -0.5923164 0 -0.8057055 -0.2692786 0 -0.9630623 0.4774528 0 -0.8786575 -0.2593113 0 0.9657938 0.8597403 0 0.5107316 0.9997223 0 -0.02356769 0.9942914 0 -0.1066989 -0.9292601 0 0.3694264 -0.9995775 0 -0.02906974 1 0 -4.51365e-4 -0.1417534 0 0.989902 -0.9965469 0 -0.08303152 0.7064893 0 -0.7077237 0.9995216 0 0.03092946 0.2362649 0 -0.9716887 0.9999282 0 0.01198918 -0.9974203 0 -0.07178237 0.2351428 0 0.9719608 -0.9835691 0 0.1805319 -0.05017447 0 0.9987406 0.7287123 0 0.6848199 -0.9350469 0 0.3545242 0.6389753 0 0.7692274 0.2021943 0 -0.9793454 -0.3226017 0 0.9465348 0.9422811 0 -0.3348227 0.359266 0 0.9332352 -0.8957585 0 0.4445413 0.9953495 0 0.09632916 0.7298377 0 -0.6836204 -0.9646082 0 -0.2636875 -0.03966152 0 0.9992133 0.6074821 0 -0.7943334 -0.9356401 0 -0.3529556 0.07568535 0 0.9971318 0.8838031 0 -0.4678591 -0.1117937 0 -0.9937315 -0.9989918 0 0.04489447 0.761569 0 0.6480839 0.7785271 0 -0.6276111 -0.9864925 0 -0.1638073 -0.4371158 0 0.8994052 0.09108164 0 0.9958435 0.9961399 0 -0.08777936 -0.7767674 0 -0.6297876 0.7070404 0 0.7071731 -0.1937299 0 -0.981055 -0.99899 0 -0.04493295 0.1225106 0 -0.9924673 -0.05975529 0 -0.9982131 -0.9982417 0 0.05927446 0.8947313 0 0.4466049 0.1926486 0 -0.9812678 -0.9995407 0 0.03030548 0.6014549 0 0.7989067 -0.1493205 0 0.9887889 -0.6216459 0 -0.7832984 -0.0021376 0 -0.9999978 -0.9984612 0 0.05545562 0.6001151 0 0.7999138 0 0 -1 -0.9994062 0 0.0344599 0.6444162 0 0.764675 -0.920021 0 -0.3918691 0.03693072 0 0.9993178 0.7380468 0 -0.6747496 -0.9995509 0 -0.02996695 0.5770983 0 0.8166746 0.04170759 0 -0.9991299 -0.9964363 0 -0.08434889 0.5067847 0 0.8620726 0 0 1 0.9996312 0 -0.02716129 -0.8093281 0 -0.5873569 -0.6575764 0 0.7533879 -0.3275146 0 0.9448462 -0.7120137 0 0.7021656 -0.9740607 0 -0.226287 0.06800161 0 -0.9976853 0.9757829 0 0.2187414 0.4462876 0 0.8948896 0.278632 0 0.960398 -0.983901 0 -0.1787148 -0.8305156 0 -0.5569954 0.8414634 0 0.5403142 -0.8213896 0 -0.5703677 -0.903613 0 -0.4283498 -0.4770718 0 0.8788644 -0.8479158 0 -0.530131 -0.7713167 0 -0.6364516 0.9723942 0 0.2333444 0.4000461 0 -0.9164951 0.3898315 0 0.9208862 0.9435043 0 0.3313606 -0.8799039 0 -0.4751518 -0.8855085 0 -0.4646232 -0.927654 0 -0.3734408 0.452973 0 -0.8915243 0.987691 0 0.1564182 0.9286152 0 0.3710446 0.5574951 0 0.8301802 -0.7974895 0 -0.6033329 -0.898057 0 -0.439879 -0.0943865 0 -0.9955357 0.4281093 0 -0.903727 0.2010827 0 -0.9795743 0.4280739 0 -0.9037437 0.9503573 0 0.3111608 -0.1981045 0 0.980181 -0.7466794 0 -0.6651841 0.901719 0 0.4323227 -0.3170071 0 -0.9484232 0.6407097 0 0.7677832 0.9311506 0 -0.364635 0.7628924 0 0.6465256 -0.9538819 0 -0.3001824 0.9695592 0 -0.2448573 0.8964004 0 0.4432453 0.8619358 0 0.5070177 0.2733309 0 -0.9619201 0.8364531 0 0.5480387 0.819929 0 0.5724652 -0.9727277 0 -0.23195 -0.2008632 0 0.9796194 0.2016984 0 -0.9794477 -0.2531753 0 0.9674205 0.3390824 0 0.9407567 -0.4511291 0 0.8924587 -0.714572 0 -0.699562 0.5337072 0 0.8456694 0.8588578 0 0.5122143 0.8301407 0 0.5575541 0.5501365 0 0.8350747 -0.2661227 0 0.9639392 -0.9958853 0 -0.09062383 -0.8585643 0 -0.5127059 -0.9759458 0 0.2180135 -0.4493915 0 -0.893335 0.7871884 0 0.6167127 0.9334985 0 0.3585813 -0.6616921 0 0.7497757 0.7129327 0 -0.7012326 0.9007968 0 -0.4342409 -0.6175495 0 -0.786532 -0.6988543 0 0.715264 0.8906856 0 0.4546199 0.08647253 0 -0.9962543 -0.6889424 0 0.7248161 0.939725 0 0.3419313 0.1145809 0 -0.993414 -0.9258417 0 0.3779119 -0.05186066 0 0.9986544 0.9969969 0 -0.0774425 -0.7148293 0 -0.699299 -0.8079394 0 0.5892656 0.8714439 0 0.4904954 0.4131986 0 -0.910641 0.178864 0 -0.9838738 -0.9997175 0 0.02376772 0.7781685 0 0.6280556 0.9898582 0 -0.1420596 -0.6693574 0 -0.7429406 0.06070009 0 0.9981561 0.8993497 0 0.43723 -0.304283 0 -0.9525817 -0.2361046 0 0.9717277 0.0358901 0 0.9993557 0.9996191 0 -0.02759852 -0.8385422 0 -0.5448368 -0.2082355 0 0.9780787 0.9938206 0 0.1109988 -0.5604024 0 -0.8282205 0.2144854 0 -0.9767272 -0.9927445 0 -0.1202429 0.6011111 0 0.7991655 -0.07312626 0 0.9973228 0.9948814 0 0.1010494 -0.5407819 0 -0.841163 -0.09984034 0 0.9950035 0.998915 0 0.04657014 -0.6087289 0 -0.7933784 0.9059975 0 0.4232831 0.07511189 0 -0.9971751 -0.7963951 0 0.6047767 -0.1776823 0 0.9840879 0.9911273 0 0.1329163 -0.5037023 0 -0.8638774 -0.1377225 0 0.9904709 0.9796605 0 0.2006624 -0.4213834 0 -0.9068826 0.14429 0 -0.9895355 -0.9999764 0 0.006872268 0.7625299 0 0.646953 -0.969381 0 -0.2455615 -0.08668774 0 0.9962355 0.684121 0 -0.7293686 0.2533422 0 -0.9673767 -0.9995879 0 -0.02870573 0.001875927 0 0.9999983 0.06115982 0 -0.998128 -0.9999998 0 -7.8875e-4 0.7354253 0 0.6776058 -0.1035219 0 0.9946272 0.9990804 0 0.04287713 -0.6564645 0 -0.7543569 -0.1964468 0 0.9805146 0.9971122 0 0.07594256 -0.6316139 0 -0.7752831 -0.2196017 0 0.9755896 0.9970098 0 -0.07727519 -0.5341942 0 -0.8453619 -0.9045535 0 -0.4263602 -0.06658673 0 0.9977806 0.7631942 0 -0.6461692 0.1941941 0 -0.9809631 -0.999937 0 0.01123431 0.8598142 0 0.5106072 -0.06645925 0 -0.9977892 -0.996089 0 -0.08835497 0.735234 0 0.6778134 0.6289421 0 -0.7774521 -0.9742242 0 -0.2255823 0.001495454 0 0.9999989 -0.3353542 0 0.9420922 0.9450567 0 0.3269066 -0.491951 0 -0.8706229 -0.1898673 0 0.9818099 0.9947692 0 0.1021496 -0.628652 0 -0.7776867 -0.9885307 0 -0.1510201 0.2476974 0 0.9688376 0.5378132 0 -0.8430641 -0.999808 0 -0.01959637 0.1276748 0 0.9918162 0.90495 0 -0.425518 -0.9575282 0 -0.2883398 0.0884442 0 0.9960812 0.6852286 0 -0.728328 -0.9960734 0 -0.08853151 0.2857797 0 0.9582953 0.9651268 0 -0.2617831 0.1070718 0 -0.9942514 -0.9870856 0 0.1601934 0.761402 0 0.6482801 0.9995343 0 -0.03051664 -0.1132674 0 -0.9935646 -0.6922603 0 0.7216479 -0.9996479 0 -0.02653674 0.791837 0 0.6107325 -0.8282083 0 -0.5604205 0.2015124 0 -0.979486 -0.994295 0 -0.1066652 0.630322 0 0.7763339 -0.9994422 0 -0.033396 0.5734813 0 0.8192186 0.02843013 0 -0.9995958 0.2649879 0 -0.9642518 -0.933774 0 -0.3578635 0.1366673 0 0.9906171 -0.3628967 0 -0.9318293 -0.521674 0 0.8531449 0.9069614 0 0.4212138 0.3131993 0 -0.9496874 -0.9317098 0 -0.3632036 0.449936 0 0.8930609 0.07028926 0 0.9975267 0.9987545 0 0.04989615 -0.7908608 0 -0.6119961 -0.5007778 0 -0.8655759 -0.3437495 0 0.9390614 0.8556501 0 0.5175548 -0.0343186 0 -0.999411 -0.9944228 0 0.1054673 0.5189288 0 0.8548175 0.08436748 0 -0.9964347 -0.9986778 0 -0.05140735 0.6192725 0 0.7851762 -0.9771978 0 -0.2123313 0.1776441 0 0.9840949 0.8743536 0 -0.4852895 0.1580076 0 -0.987438 -0.9923739 0 -0.1232643 0.579887 0 0.814697 0.1096328 0 -0.9939722 -0.9983944 0 -0.05664568 0.4974656 0 0.8674838 -0.1166782 0 0.9931698 0.9789997 0 -0.2038617 -0.8082135 0 -0.5888896 0.9840149 0 0.1780869 -0.1209111 0 -0.9926634 -0.7070427 0 0.7071708 -0.9747744 0 -0.2231927 -0.1712961 0 0.9852196 0.2008889 0 -0.9796141 0.9829429 0 0.1839113 -0.1143829 0 -0.9934368 -0.725652 0 0.6880619 0.7712837 0 -0.6364917 -0.9661655 0 -0.2579234 -0.2905344 0 0.9568647 -0.1431247 0 0.9897047 0.3076339 0 -0.9515049 -0.9991525 0 -0.04116393 -0.2489548 0 0.9685152 0.9955696 0 0.09402773 -0.2178491 0 -0.9759825 0.9752464 0 -0.2211208 -0.7393258 0 -0.6733479 0.1686029 0 0.9856841 0.1963853 0 -0.9805269 -0.9902335 0 -0.1394186 0.550378 0 0.8349156 0.1790165 0 -0.9838461 -0.9871056 0 -0.1600704 0.4865286 0 0.8736647 0.9891226 0 -0.1470934 -0.6707391 0 -0.7416934 0.4956387 0 0.8685289 0.9890671 0 0.147466 -0.1394077 0 -0.9902351 -0.8587145 0 0.5124545 -0.17964 0 0.9837324 0.9740821 0 -0.226195 -0.9354599 0 -0.353433 -0.2160344 0 0.9763858 0.9945203 0 0.1045445 -0.6384178 0 -0.7696901 0.4927575 0 0.8701668 0.3621719 0 -0.9321114 -0.8504305 0 -0.5260875 -0.3212908 0 0.9469806 0.8946338 0 0.4468001 0.1638347 0 -0.9864878 0.1981642 0 -0.9801689 -0.9944476 0 -0.1052334 0.5454159 0 0.8381656 0.01201673 0 -0.9999278 -0.9959836 0 0.08953559 0.608705 0 0.7933966 0.9037476 0 0.4280659 0.3642613 0 -0.9312969 -0.9463483 0 0.3231486 -0.3506689 0 -0.9364995 -0.3999038 0 0.9165572 0.9725118 0 -0.2328534 -0.8381472 0 0.5454441 0.5565383 0 -0.8308219 0.9147578 0 -0.4040025 -0.3342675 0 0.9424783 1 0 -3.40993e-4 0.3719891 0 0.9282371 -0.7313651 0 0.6819861 0.9918134 0 -0.1276969 0.7985722 0 0.601899 -0.9981569 0 -0.06068695 0.4619875 0 0.8868865 -0.5820728 0 0.8131367 0.2041308 0 -0.9789436 -0.3931026 0 0.9194946 -0.9311561 0 0.3646209 0.998392 0 0.05668816 -0.5248435 0 -0.8511987 0.8782667 0 -0.4781711 0.5105633 0 0.8598402 0.5806803 0 -0.8141317 0.9473908 0 0.3200792 0.448227 0 0.8939199 0.9744612 0 -0.2245561 0.5829462 0 0.8125107 -0.9865996 0 -0.1631605 0.5603475 0 0.8282576 -0.5205992 0 0.8538012 -0.8040822 0 -0.5945183 0.3694352 0 0.9292566 -0.6361811 0 0.7715398 0.8451488 0 0.5345312 -0.4287164 0 -0.9034391 0.762641 0 -0.6468222 -0.8315956 0 -0.5553817 0.3074768 0 0.9515557 -0.5341157 0 0.8454114 -0.9247774 0 -0.3805086 0.3866577 0 0.9222233 -0.6114593 0 0.7912759 -0.5106881 0 0.8597661 0.9461951 0 -0.3235969 0.6264501 0 0.7794615 -0.8486427 0 -0.5289665 0.06041799 0 0.9981732 -0.7460452 0 0.6658953 -0.8052112 0 -0.5929883 0.05205991 0 0.9986441 -0.6542549 0 0.7562742 0.986592 0 0.1632061 -0.4923435 0 -0.870401 0.690581 0 -0.723255 0.4020418 0 -0.9156213 -0.8842413 0 0.4670303 -0.6484131 0 -0.7612888 0.7456286 0 0.6663618 0.1002271 0 -0.9949647 0.598502 0 -0.8011215 0.9567689 0 0.2908495 -0.4808795 0 -0.8767868 0.6294744 0 -0.7770213 -0.8574388 0 -0.514586 0.4564378 0 0.8897554 -0.664685 0 0.7471238 -0.8717157 0 -0.490012 0.4608372 0 0.8874848 -0.6999015 0 0.7142394 -0.9922082 0 -0.124591 0.3535464 0 0.9354171 -0.7931635 0 0.6090087 0.4723858 0 -0.8813919 -0.9329038 0 0.3601258 -0.6287016 0 -0.7776467 0.9994602 0 0.03285412 -0.5848935 0 -0.8111101 0.7771605 0 -0.6293025 0.9234176 0 0.383797 -0.1472679 0 -0.9890967 0.5469474 0 -0.8371671 0.5743361 0 0.8186197 0.4387172 0 -0.8986253 0.8391439 0 -0.5439096 -0.7788851 0 -0.6271667 0.05783359 0 0.9983263 -0.8758255 0 0.482628 -0.9140857 0 -0.4055211 0.3923952 0 0.9197968 -0.7057211 0 0.7084898 -0.2839837 0 -0.9588292 -0.9875713 0 0.1571719 -0.6673093 0 -0.7447807 0.06027003 0 -0.9981822 -0.9993965 0 0.0347371 -0.9187551 0 -0.3948279 0.05417635 0 -0.9985315 -0.9257348 0 0.3781735 -0.6081356 0 -0.7938332 0.1121333 0 -0.9936933 -0.9999485 0 0.01015436 -0.8913949 0 -0.4532276 0.9372111 0 0.3487628 -0.4723858 0 -0.8813919 0.6124109 0 -0.7905397 -0.024738 0 0.999694 0.9947619 0 -0.1022195 0.8453194 0 0.5342612 -0.5678069 0 -0.8231618 0.8381602 0 0.5454242 -0.9059443 0 -0.4233969 0.9200779 0 0.3917355 -0.3969058 0 -0.9178594 0.7172258 0 -0.6968409 -0.4431815 0 -0.8964319 -0.5743829 0 0.8185868 -0.8308913 0 -0.5564348 0.7648885 0 0.6441628 0.2793927 0 -0.9601769 0.7487913 0 -0.6628058 0.8286569 0 -0.5597571 -0.6853788 0 -0.7281867 -0.05967998 0 -0.9982176 0.7711127 0 0.6366987 -0.05203631 0 -0.9986452 0.8217348 0 -0.5698701 -0.9297401 0 -0.3682166 0.209056 0 0.9779037 -0.5939071 0 0.8045337 0.9023984 0 -0.4309027 -0.7624374 0 -0.647062 -0.2254286 0 -0.9742597 0.9892031 0 0.146551 -0.3082123 0 -0.9513176 0.3725551 0 -0.9280101 0.8444288 0 0.5356679 -0.3912364 0 -0.9202902 0.5919492 0 -0.8059753 0.06561969 0 -0.9978447 -0.9860274 0 0.1665837 -0.7532057 0 -0.6577851 0.8169317 0 0.5767345 -0.3826969 0 -0.923874 0.6293249 0 -0.7771423 0.8422083 0 0.5391523 -0.2990726 0 -0.9542304 0.5610972 0 -0.82775 -0.9658298 0 -0.2591773 0.5222406 0 0.8527982 -0.6499057 0 0.7600149 -0.05326762 0 0.9985803 0.9225039 0 -0.3859878 0.6896981 0 0.7240971 0.1923124 0 -0.9813338 -0.7163687 0 0.6977218 0.08147773 0 -0.9966752 -0.08030393 0 0.9967704 0.8867589 0 -0.4622323 0.7221259 0 0.6917617 0.5532842 0 0.8329926 0.523452 0 -0.8520553 0.9349802 0 -0.3546998 -0.5049096 0 0.8631722 0.933075 0 0.3596818 -0.1155633 0 0.9933001 -0.9140951 0 -0.4054999 0.09739585 0 0.9952458 -0.6732828 0 0.7393851 0.5536054 0 0.8327791 0.5361362 0 -0.8441315 0.9724441 0 0.2331367 0.8760914 0 0.4821453 -0.06740837 0 -0.9977255 0.7827178 0 -0.6223768 0.8486208 0 0.5290018 -0.05270436 0 -0.9986103 0.721683 0 -0.6922238 0.4028324 0 0.9152737 -0.2041106 0 -0.9789478 0.9221508 0 0.3868307 -0.07035498 0 0.9975221 0.9992408 0 -0.03896029 0.7185578 0 0.6954673 -0.99232 0 -0.1236975 0.7313668 0 0.6819843 -0.7843691 0 0.6202945 -0.8448566 0 -0.5349929 0.5148326 0 0.8572907 -0.7998036 0 0.6002618 -0.9142758 0 0.4050927 0.7686574 0 0.6396608 0.224919 0 0.9743776 -0.5927331 0 -0.8053989 -0.4316192 0 0.902056 -0.6653973 0 0.7464894 0.7042528 0 0.7099493 -0.3523817 0 -0.9358564 0.5942086 0 -0.804311 0.9917996 0 0.1278032 -0.3762949 0 -0.9265 0.4752298 0 -0.8798617 -0.56591 0 0.824467 0.9865996 0 -0.1631605 0.5093086 0 0.860584 0.6853678 0 -0.728197 -0.8114336 0 -0.5844447 0.06075026 0 -0.9981531 -0.9211214 0 0.3892757 -0.8495197 0 0.527557 0.9999502 0 0.009984153 0.9549667 0 0.2967133 0.4636495 0 -0.8860188 0.8516885 0 -0.5240484 -0.9511895 0 -0.3086078 -0.974857 0 -0.2228319 0.003465775 0 0.999994 -0.1064088 0 0.9943225 0.6631777 0 -0.748462 0.635849 0 -0.7718136 -0.9318368 0 -0.3628778 -0.9350474 0 -0.3545228 0 0 1 0.2304826 0 0.9730765 0.6972539 0 -0.7168243 0.9532726 0 -0.3021117 -0.1344531 0 -0.9909201 -0.1121578 0 -0.9936905 -0.9963138 0 0.08578505 -0.9977775 0 0.06663409 0.7139198 0 0.7002275 0.8255553 0 0.5643213 0.826518 0 -0.5629103 0.7287124 0 -0.68482 -0.9905512 0 -0.1371436 -0.9514081 0 -0.3079329 -0.2429187 0 0.9700466 -0.5682889 0 0.8228291 -0.02795954 0 0.9996091 0.3112041 0 0.9503432 0.988424 0 -0.1517169 0.9953594 0 -0.09622829 -0.6051434 0 -0.7961166 -0.8618036 0 -0.5072421 0.7612361 0 0.6484749 0.6699421 0 0.7424134 -0.2442431 0 -0.969714 -0.2143113 0 -0.9767654 -0.9999502 0 0.009984466 -0.9800274 0 -0.1988625 0.2415358 0 -0.970392 -0.09983196 0 -0.9950043 0.1614689 0 -0.9868779 -0.3225999 0 -0.9465354 -0.9999664 0 -0.008194879 -0.9842383 0 0.1768477 0.8449025 0 0.5349205 0.9323649 0 0.3615186 0.3242202 0 -0.9459816 0.1215676 0 -0.9925832 -0.9962317 0 0.08673263 -0.9999505 0 0.009963261 0.6251031 0 0.7805422 0.5434961 0 0.8394117 -0.3310002 0 0.9436307 -0.04771526 0 0.9988611 -0.6503313 0 -0.7596507 -0.5631533 0 -0.8263524 0.001050614 0 -0.9999995 -0.009191226 0 -0.9999578 -0.9998764 0 0.01572946 -0.9913096 0 0.1315494 0.7156274 0 0.6984822 0.5720118 0 0.8202454 0 0 -1 0 0 -1 -0.9990783 0 0.04292668 -0.9996731 0 0.02556553 0.6141332 0 0.7892023 0.6775036 0 0.7355195 -0.9225097 0 -0.385974 -0.9236477 0 -0.3832426 0.00114967 0 0.9999994 0.1119853 0 0.9937099 0.5959021 0 -0.8030571 0.8436267 0 -0.5369301 -0.999609 0 -0.02796411 -0.9973969 0 -0.07210648 0.5051647 0 0.863023 0.6216965 0 0.7832583 0.01154771 0 -0.9999334 0.1015483 0 -0.9948306 -0.9980419 0 -0.0625498 -0.9915853 0 -0.1294552 0.4819259 0 0.8762121 0.530897 0 0.8474364 0 0 1 0 0 1 0.9999338 0 -0.01150909 0.9975252 0 -0.07031033 -0.768686 0 -0.6396265 -0.8606579 0 -0.5091837 0.9800546 0 0.1987291 0.9947754 0 0.1020885 0.07663597 0 -0.9970592 -0.1374534 0 -0.9905083 -0.5240991 0 0.8516574 -0.665978 0 0.7459714 -0.01901833 0 0.9998192 -0.1684138 0 0.9857164 0.9999998 0 -7.18923e-4 0.9999699 0 -0.007770432 0.003540201 0 -0.9999938 -0.1200602 0 -0.9927666 0.07867931 0 0.9969 0.004708902 0 0.9999889 0.9990523 0 -0.04352843 0.9951751 0 -0.09811563 -0.8123847 0 -0.5831219 -0.7801819 0 -0.6255528 0.003662277 0 -0.9999933 0.04435398 0 -0.999016 0.724061 0 0.6897359 0.6402763 0 0.7681448 0.2742438 0 -0.9616602 0.04318501 0 -0.9990671 0.7078742 0 0.7063385 0.5878881 0 0.8089423 0.1344651 0 -0.9909184 -0.1344844 0 -0.9909157 -0.9607381 0 0.2774571 -0.9987803 0 0.04937622 0.3888739 0 0.921291 0.5851995 0 0.8108894 0.8765621 0 0.481289 0.9445184 0 0.3284586 0 0 -1 -0.1449616 0 -0.9894373 -0.5218863 0 0.8530151 -0.8100175 0 0.5864059 0.02797433 0 0.9996086 0.151734 0 0.9884214 0.999942 0 0.01077731 0.9975668 0 -0.06971835 -0.846757 0 -0.53198 -0.9565589 0 -0.2915395 0.2599555 0 0.9656206 -0.1294792 0 0.9915822 0.9771532 0 0.2125363 0.9982682 0 -0.05882771 -0.8192635 0 -0.5734172 -0.8430049 0 -0.5379059 -0.7019144 0 0.7122614 -0.5923244 0 0.8056996 0.9999664 0 -0.008199745 0.9633635 0 0.2681991 -0.2079301 0 -0.9781437 0.0961352 0 -0.9953683 0.3757986 0 -0.9267014 0.1789185 0 -0.9838639 -0.9526129 0 -0.3041857 -0.9999859 0 -0.005332756 0.4304381 0 0.9026201 0.6032478 0 0.7975539 -1 0 0 -0.9986293 0 0.05233959 0.6907825 0 0.7230626 0.6721536 0 0.7404118 0.99055 0 -0.1371526 0.997928 0 -0.0643404 -0.2841958 0 -0.9587663 -0.1072927 0 -0.9942275 -0.5049357 0 0.863157 -0.2774543 0 0.9607388 0.9914607 0 -0.1304068 0.9997574 0 0.02202918 0.9655116 0 -0.26036 0.9154238 0 -0.4024913 -0.9493318 0 0.3142754 -0.9739028 0 -0.2269657 -0.781429 0 -0.6239942 -0.8957565 0 -0.4445452 -0.3670483 0 0.9302019 0.1256159 0 0.992079 -0.5444847 0 -0.8387709 -0.64182 0 -0.7668554 -0.06882656 0 -0.9976287 -0.4137044 0 -0.9104113 0.5828105 0 -0.8126082 0.3592672 0 -0.9332348 -0.3757916 0 0.9267042 -0.1620566 0 0.9867815 0.8609952 0 0.5086131 0.8527366 0 0.5223412 0.9999007 0 -0.01409881 0.9993034 0 -0.03731883 0.99714 0 -0.07557709 0.9890363 0 -0.1476729 -0.9435293 0 0.3312892 -0.9219903 0 0.3872131 -0.9998304 0 -0.01842006 -0.9986189 0 -0.05253867 1 0 0 0.9999999 0 -5.26562e-4 -0.1258756 0 0.9920461 -0.1757283 0 0.9844387 -0.9766781 0 -0.2147092 -0.9992582 0 -0.03851042 0.6951429 0 -0.7188717 0.7215796 0 -0.6923316 0.9989085 0 0.0467121 0.9998051 0 0.01974261 0.2019374 0 -0.9793984 0.288539 0 -0.9574682 0.999922 0 0.01249574 0.9999464 0 0.01035267 -0.9879965 0 -0.1544766 -0.9994298 0 0.03376898 0.191239 0 0.9815435 0.3011453 0 0.9535784 -0.9894515 0 0.1448649 -0.9752212 0 0.2212325 0 0 1 -0.1446461 0 0.9894835 0.6694482 0 0.7428588 0.778527 0 0.6276111 -0.9307656 0 0.3656164 -0.9356407 0 0.3529541 0.6987791 0 0.7153375 0.5550527 0 0.8318152 0.2824988 0 -0.9592677 0.184252 0 -0.982879 -0.4807298 0 0.8768688 -0.05975489 0 0.9982131 0.953733 0 -0.3006548 0.9229873 0 -0.3848304 0.2439707 0 0.9697827 0.477454 0 0.8786567</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape3-binormals-array" count="869" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape3-map1" name="qt_gauge_background_Shape3-map1">
+ <float_array id="qt_gauge_background_Shape3-map1-array" count="1738">1 0.5 0 0.5000011 0.4571066 1 0 0.5019701 0 0.4980326 0.4571066 0 0 0.46875 0.9970382 0.46875 0.03072054 0.25 0.8313431 0.25 0.3333333 0.01910258 0.3437127 0.25 0.1294944 0.125 0.3598101 0.1417625 0.7367243 0.125 0.6666667 0.05947889 0.6431298 0.125 0.6540521 0.07842714 0.3449101 0.07538277 0.5 0.002485967 0.5047455 0.06081563 0.5 0.125 0.6373272 0.2316199 0.299816 0.4782251 0.003369201 0.375 0.3355418 0.370951 0.9532814 0.375 0.6527138 0.3567795 0.6885306 0.4711462 0.8313431 0.75 0.03072024 0.75 0.349355 0.76838 0.003369061 0.625 0.3355418 0.6391715 0.9532814 0.625 0.6527138 0.6209511 0.6386844 0.75 0.3333333 0.9808974 0.1294943 0.875 0.3449101 0.875 0.7367243 0.875 0.6282299 0.8582375 0.6666667 0.9405211 0.3284796 0.926845 0.6431298 0.9210076 0.5 0.875 0.4919655 0.9391844 0.5 0.997514 0.6851798 0.9157001 0.881445 0.4359133 0.7443458 0.207979 0.2722661 0.1686458 0.2699787 0.07076633 0.683071 0.1060727 0.612263 0.08520757 0.6127505 0.06358987 0.4857917 0.02041817 0.4447739 0.0840672 0.4436628 0.2083263 0.2234904 0.4055273 0.2353794 0.2915863 0.8168201 0.3321557 0.5505152 0.2876868 0.5545151 0.4025893 0.7170359 0.708253 0.1225181 0.666132 0.09319387 0.4770526 0.7591565 0.5728815 0.5538571 0.5226038 0.5503632 0.6660516 0.2751936 0.8950984 0.1648248 0.792021 0.6824345 0.8313542 0.3928188 0.8385835 0.5586358 0.9601755 0.602953 0.8918806 0.4445327 0.8942332 0.3821873 0.9489964 0.6825544 0.8919595 0.7590792 0.4026696 0.6870849 0.1646804 0.1647221 0.2083333 0.2758496 0.1069115 0.6853878 0.08431119 0.5551575 0.1057668 0.558877 0.03982456 0.3871276 0.05103437 0.4258843 0.02560205 0.3930584 0.1080446 0.6031836 0.1614165 0.4956311 0.1650276 0.1029327 0.4359903 0.1225182 0.332437 0.7170258 0.2876868 0.4452195 0.3320753 0.4443747 0.4392704 0.8168201 0.6657704 0.2354821 0.7122329 0.09309085 0.4899689 0.2234891 0.5775029 0.1029163 0.5369762 0.09317754 0.4952585 0.9032818 0.4808438 0.8823549 0.5353751 0.4436852 0.5765551 0.4450438 0.7122329 0.2696313 0.9292644 0.2677084 0.8353196 0.7443559 0.7916667 0.5519902 0.7916738 0.5038645 0.8349724 0.6079495 0.9364215 0.5549164 0.9148037 0.3835471 0.9159635 0.4855506 0.9795818 0.4256432 0.974398 0.7016954 0.9077606 0.6518075 0.9290135 0.6899478 0.9050385 0.9751598 0.421875 0.873139 0.4607711 0.8175695 0.4215686 0.7840337 0.1875 0.7344398 0.2484982 0.7119206 0.1861512 0.2612663 0.1346561 0.3532107 0.1888249 0.2198325 0.187653 0.2314138 0.07205129 0.3295184 0.05589185 0.2600585 0.08935721 0.6901794 0.1331241 0.6511005 0.0952324 0.6906498 0.09484673 0.5821616 0.09394134 0.6047192 0.07163447 0.6529175 0.07102469 0.58411 0.05348065 0.4785533 0.001242984 0.5167086 0.03140261 0.4623441 0.02555945 0.4175822 0.0660847 0.5003022 0.0938425 0.417793 0.0950034 0.4982827 0.2484982 0.4777592 0.1873231 0.1721248 0.37051 0.3319222 0.4222662 0.1650977 0.4222266 0.1958233 0.25 0.3384988 0.3121522 0.1788664 0.3121522 0.8923123 0.3125 0.7928689 0.3693311 0.7635888 0.3108968 0.6411213 0.2932085 0.4994229 0.3108968 0.499174 0.3690598 0.6606258 0.4079977 0.5014341 0.4216033 0.7344739 0.75 0.6411554 0.6871523 0.7635888 0.6871523 0.01704465 0.6875 0.1721246 0.6221945 0.1788663 0.688679 0.1179767 0.4841617 0 0.4833913 0.1192427 0.4606376 0.792876 0.6205865 0.660633 0.5469093 0.8179548 0.5514758 0.4992134 0.4779261 0.4968864 0.5476487 0.4988086 0.6218419 0.4979356 0.6886789 0.2598166 0.8669748 0.3293514 0.9053596 0.2588861 0.9108995 0.08010725 0.8125 0.1961701 0.7515018 0.2197714 0.8138487 0.6887298 0.8652451 0.6270307 0.8111751 0.7115467 0.812347 0.417793 0.8671745 0.3308319 0.8305708 0.440118 0.8305708 0.5833334 0.9690176 0.5158948 0.9685974 0.5828882 0.9465194 0.5587257 0.8655437 0.6485409 0.8951891 0.5810434 0.9046454 0.4994884 0.9060587 0.4164654 0.9061575 0.3279381 0.9442119 0.393005 0.934019 0.4095625 0.961679 0.6497223 0.1694292 0.08010744 0.1875 0.3323814 0.1044598 0.7016954 0.09223944 0.5810434 0.1328255 0.5833334 0.03098243 0.4107842 0.03832102 0.39522 0.009551288 0.4401107 0.1344564 0.558688 0.1694292 0.001709093 0.421875 0.01704487 0.3125 0.8923123 0.6875 0.3388457 0.7065202 0 0.4990168 0.1179704 0.4895629 0.3319221 0.5694325 0.1650911 0.5526293 0.00168453 0.563485 0.1192245 0.5069317 0 0.5009856 0.9985191 0.484375 0.873842 0.5013261 0.9766407 0.5625 0.4990064 0.7515018 0.2314138 0.9279487 0.7840337 0.8125 0.5202107 0.8126769 0.5809398 0.9284037 0.4785533 0.998757 0.4615303 0.9744406 0.39522 0.9904487 0.7047897 0.9017894 0.6774782 0.9236753 0.6703463 0.919586 0.9043998 0.4140625 0.9304366 0.4467708 0.8119737 0.4471778 0.7455471 0.1770833 0.7736174 0.2239583 0.7104795 0.2207696 0.2185423 0.1534896 0.3088585 0.1566146 0.2939245 0.1979167 0.222411 0.08821747 0.289411 0.05435332 0.2995529 0.07132933 0.7020458 0.1143088 0.6703464 0.1144271 0.6722184 0.09159987 0.6321726 0.08102696 0.6237727 0.09895834 0.5767781 0.0775644 0.6281606 0.06107171 0.6321725 0.06994297 0.5767781 0.06168195 0.4701311 0.01193638 0.4959117 0.01425529 0.4918697 0.03487216 0.4049361 0.07867073 0.4660836 0.075983 0.4652778 0.09895834 0.5161599 0.2207696 0.409704 0.2239583 0.4062579 0.1802083 0.1417955 0.3933073 0.2661886 0.3925839 0.2590654 0.43125 0.1596066 0.2760417 0.2772152 0.2760417 0.2708155 0.3221933 0.8272153 0.3020833 0.8633903 0.3477344 0.758193 0.3444792 0.4740766 0.2760417 0.5855263 0.2679571 0.5881237 0.3147656 0.4726168 0.3925839 0.5928997 0.3863802 0.5991051 0.4264225 0.7637979 0.7239584 0.6856635 0.7239584 0.6966517 0.67636 0.08699521 0.6979167 0.07888104 0.6498177 0.2019409 0.6523496 0.1629482 0.4739652 0.05640101 0.4859086 0.05654752 0.4723256 0.8309125 0.5924479 0.7172796 0.5905006 0.7300907 0.535485 0.466695 0.5053126 0.5991051 0.5041569 0.5928997 0.5591725 0.4726168 0.6523495 0.5881237 0.6490943 0.5856173 0.6979167 0.2303946 0.8872727 0.2995529 0.885573 0.2964266 0.911033 0.1475142 0.8229167 0.1182112 0.7760417 0.2306021 0.7792304 0.7084956 0.8465104 0.6610408 0.8433855 0.6696571 0.8020834 0.4370834 0.8514062 0.3687579 0.8514063 0.375907 0.8150637 0.5972222 0.9539975 0.53957 0.9733533 0.5382057 0.9533662 0.5629167 0.8855729 0.6144671 0.8800001 0.6237727 0.9059358 0.4049361 0.8855729 0.4652778 0.885573 0.4639135 0.9117444 0.3649197 0.9594157 0.3591038 0.9395202 0.4209835 0.9468272 0.6703464 0.9060541 0.6675686 0.8800001 0.7020458 0.8856912 0.7299747 0.4264225 0.7172796 0.3863802 0.8307965 0.3933073 0.6760939 0.1898321 0.6703463 0.1485938 0.7084956 0.1534896 0.2296769 0.2239583 0.1182114 0.2239583 0.1475143 0.1770833 0.2995529 0.09169157 0.3023307 0.12 0.2303947 0.1127274 0.6722184 0.08051588 0.6774782 0.07632476 0.7047897 0.0982106 0.5928344 0.1144271 0.5347222 0.1144271 0.5355281 0.08825564 0.5403758 0.04663374 0.53957 0.02664672 0.5972222 0.04600254 0.4296814 0.05317285 0.3687579 0.06075641 0.3649197 0.0405843 0.4506197 0.03780147 0.3921617 0.02341582 0.4354088 0.01539817 0.4370834 0.1144271 0.3780634 0.12 0.3687579 0.0933913 0.5629167 0.1485938 0.6237727 0.1485938 0.6165427 0.1849362 0.5443543 0.1898321 0.442436 0.1566146 0.5000001 0.1485938 0.1765738 0.4482563 0.05724943 0.4466938 0.07128999 0.4140625 0.201941 0.347011 0.07888119 0.3477344 0.08699542 0.3020833 0.6966517 0.3147656 0.6855725 0.2679571 0.763798 0.2760417 0.525285 0.3444792 0.4043756 0.347011 0.4058353 0.3020833 0.5314904 0.4520736 0.3973825 0.4532292 0.4033043 0.4133391 0.7581929 0.6490943 0.8633902 0.6498177 0.8272153 0.6979167 0.2708155 0.684511 0.2781404 0.7320429 0.1596064 0.7239584 0.05638889 0.4943044 0.05639081 0.4924192 0.162808 0.4842248 0.2590635 0.5428376 0.2661886 0.5998756 0.1417935 0.5925251 0.1765635 0.5171292 0.07127777 0.5681178 0.05722274 0.5267231 0.05638889 0.4951247 0.162938 0.4910107 0.05652085 0.5006817 0.8311027 0.4781152 0.9401696 0.4728125 0.9410483 0.491875 0.9319323 0.5244271 0.9051329 0.5676302 0.8124747 0.5143392 0.525285 0.5905006 0.4033043 0.5998756 0.3973824 0.5415365 0.5227786 0.7239584 0.4067606 0.7320429 0.4043756 0.6845109 0.2964266 0.9289473 0.2894109 0.9456467 0.2224109 0.9117826 0.2883219 0.8101679 0.2995529 0.8514062 0.2185423 0.8465105 0.7105704 0.7760417 0.7736174 0.7760417 0.7455471 0.8229167 0.4815296 0.7792304 0.5819114 0.7760417 0.5862727 0.8197917 0.4533352 0.8101679 0.5553343 0.8433855 0.5 0.8514063 0.5680802 0.938318 0.6237727 0.9301589 0.6281606 0.9389283 0.5928344 0.919075 0.5333579 0.9224356 0.5347222 0.9010417 0.4226635 0.924017 0.3591039 0.9216059 0.3687579 0.9010417 0.4896996 0.9651278 0.4959117 0.9857447 0.470131 0.9880636 0.4354088 0.9846018 0.3921616 0.9765842 0.4484496 0.9621986 0.6934956 0.9127247 0.6723437 0.9224201 0.6889688 0.9114431 0.9205813 0.4300521 0.8729897 0.4476017 0.8513829 0.4301538 0.7620274 0.1992187 0.7407974 0.2257653 0.7293643 0.1984216 0.2640341 0.1528906 0.3054477 0.1771745 0.2484483 0.1763932 0.2521557 0.0708724 0.2954651 0.06298552 0.2626749 0.07884135 0.6882828 0.1169235 0.6710289 0.1009859 0.6887509 0.100838 0.6296469 0.08926716 0.5987488 0.08840153 0.6073766 0.07843576 0.6307439 0.06594051 0.6073766 0.06623406 0.5998458 0.05907679 0.4825746 0.01227416 0.4982187 0.02560491 0.4767163 0.02332777 0.4330327 0.07586995 0.4689515 0.08800618 0.4328313 0.08867811 0.4675771 0.2257653 0.4035068 0.2 0.4601878 0.1992028 0.2009914 0.3905614 0.2706152 0.4129897 0.1980093 0.4131706 0.2166964 0.2734375 0.2796598 0.3006004 0.2101566 0.3006004 0.8500037 0.3239128 0.8073877 0.3489128 0.7926534 0.323099 0.5287896 0.2714164 0.5923623 0.2918265 0.529439 0.2987435 0.530268 0.3888296 0.6017269 0.4065601 0.5318193 0.4117829 0.7263004 0.7265625 0.6860294 0.6990379 0.7375293 0.6990379 0.07634878 0.6754753 0.1439831 0.6472346 0.147288 0.6761083 0.1112322 0.4805211 0.05602512 0.4800341 0.1114031 0.4708629 0.7753168 0.5939924 0.7172307 0.5614443 0.7851254 0.5631551 0.5303389 0.5022111 0.6017269 0.5327594 0.5287876 0.5330484 0.529074 0.6470537 0.5923851 0.6752945 0.5284474 0.6761082 0.2646708 0.8834718 0.297219 0.8996724 0.2638892 0.901797 0.1275872 0.8007813 0.1777077 0.7742347 0.1896429 0.8015785 0.6875689 0.8471094 0.6615343 0.8228256 0.6961728 0.8236068 0.4028492 0.8503386 0.3652658 0.8329717 0.4111643 0.8329717 0.5689203 0.9637201 0.5381806 0.9634002 0.5685792 0.9534538 0.5864293 0.8816537 0.6252205 0.8945569 0.5952835 0.898398 0.4328313 0.8830469 0.4684089 0.8998502 0.4324902 0.8998501 0.3601055 0.9483775 0.3898829 0.9432051 0.3961847 0.9551 0.6698664 0.8945865 0.6875883 0.8816832 0.6882828 0.8985755 0.7172017 0.4065601 0.7752878 0.3890104 0.7849513 0.4119637 0.6719977 0.1682523 0.6898953 0.1508854 0.697782 0.1743721 0.1774765 0.2265625 0.1275873 0.1992187 0.1894116 0.1992187 0.2986951 0.10485 0.2653652 0.1179214 0.2646708 0.09888417 0.6728119 0.07760534 0.6934956 0.08727527 0.6894368 0.08858237 0.5666114 0.1169531 0.5314515 0.1001499 0.5668129 0.1001499 0.5387232 0.03659974 0.5689203 0.03627999 0.5691217 0.04654628 0.4009987 0.05686405 0.362519 0.0516917 0.3983591 0.04489997 0.4207187 0.03155667 0.4132343 0.01889153 0.4438343 0.02631026 0.4117034 0.1183464 0.365805 0.1052749 0.4028492 0.1014338 0.5952835 0.1496615 0.6257395 0.1670283 0.5869482 0.1670283 0.4901698 0.1751533 0.4713035 0.1516667 0.5253942 0.1682523 0.1152657 0.447775 0.06062476 0.4300328 0.1319863 0.4304234 0.1439832 0.3495457 0.07634896 0.3239128 0.1472882 0.3237319 0.6860067 0.2918265 0.7262776 0.2714164 0.7375293 0.2987435 0.4685262 0.3487319 0.3982004 0.3237319 0.4688912 0.323099 0.4683294 0.4553361 0.3947481 0.4314858 0.4698098 0.4311969 0.8073877 0.6464207 0.8500037 0.6754753 0.7926534 0.6752945 0.2798911 0.7079927 0.2169276 0.7285837 0.2101565 0.7010757 0.05597271 0.4936671 0.1111905 0.4873179 0.1111881 0.4891822 0.2706146 0.571746 0.2009909 0.5963554 0.1980064 0.5650897 0.1319747 0.5423083 0.0606048 0.5475582 0.1152482 0.5213224 0.1112206 0.4914119 0.1113856 0.4978659 0.05600522 0.4967581 0.8840984 0.4722632 0.9419097 0.4820573 0.8844563 0.4882788 0.9217554 0.5464518 0.8520542 0.5412475 0.8738738 0.5184937 0.4682584 0.5958493 0.3947481 0.5714207 0.466778 0.5629572 0.4684959 0.7285837 0.3984317 0.7079926 0.4678996 0.7010757 0.2946836 0.9370837 0.2521557 0.9291276 0.2618933 0.9212278 0.2951929 0.8317477 0.2617077 0.8491146 0.2470476 0.8256279 0.7408201 0.7734376 0.7620273 0.8007813 0.729387 0.8007813 0.5297492 0.7742347 0.5872899 0.8000001 0.5373673 0.8007972 0.5086952 0.8248467 0.5281392 0.8483334 0.4740283 0.8317478 0.5965744 0.9337914 0.6286439 0.934085 0.5976713 0.9409232 0.5662703 0.9215897 0.5309089 0.9115985 0.5666114 0.9107584 0.390303 0.9241992 0.3610651 0.9113911 0.3992442 0.9119939 0.4976762 0.974395 0.4825746 0.9877258 0.4761738 0.9766722 0.4132343 0.9811085 0.4201761 0.9684434 0.4432918 0.9736897 0.7192098 0.8913803 0.6841811 0.9241408 0.6559592 0.9329676 0.6486913 0.9259229 0.6701319 0.9143912 0.7085699 0.892301 0.9642206 0.3984375 0.986099 0.4453125 0.9362159 0.4618229 0.8004533 0.4636572 0.7600738 0.4414632 0.8763267 0.4010612 0.760379 0.15625 0.8076884 0.21875 0.775735 0.25 0.6941348 0.2439929 0.6873497 0.2088366 0.7268215 0.1607682 0.210445 0.1315022 0.3069038 0.1372266 0.3554536 0.1654557 0.3495 0.2148437 0.2700728 0.2148437 0.1778726 0.1607682 0.1804541 0.09852564 0.2823736 0.04557693 0.3287934 0.04285802 0.3344467 0.06539612 0.3011052 0.08051971 0.2114122 0.103224 0.7094964 0.1318975 0.6701319 0.1307031 0.6486914 0.1080339 0.6531314 0.08539574 0.67294 0.08514965 0.7085699 0.107699 0.6122638 0.1080339 0.5497157 0.08023149 0.566556 0.06810515 0.6325982 0.0744986 0.6559592 0.06703244 0.6531314 0.07422985 0.5509276 0.05543304 0.6188457 0.05465342 0.4678299 6.21492e-4 0.4892766 0.001864475 0.5137182 0.01875455 0.513715 0.04362301 0.4762187 0.03971753 0.4554521 0.01304377 0.3830817 0.06925668 0.4539138 0.06400113 0.5012088 0.07983615 0.5 0.1080339 0.4547569 0.1080339 0.3830817 0.08447972 0.5619981 0.2439929 0.4311328 0.25 0.4189151 0.1654557 0.5451773 0.2088366 0.09917055 0.3715365 0.2439194 0.3704514 0.3345664 0.3999761 0.3253834 0.4453386 0.2286736 0.4440953 0.09607144 0.4010612 0.12651 0.25 0.2612861 0.25 0.3404869 0.2851562 0.3370622 0.3384527 0.2463525 0.3384527 0.1137661 0.2851562 0.8618277 0.28125 0.9227968 0.34375 0.8595846 0.3715365 0.7307596 0.3657357 0.7199122 0.333431 0.7976162 0.2851562 0.6394122 0.2665189 0.6454287 0.3211068 0.5675261 0.333431 0.4301656 0.2851562 0.427976 0.3704514 0.5687201 0.3657357 0.6565555 0.3854818 0.6674862 0.4326026 0.5780282 0.4426872 0.4277081 0.3999761 0.7757349 0.7500001 0.6942712 0.7500001 0.6395486 0.7148438 0.6454287 0.6587652 0.7199122 0.6587652 0.7976162 0.7148438 0.02388244 0.71875 0.01020685 0.65625 0.09916995 0.6218618 0.2439193 0.6268642 0.2463524 0.664872 0.1137659 0.7148438 0.1878581 0.4792224 0.05681099 0.490015 0 0.4907119 0 0.4760706 0.05720876 0.4616049 0.1914338 0.4639679 0.8596136 0.6218424 0.7307596 0.6204514 0.6565555 0.5796636 0.6675152 0.5142237 0.760344 0.5179932 0.876655 0.5842122 0.4188254 0.4780209 0.5780282 0.4762875 0.5687201 0.5796636 0.4188254 0.517181 0.4277082 0.6268642 0.5675261 0.6204514 0.5637664 0.7148438 0.427976 0.6648719 0.2104449 0.8684978 0.3011052 0.8692969 0.3344467 0.8919662 0.3281253 0.9169722 0.2964157 0.9205073 0.2114121 0.896776 0.1048008 0.84375 0.05541375 0.78125 0.1265098 0.75 0.2626739 0.7560071 0.2698287 0.7911633 0.1778725 0.8392318 0.7094964 0.8681025 0.6643332 0.8627735 0.6276844 0.8345443 0.6309146 0.7851563 0.6858541 0.7851563 0.7268215 0.8392318 0.4547569 0.8692969 0.3830817 0.8692969 0.3344467 0.852474 0.3340476 0.8050175 0.4041179 0.8050175 0.4699653 0.852474 0.625 0.9547694 0.5416667 0.9832658 0.5137182 0.9812455 0.5104598 0.9563769 0.5460405 0.944567 0.6188457 0.9453467 0.5300347 0.8692969 0.5912569 0.8627735 0.6428927 0.8797396 0.6486913 0.9084124 0.6122638 0.9141155 0.545243 0.8919662 0.5 0.8919662 0.4979535 0.9197685 0.4494466 0.9201639 0.3830817 0.8919662 0.3287934 0.957142 0.3281253 0.9350189 0.3595561 0.9311583 0.4321863 0.9359989 0.4434806 0.9524653 0.3750903 0.9697722 0.6476185 0.1949825 0.6486913 0.147526 0.05541399 0.21875 0.1048009 0.15625 0.3344467 0.09018284 0.3402453 0.1202604 0.6841811 0.07585916 0.7192098 0.1086197 0.6122639 0.1307031 0.5452431 0.1307031 0.5416667 0.0167342 0.625 0.04523066 0.3750904 0.03022781 0.4483678 0.0475347 0.3642766 0.01432693 0.4261633 0.004775644 0.4699653 0.1307031 0.4040887 0.1372266 0.5911064 0.1949825 0.5300347 0.147526 8.79039e-4 0.4453125 0.002539147 0.3984375 0.01020703 0.34375 0.0238827 0.28125 0.9227968 0.65625 0.8618277 0.71875 0.3370622 0.6778082 0.3418747 0.733481 0 0.4995089 0 0.4985247 0.1878537 0.4848768 0.05680556 0.4946754 0.3253829 0.5326821 0.3345664 0.6015581 0.09606592 0.5844306 0.2286687 0.5217616 0.002526795 0.5942425 8.42265e-4 0.5327276 0.05717896 0.5097264 0.1914245 0.4981677 0 0.5014778 0 0.5004933 0.9977787 0.4765625 0.9992596 0.4921875 0.9376882 0.5050651 0.8007168 0.4916976 0.9883204 0.53125 0.9649611 0.59375 0.5628399 0.7500001 0.4331855 0.7560071 0.2823736 0.9544231 0.180454 0.9014744 0.8076884 0.78125 0.760379 0.84375 0.5764305 0.8345443 0.4513569 0.7911633 0.5448285 0.9318948 0.6122639 0.9256542 0.4892766 0.9981355 0.4678299 0.9993785 0.4554521 0.9869562 0.4729635 0.9602824 0.4261633 0.9952244 0.3642766 0.9856731</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape3-map1-array" count="869" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape3-textangents">
+ <float_array id="qt_gauge_background_Shape3-textangents-array" count="9792">-0.2408216 0 0.9705694 -0.1503407 0 0.9886342 -0.1015498 0 0.9948304 -0.2269865 0 0.973898 -0.1503407 0 0.9886342 -0.269261 0 0.9630672 -0.1799126 0 0.9836825 -0.1015498 0 0.9948304 -0.1015498 0 0.9948304 -0.1799126 0 0.9836825 -0.07116529 0 0.9974645 -0.06583797 0 0.9978303 -0.2269865 0 0.973898 -0.1015498 0 0.9948304 -0.06583797 0 0.9978303 -0.1171791 0 0.9931108 -0.07404644 0 0.9972547 -0.0671368 0 0.9977437 -0.1007928 0 0.9949074 -0.2669657 0 0.9637059 -0.0671368 0 0.9977437 -0.03031696 0 0.9995403 -0.04467131 0 0.9990017 -0.1007928 0 0.9949074 -0.1007928 0 0.9949074 -0.04467131 0 0.9990017 -0.07116529 0 0.9974645 -0.1799126 0 0.9836825 -0.2669657 0 0.9637059 -0.1007928 0 0.9949074 -0.1799126 0 0.9836825 -0.269261 0 0.9630672 0 0 0.9999999 -0.0279458 0 0.9996094 -0.01884261 0 0.9998224 -0.007783857 0 0.9999697 -0.0279458 0 0.9996094 -0.1171791 0 0.9931108 -0.06583797 0 0.9978303 -0.01884261 0 0.9998224 -0.01884261 0 0.9998224 -0.06583797 0 0.9978303 -0.07116529 0 0.9974645 -0.04467131 0 0.9990017 -0.007783857 0 0.9999697 -0.01884261 0 0.9998224 -0.04467131 0 0.9990017 -0.03031696 0 0.9995403 -0.05704196 0 0.9983718 -0.01123067 0 0.9999369 -0.01396546 0 0.9999024 -0.02450331 0 0.9996998 -0.01123067 0 0.9999369 -0.0429177 0 0.9990786 -0.03171874 0 0.9994968 -0.01396546 0 0.9999024 -0.01396546 0 0.9999024 -0.03171874 0 0.9994968 -0.02580328 0 0.999667 -0.007986737 0 0.999968 -0.02450331 0 0.9996998 -0.01396546 0 0.9999024 -0.007986737 0 0.999968 -0.01257228 0 0.9999208 -0.2225507 0 0.9749212 -0.1292 0 0.9916185 -0.06260423 0 0.9980385 -0.1194519 0 0.9928401 -0.1292 0 0.9916185 -0.04005554 0 0.9991974 -0.02926107 0 0.9995718 -0.06260423 0 0.9980385 -0.06260423 0 0.9980385 -0.02926107 0 0.9995718 -0.02580328 0 0.999667 -0.03171874 0 0.9994968 -0.1194519 0 0.9928401 -0.06260423 0 0.9980385 -0.03171874 0 0.9994968 -0.0429177 0 0.9990786 0 0 0.9999999 -0.002898718 0 0.9999957 -0.009934561 0 0.9999505 -0.007037311 0 0.9999751 -0.002898718 0 0.9999957 -0.01257228 0 0.9999208 -0.007986737 0 0.999968 -0.009934561 0 0.9999505 -0.009934561 0 0.9999505 -0.007986737 0 0.999968 -0.02580328 0 0.999667 -0.02926107 0 0.9995718 -0.007037311 0 0.9999751 -0.009934561 0 0.9999505 -0.02926107 0 0.9995718 -0.04005554 0 0.9991974 0.2408359 0 0.9705659 0.0146159 0 0.9998931 0.01622582 0 0.9998684 0.09129237 0 0.9958241 0.0146159 0 0.9998931 -0.003656714 0 0.9999933 -4.58716e-4 0 0.9999998 0.01622582 0 0.9998684 0.01622582 0 0.9998684 -4.58716e-4 0 0.9999998 0.001511241 0 0.9999988 0.0117174 0 0.9999313 0.09129237 0 0.9958241 0.01622582 0 0.9998684 0.0117174 0 0.9999313 0.04732391 0 0.9988796 0 0 0.9999999 0 0 0.9999999 4.14501e-4 0 0.9999998 5.776e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 4.26182e-4 0 0.9999998 4.14501e-4 0 0.9999998 4.14501e-4 0 0.9999998 4.26182e-4 0 0.9999998 0.001511241 0 0.9999988 -4.58716e-4 0 0.9999998 5.776e-4 0 0.9999998 4.14501e-4 0 0.9999998 -4.58716e-4 0 0.9999998 -0.003656714 0 0.9999933 0 0 0.9999999 0.009263248 0 0.9999571 0.002883284 0 0.9999958 0 0 0.9999999 0.009263248 0 0.9999571 0.04732391 0 0.9988796 0.0117174 0 0.9999313 0.002883284 0 0.9999958 0.002883284 0 0.9999958 0.0117174 0 0.9999313 0.001511241 0 0.9999988 4.26182e-4 0 0.9999998 0 0 0.9999999 0.002883284 0 0.9999958 4.26182e-4 0 0.9999998 0 0 0.9999999 -0.03975805 0 0.9992093 -0.03972348 0 0.9992107 -0.02168644 0 0.9997647 -0.01841404 0 0.9998304 -0.03972348 0 0.9992107 -0.02033068 0 0.9997933 -0.01310003 0 0.9999141 -0.02168644 0 0.9997647 -0.02168644 0 0.9997647 -0.01310003 0 0.9999141 -0.006544264 0 0.9999785 -0.01081157 0 0.9999414 -0.01841404 0 0.9998304 -0.02168644 0 0.9997647 -0.01081157 0 0.9999414 -0.007622748 0 0.999971 0 0 0.9999999 0 0 0.9999999 -0.002990546 0 0.9999954 -0.004746721 0 0.9999886 0 0 0.9999999 0 0 0.9999999 -0.0025847 0 0.9999965 -0.002990546 0 0.9999954 -0.002990546 0 0.9999954 -0.0025847 0 0.9999965 -0.006544264 0 0.9999785 -0.01310003 0 0.9999141 -0.004746721 0 0.9999886 -0.002990546 0 0.9999954 -0.01310003 0 0.9999141 -0.02033068 0 0.9997933 0 0 0.9999999 -0.001373424 0 0.9999989 -0.002898493 0 0.9999957 0 0 0.9999999 -0.001373424 0 0.9999989 -0.007622748 0 0.999971 -0.01081157 0 0.9999414 -0.002898493 0 0.9999957 -0.002898493 0 0.9999957 -0.01081157 0 0.9999414 -0.006544264 0 0.9999785 -0.0025847 0 0.9999965 0 0 0.9999999 -0.002898493 0 0.9999957 -0.0025847 0 0.9999965 0 0 0.9999999 -0.03975805 0 0.9992093 -0.04657439 0 0.9989148 -0.04960903 0 0.9987686 -0.03580722 0 0.9993587 -0.04657439 0 0.9989148 -0.09584571 0 0.9953961 -0.08420902 0 0.996448 -0.04960903 0 0.9987686 -0.04960903 0 0.9987686 -0.08420902 0 0.996448 -0.0527029 0 0.9986102 -0.02891615 0 0.9995818 -0.03580722 0 0.9993587 -0.04960903 0 0.9987686 -0.02891615 0 0.9995818 -0.01862768 0 0.9998264 -0.2285024 0 0.9735433 -0.09644829 0 0.9953379 -0.08675136 0 0.99623 -0.1109599 0 0.9938248 -0.09644829 0 0.9953379 -0.05831166 0 0.9982983 -0.04919772 0 0.998789 -0.08675136 0 0.99623 -0.08675136 0 0.99623 -0.04919772 0 0.998789 -0.0527029 0 0.9986102 -0.08420902 0 0.996448 -0.1109599 0 0.9938248 -0.08675136 0 0.99623 -0.08420902 0 0.996448 -0.09584571 0 0.9953961 0 0 0.9999999 -0.004986194 0 0.9999874 -0.01401624 0 0.9999017 -0.01947046 0 0.9998104 -0.004986194 0 0.9999874 -0.01862768 0 0.9998264 -0.02891615 0 0.9995818 -0.01401624 0 0.9999017 -0.01401624 0 0.9999017 -0.02891615 0 0.9995818 -0.0527029 0 0.9986102 -0.04919772 0 0.998789 -0.01947046 0 0.9998104 -0.01401624 0 0.9999017 -0.04919772 0 0.998789 -0.05831166 0 0.9982983 0.2408359 0 0.9705659 0.283368 0 0.9590111 0.2131642 0 0.9770164 0.228774 0 0.9734795 0.283368 0 0.9590111 0.1391524 0 0.990271 0.1153987 0 0.9933192 0.2131642 0 0.9770164 0.2131642 0 0.9770164 0.1153987 0 0.9933192 0.09781812 0 0.9952043 0.1382074 0 0.9904033 0.228774 0 0.9734795 0.2131642 0 0.9770164 0.1382074 0 0.9904033 0.1228009 0 0.9924313 0 0 0.9999999 0 0 0.9999999 0.02355153 0 0.9997227 0.03302914 0 0.9994543 0 0 0.9999999 0 0 0.9999999 0.02433523 0 0.9997038 0.02355153 0 0.9997227 0.02355153 0 0.9997227 0.02433523 0 0.9997038 0.09781812 0 0.9952043 0.1153987 0 0.9933192 0.03302914 0 0.9994543 0.02355153 0 0.9997227 0.1153987 0 0.9933192 0.1391524 0 0.990271 0 0 0.9999999 0.03068565 0 0.999529 0.03695491 0 0.9993169 0 0 0.9999999 0.03068565 0 0.999529 0.1228009 0 0.9924313 0.1382074 0 0.9904033 0.03695491 0 0.9993169 0.03695491 0 0.9993169 0.1382074 0 0.9904033 0.09781812 0 0.9952043 0.02433523 0 0.9997038 0 0 0.9999999 0.03695491 0 0.9993169 0.02433523 0 0.9997038 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.07407406 0 0.9972527 0.06938018 0 0.9975903 0.04160673 0 0.9991341 0.03649248 0 0.9993339 0.06938018 0 0.9975903 0.03497165 0 0.9993883 0.02082422 0 0.999783 0.04160673 0 0.9991341 0.04160673 0 0.9991341 0.02082422 0 0.999783 0.0122572 0 0.9999249 0.01292664 0 0.9999164 0.03649248 0 0.9993339 0.04160673 0 0.9991341 0.01292664 0 0.9999164 0.01264085 0 0.99992 0 0 0.9999999 0 0 0.9999999 0.005652232 0 0.9999839 0.008706635 0 0.999962 0 0 0.9999999 0 0 0.9999999 0.002801479 0 0.9999959 0.005652232 0 0.9999839 0.005652232 0 0.9999839 0.002801479 0 0.9999959 0.0122572 0 0.9999249 0.02082422 0 0.999783 0.008706635 0 0.999962 0.005652232 0 0.9999839 0.02082422 0 0.999783 0.03497165 0 0.9993883 0 0 0.9999999 0.002405127 0 0.9999971 0.002082124 0 0.9999977 0 0 0.9999999 0.002405127 0 0.9999971 0.01264085 0 0.99992 0.01292664 0 0.9999164 0.002082124 0 0.9999977 0.002082124 0 0.9999977 0.01292664 0 0.9999164 0.0122572 0 0.9999249 0.002801479 0 0.9999959 0 0 0.9999999 0.002082124 0 0.9999977 0.002801479 0 0.9999959 0 0 0.9999999 -0.03498853 0 0.9993878 -0.09715963 0 0.9952688 -0.0270074 0 0.9996352 -0.0513794 0 0.9986792 -0.09715963 0 0.9952688 0.08026946 0 0.9967732 0.09617598 0 0.9953643 -0.0270074 0 0.9996352 -0.0270074 0 0.9996352 0.09617598 0 0.9953643 0.07292709 0 0.9973373 -8.56197e-4 0 0.9999996 -0.0513794 0 0.9986792 -0.0270074 0 0.9996352 -8.56197e-4 0 0.9999996 -0.01251208 0 0.9999217 0.2431866 0 0.9699795 0.1001572 0 0.9949715 0.2184897 0 0.9758391 0.2980393 0 0.9545535 0.1001572 0 0.9949715 0.04614697 0 0.9989346 0.0794348 0 0.9968399 0.2184897 0 0.9758391 0.2184897 0 0.9758391 0.0794348 0 0.9968399 0.07292709 0 0.9973373 0.09617598 0 0.9953643 0.2980393 0 0.9545535 0.2184897 0 0.9758391 0.09617598 0 0.9953643 0.08026946 0 0.9967732 0 0 0.9999999 -0.002760385 0 0.9999961 0.02132029 0 0.9997727 0.007812866 0 0.9999694 -0.002760385 0 0.9999961 -0.01251208 0 0.9999217 -8.56197e-4 0 0.9999996 0.02132029 0 0.9997727 0.02132029 0 0.9997727 -8.56197e-4 0 0.9999996 0.07292709 0 0.9973373 0.0794348 0 0.9968399 0.007812866 0 0.9999694 0.02132029 0 0.9997727 0.0794348 0 0.9968399 0.04614697 0 0.9989346 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.04957445 0 0.9987704 0.04435477 0 0.9990158 0.02531989 0 0.9996792 0.02208836 0 0.999756 0.04435477 0 0.9990158 0.01991794 0 0.9998015 0.01521765 0 0.9998841 0.02531989 0 0.9996792 0.02531989 0 0.9996792 0.01521765 0 0.9998841 0.007847424 0 0.9999691 0.01340206 0 0.99991 0.02208836 0 0.999756 0.02531989 0 0.9996792 0.01340206 0 0.99991 0.01107691 0 0.9999385 0 0 0.9999999 0 0 0.9999999 0.003525217 0 0.9999937 0.005023221 0 0.9999872 0 0 0.9999999 0 0 0.9999999 0.00191161 0 0.9999981 0.003525217 0 0.9999937 0.003525217 0 0.9999937 0.00191161 0 0.9999981 0.007847424 0 0.9999691 0.01521765 0 0.9998841 0.005023221 0 0.9999872 0.003525217 0 0.9999937 0.01521765 0 0.9998841 0.01991794 0 0.9998015 0 0 0.9999999 0.00246211 0 0.999997 0.003249333 0 0.9999946 0 0 0.9999999 0.00246211 0 0.999997 0.01107691 0 0.9999385 0.01340206 0 0.99991 0.003249333 0 0.9999946 0.003249333 0 0.9999946 0.01340206 0 0.99991 0.007847424 0 0.9999691 0.00191161 0 0.9999981 0 0 0.9999999 0.003249333 0 0.9999946 0.00191161 0 0.9999981 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.004274367 0 0.9999908 -0.006120204 0 0.9999812 0 0 0.9999999 -0.004274367 0 0.9999908 -0.02000562 0 0.9997997 -0.0212816 0 0.9997735 -0.006120204 0 0.9999812 -0.006120204 0 0.9999812 -0.0212816 0 0.9997735 -0.01597534 0 0.9998723 -0.005016234 0 0.9999872 0 0 0.9999999 -0.006120204 0 0.9999812 -0.005016234 0 0.9999872 0 0 0.9999999 -0.05704196 0 0.9983718 -0.04793645 0 0.9988505 -0.03243007 0 0.999474 -0.04802692 0 0.9988459 -0.04793645 0 0.9988505 -0.02233554 0 0.9997504 -0.01930705 0 0.9998136 -0.03243007 0 0.999474 -0.03243007 0 0.999474 -0.01930705 0 0.9998136 -0.01597534 0 0.9998723 -0.0212816 0 0.9997735 -0.04802692 0 0.9988459 -0.03243007 0 0.999474 -0.0212816 0 0.9997735 -0.02000562 0 0.9997997 0 0 0.9999999 0 0 0.9999999 -0.005030408 0 0.9999872 -0.004794281 0 0.9999884 0 0 0.9999999 0 0 0.9999999 -0.005016234 0 0.9999872 -0.005030408 0 0.9999872 -0.005030408 0 0.9999872 -0.005016234 0 0.9999872 -0.01597534 0 0.9998723 -0.01930705 0 0.9998136 -0.004794281 0 0.9999884 -0.005030408 0 0.9999872 -0.01930705 0 0.9998136 -0.02233554 0 0.9997504 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -2.19952e-4 0 0.9999999 -3.78211e-4 0 0.9999999 0 0 0.9999999 -2.19952e-4 0 0.9999999 -0.001066297 0 0.9999993 -0.001167113 0 0.9999992 -3.78211e-4 0 0.9999999 -3.78211e-4 0 0.9999999 -0.001167113 0 0.9999992 -8.71439e-4 0 0.9999996 -2.23983e-4 0 0.9999999 0 0 0.9999999 -3.78211e-4 0 0.9999999 -2.23983e-4 0 0.9999999 0 0 0.9999999 -0.003128807 0 0.9999951 -0.002886359 0 0.9999957 -0.00251598 0 0.9999967 -0.002396649 0 0.999997 -0.002886359 0 0.9999957 -0.001242388 0 0.9999991 -0.001075824 0 0.9999992 -0.00251598 0 0.9999967 -0.00251598 0 0.9999967 -0.001075824 0 0.9999992 -8.71439e-4 0 0.9999996 -0.001167113 0 0.9999992 -0.002396649 0 0.999997 -0.00251598 0 0.9999967 -0.001167113 0 0.9999992 -0.001066297 0 0.9999993 0 0 0.9999999 0 0 0.9999999 -2.56879e-4 0 0.9999999 -2.52728e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -2.23983e-4 0 0.9999999 -2.56879e-4 0 0.9999999 -2.56879e-4 0 0.9999999 -2.23983e-4 0 0.9999999 -8.71439e-4 0 0.9999996 -0.001075824 0 0.9999992 -2.52728e-4 0 0.9999999 -2.56879e-4 0 0.9999999 -0.001075824 0 0.9999992 -0.001242388 0 0.9999991 0 0 0.9999999 0.003736567 0 0.9999928 0.01028878 0 0.9999469 0.007179502 0 0.9999741 0.003736567 0 0.9999928 0.01876455 0 0.9998239 0.01083687 0 0.9999412 0.01028878 0 0.9999469 0.01028878 0 0.9999469 0.01083687 0 0.9999412 0.03145734 0 0.9995051 0.04061814 0 0.9991747 0.007179502 0 0.9999741 0.01028878 0 0.9999469 0.04061814 0 0.9991747 0.0391174 0 0.9992346 0.3421461 0 0.9396467 0.01524885 0 0.9998837 0.01762611 0 0.9998446 0.04666906 0 0.9989104 0.01524885 0 0.9998837 0.04084278 0 0.9991655 0.0536097 0 0.9985619 0.01762611 0 0.9998446 0.01762611 0 0.9998446 0.0536097 0 0.9985619 0.03145734 0 0.9995051 0.01083687 0 0.9999412 0.04666906 0 0.9989104 0.01762611 0 0.9998446 0.01083687 0 0.9999412 0.01876455 0 0.9998239 0.2006887 0 0.9796551 0.1338757 0 0.9909981 0.1260106 0 0.9920289 0.1212059 0 0.9926273 0.1338757 0 0.9909981 0.0391174 0 0.9992346 0.04061814 0 0.9991747 0.1260106 0 0.9920289 0.1260106 0 0.9920289 0.04061814 0 0.9991747 0.03145734 0 0.9995051 0.0536097 0 0.9985619 0.1212059 0 0.9926273 0.1260106 0 0.9920289 0.0536097 0 0.9985619 0.04084278 0 0.9991655 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.03975178 0 0.9992095 0.04012969 0 0.9991944 0.03228411 0 0.9994786 0.03602162 0 0.999351 0.04012969 0 0.9991944 0.02127923 0 0.9997734 0.0178115 0 0.9998413 0.03228411 0 0.9994786 0.03228411 0 0.9994786 0.0178115 0 0.9998413 0.01024433 0 0.9999475 0.02078477 0 0.9997839 0.03602162 0 0.999351 0.03228411 0 0.9994786 0.02078477 0 0.9997839 0.01937828 0 0.9998121 0 0 0.9999999 0 0 0.9999999 0.00407391 0 0.9999915 0.00546523 0 0.9999849 0 0 0.9999999 0 0 0.9999999 0.00418025 0 0.9999911 0.00407391 0 0.9999915 0.00407391 0 0.9999915 0.00418025 0 0.9999911 0.01024433 0 0.9999475 0.0178115 0 0.9998413 0.00546523 0 0.9999849 0.00407391 0 0.9999915 0.0178115 0 0.9998413 0.02127923 0 0.9997734 0 0 0.9999999 0.005384227 0 0.9999854 0.0060241 0 0.9999818 0 0 0.9999999 0.005384227 0 0.9999854 0.01937828 0 0.9998121 0.02078477 0 0.9997839 0.0060241 0 0.9999818 0.0060241 0 0.9999818 0.02078477 0 0.9997839 0.01024433 0 0.9999475 0.00418025 0 0.9999911 0 0 0.9999999 0.0060241 0 0.9999818 0.00418025 0 0.9999911 0 0 0.9999999 0.03975178 0 0.9992095 0.002277561 0 0.9999973 0.002560516 0 0.9999965 0.01857827 0 0.9998274 0.002277561 0 0.9999973 -6.08616e-4 0 0.9999996 0 0 0.9999998 0.002560516 0 0.9999965 0.002560516 0 0.9999965 0 0 0.9999998 -3.89811e-4 0 0.9999999 0.001059659 0 0.9999993 0.01857827 0 0.9998274 0.002560516 0 0.9999965 0.001059659 0 0.9999993 0.008490224 0 0.9999639 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 1.18288e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 -3.86899e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -3.86899e-4 0 0.9999999 -3.89811e-4 0 0.9999999 0 0 0.9999998 1.18288e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999998 -6.08616e-4 0 0.9999996 0 0 0.9999999 0.001764203 0 0.9999983 8.76854e-4 0 0.9999995 0 0 0.9999999 0.001764203 0 0.9999983 0.008490224 0 0.9999639 0.001059659 0 0.9999993 8.76854e-4 0 0.9999995 8.76854e-4 0 0.9999995 0.001059659 0 0.9999993 -3.89811e-4 0 0.9999999 -3.86899e-4 0 0.9999999 0 0 0.9999999 8.76854e-4 0 0.9999995 -3.86899e-4 0 0.9999999 0 0 0.9999999 -0.2408216 0 0.9705694 -0.264251 0 0.9644539 -0.1878415 0 0.9821993 -0.08750448 0 0.9961641 -0.264251 0 0.9644539 -0.1152987 0 0.9933308 -0.101284 0 0.9948576 -0.1878415 0 0.9821993 -0.1878415 0 0.9821993 -0.101284 0 0.9948576 -0.0611918 0 0.998126 -0.06843027 0 0.9976559 -0.08750448 0 0.9961641 -0.1878415 0 0.9821993 -0.06843027 0 0.9976559 -0.03993688 0 0.9992021 0 0 0.9999999 0 0 0.9999999 -0.01542989 0 0.999881 -0.02622086 0 0.9996562 0 0 0.9999999 0 0 0.9999999 -0.01298 0 0.9999157 -0.01542989 0 0.999881 -0.01542989 0 0.999881 -0.01298 0 0.9999157 -0.0611918 0 0.998126 -0.101284 0 0.9948576 -0.02622086 0 0.9996562 -0.01542989 0 0.999881 -0.101284 0 0.9948576 -0.1152987 0 0.9933308 0 0 0.9999999 -0.006418761 0 0.9999794 -0.01522136 0 0.999884 0 0 0.9999999 -0.006418761 0 0.9999794 -0.03993688 0 0.9992021 -0.06843027 0 0.9976559 -0.01522136 0 0.999884 -0.01522136 0 0.999884 -0.06843027 0 0.9976559 -0.0611918 0 0.998126 -0.01298 0 0.9999157 0 0 0.9999999 -0.01522136 0 0.999884 -0.01298 0 0.9999157 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.07404644 0 0.9972547 -0.03187923 0 0.9994916 -0.01999791 0 0.9998 -0.03583308 0 0.9993577 -0.03187923 0 0.9994916 -0.005182659 0 0.9999866 -0.008225354 0 0.9999661 -0.01999791 0 0.9998 -0.01999791 0 0.9998 -0.008225354 0 0.9999661 -0.005349655 0 0.9999857 -0.01211121 0 0.9999266 -0.03583308 0 0.9993577 -0.01999791 0 0.9998 -0.01211121 0 0.9999266 -0.01202335 0 0.9999276 -0.2432018 0 0.9699757 -0.09972005 0 0.9950154 -0.0232445 0 0.9997298 -0.01095817 0 0.9999399 -0.09972005 0 0.9950154 -0.04536954 0 0.9989703 -0.01370082 0 0.9999061 -0.0232445 0 0.9997298 -0.0232445 0 0.9997298 -0.01370082 0 0.9999061 -0.005349655 0 0.9999857 -0.008225354 0 0.9999661 -0.01095817 0 0.9999399 -0.0232445 0 0.9997298 -0.008225354 0 0.9999661 -0.005182659 0 0.9999866 0 0 0.9999999 -0.002234205 0 0.9999974 -0.002315247 0 0.9999973 -0.00754152 0 0.9999715 -0.002234205 0 0.9999974 -0.01202335 0 0.9999276 -0.01211121 0 0.9999266 -0.002315247 0 0.9999973 -0.002315247 0 0.9999973 -0.01211121 0 0.9999266 -0.005349655 0 0.9999857 -0.01370082 0 0.9999061 -0.00754152 0 0.9999715 -0.002315247 0 0.9999973 -0.01370082 0 0.9999061 -0.04536954 0 0.9989703 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.2285002 0 0.9735439 0.09781834 0 0.9952044 0.1209721 0 0.9926559 0.2015463 0 0.979479 0.09781834 0 0.9952044 0.05619199 0 0.9984199 0.06369263 0 0.9979694 0.1209721 0 0.9926559 0.1209721 0 0.9926559 0.06369263 0 0.9979694 0.03621047 0 0.9993442 0.04998966 0 0.9987497 0.2015463 0 0.979479 0.1209721 0 0.9926559 0.04998966 0 0.9987497 0.07775941 0 0.9969721 0 0 0.9999999 0 0 0.9999999 0.01842353 0 0.9998302 0.01572387 0 0.9998763 0 0 0.9999999 0 0 0.9999999 0.004135801 0 0.9999914 0.01842353 0 0.9998302 0.01842353 0 0.9998302 0.004135801 0 0.9999914 0.03621047 0 0.9993442 0.06369263 0 0.9979694 0.01572387 0 0.9998763 0.01842353 0 0.9998302 0.06369263 0 0.9979694 0.05619199 0 0.9984199 0 0 0.9999999 0.01420805 0 0.999899 0.00970845 0 0.9999528 0 0 0.9999999 0.01420805 0 0.999899 0.07775941 0 0.9969721 0.04998966 0 0.9987497 0.00970845 0 0.9999528 0.00970845 0 0.9999528 0.04998966 0 0.9987497 0.03621047 0 0.9993442 0.004135801 0 0.9999914 0 0 0.9999999 0.00970845 0 0.9999528 0.004135801 0 0.9999914 0 0 0.9999999 0 0 0.9999999 0 0 1 -0.03434982 0 0.9994099 -0.0279458 0 0.9996094 0 0 1 0 0 0.9999999 -0.02617773 0 0.9996573 -0.03434982 0 0.9994099 -0.03434982 0 0.9994099 -0.02617773 0 0.9996573 -0.09384704 0 0.9955867 -0.1338342 0 0.9910037 -0.0279458 0 0.9996094 -0.03434982 0 0.9994099 -0.1338342 0 0.9910037 -0.1171791 0 0.9931108 0 0 0.9999999 -0.02622086 0 0.9996562 -0.02821222 0 0.9996019 0 0 0.9999999 -0.02622086 0 0.9996562 -0.1152987 0 0.9933308 -0.1384669 0 0.990367 -0.02821222 0 0.9996019 -0.02821222 0 0.9996019 -0.1384669 0 0.990367 -0.09384704 0 0.9955867 -0.02617773 0 0.9996573 0 0 0.9999999 -0.02821222 0 0.9996019 -0.02617773 0 0.9996573 0 0 0.9999999 -0.2408216 0 0.9705694 -0.2269865 0 0.973898 -0.2093175 0 0.9778477 -0.264251 0 0.9644539 -0.2269865 0 0.973898 -0.1171791 0 0.9931108 -0.1338342 0 0.9910037 -0.2093175 0 0.9778477 -0.2093175 0 0.9778477 -0.1338342 0 0.9910037 -0.09384704 0 0.9955867 -0.1384669 0 0.990367 -0.264251 0 0.9644539 -0.2093175 0 0.9778477 -0.1384669 0 0.990367 -0.1152987 0 0.9933308 0 0 0.9999999 0 0 0.9999999 -0.004366007 0 0.9999904 -0.002898718 0 0.9999957 0 0 0.9999999 0 0 0.9999999 -0.002165311 0 0.9999976 -0.004366007 0 0.9999904 -0.004366007 0 0.9999904 -0.002165311 0 0.9999976 -0.00880729 0 0.9999611 -0.01503481 0 0.9998868 -0.002898718 0 0.9999957 -0.004366007 0 0.9999904 -0.01503481 0 0.9998868 -0.01257228 0 0.9999208 0 0 0.9999999 -0.004794281 0 0.9999884 -0.003982209 0 0.9999919 0 0 0.9999999 -0.004794281 0 0.9999884 -0.02233554 0 0.9997504 -0.01716108 0 0.9998525 -0.003982209 0 0.9999919 -0.003982209 0 0.9999919 -0.01716108 0 0.9998525 -0.00880729 0 0.9999611 -0.002165311 0 0.9999976 0 0 0.9999999 -0.003982209 0 0.9999919 -0.002165311 0 0.9999976 0 0 0.9999999 -0.05704196 0 0.9983718 -0.02450331 0 0.9996998 -0.02834101 0 0.9995981 -0.04793645 0 0.9988505 -0.02450331 0 0.9996998 -0.01257228 0 0.9999208 -0.01503481 0 0.9998868 -0.02834101 0 0.9995981 -0.02834101 0 0.9995981 -0.01503481 0 0.9998868 -0.00880729 0 0.9999611 -0.01716108 0 0.9998525 -0.04793645 0 0.9988505 -0.02834101 0 0.9995981 -0.01716108 0 0.9998525 -0.02233554 0 0.9997504 0 0 0.9999999 0 0 0.9999999 0.01988413 0 0.9998024 0.009263248 0 0.9999571 0 0 0.9999999 0 0 0.9999999 0.02042366 0 0.9997914 0.01988413 0 0.9998024 0.01988413 0 0.9998024 0.02042366 0 0.9997914 0.07802018 0 0.9969518 0.0807979 0 0.9967305 0.009263248 0 0.9999571 0.01988413 0 0.9998024 0.0807979 0 0.9967305 0.04732391 0 0.9988796 0 0 0.9999999 0.03302914 0 0.9994543 0.0297944 0 0.9995561 0 0 0.9999999 0.03302914 0 0.9994543 0.1391524 0 0.990271 0.1282583 0 0.9917408 0.0297944 0 0.9995561 0.0297944 0 0.9995561 0.1282583 0 0.9917408 0.07802018 0 0.9969518 0.02042366 0 0.9997914 0 0 0.9999999 0.0297944 0 0.9995561 0.02042366 0 0.9997914 0 0 0.9999999 0.2408359 0 0.9705659 0.09129237 0 0.9958241 0.2012782 0 0.9795341 0.283368 0 0.9590111 0.09129237 0 0.9958241 0.04732391 0 0.9988796 0.0807979 0 0.9967305 0.2012782 0 0.9795341 0.2012782 0 0.9795341 0.0807979 0 0.9967305 0.07802018 0 0.9969518 0.1282583 0 0.9917408 0.283368 0 0.9590111 0.2012782 0 0.9795341 0.1282583 0 0.9917408 0.1391524 0 0.990271 0 0 0.9999999 0 0 0.9999999 -5.34817e-4 0 0.9999996 -0.001373424 0 0.9999989 0 0 0.9999999 0 0 0.9999999 5.35844e-4 0 0.9999996 -5.34817e-4 0 0.9999996 -5.34817e-4 0 0.9999996 5.35844e-4 0 0.9999996 5.74373e-4 0 0.9999998 -5.9679e-4 0 0.9999997 -0.001373424 0 0.9999989 -5.34817e-4 0 0.9999996 -5.9679e-4 0 0.9999997 -0.007622748 0 0.999971 0 0 0.9999999 -1.19798e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 -1.19798e-4 0 0.9999998 6.03085e-4 0 0.9999996 2.33709e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 2.33709e-4 0 0.9999998 5.74373e-4 0 0.9999998 5.35844e-4 0 0.9999996 0 0 0.9999999 0 0 0.9999999 5.35844e-4 0 0.9999996 0 0 0.9999999 -0.03975805 0 0.9992093 -0.01841404 0 0.9998304 -0.002216784 0 0.9999974 -0.002280456 0 0.9999973 -0.01841404 0 0.9998304 -0.007622748 0 0.999971 -5.9679e-4 0 0.9999997 -0.002216784 0 0.9999974 -0.002216784 0 0.9999974 -5.9679e-4 0 0.9999997 5.74373e-4 0 0.9999998 2.33709e-4 0 0.9999998 -0.002280456 0 0.9999973 -0.002216784 0 0.9999974 2.33709e-4 0 0.9999998 6.03085e-4 0 0.9999996 0 0 0.9999999 0 0 1 -0.005600118 0 0.9999841 -0.004986194 0 0.9999874 0 0 1 0 0 0.9999999 -0.004604484 0 0.9999893 -0.005600118 0 0.9999841 -0.005600118 0 0.9999841 -0.004604484 0 0.9999893 -0.009937806 0 0.9999506 -0.02010581 0 0.9997979 -0.004986194 0 0.9999874 -0.005600118 0 0.9999841 -0.02010581 0 0.9997979 -0.01862768 0 0.9998264 0 0 0.9999999 -0.004746721 0 0.9999886 -0.005073776 0 0.9999871 0 0 0.9999999 -0.004746721 0 0.9999886 -0.02033068 0 0.9997933 -0.01897089 0 0.9998199 -0.005073776 0 0.9999871 -0.005073776 0 0.9999871 -0.01897089 0 0.9998199 -0.009937806 0 0.9999506 -0.004604484 0 0.9999893 0 0 0.9999999 -0.005073776 0 0.9999871 -0.004604484 0 0.9999893 0 0 0.9999999 -0.03975805 0 0.9992093 -0.03580722 0 0.9993587 -0.03181936 0 0.9994935 -0.03972348 0 0.9992107 -0.03580722 0 0.9993587 -0.01862768 0 0.9998264 -0.02010581 0 0.9997979 -0.03181936 0 0.9994935 -0.03181936 0 0.9994935 -0.02010581 0 0.9997979 -0.009937806 0 0.9999506 -0.01897089 0 0.9998199 -0.03972348 0 0.9992107 -0.03181936 0 0.9994935 -0.01897089 0 0.9998199 -0.02033068 0 0.9997933 0 0 0.9999999 0.008706635 0 0.999962 0.02329814 0 0.9997286 0.03068565 0 0.999529 0.008706635 0 0.999962 0.03497165 0 0.9993883 0.05147234 0 0.9986743 0.02329814 0 0.9997286 0.02329814 0 0.9997286 0.05147234 0 0.9986743 0.0788283 0 0.9968881 0.0722653 0 0.9973854 0.03068565 0 0.999529 0.02329814 0 0.9997286 0.0722653 0 0.9973854 0.1228009 0 0.9924313 0.07407406 0 0.9972527 0.2670768 0 0.9636753 0.1057093 0 0.9943972 0.06938018 0 0.9975903 0.2670768 0 0.9636753 0.2694641 0 0.9630104 0.1842811 0 0.9828736 0.1057093 0 0.9943972 0.1057093 0 0.9943972 0.1842811 0 0.9828736 0.0788283 0 0.9968881 0.05147234 0 0.9986743 0.06938018 0 0.9975903 0.1057093 0 0.9943972 0.05147234 0 0.9986743 0.03497165 0 0.9993883 0.2408359 0 0.9705659 0.228774 0 0.9734795 0.1054736 0 0.9944221 0.1503871 0 0.9886271 0.228774 0 0.9734795 0.1228009 0 0.9924313 0.0722653 0 0.9973854 0.1054736 0 0.9944221 0.1054736 0 0.9944221 0.0722653 0 0.9973854 0.0788283 0 0.9968881 0.1842811 0 0.9828736 0.1503871 0 0.9886271 0.1054736 0 0.9944221 0.1842811 0 0.9828736 0.2694641 0 0.9630104 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.007812866 0 0.9999694 0.00248503 0 0.9999968 0.002405127 0 0.9999971 0.007812866 0 0.9999694 0.04614697 0 0.9989346 0.01412689 0 0.9999003 0.00248503 0 0.9999968 0.00248503 0 0.9999968 0.01412689 0 0.9999003 0.00542892 0 0.9999853 0.01239257 0 0.9999231 0.002405127 0 0.9999971 0.00248503 0 0.9999968 0.01239257 0 0.9999231 0.01264085 0 0.99992 0.2431866 0 0.9699795 0.01096024 0 0.9999398 0.02357461 0 0.9997221 0.1001572 0 0.9949715 0.01096024 0 0.9999398 0.00514752 0 0.9999867 0.008240523 0 0.999966 0.02357461 0 0.9997221 0.02357461 0 0.9997221 0.008240523 0 0.999966 0.00542892 0 0.9999853 0.01412689 0 0.9999003 0.1001572 0 0.9949715 0.02357461 0 0.9997221 0.01412689 0 0.9999003 0.04614697 0 0.9989346 0.07407406 0 0.9972527 0.03649248 0 0.9993339 0.02021912 0 0.9997954 0.03188623 0 0.9994915 0.03649248 0 0.9993339 0.01264085 0 0.99992 0.01239257 0 0.9999231 0.02021912 0 0.9997954 0.02021912 0 0.9997954 0.01239257 0 0.9999231 0.00542892 0 0.9999853 0.008240523 0 0.999966 0.03188623 0 0.9994915 0.02021912 0 0.9997954 0.008240523 0 0.999966 0.00514752 0 0.9999867 0 0 0.9999999 0 0 0.9999999 -0.009646577 0 0.9999533 -0.01414798 0 0.9998999 0 0 0.9999999 0 0 0.9999999 -0.003386697 0 0.9999942 -0.009646577 0 0.9999533 -0.009646577 0 0.9999533 -0.003386697 0 0.9999942 -0.03425321 0 0.9994131 -0.04902789 0 0.9987973 -0.01414798 0 0.9998999 -0.009646577 0 0.9999533 -0.04902789 0 0.9987973 -0.07692923 0 0.9970365 0 0 0.9999999 -0.01947046 0 0.9998104 -0.01093086 0 0.9999402 0 0 0.9999999 -0.01947046 0 0.9998104 -0.05831166 0 0.9982983 -0.05458978 0 0.9985089 -0.01093086 0 0.9999402 -0.01093086 0 0.9999402 -0.05458978 0 0.9985089 -0.03425321 0 0.9994131 -0.003386697 0 0.9999942 0 0 0.9999999 -0.01093086 0 0.9999402 -0.003386697 0 0.9999942 0 0 0.9999999 -0.2285024 0 0.9735433 -0.2002186 0 0.9797513 -0.1191526 0 0.9928759 -0.09644829 0 0.9953379 -0.2002186 0 0.9797513 -0.07692923 0 0.9970365 -0.04902789 0 0.9987973 -0.1191526 0 0.9928759 -0.1191526 0 0.9928759 -0.04902789 0 0.9987973 -0.03425321 0 0.9994131 -0.05458978 0 0.9985089 -0.09644829 0 0.9953379 -0.1191526 0 0.9928759 -0.05458978 0 0.9985089 -0.05831166 0 0.9982983 0 0 0.9999999 -0.01414798 0 0.9998999 -0.02367271 0 0.9997198 -0.002760385 0 0.9999961 -0.01414798 0 0.9998999 -0.07692923 0 0.9970365 -0.0833848 0 0.9965174 -0.02367271 0 0.9997198 -0.02367271 0 0.9997198 -0.0833848 0 0.9965174 -0.04284976 0 0.9990815 -0.01018491 0 0.9999481 -0.002760385 0 0.9999961 -0.02367271 0 0.9997198 -0.01018491 0 0.9999481 -0.01251208 0 0.9999217 -0.2285024 0 0.9735433 -0.2643341 0 0.9644312 -0.1647008 0 0.9863436 -0.2002186 0 0.9797513 -0.2643341 0 0.9644312 -0.1379277 0 0.9904422 -0.08538461 0 0.996348 -0.1647008 0 0.9863436 -0.1647008 0 0.9863436 -0.08538461 0 0.996348 -0.04284976 0 0.9990815 -0.0833848 0 0.9965174 -0.2002186 0 0.9797513 -0.1647008 0 0.9863436 -0.0833848 0 0.9965174 -0.07692923 0 0.9970365 -0.03498853 0 0.9993878 -0.0513794 0 0.9986792 0.008898944 0 0.9999604 0.01668631 0 0.9998608 -0.0513794 0 0.9986792 -0.01251208 0 0.9999217 -0.01018491 0 0.9999481 0.008898944 0 0.9999604 0.008898944 0 0.9999604 -0.01018491 0 0.9999481 -0.04284976 0 0.9990815 -0.08538461 0 0.996348 0.01668631 0 0.9998608 0.008898944 0 0.9999604 -0.08538461 0 0.996348 -0.1379277 0 0.9904422 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.007179502 0 0.9999741 0.01014991 0 0.9999484 0.00246211 0 0.999997 0.007179502 0 0.9999741 0.0391174 0 0.9992346 0.03809717 0 0.9992741 0.01014991 0 0.9999484 0.01014991 0 0.9999484 0.03809717 0 0.9992741 0.02602179 0 0.9996614 0.007635206 0 0.9999707 0.00246211 0 0.999997 0.01014991 0 0.9999484 0.007635206 0 0.9999707 0.01107691 0 0.9999385 0.2006887 0 0.9796551 0.07606082 0 0.9971031 0.09476675 0 0.9954994 0.1338757 0 0.9909981 0.07606082 0 0.9971031 0.03347798 0 0.9994395 0.0434885 0 0.9990538 0.09476675 0 0.9954994 0.09476675 0 0.9954994 0.0434885 0 0.9990538 0.02602179 0 0.9996614 0.03809717 0 0.9992741 0.1338757 0 0.9909981 0.09476675 0 0.9954994 0.03809717 0 0.9992741 0.0391174 0 0.9992346 0.04957445 0 0.9987704 0.02208836 0 0.999756 0.01375395 0 0.9999053 0.01093907 0 0.9999401 0.02208836 0 0.999756 0.01107691 0 0.9999385 0.007635206 0 0.9999707 0.01375395 0 0.9999053 0.01375395 0 0.9999053 0.007635206 0 0.9999707 0.02602179 0 0.9996614 0.0434885 0 0.9990538 0.01093907 0 0.9999401 0.01375395 0 0.9999053 0.0434885 0 0.9990538 0.03347798 0 0.9994395 0 0 0.9999999 0.005023221 0 0.9999872 0.004520237 0 0.9999896 0 0 0.9999999 0.005023221 0 0.9999872 0.01991794 0 0.9998015 0.01700172 0 0.9998553 0.004520237 0 0.9999896 0.004520237 0 0.9999896 0.01700172 0 0.9998553 0.01356535 0 0.999908 0.003606558 0 0.9999934 0 0 0.9999999 0.004520237 0 0.9999896 0.003606558 0 0.9999934 0 0 0.9999999 0.04957445 0 0.9987704 0.03468076 0 0.9993984 0.036929 0 0.9993179 0.04435477 0 0.9990158 0.03468076 0 0.9993984 0.01659588 0 0.9998621 0.01797559 0 0.9998383 0.036929 0 0.9993179 0.036929 0 0.9993179 0.01797559 0 0.9998383 0.01356535 0 0.999908 0.01700172 0 0.9998553 0.04435477 0 0.9990158 0.036929 0 0.9993179 0.01700172 0 0.9998553 0.01991794 0 0.9998015 0 0 0.9999999 0 0 0.9999999 0.005975648 0 0.9999821 0.003440147 0 0.9999939 0 0 0.9999999 0 0 0.9999999 0.003606558 0 0.9999934 0.005975648 0 0.9999821 0.005975648 0 0.9999821 0.003606558 0 0.9999934 0.01356535 0 0.999908 0.01797559 0 0.9998383 0.003440147 0 0.9999939 0.005975648 0 0.9999821 0.01797559 0 0.9998383 0.01659588 0 0.9998621 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.08459285 0 0.9964155 0.04781866 0 0.9988559 0 0 0.9999999 0.08459285 0 0.9964155 0.2423083 0 0.9701993 0.1809988 0 0.9834833 0.04781866 0 0.9988559 0.04781866 0 0.9988559 0.1809988 0 0.9834833 0.0655216 0 0.9978511 0.01100671 0 0.9999393 0 0 0.9999999 0.04781866 0 0.9988559 0.01100671 0 0.9999393 0 0 0.9999999 0.3421461 0 0.9396467 0.04666906 0 0.9989104 0.2385357 0 0.9711336 0.4909588 0 0.8711828 0.04666906 0 0.9989104 0.01876455 0 0.9998239 0.04416127 0 0.9990245 0.2385357 0 0.9711336 0.2385357 0 0.9711336 0.04416127 0 0.9990245 0.0655216 0 0.9978511 0.1809988 0 0.9834833 0.4909588 0 0.8711828 0.2385357 0 0.9711336 0.1809988 0 0.9834833 0.2423083 0 0.9701993 0 0 0.9999999 0 0 0.9999999 0.008968617 0 0.9999597 0.003736567 0 0.9999928 0 0 0.9999999 0 0 0.9999999 0.01100671 0 0.9999393 0.008968617 0 0.9999597 0.008968617 0 0.9999597 0.01100671 0 0.9999393 0.0655216 0 0.9978511 0.04416127 0 0.9990245 0.003736567 0 0.9999928 0.008968617 0 0.9999597 0.04416127 0 0.9990245 0.01876455 0 0.9998239 0 0 0.9999999 0 0 0.9999999 -2.38245e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -1.96259e-4 0 0.9999999 -2.38245e-4 0 0.9999999 -2.38245e-4 0 0.9999999 -1.96259e-4 0 0.9999999 -4.98052e-4 0 0.9999998 -8.1606e-4 0 0.9999995 0 0 0.9999999 -2.38245e-4 0 0.9999999 -8.1606e-4 0 0.9999995 -6.14092e-4 0 0.9999998 0 0 0.9999999 -2.52728e-4 0 0.9999999 -2.6648e-4 0 1 0 0 0.9999999 -2.52728e-4 0 0.9999999 -0.001242388 0 0.9999991 -9.49855e-4 0 0.9999994 -2.6648e-4 0 1 -2.6648e-4 0 1 -9.49855e-4 0 0.9999994 -4.98052e-4 0 0.9999998 -1.96259e-4 0 0.9999999 0 0 0.9999999 -2.6648e-4 0 1 -1.96259e-4 0 0.9999999 0 0 0.9999999 -0.003128807 0 0.9999951 -0.001167634 0 0.9999992 -0.001593654 0 0.9999986 -0.002886359 0 0.9999957 -0.001167634 0 0.9999992 -6.14092e-4 0 0.9999998 -8.1606e-4 0 0.9999995 -0.001593654 0 0.9999986 -0.001593654 0 0.9999986 -8.1606e-4 0 0.9999995 -4.98052e-4 0 0.9999998 -9.49855e-4 0 0.9999994 -0.002886359 0 0.9999957 -0.001593654 0 0.9999986 -9.49855e-4 0 0.9999994 -0.001242388 0 0.9999991 0 0 0.9999999 0 0 0.9999999 -0.02036476 0 0.9997926 -0.01244123 0 0.9999226 0 0 0.9999999 -6.14092e-4 0 0.9999998 -0.01651351 0 0.9998636 -0.02036476 0 0.9997926 -0.02036476 0 0.9997926 -0.01651351 0 0.9998636 -0.06460391 0 0.9979109 -0.08108172 0 0.9967074 -0.01244123 0 0.9999226 -0.02036476 0 0.9997926 -0.08108172 0 0.9967074 -0.07295907 0 0.9973349 -0.003128807 0 0.9999951 -0.01610699 0 0.9998703 -0.02704896 0 0.9996341 -0.001167634 0 0.9999992 -0.01610699 0 0.9998703 -0.07999701 0 0.996795 -0.08642121 0 0.9962586 -0.02704896 0 0.9996341 -0.02704896 0 0.9996341 -0.08642121 0 0.9962586 -0.06460391 0 0.9979109 -0.01651351 0 0.9998636 -0.001167634 0 0.9999992 -0.02704896 0 0.9996341 -0.01651351 0 0.9998636 -6.14092e-4 0 0.9999998 -0.6316909 0 0.7752202 -0.3636984 0 0.9315167 -0.1933261 0 0.9811346 -0.1764765 0 0.9843048 -0.3636984 0 0.9315167 -0.07295907 0 0.9973349 -0.08108172 0 0.9967074 -0.1933261 0 0.9811346 -0.1933261 0 0.9811346 -0.08108172 0 0.9967074 -0.06460391 0 0.9979109 -0.08642121 0 0.9962586 -0.1764765 0 0.9843048 -0.1933261 0 0.9811346 -0.08642121 0 0.9962586 -0.07999701 0 0.996795 0 0 0.9999999 0 0 0.9999999 0.02710632 0 0.9996326 0.212135 0 0.9772403 0 0 0.9999999 0 0 0.9999999 0.007059416 0 0.999975 0.02710632 0 0.9996326 0.02710632 0 0.9996326 0.007059416 0 0.999975 0.005370983 0 0.9999855 0.1530246 0 0.9882224 0.212135 0 0.9772403 0.02710632 0 0.9996326 0.1530246 0 0.9882224 0.264545 0 0.9643733 0 0 0.9999999 -0.01244123 0 0.9999226 -0.007944887 0 0.9999683 0 0 0.9999999 -0.01244123 0 0.9999226 -0.07295907 0 0.9973349 -0.03354382 0 0.9994372 -0.007944887 0 0.9999683 -0.007944887 0 0.9999683 -0.03354382 0 0.9994372 0.005370983 0 0.9999855 0.007059416 0 0.999975 0 0 0.9999999 -0.007944887 0 0.9999683 0.007059416 0 0.999975 0 0 0.9999999 -0.6316909 0 0.7752202 -0.4049613 0 0.9143338 -0.01653966 0 0.9998631 -0.3636984 0 0.9315167 -0.4049613 0 0.9143338 0.264545 0 0.9643733 0.1530246 0 0.9882224 -0.01653966 0 0.9998631 -0.01653966 0 0.9998631 0.1530246 0 0.9882224 0.005370983 0 0.9999855 -0.03354382 0 0.9994372 -0.3636984 0 0.9315167 -0.01653966 0 0.9998631 -0.03354382 0 0.9994372 -0.07295907 0 0.9973349 0 0 0.9999999 -0.007037311 0 0.9999751 9.19764e-4 0 0.9999995 0.0099493 0 0.9999504 -0.007037311 0 0.9999751 -0.04005554 0 0.9991974 -0.03629411 0 0.9993411 9.19764e-4 0 0.9999995 9.19764e-4 0 0.9999995 -0.03629411 0 0.9993411 -0.004567519 0 0.9999896 0.04031465 0 0.9991869 0.0099493 0 0.9999504 9.19764e-4 0 0.9999995 0.04031465 0 0.9991869 0.05392956 0 0.9985448 -0.2225507 0 0.9749212 -0.1117253 0 0.9937391 -0.1181645 0 0.992994 -0.1292 0 0.9916185 -0.1117253 0 0.9937391 0.01539166 0 0.9998816 -0.03685948 0 0.9993204 -0.1181645 0 0.992994 -0.1181645 0 0.992994 -0.03685948 0 0.9993204 -0.004567519 0 0.9999896 -0.03629411 0 0.9993411 -0.1292 0 0.9916185 -0.1181645 0 0.992994 -0.03629411 0 0.9993411 -0.04005554 0 0.9991974 0.3597926 0 0.9330322 0.1997472 0 0.9798474 0.05250068 0 0.9986209 0.2528557 0 0.9675039 0.1997472 0 0.9798474 0.05392956 0 0.9985448 0.04031465 0 0.9991869 0.05250068 0 0.9986209 0.05250068 0 0.9986209 0.04031465 0 0.9991869 -0.004567519 0 0.9999896 -0.03685948 0 0.9993204 0.2528557 0 0.9675039 0.05250068 0 0.9986209 -0.03685948 0 0.9993204 0.01539166 0 0.9998816 0.3597926 0 0.9330322 0.1400286 0 0.9901475 0.1557177 0 0.9878015 0.1997472 0 0.9798474 0.1400286 0 0.9901475 0.06178421 0 0.9980895 0.06716364 0 0.9977419 0.1557177 0 0.9878015 0.1557177 0 0.9878015 0.06716364 0 0.9977419 0.05013302 0 0.9987426 0.06220724 0 0.9980633 0.1997472 0 0.9798474 0.1557177 0 0.9878015 0.06220724 0 0.9980633 0.05392956 0 0.9985448 0 0 0.9999999 0 0 0.9999999 0.01744653 0 0.9998478 0.01252975 0 0.9999214 0 0 0.9999999 0 0 0.9999999 0.01487925 0 0.9998893 0.01744653 0 0.9998478 0.01744653 0 0.9998478 0.01487925 0 0.9998893 0.05013302 0 0.9987426 0.06716364 0 0.9977419 0.01252975 0 0.9999214 0.01744653 0 0.9998478 0.06716364 0 0.9977419 0.06178421 0 0.9980895 0 0 0.9999999 0.0099493 0 0.9999504 0.01531897 0 0.9998826 0 0 0.9999999 0.0099493 0 0.9999504 0.05392956 0 0.9985448 0.06220724 0 0.9980633 0.01531897 0 0.9998826 0.01531897 0 0.9998826 0.06220724 0 0.9980633 0.05013302 0 0.9987426 0.01487925 0 0.9998893 0 0 0.9999999 0.01531897 0 0.9998826 0.01487925 0 0.9998893 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.01572387 0 0.9998763 0.01623951 0 0.9998681 0.005384227 0 0.9999854 0.01572387 0 0.9998763 0.05619199 0 0.9984199 0.05373182 0 0.9985554 0.01623951 0 0.9998681 0.01623951 0 0.9998681 0.05373182 0 0.9985554 0.05576888 0 0.9984438 0.03042462 0 0.999537 0.005384227 0 0.9999854 0.01623951 0 0.9998681 0.03042462 0 0.999537 0.01937828 0 0.9998121 0.2285002 0 0.9735439 0.110966 0 0.9938241 0.08909103 0 0.9960235 0.09781834 0 0.9952044 0.110966 0 0.9938241 0.09582714 0 0.9953979 0.08510155 0 0.9963723 0.08909103 0 0.9960235 0.08909103 0 0.9960235 0.08510155 0 0.9963723 0.05576888 0 0.9984438 0.05373182 0 0.9985554 0.09781834 0 0.9952044 0.08909103 0 0.9960235 0.05373182 0 0.9985554 0.05619199 0 0.9984199 0.03975178 0 0.9992095 0.03602162 0 0.999351 0.05017055 0 0.9987406 0.04657286 0 0.9989149 0.03602162 0 0.999351 0.01937828 0 0.9998121 0.03042462 0 0.999537 0.05017055 0 0.9987406 0.05017055 0 0.9987406 0.03042462 0 0.999537 0.05576888 0 0.9984438 0.08510155 0 0.9963723 0.04657286 0 0.9989149 0.05017055 0 0.9987406 0.08510155 0 0.9963723 0.09582714 0 0.9953979 0 0 0.9999999 0 0 0.9999999 0.003448655 0 0.9999939 0.001764203 0 0.9999983 0 0 0.9999999 0 0 0.9999999 0.003604572 0 0.9999934 0.003448655 0 0.9999939 0.003448655 0 0.9999939 0.003604572 0 0.9999934 0.01262427 0 0.9999202 0.01119768 0 0.9999373 0.001764203 0 0.9999983 0.003448655 0 0.9999939 0.01119768 0 0.9999373 0.008490224 0 0.9999639 0 0 0.9999999 0.00546523 0 0.9999849 0.005033725 0 0.9999872 0 0 0.9999999 0.00546523 0 0.9999849 0.02127923 0 0.9997734 0.0164728 0 0.9998643 0.005033725 0 0.9999872 0.005033725 0 0.9999872 0.0164728 0 0.9998643 0.01262427 0 0.9999202 0.003604572 0 0.9999934 0 0 0.9999999 0.005033725 0 0.9999872 0.003604572 0 0.9999934 0 0 0.9999999 0.03975178 0 0.9992095 0.01857827 0 0.9998274 0.02226968 0 0.9997519 0.04012969 0 0.9991944 0.01857827 0 0.9998274 0.008490224 0 0.9999639 0.01119768 0 0.9999373 0.02226968 0 0.9997519 0.02226968 0 0.9997519 0.01119768 0 0.9999373 0.01262427 0 0.9999202 0.0164728 0 0.9998643 0.04012969 0 0.9991944 0.02226968 0 0.9997519 0.0164728 0 0.9998643 0.02127923 0 0.9997734 0 0 0.9999999 0 0 0.9999999 -8.61925e-4 0 0.9999995 -0.006418761 0 0.9999794 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -8.61925e-4 0 0.9999995 -8.61925e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 -0.00796391 0 0.9999682 -0.006418761 0 0.9999794 -8.61925e-4 0 0.9999995 -0.00796391 0 0.9999682 -0.03993688 0 0.9992021 0 0 0.9999999 -5.75226e-4 0 0.9999998 -1.59417e-4 0 0.9999999 0 0 0.9999999 -5.75226e-4 0 0.9999998 0.003674217 0 0.9999931 0.001373334 0 0.9999989 -1.59417e-4 0 0.9999999 -1.59417e-4 0 0.9999999 0.001373334 0 0.9999989 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -1.59417e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.2408216 0 0.9705694 -0.08750448 0 0.9961641 -0.01393952 0 0.9999028 -0.01460684 0 0.9998933 -0.08750448 0 0.9961641 -0.03993688 0 0.9992021 -0.00796391 0 0.9999682 -0.01393952 0 0.9999028 -0.01393952 0 0.9999028 -0.00796391 0 0.9999682 0 0 0.9999999 0.001373334 0 0.9999989 -0.01460684 0 0.9998933 -0.01393952 0 0.9999028 0.001373334 0 0.9999989 0.003674217 0 0.9999931 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.001862485 0 0.9999981 -0.002234205 0 0.9999974 0 0 0.9999999 0 0 0.9999999 -0.0010345 0 0.9999994 -0.001862485 0 0.9999981 -0.001862485 0 0.9999981 -0.0010345 0 0.9999994 -0.008987465 0 0.9999595 -0.01165168 0 0.9999321 -0.002234205 0 0.9999974 -0.001862485 0 0.9999981 -0.01165168 0 0.9999321 -0.01202335 0 0.9999276 0 0 0.9999999 -0.007783857 0 0.9999697 -0.004131836 0 0.9999914 0 0 0.9999999 -0.007783857 0 0.9999697 -0.03031696 0 0.9995403 -0.02084827 0 0.9997826 -0.004131836 0 0.9999914 -0.004131836 0 0.9999914 -0.02084827 0 0.9997826 -0.008987465 0 0.9999595 -0.0010345 0 0.9999994 0 0 0.9999999 -0.004131836 0 0.9999914 -0.0010345 0 0.9999994 0 0 0.9999999 -0.07404644 0 0.9972547 -0.03583308 0 0.9993577 -0.03942132 0 0.9992227 -0.0671368 0 0.9977437 -0.03583308 0 0.9993577 -0.01202335 0 0.9999276 -0.01165168 0 0.9999321 -0.03942132 0 0.9992227 -0.03942132 0 0.9992227 -0.01165168 0 0.9999321 -0.008987465 0 0.9999595 -0.02084827 0 0.9997826 -0.0671368 0 0.9977437 -0.03942132 0 0.9992227 -0.02084827 0 0.9997826 -0.03031696 0 0.9995403 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.00754152 0 0.9999715 -0.02079172 0 0.9997838 0.002749909 0 0.9999961 -0.00754152 0 0.9999715 -0.04536954 0 0.9989703 -0.07885212 0 0.9968863 -0.02079172 0 0.9997838 -0.02079172 0 0.9997838 -0.07885212 0 0.9968863 -0.07282737 0 0.9973446 9.39375e-4 0 0.9999996 0.002749909 0 0.9999961 -0.02079172 0 0.9997838 9.39375e-4 0 0.9999996 0.0124626 0 0.9999223 -0.2432018 0 0.9699757 -0.2980264 0 0.9545577 -0.218242 0 0.9758945 -0.09972005 0 0.9950154 -0.2980264 0 0.9545577 -0.08026989 0 0.9967731 -0.09605503 0 0.995376 -0.218242 0 0.9758945 -0.218242 0 0.9758945 -0.09605503 0 0.995376 -0.07282737 0 0.9973446 -0.07885212 0 0.9968863 -0.09972005 0 0.9950154 -0.218242 0 0.9758945 -0.07885212 0 0.9968863 -0.04536954 0 0.9989703 0.0349897 0 0.9993876 0.05138171 0 0.9986791 0.02699911 0 0.9996355 0.09715999 0 0.9952688 0.05138171 0 0.9986791 0.0124626 0 0.9999223 9.39375e-4 0 0.9999996 0.02699911 0 0.9996355 0.02699911 0 0.9996355 9.39375e-4 0 0.9999996 -0.07282737 0 0.9973446 -0.09605503 0 0.995376 0.09715999 0 0.9952688 0.02699911 0 0.9996355 -0.09605503 0 0.995376 -0.08026989 0 0.9967731 0.0349897 0 0.9993876 -0.0166884 0 0.9998607 -0.008849177 0 0.9999608 0.05138171 0 0.9986791 -0.0166884 0 0.9998607 0.1379357 0 0.9904411 0.08555418 0 0.9963335 -0.008849177 0 0.9999608 -0.008849177 0 0.9999608 0.08555418 0 0.9963335 0.04296326 0 0.9990765 0.01046466 0 0.9999452 0.05138171 0 0.9986791 -0.008849177 0 0.9999608 0.01046466 0 0.9999452 0.0124626 0 0.9999223 0.2285002 0 0.9735439 0.2015463 0 0.979479 0.1653234 0 0.9862394 0.2643328 0 0.9644315 0.2015463 0 0.979479 0.07775941 0 0.9969721 0.08392432 0 0.9964721 0.1653234 0 0.9862394 0.1653234 0 0.9862394 0.08392432 0 0.9964721 0.04296326 0 0.9990765 0.08555418 0 0.9963335 0.2643328 0 0.9644315 0.1653234 0 0.9862394 0.08555418 0 0.9963335 0.1379357 0 0.9904411 0 0 0.9999999 0.002749909 0 0.9999961 0.02434111 0 0.9997036 0.01420805 0 0.999899 0.002749909 0 0.9999961 0.0124626 0 0.9999223 0.01046466 0 0.9999452 0.02434111 0 0.9997036 0.02434111 0 0.9997036 0.01046466 0 0.9999452 0.04296326 0 0.9990765 0.08392432 0 0.9964721 0.01420805 0 0.999899 0.02434111 0 0.9997036 0.08392432 0 0.9964721 0.07775941 0 0.9969721</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape3-textangents-array" count="3264" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape3-texbinormals">
+ <float_array id="qt_gauge_background_Shape3-texbinormals-array" count="9792">0.9705694 0 0.2408216 0.9886343 0 0.1503407 0.9948305 0 0.1015498 0.9738979 0 0.2269864 0.9886343 0 0.1503407 0.9630673 0 0.269261 0.9836827 0 0.1799126 0.9948305 0 0.1015498 0.9948305 0 0.1015498 0.9836827 0 0.1799126 0.9974645 0 0.07116529 0.9978303 0 0.06583797 0.9738979 0 0.2269864 0.9948305 0 0.1015498 0.9978303 0 0.06583797 0.9931109 0 0.1171791 0.9972549 0 0.07404645 0.9977438 0 0.06713681 0.9949074 0 0.1007928 0.963706 0 0.2669658 0.9977438 0 0.06713681 0.9995403 0 0.03031696 0.9990018 0 0.04467132 0.9949074 0 0.1007928 0.9949074 0 0.1007928 0.9990018 0 0.04467132 0.9974645 0 0.07116529 0.9836827 0 0.1799126 0.963706 0 0.2669658 0.9949074 0 0.1007928 0.9836827 0 0.1799126 0.9630673 0 0.269261 1 0 0 0.9996095 0 0.0279458 0.9998224 0 0.01884261 0.9999698 0 0.007783858 0.9996095 0 0.0279458 0.9931109 0 0.1171791 0.9978303 0 0.06583797 0.9998224 0 0.01884261 0.9998224 0 0.01884261 0.9978303 0 0.06583797 0.9974645 0 0.07116529 0.9990018 0 0.04467132 0.9999698 0 0.007783858 0.9998224 0 0.01884261 0.9990018 0 0.04467132 0.9995403 0 0.03031696 0.9983718 0 0.05704197 0.9999369 0 0.01123067 0.9999025 0 0.01396546 0.9996998 0 0.02450331 0.9999369 0 0.01123067 0.9990786 0 0.0429177 0.9994969 0 0.03171874 0.9999025 0 0.01396546 0.9999025 0 0.01396546 0.9994969 0 0.03171874 0.999667 0 0.02580328 0.9999681 0 0.007986738 0.9996998 0 0.02450331 0.9999025 0 0.01396546 0.9999681 0 0.007986738 0.999921 0 0.01257228 0.9749212 0 0.2225507 0.9916186 0 0.1292 0.9980384 0 0.06260422 0.9928401 0 0.1194519 0.9916186 0 0.1292 0.9991975 0 0.04005554 0.9995719 0 0.02926107 0.9980384 0 0.06260422 0.9980384 0 0.06260422 0.9995719 0 0.02926107 0.999667 0 0.02580328 0.9994969 0 0.03171874 0.9928401 0 0.1194519 0.9980384 0 0.06260422 0.9994969 0 0.03171874 0.9990786 0 0.0429177 1 0 0 0.9999958 0 0.002898719 0.9999507 0 0.009934563 0.9999753 0 0.007037312 0.9999958 0 0.002898719 0.999921 0 0.01257228 0.9999681 0 0.007986738 0.9999507 0 0.009934563 0.9999507 0 0.009934563 0.9999681 0 0.007986738 0.999667 0 0.02580328 0.9995719 0 0.02926107 0.9999753 0 0.007037312 0.9999507 0 0.009934563 0.9995719 0 0.02926107 0.9991975 0 0.04005554 0.9705659 0 -0.2408359 0.9998932 0 -0.01461591 0.9998684 0 -0.01622582 0.9958242 0 -0.09129237 0.9998932 0 -0.01461591 0.9999934 0 0.003656714 0.9999999 0 4.58716e-4 0.9998684 0 -0.01622582 0.9998684 0 -0.01622582 0.9999999 0 4.58716e-4 0.9999989 0 -0.001511241 0.9999314 0 -0.0117174 0.9958242 0 -0.09129237 0.9998684 0 -0.01622582 0.9999314 0 -0.0117174 0.9988796 0 -0.04732391 1 0 0 1 0 0 1 0 -4.14501e-4 0.9999999 0 -5.776e-4 1 0 0 1 0 0 1 0 -4.26182e-4 1 0 -4.14501e-4 1 0 -4.14501e-4 1 0 -4.26182e-4 0.9999989 0 -0.001511241 0.9999999 0 4.58716e-4 0.9999999 0 -5.776e-4 1 0 -4.14501e-4 0.9999999 0 4.58716e-4 0.9999934 0 0.003656714 1 0 0 0.9999571 0 -0.009263248 0.9999959 0 -0.002883284 1 0 0 0.9999571 0 -0.009263248 0.9988796 0 -0.04732391 0.9999314 0 -0.0117174 0.9999959 0 -0.002883284 0.9999959 0 -0.002883284 0.9999314 0 -0.0117174 0.9999989 0 -0.001511241 1 0 -4.26182e-4 1 0 0 0.9999959 0 -0.002883284 1 0 -4.26182e-4 1 0 0 0.9992094 0 0.03975805 0.9992108 0 0.03972349 0.9997649 0 0.02168644 0.9998305 0 0.01841405 0.9992108 0 0.03972349 0.9997934 0 0.02033068 0.9999143 0 0.01310003 0.9997649 0 0.02168644 0.9997649 0 0.02168644 0.9999143 0 0.01310003 0.9999786 0 0.006544264 0.9999416 0 0.01081157 0.9998305 0 0.01841405 0.9997649 0 0.02168644 0.9999416 0 0.01081157 0.999971 0 0.007622748 1 0 0 1 0 0 0.9999956 0 0.002990546 0.9999887 0 0.004746722 1 0 0 1 0 0 0.9999967 0 0.002584701 0.9999956 0 0.002990546 0.9999956 0 0.002990546 0.9999967 0 0.002584701 0.9999786 0 0.006544264 0.9999143 0 0.01310003 0.9999887 0 0.004746722 0.9999956 0 0.002990546 0.9999143 0 0.01310003 0.9997934 0 0.02033068 1 0 0 0.9999991 0 0.001373424 0.9999958 0 0.002898493 1 0 0 0.9999991 0 0.001373424 0.999971 0 0.007622748 0.9999416 0 0.01081157 0.9999958 0 0.002898493 0.9999958 0 0.002898493 0.9999416 0 0.01081157 0.9999786 0 0.006544264 0.9999967 0 0.002584701 1 0 0 0.9999958 0 0.002898493 0.9999967 0 0.002584701 1 0 0 0.9992094 0 0.03975805 0.9989148 0 0.04657439 0.9987687 0 0.04960904 0.9993587 0 0.03580722 0.9989148 0 0.04657439 0.9953962 0 0.09584571 0.9964481 0 0.08420903 0.9987687 0 0.04960904 0.9987687 0 0.04960904 0.9964481 0 0.08420903 0.9986103 0 0.05270291 0.9995819 0 0.02891616 0.9993587 0 0.03580722 0.9987687 0 0.04960904 0.9995819 0 0.02891616 0.9998266 0 0.01862769 0.9735433 0 0.2285024 0.995338 0 0.0964483 0.99623 0 0.08675136 0.993825 0 0.1109599 0.995338 0 0.0964483 0.9982985 0 0.05831166 0.9987891 0 0.04919773 0.99623 0 0.08675136 0.99623 0 0.08675136 0.9987891 0 0.04919773 0.9986103 0 0.05270291 0.9964481 0 0.08420903 0.993825 0 0.1109599 0.99623 0 0.08675136 0.9964481 0 0.08420903 0.9953962 0 0.09584571 1 0 0 0.9999877 0 0.004986196 0.9999018 0 0.01401624 0.9998105 0 0.01947046 0.9999877 0 0.004986196 0.9998266 0 0.01862769 0.9995819 0 0.02891616 0.9999018 0 0.01401624 0.9999018 0 0.01401624 0.9995819 0 0.02891616 0.9986103 0 0.05270291 0.9987891 0 0.04919773 0.9998105 0 0.01947046 0.9999018 0 0.01401624 0.9987891 0 0.04919773 0.9982985 0 0.05831166 0.9705659 0 -0.2408359 0.9590113 0 -0.2833681 0.9770164 0 -0.2131642 0.9734796 0 -0.228774 0.9590113 0 -0.2833681 0.990271 0 -0.1391524 0.9933193 0 -0.1153987 0.9770164 0 -0.2131642 0.9770164 0 -0.2131642 0.9933193 0 -0.1153987 0.9952044 0 -0.09781814 0.9904034 0 -0.1382074 0.9734796 0 -0.228774 0.9770164 0 -0.2131642 0.9904034 0 -0.1382074 0.9924313 0 -0.1228009 1 0 0 1 0 0 0.9997227 0 -0.02355153 0.9994544 0 -0.03302915 1 0 0 1 0 0 0.9997039 0 -0.02433523 0.9997227 0 -0.02355153 0.9997227 0 -0.02355153 0.9997039 0 -0.02433523 0.9952044 0 -0.09781814 0.9933193 0 -0.1153987 0.9994544 0 -0.03302915 0.9997227 0 -0.02355153 0.9933193 0 -0.1153987 0.990271 0 -0.1391524 1 0 0 0.9995291 0 -0.03068565 0.999317 0 -0.03695491 1 0 0 0.9995291 0 -0.03068565 0.9924313 0 -0.1228009 0.9904034 0 -0.1382074 0.999317 0 -0.03695491 0.999317 0 -0.03695491 0.9904034 0 -0.1382074 0.9952044 0 -0.09781814 0.9997039 0 -0.02433523 1 0 0 0.999317 0 -0.03695491 0.9997039 0 -0.02433523 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9972528 0 -0.07407407 0.9975903 0 -0.06938018 0.9991341 0 -0.04160673 0.999334 0 -0.03649249 0.9975903 0 -0.06938018 0.9993883 0 -0.03497165 0.9997832 0 -0.02082422 0.9991341 0 -0.04160673 0.9991341 0 -0.04160673 0.9997832 0 -0.02082422 0.9999249 0 -0.0122572 0.9999165 0 -0.01292664 0.999334 0 -0.03649249 0.9991341 0 -0.04160673 0.9999165 0 -0.01292664 0.9999202 0 -0.01264085 1 0 0 1 0 0 0.999984 0 -0.005652233 0.9999621 0 -0.008706636 1 0 0 1 0 0 0.9999961 0 -0.002801479 0.999984 0 -0.005652233 0.999984 0 -0.005652233 0.9999961 0 -0.002801479 0.9999249 0 -0.0122572 0.9997832 0 -0.02082422 0.9999621 0 -0.008706636 0.999984 0 -0.005652233 0.9997832 0 -0.02082422 0.9993883 0 -0.03497165 1 0 0 0.9999972 0 -0.002405127 0.9999979 0 -0.002082125 1 0 0 0.9999972 0 -0.002405127 0.9999202 0 -0.01264085 0.9999165 0 -0.01292664 0.9999979 0 -0.002082125 0.9999979 0 -0.002082125 0.9999165 0 -0.01292664 0.9999249 0 -0.0122572 0.9999961 0 -0.002801479 1 0 0 0.9999979 0 -0.002082125 0.9999961 0 -0.002801479 1 0 0 0.9993877 0 0.03498853 0.9952688 0 0.09715964 0.9996353 0 0.0270074 0.9986793 0 0.05137941 0.9952688 0 0.09715964 0.9967732 0 -0.08026946 0.9953644 0 -0.09617598 0.9996353 0 0.0270074 0.9996353 0 0.0270074 0.9953644 0 -0.09617598 0.9973373 0 -0.07292709 0.9999996 0 8.56197e-4 0.9986793 0 0.05137941 0.9996353 0 0.0270074 0.9999996 0 8.56197e-4 0.9999217 0 0.01251208 0.9699796 0 -0.2431867 0.9949716 0 -0.1001573 0.9758393 0 -0.2184897 0.9545537 0 -0.2980394 0.9949716 0 -0.1001573 0.9989347 0 -0.04614698 0.9968401 0 -0.07943481 0.9758393 0 -0.2184897 0.9758393 0 -0.2184897 0.9968401 0 -0.07943481 0.9973373 0 -0.07292709 0.9953644 0 -0.09617598 0.9545537 0 -0.2980394 0.9758393 0 -0.2184897 0.9953644 0 -0.09617598 0.9967732 0 -0.08026946 1 0 0 0.9999962 0 0.002760386 0.9997727 0 -0.02132029 0.9999695 0 -0.007812867 0.9999962 0 0.002760386 0.9999217 0 0.01251208 0.9999996 0 8.56197e-4 0.9997727 0 -0.02132029 0.9997727 0 -0.02132029 0.9999996 0 8.56197e-4 0.9973373 0 -0.07292709 0.9968401 0 -0.07943481 0.9999695 0 -0.007812867 0.9997727 0 -0.02132029 0.9968401 0 -0.07943481 0.9989347 0 -0.04614698 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9987705 0 -0.04957445 0.9990159 0 -0.04435477 0.9996794 0 -0.0253199 0.9997561 0 -0.02208836 0.9990159 0 -0.04435477 0.9998017 0 -0.01991795 0.9998842 0 -0.01521765 0.9996794 0 -0.0253199 0.9996794 0 -0.0253199 0.9998842 0 -0.01521765 0.9999693 0 -0.007847425 0.9999102 0 -0.01340206 0.9997561 0 -0.02208836 0.9996794 0 -0.0253199 0.9999102 0 -0.01340206 0.9999387 0 -0.01107691 1 0 0 1 0 0 0.9999938 0 -0.003525217 0.9999874 0 -0.005023222 1 0 0 1 0 0 0.9999983 0 -0.00191161 0.9999938 0 -0.003525217 0.9999938 0 -0.003525217 0.9999983 0 -0.00191161 0.9999693 0 -0.007847425 0.9998842 0 -0.01521765 0.9999874 0 -0.005023222 0.9999938 0 -0.003525217 0.9998842 0 -0.01521765 0.9998017 0 -0.01991795 1 0 0 0.999997 0 -0.00246211 0.9999948 0 -0.003249333 1 0 0 0.999997 0 -0.00246211 0.9999387 0 -0.01107691 0.9999102 0 -0.01340206 0.9999948 0 -0.003249333 0.9999948 0 -0.003249333 0.9999102 0 -0.01340206 0.9999693 0 -0.007847425 0.9999983 0 -0.00191161 1 0 0 0.9999948 0 -0.003249333 0.9999983 0 -0.00191161 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999909 0 0.004274368 0.9999813 0 0.006120205 1 0 0 0.9999909 0 0.004274368 0.9997998 0 0.02000563 0.9997735 0 0.0212816 0.9999813 0 0.006120205 0.9999813 0 0.006120205 0.9997735 0 0.0212816 0.9998724 0 0.01597534 0.9999875 0 0.005016236 1 0 0 0.9999813 0 0.006120205 0.9999875 0 0.005016236 1 0 0 0.9983718 0 0.05704197 0.9988504 0 0.04793645 0.999474 0 0.03243007 0.9988461 0 0.04802692 0.9988504 0 0.04793645 0.9997506 0 0.02233555 0.9998136 0 0.01930705 0.999474 0 0.03243007 0.999474 0 0.03243007 0.9998136 0 0.01930705 0.9998724 0 0.01597534 0.9997735 0 0.0212816 0.9988461 0 0.04802692 0.999474 0 0.03243007 0.9997735 0 0.0212816 0.9997998 0 0.02000563 1 0 0 1 0 0 0.9999874 0 0.005030409 0.9999885 0 0.004794281 1 0 0 1 0 0 0.9999875 0 0.005016236 0.9999874 0 0.005030409 0.9999874 0 0.005030409 0.9999875 0 0.005016236 0.9998724 0 0.01597534 0.9998136 0 0.01930705 0.9999885 0 0.004794281 0.9999874 0 0.005030409 0.9998136 0 0.01930705 0.9997506 0 0.02233555 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 2.19952e-4 0.9999999 0 3.78211e-4 1 0 0 1 0 2.19952e-4 0.9999995 0 0.001066297 0.9999994 0 0.001167114 0.9999999 0 3.78211e-4 0.9999999 0 3.78211e-4 0.9999994 0 0.001167114 0.9999996 0 8.71439e-4 1 0 2.23983e-4 1 0 0 0.9999999 0 3.78211e-4 1 0 2.23983e-4 1 0 0 0.9999951 0 0.003128807 0.9999959 0 0.00288636 0.9999968 0 0.002515981 0.9999971 0 0.00239665 0.9999959 0 0.00288636 0.9999992 0 0.001242388 0.9999995 0 0.001075824 0.9999968 0 0.002515981 0.9999968 0 0.002515981 0.9999995 0 0.001075824 0.9999996 0 8.71439e-4 0.9999994 0 0.001167114 0.9999971 0 0.00239665 0.9999968 0 0.002515981 0.9999994 0 0.001167114 0.9999995 0 0.001066297 1 0 0 1 0 0 1 0 2.56879e-4 1 0 2.52728e-4 1 0 0 1 0 0 1 0 2.23983e-4 1 0 2.56879e-4 1 0 2.56879e-4 1 0 2.23983e-4 0.9999996 0 8.71439e-4 0.9999995 0 0.001075824 1 0 2.52728e-4 1 0 2.56879e-4 0.9999995 0 0.001075824 0.9999992 0 0.001242388 1 0 0 0.999993 0 -0.003736568 0.9999471 0 -0.01028878 0.9999743 0 -0.007179503 0.999993 0 -0.003736568 0.9998239 0 -0.01876455 0.9999413 0 -0.01083687 0.9999471 0 -0.01028878 0.9999471 0 -0.01028878 0.9999413 0 -0.01083687 0.9995051 0 -0.03145734 0.9991748 0 -0.04061815 0.9999743 0 -0.007179503 0.9999471 0 -0.01028878 0.9991748 0 -0.04061815 0.9992347 0 -0.03911741 0.9396468 0 -0.3421461 0.9998838 0 -0.01524885 0.9998447 0 -0.01762611 0.9989104 0 -0.04666906 0.9998838 0 -0.01524885 0.9991657 0 -0.04084279 0.998562 0 -0.0536097 0.9998447 0 -0.01762611 0.9998447 0 -0.01762611 0.998562 0 -0.0536097 0.9995051 0 -0.03145734 0.9999413 0 -0.01083687 0.9989104 0 -0.04666906 0.9998447 0 -0.01762611 0.9999413 0 -0.01083687 0.9998239 0 -0.01876455 0.9796551 0 -0.2006887 0.9909981 0 -0.1338757 0.992029 0 -0.1260106 0.9926274 0 -0.1212059 0.9909981 0 -0.1338757 0.9992347 0 -0.03911741 0.9991748 0 -0.04061815 0.992029 0 -0.1260106 0.992029 0 -0.1260106 0.9991748 0 -0.04061815 0.9995051 0 -0.03145734 0.998562 0 -0.0536097 0.9926274 0 -0.1212059 0.992029 0 -0.1260106 0.998562 0 -0.0536097 0.9991657 0 -0.04084279 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9992097 0 -0.03975179 0.9991945 0 -0.04012969 0.9994788 0 -0.03228412 0.9993511 0 -0.03602163 0.9991945 0 -0.04012969 0.9997736 0 -0.02127923 0.9998414 0 -0.0178115 0.9994788 0 -0.03228412 0.9994788 0 -0.03228412 0.9998414 0 -0.0178115 0.9999476 0 -0.01024434 0.9997841 0 -0.02078477 0.9993511 0 -0.03602163 0.9994788 0 -0.03228412 0.9997841 0 -0.02078477 0.9998123 0 -0.01937828 1 0 0 1 0 0 0.9999918 0 -0.004073911 0.9999852 0 -0.005465231 1 0 0 1 0 0 0.9999914 0 -0.004180251 0.9999918 0 -0.004073911 0.9999918 0 -0.004073911 0.9999914 0 -0.004180251 0.9999476 0 -0.01024434 0.9998414 0 -0.0178115 0.9999852 0 -0.005465231 0.9999918 0 -0.004073911 0.9998414 0 -0.0178115 0.9997736 0 -0.02127923 1 0 0 0.9999855 0 -0.005384228 0.9999819 0 -0.006024101 1 0 0 0.9999855 0 -0.005384228 0.9998123 0 -0.01937828 0.9997841 0 -0.02078477 0.9999819 0 -0.006024101 0.9999819 0 -0.006024101 0.9997841 0 -0.02078477 0.9999476 0 -0.01024434 0.9999914 0 -0.004180251 1 0 0 0.9999819 0 -0.006024101 0.9999914 0 -0.004180251 1 0 0 0.9992097 0 -0.03975179 0.9999975 0 -0.002277561 0.9999968 0 -0.002560516 0.9998275 0 -0.01857827 0.9999975 0 -0.002277561 0.9999999 0 6.08616e-4 1 0 0 0.9999968 0 -0.002560516 0.9999968 0 -0.002560516 1 0 0 1 0 3.89811e-4 0.9999995 0 -0.00105966 0.9998275 0 -0.01857827 0.9999968 0 -0.002560516 0.9999995 0 -0.00105966 0.9999641 0 -0.008490225 1 0 0 1 0 0 1 0 0 1 0 -1.18288e-4 1 0 0 1 0 0 1 0 3.86899e-4 1 0 0 1 0 0 1 0 3.86899e-4 1 0 3.89811e-4 1 0 0 1 0 -1.18288e-4 1 0 0 1 0 0 0.9999999 0 6.08616e-4 1 0 0 0.9999985 0 -0.001764203 0.9999997 0 -8.76854e-4 1 0 0 0.9999985 0 -0.001764203 0.9999641 0 -0.008490225 0.9999995 0 -0.00105966 0.9999997 0 -8.76854e-4 0.9999997 0 -8.76854e-4 0.9999995 0 -0.00105966 1 0 3.89811e-4 1 0 3.86899e-4 1 0 0 0.9999997 0 -8.76854e-4 1 0 3.86899e-4 1 0 0 0.9705694 0 0.2408216 0.964454 0 0.2642511 0.9821994 0 0.1878415 0.9961641 0 0.08750448 0.964454 0 0.2642511 0.993331 0 0.1152987 0.9948575 0 0.101284 0.9821994 0 0.1878415 0.9821994 0 0.1878415 0.9948575 0 0.101284 0.998126 0 0.0611918 0.997656 0 0.06843028 0.9961641 0 0.08750448 0.9821994 0 0.1878415 0.997656 0 0.06843028 0.9992023 0 0.03993689 1 0 0 1 0 0 0.999881 0 0.01542989 0.9996563 0 0.02622086 1 0 0 1 0 0 0.9999158 0 0.01298 0.999881 0 0.01542989 0.999881 0 0.01542989 0.9999158 0 0.01298 0.998126 0 0.0611918 0.9948575 0 0.101284 0.9996563 0 0.02622086 0.999881 0 0.01542989 0.9948575 0 0.101284 0.993331 0 0.1152987 1 0 0 0.9999794 0 0.006418762 0.9998842 0 0.01522137 1 0 0 0.9999794 0 0.006418762 0.9992023 0 0.03993689 0.997656 0 0.06843028 0.9998842 0 0.01522137 0.9998842 0 0.01522137 0.997656 0 0.06843028 0.998126 0 0.0611918 0.9999158 0 0.01298 1 0 0 0.9998842 0 0.01522137 0.9999158 0 0.01298 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9972549 0 0.07404645 0.9994918 0 0.03187924 0.9998001 0 0.01999792 0.9993578 0 0.03583309 0.9994918 0 0.03187924 0.9999866 0 0.005182659 0.9999663 0 0.008225355 0.9998001 0 0.01999792 0.9998001 0 0.01999792 0.9999663 0 0.008225355 0.9999857 0 0.005349655 0.9999267 0 0.01211121 0.9993578 0 0.03583309 0.9998001 0 0.01999792 0.9999267 0 0.01211121 0.9999278 0 0.01202335 0.9699758 0 0.2432019 0.9950156 0 0.09972007 0.9997299 0 0.0232445 0.99994 0 0.01095817 0.9950156 0 0.09972007 0.9989703 0 0.04536954 0.9999062 0 0.01370082 0.9997299 0 0.0232445 0.9997299 0 0.0232445 0.9999062 0 0.01370082 0.9999857 0 0.005349655 0.9999663 0 0.008225355 0.99994 0 0.01095817 0.9997299 0 0.0232445 0.9999663 0 0.008225355 0.9999866 0 0.005182659 1 0 0 0.9999976 0 0.002234205 0.9999974 0 0.002315247 0.9999716 0 0.007541521 0.9999976 0 0.002234205 0.9999278 0 0.01202335 0.9999267 0 0.01211121 0.9999974 0 0.002315247 0.9999974 0 0.002315247 0.9999267 0 0.01211121 0.9999857 0 0.005349655 0.9999062 0 0.01370082 0.9999716 0 0.007541521 0.9999974 0 0.002315247 0.9999062 0 0.01370082 0.9989703 0 0.04536954 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9735439 0 -0.2285002 0.9952043 0 -0.09781833 0.992656 0 -0.1209721 0.9794791 0 -0.2015463 0.9952043 0 -0.09781833 0.9984201 0 -0.056192 0.9979696 0 -0.06369264 0.992656 0 -0.1209721 0.992656 0 -0.1209721 0.9979696 0 -0.06369264 0.9993442 0 -0.03621047 0.9987498 0 -0.04998966 0.9794791 0 -0.2015463 0.992656 0 -0.1209721 0.9987498 0 -0.04998966 0.9969721 0 -0.07775941 1 0 0 1 0 0 0.9998304 0 -0.01842354 0.9998764 0 -0.01572388 1 0 0 1 0 0 0.9999915 0 -0.004135802 0.9998304 0 -0.01842354 0.9998304 0 -0.01842354 0.9999915 0 -0.004135802 0.9993442 0 -0.03621047 0.9979696 0 -0.06369264 0.9998764 0 -0.01572388 0.9998304 0 -0.01842354 0.9979696 0 -0.06369264 0.9984201 0 -0.056192 1 0 0 0.9998991 0 -0.01420806 0.999953 0 -0.009708451 1 0 0 0.9998991 0 -0.01420806 0.9969721 0 -0.07775941 0.9987498 0 -0.04998966 0.999953 0 -0.009708451 0.999953 0 -0.009708451 0.9987498 0 -0.04998966 0.9993442 0 -0.03621047 0.9999915 0 -0.004135802 1 0 0 0.999953 0 -0.009708451 0.9999915 0 -0.004135802 1 0 0 1 0 0 1 0 0 0.9994099 0 0.03434982 0.9996095 0 0.0279458 1 0 0 1 0 0 0.9996574 0 0.02617773 0.9994099 0 0.03434982 0.9994099 0 0.03434982 0.9996574 0 0.02617773 0.9955867 0 0.09384704 0.9910038 0 0.1338342 0.9996095 0 0.0279458 0.9994099 0 0.03434982 0.9910038 0 0.1338342 0.9931109 0 0.1171791 1 0 0 0.9996563 0 0.02622086 0.999602 0 0.02821222 1 0 0 0.9996563 0 0.02622086 0.993331 0 0.1152987 0.9903671 0 0.1384669 0.999602 0 0.02821222 0.999602 0 0.02821222 0.9903671 0 0.1384669 0.9955867 0 0.09384704 0.9996574 0 0.02617773 1 0 0 0.999602 0 0.02821222 0.9996574 0 0.02617773 1 0 0 0.9705694 0 0.2408216 0.9738979 0 0.2269864 0.9778478 0 0.2093175 0.964454 0 0.2642511 0.9738979 0 0.2269864 0.9931109 0 0.1171791 0.9910038 0 0.1338342 0.9778478 0 0.2093175 0.9778478 0 0.2093175 0.9910038 0 0.1338342 0.9955867 0 0.09384704 0.9903671 0 0.1384669 0.964454 0 0.2642511 0.9778478 0 0.2093175 0.9903671 0 0.1384669 0.993331 0 0.1152987 1 0 0 1 0 0 0.9999905 0 0.004366007 0.9999958 0 0.002898719 1 0 0 1 0 0 0.9999977 0 0.002165311 0.9999905 0 0.004366007 0.9999905 0 0.004366007 0.9999977 0 0.002165311 0.9999613 0 0.008807291 0.999887 0 0.01503481 0.9999958 0 0.002898719 0.9999905 0 0.004366007 0.999887 0 0.01503481 0.999921 0 0.01257228 1 0 0 0.9999885 0 0.004794281 0.9999921 0 0.003982209 1 0 0 0.9999885 0 0.004794281 0.9997506 0 0.02233555 0.9998528 0 0.01716108 0.9999921 0 0.003982209 0.9999921 0 0.003982209 0.9998528 0 0.01716108 0.9999613 0 0.008807291 0.9999977 0 0.002165311 1 0 0 0.9999921 0 0.003982209 0.9999977 0 0.002165311 1 0 0 0.9983718 0 0.05704197 0.9996998 0 0.02450331 0.9995984 0 0.02834102 0.9988504 0 0.04793645 0.9996998 0 0.02450331 0.999921 0 0.01257228 0.999887 0 0.01503481 0.9995984 0 0.02834102 0.9995984 0 0.02834102 0.999887 0 0.01503481 0.9999613 0 0.008807291 0.9998528 0 0.01716108 0.9988504 0 0.04793645 0.9995984 0 0.02834102 0.9998528 0 0.01716108 0.9997506 0 0.02233555 1 0 0 1 0 0 0.9998024 0 -0.01988413 0.9999571 0 -0.009263248 1 0 0 1 0 0 0.9997915 0 -0.02042367 0.9998024 0 -0.01988413 0.9998024 0 -0.01988413 0.9997915 0 -0.02042367 0.9969519 0 -0.07802019 0.9967305 0 -0.0807979 0.9999571 0 -0.009263248 0.9998024 0 -0.01988413 0.9967305 0 -0.0807979 0.9988796 0 -0.04732391 1 0 0 0.9994544 0 -0.03302915 0.9995561 0 -0.0297944 1 0 0 0.9994544 0 -0.03302915 0.990271 0 -0.1391524 0.9917409 0 -0.1282583 0.9995561 0 -0.0297944 0.9995561 0 -0.0297944 0.9917409 0 -0.1282583 0.9969519 0 -0.07802019 0.9997915 0 -0.02042367 1 0 0 0.9995561 0 -0.0297944 0.9997915 0 -0.02042367 1 0 0 0.9705659 0 -0.2408359 0.9958242 0 -0.09129237 0.9795341 0 -0.2012782 0.9590113 0 -0.2833681 0.9958242 0 -0.09129237 0.9988796 0 -0.04732391 0.9967305 0 -0.0807979 0.9795341 0 -0.2012782 0.9795341 0 -0.2012782 0.9967305 0 -0.0807979 0.9969519 0 -0.07802019 0.9917409 0 -0.1282583 0.9590113 0 -0.2833681 0.9795341 0 -0.2012782 0.9917409 0 -0.1282583 0.990271 0 -0.1391524 1 0 0 1 0 0 0.9999999 0 5.34817e-4 0.9999991 0 0.001373424 1 0 0 1 0 0 0.9999999 0 -5.35844e-4 0.9999999 0 5.34817e-4 0.9999999 0 5.34817e-4 0.9999999 0 -5.35844e-4 0.9999999 0 -5.74373e-4 0.9999998 0 5.9679e-4 0.9999991 0 0.001373424 0.9999999 0 5.34817e-4 0.9999998 0 5.9679e-4 0.999971 0 0.007622748 1 0 0 1 0 1.19798e-4 1 0 0 1 0 0 1 0 1.19798e-4 0.9999999 0 -6.03085e-4 1 0 -2.3371e-4 1 0 0 1 0 0 1 0 -2.3371e-4 0.9999999 0 -5.74373e-4 0.9999999 0 -5.35844e-4 1 0 0 1 0 0 0.9999999 0 -5.35844e-4 1 0 0 0.9992094 0 0.03975805 0.9998305 0 0.01841405 0.9999976 0 0.002216784 0.9999975 0 0.002280457 0.9998305 0 0.01841405 0.999971 0 0.007622748 0.9999998 0 5.9679e-4 0.9999976 0 0.002216784 0.9999976 0 0.002216784 0.9999998 0 5.9679e-4 0.9999999 0 -5.74373e-4 1 0 -2.3371e-4 0.9999975 0 0.002280457 0.9999976 0 0.002216784 1 0 -2.3371e-4 0.9999999 0 -6.03085e-4 1 0 0 1 0 0 0.9999843 0 0.005600119 0.9999877 0 0.004986196 1 0 0 1 0 0 0.9999894 0 0.004604485 0.9999843 0 0.005600119 0.9999843 0 0.005600119 0.9999894 0 0.004604485 0.9999506 0 0.009937806 0.9997979 0 0.02010581 0.9999877 0 0.004986196 0.9999843 0 0.005600119 0.9997979 0 0.02010581 0.9998266 0 0.01862769 1 0 0 0.9999887 0 0.004746722 0.9999871 0 0.005073776 1 0 0 0.9999887 0 0.004746722 0.9997934 0 0.02033068 0.9998201 0 0.01897089 0.9999871 0 0.005073776 0.9999871 0 0.005073776 0.9998201 0 0.01897089 0.9999506 0 0.009937806 0.9999894 0 0.004604485 1 0 0 0.9999871 0 0.005073776 0.9999894 0 0.004604485 1 0 0 0.9992094 0 0.03975805 0.9993587 0 0.03580722 0.9994937 0 0.03181937 0.9992108 0 0.03972349 0.9993587 0 0.03580722 0.9998266 0 0.01862769 0.9997979 0 0.02010581 0.9994937 0 0.03181937 0.9994937 0 0.03181937 0.9997979 0 0.02010581 0.9999506 0 0.009937806 0.9998201 0 0.01897089 0.9992108 0 0.03972349 0.9994937 0 0.03181937 0.9998201 0 0.01897089 0.9997934 0 0.02033068 1 0 0 0.9999621 0 -0.008706636 0.9997286 0 -0.02329814 0.9995291 0 -0.03068565 0.9999621 0 -0.008706636 0.9993883 0 -0.03497165 0.9986745 0 -0.05147235 0.9997286 0 -0.02329814 0.9997286 0 -0.02329814 0.9986745 0 -0.05147235 0.9968883 0 -0.07882831 0.9973855 0 -0.0722653 0.9995291 0 -0.03068565 0.9997286 0 -0.02329814 0.9973855 0 -0.0722653 0.9924313 0 -0.1228009 0.9972528 0 -0.07407407 0.9636753 0 -0.2670768 0.994397 0 -0.1057093 0.9975903 0 -0.06938018 0.9636753 0 -0.2670768 0.9630105 0 -0.2694641 0.9828737 0 -0.1842811 0.994397 0 -0.1057093 0.994397 0 -0.1057093 0.9828737 0 -0.1842811 0.9968883 0 -0.07882831 0.9986745 0 -0.05147235 0.9975903 0 -0.06938018 0.994397 0 -0.1057093 0.9986745 0 -0.05147235 0.9993883 0 -0.03497165 0.9705659 0 -0.2408359 0.9734796 0 -0.228774 0.9944221 0 -0.1054736 0.9886273 0 -0.1503871 0.9734796 0 -0.228774 0.9924313 0 -0.1228009 0.9973855 0 -0.0722653 0.9944221 0 -0.1054736 0.9944221 0 -0.1054736 0.9973855 0 -0.0722653 0.9968883 0 -0.07882831 0.9828737 0 -0.1842811 0.9886273 0 -0.1503871 0.9944221 0 -0.1054736 0.9828737 0 -0.1842811 0.9630105 0 -0.2694641 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999695 0 -0.007812867 0.9999969 0 -0.00248503 0.9999972 0 -0.002405127 0.9999695 0 -0.007812867 0.9989347 0 -0.04614698 0.9999003 0 -0.01412689 0.9999969 0 -0.00248503 0.9999969 0 -0.00248503 0.9999003 0 -0.01412689 0.9999853 0 -0.00542892 0.9999232 0 -0.01239257 0.9999972 0 -0.002405127 0.9999969 0 -0.00248503 0.9999232 0 -0.01239257 0.9999202 0 -0.01264085 0.9699796 0 -0.2431867 0.99994 0 -0.01096025 0.9997221 0 -0.02357461 0.9949716 0 -0.1001573 0.99994 0 -0.01096025 0.9999868 0 -0.00514752 0.9999661 0 -0.008240524 0.9997221 0 -0.02357461 0.9997221 0 -0.02357461 0.9999661 0 -0.008240524 0.9999853 0 -0.00542892 0.9999003 0 -0.01412689 0.9949716 0 -0.1001573 0.9997221 0 -0.02357461 0.9999003 0 -0.01412689 0.9989347 0 -0.04614698 0.9972528 0 -0.07407407 0.999334 0 -0.03649249 0.9997956 0 -0.02021912 0.9994916 0 -0.03188623 0.999334 0 -0.03649249 0.9999202 0 -0.01264085 0.9999232 0 -0.01239257 0.9997956 0 -0.02021912 0.9997956 0 -0.02021912 0.9999232 0 -0.01239257 0.9999853 0 -0.00542892 0.9999661 0 -0.008240524 0.9994916 0 -0.03188623 0.9997956 0 -0.02021912 0.9999661 0 -0.008240524 0.9999868 0 -0.00514752 1 0 0 1 0 0 0.9999536 0 0.009646579 0.9998999 0 0.01414798 1 0 0 1 0 0 0.9999943 0 0.003386697 0.9999536 0 0.009646579 0.9999536 0 0.009646579 0.9999943 0 0.003386697 0.9994133 0 0.03425321 0.9987975 0 0.04902789 0.9998999 0 0.01414798 0.9999536 0 0.009646579 0.9987975 0 0.04902789 0.9970366 0 0.07692924 1 0 0 0.9998105 0 0.01947046 0.9999403 0 0.01093086 1 0 0 0.9998105 0 0.01947046 0.9982985 0 0.05831166 0.9985089 0 0.05458978 0.9999403 0 0.01093086 0.9999403 0 0.01093086 0.9985089 0 0.05458978 0.9994133 0 0.03425321 0.9999943 0 0.003386697 1 0 0 0.9999403 0 0.01093086 0.9999943 0 0.003386697 1 0 0 0.9735433 0 0.2285024 0.9797513 0 0.2002186 0.992876 0 0.1191526 0.995338 0 0.0964483 0.9797513 0 0.2002186 0.9970366 0 0.07692924 0.9987975 0 0.04902789 0.992876 0 0.1191526 0.992876 0 0.1191526 0.9987975 0 0.04902789 0.9994133 0 0.03425321 0.9985089 0 0.05458978 0.995338 0 0.0964483 0.992876 0 0.1191526 0.9985089 0 0.05458978 0.9982985 0 0.05831166 1 0 0 0.9998999 0 0.01414798 0.9997198 0 0.02367271 0.9999962 0 0.002760386 0.9998999 0 0.01414798 0.9970366 0 0.07692924 0.9965175 0 0.08338481 0.9997198 0 0.02367271 0.9997198 0 0.02367271 0.9965175 0 0.08338481 0.9990816 0 0.04284976 0.9999481 0 0.01018491 0.9999962 0 0.002760386 0.9997198 0 0.02367271 0.9999481 0 0.01018491 0.9999217 0 0.01251208 0.9735433 0 0.2285024 0.9644312 0 0.2643341 0.9863436 0 0.1647008 0.9797513 0 0.2002186 0.9644312 0 0.2643341 0.9904424 0 0.1379277 0.9963481 0 0.08538461 0.9863436 0 0.1647008 0.9863436 0 0.1647008 0.9963481 0 0.08538461 0.9990816 0 0.04284976 0.9965175 0 0.08338481 0.9797513 0 0.2002186 0.9863436 0 0.1647008 0.9965175 0 0.08338481 0.9970366 0 0.07692924 0.9993877 0 0.03498853 0.9986793 0 0.05137941 0.9999604 0 -0.008898944 0.9998608 0 -0.01668631 0.9986793 0 0.05137941 0.9999217 0 0.01251208 0.9999481 0 0.01018491 0.9999604 0 -0.008898944 0.9999604 0 -0.008898944 0.9999481 0 0.01018491 0.9990816 0 0.04284976 0.9963481 0 0.08538461 0.9998608 0 -0.01668631 0.9999604 0 -0.008898944 0.9963481 0 0.08538461 0.9904424 0 0.1379277 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999743 0 -0.007179503 0.9999486 0 -0.01014991 0.999997 0 -0.00246211 0.9999743 0 -0.007179503 0.9992347 0 -0.03911741 0.999274 0 -0.03809716 0.9999486 0 -0.01014991 0.9999486 0 -0.01014991 0.999274 0 -0.03809716 0.9996614 0 -0.02602179 0.9999709 0 -0.007635208 0.999997 0 -0.00246211 0.9999486 0 -0.01014991 0.9999709 0 -0.007635208 0.9999387 0 -0.01107691 0.9796551 0 -0.2006887 0.9971032 0 -0.07606082 0.9954996 0 -0.09476677 0.9909981 0 -0.1338757 0.9971032 0 -0.07606082 0.9994395 0 -0.03347798 0.999054 0 -0.0434885 0.9954996 0 -0.09476677 0.9954996 0 -0.09476677 0.999054 0 -0.0434885 0.9996614 0 -0.02602179 0.999274 0 -0.03809716 0.9909981 0 -0.1338757 0.9954996 0 -0.09476677 0.999274 0 -0.03809716 0.9992347 0 -0.03911741 0.9987705 0 -0.04957445 0.9997561 0 -0.02208836 0.9999054 0 -0.01375396 0.9999402 0 -0.01093907 0.9997561 0 -0.02208836 0.9999387 0 -0.01107691 0.9999709 0 -0.007635208 0.9999054 0 -0.01375396 0.9999054 0 -0.01375396 0.9999709 0 -0.007635208 0.9996614 0 -0.02602179 0.999054 0 -0.0434885 0.9999402 0 -0.01093907 0.9999054 0 -0.01375396 0.999054 0 -0.0434885 0.9994395 0 -0.03347798 1 0 0 0.9999874 0 -0.005023222 0.9999899 0 -0.004520237 1 0 0 0.9999874 0 -0.005023222 0.9998017 0 -0.01991795 0.9998555 0 -0.01700173 0.9999899 0 -0.004520237 0.9999899 0 -0.004520237 0.9998555 0 -0.01700173 0.9999081 0 -0.01356535 0.9999936 0 -0.003606558 1 0 0 0.9999899 0 -0.004520237 0.9999936 0 -0.003606558 1 0 0 0.9987705 0 -0.04957445 0.9993985 0 -0.03468076 0.9993179 0 -0.036929 0.9990159 0 -0.04435477 0.9993985 0 -0.03468076 0.9998623 0 -0.01659588 0.9998385 0 -0.0179756 0.9993179 0 -0.036929 0.9993179 0 -0.036929 0.9998385 0 -0.0179756 0.9999081 0 -0.01356535 0.9998555 0 -0.01700173 0.9990159 0 -0.04435477 0.9993179 0 -0.036929 0.9998555 0 -0.01700173 0.9998017 0 -0.01991795 1 0 0 1 0 0 0.9999822 0 -0.005975649 0.9999941 0 -0.003440148 1 0 0 1 0 0 0.9999936 0 -0.003606558 0.9999822 0 -0.005975649 0.9999822 0 -0.005975649 0.9999936 0 -0.003606558 0.9999081 0 -0.01356535 0.9998385 0 -0.0179756 0.9999941 0 -0.003440148 0.9999822 0 -0.005975649 0.9998385 0 -0.0179756 0.9998623 0 -0.01659588 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9964156 0 -0.08459286 0.9988561 0 -0.04781866 1 0 0 0.9964156 0 -0.08459286 0.9701993 0 -0.2423083 0.9834834 0 -0.1809988 0.9988561 0 -0.04781866 0.9988561 0 -0.04781866 0.9834834 0 -0.1809988 0.9978513 0 -0.06552161 0.9999395 0 -0.01100671 1 0 0 0.9988561 0 -0.04781866 0.9999395 0 -0.01100671 1 0 0 0.9396468 0 -0.3421461 0.9989104 0 -0.04666906 0.9711338 0 -0.2385358 0.8711829 0 -0.4909589 0.9989104 0 -0.04666906 0.9998239 0 -0.01876455 0.9990245 0 -0.04416127 0.9711338 0 -0.2385358 0.9711338 0 -0.2385358 0.9990245 0 -0.04416127 0.9978513 0 -0.06552161 0.9834834 0 -0.1809988 0.8711829 0 -0.4909589 0.9711338 0 -0.2385358 0.9834834 0 -0.1809988 0.9701993 0 -0.2423083 1 0 0 1 0 0 0.9999598 0 -0.008968618 0.999993 0 -0.003736568 1 0 0 1 0 0 0.9999395 0 -0.01100671 0.9999598 0 -0.008968618 0.9999598 0 -0.008968618 0.9999395 0 -0.01100671 0.9978513 0 -0.06552161 0.9990245 0 -0.04416127 0.999993 0 -0.003736568 0.9999598 0 -0.008968618 0.9990245 0 -0.04416127 0.9998239 0 -0.01876455 1 0 0 1 0 0 1 0 2.38245e-4 1 0 0 1 0 0 1 0 0 1 0 1.9626e-4 1 0 2.38245e-4 1 0 2.38245e-4 1 0 1.9626e-4 0.9999999 0 4.98052e-4 0.9999998 0 8.1606e-4 1 0 0 1 0 2.38245e-4 0.9999998 0 8.1606e-4 0.9999999 0 6.14092e-4 1 0 0 1 0 2.52728e-4 1 0 2.6648e-4 1 0 0 1 0 2.52728e-4 0.9999992 0 0.001242388 0.9999996 0 9.49855e-4 1 0 2.6648e-4 1 0 2.6648e-4 0.9999996 0 9.49855e-4 0.9999999 0 4.98052e-4 1 0 1.9626e-4 1 0 0 1 0 2.6648e-4 1 0 1.9626e-4 1 0 0 0.9999951 0 0.003128807 0.9999994 0 0.001167635 0.9999988 0 0.001593654 0.9999959 0 0.00288636 0.9999994 0 0.001167635 0.9999999 0 6.14092e-4 0.9999998 0 8.1606e-4 0.9999988 0 0.001593654 0.9999988 0 0.001593654 0.9999998 0 8.1606e-4 0.9999999 0 4.98052e-4 0.9999996 0 9.49855e-4 0.9999959 0 0.00288636 0.9999988 0 0.001593654 0.9999996 0 9.49855e-4 0.9999992 0 0.001242388 1 0 0 1 0 0 0.9997926 0 0.02036476 0.9999226 0 0.01244123 1 0 0 0.9999999 0 6.14092e-4 0.9998637 0 0.01651351 0.9997926 0 0.02036476 0.9997926 0 0.02036476 0.9998637 0 0.01651351 0.997911 0 0.06460392 0.9967074 0 0.08108172 0.9999226 0 0.01244123 0.9997926 0 0.02036476 0.9967074 0 0.08108172 0.997335 0 0.07295907 0.9999951 0 0.003128807 0.9998704 0 0.01610699 0.9996341 0 0.02704896 0.9999994 0 0.001167635 0.9998704 0 0.01610699 0.9967952 0 0.07999703 0.9962587 0 0.08642121 0.9996341 0 0.02704896 0.9996341 0 0.02704896 0.9962587 0 0.08642121 0.997911 0 0.06460392 0.9998637 0 0.01651351 0.9999994 0 0.001167635 0.9996341 0 0.02704896 0.9998637 0 0.01651351 0.9999999 0 6.14092e-4 0.7752203 0 0.631691 0.9315168 0 0.3636984 0.9811346 0 0.1933261 0.9843048 0 0.1764765 0.9315168 0 0.3636984 0.997335 0 0.07295907 0.9967074 0 0.08108172 0.9811346 0 0.1933261 0.9811346 0 0.1933261 0.9967074 0 0.08108172 0.997911 0 0.06460392 0.9962587 0 0.08642121 0.9843048 0 0.1764765 0.9811346 0 0.1933261 0.9962587 0 0.08642121 0.9967952 0 0.07999703 1 0 0 1 0 0 0.9996326 0 -0.02710632 0.9772404 0 -0.212135 1 0 0 1 0 0 0.9999751 0 -0.007059417 0.9996326 0 -0.02710632 0.9996326 0 -0.02710632 0.9999751 0 -0.007059417 0.9999856 0 -0.005370983 0.9882225 0 -0.1530247 0.9772404 0 -0.212135 0.9996326 0 -0.02710632 0.9882225 0 -0.1530247 0.9643734 0 -0.264545 1 0 0 0.9999226 0 0.01244123 0.9999685 0 0.007944888 1 0 0 0.9999226 0 0.01244123 0.997335 0 0.07295907 0.9994373 0 0.03354382 0.9999685 0 0.007944888 0.9999685 0 0.007944888 0.9994373 0 0.03354382 0.9999856 0 -0.005370983 0.9999751 0 -0.007059417 1 0 0 0.9999685 0 0.007944888 0.9999751 0 -0.007059417 1 0 0 0.7752203 0 0.631691 0.9143339 0 0.4049613 0.9998632 0 0.01653966 0.9315168 0 0.3636984 0.9143339 0 0.4049613 0.9643734 0 -0.264545 0.9882225 0 -0.1530247 0.9998632 0 0.01653966 0.9998632 0 0.01653966 0.9882225 0 -0.1530247 0.9999856 0 -0.005370983 0.9994373 0 0.03354382 0.9315168 0 0.3636984 0.9998632 0 0.01653966 0.9994373 0 0.03354382 0.997335 0 0.07295907 1 0 0 0.9999753 0 0.007037312 0.9999996 0 -9.19764e-4 0.9999506 0 -0.009949302 0.9999753 0 0.007037312 0.9991975 0 0.04005554 0.9993412 0 0.03629411 0.9999996 0 -9.19764e-4 0.9999996 0 -9.19764e-4 0.9993412 0 0.03629411 0.9999896 0 0.004567519 0.9991871 0 -0.04031466 0.9999506 0 -0.009949302 0.9999996 0 -9.19764e-4 0.9991871 0 -0.04031466 0.9985448 0 -0.05392956 0.9749212 0 0.2225507 0.9937391 0 0.1117253 0.9929941 0 0.1181646 0.9916186 0 0.1292 0.9937391 0 0.1117253 0.9998816 0 -0.01539166 0.9993204 0 0.03685948 0.9929941 0 0.1181646 0.9929941 0 0.1181646 0.9993204 0 0.03685948 0.9999896 0 0.004567519 0.9993412 0 0.03629411 0.9916186 0 0.1292 0.9929941 0 0.1181646 0.9993412 0 0.03629411 0.9991975 0 0.04005554 0.9330323 0 -0.3597926 0.9798475 0 -0.1997472 0.998621 0 -0.05250068 0.967504 0 -0.2528557 0.9798475 0 -0.1997472 0.9985448 0 -0.05392956 0.9991871 0 -0.04031466 0.998621 0 -0.05250068 0.998621 0 -0.05250068 0.9991871 0 -0.04031466 0.9999896 0 0.004567519 0.9993204 0 0.03685948 0.967504 0 -0.2528557 0.998621 0 -0.05250068 0.9993204 0 0.03685948 0.9998816 0 -0.01539166 0.9330323 0 -0.3597926 0.9901475 0 -0.1400286 0.9878016 0 -0.1557177 0.9798475 0 -0.1997472 0.9901475 0 -0.1400286 0.9980896 0 -0.06178422 0.997742 0 -0.06716365 0.9878016 0 -0.1557177 0.9878016 0 -0.1557177 0.997742 0 -0.06716365 0.9987426 0 -0.05013302 0.9980633 0 -0.06220724 0.9798475 0 -0.1997472 0.9878016 0 -0.1557177 0.9980633 0 -0.06220724 0.9985448 0 -0.05392956 1 0 0 1 0 0 0.9998479 0 -0.01744653 0.9999215 0 -0.01252975 1 0 0 1 0 0 0.9998893 0 -0.01487925 0.9998479 0 -0.01744653 0.9998479 0 -0.01744653 0.9998893 0 -0.01487925 0.9987426 0 -0.05013302 0.997742 0 -0.06716365 0.9999215 0 -0.01252975 0.9998479 0 -0.01744653 0.997742 0 -0.06716365 0.9980896 0 -0.06178422 1 0 0 0.9999506 0 -0.009949302 0.9998828 0 -0.01531897 1 0 0 0.9999506 0 -0.009949302 0.9985448 0 -0.05392956 0.9980633 0 -0.06220724 0.9998828 0 -0.01531897 0.9998828 0 -0.01531897 0.9980633 0 -0.06220724 0.9987426 0 -0.05013302 0.9998893 0 -0.01487925 1 0 0 0.9998828 0 -0.01531897 0.9998893 0 -0.01487925 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998764 0 -0.01572388 0.9998682 0 -0.01623951 0.9999855 0 -0.005384228 0.9998764 0 -0.01572388 0.9984201 0 -0.056192 0.9985554 0 -0.05373182 0.9998682 0 -0.01623951 0.9998682 0 -0.01623951 0.9985554 0 -0.05373182 0.9984438 0 -0.05576888 0.9995371 0 -0.03042462 0.9999855 0 -0.005384228 0.9998682 0 -0.01623951 0.9995371 0 -0.03042462 0.9998123 0 -0.01937828 0.9735439 0 -0.2285002 0.9938242 0 -0.110966 0.9960235 0 -0.08909103 0.9952043 0 -0.09781833 0.9938242 0 -0.110966 0.9953981 0 -0.09582715 0.9963723 0 -0.08510155 0.9960235 0 -0.08909103 0.9960235 0 -0.08909103 0.9963723 0 -0.08510155 0.9984438 0 -0.05576888 0.9985554 0 -0.05373182 0.9952043 0 -0.09781833 0.9960235 0 -0.08909103 0.9985554 0 -0.05373182 0.9984201 0 -0.056192 0.9992097 0 -0.03975179 0.9993511 0 -0.03602163 0.9987407 0 -0.05017056 0.9989149 0 -0.04657286 0.9993511 0 -0.03602163 0.9998123 0 -0.01937828 0.9995371 0 -0.03042462 0.9987407 0 -0.05017056 0.9987407 0 -0.05017056 0.9995371 0 -0.03042462 0.9984438 0 -0.05576888 0.9963723 0 -0.08510155 0.9989149 0 -0.04657286 0.9987407 0 -0.05017056 0.9963723 0 -0.08510155 0.9953981 0 -0.09582715 1 0 0 1 0 0 0.999994 0 -0.003448655 0.9999985 0 -0.001764203 1 0 0 1 0 0 0.9999936 0 -0.003604572 0.999994 0 -0.003448655 0.999994 0 -0.003448655 0.9999936 0 -0.003604572 0.9999203 0 -0.01262428 0.9999373 0 -0.01119768 0.9999985 0 -0.001764203 0.999994 0 -0.003448655 0.9999373 0 -0.01119768 0.9999641 0 -0.008490225 1 0 0 0.9999852 0 -0.005465231 0.9999874 0 -0.005033725 1 0 0 0.9999852 0 -0.005465231 0.9997736 0 -0.02127923 0.9998643 0 -0.0164728 0.9999874 0 -0.005033725 0.9999874 0 -0.005033725 0.9998643 0 -0.0164728 0.9999203 0 -0.01262428 0.9999936 0 -0.003604572 1 0 0 0.9999874 0 -0.005033725 0.9999936 0 -0.003604572 1 0 0 0.9992097 0 -0.03975179 0.9998275 0 -0.01857827 0.9997521 0 -0.02226968 0.9991945 0 -0.04012969 0.9998275 0 -0.01857827 0.9999641 0 -0.008490225 0.9999373 0 -0.01119768 0.9997521 0 -0.02226968 0.9997521 0 -0.02226968 0.9999373 0 -0.01119768 0.9999203 0 -0.01262428 0.9998643 0 -0.0164728 0.9991945 0 -0.04012969 0.9997521 0 -0.02226968 0.9998643 0 -0.0164728 0.9997736 0 -0.02127923 1 0 0 1 0 0 0.9999996 0 8.61925e-4 0.9999794 0 0.006418762 1 0 0 1 0 0 1 0 0 0.9999996 0 8.61925e-4 0.9999996 0 8.61925e-4 1 0 0 1 0 0 0.9999683 0 0.007963911 0.9999794 0 0.006418762 0.9999996 0 8.61925e-4 0.9999683 0 0.007963911 0.9992023 0 0.03993689 1 0 0 0.9999999 0 5.75226e-4 1 0 1.59417e-4 1 0 0 0.9999999 0 5.75226e-4 0.9999933 0 -0.003674217 0.9999991 0 -0.001373334 1 0 1.59417e-4 1 0 1.59417e-4 0.9999991 0 -0.001373334 1 0 0 1 0 0 1 0 0 1 0 1.59417e-4 1 0 0 1 0 0 0.9705694 0 0.2408216 0.9961641 0 0.08750448 0.9999029 0 0.01393952 0.9998934 0 0.01460684 0.9961641 0 0.08750448 0.9992023 0 0.03993689 0.9999683 0 0.007963911 0.9999029 0 0.01393952 0.9999029 0 0.01393952 0.9999683 0 0.007963911 1 0 0 0.9999991 0 -0.001373334 0.9998934 0 0.01460684 0.9999029 0 0.01393952 0.9999991 0 -0.001373334 0.9999933 0 -0.003674217 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999983 0 0.001862486 0.9999976 0 0.002234205 1 0 0 1 0 0 0.9999995 0 0.0010345 0.9999983 0 0.001862486 0.9999983 0 0.001862486 0.9999995 0 0.0010345 0.9999596 0 0.008987466 0.9999321 0 0.01165168 0.9999976 0 0.002234205 0.9999983 0 0.001862486 0.9999321 0 0.01165168 0.9999278 0 0.01202335 1 0 0 0.9999698 0 0.007783858 0.9999915 0 0.004131836 1 0 0 0.9999698 0 0.007783858 0.9995403 0 0.03031696 0.9997827 0 0.02084827 0.9999915 0 0.004131836 0.9999915 0 0.004131836 0.9997827 0 0.02084827 0.9999596 0 0.008987466 0.9999995 0 0.0010345 1 0 0 0.9999915 0 0.004131836 0.9999995 0 0.0010345 1 0 0 0.9972549 0 0.07404645 0.9993578 0 0.03583309 0.9992227 0 0.03942132 0.9977438 0 0.06713681 0.9993578 0 0.03583309 0.9999278 0 0.01202335 0.9999321 0 0.01165168 0.9992227 0 0.03942132 0.9992227 0 0.03942132 0.9999321 0 0.01165168 0.9999596 0 0.008987466 0.9997827 0 0.02084827 0.9977438 0 0.06713681 0.9992227 0 0.03942132 0.9997827 0 0.02084827 0.9995403 0 0.03031696 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999716 0 0.007541521 0.9997839 0 0.02079172 0.9999962 0 -0.00274991 0.9999716 0 0.007541521 0.9989703 0 0.04536954 0.9968864 0 0.07885214 0.9997839 0 0.02079172 0.9997839 0 0.02079172 0.9968864 0 0.07885214 0.9973447 0 0.07282738 0.9999996 0 -9.39375e-4 0.9999962 0 -0.00274991 0.9997839 0 0.02079172 0.9999996 0 -9.39375e-4 0.9999224 0 -0.01246261 0.9699758 0 0.2432019 0.9545577 0 0.2980264 0.9758947 0 0.2182421 0.9950156 0 0.09972007 0.9545577 0 0.2980264 0.9967732 0 0.0802699 0.9953761 0 0.09605504 0.9758947 0 0.2182421 0.9758947 0 0.2182421 0.9953761 0 0.09605504 0.9973447 0 0.07282738 0.9968864 0 0.07885214 0.9950156 0 0.09972007 0.9758947 0 0.2182421 0.9968864 0 0.07885214 0.9989703 0 0.04536954 0.9993877 0 -0.03498971 0.9986791 0 -0.05138171 0.9996355 0 -0.02699911 0.9952688 0 -0.09715999 0.9986791 0 -0.05138171 0.9999224 0 -0.01246261 0.9999996 0 -9.39375e-4 0.9996355 0 -0.02699911 0.9996355 0 -0.02699911 0.9999996 0 -9.39375e-4 0.9973447 0 0.07282738 0.9953761 0 0.09605504 0.9952688 0 -0.09715999 0.9996355 0 -0.02699911 0.9953761 0 0.09605504 0.9967732 0 0.0802699 0.9993877 0 -0.03498971 0.9998608 0 0.01668841 0.9999608 0 0.008849177 0.9986791 0 -0.05138171 0.9998608 0 0.01668841 0.9904413 0 -0.1379358 0.9963335 0 -0.08555418 0.9999608 0 0.008849177 0.9999608 0 0.008849177 0.9963335 0 -0.08555418 0.9990767 0 -0.04296326 0.9999453 0 -0.01046467 0.9986791 0 -0.05138171 0.9999608 0 0.008849177 0.9999453 0 -0.01046467 0.9999224 0 -0.01246261 0.9735439 0 -0.2285002 0.9794791 0 -0.2015463 0.9862394 0 -0.1653234 0.9644316 0 -0.2643328 0.9794791 0 -0.2015463 0.9969721 0 -0.07775941 0.9964721 0 -0.08392432 0.9862394 0 -0.1653234 0.9862394 0 -0.1653234 0.9964721 0 -0.08392432 0.9990767 0 -0.04296326 0.9963335 0 -0.08555418 0.9644316 0 -0.2643328 0.9862394 0 -0.1653234 0.9963335 0 -0.08555418 0.9904413 0 -0.1379358 1 0 0 0.9999962 0 -0.00274991 0.9997038 0 -0.02434111 0.9998991 0 -0.01420806 0.9999962 0 -0.00274991 0.9999224 0 -0.01246261 0.9999453 0 -0.01046467 0.9997038 0 -0.02434111 0.9997038 0 -0.02434111 0.9999453 0 -0.01046467 0.9990767 0 -0.04296326 0.9964721 0 -0.08392432 0.9998991 0 -0.01420806 0.9997038 0 -0.02434111 0.9964721 0 -0.08392432 0.9969721 0 -0.07775941</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape3-texbinormals-array" count="3264" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape3-vertices" name="qt_gauge_background_Shape3-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape3-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape3-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape3-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape3-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="1632">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape3-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape3-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape3-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape3-texbinormals" offset="2" set="0"/>
+ <p>40 40 0 639 639 1 644 644 3 644 644 3 639 639 1 231 231 2 639 639 4 116 116 5 231 231 7 231 231 7 116 116 5 435 435 6 231 231 8 435 435 9 437 437 11 437 437 11 435 435 9 163 48 10 644 644 12 231 231 13 118 118 15 118 118 15 231 231 13 437 437 14 42 42 16 641 641 17 640 640 19 640 640 19 641 641 17 232 232 18 641 641 20 117 117 21 232 232 23 232 232 23 117 117 21 436 436 22 436 436 25 163 48 26 232 232 24 232 232 24 163 48 26 435 435 27 116 116 31 640 640 28 435 435 30 640 640 28 232 232 29 435 435 30 643 643 33 233 233 34 44 44 32 44 44 32 233 233 34 642 642 35 118 118 37 437 437 38 643 643 36 643 643 36 437 437 38 233 233 39 437 437 41 163 48 42 233 233 40 233 233 40 163 48 42 436 436 43 233 233 45 436 436 46 642 642 44 642 642 44 436 436 46 117 117 47 26 26 48 645 645 49 650 650 51 650 650 51 645 645 49 234 234 50 645 645 52 119 119 53 234 234 55 234 234 55 119 119 53 438 438 54 438 438 57 164 49 58 234 234 56 234 234 56 164 49 58 440 440 59 234 234 61 440 440 62 650 650 60 650 650 60 440 440 62 121 121 63 7 7 64 647 647 65 646 646 67 646 646 67 647 647 65 235 235 66 647 647 68 120 120 69 235 235 71 235 235 71 120 120 69 439 439 70 439 439 73 164 49 74 235 235 72 235 235 72 164 49 74 438 438 75 646 646 76 235 235 77 119 119 79 119 119 79 235 235 77 438 438 78 28 28 80 649 649 81 648 648 83 648 648 83 649 649 81 236 236 82 649 649 84 121 121 85 236 236 87 236 236 87 121 121 85 440 440 86 236 236 88 440 440 89 439 439 91 439 439 91 440 440 89 164 49 90 648 648 92 236 236 93 120 120 95 120 120 95 236 236 93 439 439 94 14 14 96 651 651 97 656 656 99 656 656 99 651 651 97 237 237 98 651 651 100 122 122 101 237 237 103 237 237 103 122 122 101 441 441 102 237 237 104 441 441 105 443 443 107 443 443 107 441 441 105 165 50 106 656 656 108 237 237 109 124 124 111 124 124 111 237 237 109 443 443 110 9 9 112 653 653 113 652 652 115 652 652 115 653 653 113 238 238 114 123 123 117 442 442 118 653 653 116 653 653 116 442 442 118 238 238 119 442 442 121 165 50 122 238 238 120 238 238 120 165 50 122 441 441 123 238 238 125 441 441 126 652 652 124 652 652 124 441 441 126 122 122 127 22 22 128 655 655 129 654 654 131 654 654 131 655 655 129 239 239 130 124 124 133 443 443 134 655 655 132 655 655 132 443 443 134 239 239 135 443 443 137 165 50 138 239 239 136 239 239 136 165 50 138 442 442 139 239 239 141 442 442 142 654 654 140 654 654 140 442 442 142 123 123 143 12 12 144 657 657 145 662 662 147 662 662 147 657 657 145 240 240 146 657 657 148 125 125 149 240 240 151 240 240 151 125 125 149 444 444 150 240 240 152 444 444 153 446 446 155 446 446 155 444 444 153 166 51 154 662 662 156 240 240 157 127 127 159 127 127 159 240 240 157 446 446 158 659 659 161 241 241 162 13 13 160 13 13 160 241 241 162 658 658 163 126 126 165 445 445 166 659 659 164 659 659 164 445 445 166 241 241 167 445 445 169 166 51 170 241 241 168 241 241 168 166 51 170 444 444 171 241 241 173 444 444 174 658 658 172 658 658 172 444 444 174 125 125 175 11 11 176 661 661 177 660 660 179 660 660 179 661 661 177 242 242 178 661 661 180 127 127 181 242 242 183 242 242 183 127 127 181 446 446 182 242 242 184 446 446 185 445 445 187 445 445 187 446 446 185 166 51 186 660 660 188 242 242 189 126 126 191 126 126 191 242 242 189 445 445 190 12 12 192 663 663 193 668 668 195 668 668 195 663 663 193 243 243 194 663 663 196 128 128 197 243 243 199 243 243 199 128 128 197 447 447 198 243 243 200 447 447 201 449 449 203 449 449 203 447 447 201 167 52 202 668 668 204 243 243 205 130 130 207 130 130 207 243 243 205 449 449 206 10 10 208 665 665 209 664 664 211 664 664 211 665 665 209 244 244 210 665 665 212 129 129 213 244 244 215 244 244 215 129 129 213 448 448 214 448 448 217 167 52 218 244 244 216 244 244 216 167 52 218 447 447 219 244 244 221 447 447 222 664 664 220 664 664 220 447 447 222 128 128 223 667 667 225 245 245 226 18 18 224 18 18 224 245 245 226 666 666 227 130 130 229 449 449 230 667 667 228 667 667 228 449 449 230 245 245 231 449 449 233 167 52 234 245 245 232 245 245 232 167 52 234 448 448 235 245 245 237 448 448 238 666 666 236 666 666 236 448 448 238 129 129 239 14 14 240 669 669 241 674 674 243 674 674 243 669 669 241 246 246 242 669 669 244 131 131 245 246 246 247 246 246 247 131 131 245 450 450 246 450 450 249 168 53 250 246 246 248 246 246 248 168 53 250 452 452 251 246 246 253 452 452 254 674 674 252 674 674 252 452 452 254 133 133 255 671 671 257 247 247 258 16 16 256 16 16 256 247 247 258 670 670 259 132 132 261 451 451 262 671 671 260 671 671 260 451 451 262 247 247 263 451 451 265 168 53 266 247 247 264 247 247 264 168 53 266 450 450 267 247 247 269 450 450 270 670 670 268 670 670 268 450 450 270 131 131 271 17 17 272 673 673 273 672 672 275 672 672 275 673 673 273 248 248 274 673 673 276 133 133 277 248 248 279 248 248 279 133 133 277 452 452 278 248 248 280 452 452 281 451 451 283 451 451 283 452 452 281 168 53 282 672 672 284 248 248 285 132 132 287 132 132 287 248 248 285 451 451 286 672 672 289 249 249 290 17 17 288 17 17 288 249 249 290 678 678 291 132 132 293 453 453 294 672 672 292 672 672 292 453 453 294 249 249 295 453 453 297 169 54 298 249 249 296 249 249 296 169 54 298 455 455 299 249 249 301 455 455 302 678 678 300 678 678 300 455 455 302 135 135 303 16 16 304 675 675 305 671 671 307 671 671 307 675 675 305 250 250 306 675 675 308 134 134 309 250 250 311 250 250 311 134 134 309 454 454 310 250 250 312 454 454 313 453 453 315 453 453 315 454 454 313 169 54 314 671 671 316 250 250 317 132 132 319 132 132 319 250 250 317 453 453 318 20 20 320 677 677 321 676 676 323 676 676 323 677 677 321 251 251 322 677 677 324 135 135 325 251 251 327 251 251 327 135 135 325 455 455 326 251 251 328 455 455 329 454 454 331 454 454 331 455 455 329 169 54 330 676 676 332 251 251 333 134 134 335 134 134 335 251 251 333 454 454 334 679 679 337 252 252 338 15 15 336 15 15 336 252 252 338 682 682 339 136 136 341 456 456 342 679 679 340 679 679 340 456 456 342 252 252 343 456 456 345 170 55 346 252 252 344 252 252 344 170 55 346 458 458 347 252 252 349 458 458 350 682 682 348 682 682 348 458 458 350 137 137 351 17 17 352 678 678 353 680 680 355 680 680 355 678 678 353 253 253 354 678 678 356 135 135 357 253 253 359 253 253 359 135 135 357 457 457 358 253 253 360 457 457 361 456 456 363 456 456 363 457 457 361 170 55 362 680 680 364 253 253 365 136 136 367 136 136 367 253 253 365 456 456 366 20 20 368 681 681 369 677 677 371 677 677 371 681 681 369 254 254 370 681 681 372 137 137 373 254 254 375 254 254 375 137 137 373 458 458 374 254 254 376 458 458 377 457 457 379 457 457 379 458 458 377 170 55 378 677 677 380 254 254 381 135 135 383 135 135 383 254 254 381 457 457 382 5 5 384 683 683 385 688 688 387 688 688 387 683 683 385 255 255 386 683 683 388 138 138 389 255 255 391 255 255 391 138 138 389 459 459 390 255 255 392 459 459 393 461 461 395 461 461 395 459 459 393 171 56 394 688 688 396 255 255 397 140 140 399 140 140 399 255 255 397 461 461 398 685 685 401 256 256 402 19 19 400 19 19 400 256 256 402 684 684 403 139 139 405 460 460 406 685 685 404 685 685 404 460 460 406 256 256 407 460 460 409 171 56 410 256 256 408 256 256 408 171 56 410 459 459 411 256 256 413 459 459 414 684 684 412 684 684 412 459 459 414 138 138 415 20 20 416 687 687 417 686 686 419 686 686 419 687 687 417 257 257 418 140 140 421 461 461 422 687 687 420 687 687 420 461 461 422 257 257 423 257 257 424 461 461 425 460 460 427 460 460 427 461 461 425 171 56 426 686 686 428 257 257 429 139 139 431 139 139 431 257 257 429 460 460 430 18 18 432 689 689 433 694 694 435 694 694 435 689 689 433 258 258 434 689 689 436 141 141 437 258 258 439 258 258 439 141 141 437 462 462 438 258 258 440 462 462 441 464 464 443 464 464 443 462 462 441 172 57 442 694 694 444 258 258 445 143 143 447 143 143 447 258 258 445 464 464 446 691 691 449 259 259 450 20 20 448 20 20 448 259 259 450 690 690 451 142 142 453 463 463 454 691 691 452 691 691 452 463 463 454 259 259 455 463 463 457 172 57 458 259 259 456 259 259 456 172 57 458 462 462 459 259 259 461 462 462 462 690 690 460 690 690 460 462 462 462 141 141 463 21 21 464 693 693 465 692 692 467 692 692 467 693 693 465 260 260 466 143 143 469 464 464 470 693 693 468 693 693 468 464 464 470 260 260 471 260 260 472 464 464 473 463 463 475 463 463 475 464 464 473 172 57 474 692 692 476 260 260 477 142 142 479 142 142 479 260 260 477 463 463 478 22 22 480 695 695 481 698 698 483 698 698 483 695 695 481 261 261 482 695 695 484 144 144 485 261 261 487 261 261 487 144 144 485 465 465 486 261 261 488 465 465 489 467 467 491 467 467 491 465 465 489 173 58 490 698 698 492 261 261 493 145 145 495 145 145 495 261 261 493 467 467 494 660 660 497 262 262 498 11 11 496 11 11 496 262 262 498 696 696 499 126 126 501 466 466 502 660 660 500 660 660 500 466 466 502 262 262 503 466 466 505 173 58 506 262 262 504 262 262 504 173 58 506 465 465 507 262 262 509 465 465 510 696 696 508 696 696 508 465 465 510 144 144 511 13 13 512 697 697 513 659 659 515 659 659 515 697 697 513 263 263 514 697 697 516 145 145 517 263 263 519 263 263 519 145 145 517 467 467 518 263 263 520 467 467 521 466 466 523 466 466 523 467 467 521 173 58 522 659 659 524 263 263 525 126 126 527 126 126 527 263 263 525 466 466 526 24 24 528 699 699 529 704 704 531 704 704 531 699 699 529 264 264 530 699 699 532 146 146 533 264 264 535 264 264 535 146 146 533 468 468 534 264 264 536 468 468 537 470 470 539 470 470 539 468 468 537 174 59 538 704 704 540 264 264 541 148 148 543 148 148 543 264 264 541 470 470 542 701 701 545 265 265 546 25 25 544 25 25 544 265 265 546 700 700 547 147 147 549 469 469 550 701 701 548 701 701 548 469 469 550 265 265 551 469 469 553 174 59 554 265 265 552 265 265 552 174 59 554 468 468 555 265 265 557 468 468 558 700 700 556 700 700 556 468 468 558 146 146 559 23 23 560 703 703 561 702 702 563 702 702 563 703 703 561 266 266 562 148 148 565 470 470 566 703 703 564 703 703 564 470 470 566 266 266 567 470 470 569 174 59 570 266 266 568 266 266 568 174 59 570 469 469 571 702 702 572 266 266 573 147 147 575 147 147 575 266 266 573 469 469 574 8 8 576 705 705 577 710 710 579 710 710 579 705 705 577 267 267 578 705 705 580 149 149 581 267 267 583 267 267 583 149 149 581 471 471 582 267 267 584 471 471 585 473 473 587 473 473 587 471 471 585 175 60 586 710 710 588 267 267 589 151 151 591 151 151 591 267 267 589 473 473 590 707 707 593 268 268 594 11 11 592 11 11 592 268 268 594 706 706 595 150 150 597 472 472 598 707 707 596 707 707 596 472 472 598 268 268 599 472 472 601 175 60 602 268 268 600 268 268 600 175 60 602 471 471 603 268 268 605 471 471 606 706 706 604 706 706 604 471 471 606 149 149 607 25 25 608 709 709 609 708 708 611 708 708 611 709 709 609 269 269 610 151 151 613 473 473 614 709 709 612 709 709 612 473 473 614 269 269 615 269 269 616 473 473 617 472 472 619 472 472 619 473 473 617 175 60 618 708 708 620 269 269 621 150 150 623 150 150 623 269 269 621 472 472 622 9 9 624 711 711 625 716 716 627 716 716 627 711 711 625 270 270 626 711 711 628 152 152 629 270 270 631 270 270 631 152 152 629 474 474 630 270 270 632 474 474 633 476 476 635 476 476 635 474 474 633 176 61 634 716 716 636 270 270 637 154 154 639 154 154 639 270 270 637 476 476 638 26 26 640 713 713 641 712 712 643 712 712 643 713 713 641 271 271 642 153 153 645 475 475 646 713 713 644 713 713 644 475 475 646 271 271 647 475 475 649 176 61 650 271 271 648 271 271 648 176 61 650 474 474 651 271 271 653 474 474 654 712 712 652 712 712 652 474 474 654 152 152 655 27 27 656 715 715 657 714 714 659 714 714 659 715 715 657 272 272 658 715 715 660 154 154 661 272 272 663 272 272 663 154 154 661 476 476 662 272 272 664 476 476 665 475 475 667 475 475 667 476 476 665 176 61 666 714 714 668 272 272 669 153 153 671 153 153 671 272 272 669 475 475 670 11 11 672 696 696 673 720 720 675 720 720 675 696 696 673 273 273 674 696 696 676 144 144 677 273 273 679 273 273 679 144 144 677 477 477 678 273 273 680 477 477 681 479 479 683 479 479 683 477 477 681 177 62 682 720 720 684 273 273 685 156 156 687 156 156 687 273 273 685 479 479 686 22 22 688 717 717 689 695 695 691 695 695 691 717 717 689 274 274 690 155 155 693 478 478 694 717 717 692 717 717 692 478 478 694 274 274 695 478 478 697 177 62 698 274 274 696 274 274 696 177 62 698 477 477 699 274 274 701 477 477 702 695 695 700 695 695 700 477 477 702 144 144 703 27 27 704 719 719 705 718 718 707 718 718 707 719 719 705 275 275 706 156 156 709 479 479 710 719 719 708 719 719 708 479 479 710 275 275 711 275 275 712 479 479 713 478 478 715 478 478 715 479 479 713 177 62 714 718 718 716 275 275 717 155 155 719 155 155 719 275 275 717 478 478 718 25 25 720 721 721 721 726 726 723 726 726 723 721 721 721 276 276 722 721 721 724 157 157 725 276 276 727 276 276 727 157 157 725 480 480 726 276 276 728 480 480 729 482 482 731 482 482 731 480 480 729 178 63 730 726 726 732 276 276 733 159 159 735 159 159 735 276 276 733 482 482 734 723 723 737 277 277 738 27 27 736 27 27 736 277 277 738 722 722 739 158 158 741 481 481 742 723 723 740 723 723 740 481 481 742 277 277 743 481 481 745 178 63 746 277 277 744 277 277 744 178 63 746 480 480 747 277 277 749 480 480 750 722 722 748 722 722 748 480 480 750 157 157 751 28 28 752 725 725 753 724 724 755 724 724 755 725 725 753 278 278 754 159 159 757 482 482 758 725 725 756 725 725 756 482 482 758 278 278 759 482 482 761 178 63 762 278 278 760 278 278 760 178 63 762 481 481 763 724 724 764 278 278 765 158 158 767 158 158 767 278 278 765 481 481 766 29 29 768 727 727 769 732 732 771 732 732 771 727 727 769 279 279 770 727 727 772 160 160 773 279 279 775 279 279 775 160 160 773 483 483 774 483 483 777 179 64 778 279 279 776 279 279 776 179 64 778 485 485 779 279 279 781 485 485 782 732 732 780 732 732 780 485 485 782 162 162 783 729 729 785 280 280 786 36 36 784 36 36 784 280 280 786 728 728 787 161 161 789 484 484 790 729 729 788 729 729 788 484 484 790 280 280 791 484 484 793 179 64 794 280 280 792 280 280 792 179 64 794 483 483 795 280 280 797 483 483 798 728 728 796 728 728 796 483 483 798 160 160 799 35 35 800 731 731 801 730 730 803 730 730 803 731 731 801 281 281 802 731 731 804 162 162 805 281 281 807 281 281 807 162 162 805 485 485 806 281 281 808 485 485 809 484 484 811 484 484 811 485 485 809 179 64 810 730 730 812 281 281 813 161 161 815 161 161 815 281 281 813 484 484 814 30 30 816 733 733 817 738 738 819 738 738 819 733 733 817 282 282 818 733 733 820 48 163 821 282 282 823 282 282 823 48 163 821 486 486 822 282 282 824 486 486 825 488 488 827 488 488 827 486 486 825 180 65 826 282 282 829 488 488 830 738 738 828 738 738 828 488 488 830 50 165 831 735 735 833 283 283 834 32 32 832 32 32 832 283 283 834 734 734 835 49 164 837 487 487 838 735 735 836 735 735 836 487 487 838 283 283 839 487 487 841 180 65 842 283 283 840 283 283 840 180 65 842 486 486 843 283 283 845 486 486 846 734 734 844 734 734 844 486 486 846 48 163 847 33 33 848 737 737 849 736 736 851 736 736 851 737 737 849 284 284 850 737 737 852 50 165 853 284 284 855 284 284 855 50 165 853 488 488 854 284 284 856 488 488 857 487 487 859 487 487 859 488 488 857 180 65 858 736 736 860 284 284 861 49 164 863 49 164 863 284 284 861 487 487 862 23 23 864 739 739 865 744 744 867 744 744 867 739 739 865 285 285 866 739 739 868 51 166 869 285 285 871 285 285 871 51 166 869 489 489 870 285 285 872 489 489 873 491 491 875 491 491 875 489 489 873 181 66 874 744 744 876 285 285 877 53 168 879 53 168 879 285 285 877 491 491 878 4 4 880 741 741 881 740 740 883 740 740 883 741 741 881 286 286 882 741 741 884 52 167 885 286 286 887 286 286 887 52 167 885 490 490 886 490 490 889 181 66 890 286 286 888 286 286 888 181 66 890 489 489 891 286 286 893 489 489 894 740 740 892 740 740 892 489 489 894 51 166 895 743 743 897 287 287 898 6 6 896 6 6 896 287 287 898 742 742 899 53 168 901 491 491 902 743 743 900 743 743 900 491 491 902 287 287 903 491 491 905 181 66 906 287 287 904 287 287 904 181 66 906 490 490 907 287 287 909 490 490 910 742 742 908 742 742 908 490 490 910 52 167 911 34 34 912 745 745 913 750 750 915 750 750 915 745 745 913 288 288 914 745 745 916 54 169 917 288 288 919 288 288 919 54 169 917 492 492 918 288 288 920 492 492 921 494 494 923 494 494 923 492 492 921 182 67 922 750 750 924 288 288 925 56 171 927 56 171 927 288 288 925 494 494 926 747 747 929 289 289 930 35 35 928 35 35 928 289 289 930 746 746 931 55 170 933 493 493 934 747 747 932 747 747 932 493 493 934 289 289 935 493 493 937 182 67 938 289 289 936 289 289 936 182 67 938 492 492 939 289 289 941 492 492 942 746 746 940 746 746 940 492 492 942 54 169 943 28 28 944 749 749 945 748 748 947 748 748 947 749 749 945 290 290 946 749 749 948 56 171 949 290 290 951 290 290 951 56 171 949 494 494 950 290 290 952 494 494 953 493 493 955 493 493 955 494 494 953 182 67 954 748 748 956 290 290 957 55 170 959 55 170 959 290 290 957 493 493 958 23 23 960 751 751 961 754 754 963 754 754 963 751 751 961 291 291 962 751 751 964 57 172 965 291 291 967 291 291 967 57 172 965 495 495 966 291 291 968 495 495 969 497 497 971 497 497 971 495 495 969 183 68 970 754 754 972 291 291 973 58 173 975 58 173 975 291 291 973 497 497 974 748 748 977 292 292 978 28 28 976 28 28 976 292 292 978 752 752 979 55 170 981 496 496 982 748 748 980 748 748 980 496 496 982 292 292 983 496 496 985 183 68 986 292 292 984 292 292 984 183 68 986 495 495 987 292 292 989 495 495 990 752 752 988 752 752 988 495 495 990 57 172 991 35 35 992 753 753 993 747 747 995 747 747 995 753 753 993 293 293 994 753 753 996 58 173 997 293 293 999 293 293 999 58 173 997 497 497 998 293 293 1000 497 497 1001 496 496 1003 496 496 1003 497 497 1001 183 68 1002 747 747 1004 293 293 1005 55 170 1007 55 170 1007 293 293 1005 496 496 1006 33 33 1008 755 755 1009 758 758 1011 758 758 1011 755 755 1009 294 294 1010 755 755 1012 59 174 1013 294 294 1015 294 294 1015 59 174 1013 498 498 1014 294 294 1016 498 498 1017 500 500 1019 500 500 1019 498 498 1017 184 69 1018 758 758 1020 294 294 1021 60 175 1023 60 175 1023 294 294 1021 500 500 1022 730 730 1025 295 295 1026 35 35 1024 35 35 1024 295 295 1026 756 756 1027 161 161 1029 499 499 1030 730 730 1028 730 730 1028 499 499 1030 295 295 1031 499 499 1033 184 69 1034 295 295 1032 295 295 1032 184 69 1034 498 498 1035 295 295 1037 498 498 1038 756 756 1036 756 756 1036 498 498 1038 59 174 1039 36 36 1040 757 757 1041 729 729 1043 729 729 1043 757 757 1041 296 296 1042 757 757 1044 60 175 1045 296 296 1047 296 296 1047 60 175 1045 500 500 1046 296 296 1048 500 500 1049 499 499 1051 499 499 1051 500 500 1049 184 69 1050 729 729 1052 296 296 1053 161 161 1055 161 161 1055 296 296 1053 499 499 1054 38 38 1056 759 759 1057 764 764 1059 764 764 1059 759 759 1057 297 297 1058 759 759 1060 61 176 1061 297 297 1063 297 297 1063 61 176 1061 501 501 1062 297 297 1064 501 501 1065 503 503 1067 503 503 1067 501 501 1065 185 70 1066 297 297 1069 503 503 1070 764 764 1068 764 764 1068 503 503 1070 63 178 1071 761 761 1073 298 298 1074 39 39 1072 39 39 1072 298 298 1074 760 760 1075 62 177 1077 502 502 1078 761 761 1076 761 761 1076 502 502 1078 298 298 1079 502 502 1081 185 70 1082 298 298 1080 298 298 1080 185 70 1082 501 501 1083 298 298 1085 501 501 1086 760 760 1084 760 760 1084 501 501 1086 61 176 1087 43 43 1088 763 763 1089 762 762 1091 762 762 1091 763 763 1089 299 299 1090 763 763 1092 63 178 1093 299 299 1095 299 299 1095 63 178 1093 503 503 1094 299 299 1096 503 503 1097 502 502 1099 502 502 1099 503 503 1097 185 70 1098 762 762 1100 299 299 1101 62 177 1103 62 177 1103 299 299 1101 502 502 1102 38 38 1104 765 765 1105 770 770 1107 770 770 1107 765 765 1105 300 300 1106 765 765 1108 64 179 1109 300 300 1111 300 300 1111 64 179 1109 504 504 1110 300 300 1112 504 504 1113 506 506 1115 506 506 1115 504 504 1113 186 71 1114 770 770 1116 300 300 1117 66 181 1119 66 181 1119 300 300 1117 506 506 1118 767 767 1121 301 301 1122 30 30 1120 30 30 1120 301 301 1122 766 766 1123 65 180 1125 505 505 1126 767 767 1124 767 767 1124 505 505 1126 301 301 1127 505 505 1129 186 71 1130 301 301 1128 301 301 1128 186 71 1130 504 504 1131 301 301 1133 504 504 1134 766 766 1132 766 766 1132 504 504 1134 64 179 1135 31 31 1136 769 769 1137 768 768 1139 768 768 1139 769 769 1137 302 302 1138 769 769 1140 66 181 1141 302 302 1143 302 302 1143 66 181 1141 506 506 1142 302 302 1144 506 506 1145 505 505 1147 505 505 1147 506 506 1145 186 71 1146 768 768 1148 302 302 1149 65 180 1151 65 180 1151 302 302 1149 505 505 1150 771 771 1153 303 303 1154 40 40 1152 40 40 1152 303 303 1154 776 776 1155 67 182 1157 507 507 1158 771 771 1156 771 771 1156 507 507 1158 303 303 1159 507 507 1161 187 72 1162 303 303 1160 303 303 1160 187 72 1162 509 509 1163 303 303 1165 509 509 1166 776 776 1164 776 776 1164 509 509 1166 69 184 1167 773 773 1169 304 304 1170 41 41 1168 41 41 1168 304 304 1170 772 772 1171 68 183 1173 508 508 1174 773 773 1172 773 773 1172 508 508 1174 304 304 1175 508 508 1177 187 72 1178 304 304 1176 304 304 1176 187 72 1178 507 507 1179 304 304 1181 507 507 1182 772 772 1180 772 772 1180 507 507 1182 67 182 1183 36 36 1184 775 775 1185 774 774 1187 774 774 1187 775 775 1185 305 305 1186 775 775 1188 69 184 1189 305 305 1191 305 305 1191 69 184 1189 509 509 1190 305 305 1192 509 509 1193 508 508 1195 508 508 1195 509 509 1193 187 72 1194 774 774 1196 305 305 1197 68 183 1199 68 183 1199 305 305 1197 508 508 1198 45 45 1200 777 777 1201 782 782 1203 782 782 1203 777 777 1201 306 306 1202 777 777 1204 70 185 1205 306 306 1207 306 306 1207 70 185 1205 510 510 1206 306 306 1208 510 510 1209 512 512 1211 512 512 1211 510 510 1209 188 73 1210 782 782 1212 306 306 1213 72 187 1215 72 187 1215 306 306 1213 512 512 1214 779 779 1217 307 307 1218 39 39 1216 39 39 1216 307 307 1218 778 778 1219 71 186 1221 511 511 1222 779 779 1220 779 779 1220 511 511 1222 307 307 1223 511 511 1225 188 73 1226 307 307 1224 307 307 1224 188 73 1226 510 510 1227 307 307 1229 510 510 1230 778 778 1228 778 778 1228 510 510 1230 70 185 1231 31 31 1232 781 781 1233 780 780 1235 780 780 1235 781 781 1233 308 308 1234 72 187 1237 512 512 1238 781 781 1236 781 781 1236 512 512 1238 308 308 1239 308 308 1240 512 512 1241 511 511 1243 511 511 1243 512 512 1241 188 73 1242 780 780 1244 308 308 1245 71 186 1247 71 186 1247 308 308 1245 511 511 1246 42 42 1248 783 783 1249 788 788 1251 788 788 1251 783 783 1249 309 309 1250 783 783 1252 73 188 1253 309 309 1255 309 309 1255 73 188 1253 513 513 1254 309 309 1256 513 513 1257 515 515 1259 515 515 1259 513 513 1257 189 74 1258 788 788 1260 309 309 1261 75 190 1263 75 190 1263 309 309 1261 515 515 1262 47 47 1264 785 785 1265 784 784 1267 784 784 1267 785 785 1265 310 310 1266 785 785 1268 74 189 1269 310 310 1271 310 310 1271 74 189 1269 514 514 1270 514 514 1273 189 74 1274 310 310 1272 310 310 1272 189 74 1274 513 513 1275 310 310 1277 513 513 1278 784 784 1276 784 784 1276 513 513 1278 73 188 1279 46 46 1280 787 787 1281 786 786 1283 786 786 1283 787 787 1281 311 311 1282 75 190 1285 515 515 1286 787 787 1284 787 787 1284 515 515 1286 311 311 1287 515 515 1289 189 74 1290 311 311 1288 311 311 1288 189 74 1290 514 514 1291 311 311 1293 514 514 1294 786 786 1292 786 786 1292 514 514 1294 74 189 1295 45 45 1296 789 789 1297 794 794 1299 794 794 1299 789 789 1297 312 312 1298 789 789 1300 76 191 1301 312 312 1303 312 312 1303 76 191 1301 516 516 1302 312 312 1304 516 516 1305 518 518 1307 518 518 1307 516 516 1305 190 75 1306 794 794 1308 312 312 1309 78 193 1311 78 193 1311 312 312 1309 518 518 1310 791 791 1313 313 313 1314 41 41 1312 41 41 1312 313 313 1314 790 790 1315 77 192 1317 517 517 1318 791 791 1316 791 791 1316 517 517 1318 313 313 1319 517 517 1321 190 75 1322 313 313 1320 313 313 1320 190 75 1322 516 516 1323 313 313 1325 516 516 1326 790 790 1324 790 790 1324 516 516 1326 76 191 1327 793 793 1329 314 314 1330 44 44 1328 44 44 1328 314 314 1330 792 792 1331 78 193 1333 518 518 1334 793 793 1332 793 793 1332 518 518 1334 314 314 1335 314 314 1336 518 518 1337 517 517 1339 517 517 1339 518 518 1337 190 75 1338 792 792 1340 314 314 1341 77 192 1343 77 192 1343 314 314 1341 517 517 1342 39 39 1344 778 778 1345 798 798 1347 798 798 1347 778 778 1345 315 315 1346 778 778 1348 70 185 1349 315 315 1351 315 315 1351 70 185 1349 519 519 1350 315 315 1352 519 519 1353 521 521 1355 521 521 1355 519 519 1353 191 76 1354 798 798 1356 315 315 1357 80 195 1359 80 195 1359 315 315 1357 521 521 1358 795 795 1361 316 316 1362 45 45 1360 45 45 1360 316 316 1362 777 777 1363 79 194 1365 520 520 1366 795 795 1364 795 795 1364 520 520 1366 316 316 1367 520 520 1369 191 76 1370 316 316 1368 316 316 1368 191 76 1370 519 519 1371 316 316 1373 519 519 1374 777 777 1372 777 777 1372 519 519 1374 70 185 1375 46 46 1376 797 797 1377 796 796 1379 796 796 1379 797 797 1377 317 317 1378 80 195 1381 521 521 1382 797 797 1380 797 797 1380 521 521 1382 317 317 1383 317 317 1384 521 521 1385 520 520 1387 520 520 1387 521 521 1385 191 76 1386 796 796 1388 317 317 1389 79 194 1391 79 194 1391 317 317 1389 520 520 1390 799 799 1393 318 318 1394 37 37 1392 37 37 1392 318 318 1394 804 804 1395 81 196 1397 522 522 1398 799 799 1396 799 799 1396 522 522 1398 318 318 1399 522 522 1401 192 77 1402 318 318 1400 318 318 1400 192 77 1402 524 524 1403 318 318 1405 524 524 1406 804 804 1404 804 804 1404 524 524 1406 83 198 1407 43 43 1408 801 801 1409 800 800 1411 800 800 1411 801 801 1409 319 319 1410 801 801 1412 82 197 1413 319 319 1415 319 319 1415 82 197 1413 523 523 1414 523 523 1417 192 77 1418 319 319 1416 319 319 1416 192 77 1418 522 522 1419 800 800 1420 319 319 1421 81 196 1423 81 196 1423 319 319 1421 522 522 1422 46 46 1424 803 803 1425 802 802 1427 802 802 1427 803 803 1425 320 320 1426 803 803 1428 83 198 1429 320 320 1431 320 320 1431 83 198 1429 524 524 1430 320 320 1432 524 524 1433 523 523 1435 523 523 1435 524 524 1433 192 77 1434 802 802 1436 320 320 1437 82 197 1439 82 197 1439 320 320 1437 523 523 1438 44 44 1440 792 792 1441 643 643 1443 643 643 1443 792 792 1441 321 321 1442 792 792 1444 77 192 1445 321 321 1447 321 321 1447 77 192 1445 525 525 1446 321 321 1448 525 525 1449 527 527 1451 527 527 1451 525 525 1449 193 78 1450 643 643 1452 321 321 1453 118 118 1455 118 118 1455 321 321 1453 527 527 1454 41 41 1456 772 772 1457 791 791 1459 791 791 1459 772 772 1457 322 322 1458 772 772 1460 67 182 1461 322 322 1463 322 322 1463 67 182 1461 526 526 1462 526 526 1465 193 78 1466 322 322 1464 322 322 1464 193 78 1466 525 525 1467 791 791 1468 322 322 1469 77 192 1471 77 192 1471 322 322 1469 525 525 1470 40 40 1472 644 644 1473 771 771 1475 771 771 1475 644 644 1473 323 323 1474 118 118 1477 527 527 1478 644 644 1476 644 644 1476 527 527 1478 323 323 1479 527 527 1481 193 78 1482 323 323 1480 323 323 1480 193 78 1482 526 526 1483 323 323 1485 526 526 1486 771 771 1484 771 771 1484 526 526 1486 67 182 1487 28 28 1488 724 724 1489 649 649 1491 649 649 1491 724 724 1489 324 324 1490 158 158 1493 528 528 1494 724 724 1492 724 724 1492 528 528 1494 324 324 1495 528 528 1497 194 79 1498 324 324 1496 324 324 1496 194 79 1498 530 530 1499 324 324 1501 530 530 1502 649 649 1500 649 649 1500 530 530 1502 121 121 1503 27 27 1504 714 714 1505 723 723 1507 723 723 1507 714 714 1505 325 325 1506 153 153 1509 529 529 1510 714 714 1508 714 714 1508 529 529 1510 325 325 1511 529 529 1513 194 79 1514 325 325 1512 325 325 1512 194 79 1514 528 528 1515 723 723 1516 325 325 1517 158 158 1519 158 158 1519 325 325 1517 528 528 1518 26 26 1520 650 650 1521 713 713 1523 713 713 1523 650 650 1521 326 326 1522 650 650 1524 121 121 1525 326 326 1527 326 326 1527 121 121 1525 530 530 1526 326 326 1528 530 530 1529 529 529 1531 529 529 1531 530 530 1529 194 79 1530 713 713 1532 326 326 1533 153 153 1535 153 153 1535 326 326 1533 529 529 1534 22 22 1536 805 805 1537 655 655 1539 655 655 1539 805 805 1537 327 327 1538 805 805 1540 84 199 1541 327 327 1543 327 327 1543 84 199 1541 531 531 1542 327 327 1544 531 531 1545 533 533 1547 533 533 1547 531 531 1545 195 80 1546 655 655 1548 327 327 1549 124 124 1551 124 124 1551 327 327 1549 533 533 1550 16 16 1552 670 670 1553 806 806 1555 806 806 1555 670 670 1553 328 328 1554 670 670 1556 131 131 1557 328 328 1559 328 328 1559 131 131 1557 532 532 1558 532 532 1561 195 80 1562 328 328 1560 328 328 1560 195 80 1562 531 531 1563 806 806 1564 328 328 1565 84 199 1567 84 199 1567 328 328 1565 531 531 1566 656 656 1569 329 329 1570 14 14 1568 14 14 1568 329 329 1570 669 669 1571 124 124 1573 533 533 1574 656 656 1572 656 656 1572 533 533 1574 329 329 1575 533 533 1577 195 80 1578 329 329 1576 329 329 1576 195 80 1578 532 532 1579 329 329 1581 532 532 1582 669 669 1580 669 669 1580 532 532 1582 131 131 1583 11 11 1584 706 706 1585 661 661 1587 661 661 1587 706 706 1585 330 330 1586 706 706 1588 149 149 1589 330 330 1591 330 330 1591 149 149 1589 534 534 1590 330 330 1592 534 534 1593 536 536 1595 536 536 1595 534 534 1593 196 81 1594 661 661 1596 330 330 1597 127 127 1599 127 127 1599 330 330 1597 536 536 1598 807 807 1601 331 331 1602 8 8 1600 8 8 1600 331 331 1602 705 705 1603 85 200 1605 535 535 1606 807 807 1604 807 807 1604 535 535 1606 331 331 1607 535 535 1609 196 81 1610 331 331 1608 331 331 1608 196 81 1610 534 534 1611 331 331 1613 534 534 1614 705 705 1612 705 705 1612 534 534 1614 149 149 1615 12 12 1616 662 662 1617 808 808 1619 808 808 1619 662 662 1617 332 332 1618 662 662 1620 127 127 1621 332 332 1623 332 332 1623 127 127 1621 536 536 1622 332 332 1624 536 536 1625 535 535 1627 535 535 1627 536 536 1625 196 81 1626 808 808 1628 332 332 1629 85 200 1631 85 200 1631 332 332 1629 535 535 1630 18 18 1632 809 809 1633 667 667 1635 667 667 1635 809 809 1633 333 333 1634 809 809 1636 86 201 1637 333 333 1639 333 333 1639 86 201 1637 537 537 1638 333 333 1640 537 537 1641 539 539 1643 539 539 1643 537 537 1641 197 82 1642 667 667 1644 333 333 1645 130 130 1647 130 130 1647 333 333 1645 539 539 1646 13 13 1648 658 658 1649 810 810 1651 810 810 1651 658 658 1649 334 334 1650 658 658 1652 125 125 1653 334 334 1655 334 334 1655 125 125 1653 538 538 1654 538 538 1657 197 82 1658 334 334 1656 334 334 1656 197 82 1658 537 537 1659 810 810 1660 334 334 1661 86 201 1663 86 201 1663 334 334 1661 537 537 1662 12 12 1664 668 668 1665 657 657 1667 657 657 1667 668 668 1665 335 335 1666 130 130 1669 539 539 1670 668 668 1668 668 668 1668 539 539 1670 335 335 1671 335 335 1672 539 539 1673 538 538 1675 538 538 1675 539 539 1673 197 82 1674 657 657 1676 335 335 1677 125 125 1679 125 125 1679 335 335 1677 538 538 1678 680 680 1681 336 336 1682 17 17 1680 17 17 1680 336 336 1682 673 673 1683 136 136 1685 540 540 1686 680 680 1684 680 680 1684 540 540 1686 336 336 1687 540 540 1689 198 83 1690 336 336 1688 336 336 1688 198 83 1690 542 542 1691 336 336 1693 542 542 1694 673 673 1692 673 673 1692 542 542 1694 133 133 1695 15 15 1696 811 811 1697 679 679 1699 679 679 1699 811 811 1697 337 337 1698 87 202 1701 541 541 1702 811 811 1700 811 811 1700 541 541 1702 337 337 1703 541 541 1705 198 83 1706 337 337 1704 337 337 1704 198 83 1706 540 540 1707 679 679 1708 337 337 1709 136 136 1711 136 136 1711 337 337 1709 540 540 1710 14 14 1712 674 674 1713 812 812 1715 812 812 1715 674 674 1713 338 338 1714 674 674 1716 133 133 1717 338 338 1719 338 338 1719 133 133 1717 542 542 1718 338 338 1720 542 542 1721 541 541 1723 541 541 1723 542 542 1721 198 83 1722 812 812 1724 338 338 1725 87 202 1727 87 202 1727 338 338 1725 541 541 1726 16 16 1728 813 813 1729 675 675 1731 675 675 1731 813 813 1729 339 339 1730 813 813 1732 88 203 1733 339 339 1735 339 339 1735 88 203 1733 543 543 1734 339 339 1736 543 543 1737 545 545 1739 545 545 1739 543 543 1737 199 84 1738 675 675 1740 339 339 1741 134 134 1743 134 134 1743 339 339 1741 545 545 1742 692 692 1745 340 340 1746 21 21 1744 21 21 1744 340 340 1746 814 814 1747 142 142 1749 544 544 1750 692 692 1748 692 692 1748 544 544 1750 340 340 1751 544 544 1753 199 84 1754 340 340 1752 340 340 1752 199 84 1754 543 543 1755 340 340 1757 543 543 1758 814 814 1756 814 814 1756 543 543 1758 88 203 1759 20 20 1760 676 676 1761 691 691 1763 691 691 1763 676 676 1761 341 341 1762 134 134 1765 545 545 1766 676 676 1764 676 676 1764 545 545 1766 341 341 1767 341 341 1768 545 545 1769 544 544 1771 544 544 1771 545 545 1769 199 84 1770 691 691 1772 341 341 1773 142 142 1775 142 142 1775 341 341 1773 544 544 1774 20 20 1776 686 686 1777 681 681 1779 681 681 1779 686 686 1777 342 342 1778 139 139 1781 546 546 1782 686 686 1780 686 686 1780 546 546 1782 342 342 1783 546 546 1785 200 85 1786 342 342 1784 342 342 1784 200 85 1786 548 548 1787 342 342 1789 548 548 1790 681 681 1788 681 681 1788 548 548 1790 137 137 1791 19 19 1792 815 815 1793 685 685 1795 685 685 1795 815 815 1793 343 343 1794 89 204 1797 547 547 1798 815 815 1796 815 815 1796 547 547 1798 343 343 1799 547 547 1801 200 85 1802 343 343 1800 343 343 1800 200 85 1802 546 546 1803 685 685 1804 343 343 1805 139 139 1807 139 139 1807 343 343 1805 546 546 1806 15 15 1808 682 682 1809 816 816 1811 816 816 1811 682 682 1809 344 344 1810 682 682 1812 137 137 1813 344 344 1815 344 344 1815 137 137 1813 548 548 1814 344 344 1816 548 548 1817 547 547 1819 547 547 1819 548 548 1817 200 85 1818 816 816 1820 344 344 1821 89 204 1823 89 204 1823 344 344 1821 547 547 1822 20 20 1824 690 690 1825 818 818 1827 818 818 1827 690 690 1825 345 345 1826 690 690 1828 141 141 1829 345 345 1831 345 345 1831 141 141 1829 549 549 1830 345 345 1832 549 549 1833 551 551 1835 551 551 1835 549 549 1833 201 86 1834 818 818 1836 345 345 1837 90 205 1839 90 205 1839 345 345 1837 551 551 1838 666 666 1841 346 346 1842 18 18 1840 18 18 1840 346 346 1842 689 689 1843 129 129 1845 550 550 1846 666 666 1844 666 666 1844 550 550 1846 346 346 1847 550 550 1849 201 86 1850 346 346 1848 346 346 1848 201 86 1850 549 549 1851 346 346 1853 549 549 1854 689 689 1852 689 689 1852 549 549 1854 141 141 1855 817 817 1857 347 347 1858 10 10 1856 10 10 1856 347 347 1858 665 665 1859 90 205 1861 551 551 1862 817 817 1860 817 817 1860 551 551 1862 347 347 1863 551 551 1865 201 86 1866 347 347 1864 347 347 1864 201 86 1866 550 550 1867 347 347 1869 550 550 1870 665 665 1868 665 665 1868 550 550 1870 129 129 1871 20 20 1872 818 818 1873 687 687 1875 687 687 1875 818 818 1873 348 348 1874 818 818 1876 90 205 1877 348 348 1879 348 348 1879 90 205 1877 552 552 1878 348 348 1880 552 552 1881 554 554 1883 554 554 1883 552 552 1881 202 87 1882 687 687 1884 348 348 1885 140 140 1887 140 140 1887 348 348 1885 554 554 1886 10 10 1888 819 819 1889 817 817 1891 817 817 1891 819 819 1889 349 349 1890 819 819 1892 91 206 1893 349 349 1895 349 349 1895 91 206 1893 553 553 1894 349 349 1896 553 553 1897 552 552 1899 552 552 1899 553 553 1897 202 87 1898 817 817 1900 349 349 1901 90 205 1903 90 205 1903 349 349 1901 552 552 1902 688 688 1905 350 350 1906 5 5 1904 5 5 1904 350 350 1906 820 820 1907 140 140 1909 554 554 1910 688 688 1908 688 688 1908 554 554 1910 350 350 1911 554 554 1913 202 87 1914 350 350 1912 350 350 1912 202 87 1914 553 553 1915 350 350 1917 553 553 1918 820 820 1916 820 820 1916 553 553 1918 91 206 1919 21 21 1920 821 821 1921 693 693 1923 693 693 1923 821 821 1921 351 351 1922 821 821 1924 92 207 1925 351 351 1927 351 351 1927 92 207 1925 555 555 1926 351 351 1928 555 555 1929 557 557 1931 557 557 1931 555 555 1929 203 88 1930 693 693 1932 351 351 1933 143 143 1935 143 143 1935 351 351 1933 557 557 1934 810 810 1937 352 352 1938 13 13 1936 13 13 1936 352 352 1938 822 822 1939 86 201 1941 556 556 1942 810 810 1940 810 810 1940 556 556 1942 352 352 1943 556 556 1945 203 88 1946 352 352 1944 352 352 1944 203 88 1946 555 555 1947 352 352 1949 555 555 1950 822 822 1948 822 822 1948 555 555 1950 92 207 1951 694 694 1953 353 353 1954 18 18 1952 18 18 1952 353 353 1954 809 809 1955 143 143 1957 557 557 1958 694 694 1956 694 694 1956 557 557 1958 353 353 1959 353 353 1960 557 557 1961 556 556 1963 556 556 1963 557 557 1961 203 88 1962 809 809 1964 353 353 1965 86 201 1967 86 201 1967 353 353 1965 556 556 1966 21 21 1968 814 814 1969 824 824 1971 824 824 1971 814 814 1969 354 354 1970 814 814 1972 88 203 1973 354 354 1975 354 354 1975 88 203 1973 558 558 1974 354 354 1976 558 558 1977 560 560 1979 560 560 1979 558 558 1977 204 89 1978 824 824 1980 354 354 1981 93 208 1983 93 208 1983 354 354 1981 560 560 1982 16 16 1984 806 806 1985 813 813 1987 813 813 1987 806 806 1985 355 355 1986 84 199 1989 559 559 1990 806 806 1988 806 806 1988 559 559 1990 355 355 1991 559 559 1993 204 89 1994 355 355 1992 355 355 1992 204 89 1994 558 558 1995 355 355 1997 558 558 1998 813 813 1996 813 813 1996 558 558 1998 88 203 1999 22 22 2000 823 823 2001 805 805 2003 805 805 2003 823 823 2001 356 356 2002 93 208 2005 560 560 2006 823 823 2004 823 823 2004 560 560 2006 356 356 2007 356 356 2008 560 560 2009 559 559 2011 559 559 2011 560 560 2009 204 89 2010 805 805 2012 356 356 2013 84 199 2015 84 199 2015 356 356 2013 559 559 2014 22 22 2016 698 698 2017 823 823 2019 823 823 2019 698 698 2017 357 357 2018 698 698 2020 145 145 2021 357 357 2023 357 357 2023 145 145 2021 561 561 2022 357 357 2024 561 561 2025 563 563 2027 563 563 2027 561 561 2025 205 90 2026 823 823 2028 357 357 2029 93 208 2031 93 208 2031 357 357 2029 563 563 2030 13 13 2032 822 822 2033 697 697 2035 697 697 2035 822 822 2033 358 358 2034 822 822 2036 92 207 2037 358 358 2039 358 358 2039 92 207 2037 562 562 2038 358 358 2040 562 562 2041 561 561 2043 561 561 2043 562 562 2041 205 90 2042 358 358 2045 561 561 2046 697 697 2044 697 697 2044 561 561 2046 145 145 2047 824 824 2049 359 359 2050 21 21 2048 21 21 2048 359 359 2050 821 821 2051 93 208 2053 563 563 2054 824 824 2052 824 824 2052 563 563 2054 359 359 2055 563 563 2057 205 90 2058 359 359 2056 359 359 2056 205 90 2058 562 562 2059 359 359 2061 562 562 2062 821 821 2060 821 821 2060 562 562 2062 92 207 2063 23 23 2064 744 744 2065 703 703 2067 703 703 2067 744 744 2065 360 360 2066 744 744 2068 53 168 2069 360 360 2071 360 360 2071 53 168 2069 564 564 2070 360 360 2072 564 564 2073 566 566 2075 566 566 2075 564 564 2073 206 91 2074 703 703 2076 360 360 2077 148 148 2079 148 148 2079 360 360 2077 566 566 2078 825 825 2081 361 361 2082 6 6 2080 6 6 2080 361 361 2082 743 743 2083 94 209 2085 565 565 2086 825 825 2084 825 825 2084 565 565 2086 361 361 2087 565 565 2089 206 91 2090 361 361 2088 361 361 2088 206 91 2090 564 564 2091 361 361 2093 564 564 2094 743 743 2092 743 743 2092 564 564 2094 53 168 2095 24 24 2096 704 704 2097 826 826 2099 826 826 2099 704 704 2097 362 362 2098 148 148 2101 566 566 2102 704 704 2100 704 704 2100 566 566 2102 362 362 2103 566 566 2105 206 91 2106 362 362 2104 362 362 2104 206 91 2106 565 565 2107 826 826 2108 362 362 2109 94 209 2111 94 209 2111 362 362 2109 565 565 2110 25 25 2112 700 700 2113 709 709 2115 709 709 2115 700 700 2113 363 363 2114 700 700 2116 146 146 2117 363 363 2119 363 363 2119 146 146 2117 567 567 2118 363 363 2120 567 567 2121 569 569 2123 569 569 2123 567 567 2121 207 92 2122 709 709 2124 363 363 2125 151 151 2127 151 151 2127 363 363 2125 569 569 2126 827 827 2129 364 364 2130 24 24 2128 24 24 2128 364 364 2130 699 699 2131 95 210 2133 568 568 2134 827 827 2132 827 827 2132 568 568 2134 364 364 2135 568 568 2137 207 92 2138 364 364 2136 364 364 2136 207 92 2138 567 567 2139 364 364 2141 567 567 2142 699 699 2140 699 699 2140 567 567 2142 146 146 2143 8 8 2144 710 710 2145 828 828 2147 828 828 2147 710 710 2145 365 365 2146 151 151 2149 569 569 2150 710 710 2148 710 710 2148 569 569 2150 365 365 2151 365 365 2152 569 569 2153 568 568 2155 568 568 2155 569 569 2153 207 92 2154 828 828 2156 365 365 2157 95 210 2159 95 210 2159 365 365 2157 568 568 2158 27 27 2160 718 718 2161 715 715 2163 715 715 2163 718 718 2161 366 366 2162 718 718 2164 155 155 2165 366 366 2167 366 366 2167 155 155 2165 570 570 2166 366 366 2168 570 570 2169 572 572 2171 572 572 2171 570 570 2169 208 93 2170 715 715 2172 366 366 2173 154 154 2175 154 154 2175 366 366 2173 572 572 2174 22 22 2176 654 654 2177 717 717 2179 717 717 2179 654 654 2177 367 367 2178 654 654 2180 123 123 2181 367 367 2183 367 367 2183 123 123 2181 571 571 2182 571 571 2185 208 93 2186 367 367 2184 367 367 2184 208 93 2186 570 570 2187 717 717 2188 367 367 2189 155 155 2191 155 155 2191 367 367 2189 570 570 2190 9 9 2192 716 716 2193 653 653 2195 653 653 2195 716 716 2193 368 368 2194 154 154 2197 572 572 2198 716 716 2196 716 716 2196 572 572 2198 368 368 2199 572 572 2201 208 93 2202 368 368 2200 368 368 2200 208 93 2202 571 571 2203 653 653 2204 368 368 2205 123 123 2207 123 123 2207 368 368 2205 571 571 2206 27 27 2208 722 722 2209 719 719 2211 719 719 2211 722 722 2209 369 369 2210 722 722 2212 157 157 2213 369 369 2215 369 369 2215 157 157 2213 573 573 2214 369 369 2216 573 573 2217 575 575 2219 575 575 2219 573 573 2217 209 94 2218 719 719 2220 369 369 2221 156 156 2223 156 156 2223 369 369 2221 575 575 2222 708 708 2225 370 370 2226 25 25 2224 25 25 2224 370 370 2226 721 721 2227 150 150 2229 574 574 2230 708 708 2228 708 708 2228 574 574 2230 370 370 2231 574 574 2233 209 94 2234 370 370 2232 370 370 2232 209 94 2234 573 573 2235 370 370 2237 573 573 2238 721 721 2236 721 721 2236 573 573 2238 157 157 2239 11 11 2240 720 720 2241 707 707 2243 707 707 2243 720 720 2241 371 371 2242 156 156 2245 575 575 2246 720 720 2244 720 720 2244 575 575 2246 371 371 2247 371 371 2248 575 575 2249 574 574 2251 574 574 2251 575 575 2249 209 94 2250 707 707 2252 371 371 2253 150 150 2255 150 150 2255 371 371 2253 574 574 2254 28 28 2256 752 752 2257 725 725 2259 725 725 2259 752 752 2257 372 372 2258 752 752 2260 57 172 2261 372 372 2263 372 372 2263 57 172 2261 576 576 2262 372 372 2264 576 576 2265 578 578 2267 578 578 2267 576 576 2265 210 95 2266 725 725 2268 372 372 2269 159 159 2271 159 159 2271 372 372 2269 578 578 2270 702 702 2273 373 373 2274 23 23 2272 23 23 2272 373 373 2274 751 751 2275 147 147 2277 577 577 2278 702 702 2276 702 702 2276 577 577 2278 373 373 2279 577 577 2281 210 95 2282 373 373 2280 373 373 2280 210 95 2282 576 576 2283 373 373 2285 576 576 2286 751 751 2284 751 751 2284 576 576 2286 57 172 2287 25 25 2288 726 726 2289 701 701 2291 701 701 2291 726 726 2289 374 374 2290 159 159 2293 578 578 2294 726 726 2292 726 726 2292 578 578 2294 374 374 2295 578 578 2297 210 95 2298 374 374 2296 374 374 2296 210 95 2298 577 577 2299 701 701 2300 374 374 2301 147 147 2303 147 147 2303 374 374 2301 577 577 2302 35 35 2304 746 746 2305 731 731 2307 731 731 2307 746 746 2305 375 375 2306 746 746 2308 54 169 2309 375 375 2311 375 375 2311 54 169 2309 579 579 2310 375 375 2312 579 579 2313 581 581 2315 581 581 2315 579 579 2313 211 96 2314 375 375 2317 581 581 2318 731 731 2316 731 731 2316 581 581 2318 162 162 2319 34 34 2320 829 829 2321 745 745 2323 745 745 2323 829 829 2321 376 376 2322 96 211 2325 580 580 2326 829 829 2324 829 829 2324 580 580 2326 376 376 2327 580 580 2329 211 96 2330 376 376 2328 376 376 2328 211 96 2330 579 579 2331 376 376 2333 579 579 2334 745 745 2332 745 745 2332 579 579 2334 54 169 2335 29 29 2336 732 732 2337 830 830 2339 830 830 2339 732 732 2337 377 377 2338 732 732 2340 162 162 2341 377 377 2343 377 377 2343 162 162 2341 581 581 2342 377 377 2344 581 581 2345 580 580 2347 580 580 2347 581 581 2345 211 96 2346 830 830 2348 377 377 2349 96 211 2351 96 211 2351 377 377 2349 580 580 2350 33 33 2352 831 831 2353 737 737 2355 737 737 2355 831 831 2353 378 378 2354 831 831 2356 97 212 2357 378 378 2359 378 378 2359 97 212 2357 582 582 2358 582 582 2361 212 97 2362 378 378 2360 378 378 2360 212 97 2362 584 584 2363 378 378 2365 584 584 2366 737 737 2364 737 737 2364 584 584 2366 50 165 2367 31 31 2368 768 768 2369 832 832 2371 832 832 2371 768 768 2369 379 379 2370 65 180 2373 583 583 2374 768 768 2372 768 768 2372 583 583 2374 379 379 2375 583 583 2377 212 97 2378 379 379 2376 379 379 2376 212 97 2378 582 582 2379 832 832 2380 379 379 2381 97 212 2383 97 212 2383 379 379 2381 582 582 2382 30 30 2384 738 738 2385 767 767 2387 767 767 2387 738 738 2385 380 380 2386 738 738 2388 50 165 2389 380 380 2391 380 380 2391 50 165 2389 584 584 2390 380 380 2392 584 584 2393 583 583 2395 583 583 2395 584 584 2393 212 97 2394 767 767 2396 380 380 2397 65 180 2399 65 180 2399 380 380 2397 583 583 2398 833 833 2401 381 381 2402 1 1 2400 1 1 2400 381 381 2402 836 836 2403 833 833 2404 98 213 2405 381 381 2407 381 381 2407 98 213 2405 585 585 2406 585 585 2409 213 98 2410 381 381 2408 381 381 2408 213 98 2410 587 587 2411 381 381 2413 587 587 2414 836 836 2412 836 836 2412 587 587 2414 99 214 2415 740 740 2417 382 382 2418 4 4 2416 4 4 2416 382 382 2418 834 834 2419 51 166 2421 586 586 2422 740 740 2420 740 740 2420 586 586 2422 382 382 2423 586 586 2425 213 98 2426 382 382 2424 382 382 2424 213 98 2426 585 585 2427 382 382 2429 585 585 2430 834 834 2428 834 834 2428 585 585 2430 98 213 2431 23 23 2432 835 835 2433 739 739 2435 739 739 2435 835 835 2433 383 383 2434 835 835 2436 99 214 2437 383 383 2439 383 383 2439 99 214 2437 587 587 2438 383 383 2440 587 587 2441 586 586 2443 586 586 2443 587 587 2441 213 98 2442 739 739 2444 383 383 2445 51 166 2447 51 166 2447 383 383 2445 586 586 2446 23 23 2448 837 837 2449 840 840 2451 840 840 2451 837 837 2449 384 384 2450 837 837 2452 100 215 2453 384 384 2455 384 384 2455 100 215 2453 588 588 2454 384 384 2456 588 588 2457 590 590 2459 590 590 2459 588 588 2457 214 99 2458 840 840 2460 384 384 2461 101 216 2463 101 216 2463 384 384 2461 590 590 2462 33 33 2464 736 736 2465 838 838 2467 838 838 2467 736 736 2465 385 385 2466 49 164 2469 589 589 2470 736 736 2468 736 736 2468 589 589 2470 385 385 2471 589 589 2473 214 99 2474 385 385 2472 385 385 2472 214 99 2474 588 588 2475 385 385 2477 588 588 2478 838 838 2476 838 838 2476 588 588 2478 100 215 2479 32 32 2480 839 839 2481 735 735 2483 735 735 2483 839 839 2481 386 386 2482 839 839 2484 101 216 2485 386 386 2487 386 386 2487 101 216 2485 590 590 2486 386 386 2488 590 590 2489 589 589 2491 589 589 2491 590 590 2489 214 99 2490 735 735 2492 386 386 2493 49 164 2495 49 164 2495 386 386 2493 589 589 2494 23 23 2496 840 840 2497 844 844 2499 844 844 2499 840 840 2497 387 387 2498 840 840 2500 101 216 2501 387 387 2503 387 387 2503 101 216 2501 591 591 2502 387 387 2504 591 591 2505 593 593 2507 593 593 2507 591 591 2505 215 100 2506 844 844 2508 387 387 2509 103 218 2511 103 218 2511 387 387 2509 593 593 2510 32 32 2512 841 841 2513 839 839 2515 839 839 2515 841 841 2513 388 388 2514 841 841 2516 102 217 2517 388 388 2519 388 388 2519 102 217 2517 592 592 2518 388 388 2520 592 592 2521 591 591 2523 591 591 2523 592 592 2521 215 100 2522 388 388 2525 591 591 2526 839 839 2524 839 839 2524 591 591 2526 101 216 2527 843 843 2529 389 389 2530 3 3 2528 3 3 2528 389 389 2530 842 842 2531 103 218 2533 593 593 2534 843 843 2532 843 843 2532 593 593 2534 389 389 2535 593 593 2537 215 100 2538 389 389 2536 389 389 2536 215 100 2538 592 592 2539 389 389 2541 592 592 2542 842 842 2540 842 842 2540 592 592 2542 102 217 2543 836 836 2545 390 390 2546 1 1 2544 1 1 2544 390 390 2546 846 846 2547 99 214 2549 594 594 2550 836 836 2548 836 836 2548 594 594 2550 390 390 2551 594 594 2553 216 101 2554 390 390 2552 390 390 2552 216 101 2554 596 596 2555 390 390 2557 596 596 2558 846 846 2556 846 846 2556 596 596 2558 104 219 2559 23 23 2560 844 844 2561 835 835 2563 835 835 2563 844 844 2561 391 391 2562 844 844 2564 103 218 2565 391 391 2567 391 391 2567 103 218 2565 595 595 2566 391 391 2568 595 595 2569 594 594 2571 594 594 2571 595 595 2569 216 101 2570 835 835 2572 391 391 2573 99 214 2575 99 214 2575 391 391 2573 594 594 2574 3 3 2576 845 845 2577 843 843 2579 843 843 2579 845 845 2577 392 392 2578 845 845 2580 104 219 2581 392 392 2583 392 392 2583 104 219 2581 596 596 2582 596 596 2585 216 101 2586 392 392 2584 392 392 2584 216 101 2586 595 595 2587 843 843 2588 392 392 2589 103 218 2591 103 218 2591 392 392 2589 595 595 2590 28 28 2592 648 648 2593 850 850 2595 850 850 2595 648 648 2593 393 393 2594 648 648 2596 120 120 2597 393 393 2599 393 393 2599 120 120 2597 597 597 2598 393 393 2600 597 597 2601 599 599 2603 599 599 2603 597 597 2601 217 102 2602 850 850 2604 393 393 2605 106 221 2607 106 221 2607 393 393 2605 599 599 2606 847 847 2609 394 394 2610 7 7 2608 7 7 2608 394 394 2610 647 647 2611 105 220 2613 598 598 2614 847 847 2612 847 847 2612 598 598 2614 394 394 2615 598 598 2617 217 102 2618 394 394 2616 394 394 2616 217 102 2618 597 597 2619 394 394 2621 597 597 2622 647 647 2620 647 647 2620 597 597 2622 120 120 2623 0 0 2624 849 849 2625 848 848 2627 848 848 2627 849 849 2625 395 395 2626 106 221 2629 599 599 2630 849 849 2628 849 849 2628 599 599 2630 395 395 2631 599 599 2633 217 102 2634 395 395 2632 395 395 2632 217 102 2634 598 598 2635 848 848 2636 395 395 2637 105 220 2639 105 220 2639 395 395 2637 598 598 2638 851 851 2641 396 396 2642 0 0 2640 0 0 2640 396 396 2642 849 849 2643 107 222 2645 600 600 2646 851 851 2644 851 851 2644 600 600 2646 396 396 2647 600 600 2649 218 103 2650 396 396 2648 396 396 2648 218 103 2650 602 602 2651 396 396 2653 602 602 2654 849 849 2652 849 849 2652 602 602 2654 106 221 2655 34 34 2656 750 750 2657 852 852 2659 852 852 2659 750 750 2657 397 397 2658 750 750 2660 56 171 2661 397 397 2663 397 397 2663 56 171 2661 601 601 2662 397 397 2664 601 601 2665 600 600 2667 600 600 2667 601 601 2665 218 103 2666 852 852 2668 397 397 2669 107 222 2671 107 222 2671 397 397 2669 600 600 2670 28 28 2672 850 850 2673 749 749 2675 749 749 2675 850 850 2673 398 398 2674 850 850 2676 106 221 2677 398 398 2679 398 398 2679 106 221 2677 602 602 2678 398 398 2680 602 602 2681 601 601 2683 601 601 2683 602 602 2681 218 103 2682 749 749 2684 398 398 2685 56 171 2687 56 171 2687 398 398 2685 601 601 2686 35 35 2688 756 756 2689 753 753 2691 753 753 2691 756 756 2689 399 399 2690 756 756 2692 59 174 2693 399 399 2695 399 399 2695 59 174 2693 603 603 2694 399 399 2696 603 603 2697 605 605 2699 605 605 2699 603 603 2697 219 104 2698 753 753 2700 399 399 2701 58 173 2703 58 173 2703 399 399 2701 605 605 2702 33 33 2704 838 838 2705 755 755 2707 755 755 2707 838 838 2705 400 400 2706 100 215 2709 604 604 2710 838 838 2708 838 838 2708 604 604 2710 400 400 2711 604 604 2713 219 104 2714 400 400 2712 400 400 2712 219 104 2714 603 603 2715 400 400 2717 603 603 2718 755 755 2716 755 755 2716 603 603 2718 59 174 2719 23 23 2720 754 754 2721 837 837 2723 837 837 2723 754 754 2721 401 401 2722 754 754 2724 58 173 2725 401 401 2727 401 401 2727 58 173 2725 605 605 2726 401 401 2728 605 605 2729 604 604 2731 604 604 2731 605 605 2729 219 104 2730 837 837 2732 401 401 2733 100 215 2735 100 215 2735 401 401 2733 604 604 2734 36 36 2736 853 853 2737 757 757 2739 757 757 2739 853 853 2737 402 402 2738 853 853 2740 108 223 2741 402 402 2743 402 402 2743 108 223 2741 606 606 2742 402 402 2744 606 606 2745 608 608 2747 608 608 2747 606 606 2745 220 105 2746 757 757 2748 402 402 2749 60 175 2751 60 175 2751 402 402 2749 608 608 2750 832 832 2753 403 403 2754 31 31 2752 31 31 2752 403 403 2754 854 854 2755 97 212 2757 607 607 2758 832 832 2756 832 832 2756 607 607 2758 403 403 2759 607 607 2761 220 105 2762 403 403 2760 403 403 2760 220 105 2762 606 606 2763 403 403 2765 606 606 2766 854 854 2764 854 854 2764 606 606 2766 108 223 2767 33 33 2768 758 758 2769 831 831 2771 831 831 2771 758 758 2769 404 404 2770 60 175 2773 608 608 2774 758 758 2772 758 758 2772 608 608 2774 404 404 2775 404 404 2776 608 608 2777 607 607 2779 607 607 2779 608 608 2777 220 105 2778 831 831 2780 404 404 2781 97 212 2783 97 212 2783 404 404 2781 607 607 2782 800 800 2785 405 405 2786 43 43 2784 43 43 2784 405 405 2786 763 763 2787 81 196 2789 609 609 2790 800 800 2788 800 800 2788 609 609 2790 405 405 2791 609 609 2793 221 106 2794 405 405 2792 405 405 2792 221 106 2794 611 611 2795 405 405 2797 611 611 2798 763 763 2796 763 763 2796 611 611 2798 63 178 2799 37 37 2800 855 855 2801 799 799 2803 799 799 2803 855 855 2801 406 406 2802 109 224 2805 610 610 2806 855 855 2804 855 855 2804 610 610 2806 406 406 2807 610 610 2809 221 106 2810 406 406 2808 406 406 2808 221 106 2810 609 609 2811 799 799 2812 406 406 2813 81 196 2815 81 196 2815 406 406 2813 609 609 2814 38 38 2816 764 764 2817 856 856 2819 856 856 2819 764 764 2817 407 407 2818 764 764 2820 63 178 2821 407 407 2823 407 407 2823 63 178 2821 611 611 2822 407 407 2824 611 611 2825 610 610 2827 610 610 2827 611 611 2825 221 106 2826 856 856 2828 407 407 2829 109 224 2831 109 224 2831 407 407 2829 610 610 2830 31 31 2832 780 780 2833 769 769 2835 769 769 2835 780 780 2833 408 408 2834 780 780 2836 71 186 2837 408 408 2839 408 408 2839 71 186 2837 612 612 2838 408 408 2840 612 612 2841 614 614 2843 614 614 2843 612 612 2841 222 107 2842 769 769 2844 408 408 2845 66 181 2847 66 181 2847 408 408 2845 614 614 2846 39 39 2848 760 760 2849 779 779 2851 779 779 2851 760 760 2849 409 409 2850 760 760 2852 61 176 2853 409 409 2855 409 409 2855 61 176 2853 613 613 2854 613 613 2857 222 107 2858 409 409 2856 409 409 2856 222 107 2858 612 612 2859 779 779 2860 409 409 2861 71 186 2863 71 186 2863 409 409 2861 612 612 2862 38 38 2864 770 770 2865 759 759 2867 759 759 2867 770 770 2865 410 410 2866 770 770 2868 66 181 2869 410 410 2871 410 410 2871 66 181 2869 614 614 2870 614 614 2873 222 107 2874 410 410 2872 410 410 2872 222 107 2874 613 613 2875 759 759 2876 410 410 2877 61 176 2879 61 176 2879 410 410 2877 613 613 2878 36 36 2880 728 728 2881 775 775 2883 775 775 2883 728 728 2881 411 411 2882 728 728 2884 160 160 2885 411 411 2887 411 411 2887 160 160 2885 615 615 2886 615 615 2889 223 108 2890 411 411 2888 411 411 2888 223 108 2890 617 617 2891 411 411 2893 617 617 2894 775 775 2892 775 775 2892 617 617 2894 69 184 2895 29 29 2896 857 857 2897 727 727 2899 727 727 2899 857 857 2897 412 412 2898 110 225 2901 616 616 2902 857 857 2900 857 857 2900 616 616 2902 412 412 2903 616 616 2905 223 108 2906 412 412 2904 412 412 2904 223 108 2906 615 615 2907 412 412 2909 615 615 2910 727 727 2908 727 727 2908 615 615 2910 160 160 2911 40 40 2912 776 776 2913 858 858 2915 858 858 2915 776 776 2913 413 413 2914 776 776 2916 69 184 2917 413 413 2919 413 413 2919 69 184 2917 617 617 2918 413 413 2920 617 617 2921 616 616 2923 616 616 2923 617 617 2921 223 108 2922 858 858 2924 413 413 2925 110 225 2927 110 225 2927 413 413 2925 616 616 2926 31 31 2928 854 854 2929 860 860 2931 860 860 2931 854 854 2929 414 414 2930 854 854 2932 108 223 2933 414 414 2935 414 414 2935 108 223 2933 618 618 2934 414 414 2936 618 618 2937 620 620 2939 620 620 2939 618 618 2937 224 109 2938 860 860 2940 414 414 2941 111 226 2943 111 226 2943 414 414 2941 620 620 2942 774 774 2945 415 415 2946 36 36 2944 36 36 2944 415 415 2946 853 853 2947 68 183 2949 619 619 2950 774 774 2948 774 774 2948 619 619 2950 415 415 2951 619 619 2953 224 109 2954 415 415 2952 415 415 2952 224 109 2954 618 618 2955 415 415 2957 618 618 2958 853 853 2956 853 853 2956 618 618 2958 108 223 2959 41 41 2960 859 859 2961 773 773 2963 773 773 2963 859 859 2961 416 416 2962 859 859 2964 111 226 2965 416 416 2967 416 416 2967 111 226 2965 620 620 2966 416 416 2968 620 620 2969 619 619 2971 619 619 2971 620 620 2969 224 109 2970 773 773 2972 416 416 2973 68 183 2975 68 183 2975 416 416 2973 619 619 2974 31 31 2976 860 860 2977 781 781 2979 781 781 2979 860 860 2977 417 417 2978 860 860 2980 111 226 2981 417 417 2983 417 417 2983 111 226 2981 621 621 2982 417 417 2984 621 621 2985 623 623 2987 623 623 2987 621 621 2985 225 110 2986 781 781 2988 417 417 2989 72 187 2991 72 187 2991 417 417 2989 623 623 2990 41 41 2992 790 790 2993 859 859 2995 859 859 2995 790 790 2993 418 418 2994 790 790 2996 76 191 2997 418 418 2999 418 418 2999 76 191 2997 622 622 2998 418 418 3000 622 622 3001 621 621 3003 621 621 3003 622 622 3001 225 110 3002 418 418 3005 621 621 3006 859 859 3004 859 859 3004 621 621 3006 111 226 3007 782 782 3009 419 419 3010 45 45 3008 45 45 3008 419 419 3010 789 789 3011 72 187 3013 623 623 3014 782 782 3012 782 782 3012 623 623 3014 419 419 3015 623 623 3017 225 110 3018 419 419 3016 419 419 3016 225 110 3018 622 622 3019 419 419 3021 622 622 3022 789 789 3020 789 789 3020 622 622 3022 76 191 3023 46 46 3024 861 861 3025 787 787 3027 787 787 3027 861 861 3025 420 420 3026 861 861 3028 112 227 3029 420 420 3031 420 420 3031 112 227 3029 624 624 3030 420 420 3032 624 624 3033 626 626 3035 626 626 3035 624 624 3033 226 111 3034 787 787 3036 420 420 3037 75 190 3039 75 190 3039 420 420 3037 626 626 3038 642 642 3041 421 421 3042 44 44 3040 44 44 3040 421 421 3042 862 862 3043 642 642 3044 117 117 3045 421 421 3047 421 421 3047 117 117 3045 625 625 3046 625 625 3049 226 111 3050 421 421 3048 421 421 3048 226 111 3050 624 624 3051 421 421 3053 624 624 3054 862 862 3052 862 862 3052 624 624 3054 112 227 3055 788 788 3057 422 422 3058 42 42 3056 42 42 3056 422 422 3058 641 641 3059 75 190 3061 626 626 3062 788 788 3060 788 788 3060 626 626 3062 422 422 3063 626 626 3065 226 111 3066 422 422 3064 422 422 3064 226 111 3066 625 625 3067 422 422 3069 625 625 3070 641 641 3068 641 641 3068 625 625 3070 117 117 3071 44 44 3072 862 862 3073 793 793 3075 793 793 3075 862 862 3073 423 423 3074 862 862 3076 112 227 3077 423 423 3079 423 423 3079 112 227 3077 627 627 3078 423 423 3080 627 627 3081 629 629 3083 629 629 3083 627 627 3081 227 112 3082 793 793 3084 423 423 3085 78 193 3087 78 193 3087 423 423 3085 629 629 3086 46 46 3088 796 796 3089 861 861 3091 861 861 3091 796 796 3089 424 424 3090 79 194 3093 628 628 3094 796 796 3092 796 796 3092 628 628 3094 424 424 3095 628 628 3097 227 112 3098 424 424 3096 424 424 3096 227 112 3098 627 627 3099 424 424 3101 627 627 3102 861 861 3100 861 861 3100 627 627 3102 112 227 3103 45 45 3104 794 794 3105 795 795 3107 795 795 3107 794 794 3105 425 425 3106 78 193 3109 629 629 3110 794 794 3108 794 794 3108 629 629 3110 425 425 3111 629 629 3113 227 112 3114 425 425 3112 425 425 3112 227 112 3114 628 628 3115 795 795 3116 425 425 3117 79 194 3119 79 194 3119 425 425 3117 628 628 3118 46 46 3120 802 802 3121 797 797 3123 797 797 3123 802 802 3121 426 426 3122 802 802 3124 82 197 3125 426 426 3127 426 426 3127 82 197 3125 630 630 3126 426 426 3128 630 630 3129 632 632 3131 632 632 3131 630 630 3129 228 113 3130 797 797 3132 426 426 3133 80 195 3135 80 195 3135 426 426 3133 632 632 3134 762 762 3137 427 427 3138 43 43 3136 43 43 3136 427 427 3138 801 801 3139 62 177 3141 631 631 3142 762 762 3140 762 762 3140 631 631 3142 427 427 3143 631 631 3145 228 113 3146 427 427 3144 427 427 3144 228 113 3146 630 630 3147 427 427 3149 630 630 3150 801 801 3148 801 801 3148 630 630 3150 82 197 3151 39 39 3152 798 798 3153 761 761 3155 761 761 3155 798 798 3153 428 428 3154 80 195 3157 632 632 3158 798 798 3156 798 798 3156 632 632 3158 428 428 3159 632 632 3161 228 113 3162 428 428 3160 428 428 3160 228 113 3162 631 631 3163 761 761 3164 428 428 3165 62 177 3167 62 177 3167 428 428 3165 631 631 3166 46 46 3168 786 786 3169 866 866 3171 866 866 3171 786 786 3169 429 429 3170 786 786 3172 74 189 3173 429 429 3175 429 429 3175 74 189 3173 633 633 3174 429 429 3176 633 633 3177 635 635 3179 635 635 3179 633 633 3177 229 114 3178 429 429 3181 635 635 3182 866 866 3180 866 866 3180 635 635 3182 114 229 3183 863 863 3185 430 430 3186 47 47 3184 47 47 3184 430 430 3186 785 785 3187 113 228 3189 634 634 3190 863 863 3188 863 863 3188 634 634 3190 430 430 3191 634 634 3193 229 114 3194 430 430 3192 430 430 3192 229 114 3194 633 633 3195 430 430 3197 633 633 3198 785 785 3196 785 785 3196 633 633 3198 74 189 3199 2 2 3200 865 865 3201 864 864 3203 864 864 3203 865 865 3201 431 431 3202 865 865 3204 114 229 3205 431 431 3207 431 431 3207 114 229 3205 635 635 3206 431 431 3208 635 635 3209 634 634 3211 634 634 3211 635 635 3209 229 114 3210 864 864 3212 431 431 3213 113 228 3215 113 228 3215 431 431 3213 634 634 3214 867 867 3217 432 432 3218 2 2 3216 2 2 3216 432 432 3218 865 865 3219 115 230 3221 636 636 3222 867 867 3220 867 867 3220 636 636 3222 432 432 3223 636 636 3225 230 115 3226 432 432 3224 432 432 3224 230 115 3226 638 638 3227 432 432 3229 638 638 3230 865 865 3228 865 865 3228 638 638 3230 114 229 3231 37 37 3232 804 804 3233 868 868 3235 868 868 3235 804 804 3233 433 433 3234 804 804 3236 83 198 3237 433 433 3239 433 433 3239 83 198 3237 637 637 3238 433 433 3240 637 637 3241 636 636 3243 636 636 3243 637 637 3241 230 115 3242 868 868 3244 433 433 3245 115 230 3247 115 230 3247 433 433 3245 636 636 3246 46 46 3248 866 866 3249 803 803 3251 803 803 3251 866 866 3249 434 434 3250 866 866 3252 114 229 3253 434 434 3255 434 434 3255 114 229 3253 638 638 3254 434 434 3256 638 638 3257 637 637 3259 637 637 3259 638 638 3257 230 115 3258 803 803 3260 434 434 3261 83 198 3263 83 198 3263 434 434 3261 637 637 3262</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape3</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_3" name="qt_gauge_background_3" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape3">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_3</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_4.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_4.dae
new file mode 100644
index 0000000..653e1fd
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_4.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:36:58</created>
+ <modified>2018-03-08T09:36:58</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape4" name="qt_gauge_background_Shape4">
+ <mesh>
+ <source id="qt_gauge_background_Shape4-positions" name="qt_gauge_background_Shape4-positions">
+ <float_array id="qt_gauge_background_Shape4-positions-array" count="3555">1.997482 0 25.83058 -0.02085876 0 -25.83598 68.87738 0 9.15527e-4 68.83389 0 1.613319 68.86505 0 -1.10685 3.749619 0 -25.83062 -68.86362 0 0.4070358 -1.772827 0 -25.83595 -5.918076 0 -25.83042 -5.672852 0 25.83013 -34.4702 0 -25.39013 -34.47021 0 25.34209 -50.34911 0 -24.29148 -50.34916 0 24.21398 -68.62154 0 -6.985313 -50.57893 0 -7.902534 -59.48221 0 -22.61779 -60.78872 0 -4.111168 -67.16206 0 -15.27709 -60.02304 0 -14.57795 -64.89032 0 -19.73687 -64.44406 0 -16.4141 -63.27116 0 -21.12707 -59.68611 0 -20.37394 -51.6948 0 -17.28997 -59.63435 0 22.43438 -68.37228 0 9.41497 -59.74486 0 8.635521 -64.25751 0 20.20161 -64.16876 0 10.2128 -66.6376 0 16.88755 -64.31595 0 17.03174 -60.09606 0 17.25117 -51.2727 0 9.201523 -36.0101 0 -3.86425 -17.91846 0 -25.76321 -17.91846 0 25.7494 -19.75633 0 -4.788475 -3.557053 0 -6.227684 34.42818 0 25.34209 34.42816 0 -25.39014 17.20357 0 25.74953 17.44885 0 -25.76325 19.15634 0 -4.78849 35.96805 0 -3.864265 50.30713 0 24.21397 50.30704 0 -24.29148 50.53693 0 -6.228722 68.5795 0 -6.985313 59.44017 0 -22.61781 61.01768 0 -5.234261 52.21071 0 -16.34762 60.64299 0 -14.84788 67.12001 0 -15.27709 64.84827 0 -19.73687 64.40202 0 -16.4141 63.22911 0 -21.12707 59.64404 0 -20.37394 59.5923 0 22.43438 59.70714 0 8.643616 50.53691 0 10.09058 68.33023 0 9.459747 64.21545 0 20.20161 64.34276 0 9.689713 63.98268 0 16.54074 59.70714 0 17.6093 66.59557 0 16.88755 50.34059 0 1.669685 43.05228 0 -6.546867 43.05228 0 3.866539 50.46869 0 -21.04998 42.90585 0 -24.93696 45.36098 0 -19.39318 68.01648 0 -11.26844 66.10841 0 -15.37353 65.87949 0 -12.64263 50.4949 0 -12.50109 55.89906 0 -5.518166 56.04262 0 -11.23574 57.17464 0 -15.41224 59.69759 0 -17.76777 55.94415 0 -18.97619 65.95244 0 -18.06728 64.81549 0 -18.27964 62.96645 0 -15.43204 62.22781 0 -18.52428 61.81207 0 -21.80405 59.45123 0 -21.96938 61.97011 0 -20.53567 59.60899 0 13.62889 55.81517 0 8.572571 55.81517 0 14.60642 55.81517 0 1.55706 65.79008 0 -3.270073 68.81482 0 -3.449486 64.58289 0 -6.877113 62.32349 0 16.91064 62.33797 0 19.28306 62.32347 0 13.5377 67.5723 0 13.61598 65.7238 0 8.638153 65.81325 0 13.62746 -43.09433 0 -6.698524 -50.42993 0 -0.6454697 -43.14163 0 3.768402 -34.62006 0 7.576706 -55.79916 0 23.39409 -55.85471 0 19.71375 -50.49956 0 -13.99165 -68.05853 0 -11.26842 -65.92155 0 -12.64265 -64.11736 0 -20.59008 -63.64196 0 -19.14748 -55.78391 0 -23.48399 -55.82441 0 -21.77438 -68.85252 0 -3.298103 -65.76562 0 -1.775139 -65.11816 0 2.641052 -65.75206 0 8.669113 -68.7478 0 4.80114 -67.61436 0 13.6115 -43.02884 0 -14.79195 -25.9252 0 -25.64462 -11.01277 0 -25.81429 25.81586 0 25.6153 -2.106812 0 25.83599 0.3387756 0 14.13598 8.793121 0 25.81006 -0.8238983 0 -25.83598 -1.49324 0 -18.84391 7.387589 0 -16.13282 9.620804 0 -25.81443 1.542282 0 -18.79162 0.9840698 0 -25.83544 34.57797 0 -13.17857 42.9059 0 24.87109 50.31442 0 18.21767 42.94464 0 15.28481 42.9868 0 -14.65612 60.33829 0 -11.13259 63.96729 0 -11.27152 55.74185 0 -23.48397 55.78235 0 -21.77441 64.0753 0 -20.59008 63.59991 0 -19.14751 55.75711 0 23.39408 59.59595 0 20.67844 55.78902 0 19.73676 59.70273 0 1.656906 68.87613 0 -0.1671677 65.82167 0 -2.241478 62.35854 0 8.569214 62.97769 0 3.84803 65.09213 0 2.624443 68.70697 0 5.040886 65.77187 0 -0.7785492 68.87302 0 0.2194824 62.31534 0 21.35925 64.20662 0 13.60773 65.54971 0 18.90694 65.26404 0 16.84959 64.19099 0 18.55489 -10.98825 0 25.80966 -5.501892 0 14.1358 -10.85342 0 9.793549 -50.40378 0 18.15907 -42.94795 0 24.87109 -43.03398 0 15.22618 -57.07304 0 8.524971 -59.68055 0 12.5011 -55.94924 0 14.50505 -60.29797 0 -9.732582 -55.93559 0 -5.549431 -55.8859 0 -11.28962 -64.60841 0 -6.755928 -63.96388 0 -11.23351 -62.96307 0 -15.41775 -59.67312 0 -17.7535 -62.26985 0 -18.5243 -65.99449 0 -18.06727 -66.15046 0 -15.37353 -64.85756 0 -18.27964 -61.85412 0 -21.80405 -62.01215 0 -20.53568 -59.49329 0 -21.96938 -55.95033 0 -15.51107 -55.92773 0 -19.04263 -62.35739 0 21.35925 -59.66164 0 20.65544 -62.41423 0 19.26007 -61.79581 0 8.61525 -59.73482 0 3.866341 -62.97955 0 3.995667 -65.59176 0 18.90695 -64.26253 0 18.58564 -65.32504 0 16.90011 -64.26431 0 14.76956 -65.84153 0 13.68225 -62.99442 0 16.93816 -62.40057 0 13.69498 -55.99364 0 1.729485 -42.94791 0 -24.93694 -50.47337 0 -21.11642 -45.36568 0 -19.48333 -25.9252 0 25.61529 -18.07724 0 9.765038 -26.07884 0 9.644608 -34.62003 0 -13.17858 -28.45912 0 -4.419762 -26.07883 0 -15.82716 -18.07724 0 -15.94659 -12.67296 0 -4.590004 -10.85727 0 -16.13274 34.57796 0 7.576706 28.37965 0 -4.419762 25.97833 0 9.6446 16.8163 0 9.765053 9.526245 0 -4.590019 7.150574 0 9.793671 -2.728287 0 -18.84386 -3.136154 0 -25.8353 -5.770462 0 -18.7915 25.84039 0 -25.64463 16.83853 0 -15.94659 25.97833 0 -15.82717 65.11494 0 18.33 -8.889236 0 15.90331 -45.69035 0 19.60075 -57.52411 0 12.08788 -57.4156 0 -9.219551 -63.03981 0 -9.459297 -61.6937 0 -17.47086 -65.61216 0 -17.36831 -61.26672 0 -21.4759 -57.30595 0 -17.57824 -61.60316 0 20.32652 -61.61061 0 4.970833 -65.16259 0 18.33912 -65.21386 0 15.11147 -63.21139 0 15.12115 -57.53726 0 4.529396 -46.14822 0 -21.91486 -23.16438 0 14.96494 -29.26018 0 -11.89646 -13.44016 0 -12.52451 29.20706 0 4.20166 10.64145 0 4.658104 -3.665375 0 -20.38345 22.87688 0 -19.22359 45.67395 0 -0.6733551 46.11726 0 -21.89518 66.7708 0 -13.02279 54.30138 0 -9.741005 57.51334 0 -17.56278 65.5701 0 -17.36831 61.6651 0 -17.47511 61.22467 0 -21.4759 57.23755 0 12.32549 54.24329 0 4.08799 66.21387 0 -4.448036 63.04524 0 18.40594 61.55368 0 14.8769 66.46692 0 12.14555 -13.44016 0 4.658066 -45.73003 0 -1.145607 -40.23549 0 9.1577 -57.27502 0 21.36882 -54.29859 0 17.38894 -54.31291 0 -13.30999 -66.81284 0 -13.0228 -64.42203 0 -13.02988 -64.24265 0 -19.25846 -62.74249 0 -19.39548 -57.23793 0 -22.51771 -54.29845 0 -20.59284 -63.21231 0 18.40824 -66.24297 0 -4.139565 -64.57504 0 4.731361 -66.29301 0 1.501724 -66.50488 0 12.15495 -61.49227 0 11.93659 -54.3195 0 -1.322426 -40.22148 0 -12.11832 -46.15599 0 -16.06249 -29.26016 0 4.20166 -23.16437 0 -19.22358 -8.935654 0 -19.86605 22.87141 0 14.96497 -2.638138 0 16.76019 4.905975 0 15.90356 -1.816299 0 -20.38456 10.68788 0 -12.52453 5.551239 0 -19.86619 -0.2366791 0 -20.38355 29.20708 0 -11.89648 45.63432 0 19.61813 40.17946 0 9.175072 40.17946 0 -12.08511 46.12506 0 -15.75658 63.01591 0 -9.738335 64.39348 0 -13.03413 57.64983 0 -12.74567 57.19588 0 -22.51769 54.26749 0 -20.57314 64.20061 0 -19.25848 62.70042 0 -19.39548 57.22597 0 21.37564 54.23553 0 17.41313 57.26245 0 -0.9007645 66.4678 0 -2.026482 61.69118 0 4.519554 66.25801 0 1.765472 64.54176 0 4.707573 66.46193 0 -1.462761 61.55412 0 20.33334 63.0484 0 12.12418 65.17029 0 14.88116 64.83362 0 19.10062 65.67442 0 17.88297 64.71556 0 17.73361 -11.99751 0 19.0759 -7.624969 0 20.36131 -7.231247 0 8.290993 -47.69582 0 15.62408 -47.49992 0 21.85094 -41.64713 0 21.23975 -55.54736 0 11.22753 -58.56941 0 10.52913 -58.30762 0 14.25106 -58.45905 0 -11.45031 -58.59158 0 -7.445778 -55.08392 0 -8.48185 -65.07869 0 -8.714317 -62.1667 0 -7.830864 -61.86552 0 -11.45031 -62.91624 0 -17.01437 -61.1504 0 -16.49657 -60.88651 0 -18.67298 -65.31033 0 -18.47294 -66.23389 0 -16.61346 -65.28269 0 -16.86352 -60.62967 0 -21.99781 -62.21558 0 -21.22265 -60.72182 0 -21.15641 -58.23328 0 -18.80648 -58.29347 0 -16.49657 -55.28327 0 -17.31322 -62.74792 0 20.27477 -60.90106 0 21.19793 -60.99899 0 19.43388 -62.72871 0 6.735245 -60.75478 0 6.431557 -61.27512 0 1.93354 -65.71648 0 17.88297 -64.87566 0 19.10062 -64.80804 0 17.81562 -65.79475 0 15.68676 -64.80804 0 16.03228 -64.94567 0 13.46352 -63.54755 0 13.4636 -63.73634 0 16.03235 -62.2334 0 15.77319 -58.42601 0 1.301079 -58.56941 0 6.431557 -55.54736 0 5.924629 -42.32173 0 -22.88531 -47.49987 0 -23.1264 -48.44366 0 -19.84289 -27.29329 0 18.87351 -21.1373 0 18.98583 -21.45129 0 7.211258 -30.88176 0 -16.81657 -31.84346 0 -8.695564 -25.54573 0 -9.638466 -14.85751 0 -17.72459 -15.67747 0 -9.673347 -10.09125 0 -9.946648 30.83969 0 11.53645 31.80141 0 0.5634842 25.40399 0 1.008888 12.71799 0 12.33528 13.7415 0 1.051926 5.780533 0 0.805191 -3.969727 0 -16.01154 -2.705765 0 -22.55784 -4.473999 0 -22.55537 27.25125 0 -21.59309 20.67242 0 -21.69477 20.97224 0 -14.16137 47.52763 0 3.651192 47.52763 0 -3.16729 41.89215 0 -2.106529 48.50128 0 -19.66567 47.45784 0 -23.12641 42.27966 0 -22.88531 67.3389 0 -10.98022 67.07251 0 -13.73653 65.82523 0 -14.3377 53.20935 0 -12.5131 52.91032 0 -8.54998 56.80072 0 -8.02198 55.67822 0 -17.13599 58.70993 0 -16.53469 58.19124 0 -18.80648 66.19183 0 -16.61346 65.26828 0 -18.47294 65.24063 0 -16.86352 60.84447 0 -18.67298 61.22954 0 -16.53471 62.87419 0 -17.01435 62.17352 0 -21.22266 60.58762 0 -21.99781 60.67978 0 -21.15641 58.20251 0 14.62862 58.20251 0 10.86871 55.04185 0 11.38383 52.91031 0 0.3110809 52.91031 0 6.080956 56.57692 0 5.822449 64.29851 0 -5.067131 67.39847 0 -2.961281 66.99641 0 -5.379982 63.51375 0 19.18984 63.47522 0 17.73368 61.95964 0 18.1199 60.89386 0 12.86703 60.89386 0 15.83453 62.66724 0 15.63412 66.67131 0 14.22421 67.0428 0 11.0095 65.62181 0 11.05552 -10.09125 0 0.8051682 -15.67746 0 1.051926 -14.85751 0 12.33522 -41.9342 0 -2.106529 -47.56968 0 -4.098793 -47.69582 0 2.862419 -38.05869 0 14.21033 -38.34575 0 4.04184 -44.44466 0 9.46946 -58.30764 0 19.80852 -58.20971 0 22.04876 -55.01417 0 22.16659 -52.88261 0 19.85781 -53.07851 0 14.9524 -56.68205 0 17.22732 -52.95237 0 -11.49999 -53.15173 0 -14.89858 -56.6679 0 -13.65856 -65.86728 0 -14.33772 -67.11456 0 -13.73653 -67.38096 0 -10.9802 -65.74606 0 -10.98019 -62.93127 0 -13.65855 -64.50552 0 -14.36607 -63.84115 0 -20.02 -64.53532 0 -19.48223 -64.31915 0 -18.25228 -63.31445 0 -18.37476 -61.78758 0 -19.74458 -62.98215 0 -20.04339 -55.01412 0 -23.02871 -58.14113 0 -22.70794 -58.19515 0 -21.73306 -56.6077 0 -20.45469 -53.15172 0 -19.45603 -52.88257 0 -21.9217 -62.23341 0 18.05856 -63.73634 0 17.81569 -63.55583 0 19.18984 -64.28735 0 -4.490929 -67.03848 0 -5.379997 -67.42094 0 -2.27903 -63.35957 0 1.548439 -65.94458 0 6.201729 -64.38668 0 6.735237 -67.37937 0 1.085136 -67.08864 0 4.469612 -64.42226 0 -0.7472839 -65.62705 0 11.14896 -67.08486 0 11.00054 -66.71336 0 14.22422 -60.99896 0 13.99444 -60.75479 0 10.52914 -62.57095 0 11.14906 -53.0785 0 2.244232 -52.95237 0 -3.731621 -56.80044 0 -2.442574 -44.31854 0 -10.43485 -38.34575 0 -9.313744 -38.05867 0 -16.43844 -48.44367 0 -16.61794 -47.56968 0 -13.08582 -42.32175 0 -18.78019 -25.54573 0 1.008888 -31.84348 0 0.5634842 -30.88176 0 11.53645 -21.45129 0 -14.16137 -21.1373 0 -21.69477 -27.29329 0 -21.59307 -7.292709 0 -15.24676 -7.735489 0 -22.54821 -11.99751 0 -21.77251 20.97224 0 7.211258 20.62337 0 18.98586 27.25125 0 18.87351 -2.96814 0 9.561844 -4.03653 0 20.37078 -0.7369385 0 20.37096 3.748642 0 20.36166 9.298187 0 19.07615 2.023407 0 8.291138 -1.076355 0 -22.55793 -1.808624 0 -22.5579 -2.505142 0 -16.01293 5.841995 0 -9.946663 13.7415 0 -9.673332 12.82852 0 -17.7246 2.519119 0 -15.24682 9.735794 0 -21.77261 4.808014 0 -22.54836 -0.4223328 0 -22.55793 -1.130783 0 -16.0116 1.219604 0 -22.5555 25.40398 0 -9.638481 31.80141 0 -8.695564 30.83969 0 -16.81657 41.60507 0 21.23975 47.45787 0 21.85096 47.52763 0 15.78037 44.2765 0 9.625755 38.3037 0 4.04184 38.01662 0 14.21033 38.0166 0 -16.43844 38.3037 0 -9.313744 44.27649 0 -10.13581 42.27971 0 -18.7802 47.52765 0 -12.40731 48.5013 0 -16.06124 61.94467 0 -11.8679 62.16696 0 -8.407066 65.03662 0 -8.714317 64.46347 0 -14.36607 63.01042 0 -13.69666 65.70398 0 -10.98019 58.59189 0 -10.29346 58.8755 0 -13.69668 55.67821 0 -13.97472 58.15311 0 -21.73306 58.09906 0 -22.70795 54.97205 0 -23.02871 52.8405 0 -21.92171 53.20934 0 -19.2788 56.56566 0 -20.45472 64.2771 0 -18.25228 64.49327 0 -19.48223 63.79909 0 -20.01998 62.94009 0 -20.04339 61.74554 0 -19.74454 63.27238 0 -18.37475 54.97211 0 22.16659 58.16763 0 22.04876 58.20251 0 19.86986 56.57693 0 17.28864 52.91032 0 15.1087 52.84055 0 19.85781 58.2025 0 2.774498 58.4263 0 -2.63929 55.04187 0 -2.800117 67.42044 0 -1.12162 67.41489 0 -1.615608 64.64919 0 -3.336372 61.27541 0 1.104378 60.89386 0 5.822449 62.89215 0 6.6418 64.42563 0 -0.6313095 67.04657 0 4.549507 67.34286 0 1.678017 64.38145 0 6.641777 65.90251 0 6.221924 63.35985 0 1.362961 67.42044 0 -1.061897 64.64134 0 -2.655418 67.40085 0 -0.3404922 60.89388 0 19.4952 60.85901 0 21.19793 62.70587 0 20.27477 63.47519 0 14.17159 63.54231 0 11.0556 61.95961 0 10.86871 64.94043 0 13.05385 64.71555 0 15.63404 65.7527 0 15.68676 65.33537 0 18.64186 65.22633 0 17.77206 64.75282 0 18.50789 -9.760529 0 20.07719 -7.291489 0 14.61285 -9.662109 0 13.02448 -47.87363 0 18.93753 -44.54572 0 21.9528 -44.59467 0 17.89005 -57.22585 0 10.64064 -58.48647 0 12.40578 -56.82307 0 13.15323 -58.69545 0 -9.592216 -56.77821 0 -7.765511 -56.74509 0 -10.23069 -63.7458 0 -8.304955 -61.86965 0 -9.688499 -63.50185 0 -10.28881 -62.23291 0 -16.66529 -60.85297 0 -17.68548 -61.96325 0 -18.00468 -65.76488 0 -17.70361 -65.81598 0 -16.56808 -65.25323 0 -17.79447 -61.55917 0 -21.63232 -61.62035 0 -21.0957 -60.56239 0 -21.68696 -58.39892 0 -17.71885 -56.75352 0 -16.74 -56.73847 0 -18.24627 -61.96294 0 20.75247 -60.81878 0 20.40125 -61.98742 0 19.80764 -61.75289 0 6.474686 -60.85122 0 4.204437 -62.20939 0 4.280365 -65.3774 0 18.64186 -64.80747 0 18.5284 -65.28102 0 17.79256 -65.30058 0 15.91917 -64.82497 0 14.88995 -65.49275 0 14.48732 -63.67957 0 14.89 -63.07061 0 15.94087 -62.85475 0 14.509 -58.51607 0 4.046318 -57.22585 0 6.272026 -56.85268 0 3.287132 -44.71434 0 -23.24891 -48.06058 0 -21.55016 -45.62491 0 -20.97298 -24.31892 0 19.60691 -20.87399 0 12.68744 -24.39742 0 12.64445 -31.48103 0 -12.83204 -28.66856 0 -8.89727 -27.75351 0 -13.82539 -15.34866 0 -14.09753 -12.87961 0 -9.240547 -12.16866 0 -14.17814 31.43898 0 5.830017 28.60159 0 0.3288803 27.68654 0 6.572044 13.25377 0 6.82402 9.840012 0 0.428215 8.9095 0 6.776634 -3.200836 0 -19.28222 -3.388367 0 -22.58143 -4.445236 0 -19.28025 24.17116 0 -22.0525 20.27968 0 -17.80068 24.24609 0 -17.76218 47.81749 0 0.2560196 44.59288 0 -3.316124 44.59288 0 1.139381 48.04343 0 -21.50587 44.67229 0 -23.24894 45.60779 0 -20.92869 67.34137 0 -12.23423 66.49251 0 -14.06664 66.45955 0 -12.76403 52.73666 0 -10.88059 55.04837 0 -7.926582 55.12312 0 -10.38143 57.27267 0 -16.70522 58.47147 0 -17.72839 56.80563 0 -18.20197 65.72284 0 -17.70361 65.21114 0 -17.79447 65.77391 0 -16.56808 60.84122 0 -17.695 62.22115 0 -16.67483 61.92117 0 -18.00466 61.51714 0 -21.63232 60.52031 0 -21.68696 61.57828 0 -21.0957 58.34741 0 12.90132 56.6494 0 10.76463 56.6494 0 13.28671 52.66191 0 3.078712 54.99242 0 6.158836 54.99242 0 3.014091 65.89636 0 -3.914818 67.3033 0 -3.99865 65.45482 0 -5.446693 63.58482 0 18.53025 62.74722 0 17.83139 62.75684 0 18.81261 60.76964 0 14.37521 61.91994 0 15.85666 61.91994 0 14.32509 66.97601 0 12.8353 66.21303 0 10.71768 66.19554 0 12.84683 -12.87959 0 0.4282074 -15.34866 0 6.824005 -12.16866 0 6.776573 -44.63493 0 -3.548988 -47.89109 0 -0.8065262 -44.66646 0 0.9421844 -37.77161 0 8.713745 -41.52115 0 6.791969 -41.4494 0 12.02953 -58.39657 0 21.04796 -56.66533 0 22.28897 -56.6898 0 20.74891 -52.71806 0 17.6289 -55.08177 0 16.04733 -55.03281 0 18.45827 -52.75381 0 -13.40134 -55.09654 0 -14.21572 -55.04671 0 -12.3447 -66.53458 0 -14.06664 -67.38341 0 -12.23425 -66.50162 0 -12.76403 -64.29397 0 -12.21474 -63.78657 0 -14.0826 -65.16473 0 -12.77111 -64.19793 0 -19.81683 -64.50857 0 -18.79769 -64.01337 0 -19.15566 -62.56577 0 -19.01635 -62.43726 0 -19.91164 -63.1886 0 -19.25246 -56.64814 0 -22.9715 -58.31316 0 -22.29272 -56.66165 0 -22.268 -55.08147 0 -19.88178 -52.73634 0 -20.7748 -55.0142 0 -21.13541 -63.07062 0 17.83655 -63.68166 0 18.55075 -62.85683 0 18.79728 -65.4836 0 -5.302666 -67.34045 0 -3.828102 -65.9093 0 -3.220726 -64.75424 0 3.665604 -65.1228 0 6.417198 -63.8395 0 4.184082 -67.30103 0 2.839531 -65.66479 0 1.839294 -65.91602 0 -0.09812164 -66.2459 0 10.73881 -67.01804 0 12.83306 -66.22839 0 12.87019 -60.78218 0 12.34162 -61.71345 0 10.62103 -61.94315 0 12.81285 -52.7355 0 -0.869278 -55.07983 0 -3.174049 -55.11136 0 0.08543396 -41.48964 0 -9.869072 -37.77159 0 -12.89205 -41.41786 0 -13.5518 -48.07804 0 -15.00886 -44.73181 0 -15.60741 -45.62494 0 -17.64529 -28.66858 0 0.3288879 -31.48102 0 5.830009 -27.75352 0 6.572052 -20.87399 0 -17.80068 -24.31892 0 -22.0525 -24.39742 0 -17.76218 -7.39595 0 -19.0844 -9.788162 0 -22.37617 -9.67749 0 -18.12992 20.26741 0 12.68745 24.15889 0 19.60692 24.24609 0 12.64445 -3.893219 0 14.93672 -2.459808 0 20.41282 -1.518097 0 14.93681 6.48082 0 20.07751 5.679901 0 13.02467 2.645416 0 14.61308 -1.417526 0 -22.58215 -2.251526 0 -19.2826 -1.765076 0 -19.28262 9.855377 0 -9.240562 13.2814 0 -14.09754 9.013992 0 -14.17817 6.10553 0 -18.13001 7.182114 0 -22.37629 3.468399 0 -19.08451 -0.9963684 0 -19.2823 0.2234497 0 -19.28034 0.1570587 0 -22.58155 28.60159 0 -8.897255 31.439 0 -12.83205 27.68654 0 -13.82539 44.50368 0 21.9528 47.80005 0 18.97662 44.52109 0 17.92913 41.44759 0 6.831055 37.72955 0 8.713737 41.37581 0 12.06862 37.72954 0 -12.89205 41.4476 0 -9.794334 41.37581 0 -13.47707 44.68974 0 -15.43778 48.0609 0 -14.32058 45.6078 0 -17.50614 61.86845 0 -10.3164 63.71429 0 -8.448997 63.49005 0 -10.3932 63.77481 0 -14.09212 64.28221 0 -12.22428 65.12267 0 -12.77111 58.77855 0 -12.05259 57.31407 0 -13.99429 56.90581 0 -12.12211 58.27109 0 -22.29272 56.60608 0 -22.97152 56.6196 0 -22.268 52.71918 0 -20.73049 55.06435 0 -19.83749 54.97214 0 -21.13541 64.46651 0 -18.79768 64.15588 0 -19.81683 63.9713 0 -19.15566 62.3952 0 -19.91164 62.52371 0 -19.01635 63.14655 0 -19.25246 56.62326 0 22.28897 58.33875 0 21.06329 56.63197 0 20.76424 54.99242 0 16.10177 52.64447 0 17.66797 54.97499 0 18.4736 58.40337 0 0.1688385 56.70534 0 -2.990334 56.6494 0 0.1286316 67.42982 0 -1.251976 65.99466 0 -2.607445 65.99915 0 -2.218666 60.86502 0 3.212425 61.97615 0 6.299049 62.22926 0 4.049713 65.63406 0 1.923386 67.26039 0 3.067429 65.88977 0 0.3805847 65.08995 0 6.398872 64.72275 0 3.635521 63.81721 0 4.114365 65.99721 0 -2.009621 65.98138 0 -1.437477 67.42633 0 -0.858551 60.76096 0 20.41659 61.92088 0 20.75247 61.92958 0 19.82298 63.59195 0 12.83375 62.76401 0 10.68256 62.74719 0 12.78704 64.77951 0 14.37173 65.24593 0 15.81962 65.45988 0 14.3849 64.93619 0 19.60257 66.09113 0 18.03014 65.82286 0 16.87946 64.70781 0 16.7762 64.13438 0 17.73252 64.21211 0 19.27729 -14.28516 0 25.78631 -8.095062 0 25.82307 -5.685425 0 20.32641 -4.926178 0 6.571465 -7.984436 0 3.11528 -13.85634 0 16.71078 -50.63045 0 14.59411 -50.33659 0 21.09801 -46.8504 0 24.56433 -38.77637 0 25.13132 -39.31464 0 18.92214 -46.65622 0 12.32868 -54.96171 0 8.731995 -58.58691 0 8.558563 -59.7038 0 10.5922 -59.77492 0 14.52885 -57.78782 0 15.90992 -54.00718 0 12.57104 -60.18086 0 -11.9278 -60.42183 0 -7.481377 -58.00682 0 -5.04969 -53.73367 0 -6.287575 -53.73367 0 -9.693733 -57.80801 0 -12.85934 -66.34219 0 -6.990227 -62.91862 0 -6.043159 -62.20313 0 -12.85932 -65.85043 0 -9.469276 -63.75914 0 -15.77663 -61.82707 0 -15.14227 -59.79512 0 -16.45731 -59.6539 0 -18.96001 -61.21128 0 -19.38428 -63.25768 0 -17.5741 -65.41074 0 -19.02518 -66.59409 0 -16.82923 -66.69215 0 -15.26896 -65.4652 0 -15.70348 -64.74631 0 -17.44363 -64.89291 0 -19.02975 -60.81034 0 -22.19883 -62.65918 0 -21.44349 -62.66715 0 -20.71197 -61.12468 0 -20.48327 -59.56508 0 -21.37788 -59.47449 0 -22.34705 -57.76662 0 -15.14227 -54.0327 0 -16.14983 -54.03269 0 -18.21801 -57.67632 0 -19.72871 -63.39446 0 20.78858 -61.11459 0 21.90927 -59.62807 0 21.62531 -59.77495 0 19.36401 -61.46331 0 18.5637 -63.27316 0 19.75663 -62.84521 0 9.093178 -60.78843 0 8.558563 -59.70381 0 6.464355 -59.99196 0 0.6290512 -62.09003 0 0.6908875 -63.62556 0 6.919907 -66.13318 0 18.03014 -64.97824 0 19.60257 -64.25417 0 19.27729 -64.29424 0 17.85553 -64.82552 0 16.97826 -65.86492 0 16.87946 -64.29424 0 16.05902 -64.26134 0 12.99558 -65.20231 0 12.10067 -66.2719 0 15.17508 -63.7459 0 16.97832 -61.94057 0 17.03134 -61.4633 0 15.22562 -63.21858 0 12.10075 -54.00718 0 4.783897 -57.96542 0 -1.09745 -38.77634 0 -25.18868 -46.85036 0 -24.63712 -50.33655 0 -22.64243 -50.90893 0 -19.37666 -48.59079 0 -18.15025 -41.22369 0 -21.55567 -30.16408 0 25.50047 -21.82091 0 25.69533 -17.92474 0 16.67401 -18.5222 0 3.153793 -22.97371 0 3.128128 -29.62581 0 16.33391 -34.47023 0 -17.91868 -35.06949 0 -8.884132 -31.96548 0 -4.274574 -24.67192 0 -4.584221 -22.97369 0 -11.27464 -29.62581 0 -19.96497 -17.92474 0 -20.31908 -18.5222 0 -11.29646 -15.80125 0 -4.58065 -9.205414 0 -4.971687 -7.999786 0 -11.90942 -13.85634 0 -20.35082 34.42816 0 14.53743 35.0274 0 1.77903 31.9234 0 -4.274559 24.48036 0 -4.584221 22.69778 0 3.128128 29.58372 0 16.33391 16.76848 0 16.67406 17.46046 0 3.153793 13.97337 0 -4.58065 4.401245 0 -4.971657 2.771957 0 3.115364 11.58313 0 16.71091 -3.25415 0 -14.3791 -2.240921 0 -22.53367 -2.34758 0 -25.8359 -4.279358 0 -25.83366 -5.932938 0 -22.52813 -5.253403 0 -14.1862 30.12201 0 -25.53902 21.60783 0 -25.71627 16.85744 0 -20.3191 17.46046 0 -11.29646 22.6978 0 -11.27465 29.58374 0 -19.96499 50.3992 0 5.331017 50.3992 0 -1.88369 46.42499 0 -6.62809 39.70319 0 -5.71479 39.70319 0 0.3749695 46.42497 0 6.835403 51.0164 0 -19.1108 50.29449 0 -22.64243 46.80829 0 -24.63714 38.73428 0 -25.1887 41.18163 0 -21.55569 48.69826 0 -17.78953 68.34073 0 -9.091316 67.60886 0 -13.37693 66.65009 0 -15.26896 65.42316 0 -15.70348 65.1293 0 -14.46558 66.8611 0 -10.41523 51.0164 0 -14.40905 50.3992 0 -10.00571 53.6916 0 -5.772667 57.98685 0 -5.439629 58.02824 0 -8.817284 54.22449 0 -13.52026 55.17902 0 -15.69732 58.86014 0 -15.19944 60.0192 0 -16.5145 59.61183 0 -18.96001 57.63426 0 -19.72871 54.22447 0 -17.95214 66.55205 0 -16.82923 65.36868 0 -19.02518 64.85085 0 -19.02975 64.70425 0 -17.44363 61.96681 0 -15.19944 63.71709 0 -15.77663 63.21564 0 -17.5741 61.16919 0 -19.38428 62.61713 0 -21.44349 60.76831 0 -22.19883 59.43245 0 -22.34705 59.52301 0 -21.37788 61.08263 0 -20.48327 62.62509 0 -20.71197 59.63828 0 15.46083 59.63828 0 11.60117 57.65118 0 8.514542 53.69162 0 8.966461 53.6916 0 12.80549 57.65118 0 16.08097 57.65118 0 4.788712 53.6916 0 -1.791893 63.90434 0 -4.333076 67.39726 0 -2.192177 68.85275 0 -2.10714 68.73062 0 -5.090126 66.30011 0 -6.990227 62.94279 0 -6.527962 63.17322 0 16.77626 61.28448 0 17.12332 61.28452 0 18.65569 63.23109 0 19.75662 63.17322 0 15.09606 61.28448 0 11.60117 67.09808 0 15.39463 67.99182 0 11.61614 66.73166 0 8.790474 65.00035 0 8.95295 65.21548 0 11.88144 66.22983 0 15.17509 -39.74525 0 -5.71479 -46.46703 0 -7.234764 -50.44125 0 -4.058739 -50.63045 0 3.385864 -46.65622 0 6.442818 -39.74525 0 0.3749695 -34.47023 0 14.53743 -35.06949 0 1.779022 -57.88496 0 22.93027 -53.30965 0 23.82294 -53.62902 0 21.43756 -57.78783 0 18.48386 -50.44125 0 -11.59136 -50.90895 0 -15.7013 -67.65092 0 -13.37693 -68.38278 0 -9.091316 -66.90318 0 -10.41523 -65.17136 0 -14.46558 -63.73569 0 -20.86481 -64.48072 0 -20.23631 -63.93257 0 -18.04498 -63.44315 0 -20.09457 -53.3096 0 -23.90229 -57.82409 0 -23.051 -57.66679 0 -21.09753 -53.62897 0 -22.72895 -68.77267 0 -5.090126 -68.8774 0 -1.501595 -67.39542 0 -0.6641846 -63.81259 0 -2.965569 -63.40211 0 -0.364418 -66.6629 0 5.686615 -66.77373 0 8.774239 -64.98719 0 9.093124 -68.82752 0 2.535408 -68.60315 0 7.121788 -68.03387 0 11.59823 -67.14013 0 15.39463 -39.48329 0 -18.78905 -46.46703 0 -11.38308 -21.82091 0 -25.71624 -30.16406 0 -25.53901 -8.193146 0 -25.82507 -14.28516 0 -25.79478 21.50972 0 25.69538 30.12202 0 25.50047 -3.78891 0 25.83444 -0.2901611 0 25.83471 1.282471 0 20.32671 -1.062302 0 6.571548 5.092529 0 25.82355 12.89743 0 25.78658 -0.413269 0 -25.83599 -1.271027 0 -25.83598 -2.241043 0 -14.37913 -0.7547302 0 -22.5337 11.83073 0 -20.35087 2.972763 0 -11.90945 13.388 0 -25.79487 6.342834 0 -25.82526 2.768784 0 -22.5283 -0.1756134 0 -14.18626 2.036713 0 -25.83384 0.3715515 0 -25.83599 35.0274 0 -8.884132 34.42816 0 -17.91869 38.73431 0 25.13132 46.80835 0 24.56433 50.29454 0 21.09801 50.3992 0 14.82857 46.42497 0 12.56313 39.27258 0 18.92214 46.42497 0 -10.83964 39.44122 0 -18.78907 60.40492 0 -13.01139 60.44327 0 -8.913551 65.80833 0 -9.469276 62.34286 0 -13.01139 57.78204 0 -23.051 53.26755 0 -23.90229 53.5869 0 -22.72897 57.62473 0 -21.09753 64.43866 0 -20.23631 63.69363 0 -20.86481 63.40108 0 -20.09457 63.89052 0 -18.04498 53.26761 0 23.82294 57.84293 0 22.93027 59.586 0 21.62531 59.63829 0 19.456 57.6512 0 18.57585 53.58696 0 21.43756 59.63829 0 4.788712 60.0134 0 -1.392525 68.87738 0 -0.03490448 68.87245 0 -0.4923477 63.99312 0 -3.464867 67.40968 0 -1.099831 61.28448 0 8.514542 63.31335 0 8.952995 63.68089 0 6.779724 62.11147 0 0.240509 63.42432 0 -0.567276 66.62085 0 5.731819 68.5611 0 7.211357 68.79039 0 3.118233 67.36578 0 0.5018463 63.92635 0 -2.396828 68.85997 0 0.6960449 68.87737 0 0.03675079 61.07254 0 21.90927 63.3524 0 20.78858 64.13437 0 15.09602 64.27451 0 11.88147</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape4-positions-array" count="1185" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape4-normals" name="qt_gauge_background_Shape4-normals">
+ <float_array id="qt_gauge_background_Shape4-normals-array" count="3555">0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape4-normals-array" count="1185" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape4-tangents" name="qt_gauge_background_Shape4-tangents">
+ <float_array id="qt_gauge_background_Shape4-tangents-array" count="3555">-0.001804257 0 -0.9999984 0 0 1 -0.9999999 0 -4.25804e-4 -0.9995824 0 -0.02889511 -0.9999275 0 0.01204223 -0.002065321 0 0.9999979 0.9999739 0 -0.007218961 0 0 1 0.001974017 0 0.9999981 0.00291667 0 -0.9999957 0.03455327 0 0.9994029 0.04888941 0 -0.9988042 0.09831163 0 0.9951557 0.1309502 0 -0.991389 0.9936351 0 0.1126469 -0.1602991 0 0.9870685 0.2527822 0 0.9675232 -0.3542793 0 -0.9351397 0.9391005 0 0.3436426 -0.6130099 0 0.7900752 0.7732205 0 0.6341372 0.699112 0 0.7150122 0.4592876 0 0.8882876 -0.3056784 0 0.9521348 -0.43833 0 -0.8988141 0.3343318 0 -0.9424554 0.9949702 0 -0.1001716 0.06631393 0 0.9977988 0.6391926 0 -0.7690467 0.9866652 0 0.1627632 0.9477488 0 -0.3190176 -0.9996531 0 0.02633931 -0.9886469 0 0.1502571 -0.5608319 0 0.8279297 -0.7503061 0 -0.6610906 0.00868886 0 0.9999623 0.01385394 0 -0.999904 -0.9881416 0 0.1535451 0.6564196 0 0.754396 -0.03675476 0 -0.9993243 -0.04673032 0 0.9989075 -0.008603295 0 -0.999963 -0.01129575 0 0.9999362 -0.0383393 0 0.9992648 0.4439395 0 0.8960568 -0.09963863 0 -0.9950237 -0.1303392 0 0.9914695 0.9993358 0 -0.0364402 -0.9968358 0 0.07948811 -0.3008461 0 0.9536727 -0.8887863 0 0.4583219 -0.2140052 0 0.9768325 -0.9917022 0 -0.1285564 -0.9684643 0 0.2491523 -0.8072081 0 0.5902669 0.9595094 0 0.2816766 -0.4916255 0 0.8708067 0.9928111 0 -0.1196914 -0.2727244 0 -0.9620922 -0.8823551 0 0.4705842 0.6206898 0 -0.7840562 -0.9879089 0 -0.1550355 -0.5623752 0 -0.8268822 0.5819854 0 -0.8131992 -0.308839 0 0.9511143 0.5965875 0 -0.802548 -0.9148118 0 -0.4038804 -0.9998719 0 0.01600552 0.02407529 0 0.9997101 0.7216781 0 -0.6922289 -0.9623502 0 0.2718125 -0.07660318 0 0.9970617 0.4595524 0 -0.8881507 -0.9890904 0 0.1473099 -0.189548 0 0.9818715 0.9247574 0 -0.3805571 0.9646164 0 0.2636572 0.1145329 0 -0.9934195 -0.7728773 0 0.6345556 0.1414171 0 -0.9899501 -0.9686156 0 0.2485635 0.4067513 0 0.9135389 -0.9000019 0 0.4358859 0.9988911 0 0.04708051 -0.2266355 0 -0.9739796 -0.6932413 0 0.7207056 -0.4087529 0 0.9126451 0.9987655 0 -0.04967397 -0.05893935 0 -0.9982616 -0.9998723 0 0.0159819 0.03159029 0 0.9995009 0.6467938 0 -0.7626649 -0.8694741 0 0.4939785 0.4910589 0 -0.8711264 -0.999601 0 0.02824771 0.06572748 0 0.9978376 0.1561989 0 0.9877256 0.5116709 0 -0.8591815 -0.8779596 0 0.4787347 -0.9662476 0 -0.2576152 -0.1494362 0 0.9887714 0.9460907 0 -0.3239017 -0.2818267 0 0.9594653 0.9999945 0 -0.003314808 -0.605561 0 -0.7957989 -0.9997684 0 0.02151951 0.2170654 0 -0.9761571 -0.6123267 0 0.7906048 -0.999705 0 0.0242864 0.9818217 0 0.1898055 -0.915079 0 -0.4032746 0.5842116 0 0.8116014 -0.9669714 0 -0.2548849 0.1666941 0 0.9860087 -0.3448435 0 -0.9386602 0.9990088 0 0.044514 -0.5632426 0 -0.8262916 0.8684117 0 0.4958438 -0.1023555 0 -0.9947479 0.9993815 0 -0.0351665 0.978972 0 -0.2039947 0.7480995 0 0.6635866 0.01744852 0 0.9998478 0.003820587 0 0.9999927 -0.01859483 0 -0.9998271 9.20735e-4 0 -0.9999996 -0.9885801 0 0.1506961 -0.003645006 0 -0.9999934 0 0 1 -0.9862621 0 -0.1651882 0.6884971 0 0.725239 -0.005192589 0 0.9999865 0.9501271 0 0.3118631 -0.001522046 0 0.9999988 -0.9945683 0 0.1040862 -0.06225896 0 -0.99806 -0.9999762 0 -0.006902543 0.6160183 0 0.7877319 -0.742971 0 0.6693236 0.9993716 0 0.03544458 -0.699536 0 0.7145973 -0.2075961 0 0.9782146 0.3987317 0 -0.9170676 -0.697596 0 0.7164914 0.9786626 0 -0.205474 -0.1697652 0 -0.9854845 -0.9999448 0 -0.0105064 0.5290285 0 0.848604 -0.9997884 0 -0.02057096 -0.9999553 0 0.00945966 0.5560695 0 -0.8311358 0.05083702 0 -0.998707 -0.9724178 0 0.2332458 0.8862918 0 -0.4631272 -0.9977491 0 -0.06705718 -0.6262629 0 0.7796119 -0.9996255 0 -0.02736552 -0.4047072 0 -0.9144463 -0.9988237 0 -0.04848907 -0.7499778 0 -0.661463 -0.05337383 0 0.9985746 0.9976391 0 -0.06867503 0.007083306 0 -0.9999749 -0.9995608 0 -0.02963395 0.9188023 0 0.394718 0.9979847 0 -0.06345449 0.07836596 0 -0.9969247 -0.7048734 0 0.7093331 -0.09758574 0 0.9952271 0.9999258 0 -0.0121812 -0.6071496 0 -0.7945875 0.9985802 0 0.05326904 -0.234547 0 -0.9721048 -0.5956219 0 0.8032649 0.1339202 0 -0.9909921 0.6783914 0 0.7347007 0.4109869 0 -0.9116413 -0.9955996 0 -0.09370921 0.6305469 0 0.7761511 0.8539338 0 0.5203816 -0.1895403 0 -0.9818729 -0.9912615 0 0.1319113 0.3537608 0 0.9353359 0.2598896 0 -0.9656383 -0.9927148 0 -0.1204881 -0.1989929 0 -0.9800009 -0.3990044 0 0.916949 0.4820966 0 -0.876118 -0.9994015 0 0.03459143 0.5908292 0 0.8067966 -0.4144723 0 -0.9100619 -0.9999288 0 0.01193359 0.9656331 0 0.2599089 0.8508599 0 -0.5253926 -0.9999271 0 0.01207775 -0.1545808 0 0.9879801 -0.9997307 0 -0.02320512 0.9271389 0 0.3747179 -0.0533772 0 -0.9985744 -0.8528173 0 0.5222094 -0.838306 0 0.5452 0.06023688 0 0.9981841 0.9960049 0 0.08929874 -0.3819981 0 -0.9241631 0.0270762 0 -0.9996334 -0.9997565 0 0.02206684 0.9027504 0 0.4301648 0.999501 0 0.03158602 -0.04137138 0 -0.9991438 -0.8261309 0 0.5634782 0.9993924 0 0.03485506 -0.002989997 0 -0.9999955 -0.8282355 0 0.5603801 -0.9997685 0 -0.02151513 -0.04093997 0 0.9991616 0.8932005 0 -0.4496586 -0.999976 0 -0.006921388 -0.002106725 0 0.9999978 0.8362789 0 -0.5483043 -0.9931352 0 -0.1169722 7.54644e-4 0 0.9999997 0.999056 0 -0.04344077 -0.0246575 0 0.999696 0.9999907 0 0.004323707 -0.8113046 0 -0.5846237 -0.8166067 0 0.5771945 -0.9788992 0 -0.2043439 0.2906588 0 -0.9568268 0.9794165 0 0.2018499 0.2795677 0 -0.960126 -0.853097 0 -0.5217524 -0.8310172 0 -0.5562467 0.9100414 0 -0.4145174 0.4716315 0 -0.8817958 0.1275983 0 -0.9918259 -0.7639637 0 -0.6452593 -0.9955542 0 -0.09419009 -0.8155625 0 -0.578669 -0.9942862 0 -0.1067467 0.4427133 0 -0.8966632 0.442572 0 -0.896733 0.6811587 0 0.7321358 -0.9704345 0 -0.2413645 0.3882263 0 -0.9215641 0.6360206 0 -0.7716721 -0.5893887 0 0.8078496 -0.6382664 0 0.7698155 -0.9213766 0 0.388671 0.9093446 0 0.4160437 -0.3977903 0 0.9174763 -0.1981122 0 0.9801794 -0.8101634 0 0.5862041 0.5887171 0 -0.8083391 -0.962805 0 -0.2701973 0.9100258 0 0.4145517 0.2578731 0 -0.9661788 0.4716123 0 0.881806 -0.4605387 0 0.8876396 0.5379934 0 -0.8429491 -0.8592129 0 -0.5116183 -0.2244942 0 0.9744754 0.5389767 0 -0.8423207 -0.8045782 0 0.5938467 0.9913326 0 0.1313764 0.9099886 0 0.4146333 0.1773293 0 0.9841516 0.2750528 0 -0.9614291 -0.1501024 0 0.9886705 0.05849379 0 0.9982878 0.9662574 0 0.2575783 -0.9878834 0 0.1551976 0.9968086 0 0.07982805 -0.9063685 0 0.422488 0.6098049 0 0.7925516 -0.6722706 0 -0.7403055 0.970632 0 0.2405693 0.8373389 0 0.5466842 0.9861557 0 -0.1658218 -0.7986617 0 -0.6017803 0.983685 0 0.1798992 -0.4954594 0 0.8686311 -0.2750434 0 0.9614318 -0.8710863 0 -0.4911299 -0.4806947 0 -0.876888 0.9885333 0 0.1510029 -0.527707 0 0.8494265 -0.4526699 0 0.8916782 0.6583435 0 -0.7527177 0.823736 0 -0.5669736 -0.9356188 0 0.3530119 0.9839319 0 0.1785439 -0.9693376 0 -0.2457327 -0.9526287 0 0.3041359 -0.8231424 0 -0.567835 -0.9802246 0 -0.1978881 -0.9000137 0 -0.4358616 0.8795352 0 0.4758339 0.3128432 0 -0.9498048 -0.2168283 0 -0.9762098 0.4499098 0 -0.893074 0.8632451 0 -0.5047849 -0.523268 0 0.8521682 -0.2048034 0 0.9788031 0.1011053 0 -0.9948757 -0.8661421 0 0.4997978 0.8607669 0 -0.5089993 -0.8346476 0 -0.5507843 0.8660924 0 0.499884 -0.6839395 0 0.7295387 -0.6271058 0 0.7789341 0.8453132 0 -0.534271 -0.2453516 0 -0.9694342 -0.9512793 0 0.3083305 0.7620143 0 -0.6475602 -0.1043785 0 -0.9945376 -0.7938529 0 0.6081098 0.7934449 0 -0.6086421 0.6747819 0 0.7380172 0.2402639 0 -0.9707076 -0.998844 0 0.04806923 -0.4085473 0 0.9127371 0.9983215 0 0.05791484 -0.8895552 0 -0.4568278 -0.9985631 0 -0.05358856 -0.03445925 0 0.9994061 0.7507361 0 -0.6606022 0.3300611 0 -0.9439596 -0.9990248 0 0.04415209 0.5945875 0 0.8040309 -0.9920038 0 -0.1262081 0.1736419 0 0.9848089 0.7250481 0 -0.6886983 -0.2935906 0 0.9559313 0.9874548 0 0.1579018 -0.5788242 0 -0.8154524 -0.4549204 0 0.8905321 0.9701044 0 0.242688 -0.5273518 0 -0.849647 -0.860953 0 -0.5086844 -0.1079531 0 0.994156 0.9994995 0 0.03163419 -0.3659397 0 -0.9306385 -0.2085899 0 0.9780032 0.9576897 0 0.2878027 -0.9886009 0 -0.1505599 0.156134 0 0.9877359 0.5397579 0 -0.8418203 -0.5198555 0 0.8542542 0.9947086 0 0.1027363 -0.3536975 0 -0.9353599 0.2579786 0 0.9661506 0.9990638 0 -0.04326004 -0.9290839 0 -0.369869 -0.9130039 0 0.4079508 0.9929742 0 0.1183313 0.04870491 0 -0.9988132 -0.4255864 0 0.9049178 0.9998903 0 -0.014812 -0.8819748 0 -0.4712966 -0.9957442 0 -0.09216017 0.1361295 0 0.9906911 0.8974568 0 -0.4411024 -0.9994624 0 -0.03278729 0.1179084 0 0.9930245 0.8962449 0 -0.4435596 0.1502437 0 -0.988649 -0.942164 0 -0.3351523 0.3721278 0 0.9281815 -0.2394028 0 0.9709203 0.9991273 0 0.04176873 -0.8790791 0 -0.4766758 -0.9888782 0 -0.1487275 0.06340368 0 0.997988 0.8845578 0 -0.4664307 -0.9909559 0 -0.134188 -0.1528712 0 0.9882461 0.8976567 0 -0.4406955 0.9945306 0 0.1044454 0.07312171 0 -0.997323 -0.9251554 0 0.3795886 0.9953078 0 0.09675968 0.1578603 0 -0.9874615 -0.8857664 0 0.4641314 0.9734623 0 0.2288475 0.03453845 0 -0.9994034 -0.9999614 0 0.00878189 0.1475231 0 -0.9890586 -0.9949524 0 -0.1003479 0.7399011 0 0.6727157 0.9963755 0 0.08506355 0.0506493 0 -0.9987165 -0.7687098 0 0.6395977 0.9704141 0 -0.2414468 0.04394449 0 -0.999034 -0.5068082 0 0.8620589 0.9999981 0 0.001971207 0.494646 0 -0.8690945 -0.9274866 0 0.3738563 -0.9605456 0 -0.2781226 -0.2799176 0 0.960024 0.8149937 0 -0.5794699 -0.2608176 0 0.9653881 0.980624 0 -0.1958992 -0.3998777 0 -0.9165685 0.9185988 0 -0.3951914 -0.9964718 0 -0.08392828 -0.4846077 0 0.8747316 -0.9999945 0 -0.003323277 0.1399173 0 0.9901632 0.7205435 0 -0.6934097 0.5294511 0 -0.8483405 -0.9773523 0 -0.2116189 -0.06741978 0 0.9977247 0.9965 0 0.08359295 0.06686871 0 -0.9977618 -0.7638962 0 0.6453392 -0.9959965 0 -0.08939173 -0.03737868 0 0.9993012 0.8709384 0 -0.4913922 -0.5849257 0 0.8110869 0.9958182 0 -0.09135718 0.04323381 0 -0.999065 0.9942443 0 0.1071365 -0.1330243 0 -0.9911128 -0.6559077 0 0.7548411 -0.9966252 0 -0.08208705 -0.02156536 0 0.9997674 0.868448 0 -0.4957802 0.9767705 0 0.2142879 0.3317641 0 -0.9433624 -0.9523454 0 0.3050218 0.1339728 0 -0.990985 -0.9983815 0 0.05687105 0.9002107 0 0.4354546 0.4711145 0 -0.882072 -0.9952684 0 -0.09716416 0.5353787 0 0.8446122 0.9986389 0 0.05215752 -0.6546745 0 -0.7559109 -0.6497246 0 0.7601697 -0.997436 0 -0.07156469 -0.1536911 0 0.9881189 0.6458995 0 -0.7634224 0.997286 0 0.07362523 -0.4796089 0 -0.8774823 -0.5981388 0 0.8013925 0.9945911 0 0.1038675 -0.3312917 0 -0.9435284 -0.6296219 0 0.7769017 -0.3763566 0 -0.9264749 -0.9843619 0 -0.1761581 0.8969417 0 0.4421488 0.6477329 0 0.7618675 0.4442029 0 -0.8959262 -0.9241747 0 -0.3819701 -0.4948456 0 -0.8689809 -0.999237 0 0.03905671 0.94721 0 0.3206137 0.6507098 0 0.7593265 0.2490517 0 -0.9684902 -0.9675827 0 -0.2525545 -0.03498748 0 -0.9993878 -0.9238505 0 -0.3827536 0.3293724 0 0.9442001 -0.3514317 0 0.9362135 0.9538066 0 0.3004214 -0.3460727 0 -0.9382077 0.2563247 0 -0.9665907 -0.9972446 0 0.07418318 0.4896706 0 0.8719075 0.5615017 0 -0.8274756 -0.98159 0 -0.1910001 0.5287565 0 0.8487735 -0.8350901 0 -0.5501132 -0.2536259 0 0.9673024 0.9777628 0 0.2097138 -0.9990046 0 0.04460835 0.8794186 0 0.4760493 -0.3985704 0 -0.9171377 0.5524548 0 -0.8335429 -0.9993358 0 0.03644244 0.9414373 0 0.3371881 0.9915081 0 0.1300451 -0.09542182 0 -0.9954369 -0.9356091 0 0.3530377 0.9939864 0 0.1095033 -0.2535204 0 -0.96733 -0.831482 0 0.5555517 -0.1961161 0 0.9805807 0.9873704 0 0.1584286 -0.6517456 0 -0.7584377 -0.975142 0 0.2215807 0.6642229 0 0.7475346 -0.324934 0 -0.9457367 0.2127643 0 -0.9771036 -0.9976401 0 0.06866043 0.8460406 0 0.5331184 0.987651 0 0.1566702 0.1117313 0 -0.9937385 -0.7977245 0 0.6030221 0.9996383 0 -0.02689243 -0.08352119 0 -0.996506 -0.8434508 0 0.5372065 -0.9918185 0 -0.1276558 -0.1730126 0 0.9849196 0.9006633 0 -0.4345176 -0.9855099 0 -0.1696178 -0.02665216 0 0.9996448 0.9898254 0 -0.1422871 0.1034403 0 0.9946357 0.8582806 0 -0.5131807 -0.9951947 0 0.09791612 0.07080001 0 -0.9974905 -0.9909806 0 -0.1340051 0.9753287 0 0.2207578 -0.1732752 0 0.9848734 0.9946359 0 -0.1034377 -0.6809015 0 -0.732375 0.6265571 0 0.7793755 0.2300566 0 -0.9731773 -0.9326796 0 -0.3607058 -0.9849896 0 -0.1726136 0.9238518 0 0.3827503 0.02450617 0 -0.9996997 -0.2258182 0 0.9741695 0.9961839 0 -0.08727895 -0.6882275 0 -0.7254949 -0.2388763 0 0.97105 0.9929885 0 0.1182113 -0.5814577 0 -0.8135766 0.7027913 0 -0.7113961 -0.9925332 0 -0.1219751 0.5375972 0 0.8432018 -0.9967399 0 -0.08068149 0.1511089 0 0.9885171 0.7551386 0 -0.6555652 -0.8111325 0 0.5848624 0.9632858 0 0.2684782 0.4467568 0 -0.8946554 -0.9987955 0 -0.04906602 0.02708904 0 0.999633 0.735494 0 -0.6775312 -0.3696187 0 -0.9291835 -0.7567754 0 0.653675 0.9511489 0 -0.3087324 0.9944174 0 0.1055177 0.1872286 0 -0.9823164 -0.8335998 0 0.5523689 0.9784943 0 0.206274 0.1738479 0 -0.9847725 -0.4191957 0 0.9078959 -0.9948536 0 -0.101323 0.288381 0 0.9575157 0.3928254 0 -0.9196131 0.9446554 0 0.3280644 0.7041624 0 -0.710039 -0.9807229 0 0.1954036 -0.2350095 0 -0.9719931 -0.6832731 0 0.7301629 0.9898781 0 -0.14192 -0.073917 0 0.9972644 0.9852578 0 0.1710759 -0.4948564 0 -0.8689748 0.5995103 0 -0.800367 -0.9946479 0 -0.1033227 0.5441091 0 0.8390145 0.9970419 0 0.07686058 0.1998654 0 -0.9798234 -0.8766306 0 0.4811641 0.9974188 0 0.07180295 0.5725622 0 -0.8198613 -0.6377363 0 0.7702548 -0.9815729 0 -0.1910882 -0.4030168 0 0.9151926 0.968821 0 -0.2477615 -0.9039682 0 0.4275997 0.9897526 0 0.1427929 0.6660232 0 -0.745931 0.3243144 0 0.9459493 0.9098189 0 -0.4150055 -0.9864636 0 0.1639802 0.5542553 0 -0.8323467 -0.6725885 0 0.7400167 0.9987925 0 0.04912842 -0.9897542 0 -0.142782 0.3868414 0 0.9221463 0.5030078 0 -0.8642819 0.9962131 0 0.08694488 0.4322085 0 -0.9017737 -0.925071 0 0.3797942 -0.9926276 0 -0.1212045 -0.3302621 0 0.9438893 0.9756263 0 -0.2194385 -0.7776049 0 0.6287532 0.9991657 0 0.04083928 0.4409092 0 0.8975517 -0.9778256 0 -0.2094208 0.2575706 0 0.9662595 -0.9658007 0 0.2592856 0.2940719 0 -0.9557833 -0.8771403 0 0.4802342 -0.8420849 0 -0.539345 0.9974018 0 0.07203967 -0.07956929 0 -0.9968293 0.8353652 0 -0.5496954 0.08725667 0 -0.9961859 -0.9347121 0 0.3554059 -0.8334109 0 -0.5526538 -0.8736703 0 -0.4865184 0.02803697 0 0.9996069 -0.8736189 0 0.4866107 -0.8630486 0 -0.5051208 0.05755867 0 0.9983421 -0.8926494 0 0.4507517 0.8455677 0 -0.5338682 -0.9629627 0 -0.2696347 -0.7648594 0 -0.6441973 0.5031857 0 -0.8641783 -0.8193703 0 -0.5732645 -0.2870461 0 -0.9579168 0.0271856 0 -0.9996304 -0.8370725 0 0.547092 -0.7621326 0 -0.647421 -0.8384106 0 -0.5450391 -0.2145535 0 0.9767122 -0.8036294 0 0.5951301 -0.999799 0 -0.02004815 0.2898449 0 0.9570736 -0.7554874 0 0.6551631 -0.7775809 0 -0.6287829 -0.1044695 0 0.9945281 -0.9773197 0 0.2117692 -0.9996893 0 -0.0249275 0.2099489 0 0.9777124 -0.9129984 0 0.4079632 0.2017308 0 -0.979441 -0.9970946 0 0.07617267 -0.8640569 0 -0.5033942 0.1460894 0 -0.9892714 -0.9977077 0 0.06767092 -0.8758165 0 -0.4826442 0.690881 0 0.7229685 -0.1769335 0 -0.9842228 0.8741379 0 -0.4856778 -0.9660729 0 -0.2582696 0.7224674 0 0.691405 -0.8830727 0 0.4692362 0.1097326 0 -0.9939611 -0.9989078 0 0.0467254 -0.7880847 0 -0.6155669 0.5609873 0 -0.8278244 -0.9990142 0 0.04439182 -0.7927444 0 -0.6095541 -0.4862411 0 0.8738247 0.9989096 0 -0.04668642 0.8417103 0 0.5399293 -0.6366334 0 0.7711666 0.998051 0 -0.06240341 0.7742069 0 0.6329326 -0.6800833 0 0.7331349 0.9970095 0 0.07727962 0.8165717 0 0.577244 0.9068682 0 0.4214144 -0.4743319 0 -0.8803461 0.7297503 0 -0.6837137 -0.4887952 0 0.8723986 0.9026267 0 -0.4304242 0.8588636 0 0.5122044 -0.1847388 0 0.9827877 0.6908777 0 -0.7229716 0.8846178 0 0.4663168 -0.8196077 0 0.5729251 0.9594218 0 -0.2819747 0.6392866 0 0.7689685 0.5858349 0 -0.8104304 -0.9429088 0 0.333051 -0.6147119 0 -0.7887517 -0.9971378 0 -0.07560582 0.03210341 0 0.9994846 -0.670272 0 0.7421155 0.8455858 0 0.5338395 0.7749825 0 -0.6319827 0.9690635 0 -0.2468115 0.06350151 0 -0.9979817 -0.8576053 0 0.5143084 -0.9002685 0 -0.4353351 0.5031954 0 0.8641727 0.2554142 0 -0.9668317 0.7322542 0 -0.6810314 -0.4995855 0 0.8662646 0.9346068 0 -0.3556826 0.8529903 0 0.5219267 0.5188852 0 -0.854844 -0.9465234 0 0.3226352 -0.8201632 0 -0.5721296 -0.9866852 0 -0.1626417 -0.3414795 0 0.9398892 -0.7961357 0 0.6051181 -0.04061992 0 0.9991747 0.9084193 0 -0.4180603 0.8156893 0 0.5784902 0.5408571 0 -0.8411145 -0.9338869 0 0.3575685 -0.8331757 0 -0.5530083 -0.7947045 0 0.6069966 0.9734248 0 -0.2290067 0.9326062 0 0.3608956 0.9991533 0 0.04114206 -0.7330895 0 -0.6801322 0.8574224 0 -0.5146134 0.8982909 0 0.4394013 -0.06330976 0 -0.9979939 0.8910436 0 -0.4539177 0.339375 0 0.9406512 0.8813932 0 -0.4723834 0.9210931 0 0.3893425 0.2963371 0 -0.9550834 -0.7870588 0 0.616878 -0.7271603 0 -0.6864677 -0.2233 0 0.9747498 0.871591 0 -0.4902338 0.8243804 0 0.5660362 0.2533204 0 0.9673824 0.8349494 0 -0.5503268 0.7960916 0 0.6051761 0.9594173 0 0.2819901 -0.8196101 0 -0.5729217 0.639346 0 -0.7689192 -0.9478079 0 0.318842 0.8511245 0 0.5249639 0.329021 0 0.9443226 0.9946159 0 0.1036304 -0.8293629 0 -0.5587103 0.4091169 0 -0.912482 -0.8569672 0 0.5153709 0.826456 0 0.5630013 0.3052921 0 0.9522587 0.5100546 0 0.860142 -0.2642431 0 -0.9644561 0.3975931 0 -0.9175618 -0.7041205 0 -0.7100805 0.1492665 0 0.988797 -0.6040994 0 0.796909 0.9964227 0 0.08450901 -0.05995552 0 -0.998201 0.7382325 0 -0.6745463 0.8566509 0 0.5158965 -0.330781 0 -0.9437076 0.9399442 0 -0.3413282 0.94232 0 -0.3347134 -0.9631059 0 -0.2691227 -0.5969439 0 -0.802283 -0.8047881 0 -0.5935622 -0.8262416 0 0.5633158 -0.9733416 0 -0.2293604 0.9726948 0 0.232088 -0.7938421 0 -0.6081239 0.9327353 0 -0.360562 -0.1432712 0 0.9896835 0.9991579 0 -0.04103015 0.8891941 0 0.4575301 -0.09661892 0 0.9953214 0.940809 0 -0.3389373 0.8715931 0 0.4902301 -0.8922309 0 -0.4515796 0.09054314 0 0.9958925 -0.7677414 0 0.6407598 -0.3872891 0 -0.9219583 -0.4318844 0 0.901929 -0.9480609 0 -0.3180889 0.9990286 0 0.04406599 -0.4862355 0 -0.8738278 0.8439506 0 -0.5364209 -0.5525513 0 0.8334789 0.9128867 0 -0.4082131 0.7642927 0 0.6448695 -0.1773406 0 0.9841495 0.9420273 0 -0.3355362 0.9195701 0 0.3929261 0.6462287 0 -0.7631438 -0.9640138 0 0.265852 -0.8603627 0 -0.5096822 0.4456913 0 -0.8951867 -0.9978883 0 0.06495302 -0.8520833 0 -0.5234062 -0.927397 0 0.3740785 0.91015 0 0.4142788 -0.4957721 0 0.8684527 0.9837621 0 0.1794773 -0.6771535 0 -0.7358418 0.9989213 0 -0.04643476 -0.997505 0 -0.07059624 0.4612227 0 0.8872844 -0.7027909 0 0.7113964 -0.841533 0 0.5402057 0.8156505 0 0.5785449 0.3513647 0 0.9362387 -0.661595 0 -0.7498614 -0.3474815 0 0.9376868 -0.9843315 0 -0.176328 -0.9987738 0 -0.04950693 0.1097235 0 0.9939621 -0.785335 0 0.6190711 -0.8771384 0 -0.4802378 0.2889699 0 0.9573382 -0.8349505 0 0.5503251 0.8794272 0 0.4760334 0.3393686 0 -0.9406535 0.9241273 0 -0.3820846 0.09053835 0 -0.995893 -0.8965218 0 0.4429995 -0.7583851 0 -0.6518068 -0.4171605 0 -0.9088328 -0.5987323 0 0.8009492 -0.9589666 0 0.283519 0.4706348 0 -0.8823281 -0.8752607 0 0.4836513 -0.8099854 0 -0.58645 0.8562463 0 -0.5165677 -0.9494756 0 -0.3138409 0.3393 0 -0.9406782 -0.5080475 0 0.861329 0.9951999 0 -0.09786323 0.6423402 0 0.7664197 -0.2642399 0 0.964457 0.5100355 0 -0.8601534 0.3975727 0 0.9175707 0.1405548 0 -0.9900729 -0.6995503 0 0.7145833 -0.6237141 0 -0.7816526 -0.8293609 0 0.5587132 0.9946139 0 -0.1036498 0.4091222 0 0.9124796 0.826459 0 -0.5629969 -0.856986 0 -0.5153396 0.3052827 0 -0.9522618 -0.787062 0 -0.6168739 0.2927138 0 0.9562001 -0.7172451 0 0.6968209 0.8761383 0 0.4820598 -0.2296137 0 -0.9732818 0.8202747 0 -0.5719698 -0.7532529 0 0.657731 0.9527116 0 -0.3038758 0.8591767 0 0.511679 -0.6000284 0 0.7999787 0.9554993 0 -0.2949933 -0.3794116 0 0.925228 0.8010732 0 -0.5985664 -0.986109 0 0.1660997 -0.6577239 0 -0.7532591 -0.7911731 0 -0.6115923 -0.8065264 0 0.5911981 -0.9664194 0 0.25697 -0.9621958 0 0.2723588 0.9392792 0 0.343154 -0.6334911 0 0.77375 0.7972781 0 -0.6036122 -0.9529845 0 -0.3030192 0.5309206 0 -0.8474216 -0.2192902 0 -0.9756597 -0.8384106 0 0.5450391 -0.8055102 0 -0.5925819 -0.7830945 0 0.6219027 0.9820875 0 -0.1884254 0.9104149 0 0.4136964 0.8000518 0 -0.599931 -0.9998454 0 0.01758234 -0.8636951 0 -0.5040147 -0.6391926 0 -0.7690467 -0.8508612 0 -0.5253906 -0.01046546 0 0.9999452 -0.1308168 0 0.9914066 0.9919956 0 -0.1262721 0.999573 0 -0.02922098 0.01015856 0 -0.9999484 0.004633194 0 -0.9999893 -0.9999974 0 0.002284492 -0.9971162 0 -0.0758895 0.9036716 0 0.4282261 0.9172918 0 0.3982157 0.9929823 0 -0.1182629 0.9997388 0 -0.02285405 0.09963713 0 -0.9950238 0.06225896 0 -0.99806 -0.7982385 0 0.6023415 -0.6246567 0 0.7808995 -0.126259 0 0.9919973 0.02218417 0 0.9997539 0.99978 0 -0.02097672 0.9989189 0 0.04648783 -0.5024115 0 -0.8646287 -0.7056355 0 -0.708575 0.9982315 0 0.05944673 0.9984898 0 0.05493775 -0.319666 0 -0.9475303 -0.3178426 0 -0.9481435 -0.4937463 0 0.869606 -0.6325329 0 0.7745335 -0.002155579 0 -0.9999977 0.3886506 0 -0.9213852 0.6190913 0 0.785319 0.6830344 0 0.7303862 0.6812932 0 -0.7320106 0.2356725 0 -0.9718325 -0.9927263 0 -0.1203932 -0.9998732 0 -0.0159269 0.5443287 0 0.838872 0.6932471 0 0.7207 0.807204 0 0.5902726 0.900002 0 0.4358858 0.01730485 0 -0.9998503 -0.4338343 0 -0.9009927 -0.9595056 0 0.2816897 -0.9988916 0 0.04707037 0.3008377 0 0.9536754 0.4087497 0 0.9126465 0.5663874 0 -0.8241391 0.05895695 0 -0.9982605 -0.9928111 0 -0.1196914 -0.9987645 0 -0.04969409 -0.2426205 0 -0.9701213 -0.3160296 0 -0.9487493 -0.3689503 0 0.9294491 -0.3652536 0 0.9309081 0.5623786 0 -0.8268799 0.4047072 0 -0.9144463 -0.9999698 0 -0.007769978 -0.9961728 0 0.08740516 0.692522 0 0.7213967 0.5004945 0 0.8657397 -0.6458381 0 -0.7634744 -0.05618195 0 -0.9984205 -0.9998213 0 -0.01890174 -0.9968602 0 0.0791816 0.9651879 0 0.2615575 0.9764564 0 0.2157148 0.9148163 0 -0.4038701 0.7499783 0 -0.6614625 -0.9999935 0 -0.003607016 -0.9990579 0 0.04339826 -0.1043678 0 0.9945388 -0.03821185 0 0.9992697 -0.9997511 0 -0.02230887 -0.9999986 0 -0.00167728 0.8771525 0 0.4802118 0.9608676 0 0.2770079 -0.09329035 0 -0.9956389 0.08808028 0 -0.9961134 -0.8288498 0 0.5594712 -0.8897137 0 0.456519 -0.8502857 0 0.5263214 -0.8201952 0 0.5720838 0.04673016 0 0.9989075 0.07660289 0 0.9970617 0.999971 0 -0.007615073 0.9700609 0 0.2428619 -0.2670817 0 -0.9636739 -0.4474468 0 -0.8943105 0.03675489 0 -0.9993243 0.01949782 0 -0.9998099 -0.9999998 0 6.92711e-4 -0.9977428 0 0.06715183 0.9264153 0 0.3765033 0.8834834 0 0.4684624 1 0 0 0.9945676 0 0.1040928 -0.1009314 0 -0.9948934 -0.04338412 0 -0.9990585 -0.8958435 0 0.4443696 -0.7592311 0 0.6508211 0.9999993 0 0.001154753 0.9954531 0 0.09525287 0.0524739 0 -0.9986223 -0.1094123 0 -0.9939965 -0.7877633 0 0.6159781 -0.8149967 0 0.5794656 -1 0 0 -0.9970086 0 -0.07729014 -0.1009232 0 0.9948942 -0.04213923 0 0.9991117 0.9128269 0 -0.4083466 0.8802811 0 -0.4744525 -0.9988528 0 0.04788622 -0.9952868 0 -0.09697531 0.04006836 0 0.9991969 -0.07426026 0 0.9972389 0.8279249 0 -0.5608389 0.8419662 0 -0.5395303 -0.9993103 0 -0.03713385 -0.9913894 0 -0.1309471 0 0 1 0.001441517 0 0.999999 0.9999899 0 0.004500483 0.9937562 0 -0.1115738 -0.03455314 0 0.9994029 -0.01692351 0 0.9998568 0.9941511 0 0.1079978 0.9911743 0 -0.1325649 -0.8776934 0 -0.4792226 -0.753946 0 -0.6569364 -0.9995817 0 0.02892137 -0.999864 0 -0.01649165 -0.09666922 0 0.9953166 0.2411183 0 0.9704957 0.7503086 0 -0.6610877 0.6607398 0 -0.7506151 -0.9179278 0 0.3967475 -0.9940704 0 0.1087388 -0.09831593 0 0.9951553 -0.06023688 0 0.9981841 0.4937429 0 -0.8696079 0.433117 0 -0.9013377 -0.9936343 0 0.112654 -0.9818208 0 0.1898103 0.01730429 0 0.9998503 -0.4338343 0 0.9009927 0.9368678 0 -0.3496838 0.9150792 0 -0.4032742 0.8513954 0 0.5245244 0.9992654 0 0.038324 0.1430772 0 -0.9897115 0.03759081 0 -0.9992932 -0.767843 0 0.6406381 -0.7824505 0 0.6227128 0.2140052 0 -0.9768325 0.1252584 0 -0.9921242 -0.9365489 0 0.350537 -0.9974233 0 0.07174146 0.3056795 0 0.9521345 0.5116419 0 0.8591988 -0.939102 0 0.3436385 -0.8539271 0 0.5203926 0.9999934 0 -0.003646776 0.9912639 0 0.1318935 -0.2566696 0 -0.9664992 -0.4172004 0 -0.9088145 -0.699112 0 0.7150122 -0.6305345 0 0.7761612 -0.4592831 0 0.8882899 -0.3537654 0 0.9353342 0.9995936 0 0.02850509 0.9927178 0 -0.1204629 -0.07577931 0 -0.9971246 -0.2599162 0 -0.9656312 -0.9994867 0 0.03203565 -0.9998957 0 -0.01443917 -0.06265728 0 0.9980351 0.1823759 0 0.9832289 0.6522983 0 -0.7579623 0.6261795 0 -0.7796789 -0.8823525 0 0.4705891 -0.8445269 0 0.5355131 0.2980049 0 -0.9545643 0.5570035 0 -0.8305101 -0.9999244 0 0.01229409 -0.9986857 0 0.05125276 -0.002155543 0 0.9999977 0.2082195 0 0.9780821 0.2793723 0 0.9601829 0.2005425 0 0.979685 0.5528004 0 -0.8333137 0.4684532 0 -0.8834883 -0.8723919 0 0.4888071 -0.8811838 0 0.4727739 -0.9477502 0 -0.3190133 -0.9786969 0 -0.2053104 -0.3861891 0 0.9224197 0.3989959 0 0.9169527 0.929055 0 -0.3699416 0.9656298 0 -0.2599214 -0.443941 0 0.896056 -0.157022 0 0.9875951 0.9993591 0 -0.0357978 0.9987653 0 0.04967789 -0.5129661 0 -0.8584088 -0.7068 0 -0.7074134 -1 0 0 -0.9970089 0 0.07728743 0.2727222 0 -0.9620928 0.1697618 0 -0.9854851 -0.6460986 0 0.7632539 -0.5367912 0 0.8437151 -0.9993041 0 -0.03729962 -0.9725065 0 0.2328759 0.9684634 0 0.249156 0.9890902 0 0.1473109 -0.8940721 0 -0.447923 -0.9247549 0 -0.3805631 0.4916133 0 0.8708136 0.697596 0 0.7164914 -0.9541727 0 -0.2992564 -0.9786687 0 -0.205445 0.1303399 0 0.9914694 0.2076038 0 0.978213 -0.3373283 0 -0.9413871 -0.3987382 0 -0.9170648 0.9968352 0 0.07949609 0.9999042 0 0.01384321 -0.5894083 0 -0.8078353 -0.5204673 0 -0.8538816 0.820191 0 0.5720898 0.8918405 0 0.4523501 -0.3720475 0 -0.9282137 0.484842 0 -0.8746017 0.9998562 0 -0.01695637 0.9980631 0 -0.06220914 0.9881999 0 -0.1531695 0.9664067 0 -0.2570177 0.7963786 0 0.6047984 0.7040732 0 0.7101274 0.01203427 0 0.9999276 0.02490606 0 0.9996898 0.002354134 0 0.9999972 0.005963738 0 0.9999822 -0.01257306 0 -0.999921 -0.02665516 0 -0.9996447 0.002288073 0 -0.9999974 -7.0555e-4 0 -0.9999998 -0.991667 0 0.128828 -0.983276 0 0.1821215 -0.002272755 0 -0.9999974 -0.005721521 0 -0.9999836 0 0 1 0 0 1 -0.9872171 0 -0.1593812 -0.9805524 0 -0.1962573 0.6937976 0 0.7201701 0.6912651 0 0.7226012 -0.007785374 0 0.9999697 -0.003304998 0 0.9999945 0.9586106 0 0.2847205 0.9369374 0 0.3494971 -0.001879612 0 0.9999982 -8.96816e-4 0 0.9999996 -0.9828928 0 0.1841785 -0.9995009 0 0.03158903 -0.04888958 0 -0.9988042 -0.07836596 0 -0.9969247 -0.9999918 0 0.004039975 -0.9996873 0 -0.02500703 0.5153221 0 0.8569966 0.7037399 0 0.7104577 -0.7463344 0 0.6655711 -0.7589798 0 0.6511142 0.9917022 0 0.1285564 0.9988828 0 -0.04725611 -0.6674662 0 0.7446401 -0.7309414 0 0.6824402 -0.2527727 0 0.9675257 -0.1667 0 0.9860077 0.4300854 0 -0.9027882 0.3448572 0 -0.9386552 -0.7732147 0 0.6341443 -0.5842116 0 0.8116014 0.986412 0 -0.1642902 0.9669748 0 -0.254872 -0.1309483 0 -0.9913892 -0.2170605 0 -0.9761582 -0.9999697 0 0.007788763 -0.9994006 0 -0.0346176 0.4254554 0 0.9049794 0.6112711 0 0.7914213 -0.9998406 0 0.01785691 -0.9948505 0 -0.1013531 -1 0 0 -0.9999361 0 0.01130799 0.5111218 0 -0.8595083 0.5837248 0 -0.8119516 -0.08155727 0 -0.9966687 0.3729432 0 -0.9278542 -0.9750963 0 0.2217818 -0.9723615 0 0.2334803 0.8887863 0 -0.4583219 0.8972929 0 -0.4414357 -0.9947697 0 -0.1021433 -0.9990601 0 -0.04334707 -0.6036055 0 0.7972831 -0.6593 0 0.75188 -0.9995961 0 -0.0284176 -0.9997169 0 -0.02379185 -0.3343318 0 -0.9424554 -0.4820994 0 -0.8761166 -0.9945333 0 -0.1044201 -0.9992276 0 -0.0392952</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape4-tangents-array" count="1185" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape4-binormals" name="qt_gauge_background_Shape4-binormals">
+ <float_array id="qt_gauge_background_Shape4-binormals-array" count="3555">-0.9999984 0 0.001804257 1 0 0 -4.25804e-4 0 1 -0.02889512 0 0.9995825 0.01204223 0 0.9999275 0.9999979 0 0.002065321 -0.007218961 0 -0.999974 1 0 0 0.9999982 0 -0.001974018 -0.9999958 0 -0.00291667 0.9994029 0 -0.03455327 -0.9988042 0 -0.04888941 0.9951557 0 -0.09831163 -0.991389 0 -0.1309502 0.1126469 0 -0.9936351 0.9870685 0 0.1602991 0.9675232 0 -0.2527822 -0.9351397 0 0.3542793 0.3436426 0 -0.9391006 0.7900752 0 0.6130099 0.6341372 0 -0.7732206 0.7150122 0 -0.699112 0.8882876 0 -0.4592876 0.9521349 0 0.3056784 -0.8988141 0 0.4383301 -0.9424555 0 -0.3343318 -0.1001717 0 -0.9949702 0.9977989 0 -0.06631393 -0.7690467 0 -0.6391926 0.1627632 0 -0.9866652 -0.3190176 0 -0.9477488 0.02633931 0 0.9996532 0.1502572 0 0.988647 0.8279297 0 0.5608318 -0.6610906 0 0.7503061 0.9999623 0 -0.008688861 -0.9999041 0 -0.01385394 0.1535451 0 0.9881417 0.7543961 0 -0.6564196 -0.9993244 0 0.03675476 0.9989076 0 0.04673032 -0.999963 0 0.008603295 0.9999363 0 0.01129575 0.9992648 0 0.0383393 0.8960568 0 -0.4439395 -0.9950238 0 0.09963864 0.9914695 0 0.1303392 -0.0364402 0 -0.9993359 0.07948811 0 0.9968359 0.9536727 0 0.3008461 0.4583219 0 0.8887863 0.9768325 0 0.2140052 -0.1285564 0 0.9917023 0.2491523 0 0.9684643 0.5902669 0 0.8072081 0.2816767 0 -0.9595095 0.8708068 0 0.4916255 -0.1196914 0 -0.9928111 -0.9620922 0 0.2727244 0.4705842 0 0.8823552 -0.7840562 0 -0.6206898 -0.1550355 0 0.9879089 -0.8268822 0 0.5623752 -0.8131993 0 -0.5819854 0.9511144 0 0.308839 -0.8025481 0 -0.5965875 -0.4038804 0 0.9148118 0.01600552 0 0.9998719 0.9997102 0 -0.02407529 -0.6922289 0 -0.7216781 0.2718125 0 0.9623502 0.9970617 0 0.07660318 -0.8881506 0 -0.4595524 0.1473099 0 0.9890904 0.9818715 0 0.189548 -0.3805571 0 -0.9247575 0.2636572 0 -0.9646165 -0.9934195 0 -0.1145329 0.6345556 0 0.7728773 -0.9899501 0 -0.1414171 0.2485635 0 0.9686157 0.9135389 0 -0.4067513 0.4358859 0 0.900002 0.04708051 0 -0.9988911 -0.9739797 0 0.2266355 0.7207056 0 0.6932413 0.9126451 0 0.4087529 -0.04967397 0 -0.9987655 -0.9982616 0 0.05893935 0.0159819 0 0.9998724 0.9995009 0 -0.03159029 -0.7626649 0 -0.6467938 0.4939786 0 0.8694742 -0.8711264 0 -0.4910589 0.02824772 0 0.999601 0.9978377 0 -0.06572749 0.9877256 0 -0.1561989 -0.8591816 0 -0.5116709 0.4787347 0 0.8779597 -0.2576152 0 0.9662476 0.9887714 0 0.1494362 -0.3239017 0 -0.9460908 0.9594653 0 0.2818267 -0.003314808 0 -0.9999945 -0.795799 0 0.605561 0.02151951 0 0.9997684 -0.9761571 0 -0.2170654 0.7906048 0 0.6123267 0.02428641 0 0.9997051 0.1898055 0 -0.9818218 -0.4032746 0 0.9150791 0.8116015 0 -0.5842115 -0.2548849 0 0.9669714 0.9860087 0 -0.1666941 -0.9386603 0 0.3448435 0.044514 0 -0.9990088 -0.8262916 0 0.5632426 0.4958438 0 -0.8684117 -0.9947479 0 0.1023555 -0.0351665 0 -0.9993815 -0.2039947 0 -0.9789721 0.6635866 0 -0.7480995 0.9998478 0 -0.01744852 0.9999928 0 -0.003820587 -0.9998271 0 0.01859483 -0.9999996 0 -9.20735e-4 0.1506961 0 0.9885802 -0.9999934 0 0.003645006 1 0 0 -0.1651882 0 0.9862621 0.7252391 0 -0.6884972 0.9999865 0 0.005192589 0.3118631 0 -0.9501271 0.9999989 0 0.001522046 0.1040862 0 0.9945683 -0.99806 0 0.06225896 -0.006902544 0 0.9999763 0.7877318 0 -0.6160183 0.6693236 0 0.7429711 0.03544458 0 -0.9993716 0.7145973 0 0.699536 0.9782147 0 0.2075961 -0.9170677 0 -0.3987317 0.7164914 0 0.697596 -0.2054741 0 -0.9786626 -0.9854845 0 0.1697652 -0.0105064 0 0.9999449 0.848604 0 -0.5290285 -0.02057096 0 0.9997885 0.009459659 0 0.9999553 -0.8311359 0 -0.5560695 -0.9987071 0 -0.05083703 0.2332459 0 0.9724179 -0.4631272 0 -0.8862919 -0.06705718 0 0.9977491 0.7796119 0 0.6262629 -0.02736552 0 0.9996256 -0.9144464 0 0.4047072 -0.04848908 0 0.9988238 -0.661463 0 0.7499778 0.9985747 0 0.05337383 -0.06867503 0 -0.9976391 -0.999975 0 -0.007083307 -0.02963396 0 0.9995609 0.3947181 0 -0.9188024 -0.06345449 0 -0.9979847 -0.9969246 0 -0.07836596 0.7093331 0 0.7048734 0.9952272 0 0.09758575 -0.01218121 0 -0.9999259 -0.7945876 0 0.6071496 0.05326904 0 -0.9985802 -0.9721048 0 0.234547 0.803265 0 0.5956219 -0.9909921 0 -0.1339202 0.7347007 0 -0.6783915 -0.9116412 0 -0.4109869 -0.09370922 0 0.9955996 0.7761511 0 -0.6305469 0.5203816 0 -0.8539339 -0.981873 0 0.1895403 0.1319113 0 0.9912615 0.9353359 0 -0.3537608 -0.9656384 0 -0.2598896 -0.1204882 0 0.9927149 -0.980001 0 0.1989929 0.916949 0 0.3990045 -0.8761181 0 -0.4820966 0.03459144 0 0.9994016 0.8067967 0 -0.5908293 -0.9100619 0 0.4144723 0.01193359 0 0.9999288 0.2599089 0 -0.9656332 -0.5253927 0 -0.8508599 0.01207775 0 0.9999272 0.9879802 0 0.1545808 -0.02320512 0 0.9997308 0.3747179 0 -0.9271389 -0.9985744 0 0.0533772 0.5222095 0 0.8528173 0.5452 0 0.838306 0.9981842 0 -0.06023689 0.08929874 0 -0.9960049 -0.9241631 0 0.3819982 -0.9996334 0 -0.0270762 0.02206684 0 0.9997566 0.4301648 0 -0.9027505 0.03158602 0 -0.999501 -0.9991438 0 0.04137138 0.5634782 0 0.8261309 0.03485506 0 -0.9993924 -0.9999956 0 0.002989997 0.5603802 0 0.8282356 -0.02151513 0 0.9997686 0.9991616 0 0.04093997 -0.4496586 0 -0.8932006 -0.006921388 0 0.999976 0.9999979 0 0.002106725 -0.5483043 0 -0.8362789 -0.1169722 0 0.9931353 0.9999997 0 -7.54644e-4 -0.04344077 0 -0.9990561 0.999696 0 0.0246575 0.004323706 0 -0.9999907 -0.5846237 0 0.8113047 0.5771945 0 0.8166068 -0.2043439 0 0.9788992 -0.9568267 0 -0.2906588 0.2018499 0 -0.9794165 -0.960126 0 -0.2795677 -0.5217524 0 0.853097 -0.5562467 0 0.8310173 -0.4145174 0 -0.9100415 -0.8817958 0 -0.4716314 -0.9918259 0 -0.1275983 -0.6452593 0 0.7639636 -0.0941901 0 0.9955543 -0.578669 0 0.8155625 -0.1067467 0 0.9942862 -0.8966633 0 -0.4427134 -0.896733 0 -0.4425721 0.7321358 0 -0.6811587 -0.2413646 0 0.9704345 -0.9215641 0 -0.3882263 -0.7716722 0 -0.6360205 0.8078496 0 0.5893887 0.7698156 0 0.6382664 0.3886711 0 0.9213766 0.4160437 0 -0.9093446 0.9174764 0 0.3977903 0.9801794 0 0.1981122 0.5862041 0 0.8101634 -0.8083391 0 -0.5887172 -0.2701973 0 0.962805 0.4145516 0 -0.9100258 -0.9661788 0 -0.2578731 0.881806 0 -0.4716123 0.8876397 0 0.4605387 -0.8429491 0 -0.5379934 -0.5116183 0 0.8592129 0.9744754 0 0.2244942 -0.8423207 0 -0.5389767 0.5938467 0 0.8045782 0.1313764 0 -0.9913326 0.4146333 0 -0.9099886 0.9841516 0 -0.1773293 -0.9614292 0 -0.2750528 0.9886705 0 0.1501024 0.9982878 0 -0.05849379 0.2575783 0 -0.9662575 0.1551976 0 0.9878834 0.07982805 0 -0.9968087 0.4224881 0 0.9063686 0.7925516 0 -0.6098049 -0.7403055 0 0.6722706 0.2405693 0 -0.9706321 0.5466842 0 -0.8373389 -0.1658218 0 -0.9861557 -0.6017803 0 0.7986617 0.1798992 0 -0.9836851 0.8686311 0 0.4954593 0.9614318 0 0.2750434 -0.4911299 0 0.8710864 -0.876888 0 0.4806948 0.1510029 0 -0.9885333 0.8494265 0 0.527707 0.8916782 0 0.4526699 -0.7527177 0 -0.6583435 -0.5669736 0 -0.8237361 0.3530119 0 0.9356189 0.1785439 0 -0.983932 -0.2457327 0 0.9693377 0.3041359 0 0.9526287 -0.567835 0 0.8231425 -0.1978881 0 0.9802246 -0.4358616 0 0.9000138 0.4758339 0 -0.8795352 -0.9498049 0 -0.3128432 -0.9762098 0 0.2168283 -0.893074 0 -0.4499098 -0.5047849 0 -0.8632452 0.8521682 0 0.523268 0.9788032 0 0.2048035 -0.9948758 0 -0.1011053 0.4997978 0 0.8661422 -0.5089993 0 -0.8607669 -0.5507843 0 0.8346477 0.499884 0 -0.8660924 0.7295387 0 0.6839395 0.7789342 0 0.6271058 -0.5342711 0 -0.8453133 -0.9694342 0 0.2453517 0.3083305 0 0.9512794 -0.6475602 0 -0.7620143 -0.9945377 0 0.1043785 0.6081098 0 0.7938529 -0.6086421 0 -0.7934449 0.7380171 0 -0.6747819 -0.9707077 0 -0.2402639 0.04806923 0 0.998844 0.9127371 0 0.4085473 0.05791484 0 -0.9983215 -0.4568278 0 0.8895552 -0.05358856 0 0.9985631 0.9994062 0 0.03445925 -0.6606022 0 -0.7507362 -0.9439596 0 -0.330061 0.04415209 0 0.9990249 0.8040309 0 -0.5945875 -0.1262081 0 0.9920038 0.9848089 0 -0.1736419 -0.6886983 0 -0.7250481 0.9559313 0 0.2935906 0.1579018 0 -0.9874549 -0.8154524 0 0.5788242 0.8905321 0 0.4549204 0.242688 0 -0.9701044 -0.849647 0 0.5273518 -0.5086845 0 0.8609531 0.9941561 0 0.1079531 0.03163419 0 -0.9994996 -0.9306386 0 0.3659397 0.9780032 0 0.2085899 0.2878027 0 -0.9576898 -0.1505599 0 0.988601 0.987736 0 -0.156134 -0.8418203 0 -0.5397578 0.8542542 0 0.5198556 0.1027363 0 -0.9947087 -0.93536 0 0.3536976 0.9661507 0 -0.2579786 -0.04326004 0 -0.9990638 -0.3698691 0 0.9290839 0.4079508 0 0.913004 0.1183313 0 -0.9929742 -0.9988132 0 -0.04870491 0.9049178 0 0.4255865 -0.014812 0 -0.9998904 -0.4712966 0 0.8819748 -0.09216017 0 0.9957442 0.9906911 0 -0.1361295 -0.4411025 0 -0.8974568 -0.03278729 0 0.9994624 0.9930246 0 -0.1179084 -0.4435596 0 -0.8962449 -0.988649 0 -0.1502437 -0.3351523 0 0.942164 0.9281815 0 -0.3721278 0.9709203 0 0.2394028 0.04176873 0 -0.9991274 -0.4766759 0 0.8790792 -0.1487275 0 0.9888783 0.997988 0 -0.06340367 -0.4664307 0 -0.8845578 -0.134188 0 0.9909559 0.9882461 0 0.1528712 -0.4406955 0 -0.8976567 0.1044454 0 -0.9945306 -0.9973231 0 -0.0731217 0.3795886 0 0.9251555 0.09675968 0 -0.9953078 -0.9874615 0 -0.1578603 0.4641314 0 0.8857664 0.2288475 0 -0.9734623 -0.9994034 0 -0.03453845 0.00878189 0 0.9999614 -0.9890587 0 -0.1475231 -0.1003479 0 0.9949525 0.6727157 0 -0.7399011 0.08506355 0 -0.9963756 -0.9987166 0 -0.0506493 0.6395977 0 0.7687098 -0.2414468 0 -0.970414 -0.999034 0 -0.04394449 0.8620589 0 0.5068082 0.001971207 0 -0.9999982 -0.8690946 0 -0.494646 0.3738563 0 0.9274867 -0.2781226 0 0.9605456 0.9600241 0 0.2799177 -0.5794699 0 -0.8149937 0.9653881 0 0.2608176 -0.1958992 0 -0.980624 -0.9165685 0 0.3998777 -0.3951914 0 -0.9185988 -0.08392828 0 0.9964719 0.8747316 0 0.4846077 -0.003323278 0 0.9999945 0.9901632 0 -0.1399173 -0.6934097 0 -0.7205435 -0.8483405 0 -0.5294511 -0.2116189 0 0.9773523 0.9977247 0 0.06741978 0.08359295 0 -0.9965 -0.9977618 0 -0.06686871 0.6453392 0 0.7638962 -0.08939173 0 0.9959966 0.9993013 0 0.03737868 -0.4913922 0 -0.8709385 0.8110869 0 0.5849257 -0.09135718 0 -0.9958182 -0.999065 0 -0.04323381 0.1071365 0 -0.9942443 -0.9911128 0 0.1330243 0.7548411 0 0.6559077 -0.08208705 0 0.9966252 0.9997675 0 0.02156536 -0.4957802 0 -0.868448 0.214288 0 -0.9767706 -0.9433625 0 -0.3317642 0.3050218 0 0.9523454 -0.9909851 0 -0.1339728 0.05687106 0 0.9983816 0.4354547 0 -0.9002107 -0.882072 0 -0.4711145 -0.09716415 0 0.9952683 0.8446122 0 -0.5353786 0.05215753 0 -0.9986389 -0.7559109 0 0.6546745 0.7601697 0 0.6497246 -0.07156469 0 0.997436 0.988119 0 0.1536911 -0.7634224 0 -0.6458995 0.07362523 0 -0.997286 -0.8774824 0 0.479609 0.8013926 0 0.5981388 0.1038675 0 -0.9945912 -0.9435284 0 0.3312917 0.7769017 0 0.6296219 -0.9264749 0 0.3763566 -0.1761581 0 0.9843619 0.4421488 0 -0.8969418 0.7618676 0 -0.6477329 -0.8959262 0 -0.4442029 -0.3819702 0 0.9241747 -0.8689809 0 0.4948456 0.03905671 0 0.999237 0.3206138 0 -0.9472101 0.7593265 0 -0.6507098 -0.9684902 0 -0.2490517 -0.2525545 0 0.9675827 -0.9993878 0 0.03498748 -0.3827536 0 0.9238505 0.9442001 0 -0.3293724 0.9362136 0 0.3514317 0.3004214 0 -0.9538066 -0.9382077 0 0.3460727 -0.9665908 0 -0.2563247 0.07418317 0 0.9972447 0.8719075 0 -0.4896706 -0.8274757 0 -0.5615017 -0.1910001 0 0.9815901 0.8487735 0 -0.5287566 -0.5501132 0 0.8350901 0.9673024 0 0.2536259 0.2097138 0 -0.9777628 0.04460835 0 0.9990045 0.4760493 0 -0.8794186 -0.9171377 0 0.3985704 -0.8335429 0 -0.5524548 0.03644244 0 0.9993358 0.3371881 0 -0.9414373 0.1300451 0 -0.9915081 -0.995437 0 0.09542183 0.3530377 0 0.9356091 0.1095033 0 -0.9939865 -0.96733 0 0.2535204 0.5555518 0 0.8314821 0.9805807 0 0.1961161 0.1584286 0 -0.9873705 -0.7584377 0 0.6517456 0.2215808 0 0.9751421 0.7475346 0 -0.6642229 -0.9457367 0 0.324934 -0.9771036 0 -0.2127643 0.06866044 0 0.9976402 0.5331184 0 -0.8460406 0.1566702 0 -0.9876511 -0.9937385 0 -0.1117313 0.6030222 0 0.7977245 -0.02689243 0 -0.9996384 -0.996506 0 0.08352119 0.5372065 0 0.8434508 -0.1276558 0 0.9918185 0.9849197 0 0.1730126 -0.4345176 0 -0.9006633 -0.1696178 0 0.9855099 0.9996449 0 0.02665217 -0.1422871 0 -0.9898255 0.9946357 0 -0.1034403 -0.5131807 0 -0.8582806 0.09791612 0 0.9951947 -0.9974906 0 -0.07080001 -0.1340051 0 0.9909806 0.2207578 0 -0.9753287 0.9848735 0 0.1732752 -0.1034377 0 -0.9946359 -0.732375 0 0.6809015 0.7793756 0 -0.6265571 -0.9731773 0 -0.2300566 -0.3607058 0 0.9326797 -0.1726136 0 0.9849896 0.3827503 0 -0.9238518 -0.9996997 0 -0.02450617 0.9741696 0 0.2258182 -0.08727895 0 -0.9961839 -0.7254949 0 0.6882275 0.9710501 0 0.2388763 0.1182114 0 -0.9929885 -0.8135767 0 0.5814577 -0.7113961 0 -0.7027913 -0.1219752 0 0.9925333 0.8432018 0 -0.5375972 -0.0806815 0 0.99674 0.9885172 0 -0.151109 -0.6555652 0 -0.7551386 0.5848624 0 0.8111326 0.2684782 0 -0.9632858 -0.8946555 0 -0.4467569 -0.04906603 0 0.9987956 0.9996331 0 -0.02708905 -0.6775312 0 -0.735494 -0.9291835 0 0.3696187 0.653675 0 0.7567754 -0.3087324 0 -0.9511489 0.1055177 0 -0.9944174 -0.9823165 0 -0.1872286 0.5523689 0 0.8335997 0.206274 0 -0.9784943 -0.9847726 0 -0.1738479 0.907896 0 0.4191958 -0.101323 0 0.9948536 0.9575158 0 -0.288381 -0.9196131 0 -0.3928254 0.3280644 0 -0.9446554 -0.710039 0 -0.7041624 0.1954036 0 0.9807229 -0.9719931 0 0.2350095 0.7301629 0 0.6832731 -0.14192 0 -0.9898781 0.9972644 0 0.073917 0.1710759 0 -0.9852579 -0.8689747 0 0.4948564 -0.8003671 0 -0.5995103 -0.1033227 0 0.9946479 0.8390145 0 -0.5441091 0.07686059 0 -0.9970419 -0.9798235 0 -0.1998654 0.4811641 0 0.8766305 0.07180295 0 -0.9974189 -0.8198613 0 -0.5725622 0.7702549 0 0.6377363 -0.1910882 0 0.9815729 0.9151925 0 0.4030168 -0.2477616 0 -0.9688211 0.4275997 0 0.9039682 0.1427929 0 -0.9897527 -0.745931 0 -0.6660233 0.9459494 0 -0.3243144 -0.4150055 0 -0.9098189 0.1639802 0 0.9864637 -0.8323467 0 -0.5542553 0.7400168 0 0.6725885 0.04912842 0 -0.9987925 -0.142782 0 0.9897543 0.9221464 0 -0.3868414 -0.8642819 0 -0.5030078 0.08694488 0 -0.9962131 -0.9017737 0 -0.4322085 0.3797942 0 0.9250711 -0.1212045 0 0.9926276 0.9438893 0 0.3302621 -0.2194384 0 -0.9756263 0.6287532 0 0.7776049 0.04083928 0 -0.9991658 0.8975518 0 -0.4409093 -0.2094208 0 0.9778256 0.9662595 0 -0.2575706 0.2592856 0 0.9658008 -0.9557833 0 -0.2940719 0.4802342 0 0.8771403 -0.539345 0 0.8420849 0.07203967 0 -0.9974018 -0.9968294 0 0.07956929 -0.5496954 0 -0.8353652 -0.996186 0 -0.08725668 0.3554059 0 0.9347121 -0.5526538 0 0.8334109 -0.4865185 0 0.8736704 0.9996069 0 -0.02803697 0.4866107 0 0.8736189 -0.5051208 0 0.8630487 0.9983422 0 -0.05755868 0.4507518 0 0.8926495 -0.5338682 0 -0.8455677 -0.2696347 0 0.9629627 -0.6441973 0 0.7648594 -0.8641784 0 -0.5031856 -0.5732645 0 0.8193703 -0.9579169 0 0.2870461 -0.9996305 0 -0.0271856 0.547092 0 0.8370726 -0.647421 0 0.7621326 -0.5450391 0 0.8384107 0.9767122 0 0.2145535 0.5951301 0 0.8036295 -0.02004815 0 0.9997991 0.9570737 0 -0.2898449 0.6551632 0 0.7554874 -0.6287829 0 0.7775809 0.9945282 0 0.1044695 0.2117692 0 0.9773197 -0.0249275 0 0.9996893 0.9777124 0 -0.2099489 0.4079632 0 0.9129984 -0.979441 0 -0.2017308 0.07617267 0 0.9970946 -0.5033942 0 0.8640569 -0.9892714 0 -0.1460894 0.06767092 0 0.9977077 -0.4826442 0 0.8758166 0.7229685 0 -0.690881 -0.9842228 0 0.1769335 -0.4856778 0 -0.8741379 -0.2582696 0 0.9660729 0.6914049 0 -0.7224674 0.4692363 0 0.8830727 -0.9939612 0 -0.1097326 0.0467254 0 0.9989079 -0.6155668 0 0.7880847 -0.8278244 0 -0.5609874 0.04439182 0 0.9990142 -0.6095542 0 0.7927445 0.8738247 0 0.4862411 -0.04668642 0 -0.9989096 0.5399293 0 -0.8417104 0.7711666 0 0.6366334 -0.06240341 0 -0.998051 0.6329325 0 -0.7742069 0.7331349 0 0.6800833 0.07727962 0 -0.9970095 0.577244 0 -0.8165717 0.4214144 0 -0.9068682 -0.8803462 0 0.4743319 -0.6837137 0 -0.7297503 0.8723986 0 0.4887952 -0.4304242 0 -0.9026268 0.5122044 0 -0.8588637 0.9827877 0 0.1847388 -0.7229716 0 -0.6908777 0.4663168 0 -0.8846179 0.5729252 0 0.8196077 -0.2819747 0 -0.9594219 0.7689685 0 -0.6392866 -0.8104304 0 -0.5858349 0.333051 0 0.9429088 -0.7887517 0 0.6147119 -0.07560582 0 0.9971378 0.9994847 0 -0.03210342 0.7421155 0 0.6702721 0.5338395 0 -0.8455858 -0.6319827 0 -0.7749826 -0.2468115 0 -0.9690635 -0.9979818 0 -0.06350152 0.5143084 0 0.8576053 -0.4353351 0 0.9002685 0.8641728 0 -0.5031954 -0.9668318 0 -0.2554142 -0.6810314 0 -0.7322542 0.8662646 0 0.4995855 -0.3556826 0 -0.9346069 0.5219267 0 -0.8529903 -0.854844 0 -0.5188852 0.3226352 0 0.9465234 -0.5721297 0 0.8201632 -0.1626417 0 0.9866852 0.9398893 0 0.3414795 0.6051181 0 0.7961357 0.9991747 0 0.04061992 -0.4180603 0 -0.9084193 0.5784903 0 -0.8156893 -0.8411146 0 -0.5408571 0.3575685 0 0.933887 -0.5530083 0 0.8331758 0.6069966 0 0.7947046 -0.2290067 0 -0.9734249 0.3608956 0 -0.9326063 0.04114206 0 -0.9991533 -0.6801322 0 0.7330895 -0.5146134 0 -0.8574224 0.4394013 0 -0.8982909 -0.9979939 0 0.06330976 -0.4539177 0 -0.8910436 0.9406512 0 -0.339375 -0.4723834 0 -0.8813933 0.3893425 0 -0.9210932 -0.9550835 0 -0.2963371 0.616878 0 0.7870588 -0.6864677 0 0.7271603 0.9747498 0 0.2233 -0.4902338 0 -0.871591 0.5660362 0 -0.8243804 0.9673824 0 -0.2533204 -0.5503268 0 -0.8349494 0.6051761 0 -0.7960916 0.2819902 0 -0.9594174 -0.5729217 0 0.8196101 -0.7689192 0 -0.639346 0.318842 0 0.9478079 0.5249639 0 -0.8511245 0.9443227 0 -0.329021 0.1036304 0 -0.9946159 -0.5587103 0 0.8293629 -0.912482 0 -0.4091169 0.5153709 0 0.8569672 0.5630013 0 -0.826456 0.9522588 0 -0.3052922 0.8601421 0 -0.5100546 -0.9644562 0 0.2642431 -0.9175618 0 -0.3975931 -0.7100805 0 0.7041205 0.988797 0 -0.1492665 0.796909 0 0.6040994 0.08450901 0 -0.9964227 -0.9982011 0 0.05995552 -0.6745464 0 -0.7382325 0.5158965 0 -0.856651 -0.9437076 0 0.330781 -0.3413282 0 -0.9399442 -0.3347134 0 -0.94232 -0.2691227 0 0.9631059 -0.8022831 0 0.5969439 -0.5935622 0 0.8047881 0.5633159 0 0.8262417 -0.2293604 0 0.9733416 0.232088 0 -0.9726949 -0.608124 0 0.7938421 -0.360562 0 -0.9327353 0.9896834 0 0.1432712 -0.04103015 0 -0.999158 0.4575301 0 -0.8891941 0.9953215 0 0.09661892 -0.3389373 0 -0.9408091 0.4902301 0 -0.8715931 -0.4515796 0 0.8922309 0.9958925 0 -0.09054314 0.6407598 0 0.7677414 -0.9219583 0 0.3872891 0.901929 0 0.4318844 -0.3180889 0 0.9480609 0.04406599 0 -0.9990286 -0.8738278 0 0.4862356 -0.5364209 0 -0.8439506 0.8334789 0 0.5525513 -0.4082131 0 -0.9128867 0.6448695 0 -0.7642927 0.9841496 0 0.1773406 -0.3355362 0 -0.9420274 0.3929261 0 -0.9195701 -0.7631438 0 -0.6462287 0.265852 0 0.9640139 -0.5096822 0 0.8603628 -0.8951867 0 -0.4456913 0.06495302 0 0.9978883 -0.5234062 0 0.8520834 0.3740785 0 0.927397 0.4142788 0 -0.9101501 0.8684527 0 0.4957721 0.1794773 0 -0.9837622 -0.7358418 0 0.6771535 -0.04643476 0 -0.9989214 -0.07059626 0 0.9975051 0.8872844 0 -0.4612227 0.7113965 0 0.7027909 0.5402057 0 0.8415331 0.5785449 0 -0.8156505 0.9362388 0 -0.3513647 -0.7498614 0 0.661595 0.9376869 0 0.3474815 -0.176328 0 0.9843315 -0.04950694 0 0.9987739 0.9939622 0 -0.1097235 0.6190711 0 0.7853351 -0.4802378 0 0.8771384 0.9573383 0 -0.28897 0.5503251 0 0.8349506 0.4760334 0 -0.8794272 -0.9406536 0 -0.3393686 -0.3820846 0 -0.9241274 -0.9958931 0 -0.09053836 0.4429996 0 0.8965219 -0.6518068 0 0.7583851 -0.9088329 0 0.4171605 0.8009492 0 0.5987323 0.283519 0 0.9589666 -0.8823281 0 -0.4706348 0.4836514 0 0.8752608 -0.58645 0 0.8099855 -0.5165677 0 -0.8562464 -0.3138409 0 0.9494756 -0.9406783 0 -0.3393001 0.8613291 0 0.5080475 -0.09786323 0 -0.9951999 0.7664197 0 -0.6423402 0.964457 0 0.2642399 -0.8601534 0 -0.5100355 0.9175707 0 -0.3975727 -0.990073 0 -0.1405548 0.7145833 0 0.6995503 -0.7816526 0 0.6237141 0.5587132 0 0.829361 -0.1036498 0 -0.9946139 0.9124796 0 -0.4091221 -0.5629969 0 -0.826459 -0.5153397 0 0.856986 -0.9522618 0 -0.3052827 -0.6168739 0 0.787062 0.9562002 0 -0.2927139 0.6968209 0 0.7172451 0.4820598 0 -0.8761383 -0.9732819 0 0.2296138 -0.5719699 0 -0.8202748 0.6577311 0 0.7532529 -0.3038758 0 -0.9527116 0.511679 0 -0.8591767 0.7999788 0 0.6000283 -0.2949933 0 -0.9554994 0.9252281 0 0.3794116 -0.5985664 0 -0.8010733 0.1660997 0 0.9861091 -0.7532592 0 0.657724 -0.6115923 0 0.7911731 0.5911981 0 0.8065265 0.25697 0 0.9664194 0.2723588 0 0.9621958 0.343154 0 -0.9392792 0.7737501 0 0.6334911 -0.6036122 0 -0.7972781 -0.3030192 0 0.9529845 -0.8474216 0 -0.5309206 -0.9756597 0 0.2192902 0.5450391 0 0.8384107 -0.5925819 0 0.8055102 0.6219028 0 0.7830945 -0.1884254 0 -0.9820876 0.4136964 0 -0.910415 -0.599931 0 -0.8000519 0.01758234 0 0.9998454 -0.5040147 0 0.8636951 -0.7690468 0 0.6391926 -0.5253906 0 0.8508612 0.9999453 0 0.01046546 0.9914066 0 0.1308168 -0.1262721 0 -0.9919956 -0.02922099 0 -0.9995731 -0.9999484 0 -0.01015856 -0.9999893 0 -0.004633193 0.002284492 0 0.9999974 -0.0758895 0 0.9971162 0.4282261 0 -0.9036717 0.3982157 0 -0.9172918 -0.1182629 0 -0.9929824 -0.02285405 0 -0.9997388 -0.9950238 0 -0.09963713 -0.99806 0 -0.06225896 0.6023415 0 0.7982385 0.7808995 0 0.6246567 0.9919974 0 0.126259 0.9997539 0 -0.02218417 -0.02097672 0 -0.9997801 0.04648783 0 -0.9989189 -0.8646287 0 0.5024115 -0.708575 0 0.7056355 0.05944674 0 -0.9982316 0.05493775 0 -0.9984899 -0.9475303 0 0.319666 -0.9481435 0 0.3178426 0.869606 0 0.4937463 0.7745336 0 0.6325329 -0.9999977 0 0.002155579 -0.9213853 0 -0.3886506 0.785319 0 -0.6190913 0.7303862 0 -0.6830344 -0.7320107 0 -0.6812932 -0.9718326 0 -0.2356725 -0.1203932 0 0.9927263 -0.0159269 0 0.9998732 0.838872 0 -0.5443287 0.7207 0 -0.6932471 0.5902725 0 -0.8072041 0.4358858 0 -0.900002 -0.9998503 0 -0.01730485 -0.9009928 0 0.4338343 0.2816897 0 0.9595056 0.04707037 0 0.9988916 0.9536754 0 -0.3008377 0.9126466 0 -0.4087497 -0.8241392 0 -0.5663874 -0.9982606 0 -0.05895696 -0.1196914 0 0.9928111 -0.04969409 0 0.9987645 -0.9701213 0 0.2426205 -0.9487494 0 0.3160296 0.9294492 0 0.3689504 0.9309081 0 0.3652536 -0.8268799 0 -0.5623786 -0.9144464 0 -0.4047072 -0.007769978 0 0.9999698 0.08740516 0 0.9961728 0.7213967 0 -0.692522 0.8657398 0 -0.5004945 -0.7634744 0 0.6458381 -0.9984205 0 0.05618195 -0.01890174 0 0.9998214 0.0791816 0 0.9968602 0.2615575 0 -0.9651879 0.2157148 0 -0.9764565 -0.4038701 0 -0.9148163 -0.6614625 0 -0.7499782 -0.003607016 0 0.9999935 0.04339826 0 0.9990579 0.9945388 0 0.1043678 0.9992697 0 0.03821186 -0.02230887 0 0.9997512 -0.00167728 0 0.9999986 0.4802118 0 -0.8771526 0.2770079 0 -0.9608676 -0.995639 0 0.09329035 -0.9961135 0 -0.08808029 0.5594712 0 0.8288498 0.456519 0 0.8897136 0.5263214 0 0.8502858 0.5720838 0 0.8201952 0.9989076 0 -0.04673016 0.9970617 0 -0.07660288 -0.007615073 0 -0.999971 0.2428619 0 -0.9700609 -0.9636739 0 0.2670817 -0.8943105 0 0.4474468 -0.9993244 0 -0.03675489 -0.9998099 0 -0.01949782 6.92711e-4 0 0.9999998 0.06715183 0 0.9977428 0.3765033 0 -0.9264153 0.4684624 0 -0.8834834 0 0 -1 0.1040928 0 -0.9945677 -0.9948935 0 0.1009314 -0.9990585 0 0.04338412 0.4443696 0 0.8958436 0.6508211 0 0.7592312 0.001154753 0 -0.9999993 0.09525288 0 -0.9954532 -0.9986223 0 -0.0524739 -0.9939964 0 0.1094123 0.6159781 0 0.7877634 0.5794656 0 0.8149967 0 0 1 -0.07729014 0 0.9970087 0.9948943 0 0.1009232 0.9991118 0 0.04213922 -0.4083467 0 -0.912827 -0.4744526 0 -0.8802812 0.04788622 0 0.9988528 -0.09697533 0 0.9952869 0.9991969 0 -0.04006837 0.997239 0 0.07426026 -0.5608389 0 -0.8279249 -0.5395303 0 -0.8419662 -0.03713385 0 0.9993103 -0.1309471 0 0.9913895 1 0 0 0.999999 0 -0.001441517 0.004500484 0 -0.9999899 -0.1115738 0 -0.9937562 0.9994029 0 0.03455314 0.9998569 0 0.01692351 0.1079978 0 -0.9941511 -0.1325649 0 -0.9911743 -0.4792226 0 0.8776934 -0.6569364 0 0.753946 0.02892137 0 0.9995817 -0.01649166 0 0.999864 0.9953166 0 0.09666923 0.9704958 0 -0.2411184 -0.6610878 0 -0.7503087 -0.7506151 0 -0.6607398 0.3967475 0 0.9179278 0.1087388 0 0.9940704 0.9951553 0 0.09831592 0.9981842 0 0.06023689 -0.869608 0 -0.4937429 -0.9013377 0 -0.433117 0.112654 0 0.9936343 0.1898103 0 0.9818208 0.9998503 0 -0.01730429 0.9009927 0 0.4338343 -0.3496839 0 -0.9368678 -0.4032742 0 -0.9150792 0.5245244 0 -0.8513955 0.038324 0 -0.9992654 -0.9897116 0 -0.1430772 -0.9992933 0 -0.03759081 0.6406381 0 0.7678429 0.6227129 0 0.7824505 -0.9768325 0 -0.2140052 -0.9921242 0 -0.1252584 0.350537 0 0.9365489 0.07174145 0 0.9974233 0.9521345 0 -0.3056795 0.8591988 0 -0.5116419 0.3436385 0 0.939102 0.5203927 0 0.8539271 -0.003646776 0 -0.9999934 0.1318935 0 -0.9912639 -0.9664992 0 0.2566696 -0.9088145 0 0.4172004 0.7150122 0 0.699112 0.7761612 0 0.6305345 0.8882899 0 0.4592831 0.9353343 0 0.3537654 0.02850509 0 -0.9995937 -0.1204629 0 -0.9927179 -0.9971247 0 0.07577931 -0.9656312 0 0.2599162 0.03203565 0 0.9994868 -0.01443917 0 0.9998958 0.9980352 0 0.06265728 0.983229 0 -0.1823759 -0.7579623 0 -0.6522983 -0.779679 0 -0.6261796 0.4705891 0 0.8823525 0.5355132 0 0.844527 -0.9545643 0 -0.2980049 -0.8305102 0 -0.5570035 0.01229409 0 0.9999244 0.05125276 0 0.9986857 0.9999977 0 0.002155543 0.9780822 0 -0.2082195 0.9601829 0 -0.2793723 0.979685 0 -0.2005425 -0.8333137 0 -0.5528004 -0.8834884 0 -0.4684532 0.4888071 0 0.8723919 0.472774 0 0.8811839 -0.3190133 0 0.9477503 -0.2053104 0 0.9786969 0.9224197 0 0.386189 0.9169528 0 -0.3989959 -0.3699416 0 -0.929055 -0.2599214 0 -0.9656298 0.8960561 0 0.4439411 0.9875951 0 0.157022 -0.0357978 0 -0.9993591 0.04967789 0 -0.9987653 -0.8584089 0 0.5129662 -0.7074134 0 0.7068 0 0 1 0.07728743 0 0.9970089 -0.9620928 0 -0.2727222 -0.9854851 0 -0.1697618 0.763254 0 0.6460986 0.8437151 0 0.5367913 -0.03729962 0 0.9993041 0.2328759 0 0.9725065 0.249156 0 -0.9684634 0.1473109 0 -0.9890903 -0.4479231 0 0.8940722 -0.3805631 0 0.924755 0.8708137 0 -0.4916133 0.7164914 0 -0.697596 -0.2992564 0 0.9541728 -0.2054451 0 0.9786687 0.9914694 0 -0.1303399 0.978213 0 -0.2076038 -0.9413872 0 0.3373283 -0.9170648 0 0.3987382 0.07949609 0 -0.9968352 0.01384321 0 -0.9999043 -0.8078353 0 0.5894083 -0.8538817 0 0.5204673 0.5720898 0 -0.820191 0.4523501 0 -0.8918405 -0.9282138 0 0.3720475 -0.8746018 0 -0.4848421 -0.01695637 0 -0.9998563 -0.06220914 0 -0.9980632 -0.1531695 0 -0.9881999 -0.2570176 0 -0.9664067 0.6047984 0 -0.7963786 0.7101274 0 -0.7040732 0.9999276 0 -0.01203427 0.9996898 0 -0.02490606 0.9999973 0 -0.002354134 0.9999822 0 -0.005963738 -0.999921 0 0.01257307 -0.9996448 0 0.02665516 -0.9999974 0 -0.002288073 -0.9999998 0 7.0555e-4 0.128828 0 0.991667 0.1821215 0 0.9832761 -0.9999974 0 0.002272755 -0.9999837 0 0.005721522 1 0 0 1 0 0 -0.1593812 0 0.9872172 -0.1962573 0 0.9805524 0.7201701 0 -0.6937976 0.7226012 0 -0.6912651 0.9999697 0 0.007785374 0.9999946 0 0.003304998 0.2847205 0 -0.9586106 0.3494971 0 -0.9369375 0.9999983 0 0.001879612 0.9999996 0 8.96816e-4 0.1841785 0 0.9828928 0.03158903 0 0.999501 -0.9988042 0 0.04888958 -0.9969246 0 0.07836596 0.004039975 0 0.9999918 -0.02500704 0 0.9996873 0.8569965 0 -0.5153221 0.7104577 0 -0.7037399 0.6655712 0 0.7463344 0.6511142 0 0.7589798 0.1285564 0 -0.9917023 -0.0472561 0 -0.9988828 0.7446401 0 0.6674663 0.6824402 0 0.7309414 0.9675257 0 0.2527727 0.9860077 0 0.1667 -0.9027882 0 -0.4300854 -0.9386552 0 -0.3448572 0.6341443 0 0.7732148 0.8116015 0 0.5842115 -0.1642902 0 -0.9864121 -0.2548721 0 -0.9669749 -0.9913892 0 0.1309483 -0.9761582 0 0.2170605 0.007788763 0 0.9999697 -0.0346176 0 0.9994007 0.9049795 0 -0.4254555 0.7914213 0 -0.6112711 0.01785691 0 0.9998406 -0.1013531 0 0.9948506 0 0 1 0.01130799 0 0.9999362 -0.8595083 0 -0.5111217 -0.8119516 0 -0.5837248 -0.9966687 0 0.08155727 -0.9278542 0 -0.3729433 0.2217818 0 0.9750963 0.2334803 0 0.9723616 -0.4583219 0 -0.8887863 -0.4414358 0 -0.8972929 -0.1021433 0 0.9947697 -0.04334708 0 0.9990601 0.7972831 0 0.6036055 0.75188 0 0.6593 -0.0284176 0 0.9995961 -0.02379185 0 0.9997169 -0.9424555 0 0.3343318 -0.8761166 0 0.4820994 -0.1044201 0 0.9945334 -0.0392952 0 0.9992277</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape4-binormals-array" count="1185" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape4-map1" name="qt_gauge_background_Shape4-map1">
+ <float_array id="qt_gauge_background_Shape4-map1-array" count="2370">1 0.5 0 0.5000011 0.5000001 1 0.5027733 1 0.497227 1 0 0.5113925 0.497227 0 0 0.4886104 0 0.46875 0.9999836 0.46875 0.006078892 0.25 0.9929453 0.25 0.02776838 0.125 0.9705433 0.125 0.3750001 5.69583e-4 0.347051 0.133098 0.06297158 0.0625 0.4204223 0.05900478 0.1875001 0.01131819 0.2178676 0.0645614 0.107762 0.03125 0.1823343 0.03247787 0.09375003 0.0383155 0.105702 0.06700674 0.1653823 0.125 0.9355447 0.0625 0.6875001 0.002016258 0.667098 0.0665804 0.8915083 0.03125 0.6976225 0.03447534 0.84375 0.0165198 0.8295839 0.03340704 0.8338295 0.06403168 0.6780522 0.1280634 0.4252003 0.238825 6.64618e-4 0.375 0.999119 0.375 0.4073148 0.3567795 0.3794631 0.4743387 0.9929453 0.75 0.006078775 0.75 0.999119 0.625 6.64583e-4 0.625 0.4073148 0.6391715 0.4252003 0.761175 0.9705433 0.875 0.02776819 0.875 0.3794429 0.8669021 0.3750001 0.9994304 0.06297141 0.9375 0.3986876 0.9429617 0.1836193 0.8790491 0.2126438 0.9402428 0.1875001 0.9886818 0.107762 0.96875 0.1823343 0.9675221 0.09375003 0.9616846 0.105702 0.9329933 0.9355447 0.9375 0.667255 0.9334509 0.6952572 0.866902 0.6875001 0.9979838 0.8915083 0.96875 0.6875001 0.9670929 0.8200821 0.9644794 0.8407601 0.9334509 0.84375 0.9834802 0.8550993 0.9727557 0.8077673 0.4359685 0.8794008 0.1683577 0.7339089 0.08269636 0.3215649 0.08348393 0.3171514 0.0426326 0.1618834 0.05243745 0.1632661 0.02401383 0.08445287 0.05534394 0.159805 0.08427969 0.8933871 0.05292884 0.5961789 0.05304046 0.8552756 0.02720371 0.7928007 0.02688903 0.7926095 0.0414234 0.5876361 0.08260089 0.07577221 0.1650347 0.789663 0.3321557 0.2697016 0.2878096 0.2575896 0.4027249 0.5813512 0.71211 0.5901454 0.5773783 0.1055162 0.4738387 0.1278893 0.666132 0.4869511 0.8316114 0.07615323 0.8350457 0.2478155 0.9847804 0.3114721 0.8942212 0.1601041 0.9175304 0.1632661 0.9759861 0.1618014 0.9476603 0.0844528 0.9446561 0.738507 0.9155293 0.5790939 0.8937995 0.4145445 0.9807088 0.8561898 0.9577332 0.7878824 0.9468515 0.7355036 0.9825544 0.590145 0.4027249 0.4778123 0.1682869 0.6772615 0.2081609 0.9135885 0.08417884 0.8365395 0.1058872 0.2424049 0.1060003 0.2478155 0.0152196 0.2480524 0.03260179 0.1271203 0.03392508 0.124697 0.04476716 0.06418185 0.08442326 0.1014153 0.1058881 0.8562343 0.04135937 0.4198633 0.01937795 0.5916627 0.0314829 0.5289258 0.01900643 0.7357044 0.01747535 0.7309812 0.05389925 0.474391 0.1059525 0.2654083 0.2082626 0.1890797 0.1651955 0.5813512 0.2878096 0.1278894 0.3321557 0.1155121 0.4356711 0.789663 0.666132 0.8243344 0.4808991 0.8077723 0.5354303 0.1054972 0.4870011 0.2575895 0.5776758 0.1155101 0.5400438 0.1055144 0.4980801 0.2697015 0.71211 0.879737 0.8315406 0.6775976 0.7917374 0.2660512 0.7917374 0.1949997 0.8348849 0.3117506 0.9574993 0.2479705 0.967496 0.2533258 0.918521 0.06418172 0.9155768 0.1017963 0.8941923 0.1271202 0.9660749 0.124697 0.9552329 0.9137205 0.9157704 0.8370075 0.8939602 0.482551 0.9157097 0.4611794 0.9825158 0.5874454 0.9478494 0.5336155 0.9810426 0.5911836 0.968581 0.4710431 0.982478 0.893519 0.9470203 0.7346114 0.9576989 0.7883436 0.9731001 0.8676292 0.9761151 0.827332 0.9737826 0.8591038 0.9661852 0.9995513 0.421875 0.7735508 0.4609576 0.6895713 0.4217551 0.8515474 0.1336368 0.9817443 0.1875 0.7948335 0.1878523 0.6649586 0.08596997 0.7419054 0.06704707 0.7806861 0.09412545 0.3116357 0.06256614 0.392589 0.09422436 0.2815035 0.09458503 0.3700054 0.03116516 0.2833543 0.03584246 0.2016152 0.04322522 0.156414 0.06710099 0.1414976 0.04825635 0.147631 0.0212841 0.2012086 0.01998661 0.1454619 0.0296282 0.07836081 0.05040775 0.1027706 0.04992614 0.07487893 0.06795723 0.1998094 0.0941176 0.1314641 0.09428143 0.9135265 0.046875 0.8998137 0.0668184 0.8727487 0.04701509 0.6667061 0.05169645 0.5748041 0.0666533 0.5773073 0.04310552 0.8676292 0.0238849 0.859699 0.03360106 0.8283097 0.02608018 0.7858063 0.03378164 0.7660376 0.02233151 0.827772 0.0429981 0.7650096 0.04730767 0.5334513 0.09380323 0.01692364 0.1875 0.09116984 0.1331315 0.1227422 0.170931 0.9960321 0.3125 0.6890198 0.3693311 0.6868179 0.3108968 0.2447557 0.2489128 0.4144501 0.293623 0.1934995 0.3108968 0.1913248 0.3693311 0.4111552 0.4081841 0.1877225 0.4217272 0.6467997 0.7510872 0.41445 0.7061057 0.6868179 0.688679 0.6890198 0.6221896 0.4111553 0.5692852 0.6895734 0.5520448 0.1353123 0.4804527 0 0.4786802 0.1363181 0.4591419 0.003371679 0.6875 0.1913248 0.6222175 0.1934994 0.688679 0.5322945 0.8654775 0.3732853 0.8125857 0.5748088 0.8125857 0.09245603 0.8671398 0.01692348 0.8125 0.1244874 0.8293403 0.2812501 0.9940561 0.2012086 0.9800134 0.2560848 0.9783645 0.258058 0.8665973 0.3931935 0.9058157 0.2825463 0.9068576 0.2017221 0.9150726 0.1561373 0.9333819 0.1327503 0.9061428 0.147631 0.9787159 0.1454619 0.9703718 0.2013386 0.9571046 0.1414976 0.9517437 0.07836072 0.9495923 0.07487884 0.9320427 0.1027705 0.9500739 0.7637306 0.9327387 0.66588 0.9052067 0.7826482 0.9052067 0.5301149 0.9052067 0.438099 0.9776027 0.4361135 0.9997152 0.3676599 0.968955 0.8272395 0.9524382 0.8731939 0.9527368 0.761966 0.9524382 0.765625 0.990732 0.667484 0.9772629 0.764977 0.9777688 0.3703502 0.1874143 0.487491 0.1341793 0.5729095 0.1870711 0.6467997 0.2489128 0.9530439 0.09375 0.8816329 0.09407914 0.2292126 0.1336741 0.2812501 0.005943888 0.2560848 0.02163555 0.100756 0.03478275 0.1296342 0.03809843 0.04536998 0.09375 0.07843836 0.09429872 0.4361135 2.84791e-4 0.4648322 0.02285619 0.5514914 0.02743839 0.6681486 0.02283745 0.5923635 0.001008129 0.765625 0.009268031 0.2135328 0.1878895 0.003371755 0.3125 3.35194e-4 0.421875 0.9960321 0.6875 0.9999918 0.484375 0.7735547 0.5015126 0.9995595 0.5625 0 0.4943058 0.1353116 0.4893161 0.1877218 0.5536314 3.32291e-4 0.5681962 0.136316 0.5101471 0 0.5056968 0.2447557 0.7510872 0.9817443 0.8125 0.8526818 0.86602 0.7959679 0.8118045 0.2161619 0.8121105 0.2845424 0.9380319 0.2826186 0.9644874 0.0453698 0.90625 0.07843825 0.9057013 0.100756 0.9652173 0.1296342 0.9619017 0.9530439 0.90625 0.9002588 0.93301 0.8820781 0.9057493 0.5320471 0.9334193 0.4986135 1 0.456605 0.9778249 0.6658149 0.9526925 0.5744503 0.9571864 0.551105 0.9726782 0.5951366 0.9989918 0.4827834 0.9774876 0.5013867 1 0.9135265 0.953125 0.7633224 0.9661049 0.8697385 0.9711718 0.8494503 0.9767658 0.8431675 0.9697987 0.8693082 0.4140625 0.8940439 0.4467708 0.660431 0.447675 0.8023428 0.1540211 0.9232402 0.1534896 0.9115268 0.1979167 0.7172592 0.09704188 0.7037435 0.07511067 0.775771 0.07701053 0.2783942 0.07591143 0.3558903 0.07494962 0.3358402 0.1004051 0.3333811 0.02755326 0.3484379 0.04900431 0.2783942 0.05119007 0.1707178 0.04356528 0.1807379 0.05638018 0.1386197 0.05829544 0.1404374 0.02659361 0.1751087 0.01920212 0.173637 0.02639199 0.07441714 0.05896226 0.08980425 0.04811564 0.09056075 0.05949068 0.1360354 0.07754995 0.1807379 0.07711308 0.164933 0.09895834 0.8924577 0.04427084 0.9104878 0.05721354 0.8760685 0.05747928 0.6303241 0.04492603 0.6244467 0.05925131 0.5374007 0.05547504 0.8494504 0.02323432 0.8697385 0.02882824 0.8447545 0.02983537 0.8069487 0.02266626 0.8102431 0.02983537 0.7605324 0.02883641 0.7605324 0.03898367 0.8102431 0.03761369 0.8052275 0.04852094 0.5251611 0.07615127 0.6244466 0.07511068 0.614637 0.09704188 0.05658687 0.1930208 0.05200579 0.1534896 0.1159751 0.1485938 0.8657347 0.3020833 0.8675662 0.3477344 0.6395367 0.3444792 0.1740334 0.2760417 0.3317031 0.2690625 0.3134561 0.3147656 0.156824 0.3933073 0.312782 0.3863802 0.307493 0.4269198 0.7237467 0.7239584 0.5108876 0.7309375 0.5195072 0.6845109 0.7388622 0.5924479 0.5203395 0.5998756 0.5155647 0.5421022 0.1901244 0.4713439 0.06343897 0.4807814 0.06346669 0.4699936 0.08159737 0.6979167 0.07999117 0.6498177 0.2259282 0.6523496 0.5706409 0.8450637 0.4386882 0.8450637 0.4592164 0.8041667 0.119405 0.8521297 0.05200566 0.8465105 0.05658676 0.8069792 0.2895314 0.9891545 0.2307833 0.9871897 0.2225166 0.9778509 0.2578261 0.8862963 0.3345215 0.8841262 0.3447397 0.912359 0.1683631 0.904213 0.1800001 0.9262145 0.1360354 0.9224501 0.1751086 0.9807979 0.1404374 0.9734064 0.1736369 0.973608 0.1386197 0.9417046 0.1800001 0.9444995 0.1707178 0.9564347 0.08980419 0.9518844 0.07441704 0.9410378 0.0905607 0.9405093 0.7830778 0.9225318 0.7103155 0.9225318 0.7202843 0.8995949 0.5060022 0.8841262 0.617662 0.8841262 0.6126592 0.910735 0.4019224 0.9667716 0.4464077 0.9892861 0.3979076 0.9866693 0.8714632 0.9615926 0.8431675 0.9607964 0.850641 0.9497975 0.7489873 0.9420631 0.8064145 0.9420631 0.8025363 0.954933 0.7786459 0.984001 0.7139323 0.9870798 0.7139323 0.9763763 0.515564 0.4269198 0.5203395 0.3863802 0.7388616 0.3933073 0.4592164 0.1958333 0.4206616 0.1549363 0.5553763 0.1540211 0.775492 0.2239583 0.5782016 0.221875 0.6832375 0.1776148 0.8833188 0.07701053 0.9269534 0.07674479 0.929346 0.09895834 0.8846673 0.1144271 0.7893436 0.1149586 0.8333675 0.0888074 0.2774324 0.1158738 0.2116617 0.1144271 0.2356598 0.08890995 0.2225166 0.02214911 0.2307833 0.01281037 0.2895314 0.01084558 0.2895314 0.0227101 0.2356598 0.04345569 0.2219678 0.03203133 0.1130774 0.03631877 0.1209062 0.03221805 0.146762 0.03338464 0.1443916 0.04067572 0.117883 0.05175631 0.1126246 0.04255246 0.05389923 0.09895834 0.06067097 0.07702152 0.07939886 0.07782668 0.1041368 0.08934683 0.1234623 0.1144271 0.07532127 0.1144271 0.849454 0.04852094 0.8447545 0.03761369 0.8714632 0.03840744 0.4130729 0.03361453 0.3979075 0.01333078 0.4537515 0.01079286 0.5299483 0.04034737 0.6210634 0.02119649 0.6303241 0.03289331 0.5188557 0.01109425 0.587543 0.01289406 0.4855209 0.0326353 0.7157408 0.02389103 0.7139323 0.01292021 0.7786459 0.01599897 0.7708049 0.05747928 0.7037435 0.0592513 0.7157407 0.04607102 0.543413 0.1149586 0.4277672 0.1158738 0.4527132 0.08794815 0.2980441 0.1785301 0.3197398 0.221875 0.1813512 0.2239583 0.178387 0.1485938 0.246742 0.1549363 0.1360325 0.1930208 0.5195072 0.3147656 0.5108876 0.2690625 0.7237466 0.2760417 0.2259282 0.3444792 0.07999121 0.3477344 0.08159745 0.3020833 0.2049243 0.447229 0.06360515 0.4463247 0.07848811 0.4140625 0.6395367 0.6523495 0.8675662 0.6498177 0.8657347 0.6979167 0.6850247 0.4786126 0.8942274 0.4728125 0.8942323 0.491875 0.8940522 0.5244271 0.8693123 0.5676302 0.6604338 0.5148365 0.06343769 0.4923414 0.06343783 0.4872921 0.1900974 0.4819726 0.3074928 0.5425483 0.312782 0.5998756 0.1568238 0.5928941 0.2049231 0.5184339 0.07848667 0.5704498 0.06360202 0.5318505 0.06343769 0.4970877 0.1901232 0.4919464 0.06346363 0.5058091 0.3134561 0.684511 0.3317031 0.7309375 0.1740334 0.7239584 0.9115268 0.8020834 0.9232402 0.8465104 0.8053679 0.8450637 0.6862625 0.8214699 0.5782016 0.778125 0.775492 0.7760417 0.1813511 0.7760417 0.3197398 0.778125 0.3038311 0.8214699 0.1360324 0.8069792 0.2598727 0.8450637 0.1891607 0.8521296 0.2703126 0.9496895 0.3372873 0.9513029 0.3333811 0.9724467 0.2219678 0.9679687 0.234922 0.9574239 0.2895314 0.9772899 0.3007814 0.9253575 0.234922 0.9274161 0.2295411 0.904213 0.07939878 0.9221733 0.06067083 0.9229785 0.05389908 0.9010417 0.07532117 0.8855729 0.1268923 0.8862963 0.1041368 0.9106532 0.1467619 0.9666154 0.1209061 0.967782 0.1130774 0.9636813 0.1126246 0.9574476 0.117883 0.9482437 0.1443916 0.9593243 0.9293461 0.9010417 0.9269534 0.9232552 0.8845057 0.9225318 0.8345546 0.910735 0.7923686 0.8841262 0.8846673 0.885573 0.5536748 0.9225318 0.4489064 0.924156 0.4457939 0.8995949 0.4782766 0.9894271 0.4724494 0.9894048 0.4354164 0.9693159 0.5213543 0.9448321 0.6126592 0.9420631 0.6285157 0.9565653 0.4877653 0.9676942 0.5889156 0.987106 0.5267696 0.9889281 0.6285157 0.967374 0.6212806 0.9788036 0.5263587 0.9599598 0.479432 0.9894271 0.4485942 0.9692592 0.4877071 0.9893482 0.8772554 0.9420631 0.9104879 0.9427865 0.8924577 0.9557292 0.7742335 0.9607964 0.7139323 0.9612836 0.7103154 0.9497975 0.7526042 0.9714309 0.8025363 0.9697987 0.8069487 0.9773338 0.8616219 0.9744282 0.8447601 0.973508 0.8581806 0.9701982 0.8885677 0.4300521 0.7827789 0.4477261 0.7520755 0.4302781 0.866564 0.1522422 0.9250435 0.1763932 0.8463218 0.1765261 0.7059017 0.08486106 0.7400609 0.07571259 0.7545257 0.08778394 0.3143524 0.07419591 0.3497035 0.08810952 0.3019961 0.08834997 0.3397733 0.03746492 0.3124893 0.05116003 0.3013814 0.03923531 0.1774733 0.0485243 0.1577301 0.0585387 0.1515532 0.0504815 0.1560245 0.02292147 0.1785123 0.02245008 0.1551077 0.02670649 0.08151819 0.05298104 0.09186777 0.05283641 0.08032852 0.06034855 0.157084 0.07634805 0.1760271 0.08828869 0.1468766 0.08839791 0.9016849 0.05011068 0.8948592 0.058543 0.8833305 0.05017711 0.6252813 0.05200788 0.5813473 0.05855138 0.5828167 0.04869486 0.8616219 0.02557185 0.8585773 0.02971041 0.8451568 0.02640057 0.8089029 0.02625855 0.7881366 0.02971245 0.7811932 0.02486382 0.7881366 0.03802553 0.8084726 0.04244512 0.7807629 0.04401157 0.5782874 0.07549778 0.6213595 0.08486106 0.5635954 0.08756912 0.04982468 0.1751693 0.08282799 0.1508854 0.09397671 0.1690495 0.8795886 0.3239128 0.7455541 0.3489128 0.7448082 0.323099 0.251525 0.2716927 0.3277999 0.2921029 0.2323018 0.2987435 0.2271271 0.3890104 0.3211574 0.4066844 0.2255669 0.412088 0.6129339 0.7283073 0.5063477 0.7077163 0.6272939 0.7010757 0.6320834 0.5963361 0.5082692 0.5715622 0.631166 0.5648093 0.1268291 0.47699 0.06297763 0.4762063 0.1268623 0.4684704 0.07305201 0.6754753 0.1554619 0.6472346 0.1561162 0.6761083 0.5049365 0.8471673 0.4358081 0.823766 0.5220318 0.8237659 0.08368541 0.8492955 0.04982457 0.8248308 0.09483415 0.8311314 0.2628912 0.9890053 0.2269207 0.9827653 0.2534808 0.9825342 0.2894188 0.8828661 0.3465862 0.8996422 0.299079 0.9001846 0.1767002 0.9157839 0.1568995 0.9244838 0.1477341 0.9123949 0.1560244 0.9770786 0.1551077 0.9732935 0.1785123 0.9775499 0.1575456 0.9416812 0.1772889 0.9516956 0.1515532 0.9495185 0.08151811 0.947019 0.08032845 0.9396515 0.09186774 0.9471636 0.7496504 0.9235836 0.708301 0.9112608 0.7571086 0.9112609 0.5595619 0.8823235 0.6191689 0.8992361 0.5583112 0.8992361 0.4251552 0.9783718 0.4240428 0.9886619 0.3950866 0.9752431 0.8586118 0.9617211 0.8450577 0.9555131 0.8640755 0.9557121 0.7781734 0.9411618 0.8068426 0.9495094 0.7772038 0.9495094 0.7494466 0.9863043 0.7076172 0.9807649 0.7494466 0.9805423 0.508269 0.4066844 0.6320833 0.3890104 0.6311651 0.412088 0.4313014 0.1762341 0.4843741 0.1526039 0.5182157 0.1760053 0.6687404 0.2260417 0.6314227 0.1988308 0.7329081 0.1993516 0.9073744 0.07612112 0.931489 0.08819662 0.9016154 0.08826305 0.8412381 0.117086 0.8105329 0.1004207 0.8572875 0.1002878 0.2406366 0.1173148 0.2248773 0.1003134 0.2610856 0.1006751 0.2269207 0.01723472 0.2628912 0.01099477 0.2534808 0.01746588 0.2641103 0.03348676 0.2274538 0.03724882 0.2533436 0.02716772 0.1161026 0.03423119 0.1356937 0.03211053 0.1294107 0.03547006 0.1319749 0.04610895 0.1147808 0.04690786 0.1275373 0.04145542 0.05535921 0.08826581 0.06860304 0.07667108 0.06893916 0.08846709 0.1152233 0.1004227 0.09783462 0.1169531 0.09085653 0.1004227 0.8451577 0.04244512 0.8590086 0.03788147 0.8637787 0.04386751 0.3978742 0.02485351 0.4258788 0.01135791 0.4371225 0.02182351 0.5711859 0.03012809 0.6244354 0.02745327 0.5809535 0.03686445 0.5546678 0.01162546 0.535843 0.0235203 0.4975522 0.0217746 0.7080693 0.01930195 0.7494466 0.01369564 0.7498988 0.01952451 0.7388194 0.05905244 0.7055221 0.05229412 0.7479385 0.05062716 0.4831597 0.1174477 0.4385577 0.1004347 0.5016358 0.1002058 0.3089928 0.1990596 0.2503636 0.2260417 0.2375959 0.1995804 0.2095269 0.1512471 0.1978157 0.175531 0.1583771 0.1690495 0.5063477 0.2921029 0.6129339 0.2716927 0.6272939 0.2987435 0.155462 0.3489128 0.07305208 0.3239128 0.1561162 0.323099 0.1306523 0.4470569 0.06691299 0.4299406 0.1490913 0.4301666 0.7455542 0.6472345 0.8795886 0.6754753 0.7448081 0.6761082 0.7890466 0.4723875 0.8950282 0.4820573 0.7890486 0.4884031 0.8885743 0.5464518 0.7520792 0.5413719 0.7827838 0.518618 0.06296895 0.4899316 0.1268216 0.4838791 0.1268214 0.4873432 0.3211573 0.5716737 0.227127 0.5964476 0.2255666 0.5654787 0.1490899 0.5443717 0.06691064 0.5513861 0.1306502 0.5245245 0.1268278 0.4929217 0.1268603 0.5009756 0.06297541 0.5004937 0.3277999 0.7077163 0.251525 0.7283074 0.2323018 0.7010757 0.9250436 0.8236068 0.8673204 0.8475289 0.8470781 0.8232452 0.632179 0.8009405 0.6687404 0.7739584 0.7336644 0.8004196 0.2503636 0.7739584 0.3104395 0.8009404 0.2390426 0.8004196 0.2010984 0.8244691 0.2228468 0.8489338 0.1610705 0.8311314 0.3003376 0.9491366 0.3369856 0.9626119 0.299361 0.9609846 0.2272694 0.9629711 0.2639259 0.9667332 0.2533436 0.9728323 0.2667384 0.9267128 0.2291627 0.9160843 0.2653932 0.9131218 0.06860293 0.9233289 0.05535907 0.9117343 0.06893905 0.9115329 0.09869206 0.8832277 0.1160808 0.8997582 0.09085646 0.8995774 0.1356936 0.9678895 0.1161025 0.9657689 0.1294107 0.96453 0.1147808 0.9530922 0.1319749 0.9538911 0.1275372 0.9585446 0.931489 0.9118034 0.9076711 0.9237645 0.9019122 0.9116226 0.8115858 0.8992361 0.8419944 0.8826852 0.8575844 0.8995978 0.5032495 0.9239897 0.4421126 0.9116669 0.5024714 0.9112609 0.4766872 0.9894997 0.4504557 0.979085 0.4570464 0.9791129 0.5621493 0.941854 0.6218823 0.9499176 0.5783529 0.9517547 0.5374267 0.976562 0.5581449 0.9883801 0.5059258 0.9783357 0.6240376 0.9726136 0.5705602 0.9699487 0.579604 0.9632792 0.4610919 0.9790987 0.4707424 0.979 0.4819459 0.9894855 0.8951559 0.9413426 0.9016849 0.9498894 0.8836272 0.9497085 0.7483435 0.9616438 0.706713 0.9556348 0.7474393 0.9555131 0.7781081 0.9702629 0.8069761 0.97365 0.7792112 0.975203 0.8795688 0.9724326 0.8556896 0.9797977 0.8317255 0.9778468 0.8246393 0.9697426 0.8431457 0.9655806 0.8732142 0.9669191 0.9993352 0.3984375 0.9997674 0.4453125 0.893382 0.4618229 0.6271544 0.4644032 0.5602697 0.4422092 0.8236209 0.4010612 0.7824101 0.1327243 0.9088653 0.1319271 0.9761438 0.15625 0.9873447 0.21875 0.8669297 0.2148437 0.7385696 0.1615654 0.6689651 0.101292 0.6656088 0.07498372 0.7049642 0.06687825 0.7811468 0.06636214 0.8078733 0.08078271 0.7432589 0.1082191 0.2691537 0.06341597 0.3552014 0.06166727 0.4022598 0.07919343 0.3783045 0.110204 0.3123874 0.110204 0.2511264 0.08063613 0.3677657 0.0182248 0.3830343 0.04354758 0.2511264 0.04874007 0.3197907 0.02179359 0.1946704 0.03744812 0.2069467 0.05146935 0.1814975 0.06621556 0.1330647 0.06724046 0.1248547 0.05593858 0.1598857 0.04108761 0.1276965 0.02626705 0.1675656 0.01630114 0.1994437 0.01573271 0.1960862 0.02506718 0.1624108 0.03028459 0.1286354 0.02982398 0.07066619 0.05645388 0.08605542 0.04436163 0.09994861 0.04457111 0.1035876 0.05656711 0.08627412 0.06788519 0.06772634 0.06674664 0.2069467 0.08093654 0.1874472 0.1080339 0.1474224 0.1080339 0.1181879 0.08159185 0.9025174 0.0390625 0.9245356 0.0546875 0.9188997 0.06596354 0.8747164 0.06636214 0.859229 0.05410954 0.8824894 0.04020082 0.6759549 0.0440807 0.6656088 0.05900717 0.6250814 0.06687826 0.5121557 0.06478702 0.5133525 0.04956084 0.6338977 0.03841732 0.8556896 0.02020235 0.8795688 0.02756745 0.8732142 0.03308094 0.8455262 0.03356449 0.8285498 0.02970855 0.8317255 0.02215325 0.8107598 0.03356449 0.7514757 0.03380327 0.734158 0.02697376 0.7987424 0.01919943 0.8285498 0.03754434 0.8295749 0.05064599 0.7946308 0.05410954 0.734158 0.04137115 0.5925609 0.1082191 0.4787442 0.07949384 0.01150127 0.21875 0.02234601 0.15625 0.06116103 0.1319271 0.1249982 0.1307031 0.1487328 0.147526 0.08206519 0.2009896 0.9944887 0.28125 0.9975755 0.34375 0.8229098 0.3715365 0.5610154 0.3657357 0.5605192 0.333431 0.8168415 0.2851562 0.1524502 0.25 0.3280538 0.2456511 0.4172599 0.2681771 0.4112675 0.3211068 0.2817922 0.333431 0.1128503 0.2851562 0.1065401 0.3715365 0.281371 0.3657357 0.4113368 0.3854818 0.4037696 0.4333485 0.2695087 0.4420977 0.1059265 0.4010612 0.7820758 0.7500001 0.534411 0.7543489 0.4172599 0.7318229 0.4112675 0.6778081 0.5605192 0.6648719 0.8168416 0.7148438 0.82291 0.6218424 0.5610154 0.6268641 0.4113369 0.6015581 0.4037697 0.5320929 0.5602711 0.5202691 0.8236227 0.5842122 0.2217153 0.476537 0.06390695 0.4842871 0 0.4836453 0 0.4737151 0.06398344 0.4605606 0.2254483 0.4620284 0.004725227 0.71875 0.002018131 0.65625 0.10654 0.621954 0.281371 0.6268642 0.2817922 0.664872 0.1128502 0.7148438 0.6031492 0.8659028 0.4635289 0.8659028 0.3717138 0.8370616 0.389388 0.7882813 0.507239 0.7882813 0.6322625 0.8370616 0.1301432 0.870382 0.06116091 0.8680729 0.02234584 0.84375 0.01150113 0.78125 0.08206511 0.7990104 0.1557137 0.8535591 0.3281251 0.9967433 0.2343751 0.9913689 0.1994437 0.9842672 0.1960862 0.9749328 0.220042 0.9728007 0.3014845 0.9858463 0.2211353 0.870382 0.3063492 0.8659028 0.3882685 0.889796 0.3947137 0.9209669 0.3293491 0.9212673 0.238336 0.8936632 0.1962046 0.9005903 0.2058399 0.9273044 0.1803907 0.9357159 0.1330647 0.9327595 0.1181878 0.9184082 0.1525675 0.8936632 0.1675655 0.9836988 0.1276965 0.9737329 0.1286353 0.970176 0.1624108 0.9697154 0.2058399 0.9498501 0.1946704 0.9625519 0.1598857 0.9589124 0.1248547 0.9440614 0.08605538 0.9556384 0.07066607 0.9435462 0.06772621 0.9332534 0.08627407 0.9321148 0.1035876 0.9434329 0.0999486 0.955429 0.7991827 0.9329514 0.72449 0.9329514 0.664757 0.9185308 0.6735026 0.889796 0.7477964 0.889796 0.8111837 0.9185308 0.5926541 0.9185308 0.4653053 0.889796 0.416128 0.9639107 0.463158 0.9892858 0.4666703 0.9998576 0.4055568 0.9995728 0.3677657 0.9817752 0.3736522 0.9569329 0.8246393 0.9586049 0.8313555 0.944898 0.8610095 0.944898 0.8824894 0.9597992 0.7921238 0.9586049 0.7244901 0.9448979 0.8046875 0.9871061 0.7265625 0.9943578 0.6714334 0.9850165 0.6732423 0.9718659 0.7299154 0.9734272 0.7987424 0.9808006 0.389388 0.2117188 0.3599733 0.1629384 0.4214369 0.1340972 0.5655062 0.1327243 0.6246651 0.1615654 0.507239 0.2117188 0.7820758 0.25 0.534411 0.2456511 0.9442943 0.078125 0.9617936 0.109375 0.9154352 0.1080339 0.8576841 0.08078271 0.2756634 0.1340972 0.1961269 0.1307031 0.2343751 0.00863104 0.3281251 0.003256735 0.3014845 0.01415371 0.220042 0.02719937 0.09725303 0.03654913 0.104259 0.03301638 0.1507737 0.03618987 0.1118962 0.0389396 0.03656918 0.109375 0.05417078 0.078125 0.09169719 0.08166103 0.05948769 0.1080339 0.4055568 4.27187e-4 0.4666703 1.42396e-4 0.4839393 0.01093764 0.4425923 0.0370598 0.4929301 0.04003875 0.6116263 0.0157883 0.6713791 0.01498353 0.6759549 0.02853511 0.5447953 5.04065e-4 0.6399318 0.001512194 0.7265625 0.005642144 0.8046875 0.01289392 0.1356062 0.2136198 0.2796938 0.1629384 0.002018186 0.34375 0.004725324 0.28125 1.70482e-4 0.4453125 4.99906e-4 0.3984375 0.9975755 0.65625 0.9944887 0.71875 0.9999877 0.4765625 0.9999959 0.4921875 0.8933902 0.5050651 0.6271558 0.4924436 0.9997798 0.53125 0.9993392 0.59375 0 0.4971535 0 0.4914581 0.2217148 0.4838894 0.06390645 0.4946755 0.1059258 0.5854748 0.2695082 0.5217262 4.98437e-4 0.5965981 1.66146e-4 0.5397943 0.06397997 0.5154545 0.2254473 0.4988782 0 0.5085446 0 0.502849 0.3280538 0.7543489 0.1524501 0.7500001 0.9873447 0.78125 0.9761438 0.84375 0.9088653 0.8680729 0.7869476 0.8659028 0.7431072 0.8370616 0.8669297 0.7851563 0.2902102 0.8370616 0.1356061 0.7863802 0.2481837 0.9385154 0.327486 0.9387935 0.3197907 0.9782064 0.2481837 0.9525793 0.05417061 0.921875 0.036569 0.890625 0.05948756 0.8919662 0.09169714 0.918339 0.104259 0.9669837 0.09725301 0.9634509 0.1118962 0.9610605 0.1507737 0.9638102 0.9617936 0.890625 0.9442943 0.921875 0.9188996 0.9340364 0.8764968 0.9329514 0.8594645 0.9185308 0.9154352 0.8919662 0.5926541 0.9329514 0.473034 0.9356738 0.4993068 1 0.4979203 1 0.4329298 0.9645549 0.4786981 0.9893489 0.664757 0.9448979 0.6732423 0.959622 0.631185 0.9622896 0.5046366 0.9508999 0.4890043 0.9604276 0.612241 0.9842117 0.6413183 0.9984878 0.548955 0.9994959 0.5011652 0.9891255 0.4535988 0.9640705 0.50208 1 0.5006934 1 0.9245356 0.9453125 0.9025174 0.9609375 0.7921239 0.9655806 0.7299154 0.9665977</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape4-map1-array" count="1185" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape4-textangents">
+ <float_array id="qt_gauge_background_Shape4-textangents-array" count="13248">-0.1726393 0 0.9849852 -0.1898762 0 0.981808 -0.1132635 0 0.993565 -0.159456 0 0.987205 -0.1898762 0 0.981808 -0.09489052 0 0.9954877 -0.05329765 0 0.9985787 -0.1132635 0 0.993565 -0.1132635 0 0.993565 -0.05329765 0 0.9985787 -0.02310385 0 0.999733 -0.05445649 0 0.9985161 -0.159456 0 0.987205 -0.1132635 0 0.993565 -0.05445649 0 0.9985161 -0.06843807 0 0.9976553 -7.59727e-4 0 0.9999996 0 0 0.9999999 -0.01189335 0 0.9999292 -0.01752696 0 0.9998463 0 0 0.9999999 0 0 1 -0.00538737 0 0.9999855 -0.01189335 0 0.9999292 -0.01189335 0 0.9999292 -0.00538737 0 0.9999855 -0.02310385 0 0.999733 -0.05329765 0 0.9985787 -0.01752696 0 0.9998463 -0.01189335 0 0.9999292 -0.05329765 0 0.9985787 -0.09489052 0 0.9954877 0 0 0.9999999 -0.01431644 0 0.9998975 -0.01344086 0 0.9999096 0 0 0.9999999 -0.01431644 0 0.9998975 -0.06843807 0 0.9976553 -0.05445649 0 0.9985161 -0.01344086 0 0.9999096 -0.01344086 0 0.9999096 -0.05445649 0 0.9985161 -0.02310385 0 0.999733 -0.00538737 0 0.9999855 0 0 0.9999999 -0.01344086 0 0.9999096 -0.00538737 0 0.9999855 0 0 1 -0.02658693 0 0.9996464 0.003319777 0 0.9999945 -0.00742313 0 0.9999724 -0.01980382 0 0.9998038 0.003319777 0 0.9999945 -0.02159105 0 0.9997668 -0.02794415 0 0.9996095 -0.00742313 0 0.9999724 -0.00742313 0 0.9999724 -0.02794415 0 0.9996095 -0.01642606 0 0.9998651 -0.004896068 0 0.9999879 -0.01980382 0 0.9998038 -0.00742313 0 0.9999724 -0.004896068 0 0.9999879 -0.007573228 0 0.9999712 -0.1300192 0 0.9915115 -0.08589862 0 0.9963039 -0.06125271 0 0.9981223 -0.04935382 0 0.9987813 -0.08589862 0 0.9963039 -0.02387191 0 0.999715 -0.02371611 0 0.9997187 -0.06125271 0 0.9981223 -0.06125271 0 0.9981223 -0.02371611 0 0.9997187 -0.01642606 0 0.9998651 -0.02794415 0 0.9996095 -0.04935382 0 0.9987813 -0.06125271 0 0.9981223 -0.02794415 0 0.9996095 -0.02159105 0 0.9997668 0 0 0.9999999 -0.001803899 0 0.9999983 -0.006184466 0 0.9999807 -0.004360031 0 0.9999904 -0.001803899 0 0.9999983 -0.007573228 0 0.9999712 -0.004896068 0 0.9999879 -0.006184466 0 0.9999807 -0.006184466 0 0.9999807 -0.004896068 0 0.9999879 -0.01642606 0 0.9998651 -0.02371611 0 0.9997187 -0.004360031 0 0.9999904 -0.006184466 0 0.9999807 -0.02371611 0 0.9997187 -0.02387191 0 0.999715 0 0 0.9999999 0.01162848 0 0.9999323 0.01114053 0 0.999938 0 0 0.9999999 0.01162848 0 0.9999323 0.06112815 0 0.9981299 0.04782642 0 0.9988557 0.01114053 0 0.999938 0.01114053 0 0.999938 0.04782642 0 0.9988557 0.03498643 0 0.9993877 0.008235849 0 0.999966 0 0 0.9999999 0.01114053 0 0.999938 0.008235849 0 0.999966 0 0 0.9999999 0.1786103 0 0.9839198 0.1029357 0 0.994688 0.114172 0 0.993461 0.1541651 0 0.988045 0.1029357 0 0.994688 0.04333048 0 0.9990608 0.04894645 0 0.9988014 0.114172 0 0.993461 0.114172 0 0.993461 0.04894645 0 0.9988014 0.03498643 0 0.9993877 0.04782642 0 0.9988557 0.1541651 0 0.988045 0.114172 0 0.993461 0.04782642 0 0.9988557 0.06112815 0 0.9981299 0 0 0.9999999 0 0 0.9999999 0.01432327 0 0.9998974 0.008040249 0 0.9999676 0 0 0.9999999 0 0 0.9999999 0.008235849 0 0.999966 0.01432327 0 0.9998974 0.01432327 0 0.9998974 0.008235849 0 0.999966 0.03498643 0 0.9993877 0.04894645 0 0.9988014 0.008040249 0 0.9999676 0.01432327 0 0.9998974 0.04894645 0 0.9988014 0.04333048 0 0.9990608 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.004294774 0 0.9999908 -0.01750973 0 0.9998466 -0.005385173 0 0.9999855 0.005822383 0 0.999983 -0.01750973 0 0.9998466 -0.008147229 0 0.9999667 -0.002656386 0 0.9999963 -0.005385173 0 0.9999855 -0.005385173 0 0.9999855 -0.002656386 0 0.9999963 -0.001409255 0 0.999999 -0.001368062 0 0.999999 0.005822383 0 0.999983 -0.005385173 0 0.9999855 -0.001368062 0 0.999999 0.005802842 0 0.9999831 0 0 0.9999999 0 0 0.9999999 -4.85148e-4 0 0.9999998 -0.001474389 0 0.9999988 0 0 0.9999999 0 0 0.9999999 -8.65526e-4 0 0.9999995 -4.85148e-4 0 0.9999998 -4.85148e-4 0 0.9999998 -8.65526e-4 0 0.9999995 -0.001409255 0 0.999999 -0.002656386 0 0.9999963 -0.001474389 0 0.9999988 -4.85148e-4 0 0.9999998 -0.002656386 0 0.9999963 -0.008147229 0 0.9999667 0 0 0.9999999 0.001743703 0 0.9999984 0 0 0.9999998 0 0 0.9999999 0.001743703 0 0.9999984 0.005802842 0 0.9999831 -0.001368062 0 0.999999 0 0 0.9999998 0 0 0.9999998 -0.001368062 0 0.999999 -0.001409255 0 0.999999 -8.65526e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999998 -8.65526e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.3186903 0 0.9478589 0.1589051 0 0.9872938 0.07325036 0 0.9973135 0.1758705 0 0.9844133 0.1589051 0 0.9872938 0.06031396 0 0.9981795 0.02887893 0 0.9995829 0.07325036 0 0.9973135 0.07325036 0 0.9973135 0.02887893 0 0.9995829 0.01182567 0 0.99993 0.03145206 0 0.9995052 0.1758705 0 0.9844133 0.07325036 0 0.9973135 0.03145206 0 0.9995052 0.04827755 0 0.9988339 -0.06076038 0 0.9981523 -0.03059867 0 0.9995318 -0.005009494 0 0.9999874 -0.001049273 0 0.9999994 -0.03059867 0 0.9995318 -0.01215206 0 0.9999261 -0.002267568 0 0.9999974 -0.005009494 0 0.9999874 -0.005009494 0 0.9999874 -0.002267568 0 0.9999974 0.01182567 0 0.99993 0.02887893 0 0.9995829 -0.001049273 0 0.9999994 -0.005009494 0 0.9999874 0.02887893 0 0.9995829 0.06031396 0 0.9981795 0 0 0.9999999 0.01001115 0 0.9999498 0.006351481 0 0.9999797 -0.002061395 0 0.9999978 0.01001115 0 0.9999498 0.04827755 0 0.9988339 0.03145206 0 0.9995052 0.006351481 0 0.9999797 0.006351481 0 0.9999797 0.03145206 0 0.9995052 0.01182567 0 0.99993 -0.002267568 0 0.9999974 -0.002061395 0 0.9999978 0.006351481 0 0.9999797 -0.002267568 0 0.9999974 -0.01215206 0 0.9999261 -0.7166438 0 0.6974393 -0.5440953 0 0.8390236 -0.489547 0 0.8719769 -0.5619224 0 0.82719 -0.5440953 0 0.8390236 -0.2223518 0 0.9749664 -0.2441668 0 0.9697332 -0.489547 0 0.8719769 -0.489547 0 0.8719769 -0.2441668 0 0.9697332 -0.1544482 0 0.9880009 -0.1858066 0 0.9825863 -0.5619224 0 0.82719 -0.489547 0 0.8719769 -0.1858066 0 0.9825863 -0.239278 0 0.970951 -0.1856117 0 0.9826232 -0.08388904 0 0.9964751 -0.07523938 0 0.9971654 -0.07013363 0 0.9975376 -0.08388904 0 0.9964751 -0.03397257 0 0.9994227 -0.04278042 0 0.9990845 -0.07523938 0 0.9971654 -0.07523938 0 0.9971654 -0.04278042 0 0.9990845 -0.1544482 0 0.9880009 -0.2441668 0 0.9697332 -0.07013363 0 0.9975376 -0.07523938 0 0.9971654 -0.2441668 0 0.9697332 -0.2223518 0 0.9749664 0 0 0.9999999 -0.04830943 0 0.9988323 -0.03559883 0 0.9993661 -0.007197809 0 0.999974 -0.04830943 0 0.9988323 -0.239278 0 0.970951 -0.1858066 0 0.9825863 -0.03559883 0 0.9993661 -0.03559883 0 0.9993661 -0.1858066 0 0.9825863 -0.1544482 0 0.9880009 -0.04278042 0 0.9990845 -0.007197809 0 0.999974 -0.03559883 0 0.9993661 -0.04278042 0 0.9990845 -0.03397257 0 0.9994227 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.1726465 0 0.9849838 0.02527385 0 0.9996805 0.0321717 0 0.9994823 0.0706985 0 0.9974977 0.02527385 0 0.9996805 0.07978366 0 0.9968122 0.09122176 0 0.9958306 0.0321717 0 0.9994823 0.0321717 0 0.9994823 0.09122176 0 0.9958306 0.06282479 0 0.9980246 0.02070289 0 0.9997856 0.0706985 0 0.9974977 0.0321717 0 0.9994823 0.02070289 0 0.9997856 0.02515465 0 0.9996836 0.3902603 0 0.9207045 0.2618757 0 0.9651017 0.1453145 0 0.9893854 0.2634011 0 0.9646864 0.2618757 0 0.9651017 0.08809161 0 0.9961124 0.07109249 0 0.9974697 0.1453145 0 0.9893854 0.1453145 0 0.9893854 0.07109249 0 0.9974697 0.06282479 0 0.9980246 0.09122176 0 0.9958306 0.2634011 0 0.9646864 0.1453145 0 0.9893854 0.09122176 0 0.9958306 0.07978366 0 0.9968122 0 0 0.9999999 0.004460719 0 0.99999 0.0186519 0 0.9998261 0.01610818 0 0.9998702 0.004460719 0 0.99999 0.02515465 0 0.9996836 0.02070289 0 0.9997856 0.0186519 0 0.9998261 0.0186519 0 0.9998261 0.02070289 0 0.9997856 0.06282479 0 0.9980246 0.07109249 0 0.9974697 0.01610818 0 0.9998702 0.0186519 0 0.9998261 0.07109249 0 0.9974697 0.08809161 0 0.9961124 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 7.649e-4 0 0.9999996 0.01753815 0 0.9998462 0.01006317 0 0.9999493 0 0 0.9999999 0.01753815 0 0.9998462 0.09485748 0 0.9954909 0.05379282 0 0.998552 0.01006317 0 0.9999493 0.01006317 0 0.9999493 0.05379282 0 0.998552 0.02370212 0 0.999719 0.005665444 0 0.9999838 0 0 0.9999999 0.01006317 0 0.9999493 0.005665444 0 0.9999838 0 0 0.9999999 0.1726465 0 0.9849838 0.1510137 0 0.9885316 0.1147237 0 0.9933974 0.1898718 0 0.9818088 0.1510137 0 0.9885316 0.0798065 0 0.9968104 0.05269573 0 0.9986106 0.1147237 0 0.9933974 0.1147237 0 0.9933974 0.05269573 0 0.9986106 0.02370212 0 0.999719 0.05379282 0 0.998552 0.1898718 0 0.9818088 0.1147237 0 0.9933974 0.05379282 0 0.998552 0.09485748 0 0.9954909 0 0 0.9999999 0 0 0.9999999 0.01078401 0 0.9999418 0.02034573 0 0.9997929 0 0 0.9999999 0 0 0.9999999 0.005665444 0 0.9999838 0.01078401 0 0.9999418 0.01078401 0 0.9999418 0.005665444 0 0.9999838 0.02370212 0 0.999719 0.05269573 0 0.9986106 0.02034573 0 0.9997929 0.01078401 0 0.9999418 0.05269573 0 0.9986106 0.0798065 0 0.9968104 7.649e-4 0 0.9999996 0 0 0.9999999 4.34896e-4 0 0.9999997 9.33074e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 1.28282e-4 0 1 4.34896e-4 0 0.9999997 4.34896e-4 0 0.9999997 1.28282e-4 0 1 0 0 1 1.71832e-4 0 0.9999999 9.33074e-4 0 0.9999995 4.34896e-4 0 0.9999997 1.71832e-4 0 0.9999999 2.98818e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 1.28282e-4 0 1 0 0 0.9999999 0 0 0.9999999 1.28282e-4 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 2.98818e-4 0 0.9999999 1.71832e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 1.71832e-4 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 -0.01760919 0 0.9998449 -0.02980825 0 0.9995555 0 0 0.9999999 -0.01760919 0 0.9998449 -0.08481482 0 0.9963967 -0.09442508 0 0.9955319 -0.02980825 0 0.9995555 -0.02980825 0 0.9995555 -0.09442508 0 0.9955319 -0.0722148 0 0.997389 -0.01843859 0 0.99983 0 0 0.9999999 -0.02980825 0 0.9995555 -0.01843859 0 0.99983 0 0 0.9999999 -0.312681 0 0.9498581 -0.27703 0 0.9608612 -0.2090372 0 0.9779076 -0.1869421 0 0.9823709 -0.27703 0 0.9608612 -0.1192897 0 0.9928595 -0.09574215 0 0.9954062 -0.2090372 0 0.9779076 -0.2090372 0 0.9779076 -0.09574215 0 0.9954062 -0.0722148 0 0.997389 -0.09442508 0 0.9955319 -0.1869421 0 0.9823709 -0.2090372 0 0.9779076 -0.09442508 0 0.9955319 -0.08481482 0 0.9963967 0 0 0.9999999 0 0 0.9999999 -0.02434182 0 0.9997037 -0.02789328 0 0.9996109 0 0 0.9999999 0 0 0.9999999 -0.01843859 0 0.99983 -0.02434182 0 0.9997037 -0.02434182 0 0.9997037 -0.01843859 0 0.99983 -0.0722148 0 0.997389 -0.09574215 0 0.9954062 -0.02789328 0 0.9996109 -0.02434182 0 0.9997037 -0.09574215 0 0.9954062 -0.1192897 0 0.9928595 0 0 0.9999999 -0.002231035 0 0.9999974 -0.004012494 0 0.9999918 0 0 0.9999999 -0.002231035 0 0.9999974 -0.01082862 0 0.9999412 -0.0134419 0 0.9999096 -0.004012494 0 0.9999918 -0.004012494 0 0.9999918 -0.0134419 0 0.9999096 -0.007900775 0 0.9999686 -0.001573693 0 0.9999986 0 0 0.9999999 -0.004012494 0 0.9999918 -0.001573693 0 0.9999986 0 0 0.9999999 -0.02658693 0 0.9996464 -0.02921768 0 0.999573 -0.02419752 0 0.9997072 -0.02279636 0 0.99974 -0.02921768 0 0.999573 -0.01308993 0 0.9999142 -0.01093034 0 0.9999402 -0.02419752 0 0.9997072 -0.02419752 0 0.9997072 -0.01093034 0 0.9999402 -0.007900775 0 0.9999686 -0.0134419 0 0.9999096 -0.02279636 0 0.99974 -0.02419752 0 0.9997072 -0.0134419 0 0.9999096 -0.01082862 0 0.9999412 0 0 0.9999999 0 0 0.9999999 -0.002818757 0 0.9999959 -0.003329282 0 0.9999943 0 0 0.9999999 0 0 0.9999999 -0.001573693 0 0.9999986 -0.002818757 0 0.9999959 -0.002818757 0 0.9999959 -0.001573693 0 0.9999986 -0.007900775 0 0.9999686 -0.01093034 0 0.9999402 -0.003329282 0 0.9999943 -0.002818757 0 0.9999959 -0.01093034 0 0.9999402 -0.01308993 0 0.9999142 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0.05450032 0 0.9985137 0.04792023 0 0.9988511 0.026891 0 0.9996383 0.02431907 0 0.9997042 0.04792023 0 0.9988511 0.02012396 0 0.9997975 0.0152147 0 0.9998841 0.026891 0 0.9996383 0.026891 0 0.9996383 0.0152147 0 0.9998841 0.007536903 0 0.9999715 0.01377898 0 0.9999049 0.02431907 0 0.9997042 0.026891 0 0.9996383 0.01377898 0 0.9999049 0.0121465 0 0.9999261 0 0 0.9999999 0 0 0.9999999 0.003301835 0 0.9999944 0.004637348 0 0.9999891 0 0 0.9999999 0 0 1 0.001506306 0 0.9999987 0.003301835 0 0.9999944 0.003301835 0 0.9999944 0.001506306 0 0.9999987 0.007536903 0 0.9999715 0.0152147 0 0.9998841 0.004637348 0 0.9999891 0.003301835 0 0.9999944 0.0152147 0 0.9998841 0.02012396 0 0.9997975 0 0 0.9999999 0.002666577 0 0.9999964 0.0038134 0 0.9999927 0 0 0.9999999 0.002666577 0 0.9999964 0.0121465 0 0.9999261 0.01377898 0 0.9999049 0.0038134 0 0.9999927 0.0038134 0 0.9999927 0.01377898 0 0.9999049 0.007536903 0 0.9999715 0.001506306 0 0.9999987 0 0 0.9999999 0.0038134 0 0.9999927 0.001506306 0 0.9999987 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.001091214 0 0.9999993 0.01043477 0 0.9999455 0.00836201 0 0.999965 0.001091214 0 0.9999993 0.005645616 0 0.999984 0.007685822 0 0.9999704 0.01043477 0 0.9999455 0.01043477 0 0.9999455 0.007685822 0 0.9999704 0.03975183 0 0.9992096 0.05073195 0 0.9987122 0.00836201 0 0.999965 0.01043477 0 0.9999455 0.05073195 0 0.9987122 0.04718361 0 0.9988862 0.03890238 0 0.999243 0.01527339 0 0.9998832 0.02040758 0 0.9997916 0.01479183 0 0.9998906 0.01527339 0 0.9998832 0.05414193 0 0.9985331 0.07366286 0 0.9972832 0.02040758 0 0.9997916 0.02040758 0 0.9997916 0.07366286 0 0.9972832 0.03975183 0 0.9992096 0.007685822 0 0.9999704 0.01479183 0 0.9998906 0.02040758 0 0.9997916 0.007685822 0 0.9999704 0.005645616 0 0.999984 0.2665606 0 0.9638181 0.1670316 0 0.9859515 0.1716909 0 0.9851508 0.1795045 0 0.9837572 0.1670316 0 0.9859515 0.04718361 0 0.9988862 0.05073195 0 0.9987122 0.1716909 0 0.9851508 0.1716909 0 0.9851508 0.05073195 0 0.9987122 0.03975183 0 0.9992096 0.07366286 0 0.9972832 0.1795045 0 0.9837572 0.1716909 0 0.9851508 0.07366286 0 0.9972832 0.05414193 0 0.9985331 0 0 1 -0.001357041 0 0.9999989 -0.002355608 0 0.9999971 0 0 0.9999999 -0.001357041 0 0.9999989 -0.006730302 0 0.9999772 -0.007344815 0 0.9999729 -0.002355608 0 0.9999971 -0.002355608 0 0.9999971 -0.007344815 0 0.9999729 -0.005345684 0 0.9999857 -0.001321171 0 0.999999 0 0 0.9999999 -0.002355608 0 0.9999971 -0.001321171 0 0.999999 0 0 0.9999999 -0.01951087 0 0.9998096 -0.01822436 0 0.9998338 -0.01591429 0 0.9998733 -0.01523857 0 0.9998838 -0.01822436 0 0.9998338 -0.007509761 0 0.9999717 -0.006583406 0 0.9999782 -0.01591429 0 0.9998733 -0.01591429 0 0.9998733 -0.006583406 0 0.9999782 -0.005345684 0 0.9999857 -0.007344815 0 0.9999729 -0.01523857 0 0.9998838 -0.01591429 0 0.9998733 -0.007344815 0 0.9999729 -0.006730302 0 0.9999772 0 0 0.9999999 0 0 0.9999999 -0.00150818 0 0.9999987 -0.001684571 0 0.9999984 0 0 0.9999999 0 0 0.9999999 -0.001321171 0 0.999999 -0.00150818 0 0.9999987 -0.00150818 0 0.9999987 -0.001321171 0 0.999999 -0.005345684 0 0.9999857 -0.006583406 0 0.9999782 -0.001684571 0 0.9999984 -0.00150818 0 0.9999987 -0.006583406 0 0.9999782 -0.007509761 0 0.9999717 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.02505147 0 0.9996861 0.02269216 0 0.9997425 0 0 0.9999999 0.02505147 0 0.9996861 0.1136689 0 0.9935187 0.09288264 0 0.9956771 0.02269216 0 0.9997425 0.02269216 0 0.9997425 0.09288264 0 0.9956771 0.07106671 0 0.9974716 0.01792978 0 0.9998392 0 0 0.9999999 0.02269216 0 0.9997425 0.01792978 0 0.9998392 0 0 0.9999999 0.3126836 0 0.9498572 0.1869553 0 0.9823684 0.2079385 0 0.9781418 0.2742288 0 0.9616645 0.1869553 0 0.9823684 0.08481012 0 0.9963971 0.09409113 0 0.9955635 0.2079385 0 0.9781418 0.2079385 0 0.9781418 0.09409113 0 0.9955635 0.07106671 0 0.9974716 0.09288264 0 0.9956771 0.2742288 0 0.9616645 0.2079385 0 0.9781418 0.09288264 0 0.9956771 0.1136689 0 0.9935187 0 0 1 0 0 0.9999999 0.02971558 0 0.9995583 0.01760622 0 0.999845 0 0 0.9999999 0 0 0.9999999 0.01792978 0 0.9998392 0.02971558 0 0.9995583 0.02971558 0 0.9995583 0.01792978 0 0.9998392 0.07106671 0 0.9974716 0.09409113 0 0.9955635 0.01760622 0 0.999845 0.02971558 0 0.9995583 0.09409113 0 0.9955635 0.08481012 0 0.9963971 0.004293885 0 0.9999908 -0.04016791 0 0.999193 -0.02261853 0 0.999744 -0.03157507 0 0.9995013 -0.04016791 0 0.999193 -0.002709847 0 0.9999964 0.004841599 0 0.9999883 -0.02261853 0 0.999744 -0.02261853 0 0.999744 0.004841599 0 0.9999883 0.005940778 0 0.9999823 -0.01050331 0 0.9999447 -0.03157507 0 0.9995013 -0.02261853 0 0.999744 -0.01050331 0 0.9999447 -0.01570453 0 0.9998767 0.06075504 0 0.9981527 0.03059229 0 0.9995319 0.04181793 0 0.9991253 0.04766591 0 0.9988633 0.03059229 0 0.9995319 0.01215133 0 0.9999261 0.01332877 0 0.9999111 0.04181793 0 0.9991253 0.04181793 0 0.9991253 0.01332877 0 0.9999111 0.005940778 0 0.9999823 0.004841599 0 0.9999883 0.04766591 0 0.9988633 0.04181793 0 0.9991253 0.004841599 0 0.9999883 -0.002709847 0 0.9999964 0 0 0.9999999 -0.003275151 0 0.9999946 -8.07582e-4 0 0.9999995 0.00206365 0 0.9999977 -0.003275151 0 0.9999946 -0.01570453 0 0.9998767 -0.01050331 0 0.9999447 -8.07582e-4 0 0.9999995 -8.07582e-4 0 0.9999995 -0.01050331 0 0.9999447 0.005940778 0 0.9999823 0.01332877 0 0.9999111 0.00206365 0 0.9999977 -8.07582e-4 0 0.9999995 0.01332877 0 0.9999111 0.01215133 0 0.9999261 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.06075504 0 0.9981527 0.001041754 0 0.9999994 0.005002838 0 0.9999874 0.03059229 0 0.9995319 0.001041754 0 0.9999994 -0.0603042 0 0.99818 -0.02888596 0 0.9995827 0.005002838 0 0.9999874 0.005002838 0 0.9999874 -0.02888596 0 0.9995827 -0.01182693 0 0.99993 0.002268768 0 0.9999974 0.03059229 0 0.9995319 0.005002838 0 0.9999874 0.002268768 0 0.9999974 0.01215133 0 0.9999261 -0.3187097 0 0.9478523 -0.1758757 0 0.9844123 -0.07326167 0 0.9973128 -0.1588999 0 0.9872946 -0.1758757 0 0.9844123 -0.04828127 0 0.9988338 -0.03145607 0 0.9995052 -0.07326167 0 0.9973128 -0.07326167 0 0.9973128 -0.03145607 0 0.9995052 -0.01182693 0 0.99993 -0.02888596 0 0.9995827 -0.1588999 0 0.9872946 -0.07326167 0 0.9973128 -0.02888596 0 0.9995827 -0.0603042 0 0.99818 0 0 0.9999999 0.00206365 0 0.9999977 -0.006339483 0 0.9999798 -0.01000329 0 0.9999498 0.00206365 0 0.9999977 0.01215133 0 0.9999261 0.002268768 0 0.9999974 -0.006339483 0 0.9999798 -0.006339483 0 0.9999798 0.002268768 0 0.9999974 -0.01182693 0 0.99993 -0.03145607 0 0.9995052 -0.01000329 0 0.9999498 -0.006339483 0 0.9999798 -0.03145607 0 0.9995052 -0.04828127 0 0.9988338 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.1855966 0 0.982626 0.07011702 0 0.9975387 0.07523057 0 0.9971661 0.08388434 0 0.9964755 0.07011702 0 0.9975387 0.2223484 0 0.9749674 0.2441391 0 0.9697402 0.07523057 0 0.9971661 0.07523057 0 0.9971661 0.2441391 0 0.9697402 0.1544338 0 0.9880031 0.04277182 0 0.9990849 0.08388434 0 0.9964755 0.07523057 0 0.9971661 0.04277182 0 0.9990849 0.03398146 0 0.9994224 0.716621 0 0.6974626 0.5619189 0 0.8271924 0.4895157 0 0.8719945 0.5440814 0 0.8390325 0.5619189 0 0.8271924 0.2392644 0 0.9709544 0.1858031 0 0.9825869 0.4895157 0 0.8719945 0.4895157 0 0.8719945 0.1858031 0 0.9825869 0.1544338 0 0.9880031 0.2441391 0 0.9697402 0.5440814 0 0.8390325 0.4895157 0 0.8719945 0.2441391 0 0.9697402 0.2223484 0 0.9749674 0 0 0.9999999 0.007189034 0 0.9999741 0.03561553 0 0.9993656 0.04830104 0 0.9988328 0.007189034 0 0.9999741 0.03398146 0 0.9994224 0.04277182 0 0.9990849 0.03561553 0 0.9993656 0.03561553 0 0.9993656 0.04277182 0 0.9990849 0.1544338 0 0.9880031 0.1858031 0 0.9825869 0.04830104 0 0.9988328 0.03561553 0 0.9993656 0.1858031 0 0.9825869 0.2392644 0 0.9709544 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.004861283 0 0.9999881 0.002094024 0 0.9999976 0 0 0.9999999 0 0 0.9999998 0.004025071 0 0.9999918 0.004861283 0 0.9999881 0.004861283 0 0.9999881 0.004025071 0 0.9999918 0.01509869 0 0.999886 0.01484291 0 0.9998897 0.002094024 0 0.9999976 0.004861283 0 0.9999881 0.01484291 0 0.9998897 0.009043227 0 0.9999589 0.002359462 0 0.999997 0.00165232 0 0.9999985 0.004885113 0 0.999988 -7.50661e-4 0 0.9999996 0.00165232 0 0.9999985 0.02104092 0 0.9997786 0.01978045 0 0.9998043 0.004885113 0 0.999988 0.004885113 0 0.999988 0.01978045 0 0.9998043 0.01509869 0 0.999886 0.004025071 0 0.9999918 -7.50661e-4 0 0.9999996 0.004885113 0 0.999988 0.004025071 0 0.9999918 0 0 0.9999998 0.004293885 0 0.9999908 0.01793684 0 0.9998391 0.03512271 0 0.9993829 0.04614438 0 0.9989347 0.01793684 0 0.9998391 0.009043227 0 0.9999589 0.01484291 0 0.9998897 0.03512271 0 0.9993829 0.03512271 0 0.9993829 0.01484291 0 0.9998897 0.01509869 0 0.999886 0.01978045 0 0.9998043 0.04614438 0 0.9989347 0.03512271 0 0.9993829 0.01978045 0 0.9998043 0.02104092 0 0.9997786 -0.1726393 0 0.9849852 -0.159456 0 0.987205 -0.0845494 0 0.9964193 -0.07002877 0 0.9975449 -0.159456 0 0.987205 -0.06843807 0 0.9976553 -0.04463943 0 0.9990031 -0.0845494 0 0.9964193 -0.0845494 0 0.9964193 -0.04463943 0 0.9990031 -0.02079891 0 0.9997836 -0.04438347 0 0.9990146 -0.07002877 0 0.9975449 -0.0845494 0 0.9964193 -0.04438347 0 0.9990146 -0.02362389 0 0.9997209 0 0 0.9999999 0 0 1 -0.009217143 0 0.9999574 -0.01431644 0 0.9998975 0 0 1 0 0 0.9999999 -0.008177551 0 0.9999664 -0.009217143 0 0.9999574 -0.009217143 0 0.9999574 -0.008177551 0 0.9999664 -0.02079891 0 0.9997836 -0.04463943 0 0.9990031 -0.01431644 0 0.9998975 -0.009217143 0 0.9999574 -0.04463943 0 0.9990031 -0.06843807 0 0.9976553 0 0 0.9999999 -0.003803211 0 0.9999927 -0.009608393 0 0.9999537 0 0 0.9999999 -0.003803211 0 0.9999927 -0.02362389 0 0.9997209 -0.04438347 0 0.9990146 -0.009608393 0 0.9999537 -0.009608393 0 0.9999537 -0.04438347 0 0.9990146 -0.02079891 0 0.9997836 -0.008177551 0 0.9999664 0 0 0.9999999 -0.009608393 0 0.9999537 -0.008177551 0 0.9999664 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 -7.59727e-4 0 0.9999996 0.001644804 0 0.9999985 0.002362568 0 0.999997 -9.20776e-4 0 0.9999995 0.001644804 0 0.9999985 0.01226381 0 0.9999247 0.01229259 0 0.9999243 0.002362568 0 0.999997 0.002362568 0 0.999997 0.01229259 0 0.9999243 0.009400737 0 0.9999558 0.001643925 0 0.9999985 -9.20776e-4 0 0.9999995 0.002362568 0 0.999997 0.001643925 0 0.9999985 -3.04853e-4 0 0.9999999 0.003729071 0 0.999993 0.01275625 0 0.9999185 0.02532563 0 0.9996791 0.03293437 0 0.9994575 0.01275625 0 0.9999185 0.008823507 0 0.999961 0.01203204 0 0.9999275 0.02532563 0 0.9996791 0.02532563 0 0.9996791 0.01203204 0 0.9999275 0.009400737 0 0.9999558 0.01229259 0 0.9999243 0.03293437 0 0.9994575 0.02532563 0 0.9996791 0.01229259 0 0.9999243 0.01226381 0 0.9999247 0 0 0.9999999 0 0 0.9999999 0.002903124 0 0.9999956 0.00347665 0 0.9999938 0 0 0.9999999 -3.04853e-4 0 0.9999999 0.001643925 0 0.9999985 0.002903124 0 0.9999956 0.002903124 0 0.9999956 0.001643925 0 0.9999985 0.009400737 0 0.9999558 0.01203204 0 0.9999275 0.00347665 0 0.9999938 0.002903124 0 0.9999956 0.01203204 0 0.9999275 0.008823507 0 0.999961 0 0 0.9999999 0 0 0.9999999 -0.002391699 0 0.999997 -0.001803899 0 0.9999983 0 0 0.9999999 0 0 1 -0.00142203 0 0.9999989 -0.002391699 0 0.999997 -0.002391699 0 0.999997 -0.00142203 0 0.9999989 -0.005733502 0 0.9999835 -0.009368874 0 0.999956 -0.001803899 0 0.9999983 -0.002391699 0 0.999997 -0.009368874 0 0.999956 -0.007573228 0 0.9999712 0 0 0.9999999 -0.003329282 0 0.9999943 -0.002538172 0 0.9999967 0 0 0.9999999 -0.003329282 0 0.9999943 -0.01308993 0 0.9999142 -0.010518 0 0.9999445 -0.002538172 0 0.9999967 -0.002538172 0 0.9999967 -0.010518 0 0.9999445 -0.005733502 0 0.9999835 -0.00142203 0 0.9999989 0 0 0.9999999 -0.002538172 0 0.9999967 -0.00142203 0 0.9999989 0 0 1 -0.02658693 0 0.9996464 -0.01980382 0 0.9998038 -0.01695318 0 0.9998562 -0.02921768 0 0.999573 -0.01980382 0 0.9998038 -0.007573228 0 0.9999712 -0.009368874 0 0.999956 -0.01695318 0 0.9998562 -0.01695318 0 0.9998562 -0.009368874 0 0.999956 -0.005733502 0 0.9999835 -0.010518 0 0.9999445 -0.02921768 0 0.999573 -0.01695318 0 0.9998562 -0.010518 0 0.9999445 -0.01308993 0 0.9999142 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.01610818 0 0.9998702 0.01869285 0 0.9998252 0.007921037 0 0.9999686 0.01610818 0 0.9998702 0.08809161 0 0.9961124 0.06500083 0 0.9978853 0.01869285 0 0.9998252 0.01869285 0 0.9998252 0.06500083 0 0.9978853 0.04598261 0 0.9989422 0.01597345 0 0.9998723 0.007921037 0 0.9999686 0.01869285 0 0.9998252 0.01597345 0 0.9998723 0.04256221 0 0.9990938 0.3902603 0 0.9207045 0.1638016 0 0.9864934 0.1811481 0 0.9834558 0.2618757 0 0.9651017 0.1638016 0 0.9864934 0.05887935 0 0.998265 0.0717536 0 0.9974223 0.1811481 0 0.9834558 0.1811481 0 0.9834558 0.0717536 0 0.9974223 0.04598261 0 0.9989422 0.06500083 0 0.9978853 0.2618757 0 0.9651017 0.1811481 0 0.9834558 0.06500083 0 0.9978853 0.08809161 0 0.9961124 0.1786103 0 0.9839198 0.1021124 0 0.9947729 0.03150728 0 0.9995035 0.03546372 0 0.9993709 0.1021124 0 0.9947729 0.04256221 0 0.9990938 0.01597345 0 0.9998723 0.03150728 0 0.9995035 0.03150728 0 0.9995035 0.01597345 0 0.9998723 0.04598261 0 0.9989422 0.0717536 0 0.9974223 0.03546372 0 0.9993709 0.03150728 0 0.9995035 0.0717536 0 0.9974223 0.05887935 0 0.998265 0.1786103 0 0.9839198 0.1541651 0 0.988045 0.09292715 0 0.9956728 0.1021124 0 0.9947729 0.1541651 0 0.988045 0.06112815 0 0.9981299 0.05130138 0 0.9986832 0.09292715 0 0.9956728 0.09292715 0 0.9956728 0.05130138 0 0.9986832 0.02895219 0 0.9995808 0.05731362 0 0.9983563 0.1021124 0 0.9947729 0.09292715 0 0.9956728 0.05731362 0 0.9983563 0.04256221 0 0.9990938 0 0 0.9999999 0 0 0.9999999 0.01077878 0 0.9999418 0.01162848 0 0.9999323 0 0 0.9999999 0 0 0.9999999 0.006565033 0 0.9999784 0.01077878 0 0.9999418 0.01077878 0 0.9999418 0.006565033 0 0.9999784 0.02895219 0 0.9995808 0.05130138 0 0.9986832 0.01162848 0 0.9999323 0.01077878 0 0.9999418 0.05130138 0 0.9986832 0.06112815 0 0.9981299 0 0 0.9999999 0.007921037 0 0.9999686 0.02077104 0 0.9997842 0 0 0.9999999 0.007921037 0 0.9999686 0.04256221 0 0.9990938 0.05731362 0 0.9983563 0.02077104 0 0.9997842 0.02077104 0 0.9997842 0.05731362 0 0.9983563 0.02895219 0 0.9995808 0.006565033 0 0.9999784 0 0 0.9999999 0.02077104 0 0.9997842 0.006565033 0 0.9999784 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.002061395 0 0.9999978 7.98072e-4 0 0.9999996 0.003267734 0 0.9999947 -0.002061395 0 0.9999978 -0.01215206 0 0.9999261 -0.01333089 0 0.9999111 7.98072e-4 0 0.9999996 7.98072e-4 0 0.9999996 -0.01333089 0 0.9999111 -0.005945981 0 0.9999824 0.0104921 0 0.9999448 0.003267734 0 0.9999947 7.98072e-4 0 0.9999996 0.0104921 0 0.9999448 0.01569811 0 0.9998767 -0.06076038 0 0.9981523 -0.04766377 0 0.9988634 -0.04181306 0 0.9991254 -0.03059867 0 0.9995318 -0.04766377 0 0.9988634 0.002706588 0 0.9999964 -0.004851894 0 0.9999881 -0.04181306 0 0.9991254 -0.04181306 0 0.9991254 -0.004851894 0 0.9999881 -0.005945981 0 0.9999824 -0.01333089 0 0.9999111 -0.03059867 0 0.9995318 -0.04181306 0 0.9991254 -0.01333089 0 0.9999111 -0.01215206 0 0.9999261 -0.004294774 0 0.9999908 0.03157135 0 0.9995016 0.02261172 0 0.9997441 0.04016548 0 0.999193 0.03157135 0 0.9995016 0.01569811 0 0.9998767 0.0104921 0 0.9999448 0.02261172 0 0.9997441 0.02261172 0 0.9997441 0.0104921 0 0.9999448 -0.005945981 0 0.9999824 -0.004851894 0 0.9999881 0.04016548 0 0.999193 0.02261172 0 0.9997441 -0.004851894 0 0.9999881 0.002706588 0 0.9999964 -0.004294774 0 0.9999908 0.005822383 0 0.999983 0.01439944 0 0.9998962 0.03157135 0 0.9995016 0.005822383 0 0.999983 0.005802842 0 0.9999831 0.008560373 0 0.9999632 0.01439944 0 0.9998962 0.01439944 0 0.9998962 0.008560373 0 0.9999632 0.005434263 0 0.9999852 0.009543259 0 0.9999544 0.03157135 0 0.9995016 0.01439944 0 0.9998962 0.009543259 0 0.9999544 0.01569811 0 0.9998767 0 0 0.9999999 0 0 0.9999999 0.002473777 0 0.9999968 0.001743703 0 0.9999984 0 0 0.9999999 0 0 0.9999999 0.00147507 0 0.9999988 0.002473777 0 0.9999968 0.002473777 0 0.9999968 0.00147507 0 0.9999988 0.005434263 0 0.9999852 0.008560373 0 0.9999632 0.001743703 0 0.9999984 0.002473777 0 0.9999968 0.008560373 0 0.9999632 0.005802842 0 0.9999831 0 0 0.9999999 0.003267734 0 0.9999947 0.002867178 0 0.9999958 0 0 0.9999999 0.003267734 0 0.9999947 0.01569811 0 0.9998767 0.009543259 0 0.9999544 0.002867178 0 0.9999958 0.002867178 0 0.9999958 0.009543259 0 0.9999544 0.005434263 0 0.9999852 0.00147507 0 0.9999988 0 0 0.9999999 0.002867178 0 0.9999958 0.00147507 0 0.9999988 0 0 0.9999999 -0.1856117 0 0.9826232 -0.146972 0 0.9891407 -0.05088105 0 0.9987047 -0.1334871 0 0.9910505 -0.146972 0 0.9891407 0 0 1 0.02912081 0 0.9995759 -0.05088105 0 0.9987047 -0.05088105 0 0.9987047 0.02912081 0 0.9995759 0.02114003 0 0.9997765 -0.01740759 0 0.9998485 -0.1334871 0 0.9910505 -0.05088105 0 0.9987047 -0.01740759 0 0.9998485 -0.05014608 0 0.9987419 0.3186903 0 0.9478589 0.1758705 0 0.9844133 0.1586243 0 0.987339 0.1390395 0 0.9902868 0.1758705 0 0.9844133 0.04827755 0 0.9988339 0.03969136 0 0.999212 0.1586243 0 0.987339 0.1586243 0 0.987339 0.03969136 0 0.999212 0.02114003 0 0.9997765 0.02912081 0 0.9995759 0.1390395 0 0.9902868 0.1586243 0 0.987339 0.02912081 0 0.9995759 0 0 1 0 0 0.9999999 -0.009269617 0 0.999957 0.003671608 0 0.9999932 0.01001115 0 0.9999498 -0.009269617 0 0.999957 -0.05014608 0 0.9987419 -0.01740759 0 0.9998485 0.003671608 0 0.9999932 0.003671608 0 0.9999932 -0.01740759 0 0.9998485 0.02114003 0 0.9997765 0.03969136 0 0.999212 0.01001115 0 0.9999498 0.003671608 0 0.9999932 0.03969136 0 0.999212 0.04827755 0 0.9988339 0 0 0.9999999 0 0 0.9999999 -0.01269195 0 0.9999194 -0.009269617 0 0.999957 0 0 0.9999999 0 0 0.9999999 -0.01276514 0 0.9999184 -0.01269195 0 0.9999194 -0.01269195 0 0.9999194 -0.01276514 0 0.9999184 -0.04323854 0 0.9990647 -0.05163516 0 0.9986659 -0.009269617 0 0.999957 -0.01269195 0 0.9999194 -0.05163516 0 0.9986659 -0.05014608 0 0.9987419 0 0 0.9999999 -0.007197809 0 0.999974 -0.01288992 0 0.9999169 0 0 0.9999999 -0.007197809 0 0.999974 -0.03397257 0 0.9994227 -0.04985331 0 0.9987565 -0.01288992 0 0.9999169 -0.01288992 0 0.9999169 -0.04985331 0 0.9987565 -0.04323854 0 0.9990647 -0.01276514 0 0.9999184 0 0 0.9999999 -0.01288992 0 0.9999169 -0.01276514 0 0.9999184 0 0 0.9999999 -0.1856117 0 0.9826232 -0.1334871 0 0.9910505 -0.07849091 0 0.9969148 -0.08388904 0 0.9964751 -0.1334871 0 0.9910505 -0.05014608 0 0.9987419 -0.05163516 0 0.9986659 -0.07849091 0 0.9969148 -0.07849091 0 0.9969148 -0.05163516 0 0.9986659 -0.04323854 0 0.9990647 -0.04985331 0 0.9987565 -0.08388904 0 0.9964751 -0.07849091 0 0.9969148 -0.04985331 0 0.9987565 -0.03397257 0 0.9994227 -0.312681 0 0.9498581 -0.08100531 0 0.9967136 -0.07637203 0 0.9970793 -0.1790096 0 0.9838472 -0.08100531 0 0.9967136 -0.1773997 0 0.9841388 -0.2106717 0 0.9775569 -0.07637203 0 0.9970793 -0.07637203 0 0.9970793 -0.2106717 0 0.9775569 -0.1310676 0 0.9913734 -0.04480289 0 0.9989958 -0.1790096 0 0.9838472 -0.07637203 0 0.9970793 -0.04480289 0 0.9989958 -0.07603619 0 0.9971051 -0.7166438 0 0.6974393 -0.5619224 0 0.82719 -0.4468834 0 0.8945923 -0.465453 0 0.8850726 -0.5619224 0 0.82719 -0.239278 0 0.970951 -0.2267165 0 0.9739608 -0.4468834 0 0.8945923 -0.4468834 0 0.8945923 -0.2267165 0 0.9739608 -0.1310676 0 0.9913734 -0.2106717 0 0.9775569 -0.465453 0 0.8850726 -0.4468834 0 0.8945923 -0.2106717 0 0.9775569 -0.1773997 0 0.9841388 0 0 0.9999999 -0.01477232 0 0.9998908 -0.04719397 0 0.9988858 -0.04830943 0 0.9988323 -0.01477232 0 0.9998908 -0.07603619 0 0.9971051 -0.04480289 0 0.9989958 -0.04719397 0 0.9988858 -0.04719397 0 0.9988858 -0.04480289 0 0.9989958 -0.1310676 0 0.9913734 -0.2267165 0 0.9739608 -0.04830943 0 0.9988323 -0.04719397 0 0.9988858 -0.2267165 0 0.9739608 -0.239278 0 0.970951 0 0 0.9999999 0 0 0.9999999 -0.0302363 0 0.9995427 -0.01477232 0 0.9998908 0 0 0.9999999 0 0 0.9999999 -0.02355432 0 0.9997226 -0.0302363 0 0.9995427 -0.0302363 0 0.9995427 -0.02355432 0 0.9997226 -0.08882384 0 0.9960473 -0.1100899 0 0.9939216 -0.01477232 0 0.9998908 -0.0302363 0 0.9995427 -0.1100899 0 0.9939216 -0.07603619 0 0.9971051 0 0 0.9999999 -0.02789328 0 0.9996109 -0.02176063 0 0.9997631 0 0 0.9999999 -0.02789328 0 0.9996109 -0.1192897 0 0.9928595 -0.09968065 0 0.9950194 -0.02176063 0 0.9997631 -0.02176063 0 0.9997631 -0.09968065 0 0.9950194 -0.08882384 0 0.9960473 -0.02355432 0 0.9997226 0 0 0.9999999 -0.02176063 0 0.9997631 -0.02355432 0 0.9997226 0 0 0.9999999 -0.312681 0 0.9498581 -0.1790096 0 0.9838472 -0.1723835 0 0.9850299 -0.27703 0 0.9608612 -0.1790096 0 0.9838472 -0.07603619 0 0.9971051 -0.1100899 0 0.9939216 -0.1723835 0 0.9850299 -0.1723835 0 0.9850299 -0.1100899 0 0.9939216 -0.08882384 0 0.9960473 -0.09968065 0 0.9950194 -0.27703 0 0.9608612 -0.1723835 0 0.9850299 -0.09968065 0 0.9950194 -0.1192897 0 0.9928595 0 0 0.9999999 0 0 0.9999999 0.01020542 0 0.9999478 0.004460719 0 0.99999 0 0 0.9999999 0 0 0.9999999 0.008294743 0 0.9999654 0.01020542 0 0.9999478 0.01020542 0 0.9999478 0.008294743 0 0.9999654 0.03962412 0 0.9992146 0.04338345 0 0.9990585 0.004460719 0 0.99999 0.01020542 0 0.9999478 0.04338345 0 0.9990585 0.02515465 0 0.9996836 0 0 0.9999999 0.02034573 0 0.9997929 0.01044951 0 0.9999453 0 0 0.9999999 0.02034573 0 0.9997929 0.0798065 0 0.9968104 0.06167374 0 0.9980964 0.01044951 0 0.9999453 0.01044951 0 0.9999453 0.06167374 0 0.9980964 0.03962412 0 0.9992146 0.008294743 0 0.9999654 0 0 0.9999999 0.01044951 0 0.9999453 0.008294743 0 0.9999654 0 0 0.9999999 0.1726465 0 0.9849838 0.0706985 0 0.9974977 0.07720999 0 0.9970148 0.1510137 0 0.9885316 0.0706985 0 0.9974977 0.02515465 0 0.9996836 0.04338345 0 0.9990585 0.07720999 0 0.9970148 0.07720999 0 0.9970148 0.04338345 0 0.9990585 0.03962412 0 0.9992146 0.06167374 0 0.9980964 0.1510137 0 0.9885316 0.07720999 0 0.9970148 0.06167374 0 0.9980964 0.0798065 0 0.9968104 0 0 0.9999999 -0.001474389 0 0.9999988 -0.003612234 0 0.9999933 1.23146e-4 0 0.9999999 -0.001474389 0 0.9999988 -0.008147229 0 0.9999667 -0.01427012 0 0.9998981 -0.003612234 0 0.9999933 -0.003612234 0 0.9999933 -0.01427012 0 0.9998981 -0.009816301 0 0.9999517 -3.95804e-4 0 0.9999998 1.23146e-4 0 0.9999999 -0.003612234 0 0.9999933 -3.95804e-4 0 0.9999998 4.53692e-4 0 0.9999997 -0.004294774 0 0.9999908 -0.04261986 0 0.9990913 -0.03244772 0 0.9994734 -0.01750973 0 0.9998466 -0.04261986 0 0.9990913 -0.01300912 0 0.9999153 -0.01418704 0 0.9998993 -0.03244772 0 0.9994734 -0.03244772 0 0.9994734 -0.01418704 0 0.9998993 -0.009816301 0 0.9999517 -0.01427012 0 0.9998981 -0.01750973 0 0.9998466 -0.03244772 0 0.9994734 -0.01427012 0 0.9998981 -0.008147229 0 0.9999667 -1.34351e-4 0 0.9999999 0.002819827 0 0.9999959 2.01524e-4 0 0.9999998 0.005951987 0 0.9999822 0.002819827 0 0.9999959 4.53692e-4 0 0.9999997 -3.95804e-4 0 0.9999998 2.01524e-4 0 0.9999998 2.01524e-4 0 0.9999998 -3.95804e-4 0 0.9999998 -0.009816301 0 0.9999517 -0.01418704 0 0.9998993 0.005951987 0 0.9999822 2.01524e-4 0 0.9999998 -0.01418704 0 0.9998993 -0.01300912 0 0.9999153 0 0 0.9999999 0.001737674 0 0.9999984 -6.9225e-4 0 0.9999996 0 0 0.9999999 0.001737674 0 0.9999984 0.007240296 0 0.9999737 -0.001210319 0 0.9999992 -6.9225e-4 0 0.9999996 -6.9225e-4 0 0.9999996 -0.001210319 0 0.9999992 -0.003877358 0 0.9999924 -0.001573946 0 0.9999987 0 0 0.9999999 -6.9225e-4 0 0.9999996 -0.001573946 0 0.9999987 0 0 0.9999999 -0.003881237 0 0.9999924 -0.01259621 0 0.9999206 -0.005243925 0 0.9999861 0.0156917 0 0.9998769 -0.01259621 0 0.9999206 -0.008429551 0 0.9999644 -0.005708626 0 0.9999837 -0.005243925 0 0.9999861 -0.005243925 0 0.9999861 -0.005708626 0 0.9999837 -0.003877358 0 0.9999924 -0.001210319 0 0.9999992 0.0156917 0 0.9998769 -0.005243925 0 0.9999861 -0.001210319 0 0.9999992 0.007240296 0 0.9999737 0 0 0.9999999 0 0 0.9999999 -0.001830092 0 0.9999982 -0.003256729 0 0.9999946 0 0 0.9999999 0 0 0.9999999 -0.001573946 0 0.9999987 -0.001830092 0 0.9999982 -0.001830092 0 0.9999982 -0.001573946 0 0.9999987 -0.003877358 0 0.9999924 -0.005708626 0 0.9999837 -0.003256729 0 0.9999946 -0.001830092 0 0.9999982 -0.005708626 0 0.9999837 -0.008429551 0 0.9999644 -1.34351e-4 0 0.9999999 -0.002380461 0 0.9999971 -0.00213512 0 0.9999976 0.002819827 0 0.9999959 -0.002380461 0 0.9999971 0.01922759 0 0.9998151 0.01068661 0 0.9999428 -0.00213512 0 0.9999976 -0.00213512 0 0.9999976 0.01068661 0 0.9999428 0.004914475 0 0.999988 0.001021183 0 0.9999994 0.002819827 0 0.9999959 -0.00213512 0 0.9999976 0.001021183 0 0.9999994 4.53692e-4 0 0.9999997 -0.003881237 0 0.9999924 0.0156917 0 0.9998769 0.02162449 0 0.999766 0.04080112 0 0.9991673 0.0156917 0 0.9998769 0.007240296 0 0.9999737 0.00944678 0 0.9999553 0.02162449 0 0.999766 0.02162449 0 0.999766 0.00944678 0 0.9999553 0.004914475 0 0.999988 0.01068661 0 0.9999428 0.04080112 0 0.9991673 0.02162449 0 0.999766 0.01068661 0 0.9999428 0.01922759 0 0.9998151 0 0 0.9999999 1.23146e-4 0 0.9999999 0.001627858 0 0.9999986 0.001737674 0 0.9999984 1.23146e-4 0 0.9999999 4.53692e-4 0 0.9999997 0.001021183 0 0.9999994 0.001627858 0 0.9999986 0.001627858 0 0.9999986 0.001021183 0 0.9999994 0.004914475 0 0.999988 0.00944678 0 0.9999553 0.001737674 0 0.9999984 0.001627858 0 0.9999986 0.00944678 0 0.9999553 0.007240296 0 0.9999737 0 0 0.9999999 -0.003256729 0 0.9999946 -0.002863532 0 0.9999958 0 0 0.9999999 -0.003256729 0 0.9999946 -0.008429551 0 0.9999644 -0.01186921 0 0.9999294 -0.002863532 0 0.9999958 -0.002863532 0 0.9999958 -0.01186921 0 0.9999294 -0.009382686 0 0.9999559 -0.001665499 0 0.9999985 0 0 0.9999999 -0.002863532 0 0.9999958 -0.001665499 0 0.9999985 2.98818e-4 0 0.9999999 -0.003881237 0 0.9999924 -0.0327113 0 0.9994647 -0.02517862 0 0.9996828 -0.01259621 0 0.9999206 -0.0327113 0 0.9994647 -0.01223391 0 0.9999251 -0.01225747 0 0.9999247 -0.02517862 0 0.9996828 -0.02517862 0 0.9996828 -0.01225747 0 0.9999247 -0.009382686 0 0.9999559 -0.01186921 0 0.9999294 -0.01259621 0 0.9999206 -0.02517862 0 0.9996828 -0.01186921 0 0.9999294 -0.008429551 0 0.9999644 7.649e-4 0 0.9999996 9.33074e-4 0 0.9999995 -0.002379935 0 0.999997 -0.001639165 0 0.9999986 9.33074e-4 0 0.9999995 2.98818e-4 0 0.9999999 -0.001665499 0 0.9999985 -0.002379935 0 0.999997 -0.002379935 0 0.999997 -0.001665499 0 0.9999985 -0.009382686 0 0.9999559 -0.01225747 0 0.9999247 -0.001639165 0 0.9999986 -0.002379935 0 0.999997 -0.01225747 0 0.9999247 -0.01223391 0 0.9999251 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.004637348 0 0.9999891 0.004153315 0 0.9999912 0 0 0.9999999 0.004637348 0 0.9999891 0.02012396 0 0.9997975 0.0173559 0 0.9998493 0.004153315 0 0.9999912 0.004153315 0 0.9999912 0.0173559 0 0.9998493 0.01417392 0 0.9998995 0.003597445 0 0.9999935 0 0 0.9999999 0.004153315 0 0.9999912 0.003597445 0 0.9999935 0 0 0.9999999 0.05450032 0 0.9985137 0.03800202 0 0.9992776 0.03997194 0 0.9992007 0.04792023 0 0.9988511 0.03800202 0 0.9992776 0.01806527 0 0.9998367 0.01940001 0 0.9998117 0.03997194 0 0.9992007 0.03997194 0 0.9992007 0.01940001 0 0.9998117 0.01417392 0 0.9998995 0.0173559 0 0.9998493 0.04792023 0 0.9988511 0.03997194 0 0.9992007 0.0173559 0 0.9998493 0.02012396 0 0.9997975 0 0 1 0 0 0.9999999 0.006421454 0 0.9999793 0.003721425 0 0.9999929 0 0 0.9999999 0 0 0.9999999 0.003597445 0 0.9999935 0.006421454 0 0.9999793 0.006421454 0 0.9999793 0.003597445 0 0.9999935 0.01417392 0 0.9998995 0.01940001 0 0.9998117 0.003721425 0 0.9999929 0.006421454 0 0.9999793 0.01940001 0 0.9998117 0.01806527 0 0.9998367 0 0 0.9999999 0.00836201 0 0.999965 0.01193703 0 0.9999286 0.002666577 0 0.9999964 0.00836201 0 0.999965 0.04718361 0 0.9988862 0.04628414 0 0.9989283 0.01193703 0 0.9999286 0.01193703 0 0.9999286 0.04628414 0 0.9989283 0.03223738 0 0.9994801 0.009071214 0 0.9999588 0.002666577 0 0.9999964 0.01193703 0 0.9999286 0.009071214 0 0.9999588 0.0121465 0 0.9999261 0.2665606 0 0.9638181 0.09428699 0 0.995545 0.1166651 0 0.9931712 0.1670316 0 0.9859515 0.09428699 0 0.995545 0.04243366 0 0.9990993 0.05474662 0 0.9985003 0.1166651 0 0.9931712 0.1166651 0 0.9931712 0.05474662 0 0.9985003 0.03223738 0 0.9994801 0.04628414 0 0.9989283 0.1670316 0 0.9859515 0.1166651 0 0.9931712 0.04628414 0 0.9989283 0.04718361 0 0.9988862 0.05450032 0 0.9985137 0.02431907 0 0.9997042 0.01726345 0 0.9998509 0.01323302 0 0.9999123 0.02431907 0 0.9997042 0.0121465 0 0.9999261 0.009071214 0 0.9999588 0.01726345 0 0.9998509 0.01726345 0 0.9998509 0.009071214 0 0.9999588 0.03223738 0 0.9994801 0.05474662 0 0.9985003 0.01323302 0 0.9999123 0.01726345 0 0.9998509 0.05474662 0 0.9985003 0.04243366 0 0.9990993 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.004360031 0 0.9999904 9.24649e-4 0 0.9999994 0.006324458 0 0.9999799 -0.004360031 0 0.9999904 -0.02387191 0 0.999715 -0.023185 0 0.9997312 9.24649e-4 0 0.9999994 9.24649e-4 0 0.9999994 -0.023185 0 0.9997312 -0.002538982 0 0.9999967 0.02709557 0 0.9996328 0.006324458 0 0.9999799 9.24649e-4 0 0.9999994 0.02709557 0 0.9996328 0.03521081 0 0.9993799 -0.1300192 0 0.9915115 -0.07274196 0 0.9973509 -0.0763596 0 0.9970804 -0.08589862 0 0.9963039 -0.07274196 0 0.9973509 0.01050971 0 0.9999447 -0.02413926 0 0.9997085 -0.0763596 0 0.9970804 -0.0763596 0 0.9970804 -0.02413926 0 0.9997085 -0.002538982 0 0.9999967 -0.023185 0 0.9997312 -0.08589862 0 0.9963039 -0.0763596 0 0.9970804 -0.023185 0 0.9997312 -0.02387191 0 0.999715 0.2453582 0 0.9694324 0.1347834 0 0.9908751 0.03536178 0 0.9993745 0.1725558 0 0.9849998 0.1347834 0 0.9908751 0.03521081 0 0.9993799 0.02709557 0 0.9996328 0.03536178 0 0.9993745 0.03536178 0 0.9993745 0.02709557 0 0.9996328 -0.002538982 0 0.9999967 -0.02413926 0 0.9997085 0.1725558 0 0.9849998 0.03536178 0 0.9993745 -0.02413926 0 0.9997085 0.01050971 0 0.9999447 0.2453582 0 0.9694324 0.09410387 0 0.9955625 0.1039073 0 0.9945869 0.1347834 0 0.9908751 0.09410387 0 0.9955625 0.04132996 0 0.9991454 0.05189003 0 0.9986527 0.1039073 0 0.9945869 0.1039073 0 0.9945869 0.05189003 0 0.9986527 0.0299776 0 0.9995506 0.04055946 0 0.999177 0.1347834 0 0.9908751 0.1039073 0 0.9945869 0.04055946 0 0.999177 0.03521081 0 0.9993799 0 0 0.9999999 0 0 0.9999999 0.01434451 0 0.999897 0.008356123 0 0.999965 0 0 0.9999999 0 0 0.9999999 0.005985052 0 0.9999819 0.01434451 0 0.999897 0.01434451 0 0.999897 0.005985052 0 0.9999819 0.0299776 0 0.9995506 0.05189003 0 0.9986527 0.008356123 0 0.999965 0.01434451 0 0.999897 0.05189003 0 0.9986527 0.04132996 0 0.9991454 0 0 0.9999999 0.006324458 0 0.9999799 0.009659599 0 0.9999532 0 0 0.9999999 0.006324458 0 0.9999799 0.03521081 0 0.9993799 0.04055946 0 0.999177 0.009659599 0 0.9999532 0.009659599 0 0.9999532 0.04055946 0 0.999177 0.0299776 0 0.9995506 0.005985052 0 0.9999819 0 0 0.9999999 0.009659599 0 0.9999532 0.005985052 0 0.9999819 0 0 0.9999999 0 0 0.9999999 0.003131842 0 0.9999949 0.004582379 0 0.9999893 0 0 0.9999999 0.003131842 0 0.9999949 0.01526732 0 0.9998832 0.01691068 0 0.9998569 0.004582379 0 0.9999893 0.004582379 0 0.9999893 0.01691068 0 0.9998569 0.009082003 0 0.9999586 0.001709203 0 0.9999983 0 0 0.9999999 0.004582379 0 0.9999893 0.001709203 0 0.9999983 0 0 0.9999999 0.03890238 0 0.999243 0.01479183 0 0.9998906 0.02975079 0 0.9995574 0.03768967 0 0.9992894 0.01479183 0 0.9998906 0.005645616 0 0.999984 0.009362832 0 0.9999561 0.02975079 0 0.9995574 0.02975079 0 0.9995574 0.009362832 0 0.9999561 0.009082003 0 0.9999586 0.01691068 0 0.9998569 0.03768967 0 0.9992894 0.02975079 0 0.9995574 0.01691068 0 0.9998569 0.01526732 0 0.9998832 0 0 0.9999999 0 0 0.9999999 0.002048503 0 0.9999978 0.001091214 0 0.9999993 0 0 0.9999999 0 0 0.9999999 0.001709203 0 0.9999983 0.002048503 0 0.9999978 0.002048503 0 0.9999978 0.001709203 0 0.9999983 0.009082003 0 0.9999586 0.009362832 0 0.9999561 0.001091214 0 0.9999993 0.002048503 0 0.9999978 0.009362832 0 0.9999561 0.005645616 0 0.999984 0 0 0.9999999 0 0 0.9999999 -0.001353448 0 0.9999989 -5.09989e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 -0.001067673 0 0.9999993 -0.001353448 0 0.9999989 -0.001353448 0 0.9999989 -0.001067673 0 0.9999993 -0.002732614 0 0.9999963 -0.004734732 0 0.9999886 -5.09989e-4 0 0.9999998 -0.001353448 0 0.9999989 -0.004734732 0 0.9999886 -0.003090205 0 0.9999952 0 0 0.9999999 -0.001684571 0 0.9999984 -0.001202831 0 0.9999992 0 0 0.9999999 -0.001684571 0 0.9999984 -0.007509761 0 0.9999717 -0.005582586 0 0.9999843 -0.001202831 0 0.9999992 -0.001202831 0 0.9999992 -0.005582586 0 0.9999843 -0.002732614 0 0.9999963 -0.001067673 0 0.9999993 0 0 0.9999999 -0.001202831 0 0.9999992 -0.001067673 0 0.9999993 0 0 0.9999999 -0.01951087 0 0.9998096 -0.007766418 0 0.9999698 -0.009753961 0 0.9999523 -0.01822436 0 0.9998338 -0.007766418 0 0.9999698 -0.003090205 0 0.9999952 -0.004734732 0 0.9999886 -0.009753961 0 0.9999523 -0.009753961 0 0.9999523 -0.004734732 0 0.9999886 -0.002732614 0 0.9999963 -0.005582586 0 0.9999843 -0.01822436 0 0.9998338 -0.009753961 0 0.9999523 -0.005582586 0 0.9999843 -0.007509761 0 0.9999717 0 0 0.9999999 -5.09989e-4 0 0.9999998 -0.01850281 0 0.9998288 -0.01051819 0 0.9999447 -5.09989e-4 0 0.9999998 -0.003090205 0 0.9999952 -0.01748223 0 0.9998471 -0.01850281 0 0.9998288 -0.01850281 0 0.9998288 -0.01748223 0 0.9998471 -0.06243728 0 0.9980489 -0.07700901 0 0.9970303 -0.01051819 0 0.9999447 -0.01850281 0 0.9998288 -0.07700901 0 0.9970303 -0.06272461 0 0.9980309 -0.01951087 0 0.9998096 -0.01346385 0 0.9999093 -0.0211156 0 0.999777 -0.007766418 0 0.9999698 -0.01346385 0 0.9999093 -0.0786633 0 0.9969013 -0.08515792 0 0.9963675 -0.0211156 0 0.999777 -0.0211156 0 0.999777 -0.08515792 0 0.9963675 -0.06243728 0 0.9980489 -0.01748223 0 0.9998471 -0.007766418 0 0.9999698 -0.0211156 0 0.999777 -0.01748223 0 0.9998471 -0.003090205 0 0.9999952 -0.4694145 0 0.8829778 -0.2769297 0 0.9608902 -0.1930602 0 0.9811869 -0.1837267 0 0.9829773 -0.2769297 0 0.9608902 -0.06272461 0 0.9980309 -0.07700901 0 0.9970303 -0.1930602 0 0.9811869 -0.1930602 0 0.9811869 -0.07700901 0 0.9970303 -0.06243728 0 0.9980489 -0.08515792 0 0.9963675 -0.1837267 0 0.9829773 -0.1930602 0 0.9811869 -0.08515792 0 0.9963675 -0.0786633 0 0.9969013 0 0 0.9999999 0 0 0.9999999 0.01361273 0 0.9999073 0.04895627 0 0.998801 0 0 0.9999999 0 0 0.9999999 0.006702407 0 0.9999775 0.01361273 0 0.9999073 0.01361273 0 0.9999073 0.006702407 0 0.9999775 0.007891154 0 0.9999688 0.05191037 0 0.9986517 0.04895627 0 0.998801 0.01361273 0 0.9999073 0.05191037 0 0.9986517 0.07109786 0 0.9974692 0 0 0.9999999 -0.01051819 0 0.9999447 -0.005440605 0 0.9999851 0 0 0.9999999 -0.01051819 0 0.9999447 -0.06272461 0 0.9980309 -0.0241575 0 0.9997081 -0.005440605 0 0.9999851 -0.005440605 0 0.9999851 -0.0241575 0 0.9997081 0.007891154 0 0.9999688 0.006702407 0 0.9999775 0 0 0.9999999 -0.005440605 0 0.9999851 0.006702407 0 0.9999775 0 0 0.9999999 -0.4694145 0 0.8829778 -0.2774163 0 0.9607497 -0.02561793 0 0.9996718 -0.2769297 0 0.9608902 -0.2774163 0 0.9607497 0.07109786 0 0.9974692 0.05191037 0 0.9986517 -0.02561793 0 0.9996718 -0.02561793 0 0.9996718 0.05191037 0 0.9986517 0.007891154 0 0.9999688 -0.0241575 0 0.9997081 -0.2769297 0 0.9608902 -0.02561793 0 0.9996718 -0.0241575 0 0.9997081 -0.06272461 0 0.9980309 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.008038946 0 0.9999676 -0.01432458 0 0.9998974 0 0 0.9999999 -0.008038946 0 0.9999676 -0.04333154 0 0.9990607 -0.04896757 0 0.9988003 -0.01432458 0 0.9998974 -0.01432458 0 0.9998974 -0.04896757 0 0.9988003 -0.03510168 0 0.9993837 -0.008275264 0 0.9999657 0 0 0.9999999 -0.01432458 0 0.9998974 -0.008275264 0 0.9999657 0 0 0.9999999 -0.1786054 0 0.9839207 -0.1547575 0 0.9879524 -0.1143034 0 0.9934458 -0.1029391 0 0.9946876 -0.1547575 0 0.9879524 -0.06239809 0 0.9980513 -0.04822235 0 0.9988366 -0.1143034 0 0.9934458 -0.1143034 0 0.9934458 -0.04822235 0 0.9988366 -0.03510168 0 0.9993837 -0.04896757 0 0.9988003 -0.1029391 0 0.9946876 -0.1143034 0 0.9934458 -0.04896757 0 0.9988003 -0.04333154 0 0.9990607 0 0 0.9999999 0 0 0.9999999 -0.01139054 0 0.9999351 -0.01222851 0 0.9999252 0 0 0.9999999 0 0 0.9999999 -0.008275264 0 0.9999657 -0.01139054 0 0.9999351 -0.01139054 0 0.9999351 -0.008275264 0 0.9999657 -0.03510168 0 0.9993837 -0.04822235 0 0.9988366 -0.01222851 0 0.9999252 -0.01139054 0 0.9999351 -0.04822235 0 0.9988366 -0.06239809 0 0.9980513 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -2.34501e-4 0 0.9999998 -0.001885214 0 0.9999981 0 0 0.9999999 0 0 0.9999999 8.21483e-4 0 0.9999995 -2.34501e-4 0 0.9999998 -2.34501e-4 0 0.9999998 8.21483e-4 0 0.9999995 0.001421707 0 0.9999989 0.001109744 0 0.9999993 -0.001885214 0 0.9999981 -2.34501e-4 0 0.9999998 0.001109744 0 0.9999993 -0.006121014 0 0.9999811 0 0 0.9999999 0.002094024 0 0.9999976 4.68706e-4 0 0.9999998 0 0 0.9999999 0.002094024 0 0.9999976 0.009043227 0 0.9999589 0.002821595 0 0.9999959 4.68706e-4 0 0.9999998 4.68706e-4 0 0.9999998 0.002821595 0 0.9999959 0.001421707 0 0.9999989 8.21483e-4 0 0.9999995 0 0 0.9999999 4.68706e-4 0 0.9999998 8.21483e-4 0 0.9999995 0 0 0.9999999 0.004293885 0 0.9999908 -0.005962854 0 0.9999821 0.005503957 0 0.9999847 0.01793684 0 0.9998391 -0.005962854 0 0.9999821 -0.006121014 0 0.9999811 0.001109744 0 0.9999993 0.005503957 0 0.9999847 0.005503957 0 0.9999847 0.001109744 0 0.9999993 0.001421707 0 0.9999989 0.002821595 0 0.9999959 0.01793684 0 0.9998391 0.005503957 0 0.9999847 0.002821595 0 0.9999959 0.009043227 0 0.9999589 0 0 0.9999999 0 0 0.9999999 -0.002846838 0 0.9999959 -0.003275151 0 0.9999946 0 0 0.9999999 0 0 0.9999999 -0.001458412 0 0.9999989 -0.002846838 0 0.9999959 -0.002846838 0 0.9999959 -0.001458412 0 0.9999989 -0.005417826 0 0.9999852 -0.009527503 0 0.9999545 -0.003275151 0 0.9999946 -0.002846838 0 0.9999959 -0.009527503 0 0.9999545 -0.01570453 0 0.9998767 0 0 0.9999999 -0.001885214 0 0.9999981 -0.002510081 0 0.9999967 0 0 0.9999999 -0.001885214 0 0.9999981 -0.006121014 0 0.9999811 -0.008628811 0 0.9999626 -0.002510081 0 0.9999967 -0.002510081 0 0.9999967 -0.008628811 0 0.9999626 -0.005417826 0 0.9999852 -0.001458412 0 0.9999989 0 0 0.9999999 -0.002510081 0 0.9999967 -0.001458412 0 0.9999989 0 0 0.9999999 0.004293885 0 0.9999908 -0.03157507 0 0.9995013 -0.01441307 0 0.999896 -0.005962854 0 0.9999821 -0.03157507 0 0.9995013 -0.01570453 0 0.9998767 -0.009527503 0 0.9999545 -0.01441307 0 0.999896 -0.01441307 0 0.999896 -0.009527503 0 0.9999545 -0.005417826 0 0.9999852 -0.008628811 0 0.9999626 -0.005962854 0 0.9999821 -0.01441307 0 0.999896 -0.008628811 0 0.9999626 -0.006121014 0 0.9999811 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.04830104 0 0.9988328 0.04719339 0 0.9988858 0.01476525 0 0.999891 0.04830104 0 0.9988328 0.2392644 0 0.9709544 0.2267359 0 0.9739562 0.04719339 0 0.9988858 0.04719339 0 0.9988858 0.2267359 0 0.9739562 0.1310874 0 0.9913708 0.04481169 0 0.9989955 0.01476525 0 0.999891 0.04719339 0 0.9988858 0.04481169 0 0.9989955 0.07604313 0 0.9971045 0.716621 0 0.6974626 0.465419 0 0.8850905 0.4468714 0 0.8945983 0.5619189 0 0.8271924 0.465419 0 0.8850905 0.1773621 0 0.9841456 0.210661 0 0.9775591 0.4468714 0 0.8945983 0.4468714 0 0.8945983 0.210661 0 0.9775591 0.1310874 0 0.9913708 0.2267359 0 0.9739562 0.5619189 0 0.8271924 0.4468714 0 0.8945983 0.2267359 0 0.9739562 0.2392644 0 0.9709544 0.3126836 0 0.9498572 0.1790084 0 0.9838474 0.07636385 0 0.99708 0.08098112 0 0.9967157 0.1790084 0 0.9838474 0.07604313 0 0.9971045 0.04481169 0 0.9989955 0.07636385 0 0.99708 0.07636385 0 0.99708 0.04481169 0 0.9989955 0.1310874 0 0.9913708 0.210661 0 0.9775591 0.08098112 0 0.9967157 0.07636385 0 0.99708 0.210661 0 0.9775591 0.1773621 0 0.9841456 0.3126836 0 0.9498572 0.2742288 0 0.9616645 0.1687242 0 0.9856634 0.1790084 0 0.9838474 0.2742288 0 0.9616645 0.1136689 0 0.9935187 0.09405481 0 0.995567 0.1687242 0 0.9856634 0.1687242 0 0.9856634 0.09405481 0 0.995567 0.08492264 0 0.9963875 0.1088504 0 0.9940581 0.1790084 0 0.9838474 0.1687242 0 0.9856634 0.1088504 0 0.9940581 0.07604313 0 0.9971045 0 0 0.9999999 0 0 0.9999999 0.01943403 0 0.9998112 0.02505147 0 0.9996861 0 0 0.9999999 0 0 0.9999999 0.02238782 0 0.9997494 0.01943403 0 0.9998112 0.01943403 0 0.9998112 0.02238782 0 0.9997494 0.08492264 0 0.9963875 0.09405481 0 0.995567 0.02505147 0 0.9996861 0.01943403 0 0.9998112 0.09405481 0 0.995567 0.1136689 0 0.9935187 0 0 0.9999999 0.01476525 0 0.999891 0.02987043 0 0.9995536 0 0 0.9999999 0.01476525 0 0.999891 0.07604313 0 0.9971045 0.1088504 0 0.9940581 0.02987043 0 0.9995536 0.02987043 0 0.9995536 0.1088504 0 0.9940581 0.08492264 0 0.9963875 0.02238782 0 0.9997494 0 0 0.9999999 0.02987043 0 0.9995536 0.02238782 0 0.9997494 0 0 0.9999999 0 0 0.9999999 -0.01000329 0 0.9999498 -0.003661854 0 0.9999932 0.009276941 0 0.9999569 -0.01000329 0 0.9999498 -0.04828127 0 0.9988338 -0.03970151 0 0.9992115 -0.003661854 0 0.9999932 -0.003661854 0 0.9999932 -0.03970151 0 0.9992115 -0.02115626 0 0.9997761 0.01739796 0 0.9998486 0.009276941 0 0.9999569 -0.003661854 0 0.9999932 0.01739796 0 0.9998486 0.05015137 0 0.9987416 -0.3187097 0 0.9478523 -0.1390341 0 0.9902875 -0.1586233 0 0.987339 -0.1758757 0 0.9844123 -0.1390341 0 0.9902875 0 0 0.9999999 -0.0291091 0 0.9995762 -0.1586233 0 0.987339 -0.1586233 0 0.987339 -0.0291091 0 0.9995762 -0.02115626 0 0.9997761 -0.03970151 0 0.9992115 -0.1758757 0 0.9844123 -0.1586233 0 0.987339 -0.03970151 0 0.9992115 -0.04828127 0 0.9988338 0.1855966 0 0.982626 0.1334916 0 0.9910499 0.05088183 0 0.9987047 0.146964 0 0.9891419 0.1334916 0 0.9910499 0.05015137 0 0.9987416 0.01739796 0 0.9998486 0.05088183 0 0.9987047 0.05088183 0 0.9987047 0.01739796 0 0.9998486 -0.02115626 0 0.9997761 -0.0291091 0 0.9995762 0.146964 0 0.9891419 0.05088183 0 0.9987047 -0.0291091 0 0.9995762 0 0 0.9999999 0.1855966 0 0.982626 0.08388434 0 0.9964755 0.07849731 0 0.9969142 0.1334916 0 0.9910499 0.08388434 0 0.9964755 0.03398146 0 0.9994224 0.04985541 0 0.9987564 0.07849731 0 0.9969142 0.07849731 0 0.9969142 0.04985541 0 0.9987564 0.04325256 0 0.9990641 0.05164603 0 0.9986654 0.1334916 0 0.9910499 0.07849731 0 0.9969142 0.05164603 0 0.9986654 0.05015137 0 0.9987416 0 0 0.9999999 0 0 0.9999999 0.01288547 0 0.9999169 0.007189034 0 0.9999741 0 0 0.9999999 0 0 0.9999999 0.01277927 0 0.9999182 0.01288547 0 0.9999169 0.01288547 0 0.9999169 0.01277927 0 0.9999182 0.04325256 0 0.9990641 0.04985541 0 0.9987564 0.007189034 0 0.9999741 0.01288547 0 0.9999169 0.04985541 0 0.9987564 0.03398146 0 0.9994224 0 0 0.9999999 0.009276941 0 0.9999569 0.01269885 0 0.9999193 0 0 0.9999999 0.009276941 0 0.9999569 0.05015137 0 0.9987416 0.05164603 0 0.9986654 0.01269885 0 0.9999193 0.01269885 0 0.9999193 0.05164603 0 0.9986654 0.04325256 0 0.9990641 0.01277927 0 0.9999182 0 0 0.9999999 0.01269885 0 0.9999193 0.01277927 0 0.9999182 0 0 0.9999999 -0.1786054 0 0.9839207 -0.03545535 0 0.9993712 -0.03217634 0 0.9994822 -0.1024573 0 0.9947373 -0.03545535 0 0.9993712 -0.05886243 0 0.998266 -0.07219362 0 0.9973906 -0.03217634 0 0.9994822 -0.03217634 0 0.9994822 -0.07219362 0 0.9973906 -0.04659889 0 0.9989137 -0.01773799 0 0.9998426 -0.1024573 0 0.9947373 -0.03217634 0 0.9994822 -0.01773799 0 0.9998426 -0.04785127 0 0.9988545 -0.39024 0 0.9207131 -0.2628684 0 0.9648315 -0.1814878 0 0.9833931 -0.1637646 0 0.9864994 -0.2628684 0 0.9648315 -0.09002821 0 0.9959392 -0.06601379 0 0.9978187 -0.1814878 0 0.9833931 -0.1814878 0 0.9833931 -0.06601379 0 0.9978187 -0.04659889 0 0.9989137 -0.07219362 0 0.9973906 -0.1637646 0 0.9864994 -0.1814878 0 0.9833931 -0.07219362 0 0.9973906 -0.05886243 0 0.998266 0 0 0.9999999 -0.00774681 0 0.99997 -0.02268204 0 0.9997427 -0.01696698 0 0.9998561 -0.00774681 0 0.99997 -0.04785127 0 0.9988545 -0.01773799 0 0.9998426 -0.02268204 0 0.9997427 -0.02268204 0 0.9997427 -0.01773799 0 0.9998426 -0.04659889 0 0.9989137 -0.06601379 0 0.9978187 -0.01696698 0 0.9998561 -0.02268204 0 0.9997427 -0.06601379 0 0.9978187 -0.09002821 0 0.9959392 0 0 0.9999999 0 0 0.9999999 -0.02113467 0 0.9997766 -0.00774681 0 0.99997 0 0 0.9999999 0 0 0.9999999 -0.006829492 0 0.9999767 -0.02113467 0 0.9997766 -0.02113467 0 0.9997766 -0.006829492 0 0.9999767 -0.02980152 0 0.9995558 -0.05803462 0 0.9983146 -0.00774681 0 0.99997 -0.02113467 0 0.9997766 -0.05803462 0 0.9983146 -0.04785127 0 0.9988545 0 0 0.9999999 -0.01222851 0 0.9999252 -0.0114712 0 0.9999341 0 0 0.9999999 -0.01222851 0 0.9999252 -0.06239809 0 0.9980513 -0.05271612 0 0.9986094 -0.0114712 0 0.9999341 -0.0114712 0 0.9999341 -0.05271612 0 0.9986094 -0.02980152 0 0.9995558 -0.006829492 0 0.9999767 0 0 0.9999999 -0.0114712 0 0.9999341 -0.006829492 0 0.9999767 0 0 0.9999999 -0.1786054 0 0.9839207 -0.1024573 0 0.9947373 -0.09394434 0 0.9955775 -0.1547575 0 0.9879524 -0.1024573 0 0.9947373 -0.04785127 0 0.9988545 -0.05803462 0 0.9983146 -0.09394434 0 0.9955775 -0.09394434 0 0.9955775 -0.05803462 0 0.9983146 -0.02980152 0 0.9995558 -0.05271612 0 0.9986094 -0.1547575 0 0.9879524 -0.09394434 0 0.9955775 -0.05271612 0 0.9986094 -0.06239809 0 0.9980513 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -2.57457e-4 0 0.9999999 0.00326977 0 0.9999945 0.003440087 0 0.9999939 0 0 0.9999999 0.00326977 0 0.9999945 0.008410828 0 0.9999645 0.00616849 0 0.9999809 0.003440087 0 0.9999939 0.003440087 0 0.9999939 0.00616849 0 0.9999809 0.003380765 0 0.9999942 8.71484e-4 0 0.9999995 0 0 0.9999999 0.003440087 0 0.9999939 8.71484e-4 0 0.9999995 0 0 0.9999999 0.002359462 0 0.999997 -7.50661e-4 0 0.9999996 0.005192259 0 0.9999864 0.009559964 0 0.9999542 -7.50661e-4 0 0.9999996 0 0 0.9999998 0.001920818 0 0.999998 0.005192259 0 0.9999864 0.005192259 0 0.9999864 0.001920818 0 0.999998 0.003380765 0 0.9999942 0.00616849 0 0.9999809 0.009559964 0 0.9999542 0.005192259 0 0.9999864 0.00616849 0 0.9999809 0.008410828 0 0.9999645 0 0 0.9999999 0 0 0.9999999 5.05436e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 8.71484e-4 0 0.9999995 5.05436e-4 0 0.9999997 5.05436e-4 0 0.9999997 8.71484e-4 0 0.9999995 0.003380765 0 0.9999942 0.001920818 0 0.999998 0 0 0.9999999 5.05436e-4 0 0.9999997 0.001920818 0 0.999998 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.00109938 0 0.9999993 -0.003033863 0 0.9999952 -1.52247e-4 0 0.9999999 -0.00109938 0 0.9999993 -0.007202303 0 0.999974 -0.01150639 0 0.9999337 -0.003033863 0 0.9999952 -0.003033863 0 0.9999952 -0.01150639 0 0.9999337 -0.006596141 0 0.9999782 -0.001569184 0 0.9999986 -1.52247e-4 0 0.9999999 -0.003033863 0 0.9999952 -0.001569184 0 0.9999986 -0.001082557 0 0.9999993 0.003729071 0 0.999993 -0.04222446 0 0.9991082 -0.02299638 0 0.9997354 -0.01598609 0 0.9998721 -0.04222446 0 0.9991082 -0.02168377 0 0.9997648 -0.01286996 0 0.999917 -0.02299638 0 0.9997354 -0.02299638 0 0.9997354 -0.01286996 0 0.999917 -0.006596141 0 0.9999782 -0.01150639 0 0.9999337 -0.01598609 0 0.9998721 -0.02299638 0 0.9997354 -0.01150639 0 0.9999337 -0.007202303 0 0.999974 -0.003020834 0 0.9999954 -0.005125093 0 0.9999868 0.001616146 0 0.9999985 0.001290123 0 0.999999 -0.005125093 0 0.9999868 -0.001082557 0 0.9999993 -0.001569184 0 0.9999986 0.001616146 0 0.9999985 0.001616146 0 0.9999985 -0.001569184 0 0.9999986 -0.006596141 0 0.9999782 -0.01286996 0 0.999917 0.001290123 0 0.999999 0.001616146 0 0.9999985 -0.01286996 0 0.999917 -0.02168377 0 0.9997648 0 0 0.9999999 0.00347665 0 0.9999938 0.002068261 0 0.9999977 0 0 0.9999999 0.00347665 0 0.9999938 0.008823507 0 0.999961 0.005997272 0 0.999982 0.002068261 0 0.9999977 0.002068261 0 0.9999977 0.005997272 0 0.999982 0.003976385 0 0.999992 0.001556017 0 0.9999986 0 0 0.9999999 0.002068261 0 0.9999977 0.001556017 0 0.9999986 0 0 0.9999999 0.003729071 0 0.999993 -0.01598609 0 0.9998721 0.005385526 0 0.9999854 0.01275625 0 0.9999185 -0.01598609 0 0.9998721 -0.007202303 0 0.999974 0.001084363 0 0.9999992 0.005385526 0 0.9999854 0.005385526 0 0.9999854 0.001084363 0 0.9999992 0.003976385 0 0.999992 0.005997272 0 0.999982 0.01275625 0 0.9999185 0.005385526 0 0.9999854 0.005997272 0 0.999982 0.008823507 0 0.999961 0 0 0.9999999 0 0 0.9999999 6.17357e-4 0 0.9999996 -0.00109938 0 0.9999993 0 0 0.9999999 0 0 0.9999999 0.001556017 0 0.9999986 6.17357e-4 0 0.9999996 6.17357e-4 0 0.9999996 0.001556017 0 0.9999986 0.003976385 0 0.999992 0.001084363 0 0.9999992 -0.00109938 0 0.9999993 6.17357e-4 0 0.9999996 0.001084363 0 0.9999992 -0.007202303 0 0.999974 -2.57457e-4 0 0.9999999 0 0 0.9999999 -0.004479861 0 0.9999899 -0.01172127 0 0.9999312 0 0 0.9999999 0 0 0.9999999 -0.001958467 0 0.9999979 -0.004479861 0 0.9999899 -0.004479861 0 0.9999899 -0.001958467 0 0.9999979 -0.007971154 0 0.9999682 -0.01407445 0 0.9999009 -0.01172127 0 0.9999312 -0.004479861 0 0.9999899 -0.01407445 0 0.9999009 -0.02117876 0 0.9997755 0 0 0.9999999 -1.52247e-4 0 0.9999999 -0.001158114 0 0.9999992 0 0 0.9999999 -1.52247e-4 0 0.9999999 -0.001082557 0 0.9999993 -0.004136092 0 0.9999914 -0.001158114 0 0.9999992 -0.001158114 0 0.9999992 -0.004136092 0 0.9999914 -0.007971154 0 0.9999682 -0.001958467 0 0.9999979 0 0 0.9999999 -0.001158114 0 0.9999992 -0.001958467 0 0.9999979 0 0 0.9999999 -0.003020834 0 0.9999954 -0.02035824 0 0.9997926 -0.01057577 0 0.999944 -0.005125093 0 0.9999868 -0.02035824 0 0.9997926 -0.02117876 0 0.9997755 -0.01407445 0 0.9999009 -0.01057577 0 0.999944 -0.01057577 0 0.999944 -0.01407445 0 0.9999009 -0.007971154 0 0.9999682 -0.004136092 0 0.9999914 -0.005125093 0 0.9999868 -0.01057577 0 0.999944 -0.004136092 0 0.9999914 -0.001082557 0 0.9999993 0 0 0.9999999 -0.01696698 0 0.9998561 -0.01933501 0 0.999813 -0.003803211 0 0.9999927 -0.01696698 0 0.9998561 -0.09002821 0 0.9959392 -0.07320993 0 0.9973165 -0.01933501 0 0.999813 -0.01933501 0 0.999813 -0.07320993 0 0.9973165 -0.06405301 0 0.9979464 -0.0200395 0 0.9997991 -0.003803211 0 0.9999927 -0.01933501 0 0.999813 -0.0200395 0 0.9997991 -0.02362389 0 0.9997209 -0.39024 0 0.9207131 -0.2633972 0 0.9646875 -0.1468163 0 0.9891638 -0.2628684 0 0.9648315 -0.2633972 0 0.9646875 -0.07978406 0 0.9968122 -0.09145249 0 0.9958093 -0.1468163 0 0.9891638 -0.1468163 0 0.9891638 -0.09145249 0 0.9958093 -0.06405301 0 0.9979464 -0.07320993 0 0.9973165 -0.2628684 0 0.9648315 -0.1468163 0 0.9891638 -0.07320993 0 0.9973165 -0.09002821 0 0.9959392 -0.1726393 0 0.9849852 -0.07002877 0 0.9975449 -0.03163692 0 0.9994994 -0.0252667 0 0.9996806 -0.07002877 0 0.9975449 -0.02362389 0 0.9997209 -0.0200395 0 0.9997991 -0.03163692 0 0.9994994 -0.03163692 0 0.9994994 -0.0200395 0 0.9997991 -0.06405301 0 0.9979464 -0.09145249 0 0.9958093 -0.0252667 0 0.9996806 -0.03163692 0 0.9994994 -0.09145249 0 0.9958093 -0.07978406 0 0.9968122 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 -1.67007e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -1.67007e-4 0 0.9999999 -3.04853e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 -1.21318e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -1.21318e-4 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -7.59727e-4 0 0.9999996 -9.20776e-4 0 0.9999995 -4.32569e-4 0 0.9999998 0 0 0.9999999 -9.20776e-4 0 0.9999995 -3.04853e-4 0 0.9999999 -1.67007e-4 0 0.9999999 -4.32569e-4 0 0.9999998 -4.32569e-4 0 0.9999998 -1.67007e-4 0 0.9999999 0 0 1 -1.21318e-4 0 0.9999999 0 0 0.9999999 -4.32569e-4 0 0.9999998 -1.21318e-4 0 0.9999999 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape4-textangents-array" count="4416" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape4-texbinormals">
+ <float_array id="qt_gauge_background_Shape4-texbinormals-array" count="13248">0.9849851 0 0.1726393 0.9818081 0 0.1898763 0.993565 0 0.1132635 0.9872051 0 0.159456 0.9818081 0 0.1898763 0.9954877 0 0.09489051 0.9985787 0 0.05329766 0.993565 0 0.1132635 0.993565 0 0.1132635 0.9985787 0 0.05329766 0.9997331 0 0.02310385 0.9985162 0 0.05445649 0.9872051 0 0.159456 0.993565 0 0.1132635 0.9985162 0 0.05445649 0.9976554 0 0.06843808 0.9999998 0 7.59727e-4 1 0 0 0.9999293 0 0.01189335 0.9998465 0 0.01752696 1 0 0 1 0 0 0.9999855 0 0.00538737 0.9999293 0 0.01189335 0.9999293 0 0.01189335 0.9999855 0 0.00538737 0.9997331 0 0.02310385 0.9985787 0 0.05329766 0.9998465 0 0.01752696 0.9999293 0 0.01189335 0.9985787 0 0.05329766 0.9954877 0 0.09489051 1 0 0 0.9998976 0 0.01431644 0.9999098 0 0.01344087 1 0 0 0.9998976 0 0.01431644 0.9976554 0 0.06843808 0.9985162 0 0.05445649 0.9999098 0 0.01344087 0.9999098 0 0.01344087 0.9985162 0 0.05445649 0.9997331 0 0.02310385 0.9999855 0 0.00538737 1 0 0 0.9999098 0 0.01344087 0.9999855 0 0.00538737 1 0 0 0.9996466 0 0.02658693 0.9999946 0 -0.003319777 0.9999725 0 0.007423131 0.999804 0 0.01980383 0.9999946 0 -0.003319777 0.9997669 0 0.02159106 0.9996095 0 0.02794415 0.9999725 0 0.007423131 0.9999725 0 0.007423131 0.9996095 0 0.02794415 0.9998651 0 0.01642606 0.9999881 0 0.004896069 0.999804 0 0.01980383 0.9999725 0 0.007423131 0.9999881 0 0.004896069 0.9999714 0 0.007573229 0.9915115 0 0.1300192 0.9963039 0 0.08589862 0.9981224 0 0.06125272 0.9987814 0 0.04935382 0.9963039 0 0.08589862 0.9997151 0 0.02387191 0.9997188 0 0.02371612 0.9981224 0 0.06125272 0.9981224 0 0.06125272 0.9997188 0 0.02371612 0.9998651 0 0.01642606 0.9996095 0 0.02794415 0.9987814 0 0.04935382 0.9981224 0 0.06125272 0.9996095 0 0.02794415 0.9997669 0 0.02159106 1 0 0 0.9999984 0 0.001803899 0.9999809 0 0.006184467 0.9999905 0 0.004360031 0.9999984 0 0.001803899 0.9999714 0 0.007573229 0.9999881 0 0.004896069 0.9999809 0 0.006184467 0.9999809 0 0.006184467 0.9999881 0 0.004896069 0.9998651 0 0.01642606 0.9997188 0 0.02371612 0.9999905 0 0.004360031 0.9999809 0 0.006184467 0.9997188 0 0.02371612 0.9997151 0 0.02387191 1 0 0 0.9999324 0 -0.01162848 0.999938 0 -0.01114053 1 0 0 0.9999324 0 -0.01162848 0.9981299 0 -0.06112815 0.9988557 0 -0.04782642 0.999938 0 -0.01114053 0.999938 0 -0.01114053 0.9988557 0 -0.04782642 0.9993879 0 -0.03498644 0.9999661 0 -0.00823585 1 0 0 0.999938 0 -0.01114053 0.9999661 0 -0.00823585 1 0 0 0.98392 0 -0.1786104 0.9946881 0 -0.1029357 0.9934611 0 -0.114172 0.9880452 0 -0.1541651 0.9946881 0 -0.1029357 0.9990609 0 -0.04333048 0.9988014 0 -0.04894645 0.9934611 0 -0.114172 0.9934611 0 -0.114172 0.9988014 0 -0.04894645 0.9993879 0 -0.03498644 0.9988557 0 -0.04782642 0.9880452 0 -0.1541651 0.9934611 0 -0.114172 0.9988557 0 -0.04782642 0.9981299 0 -0.06112815 1 0 0 1 0 0 0.9998975 0 -0.01432327 0.9999678 0 -0.00804025 1 0 0 1 0 0 0.9999661 0 -0.00823585 0.9998975 0 -0.01432327 0.9998975 0 -0.01432327 0.9999661 0 -0.00823585 0.9993879 0 -0.03498644 0.9988014 0 -0.04894645 0.9999678 0 -0.00804025 0.9998975 0 -0.01432327 0.9988014 0 -0.04894645 0.9990609 0 -0.04333048 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999908 0 0.004294774 0.9998467 0 0.01750973 0.9999855 0 0.005385173 0.9999831 0 -0.005822383 0.9998467 0 0.01750973 0.9999669 0 0.008147229 0.9999965 0 0.002656387 0.9999855 0 0.005385173 0.9999855 0 0.005385173 0.9999965 0 0.002656387 0.999999 0 0.001409255 0.9999992 0 0.001368063 0.9999831 0 -0.005822383 0.9999855 0 0.005385173 0.9999992 0 0.001368063 0.9999832 0 -0.005802842 1 0 0 1 0 0 0.9999999 0 4.85148e-4 0.999999 0 0.001474389 1 0 0 1 0 0 0.9999996 0 8.65526e-4 0.9999999 0 4.85148e-4 0.9999999 0 4.85148e-4 0.9999996 0 8.65526e-4 0.999999 0 0.001409255 0.9999965 0 0.002656387 0.999999 0 0.001474389 0.9999999 0 4.85148e-4 0.9999965 0 0.002656387 0.9999669 0 0.008147229 1 0 0 0.9999985 0 -0.001743703 1 0 0 1 0 0 0.9999985 0 -0.001743703 0.9999832 0 -0.005802842 0.9999992 0 0.001368063 1 0 0 1 0 0 0.9999992 0 0.001368063 0.999999 0 0.001409255 0.9999996 0 8.65526e-4 1 0 0 1 0 0 0.9999996 0 8.65526e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9478589 0 -0.3186903 0.9872938 0 -0.1589051 0.9973137 0 -0.07325037 0.9844134 0 -0.1758706 0.9872938 0 -0.1589051 0.9981794 0 -0.06031395 0.9995829 0 -0.02887893 0.9973137 0 -0.07325037 0.9973137 0 -0.07325037 0.9995829 0 -0.02887893 0.9999301 0 -0.01182567 0.9995053 0 -0.03145206 0.9844134 0 -0.1758706 0.9973137 0 -0.07325037 0.9995053 0 -0.03145206 0.998834 0 -0.04827756 0.9981524 0 0.06076038 0.9995318 0 0.03059867 0.9999875 0 0.005009494 0.9999995 0 0.001049273 0.9995318 0 0.03059867 0.9999261 0 0.01215206 0.9999975 0 0.002267568 0.9999875 0 0.005009494 0.9999875 0 0.005009494 0.9999975 0 0.002267568 0.9999301 0 -0.01182567 0.9995829 0 -0.02887893 0.9999995 0 0.001049273 0.9999875 0 0.005009494 0.9995829 0 -0.02887893 0.9981794 0 -0.06031395 1 0 0 0.99995 0 -0.01001115 0.9999799 0 -0.006351482 0.999998 0 0.002061395 0.99995 0 -0.01001115 0.998834 0 -0.04827756 0.9995053 0 -0.03145206 0.9999799 0 -0.006351482 0.9999799 0 -0.006351482 0.9995053 0 -0.03145206 0.9999301 0 -0.01182567 0.9999975 0 0.002267568 0.999998 0 0.002061395 0.9999799 0 -0.006351482 0.9999975 0 0.002267568 0.9999261 0 0.01215206 0.6974394 0 0.7166439 0.8390235 0 0.5440952 0.871977 0 0.489547 0.82719 0 0.5619224 0.8390235 0 0.5440952 0.9749665 0 0.2223518 0.9697333 0 0.2441669 0.871977 0 0.489547 0.871977 0 0.489547 0.9697333 0 0.2441669 0.9880009 0 0.1544482 0.9825864 0 0.1858066 0.82719 0 0.5619224 0.871977 0 0.489547 0.9825864 0 0.1858066 0.9709512 0 0.2392781 0.9826232 0 0.1856117 0.9964752 0 0.08388904 0.9971656 0 0.07523939 0.9975376 0 0.07013363 0.9964752 0 0.08388904 0.9994228 0 0.03397258 0.9990846 0 0.04278042 0.9971656 0 0.07523939 0.9971656 0 0.07523939 0.9990846 0 0.04278042 0.9880009 0 0.1544482 0.9697333 0 0.2441669 0.9975376 0 0.07013363 0.9971656 0 0.07523939 0.9697333 0 0.2441669 0.9749665 0 0.2223518 1 0 0 0.9988325 0 0.04830944 0.9993662 0 0.03559883 0.9999742 0 0.007197811 0.9988325 0 0.04830944 0.9709512 0 0.2392781 0.9825864 0 0.1858066 0.9993662 0 0.03559883 0.9993662 0 0.03559883 0.9825864 0 0.1858066 0.9880009 0 0.1544482 0.9990846 0 0.04278042 0.9999742 0 0.007197811 0.9993662 0 0.03559883 0.9990846 0 0.04278042 0.9994228 0 0.03397258 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9849839 0 -0.1726465 0.9996806 0 -0.02527385 0.9994824 0 -0.0321717 0.9974977 0 -0.0706985 0.9996806 0 -0.02527385 0.9968122 0 -0.07978366 0.9958307 0 -0.09122176 0.9994824 0 -0.0321717 0.9994824 0 -0.0321717 0.9958307 0 -0.09122176 0.9980246 0 -0.06282479 0.9997857 0 -0.02070289 0.9974977 0 -0.0706985 0.9994824 0 -0.0321717 0.9997857 0 -0.02070289 0.9996836 0 -0.02515465 0.9207047 0 -0.3902603 0.9651017 0 -0.2618757 0.9893856 0 -0.1453145 0.9646864 0 -0.2634011 0.9651017 0 -0.2618757 0.9961124 0 -0.08809161 0.9974698 0 -0.0710925 0.9893856 0 -0.1453145 0.9893856 0 -0.1453145 0.9974698 0 -0.0710925 0.9980246 0 -0.06282479 0.9958307 0 -0.09122176 0.9646864 0 -0.2634011 0.9893856 0 -0.1453145 0.9958307 0 -0.09122176 0.9968122 0 -0.07978366 1 0 0 0.99999 0 -0.004460719 0.9998261 0 -0.0186519 0.9998704 0 -0.01610818 0.99999 0 -0.004460719 0.9996836 0 -0.02515465 0.9997857 0 -0.02070289 0.9998261 0 -0.0186519 0.9998261 0 -0.0186519 0.9997857 0 -0.02070289 0.9980246 0 -0.06282479 0.9974698 0 -0.0710925 0.9998704 0 -0.01610818 0.9998261 0 -0.0186519 0.9974698 0 -0.0710925 0.9961124 0 -0.08809161 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 -7.649e-4 0.9998462 0 -0.01753815 0.9999495 0 -0.01006317 1 0 0 0.9998462 0 -0.01753815 0.9954909 0 -0.09485748 0.9985521 0 -0.05379283 0.9999495 0 -0.01006317 0.9999495 0 -0.01006317 0.9985521 0 -0.05379283 0.9997191 0 -0.02370213 0.999984 0 -0.005665444 1 0 0 0.9999495 0 -0.01006317 0.999984 0 -0.005665444 1 0 0 0.9849839 0 -0.1726465 0.9885317 0 -0.1510137 0.9933975 0 -0.1147237 0.981809 0 -0.1898718 0.9885317 0 -0.1510137 0.9968104 0 -0.0798065 0.9986106 0 -0.05269573 0.9933975 0 -0.1147237 0.9933975 0 -0.1147237 0.9986106 0 -0.05269573 0.9997191 0 -0.02370213 0.9985521 0 -0.05379283 0.981809 0 -0.1898718 0.9933975 0 -0.1147237 0.9985521 0 -0.05379283 0.9954909 0 -0.09485748 1 0 0 1 0 0 0.9999419 0 -0.01078401 0.9997931 0 -0.02034573 1 0 0 1 0 0 0.999984 0 -0.005665444 0.9999419 0 -0.01078401 0.9999419 0 -0.01078401 0.999984 0 -0.005665444 0.9997191 0 -0.02370213 0.9986106 0 -0.05269573 0.9997931 0 -0.02034573 0.9999419 0 -0.01078401 0.9986106 0 -0.05269573 0.9968104 0 -0.0798065 0.9999998 0 -7.649e-4 1 0 0 1 0 -4.34896e-4 0.9999996 0 -9.33074e-4 1 0 0 1 0 0 1 0 -1.28282e-4 1 0 -4.34896e-4 1 0 -4.34896e-4 1 0 -1.28282e-4 1 0 0 1 0 -1.71832e-4 0.9999996 0 -9.33074e-4 1 0 -4.34896e-4 1 0 -1.71832e-4 1 0 -2.98818e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -1.28282e-4 1 0 0 1 0 0 1 0 -1.28282e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -2.98818e-4 1 0 -1.71832e-4 1 0 0 1 0 0 1 0 -1.71832e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.999845 0 0.01760919 0.9995556 0 0.02980826 1 0 0 0.999845 0 0.01760919 0.9963968 0 0.08481483 0.995532 0 0.0944251 0.9995556 0 0.02980826 0.9995556 0 0.02980826 0.995532 0 0.0944251 0.9973891 0 0.0722148 0.9998301 0 0.01843859 1 0 0 0.9995556 0 0.02980826 0.9998301 0 0.01843859 1 0 0 0.9498582 0 0.312681 0.9608613 0 0.2770301 0.9779077 0 0.2090372 0.982371 0 0.1869421 0.9608613 0 0.2770301 0.9928595 0 0.1192897 0.9954063 0 0.09574217 0.9779077 0 0.2090372 0.9779077 0 0.2090372 0.9954063 0 0.09574217 0.9973891 0 0.0722148 0.995532 0 0.0944251 0.982371 0 0.1869421 0.9779077 0 0.2090372 0.995532 0 0.0944251 0.9963968 0 0.08481483 1 0 0 1 0 0 0.9997037 0 0.02434182 0.999611 0 0.02789328 1 0 0 1 0 0 0.9998301 0 0.01843859 0.9997037 0 0.02434182 0.9997037 0 0.02434182 0.9998301 0 0.01843859 0.9973891 0 0.0722148 0.9954063 0 0.09574217 0.999611 0 0.02789328 0.9997037 0 0.02434182 0.9954063 0 0.09574217 0.9928595 0 0.1192897 1 0 0 0.9999976 0 0.002231035 0.999992 0 0.004012495 1 0 0 0.9999976 0 0.002231035 0.9999415 0 0.01082862 0.9999097 0 0.0134419 0.999992 0 0.004012495 0.999992 0 0.004012495 0.9999097 0 0.0134419 0.9999689 0 0.007900777 0.9999988 0 0.001573693 1 0 0 0.999992 0 0.004012495 0.9999988 0 0.001573693 1 0 0 0.9996466 0 0.02658693 0.9995732 0 0.02921769 0.9997072 0 0.02419752 0.9997401 0 0.02279636 0.9995732 0 0.02921769 0.9999144 0 0.01308993 0.9999403 0 0.01093034 0.9997072 0 0.02419752 0.9997072 0 0.02419752 0.9999403 0 0.01093034 0.9999689 0 0.007900777 0.9999097 0 0.0134419 0.9997401 0 0.02279636 0.9997072 0 0.02419752 0.9999097 0 0.0134419 0.9999415 0 0.01082862 1 0 0 1 0 0 0.9999961 0 0.002818757 0.9999945 0 0.003329282 1 0 0 1 0 0 0.9999988 0 0.001573693 0.9999961 0 0.002818757 0.9999961 0 0.002818757 0.9999988 0 0.001573693 0.9999689 0 0.007900777 0.9999403 0 0.01093034 0.9999945 0 0.003329282 0.9999961 0 0.002818757 0.9999403 0 0.01093034 0.9999144 0 0.01308993 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9985138 0 -0.05450032 0.9988512 0 -0.04792024 0.9996384 0 -0.026891 0.9997044 0 -0.02431907 0.9988512 0 -0.04792024 0.9997975 0 -0.02012396 0.9998843 0 -0.0152147 0.9996384 0 -0.026891 0.9996384 0 -0.026891 0.9998843 0 -0.0152147 0.9999717 0 -0.007536904 0.9999051 0 -0.01377899 0.9997044 0 -0.02431907 0.9996384 0 -0.026891 0.9999051 0 -0.01377899 0.9999263 0 -0.0121465 1 0 0 1 0 0 0.9999946 0 -0.003301836 0.9999893 0 -0.004637348 1 0 0 1 0 0 0.9999989 0 -0.001506307 0.9999946 0 -0.003301836 0.9999946 0 -0.003301836 0.9999989 0 -0.001506307 0.9999717 0 -0.007536904 0.9998843 0 -0.0152147 0.9999893 0 -0.004637348 0.9999946 0 -0.003301836 0.9998843 0 -0.0152147 0.9997975 0 -0.02012396 1 0 0 0.9999965 0 -0.002666577 0.9999928 0 -0.003813401 1 0 0 0.9999965 0 -0.002666577 0.9999263 0 -0.0121465 0.9999051 0 -0.01377899 0.9999928 0 -0.003813401 0.9999928 0 -0.003813401 0.9999051 0 -0.01377899 0.9999717 0 -0.007536904 0.9999989 0 -0.001506307 1 0 0 0.9999928 0 -0.003813401 0.9999989 0 -0.001506307 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999994 0 -0.001091214 0.9999456 0 -0.01043477 0.9999651 0 -0.008362011 0.9999994 0 -0.001091214 0.9999841 0 -0.005645617 0.9999705 0 -0.007685823 0.9999456 0 -0.01043477 0.9999456 0 -0.01043477 0.9999705 0 -0.007685823 0.9992097 0 -0.03975183 0.9987124 0 -0.05073196 0.9999651 0 -0.008362011 0.9999456 0 -0.01043477 0.9987124 0 -0.05073196 0.9988862 0 -0.04718361 0.9992431 0 -0.03890239 0.9998834 0 -0.0152734 0.9997918 0 -0.02040758 0.9998907 0 -0.01479183 0.9998834 0 -0.0152734 0.9985332 0 -0.05414194 0.9972833 0 -0.07366286 0.9997918 0 -0.02040758 0.9997918 0 -0.02040758 0.9972833 0 -0.07366286 0.9992097 0 -0.03975183 0.9999705 0 -0.007685823 0.9998907 0 -0.01479183 0.9997918 0 -0.02040758 0.9999705 0 -0.007685823 0.9999841 0 -0.005645617 0.9638181 0 -0.2665606 0.9859515 0 -0.1670316 0.9851509 0 -0.1716909 0.9837573 0 -0.1795045 0.9859515 0 -0.1670316 0.9988862 0 -0.04718361 0.9987124 0 -0.05073196 0.9851509 0 -0.1716909 0.9851509 0 -0.1716909 0.9987124 0 -0.05073196 0.9992097 0 -0.03975183 0.9972833 0 -0.07366286 0.9837573 0 -0.1795045 0.9851509 0 -0.1716909 0.9972833 0 -0.07366286 0.9985332 0 -0.05414194 1 0 0 0.9999991 0 0.001357041 0.9999973 0 0.002355608 1 0 0 0.9999991 0 0.001357041 0.9999774 0 0.006730302 0.9999731 0 0.007344817 0.9999973 0 0.002355608 0.9999973 0 0.002355608 0.9999731 0 0.007344817 0.9999858 0 0.005345685 0.9999992 0 0.001321171 1 0 0 0.9999973 0 0.002355608 0.9999992 0 0.001321171 1 0 0 0.9998097 0 0.01951087 0.999834 0 0.01822437 0.9998735 0 0.0159143 0.9998839 0 0.01523857 0.999834 0 0.01822437 0.9999719 0 0.007509763 0.9999784 0 0.006583407 0.9998735 0 0.0159143 0.9998735 0 0.0159143 0.9999784 0 0.006583407 0.9999858 0 0.005345685 0.9999731 0 0.007344817 0.9998839 0 0.01523857 0.9998735 0 0.0159143 0.9999731 0 0.007344817 0.9999774 0 0.006730302 1 0 0 1 0 0 0.9999989 0 0.001508181 0.9999986 0 0.001684571 1 0 0 1 0 0 0.9999992 0 0.001321171 0.9999989 0 0.001508181 0.9999989 0 0.001508181 0.9999992 0 0.001321171 0.9999858 0 0.005345685 0.9999784 0 0.006583407 0.9999986 0 0.001684571 0.9999989 0 0.001508181 0.9999784 0 0.006583407 0.9999719 0 0.007509763 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9996862 0 -0.02505147 0.9997425 0 -0.02269216 1 0 0 0.9996862 0 -0.02505147 0.9935188 0 -0.1136689 0.9956771 0 -0.09288264 0.9997425 0 -0.02269216 0.9997425 0 -0.02269216 0.9956771 0 -0.09288264 0.9974716 0 -0.07106671 0.9998394 0 -0.01792978 1 0 0 0.9997425 0 -0.02269216 0.9998394 0 -0.01792978 1 0 0 0.9498574 0 -0.3126836 0.9823685 0 -0.1869553 0.9781419 0 -0.2079385 0.9616645 0 -0.2742288 0.9823685 0 -0.1869553 0.9963971 0 -0.08481012 0.9955637 0 -0.09409115 0.9781419 0 -0.2079385 0.9781419 0 -0.2079385 0.9955637 0 -0.09409115 0.9974716 0 -0.07106671 0.9956771 0 -0.09288264 0.9616645 0 -0.2742288 0.9781419 0 -0.2079385 0.9956771 0 -0.09288264 0.9935188 0 -0.1136689 1 0 0 1 0 0 0.9995584 0 -0.02971559 0.9998451 0 -0.01760622 1 0 0 1 0 0 0.9998394 0 -0.01792978 0.9995584 0 -0.02971559 0.9995584 0 -0.02971559 0.9998394 0 -0.01792978 0.9974716 0 -0.07106671 0.9955637 0 -0.09409115 0.9998451 0 -0.01760622 0.9995584 0 -0.02971559 0.9955637 0 -0.09409115 0.9963971 0 -0.08481012 0.9999909 0 -0.004293885 0.999193 0 0.04016791 0.9997442 0 0.02261854 0.9995014 0 0.03157507 0.999193 0 0.04016791 0.9999964 0 0.002709847 0.9999884 0 -0.0048416 0.9997442 0 0.02261854 0.9997442 0 0.02261854 0.9999884 0 -0.0048416 0.9999824 0 -0.005940779 0.9999449 0 0.01050331 0.9995014 0 0.03157507 0.9997442 0 0.02261854 0.9999449 0 0.01050331 0.9998767 0 0.01570453 0.9981527 0 -0.06075504 0.999532 0 -0.03059229 0.9991253 0 -0.04181793 0.9988633 0 -0.04766591 0.999532 0 -0.03059229 0.9999262 0 -0.01215133 0.9999112 0 -0.01332877 0.9991253 0 -0.04181793 0.9991253 0 -0.04181793 0.9999112 0 -0.01332877 0.9999824 0 -0.005940779 0.9999884 0 -0.0048416 0.9988633 0 -0.04766591 0.9991253 0 -0.04181793 0.9999884 0 -0.0048416 0.9999964 0 0.002709847 1 0 0 0.9999947 0 0.003275151 0.9999998 0 8.07582e-4 0.9999979 0 -0.00206365 0.9999947 0 0.003275151 0.9998767 0 0.01570453 0.9999449 0 0.01050331 0.9999998 0 8.07582e-4 0.9999998 0 8.07582e-4 0.9999449 0 0.01050331 0.9999824 0 -0.005940779 0.9999112 0 -0.01332877 0.9999979 0 -0.00206365 0.9999998 0 8.07582e-4 0.9999112 0 -0.01332877 0.9999262 0 -0.01215133 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9981527 0 -0.06075504 0.9999995 0 -0.001041754 0.9999875 0 -0.005002839 0.999532 0 -0.03059229 0.9999995 0 -0.001041754 0.9981801 0 0.0603042 0.9995827 0 0.02888596 0.9999875 0 -0.005002839 0.9999875 0 -0.005002839 0.9995827 0 0.02888596 0.9999301 0 0.01182693 0.9999975 0 -0.002268768 0.999532 0 -0.03059229 0.9999875 0 -0.005002839 0.9999975 0 -0.002268768 0.9999262 0 -0.01215133 0.9478524 0 0.3187098 0.9844125 0 0.1758757 0.9973128 0 0.07326167 0.9872948 0 0.1589 0.9844125 0 0.1758757 0.9988338 0 0.04828127 0.9995052 0 0.03145607 0.9973128 0 0.07326167 0.9973128 0 0.07326167 0.9995052 0 0.03145607 0.9999301 0 0.01182693 0.9995827 0 0.02888596 0.9872948 0 0.1589 0.9973128 0 0.07326167 0.9995827 0 0.02888596 0.9981801 0 0.0603042 1 0 0 0.9999979 0 -0.00206365 0.9999799 0 0.006339484 0.99995 0 0.01000329 0.9999979 0 -0.00206365 0.9999262 0 -0.01215133 0.9999975 0 -0.002268768 0.9999799 0 0.006339484 0.9999799 0 0.006339484 0.9999975 0 -0.002268768 0.9999301 0 0.01182693 0.9995052 0 0.03145607 0.99995 0 0.01000329 0.9999799 0 0.006339484 0.9995052 0 0.03145607 0.9988338 0 0.04828127 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.982626 0 -0.1855966 0.9975389 0 -0.07011703 0.9971662 0 -0.07523057 0.9964756 0 -0.08388436 0.9975389 0 -0.07011703 0.9749674 0 -0.2223484 0.9697402 0 -0.2441391 0.9971662 0 -0.07523057 0.9971662 0 -0.07523057 0.9697402 0 -0.2441391 0.9880031 0 -0.1544338 0.9990849 0 -0.04277182 0.9964756 0 -0.08388436 0.9971662 0 -0.07523057 0.9990849 0 -0.04277182 0.9994226 0 -0.03398147 0.6974627 0 -0.7166211 0.8271924 0 -0.5619189 0.8719945 0 -0.4895157 0.8390325 0 -0.5440814 0.8271924 0 -0.5619189 0.9709545 0 -0.2392644 0.9825871 0 -0.1858031 0.8719945 0 -0.4895157 0.8719945 0 -0.4895157 0.9825871 0 -0.1858031 0.9880031 0 -0.1544338 0.9697402 0 -0.2441391 0.8390325 0 -0.5440814 0.8719945 0 -0.4895157 0.9697402 0 -0.2441391 0.9749674 0 -0.2223484 1 0 0 0.9999743 0 -0.007189035 0.9993656 0 -0.03561553 0.9988329 0 -0.04830104 0.9999743 0 -0.007189035 0.9994226 0 -0.03398147 0.9990849 0 -0.04277182 0.9993656 0 -0.03561553 0.9993656 0 -0.03561553 0.9990849 0 -0.04277182 0.9880031 0 -0.1544338 0.9825871 0 -0.1858031 0.9988329 0 -0.04830104 0.9993656 0 -0.03561553 0.9825871 0 -0.1858031 0.9709545 0 -0.2392644 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999882 0 -0.004861284 0.9999978 0 -0.002094025 1 0 0 1 0 0 0.999992 0 -0.004025071 0.9999882 0 -0.004861284 0.9999882 0 -0.004861284 0.999992 0 -0.004025071 0.999886 0 -0.01509869 0.9998899 0 -0.01484291 0.9999978 0 -0.002094025 0.9999882 0 -0.004861284 0.9998899 0 -0.01484291 0.9999592 0 -0.009043229 0.9999973 0 -0.002359462 0.9999986 0 -0.00165232 0.9999881 0 -0.004885113 0.9999998 0 7.50661e-4 0.9999986 0 -0.00165232 0.9997787 0 -0.02104092 0.9998044 0 -0.01978045 0.9999881 0 -0.004885113 0.9999881 0 -0.004885113 0.9998044 0 -0.01978045 0.999886 0 -0.01509869 0.999992 0 -0.004025071 0.9999998 0 7.50661e-4 0.9999881 0 -0.004885113 0.999992 0 -0.004025071 1 0 0 0.9999909 0 -0.004293885 0.9998391 0 -0.01793684 0.9993831 0 -0.03512272 0.9989348 0 -0.04614438 0.9998391 0 -0.01793684 0.9999592 0 -0.009043229 0.9998899 0 -0.01484291 0.9993831 0 -0.03512272 0.9993831 0 -0.03512272 0.9998899 0 -0.01484291 0.999886 0 -0.01509869 0.9998044 0 -0.01978045 0.9989348 0 -0.04614438 0.9993831 0 -0.03512272 0.9998044 0 -0.01978045 0.9997787 0 -0.02104092 0.9849851 0 0.1726393 0.9872051 0 0.159456 0.9964193 0 0.0845494 0.997545 0 0.07002877 0.9872051 0 0.159456 0.9976554 0 0.06843808 0.9990032 0 0.04463943 0.9964193 0 0.0845494 0.9964193 0 0.0845494 0.9990032 0 0.04463943 0.9997838 0 0.02079891 0.9990146 0 0.04438347 0.997545 0 0.07002877 0.9964193 0 0.0845494 0.9990146 0 0.04438347 0.9997209 0 0.02362389 1 0 0 1 0 0 0.9999576 0 0.009217145 0.9998976 0 0.01431644 1 0 0 1 0 0 0.9999666 0 0.008177551 0.9999576 0 0.009217145 0.9999576 0 0.009217145 0.9999666 0 0.008177551 0.9997838 0 0.02079891 0.9990032 0 0.04463943 0.9998976 0 0.01431644 0.9999576 0 0.009217145 0.9990032 0 0.04463943 0.9976554 0 0.06843808 1 0 0 0.9999928 0 0.003803211 0.9999539 0 0.009608394 1 0 0 0.9999928 0 0.003803211 0.9997209 0 0.02362389 0.9990146 0 0.04438347 0.9999539 0 0.009608394 0.9999539 0 0.009608394 0.9990146 0 0.04438347 0.9997838 0 0.02079891 0.9999666 0 0.008177551 1 0 0 0.9999539 0 0.009608394 0.9999666 0 0.008177551 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 7.59727e-4 0.9999987 0 -0.001644804 0.9999973 0 -0.002362569 0.9999996 0 9.20776e-4 0.9999987 0 -0.001644804 0.9999249 0 -0.01226381 0.9999245 0 -0.01229259 0.9999973 0 -0.002362569 0.9999973 0 -0.002362569 0.9999245 0 -0.01229259 0.9999559 0 -0.009400738 0.9999987 0 -0.001643926 0.9999996 0 9.20776e-4 0.9999973 0 -0.002362569 0.9999987 0 -0.001643926 1 0 3.04853e-4 0.9999931 0 -0.003729071 0.9999187 0 -0.01275625 0.9996793 0 -0.02532563 0.9994576 0 -0.03293437 0.9999187 0 -0.01275625 0.9999611 0 -0.008823508 0.9999276 0 -0.01203204 0.9996793 0 -0.02532563 0.9996793 0 -0.02532563 0.9999276 0 -0.01203204 0.9999559 0 -0.009400738 0.9999245 0 -0.01229259 0.9994576 0 -0.03293437 0.9996793 0 -0.02532563 0.9999245 0 -0.01229259 0.9999249 0 -0.01226381 1 0 0 1 0 0 0.9999959 0 -0.002903125 0.999994 0 -0.00347665 1 0 0 1 0 3.04853e-4 0.9999987 0 -0.001643926 0.9999959 0 -0.002903125 0.9999959 0 -0.002903125 0.9999987 0 -0.001643926 0.9999559 0 -0.009400738 0.9999276 0 -0.01203204 0.999994 0 -0.00347665 0.9999959 0 -0.002903125 0.9999276 0 -0.01203204 0.9999611 0 -0.008823508 1 0 0 1 0 0 0.9999971 0 0.002391699 0.9999984 0 0.001803899 1 0 0 1 0 0 0.999999 0 0.00142203 0.9999971 0 0.002391699 0.9999971 0 0.002391699 0.999999 0 0.00142203 0.9999836 0 0.005733503 0.9999561 0 0.009368875 0.9999984 0 0.001803899 0.9999971 0 0.002391699 0.9999561 0 0.009368875 0.9999714 0 0.007573229 1 0 0 0.9999945 0 0.003329282 0.9999968 0 0.002538173 1 0 0 0.9999945 0 0.003329282 0.9999144 0 0.01308993 0.9999447 0 0.010518 0.9999968 0 0.002538173 0.9999968 0 0.002538173 0.9999447 0 0.010518 0.9999836 0 0.005733503 0.999999 0 0.00142203 1 0 0 0.9999968 0 0.002538173 0.999999 0 0.00142203 1 0 0 0.9996466 0 0.02658693 0.999804 0 0.01980383 0.9998564 0 0.01695319 0.9995732 0 0.02921769 0.999804 0 0.01980383 0.9999714 0 0.007573229 0.9999561 0 0.009368875 0.9998564 0 0.01695319 0.9998564 0 0.01695319 0.9999561 0 0.009368875 0.9999836 0 0.005733503 0.9999447 0 0.010518 0.9995732 0 0.02921769 0.9998564 0 0.01695319 0.9999447 0 0.010518 0.9999144 0 0.01308993 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998704 0 -0.01610818 0.9998254 0 -0.01869285 0.9999687 0 -0.007921038 0.9998704 0 -0.01610818 0.9961124 0 -0.08809161 0.9978852 0 -0.06500082 0.9998254 0 -0.01869285 0.9998254 0 -0.01869285 0.9978852 0 -0.06500082 0.9989423 0 -0.04598261 0.9998724 0 -0.01597345 0.9999687 0 -0.007921038 0.9998254 0 -0.01869285 0.9998724 0 -0.01597345 0.9990939 0 -0.04256221 0.9207047 0 -0.3902603 0.9864933 0 -0.1638016 0.9834559 0 -0.1811481 0.9651017 0 -0.2618757 0.9864933 0 -0.1638016 0.9982651 0 -0.05887935 0.9974224 0 -0.07175361 0.9834559 0 -0.1811481 0.9834559 0 -0.1811481 0.9974224 0 -0.07175361 0.9989423 0 -0.04598261 0.9978852 0 -0.06500082 0.9651017 0 -0.2618757 0.9834559 0 -0.1811481 0.9978852 0 -0.06500082 0.9961124 0 -0.08809161 0.98392 0 -0.1786104 0.9947729 0 -0.1021124 0.9995036 0 -0.03150729 0.999371 0 -0.03546372 0.9947729 0 -0.1021124 0.9990939 0 -0.04256221 0.9998724 0 -0.01597345 0.9995036 0 -0.03150729 0.9995036 0 -0.03150729 0.9998724 0 -0.01597345 0.9989423 0 -0.04598261 0.9974224 0 -0.07175361 0.999371 0 -0.03546372 0.9995036 0 -0.03150729 0.9974224 0 -0.07175361 0.9982651 0 -0.05887935 0.98392 0 -0.1786104 0.9880452 0 -0.1541651 0.995673 0 -0.09292717 0.9947729 0 -0.1021124 0.9880452 0 -0.1541651 0.9981299 0 -0.06112815 0.9986833 0 -0.05130139 0.995673 0 -0.09292717 0.995673 0 -0.09292717 0.9986833 0 -0.05130139 0.9995808 0 -0.02895219 0.9983563 0 -0.05731362 0.9947729 0 -0.1021124 0.995673 0 -0.09292717 0.9983563 0 -0.05731362 0.9990939 0 -0.04256221 1 0 0 1 0 0 0.9999419 0 -0.01077878 0.9999324 0 -0.01162848 1 0 0 1 0 0 0.9999785 0 -0.006565034 0.9999419 0 -0.01077878 0.9999419 0 -0.01077878 0.9999785 0 -0.006565034 0.9995808 0 -0.02895219 0.9986833 0 -0.05130139 0.9999324 0 -0.01162848 0.9999419 0 -0.01077878 0.9986833 0 -0.05130139 0.9981299 0 -0.06112815 1 0 0 0.9999687 0 -0.007921038 0.9997843 0 -0.02077105 1 0 0 0.9999687 0 -0.007921038 0.9990939 0 -0.04256221 0.9983563 0 -0.05731362 0.9997843 0 -0.02077105 0.9997843 0 -0.02077105 0.9983563 0 -0.05731362 0.9995808 0 -0.02895219 0.9999785 0 -0.006565034 1 0 0 0.9997843 0 -0.02077105 0.9999785 0 -0.006565034 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.999998 0 0.002061395 0.9999998 0 -7.98072e-4 0.9999947 0 -0.003267734 0.999998 0 0.002061395 0.9999261 0 0.01215206 0.9999112 0 0.0133309 0.9999998 0 -7.98072e-4 0.9999998 0 -7.98072e-4 0.9999112 0 0.0133309 0.9999824 0 0.005945981 0.999945 0 -0.01049211 0.9999947 0 -0.003267734 0.9999998 0 -7.98072e-4 0.999945 0 -0.01049211 0.9998768 0 -0.01569811 0.9981524 0 0.06076038 0.9988635 0 0.04766377 0.9991255 0 0.04181306 0.9995318 0 0.03059867 0.9988635 0 0.04766377 0.9999964 0 -0.002706588 0.9999883 0 0.004851894 0.9991255 0 0.04181306 0.9991255 0 0.04181306 0.9999883 0 0.004851894 0.9999824 0 0.005945981 0.9999112 0 0.0133309 0.9995318 0 0.03059867 0.9991255 0 0.04181306 0.9999112 0 0.0133309 0.9999261 0 0.01215206 0.9999908 0 0.004294774 0.9995015 0 -0.03157135 0.9997444 0 -0.02261172 0.9991931 0 -0.04016549 0.9995015 0 -0.03157135 0.9998768 0 -0.01569811 0.999945 0 -0.01049211 0.9997444 0 -0.02261172 0.9997444 0 -0.02261172 0.999945 0 -0.01049211 0.9999824 0 0.005945981 0.9999883 0 0.004851894 0.9991931 0 -0.04016549 0.9997444 0 -0.02261172 0.9999883 0 0.004851894 0.9999964 0 -0.002706588 0.9999908 0 0.004294774 0.9999831 0 -0.005822383 0.9998963 0 -0.01439944 0.9995015 0 -0.03157135 0.9999831 0 -0.005822383 0.9999832 0 -0.005802842 0.9999634 0 -0.008560375 0.9998963 0 -0.01439944 0.9998963 0 -0.01439944 0.9999634 0 -0.008560375 0.9999853 0 -0.005434264 0.9999545 0 -0.00954326 0.9995015 0 -0.03157135 0.9998963 0 -0.01439944 0.9999545 0 -0.00954326 0.9998768 0 -0.01569811 1 0 0 1 0 0 0.999997 0 -0.002473778 0.9999985 0 -0.001743703 1 0 0 1 0 0 0.9999989 0 -0.00147507 0.999997 0 -0.002473778 0.999997 0 -0.002473778 0.9999989 0 -0.00147507 0.9999853 0 -0.005434264 0.9999634 0 -0.008560375 0.9999985 0 -0.001743703 0.999997 0 -0.002473778 0.9999634 0 -0.008560375 0.9999832 0 -0.005802842 1 0 0 0.9999947 0 -0.003267734 0.9999959 0 -0.002867178 1 0 0 0.9999947 0 -0.003267734 0.9998768 0 -0.01569811 0.9999545 0 -0.00954326 0.9999959 0 -0.002867178 0.9999959 0 -0.002867178 0.9999545 0 -0.00954326 0.9999853 0 -0.005434264 0.9999989 0 -0.00147507 1 0 0 0.9999959 0 -0.002867178 0.9999989 0 -0.00147507 1 0 0 0.9826232 0 0.1856117 0.9891407 0 0.146972 0.9987047 0 0.05088105 0.9910506 0 0.1334871 0.9891407 0 0.146972 1 0 0 0.9995759 0 -0.02912081 0.9987047 0 0.05088105 0.9987047 0 0.05088105 0.9995759 0 -0.02912081 0.9997765 0 -0.02114003 0.9998485 0 0.01740759 0.9910506 0 0.1334871 0.9987047 0 0.05088105 0.9998485 0 0.01740759 0.998742 0 0.05014608 0.9478589 0 -0.3186903 0.9844134 0 -0.1758706 0.987339 0 -0.1586243 0.9902868 0 -0.1390395 0.9844134 0 -0.1758706 0.998834 0 -0.04827756 0.999212 0 -0.03969136 0.987339 0 -0.1586243 0.987339 0 -0.1586243 0.999212 0 -0.03969136 0.9997765 0 -0.02114003 0.9995759 0 -0.02912081 0.9902868 0 -0.1390395 0.987339 0 -0.1586243 0.9995759 0 -0.02912081 1 0 0 1 0 0 0.9999571 0 0.009269617 0.9999933 0 -0.003671608 0.99995 0 -0.01001115 0.9999571 0 0.009269617 0.998742 0 0.05014608 0.9998485 0 0.01740759 0.9999933 0 -0.003671608 0.9999933 0 -0.003671608 0.9998485 0 0.01740759 0.9997765 0 -0.02114003 0.999212 0 -0.03969136 0.99995 0 -0.01001115 0.9999933 0 -0.003671608 0.999212 0 -0.03969136 0.998834 0 -0.04827756 1 0 0 1 0 0 0.9999195 0 0.01269195 0.9999571 0 0.009269617 1 0 0 1 0 0 0.9999185 0 0.01276514 0.9999195 0 0.01269195 0.9999195 0 0.01269195 0.9999185 0 0.01276514 0.9990648 0 0.04323854 0.9986661 0 0.05163517 0.9999571 0 0.009269617 0.9999195 0 0.01269195 0.9986661 0 0.05163517 0.998742 0 0.05014608 1 0 0 0.9999742 0 0.007197811 0.999917 0 0.01288992 1 0 0 0.9999742 0 0.007197811 0.9994228 0 0.03397258 0.9987566 0 0.04985331 0.999917 0 0.01288992 0.999917 0 0.01288992 0.9987566 0 0.04985331 0.9990648 0 0.04323854 0.9999185 0 0.01276514 1 0 0 0.999917 0 0.01288992 0.9999185 0 0.01276514 1 0 0 0.9826232 0 0.1856117 0.9910506 0 0.1334871 0.9969149 0 0.07849091 0.9964752 0 0.08388904 0.9910506 0 0.1334871 0.998742 0 0.05014608 0.9986661 0 0.05163517 0.9969149 0 0.07849091 0.9969149 0 0.07849091 0.9986661 0 0.05163517 0.9990648 0 0.04323854 0.9987566 0 0.04985331 0.9964752 0 0.08388904 0.9969149 0 0.07849091 0.9987566 0 0.04985331 0.9994228 0 0.03397258 0.9498582 0 0.312681 0.9967138 0 0.08100531 0.9970795 0 0.07637204 0.9838473 0 0.1790096 0.9967138 0 0.08100531 0.9841389 0 0.1773997 0.9775569 0 0.2106717 0.9970795 0 0.07637204 0.9970795 0 0.07637204 0.9775569 0 0.2106717 0.9913735 0 0.1310676 0.9989958 0 0.04480289 0.9838473 0 0.1790096 0.9970795 0 0.07637204 0.9989958 0 0.04480289 0.9971051 0 0.07603619 0.6974394 0 0.7166439 0.82719 0 0.5619224 0.8945922 0 0.4468833 0.8850726 0 0.465453 0.82719 0 0.5619224 0.9709512 0 0.2392781 0.9739608 0 0.2267165 0.8945922 0 0.4468833 0.8945922 0 0.4468833 0.9739608 0 0.2267165 0.9913735 0 0.1310676 0.9775569 0 0.2106717 0.8850726 0 0.465453 0.8945922 0 0.4468833 0.9775569 0 0.2106717 0.9841389 0 0.1773997 1 0 0 0.9998909 0 0.01477232 0.9988858 0 0.04719397 0.9988325 0 0.04830944 0.9998909 0 0.01477232 0.9971051 0 0.07603619 0.9989958 0 0.04480289 0.9988858 0 0.04719397 0.9988858 0 0.04719397 0.9989958 0 0.04480289 0.9913735 0 0.1310676 0.9739608 0 0.2267165 0.9988325 0 0.04830944 0.9988858 0 0.04719397 0.9739608 0 0.2267165 0.9709512 0 0.2392781 1 0 0 1 0 0 0.9995428 0 0.0302363 0.9998909 0 0.01477232 1 0 0 1 0 0 0.9997226 0 0.02355432 0.9995428 0 0.0302363 0.9995428 0 0.0302363 0.9997226 0 0.02355432 0.9960474 0 0.08882385 0.9939216 0 0.1100899 0.9998909 0 0.01477232 0.9995428 0 0.0302363 0.9939216 0 0.1100899 0.9971051 0 0.07603619 1 0 0 0.999611 0 0.02789328 0.9997633 0 0.02176063 1 0 0 0.999611 0 0.02789328 0.9928595 0 0.1192897 0.9950196 0 0.09968066 0.9997633 0 0.02176063 0.9997633 0 0.02176063 0.9950196 0 0.09968066 0.9960474 0 0.08882385 0.9997226 0 0.02355432 1 0 0 0.9997633 0 0.02176063 0.9997226 0 0.02355432 1 0 0 0.9498582 0 0.312681 0.9838473 0 0.1790096 0.9850299 0 0.1723835 0.9608613 0 0.2770301 0.9838473 0 0.1790096 0.9971051 0 0.07603619 0.9939216 0 0.1100899 0.9850299 0 0.1723835 0.9850299 0 0.1723835 0.9939216 0 0.1100899 0.9960474 0 0.08882385 0.9950196 0 0.09968066 0.9608613 0 0.2770301 0.9850299 0 0.1723835 0.9950196 0 0.09968066 0.9928595 0 0.1192897 1 0 0 1 0 0 0.999948 0 -0.01020542 0.99999 0 -0.004460719 1 0 0 1 0 0 0.9999657 0 -0.008294744 0.999948 0 -0.01020542 0.999948 0 -0.01020542 0.9999657 0 -0.008294744 0.9992147 0 -0.03962413 0.9990585 0 -0.04338345 0.99999 0 -0.004460719 0.999948 0 -0.01020542 0.9990585 0 -0.04338345 0.9996836 0 -0.02515465 1 0 0 0.9997931 0 -0.02034573 0.9999455 0 -0.01044951 1 0 0 0.9997931 0 -0.02034573 0.9968104 0 -0.0798065 0.9980963 0 -0.06167374 0.9999455 0 -0.01044951 0.9999455 0 -0.01044951 0.9980963 0 -0.06167374 0.9992147 0 -0.03962413 0.9999657 0 -0.008294744 1 0 0 0.9999455 0 -0.01044951 0.9999657 0 -0.008294744 1 0 0 0.9849839 0 -0.1726465 0.9974977 0 -0.0706985 0.9970149 0 -0.07721 0.9885317 0 -0.1510137 0.9974977 0 -0.0706985 0.9996836 0 -0.02515465 0.9990585 0 -0.04338345 0.9970149 0 -0.07721 0.9970149 0 -0.07721 0.9990585 0 -0.04338345 0.9992147 0 -0.03962413 0.9980963 0 -0.06167374 0.9885317 0 -0.1510137 0.9970149 0 -0.07721 0.9980963 0 -0.06167374 0.9968104 0 -0.0798065 1 0 0 0.999999 0 0.001474389 0.9999935 0 0.003612235 1 0 -1.23146e-4 0.999999 0 0.001474389 0.9999669 0 0.008147229 0.9998983 0 0.01427013 0.9999935 0 0.003612235 0.9999935 0 0.003612235 0.9998983 0 0.01427013 0.9999519 0 0.009816303 0.9999999 0 3.95804e-4 1 0 -1.23146e-4 0.9999935 0 0.003612235 0.9999999 0 3.95804e-4 0.9999999 0 -4.53692e-4 0.9999908 0 0.004294774 0.9990914 0 0.04261986 0.9994735 0 0.03244772 0.9998467 0 0.01750973 0.9990914 0 0.04261986 0.9999154 0 0.01300912 0.9998994 0 0.01418704 0.9994735 0 0.03244772 0.9994735 0 0.03244772 0.9998994 0 0.01418704 0.9999519 0 0.009816303 0.9998983 0 0.01427013 0.9998467 0 0.01750973 0.9994735 0 0.03244772 0.9998983 0 0.01427013 0.9999669 0 0.008147229 1 0 1.34351e-4 0.9999961 0 -0.002819827 1 0 -2.01524e-4 0.9999823 0 -0.005951987 0.9999961 0 -0.002819827 0.9999999 0 -4.53692e-4 0.9999999 0 3.95804e-4 1 0 -2.01524e-4 1 0 -2.01524e-4 0.9999999 0 3.95804e-4 0.9999519 0 0.009816303 0.9998994 0 0.01418704 0.9999823 0 -0.005951987 1 0 -2.01524e-4 0.9998994 0 0.01418704 0.9999154 0 0.01300912 1 0 0 0.9999985 0 -0.001737674 0.9999998 0 6.9225e-4 1 0 0 0.9999985 0 -0.001737674 0.9999739 0 -0.007240298 0.9999993 0 0.001210319 0.9999998 0 6.9225e-4 0.9999998 0 6.9225e-4 0.9999993 0 0.001210319 0.9999925 0 0.003877359 0.9999988 0 0.001573946 1 0 0 0.9999998 0 6.9225e-4 0.9999988 0 0.001573946 1 0 0 0.9999925 0 0.003881238 0.9999207 0 0.01259621 0.9999863 0 0.005243926 0.9998769 0 -0.0156917 0.9999207 0 0.01259621 0.9999645 0 0.008429552 0.9999837 0 0.005708626 0.9999863 0 0.005243926 0.9999863 0 0.005243926 0.9999837 0 0.005708626 0.9999925 0 0.003877359 0.9999993 0 0.001210319 0.9998769 0 -0.0156917 0.9999863 0 0.005243926 0.9999993 0 0.001210319 0.9999739 0 -0.007240298 1 0 0 1 0 0 0.9999984 0 0.001830092 0.9999948 0 0.003256729 1 0 0 1 0 0 0.9999988 0 0.001573946 0.9999984 0 0.001830092 0.9999984 0 0.001830092 0.9999988 0 0.001573946 0.9999925 0 0.003877359 0.9999837 0 0.005708626 0.9999948 0 0.003256729 0.9999984 0 0.001830092 0.9999837 0 0.005708626 0.9999645 0 0.008429552 1 0 1.34351e-4 0.9999973 0 0.002380462 0.9999978 0 0.00213512 0.9999961 0 -0.002819827 0.9999973 0 0.002380462 0.9998151 0 -0.01922759 0.9999429 0 -0.01068661 0.9999978 0 0.00213512 0.9999978 0 0.00213512 0.9999429 0 -0.01068661 0.999988 0 -0.004914475 0.9999995 0 -0.001021183 0.9999961 0 -0.002819827 0.9999978 0 0.00213512 0.9999995 0 -0.001021183 0.9999999 0 -4.53692e-4 0.9999925 0 0.003881238 0.9998769 0 -0.0156917 0.9997662 0 -0.0216245 0.9991673 0 -0.04080112 0.9998769 0 -0.0156917 0.9999739 0 -0.007240298 0.9999554 0 -0.009446781 0.9997662 0 -0.0216245 0.9997662 0 -0.0216245 0.9999554 0 -0.009446781 0.999988 0 -0.004914475 0.9999429 0 -0.01068661 0.9991673 0 -0.04080112 0.9997662 0 -0.0216245 0.9999429 0 -0.01068661 0.9998151 0 -0.01922759 1 0 0 1 0 -1.23146e-4 0.9999987 0 -0.001627858 0.9999985 0 -0.001737674 1 0 -1.23146e-4 0.9999999 0 -4.53692e-4 0.9999995 0 -0.001021183 0.9999987 0 -0.001627858 0.9999987 0 -0.001627858 0.9999995 0 -0.001021183 0.999988 0 -0.004914475 0.9999554 0 -0.009446781 0.9999985 0 -0.001737674 0.9999987 0 -0.001627858 0.9999554 0 -0.009446781 0.9999739 0 -0.007240298 1 0 0 0.9999948 0 0.003256729 0.9999959 0 0.002863533 1 0 0 0.9999948 0 0.003256729 0.9999645 0 0.008429552 0.9999296 0 0.01186921 0.9999959 0 0.002863533 0.9999959 0 0.002863533 0.9999296 0 0.01186921 0.9999561 0 0.009382687 0.9999987 0 0.0016655 1 0 0 0.9999959 0 0.002863533 0.9999987 0 0.0016655 1 0 -2.98818e-4 0.9999925 0 0.003881238 0.9994649 0 0.03271131 0.999683 0 0.02517862 0.9999207 0 0.01259621 0.9994649 0 0.03271131 0.9999253 0 0.01223391 0.9999249 0 0.01225747 0.999683 0 0.02517862 0.999683 0 0.02517862 0.9999249 0 0.01225747 0.9999561 0 0.009382687 0.9999296 0 0.01186921 0.9999207 0 0.01259621 0.999683 0 0.02517862 0.9999296 0 0.01186921 0.9999645 0 0.008429552 0.9999998 0 -7.649e-4 0.9999996 0 -9.33074e-4 0.9999973 0 0.002379935 0.9999987 0 0.001639165 0.9999996 0 -9.33074e-4 1 0 -2.98818e-4 0.9999987 0 0.0016655 0.9999973 0 0.002379935 0.9999973 0 0.002379935 0.9999987 0 0.0016655 0.9999561 0 0.009382687 0.9999249 0 0.01225747 0.9999987 0 0.001639165 0.9999973 0 0.002379935 0.9999249 0 0.01225747 0.9999253 0 0.01223391 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999893 0 -0.004637348 0.9999914 0 -0.004153315 1 0 0 0.9999893 0 -0.004637348 0.9997975 0 -0.02012396 0.9998494 0 -0.0173559 0.9999914 0 -0.004153315 0.9999914 0 -0.004153315 0.9998494 0 -0.0173559 0.9998996 0 -0.01417392 0.9999936 0 -0.003597445 1 0 0 0.9999914 0 -0.004153315 0.9999936 0 -0.003597445 1 0 0 0.9985138 0 -0.05450032 0.9992777 0 -0.03800202 0.9992008 0 -0.03997195 0.9988512 0 -0.04792024 0.9992777 0 -0.03800202 0.9998369 0 -0.01806528 0.9998118 0 -0.01940001 0.9992008 0 -0.03997195 0.9992008 0 -0.03997195 0.9998118 0 -0.01940001 0.9998996 0 -0.01417392 0.9998494 0 -0.0173559 0.9988512 0 -0.04792024 0.9992008 0 -0.03997195 0.9998494 0 -0.0173559 0.9997975 0 -0.02012396 1 0 0 1 0 0 0.9999794 0 -0.006421454 0.9999931 0 -0.003721426 1 0 0 1 0 0 0.9999936 0 -0.003597445 0.9999794 0 -0.006421454 0.9999794 0 -0.006421454 0.9999936 0 -0.003597445 0.9998996 0 -0.01417392 0.9998118 0 -0.01940001 0.9999931 0 -0.003721426 0.9999794 0 -0.006421454 0.9998118 0 -0.01940001 0.9998369 0 -0.01806528 1 0 0 0.9999651 0 -0.008362011 0.9999288 0 -0.01193704 0.9999965 0 -0.002666577 0.9999651 0 -0.008362011 0.9988862 0 -0.04718361 0.9989283 0 -0.04628414 0.9999288 0 -0.01193704 0.9999288 0 -0.01193704 0.9989283 0 -0.04628414 0.9994802 0 -0.03223738 0.9999589 0 -0.009071215 0.9999965 0 -0.002666577 0.9999288 0 -0.01193704 0.9999589 0 -0.009071215 0.9999263 0 -0.0121465 0.9638181 0 -0.2665606 0.9955451 0 -0.094287 0.9931713 0 -0.1166651 0.9859515 0 -0.1670316 0.9955451 0 -0.094287 0.9990994 0 -0.04243366 0.9985003 0 -0.05474661 0.9931713 0 -0.1166651 0.9931713 0 -0.1166651 0.9985003 0 -0.05474661 0.9994802 0 -0.03223738 0.9989283 0 -0.04628414 0.9859515 0 -0.1670316 0.9931713 0 -0.1166651 0.9989283 0 -0.04628414 0.9988862 0 -0.04718361 0.9985138 0 -0.05450032 0.9997044 0 -0.02431907 0.999851 0 -0.01726346 0.9999124 0 -0.01323303 0.9997044 0 -0.02431907 0.9999263 0 -0.0121465 0.9999589 0 -0.009071215 0.999851 0 -0.01726346 0.999851 0 -0.01726346 0.9999589 0 -0.009071215 0.9994802 0 -0.03223738 0.9985003 0 -0.05474661 0.9999124 0 -0.01323303 0.999851 0 -0.01726346 0.9985003 0 -0.05474661 0.9990994 0 -0.04243366 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999905 0 0.004360031 0.9999996 0 -9.24649e-4 0.9999801 0 -0.006324459 0.9999905 0 0.004360031 0.9997151 0 0.02387191 0.9997313 0 0.023185 0.9999996 0 -9.24649e-4 0.9999996 0 -9.24649e-4 0.9997313 0 0.023185 0.9999968 0 0.002538982 0.9996329 0 -0.02709558 0.9999801 0 -0.006324459 0.9999996 0 -9.24649e-4 0.9996329 0 -0.02709558 0.99938 0 -0.03521081 0.9915115 0 0.1300192 0.9973509 0 0.07274196 0.9970804 0 0.0763596 0.9963039 0 0.08589862 0.9973509 0 0.07274196 0.9999449 0 -0.01050971 0.9997087 0 0.02413926 0.9970804 0 0.0763596 0.9970804 0 0.0763596 0.9997087 0 0.02413926 0.9999968 0 0.002538982 0.9997313 0 0.023185 0.9963039 0 0.08589862 0.9970804 0 0.0763596 0.9997313 0 0.023185 0.9997151 0 0.02387191 0.9694325 0 -0.2453582 0.9908751 0 -0.1347834 0.9993746 0 -0.03536178 0.9849998 0 -0.1725558 0.9908751 0 -0.1347834 0.99938 0 -0.03521081 0.9996329 0 -0.02709558 0.9993746 0 -0.03536178 0.9993746 0 -0.03536178 0.9996329 0 -0.02709558 0.9999968 0 0.002538982 0.9997087 0 0.02413926 0.9849998 0 -0.1725558 0.9993746 0 -0.03536178 0.9997087 0 0.02413926 0.9999449 0 -0.01050971 0.9694325 0 -0.2453582 0.9955624 0 -0.09410385 0.994587 0 -0.1039073 0.9908751 0 -0.1347834 0.9955624 0 -0.09410385 0.9991456 0 -0.04132997 0.9986528 0 -0.05189004 0.994587 0 -0.1039073 0.994587 0 -0.1039073 0.9986528 0 -0.05189004 0.9995506 0 -0.02997761 0.9991772 0 -0.04055946 0.9908751 0 -0.1347834 0.994587 0 -0.1039073 0.9991772 0 -0.04055946 0.99938 0 -0.03521081 1 0 0 1 0 0 0.9998972 0 -0.01434451 0.9999651 0 -0.008356124 1 0 0 1 0 0 0.9999821 0 -0.005985053 0.9998972 0 -0.01434451 0.9998972 0 -0.01434451 0.9999821 0 -0.005985053 0.9995506 0 -0.02997761 0.9986528 0 -0.05189004 0.9999651 0 -0.008356124 0.9998972 0 -0.01434451 0.9986528 0 -0.05189004 0.9991456 0 -0.04132997 1 0 0 0.9999801 0 -0.006324459 0.9999534 0 -0.0096596 1 0 0 0.9999801 0 -0.006324459 0.99938 0 -0.03521081 0.9991772 0 -0.04055946 0.9999534 0 -0.0096596 0.9999534 0 -0.0096596 0.9991772 0 -0.04055946 0.9995506 0 -0.02997761 0.9999821 0 -0.005985053 1 0 0 0.9999534 0 -0.0096596 0.9999821 0 -0.005985053 1 0 0 1 0 0 0.9999951 0 -0.003131842 0.9999895 0 -0.004582379 1 0 0 0.9999951 0 -0.003131842 0.9998835 0 -0.01526733 0.9998571 0 -0.01691068 0.9999895 0 -0.004582379 0.9999895 0 -0.004582379 0.9998571 0 -0.01691068 0.9999588 0 -0.009082004 0.9999986 0 -0.001709204 1 0 0 0.9999895 0 -0.004582379 0.9999986 0 -0.001709204 1 0 0 0.9992431 0 -0.03890239 0.9998907 0 -0.01479183 0.9995574 0 -0.02975079 0.9992895 0 -0.03768968 0.9998907 0 -0.01479183 0.9999841 0 -0.005645617 0.9999563 0 -0.009362833 0.9995574 0 -0.02975079 0.9995574 0 -0.02975079 0.9999563 0 -0.009362833 0.9999588 0 -0.009082004 0.9998571 0 -0.01691068 0.9992895 0 -0.03768968 0.9995574 0 -0.02975079 0.9998571 0 -0.01691068 0.9998835 0 -0.01526733 1 0 0 1 0 0 0.9999979 0 -0.002048503 0.9999994 0 -0.001091214 1 0 0 1 0 0 0.9999986 0 -0.001709204 0.9999979 0 -0.002048503 0.9999979 0 -0.002048503 0.9999986 0 -0.001709204 0.9999588 0 -0.009082004 0.9999563 0 -0.009362833 0.9999994 0 -0.001091214 0.9999979 0 -0.002048503 0.9999563 0 -0.009362833 0.9999841 0 -0.005645617 1 0 0 1 0 0 0.9999992 0 0.001353448 0.9999999 0 5.09989e-4 1 0 0 1 0 0 0.9999995 0 0.001067673 0.9999992 0 0.001353448 0.9999992 0 0.001353448 0.9999995 0 0.001067673 0.9999964 0 0.002732614 0.9999889 0 0.004734733 0.9999999 0 5.09989e-4 0.9999992 0 0.001353448 0.9999889 0 0.004734733 0.9999952 0 0.003090205 1 0 0 0.9999986 0 0.001684571 0.9999993 0 0.001202831 1 0 0 0.9999986 0 0.001684571 0.9999719 0 0.007509763 0.9999845 0 0.005582588 0.9999993 0 0.001202831 0.9999993 0 0.001202831 0.9999845 0 0.005582588 0.9999964 0 0.002732614 0.9999995 0 0.001067673 1 0 0 0.9999993 0 0.001202831 0.9999995 0 0.001067673 1 0 0 0.9998097 0 0.01951087 0.9999698 0 0.007766418 0.9999525 0 0.009753964 0.999834 0 0.01822437 0.9999698 0 0.007766418 0.9999952 0 0.003090205 0.9999889 0 0.004734733 0.9999525 0 0.009753964 0.9999525 0 0.009753964 0.9999889 0 0.004734733 0.9999964 0 0.002732614 0.9999845 0 0.005582588 0.999834 0 0.01822437 0.9999525 0 0.009753964 0.9999845 0 0.005582588 0.9999719 0 0.007509763 1 0 0 0.9999999 0 5.09989e-4 0.9998288 0 0.01850281 0.9999447 0 0.01051819 0.9999999 0 5.09989e-4 0.9999952 0 0.003090205 0.9998472 0 0.01748223 0.9998288 0 0.01850281 0.9998288 0 0.01850281 0.9998472 0 0.01748223 0.998049 0 0.06243729 0.9970305 0 0.07700903 0.9999447 0 0.01051819 0.9998288 0 0.01850281 0.9970305 0 0.07700903 0.998031 0 0.06272461 0.9998097 0 0.01951087 0.9999095 0 0.01346385 0.9997771 0 0.0211156 0.9999698 0 0.007766418 0.9999095 0 0.01346385 0.9969013 0 0.0786633 0.9963675 0 0.08515792 0.9997771 0 0.0211156 0.9997771 0 0.0211156 0.9963675 0 0.08515792 0.998049 0 0.06243729 0.9998472 0 0.01748223 0.9999698 0 0.007766418 0.9997771 0 0.0211156 0.9998472 0 0.01748223 0.9999952 0 0.003090205 0.882978 0 0.4694146 0.9608902 0 0.2769297 0.9811869 0 0.1930602 0.9829774 0 0.1837267 0.9608902 0 0.2769297 0.998031 0 0.06272461 0.9970305 0 0.07700903 0.9811869 0 0.1930602 0.9811869 0 0.1930602 0.9970305 0 0.07700903 0.998049 0 0.06243729 0.9963675 0 0.08515792 0.9829774 0 0.1837267 0.9811869 0 0.1930602 0.9963675 0 0.08515792 0.9969013 0 0.0786633 1 0 0 1 0 0 0.9999074 0 -0.01361273 0.9988009 0 -0.04895626 1 0 0 1 0 0 0.9999776 0 -0.006702408 0.9999074 0 -0.01361273 0.9999074 0 -0.01361273 0.9999776 0 -0.006702408 0.9999689 0 -0.007891154 0.9986517 0 -0.05191037 0.9988009 0 -0.04895626 0.9999074 0 -0.01361273 0.9986517 0 -0.05191037 0.9974694 0 -0.07109787 1 0 0 0.9999447 0 0.01051819 0.9999852 0 0.005440606 1 0 0 0.9999447 0 0.01051819 0.998031 0 0.06272461 0.9997082 0 0.02415751 0.9999852 0 0.005440606 0.9999852 0 0.005440606 0.9997082 0 0.02415751 0.9999689 0 -0.007891154 0.9999776 0 -0.006702408 1 0 0 0.9999852 0 0.005440606 0.9999776 0 -0.006702408 1 0 0 0.882978 0 0.4694146 0.9607499 0 0.2774163 0.9996718 0 0.02561793 0.9608902 0 0.2769297 0.9607499 0 0.2774163 0.9974694 0 -0.07109787 0.9986517 0 -0.05191037 0.9996718 0 0.02561793 0.9996718 0 0.02561793 0.9986517 0 -0.05191037 0.9999689 0 -0.007891154 0.9997082 0 0.02415751 0.9608902 0 0.2769297 0.9996718 0 0.02561793 0.9997082 0 0.02415751 0.998031 0 0.06272461 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999678 0 0.008038947 0.9998975 0 0.01432458 1 0 0 0.9999678 0 0.008038947 0.9990608 0 0.04333154 0.9988004 0 0.04896758 0.9998975 0 0.01432458 0.9998975 0 0.01432458 0.9988004 0 0.04896758 0.9993837 0 0.03510168 0.9999658 0 0.008275264 1 0 0 0.9998975 0 0.01432458 0.9999658 0 0.008275264 1 0 0 0.9839208 0 0.1786054 0.9879525 0 0.1547575 0.9934459 0 0.1143034 0.9946877 0 0.1029391 0.9879525 0 0.1547575 0.9980513 0 0.06239809 0.9988366 0 0.04822235 0.9934459 0 0.1143034 0.9934459 0 0.1143034 0.9988366 0 0.04822235 0.9993837 0 0.03510168 0.9988004 0 0.04896758 0.9946877 0 0.1029391 0.9934459 0 0.1143034 0.9988004 0 0.04896758 0.9990608 0 0.04333154 1 0 0 1 0 0 0.9999352 0 0.01139054 0.9999253 0 0.01222851 1 0 0 1 0 0 0.9999658 0 0.008275264 0.9999352 0 0.01139054 0.9999352 0 0.01139054 0.9999658 0 0.008275264 0.9993837 0 0.03510168 0.9988366 0 0.04822235 0.9999253 0 0.01222851 0.9999352 0 0.01139054 0.9988366 0 0.04822235 0.9980513 0 0.06239809 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 2.34501e-4 0.9999982 0 0.001885214 1 0 0 1 0 0 0.9999998 0 -8.21484e-4 1 0 2.34501e-4 1 0 2.34501e-4 0.9999998 0 -8.21484e-4 0.999999 0 -0.001421707 0.9999995 0 -0.001109744 0.9999982 0 0.001885214 1 0 2.34501e-4 0.9999995 0 -0.001109744 0.9999813 0 0.006121015 1 0 0 0.9999978 0 -0.002094025 0.9999999 0 -4.68706e-4 1 0 0 0.9999978 0 -0.002094025 0.9999592 0 -0.009043229 0.9999961 0 -0.002821596 0.9999999 0 -4.68706e-4 0.9999999 0 -4.68706e-4 0.9999961 0 -0.002821596 0.999999 0 -0.001421707 0.9999998 0 -8.21484e-4 1 0 0 0.9999999 0 -4.68706e-4 0.9999998 0 -8.21484e-4 1 0 0 0.9999909 0 -0.004293885 0.9999822 0 0.005962855 0.9999849 0 -0.005503957 0.9998391 0 -0.01793684 0.9999822 0 0.005962855 0.9999813 0 0.006121015 0.9999995 0 -0.001109744 0.9999849 0 -0.005503957 0.9999849 0 -0.005503957 0.9999995 0 -0.001109744 0.999999 0 -0.001421707 0.9999961 0 -0.002821596 0.9998391 0 -0.01793684 0.9999849 0 -0.005503957 0.9999961 0 -0.002821596 0.9999592 0 -0.009043229 1 0 0 1 0 0 0.999996 0 0.002846839 0.9999947 0 0.003275151 1 0 0 1 0 0 0.999999 0 0.001458412 0.999996 0 0.002846839 0.999996 0 0.002846839 0.999999 0 0.001458412 0.9999854 0 0.005417827 0.9999547 0 0.009527504 0.9999947 0 0.003275151 0.999996 0 0.002846839 0.9999547 0 0.009527504 0.9998767 0 0.01570453 1 0 0 0.9999982 0 0.001885214 0.9999969 0 0.002510082 1 0 0 0.9999982 0 0.001885214 0.9999813 0 0.006121015 0.9999628 0 0.008628813 0.9999969 0 0.002510082 0.9999969 0 0.002510082 0.9999628 0 0.008628813 0.9999854 0 0.005417827 0.999999 0 0.001458412 1 0 0 0.9999969 0 0.002510082 0.999999 0 0.001458412 1 0 0 0.9999909 0 -0.004293885 0.9995014 0 0.03157507 0.9998962 0 0.01441307 0.9999822 0 0.005962855 0.9995014 0 0.03157507 0.9998767 0 0.01570453 0.9999547 0 0.009527504 0.9998962 0 0.01441307 0.9998962 0 0.01441307 0.9999547 0 0.009527504 0.9999854 0 0.005417827 0.9999628 0 0.008628813 0.9999822 0 0.005962855 0.9998962 0 0.01441307 0.9999628 0 0.008628813 0.9999813 0 0.006121015 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9988329 0 -0.04830104 0.9988859 0 -0.04719339 0.999891 0 -0.01476525 0.9988329 0 -0.04830104 0.9709545 0 -0.2392644 0.9739563 0 -0.2267359 0.9988859 0 -0.04719339 0.9988859 0 -0.04719339 0.9739563 0 -0.2267359 0.9913709 0 -0.1310874 0.9989955 0 -0.04481169 0.999891 0 -0.01476525 0.9988859 0 -0.04719339 0.9989955 0 -0.04481169 0.9971046 0 -0.07604313 0.6974627 0 -0.7166211 0.8850905 0 -0.465419 0.8945982 0 -0.4468713 0.8271924 0 -0.5619189 0.8850905 0 -0.465419 0.9841458 0 -0.1773621 0.9775592 0 -0.210661 0.8945982 0 -0.4468713 0.8945982 0 -0.4468713 0.9775592 0 -0.210661 0.9913709 0 -0.1310874 0.9739563 0 -0.2267359 0.8271924 0 -0.5619189 0.8945982 0 -0.4468713 0.9739563 0 -0.2267359 0.9709545 0 -0.2392644 0.9498574 0 -0.3126836 0.9838476 0 -0.1790084 0.9970801 0 -0.07636386 0.9967157 0 -0.08098112 0.9838476 0 -0.1790084 0.9971046 0 -0.07604313 0.9989955 0 -0.04481169 0.9970801 0 -0.07636386 0.9970801 0 -0.07636386 0.9989955 0 -0.04481169 0.9913709 0 -0.1310874 0.9775592 0 -0.210661 0.9967157 0 -0.08098112 0.9970801 0 -0.07636386 0.9775592 0 -0.210661 0.9841458 0 -0.1773621 0.9498574 0 -0.3126836 0.9616645 0 -0.2742288 0.9856634 0 -0.1687242 0.9838476 0 -0.1790084 0.9616645 0 -0.2742288 0.9935188 0 -0.1136689 0.9955671 0 -0.09405482 0.9856634 0 -0.1687242 0.9856634 0 -0.1687242 0.9955671 0 -0.09405482 0.9963875 0 -0.08492264 0.9940583 0 -0.1088504 0.9838476 0 -0.1790084 0.9856634 0 -0.1687242 0.9940583 0 -0.1088504 0.9971046 0 -0.07604313 1 0 0 1 0 0 0.9998112 0 -0.01943403 0.9996862 0 -0.02505147 1 0 0 1 0 0 0.9997494 0 -0.02238782 0.9998112 0 -0.01943403 0.9998112 0 -0.01943403 0.9997494 0 -0.02238782 0.9963875 0 -0.08492264 0.9955671 0 -0.09405482 0.9996862 0 -0.02505147 0.9998112 0 -0.01943403 0.9955671 0 -0.09405482 0.9935188 0 -0.1136689 1 0 0 0.999891 0 -0.01476525 0.9995539 0 -0.02987044 1 0 0 0.999891 0 -0.01476525 0.9971046 0 -0.07604313 0.9940583 0 -0.1088504 0.9995539 0 -0.02987044 0.9995539 0 -0.02987044 0.9940583 0 -0.1088504 0.9963875 0 -0.08492264 0.9997494 0 -0.02238782 1 0 0 0.9995539 0 -0.02987044 0.9997494 0 -0.02238782 1 0 0 1 0 0 0.99995 0 0.01000329 0.9999934 0 0.003661855 0.999957 0 -0.009276941 0.99995 0 0.01000329 0.9988338 0 0.04828127 0.9992116 0 0.03970151 0.9999934 0 0.003661855 0.9999934 0 0.003661855 0.9992116 0 0.03970151 0.9997762 0 0.02115626 0.9998487 0 -0.01739796 0.999957 0 -0.009276941 0.9999934 0 0.003661855 0.9998487 0 -0.01739796 0.9987417 0 -0.05015137 0.9478524 0 0.3187098 0.9902877 0 0.1390341 0.9873392 0 0.1586234 0.9844125 0 0.1758757 0.9902877 0 0.1390341 1 0 0 0.9995763 0 0.02910911 0.9873392 0 0.1586234 0.9873392 0 0.1586234 0.9995763 0 0.02910911 0.9997762 0 0.02115626 0.9992116 0 0.03970151 0.9844125 0 0.1758757 0.9873392 0 0.1586234 0.9992116 0 0.03970151 0.9988338 0 0.04828127 0.982626 0 -0.1855966 0.99105 0 -0.1334916 0.9987047 0 -0.05088183 0.9891419 0 -0.146964 0.99105 0 -0.1334916 0.9987417 0 -0.05015137 0.9998487 0 -0.01739796 0.9987047 0 -0.05088183 0.9987047 0 -0.05088183 0.9998487 0 -0.01739796 0.9997762 0 0.02115626 0.9995763 0 0.02910911 0.9891419 0 -0.146964 0.9987047 0 -0.05088183 0.9995763 0 0.02910911 1 0 0 0.982626 0 -0.1855966 0.9964756 0 -0.08388436 0.9969143 0 -0.07849732 0.99105 0 -0.1334916 0.9964756 0 -0.08388436 0.9994226 0 -0.03398147 0.9987565 0 -0.04985542 0.9969143 0 -0.07849732 0.9969143 0 -0.07849732 0.9987565 0 -0.04985542 0.9990642 0 -0.04325257 0.9986655 0 -0.05164603 0.99105 0 -0.1334916 0.9969143 0 -0.07849732 0.9986655 0 -0.05164603 0.9987417 0 -0.05015137 1 0 0 1 0 0 0.999917 0 -0.01288547 0.9999743 0 -0.007189035 1 0 0 1 0 0 0.9999183 0 -0.01277928 0.999917 0 -0.01288547 0.999917 0 -0.01288547 0.9999183 0 -0.01277928 0.9990642 0 -0.04325257 0.9987565 0 -0.04985542 0.9999743 0 -0.007189035 0.999917 0 -0.01288547 0.9987565 0 -0.04985542 0.9994226 0 -0.03398147 1 0 0 0.999957 0 -0.009276941 0.9999194 0 -0.01269886 1 0 0 0.999957 0 -0.009276941 0.9987417 0 -0.05015137 0.9986655 0 -0.05164603 0.9999194 0 -0.01269886 0.9999194 0 -0.01269886 0.9986655 0 -0.05164603 0.9990642 0 -0.04325257 0.9999183 0 -0.01277928 1 0 0 0.9999194 0 -0.01269886 0.9999183 0 -0.01277928 1 0 0 0.9839208 0 0.1786054 0.9993713 0 0.03545535 0.9994822 0 0.03217634 0.9947374 0 0.1024574 0.9993713 0 0.03545535 0.9982662 0 0.05886244 0.9973907 0 0.07219363 0.9994822 0 0.03217634 0.9994822 0 0.03217634 0.9973907 0 0.07219363 0.9989137 0 0.04659889 0.9998428 0 0.017738 0.9947374 0 0.1024574 0.9994822 0 0.03217634 0.9998428 0 0.017738 0.9988545 0 0.04785127 0.9207132 0 0.3902401 0.9648318 0 0.2628684 0.9833932 0 0.1814878 0.9864995 0 0.1637646 0.9648318 0 0.2628684 0.9959393 0 0.09002821 0.9978187 0 0.06601379 0.9833932 0 0.1814878 0.9833932 0 0.1814878 0.9978187 0 0.06601379 0.9989137 0 0.04659889 0.9973907 0 0.07219363 0.9864995 0 0.1637646 0.9833932 0 0.1814878 0.9973907 0 0.07219363 0.9982662 0 0.05886244 1 0 0 0.99997 0 0.007746811 0.9997428 0 0.02268204 0.9998561 0 0.01696698 0.99997 0 0.007746811 0.9988545 0 0.04785127 0.9998428 0 0.017738 0.9997428 0 0.02268204 0.9997428 0 0.02268204 0.9998428 0 0.017738 0.9989137 0 0.04659889 0.9978187 0 0.06601379 0.9998561 0 0.01696698 0.9997428 0 0.02268204 0.9978187 0 0.06601379 0.9959393 0 0.09002821 1 0 0 1 0 0 0.9997767 0 0.02113467 0.99997 0 0.007746811 1 0 0 1 0 0 0.9999767 0 0.006829492 0.9997767 0 0.02113467 0.9997767 0 0.02113467 0.9999767 0 0.006829492 0.9995559 0 0.02980152 0.9983146 0 0.05803462 0.99997 0 0.007746811 0.9997767 0 0.02113467 0.9983146 0 0.05803462 0.9988545 0 0.04785127 1 0 0 0.9999253 0 0.01222851 0.9999342 0 0.0114712 1 0 0 0.9999253 0 0.01222851 0.9980513 0 0.06239809 0.9986096 0 0.05271612 0.9999342 0 0.0114712 0.9999342 0 0.0114712 0.9986096 0 0.05271612 0.9995559 0 0.02980152 0.9999767 0 0.006829492 1 0 0 0.9999342 0 0.0114712 0.9999767 0 0.006829492 1 0 0 0.9839208 0 0.1786054 0.9947374 0 0.1024574 0.9955775 0 0.09394433 0.9879525 0 0.1547575 0.9947374 0 0.1024574 0.9988545 0 0.04785127 0.9983146 0 0.05803462 0.9955775 0 0.09394433 0.9955775 0 0.09394433 0.9983146 0 0.05803462 0.9995559 0 0.02980152 0.9986096 0 0.05271612 0.9879525 0 0.1547575 0.9955775 0 0.09394433 0.9986096 0 0.05271612 0.9980513 0 0.06239809 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 2.57457e-4 0.9999947 0 -0.003269771 0.9999941 0 -0.003440088 1 0 0 0.9999947 0 -0.003269771 0.9999647 0 -0.008410829 0.999981 0 -0.006168491 0.9999941 0 -0.003440088 0.9999941 0 -0.003440088 0.999981 0 -0.006168491 0.9999943 0 -0.003380765 0.9999997 0 -8.71484e-4 1 0 0 0.9999941 0 -0.003440088 0.9999997 0 -8.71484e-4 1 0 0 0.9999973 0 -0.002359462 0.9999998 0 7.50661e-4 0.9999865 0 -0.005192259 0.9999544 0 -0.009559966 0.9999998 0 7.50661e-4 1 0 0 0.9999982 0 -0.001920819 0.9999865 0 -0.005192259 0.9999865 0 -0.005192259 0.9999982 0 -0.001920819 0.9999943 0 -0.003380765 0.999981 0 -0.006168491 0.9999544 0 -0.009559966 0.9999865 0 -0.005192259 0.999981 0 -0.006168491 0.9999647 0 -0.008410829 1 0 0 1 0 0 0.9999999 0 -5.05437e-4 1 0 0 1 0 0 1 0 0 0.9999997 0 -8.71484e-4 0.9999999 0 -5.05437e-4 0.9999999 0 -5.05437e-4 0.9999997 0 -8.71484e-4 0.9999943 0 -0.003380765 0.9999982 0 -0.001920819 1 0 0 0.9999999 0 -5.05437e-4 0.9999982 0 -0.001920819 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999994 0 0.00109938 0.9999955 0 0.003033864 1 0 1.52247e-4 0.9999994 0 0.00109938 0.9999741 0 0.007202303 0.9999338 0 0.01150639 0.9999955 0 0.003033864 0.9999955 0 0.003033864 0.9999338 0 0.01150639 0.9999782 0 0.006596141 0.9999989 0 0.001569184 1 0 1.52247e-4 0.9999955 0 0.003033864 0.9999989 0 0.001569184 0.9999994 0 0.001082557 0.9999931 0 -0.003729071 0.9991082 0 0.04222446 0.9997356 0 0.02299638 0.9998723 0 0.01598609 0.9991082 0 0.04222446 0.9997649 0 0.02168377 0.9999172 0 0.01286996 0.9997356 0 0.02299638 0.9997356 0 0.02299638 0.9999172 0 0.01286996 0.9999782 0 0.006596141 0.9999338 0 0.01150639 0.9998723 0 0.01598609 0.9997356 0 0.02299638 0.9999338 0 0.01150639 0.9999741 0 0.007202303 0.9999955 0 0.003020834 0.9999869 0 0.005125094 0.9999987 0 -0.001616147 0.9999992 0 -0.001290123 0.9999869 0 0.005125094 0.9999994 0 0.001082557 0.9999989 0 0.001569184 0.9999987 0 -0.001616147 0.9999987 0 -0.001616147 0.9999989 0 0.001569184 0.9999782 0 0.006596141 0.9999172 0 0.01286996 0.9999992 0 -0.001290123 0.9999987 0 -0.001616147 0.9999172 0 0.01286996 0.9997649 0 0.02168377 1 0 0 0.999994 0 -0.00347665 0.9999979 0 -0.002068261 1 0 0 0.999994 0 -0.00347665 0.9999611 0 -0.008823508 0.9999821 0 -0.005997273 0.9999979 0 -0.002068261 0.9999979 0 -0.002068261 0.9999821 0 -0.005997273 0.9999921 0 -0.003976386 0.9999989 0 -0.001556017 1 0 0 0.9999979 0 -0.002068261 0.9999989 0 -0.001556017 1 0 0 0.9999931 0 -0.003729071 0.9998723 0 0.01598609 0.9999856 0 -0.005385527 0.9999187 0 -0.01275625 0.9998723 0 0.01598609 0.9999741 0 0.007202303 0.9999994 0 -0.001084363 0.9999856 0 -0.005385527 0.9999856 0 -0.005385527 0.9999994 0 -0.001084363 0.9999921 0 -0.003976386 0.9999821 0 -0.005997273 0.9999187 0 -0.01275625 0.9999856 0 -0.005385527 0.9999821 0 -0.005997273 0.9999611 0 -0.008823508 1 0 0 1 0 0 0.9999999 0 -6.17357e-4 0.9999994 0 0.00109938 1 0 0 1 0 0 0.9999989 0 -0.001556017 0.9999999 0 -6.17357e-4 0.9999999 0 -6.17357e-4 0.9999989 0 -0.001556017 0.9999921 0 -0.003976386 0.9999994 0 -0.001084363 0.9999994 0 0.00109938 0.9999999 0 -6.17357e-4 0.9999994 0 -0.001084363 0.9999741 0 0.007202303 1 0 2.57457e-4 1 0 0 0.99999 0 0.004479862 0.9999314 0 0.01172127 1 0 0 1 0 0 0.9999982 0 0.001958467 0.99999 0 0.004479862 0.99999 0 0.004479862 0.9999982 0 0.001958467 0.9999683 0 0.007971155 0.999901 0 0.01407445 0.9999314 0 0.01172127 0.99999 0 0.004479862 0.999901 0 0.01407445 0.9997757 0 0.02117876 1 0 0 1 0 1.52247e-4 0.9999994 0 0.001158114 1 0 0 1 0 1.52247e-4 0.9999994 0 0.001082557 0.9999915 0 0.004136093 0.9999994 0 0.001158114 0.9999994 0 0.001158114 0.9999915 0 0.004136093 0.9999683 0 0.007971155 0.9999982 0 0.001958467 1 0 0 0.9999994 0 0.001158114 0.9999982 0 0.001958467 1 0 0 0.9999955 0 0.003020834 0.9997928 0 0.02035825 0.9999442 0 0.01057577 0.9999869 0 0.005125094 0.9997928 0 0.02035825 0.9997757 0 0.02117876 0.999901 0 0.01407445 0.9999442 0 0.01057577 0.9999442 0 0.01057577 0.999901 0 0.01407445 0.9999683 0 0.007971155 0.9999915 0 0.004136093 0.9999869 0 0.005125094 0.9999442 0 0.01057577 0.9999915 0 0.004136093 0.9999994 0 0.001082557 1 0 0 0.9998561 0 0.01696698 0.9998131 0 0.01933501 0.9999928 0 0.003803211 0.9998561 0 0.01696698 0.9959393 0 0.09002821 0.9973165 0 0.07320993 0.9998131 0 0.01933501 0.9998131 0 0.01933501 0.9973165 0 0.07320993 0.9979466 0 0.06405301 0.9997992 0 0.0200395 0.9999928 0 0.003803211 0.9998131 0 0.01933501 0.9997992 0 0.0200395 0.9997209 0 0.02362389 0.9207132 0 0.3902401 0.9646875 0 0.2633972 0.9891639 0 0.1468163 0.9648318 0 0.2628684 0.9646875 0 0.2633972 0.9968122 0 0.07978406 0.9958095 0 0.09145251 0.9891639 0 0.1468163 0.9891639 0 0.1468163 0.9958095 0 0.09145251 0.9979466 0 0.06405301 0.9973165 0 0.07320993 0.9648318 0 0.2628684 0.9891639 0 0.1468163 0.9973165 0 0.07320993 0.9959393 0 0.09002821 0.9849851 0 0.1726393 0.997545 0 0.07002877 0.9994995 0 0.03163692 0.9996808 0 0.0252667 0.997545 0 0.07002877 0.9997209 0 0.02362389 0.9997992 0 0.0200395 0.9994995 0 0.03163692 0.9994995 0 0.03163692 0.9997992 0 0.0200395 0.9979466 0 0.06405301 0.9958095 0 0.09145251 0.9996808 0 0.0252667 0.9994995 0 0.03163692 0.9958095 0 0.09145251 0.9968122 0 0.07978406 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1.67007e-4 1 0 0 1 0 0 1 0 1.67007e-4 1 0 3.04853e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1.21318e-4 1 0 0 1 0 0 1 0 1.21318e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 7.59727e-4 0.9999996 0 9.20776e-4 1 0 4.3257e-4 1 0 0 0.9999996 0 9.20776e-4 1 0 3.04853e-4 1 0 1.67007e-4 1 0 4.3257e-4 1 0 4.3257e-4 1 0 1.67007e-4 1 0 0 1 0 1.21318e-4 1 0 0 1 0 4.3257e-4 1 0 1.21318e-4 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape4-texbinormals-array" count="4416" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape4-vertices" name="qt_gauge_background_Shape4-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape4-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape4-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape4-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape4-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="2208">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape4-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape4-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape4-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape4-texbinormals" offset="2" set="0"/>
+ <p>62 62 0 869 869 1 874 874 3 874 874 3 869 869 1 317 317 2 869 869 4 159 159 5 317 317 7 317 317 7 159 159 5 593 593 6 317 317 8 593 593 9 595 595 11 595 595 11 593 593 9 225 67 10 874 874 12 317 317 13 161 161 15 161 161 15 317 317 13 595 595 14 66 66 16 871 871 17 870 870 19 870 870 19 871 871 17 318 318 18 160 160 21 594 594 22 871 871 20 871 871 20 594 594 22 318 318 23 594 594 25 225 67 26 318 318 24 318 318 24 225 67 26 593 593 27 318 318 29 593 593 30 870 870 28 870 870 28 593 593 30 159 159 31 64 64 32 873 873 33 872 872 35 872 872 35 873 873 33 319 319 34 873 873 36 161 161 37 319 319 39 319 319 39 161 161 37 595 595 38 595 595 41 225 67 42 319 319 40 319 319 40 225 67 42 594 594 43 872 872 44 319 319 45 160 160 47 160 160 47 319 319 45 594 594 46 875 875 49 320 320 50 36 36 48 36 36 48 320 320 50 880 880 51 875 875 52 162 162 53 320 320 55 320 320 55 162 162 53 596 596 54 596 596 57 226 68 58 320 320 56 320 320 56 226 68 58 598 598 59 320 320 61 598 598 62 880 880 60 880 880 60 598 598 62 164 164 63 877 877 65 321 321 66 9 9 64 9 9 64 321 321 66 876 876 67 163 163 69 597 597 70 877 877 68 877 877 68 597 597 70 321 321 71 597 597 73 226 68 74 321 321 72 321 321 72 226 68 74 596 596 75 321 321 77 596 596 78 876 876 76 876 876 76 596 596 78 162 162 79 38 38 80 879 879 81 878 878 83 878 878 83 879 879 81 322 322 82 879 879 84 164 164 85 322 322 87 322 322 87 164 164 85 598 598 86 322 322 88 598 598 89 597 597 91 597 597 91 598 598 89 226 68 90 878 878 92 322 322 93 163 163 95 163 163 95 322 322 93 597 597 94 33 33 96 881 881 97 886 886 99 886 886 99 881 881 97 323 323 98 881 881 100 165 165 101 323 323 103 323 323 103 165 165 101 599 599 102 323 323 104 599 599 105 601 601 107 601 601 107 599 599 105 227 69 106 886 886 108 323 323 109 167 167 111 167 167 111 323 323 109 601 601 110 883 883 113 324 324 114 13 13 112 13 13 112 324 324 114 882 882 115 166 166 117 600 600 118 883 883 116 883 883 116 600 600 118 324 324 119 600 600 121 227 69 122 324 324 120 324 324 120 227 69 122 599 599 123 324 324 125 599 599 126 882 882 124 882 882 124 599 599 126 165 165 127 11 11 128 885 885 129 884 884 131 884 884 131 885 885 129 325 325 130 167 167 133 601 601 134 885 885 132 885 885 132 601 601 134 325 325 135 325 325 136 601 601 137 600 600 139 600 600 139 601 601 137 227 69 138 884 884 140 325 325 141 166 166 143 166 166 143 325 325 141 600 600 142 33 33 144 887 887 145 892 892 147 892 892 147 887 887 145 326 326 146 168 168 149 602 602 150 887 887 148 887 887 148 602 602 150 326 326 151 602 602 153 228 70 154 326 326 152 326 326 152 228 70 154 604 604 155 326 326 157 604 604 158 892 892 156 892 892 156 604 604 158 170 170 159 889 889 161 327 327 162 27 27 160 27 27 160 327 327 162 888 888 163 169 169 165 603 603 166 889 889 164 889 889 164 603 603 166 327 327 167 603 603 169 228 70 170 327 327 168 327 327 168 228 70 170 602 602 171 327 327 173 602 602 174 888 888 172 888 888 172 602 602 174 168 168 175 32 32 176 891 891 177 890 890 179 890 890 179 891 891 177 328 328 178 891 891 180 170 170 181 328 328 183 328 328 183 170 170 181 604 604 182 328 328 184 604 604 185 603 603 187 603 603 187 604 604 185 228 70 186 890 890 188 328 328 189 169 169 191 169 169 191 328 328 189 603 603 190 19 19 192 893 893 193 898 898 195 898 898 195 893 893 193 329 329 194 893 893 196 171 171 197 329 329 199 329 329 199 171 171 197 605 605 198 329 329 200 605 605 201 607 607 203 607 607 203 605 605 201 229 71 202 898 898 204 329 329 205 173 173 207 173 173 207 329 329 205 607 607 206 17 17 208 895 895 209 894 894 211 894 894 211 895 895 209 330 330 210 172 172 213 606 606 214 895 895 212 895 895 212 606 606 214 330 330 215 606 606 217 229 71 218 330 330 216 330 330 216 229 71 218 605 605 219 330 330 221 605 605 222 894 894 220 894 894 220 605 605 222 171 171 223 15 15 224 897 897 225 896 896 227 896 896 227 897 897 225 331 331 226 897 897 228 173 173 229 331 331 231 331 331 231 173 173 229 607 607 230 607 607 233 229 71 234 331 331 232 331 331 232 229 71 234 606 606 235 896 896 236 331 331 237 172 172 239 172 172 239 331 331 237 606 606 238 14 14 240 899 899 241 902 902 243 902 902 243 899 899 241 332 332 242 899 899 244 174 174 245 332 332 247 332 332 247 174 174 245 608 608 246 332 332 248 608 608 249 610 610 251 610 610 251 608 608 249 230 72 250 332 332 253 610 610 254 902 902 252 902 902 252 610 610 254 175 175 255 17 17 256 894 894 257 900 900 259 900 900 259 894 894 257 333 333 258 171 171 261 609 609 262 894 894 260 894 894 260 609 609 262 333 333 263 609 609 265 230 72 266 333 333 264 333 333 264 230 72 266 608 608 267 333 333 269 608 608 270 900 900 268 900 900 268 608 608 270 174 174 271 19 19 272 901 901 273 893 893 275 893 893 275 901 901 273 334 334 274 901 901 276 175 175 277 334 334 279 334 334 279 175 175 277 610 610 278 334 334 280 610 610 281 609 609 283 609 609 283 610 610 281 230 72 282 893 893 284 334 334 285 171 171 287 171 171 287 334 334 285 609 609 286 903 903 289 335 335 290 21 21 288 21 21 288 335 335 290 908 908 291 903 903 292 176 176 293 335 335 295 335 335 295 176 176 293 611 611 294 611 611 297 231 73 298 335 335 296 335 335 296 231 73 298 613 613 299 335 335 301 613 613 302 908 908 300 908 908 300 613 613 302 178 178 303 905 905 305 336 336 306 19 19 304 19 19 304 336 336 306 904 904 307 177 177 309 612 612 310 905 905 308 905 905 308 612 612 310 336 336 311 612 612 313 231 73 314 336 336 312 336 336 312 231 73 314 611 611 315 336 336 317 611 611 318 904 904 316 904 904 316 611 611 318 176 176 319 23 23 320 907 907 321 906 906 323 906 906 323 907 907 321 337 337 322 907 907 324 178 178 325 337 337 327 337 337 327 178 178 325 613 613 326 337 337 328 613 613 329 612 612 331 612 612 331 613 613 329 231 73 330 906 906 332 337 337 333 177 177 335 177 177 335 337 337 333 612 612 334 20 20 336 909 909 337 914 914 339 914 914 339 909 909 337 338 338 338 909 909 340 179 179 341 338 338 343 338 338 343 179 179 341 614 614 342 338 338 344 614 614 345 616 616 347 616 616 347 614 614 345 232 74 346 914 914 348 338 338 349 181 181 351 181 181 351 338 338 349 616 616 350 18 18 352 911 911 353 910 910 355 910 910 355 911 911 353 339 339 354 911 911 356 180 180 357 339 339 359 339 339 359 180 180 357 615 615 358 615 615 361 232 74 362 339 339 360 339 339 360 232 74 362 614 614 363 339 339 365 614 614 366 910 910 364 910 910 364 614 614 366 179 179 367 913 913 369 340 340 370 21 21 368 21 21 368 340 340 370 912 912 371 181 181 373 616 616 374 913 913 372 913 913 372 616 616 374 340 340 375 616 616 377 232 74 378 340 340 376 340 340 376 232 74 378 615 615 379 340 340 381 615 615 382 912 912 380 912 912 380 615 615 382 180 180 383 915 915 385 341 341 386 16 16 384 16 16 384 341 341 386 920 920 387 182 182 389 617 617 390 915 915 388 915 915 388 617 617 390 341 341 391 617 617 393 233 75 394 341 341 392 341 341 392 233 75 394 619 619 395 920 920 396 341 341 397 184 184 399 184 184 399 341 341 397 619 619 398 22 22 400 917 917 401 916 916 403 916 916 403 917 917 401 342 342 402 917 917 404 183 183 405 342 342 407 342 342 407 183 183 405 618 618 406 342 342 408 618 618 409 617 617 411 617 617 411 618 618 409 233 75 410 916 916 412 342 342 413 182 182 415 182 182 415 342 342 413 617 617 414 919 919 417 343 343 418 23 23 416 23 23 416 343 343 418 918 918 419 184 184 421 619 619 422 919 919 420 919 919 420 619 619 422 343 343 423 619 619 425 233 75 426 343 343 424 343 343 424 233 75 426 618 618 427 343 343 429 618 618 430 918 918 428 918 918 428 618 618 430 183 183 431 23 23 432 906 906 433 924 924 435 924 924 435 906 906 433 344 344 434 177 177 437 620 620 438 906 906 436 906 906 436 620 620 438 344 344 439 620 620 441 234 76 442 344 344 440 344 344 440 234 76 442 622 622 443 344 344 445 622 622 446 924 924 444 924 924 444 622 622 446 186 186 447 19 19 448 921 921 449 905 905 451 905 905 451 921 921 449 345 345 450 185 185 453 621 621 454 921 921 452 921 921 452 621 621 454 345 345 455 621 621 457 234 76 458 345 345 456 345 345 456 234 76 458 620 620 459 905 905 460 345 345 461 177 177 463 177 177 463 345 345 461 620 620 462 24 24 464 923 923 465 922 922 467 922 922 467 923 923 465 346 346 466 923 923 468 186 186 469 346 346 471 346 346 471 186 186 469 622 622 470 346 346 472 622 622 473 621 621 475 621 621 475 622 622 473 234 76 474 922 922 476 346 346 477 185 185 479 185 185 479 346 346 477 621 621 478 28 28 480 925 925 481 930 930 483 930 930 483 925 925 481 347 347 482 925 925 484 187 187 485 347 347 487 347 347 487 187 187 485 623 623 486 347 347 488 623 623 489 625 625 491 625 625 491 623 623 489 235 77 490 930 930 492 347 347 493 189 189 495 189 189 495 347 347 493 625 625 494 25 25 496 927 927 497 926 926 499 926 926 499 927 927 497 348 348 498 927 927 500 188 188 501 348 348 503 348 348 503 188 188 501 624 624 502 624 624 505 235 77 506 348 348 504 348 348 504 235 77 506 623 623 507 348 348 509 623 623 510 926 926 508 926 926 508 623 623 510 187 187 511 32 32 512 929 929 513 928 928 515 928 928 515 929 929 513 349 349 514 189 189 517 625 625 518 929 929 516 929 929 516 625 625 518 349 349 519 625 625 521 235 77 522 349 349 520 349 349 520 235 77 522 624 624 523 349 349 525 624 624 526 928 928 524 928 928 524 624 624 526 188 188 527 29 29 528 931 931 529 936 936 531 936 936 531 931 931 529 350 350 530 931 931 532 190 190 533 350 350 535 350 350 535 190 190 533 626 626 534 626 626 537 236 78 538 350 350 536 350 350 536 236 78 538 628 628 539 936 936 540 350 350 541 192 192 543 192 192 543 350 350 541 628 628 542 27 27 544 933 933 545 932 932 547 932 932 547 933 933 545 351 351 546 191 191 549 627 627 550 933 933 548 933 933 548 627 627 550 351 351 551 627 627 553 236 78 554 351 351 552 351 351 552 236 78 554 626 626 555 351 351 557 626 626 558 932 932 556 932 932 556 626 626 558 190 190 559 17 17 560 935 935 561 934 934 563 934 934 563 935 935 561 352 352 562 935 935 564 192 192 565 352 352 567 352 352 567 192 192 565 628 628 566 352 352 568 628 628 569 627 627 571 627 627 571 628 628 569 236 78 570 934 934 572 352 352 573 191 191 575 191 191 575 352 352 573 627 627 574 30 30 576 937 937 577 942 942 579 942 942 579 937 937 577 353 353 578 193 193 581 629 629 582 937 937 580 937 937 580 629 629 582 353 353 583 629 629 585 237 79 586 353 353 584 353 353 584 237 79 586 631 631 587 942 942 588 353 353 589 195 195 591 195 195 591 353 353 589 631 631 590 28 28 592 939 939 593 938 938 595 938 938 595 939 939 593 354 354 594 939 939 596 194 194 597 354 354 599 354 354 599 194 194 597 630 630 598 354 354 600 630 630 601 629 629 603 629 629 603 630 630 601 237 79 602 938 938 604 354 354 605 193 193 607 193 193 607 354 354 605 629 629 606 941 941 609 355 355 610 31 31 608 31 31 608 355 355 610 940 940 611 195 195 613 631 631 614 941 941 612 941 941 612 631 631 614 355 355 615 631 631 617 237 79 618 355 355 616 355 355 616 237 79 618 630 630 619 355 355 621 630 630 622 940 940 620 940 940 620 630 630 622 194 194 623 942 942 625 356 356 626 30 30 624 30 30 624 356 356 626 946 946 627 195 195 629 632 632 630 942 942 628 942 942 628 632 632 630 356 356 631 632 632 633 238 80 634 356 356 632 356 356 632 238 80 634 634 634 635 356 356 637 634 634 638 946 946 636 946 946 636 634 634 638 197 197 639 31 31 640 943 943 641 941 941 643 941 941 643 943 943 641 357 357 642 196 196 645 633 633 646 943 943 644 943 943 644 633 633 646 357 357 647 633 633 649 238 80 650 357 357 648 357 357 648 238 80 650 632 632 651 941 941 652 357 357 653 195 195 655 195 195 655 357 357 653 632 632 654 29 29 656 945 945 657 944 944 659 944 944 659 945 945 657 358 358 658 945 945 660 197 197 661 358 358 663 358 358 663 197 197 661 634 634 662 358 358 664 634 634 665 633 633 667 633 633 667 634 634 665 238 80 666 944 944 668 358 358 669 196 196 671 196 196 671 358 358 669 633 633 670 29 29 672 944 944 673 950 950 675 950 950 675 944 944 673 359 359 674 944 944 676 196 196 677 359 359 679 359 359 679 196 196 677 635 635 678 359 359 680 635 635 681 637 637 683 637 637 683 635 635 681 239 81 682 950 950 684 359 359 685 199 199 687 199 199 687 359 359 685 637 637 686 31 31 688 947 947 689 943 943 691 943 943 691 947 947 689 360 360 690 947 947 692 198 198 693 360 360 695 360 360 695 198 198 693 636 636 694 636 636 697 239 81 698 360 360 696 360 360 696 239 81 698 635 635 699 360 360 701 635 635 702 943 943 700 943 943 700 635 635 702 196 196 703 32 32 704 949 949 705 948 948 707 948 948 707 949 949 705 361 361 706 199 199 709 637 637 710 949 949 708 949 949 708 637 637 710 361 361 711 637 637 713 239 81 714 361 361 712 361 361 712 239 81 714 636 636 715 948 948 716 361 361 717 198 198 719 198 198 719 361 361 717 636 636 718 17 17 720 934 934 721 952 952 723 952 952 723 934 934 721 362 362 722 934 934 724 191 191 725 362 362 727 362 362 727 191 191 725 638 638 726 362 362 728 638 638 729 640 640 731 640 640 731 638 638 729 240 82 730 952 952 732 362 362 733 200 200 735 200 200 735 362 362 733 640 640 734 27 27 736 888 888 737 933 933 739 933 933 739 888 888 737 363 363 738 888 888 740 168 168 741 363 363 743 363 363 743 168 168 741 639 639 742 639 639 745 240 82 746 363 363 744 363 363 744 240 82 746 638 638 747 363 363 749 638 638 750 933 933 748 933 933 748 638 638 750 191 191 751 33 33 752 951 951 753 887 887 755 887 887 755 951 951 753 364 364 754 200 200 757 640 640 758 951 951 756 951 951 756 640 640 758 364 364 759 640 640 761 240 82 762 364 364 760 364 364 760 240 82 762 639 639 763 887 887 764 364 364 765 168 168 767 168 168 767 364 364 765 639 639 766 10 10 768 953 953 769 958 958 771 958 958 771 953 953 769 365 365 770 953 953 772 201 201 773 365 365 775 365 365 775 201 201 773 641 641 774 365 365 776 641 641 777 643 643 779 643 643 779 641 641 777 241 83 778 365 365 781 643 643 782 958 958 780 958 958 780 643 643 782 203 203 783 955 955 785 366 366 786 12 12 784 12 12 784 366 366 786 954 954 787 202 202 789 642 642 790 955 955 788 955 955 788 642 642 790 366 366 791 642 642 793 241 83 794 366 366 792 366 366 792 241 83 794 641 641 795 366 366 797 641 641 798 954 954 796 954 954 796 641 641 798 201 201 799 24 24 800 957 957 801 956 956 803 956 956 803 957 957 801 367 367 802 957 957 804 203 203 805 367 367 807 367 367 807 203 203 805 643 643 806 367 367 808 643 643 809 642 642 811 642 642 811 643 643 809 241 83 810 956 956 812 367 367 813 202 202 815 202 202 815 367 367 813 642 642 814 11 11 816 959 959 817 964 964 819 964 964 819 959 959 817 368 368 818 959 959 820 204 204 821 368 368 823 368 368 823 204 204 821 644 644 822 644 644 825 242 84 826 368 368 824 368 368 824 242 84 826 646 646 827 368 368 829 646 646 830 964 964 828 964 964 828 646 646 830 206 206 831 961 961 833 369 369 834 36 36 832 36 36 832 369 369 834 960 960 835 205 205 837 645 645 838 961 961 836 961 961 836 645 645 838 369 369 839 645 645 841 242 84 842 369 369 840 369 369 840 242 84 842 644 644 843 369 369 845 644 644 846 960 960 844 960 960 844 644 644 846 204 204 847 37 37 848 963 963 849 962 962 851 962 962 851 963 963 849 370 370 850 963 963 852 206 206 853 370 370 855 370 370 855 206 206 853 646 646 854 370 370 856 646 646 857 645 645 859 645 645 859 646 646 857 242 84 858 962 962 860 370 370 861 205 205 863 205 205 863 370 370 861 645 645 862 10 10 864 965 965 865 970 970 867 970 970 867 965 965 865 371 371 866 965 965 868 207 207 869 371 371 871 371 371 871 207 207 869 647 647 870 371 371 872 647 647 873 649 649 875 649 649 875 647 647 873 243 85 874 970 970 876 371 371 877 209 209 879 209 209 879 371 371 877 649 649 878 34 34 880 967 967 881 966 966 883 966 966 883 967 967 881 372 372 882 967 967 884 208 208 885 372 372 887 372 372 887 208 208 885 648 648 886 648 648 889 243 85 890 372 372 888 372 372 888 243 85 890 647 647 891 966 966 892 372 372 893 207 207 895 207 207 895 372 372 893 647 647 894 37 37 896 969 969 897 968 968 899 968 968 899 969 969 897 373 373 898 209 209 901 649 649 902 969 969 900 969 969 900 649 649 902 373 373 903 649 649 905 243 85 906 373 373 904 373 373 904 243 85 906 648 648 907 373 373 909 648 648 910 968 968 908 968 968 908 648 648 910 208 208 911 35 35 912 971 971 913 976 976 915 976 976 915 971 971 913 374 374 914 971 971 916 210 210 917 374 374 919 374 374 919 210 210 917 650 650 918 374 374 920 650 650 921 652 652 923 652 652 923 650 650 921 244 86 922 976 976 924 374 374 925 212 212 927 212 212 927 374 374 925 652 652 926 973 973 929 375 375 930 37 37 928 37 37 928 375 375 930 972 972 931 211 211 933 651 651 934 973 973 932 973 973 932 651 651 934 375 375 935 651 651 937 244 86 938 375 375 936 375 375 936 244 86 938 650 650 939 375 375 941 650 650 942 972 972 940 972 972 940 650 650 942 210 210 943 38 38 944 975 975 945 974 974 947 974 974 947 975 975 945 376 376 946 212 212 949 652 652 950 975 975 948 975 975 948 652 652 950 376 376 951 652 652 953 244 86 954 376 376 952 376 376 952 244 86 954 651 651 955 376 376 957 651 651 958 974 974 956 974 974 956 651 651 958 211 211 959 39 39 960 977 977 961 982 982 963 982 982 963 977 977 961 377 377 962 977 977 964 213 213 965 377 377 967 377 377 967 213 213 965 653 653 966 377 377 968 653 653 969 655 655 971 655 655 971 653 653 969 245 87 970 982 982 972 377 377 973 215 215 975 215 215 975 377 377 973 655 655 974 979 979 977 378 378 978 44 44 976 44 44 976 378 378 978 978 978 979 214 214 981 654 654 982 979 979 980 979 979 980 654 654 982 378 378 983 654 654 985 245 87 986 378 378 984 378 378 984 245 87 986 653 653 987 378 378 989 653 653 990 978 978 988 978 978 988 653 653 990 213 213 991 43 43 992 981 981 993 980 980 995 980 980 995 981 981 993 379 379 994 215 215 997 655 655 998 981 981 996 981 981 996 655 655 998 379 379 999 655 655 1001 245 87 1002 379 379 1000 379 379 1000 245 87 1002 654 654 1003 980 980 1004 379 379 1005 214 214 1007 214 214 1007 379 379 1005 654 654 1006 41 41 1008 983 983 1009 988 988 1011 988 988 1011 983 983 1009 380 380 1010 983 983 1012 216 216 1013 380 380 1015 380 380 1015 216 216 1013 656 656 1014 380 380 1016 656 656 1017 658 658 1019 658 658 1019 656 656 1017 246 88 1018 988 988 1020 380 380 1021 218 218 1023 218 218 1023 380 380 1021 658 658 1022 985 985 1025 381 381 1026 43 43 1024 43 43 1024 381 381 1026 984 984 1027 217 217 1029 657 657 1030 985 985 1028 985 985 1028 657 657 1030 381 381 1031 657 657 1033 246 88 1034 381 381 1032 381 381 1032 246 88 1034 656 656 1035 381 381 1037 656 656 1038 984 984 1036 984 984 1036 656 656 1038 216 216 1039 38 38 1040 987 987 1041 986 986 1043 986 986 1043 987 987 1041 382 382 1042 218 218 1045 658 658 1046 987 987 1044 987 987 1044 658 658 1046 382 382 1047 658 658 1049 246 88 1050 382 382 1048 382 382 1048 246 88 1050 657 657 1051 986 986 1052 382 382 1053 217 217 1055 217 217 1055 382 382 1053 657 657 1054 38 38 1056 989 989 1057 994 994 1059 994 994 1059 989 989 1057 383 383 1058 989 989 1060 219 219 1061 383 383 1063 383 383 1063 219 219 1061 659 659 1062 383 383 1064 659 659 1065 661 661 1067 661 661 1067 659 659 1065 247 89 1066 994 994 1068 383 383 1069 221 221 1071 221 221 1071 383 383 1069 661 661 1070 7 7 1072 991 991 1073 990 990 1075 990 990 1075 991 991 1073 384 384 1074 991 991 1076 220 220 1077 384 384 1079 384 384 1079 220 220 1077 660 660 1078 660 660 1081 247 89 1082 384 384 1080 384 384 1080 247 89 1082 659 659 1083 384 384 1085 659 659 1086 990 990 1084 990 990 1084 659 659 1086 219 219 1087 993 993 1089 385 385 1090 8 8 1088 8 8 1088 385 385 1090 992 992 1091 221 221 1093 661 661 1094 993 993 1092 993 993 1092 661 661 1094 385 385 1095 661 661 1097 247 89 1098 385 385 1096 385 385 1096 247 89 1098 660 660 1099 385 385 1101 660 660 1102 992 992 1100 992 992 1100 660 660 1102 220 220 1103 40 40 1104 995 995 1105 1000 1000 1107 1000 1000 1107 995 995 1105 386 386 1106 995 995 1108 222 222 1109 386 386 1111 386 386 1111 222 222 1109 662 662 1110 386 386 1112 662 662 1113 664 664 1115 664 664 1115 662 662 1113 248 90 1114 386 386 1117 664 664 1118 1000 1000 1116 1000 1000 1116 664 664 1118 224 224 1119 997 997 1121 387 387 1122 42 42 1120 42 42 1120 387 387 1122 996 996 1123 223 223 1125 663 663 1126 997 997 1124 997 997 1124 663 663 1126 387 387 1127 663 663 1129 248 90 1130 387 387 1128 387 387 1128 248 90 1130 662 662 1131 387 387 1133 662 662 1134 996 996 1132 996 996 1132 662 662 1134 222 222 1135 43 43 1136 999 999 1137 998 998 1139 998 998 1139 999 999 1137 388 388 1138 999 999 1140 224 224 1141 388 388 1143 388 388 1143 224 224 1141 664 664 1142 388 388 1144 664 664 1145 663 663 1147 663 663 1147 664 664 1145 248 90 1146 998 998 1148 388 388 1149 223 223 1151 223 223 1151 388 388 1149 663 663 1150 60 60 1152 1001 1001 1153 1006 1006 1155 1006 1006 1155 1001 1001 1153 389 389 1154 1001 1001 1156 67 225 1157 389 389 1159 389 389 1159 67 225 1157 665 665 1158 389 389 1160 665 665 1161 667 667 1163 667 667 1163 665 665 1161 249 91 1162 1006 1006 1164 389 389 1165 69 227 1167 69 227 1167 389 389 1165 667 667 1166 1003 1003 1169 390 390 1170 47 47 1168 47 47 1168 390 390 1170 1002 1002 1171 68 226 1173 666 666 1174 1003 1003 1172 1003 1003 1172 666 666 1174 390 390 1175 666 666 1177 249 91 1178 390 390 1176 390 390 1176 249 91 1178 665 665 1179 390 390 1181 665 665 1182 1002 1002 1180 1002 1002 1180 665 665 1182 67 225 1183 44 44 1184 1005 1005 1185 1004 1004 1187 1004 1004 1187 1005 1005 1185 391 391 1186 69 227 1189 667 667 1190 1005 1005 1188 1005 1005 1188 667 667 1190 391 391 1191 667 667 1193 249 91 1194 391 391 1192 391 391 1192 249 91 1194 666 666 1195 1004 1004 1196 391 391 1197 68 226 1199 68 226 1199 391 391 1197 666 666 1198 51 51 1200 1007 1007 1201 1012 1012 1203 1012 1012 1203 1007 1007 1201 392 392 1202 1007 1007 1204 70 228 1205 392 392 1207 392 392 1207 70 228 1205 668 668 1206 392 392 1208 668 668 1209 670 670 1211 670 670 1211 668 668 1209 250 92 1210 1012 1012 1212 392 392 1213 72 230 1215 72 230 1215 392 392 1213 670 670 1214 1009 1009 1217 393 393 1218 46 46 1216 46 46 1216 393 393 1218 1008 1008 1219 71 229 1221 669 669 1222 1009 1009 1220 1009 1009 1220 669 669 1222 393 393 1223 669 669 1225 250 92 1226 393 393 1224 393 393 1224 250 92 1226 668 668 1227 393 393 1229 668 668 1230 1008 1008 1228 1008 1008 1228 668 668 1230 70 228 1231 40 40 1232 1011 1011 1233 1010 1010 1235 1010 1010 1235 1011 1011 1233 394 394 1234 72 230 1237 670 670 1238 1011 1011 1236 1011 1011 1236 670 670 1238 394 394 1239 394 394 1240 670 670 1241 669 669 1243 669 669 1243 670 670 1241 250 92 1242 1010 1010 1244 394 394 1245 71 229 1247 71 229 1247 394 394 1245 669 669 1246 48 48 1248 1013 1013 1249 1018 1018 1251 1018 1018 1251 1013 1013 1249 395 395 1250 1013 1013 1252 73 231 1253 395 395 1255 395 395 1255 73 231 1253 671 671 1254 395 395 1256 671 671 1257 673 673 1259 673 673 1259 671 671 1257 251 93 1258 1018 1018 1260 395 395 1261 75 233 1263 75 233 1263 395 395 1261 673 673 1262 1015 1015 1265 396 396 1266 53 53 1264 53 53 1264 396 396 1266 1014 1014 1267 74 232 1269 672 672 1270 1015 1015 1268 1015 1015 1268 672 672 1270 396 396 1271 672 672 1273 251 93 1274 396 396 1272 396 396 1272 251 93 1274 671 671 1275 396 396 1277 671 671 1278 1014 1014 1276 1014 1014 1276 671 671 1278 73 231 1279 55 55 1280 1017 1017 1281 1016 1016 1283 1016 1016 1283 1017 1017 1281 397 397 1282 1017 1017 1284 75 233 1285 397 397 1287 397 397 1287 75 233 1285 673 673 1286 397 397 1288 673 673 1289 672 672 1291 672 672 1291 673 673 1289 251 93 1290 1016 1016 1292 397 397 1293 74 232 1295 74 232 1295 397 397 1293 672 672 1294 51 51 1296 1019 1019 1297 1024 1024 1299 1024 1024 1299 1019 1019 1297 398 398 1298 1019 1019 1300 76 234 1301 398 398 1303 398 398 1303 76 234 1301 674 674 1302 398 398 1304 674 674 1305 676 676 1307 676 676 1307 674 674 1305 252 94 1306 1024 1024 1308 398 398 1309 78 236 1311 78 236 1311 398 398 1309 676 676 1310 1021 1021 1313 399 399 1314 47 47 1312 47 47 1312 399 399 1314 1020 1020 1315 77 235 1317 675 675 1318 1021 1021 1316 1021 1021 1316 675 675 1318 399 399 1319 675 675 1321 252 94 1322 399 399 1320 399 399 1320 252 94 1322 674 674 1323 399 399 1325 674 674 1326 1020 1020 1324 1020 1020 1324 674 674 1326 76 234 1327 50 50 1328 1023 1023 1329 1022 1022 1331 1022 1022 1331 1023 1023 1329 400 400 1330 78 236 1333 676 676 1334 1023 1023 1332 1023 1023 1332 676 676 1334 400 400 1335 400 400 1336 676 676 1337 675 675 1339 675 675 1339 676 676 1337 252 94 1338 1022 1022 1340 400 400 1341 77 235 1343 77 235 1343 400 400 1341 675 675 1342 51 51 1344 1025 1025 1345 1030 1030 1347 1030 1030 1347 1025 1025 1345 401 401 1346 1025 1025 1348 79 237 1349 401 401 1351 401 401 1351 79 237 1349 677 677 1350 401 401 1352 677 677 1353 679 679 1355 679 679 1355 677 677 1353 253 95 1354 1030 1030 1356 401 401 1357 81 239 1359 81 239 1359 401 401 1357 679 679 1358 52 52 1360 1027 1027 1361 1026 1026 1363 1026 1026 1363 1027 1027 1361 402 402 1362 1027 1027 1364 80 238 1365 402 402 1367 402 402 1367 80 238 1365 678 678 1366 402 402 1368 678 678 1369 677 677 1371 677 677 1371 678 678 1369 253 95 1370 1026 1026 1372 402 402 1373 79 237 1375 79 237 1375 402 402 1373 677 677 1374 57 57 1376 1029 1029 1377 1028 1028 1379 1028 1028 1379 1029 1029 1377 403 403 1378 81 239 1381 679 679 1382 1029 1029 1380 1029 1029 1380 679 679 1382 403 403 1383 679 679 1385 253 95 1386 403 403 1384 403 403 1384 253 95 1386 678 678 1387 403 403 1389 678 678 1390 1028 1028 1388 1028 1028 1388 678 678 1390 80 238 1391 53 53 1392 1031 1031 1393 1015 1015 1395 1015 1015 1395 1031 1031 1393 404 404 1394 82 240 1397 680 680 1398 1031 1031 1396 1031 1031 1396 680 680 1398 404 404 1399 680 680 1401 254 96 1402 404 404 1400 404 404 1400 254 96 1402 682 682 1403 1015 1015 1404 404 404 1405 74 232 1407 74 232 1407 404 404 1405 682 682 1406 54 54 1408 1033 1033 1409 1032 1032 1411 1032 1032 1411 1033 1033 1409 405 405 1410 1033 1033 1412 83 241 1413 405 405 1415 405 405 1415 83 241 1413 681 681 1414 405 405 1416 681 681 1417 680 680 1419 680 680 1419 681 681 1417 254 96 1418 1032 1032 1420 405 405 1421 82 240 1423 82 240 1423 405 405 1421 680 680 1422 1016 1016 1425 406 406 1426 55 55 1424 55 55 1424 406 406 1426 1034 1034 1427 74 232 1429 682 682 1430 1016 1016 1428 1016 1016 1428 682 682 1430 406 406 1431 682 682 1433 254 96 1434 406 406 1432 406 406 1432 254 96 1434 681 681 1435 406 406 1437 681 681 1438 1034 1034 1436 1034 1034 1436 681 681 1438 83 241 1439 57 57 1440 1028 1028 1441 1038 1038 1443 1038 1038 1443 1028 1028 1441 407 407 1442 1028 1028 1444 80 238 1445 407 407 1447 407 407 1447 80 238 1445 683 683 1446 407 407 1448 683 683 1449 685 685 1451 685 685 1451 683 683 1449 255 97 1450 1038 1038 1452 407 407 1453 85 243 1455 85 243 1455 407 407 1453 685 685 1454 1035 1035 1457 408 408 1458 52 52 1456 52 52 1456 408 408 1458 1027 1027 1459 84 242 1461 684 684 1462 1035 1035 1460 1035 1035 1460 684 684 1462 408 408 1463 684 684 1465 255 97 1466 408 408 1464 408 408 1464 255 97 1466 683 683 1467 408 408 1469 683 683 1470 1027 1027 1468 1027 1027 1468 683 683 1470 80 238 1471 1037 1037 1473 409 409 1474 55 55 1472 55 55 1472 409 409 1474 1036 1036 1475 85 243 1477 685 685 1478 1037 1037 1476 1037 1037 1476 685 685 1478 409 409 1479 685 685 1481 255 97 1482 409 409 1480 409 409 1480 255 97 1482 684 684 1483 1036 1036 1484 409 409 1485 84 242 1487 84 242 1487 409 409 1485 684 684 1486 56 56 1488 1039 1039 1489 1044 1044 1491 1044 1044 1491 1039 1039 1489 410 410 1490 1039 1039 1492 86 244 1493 410 410 1495 410 410 1495 86 244 1493 686 686 1494 410 410 1496 686 686 1497 688 688 1499 688 688 1499 686 686 1497 256 98 1498 1044 1044 1500 410 410 1501 88 246 1503 88 246 1503 410 410 1501 688 688 1502 1041 1041 1505 411 411 1506 49 49 1504 49 49 1504 411 411 1506 1040 1040 1507 1041 1041 1508 87 245 1509 411 411 1511 411 411 1511 87 245 1509 687 687 1510 687 687 1513 256 98 1514 411 411 1512 411 411 1512 256 98 1514 686 686 1515 411 411 1517 686 686 1518 1040 1040 1516 1040 1040 1516 686 686 1518 86 244 1519 1043 1043 1521 412 412 1522 57 57 1520 57 57 1520 412 412 1522 1042 1042 1523 88 246 1525 688 688 1526 1043 1043 1524 1043 1043 1524 688 688 1526 412 412 1527 688 688 1529 256 98 1530 412 412 1528 412 412 1528 256 98 1530 687 687 1531 412 412 1533 687 687 1534 1042 1042 1532 1042 1042 1532 687 687 1534 87 245 1535 65 65 1536 1045 1045 1537 1050 1050 1539 1050 1050 1539 1045 1045 1537 413 413 1538 1045 1045 1540 89 247 1541 413 413 1543 413 413 1543 89 247 1541 689 689 1542 413 413 1544 689 689 1545 691 691 1547 691 691 1547 689 689 1545 257 99 1546 1050 1050 1548 413 413 1549 91 249 1551 91 249 1551 413 413 1549 691 691 1550 1047 1047 1553 414 414 1554 59 59 1552 59 59 1552 414 414 1554 1046 1046 1555 90 248 1557 690 690 1558 1047 1047 1556 1047 1047 1556 690 690 1558 414 414 1559 690 690 1561 257 99 1562 414 414 1560 414 414 1560 257 99 1562 689 689 1563 414 414 1565 689 689 1566 1046 1046 1564 1046 1046 1564 689 689 1566 89 247 1567 60 60 1568 1049 1049 1569 1048 1048 1571 1048 1048 1571 1049 1049 1569 415 415 1570 91 249 1573 691 691 1574 1049 1049 1572 1049 1049 1572 691 691 1574 415 415 1575 691 691 1577 257 99 1578 415 415 1576 415 415 1576 257 99 1578 690 690 1579 1048 1048 1580 415 415 1581 90 248 1583 90 248 1583 415 415 1581 690 690 1582 47 47 1584 1002 1002 1585 1052 1052 1587 1052 1052 1587 1002 1002 1585 416 416 1586 1002 1002 1588 67 225 1589 416 416 1591 416 416 1591 67 225 1589 692 692 1590 416 416 1592 692 692 1593 694 694 1595 694 694 1595 692 692 1593 258 100 1594 1052 1052 1596 416 416 1597 92 250 1599 92 250 1599 416 416 1597 694 694 1598 1048 1048 1601 417 417 1602 60 60 1600 60 60 1600 417 417 1602 1001 1001 1603 90 248 1605 693 693 1606 1048 1048 1604 1048 1048 1604 693 693 1606 417 417 1607 693 693 1609 258 100 1610 417 417 1608 417 417 1608 258 100 1610 692 692 1611 417 417 1613 692 692 1614 1001 1001 1612 1001 1001 1612 692 692 1614 67 225 1615 59 59 1616 1051 1051 1617 1047 1047 1619 1047 1047 1619 1051 1051 1617 418 418 1618 92 250 1621 694 694 1622 1051 1051 1620 1051 1051 1620 694 694 1622 418 418 1623 694 694 1625 258 100 1626 418 418 1624 418 418 1624 258 100 1626 693 693 1627 1047 1047 1628 418 418 1629 90 248 1631 90 248 1631 418 418 1629 693 693 1630 50 50 1632 1053 1053 1633 1058 1058 1635 1058 1058 1635 1053 1053 1633 419 419 1634 93 251 1637 695 695 1638 1053 1053 1636 1053 1053 1636 695 695 1638 419 419 1639 419 419 1640 695 695 1641 697 697 1643 697 697 1643 695 695 1641 259 101 1642 1058 1058 1644 419 419 1645 95 253 1647 95 253 1647 419 419 1645 697 697 1646 4 4 1648 1055 1055 1649 1054 1054 1651 1054 1054 1651 1055 1055 1649 420 420 1650 1055 1055 1652 94 252 1653 420 420 1655 420 420 1655 94 252 1653 696 696 1654 420 420 1656 696 696 1657 695 695 1659 695 695 1659 696 696 1657 259 101 1658 1054 1054 1660 420 420 1661 93 251 1663 93 251 1663 420 420 1661 695 695 1662 1057 1057 1665 421 421 1666 48 48 1664 48 48 1664 421 421 1666 1056 1056 1667 95 253 1669 697 697 1670 1057 1057 1668 1057 1057 1668 697 697 1670 421 421 1671 697 697 1673 259 101 1674 421 421 1672 421 421 1672 259 101 1674 696 696 1675 421 421 1677 696 696 1678 1056 1056 1676 1056 1056 1676 696 696 1678 94 252 1679 62 62 1680 874 874 1681 1062 1062 1683 1062 1062 1683 874 874 1681 422 422 1682 874 874 1684 161 161 1685 422 422 1687 422 422 1687 161 161 1685 698 698 1686 422 422 1688 698 698 1689 700 700 1691 700 700 1691 698 698 1689 260 102 1690 422 422 1693 700 700 1694 1062 1062 1692 1062 1062 1692 700 700 1694 97 255 1695 1059 1059 1697 423 423 1698 64 64 1696 64 64 1696 423 423 1698 873 873 1699 96 254 1701 699 699 1702 1059 1059 1700 1059 1059 1700 699 699 1702 423 423 1703 699 699 1705 260 102 1706 423 423 1704 423 423 1704 260 102 1706 698 698 1707 423 423 1709 698 698 1710 873 873 1708 873 873 1708 698 698 1710 161 161 1711 65 65 1712 1061 1061 1713 1060 1060 1715 1060 1060 1715 1061 1061 1713 424 424 1714 1061 1061 1716 97 255 1717 424 424 1719 424 424 1719 97 255 1717 700 700 1718 424 424 1720 700 700 1721 699 699 1723 699 699 1723 700 700 1721 260 102 1722 1060 1060 1724 424 424 1725 96 254 1727 96 254 1727 424 424 1725 699 699 1726 59 59 1728 1046 1046 1729 1064 1064 1731 1064 1064 1731 1046 1046 1729 425 425 1730 1046 1046 1732 89 247 1733 425 425 1735 425 425 1735 89 247 1733 701 701 1734 425 425 1736 701 701 1737 703 703 1739 703 703 1739 701 701 1737 261 103 1738 1064 1064 1740 425 425 1741 98 256 1743 98 256 1743 425 425 1741 703 703 1742 1060 1060 1745 426 426 1746 65 65 1744 65 65 1744 426 426 1746 1045 1045 1747 96 254 1749 702 702 1750 1060 1060 1748 1060 1060 1748 702 702 1750 426 426 1751 702 702 1753 261 103 1754 426 426 1752 426 426 1752 261 103 1754 701 701 1755 426 426 1757 701 701 1758 1045 1045 1756 1045 1045 1756 701 701 1758 89 247 1759 1063 1063 1761 427 427 1762 64 64 1760 64 64 1760 427 427 1762 1059 1059 1763 98 256 1765 703 703 1766 1063 1063 1764 1063 1063 1764 703 703 1766 427 427 1767 703 703 1769 261 103 1770 427 427 1768 427 427 1768 261 103 1770 702 702 1771 1059 1059 1772 427 427 1773 96 254 1775 96 254 1775 427 427 1773 702 702 1774 66 66 1776 1065 1065 1777 1070 1070 1779 1070 1070 1779 1065 1065 1777 428 428 1778 1065 1065 1780 99 257 1781 428 428 1783 428 428 1783 99 257 1781 704 704 1782 428 428 1784 704 704 1785 706 706 1787 706 706 1787 704 704 1785 262 104 1786 1070 1070 1788 428 428 1789 101 259 1791 101 259 1791 428 428 1789 706 706 1790 1067 1067 1793 429 429 1794 61 61 1792 61 61 1792 429 429 1794 1066 1066 1795 100 258 1797 705 705 1798 1067 1067 1796 1067 1067 1796 705 705 1798 429 429 1799 705 705 1801 262 104 1802 429 429 1800 429 429 1800 262 104 1802 704 704 1803 429 429 1805 704 704 1806 1066 1066 1804 1066 1066 1804 704 704 1806 99 257 1807 1069 1069 1809 430 430 1810 63 63 1808 63 63 1808 430 430 1810 1068 1068 1811 101 259 1813 706 706 1814 1069 1069 1812 1069 1069 1812 706 706 1814 430 430 1815 706 706 1817 262 104 1818 430 430 1816 430 430 1816 262 104 1818 705 705 1819 430 430 1821 705 705 1822 1068 1068 1820 1068 1068 1820 705 705 1822 100 258 1823 38 38 1824 974 974 1825 879 879 1827 879 879 1827 974 974 1825 431 431 1826 974 974 1828 211 211 1829 431 431 1831 431 431 1831 211 211 1829 707 707 1830 707 707 1833 263 105 1834 431 431 1832 431 431 1832 263 105 1834 709 709 1835 431 431 1837 709 709 1838 879 879 1836 879 879 1836 709 709 1838 164 164 1839 962 962 1841 432 432 1842 37 37 1840 37 37 1840 432 432 1842 973 973 1843 205 205 1845 708 708 1846 962 962 1844 962 962 1844 708 708 1846 432 432 1847 708 708 1849 263 105 1850 432 432 1848 432 432 1848 263 105 1850 707 707 1851 432 432 1853 707 707 1854 973 973 1852 973 973 1852 707 707 1854 211 211 1855 36 36 1856 880 880 1857 961 961 1859 961 961 1859 880 880 1857 433 433 1858 880 880 1860 164 164 1861 433 433 1863 433 433 1863 164 164 1861 709 709 1862 433 433 1864 709 709 1865 708 708 1867 708 708 1867 709 709 1865 263 105 1866 961 961 1868 433 433 1869 205 205 1871 205 205 1871 433 433 1869 708 708 1870 34 34 1872 1071 1071 1873 1076 1076 1875 1076 1076 1875 1071 1071 1873 434 434 1874 1071 1071 1876 102 260 1877 434 434 1879 434 434 1879 102 260 1877 710 710 1878 710 710 1881 264 106 1882 434 434 1880 434 434 1880 264 106 1882 712 712 1883 434 434 1885 712 712 1886 1076 1076 1884 1076 1076 1884 712 712 1886 104 262 1887 1073 1073 1889 435 435 1890 15 15 1888 15 15 1888 435 435 1890 1072 1072 1891 103 261 1893 711 711 1894 1073 1073 1892 1073 1073 1892 711 711 1894 435 435 1895 711 711 1897 264 106 1898 435 435 1896 435 435 1896 264 106 1898 710 710 1899 435 435 1901 710 710 1902 1072 1072 1900 1072 1072 1900 710 710 1902 102 260 1903 33 33 1904 1075 1075 1905 1074 1074 1907 1074 1074 1907 1075 1075 1905 436 436 1906 1075 1075 1908 104 262 1909 436 436 1911 436 436 1911 104 262 1909 712 712 1910 436 436 1912 712 712 1913 711 711 1915 711 711 1915 712 712 1913 264 106 1914 1074 1074 1916 436 436 1917 103 261 1919 103 261 1919 436 436 1917 711 711 1918 11 11 1920 1077 1077 1921 885 885 1923 885 885 1923 1077 1077 1921 437 437 1922 105 263 1925 713 713 1926 1077 1077 1924 1077 1077 1924 713 713 1926 437 437 1927 437 437 1928 713 713 1929 715 715 1931 715 715 1931 713 713 1929 265 107 1930 885 885 1932 437 437 1933 167 167 1935 167 167 1935 437 437 1933 715 715 1934 34 34 1936 1076 1076 1937 1078 1078 1939 1078 1078 1939 1076 1076 1937 438 438 1938 1076 1076 1940 104 262 1941 438 438 1943 438 438 1943 104 262 1941 714 714 1942 438 438 1944 714 714 1945 713 713 1947 713 713 1947 714 714 1945 265 107 1946 1078 1078 1948 438 438 1949 105 263 1951 105 263 1951 438 438 1949 713 713 1950 33 33 1952 886 886 1953 1075 1075 1955 1075 1075 1955 886 886 1953 439 439 1954 167 167 1957 715 715 1958 886 886 1956 886 886 1956 715 715 1958 439 439 1959 715 715 1961 265 107 1962 439 439 1960 439 439 1960 265 107 1962 714 714 1963 439 439 1965 714 714 1966 1075 1075 1964 1075 1075 1964 714 714 1966 104 262 1967 32 32 1968 928 928 1969 1082 1082 1971 1082 1082 1971 928 928 1969 440 440 1970 928 928 1972 188 188 1973 440 440 1975 440 440 1975 188 188 1973 716 716 1974 440 440 1976 716 716 1977 718 718 1979 718 718 1979 716 716 1977 266 108 1978 1082 1082 1980 440 440 1981 107 265 1983 107 265 1983 440 440 1981 718 718 1982 1079 1079 1985 441 441 1986 25 25 1984 25 25 1984 441 441 1986 927 927 1987 106 264 1989 717 717 1990 1079 1079 1988 1079 1079 1988 717 717 1990 441 441 1991 717 717 1993 266 108 1994 441 441 1992 441 441 1992 266 108 1994 716 716 1995 441 441 1997 716 716 1998 927 927 1996 927 927 1996 716 716 1998 188 188 1999 13 13 2000 1081 1081 2001 1080 1080 2003 1080 1080 2003 1081 1081 2001 442 442 2002 1081 1081 2004 107 265 2005 442 442 2007 442 442 2007 107 265 2005 718 718 2006 442 442 2008 718 718 2009 717 717 2011 717 717 2011 718 718 2009 266 108 2010 1080 1080 2012 442 442 2013 106 264 2015 106 264 2015 442 442 2013 717 717 2014 13 13 2016 882 882 2017 1081 1081 2019 1081 1081 2019 882 882 2017 443 443 2018 882 882 2020 165 165 2021 443 443 2023 443 443 2023 165 165 2021 719 719 2022 443 443 2024 719 719 2025 721 721 2027 721 721 2027 719 719 2025 267 109 2026 1081 1081 2028 443 443 2029 107 265 2031 107 265 2031 443 443 2029 721 721 2030 33 33 2032 892 892 2033 881 881 2035 881 881 2035 892 892 2033 444 444 2034 892 892 2036 170 170 2037 444 444 2039 444 444 2039 170 170 2037 720 720 2038 720 720 2041 267 109 2042 444 444 2040 444 444 2040 267 109 2042 719 719 2043 444 444 2045 719 719 2046 881 881 2044 881 881 2044 719 719 2046 165 165 2047 32 32 2048 1082 1082 2049 891 891 2051 891 891 2051 1082 1082 2049 445 445 2050 1082 1082 2052 107 265 2053 445 445 2055 445 445 2055 107 265 2053 721 721 2054 721 721 2057 267 109 2058 445 445 2056 445 445 2056 267 109 2058 720 720 2059 445 445 2061 720 720 2062 891 891 2060 891 891 2060 720 720 2062 170 170 2063 15 15 2064 1083 1083 2065 897 897 2067 897 897 2067 1083 1083 2065 446 446 2066 108 266 2069 722 722 2070 1083 1083 2068 1083 1083 2068 722 722 2070 446 446 2071 722 722 2073 268 110 2074 446 446 2072 446 446 2072 268 110 2074 724 724 2075 897 897 2076 446 446 2077 173 173 2079 173 173 2079 446 446 2077 724 724 2078 922 922 2081 447 447 2082 24 24 2080 24 24 2080 447 447 2082 1084 1084 2083 185 185 2085 723 723 2086 922 922 2084 922 922 2084 723 723 2086 447 447 2087 723 723 2089 268 110 2090 447 447 2088 447 447 2088 268 110 2090 722 722 2091 1084 1084 2092 447 447 2093 108 266 2095 108 266 2095 447 447 2093 722 722 2094 19 19 2096 898 898 2097 921 921 2099 921 921 2099 898 898 2097 448 448 2098 898 898 2100 173 173 2101 448 448 2103 448 448 2103 173 173 2101 724 724 2102 448 448 2104 724 724 2105 723 723 2107 723 723 2107 724 724 2105 268 110 2106 921 921 2108 448 448 2109 185 185 2111 185 185 2111 448 448 2109 723 723 2110 21 21 2112 912 912 2113 1088 1088 2115 1088 1088 2115 912 912 2113 449 449 2114 912 912 2116 180 180 2117 449 449 2119 449 449 2119 180 180 2117 725 725 2118 449 449 2120 725 725 2121 727 727 2123 727 727 2123 725 725 2121 269 111 2122 1088 1088 2124 449 449 2125 110 268 2127 110 268 2127 449 449 2125 727 727 2126 1085 1085 2129 450 450 2130 18 18 2128 18 18 2128 450 450 2130 911 911 2131 109 267 2133 726 726 2134 1085 1085 2132 1085 1085 2132 726 726 2134 450 450 2135 726 726 2137 269 111 2138 450 450 2136 450 450 2136 269 111 2138 725 725 2139 450 450 2141 725 725 2142 911 911 2140 911 911 2140 725 725 2142 180 180 2143 14 14 2144 1087 1087 2145 1086 1086 2147 1086 1086 2147 1087 1087 2145 451 451 2146 1087 1087 2148 110 268 2149 451 451 2151 451 451 2151 110 268 2149 727 727 2150 451 451 2152 727 727 2153 726 726 2155 726 726 2155 727 727 2153 269 111 2154 1086 1086 2156 451 451 2157 109 267 2159 109 267 2159 451 451 2157 726 726 2158 14 14 2160 902 902 2161 1087 1087 2163 1087 1087 2163 902 902 2161 452 452 2162 902 902 2164 175 175 2165 452 452 2167 452 452 2167 175 175 2165 728 728 2166 452 452 2168 728 728 2169 730 730 2171 730 730 2171 728 728 2169 270 112 2170 1087 1087 2172 452 452 2173 110 268 2175 110 268 2175 452 452 2173 730 730 2174 19 19 2176 904 904 2177 901 901 2179 901 901 2179 904 904 2177 453 453 2178 904 904 2180 176 176 2181 453 453 2183 453 453 2183 176 176 2181 729 729 2182 729 729 2185 270 112 2186 453 453 2184 453 453 2184 270 112 2186 728 728 2187 453 453 2189 728 728 2190 901 901 2188 901 901 2188 728 728 2190 175 175 2191 21 21 2192 1088 1088 2193 903 903 2195 903 903 2195 1088 1088 2193 454 454 2194 110 268 2197 730 730 2198 1088 1088 2196 1088 1088 2196 730 730 2198 454 454 2199 730 730 2201 270 112 2202 454 454 2200 454 454 2200 270 112 2202 729 729 2203 454 454 2205 729 729 2206 903 903 2204 903 903 2204 729 729 2206 176 176 2207 22 22 2208 1089 1089 2209 1092 1092 2211 1092 1092 2211 1089 1089 2209 455 455 2210 1089 1089 2212 111 269 2213 455 455 2215 455 455 2215 111 269 2213 731 731 2214 455 455 2216 731 731 2217 733 733 2219 733 733 2219 731 731 2217 271 113 2218 1092 1092 2220 455 455 2221 112 270 2223 112 270 2223 455 455 2221 733 733 2222 914 914 2225 456 456 2226 20 20 2224 20 20 2224 456 456 2226 1090 1090 2227 181 181 2229 732 732 2230 914 914 2228 914 914 2228 732 732 2230 456 456 2231 732 732 2233 271 113 2234 456 456 2232 456 456 2232 271 113 2234 731 731 2235 456 456 2237 731 731 2238 1090 1090 2236 1090 1090 2236 731 731 2238 111 269 2239 21 21 2240 1091 1091 2241 913 913 2243 913 913 2243 1091 1091 2241 457 457 2242 112 270 2245 733 733 2246 1091 1091 2244 1091 1091 2244 733 733 2246 457 457 2247 457 457 2248 733 733 2249 732 732 2251 732 732 2251 733 733 2249 271 113 2250 913 913 2252 457 457 2253 181 181 2255 181 181 2255 457 457 2253 732 732 2254 21 21 2256 908 908 2257 1091 1091 2259 1091 1091 2259 908 908 2257 458 458 2258 908 908 2260 178 178 2261 458 458 2263 458 458 2263 178 178 2261 734 734 2262 458 458 2264 734 734 2265 736 736 2267 736 736 2267 734 734 2265 272 114 2266 1091 1091 2268 458 458 2269 112 270 2271 112 270 2271 458 458 2269 736 736 2270 23 23 2272 918 918 2273 907 907 2275 907 907 2275 918 918 2273 459 459 2274 918 918 2276 183 183 2277 459 459 2279 459 459 2279 183 183 2277 735 735 2278 459 459 2280 735 735 2281 734 734 2283 734 734 2283 735 735 2281 272 114 2282 907 907 2284 459 459 2285 178 178 2287 178 178 2287 459 459 2285 734 734 2286 22 22 2288 1092 1092 2289 917 917 2291 917 917 2291 1092 1092 2289 460 460 2290 112 270 2293 736 736 2294 1092 1092 2292 1092 1092 2292 736 736 2294 460 460 2295 736 736 2297 272 114 2298 460 460 2296 460 460 2296 272 114 2298 735 735 2299 460 460 2301 735 735 2302 917 917 2300 917 917 2300 735 735 2302 183 183 2303 12 12 2304 1093 1093 2305 1096 1096 2307 1096 1096 2307 1093 1093 2305 461 461 2306 1093 1093 2308 113 271 2309 461 461 2311 461 461 2311 113 271 2309 737 737 2310 461 461 2312 737 737 2313 739 739 2315 739 739 2315 737 737 2313 273 115 2314 1096 1096 2316 461 461 2317 114 272 2319 114 272 2319 461 461 2317 739 739 2318 920 920 2321 462 462 2322 16 16 2320 16 16 2320 462 462 2322 1094 1094 2323 184 184 2325 738 738 2326 920 920 2324 920 920 2324 738 738 2326 462 462 2327 738 738 2329 273 115 2330 462 462 2328 462 462 2328 273 115 2330 737 737 2331 462 462 2333 737 737 2334 1094 1094 2332 1094 1094 2332 737 737 2334 113 271 2335 23 23 2336 1095 1095 2337 919 919 2339 919 919 2339 1095 1095 2337 463 463 2338 114 272 2341 739 739 2342 1095 1095 2340 1095 1095 2340 739 739 2342 463 463 2343 739 739 2345 273 115 2346 463 463 2344 463 463 2344 273 115 2346 738 738 2347 919 919 2348 463 463 2349 184 184 2351 184 184 2351 463 463 2349 738 738 2350 23 23 2352 924 924 2353 1095 1095 2355 1095 1095 2355 924 924 2353 464 464 2354 924 924 2356 186 186 2357 464 464 2359 464 464 2359 186 186 2357 740 740 2358 464 464 2360 740 740 2361 742 742 2363 742 742 2363 740 740 2361 274 116 2362 1095 1095 2364 464 464 2365 114 272 2367 114 272 2367 464 464 2365 742 742 2366 956 956 2369 465 465 2370 24 24 2368 24 24 2368 465 465 2370 923 923 2371 202 202 2373 741 741 2374 956 956 2372 956 956 2372 741 741 2374 465 465 2375 741 741 2377 274 116 2378 465 465 2376 465 465 2376 274 116 2378 740 740 2379 465 465 2381 740 740 2382 923 923 2380 923 923 2380 740 740 2382 186 186 2383 12 12 2384 1096 1096 2385 955 955 2387 955 955 2387 1096 1096 2385 466 466 2386 114 272 2389 742 742 2390 1096 1096 2388 1096 1096 2388 742 742 2390 466 466 2391 742 742 2393 274 116 2394 466 466 2392 466 466 2392 274 116 2394 741 741 2395 955 955 2396 466 466 2397 202 202 2399 202 202 2399 466 466 2397 741 741 2398 32 32 2400 948 948 2401 929 929 2403 929 929 2403 948 948 2401 467 467 2402 948 948 2404 198 198 2405 467 467 2407 467 467 2407 198 198 2405 743 743 2406 467 467 2408 743 743 2409 745 745 2411 745 745 2411 743 743 2409 275 117 2410 929 929 2412 467 467 2413 189 189 2415 189 189 2415 467 467 2413 745 745 2414 940 940 2417 468 468 2418 31 31 2416 31 31 2416 468 468 2418 947 947 2419 194 194 2421 744 744 2422 940 940 2420 940 940 2420 744 744 2422 468 468 2423 744 744 2425 275 117 2426 468 468 2424 468 468 2424 275 117 2426 743 743 2427 468 468 2429 743 743 2430 947 947 2428 947 947 2428 743 743 2430 198 198 2431 28 28 2432 930 930 2433 939 939 2435 939 939 2435 930 930 2433 469 469 2434 189 189 2437 745 745 2438 930 930 2436 930 930 2436 745 745 2438 469 469 2439 745 745 2441 275 117 2442 469 469 2440 469 469 2440 275 117 2442 744 744 2443 469 469 2445 744 744 2446 939 939 2444 939 939 2444 744 744 2446 194 194 2447 17 17 2448 900 900 2449 1100 1100 2451 1100 1100 2451 900 900 2449 470 470 2450 900 900 2452 174 174 2453 470 470 2455 470 470 2455 174 174 2453 746 746 2454 746 746 2457 276 118 2458 470 470 2456 470 470 2456 276 118 2458 748 748 2459 470 470 2461 748 748 2462 1100 1100 2460 1100 1100 2460 748 748 2462 116 274 2463 1097 1097 2465 471 471 2466 14 14 2464 14 14 2464 471 471 2466 899 899 2467 115 273 2469 747 747 2470 1097 1097 2468 1097 1097 2468 747 747 2470 471 471 2471 747 747 2473 276 118 2474 471 471 2472 471 471 2472 276 118 2474 746 746 2475 471 471 2477 746 746 2478 899 899 2476 899 899 2476 746 746 2478 174 174 2479 6 6 2480 1099 1099 2481 1098 1098 2483 1098 1098 2483 1099 1099 2481 472 472 2482 1099 1099 2484 116 274 2485 472 472 2487 472 472 2487 116 274 2485 748 748 2486 472 472 2488 748 748 2489 747 747 2491 747 747 2491 748 748 2489 276 118 2490 1098 1098 2492 472 472 2493 115 273 2495 115 273 2495 472 472 2493 747 747 2494 17 17 2496 1101 1101 2497 935 935 2499 935 935 2499 1101 1101 2497 473 473 2498 1101 1101 2500 117 275 2501 473 473 2503 473 473 2503 117 275 2501 749 749 2502 473 473 2504 749 749 2505 751 751 2507 751 751 2507 749 749 2505 277 119 2506 935 935 2508 473 473 2509 192 192 2511 192 192 2511 473 473 2509 751 751 2510 26 26 2512 1103 1103 2513 1102 1102 2515 1102 1102 2515 1103 1103 2513 474 474 2514 1103 1103 2516 118 276 2517 474 474 2519 474 474 2519 118 276 2517 750 750 2518 750 750 2521 277 119 2522 474 474 2520 474 474 2520 277 119 2522 749 749 2523 474 474 2525 749 749 2526 1102 1102 2524 1102 1102 2524 749 749 2526 117 275 2527 29 29 2528 936 936 2529 1104 1104 2531 1104 1104 2531 936 936 2529 475 475 2530 192 192 2533 751 751 2534 936 936 2532 936 936 2532 751 751 2534 475 475 2535 751 751 2537 277 119 2538 475 475 2536 475 475 2536 277 119 2538 750 750 2539 1104 1104 2540 475 475 2541 118 276 2543 118 276 2543 475 475 2541 750 750 2542 1105 1105 2545 476 476 2546 6 6 2544 6 6 2544 476 476 2546 1099 1099 2547 119 277 2549 752 752 2550 1105 1105 2548 1105 1105 2548 752 752 2550 476 476 2551 752 752 2553 278 120 2554 476 476 2552 476 476 2552 278 120 2554 754 754 2555 476 476 2557 754 754 2558 1099 1099 2556 1099 1099 2556 754 754 2558 116 274 2559 26 26 2560 1102 1102 2561 1106 1106 2563 1106 1106 2563 1102 1102 2561 477 477 2562 1102 1102 2564 117 275 2565 477 477 2567 477 477 2567 117 275 2565 753 753 2566 477 477 2568 753 753 2569 752 752 2571 752 752 2571 753 753 2569 278 120 2570 1106 1106 2572 477 477 2573 119 277 2575 119 277 2575 477 477 2573 752 752 2574 17 17 2576 1100 1100 2577 1101 1101 2579 1101 1101 2579 1100 1100 2577 478 478 2578 1100 1100 2580 116 274 2581 478 478 2583 478 478 2583 116 274 2581 754 754 2582 478 478 2584 754 754 2585 753 753 2587 753 753 2587 754 754 2585 278 120 2586 478 478 2589 753 753 2590 1101 1101 2588 1101 1101 2588 753 753 2590 117 275 2591 1104 1104 2593 479 479 2594 29 29 2592 29 29 2592 479 479 2594 945 945 2595 118 276 2597 755 755 2598 1104 1104 2596 1104 1104 2596 755 755 2598 479 479 2599 755 755 2601 279 121 2602 479 479 2600 479 479 2600 279 121 2602 757 757 2603 479 479 2605 757 757 2606 945 945 2604 945 945 2604 757 757 2606 197 197 2607 1107 1107 2609 480 480 2610 26 26 2608 26 26 2608 480 480 2610 1103 1103 2611 120 278 2613 756 756 2614 1107 1107 2612 1107 1107 2612 756 756 2614 480 480 2615 756 756 2617 279 121 2618 480 480 2616 480 480 2616 279 121 2618 755 755 2619 480 480 2621 755 755 2622 1103 1103 2620 1103 1103 2620 755 755 2622 118 276 2623 30 30 2624 946 946 2625 1108 1108 2627 1108 1108 2627 946 946 2625 481 481 2626 946 946 2628 197 197 2629 481 481 2631 481 481 2631 197 197 2629 757 757 2630 481 481 2632 757 757 2633 756 756 2635 756 756 2635 757 757 2633 279 121 2634 1108 1108 2636 481 481 2637 120 278 2639 120 278 2639 481 481 2637 756 756 2638 32 32 2640 890 890 2641 949 949 2643 949 949 2643 890 890 2641 482 482 2642 890 890 2644 169 169 2645 482 482 2647 482 482 2647 169 169 2645 758 758 2646 482 482 2648 758 758 2649 760 760 2651 760 760 2651 758 758 2649 280 122 2650 949 949 2652 482 482 2653 199 199 2655 199 199 2655 482 482 2653 760 760 2654 932 932 2657 483 483 2658 27 27 2656 27 27 2656 483 483 2658 889 889 2659 932 932 2660 190 190 2661 483 483 2663 483 483 2663 190 190 2661 759 759 2662 759 759 2665 280 122 2666 483 483 2664 483 483 2664 280 122 2666 758 758 2667 483 483 2669 758 758 2670 889 889 2668 889 889 2668 758 758 2670 169 169 2671 950 950 2673 484 484 2674 29 29 2672 29 29 2672 484 484 2674 931 931 2675 199 199 2677 760 760 2678 950 950 2676 950 950 2676 760 760 2678 484 484 2679 760 760 2681 280 122 2682 484 484 2680 484 484 2680 280 122 2682 759 759 2683 484 484 2685 759 759 2686 931 931 2684 931 931 2684 759 759 2686 190 190 2687 33 33 2688 1074 1074 2689 951 951 2691 951 951 2691 1074 1074 2689 485 485 2690 1074 1074 2692 103 261 2693 485 485 2695 485 485 2695 103 261 2693 761 761 2694 485 485 2696 761 761 2697 763 763 2699 763 763 2699 761 761 2697 281 123 2698 951 951 2700 485 485 2701 200 200 2703 200 200 2703 485 485 2701 763 763 2702 15 15 2704 896 896 2705 1073 1073 2707 1073 1073 2707 896 896 2705 486 486 2706 172 172 2709 762 762 2710 896 896 2708 896 896 2708 762 762 2710 486 486 2711 762 762 2713 281 123 2714 486 486 2712 486 486 2712 281 123 2714 761 761 2715 486 486 2717 761 761 2718 1073 1073 2716 1073 1073 2716 761 761 2718 103 261 2719 17 17 2720 952 952 2721 895 895 2723 895 895 2723 952 952 2721 487 487 2722 200 200 2725 763 763 2726 952 952 2724 952 952 2724 763 763 2726 487 487 2727 763 763 2729 281 123 2730 487 487 2728 487 487 2728 281 123 2730 762 762 2731 895 895 2732 487 487 2733 172 172 2735 172 172 2735 487 487 2733 762 762 2734 15 15 2736 1072 1072 2737 1110 1110 2739 1110 1110 2739 1072 1072 2737 488 488 2738 1072 1072 2740 102 260 2741 488 488 2743 488 488 2743 102 260 2741 764 764 2742 488 488 2744 764 764 2745 766 766 2747 766 766 2747 764 764 2745 282 124 2746 1110 1110 2748 488 488 2749 121 279 2751 121 279 2751 488 488 2749 766 766 2750 34 34 2752 966 966 2753 1071 1071 2755 1071 1071 2755 966 966 2753 489 489 2754 207 207 2757 765 765 2758 966 966 2756 966 966 2756 765 765 2758 489 489 2759 765 765 2761 282 124 2762 489 489 2760 489 489 2760 282 124 2762 764 764 2763 489 489 2765 764 764 2766 1071 1071 2764 1071 1071 2764 764 764 2766 102 260 2767 10 10 2768 1109 1109 2769 965 965 2771 965 965 2771 1109 1109 2769 490 490 2770 1109 1109 2772 121 279 2773 490 490 2775 490 490 2775 121 279 2773 766 766 2774 490 490 2776 766 766 2777 765 765 2779 765 765 2779 766 766 2777 282 124 2778 965 965 2780 490 490 2781 207 207 2783 207 207 2783 490 490 2781 765 765 2782 1084 1084 2785 491 491 2786 24 24 2784 24 24 2784 491 491 2786 957 957 2787 108 266 2789 767 767 2790 1084 1084 2788 1084 1084 2788 767 767 2790 491 491 2791 767 767 2793 283 125 2794 491 491 2792 491 491 2792 283 125 2794 769 769 2795 491 491 2797 769 769 2798 957 957 2796 957 957 2796 769 769 2798 203 203 2799 15 15 2800 1110 1110 2801 1083 1083 2803 1083 1083 2803 1110 1110 2801 492 492 2802 121 279 2805 768 768 2806 1110 1110 2804 1110 1110 2804 768 768 2806 492 492 2807 768 768 2809 283 125 2810 492 492 2808 492 492 2808 283 125 2810 767 767 2811 1083 1083 2812 492 492 2813 108 266 2815 108 266 2815 492 492 2813 767 767 2814 10 10 2816 958 958 2817 1109 1109 2819 1109 1109 2819 958 958 2817 493 493 2818 958 958 2820 203 203 2821 493 493 2823 493 493 2823 203 203 2821 769 769 2822 493 493 2824 769 769 2825 768 768 2827 768 768 2827 769 769 2825 283 125 2826 1109 1109 2828 493 493 2829 121 279 2831 121 279 2831 493 493 2829 768 768 2830 37 37 2832 968 968 2833 963 963 2835 963 963 2835 968 968 2833 494 494 2834 968 968 2836 208 208 2837 494 494 2839 494 494 2839 208 208 2837 770 770 2838 770 770 2841 284 126 2842 494 494 2840 494 494 2840 284 126 2842 772 772 2843 494 494 2845 772 772 2846 963 963 2844 963 963 2844 772 772 2846 206 206 2847 1078 1078 2849 495 495 2850 34 34 2848 34 34 2848 495 495 2850 967 967 2851 105 263 2853 771 771 2854 1078 1078 2852 1078 1078 2852 771 771 2854 495 495 2855 771 771 2857 284 126 2858 495 495 2856 495 495 2856 284 126 2858 770 770 2859 495 495 2861 770 770 2862 967 967 2860 967 967 2860 770 770 2862 208 208 2863 11 11 2864 964 964 2865 1077 1077 2867 1077 1077 2867 964 964 2865 496 496 2866 964 964 2868 206 206 2869 496 496 2871 496 496 2871 206 206 2869 772 772 2870 496 496 2872 772 772 2873 771 771 2875 771 771 2875 772 772 2873 284 126 2874 1077 1077 2876 496 496 2877 105 263 2879 105 263 2879 496 496 2877 771 771 2878 37 37 2880 972 972 2881 969 969 2883 969 969 2883 972 972 2881 497 497 2882 972 972 2884 210 210 2885 497 497 2887 497 497 2887 210 210 2885 773 773 2886 497 497 2888 773 773 2889 775 775 2891 775 775 2891 773 773 2889 285 127 2890 969 969 2892 497 497 2893 209 209 2895 209 209 2895 497 497 2893 775 775 2894 1111 1111 2897 498 498 2898 35 35 2896 35 35 2896 498 498 2898 971 971 2899 122 280 2901 774 774 2902 1111 1111 2900 1111 1111 2900 774 774 2902 498 498 2903 774 774 2905 285 127 2906 498 498 2904 498 498 2904 285 127 2906 773 773 2907 498 498 2909 773 773 2910 971 971 2908 971 971 2908 773 773 2910 210 210 2911 10 10 2912 970 970 2913 1112 1112 2915 1112 1112 2915 970 970 2913 499 499 2914 209 209 2917 775 775 2918 970 970 2916 970 970 2916 775 775 2918 499 499 2919 499 499 2920 775 775 2921 774 774 2923 774 774 2923 775 775 2921 285 127 2922 1112 1112 2924 499 499 2925 122 280 2927 122 280 2927 499 499 2925 774 774 2926 38 38 2928 994 994 2929 975 975 2931 975 975 2931 994 994 2929 500 500 2930 994 994 2932 221 221 2933 500 500 2935 500 500 2935 221 221 2933 776 776 2934 500 500 2936 776 776 2937 778 778 2939 778 778 2939 776 776 2937 286 128 2938 975 975 2940 500 500 2941 212 212 2943 212 212 2943 500 500 2941 778 778 2942 1113 1113 2945 501 501 2946 8 8 2944 8 8 2944 501 501 2946 993 993 2947 123 281 2949 777 777 2950 1113 1113 2948 1113 1113 2948 777 777 2950 501 501 2951 777 777 2953 286 128 2954 501 501 2952 501 501 2952 286 128 2954 776 776 2955 501 501 2957 776 776 2958 993 993 2956 993 993 2956 776 776 2958 221 221 2959 35 35 2960 976 976 2961 1114 1114 2963 1114 1114 2963 976 976 2961 502 502 2962 212 212 2965 778 778 2966 976 976 2964 976 976 2964 778 778 2966 502 502 2967 778 778 2969 286 128 2970 502 502 2968 502 502 2968 286 128 2970 777 777 2971 1114 1114 2972 502 502 2973 123 281 2975 123 281 2975 502 502 2973 777 777 2974 43 43 2976 984 984 2977 981 981 2979 981 981 2979 984 984 2977 503 503 2978 984 984 2980 216 216 2981 503 503 2983 503 503 2983 216 216 2981 779 779 2982 503 503 2984 779 779 2985 781 781 2987 781 781 2987 779 779 2985 287 129 2986 981 981 2988 503 503 2989 215 215 2991 215 215 2991 503 503 2989 781 781 2990 1115 1115 2993 504 504 2994 41 41 2992 41 41 2992 504 504 2994 983 983 2995 124 282 2997 780 780 2998 1115 1115 2996 1115 1115 2996 780 780 2998 504 504 2999 780 780 3001 287 129 3002 504 504 3000 504 504 3000 287 129 3002 779 779 3003 504 504 3005 779 779 3006 983 983 3004 983 983 3004 779 779 3006 216 216 3007 39 39 3008 982 982 3009 1116 1116 3011 1116 1116 3011 982 982 3009 505 505 3010 215 215 3013 781 781 3014 982 982 3012 982 982 3012 781 781 3014 505 505 3015 781 781 3017 287 129 3018 505 505 3016 505 505 3016 287 129 3018 780 780 3019 1116 1116 3020 505 505 3021 124 282 3023 124 282 3023 505 505 3021 780 780 3022 38 38 3024 878 878 3025 1120 1120 3027 1120 1120 3027 878 878 3025 506 506 3026 878 878 3028 163 163 3029 506 506 3031 506 506 3031 163 163 3029 782 782 3030 506 506 3032 782 782 3033 784 784 3035 784 784 3035 782 782 3033 288 130 3034 1120 1120 3036 506 506 3037 126 284 3039 126 284 3039 506 506 3037 784 784 3038 1117 1117 3041 507 507 3042 9 9 3040 9 9 3040 507 507 3042 877 877 3043 125 283 3045 783 783 3046 1117 1117 3044 1117 1117 3044 783 783 3046 507 507 3047 783 783 3049 288 130 3050 507 507 3048 507 507 3048 288 130 3050 782 782 3051 507 507 3053 782 782 3054 877 877 3052 877 877 3052 782 782 3054 163 163 3055 0 0 3056 1119 1119 3057 1118 1118 3059 1118 1118 3059 1119 1119 3057 508 508 3058 126 284 3061 784 784 3062 1119 1119 3060 1119 1119 3060 784 784 3062 508 508 3063 784 784 3065 288 130 3066 508 508 3064 508 508 3064 288 130 3066 783 783 3067 1118 1118 3068 508 508 3069 125 283 3071 125 283 3071 508 508 3069 783 783 3070 1121 1121 3073 509 509 3074 0 0 3072 0 0 3072 509 509 3074 1119 1119 3075 127 285 3077 785 785 3078 1121 1121 3076 1121 1121 3076 785 785 3078 509 509 3079 785 785 3081 289 131 3082 509 509 3080 509 509 3080 289 131 3082 787 787 3083 509 509 3085 787 787 3086 1119 1119 3084 1119 1119 3084 787 787 3086 126 284 3087 41 41 3088 988 988 3089 1122 1122 3091 1122 1122 3091 988 988 3089 510 510 3090 218 218 3093 786 786 3094 988 988 3092 988 988 3092 786 786 3094 510 510 3095 786 786 3097 289 131 3098 510 510 3096 510 510 3096 289 131 3098 785 785 3099 1122 1122 3100 510 510 3101 127 285 3103 127 285 3103 510 510 3101 785 785 3102 38 38 3104 1120 1120 3105 987 987 3107 987 987 3107 1120 1120 3105 511 511 3106 1120 1120 3108 126 284 3109 511 511 3111 511 511 3111 126 284 3109 787 787 3110 511 511 3112 787 787 3113 786 786 3115 786 786 3115 787 787 3113 289 131 3114 987 987 3116 511 511 3117 218 218 3119 218 218 3119 511 511 3117 786 786 3118 1 1 3120 1123 1123 3121 1126 1126 3123 1126 1126 3123 1123 1123 3121 512 512 3122 1123 1123 3124 128 286 3125 512 512 3127 512 512 3127 128 286 3125 788 788 3126 788 788 3129 290 132 3130 512 512 3128 512 512 3128 290 132 3130 790 790 3131 512 512 3133 790 790 3134 1126 1126 3132 1126 1126 3132 790 790 3134 129 287 3135 990 990 3137 513 513 3138 7 7 3136 7 7 3136 513 513 3138 1124 1124 3139 219 219 3141 789 789 3142 990 990 3140 990 990 3140 789 789 3142 513 513 3143 789 789 3145 290 132 3146 513 513 3144 513 513 3144 290 132 3146 788 788 3147 513 513 3149 788 788 3150 1124 1124 3148 1124 1124 3148 788 788 3150 128 286 3151 38 38 3152 1125 1125 3153 989 989 3155 989 989 3155 1125 1125 3153 514 514 3154 1125 1125 3156 129 287 3157 514 514 3159 514 514 3159 129 287 3157 790 790 3158 514 514 3160 790 790 3161 789 789 3163 789 789 3163 790 790 3161 290 132 3162 989 989 3164 514 514 3165 219 219 3167 219 219 3167 514 514 3165 789 789 3166 38 38 3168 986 986 3169 1128 1128 3171 1128 1128 3171 986 986 3169 515 515 3170 986 986 3172 217 217 3173 515 515 3175 515 515 3175 217 217 3173 791 791 3174 515 515 3176 791 791 3177 793 793 3179 793 793 3179 791 791 3177 291 133 3178 1128 1128 3180 515 515 3181 130 288 3183 130 288 3183 515 515 3181 793 793 3182 998 998 3185 516 516 3186 43 43 3184 43 43 3184 516 516 3186 985 985 3187 223 223 3189 792 792 3190 998 998 3188 998 998 3188 792 792 3190 516 516 3191 792 792 3193 291 133 3194 516 516 3192 516 516 3192 291 133 3194 791 791 3195 516 516 3197 791 791 3198 985 985 3196 985 985 3196 791 791 3198 217 217 3199 42 42 3200 1127 1127 3201 997 997 3203 997 997 3203 1127 1127 3201 517 517 3202 1127 1127 3204 130 288 3205 517 517 3207 517 517 3207 130 288 3205 793 793 3206 517 517 3208 793 793 3209 792 792 3211 792 792 3211 793 793 3209 291 133 3210 997 997 3212 517 517 3213 223 223 3215 223 223 3215 517 517 3213 792 792 3214 38 38 3216 1128 1128 3217 1132 1132 3219 1132 1132 3219 1128 1128 3217 518 518 3218 1128 1128 3220 130 288 3221 518 518 3223 518 518 3223 130 288 3221 794 794 3222 518 518 3224 794 794 3225 796 796 3227 796 796 3227 794 794 3225 292 134 3226 1132 1132 3228 518 518 3229 132 290 3231 132 290 3231 518 518 3229 796 796 3230 42 42 3232 1129 1129 3233 1127 1127 3235 1127 1127 3235 1129 1129 3233 519 519 3234 1129 1129 3236 131 289 3237 519 519 3239 519 519 3239 131 289 3237 795 795 3238 519 519 3240 795 795 3241 794 794 3243 794 794 3243 795 795 3241 292 134 3242 1127 1127 3244 519 519 3245 130 288 3247 130 288 3247 519 519 3245 794 794 3246 1131 1131 3249 520 520 3250 5 5 3248 5 5 3248 520 520 3250 1130 1130 3251 132 290 3253 796 796 3254 1131 1131 3252 1131 1131 3252 796 796 3254 520 520 3255 796 796 3257 292 134 3258 520 520 3256 520 520 3256 292 134 3258 795 795 3259 520 520 3261 795 795 3262 1130 1130 3260 1130 1130 3260 795 795 3262 131 289 3263 1126 1126 3265 521 521 3266 1 1 3264 1 1 3264 521 521 3266 1134 1134 3267 129 287 3269 797 797 3270 1126 1126 3268 1126 1126 3268 797 797 3270 521 521 3271 797 797 3273 293 135 3274 521 521 3272 521 521 3272 293 135 3274 799 799 3275 521 521 3277 799 799 3278 1134 1134 3276 1134 1134 3276 799 799 3278 133 291 3279 38 38 3280 1132 1132 3281 1125 1125 3283 1125 1125 3283 1132 1132 3281 522 522 3282 1132 1132 3284 132 290 3285 522 522 3287 522 522 3287 132 290 3285 798 798 3286 522 522 3288 798 798 3289 797 797 3291 797 797 3291 798 798 3289 293 135 3290 1125 1125 3292 522 522 3293 129 287 3295 129 287 3295 522 522 3293 797 797 3294 5 5 3296 1133 1133 3297 1131 1131 3299 1131 1131 3299 1133 1133 3297 523 523 3298 1133 1133 3300 133 291 3301 523 523 3303 523 523 3303 133 291 3301 799 799 3302 799 799 3305 293 135 3306 523 523 3304 523 523 3304 293 135 3306 798 798 3307 1131 1131 3308 523 523 3309 132 290 3311 132 290 3311 523 523 3309 798 798 3310 43 43 3312 980 980 3313 999 999 3315 999 999 3315 980 980 3313 524 524 3314 214 214 3317 800 800 3318 980 980 3316 980 980 3316 800 800 3318 524 524 3319 800 800 3321 294 136 3322 524 524 3320 524 524 3320 294 136 3322 802 802 3323 524 524 3325 802 802 3326 999 999 3324 999 999 3324 802 802 3326 224 224 3327 44 44 3328 1135 1135 3329 979 979 3331 979 979 3331 1135 1135 3329 525 525 3330 1135 1135 3332 134 292 3333 525 525 3335 525 525 3335 134 292 3333 801 801 3334 801 801 3337 294 136 3338 525 525 3336 525 525 3336 294 136 3338 800 800 3339 979 979 3340 525 525 3341 214 214 3343 214 214 3343 525 525 3341 800 800 3342 40 40 3344 1000 1000 3345 1136 1136 3347 1136 1136 3347 1000 1000 3345 526 526 3346 1000 1000 3348 224 224 3349 526 526 3351 526 526 3351 224 224 3349 802 802 3350 526 526 3352 802 802 3353 801 801 3355 801 801 3355 802 802 3353 294 136 3354 1136 1136 3356 526 526 3357 134 292 3359 134 292 3359 526 526 3357 801 801 3358 39 39 3360 1137 1137 3361 1142 1142 3363 1142 1142 3363 1137 1137 3361 527 527 3362 1137 1137 3364 135 293 3365 527 527 3367 527 527 3367 135 293 3365 803 803 3366 527 527 3368 803 803 3369 805 805 3371 805 805 3371 803 803 3369 295 137 3370 527 527 3373 805 805 3374 1142 1142 3372 1142 1142 3372 805 805 3374 137 295 3375 1139 1139 3377 528 528 3378 45 45 3376 45 45 3376 528 528 3378 1138 1138 3379 136 294 3381 804 804 3382 1139 1139 3380 1139 1139 3380 804 804 3382 528 528 3383 804 804 3385 295 137 3386 528 528 3384 528 528 3384 295 137 3386 803 803 3387 528 528 3389 803 803 3390 1138 1138 3388 1138 1138 3388 803 803 3390 135 293 3391 60 60 3392 1141 1141 3393 1140 1140 3395 1140 1140 3395 1141 1141 3393 529 529 3394 1141 1141 3396 137 295 3397 529 529 3399 529 529 3399 137 295 3397 805 805 3398 529 529 3400 805 805 3401 804 804 3403 804 804 3403 805 805 3401 295 137 3402 1140 1140 3404 529 529 3405 136 294 3407 136 294 3407 529 529 3405 804 804 3406 60 60 3408 1006 1006 3409 1141 1141 3411 1141 1141 3411 1006 1006 3409 530 530 3410 69 227 3413 806 806 3414 1006 1006 3412 1006 1006 3412 806 806 3414 530 530 3415 806 806 3417 296 138 3418 530 530 3416 530 530 3416 296 138 3418 808 808 3419 530 530 3421 808 808 3422 1141 1141 3420 1141 1141 3420 808 808 3422 137 295 3423 44 44 3424 978 978 3425 1005 1005 3427 1005 1005 3427 978 978 3425 531 531 3426 978 978 3428 213 213 3429 531 531 3431 531 531 3431 213 213 3429 807 807 3430 531 531 3432 807 807 3433 806 806 3435 806 806 3435 807 807 3433 296 138 3434 1005 1005 3436 531 531 3437 69 227 3439 69 227 3439 531 531 3437 806 806 3438 39 39 3440 1142 1142 3441 977 977 3443 977 977 3443 1142 1142 3441 532 532 3442 1142 1142 3444 137 295 3445 532 532 3447 532 532 3447 137 295 3445 808 808 3446 532 532 3448 808 808 3449 807 807 3451 807 807 3451 808 808 3449 296 138 3450 532 532 3453 807 807 3454 977 977 3452 977 977 3452 807 807 3454 213 213 3455 40 40 3456 1136 1136 3457 1144 1144 3459 1144 1144 3459 1136 1136 3457 533 533 3458 1136 1136 3460 134 292 3461 533 533 3463 533 533 3463 134 292 3461 809 809 3462 533 533 3464 809 809 3465 811 811 3467 811 811 3467 809 809 3465 297 139 3466 1144 1144 3468 533 533 3469 138 296 3471 138 296 3471 533 533 3469 811 811 3470 44 44 3472 1004 1004 3473 1135 1135 3475 1135 1135 3475 1004 1004 3473 534 534 3474 68 226 3477 810 810 3478 1004 1004 3476 1004 1004 3476 810 810 3478 534 534 3479 810 810 3481 297 139 3482 534 534 3480 534 534 3480 297 139 3482 809 809 3483 534 534 3485 809 809 3486 1135 1135 3484 1135 1135 3484 809 809 3486 134 292 3487 47 47 3488 1143 1143 3489 1003 1003 3491 1003 1003 3491 1143 1143 3489 535 535 3490 1143 1143 3492 138 296 3493 535 535 3495 535 535 3495 138 296 3493 811 811 3494 535 535 3496 811 811 3497 810 810 3499 810 810 3499 811 811 3497 297 139 3498 1003 1003 3500 535 535 3501 68 226 3503 68 226 3503 535 535 3501 810 810 3502 40 40 3504 1144 1144 3505 1011 1011 3507 1011 1011 3507 1144 1144 3505 536 536 3506 1144 1144 3508 138 296 3509 536 536 3511 536 536 3511 138 296 3509 812 812 3510 536 536 3512 812 812 3513 814 814 3515 814 814 3515 812 812 3513 298 140 3514 1011 1011 3516 536 536 3517 72 230 3519 72 230 3519 536 536 3517 814 814 3518 47 47 3520 1020 1020 3521 1143 1143 3523 1143 1143 3523 1020 1020 3521 537 537 3522 1020 1020 3524 76 234 3525 537 537 3527 537 537 3527 76 234 3525 813 813 3526 537 537 3528 813 813 3529 812 812 3531 812 812 3531 813 813 3529 298 140 3530 537 537 3533 812 812 3534 1143 1143 3532 1143 1143 3532 812 812 3534 138 296 3535 1012 1012 3537 538 538 3538 51 51 3536 51 51 3536 538 538 3538 1019 1019 3539 72 230 3541 814 814 3542 1012 1012 3540 1012 1012 3540 814 814 3542 538 538 3543 814 814 3545 298 140 3546 538 538 3544 538 538 3544 298 140 3546 813 813 3547 538 538 3549 813 813 3550 1019 1019 3548 1019 1019 3548 813 813 3550 76 234 3551 52 52 3552 1145 1145 3553 1148 1148 3555 1148 1148 3555 1145 1145 3553 539 539 3554 1145 1145 3556 139 297 3557 539 539 3559 539 539 3559 139 297 3557 815 815 3558 539 539 3560 815 815 3561 817 817 3563 817 817 3563 815 815 3561 299 141 3562 1148 1148 3564 539 539 3565 140 298 3567 140 298 3567 539 539 3565 817 817 3566 1058 1058 3569 540 540 3570 50 50 3568 50 50 3568 540 540 3570 1146 1146 3571 95 253 3573 816 816 3574 1058 1058 3572 1058 1058 3572 816 816 3574 540 540 3575 816 816 3577 299 141 3578 540 540 3576 540 540 3576 299 141 3578 815 815 3579 540 540 3581 815 815 3582 1146 1146 3580 1146 1146 3580 815 815 3582 139 297 3583 48 48 3584 1147 1147 3585 1057 1057 3587 1057 1057 3587 1147 1147 3585 541 541 3586 140 298 3589 817 817 3590 1147 1147 3588 1147 1147 3588 817 817 3590 541 541 3591 541 541 3592 817 817 3593 816 816 3595 816 816 3595 817 817 3593 299 141 3594 1057 1057 3596 541 541 3597 95 253 3599 95 253 3599 541 541 3597 816 816 3598 55 55 3600 1036 1036 3601 1017 1017 3603 1017 1017 3603 1036 1036 3601 542 542 3602 84 242 3605 818 818 3606 1036 1036 3604 1036 1036 3604 818 818 3606 542 542 3607 818 818 3609 300 142 3610 542 542 3608 542 542 3608 300 142 3610 820 820 3611 542 542 3613 820 820 3614 1017 1017 3612 1017 1017 3612 820 820 3614 75 233 3615 52 52 3616 1148 1148 3617 1035 1035 3619 1035 1035 3619 1148 1148 3617 543 543 3618 140 298 3621 819 819 3622 1148 1148 3620 1148 1148 3620 819 819 3622 543 543 3623 819 819 3625 300 142 3626 543 543 3624 543 543 3624 300 142 3626 818 818 3627 1035 1035 3628 543 543 3629 84 242 3631 84 242 3631 543 543 3629 818 818 3630 48 48 3632 1018 1018 3633 1147 1147 3635 1147 1147 3635 1018 1018 3633 544 544 3634 1018 1018 3636 75 233 3637 544 544 3639 544 544 3639 75 233 3637 820 820 3638 544 544 3640 820 820 3641 819 819 3643 819 819 3643 820 820 3641 300 142 3642 1147 1147 3644 544 544 3645 140 298 3647 140 298 3647 544 544 3645 819 819 3646 50 50 3648 1146 1146 3649 1023 1023 3651 1023 1023 3651 1146 1146 3649 545 545 3650 1146 1146 3652 139 297 3653 545 545 3655 545 545 3655 139 297 3653 821 821 3654 545 545 3656 821 821 3657 823 823 3659 823 823 3659 821 821 3657 301 143 3658 1023 1023 3660 545 545 3661 78 236 3663 78 236 3663 545 545 3661 823 823 3662 1026 1026 3665 546 546 3666 52 52 3664 52 52 3664 546 546 3666 1145 1145 3667 79 237 3669 822 822 3670 1026 1026 3668 1026 1026 3668 822 822 3670 546 546 3671 822 822 3673 301 143 3674 546 546 3672 546 546 3672 301 143 3674 821 821 3675 546 546 3677 821 821 3678 1145 1145 3676 1145 1145 3676 821 821 3678 139 297 3679 51 51 3680 1024 1024 3681 1025 1025 3683 1025 1025 3683 1024 1024 3681 547 547 3682 1024 1024 3684 78 236 3685 547 547 3687 547 547 3687 78 236 3685 823 823 3686 547 547 3688 823 823 3689 822 822 3691 822 822 3691 823 823 3689 301 143 3690 1025 1025 3692 547 547 3693 79 237 3695 79 237 3695 547 547 3693 822 822 3694 57 57 3696 1042 1042 3697 1152 1152 3699 1152 1152 3699 1042 1042 3697 548 548 3698 1042 1042 3700 87 245 3701 548 548 3703 548 548 3703 87 245 3701 824 824 3702 824 824 3705 302 144 3706 548 548 3704 548 548 3704 302 144 3706 826 826 3707 548 548 3709 826 826 3710 1152 1152 3708 1152 1152 3708 826 826 3710 142 300 3711 1149 1149 3713 549 549 3714 49 49 3712 49 49 3712 549 549 3714 1041 1041 3715 141 299 3717 825 825 3718 1149 1149 3716 1149 1149 3716 825 825 3718 549 549 3719 825 825 3721 302 144 3722 549 549 3720 549 549 3720 302 144 3722 824 824 3723 549 549 3725 824 824 3726 1041 1041 3724 1041 1041 3724 824 824 3726 87 245 3727 46 46 3728 1151 1151 3729 1150 1150 3731 1150 1150 3731 1151 1151 3729 550 550 3730 1151 1151 3732 142 300 3733 550 550 3735 550 550 3735 142 300 3733 826 826 3734 550 550 3736 826 826 3737 825 825 3739 825 825 3739 826 826 3737 302 144 3738 1150 1150 3740 550 550 3741 141 299 3743 141 299 3743 550 550 3741 825 825 3742 46 46 3744 1008 1008 3745 1151 1151 3747 1151 1151 3747 1008 1008 3745 551 551 3746 1008 1008 3748 70 228 3749 551 551 3751 551 551 3751 70 228 3749 827 827 3750 827 827 3753 303 145 3754 551 551 3752 551 551 3752 303 145 3754 829 829 3755 551 551 3757 829 829 3758 1151 1151 3756 1151 1151 3756 829 829 3758 142 300 3759 1030 1030 3761 552 552 3762 51 51 3760 51 51 3760 552 552 3762 1007 1007 3763 81 239 3765 828 828 3766 1030 1030 3764 1030 1030 3764 828 828 3766 552 552 3767 828 828 3769 303 145 3770 552 552 3768 552 552 3768 303 145 3770 827 827 3771 552 552 3773 827 827 3774 1007 1007 3772 1007 1007 3772 827 827 3774 70 228 3775 57 57 3776 1152 1152 3777 1029 1029 3779 1029 1029 3779 1152 1152 3777 553 553 3778 1152 1152 3780 142 300 3781 553 553 3783 553 553 3783 142 300 3781 829 829 3782 553 553 3784 829 829 3785 828 828 3787 828 828 3787 829 829 3785 303 145 3786 1029 1029 3788 553 553 3789 81 239 3791 81 239 3791 553 553 3789 828 828 3790 55 55 3792 1034 1034 3793 1156 1156 3795 1156 1156 3795 1034 1034 3793 554 554 3794 1034 1034 3796 83 241 3797 554 554 3799 554 554 3799 83 241 3797 830 830 3798 554 554 3800 830 830 3801 832 832 3803 832 832 3803 830 830 3801 304 146 3802 554 554 3805 832 832 3806 1156 1156 3804 1156 1156 3804 832 832 3806 144 302 3807 1153 1153 3809 555 555 3810 54 54 3808 54 54 3808 555 555 3810 1033 1033 3811 143 301 3813 831 831 3814 1153 1153 3812 1153 1153 3812 831 831 3814 555 555 3815 831 831 3817 304 146 3818 555 555 3816 555 555 3816 304 146 3818 830 830 3819 555 555 3821 830 830 3822 1033 1033 3820 1033 1033 3820 830 830 3822 83 241 3823 56 56 3824 1155 1155 3825 1154 1154 3827 1154 1154 3827 1155 1155 3825 556 556 3826 1155 1155 3828 144 302 3829 556 556 3831 556 556 3831 144 302 3829 832 832 3830 556 556 3832 832 832 3833 831 831 3835 831 831 3835 832 832 3833 304 146 3834 1154 1154 3836 556 556 3837 143 301 3839 143 301 3839 556 556 3837 831 831 3838 56 56 3840 1044 1044 3841 1155 1155 3843 1155 1155 3843 1044 1044 3841 557 557 3842 88 246 3845 833 833 3846 1044 1044 3844 1044 1044 3844 833 833 3846 557 557 3847 833 833 3849 305 147 3850 557 557 3848 557 557 3848 305 147 3850 835 835 3851 557 557 3853 835 835 3854 1155 1155 3852 1155 1155 3852 835 835 3854 144 302 3855 57 57 3856 1038 1038 3857 1043 1043 3859 1043 1043 3859 1038 1038 3857 558 558 3858 1038 1038 3860 85 243 3861 558 558 3863 558 558 3863 85 243 3861 834 834 3862 558 558 3864 834 834 3865 833 833 3867 833 833 3867 834 834 3865 305 147 3866 1043 1043 3868 558 558 3869 88 246 3871 88 246 3871 558 558 3869 833 833 3870 55 55 3872 1156 1156 3873 1037 1037 3875 1037 1037 3875 1156 1156 3873 559 559 3874 1156 1156 3876 144 302 3877 559 559 3879 559 559 3879 144 302 3877 835 835 3878 559 559 3880 835 835 3881 834 834 3883 834 834 3883 835 835 3881 305 147 3882 1037 1037 3884 559 559 3885 85 243 3887 85 243 3887 559 559 3885 834 834 3886 45 45 3888 1157 1157 3889 1162 1162 3891 1162 1162 3891 1157 1157 3889 560 560 3890 1157 1157 3892 145 303 3893 560 560 3895 560 560 3895 145 303 3893 836 836 3894 560 560 3896 836 836 3897 838 838 3899 838 838 3899 836 836 3897 306 148 3898 1162 1162 3900 560 560 3901 147 305 3903 147 305 3903 560 560 3901 838 838 3902 1159 1159 3905 561 561 3906 58 58 3904 58 58 3904 561 561 3906 1158 1158 3907 146 304 3909 837 837 3910 1159 1159 3908 1159 1159 3908 837 837 3910 561 561 3911 837 837 3913 306 148 3914 561 561 3912 561 561 3912 306 148 3914 836 836 3915 561 561 3917 836 836 3918 1158 1158 3916 1158 1158 3916 836 836 3918 145 303 3919 65 65 3920 1161 1161 3921 1160 1160 3923 1160 1160 3923 1161 1161 3921 562 562 3922 147 305 3925 838 838 3926 1161 1161 3924 1161 1161 3924 838 838 3926 562 562 3927 562 562 3928 838 838 3929 837 837 3931 837 837 3931 838 838 3929 306 148 3930 1160 1160 3932 562 562 3933 146 304 3935 146 304 3935 562 562 3933 837 837 3934 65 65 3936 1050 1050 3937 1161 1161 3939 1161 1161 3939 1050 1050 3937 563 563 3938 91 249 3941 839 839 3942 1050 1050 3940 1050 1050 3940 839 839 3942 563 563 3943 839 839 3945 307 149 3946 563 563 3944 563 563 3944 307 149 3946 841 841 3947 1161 1161 3948 563 563 3949 147 305 3951 147 305 3951 563 563 3949 841 841 3950 60 60 3952 1140 1140 3953 1049 1049 3955 1049 1049 3955 1140 1140 3953 564 564 3954 136 294 3957 840 840 3958 1140 1140 3956 1140 1140 3956 840 840 3958 564 564 3959 840 840 3961 307 149 3962 564 564 3960 564 564 3960 307 149 3962 839 839 3963 1049 1049 3964 564 564 3965 91 249 3967 91 249 3967 564 564 3965 839 839 3966 45 45 3968 1162 1162 3969 1139 1139 3971 1139 1139 3971 1162 1162 3969 565 565 3970 1162 1162 3972 147 305 3973 565 565 3975 565 565 3975 147 305 3973 841 841 3974 565 565 3976 841 841 3977 840 840 3979 840 840 3979 841 841 3977 307 149 3978 1139 1139 3980 565 565 3981 136 294 3983 136 294 3983 565 565 3981 840 840 3982 59 59 3984 1163 1163 3985 1051 1051 3987 1051 1051 3987 1163 1163 3985 566 566 3986 1163 1163 3988 148 306 3989 566 566 3991 566 566 3991 148 306 3989 842 842 3990 566 566 3992 842 842 3993 844 844 3995 844 844 3995 842 842 3993 308 150 3994 1051 1051 3996 566 566 3997 92 250 3999 92 250 3999 566 566 3997 844 844 3998 1022 1022 4001 567 567 4002 50 50 4000 50 50 4000 567 567 4002 1164 1164 4003 77 235 4005 843 843 4006 1022 1022 4004 1022 1022 4004 843 843 4006 567 567 4007 843 843 4009 308 150 4010 567 567 4008 567 567 4008 308 150 4010 842 842 4011 567 567 4013 842 842 4014 1164 1164 4012 1164 1164 4012 842 842 4014 148 306 4015 47 47 4016 1052 1052 4017 1021 1021 4019 1021 1021 4019 1052 1052 4017 568 568 4018 92 250 4021 844 844 4022 1052 1052 4020 1052 1052 4020 844 844 4022 568 568 4023 844 844 4025 308 150 4026 568 568 4024 568 568 4024 308 150 4026 843 843 4027 1021 1021 4028 568 568 4029 77 235 4031 77 235 4031 568 568 4029 843 843 4030 2 2 4032 1165 1165 4033 1168 1168 4035 1168 1168 4035 1165 1165 4033 569 569 4034 1165 1165 4036 149 307 4037 569 569 4039 569 569 4039 149 307 4037 845 845 4038 845 845 4041 309 151 4042 569 569 4040 569 569 4040 309 151 4042 847 847 4043 569 569 4045 847 847 4046 1168 1168 4044 1168 1168 4044 847 847 4046 150 308 4047 1054 1054 4049 570 570 4050 4 4 4048 4 4 4048 570 570 4050 1166 1166 4051 93 251 4053 846 846 4054 1054 1054 4052 1054 1054 4052 846 846 4054 570 570 4055 846 846 4057 309 151 4058 570 570 4056 570 570 4056 309 151 4058 845 845 4059 570 570 4061 845 845 4062 1166 1166 4060 1166 1166 4060 845 845 4062 149 307 4063 50 50 4064 1167 1167 4065 1053 1053 4067 1053 1053 4067 1167 1167 4065 571 571 4066 1167 1167 4068 150 308 4069 571 571 4071 571 571 4071 150 308 4069 847 847 4070 571 571 4072 847 847 4073 846 846 4075 846 846 4075 847 847 4073 309 151 4074 1053 1053 4076 571 571 4077 93 251 4079 93 251 4079 571 571 4077 846 846 4078 50 50 4080 1164 1164 4081 1172 1172 4083 1172 1172 4083 1164 1164 4081 572 572 4082 1164 1164 4084 148 306 4085 572 572 4087 572 572 4087 148 306 4085 848 848 4086 572 572 4088 848 848 4089 850 850 4091 850 850 4091 848 848 4089 310 152 4090 1172 1172 4092 572 572 4093 152 310 4095 152 310 4095 572 572 4093 850 850 4094 1169 1169 4097 573 573 4098 59 59 4096 59 59 4096 573 573 4098 1163 1163 4099 151 309 4101 849 849 4102 1169 1169 4100 1169 1169 4100 849 849 4102 573 573 4103 849 849 4105 310 152 4106 573 573 4104 573 573 4104 310 152 4106 848 848 4107 573 573 4109 848 848 4110 1163 1163 4108 1163 1163 4108 848 848 4110 148 306 4111 63 63 4112 1171 1171 4113 1170 1170 4115 1170 1170 4115 1171 1171 4113 574 574 4114 1171 1171 4116 152 310 4117 574 574 4119 574 574 4119 152 310 4117 850 850 4118 574 574 4120 850 850 4121 849 849 4123 849 849 4123 850 850 4121 310 152 4122 1170 1170 4124 574 574 4125 151 309 4127 151 309 4127 574 574 4125 849 849 4126 50 50 4128 1173 1173 4129 1178 1178 4131 1178 1178 4131 1173 1173 4129 575 575 4130 1173 1173 4132 153 311 4133 575 575 4135 575 575 4135 153 311 4133 851 851 4134 575 575 4136 851 851 4137 853 853 4139 853 853 4139 851 851 4137 311 153 4138 1178 1178 4140 575 575 4141 155 313 4143 155 313 4143 575 575 4141 853 853 4142 61 61 4144 1175 1175 4145 1174 1174 4147 1174 1174 4147 1175 1175 4145 576 576 4146 1175 1175 4148 154 312 4149 576 576 4151 576 576 4151 154 312 4149 852 852 4150 576 576 4152 852 852 4153 851 851 4155 851 851 4155 852 852 4153 311 153 4154 1174 1174 4156 576 576 4157 153 311 4159 153 311 4159 576 576 4157 851 851 4158 1177 1177 4161 577 577 4162 3 3 4160 3 3 4160 577 577 4162 1176 1176 4163 155 313 4165 853 853 4166 1177 1177 4164 1177 1177 4164 853 853 4166 577 577 4167 853 853 4169 311 153 4170 577 577 4168 577 577 4168 311 153 4170 852 852 4171 577 577 4173 852 852 4174 1176 1176 4172 1176 1176 4172 852 852 4174 154 312 4175 63 63 4176 1068 1068 4177 1171 1171 4179 1171 1171 4179 1068 1068 4177 578 578 4178 1068 1068 4180 100 258 4181 578 578 4183 578 578 4183 100 258 4181 854 854 4182 854 854 4185 312 154 4186 578 578 4184 578 578 4184 312 154 4186 856 856 4187 578 578 4189 856 856 4190 1171 1171 4188 1171 1171 4188 856 856 4190 152 310 4191 61 61 4192 1174 1174 4193 1067 1067 4195 1067 1067 4195 1174 1174 4193 579 579 4194 153 311 4197 855 855 4198 1174 1174 4196 1174 1174 4196 855 855 4198 579 579 4199 855 855 4201 312 154 4202 579 579 4200 579 579 4200 312 154 4202 854 854 4203 1067 1067 4204 579 579 4205 100 258 4207 100 258 4207 579 579 4205 854 854 4206 50 50 4208 1172 1172 4209 1173 1173 4211 1173 1173 4211 1172 1172 4209 580 580 4210 1172 1172 4212 152 310 4213 580 580 4215 580 580 4215 152 310 4213 856 856 4214 580 580 4216 856 856 4217 855 855 4219 855 855 4219 856 856 4217 312 154 4218 1173 1173 4220 580 580 4221 153 311 4223 153 311 4223 580 580 4221 855 855 4222 1168 1168 4225 581 581 4226 2 2 4224 2 2 4224 581 581 4226 1180 1180 4227 150 308 4229 857 857 4230 1168 1168 4228 1168 1168 4228 857 857 4230 581 581 4231 857 857 4233 313 155 4234 581 581 4232 581 581 4232 313 155 4234 859 859 4235 581 581 4237 859 859 4238 1180 1180 4236 1180 1180 4236 859 859 4238 156 314 4239 50 50 4240 1178 1178 4241 1167 1167 4243 1167 1167 4243 1178 1178 4241 582 582 4242 1178 1178 4244 155 313 4245 582 582 4247 582 582 4247 155 313 4245 858 858 4246 582 582 4248 858 858 4249 857 857 4251 857 857 4251 858 858 4249 313 155 4250 1167 1167 4252 582 582 4253 150 308 4255 150 308 4255 582 582 4253 857 857 4254 3 3 4256 1179 1179 4257 1177 1177 4259 1177 1177 4259 1179 1179 4257 583 583 4258 1179 1179 4260 156 314 4261 583 583 4263 583 583 4263 156 314 4261 859 859 4262 859 859 4265 313 155 4266 583 583 4264 583 583 4264 313 155 4266 858 858 4267 1177 1177 4268 583 583 4269 155 313 4271 155 313 4271 583 583 4269 858 858 4270 65 65 4272 1160 1160 4273 1061 1061 4275 1061 1061 4275 1160 1160 4273 584 584 4274 146 304 4277 860 860 4278 1160 1160 4276 1160 1160 4276 860 860 4278 584 584 4279 860 860 4281 314 156 4282 584 584 4280 584 584 4280 314 156 4282 862 862 4283 584 584 4285 862 862 4286 1061 1061 4284 1061 1061 4284 862 862 4286 97 255 4287 58 58 4288 1181 1181 4289 1159 1159 4291 1159 1159 4291 1181 1181 4289 585 585 4290 157 315 4293 861 861 4294 1181 1181 4292 1181 1181 4292 861 861 4294 585 585 4295 861 861 4297 314 156 4298 585 585 4296 585 585 4296 314 156 4298 860 860 4299 1159 1159 4300 585 585 4301 146 304 4303 146 304 4303 585 585 4301 860 860 4302 62 62 4304 1062 1062 4305 1182 1182 4307 1182 1182 4307 1062 1062 4305 586 586 4306 1062 1062 4308 97 255 4309 586 586 4311 586 586 4311 97 255 4309 862 862 4310 586 586 4312 862 862 4313 861 861 4315 861 861 4315 862 862 4313 314 156 4314 1182 1182 4316 586 586 4317 157 315 4319 157 315 4319 586 586 4317 861 861 4318 64 64 4320 1183 1183 4321 1063 1063 4323 1063 1063 4323 1183 1183 4321 587 587 4322 1183 1183 4324 158 316 4325 587 587 4327 587 587 4327 158 316 4325 863 863 4326 587 587 4328 863 863 4329 865 865 4331 865 865 4331 863 863 4329 315 157 4330 1063 1063 4332 587 587 4333 98 256 4335 98 256 4335 587 587 4333 865 865 4334 1170 1170 4337 588 588 4338 63 63 4336 63 63 4336 588 588 4338 1184 1184 4339 151 309 4341 864 864 4342 1170 1170 4340 1170 1170 4340 864 864 4342 588 588 4343 864 864 4345 315 157 4346 588 588 4344 588 588 4344 315 157 4346 863 863 4347 588 588 4349 863 863 4350 1184 1184 4348 1184 1184 4348 863 863 4350 158 316 4351 59 59 4352 1064 1064 4353 1169 1169 4355 1169 1169 4355 1064 1064 4353 589 589 4354 98 256 4357 865 865 4358 1064 1064 4356 1064 1064 4356 865 865 4358 589 589 4359 865 865 4361 315 157 4362 589 589 4360 589 589 4360 315 157 4362 864 864 4363 1169 1169 4364 589 589 4365 151 309 4367 151 309 4367 589 589 4365 864 864 4366 63 63 4368 1184 1184 4369 1069 1069 4371 1069 1069 4371 1184 1184 4369 590 590 4370 1184 1184 4372 158 316 4373 590 590 4375 590 590 4375 158 316 4373 866 866 4374 590 590 4376 866 866 4377 868 868 4379 868 868 4379 866 866 4377 316 158 4378 1069 1069 4380 590 590 4381 101 259 4383 101 259 4383 590 590 4381 868 868 4382 872 872 4385 591 591 4386 64 64 4384 64 64 4384 591 591 4386 1183 1183 4387 160 160 4389 867 867 4390 872 872 4388 872 872 4388 867 867 4390 591 591 4391 867 867 4393 316 158 4394 591 591 4392 591 591 4392 316 158 4394 866 866 4395 591 591 4397 866 866 4398 1183 1183 4396 1183 1183 4396 866 866 4398 158 316 4399 1070 1070 4401 592 592 4402 66 66 4400 66 66 4400 592 592 4402 871 871 4403 101 259 4405 868 868 4406 1070 1070 4404 1070 1070 4404 868 868 4406 592 592 4407 868 868 4409 316 158 4410 592 592 4408 592 592 4408 316 158 4410 867 867 4411 592 592 4413 867 867 4414 871 871 4412 871 871 4412 867 867 4414 160 160 4415</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape4</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_4" name="qt_gauge_background_4" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape4">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_4</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_5.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_5.dae
new file mode 100644
index 0000000..2cb8704
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_5.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:37:09</created>
+ <modified>2018-03-08T09:37:09</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape5" name="qt_gauge_background_Shape5">
+ <mesh>
+ <source id="qt_gauge_background_Shape5-positions" name="qt_gauge_background_Shape5-positions">
+ <float_array id="qt_gauge_background_Shape5-positions-array" count="2499">0 0 25.83691 1.83105e-4 0 -25.8369 65.43904 0 -0.5045471 1.20137 0 25.83685 1.119537 0 -25.83673 -65.43905 0 -0.5045776 -3.053589 0 -25.82368 -3.135788 0 25.8273 5.542816 0 25.827 5.524216 0 -25.82295 -33.01378 0 -24.63879 -33.01382 0 24.71909 -48.23112 0 -21.50366 -48.23116 0 21.55615 -64.0509 0 6.964096 -49.52071 0 4.438141 -57.36706 0 -16.47037 -57.97345 0 6.087799 -62.94653 0 -9.287262 -56.80335 0 -7.437988 -48.45133 0 -9.834641 -56.59576 0 17.48833 -59.37135 0 14.73758 -56.78938 0 14.96921 -49.1162 0 15.47443 -35.15257 0 5.210312 -16.61472 0 -25.65398 -16.63339 0 25.68536 -18.37833 0 4.79335 3.467346 0 5.427689 33.01384 0 24.71909 33.01376 0 -24.63881 17.1517 0 25.68529 17.1517 0 -25.65381 18.91301 0 4.79335 35.15256 0 5.210312 48.23114 0 21.55615 48.23112 0 -21.50366 49.52072 0 6.747986 64.0509 0 6.964096 57.36707 0 -16.47037 57.97346 0 5.097214 49.1162 0 -9.007721 57.43393 0 -8.509842 62.94653 0 -9.287262 56.59576 0 17.48833 56.36206 0 14.47476 48.45132 0 15.88539 59.37134 0 14.73756 10.38797 0 -9.820877 24.82481 0 -25.3455 17.30388 0 -9.687881 24.97203 0 -9.45961 48.37526 0 11.29036 43.59856 0 5.54776 41.35913 0 12.34631 48.28346 0 -17.03128 41.13829 0 -23.33661 41.22072 0 -14.69318 59.76808 0 -8.389481 57.42239 0 -3.764908 60.91759 0 -2.584534 48.42058 0 0.5605164 53.62146 0 5.560257 53.62743 0 -1.650909 53.47781 0 -19.22751 53.58424 0 -13.83412 60.50977 0 -13.17436 57.3728 0 -12.14166 53.43842 0 14.8053 53.44876 0 17.17432 53.51006 0 11.16898 61.683 0 11.21332 61.55124 0 6.822769 59.05472 0 11.09708 0.4439545 0 25.83691 2.360825 0 18.797 1.416229 0 18.79706 2.648926 0 25.83574 5.414948 0 18.74075 -8.903503 0 25.7962 -1.25383 0 18.74091 -0.6374054 0 25.83595 -48.4206 0 9.800964 -41.40443 0 12.2964 -33.19753 0 14.43013 -60.91761 0 -2.481934 -64.61833 0 -4.854706 -48.23814 0 -17.08539 -53.4778 0 -19.22752 -61.68301 0 11.21332 -41.13829 0 -23.33659 -41.17542 0 -14.74724 -16.14555 0 -9.687881 -24.77112 0 -25.34552 2.591263 0 -25.83504 2.319901 0 -14.2683 -6.977173 0 -9.82103 -8.845627 0 -25.78345 0.3882446 0 -25.83687 24.82484 0 25.40564 10.5229 0 25.79597 33.19746 0 -7.294205 41.13834 0 23.41109 48.23816 0 19.46445 41.17545 0 18.8479 41.40443 0 -3.617477 65.30664 0 3.229767 62.48608 0 1.789215 64.61833 0 -4.854691 54.69711 0 -8.371628 53.4007 0 19.3562 56.68382 0 11.06209 58.10057 0 16.40518 57.98019 0 14.70491 56.56712 0 16.29114 -9.14418 0 4.54512 -16.14725 0 15.883 -6.994385 0 16.07129 -48.28349 0 19.43823 -41.13834 0 23.41107 -41.22075 0 18.8217 -53.4007 0 19.35622 -53.51433 0 17.1481 -57.35976 0 -1.49057 -53.63355 0 5.398605 -53.55299 0 -1.592407 -65.30666 0 3.229767 -61.55123 0 6.885849 -62.4861 0 1.85228 -60.50977 0 -13.17436 -59.72568 0 -8.280777 -57.31019 0 -12.07248 -53.48137 0 -8.317001 -53.51871 0 -13.88823 -58.10059 0 16.40518 -56.61243 0 16.31995 -58.00529 0 14.75742 -56.72909 0 12.45569 -59.05477 0 11.18387 -54.62479 0 14.8316 -53.61537 0 11.19827 -48.37527 0 -1.797119 -43.59859 0 5.323029 -41.35912 0 -3.711105 -24.77301 0 25.40564 -24.91606 0 15.68658 -33.19749 0 -7.294205 -27.25746 0 4.548782 -24.91603 0 -9.45961 1.416351 0 -14.26849 -0.5813141 0 -25.83557 -1.212677 0 -14.1774 33.19751 0 14.43011 27.29329 0 4.548782 24.97206 0 15.68657 17.30389 0 15.883 12.13005 0 4.545166 10.38826 0 16.07123 10.52104 0 -25.78293 5.397797 0 -14.17703 57.76001 0 16.0643 -10.24054 0 12.49278 -43.76648 0 20.77174 -51.99375 0 18.49013 -54.93864 0 0.9056396 -63.02803 0 4.1306 -59.4015 0 -11.5771 -54.90459 0 -11.71844 -57.76745 0 16.07286 -57.96399 0 12.87132 -55.01572 0 12.88959 -44.25513 0 0.4375458 -21.94141 0 19.07971 -28.02213 0 -4.041519 0.4529114 0 -16.7739 28.03276 0 12.06538 12.86157 0 12.49277 8.520676 0 -15.90215 22.17903 0 -14.79913 44.25517 0 9.730896 43.76642 0 -18.56796 59.4949 0 -4.651337 52.05232 0 1.322937 52.01089 0 -16.46234 59.41406 0 -11.59756 54.74944 0 16.22122 52.00587 0 12.64882 60.59619 0 9.727554 1.51355 0 20.37129 3.264999 0 20.36935 -5.109268 0 19.84261 0.4169617 0 20.36949 -44.26857 0 9.422318 -38.55077 0 15.52834 -54.98581 0 16.22202 -52.01503 0 -4.068512 -59.48235 0 -4.190506 -62.57318 0 -1.507462 -51.99745 0 -16.47839 -60.5962 0 9.746216 -52.05233 0 9.205353 -43.75301 0 -18.58397 -38.53732 0 -8.934387 -28.02213 0 12.0654 -21.94096 0 -14.79913 3.225708 0 -16.77361 -10.23701 0 -4.647476 -5.069855 0 -15.90248 1.477859 0 -16.77641 22.17906 0 19.0797 8.524216 0 19.84248 12.86159 0 -4.647415 28.03275 0 -4.041504 43.75305 0 20.7795 38.53734 0 15.53609 44.26857 0 0.9230652 38.55075 0 -8.918365 63.02803 0 4.111908 62.57318 0 -1.526154 55.15889 0 -4.478485 55.14612 0 -11.7229 51.98032 0 18.49789 54.80057 0 9.465851 57.95656 0 12.59108 57.3913 0 16.64336 58.33839 0 15.64995 57.33583 0 15.59421 -5.577362 0 9.816116 -13.1891 0 9.655777 -12.26524 0 17.68643 -45.68835 0 18.73233 -45.50063 0 21.43298 -39.89171 0 21.98082 -54.09959 0 18.04741 -50.65904 0 19.69768 -50.84677 0 17.70274 -55.77164 0 -2.540848 -55.98647 0 2.779007 -52.95966 0 2.465286 -64.12426 0 2.211029 -63.54105 0 5.341141 -61.2541 0 4.797577 -58.7673 0 -13.49521 -60.75239 0 -10.73796 -58.44653 0 -10.11984 -55.87124 0 -13.68948 -55.77166 0 -10.11984 -52.76862 0 -11.03859 -58.33842 0 15.64995 -57.39129 0 16.64337 -57.40269 0 15.67107 -58.58833 0 13.49396 -57.40268 0 13.92036 -57.91071 0 10.81273 -55.79314 0 10.81267 -55.88616 0 13.92033 -53.21273 0 13.6591 -45.56746 0 -3.587708 -46.40504 0 2.465302 -40.92032 0 2.017776 -26.13594 0 21.32042 -19.80952 0 21.57533 -20.11856 0 14.07715 -29.57484 0 -11.26118 -30.60349 0 -0.2267609 -24.36563 0 -0.9304047 1.215485 0 -9.688705 0.5544434 0 -20.37346 -0.7966003 0 -20.36751 29.57489 0 16.94415 30.60349 0 9.273285 24.46118 0 9.575851 14.21828 0 17.6864 15.00409 0 9.655777 9.664734 0 9.816071 11.47746 0 -19.04256 7.335724 0 -20.34938 6.950943 0 -8.409271 26.13591 0 -18.57314 20.2364 0 -18.84517 20.53734 0 -7.111115 45.56747 0 12.41623 46.40501 0 8.278595 40.92032 0 8.353729 45.68832 0 -14.93121 45.50058 0 -20.28671 39.89165 0 -20.31862 60.85443 0 -6.143677 58.55963 0 -6.368317 58.98462 0 -1.385849 50.84673 0 -2.209824 50.91693 0 3.528381 54.36906 0 2.610779 54.25383 0 -16.4847 50.65903 0 -18.57201 50.84676 0 -14.17133 60.7524 0 -10.73798 58.7673 0 -13.49519 58.55965 0 -10.30431 55.52364 0 16.83966 55.49605 0 15.59415 52.76863 0 16.08138 50.91692 0 10.55008 50.72589 0 13.729 54.07199 0 13.46399 60.09375 0 11.82912 61.96976 0 8.705383 59.75703 0 8.373077 0.8667603 0 22.55885 1.378632 0 22.55882 2.277298 0 15.88647 3.653641 0 15.884 2.238373 0 22.55873 4.073822 0 22.55431 -2.275375 0 15.11473 -9.156586 0 21.74841 -4.293121 0 22.54172 0.5294495 0 22.55885 1.195251 0 15.88409 -0.854187 0 22.55452 -40.92032 0 8.353729 -46.40504 0 7.468491 -45.68835 0 11.96681 -36.45277 0 18.42828 -36.83485 0 12.14595 -42.57268 0 15.72826 -53.21275 0 16.01146 -55.88617 0 15.67102 -55.52365 0 16.83966 -50.91693 0 -0.6459045 -50.72588 0 -5.997055 -54.15425 0 -5.551376 -58.98459 0 -0.5851593 -58.44652 0 -5.551392 -60.85445 0 -6.143677 -60.98185 0 1.053879 -62.7951 0 -4.478821 -63.82329 0 -1.153214 -50.72588 0 -14.31557 -50.65903 0 -18.57201 -54.25382 0 -16.4847 -59.75702 0 8.54129 -61.96976 0 8.705368 -60.09376 0 11.82912 -50.84675 0 11.61473 -50.91692 0 7.468475 -54.36906 0 8.161682 -39.89166 0 -20.31862 -45.5006 0 -20.28671 -45.56747 0 -15.07545 -42.45177 0 -9.389114 -36.83484 0 -3.690033 -36.45273 0 -13.83685 -24.36563 0 9.575836 -30.6035 0 9.27327 -29.57487 0 16.94415 -20.11855 0 -7.111099 -19.80577 0 -18.8452 -26.13591 0 -18.57314 4.040649 0 -20.367 2.18103 0 -20.37315 3.628815 0 -9.688507 -12.25682 0 -12.2865 -13.1891 0 -1.026215 -5.572739 0 -0.92453 -4.235565 0 -20.3499 -9.123291 0 -19.04286 -2.250519 0 -8.409485 0.8420715 0 -20.37346 2.257172 0 -9.691986 1.32132 0 -20.3734 20.53734 0 14.07715 20.23643 0 21.57532 26.13594 0 21.32042 6.955612 0 15.11462 7.344116 0 22.54149 11.47746 0 21.74829 9.664719 0 -0.9245453 15.0041 0 -1.02623 14.21829 0 -12.28644 24.46117 0 -0.9304199 30.60349 0 -0.2267456 29.57484 0 -11.26118 39.89169 0 21.98082 45.50061 0 21.433 45.56749 0 18.80226 42.45181 0 15.79819 36.83485 0 12.14595 36.45276 0 18.42828 40.92032 0 2.017761 46.40503 0 3.528366 45.68832 0 -2.811005 36.45271 0 -13.83685 36.83484 0 -3.690033 42.57263 0 -9.244888 61.2541 0 4.629364 63.54105 0 5.341141 64.12425 0 2.211044 63.82327 0 -1.153214 62.79509 0 -4.478806 60.98187 0 0.8856506 55.98647 0 -1.132858 56.20802 0 -6.368317 53.21272 0 -5.852829 53.21272 0 -10.89436 56.20805 0 -10.30431 55.87123 0 -13.68948 50.72592 0 17.77266 50.65904 0 19.69768 54.09956 0 18.04741 55.49605 0 11.79913 55.79314 0 7.993469 52.95966 0 8.278595 57.91072 0 10.26503 57.33583 0 13.46405 58.58832 0 13.49396 57.96771 0 16.28493 57.92596 0 15.5865 57.33276 0 16.2451 -9.454575 0 9.202194 -12.73592 0 14.06439 -8.60881 0 14.13187 -45.85878 0 20.20215 -42.66953 0 21.98222 -42.71646 0 20.08855 -52.66951 0 18.82973 -50.50137 0 18.8168 -52.71643 0 17.81821 -56.03678 0 -0.07501221 -54.40416 0 2.942047 -54.35043 0 -0.1534576 -64.00046 0 3.772049 -62.32458 0 5.352585 -62.7179 0 3.256653 -59.9436 0 -12.3858 -59.64223 0 -10.29843 -58.55913 0 -11.95247 -56.00797 0 -12.00102 -54.3027 0 -10.37363 -54.32758 0 -12.7038 -57.9677 0 16.28493 -57.34946 0 16.26434 -57.9427 0 15.60571 -58.00517 0 13.76665 -57.47932 0 12.61833 -58.40996 0 12.13226 -55.82373 0 12.61829 -54.76562 0 13.80788 -54.4191 0 12.17348 -46.05464 0 -0.4151917 -43.79929 0 2.751709 -42.94336 0 -1.12825 -23.17876 0 21.86908 -19.44942 0 17.69849 -23.25601 0 17.60501 -30.1759 0 -5.603165 -27.45677 0 -0.186554 -26.55309 0 -6.408234 1.083099 0 -14.97054 0.1396332 0 -20.41235 0.03956604 0 -14.96573 30.1759 0 13.32321 27.48065 0 8.996323 26.57697 0 13.77591 14.68901 0 14.06439 12.32632 0 9.202179 11.64496 0 14.13184 9.345856 0 -20.05727 7.016968 0 -14.63412 9.249634 0 -13.0386 23.28548 0 -19.39769 19.98409 0 -12.56702 23.36072 0 -12.46571 46.05464 0 10.42183 43.7993 0 7.942093 42.94336 0 10.79269 45.85875 0 -17.85133 42.66948 0 -20.70998 42.71642 0 -17.10069 59.69598 0 -6.273087 58.64172 0 -4.051239 60.1255 0 -3.615616 50.5658 0 0.8275299 52.80133 0 3.165756 52.78378 0 -0.03431702 52.70807 0 -17.60811 50.50133 0 -16.54683 52.75496 0 -15.19234 59.94362 0 -12.38582 58.58742 0 -11.99857 59.67047 0 -10.34456 55.65884 0 16.29416 54.23381 0 15.69427 54.24071 0 16.63815 50.53561 0 12.12529 52.67931 0 13.71124 52.72705 0 12.05905 61.0287 0 10.38187 60.92896 0 8.433212 59.83893 0 10.29875 1.073914 0 22.58307 1.910629 0 19.25172 1.551559 0 19.25174 2.813538 0 19.25102 2.950348 0 22.58182 4.07373 0 19.2475 -5.698029 0 18.08682 -6.626129 0 22.36337 -3.103104 0 19.04698 1.061783 0 19.25114 -1.2207e-4 0 19.24767 0.09407043 0 22.582 -43.79929 0 7.739578 -46.08487 0 9.727493 -42.9736 0 10.68036 -36.20441 0 15.21983 -39.79771 0 14.12531 -39.70221 0 17.16924 -54.76563 0 15.69603 -55.75636 0 16.31337 -54.35173 0 16.62068 -50.53559 0 -3.140961 -52.69985 0 -6.032196 -52.74762 0 -3.029572 -58.61345 0 -3.014374 -59.66772 0 -6.068863 -60.1255 0 -3.415436 -61.79778 0 -1.782059 -63.43775 0 -2.888229 -62.45422 0 0.1339722 -50.47112 0 -16.58289 -52.70805 0 -17.60811 -52.72477 0 -15.22842 -60.92897 0 8.47525 -61.02872 0 10.38185 -59.83892 0 10.34081 -50.5658 0 9.639465 -52.80135 0 7.691605 -52.78381 0 10.19225 -42.66948 0 -20.70998 -45.82854 0 -17.88742 -42.6862 0 -17.13673 -39.7675 0 -6.630356 -36.20438 0 -8.458588 -39.672 0 -11.74248 -27.45676 0 8.996338 -30.17592 0 13.32321 -26.55312 0 13.77591 -19.44846 0 -12.56703 -23.17781 0 -19.39769 -23.25598 0 -12.46571 2.902908 0 -20.41193 2.772858 0 -14.97029 4.044647 0 -14.96536 -12.73383 0 -6.781342 -9.4534 0 -0.447464 -8.600861 0 -6.787201 -6.578522 0 -20.05768 -5.668823 0 -13.03885 -3.062256 0 -14.63449 1.530472 0 -14.97136 1.871155 0 -14.9713 1.028641 0 -20.41382 19.9841 0 17.6985 23.28551 0 21.86908 23.36073 0 17.60501 7.024902 0 19.04681 9.347961 0 22.36317 9.250809 0 18.08673 12.32632 0 -0.447464 14.68901 0 -6.781311 11.64496 0 -6.78714 27.48064 0 -0.1865692 30.17589 0 -5.60318 26.57692 0 -6.408234 42.66954 0 21.98222 45.82855 0 20.21962 42.68625 0 20.10603 39.7675 0 14.14279 36.20439 0 15.21982 39.67197 0 17.18674 43.7993 0 3.017471 46.08487 0 0.6772461 42.97359 0 -0.934082 36.20436 0 -8.458572 39.79773 0 -6.594284 39.70218 0 -11.70642 62.32457 0 5.310532 64.00047 0 3.772049 62.71788 0 3.2146 63.43774 0 -2.888229 61.79776 0 -1.824097 62.45421 0 0.09190369 56.14586 0 -3.987991 54.84605 0 -6.200363 54.46741 0 -3.226654 54.84607 0 -10.38367 56.11708 0 -12.04715 54.4386 0 -12.66772 50.47115 0 18.83427 52.66953 0 18.82971 52.68623 0 17.83566 55.7262 0 10.19627 54.35583 0 7.852066 54.28156 0 10.26756 57.46262 0 11.98784 57.98846 0 13.65256 58.40994 0 11.99533 57.48064 0 16.91525 58.662 0 15.74898 58.53481 0 14.72433 57.35278 0 14.67305 56.53641 0 15.61584 56.58473 0 16.80252 -4.216797 0 4.782761 -13.41129 0 4.58429 -16.75308 0 11.25476 -16.1358 0 20.24564 -11.24834 0 20.3163 -2.777649 0 11.71458 -48.5007 0 17.93085 -48.21912 0 20.58688 -44.87817 0 22.54431 -37.14055 0 24.14111 -37.65639 0 20.95433 -44.69208 0 17.18666 -55.23948 0 18.3335 -51.06828 0 20.46194 -51.73674 0 16.66457 -55.02554 0 17.37572 -57.15858 0 -4.429321 -57.56164 0 1.696503 -55.47813 0 5.648727 -51.76119 0 5.083298 -51.76119 0 1.289185 -55.1559 0 -4.429321 -65.50191 0 1.413071 -64.83055 0 5.046478 -62.83463 0 6.968765 -60.13359 0 6.627792 -60.68733 0 3.442535 -64.02702 0 0.5914917 -59.02325 0 -14.89305 -61.8198 0 -11.30792 -61.0904 0 -8.630859 -58.41413 0 -7.988937 -57.15859 0 -10.09572 -57.36325 0 -13.96385 -55.1559 0 -7.988937 -51.47461 0 -8.775742 -51.47462 0 -12.29315 -55.30526 0 -15.18431 -58.662 0 15.74898 -57.48064 0 16.91525 -56.58475 0 16.80252 -56.71749 0 15.73111 -57.45307 0 14.88319 -58.53483 0 14.72433 -56.71748 0 13.96748 -57.05148 0 10.16351 -58.6767 0 9.216232 -59.25144 0 12.91167 -55.92535 0 14.88313 -52.65149 0 15.02119 -51.73673 0 13.06453 -55.42979 0 9.121246 -48.31937 0 -5.248154 -48.76759 0 1.289185 -46.54604 0 5.083298 -40.05905 0 5.346359 -38.39116 0 -0.03128052 -44.51076 0 -6.697342 -28.88708 0 25.12964 -20.68423 0 25.57993 -21.77222 0 11.20502 -28.37126 0 19.74142 -33.01379 0 -14.17535 -33.74858 0 -1.308731 -30.77391 0 4.766022 -23.4805 0 4.591248 -21.7722 0 -3.043549 -28.37123 0 -15.98859 2.148834 0 -7.082199 0.7033997 0 -20.33308 -0.1723938 0 -25.83688 -1.462921 0 -25.8316 -2.254791 0 -20.31975 0.3161163 0 -6.758255 33.01379 0 18.64133 33.74861 0 10.34399 30.77391 0 4.766022 23.62379 0 4.591248 21.99631 0 11.20502 28.37125 0 19.74142 17.1577 0 20.24561 17.7303 0 11.25476 15.12273 0 4.58429 8.822876 0 4.782776 7.66069 0 11.71454 13.2588 0 20.31622 13.66977 0 -25.73381 7.780762 0 -25.80981 5.537262 0 -20.31921 4.953323 0 -6.758041 7.659515 0 -3.298233 13.2588 0 -16.66554 28.88704 0 -25.05701 20.89153 0 -25.53442 17.1577 0 -16.58496 17.73033 0 -3.100815 21.99629 0 -3.043549 28.37122 0 -15.9886 48.31938 0 13.35233 48.76761 0 9.201721 46.54604 0 5.982208 40.05904 0 5.346359 38.39116 0 9.694595 44.51074 0 14.22171 48.50069 0 -13.91866 48.2191 0 -19.44276 44.87813 0 -22.47969 37.1405 0 -24.06082 37.65634 0 -18.29887 44.69203 0 -11.92839 61.09041 0 -8.630859 58.5838 0 -8.423767 57.40909 0 -6.407394 57.56165 0 -0.2823181 59.72055 0 0.6017761 61.92433 0 -5.65419 48.50067 0 -3.33049 48.76759 0 3.661591 51.76118 0 5.982208 55.42981 0 5.396423 55.47815 0 1.349289 51.73671 0 -4.723404 55.54797 0 -17.91273 51.06825 0 -20.42206 51.73674 0 -12.0768 55.30525 0 -15.18433 61.81981 0 -11.30792 59.02325 0 -14.89305 57.36322 0 -13.96385 57.40907 0 -10.37248 54.98416 0 14.673 51.47461 0 15.12608 51.47462 0 16.76947 55.02551 0 17.37572 54.98416 0 12.86676 51.76118 0 9.201721 60.43506 0 13.16183 62.94499 0 9.083557 62.83463 0 6.968765 60.13354 0 6.375488 58.67668 0 8.869049 59.25142 0 12.91167 0.2023926 0 25.83691 0.7639008 0 25.83688 1.770309 0 22.53458 2.994446 0 14.18874 2.148758 0 14.18878 0.7032623 0 22.53465 1.795578 0 25.83678 3.863861 0 25.83278 5.55603 0 22.5247 4.965347 0 13.99333 -12.63316 0 25.75478 -5.664383 0 25.8177 -2.316269 0 22.52493 0.2945709 0 13.99342 -1.537659 0 25.83307 -0.2023926 0 25.83691 -48.76759 0 7.418701 -48.50069 0 12.26198 -44.69206 0 14.02194 -38.39117 0 9.694595 -33.01384 0 18.64133 -33.7486 0 10.34399 -61.92435 0 -5.65419 -59.72056 0 1.012207 -63.88315 0 -7.105988 -65.14074 0 -2.624023 -48.31938 0 -14.13501 -48.2191 0 -19.44276 -51.06827 0 -20.42206 -55.54799 0 -17.91273 -62.945 0 9.083557 -60.43507 0 13.16183 -37.1405 0 -24.06082 -44.87814 0 -22.47969 -44.51074 0 -12.14473 -37.65634 0 -18.29884 -16.75307 0 -3.100815 -16.12904 0 -16.58501 -20.67673 0 -25.53448 -28.88704 0 -25.05701 3.82666 0 -25.83096 1.721176 0 -25.83656 1.709122 0 -20.33292 2.973022 0 -7.082092 -2.765579 0 -3.298355 -11.22951 0 -16.66571 -5.589676 0 -25.81047 -12.59583 0 -25.73415 0.6895294 0 -25.83682 0.1727295 0 -25.83688 20.89156 0 25.5799 28.88708 0 25.12964 7.788208 0 25.8174 13.66978 0 25.75462 33.7486 0 -1.308731 33.01376 0 -14.17537 37.14055 0 24.14111 44.87817 0 22.54431 48.2191 0 20.58688 48.3194 0 18.03572 44.51076 0 17.29155 37.65639 0 20.95433 44.69203 0 -6.322906 38.39117 0 -0.03128052 64.83054 0 5.046478 65.50191 0 1.413071 64.02701 0 0.5914917 60.6873 0 3.190231 65.14073 0 -2.624023 63.88316 0 -7.105988 56.21483 0 -8.423767 52.65149 0 -8.559402 51.06828 0 20.46194 55.23947 0 18.3335 56.53638 0 12.86679 57.05148 0 8.774109</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape5-positions-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape5-normals" name="qt_gauge_background_Shape5-normals">
+ <float_array id="qt_gauge_background_Shape5-normals-array" count="2499">0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999998 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape5-normals-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape5-tangents" name="qt_gauge_background_Shape5-tangents">
+ <float_array id="qt_gauge_background_Shape5-tangents-array" count="2499">0 0 -1 0 0 1 -0.9994631 0 0.03276589 0 0 -1 -2.78982e-4 0 1 0.9902397 0 0.139375 0.004978547 0 0.9999876 0.003795669 0 -0.9999928 -0.003444432 0 -0.9999941 -0.005821993 0 0.9999831 0.1008258 0 0.9949041 0.1387022 0 -0.9903341 0.2794921 0 0.960148 0.3598397 0 -0.9330141 0.9263628 0 -0.3766323 -0.2767112 0 -0.9609531 0.6213042 0 0.7835695 0.9956315 0 0.09336943 0.873396 0 0.4870107 -0.8771147 0 0.480281 -0.622858 0 0.7823349 0.5435888 0 -0.8393517 0.828826 0 -0.5595065 -0.9955778 0 0.09394105 -0.3609336 0 0.9325915 -0.8106833 0 -0.5854849 0.01994424 0 0.9998011 0.02601991 0 -0.9996614 0.04205235 0 0.9991154 0.9681528 0 -0.2503599 -0.09899697 0 -0.9950877 -0.1387053 0 0.9903337 -0.0199092 0 -0.9998018 -0.03190632 0 0.9994909 0.04286269 0 0.999081 -0.02771745 0 0.9996158 -0.2826909 0 -0.959211 -0.3562235 0 0.9344008 -0.9559849 0 -0.2934157 -0.8865668 0 -0.4626007 -0.6896537 0 0.7241394 -0.1168243 0 -0.9931526 -0.8530762 0 0.5217863 0.999911 0 -0.01334361 -0.9188705 0 0.3945592 -0.5288673 0 -0.8487045 -0.1962526 0 0.9805534 0.3889482 0 -0.9212596 -0.8187198 0 -0.5741933 -0.9225394 0 -0.3859029 -0.07084125 0 0.9974876 0.9997755 0 -0.0211896 -0.9071789 0 -0.4207452 -0.999633 0 -0.02708928 -0.145821 0 0.989311 0.6662595 0 -0.74572 -0.9975737 0 0.06961875 -0.2233445 0 0.9747396 0.71117 0 -0.7030201 0.1795737 0 0.9837445 0.9999873 0 -0.005035218 -0.9361194 0 -0.3516825 0.9997882 0 0.02057987 -0.2212031 0 -0.9752278 -0.8510947 0 0.5250122 -0.5361204 0 0.8441415 -0.689202 0 -0.7245693 -0.8185029 0 0.5745024 0.9999862 0 -0.005258722 0.08527393 0 0.9963575 0.2008942 0 -0.9796129 -0.7550961 0 0.6556142 -0.8420969 0 -0.5393263 -0.1130295 0 0.9935916 0.985909 0 -0.1672823 0 0 -1 -0.9877479 0 -0.1560582 0.9876005 0 0.1569883 -0.001215913 0 -0.9999993 -0.9993057 0 0.03725862 0.01110693 0 -0.9999383 -0.9627714 0 -0.2703167 0.003203428 0 -0.9999949 0.9895579 0 -0.1441357 -0.4647358 0 -0.8854494 -0.9990501 0 0.04357688 0.9531528 0 -0.3024894 0.9505966 0 0.310429 -0.9996211 0 -0.02752427 0.4441676 0 0.8959437 0.860307 0 -0.5097764 0.1782558 0 0.9839842 -0.6151719 0 -0.788393 -0.9957739 0 -0.09183846 0.04610305 0 0.9989367 -0.003297785 0 0.9999946 0.9949668 0 -0.1002049 -0.8400961 0 0.5424375 0.008299383 0 0.9999656 -1.51937e-4 0 1 -0.0442593 0 -0.9990201 -0.007833663 0 -0.9999693 -0.9957876 0 0.09169042 -0.1796371 0 -0.983733 -0.9998559 0 -0.01697689 0.4228569 0 0.9061965 0.6354267 0 0.7721612 -0.9673331 0 -0.2535086 0.6136938 0 0.7895441 -0.9736563 0 0.2280206 0.03433354 0 0.9994104 -0.4283763 0 -0.9036005 -0.9966791 0 -0.08142949 -0.6353634 0 -0.7722133 -0.03500206 0 0.9993872 0.9989671 0 -0.04543838 -0.04817252 0 0.998839 0.9915412 0 -0.1297925 -0.7063625 0 -0.7078503 0.989777 0 -0.1426234 0.2257796 0 -0.9741784 -0.5134354 0 0.8581282 0.4860693 0 -0.8739203 0.2624803 0 0.9649374 0.997665 0 0.06829763 -0.1343691 0 -0.9909313 -0.8492137 0 0.5280493 0.994274 0 -0.1068607 -0.06447223 0 -0.9979195 -0.6623492 0 0.7491952 0.7563463 0 0.6541715 0.2484775 0 -0.9686377 -0.9970723 0 0.07646461 -0.1922591 0 -0.9813442 -0.6151965 0 0.7883738 0.7598537 0 -0.6500941 -0.9983591 0 0.05726375 -0.2220822 0 0.9750279 -0.9999705 0 0.007675622 0.9820365 0 0.1886912 -0.03958951 0 -0.999216 -0.7047649 0 0.709441 0.9998689 0 0.01619387 0.08106733 0 -0.9967086 -0.7783763 0 0.6277981 0.06693655 0 -0.9977572 0.8186524 0 0.5742893 0.9996438 0 0.0266867 -0.0616605 0 -0.9980972 -0.8979926 0 0.4400106 -0.9948455 0 0.1014024 0.003209058 0 0.9999949 0.9859111 0 -0.1672702 -0.9990498 0 -0.04358395 -0.06229275 0 0.9980579 0.8330739 0 -0.5531617 -0.999439 0 -0.03349198 -0.01307198 0 0.9999146 0.8475925 0 -0.5306477 -0.01559743 0 0.9998784 0.9997423 0 0.02270031 -0.7281113 0 0.6854589 0.97264 0 0.2323174 0.2626744 0 -0.9648845 -0.4490325 0 -0.8935154 0.6660784 0 -0.7458818 0.3459503 0 -0.9382528 0.8306419 0 -0.556807 0.2480952 0 -0.9687356 -0.7270625 0 -0.6865713 -0.9989438 0 -0.04594978 0.3183028 0 -0.9479891 0.428224 0 -0.9036726 -0.9140994 0 -0.4054902 0.5870061 0 -0.8095825 -0.9440195 0 0.3298896 -0.5061695 0 0.862434 -0.6520459 0 0.7581795 0.9808451 0 0.1947895 0.9722532 0 0.233931 -0.3584502 0 0.9335489 -0.3240243 0 0.9460488 0.9924008 0 0.1230475 0.3161693 0 -0.9487028 0.8542811 0 0.5198112 0.8300748 0 0.557652 -0.07994598 0 0.9967992 0.3354475 0 -0.9420589 -0.8342198 0 0.5514321 -0.9808119 0 -0.1949566 0.9272914 0 -0.3743402 0.9481149 0 -0.3179279 0.8663127 0 0.4995021 0.9632434 0 0.2686303 0.1303593 0 0.9914668 0.9224383 0 0.3861444 -0.5311935 0 0.8472505 -0.804313 0 0.5942059 0.3338193 0 0.9426371 0.06829994 0 0.9976648 0.967391 0 -0.2532877 -0.2803227 0 0.9599058 0.8909604 0 0.454081 -0.8821363 0 -0.4709942 0.9834523 0 0.1811672 -0.6671206 0 0.7449497 0.9960873 0 -0.08837501 0.6496923 0 -0.7601973 0.9399614 0 -0.3412807 -0.9995755 0 0.02913485 0.5325874 0 -0.846375 0.4687689 0 -0.8833208 -0.9919765 0 -0.1264225 -0.989899 0 -0.1417746 -0.7429697 0 -0.669325 0.7496282 0 0.6618592 -0.9758062 0 -0.2186373 -0.1923003 0 -0.9813361 -0.8624407 0 -0.5061581 0.8442821 0 0.535899 -0.4450414 0 0.89551 -0.9758089 0 -0.2186253 -0.2175521 0 -0.9760487 -0.6194685 0 0.7850215 0.7737175 0 -0.6335308 0.5280577 0 0.8492085 0.1520462 0 -0.9883734 -0.9999889 0 -0.004711953 0.1563927 0 -0.987695 -0.994758 0 0.1022567 0.6970481 0 0.7170243 -0.9933448 0 -0.1151783 -0.1904514 0 0.9816966 0.5565527 0 -0.8308123 -0.479928 0 0.8773079 0.9843545 0 0.1761996 -0.06163888 0 -0.9980985 -0.9942689 0 -0.1069079 -0.1024969 0 0.9947333 0.8831758 0 -0.4690421 -0.9968698 0 0.07906028 -0.009407216 0 0.9999558 0.7250199 0 -0.688728 -0.6861161 0 -0.727492 -0.3681142 0 0.9297806 0.998118 0 -0.0613233 -0.996737 0 -0.08071719 0.1702421 0 0.9854023 0.730012 0 -0.6834343 -0.8635967 0 0.5041832 0.9939669 0 0.1096805 0.1201462 0 -0.9927562 -0.4235847 0 0.9058565 0.9982723 0 -0.05875803 -0.9352953 0 -0.3538682 -0.9998565 0 -0.01694128 0.09985787 0 0.9950017 0.776294 0 -0.6303711 -0.9884136 0 -0.1517843 -0.1092553 0 0.9940137 0.8411061 0 -0.5408702 -0.1824215 0 0.9832204 0.9957137 0 0.09248855 -0.7472438 0 -0.66455 -0.9944048 0 -0.1056369 -0.01277639 0 0.9999184 0.9286915 0 -0.3708532 0.999686 0 -0.02505641 0.09335546 0 -0.9956328 -0.9882304 0 0.1529728 0.9865031 0 0.1637423 0.08834266 0 -0.9960901 -0.8930832 0 0.4498916 0.9916601 0 0.1288809 0.167015 0 -0.9859544 -0.908892 0 0.4170315 0.4298157 0 -0.9029167 -0.9984483 0 -0.05568631 0.8956602 0 0.4447391 0.2778805 0 -0.9606156 -0.9991934 0 -0.04015764 0.884566 0 0.466415 0.9714386 0 0.237291 0.1280766 0 -0.9917643 -0.7696828 0 0.6384265 0.9983012 0 0.05826332 0.1478616 0 -0.9890081 -0.7515245 0 0.6597052 0.1110191 0 -0.9938183 -0.999373 0 0.03540702 0.8902363 0 0.455499 -0.9957499 0 -0.09209846 0.1889683 0 0.9819832 0.8577469 0 -0.5140722 0.5879058 0 -0.8089294 -0.9969819 0 -0.07763451 0.471776 0 0.8817184 0.8977029 0 -0.4406012 -0.992854 0 -0.1193352 0.03621299 0 0.9993441 0.9706292 0 0.2405803 -0.07907752 0 -0.9968685 -0.3537676 0 0.9353333 -0.9719302 0 -0.2352694 0.009092025 0 0.9999587 0.7223627 0 -0.6915144 0.8399682 0 0.5426357 0.252994 0 -0.9674678 -0.9990969 0 0.04248899 -0.1161069 0 0.9932367 0.987307 0 0.1588235 -0.9775272 0 -0.2108093 -0.9702544 0 -0.2420876 -0.03240903 0 0.9994747 1 0 0 -0.6556599 0 -0.7550563 -0.2361497 0 0.9717167 0.9466234 0 0.3223416 0.9872959 0 0.1588926 -0.9422645 0 -0.3348697 -0.02896845 0 0.9995803 0.2086292 0 -0.9779948 -0.9901047 0 0.1403305 0.4282272 0 0.9036711 0.9970172 0 0.07717947 -0.5554994 0 -0.8315169 -0.448644 0 0.8937106 0.1990615 0 -0.979987 -0.9801865 0 0.198077 0.1836757 0 0.9829869 0.988521 0 0.1510838 0.01779938 0 -0.9998416 -0.8733285 0 0.4871318 0.9885293 0 0.1510292 0.390156 0 -0.9207488 -0.9661103 0 0.2581294 0.9610159 0 -0.2764932 -0.9271811 0 -0.3746135 -0.6849829 0 0.7285591 0.9937465 0 0.1116595 -0.4256705 0 -0.9048783 -0.634819 0 0.7726609 0.05626124 0 -0.9984161 -0.8720156 0 0.489478 0.9856556 0 0.1687694 0.990036 0 0.1408142 -0.1175854 0 -0.9930628 -0.7882351 0 0.6153742 0.1395089 0 -0.9902208 -0.9907878 0 -0.1354236 0.5818414 0 0.8133022 -0.7167171 0 0.697364 0.9913729 0 0.1310719 -0.5453271 0 -0.8382233 0.1842616 0 -0.9828772 -0.9944729 0 0.1049937 0.7236376 0 0.6901801 0.9925421 0 0.1219026 0.1616886 0 -0.9868418 -0.9044848 0 0.4265059 0.03945265 0 -0.9992214 -0.994054 0 0.1088883 0.9969094 0 0.07855954 -0.9962672 0 -0.08632349 -0.1530978 0 0.988211 0.888483 0 -0.4589094 -0.1237643 0 -0.9923116 -0.8667715 0 0.4987055 0.9916049 0 -0.1293047 -0.9919781 0 0.1264097 0.9973375 0 -0.0729241 0.1368069 0 -0.9905977 -0.9885309 0 -0.1510189 -0.09590072 0 0.9953909 0.8011731 0 -0.5984327 -0.9998448 0 0.01761853 0.08863578 0 0.9960641 0.8544184 0 -0.5195857 -0.1764337 0 0.9843125 0.9985045 0 -0.0546687 -0.9057412 0 -0.4238312 -0.2391999 0 0.9709703 0.9968523 0 -0.07928137 -0.8507577 0 -0.5255581 -5.05358e-4 0 0.9999999 0.9653631 0 0.2609102 -0.4122607 0 -0.9110659 0.5249049 0 -0.8511609 -0.9796074 0 -0.2009214 0.3598348 0 0.933016 -0.3280302 0 0.9446672 0.9937542 0 -0.1115913 -0.5686956 0 -0.822548 -0.9989356 0 -0.0461277 0.7000046 0 0.7141383 0.6509658 0 -0.759107 -0.5368545 0 0.8436749 0.9597076 0 0.2810004 -0.5808563 0 -0.8140061 0.9761907 0 -0.2169141 -0.9361187 0 -0.3516841 0.4745404 0 0.8802337 0.9984453 0 0.05574014 -0.1223896 0 -0.9924821 -0.9023096 0 0.4310885 -0.2984217 0 0.9544341 0.9986405 0 -0.05212701 -0.5806548 0 -0.8141498 -0.9723897 0 -0.2333629 0.3963601 0 0.9180951 0.1481671 0 -0.9889623 0.9898482 0 0.1421284 0.09790834 0 -0.9951954 -0.8328378 0 0.5535171 -0.9677986 0 -0.2517257 -0.2774968 0 0.9607266 0.9929908 0 -0.1181915 -0.6710649 0 0.7413986 0.9981134 0 0.06139738 0.3897194 0 0.9209337 0.9977863 0 0.06650252 -0.4704325 0 -0.882436 0.708695 0 -0.705515 0.3004936 0 -0.9537838 -0.6822515 0 0.7311175 -0.5453728 0 -0.8381936 -0.5843306 0 -0.8115157 -0.2698011 0 0.9629161 -0.6809198 0 0.732358 0.7305929 0 -0.6828133 -0.9541551 0 0.2993125 -0.8742217 0 -0.4855269 0.3834299 0 -0.92357 -0.8928561 0 0.4503421 -0.9424194 0 -0.3344334 0.8123153 0 -0.5832185 -0.9991458 0 -0.04132473 -0.4070225 0 -0.9134181 0.05479091 0 -0.9984979 -0.9286825 0 0.3708756 -0.8629276 0 -0.5053276 -0.6710014 0 -0.7414561 -0.07522746 0 0.9971664 -0.9362802 0 0.3512541 -1 0 -1.15507e-4 0.2118701 0 0.9772978 -0.8561956 0 0.5166518 0.1767669 0 -0.9842527 -0.9906699 0 0.1362834 -0.7682911 0 -0.6401007 0.5116487 0 -0.8591948 -0.9969677 0 0.07781618 -0.7665483 0 -0.6421866 -0.9116511 0 -0.4109651 0.4817756 0 0.8762946 -0.7464634 0 0.6654265 0.4883723 0 -0.8726354 -0.9991154 0 0.04205277 -0.849633 0 -0.5273745 -0.9033861 0 0.4288281 0.9912793 0 -0.1317779 0.9748526 0 0.2228505 -0.3439754 0 0.9389787 0.9991138 0 -0.04208992 0.761533 0 0.6481261 -0.5709702 0 0.8209708 0.999113 0 -0.04210848 0.8029736 0 0.5960146 0.9795794 0 0.2010576 -0.271682 0 -0.9623871 0.9690926 0 -0.2466974 0.9681031 0 0.250552 -0.7319406 0 -0.6813684 0.8921251 0 -0.4517884 -0.3505214 0 0.9365547 0.9965037 0 -0.08354844 0.6291459 0 0.7772872 -0.3203792 0 0.9472894 0.8639239 0 -0.5036223 0.8132212 0 0.5819548 0.9994202 0 0.03404658 -0.2286081 0 -0.9735185 0.8541395 0 -0.520044 0.1235161 0 -0.9923426 -0.946048 0 0.3240265 -0.8803001 0 -0.4744173 0.9031629 0 0.4292979 0.2133998 0 -0.976965 0.8628227 0 -0.5055066 0.8123174 0 0.5832156 0.1170034 0 -0.9931315 0.9796977 0 -0.2004803 0.003326315 0 0.9999945 0.7452437 0 -0.6667922 0.6338743 0 0.7734361 0.3604924 0 -0.9327621 -0.821599 0 0.5700659 -0.633054 0 -0.7741076 -0.7858527 0 0.6184137 0.932785 0 0.3604332 0.6021907 0 0.7983523 -0.9817696 0 -0.190075 0.7106391 0 0.7035568 -0.9994242 0 -0.03393119 0.7081294 0 -0.7060827 -0.9957369 0 -0.09223859 -0.8111933 0 -0.5847781 0.8410539 0 -0.5409513 -0.8333007 0 -0.55282 -0.3686561 0 -0.9295659 0.7882841 0 0.6153114 0.374752 0 -0.9271251 0.9895181 0 0.1444092 0.9965689 0 0.08276687 -0.03143972 0 -0.9995056 0.6968064 0 -0.7172592 0.2540176 0 0.9671996 0.7512663 0 -0.6599992 0.818572 0 0.574404 0.9869859 0 0.160807 -0.007682072 0 -0.9999705 0.5322696 0 -0.8465749 -0.5281998 0 0.8491201 0.9461801 0 -0.3236406 0.8172568 0 0.5762736 -0.7722316 0 0.6353411 0.9996569 0 -0.02619134 0.7695546 0 0.6385811 0.6223839 0 0.7827121 0.8573594 0 -0.5147183 0.9973839 0 -0.07228676 0.2195464 0 0.9756021 0.9031645 0 -0.4292946 0.8643294 0 0.502926 0.9311789 0 -0.3645627 -0.7858617 0 -0.6184023 0.6175548 0 -0.7865278 -0.07507137 0 0.9971782 0.9400064 0 -0.3411569 0.8033842 0 0.595461 0.8639227 0 0.5036245 -0.3158132 0 -0.9488214 0.8049445 0 -0.5933501 -0.8779847 0 -0.4786888 -0.3611097 0 0.9325233 -0.9271687 0 0.3746441 0.9989975 0 0.0447651 -0.3439796 0 -0.9389771 0.75863 0 -0.6515217 -0.6570959 0 0.753807 0.9659424 0 -0.2587571 0.8711814 0 0.4909613 0.9983529 0 -0.05737153 -0.8402658 0 -0.5421747 0.9109329 0 -0.4125545 0.6484992 0 -0.7612153 -0.9980875 0 0.06181728 -0.7943768 0 -0.6074253 0.9297702 0 -0.3681404 -0.9263551 0 -0.3766514 0.5340029 0 -0.8454826 -0.9870739 0 -0.1602658 -0.8429111 0 0.5380529 -0.99246 0 0.1225686 0.5608232 0 -0.8279356 -0.9169086 0 0.3990973 -0.7803723 0 -0.6253152 0.1867604 0 -0.9824055 -0.9461165 0 0.3238266 -0.9240029 0 -0.3823854 -0.9992282 0 -0.03928236 0.7434271 0 0.668817 -0.8693036 0 0.4942785 -0.9992183 0 -0.03953264 0.4883708 0 0.8726362 -0.8517584 0 0.5239347 -0.6822518 0 -0.7311173 0.299058 0 0.9542349 -0.5338182 0 0.8455992 0.7484925 0 0.6631432 0.2540176 0 -0.9671996 0.824087 0 -0.5664632 -0.9968676 0 -0.07908814 0.04991386 0 0.9987535 -0.8202723 0 0.5719733 -0.361104 0 -0.9325255 -0.8800007 0 0.4749725 -0.9242801 0 -0.3817149 -0.890337 0 -0.4553021 0.3834376 0 0.9235668 -0.9451346 0 0.3266811 0.8573561 0 0.5147237 0.6537616 0 -0.7567006 0.9973077 0 0.0733302 -0.1721481 0 0.9850711 0.9976555 0 -0.06843562 0.8753359 0 0.4835153 -0.9972708 0 -0.07383045 0.07505353 0 0.9971795 -0.8004465 0 0.5994042 -0.2716023 0 -0.9624096 -0.5843386 0 0.8115099 -0.6841797 0 -0.7293135 -0.6706536 0 0.7417707 0.9523039 0 -0.3051512 0.8394471 0 0.5434414 0.7652313 0 -0.6437554 -0.9999691 0 -0.007858588 -0.7957661 0 -0.6056041 -0.5435921 0 -0.8393495 -0.759845 0 -0.6501043 -0.01581255 0 0.999875 -0.05071533 0 0.9987131 0.988528 0 -0.151038 0.9994077 0 -0.03441298 -0.08363566 0 0.9964964 0.009178977 0 0.9999579 0.9697922 0 -0.2439327 0.9999966 0 -0.002623194 -0.7060545 0 -0.7081575 -0.7185552 0 -0.69547 0.9700126 0 -0.2430545 0.9984331 0 -0.05595778 0.2826898 0 -0.9592114 0.1796407 0 -0.9837323 -0.629854 0 0.7767136 -0.4261115 0 0.9046707 0.5288694 0 -0.8487032 0.4283714 0 -0.9036027 0.4135111 0 0.9104991 0.1489375 0 0.9888466 0.9931018 0 0.1172552 0.9979999 0 0.06321475 -0.1732956 0 -0.9848699 -0.1660629 0 -0.9861152 -0.8148061 0 0.5797335 -0.8706375 0 0.4919252 0.9994632 0 0.0327614 0.9673331 0 -0.2535086 0.003838912 0 -0.9999926 -0.1790895 0 -0.9838328 -0.6979957 0 0.7161019 -0.6332493 0 0.7739479 0.689652 0 0.7241409 0.8185044 0 0.5745002 0.3334059 0 -0.9427834 0.2172034 0 -0.9761264 -0.9911851 0 0.1324847 -0.9996067 0 0.02804395 -0.3171591 0 -0.9483723 -0.222849 0 -0.974853 -0.630915 0 0.7758519 -0.587216 0 0.8094303 0.8187099 0 -0.5742074 0.6353588 0 -0.7722171 -0.999871 0 -0.01606201 -0.9844522 0 0.1756529 -0.1285248 0 0.9917063 -0.06234964 0 0.9980544 -0.997434 0 -0.07159148 -0.9902531 0 0.1392795 0.9756527 0 0.2193214 0.993584 0 0.1130969 -0.09912877 0 -0.9950746 0.09563761 0 -0.9954162 -0.6769059 0 0.7360696 -0.7531111 0 0.6578933 0.9995864 0 -0.02875914 0.9920171 0 0.1261037 0.2119552 0 -0.9772794 0.006591312 0 -0.9999783 -0.8507158 0 0.5256259 -0.6878018 0 0.7258986 0.09899734 0 -0.9950877 0.04258678 0 -0.9990928 0.8838176 0 0.4678316 0.7611434 0 0.6485836 1 0 0 0.9957883 0 0.09168287 -0.1009488 0 -0.9948916 0.01124251 0 -0.9999368 -0.9176459 0 0.397399 -0.8838616 0 0.4677485 -0.9944915 0 0.104817 -0.9931607 0 0.1167557 0 0 1 0.004500015 0 0.9999899 0.9896319 0 -0.1436273 0.9794225 0 -0.2018204 -1 0 0 -0.9910271 0 -0.1336614 -0.1009491 0 0.9948916 0.01157172 0 0.999933 0.9012104 0 -0.4333818 0.7663461 0 -0.6424279 -0.9999994 0 -0.001102399 -0.9957827 0 -0.09174309 -0.05507329 0 0.9984823 0.07166206 0 0.997429 0.8319214 0 -0.5548936 0.8283803 0 -0.5601661 -0.0229702 0 0.9997362 -0.009810928 0 0.9999519 0.9999972 0 -0.00237043 0.9982102 0 0.05980298 -0.9013728 0 -0.4330439 -0.9221708 0 -0.3867829 -0.1008225 0 0.9949044 -0.04797551 0 0.9988485 0.9999998 0 -6.61242e-4 0.9979109 0 -0.06460565 -0.9305695 0 -0.3661153 -0.8869882 0 -0.4617921 -0.9986462 0 0.05201765 -0.9828099 0 -0.1846202 -0.2493032 0 0.9684255 -0.05680869 0 0.9983851 0.8106833 0 -0.5854849 0.5113706 0 -0.8593603 -0.992237 0 0.1243614 -0.999644 0 0.02668011 -0.2794909 0 0.9601483 -0.1782522 0 0.9839848 0.8068119 0 -0.5908084 0.6230084 0 -0.7822152 0.3334071 0 0.942783 -0.02893921 0 0.9995812 0.9999302 0 0.0118146 0.9992016 0 -0.03995318 -0.9320845 0 -0.3622409 -0.9502021 0 -0.3116344 0.9941739 0 0.1077881 0.9937972 0 -0.1112076 -0.3234243 0 -0.9462541 -0.09022887 0 -0.9959211 -0.8323885 0 0.5541925 -0.8516644 0 0.5240875 -0.6212994 0 0.7835733 -0.4441677 0 0.8959437 -0.760491 0 -0.6493485 -0.6172515 0 -0.7867659 -0.8733974 0 0.4870081 -0.7563463 0 0.6541715 0.9999988 0 0.001534086 0.9997899 0 -0.02049679 0.1424065 0 0.9898083 0.1612122 0 0.9869198 0.2806679 0 -0.9598049 0.126702 0 -0.9919408 -0.7593471 0 0.6506857 -0.7473716 0 0.6644063 -0.8288235 0 -0.5595102 -0.860307 0 -0.5097764 0.003838888 0 0.9999926 -0.3008794 0 0.9536622 0.9830606 0 -0.1832807 0.994176 0 -0.1077684 0 0 -1 0 0 -1 -0.985481 0 -0.1697855 -0.9906793 0 -0.1362152 0.988863 0 0.1488288 0.9822881 0 0.1873769 -1.28396e-4 0 -1 -0.002436505 0 -0.999997 -0.999992 0 -0.004001465 -0.9955455 0 0.09428223 0.01734945 0 -0.9998495 0.006637345 0 -0.999978 -0.970561 0 -0.2408554 -0.9507116 0 -0.3100765 0.003609085 0 -0.9999935 0.002209823 0 -0.9999976 0.9695286 0 -0.244978 0.9994708 0 0.03252765 -0.311928 0 -0.9501057 -0.6535401 0 -0.7568919 -1 0 0 -0.9910281 0 0.1336537 0.9626244 0 -0.2708401 0.9460239 0 -0.3240968 0.9188728 0 0.3945538 0.9736559 0 0.2280222 -0.9995296 0 -0.03066907 -0.9999674 0 -0.008077772 0.3562218 0 0.9344014 0.5361192 0 0.8441423 0.8865681 0 -0.4625982 0.8420984 0 -0.539324 0.1387022 0 0.9903341 0.2233399 0 0.9747406 -0.5057339 0 -0.8626896 -0.7103526 0 -0.703846 -0.9794573 0 -0.2016517 -0.9999971 0 -0.002393745 0.02940413 0 0.9995676 0.06992529 0 0.9975522 -0.004719006 0 0.9999889 -0.001753706 0 0.9999985 0.9943113 0 -0.1065135 0.9958953 0 -0.09051249 -0.8137318 0 0.5812405 -0.8494226 0 0.5277133 0.005210362 0 0.9999864 0.01314514 0 0.9999136 -2.12909e-4 0 1 0 0 1 -0.02816973 0 -0.9996032 -0.06778676 0 -0.9976998 -0.004274395 0 -0.9999909 -0.01313928 0 -0.9999137 -0.9775861 0 0.210536 -0.9996438 0 0.02668664 -0.1387027 0 -0.9903341 -0.2257834 0 -0.9741775 -0.9999229 0 0.01241994 -0.9983874 0 -0.0567686 0.3360848 0 0.9418317 0.5135982 0 0.8580308 0.5187967 0 0.8548976 0.765615 0 0.643299 -0.9263654 0 -0.376626 -0.9942731 0 -0.106869 0.6131703 0 0.7899508 0.614477 0 0.7889347 -0.99024 0 0.139373 -0.9505991 0 0.3104213 0.07042984 0 0.9975167 -0.09140905 0 0.9958134 -0.3598381 0 -0.9330148 -0.4860653 0 -0.8739225 -0.9941752 0 -0.1077762 -0.9873338 0 -0.1586569</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape5-tangents-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape5-binormals" name="qt_gauge_background_Shape5-binormals">
+ <float_array id="qt_gauge_background_Shape5-binormals-array" count="2499">-1 0 0 1 0 0 0.03276589 0 0.9994631 -1 0 0 1 0 2.78982e-4 0.139375 0 -0.9902397 0.9999877 0 -0.004978546 -0.9999928 0 -0.003795669 -0.9999942 0 0.003444433 0.9999831 0 0.005821993 0.9949041 0 -0.1008258 -0.9903342 0 -0.1387022 0.9601481 0 -0.2794921 -0.9330142 0 -0.3598397 -0.3766323 0 -0.9263629 -0.9609532 0 0.2767112 0.7835695 0 -0.6213042 0.09336944 0 -0.9956316 0.4870107 0 -0.873396 0.480281 0 0.8771148 0.7823349 0 0.622858 -0.8393517 0 -0.5435888 -0.5595065 0 -0.828826 0.09394106 0 0.9955778 0.9325916 0 0.3609335 -0.5854849 0 0.8106833 0.9998011 0 -0.01994424 -0.9996615 0 -0.02601991 0.9991155 0 -0.04205235 -0.25036 0 -0.9681529 -0.9950877 0 0.09899697 0.9903337 0 0.1387053 -0.9998018 0 0.0199092 0.999491 0 0.03190633 0.999081 0 -0.04286269 0.9996159 0 0.02771746 -0.9592111 0 0.2826909 0.9344008 0 0.3562235 -0.2934157 0 0.955985 -0.4626007 0 0.8865668 0.7241393 0 0.6896537 -0.9931527 0 0.1168243 0.5217863 0 0.8530763 -0.01334362 0 -0.999911 0.3945592 0 0.9188705 -0.8487046 0 0.5288672 0.9805534 0 0.1962526 -0.9212598 0 -0.3889482 -0.5741933 0 0.8187198 -0.3859029 0 0.9225395 0.9974876 0 0.07084125 -0.0211896 0 -0.9997755 -0.4207452 0 0.9071789 -0.02708928 0 0.999633 0.989311 0 0.145821 -0.74572 0 -0.6662595 0.06961875 0 0.9975737 0.9747396 0 0.2233445 -0.7030201 0 -0.71117 0.9837446 0 -0.1795737 -0.005035219 0 -0.9999874 -0.3516825 0 0.9361194 0.02057987 0 -0.9997882 -0.9752278 0 0.2212031 0.5250122 0 0.8510948 0.8441415 0 0.5361204 -0.7245693 0 0.689202 0.5745025 0 0.8185028 -0.005258722 0 -0.9999862 0.9963576 0 -0.08527393 -0.9796129 0 -0.2008942 0.6556141 0 0.7550961 -0.5393263 0 0.8420969 0.9935917 0 0.1130295 -0.1672823 0 -0.9859091 -1 0 0 -0.1560582 0 0.9877478 0.1569884 0 -0.9876006 -0.9999993 0 0.001215913 0.03725863 0 0.9993057 -0.9999384 0 -0.01110693 -0.2703168 0 0.9627715 -0.9999949 0 -0.003203428 -0.1441357 0 -0.989558 -0.8854494 0 0.4647358 0.04357688 0 0.9990501 -0.3024894 0 -0.9531528 0.310429 0 -0.9505966 -0.02752427 0 0.9996212 0.8959437 0 -0.4441676 -0.5097764 0 -0.860307 0.9839843 0 -0.1782558 -0.788393 0 0.6151719 -0.09183846 0 0.9957739 0.9989367 0 -0.04610305 0.9999946 0 0.003297785 -0.1002049 0 -0.9949669 0.5424376 0 0.8400961 0.9999655 0 -0.008299383 1 0 1.51937e-4 -0.9990201 0 0.0442593 -0.9999693 0 0.007833663 0.09169042 0 0.9957876 -0.9837329 0 0.1796371 -0.01697689 0 0.999856 0.9061965 0 -0.4228569 0.7721612 0 -0.6354267 -0.2535086 0 0.9673331 0.7895442 0 -0.6136938 0.2280206 0 0.9736564 0.9994105 0 -0.03433354 -0.9036005 0 0.4283763 -0.08142949 0 0.9966791 -0.7722133 0 0.6353634 0.9993873 0 0.03500206 -0.04543838 0 -0.9989672 0.998839 0 0.04817252 -0.1297925 0 -0.9915412 -0.7078503 0 0.7063624 -0.1426234 0 -0.9897771 -0.9741784 0 -0.2257796 0.8581283 0 0.5134354 -0.8739203 0 -0.4860693 0.9649374 0 -0.2624803 0.06829763 0 -0.997665 -0.9909313 0 0.1343691 0.5280492 0 0.8492138 -0.1068607 0 -0.994274 -0.9979196 0 0.06447223 0.7491952 0 0.6623492 0.6541715 0 -0.7563463 -0.9686378 0 -0.2484775 0.07646461 0 0.9970723 -0.9813442 0 0.1922591 0.7883738 0 0.6151965 -0.6500941 0 -0.7598537 0.05726375 0 0.9983591 0.975028 0 0.2220822 0.007675622 0 0.9999706 0.1886912 0 -0.9820365 -0.9992161 0 0.03958952 0.7094409 0 0.7047649 0.01619387 0 -0.9998689 -0.9967087 0 -0.08106733 0.6277981 0 0.7783763 -0.9977573 0 -0.06693655 0.5742893 0 -0.8186525 0.0266867 0 -0.9996439 -0.9980972 0 0.0616605 0.4400106 0 0.8979926 0.1014024 0 0.9948455 0.9999949 0 -0.003209059 -0.1672702 0 -0.9859112 -0.04358395 0 0.9990498 0.998058 0 0.06229276 -0.5531617 0 -0.833074 -0.03349198 0 0.999439 0.9999146 0 0.01307198 -0.5306478 0 -0.8475925 0.9998783 0 0.01559743 0.02270031 0 -0.9997423 0.685459 0 0.7281113 0.2323174 0 -0.9726401 -0.9648845 0 -0.2626744 -0.8935155 0 0.4490325 -0.7458817 0 -0.6660784 -0.9382529 0 -0.3459503 -0.556807 0 -0.8306419 -0.9687356 0 -0.2480952 -0.6865713 0 0.7270625 -0.04594978 0 0.9989438 -0.9479891 0 -0.3183028 -0.9036726 0 -0.428224 -0.4054902 0 0.9140994 -0.8095825 0 -0.5870061 0.3298896 0 0.9440195 0.862434 0 0.5061695 0.7581795 0 0.6520459 0.1947895 0 -0.9808451 0.233931 0 -0.9722533 0.9335489 0 0.3584501 0.9460488 0 0.3240243 0.1230475 0 -0.9924008 -0.9487028 0 -0.3161693 0.5198113 0 -0.8542812 0.5576521 0 -0.8300748 0.9967992 0 0.07994597 -0.9420589 0 -0.3354475 0.5514321 0 0.8342199 -0.1949566 0 0.980812 -0.3743403 0 -0.9272915 -0.3179279 0 -0.9481149 0.4995021 0 -0.8663127 0.2686303 0 -0.9632434 0.9914669 0 -0.1303593 0.3861445 0 -0.9224384 0.8472505 0 0.5311935 0.5942059 0 0.8043129 0.9426371 0 -0.3338193 0.9976649 0 -0.06829995 -0.2532877 0 -0.9673911 0.9599058 0 0.2803227 0.454081 0 -0.8909605 -0.4709942 0 0.8821363 0.1811672 0 -0.9834524 0.7449498 0 0.6671206 -0.08837502 0 -0.9960874 -0.7601973 0 -0.6496922 -0.3412807 0 -0.9399615 0.02913485 0 0.9995755 -0.846375 0 -0.5325875 -0.8833208 0 -0.4687689 -0.1264225 0 0.9919765 -0.1417746 0 0.989899 -0.6693251 0 0.7429698 0.6618592 0 -0.7496282 -0.2186374 0 0.9758062 -0.9813361 0 0.1923003 -0.5061581 0 0.8624407 0.535899 0 -0.8442822 0.8955101 0 0.4450414 -0.2186253 0 0.975809 -0.9760487 0 0.2175521 0.7850215 0 0.6194685 -0.6335308 0 -0.7737175 0.8492085 0 -0.5280577 -0.9883734 0 -0.1520462 -0.004711953 0 0.9999889 -0.987695 0 -0.1563927 0.1022567 0 0.9947581 0.7170244 0 -0.6970482 -0.1151783 0 0.9933448 0.9816966 0 0.1904514 -0.8308123 0 -0.5565526 0.8773079 0 0.479928 0.1761996 0 -0.9843546 -0.9980985 0 0.06163888 -0.1069079 0 0.994269 0.9947333 0 0.1024969 -0.4690421 0 -0.8831758 0.07906028 0 0.9968699 0.9999558 0 0.009407217 -0.688728 0 -0.7250199 -0.727492 0 0.6861162 0.9297806 0 0.3681142 -0.0613233 0 -0.998118 -0.08071719 0 0.9967371 0.9854023 0 -0.1702421 -0.6834344 0 -0.7300121 0.5041832 0 0.8635967 0.1096805 0 -0.9939669 -0.9927563 0 -0.1201462 0.9058565 0 0.4235847 -0.05875803 0 -0.9982723 -0.3538682 0 0.9352953 -0.01694128 0 0.9998565 0.9950017 0 -0.09985787 -0.6303711 0 -0.7762939 -0.1517843 0 0.9884137 0.9940137 0 0.1092553 -0.5408702 0 -0.8411061 0.9832205 0 0.1824215 0.09248856 0 -0.9957138 -0.66455 0 0.7472438 -0.1056369 0 0.9944048 0.9999185 0 0.01277639 -0.3708532 0 -0.9286916 -0.02505641 0 -0.9996861 -0.9956328 0 -0.09335545 0.1529728 0 0.9882304 0.1637423 0 -0.9865032 -0.9960902 0 -0.08834266 0.4498916 0 0.8930832 0.1288809 0 -0.9916601 -0.9859544 0 -0.167015 0.4170316 0 0.9088921 -0.9029167 0 -0.4298157 -0.05568631 0 0.9984484 0.4447391 0 -0.8956602 -0.9606156 0 -0.2778805 -0.04015765 0 0.9991934 0.466415 0 -0.884566 0.237291 0 -0.9714387 -0.9917643 0 -0.1280766 0.6384265 0 0.7696829 0.05826332 0 -0.9983013 -0.9890081 0 -0.1478616 0.6597052 0 0.7515246 -0.9938183 0 -0.1110191 0.03540702 0 0.999373 0.4554991 0 -0.8902363 -0.09209847 0 0.99575 0.9819832 0 -0.1889683 -0.5140722 0 -0.857747 -0.8089294 0 -0.5879058 -0.07763451 0 0.9969819 0.8817185 0 -0.4717761 -0.4406013 0 -0.8977031 -0.1193352 0 0.992854 0.9993441 0 -0.03621299 0.2405803 0 -0.9706292 -0.9968686 0 0.07907753 0.9353334 0 0.3537676 -0.2352694 0 0.9719303 0.9999587 0 -0.009092025 -0.6915144 0 -0.7223627 0.5426357 0 -0.8399681 -0.9674678 0 -0.252994 0.04248899 0 0.9990969 0.9932368 0 0.1161069 0.1588235 0 -0.987307 -0.2108093 0 0.9775272 -0.2420876 0 0.9702544 0.9994747 0 0.03240903 0 0 -1 -0.7550564 0 0.6556599 0.9717167 0 0.2361497 0.3223416 0 -0.9466235 0.1588926 0 -0.9872959 -0.3348697 0 0.9422644 0.9995803 0 0.02896845 -0.9779949 0 -0.2086292 0.1403305 0 0.9901048 0.9036711 0 -0.4282272 0.07717948 0 -0.9970173 -0.8315169 0 0.5554994 0.8937106 0 0.448644 -0.9799871 0 -0.1990615 0.198077 0 0.9801866 0.982987 0 -0.1836757 0.1510838 0 -0.988521 -0.9998417 0 -0.01779939 0.4871318 0 0.8733285 0.1510292 0 -0.9885293 -0.9207488 0 -0.390156 0.2581294 0 0.9661104 -0.2764932 0 -0.9610159 -0.3746135 0 0.9271811 0.7285591 0 0.6849829 0.1116595 0 -0.9937465 -0.9048783 0 0.4256705 0.7726609 0 0.634819 -0.9984161 0 -0.05626125 0.489478 0 0.8720157 0.1687694 0 -0.9856555 0.1408142 0 -0.9900361 -0.9930629 0 0.1175854 0.6153742 0 0.7882351 -0.9902209 0 -0.1395089 -0.1354236 0 0.9907878 0.8133022 0 -0.5818415 0.697364 0 0.7167172 0.1310719 0 -0.9913729 -0.8382233 0 0.5453271 -0.9828773 0 -0.1842616 0.1049937 0 0.9944729 0.6901801 0 -0.7236376 0.1219026 0 -0.9925421 -0.9868419 0 -0.1616886 0.426506 0 0.9044848 -0.9992214 0 -0.03945265 0.1088883 0 0.9940541 0.07855954 0 -0.9969095 -0.08632349 0 0.9962672 0.988211 0 0.1530978 -0.4589095 0 -0.8884831 -0.9923117 0 0.1237643 0.4987055 0 0.8667715 -0.1293047 0 -0.9916049 0.1264097 0 0.9919781 -0.0729241 0 -0.9973375 -0.9905978 0 -0.1368069 -0.1510189 0 0.9885309 0.995391 0 0.09590074 -0.5984327 0 -0.8011731 0.01761853 0 0.9998448 0.9960641 0 -0.08863578 -0.5195857 0 -0.8544183 0.9843126 0 0.1764337 -0.05466869 0 -0.9985045 -0.4238313 0 0.9057412 0.9709703 0 0.2391999 -0.07928137 0 -0.9968523 -0.5255581 0 0.8507577 0.9999999 0 5.05358e-4 0.2609102 0 -0.9653631 -0.9110661 0 0.4122607 -0.8511609 0 -0.5249049 -0.2009214 0 0.9796074 0.9330161 0 -0.3598348 0.9446672 0 0.3280303 -0.1115913 0 -0.9937542 -0.8225482 0 0.5686957 -0.0461277 0 0.9989356 0.7141383 0 -0.7000046 -0.7591071 0 -0.6509658 0.8436749 0 0.5368545 0.2810004 0 -0.9597077 -0.8140061 0 0.5808563 -0.2169141 0 -0.9761907 -0.3516842 0 0.9361188 0.8802337 0 -0.4745404 0.05574014 0 -0.9984454 -0.9924822 0 0.1223896 0.4310885 0 0.9023097 0.9544341 0 0.2984217 -0.052127 0 -0.9986405 -0.8141499 0 0.5806549 -0.2333629 0 0.9723897 0.9180952 0 -0.3963601 -0.9889624 0 -0.1481671 0.1421284 0 -0.9898483 -0.9951954 0 -0.09790834 0.5535171 0 0.8328378 -0.2517257 0 0.9677987 0.9607266 0 0.2774968 -0.1181915 0 -0.9929909 0.7413986 0 0.671065 0.06139738 0 -0.9981135 0.9209337 0 -0.3897194 0.06650252 0 -0.9977863 -0.882436 0 0.4704325 -0.705515 0 -0.708695 -0.9537839 0 -0.3004936 0.7311175 0 0.6822515 -0.8381936 0 0.5453728 -0.8115157 0 0.5843306 0.9629161 0 0.2698011 0.732358 0 0.6809198 -0.6828133 0 -0.7305928 0.2993125 0 0.9541552 -0.4855269 0 0.8742217 -0.92357 0 -0.3834299 0.4503422 0 0.8928562 -0.3344334 0 0.9424195 -0.5832185 0 -0.8123153 -0.04132473 0 0.9991458 -0.9134182 0 0.4070226 -0.9984979 0 -0.05479091 0.3708756 0 0.9286826 -0.5053277 0 0.8629276 -0.7414561 0 0.6710014 0.9971665 0 0.07522746 0.3512542 0 0.9362803 -1.15507e-4 0 1 0.9772979 0 -0.2118701 0.5166518 0 0.8561956 -0.9842528 0 -0.1767669 0.1362834 0 0.99067 -0.6401007 0 0.7682911 -0.8591948 0 -0.5116487 0.07781618 0 0.9969678 -0.6421866 0 0.7665483 -0.4109651 0 0.9116511 0.8762947 0 -0.4817756 0.6654265 0 0.7464634 -0.8726354 0 -0.4883723 0.04205277 0 0.9991154 -0.5273744 0 0.849633 0.4288281 0 0.9033861 -0.1317779 0 -0.9912794 0.2228505 0 -0.9748526 0.9389787 0 0.3439754 -0.04208993 0 -0.9991139 0.6481261 0 -0.7615331 0.8209708 0 0.5709702 -0.04210848 0 -0.9991131 0.5960146 0 -0.8029736 0.2010577 0 -0.9795794 -0.9623871 0 0.271682 -0.2466974 0 -0.9690926 0.2505521 0 -0.9681032 -0.6813685 0 0.7319406 -0.4517885 0 -0.8921251 0.9365547 0 0.3505214 -0.08354843 0 -0.9965037 0.7772872 0 -0.6291459 0.9472894 0 0.3203792 -0.5036223 0 -0.863924 0.5819548 0 -0.8132212 0.03404658 0 -0.9994202 -0.9735186 0 0.2286081 -0.520044 0 -0.8541395 -0.9923427 0 -0.1235161 0.3240265 0 0.946048 -0.4744173 0 0.8803001 0.429298 0 -0.903163 -0.976965 0 -0.2133998 -0.5055066 0 -0.8628227 0.5832155 0 -0.8123175 -0.9931315 0 -0.1170034 -0.2004803 0 -0.9796978 0.9999945 0 -0.003326315 -0.6667922 0 -0.7452437 0.7734361 0 -0.6338743 -0.9327621 0 -0.3604924 0.5700659 0 0.8215989 -0.7741076 0 0.633054 0.6184137 0 0.7858527 0.3604332 0 -0.932785 0.7983523 0 -0.6021907 -0.190075 0 0.9817696 0.7035568 0 -0.7106391 -0.03393119 0 0.9994242 -0.7060827 0 -0.7081294 -0.09223859 0 0.995737 -0.5847781 0 0.8111933 -0.5409513 0 -0.841054 -0.55282 0 0.8333007 -0.9295658 0 0.3686561 0.6153114 0 -0.7882842 -0.9271251 0 -0.374752 0.1444092 0 -0.9895182 0.08276687 0 -0.9965689 -0.9995056 0 0.03143972 -0.7172592 0 -0.6968064 0.9671996 0 -0.2540176 -0.6599992 0 -0.7512663 0.5744041 0 -0.818572 0.160807 0 -0.9869859 -0.9999705 0 0.007682072 -0.846575 0 -0.5322696 0.8491201 0 0.5281999 -0.3236406 0 -0.9461802 0.5762736 0 -0.8172569 0.6353412 0 0.7722317 -0.02619134 0 -0.999657 0.6385812 0 -0.7695546 0.7827122 0 -0.6223839 -0.5147183 0 -0.8573593 -0.07228676 0 -0.997384 0.9756021 0 -0.2195464 -0.4292946 0 -0.9031645 0.5029261 0 -0.8643295 -0.3645627 0 -0.9311789 -0.6184022 0 0.7858617 -0.7865278 0 -0.6175548 0.9971782 0 0.07507137 -0.3411569 0 -0.9400064 0.595461 0 -0.8033842 0.5036245 0 -0.8639227 -0.9488215 0 0.3158132 -0.5933502 0 -0.8049445 -0.4786888 0 0.8779846 0.9325234 0 0.3611098 0.374644 0 0.9271687 0.0447651 0 -0.9989976 -0.9389772 0 0.3439796 -0.6515217 0 -0.75863 0.7538071 0 0.657096 -0.2587571 0 -0.9659424 0.4909613 0 -0.8711814 -0.05737153 0 -0.9983529 -0.5421747 0 0.8402659 -0.4125545 0 -0.910933 -0.7612154 0 -0.6484992 0.06181729 0 0.9980876 -0.6074253 0 0.7943769 -0.3681404 0 -0.9297703 -0.3766515 0 0.9263551 -0.8454826 0 -0.5340029 -0.1602658 0 0.987074 0.5380529 0 0.8429112 0.1225686 0 0.9924601 -0.8279356 0 -0.5608233 0.3990973 0 0.9169086 -0.6253152 0 0.7803723 -0.9824055 0 -0.1867604 0.3238266 0 0.9461165 -0.3823854 0 0.9240029 -0.03928236 0 0.9992282 0.668817 0 -0.743427 0.4942786 0 0.8693036 -0.03953264 0 0.9992183 0.8726362 0 -0.4883708 0.5239347 0 0.8517585 -0.7311173 0 0.6822518 0.954235 0 -0.299058 0.8455992 0 0.5338182 0.6631432 0 -0.7484925 -0.9671997 0 -0.2540176 -0.5664632 0 -0.8240871 -0.07908814 0 0.9968677 0.9987535 0 -0.04991386 0.5719733 0 0.8202723 -0.9325256 0 0.361104 0.4749725 0 0.8800007 -0.3817149 0 0.9242802 -0.4553021 0 0.890337 0.9235669 0 -0.3834376 0.3266811 0 0.9451346 0.5147237 0 -0.8573562 -0.7567006 0 -0.6537616 0.07333021 0 -0.9973078 0.9850712 0 0.1721481 -0.06843562 0 -0.9976556 0.4835154 0 -0.875336 -0.07383046 0 0.9972709 0.9971795 0 -0.07505353 0.5994042 0 0.8004466 -0.9624096 0 0.2716023 0.8115099 0 0.5843386 -0.7293135 0 0.6841797 0.7417707 0 0.6706536 -0.3051512 0 -0.9523039 0.5434414 0 -0.8394471 -0.6437554 0 -0.7652313 -0.007858588 0 0.9999691 -0.6056041 0 0.7957662 -0.8393496 0 0.5435921 -0.6501043 0 0.759845 0.999875 0 0.01581255 0.9987132 0 0.05071534 -0.151038 0 -0.988528 -0.03441298 0 -0.9994078 0.9964964 0 0.08363567 0.9999579 0 -0.009178977 -0.2439327 0 -0.9697922 -0.002623194 0 -0.9999966 -0.7081575 0 0.7060546 -0.69547 0 0.7185552 -0.2430545 0 -0.9700127 -0.05595778 0 -0.9984332 -0.9592114 0 -0.2826898 -0.9837323 0 -0.1796407 0.7767137 0 0.629854 0.9046707 0 0.4261115 -0.8487032 0 -0.5288694 -0.9036028 0 -0.4283715 0.910499 0 -0.4135111 0.9888466 0 -0.1489375 0.1172552 0 -0.9931018 0.06321476 0 -0.998 -0.9848698 0 0.1732956 -0.9861152 0 0.1660629 0.5797336 0 0.8148062 0.4919252 0 0.8706375 0.0327614 0 -0.9994632 -0.2535086 0 -0.9673333 -0.9999926 0 -0.003838912 -0.9838328 0 0.1790895 0.7161019 0 0.6979957 0.7739479 0 0.6332493 0.7241409 0 -0.689652 0.5745002 0 -0.8185045 -0.9427834 0 -0.3334059 -0.9761264 0 -0.2172034 0.1324847 0 0.9911851 0.02804395 0 0.9996067 -0.9483724 0 0.3171591 -0.9748531 0 0.222849 0.775852 0 0.630915 0.8094303 0 0.587216 -0.5742074 0 -0.8187099 -0.7722171 0 -0.6353588 -0.01606201 0 0.999871 0.1756529 0 0.9844522 0.9917064 0 0.1285248 0.9980544 0 0.06234964 -0.07159149 0 0.9974341 0.1392795 0 0.9902532 0.2193214 0 -0.9756528 0.1130969 0 -0.993584 -0.9950746 0 0.09912877 -0.9954162 0 -0.0956376 0.7360696 0 0.6769059 0.6578934 0 0.7531112 -0.02875915 0 -0.9995865 0.1261038 0 -0.9920171 -0.9772794 0 -0.2119552 -0.9999784 0 -0.006591312 0.5256259 0 0.8507158 0.7258986 0 0.6878018 -0.9950877 0 -0.09899735 -0.9990928 0 -0.04258678 0.4678316 0 -0.8838176 0.6485836 0 -0.7611434 0 0 -1 0.09168287 0 -0.9957883 -0.9948916 0 0.1009488 -0.9999369 0 -0.01124251 0.397399 0 0.917646 0.4677485 0 0.8838616 0.104817 0 0.9944915 0.1167557 0 0.9931607 1 0 0 0.9999899 0 -0.004500015 -0.1436273 0 -0.9896319 -0.2018204 0 -0.9794226 0 0 1 -0.1336614 0 0.9910271 0.9948916 0 0.1009491 0.9999331 0 -0.01157172 -0.4333818 0 -0.9012104 -0.6424279 0 -0.7663462 -0.001102399 0 0.9999994 -0.09174309 0 0.9957827 0.9984824 0 0.0550733 0.997429 0 -0.07166206 -0.5548936 0 -0.8319213 -0.5601661 0 -0.8283803 0.9997362 0 0.0229702 0.9999519 0 0.009810928 -0.00237043 0 -0.9999972 0.05980298 0 -0.9982102 -0.433044 0 0.9013728 -0.3867829 0 0.9221708 0.9949045 0 0.1008225 0.9988486 0 0.04797552 -6.61242e-4 0 -0.9999998 -0.06460566 0 -0.997911 -0.3661153 0 0.9305696 -0.4617921 0 0.8869882 0.05201765 0 0.9986462 -0.1846202 0 0.98281 0.9684256 0 0.2493032 0.9983851 0 0.05680869 -0.5854849 0 -0.8106833 -0.8593603 0 -0.5113706 0.1243614 0 0.9922371 0.02668011 0 0.999644 0.9601483 0 0.2794909 0.9839849 0 0.1782522 -0.5908085 0 -0.8068119 -0.7822152 0 -0.6230084 0.9427831 0 -0.3334071 0.9995812 0 0.02893921 0.0118146 0 -0.9999302 -0.03995318 0 -0.9992015 -0.3622409 0 0.9320845 -0.3116344 0 0.9502021 0.1077882 0 -0.9941739 -0.1112076 0 -0.9937972 -0.9462541 0 0.3234242 -0.9959211 0 0.09022888 0.5541925 0 0.8323886 0.5240875 0 0.8516644 0.7835733 0 0.6212994 0.8959437 0 0.4441677 -0.6493486 0 0.760491 -0.7867659 0 0.6172515 0.4870082 0 0.8733975 0.6541715 0 0.7563463 0.001534086 0 -0.9999989 -0.0204968 0 -0.99979 0.9898083 0 -0.1424065 0.9869198 0 -0.1612122 -0.959805 0 -0.2806679 -0.9919409 0 -0.126702 0.6506857 0 0.7593471 0.6644063 0 0.7473716 -0.5595102 0 0.8288234 -0.5097764 0 0.860307 0.9999927 0 -0.003838888 0.9536622 0 0.3008794 -0.1832807 0 -0.9830607 -0.1077684 0 -0.994176 -1 0 0 -1 0 0 -0.1697855 0 0.985481 -0.1362152 0 0.9906793 0.1488288 0 -0.988863 0.1873769 0 -0.9822882 -1 0 1.28396e-4 -0.999997 0 0.002436505 -0.004001465 0 0.999992 0.09428223 0 0.9955455 -0.9998496 0 -0.01734945 -0.9999781 0 -0.006637346 -0.2408554 0 0.970561 -0.3100765 0 0.9507116 -0.9999935 0 -0.003609085 -0.9999976 0 -0.002209823 -0.2449781 0 -0.9695287 0.03252765 0 -0.9994708 -0.9501057 0 0.311928 -0.7568918 0 0.6535401 0 0 1 0.1336537 0 0.9910282 -0.27084 0 -0.9626244 -0.3240968 0 -0.9460239 0.3945538 0 -0.9188728 0.2280222 0 -0.973656 -0.03066907 0 0.9995296 -0.008077772 0 0.9999675 0.9344015 0 -0.3562219 0.8441423 0 -0.5361192 -0.4625982 0 -0.8865681 -0.539324 0 -0.8420984 0.9903342 0 -0.1387022 0.9747407 0 -0.2233399 -0.8626896 0 0.5057338 -0.703846 0 0.7103526 -0.2016518 0 0.9794574 -0.002393746 0 0.9999972 0.9995676 0 -0.02940413 0.9975523 0 -0.06992529 0.9999889 0 0.004719006 0.9999985 0 0.001753706 -0.1065135 0 -0.9943113 -0.09051248 0 -0.9958953 0.5812405 0 0.8137319 0.5277133 0 0.8494226 0.9999865 0 -0.005210362 0.9999137 0 -0.01314514 1 0 2.12909e-4 1 0 0 -0.9996032 0 0.02816973 -0.9976999 0 0.06778676 -0.9999909 0 0.004274394 -0.9999138 0 0.01313928 0.210536 0 0.9775861 0.02668664 0 0.9996439 -0.990334 0 0.1387027 -0.9741776 0 0.2257834 0.01241994 0 0.9999229 -0.05676861 0 0.9983875 0.9418318 0 -0.3360848 0.8580309 0 -0.5135982 0.8548977 0 -0.5187967 0.643299 0 -0.765615 -0.376626 0 0.9263654 -0.106869 0 0.9942731 0.7899508 0 -0.6131703 0.7889348 0 -0.614477 0.139373 0 0.99024 0.3104213 0 0.9505992 0.9975168 0 -0.07042984 0.9958134 0 0.09140905 -0.9330148 0 0.3598381 -0.8739225 0 0.4860653 -0.1077762 0 0.9941752 -0.1586569 0 0.9873338</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape5-binormals-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape5-map1" name="qt_gauge_background_Shape5-map1">
+ <float_array id="qt_gauge_background_Shape5-map1-array" count="1666">0.9999999 0.5 0 0.5000012 0.5 1 1 0.5061304 0 0.5052288 0.5 0 0 0.4947744 1 0.4938696 0.9999866 0.53125 0 0.53125 0.01543898 0.25 0.9864644 0.25 0.07875053 0.125 0.922287 0.125 0.625 0.008798416 0.5858876 0.125 0.1747352 0.0625 0.6178113 0.06099121 0.3125 0.01973263 0.3560588 0.0698516 0.309677 0.133098 0.8252712 0.0625 0.8125 0.05711598 0.7896851 0.06995781 0.7994635 0.1280634 0.6008294 0.233804 0.001638008 0.375 0.9988159 0.375 0.5927608 0.3608285 0.6050377 0.5262564 0.9864644 0.75 0.01543877 0.75 0.9988159 0.625 0.001637928 0.625 0.5927607 0.6432205 0.6008294 0.766196 0.922287 0.875 0.07875042 0.875 0.6305875 0.875 0.625 0.9912016 0.1747352 0.9375 0.5986413 0.9390088 0.325681 0.8719367 0.3353157 0.9349235 0.3125 0.9802673 0.8252712 0.9375 0.7801167 0.9268063 0.807416 0.866902 0.8125 0.942884 0.8111905 0.9374412 0.7418037 0.4224735 0.9022702 0.1683577 0.8576439 0.1058577 0.5175259 0.08397239 0.5799338 0.02248039 0.2756404 0.05002844 0.2730781 0.08416161 0.8113557 0.06250255 0.7496923 0.06121245 0.7494409 0.08338861 0.5084668 0.164874 0.8694534 0.333868 0.4216114 0.2878 0.1753832 0.5038273 0.7336704 0.7122805 0.7418033 0.597287 0.1922126 0.5641799 0.2133856 0.6678444 0.6883135 0.835126 0.1403797 0.8316424 0.4098139 0.9506105 0.5256017 0.8941709 0.1811593 0.8941424 0.2752437 0.9500667 0.8136227 0.914793 0.7447816 0.8938192 0.6886346 0.9588556 0.8942289 0.5113955 0.8941939 0.5244202 0.884043 0.4617221 0.8941984 0.5035489 0.6823414 0.1647723 0.8006855 0.2080709 0.8136376 0.08341707 0.4212652 0.1061116 0.418732 0.04948473 0.4708713 0.0259802 0.1808493 0.1059594 0.6889963 0.04114439 0.6781431 0.1058292 0.1400697 0.1684594 0.3269233 0.2081726 0.7336704 0.2878 0.2133857 0.333868 0.17539 0.5241197 0.4100203 0.4224972 0.1922058 0.4620238 0.1753409 0.511119 0.8694534 0.6678444 0.8840385 0.5642034 0.4100208 0.597287 0.4216113 0.7122805 0.9024206 0.8315406 0.8008358 0.7918274 0.5178626 0.8352277 0.3272334 0.7919291 0.5795721 0.9775196 0.4705096 0.9740198 0.4133319 0.9176958 0.2729915 0.9176673 0.8577942 0.8940407 0.6831837 0.9149823 0.7442695 0.9387313 0.8188856 0.940192 0.7866164 0.9385563 0.8142796 0.9290285 0.5879588 0.4307551 0.8075029 0.3777953 0.8111467 0.4471062 0.8765548 0.1336368 0.9543757 0.1875 0.864846 0.1878523 0.8737792 0.09375 0.830864 0.09408912 0.4711532 0.06563817 0.6044739 0.09385522 0.4691826 0.09446526 0.5625 0.004399208 0.6325207 0.03343707 0.5365767 0.02648509 0.2436176 0.04111632 0.3391657 0.04745217 0.2658816 0.06578255 0.3390476 0.09500779 0.2307433 0.09449384 0.8188856 0.05980799 0.8148372 0.07062861 0.7876329 0.06125396 0.741043 0.07041426 0.7184765 0.05330732 0.7870224 0.0863492 0.7167103 0.09399304 0.465221 0.133674 0.603011 0.1698459 0.4281794 0.1868045 0.9926401 0.3125 0.8041763 0.3113211 0.358255 0.2486089 0.5880255 0.2935905 0.3163501 0.3113211 0.2238741 0.5107256 0 0.4973878 0.2256171 0.4921593 0.7798604 0.7513911 0.5880255 0.7066808 0.8041763 0.6891032 0.8075029 0.6306689 0.5879588 0.591856 0.8111449 0.5783001 8.29271e-4 0.578125 0.2256247 0.5400816 0.3098025 0.5782979 0.00853835 0.6875 0.3123736 0.6306689 0.31635 0.6891032 0.7184922 0.866326 0.6073599 0.8301541 0.7389273 0.8131956 0.1700224 0.8663633 0.04709459 0.8125 0.2150693 0.8121477 0.3370619 0.952869 0.4271399 0.934836 0.4494003 0.9615738 0.5108466 0.8666692 0.6076021 0.9060533 0.4680508 0.9060985 0.1267428 0.90625 0.2317899 0.9060024 0.2436176 0.9588836 0.2645428 0.9346917 0.7865133 0.904667 0.8313715 0.9054147 0.716143 0.9052097 0.71875 0.9670428 0.6313001 0.9665629 0.7167968 0.9466927 1 0.5030652 0.8637612 0.5176552 0.863763 0.5107248 0.9999933 0.5186902 0.862686 0.5402012 0.9994079 0.4344348 0.8626909 0.4918267 1 0.4969348 0.6896688 0.1333308 0.7379608 0.1864612 0.7798604 0.2486089 0.451386 0.03842618 0.40625 0.009866315 0.1689758 0.13398 0.1267428 0.09375 0.71875 0.0329572 0.04709475 0.1875 0.2140227 0.1881955 0.3123736 0.3777975 0.008538496 0.3125 0 0.5182394 0.2238768 0.517324 0.3097998 0.4472261 8.19004e-4 0.4348872 0 0.502615 0.9926401 0.6875 0.9994013 0.578125 0.358255 0.7513911 0.9543757 0.8125 0.8770624 0.86602 0.8653535 0.8118045 0.4299911 0.8135388 0.5625 0.9956008 0.535356 0.9735149 0.40625 0.9901336 0.3379905 0.9141989 0.8737792 0.90625 0.7140739 0.9292429 0.8194497 0.9363846 0.8083171 0.9404298 0.8017797 0.9341801 0.6899639 0.4577648 0.6868609 0.4001244 0.8426218 0.407312 0.8625096 0.1540211 0.9157988 0.1534896 0.9269941 0.1979167 0.846622 0.08854167 0.8822169 0.1144271 0.8425848 0.1149586 0.4508289 0.07766424 0.5537793 0.0760375 0.5477083 0.09895834 0.5447396 0.01352339 0.6014062 0.01759776 0.5928418 0.0361492 0.237533 0.05436299 0.2906428 0.03922742 0.3041592 0.05740859 0.2337736 0.0762937 0.3041592 0.07766424 0.286379 0.1004051 0.8083171 0.0595702 0.8194497 0.06361537 0.8032667 0.06531364 0.7665939 0.05767776 0.7693875 0.06531364 0.7092481 0.06146673 0.7092481 0.07750167 0.7693875 0.07679736 0.7643322 0.09704188 0.4305691 0.1549363 0.5477084 0.1485938 0.5390469 0.1901273 0.9142163 0.3020833 0.9178805 0.3501823 0.7724236 0.3476505 0.2805171 0.2760417 0.4956077 0.2682523 0.4819907 0.315489 0.3125023 0.5092046 0.1057292 0.5041986 0.1057933 0.4975473 0.8295244 0.7239584 0.6794561 0.7317477 0.685312 0.6852344 0.8426213 0.6066927 0.6868609 0.6136198 0.6899635 0.5731872 0.1311047 0.5859375 0.1061458 0.553434 0.3372628 0.5526367 0.139015 0.6979167 0.1349207 0.6522656 0.3623812 0.6555208 0.7402803 0.8450637 0.6602083 0.8514063 0.661662 0.8098726 0.211045 0.845979 0.1063828 0.8465105 0.1052357 0.8020834 0.3795521 0.9615454 0.3767588 0.9434481 0.4731804 0.9466661 0.4572347 0.8850415 0.5682813 0.885573 0.5505241 0.9117146 0.1796799 0.9114584 0.1395696 0.8855729 0.2257531 0.8850415 0.2906428 0.9607725 0.237533 0.945637 0.300589 0.9434481 0.8232495 0.9222421 0.8017798 0.9202485 0.8112086 0.8995949 0.7041667 0.8855729 0.7656857 0.8841262 0.7605568 0.9094647 0.734375 0.953721 0.6665104 0.9705031 0.6620345 0.9525136 0.9365625 0.5065636 0.9365619 0.5098464 0.8074377 0.5172451 0.807389 0.5276675 0.9365592 0.5163568 0.9365089 0.5287048 0.792504 0.4827694 0.9212306 0.4308525 0.9362695 0.471013 0.9365625 0.5040093 0.8073918 0.5090511 0.9365161 0.4970547 0.661662 0.1901273 0.6445313 0.1485938 0.7315831 0.1540211 0.8582457 0.2239583 0.7350494 0.2210648 0.8043746 0.1776148 0.8098552 0.09704188 0.8032666 0.07679736 0.8232495 0.07775788 0.4875 0.1144271 0.3839436 0.1158738 0.3925685 0.08991221 0.4886751 0.05333393 0.3925685 0.05740859 0.3795521 0.03845456 0.5203938 0.03820978 0.4117709 0.02375867 0.4796354 0.01580135 0.222962 0.1158738 0.1395696 0.1144271 0.17968 0.08854167 0.6652897 0.04748638 0.6665104 0.02949693 0.734375 0.04627906 0.7247695 0.1149586 0.6445313 0.1144271 0.657946 0.08828546 0.1052359 0.1979167 0.1063829 0.1534896 0.2082539 0.1549363 0.3182965 0.1785301 0.4285857 0.2210648 0.2306727 0.2239583 0.685312 0.315489 0.6794561 0.2682523 0.8295244 0.2760417 0.3623813 0.3476505 0.1349208 0.3501823 0.1390151 0.3020833 0.1058045 0.5284816 0.1057343 0.5158662 0.3125066 0.5274796 0.2618486 0.4073474 0.4801399 0.4001244 0.4821081 0.4578002 0.1061346 0.4715054 0.1310997 0.4310764 0.3372586 0.4829579 0.1057292 0.5063766 0.312439 0.5170929 0.10573 0.509356 0.7724236 0.6555209 0.9178805 0.6522657 0.9142163 0.6979167 0.7925012 0.5526721 0.9362622 0.5534693 0.9212274 0.5859375 0.4821088 0.5731872 0.4801398 0.6136198 0.2618493 0.6066927 0.4819907 0.6852344 0.4956076 0.7317476 0.280517 0.7239584 0.9269942 0.8020834 0.9157989 0.8465104 0.8638631 0.8450637 0.8057281 0.8214699 0.7350493 0.7789352 0.8582457 0.7760417 0.5390469 0.8098727 0.5682813 0.8514062 0.4455998 0.845979 0.2306726 0.7760417 0.4285857 0.7789352 0.3210876 0.8223852 0.5895866 0.9638508 0.6014063 0.9824022 0.5447396 0.9864765 0.4796354 0.9841986 0.4117708 0.9762414 0.5171387 0.9617902 0.4780762 0.9239625 0.3767588 0.9256403 0.3867348 0.9029581 0.2891702 0.9029582 0.300589 0.9256403 0.2337736 0.9237063 0.8439383 0.8841262 0.8822169 0.885573 0.846622 0.9114584 0.7283379 0.9202485 0.6546907 0.9224983 0.6602083 0.9010417 0.698649 0.9385332 0.7605568 0.9341801 0.7665939 0.9423222 0.8158524 0.9390752 0.802995 0.9383134 0.8137178 0.9346029 0.6780837 0.4284046 0.7722652 0.4036039 0.7735711 0.4348572 0.8912102 0.1522422 0.9260631 0.1763932 0.88916 0.1765261 0.8639927 0.1002214 0.8644008 0.117086 0.8441611 0.1003542 0.4985479 0.07565662 0.5569344 0.0880198 0.4970302 0.08842649 0.5729948 0.01482162 0.6030933 0.0277351 0.5635099 0.02484173 0.2595929 0.04573774 0.3003139 0.04817419 0.2683678 0.05640181 0.267428 0.07572068 0.2992479 0.08878817 0.2538278 0.08844554 0.8158523 0.06092472 0.8140896 0.06527063 0.8033667 0.06156017 0.7677768 0.06108706 0.7441901 0.06473347 0.736148 0.05802202 0.7441902 0.07727014 0.7672113 0.08528273 0.7355826 0.08790672 0.4919652 0.1512471 0.5532513 0.1683261 0.478165 0.1748076 0.9237076 0.3245248 0.8425926 0.3527655 0.8411002 0.3238918 0.3911742 0.2714902 0.4963857 0.2920812 0.3755945 0.2989243 0.2102871 0.5082021 0.104964 0.5019522 0.2103672 0.5011947 0.7582366 0.7285098 0.674097 0.7080997 0.7669979 0.7012565 0.7722651 0.6109896 0.6780835 0.5933424 0.7735704 0.5879387 0.1117415 0.5699991 0.2167855 0.5526079 0.2475798 0.5697998 0.1241249 0.6760873 0.2567022 0.6510872 0.2583697 0.676901 0.7016847 0.8487529 0.6536968 0.8316739 0.7088616 0.8251925 0.1542785 0.8477578 0.09856907 0.8236068 0.1686726 0.8234739 0.3782132 0.9522331 0.4215994 0.9440696 0.4296415 0.9554856 0.5160145 0.8829141 0.5612639 0.8998427 0.4993356 0.8997099 0.1586635 0.8997787 0.1795269 0.882914 0.2056687 0.8996458 0.2595929 0.9542622 0.2674752 0.9438124 0.2994213 0.95204 0.8146678 0.9219273 0.8037179 0.9106901 0.8213249 0.9111885 0.7346506 0.8826852 0.765342 0.8989186 0.7333683 0.8992803 0.7017838 0.9621155 0.6627091 0.9616961 0.7006649 0.9527979 0.9370311 0.5079839 0.8725619 0.5143203 0.8725625 0.5117495 0.8725479 0.5211577 0.9370143 0.5216572 0.8724883 0.5303128 0.8501083 0.4568993 0.9328783 0.4507517 0.8686107 0.4773825 0.8725511 0.5080407 0.8724931 0.50088 0.9370196 0.501593 0.6497775 0.1683261 0.6882473 0.1510183 0.7066874 0.1745788 0.7949402 0.2258391 0.7733542 0.1986282 0.8326653 0.1993516 0.8037512 0.08528273 0.8150395 0.07733418 0.8209866 0.08797077 0.4392151 0.1173148 0.3832635 0.1009257 0.4413713 0.100564 0.4416651 0.05614454 0.3821656 0.04798098 0.4335151 0.04451439 0.4651245 0.03185105 0.4442058 0.0192093 0.5030802 0.02683755 0.1788292 0.1173148 0.1586636 0.1002214 0.2049709 0.100583 0.6635229 0.03830385 0.7017838 0.0378845 0.7014787 0.04720212 0.6865439 0.117086 0.6488485 0.1001573 0.6972414 0.1002902 0.09856919 0.1763932 0.1535808 0.1524711 0.1679749 0.1767549 0.3716847 0.1988571 0.335916 0.2258391 0.2723656 0.1995804 0.6740969 0.2920812 0.7582366 0.2714902 0.766998 0.2989243 0.2567022 0.3527655 0.124125 0.3245248 0.2583699 0.3238918 0.1049723 0.5212908 0.2102919 0.5208356 0.2103746 0.5300996 0.3686706 0.4036128 0.4913413 0.4284135 0.3685579 0.4349104 0.1117332 0.4511193 0.247575 0.4571132 0.2167781 0.4777058 0.2102712 0.5115899 0.2102722 0.5140073 0.1049481 0.5076269 0.8425926 0.6510873 0.9237076 0.6760873 0.8411002 0.6769011 0.868606 0.5526608 0.932873 0.5700079 0.8501052 0.5698087 0.4913414 0.5933424 0.3686707 0.6109896 0.3685591 0.5879387 0.4963857 0.7080997 0.3911741 0.7285099 0.3755945 0.7012565 0.9260632 0.8236068 0.8915486 0.8475289 0.8894985 0.8232452 0.7736925 0.801143 0.7949402 0.7741609 0.8330036 0.8004196 0.5583946 0.8316739 0.5131058 0.8489817 0.4819226 0.8254212 0.3359159 0.7741609 0.3723825 0.8013718 0.2730633 0.8006484 0.6022795 0.9722649 0.5729948 0.9851784 0.5626962 0.9751583 0.4442057 0.9807907 0.4643107 0.9681489 0.5022665 0.9731624 0.4228233 0.9251695 0.3800088 0.9153267 0.4375569 0.9124594 0.2990532 0.9153267 0.2665354 0.9251055 0.2545255 0.9123953 0.8647392 0.8826852 0.8639927 0.8997787 0.8444995 0.899417 0.6973196 0.9219913 0.6519539 0.9116142 0.698699 0.9110518 0.7319889 0.93514 0.7655691 0.9387864 0.7334982 0.941978 0.8220785 0.938846 0.8156928 0.941538 0.7931342 0.9412462 0.7839534 0.9343086 0.8021989 0.9281265 0.8212138 0.9311696 0.5925573 0.468068 0.5887166 0.3984419 0.7178047 0.3731359 0.8923228 0.3780975 0.8936904 0.4151083 0.7267035 0.478966 0.8469991 0.1327243 0.8999379 0.1319271 0.9383314 0.15625 0.9704201 0.21875 0.9079392 0.2148437 0.8325975 0.1615654 0.8495252 0.078125 0.8980331 0.109375 0.8224944 0.1082191 0.8323069 0.08063739 0.4142824 0.06716161 0.5328304 0.06410951 0.6093148 0.07988703 0.5983724 0.1080339 0.5249479 0.1080339 0.4142824 0.08232716 0.53125 0.002199604 0.59375 0.006598812 0.6319271 0.0223301 0.6282601 0.04463451 0.5666195 0.04044059 0.514375 0.01381323 0.2091764 0.05180816 0.2780588 0.03042447 0.3306425 0.03630779 0.3453963 0.05765397 0.3046253 0.06716162 0.2278106 0.06468704 0.3453963 0.08232716 0.3301701 0.110204 0.2621009 0.110204 0.2041922 0.08027135 0.8156928 0.05846199 0.8220785 0.061154 0.8212137 0.06883036 0.8044293 0.07050219 0.7880198 0.06493209 0.7931342 0.05875386 0.7702997 0.07050219 0.6966846 0.06797294 0.6783512 0.05566664 0.7580547 0.05332776 0.7880198 0.07650066 0.7906916 0.101292 0.7528262 0.1082191 0.6765153 0.08025308 0.3984363 0.1340972 0.5249479 0.1307031 0.5983725 0.147526 0.6034632 0.1966493 0.4993925 0.2092795 0.3703897 0.1629384 0.9895523 0.28125 0.995728 0.34375 0.716841 0.3351281 0.8844681 0.2851562 0.2233469 0.25 0.4746699 0.2444358 0.5922306 0.2669618 0.5888488 0.3221918 0.4410976 0.335128 0.1882571 0.2851562 0.3629443 0.5162722 0.1065105 0.5053266 0 0.4986945 0 0.4960811 0.106692 0.4882948 0.3692134 0.5023939 0.8631781 0.7500001 0.7001776 0.7555642 0.5922306 0.7330382 0.5888488 0.6788933 0.716841 0.6665691 0.8844681 0.7148438 0.8923227 0.6284635 0.7178047 0.6342643 0.5887166 0.6145183 0.5925573 0.566812 0.7267022 0.5580114 0.893689 0.5989388 0.001233599 0.6015625 4.24942e-4 0.5546875 0.1067045 0.5387566 0.3692173 0.5375096 0.4361725 0.5580026 0.1769144 0.5989388 0.01198856 0.71875 0.005088139 0.65625 0.1784723 0.6284635 0.4399908 0.6342643 0.4410975 0.666569 0.188257 0.7148438 0.7583957 0.8659028 0.6780729 0.8692969 0.6157683 0.852474 0.6034632 0.8033507 0.6876106 0.7907205 0.7752199 0.8370616 0.2306421 0.8672758 0.1222065 0.8680729 0.06292251 0.84375 0.03126669 0.78125 0.1435484 0.7851563 0.2691566 0.8384346 0.3306425 0.9636922 0.3369811 0.943631 0.3760027 0.9347354 0.4945362 0.9358906 0.5116455 0.952239 0.3882474 0.9700073 0.4355475 0.8672758 0.5708594 0.8692969 0.6157683 0.8919662 0.604432 0.9197469 0.5261117 0.920113 0.4085916 0.8917809 0.150739 0.921875 0.1027466 0.890625 0.2662876 0.8917809 0.2041922 0.9197287 0.2780588 0.9695755 0.2091764 0.9481918 0.2278106 0.9353129 0.2992701 0.9347354 0.7839534 0.9163722 0.7927217 0.889796 0.8245246 0.889796 0.8323069 0.9193627 0.748999 0.9163722 0.6780729 0.8919662 0.765625 0.9549634 0.671875 0.9791222 0.6319271 0.9776698 0.6233773 0.9553655 0.6716324 0.9443334 0.7580547 0.9466723 1 0.5015326 1 0.5045978 0.9360923 0.5125159 0.7745818 0.5226759 0.774583 0.5162717 0.9360937 0.5053255 0.9999967 0.5124103 0.99999 0.5249701 0.9359544 0.5388565 0.7708007 0.5376008 0.9991119 0.4047174 0.999704 0.4641522 0.9359625 0.4877446 0.7708032 0.5022307 1 0.4954022 1 0.4984674 0.6435677 0.1307031 0.7372952 0.1327243 0.7713538 0.1615654 0.6876107 0.2092795 0.8631781 0.25 0.7001776 0.2444358 0.3882474 0.02999268 0.5195882 0.04776094 0.359375 0.01479947 0.453125 0.004933157 0.2264555 0.1340972 0.1222066 0.1319271 0.1027467 0.109375 0.150739 0.078125 0.671875 0.02087781 0.765625 0.04503659 0.03126687 0.21875 0.06292264 0.15625 0.2649699 0.1629384 0.1435486 0.2148437 0.4399908 0.3731358 0.1784721 0.3781064 0.005088252 0.34375 0.01198874 0.28125 0 0.5247447 0 0.5117341 0.1065127 0.5119678 0.3629462 0.5225136 0.4361704 0.4790575 0.1769122 0.4152086 4.09502e-4 0.4648308 0.001228506 0.4049436 0 0.5039219 0 0.5013081 0.995728 0.65625 0.9895523 0.71875 0.999694 0.5546875 0.9991086 0.6015625 0.4746699 0.7555642 0.2233468 0.7500001 0.9704201 0.78125 0.9383314 0.84375 0.8999379 0.8680729 0.8490293 0.8659028 0.8346276 0.8370616 0.9079393 0.7851563 0.3776362 0.8384346 0.4993925 0.7907205 0.59375 0.9934012 0.53125 0.9978004 0.514375 0.9861867 0.5617367 0.9595594 0.453125 0.9950668 0.359375 0.9852005 0.3369811 0.9256917 0.3343568 0.898708 0.8980331 0.890625 0.8495252 0.921875 0.748999 0.9281266 0.6697965 0.9320271</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape5-map1-array" count="833" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape5-textangents">
+ <float_array id="qt_gauge_background_Shape5-textangents-array" count="9216">-0.5082486 0 0.8612104 -0.6936564 0 0.720306 -0.50555 0 0.8627973 -0.5727626 0 0.8197212 -0.6936564 0 0.720306 -0.3806854 0 0.9247046 -0.2432191 0 0.9699714 -0.50555 0 0.8627973 -0.50555 0 0.8627973 -0.2432191 0 0.9699714 -0.09843937 0 0.9951431 -0.2201853 0 0.975458 -0.5727626 0 0.8197212 -0.50555 0 0.8627973 -0.2201853 0 0.975458 -0.3234554 0 0.9462435 0.2902663 0 0.9569458 0.08546415 0 0.9963412 -0.1044956 0 0.9945253 -0.06413913 0 0.997941 0.08546415 0 0.9963412 5.73042e-4 0 0.9999999 -0.06040361 0 0.9981741 -0.1044956 0 0.9945253 -0.1044956 0 0.9945253 -0.06040361 0 0.9981741 -0.09843937 0 0.9951431 -0.2432191 0 0.9699714 -0.06413913 0 0.997941 -0.1044956 0 0.9945253 -0.2432191 0 0.9699714 -0.3806854 0 0.9247046 0 0 0.9999999 -0.06206933 0 0.9980718 -0.05465139 0 0.9985055 5.87369e-4 0 0.9999998 -0.06206933 0 0.9980718 -0.3234554 0 0.9462435 -0.2201853 0 0.975458 -0.05465139 0 0.9985055 -0.05465139 0 0.9985055 -0.2201853 0 0.975458 -0.09843937 0 0.9951431 -0.06040361 0 0.9981741 5.87369e-4 0 0.9999998 -0.05465139 0 0.9985055 -0.06040361 0 0.9981741 5.73042e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -4.64076e-4 0 0.9999998 -4.50786e-4 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -5.46139e-4 0 0.9999997 -4.64076e-4 0 0.9999998 -4.64076e-4 0 0.9999998 -5.46139e-4 0 0.9999997 -0.001413613 0 0.9999989 -0.002293 0 0.9999973 -4.50786e-4 0 0.9999999 -4.64076e-4 0 0.9999998 -0.002293 0 0.9999973 -0.002037802 0 0.9999978 0 0 0.9999999 -8.72112e-4 0 0.9999995 -6.17425e-4 0 0.9999996 0 0 0.9999999 -8.72112e-4 0 0.9999995 -0.003882853 0 0.9999924 -0.002893213 0 0.9999957 -6.17425e-4 0 0.9999996 -6.17425e-4 0 0.9999996 -0.002893213 0 0.9999957 -0.001413613 0 0.9999989 -5.46139e-4 0 0.9999997 0 0 0.9999999 -6.17425e-4 0 0.9999996 -5.46139e-4 0 0.9999997 0 0 0.9999999 -0.01021776 0 0.9999478 -0.003702974 0 0.9999931 -0.005038165 0 0.9999871 -0.009408251 0 0.9999556 -0.003702974 0 0.9999931 -0.002037802 0 0.9999978 -0.002293 0 0.9999973 -0.005038165 0 0.9999871 -0.005038165 0 0.9999871 -0.002293 0 0.9999973 -0.001413613 0 0.9999989 -0.002893213 0 0.9999957 -0.009408251 0 0.9999556 -0.005038165 0 0.9999871 -0.002893213 0 0.9999957 -0.003882853 0 0.9999924 0 0 0.9999999 0.03152041 0 0.9995031 0.02819019 0 0.9996026 0 0 0.9999999 0.03152041 0 0.9995031 0.1397413 0 0.990188 0.1282256 0 0.9917451 0.02819019 0 0.9996026 0.02819019 0 0.9996026 0.1282256 0 0.9917451 0.07255854 0 0.9973642 0.01536091 0 0.999882 0 0 0.9999999 0.02819019 0 0.9996026 0.01536091 0 0.999882 0 0 0.9999999 0.5154793 0 0.856902 0.2472898 0 0.9689416 0.2645433 0 0.9643738 0.3632217 0 0.9317027 0.2472898 0 0.9689416 0.09911732 0 0.9950758 0.1128195 0 0.9936155 0.2645433 0 0.9643738 0.2645433 0 0.9643738 0.1128195 0 0.9936155 0.07255854 0 0.9973642 0.1282256 0 0.9917451 0.3632217 0 0.9317027 0.2645433 0 0.9643738 0.1282256 0 0.9917451 0.1397413 0 0.990188 0 0 0.9999999 0 0 0.9999999 0.02556335 0 0.9996732 0.01710429 0 0.9998538 0 0 0.9999999 0 0 0.9999999 0.01536091 0 0.999882 0.02556335 0 0.9996732 0.02556335 0 0.9996732 0.01536091 0 0.999882 0.07255854 0 0.9973642 0.1128195 0 0.9936155 0.01710429 0 0.9998538 0.02556335 0 0.9996732 0.1128195 0 0.9936155 0.09911732 0 0.9950758 0.508251 0 0.8612089 0.053609 0 0.998562 0.06840208 0 0.9976578 0.1736461 0 0.984808 0.053609 0 0.998562 0.1283923 0 0.9917235 0.1454816 0 0.9893609 0.06840208 0 0.9976578 0.06840208 0 0.9976578 0.1454816 0 0.9893609 0.1048333 0 0.9944899 0.04442843 0 0.9990126 0.1736461 0 0.984808 0.06840208 0 0.9976578 0.04442843 0 0.9990126 0.085418 0 0.9963452 0.5154793 0 0.856902 0.3632217 0 0.9317027 0.2274963 0 0.9737789 0.3653452 0 0.9308721 0.3632217 0 0.9317027 0.1397413 0 0.990188 0.1165891 0 0.9931803 0.2274963 0 0.9737789 0.2274963 0 0.9737789 0.1165891 0 0.9931803 0.1048333 0 0.9944899 0.1454816 0 0.9893609 0.3653452 0 0.9308721 0.2274963 0 0.9737789 0.1454816 0 0.9893609 0.1283923 0 0.9917235 0 0 0.9999999 0.01720511 0 0.9998519 0.02814981 0 0.9996037 0.03152041 0 0.9995031 0.01720511 0 0.9998519 0.085418 0 0.9963452 0.04442843 0 0.9990126 0.02814981 0 0.9996037 0.02814981 0 0.9996037 0.04442843 0 0.9990126 0.1048333 0 0.9944899 0.1165891 0 0.9931803 0.03152041 0 0.9995031 0.02814981 0 0.9996037 0.1165891 0 0.9931803 0.1397413 0 0.990188 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.01884948 0 0.9998223 -0.08150996 0 0.9966725 -0.03144192 0 0.9995055 -0.03515046 0 0.999382 -0.08150996 0 0.9966725 0.01584166 0 0.9998745 0.03635292 0 0.9993389 -0.03144192 0 0.9995055 -0.03144192 0 0.9995055 0.03635292 0 0.9993389 0.02841082 0 0.9995964 -0.01271665 0 0.9999191 -0.03515046 0 0.999382 -0.03144192 0 0.9995055 -0.01271665 0 0.9999191 -0.008412336 0 0.9999646 0.1509368 0 0.9885434 0.06413933 0 0.997941 0.1251636 0 0.9921361 0.1593436 0 0.9872231 0.06413933 0 0.997941 0.02866144 0 0.9995891 0.05296336 0 0.9985964 0.1251636 0 0.9921361 0.1251636 0 0.9921361 0.05296336 0 0.9985964 0.02841082 0 0.9995964 0.03635292 0 0.9993389 0.1593436 0 0.9872231 0.1251636 0 0.9921361 0.03635292 0 0.9993389 0.01584166 0 0.9998745 0 0 0.9999999 -0.002170801 0 0.9999976 0.01010345 0 0.9999489 0.004704821 0 0.9999889 -0.002170801 0 0.9999976 -0.008412336 0 0.9999646 -0.01271665 0 0.9999191 0.01010345 0 0.9999489 0.01010345 0 0.9999489 -0.01271665 0 0.9999191 0.02841082 0 0.9995964 0.05296336 0 0.9985964 0.004704821 0 0.9999889 0.01010345 0 0.9999489 0.05296336 0 0.9985964 0.02866144 0 0.9995891 -0.07538645 0 0.9971544 -0.07759845 0 0.9969848 -0.04829705 0 0.9988328 -0.06911304 0 0.9976088 -0.07759845 0 0.9969848 -0.03372657 0 0.9994311 -0.01886646 0 0.999822 -0.04829705 0 0.9988328 -0.04829705 0 0.9988328 -0.01886646 0 0.999822 -0.007568489 0 0.9999713 -0.02499955 0 0.9996874 -0.06911304 0 0.9976088 -0.04829705 0 0.9988328 -0.02499955 0 0.9996874 -0.03070834 0 0.9995284 -0.02364571 0 0.9997204 -0.009289493 0 0.9999568 0.009319562 0 0.9999565 0.01768439 0 0.9998435 -0.009289493 0 0.9999568 -0.001917652 0 0.999998 0.001982891 0 0.999998 0.009319562 0 0.9999565 0.009319562 0 0.9999565 0.001982891 0 0.999998 -0.007568489 0 0.9999713 -0.01886646 0 0.999822 0.01768439 0 0.9998435 0.009319562 0 0.9999565 -0.01886646 0 0.999822 -0.03372657 0 0.9994311 0 0 0.9999999 -0.006840458 0 0.9999764 -0.004720136 0 0.9999889 -7.32999e-4 0 0.9999996 -0.006840458 0 0.9999764 -0.03070834 0 0.9995284 -0.02499955 0 0.9996874 -0.004720136 0 0.9999889 -0.004720136 0 0.9999889 -0.02499955 0 0.9996874 -0.007568489 0 0.9999713 0.001982891 0 0.999998 -7.32999e-4 0 0.9999996 -0.004720136 0 0.9999889 0.001982891 0 0.999998 -0.001917652 0 0.999998 -0.07538645 0 0.9971544 -0.06911304 0 0.9976088 -0.03574935 0 0.9993607 -0.02917206 0 0.9995744 -0.06911304 0 0.9976088 -0.03070834 0 0.9995284 -0.020614 0 0.9997874 -0.03574935 0 0.9993607 -0.03574935 0 0.9993607 -0.020614 0 0.9997874 -0.009698559 0 0.9999529 -0.01773668 0 0.9998426 -0.02917206 0 0.9995744 -0.03574935 0 0.9993607 -0.01773668 0 0.9998426 -0.0150712 0 0.9998865 0 0 0.9999999 0 0 1 -0.004466511 0 0.9999899 -0.006840458 0 0.9999764 0 0 1 0 0 0.9999999 -0.002376024 0 0.9999971 -0.004466511 0 0.9999899 -0.004466511 0 0.9999899 -0.002376024 0 0.9999971 -0.009698559 0 0.9999529 -0.020614 0 0.9997874 -0.006840458 0 0.9999764 -0.004466511 0 0.9999899 -0.020614 0 0.9997874 -0.03070834 0 0.9995284 0 0 0.9999999 -0.003254384 0 0.9999946 -0.003959487 0 0.999992 0 0 0.9999999 -0.003254384 0 0.9999946 -0.0150712 0 0.9998865 -0.01773668 0 0.9998426 -0.003959487 0 0.999992 -0.003959487 0 0.999992 -0.01773668 0 0.9998426 -0.009698559 0 0.9999529 -0.002376024 0 0.9999971 0 0 0.9999999 -0.003959487 0 0.999992 -0.002376024 0 0.9999971 0 0 0.9999999 -0.2902583 0 0.9569483 0.06417349 0 0.9979388 0.1018994 0 0.9947947 -0.0867992 0 0.9962258 0.06417349 0 0.9979388 0.3806737 0 0.9247094 0.2442598 0 0.9697098 0.1018994 0 0.9947947 0.1018994 0 0.9947947 0.2442598 0 0.9697098 0.09953951 0 0.9950336 0.05804002 0 0.9983143 -0.0867992 0 0.9962258 0.1018994 0 0.9947947 0.05804002 0 0.9983143 -9.29293e-4 0 0.9999996 0.508251 0 0.8612089 0.5830199 0 0.8124578 0.512015 0 0.8589765 0.6936506 0 0.7203115 0.5830199 0 0.8124578 0.3017139 0 0.9533985 0.228149 0 0.9736262 0.512015 0 0.8589765 0.512015 0 0.8589765 0.228149 0 0.9736262 0.09953951 0 0.9950336 0.2442598 0 0.9697098 0.6936506 0 0.7203115 0.512015 0 0.8589765 0.2442598 0 0.9697098 0.3806737 0 0.9247094 0 0 0.9999999 0.003513104 0 0.9999937 0.04677058 0 0.9989057 0.07906573 0 0.9968694 0.003513104 0 0.9999937 -9.29293e-4 0 0.9999996 0.05804002 0 0.9983143 0.04677058 0 0.9989057 0.04677058 0 0.9989057 0.05804002 0 0.9983143 0.09953951 0 0.9950336 0.228149 0 0.9736262 0.07906573 0 0.9968694 0.04677058 0 0.9989057 0.228149 0 0.9736262 0.3017139 0 0.9533985 -0.2902583 0 0.9569483 -0.0867992 0 0.9962258 -0.195115 0 0.9807804 -0.2079288 0 0.9781439 -0.0867992 0 0.9962258 -9.29293e-4 0 0.9999996 -0.0442616 0 0.99902 -0.195115 0 0.9807804 -0.195115 0 0.9807804 -0.0442616 0 0.99902 -0.02662721 0 0.9996454 -0.05251272 0 0.9986203 -0.2079288 0 0.9781439 -0.195115 0 0.9807804 -0.05251272 0 0.9986203 -0.0643495 0 0.9979274 0 0 0.9999999 0 0 0.9999999 -0.007582615 0 0.9999712 0.003513104 0 0.9999937 0 0 0.9999999 0 0 0.9999999 -0.001522261 0 0.9999987 -0.007582615 0 0.9999712 -0.007582615 0 0.9999712 -0.001522261 0 0.9999987 -0.02662721 0 0.9996454 -0.0442616 0 0.99902 0.003513104 0 0.9999937 -0.007582615 0 0.9999712 -0.0442616 0 0.99902 -9.29293e-4 0 0.9999996 0 0 0.9999999 -0.011786 0 0.9999305 -0.008856205 0 0.9999607 0 0 0.9999999 -0.011786 0 0.9999305 -0.0643495 0 0.9979274 -0.05251272 0 0.9986203 -0.008856205 0 0.9999607 -0.008856205 0 0.9999607 -0.05251272 0 0.9986203 -0.02662721 0 0.9996454 -0.001522261 0 0.9999987 0 0 0.9999999 -0.008856205 0 0.9999607 -0.001522261 0 0.9999987 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -7.01103e-4 0 0.9999996 -0.001217842 0 0.9999992 0 0 0.9999999 -7.01103e-4 0 0.9999996 -0.00348371 0 0.9999938 -0.003799856 0 0.9999927 -0.001217842 0 0.9999992 -0.001217842 0 0.9999992 -0.003799856 0 0.9999927 -0.002768454 0 0.9999962 -6.83546e-4 0 0.9999998 0 0 0.9999999 -0.001217842 0 0.9999992 -6.83546e-4 0 0.9999998 0 0 0.9999999 -0.01021776 0 0.9999478 -0.009408251 0 0.9999556 -0.008222308 0 0.999966 -0.007870357 0 0.9999689 -0.009408251 0 0.9999556 -0.003882853 0 0.9999924 -0.003404074 0 0.9999941 -0.008222308 0 0.999966 -0.008222308 0 0.999966 -0.003404074 0 0.9999941 -0.002768454 0 0.9999962 -0.003799856 0 0.9999927 -0.007870357 0 0.9999689 -0.008222308 0 0.999966 -0.003799856 0 0.9999927 -0.00348371 0 0.9999938 0 0 0.9999999 0 0 0.9999999 -7.82929e-4 0 0.9999996 -8.72112e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 -6.83546e-4 0 0.9999998 -7.82929e-4 0 0.9999996 -7.82929e-4 0 0.9999996 -6.83546e-4 0 0.9999998 -0.002768454 0 0.9999962 -0.003404074 0 0.9999941 -8.72112e-4 0 0.9999995 -7.82929e-4 0 0.9999996 -0.003404074 0 0.9999941 -0.003882853 0 0.9999924 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.003802179 0 0.9999927 0.007011717 0 0.9999753 0 0 0.9999999 0 0 0.9999999 -0.004634744 0 0.9999891 0.003802179 0 0.9999927 0.003802179 0 0.9999927 -0.004634744 0 0.9999891 -0.004748894 0 0.9999887 0.02591484 0 0.9996641 0.007011717 0 0.9999753 0.003802179 0 0.9999927 0.02591484 0 0.9996641 0.04078956 0 0.9991677 0 0 0.9999999 -0.06112822 0 0.9981299 -0.01264105 0 0.9999201 0 0 0.9999999 -0.06112822 0 0.9981299 -0.07795423 0 0.9969569 -0.05225991 0 0.9986334 -0.01264105 0 0.9999201 -0.01264105 0 0.9999201 -0.05225991 0 0.9986334 -0.004748894 0 0.9999887 -0.004634744 0 0.9999891 0 0 0.9999999 -0.01264105 0 0.9999201 -0.004634744 0 0.9999891 0 0 0.9999999 0.4529031 0 0.8915598 0.2244154 0 0.9744936 0.005506827 0 0.9999847 0.3243848 0 0.9459252 0.2244154 0 0.9744936 0.04078956 0 0.9991677 0.02591484 0 0.9996641 0.005506827 0 0.9999847 0.005506827 0 0.9999847 0.02591484 0 0.9996641 -0.004748894 0 0.9999887 -0.05225991 0 0.9986334 0.3243848 0 0.9459252 0.005506827 0 0.9999847 -0.05225991 0 0.9986334 -0.07795423 0 0.9969569 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.05234277 0 0.9986292 0.04603522 0 0.9989398 0.02580096 0 0.999667 0.02332319 0 0.999728 0.04603522 0 0.9989398 0.01935158 0 0.9998126 0.01462325 0 0.999893 0.02580096 0 0.999667 0.02580096 0 0.999667 0.01462325 0 0.999893 0.007224743 0 0.9999739 0.01318569 0 0.9999129 0.02332319 0 0.999728 0.02580096 0 0.999667 0.01318569 0 0.9999129 0.01162213 0 0.9999323 0 0 0.9999999 0 0 0.9999999 0.003175914 0 0.9999948 0.004469935 0 0.9999898 0 0 0.9999999 0 0 1 0.001446182 0 0.9999988 0.003175914 0 0.9999948 0.003175914 0 0.9999948 0.001446182 0 0.9999988 0.007224743 0 0.9999739 0.01462325 0 0.999893 0.004469935 0 0.9999898 0.003175914 0 0.9999948 0.01462325 0 0.999893 0.01935158 0 0.9998126 0 0 0.9999999 0.002538715 0 0.9999967 0.003636411 0 0.9999933 0 0 0.9999999 0.002538715 0 0.9999967 0.01162213 0 0.9999323 0.01318569 0 0.9999129 0.003636411 0 0.9999933 0.003636411 0 0.9999933 0.01318569 0 0.9999129 0.007224743 0 0.9999739 0.001446182 0 0.9999988 0 0 0.9999999 0.003636411 0 0.9999933 0.001446182 0 0.9999988 0 0 1 -0.02553311 0 0.999674 0.002634157 0 0.9999965 -0.007717021 0 0.9999701 -0.0190323 0 0.9998187 0.002634157 0 0.9999965 -0.02241437 0 0.9997487 -0.029014 0 0.999579 -0.007717021 0 0.9999701 -0.007717021 0 0.9999701 -0.029014 0 0.999579 -0.01714368 0 0.999853 -0.005019486 0 0.9999873 -0.0190323 0 0.9998187 -0.007717021 0 0.9999701 -0.005019486 0 0.9999873 -0.007300026 0 0.9999732 -0.1384972 0 0.9903628 -0.09014589 0 0.9959285 -0.06311821 0 0.998006 -0.05062277 0 0.9987177 -0.09014589 0 0.9959285 -0.02545225 0 0.9996761 -0.0247592 0 0.9996934 -0.06311821 0 0.998006 -0.06311821 0 0.998006 -0.0247592 0 0.9996934 -0.01714368 0 0.999853 -0.029014 0 0.999579 -0.05062277 0 0.9987177 -0.06311821 0 0.998006 -0.029014 0 0.999579 -0.02241437 0 0.9997487 0 0 0.9999999 -0.001740952 0 0.9999985 -0.00649093 0 0.9999787 -0.004584416 0 0.9999893 -0.001740952 0 0.9999985 -0.007300026 0 0.9999732 -0.005019486 0 0.9999873 -0.00649093 0 0.9999787 -0.00649093 0 0.9999787 -0.005019486 0 0.9999873 -0.01714368 0 0.999853 -0.0247592 0 0.9996934 -0.004584416 0 0.9999893 -0.00649093 0 0.9999787 -0.0247592 0 0.9996934 -0.02545225 0 0.9996761 0 0 0.9999999 -0.002144756 0 0.9999976 -0.003856038 0 0.9999924 0 0 0.9999999 -0.002144756 0 0.9999976 -0.0104094 0 0.9999457 -0.01291539 0 0.9999166 -0.003856038 0 0.9999924 -0.003856038 0 0.9999924 -0.01291539 0 0.9999166 -0.007594053 0 0.9999711 -0.001517011 0 0.9999987 0 0 0.9999999 -0.003856038 0 0.9999924 -0.001517011 0 0.9999987 0 0 0.9999999 -0.02553311 0 0.999674 -0.02804896 0 0.9996065 -0.02323772 0 0.9997299 -0.02189133 0 0.9997602 -0.02804896 0 0.9996065 -0.01257554 0 0.9999208 -0.01050238 0 0.9999447 -0.02323772 0 0.9997299 -0.02323772 0 0.9997299 -0.01050238 0 0.9999447 -0.007594053 0 0.9999711 -0.01291539 0 0.9999166 -0.02189133 0 0.9997602 -0.02323772 0 0.9997299 -0.01291539 0 0.9999166 -0.0104094 0 0.9999457 0 0 0.9999999 0 0 0.9999999 -0.002716222 0 0.9999962 -0.003203753 0 0.9999947 0 0 0.9999999 0 0 0.9999999 -0.001517011 0 0.9999987 -0.002716222 0 0.9999962 -0.002716222 0 0.9999962 -0.001517011 0 0.9999987 -0.007594053 0 0.9999711 -0.01050238 0 0.9999447 -0.003203753 0 0.9999947 -0.002716222 0 0.9999962 -0.01050238 0 0.9999447 -0.01257554 0 0.9999208 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.01272224 0 0.999919 0.0121361 0 0.9999263 0 0 0.9999999 0.01272224 0 0.999919 0.06869963 0 0.9976374 0.05468724 0 0.9985034 0.0121361 0 0.9999263 0.0121361 0 0.9999263 0.05468724 0 0.9985034 0.03944677 0 0.9992216 0.008890392 0 0.9999604 0 0 0.9999999 0.0121361 0 0.9999263 0.008890392 0 0.9999604 0 0 0.9999999 0.3157502 0 0.9488423 0.1233393 0 0.9923644 0.1419897 0 0.9898682 0.2095423 0 0.9777997 0.1233393 0 0.9923644 0.04919976 0 0.998789 0.05653316 0 0.9984006 0.1419897 0 0.9898682 0.1419897 0 0.9898682 0.05653316 0 0.9984006 0.03944677 0 0.9992216 0.05468724 0 0.9985034 0.2095423 0 0.9777997 0.1419897 0 0.9898682 0.05468724 0 0.9985034 0.06869963 0 0.9976374 0 0 0.9999999 0 0 0.9999999 0.01573392 0 0.9998763 0.008786164 0 0.9999614 0 0 0.9999999 0 0 0.9999999 0.008890392 0 0.9999604 0.01573392 0 0.9998763 0.01573392 0 0.9998763 0.008890392 0 0.9999604 0.03944677 0 0.9992216 0.05653316 0 0.9984006 0.008786164 0 0.9999614 0.01573392 0 0.9998763 0.05653316 0 0.9984006 0.04919976 0 0.998789 0.02364418 0 0.9997204 0.009355342 0 0.9999562 0.009244259 0 0.9999572 0.03902161 0 0.9992384 0.009355342 0 0.9999562 0.002034227 0 0.9999978 0.003481854 0 0.9999939 0.009244259 0 0.9999572 0.009244259 0 0.9999572 0.003481854 0 0.9999939 0.003418557 0 0.999994 0.007955872 0 0.9999682 0.03902161 0 0.9992384 0.009244259 0 0.9999572 0.007955872 0 0.9999682 0.01671891 0 0.9998602 0 0 0.9999999 0 0 0.9999999 0.001705798 0 0.9999984 -7.55137e-4 0 0.9999996 0 0 0.9999999 0 0 0.9999999 -1.70264e-4 0 0.9999998 0.001705798 0 0.9999984 0.001705798 0 0.9999984 -1.70264e-4 0 0.9999998 0.003418557 0 0.999994 0.003481854 0 0.9999939 -7.55137e-4 0 0.9999996 0.001705798 0 0.9999984 0.003481854 0 0.9999939 0.002034227 0 0.9999978 0 0 0.9999999 0.003720546 0 0.999993 0.001557592 0 0.9999986 0 0 0.9999999 0.003720546 0 0.999993 0.01671891 0 0.9998602 0.007955872 0 0.9999682 0.001557592 0 0.9999986 0.001557592 0 0.9999986 0.007955872 0 0.9999682 0.003418557 0 0.999994 -1.70264e-4 0 0.9999998 0 0 0.9999999 0.001557592 0 0.9999986 -1.70264e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.07537878 0 0.997155 0.01651822 0 0.9998636 0.02333157 0 0.9997278 0.02934863 0 0.9995692 0.01651822 0 0.9998636 0.07969621 0 0.9968192 0.05993466 0 0.9982023 0.02333157 0 0.9997278 0.02333157 0 0.9997278 0.05993466 0 0.9982023 0.02890091 0 0.9995822 0.01120408 0 0.9999372 0.02934863 0 0.9995692 0.02333157 0 0.9997278 0.01120408 0 0.9999372 0.0156583 0 0.9998774 0.3157502 0 0.9488423 0.2095423 0 0.9777997 0.1163445 0 0.9932089 0.2500966 0 0.9682209 0.2095423 0 0.9777997 0.06869963 0 0.9976374 0.0549458 0 0.9984893 0.1163445 0 0.9932089 0.1163445 0 0.9932089 0.0549458 0 0.9984893 0.02890091 0 0.9995822 0.05993466 0 0.9982023 0.2500966 0 0.9682209 0.1163445 0 0.9932089 0.05993466 0 0.9982023 0.07969621 0 0.9968192 0 0 0.9999999 0.003495483 0 0.9999939 0.01188431 0 0.9999293 0.01272224 0 0.999919 0.003495483 0 0.9999939 0.0156583 0 0.9998774 0.01120408 0 0.9999372 0.01188431 0 0.9999293 0.01188431 0 0.9999293 0.01120408 0 0.9999372 0.02890091 0 0.9995822 0.0549458 0 0.9984893 0.01272224 0 0.999919 0.01188431 0 0.9999293 0.0549458 0 0.9984893 0.06869963 0 0.9976374 0.02364418 0 0.9997204 -0.01768042 0 0.9998437 -0.009056239 0 0.999959 0.009355342 0 0.9999562 -0.01768042 0 0.9998437 0.03373862 0 0.9994307 0.01910842 0 0.9998174 -0.009056239 0 0.999959 -0.009056239 0 0.999959 0.01910842 0 0.9998174 0.008174765 0 0.9999665 -0.001118384 0 0.9999992 0.009355342 0 0.9999562 -0.009056239 0 0.999959 -0.001118384 0 0.9999992 0.002034227 0 0.9999978 0.07537878 0 0.997155 0.06975251 0 0.9975643 0.04889585 0 0.9988037 0.07759924 0 0.9969847 0.06975251 0 0.9975643 0.03563067 0 0.9993649 0.02430147 0 0.9997047 0.04889585 0 0.9988037 0.04889585 0 0.9988037 0.02430147 0 0.9997047 0.008174765 0 0.9999665 0.01910842 0 0.9998174 0.07759924 0 0.9969847 0.04889585 0 0.9988037 0.01910842 0 0.9998174 0.03373862 0 0.9994307 0 0 0.9999999 -7.55137e-4 0 0.9999996 0.004191689 0 0.9999911 0.009686579 0 0.999953 -7.55137e-4 0 0.9999996 0.002034227 0 0.9999978 -0.001118384 0 0.9999992 0.004191689 0 0.9999911 0.004191689 0 0.9999911 -0.001118384 0 0.9999992 0.008174765 0 0.9999665 0.02430147 0 0.9997047 0.009686579 0 0.999953 0.004191689 0 0.9999911 0.02430147 0 0.9997047 0.03563067 0 0.9993649 -0.5082486 0 0.8612104 -0.5727626 0 0.8197212 -0.372782 0 0.927919 -0.1703163 0 0.9853894 -0.5727626 0 0.8197212 -0.3234554 0 0.9462435 -0.2255734 0 0.9742261 -0.372782 0 0.927919 -0.372782 0 0.927919 -0.2255734 0 0.9742261 -0.1358066 0 0.9907353 -0.14521 0 0.9894007 -0.1703163 0 0.9853894 -0.372782 0 0.927919 -0.14521 0 0.9894007 -0.07901164 0 0.9968736 0 0 0.9999999 0 0 0.9999999 -0.03420085 0 0.999415 -0.06206933 0 0.9980718 0 0 0.9999999 0 0 0.9999999 -0.02839206 0 0.9995968 -0.03420085 0 0.999415 -0.03420085 0 0.999415 -0.02839206 0 0.9995968 -0.1358066 0 0.9907353 -0.2255734 0 0.9742261 -0.06206933 0 0.9980718 -0.03420085 0 0.999415 -0.2255734 0 0.9742261 -0.3234554 0 0.9462435 0 0 0.9999999 -0.01423925 0 0.9998986 -0.03202475 0 0.999487 0 0 0.9999999 -0.01423925 0 0.9998986 -0.07901164 0 0.9968736 -0.14521 0 0.9894007 -0.03202475 0 0.999487 -0.03202475 0 0.999487 -0.14521 0 0.9894007 -0.1358066 0 0.9907353 -0.02839206 0 0.9995968 0 0 0.9999999 -0.03202475 0 0.999487 -0.02839206 0 0.9995968 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.2902663 0 0.9569458 0.1960097 0 0.980602 0.1011878 0 0.9948673 0.2048499 0 0.9787933 0.1960097 0 0.980602 0.09405132 0 0.9955673 0.05252254 0 0.9986197 0.1011878 0 0.9948673 0.1011878 0 0.9948673 0.05252254 0 0.9986197 0.02511343 0 0.9996846 0.04567518 0 0.9989564 0.2048499 0 0.9787933 0.1011878 0 0.9948673 0.04567518 0 0.9989564 0.06107298 0 0.9981333 -0.1509346 0 0.9885438 -0.06380657 0 0.9979623 -0.002677112 0 0.9999964 0.01247436 0 0.9999222 -0.06380657 0 0.9979623 -0.02810518 0 0.9996049 -0.002317897 0 0.9999974 -0.002677112 0 0.9999964 -0.002677112 0 0.9999964 -0.002317897 0 0.9999974 0.02511343 0 0.9996846 0.05252254 0 0.9986197 0.01247436 0 0.9999222 -0.002677112 0 0.9999964 0.05252254 0 0.9986197 0.09405132 0 0.9955673 0 0 0.9999999 0.01089329 0 0.9999406 0.01261439 0 0.9999204 -0.004516639 0 0.9999897 0.01089329 0 0.9999406 0.06107298 0 0.9981333 0.04567518 0 0.9989564 0.01261439 0 0.9999204 0.01261439 0 0.9999204 0.04567518 0 0.9989564 0.02511343 0 0.9996846 -0.002317897 0 0.9999974 -0.004516639 0 0.9999897 0.01261439 0 0.9999204 -0.002317897 0 0.9999974 -0.02810518 0 0.9996049 0 0 0.9999999 0.01306835 0 0.9999146 0.016785 0 0.999859 0 0 0.9999999 0.01306835 0 0.9999146 0.06221206 0 0.9980629 0.06067859 0 0.9981573 0.016785 0 0.999859 0.016785 0 0.999859 0.06067859 0 0.9981573 0.02947525 0 0.9995654 0.00540708 0 0.9999852 0 0 0.9999999 0.016785 0 0.999859 0.00540708 0 0.9999852 0 0 0.9999999 0.1285557 0 0.9917023 0.03240217 0 0.9994748 0.09839641 0 0.9951472 0.1528505 0 0.9882494 0.03240217 0 0.9994748 0.01247638 0 0.999922 0.02523888 0 0.9996814 0.09839641 0 0.9951472 0.09839641 0 0.9951472 0.02523888 0 0.9996814 0.02947525 0 0.9995654 0.06067859 0 0.9981573 0.1528505 0 0.9882494 0.09839641 0 0.9951472 0.06067859 0 0.9981573 0.06221206 0 0.9980629 0 0 0.9999999 0 0 0.9999999 0.005264881 0 0.999986 0.002386416 0 0.999997 0 0 0.9999999 0 0 0.9999999 0.00540708 0 0.9999852 0.005264881 0 0.999986 0.005264881 0 0.999986 0.00540708 0 0.9999852 0.02947525 0 0.9995654 0.02523888 0 0.9996814 0.002386416 0 0.999997 0.005264881 0 0.999986 0.02523888 0 0.9996814 0.01247638 0 0.999922 0 0 0.9999999 0.002386416 0 0.999997 0.00989789 0 0.9999509 0.007261985 0 0.9999735 0.002386416 0 0.999997 0.01247638 0 0.999922 0.009463661 0 0.9999551 0.00989789 0 0.9999509 0.00989789 0 0.9999509 0.009463661 0 0.9999551 0.03520221 0 0.9993802 0.04458265 0 0.9990056 0.007261985 0 0.9999735 0.00989789 0 0.9999509 0.04458265 0 0.9990056 0.04135561 0 0.9991444 0.1285557 0 0.9917023 0.01691237 0 0.9998569 0.01935517 0 0.9998125 0.03240217 0 0.9994748 0.01691237 0 0.9998569 0.04726131 0 0.9988826 0.06262267 0 0.9980373 0.01935517 0 0.9998125 0.01935517 0 0.9998125 0.06262267 0 0.9980373 0.03520221 0 0.9993802 0.009463661 0 0.9999551 0.03240217 0 0.9994748 0.01935517 0 0.9998125 0.009463661 0 0.9999551 0.01247638 0 0.999922 0.2302409 0 0.9731336 0.148683 0 0.9888849 0.1457132 0 0.9893268 0.1452608 0 0.9893933 0.148683 0 0.9888849 0.04135561 0 0.9991444 0.04458265 0 0.9990056 0.1457132 0 0.9893268 0.1457132 0 0.9893268 0.04458265 0 0.9990056 0.03520221 0 0.9993802 0.06262267 0 0.9980373 0.1452608 0 0.9893933 0.1457132 0 0.9893268 0.06262267 0 0.9980373 0.04726131 0 0.9988826 0 0 0.9999999 -4.50786e-4 0 0.9999999 -0.01882199 0 0.9998229 -0.01081705 0 0.9999414 -4.50786e-4 0 0.9999999 -0.002037802 0 0.9999978 -0.01576643 0 0.9998757 -0.01882199 0 0.9998229 -0.01882199 0 0.9998229 -0.01576643 0 0.9998757 -0.06390873 0 0.9979557 -0.07866923 0 0.9969007 -0.01081705 0 0.9999414 -0.01882199 0 0.9998229 -0.07866923 0 0.9969007 -0.06638524 0 0.997794 -0.01021776 0 0.9999478 -0.01556546 0 0.9998789 -0.02660681 0 0.9996459 -0.003702974 0 0.9999931 -0.01556546 0 0.9998789 -0.08115847 0 0.9967012 -0.08726533 0 0.9961851 -0.02660681 0 0.9996459 -0.02660681 0 0.9996459 -0.08726533 0 0.9961851 -0.06390873 0 0.9979557 -0.01576643 0 0.9998757 -0.003702974 0 0.9999931 -0.02660681 0 0.9996459 -0.01576643 0 0.9998757 -0.002037802 0 0.9999978 -0.5641258 0 0.8256888 -0.3286607 0 0.944448 -0.1956437 0 0.9806751 -0.1829831 0 0.983116 -0.3286607 0 0.944448 -0.06638524 0 0.997794 -0.07866923 0 0.9969007 -0.1956437 0 0.9806751 -0.1956437 0 0.9806751 -0.07866923 0 0.9969007 -0.06390873 0 0.9979557 -0.08726533 0 0.9961851 -0.1829831 0 0.983116 -0.1956437 0 0.9806751 -0.08726533 0 0.9961851 -0.08115847 0 0.9967012 0 0 0.9999999 0 0 0.9999999 0.01934607 0 0.9998128 0.08719738 0 0.996191 0 0 0.9999999 0 0 0.9999999 0.007335527 0 0.9999729 0.01934607 0 0.9998128 0.01934607 0 0.9998128 0.007335527 0 0.9999729 0.007815385 0 0.9999694 0.07739614 0 0.9970004 0.08719738 0 0.996191 0.01934607 0 0.9998128 0.07739614 0 0.9970004 0.113169 0 0.9935758 0 0 0.9999999 -0.01081705 0 0.9999414 -0.005786121 0 0.9999831 0 0 0.9999999 -0.01081705 0 0.9999414 -0.06638524 0 0.997794 -0.02734738 0 0.999626 -0.005786121 0 0.9999831 -0.005786121 0 0.9999831 -0.02734738 0 0.999626 0.007815385 0 0.9999694 0.007335527 0 0.9999729 0 0 0.9999999 -0.005786121 0 0.9999831 0.007335527 0 0.9999729 0 0 0.9999999 -0.5641258 0 0.8256888 -0.3681148 0 0.9297803 -0.02622621 0 0.999656 -0.3286607 0 0.944448 -0.3681148 0 0.9297803 0.113169 0 0.9935758 0.07739614 0 0.9970004 -0.02622621 0 0.999656 -0.02622621 0 0.999656 0.07739614 0 0.9970004 0.007815385 0 0.9999694 -0.02734738 0 0.999626 -0.3286607 0 0.944448 -0.02622621 0 0.999656 -0.02734738 0 0.999626 -0.06638524 0 0.997794 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.0349854 0 0.9993878 0.01720511 0 0.9998519 0 0 0.9999999 0 0 0.9999999 0.02926249 0 0.9995717 0.0349854 0 0.9993878 0.0349854 0 0.9993878 0.02926249 0 0.9995717 0.1486595 0 0.9888884 0.1540415 0 0.9880643 0.01720511 0 0.9998519 0.0349854 0 0.9993878 0.1540415 0 0.9880643 0.085418 0 0.9963452 0 0 0.9999999 0.07906573 0 0.9968694 0.05534012 0 0.9984676 0 0 0.9999999 0.07906573 0 0.9968694 0.3017139 0 0.9533985 0.2647426 0 0.9643191 0.05534012 0 0.9984676 0.05534012 0 0.9984676 0.2647426 0 0.9643191 0.1486595 0 0.9888884 0.02926249 0 0.9995717 0 0 0.9999999 0.05534012 0 0.9984676 0.02926249 0 0.9995717 0 0 0.9999999 0.508251 0 0.8612089 0.1736461 0 0.984808 0.3849533 0 0.922936 0.5830199 0 0.8124578 0.1736461 0 0.984808 0.085418 0 0.9963452 0.1540415 0 0.9880643 0.3849533 0 0.922936 0.3849533 0 0.922936 0.1540415 0 0.9880643 0.1486595 0 0.9888884 0.2647426 0 0.9643191 0.5830199 0 0.8124578 0.3849533 0 0.922936 0.2647426 0 0.9643191 0.3017139 0 0.9533985 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.001604997 0 0.9999986 -0.003694845 0 0.9999931 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 -0.001604997 0 0.9999986 -0.001604997 0 0.9999986 0 0 0.9999998 -0.003764092 0 0.9999928 -0.008000695 0 0.9999679 -0.003694845 0 0.9999931 -0.001604997 0 0.9999986 -0.008000695 0 0.9999679 -0.01656768 0 0.9998627 0 0 0.9999999 -7.32999e-4 0 0.9999996 -0.001035211 0 0.9999993 0 0 0.9999999 -7.32999e-4 0 0.9999996 -0.001917652 0 0.999998 -0.002936383 0 0.9999956 -0.001035211 0 0.9999993 -0.001035211 0 0.9999993 -0.002936383 0 0.9999956 -0.003764092 0 0.9999928 0 0 0.9999998 0 0 0.9999999 -0.001035211 0 0.9999993 0 0 0.9999998 0 0 0.9999999 -0.02364571 0 0.9997204 -0.03881273 0 0.9992465 -0.009411625 0 0.9999556 -0.009289493 0 0.9999568 -0.03881273 0 0.9992465 -0.01656768 0 0.9998627 -0.008000695 0 0.9999679 -0.009411625 0 0.9999556 -0.009411625 0 0.9999556 -0.008000695 0 0.9999679 -0.003764092 0 0.9999928 -0.002936383 0 0.9999956 -0.009289493 0 0.9999568 -0.009411625 0 0.9999556 -0.002936383 0 0.9999956 -0.001917652 0 0.999998 0 0 0.9999999 -0.003694845 0 0.9999931 0 0 0.9999999 -0.002170801 0 0.9999976 -0.003694845 0 0.9999931 -0.01656768 0 0.9998627 -0.01254247 0 0.9999213 0 0 0.9999999 0 0 0.9999999 -0.01254247 0 0.9999213 0.003625993 0 0.9999934 0.007376251 0 0.9999726 -0.002170801 0 0.9999976 0 0 0.9999999 0.007376251 0 0.9999726 -0.008412336 0 0.9999646 -0.02364571 0 0.9997204 -0.06243647 0 0.9980489 -0.03127499 0 0.9995107 -0.03881273 0 0.9992465 -0.06243647 0 0.9980489 -0.01083987 0 0.9999412 -0.001106734 0 0.9999993 -0.03127499 0 0.9995107 -0.03127499 0 0.9995107 -0.001106734 0 0.9999993 0.003625993 0 0.9999934 -0.01254247 0 0.9999213 -0.03881273 0 0.9992465 -0.03127499 0 0.9995107 -0.01254247 0 0.9999213 -0.01656768 0 0.9998627 -0.01884948 0 0.9998223 -0.03515046 0 0.999382 0.02826943 0 0.9996004 0.05015384 0 0.9987414 -0.03515046 0 0.999382 -0.008412336 0 0.9999646 0.007376251 0 0.9999726 0.02826943 0 0.9996004 0.02826943 0 0.9996004 0.007376251 0 0.9999726 0.003625993 0 0.9999934 -0.001106734 0 0.9999993 0.05015384 0 0.9987414 0.02826943 0 0.9996004 -0.001106734 0 0.9999993 -0.01083987 0 0.9999412 0 0 0.9999999 -0.0133935 0 0.9999103 -0.01232724 0 0.9999239 -0.003254384 0 0.9999946 -0.0133935 0 0.9999103 -0.07024019 0 0.9975301 -0.05650305 0 0.9984024 -0.01232724 0 0.9999239 -0.01232724 0 0.9999239 -0.05650305 0 0.9984024 -0.02951246 0 0.9995644 -0.01098393 0 0.9999396 -0.003254384 0 0.9999946 -0.01232724 0 0.9999239 -0.01098393 0 0.9999396 -0.0150712 0 0.9998865 -0.3157515 0 0.9488418 -0.2500916 0 0.9682221 -0.1174086 0 0.9930837 -0.2103342 0 0.9776294 -0.2500916 0 0.9682221 -0.07969458 0 0.9968193 -0.06046714 0 0.9981701 -0.1174086 0 0.9930837 -0.1174086 0 0.9930837 -0.06046714 0 0.9981701 -0.02951246 0 0.9995644 -0.05650305 0 0.9984024 -0.2103342 0 0.9776294 -0.1174086 0 0.9930837 -0.05650305 0 0.9984024 -0.07024019 0 0.9975301 -0.07538645 0 0.9971544 -0.02917206 0 0.9995744 -0.02333119 0 0.9997278 -0.01651818 0 0.9998636 -0.02917206 0 0.9995744 -0.0150712 0 0.9998865 -0.01098393 0 0.9999396 -0.02333119 0 0.9997278 -0.02333119 0 0.9997278 -0.01098393 0 0.9999396 -0.02951246 0 0.9995644 -0.06046714 0 0.9981701 -0.01651818 0 0.9998636 -0.02333119 0 0.9997278 -0.06046714 0 0.9981701 -0.07969458 0 0.9968193 0 0 0.9999999 0.004704821 0 0.9999889 -0.01337453 0 0.9999106 -0.011786 0 0.9999305 0.004704821 0 0.9999889 0.02866144 0 0.9995891 0.002343369 0 0.9999972 -0.01337453 0 0.9999106 -0.01337453 0 0.9999106 0.002343369 0 0.9999972 -0.02586008 0 0.9996656 -0.0474331 0 0.9988743 -0.011786 0 0.9999305 -0.01337453 0 0.9999106 -0.0474331 0 0.9988743 -0.0643495 0 0.9979274 0.1509368 0 0.9885434 -0.01247599 0 0.9999222 0.002729666 0 0.9999963 0.06413933 0 0.997941 -0.01247599 0 0.9999222 -0.09404835 0 0.9955676 -0.053055 0 0.9985916 0.002729666 0 0.9999963 0.002729666 0 0.9999963 -0.053055 0 0.9985916 -0.02586008 0 0.9996656 0.002343369 0 0.9999972 0.06413933 0 0.997941 0.002729666 0 0.9999963 0.002343369 0 0.9999972 0.02866144 0 0.9995891 -0.2902583 0 0.9569483 -0.2079288 0 0.9781439 -0.1027707 0 0.9947051 -0.1960107 0 0.9806017 -0.2079288 0 0.9781439 -0.0643495 0 0.9979274 -0.0474331 0 0.9988743 -0.1027707 0 0.9947051 -0.1027707 0 0.9947051 -0.0474331 0 0.9988743 -0.02586008 0 0.9996656 -0.053055 0 0.9985916 -0.1960107 0 0.9806017 -0.1027707 0 0.9947051 -0.053055 0 0.9985916 -0.09404835 0 0.9955676 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.008789161 0 0.9999613 -0.0157372 0 0.9998761 0 0 0.9999999 -0.008789161 0 0.9999613 -0.04920477 0 0.9987887 -0.05655325 0 0.9983996 -0.0157372 0 0.9998761 -0.0157372 0 0.9998761 -0.05655325 0 0.9983996 -0.03959174 0 0.999216 -0.008936019 0 0.9999599 0 0 0.9999999 -0.0157372 0 0.9998761 -0.008936019 0 0.9999599 0 0 0.9999999 -0.3157515 0 0.9488418 -0.2103342 0 0.9776294 -0.142153 0 0.9898447 -0.1233421 0 0.9923642 -0.2103342 0 0.9776294 -0.07024019 0 0.9975301 -0.05518142 0 0.9984763 -0.142153 0 0.9898447 -0.142153 0 0.9898447 -0.05518142 0 0.9984763 -0.03959174 0 0.999216 -0.05655325 0 0.9983996 -0.1233421 0 0.9923642 -0.142153 0 0.9898447 -0.05655325 0 0.9983996 -0.04920477 0 0.9987887 0 0 0.9999999 0 0 0.9999999 -0.01241508 0 0.9999229 -0.0133935 0 0.9999103 0 0 0.9999999 0 0 0.9999999 -0.008936019 0 0.9999599 -0.01241508 0 0.9999229 -0.01241508 0 0.9999229 -0.008936019 0 0.9999599 -0.03959174 0 0.999216 -0.05518142 0 0.9984763 -0.0133935 0 0.9999103 -0.01241508 0 0.9999229 -0.05518142 0 0.9984763 -0.07024019 0 0.9975301 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 5.33087e-4 0 0.9999997 4.51713e-4 0 0.9999997 0 0 0.9999999 5.33087e-4 0 0.9999997 0.002152293 0 0.9999976 0.001824791 0 0.9999982 4.51713e-4 0 0.9999997 4.51713e-4 0 0.9999997 0.001824791 0 0.9999982 0.001313756 0 0.9999991 2.50289e-4 0 0.9999999 0 0 0.9999999 4.51713e-4 0 0.9999997 2.50289e-4 0 0.9999999 0 0 0.9999999 0.005236506 0 0.9999862 0.004019372 0 0.9999918 0.00423822 0 0.9999908 0.004887268 0 0.9999879 0.004019372 0 0.9999918 0.001776526 0 0.9999983 0.002250663 0 0.9999974 0.00423822 0 0.9999908 0.00423822 0 0.9999908 0.002250663 0 0.9999974 0.001313756 0 0.9999991 0.001824791 0 0.9999982 0.004887268 0 0.9999879 0.00423822 0 0.9999908 0.001824791 0 0.9999982 0.002152293 0 0.9999976 0 0 0.9999999 0 0 0.9999999 6.49922e-4 0 0.9999996 3.56052e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 2.50289e-4 0 0.9999999 6.49922e-4 0 0.9999996 6.49922e-4 0 0.9999996 2.50289e-4 0 0.9999999 0.001313756 0 0.9999991 0.002250663 0 0.9999974 3.56052e-4 0 0.9999998 6.49922e-4 0 0.9999996 0.002250663 0 0.9999974 0.001776526 0 0.9999983 -0.1384972 0 0.9903628 -0.0855996 0 0.9963296 -0.0872653 0 0.9961851 -0.09014589 0 0.9959285 -0.0855996 0 0.9963296 -0.02789461 0 0.9996108 -0.03700142 0 0.9993152 -0.0872653 0 0.9961851 -0.0872653 0 0.9961851 -0.03700142 0 0.9993152 -0.02119409 0 0.9997754 -0.02713043 0 0.9996318 -0.09014589 0 0.9959285 -0.0872653 0 0.9961851 -0.02713043 0 0.9996318 -0.02545225 0 0.9996761 -0.09670112 0 0.9953134 -0.02170251 0 0.9997646 -0.01159913 0 0.9999326 -0.01014545 0 0.9999484 -0.02170251 0 0.9997646 -0.008568084 0 0.9999631 -0.006068661 0 0.9999814 -0.01159913 0 0.9999326 -0.01159913 0 0.9999326 -0.006068661 0 0.9999814 -0.02119409 0 0.9997754 -0.03700142 0 0.9993152 -0.01014545 0 0.9999484 -0.01159913 0 0.9999326 -0.03700142 0 0.9993152 -0.02789461 0 0.9996108 0 0 0.9999999 -0.004584416 0 0.9999893 -0.006322441 0 0.9999799 -0.001681681 0 0.9999984 -0.004584416 0 0.9999893 -0.02545225 0 0.9996761 -0.02713043 0 0.9996318 -0.006322441 0 0.9999799 -0.006322441 0 0.9999799 -0.02713043 0 0.9996318 -0.02119409 0 0.9997754 -0.006068661 0 0.9999814 -0.001681681 0 0.9999984 -0.006322441 0 0.9999799 -0.006068661 0 0.9999814 -0.008568084 0 0.9999631 0.005236506 0 0.9999862 0.004887268 0 0.9999879 0.002713793 0 0.9999961 0.001914318 0 0.9999981 0.004887268 0 0.9999879 0.002152293 0 0.9999976 0.001704479 0 0.9999985 0.002713793 0 0.9999961 0.002713793 0 0.9999961 0.001704479 0 0.9999985 9.28324e-4 0 0.9999995 0.001496306 0 0.9999987 0.001914318 0 0.9999981 0.002713793 0 0.9999961 0.001496306 0 0.9999987 0.001090618 0 0.9999993 0 0 0.9999999 0 0 0.9999999 4.05155e-4 0 0.9999997 5.33087e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 2.23674e-4 0 0.9999998 4.05155e-4 0 0.9999997 4.05155e-4 0 0.9999997 2.23674e-4 0 0.9999998 9.28324e-4 0 0.9999995 0.001704479 0 0.9999985 5.33087e-4 0 0.9999997 4.05155e-4 0 0.9999997 0.001704479 0 0.9999985 0.002152293 0 0.9999976 0 0 0.9999999 2.65888e-4 0 0.9999999 3.86003e-4 0 0.9999998 0 0 0.9999999 2.65888e-4 0 0.9999999 0.001090618 0 0.9999993 0.001496306 0 0.9999987 3.86003e-4 0 0.9999998 3.86003e-4 0 0.9999998 0.001496306 0 0.9999987 9.28324e-4 0 0.9999995 2.23674e-4 0 0.9999998 0 0 0.9999999 3.86003e-4 0 0.9999998 2.23674e-4 0 0.9999998 0 0 0.9999999 0.4529031 0 0.8915598 0.1117279 0 0.9937389 0.1219336 0 0.9925383 0.2244154 0 0.9744936 0.1117279 0 0.9937389 0.04942877 0 0.9987777 0.06186442 0 0.9980845 0.1219336 0 0.9925383 0.1219336 0 0.9925383 0.06186442 0 0.9980845 0.03608206 0 0.9993488 0.04914018 0 0.9987919 0.2244154 0 0.9744936 0.1219336 0 0.9925383 0.04914018 0 0.9987919 0.04078956 0 0.9991677 0.005236506 0 0.9999862 0.001914318 0 0.9999981 0.01680462 0 0.9998587 0.00957801 0 0.999954 0.001914318 0 0.9999981 0.001090618 0 0.9999993 0.007502061 0 0.9999717 0.01680462 0 0.9998587 0.01680462 0 0.9998587 0.007502061 0 0.9999717 0.03608206 0 0.9993488 0.06186442 0 0.9980845 0.00957801 0 0.999954 0.01680462 0 0.9998587 0.06186442 0 0.9980845 0.04942877 0 0.9987777 0 0 0.9999999 0.007011717 0 0.9999753 0.01204879 0 0.9999273 2.65888e-4 0 0.9999999 0.007011717 0 0.9999753 0.04078956 0 0.9991677 0.04914018 0 0.9987919 0.01204879 0 0.9999273 0.01204879 0 0.9999273 0.04914018 0 0.9987919 0.03608206 0 0.9993488 0.007502061 0 0.9999717 2.65888e-4 0 0.9999999 0.01204879 0 0.9999273 0.007502061 0 0.9999717 0.001090618 0 0.9999993 0 0 0.9999999 0 0 0.9999999 -0.01269209 0 0.9999194 -0.01014964 0 0.9999484 0 0 0.9999999 0 0 0.9999999 -0.004022893 0 0.9999918 -0.01269209 0 0.9999194 -0.01269209 0 0.9999194 -0.004022893 0 0.9999918 -0.02147345 0 0.9997694 -0.04535878 0 0.9989707 -0.01014964 0 0.9999484 -0.01269209 0 0.9999194 -0.04535878 0 0.9989707 -0.04810826 0 0.9988421 0 0 0.9999999 -0.001681681 0 0.9999984 -0.003814196 0 0.9999926 0 0 0.9999999 -0.001681681 0 0.9999984 -0.008568084 0 0.9999631 -0.01777239 0 0.999842 -0.003814196 0 0.9999926 -0.003814196 0 0.9999926 -0.01777239 0 0.999842 -0.02147345 0 0.9997694 -0.004022893 0 0.9999918 0 0 0.9999999 -0.003814196 0 0.9999926 -0.004022893 0 0.9999918 0 0 0.9999999 -0.09670112 0 0.9953134 -0.1187534 0 0.9929237 -0.07290695 0 0.9973387 -0.02170251 0 0.9997646 -0.1187534 0 0.9929237 -0.04810826 0 0.9988421 -0.04535878 0 0.9989707 -0.07290695 0 0.9973387 -0.07290695 0 0.9973387 -0.04535878 0 0.9989707 -0.02147345 0 0.9997694 -0.01777239 0 0.999842 -0.02170251 0 0.9997646 -0.07290695 0 0.9973387 -0.01777239 0 0.999842 -0.008568084 0 0.9999631 0 0 0.9999999 0.004469935 0 0.9999898 0.004008526 0 0.9999918 0 0 0.9999999 0.004469935 0 0.9999898 0.01935158 0 0.9998126 0.01669956 0 0.9998605 0.004008526 0 0.9999918 0.004008526 0 0.9999918 0.01669956 0 0.9998605 0.01365272 0 0.9999068 0.003473982 0 0.9999939 0 0 0.9999999 0.004008526 0 0.9999918 0.003473982 0 0.9999939 0 0 0.9999999 0.05234277 0 0.9986292 0.03652203 0 0.9993327 0.03841767 0 0.9992617 0.04603522 0 0.9989398 0.03652203 0 0.9993327 0.01738961 0 0.9998486 0.01866669 0 0.9998257 0.03841767 0 0.9992617 0.03841767 0 0.9992617 0.01866669 0 0.9998257 0.01365272 0 0.9999068 0.01669956 0 0.9998605 0.04603522 0 0.9989398 0.03841767 0 0.9992617 0.01669956 0 0.9998605 0.01935158 0 0.9998126 0 0 0.9999999 0 0 0.9999999 0.006183763 0 0.9999808 0.003588726 0 0.9999934 0 0 0.9999999 0 0 0.9999999 0.003473982 0 0.9999939 0.006183763 0 0.9999808 0.006183763 0 0.9999808 0.003473982 0 0.9999939 0.01365272 0 0.9999068 0.01866669 0 0.9998257 0.003588726 0 0.9999934 0.006183763 0 0.9999808 0.01866669 0 0.9998257 0.01738961 0 0.9998486 0 0 0.9999999 0.007261985 0 0.9999735 0.01034283 0 0.9999464 0.002538715 0 0.9999967 0.007261985 0 0.9999735 0.04135561 0 0.9991444 0.04068071 0 0.9991722 0.01034283 0 0.9999464 0.01034283 0 0.9999464 0.04068071 0 0.9991722 0.02849708 0 0.9995938 0.00815365 0 0.9999667 0.002538715 0 0.9999967 0.01034283 0 0.9999464 0.00815365 0 0.9999667 0.01162213 0 0.9999323 0.2302409 0 0.9731336 0.08510546 0 0.9963719 0.1049578 0 0.9944767 0.148683 0 0.9888849 0.08510546 0 0.9963719 0.0378249 0 0.9992843 0.04878226 0 0.9988095 0.1049578 0 0.9944767 0.1049578 0 0.9944767 0.04878226 0 0.9988095 0.02849708 0 0.9995938 0.04068071 0 0.9991722 0.148683 0 0.9888849 0.1049578 0 0.9944767 0.04068071 0 0.9991722 0.04135561 0 0.9991444 0.05234277 0 0.9986292 0.02332319 0 0.999728 0.01540956 0 0.9998811 0.01209398 0 0.9999267 0.02332319 0 0.999728 0.01162213 0 0.9999323 0.00815365 0 0.9999667 0.01540956 0 0.9998811 0.01540956 0 0.9998811 0.00815365 0 0.9999667 0.02849708 0 0.9995938 0.04878226 0 0.9988095 0.01209398 0 0.9999267 0.01540956 0 0.9998811 0.04878226 0 0.9988095 0.0378249 0 0.9992843 0 0 0.9999999 0 0 0.9999999 -0.00230262 0 0.9999972 -0.001740952 0 0.9999985 0 0 0.9999999 0 0 1 -0.001370949 0 0.999999 -0.00230262 0 0.9999972 -0.00230262 0 0.9999972 -0.001370949 0 0.999999 -0.005510197 0 0.9999847 -0.009007225 0 0.9999593 -0.001740952 0 0.9999985 -0.00230262 0 0.9999972 -0.009007225 0 0.9999593 -0.007300026 0 0.9999732 0 0 0.9999999 -0.003203753 0 0.9999947 -0.002445051 0 0.9999968 0 0 0.9999999 -0.003203753 0 0.9999947 -0.01257554 0 0.9999208 -0.0101017 0 0.9999488 -0.002445051 0 0.9999968 -0.002445051 0 0.9999968 -0.0101017 0 0.9999488 -0.005510197 0 0.9999847 -0.001370949 0 0.999999 0 0 0.9999999 -0.002445051 0 0.9999968 -0.001370949 0 0.999999 0 0 1 -0.02553311 0 0.999674 -0.0190323 0 0.9998187 -0.01628379 0 0.9998674 -0.02804896 0 0.9996065 -0.0190323 0 0.9998187 -0.007300026 0 0.9999732 -0.009007225 0 0.9999593 -0.01628379 0 0.9998674 -0.01628379 0 0.9998674 -0.009007225 0 0.9999593 -0.005510197 0 0.9999847 -0.0101017 0 0.9999488 -0.02804896 0 0.9996065 -0.01628379 0 0.9998674 -0.0101017 0 0.9999488 -0.01257554 0 0.9999208 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.01709893 0 0.9998537 -0.02555545 0 0.9996734 0 0 0.9999999 -0.01709893 0 0.9998537 -0.09911449 0 0.995076 -0.1127942 0 0.9936183 -0.02555545 0 0.9996734 -0.02555545 0 0.9996734 -0.1127942 0 0.9936183 -0.07267673 0 0.9973555 -0.01541195 0 0.9998812 0 0 0.9999999 -0.02555545 0 0.9996734 -0.01541195 0 0.9998812 0 0 0.9999999 -0.5154768 0 0.8569037 -0.3640859 0 0.9313653 -0.2646355 0 0.9643484 -0.2472876 0 0.9689422 -0.3640859 0 0.9313653 -0.1417799 0 0.9898981 -0.1286854 0 0.9916855 -0.2646355 0 0.9643484 -0.2646355 0 0.9643484 -0.1286854 0 0.9916855 -0.07267673 0 0.9973555 -0.1127942 0 0.9936183 -0.2472876 0 0.9689422 -0.2646355 0 0.9643484 -0.1127942 0 0.9936183 -0.09911449 0 0.995076 0 0 0.9999999 0 0 0.9999999 -0.02844393 0 0.9995954 -0.03278953 0 0.9994623 0 0 0.9999999 0 0 0.9999999 -0.01541195 0 0.9998812 -0.02844393 0 0.9995954 -0.02844393 0 0.9995954 -0.01541195 0 0.9998812 -0.07267673 0 0.9973555 -0.1286854 0 0.9916855 -0.03278953 0 0.9994623 -0.02844393 0 0.9995954 -0.1286854 0 0.9916855 -0.1417799 0 0.9898981 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.004516639 0 0.9999897 -0.00974202 0 0.9999525 0.002139653 0 0.9999977 -0.004516639 0 0.9999897 -0.02810518 0 0.9996049 -0.05235559 0 0.9986284 -0.00974202 0 0.9999525 -0.00974202 0 0.9999525 -0.05235559 0 0.9986284 -0.02824116 0 0.9996011 0.01263788 0 0.99992 0.002139653 0 0.9999977 -0.00974202 0 0.9999525 0.01263788 0 0.99992 0.008337744 0 0.9999652 -0.1509346 0 0.9885438 -0.1593474 0 0.9872226 -0.1249541 0 0.9921625 -0.06380657 0 0.9979623 -0.1593474 0 0.9872226 -0.01584279 0 0.9998745 -0.03634009 0 0.9993395 -0.1249541 0 0.9921625 -0.1249541 0 0.9921625 -0.03634009 0 0.9993395 -0.02824116 0 0.9996011 -0.05235559 0 0.9986284 -0.06380657 0 0.9979623 -0.1249541 0 0.9921625 -0.05235559 0 0.9986284 -0.02810518 0 0.9996049 0.01885246 0 0.9998222 0.03513055 0 0.9993827 0.03140763 0 0.9995066 0.08150942 0 0.9966726 0.03513055 0 0.9993827 0.008337744 0 0.9999652 0.01263788 0 0.99992 0.03140763 0 0.9995066 0.03140763 0 0.9995066 0.01263788 0 0.99992 -0.02824116 0 0.9996011 -0.03634009 0 0.9993395 0.08150942 0 0.9966726 0.03140763 0 0.9995066 -0.03634009 0 0.9993395 -0.01584279 0 0.9998745 0.01885246 0 0.9998222 -0.05015728 0 0.9987413 -0.02831446 0 0.9995991 0.03513055 0 0.9993827 -0.05015728 0 0.9987413 0.01083615 0 0.9999412 0.001112761 0 0.9999994 -0.02831446 0 0.9995991 -0.02831446 0 0.9995991 0.001112761 0 0.9999994 -0.003702481 0 0.9999931 -0.007434374 0 0.9999722 0.03513055 0 0.9993827 -0.02831446 0 0.9995991 -0.007434374 0 0.9999722 0.008337744 0 0.9999652 0.02364418 0 0.9997204 0.03902161 0 0.9992384 0.03140209 0 0.9995067 0.06243264 0 0.9980491 0.03902161 0 0.9992384 0.01671891 0 0.9998602 0.01261238 0 0.9999204 0.03140209 0 0.9995067 0.03140209 0 0.9995067 0.01261238 0 0.9999204 -0.003702481 0 0.9999931 0.001112761 0 0.9999994 0.06243264 0 0.9980491 0.03140209 0 0.9995067 0.001112761 0 0.9999994 0.01083615 0 0.9999412 0 0 0.9999999 0.002139653 0 0.9999977 0 0 0.9999999 0.003720546 0 0.999993 0.002139653 0 0.9999977 0.008337744 0 0.9999652 -0.007434374 0 0.9999722 0 0 0.9999999 0 0 0.9999999 -0.007434374 0 0.9999722 -0.003702481 0 0.9999931 0.01261238 0 0.9999204 0.003720546 0 0.999993 0 0 0.9999999 0.01261238 0 0.9999204 0.01671891 0 0.9998602 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.005071994 0 0.9999871 0.003495483 0 0.9999939 0 0 0.9999999 0 0 0.9999999 0.002155935 0 0.9999975 0.005071994 0 0.9999871 0.005071994 0 0.9999871 0.002155935 0 0.9999975 0.01062079 0 0.9999436 0.01867935 0 0.9998255 0.003495483 0 0.9999939 0.005071994 0 0.9999871 0.01867935 0 0.9998255 0.0156583 0 0.9998774 0 0 0.9999999 0.009686579 0 0.999953 0.005045504 0 0.9999871 0 0 0.9999999 0.009686579 0 0.999953 0.03563067 0 0.9993649 0.02231117 0 0.999751 0.005045504 0 0.9999871 0.005045504 0 0.9999871 0.02231117 0 0.999751 0.01062079 0 0.9999436 0.002155935 0 0.9999975 0 0 0.9999999 0.005045504 0 0.9999871 0.002155935 0 0.9999975 0 0 0.9999999 0.07537878 0 0.997155 0.02934863 0 0.9995692 0.03693007 0 0.9993177 0.06975251 0 0.9975643 0.02934863 0 0.9995692 0.0156583 0 0.9998774 0.01867935 0 0.9998255 0.03693007 0 0.9993177 0.03693007 0 0.9993177 0.01867935 0 0.9998255 0.01062079 0 0.9999436 0.02231117 0 0.999751 0.06975251 0 0.9975643 0.03693007 0 0.9993177 0.02231117 0 0.999751 0.03563067 0 0.9993649 0 0 0.9999999 -0.03278953 0 0.9994623 -0.02823601 0 0.9996014 -0.01423925 0 0.9998986 -0.03278953 0 0.9994623 -0.1417799 0 0.9898981 -0.119068 0 0.9928861 -0.02823601 0 0.9996014 -0.02823601 0 0.9996014 -0.119068 0 0.9928861 -0.1057457 0 0.9943932 -0.04145976 0 0.9991402 -0.01423925 0 0.9998986 -0.02823601 0 0.9996014 -0.04145976 0 0.9991402 -0.07901164 0 0.9968736 -0.5154768 0 0.8569037 -0.3653444 0 0.9308724 -0.2290305 0 0.9734192 -0.3640859 0 0.9313653 -0.3653444 0 0.9308724 -0.1283806 0 0.991725 -0.1453022 0 0.9893872 -0.2290305 0 0.9734192 -0.2290305 0 0.9734192 -0.1453022 0 0.9893872 -0.1057457 0 0.9943932 -0.119068 0 0.9928861 -0.3640859 0 0.9313653 -0.2290305 0 0.9734192 -0.119068 0 0.9928861 -0.1417799 0 0.9898981 -0.5082486 0 0.8612104 -0.1703163 0 0.9853894 -0.06627576 0 0.9978012 -0.05358382 0 0.9985633 -0.1703163 0 0.9853894 -0.07901164 0 0.9968736 -0.04145976 0 0.9991402 -0.06627576 0 0.9978012 -0.06627576 0 0.9978012 -0.04145976 0 0.9991402 -0.1057457 0 0.9943932 -0.1453022 0 0.9893872 -0.05358382 0 0.9985633 -0.06627576 0 0.9978012 -0.1453022 0 0.9893872 -0.1283806 0 0.991725 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.008053747 0 0.9999675 0.01089329 0 0.9999406 0 0 0.9999999 0 0 0.9999999 0.001653624 0 0.9999985 0.008053747 0 0.9999675 0.008053747 0 0.9999675 0.001653624 0 0.9999985 0.02487139 0 0.9996907 0.04878436 0 0.9988093 0.01089329 0 0.9999406 0.008053747 0 0.9999675 0.04878436 0 0.9988093 0.06107298 0 0.9981333 0 0 0.9999999 5.87369e-4 0 0.9999998 0.004149771 0 0.9999912 0 0 0.9999999 5.87369e-4 0 0.9999998 5.73042e-4 0 0.9999999 0.03551552 0 0.9993691 0.004149771 0 0.9999912 0.004149771 0 0.9999912 0.03551552 0 0.9993691 0.02487139 0 0.9996907 0.001653624 0 0.9999985 0 0 0.9999999 0.004149771 0 0.9999912 0.001653624 0 0.9999985 0 0 0.9999999 0.2902663 0 0.9569458 0.2048499 0 0.9787933 0.191776 0 0.9814388 0.08546415 0 0.9963412 0.2048499 0 0.9787933 0.06107298 0 0.9981333 0.04878436 0 0.9988093 0.191776 0 0.9814388 0.191776 0 0.9814388 0.04878436 0 0.9988093 0.02487139 0 0.9996907 0.03551552 0 0.9993691 0.08546415 0 0.9963412 0.191776 0 0.9814388 0.03551552 0 0.9993691 5.73042e-4 0 0.9999999</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape5-textangents-array" count="3072" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape5-texbinormals">
+ <float_array id="qt_gauge_background_Shape5-texbinormals-array" count="9216">0.8612105 0 0.5082486 0.7203061 0 0.6936565 0.8627974 0 0.5055501 0.8197213 0 0.5727627 0.7203061 0 0.6936565 0.9247047 0 0.3806855 0.9699714 0 0.2432191 0.8627974 0 0.5055501 0.8627974 0 0.5055501 0.9699714 0 0.2432191 0.9951431 0 0.09843937 0.9754581 0 0.2201853 0.8197213 0 0.5727627 0.8627974 0 0.5055501 0.9754581 0 0.2201853 0.9462435 0 0.3234554 0.956946 0 -0.2902664 0.9963413 0 -0.08546415 0.9945254 0 0.1044956 0.997941 0 0.06413913 0.9963413 0 -0.08546415 0.9999999 0 -5.73042e-4 0.9981741 0 0.06040362 0.9945254 0 0.1044956 0.9945254 0 0.1044956 0.9981741 0 0.06040362 0.9951431 0 0.09843937 0.9699714 0 0.2432191 0.997941 0 0.06413913 0.9945254 0 0.1044956 0.9699714 0 0.2432191 0.9247047 0 0.3806855 1 0 0 0.9980719 0 0.06206933 0.9985056 0 0.0546514 0.9999999 0 -5.87369e-4 0.9980719 0 0.06206933 0.9462435 0 0.3234554 0.9754581 0 0.2201853 0.9985056 0 0.0546514 0.9985056 0 0.0546514 0.9754581 0 0.2201853 0.9951431 0 0.09843937 0.9981741 0 0.06040362 0.9999999 0 -5.87369e-4 0.9985056 0 0.0546514 0.9981741 0 0.06040362 0.9999999 0 -5.73042e-4 1 0 0 1 0 0 0.9999999 0 4.64077e-4 0.9999999 0 4.50786e-4 1 0 0 1 0 0 0.9999999 0 5.46139e-4 0.9999999 0 4.64077e-4 0.9999999 0 4.64077e-4 0.9999999 0 5.46139e-4 0.999999 0 0.001413613 0.9999974 0 0.002293 0.9999999 0 4.50786e-4 0.9999999 0 4.64077e-4 0.9999974 0 0.002293 0.9999979 0 0.002037802 1 0 0 0.9999996 0 8.72112e-4 0.9999998 0 6.17426e-4 1 0 0 0.9999996 0 8.72112e-4 0.9999925 0 0.003882853 0.9999959 0 0.002893214 0.9999998 0 6.17426e-4 0.9999998 0 6.17426e-4 0.9999959 0 0.002893214 0.999999 0 0.001413613 0.9999999 0 5.46139e-4 1 0 0 0.9999998 0 6.17426e-4 0.9999999 0 5.46139e-4 1 0 0 0.9999478 0 0.01021776 0.9999931 0 0.003702975 0.9999874 0 0.005038166 0.9999558 0 0.009408252 0.9999931 0 0.003702975 0.9999979 0 0.002037802 0.9999974 0 0.002293 0.9999874 0 0.005038166 0.9999874 0 0.005038166 0.9999974 0 0.002293 0.999999 0 0.001413613 0.9999959 0 0.002893214 0.9999558 0 0.009408252 0.9999874 0 0.005038166 0.9999959 0 0.002893214 0.9999925 0 0.003882853 1 0 0 0.9995031 0 -0.03152041 0.9996026 0 -0.02819019 1 0 0 0.9995031 0 -0.03152041 0.9901881 0 -0.1397413 0.9917451 0 -0.1282256 0.9996026 0 -0.02819019 0.9996026 0 -0.02819019 0.9917451 0 -0.1282256 0.9973642 0 -0.07255854 0.9998821 0 -0.01536091 1 0 0 0.9996026 0 -0.02819019 0.9998821 0 -0.01536091 1 0 0 0.8569021 0 -0.5154793 0.9689416 0 -0.2472898 0.9643739 0 -0.2645433 0.9317028 0 -0.3632217 0.9689416 0 -0.2472898 0.9950758 0 -0.09911732 0.9936155 0 -0.1128195 0.9643739 0 -0.2645433 0.9643739 0 -0.2645433 0.9936155 0 -0.1128195 0.9973642 0 -0.07255854 0.9917451 0 -0.1282256 0.9317028 0 -0.3632217 0.9643739 0 -0.2645433 0.9917451 0 -0.1282256 0.9901881 0 -0.1397413 1 0 0 1 0 0 0.9996732 0 -0.02556335 0.9998537 0 -0.01710429 1 0 0 1 0 0 0.9998821 0 -0.01536091 0.9996732 0 -0.02556335 0.9996732 0 -0.02556335 0.9998821 0 -0.01536091 0.9973642 0 -0.07255854 0.9936155 0 -0.1128195 0.9998537 0 -0.01710429 0.9996732 0 -0.02556335 0.9936155 0 -0.1128195 0.9950758 0 -0.09911732 0.861209 0 -0.5082511 0.9985621 0 -0.05360901 0.9976579 0 -0.06840209 0.9848082 0 -0.1736461 0.9985621 0 -0.05360901 0.9917235 0 -0.1283923 0.989361 0 -0.1454816 0.9976579 0 -0.06840209 0.9976579 0 -0.06840209 0.989361 0 -0.1454816 0.9944898 0 -0.1048333 0.9990126 0 -0.04442843 0.9848082 0 -0.1736461 0.9976579 0 -0.06840209 0.9990126 0 -0.04442843 0.9963452 0 -0.085418 0.8569021 0 -0.5154793 0.9317028 0 -0.3632217 0.973779 0 -0.2274964 0.9308721 0 -0.3653452 0.9317028 0 -0.3632217 0.9901881 0 -0.1397413 0.9931803 0 -0.1165891 0.973779 0 -0.2274964 0.973779 0 -0.2274964 0.9931803 0 -0.1165891 0.9944898 0 -0.1048333 0.989361 0 -0.1454816 0.9308721 0 -0.3653452 0.973779 0 -0.2274964 0.989361 0 -0.1454816 0.9917235 0 -0.1283923 1 0 0 0.9998521 0 -0.01720511 0.9996037 0 -0.02814981 0.9995031 0 -0.03152041 0.9998521 0 -0.01720511 0.9963452 0 -0.085418 0.9990126 0 -0.04442843 0.9996037 0 -0.02814981 0.9996037 0 -0.02814981 0.9990126 0 -0.04442843 0.9944898 0 -0.1048333 0.9931803 0 -0.1165891 0.9995031 0 -0.03152041 0.9996037 0 -0.02814981 0.9931803 0 -0.1165891 0.9901881 0 -0.1397413 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998224 0 0.01884948 0.9966725 0 0.08150996 0.9995056 0 0.03144193 0.9993821 0 0.03515046 0.9966725 0 0.08150996 0.9998746 0 -0.01584166 0.999339 0 -0.03635292 0.9995056 0 0.03144193 0.9995056 0 0.03144193 0.999339 0 -0.03635292 0.9995964 0 -0.02841082 0.9999192 0 0.01271665 0.9993821 0 0.03515046 0.9995056 0 0.03144193 0.9999192 0 0.01271665 0.9999647 0 0.008412337 0.9885435 0 -0.1509368 0.997941 0 -0.06413933 0.9921361 0 -0.1251636 0.9872233 0 -0.1593436 0.997941 0 -0.06413933 0.9995892 0 -0.02866144 0.9985965 0 -0.05296337 0.9921361 0 -0.1251636 0.9921361 0 -0.1251636 0.9985965 0 -0.05296337 0.9995964 0 -0.02841082 0.999339 0 -0.03635292 0.9872233 0 -0.1593436 0.9921361 0 -0.1251636 0.999339 0 -0.03635292 0.9998746 0 -0.01584166 1 0 0 0.9999977 0 0.002170801 0.999949 0 -0.01010345 0.999989 0 -0.004704821 0.9999977 0 0.002170801 0.9999647 0 0.008412337 0.9999192 0 0.01271665 0.999949 0 -0.01010345 0.999949 0 -0.01010345 0.9999192 0 0.01271665 0.9995964 0 -0.02841082 0.9985965 0 -0.05296337 0.999989 0 -0.004704821 0.999949 0 -0.01010345 0.9985965 0 -0.05296337 0.9995892 0 -0.02866144 0.9971544 0 0.07538645 0.9969847 0 0.07759845 0.9988331 0 0.04829706 0.9976088 0 0.06911304 0.9969847 0 0.07759845 0.9994311 0 0.03372657 0.9998221 0 0.01886647 0.9988331 0 0.04829706 0.9988331 0 0.04829706 0.9998221 0 0.01886647 0.9999714 0 0.007568491 0.9996875 0 0.02499956 0.9976088 0 0.06911304 0.9988331 0 0.04829706 0.9996875 0 0.02499956 0.9995284 0 0.03070834 0.9997205 0 0.02364572 0.9999569 0 0.009289494 0.9999566 0 -0.009319563 0.9998437 0 -0.01768439 0.9999569 0 0.009289494 0.9999982 0 0.001917653 0.999998 0 -0.001982891 0.9999566 0 -0.009319563 0.9999566 0 -0.009319563 0.999998 0 -0.001982891 0.9999714 0 0.007568491 0.9998221 0 0.01886647 0.9998437 0 -0.01768439 0.9999566 0 -0.009319563 0.9998221 0 0.01886647 0.9994311 0 0.03372657 1 0 0 0.9999766 0 0.00684046 0.9999889 0 0.004720136 0.9999998 0 7.32999e-4 0.9999766 0 0.00684046 0.9995284 0 0.03070834 0.9996875 0 0.02499956 0.9999889 0 0.004720136 0.9999889 0 0.004720136 0.9996875 0 0.02499956 0.9999714 0 0.007568491 0.999998 0 -0.001982891 0.9999998 0 7.32999e-4 0.9999889 0 0.004720136 0.999998 0 -0.001982891 0.9999982 0 0.001917653 0.9971544 0 0.07538645 0.9976088 0 0.06911304 0.9993609 0 0.03574936 0.9995745 0 0.02917207 0.9976088 0 0.06911304 0.9995284 0 0.03070834 0.9997875 0 0.020614 0.9993609 0 0.03574936 0.9993609 0 0.03574936 0.9997875 0 0.020614 0.999953 0 0.00969856 0.9998427 0 0.01773668 0.9995745 0 0.02917207 0.9993609 0 0.03574936 0.9998427 0 0.01773668 0.9998865 0 0.0150712 1 0 0 1 0 0 0.9999901 0 0.004466512 0.9999766 0 0.00684046 1 0 0 1 0 0 0.9999973 0 0.002376025 0.9999901 0 0.004466512 0.9999901 0 0.004466512 0.9999973 0 0.002376025 0.999953 0 0.00969856 0.9997875 0 0.020614 0.9999766 0 0.00684046 0.9999901 0 0.004466512 0.9997875 0 0.020614 0.9995284 0 0.03070834 1 0 0 0.9999947 0 0.003254384 0.9999923 0 0.003959488 1 0 0 0.9999947 0 0.003254384 0.9998865 0 0.0150712 0.9998427 0 0.01773668 0.9999923 0 0.003959488 0.9999923 0 0.003959488 0.9998427 0 0.01773668 0.999953 0 0.00969856 0.9999973 0 0.002376025 1 0 0 0.9999923 0 0.003959488 0.9999973 0 0.002376025 1 0 0 0.9569483 0 0.2902583 0.9979388 0 -0.06417349 0.9947948 0 -0.1018994 0.9962259 0 0.0867992 0.9979388 0 -0.06417349 0.9247094 0 -0.3806737 0.9697098 0 -0.2442598 0.9947948 0 -0.1018994 0.9947948 0 -0.1018994 0.9697098 0 -0.2442598 0.9950336 0 -0.09953951 0.9983143 0 -0.05804002 0.9962259 0 0.0867992 0.9947948 0 -0.1018994 0.9983143 0 -0.05804002 0.9999996 0 9.29293e-4 0.861209 0 -0.5082511 0.8124579 0 -0.58302 0.8589766 0 -0.512015 0.7203116 0 -0.6936507 0.8124579 0 -0.58302 0.9533986 0 -0.3017139 0.9736263 0 -0.228149 0.8589766 0 -0.512015 0.8589766 0 -0.512015 0.9736263 0 -0.228149 0.9950336 0 -0.09953951 0.9697098 0 -0.2442598 0.7203116 0 -0.6936507 0.8589766 0 -0.512015 0.9697098 0 -0.2442598 0.9247094 0 -0.3806737 1 0 0 0.9999939 0 -0.003513105 0.9989057 0 -0.04677058 0.9968695 0 -0.07906574 0.9999939 0 -0.003513105 0.9999996 0 9.29293e-4 0.9983143 0 -0.05804002 0.9989057 0 -0.04677058 0.9989057 0 -0.04677058 0.9983143 0 -0.05804002 0.9950336 0 -0.09953951 0.9736263 0 -0.228149 0.9968695 0 -0.07906574 0.9989057 0 -0.04677058 0.9736263 0 -0.228149 0.9533986 0 -0.3017139 0.9569483 0 0.2902583 0.9962259 0 0.0867992 0.9807805 0 0.1951151 0.978144 0 0.2079288 0.9962259 0 0.0867992 0.9999996 0 9.29293e-4 0.99902 0 0.0442616 0.9807805 0 0.1951151 0.9807805 0 0.1951151 0.99902 0 0.0442616 0.9996455 0 0.02662721 0.9986203 0 0.05251272 0.978144 0 0.2079288 0.9807805 0 0.1951151 0.9986203 0 0.05251272 0.9979274 0 0.0643495 1 0 0 1 0 0 0.9999713 0 0.007582617 0.9999939 0 -0.003513105 1 0 0 1 0 0 0.9999989 0 0.001522261 0.9999713 0 0.007582617 0.9999713 0 0.007582617 0.9999989 0 0.001522261 0.9996455 0 0.02662721 0.99902 0 0.0442616 0.9999939 0 -0.003513105 0.9999713 0 0.007582617 0.99902 0 0.0442616 0.9999996 0 9.29293e-4 1 0 0 0.9999306 0 0.01178601 0.9999608 0 0.008856206 1 0 0 0.9999306 0 0.01178601 0.9979274 0 0.0643495 0.9986203 0 0.05251272 0.9999608 0 0.008856206 0.9999608 0 0.008856206 0.9986203 0 0.05251272 0.9996455 0 0.02662721 0.9999989 0 0.001522261 1 0 0 0.9999608 0 0.008856206 0.9999989 0 0.001522261 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 7.01103e-4 0.9999993 0 0.001217842 1 0 0 0.9999998 0 7.01103e-4 0.999994 0 0.00348371 0.9999928 0 0.003799857 0.9999993 0 0.001217842 0.9999993 0 0.001217842 0.9999928 0 0.003799857 0.9999962 0 0.002768454 0.9999998 0 6.83546e-4 1 0 0 0.9999993 0 0.001217842 0.9999998 0 6.83546e-4 1 0 0 0.9999478 0 0.01021776 0.9999558 0 0.009408252 0.9999662 0 0.008222309 0.9999691 0 0.007870359 0.9999558 0 0.009408252 0.9999925 0 0.003882853 0.9999943 0 0.003404074 0.9999662 0 0.008222309 0.9999662 0 0.008222309 0.9999943 0 0.003404074 0.9999962 0 0.002768454 0.9999928 0 0.003799857 0.9999691 0 0.007870359 0.9999662 0 0.008222309 0.9999928 0 0.003799857 0.999994 0 0.00348371 1 0 0 1 0 0 0.9999997 0 7.82929e-4 0.9999996 0 8.72112e-4 1 0 0 1 0 0 0.9999998 0 6.83546e-4 0.9999997 0 7.82929e-4 0.9999997 0 7.82929e-4 0.9999998 0 6.83546e-4 0.9999962 0 0.002768454 0.9999943 0 0.003404074 0.9999996 0 8.72112e-4 0.9999997 0 7.82929e-4 0.9999943 0 0.003404074 0.9999925 0 0.003882853 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999928 0 -0.00380218 0.9999755 0 -0.007011718 1 0 0 1 0 0 0.9999893 0 0.004634745 0.9999928 0 -0.00380218 0.9999928 0 -0.00380218 0.9999893 0 0.004634745 0.9999888 0 0.004748895 0.9996642 0 -0.02591484 0.9999755 0 -0.007011718 0.9999928 0 -0.00380218 0.9996642 0 -0.02591484 0.9991677 0 -0.04078956 1 0 0 0.9981299 0 0.06112822 0.9999202 0 0.01264106 1 0 0 0.9981299 0 0.06112822 0.9969569 0 0.07795423 0.9986336 0 0.05225992 0.9999202 0 0.01264106 0.9999202 0 0.01264106 0.9986336 0 0.05225992 0.9999888 0 0.004748895 0.9999893 0 0.004634745 1 0 0 0.9999202 0 0.01264106 0.9999893 0 0.004634745 1 0 0 0.8915598 0 -0.4529031 0.9744936 0 -0.2244154 0.9999849 0 -0.005506827 0.9459252 0 -0.3243848 0.9744936 0 -0.2244154 0.9991677 0 -0.04078956 0.9996642 0 -0.02591484 0.9999849 0 -0.005506827 0.9999849 0 -0.005506827 0.9996642 0 -0.02591484 0.9999888 0 0.004748895 0.9986336 0 0.05225992 0.9459252 0 -0.3243848 0.9999849 0 -0.005506827 0.9986336 0 0.05225992 0.9969569 0 0.07795423 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9986292 0 -0.05234277 0.9989399 0 -0.04603522 0.9996672 0 -0.02580097 0.9997281 0 -0.0233232 0.9989399 0 -0.04603522 0.9998127 0 -0.01935158 0.9998931 0 -0.01462325 0.9996672 0 -0.02580097 0.9996672 0 -0.02580097 0.9998931 0 -0.01462325 0.9999739 0 -0.007224743 0.9999132 0 -0.0131857 0.9997281 0 -0.0233232 0.9996672 0 -0.02580097 0.9999132 0 -0.0131857 0.9999325 0 -0.01162213 1 0 0 1 0 0 0.999995 0 -0.003175915 0.99999 0 -0.004469936 1 0 0 1 0 0 0.999999 0 -0.001446183 0.999995 0 -0.003175915 0.999995 0 -0.003175915 0.999999 0 -0.001446183 0.9999739 0 -0.007224743 0.9998931 0 -0.01462325 0.99999 0 -0.004469936 0.999995 0 -0.003175915 0.9998931 0 -0.01462325 0.9998127 0 -0.01935158 1 0 0 0.9999968 0 -0.002538716 0.9999934 0 -0.003636411 1 0 0 0.9999968 0 -0.002538716 0.9999325 0 -0.01162213 0.9999132 0 -0.0131857 0.9999934 0 -0.003636411 0.9999934 0 -0.003636411 0.9999132 0 -0.0131857 0.9999739 0 -0.007224743 0.999999 0 -0.001446183 1 0 0 0.9999934 0 -0.003636411 0.999999 0 -0.001446183 1 0 0 0.999674 0 0.02553311 0.9999966 0 -0.002634157 0.9999703 0 0.007717022 0.9998189 0 0.0190323 0.9999966 0 -0.002634157 0.9997488 0 0.02241438 0.9995791 0 0.029014 0.9999703 0 0.007717022 0.9999703 0 0.007717022 0.9995791 0 0.029014 0.9998531 0 0.01714368 0.9999875 0 0.005019487 0.9998189 0 0.0190323 0.9999703 0 0.007717022 0.9999875 0 0.005019487 0.9999734 0 0.007300028 0.9903629 0 0.1384972 0.9959286 0 0.0901459 0.9980061 0 0.06311821 0.9987178 0 0.05062278 0.9959286 0 0.0901459 0.9996761 0 0.02545225 0.9996935 0 0.0247592 0.9980061 0 0.06311821 0.9980061 0 0.06311821 0.9996935 0 0.0247592 0.9998531 0 0.01714368 0.9995791 0 0.029014 0.9987178 0 0.05062278 0.9980061 0 0.06311821 0.9995791 0 0.029014 0.9997488 0 0.02241438 1 0 0 0.9999985 0 0.001740953 0.999979 0 0.006490931 0.9999896 0 0.004584417 0.9999985 0 0.001740953 0.9999734 0 0.007300028 0.9999875 0 0.005019487 0.999979 0 0.006490931 0.999979 0 0.006490931 0.9999875 0 0.005019487 0.9998531 0 0.01714368 0.9996935 0 0.0247592 0.9999896 0 0.004584417 0.999979 0 0.006490931 0.9996935 0 0.0247592 0.9996761 0 0.02545225 1 0 0 0.9999978 0 0.002144756 0.9999927 0 0.003856039 1 0 0 0.9999978 0 0.002144756 0.9999458 0 0.0104094 0.9999167 0 0.01291539 0.9999927 0 0.003856039 0.9999927 0 0.003856039 0.9999167 0 0.01291539 0.9999712 0 0.007594054 0.9999989 0 0.001517011 1 0 0 0.9999927 0 0.003856039 0.9999989 0 0.001517011 1 0 0 0.999674 0 0.02553311 0.9996066 0 0.02804896 0.99973 0 0.02323772 0.9997604 0 0.02189134 0.9996066 0 0.02804896 0.999921 0 0.01257554 0.9999449 0 0.01050238 0.99973 0 0.02323772 0.99973 0 0.02323772 0.9999449 0 0.01050238 0.9999712 0 0.007594054 0.9999167 0 0.01291539 0.9997604 0 0.02189134 0.99973 0 0.02323772 0.9999167 0 0.01291539 0.9999458 0 0.0104094 1 0 0 1 0 0 0.9999964 0 0.002716223 0.9999949 0 0.003203754 1 0 0 1 0 0 0.9999989 0 0.001517011 0.9999964 0 0.002716223 0.9999964 0 0.002716223 0.9999989 0 0.001517011 0.9999712 0 0.007594054 0.9999449 0 0.01050238 0.9999949 0 0.003203754 0.9999964 0 0.002716223 0.9999449 0 0.01050238 0.999921 0 0.01257554 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999191 0 -0.01272224 0.9999264 0 -0.01213611 1 0 0 0.9999191 0 -0.01272224 0.9976375 0 -0.06869963 0.9985036 0 -0.05468724 0.9999264 0 -0.01213611 0.9999264 0 -0.01213611 0.9985036 0 -0.05468724 0.9992217 0 -0.03944677 0.9999605 0 -0.008890393 1 0 0 0.9999264 0 -0.01213611 0.9999605 0 -0.008890393 1 0 0 0.9488423 0 -0.3157502 0.9923646 0 -0.1233393 0.9898682 0 -0.1419897 0.9777997 0 -0.2095423 0.9923646 0 -0.1233393 0.998789 0 -0.04919976 0.9984008 0 -0.05653317 0.9898682 0 -0.1419897 0.9898682 0 -0.1419897 0.9984008 0 -0.05653317 0.9992217 0 -0.03944677 0.9985036 0 -0.05468724 0.9777997 0 -0.2095423 0.9898682 0 -0.1419897 0.9985036 0 -0.05468724 0.9976375 0 -0.06869963 1 0 0 1 0 0 0.9998763 0 -0.01573392 0.9999615 0 -0.008786165 1 0 0 1 0 0 0.9999605 0 -0.008890393 0.9998763 0 -0.01573392 0.9998763 0 -0.01573392 0.9999605 0 -0.008890393 0.9992217 0 -0.03944677 0.9984008 0 -0.05653317 0.9999615 0 -0.008786165 0.9998763 0 -0.01573392 0.9984008 0 -0.05653317 0.998789 0 -0.04919976 0.9997205 0 -0.02364418 0.9999563 0 -0.009355343 0.9999573 0 -0.009244259 0.9992384 0 -0.03902161 0.9999563 0 -0.009355343 0.999998 0 -0.002034228 0.999994 0 -0.003481855 0.9999573 0 -0.009244259 0.9999573 0 -0.009244259 0.999994 0 -0.003481855 0.9999942 0 -0.003418558 0.9999683 0 -0.007955873 0.9992384 0 -0.03902161 0.9999573 0 -0.009244259 0.9999683 0 -0.007955873 0.9998602 0 -0.01671891 1 0 0 1 0 0 0.9999986 0 -0.001705798 0.9999998 0 7.55137e-4 1 0 0 1 0 0 1 0 1.70264e-4 0.9999986 0 -0.001705798 0.9999986 0 -0.001705798 1 0 1.70264e-4 0.9999942 0 -0.003418558 0.999994 0 -0.003481855 0.9999998 0 7.55137e-4 0.9999986 0 -0.001705798 0.999994 0 -0.003481855 0.999998 0 -0.002034228 1 0 0 0.9999931 0 -0.003720547 0.9999989 0 -0.001557592 1 0 0 0.9999931 0 -0.003720547 0.9998602 0 -0.01671891 0.9999683 0 -0.007955873 0.9999989 0 -0.001557592 0.9999989 0 -0.001557592 0.9999683 0 -0.007955873 0.9999942 0 -0.003418558 1 0 1.70264e-4 1 0 0 0.9999989 0 -0.001557592 1 0 1.70264e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9971551 0 -0.07537879 0.9998636 0 -0.01651822 0.9997278 0 -0.02333157 0.9995693 0 -0.02934863 0.9998636 0 -0.01651822 0.9968192 0 -0.07969621 0.9982024 0 -0.05993467 0.9997278 0 -0.02333157 0.9997278 0 -0.02333157 0.9982024 0 -0.05993467 0.9995824 0 -0.02890092 0.9999373 0 -0.01120408 0.9995693 0 -0.02934863 0.9997278 0 -0.02333157 0.9999373 0 -0.01120408 0.9998775 0 -0.0156583 0.9488423 0 -0.3157502 0.9777997 0 -0.2095423 0.9932089 0 -0.1163445 0.9682209 0 -0.2500966 0.9777997 0 -0.2095423 0.9976375 0 -0.06869963 0.9984893 0 -0.0549458 0.9932089 0 -0.1163445 0.9932089 0 -0.1163445 0.9984893 0 -0.0549458 0.9995824 0 -0.02890092 0.9982024 0 -0.05993467 0.9682209 0 -0.2500966 0.9932089 0 -0.1163445 0.9982024 0 -0.05993467 0.9968192 0 -0.07969621 1 0 0 0.999994 0 -0.003495484 0.9999294 0 -0.01188431 0.9999191 0 -0.01272224 0.999994 0 -0.003495484 0.9998775 0 -0.0156583 0.9999373 0 -0.01120408 0.9999294 0 -0.01188431 0.9999294 0 -0.01188431 0.9999373 0 -0.01120408 0.9995824 0 -0.02890092 0.9984893 0 -0.0549458 0.9999191 0 -0.01272224 0.9999294 0 -0.01188431 0.9984893 0 -0.0549458 0.9976375 0 -0.06869963 0.9997205 0 -0.02364418 0.9998437 0 0.01768042 0.999959 0 0.009056239 0.9999563 0 -0.009355343 0.9998437 0 0.01768042 0.9994308 0 -0.03373863 0.9998175 0 -0.01910842 0.999959 0 0.009056239 0.999959 0 0.009056239 0.9998175 0 -0.01910842 0.9999666 0 -0.008174766 0.9999995 0 0.001118384 0.9999563 0 -0.009355343 0.999959 0 0.009056239 0.9999995 0 0.001118384 0.999998 0 -0.002034228 0.9971551 0 -0.07537879 0.9975643 0 -0.06975251 0.998804 0 -0.04889586 0.9969847 0 -0.07759924 0.9975643 0 -0.06975251 0.999365 0 -0.03563067 0.9997048 0 -0.02430147 0.998804 0 -0.04889586 0.998804 0 -0.04889586 0.9997048 0 -0.02430147 0.9999666 0 -0.008174766 0.9998175 0 -0.01910842 0.9969847 0 -0.07759924 0.998804 0 -0.04889586 0.9998175 0 -0.01910842 0.9994308 0 -0.03373863 1 0 0 0.9999998 0 7.55137e-4 0.9999912 0 -0.00419169 0.9999531 0 -0.00968658 0.9999998 0 7.55137e-4 0.999998 0 -0.002034228 0.9999995 0 0.001118384 0.9999912 0 -0.00419169 0.9999912 0 -0.00419169 0.9999995 0 0.001118384 0.9999666 0 -0.008174766 0.9997048 0 -0.02430147 0.9999531 0 -0.00968658 0.9999912 0 -0.00419169 0.9997048 0 -0.02430147 0.999365 0 -0.03563067 0.8612105 0 0.5082486 0.8197213 0 0.5727627 0.927919 0 0.372782 0.9853895 0 0.1703164 0.8197213 0 0.5727627 0.9462435 0 0.3234554 0.9742262 0 0.2255734 0.927919 0 0.372782 0.927919 0 0.372782 0.9742262 0 0.2255734 0.9907354 0 0.1358066 0.9894009 0 0.14521 0.9853895 0 0.1703164 0.927919 0 0.372782 0.9894009 0 0.14521 0.9968737 0 0.07901165 1 0 0 1 0 0 0.999415 0 0.03420085 0.9980719 0 0.06206933 1 0 0 1 0 0 0.999597 0 0.02839207 0.999415 0 0.03420085 0.999415 0 0.03420085 0.999597 0 0.02839207 0.9907354 0 0.1358066 0.9742262 0 0.2255734 0.9980719 0 0.06206933 0.999415 0 0.03420085 0.9742262 0 0.2255734 0.9462435 0 0.3234554 1 0 0 0.9998987 0 0.01423926 0.9994871 0 0.03202475 1 0 0 0.9998987 0 0.01423926 0.9968737 0 0.07901165 0.9894009 0 0.14521 0.9994871 0 0.03202475 0.9994871 0 0.03202475 0.9894009 0 0.14521 0.9907354 0 0.1358066 0.999597 0 0.02839207 1 0 0 0.9994871 0 0.03202475 0.999597 0 0.02839207 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.956946 0 -0.2902664 0.980602 0 -0.1960097 0.9948674 0 -0.1011878 0.9787934 0 -0.2048499 0.980602 0 -0.1960097 0.9955674 0 -0.09405134 0.9986198 0 -0.05252254 0.9948674 0 -0.1011878 0.9948674 0 -0.1011878 0.9986198 0 -0.05252254 0.9996846 0 -0.02511343 0.9989564 0 -0.04567518 0.9787934 0 -0.2048499 0.9948674 0 -0.1011878 0.9989564 0 -0.04567518 0.9981334 0 -0.06107299 0.9885438 0 0.1509346 0.9979624 0 0.06380657 0.9999964 0 0.002677112 0.9999223 0 -0.01247436 0.9979624 0 0.06380657 0.9996051 0 0.02810519 0.9999974 0 0.002317897 0.9999964 0 0.002677112 0.9999964 0 0.002677112 0.9999974 0 0.002317897 0.9996846 0 -0.02511343 0.9986198 0 -0.05252254 0.9999223 0 -0.01247436 0.9999964 0 0.002677112 0.9986198 0 -0.05252254 0.9955674 0 -0.09405134 1 0 0 0.9999407 0 -0.01089329 0.9999205 0 -0.01261439 0.9999899 0 0.004516639 0.9999407 0 -0.01089329 0.9981334 0 -0.06107299 0.9989564 0 -0.04567518 0.9999205 0 -0.01261439 0.9999205 0 -0.01261439 0.9989564 0 -0.04567518 0.9996846 0 -0.02511343 0.9999974 0 0.002317897 0.9999899 0 0.004516639 0.9999205 0 -0.01261439 0.9999974 0 0.002317897 0.9996051 0 0.02810519 1 0 0 0.9999146 0 -0.01306835 0.9998592 0 -0.016785 1 0 0 0.9999146 0 -0.01306835 0.998063 0 -0.06221207 0.9981574 0 -0.0606786 0.9998592 0 -0.016785 0.9998592 0 -0.016785 0.9981574 0 -0.0606786 0.9995656 0 -0.02947526 0.9999854 0 -0.005407081 1 0 0 0.9998592 0 -0.016785 0.9999854 0 -0.005407081 1 0 0 0.9917024 0 -0.1285557 0.9994749 0 -0.03240218 0.9951473 0 -0.09839641 0.9882494 0 -0.1528505 0.9994749 0 -0.03240218 0.9999222 0 -0.01247638 0.9996815 0 -0.02523888 0.9951473 0 -0.09839641 0.9951473 0 -0.09839641 0.9996815 0 -0.02523888 0.9995656 0 -0.02947526 0.9981574 0 -0.0606786 0.9882494 0 -0.1528505 0.9951473 0 -0.09839641 0.9981574 0 -0.0606786 0.998063 0 -0.06221207 1 0 0 1 0 0 0.9999862 0 -0.005264882 0.9999972 0 -0.002386416 1 0 0 1 0 0 0.9999854 0 -0.005407081 0.9999862 0 -0.005264882 0.9999862 0 -0.005264882 0.9999854 0 -0.005407081 0.9995656 0 -0.02947526 0.9996815 0 -0.02523888 0.9999972 0 -0.002386416 0.9999862 0 -0.005264882 0.9996815 0 -0.02523888 0.9999222 0 -0.01247638 1 0 0 0.9999972 0 -0.002386416 0.999951 0 -0.009897891 0.9999737 0 -0.007261987 0.9999972 0 -0.002386416 0.9999222 0 -0.01247638 0.9999552 0 -0.009463662 0.999951 0 -0.009897891 0.999951 0 -0.009897891 0.9999552 0 -0.009463662 0.9993803 0 -0.03520222 0.9990057 0 -0.04458265 0.9999737 0 -0.007261987 0.999951 0 -0.009897891 0.9990057 0 -0.04458265 0.9991446 0 -0.04135562 0.9917024 0 -0.1285557 0.999857 0 -0.01691237 0.9998127 0 -0.01935517 0.9994749 0 -0.03240218 0.999857 0 -0.01691237 0.9988826 0 -0.04726131 0.9980373 0 -0.06262266 0.9998127 0 -0.01935517 0.9998127 0 -0.01935517 0.9980373 0 -0.06262266 0.9993803 0 -0.03520222 0.9999552 0 -0.009463662 0.9994749 0 -0.03240218 0.9998127 0 -0.01935517 0.9999552 0 -0.009463662 0.9999222 0 -0.01247638 0.9731337 0 -0.230241 0.988885 0 -0.148683 0.989327 0 -0.1457132 0.9893934 0 -0.1452608 0.988885 0 -0.148683 0.9991446 0 -0.04135562 0.9990057 0 -0.04458265 0.989327 0 -0.1457132 0.989327 0 -0.1457132 0.9990057 0 -0.04458265 0.9993803 0 -0.03520222 0.9980373 0 -0.06262266 0.9893934 0 -0.1452608 0.989327 0 -0.1457132 0.9980373 0 -0.06262266 0.9988826 0 -0.04726131 1 0 0 0.9999999 0 4.50786e-4 0.9998229 0 0.01882199 0.9999415 0 0.01081705 0.9999999 0 4.50786e-4 0.9999979 0 0.002037802 0.9998758 0 0.01576643 0.9998229 0 0.01882199 0.9998229 0 0.01882199 0.9998758 0 0.01576643 0.9979558 0 0.06390873 0.9969008 0 0.07866924 0.9999415 0 0.01081705 0.9998229 0 0.01882199 0.9969008 0 0.07866924 0.9977942 0 0.06638525 0.9999478 0 0.01021776 0.9998789 0 0.01556546 0.9996461 0 0.02660682 0.9999931 0 0.003702975 0.9998789 0 0.01556546 0.9967013 0 0.08115847 0.9961851 0 0.08726533 0.9996461 0 0.02660682 0.9996461 0 0.02660682 0.9961851 0 0.08726533 0.9979558 0 0.06390873 0.9998758 0 0.01576643 0.9999931 0 0.003702975 0.9996461 0 0.02660682 0.9998758 0 0.01576643 0.9999979 0 0.002037802 0.8256889 0 0.5641258 0.9444481 0 0.3286607 0.980675 0 0.1956437 0.983116 0 0.1829831 0.9444481 0 0.3286607 0.9977942 0 0.06638525 0.9969008 0 0.07866924 0.980675 0 0.1956437 0.980675 0 0.1956437 0.9969008 0 0.07866924 0.9979558 0 0.06390873 0.9961851 0 0.08726533 0.983116 0 0.1829831 0.980675 0 0.1956437 0.9961851 0 0.08726533 0.9967013 0 0.08115847 1 0 0 1 0 0 0.9998129 0 -0.01934607 0.9961911 0 -0.08719739 1 0 0 1 0 0 0.9999731 0 -0.007335529 0.9998129 0 -0.01934607 0.9998129 0 -0.01934607 0.9999731 0 -0.007335529 0.9999695 0 -0.007815386 0.9970005 0 -0.07739615 0.9961911 0 -0.08719739 0.9998129 0 -0.01934607 0.9970005 0 -0.07739615 0.9935758 0 -0.113169 1 0 0 0.9999415 0 0.01081705 0.9999833 0 0.005786121 1 0 0 0.9999415 0 0.01081705 0.9977942 0 0.06638525 0.999626 0 0.02734738 0.9999833 0 0.005786121 0.9999833 0 0.005786121 0.999626 0 0.02734738 0.9999695 0 -0.007815386 0.9999731 0 -0.007335529 1 0 0 0.9999833 0 0.005786121 0.9999731 0 -0.007335529 1 0 0 0.8256889 0 0.5641258 0.9297804 0 0.3681149 0.9996561 0 0.02622621 0.9444481 0 0.3286607 0.9297804 0 0.3681149 0.9935758 0 -0.113169 0.9970005 0 -0.07739615 0.9996561 0 0.02622621 0.9996561 0 0.02622621 0.9970005 0 -0.07739615 0.9999695 0 -0.007815386 0.999626 0 0.02734738 0.9444481 0 0.3286607 0.9996561 0 0.02622621 0.999626 0 0.02734738 0.9977942 0 0.06638525 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9993879 0 -0.0349854 0.9998521 0 -0.01720511 1 0 0 1 0 0 0.9995718 0 -0.02926249 0.9993879 0 -0.0349854 0.9993879 0 -0.0349854 0.9995718 0 -0.02926249 0.9888885 0 -0.1486595 0.9880644 0 -0.1540415 0.9998521 0 -0.01720511 0.9993879 0 -0.0349854 0.9880644 0 -0.1540415 0.9963452 0 -0.085418 1 0 0 0.9968695 0 -0.07906574 0.9984676 0 -0.05534012 1 0 0 0.9968695 0 -0.07906574 0.9533986 0 -0.3017139 0.9643192 0 -0.2647426 0.9984676 0 -0.05534012 0.9984676 0 -0.05534012 0.9643192 0 -0.2647426 0.9888885 0 -0.1486595 0.9995718 0 -0.02926249 1 0 0 0.9984676 0 -0.05534012 0.9995718 0 -0.02926249 1 0 0 0.861209 0 -0.5082511 0.9848082 0 -0.1736461 0.9229361 0 -0.3849533 0.8124579 0 -0.58302 0.9848082 0 -0.1736461 0.9963452 0 -0.085418 0.9880644 0 -0.1540415 0.9229361 0 -0.3849533 0.9229361 0 -0.3849533 0.9880644 0 -0.1540415 0.9888885 0 -0.1486595 0.9643192 0 -0.2647426 0.8124579 0 -0.58302 0.9229361 0 -0.3849533 0.9643192 0 -0.2647426 0.9533986 0 -0.3017139 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999988 0 0.001604998 0.9999933 0 0.003694845 1 0 0 1 0 0 1 0 0 0.9999988 0 0.001604998 0.9999988 0 0.001604998 1 0 0 0.9999929 0 0.003764092 0.999968 0 0.008000696 0.9999933 0 0.003694845 0.9999988 0 0.001604998 0.999968 0 0.008000696 0.9998628 0 0.01656768 1 0 0 0.9999998 0 7.32999e-4 0.9999995 0 0.001035211 1 0 0 0.9999998 0 7.32999e-4 0.9999982 0 0.001917653 0.9999957 0 0.002936383 0.9999995 0 0.001035211 0.9999995 0 0.001035211 0.9999957 0 0.002936383 0.9999929 0 0.003764092 1 0 0 1 0 0 0.9999995 0 0.001035211 1 0 0 1 0 0 0.9997205 0 0.02364572 0.9992465 0 0.03881273 0.9999558 0 0.009411626 0.9999569 0 0.009289494 0.9992465 0 0.03881273 0.9998628 0 0.01656768 0.999968 0 0.008000696 0.9999558 0 0.009411626 0.9999558 0 0.009411626 0.999968 0 0.008000696 0.9999929 0 0.003764092 0.9999957 0 0.002936383 0.9999569 0 0.009289494 0.9999558 0 0.009411626 0.9999957 0 0.002936383 0.9999982 0 0.001917653 1 0 0 0.9999933 0 0.003694845 1 0 0 0.9999977 0 0.002170801 0.9999933 0 0.003694845 0.9998628 0 0.01656768 0.9999214 0 0.01254247 1 0 0 1 0 0 0.9999214 0 0.01254247 0.9999935 0 -0.003625993 0.9999728 0 -0.007376252 0.9999977 0 0.002170801 1 0 0 0.9999728 0 -0.007376252 0.9999647 0 0.008412337 0.9997205 0 0.02364572 0.998049 0 0.06243647 0.9995109 0 0.03127499 0.9992465 0 0.03881273 0.998049 0 0.06243647 0.9999413 0 0.01083988 0.9999995 0 0.001106734 0.9995109 0 0.03127499 0.9995109 0 0.03127499 0.9999995 0 0.001106734 0.9999935 0 -0.003625993 0.9999214 0 0.01254247 0.9992465 0 0.03881273 0.9995109 0 0.03127499 0.9999214 0 0.01254247 0.9998628 0 0.01656768 0.9998224 0 0.01884948 0.9993821 0 0.03515046 0.9996004 0 -0.02826943 0.9987415 0 -0.05015384 0.9993821 0 0.03515046 0.9999647 0 0.008412337 0.9999728 0 -0.007376252 0.9996004 0 -0.02826943 0.9996004 0 -0.02826943 0.9999728 0 -0.007376252 0.9999935 0 -0.003625993 0.9999995 0 0.001106734 0.9987415 0 -0.05015384 0.9996004 0 -0.02826943 0.9999995 0 0.001106734 0.9999413 0 0.01083988 1 0 0 0.9999103 0 0.0133935 0.9999241 0 0.01232725 0.9999947 0 0.003254384 0.9999103 0 0.0133935 0.9975302 0 0.0702402 0.9984024 0 0.05650305 0.9999241 0 0.01232725 0.9999241 0 0.01232725 0.9984024 0 0.05650305 0.9995644 0 0.02951246 0.9999397 0 0.01098393 0.9999947 0 0.003254384 0.9999241 0 0.01232725 0.9999397 0 0.01098393 0.9998865 0 0.0150712 0.948842 0 0.3157516 0.9682223 0 0.2500916 0.9930838 0 0.1174086 0.9776296 0 0.2103342 0.9682223 0 0.2500916 0.9968194 0 0.07969458 0.9981703 0 0.06046714 0.9930838 0 0.1174086 0.9930838 0 0.1174086 0.9981703 0 0.06046714 0.9995644 0 0.02951246 0.9984024 0 0.05650305 0.9776296 0 0.2103342 0.9930838 0 0.1174086 0.9984024 0 0.05650305 0.9975302 0 0.0702402 0.9971544 0 0.07538645 0.9995745 0 0.02917207 0.9997278 0 0.02333119 0.9998636 0 0.01651818 0.9995745 0 0.02917207 0.9998865 0 0.0150712 0.9999397 0 0.01098393 0.9997278 0 0.02333119 0.9997278 0 0.02333119 0.9999397 0 0.01098393 0.9995644 0 0.02951246 0.9981703 0 0.06046714 0.9998636 0 0.01651818 0.9997278 0 0.02333119 0.9981703 0 0.06046714 0.9968194 0 0.07969458 1 0 0 0.999989 0 -0.004704821 0.9999106 0 0.01337453 0.9999306 0 0.01178601 0.999989 0 -0.004704821 0.9995892 0 -0.02866144 0.9999973 0 -0.002343369 0.9999106 0 0.01337453 0.9999106 0 0.01337453 0.9999973 0 -0.002343369 0.9996656 0 0.02586008 0.9988744 0 0.04743311 0.9999306 0 0.01178601 0.9999106 0 0.01337453 0.9988744 0 0.04743311 0.9979274 0 0.0643495 0.9885435 0 -0.1509368 0.9999223 0 0.01247599 0.9999963 0 -0.002729666 0.997941 0 -0.06413933 0.9999223 0 0.01247599 0.9955677 0 0.09404837 0.9985916 0 0.053055 0.9999963 0 -0.002729666 0.9999963 0 -0.002729666 0.9985916 0 0.053055 0.9996656 0 0.02586008 0.9999973 0 -0.002343369 0.997941 0 -0.06413933 0.9999963 0 -0.002729666 0.9999973 0 -0.002343369 0.9995892 0 -0.02866144 0.9569483 0 0.2902583 0.978144 0 0.2079288 0.9947051 0 0.1027707 0.9806018 0 0.1960107 0.978144 0 0.2079288 0.9979274 0 0.0643495 0.9988744 0 0.04743311 0.9947051 0 0.1027707 0.9947051 0 0.1027707 0.9988744 0 0.04743311 0.9996656 0 0.02586008 0.9985916 0 0.053055 0.9806018 0 0.1960107 0.9947051 0 0.1027707 0.9985916 0 0.053055 0.9955677 0 0.09404837 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999614 0 0.008789162 0.9998763 0 0.0157372 1 0 0 0.9999614 0 0.008789162 0.9987887 0 0.04920477 0.9983996 0 0.05655326 0.9998763 0 0.0157372 0.9998763 0 0.0157372 0.9983996 0 0.05655326 0.999216 0 0.03959174 0.9999601 0 0.00893602 1 0 0 0.9998763 0 0.0157372 0.9999601 0 0.00893602 1 0 0 0.948842 0 0.3157516 0.9776296 0 0.2103342 0.9898447 0 0.142153 0.9923642 0 0.1233421 0.9776296 0 0.2103342 0.9975302 0 0.0702402 0.9984764 0 0.05518143 0.9898447 0 0.142153 0.9898447 0 0.142153 0.9984764 0 0.05518143 0.999216 0 0.03959174 0.9983996 0 0.05655326 0.9923642 0 0.1233421 0.9898447 0 0.142153 0.9983996 0 0.05655326 0.9987887 0 0.04920477 1 0 0 1 0 0 0.999923 0 0.01241508 0.9999103 0 0.0133935 1 0 0 1 0 0 0.9999601 0 0.00893602 0.999923 0 0.01241508 0.999923 0 0.01241508 0.9999601 0 0.00893602 0.999216 0 0.03959174 0.9984764 0 0.05518143 0.9999103 0 0.0133935 0.999923 0 0.01241508 0.9984764 0 0.05518143 0.9975302 0 0.0702402 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 -5.33087e-4 0.9999999 0 -4.51713e-4 1 0 0 0.9999999 0 -5.33087e-4 0.9999977 0 -0.002152293 0.9999983 0 -0.001824791 0.9999999 0 -4.51713e-4 0.9999999 0 -4.51713e-4 0.9999983 0 -0.001824791 0.9999992 0 -0.001313756 1 0 -2.50289e-4 1 0 0 0.9999999 0 -4.51713e-4 1 0 -2.50289e-4 1 0 0 0.9999864 0 -0.005236506 0.999992 0 -0.004019373 0.9999911 0 -0.004238221 0.9999881 0 -0.004887269 0.999992 0 -0.004019373 0.9999985 0 -0.001776527 0.9999976 0 -0.002250664 0.9999911 0 -0.004238221 0.9999911 0 -0.004238221 0.9999976 0 -0.002250664 0.9999992 0 -0.001313756 0.9999983 0 -0.001824791 0.9999881 0 -0.004887269 0.9999911 0 -0.004238221 0.9999983 0 -0.001824791 0.9999977 0 -0.002152293 1 0 0 1 0 0 0.9999998 0 -6.49922e-4 0.9999999 0 -3.56052e-4 1 0 0 1 0 0 1 0 -2.50289e-4 0.9999998 0 -6.49922e-4 0.9999998 0 -6.49922e-4 1 0 -2.50289e-4 0.9999992 0 -0.001313756 0.9999976 0 -0.002250664 0.9999999 0 -3.56052e-4 0.9999998 0 -6.49922e-4 0.9999976 0 -0.002250664 0.9999985 0 -0.001776527 0.9903629 0 0.1384972 0.9963297 0 0.0855996 0.9961852 0 0.08726531 0.9959286 0 0.0901459 0.9963297 0 0.0855996 0.9996109 0 0.02789461 0.9993152 0 0.03700142 0.9961852 0 0.08726531 0.9961852 0 0.08726531 0.9993152 0 0.03700142 0.9997755 0 0.02119409 0.999632 0 0.02713043 0.9959286 0 0.0901459 0.9961852 0 0.08726531 0.999632 0 0.02713043 0.9996761 0 0.02545225 0.9953135 0 0.09670113 0.9997645 0 0.02170251 0.9999328 0 0.01159913 0.9999486 0 0.01014546 0.9997645 0 0.02170251 0.9999633 0 0.008568086 0.9999816 0 0.006068662 0.9999328 0 0.01159913 0.9999328 0 0.01159913 0.9999816 0 0.006068662 0.9997755 0 0.02119409 0.9993152 0 0.03700142 0.9999486 0 0.01014546 0.9999328 0 0.01159913 0.9993152 0 0.03700142 0.9996109 0 0.02789461 1 0 0 0.9999896 0 0.004584417 0.9999801 0 0.006322442 0.9999986 0 0.001681681 0.9999896 0 0.004584417 0.9996761 0 0.02545225 0.999632 0 0.02713043 0.9999801 0 0.006322442 0.9999801 0 0.006322442 0.999632 0 0.02713043 0.9997755 0 0.02119409 0.9999816 0 0.006068662 0.9999986 0 0.001681681 0.9999801 0 0.006322442 0.9999816 0 0.006068662 0.9999633 0 0.008568086 0.9999864 0 -0.005236506 0.9999881 0 -0.004887269 0.9999963 0 -0.002713794 0.9999983 0 -0.001914318 0.9999881 0 -0.004887269 0.9999977 0 -0.002152293 0.9999986 0 -0.001704479 0.9999963 0 -0.002713794 0.9999963 0 -0.002713794 0.9999986 0 -0.001704479 0.9999996 0 -9.28324e-4 0.9999989 0 -0.001496306 0.9999983 0 -0.001914318 0.9999963 0 -0.002713794 0.9999989 0 -0.001496306 0.9999994 0 -0.001090618 1 0 0 1 0 0 0.9999999 0 -4.05155e-4 0.9999999 0 -5.33087e-4 1 0 0 1 0 0 1 0 -2.23674e-4 0.9999999 0 -4.05155e-4 0.9999999 0 -4.05155e-4 1 0 -2.23674e-4 0.9999996 0 -9.28324e-4 0.9999986 0 -0.001704479 0.9999999 0 -5.33087e-4 0.9999999 0 -4.05155e-4 0.9999986 0 -0.001704479 0.9999977 0 -0.002152293 1 0 0 1 0 -2.65888e-4 0.9999999 0 -3.86003e-4 1 0 0 1 0 -2.65888e-4 0.9999994 0 -0.001090618 0.9999989 0 -0.001496306 0.9999999 0 -3.86003e-4 0.9999999 0 -3.86003e-4 0.9999989 0 -0.001496306 0.9999996 0 -9.28324e-4 1 0 -2.23674e-4 1 0 0 0.9999999 0 -3.86003e-4 1 0 -2.23674e-4 1 0 0 0.8915598 0 -0.4529031 0.9937388 0 -0.1117279 0.9925383 0 -0.1219336 0.9744936 0 -0.2244154 0.9937388 0 -0.1117279 0.9987776 0 -0.04942876 0.9980846 0 -0.06186442 0.9925383 0 -0.1219336 0.9925383 0 -0.1219336 0.9980846 0 -0.06186442 0.9993488 0 -0.03608206 0.9987919 0 -0.04914018 0.9744936 0 -0.2244154 0.9925383 0 -0.1219336 0.9987919 0 -0.04914018 0.9991677 0 -0.04078956 0.9999864 0 -0.005236506 0.9999983 0 -0.001914318 0.9998589 0 -0.01680462 0.9999542 0 -0.009578011 0.9999983 0 -0.001914318 0.9999994 0 -0.001090618 0.9999719 0 -0.007502062 0.9998589 0 -0.01680462 0.9998589 0 -0.01680462 0.9999719 0 -0.007502062 0.9993488 0 -0.03608206 0.9980846 0 -0.06186442 0.9999542 0 -0.009578011 0.9998589 0 -0.01680462 0.9980846 0 -0.06186442 0.9987776 0 -0.04942876 1 0 0 0.9999755 0 -0.007011718 0.9999275 0 -0.01204879 1 0 -2.65888e-4 0.9999755 0 -0.007011718 0.9991677 0 -0.04078956 0.9987919 0 -0.04914018 0.9999275 0 -0.01204879 0.9999275 0 -0.01204879 0.9987919 0 -0.04914018 0.9993488 0 -0.03608206 0.9999719 0 -0.007502062 1 0 -2.65888e-4 0.9999275 0 -0.01204879 0.9999719 0 -0.007502062 0.9999994 0 -0.001090618 1 0 0 1 0 0 0.9999195 0 0.0126921 0.9999486 0 0.01014964 1 0 0 1 0 0 0.999992 0 0.004022893 0.9999195 0 0.0126921 0.9999195 0 0.0126921 0.999992 0 0.004022893 0.9997695 0 0.02147346 0.9989708 0 0.04535878 0.9999486 0 0.01014964 0.9999195 0 0.0126921 0.9989708 0 0.04535878 0.9988422 0 0.04810827 1 0 0 0.9999986 0 0.001681681 0.9999927 0 0.003814196 1 0 0 0.9999986 0 0.001681681 0.9999633 0 0.008568086 0.9998422 0 0.0177724 0.9999927 0 0.003814196 0.9999927 0 0.003814196 0.9998422 0 0.0177724 0.9997695 0 0.02147346 0.999992 0 0.004022893 1 0 0 0.9999927 0 0.003814196 0.999992 0 0.004022893 1 0 0 0.9953135 0 0.09670113 0.9929238 0 0.1187534 0.9973388 0 0.07290695 0.9997645 0 0.02170251 0.9929238 0 0.1187534 0.9988422 0 0.04810827 0.9989708 0 0.04535878 0.9973388 0 0.07290695 0.9973388 0 0.07290695 0.9989708 0 0.04535878 0.9997695 0 0.02147346 0.9998422 0 0.0177724 0.9997645 0 0.02170251 0.9973388 0 0.07290695 0.9998422 0 0.0177724 0.9999633 0 0.008568086 1 0 0 0.99999 0 -0.004469936 0.999992 0 -0.004008527 1 0 0 0.99999 0 -0.004469936 0.9998127 0 -0.01935158 0.9998606 0 -0.01669956 0.999992 0 -0.004008527 0.999992 0 -0.004008527 0.9998606 0 -0.01669956 0.9999068 0 -0.01365273 0.999994 0 -0.003473983 1 0 0 0.999992 0 -0.004008527 0.999994 0 -0.003473983 1 0 0 0.9986292 0 -0.05234277 0.999333 0 -0.03652204 0.9992619 0 -0.03841768 0.9989399 0 -0.04603522 0.999333 0 -0.03652204 0.9998488 0 -0.01738962 0.9998258 0 -0.01866669 0.9992619 0 -0.03841768 0.9992619 0 -0.03841768 0.9998258 0 -0.01866669 0.9999068 0 -0.01365273 0.9998606 0 -0.01669956 0.9989399 0 -0.04603522 0.9992619 0 -0.03841768 0.9998606 0 -0.01669956 0.9998127 0 -0.01935158 1 0 0 1 0 0 0.9999809 0 -0.006183764 0.9999936 0 -0.003588727 1 0 0 1 0 0 0.999994 0 -0.003473983 0.9999809 0 -0.006183764 0.9999809 0 -0.006183764 0.999994 0 -0.003473983 0.9999068 0 -0.01365273 0.9998258 0 -0.01866669 0.9999936 0 -0.003588727 0.9999809 0 -0.006183764 0.9998258 0 -0.01866669 0.9998488 0 -0.01738962 1 0 0 0.9999737 0 -0.007261987 0.9999465 0 -0.01034283 0.9999968 0 -0.002538716 0.9999737 0 -0.007261987 0.9991446 0 -0.04135562 0.9991722 0 -0.04068071 0.9999465 0 -0.01034283 0.9999465 0 -0.01034283 0.9991722 0 -0.04068071 0.9995939 0 -0.02849708 0.9999668 0 -0.008153651 0.9999968 0 -0.002538716 0.9999465 0 -0.01034283 0.9999668 0 -0.008153651 0.9999325 0 -0.01162213 0.9731337 0 -0.230241 0.996372 0 -0.08510547 0.9944767 0 -0.1049578 0.988885 0 -0.148683 0.996372 0 -0.08510547 0.9992844 0 -0.0378249 0.9988095 0 -0.04878226 0.9944767 0 -0.1049578 0.9944767 0 -0.1049578 0.9988095 0 -0.04878226 0.9995939 0 -0.02849708 0.9991722 0 -0.04068071 0.988885 0 -0.148683 0.9944767 0 -0.1049578 0.9991722 0 -0.04068071 0.9991446 0 -0.04135562 0.9986292 0 -0.05234277 0.9997281 0 -0.0233232 0.9998813 0 -0.01540957 0.9999269 0 -0.01209398 0.9997281 0 -0.0233232 0.9999325 0 -0.01162213 0.9999668 0 -0.008153651 0.9998813 0 -0.01540957 0.9998813 0 -0.01540957 0.9999668 0 -0.008153651 0.9995939 0 -0.02849708 0.9988095 0 -0.04878226 0.9999269 0 -0.01209398 0.9998813 0 -0.01540957 0.9988095 0 -0.04878226 0.9992844 0 -0.0378249 1 0 0 1 0 0 0.9999974 0 0.00230262 0.9999985 0 0.001740953 1 0 0 1 0 0 0.9999991 0 0.001370949 0.9999974 0 0.00230262 0.9999974 0 0.00230262 0.9999991 0 0.001370949 0.9999849 0 0.005510198 0.9999595 0 0.009007226 0.9999985 0 0.001740953 0.9999974 0 0.00230262 0.9999595 0 0.009007226 0.9999734 0 0.007300028 1 0 0 0.9999949 0 0.003203754 0.9999971 0 0.002445051 1 0 0 0.9999949 0 0.003203754 0.999921 0 0.01257554 0.999949 0 0.0101017 0.9999971 0 0.002445051 0.9999971 0 0.002445051 0.999949 0 0.0101017 0.9999849 0 0.005510198 0.9999991 0 0.001370949 1 0 0 0.9999971 0 0.002445051 0.9999991 0 0.001370949 1 0 0 0.999674 0 0.02553311 0.9998189 0 0.0190323 0.9998675 0 0.01628379 0.9996066 0 0.02804896 0.9998189 0 0.0190323 0.9999734 0 0.007300028 0.9999595 0 0.009007226 0.9998675 0 0.01628379 0.9998675 0 0.01628379 0.9999595 0 0.009007226 0.9999849 0 0.005510198 0.999949 0 0.0101017 0.9996066 0 0.02804896 0.9998675 0 0.01628379 0.999949 0 0.0101017 0.999921 0 0.01257554 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998538 0 0.01709893 0.9996735 0 0.02555545 1 0 0 0.9998538 0 0.01709893 0.9950761 0 0.0991145 0.9936184 0 0.1127943 0.9996735 0 0.02555545 0.9996735 0 0.02555545 0.9936184 0 0.1127943 0.9973556 0 0.07267673 0.9998813 0 0.01541196 1 0 0 0.9996735 0 0.02555545 0.9998813 0 0.01541196 1 0 0 0.8569036 0 0.5154767 0.9313654 0 0.3640859 0.9643486 0 0.2646356 0.9689422 0 0.2472876 0.9313654 0 0.3640859 0.9898983 0 0.1417799 0.9916855 0 0.1286854 0.9643486 0 0.2646356 0.9643486 0 0.2646356 0.9916855 0 0.1286854 0.9973556 0 0.07267673 0.9936184 0 0.1127943 0.9689422 0 0.2472876 0.9643486 0 0.2646356 0.9936184 0 0.1127943 0.9950761 0 0.0991145 1 0 0 1 0 0 0.9995954 0 0.02844393 0.9994623 0 0.03278953 1 0 0 1 0 0 0.9998813 0 0.01541196 0.9995954 0 0.02844393 0.9995954 0 0.02844393 0.9998813 0 0.01541196 0.9973556 0 0.07267673 0.9916855 0 0.1286854 0.9994623 0 0.03278953 0.9995954 0 0.02844393 0.9916855 0 0.1286854 0.9898983 0 0.1417799 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999899 0 0.004516639 0.9999526 0 0.00974202 0.9999977 0 -0.002139653 0.9999899 0 0.004516639 0.9996051 0 0.02810519 0.9986285 0 0.05235559 0.9999526 0 0.00974202 0.9999526 0 0.00974202 0.9986285 0 0.05235559 0.9996012 0 0.02824117 0.9999202 0 -0.01263789 0.9999977 0 -0.002139653 0.9999526 0 0.00974202 0.9999202 0 -0.01263789 0.9999653 0 -0.008337745 0.9885438 0 0.1509346 0.9872226 0 0.1593474 0.9921626 0 0.1249541 0.9979624 0 0.06380657 0.9872226 0 0.1593474 0.9998746 0 0.01584279 0.9993395 0 0.03634009 0.9921626 0 0.1249541 0.9921626 0 0.1249541 0.9993395 0 0.03634009 0.9996012 0 0.02824117 0.9986285 0 0.05235559 0.9979624 0 0.06380657 0.9921626 0 0.1249541 0.9986285 0 0.05235559 0.9996051 0 0.02810519 0.9998223 0 -0.01885246 0.9993828 0 -0.03513055 0.9995067 0 -0.03140763 0.9966726 0 -0.08150942 0.9993828 0 -0.03513055 0.9999653 0 -0.008337745 0.9999202 0 -0.01263789 0.9995067 0 -0.03140763 0.9995067 0 -0.03140763 0.9999202 0 -0.01263789 0.9996012 0 0.02824117 0.9993395 0 0.03634009 0.9966726 0 -0.08150942 0.9995067 0 -0.03140763 0.9993395 0 0.03634009 0.9998746 0 0.01584279 0.9998223 0 -0.01885246 0.9987414 0 0.05015728 0.9995991 0 0.02831446 0.9993828 0 -0.03513055 0.9987414 0 0.05015728 0.9999413 0 -0.01083615 0.9999995 0 -0.001112761 0.9995991 0 0.02831446 0.9995991 0 0.02831446 0.9999995 0 -0.001112761 0.9999932 0 0.003702482 0.9999724 0 0.007434376 0.9993828 0 -0.03513055 0.9995991 0 0.02831446 0.9999724 0 0.007434376 0.9999653 0 -0.008337745 0.9997205 0 -0.02364418 0.9992384 0 -0.03902161 0.9995068 0 -0.03140209 0.9980493 0 -0.06243265 0.9992384 0 -0.03902161 0.9998602 0 -0.01671891 0.9999205 0 -0.01261238 0.9995068 0 -0.03140209 0.9995068 0 -0.03140209 0.9999205 0 -0.01261238 0.9999932 0 0.003702482 0.9999995 0 -0.001112761 0.9980493 0 -0.06243265 0.9995068 0 -0.03140209 0.9999995 0 -0.001112761 0.9999413 0 -0.01083615 1 0 0 0.9999977 0 -0.002139653 1 0 0 0.9999931 0 -0.003720547 0.9999977 0 -0.002139653 0.9999653 0 -0.008337745 0.9999724 0 0.007434376 1 0 0 1 0 0 0.9999724 0 0.007434376 0.9999932 0 0.003702482 0.9999205 0 -0.01261238 0.9999931 0 -0.003720547 1 0 0 0.9999205 0 -0.01261238 0.9998602 0 -0.01671891 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999872 0 -0.005071994 0.999994 0 -0.003495484 1 0 0 1 0 0 0.9999977 0 -0.002155935 0.9999872 0 -0.005071994 0.9999872 0 -0.005071994 0.9999977 0 -0.002155935 0.9999437 0 -0.0106208 0.9998256 0 -0.01867935 0.999994 0 -0.003495484 0.9999872 0 -0.005071994 0.9998256 0 -0.01867935 0.9998775 0 -0.0156583 1 0 0 0.9999531 0 -0.00968658 0.9999874 0 -0.005045506 1 0 0 0.9999531 0 -0.00968658 0.999365 0 -0.03563067 0.9997512 0 -0.02231117 0.9999874 0 -0.005045506 0.9999874 0 -0.005045506 0.9997512 0 -0.02231117 0.9999437 0 -0.0106208 0.9999977 0 -0.002155935 1 0 0 0.9999874 0 -0.005045506 0.9999977 0 -0.002155935 1 0 0 0.9971551 0 -0.07537879 0.9995693 0 -0.02934863 0.9993179 0 -0.03693008 0.9975643 0 -0.06975251 0.9995693 0 -0.02934863 0.9998775 0 -0.0156583 0.9998256 0 -0.01867935 0.9993179 0 -0.03693008 0.9993179 0 -0.03693008 0.9998256 0 -0.01867935 0.9999437 0 -0.0106208 0.9997512 0 -0.02231117 0.9975643 0 -0.06975251 0.9993179 0 -0.03693008 0.9997512 0 -0.02231117 0.999365 0 -0.03563067 1 0 0 0.9994623 0 0.03278953 0.9996012 0 0.028236 0.9998987 0 0.01423926 0.9994623 0 0.03278953 0.9898983 0 0.1417799 0.9928861 0 0.119068 0.9996012 0 0.028236 0.9996012 0 0.028236 0.9928861 0 0.119068 0.9943933 0 0.1057458 0.9991403 0 0.04145976 0.9998987 0 0.01423926 0.9996012 0 0.028236 0.9991403 0 0.04145976 0.9968737 0 0.07901165 0.8569036 0 0.5154767 0.9308724 0 0.3653444 0.9734192 0 0.2290305 0.9313654 0 0.3640859 0.9308724 0 0.3653444 0.991725 0 0.1283806 0.9893873 0 0.1453022 0.9734192 0 0.2290305 0.9734192 0 0.2290305 0.9893873 0 0.1453022 0.9943933 0 0.1057458 0.9928861 0 0.119068 0.9313654 0 0.3640859 0.9734192 0 0.2290305 0.9928861 0 0.119068 0.9898983 0 0.1417799 0.8612105 0 0.5082486 0.9853895 0 0.1703164 0.9978014 0 0.06627577 0.9985633 0 0.05358382 0.9853895 0 0.1703164 0.9968737 0 0.07901165 0.9991403 0 0.04145976 0.9978014 0 0.06627577 0.9978014 0 0.06627577 0.9991403 0 0.04145976 0.9943933 0 0.1057458 0.9893873 0 0.1453022 0.9985633 0 0.05358382 0.9978014 0 0.06627577 0.9893873 0 0.1453022 0.991725 0 0.1283806 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999676 0 -0.008053748 0.9999407 0 -0.01089329 1 0 0 1 0 0 0.9999987 0 -0.001653624 0.9999676 0 -0.008053748 0.9999676 0 -0.008053748 0.9999987 0 -0.001653624 0.9996907 0 -0.02487139 0.9988094 0 -0.04878436 0.9999407 0 -0.01089329 0.9999676 0 -0.008053748 0.9988094 0 -0.04878436 0.9981334 0 -0.06107299 1 0 0 0.9999999 0 -5.87369e-4 0.9999915 0 -0.004149772 1 0 0 0.9999999 0 -5.87369e-4 0.9999999 0 -5.73042e-4 0.9993691 0 -0.03551552 0.9999915 0 -0.004149772 0.9999915 0 -0.004149772 0.9993691 0 -0.03551552 0.9996907 0 -0.02487139 0.9999987 0 -0.001653624 1 0 0 0.9999915 0 -0.004149772 0.9999987 0 -0.001653624 1 0 0 0.956946 0 -0.2902664 0.9787934 0 -0.2048499 0.9814388 0 -0.191776 0.9963413 0 -0.08546415 0.9787934 0 -0.2048499 0.9981334 0 -0.06107299 0.9988094 0 -0.04878436 0.9814388 0 -0.191776 0.9814388 0 -0.191776 0.9988094 0 -0.04878436 0.9996907 0 -0.02487139 0.9993691 0 -0.03551552 0.9963413 0 -0.08546415 0.9814388 0 -0.191776 0.9993691 0 -0.03551552 0.9999999 0 -5.73042e-4</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape5-texbinormals-array" count="3072" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape5-vertices" name="qt_gauge_background_Shape5-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape5-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape5-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape5-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape5-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="1536">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape5-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape5-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape5-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape5-texbinormals" offset="2" set="0"/>
+ <p>45 45 0 609 609 1 614 614 3 614 614 3 609 609 1 225 225 2 609 609 4 113 113 5 225 225 7 225 225 7 113 113 5 417 417 6 225 225 8 417 417 9 419 419 11 419 419 11 417 417 9 161 49 10 614 614 12 225 225 13 115 115 15 115 115 15 225 225 13 419 419 14 48 48 16 611 611 17 610 610 19 610 610 19 611 611 17 226 226 18 611 611 20 114 114 21 226 226 23 226 226 23 114 114 21 418 418 22 226 226 24 418 418 25 417 417 27 417 417 27 418 418 25 161 49 26 610 610 28 226 226 29 113 113 31 113 113 31 226 226 29 417 417 30 46 46 32 613 613 33 612 612 35 612 612 35 613 613 33 227 227 34 115 115 37 419 419 38 613 613 36 613 613 36 419 419 38 227 227 39 419 419 41 161 49 42 227 227 40 227 227 40 161 49 42 418 418 43 227 227 45 418 418 46 612 612 44 612 612 44 418 418 46 114 114 47 29 29 48 615 615 49 620 620 51 620 620 51 615 615 49 228 228 50 615 615 52 116 116 53 228 228 55 228 228 55 116 116 53 420 420 54 228 228 56 420 420 57 422 422 59 422 422 59 420 420 57 162 50 58 228 228 61 422 422 62 620 620 60 620 620 60 422 422 62 118 118 63 617 617 65 229 229 66 28 28 64 28 28 64 229 229 66 616 616 67 117 117 69 421 421 70 617 617 68 617 617 68 421 421 70 229 229 71 421 421 73 162 50 74 229 229 72 229 229 72 162 50 74 420 420 75 229 229 77 420 420 78 616 616 76 616 616 76 420 420 78 116 116 79 27 27 80 619 619 81 618 618 83 618 618 83 619 619 81 230 230 82 619 619 84 118 118 85 230 230 87 230 230 87 118 118 85 422 422 86 230 230 88 422 422 89 421 421 91 421 421 91 422 422 89 162 50 90 618 618 92 230 230 93 117 117 95 117 117 95 230 230 93 421 421 94 24 24 96 621 621 97 626 626 99 626 626 99 621 621 97 231 231 98 621 621 100 119 119 101 231 231 103 231 231 103 119 119 101 423 423 102 423 423 105 163 51 106 231 231 104 231 231 104 163 51 106 425 425 107 231 231 109 425 425 110 626 626 108 626 626 108 425 425 110 121 121 111 623 623 113 232 232 114 13 13 112 13 13 112 232 232 114 622 622 115 120 120 117 424 424 118 623 623 116 623 623 116 424 424 118 232 232 119 424 424 121 163 51 122 232 232 120 232 232 120 163 51 122 423 423 123 232 232 125 423 423 126 622 622 124 622 622 124 423 423 126 119 119 127 11 11 128 625 625 129 624 624 131 624 624 131 625 625 129 233 233 130 625 625 132 121 121 133 233 233 135 233 233 135 121 121 133 425 425 134 233 233 136 425 425 137 424 424 139 424 424 139 425 425 137 163 51 138 624 624 140 233 233 141 120 120 143 120 120 143 233 233 141 424 424 142 21 21 144 627 627 145 630 630 147 630 630 147 627 627 145 234 234 146 627 627 148 122 122 149 234 234 151 234 234 151 122 122 149 426 426 150 234 234 152 426 426 153 428 428 155 428 428 155 426 426 153 164 52 154 630 630 156 234 234 157 123 123 159 123 123 159 234 234 157 428 428 158 13 13 160 622 622 161 628 628 163 628 628 163 622 622 161 235 235 162 622 622 164 119 119 165 235 235 167 235 235 167 119 119 165 427 427 166 427 427 169 164 52 170 235 235 168 235 235 168 164 52 170 426 426 171 235 235 173 426 426 174 628 628 172 628 628 172 426 426 174 122 122 175 629 629 177 236 236 178 24 24 176 24 24 176 236 236 178 621 621 179 123 123 181 428 428 182 629 629 180 629 629 180 428 428 182 236 236 183 428 428 185 164 52 186 236 236 184 236 236 184 164 52 186 427 427 187 236 236 189 427 427 190 621 621 188 621 621 188 427 427 190 119 119 191 19 19 192 631 631 193 636 636 195 636 636 195 631 631 193 237 237 194 631 631 196 124 124 197 237 237 199 237 237 199 124 124 197 429 429 198 237 237 200 429 429 201 431 431 203 431 431 203 429 429 201 165 53 202 636 636 204 237 237 205 126 126 207 126 126 207 237 237 205 431 431 206 633 633 209 238 238 210 17 17 208 17 17 208 238 238 210 632 632 211 125 125 213 430 430 214 633 633 212 633 633 212 430 430 214 238 238 215 430 430 217 165 53 218 238 238 216 238 238 216 165 53 218 429 429 219 238 238 221 429 429 222 632 632 220 632 632 220 429 429 222 124 124 223 15 15 224 635 635 225 634 634 227 634 634 227 635 635 225 239 239 226 126 126 229 431 431 230 635 635 228 635 635 228 431 431 230 239 239 231 431 431 233 165 53 234 239 239 232 239 239 232 165 53 234 430 430 235 634 634 236 239 239 237 125 125 239 125 125 239 239 239 237 430 430 238 5 5 240 637 637 241 642 642 243 642 642 243 637 637 241 240 240 242 637 637 244 127 127 245 240 240 247 240 240 247 127 127 245 432 432 246 240 240 248 432 432 249 434 434 251 434 434 251 432 432 249 166 54 250 642 642 252 240 240 253 129 129 255 129 129 255 240 240 253 434 434 254 639 639 257 241 241 258 14 14 256 14 14 256 241 241 258 638 638 259 128 128 261 433 433 262 639 639 260 639 639 260 433 433 262 241 241 263 433 433 265 166 54 266 241 241 264 241 241 264 166 54 266 432 432 267 241 241 269 432 432 270 638 638 268 638 638 268 432 432 270 127 127 271 17 17 272 641 641 273 640 640 275 640 640 275 641 641 273 242 242 274 129 129 277 434 434 278 641 641 276 641 641 276 434 434 278 242 242 279 434 434 281 166 54 282 242 242 280 242 242 280 166 54 282 433 433 283 640 640 284 242 242 285 128 128 287 128 128 287 242 242 285 433 433 286 16 16 288 643 643 289 648 648 291 648 648 291 643 643 289 243 243 290 643 643 292 130 130 293 243 243 295 243 243 295 130 130 293 435 435 294 243 243 296 435 435 297 437 437 299 437 437 299 435 435 297 167 55 298 648 648 300 243 243 301 132 132 303 132 132 303 243 243 301 437 437 302 645 645 305 244 244 306 18 18 304 18 18 304 244 244 306 644 644 307 131 131 309 436 436 310 645 645 308 645 645 308 436 436 310 244 244 311 436 436 313 167 55 314 244 244 312 244 244 312 167 55 314 435 435 315 244 244 317 435 435 318 644 644 316 644 644 316 435 435 318 130 130 319 19 19 320 647 647 321 646 646 323 646 646 323 647 647 321 245 245 322 647 647 324 132 132 325 245 245 327 245 245 327 132 132 325 437 437 326 437 437 329 167 55 330 245 245 328 245 245 328 167 55 330 436 436 331 646 646 332 245 245 333 131 131 335 131 131 335 245 245 333 436 436 334 16 16 336 648 648 337 652 652 339 652 652 339 648 648 337 246 246 338 648 648 340 132 132 341 246 246 343 246 246 343 132 132 341 438 438 342 246 246 344 438 438 345 440 440 347 440 440 347 438 438 345 168 56 346 652 652 348 246 246 349 134 134 351 134 134 351 246 246 349 440 440 350 649 649 353 247 247 354 19 19 352 19 19 352 247 247 354 647 647 355 133 133 357 439 439 358 649 649 356 649 649 356 439 439 358 247 247 359 439 439 361 168 56 362 247 247 360 247 247 360 168 56 362 438 438 363 247 247 365 438 438 366 647 647 364 647 647 364 438 438 366 132 132 367 20 20 368 651 651 369 650 650 371 650 650 371 651 651 369 248 248 370 134 134 373 440 440 374 651 651 372 651 651 372 440 440 374 248 248 375 440 440 377 168 56 378 248 248 376 248 248 376 168 56 378 439 439 379 650 650 380 248 248 381 133 133 383 133 133 383 248 248 381 439 439 382 22 22 384 653 653 385 658 658 387 658 658 387 653 653 385 249 249 386 653 653 388 135 135 389 249 249 391 249 249 391 135 135 389 441 441 390 249 249 392 441 441 393 443 443 395 443 443 395 441 441 393 169 57 394 658 658 396 249 249 397 137 137 399 137 137 399 249 249 397 443 443 398 21 21 400 655 655 401 654 654 403 654 654 403 655 655 401 250 250 402 655 655 404 136 136 405 250 250 407 250 250 407 136 136 405 442 442 406 250 250 408 442 442 409 441 441 411 441 441 411 442 442 409 169 57 410 654 654 412 250 250 413 135 135 415 135 135 415 250 250 413 441 441 414 657 657 417 251 251 418 23 23 416 23 23 416 251 251 418 656 656 419 137 137 421 443 443 422 657 657 420 657 657 420 443 443 422 251 251 423 443 443 425 169 57 426 251 251 424 251 251 424 169 57 426 442 442 427 251 251 429 442 442 430 656 656 428 656 656 428 442 442 430 136 136 431 658 658 433 252 252 434 22 22 432 22 22 432 252 252 434 662 662 435 137 137 437 444 444 438 658 658 436 658 658 436 444 444 438 252 252 439 444 444 441 170 58 442 252 252 440 252 252 440 170 58 442 446 446 443 252 252 445 446 446 446 662 662 444 662 662 444 446 446 446 139 139 447 23 23 448 659 659 449 657 657 451 657 657 451 659 659 449 253 253 450 138 138 453 445 445 454 659 659 452 659 659 452 445 445 454 253 253 455 445 445 457 170 58 458 253 253 456 253 253 456 170 58 458 444 444 459 657 657 460 253 253 461 137 137 463 137 137 463 253 253 461 444 444 462 17 17 464 661 661 465 660 660 467 660 660 467 661 661 465 254 254 466 661 661 468 139 139 469 254 254 471 254 254 471 139 139 469 446 446 470 254 254 472 446 446 473 445 445 475 445 445 475 446 446 473 170 58 474 660 660 476 254 254 477 138 138 479 138 138 479 254 254 477 445 445 478 17 17 480 660 660 481 666 666 483 666 666 483 660 660 481 255 255 482 660 660 484 138 138 485 255 255 487 255 255 487 138 138 485 447 447 486 255 255 488 447 447 489 449 449 491 449 449 491 447 447 489 171 59 490 666 666 492 255 255 493 141 141 495 141 141 495 255 255 493 449 449 494 23 23 496 663 663 497 659 659 499 659 659 499 663 663 497 256 256 498 663 663 500 140 140 501 256 256 503 256 256 503 140 140 501 448 448 502 448 448 505 171 59 506 256 256 504 256 256 504 171 59 506 447 447 507 256 256 509 447 447 510 659 659 508 659 659 508 447 447 510 138 138 511 24 24 512 665 665 513 664 664 515 664 664 515 665 665 513 257 257 514 665 665 516 141 141 517 257 257 519 257 257 519 141 141 517 449 449 518 257 257 520 449 449 521 448 448 523 448 448 523 449 449 521 171 59 522 664 664 524 257 257 525 140 140 527 140 140 527 257 257 525 448 448 526 20 20 528 667 667 529 672 672 531 672 672 531 667 667 529 258 258 530 667 667 532 142 142 533 258 258 535 258 258 535 142 142 533 450 450 534 258 258 536 450 450 537 452 452 539 452 452 539 450 450 537 172 60 538 672 672 540 258 258 541 144 144 543 144 144 543 258 258 541 452 452 542 669 669 545 259 259 546 15 15 544 15 15 544 259 259 546 668 668 547 143 143 549 451 451 550 669 669 548 669 669 548 451 451 550 259 259 551 451 451 553 172 60 554 259 259 552 259 259 552 172 60 554 450 450 555 259 259 557 450 450 558 668 668 556 668 668 556 450 450 558 142 142 559 25 25 560 671 671 561 670 670 563 670 670 563 671 671 561 260 260 562 144 144 565 452 452 566 671 671 564 671 671 564 452 452 566 260 260 567 452 452 569 172 60 570 260 260 568 260 260 568 172 60 570 451 451 571 670 670 572 260 260 573 143 143 575 143 143 575 260 260 573 451 451 574 11 11 576 673 673 577 676 676 579 676 676 579 673 673 577 261 261 578 673 673 580 145 145 581 261 261 583 261 261 583 145 145 581 453 453 582 261 261 584 453 453 585 455 455 587 455 455 587 453 453 585 173 61 586 261 261 589 455 455 590 676 676 588 676 676 588 455 455 590 146 146 591 618 618 593 262 262 594 27 27 592 27 27 592 262 262 594 674 674 595 117 117 597 454 454 598 618 618 596 618 618 596 454 454 598 262 262 599 454 454 601 173 61 602 262 262 600 262 262 600 173 61 602 453 453 603 262 262 605 453 453 606 674 674 604 674 674 604 453 453 606 145 145 607 28 28 608 675 675 609 617 617 611 617 617 611 675 675 609 263 263 610 675 675 612 146 146 613 263 263 615 263 263 615 146 146 613 455 455 614 263 263 616 455 455 617 454 454 619 454 454 619 455 455 617 173 61 618 617 617 620 263 263 621 117 117 623 117 117 623 263 263 621 454 454 622 10 10 624 677 677 625 682 682 627 682 682 627 677 677 625 264 264 626 677 677 628 147 147 629 264 264 631 264 264 631 147 147 629 456 456 630 264 264 632 456 456 633 458 458 635 458 458 635 456 456 633 174 62 634 682 682 636 264 264 637 149 149 639 149 149 639 264 264 637 458 458 638 25 25 640 679 679 641 678 678 643 678 678 643 679 679 641 265 265 642 679 679 644 148 148 645 265 265 647 265 265 647 148 148 645 457 457 646 457 457 649 174 62 650 265 265 648 265 265 648 174 62 650 456 456 651 265 265 653 456 456 654 678 678 652 678 678 652 456 456 654 147 147 655 28 28 656 681 681 657 680 680 659 680 680 659 681 681 657 266 266 658 149 149 661 458 458 662 681 681 660 681 681 660 458 458 662 266 266 663 458 458 665 174 62 666 266 266 664 266 266 664 174 62 666 457 457 667 680 680 668 266 266 669 148 148 671 148 148 671 266 266 669 457 457 670 29 29 672 683 683 673 688 688 675 688 688 675 683 683 673 267 267 674 683 683 676 150 150 677 267 267 679 267 267 679 150 150 677 459 459 678 267 267 680 459 459 681 461 461 683 461 461 683 459 459 681 175 63 682 688 688 684 267 267 685 152 152 687 152 152 687 267 267 685 461 461 686 685 685 689 268 268 690 1 1 688 1 1 688 268 268 690 684 684 691 151 151 693 460 460 694 685 685 692 685 685 692 460 460 694 268 268 695 460 460 697 175 63 698 268 268 696 268 268 696 175 63 698 459 459 699 268 268 701 459 459 702 684 684 700 684 684 700 459 459 702 150 150 703 6 6 704 687 687 705 686 686 707 686 686 707 687 687 705 269 269 706 152 152 709 461 461 710 687 687 708 687 687 708 461 461 710 269 269 711 461 461 713 175 63 714 269 269 712 269 269 712 175 63 714 460 460 715 686 686 716 269 269 717 151 151 719 151 151 719 269 269 717 460 460 718 30 30 720 689 689 721 694 694 723 694 694 723 689 689 721 270 270 722 689 689 724 153 153 725 270 270 727 270 270 727 153 153 725 462 462 726 270 270 728 462 462 729 464 464 731 464 464 731 462 462 729 176 64 730 694 694 732 270 270 733 155 155 735 155 155 735 270 270 733 464 464 734 691 691 737 271 271 738 35 35 736 35 35 736 271 271 738 690 690 739 154 154 741 463 463 742 691 691 740 691 691 740 463 463 742 271 271 743 463 463 745 176 64 746 271 271 744 271 271 744 176 64 746 462 462 747 271 271 749 462 462 750 690 690 748 690 690 748 462 462 750 153 153 751 34 34 752 693 693 753 692 692 755 692 692 755 693 693 753 272 272 754 155 155 757 464 464 758 693 693 756 693 693 756 464 464 758 272 272 759 464 464 761 176 64 762 272 272 760 272 272 760 176 64 762 463 463 763 692 692 764 272 272 765 154 154 767 154 154 767 272 272 765 463 463 766 32 32 768 695 695 769 700 700 771 700 700 771 695 695 769 273 273 770 695 695 772 156 156 773 273 273 775 273 273 775 156 156 773 465 465 774 273 273 776 465 465 777 467 467 779 467 467 779 465 465 777 177 65 778 700 700 780 273 273 781 158 158 783 158 158 783 273 273 781 467 467 782 697 697 785 274 274 786 34 34 784 34 34 784 274 274 786 696 696 787 157 157 789 466 466 790 697 697 788 697 697 788 466 466 790 274 274 791 466 466 793 177 65 794 274 274 792 274 274 792 177 65 794 465 465 795 274 274 797 465 465 798 696 696 796 696 696 796 465 465 798 156 156 799 29 29 800 699 699 801 698 698 803 698 698 803 699 699 801 275 275 802 158 158 805 467 467 806 699 699 804 699 699 804 467 467 806 275 275 807 467 467 809 177 65 810 275 275 808 275 275 808 177 65 810 466 466 811 275 275 813 466 466 814 698 698 812 698 698 812 466 466 814 157 157 815 701 701 817 276 276 818 33 33 816 33 33 816 276 276 818 706 706 819 701 701 820 159 159 821 276 276 823 276 276 823 159 159 821 468 468 822 468 468 825 178 66 826 276 276 824 276 276 824 178 66 826 470 470 827 276 276 829 470 470 830 706 706 828 706 706 828 470 470 830 49 161 831 703 703 833 277 277 834 9 9 832 9 9 832 277 277 834 702 702 835 160 160 837 469 469 838 703 703 836 703 703 836 469 469 838 277 277 839 469 469 841 178 66 842 277 277 840 277 277 840 178 66 842 468 468 843 277 277 845 468 468 846 702 702 844 702 702 844 468 468 846 159 159 847 29 29 848 705 705 849 704 704 851 704 704 851 705 705 849 278 278 850 705 705 852 49 161 853 278 278 855 278 278 855 49 161 853 470 470 854 278 278 856 470 470 857 469 469 859 469 469 859 470 470 857 178 66 858 704 704 860 278 278 861 160 160 863 160 160 863 278 278 861 469 469 862 31 31 864 707 707 865 712 712 867 712 712 867 707 707 865 279 279 866 707 707 868 50 162 869 279 279 871 279 279 871 50 162 869 471 471 870 471 471 873 179 67 874 279 279 872 279 279 872 179 67 874 473 473 875 279 279 877 473 473 878 712 712 876 712 712 876 473 473 878 52 164 879 709 709 881 280 280 882 33 33 880 33 33 880 280 280 882 708 708 883 51 163 885 472 472 886 709 709 884 709 709 884 472 472 886 280 280 887 472 472 889 179 67 890 280 280 888 280 280 888 179 67 890 471 471 891 280 280 893 471 471 894 708 708 892 708 708 892 471 471 894 50 162 895 34 34 896 711 711 897 710 710 899 710 710 899 711 711 897 281 281 898 711 711 900 52 164 901 281 281 903 281 281 903 52 164 901 473 473 902 281 281 904 473 473 905 472 472 907 472 472 907 473 473 905 179 67 906 710 710 908 281 281 909 51 163 911 51 163 911 281 281 909 472 472 910 47 47 912 713 713 913 718 718 915 718 718 915 713 713 913 282 282 914 713 713 916 53 165 917 282 282 919 282 282 919 53 165 917 474 474 918 474 474 921 180 68 922 282 282 920 282 282 920 180 68 922 476 476 923 282 282 925 476 476 926 718 718 924 718 718 924 476 476 926 55 167 927 715 715 929 283 283 930 38 38 928 38 38 928 283 283 930 714 714 931 54 166 933 475 475 934 715 715 932 715 715 932 475 475 934 283 283 935 475 475 937 180 68 938 283 283 936 283 283 936 180 68 938 474 474 939 283 283 941 474 474 942 714 714 940 714 714 940 474 474 942 53 165 943 35 35 944 717 717 945 716 716 947 716 716 947 717 717 945 284 284 946 717 717 948 55 167 949 284 284 951 284 284 951 55 167 949 476 476 950 284 284 952 476 476 953 475 475 955 475 475 955 476 476 953 180 68 954 716 716 956 284 284 957 54 166 959 54 166 959 284 284 957 475 475 958 42 42 960 719 719 961 724 724 963 724 724 963 719 719 961 285 285 962 719 719 964 56 168 965 285 285 967 285 285 967 56 168 965 477 477 966 285 285 968 477 477 969 479 479 971 479 479 971 477 477 969 181 69 970 724 724 972 285 285 973 58 170 975 58 170 975 285 285 973 479 479 974 721 721 977 286 286 978 37 37 976 37 37 976 286 286 978 720 720 979 57 169 981 478 478 982 721 721 980 721 721 980 478 478 982 286 286 983 478 478 985 181 69 986 286 286 984 286 286 984 181 69 986 477 477 987 286 286 989 477 477 990 720 720 988 720 720 988 477 477 990 56 168 991 31 31 992 723 723 993 722 722 995 722 722 995 723 723 993 287 287 994 58 170 997 479 479 998 723 723 996 723 723 996 479 479 998 287 287 999 287 287 1000 479 479 1001 478 478 1003 478 478 1003 479 479 1001 181 69 1002 722 722 1004 287 287 1005 57 169 1007 57 169 1007 287 287 1005 478 478 1006 44 44 1008 725 725 1009 730 730 1011 730 730 1011 725 725 1009 288 288 1010 725 725 1012 59 171 1013 288 288 1015 288 288 1015 59 171 1013 480 480 1014 480 480 1017 182 70 1018 288 288 1016 288 288 1016 182 70 1018 482 482 1019 288 288 1021 482 482 1022 730 730 1020 730 730 1020 482 482 1022 61 173 1023 43 43 1024 727 727 1025 726 726 1027 726 726 1027 727 727 1025 289 289 1026 60 172 1029 481 481 1030 727 727 1028 727 727 1028 481 481 1030 289 289 1031 481 481 1033 182 70 1034 289 289 1032 289 289 1032 182 70 1034 480 480 1035 726 726 1036 289 289 1037 59 171 1039 59 171 1039 289 289 1037 480 480 1038 41 41 1040 729 729 1041 728 728 1043 728 728 1043 729 729 1041 290 290 1042 729 729 1044 61 173 1045 290 290 1047 290 290 1047 61 173 1045 482 482 1046 290 290 1048 482 482 1049 481 481 1051 481 481 1051 482 482 1049 182 70 1050 728 728 1052 290 290 1053 60 172 1055 60 172 1055 290 290 1053 481 481 1054 42 42 1056 731 731 1057 736 736 1059 736 736 1059 731 731 1057 291 291 1058 731 731 1060 62 174 1061 291 291 1063 291 291 1063 62 174 1061 483 483 1062 291 291 1064 483 483 1065 485 485 1067 485 485 1067 483 483 1065 183 71 1066 736 736 1068 291 291 1069 64 176 1071 64 176 1071 291 291 1069 485 485 1070 733 733 1073 292 292 1074 38 38 1072 38 38 1072 292 292 1074 732 732 1075 63 175 1077 484 484 1078 733 733 1076 733 733 1076 484 484 1078 292 292 1079 484 484 1081 183 71 1082 292 292 1080 292 292 1080 183 71 1082 483 483 1083 292 292 1085 483 483 1086 732 732 1084 732 732 1084 483 483 1086 62 174 1087 41 41 1088 735 735 1089 734 734 1091 734 734 1091 735 735 1089 293 293 1090 64 176 1093 485 485 1094 735 735 1092 735 735 1092 485 485 1094 293 293 1095 485 485 1097 183 71 1098 293 293 1096 293 293 1096 183 71 1098 484 484 1099 734 734 1100 293 293 1101 63 175 1103 63 175 1103 293 293 1101 484 484 1102 40 40 1104 737 737 1105 740 740 1107 740 740 1107 737 737 1105 294 294 1106 737 737 1108 65 177 1109 294 294 1111 294 294 1111 65 177 1109 486 486 1110 486 486 1113 184 72 1114 294 294 1112 294 294 1112 184 72 1114 488 488 1115 294 294 1117 488 488 1118 740 740 1116 740 740 1116 488 488 1118 66 178 1119 37 37 1120 720 720 1121 738 738 1123 738 738 1123 720 720 1121 295 295 1122 720 720 1124 56 168 1125 295 295 1127 295 295 1127 56 168 1125 487 487 1126 295 295 1128 487 487 1129 486 486 1131 486 486 1131 487 487 1129 184 72 1130 738 738 1132 295 295 1133 65 177 1135 65 177 1135 295 295 1133 486 486 1134 42 42 1136 739 739 1137 719 719 1139 719 719 1139 739 739 1137 296 296 1138 739 739 1140 66 178 1141 296 296 1143 296 296 1143 66 178 1141 488 488 1142 488 488 1145 184 72 1146 296 296 1144 296 296 1144 184 72 1146 487 487 1147 296 296 1149 487 487 1150 719 719 1148 719 719 1148 487 487 1150 56 168 1151 741 741 1153 297 297 1154 44 44 1152 44 44 1152 297 297 1154 725 725 1155 67 179 1157 489 489 1158 741 741 1156 741 741 1156 489 489 1158 297 297 1159 489 489 1161 185 73 1162 297 297 1160 297 297 1160 185 73 1162 491 491 1163 297 297 1165 491 491 1166 725 725 1164 725 725 1164 491 491 1166 59 171 1167 40 40 1168 743 743 1169 742 742 1171 742 742 1171 743 743 1169 298 298 1170 743 743 1172 68 180 1173 298 298 1175 298 298 1175 68 180 1173 490 490 1174 298 298 1176 490 490 1177 489 489 1179 489 489 1179 490 490 1177 185 73 1178 742 742 1180 298 298 1181 67 179 1183 67 179 1183 298 298 1181 489 489 1182 726 726 1185 299 299 1186 43 43 1184 43 43 1184 299 299 1186 744 744 1187 59 171 1189 491 491 1190 726 726 1188 726 726 1188 491 491 1190 299 299 1191 491 491 1193 185 73 1194 299 299 1192 299 299 1192 185 73 1194 490 490 1195 299 299 1197 490 490 1198 744 744 1196 744 744 1196 490 490 1198 68 180 1199 614 614 1201 300 300 1202 45 45 1200 45 45 1200 300 300 1202 748 748 1203 115 115 1205 492 492 1206 614 614 1204 614 614 1204 492 492 1206 300 300 1207 492 492 1209 186 74 1210 300 300 1208 300 300 1208 186 74 1210 494 494 1211 300 300 1213 494 494 1214 748 748 1212 748 748 1212 494 494 1214 70 182 1215 745 745 1217 301 301 1218 46 46 1216 46 46 1216 301 301 1218 613 613 1219 69 181 1221 493 493 1222 745 745 1220 745 745 1220 493 493 1222 301 301 1223 493 493 1225 186 74 1226 301 301 1224 301 301 1224 186 74 1226 492 492 1227 301 301 1229 492 492 1230 613 613 1228 613 613 1228 492 492 1230 115 115 1231 47 47 1232 747 747 1233 746 746 1235 746 746 1235 747 747 1233 302 302 1234 747 747 1236 70 182 1237 302 302 1239 302 302 1239 70 182 1237 494 494 1238 302 302 1240 494 494 1241 493 493 1243 493 493 1243 494 494 1241 186 74 1242 746 746 1244 302 302 1245 69 181 1247 69 181 1247 302 302 1245 493 493 1246 38 38 1248 714 714 1249 750 750 1251 750 750 1251 714 714 1249 303 303 1250 714 714 1252 53 165 1253 303 303 1255 303 303 1255 53 165 1253 495 495 1254 303 303 1256 495 495 1257 497 497 1259 497 497 1259 495 495 1257 187 75 1258 750 750 1260 303 303 1261 71 183 1263 71 183 1263 303 303 1261 497 497 1262 746 746 1265 304 304 1266 47 47 1264 47 47 1264 304 304 1266 713 713 1267 69 181 1269 496 496 1270 746 746 1268 746 746 1268 496 496 1270 304 304 1271 496 496 1273 187 75 1274 304 304 1272 304 304 1272 187 75 1274 495 495 1275 304 304 1277 495 495 1278 713 713 1276 713 713 1276 495 495 1278 53 165 1279 46 46 1280 749 749 1281 745 745 1283 745 745 1283 749 749 1281 305 305 1282 749 749 1284 71 183 1285 305 305 1287 305 305 1287 71 183 1285 497 497 1286 305 305 1288 497 497 1289 496 496 1291 496 496 1291 497 497 1289 187 75 1290 745 745 1292 305 305 1293 69 181 1295 69 181 1295 305 305 1293 496 496 1294 48 48 1296 751 751 1297 756 756 1299 756 756 1299 751 751 1297 306 306 1298 751 751 1300 72 184 1301 306 306 1303 306 306 1303 72 184 1301 498 498 1302 306 306 1304 498 498 1305 500 500 1307 500 500 1307 498 498 1305 188 76 1306 756 756 1308 306 306 1309 74 186 1311 74 186 1311 306 306 1309 500 500 1310 39 39 1312 753 753 1313 752 752 1315 752 752 1315 753 753 1313 307 307 1314 753 753 1316 73 185 1317 307 307 1319 307 307 1319 73 185 1317 499 499 1318 499 499 1321 188 76 1322 307 307 1320 307 307 1320 188 76 1322 498 498 1323 307 307 1325 498 498 1326 752 752 1324 752 752 1324 498 498 1326 72 184 1327 41 41 1328 755 755 1329 754 754 1331 754 754 1331 755 755 1329 308 308 1330 74 186 1333 500 500 1334 755 755 1332 755 755 1332 500 500 1334 308 308 1335 500 500 1337 188 76 1338 308 308 1336 308 308 1336 188 76 1338 499 499 1339 308 308 1341 499 499 1342 754 754 1340 754 754 1340 499 499 1342 73 185 1343 0 0 1344 757 757 1345 762 762 1347 762 762 1347 757 757 1345 309 309 1346 757 757 1348 75 187 1349 309 309 1351 309 309 1351 75 187 1349 501 501 1350 501 501 1353 189 77 1354 309 309 1352 309 309 1352 189 77 1354 503 503 1355 309 309 1357 503 503 1358 762 762 1356 762 762 1356 503 503 1358 77 189 1359 759 759 1361 310 310 1362 3 3 1360 3 3 1360 310 310 1362 758 758 1363 76 188 1365 502 502 1366 759 759 1364 759 759 1364 502 502 1366 310 310 1367 502 502 1369 189 77 1370 310 310 1368 310 310 1368 189 77 1370 501 501 1371 310 310 1373 501 501 1374 758 758 1372 758 758 1372 501 501 1374 75 187 1375 29 29 1376 761 761 1377 760 760 1379 760 760 1379 761 761 1377 311 311 1378 761 761 1380 77 189 1381 311 311 1383 311 311 1383 77 189 1381 503 503 1382 311 311 1384 503 503 1385 502 502 1387 502 502 1387 503 503 1385 189 77 1386 760 760 1388 311 311 1389 76 188 1391 76 188 1391 311 311 1389 502 502 1390 29 29 1392 760 760 1393 766 766 1395 766 766 1395 760 760 1393 312 312 1394 760 760 1396 76 188 1397 312 312 1399 312 312 1399 76 188 1397 504 504 1398 312 312 1400 504 504 1401 506 506 1403 506 506 1403 504 504 1401 190 78 1402 766 766 1404 312 312 1405 79 191 1407 79 191 1407 312 312 1405 506 506 1406 3 3 1408 763 763 1409 759 759 1411 759 759 1411 763 763 1409 313 313 1410 763 763 1412 78 190 1413 313 313 1415 313 313 1415 78 190 1413 505 505 1414 505 505 1417 190 78 1418 313 313 1416 313 313 1416 190 78 1418 504 504 1419 313 313 1421 504 504 1422 759 759 1420 759 759 1420 504 504 1422 76 188 1423 765 765 1425 314 314 1426 8 8 1424 8 8 1424 314 314 1426 764 764 1427 79 191 1429 506 506 1430 765 765 1428 765 765 1428 506 506 1430 314 314 1431 506 506 1433 190 78 1434 314 314 1432 314 314 1432 190 78 1434 505 505 1435 314 314 1437 505 505 1438 764 764 1436 764 764 1436 505 505 1438 78 190 1439 29 29 1440 620 620 1441 770 770 1443 770 770 1443 620 620 1441 315 315 1442 620 620 1444 118 118 1445 315 315 1447 315 315 1447 118 118 1445 507 507 1446 315 315 1448 507 507 1449 509 509 1451 509 509 1451 507 507 1449 191 79 1450 770 770 1452 315 315 1453 81 193 1455 81 193 1455 315 315 1453 509 509 1454 27 27 1456 767 767 1457 619 619 1459 619 619 1459 767 767 1457 316 316 1458 767 767 1460 80 192 1461 316 316 1463 316 316 1463 80 192 1461 508 508 1462 316 316 1464 508 508 1465 507 507 1467 507 507 1467 508 508 1465 191 79 1466 316 316 1469 507 507 1470 619 619 1468 619 619 1468 507 507 1470 118 118 1471 769 769 1473 317 317 1474 7 7 1472 7 7 1472 317 317 1474 768 768 1475 81 193 1477 509 509 1478 769 769 1476 769 769 1476 509 509 1478 317 317 1479 509 509 1481 191 79 1482 317 317 1480 317 317 1480 191 79 1482 508 508 1483 317 317 1485 508 508 1486 768 768 1484 768 768 1484 508 508 1486 80 192 1487 762 762 1489 318 318 1490 0 0 1488 0 0 1488 318 318 1490 772 772 1491 77 189 1493 510 510 1494 762 762 1492 762 762 1492 510 510 1494 318 318 1495 510 510 1497 192 80 1498 318 318 1496 318 318 1496 192 80 1498 512 512 1499 318 318 1501 512 512 1502 772 772 1500 772 772 1500 512 512 1502 82 194 1503 29 29 1504 770 770 1505 761 761 1507 761 761 1507 770 770 1505 319 319 1506 770 770 1508 81 193 1509 319 319 1511 319 319 1511 81 193 1509 511 511 1510 319 319 1512 511 511 1513 510 510 1515 510 510 1515 511 511 1513 192 80 1514 761 761 1516 319 319 1517 77 189 1519 77 189 1519 319 319 1517 510 510 1518 7 7 1520 771 771 1521 769 769 1523 769 769 1523 771 771 1521 320 320 1522 771 771 1524 82 194 1525 320 320 1527 320 320 1527 82 194 1525 512 512 1526 512 512 1529 192 80 1530 320 320 1528 320 320 1528 192 80 1530 511 511 1531 769 769 1532 320 320 1533 81 193 1535 81 193 1535 320 320 1533 511 511 1534 25 25 1536 670 670 1537 776 776 1539 776 776 1539 670 670 1537 321 321 1538 670 670 1540 143 143 1541 321 321 1543 321 321 1543 143 143 1541 513 513 1542 321 321 1544 513 513 1545 515 515 1547 515 515 1547 513 513 1545 193 81 1546 776 776 1548 321 321 1549 84 196 1551 84 196 1551 321 321 1549 515 515 1550 15 15 1552 773 773 1553 669 669 1555 669 669 1555 773 773 1553 322 322 1554 773 773 1556 83 195 1557 322 322 1559 322 322 1559 83 195 1557 514 514 1558 514 514 1561 193 81 1562 322 322 1560 322 322 1560 193 81 1562 513 513 1563 669 669 1564 322 322 1565 143 143 1567 143 143 1567 322 322 1565 513 513 1566 24 24 1568 775 775 1569 774 774 1571 774 774 1571 775 775 1569 323 323 1570 84 196 1573 515 515 1574 775 775 1572 775 775 1572 515 515 1574 323 323 1575 515 515 1577 193 81 1578 323 323 1576 323 323 1576 193 81 1578 514 514 1579 774 774 1580 323 323 1581 83 195 1583 83 195 1583 323 323 1581 514 514 1582 11 11 1584 777 777 1585 625 625 1587 625 625 1587 777 777 1585 324 324 1586 85 197 1589 516 516 1590 777 777 1588 777 777 1588 516 516 1590 324 324 1591 516 516 1593 194 82 1594 324 324 1592 324 324 1592 194 82 1594 518 518 1595 324 324 1597 518 518 1598 625 625 1596 625 625 1596 518 518 1598 121 121 1599 25 25 1600 776 776 1601 778 778 1603 778 778 1603 776 776 1601 325 325 1602 776 776 1604 84 196 1605 325 325 1607 325 325 1607 84 196 1605 517 517 1606 325 325 1608 517 517 1609 516 516 1611 516 516 1611 517 517 1609 194 82 1610 778 778 1612 325 325 1613 85 197 1615 85 197 1615 325 325 1613 516 516 1614 24 24 1616 626 626 1617 775 775 1619 775 775 1619 626 626 1617 326 326 1618 626 626 1620 121 121 1621 326 326 1623 326 326 1623 121 121 1621 518 518 1622 326 326 1624 518 518 1625 517 517 1627 517 517 1627 518 518 1625 194 82 1626 775 775 1628 326 326 1629 84 196 1631 84 196 1631 326 326 1629 517 517 1630 24 24 1632 664 664 1633 629 629 1635 629 629 1635 664 664 1633 327 327 1634 664 664 1636 140 140 1637 327 327 1639 327 327 1639 140 140 1637 519 519 1638 327 327 1640 519 519 1641 521 521 1643 521 521 1643 519 519 1641 195 83 1642 629 629 1644 327 327 1645 123 123 1647 123 123 1647 327 327 1645 521 521 1646 656 656 1649 328 328 1650 23 23 1648 23 23 1648 328 328 1650 663 663 1651 656 656 1652 136 136 1653 328 328 1655 328 328 1655 136 136 1653 520 520 1654 520 520 1657 195 83 1658 328 328 1656 328 328 1656 195 83 1658 519 519 1659 328 328 1661 519 519 1662 663 663 1660 663 663 1660 519 519 1662 140 140 1663 630 630 1665 329 329 1666 21 21 1664 21 21 1664 329 329 1666 655 655 1667 123 123 1669 521 521 1670 630 630 1668 630 630 1668 521 521 1670 329 329 1671 521 521 1673 195 83 1674 329 329 1672 329 329 1672 195 83 1674 520 520 1675 329 329 1677 520 520 1678 655 655 1676 655 655 1676 520 520 1678 136 136 1679 15 15 1680 668 668 1681 635 635 1683 635 635 1683 668 668 1681 330 330 1682 668 668 1684 142 142 1685 330 330 1687 330 330 1687 142 142 1685 522 522 1686 330 330 1688 522 522 1689 524 524 1691 524 524 1691 522 522 1689 196 84 1690 635 635 1692 330 330 1693 126 126 1695 126 126 1695 330 330 1693 524 524 1694 650 650 1697 331 331 1698 20 20 1696 20 20 1696 331 331 1698 667 667 1699 133 133 1701 523 523 1702 650 650 1700 650 650 1700 523 523 1702 331 331 1703 523 523 1705 196 84 1706 331 331 1704 331 331 1704 196 84 1706 522 522 1707 331 331 1709 522 522 1710 667 667 1708 667 667 1708 522 522 1710 142 142 1711 636 636 1713 332 332 1714 19 19 1712 19 19 1712 332 332 1714 649 649 1715 126 126 1717 524 524 1718 636 636 1716 636 636 1716 524 524 1718 332 332 1719 524 524 1721 196 84 1722 332 332 1720 332 332 1720 196 84 1722 523 523 1723 649 649 1724 332 332 1725 133 133 1727 133 133 1727 332 332 1725 523 523 1726 17 17 1728 632 632 1729 780 780 1731 780 780 1731 632 632 1729 333 333 1730 632 632 1732 124 124 1733 333 333 1735 333 333 1735 124 124 1733 525 525 1734 333 333 1736 525 525 1737 527 527 1739 527 527 1739 525 525 1737 197 85 1738 780 780 1740 333 333 1741 86 198 1743 86 198 1743 333 333 1741 527 527 1742 646 646 1745 334 334 1746 19 19 1744 19 19 1744 334 334 1746 631 631 1747 131 131 1749 526 526 1750 646 646 1748 646 646 1748 526 526 1750 334 334 1751 526 526 1753 197 85 1754 334 334 1752 334 334 1752 197 85 1754 525 525 1755 334 334 1757 525 525 1758 631 631 1756 631 631 1756 525 525 1758 124 124 1759 18 18 1760 779 779 1761 645 645 1763 645 645 1763 779 779 1761 335 335 1762 86 198 1765 527 527 1766 779 779 1764 779 779 1764 527 527 1766 335 335 1767 527 527 1769 197 85 1770 335 335 1768 335 335 1768 197 85 1770 526 526 1771 645 645 1772 335 335 1773 131 131 1775 131 131 1775 335 335 1773 526 526 1774 17 17 1776 780 780 1777 641 641 1779 641 641 1779 780 780 1777 336 336 1778 86 198 1781 528 528 1782 780 780 1780 780 780 1780 528 528 1782 336 336 1783 336 336 1784 528 528 1785 530 530 1787 530 530 1787 528 528 1785 198 86 1786 641 641 1788 336 336 1789 129 129 1791 129 129 1791 336 336 1789 530 530 1790 18 18 1792 781 781 1793 779 779 1795 779 779 1795 781 781 1793 337 337 1794 781 781 1796 87 199 1797 337 337 1799 337 337 1799 87 199 1797 529 529 1798 337 337 1800 529 529 1801 528 528 1803 528 528 1803 529 529 1801 198 86 1802 779 779 1804 337 337 1805 86 198 1807 86 198 1807 337 337 1805 528 528 1806 642 642 1809 338 338 1810 5 5 1808 5 5 1808 338 338 1810 782 782 1811 129 129 1813 530 530 1814 642 642 1812 642 642 1812 530 530 1814 338 338 1815 530 530 1817 198 86 1818 338 338 1816 338 338 1816 198 86 1818 529 529 1819 338 338 1821 529 529 1822 782 782 1820 782 782 1820 529 529 1822 87 199 1823 20 20 1824 783 783 1825 651 651 1827 651 651 1827 783 783 1825 339 339 1826 88 200 1829 531 531 1830 783 783 1828 783 783 1828 531 531 1830 339 339 1831 531 531 1833 199 87 1834 339 339 1832 339 339 1832 199 87 1834 533 533 1835 651 651 1836 339 339 1837 134 134 1839 134 134 1839 339 339 1837 533 533 1838 12 12 1840 785 785 1841 784 784 1843 784 784 1843 785 785 1841 340 340 1842 785 785 1844 89 201 1845 340 340 1847 340 340 1847 89 201 1845 532 532 1846 340 340 1848 532 532 1849 531 531 1851 531 531 1851 532 532 1849 199 87 1850 784 784 1852 340 340 1853 88 200 1855 88 200 1855 340 340 1853 531 531 1854 16 16 1856 652 652 1857 786 786 1859 786 786 1859 652 652 1857 341 341 1858 134 134 1861 533 533 1862 652 652 1860 652 652 1860 533 533 1862 341 341 1863 533 533 1865 199 87 1866 341 341 1864 341 341 1864 199 87 1866 532 532 1867 786 786 1868 341 341 1869 89 201 1871 89 201 1871 341 341 1869 532 532 1870 17 17 1872 640 640 1873 661 661 1875 661 661 1875 640 640 1873 342 342 1874 128 128 1877 534 534 1878 640 640 1876 640 640 1876 534 534 1878 342 342 1879 534 534 1881 200 88 1882 342 342 1880 342 342 1880 200 88 1882 536 536 1883 342 342 1885 536 536 1886 661 661 1884 661 661 1884 536 536 1886 139 139 1887 14 14 1888 787 787 1889 639 639 1891 639 639 1891 787 787 1889 343 343 1890 90 202 1893 535 535 1894 787 787 1892 787 787 1892 535 535 1894 343 343 1895 535 535 1897 200 88 1898 343 343 1896 343 343 1896 200 88 1898 534 534 1899 639 639 1900 343 343 1901 128 128 1903 128 128 1903 343 343 1901 534 534 1902 22 22 1904 662 662 1905 788 788 1907 788 788 1907 662 662 1905 344 344 1906 662 662 1908 139 139 1909 344 344 1911 344 344 1911 139 139 1909 536 536 1910 344 344 1912 536 536 1913 535 535 1915 535 535 1915 536 536 1913 200 88 1914 788 788 1916 344 344 1917 90 202 1919 90 202 1919 344 344 1917 535 535 1918 24 24 1920 774 774 1921 665 665 1923 665 665 1923 774 774 1921 345 345 1922 774 774 1924 83 195 1925 345 345 1927 345 345 1927 83 195 1925 537 537 1926 345 345 1928 537 537 1929 539 539 1931 539 539 1931 537 537 1929 201 89 1930 665 665 1932 345 345 1933 141 141 1935 141 141 1935 345 345 1933 539 539 1934 634 634 1937 346 346 1938 15 15 1936 15 15 1936 346 346 1938 773 773 1939 125 125 1941 538 538 1942 634 634 1940 634 634 1940 538 538 1942 346 346 1943 538 538 1945 201 89 1946 346 346 1944 346 346 1944 201 89 1946 537 537 1947 346 346 1949 537 537 1950 773 773 1948 773 773 1948 537 537 1950 83 195 1951 17 17 1952 666 666 1953 633 633 1955 633 633 1955 666 666 1953 347 347 1954 141 141 1957 539 539 1958 666 666 1956 666 666 1956 539 539 1958 347 347 1959 347 347 1960 539 539 1961 538 538 1963 538 538 1963 539 539 1961 201 89 1962 633 633 1964 347 347 1965 125 125 1967 125 125 1967 347 347 1965 538 538 1966 10 10 1968 789 789 1969 792 792 1971 792 792 1971 789 789 1969 348 348 1970 789 789 1972 91 203 1973 348 348 1975 348 348 1975 91 203 1973 540 540 1974 348 348 1976 540 540 1977 542 542 1979 542 542 1979 540 540 1977 202 90 1978 348 348 1981 542 542 1982 792 792 1980 792 792 1980 542 542 1982 92 204 1983 784 784 1985 349 349 1986 12 12 1984 12 12 1984 349 349 1986 790 790 1987 88 200 1989 541 541 1990 784 784 1988 784 784 1988 541 541 1990 349 349 1991 541 541 1993 202 90 1994 349 349 1992 349 349 1992 202 90 1994 540 540 1995 349 349 1997 540 540 1998 790 790 1996 790 790 1996 540 540 1998 91 203 1999 20 20 2000 791 791 2001 783 783 2003 783 783 2003 791 791 2001 350 350 2002 791 791 2004 92 204 2005 350 350 2007 350 350 2007 92 204 2005 542 542 2006 350 350 2008 542 542 2009 541 541 2011 541 541 2011 542 542 2009 202 90 2010 783 783 2012 350 350 2013 88 200 2015 88 200 2015 350 350 2013 541 541 2014 20 20 2016 672 672 2017 791 791 2019 791 791 2019 672 672 2017 351 351 2018 144 144 2021 543 543 2022 672 672 2020 672 672 2020 543 543 2022 351 351 2023 543 543 2025 203 91 2026 351 351 2024 351 351 2024 203 91 2026 545 545 2027 351 351 2029 545 545 2030 791 791 2028 791 791 2028 545 545 2030 92 204 2031 25 25 2032 678 678 2033 671 671 2035 671 671 2035 678 678 2033 352 352 2034 678 678 2036 147 147 2037 352 352 2039 352 352 2039 147 147 2037 544 544 2038 352 352 2040 544 544 2041 543 543 2043 543 543 2043 544 544 2041 203 91 2042 671 671 2044 352 352 2045 144 144 2047 144 144 2047 352 352 2045 543 543 2046 10 10 2048 792 792 2049 677 677 2051 677 677 2051 792 792 2049 353 353 2050 792 792 2052 92 204 2053 353 353 2055 353 353 2055 92 204 2053 545 545 2054 353 353 2056 545 545 2057 544 544 2059 544 544 2059 545 545 2057 203 91 2058 353 353 2061 544 544 2062 677 677 2060 677 677 2060 544 544 2062 147 147 2063 28 28 2064 680 680 2065 675 675 2067 675 675 2067 680 680 2065 354 354 2066 680 680 2068 148 148 2069 354 354 2071 354 354 2071 148 148 2069 546 546 2070 546 546 2073 204 92 2074 354 354 2072 354 354 2072 204 92 2074 548 548 2075 354 354 2077 548 548 2078 675 675 2076 675 675 2076 548 548 2078 146 146 2079 778 778 2081 355 355 2082 25 25 2080 25 25 2080 355 355 2082 679 679 2083 85 197 2085 547 547 2086 778 778 2084 778 778 2084 547 547 2086 355 355 2087 547 547 2089 204 92 2090 355 355 2088 355 355 2088 204 92 2090 546 546 2091 355 355 2093 546 546 2094 679 679 2092 679 679 2092 546 546 2094 148 148 2095 11 11 2096 676 676 2097 777 777 2099 777 777 2099 676 676 2097 356 356 2098 676 676 2100 146 146 2101 356 356 2103 356 356 2103 146 146 2101 548 548 2102 356 356 2104 548 548 2105 547 547 2107 547 547 2107 548 548 2105 204 92 2106 777 777 2108 356 356 2109 85 197 2111 85 197 2111 356 356 2109 547 547 2110 28 28 2112 793 793 2113 681 681 2115 681 681 2115 793 793 2113 357 357 2114 793 793 2116 93 205 2117 357 357 2119 357 357 2119 93 205 2117 549 549 2118 357 357 2120 549 549 2121 551 551 2123 551 551 2123 549 549 2121 205 93 2122 681 681 2124 357 357 2125 149 149 2127 149 149 2127 357 357 2125 551 551 2126 795 795 2129 358 358 2130 26 26 2128 26 26 2128 358 358 2130 794 794 2131 94 206 2133 550 550 2134 795 795 2132 795 795 2132 550 550 2134 358 358 2135 550 550 2137 205 93 2138 358 358 2136 358 358 2136 205 93 2138 549 549 2139 358 358 2141 549 549 2142 794 794 2140 794 794 2140 549 549 2142 93 205 2143 10 10 2144 682 682 2145 796 796 2147 796 796 2147 682 682 2145 359 359 2146 149 149 2149 551 551 2150 682 682 2148 682 682 2148 551 551 2150 359 359 2151 551 551 2153 205 93 2154 359 359 2152 359 359 2152 205 93 2154 550 550 2155 796 796 2156 359 359 2157 94 206 2159 94 206 2159 359 359 2157 550 550 2158 797 797 2161 360 360 2162 9 9 2160 9 9 2160 360 360 2162 703 703 2163 95 207 2165 552 552 2166 797 797 2164 797 797 2164 552 552 2166 360 360 2167 552 552 2169 206 94 2170 360 360 2168 360 360 2168 206 94 2170 554 554 2171 360 360 2173 554 554 2174 703 703 2172 703 703 2172 554 554 2174 160 160 2175 4 4 2176 799 799 2177 798 798 2179 798 798 2179 799 799 2177 361 361 2178 96 208 2181 553 553 2182 799 799 2180 799 799 2180 553 553 2182 361 361 2183 553 553 2185 206 94 2186 361 361 2184 361 361 2184 206 94 2186 552 552 2187 798 798 2188 361 361 2189 95 207 2191 95 207 2191 361 361 2189 552 552 2190 29 29 2192 704 704 2193 800 800 2195 800 800 2195 704 704 2193 362 362 2194 704 704 2196 160 160 2197 362 362 2199 362 362 2199 160 160 2197 554 554 2198 362 362 2200 554 554 2201 553 553 2203 553 553 2203 554 554 2201 206 94 2202 800 800 2204 362 362 2205 96 208 2207 96 208 2207 362 362 2205 553 553 2206 26 26 2208 794 794 2209 802 802 2211 802 802 2211 794 794 2209 363 363 2210 794 794 2212 93 205 2213 363 363 2215 363 363 2215 93 205 2213 555 555 2214 363 363 2216 555 555 2217 557 557 2219 557 557 2219 555 555 2217 207 95 2218 802 802 2220 363 363 2221 97 209 2223 97 209 2223 363 363 2221 557 557 2222 616 616 2225 364 364 2226 28 28 2224 28 28 2224 364 364 2226 793 793 2227 116 116 2229 556 556 2230 616 616 2228 616 616 2228 556 556 2230 364 364 2231 556 556 2233 207 95 2234 364 364 2232 364 364 2232 207 95 2234 555 555 2235 364 364 2237 555 555 2238 793 793 2236 793 793 2236 555 555 2238 93 205 2239 29 29 2240 801 801 2241 615 615 2243 615 615 2243 801 801 2241 365 365 2242 97 209 2245 557 557 2246 801 801 2244 801 801 2244 557 557 2246 365 365 2247 557 557 2249 207 95 2250 365 365 2248 365 365 2248 207 95 2250 556 556 2251 615 615 2252 365 365 2253 116 116 2255 116 116 2255 365 365 2253 556 556 2254 803 803 2257 366 366 2258 6 6 2256 6 6 2256 366 366 2258 687 687 2259 98 210 2261 558 558 2262 803 803 2260 803 803 2260 558 558 2262 366 366 2263 558 558 2265 208 96 2266 366 366 2264 366 366 2264 208 96 2266 560 560 2267 366 366 2269 560 560 2270 687 687 2268 687 687 2268 560 560 2270 152 152 2271 26 26 2272 802 802 2273 804 804 2275 804 804 2275 802 802 2273 367 367 2274 97 209 2277 559 559 2278 802 802 2276 802 802 2276 559 559 2278 367 367 2279 559 559 2281 208 96 2282 367 367 2280 367 367 2280 208 96 2282 558 558 2283 804 804 2284 367 367 2285 98 210 2287 98 210 2287 367 367 2285 558 558 2286 29 29 2288 688 688 2289 801 801 2291 801 801 2291 688 688 2289 368 368 2290 688 688 2292 152 152 2293 368 368 2295 368 368 2295 152 152 2293 560 560 2294 368 368 2296 560 560 2297 559 559 2299 559 559 2299 560 560 2297 208 96 2298 801 801 2300 368 368 2301 97 209 2303 97 209 2303 368 368 2301 559 559 2302 1 1 2304 684 684 2305 806 806 2307 806 806 2307 684 684 2305 369 369 2306 150 150 2309 561 561 2310 684 684 2308 684 684 2308 561 561 2310 369 369 2311 561 561 2313 209 97 2314 369 369 2312 369 369 2312 209 97 2314 563 563 2315 806 806 2316 369 369 2317 99 211 2319 99 211 2319 369 369 2317 563 563 2318 29 29 2320 800 800 2321 683 683 2323 683 683 2323 800 800 2321 370 370 2322 800 800 2324 96 208 2325 370 370 2327 370 370 2327 96 208 2325 562 562 2326 370 370 2328 562 562 2329 561 561 2331 561 561 2331 562 562 2329 209 97 2330 683 683 2332 370 370 2333 150 150 2335 150 150 2335 370 370 2333 561 561 2334 805 805 2337 371 371 2338 4 4 2336 4 4 2336 371 371 2338 799 799 2339 99 211 2341 563 563 2342 805 805 2340 805 805 2340 563 563 2342 371 371 2343 563 563 2345 209 97 2346 371 371 2344 371 371 2344 209 97 2346 562 562 2347 371 371 2349 562 562 2350 799 799 2348 799 799 2348 562 562 2350 96 208 2351 34 34 2352 696 696 2353 693 693 2355 693 693 2355 696 696 2353 372 372 2354 696 696 2356 156 156 2357 372 372 2359 372 372 2359 156 156 2357 564 564 2358 372 372 2360 564 564 2361 566 566 2363 566 566 2363 564 564 2361 210 98 2362 693 693 2364 372 372 2365 155 155 2367 155 155 2367 372 372 2365 566 566 2366 807 807 2369 373 373 2370 32 32 2368 32 32 2368 373 373 2370 695 695 2371 100 212 2373 565 565 2374 807 807 2372 807 807 2372 565 565 2374 373 373 2375 565 565 2377 210 98 2378 373 373 2376 373 373 2376 210 98 2378 564 564 2379 373 373 2381 564 564 2382 695 695 2380 695 695 2380 564 564 2382 156 156 2383 30 30 2384 694 694 2385 808 808 2387 808 808 2387 694 694 2385 374 374 2386 155 155 2389 566 566 2390 694 694 2388 694 694 2388 566 566 2390 374 374 2391 374 374 2392 566 566 2393 565 565 2395 565 565 2395 566 566 2393 210 98 2394 808 808 2396 374 374 2397 100 212 2399 100 212 2399 374 374 2397 565 565 2398 29 29 2400 766 766 2401 699 699 2403 699 699 2403 766 766 2401 375 375 2402 766 766 2404 79 191 2405 375 375 2407 375 375 2407 79 191 2405 567 567 2406 375 375 2408 567 567 2409 569 569 2411 569 569 2411 567 567 2409 211 99 2410 699 699 2412 375 375 2413 158 158 2415 158 158 2415 375 375 2413 569 569 2414 809 809 2417 376 376 2418 8 8 2416 8 8 2416 376 376 2418 765 765 2419 101 213 2421 568 568 2422 809 809 2420 809 809 2420 568 568 2422 376 376 2423 568 568 2425 211 99 2426 376 376 2424 376 376 2424 211 99 2426 567 567 2427 376 376 2429 567 567 2430 765 765 2428 765 765 2428 567 567 2430 79 191 2431 32 32 2432 700 700 2433 810 810 2435 810 810 2435 700 700 2433 377 377 2434 158 158 2437 569 569 2438 700 700 2436 700 700 2436 569 569 2438 377 377 2439 569 569 2441 211 99 2442 377 377 2440 377 377 2440 211 99 2442 568 568 2443 810 810 2444 377 377 2445 101 213 2447 101 213 2447 377 377 2445 568 568 2446 29 29 2448 698 698 2449 705 705 2451 705 705 2451 698 698 2449 378 378 2450 698 698 2452 157 157 2453 378 378 2455 378 378 2455 157 157 2453 570 570 2454 570 570 2457 212 100 2458 378 378 2456 378 378 2456 212 100 2458 572 572 2459 378 378 2461 572 572 2462 705 705 2460 705 705 2460 572 572 2462 49 161 2463 710 710 2465 379 379 2466 34 34 2464 34 34 2464 379 379 2466 697 697 2467 51 163 2469 571 571 2470 710 710 2468 710 710 2468 571 571 2470 379 379 2471 571 571 2473 212 100 2474 379 379 2472 379 379 2472 212 100 2474 570 570 2475 379 379 2477 570 570 2478 697 697 2476 697 697 2476 570 570 2478 157 157 2479 33 33 2480 706 706 2481 709 709 2483 709 709 2483 706 706 2481 380 380 2482 706 706 2484 49 161 2485 380 380 2487 380 380 2487 49 161 2485 572 572 2486 380 380 2488 572 572 2489 571 571 2491 571 571 2491 572 572 2489 212 100 2490 709 709 2492 380 380 2493 51 163 2495 51 163 2495 380 380 2493 571 571 2494 34 34 2496 692 692 2497 711 711 2499 711 711 2499 692 692 2497 381 381 2498 154 154 2501 573 573 2502 692 692 2500 692 692 2500 573 573 2502 381 381 2503 573 573 2505 213 101 2506 381 381 2504 381 381 2504 213 101 2506 575 575 2507 381 381 2509 575 575 2510 711 711 2508 711 711 2508 575 575 2510 52 164 2511 35 35 2512 811 811 2513 691 691 2515 691 691 2515 811 811 2513 382 382 2514 102 214 2517 574 574 2518 811 811 2516 811 811 2516 574 574 2518 382 382 2519 574 574 2521 213 101 2522 382 382 2520 382 382 2520 213 101 2522 573 573 2523 691 691 2524 382 382 2525 154 154 2527 154 154 2527 382 382 2525 573 573 2526 31 31 2528 712 712 2529 812 812 2531 812 812 2531 712 712 2529 383 383 2530 712 712 2532 52 164 2533 383 383 2535 383 383 2535 52 164 2533 575 575 2534 383 383 2536 575 575 2537 574 574 2539 574 574 2539 575 575 2537 213 101 2538 812 812 2540 383 383 2541 102 214 2543 102 214 2543 383 383 2541 574 574 2542 30 30 2544 813 813 2545 818 818 2547 818 818 2547 813 813 2545 384 384 2546 813 813 2548 103 215 2549 384 384 2551 384 384 2551 103 215 2549 576 576 2550 384 384 2552 576 576 2553 578 578 2555 578 578 2555 576 576 2553 214 102 2554 818 818 2556 384 384 2557 105 217 2559 105 217 2559 384 384 2557 578 578 2558 815 815 2561 385 385 2562 36 36 2560 36 36 2560 385 385 2562 814 814 2563 104 216 2565 577 577 2566 815 815 2564 815 815 2564 577 577 2566 385 385 2567 577 577 2569 214 102 2570 385 385 2568 385 385 2568 214 102 2570 576 576 2571 385 385 2573 576 576 2574 814 814 2572 814 814 2572 576 576 2574 103 215 2575 47 47 2576 817 817 2577 816 816 2579 816 816 2579 817 817 2577 386 386 2578 105 217 2581 578 578 2582 817 817 2580 817 817 2580 578 578 2582 386 386 2583 578 578 2585 214 102 2586 386 386 2584 386 386 2584 214 102 2586 577 577 2587 816 816 2588 386 386 2589 104 216 2591 104 216 2591 386 386 2589 577 577 2590 47 47 2592 718 718 2593 817 817 2595 817 817 2595 718 718 2593 387 387 2594 718 718 2596 55 167 2597 387 387 2599 387 387 2599 55 167 2597 579 579 2598 387 387 2600 579 579 2601 581 581 2603 581 581 2603 579 579 2601 215 103 2602 817 817 2604 387 387 2605 105 217 2607 105 217 2607 387 387 2605 581 581 2606 35 35 2608 690 690 2609 717 717 2611 717 717 2611 690 690 2609 388 388 2610 690 690 2612 153 153 2613 388 388 2615 388 388 2615 153 153 2613 580 580 2614 388 388 2616 580 580 2617 579 579 2619 579 579 2619 580 580 2617 215 103 2618 717 717 2620 388 388 2621 55 167 2623 55 167 2623 388 388 2621 579 579 2622 30 30 2624 818 818 2625 689 689 2627 689 689 2627 818 818 2625 389 389 2626 105 217 2629 581 581 2630 818 818 2628 818 818 2628 581 581 2630 389 389 2631 581 581 2633 215 103 2634 389 389 2632 389 389 2632 215 103 2634 580 580 2635 389 389 2637 580 580 2638 689 689 2636 689 689 2636 580 580 2638 153 153 2639 35 35 2640 716 716 2641 820 820 2643 820 820 2643 716 716 2641 390 390 2642 54 166 2645 582 582 2646 716 716 2644 716 716 2644 582 582 2646 390 390 2647 582 582 2649 216 104 2650 390 390 2648 390 390 2648 216 104 2650 584 584 2651 390 390 2653 584 584 2654 820 820 2652 820 820 2652 584 584 2654 106 218 2655 38 38 2656 732 732 2657 715 715 2659 715 715 2659 732 732 2657 391 391 2658 732 732 2660 62 174 2661 391 391 2663 391 391 2663 62 174 2661 583 583 2662 391 391 2664 583 583 2665 582 582 2667 582 582 2667 583 583 2665 216 104 2666 715 715 2668 391 391 2669 54 166 2671 54 166 2671 391 391 2669 582 582 2670 42 42 2672 819 819 2673 731 731 2675 731 731 2675 819 819 2673 392 392 2674 819 819 2676 106 218 2677 392 392 2679 392 392 2679 106 218 2677 584 584 2678 392 392 2680 584 584 2681 583 583 2683 583 583 2683 584 584 2681 216 104 2682 731 731 2684 392 392 2685 62 174 2687 62 174 2687 392 392 2685 583 583 2686 31 31 2688 812 812 2689 723 723 2691 723 723 2691 812 812 2689 393 393 2690 102 214 2693 585 585 2694 812 812 2692 812 812 2692 585 585 2694 393 393 2695 393 393 2696 585 585 2697 587 587 2699 587 587 2699 585 585 2697 217 105 2698 723 723 2700 393 393 2701 58 170 2703 58 170 2703 393 393 2701 587 587 2702 35 35 2704 820 820 2705 811 811 2707 811 811 2707 820 820 2705 394 394 2706 820 820 2708 106 218 2709 394 394 2711 394 394 2711 106 218 2709 586 586 2710 394 394 2712 586 586 2713 585 585 2715 585 585 2715 586 586 2713 217 105 2714 811 811 2716 394 394 2717 102 214 2719 102 214 2719 394 394 2717 585 585 2718 42 42 2720 724 724 2721 819 819 2723 819 819 2723 724 724 2721 395 395 2722 58 170 2725 587 587 2726 724 724 2724 724 724 2724 587 587 2726 395 395 2727 587 587 2729 217 105 2730 395 395 2728 395 395 2728 217 105 2730 586 586 2731 395 395 2733 586 586 2734 819 819 2732 819 819 2732 586 586 2734 106 218 2735 41 41 2736 754 754 2737 824 824 2739 824 824 2739 754 754 2737 396 396 2738 754 754 2740 73 185 2741 396 396 2743 396 396 2743 73 185 2741 588 588 2742 588 588 2745 218 106 2746 396 396 2744 396 396 2744 218 106 2746 590 590 2747 396 396 2749 590 590 2750 824 824 2748 824 824 2748 590 590 2750 108 220 2751 821 821 2753 397 397 2754 39 39 2752 39 39 2752 397 397 2754 753 753 2755 107 219 2757 589 589 2758 821 821 2756 821 821 2756 589 589 2758 397 397 2759 589 589 2761 218 106 2762 397 397 2760 397 397 2760 218 106 2762 588 588 2763 397 397 2765 588 588 2766 753 753 2764 753 753 2764 588 588 2766 73 185 2767 2 2 2768 823 823 2769 822 822 2771 822 822 2771 823 823 2769 398 398 2770 823 823 2772 108 220 2773 398 398 2775 398 398 2775 108 220 2773 590 590 2774 398 398 2776 590 590 2777 589 589 2779 589 589 2779 590 590 2777 218 106 2778 822 822 2780 398 398 2781 107 219 2783 107 219 2783 398 398 2781 589 589 2782 825 825 2785 399 399 2786 2 2 2784 2 2 2784 399 399 2786 823 823 2787 109 221 2789 591 591 2790 825 825 2788 825 825 2788 591 591 2790 399 399 2791 591 591 2793 219 107 2794 399 399 2792 399 399 2792 219 107 2794 593 593 2795 399 399 2797 593 593 2798 823 823 2796 823 823 2796 593 593 2798 108 220 2799 44 44 2800 730 730 2801 826 826 2803 826 826 2803 730 730 2801 400 400 2802 730 730 2804 61 173 2805 400 400 2807 400 400 2807 61 173 2805 592 592 2806 400 400 2808 592 592 2809 591 591 2811 591 591 2811 592 592 2809 219 107 2810 826 826 2812 400 400 2813 109 221 2815 109 221 2815 400 400 2813 591 591 2814 41 41 2816 824 824 2817 729 729 2819 729 729 2819 824 824 2817 401 401 2818 824 824 2820 108 220 2821 401 401 2823 401 401 2823 108 220 2821 593 593 2822 401 401 2824 593 593 2825 592 592 2827 592 592 2827 593 593 2825 219 107 2826 401 401 2829 592 592 2830 729 729 2828 729 729 2828 592 592 2830 61 173 2831 41 41 2832 728 728 2833 735 735 2835 735 735 2835 728 728 2833 402 402 2834 728 728 2836 60 172 2837 402 402 2839 402 402 2839 60 172 2837 594 594 2838 402 402 2840 594 594 2841 596 596 2843 596 596 2843 594 594 2841 220 108 2842 735 735 2844 402 402 2845 64 176 2847 64 176 2847 402 402 2845 596 596 2846 43 43 2848 827 827 2849 727 727 2851 727 727 2851 827 827 2849 403 403 2850 827 827 2852 110 222 2853 403 403 2855 403 403 2855 110 222 2853 595 595 2854 595 595 2857 220 108 2858 403 403 2856 403 403 2856 220 108 2858 594 594 2859 403 403 2861 594 594 2862 727 727 2860 727 727 2860 594 594 2862 60 172 2863 42 42 2864 736 736 2865 828 828 2867 828 828 2867 736 736 2865 404 404 2866 64 176 2869 596 596 2870 736 736 2868 736 736 2868 596 596 2870 404 404 2871 596 596 2873 220 108 2874 404 404 2872 404 404 2872 220 108 2874 595 595 2875 828 828 2876 404 404 2877 110 222 2879 110 222 2879 404 404 2877 595 595 2878 42 42 2880 828 828 2881 739 739 2883 739 739 2883 828 828 2881 405 405 2882 110 222 2885 597 597 2886 828 828 2884 828 828 2884 597 597 2886 405 405 2887 597 597 2889 221 109 2890 405 405 2888 405 405 2888 221 109 2890 599 599 2891 405 405 2893 599 599 2894 739 739 2892 739 739 2892 599 599 2894 66 178 2895 744 744 2897 406 406 2898 43 43 2896 43 43 2896 406 406 2898 827 827 2899 68 180 2901 598 598 2902 744 744 2900 744 744 2900 598 598 2902 406 406 2903 598 598 2905 221 109 2906 406 406 2904 406 406 2904 221 109 2906 597 597 2907 406 406 2909 597 597 2910 827 827 2908 827 827 2908 597 597 2910 110 222 2911 40 40 2912 740 740 2913 743 743 2915 743 743 2915 740 740 2913 407 407 2914 740 740 2916 66 178 2917 407 407 2919 407 407 2919 66 178 2917 599 599 2918 407 407 2920 599 599 2921 598 598 2923 598 598 2923 599 599 2921 221 109 2922 743 743 2924 407 407 2925 68 180 2927 68 180 2927 407 407 2925 598 598 2926 816 816 2929 408 408 2930 47 47 2928 47 47 2928 408 408 2930 747 747 2931 104 216 2933 600 600 2934 816 816 2932 816 816 2932 600 600 2934 408 408 2935 600 600 2937 222 110 2938 408 408 2936 408 408 2936 222 110 2938 602 602 2939 408 408 2941 602 602 2942 747 747 2940 747 747 2940 602 602 2942 70 182 2943 36 36 2944 829 829 2945 815 815 2947 815 815 2947 829 829 2945 409 409 2946 111 223 2949 601 601 2950 829 829 2948 829 829 2948 601 601 2950 409 409 2951 601 601 2953 222 110 2954 409 409 2952 409 409 2952 222 110 2954 600 600 2955 815 815 2956 409 409 2957 104 216 2959 104 216 2959 409 409 2957 600 600 2958 45 45 2960 748 748 2961 830 830 2963 830 830 2963 748 748 2961 410 410 2962 748 748 2964 70 182 2965 410 410 2967 410 410 2967 70 182 2965 602 602 2966 410 410 2968 602 602 2969 601 601 2971 601 601 2971 602 602 2969 222 110 2970 830 830 2972 410 410 2973 111 223 2975 111 223 2975 410 410 2973 601 601 2974 46 46 2976 831 831 2977 749 749 2979 749 749 2979 831 831 2977 411 411 2978 831 831 2980 112 224 2981 411 411 2983 411 411 2983 112 224 2981 603 603 2982 411 411 2984 603 603 2985 605 605 2987 605 605 2987 603 603 2985 223 111 2986 749 749 2988 411 411 2989 71 183 2991 71 183 2991 411 411 2989 605 605 2990 734 734 2993 412 412 2994 41 41 2992 41 41 2992 412 412 2994 832 832 2995 63 175 2997 604 604 2998 734 734 2996 734 734 2996 604 604 2998 412 412 2999 604 604 3001 223 111 3002 412 412 3000 412 412 3000 223 111 3002 603 603 3003 412 412 3005 603 603 3006 832 832 3004 832 832 3004 603 603 3006 112 224 3007 38 38 3008 750 750 3009 733 733 3011 733 733 3011 750 750 3009 413 413 3010 71 183 3013 605 605 3014 750 750 3012 750 750 3012 605 605 3014 413 413 3015 605 605 3017 223 111 3018 413 413 3016 413 413 3016 223 111 3018 604 604 3019 733 733 3020 413 413 3021 63 175 3023 63 175 3023 413 413 3021 604 604 3022 41 41 3024 832 832 3025 755 755 3027 755 755 3027 832 832 3025 414 414 3026 832 832 3028 112 224 3029 414 414 3031 414 414 3031 112 224 3029 606 606 3030 414 414 3032 606 606 3033 608 608 3035 608 608 3035 606 606 3033 224 112 3034 755 755 3036 414 414 3037 74 186 3039 74 186 3039 414 414 3037 608 608 3038 612 612 3041 415 415 3042 46 46 3040 46 46 3040 415 415 3042 831 831 3043 114 114 3045 607 607 3046 612 612 3044 612 612 3044 607 607 3046 415 415 3047 607 607 3049 224 112 3050 415 415 3048 415 415 3048 224 112 3050 606 606 3051 415 415 3053 606 606 3054 831 831 3052 831 831 3052 606 606 3054 112 224 3055 756 756 3057 416 416 3058 48 48 3056 48 48 3056 416 416 3058 611 611 3059 74 186 3061 608 608 3062 756 756 3060 756 756 3060 608 608 3062 416 416 3063 608 608 3065 224 112 3066 416 416 3064 416 416 3064 224 112 3066 607 607 3067 416 416 3069 607 607 3070 611 611 3068 611 611 3068 607 607 3070 114 114 3071</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape5</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_5" name="qt_gauge_background_5" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape5">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_5</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_6.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_6.dae
new file mode 100644
index 0000000..f774f7f
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_6.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:37:22</created>
+ <modified>2018-03-08T09:37:22</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape6" name="qt_gauge_background_Shape6">
+ <mesh>
+ <source id="qt_gauge_background_Shape6-positions" name="qt_gauge_background_Shape6-positions">
+ <float_array id="qt_gauge_background_Shape6-positions-array" count="2499">-2.155365 0 14.97905 -2.155258 0 -17.25369 73.06818 0 3.946808 49.08949 0 22.29259 42.00165 0 -22.03049 -73.06819 0 3.946808 -42.00159 0 -22.03049 -49.08949 0 22.29257 6.035065 0 15.03326 6.035095 0 -17.35059 -34.44371 0 -21.96619 -36.0546 0 20.2066 -54.27332 0 -18.62247 -55.88414 0 21.64397 -72.10312 0 -1.23764 -55.17774 0 -0.9639282 -63.17139 0 -13.47348 -64.66087 0 0.6018677 -66.78143 0 -9.73172 -62.86376 0 -9.381195 -53.54179 0 -11.72336 -63.93195 0 17.57404 -70.18794 0 11.11305 -64.00456 0 10.75232 -55.39933 0 11.12024 -37.20757 0 0.5934448 -18.39252 0 -19.31717 -18.39255 0 16.72612 -15.71161 0 -0.287384 3.406616 0 -0.248291 36.0546 0 20.2066 34.44373 0 -21.96616 19.11101 0 16.74207 19.11101 0 -19.34564 16.90314 0 -0.292572 37.20753 0 0.5934143 55.88414 0 21.64398 54.27332 0 -18.62247 55.17775 0 1.061584 72.1031 0 -1.23764 63.17139 0 -13.47348 64.66086 0 -0.2668457 54.25066 0 -11.19238 63.36897 0 -9.986053 66.78143 0 -9.73172 63.93195 0 17.57404 63.29892 0 9.936584 54.87485 0 11.77145 70.18793 0 11.11305 11.71088 0 -18.15338 11.50334 0 -8.83075 36.59932 0 -12.22577 27.42654 0 -20.77844 27.63541 0 -10.00235 53.99455 0 5.826233 48.47946 0 0.1818848 47.83978 0 7.296326 47.25098 0 -17.9101 38.43565 0 -22.42606 43.71547 0 -15.38297 64.89435 0 -9.753632 63.31473 0 -7.019531 66.17921 0 -5.54303 53.92223 0 -4.037048 59.76471 0 0.1272888 59.71625 0 -5.605652 59.56525 0 -15.91528 54.26109 0 -15.83731 59.61618 0 -12.88614 65.09415 0 -11.91309 63.1884 0 -11.7269 59.65102 0 10.65143 59.72662 0 15.22289 59.6713 0 5.671417 73.21956 0 1.548035 69.00375 0 -1.159088 69.77188 0 2.735443 -18.15666 0 7.982635 -9.411804 0 15.58368 -8.568832 0 7.585876 -5.00267 0 -0.2996216 -52.76935 0 22.37531 -50.95274 0 15.46982 -54.02927 0 4.123901 -47.87453 0 7.225464 -54.21368 0 -15.87173 -59.56525 0 -15.91528 -73.21956 0 1.548035 -69.77192 0 2.790741 -72.05003 0 7.314453 -38.43561 0 -22.42606 -47.20355 0 -17.94455 -43.66806 0 -15.41739 -47.77565 0 -20.73337 -24.95271 0 -0.3321228 5.788818 0 -8.529419 2.22731 0 -17.02689 -0.3578186 0 -8.493256 25.05502 0 -0.3326416 9.498505 0 -0.3102112 52.76935 0 22.37532 55.78719 0 17.72076 50.91801 0 15.51294 43.42937 0 21.5406 44.18393 0 12.65875 47.77571 0 -20.7334 45.93469 0 -7.049347 69.5119 0 -5.589203 60.84549 0 -9.879761 59.80237 0 19.98944 63.92645 0 5.588104 67.90828 0 6.099426 72.05003 0 7.314453 67.45786 0 14.58754 66.57426 0 10.6022 63.86815 0 13.62581 2.227234 0 14.81131 5.788803 0 7.412231 -0.3578796 0 7.392303 -43.42937 0 21.54062 -36.13707 0 12.81995 -44.18394 0 12.65874 -59.80237 0 19.98944 -55.82188 0 17.67761 -59.78384 0 15.17976 -63.26183 0 -5.423187 -59.7528 0 -0.01449585 -59.62895 0 -5.529175 -69.51189 0 -5.589233 -69.00376 0 -1.10379 -66.17924 0 -5.459991 -65.09414 0 -11.91312 -64.86396 0 -9.689911 -63.13547 0 -11.69092 -59.52253 0 -9.850494 -59.54627 0 -12.92056 -67.45784 0 14.58752 -63.93818 0 13.67978 -66.62181 0 10.6839 -63.9965 0 7.214966 -67.90828 0 6.182434 -60.99034 0 10.69 -59.80165 0 5.719788 -53.87484 0 -5.718109 -48.47946 0 -0.01525879 -45.88731 0 -7.111481 -27.51578 0 18.43053 -27.55887 0 8.850708 -27.35471 0 -20.77567 -36.59933 0 -12.22577 -27.5703 0 -9.999756 -9.411728 0 -18.06793 -18.15663 0 -9.301239 -8.568787 0 -8.770508 27.58765 0 18.43213 36.13707 0 12.81996 27.62393 0 8.852142 11.71088 0 15.63152 18.92238 0 7.996979 11.50334 0 7.618744 18.92238 0 -9.327881 66.21172 0 13.21889 2.78569 0 9.862915 -41.3177 0 15.13982 -58.3714 0 17.45175 -61.08176 0 -3.698486 -68.05255 0 -3.926025 -64.59578 0 -11.40128 -61.01808 0 -11.61035 -66.22581 0 13.23488 -66.31491 0 7.843445 -61.47633 0 7.763519 -49.26328 0 -4.038635 -30.52377 0 12.90097 -30.61006 0 -14.13474 -12.13626 0 -12.01151 30.53973 0 12.90135 13.93283 0 10.40201 13.93283 0 -12.07114 30.62605 0 -14.13535 49.64694 0 4.159607 43.54224 0 -18.66388 64.82785 0 -7.483459 57.99095 0 -3.414856 58.02774 0 -14.64944 64.60478 0 -11.41196 61.19666 0 13.34561 57.97478 0 7.475067 70.55225 0 1.063873 -12.13632 0 10.3688 -4.616455 0 4.915619 -53.3677 0 18.62457 -49.65729 0 3.809082 -47.59114 0 11.59984 -61.46114 0 13.34883 -57.94024 0 -7.234955 -64.81883 0 -7.160583 -58.01372 0 -14.65964 -70.55228 0 1.080231 -69.77375 0 5.174866 -58.01273 0 3.513641 -43.5282 0 -18.67407 -49.93115 0 -17.96487 -42.44899 0 -11.42685 -23.99776 0 5.476379 -23.99777 0 -6.457153 2.785767 0 -11.3103 -4.616425 0 -5.734406 24.15746 0 5.479309 9.054947 0 4.938385 9.054962 0 -5.781189 24.15746 0 -6.462677 53.35742 0 18.63733 41.31772 0 15.13979 47.58087 0 11.61263 49.94521 0 -17.95471 49.27733 0 -3.690674 42.46303 0 -11.41663 68.05255 0 -3.942413 61.31339 0 -7.516235 61.28127 0 -11.61078 58.36111 0 17.46455 61.21782 0 3.81015 66.30083 0 7.515259 69.77374 0 5.158478 65.50117 0 14.86832 67.72795 0 12.49998 65.13977 0 12.02798 0.7644501 0 11.73558 4.287766 0 11.7563 3.067123 0 6.126465 -44.68736 0 17.80579 -39.31366 0 17.37122 -39.71344 0 10.20609 -60.45388 0 17.55916 -57.41202 0 19.23532 -57.30917 0 15.40439 -61.87511 0 -6.205475 -62.20537 0 -2.217377 -59.00954 0 -2.500061 -67.55228 0 -6.249847 -69.68369 0 -2.891022 -66.93096 0 -2.539856 -64.14434 0 -12.20786 -65.37144 0 -10.87833 -64.04459 0 -10.77829 -61.91615 0 -12.45697 -61.87511 0 -10.77826 -58.72572 0 -11.51401 -67.72797 0 12.49997 -65.50117 0 14.86833 -65.26653 0 12.17194 -67.83879 0 8.898102 -65.26651 0 9.148773 -65.74909 0 5.427826 -62.39601 0 5.30658 -62.63381 0 9.148773 -59.40817 0 8.785126 -50.70195 0 -7.074219 -51.70614 0 -2.500061 -45.23967 0 -2.658081 -32.84079 0 8.682495 -32.62413 0 16.04131 -26.05612 0 14.0518 -26.05612 0 -16.00595 -32.48508 0 -17.29822 -33.02391 0 -8.99472 -7.914459 0 -13.98773 -14.56073 0 -14.62213 -13.90169 0 -7.537231 26.19984 0 14.05499 32.62413 0 16.04131 32.84079 0 8.682526 10.63321 0 12.15469 15.8425 0 12.64221 15.43274 0 6.453918 15.43274 0 -7.576141 15.8425 0 -14.67294 10.63321 0 -14.06989 33.0239 0 -8.994659 32.48508 0 -17.29822 26.19983 0 -16.01163 51.46892 0 7.171173 51.70615 0 2.597717 45.77692 0 2.943573 47.34625 0 -15.81479 42.83298 0 -20.40009 40.27161 0 -19.62421 65.65784 0 -8.221924 64.1257 0 -8.717194 64.71997 0 -5.16864 56.57603 0 -6.100922 56.73346 0 -1.678741 60.59097 0 -2.364868 60.30176 0 -14.13409 56.68607 0 -16.22241 56.7095 0 -13.62619 65.37144 0 -10.87833 64.14435 0 -12.20786 64.1257 0 -10.87418 62.25891 0 15.0379 62.14691 0 12.02798 58.95546 0 12.79282 56.73344 0 4.957794 56.67937 0 8.900116 60.34183 0 8.561127 71.70821 0 2.337341 71.28731 0 0.1138916 68.48247 0 0.6400452 -13.9017 0 6.433594 -14.56076 0 12.61377 -7.914536 0 12.10873 -1.542511 0 2.966248 -8.571701 0 3.018311 -3.8452 0 8.722626 -53.88194 0 15.77014 -54.52203 0 20.23221 -51.63056 0 19.70602 -45.77692 0 2.943573 -51.70614 0 1.776398 -51.56146 0 6.612457 -50.41033 0 11.31464 -47.9819 0 15.43913 -44.26559 0 8.021759 -59.40818 0 12.67783 -62.63383 0 12.17194 -62.25893 0 15.0379 -56.73344 0 -4.860138 -56.44964 0 -8.60849 -60.26069 0 -8.177551 -64.71997 0 -4.577454 -64.04459 0 -8.177582 -65.65784 0 -8.221924 -56.58311 0 -13.71793 -56.68607 0 -16.22244 -60.30177 0 -14.13406 -68.48248 0 0.7875061 -71.28732 0 0.1138611 -71.70819 0 2.337372 -71.19881 0 4.697418 -70.00407 0 7.37027 -68.01014 0 3.591309 -56.7719 0 6.168793 -56.73344 0 1.776398 -60.59095 0 2.502808 -40.27161 0 -19.62421 -42.83295 0 -20.40005 -47.21983 0 -15.90659 -51.41184 0 -15.83154 -46.66475 0 -19.69263 -51.64826 0 -18.28616 -46.64342 0 -11.32532 -40.6875 0 -7.66153 -39.56174 0 -15.2186 -22.22435 0 9.723541 -21.02499 0 3.200806 -28.47176 0 3.579407 -28.47176 0 -4.106262 -21.02499 0 -4.0383 -22.22433 0 -11.2272 3.067169 0 -7.090454 4.287811 0 -13.50226 0.7645264 0 -13.46527 -3.845139 0 -9.992981 -8.571686 0 -3.713409 -1.54248 0 -3.623749 28.47176 0 3.579437 21.41798 0 3.203857 22.54811 0 9.730743 11.83852 0 3.031494 7.07901 0 2.976349 8.119553 0 8.76062 8.119553 0 -10.06085 7.079025 0 -3.650574 11.83852 0 -3.748322 22.54811 0 -11.24002 21.41798 0 -4.046387 28.47174 0 -4.106232 51.63055 0 19.70602 54.52203 0 20.23221 53.7894 0 15.88512 39.71346 0 10.20609 39.31364 0 17.37122 44.68738 0 17.8058 44.26561 0 8.021759 47.98189 0 15.43913 50.31778 0 11.42963 51.64828 0 -18.28616 46.66479 0 -19.69263 51.53827 0 -15.73978 45.23965 0 -2.658081 51.70615 0 -1.678741 50.82835 0 -6.538727 39.56174 0 -15.21857 40.68748 0 -7.66153 46.76982 0 -11.23349 66.93095 0 -2.687317 69.68369 0 -2.891022 67.55226 0 -6.249847 62.20538 0 -5.16864 62.31641 0 -8.717194 59.21228 0 -8.516693 59.2123 0 -11.42224 62.31641 0 -10.87421 61.91614 0 -12.45697 57.2166 0 15.51935 57.41202 0 19.23532 60.45386 0 17.55917 62.14687 0 6.388489 62.39603 0 2.355286 59.00954 0 2.597717 65.74911 0 4.836609 65.13976 0 8.561127 67.83878 0 8.898102 68.01013 0 3.443817 70.00407 0 7.37027 71.19881 0 4.697449 66.82068 0 13.89374 66.48096 0 12.17839 65.26697 0 13.51949 2.604187 0 12.02815 4.114792 0 8.789032 1.578644 0 8.779083 -42.25055 0 17.80386 -39.10931 0 13.79478 -42.53362 0 13.81168 -58.97126 0 18.51526 -57.2126 0 17.43288 -58.94555 0 16.36813 -62.13931 0 -4.441345 -60.57485 0 -2.098907 -60.49229 0 -4.512024 -68.64404 0 -4.62088 -68.37512 0 -2.599762 -67.14082 0 -4.533051 -64.87827 0 -11.70761 -64.79463 0 -10.78442 -64.0577 0 -11.62692 -62.06702 0 -11.68918 -60.42133 0 -10.94339 -60.4316 0 -12.17795 -66.82066 0 13.89374 -65.29867 0 13.55548 -66.51266 0 12.21437 -66.54034 0 9.068848 -65.36063 0 7.416351 -67.02118 0 7.031219 -62.56729 0 7.386017 -61.14182 0 9.040619 -60.72218 0 6.851471 -51.29799 0 -4.729218 -48.71393 0 -2.209137 -47.74251 0 -5.206573 -33.04298 0 12.54945 -29.23083 0 15.203 -29.285 0 10.96869 -29.19609 0 -16.99246 -33.23712 0 -13.15305 -29.33081 0 -12.23233 -10.98326 0 -14.65402 -14.77916 0 -10.83713 -10.63843 0 -10.57153 29.26677 0 15.2038 33.04295 0 12.54944 29.32092 0 10.96948 12.94136 0 12.68974 16.04564 0 9.359894 12.83894 0 9.167664 16.04564 0 -10.8819 12.94136 0 -14.72528 12.83893 0 -10.63263 33.23708 0 -13.15302 29.23201 0 -16.99387 29.3667 0 -12.23376 51.48972 0 4.826752 48.84825 0 2.35379 48.60576 0 5.356873 45.34558 0 -18.28406 41.41135 0 -20.33478 43.82587 0 -17.33456 64.88647 0 -8.542511 64.22186 0 -7.194855 65.38017 0 -6.627289 56.32239 0 -3.836884 58.83586 0 -1.930511 58.79649 0 -4.452148 58.75174 0 -15.14661 56.4774 0 -15.03641 58.75758 0 -13.77377 64.87828 0 -11.70761 64.07797 0 -11.65091 64.81488 0 -10.80841 62.41129 0 13.56187 60.54672 0 12.25157 60.57475 0 14.17889 56.34822 0 6.792999 58.76006 0 8.922455 58.77359 0 6.708252 71.68758 0 1.282043 69.80534 0 0.1483459 70.11917 0 1.735992 -14.77919 0 9.335205 -10.98332 0 12.64989 -10.63847 0 9.13385 -4.862106 0 2.654205 -6.372742 0 6.077423 -2.642075 0 6.005402 -54.4773 0 18.17229 -53.15295 0 20.2981 -52.45568 0 17.36206 -48.84824 0 2.148438 -51.51287 0 4.037994 -48.62894 0 5.217194 -49.1429 0 13.33141 -46.02802 0 11.91187 -47.57375 0 9.550262 -61.14184 0 12.25883 -62.53304 0 13.59787 -60.68793 0 14.15016 -56.29081 0 -6.646881 -58.68235 0 -8.504272 -58.75331 0 -6.539154 -64.20161 0 -6.468445 -64.86621 0 -8.407654 -65.38018 0 -6.479492 -56.44582 0 -15.05942 -58.75175 0 -15.14661 -58.72601 0 -13.79681 -69.80537 0 0.1852417 -71.68757 0 1.282043 -70.11919 0 1.77298 -70.73003 0 6.046265 -68.89414 0 5.504028 -69.67001 0 4.007904 -56.37138 0 3.927094 -58.83588 0 2.038239 -58.8455 0 4.552429 -41.41129 0 -20.33478 -45.31398 0 -18.30701 -43.79427 0 -17.35754 -48.85266 0 -17.82843 -49.04524 0 -19.11597 -51.87842 0 -16.92923 -44.05711 0 -9.395782 -39.98761 0 -11.64307 -43.18877 0 -13.22272 -21.54134 0 6.582581 -24.6819 0 2.960541 -25.7021 0 6.904785 -24.68192 0 -3.727478 -21.54132 0 -7.704071 -25.7021 0 -7.939972 4.114838 0 -10.08838 2.604233 0 -13.80368 1.57869 0 -10.07062 -6.372696 0 -7.016113 -4.862091 0 -3.30777 -2.642029 0 -6.911011 24.78009 0 2.961273 21.9006 0 6.589111 25.783 0 6.906586 9.362015 0 2.665375 7.608429 0 6.03067 10.16243 0 6.107513 7.608444 0 -6.958405 9.362015 0 -3.341553 10.16243 0 -7.072693 21.9006 0 -7.71637 24.78011 0 -3.729492 25.78304 0 -7.943176 53.15295 0 20.2981 54.45418 0 18.20102 52.43253 0 17.39079 39.1093 0 13.79478 42.25056 0 17.80388 42.53362 0 13.81166 46.02803 0 11.91187 49.11974 0 13.36018 47.55054 0 9.57901 49.04529 0 -19.11597 48.88426 0 -17.80548 51.91 0 -16.90625 48.7139 0 -2.003845 51.32957 0 -3.94635 47.77406 0 -5.072723 39.98758 0 -11.6431 44.08868 0 -9.372833 43.22034 0 -13.1998 68.37509 0 -2.636658 68.64404 0 -4.620911 67.14081 0 -4.569916 62.2496 0 -7.194824 61.01347 0 -8.616241 60.6255 0 -6.700989 61.01346 0 -10.9444 62.17731 0 -11.71317 60.55322 0 -12.155 57.18945 0 17.46159 58.97127 0 18.51527 58.92239 0 16.39685 62.44553 0 4.570374 60.62253 0 2.206726 60.56023 0 4.631042 65.32893 0 6.677917 66.50865 0 8.921936 67.02116 0 6.883423 68.89413 0 5.467163 70.73003 0 6.046234 69.67 0 3.971008 65.78886 0 16.14586 68.92789 0 12.90721 68.10625 0 10.79785 65.10292 0 10.37988 63.69743 0 11.99561 63.92781 0 15.29323 0.287384 0 14.84409 4.023376 0 14.87598 6.048462 0 10.73038 4.982941 0 4.088654 1.172211 0 4.08136 -1.346878 0 10.69499 -46.50787 0 21.9942 -39.92221 0 20.9415 -36.04779 0 16.71472 -36.41858 0 8.119507 -41.35568 0 7.862549 -46.60439 0 17.10741 -61.89818 0 18.86386 -57.7594 0 20.92479 -55.89074 0 19.78555 -55.60217 0 15.07074 -57.9562 0 13.65196 -61.62729 0 16.39178 -63.08391 0 -7.465546 -63.66558 0 -2.996429 -61.78526 0 0.1896973 -57.67416 0 -0.3453064 -57.67416 0 -3.420471 -61.28987 0 -7.465576 -68.06452 0 -7.828339 -70.92445 0 -3.297852 -70.59138 0 -1.249634 -67.26431 0 -0.6422119 -65.62225 0 -3.077057 -66.51975 0 -7.532074 -64.26775 0 -12.65494 -65.86166 0 -11.01599 -65.62944 0 -9.717285 -64.05643 0 -9.636841 -63.08392 0 -10.79709 -63.16014 0 -12.43796 -61.28987 0 -9.636841 -57.24843 0 -10.35941 -57.28181 0 -12.45163 -61.35145 0 -13.22433 -68.92789 0 12.90721 -65.78886 0 16.14586 -63.9278 0 15.29323 -63.9776 0 12.21153 -65.29305 0 10.7067 -68.10627 0 10.79785 -63.97758 0 9.166016 -64.16116 0 4.661652 -66.58219 0 3.9104 -69.03549 0 8.408051 -62.64089 0 10.7067 -58.84115 0 10.8223 -57.82187 0 7.966461 -61.83293 0 3.486725 -53.73275 0 -8.221405 -54.33857 0 -3.420471 -51.86324 0 -0.3453064 -44.23674 0 0.1867371 -42.24402 0 -4.31839 -49.34232 0 -9.338409 -31.89478 0 19.34563 -22.99069 0 17.53337 -23.56548 0 12.31592 -31.4922 0 5.379425 -22.99068 0 -20.04749 -31.25043 0 -21.43686 -35.93599 0 -16.76099 -36.89101 0 -7.176605 -31.53799 0 -5.690186 -23.56548 0 -14.14783 -5.46019 0 -17.59494 -13.79436 0 -18.64966 -18.39252 0 -13.58289 -17.44897 0 -5.240845 -11.85646 0 -5.052612 -5.489899 0 -12.48132 23.27808 0 17.53975 31.89478 0 19.34563 36.04779 0 16.71472 36.41858 0 8.119507 31.49219 0 5.379456 23.82602 0 12.3217 8.621521 0 15.27841 15.23132 0 16.1127 19.11772 0 11.74493 18.32297 0 4.352875 14.02371 0 4.239441 8.998962 0 10.89304 18.32297 0 -5.260651 19.11772 0 -13.61163 15.23132 0 -18.70663 8.621536 0 -17.69754 8.998962 0 -12.56299 14.02371 0 -5.087646 36.89101 0 -7.176575 35.93599 0 -16.76099 31.25043 0 -21.43683 23.27808 0 -20.05884 23.82602 0 -14.15811 31.53798 0 -5.690155 54.21162 0 8.360779 54.33859 0 3.518127 51.86325 0 0.4429626 44.23674 0 0.1867371 43.8101 0 4.7164 51.21962 0 9.436829 50.14597 0 -15.22861 44.57225 0 -20.09454 40.06438 0 -22.33948 36.70045 0 -22.29877 39.59479 0 -18.0062 48.07445 0 -13.34653 65.62944 0 -9.717285 64.17807 0 -9.891663 63.29562 0 -8.768066 63.66559 0 -4.473236 65.62224 0 -3.409241 66.51974 0 -7.532104 53.92233 0 -6.92514 54.33859 0 -1.598511 57.67415 0 0.4429626 61.83292 0 -0.03155518 61.78526 0 -3.328613 57.52808 0 -7.863312 61.59395 0 -14.60062 57.11511 0 -17.29626 54.26488 0 -17.29205 54.26666 0 -14.13388 57.56146 0 -12.31393 61.35143 0 -13.22433 65.86166 0 -11.01599 64.26775 0 -12.65494 63.16013 0 -12.43796 63.29562 0 -10.94101 61.45923 0 10.37988 57.59302 0 10.99483 57.72733 0 13.82449 61.62727 0 16.39177 61.45921 0 7.741394 57.67415 0 3.518158 73.27333 0 2.691315 72.84882 0 0.3080139 70.5914 0 -1.249634 67.2643 0 -0.8634644 67.74271 0 1.701172 71.49625 0 3.426819 -17.44897 0 4.343964 -18.39255 0 11.72884 -13.7944 0 16.08081 -5.460281 0 15.22101 -5.48999 0 10.84734 -11.85648 0 4.223206 -1.018585 0 -0.2812805 -9.58902 0 -0.2976685 -54.29142 0 22.12103 -51.10602 0 22.42606 -49.91888 0 18.17876 -52.5787 0 13.36963 -54.33857 0 1.696167 -54.35046 0 6.979614 -51.35844 0 9.153412 -43.81012 0 4.716431 -54.07707 0 -14.27155 -54.26486 0 -17.29205 -57.1151 0 -17.29626 -61.59395 0 -14.60062 -72.84882 0 0.3080139 -73.27335 0 2.691315 -71.49627 0 3.426819 -67.74272 0 1.922424 -72.66209 0 5.523407 -71.22698 0 9.213257 -36.70042 0 -22.2988 -40.06432 0 -22.33948 -44.5722 0 -20.09454 -49.95636 0 -15.3663 -47.88487 0 -13.48422 -39.59479 0 -18.0062 -44.66249 0 -21.49054 -51.06971 0 -19.77277 -20.8085 0 -0.3600464 -29.67955 0 -0.1313477 4.982941 0 -4.844025 6.048492 0 -12.33124 4.023437 0 -17.12418 0.2874756 0 -17.06717 -1.346802 0 -12.26804 1.172241 0 -4.828827 29.67955 0 -0.1313477 21.21788 0 -0.3622437 12.58487 0 -0.3071594 6.809723 0 -0.2886047 51.10602 0 22.42606 54.29144 0 22.12103 55.89073 0 19.78555 55.46332 0 15.24326 52.43987 0 13.54214 49.91888 0 18.17876 39.92221 0 20.9415 46.50787 0 21.9942 46.60437 0 17.10741 41.35567 0 7.862549 51.06975 0 -19.77277 44.66255 0 -21.49054 49.53189 0 -9.089783 42.24402 0 -4.31839 70.92445 0 -3.297852 68.06451 0 -7.828339 62.35542 0 -9.891663 58.54732 0 -10.22168 57.75941 0 20.92479 61.89818 0 18.86386 63.6974 0 7.741394 64.16116 0 3.184845 69.03549 0 8.408051 66.58217 0 3.578217 71.22697 0 9.213257 72.66208 0 5.523407</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape6-positions-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape6-normals" name="qt_gauge_background_Shape6-normals">
+ <float_array id="qt_gauge_background_Shape6-normals-array" count="2499">0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape6-normals-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape6-tangents" name="qt_gauge_background_Shape6-tangents">
+ <float_array id="qt_gauge_background_Shape6-tangents-array" count="2499">-0.0730163 0 -0.9973307 -0.07613684 0 0.9970974 -0.9683912 0 -0.2494364 0.1148164 0 -0.9933867 -0.1988659 0 0.9800267 0.9869109 0 -0.1612666 0.1575069 0 0.9875179 -0.06605045 0 -0.9978163 0.07794897 0 -0.9969574 0.1329527 0 0.9911224 -0.1635313 0 0.9865381 -0.1866722 0 -0.9824223 0.3379394 0 0.9411679 0.3580783 0 -0.9336916 0.8679873 0 0.4965865 -0.2405291 0 -0.9706419 0.5813711 0 0.8136385 0.4311601 0 -0.9022754 0.8130067 0 0.5822543 -0.7726577 0 0.6348229 -0.493835 0 0.8695556 0.6096544 0 -0.7926673 0.8773538 0 -0.479844 -0.9998293 0 0.01847412 -0.6234915 0 0.7818301 -0.6420175 0 0.76669 -0.1436633 0 0.9896266 -0.1729156 0 -0.9849366 0.9436411 0 -0.3309706 -0.9398454 0 0.3416002 0.2026789 0 -0.9792453 0.1458112 0 0.9893124 0.1601272 0 -0.9870964 0.1686975 0 0.9856679 0.8573051 0 -0.5148087 0.05775878 0 0.9983306 -0.2869294 0 -0.9579517 -0.4228935 0 0.9061794 -0.9463101 0 -0.3232603 -0.9006578 0 0.434529 -0.5982552 0 0.8013056 -0.989683 0 -0.1432746 -0.7126133 0 0.701557 0.9970632 0 -0.0765832 -0.8291922 0 0.5589636 -0.5355773 0 -0.8444862 -0.2386316 0 0.9711102 0.5382814 0 -0.8427652 -0.8183462 0 -0.5747256 0.1552488 0 0.9878754 0.8303809 0 -0.5571961 -0.9983355 0 0.05767287 0.1696807 0 0.9854991 0.7371595 0 -0.6757187 -0.9963525 0 0.08533275 -0.07692685 0 0.9970367 0.5391918 0 -0.842183 -0.6795366 0 0.7336416 -0.05308226 0 0.9985901 0.537018 0 -0.8435708 -0.0493844 0 0.9987798 0.9999403 0 -0.01092507 -0.9675801 0 -0.2525644 1 0 0 -0.149307 0 -0.9887909 -0.740105 0 0.6724913 -0.5438277 0 0.8391969 0.9999966 0 0.002601262 -0.2682748 0 -0.9633424 -0.7598511 0 0.6500971 0.9992104 0 -0.03973255 0.1485082 0 0.9889112 0.5731551 0 -0.8194469 -0.7567849 0 0.653664 -0.9988958 0 0.04698114 0.05693885 0 0.9983777 0.4541143 0 -0.8909435 0.9816069 0 0.1909133 -0.1127102 0 -0.9936279 -0.7271717 0 0.6864556 -0.004603534 0 0.9999894 0.1647734 0 -0.9863315 -0.9342724 0 0.35656 0.9919816 0 -0.1263825 -0.4841911 0 -0.8749623 -0.9963756 0 0.08506294 0.4910098 0 0.871154 0.9580945 0 0.2864522 -0.3460843 0 -0.9382034 0.9462717 0 -0.3233728 -0.07314351 0 0.9973214 0.6327217 0 0.7743793 -0.4167368 0 -0.9090272 0.236327 0 0.9716736 0.006737821 0 0.9999773 -0.9769167 0 -0.2136204 0.05408727 0 0.9985362 0.9673502 0 -0.2534434 -0.04348629 0 0.999054 -9.88787e-4 0 0.9999995 -0.03048817 0 -0.9995351 -0.9987449 0 0.0500856 0.7914863 0 0.6111869 0.1683847 0 -0.9857214 -0.8784012 0 0.4779239 -0.2799655 0 0.9600101 0.4933829 0 0.8698123 -0.8512452 0 0.5247681 0.007882126 0 0.9999689 -0.416285 0 -0.9092342 -0.9943901 0 -0.1057752 -0.8986067 0 0.4387551 -0.9175126 0 -0.3977068 -0.6824573 0 -0.7309255 -0.1266803 0 0.9919436 0.9945615 0 -0.1041508 -0.01689368 0 -0.9998573 -0.9969521 0 0.07801568 0.9077546 0 0.4195017 -0.1457649 0 -0.9893193 -0.9997374 0 0.02291678 0.8613863 0 0.5079505 0.4731437 0 -0.8809853 -0.9994669 0 -0.0326473 0.6413641 0 0.7672367 0.9962271 0 0.08678507 -0.09996263 0 -0.9949912 -0.7333631 0 0.6798372 0.8398212 0 0.5428631 0.0914776 0 -0.9958071 -0.9737538 0 0.2276039 0.6680027 0 0.7441588 0.03573807 0 -0.9993612 -0.9983409 0 0.05757955 -0.120016 0 -0.992772 -0.2027817 0 0.979224 0.7526271 0 -0.658447 -0.9999793 0 0.006430796 -0.01715372 0 0.9998529 -0.999953 0 0.009697348 0.8636573 0 0.5040795 -0.01011315 0 -0.9999489 -0.7502646 0 0.6611376 0.998393 0 0.05666989 0.09707741 0 -0.9952768 -0.6084175 0 0.7936171 -0.204556 0 -0.9788549 -0.6553915 0 0.7552893 -0.1645841 0 0.9863631 0.9894718 0 0.1447255 -0.7356849 0 -0.6773239 -0.1188498 0 0.9929122 0.9984859 0 -0.05500885 -0.7491199 0 -0.6624344 0.2027678 0 -0.9792268 -0.9997374 0 -0.02291687 0.668035 0 0.7441299 0.1135575 0 -0.9935314 -0.9986445 0 0.05204924 0.8016033 0 0.5978562 -0.989314 0 -0.1458009 -0.7424196 0 0.6699352 -0.996505 0 -0.08353308 -0.9438109 0 -0.330486 -0.8710016 0 -0.4912802 0.574796 0 -0.8182968 0.7614754 0 -0.6481938 0.7351354 0 -0.6779203 0.07493816 0 -0.9971882 -0.7422427 0 -0.6701311 -0.9834959 0 -0.1809305 0.3270027 0 -0.9450234 0.3213936 0 -0.9469457 0.1381956 0 -0.990405 0.8962877 0 0.443473 0.9165519 0 0.3999158 -0.8751513 0 -0.4838494 -0.9175383 0 -0.3976475 -0.4905071 0 0.8714372 -0.3521279 0 0.9359519 -0.3404112 0 0.9402767 -0.2060989 0 0.9785312 0.9984714 0 0.05527083 0.2452069 0 -0.9694708 0.5660745 0 0.8243541 0.7340768 0 0.6790665 -0.1752915 0 0.9845166 0.3867091 0 -0.9222017 -0.1887118 0 0.9820325 0.3642264 0 -0.9313104 0.9941518 0 -0.107992 0.3774579 0 -0.9260268 0.8989857 0 0.437978 -0.7447152 0 -0.6673824 0.9596722 0 0.2811213 -0.3358257 0 0.9419241 -0.7463422 0 0.6655625 0.2470728 0 0.9689969 0.7677629 0 0.640734 -0.6735429 0 -0.7391481 -0.2442661 0 0.9697082 0.6172278 0 0.7867845 -0.1255134 0 0.9920919 -0.784009 0 -0.6207494 -0.4106152 0 0.9118087 -0.9699982 0 -0.2431123 -0.67681 0 0.7361577 0.5895004 0 -0.8077681 0.9707629 0 0.2400406 0.990998 0 0.1338769 0.6312125 0 -0.77561 0.4856093 0 -0.874176 -0.9925062 0 -0.1221939 0.5201574 0 -0.8540704 -0.1892235 0 -0.981934 0.7904332 0 -0.6125483 -0.9484884 0 -0.316812 0.09110635 0 -0.9958412 -0.9708207 0 0.2398066 -0.3247058 0 0.9458151 -0.9278732 0 -0.3728958 0.002526494 0 -0.9999968 -0.5264619 0 0.8501987 0.652717 0 -0.7576018 -0.3311363 0 -0.9435829 0.5941125 0 0.804382 0.2497246 0 -0.9683169 -0.9963833 0 0.08497295 -0.1570557 0 0.9875898 0.9983052 0 -0.05819507 -0.8720834 0 -0.4893573 7.88984e-4 0 0.9999997 0.9983717 0 0.05704373 -0.7876737 0 -0.6160926 -0.5419553 0 0.8404073 0.9939353 0 0.1099661 -0.5074783 0 -0.8616645 -0.9889703 0 -0.1481137 -0.07246648 0 0.9973708 0.8050079 0 -0.5932641 -0.8306873 0 -0.5567393 -0.2172631 0 0.9761131 0.9945028 0 -0.1047103 -0.5632105 0 -0.8263135 -0.1606803 0 0.9870065 0.9998807 0 -0.01544335 -0.9812374 0 -0.1928036 0.1128613 0 0.9936108 0.3627039 0 -0.9319044 -0.8380715 0 0.5455603 0.9883125 0 0.1524413 -0.0340334 0 -0.9994207 -0.1303777 0 0.9914644 0.9985273 0 -0.05425077 -0.7833953 0 -0.6215237 -0.9966249 0 -0.08209039 0.07230029 0 0.9973829 0.8271004 0 -0.5620542 -0.9691831 0 -0.2463414 -0.09677083 0 0.9953067 0.7134685 0 -0.7006873 -0.9986358 0 -0.05221633 0.2398363 0 0.9708133 0.690593 0 -0.7232436 0.2997336 0 -0.9540229 -0.9839376 0 -0.1785125 0.6592132 0 0.7519561 0.212174 0 -0.9772319 -0.998339 0 -0.05761335 0.6809489 0 0.732331 -0.3507772 0 0.9364589 0.9928836 0 0.1190889 -0.5448281 0 -0.8385477 -0.2258208 0 0.9741689 0.9980903 0 0.06177108 -0.7229027 0 -0.6909499 0.9832435 0 0.1822971 0.01803745 0 -0.9998373 -0.8416176 0 0.5400738 0.9986885 0 0.05119835 -0.09315162 0 -0.9956519 -0.7663573 0 0.6424146 0.9999607 0 0.008870808 0.08504278 0 -0.9963773 -0.6490188 0 0.7607724 0.7769771 0 -0.6295288 -0.04589012 0 -0.9989465 -0.5415541 0 0.8406659 0.3837851 0 -0.9234224 -0.9980109 0 0.0630409 0.9110288 0 0.4123427 -0.9937828 0 -0.1113364 0.118904 0 0.9929058 0.7582897 0 -0.6519178 0.5468856 0 -0.8372074 -0.9848731 0 -0.1732771 0.07187283 0 0.9974138 0.8595013 0 -0.5111335 -0.9929731 0 -0.1183406 -0.09499423 0 0.9954778 0.9947137 0 0.1026869 -0.1383811 0 -0.9903791 -0.6502807 0 0.759694 -0.9786717 0 -0.2054306 -0.01073567 0 0.9999424 0.7633009 0 -0.6460431 0.999809 0 -0.01954514 -0.02324283 0 -0.9997298 -0.5563902 0 0.8309212 -0.957188 0 -0.2894668 -0.01009541 0 0.999949 0.7375293 0 -0.6753151 0.09358752 0 -0.9956111 -0.8119874 0 0.5836749 0.9143764 0 0.4048651 -0.9706319 0 -0.2405694 -0.04806973 0 0.998844 0.9432631 0 -0.3320462 0.2506276 0 -0.9680836 -0.9963685 0 0.08514602 0.4296381 0 0.9030012 -0.8466839 0 0.5320962 0.8747573 0 0.4845614 -0.4194347 0 -0.9077855 0.2349171 0 -0.9720154 -0.9975108 0 0.07051424 0.4919652 0 0.8706149 0.9706581 0 0.2404637 -0.04662679 0 -0.9989124 -0.7359193 0 0.6770692 0.9644213 0 0.26437 0.2696508 0 -0.9629582 -0.9875399 0 0.1573688 0.9948033 0 0.1018158 -0.4619211 0 -0.886921 -0.209283 0 0.9778551 0.4143447 0 -0.9101201 -0.946014 0 -0.3241258 0.3347005 0 0.9423246 -0.9445801 0 0.3282811 0.8594803 0 0.5111689 -0.2434303 0 -0.9699184 0.9844111 0 0.1758829 -0.1235871 0 -0.9923337 -0.7613388 0 0.6483543 0.5290734 0 -0.8485761 -0.6448127 0 -0.7643406 0.3900229 0 0.9208052 0.6151708 0 0.7883939 -0.2354346 0 -0.9718902 -0.9859185 0 -0.1672263 -0.5979764 0 0.8015137 0.9848991 0 0.1731294 -0.4821068 0 -0.8761125 0.9771637 0 0.212488 0.06556033 0 -0.9978486 -0.7683912 0 0.6399805 -0.09945176 0 0.9950424 0.9902257 0 -0.1394741 -0.6869187 0 -0.7267343 0.9440159 0 0.3299001 0.1762343 0 -0.9843482 -0.9724233 0 0.233223 -0.7622905 0 -0.647235 -0.1087008 0 0.9940745 0.9483544 0 -0.3172128 0.1651492 0 -0.9862686 -0.9899899 0 0.1411384 0.6576635 0 0.7533119 0.1462478 0 -0.989248 -0.9853078 0 0.1707877 0.7923315 0 0.6100908 -0.9866999 0 -0.1625525 -0.1341348 0 0.9909631 0.8929287 0 -0.4501981 -0.983532 0 -0.180734 -0.09383843 0 0.9955874 0.8189466 0 -0.5738697 -0.3624607 0 0.9319991 0.9994425 0 -0.03338833 -0.7428613 0 -0.6694454 -0.9861235 0 -0.1660136 -0.1457455 0 0.9893221 0.8801884 0 -0.4746245 -0.9108782 0 0.4126753 0.8772072 0 0.480112 0.5559033 0 -0.8312469 0.3037278 0 -0.9527588 -0.6477678 0 0.7618379 0.9527879 0 0.3036368 -0.1850578 0 0.9827276 0.9864899 0 -0.163822 -0.4327176 0 -0.9015295 -0.992982 0 0.1182652 0.4494613 0 0.8932998 0.4845829 0 -0.8747454 -0.03505763 0 0.9993853 0.8571191 0 -0.5151182 -0.9712918 0 -0.2378913 0.9997619 0 0.02181907 -0.07724918 0 -0.9970118 -0.7891397 0 0.6142138 -0.256427 0 0.9665636 0.9865323 0 -0.1635668 -0.216317 0 -0.9763232 -0.9999023 0 -0.01397492 0.4192469 0 0.9078723 0.6045591 0 -0.7965603 0.9867749 0 0.1620967 0.08347404 0 -0.99651 -0.7951508 0 0.6064117 -0.9749377 0 -0.222478 -0.2548721 0 0.9669748 0.9266031 0 -0.3760408 -0.9163586 0 0.4003584 0.8768492 0 0.4807654 0.4291804 0 -0.9032188 -0.7365238 0 0.6764116 0.9982524 0 0.05909478 0.3032005 0 0.9529268 -0.9909522 0 -0.1342154 0.6352131 0 0.7723369 -0.6681094 0 0.744063 -0.9536713 0 -0.3008505 0.3116465 0 0.9501981 -0.7375828 0 0.6752567 -0.8711003 0 -0.4911052 -0.173315 0 0.9848664 -0.8836294 0 0.468187 0.6583691 0 -0.7526952 -0.9302683 0 0.36688 -0.8097735 0 -0.5867426 0.7446946 0 -0.6674054 -0.9219092 0 -0.3874059 -0.5541986 0 -0.8323845 0.689512 0 -0.7242743 -0.9979999 0 -0.06321501 -0.3867285 0 -0.9221936 0.001628058 0 -0.9999987 -0.7723559 0 0.63519 -0.6954442 0 -0.7185801 -0.7365164 0 -0.6764197 -0.09098388 0 0.9958524 -0.9626941 0 0.2705922 -0.9987302 0 -0.05037811 0.1460457 0 0.9892778 -0.7546122 0 0.656171 0.1188344 0 -0.9929141 -0.9958091 0 0.09145646 -0.7706665 0 -0.6372387 0.3582831 0 -0.933613 -0.9943375 0 0.1062679 -0.6090937 0 -0.7930982 -0.08709028 0 -0.9962004 -0.8830664 0 0.4692481 -0.8418539 0 -0.5397055 0.8991502 0 0.4376402 -0.2658676 0 -0.9640096 0.8298329 0 -0.558012 0.9083758 0 0.4181548 -0.4139535 0 -0.910298 0.6930456 0 -0.7208937 -0.8871729 0 -0.4614371 -0.08709918 0 0.9961996 -0.8457491 0 0.5335807 -0.9225477 0 -0.3858831 0.4281502 0 0.9037076 -0.7484043 0 0.6632427 -0.4752855 0 0.8798316 0.9412048 0 -0.3378365 0.7959923 0 0.6053067 -0.2658572 0 0.9640124 0.9025561 0 -0.4305724 0.8337395 0 0.5521579 -0.3706062 0 0.9287901 0.9858884 0 -0.1674039 0.7545796 0 0.6562085 -0.1925907 0 0.9812792 0.5749917 0 -0.8181593 0.9779864 0 -0.2086688 0.9999789 0 0.006500896 -0.18976 0 -0.9818305 0.8403171 0 -0.5420951 0.08310787 0 -0.9965406 -0.9114505 0 0.4114098 -0.7898099 0 -0.6133517 0.6867957 0 0.7268506 0.3398583 0 -0.9404767 0.7681708 0 -0.640245 0.6894583 0 0.7243254 0.08511175 0 -0.9963714 0.9444146 0 -0.3287568 -0.04384272 0 0.9990384 0.872593 0 -0.488448 0.8014101 0 0.5981152 0.3799462 0 -0.9250086 -0.8889165 0 0.4580693 -0.6925106 0 -0.7214077 -0.1710662 0 0.9852595 0.8525259 0 -0.522685 0.84061 0 0.5416408 0.3717652 0 -0.9283268 -0.8814995 0 0.4721849 -0.6361469 0 -0.771568 0.9988697 0 -0.04753328 -0.5661824 0 -0.82428 0.4832369 0 -0.8754896 0.3452767 0 -0.9385009 -0.9833726 0 0.1815994 -0.8106172 0 -0.5855764 0.9857845 0 0.1680144 -0.03411903 0 -0.9994178 0.8075697 0 -0.5897721 -0.7633139 0 -0.6460278 -0.3753925 0 0.9268659 -0.999964 0 -0.008486826 0.9953698 0 0.09611953 -0.0581936 0 -0.9983053 0.7196212 0 -0.6943668 -0.3588286 0 0.9334035 0.8483406 0 -0.5294509 0.6501888 0 0.7597727 -0.7436303 0 0.668591 0.9999985 0 0.001755239 0.7716804 0 0.6360105 0.3419782 0 0.9397079 0.6868025 0 -0.7268441 0.7711721 0 0.6366268 0.8491922 0 0.5280838 -0.1710654 0 -0.9852597 0.8479311 0 -0.5301064 -0.6928129 0 -0.7211174 -0.5668835 0 0.823798 -0.9960721 0 -0.08854568 -0.08373505 0 0.9964881 0.9130511 0 -0.4078453 0.7802333 0 0.6254886 0.5749936 0 0.8181579 -0.1883853 0 -0.9820952 0.9801832 0 0.1980929 0.0702395 0 0.9975302 0.7866072 0 0.6174538 0.4695652 0 0.8828978 -0.7804088 0 -0.6252696 0.1694881 0 0.9855322 -0.9246234 0 0.3808826 -0.3822353 0 0.924065 0.9966347 0 -0.08197061 0.6423362 0 0.766423 -0.9968346 0 -0.07950289 0.4267534 0 0.904368 -0.6563784 0 0.7544319 -0.6815183 0 0.731801 0.9932318 0 -0.1161488 0.7164668 0 0.6976212 0.6241573 0 -0.7812987 -0.9989098 0 -0.04668186 -0.5119238 0 -0.8590309 0.9965347 0 0.08317767 -0.4273744 0 -0.9040747 0.659792 0 -0.7514482 0.9989496 0 0.04582173 -0.6047074 0 -0.7964477 0.7259875 0 -0.6877079 0.6535053 0 -0.7569219 -0.9989879 0 0.04498065 -0.7591217 0 -0.6509487 0.4758962 0 -0.8795014 -0.9967409 0 0.08066932 -0.6733447 0 -0.7393287 -0.9833722 0 -0.1816016 0.3389521 0 0.9408036 -0.8030836 0 0.5958664 0.3116435 0 -0.9501991 -0.9536717 0 0.3008492 -0.7375831 0 -0.6752563 -0.3753937 0 -0.9268654 -0.7674641 0 0.641092 -0.9998888 0 0.01491487 0.7866164 0 -0.617442 0.06392044 0 -0.997955 0.4707874 0 -0.8822467 -0.9942971 0 -0.1066459 0.03496143 0 0.9993887 -0.6768033 0 0.7361639 0.1694802 0 -0.9855336 -0.7829653 0 0.6220654 -0.9204311 0 -0.3909048 -0.920175 0 0.3915072 0.7446708 0 0.6674319 -0.5669453 0 0.8237554 -0.1623906 0 0.9867266 0.9912777 0 -0.1317897 0.7642836 0 0.6448803 -0.9877818 0 -0.1558433 0.01358099 0 0.9999078 -0.5987234 0 0.8009558 -0.1817444 0 -0.9833458 -0.8711 0 0.4911056 -0.885147 0 -0.4653116 -0.5663753 0 0.8241475 0.9244306 0 -0.3813502 0.780461 0 0.6252044 0.6135879 0 -0.7896265 -0.9992385 0 0.03901928 -0.6594151 0 -0.7517791 -0.5398505 0 -0.8417609 -0.6928195 0 0.7211111 -0.9962053 0 0.08703451 -0.6096513 0 -0.7926698 -0.7526334 0 -0.6584398 -0.1497101 0 0.9887299 -0.1494044 0 0.9887762 0.9817804 0 -0.190019 0.9993605 0 -0.03575808 -0.05516672 0 -0.9984772 0.03597981 0 -0.9993525 -0.9999952 0 -0.003113526 -0.9718403 0 0.2356405 0.8886418 0 0.4586019 0.9579705 0 0.2868667 -0.1148106 0 -0.9933874 -0.1683889 0 -0.9857206 -0.9999981 0 -0.001948922 -0.9982114 0 0.0597829 0.8685341 0 0.4956293 0.8784019 0 0.4779226 0.5355759 0 -0.8444871 0.4162824 0 -0.9092354 -0.9999937 0 0.003551085 -0.9964669 0 -0.08398671 0.7036039 0 0.7105924 0.5493723 0 0.8355777 0.9934614 0 0.1141685 0.9864403 0 0.1641204 -0.1418835 0 -0.9898834 -0.1571694 0 -0.9875717 -0.7013919 0 0.7127759 -0.7590345 0 0.6510504 0.8291891 0 0.5589681 0.8512471 0 0.5247651 -0.007933294 0 -0.9999685 0.2564825 0 -0.9665489 -0.96751 0 0.2528326 -0.9867645 0 0.1621597 0.5982579 0 0.8013036 0.7598588 0 0.6500881 0.0125294 0 -0.9999215 0.06557728 0 -0.9978475 -0.9881267 0 0.1536414 -0.999455 0 0.03301031 -0.160328 0 -0.9870638 -0.2183841 0 -0.9758629 -0.1911336 0 0.981564 -0.1659452 0 0.986135 0.8183429 0 -0.5747303 0.6824625 0 -0.7309206 -0.9999983 0 -0.001819699 -0.9996398 0 0.02683942 -0.03538674 0 0.9993737 0.07653857 0 0.9970666 -0.9998553 0 -0.01700889 -0.9979269 0 0.06435709 0.8647615 0 0.5021829 0.8921058 0 0.4518266 -0.0334379 0 -0.9994408 0.06143878 0 -0.9981109 -0.7930424 0 0.6091665 -0.7397383 0 0.6728947 0.9985165 0 0.05444974 0.9802344 0 0.1978397 0.1834729 0 -0.9830248 0.0475561 0 -0.9988686 -0.6981943 0 0.7159083 -0.5417653 0 0.8405298 -0.2026789 0 -0.9792453 -0.1944773 0 -0.980907 -0.6487762 0 0.7609793 -0.661696 0 0.7497722 -0.1568617 0 0.9876206 -0.1673301 0 0.9859009 0.9612758 0 0.2755882 0.9983357 0 0.05767021 -0.7424532 0 -0.6698979 -0.7194199 0 -0.6945754 -0.102708 0 0.9947116 -0.1315804 0 0.9913055 1 0 0 0.9851502 0 -0.1716947 -0.7774377 0 -0.6289599 -0.7695922 0 -0.6385357 0.1880119 0 -0.9821668 0.2074748 0 -0.9782404 -0.9999981 0 0.001948922 -0.9982114 0 -0.0597827 0.6420234 0 0.7666851 0.6744707 0 0.7383016 0.09435842 0 -0.9955383 0.135424 0 -0.9907877 -0.9999991 0 -0.001343543 -0.9867403 0 0.1623068 0.8440479 0 0.5362678 0.7942983 0 0.607528 -0.9615046 0 -0.274789 -0.9989619 0 -0.04555357 0.1625164 0 0.9867058 0.1459724 0 0.9892887 0.8502559 0 -0.5263695 0.8294877 0 -0.5585249 -0.9991713 0 0.04070353 -0.9894723 0 0.1447222 0.1635305 0 0.9865383 0.1709105 0 0.9852866 0.7400058 0 -0.6726005 0.7414448 0 -0.6710138 -0.9816134 0 0.1908798 -0.9890727 0 -0.1474285 -0.1834729 0 0.9830248 0.001143674 0 0.9999993 0.5296645 0 -0.8482073 0.5350413 0 -0.8448259 -0.7011351 0 0.7130284 -0.6319828 0 0.7749824 -0.1575069 0 0.9875179 0.07316032 0 0.9973202 0.6094792 0 -0.7928021 0.4232691 0 -0.906004 0.01252932 0 0.9999215 -0.1892244 0 0.9819339 0.9981916 0 0.06011259 0.9906397 0 -0.1365028 -0.9562491 0 -0.2925535 -0.9856597 0 -0.1687453 0.9970532 0 0.07671368 0.9857344 0 -0.1683086 -0.2405305 0 -0.9706416 -0.07657724 0 -0.9970637 -0.7289206 0 0.6845982 -0.7180712 0 0.6959697 -0.5813729 0 0.8136372 -0.4910122 0 0.8711527 0.9999799 0 0.006342343 0.9999947 0 -0.003269537 -0.3208454 0 -0.9471316 -0.1912986 0 -0.9815319 -0.8130045 0 0.5822575 -0.6680145 0 0.7441482 0.9999409 0 0.01087405 0.9908206 0 -0.1351836 0.2342585 0 0.9721743 0.1645852 0 0.9863629 0.5841652 0 -0.8116348 0.5238547 0 -0.8518076 -0.7664358 0 0.642321 -0.7331853 0 0.6800289 -0.9869109 0 -0.1612666 -0.9580945 0 0.2864522 -0.007933454 0 0.9999685 0.1675493 0 0.9858637 0.5382065 0 -0.842813 0.3721467 0 -0.9281739 0.9362886 0 0.3512316 0.9980235 0 0.06284217 -0.1389793 0 -0.9902953 -0.0913959 0 -0.9958146 -0.7781739 0 0.6280489 -0.7150387 0 0.6990849 -0.007454708 0 0.9999722 4.25856e-4 0 0.9999999 0.286934 0 -0.9579503 0.03049733 0 -0.9995348 -0.9802758 0 0.1976346 -0.7907222 0 0.6121752 0.9536709 0 -0.3008517 0.993734 0 0.1117707 -0.437644 0 -0.8991483 -0.5252904 0 -0.850923 -0.9786406 0 0.2055785 -0.9993515 0 0.03600938 0.4228953 0 0.9061785 0.5438277 0 0.8391969 0.9006613 0 0.4345218 0.9988952 0 0.04699444 -0.3140607 0 -0.9494029 -0.3934065 0 -0.9193646 0.9683901 0 -0.2494408 0.9175153 0 -0.3977005 -0.1458121 0 0.9893123 0.05308276 0 0.9985901 0.6015859 0 0.7988081 0.6835868 0 0.7298692 -0.2972105 0 -0.954812 -0.5363922 0 -0.8439688 0.1988659 0 0.9800267 0.2799555 0 0.960013 -0.01425476 0 0.9998984 0.04243731 0 0.9990991 -0.9459053 0 -0.324443 -0.9976755 0 -0.06814382 0.1118428 0 0.9937259 -0.02076183 0 0.9997844 0.9871064 0 -0.1600657 0.9227893 0 -0.385305 -0.09583258 0 0.9953975 -0.007714378 0 0.9999702 -0.003378049 0 0.9999943 0.008035516 0 0.9999677 0.06604293 0 -0.9978168 -0.1647806 0 -0.9863302 -0.9999937 0 -0.00354695 -0.9915637 0 0.1296204 0.5881271 0 0.8087685 0.9363928 0 0.3509537 0.1866722 0 -0.9824223 0.1457697 0 -0.9893186 -0.9017783 0 0.432199 -0.861387 0 0.5079493 -0.337943 0 0.9411666 -0.236318 0 0.9716758 0.4070065 0 0.9134253 0.5948231 0 0.8038566 -0.8679914 0 0.4965792 -0.8398207 0 0.542864 0.09272774 0 0.9956915 -0.1471589 0 0.9891129 -0.3580824 0 -0.93369 -0.4731437 0 -0.8809853 -0.9839205 0 -0.1786068 -0.9952648 0 -0.09720103 -0.9199866 0 0.3919498 -0.88504 0 0.4655151 -0.8773524 0 -0.4798467 -0.9462741 0 -0.3233655</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape6-tangents-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape6-binormals" name="qt_gauge_background_Shape6-binormals">
+ <float_array id="qt_gauge_background_Shape6-binormals-array" count="2499">-0.9973308 0 0.0730163 0.9970975 0 0.07613685 -0.2494364 0 0.9683913 -0.9933867 0 -0.1148164 0.9800267 0 0.1988659 -0.1612666 0 -0.9869109 0.987518 0 -0.1575069 -0.9978164 0 0.06605045 -0.9969574 0 -0.07794897 0.9911224 0 -0.1329527 0.9865382 0 0.1635313 -0.9824224 0 0.1866722 0.941168 0 -0.3379394 -0.9336916 0 -0.3580783 0.4965864 0 -0.8679873 -0.970642 0 0.2405291 0.8136386 0 -0.5813711 -0.9022755 0 -0.4311601 0.5822543 0 -0.8130068 0.6348229 0 0.7726577 0.8695557 0 0.4938351 -0.7926674 0 -0.6096544 -0.4798439 0 -0.8773538 0.01847412 0 0.9998294 0.7818302 0 0.6234915 0.76669 0 0.6420175 0.9896266 0 0.1436633 -0.9849367 0 0.1729156 -0.3309706 0 -0.9436411 0.3416002 0 0.9398454 -0.9792452 0 -0.2026789 0.9893125 0 -0.1458112 -0.9870965 0 -0.1601272 0.9856679 0 -0.1686975 -0.5148087 0 -0.8573052 0.9983306 0 -0.05775878 -0.9579518 0 0.2869294 0.9061794 0 0.4228935 -0.3232603 0 0.9463101 0.434529 0 0.9006578 0.8013057 0 0.5982553 -0.1432746 0 0.989683 0.701557 0 0.7126133 -0.0765832 0 -0.9970632 0.5589636 0 0.8291923 -0.8444863 0 0.5355773 0.9711102 0 0.2386316 -0.8427653 0 -0.5382814 -0.5747256 0 0.8183461 0.9878754 0 -0.1552488 -0.5571961 0 -0.830381 0.05767287 0 0.9983355 0.9854991 0 -0.1696807 -0.6757187 0 -0.7371596 0.08533276 0 0.9963526 0.9970368 0 0.07692685 -0.842183 0 -0.5391918 0.7336416 0 0.6795366 0.9985902 0 0.05308226 -0.8435708 0 -0.537018 0.9987798 0 0.0493844 -0.01092507 0 -0.9999403 -0.2525644 0 0.9675801 0 0 -1 -0.9887909 0 0.149307 0.6724914 0 0.740105 0.8391969 0 0.5438277 0.002601262 0 -0.9999966 -0.9633425 0 0.2682748 0.6500971 0 0.7598512 -0.03973255 0 -0.9992104 0.9889113 0 -0.1485082 -0.819447 0 -0.573155 0.6536641 0 0.7567849 0.04698114 0 0.9988959 0.9983777 0 -0.05693885 -0.8909435 0 -0.4541143 0.1909133 0 -0.981607 -0.993628 0 0.1127102 0.6864556 0 0.7271717 0.9999894 0 0.004603534 -0.9863315 0 -0.1647734 0.35656 0 0.9342724 -0.1263825 0 -0.9919816 -0.8749623 0 0.4841911 0.08506295 0 0.9963757 0.8711541 0 -0.4910099 0.2864522 0 -0.9580945 -0.9382035 0 0.3460843 -0.3233728 0 -0.9462717 0.9973214 0 0.07314351 0.7743793 0 -0.6327217 -0.9090273 0 0.4167369 0.9716736 0 -0.2363271 0.9999774 0 -0.006737821 -0.2136204 0 0.9769167 0.9985363 0 -0.05408728 -0.2534434 0 -0.9673502 0.999054 0 0.04348629 0.9999995 0 9.88787e-4 -0.9995351 0 0.03048817 0.05008561 0 0.998745 0.6111869 0 -0.7914863 -0.9857213 0 -0.1683847 0.4779239 0 0.8784013 0.9600101 0 0.2799655 0.8698123 0 -0.4933828 0.5247681 0 0.8512452 0.9999689 0 -0.007882126 -0.9092343 0 0.416285 -0.1057752 0 0.9943901 0.4387551 0 0.8986067 -0.3977067 0 0.9175126 -0.7309255 0 0.6824573 0.9919436 0 0.1266803 -0.1041508 0 -0.9945616 -0.9998573 0 0.01689368 0.07801569 0 0.9969522 0.4195017 0 -0.9077545 -0.9893193 0 0.1457649 0.02291678 0 0.9997374 0.5079505 0 -0.8613863 -0.8809853 0 -0.4731437 -0.0326473 0 0.999467 0.7672368 0 -0.641364 0.08678506 0 -0.9962271 -0.9949912 0 0.09996263 0.6798372 0 0.7333631 0.5428631 0 -0.8398213 -0.9958072 0 -0.09147761 0.2276039 0 0.9737538 0.7441588 0 -0.6680027 -0.9993612 0 -0.03573807 0.05757955 0 0.998341 -0.992772 0 0.120016 0.979224 0 0.2027817 -0.658447 0 -0.7526271 0.006430796 0 0.9999794 0.999853 0 0.01715372 0.009697348 0 0.999953 0.5040795 0 -0.8636574 -0.9999489 0 0.01011315 0.6611376 0 0.7502646 0.05666989 0 -0.998393 -0.9952769 0 -0.09707741 0.7936171 0 0.6084175 -0.978855 0 0.204556 0.7552894 0 0.6553916 0.9863631 0 0.1645841 0.1447255 0 -0.9894719 -0.6773239 0 0.7356849 0.9929122 0 0.1188498 -0.05500885 0 -0.998486 -0.6624345 0 0.7491199 -0.9792268 0 -0.2027678 -0.02291687 0 0.9997374 0.7441299 0 -0.668035 -0.9935315 0 -0.1135575 0.05204925 0 0.9986446 0.5978563 0 -0.8016034 -0.1458009 0 0.989314 0.6699352 0 0.7424196 -0.08353308 0 0.9965051 -0.330486 0 0.943811 -0.4912802 0 0.8710016 -0.8182968 0 -0.574796 -0.6481938 0 -0.7614754 -0.6779203 0 -0.7351354 -0.9971882 0 -0.07493816 -0.6701311 0 0.7422428 -0.1809305 0 0.983496 -0.9450234 0 -0.3270027 -0.9469457 0 -0.3213936 -0.990405 0 -0.1381956 0.443473 0 -0.8962877 0.3999158 0 -0.9165519 -0.4838495 0 0.8751513 -0.3976474 0 0.9175383 0.8714372 0 0.4905071 0.9359519 0 0.3521279 0.9402767 0 0.3404112 0.9785312 0 0.2060989 0.05527083 0 -0.9984714 -0.9694709 0 -0.245207 0.8243541 0 -0.5660746 0.6790665 0 -0.7340768 0.9845166 0 0.1752915 -0.9222018 0 -0.3867091 0.9820325 0 0.1887118 -0.9313104 0 -0.3642264 -0.107992 0 -0.9941518 -0.9260268 0 -0.3774579 0.437978 0 -0.8989857 -0.6673824 0 0.7447152 0.2811214 0 -0.9596723 0.9419242 0 0.3358257 0.6655625 0 0.7463422 0.968997 0 -0.2470728 0.640734 0 -0.767763 -0.7391481 0 0.6735429 0.9697083 0 0.2442661 0.7867845 0 -0.6172278 0.992092 0 0.1255134 -0.6207494 0 0.7840091 0.9118087 0 0.4106152 -0.2431123 0 0.9699982 0.7361577 0 0.67681 -0.8077682 0 -0.5895004 0.2400406 0 -0.9707628 0.1338769 0 -0.990998 -0.77561 0 -0.6312125 -0.874176 0 -0.4856093 -0.1221939 0 0.9925063 -0.8540705 0 -0.5201573 -0.9819341 0 0.1892235 -0.6125483 0 -0.7904332 -0.316812 0 0.9484884 -0.9958413 0 -0.09110636 0.2398066 0 0.9708207 0.9458151 0 0.3247058 -0.3728957 0 0.9278733 -0.9999969 0 -0.002526494 0.8501988 0 0.526462 -0.7576019 0 -0.652717 -0.943583 0 0.3311363 0.804382 0 -0.5941125 -0.9683169 0 -0.2497246 0.08497296 0 0.9963834 0.9875898 0 0.1570557 -0.05819508 0 -0.9983053 -0.4893574 0 0.8720834 0.9999997 0 -7.88984e-4 0.05704373 0 -0.9983717 -0.6160926 0 0.7876737 0.8404074 0 0.5419553 0.1099661 0 -0.9939353 -0.8616646 0 0.5074783 -0.1481137 0 0.9889703 0.9973709 0 0.07246649 -0.5932641 0 -0.8050079 -0.5567393 0 0.8306873 0.9761131 0 0.2172631 -0.1047104 0 -0.9945028 -0.8263136 0 0.5632105 0.9870065 0 0.1606803 -0.01544336 0 -0.9998809 -0.1928037 0 0.9812374 0.9936108 0 -0.1128613 -0.9319044 0 -0.3627039 0.5455604 0 0.8380716 0.1524413 0 -0.9883125 -0.9994207 0 0.0340334 0.9914645 0 0.1303777 -0.05425077 0 -0.9985273 -0.6215237 0 0.7833954 -0.08209039 0 0.9966249 0.997383 0 -0.07230029 -0.5620542 0 -0.8271004 -0.2463413 0 0.9691831 0.9953067 0 0.09677083 -0.7006873 0 -0.7134686 -0.05221634 0 0.9986359 0.9708133 0 -0.2398363 -0.7232437 0 -0.6905929 -0.954023 0 -0.2997336 -0.1785125 0 0.9839376 0.751956 0 -0.6592132 -0.9772319 0 -0.212174 -0.05761335 0 0.9983391 0.732331 0 -0.6809489 0.9364589 0 0.3507772 0.1190889 0 -0.9928837 -0.8385478 0 0.5448281 0.9741689 0 0.2258208 0.06177109 0 -0.9980904 -0.6909499 0 0.7229027 0.1822971 0 -0.9832435 -0.9998373 0 -0.01803745 0.5400739 0 0.8416177 0.05119836 0 -0.9986886 -0.995652 0 0.09315162 0.6424146 0 0.7663573 0.008870807 0 -0.9999607 -0.9963774 0 -0.08504279 0.7607724 0 0.6490188 -0.6295288 0 -0.7769772 -0.9989465 0 0.04589012 0.840666 0 0.5415542 -0.9234225 0 -0.3837852 0.06304091 0 0.9980111 0.4123427 0 -0.9110289 -0.1113364 0 0.9937828 0.9929059 0 -0.118904 -0.6519178 0 -0.7582896 -0.8372074 0 -0.5468856 -0.1732772 0 0.9848731 0.9974138 0 -0.07187282 -0.5111335 0 -0.8595014 -0.1183406 0 0.9929731 0.9954779 0 0.09499424 0.1026869 0 -0.9947137 -0.9903792 0 0.1383811 0.759694 0 0.6502807 -0.2054306 0 0.9786717 0.9999424 0 0.01073567 -0.6460432 0 -0.763301 -0.01954514 0 -0.999809 -0.9997299 0 0.02324283 0.8309212 0 0.5563902 -0.2894668 0 0.9571881 0.9999491 0 0.01009541 -0.6753151 0 -0.7375293 -0.9956111 0 -0.09358753 0.583675 0 0.8119874 0.4048651 0 -0.9143764 -0.2405694 0 0.970632 0.9988441 0 0.04806973 -0.3320462 0 -0.9432632 -0.9680836 0 -0.2506276 0.08514603 0 0.9963686 0.9030012 0 -0.4296381 0.5320961 0 0.8466839 0.4845614 0 -0.8747573 -0.9077856 0 0.4194347 -0.9720154 0 -0.2349171 0.07051425 0 0.9975108 0.8706149 0 -0.4919652 0.2404637 0 -0.9706582 -0.9989124 0 0.04662679 0.6770692 0 0.7359194 0.26437 0 -0.9644215 -0.9629582 0 -0.2696508 0.1573689 0 0.9875399 0.1018158 0 -0.9948034 -0.8869211 0 0.4619211 0.9778551 0 0.209283 -0.9101201 0 -0.4143447 -0.3241258 0 0.946014 0.9423246 0 -0.3347005 0.3282811 0 0.9445801 0.511169 0 -0.8594804 -0.9699185 0 0.2434303 0.1758829 0 -0.9844111 -0.9923338 0 0.1235871 0.6483543 0 0.7613388 -0.8485762 0 -0.5290734 -0.7643408 0 0.6448127 0.9208052 0 -0.3900229 0.7883939 0 -0.6151708 -0.9718903 0 0.2354346 -0.1672263 0 0.9859185 0.8015137 0 0.5979764 0.1731294 0 -0.9848992 -0.8761125 0 0.4821068 0.212488 0 -0.9771637 -0.9978486 0 -0.06556033 0.6399804 0 0.7683912 0.9950424 0 0.09945177 -0.1394741 0 -0.9902257 -0.7267343 0 0.6869187 0.3299001 0 -0.9440159 -0.9843482 0 -0.1762343 0.233223 0 0.9724233 -0.647235 0 0.7622905 0.9940745 0 0.1087008 -0.3172128 0 -0.9483545 -0.9862687 0 -0.1651493 0.1411383 0 0.9899899 0.7533119 0 -0.6576635 -0.989248 0 -0.1462478 0.1707877 0 0.9853079 0.6100908 0 -0.7923315 -0.1625525 0 0.9866999 0.9909631 0 0.1341348 -0.4501981 0 -0.8929288 -0.180734 0 0.9835321 0.9955875 0 0.09383843 -0.5738697 0 -0.8189467 0.9319991 0 0.3624607 -0.03338833 0 -0.9994425 -0.6694454 0 0.7428613 -0.1660136 0 0.9861234 0.9893221 0 0.1457455 -0.4746245 0 -0.8801884 0.4126753 0 0.9108782 0.480112 0 -0.8772072 -0.831247 0 -0.5559033 -0.9527588 0 -0.3037278 0.7618378 0 0.6477678 0.3036368 0 -0.9527879 0.9827277 0 0.1850578 -0.163822 0 -0.98649 -0.9015296 0 0.4327176 0.1182652 0 0.9929821 0.8932998 0 -0.4494613 -0.8747454 0 -0.4845829 0.9993853 0 0.03505763 -0.5151182 0 -0.8571191 -0.2378913 0 0.9712918 0.02181907 0 -0.9997619 -0.9970118 0 0.07724918 0.6142138 0 0.7891397 0.9665636 0 0.256427 -0.1635668 0 -0.9865323 -0.9763232 0 0.216317 -0.01397493 0 0.9999024 0.9078723 0 -0.4192469 -0.7965603 0 -0.6045591 0.1620967 0 -0.986775 -0.99651 0 -0.08347404 0.6064117 0 0.7951509 -0.222478 0 0.9749378 0.9669749 0 0.2548721 -0.3760408 0 -0.9266031 0.4003584 0 0.9163586 0.4807654 0 -0.8768492 -0.9032189 0 -0.4291804 0.6764116 0 0.7365238 0.05909478 0 -0.9982524 0.9529268 0 -0.3032005 -0.1342154 0 0.9909522 0.7723369 0 -0.6352131 0.7440631 0 0.6681095 -0.3008505 0 0.9536714 0.9501982 0 -0.3116465 0.6752567 0 0.7375828 -0.4911052 0 0.8711003 0.9848666 0 0.173315 0.468187 0 0.8836294 -0.7526953 0 -0.6583691 0.36688 0 0.9302683 -0.5867426 0 0.8097735 -0.6674054 0 -0.7446947 -0.387406 0 0.9219093 -0.8323846 0 0.5541986 -0.7242743 0 -0.689512 -0.06321502 0 0.998 -0.9221936 0 0.3867285 -0.9999987 0 -0.001628058 0.63519 0 0.7723559 -0.7185801 0 0.6954442 -0.6764197 0 0.7365164 0.9958524 0 0.09098388 0.2705922 0 0.9626942 -0.05037811 0 0.9987303 0.9892778 0 -0.1460457 0.656171 0 0.7546123 -0.9929141 0 -0.1188344 0.09145646 0 0.9958091 -0.6372387 0 0.7706665 -0.9336131 0 -0.3582831 0.1062679 0 0.9943376 -0.7930983 0 0.6090937 -0.9962004 0 0.08709028 0.4692481 0 0.8830664 -0.5397055 0 0.841854 0.4376402 0 -0.8991502 -0.9640096 0 0.2658676 -0.5580119 0 -0.8298329 0.4181548 0 -0.9083758 -0.910298 0 0.4139535 -0.7208937 0 -0.6930456 -0.4614371 0 0.8871729 0.9961997 0 0.08709918 0.5335807 0 0.8457491 -0.3858831 0 0.9225478 0.9037077 0 -0.4281503 0.6632428 0 0.7484043 0.8798317 0 0.4752855 -0.3378365 0 -0.9412048 0.6053067 0 -0.7959924 0.9640124 0 0.2658572 -0.4305724 0 -0.9025561 0.5521579 0 -0.8337395 0.9287901 0 0.3706062 -0.1674039 0 -0.9858885 0.6562085 0 -0.7545797 0.9812793 0 0.1925907 -0.8181593 0 -0.5749916 -0.2086688 0 -0.9779864 0.006500896 0 -0.9999789 -0.9818305 0 0.18976 -0.5420951 0 -0.8403171 -0.9965406 0 -0.08310787 0.4114098 0 0.9114505 -0.6133516 0 0.7898099 0.7268506 0 -0.6867957 -0.9404767 0 -0.3398583 -0.640245 0 -0.7681708 0.7243254 0 -0.6894583 -0.9963715 0 -0.08511175 -0.3287567 0 -0.9444147 0.9990385 0 0.04384272 -0.4884481 0 -0.872593 0.5981152 0 -0.8014101 -0.9250086 0 -0.3799462 0.4580693 0 0.8889165 -0.7214077 0 0.6925106 0.9852597 0 0.1710662 -0.522685 0 -0.8525259 0.5416408 0 -0.84061 -0.9283268 0 -0.3717652 0.4721849 0 0.8814996 -0.7715681 0 0.6361468 -0.04753328 0 -0.9988697 -0.82428 0 0.5661824 -0.8754897 0 -0.4832369 -0.938501 0 -0.3452767 0.1815995 0 0.9833727 -0.5855764 0 0.8106173 0.1680144 0 -0.9857846 -0.9994178 0 0.03411902 -0.5897722 0 -0.8075697 -0.6460278 0 0.7633139 0.9268661 0 0.3753925 -0.008486826 0 0.999964 0.09611952 0 -0.9953698 -0.9983054 0 0.0581936 -0.6943668 0 -0.7196212 0.9334035 0 0.3588286 -0.5294508 0 -0.8483406 0.7597728 0 -0.6501888 0.668591 0 0.7436303 0.001755239 0 -0.9999985 0.6360105 0 -0.7716805 0.9397079 0 -0.3419783 -0.7268441 0 -0.6868024 0.6366269 0 -0.7711721 0.5280838 0 -0.8491923 -0.9852597 0 0.1710653 -0.5301064 0 -0.8479311 -0.7211174 0 0.6928129 0.8237981 0 0.5668835 -0.08854568 0 0.9960721 0.9964881 0 0.08373506 -0.4078453 0 -0.9130511 0.6254886 0 -0.7802333 0.8181579 0 -0.5749937 -0.9820952 0 0.1883853 0.1980929 0 -0.9801833 0.9975302 0 -0.0702395 0.6174538 0 -0.7866072 0.8828978 0 -0.4695652 -0.6252696 0 0.7804089 0.9855323 0 -0.1694881 0.3808826 0 0.9246235 0.9240651 0 0.3822353 -0.08197062 0 -0.9966348 0.766423 0 -0.6423362 -0.07950289 0 0.9968346 0.9043681 0 -0.4267534 0.7544319 0 0.6563783 0.731801 0 0.6815183 -0.1161488 0 -0.9932319 0.6976212 0 -0.7164668 -0.7812988 0 -0.6241573 -0.04668186 0 0.9989099 -0.8590309 0 0.5119238 0.08317767 0 -0.9965348 -0.9040748 0 0.4273744 -0.7514482 0 -0.6597921 0.04582173 0 -0.9989497 -0.7964477 0 0.6047074 -0.6877078 0 -0.7259876 -0.7569219 0 -0.6535054 0.04498065 0 0.9989879 -0.6509487 0 0.7591217 -0.8795015 0 -0.4758963 0.08066932 0 0.996741 -0.7393287 0 0.6733447 -0.1816017 0 0.9833723 0.9408037 0 -0.3389521 0.5958664 0 0.8030836 -0.9501992 0 -0.3116435 0.3008492 0 0.9536718 -0.6752563 0 0.7375832 -0.9268655 0 0.3753937 0.6410919 0 0.7674641 0.01491487 0 0.9998888 -0.617442 0 -0.7866164 -0.997955 0 -0.06392044 -0.8822468 0 -0.4707874 -0.1066459 0 0.9942971 0.9993888 0 -0.03496143 0.7361639 0 0.6768033 -0.9855336 0 -0.1694802 0.6220654 0 0.7829653 -0.3909048 0 0.9204311 0.3915072 0 0.920175 0.667432 0 -0.7446708 0.8237554 0 0.5669453 0.9867266 0 0.1623906 -0.1317897 0 -0.9912778 0.6448804 0 -0.7642835 -0.1558433 0 0.9877818 0.9999078 0 -0.01358099 0.800956 0 0.5987235 -0.9833459 0 0.1817444 0.4911056 0 0.8711001 -0.4653116 0 0.885147 0.8241475 0 0.5663753 -0.3813502 0 -0.9244307 0.6252044 0 -0.780461 -0.7896265 0 -0.6135879 0.03901929 0 0.9992386 -0.7517791 0 0.6594151 -0.8417609 0 0.5398505 0.7211111 0 0.6928195 0.08703451 0 0.9962053 -0.7926698 0 0.6096513 -0.6584398 0 0.7526335 0.98873 0 0.1497101 0.9887761 0 0.1494044 -0.190019 0 -0.9817805 -0.03575807 0 -0.9993606 -0.9984772 0 0.05516673 -0.9993525 0 -0.03597981 -0.003113526 0 0.9999952 0.2356405 0 0.9718403 0.458602 0 -0.8886419 0.2868667 0 -0.9579705 -0.9933874 0 0.1148106 -0.9857206 0 0.1683889 -0.001948922 0 0.9999981 0.0597829 0 0.9982114 0.4956294 0 -0.8685342 0.4779226 0 -0.878402 -0.8444872 0 -0.5355759 -0.9092355 0 -0.4162825 0.003551085 0 0.9999937 -0.08398671 0 0.9964669 0.7105924 0 -0.7036039 0.8355777 0 -0.5493723 0.1141685 0 -0.9934614 0.1641204 0 -0.9864404 -0.9898834 0 0.1418835 -0.9875718 0 0.1571694 0.7127759 0 0.7013919 0.6510504 0 0.7590345 0.5589681 0 -0.8291891 0.5247651 0 -0.8512471 -0.9999685 0 0.007933294 -0.9665489 0 -0.2564825 0.2528326 0 0.96751 0.1621597 0 0.9867646 0.8013037 0 -0.5982579 0.6500881 0 -0.7598588 -0.9999216 0 -0.0125294 -0.9978475 0 -0.06557728 0.1536414 0 0.9881267 0.03301031 0 0.9994551 -0.9870639 0 0.160328 -0.9758629 0 0.2183841 0.981564 0 0.1911336 0.986135 0 0.1659452 -0.5747303 0 -0.8183429 -0.7309206 0 -0.6824625 -0.001819699 0 0.9999984 0.02683942 0 0.9996398 0.9993737 0 0.03538674 0.9970666 0 -0.07653858 -0.01700889 0 0.9998553 0.06435709 0 0.997927 0.5021828 0 -0.8647615 0.4518267 0 -0.8921058 -0.9994409 0 0.0334379 -0.9981109 0 -0.06143878 0.6091665 0 0.7930424 0.6728947 0 0.7397383 0.05444974 0 -0.9985165 0.1978397 0 -0.9802344 -0.9830248 0 -0.1834729 -0.9988686 0 -0.0475561 0.7159083 0 0.6981943 0.8405299 0 0.5417653 -0.9792452 0 0.2026789 -0.9809071 0 0.1944773 0.7609793 0 0.6487762 0.7497723 0 0.661696 0.9876207 0 0.1568617 0.985901 0 0.1673301 0.2755882 0 -0.9612759 0.05767021 0 -0.9983357 -0.6698979 0 0.7424532 -0.6945754 0 0.7194199 0.9947116 0 0.102708 0.9913056 0 0.1315804 0 0 -1 -0.1716947 0 -0.9851502 -0.62896 0 0.7774377 -0.6385357 0 0.7695922 -0.9821668 0 -0.1880119 -0.9782404 0 -0.2074748 0.001948922 0 0.9999982 -0.05978271 0 0.9982114 0.7666851 0 -0.6420233 0.7383016 0 -0.6744707 -0.9955384 0 -0.09435843 -0.9907877 0 -0.135424 -0.001343543 0 0.9999991 0.1623068 0 0.9867404 0.5362678 0 -0.8440479 0.607528 0 -0.7942982 -0.274789 0 0.9615046 -0.04555357 0 0.998962 0.9867058 0 -0.1625164 0.9892887 0 -0.1459724 -0.5263695 0 -0.850256 -0.558525 0 -0.8294877 0.04070353 0 0.9991713 0.1447222 0 0.9894723 0.9865383 0 -0.1635305 0.9852867 0 -0.1709105 -0.6726005 0 -0.7400058 -0.6710138 0 -0.7414448 0.1908798 0 0.9816135 -0.1474285 0 0.9890728 0.9830248 0 0.1834729 0.9999994 0 -0.001143674 -0.8482073 0 -0.5296645 -0.8448259 0 -0.5350413 0.7130284 0 0.7011351 0.7749825 0 0.6319829 0.987518 0 0.1575069 0.9973203 0 -0.07316033 -0.792802 0 -0.6094792 -0.906004 0 -0.4232691 0.9999215 0 -0.01252932 0.981934 0 0.1892245 0.06011259 0 -0.9981916 -0.1365028 0 -0.9906397 -0.2925536 0 0.9562492 -0.1687453 0 0.9856597 0.07671367 0 -0.9970531 -0.1683086 0 -0.9857345 -0.9706417 0 0.2405305 -0.9970636 0 0.07657725 0.6845982 0 0.7289206 0.6959697 0 0.7180712 0.8136373 0 0.581373 0.8711528 0 0.4910122 0.006342343 0 -0.9999799 -0.003269538 0 -0.9999948 -0.9471316 0 0.3208454 -0.981532 0 0.1912987 0.5822574 0 0.8130045 0.7441483 0 0.6680145 0.01087405 0 -0.9999409 -0.1351836 0 -0.9908206 0.9721744 0 -0.2342585 0.9863629 0 -0.1645852 -0.8116349 0 -0.5841652 -0.8518077 0 -0.5238548 0.642321 0 0.7664359 0.6800289 0 0.7331853 -0.1612666 0 0.9869109 0.2864522 0 0.9580945 0.9999685 0 0.007933455 0.9858637 0 -0.1675493 -0.842813 0 -0.5382065 -0.928174 0 -0.3721468 0.3512316 0 -0.9362886 0.06284218 0 -0.9980235 -0.9902953 0 0.1389793 -0.9958146 0 0.0913959 0.6280489 0 0.7781739 0.6990849 0 0.7150387 0.9999723 0 0.007454709 1 0 -4.25856e-4 -0.9579504 0 -0.286934 -0.9995349 0 -0.03049733 0.1976346 0 0.9802758 0.6121752 0 0.7907223 -0.3008517 0 -0.953671 0.1117707 0 -0.9937341 -0.8991483 0 0.437644 -0.8509231 0 0.5252904 0.2055785 0 0.9786407 0.03600938 0 0.9993514 0.9061785 0 -0.4228953 0.8391969 0 -0.5438277 0.4345218 0 -0.9006614 0.04699444 0 -0.9988952 -0.9494029 0 0.3140607 -0.9193646 0 0.3934065 -0.2494408 0 -0.9683901 -0.3977005 0 -0.9175153 0.9893124 0 0.1458121 0.9985902 0 -0.05308276 0.7988082 0 -0.6015859 0.7298692 0 -0.6835868 -0.954812 0 0.2972105 -0.8439689 0 0.5363922 0.9800267 0 -0.1988659 0.960013 0 -0.2799555 0.9998985 0 0.01425476 0.9990991 0 -0.04243731 -0.324443 0 0.9459053 -0.06814382 0 0.9976755 0.993726 0 -0.1118428 0.9997845 0 0.02076183 -0.1600657 0 -0.9871064 -0.385305 0 -0.9227893 0.9953974 0 0.09583259 0.9999703 0 0.007714378 0.9999944 0 0.003378049 0.9999678 0 -0.008035516 -0.9978168 0 -0.06604293 -0.9863303 0 0.1647806 -0.003546951 0 0.9999938 0.1296204 0 0.9915637 0.8087685 0 -0.5881271 0.3509537 0 -0.9363929 -0.9824224 0 -0.1866722 -0.9893186 0 -0.1457697 0.432199 0 0.9017783 0.5079493 0 0.861387 0.9411667 0 0.337943 0.9716758 0 0.236318 0.9134253 0 -0.4070065 0.8038567 0 -0.5948231 0.4965792 0 0.8679914 0.542864 0 0.8398207 0.9956915 0 -0.09272774 0.9891129 0 0.1471589 -0.93369 0 0.3580824 -0.8809853 0 0.4731437 -0.1786068 0 0.9839205 -0.09720103 0 0.9952648 0.3919499 0 0.9199867 0.465515 0 0.88504 -0.4798467 0 0.8773525 -0.3233655 0 0.9462742</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape6-binormals-array" count="833" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape6-map1" name="qt_gauge_background_Shape6-map1">
+ <float_array id="qt_gauge_background_Shape6-map1-array" count="1666">0.823585 0.5 0.1266966 0.5000011 0.5683057 1 1 0.8432242 0 0.7731578 0.5683057 0 0 0.2268427 1 0.1567758 0.8258412 0.53125 0.1226656 0.53125 0.003307323 0.25 0.9518079 0.25 0.07825211 0.125 0.9899296 0.125 0.5 0.00261627 0.47765 0.125 0.2186117 0.0625 0.5122038 0.06055084 0.25 0.05231231 0.2918939 0.07276423 0.2402057 0.1361184 0.8943832 0.0625 0.75 0.01923228 0.7362093 0.06501122 0.7443298 0.1234941 0.5120189 0.2471293 0.07608952 0.375 0.8591027 0.375 0.4925805 0.3932205 0.4934431 0.5231521 0.9518079 0.75 0.003307517 0.75 0.8591027 0.625 0.07609065 0.625 0.4924657 0.6148776 0.5120189 0.7528707 0.9899296 0.875 0.078252 0.875 0.52235 0.875 0.5 0.9973837 0.2186117 0.9375 0.4930339 0.9394492 0.2519236 0.8686991 0.2785448 0.9306694 0.25 0.9476877 0.8943832 0.9375 0.7182079 0.9301932 0.7587013 0.8729415 0.75 0.9807677 0.7909414 0.9501393 0.7163452 0.5190407 0.8333968 0.218872 0.8845228 0.1033354 0.4173018 0.08487511 0.4121527 0.03747414 0.2469328 0.06094866 0.2430791 0.08512621 0.7912943 0.04976502 0.6721449 0.04922607 0.6702521 0.08219341 0.4097966 0.1651958 0.7835822 0.2924431 0.1868276 0.2916134 0.2341148 0.4178447 0.7835822 0.707557 0.7281651 0.5943651 0.2327692 0.594365 0.186828 0.7083867 0.5907199 0.8374119 0.08651538 0.7960032 0.3330149 0.940447 0.4235623 0.8941194 0.1757964 0.8946873 0.2466976 0.9391125 0.793609 0.9159724 0.6638861 0.8940092 0.5226371 0.9797271 0.7274153 0.4178444 0.6072723 0.468951 0.9104428 0.1371948 0.5829842 0.1625182 0.7551203 0.1763466 0.79368 0.08223019 0.3392576 0.1062256 0.3401396 0.05961427 0.1755714 0.1054083 0.5229988 0.02027287 0.61286 0.02564368 0.5764636 0.1057328 0.08629023 0.2040925 0.1019676 0.1607938 0.2465094 0.2111536 0.6195778 0.3369057 0.3565011 0.3369057 0.2496572 0.519041 0.3725632 0.4689513 0.6196344 0.6640711 0.6077991 0.5613223 0.3714867 0.5613223 0.3563939 0.6640711 0.9107249 0.8627353 0.8333968 0.781128 0.7554023 0.8235836 0.1021926 0.8393018 0.4174754 0.8348997 0.2467346 0.7889419 0.411791 0.9625259 0.3330512 0.9166992 0.2430689 0.9166625 0.8848048 0.8965948 0.5830063 0.91605 0.6649024 0.9506782 0.6124983 0.9743563 0.8221916 0.9591339 0.7333329 0.9527348 0.8001941 0.9342868 0.8247131 0.515625 0.6621376 0.5386095 0.6616175 0.4986665 0.975904 0.2033879 0.7823626 0.2540321 0.7789694 0.1989961 0.9421564 0.09375 0.8900445 0.1209825 0.8344876 0.0934709 0.379241 0.07005891 0.4986027 0.09390693 0.3769014 0.09474863 0.375 0.02746429 0.4766932 0.03048432 0.3758675 0.05069472 0.2343059 0.05740616 0.2825182 0.05963353 0.2421988 0.07030468 0.2815374 0.09547198 0.2150637 0.09469771 0.8221916 0.04086614 0.8013853 0.0652371 0.7351361 0.04694217 0.6581458 0.0650659 0.6357966 0.03819914 0.7348338 0.0854965 0.6251497 0.09357499 0.3727316 0.1338549 0.4985865 0.1705229 0.3419822 0.1881398 0.9054553 0.3125 0.693571 0.3127039 0.03969842 0.3125 0.228304 0.2500695 0.2785035 0.3126262 0.101393 0.4375005 0.2939189 0.3766033 0.3060116 0.4428634 0.9054553 0.6875 0.7823626 0.7459679 0.6935765 0.6873726 0.842472 0.578125 0.674706 0.6282346 0.6666932 0.5774468 0.2933773 0.6282346 0.09937812 0.578125 0.3045382 0.5774468 0.2283042 0.7499305 0.03969908 0.6875 0.2784941 0.6874503 0.6274989 0.8669589 0.5029355 0.8294771 0.6599432 0.8251298 0.1027185 0.8202058 0.001653759 0.7615789 0.1586297 0.7982934 0.2811123 0.9405732 0.3440115 0.9303008 0.3740348 0.9493052 0.4098311 0.8664674 0.5017309 0.9061741 0.375214 0.9058448 0.1484319 0.90625 0.1486911 0.8692309 0.2158234 0.9057775 0.2343059 0.9425938 0.2414049 0.930055 0.7339826 0.9054012 0.8354394 0.9061402 0.6240814 0.9055392 0.5341529 0.9986919 0.4754725 0.9695156 0.5579605 0.9744405 0.6744146 0.3766032 0.8413438 0.4375 0.6658871 0.442863 0.4923103 0.4660006 0.9949648 0.1408879 0.8410057 0.152994 0.5899305 0.1328053 0.6583794 0.1746344 0.1479315 0.1310913 0.1484319 0.09375 0.5341529 0.001308135 0.5591812 0.02555951 0.6591529 0.009616138 0.001653662 0.2384214 0.1019588 0.1801166 0.1578699 0.2020288 0.03912605 0.1759214 0.4915925 0.3304159 0.3111877 0.5386096 0.1246811 0.5156255 0.3121291 0.4986669 0.4915806 0.6702796 0.4920761 0.564554 0.9949648 0.8591121 0.8909963 0.8787817 0.8419576 0.8467702 0.975904 0.7966121 0.7789693 0.8010039 0.039126 0.8240789 0.343354 0.8121823 0.375 0.9725357 0.2808912 0.9135193 0.9421564 0.90625 0.6222425 0.934458 0.6339639 0.9618008 0.6591529 0.9903839 0.8285685 0.9457608 0.7759432 0.9610448 0.7643613 0.942704 0.7567298 0.508125 0.7573992 0.5271875 0.6341257 0.5208449 0.8936975 0.1943747 0.8836737 0.2318228 0.7241576 0.2300988 0.8879511 0.08854167 0.9260882 0.1107758 0.8388731 0.1105145 0.3619769 0.07948327 0.449989 0.07723875 0.44375 0.09895834 0.3541667 0.04213498 0.4408003 0.0249439 0.4428726 0.04512289 0.2329195 0.06242647 0.2520231 0.0569562 0.2610627 0.06473902 0.2274221 0.07756973 0.2610626 0.07948327 0.2448264 0.1008873 0.7759432 0.03895515 0.8285686 0.05423915 0.7675377 0.05643465 0.6964553 0.03820188 0.7008213 0.05643465 0.618706 0.05315491 0.6160306 0.07594311 0.7008213 0.07432702 0.6927962 0.09624916 0.3428053 0.1554185 0.44375 0.1485938 0.4402623 0.1925413 0.6905308 0.2768067 0.85432 0.2772862 0.8072342 0.3229167 0.1463906 0.3229167 0.1150069 0.2760417 0.3004237 0.2755621 0.1919429 0.4491412 0.1769295 0.4010419 0.3325882 0.4055211 0.8072342 0.6770834 0.85432 0.7227138 0.6905308 0.7231933 0.7661899 0.5703125 0.7760574 0.6066927 0.6413506 0.6048843 0.3317282 0.6048843 0.1759324 0.6066927 0.1897496 0.5703125 0.300424 0.7244379 0.1150073 0.7239584 0.1463913 0.6770834 0.6571796 0.8497939 0.55625 0.8514063 0.5638828 0.81111 0.1499139 0.8217755 0.04617515 0.7886434 0.06367484 0.7768774 0.3106456 0.9449902 0.306547 0.9358122 0.3848588 0.9398509 0.364285 0.884503 0.461875 0.885573 0.4467338 0.9117893 0.1904119 0.9114584 0.1389802 0.88648 0.1982149 0.88541 0.2520231 0.9430437 0.2329195 0.9375735 0.2589455 0.9358122 0.8323108 0.9237259 0.7643613 0.9223637 0.78124 0.9006739 0.6083333 0.8855729 0.6953346 0.8852052 0.6878531 0.9100962 0.5469614 0.9880263 0.5071141 0.9859545 0.5130475 0.9654212 0.640901 0.4055208 0.775499 0.4010417 0.7649621 0.4491406 0.5643831 0.4895168 0.5655318 0.4417448 0.6902374 0.4767969 0.8469483 0.1338066 0.9480917 0.1304166 0.9356326 0.1471871 0.5638828 0.18889 0.538125 0.1485938 0.6448496 0.1495771 0.7486219 0.1574004 0.8414681 0.1719843 0.6759536 0.1991612 0.7787017 0.09624916 0.7675377 0.07432702 0.8323108 0.0762741 0.3916667 0.1144271 0.3089464 0.116356 0.3184558 0.0904552 0.3979056 0.06014905 0.3184558 0.06473902 0.3106456 0.05500977 0.1961891 0.115449 0.1389803 0.1135201 0.1904119 0.08854167 0.5163027 0.03457874 0.507114 0.0140455 0.5469614 0.01197371 0.5990447 0.01543538 0.662739 0.0234864 0.5781777 0.03778863 0.6350579 0.1141658 0.538125 0.1144271 0.5541556 0.08821069 0.06367473 0.2231227 0.0461751 0.2113569 0.147888 0.1790837 0.1495451 0.1505941 0.0617886 0.1853153 0.09343615 0.1477582 0.2489898 0.1830011 0.3298436 0.2234788 0.1609004 0.2279472 0.7117164 0.3489583 0.5695581 0.3571094 0.5779135 0.3064996 0.4083041 0.3064996 0.4098036 0.3571094 0.2518504 0.3489584 0.3424457 0.5208452 0.2022746 0.5271878 0.2034705 0.5081256 0.2800997 0.4767974 0.4169735 0.441745 0.4189518 0.489517 0.5779135 0.6935004 0.569626 0.6455613 0.7118047 0.6522657 0.5658234 0.5804572 0.564607 0.5481105 0.6912884 0.5532292 0.2782219 0.5532292 0.4183583 0.5481106 0.4162016 0.5804572 0.2516931 0.6522656 0.4096254 0.6455613 0.4083044 0.6935004 0.9356326 0.8528128 0.9480917 0.8695835 0.8494866 0.8655644 0.7241576 0.7699013 0.8836737 0.7681772 0.8936975 0.8056253 0.6759536 0.8008388 0.8414681 0.8280158 0.7511601 0.8419706 0.09343608 0.852242 0.06178858 0.8146851 0.151571 0.850265 0.4402623 0.8074588 0.461875 0.8514062 0.3546228 0.8454405 0.1609005 0.7720529 0.3298437 0.7765212 0.2510157 0.8178579 0.4396174 0.954877 0.4408003 0.9750561 0.3541667 0.957865 0.3848588 0.9227613 0.306547 0.9235159 0.3109723 0.9024196 0.2468523 0.9024197 0.2589455 0.9235159 0.2274221 0.9224303 0.8414114 0.8888564 0.9260882 0.8892242 0.8879511 0.9114584 0.6399064 0.9223637 0.5509005 0.9240569 0.55625 0.9010417 0.6056591 0.9468451 0.6878531 0.942704 0.6964554 0.9617981 0.5749224 0.9622114 0.662739 0.9765136 0.5990447 0.9845646 0.8062078 0.9544655 0.7679714 0.9520066 0.7976573 0.9437186 0.7638294 0.5179427 0.6926419 0.5274769 0.6923692 0.5114613 0.8926361 0.2121277 0.8037035 0.2339562 0.8041853 0.2104521 0.9085751 0.09930854 0.8843071 0.1114109 0.8605223 0.09924322 0.4009081 0.07768774 0.4526014 0.08832011 0.3993484 0.08888124 0.3966584 0.03342151 0.4429685 0.03494046 0.3971765 0.04400529 0.2396964 0.05897323 0.259218 0.05995039 0.2431857 0.0642413 0.2418113 0.07777048 0.2574189 0.08936347 0.2310255 0.08888508 0.8062078 0.04553447 0.7984514 0.05606607 0.7687656 0.047778 0.6993492 0.04758968 0.6625902 0.05579501 0.6543823 0.04432182 0.6619214 0.07477913 0.6984344 0.08446696 0.6501234 0.0873189 0.3945555 0.1513676 0.4501697 0.1689296 0.3840215 0.1755316 0.776217 0.2751845 0.8343283 0.3010924 0.740536 0.3009725 0.1235571 0.3007812 0.2081131 0.2733176 0.2291472 0.3006614 0.1761319 0.4260877 0.2599382 0.3995576 0.2660533 0.4284314 0.8343283 0.6989076 0.776217 0.7248156 0.740536 0.6990275 0.7782584 0.5872201 0.7050158 0.6088057 0.7009967 0.5867679 0.2589803 0.6088057 0.1744947 0.5872201 0.2646081 0.5867679 0.2081135 0.7266824 0.1235576 0.6992188 0.2291477 0.6993387 0.6054407 0.8499355 0.5508665 0.8319833 0.6171407 0.8303356 0.09478397 0.8075639 0.0489849 0.7816214 0.1158317 0.7986459 0.3086938 0.940674 0.3401431 0.9364659 0.3509594 0.9440291 0.4142483 0.8827794 0.4563189 0.8998615 0.4006714 0.8995939 0.165028 0.9000055 0.166608 0.88414 0.1958077 0.899738 0.2396964 0.9410267 0.2426564 0.9358965 0.2586887 0.9401874 0.7985929 0.9243108 0.7692956 0.9114886 0.8122097 0.9118291 0.6488336 0.882955 0.6958269 0.8993462 0.6469633 0.8994381 0.5277492 0.9877418 0.5036162 0.9747795 0.5363489 0.9767152 0.7044873 0.3995573 0.7773418 0.4260873 0.7001957 0.428431 0.5574968 0.4669561 0.6327469 0.4574219 0.631157 0.4827763 0.9006281 0.1300004 0.9479998 0.1385209 0.8825366 0.1430197 0.5463353 0.1680168 0.5880353 0.1499073 0.6140581 0.1695071 0.7935864 0.1655341 0.7622596 0.1867035 0.7096856 0.1766788 0.7694551 0.08446696 0.799387 0.07486188 0.8115752 0.08740165 0.3522366 0.1174354 0.3112462 0.101182 0.354614 0.1006997 0.3561737 0.06367194 0.311671 0.05946378 0.3542212 0.05597084 0.1661016 0.1160749 0.165028 0.09999461 0.1953013 0.1004768 0.50443 0.02522046 0.5277492 0.01225819 0.5371628 0.02328479 0.6317596 0.0189455 0.62068 0.03159305 0.5864856 0.02633734 0.5855874 0.1168878 0.5439035 0.1001386 0.5993868 0.1000733 0.04898482 0.2183788 0.09427747 0.1926511 0.1153252 0.201569 0.1048405 0.1686016 0.07594204 0.1669856 0.1248369 0.1471159 0.2915719 0.2005783 0.241434 0.2274398 0.2065737 0.2056842 0.6437406 0.3536003 0.5642548 0.3322564 0.6508515 0.3253228 0.4166628 0.3322564 0.3290809 0.3536003 0.3238733 0.3253228 0.276618 0.5274771 0.1950534 0.5179431 0.2771051 0.5114616 0.3445147 0.4574223 0.4259254 0.4669563 0.3468335 0.4827767 0.5642719 0.6684113 0.643868 0.6485974 0.6508736 0.6749833 0.5577442 0.5636263 0.6317691 0.5512203 0.6334643 0.5685778 0.3456916 0.5512204 0.4251786 0.5636263 0.3431704 0.5685779 0.3288394 0.6485974 0.4166184 0.6684113 0.3238342 0.6749831 0.9479998 0.8614792 0.9012627 0.8698424 0.8831712 0.8568231 0.8037035 0.7660438 0.8926361 0.7878723 0.8041852 0.7895479 0.7622595 0.8132966 0.794221 0.8343087 0.7103201 0.823164 0.075942 0.8330147 0.105347 0.8316134 0.1253433 0.853099 0.454701 0.8310704 0.4118328 0.8488472 0.3869758 0.8246832 0.2414341 0.7725602 0.2920783 0.7996365 0.2070802 0.7945305 0.4421547 0.9650595 0.3966584 0.9665785 0.3963627 0.9559946 0.3401431 0.9230621 0.3087754 0.9146609 0.3510411 0.9120244 0.257396 0.9146609 0.241282 0.9229793 0.2315319 0.9119416 0.8849416 0.8884319 0.908575 0.9006915 0.8611569 0.9005995 0.5997851 0.9243935 0.547621 0.9120038 0.6011224 0.9115806 0.6462947 0.9439896 0.6961071 0.9521949 0.6511206 0.9556781 0.6198661 0.968407 0.6317596 0.9810545 0.5856718 0.9736626 0.8582874 0.9483169 0.7860958 0.9699508 0.738963 0.9639914 0.72799 0.9424536 0.7636466 0.9329014 0.8387085 0.9353684 0.824149 0.5078125 0.8252771 0.5234375 0.734274 0.5381771 0.5891535 0.533865 0.5889922 0.5079666 0.7331746 0.4952409 0.987952 0.1800818 0.963856 0.2266939 0.8698788 0.2535218 0.6781082 0.2524914 0.6724397 0.2189379 0.8791956 0.1803861 0.9182698 0.078125 0.966043 0.109375 0.939568 0.1215947 0.8315122 0.1221157 0.8002001 0.1061172 0.8629514 0.08026645 0.3341684 0.07126801 0.4327959 0.06731486 0.5031084 0.08009388 0.4913021 0.1080339 0.4234375 0.1080339 0.3341684 0.08346066 0.3125 0.0398883 0.4375 0.01504028 0.4798622 0.01803946 0.4847498 0.04285747 0.4310169 0.05401711 0.3224531 0.04976938 0.2264588 0.05995308 0.2421529 0.05485924 0.2742295 0.05582013 0.2862521 0.0646586 0.2606474 0.07126801 0.2295442 0.06829794 0.2862521 0.08346066 0.2703063 0.1109273 0.2241337 0.1107005 0.2121905 0.08059035 0.7860958 0.03004921 0.8582874 0.05168307 0.8387085 0.06463158 0.7684113 0.06519452 0.7352027 0.05625435 0.7389629 0.03600851 0.7012019 0.06519452 0.6017981 0.06394678 0.5852185 0.04749317 0.6862239 0.02969341 0.7352027 0.07427894 0.7377541 0.1001029 0.6747298 0.10703 0.5758688 0.07976997 0.3174887 0.1348205 0.4234375 0.1307031 0.4913021 0.147526 0.503044 0.1993575 0.4036221 0.2129005 0.2928374 0.1646588 0.9286316 0.28125 0.882279 0.34375 0.7680321 0.3398438 0.6176376 0.285972 0.05789397 0.34375 0.02150287 0.28125 0.125776 0.2509972 0.340547 0.2492807 0.3733503 0.2856609 0.1877432 0.3398438 0.1140448 0.4687508 0.08874129 0.4062503 0.2002106 0.3750001 0.3832657 0.3814129 0.3874199 0.4194208 0.2260398 0.467084 0.882279 0.65625 0.9286316 0.71875 0.8698788 0.7464782 0.6781082 0.7475086 0.6176376 0.714028 0.7680542 0.6604623 0.8341566 0.5546875 0.8507873 0.6015625 0.7553263 0.6284635 0.5949832 0.6245269 0.5924804 0.5953082 0.7378628 0.5582291 0.3828278 0.6245269 0.1997645 0.6284635 0.08773439 0.6015625 0.1110219 0.5546875 0.2236683 0.5582292 0.3866454 0.5953082 0.3405471 0.7507193 0.1257763 0.7490028 0.0215033 0.71875 0.05789486 0.65625 0.1877044 0.6604623 0.3733506 0.7143391 0.6834331 0.8684341 0.5765625 0.8692969 0.5086979 0.852474 0.5030441 0.8006426 0.6030086 0.7977431 0.7071812 0.8480996 0.1628506 0.8408029 0.05164368 0.7992343 8.26879e-4 0.7673684 0.002480638 0.7557895 0.09829628 0.7738688 0.2043846 0.8267246 0.2742295 0.9441798 0.2806284 0.9361683 0.3054248 0.9301708 0.4002048 0.9326851 0.4236861 0.9459828 0.3224531 0.9502306 0.3460953 0.8664681 0.4636458 0.8692969 0.5086979 0.8919662 0.4982257 0.92023 0.4254652 0.9199061 0.3253909 0.8909732 0.1835218 0.921875 0.1133419 0.890625 0.1144043 0.8706396 0.1870103 0.8688079 0.2271725 0.8911999 0.2121905 0.9194097 0.2421529 0.9451407 0.2264588 0.9400469 0.2295442 0.931702 0.2574716 0.9301708 0.72799 0.9176903 0.7415615 0.8914145 0.8040075 0.8923273 0.8629515 0.9197335 0.669763 0.9176903 0.5765625 0.8919662 0.5512293 0.9993459 0.5170764 0.9980378 0.4798622 0.9819605 0.479867 0.9571425 0.5364642 0.9603938 0.5692325 0.9869273 0.594786 0.3814128 0.7550762 0.375 0.8502232 0.40625 0.8324644 0.46875 0.7365353 0.4670833 0.5921219 0.4194206 0.492715 0.4930774 0.4923535 0.4348308 0.9924473 0.1329439 0.9974824 0.1488318 0.9028391 0.1578601 0.7939727 0.1426637 0.5363542 0.1307031 0.6529515 0.1306224 0.7009258 0.1509568 0.6030085 0.202257 0.1839716 0.1324806 0.1144044 0.1293605 0.113342 0.109375 0.1835218 0.078125 0.5170764 0.001962203 0.5512293 6.54067e-4 0.5692325 0.01307259 0.541347 0.03960618 0.6137293 0.004808069 0.7045764 0.01442421 0.002480492 0.2442107 8.26831e-4 0.232632 0.05164367 0.2007661 0.1598118 0.1604857 0.2013458 0.174564 0.09829615 0.2261313 0.01956303 0.201382 0.05868908 0.1504607 0.4909766 0.3585808 0.4960239 0.2982911 0.3920206 0.5338652 0.2287816 0.5381773 0.1236733 0.5234377 0.1256888 0.5078133 0.2307459 0.4952416 0.3923571 0.5079668 0.496024 0.7017089 0.4909286 0.6442014 0.4921434 0.5855296 0.4925531 0.5462804 0.9974824 0.8511682 0.9924473 0.8670561 0.939568 0.8784053 0.8353197 0.8769408 0.7977802 0.8563927 0.9028391 0.84214 0.963856 0.7733061 0.987952 0.8199182 0.8791955 0.8196139 0.6724397 0.7810621 0.058689 0.8495395 0.019563 0.7986184 0.2983241 0.8366297 0.4036222 0.7870995 0.4375 0.9849597 0.3125 0.9601117 0.2806284 0.923781 0.2733451 0.8979003 0.966043 0.890625 0.9182698 0.921875 0.669763 0.9329014 0.569207 0.9360532 0.6862239 0.9703066 0.5778878 0.9525068 0.7045764 0.9855758 0.6137293 0.9951919</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape6-map1-array" count="833" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape6-textangents">
+ <float_array id="qt_gauge_background_Shape6-textangents-array" count="9216">-0.08987024 0 0.9959534 -0.09211002 0 0.9957488 -0.05877184 0 0.9982713 -0.08298157 0 0.9965512 -0.09211002 0 0.9957488 -0.03307549 0 0.9994529 -0.02663469 0 0.9996452 -0.05877184 0 0.9982713 -0.05877184 0 0.9982713 -0.02663469 0 0.9996452 -0.009702588 0 0.9999529 -0.03180567 0 0.999494 -0.08298157 0 0.9965512 -0.05877184 0 0.9982713 -0.03180567 0 0.999494 -0.03845954 0 0.9992602 -0.05914384 0 0.9982495 -0.003474462 0 0.9999939 0.002233442 0 0.9999974 0.01516469 0 0.9998851 -0.003474462 0 0.9999939 -0.002913936 0 0.9999956 0.003222932 0 0.9999948 0.002233442 0 0.9999974 0.002233442 0 0.9999974 0.003222932 0 0.9999948 -0.009702588 0 0.9999529 -0.02663469 0 0.9996452 0.01516469 0 0.9998851 0.002233442 0 0.9999974 -0.02663469 0 0.9996452 -0.03307549 0 0.9994529 0 0 0.9999999 -0.009034536 0 0.9999591 -0.006037828 0 0.9999817 -0.001122448 0 0.9999992 -0.009034536 0 0.9999591 -0.03845954 0 0.9992602 -0.03180567 0 0.999494 -0.006037828 0 0.9999817 -0.006037828 0 0.9999817 -0.03180567 0 0.999494 -0.009702588 0 0.9999529 0.003222932 0 0.9999948 -0.001122448 0 0.9999992 -0.006037828 0 0.9999817 0.003222932 0 0.9999948 -0.002913936 0 0.9999956 -0.2179274 0 0.975965 -0.1244305 0 0.9922283 -0.1093819 0 0.9939998 -0.1951147 0 0.9807804 -0.1244305 0 0.9922283 -0.01734294 0 0.9998496 0.0466724 0 0.9989102 -0.1093819 0 0.9939998 -0.1093819 0 0.9939998 0.0466724 0 0.9989102 0.003658679 0 0.9999933 -0.05089717 0 0.9987037 -0.1951147 0 0.9807804 -0.1093819 0 0.9939998 -0.05089717 0 0.9987037 -0.07897464 0 0.9968767 0.1834467 0 0.9830295 0.1424074 0 0.9898081 0.1333988 0 0.9910624 0.1361747 0 0.9906848 0.1424074 0 0.9898081 0.05730944 0 0.9983565 0.04462958 0 0.9990035 0.1333988 0 0.9910624 0.1333988 0 0.9910624 0.04462958 0 0.9990035 0.003658679 0 0.9999933 0.0466724 0 0.9989102 0.1361747 0 0.9906848 0.1333988 0 0.9910624 0.0466724 0 0.9989102 -0.01734294 0 0.9998496 0 0 0.9999999 -0.01597781 0 0.9998723 -0.00205647 0 0.9999979 0.01140279 0 0.9999349 -0.01597781 0 0.9998723 -0.07897464 0 0.9968767 -0.05089717 0 0.9987037 -0.00205647 0 0.9999979 -0.00205647 0 0.9999979 -0.05089717 0 0.9987037 0.003658679 0 0.9999933 0.04462958 0 0.9990035 0.01140279 0 0.9999349 -0.00205647 0 0.9999979 0.04462958 0 0.9990035 0.05730944 0 0.9983565 0.1377146 0 0.990472 0.02402808 0 0.9997112 0.01956049 0 0.9998086 0.07703547 0 0.9970283 0.02402808 0 0.9997112 0.02053998 0 0.9997889 0.02379892 0 0.9997168 0.01956049 0 0.9998086 0.01956049 0 0.9998086 0.02379892 0 0.9997168 0.01594463 0 0.9998728 0.009783176 0 0.999952 0.07703547 0 0.9970283 0.01956049 0 0.9998086 0.009783176 0 0.999952 0.03088732 0 0.9995228 0.1196025 0 0.9928219 0.07535425 0 0.9971569 0.06054667 0 0.9981654 0.05164891 0 0.9986652 0.07535425 0 0.9971569 0.02243814 0 0.9997482 0.02001269 0 0.9997997 0.06054667 0 0.9981654 0.06054667 0 0.9981654 0.02001269 0 0.9997997 0.01594463 0 0.9998728 0.02379892 0 0.9997168 0.05164891 0 0.9986652 0.06054667 0 0.9981654 0.02379892 0 0.9997168 0.02053998 0 0.9997889 0 0 0.9999999 0.005778042 0 0.9999833 0.007567264 0 0.9999713 0.003845756 0 0.9999924 0.005778042 0 0.9999833 0.03088732 0 0.9995228 0.009783176 0 0.999952 0.007567264 0 0.9999713 0.007567264 0 0.9999713 0.009783176 0 0.999952 0.01594463 0 0.9998728 0.02001269 0 0.9997997 0.003845756 0 0.9999924 0.007567264 0 0.9999713 0.02001269 0 0.9997997 0.02243814 0 0.9997482 0.08986462 0 0.995954 -0.002712732 0 0.9999964 -0.007881529 0 0.9999689 0.03831797 0 0.9992656 -0.002712732 0 0.9999964 -0.04745398 0 0.9988734 -0.03655854 0 0.9993315 -0.007881529 0 0.9999689 -0.007881529 0 0.9999689 -0.03655854 0 0.9993315 -0.0290612 0 0.9995776 -0.003186806 0 0.9999949 0.03831797 0 0.9992656 -0.007881529 0 0.9999689 -0.003186806 0 0.9999949 0.01266264 0 0.9999198 -0.227906 0 0.9736832 -0.136532 0 0.9906356 -0.06451619 0 0.9979166 -0.1360739 0 0.9906987 -0.136532 0 0.9906356 -0.03973083 0 0.9992104 -0.03270672 0 0.999465 -0.06451619 0 0.9979166 -0.06451619 0 0.9979166 -0.03270672 0 0.999465 -0.0290612 0 0.9995776 -0.03655854 0 0.9993315 -0.1360739 0 0.9906987 -0.06451619 0 0.9979166 -0.03655854 0 0.9993315 -0.04745398 0 0.9988734 0 0 0.9999999 0.002828378 0 0.9999959 -0.008017635 0 0.9999677 -0.006730991 0 0.9999772 0.002828378 0 0.9999959 0.01266264 0 0.9999198 -0.003186806 0 0.9999949 -0.008017635 0 0.9999677 -0.008017635 0 0.9999677 -0.003186806 0 0.9999949 -0.0290612 0 0.9995776 -0.03270672 0 0.999465 -0.006730991 0 0.9999772 -0.008017635 0 0.9999677 -0.03270672 0 0.999465 -0.03973083 0 0.9992104 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.1805284 0 0.9835698 0.1703528 0 0.9853832 0.09053835 0 0.9958929 0.1635567 0 0.986534 0.1703528 0 0.9853832 0.09181051 0 0.9957765 0.05539322 0 0.9984645 0.09053835 0 0.9958929 0.09053835 0 0.9958929 0.05539322 0 0.9984645 0.02911893 0 0.9995759 0.04285048 0 0.9990814 0.1635567 0 0.986534 0.09053835 0 0.9958929 0.04285048 0 0.9990814 0.05273594 0 0.9986085 -0.2013473 0 0.97952 -0.0755503 0 0.997142 0.002272231 0 0.9999974 0.02489294 0 0.9996902 -0.0755503 0 0.997142 -0.03454526 0 0.9994031 -3.16239e-4 0 0.9999999 0.002272231 0 0.9999974 0.002272231 0 0.9999974 -3.16239e-4 0 0.9999999 0.02911893 0 0.9995759 0.05539322 0 0.9984645 0.02489294 0 0.9996902 0.002272231 0 0.9999974 0.05539322 0 0.9984645 0.09181051 0 0.9957765 0 0 0.9999999 0.01017777 0 0.9999482 0.01376182 0 0.9999053 -0.005551511 0 0.9999845 0.01017777 0 0.9999482 0.05273594 0 0.9986085 0.04285048 0 0.9990814 0.01376182 0 0.9999053 0.01376182 0 0.9999053 0.04285048 0 0.9990814 0.02911893 0 0.9995759 -3.16239e-4 0 0.9999999 -0.005551511 0 0.9999845 0.01376182 0 0.9999053 -3.16239e-4 0 0.9999999 -0.03454526 0 0.9994031 -0.4037099 0 0.9148871 -0.5442892 0 0.8388975 -0.3724428 0 0.9280551 -0.443581 0 0.8962342 -0.5442892 0 0.8388975 -0.2821887 0 0.959359 -0.1789374 0 0.9838604 -0.3724428 0 0.9280551 -0.3724428 0 0.9280551 -0.1789374 0 0.9838604 -0.07727098 0 0.9970101 -0.1640528 0 0.9864515 -0.443581 0 0.8962342 -0.3724428 0 0.9280551 -0.1640528 0 0.9864515 -0.238911 0 0.9710414 0.1805284 0 0.9835698 0.02951292 0 0.9995643 -0.08294462 0 0.9965541 -0.07274585 0 0.9973506 0.02951292 0 0.9995643 -9.78085e-4 0 0.9999995 -0.05664081 0 0.9983946 -0.08294462 0 0.9965541 -0.08294462 0 0.9965541 -0.05664081 0 0.9983946 -0.07727098 0 0.9970101 -0.1789374 0 0.9838604 -0.07274585 0 0.9973506 -0.08294462 0 0.9965541 -0.1789374 0 0.9838604 -0.2821887 0 0.959359 0 0 0.9999999 -0.04823443 0 0.9988359 -0.03889565 0 0.9992433 0.003327886 0 0.9999943 -0.04823443 0 0.9988359 -0.238911 0 0.9710414 -0.1640528 0 0.9864515 -0.03889565 0 0.9992433 -0.03889565 0 0.9992433 -0.1640528 0 0.9864515 -0.07727098 0 0.9970101 -0.05664081 0 0.9983946 0.003327886 0 0.9999943 -0.03889565 0 0.9992433 -0.05664081 0 0.9983946 -9.78085e-4 0 0.9999995 -0.4037099 0 0.9148871 -0.443581 0 0.8962342 -0.2848909 0 0.9585599 -0.1253846 0 0.9921082 -0.443581 0 0.8962342 -0.238911 0 0.9710414 -0.1686075 0 0.9856832 -0.2848909 0 0.9585599 -0.2848909 0 0.9585599 -0.1686075 0 0.9856832 -0.1027031 0 0.9947121 -0.1084529 0 0.9941016 -0.1253846 0 0.9921082 -0.2848909 0 0.9585599 -0.1084529 0 0.9941016 -0.05820303 0 0.9983048 0 0 0.9999999 0 0 0.9999999 -0.02682351 0 0.9996402 -0.04823443 0 0.9988359 0 0 0.9999999 0 0 0.9999999 -0.0221928 0 0.9997537 -0.02682351 0 0.9996402 -0.02682351 0 0.9996402 -0.0221928 0 0.9997537 -0.1027031 0 0.9947121 -0.1686075 0 0.9856832 -0.04823443 0 0.9988359 -0.02682351 0 0.9996402 -0.1686075 0 0.9856832 -0.238911 0 0.9710414 0 0 0.9999999 -0.01037073 0 0.9999462 -0.02472869 0 0.9996942 0 0 0.9999999 -0.01037073 0 0.9999462 -0.05820303 0 0.9983048 -0.1084529 0 0.9941016 -0.02472869 0 0.9996942 -0.02472869 0 0.9996942 -0.1084529 0 0.9941016 -0.1027031 0 0.9947121 -0.0221928 0 0.9997537 0 0 0.9999999 -0.02472869 0 0.9996942 -0.0221928 0 0.9997537 0 0 0.9999999 0.05914237 0 0.9982496 -0.01515702 0 0.9998851 -0.001726887 0 0.9999985 0.005086372 0 0.999987 -0.01515702 0 0.9998851 0.03308019 0 0.9994527 0.0270076 0 0.9996352 -0.001726887 0 0.9999985 -0.001726887 0 0.9999985 0.0270076 0 0.9996352 0.01057969 0 0.999944 5.65713e-4 0 0.9999998 0.005086372 0 0.999987 -0.001726887 0 0.9999985 5.65713e-4 0 0.9999998 6.9514e-4 0 0.9999997 0.08986462 0 0.995954 0.08367535 0 0.9964931 0.05942028 0 0.9982329 0.09210718 0 0.9957491 0.08367535 0 0.9964931 0.04024558 0 0.9991899 0.031004 0 0.9995192 0.05942028 0 0.9982329 0.05942028 0 0.9982329 0.031004 0 0.9995192 0.01057969 0 0.999944 0.0270076 0 0.9996352 0.09210718 0 0.9957491 0.05942028 0 0.9982329 0.0270076 0 0.9996352 0.03308019 0 0.9994527 0 0 0.9999999 -0.001127798 0 0.9999992 0.005476064 0 0.9999849 0.01221204 0 0.9999254 -0.001127798 0 0.9999992 6.9514e-4 0 0.9999997 5.65713e-4 0 0.9999998 0.005476064 0 0.9999849 0.005476064 0 0.9999849 5.65713e-4 0 0.9999998 0.01057969 0 0.999944 0.031004 0 0.9995192 0.01221204 0 0.9999254 0.005476064 0 0.9999849 0.031004 0 0.9995192 0.04024558 0 0.9991899 0.05914237 0 0.9982496 0.005086372 0 0.999987 0.01393968 0 0.9999027 0.05721337 0 0.998362 0.005086372 0 0.999987 6.9514e-4 0 0.9999997 0.005303523 0 0.9999859 0.01393968 0 0.9999027 0.01393968 0 0.9999027 0.005303523 0 0.9999859 0.005261842 0 0.9999861 0.01217423 0 0.9999259 0.05721337 0 0.998362 0.01393968 0 0.9999027 0.01217423 0 0.9999259 0.0237267 0 0.9997185 0 0 0.9999999 0 0 0.9999999 0.002614024 0 0.9999965 -0.001127798 0 0.9999992 0 0 0.9999999 0 0 0.9999999 -2.4068e-4 0 0.9999998 0.002614024 0 0.9999965 0.002614024 0 0.9999965 -2.4068e-4 0 0.9999998 0.005261842 0 0.9999861 0.005303523 0 0.9999859 -0.001127798 0 0.9999992 0.002614024 0 0.9999965 0.005303523 0 0.9999859 6.9514e-4 0 0.9999997 0 0 0.9999999 0.004137691 0 0.9999912 0.002464416 0 0.9999968 0 0 0.9999999 0.004137691 0 0.9999912 0.0237267 0 0.9997185 0.01217423 0 0.9999259 0.002464416 0 0.9999968 0.002464416 0 0.9999968 0.01217423 0 0.9999259 0.005261842 0 0.9999861 -2.4068e-4 0 0.9999998 0 0 0.9999999 0.002464416 0 0.9999968 -2.4068e-4 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.003845756 0 0.9999924 0.004994717 0 0.9999874 0 0 0.9999999 0.003845756 0 0.9999924 0.02243814 0 0.9997482 0.01706017 0 0.9998544 0.004994717 0 0.9999874 0.004994717 0 0.9999874 0.01706017 0 0.9998544 0.01677918 0 0.9998592 0.004892818 0 0.999988 0 0 0.9999999 0.004994717 0 0.9999874 0.004892818 0 0.999988 0 0 0.9999999 0.1196025 0 0.9928219 0.06542996 0 0.9978571 0.03717469 0 0.9993087 0.07535425 0 0.9971569 0.06542996 0 0.9978571 0.01972274 0 0.9998053 0.02254057 0 0.9997458 0.03717469 0 0.9993087 0.03717469 0 0.9993087 0.02254057 0 0.9997458 0.01677918 0 0.9998592 0.01706017 0 0.9998544 0.07535425 0 0.9971569 0.03717469 0 0.9993087 0.01706017 0 0.9998544 0.02243814 0 0.9997482 0 0 0.9999999 0 0 0.9999999 0.005857838 0 0.9999827 0.003982214 0 0.9999919 0 0 0.9999999 0 0 0.9999999 0.004892818 0 0.999988 0.005857838 0 0.9999827 0.005857838 0 0.9999827 0.004892818 0 0.999988 0.01677918 0 0.9998592 0.02254057 0 0.9997458 0.003982214 0 0.9999919 0.005857838 0 0.9999827 0.02254057 0 0.9997458 0.01972274 0 0.9998053 0 0 0.9999999 -0.01149224 0 0.9999339 -0.02014703 0 0.999797 0 0 0.9999999 -0.01149224 0 0.9999339 -0.05668032 0 0.9983923 -0.06309776 0 0.9980074 -0.02014703 0 0.999797 -0.02014703 0 0.999797 -0.06309776 0 0.9980074 -0.04711958 0 0.9988892 -0.01199431 0 0.999928 0 0 0.9999999 -0.02014703 0 0.999797 -0.01199431 0 0.999928 0 0 0.9999999 -0.04070805 0 0.999171 -0.1692265 0 0.9855772 -0.1398975 0 0.9901659 -0.128672 0 0.9916872 -0.1692265 0 0.9855772 -0.07094504 0 0.9974803 -0.05994551 0 0.9982015 -0.1398975 0 0.9901659 -0.1398975 0 0.9901659 -0.05994551 0 0.9982015 -0.04711958 0 0.9988892 -0.06309776 0 0.9980074 -0.128672 0 0.9916872 -0.1398975 0 0.9901659 -0.06309776 0 0.9980074 -0.05668032 0 0.9983923 0 0 0.9999999 0 0 0.9999999 -0.01461277 0 0.9998932 -0.01407318 0 0.9999009 0 0 0.9999999 0 0 0.9999999 -0.01199431 0 0.999928 -0.01461277 0 0.9998932 -0.01461277 0 0.9998932 -0.01199431 0 0.999928 -0.04711958 0 0.9988892 -0.05994551 0 0.9982015 -0.01407318 0 0.9999009 -0.01461277 0 0.9998932 -0.05994551 0 0.9982015 -0.07094504 0 0.9974803 0.1893584 0 0.981908 0.02407806 0 0.9997101 0.01876982 0 0.9998239 0.0968545 0 0.9952986 0.02407806 0 0.9997101 1.76028e-4 0 0.9999999 0.001572202 0 0.9999987 0.01876982 0 0.9998239 0.01876982 0 0.9998239 0.001572202 0 0.9999987 -8.6235e-4 0 0.9999996 0.008018506 0 0.9999678 0.0968545 0 0.9952986 0.01876982 0 0.9998239 0.008018506 0 0.9999678 0.04240488 0 0.9991005 0 0 0.9999999 0 0 0.9999999 4.36689e-4 0 0.9999998 8.08648e-4 0 0.9999996 0 0 0.9999999 0 0 0.9999999 -0.001564398 0 0.9999987 4.36689e-4 0 0.9999998 4.36689e-4 0 0.9999998 -0.001564398 0 0.9999987 -8.6235e-4 0 0.9999996 0.001572202 0 0.9999987 8.08648e-4 0 0.9999996 4.36689e-4 0 0.9999998 0.001572202 0 0.9999987 1.76028e-4 0 0.9999999 0 0 0.9999999 0.008663581 0 0.9999624 0.005179363 0 0.9999865 0 0 0.9999999 0.008663581 0 0.9999624 0.04240488 0 0.9991005 0.008018506 0 0.9999678 0.005179363 0 0.9999865 0.005179363 0 0.9999865 0.008018506 0 0.9999678 -8.6235e-4 0 0.9999996 -0.001564398 0 0.9999987 0 0 0.9999999 0.005179363 0 0.9999865 -0.001564398 0 0.9999987 0 0 0.9999999 0.06822733 0 0.9976698 0 0 0.9999999 -0.002233636 0 0.9999974 0.03014819 0 0.9995454 0 0 0.9999999 -0.02059194 0 0.9997878 -0.02285338 0 0.9997388 -0.002233636 0 0.9999974 -0.002233636 0 0.9999974 -0.02285338 0 0.9997388 -0.01770022 0 0.9998434 -0.004064288 0 0.9999916 0.03014819 0 0.9995454 -0.002233636 0 0.9999974 -0.004064288 0 0.9999916 0.0120189 0 0.9999278 -0.1196016 0 0.992822 -0.0753525 0 0.997157 -0.03711111 0 0.999311 -0.06518252 0 0.9978733 -0.0753525 0 0.997157 -0.02243901 0 0.9997482 -0.01819791 0 0.9998344 -0.03711111 0 0.999311 -0.03711111 0 0.999311 -0.01819791 0 0.9998344 -0.01770022 0 0.9998434 -0.02285338 0 0.9997388 -0.06518252 0 0.9978733 -0.03711111 0 0.999311 -0.02285338 0 0.9997388 -0.02059194 0 0.9997878 0 0 0.9999999 0.00223094 0 0.9999973 -0.004240577 0 0.9999908 -0.003842395 0 0.9999924 0.00223094 0 0.9999973 0.0120189 0 0.9999278 -0.004064288 0 0.9999916 -0.004240577 0 0.9999908 -0.004240577 0 0.9999908 -0.004064288 0 0.9999916 -0.01770022 0 0.9998434 -0.01819791 0 0.9998344 -0.003842395 0 0.9999924 -0.004240577 0 0.9999908 -0.01819791 0 0.9998344 -0.02243901 0 0.9997482 0.1834467 0 0.9830295 0.01287881 0 0.999917 0.01097353 0 0.9999397 0.06253486 0 0.9980428 0.01287881 0 0.999917 0.02034273 0 0.9997931 0.02426663 0 0.9997055 0.01097353 0 0.9999397 0.01097353 0 0.9999397 0.02426663 0 0.9997055 0.01673236 0 0.99986 0.01004824 0 0.9999494 0.06253486 0 0.9980428 0.01097353 0 0.9999397 0.01004824 0 0.9999494 0.03501255 0 0.9993868 0.06822733 0 0.9976698 0.05927242 0 0.9982418 0.0529056 0 0.9985996 0.05113285 0 0.9986917 0.05927242 0 0.9982418 0.02611938 0 0.9996588 0.02126396 0 0.9997738 0.0529056 0 0.9985996 0.0529056 0 0.9985996 0.02126396 0 0.9997738 0.01673236 0 0.99986 0.02426663 0 0.9997055 0.05113285 0 0.9986917 0.0529056 0 0.9985996 0.02426663 0 0.9997055 0.02034273 0 0.9997931 0 0 0.9999999 0.008595092 0 0.999963 0.008818856 0 0.999961 0.005442067 0 0.9999851 0.008595092 0 0.999963 0.03501255 0 0.9993868 0.01004824 0 0.9999494 0.008818856 0 0.999961 0.008818856 0 0.999961 0.01004824 0 0.9999494 0.01673236 0 0.99986 0.02126396 0 0.9997738 0.005442067 0 0.9999851 0.008818856 0 0.999961 0.02126396 0 0.9997738 0.02611938 0 0.9996588 0 0 0.9999999 -0.004914762 0 0.999988 -0.007833793 0 0.9999692 -0.007704008 0 0.9999703 -0.004914762 0 0.999988 -0.02304166 0 0.9997345 -0.01854246 0 0.999828 -0.007833793 0 0.9999692 -0.007833793 0 0.9999692 -0.01854246 0 0.999828 -0.01359135 0 0.9999076 -0.01113022 0 0.999938 -0.007704008 0 0.9999703 -0.007833793 0 0.9999692 -0.01113022 0 0.999938 -0.03047148 0 0.9995356 -0.05947489 0 0.9982297 -0.04407625 0 0.999028 -0.04586784 0 0.9989476 -0.05179163 0 0.9986579 -0.04407625 0 0.999028 -0.01744741 0 0.9998477 -0.02009226 0 0.9997981 -0.04586784 0 0.9989476 -0.04586784 0 0.9989476 -0.02009226 0 0.9997981 -0.01359135 0 0.9999076 -0.01854246 0 0.999828 -0.05179163 0 0.9986579 -0.04586784 0 0.9989476 -0.01854246 0 0.999828 -0.02304166 0 0.9997345 -0.1579259 0 0.987451 -0.05375115 0 0.9985543 -0.009407661 0 0.9999555 -0.01099377 0 0.9999394 -0.05375115 0 0.9985543 -0.03047148 0 0.9995356 -0.01113022 0 0.999938 -0.009407661 0 0.9999555 -0.009407661 0 0.9999555 -0.01113022 0 0.999938 -0.01359135 0 0.9999076 -0.02009226 0 0.9997981 -0.01099377 0 0.9999394 -0.009407661 0 0.9999555 -0.02009226 0 0.9997981 -0.01744741 0 0.9998477 0 0 0.9999999 0.01407445 0 0.9999009 0.01385396 0 0.999904 -0.002095935 0 0.9999977 0.01407445 0 0.9999009 0.07094575 0 0.9974802 0.06075682 0 0.9981525 0.01385396 0 0.999904 0.01385396 0 0.999904 0.06075682 0 0.9981525 0.04797253 0 0.9988486 0.01053009 0 0.9999446 -0.002095935 0 0.9999977 0.01385396 0 0.999904 0.01053009 0 0.9999446 -0.0119076 0 0.9999291 0.04070804 0 0.999171 0.1285274 0 0.9917058 0.1399183 0 0.9901631 0.1692238 0 0.9855777 0.1285274 0 0.9917058 0.05757831 0 0.998341 0.06349803 0 0.997982 0.1399183 0 0.9901631 0.1399183 0 0.9901631 0.06349803 0 0.997982 0.04797253 0 0.9988486 0.06075682 0 0.9981525 0.1692238 0 0.9855777 0.1399183 0 0.9901631 0.06075682 0 0.9981525 0.07094575 0 0.9974802 -0.05947489 0 0.9982297 -0.02385696 0 0.9997153 0.01909464 0 0.9998177 0.007917849 0 0.9999686 -0.02385696 0 0.9997153 -0.0119076 0 0.9999291 0.01053009 0 0.9999446 0.01909464 0 0.9998177 0.01909464 0 0.9998177 0.01053009 0 0.9999446 0.04797253 0 0.9988486 0.06349803 0 0.997982 0.007917849 0 0.9999686 0.01909464 0 0.9998177 0.06349803 0 0.997982 0.05757831 0 0.998341 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.01675914 0 0.9998595 -0.04724848 0 0.9988832 0.004915657 0 0.9999879 -0.01675914 0 0.9998595 -0.1114977 0 0.9937645 -0.2025501 0 0.9792719 -0.04724848 0 0.9988832 -0.04724848 0 0.9988832 -0.2025501 0 0.9792719 -0.2513165 0 0.9679049 -0.0829344 0 0.996555 0.004915657 0 0.9999879 -0.04724848 0 0.9988832 -0.0829344 0 0.996555 0.01706355 0 0.9998544 -0.7396446 0 0.6729975 -0.8395188 0 0.5433308 -0.6162542 0 0.7875473 -0.3149295 0 0.9491151 -0.8395188 0 0.5433308 -0.6304752 0 0.7762094 -0.5105547 0 0.8598453 -0.6162542 0 0.7875473 -0.6162542 0 0.7875473 -0.5105547 0 0.8598453 -0.2513165 0 0.9679049 -0.2025501 0 0.9792719 -0.3149295 0 0.9491151 -0.6162542 0 0.7875473 -0.2025501 0 0.9792719 -0.1114977 0 0.9937645 0.04070804 0 0.999171 -0.05023343 0 0.9987375 -0.2807584 0 0.9597784 -0.4715352 0 0.8818471 -0.05023343 0 0.9987375 0.01706355 0 0.9998544 -0.0829344 0 0.996555 -0.2807584 0 0.9597784 -0.2807584 0 0.9597784 -0.0829344 0 0.996555 -0.2513165 0 0.9679049 -0.5105547 0 0.8598453 -0.4715352 0 0.8818471 -0.2807584 0 0.9597784 -0.5105547 0 0.8598453 -0.6304752 0 0.7762094 -0.1805316 0 0.9835693 -0.03006515 0 0.9995479 -0.1235535 0 0.9923379 -0.165552 0 0.9862011 -0.03006515 0 0.9995479 7.7858e-4 0 0.9999996 -0.0324773 0 0.9994725 -0.1235535 0 0.9923379 -0.1235535 0 0.9923379 -0.0324773 0 0.9994725 -0.02100656 0 0.9997793 -0.04147042 0 0.9991397 -0.165552 0 0.9862011 -0.1235535 0 0.9923379 -0.04147042 0 0.9991397 -0.05479375 0 0.9984977 0 0 0.9999999 0 0 0.9999999 -0.006447372 0 0.9999791 0.002818306 0 0.9999958 0 0 0.9999999 0 0 0.9999999 -0.001210038 0 0.9999991 -0.006447372 0 0.9999791 -0.006447372 0 0.9999791 -0.001210038 0 0.9999991 -0.02100656 0 0.9997793 -0.0324773 0 0.9994725 0.002818306 0 0.9999958 -0.006447372 0 0.9999791 -0.0324773 0 0.9994725 7.7858e-4 0 0.9999996 0 0 0.9999999 -0.01076864 0 0.999942 -0.007554519 0 0.9999713 0 0 0.9999999 -0.01076864 0 0.999942 -0.05479375 0 0.9984977 -0.04147042 0 0.9991397 -0.007554519 0 0.9999713 -0.007554519 0 0.9999713 -0.04147042 0 0.9991397 -0.02100656 0 0.9997793 -0.001210038 0 0.9999991 0 0 0.9999999 -0.007554519 0 0.9999713 -0.001210038 0 0.9999991 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.4037092 0 0.9148874 0.03296457 0 0.9994565 0.04020222 0 0.9991915 0.127802 0 0.9917997 0.03296457 0 0.9994565 0.06448074 0 0.997919 0.07494354 0 0.9971876 0.04020222 0 0.9991915 0.04020222 0 0.9991915 0.07494354 0 0.9971876 0.05490832 0 0.9984914 0.02544883 0 0.999676 0.127802 0 0.9917997 0.04020222 0 0.9991915 0.02544883 0 0.999676 0.06307106 0 0.998009 0.3202887 0 0.9473199 0.218648 0 0.9758037 0.1225567 0 0.9924615 0.2108611 0 0.9775161 0.218648 0 0.9758037 0.07989161 0 0.9968035 0.06347147 0 0.9979836 0.1225567 0 0.9924615 0.1225567 0 0.9924615 0.06347147 0 0.9979836 0.05490832 0 0.9984914 0.07494354 0 0.9971876 0.2108611 0 0.9775161 0.1225567 0 0.9924615 0.07494354 0 0.9971876 0.06448074 0 0.997919 0 0 0.9999999 0.01270959 0 0.9999192 0.01541654 0 0.9998811 0.0185828 0 0.9998273 0.01270959 0 0.9999192 0.06307106 0 0.998009 0.02544883 0 0.999676 0.01541654 0 0.9998811 0.01541654 0 0.9998811 0.02544883 0 0.999676 0.05490832 0 0.9984914 0.06347147 0 0.9979836 0.0185828 0 0.9998273 0.01541654 0 0.9998811 0.06347147 0 0.9979836 0.07989161 0 0.9968035 -0.1805316 0 0.9835693 0.07274801 0 0.9973504 0.08140732 0 0.9966809 -0.03006515 0 0.9995479 0.07274801 0 0.9973504 0.2822052 0 0.959354 0.1797513 0 0.9837121 0.08140732 0 0.9966809 0.08140732 0 0.9966809 0.1797513 0 0.9837121 0.07799567 0 0.9969537 0.04538204 0 0.9989697 -0.03006515 0 0.9995479 0.08140732 0 0.9966809 0.04538204 0 0.9989697 7.7858e-4 0 0.9999996 0.4037092 0 0.9148874 0.4512223 0 0.8924115 0.3771304 0 0.9261601 0.5442997 0 0.8388909 0.4512223 0 0.8924115 0.2227931 0 0.9748657 0.1696774 0 0.9854997 0.3771304 0 0.9261601 0.3771304 0 0.9261601 0.1696774 0 0.9854997 0.07799567 0 0.9969537 0.1797513 0 0.9837121 0.5442997 0 0.8388909 0.3771304 0 0.9261601 0.1797513 0 0.9837121 0.2822052 0 0.959354 0 0 0.9999999 0.002818306 0 0.9999958 0.03683922 0 0.9993212 0.06095789 0 0.9981403 0.002818306 0 0.9999958 7.7858e-4 0 0.9999996 0.04538204 0 0.9989697 0.03683922 0 0.9993212 0.03683922 0 0.9993212 0.04538204 0 0.9989697 0.07799567 0 0.9969537 0.1696774 0 0.9854997 0.06095789 0 0.9981403 0.03683922 0 0.9993212 0.1696774 0 0.9854997 0.2227931 0 0.9748657 -0.08987024 0 0.9959534 -0.08298157 0 0.9965512 -0.04609662 0 0.998937 -0.03798884 0 0.9992781 -0.08298157 0 0.9965512 -0.03845954 0 0.9992602 -0.02622525 0 0.999656 -0.04609662 0 0.998937 -0.04609662 0 0.998937 -0.02622525 0 0.999656 -0.01308661 0 0.9999144 -0.02511028 0 0.9996848 -0.03798884 0 0.9992781 -0.04609662 0 0.998937 -0.02511028 0 0.9996848 -0.01187001 0 0.9999295 0 0 0.9999999 0 0 0.9999999 -0.005929881 0 0.9999823 -0.009034536 0 0.9999591 0 0 0.9999999 0 0 0.9999999 -0.005194156 0 0.9999863 -0.005929881 0 0.9999823 -0.005929881 0 0.9999823 -0.005194156 0 0.9999863 -0.01308661 0 0.9999144 -0.02622525 0 0.999656 -0.009034536 0 0.9999591 -0.005929881 0 0.9999823 -0.02622525 0 0.999656 -0.03845954 0 0.9992602 0 0 0.9999999 -0.002459988 0 0.9999968 -0.005793335 0 0.9999831 0 0 0.9999999 -0.002459988 0 0.9999968 -0.01187001 0 0.9999295 -0.02511028 0 0.9996848 -0.005793335 0 0.9999831 -0.005793335 0 0.9999831 -0.02511028 0 0.9996848 -0.01308661 0 0.9999144 -0.005194156 0 0.9999863 0 0 0.9999999 -0.005793335 0 0.9999831 -0.005194156 0 0.9999863 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.03524058 0 0.9993789 -0.1040204 0 0.9945752 -0.03330841 0 0.9994451 -0.05221741 0 0.9986356 -0.1040204 0 0.9945752 0.05755969 0 0.9983419 0.07605807 0 0.9971033 -0.03330841 0 0.9994451 -0.03330841 0 0.9994451 0.07605807 0 0.9971033 0.05919445 0 0.9982464 -0.004814705 0 0.9999884 -0.05221741 0 0.9986356 -0.03330841 0 0.9994451 -0.004814705 0 0.9999884 -0.01285514 0 0.9999173 0.2013432 0 0.9795208 0.07583611 0 0.9971203 0.1857297 0 0.9826008 0.2564912 0 0.9665465 0.07583611 0 0.9971203 0.0350408 0 0.9993858 0.06519514 0 0.9978725 0.1857297 0 0.9826008 0.1857297 0 0.9826008 0.06519514 0 0.9978725 0.05919445 0 0.9982464 0.07605807 0 0.9971033 0.2564912 0 0.9665465 0.1857297 0 0.9826008 0.07605807 0 0.9971033 0.05755969 0 0.9983419 0 0 0.9999999 -0.00289167 0 0.9999958 0.01694918 0 0.9998564 0.005707218 0 0.9999837 -0.00289167 0 0.9999958 -0.01285514 0 0.9999173 -0.004814705 0 0.9999884 0.01694918 0 0.9998564 0.01694918 0 0.9998564 -0.004814705 0 0.9999884 0.05919445 0 0.9982464 0.06519514 0 0.9978725 0.005707218 0 0.9999837 0.01694918 0 0.9998564 0.06519514 0 0.9978725 0.0350408 0 0.9993858 0 0 0.9999999 0 0 0.9999999 -0.004957259 0 0.9999877 -0.009215753 0 0.9999575 0 0 0.9999999 0 0 0.9999999 0.001828266 0 0.9999983 -0.004957259 0 0.9999877 -0.004957259 0 0.9999877 0.001828266 0 0.9999983 9.80075e-4 0 0.9999995 -0.01153364 0 0.9999334 -0.009215753 0 0.9999575 -0.004957259 0 0.9999877 -0.01153364 0 0.9999334 -0.04473391 0 0.9989989 0 0 0.9999999 -9.47033e-4 0 0.9999994 -5.06915e-4 0 0.9999997 0 0 0.9999999 -9.47033e-4 0 0.9999994 -1.91607e-4 0 1 -0.001806482 0 0.9999982 -5.06915e-4 0 0.9999997 -5.06915e-4 0 0.9999997 -0.001806482 0 0.9999982 9.80075e-4 0 0.9999995 0.001828266 0 0.9999983 0 0 0.9999999 -5.06915e-4 0 0.9999997 0.001828266 0 0.9999983 0 0 0.9999999 -0.2179274 0 0.975965 -0.1087545 0 0.9940686 -0.02176707 0 0.9997631 -0.0281588 0 0.9996035 -0.1087545 0 0.9940686 -0.04473391 0 0.9989989 -0.01153364 0 0.9999334 -0.02176707 0 0.9997631 -0.02176707 0 0.9997631 -0.01153364 0 0.9999334 9.80075e-4 0 0.9999995 -0.001806482 0 0.9999982 -0.0281588 0 0.9996035 -0.02176707 0 0.9997631 -0.001806482 0 0.9999982 -1.91607e-4 0 1 0 0 0.9999999 0 0 0.9999999 -0.01517425 0 0.9998848 -0.01597781 0 0.9998723 0 0 0.9999999 0 0 0.9999999 -0.01557602 0 0.9998787 -0.01517425 0 0.9998848 -0.01517425 0 0.9998848 -0.01557602 0 0.9998787 -0.03409681 0 0.9994185 -0.06565927 0 0.9978421 -0.01597781 0 0.9998723 -0.01517425 0 0.9998848 -0.06565927 0 0.9978421 -0.07897464 0 0.9968767 0 0 0.9999999 -0.009215753 0 0.9999575 -0.01718289 0 0.9998523 0 0 0.9999999 -0.009215753 0 0.9999575 -0.04473391 0 0.9989989 -0.06740642 0 0.9977256 -0.01718289 0 0.9998523 -0.01718289 0 0.9998523 -0.06740642 0 0.9977256 -0.03409681 0 0.9994185 -0.01557602 0 0.9998787 0 0 0.9999999 -0.01718289 0 0.9998523 -0.01557602 0 0.9998787 0 0 0.9999999 -0.2179274 0 0.975965 -0.1951147 0 0.9807804 -0.1156601 0 0.9932888 -0.1087545 0 0.9940686 -0.1951147 0 0.9807804 -0.07897464 0 0.9968767 -0.06565927 0 0.9978421 -0.1156601 0 0.9932888 -0.1156601 0 0.9932888 -0.06565927 0 0.9978421 -0.03409681 0 0.9994185 -0.06740642 0 0.9977256 -0.1087545 0 0.9940686 -0.1156601 0 0.9932888 -0.06740642 0 0.9977256 -0.04473391 0 0.9989989 0 0 0.9999999 -0.006730991 0 0.9999772 0 0 0.9999999 0.0112845 0 0.9999363 -0.006730991 0 0.9999772 -0.03973083 0 0.9992104 -0.03418556 0 0.9994155 0 0 0.9999999 0 0 0.9999999 -0.03418556 0 0.9994155 -0.004934463 0 0.9999878 0.031651 0 0.9994989 0.0112845 0 0.9999363 0 0 0.9999999 0.031651 0 0.9994989 0.05366655 0 0.9985589 -0.227906 0 0.9736832 -0.09893123 0 0.9950942 -0.1121351 0 0.9936931 -0.136532 0 0.9906356 -0.09893123 0 0.9950942 0.005689391 0 0.9999837 -0.03396264 0 0.9994231 -0.1121351 0 0.9936931 -0.1121351 0 0.9936931 -0.03396264 0 0.9994231 -0.004934463 0 0.9999878 -0.03418556 0 0.9994155 -0.136532 0 0.9906356 -0.1121351 0 0.9936931 -0.03418556 0 0.9994155 -0.03973083 0 0.9992104 0.1377146 0 0.990472 0.1314113 0 0.9913279 0.06200108 0 0.9980761 0.05264409 0 0.9986134 0.1314113 0 0.9913279 0.05366655 0 0.9985589 0.031651 0 0.9994989 0.06200108 0 0.9980761 0.06200108 0 0.9980761 0.031651 0 0.9994989 -0.004934463 0 0.9999878 -0.03396264 0 0.9994231 0.05264409 0 0.9986134 0.06200108 0 0.9980761 -0.03396264 0 0.9994231 0.005689391 0 0.9999837 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0.0112845 0 0.9999363 0.01363206 0 0.999907 0 0 0.9999999 0.0112845 0 0.9999363 0.05366655 0 0.9985589 0.04686315 0 0.9989013 0.01363206 0 0.999907 0.01363206 0 0.999907 0.04686315 0 0.9989013 0.02514052 0 0.9996839 0.009112853 0 0.9999583 0 0 0.9999999 0.01363206 0 0.999907 0.009112853 0 0.9999583 0 0 0.9999999 0.1377146 0 0.990472 0.07703547 0 0.9970283 0.076221 0 0.9970909 0.1314113 0 0.9913279 0.07703547 0 0.9970283 0.03088732 0 0.9995228 0.04025306 0 0.9991895 0.076221 0 0.9970909 0.076221 0 0.9970909 0.04025306 0 0.9991895 0.02514052 0 0.9996839 0.04686315 0 0.9989013 0.1314113 0 0.9913279 0.076221 0 0.9970909 0.04686315 0 0.9989013 0.05366655 0 0.9985589 0 0 0.9999999 0 0 0.9999999 0.01149436 0 0.9999339 0.005778042 0 0.9999833 0 0 0.9999999 0 0 0.9999999 0.009112853 0 0.9999583 0.01149436 0 0.9999339 0.01149436 0 0.9999339 0.009112853 0 0.9999583 0.02514052 0 0.9996839 0.04025306 0 0.9991895 0.005778042 0 0.9999833 0.01149436 0 0.9999339 0.04025306 0 0.9991895 0.03088732 0 0.9995228 0 0 0.9999999 0 0 0.9999999 0.006190553 0 0.9999807 0.002828378 0 0.9999959 0 0 0.9999999 0 0 0.9999999 0.005287929 0 0.9999859 0.006190553 0 0.9999807 0.006190553 0 0.9999807 0.005287929 0 0.9999859 0.02337985 0 0.9997266 0.02460163 0 0.9996973 0.002828378 0 0.9999959 0.006190553 0 0.9999807 0.02460163 0 0.9996973 0.01266264 0 0.9999198 0 0 0.9999999 0.01221204 0 0.9999254 0.009028272 0 0.9999592 0 0 0.9999999 0.01221204 0 0.9999254 0.04024558 0 0.9991899 0.03116049 0 0.9995143 0.009028272 0 0.9999592 0.009028272 0 0.9999592 0.03116049 0 0.9995143 0.02337985 0 0.9997266 0.005287929 0 0.9999859 0 0 0.9999999 0.009028272 0 0.9999592 0.005287929 0 0.9999859 0 0 0.9999999 0.08986462 0 0.995954 0.03831797 0 0.9992656 0.04511837 0 0.9989815 0.08367535 0 0.9964931 0.03831797 0 0.9992656 0.01266264 0 0.9999198 0.02460163 0 0.9996973 0.04511837 0 0.9989815 0.04511837 0 0.9989815 0.02460163 0 0.9996973 0.02337985 0 0.9997266 0.03116049 0 0.9995143 0.08367535 0 0.9964931 0.04511837 0 0.9989815 0.03116049 0 0.9995143 0.04024558 0 0.9991899 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.007063984 0 0.9999749 0.01017777 0 0.9999482 0 0 0.9999999 0 0 0.9999999 0.001379784 0 0.9999989 0.007063984 0 0.9999749 0.007063984 0 0.9999749 0.001379784 0 0.9999989 0.02007654 0 0.9997984 0.03925811 0 0.9992291 0.01017777 0 0.9999482 0.007063984 0 0.9999749 0.03925811 0 0.9992291 0.05273594 0 0.9986085 0 0 0.9999999 0.003327886 0 0.9999943 0.003604973 0 0.9999933 0 0 0.9999999 0.003327886 0 0.9999943 -9.78085e-4 0 0.9999995 0.02641121 0 0.9996511 0.003604973 0 0.9999933 0.003604973 0 0.9999933 0.02641121 0 0.9996511 0.02007654 0 0.9997984 0.001379784 0 0.9999989 0 0 0.9999999 0.003604973 0 0.9999933 0.001379784 0 0.9999989 0 0 0.9999999 0.1805284 0 0.9835698 0.1635567 0 0.986534 0.1216725 0 0.9925702 0.02951292 0 0.9995643 0.1635567 0 0.986534 0.05273594 0 0.9986085 0.03925811 0 0.9992291 0.1216725 0 0.9925702 0.1216725 0 0.9925702 0.03925811 0 0.9992291 0.02007654 0 0.9997984 0.02641121 0 0.9996511 0.02951292 0 0.9995643 0.1216725 0 0.9925702 0.02641121 0 0.9996511 -9.78085e-4 0 0.9999995 0 0 0.9999999 -0.01921359 0 0.9998154 -0.01510078 0 0.9998859 -0.01037073 0 0.9999462 -0.01921359 0 0.9998154 -0.08098858 0 0.9967151 -0.06477628 0 0.9978998 -0.01510078 0 0.9998859 -0.01510078 0 0.9998859 -0.06477628 0 0.9978998 -0.05511804 0 0.9984798 -0.02307167 0 0.9997338 -0.01037073 0 0.9999462 -0.01510078 0 0.9998859 -0.02307167 0 0.9997338 -0.05820303 0 0.9983048 -0.3202881 0 0.9473202 -0.21088 0 0.9775119 -0.1234433 0 0.9923516 -0.2191806 0 0.9756843 -0.21088 0 0.9775119 -0.06449923 0 0.9979177 -0.07468717 0 0.9972069 -0.1234433 0 0.9923516 -0.1234433 0 0.9923516 -0.07468717 0 0.9972069 -0.05511804 0 0.9984798 -0.06477628 0 0.9978998 -0.2191806 0 0.9756843 -0.1234433 0 0.9923516 -0.06477628 0 0.9978998 -0.08098858 0 0.9967151 -0.4037099 0 0.9148871 -0.1253846 0 0.9921082 -0.03865764 0 0.9992525 -0.03298182 0 0.999456 -0.1253846 0 0.9921082 -0.05820303 0 0.9983048 -0.02307167 0 0.9997338 -0.03865764 0 0.9992525 -0.03865764 0 0.9992525 -0.02307167 0 0.9997338 -0.05511804 0 0.9984798 -0.07468717 0 0.9972069 -0.03298182 0 0.999456 -0.03865764 0 0.9992525 -0.07468717 0 0.9972069 -0.06449923 0 0.9979177 0 0 0.9999999 -0.005551511 0 0.9999845 -0.01658103 0 0.9998626 0.002872556 0 0.9999958 -0.005551511 0 0.9999845 -0.03454526 0 0.9994031 -0.06479689 0 0.9978985 -0.01658103 0 0.9998626 -0.01658103 0 0.9998626 -0.06479689 0 0.9978985 -0.05919808 0 0.9982463 0.004820894 0 0.9999884 0.002872556 0 0.9999958 -0.01658103 0 0.9998626 0.004820894 0 0.9999884 0.01281121 0 0.9999179 -0.2013473 0 0.97952 -0.2564812 0 0.9665492 -0.1855494 0 0.9826349 -0.0755503 0 0.997142 -0.2564812 0 0.9665492 -0.05755961 0 0.998342 -0.07600115 0 0.9971076 -0.1855494 0 0.9826349 -0.1855494 0 0.9826349 -0.07600115 0 0.9971076 -0.05919808 0 0.9982463 -0.06479689 0 0.9978985 -0.0755503 0 0.997142 -0.1855494 0 0.9826349 -0.06479689 0 0.9978985 -0.03454526 0 0.9994031 0.03524414 0 0.9993787 0.0522176 0 0.9986357 0.03329269 0 0.9994456 0.1040069 0 0.9945766 0.0522176 0 0.9986357 0.01281121 0 0.9999179 0.004820894 0 0.9999884 0.03329269 0 0.9994456 0.03329269 0 0.9994456 0.004820894 0 0.9999884 -0.05919808 0 0.9982463 -0.07600115 0 0.9971076 0.1040069 0 0.9945766 0.03329269 0 0.9994456 -0.07600115 0 0.9971076 -0.05755961 0 0.998342 0.03524414 0 0.9993787 -0.05573404 0 0.9984456 -0.02949854 0 0.9995648 0.0522176 0 0.9986357 -0.05573404 0 0.9984456 0.02518799 0 0.9996827 0.009926481 0 0.9999508 -0.02949854 0 0.9995648 -0.02949854 0 0.9995648 0.009926481 0 0.9999508 6.88162e-4 0 0.9999998 -0.005890409 0 0.9999825 0.0522176 0 0.9986357 -0.02949854 0 0.9995648 -0.005890409 0 0.9999825 0.01281121 0 0.9999179 0.05914237 0 0.9982496 0.05721337 0 0.998362 0.0493269 0 0.9987826 0.09253066 0 0.9957098 0.05721337 0 0.998362 0.0237267 0 0.9997185 0.02193634 0 0.9997593 0.0493269 0 0.9987826 0.0493269 0 0.9987826 0.02193634 0 0.9997593 6.88162e-4 0 0.9999998 0.009926481 0 0.9999508 0.09253066 0 0.9957098 0.0493269 0 0.9987826 0.009926481 0 0.9999508 0.02518799 0 0.9996827 0 0 0.9999999 0.002872556 0 0.9999958 0.004754008 0 0.9999886 0.004137691 0 0.9999912 0.002872556 0 0.9999958 0.01281121 0 0.9999179 -0.005890409 0 0.9999825 0.004754008 0 0.9999886 0.004754008 0 0.9999886 -0.005890409 0 0.9999825 6.88162e-4 0 0.9999998 0.02193634 0 0.9997593 0.004137691 0 0.9999912 0.004754008 0 0.9999886 0.02193634 0 0.9997593 0.0237267 0 0.9997185 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.04070805 0 0.999171 0.4715433 0 0.8818429 0.2804722 0 0.9598621 0.04999216 0 0.9987496 0.4715433 0 0.8818429 0.6304788 0 0.7762064 0.5104998 0 0.8598778 0.2804722 0 0.9598621 0.2804722 0 0.9598621 0.5104998 0 0.8598778 0.2509981 0 0.9679875 0.08240008 0 0.9965993 0.04999216 0 0.9987496 0.2804722 0 0.9598621 0.08240008 0 0.9965993 -0.01739376 0 0.9998487 0.7396401 0 0.6730027 0.3160824 0 0.9487317 0.6164519 0 0.7873926 0.8395341 0 0.543307 0.3160824 0 0.9487317 0.1137589 0 0.9935083 0.2031426 0 0.9791492 0.6164519 0 0.7873926 0.6164519 0 0.7873926 0.2031426 0 0.9791492 0.2509981 0 0.9679875 0.5104998 0 0.8598778 0.8395341 0 0.543307 0.6164519 0 0.7873926 0.5104998 0 0.8598778 0.6304788 0 0.7762064 0 0 0.9999999 -0.004980368 0 0.9999875 0.04736043 0 0.9988778 0.01770046 0 0.9998434 -0.004980368 0 0.9999875 -0.01739376 0 0.9998487 0.08240008 0 0.9965993 0.04736043 0 0.9988778 0.04736043 0 0.9988778 0.08240008 0 0.9965993 0.2509981 0 0.9679875 0.2031426 0 0.9791492 0.01770046 0 0.9998434 0.04736043 0 0.9988778 0.2031426 0 0.9791492 0.1137589 0 0.9935083 0 0 0.9999999 0.01770046 0 0.9998434 -0.01500125 0 0.9998875 -0.01921359 0 0.9998154 0.01770046 0 0.9998434 0.1137589 0 0.9935083 0.01812029 0 0.9998357 -0.01500125 0 0.9998875 -0.01500125 0 0.9998875 0.01812029 0 0.9998357 -0.04715603 0 0.9988875 -0.07829922 0 0.9969299 -0.01921359 0 0.9998154 -0.01500125 0 0.9998875 -0.07829922 0 0.9969299 -0.08098858 0 0.9967151 0.7396401 0 0.6730027 0.06932566 0 0.9975941 0.03752804 0 0.9992955 0.3160824 0 0.9487317 0.06932566 0 0.9975941 -0.06610239 0 0.9978129 -0.06910527 0 0.9976094 0.03752804 0 0.9992955 0.03752804 0 0.9992955 -0.06910527 0 0.9976094 -0.04715603 0 0.9988875 0.01812029 0 0.9998357 0.3160824 0 0.9487317 0.03752804 0 0.9992955 0.01812029 0 0.9998357 0.1137589 0 0.9935083 -0.3202881 0 0.9473202 -0.2191806 0 0.9756843 -0.1596864 0 0.9871677 -0.138056 0 0.9904245 -0.2191806 0 0.9756843 -0.08098858 0 0.9967151 -0.07829922 0 0.9969299 -0.1596864 0 0.9871677 -0.1596864 0 0.9871677 -0.07829922 0 0.9969299 -0.04715603 0 0.9988875 -0.06910527 0 0.9976094 -0.138056 0 0.9904245 -0.1596864 0 0.9871677 -0.06910527 0 0.9976094 -0.06610239 0 0.9978129 0 0 0.9999999 0 0 0.9999999 -0.008373739 0 0.999965 -0.004980368 0 0.9999875 0 0 0.9999999 0 0 0.9999999 -0.01546612 0 0.9998803 -0.008373739 0 0.999965 -0.008373739 0 0.999965 -0.01546612 0 0.9998803 -0.0307101 0 0.9995283 -0.04240752 0 0.9991004 -0.004980368 0 0.9999875 -0.008373739 0 0.999965 -0.04240752 0 0.9991004 -0.01739376 0 0.9998487 0 0 0.9999999 -0.01407318 0 0.9999009 -0.01216678 0 0.9999259 0 0 0.9999999 -0.01407318 0 0.9999009 -0.07094504 0 0.9974803 -0.05503312 0 0.9984844 -0.01216678 0 0.9999259 -0.01216678 0 0.9999259 -0.05503312 0 0.9984844 -0.0307101 0 0.9995283 -0.01546612 0 0.9998803 0 0 0.9999999 -0.01216678 0 0.9999259 -0.01546612 0 0.9998803 0 0 0.9999999 -0.04070805 0 0.999171 0.04999216 0 0.9987496 -0.08891709 0 0.9960391 -0.1692265 0 0.9855772 0.04999216 0 0.9987496 -0.01739376 0 0.9998487 -0.04240752 0 0.9991004 -0.08891709 0 0.9960391 -0.08891709 0 0.9960391 -0.04240752 0 0.9991004 -0.0307101 0 0.9995283 -0.05503312 0 0.9984844 -0.1692265 0 0.9855772 -0.08891709 0 0.9960391 -0.05503312 0 0.9984844 -0.07094504 0 0.9974803 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.01034416 0 0.9999465 0.001847557 0 0.9999982 0.0144962 0 0.9998949 -0.01034416 0 0.9999465 -0.05044515 0 0.9987267 -0.03892045 0 0.9992423 0.001847557 0 0.9999982 0.001847557 0 0.9999982 -0.03892045 0 0.9992423 -0.003138029 0 0.999995 0.04451344 0 0.9990088 0.0144962 0 0.9998949 0.001847557 0 0.9999982 0.04451344 0 0.9990088 0.06966185 0 0.9975706 -0.1579259 0 0.987451 -0.1173142 0 0.9930948 -0.1151278 0 0.9933507 -0.1230891 0 0.9923956 -0.1173142 0 0.9930948 0.0150458 0 0.9998868 -0.04024702 0 0.9991898 -0.1151278 0 0.9933507 -0.1151278 0 0.9933507 -0.04024702 0 0.9991898 -0.003138029 0 0.999995 -0.03892045 0 0.9992423 -0.1230891 0 0.9923956 -0.1151278 0 0.9933507 -0.03892045 0 0.9992423 -0.05044515 0 0.9987267 0.1893584 0 0.981908 0.1699423 0 0.985454 0.09513192 0 0.9954647 0.1076311 0 0.9941909 0.1699423 0 0.985454 0.06966185 0 0.9975706 0.04451344 0 0.9990088 0.09513192 0 0.9954647 0.09513192 0 0.9954647 0.04451344 0 0.9990088 -0.003138029 0 0.999995 -0.04024702 0 0.9991898 0.1076311 0 0.9941909 0.09513192 0 0.9954647 -0.04024702 0 0.9991898 0.0150458 0 0.9998868 0.1893584 0 0.981908 0.0968545 0 0.9952986 0.09800144 0 0.9951862 0.1699423 0 0.985454 0.0968545 0 0.9952986 0.04240488 0 0.9991005 0.05202499 0 0.9986457 0.09800144 0 0.9951862 0.09800144 0 0.9951862 0.05202499 0 0.9986457 0.03147172 0 0.9995046 0.05887176 0 0.9982656 0.1699423 0 0.985454 0.09800144 0 0.9951862 0.05887176 0 0.9982656 0.06966185 0 0.9975706 0 0 0.9999999 0 0 0.9999999 0.0156311 0 0.9998778 0.008663581 0 0.9999624 0 0 0.9999999 0 0 0.9999999 0.01445573 0 0.9998955 0.0156311 0 0.9998778 0.0156311 0 0.9998778 0.01445573 0 0.9998955 0.03147172 0 0.9995046 0.05202499 0 0.9986457 0.008663581 0 0.9999624 0.0156311 0 0.9998778 0.05202499 0 0.9986457 0.04240488 0 0.9991005 0 0 0.9999999 0.0144962 0 0.9998949 0.01405806 0 0.9999011 0 0 0.9999999 0.0144962 0 0.9998949 0.06966185 0 0.9975706 0.05887176 0 0.9982656 0.01405806 0 0.9999011 0.01405806 0 0.9999011 0.05887176 0 0.9982656 0.03147172 0 0.9995046 0.01445573 0 0.9998955 0 0 0.9999999 0.01405806 0 0.9999011 0.01445573 0 0.9998955 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.004801402 0 0.9999883 0.00223094 0 0.9999973 0 0 0.9999999 0 0 0.9999999 0.003946614 0 0.999992 0.004801402 0 0.9999883 0.004801402 0 0.9999883 0.003946614 0 0.999992 0.01016105 0 0.9999483 0.01657704 0 0.9998624 0.00223094 0 0.9999973 0.004801402 0 0.9999883 0.01657704 0 0.9998624 0.0120189 0 0.9999278 0 0 0.9999999 0.005442067 0 0.9999851 0.005523655 0 0.9999847 0 0 0.9999999 0.005442067 0 0.9999851 0.02611938 0 0.9996588 0.01977349 0 0.9998043 0.005523655 0 0.9999847 0.005523655 0 0.9999847 0.01977349 0 0.9998043 0.01016105 0 0.9999483 0.003946614 0 0.999992 0 0 0.9999999 0.005523655 0 0.9999847 0.003946614 0 0.999992 0 0 0.9999999 0.06822733 0 0.9976698 0.03014819 0 0.9995454 0.03251451 0 0.9994711 0.05927242 0 0.9982418 0.03014819 0 0.9995454 0.0120189 0 0.9999278 0.01657704 0 0.9998624 0.03251451 0 0.9994711 0.03251451 0 0.9994711 0.01657704 0 0.9998624 0.01016105 0 0.9999483 0.01977349 0 0.9998043 0.05927242 0 0.9982418 0.03251451 0 0.9994711 0.01977349 0 0.9998043 0.02611938 0 0.9996588 0 0 0.9999999 0 0 0.9999999 0.009835417 0 0.9999515 0.008595092 0 0.999963 0 0 0.9999999 0 0 0.9999999 0.005619791 0 0.9999841 0.009835417 0 0.9999515 0.009835417 0 0.9999515 0.005619791 0 0.9999841 0.02309033 0 0.9997334 0.04000225 0 0.9991996 0.008595092 0 0.999963 0.009835417 0 0.9999515 0.04000225 0 0.9991996 0.03501255 0 0.9993868 0 0 0.9999999 0.01140279 0 0.9999349 0.01218723 0 0.9999257 0 0 0.9999999 0.01140279 0 0.9999349 0.05730944 0 0.9983565 0.04450616 0 0.9990091 0.01218723 0 0.9999257 0.01218723 0 0.9999257 0.04450616 0 0.9990091 0.02309033 0 0.9997334 0.005619791 0 0.9999841 0 0 0.9999999 0.01218723 0 0.9999257 0.005619791 0 0.9999841 0 0 0.9999999 0.1834467 0 0.9830295 0.06253486 0 0.9980428 0.0747466 0 0.9972025 0.1424074 0 0.9898081 0.06253486 0 0.9980428 0.03501255 0 0.9993868 0.04000225 0 0.9991996 0.0747466 0 0.9972025 0.0747466 0 0.9972025 0.04000225 0 0.9991996 0.02309033 0 0.9997334 0.04450616 0 0.9990091 0.1424074 0 0.9898081 0.0747466 0 0.9972025 0.04450616 0 0.9990091 0.05730944 0 0.9983565 -0.1579259 0 0.987451 -0.1230891 0 0.9923956 -0.06512176 0 0.9978773 -0.05375115 0 0.9985543 -0.1230891 0 0.9923956 -0.05044515 0 0.9987267 -0.03982389 0 0.9992067 -0.06512176 0 0.9978773 -0.06512176 0 0.9978773 -0.03982389 0 0.9992067 -0.02126472 0 0.9997738 -0.03566004 0 0.999364 -0.05375115 0 0.9985543 -0.06512176 0 0.9978773 -0.03566004 0 0.999364 -0.03047148 0 0.9995356 0 0 0.9999999 0 0 0.9999999 -0.01127834 0 0.9999364 -0.01034416 0 0.9999465 0 0 0.9999999 0 0 0.9999999 -0.005232926 0 0.9999862 -0.01127834 0 0.9999364 -0.01127834 0 0.9999364 -0.005232926 0 0.9999862 -0.02126472 0 0.9997738 -0.03982389 0 0.9992067 -0.01034416 0 0.9999465 -0.01127834 0 0.9999364 -0.03982389 0 0.9992067 -0.05044515 0 0.9987267 0 0 0.9999999 -0.007704008 0 0.9999703 -0.009060657 0 0.9999588 0 0 0.9999999 -0.007704008 0 0.9999703 -0.03047148 0 0.9995356 -0.03566004 0 0.999364 -0.009060657 0 0.9999588 -0.009060657 0 0.9999588 -0.03566004 0 0.999364 -0.02126472 0 0.9997738 -0.005232926 0 0.9999862 0 0 0.9999999 -0.009060657 0 0.9999588 -0.005232926 0 0.9999862 0 0 0.9999999 -0.05947489 0 0.9982297 -0.05179163 0 0.9986579 -0.02871673 0 0.9995875 -0.02385696 0 0.9997153 -0.05179163 0 0.9986579 -0.02304166 0 0.9997345 -0.01782426 0 0.999841 -0.02871673 0 0.9995875 -0.02871673 0 0.9995875 -0.01782426 0 0.999841 -0.009433685 0 0.9999555 -0.01502872 0 0.999887 -0.02385696 0 0.9997153 -0.02871673 0 0.9995875 -0.01502872 0 0.999887 -0.0119076 0 0.9999291 0 0 0.9999999 0 0 0.9999999 -0.00509428 0 0.9999869 -0.004914762 0 0.999988 0 0 0.9999999 0 0 0.9999999 -0.003648891 0 0.9999933 -0.00509428 0 0.9999869 -0.00509428 0 0.9999869 -0.003648891 0 0.9999933 -0.009433685 0 0.9999555 -0.01782426 0 0.999841 -0.004914762 0 0.999988 -0.00509428 0 0.9999869 -0.01782426 0 0.999841 -0.02304166 0 0.9997345 0 0 0.9999999 -0.002095935 0 0.9999977 -0.004380474 0 0.9999903 0 0 0.9999999 -0.002095935 0 0.9999977 -0.0119076 0 0.9999291 -0.01502872 0 0.999887 -0.004380474 0 0.9999903 -0.004380474 0 0.9999903 -0.01502872 0 0.999887 -0.009433685 0 0.9999555 -0.003648891 0 0.9999933 0 0 0.9999999 -0.004380474 0 0.9999903 -0.003648891 0 0.9999933 0 0 0.9999999 -0.1377132 0 0.9904722 -0.0526439 0 0.9986133 -0.06268418 0 0.9980334 -0.1324185 0 0.9911938 -0.0526439 0 0.9986133 -0.005688858 0 0.9999837 0.03358199 0 0.999436 -0.06268418 0 0.9980334 -0.06268418 0 0.9980334 0.03358199 0 0.999436 0.004003589 0 0.9999921 -0.03333008 0 0.9994444 -0.1324185 0 0.9911938 -0.06268418 0 0.9980334 -0.03333008 0 0.9994444 -0.05543282 0 0.9984624 0.2279115 0 0.9736819 0.1369795 0 0.9905738 0.1119722 0 0.9937113 0.09894031 0 0.9950933 0.1369795 0 0.9905738 0.04067118 0 0.9991726 0.03389781 0 0.9994252 0.1119722 0 0.9937113 0.1119722 0 0.9937113 0.03389781 0 0.9994252 0.004003589 0 0.9999921 0.03358199 0 0.999436 0.09894031 0 0.9950933 0.1119722 0 0.9937113 0.03358199 0 0.999436 -0.005688858 0 0.9999837 0 0 0.9999999 -0.01195899 0 0.9999285 -8.88995e-4 0 0.9999995 0.007048741 0 0.999975 -0.01195899 0 0.9999285 -0.05543282 0 0.9984624 -0.03333008 0 0.9994444 -8.88995e-4 0 0.9999995 -8.88995e-4 0 0.9999995 -0.03333008 0 0.9994444 0.004003589 0 0.9999921 0.03389781 0 0.9994252 0.007048741 0 0.999975 -8.88995e-4 0 0.9999995 0.03389781 0 0.9994252 0.04067118 0 0.9991726 0 0 0.9999999 -0.003842395 0 0.9999924 -0.007567199 0 0.9999713 -0.005774215 0 0.9999833 -0.003842395 0 0.9999924 -0.02243901 0 0.9997482 -0.02001175 0 0.9997997 -0.007567199 0 0.9999713 -0.007567199 0 0.9999713 -0.02001175 0 0.9997997 -0.01593899 0 0.9998729 -0.009777887 0 0.9999521 -0.005774215 0 0.9999833 -0.007567199 0 0.9999713 -0.009777887 0 0.9999521 -0.03088753 0 0.9995229 -0.1196016 0 0.992822 -0.05165038 0 0.9986652 -0.06054548 0 0.9981654 -0.0753525 0 0.997157 -0.05165038 0 0.9986652 -0.02054627 0 0.9997889 -0.0237992 0 0.9997166 -0.06054548 0 0.9981654 -0.06054548 0 0.9981654 -0.0237992 0 0.9997166 -0.01593899 0 0.9998729 -0.02001175 0 0.9997997 -0.0753525 0 0.997157 -0.06054548 0 0.9981654 -0.02001175 0 0.9997997 -0.02243901 0 0.9997482 -0.1377132 0 0.9904722 -0.07703063 0 0.9970287 -0.01955758 0 0.9998087 -0.02402732 0 0.9997112 -0.07703063 0 0.9970287 -0.03088753 0 0.9995229 -0.009777887 0 0.9999521 -0.01955758 0 0.9998087 -0.01955758 0 0.9998087 -0.009777887 0 0.9999521 -0.01593899 0 0.9998729 -0.0237992 0 0.9997166 -0.02402732 0 0.9997112 -0.01955758 0 0.9998087 -0.0237992 0 0.9997166 -0.02054627 0 0.9997889 0 0 0.9999999 -0.005774215 0 0.9999833 -0.01152088 0 0.9999337 0 0 0.9999999 -0.005774215 0 0.9999833 -0.03088753 0 0.9995229 -0.04046428 0 0.9991811 -0.01152088 0 0.9999337 -0.01152088 0 0.9999337 -0.04046428 0 0.9991811 -0.02544993 0 0.9996761 -0.009209768 0 0.9999574 0 0 0.9999999 -0.01152088 0 0.9999337 -0.009209768 0 0.9999574 0 0 0.9999999 -0.1377132 0 0.9904722 -0.1324185 0 0.9911938 -0.07681295 0 0.9970455 -0.07703063 0 0.9970287 -0.1324185 0 0.9911938 -0.05543282 0 0.9984624 -0.04769499 0 0.9988619 -0.07681295 0 0.9970455 -0.07681295 0 0.9970455 -0.04769499 0 0.9988619 -0.02544993 0 0.9996761 -0.04046428 0 0.9991811 -0.07703063 0 0.9970287 -0.07681295 0 0.9970455 -0.04046428 0 0.9991811 -0.03088753 0 0.9995229 0 0 0.9999999 0 0 0.9999999 -0.01398961 0 0.9999021 -0.01195899 0 0.9999285 0 0 0.9999999 0 0 0.9999999 -0.009209768 0 0.9999574 -0.01398961 0 0.9999021 -0.01398961 0 0.9999021 -0.009209768 0 0.9999574 -0.02544993 0 0.9996761 -0.04769499 0 0.9988619 -0.01195899 0 0.9999285 -0.01398961 0 0.9999021 -0.04769499 0 0.9988619 -0.05543282 0 0.9984624 0.3202887 0 0.9473199 0.1380461 0 0.9904258 0.1598376 0 0.9871432 0.218648 0 0.9758037 0.1380461 0 0.9904258 0.0660892 0 0.9978138 0.06981035 0 0.9975603 0.1598376 0 0.9871432 0.1598376 0 0.9871432 0.06981035 0 0.9975603 0.04834354 0 0.9988308 0.07857772 0 0.9969079 0.218648 0 0.9758037 0.1598376 0 0.9871432 0.07857772 0 0.9969079 0.07989161 0 0.9968035 -0.7396446 0 0.6729975 -0.3149295 0 0.9491151 -0.03590324 0 0.9993553 -0.06933632 0 0.9975935 -0.3149295 0 0.9491151 -0.1114977 0 0.9937645 -0.01577441 0 0.9998754 -0.03590324 0 0.9993553 -0.03590324 0 0.9993553 -0.01577441 0 0.9998754 0.04834354 0 0.9988308 0.06981035 0 0.9975603 -0.06933632 0 0.9975935 -0.03590324 0 0.9993553 0.06981035 0 0.9975603 0.0660892 0 0.9978138 0 0 0.9999999 0.0185828 0 0.9998273 0.01600555 0 0.999872 -0.01675914 0 0.9998595 0.0185828 0 0.9998273 0.07989161 0 0.9968035 0.07857772 0 0.9969079 0.01600555 0 0.999872 0.01600555 0 0.999872 0.07857772 0 0.9969079 0.04834354 0 0.9988308 -0.01577441 0 0.9998754 -0.01675914 0 0.9998595 0.01600555 0 0.999872 -0.01577441 0 0.9998754 -0.1114977 0 0.9937645 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0.04070804 0 0.999171 0.1692238 0 0.9855777 0.08896571 0 0.9960348 -0.05023343 0 0.9987375 0.1692238 0 0.9855777 0.07094575 0 0.9974802 0.05511021 0 0.9984802 0.08896571 0 0.9960348 0.08896571 0 0.9960348 0.05511021 0 0.9984802 0.0308253 0 0.9995248 0.04261393 0 0.9990916 -0.05023343 0 0.9987375 0.08896571 0 0.9960348 0.04261393 0 0.9990916 0.01706355 0 0.9998544 0 0 0.9999999 0 0 0.9999999 0.01217306 0 0.9999259 0.01407445 0 0.9999009 0 0 0.9999999 0 0 0.9999999 0.01551719 0 0.9998797 0.01217306 0 0.9999259 0.01217306 0 0.9999259 0.01551719 0 0.9998797 0.0308253 0 0.9995248 0.05511021 0 0.9984802 0.01407445 0 0.9999009 0.01217306 0 0.9999259 0.05511021 0 0.9984802 0.07094575 0 0.9974802 0 0 0.9999999 0.004915657 0 0.9999879 0.008493802 0 0.9999638 0 0 0.9999999 0.004915657 0 0.9999879 0.01706355 0 0.9998544 0.04261393 0 0.9990916 0.008493802 0 0.9999638 0.008493802 0 0.9999638 0.04261393 0 0.9990916 0.0308253 0 0.9995248 0.01551719 0 0.9998797 0 0 0.9999999 0.008493802 0 0.9999638 0.01551719 0 0.9998797 0 0 0.9999999 0 0 0.9999999 0.005707218 0 0.9999837 -0.01437115 0 0.9998966 -0.01076864 0 0.999942 0.005707218 0 0.9999837 0.0350408 0 0.9993858 2.87433e-4 0 0.9999999 -0.01437115 0 0.9998966 -0.01437115 0 0.9998966 2.87433e-4 0 0.9999999 -0.02978884 0 0.9995562 -0.04405994 0 0.9990288 -0.01076864 0 0.999942 -0.01437115 0 0.9998966 -0.04405994 0 0.9990288 -0.05479375 0 0.9984977 0.2013432 0 0.9795208 -0.02489365 0 0.9996901 -0.002261057 0 0.9999974 0.07583611 0 0.9971203 -0.02489365 0 0.9996901 -0.09181078 0 0.9957765 -0.05578013 0 0.9984431 -0.002261057 0 0.9999974 -0.002261057 0 0.9999974 -0.05578013 0 0.9984431 -0.02978884 0 0.9995562 2.87433e-4 0 0.9999999 0.07583611 0 0.9971203 -0.002261057 0 0.9999974 2.87433e-4 0 0.9999999 0.0350408 0 0.9993858 -0.1805316 0 0.9835693 -0.165552 0 0.9862011 -0.09155377 0 0.9958001 -0.1703545 0 0.9853827 -0.165552 0 0.9862011 -0.05479375 0 0.9984977 -0.04405994 0 0.9990288 -0.09155377 0 0.9958001 -0.09155377 0 0.9958001 -0.04405994 0 0.9990288 -0.02978884 0 0.9995562 -0.05578013 0 0.9984431 -0.1703545 0 0.9853827 -0.09155377 0 0.9958001 -0.05578013 0 0.9984431 -0.09181078 0 0.9957765 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.02726088 0 0.9996283 0.01270959 0 0.9999192 0 0 0.9999999 0 0 0.9999999 0.02317379 0 0.9997315 0.02726088 0 0.9996283 0.02726088 0 0.9996283 0.02317379 0 0.9997315 0.1126388 0 0.993636 0.1153436 0 0.9933257 0.01270959 0 0.9999192 0.02726088 0 0.9996283 0.1153436 0 0.9933257 0.06307106 0 0.998009 0 0 0.9999999 0.06095789 0 0.9981403 0.04306003 0 0.9990724 0 0 0.9999999 0.06095789 0 0.9981403 0.2227931 0 0.9748657 0.1968998 0 0.9804236 0.04306003 0 0.9990724 0.04306003 0 0.9990724 0.1968998 0 0.9804236 0.1126388 0 0.993636 0.02317379 0 0.9997315 0 0 0.9999999 0.04306003 0 0.9990724 0.02317379 0 0.9997315 0 0 0.9999999 0.4037092 0 0.9148874 0.127802 0 0.9917997 0.2939629 0 0.9558168 0.4512223 0 0.8924115 0.127802 0 0.9917997 0.06307106 0 0.998009 0.1153436 0 0.9933257 0.2939629 0 0.9558168 0.2939629 0 0.9558168 0.1153436 0 0.9933257 0.1126388 0 0.993636 0.1968998 0 0.9804236 0.4512223 0 0.8924115 0.2939629 0 0.9558168 0.1968998 0 0.9804236 0.2227931 0 0.9748657 0 0 0.9999999 0.007048741 0 0.999975 0.008904316 0 0.9999602 -0.002459988 0 0.9999968 0.007048741 0 0.999975 0.04067118 0 0.9991726 0.03381618 0 0.999428 0.008904316 0 0.9999602 0.008904316 0 0.9999602 0.03381618 0 0.999428 0.02988239 0 0.9995534 0.003997756 0 0.999992 -0.002459988 0 0.9999968 0.008904316 0 0.9999602 0.003997756 0 0.999992 -0.01187001 0 0.9999295 0.2279115 0 0.9736819 0.1360828 0 0.9906975 0.06521863 0 0.997871 0.1369795 0 0.9905738 0.1360828 0 0.9906975 0.04746189 0 0.9988729 0.03693128 0 0.9993178 0.06521863 0 0.997871 0.06521863 0 0.997871 0.03693128 0 0.9993178 0.02988239 0 0.9995534 0.03381618 0 0.999428 0.1369795 0 0.9905738 0.06521863 0 0.997871 0.03381618 0 0.999428 0.04067118 0 0.9991726 -0.08987024 0 0.9959534 -0.03798884 0 0.9992781 0.008252375 0 0.999966 0.002719855 0 0.9999962 -0.03798884 0 0.9992781 -0.01187001 0 0.9999295 0.003997756 0 0.999992 0.008252375 0 0.999966 0.008252375 0 0.999966 0.003997756 0 0.999992 0.02988239 0 0.9995534 0.03693128 0 0.9993178 0.002719855 0 0.9999962 0.008252375 0 0.999966 0.03693128 0 0.9993178 0.04746189 0 0.9988729 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.002507353 0 0.9999968 -0.004110199 0 0.9999914 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.002507353 0 0.9999968 -0.002507353 0 0.9999968 0 0 0.9999999 -0.005786194 0 0.9999832 -0.01221316 0 0.9999254 -0.004110199 0 0.9999914 -0.002507353 0 0.9999968 -0.01221316 0 0.9999254 -0.02348084 0 0.9997242 0 0 0.9999999 -0.001122448 0 0.9999992 -0.001607279 0 0.9999986 0 0 0.9999999 -0.001122448 0 0.9999992 -0.002913936 0 0.9999956 -0.004503626 0 0.9999898 -0.001607279 0 0.9999986 -0.001607279 0 0.9999986 -0.004503626 0 0.9999898 -0.005786194 0 0.9999832 0 0 0.9999999 0 0 0.9999999 -0.001607279 0 0.9999986 0 0 0.9999999 0 0 0.9999999 -0.05914384 0 0.9982495 -0.05687892 0 0.998381 -0.01419471 0 0.9998992 -0.003474462 0 0.9999939 -0.05687892 0 0.998381 -0.02348084 0 0.9997242 -0.01221316 0 0.9999254 -0.01419471 0 0.9998992 -0.01419471 0 0.9998992 -0.01221316 0 0.9999254 -0.005786194 0 0.9999832 -0.004503626 0 0.9999898 -0.003474462 0 0.9999939 -0.01419471 0 0.9998992 -0.004503626 0 0.9999898 -0.002913936 0 0.9999956 0 0 0.9999999 -0.004110199 0 0.9999914 -0.004613341 0 0.9999892 -0.00289167 0 0.9999958 -0.004110199 0 0.9999914 -0.02348084 0 0.9997242 -0.02183411 0 0.9997616 -0.004613341 0 0.9999892 -0.004613341 0 0.9999892 -0.02183411 0 0.9997616 -7.7113e-4 0 0.9999998 0.005858185 0 0.9999828 -0.00289167 0 0.9999958 -0.004613341 0 0.9999892 0.005858185 0 0.9999828 -0.01285514 0 0.9999173 -0.05914384 0 0.9982495 -0.09253413 0 0.9957095 -0.04910545 0 0.9987935 -0.05687892 0 0.998381 -0.09253413 0 0.9957095 -0.02518784 0 0.9996828 -0.009901225 0 0.9999509 -0.04910545 0 0.9987935 -0.04910545 0 0.9987935 -0.009901225 0 0.9999509 -7.7113e-4 0 0.9999998 -0.02183411 0 0.9997616 -0.05687892 0 0.998381 -0.04910545 0 0.9987935 -0.02183411 0 0.9997616 -0.02348084 0 0.9997242 -0.03524058 0 0.9993789 -0.05221741 0 0.9986356 0.02945162 0 0.9995663 0.05573636 0 0.9984455 -0.05221741 0 0.9986356 -0.01285514 0 0.9999173 0.005858185 0 0.9999828 0.02945162 0 0.9995663 0.02945162 0 0.9995663 0.005858185 0 0.9999828 -7.7113e-4 0 0.9999998 -0.009901225 0 0.9999509 0.05573636 0 0.9984455 0.02945162 0 0.9995663 -0.009901225 0 0.9999509 -0.02518784 0 0.9996828</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape6-textangents-array" count="3072" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape6-texbinormals">
+ <float_array id="qt_gauge_background_Shape6-texbinormals-array" count="9216">0.9959535 0 0.08987024 0.9957489 0 0.09211002 0.9982715 0 0.05877185 0.9965511 0 0.08298156 0.9957489 0 0.09211002 0.9994529 0 0.03307548 0.9996453 0 0.0266347 0.9982715 0 0.05877185 0.9982715 0 0.05877185 0.9996453 0 0.0266347 0.999953 0 0.009702589 0.9994941 0 0.03180567 0.9965511 0 0.08298156 0.9982715 0 0.05877185 0.9994941 0 0.03180567 0.9992602 0 0.03845954 0.9982495 0 0.05914384 0.999994 0 0.003474462 0.9999975 0 -0.002233443 0.9998851 0 -0.01516469 0.999994 0 0.003474462 0.9999958 0 0.002913937 0.9999949 0 -0.003222933 0.9999975 0 -0.002233443 0.9999975 0 -0.002233443 0.9999949 0 -0.003222933 0.999953 0 0.009702589 0.9996453 0 0.0266347 0.9998851 0 -0.01516469 0.9999975 0 -0.002233443 0.9996453 0 0.0266347 0.9994529 0 0.03307548 1 0 0 0.9999593 0 0.009034538 0.9999818 0 0.006037829 0.9999995 0 0.001122448 0.9999593 0 0.009034538 0.9992602 0 0.03845954 0.9994941 0 0.03180567 0.9999818 0 0.006037829 0.9999818 0 0.006037829 0.9994941 0 0.03180567 0.999953 0 0.009702589 0.9999949 0 -0.003222933 0.9999995 0 0.001122448 0.9999818 0 0.006037829 0.9999949 0 -0.003222933 0.9999958 0 0.002913937 0.975965 0 0.2179274 0.9922283 0 0.1244305 0.9939998 0 0.1093819 0.9807804 0 0.1951147 0.9922283 0 0.1244305 0.9998497 0 0.01734295 0.9989102 0 -0.0466724 0.9939998 0 0.1093819 0.9939998 0 0.1093819 0.9989102 0 -0.0466724 0.9999934 0 -0.00365868 0.998704 0 0.05089718 0.9807804 0 0.1951147 0.9939998 0 0.1093819 0.998704 0 0.05089718 0.9968767 0 0.07897464 0.9830297 0 -0.1834467 0.9898081 0 -0.1424074 0.9910625 0 -0.1333989 0.9906849 0 -0.1361747 0.9898081 0 -0.1424074 0.9983565 0 -0.05730943 0.9990036 0 -0.04462958 0.9910625 0 -0.1333989 0.9910625 0 -0.1333989 0.9990036 0 -0.04462958 0.9999934 0 -0.00365868 0.9989102 0 -0.0466724 0.9906849 0 -0.1361747 0.9910625 0 -0.1333989 0.9989102 0 -0.0466724 0.9998497 0 0.01734295 1 0 0 0.9998724 0 0.01597781 0.9999979 0 0.00205647 0.999935 0 -0.01140279 0.9998724 0 0.01597781 0.9968767 0 0.07897464 0.998704 0 0.05089718 0.9999979 0 0.00205647 0.9999979 0 0.00205647 0.998704 0 0.05089718 0.9999934 0 -0.00365868 0.9990036 0 -0.04462958 0.999935 0 -0.01140279 0.9999979 0 0.00205647 0.9990036 0 -0.04462958 0.9983565 0 -0.05730943 0.990472 0 -0.1377146 0.9997114 0 -0.02402808 0.9998087 0 -0.01956049 0.9970284 0 -0.07703547 0.9997114 0 -0.02402808 0.9997891 0 -0.02053998 0.9997168 0 -0.02379893 0.9998087 0 -0.01956049 0.9998087 0 -0.01956049 0.9997168 0 -0.02379893 0.9998729 0 -0.01594463 0.9999521 0 -0.009783177 0.9970284 0 -0.07703547 0.9998087 0 -0.01956049 0.9999521 0 -0.009783177 0.9995229 0 -0.03088732 0.9928219 0 -0.1196025 0.9971569 0 -0.07535425 0.9981654 0 -0.06054668 0.9986653 0 -0.05164892 0.9971569 0 -0.07535425 0.9997482 0 -0.02243814 0.9997997 0 -0.02001269 0.9981654 0 -0.06054668 0.9981654 0 -0.06054668 0.9997997 0 -0.02001269 0.9998729 0 -0.01594463 0.9997168 0 -0.02379893 0.9986653 0 -0.05164892 0.9981654 0 -0.06054668 0.9997168 0 -0.02379893 0.9997891 0 -0.02053998 1 0 0 0.9999833 0 -0.005778042 0.9999714 0 -0.007567265 0.9999926 0 -0.003845757 0.9999833 0 -0.005778042 0.9995229 0 -0.03088732 0.9999521 0 -0.009783177 0.9999714 0 -0.007567265 0.9999714 0 -0.007567265 0.9999521 0 -0.009783177 0.9998729 0 -0.01594463 0.9997997 0 -0.02001269 0.9999926 0 -0.003845757 0.9999714 0 -0.007567265 0.9997997 0 -0.02001269 0.9997482 0 -0.02243814 0.995954 0 -0.08986462 0.9999964 0 0.002712732 0.9999689 0 0.007881529 0.9992657 0 -0.03831797 0.9999964 0 0.002712732 0.9988735 0 0.04745399 0.9993315 0 0.03655854 0.9999689 0 0.007881529 0.9999689 0 0.007881529 0.9993315 0 0.03655854 0.9995776 0 0.0290612 0.999995 0 0.003186807 0.9992657 0 -0.03831797 0.9999689 0 0.007881529 0.999995 0 0.003186807 0.9999199 0 -0.01266264 0.9736832 0 0.2279059 0.9906357 0 0.1365321 0.9979168 0 0.0645162 0.9906987 0 0.1360739 0.9906357 0 0.1365321 0.9992105 0 0.03973084 0.999465 0 0.03270672 0.9979168 0 0.0645162 0.9979168 0 0.0645162 0.999465 0 0.03270672 0.9995776 0 0.0290612 0.9993315 0 0.03655854 0.9906987 0 0.1360739 0.9979168 0 0.0645162 0.9993315 0 0.03655854 0.9988735 0 0.04745399 1 0 0 0.9999961 0 -0.002828379 0.9999679 0 0.008017636 0.9999774 0 0.006730992 0.9999961 0 -0.002828379 0.9999199 0 -0.01266264 0.999995 0 0.003186807 0.9999679 0 0.008017636 0.9999679 0 0.008017636 0.999995 0 0.003186807 0.9995776 0 0.0290612 0.999465 0 0.03270672 0.9999774 0 0.006730992 0.9999679 0 0.008017636 0.999465 0 0.03270672 0.9992105 0 0.03973084 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9835699 0 -0.1805284 0.9853832 0 -0.1703528 0.995893 0 -0.09053835 0.9865339 0 -0.1635567 0.9853832 0 -0.1703528 0.9957765 0 -0.09181051 0.9984647 0 -0.05539323 0.995893 0 -0.09053835 0.995893 0 -0.09053835 0.9984647 0 -0.05539323 0.999576 0 -0.02911893 0.9990816 0 -0.04285049 0.9865339 0 -0.1635567 0.995893 0 -0.09053835 0.9990816 0 -0.04285049 0.9986086 0 -0.05273595 0.97952 0 0.2013473 0.997142 0 0.0755503 0.9999974 0 -0.002272231 0.9996902 0 -0.02489294 0.997142 0 0.0755503 0.9994032 0 0.03454527 0.9999999 0 3.16239e-4 0.9999974 0 -0.002272231 0.9999974 0 -0.002272231 0.9999999 0 3.16239e-4 0.999576 0 -0.02911893 0.9984647 0 -0.05539323 0.9996902 0 -0.02489294 0.9999974 0 -0.002272231 0.9984647 0 -0.05539323 0.9957765 0 -0.09181051 1 0 0 0.9999482 0 -0.01017777 0.9999053 0 -0.01376182 0.9999847 0 0.005551512 0.9999482 0 -0.01017777 0.9986086 0 -0.05273595 0.9990816 0 -0.04285049 0.9999053 0 -0.01376182 0.9999053 0 -0.01376182 0.9990816 0 -0.04285049 0.999576 0 -0.02911893 0.9999999 0 3.16239e-4 0.9999847 0 0.005551512 0.9999053 0 -0.01376182 0.9999999 0 3.16239e-4 0.9994032 0 0.03454527 0.9148871 0 0.4037099 0.8388976 0 0.5442893 0.9280552 0 0.3724428 0.8962344 0 0.4435811 0.8388976 0 0.5442893 0.959359 0 0.2821887 0.9838606 0 0.1789374 0.9280552 0 0.3724428 0.9280552 0 0.3724428 0.9838606 0 0.1789374 0.9970102 0 0.07727098 0.9864516 0 0.1640528 0.8962344 0 0.4435811 0.9280552 0 0.3724428 0.9864516 0 0.1640528 0.9710416 0 0.238911 0.9835699 0 -0.1805284 0.9995645 0 -0.02951292 0.9965542 0 0.08294462 0.9973506 0 0.07274585 0.9995645 0 -0.02951292 0.9999995 0 9.78085e-4 0.9983947 0 0.05664082 0.9965542 0 0.08294462 0.9965542 0 0.08294462 0.9983947 0 0.05664082 0.9970102 0 0.07727098 0.9838606 0 0.1789374 0.9973506 0 0.07274585 0.9965542 0 0.08294462 0.9838606 0 0.1789374 0.959359 0 0.2821887 1 0 0 0.998836 0 0.04823444 0.9992433 0 0.03889565 0.9999945 0 -0.003327887 0.998836 0 0.04823444 0.9710416 0 0.238911 0.9864516 0 0.1640528 0.9992433 0 0.03889565 0.9992433 0 0.03889565 0.9864516 0 0.1640528 0.9970102 0 0.07727098 0.9983947 0 0.05664082 0.9999945 0 -0.003327887 0.9992433 0 0.03889565 0.9983947 0 0.05664082 0.9999995 0 9.78085e-4 0.9148871 0 0.4037099 0.8962344 0 0.4435811 0.95856 0 0.2848909 0.9921083 0 0.1253846 0.8962344 0 0.4435811 0.9710416 0 0.238911 0.9856833 0 0.1686075 0.95856 0 0.2848909 0.95856 0 0.2848909 0.9856833 0 0.1686075 0.9947121 0 0.1027031 0.9941016 0 0.108453 0.9921083 0 0.1253846 0.95856 0 0.2848909 0.9941016 0 0.108453 0.9983048 0 0.05820303 1 0 0 1 0 0 0.9996402 0 0.02682351 0.998836 0 0.04823444 1 0 0 1 0 0 0.9997537 0 0.0221928 0.9996402 0 0.02682351 0.9996402 0 0.02682351 0.9997537 0 0.0221928 0.9947121 0 0.1027031 0.9856833 0 0.1686075 0.998836 0 0.04823444 0.9996402 0 0.02682351 0.9856833 0 0.1686075 0.9710416 0 0.238911 1 0 0 0.9999463 0 0.01037073 0.9996943 0 0.0247287 1 0 0 0.9999463 0 0.01037073 0.9983048 0 0.05820303 0.9941016 0 0.108453 0.9996943 0 0.0247287 0.9996943 0 0.0247287 0.9941016 0 0.108453 0.9947121 0 0.1027031 0.9997537 0 0.0221928 1 0 0 0.9996943 0 0.0247287 0.9997537 0 0.0221928 1 0 0 0.9982496 0 -0.05914237 0.9998851 0 0.01515702 0.9999985 0 0.001726887 0.9999871 0 -0.005086373 0.9998851 0 0.01515702 0.9994527 0 -0.03308019 0.9996353 0 -0.0270076 0.9999985 0 0.001726887 0.9999985 0 0.001726887 0.9996353 0 -0.0270076 0.9999441 0 -0.01057969 0.9999999 0 -5.65713e-4 0.9999871 0 -0.005086373 0.9999985 0 0.001726887 0.9999999 0 -5.65713e-4 0.9999998 0 -6.9514e-4 0.995954 0 -0.08986462 0.9964932 0 -0.08367535 0.9982331 0 -0.0594203 0.9957491 0 -0.09210718 0.9964932 0 -0.08367535 0.9991899 0 -0.04024558 0.9995193 0 -0.03100401 0.9982331 0 -0.0594203 0.9982331 0 -0.0594203 0.9995193 0 -0.03100401 0.9999441 0 -0.01057969 0.9996353 0 -0.0270076 0.9957491 0 -0.09210718 0.9982331 0 -0.0594203 0.9996353 0 -0.0270076 0.9994527 0 -0.03308019 1 0 0 0.9999995 0 0.001127798 0.9999851 0 -0.005476065 0.9999254 0 -0.01221204 0.9999995 0 0.001127798 0.9999998 0 -6.9514e-4 0.9999999 0 -5.65713e-4 0.9999851 0 -0.005476065 0.9999851 0 -0.005476065 0.9999999 0 -5.65713e-4 0.9999441 0 -0.01057969 0.9995193 0 -0.03100401 0.9999254 0 -0.01221204 0.9999851 0 -0.005476065 0.9995193 0 -0.03100401 0.9991899 0 -0.04024558 0.9982496 0 -0.05914237 0.9999871 0 -0.005086373 0.9999029 0 -0.01393968 0.9983621 0 -0.05721337 0.9999871 0 -0.005086373 0.9999998 0 -6.9514e-4 0.9999859 0 -0.005303523 0.9999029 0 -0.01393968 0.9999029 0 -0.01393968 0.9999859 0 -0.005303523 0.9999862 0 -0.005261842 0.999926 0 -0.01217423 0.9983621 0 -0.05721337 0.9999029 0 -0.01393968 0.999926 0 -0.01217423 0.9997185 0 -0.0237267 1 0 0 1 0 0 0.9999966 0 -0.002614024 0.9999995 0 0.001127798 1 0 0 1 0 0 1 0 2.4068e-4 0.9999966 0 -0.002614024 0.9999966 0 -0.002614024 1 0 2.4068e-4 0.9999862 0 -0.005261842 0.9999859 0 -0.005303523 0.9999995 0 0.001127798 0.9999966 0 -0.002614024 0.9999859 0 -0.005303523 0.9999998 0 -6.9514e-4 1 0 0 0.9999915 0 -0.004137692 0.999997 0 -0.002464417 1 0 0 0.9999915 0 -0.004137692 0.9997185 0 -0.0237267 0.999926 0 -0.01217423 0.999997 0 -0.002464417 0.999997 0 -0.002464417 0.999926 0 -0.01217423 0.9999862 0 -0.005261842 1 0 2.4068e-4 1 0 0 0.999997 0 -0.002464417 1 0 2.4068e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999926 0 -0.003845757 0.9999875 0 -0.004994718 1 0 0 0.9999926 0 -0.003845757 0.9997482 0 -0.02243814 0.9998545 0 -0.01706017 0.9999875 0 -0.004994718 0.9999875 0 -0.004994718 0.9998545 0 -0.01706017 0.9998593 0 -0.01677918 0.999988 0 -0.004892818 1 0 0 0.9999875 0 -0.004994718 0.999988 0 -0.004892818 1 0 0 0.9928219 0 -0.1196025 0.9978572 0 -0.06542996 0.9993088 0 -0.0371747 0.9971569 0 -0.07535425 0.9978572 0 -0.06542996 0.9998055 0 -0.01972274 0.999746 0 -0.02254057 0.9993088 0 -0.0371747 0.9993088 0 -0.0371747 0.999746 0 -0.02254057 0.9998593 0 -0.01677918 0.9998545 0 -0.01706017 0.9971569 0 -0.07535425 0.9993088 0 -0.0371747 0.9998545 0 -0.01706017 0.9997482 0 -0.02243814 1 0 0 1 0 0 0.9999829 0 -0.00585784 0.9999921 0 -0.003982214 1 0 0 1 0 0 0.999988 0 -0.004892818 0.9999829 0 -0.00585784 0.9999829 0 -0.00585784 0.999988 0 -0.004892818 0.9998593 0 -0.01677918 0.999746 0 -0.02254057 0.9999921 0 -0.003982214 0.9999829 0 -0.00585784 0.999746 0 -0.02254057 0.9998055 0 -0.01972274 1 0 0 0.999934 0 0.01149224 0.9997971 0 0.02014703 1 0 0 0.999934 0 0.01149224 0.9983925 0 0.05668033 0.9980074 0 0.06309776 0.9997971 0 0.02014703 0.9997971 0 0.02014703 0.9980074 0 0.06309776 0.9988893 0 0.04711959 0.9999281 0 0.01199431 1 0 0 0.9997971 0 0.02014703 0.9999281 0 0.01199431 1 0 0 0.9991711 0 0.04070805 0.9855773 0 0.1692265 0.9901661 0 0.1398975 0.9916872 0 0.128672 0.9855773 0 0.1692265 0.9974803 0 0.07094504 0.9982017 0 0.05994552 0.9901661 0 0.1398975 0.9901661 0 0.1398975 0.9982017 0 0.05994552 0.9988893 0 0.04711959 0.9980074 0 0.06309776 0.9916872 0 0.128672 0.9901661 0 0.1398975 0.9980074 0 0.06309776 0.9983925 0 0.05668033 1 0 0 1 0 0 0.9998933 0 0.01461277 0.999901 0 0.01407318 1 0 0 1 0 0 0.9999281 0 0.01199431 0.9998933 0 0.01461277 0.9998933 0 0.01461277 0.9999281 0 0.01199431 0.9988893 0 0.04711959 0.9982017 0 0.05994552 0.999901 0 0.01407318 0.9998933 0 0.01461277 0.9982017 0 0.05994552 0.9974803 0 0.07094504 0.981908 0 -0.1893584 0.9997101 0 -0.02407806 0.9998239 0 -0.01876982 0.9952986 0 -0.0968545 0.9997101 0 -0.02407806 1 0 -1.76028e-4 0.9999988 0 -0.001572202 0.9998239 0 -0.01876982 0.9998239 0 -0.01876982 0.9999988 0 -0.001572202 0.9999997 0 8.6235e-4 0.9999679 0 -0.008018507 0.9952986 0 -0.0968545 0.9998239 0 -0.01876982 0.9999679 0 -0.008018507 0.9991005 0 -0.04240488 1 0 0 1 0 0 0.9999999 0 -4.36689e-4 0.9999997 0 -8.08648e-4 1 0 0 1 0 0 0.9999987 0 0.001564398 0.9999999 0 -4.36689e-4 0.9999999 0 -4.36689e-4 0.9999987 0 0.001564398 0.9999997 0 8.6235e-4 0.9999988 0 -0.001572202 0.9999997 0 -8.08648e-4 0.9999999 0 -4.36689e-4 0.9999988 0 -0.001572202 1 0 -1.76028e-4 1 0 0 0.9999626 0 -0.008663582 0.9999866 0 -0.005179363 1 0 0 0.9999626 0 -0.008663582 0.9991005 0 -0.04240488 0.9999679 0 -0.008018507 0.9999866 0 -0.005179363 0.9999866 0 -0.005179363 0.9999679 0 -0.008018507 0.9999997 0 8.6235e-4 0.9999987 0 0.001564398 1 0 0 0.9999866 0 -0.005179363 0.9999987 0 0.001564398 1 0 0 0.9976699 0 -0.06822734 1 0 0 0.9999976 0 0.002233636 0.9995455 0 -0.03014819 1 0 0 0.999788 0 0.02059194 0.9997388 0 0.02285338 0.9999976 0 0.002233636 0.9999976 0 0.002233636 0.9997388 0 0.02285338 0.9998434 0 0.01770022 0.9999918 0 0.004064289 0.9995455 0 -0.03014819 0.9999976 0 0.002233636 0.9999918 0 0.004064289 0.9999278 0 -0.0120189 0.992822 0 0.1196016 0.997157 0 0.0753525 0.9993112 0 0.03711113 0.9978734 0 0.06518252 0.997157 0 0.0753525 0.9997483 0 0.02243901 0.9998345 0 0.01819791 0.9993112 0 0.03711113 0.9993112 0 0.03711113 0.9998345 0 0.01819791 0.9998434 0 0.01770022 0.9997388 0 0.02285338 0.9978734 0 0.06518252 0.9993112 0 0.03711113 0.9997388 0 0.02285338 0.999788 0 0.02059194 1 0 0 0.9999975 0 -0.00223094 0.9999911 0 0.004240578 0.9999927 0 0.003842396 0.9999975 0 -0.00223094 0.9999278 0 -0.0120189 0.9999918 0 0.004064289 0.9999911 0 0.004240578 0.9999911 0 0.004240578 0.9999918 0 0.004064289 0.9998434 0 0.01770022 0.9998345 0 0.01819791 0.9999927 0 0.003842396 0.9999911 0 0.004240578 0.9998345 0 0.01819791 0.9997483 0 0.02243901 0.9830297 0 -0.1834467 0.9999171 0 -0.01287881 0.9999399 0 -0.01097353 0.9980429 0 -0.06253487 0.9999171 0 -0.01287881 0.9997931 0 -0.02034273 0.9997056 0 -0.02426663 0.9999399 0 -0.01097353 0.9999399 0 -0.01097353 0.9997056 0 -0.02426663 0.9998601 0 -0.01673236 0.9999495 0 -0.01004825 0.9980429 0 -0.06253487 0.9999399 0 -0.01097353 0.9999495 0 -0.01004825 0.999387 0 -0.03501255 0.9976699 0 -0.06822734 0.9982419 0 -0.05927243 0.9985996 0 -0.0529056 0.9986919 0 -0.05113285 0.9982419 0 -0.05927243 0.9996588 0 -0.02611938 0.9997739 0 -0.02126396 0.9985996 0 -0.0529056 0.9985996 0 -0.0529056 0.9997739 0 -0.02126396 0.9998601 0 -0.01673236 0.9997056 0 -0.02426663 0.9986919 0 -0.05113285 0.9985996 0 -0.0529056 0.9997056 0 -0.02426663 0.9997931 0 -0.02034273 1 0 0 0.9999631 0 -0.008595093 0.9999612 0 -0.008818858 0.9999852 0 -0.005442067 0.9999631 0 -0.008595093 0.999387 0 -0.03501255 0.9999495 0 -0.01004825 0.9999612 0 -0.008818858 0.9999612 0 -0.008818858 0.9999495 0 -0.01004825 0.9998601 0 -0.01673236 0.9997739 0 -0.02126396 0.9999852 0 -0.005442067 0.9999612 0 -0.008818858 0.9997739 0 -0.02126396 0.9996588 0 -0.02611938 1 0 0 0.999988 0 0.004914762 0.9999694 0 0.007833794 0.9999704 0 0.007704009 0.999988 0 0.004914762 0.9997346 0 0.02304167 0.9998281 0 0.01854246 0.9999694 0 0.007833794 0.9999694 0 0.007833794 0.9998281 0 0.01854246 0.9999077 0 0.01359135 0.9999381 0 0.01113022 0.9999704 0 0.007704009 0.9999694 0 0.007833794 0.9999381 0 0.01113022 0.9995356 0 0.03047148 0.9982299 0 0.0594749 0.9990283 0 0.04407626 0.9989476 0 0.04586784 0.998658 0 0.05179163 0.9990283 0 0.04407626 0.9998478 0 0.01744742 0.9997981 0 0.02009226 0.9989476 0 0.04586784 0.9989476 0 0.04586784 0.9997981 0 0.02009226 0.9999077 0 0.01359135 0.9998281 0 0.01854246 0.998658 0 0.05179163 0.9989476 0 0.04586784 0.9998281 0 0.01854246 0.9997346 0 0.02304167 0.987451 0 0.1579259 0.9985545 0 0.05375116 0.9999558 0 0.009407664 0.9999396 0 0.01099377 0.9985545 0 0.05375116 0.9995356 0 0.03047148 0.9999381 0 0.01113022 0.9999558 0 0.009407664 0.9999558 0 0.009407664 0.9999381 0 0.01113022 0.9999077 0 0.01359135 0.9997981 0 0.02009226 0.9999396 0 0.01099377 0.9999558 0 0.009407664 0.9997981 0 0.02009226 0.9998478 0 0.01744742 1 0 0 0.999901 0 -0.01407445 0.9999041 0 -0.01385396 0.9999978 0 0.002095935 0.999901 0 -0.01407445 0.9974802 0 -0.07094575 0.9981526 0 -0.06075683 0.9999041 0 -0.01385396 0.9999041 0 -0.01385396 0.9981526 0 -0.06075683 0.9988487 0 -0.04797253 0.9999446 0 -0.01053009 0.9999978 0 0.002095935 0.9999041 0 -0.01385396 0.9999446 0 -0.01053009 0.9999292 0 0.0119076 0.9991711 0 -0.04070804 0.991706 0 -0.1285274 0.9901631 0 -0.1399183 0.9855777 0 -0.1692238 0.991706 0 -0.1285274 0.998341 0 -0.05757831 0.997982 0 -0.06349803 0.9901631 0 -0.1399183 0.9901631 0 -0.1399183 0.997982 0 -0.06349803 0.9988487 0 -0.04797253 0.9981526 0 -0.06075683 0.9855777 0 -0.1692238 0.9901631 0 -0.1399183 0.9981526 0 -0.06075683 0.9974802 0 -0.07094575 0.9982299 0 0.0594749 0.9997154 0 0.02385697 0.9998177 0 -0.01909464 0.9999686 0 -0.007917849 0.9997154 0 0.02385697 0.9999292 0 0.0119076 0.9999446 0 -0.01053009 0.9998177 0 -0.01909464 0.9998177 0 -0.01909464 0.9999446 0 -0.01053009 0.9988487 0 -0.04797253 0.997982 0 -0.06349803 0.9999686 0 -0.007917849 0.9998177 0 -0.01909464 0.997982 0 -0.06349803 0.998341 0 -0.05757831 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998596 0 0.01675914 0.9988832 0 0.04724848 0.999988 0 -0.004915657 0.9998596 0 0.01675914 0.9937648 0 0.1114978 0.9792719 0 0.2025501 0.9988832 0 0.04724848 0.9988832 0 0.04724848 0.9792719 0 0.2025501 0.967905 0 0.2513165 0.996555 0 0.0829344 0.999988 0 -0.004915657 0.9988832 0 0.04724848 0.996555 0 0.0829344 0.9998544 0 -0.01706355 0.6729976 0 0.7396447 0.5433308 0 0.8395188 0.7875474 0 0.6162542 0.9491151 0 0.3149295 0.5433308 0 0.8395188 0.7762094 0 0.6304752 0.8598453 0 0.5105547 0.7875474 0 0.6162542 0.7875474 0 0.6162542 0.8598453 0 0.5105547 0.967905 0 0.2513165 0.9792719 0 0.2025501 0.9491151 0 0.3149295 0.7875474 0 0.6162542 0.9792719 0 0.2025501 0.9937648 0 0.1114978 0.9991711 0 -0.04070804 0.9987375 0 0.05023343 0.9597785 0 0.2807584 0.8818473 0 0.4715353 0.9987375 0 0.05023343 0.9998544 0 -0.01706355 0.996555 0 0.0829344 0.9597785 0 0.2807584 0.9597785 0 0.2807584 0.996555 0 0.0829344 0.967905 0 0.2513165 0.8598453 0 0.5105547 0.8818473 0 0.4715353 0.9597785 0 0.2807584 0.8598453 0 0.5105547 0.7762094 0 0.6304752 0.9835693 0 0.1805316 0.999548 0 0.03006515 0.992338 0 0.1235535 0.986201 0 0.165552 0.999548 0 0.03006515 0.9999998 0 -7.7858e-4 0.9994726 0 0.0324773 0.992338 0 0.1235535 0.992338 0 0.1235535 0.9994726 0 0.0324773 0.9997793 0 0.02100656 0.9991398 0 0.04147042 0.986201 0 0.165552 0.992338 0 0.1235535 0.9991398 0 0.04147042 0.9984977 0 0.05479376 1 0 0 1 0 0 0.9999793 0 0.006447373 0.9999961 0 -0.002818307 1 0 0 1 0 0 0.9999993 0 0.001210038 0.9999793 0 0.006447373 0.9999793 0 0.006447373 0.9999993 0 0.001210038 0.9997793 0 0.02100656 0.9994726 0 0.0324773 0.9999961 0 -0.002818307 0.9999793 0 0.006447373 0.9994726 0 0.0324773 0.9999998 0 -7.7858e-4 1 0 0 0.999942 0 0.01076864 0.9999716 0 0.007554521 1 0 0 0.999942 0 0.01076864 0.9984977 0 0.05479376 0.9991398 0 0.04147042 0.9999716 0 0.007554521 0.9999716 0 0.007554521 0.9991398 0 0.04147042 0.9997793 0 0.02100656 0.9999993 0 0.001210038 1 0 0 0.9999716 0 0.007554521 0.9999993 0 0.001210038 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9148874 0 -0.4037092 0.9994566 0 -0.03296458 0.9991916 0 -0.04020222 0.9917997 0 -0.127802 0.9994566 0 -0.03296458 0.997919 0 -0.06448073 0.9971878 0 -0.07494354 0.9991916 0 -0.04020222 0.9991916 0 -0.04020222 0.9971878 0 -0.07494354 0.9984914 0 -0.05490832 0.9996762 0 -0.02544883 0.9917997 0 -0.127802 0.9991916 0 -0.04020222 0.9996762 0 -0.02544883 0.998009 0 -0.06307106 0.94732 0 -0.3202888 0.9758039 0 -0.2186481 0.9924616 0 -0.1225567 0.9775161 0 -0.2108611 0.9758039 0 -0.2186481 0.9968036 0 -0.07989162 0.9979837 0 -0.06347147 0.9924616 0 -0.1225567 0.9924616 0 -0.1225567 0.9979837 0 -0.06347147 0.9984914 0 -0.05490832 0.9971878 0 -0.07494354 0.9775161 0 -0.2108611 0.9924616 0 -0.1225567 0.9971878 0 -0.07494354 0.997919 0 -0.06448073 1 0 0 0.9999193 0 -0.01270959 0.9998812 0 -0.01541655 0.9998273 0 -0.0185828 0.9999193 0 -0.01270959 0.998009 0 -0.06307106 0.9996762 0 -0.02544883 0.9998812 0 -0.01541655 0.9998812 0 -0.01541655 0.9996762 0 -0.02544883 0.9984914 0 -0.05490832 0.9979837 0 -0.06347147 0.9998273 0 -0.0185828 0.9998812 0 -0.01541655 0.9979837 0 -0.06347147 0.9968036 0 -0.07989162 0.9835693 0 0.1805316 0.9973503 0 -0.072748 0.996681 0 -0.08140732 0.999548 0 0.03006515 0.9973503 0 -0.072748 0.959354 0 -0.2822052 0.9837121 0 -0.1797513 0.996681 0 -0.08140732 0.996681 0 -0.08140732 0.9837121 0 -0.1797513 0.9969538 0 -0.07799567 0.9989698 0 -0.04538204 0.999548 0 0.03006515 0.996681 0 -0.08140732 0.9989698 0 -0.04538204 0.9999998 0 -7.7858e-4 0.9148874 0 -0.4037092 0.8924116 0 -0.4512224 0.9261602 0 -0.3771305 0.8388909 0 -0.5442997 0.8924116 0 -0.4512224 0.9748658 0 -0.2227932 0.9854997 0 -0.1696774 0.9261602 0 -0.3771305 0.9261602 0 -0.3771305 0.9854997 0 -0.1696774 0.9969538 0 -0.07799567 0.9837121 0 -0.1797513 0.8388909 0 -0.5442997 0.9261602 0 -0.3771305 0.9837121 0 -0.1797513 0.959354 0 -0.2822052 1 0 0 0.9999961 0 -0.002818307 0.9993212 0 -0.03683922 0.9981404 0 -0.06095789 0.9999961 0 -0.002818307 0.9999998 0 -7.7858e-4 0.9989698 0 -0.04538204 0.9993212 0 -0.03683922 0.9993212 0 -0.03683922 0.9989698 0 -0.04538204 0.9969538 0 -0.07799567 0.9854997 0 -0.1696774 0.9981404 0 -0.06095789 0.9993212 0 -0.03683922 0.9854997 0 -0.1696774 0.9748658 0 -0.2227932 0.9959535 0 0.08987024 0.9965511 0 0.08298156 0.9989371 0 0.04609663 0.9992782 0 0.03798885 0.9965511 0 0.08298156 0.9992602 0 0.03845954 0.9996561 0 0.02622525 0.9989371 0 0.04609663 0.9989371 0 0.04609663 0.9996561 0 0.02622525 0.9999145 0 0.01308661 0.9996848 0 0.02511028 0.9992782 0 0.03798885 0.9989371 0 0.04609663 0.9996848 0 0.02511028 0.9999296 0 0.01187001 1 0 0 1 0 0 0.9999824 0 0.005929882 0.9999593 0 0.009034538 1 0 0 1 0 0 0.9999866 0 0.005194157 0.9999824 0 0.005929882 0.9999824 0 0.005929882 0.9999866 0 0.005194157 0.9999145 0 0.01308661 0.9996561 0 0.02622525 0.9999593 0 0.009034538 0.9999824 0 0.005929882 0.9996561 0 0.02622525 0.9992602 0 0.03845954 1 0 0 0.999997 0 0.002459988 0.9999833 0 0.005793337 1 0 0 0.999997 0 0.002459988 0.9999296 0 0.01187001 0.9996848 0 0.02511028 0.9999833 0 0.005793337 0.9999833 0 0.005793337 0.9996848 0 0.02511028 0.9999145 0 0.01308661 0.9999866 0 0.005194157 1 0 0 0.9999833 0 0.005793337 0.9999866 0 0.005194157 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9993789 0 0.03524058 0.9945751 0 0.1040204 0.9994451 0 0.03330841 0.9986358 0 0.05221742 0.9945751 0 0.1040204 0.9983422 0 -0.05755971 0.9971034 0 -0.07605807 0.9994451 0 0.03330841 0.9994451 0 0.03330841 0.9971034 0 -0.07605807 0.9982466 0 -0.05919446 0.9999884 0 0.004814705 0.9986358 0 0.05221742 0.9994451 0 0.03330841 0.9999884 0 0.004814705 0.9999174 0 0.01285514 0.9795208 0 -0.2013432 0.9971203 0 -0.07583611 0.9826009 0 -0.1857297 0.9665466 0 -0.2564912 0.9971203 0 -0.07583611 0.9993859 0 -0.0350408 0.9978725 0 -0.06519514 0.9826009 0 -0.1857297 0.9826009 0 -0.1857297 0.9978725 0 -0.06519514 0.9982466 0 -0.05919446 0.9971034 0 -0.07605807 0.9665466 0 -0.2564912 0.9826009 0 -0.1857297 0.9971034 0 -0.07605807 0.9983422 0 -0.05755971 1 0 0 0.9999959 0 0.00289167 0.9998564 0 -0.01694918 0.9999838 0 -0.005707219 0.9999959 0 0.00289167 0.9999174 0 0.01285514 0.9999884 0 0.004814705 0.9998564 0 -0.01694918 0.9998564 0 -0.01694918 0.9999884 0 0.004814705 0.9982466 0 -0.05919446 0.9978725 0 -0.06519514 0.9999838 0 -0.005707219 0.9998564 0 -0.01694918 0.9978725 0 -0.06519514 0.9993859 0 -0.0350408 1 0 0 1 0 0 0.9999878 0 0.00495726 0.9999576 0 0.009215754 1 0 0 1 0 0 0.9999983 0 -0.001828267 0.9999878 0 0.00495726 0.9999878 0 0.00495726 0.9999983 0 -0.001828267 0.9999996 0 -9.80075e-4 0.9999335 0 0.01153364 0.9999576 0 0.009215754 0.9999878 0 0.00495726 0.9999335 0 0.01153364 0.9989989 0 0.04473391 1 0 0 0.9999996 0 9.47033e-4 0.9999999 0 5.06915e-4 1 0 0 0.9999996 0 9.47033e-4 1 0 1.91607e-4 0.9999984 0 0.001806482 0.9999999 0 5.06915e-4 0.9999999 0 5.06915e-4 0.9999984 0 0.001806482 0.9999996 0 -9.80075e-4 0.9999983 0 -0.001828267 1 0 0 0.9999999 0 5.06915e-4 0.9999983 0 -0.001828267 1 0 0 0.975965 0 0.2179274 0.9940687 0 0.1087545 0.9997631 0 0.02176707 0.9996035 0 0.0281588 0.9940687 0 0.1087545 0.9989989 0 0.04473391 0.9999335 0 0.01153364 0.9997631 0 0.02176707 0.9997631 0 0.02176707 0.9999335 0 0.01153364 0.9999996 0 -9.80075e-4 0.9999984 0 0.001806482 0.9996035 0 0.0281588 0.9997631 0 0.02176707 0.9999984 0 0.001806482 1 0 1.91607e-4 1 0 0 1 0 0 0.9998849 0 0.01517425 0.9998724 0 0.01597781 1 0 0 1 0 0 0.9998787 0 0.01557602 0.9998849 0 0.01517425 0.9998849 0 0.01517425 0.9998787 0 0.01557602 0.9994186 0 0.03409681 0.9978422 0 0.06565927 0.9998724 0 0.01597781 0.9998849 0 0.01517425 0.9978422 0 0.06565927 0.9968767 0 0.07897464 1 0 0 0.9999576 0 0.009215754 0.9998524 0 0.01718289 1 0 0 0.9999576 0 0.009215754 0.9989989 0 0.04473391 0.9977257 0 0.06740642 0.9998524 0 0.01718289 0.9998524 0 0.01718289 0.9977257 0 0.06740642 0.9994186 0 0.03409681 0.9998787 0 0.01557602 1 0 0 0.9998524 0 0.01718289 0.9998787 0 0.01557602 1 0 0 0.975965 0 0.2179274 0.9807804 0 0.1951147 0.9932889 0 0.1156601 0.9940687 0 0.1087545 0.9807804 0 0.1951147 0.9968767 0 0.07897464 0.9978422 0 0.06565927 0.9932889 0 0.1156601 0.9932889 0 0.1156601 0.9978422 0 0.06565927 0.9994186 0 0.03409681 0.9977257 0 0.06740642 0.9940687 0 0.1087545 0.9932889 0 0.1156601 0.9977257 0 0.06740642 0.9989989 0 0.04473391 1 0 0 0.9999774 0 0.006730992 1 0 0 0.9999364 0 -0.0112845 0.9999774 0 0.006730992 0.9992105 0 0.03973084 0.9994156 0 0.03418556 1 0 0 1 0 0 0.9994156 0 0.03418556 0.9999879 0 0.004934463 0.9994991 0 -0.03165101 0.9999364 0 -0.0112845 1 0 0 0.9994991 0 -0.03165101 0.9985589 0 -0.05366655 0.9736832 0 0.2279059 0.9950944 0 0.09893125 0.9936931 0 0.1121351 0.9906357 0 0.1365321 0.9950944 0 0.09893125 0.9999838 0 -0.005689392 0.9994231 0 0.03396264 0.9936931 0 0.1121351 0.9936931 0 0.1121351 0.9994231 0 0.03396264 0.9999879 0 0.004934463 0.9994156 0 0.03418556 0.9906357 0 0.1365321 0.9936931 0 0.1121351 0.9994156 0 0.03418556 0.9992105 0 0.03973084 0.990472 0 -0.1377146 0.991328 0 -0.1314113 0.9980761 0 -0.06200107 0.9986134 0 -0.05264409 0.991328 0 -0.1314113 0.9985589 0 -0.05366655 0.9994991 0 -0.03165101 0.9980761 0 -0.06200107 0.9980761 0 -0.06200107 0.9994991 0 -0.03165101 0.9999879 0 0.004934463 0.9994231 0 0.03396264 0.9986134 0 -0.05264409 0.9980761 0 -0.06200107 0.9994231 0 0.03396264 0.9999838 0 -0.005689392 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999364 0 -0.0112845 0.9999071 0 -0.01363206 1 0 0 0.9999364 0 -0.0112845 0.9985589 0 -0.05366655 0.9989013 0 -0.04686315 0.9999071 0 -0.01363206 0.9999071 0 -0.01363206 0.9989013 0 -0.04686315 0.9996839 0 -0.02514052 0.9999586 0 -0.009112854 1 0 0 0.9999071 0 -0.01363206 0.9999586 0 -0.009112854 1 0 0 0.990472 0 -0.1377146 0.9970284 0 -0.07703547 0.997091 0 -0.076221 0.991328 0 -0.1314113 0.9970284 0 -0.07703547 0.9995229 0 -0.03088732 0.9991896 0 -0.04025307 0.997091 0 -0.076221 0.997091 0 -0.076221 0.9991896 0 -0.04025307 0.9996839 0 -0.02514052 0.9989013 0 -0.04686315 0.991328 0 -0.1314113 0.997091 0 -0.076221 0.9989013 0 -0.04686315 0.9985589 0 -0.05366655 1 0 0 1 0 0 0.999934 0 -0.01149436 0.9999833 0 -0.005778042 1 0 0 1 0 0 0.9999586 0 -0.009112854 0.999934 0 -0.01149436 0.999934 0 -0.01149436 0.9999586 0 -0.009112854 0.9996839 0 -0.02514052 0.9991896 0 -0.04025307 0.9999833 0 -0.005778042 0.999934 0 -0.01149436 0.9991896 0 -0.04025307 0.9995229 0 -0.03088732 1 0 0 1 0 0 0.9999809 0 -0.006190554 0.9999961 0 -0.002828379 1 0 0 1 0 0 0.9999861 0 -0.00528793 0.9999809 0 -0.006190554 0.9999809 0 -0.006190554 0.9999861 0 -0.00528793 0.9997267 0 -0.02337985 0.9996973 0 -0.02460164 0.9999961 0 -0.002828379 0.9999809 0 -0.006190554 0.9996973 0 -0.02460164 0.9999199 0 -0.01266264 1 0 0 0.9999254 0 -0.01221204 0.9999592 0 -0.009028272 1 0 0 0.9999254 0 -0.01221204 0.9991899 0 -0.04024558 0.9995144 0 -0.03116049 0.9999592 0 -0.009028272 0.9999592 0 -0.009028272 0.9995144 0 -0.03116049 0.9997267 0 -0.02337985 0.9999861 0 -0.00528793 1 0 0 0.9999592 0 -0.009028272 0.9999861 0 -0.00528793 1 0 0 0.995954 0 -0.08986462 0.9992657 0 -0.03831797 0.9989817 0 -0.04511838 0.9964932 0 -0.08367535 0.9992657 0 -0.03831797 0.9999199 0 -0.01266264 0.9996973 0 -0.02460164 0.9989817 0 -0.04511838 0.9989817 0 -0.04511838 0.9996973 0 -0.02460164 0.9997267 0 -0.02337985 0.9995144 0 -0.03116049 0.9964932 0 -0.08367535 0.9989817 0 -0.04511838 0.9995144 0 -0.03116049 0.9991899 0 -0.04024558 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999751 0 -0.007063986 0.9999482 0 -0.01017777 1 0 0 1 0 0 0.999999 0 -0.001379784 0.9999751 0 -0.007063986 0.9999751 0 -0.007063986 0.999999 0 -0.001379784 0.9997985 0 -0.02007654 0.9992292 0 -0.03925811 0.9999482 0 -0.01017777 0.9999751 0 -0.007063986 0.9992292 0 -0.03925811 0.9986086 0 -0.05273595 1 0 0 0.9999945 0 -0.003327887 0.9999936 0 -0.003604973 1 0 0 0.9999945 0 -0.003327887 0.9999995 0 9.78085e-4 0.9996512 0 -0.02641121 0.9999936 0 -0.003604973 0.9999936 0 -0.003604973 0.9996512 0 -0.02641121 0.9997985 0 -0.02007654 0.999999 0 -0.001379784 1 0 0 0.9999936 0 -0.003604973 0.999999 0 -0.001379784 1 0 0 0.9835699 0 -0.1805284 0.9865339 0 -0.1635567 0.9925704 0 -0.1216725 0.9995645 0 -0.02951292 0.9865339 0 -0.1635567 0.9986086 0 -0.05273595 0.9992292 0 -0.03925811 0.9925704 0 -0.1216725 0.9925704 0 -0.1216725 0.9992292 0 -0.03925811 0.9997985 0 -0.02007654 0.9996512 0 -0.02641121 0.9995645 0 -0.02951292 0.9925704 0 -0.1216725 0.9996512 0 -0.02641121 0.9999995 0 9.78085e-4 1 0 0 0.9998154 0 0.01921359 0.999886 0 0.01510078 0.9999463 0 0.01037073 0.9998154 0 0.01921359 0.9967151 0 0.08098858 0.9978998 0 0.06477628 0.999886 0 0.01510078 0.999886 0 0.01510078 0.9978998 0 0.06477628 0.9984799 0 0.05511805 0.9997338 0 0.02307167 0.9999463 0 0.01037073 0.999886 0 0.01510078 0.9997338 0 0.02307167 0.9983048 0 0.05820303 0.9473202 0 0.3202881 0.9775121 0 0.21088 0.9923517 0 0.1234433 0.9756843 0 0.2191806 0.9775121 0 0.21088 0.9979178 0 0.06449923 0.997207 0 0.07468718 0.9923517 0 0.1234433 0.9923517 0 0.1234433 0.997207 0 0.07468718 0.9984799 0 0.05511805 0.9978998 0 0.06477628 0.9756843 0 0.2191806 0.9923517 0 0.1234433 0.9978998 0 0.06477628 0.9967151 0 0.08098858 0.9148871 0 0.4037099 0.9921083 0 0.1253846 0.9992526 0 0.03865764 0.999456 0 0.03298182 0.9921083 0 0.1253846 0.9983048 0 0.05820303 0.9997338 0 0.02307167 0.9992526 0 0.03865764 0.9992526 0 0.03865764 0.9997338 0 0.02307167 0.9984799 0 0.05511805 0.997207 0 0.07468718 0.999456 0 0.03298182 0.9992526 0 0.03865764 0.997207 0 0.07468718 0.9979178 0 0.06449923 1 0 0 0.9999847 0 0.005551512 0.9998626 0 0.01658103 0.9999959 0 -0.002872556 0.9999847 0 0.005551512 0.9994032 0 0.03454527 0.9978985 0 0.06479689 0.9998626 0 0.01658103 0.9998626 0 0.01658103 0.9978985 0 0.06479689 0.9982463 0 0.05919808 0.9999884 0 -0.004820894 0.9999959 0 -0.002872556 0.9998626 0 0.01658103 0.9999884 0 -0.004820894 0.999918 0 -0.01281121 0.97952 0 0.2013473 0.9665492 0 0.2564812 0.982635 0 0.1855494 0.997142 0 0.0755503 0.9665492 0 0.2564812 0.9983421 0 0.05755962 0.9971077 0 0.07600116 0.982635 0 0.1855494 0.982635 0 0.1855494 0.9971077 0 0.07600116 0.9982463 0 0.05919808 0.9978985 0 0.06479689 0.997142 0 0.0755503 0.982635 0 0.1855494 0.9978985 0 0.06479689 0.9994032 0 0.03454527 0.9993788 0 -0.03524414 0.9986358 0 -0.0522176 0.9994457 0 -0.0332927 0.9945767 0 -0.1040069 0.9986358 0 -0.0522176 0.999918 0 -0.01281121 0.9999884 0 -0.004820894 0.9994457 0 -0.0332927 0.9994457 0 -0.0332927 0.9999884 0 -0.004820894 0.9982463 0 0.05919808 0.9971077 0 0.07600116 0.9945767 0 -0.1040069 0.9994457 0 -0.0332927 0.9971077 0 0.07600116 0.9983421 0 0.05755962 0.9993788 0 -0.03524414 0.9984456 0 0.05573405 0.9995648 0 0.02949854 0.9986358 0 -0.0522176 0.9984456 0 0.05573405 0.9996827 0 -0.02518799 0.9999508 0 -0.009926481 0.9995648 0 0.02949854 0.9995648 0 0.02949854 0.9999508 0 -0.009926481 0.9999998 0 -6.88162e-4 0.9999827 0 0.00589041 0.9986358 0 -0.0522176 0.9995648 0 0.02949854 0.9999827 0 0.00589041 0.999918 0 -0.01281121 0.9982496 0 -0.05914237 0.9983621 0 -0.05721337 0.9987828 0 -0.0493269 0.9957098 0 -0.09253066 0.9983621 0 -0.05721337 0.9997185 0 -0.0237267 0.9997594 0 -0.02193634 0.9987828 0 -0.0493269 0.9987828 0 -0.0493269 0.9997594 0 -0.02193634 0.9999998 0 -6.88162e-4 0.9999508 0 -0.009926481 0.9957098 0 -0.09253066 0.9987828 0 -0.0493269 0.9999508 0 -0.009926481 0.9996827 0 -0.02518799 1 0 0 0.9999959 0 -0.002872556 0.9999888 0 -0.004754009 0.9999915 0 -0.004137692 0.9999959 0 -0.002872556 0.999918 0 -0.01281121 0.9999827 0 0.00589041 0.9999888 0 -0.004754009 0.9999888 0 -0.004754009 0.9999827 0 0.00589041 0.9999998 0 -6.88162e-4 0.9997594 0 -0.02193634 0.9999915 0 -0.004137692 0.9999888 0 -0.004754009 0.9997594 0 -0.02193634 0.9997185 0 -0.0237267 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9991711 0 0.04070805 0.881843 0 -0.4715433 0.9598622 0 -0.2804722 0.9987496 0 -0.04999216 0.881843 0 -0.4715433 0.7762065 0 -0.6304789 0.8598779 0 -0.5104998 0.9598622 0 -0.2804722 0.9598622 0 -0.2804722 0.8598779 0 -0.5104998 0.9679877 0 -0.2509981 0.9965994 0 -0.08240009 0.9987496 0 -0.04999216 0.9598622 0 -0.2804722 0.9965994 0 -0.08240009 0.9998488 0 0.01739376 0.6730027 0 -0.7396401 0.9487318 0 -0.3160824 0.7873926 0 -0.6164519 0.543307 0 -0.8395341 0.9487318 0 -0.3160824 0.9935085 0 -0.1137589 0.9791492 0 -0.2031426 0.7873926 0 -0.6164519 0.7873926 0 -0.6164519 0.9791492 0 -0.2031426 0.9679877 0 -0.2509981 0.8598779 0 -0.5104998 0.543307 0 -0.8395341 0.7873926 0 -0.6164519 0.8598779 0 -0.5104998 0.7762065 0 -0.6304789 1 0 0 0.9999876 0 0.004980369 0.9988779 0 -0.04736044 0.9998434 0 -0.01770046 0.9999876 0 0.004980369 0.9998488 0 0.01739376 0.9965994 0 -0.08240009 0.9988779 0 -0.04736044 0.9988779 0 -0.04736044 0.9965994 0 -0.08240009 0.9679877 0 -0.2509981 0.9791492 0 -0.2031426 0.9998434 0 -0.01770046 0.9988779 0 -0.04736044 0.9791492 0 -0.2031426 0.9935085 0 -0.1137589 1 0 0 0.9998434 0 -0.01770046 0.9998875 0 0.01500125 0.9998154 0 0.01921359 0.9998434 0 -0.01770046 0.9935085 0 -0.1137589 0.9998358 0 -0.0181203 0.9998875 0 0.01500125 0.9998875 0 0.01500125 0.9998358 0 -0.0181203 0.9988875 0 0.04715603 0.99693 0 0.07829924 0.9998154 0 0.01921359 0.9998875 0 0.01500125 0.99693 0 0.07829924 0.9967151 0 0.08098858 0.6730027 0 -0.7396401 0.9975941 0 -0.06932566 0.9992957 0 -0.03752805 0.9487318 0 -0.3160824 0.9975941 0 -0.06932566 0.9978129 0 0.06610239 0.9976094 0 0.06910527 0.9992957 0 -0.03752805 0.9992957 0 -0.03752805 0.9976094 0 0.06910527 0.9988875 0 0.04715603 0.9998358 0 -0.0181203 0.9487318 0 -0.3160824 0.9992957 0 -0.03752805 0.9998358 0 -0.0181203 0.9935085 0 -0.1137589 0.9473202 0 0.3202881 0.9756843 0 0.2191806 0.9871678 0 0.1596864 0.9904245 0 0.138056 0.9756843 0 0.2191806 0.9967151 0 0.08098858 0.99693 0 0.07829924 0.9871678 0 0.1596864 0.9871678 0 0.1596864 0.99693 0 0.07829924 0.9988875 0 0.04715603 0.9976094 0 0.06910527 0.9904245 0 0.138056 0.9871678 0 0.1596864 0.9976094 0 0.06910527 0.9978129 0 0.06610239 1 0 0 1 0 0 0.999965 0 0.008373739 0.9999876 0 0.004980369 1 0 0 1 0 0 0.9998805 0 0.01546613 0.999965 0 0.008373739 0.999965 0 0.008373739 0.9998805 0 0.01546613 0.9995284 0 0.0307101 0.9991004 0 0.04240752 0.9999876 0 0.004980369 0.999965 0 0.008373739 0.9991004 0 0.04240752 0.9998488 0 0.01739376 1 0 0 0.999901 0 0.01407318 0.999926 0 0.01216678 1 0 0 0.999901 0 0.01407318 0.9974803 0 0.07094504 0.9984846 0 0.05503314 0.999926 0 0.01216678 0.999926 0 0.01216678 0.9984846 0 0.05503314 0.9995284 0 0.0307101 0.9998805 0 0.01546613 1 0 0 0.999926 0 0.01216678 0.9998805 0 0.01546613 1 0 0 0.9991711 0 0.04070805 0.9987496 0 -0.04999216 0.996039 0 0.08891708 0.9855773 0 0.1692265 0.9987496 0 -0.04999216 0.9998488 0 0.01739376 0.9991004 0 0.04240752 0.996039 0 0.08891708 0.996039 0 0.08891708 0.9991004 0 0.04240752 0.9995284 0 0.0307101 0.9984846 0 0.05503314 0.9855773 0 0.1692265 0.996039 0 0.08891708 0.9984846 0 0.05503314 0.9974803 0 0.07094504 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999465 0 0.01034416 0.9999983 0 -0.001847558 0.999895 0 -0.0144962 0.9999465 0 0.01034416 0.9987269 0 0.05044517 0.9992424 0 0.03892045 0.9999983 0 -0.001847558 0.9999983 0 -0.001847558 0.9992424 0 0.03892045 0.9999951 0 0.003138029 0.9990088 0 -0.04451344 0.999895 0 -0.0144962 0.9999983 0 -0.001847558 0.9990088 0 -0.04451344 0.9975707 0 -0.06966186 0.987451 0 0.1579259 0.9930949 0 0.1173142 0.9933507 0 0.1151278 0.9923957 0 0.1230891 0.9930949 0 0.1173142 0.9998869 0 -0.0150458 0.9991899 0 0.04024702 0.9933507 0 0.1151278 0.9933507 0 0.1151278 0.9991899 0 0.04024702 0.9999951 0 0.003138029 0.9992424 0 0.03892045 0.9923957 0 0.1230891 0.9933507 0 0.1151278 0.9992424 0 0.03892045 0.9987269 0 0.05044517 0.981908 0 -0.1893584 0.985454 0 -0.1699423 0.9954647 0 -0.09513193 0.994191 0 -0.1076311 0.985454 0 -0.1699423 0.9975707 0 -0.06966186 0.9990088 0 -0.04451344 0.9954647 0 -0.09513193 0.9954647 0 -0.09513193 0.9990088 0 -0.04451344 0.9999951 0 0.003138029 0.9991899 0 0.04024702 0.994191 0 -0.1076311 0.9954647 0 -0.09513193 0.9991899 0 0.04024702 0.9998869 0 -0.0150458 0.981908 0 -0.1893584 0.9952986 0 -0.0968545 0.9951863 0 -0.09800144 0.985454 0 -0.1699423 0.9952986 0 -0.0968545 0.9991005 0 -0.04240488 0.9986458 0 -0.05202499 0.9951863 0 -0.09800144 0.9951863 0 -0.09800144 0.9986458 0 -0.05202499 0.9995047 0 -0.03147172 0.9982656 0 -0.05887176 0.985454 0 -0.1699423 0.9951863 0 -0.09800144 0.9982656 0 -0.05887176 0.9975707 0 -0.06966186 1 0 0 1 0 0 0.9998779 0 -0.01563111 0.9999626 0 -0.008663582 1 0 0 1 0 0 0.9998956 0 -0.01445573 0.9998779 0 -0.01563111 0.9998779 0 -0.01563111 0.9998956 0 -0.01445573 0.9995047 0 -0.03147172 0.9986458 0 -0.05202499 0.9999626 0 -0.008663582 0.9998779 0 -0.01563111 0.9986458 0 -0.05202499 0.9991005 0 -0.04240488 1 0 0 0.999895 0 -0.0144962 0.9999012 0 -0.01405806 1 0 0 0.999895 0 -0.0144962 0.9975707 0 -0.06966186 0.9982656 0 -0.05887176 0.9999012 0 -0.01405806 0.9999012 0 -0.01405806 0.9982656 0 -0.05887176 0.9995047 0 -0.03147172 0.9998956 0 -0.01445573 1 0 0 0.9999012 0 -0.01405806 0.9998956 0 -0.01445573 1 0 0 1 0 0 1 0 0 0.9999886 0 -0.004801403 0.9999975 0 -0.00223094 1 0 0 1 0 0 0.9999923 0 -0.003946615 0.9999886 0 -0.004801403 0.9999886 0 -0.004801403 0.9999923 0 -0.003946615 0.9999484 0 -0.01016105 0.9998627 0 -0.01657705 0.9999975 0 -0.00223094 0.9999886 0 -0.004801403 0.9998627 0 -0.01657705 0.9999278 0 -0.0120189 1 0 0 0.9999852 0 -0.005442067 0.9999847 0 -0.005523655 1 0 0 0.9999852 0 -0.005442067 0.9996588 0 -0.02611938 0.9998045 0 -0.01977349 0.9999847 0 -0.005523655 0.9999847 0 -0.005523655 0.9998045 0 -0.01977349 0.9999484 0 -0.01016105 0.9999923 0 -0.003946615 1 0 0 0.9999847 0 -0.005523655 0.9999923 0 -0.003946615 1 0 0 0.9976699 0 -0.06822734 0.9995455 0 -0.03014819 0.9994713 0 -0.03251452 0.9982419 0 -0.05927243 0.9995455 0 -0.03014819 0.9999278 0 -0.0120189 0.9998627 0 -0.01657705 0.9994713 0 -0.03251452 0.9994713 0 -0.03251452 0.9998627 0 -0.01657705 0.9999484 0 -0.01016105 0.9998045 0 -0.01977349 0.9982419 0 -0.05927243 0.9994713 0 -0.03251452 0.9998045 0 -0.01977349 0.9996588 0 -0.02611938 1 0 0 1 0 0 0.9999517 0 -0.009835419 0.9999631 0 -0.008595093 1 0 0 1 0 0 0.9999842 0 -0.005619791 0.9999517 0 -0.009835419 0.9999517 0 -0.009835419 0.9999842 0 -0.005619791 0.9997334 0 -0.02309033 0.9991996 0 -0.04000225 0.9999631 0 -0.008595093 0.9999517 0 -0.009835419 0.9991996 0 -0.04000225 0.999387 0 -0.03501255 1 0 0 0.999935 0 -0.01140279 0.9999257 0 -0.01218723 1 0 0 0.999935 0 -0.01140279 0.9983565 0 -0.05730943 0.9990091 0 -0.04450616 0.9999257 0 -0.01218723 0.9999257 0 -0.01218723 0.9990091 0 -0.04450616 0.9997334 0 -0.02309033 0.9999842 0 -0.005619791 1 0 0 0.9999257 0 -0.01218723 0.9999842 0 -0.005619791 1 0 0 0.9830297 0 -0.1834467 0.9980429 0 -0.06253487 0.9972026 0 -0.07474661 0.9898081 0 -0.1424074 0.9980429 0 -0.06253487 0.999387 0 -0.03501255 0.9991996 0 -0.04000225 0.9972026 0 -0.07474661 0.9972026 0 -0.07474661 0.9991996 0 -0.04000225 0.9997334 0 -0.02309033 0.9990091 0 -0.04450616 0.9898081 0 -0.1424074 0.9972026 0 -0.07474661 0.9990091 0 -0.04450616 0.9983565 0 -0.05730943 0.987451 0 0.1579259 0.9923957 0 0.1230891 0.9978773 0 0.06512176 0.9985545 0 0.05375116 0.9923957 0 0.1230891 0.9987269 0 0.05044517 0.9992068 0 0.03982389 0.9978773 0 0.06512176 0.9978773 0 0.06512176 0.9992068 0 0.03982389 0.9997739 0 0.02126472 0.999364 0 0.03566004 0.9985545 0 0.05375116 0.9978773 0 0.06512176 0.999364 0 0.03566004 0.9995356 0 0.03047148 1 0 0 1 0 0 0.9999364 0 0.01127834 0.9999465 0 0.01034416 1 0 0 1 0 0 0.9999864 0 0.005232928 0.9999364 0 0.01127834 0.9999364 0 0.01127834 0.9999864 0 0.005232928 0.9997739 0 0.02126472 0.9992068 0 0.03982389 0.9999465 0 0.01034416 0.9999364 0 0.01127834 0.9992068 0 0.03982389 0.9987269 0 0.05044517 1 0 0 0.9999704 0 0.007704009 0.999959 0 0.009060658 1 0 0 0.9999704 0 0.007704009 0.9995356 0 0.03047148 0.999364 0 0.03566004 0.999959 0 0.009060658 0.999959 0 0.009060658 0.999364 0 0.03566004 0.9997739 0 0.02126472 0.9999864 0 0.005232928 1 0 0 0.999959 0 0.009060658 0.9999864 0 0.005232928 1 0 0 0.9982299 0 0.0594749 0.998658 0 0.05179163 0.9995877 0 0.02871674 0.9997154 0 0.02385697 0.998658 0 0.05179163 0.9997346 0 0.02304167 0.9998412 0 0.01782426 0.9995877 0 0.02871674 0.9995877 0 0.02871674 0.9998412 0 0.01782426 0.9999555 0 0.009433685 0.9998871 0 0.01502872 0.9997154 0 0.02385697 0.9995877 0 0.02871674 0.9998871 0 0.01502872 0.9999292 0 0.0119076 1 0 0 1 0 0 0.9999871 0 0.00509428 0.999988 0 0.004914762 1 0 0 1 0 0 0.9999934 0 0.003648892 0.9999871 0 0.00509428 0.9999871 0 0.00509428 0.9999934 0 0.003648892 0.9999555 0 0.009433685 0.9998412 0 0.01782426 0.999988 0 0.004914762 0.9999871 0 0.00509428 0.9998412 0 0.01782426 0.9997346 0 0.02304167 1 0 0 0.9999978 0 0.002095935 0.9999905 0 0.004380475 1 0 0 0.9999978 0 0.002095935 0.9999292 0 0.0119076 0.9998871 0 0.01502872 0.9999905 0 0.004380475 0.9999905 0 0.004380475 0.9998871 0 0.01502872 0.9999555 0 0.009433685 0.9999934 0 0.003648892 1 0 0 0.9999905 0 0.004380475 0.9999934 0 0.003648892 1 0 0 0.9904722 0 0.1377132 0.9986134 0 0.0526439 0.9980334 0 0.06268418 0.9911939 0 0.1324185 0.9986134 0 0.0526439 0.9999838 0 0.005688859 0.999436 0 -0.03358199 0.9980334 0 0.06268418 0.9980334 0 0.06268418 0.999436 0 -0.03358199 0.9999921 0 -0.004003589 0.9994445 0 0.03333009 0.9911939 0 0.1324185 0.9980334 0 0.06268418 0.9994445 0 0.03333009 0.9984625 0 0.05543282 0.9736819 0 -0.2279115 0.9905739 0 -0.1369795 0.9937114 0 -0.1119722 0.9950934 0 -0.09894031 0.9905739 0 -0.1369795 0.9991726 0 -0.04067118 0.9994254 0 -0.03389781 0.9937114 0 -0.1119722 0.9937114 0 -0.1119722 0.9994254 0 -0.03389781 0.9999921 0 -0.004003589 0.999436 0 -0.03358199 0.9950934 0 -0.09894031 0.9937114 0 -0.1119722 0.999436 0 -0.03358199 0.9999838 0 0.005688859 1 0 0 0.9999286 0 0.01195899 0.9999997 0 8.88995e-4 0.9999752 0 -0.007048742 0.9999286 0 0.01195899 0.9984625 0 0.05543282 0.9994445 0 0.03333009 0.9999997 0 8.88995e-4 0.9999997 0 8.88995e-4 0.9994445 0 0.03333009 0.9999921 0 -0.004003589 0.9994254 0 -0.03389781 0.9999752 0 -0.007048742 0.9999997 0 8.88995e-4 0.9994254 0 -0.03389781 0.9991726 0 -0.04067118 1 0 0 0.9999927 0 0.003842396 0.9999714 0 0.0075672 0.9999834 0 0.005774216 0.9999927 0 0.003842396 0.9997483 0 0.02243901 0.9997998 0 0.02001175 0.9999714 0 0.0075672 0.9999714 0 0.0075672 0.9997998 0 0.02001175 0.999873 0 0.01593899 0.9999523 0 0.009777888 0.9999834 0 0.005774216 0.9999714 0 0.0075672 0.9999523 0 0.009777888 0.9995229 0 0.03088753 0.992822 0 0.1196016 0.9986653 0 0.05165038 0.9981655 0 0.06054549 0.997157 0 0.0753525 0.9986653 0 0.05165038 0.999789 0 0.02054628 0.9997168 0 0.0237992 0.9981655 0 0.06054549 0.9981655 0 0.06054549 0.9997168 0 0.0237992 0.999873 0 0.01593899 0.9997998 0 0.02001175 0.997157 0 0.0753525 0.9981655 0 0.06054549 0.9997998 0 0.02001175 0.9997483 0 0.02243901 0.9904722 0 0.1377132 0.9970288 0 0.07703063 0.9998088 0 0.01955758 0.9997113 0 0.02402732 0.9970288 0 0.07703063 0.9995229 0 0.03088753 0.9999523 0 0.009777888 0.9998088 0 0.01955758 0.9998088 0 0.01955758 0.9999523 0 0.009777888 0.999873 0 0.01593899 0.9997168 0 0.0237992 0.9997113 0 0.02402732 0.9998088 0 0.01955758 0.9997168 0 0.0237992 0.999789 0 0.02054628 1 0 0 0.9999834 0 0.005774216 0.9999337 0 0.01152088 1 0 0 0.9999834 0 0.005774216 0.9995229 0 0.03088753 0.999181 0 0.04046427 0.9999337 0 0.01152088 0.9999337 0 0.01152088 0.999181 0 0.04046427 0.9996761 0 0.02544993 0.9999577 0 0.00920977 1 0 0 0.9999337 0 0.01152088 0.9999577 0 0.00920977 1 0 0 0.9904722 0 0.1377132 0.9911939 0 0.1324185 0.9970456 0 0.07681296 0.9970288 0 0.07703063 0.9911939 0 0.1324185 0.9984625 0 0.05543282 0.998862 0 0.047695 0.9970456 0 0.07681296 0.9970456 0 0.07681296 0.998862 0 0.047695 0.9996761 0 0.02544993 0.999181 0 0.04046427 0.9970288 0 0.07703063 0.9970456 0 0.07681296 0.999181 0 0.04046427 0.9995229 0 0.03088753 1 0 0 1 0 0 0.9999022 0 0.01398961 0.9999286 0 0.01195899 1 0 0 1 0 0 0.9999577 0 0.00920977 0.9999022 0 0.01398961 0.9999022 0 0.01398961 0.9999577 0 0.00920977 0.9996761 0 0.02544993 0.998862 0 0.047695 0.9999286 0 0.01195899 0.9999022 0 0.01398961 0.998862 0 0.047695 0.9984625 0 0.05543282 0.94732 0 -0.3202888 0.9904258 0 -0.1380461 0.9871433 0 -0.1598376 0.9758039 0 -0.2186481 0.9904258 0 -0.1380461 0.9978138 0 -0.0660892 0.9975603 0 -0.06981035 0.9871433 0 -0.1598376 0.9871433 0 -0.1598376 0.9975603 0 -0.06981035 0.9988309 0 -0.04834354 0.9969081 0 -0.07857773 0.9758039 0 -0.2186481 0.9871433 0 -0.1598376 0.9969081 0 -0.07857773 0.9968036 0 -0.07989162 0.6729976 0 0.7396447 0.9491151 0 0.3149295 0.9993553 0 0.03590324 0.9975933 0 0.06933632 0.9491151 0 0.3149295 0.9937648 0 0.1114978 0.9998757 0 0.01577441 0.9993553 0 0.03590324 0.9993553 0 0.03590324 0.9998757 0 0.01577441 0.9988309 0 -0.04834354 0.9975603 0 -0.06981035 0.9975933 0 0.06933632 0.9993553 0 0.03590324 0.9975603 0 -0.06981035 0.9978138 0 -0.0660892 1 0 0 0.9998273 0 -0.0185828 0.999872 0 -0.01600555 0.9998596 0 0.01675914 0.9998273 0 -0.0185828 0.9968036 0 -0.07989162 0.9969081 0 -0.07857773 0.999872 0 -0.01600555 0.999872 0 -0.01600555 0.9969081 0 -0.07857773 0.9988309 0 -0.04834354 0.9998757 0 0.01577441 0.9998596 0 0.01675914 0.999872 0 -0.01600555 0.9998757 0 0.01577441 0.9937648 0 0.1114978 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9991711 0 -0.04070804 0.9855777 0 -0.1692238 0.9960347 0 -0.0889657 0.9987375 0 0.05023343 0.9855777 0 -0.1692238 0.9974802 0 -0.07094575 0.9984803 0 -0.05511022 0.9960347 0 -0.0889657 0.9960347 0 -0.0889657 0.9984803 0 -0.05511022 0.9995248 0 -0.0308253 0.9990916 0 -0.04261393 0.9987375 0 0.05023343 0.9960347 0 -0.0889657 0.9990916 0 -0.04261393 0.9998544 0 -0.01706355 1 0 0 1 0 0 0.999926 0 -0.01217306 0.999901 0 -0.01407445 1 0 0 1 0 0 0.9998797 0 -0.01551719 0.999926 0 -0.01217306 0.999926 0 -0.01217306 0.9998797 0 -0.01551719 0.9995248 0 -0.0308253 0.9984803 0 -0.05511022 0.999901 0 -0.01407445 0.999926 0 -0.01217306 0.9984803 0 -0.05511022 0.9974802 0 -0.07094575 1 0 0 0.999988 0 -0.004915657 0.999964 0 -0.008493803 1 0 0 0.999988 0 -0.004915657 0.9998544 0 -0.01706355 0.9990916 0 -0.04261393 0.999964 0 -0.008493803 0.999964 0 -0.008493803 0.9990916 0 -0.04261393 0.9995248 0 -0.0308253 0.9998797 0 -0.01551719 1 0 0 0.999964 0 -0.008493803 0.9998797 0 -0.01551719 1 0 0 1 0 0 0.9999838 0 -0.005707219 0.9998968 0 0.01437115 0.999942 0 0.01076864 0.9999838 0 -0.005707219 0.9993859 0 -0.0350408 1 0 -2.87433e-4 0.9998968 0 0.01437115 0.9998968 0 0.01437115 1 0 -2.87433e-4 0.9995563 0 0.02978885 0.9990289 0 0.04405995 0.999942 0 0.01076864 0.9998968 0 0.01437115 0.9990289 0 0.04405995 0.9984977 0 0.05479376 0.9795208 0 -0.2013432 0.9996902 0 0.02489365 0.9999975 0 0.002261057 0.9971203 0 -0.07583611 0.9996902 0 0.02489365 0.9957765 0 0.09181078 0.9984431 0 0.05578013 0.9999975 0 0.002261057 0.9999975 0 0.002261057 0.9984431 0 0.05578013 0.9995563 0 0.02978885 1 0 -2.87433e-4 0.9971203 0 -0.07583611 0.9999975 0 0.002261057 1 0 -2.87433e-4 0.9993859 0 -0.0350408 0.9835693 0 0.1805316 0.986201 0 0.165552 0.9958001 0 0.09155377 0.9853829 0 0.1703546 0.986201 0 0.165552 0.9984977 0 0.05479376 0.9990289 0 0.04405995 0.9958001 0 0.09155377 0.9958001 0 0.09155377 0.9990289 0 0.04405995 0.9995563 0 0.02978885 0.9984431 0 0.05578013 0.9853829 0 0.1703546 0.9958001 0 0.09155377 0.9984431 0 0.05578013 0.9957765 0 0.09181078 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9996284 0 -0.02726088 0.9999193 0 -0.01270959 1 0 0 1 0 0 0.9997315 0 -0.02317379 0.9996284 0 -0.02726088 0.9996284 0 -0.02726088 0.9997315 0 -0.02317379 0.993636 0 -0.1126388 0.9933258 0 -0.1153436 0.9999193 0 -0.01270959 0.9996284 0 -0.02726088 0.9933258 0 -0.1153436 0.998009 0 -0.06307106 1 0 0 0.9981404 0 -0.06095789 0.9990726 0 -0.04306003 1 0 0 0.9981404 0 -0.06095789 0.9748658 0 -0.2227932 0.9804237 0 -0.1968998 0.9990726 0 -0.04306003 0.9990726 0 -0.04306003 0.9804237 0 -0.1968998 0.993636 0 -0.1126388 0.9997315 0 -0.02317379 1 0 0 0.9990726 0 -0.04306003 0.9997315 0 -0.02317379 1 0 0 0.9148874 0 -0.4037092 0.9917997 0 -0.127802 0.9558168 0 -0.2939629 0.8924116 0 -0.4512224 0.9917997 0 -0.127802 0.998009 0 -0.06307106 0.9933258 0 -0.1153436 0.9558168 0 -0.2939629 0.9558168 0 -0.2939629 0.9933258 0 -0.1153436 0.993636 0 -0.1126388 0.9804237 0 -0.1968998 0.8924116 0 -0.4512224 0.9558168 0 -0.2939629 0.9804237 0 -0.1968998 0.9748658 0 -0.2227932 1 0 0 0.9999752 0 -0.007048742 0.9999604 0 -0.008904316 0.999997 0 0.002459988 0.9999752 0 -0.007048742 0.9991726 0 -0.04067118 0.9994281 0 -0.03381618 0.9999604 0 -0.008904316 0.9999604 0 -0.008904316 0.9994281 0 -0.03381618 0.9995535 0 -0.0298824 0.9999921 0 -0.003997756 0.999997 0 0.002459988 0.9999604 0 -0.008904316 0.9999921 0 -0.003997756 0.9999296 0 0.01187001 0.9736819 0 -0.2279115 0.9906975 0 -0.1360828 0.9978711 0 -0.06521864 0.9905739 0 -0.1369795 0.9906975 0 -0.1360828 0.9988731 0 -0.0474619 0.9993178 0 -0.03693128 0.9978711 0 -0.06521864 0.9978711 0 -0.06521864 0.9993178 0 -0.03693128 0.9995535 0 -0.0298824 0.9994281 0 -0.03381618 0.9905739 0 -0.1369795 0.9978711 0 -0.06521864 0.9994281 0 -0.03381618 0.9991726 0 -0.04067118 0.9959535 0 0.08987024 0.9992782 0 0.03798885 0.999966 0 -0.008252374 0.9999964 0 -0.002719855 0.9992782 0 0.03798885 0.9999296 0 0.01187001 0.9999921 0 -0.003997756 0.999966 0 -0.008252374 0.999966 0 -0.008252374 0.9999921 0 -0.003997756 0.9995535 0 -0.0298824 0.9993178 0 -0.03693128 0.9999964 0 -0.002719855 0.999966 0 -0.008252374 0.9993178 0 -0.03693128 0.9988731 0 -0.0474619 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.999997 0 0.002507354 0.9999917 0 0.0041102 1 0 0 1 0 0 1 0 0 0.999997 0 0.002507354 0.999997 0 0.002507354 1 0 0 0.9999833 0 0.005786194 0.9999254 0 0.01221317 0.9999917 0 0.0041102 0.999997 0 0.002507354 0.9999254 0 0.01221317 0.9997243 0 0.02348085 1 0 0 0.9999995 0 0.001122448 0.9999987 0 0.001607279 1 0 0 0.9999995 0 0.001122448 0.9999958 0 0.002913937 0.9999899 0 0.004503627 0.9999987 0 0.001607279 0.9999987 0 0.001607279 0.9999899 0 0.004503627 0.9999833 0 0.005786194 1 0 0 1 0 0 0.9999987 0 0.001607279 1 0 0 1 0 0 0.9982495 0 0.05914384 0.9983811 0 0.05687892 0.9998993 0 0.01419471 0.999994 0 0.003474462 0.9983811 0 0.05687892 0.9997243 0 0.02348085 0.9999254 0 0.01221317 0.9998993 0 0.01419471 0.9998993 0 0.01419471 0.9999254 0 0.01221317 0.9999833 0 0.005786194 0.9999899 0 0.004503627 0.999994 0 0.003474462 0.9998993 0 0.01419471 0.9999899 0 0.004503627 0.9999958 0 0.002913937 1 0 0 0.9999917 0 0.0041102 0.9999894 0 0.004613342 0.9999959 0 0.00289167 0.9999917 0 0.0041102 0.9997243 0 0.02348085 0.9997617 0 0.02183411 0.9999894 0 0.004613342 0.9999894 0 0.004613342 0.9997617 0 0.02183411 0.9999997 0 7.7113e-4 0.9999829 0 -0.005858185 0.9999959 0 0.00289167 0.9999894 0 0.004613342 0.9999829 0 -0.005858185 0.9999174 0 0.01285514 0.9982495 0 0.05914384 0.9957095 0 0.09253413 0.9987936 0 0.04910546 0.9983811 0 0.05687892 0.9957095 0 0.09253413 0.9996828 0 0.02518784 0.999951 0 0.009901225 0.9987936 0 0.04910546 0.9987936 0 0.04910546 0.999951 0 0.009901225 0.9999997 0 7.7113e-4 0.9997617 0 0.02183411 0.9983811 0 0.05687892 0.9987936 0 0.04910546 0.9997617 0 0.02183411 0.9997243 0 0.02348085 0.9993789 0 0.03524058 0.9986358 0 0.05221742 0.9995662 0 -0.02945162 0.9984455 0 -0.05573636 0.9986358 0 0.05221742 0.9999174 0 0.01285514 0.9999829 0 -0.005858185 0.9995662 0 -0.02945162 0.9995662 0 -0.02945162 0.9999829 0 -0.005858185 0.9999997 0 7.7113e-4 0.999951 0 0.009901225 0.9984455 0 -0.05573636 0.9995662 0 -0.02945162 0.999951 0 0.009901225 0.9996828 0 0.02518784</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape6-texbinormals-array" count="3072" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape6-vertices" name="qt_gauge_background_Shape6-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape6-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape6-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape6-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape6-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="1536">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape6-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape6-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape6-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape6-texbinormals" offset="2" set="0"/>
+ <p>45 45 0 609 609 1 614 614 3 614 614 3 609 609 1 225 225 2 609 609 4 113 113 5 225 225 7 225 225 7 113 113 5 417 417 6 225 225 8 417 417 9 419 419 11 419 419 11 417 417 9 161 49 10 614 614 12 225 225 13 115 115 15 115 115 15 225 225 13 419 419 14 48 48 16 611 611 17 610 610 19 610 610 19 611 611 17 226 226 18 114 114 21 418 418 22 611 611 20 611 611 20 418 418 22 226 226 23 418 418 25 161 49 26 226 226 24 226 226 24 161 49 26 417 417 27 610 610 28 226 226 29 113 113 31 113 113 31 226 226 29 417 417 30 46 46 32 613 613 33 612 612 35 612 612 35 613 613 33 227 227 34 613 613 36 115 115 37 227 227 39 227 227 39 115 115 37 419 419 38 419 419 41 161 49 42 227 227 40 227 227 40 161 49 42 418 418 43 612 612 44 227 227 45 114 114 47 114 114 47 227 227 45 418 418 46 615 615 49 228 228 50 0 0 48 0 0 48 228 228 50 620 620 51 615 615 52 116 116 53 228 228 55 228 228 55 116 116 53 420 420 54 420 420 57 162 50 58 228 228 56 228 228 56 162 50 58 422 422 59 228 228 61 422 422 62 620 620 60 620 620 60 422 422 62 118 118 63 617 617 65 229 229 66 8 8 64 8 8 64 229 229 66 616 616 67 117 117 69 421 421 70 617 617 68 617 617 68 421 421 70 229 229 71 421 421 73 162 50 74 229 229 72 229 229 72 162 50 74 420 420 75 229 229 77 420 420 78 616 616 76 616 616 76 420 420 78 116 116 79 29 29 80 619 619 81 618 618 83 618 618 83 619 619 81 230 230 82 619 619 84 118 118 85 230 230 87 230 230 87 118 118 85 422 422 86 230 230 88 422 422 89 421 421 91 421 421 91 422 422 89 162 50 90 618 618 92 230 230 93 117 117 95 117 117 95 230 230 93 421 421 94 7 7 96 621 621 97 626 626 99 626 626 99 621 621 97 231 231 98 621 621 100 119 119 101 231 231 103 231 231 103 119 119 101 423 423 102 231 231 104 423 423 105 425 425 107 425 425 107 423 423 105 163 51 106 626 626 108 231 231 109 121 121 111 121 121 111 231 231 109 425 425 110 623 623 113 232 232 114 11 11 112 11 11 112 232 232 114 622 622 115 120 120 117 424 424 118 623 623 116 623 623 116 424 424 118 232 232 119 424 424 121 163 51 122 232 232 120 232 232 120 163 51 122 423 423 123 232 232 125 423 423 126 622 622 124 622 622 124 423 423 126 119 119 127 25 25 128 625 625 129 624 624 131 624 624 131 625 625 129 233 233 130 625 625 132 121 121 133 233 233 135 233 233 135 121 121 133 425 425 134 233 233 136 425 425 137 424 424 139 424 424 139 425 425 137 163 51 138 624 624 140 233 233 141 120 120 143 120 120 143 233 233 141 424 424 142 21 21 144 627 627 145 632 632 147 632 632 147 627 627 145 234 234 146 627 627 148 122 122 149 234 234 151 234 234 151 122 122 149 426 426 150 426 426 153 164 52 154 234 234 152 234 234 152 164 52 154 428 428 155 632 632 156 234 234 157 124 124 159 124 124 159 234 234 157 428 428 158 13 13 160 629 629 161 628 628 163 628 628 163 629 629 161 235 235 162 629 629 164 123 123 165 235 235 167 235 235 167 123 123 165 427 427 166 427 427 169 164 52 170 235 235 168 235 235 168 164 52 170 426 426 171 628 628 172 235 235 173 122 122 175 122 122 175 235 235 173 426 426 174 24 24 176 631 631 177 630 630 179 630 630 179 631 631 177 236 236 178 631 631 180 124 124 181 236 236 183 236 236 183 124 124 181 428 428 182 236 236 184 428 428 185 427 427 187 427 427 187 428 428 185 164 52 186 630 630 188 236 236 189 123 123 191 123 123 191 236 236 189 427 427 190 19 19 192 633 633 193 638 638 195 638 638 195 633 633 193 237 237 194 633 633 196 125 125 197 237 237 199 237 237 199 125 125 197 429 429 198 237 237 200 429 429 201 431 431 203 431 431 203 429 429 201 165 53 202 638 638 204 237 237 205 127 127 207 127 127 207 237 237 205 431 431 206 17 17 208 635 635 209 634 634 211 634 634 211 635 635 209 238 238 210 126 126 213 430 430 214 635 635 212 635 635 212 430 430 214 238 238 215 430 430 217 165 53 218 238 238 216 238 238 216 165 53 218 429 429 219 238 238 221 429 429 222 634 634 220 634 634 220 429 429 222 125 125 223 15 15 224 637 637 225 636 636 227 636 636 227 637 637 225 239 239 226 127 127 229 431 431 230 637 637 228 637 637 228 431 431 230 239 239 231 431 431 233 165 53 234 239 239 232 239 239 232 165 53 234 430 430 235 636 636 236 239 239 237 126 126 239 126 126 239 239 239 237 430 430 238 18 18 240 639 639 241 644 644 243 644 644 243 639 639 241 240 240 242 639 639 244 128 128 245 240 240 247 240 240 247 128 128 245 432 432 246 240 240 248 432 432 249 434 434 251 434 434 251 432 432 249 166 54 250 644 644 252 240 240 253 130 130 255 130 130 255 240 240 253 434 434 254 14 14 256 641 641 257 640 640 259 640 640 259 641 641 257 241 241 258 641 641 260 129 129 261 241 241 263 241 241 263 129 129 261 433 433 262 433 433 265 166 54 266 241 241 264 241 241 264 166 54 266 432 432 267 241 241 269 432 432 270 640 640 268 640 640 268 432 432 270 128 128 271 17 17 272 643 643 273 642 642 275 642 642 275 643 643 273 242 242 274 130 130 277 434 434 278 643 643 276 643 643 276 434 434 278 242 242 279 434 434 281 166 54 282 242 242 280 242 242 280 166 54 282 433 433 283 242 242 285 433 433 286 642 642 284 642 642 284 433 433 286 129 129 287 16 16 288 645 645 289 650 650 291 650 650 291 645 645 289 243 243 290 645 645 292 131 131 293 243 243 295 243 243 295 131 131 293 435 435 294 243 243 296 435 435 297 437 437 299 437 437 299 435 435 297 167 55 298 650 650 300 243 243 301 133 133 303 133 133 303 243 243 301 437 437 302 18 18 304 647 647 305 646 646 307 646 646 307 647 647 305 244 244 306 647 647 308 132 132 309 244 244 311 244 244 311 132 132 309 436 436 310 244 244 312 436 436 313 435 435 315 435 435 315 436 436 313 167 55 314 646 646 316 244 244 317 131 131 319 131 131 319 244 244 317 435 435 318 19 19 320 649 649 321 648 648 323 648 648 323 649 649 321 245 245 322 133 133 325 437 437 326 649 649 324 649 649 324 437 437 326 245 245 327 437 437 329 167 55 330 245 245 328 245 245 328 167 55 330 436 436 331 648 648 332 245 245 333 132 132 335 132 132 335 245 245 333 436 436 334 650 650 337 246 246 338 16 16 336 16 16 336 246 246 338 654 654 339 133 133 341 438 438 342 650 650 340 650 650 340 438 438 342 246 246 343 438 438 345 168 56 346 246 246 344 246 246 344 168 56 346 440 440 347 246 246 349 440 440 350 654 654 348 654 654 348 440 440 350 135 135 351 651 651 353 247 247 354 19 19 352 19 19 352 247 247 354 649 649 355 134 134 357 439 439 358 651 651 356 651 651 356 439 439 358 247 247 359 439 439 361 168 56 362 247 247 360 247 247 360 168 56 362 438 438 363 247 247 365 438 438 366 649 649 364 649 649 364 438 438 366 133 133 367 20 20 368 653 653 369 652 652 371 652 652 371 653 653 369 248 248 370 653 653 372 135 135 373 248 248 375 248 248 375 135 135 373 440 440 374 248 248 376 440 440 377 439 439 379 439 439 379 440 440 377 168 56 378 652 652 380 248 248 381 134 134 383 134 134 383 248 248 381 439 439 382 22 22 384 655 655 385 660 660 387 660 660 387 655 655 385 249 249 386 655 655 388 136 136 389 249 249 391 249 249 391 136 136 389 441 441 390 441 441 393 169 57 394 249 249 392 249 249 392 169 57 394 443 443 395 660 660 396 249 249 397 138 138 399 138 138 399 249 249 397 443 443 398 21 21 400 657 657 401 656 656 403 656 656 403 657 657 401 250 250 402 657 657 404 137 137 405 250 250 407 250 250 407 137 137 405 442 442 406 250 250 408 442 442 409 441 441 411 441 441 411 442 442 409 169 57 410 656 656 412 250 250 413 136 136 415 136 136 415 250 250 413 441 441 414 659 659 417 251 251 418 23 23 416 23 23 416 251 251 418 658 658 419 138 138 421 443 443 422 659 659 420 659 659 420 443 443 422 251 251 423 443 443 425 169 57 426 251 251 424 251 251 424 169 57 426 442 442 427 251 251 429 442 442 430 658 658 428 658 658 428 442 442 430 137 137 431 22 22 432 660 660 433 664 664 435 664 664 435 660 660 433 252 252 434 660 660 436 138 138 437 252 252 439 252 252 439 138 138 437 444 444 438 444 444 441 170 58 442 252 252 440 252 252 440 170 58 442 446 446 443 252 252 445 446 446 446 664 664 444 664 664 444 446 446 446 140 140 447 23 23 448 661 661 449 659 659 451 659 659 451 661 661 449 253 253 450 139 139 453 445 445 454 661 661 452 661 661 452 445 445 454 253 253 455 445 445 457 170 58 458 253 253 456 253 253 456 170 58 458 444 444 459 659 659 460 253 253 461 138 138 463 138 138 463 253 253 461 444 444 462 17 17 464 663 663 465 662 662 467 662 662 467 663 663 465 254 254 466 663 663 468 140 140 469 254 254 471 254 254 471 140 140 469 446 446 470 254 254 472 446 446 473 445 445 475 445 445 475 446 446 473 170 58 474 662 662 476 254 254 477 139 139 479 139 139 479 254 254 477 445 445 478 17 17 480 662 662 481 668 668 483 668 668 483 662 662 481 255 255 482 662 662 484 139 139 485 255 255 487 255 255 487 139 139 485 447 447 486 255 255 488 447 447 489 449 449 491 449 449 491 447 447 489 171 59 490 668 668 492 255 255 493 142 142 495 142 142 495 255 255 493 449 449 494 23 23 496 665 665 497 661 661 499 661 661 499 665 665 497 256 256 498 141 141 501 448 448 502 665 665 500 665 665 500 448 448 502 256 256 503 448 448 505 171 59 506 256 256 504 256 256 504 171 59 506 447 447 507 256 256 509 447 447 510 661 661 508 661 661 508 447 447 510 139 139 511 24 24 512 667 667 513 666 666 515 666 666 515 667 667 513 257 257 514 667 667 516 142 142 517 257 257 519 257 257 519 142 142 517 449 449 518 257 257 520 449 449 521 448 448 523 448 448 523 449 449 521 171 59 522 666 666 524 257 257 525 141 141 527 141 141 527 257 257 525 448 448 526 20 20 528 669 669 529 674 674 531 674 674 531 669 669 529 258 258 530 669 669 532 143 143 533 258 258 535 258 258 535 143 143 533 450 450 534 450 450 537 172 60 538 258 258 536 258 258 536 172 60 538 452 452 539 258 258 541 452 452 542 674 674 540 674 674 540 452 452 542 145 145 543 671 671 545 259 259 546 15 15 544 15 15 544 259 259 546 670 670 547 144 144 549 451 451 550 671 671 548 671 671 548 451 451 550 259 259 551 451 451 553 172 60 554 259 259 552 259 259 552 172 60 554 450 450 555 259 259 557 450 450 558 670 670 556 670 670 556 450 450 558 143 143 559 25 25 560 673 673 561 672 672 563 672 672 563 673 673 561 260 260 562 673 673 564 145 145 565 260 260 567 260 260 567 145 145 565 452 452 566 260 260 568 452 452 569 451 451 571 451 451 571 452 452 569 172 60 570 672 672 572 260 260 573 144 144 575 144 144 575 260 260 573 451 451 574 25 25 576 624 624 577 678 678 579 678 678 579 624 624 577 261 261 578 624 624 580 120 120 581 261 261 583 261 261 583 120 120 581 453 453 582 261 261 584 453 453 585 455 455 587 455 455 587 453 453 585 173 61 586 678 678 588 261 261 589 147 147 591 147 147 591 261 261 589 455 455 590 11 11 592 675 675 593 623 623 595 623 623 595 675 675 593 262 262 594 146 146 597 454 454 598 675 675 596 675 675 596 454 454 598 262 262 599 454 454 601 173 61 602 262 262 600 262 262 600 173 61 602 453 453 603 623 623 604 262 262 605 120 120 607 120 120 607 262 262 605 453 453 606 27 27 608 677 677 609 676 676 611 676 676 611 677 677 609 263 263 610 677 677 612 147 147 613 263 263 615 263 263 615 147 147 613 455 455 614 263 263 616 455 455 617 454 454 619 454 454 619 455 455 617 173 61 618 676 676 620 263 263 621 146 146 623 146 146 623 263 263 621 454 454 622 26 26 624 679 679 625 684 684 627 684 684 627 679 679 625 264 264 626 679 679 628 148 148 629 264 264 631 264 264 631 148 148 629 456 456 630 264 264 632 456 456 633 458 458 635 458 458 635 456 456 633 174 62 634 264 264 637 458 458 638 684 684 636 684 684 636 458 458 638 150 150 639 681 681 641 265 265 642 10 10 640 10 10 640 265 265 642 680 680 643 149 149 645 457 457 646 681 681 644 681 681 644 457 457 646 265 265 647 457 457 649 174 62 650 265 265 648 265 265 648 174 62 650 456 456 651 265 265 653 456 456 654 680 680 652 680 680 652 456 456 654 148 148 655 25 25 656 683 683 657 682 682 659 682 682 659 683 683 657 266 266 658 683 683 660 150 150 661 266 266 663 266 266 663 150 150 661 458 458 662 266 266 664 458 458 665 457 457 667 457 457 667 458 458 665 174 62 666 682 682 668 266 266 669 149 149 671 149 149 671 266 266 669 457 457 670 1 1 672 685 685 673 690 690 675 690 690 675 685 685 673 267 267 674 685 685 676 151 151 677 267 267 679 267 267 679 151 151 677 459 459 678 267 267 680 459 459 681 461 461 683 461 461 683 459 459 681 175 63 682 690 690 684 267 267 685 153 153 687 153 153 687 267 267 685 461 461 686 687 687 689 268 268 690 26 26 688 26 26 688 268 268 690 686 686 691 152 152 693 460 460 694 687 687 692 687 687 692 460 460 694 268 268 695 460 460 697 175 63 698 268 268 696 268 268 696 175 63 698 459 459 699 268 268 701 459 459 702 686 686 700 686 686 700 459 459 702 151 151 703 28 28 704 689 689 705 688 688 707 688 688 707 689 689 705 269 269 706 689 689 708 153 153 709 269 269 711 269 269 711 153 153 709 461 461 710 269 269 712 461 461 713 460 460 715 460 460 715 461 461 713 175 63 714 688 688 716 269 269 717 152 152 719 152 152 719 269 269 717 460 460 718 32 32 720 691 691 721 696 696 723 696 696 723 691 691 721 270 270 722 691 691 724 154 154 725 270 270 727 270 270 727 154 154 725 462 462 726 270 270 728 462 462 729 464 464 731 464 464 731 462 462 729 176 64 730 696 696 732 270 270 733 156 156 735 156 156 735 270 270 733 464 464 734 30 30 736 693 693 737 692 692 739 692 692 739 693 693 737 271 271 738 693 693 740 155 155 741 271 271 743 271 271 743 155 155 741 463 463 742 463 463 745 176 64 746 271 271 744 271 271 744 176 64 746 462 462 747 271 271 749 462 462 750 692 692 748 692 692 748 462 462 750 154 154 751 35 35 752 695 695 753 694 694 755 694 694 755 695 695 753 272 272 754 695 695 756 156 156 757 272 272 759 272 272 759 156 156 757 464 464 758 272 272 760 464 464 761 463 463 763 463 463 763 464 464 761 176 64 762 694 694 764 272 272 765 155 155 767 155 155 767 272 272 765 463 463 766 8 8 768 697 697 769 702 702 771 702 702 771 697 697 769 273 273 770 697 697 772 157 157 773 273 273 775 273 273 775 157 157 773 465 465 774 273 273 776 465 465 777 467 467 779 467 467 779 465 465 777 177 65 778 273 273 781 467 467 782 702 702 780 702 702 780 467 467 782 159 159 783 699 699 785 274 274 786 32 32 784 32 32 784 274 274 786 698 698 787 158 158 789 466 466 790 699 699 788 699 699 788 466 466 790 274 274 791 466 466 793 177 65 794 274 274 792 274 274 792 177 65 794 465 465 795 274 274 797 465 465 798 698 698 796 698 698 796 465 465 798 157 157 799 34 34 800 701 701 801 700 700 803 700 700 803 701 701 801 275 275 802 701 701 804 159 159 805 275 275 807 275 275 807 159 159 805 467 467 806 275 275 808 467 467 809 466 466 811 466 466 811 467 467 809 177 65 810 700 700 812 275 275 813 158 158 815 158 158 815 275 275 813 466 466 814 34 34 816 703 703 817 708 708 819 708 708 819 703 703 817 276 276 818 703 703 820 160 160 821 276 276 823 276 276 823 160 160 821 468 468 822 276 276 824 468 468 825 470 470 827 470 470 827 468 468 825 178 66 826 708 708 828 276 276 829 50 162 831 50 162 831 276 276 829 470 470 830 705 705 833 277 277 834 33 33 832 33 33 832 277 277 834 704 704 835 49 161 837 469 469 838 705 705 836 705 705 836 469 469 838 277 277 839 469 469 841 178 66 842 277 277 840 277 277 840 178 66 842 468 468 843 277 277 845 468 468 846 704 704 844 704 704 844 468 468 846 160 160 847 9 9 848 707 707 849 706 706 851 706 706 851 707 707 849 278 278 850 50 162 853 470 470 854 707 707 852 707 707 852 470 470 854 278 278 855 470 470 857 178 66 858 278 278 856 278 278 856 178 66 858 469 469 859 706 706 860 278 278 861 49 161 863 49 161 863 278 278 861 469 469 862 35 35 864 709 709 865 714 714 867 714 714 867 709 709 865 279 279 866 709 709 868 51 163 869 279 279 871 279 279 871 51 163 869 471 471 870 279 279 872 471 471 873 473 473 875 473 473 875 471 471 873 179 67 874 714 714 876 279 279 877 53 165 879 53 165 879 279 279 877 473 473 878 711 711 881 280 280 882 31 31 880 31 31 880 280 280 882 710 710 883 52 164 885 472 472 886 711 711 884 711 711 884 472 472 886 280 280 887 472 472 889 179 67 890 280 280 888 280 280 888 179 67 890 471 471 891 280 280 893 471 471 894 710 710 892 710 710 892 471 471 894 51 163 895 33 33 896 713 713 897 712 712 899 712 712 899 713 713 897 281 281 898 53 165 901 473 473 902 713 713 900 713 713 900 473 473 902 281 281 903 281 281 904 473 473 905 472 472 907 472 472 907 473 473 905 179 67 906 712 712 908 281 281 909 52 164 911 52 164 911 281 281 909 472 472 910 47 47 912 715 715 913 720 720 915 720 720 915 715 715 913 282 282 914 715 715 916 54 166 917 282 282 919 282 282 919 54 166 917 474 474 918 282 282 920 474 474 921 476 476 923 476 476 923 474 474 921 180 68 922 720 720 924 282 282 925 56 168 927 56 168 927 282 282 925 476 476 926 717 717 929 283 283 930 38 38 928 38 38 928 283 283 930 716 716 931 55 167 933 475 475 934 717 717 932 717 717 932 475 475 934 283 283 935 475 475 937 180 68 938 283 283 936 283 283 936 180 68 938 474 474 939 283 283 941 474 474 942 716 716 940 716 716 940 474 474 942 54 166 943 35 35 944 719 719 945 718 718 947 718 718 947 719 719 945 284 284 946 719 719 948 56 168 949 284 284 951 284 284 951 56 168 949 476 476 950 284 284 952 476 476 953 475 475 955 475 475 955 476 476 953 180 68 954 718 718 956 284 284 957 55 167 959 55 167 959 284 284 957 475 475 958 42 42 960 721 721 961 726 726 963 726 726 963 721 721 961 285 285 962 721 721 964 57 169 965 285 285 967 285 285 967 57 169 965 477 477 966 285 285 968 477 477 969 479 479 971 479 479 971 477 477 969 181 69 970 726 726 972 285 285 973 59 171 975 59 171 975 285 285 973 479 479 974 723 723 977 286 286 978 4 4 976 4 4 976 286 286 978 722 722 979 58 170 981 478 478 982 723 723 980 723 723 980 478 478 982 286 286 983 478 478 985 181 69 986 286 286 984 286 286 984 181 69 986 477 477 987 286 286 989 477 477 990 722 722 988 722 722 988 477 477 990 57 169 991 31 31 992 725 725 993 724 724 995 724 724 995 725 725 993 287 287 994 59 171 997 479 479 998 725 725 996 725 725 996 479 479 998 287 287 999 479 479 1001 181 69 1002 287 287 1000 287 287 1000 181 69 1002 478 478 1003 724 724 1004 287 287 1005 58 170 1007 58 170 1007 287 287 1005 478 478 1006 727 727 1009 288 288 1010 44 44 1008 44 44 1008 288 288 1010 732 732 1011 60 172 1013 480 480 1014 727 727 1012 727 727 1012 480 480 1014 288 288 1015 480 480 1017 182 70 1018 288 288 1016 288 288 1016 182 70 1018 482 482 1019 288 288 1021 482 482 1022 732 732 1020 732 732 1020 482 482 1022 62 174 1023 43 43 1024 729 729 1025 728 728 1027 728 728 1027 729 729 1025 289 289 1026 61 173 1029 481 481 1030 729 729 1028 729 729 1028 481 481 1030 289 289 1031 481 481 1033 182 70 1034 289 289 1032 289 289 1032 182 70 1034 480 480 1035 728 728 1036 289 289 1037 60 172 1039 60 172 1039 289 289 1037 480 480 1038 41 41 1040 731 731 1041 730 730 1043 730 730 1043 731 731 1041 290 290 1042 731 731 1044 62 174 1045 290 290 1047 290 290 1047 62 174 1045 482 482 1046 290 290 1048 482 482 1049 481 481 1051 481 481 1051 482 482 1049 182 70 1050 730 730 1052 290 290 1053 61 173 1055 61 173 1055 290 290 1053 481 481 1054 42 42 1056 733 733 1057 738 738 1059 738 738 1059 733 733 1057 291 291 1058 733 733 1060 63 175 1061 291 291 1063 291 291 1063 63 175 1061 483 483 1062 291 291 1064 483 483 1065 485 485 1067 485 485 1067 483 483 1065 183 71 1066 738 738 1068 291 291 1069 65 177 1071 65 177 1071 291 291 1069 485 485 1070 735 735 1073 292 292 1074 38 38 1072 38 38 1072 292 292 1074 734 734 1075 64 176 1077 484 484 1078 735 735 1076 735 735 1076 484 484 1078 292 292 1079 484 484 1081 183 71 1082 292 292 1080 292 292 1080 183 71 1082 483 483 1083 292 292 1085 483 483 1086 734 734 1084 734 734 1084 483 483 1086 63 175 1087 41 41 1088 737 737 1089 736 736 1091 736 736 1091 737 737 1089 293 293 1090 65 177 1093 485 485 1094 737 737 1092 737 737 1092 485 485 1094 293 293 1095 293 293 1096 485 485 1097 484 484 1099 484 484 1099 485 485 1097 183 71 1098 736 736 1100 293 293 1101 64 176 1103 64 176 1103 293 293 1101 484 484 1102 40 40 1104 739 739 1105 744 744 1107 744 744 1107 739 739 1105 294 294 1106 739 739 1108 66 178 1109 294 294 1111 294 294 1111 66 178 1109 486 486 1110 294 294 1112 486 486 1113 488 488 1115 488 488 1115 486 486 1113 184 72 1114 744 744 1116 294 294 1117 68 180 1119 68 180 1119 294 294 1117 488 488 1118 37 37 1120 741 741 1121 740 740 1123 740 740 1123 741 741 1121 295 295 1122 741 741 1124 67 179 1125 295 295 1127 295 295 1127 67 179 1125 487 487 1126 487 487 1129 184 72 1130 295 295 1128 295 295 1128 184 72 1130 486 486 1131 295 295 1133 486 486 1134 740 740 1132 740 740 1132 486 486 1134 66 178 1135 743 743 1137 296 296 1138 42 42 1136 42 42 1136 296 296 1138 742 742 1139 68 180 1141 488 488 1142 743 743 1140 743 743 1140 488 488 1142 296 296 1143 488 488 1145 184 72 1146 296 296 1144 296 296 1144 184 72 1146 487 487 1147 296 296 1149 487 487 1150 742 742 1148 742 742 1148 487 487 1150 67 179 1151 44 44 1152 745 745 1153 727 727 1155 727 727 1155 745 745 1153 297 297 1154 745 745 1156 69 181 1157 297 297 1159 297 297 1159 69 181 1157 489 489 1158 297 297 1160 489 489 1161 491 491 1163 491 491 1163 489 489 1161 185 73 1162 727 727 1164 297 297 1165 60 172 1167 60 172 1167 297 297 1165 491 491 1166 40 40 1168 747 747 1169 746 746 1171 746 746 1171 747 747 1169 298 298 1170 747 747 1172 70 182 1173 298 298 1175 298 298 1175 70 182 1173 490 490 1174 298 298 1176 490 490 1177 489 489 1179 489 489 1179 490 490 1177 185 73 1178 746 746 1180 298 298 1181 69 181 1183 69 181 1183 298 298 1181 489 489 1182 728 728 1185 299 299 1186 43 43 1184 43 43 1184 299 299 1186 748 748 1187 60 172 1189 491 491 1190 728 728 1188 728 728 1188 491 491 1190 299 299 1191 491 491 1193 185 73 1194 299 299 1192 299 299 1192 185 73 1194 490 490 1195 299 299 1197 490 490 1198 748 748 1196 748 748 1196 490 490 1198 70 182 1199 45 45 1200 614 614 1201 752 752 1203 752 752 1203 614 614 1201 300 300 1202 614 614 1204 115 115 1205 300 300 1207 300 300 1207 115 115 1205 492 492 1206 300 300 1208 492 492 1209 494 494 1211 494 494 1211 492 492 1209 186 74 1210 300 300 1213 494 494 1214 752 752 1212 752 752 1212 494 494 1214 72 184 1215 749 749 1217 301 301 1218 46 46 1216 46 46 1216 301 301 1218 613 613 1219 71 183 1221 493 493 1222 749 749 1220 749 749 1220 493 493 1222 301 301 1223 493 493 1225 186 74 1226 301 301 1224 301 301 1224 186 74 1226 492 492 1227 301 301 1229 492 492 1230 613 613 1228 613 613 1228 492 492 1230 115 115 1231 47 47 1232 751 751 1233 750 750 1235 750 750 1235 751 751 1233 302 302 1234 751 751 1236 72 184 1237 302 302 1239 302 302 1239 72 184 1237 494 494 1238 302 302 1240 494 494 1241 493 493 1243 493 493 1243 494 494 1241 186 74 1242 750 750 1244 302 302 1245 71 183 1247 71 183 1247 302 302 1245 493 493 1246 38 38 1248 716 716 1249 754 754 1251 754 754 1251 716 716 1249 303 303 1250 716 716 1252 54 166 1253 303 303 1255 303 303 1255 54 166 1253 495 495 1254 303 303 1256 495 495 1257 497 497 1259 497 497 1259 495 495 1257 187 75 1258 754 754 1260 303 303 1261 73 185 1263 73 185 1263 303 303 1261 497 497 1262 750 750 1265 304 304 1266 47 47 1264 47 47 1264 304 304 1266 715 715 1267 71 183 1269 496 496 1270 750 750 1268 750 750 1268 496 496 1270 304 304 1271 496 496 1273 187 75 1274 304 304 1272 304 304 1272 187 75 1274 495 495 1275 304 304 1277 495 495 1278 715 715 1276 715 715 1276 495 495 1278 54 166 1279 46 46 1280 753 753 1281 749 749 1283 749 749 1283 753 753 1281 305 305 1282 73 185 1285 497 497 1286 753 753 1284 753 753 1284 497 497 1286 305 305 1287 305 305 1288 497 497 1289 496 496 1291 496 496 1291 497 497 1289 187 75 1290 749 749 1292 305 305 1293 71 183 1295 71 183 1295 305 305 1293 496 496 1294 2 2 1296 755 755 1297 760 760 1299 760 760 1299 755 755 1297 306 306 1298 755 755 1300 74 186 1301 306 306 1303 306 306 1303 74 186 1301 498 498 1302 306 306 1304 498 498 1305 500 500 1307 500 500 1307 498 498 1305 188 76 1306 760 760 1308 306 306 1309 76 188 1311 76 188 1311 306 306 1309 500 500 1310 757 757 1313 307 307 1314 39 39 1312 39 39 1312 307 307 1314 756 756 1315 75 187 1317 499 499 1318 757 757 1316 757 757 1316 499 499 1318 307 307 1319 499 499 1321 188 76 1322 307 307 1320 307 307 1320 188 76 1322 498 498 1323 307 307 1325 498 498 1326 756 756 1324 756 756 1324 498 498 1326 74 186 1327 41 41 1328 759 759 1329 758 758 1331 758 758 1331 759 759 1329 308 308 1330 76 188 1333 500 500 1334 759 759 1332 759 759 1332 500 500 1334 308 308 1335 308 308 1336 500 500 1337 499 499 1339 499 499 1339 500 500 1337 188 76 1338 758 758 1340 308 308 1341 75 187 1343 75 187 1343 308 308 1341 499 499 1342 28 28 1344 761 761 1345 766 766 1347 766 766 1347 761 761 1345 309 309 1346 761 761 1348 77 189 1349 309 309 1351 309 309 1351 77 189 1349 501 501 1350 309 309 1352 501 501 1353 503 503 1355 503 503 1355 501 501 1353 189 77 1354 309 309 1357 503 503 1358 766 766 1356 766 766 1356 503 503 1358 79 191 1359 763 763 1361 310 310 1362 27 27 1360 27 27 1360 310 310 1362 762 762 1363 78 190 1365 502 502 1366 763 763 1364 763 763 1364 502 502 1366 310 310 1367 502 502 1369 189 77 1370 310 310 1368 310 310 1368 189 77 1370 501 501 1371 310 310 1373 501 501 1374 762 762 1372 762 762 1372 501 501 1374 77 189 1375 0 0 1376 765 765 1377 764 764 1379 764 764 1379 765 765 1377 311 311 1378 765 765 1380 79 191 1381 311 311 1383 311 311 1383 79 191 1381 503 503 1382 311 311 1384 503 503 1385 502 502 1387 502 502 1387 503 503 1385 189 77 1386 764 764 1388 311 311 1389 78 190 1391 78 190 1391 311 311 1389 502 502 1390 29 29 1392 767 767 1393 619 619 1395 619 619 1395 767 767 1393 312 312 1394 767 767 1396 80 192 1397 312 312 1399 312 312 1399 80 192 1397 504 504 1398 504 504 1401 190 78 1402 312 312 1400 312 312 1400 190 78 1402 506 506 1403 312 312 1405 506 506 1406 619 619 1404 619 619 1404 506 506 1406 118 118 1407 28 28 1408 766 766 1409 768 768 1411 768 768 1411 766 766 1409 313 313 1410 766 766 1412 79 191 1413 313 313 1415 313 313 1415 79 191 1413 505 505 1414 313 313 1416 505 505 1417 504 504 1419 504 504 1419 505 505 1417 190 78 1418 768 768 1420 313 313 1421 80 192 1423 80 192 1423 313 313 1421 504 504 1422 0 0 1424 620 620 1425 765 765 1427 765 765 1427 620 620 1425 314 314 1426 620 620 1428 118 118 1429 314 314 1431 314 314 1431 118 118 1429 506 506 1430 314 314 1432 506 506 1433 505 505 1435 505 505 1435 506 506 1433 190 78 1434 314 314 1437 505 505 1438 765 765 1436 765 765 1436 505 505 1438 79 191 1439 24 24 1440 630 630 1441 772 772 1443 772 772 1443 630 630 1441 315 315 1442 630 630 1444 123 123 1445 315 315 1447 315 315 1447 123 123 1445 507 507 1446 315 315 1448 507 507 1449 509 509 1451 509 509 1451 507 507 1449 191 79 1450 772 772 1452 315 315 1453 82 194 1455 82 194 1455 315 315 1453 509 509 1454 769 769 1457 316 316 1458 13 13 1456 13 13 1456 316 316 1458 629 629 1459 81 193 1461 508 508 1462 769 769 1460 769 769 1460 508 508 1462 316 316 1463 508 508 1465 191 79 1466 316 316 1464 316 316 1464 191 79 1466 507 507 1467 316 316 1469 507 507 1470 629 629 1468 629 629 1468 507 507 1470 123 123 1471 771 771 1473 317 317 1474 7 7 1472 7 7 1472 317 317 1474 770 770 1475 82 194 1477 509 509 1478 771 771 1476 771 771 1476 509 509 1478 317 317 1479 509 509 1481 191 79 1482 317 317 1480 317 317 1480 191 79 1482 508 508 1483 770 770 1484 317 317 1485 81 193 1487 81 193 1487 317 317 1485 508 508 1486 25 25 1488 672 672 1489 776 776 1491 776 776 1491 672 672 1489 318 318 1490 672 672 1492 144 144 1493 318 318 1495 318 318 1495 144 144 1493 510 510 1494 318 318 1496 510 510 1497 512 512 1499 512 512 1499 510 510 1497 192 80 1498 776 776 1500 318 318 1501 84 196 1503 84 196 1503 318 318 1501 512 512 1502 15 15 1504 773 773 1505 671 671 1507 671 671 1507 773 773 1505 319 319 1506 773 773 1508 83 195 1509 319 319 1511 319 319 1511 83 195 1509 511 511 1510 511 511 1513 192 80 1514 319 319 1512 319 319 1512 192 80 1514 510 510 1515 671 671 1516 319 319 1517 144 144 1519 144 144 1519 319 319 1517 510 510 1518 24 24 1520 775 775 1521 774 774 1523 774 774 1523 775 775 1521 320 320 1522 775 775 1524 84 196 1525 320 320 1527 320 320 1527 84 196 1525 512 512 1526 320 320 1528 512 512 1529 511 511 1531 511 511 1531 512 512 1529 192 80 1530 774 774 1532 320 320 1533 83 195 1535 83 195 1535 320 320 1533 511 511 1534 24 24 1536 772 772 1537 775 775 1539 775 775 1539 772 772 1537 321 321 1538 82 194 1541 513 513 1542 772 772 1540 772 772 1540 513 513 1542 321 321 1543 513 513 1545 193 81 1546 321 321 1544 321 321 1544 193 81 1546 515 515 1547 321 321 1549 515 515 1550 775 775 1548 775 775 1548 515 515 1550 84 196 1551 7 7 1552 626 626 1553 771 771 1555 771 771 1555 626 626 1553 322 322 1554 626 626 1556 121 121 1557 322 322 1559 322 322 1559 121 121 1557 514 514 1558 322 322 1560 514 514 1561 513 513 1563 513 513 1563 514 514 1561 193 81 1562 771 771 1564 322 322 1565 82 194 1567 82 194 1567 322 322 1565 513 513 1566 25 25 1568 776 776 1569 625 625 1571 625 625 1571 776 776 1569 323 323 1570 776 776 1572 84 196 1573 323 323 1575 323 323 1575 84 196 1573 515 515 1574 323 323 1576 515 515 1577 514 514 1579 514 514 1579 515 515 1577 193 81 1578 625 625 1580 323 323 1581 121 121 1583 121 121 1583 323 323 1581 514 514 1582 24 24 1584 666 666 1585 631 631 1587 631 631 1587 666 666 1585 324 324 1586 666 666 1588 141 141 1589 324 324 1591 324 324 1591 141 141 1589 516 516 1590 324 324 1592 516 516 1593 518 518 1595 518 518 1595 516 516 1593 194 82 1594 631 631 1596 324 324 1597 124 124 1599 124 124 1599 324 324 1597 518 518 1598 658 658 1601 325 325 1602 23 23 1600 23 23 1600 325 325 1602 665 665 1603 658 658 1604 137 137 1605 325 325 1607 325 325 1607 137 137 1605 517 517 1606 517 517 1609 194 82 1610 325 325 1608 325 325 1608 194 82 1610 516 516 1611 325 325 1613 516 516 1614 665 665 1612 665 665 1612 516 516 1614 141 141 1615 21 21 1616 632 632 1617 657 657 1619 657 657 1619 632 632 1617 326 326 1618 124 124 1621 518 518 1622 632 632 1620 632 632 1620 518 518 1622 326 326 1623 518 518 1625 194 82 1626 326 326 1624 326 326 1624 194 82 1626 517 517 1627 657 657 1628 326 326 1629 137 137 1631 137 137 1631 326 326 1629 517 517 1630 15 15 1632 670 670 1633 637 637 1635 637 637 1635 670 670 1633 327 327 1634 670 670 1636 143 143 1637 327 327 1639 327 327 1639 143 143 1637 519 519 1638 327 327 1640 519 519 1641 521 521 1643 521 521 1643 519 519 1641 195 83 1642 637 637 1644 327 327 1645 127 127 1647 127 127 1647 327 327 1645 521 521 1646 20 20 1648 652 652 1649 669 669 1651 669 669 1651 652 652 1649 328 328 1650 134 134 1653 520 520 1654 652 652 1652 652 652 1652 520 520 1654 328 328 1655 520 520 1657 195 83 1658 328 328 1656 328 328 1656 195 83 1658 519 519 1659 328 328 1661 519 519 1662 669 669 1660 669 669 1660 519 519 1662 143 143 1663 19 19 1664 638 638 1665 651 651 1667 651 651 1667 638 638 1665 329 329 1666 127 127 1669 521 521 1670 638 638 1668 638 638 1668 521 521 1670 329 329 1671 329 329 1672 521 521 1673 520 520 1675 520 520 1675 521 521 1673 195 83 1674 651 651 1676 329 329 1677 134 134 1679 134 134 1679 329 329 1677 520 520 1678 17 17 1680 634 634 1681 643 643 1683 643 643 1683 634 634 1681 330 330 1682 634 634 1684 125 125 1685 330 330 1687 330 330 1687 125 125 1685 522 522 1686 330 330 1688 522 522 1689 524 524 1691 524 524 1691 522 522 1689 196 84 1690 643 643 1692 330 330 1693 130 130 1695 130 130 1695 330 330 1693 524 524 1694 648 648 1697 331 331 1698 19 19 1696 19 19 1696 331 331 1698 633 633 1699 132 132 1701 523 523 1702 648 648 1700 648 648 1700 523 523 1702 331 331 1703 523 523 1705 196 84 1706 331 331 1704 331 331 1704 196 84 1706 522 522 1707 331 331 1709 522 522 1710 633 633 1708 633 633 1708 522 522 1710 125 125 1711 644 644 1713 332 332 1714 18 18 1712 18 18 1712 332 332 1714 647 647 1715 130 130 1717 524 524 1718 644 644 1716 644 644 1716 524 524 1718 332 332 1719 524 524 1721 196 84 1722 332 332 1720 332 332 1720 196 84 1722 523 523 1723 332 332 1725 523 523 1726 647 647 1724 647 647 1724 523 523 1726 132 132 1727 777 777 1729 333 333 1730 20 20 1728 20 20 1728 333 333 1730 653 653 1731 85 197 1733 525 525 1734 777 777 1732 777 777 1732 525 525 1734 333 333 1735 525 525 1737 197 85 1738 333 333 1736 333 333 1736 197 85 1738 527 527 1739 333 333 1741 527 527 1742 653 653 1740 653 653 1740 527 527 1742 135 135 1743 12 12 1744 779 779 1745 778 778 1747 778 778 1747 779 779 1745 334 334 1746 86 198 1749 526 526 1750 779 779 1748 779 779 1748 526 526 1750 334 334 1751 526 526 1753 197 85 1754 334 334 1752 334 334 1752 197 85 1754 525 525 1755 778 778 1756 334 334 1757 85 197 1759 85 197 1759 334 334 1757 525 525 1758 16 16 1760 654 654 1761 780 780 1763 780 780 1763 654 654 1761 335 335 1762 654 654 1764 135 135 1765 335 335 1767 335 335 1767 135 135 1765 527 527 1766 335 335 1768 527 527 1769 526 526 1771 526 526 1771 527 527 1769 197 85 1770 780 780 1772 335 335 1773 86 198 1775 86 198 1775 335 335 1773 526 526 1774 17 17 1776 642 642 1777 784 784 1779 784 784 1779 642 642 1777 336 336 1778 642 642 1780 129 129 1781 336 336 1783 336 336 1783 129 129 1781 528 528 1782 336 336 1784 528 528 1785 530 530 1787 530 530 1787 528 528 1785 198 86 1786 336 336 1789 530 530 1790 784 784 1788 784 784 1788 530 530 1790 88 200 1791 781 781 1793 337 337 1794 14 14 1792 14 14 1792 337 337 1794 641 641 1795 87 199 1797 529 529 1798 781 781 1796 781 781 1796 529 529 1798 337 337 1799 529 529 1801 198 86 1802 337 337 1800 337 337 1800 198 86 1802 528 528 1803 337 337 1805 528 528 1806 641 641 1804 641 641 1804 528 528 1806 129 129 1807 5 5 1808 783 783 1809 782 782 1811 782 782 1811 783 783 1809 338 338 1810 783 783 1812 88 200 1813 338 338 1815 338 338 1815 88 200 1813 530 530 1814 338 338 1816 530 530 1817 529 529 1819 529 529 1819 530 530 1817 198 86 1818 782 782 1820 338 338 1821 87 199 1823 87 199 1823 338 338 1821 529 529 1822 785 785 1825 339 339 1826 5 5 1824 5 5 1824 339 339 1826 783 783 1827 89 201 1829 531 531 1830 785 785 1828 785 785 1828 531 531 1830 339 339 1831 531 531 1833 199 87 1834 339 339 1832 339 339 1832 199 87 1834 533 533 1835 339 339 1837 533 533 1838 783 783 1836 783 783 1836 533 533 1838 88 200 1839 22 22 1840 664 664 1841 786 786 1843 786 786 1843 664 664 1841 340 340 1842 664 664 1844 140 140 1845 340 340 1847 340 340 1847 140 140 1845 532 532 1846 340 340 1848 532 532 1849 531 531 1851 531 531 1851 532 532 1849 199 87 1850 786 786 1852 340 340 1853 89 201 1855 89 201 1855 340 340 1853 531 531 1854 17 17 1856 784 784 1857 663 663 1859 663 663 1859 784 784 1857 341 341 1858 784 784 1860 88 200 1861 341 341 1863 341 341 1863 88 200 1861 533 533 1862 341 341 1864 533 533 1865 532 532 1867 532 532 1867 533 533 1865 199 87 1866 663 663 1868 341 341 1869 140 140 1871 140 140 1871 341 341 1869 532 532 1870 24 24 1872 774 774 1873 667 667 1875 667 667 1875 774 774 1873 342 342 1874 774 774 1876 83 195 1877 342 342 1879 342 342 1879 83 195 1877 534 534 1878 342 342 1880 534 534 1881 536 536 1883 536 536 1883 534 534 1881 200 88 1882 667 667 1884 342 342 1885 142 142 1887 142 142 1887 342 342 1885 536 536 1886 636 636 1889 343 343 1890 15 15 1888 15 15 1888 343 343 1890 773 773 1891 126 126 1893 535 535 1894 636 636 1892 636 636 1892 535 535 1894 343 343 1895 535 535 1897 200 88 1898 343 343 1896 343 343 1896 200 88 1898 534 534 1899 343 343 1901 534 534 1902 773 773 1900 773 773 1900 534 534 1902 83 195 1903 17 17 1904 668 668 1905 635 635 1907 635 635 1907 668 668 1905 344 344 1906 142 142 1909 536 536 1910 668 668 1908 668 668 1908 536 536 1910 344 344 1911 344 344 1912 536 536 1913 535 535 1915 535 535 1915 536 536 1913 200 88 1914 635 635 1916 344 344 1917 126 126 1919 126 126 1919 344 344 1917 535 535 1918 10 10 1920 787 787 1921 792 792 1923 792 792 1923 787 787 1921 345 345 1922 787 787 1924 90 202 1925 345 345 1927 345 345 1927 90 202 1925 537 537 1926 537 537 1929 201 89 1930 345 345 1928 345 345 1928 201 89 1930 539 539 1931 345 345 1933 539 539 1934 792 792 1932 792 792 1932 539 539 1934 92 204 1935 789 789 1937 346 346 1938 6 6 1936 6 6 1936 346 346 1938 788 788 1939 91 203 1941 538 538 1942 789 789 1940 789 789 1940 538 538 1942 346 346 1943 538 538 1945 201 89 1946 346 346 1944 346 346 1944 201 89 1946 537 537 1947 346 346 1949 537 537 1950 788 788 1948 788 788 1948 537 537 1950 90 202 1951 20 20 1952 791 791 1953 790 790 1955 790 790 1955 791 791 1953 347 347 1954 791 791 1956 92 204 1957 347 347 1959 347 347 1959 92 204 1957 539 539 1958 347 347 1960 539 539 1961 538 538 1963 538 538 1963 539 539 1961 201 89 1962 790 790 1964 347 347 1965 91 203 1967 91 203 1967 347 347 1965 538 538 1966 20 20 1968 790 790 1969 777 777 1971 777 777 1971 790 790 1969 348 348 1970 91 203 1973 540 540 1974 790 790 1972 790 790 1972 540 540 1974 348 348 1975 540 540 1977 202 90 1978 348 348 1976 348 348 1976 202 90 1978 542 542 1979 777 777 1980 348 348 1981 85 197 1983 85 197 1983 348 348 1981 542 542 1982 6 6 1984 793 793 1985 789 789 1987 789 789 1987 793 793 1985 349 349 1986 793 793 1988 93 205 1989 349 349 1991 349 349 1991 93 205 1989 541 541 1990 349 349 1992 541 541 1993 540 540 1995 540 540 1995 541 541 1993 202 90 1994 789 789 1996 349 349 1997 91 203 1999 91 203 1999 349 349 1997 540 540 1998 778 778 2001 350 350 2002 12 12 2000 12 12 2000 350 350 2002 794 794 2003 85 197 2005 542 542 2006 778 778 2004 778 778 2004 542 542 2006 350 350 2007 542 542 2009 202 90 2010 350 350 2008 350 350 2008 202 90 2010 541 541 2011 350 350 2013 541 541 2014 794 794 2012 794 794 2012 541 541 2014 93 205 2015 20 20 2016 674 674 2017 791 791 2019 791 791 2019 674 674 2017 351 351 2018 674 674 2020 145 145 2021 351 351 2023 351 351 2023 145 145 2021 543 543 2022 351 351 2024 543 543 2025 545 545 2027 545 545 2027 543 543 2025 203 91 2026 351 351 2029 545 545 2030 791 791 2028 791 791 2028 545 545 2030 92 204 2031 25 25 2032 682 682 2033 673 673 2035 673 673 2035 682 682 2033 352 352 2034 149 149 2037 544 544 2038 682 682 2036 682 682 2036 544 544 2038 352 352 2039 544 544 2041 203 91 2042 352 352 2040 352 352 2040 203 91 2042 543 543 2043 673 673 2044 352 352 2045 145 145 2047 145 145 2047 352 352 2045 543 543 2046 10 10 2048 792 792 2049 681 681 2051 681 681 2051 792 792 2049 353 353 2050 792 792 2052 92 204 2053 353 353 2055 353 353 2055 92 204 2053 545 545 2054 353 353 2056 545 545 2057 544 544 2059 544 544 2059 545 545 2057 203 91 2058 681 681 2060 353 353 2061 149 149 2063 149 149 2063 353 353 2061 544 544 2062 27 27 2064 762 762 2065 677 677 2067 677 677 2067 762 762 2065 354 354 2066 762 762 2068 77 189 2069 354 354 2071 354 354 2071 77 189 2069 546 546 2070 354 354 2072 546 546 2073 548 548 2075 548 548 2075 546 546 2073 204 92 2074 677 677 2076 354 354 2077 147 147 2079 147 147 2079 354 354 2077 548 548 2078 28 28 2080 795 795 2081 761 761 2083 761 761 2083 795 795 2081 355 355 2082 94 206 2085 547 547 2086 795 795 2084 795 795 2084 547 547 2086 355 355 2087 547 547 2089 204 92 2090 355 355 2088 355 355 2088 204 92 2090 546 546 2091 355 355 2093 546 546 2094 761 761 2092 761 761 2092 546 546 2094 77 189 2095 25 25 2096 678 678 2097 796 796 2099 796 796 2099 678 678 2097 356 356 2098 678 678 2100 147 147 2101 356 356 2103 356 356 2103 147 147 2101 548 548 2102 356 356 2104 548 548 2105 547 547 2107 547 547 2107 548 548 2105 204 92 2106 796 796 2108 356 356 2109 94 206 2111 94 206 2111 356 356 2109 547 547 2110 25 25 2112 796 796 2113 683 683 2115 683 683 2115 796 796 2113 357 357 2114 796 796 2116 94 206 2117 357 357 2119 357 357 2119 94 206 2117 549 549 2118 357 357 2120 549 549 2121 551 551 2123 551 551 2123 549 549 2121 205 93 2122 683 683 2124 357 357 2125 150 150 2127 150 150 2127 357 357 2125 551 551 2126 28 28 2128 688 688 2129 795 795 2131 795 795 2131 688 688 2129 358 358 2130 152 152 2133 550 550 2134 688 688 2132 688 688 2132 550 550 2134 358 358 2135 550 550 2137 205 93 2138 358 358 2136 358 358 2136 205 93 2138 549 549 2139 358 358 2141 549 549 2142 795 795 2140 795 795 2140 549 549 2142 94 206 2143 26 26 2144 684 684 2145 687 687 2147 687 687 2147 684 684 2145 359 359 2146 684 684 2148 150 150 2149 359 359 2151 359 359 2151 150 150 2149 551 551 2150 359 359 2152 551 551 2153 550 550 2155 550 550 2155 551 551 2153 205 93 2154 687 687 2156 359 359 2157 152 152 2159 152 152 2159 359 359 2157 550 550 2158 29 29 2160 797 797 2161 802 802 2163 802 802 2163 797 797 2161 360 360 2162 797 797 2164 95 207 2165 360 360 2167 360 360 2167 95 207 2165 552 552 2166 360 360 2168 552 552 2169 554 554 2171 554 554 2171 552 552 2169 206 94 2170 802 802 2172 360 360 2173 97 209 2175 97 209 2175 360 360 2173 554 554 2174 799 799 2177 361 361 2178 9 9 2176 9 9 2176 361 361 2178 798 798 2179 96 208 2181 553 553 2182 799 799 2180 799 799 2180 553 553 2182 361 361 2183 553 553 2185 206 94 2186 361 361 2184 361 361 2184 206 94 2186 552 552 2187 361 361 2189 552 552 2190 798 798 2188 798 798 2188 552 552 2190 95 207 2191 801 801 2193 362 362 2194 1 1 2192 1 1 2192 362 362 2194 800 800 2195 97 209 2197 554 554 2198 801 801 2196 801 801 2196 554 554 2198 362 362 2199 554 554 2201 206 94 2202 362 362 2200 362 362 2200 206 94 2202 553 553 2203 800 800 2204 362 362 2205 96 208 2207 96 208 2207 362 362 2205 553 553 2206 1 1 2208 690 690 2209 801 801 2211 801 801 2211 690 690 2209 363 363 2210 690 690 2212 153 153 2213 363 363 2215 363 363 2215 153 153 2213 555 555 2214 363 363 2216 555 555 2217 557 557 2219 557 557 2219 555 555 2217 207 95 2218 801 801 2220 363 363 2221 97 209 2223 97 209 2223 363 363 2221 557 557 2222 28 28 2224 768 768 2225 689 689 2227 689 689 2227 768 768 2225 364 364 2226 768 768 2228 80 192 2229 364 364 2231 364 364 2231 80 192 2229 556 556 2230 364 364 2232 556 556 2233 555 555 2235 555 555 2235 556 556 2233 207 95 2234 689 689 2236 364 364 2237 153 153 2239 153 153 2239 364 364 2237 555 555 2238 29 29 2240 802 802 2241 767 767 2243 767 767 2243 802 802 2241 365 365 2242 97 209 2245 557 557 2246 802 802 2244 802 802 2244 557 557 2246 365 365 2247 557 557 2249 207 95 2250 365 365 2248 365 365 2248 207 95 2250 556 556 2251 767 767 2252 365 365 2253 80 192 2255 80 192 2255 365 365 2253 556 556 2254 35 35 2256 803 803 2257 695 695 2259 695 695 2259 803 803 2257 366 366 2258 803 803 2260 98 210 2261 366 366 2263 366 366 2263 98 210 2261 558 558 2262 366 366 2264 558 558 2265 560 560 2267 560 560 2267 558 558 2265 208 96 2266 695 695 2268 366 366 2269 156 156 2271 156 156 2271 366 366 2269 560 560 2270 34 34 2272 700 700 2273 804 804 2275 804 804 2275 700 700 2273 367 367 2274 158 158 2277 559 559 2278 700 700 2276 700 700 2276 559 559 2278 367 367 2279 559 559 2281 208 96 2282 367 367 2280 367 367 2280 208 96 2282 558 558 2283 367 367 2285 558 558 2286 804 804 2284 804 804 2284 558 558 2286 98 210 2287 32 32 2288 696 696 2289 699 699 2291 699 699 2291 696 696 2289 368 368 2290 696 696 2292 156 156 2293 368 368 2295 368 368 2295 156 156 2293 560 560 2294 368 368 2296 560 560 2297 559 559 2299 559 559 2299 560 560 2297 208 96 2298 699 699 2300 368 368 2301 158 158 2303 158 158 2303 368 368 2301 559 559 2302 34 34 2304 805 805 2305 701 701 2307 701 701 2307 805 805 2305 369 369 2306 805 805 2308 99 211 2309 369 369 2311 369 369 2311 99 211 2309 561 561 2310 561 561 2313 209 97 2314 369 369 2312 369 369 2312 209 97 2314 563 563 2315 369 369 2317 563 563 2318 701 701 2316 701 701 2316 563 563 2318 159 159 2319 29 29 2320 618 618 2321 806 806 2323 806 806 2323 618 618 2321 370 370 2322 117 117 2325 562 562 2326 618 618 2324 618 618 2324 562 562 2326 370 370 2327 562 562 2329 209 97 2330 370 370 2328 370 370 2328 209 97 2330 561 561 2331 370 370 2333 561 561 2334 806 806 2332 806 806 2332 561 561 2334 99 211 2335 8 8 2336 702 702 2337 617 617 2339 617 617 2339 702 702 2337 371 371 2338 702 702 2340 159 159 2341 371 371 2343 371 371 2343 159 159 2341 563 563 2342 371 371 2344 563 563 2345 562 562 2347 562 562 2347 563 563 2345 209 97 2346 617 617 2348 371 371 2349 117 117 2351 117 117 2351 371 371 2349 562 562 2350 9 9 2352 798 798 2353 707 707 2355 707 707 2355 798 798 2353 372 372 2354 798 798 2356 95 207 2357 372 372 2359 372 372 2359 95 207 2357 564 564 2358 372 372 2360 564 564 2361 566 566 2363 566 566 2363 564 564 2361 210 98 2362 707 707 2364 372 372 2365 50 162 2367 50 162 2367 372 372 2365 566 566 2366 29 29 2368 806 806 2369 797 797 2371 797 797 2371 806 806 2369 373 373 2370 99 211 2373 565 565 2374 806 806 2372 806 806 2372 565 565 2374 373 373 2375 565 565 2377 210 98 2378 373 373 2376 373 373 2376 210 98 2378 564 564 2379 373 373 2381 564 564 2382 797 797 2380 797 797 2380 564 564 2382 95 207 2383 34 34 2384 708 708 2385 805 805 2387 805 805 2387 708 708 2385 374 374 2386 50 162 2389 566 566 2390 708 708 2388 708 708 2388 566 566 2390 374 374 2391 566 566 2393 210 98 2394 374 374 2392 374 374 2392 210 98 2394 565 565 2395 805 805 2396 374 374 2397 99 211 2399 99 211 2399 374 374 2397 565 565 2398 33 33 2400 704 704 2401 713 713 2403 713 713 2403 704 704 2401 375 375 2402 704 704 2404 160 160 2405 375 375 2407 375 375 2407 160 160 2405 567 567 2406 375 375 2408 567 567 2409 569 569 2411 569 569 2411 567 567 2409 211 99 2410 713 713 2412 375 375 2413 53 165 2415 53 165 2415 375 375 2413 569 569 2414 34 34 2416 804 804 2417 703 703 2419 703 703 2419 804 804 2417 376 376 2418 98 210 2421 568 568 2422 804 804 2420 804 804 2420 568 568 2422 376 376 2423 568 568 2425 211 99 2426 376 376 2424 376 376 2424 211 99 2426 567 567 2427 376 376 2429 567 567 2430 703 703 2428 703 703 2428 567 567 2430 160 160 2431 35 35 2432 714 714 2433 803 803 2435 803 803 2435 714 714 2433 377 377 2434 714 714 2436 53 165 2437 377 377 2439 377 377 2439 53 165 2437 569 569 2438 377 377 2440 569 569 2441 568 568 2443 568 568 2443 569 569 2441 211 99 2442 803 803 2444 377 377 2445 98 210 2447 98 210 2447 377 377 2445 568 568 2446 807 807 2449 378 378 2450 3 3 2448 3 3 2448 378 378 2450 812 812 2451 807 807 2452 100 212 2453 378 378 2455 378 378 2455 100 212 2453 570 570 2454 570 570 2457 212 100 2458 378 378 2456 378 378 2456 212 100 2458 572 572 2459 378 378 2461 572 572 2462 812 812 2460 812 812 2460 572 572 2462 102 214 2463 809 809 2465 379 379 2466 36 36 2464 36 36 2464 379 379 2466 808 808 2467 101 213 2469 571 571 2470 809 809 2468 809 809 2468 571 571 2470 379 379 2471 571 571 2473 212 100 2474 379 379 2472 379 379 2472 212 100 2474 570 570 2475 379 379 2477 570 570 2478 808 808 2476 808 808 2476 570 570 2478 100 212 2479 47 47 2480 811 811 2481 810 810 2483 810 810 2483 811 811 2481 380 380 2482 811 811 2484 102 214 2485 380 380 2487 380 380 2487 102 214 2485 572 572 2486 380 380 2488 572 572 2489 571 571 2491 571 571 2491 572 572 2489 212 100 2490 810 810 2492 380 380 2493 101 213 2495 101 213 2495 380 380 2493 571 571 2494 35 35 2496 694 694 2497 816 816 2499 816 816 2499 694 694 2497 381 381 2498 694 694 2500 155 155 2501 381 381 2503 381 381 2503 155 155 2501 573 573 2502 381 381 2504 573 573 2505 575 575 2507 575 575 2507 573 573 2505 213 101 2506 816 816 2508 381 381 2509 104 216 2511 104 216 2511 381 381 2509 575 575 2510 813 813 2513 382 382 2514 30 30 2512 30 30 2512 382 382 2514 693 693 2515 103 215 2517 574 574 2518 813 813 2516 813 813 2516 574 574 2518 382 382 2519 574 574 2521 213 101 2522 382 382 2520 382 382 2520 213 101 2522 573 573 2523 382 382 2525 573 573 2526 693 693 2524 693 693 2524 573 573 2526 155 155 2527 3 3 2528 815 815 2529 814 814 2531 814 814 2531 815 815 2529 383 383 2530 815 815 2532 104 216 2533 383 383 2535 383 383 2535 104 216 2533 575 575 2534 383 383 2536 575 575 2537 574 574 2539 574 574 2539 575 575 2537 213 101 2538 814 814 2540 383 383 2541 103 215 2543 103 215 2543 383 383 2541 574 574 2542 35 35 2544 816 816 2545 719 719 2547 719 719 2547 816 816 2545 384 384 2546 816 816 2548 104 216 2549 384 384 2551 384 384 2551 104 216 2549 576 576 2550 384 384 2552 576 576 2553 578 578 2555 578 578 2555 576 576 2553 214 102 2554 719 719 2556 384 384 2557 56 168 2559 56 168 2559 384 384 2557 578 578 2558 3 3 2560 812 812 2561 815 815 2563 815 815 2563 812 812 2561 385 385 2562 812 812 2564 102 214 2565 385 385 2567 385 385 2567 102 214 2565 577 577 2566 385 385 2568 577 577 2569 576 576 2571 576 576 2571 577 577 2569 214 102 2570 815 815 2572 385 385 2573 104 216 2575 104 216 2575 385 385 2573 576 576 2574 47 47 2576 720 720 2577 811 811 2579 811 811 2579 720 720 2577 386 386 2578 56 168 2581 578 578 2582 720 720 2580 720 720 2580 578 578 2582 386 386 2583 578 578 2585 214 102 2586 386 386 2584 386 386 2584 214 102 2586 577 577 2587 386 386 2589 577 577 2590 811 811 2588 811 811 2588 577 577 2590 102 214 2591 817 817 2593 387 387 2594 37 37 2592 37 37 2592 387 387 2594 741 741 2595 105 217 2597 579 579 2598 817 817 2596 817 817 2596 579 579 2598 387 387 2599 579 579 2601 215 103 2602 387 387 2600 387 387 2600 215 103 2602 581 581 2603 387 387 2605 581 581 2606 741 741 2604 741 741 2604 581 581 2606 67 179 2607 4 4 2608 722 722 2609 818 818 2611 818 818 2611 722 722 2609 388 388 2610 722 722 2612 57 169 2613 388 388 2615 388 388 2615 57 169 2613 580 580 2614 388 388 2616 580 580 2617 579 579 2619 579 579 2619 580 580 2617 215 103 2618 818 818 2620 388 388 2621 105 217 2623 105 217 2623 388 388 2621 579 579 2622 42 42 2624 742 742 2625 721 721 2627 721 721 2627 742 742 2625 389 389 2626 742 742 2628 67 179 2629 389 389 2631 389 389 2631 67 179 2629 581 581 2630 581 581 2633 215 103 2634 389 389 2632 389 389 2632 215 103 2634 580 580 2635 389 389 2637 580 580 2638 721 721 2636 721 721 2636 580 580 2638 57 169 2639 35 35 2640 718 718 2641 820 820 2643 820 820 2643 718 718 2641 390 390 2642 718 718 2644 55 167 2645 390 390 2647 390 390 2647 55 167 2645 582 582 2646 390 390 2648 582 582 2649 584 584 2651 584 584 2651 582 582 2649 216 104 2650 820 820 2652 390 390 2653 106 218 2655 106 218 2655 390 390 2653 584 584 2654 38 38 2656 734 734 2657 717 717 2659 717 717 2659 734 734 2657 391 391 2658 734 734 2660 63 175 2661 391 391 2663 391 391 2663 63 175 2661 583 583 2662 583 583 2665 216 104 2666 391 391 2664 391 391 2664 216 104 2666 582 582 2667 717 717 2668 391 391 2669 55 167 2671 55 167 2671 391 391 2669 582 582 2670 42 42 2672 819 819 2673 733 733 2675 733 733 2675 819 819 2673 392 392 2674 106 218 2677 584 584 2678 819 819 2676 819 819 2676 584 584 2678 392 392 2679 584 584 2681 216 104 2682 392 392 2680 392 392 2680 216 104 2682 583 583 2683 392 392 2685 583 583 2686 733 733 2684 733 733 2684 583 583 2686 63 175 2687 31 31 2688 710 710 2689 725 725 2691 725 725 2691 710 710 2689 393 393 2690 710 710 2692 51 163 2693 393 393 2695 393 393 2695 51 163 2693 585 585 2694 393 393 2696 585 585 2697 587 587 2699 587 587 2699 585 585 2697 217 105 2698 725 725 2700 393 393 2701 59 171 2703 59 171 2703 393 393 2701 587 587 2702 35 35 2704 820 820 2705 709 709 2707 709 709 2707 820 820 2705 394 394 2706 820 820 2708 106 218 2709 394 394 2711 394 394 2711 106 218 2709 586 586 2710 586 586 2713 217 105 2714 394 394 2712 394 394 2712 217 105 2714 585 585 2715 394 394 2717 585 585 2718 709 709 2716 709 709 2716 585 585 2718 51 163 2719 42 42 2720 726 726 2721 819 819 2723 819 819 2723 726 726 2721 395 395 2722 59 171 2725 587 587 2726 726 726 2724 726 726 2724 587 587 2726 395 395 2727 395 395 2728 587 587 2729 586 586 2731 586 586 2731 587 587 2729 217 105 2730 819 819 2732 395 395 2733 106 218 2735 106 218 2735 395 395 2733 586 586 2734 41 41 2736 758 758 2737 731 731 2739 731 731 2739 758 758 2737 396 396 2738 75 187 2741 588 588 2742 758 758 2740 758 758 2740 588 588 2742 396 396 2743 588 588 2745 218 106 2746 396 396 2744 396 396 2744 218 106 2746 590 590 2747 396 396 2749 590 590 2750 731 731 2748 731 731 2748 590 590 2750 62 174 2751 39 39 2752 821 821 2753 757 757 2755 757 757 2755 821 821 2753 397 397 2754 107 219 2757 589 589 2758 821 821 2756 821 821 2756 589 589 2758 397 397 2759 589 589 2761 218 106 2762 397 397 2760 397 397 2760 218 106 2762 588 588 2763 757 757 2764 397 397 2765 75 187 2767 75 187 2767 397 397 2765 588 588 2766 44 44 2768 732 732 2769 822 822 2771 822 822 2771 732 732 2769 398 398 2770 732 732 2772 62 174 2773 398 398 2775 398 398 2775 62 174 2773 590 590 2774 398 398 2776 590 590 2777 589 589 2779 589 589 2779 590 590 2777 218 106 2778 822 822 2780 398 398 2781 107 219 2783 107 219 2783 398 398 2781 589 589 2782 41 41 2784 730 730 2785 737 737 2787 737 737 2787 730 730 2785 399 399 2786 730 730 2788 61 173 2789 399 399 2791 399 399 2791 61 173 2789 591 591 2790 399 399 2792 591 591 2793 593 593 2795 593 593 2795 591 591 2793 219 107 2794 737 737 2796 399 399 2797 65 177 2799 65 177 2799 399 399 2797 593 593 2798 43 43 2800 823 823 2801 729 729 2803 729 729 2803 823 823 2801 400 400 2802 108 220 2805 592 592 2806 823 823 2804 823 823 2804 592 592 2806 400 400 2807 592 592 2809 219 107 2810 400 400 2808 400 400 2808 219 107 2810 591 591 2811 400 400 2813 591 591 2814 729 729 2812 729 729 2812 591 591 2814 61 173 2815 42 42 2816 738 738 2817 824 824 2819 824 824 2819 738 738 2817 401 401 2818 738 738 2820 65 177 2821 401 401 2823 401 401 2823 65 177 2821 593 593 2822 401 401 2824 593 593 2825 592 592 2827 592 592 2827 593 593 2825 219 107 2826 824 824 2828 401 401 2829 108 220 2831 108 220 2831 401 401 2829 592 592 2830 42 42 2832 824 824 2833 743 743 2835 743 743 2835 824 824 2833 402 402 2834 824 824 2836 108 220 2837 402 402 2839 402 402 2839 108 220 2837 594 594 2838 402 402 2840 594 594 2841 596 596 2843 596 596 2843 594 594 2841 220 108 2842 743 743 2844 402 402 2845 68 180 2847 68 180 2847 402 402 2845 596 596 2846 748 748 2849 403 403 2850 43 43 2848 43 43 2848 403 403 2850 823 823 2851 748 748 2852 70 182 2853 403 403 2855 403 403 2855 70 182 2853 595 595 2854 595 595 2857 220 108 2858 403 403 2856 403 403 2856 220 108 2858 594 594 2859 403 403 2861 594 594 2862 823 823 2860 823 823 2860 594 594 2862 108 220 2863 744 744 2865 404 404 2866 40 40 2864 40 40 2864 404 404 2866 747 747 2867 68 180 2869 596 596 2870 744 744 2868 744 744 2868 596 596 2870 404 404 2871 596 596 2873 220 108 2874 404 404 2872 404 404 2872 220 108 2874 595 595 2875 404 404 2877 595 595 2878 747 747 2876 747 747 2876 595 595 2878 70 182 2879 47 47 2880 810 810 2881 751 751 2883 751 751 2883 810 810 2881 405 405 2882 810 810 2884 101 213 2885 405 405 2887 405 405 2887 101 213 2885 597 597 2886 405 405 2888 597 597 2889 599 599 2891 599 599 2891 597 597 2889 221 109 2890 751 751 2892 405 405 2893 72 184 2895 72 184 2895 405 405 2893 599 599 2894 36 36 2896 825 825 2897 809 809 2899 809 809 2899 825 825 2897 406 406 2898 825 825 2900 109 221 2901 406 406 2903 406 406 2903 109 221 2901 598 598 2902 598 598 2905 221 109 2906 406 406 2904 406 406 2904 221 109 2906 597 597 2907 809 809 2908 406 406 2909 101 213 2911 101 213 2911 406 406 2909 597 597 2910 45 45 2912 752 752 2913 826 826 2915 826 826 2915 752 752 2913 407 407 2914 752 752 2916 72 184 2917 407 407 2919 407 407 2919 72 184 2917 599 599 2918 599 599 2921 221 109 2922 407 407 2920 407 407 2920 221 109 2922 598 598 2923 826 826 2924 407 407 2925 109 221 2927 109 221 2927 407 407 2925 598 598 2926 46 46 2928 827 827 2929 753 753 2931 753 753 2931 827 827 2929 408 408 2930 827 827 2932 110 222 2933 408 408 2935 408 408 2935 110 222 2933 600 600 2934 408 408 2936 600 600 2937 602 602 2939 602 602 2939 600 600 2937 222 110 2938 753 753 2940 408 408 2941 73 185 2943 73 185 2943 408 408 2941 602 602 2942 736 736 2945 409 409 2946 41 41 2944 41 41 2944 409 409 2946 828 828 2947 64 176 2949 601 601 2950 736 736 2948 736 736 2948 601 601 2950 409 409 2951 601 601 2953 222 110 2954 409 409 2952 409 409 2952 222 110 2954 600 600 2955 409 409 2957 600 600 2958 828 828 2956 828 828 2956 600 600 2958 110 222 2959 38 38 2960 754 754 2961 735 735 2963 735 735 2963 754 754 2961 410 410 2962 73 185 2965 602 602 2966 754 754 2964 754 754 2964 602 602 2966 410 410 2967 410 410 2968 602 602 2969 601 601 2971 601 601 2971 602 602 2969 222 110 2970 735 735 2972 410 410 2973 64 176 2975 64 176 2975 410 410 2973 601 601 2974 41 41 2976 828 828 2977 830 830 2979 830 830 2979 828 828 2977 411 411 2978 828 828 2980 110 222 2981 411 411 2983 411 411 2983 110 222 2981 603 603 2982 411 411 2984 603 603 2985 605 605 2987 605 605 2987 603 603 2985 223 111 2986 830 830 2988 411 411 2989 111 223 2991 111 223 2991 411 411 2989 605 605 2990 612 612 2993 412 412 2994 46 46 2992 46 46 2992 412 412 2994 827 827 2995 114 114 2997 604 604 2998 612 612 2996 612 612 2996 604 604 2998 412 412 2999 604 604 3001 223 111 3002 412 412 3000 412 412 3000 223 111 3002 603 603 3003 412 412 3005 603 603 3006 827 827 3004 827 827 3004 603 603 3006 110 222 3007 48 48 3008 829 829 3009 611 611 3011 611 611 3011 829 829 3009 413 413 3010 111 223 3013 605 605 3014 829 829 3012 829 829 3012 605 605 3014 413 413 3015 605 605 3017 223 111 3018 413 413 3016 413 413 3016 223 111 3018 604 604 3019 611 611 3020 413 413 3021 114 114 3023 114 114 3023 413 413 3021 604 604 3022 41 41 3024 830 830 3025 759 759 3027 759 759 3027 830 830 3025 414 414 3026 830 830 3028 111 223 3029 414 414 3031 414 414 3031 111 223 3029 606 606 3030 414 414 3032 606 606 3033 608 608 3035 608 608 3035 606 606 3033 224 112 3034 759 759 3036 414 414 3037 76 188 3039 76 188 3039 414 414 3037 608 608 3038 48 48 3040 831 831 3041 829 829 3043 829 829 3043 831 831 3041 415 415 3042 831 831 3044 112 224 3045 415 415 3047 415 415 3047 112 224 3045 607 607 3046 415 415 3048 607 607 3049 606 606 3051 606 606 3051 607 607 3049 224 112 3050 829 829 3052 415 415 3053 111 223 3055 111 223 3055 415 415 3053 606 606 3054 760 760 3057 416 416 3058 2 2 3056 2 2 3056 416 416 3058 832 832 3059 76 188 3061 608 608 3062 760 760 3060 760 760 3060 608 608 3062 416 416 3063 608 608 3065 224 112 3066 416 416 3064 416 416 3064 224 112 3066 607 607 3067 416 416 3069 607 607 3070 832 832 3068 832 832 3068 607 607 3070 112 224 3071</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape6</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_6" name="qt_gauge_background_6" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape6">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_6</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_7.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_7.dae
new file mode 100644
index 0000000..fdbb60b
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_7.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:37:34</created>
+ <modified>2018-03-08T09:37:34</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape7" name="qt_gauge_background_Shape7">
+ <mesh>
+ <source id="qt_gauge_background_Shape7-positions" name="qt_gauge_background_Shape7-positions">
+ <float_array id="qt_gauge_background_Shape7-positions-array" count="1959">-2.155396 0 31.48933 -2.155273 0 -31.20702 41.79483 0 31.33017 72.67505 0 10.21455 -41.79483 0 31.33017 -72.67505 0 10.21455 6.035065 0 31.48932 6.035095 0 -31.10628 -36.78546 0 -21.35188 -34.39673 0 31.48944 -54.40976 0 -11.42198 -54.22623 0 29.94279 -67.31589 0 -0.1110382 -53.97702 0 0.4660339 -64.2471 0 25.14734 -62.29013 0 1.702637 -71.57495 0 16.63704 -65.19437 0 14.04305 -54.23914 0 16.05952 -37.68668 0 2.148697 -18.39261 0 -28.23666 -18.39258 0 31.48936 -19.62582 0 -1.787231 3.668793 0 0.05529785 34.39673 0 31.48941 36.78546 0 -21.35196 19.11102 0 31.48932 19.11108 0 -28.20708 21.07355 0 0.726181 39.16827 0 0.8228455 54.22623 0 29.94278 54.40976 0 -11.42201 55.17783 0 1.702637 67.31586 0 -0.1110535 64.2471 0 25.14734 62.53119 0 0.4660339 64.54388 0 13.67267 53.52698 0 16.93333 71.57495 0 16.63704 11.71091 0 31.48932 11.5593 0 15.79321 5.844849 0 20.04951 11.71091 0 -30.08644 11.5592 0 -14.83139 27.66089 0 -25.25743 19.28067 0 -13.45497 27.82489 0 -11.76244 53.87384 0 8.04718 48.5791 0 0.7130432 46.01877 0 10.01176 45.905 0 -16.66663 36.99002 0 -9.50766 46.10617 0 -7.097702 53.93423 0 -4.136185 59.61404 0 0.6694183 60.10272 0 -4.194931 59.65503 0 14.9045 59.64203 0 21.48367 59.75232 0 7.757736 64.46677 0 0.503479 63.56244 0 5.593933 67.05157 0 7.023315 2.227234 0 31.48932 -0.3918457 0 20.04953 -9.411835 0 31.48935 -47.62994 0 30.91045 -53.80917 0 5.798126 -45.96542 0 10.07756 -58.26443 0 0.6694183 -67.09549 0 7.08284 -70.88843 0 5.498581 -45.905 0 -16.6666 -17.92569 0 -13.63094 -27.58905 0 -25.26036 -7.665497 0 -14.85825 -9.411743 0 -30.17531 36.77328 0 13.65392 30.41119 0 1.322037 13.50223 0 0.3579407 38.28995 0 31.47366 47.09839 0 25.64627 43.62372 0 21.57983 47.62994 0 30.91045 54.16925 0 24.71182 61.70502 0 -5.8405 59.66806 0 28.13023 72.95636 0 13.48915 69.39807 0 11.7561 70.8884 0 5.498566 68.43503 0 20.8927 68.60446 0 16.39465 64.26785 0 19.30083 -10.14468 0 0.1068268 -17.9256 0 11.3493 -7.665466 0 15.71593 -47.146 0 25.58894 -38.28995 0 31.47366 -43.67139 0 21.59979 -59.66803 0 28.13022 -54.21689 0 24.6545 -59.71222 0 21.42635 -61.70502 0 -5.840485 -64.45892 0 0.625885 -60.07239 0 -4.111191 -68.43503 0 20.8927 -64.33432 0 19.3217 -68.64841 0 16.41556 -72.95633 0 13.48915 -69.44202 0 11.77699 -63.62103 0 7.806503 -60.99854 0 14.86804 -59.53589 0 7.912537 -53.82196 0 -4.219925 -48.38831 0 0.6751404 -46.00516 0 -7.013199 -36.62726 0 17.97743 -27.35004 0 31.48936 -27.63626 0 15.83124 -36.84402 0 -9.423141 -27.72253 0 1.19458 -27.66397 0 -11.93573 5.844879 0 -19.73936 2.227325 0 -31.4895 -0.3917542 0 -19.77769 27.42188 0 31.48932 27.6456 0 15.74025 19.28058 0 15.76161 67.14288 0 19.00827 -11.37192 0 9.652222 -43.44284 0 26.20319 -58.04251 0 24.47108 -62.40497 0 -3.482071 -67.15588 0 19.0145 -70.31595 0 14.05931 -61.37573 0 10.30733 -49.26086 0 -3.729965 -30.61859 0 21.41872 -30.69739 0 -6.982895 2.792358 0 -22.56204 24.65958 0 20.97946 9.467255 0 21.7905 9.467255 0 -20.95688 24.7128 0 -16.90485 49.30249 0 5.77652 42.9465 0 -11.15366 58.05698 0 -3.167938 61.25607 0 18.82808 57.97455 0 10.31808 65.38123 0 4.731018 2.792267 0 22.61504 -5.263428 0 21.79051 -49.84576 0 26.56111 -49.26007 0 5.347443 -42.46353 0 16.16255 -61.52328 0 18.81728 -57.78796 0 -3.167938 -65.39188 0 5.174286 -69.05136 0 8.503708 -57.67545 0 4.929184 -42.9166 0 -11.12859 -24.44635 0 9.877151 -24.42902 0 -16.95679 -11.37195 0 -9.528885 -5.263397 0 -21.01382 31.18201 0 10.31573 14.32678 0 10.52806 14.32681 0 -9.47197 31.23517 0 -6.956604 43.42871 0 26.22014 49.83163 0 26.57811 42.47931 0 15.32996 49.31735 0 -3.730209 62.40729 0 -3.506882 58.02841 0 24.48807 61.14267 0 4.883316 70.30295 0 14.0531 69.03842 0 8.497498 66.06351 0 21.16394 69.05991 0 18.28606 66.15015 0 17.34023 -6.215179 0 6.62175 -14.55316 0 5.04454 -13.60284 0 17.095 -47.28162 0 22.30026 -42.68811 0 28.74677 -40.18777 0 27.58176 -60.51685 0 24.81885 -56.66483 0 26.82004 -56.69571 0 21.6199 -59.9151 0 -6.32724 -64.15909 0 -2.331085 -62.60098 0 -1.540649 -69.05988 0 18.28604 -66.06348 0 21.16394 -66.26724 0 17.39589 -71.44193 0 12.47366 -70.97577 0 15.20779 -68.35074 0 14.27792 -61.87704 0 6.824081 -62.77228 0 11.90329 -59.2103 0 12.26038 -50.83231 0 -6.72728 -51.46677 0 -1.763947 -45.32565 0 -2.338486 -33.1098 0 14.07538 -32.47568 0 25.52899 -26.05615 0 24.91058 -32.95355 0 -12.55754 -33.10989 0 -3.448105 -26.28613 0 -4.829742 3.12677 0 -15.44099 4.287811 0 -26.03993 0.7645264 0 -26.07841 22.54816 0 24.91054 28.64389 0 24.91057 22.88345 0 13.21436 8.119568 0 26.14735 12.78857 0 24.91055 7.678925 0 14.32933 12.7886 0 -23.40051 8.119568 0 -25.46542 7.678955 0 -13.84566 29.12177 0 -18.96205 22.54825 0 -21.01611 22.88351 0 -10.47992 50.69937 0 9.953934 51.70618 0 3.701065 45.59491 0 4.148346 47.36081 0 -11.71162 40.61725 0 -14.68506 41.04288 0 -6.862473 56.74756 0 -5.875214 56.73352 0 -1.540634 60.34235 0 -1.763947 62.40091 0 21.3356 62.45575 0 16.8938 58.72314 0 18.03787 56.73349 0 6.824081 56.44705 0 12.41333 60.57172 0 11.84761 66.26749 0 3.190613 64.17758 0 2.859314 65.29495 0 7.979446 0.7644653 0 26.14735 4.28775 0 26.14735 3.12677 0 15.56615 -2.203247 0 14.32935 -9.951141 0 24.91057 -4.025299 0 26.14738 -51.56436 0 27.94604 -46.5199 0 28.53398 -51.47357 0 23.15262 -45.32556 0 4.373672 -51.46667 0 2.859329 -50.82635 0 9.182587 -39.54056 0 21.62128 -40.77338 0 11.40443 -46.75607 0 15.76138 -59.2103 0 17.88495 -62.93307 0 16.94946 -62.40094 0 21.3356 -59.96124 0 -1.540634 -56.13385 0 -1.763931 -56.74756 0 -5.875214 -65.41202 0 8.653534 -64.15662 0 3.701035 -66.26752 0 3.190628 -67.65631 0 10.58174 -68.71115 0 5.398819 -70.58673 0 9.184204 -56.57401 0 8.564209 -56.13379 0 2.859329 -59.79358 0 3.70105 -40.77356 0 -6.637131 -40.61725 0 -14.68503 -47.36081 0 -11.71159 -22.04431 0 17.095 -22.2742 0 5.321289 -29.27802 0 7.262924 -22.27426 0 -10.94212 -22.04434 0 -21.02199 -29.12177 0 -18.96201 -13.60287 0 -16.59769 -14.55313 0 -6.025085 -6.215149 0 -6.069427 -4.025208 0 -25.54341 -9.951111 0 -23.45335 -2.203247 0 -13.87775 32.47568 0 17.71341 34.09955 0 6.419174 27.25549 0 7.020309 15.84253 0 18.33179 16.71808 0 6.743561 10.73285 0 6.621719 10.73288 0 -6.062012 16.71808 0 -5.562866 15.84253 0 -16.58437 27.25558 0 -4.367538 34.09961 0 -3.673447 32.95355 0 -12.55757 40.18777 0 27.58176 42.68805 0 28.74677 47.1546 0 22.4532 51.34659 0 23.30557 46.5199 0 28.53398 51.56433 0 27.94604 46.62909 0 15.91432 41.04272 0 9.942307 39.54056 0 20.38448 45.59497 0 -2.563812 51.70624 0 -1.540634 50.83231 0 -6.727295 62.62192 0 -1.763962 64.15912 0 -2.331085 59.9151 0 -6.32724 56.56873 0 21.77284 56.66486 0 26.82004 60.51688 0 24.81885 62.29501 0 8.151443 61.89798 0 2.859329 59.00952 0 3.70105 68.23367 0 14.22224 70.9758 0 15.20778 71.44193 0 12.47366 70.5867 0 9.184204 68.71115 0 5.398834 67.53922 0 10.52606 67.71457 0 19.87622 67.76801 0 17.85696 65.90729 0 19.23305 -10.49902 0 5.611694 -14.13928 0 10.83246 -9.541138 0 12.46358 -45.24231 0 25.79558 -41.29147 0 28.51118 -43.75186 0 24.30751 -58.80017 0 25.99998 -56.45685 0 24.34895 -58.80789 0 23.02568 -62.18118 0 -4.613235 -63.47443 0 -1.807602 -61.42441 0 -3.963623 -67.71454 0 19.87622 -65.93655 0 19.24698 -67.79727 0 17.8709 -71.45398 0 13.85582 -69.56348 0 15.09055 -69.88553 0 13.17694 -62.39041 0 9.242661 -61.12698 0 12.36375 -60.54297 0 9.331955 -51.27081 0 -4.119415 -48.6756 0 -1.86525 -47.79663 0 -5.115143 -33.25623 0 19.68539 -29.19373 0 25.72305 -29.35229 0 18.91237 -33.37582 0 -8.178024 -29.40985 0 -3.542038 -29.37076 0 -9.200287 4.12973 0 -20.7218 2.604248 0 -26.19229 1.593597 0 -20.74026 25.82608 0 25.56842 25.90991 0 18.69711 22.267 0 18.69711 10.39999 0 25.87762 10.28976 0 18.97585 7.758423 0 20.52185 10.39996 0 -24.80469 7.758423 0 -19.94955 10.28976 0 -18.07666 25.94568 0 -20.57568 22.26709 0 -15.45897 26.02948 0 -14.61571 51.29733 0 6.658829 48.80276 0 3.400146 47.83063 0 7.389023 44.21902 0 -13.58014 40.34045 0 -10.52521 44.32541 0 -9.305145 56.36536 0 -3.850601 58.77383 0 -1.665817 58.94489 0 -3.906433 62.60303 0 19.16434 60.56583 0 17.23689 60.55212 0 20.02876 56.29013 0 9.370209 58.7594 0 12.38805 58.83109 0 9.228775 65.16196 0 2.950272 64.71912 0 5.336304 66.16165 0 5.86557 2.604187 0 26.18683 4.1297 0 20.83105 1.593536 0 20.83105 -6.092529 0 18.97588 -6.942719 0 25.87766 -2.852295 0 20.52188 -48.92535 0 28.33629 -48.78098 0 25.87036 -51.836 0 25.46402 -48.67554 0 3.246048 -51.26926 0 5.637161 -47.79501 0 7.252533 -40.00375 0 16.72499 -44.10669 0 13.28639 -43.1998 0 18.5511 -61.16718 0 17.21257 -62.72235 0 19.17827 -60.67395 0 19.99052 -58.1684 0 -1.665817 -56.21548 0 -3.906418 -58.84961 0 -3.850616 -64.74316 0 6.333694 -65.15674 0 3.160706 -66.19098 0 6.034103 -68.1293 0 8.018051 -69.81882 0 7.291733 -69.15604 0 10.11475 -56.17203 0 5.482559 -58.12643 0 3.077896 -58.59668 0 6.311386 -40.27307 0 -10.46884 -44.21902 0 -13.58009 -44.25806 0 -9.24881 -21.62857 0 10.90167 -25.91614 0 6.11792 -25.85867 0 12.62386 -21.62857 0 -15.57597 -25.8197 0 -20.5771 -25.87717 0 -14.73123 -14.13931 0 -11.4277 -10.49905 0 -5.361771 -9.541138 0 -11.82355 -6.942657 0 -24.87689 -6.092468 0 -18.12109 -2.852234 0 -20.00171 33.50366 0 11.94914 30.62 0 6.331711 29.49359 0 12.71779 16.367 0 12.80322 13.72546 0 6.036438 12.96628 0 12.77277 13.72546 0 -5.24437 16.36703 0 -11.30884 12.96628 0 -11.81096 30.62006 0 -3.482834 33.62323 0 -8.23439 29.61313 0 -9.084732 41.29147 0 28.51118 45.21054 0 25.83383 43.72015 0 24.34575 48.74921 0 25.9086 48.92535 0 28.33627 51.80423 0 25.50226 44.14233 0 12.95911 40.07111 0 14.81346 43.16806 0 18.28015 48.80283 0 -1.865768 51.33063 0 -4.063614 47.86398 0 -5.171463 63.47961 0 -1.863434 62.18124 0 -4.613235 61.42957 0 -4.019455 56.42508 0 24.38718 58.80014 0 25.99998 58.77612 0 23.06392 62.27631 0 5.379333 60.49799 0 3.077896 60.5972 0 6.208191 69.53415 0 15.0766 71.45401 0 13.85582 69.8562 0 13.16301 69.81885 0 7.291733 68.09998 0 8.00412 69.12671 0 10.10081 66.41925 0 23.11386 70.18878 0 18.67128 70.13513 0 16.64578 66.89224 0 15.62379 64.33615 0 16.94829 64.24594 0 21.7751 -4.736053 0 0.2254333 -14.7294 0 -0.4981842 -18.45297 0 4.940872 -17.92798 0 19.10812 -12.39105 0 22.29883 -3.012726 0 9.164413 -50.08591 0 21.82649 -44.41757 0 28.63789 -39.87634 0 31.42587 -36.60645 0 31.48952 -39.54736 0 25.45348 -48.04114 0 18.78186 -62.02417 0 26.80571 -57.09619 0 29.16217 -54.21735 0 27.4213 -54.23331 0 21.39703 -57.55554 0 19.25719 -61.74155 0 23.26723 -58.2395 0 -8.661179 -64.74945 0 -2.982803 -65.60309 0 0.3324738 -63.49503 0 0.9960938 -61.45718 0 -1.471283 -57.91815 0 -6.929184 -70.18878 0 18.67128 -66.41925 0 23.11386 -64.24591 0 21.7751 -64.60187 0 17.03185 -67.0679 0 15.70737 -70.13513 0 16.64578 -73.00912 0 11.96927 -72.48785 0 14.97736 -67.62064 0 12.77376 -71.09949 0 10.95267 -63.11435 0 4.894516 -64.18707 0 10.7197 -62.97058 0 14.55568 -58.54437 0 15.23589 -57.52512 0 11.14371 -61.06665 0 4.894531 -53.97012 0 -7.02919 -53.8894 0 -1.806244 -51.50409 0 0.5065308 -44.23123 0 1.019012 -42.37292 0 -3.742737 -49.68457 0 -9.340378 -37.01978 0 11.27942 -35.91898 0 24.20341 -31.23163 0 31.48938 -22.99072 0 31.48935 -23.52048 0 22.29881 -31.84686 0 9.625626 -36.78543 0 -14.51472 -37.0199 0 -4.496826 -31.84689 0 1.682236 -23.86539 0 0.1465759 -23.86539 0 -7.300125 -31.61246 0 -16.26079 5.207428 0 -12.40218 6.048462 0 -25.75359 4.023437 0 -31.37666 0.2874756 0 -31.43593 -1.391815 0 -25.82117 1.081573 0 -12.41904 23.27811 0 31.48932 31.23163 0 31.48936 30.89572 0 22.45341 24.50909 0 9.107147 19.75574 0 9.037949 19.11774 0 22.60799 8.621521 0 31.48932 15.23135 0 31.48932 14.77344 0 22.60799 8.473053 0 9.164413 5.207397 0 12.63733 6.048492 0 26.10788 15.23138 0 -29.27077 8.621521 0 -30.68723 8.473053 0 -8.70076 14.77347 0 -20.80853 32.18729 0 -23.41365 23.27823 0 -26.86229 19.1178 0 -19.83511 19.7558 0 -7.235367 24.50916 0 -6.606796 31.61243 0 -16.26083 53.72888 0 11.68231 54.33856 0 4.894516 51.86322 0 0.996109 44.63531 0 0.6810303 42.77682 0 6.233185 49.33551 0 13.17595 50.27264 0 -14.09998 41.38367 0 -19.09344 36.7854 0 -14.51476 37.604 0 -4.834824 42.77695 0 -4.080704 49.68454 0 -9.340393 53.97009 0 -7.029205 54.33865 0 -1.471268 57.67416 0 0.9960938 61.23004 0 0.5065308 61.57864 0 -1.806259 57.91812 0 -6.929199 61.82382 0 14.47212 57.24454 0 15.46526 57.27496 0 19.48657 61.74152 0 23.26723 61.7836 0 10.52457 57.67413 0 4.894531 65.60306 0 0.3324585 63.52646 0 0.5065155 63.14575 0 2.851181 63.92136 0 8.939087 66.1525 0 9.979156 67.46143 0 3.900208 0.287384 0 31.48932 4.023376 0 31.48932 1.081543 0 12.63733 -1.391876 0 26.10788 -13.79443 0 31.48935 -5.460297 0 31.48933 -50.97565 0 30.51337 -44.47449 0 31.17053 -53.88934 0 2.851196 -53.9194 0 9.755844 -49.52603 0 12.79196 -42.37277 0 6.880371 -60.22751 0 0.9960938 -56.20569 0 0.5065308 -67.46146 0 3.900208 -66.32813 0 10.21733 -69.34747 0 2.751831 -71.98288 0 8.021896 -41.38367 0 -19.0934 -50.27264 0 -14.09995 -18.45297 0 -7.928711 -17.92804 0 -19.84581 -22.99084 0 -26.87408 -32.18729 0 -23.41359 -3.012726 0 -8.718079 -12.39105 0 -20.83841 -5.460205 0 -30.79391 -13.7944 0 -29.33 35.91898 0 20.70351 37.60394 0 7.537735 34.28946 0 1.189636 26.32254 0 1.149124 16.85028 0 0.504364 9.776794 0 0.2272949 36.60645 0 31.48952 39.87634 0 31.42587 44.41754 0 28.63789 49.89532 0 22.05588 47.85062 0 19.01123 39.54733 0 25.14427 44.47449 0 31.17053 50.97565 0 30.51337 54.21735 0 27.4213 54.04279 0 21.62643 64.74945 0 -2.982803 58.23953 0 -8.661209 57.09619 0 29.16217 62.02417 0 26.80571 72.48785 0 14.97736 73.00912 0 11.96927 71.09949 0 10.95267 67.44501 0 12.6902 71.98285 0 8.021896 69.34747 0 2.751831</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape7-positions-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape7-normals" name="qt_gauge_background_Shape7-normals">
+ <float_array id="qt_gauge_background_Shape7-normals-array" count="1959">0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape7-normals-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape7-tangents" name="qt_gauge_background_Shape7-tangents">
+ <float_array id="qt_gauge_background_Shape7-tangents-array" count="1959">0 0 -1 0.09330218 0 0.9956378 -0.04982272 0 -0.9987581 -0.9823546 0 0.1870281 0.0594684 0 -0.9982302 0.9536138 0 0.3010329 0 0 -1 -0.1599342 0 0.9871277 0.4091312 0 0.9124756 0 0 -1 0.5433952 0 0.839477 0.2624623 0 -0.9649423 0.7456331 0 0.6663568 0.9992574 0 0.03853002 0.68342 0 -0.7300254 -0.9337539 0 0.3579158 0.8761987 0 -0.48195 0.957007 0 0.290065 -0.4021465 0 0.9155753 0.1700989 0 -0.985427 0.2313256 0 0.9728764 0 0 -1 -0.2545884 0 0.9670495 -0.8845181 0 0.4665058 0 0 -1 -0.4408641 0 0.8975739 0 0 -1 -0.307116 0 0.9516721 0.9865777 0 -0.1632926 0.9638381 0 -0.2664884 -0.1728906 0 -0.984941 -0.5847743 0 0.8111961 -0.967127 0 -0.2542937 -0.8155217 0 0.5787265 -0.597961 0 -0.8015252 -0.03110887 0 -0.999516 -0.639055 0 0.769161 -0.8157852 0 -0.578355 -0.826381 0 -0.5631114 0 0 -1 -0.9044507 0 0.4265781 0.9963224 0 -0.08568415 -0.2257149 0 0.9741934 -0.8932096 0 -0.4496405 -0.3772429 0 0.9261143 0.9996743 0 -0.02551969 -0.8410749 0 -0.5409186 -0.9992059 0 -0.03984543 -0.08587392 0 0.996306 0.7589428 0 -0.6511573 -0.5066457 0 0.8621543 0.999166 0 -0.040832 -0.6715059 0 -0.7409992 0.9999232 0 0.01239376 -0.1660616 0 -0.9861154 -0.8507079 0 0.5256386 0.1955137 0 0.980701 0.6448501 0 -0.7643091 -0.8060893 0 0.5917939 0.1488313 0 0.9888626 0.9886557 0 -0.1501995 -0.9567212 0 -0.291006 0 0 -1 0.9808103 0 0.1949643 0 0 -1 0.1178563 0 -0.9930307 0.9996302 0 -0.02719441 -0.6062632 0 -0.795264 -0.1641528 0 -0.9864349 0.9934536 0 -0.114236 0.8721302 0 0.4892739 0.4729271 0 0.8811016 -0.9957519 0 -0.09207683 0.3311459 0 0.9435796 -0.7970216 0 0.6039508 0.1546646 0 0.987967 -0.9927369 0 -0.1203054 0.03411923 0 0.9994178 -0.04369211 0 0.999045 -0.009416785 0 -0.9999557 -0.74473 0 -0.6673659 0.5193138 0 0.8545836 -0.08214566 0 -0.9966203 -0.9998425 0 0.01774815 -0.6843922 0 0.729114 -0.3723825 0 -0.9280793 -0.9538498 0 -0.3002841 0.4270019 0 0.9042507 -0.9174218 0 0.3979161 -0.7405139 0 -0.6720411 -0.1619003 0 0.9868071 0.9995788 0 0.02901953 -0.02192386 0 0.9997596 0.996631 0 -0.08201656 -0.8123588 0 -0.583158 0.787974 0 -0.6157085 0.03011157 0 -0.9995465 -0.6827532 0 0.7306491 0.4900307 0 -0.8717052 -1 0 -1.65449e-4 0.7091441 0 0.7050636 0.6312614 0 0.7755701 0.2484036 0 -0.9686566 -0.8855574 0 -0.46453 0.7848826 0 -0.6196445 -0.9993514 0 0.0360121 0.4089061 0 0.9125764 0.9993972 0 -0.03471558 -0.480071 0 0.8772297 0.9851974 0 0.1714235 0.1564449 0 -0.9876867 -0.8490252 0 0.5283524 0.9986121 0 -0.05266758 0.05403561 0 -0.998539 -0.6691289 0 0.7431463 0.9982873 0 -0.05850165 0 0 -1 -0.8436583 0 0.5368805 0.9999338 0 0.0115072 -0.11742 0 -0.9930823 -0.7734814 0 0.633819 -0.9962472 0 -0.08655344 -0.06270028 0 0.9980324 0.9865835 0 -0.1632577 0 0 -1 -0.9000638 0 0.4357582 0.9975122 0 0.0704938 -0.8351228 0 0.5500635 0.9774508 0 0.2111633 0.220919 0 -0.9752922 -0.8960133 0 -0.4440273 0.9809867 0 0.1940748 -0.8390955 0 -0.5439842 0.1760181 0 -0.9843869 0.7238966 0 -0.6899085 0.1902233 0 -0.9817409 0.5491822 0 -0.8357026 0.4074799 0 -0.9132142 -0.808942 0 0.5878885 -0.9691776 0 0.246363 -0.9749342 0 0.2224935 0.9718555 0 0.2355777 0.9479629 0 0.3183808 -0.4044963 0 0.9145396 0.8856054 0 0.4644385 0.3742315 0 -0.9273353 -0.2422098 0 0.9702239 0.4904149 0 -0.8714891 0.9925043 0 -0.1222101 -0.9986165 0 -0.05258414 0.9592485 0 -0.2825638 -0.8877652 0 0.4602967 0.9634217 0 0.2679899 -0.2229016 0 0.9748409 0.9762504 0 0.2166454 -0.9693936 0 -0.2455118 -0.8726846 0 0.4882844 0.4660192 0 0.8847746 -0.345422 0 0.9384475 -0.2421429 0 0.9702406 -0.3417059 0 0.9398069 -0.4422337 0 0.8968998 0.565771 0 -0.8245624 0.9170991 0 -0.3986594 -0.575411 0 0.8178644 -0.7445008 0 0.6676216 -0.9900344 0 -0.140826 -0.9846818 0 -0.174361 -0.7312259 0 -0.6821353 0.5260339 0 -0.8504636 0.8186751 0 0.574257 -0.9639664 0 -0.2660241 -0.837491 0 0.5464511 0.06280167 0 -0.998026 -0.4008538 0 0.9161421 -0.7995592 0 -0.6005873 0.8394986 0 0.5433618 0.6149995 0 0.7885275 0.3152087 0 -0.9490224 -0.9918691 0 -0.1272619 0.2294897 0 -0.9733111 -0.9974531 0 0.07132535 0.7518352 0 0.659351 -0.8637388 0 0.5039397 0.1663274 0 0.9860706 0.6765289 0 -0.7364161 -0.5668296 0 0.823835 0.9964769 0 0.08386786 -0.5540602 0 -0.8324766 -0.6032482 0 -0.7975535 -0.6073903 0 0.7944036 0.8995517 0 0.4368144 -0.7634335 0 0.6458864 0.9978153 0 0.06606565 -0.2964957 0 -0.9550342 -0.999962 0 -0.008721144 0.08273538 0 0.9965716 0.5828861 0 -0.8125539 -0.9782066 0 -0.2076338 -0.2695117 0 0.9629971 0.9101824 0 -0.4142077 -0.986156 0 -0.1658201 0.03627028 0 0.999342 0.74703 0 -0.6647903 -0.9996596 0 -0.02609146 -0.05902674 0 0.9982564 0.8763933 0 -0.4815962 -0.9953838 0 -0.09597462 0.02537886 0 0.9996779 0.8170088 0 -0.5766252 0.9824379 0 0.18659 0.09012962 0 -0.99593 -0.9881532 0 0.1534706 -0.196777 0 0.9804483 0.9153119 0 -0.4027458 -0.9937385 0 -0.1117312 0.1174616 0 0.9930774 0.9216362 0 -0.3880551 -0.9999176 0 0.01283674 0.5067766 0 -0.8620774 -0.9978635 0 -0.06533393 0.8510189 0 0.5251351 0.4529507 0 -0.8915356 -0.9987226 0 -0.05052942 0.7959056 0 0.6054207 0.9839302 0 0.1785534 0.1030909 0 -0.9946719 -0.8231216 0 0.5678652 0.5111617 0 -0.8594846 -0.9977936 0 -0.06639269 0.5969885 0 0.8022498 -0.982644 0 -0.1855015 0.06123967 0 0.9981231 0.8375771 0 -0.5463191 0.9956953 0 0.09268693 -0.1786191 0 -0.9839183 -0.7364173 0 0.6765275 -0.9851755 0 -0.1715495 0.01093361 0 0.9999402 0.8328214 0 -0.5535418 0.2124369 0 -0.9771748 -0.9769253 0 0.2135813 0.9252504 0 0.379357 -0.02145183 0 0.9997699 0.9995584 0 -0.0297163 -0.9601158 0 -0.2796026 -0.7668256 0 -0.6418555 -0.3060361 0 0.9520199 0.9789448 0 0.2041251 -0.1462844 0 0.9892426 0.7623627 0 -0.6471499 -0.9879291 0 -0.1549069 0.3190186 0 -0.9477485 -0.9974841 0 0.07089037 0.5370771 0 0.8435331 0.9955551 0 -0.09418096 -0.4916437 0 -0.8707965 -0.6172062 0 0.7868014 0.3249507 0 -0.9457309 -0.9955603 0 0.0941259 0.6144708 0 0.7889395 0.06965407 0 0.9975712 0.9992749 0 -0.03807507 -0.6937128 0 -0.7202517 0.9608601 0 0.2770342 0.4753281 0 -0.8798086 -0.9996379 0 0.02690735 0.983403 0 -0.1814344 -0.8630902 0 -0.5050498 -0.5452316 0 0.8382855 0.9915995 0 0.1293465 -0.1090329 0 -0.9940381 -0.9089995 0 0.4167972 0.9915772 0 0.1295173 -0.2932846 0 -0.9560252 -0.6217015 0 0.7832543 0.9977546 0 0.06697649 -0.2136859 0 -0.9769024 -0.8431025 0 0.5377528 0.990431 0 0.1380088 -0.1170294 0 -0.9931284 -0.7935153 0 0.6085503 -0.99466 0 -0.103206 -0.1614697 0 0.9868777 0.8657747 0 -0.500434 -0.2227211 0 -0.9748822 -0.8101333 0 0.5862457 0.9944315 0 -0.1053849 0.9844674 0 0.1755674 0.02512844 0 -0.9996842 -0.9307625 0 0.3656245 0.9955303 0 0.09444239 0.2299569 0 -0.9732008 -0.939956 0 0.3412956 -0.2635623 0 0.9646424 0.998139 0 -0.06098018 -0.8565251 0 -0.5161054 -0.2543098 0 0.9671228 0.9945896 0 -0.1038824 -0.7207133 0 -0.6932332 -0.6441348 0 0.764912 0.7559524 0 0.6546266 -0.4826236 0 -0.8758279 -0.707874 0 -0.7063387 0.0819153 0 0.9966393 0.9952162 0 0.09769718 0.7651468 0 -0.6438559 -0.9806817 0 -0.1956104 0.5017846 0 0.8649926 -0.2126286 0 0.9771331 0.9890989 0 -0.1472528 -0.4642402 0 -0.8857093 0.1152036 0 0.9933419 0.7556872 0 -0.6549327 -0.836051 0 0.5486517 -0.9984939 0 -0.05486288 0.3585182 0 0.9335228 0.7099683 0 -0.7042336 0.9999772 0 -0.006748235 -0.1542514 0 -0.9880316 -0.8448463 0 0.535009 -0.5490685 0 0.8357774 0.9427607 0 0.3334701 -0.398678 0 -0.917091 0.926631 0 -0.375972 -0.9735697 0 -0.2283903 0.2587506 0 0.9659442 -0.8158531 0 0.5782593 0.8680257 0 0.4965193 0.1789806 0 0.9838526 0.9979348 0 0.06423548 -0.1352493 0 -0.9908116 0.8379804 0 -0.5457004 0.1079106 0 -0.9941606 -0.7024622 0 0.7117211 -0.9869724 0 0.16089 -0.9260945 0 -0.3772916 -0.1351536 0 0.9908247 -0.8837457 0 0.4679674 0.9322861 0 0.3617218 -0.9270112 0 -0.3750338 -0.4408105 0 -0.8976002 -0.8158415 0 -0.5782756 -0.04658569 0 0.9989143 -0.8721899 0 0.4891674 0.2371038 0 -0.9714843 -0.8228446 0 0.5682665 -0.8987702 0 -0.43842 0.7593534 0 -0.6506784 -0.9986872 0 0.05122409 -0.7605149 0 -0.6493205 0.03936728 0 -0.9992248 -0.993666 0 0.1123736 -0.6872239 0 -0.7264456 0.4519589 0 -0.8920387 -0.9524975 0 0.3045463 -0.8925501 0 -0.4509482 0.3378941 0 -0.9411841 -0.9420145 0 0.3355721 -0.858142 0 -0.5134124 -0.4970357 0 0.8677301 0.9974781 0 -0.07097547 0.8353701 0 0.5496879 -0.9655459 0 0.260233 0.8623983 0 0.5062303 -0.6902422 0 0.7235784 -0.9737829 0 0.2274794 0.9288307 0 0.3705045 -0.5960903 0 0.8029174 0.9705516 0 0.2408932 -0.1091865 0 -0.9940213 0.9615601 0 -0.2745946 0.938969 0 0.3440017 -0.55721 0 -0.8303716 0.8668366 0 -0.4985924 -0.474365 0 0.8803283 0.9965538 0 -0.082949 0.7385819 0 0.6741638 0.8776043 0 0.4793858 -0.2905997 0 -0.9568447 0.8015535 0 -0.597923 0.1166676 0 -0.993171 -0.9409484 0 0.3385501 -0.6394537 0 -0.7688296 -0.08171035 0 0.9966561 0.9314974 0 -0.3637481 0.8626666 0 0.505773 0.4802649 0 -0.8771235 -0.9421092 0 0.3353063 -0.7860902 0 -0.6181118 0.9619272 0 -0.2733058 -0.2174049 0 -0.9760815 0.823899 0 -0.5667367 -0.9974827 0 -0.07091087 0.41465 0 0.909981 -0.8300242 0 0.5577274 0.9006415 0 -0.4345628 -0.9153168 0 -0.4027346 -0.4656354 0 -0.8849767 -0.8932678 0 0.449525 0.1696288 0 0.985508 -0.4827505 0 0.8757579 0.9938167 0 0.1110329 -0.06324722 0 -0.9979979 0.7927038 0 -0.609607 -0.3477752 0 0.9375779 0.8653106 0 -0.5012361 0.9556295 0 0.2945714 0.9974231 0 0.07174389 -0.0886296 0 -0.9960647 0.810027 0 -0.5863926 -0.9991554 0 -0.04109123 0.1298721 0 0.9915308 -0.5408651 0 0.8411093 -0.795434 0 0.6060402 0.9641335 0 0.2654179 0.7324957 0 0.6807716 0.6708566 0 0.7415871 0.8588171 0 -0.5122823 0.9978959 0 0.0648371 -0.132378 0 0.9911993 0.9983625 0 -0.05720398 0.8321153 0 0.5546027 -0.2916919 0 0.9565123 0.8776052 0 -0.479384 0.8139865 0 0.5808837 -0.1200108 0 0.9927726 0.9388041 0 -0.3444516 0.889323 0 0.4572795 -0.4650261 0 0.885297 0.9354643 0 -0.3534211 0.8381786 0 0.5453959 0.502936 0 -0.8643236 -0.997907 0 0.06466529 -0.7816856 0 -0.6236727 0.906413 0 -0.4223925 -0.9007827 0 -0.43427 0.3870462 0 -0.9220603 -0.4623278 0 0.8867091 0.9991325 0 -0.04164346 0.8181139 0 0.5750563 -0.7124827 0 0.7016897 0.9992282 0 -0.03928218 0.8551849 0 0.5183231 -0.999207 0 -0.03981555 0.5930637 0 0.8051556 -0.8644016 0 0.502802 -0.9990566 0 -0.04342786 0.3537338 0 0.9353461 -0.795322 0 0.6061872 -0.7024622 0 -0.7117211 0.09886503 0 0.9951009 -0.9881268 0 -0.1536407 0.1569394 0 -0.9876082 -0.8932688 0 -0.4495228 -0.4788145 0 -0.8779161 0.8435509 0 0.5370493 0.3317029 0 -0.9433839 0.973814 0 -0.2273462 -0.9962579 0 -0.08643019 0.02786235 0 0.9996118 -0.704141 0 0.7100602 -0.922947 0 0.3849272 0.932272 0 -0.3617582 -0.4643148 0 0.8856702 -0.1424467 0 -0.9898025 -0.9260862 0 0.3773121 -0.8853894 0 -0.4648501 -0.1645812 0 0.9863635 0.9387713 0 -0.3445409 0.9246942 0 0.3807107 -0.8171734 0 -0.576392 0.2371038 0 0.9714843 -0.8937428 0 0.4485797 0.8588319 0 0.5122575 0.6831729 0 -0.7302567 0.9984873 0 -0.05498213 -0.68342 0 -0.7300254 -0.7848826 0 -0.6196445 0.006072376 0 0.9999816 -0.4105242 0 0.9118497 0.9979951 0 0.06329083 0.9999608 0 0.008855432 0.0202384 0 0.9997952 -0.1308284 0 0.991405 0.9851438 0 -0.1717315 1 0 3.06796e-4 -0.8372896 0 -0.5467597 -0.8153145 0 -0.5790184 0.8114668 0 -0.5843985 0.7451908 0 -0.6668513 0.04982272 0 -0.9987581 0.009416785 0 -0.9999557 -0.7606901 0 0.6491152 -0.5419555 0 0.8404072 0.597961 0 -0.8015252 0.3723911 0 -0.9280759 -0.9999938 0 -0.003521936 -0.9999873 0 0.005040197 0.6941017 0 0.7198769 0.6718807 0 0.7406594 0.5847773 0 0.8111938 0.6843903 0 0.7291159 0.2506724 0 -0.968072 0.3585394 0 -0.9335146 -0.9672465 0 -0.2538391 -0.7944531 0 -0.6073256 0.826381 0 -0.5631114 0.7405139 0 -0.6720411 -0.9999999 0 -3.52936e-4 -0.9932433 0 0.1160509 0.6641314 0 0.7476159 0.1530296 0 0.9882216 0.9823546 0 0.1870281 0.9538554 0 -0.3002663 -0.4635438 0 0.886074 -0.4453068 0 0.895378 0.96824 0 0.2500225 0.9816415 0 0.1907352 0.2246319 0 -0.9744437 0.1482298 0 -0.9889529 -0.8313652 0 0.5557264 -0.8918404 0 0.4523501 0.9950292 0 -0.0995838 0.9996098 0 0.02793142 0.01637385 0 -0.9998659 0.08243818 0 -0.9965962 -0.7826088 0 0.6225139 -0.5345412 0 0.8451424 0.9973433 0 -0.07284515 0.9935912 0 -0.1130333 0 0 -1 0 0 -1 -0.8732669 0 0.4872422 -0.8274974 0 0.5614695 1 0 0 0.9993633 0 0.03567795 -0.07962286 0 -0.9968251 -0.2621986 0 -0.9650139 -0.7927021 0 0.6096092 -0.7385263 0 0.6742247 -0.9924587 0 -0.1225796 -0.9994276 0 -0.03383085 -0.1332115 0 0.9910876 0.02760687 0 0.9996189 0.990102 0 -0.1403496 0.9805398 0 -0.1963206 0 0 -1 0 0 -1 -0.9324568 0 0.3612815 -0.9040271 0 0.427475 0.9876634 0 0.1565916 0.9997173 0 0.02377839 0 0 -1 0 0 -1 -0.8985599 0 0.4388509 -0.90656 0 0.422077 0.9926059 0 -0.1213817 0.9994355 0 -0.03359468 -0.2644106 0 0.9644102 -0.1908912 0 0.9816112 -0.8767047 0 -0.481029 -0.8807291 0 -0.4736203 -0.4091287 0 0.9124767 -0.3438548 0 0.9390228 0.9999997 0 -8.01946e-4 0.9970948 0 -0.07617009 -0.9055408 0 -0.4242592 -0.7649605 0 -0.6440773 -0.9992616 0 -0.03842208 -0.9893096 0 -0.1458302 -0.2084725 0 0.9780282 -0.008117043 0 0.9999671 0.8319326 0 -0.5548767 0.6902707 0 -0.7235512 -0.5433952 0 0.839477 -0.4729294 0 0.8811003 1 0 0 0.991478 0 -0.1302744 -0.8054062 0 -0.5927233 -0.531056 0 -0.8473367 0.9950285 0 0.0995903 0.9886801 0 -0.1500388 -0.272334 0 -0.9622028 -0.1002888 0 -0.9949584 -0.9222453 0 0.3866052 -0.7812608 0 0.6242047 0.281983 0 0.9594194 0.2265829 0 0.9739919 0.5630046 0 -0.8264538 0.6474355 0 -0.7621202 -0.7519022 0 0.6592747 -0.809293 0 0.5874052 0.2506724 0 0.968072 0.003229244 0 0.9999948 0.9683714 0 -0.249513 0.9942932 0 -0.1066824 -0.9168214 0 -0.3992975 -0.9914988 0 -0.1301162 0 0 -1 0 0 -1 0.9795057 0 0.2014163 0.9866488 0 0.1628626 0 0 -1 0 0 -1 0.1728861 0 -0.9849418 0.08214566 0 -0.9966203 0.9993251 0 -0.03673453 0.9996124 0 0.02784098 -0.5697573 0 -0.821813 -0.664796 0 -0.747025 -0.3240609 0 -0.9460362 -0.0788733 0 -0.9968846 0.9993422 0 0.03626631 0.9713163 0 -0.237791 0.8155244 0 0.5787228 0.9174209 0 0.3979182 0.4408593 0 0.8975762 0.5066457 0 0.8621543 -0.9822489 0 -0.1875822 -0.9999999 0 3.78102e-4 0.284115 0 0.9587902 0.3726911 0 0.9279555 -0.795561 0 0.6058734 -0.7846036 0 0.6199977 0.1240302 0 0.9922784 0.1893847 0 0.981903 -0.9901871 0 -0.1397481 -0.990903 0 -0.1345777 0.07496874 0 0.9971859 -0.04225307 0 0.9991069 -0.05245032 0 0.9986235 -0.03504706 0 0.9993857 0 0 -1 -0.03011157 0 -0.9995465 -0.7163003 0 -0.6977921 -0.7888826 0 -0.6145439 0.3437535 0 0.9390599 0.6582536 0 0.7527962 -0.0594684 0 -0.9982302 -0.1178563 0 -0.9930307 -0.9999938 0 0.003521957 -0.999161 0 0.04095392 -0.7456352 0 0.6663543 -0.6312668 0 0.7755657 -0.2624575 0 -0.9649436 -0.4900398 0 -0.8717 -0.8761987 0 -0.48195 -0.9993979 0 -0.03469553 0.4242307 0 0.9055541 0.4314642 0 0.90213 -0.9536099 0 0.301045 -0.8721332 0 0.4892686</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape7-tangents-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape7-binormals" name="qt_gauge_background_Shape7-binormals">
+ <float_array id="qt_gauge_background_Shape7-binormals-array" count="1959">-1 0 0 0.9956379 0 -0.09330218 -0.9987581 0 0.04982272 0.1870281 0 0.9823546 -0.9982303 0 -0.05946841 0.3010329 0 -0.9536138 -1 0 0 0.9871277 0 0.1599342 0.9124756 0 -0.4091312 -1 0 0 0.8394771 0 -0.5433952 -0.9649423 0 -0.2624623 0.6663568 0 -0.7456331 0.03853002 0 -0.9992575 -0.7300255 0 -0.6834201 0.3579158 0 0.9337539 -0.48195 0 -0.8761988 0.290065 0 -0.9570071 0.9155754 0 0.4021466 -0.985427 0 -0.1700989 0.9728764 0 -0.2313256 -1 0 0 0.9670495 0 0.2545884 0.4665059 0 0.8845183 -1 0 0 0.8975739 0 0.4408641 -1 0 0 0.9516721 0 0.307116 -0.1632926 0 -0.9865777 -0.2664884 0 -0.9638382 -0.9849411 0 0.1728906 0.8111961 0 0.5847743 -0.2542937 0 0.9671271 0.5787265 0 0.8155218 -0.8015253 0 0.5979611 -0.999516 0 0.03110887 0.7691611 0 0.6390551 -0.578355 0 0.8157852 -0.5631114 0 0.826381 -1 0 0 0.4265781 0 0.9044508 -0.08568415 0 -0.9963223 0.9741935 0 0.2257149 -0.4496405 0 0.8932096 0.9261144 0 0.377243 -0.02551969 0 -0.9996743 -0.5409186 0 0.841075 -0.03984543 0 0.9992059 0.996306 0 0.08587392 -0.6511573 0 -0.7589428 0.8621544 0 0.5066457 -0.040832 0 -0.9991661 -0.7409992 0 0.6715059 0.01239376 0 -0.9999232 -0.9861154 0 0.1660616 0.5256386 0 0.850708 0.980701 0 -0.1955137 -0.7643091 0 -0.6448501 0.591794 0 0.8060893 0.9888626 0 -0.1488313 -0.1501995 0 -0.9886557 -0.291006 0 0.9567212 -1 0 0 0.1949643 0 -0.9808104 -1 0 0 -0.9930307 0 -0.1178563 -0.02719442 0 -0.9996303 -0.7952641 0 0.6062632 -0.9864349 0 0.1641528 -0.114236 0 -0.9934537 0.489274 0 -0.8721302 0.8811017 0 -0.4729272 -0.09207683 0 0.9957519 0.9435797 0 -0.3311459 0.6039508 0 0.7970216 0.9879671 0 -0.1546646 -0.1203054 0 0.992737 0.9994178 0 -0.03411923 0.9990451 0 0.04369212 -0.9999557 0 0.009416785 -0.6673659 0 0.7447299 0.8545837 0 -0.5193138 -0.9966204 0 0.08214566 0.01774815 0 0.9998426 0.7291141 0 0.6843922 -0.9280793 0 0.3723826 -0.3002841 0 0.9538499 0.9042507 0 -0.4270019 0.3979161 0 0.9174218 -0.6720411 0 0.7405139 0.9868071 0 0.1619003 0.02901953 0 -0.9995789 0.9997597 0 0.02192386 -0.08201656 0 -0.996631 -0.583158 0 0.8123588 -0.6157085 0 -0.787974 -0.9995466 0 -0.03011158 0.7306491 0 0.6827532 -0.8717052 0 -0.4900307 -1.65449e-4 0 1 0.7050636 0 -0.7091441 0.7755702 0 -0.6312615 -0.9686566 0 -0.2484036 -0.4645301 0 0.8855575 -0.6196445 0 -0.7848827 0.0360121 0 0.9993514 0.9125764 0 -0.4089061 -0.03471558 0 -0.9993973 0.8772298 0 0.480071 0.1714235 0 -0.9851974 -0.9876867 0 -0.1564449 0.5283524 0 0.8490252 -0.05266758 0 -0.9986121 -0.998539 0 -0.05403561 0.7431464 0 0.6691289 -0.05850165 0 -0.9982874 -1 0 0 0.5368806 0 0.8436583 0.0115072 0 -0.9999338 -0.9930824 0 0.11742 0.6338189 0 0.7734814 -0.08655345 0 0.9962472 0.9980324 0 0.06270028 -0.1632577 0 -0.9865835 -1 0 0 0.4357582 0 0.9000638 0.0704938 0 -0.9975122 0.5500635 0 0.8351229 0.2111633 0 -0.9774508 -0.9752921 0 -0.220919 -0.4440273 0 0.8960133 0.1940748 0 -0.9809868 -0.5439842 0 0.8390955 -0.9843869 0 -0.1760181 -0.6899085 0 -0.7238966 -0.981741 0 -0.1902233 -0.8357026 0 -0.5491822 -0.9132143 0 -0.40748 0.5878885 0 0.808942 0.246363 0 0.9691777 0.2224935 0 0.9749342 0.2355777 0 -0.9718555 0.3183808 0 -0.947963 0.9145397 0 0.4044964 0.4644386 0 -0.8856054 -0.9273353 0 -0.3742315 0.970224 0 0.2422098 -0.8714891 0 -0.4904149 -0.1222101 0 -0.9925042 -0.05258414 0 0.9986166 -0.2825638 0 -0.9592485 0.4602967 0 0.8877652 0.2679899 0 -0.9634218 0.9748409 0 0.2229016 0.2166454 0 -0.9762504 -0.2455118 0 0.9693936 0.4882844 0 0.8726847 0.8847746 0 -0.4660192 0.9384475 0 0.345422 0.9702407 0 0.2421429 0.939807 0 0.3417059 0.8968998 0 0.4422337 -0.8245624 0 -0.565771 -0.3986593 0 -0.9170991 0.8178645 0 0.575411 0.6676216 0 0.7445009 -0.140826 0 0.9900345 -0.174361 0 0.9846818 -0.6821353 0 0.731226 -0.8504636 0 -0.5260339 0.574257 0 -0.8186751 -0.2660241 0 0.9639665 0.5464511 0 0.837491 -0.9980261 0 -0.06280167 0.916142 0 0.4008538 -0.6005872 0 0.7995593 0.5433618 0 -0.8394986 0.7885275 0 -0.6149995 -0.9490224 0 -0.3152087 -0.1272619 0 0.9918692 -0.9733112 0 -0.2294898 0.07132535 0 0.9974532 0.6593511 0 -0.7518352 0.5039397 0 0.8637388 0.9860706 0 -0.1663274 -0.7364161 0 -0.6765289 0.8238351 0 0.5668296 0.08386786 0 -0.9964769 -0.8324766 0 0.5540602 -0.7975535 0 0.6032482 0.7944037 0 0.6073903 0.4368144 0 -0.8995517 0.6458864 0 0.7634336 0.06606565 0 -0.9978153 -0.9550342 0 0.2964957 -0.008721144 0 0.999962 0.9965717 0 -0.08273539 -0.8125539 0 -0.5828861 -0.2076338 0 0.9782066 0.9629972 0 0.2695117 -0.4142078 0 -0.9101824 -0.1658201 0 0.986156 0.999342 0 -0.03627028 -0.6647903 0 -0.74703 -0.02609146 0 0.9996597 0.9982565 0 0.05902674 -0.4815961 0 -0.8763933 -0.09597462 0 0.9953839 0.9996779 0 -0.02537885 -0.5766252 0 -0.8170089 0.18659 0 -0.9824378 -0.9959301 0 -0.09012962 0.1534706 0 0.9881532 0.9804484 0 0.196777 -0.4027458 0 -0.9153119 -0.1117312 0 0.9937385 0.9930775 0 -0.1174616 -0.3880551 0 -0.9216362 0.01283673 0 0.9999176 -0.8620775 0 -0.5067766 -0.06533393 0 0.9978635 0.5251351 0 -0.8510189 -0.8915356 0 -0.4529507 -0.05052943 0 0.9987227 0.6054207 0 -0.7959056 0.1785534 0 -0.9839302 -0.9946719 0 -0.1030909 0.5678652 0 0.8231217 -0.8594846 0 -0.5111617 -0.06639269 0 0.9977936 0.8022498 0 -0.5969885 -0.1855015 0 0.982644 0.9981232 0 -0.06123968 -0.5463191 0 -0.8375772 0.09268694 0 -0.9956954 -0.9839183 0 0.1786191 0.6765275 0 0.7364174 -0.1715495 0 0.9851756 0.9999402 0 -0.01093361 -0.5535418 0 -0.8328214 -0.9771748 0 -0.2124369 0.2135813 0 0.9769253 0.379357 0 -0.9252505 0.9997699 0 0.02145183 -0.0297163 0 -0.9995584 -0.2796026 0 0.9601158 -0.6418555 0 0.7668256 0.95202 0 0.3060361 0.2041251 0 -0.9789448 0.9892426 0 0.1462844 -0.6471499 0 -0.7623628 -0.1549069 0 0.9879292 -0.9477485 0 -0.3190186 0.07089037 0 0.9974842 0.8435332 0 -0.5370771 -0.09418096 0 -0.9955551 -0.8707966 0 0.4916438 0.7868015 0 0.6172062 -0.9457309 0 -0.3249508 0.0941259 0 0.9955603 0.7889395 0 -0.6144708 0.9975712 0 -0.06965407 -0.03807507 0 -0.9992749 -0.7202517 0 0.6937128 0.2770342 0 -0.9608601 -0.8798087 0 -0.4753281 0.02690735 0 0.999638 -0.1814345 0 -0.9834031 -0.5050498 0 0.8630902 0.8382855 0 0.5452316 0.1293465 0 -0.9915994 -0.9940382 0 0.1090329 0.4167972 0 0.9089995 0.1295173 0 -0.9915772 -0.9560252 0 0.2932846 0.7832543 0 0.6217015 0.0669765 0 -0.9977546 -0.9769024 0 0.2136859 0.5377528 0 0.8431026 0.1380088 0 -0.9904311 -0.9931285 0 0.1170294 0.6085503 0 0.7935153 -0.103206 0 0.9946601 0.9868777 0 0.1614697 -0.500434 0 -0.8657747 -0.9748822 0 0.2227211 0.5862457 0 0.8101333 -0.1053849 0 -0.9944316 0.1755674 0 -0.9844675 -0.9996842 0 -0.02512844 0.3656245 0 0.9307625 0.0944424 0 -0.9955304 -0.9732009 0 -0.229957 0.3412956 0 0.9399561 0.9646425 0 0.2635623 -0.06098019 0 -0.9981391 -0.5161054 0 0.8565251 0.9671228 0 0.2543098 -0.1038825 0 -0.9945897 -0.6932333 0 0.7207133 0.764912 0 0.6441348 0.6546265 0 -0.7559524 -0.8758279 0 0.4826237 -0.7063388 0 0.7078741 0.9966393 0 -0.0819153 0.09769718 0 -0.9952162 -0.6438559 0 -0.7651468 -0.1956104 0 0.9806817 0.8649926 0 -0.5017846 0.9771331 0 0.2126286 -0.1472528 0 -0.989099 -0.8857093 0 0.4642402 0.9933419 0 -0.1152036 -0.6549327 0 -0.7556872 0.5486518 0 0.836051 -0.05486288 0 0.9984939 0.9335228 0 -0.3585182 -0.7042336 0 -0.7099683 -0.006748235 0 -0.9999773 -0.9880316 0 0.1542514 0.535009 0 0.8448464 0.8357773 0 0.5490685 0.3334701 0 -0.9427608 -0.917091 0 0.3986781 -0.375972 0 -0.9266311 -0.2283903 0 0.9735698 0.9659442 0 -0.2587506 0.5782593 0 0.8158532 0.4965193 0 -0.8680257 0.9838526 0 -0.1789806 0.06423548 0 -0.9979348 -0.9908117 0 0.1352493 -0.5457004 0 -0.8379804 -0.9941607 0 -0.1079106 0.7117211 0 0.7024622 0.16089 0 0.9869725 -0.3772916 0 0.9260945 0.9908247 0 0.1351536 0.4679675 0 0.8837458 0.3617218 0 -0.9322862 -0.3750338 0 0.9270112 -0.8976003 0 0.4408106 -0.5782756 0 0.8158416 0.9989143 0 0.04658569 0.4891675 0 0.87219 -0.9714844 0 -0.2371038 0.5682665 0 0.8228446 -0.43842 0 0.8987702 -0.6506784 0 -0.7593534 0.05122409 0 0.9986872 -0.6493205 0 0.7605149 -0.9992249 0 -0.03936728 0.1123736 0 0.9936661 -0.7264456 0 0.6872239 -0.8920388 0 -0.4519589 0.3045464 0 0.9524975 -0.4509482 0 0.8925502 -0.9411842 0 -0.3378941 0.3355721 0 0.9420145 -0.5134124 0 0.8581421 0.8677301 0 0.4970357 -0.07097548 0 -0.9974781 0.5496879 0 -0.8353701 0.260233 0 0.9655458 0.5062303 0 -0.8623984 0.7235785 0 0.6902422 0.2274794 0 0.9737829 0.3705045 0 -0.9288307 0.8029175 0 0.5960904 0.2408932 0 -0.9705517 -0.9940214 0 0.1091865 -0.2745946 0 -0.9615601 0.3440017 0 -0.9389691 -0.8303716 0 0.55721 -0.4985924 0 -0.8668367 0.8803283 0 0.474365 -0.08294902 0 -0.9965539 0.6741638 0 -0.7385819 0.4793858 0 -0.8776042 -0.9568447 0 0.2905997 -0.597923 0 -0.8015535 -0.9931711 0 -0.1166677 0.3385501 0 0.9409484 -0.7688296 0 0.6394538 0.9966561 0 0.08171035 -0.3637481 0 -0.9314975 0.5057729 0 -0.8626667 -0.8771236 0 -0.480265 0.3353063 0 0.9421092 -0.6181118 0 0.7860903 -0.2733058 0 -0.9619273 -0.9760816 0 0.2174049 -0.5667367 0 -0.8238991 -0.07091087 0 0.9974827 0.909981 0 -0.41465 0.5577274 0 0.8300242 -0.4345628 0 -0.9006416 -0.4027346 0 0.9153169 -0.8849767 0 0.4656354 0.449525 0 0.8932678 0.985508 0 -0.1696288 0.8757579 0 0.4827505 0.1110329 0 -0.9938168 -0.997998 0 0.06324723 -0.609607 0 -0.7927038 0.937578 0 0.3477752 -0.5012361 0 -0.8653105 0.2945714 0 -0.9556295 0.07174388 0 -0.9974232 -0.9960647 0 0.0886296 -0.5863926 0 -0.8100271 -0.04109123 0 0.9991555 0.9915308 0 -0.1298721 0.8411094 0 0.5408652 0.6060402 0 0.795434 0.2654179 0 -0.9641336 0.6807716 0 -0.7324957 0.7415871 0 -0.6708566 -0.5122823 0 -0.8588172 0.06483711 0 -0.997896 0.9911994 0 0.132378 -0.05720398 0 -0.9983626 0.5546027 0 -0.8321153 0.9565123 0 0.2916919 -0.479384 0 -0.8776053 0.5808837 0 -0.8139866 0.9927726 0 0.1200108 -0.3444516 0 -0.9388041 0.4572795 0 -0.8893231 0.885297 0 0.4650261 -0.3534211 0 -0.9354643 0.5453959 0 -0.8381786 -0.8643237 0 -0.5029361 0.0646653 0 0.9979071 -0.6236727 0 0.7816856 -0.4223925 0 -0.9064131 -0.43427 0 0.9007828 -0.9220604 0 -0.3870462 0.8867091 0 0.4623278 -0.04164346 0 -0.9991325 0.5750563 0 -0.8181139 0.7016897 0 0.7124827 -0.03928218 0 -0.9992282 0.5183231 0 -0.8551849 -0.03981555 0 0.999207 0.8051556 0 -0.5930637 0.502802 0 0.8644016 -0.04342786 0 0.9990566 0.9353461 0 -0.3537338 0.6061872 0 0.7953221 -0.7117211 0 0.7024622 0.9951009 0 -0.09886503 -0.1536407 0 0.9881268 -0.9876083 0 -0.1569394 -0.4495229 0 0.8932689 -0.8779161 0 0.4788145 0.5370493 0 -0.8435509 -0.9433839 0 -0.3317029 -0.2273462 0 -0.973814 -0.08643018 0 0.9962579 0.9996118 0 -0.02786236 0.7100602 0 0.704141 0.3849272 0 0.922947 -0.3617581 0 -0.932272 0.8856702 0 0.4643148 -0.9898025 0 0.1424467 0.3773121 0 0.9260862 -0.4648501 0 0.8853894 0.9863635 0 0.1645812 -0.3445409 0 -0.9387714 0.3807108 0 -0.9246943 -0.576392 0 0.8171734 0.9714844 0 -0.2371038 0.4485798 0 0.8937429 0.5122575 0 -0.858832 -0.7302567 0 -0.6831729 -0.05498214 0 -0.9984874 -0.7300254 0 0.68342 -0.6196445 0 0.7848827 0.9999816 0 -0.006072377 0.9118498 0 0.4105242 0.06329083 0 -0.9979951 0.008855432 0 -0.9999608 0.9997953 0 -0.0202384 0.9914051 0 0.1308284 -0.1717315 0 -0.9851438 3.06795e-4 0 -0.9999999 -0.5467597 0 0.8372896 -0.5790184 0 0.8153145 -0.5843985 0 -0.8114668 -0.6668513 0 -0.7451908 -0.9987581 0 -0.04982273 -0.9999557 0 -0.009416785 0.6491153 0 0.7606901 0.8404072 0 0.5419555 -0.8015253 0 -0.5979611 -0.928076 0 -0.3723911 -0.003521936 0 0.9999939 0.005040197 0 0.9999873 0.7198769 0 -0.6941018 0.7406594 0 -0.6718807 0.8111939 0 -0.5847774 0.7291158 0 -0.6843903 -0.9680721 0 -0.2506724 -0.9335147 0 -0.3585394 -0.2538391 0 0.9672465 -0.6073256 0 0.7944531 -0.5631114 0 -0.826381 -0.6720411 0 -0.7405139 -3.52936e-4 0 1 0.1160509 0 0.9932433 0.7476159 0 -0.6641315 0.9882216 0 -0.1530296 0.1870281 0 -0.9823546 -0.3002663 0 -0.9538555 0.886074 0 0.4635438 0.8953781 0 0.4453068 0.2500225 0 -0.96824 0.1907352 0 -0.9816416 -0.9744437 0 -0.2246319 -0.9889531 0 -0.1482298 0.5557265 0 0.8313652 0.4523502 0 0.8918405 -0.0995838 0 -0.9950292 0.02793142 0 -0.9996098 -0.999866 0 -0.01637385 -0.9965963 0 -0.08243819 0.6225139 0 0.7826087 0.8451424 0 0.5345412 -0.07284516 0 -0.9973434 -0.1130333 0 -0.9935913 -1 0 0 -1 0 0 0.4872422 0 0.8732669 0.5614695 0 0.8274974 0 0 -1 0.03567795 0 -0.9993634 -0.9968252 0 0.07962286 -0.9650139 0 0.2621986 0.6096092 0 0.7927021 0.6742247 0 0.7385263 -0.1225796 0 0.9924587 -0.03383086 0 0.9994277 0.9910876 0 0.1332115 0.9996189 0 -0.02760688 -0.1403496 0 -0.990102 -0.1963206 0 -0.9805397 -1 0 0 -1 0 0 0.3612815 0 0.9324568 0.427475 0 0.9040272 0.1565916 0 -0.9876635 0.02377839 0 -0.9997174 -1 0 0 -1 0 0 0.4388509 0 0.8985599 0.422077 0 0.9065599 -0.1213817 0 -0.9926059 -0.03359468 0 -0.9994356 0.9644102 0 0.2644106 0.9816113 0 0.1908912 -0.481029 0 0.8767048 -0.4736203 0 0.8807292 0.9124767 0 0.4091287 0.9390228 0 0.3438548 -8.01946e-4 0 -0.9999997 -0.0761701 0 -0.9970949 -0.4242592 0 0.9055408 -0.6440772 0 0.7649605 -0.03842208 0 0.9992616 -0.1458302 0 0.9893097 0.9780283 0 0.2084725 0.9999672 0 0.008117043 -0.5548767 0 -0.8319327 -0.7235513 0 -0.6902707 0.8394771 0 0.5433952 0.8811003 0 0.4729294 0 0 -1 -0.1302744 0 -0.9914781 -0.5927233 0 0.8054063 -0.8473368 0 0.531056 0.09959029 0 -0.9950286 -0.1500388 0 -0.9886801 -0.9622028 0 0.272334 -0.9949585 0 0.1002888 0.3866052 0 0.9222454 0.6242047 0 0.7812609 0.9594194 0 -0.281983 0.9739919 0 -0.2265829 -0.8264538 0 -0.5630046 -0.7621202 0 -0.6474355 0.6592747 0 0.7519022 0.5874052 0 0.809293 0.968072 0 -0.2506724 0.9999949 0 -0.003229245 -0.249513 0 -0.9683715 -0.1066824 0 -0.9942932 -0.3992975 0 0.9168214 -0.1301162 0 0.9914988 -1 0 0 -1 0 0 0.2014163 0 -0.9795057 0.1628626 0 -0.9866487 -1 0 0 -1 0 0 -0.9849419 0 -0.1728861 -0.9966204 0 -0.08214566 -0.03673453 0 -0.9993251 0.02784099 0 -0.9996125 -0.821813 0 0.5697573 -0.747025 0 0.664796 -0.9460362 0 0.3240609 -0.9968847 0 0.0788733 0.03626632 0 -0.9993423 -0.237791 0 -0.9713165 0.5787228 0 -0.8155243 0.3979182 0 -0.9174209 0.8975763 0 -0.4408593 0.8621544 0 -0.5066457 -0.1875822 0 0.9822489 3.78102e-4 0 0.9999999 0.9587903 0 -0.284115 0.9279556 0 -0.3726911 0.6058735 0 0.795561 0.6199977 0 0.7846036 0.9922785 0 -0.1240302 0.981903 0 -0.1893847 -0.1397481 0 0.9901871 -0.1345777 0 0.9909031 0.9971859 0 -0.07496874 0.999107 0 0.04225307 0.9986236 0 0.05245033 0.9993857 0 0.03504706 -1 0 0 -0.9995465 0 0.03011157 -0.6977921 0 0.7163004 -0.6145439 0 0.7888826 0.93906 0 -0.3437535 0.7527963 0 -0.6582536 -0.9982303 0 0.05946841 -0.9930307 0 0.1178563 0.003521957 0 0.9999938 0.04095392 0 0.9991611 0.6663543 0 0.7456353 0.7755657 0 0.6312668 -0.9649436 0 0.2624575 -0.8717 0 0.4900398 -0.48195 0 0.8761988 -0.03469553 0 0.999398 0.9055541 0 -0.4242308 0.9021301 0 -0.4314642 0.301045 0 0.9536099 0.4892687 0 0.8721332</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape7-binormals-array" count="653" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape7-map1" name="qt_gauge_background_Shape7-map1">
+ <float_array id="qt_gauge_background_Shape7-map1-array" count="1306">0.9999899 0.5 0 0.5000011 1 0.7711134 0.680473 1 1 0.2288866 0.680473 0 0.9999899 0.53125 0.003002701 0.53125 0.1555535 0.25 0.9999899 0.25 0.3172876 0.125 0.9838179 0.125 0.5 0.0334202 0.508786 0.1331608 0.9144233 0.0625 0.5283655 0.07666276 0.75 0.005520275 0.7237558 0.05692472 0.7556831 0.1313792 0.535428 0.2438733 0.04366439 0.375 0.9999899 0.375 0.4731092 0.3666188 0.5022813 0.5249334 0.9999899 0.75 0.1555527 0.75 0.9999899 0.625 0.04366328 0.625 0.5129047 0.6432205 0.5144359 0.766196 0.9838179 0.875 0.3172875 0.875 0.5283655 0.875 0.5 0.9665798 0.9144233 0.9375 0.508786 0.9249755 0.717891 0.9386548 0.7695187 0.8637815 0.75 0.9944797 0.8023734 0.9565156 0.6542326 0.4227141 0.916348 0.2046798 0.889382 0.1053677 0.4462112 0.07556538 0.8024714 0.04339609 0.7240689 0.02180345 0.664606 0.08287708 0.4422783 0.1650975 0.8405373 0.2915486 0.3906734 0.291375 0.1438785 0.519086 0.8335828 0.6678444 0.8464237 0.5640162 0.1692082 0.5640162 0.2333282 0.6678444 0.5928683 0.8350706 0.3245667 0.7919882 0.4511767 0.8946832 0.7998493 0.9163285 0.664777 0.8940074 0.5763229 0.9445467 0.8594791 0.5190856 0.8464237 0.4645544 0.9222007 0.1613812 0.5860749 0.1652178 0.7573147 0.2110482 0.7996782 0.08185522 0.4511768 0.1071455 0.5833415 0.05538068 0.6364423 0.03037492 0.579452 0.1080251 0.3249633 0.2082152 0.6577954 0.3338576 0.2325156 0.3339757 0.3502942 0.4227142 0.1682861 0.4645548 0.66474 0.7122805 0.6681011 0.5972598 0.3511854 0.5972598 0.3910899 0.7122805 0.916617 0.7952244 0.9224697 0.838523 0.744132 0.7890593 0.4422747 0.8352868 0.4458183 0.9244504 0.8896511 0.8945365 0.5787258 0.9155388 0.7239709 0.9781082 0.6363443 0.9695367 0.8322116 0.9659898 0.7598777 0.9668544 0.8081182 0.9368434 0.5030975 0.4310547 0.681104 0.3781738 0.7502429 0.4479036 0.9067561 0.1805555 0.999995 0.2394433 0.8434045 0.2019826 0.9491206 0.09375 0.8923948 0.1310451 0.841772 0.09411804 0.4086438 0.0792101 0.511344 0.06124232 0.4360697 0.09134452 0.8322116 0.03401014 0.8084489 0.0627052 0.7602084 0.03284722 0.7152365 0.002760138 0.6891764 0.02760062 0.6250098 0.0676177 0.7368182 0.08544052 0.6266882 0.09538116 0.4343479 0.1338237 0.5120972 0.1711427 0.3901225 0.1869484 0.7860499 0.2498557 0.9999899 0.3125 0.7520687 0.3121779 0.3516267 0.2496014 0.5203215 0.311592 0.3118424 0.3119906 0.1884224 0.538991 0.00150135 0.5156255 0.1877098 0.4984363 0.9999899 0.6875 0.7506284 0.6891032 0.7509664 0.6306689 0.9999899 0.578125 0.7514669 0.5781934 0.8188586 0.5389909 0.02333299 0.578125 0.2657399 0.5781934 0.09960801 0.6875 0.2875347 0.6306689 0.3145864 0.6891032 0.6288201 0.8661387 0.5126973 0.8301541 0.6599265 0.8127539 0.2364201 0.8125 0.3502887 0.7513911 0.3887846 0.8137381 0.4356738 0.8669397 0.5120065 0.9051497 0.4347438 0.9088619 0.7373954 0.9054288 0.8426799 0.9054053 0.6242373 0.9060904 0.509406 0.9388111 0.5899774 0.9319843 0.6126359 0.9563784 0.9999899 0.515625 0.8188586 0.4984359 0.9999899 0.4375 0.9919089 0.1769433 0.5932103 0.1343011 0.6609682 0.1876089 0.5120065 0.1040228 0.6135786 0.04332317 0.5902365 0.0167101 0.2364206 0.1875 0.2847834 0.3781738 0.09960897 0.3125 0.2653496 0.4479038 0.0218322 0.4375005 0.7175943 0.7511368 0.5223401 0.7066808 0.5070732 0.5917643 0.999995 0.7605567 0.9076641 0.8191209 0.8430885 0.7976938 0.9919089 0.8230567 0.8933028 0.8686313 0.4086438 0.9207899 0.9491206 0.90625 0.7152365 0.9972398 0.6888458 0.972101 0.5902365 0.9832899 0.8394737 0.9491545 0.7879716 0.9709544 0.7759611 0.9495711 0.6062505 0.4577605 0.5812782 0.4010938 0.7720779 0.4075521 0.8544959 0.1786638 0.9570721 0.2124691 0.9381195 0.2236286 0.8973436 0.08854167 0.9277223 0.1136001 0.8437236 0.1146834 0.400574 0.09176108 0.4645704 0.0621445 0.4770147 0.07455079 0.7879716 0.02904562 0.8394736 0.05084543 0.776843 0.04963317 0.702374 0.01324814 0.7392319 0.01602478 0.7274747 0.03547337 0.6094548 0.07947013 0.6898763 0.07338581 0.69553 0.09759367 0.3942395 0.1534896 0.4734789 0.1502214 0.4643822 0.1919579 0.7242672 0.2749788 0.9056171 0.2760417 0.8958254 0.3229167 0.3010252 0.2760417 0.4468135 0.2749788 0.424937 0.3213542 0.2569221 0.5212502 0.08792745 0.5271878 0.08703669 0.5081256 0.8958254 0.6522657 0.8958254 0.6979167 0.7106346 0.6555209 0.9154083 0.5532292 0.8958254 0.5859375 0.7282883 0.5521875 0.1286699 0.5859375 0.09702396 0.5532292 0.2821816 0.5521876 0.1996199 0.6979167 0.1664261 0.6522656 0.3354755 0.6555208 0.6590109 0.8445641 0.5600069 0.8514063 0.5670891 0.8098726 0.3153232 0.8229167 0.2673419 0.7760417 0.3927541 0.7789352 0.4077302 0.8867118 0.4770147 0.885573 0.4734789 0.9100994 0.8421916 0.9242629 0.7688926 0.9244633 0.7870074 0.8990954 0.6094548 0.8855729 0.6979513 0.8836266 0.6889943 0.9116586 0.5519956 0.9521853 0.5466794 0.9361646 0.6277479 0.9437585 0.9154083 0.508125 0.9154083 0.5271875 0.7478712 0.52125 0.7282883 0.4850261 0.8958254 0.4323698 0.9154083 0.4755729 0.9455509 0.148264 0.9537029 0.1864275 0.8679916 0.1501742 0.5706565 0.1919579 0.5466794 0.1502213 0.646798 0.1545728 0.8437445 0.2280272 0.6819773 0.2228954 0.750963 0.1822355 0.7845861 0.09759367 0.7697745 0.07229307 0.8421916 0.07573704 0.4770147 0.09249097 0.4734789 0.1185026 0.4077303 0.1132881 0.6384215 0.05544565 0.5600069 0.06397787 0.5519956 0.0478147 0.6689515 0.04019311 0.5869588 0.03120699 0.6502907 0.01906063 0.6370068 0.1155103 0.5466794 0.1185026 0.5600069 0.09362993 0.3963217 0.2228954 0.2673424 0.2239583 0.3153235 0.1770833 0.7720779 0.3501823 0.5856606 0.3486198 0.6164032 0.3010204 0.3281572 0.3486198 0.1664269 0.3501823 0.1996206 0.3020833 0.2364764 0.4075521 0.406009 0.4010938 0.4053059 0.4577605 0.09550788 0.4755735 0.1279274 0.4323701 0.2816739 0.4850263 0.7818695 0.7239584 0.6030445 0.7317477 0.6125622 0.6852344 0.7916608 0.6066927 0.6081799 0.6136198 0.6062506 0.5729427 0.4054233 0.5729427 0.4133275 0.6136198 0.2365934 0.6066927 0.4322554 0.6852344 0.4432459 0.7317476 0.3010247 0.7239584 0.9381195 0.7763715 0.9570721 0.7875309 0.8569171 0.8204732 0.8704129 0.8489628 0.9537029 0.8135725 0.9455508 0.851736 0.7533842 0.8169014 0.6588269 0.7789352 0.8241616 0.7719728 0.4608148 0.8098727 0.4770147 0.8514062 0.3942394 0.8465105 0.4734789 0.9255916 0.4645703 0.9378555 0.4005739 0.9082389 0.8461449 0.8844535 0.9277223 0.8863999 0.8973436 0.9114584 0.6304711 0.9233705 0.5466794 0.9206723 0.5600069 0.9010417 0.7265928 0.9637309 0.739232 0.9839752 0.7023741 0.9867519 0.6502907 0.9809394 0.5869588 0.968793 0.6680696 0.9590111 0.8161162 0.960648 0.7834019 0.9609684 0.8066736 0.9479635 0.5902578 0.4286458 0.6729206 0.4039063 0.6987467 0.4351563 0.9099653 0.1931699 0.9529625 0.2192092 0.8862772 0.2018409 0.9142334 0.1000146 0.8873492 0.1159835 0.8667244 0.1002854 0.428221 0.07668894 0.4728057 0.06816074 0.4384884 0.08228652 0.8161162 0.03935199 0.8068941 0.05183755 0.7836224 0.03883271 0.7209167 0.01367662 0.7395995 0.02682922 0.7109089 0.02473849 0.6477495 0.07598127 0.6971665 0.08456779 0.6491629 0.08853678 0.4360208 0.1512923 0.4718747 0.1691906 0.4202558 0.1749035 0.8130931 0.2731718 0.9086897 0.3007812 0.8008536 0.3005155 0.3715346 0.2731718 0.4453259 0.3001249 0.3553485 0.3003907 0.1730138 0.5275784 0.08603326 0.5179431 0.1726511 0.5115629 0.9062418 0.6760873 0.7974454 0.6769011 0.7974454 0.6510873 0.9111376 0.5699479 0.8018588 0.5696875 0.8263375 0.5522395 0.1078122 0.569948 0.1852414 0.5522397 0.2146337 0.5696875 0.1746815 0.6760873 0.2560836 0.6510872 0.2696036 0.676901 0.6068378 0.848628 0.5552428 0.8316739 0.6183996 0.8250675 0.2858413 0.8007813 0.3343728 0.7741609 0.3539157 0.8015047 0.4402774 0.8833317 0.4750327 0.899439 0.4393934 0.9008626 0.8055859 0.925507 0.7743252 0.9116188 0.8192725 0.9115688 0.6497682 0.8825603 0.6975514 0.8993422 0.6475289 0.8998287 0.5481375 0.9433089 0.5858985 0.9398451 0.5942961 0.9501032 0.9160333 0.5179427 0.8312332 0.5275781 0.8312332 0.5115625 0.8018588 0.4585938 0.9111376 0.4535482 0.8263375 0.4813477 0.9506088 0.1678159 0.9111493 0.1691204 0.9050047 0.1473877 0.5528028 0.1691906 0.590661 0.1515631 0.6162382 0.1751744 0.76622 0.227314 0.7117755 0.2002411 0.7951335 0.2055929 0.7739403 0.0842946 0.8058065 0.07368207 0.8186673 0.08760351 0.4750328 0.1046755 0.4393934 0.1176873 0.4402774 0.09978499 0.6016904 0.05999152 0.5514694 0.05672673 0.5969645 0.04969784 0.6283772 0.03652444 0.6177443 0.02473778 0.6624239 0.02969654 0.5882132 0.1182428 0.5501404 0.1049602 0.6013368 0.1017642 0.3352649 0.2262968 0.2858417 0.1992187 0.3548078 0.198953 0.6740162 0.3530078 0.5982739 0.3238684 0.7012848 0.324259 0.2542545 0.3530078 0.1746823 0.3245248 0.2677745 0.3241341 0.3199337 0.4039063 0.4165105 0.4286458 0.3136654 0.4351563 0.1066222 0.4535486 0.2139535 0.458594 0.1843453 0.4813481 0.6906018 0.7285098 0.6016596 0.7080997 0.7027725 0.7012565 0.7041247 0.6109896 0.5969832 0.5932813 0.7036424 0.5878776 0.4183694 0.5932813 0.3217924 0.6109896 0.3138415 0.5878776 0.4462635 0.7080997 0.3706424 0.7285099 0.3571778 0.7012565 0.9529625 0.7807909 0.9105706 0.8066144 0.8868824 0.7979434 0.9117545 0.8306639 0.9506088 0.8321841 0.90561 0.8523965 0.7065933 0.8000008 0.7359538 0.7731436 0.7908431 0.7941913 0.4718668 0.8316739 0.4369047 0.8491146 0.4193638 0.8255541 0.4719217 0.9318748 0.428221 0.9233111 0.4376044 0.917749 0.8879545 0.8838007 0.9142334 0.8999854 0.8673298 0.8994988 0.5865793 0.9232434 0.5501403 0.9111577 0.5997028 0.9118323 0.739379 0.9729719 0.7209167 0.9863234 0.7106884 0.9750625 0.6177443 0.9752623 0.6281567 0.9632766 0.6622034 0.9701045 0.8733175 0.9517449 0.7911058 0.9802347 0.7605177 0.979066 0.7487846 0.9546145 0.7697558 0.9372427 0.8506352 0.9368882 0.5049751 0.4678125 0.4935184 0.3998958 0.5796373 0.3745899 0.8039522 0.3781576 0.854472 0.4157878 0.6465096 0.4795248 0.8469945 0.1596055 0.9556012 0.2020086 0.9999975 0.234165 0.9999925 0.2447217 0.9044209 0.2263578 0.7987872 0.173502 0.9317719 0.078125 0.9664692 0.109375 0.9380738 0.129587 0.8401948 0.1314186 0.8063133 0.10884 0.8742605 0.08013218 0.3629657 0.1021051 0.4543219 0.05631515 0.5067769 0.05142175 0.517179 0.0684744 0.4781127 0.08232432 0.3907152 0.1048108 0.7911058 0.01976521 0.8733175 0.04825507 0.8506352 0.06311183 0.7710786 0.06095171 0.7501075 0.0441919 0.7605177 0.02093399 0.6978548 0.001380069 0.7326183 0.004140207 0.7036585 0.04043531 0.680025 0.01496694 0.5789036 0.07106129 0.6711358 0.06377076 0.7318723 0.07203824 0.7426423 0.1021197 0.6778492 0.1090467 0.5789036 0.08497785 0.3891315 0.1316423 0.4728089 0.1337565 0.5094273 0.1499674 0.5175415 0.1993952 0.4421488 0.2120254 0.3525391 0.1607682 0.679998 0.2484056 0.8846283 0.2510172 0.9999899 0.28125 0.9999899 0.34375 0.854472 0.3401498 0.6538128 0.2835619 0.269259 0.25 0.430209 0.2484056 0.5280427 0.2835619 0.5037283 0.337806 0.3858222 0.337806 0.2416117 0.2851562 0.3050367 0.5353907 0.09187306 0.5381773 0.002252026 0.5234377 7.50675e-4 0.5078133 0.09038061 0.4949356 0.3047697 0.5073505 0.9999899 0.65625 0.9999899 0.71875 0.85692 0.7148438 0.6456035 0.666569 0.6445079 0.6342643 0.8593678 0.6284635 0.9999899 0.5546875 0.9999899 0.6015625 0.8593678 0.5989388 0.6465097 0.5575846 0.7014977 0.5353906 0.9147834 0.538177 0.03349813 0.6015625 0.01316785 0.5546875 0.3636428 0.5575846 0.168597 0.5989388 0.1275804 0.71875 0.07163565 0.65625 0.1840109 0.6284635 0.3868465 0.6342643 0.3968 0.666569 0.2416111 0.7148438 0.6863769 0.8651535 0.5789036 0.8692969 0.517179 0.852474 0.5121905 0.8033507 0.6000993 0.7907205 0.7100264 0.835295 0.2768538 0.84375 0.1959864 0.78125 0.2692586 0.75 0.4248578 0.7555642 0.4367976 0.7907205 0.3525389 0.8392318 0.3891314 0.8683577 0.4781126 0.8692969 0.5171789 0.8919662 0.5094273 0.9161326 0.4728089 0.9185013 0.3907151 0.8951892 0.7305493 0.9201683 0.7462742 0.8890467 0.8099452 0.8892534 0.8742605 0.9198679 0.6680457 0.9198951 0.5789036 0.8919662 0.5067769 0.9485782 0.5094273 0.9317392 0.5465503 0.9291524 0.6429424 0.9344236 0.6594106 0.9495866 0.5632654 0.9612085 0.9999899 0.5078125 0.9999899 0.5234375 0.7014978 0.5073503 0.9147834 0.4949349 0.9999899 0.40625 0.9999899 0.46875 0.9878634 0.1509717 0.9959545 0.202915 0.5465503 0.1337565 0.6558746 0.133552 0.7039465 0.1634103 0.6103461 0.2120254 0.517179 0.09068098 0.5094273 0.1180143 0.5632654 0.03879154 0.6631814 0.0492197 0.5451183 0.02506515 0.6353548 0.008355049 0.195987 0.21875 0.2768541 0.15625 0.3758687 0.3745899 0.1839823 0.3781576 0.07163668 0.34375 0.1275813 0.28125 0.363369 0.4795249 0.1682649 0.4157879 0.0109161 0.4687508 0.03274829 0.4062503 0.8292127 0.7489828 0.6207544 0.7555642 0.5202438 0.7330382 0.5196019 0.6788933 0.5093921 0.6145183 0.5050044 0.5664454 0.9999925 0.7552783 0.9999975 0.765835 0.9556012 0.7979914 0.8506263 0.8390999 0.8024191 0.8252035 0.8995252 0.7736422 0.9959545 0.797085 0.9878634 0.8490283 0.9380738 0.8704131 0.8438267 0.8672868 0.4543219 0.9436848 0.3629656 0.897895 0.9664692 0.890625 0.9317719 0.921875 0.7326183 0.9958597 0.6978548 0.9986199 0.680025 0.985033 0.7023356 0.958371 0.6353548 0.991645 0.5451183 0.9749348</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape7-map1-array" count="653" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape7-textangents">
+ <float_array id="qt_gauge_background_Shape7-textangents-array" count="7200">-0.01777684 0 0.9998419 -0.01491136 0 0.9998888 -0.01264451 0 0.99992 -0.01621746 0 0.9998683 -0.01491136 0 0.9998888 -0.007127264 0 0.9999745 -0.009981531 0 0.9999501 -0.01264451 0 0.99992 -0.01264451 0 0.99992 -0.009981531 0 0.9999501 -0.007727782 0 0.9999701 -0.0103981 0 0.9999459 -0.01621746 0 0.9998683 -0.01264451 0 0.99992 -0.0103981 0 0.9999459 -0.00759102 0 0.9999711 -0.2351678 0 0.9719548 -0.1011088 0 0.9948754 -0.02025607 0 0.9997948 -0.02653047 0 0.9996479 -0.1011088 0 0.9948754 -0.04422333 0 0.9990216 -0.01156389 0 0.999933 -0.02025607 0 0.9997948 -0.02025607 0 0.9997948 -0.01156389 0 0.999933 -0.007727782 0 0.9999701 -0.009981531 0 0.9999501 -0.02653047 0 0.9996479 -0.02025607 0 0.9997948 -0.009981531 0 0.9999501 -0.007127264 0 0.9999745 0 0 0.9999999 -0.001559033 0 0.9999987 -0.003528927 0 0.9999936 -0.007723338 0 0.9999701 -0.001559033 0 0.9999987 -0.00759102 0 0.9999711 -0.0103981 0 0.9999459 -0.003528927 0 0.9999936 -0.003528927 0 0.9999936 -0.0103981 0 0.9999459 -0.007727782 0 0.9999701 -0.01156389 0 0.999933 -0.007723338 0 0.9999701 -0.003528927 0 0.9999936 -0.01156389 0 0.999933 -0.04422333 0 0.9990216 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.01065558 0 0.9999432 -0.03301682 0 0.9994549 0.003479436 0 0.999994 -0.01065558 0 0.9999432 -0.06917343 0 0.9976047 -0.1349337 0 0.9908546 -0.03301682 0 0.9994549 -0.03301682 0 0.9994549 -0.1349337 0 0.9908546 -0.1882236 0 0.9821262 -0.06240511 0 0.9980508 0.003479436 0 0.999994 -0.03301682 0 0.9994549 -0.06240511 0 0.9980508 0.0118844 0 0.9999294 -0.5805365 0 0.8142341 -0.7268431 0 0.6868036 -0.4699934 0 0.8826698 -0.2044379 0 0.9788796 -0.7268431 0 0.6868036 -0.5654128 0 0.824808 -0.412145 0 0.9111182 -0.4699934 0 0.8826698 -0.4699934 0 0.8826698 -0.412145 0 0.9111182 -0.1882236 0 0.9821262 -0.1349337 0 0.9908546 -0.2044379 0 0.9788796 -0.4699934 0 0.8826698 -0.1349337 0 0.9908546 -0.06917343 0 0.9976047 -0.01414641 0 0.9998999 -0.06300398 0 0.9980133 -0.2422782 0 0.9702067 -0.4582136 0 0.888842 -0.06300398 0 0.9980133 0.0118844 0 0.9999294 -0.06240511 0 0.9980508 -0.2422782 0 0.9702067 -0.2422782 0 0.9702067 -0.06240511 0 0.9980508 -0.1882236 0 0.9821262 -0.412145 0 0.9111182 -0.4582136 0 0.888842 -0.2422782 0 0.9702067 -0.412145 0 0.9111182 -0.5654128 0 0.824808 0.01777363 0 0.999842 0.01221946 0 0.9999254 0.01040355 0 0.9999458 0.007182671 0 0.9999742 0.01221946 0 0.9999254 0.0585619 0 0.9982836 0.03162334 0 0.9994999 0.01040355 0 0.9999458 0.01040355 0 0.9999458 0.03162334 0 0.9994999 0.02845043 0 0.9995952 0.006114916 0 0.9999811 0.007182671 0 0.9999742 0.01040355 0 0.9999458 0.006114916 0 0.9999811 0.00381563 0 0.9999925 0.2089785 0 0.9779201 0.1379957 0 0.9904327 0.06786441 0 0.9976944 0.1594262 0 0.9872099 0.1379957 0 0.9904327 0.04546124 0 0.9989662 0.02981836 0 0.9995553 0.06786441 0 0.9976944 0.06786441 0 0.9976944 0.02981836 0 0.9995553 0.02845043 0 0.9995952 0.03162334 0 0.9994999 0.1594262 0 0.9872099 0.06786441 0 0.9976944 0.03162334 0 0.9994999 0.0585619 0 0.9982836 0 0 0.9999999 8.83638e-4 0 0.9999996 0.007034341 0 0.9999751 0.008727993 0 0.999962 8.83638e-4 0 0.9999996 0.00381563 0 0.9999925 0.006114916 0 0.9999811 0.007034341 0 0.9999751 0.007034341 0 0.9999751 0.006114916 0 0.9999811 0.02845043 0 0.9995952 0.02981836 0 0.9995553 0.008727993 0 0.999962 0.007034341 0 0.9999751 0.02981836 0 0.9995553 0.04546124 0 0.9989662 -0.07385101 0 0.9972693 -0.07223602 0 0.9973875 -0.067868 0 0.9976944 -0.06775764 0 0.9977018 -0.07223602 0 0.9973875 -0.1195197 0 0.9928318 -0.09677189 0 0.9953066 -0.067868 0 0.9976944 -0.067868 0 0.9976944 -0.09677189 0 0.9953066 -0.05660855 0 0.9983964 -0.03703496 0 0.999314 -0.06775764 0 0.9977018 -0.067868 0 0.9976944 -0.03703496 0 0.999314 -0.03462208 0 0.9994004 -0.1630066 0 0.986625 -0.08626293 0 0.9962724 -0.08699924 0 0.9962084 -0.1213493 0 0.9926099 -0.08626293 0 0.9962724 -0.05024467 0 0.9987369 -0.04725454 0 0.9988828 -0.08699924 0 0.9962084 -0.08699924 0 0.9962084 -0.04725454 0 0.9988828 -0.05660855 0 0.9983964 -0.09677189 0 0.9953066 -0.1213493 0 0.9926099 -0.08699924 0 0.9962084 -0.09677189 0 0.9953066 -0.1195197 0 0.9928318 0 0 0.9999999 -0.007571489 0 0.9999713 -0.01853479 0 0.9998282 -0.01333587 0 0.9999111 -0.007571489 0 0.9999713 -0.03462208 0 0.9994004 -0.03703496 0 0.999314 -0.01853479 0 0.9998282 -0.01853479 0 0.9998282 -0.03703496 0 0.999314 -0.05660855 0 0.9983964 -0.04725454 0 0.9988828 -0.01333587 0 0.9999111 -0.01853479 0 0.9998282 -0.04725454 0 0.9988828 -0.05024467 0 0.9987369 0.2351608 0 0.9719565 0.02652793 0 0.999648 0.02142298 0 0.9997705 0.1019518 0 0.9947894 0.02652793 0 0.999648 0.007111775 0 0.9999747 0.01054469 0 0.9999443 0.02142298 0 0.9997705 0.02142298 0 0.9997705 0.01054469 0 0.9999443 0.008618303 0 0.9999628 0.01337571 0 0.9999105 0.1019518 0 0.9947894 0.02142298 0 0.9997705 0.01337571 0 0.9999105 0.04596046 0 0.9989433 0.01777363 0 0.999842 0.01625975 0 0.9998677 0.01273502 0 0.9999188 0.01489621 0 0.999889 0.01625975 0 0.9998677 0.007638709 0 0.9999708 0.009676594 0 0.999953 0.01273502 0 0.9999188 0.01273502 0 0.9999188 0.009676594 0 0.999953 0.008618303 0 0.9999628 0.01054469 0 0.9999443 0.01489621 0 0.999889 0.01273502 0 0.9999188 0.01054469 0 0.9999443 0.007111775 0 0.9999747 0 0 0.9999999 0.008492882 0 0.9999639 0.004376017 0 0.9999903 0.001630489 0 0.9999986 0.008492882 0 0.9999639 0.04596046 0 0.9989433 0.01337571 0 0.9999105 0.004376017 0 0.9999903 0.004376017 0 0.9999903 0.01337571 0 0.9999105 0.008618303 0 0.9999628 0.009676594 0 0.999953 0.001630489 0 0.9999986 0.004376017 0 0.9999903 0.009676594 0 0.999953 0.007638709 0 0.9999708 -0.06343322 0 0.9979861 -0.1452481 0 0.9893953 -0.06181137 0 0.9980878 -0.07481553 0 0.9971974 -0.1452481 0 0.9893953 0.01665534 0 0.9998614 0.05304073 0 0.9985923 -0.06181137 0 0.9980878 -0.06181137 0 0.9980878 0.05304073 0 0.9985923 0.04711698 0 0.9988893 -0.01728258 0 0.9998506 -0.07481553 0 0.9971974 -0.06181137 0 0.9980878 -0.01728258 0 0.9998506 -0.02129061 0 0.9997733 0.2351608 0 0.9719565 0.1019518 0 0.9947894 0.1912157 0 0.981548 0.2476861 0 0.9688402 0.1019518 0 0.9947894 0.04596046 0 0.9989433 0.06508702 0 0.9978796 0.1912157 0 0.981548 0.1912157 0 0.981548 0.06508702 0 0.9978796 0.04711698 0 0.9988893 0.05304073 0 0.9985923 0.2476861 0 0.9688402 0.1912157 0 0.981548 0.05304073 0 0.9985923 0.01665534 0 0.9998614 0 0 0.9999999 -0.004667322 0 0.999989 0.01505736 0 0.9998866 0.008492882 0 0.9999639 -0.004667322 0 0.999989 -0.02129061 0 0.9997733 -0.01728258 0 0.9998506 0.01505736 0 0.9998866 0.01505736 0 0.9998866 -0.01728258 0 0.9998506 0.04711698 0 0.9988893 0.06508702 0 0.9978796 0.008492882 0 0.9999639 0.01505736 0 0.9998866 0.06508702 0 0.9978796 0.04596046 0 0.9989433 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.07385101 0 0.9972693 -0.07647336 0 0.9970716 -0.04295719 0 0.9990768 -0.03379725 0 0.9994286 -0.07647336 0 0.9970716 -0.0412523 0 0.9991488 -0.03068673 0 0.9995291 -0.04295719 0 0.9990768 -0.04295719 0 0.9990768 -0.03068673 0 0.9995291 -0.02313422 0 0.9997323 -0.02326886 0 0.9997291 -0.03379725 0 0.9994286 -0.04295719 0 0.9990768 -0.02326886 0 0.9997291 -0.01182358 0 0.99993 0 0 0.9999999 0 0 0.9999999 -0.01105748 0 0.9999387 -0.01091461 0 0.9999405 0 0 0.9999999 0 0 0.9999999 -0.005302904 0 0.9999858 -0.01105748 0 0.9999387 -0.01105748 0 0.9999387 -0.005302904 0 0.9999858 -0.02313422 0 0.9997323 -0.03068673 0 0.9995291 -0.01091461 0 0.9999405 -0.01105748 0 0.9999387 -0.03068673 0 0.9995291 -0.0412523 0 0.9991488 0 0 0.9999999 -0.002858372 0 0.9999958 -0.0059392 0 0.9999822 0 0 0.9999999 -0.002858372 0 0.9999958 -0.01182358 0 0.99993 -0.02326886 0 0.9997291 -0.0059392 0 0.9999822 -0.0059392 0 0.9999822 -0.02326886 0 0.9997291 -0.02313422 0 0.9997323 -0.005302904 0 0.9999858 0 0 0.9999999 -0.0059392 0 0.9999822 -0.005302904 0 0.9999858 0 0 0.9999999 0 0 0.9999999 0.01088539 0 0.9999408 0.01123526 0 0.9999369 0 0 0.9999999 0.01088539 0 0.9999408 0.05344427 0 0.9985709 0.04460453 0 0.9990046 0.01123526 0 0.9999369 0.01123526 0 0.9999369 0.04460453 0 0.9990046 0.03105745 0 0.9995177 0.006178195 0 0.9999808 0 0 0.9999999 0.01123526 0 0.9999369 0.006178195 0 0.9999808 0 0 0.9999999 -0.01414641 0 0.9998999 0.09320182 0 0.9956473 0.1025223 0 0.9947307 0.1254393 0 0.9921012 0.09320182 0 0.9956473 0.0402761 0 0.9991885 0.05239278 0 0.9986266 0.1025223 0 0.9947307 0.1025223 0 0.9947307 0.05239278 0 0.9986266 0.03105745 0 0.9995177 0.04460453 0 0.9990046 0.1254393 0 0.9921012 0.1025223 0 0.9947307 0.04460453 0 0.9990046 0.05344427 0 0.9985709 0 0 0.9999999 0 0 0.9999999 0.01491745 0 0.9998887 0.008066677 0 0.9999675 0 0 0.9999999 0 0 0.9999999 0.006178195 0 0.9999808 0.01491745 0 0.9998887 0.01491745 0 0.9998887 0.006178195 0 0.9999808 0.03105745 0 0.9995177 0.05239278 0 0.9986266 0.008066677 0 0.9999675 0.01491745 0 0.9998887 0.05239278 0 0.9986266 0.0402761 0 0.9991885 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 -0.004765227 0 0.9999885 0.001059314 0 0.9999993 0.006876811 0 0.9999763 -0.004765227 0 0.9999885 -0.02621268 0 0.9996563 -0.02522996 0 0.9996817 0.001059314 0 0.9999993 0.001059314 0 0.9999993 -0.02522996 0 0.9996817 -0.002627222 0 0.9999965 0.02942648 0 0.999567 0.006876811 0 0.9999763 0.001059314 0 0.9999993 0.02942648 0 0.999567 0.03820039 0 0.99927 -0.1611034 0 0.9869375 -0.08080005 0 0.9967302 -0.08502351 0 0.9963789 -0.08543427 0 0.9963439 -0.08080005 0 0.9967302 0.01132802 0 0.9999359 -0.02644562 0 0.9996502 -0.08502351 0 0.9963789 -0.08502351 0 0.9963789 -0.02644562 0 0.9996502 -0.002627222 0 0.9999965 -0.02522996 0 0.9996817 -0.08543427 0 0.9963439 -0.08502351 0 0.9963789 -0.02522996 0 0.9996817 -0.02621268 0 0.9996563 0.2702362 0 0.9627939 0.1479498 0 0.988995 0.03844033 0 0.9992609 0.189997 0 0.9817847 0.1479498 0 0.988995 0.03820039 0 0.99927 0.02942648 0 0.999567 0.03844033 0 0.9992609 0.03844033 0 0.9992609 0.02942648 0 0.999567 -0.002627222 0 0.9999965 -0.02644562 0 0.9996502 0.189997 0 0.9817847 0.03844033 0 0.9992609 -0.02644562 0 0.9996502 0.01132802 0 0.9999359 0.03569141 0 0.9993628 0.02406261 0 0.9997104 0.02598788 0 0.9996623 0.03174221 0 0.999496 0.02406261 0 0.9997104 0.01359187 0 0.9999075 0.01802991 0 0.9998374 0.02598788 0 0.9996623 0.02598788 0 0.9996623 0.01802991 0 0.9998374 0.008971308 0 0.9999596 0.01304513 0 0.9999148 0.03174221 0 0.999496 0.02598788 0 0.9996623 0.01304513 0 0.9999148 0.01398828 0 0.9999021 0.08907486 0 0.9960249 -0.06502486 0 0.9978836 0.002339863 0 0.9999972 0.03987081 0 0.9992048 -0.06502486 0 0.9978836 -0.02884793 0 0.9995838 -0.006748479 0 0.9999771 0.002339863 0 0.9999972 0.002339863 0 0.9999972 -0.006748479 0 0.9999771 0.008971308 0 0.9999596 0.01802991 0 0.9998374 0.03987081 0 0.9992048 0.002339863 0 0.9999972 0.01802991 0 0.9998374 0.01359187 0 0.9999075 0 0 0.9999999 0.003463313 0 0.9999939 1.39848e-4 0 0.9999999 -0.007368226 0 0.9999729 0.003463313 0 0.9999939 0.01398828 0 0.9999021 0.01304513 0 0.9999148 1.39848e-4 0 0.9999999 1.39848e-4 0 0.9999999 0.01304513 0 0.9999148 0.008971308 0 0.9999596 -0.006748479 0 0.9999771 -0.007368226 0 0.9999729 1.39848e-4 0 0.9999999 -0.006748479 0 0.9999771 -0.02884793 0 0.9995838 0.1416503 0 0.9899167 0.0538661 0 0.998548 0.06682295 0 0.9977648 0.09359992 0 0.9956099 0.0538661 0 0.998548 0.02356701 0 0.9997222 0.03051724 0 0.9995343 0.06682295 0 0.9977648 0.06682295 0 0.9977648 0.03051724 0 0.9995343 0.01794109 0 0.999839 0.02590683 0 0.9996643 0.09359992 0 0.9956099 0.06682295 0 0.9977648 0.02590683 0 0.9996643 0.02602642 0 0.9996612 0.03569141 0 0.9993628 0.01594856 0 0.9998729 0.009669518 0 0.9999532 0.007786642 0 0.9999695 0.01594856 0 0.9998729 0.008157766 0 0.9999667 0.00531658 0 0.9999857 0.009669518 0 0.9999532 0.009669518 0 0.9999532 0.00531658 0 0.9999857 0.01794109 0 0.999839 0.03051724 0 0.9995343 0.007786642 0 0.9999695 0.009669518 0 0.9999532 0.03051724 0 0.9995343 0.02356701 0 0.9997222 0 0 1 0.004746452 0 0.9999886 0.00674409 0 0.9999772 0.001894853 0 0.9999982 0.004746452 0 0.9999886 0.02602642 0 0.9996612 0.02590683 0 0.9996643 0.00674409 0 0.9999772 0.00674409 0 0.9999772 0.02590683 0 0.9996643 0.01794109 0 0.999839 0.00531658 0 0.9999857 0.001894853 0 0.9999982 0.00674409 0 0.9999772 0.00531658 0 0.9999857 0.008157766 0 0.9999667 -0.03161101 0 0.9995002 -0.002671591 0 0.9999964 -0.007480635 0 0.999972 -0.02308309 0 0.9997335 -0.002671591 0 0.9999964 -0.03618099 0 0.9993452 -0.02113308 0 0.9997766 -0.007480635 0 0.999972 -0.007480635 0 0.999972 -0.02113308 0 0.9997766 -0.01831121 0 0.9998323 -0.005480239 0 0.9999848 -0.02308309 0 0.9997335 -0.007480635 0 0.999972 -0.005480239 0 0.9999848 -0.00861612 0 0.9999627 -0.1611034 0 0.9869375 -0.08543427 0 0.9963439 -0.04364947 0 0.9990469 -0.08615968 0 0.9962813 -0.08543427 0 0.9963439 -0.02621268 0 0.9996563 -0.02625882 0 0.9996551 -0.04364947 0 0.9990469 -0.04364947 0 0.9990469 -0.02625882 0 0.9996551 -0.01831121 0 0.9998323 -0.02113308 0 0.9997766 -0.08615968 0 0.9962813 -0.04364947 0 0.9990469 -0.02113308 0 0.9997766 -0.03618099 0 0.9993452 0 0 1 -0.001960248 0 0.9999981 -0.00681554 0 0.9999767 -0.004765227 0 0.9999885 -0.001960248 0 0.9999981 -0.00861612 0 0.9999627 -0.005480239 0 0.9999848 -0.00681554 0 0.9999767 -0.00681554 0 0.9999767 -0.005480239 0 0.9999848 -0.01831121 0 0.9998323 -0.02625882 0 0.9996551 -0.004765227 0 0.9999885 -0.00681554 0 0.9999767 -0.02625882 0 0.9996551 -0.02621268 0 0.9996563 0 0 0.9999999 -0.002819913 0 0.9999959 -0.005004146 0 0.9999874 0 0 0.9999999 -0.002819913 0 0.9999959 -0.01612659 0 0.9998699 -0.01265306 0 0.9999199 -0.005004146 0 0.9999874 -0.005004146 0 0.9999874 -0.01265306 0 0.9999199 -0.009667065 0 0.9999533 -0.001948643 0 0.999998 0 0 0.9999999 -0.005004146 0 0.9999874 -0.001948643 0 0.999998 0 0 0.9999999 -0.03161101 0 0.9995002 -0.03434673 0 0.9994099 -0.0274218 0 0.9996239 -0.03063851 0 0.9995306 -0.03434673 0 0.9994099 -0.01522411 0 0.999884 -0.01303424 0 0.9999149 -0.0274218 0 0.9996239 -0.0274218 0 0.9996239 -0.01303424 0 0.9999149 -0.009667065 0 0.9999533 -0.01265306 0 0.9999199 -0.03063851 0 0.9995306 -0.0274218 0 0.9996239 -0.01265306 0 0.9999199 -0.01612659 0 0.9998699 0 0 0.9999999 0 0 0.9999999 -0.003343506 0 0.9999943 -0.003779348 0 0.9999927 0 0 0.9999999 0 0 0.9999999 -0.001948643 0 0.999998 -0.003343506 0 0.9999943 -0.003343506 0 0.9999943 -0.001948643 0 0.999998 -0.009667065 0 0.9999533 -0.01303424 0 0.9999149 -0.003779348 0 0.9999927 -0.003343506 0 0.9999943 -0.01303424 0 0.9999149 -0.01522411 0 0.999884 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.07383942 0 0.9972701 0.004055314 0 0.9999917 0.004561502 0 0.9999894 0.03399623 0 0.999422 0.004055314 0 0.9999917 -6.70786e-4 0 0.9999997 7.96237e-4 0 0.9999996 0.004561502 0 0.9999894 0.004561502 0 0.9999894 7.96237e-4 0 0.9999996 -7.4204e-4 0 0.9999998 0.001833052 0 0.9999982 0.03399623 0 0.999422 0.004561502 0 0.9999894 0.001833052 0 0.9999982 0.01239903 0 0.9999231 0 0 0.9999999 0 0 0.9999999 8.55469e-4 0 0.9999995 -8.98049e-4 0 0.9999995 0 0 0.9999999 0 0 0.9999999 -6.96701e-4 0 0.9999996 8.55469e-4 0 0.9999995 8.55469e-4 0 0.9999995 -6.96701e-4 0 0.9999996 -7.4204e-4 0 0.9999998 7.96237e-4 0 0.9999996 -8.98049e-4 0 0.9999995 8.55469e-4 0 0.9999995 7.96237e-4 0 0.9999996 -6.70786e-4 0 0.9999997 0 0 0.9999999 0.003107944 0 0.9999951 0.001520061 0 0.9999987 0 0 0.9999999 0.003107944 0 0.9999951 0.01239903 0 0.9999231 0.001833052 0 0.9999982 0.001520061 0 0.9999987 0.001520061 0 0.9999987 0.001833052 0 0.9999982 -7.4204e-4 0 0.9999998 -6.96701e-4 0 0.9999996 0 0 0.9999999 0.001520061 0 0.9999987 -6.96701e-4 0 0.9999996 0 0 0.9999999 0.07383942 0 0.9972701 0.07185352 0 0.9974152 0.06194127 0 0.9980797 0.06821707 0 0.9976705 0.07185352 0 0.9974152 0.03914398 0 0.9992335 0.03283385 0 0.9994607 0.06194127 0 0.9980797 0.06194127 0 0.9980797 0.03283385 0 0.9994607 0.01815161 0 0.9998353 0.03905421 0 0.9992371 0.06821707 0 0.9976705 0.06194127 0 0.9980797 0.03905421 0 0.9992371 0.03612855 0 0.9993471 0 0 0.9999999 0 0 0.9999999 0.007210271 0 0.9999739 0.009843873 0 0.9999514 0 0 0.9999999 0 0 0.9999999 0.007399703 0 0.9999725 0.007210271 0 0.9999739 0.007210271 0 0.9999739 0.007399703 0 0.9999725 0.01815161 0 0.9998353 0.03283385 0 0.9994607 0.009843873 0 0.9999514 0.007210271 0 0.9999739 0.03283385 0 0.9994607 0.03914398 0 0.9992335 0 0 0.9999999 0.00960328 0 0.9999537 0.01087204 0 0.9999409 0 0 0.9999999 0.00960328 0 0.9999537 0.03612855 0 0.9993471 0.03905421 0 0.9992371 0.01087204 0 0.9999409 0.01087204 0 0.9999409 0.03905421 0 0.9992371 0.01815161 0 0.9998353 0.007399703 0 0.9999725 0 0 0.9999999 0.01087204 0 0.9999409 0.007399703 0 0.9999725 0 0 0.9999999 -0.01777684 0 0.9998419 -0.01621746 0 0.9998683 -0.008715305 0 0.9999619 -0.007129905 0 0.9999745 -0.01621746 0 0.9998683 -0.00759102 0 0.9999711 -0.005242628 0 0.9999861 -0.008715305 0 0.9999619 -0.008715305 0 0.9999619 -0.005242628 0 0.9999861 -0.002541452 0 0.9999967 -0.004473673 0 0.9999899 -0.007129905 0 0.9999745 -0.008715305 0 0.9999619 -0.004473673 0 0.9999899 -0.003668674 0 0.9999931 0 0 0.9999999 0 0 0.9999999 -0.001409648 0 0.999999 -0.001559033 0 0.9999987 0 0 0.9999999 0 0 0.9999999 -6.11847e-4 0 0.9999997 -0.001409648 0 0.999999 -0.001409648 0 0.999999 -6.11847e-4 0 0.9999997 -0.002541452 0 0.9999967 -0.005242628 0 0.9999861 -0.001559033 0 0.9999987 -0.001409648 0 0.999999 -0.005242628 0 0.9999861 -0.00759102 0 0.9999711 0 0 0.9999999 -8.1654e-4 0 0.9999995 -0.001029179 0 0.9999993 0 0 0.9999999 -8.1654e-4 0 0.9999995 -0.003668674 0 0.9999931 -0.004473673 0 0.9999899 -0.001029179 0 0.9999993 -0.001029179 0 0.9999993 -0.004473673 0 0.9999899 -0.002541452 0 0.9999967 -6.11847e-4 0 0.9999997 0 0 0.9999999 -0.001029179 0 0.9999993 -6.11847e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.1630048 0 0.9866253 0.08789101 0 0.9961301 0.08889413 0 0.996041 0.1252108 0 0.9921301 0.08789101 0 0.9961301 0.04842307 0 0.9988269 0.04841468 0 0.9988273 0.08889413 0 0.996041 0.08889413 0 0.996041 0.04841468 0 0.9988273 0.02633659 0 0.9996532 0.03460037 0 0.9994012 0.1252108 0 0.9921301 0.08889413 0 0.996041 0.03460037 0 0.9994012 0.04876674 0 0.9988101 0 0 0.9999999 0 0 0.9999999 0.01337134 0 0.9999105 0.01358408 0 0.9999077 0 0 0.9999999 0 0 0.9999999 0.00343503 0 0.999994 0.01337134 0 0.9999105 0.01337134 0 0.9999105 0.00343503 0 0.999994 0.02633659 0 0.9996532 0.04841468 0 0.9988273 0.01358408 0 0.9999077 0.01337134 0 0.9999105 0.04841468 0 0.9988273 0.04842307 0 0.9988269 0 0 0.9999999 0.01099733 0 0.9999395 0.00657714 0 0.9999782 0 0 0.9999999 0.01099733 0 0.9999395 0.04876674 0 0.9988101 0.03460037 0 0.9994012 0.00657714 0 0.9999782 0.00657714 0 0.9999782 0.03460037 0 0.9994012 0.02633659 0 0.9996532 0.00343503 0 0.999994 0 0 0.9999999 0.00657714 0 0.9999782 0.00343503 0 0.999994 0 0 0.9999999 -0.2658116 0 0.9640249 -0.18693 0 0.9823732 -0.03867082 0 0.999252 -0.1463318 0 0.9892355 -0.18693 0 0.9823732 -0.01147528 0 0.9999342 0.02629973 0 0.9996541 -0.03867082 0 0.999252 -0.03867082 0 0.999252 0.02629973 0 0.9996541 0.002630634 0 0.9999965 -0.02969955 0 0.9995589 -0.1463318 0 0.9892355 -0.03867082 0 0.999252 -0.02969955 0 0.9995589 -0.03841943 0 0.9992617 0.1416503 0 0.9899167 0.09359992 0 0.9956099 0.08318508 0 0.9965339 0.07936099 0 0.9968459 0.09359992 0 0.9956099 0.02602642 0 0.9996612 0.02517726 0 0.999683 0.08318508 0 0.9965339 0.08318508 0 0.9965339 0.02517726 0 0.999683 0.002630634 0 0.9999965 0.02629973 0 0.9996541 0.07936099 0 0.9968459 0.08318508 0 0.9965339 0.02629973 0 0.9996541 -0.01147528 0 0.9999342 0 0 1 -0.006900885 0 0.9999761 -0.00109454 0 0.9999993 0.004746452 0 0.9999886 -0.006900885 0 0.9999761 -0.03841943 0 0.9992617 -0.02969955 0 0.9995589 -0.00109454 0 0.9999993 -0.00109454 0 0.9999993 -0.02969955 0 0.9995589 0.002630634 0 0.9999965 0.02517726 0 0.999683 0.004746452 0 0.9999886 -0.00109454 0 0.9999993 0.02517726 0 0.999683 0.02602642 0 0.9996612 0 0 1 0 0 0.9999999 -0.01050642 0 0.9999447 -0.006900885 0 0.9999761 0 0 0.9999999 0 0 0.9999999 -0.006523192 0 0.9999786 -0.01050642 0 0.9999447 -0.01050642 0 0.9999447 -0.006523192 0 0.9999786 -0.0326923 0 0.9994655 -0.04420554 0 0.9990224 -0.006900885 0 0.9999761 -0.01050642 0 0.9999447 -0.04420554 0 0.9990224 -0.03841943 0 0.9992617 0 0 0.9999999 -0.009124741 0 0.9999583 -0.01566195 0 0.9998772 0 0 0.9999999 -0.009124741 0 0.9999583 -0.04513282 0 0.998981 -0.05662812 0 0.9983953 -0.01566195 0 0.9998772 -0.01566195 0 0.9998772 -0.05662812 0 0.9983953 -0.0326923 0 0.9994655 -0.006523192 0 0.9999786 0 0 0.9999999 -0.01566195 0 0.9998772 -0.006523192 0 0.9999786 0 0 0.9999999 -0.2658116 0 0.9640249 -0.1463318 0 0.9892355 -0.1131744 0 0.9935751 -0.1026802 0 0.9947144 -0.1463318 0 0.9892355 -0.03841943 0 0.9992617 -0.04420554 0 0.9990224 -0.1131744 0 0.9935751 -0.1131744 0 0.9935751 -0.04420554 0 0.9990224 -0.0326923 0 0.9994655 -0.05662812 0 0.9983953 -0.1026802 0 0.9947144 -0.1131744 0 0.9935751 -0.05662812 0 0.9983953 -0.04513282 0 0.998981 0.2089785 0 0.9779201 0.07891143 0 0.9968816 0.09610583 0 0.9953711 0.1379957 0 0.9904327 0.07891143 0 0.9968816 0.03761338 0 0.9992922 0.04008304 0 0.9991964 0.09610583 0 0.9953711 0.09610583 0 0.9953711 0.04008304 0 0.9991964 0.03373304 0 0.9994309 0.04215658 0 0.9991111 0.1379957 0 0.9904327 0.09610583 0 0.9953711 0.04215658 0 0.9991111 0.04546124 0 0.9989662 -0.5805365 0 0.8142341 -0.2044379 0 0.9788796 -0.02056532 0 0.9997885 -0.03772387 0 0.9992881 -0.2044379 0 0.9788796 -0.06917343 0 0.9976047 -0.00497207 0 0.9999876 -0.02056532 0 0.9997885 -0.02056532 0 0.9997885 -0.00497207 0 0.9999876 0.03373304 0 0.9994309 0.04008304 0 0.9991964 -0.03772387 0 0.9992881 -0.02056532 0 0.9997885 0.04008304 0 0.9991964 0.03761338 0 0.9992922 0 0 0.9999999 0.008727993 0 0.999962 0.006841832 0 0.9999766 -0.01065558 0 0.9999432 0.008727993 0 0.999962 0.04546124 0 0.9989662 0.04215658 0 0.9991111 0.006841832 0 0.9999766 0.006841832 0 0.9999766 0.04215658 0 0.9991111 0.03373304 0 0.9994309 -0.00497207 0 0.9999876 -0.01065558 0 0.9999432 0.006841832 0 0.9999766 -0.00497207 0 0.9999876 -0.06917343 0 0.9976047 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.01414641 0 0.9998999 0.1254393 0 0.9921012 0.06583552 0 0.9978304 -0.06300398 0 0.9980133 0.1254393 0 0.9921012 0.05344427 0 0.9985709 0.04136616 0 0.999144 0.06583552 0 0.9978304 0.06583552 0 0.9978304 0.04136616 0 0.999144 0.02224584 0 0.9997525 0.03429677 0 0.9994117 -0.06300398 0 0.9980133 0.06583552 0 0.9978304 0.03429677 0 0.9994117 0.0118844 0 0.9999294 0 0 0.9999999 0 0 0.9999999 0.009339453 0 0.9999563 0.01088539 0 0.9999408 0 0 0.9999999 0 0 0.9999999 0.005242263 0 0.9999862 0.009339453 0 0.9999563 0.009339453 0 0.9999563 0.005242263 0 0.9999862 0.02224584 0 0.9997525 0.04136616 0 0.999144 0.01088539 0 0.9999408 0.009339453 0 0.9999563 0.04136616 0 0.999144 0.05344427 0 0.9985709 0 0 0.9999999 0.003479436 0 0.999994 0.01082852 0 0.9999413 0 0 0.9999999 0.003479436 0 0.999994 0.0118844 0 0.9999294 0.03429677 0 0.9994117 0.01082852 0 0.9999413 0.01082852 0 0.9999413 0.03429677 0 0.9994117 0.02224584 0 0.9997525 0.005242263 0 0.9999862 0 0 0.9999999 0.01082852 0 0.9999413 0.005242263 0 0.9999862 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.001309423 0 0.9999991 8.83638e-4 0 0.9999996 0 0 0.9999999 0 0 0.9999999 6.6592e-4 0 0.9999996 0.001309423 0 0.9999991 0.001309423 0 0.9999991 6.6592e-4 0 0.9999996 0.00271739 0 0.9999962 0.004634014 0 0.9999891 8.83638e-4 0 0.9999996 0.001309423 0 0.9999991 0.004634014 0 0.9999891 0.00381563 0 0.9999925 0 0 0.9999999 0.001630489 0 0.9999986 0.001696041 0 0.9999985 0 0 0.9999999 0.001630489 0 0.9999986 0.007638709 0 0.9999708 0.005717141 0 0.9999836 0.001696041 0 0.9999985 0.001696041 0 0.9999985 0.005717141 0 0.9999836 0.00271739 0 0.9999962 6.6592e-4 0 0.9999996 0 0 0.9999999 0.001696041 0 0.9999985 6.6592e-4 0 0.9999996 0 0 0.9999999 0.01777363 0 0.999842 0.007182671 0 0.9999742 0.008865798 0 0.9999606 0.01625975 0 0.9998677 0.007182671 0 0.9999742 0.00381563 0 0.9999925 0.004634014 0 0.9999891 0.008865798 0 0.9999606 0.008865798 0 0.9999606 0.004634014 0 0.9999891 0.00271739 0 0.9999962 0.005717141 0 0.9999836 0.01625975 0 0.9998677 0.008865798 0 0.9999606 0.005717141 0 0.9999836 0.007638709 0 0.9999708 0 0 0.9999999 0 0 0.9999999 -0.01018488 0 0.999948 -0.007571489 0 0.9999713 0 0 0.9999999 0 0 0.9999999 -0.007095892 0 0.9999747 -0.01018488 0 0.999948 -0.01018488 0 0.999948 -0.007095892 0 0.9999747 -0.01846432 0 0.9998295 -0.03827045 0 0.9992674 -0.007571489 0 0.9999713 -0.01018488 0 0.999948 -0.03827045 0 0.9992674 -0.03462208 0 0.9994004 0 0 0.9999999 -0.01091461 0 0.9999405 -0.007912059 0 0.9999685 0 0 1 -0.01091461 0 0.9999405 -0.0412523 0 0.9991488 -0.03445369 0 0.9994062 -0.007912059 0 0.9999685 -0.007912059 0 0.9999685 -0.03445369 0 0.9994062 -0.01846432 0 0.9998295 -0.007095892 0 0.9999747 0 0 1 -0.007912059 0 0.9999685 -0.007095892 0 0.9999747 0 0 0.9999999 -0.07385101 0 0.9972693 -0.06775764 0 0.9977018 -0.06254167 0 0.9980423 -0.07647336 0 0.9970716 -0.06775764 0 0.9977018 -0.03462208 0 0.9994004 -0.03827045 0 0.9992674 -0.06254167 0 0.9980423 -0.06254167 0 0.9980423 -0.03827045 0 0.9992674 -0.01846432 0 0.9998295 -0.03445369 0 0.9994062 -0.07647336 0 0.9970716 -0.06254167 0 0.9980423 -0.03445369 0 0.9994062 -0.0412523 0 0.9991488 0 0 0.9999999 0 0 0.9999999 -0.007334393 0 0.9999729 -0.01129657 0 0.9999362 0 0 0.9999999 0 0 0.9999999 -0.003146685 0 0.999995 -0.007334393 0 0.9999729 -0.007334393 0 0.9999729 -0.003146685 0 0.999995 -0.02477889 0 0.999693 -0.03503535 0 0.9993861 -0.01129657 0 0.9999362 -0.007334393 0 0.9999729 -0.03503535 0 0.9993861 -0.04927828 0 0.998785 0 0 0.9999999 -0.01333587 0 0.9999111 -0.007344898 0 0.9999729 0 0 0.9999999 -0.01333587 0 0.9999111 -0.05024467 0 0.9987369 -0.04078917 0 0.9991677 -0.007344898 0 0.9999729 -0.007344898 0 0.9999729 -0.04078917 0 0.9991677 -0.02477889 0 0.999693 -0.003146685 0 0.999995 0 0 0.9999999 -0.007344898 0 0.9999729 -0.003146685 0 0.999995 0 0 0.9999999 -0.1630066 0 0.986625 -0.1249821 0 0.992159 -0.0875262 0 0.9961622 -0.08626293 0 0.9962724 -0.1249821 0 0.992159 -0.04927828 0 0.998785 -0.03503535 0 0.9993861 -0.0875262 0 0.9961622 -0.0875262 0 0.9961622 -0.03503535 0 0.9993861 -0.02477889 0 0.999693 -0.04078917 0 0.9991677 -0.08626293 0 0.9962724 -0.0875262 0 0.9961622 -0.04078917 0 0.9991677 -0.05024467 0 0.9987369 0 0 0.9999999 -0.01129657 0 0.9999362 -0.007531486 0 0.9999716 -0.004667322 0 0.999989 -0.01129657 0 0.9999362 -0.04927828 0 0.998785 -0.0390762 0 0.9992363 -0.007531486 0 0.9999716 -0.007531486 0 0.9999716 -0.0390762 0 0.9992363 -0.01380591 0 0.9999047 -0.001978053 0 0.999998 -0.004667322 0 0.999989 -0.007531486 0 0.9999716 -0.001978053 0 0.999998 -0.02129061 0 0.9997733 -0.1630066 0 0.986625 -0.1481373 0 0.9889668 -0.08583839 0 0.996309 -0.1249821 0 0.992159 -0.1481373 0 0.9889668 -0.05837213 0 0.9982949 -0.03399518 0 0.999422 -0.08583839 0 0.996309 -0.08583839 0 0.996309 -0.03399518 0 0.999422 -0.01380591 0 0.9999047 -0.0390762 0 0.9992363 -0.1249821 0 0.992159 -0.08583839 0 0.996309 -0.0390762 0 0.9992363 -0.04927828 0 0.998785 -0.06343322 0 0.9979861 -0.07481553 0 0.9971974 0.0143708 0 0.9998968 0.04023624 0 0.9991902 -0.07481553 0 0.9971974 -0.02129061 0 0.9997733 -0.001978053 0 0.999998 0.0143708 0 0.9998968 0.0143708 0 0.9998968 -0.001978053 0 0.999998 -0.01380591 0 0.9999047 -0.03399518 0 0.999422 0.04023624 0 0.9991902 0.0143708 0 0.9998968 -0.03399518 0 0.999422 -0.05837213 0 0.9982949 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.001173148 0 0.9999992 -0.002858372 0 0.9999958 0 0 0.9999999 0 0 0.9999999 8.33692e-4 0 0.9999995 -0.001173148 0 0.9999992 -0.001173148 0 0.9999992 8.33692e-4 0 0.9999995 8.92006e-4 0 0.9999996 -0.001377703 0 0.9999989 -0.002858372 0 0.9999958 -0.001173148 0 0.9999992 -0.001377703 0 0.9999989 -0.01182358 0 0.99993 0 0 0.9999999 8.9633e-4 0 0.9999995 -8.14643e-4 0 0.9999995 0 0 0.9999999 8.9633e-4 0 0.9999995 6.69192e-4 0 0.9999997 -6.04271e-4 0 0.9999998 -8.14643e-4 0 0.9999995 -8.14643e-4 0 0.9999995 -6.04271e-4 0 0.9999998 8.92006e-4 0 0.9999996 8.33692e-4 0 0.9999995 0 0 0.9999999 -8.14643e-4 0 0.9999995 8.33692e-4 0 0.9999995 0 0 0.9999999 -0.07385101 0 0.9972693 -0.03379725 0 0.9994286 -0.00421264 0 0.999991 -0.004060555 0 0.9999917 -0.03379725 0 0.9994286 -0.01182358 0 0.99993 -0.001377703 0 0.9999989 -0.00421264 0 0.999991 -0.00421264 0 0.999991 -0.001377703 0 0.9999989 8.92006e-4 0 0.9999996 -6.04271e-4 0 0.9999998 -0.004060555 0 0.9999917 -0.00421264 0 0.999991 -6.04271e-4 0 0.9999998 6.69192e-4 0 0.9999997 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0.2702362 0 0.9627939 0.1024874 0 0.9947343 0.1137177 0 0.9935131 0.1479498 0 0.988995 0.1024874 0 0.9947343 0.04505339 0 0.9989846 0.05652144 0 0.9984015 0.1137177 0 0.9935131 0.1137177 0 0.9935131 0.05652144 0 0.9984015 0.03277442 0 0.9994628 0.04411555 0 0.9990264 0.1479498 0 0.988995 0.1137177 0 0.9935131 0.04411555 0 0.9990264 0.03820039 0 0.99927 0 0 0.9999999 0 0 0.9999999 0.01564982 0 0.9998775 0.00911695 0 0.9999584 0 0 0.9999999 0 0 0.9999999 0.006562142 0 0.9999784 0.01564982 0 0.9998775 0.01564982 0 0.9998775 0.006562142 0 0.9999784 0.03277442 0 0.9994628 0.05652144 0 0.9984015 0.00911695 0 0.9999584 0.01564982 0 0.9998775 0.05652144 0 0.9984015 0.04505339 0 0.9989846 0 0 1 0.006876811 0 0.9999763 0.01049327 0 0.9999448 0 0 0.9999999 0.006876811 0 0.9999763 0.03820039 0 0.99927 0.04411555 0 0.9990264 0.01049327 0 0.9999448 0.01049327 0 0.9999448 0.04411555 0 0.9990264 0.03277442 0 0.9994628 0.006562142 0 0.9999784 0 0 0.9999999 0.01049327 0 0.9999448 0.006562142 0 0.9999784 0 0 0.9999999 0.08907486 0 0.9960249 -0.09005485 0 0.9959368 -0.06003591 0 0.9981961 -0.06502486 0 0.9978836 -0.09005485 0 0.9959368 -0.04793487 0 0.9988505 -0.0381608 0 0.9992715 -0.06003591 0 0.9981961 -0.06003591 0 0.9981961 -0.0381608 0 0.9992715 -0.02083465 0 0.9997829 -0.03373305 0 0.9994308 -0.06502486 0 0.9978836 -0.06003591 0 0.9981961 -0.03373305 0 0.9994308 -0.02884793 0 0.9995838 0 0 0.9999999 0 0 0.9999999 -0.009512697 0 0.9999546 -0.01112464 0 0.9999381 0 0 0.9999999 0 0 0.9999999 -0.006580357 0 0.9999784 -0.009512697 0 0.9999546 -0.009512697 0 0.9999546 -0.006580357 0 0.9999784 -0.02083465 0 0.9997829 -0.0381608 0 0.9992715 -0.01112464 0 0.9999381 -0.009512697 0 0.9999546 -0.0381608 0 0.9992715 -0.04793487 0 0.9988505 0 0 0.9999999 -0.007368226 0 0.9999729 -0.008729458 0 0.9999618 0 0 0.9999999 -0.007368226 0 0.9999729 -0.02884793 0 0.9995838 -0.03373305 0 0.9994308 -0.008729458 0 0.9999618 -0.008729458 0 0.9999618 -0.03373305 0 0.9994308 -0.02083465 0 0.9997829 -0.006580357 0 0.9999784 0 0 0.9999999 -0.008729458 0 0.9999618 -0.006580357 0 0.9999784 0 0 0.9999999 0.03569141 0 0.9993628 0.03174221 0 0.999496 0.0182357 0 0.9998336 0.01594856 0 0.9998729 0.03174221 0 0.999496 0.01398828 0 0.9999021 0.01101162 0 0.9999392 0.0182357 0 0.9998336 0.0182357 0 0.9998336 0.01101162 0 0.9999392 0.005812396 0 0.999983 0.009833841 0 0.9999515 0.01594856 0 0.9998729 0.0182357 0 0.9998336 0.009833841 0 0.9999515 0.008157766 0 0.9999667 0 0 0.9999999 0 0 0.9999999 0.002573114 0 0.9999966 0.003463313 0 0.9999939 0 0 0.9999999 0 0 1 0.001424399 0 0.9999989 0.002573114 0 0.9999966 0.002573114 0 0.9999966 0.001424399 0 0.9999989 0.005812396 0 0.999983 0.01101162 0 0.9999392 0.003463313 0 0.9999939 0.002573114 0 0.9999966 0.01101162 0 0.9999392 0.01398828 0 0.9999021 0 0 1 0.001894853 0 0.9999982 0.002432875 0 0.9999969 0 0 0.9999999 0.001894853 0 0.9999982 0.008157766 0 0.9999667 0.009833841 0 0.9999515 0.002432875 0 0.9999969 0.002432875 0 0.9999969 0.009833841 0 0.9999515 0.005812396 0 0.999983 0.001424399 0 0.9999989 0 0 0.9999999 0.002432875 0 0.9999969 0.001424399 0 0.9999989 0 0 1 0 0 1 0 0 0.9999999 -0.003020861 0 0.9999954 -0.001960248 0 0.9999981 0 0 0.9999999 0 0 1 -0.001247587 0 0.999999 -0.003020861 0 0.9999954 -0.003020861 0 0.9999954 -0.001247587 0 0.999999 -0.006098703 0 0.9999813 -0.01038407 0 0.9999459 -0.001960248 0 0.9999981 -0.003020861 0 0.9999954 -0.01038407 0 0.9999459 -0.00861612 0 0.9999627 0 0 0.9999999 -0.003779348 0 0.9999927 -0.002734165 0 0.9999961 0 0 0.9999999 -0.003779348 0 0.9999927 -0.01522411 0 0.999884 -0.01180049 0 0.9999301 -0.002734165 0 0.9999961 -0.002734165 0 0.9999961 -0.01180049 0 0.9999301 -0.006098703 0 0.9999813 -0.001247587 0 0.999999 0 0 0.9999999 -0.002734165 0 0.9999961 -0.001247587 0 0.999999 0 0 1 -0.03161101 0 0.9995002 -0.02308309 0 0.9997335 -0.01956217 0 0.9998085 -0.03434673 0 0.9994099 -0.02308309 0 0.9997335 -0.00861612 0 0.9999627 -0.01038407 0 0.9999459 -0.01956217 0 0.9998085 -0.01956217 0 0.9998085 -0.01038407 0 0.9999459 -0.006098703 0 0.9999813 -0.01180049 0 0.9999301 -0.03434673 0 0.9994099 -0.01956217 0 0.9998085 -0.01180049 0 0.9999301 -0.01522411 0 0.999884 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.08907486 0 0.9960249 0.7231295 0 0.6907125 0.3249589 0 0.9457282 -0.0271926 0 0.99963 0.7231295 0 0.6907125 0.5654159 0 0.8248059 0.4121766 0 0.9111039 0.3249589 0 0.9457282 0.3249589 0 0.9457282 0.4121766 0 0.9111039 0.1881148 0 0.982147 0.06055092 0 0.9981651 -0.0271926 0 0.99963 0.3249589 0 0.9457282 0.06055092 0 0.9981651 -0.009882521 0 0.9999511 0.580551 0 0.8142238 0.2053438 0 0.9786899 0.4702628 0 0.8825265 0.7268404 0 0.6868064 0.2053438 0 0.9786899 0.0707936 0 0.9974909 0.1355713 0 0.9907676 0.4702628 0 0.8825265 0.4702628 0 0.8825265 0.1355713 0 0.9907676 0.1881148 0 0.982147 0.4121766 0 0.9111039 0.7268404 0 0.6868064 0.4702628 0 0.8825265 0.4121766 0 0.9111039 0.5654159 0 0.8248059 0 0 0.9999999 -0.003361032 0 0.9999944 0.03312466 0 0.9994512 0.01133724 0 0.9999357 -0.003361032 0 0.9999944 -0.009882521 0 0.9999511 0.06055092 0 0.9981651 0.03312466 0 0.9994512 0.03312466 0 0.9994512 0.06055092 0 0.9981651 0.1881148 0 0.982147 0.1355713 0 0.9907676 0.01133724 0 0.9999357 0.03312466 0 0.9994512 0.1355713 0 0.9907676 0.0707936 0 0.9974909 0 0 0.9999999 0.01133724 0 0.9999357 -0.006393901 0 0.9999796 -0.009135833 0 0.9999583 0.01133724 0 0.9999357 0.0707936 0 0.9974909 0.006318056 0 0.9999801 -0.006393901 0 0.9999796 -0.006393901 0 0.9999796 0.006318056 0 0.9999801 -0.03344896 0 0.9994404 -0.04216035 0 0.9991108 -0.009135833 0 0.9999583 -0.006393901 0 0.9999796 -0.04216035 0 0.9991108 -0.04647734 0 0.9989194 0.580551 0 0.8142238 0.03773092 0 0.999288 0.02159581 0 0.9997668 0.2053438 0 0.9786899 0.03773092 0 0.999288 -0.037614 0 0.9992923 -0.03968649 0 0.9992121 0.02159581 0 0.9997668 0.02159581 0 0.9997668 -0.03968649 0 0.9992121 -0.03344896 0 0.9994404 0.006318056 0 0.9999801 0.2053438 0 0.9786899 0.02159581 0 0.9997668 0.006318056 0 0.9999801 0.0707936 0 0.9974909 -0.2089728 0 0.9779214 -0.1385369 0 0.9903573 -0.09610208 0 0.9953714 -0.07890324 0 0.9968822 -0.1385369 0 0.9903573 -0.04647734 0 0.9989194 -0.04216035 0 0.9991108 -0.09610208 0 0.9953714 -0.09610208 0 0.9953714 -0.04216035 0 0.9991108 -0.03344896 0 0.9994404 -0.03968649 0 0.9992121 -0.07890324 0 0.9968822 -0.09610208 0 0.9953714 -0.03968649 0 0.9992121 -0.037614 0 0.9992923 0 0 0.9999999 0 0 0.9999999 -0.01004224 0 0.9999495 -0.003361032 0 0.9999944 0 0 0.9999999 0 0 0.9999999 -0.006007153 0 0.9999818 -0.01004224 0 0.9999495 -0.01004224 0 0.9999495 -0.006007153 0 0.9999818 -0.01835719 0 0.9998315 -0.03101835 0 0.9995188 -0.003361032 0 0.9999944 -0.01004224 0 0.9999495 -0.03101835 0 0.9995188 -0.009882521 0 0.9999511 0 0 0.9999999 -0.01112464 0 0.9999381 -0.01137518 0 0.9999353 0 0 0.9999999 -0.01112464 0 0.9999381 -0.04793487 0 0.9988505 -0.03907781 0 0.9992362 -0.01137518 0 0.9999353 -0.01137518 0 0.9999353 -0.03907781 0 0.9992362 -0.01835719 0 0.9998315 -0.006007153 0 0.9999818 0 0 0.9999999 -0.01137518 0 0.9999353 -0.006007153 0 0.9999818 0 0 0.9999999 0.08907486 0 0.9960249 -0.0271926 0 0.99963 -0.05295497 0 0.9985968 -0.09005485 0 0.9959368 -0.0271926 0 0.99963 -0.009882521 0 0.9999511 -0.03101835 0 0.9995188 -0.05295497 0 0.9985968 -0.05295497 0 0.9985968 -0.03101835 0 0.9995188 -0.01835719 0 0.9998315 -0.03907781 0 0.9992362 -0.09005485 0 0.9959368 -0.05295497 0 0.9985968 -0.03907781 0 0.9992362 -0.04793487 0 0.9988505 0 0 0.9999999 0 0 0.9999999 0.006089598 0 0.9999813 0.003107944 0 0.9999951 0 0 0.9999999 0 0 0.9999999 0.006309644 0 0.99998 0.006089598 0 0.9999813 0.006089598 0 0.9999813 0.006309644 0 0.99998 0.02275817 0 0.999741 0.02335703 0 0.9997271 0.003107944 0 0.9999951 0.006089598 0 0.9999813 0.02335703 0 0.9997271 0.01239903 0 0.9999231 0 0 0.9999999 0.009843873 0 0.9999514 0.00897592 0 0.9999596 0 0 0.9999999 0.009843873 0 0.9999514 0.03914398 0 0.9992335 0.03626305 0 0.9993422 0.00897592 0 0.9999596 0.00897592 0 0.9999596 0.03626305 0 0.9993422 0.02275817 0 0.999741 0.006309644 0 0.99998 0 0 0.9999999 0.00897592 0 0.9999596 0.006309644 0 0.99998 0 0 0.9999999 0.07383942 0 0.9972701 0.03399623 0 0.999422 0.03978431 0 0.9992082 0.07185352 0 0.9974152 0.03399623 0 0.999422 0.01239903 0 0.9999231 0.02335703 0 0.9997271 0.03978431 0 0.9992082 0.03978431 0 0.9992082 0.02335703 0 0.9997271 0.02275817 0 0.999741 0.03626305 0 0.9993422 0.07185352 0 0.9974152 0.03978431 0 0.9992082 0.03626305 0 0.9993422 0.03914398 0 0.9992335 0 0 0.9999999 0.01358408 0 0.9999077 0.01789687 0 0.9998398 0.00960328 0 0.9999537 0.01358408 0 0.9999077 0.04842307 0 0.9988269 0.05181414 0 0.9986568 0.01789687 0 0.9998398 0.01789687 0 0.9998398 0.05181414 0 0.9986568 0.05998495 0 0.9981992 0.03920045 0 0.9992313 0.00960328 0 0.9999537 0.01789687 0 0.9998398 0.03920045 0 0.9992313 0.03612855 0 0.9993471 0.1630048 0 0.9866253 0.1213652 0 0.9926079 0.08939228 0 0.9959965 0.08789101 0 0.9961301 0.1213652 0 0.9926079 0.1195514 0 0.9928281 0.09795706 0 0.9951906 0.08939228 0 0.9959965 0.08939228 0 0.9959965 0.09795706 0 0.9951906 0.05998495 0 0.9981992 0.05181414 0 0.9986568 0.08789101 0 0.9961301 0.08939228 0 0.9959965 0.05181414 0 0.9986568 0.04842307 0 0.9988269 0.07383942 0 0.9972701 0.06821707 0 0.9976705 0.06884848 0 0.9976271 0.07221147 0 0.9973894 0.06821707 0 0.9976705 0.03612855 0 0.9993471 0.03920045 0 0.9992313 0.06884848 0 0.9976271 0.06884848 0 0.9976271 0.03920045 0 0.9992313 0.05998495 0 0.9981992 0.09795706 0 0.9951906 0.07221147 0 0.9973894 0.06884848 0 0.9976271 0.09795706 0 0.9951906 0.1195514 0 0.9928281 0 0 0.9999999 -0.009135833 0 0.9999583 -0.007347545 0 0.9999729 -8.1654e-4 0 0.9999995 -0.009135833 0 0.9999583 -0.04647734 0 0.9989194 -0.0307632 0 0.9995267 -0.007347545 0 0.9999729 -0.007347545 0 0.9999729 -0.0307632 0 0.9995267 -0.02896833 0 0.9995803 -0.006300821 0 0.99998 -8.1654e-4 0 0.9999995 -0.007347545 0 0.9999729 -0.006300821 0 0.99998 -0.003668674 0 0.9999931 -0.2089728 0 0.9779214 -0.1594323 0 0.9872088 -0.06852219 0 0.9976497 -0.1385369 0 0.9903573 -0.1594323 0 0.9872088 -0.05854203 0 0.9982848 -0.03181947 0 0.9994936 -0.06852219 0 0.9976497 -0.06852219 0 0.9976497 -0.03181947 0 0.9994936 -0.02896833 0 0.9995803 -0.0307632 0 0.9995267 -0.1385369 0 0.9903573 -0.06852219 0 0.9976497 -0.0307632 0 0.9995267 -0.04647734 0 0.9989194 -0.01777684 0 0.9998419 -0.007129905 0 0.9999745 -0.01046563 0 0.9999451 -0.01221242 0 0.9999254 -0.007129905 0 0.9999745 -0.003668674 0 0.9999931 -0.006300821 0 0.99998 -0.01046563 0 0.9999451 -0.01046563 0 0.9999451 -0.006300821 0 0.99998 -0.02896833 0 0.9995803 -0.03181947 0 0.9994936 -0.01221242 0 0.9999254 -0.01046563 0 0.9999451 -0.03181947 0 0.9994936 -0.05854203 0 0.9982848 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 -0.007723338 0 0.9999701 -0.01454927 0 0.9998941 0.004544858 0 0.9999896 -0.007723338 0 0.9999701 -0.04422333 0 0.9990216 -0.06453053 0 0.9979156 -0.01454927 0 0.9998941 -0.01454927 0 0.9998941 -0.06453053 0 0.9979156 -0.04700706 0 0.9988945 0.01744856 0 0.9998477 0.004544858 0 0.9999896 -0.01454927 0 0.9998941 0.01744856 0 0.9998477 0.02082664 0 0.9997832 -0.2351678 0 0.9719548 -0.2476946 0 0.9688381 -0.1909879 0 0.9815924 -0.1011088 0 0.9948754 -0.2476946 0 0.9688381 -0.01664593 0 0.9998615 -0.05289462 0 0.9986 -0.1909879 0 0.9815924 -0.1909879 0 0.9815924 -0.05289462 0 0.9986 -0.04700706 0 0.9988945 -0.06453053 0 0.9979156 -0.1011088 0 0.9948754 -0.1909879 0 0.9815924 -0.06453053 0 0.9979156 -0.04422333 0 0.9990216 0.06344319 0 0.9979854 0.07449818 0 0.9972212 0.0618348 0 0.9980863 0.1452553 0 0.9893941 0.07449818 0 0.9972212 0.02082664 0 0.9997832 0.01744856 0 0.9998477 0.0618348 0 0.9980863 0.0618348 0 0.9980863 0.01744856 0 0.9998477 -0.04700706 0 0.9988945 -0.05289462 0 0.9986 0.1452553 0 0.9893941 0.0618348 0 0.9980863 -0.05289462 0 0.9986 -0.01664593 0 0.9998615 0.06344319 0 0.9979854 -0.04023587 0 0.9991902 -0.01466506 0 0.9998924 0.07449818 0 0.9972212 -0.04023587 0 0.9991902 0.05838001 0 0.9982944 0.03400599 0 0.9994217 -0.01466506 0 0.9998924 -0.01466506 0 0.9998924 0.03400599 0 0.9994217 0.01354959 0 0.9999081 0.001408599 0 0.9999989 0.07449818 0 0.9972212 -0.01466506 0 0.9998924 0.001408599 0 0.9999989 0.02082664 0 0.9997832 0.1630048 0 0.9866253 0.1252108 0 0.9921301 0.08600257 0 0.9962948 0.1481365 0 0.9889669 0.1252108 0 0.9921301 0.04876674 0 0.9988101 0.03911935 0 0.9992345 0.08600257 0 0.9962948 0.08600257 0 0.9962948 0.03911935 0 0.9992345 0.01354959 0 0.9999081 0.03400599 0 0.9994217 0.1481365 0 0.9889669 0.08600257 0 0.9962948 0.03400599 0 0.9994217 0.05838001 0 0.9982944 0 0 0.9999999 0.004544858 0 0.9999896 0.00708117 0 0.9999749 0.01099733 0 0.9999395 0.004544858 0 0.9999896 0.02082664 0 0.9997832 0.001408599 0 0.9999989 0.00708117 0 0.9999749 0.00708117 0 0.9999749 0.001408599 0 0.9999989 0.01354959 0 0.9999081 0.03911935 0 0.9992345 0.01099733 0 0.9999395 0.00708117 0 0.9999749 0.03911935 0 0.9992345 0.04876674 0 0.9988101</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape7-textangents-array" count="2400" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape7-texbinormals">
+ <float_array id="qt_gauge_background_Shape7-texbinormals-array" count="7200">0.999842 0 0.01777685 0.9998888 0 0.01491136 0.9999201 0 0.01264451 0.9998686 0 0.01621746 0.9998888 0 0.01491136 0.9999746 0 0.007127264 0.9999502 0 0.009981532 0.9999201 0 0.01264451 0.9999201 0 0.01264451 0.9999502 0 0.009981532 0.9999701 0 0.007727782 0.999946 0 0.0103981 0.9998686 0 0.01621746 0.9999201 0 0.01264451 0.999946 0 0.0103981 0.9999713 0 0.007591022 0.9719549 0 0.2351678 0.9948754 0 0.1011088 0.9997948 0 0.02025607 0.9996481 0 0.02653047 0.9948754 0 0.1011088 0.9990218 0 0.04422333 0.9999331 0 0.01156389 0.9997948 0 0.02025607 0.9997948 0 0.02025607 0.9999331 0 0.01156389 0.9999701 0 0.007727782 0.9999502 0 0.009981532 0.9996481 0 0.02653047 0.9997948 0 0.02025607 0.9999502 0 0.009981532 0.9999746 0 0.007127264 1 0 0 0.9999988 0 0.001559034 0.9999939 0 0.003528928 0.9999703 0 0.007723339 0.9999988 0 0.001559034 0.9999713 0 0.007591022 0.999946 0 0.0103981 0.9999939 0 0.003528928 0.9999939 0 0.003528928 0.999946 0 0.0103981 0.9999701 0 0.007727782 0.9999331 0 0.01156389 0.9999703 0 0.007723339 0.9999939 0 0.003528928 0.9999331 0 0.01156389 0.9990218 0 0.04422333 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999433 0 0.01065559 0.9994548 0 0.03301682 0.999994 0 -0.003479436 0.9999433 0 0.01065559 0.9976047 0 0.06917343 0.9908547 0 0.1349337 0.9994548 0 0.03301682 0.9994548 0 0.03301682 0.9908547 0 0.1349337 0.9821262 0 0.1882236 0.9980509 0 0.06240512 0.999994 0 -0.003479436 0.9994548 0 0.03301682 0.9980509 0 0.06240512 0.9999294 0 -0.0118844 0.8142342 0 0.5805366 0.6868036 0 0.7268431 0.8826699 0 0.4699934 0.9788796 0 0.2044379 0.6868036 0 0.7268431 0.8248081 0 0.5654129 0.9111183 0 0.412145 0.8826699 0 0.4699934 0.8826699 0 0.4699934 0.9111183 0 0.412145 0.9821262 0 0.1882236 0.9908547 0 0.1349337 0.9788796 0 0.2044379 0.8826699 0 0.4699934 0.9908547 0 0.1349337 0.9976047 0 0.06917343 0.9999 0 0.01414641 0.9980134 0 0.06300399 0.9702069 0 0.2422782 0.8888421 0 0.4582136 0.9980134 0 0.06300399 0.9999294 0 -0.0118844 0.9980509 0 0.06240512 0.9702069 0 0.2422782 0.9702069 0 0.2422782 0.9980509 0 0.06240512 0.9821262 0 0.1882236 0.9111183 0 0.412145 0.8888421 0 0.4582136 0.9702069 0 0.2422782 0.9111183 0 0.412145 0.8248081 0 0.5654129 0.9998421 0 -0.01777363 0.9999254 0 -0.01221946 0.9999459 0 -0.01040355 0.9999742 0 -0.007182671 0.9999254 0 -0.01221946 0.9982839 0 -0.05856191 0.9994999 0 -0.03162334 0.9999459 0 -0.01040355 0.9999459 0 -0.01040355 0.9994999 0 -0.03162334 0.9995953 0 -0.02845043 0.9999814 0 -0.006114918 0.9999742 0 -0.007182671 0.9999459 0 -0.01040355 0.9999814 0 -0.006114918 0.9999927 0 -0.00381563 0.9779203 0 -0.2089785 0.9904329 0 -0.1379958 0.9976946 0 -0.06786442 0.9872099 0 -0.1594262 0.9904329 0 -0.1379958 0.9989662 0 -0.04546124 0.9995553 0 -0.02981836 0.9976946 0 -0.06786442 0.9976946 0 -0.06786442 0.9995553 0 -0.02981836 0.9995953 0 -0.02845043 0.9994999 0 -0.03162334 0.9872099 0 -0.1594262 0.9976946 0 -0.06786442 0.9994999 0 -0.03162334 0.9982839 0 -0.05856191 1 0 0 0.9999997 0 -8.83638e-4 0.9999753 0 -0.007034343 0.999962 0 -0.008727993 0.9999997 0 -8.83638e-4 0.9999927 0 -0.00381563 0.9999814 0 -0.006114918 0.9999753 0 -0.007034343 0.9999753 0 -0.007034343 0.9999814 0 -0.006114918 0.9995953 0 -0.02845043 0.9995553 0 -0.02981836 0.999962 0 -0.008727993 0.9999753 0 -0.007034343 0.9995553 0 -0.02981836 0.9989662 0 -0.04546124 0.9972693 0 0.07385101 0.9973876 0 0.07223602 0.9976944 0 0.067868 0.9977018 0 0.06775764 0.9973876 0 0.07223602 0.9928318 0 0.1195197 0.9953066 0 0.09677189 0.9976944 0 0.067868 0.9976944 0 0.067868 0.9953066 0 0.09677189 0.9983965 0 0.05660855 0.999314 0 0.03703496 0.9977018 0 0.06775764 0.9976944 0 0.067868 0.999314 0 0.03703496 0.9994006 0 0.03462208 0.9866251 0 0.1630066 0.9962724 0 0.08626293 0.9962084 0 0.08699924 0.9926099 0 0.1213493 0.9962724 0 0.08626293 0.9987369 0 0.05024467 0.9988829 0 0.04725455 0.9962084 0 0.08699924 0.9962084 0 0.08699924 0.9988829 0 0.04725455 0.9983965 0 0.05660855 0.9953066 0 0.09677189 0.9926099 0 0.1213493 0.9962084 0 0.08699924 0.9953066 0 0.09677189 0.9928318 0 0.1195197 1 0 0 0.9999713 0 0.007571489 0.9998282 0 0.01853479 0.9999111 0 0.01333587 0.9999713 0 0.007571489 0.9994006 0 0.03462208 0.999314 0 0.03703496 0.9998282 0 0.01853479 0.9998282 0 0.01853479 0.999314 0 0.03703496 0.9983965 0 0.05660855 0.9988829 0 0.04725455 0.9999111 0 0.01333587 0.9998282 0 0.01853479 0.9988829 0 0.04725455 0.9987369 0 0.05024467 0.9719565 0 -0.2351608 0.9996482 0 -0.02652793 0.9997705 0 -0.02142298 0.9947894 0 -0.1019518 0.9996482 0 -0.02652793 0.9999747 0 -0.007111776 0.9999445 0 -0.01054469 0.9997705 0 -0.02142298 0.9997705 0 -0.02142298 0.9999445 0 -0.01054469 0.9999629 0 -0.008618303 0.9999105 0 -0.01337571 0.9947894 0 -0.1019518 0.9997705 0 -0.02142298 0.9999105 0 -0.01337571 0.9989433 0 -0.04596046 0.9998421 0 -0.01777363 0.9998678 0 -0.01625975 0.9999189 0 -0.01273503 0.9998891 0 -0.01489621 0.9998678 0 -0.01625975 0.9999709 0 -0.00763871 0.9999533 0 -0.009676596 0.9999189 0 -0.01273503 0.9999189 0 -0.01273503 0.9999533 0 -0.009676596 0.9999629 0 -0.008618303 0.9999445 0 -0.01054469 0.9998891 0 -0.01489621 0.9999189 0 -0.01273503 0.9999445 0 -0.01054469 0.9999747 0 -0.007111776 1 0 0 0.999964 0 -0.008492883 0.9999905 0 -0.004376017 0.9999987 0 -0.001630489 0.999964 0 -0.008492883 0.9989433 0 -0.04596046 0.9999105 0 -0.01337571 0.9999905 0 -0.004376017 0.9999905 0 -0.004376017 0.9999105 0 -0.01337571 0.9999629 0 -0.008618303 0.9999533 0 -0.009676596 0.9999987 0 -0.001630489 0.9999905 0 -0.004376017 0.9999533 0 -0.009676596 0.9999709 0 -0.00763871 0.9979861 0 0.06343322 0.9893953 0 0.1452481 0.9980879 0 0.06181137 0.9971974 0 0.07481553 0.9893953 0 0.1452481 0.9998613 0 -0.01665534 0.9985924 0 -0.05304074 0.9980879 0 0.06181137 0.9980879 0 0.06181137 0.9985924 0 -0.05304074 0.9988894 0 -0.04711699 0.9998507 0 0.01728258 0.9971974 0 0.07481553 0.9980879 0 0.06181137 0.9998507 0 0.01728258 0.9997733 0 0.02129061 0.9719565 0 -0.2351608 0.9947894 0 -0.1019518 0.9815481 0 -0.1912157 0.9688404 0 -0.2476862 0.9947894 0 -0.1019518 0.9989433 0 -0.04596046 0.9978796 0 -0.06508702 0.9815481 0 -0.1912157 0.9815481 0 -0.1912157 0.9978796 0 -0.06508702 0.9988894 0 -0.04711699 0.9985924 0 -0.05304074 0.9688404 0 -0.2476862 0.9815481 0 -0.1912157 0.9985924 0 -0.05304074 0.9998613 0 -0.01665534 1 0 0 0.9999892 0 0.004667323 0.9998866 0 -0.01505736 0.999964 0 -0.008492883 0.9999892 0 0.004667323 0.9997733 0 0.02129061 0.9998507 0 0.01728258 0.9998866 0 -0.01505736 0.9998866 0 -0.01505736 0.9998507 0 0.01728258 0.9988894 0 -0.04711699 0.9978796 0 -0.06508702 0.999964 0 -0.008492883 0.9998866 0 -0.01505736 0.9978796 0 -0.06508702 0.9989433 0 -0.04596046 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9972693 0 0.07385101 0.9970716 0 0.07647336 0.999077 0 0.0429572 0.9994287 0 0.03379725 0.9970716 0 0.07647336 0.9991488 0 0.0412523 0.9995291 0 0.03068673 0.999077 0 0.0429572 0.999077 0 0.0429572 0.9995291 0 0.03068673 0.9997324 0 0.02313422 0.9997293 0 0.02326887 0.9994287 0 0.03379725 0.999077 0 0.0429572 0.9997293 0 0.02326887 0.9999301 0 0.01182358 1 0 0 1 0 0 0.999939 0 0.01105748 0.9999405 0 0.01091461 1 0 0 1 0 0 0.9999859 0 0.005302904 0.999939 0 0.01105748 0.999939 0 0.01105748 0.9999859 0 0.005302904 0.9997324 0 0.02313422 0.9995291 0 0.03068673 0.9999405 0 0.01091461 0.999939 0 0.01105748 0.9995291 0 0.03068673 0.9991488 0 0.0412523 1 0 0 0.999996 0 0.002858373 0.9999824 0 0.005939201 1 0 0 0.999996 0 0.002858373 0.9999301 0 0.01182358 0.9997293 0 0.02326887 0.9999824 0 0.005939201 0.9999824 0 0.005939201 0.9997293 0 0.02326887 0.9997324 0 0.02313422 0.9999859 0 0.005302904 1 0 0 0.9999824 0 0.005939201 0.9999859 0 0.005302904 1 0 0 1 0 0 0.9999408 0 -0.01088539 0.9999369 0 -0.01123526 1 0 0 0.9999408 0 -0.01088539 0.9985709 0 -0.05344428 0.9990047 0 -0.04460454 0.9999369 0 -0.01123526 0.9999369 0 -0.01123526 0.9990047 0 -0.04460454 0.9995177 0 -0.03105745 0.999981 0 -0.006178196 1 0 0 0.9999369 0 -0.01123526 0.999981 0 -0.006178196 1 0 0 0.9999 0 0.01414641 0.9956473 0 -0.09320182 0.9947307 0 -0.1025223 0.9921013 0 -0.1254393 0.9956473 0 -0.09320182 0.9991886 0 -0.0402761 0.9986266 0 -0.05239278 0.9947307 0 -0.1025223 0.9947307 0 -0.1025223 0.9986266 0 -0.05239278 0.9995177 0 -0.03105745 0.9990047 0 -0.04460454 0.9921013 0 -0.1254393 0.9947307 0 -0.1025223 0.9990047 0 -0.04460454 0.9985709 0 -0.05344428 1 0 0 1 0 0 0.9998887 0 -0.01491745 0.9999675 0 -0.008066677 1 0 0 1 0 0 0.999981 0 -0.006178196 0.9998887 0 -0.01491745 0.9998887 0 -0.01491745 0.999981 0 -0.006178196 0.9995177 0 -0.03105745 0.9986266 0 -0.05239278 0.9999675 0 -0.008066677 0.9998887 0 -0.01491745 0.9986266 0 -0.05239278 0.9991886 0 -0.0402761 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999887 0 0.004765228 0.9999995 0 -0.001059315 0.9999764 0 -0.006876812 0.9999887 0 0.004765228 0.9996564 0 0.02621268 0.9996817 0 0.02522996 0.9999995 0 -0.001059315 0.9999995 0 -0.001059315 0.9996817 0 0.02522996 0.9999966 0 0.002627222 0.999567 0 -0.02942648 0.9999764 0 -0.006876812 0.9999995 0 -0.001059315 0.999567 0 -0.02942648 0.9992702 0 -0.0382004 0.9869375 0 0.1611034 0.9967303 0 0.08080006 0.996379 0 0.08502351 0.9963439 0 0.08543427 0.9967303 0 0.08080006 0.9999359 0 -0.01132802 0.9996504 0 0.02644562 0.996379 0 0.08502351 0.996379 0 0.08502351 0.9996504 0 0.02644562 0.9999966 0 0.002627222 0.9996817 0 0.02522996 0.9963439 0 0.08543427 0.996379 0 0.08502351 0.9996817 0 0.02522996 0.9996564 0 0.02621268 0.9627941 0 -0.2702363 0.9889948 0 -0.1479498 0.9992609 0 -0.03844033 0.9817847 0 -0.189997 0.9889948 0 -0.1479498 0.9992702 0 -0.0382004 0.999567 0 -0.02942648 0.9992609 0 -0.03844033 0.9992609 0 -0.03844033 0.999567 0 -0.02942648 0.9999966 0 0.002627222 0.9996504 0 0.02644562 0.9817847 0 -0.189997 0.9992609 0 -0.03844033 0.9996504 0 0.02644562 0.9999359 0 -0.01132802 0.9993629 0 -0.03569141 0.9997105 0 -0.02406262 0.9996623 0 -0.02598788 0.9994962 0 -0.03174221 0.9997105 0 -0.02406262 0.9999077 0 -0.01359187 0.9998375 0 -0.01802991 0.9996623 0 -0.02598788 0.9996623 0 -0.02598788 0.9998375 0 -0.01802991 0.9999598 0 -0.008971309 0.9999149 0 -0.01304513 0.9994962 0 -0.03174221 0.9996623 0 -0.02598788 0.9999149 0 -0.01304513 0.9999022 0 -0.01398828 0.996025 0 -0.08907487 0.9978837 0 0.06502487 0.9999973 0 -0.002339863 0.9992049 0 -0.03987081 0.9978837 0 0.06502487 0.9995839 0 0.02884793 0.9999773 0 0.00674848 0.9999973 0 -0.002339863 0.9999973 0 -0.002339863 0.9999773 0 0.00674848 0.9999598 0 -0.008971309 0.9998375 0 -0.01802991 0.9992049 0 -0.03987081 0.9999973 0 -0.002339863 0.9998375 0 -0.01802991 0.9999077 0 -0.01359187 1 0 0 0.999994 0 -0.003463314 1 0 -1.39848e-4 0.9999729 0 0.007368226 0.999994 0 -0.003463314 0.9999022 0 -0.01398828 0.9999149 0 -0.01304513 1 0 -1.39848e-4 1 0 -1.39848e-4 0.9999149 0 -0.01304513 0.9999598 0 -0.008971309 0.9999773 0 0.00674848 0.9999729 0 0.007368226 1 0 -1.39848e-4 0.9999773 0 0.00674848 0.9995839 0 0.02884793 0.9899167 0 -0.1416503 0.9985483 0 -0.05386611 0.9977649 0 -0.06682295 0.9956099 0 -0.09359992 0.9985483 0 -0.05386611 0.9997223 0 -0.02356701 0.9995343 0 -0.03051724 0.9977649 0 -0.06682295 0.9977649 0 -0.06682295 0.9995343 0 -0.03051724 0.9998391 0 -0.01794109 0.9996644 0 -0.02590683 0.9956099 0 -0.09359992 0.9977649 0 -0.06682295 0.9996644 0 -0.02590683 0.9996613 0 -0.02602642 0.9993629 0 -0.03569141 0.9998729 0 -0.01594856 0.9999533 0 -0.009669519 0.9999697 0 -0.007786644 0.9998729 0 -0.01594856 0.9999667 0 -0.008157766 0.9999859 0 -0.005316581 0.9999533 0 -0.009669519 0.9999533 0 -0.009669519 0.9999859 0 -0.005316581 0.9998391 0 -0.01794109 0.9995343 0 -0.03051724 0.9999697 0 -0.007786644 0.9999533 0 -0.009669519 0.9995343 0 -0.03051724 0.9997223 0 -0.02356701 1 0 0 0.9999887 0 -0.004746452 0.9999773 0 -0.006744091 0.9999983 0 -0.001894854 0.9999887 0 -0.004746452 0.9996613 0 -0.02602642 0.9996644 0 -0.02590683 0.9999773 0 -0.006744091 0.9999773 0 -0.006744091 0.9996644 0 -0.02590683 0.9998391 0 -0.01794109 0.9999859 0 -0.005316581 0.9999983 0 -0.001894854 0.9999773 0 -0.006744091 0.9999859 0 -0.005316581 0.9999667 0 -0.008157766 0.9995003 0 0.03161101 0.9999964 0 0.002671591 0.999972 0 0.007480635 0.9997336 0 0.02308309 0.9999964 0 0.002671591 0.9993454 0 0.03618099 0.9997767 0 0.02113308 0.999972 0 0.007480635 0.999972 0 0.007480635 0.9997767 0 0.02113308 0.9998325 0 0.01831122 0.999985 0 0.00548024 0.9997336 0 0.02308309 0.999972 0 0.007480635 0.999985 0 0.00548024 0.999963 0 0.008616121 0.9869375 0 0.1611034 0.9963439 0 0.08543427 0.9990469 0 0.04364947 0.9962814 0 0.0861597 0.9963439 0 0.08543427 0.9996564 0 0.02621268 0.9996552 0 0.02625882 0.9990469 0 0.04364947 0.9990469 0 0.04364947 0.9996552 0 0.02625882 0.9998325 0 0.01831122 0.9997767 0 0.02113308 0.9962814 0 0.0861597 0.9990469 0 0.04364947 0.9997767 0 0.02113308 0.9993454 0 0.03618099 1 0 0 0.9999982 0 0.001960248 0.9999768 0 0.006815541 0.9999887 0 0.004765228 0.9999982 0 0.001960248 0.999963 0 0.008616121 0.999985 0 0.00548024 0.9999768 0 0.006815541 0.9999768 0 0.006815541 0.999985 0 0.00548024 0.9998325 0 0.01831122 0.9996552 0 0.02625882 0.9999887 0 0.004765228 0.9999768 0 0.006815541 0.9996552 0 0.02625882 0.9996564 0 0.02621268 1 0 0 0.9999961 0 0.002819914 0.9999875 0 0.005004147 1 0 0 0.9999961 0 0.002819914 0.99987 0 0.01612659 0.99992 0 0.01265306 0.9999875 0 0.005004147 0.9999875 0 0.005004147 0.99992 0 0.01265306 0.9999533 0 0.009667065 0.9999982 0 0.001948643 1 0 0 0.9999875 0 0.005004147 0.9999982 0 0.001948643 1 0 0 0.9995003 0 0.03161101 0.99941 0 0.03434673 0.999624 0 0.02742181 0.9995306 0 0.03063851 0.99941 0 0.03434673 0.9998841 0 0.01522411 0.9999151 0 0.01303424 0.999624 0 0.02742181 0.999624 0 0.02742181 0.9999151 0 0.01303424 0.9999533 0 0.009667065 0.99992 0 0.01265306 0.9995306 0 0.03063851 0.999624 0 0.02742181 0.99992 0 0.01265306 0.99987 0 0.01612659 1 0 0 1 0 0 0.9999944 0 0.003343506 0.9999928 0 0.003779349 1 0 0 1 0 0 0.9999982 0 0.001948643 0.9999944 0 0.003343506 0.9999944 0 0.003343506 0.9999982 0 0.001948643 0.9999533 0 0.009667065 0.9999151 0 0.01303424 0.9999928 0 0.003779349 0.9999944 0 0.003343506 0.9999151 0 0.01303424 0.9998841 0 0.01522411 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9972702 0 -0.07383943 0.9999918 0 -0.004055314 0.9999897 0 -0.004561502 0.999422 0 -0.03399623 0.9999918 0 -0.004055314 0.9999998 0 6.70787e-4 0.9999998 0 -7.96237e-4 0.9999897 0 -0.004561502 0.9999897 0 -0.004561502 0.9999998 0 -7.96237e-4 0.9999998 0 7.4204e-4 0.9999984 0 -0.001833053 0.999422 0 -0.03399623 0.9999897 0 -0.004561502 0.9999984 0 -0.001833053 0.9999232 0 -0.01239903 1 0 0 1 0 0 0.9999997 0 -8.55469e-4 0.9999996 0 8.9805e-4 1 0 0 1 0 0 0.9999998 0 6.96701e-4 0.9999997 0 -8.55469e-4 0.9999997 0 -8.55469e-4 0.9999998 0 6.96701e-4 0.9999998 0 7.4204e-4 0.9999998 0 -7.96237e-4 0.9999996 0 8.9805e-4 0.9999997 0 -8.55469e-4 0.9999998 0 -7.96237e-4 0.9999998 0 6.70787e-4 1 0 0 0.9999952 0 -0.003107944 0.9999989 0 -0.001520061 1 0 0 0.9999952 0 -0.003107944 0.9999232 0 -0.01239903 0.9999984 0 -0.001833053 0.9999989 0 -0.001520061 0.9999989 0 -0.001520061 0.9999984 0 -0.001833053 0.9999998 0 7.4204e-4 0.9999998 0 6.96701e-4 1 0 0 0.9999989 0 -0.001520061 0.9999998 0 6.96701e-4 1 0 0 0.9972702 0 -0.07383943 0.9974152 0 -0.07185352 0.9980798 0 -0.06194128 0.9976706 0 -0.06821707 0.9974152 0 -0.07185352 0.9992336 0 -0.03914398 0.9994609 0 -0.03283385 0.9980798 0 -0.06194128 0.9980798 0 -0.06194128 0.9994609 0 -0.03283385 0.9998353 0 -0.01815161 0.9992372 0 -0.03905421 0.9976706 0 -0.06821707 0.9980798 0 -0.06194128 0.9992372 0 -0.03905421 0.9993472 0 -0.03612855 1 0 0 1 0 0 0.9999741 0 -0.007210273 0.9999515 0 -0.009843874 1 0 0 1 0 0 0.9999727 0 -0.007399705 0.9999741 0 -0.007210273 0.9999741 0 -0.007210273 0.9999727 0 -0.007399705 0.9998353 0 -0.01815161 0.9994609 0 -0.03283385 0.9999515 0 -0.009843874 0.9999741 0 -0.007210273 0.9994609 0 -0.03283385 0.9992336 0 -0.03914398 1 0 0 0.9999539 0 -0.009603281 0.9999409 0 -0.01087204 1 0 0 0.9999539 0 -0.009603281 0.9993472 0 -0.03612855 0.9992372 0 -0.03905421 0.9999409 0 -0.01087204 0.9999409 0 -0.01087204 0.9992372 0 -0.03905421 0.9998353 0 -0.01815161 0.9999727 0 -0.007399705 1 0 0 0.9999409 0 -0.01087204 0.9999727 0 -0.007399705 1 0 0 0.999842 0 0.01777685 0.9998686 0 0.01621746 0.9999621 0 0.008715305 0.9999747 0 0.007129906 0.9998686 0 0.01621746 0.9999713 0 0.007591022 0.9999864 0 0.005242629 0.9999621 0 0.008715305 0.9999621 0 0.008715305 0.9999864 0 0.005242629 0.9999968 0 0.002541453 0.99999 0 0.004473674 0.9999747 0 0.007129906 0.9999621 0 0.008715305 0.99999 0 0.004473674 0.9999933 0 0.003668675 1 0 0 1 0 0 0.999999 0 0.001409648 0.9999988 0 0.001559034 1 0 0 1 0 0 0.9999998 0 6.11847e-4 0.999999 0 0.001409648 0.999999 0 0.001409648 0.9999998 0 6.11847e-4 0.9999968 0 0.002541453 0.9999864 0 0.005242629 0.9999988 0 0.001559034 0.999999 0 0.001409648 0.9999864 0 0.005242629 0.9999713 0 0.007591022 1 0 0 0.9999998 0 8.16541e-4 0.9999995 0 0.00102918 1 0 0 0.9999998 0 8.16541e-4 0.9999933 0 0.003668675 0.99999 0 0.004473674 0.9999995 0 0.00102918 0.9999995 0 0.00102918 0.99999 0 0.004473674 0.9999968 0 0.002541453 0.9999998 0 6.11847e-4 1 0 0 0.9999995 0 0.00102918 0.9999998 0 6.11847e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9866253 0 -0.1630048 0.9961301 0 -0.08789101 0.9960411 0 -0.08889414 0.9921302 0 -0.1252108 0.9961301 0 -0.08789101 0.998827 0 -0.04842307 0.9988274 0 -0.04841468 0.9960411 0 -0.08889414 0.9960411 0 -0.08889414 0.9988274 0 -0.04841468 0.9996532 0 -0.02633659 0.9994013 0 -0.03460038 0.9921302 0 -0.1252108 0.9960411 0 -0.08889414 0.9994013 0 -0.03460038 0.9988102 0 -0.04876675 1 0 0 1 0 0 0.9999107 0 -0.01337135 0.9999078 0 -0.01358408 1 0 0 1 0 0 0.9999941 0 -0.003435031 0.9999107 0 -0.01337135 0.9999107 0 -0.01337135 0.9999941 0 -0.003435031 0.9996532 0 -0.02633659 0.9988274 0 -0.04841468 0.9999078 0 -0.01358408 0.9999107 0 -0.01337135 0.9988274 0 -0.04841468 0.998827 0 -0.04842307 1 0 0 0.9999396 0 -0.01099733 0.9999784 0 -0.006577141 1 0 0 0.9999396 0 -0.01099733 0.9988102 0 -0.04876675 0.9994013 0 -0.03460038 0.9999784 0 -0.006577141 0.9999784 0 -0.006577141 0.9994013 0 -0.03460038 0.9996532 0 -0.02633659 0.9999941 0 -0.003435031 1 0 0 0.9999784 0 -0.006577141 0.9999941 0 -0.003435031 1 0 0 0.9640251 0 0.2658117 0.9823733 0 0.18693 0.9992521 0 0.03867082 0.9892356 0 0.1463318 0.9823733 0 0.18693 0.9999342 0 0.01147528 0.9996541 0 -0.02629973 0.9992521 0 0.03867082 0.9992521 0 0.03867082 0.9996541 0 -0.02629973 0.9999966 0 -0.002630634 0.9995589 0 0.02969955 0.9892356 0 0.1463318 0.9992521 0 0.03867082 0.9995589 0 0.02969955 0.9992617 0 0.03841943 0.9899167 0 -0.1416503 0.9956099 0 -0.09359992 0.9965342 0 -0.0831851 0.996846 0 -0.079361 0.9956099 0 -0.09359992 0.9996613 0 -0.02602642 0.999683 0 -0.02517726 0.9965342 0 -0.0831851 0.9965342 0 -0.0831851 0.999683 0 -0.02517726 0.9999966 0 -0.002630634 0.9996541 0 -0.02629973 0.996846 0 -0.079361 0.9965342 0 -0.0831851 0.9996541 0 -0.02629973 0.9999342 0 0.01147528 1 0 0 0.9999762 0 0.006900886 0.9999994 0 0.00109454 0.9999887 0 -0.004746452 0.9999762 0 0.006900886 0.9992617 0 0.03841943 0.9995589 0 0.02969955 0.9999994 0 0.00109454 0.9999994 0 0.00109454 0.9995589 0 0.02969955 0.9999966 0 -0.002630634 0.999683 0 -0.02517726 0.9999887 0 -0.004746452 0.9999994 0 0.00109454 0.999683 0 -0.02517726 0.9996613 0 -0.02602642 1 0 0 1 0 0 0.9999448 0 0.01050642 0.9999762 0 0.006900886 1 0 0 1 0 0 0.9999787 0 0.006523193 0.9999448 0 0.01050642 0.9999448 0 0.01050642 0.9999787 0 0.006523193 0.9994655 0 0.03269229 0.9990225 0 0.04420554 0.9999762 0 0.006900886 0.9999448 0 0.01050642 0.9990225 0 0.04420554 0.9992617 0 0.03841943 1 0 0 0.9999585 0 0.009124742 0.9998774 0 0.01566195 1 0 0 0.9999585 0 0.009124742 0.9989811 0 0.04513282 0.9983954 0 0.05662813 0.9998774 0 0.01566195 0.9998774 0 0.01566195 0.9983954 0 0.05662813 0.9994655 0 0.03269229 0.9999787 0 0.006523193 1 0 0 0.9998774 0 0.01566195 0.9999787 0 0.006523193 1 0 0 0.9640251 0 0.2658117 0.9892356 0 0.1463318 0.9935752 0 0.1131744 0.9947144 0 0.1026802 0.9892356 0 0.1463318 0.9992617 0 0.03841943 0.9990225 0 0.04420554 0.9935752 0 0.1131744 0.9935752 0 0.1131744 0.9990225 0 0.04420554 0.9994655 0 0.03269229 0.9983954 0 0.05662813 0.9947144 0 0.1026802 0.9935752 0 0.1131744 0.9983954 0 0.05662813 0.9989811 0 0.04513282 0.9779203 0 -0.2089785 0.9968817 0 -0.07891143 0.9953712 0 -0.09610584 0.9904329 0 -0.1379958 0.9968817 0 -0.07891143 0.9992924 0 -0.03761339 0.9991964 0 -0.04008304 0.9953712 0 -0.09610584 0.9953712 0 -0.09610584 0.9991964 0 -0.04008304 0.9994309 0 -0.03373304 0.9991111 0 -0.04215658 0.9904329 0 -0.1379958 0.9953712 0 -0.09610584 0.9991111 0 -0.04215658 0.9989662 0 -0.04546124 0.8142342 0 0.5805366 0.9788796 0 0.2044379 0.9997886 0 0.02056532 0.9992883 0 0.03772387 0.9788796 0 0.2044379 0.9976047 0 0.06917343 0.9999877 0 0.00497207 0.9997886 0 0.02056532 0.9997886 0 0.02056532 0.9999877 0 0.00497207 0.9994309 0 -0.03373304 0.9991964 0 -0.04008304 0.9992883 0 0.03772387 0.9997886 0 0.02056532 0.9991964 0 -0.04008304 0.9992924 0 -0.03761339 1 0 0 0.999962 0 -0.008727993 0.9999766 0 -0.006841832 0.9999433 0 0.01065559 0.999962 0 -0.008727993 0.9989662 0 -0.04546124 0.9991111 0 -0.04215658 0.9999766 0 -0.006841832 0.9999766 0 -0.006841832 0.9991111 0 -0.04215658 0.9994309 0 -0.03373304 0.9999877 0 0.00497207 0.9999433 0 0.01065559 0.9999766 0 -0.006841832 0.9999877 0 0.00497207 0.9976047 0 0.06917343 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999 0 0.01414641 0.9921013 0 -0.1254393 0.9978305 0 -0.06583553 0.9980134 0 0.06300399 0.9921013 0 -0.1254393 0.9985709 0 -0.05344428 0.9991441 0 -0.04136616 0.9978305 0 -0.06583553 0.9978305 0 -0.06583553 0.9991441 0 -0.04136616 0.9997525 0 -0.02224584 0.9994118 0 -0.03429677 0.9980134 0 0.06300399 0.9978305 0 -0.06583553 0.9994118 0 -0.03429677 0.9999294 0 -0.0118844 1 0 0 1 0 0 0.9999565 0 -0.009339455 0.9999408 0 -0.01088539 1 0 0 1 0 0 0.9999864 0 -0.005242264 0.9999565 0 -0.009339455 0.9999565 0 -0.009339455 0.9999864 0 -0.005242264 0.9997525 0 -0.02224584 0.9991441 0 -0.04136616 0.9999408 0 -0.01088539 0.9999565 0 -0.009339455 0.9991441 0 -0.04136616 0.9985709 0 -0.05344428 1 0 0 0.999994 0 -0.003479436 0.9999415 0 -0.01082852 1 0 0 0.999994 0 -0.003479436 0.9999294 0 -0.0118844 0.9994118 0 -0.03429677 0.9999415 0 -0.01082852 0.9999415 0 -0.01082852 0.9994118 0 -0.03429677 0.9997525 0 -0.02224584 0.9999864 0 -0.005242264 1 0 0 0.9999415 0 -0.01082852 0.9999864 0 -0.005242264 1 0 0 1 0 0 1 0 0 0.9999992 0 -0.001309423 0.9999997 0 -8.83638e-4 1 0 0 1 0 0 0.9999998 0 -6.6592e-4 0.9999992 0 -0.001309423 0.9999992 0 -0.001309423 0.9999998 0 -6.6592e-4 0.9999964 0 -0.00271739 0.9999893 0 -0.004634015 0.9999997 0 -8.83638e-4 0.9999992 0 -0.001309423 0.9999893 0 -0.004634015 0.9999927 0 -0.00381563 1 0 0 0.9999987 0 -0.001630489 0.9999986 0 -0.001696041 1 0 0 0.9999987 0 -0.001630489 0.9999709 0 -0.00763871 0.9999837 0 -0.005717141 0.9999986 0 -0.001696041 0.9999986 0 -0.001696041 0.9999837 0 -0.005717141 0.9999964 0 -0.00271739 0.9999998 0 -6.6592e-4 1 0 0 0.9999986 0 -0.001696041 0.9999998 0 -6.6592e-4 1 0 0 0.9998421 0 -0.01777363 0.9999742 0 -0.007182671 0.9999607 0 -0.008865799 0.9998678 0 -0.01625975 0.9999742 0 -0.007182671 0.9999927 0 -0.00381563 0.9999893 0 -0.004634015 0.9999607 0 -0.008865799 0.9999607 0 -0.008865799 0.9999893 0 -0.004634015 0.9999964 0 -0.00271739 0.9999837 0 -0.005717141 0.9998678 0 -0.01625975 0.9999607 0 -0.008865799 0.9999837 0 -0.005717141 0.9999709 0 -0.00763871 1 0 0 1 0 0 0.9999482 0 0.01018488 0.9999713 0 0.007571489 1 0 0 1 0 0 0.9999748 0 0.007095894 0.9999482 0 0.01018488 0.9999482 0 0.01018488 0.9999748 0 0.007095894 0.9998296 0 0.01846433 0.9992675 0 0.03827045 0.9999713 0 0.007571489 0.9999482 0 0.01018488 0.9992675 0 0.03827045 0.9994006 0 0.03462208 1 0 0 0.9999405 0 0.01091461 0.9999688 0 0.007912061 1 0 0 0.9999405 0 0.01091461 0.9991488 0 0.0412523 0.9994063 0 0.0344537 0.9999688 0 0.007912061 0.9999688 0 0.007912061 0.9994063 0 0.0344537 0.9998296 0 0.01846433 0.9999748 0 0.007095894 1 0 0 0.9999688 0 0.007912061 0.9999748 0 0.007095894 1 0 0 0.9972693 0 0.07385101 0.9977018 0 0.06775764 0.9980425 0 0.06254168 0.9970716 0 0.07647336 0.9977018 0 0.06775764 0.9994006 0 0.03462208 0.9992675 0 0.03827045 0.9980425 0 0.06254168 0.9980425 0 0.06254168 0.9992675 0 0.03827045 0.9998296 0 0.01846433 0.9994063 0 0.0344537 0.9970716 0 0.07647336 0.9980425 0 0.06254168 0.9994063 0 0.0344537 0.9991488 0 0.0412523 1 0 0 1 0 0 0.9999732 0 0.007334394 0.9999363 0 0.01129657 1 0 0 1 0 0 0.9999951 0 0.003146686 0.9999732 0 0.007334394 0.9999732 0 0.007334394 0.9999951 0 0.003146686 0.999693 0 0.0247789 0.9993861 0 0.03503535 0.9999363 0 0.01129657 0.9999732 0 0.007334394 0.9993861 0 0.03503535 0.9987851 0 0.04927829 1 0 0 0.9999111 0 0.01333587 0.9999731 0 0.0073449 1 0 0 0.9999111 0 0.01333587 0.9987369 0 0.05024467 0.9991679 0 0.04078917 0.9999731 0 0.0073449 0.9999731 0 0.0073449 0.9991679 0 0.04078917 0.999693 0 0.0247789 0.9999951 0 0.003146686 1 0 0 0.9999731 0 0.0073449 0.9999951 0 0.003146686 1 0 0 0.9866251 0 0.1630066 0.992159 0 0.1249821 0.9961622 0 0.0875262 0.9962724 0 0.08626293 0.992159 0 0.1249821 0.9987851 0 0.04927829 0.9993861 0 0.03503535 0.9961622 0 0.0875262 0.9961622 0 0.0875262 0.9993861 0 0.03503535 0.999693 0 0.0247789 0.9991679 0 0.04078917 0.9962724 0 0.08626293 0.9961622 0 0.0875262 0.9991679 0 0.04078917 0.9987369 0 0.05024467 1 0 0 0.9999363 0 0.01129657 0.9999716 0 0.007531486 0.9999892 0 0.004667323 0.9999363 0 0.01129657 0.9987851 0 0.04927829 0.9992363 0 0.0390762 0.9999716 0 0.007531486 0.9999716 0 0.007531486 0.9992363 0 0.0390762 0.9999047 0 0.01380591 0.9999981 0 0.001978054 0.9999892 0 0.004667323 0.9999716 0 0.007531486 0.9999981 0 0.001978054 0.9997733 0 0.02129061 0.9866251 0 0.1630066 0.9889668 0 0.1481373 0.9963092 0 0.0858384 0.992159 0 0.1249821 0.9889668 0 0.1481373 0.9982949 0 0.05837213 0.9994221 0 0.03399518 0.9963092 0 0.0858384 0.9963092 0 0.0858384 0.9994221 0 0.03399518 0.9999047 0 0.01380591 0.9992363 0 0.0390762 0.992159 0 0.1249821 0.9963092 0 0.0858384 0.9992363 0 0.0390762 0.9987851 0 0.04927829 0.9979861 0 0.06343322 0.9971974 0 0.07481553 0.9998968 0 -0.0143708 0.9991903 0 -0.04023624 0.9971974 0 0.07481553 0.9997733 0 0.02129061 0.9999981 0 0.001978054 0.9998968 0 -0.0143708 0.9998968 0 -0.0143708 0.9999981 0 0.001978054 0.9999047 0 0.01380591 0.9994221 0 0.03399518 0.9991903 0 -0.04023624 0.9998968 0 -0.0143708 0.9994221 0 0.03399518 0.9982949 0 0.05837213 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999993 0 0.001173148 0.999996 0 0.002858373 1 0 0 1 0 0 0.9999997 0 -8.33692e-4 0.9999993 0 0.001173148 0.9999993 0 0.001173148 0.9999997 0 -8.33692e-4 0.9999996 0 -8.92006e-4 0.9999991 0 0.001377703 0.999996 0 0.002858373 0.9999993 0 0.001173148 0.9999991 0 0.001377703 0.9999301 0 0.01182358 1 0 0 0.9999996 0 -8.9633e-4 0.9999998 0 8.14643e-4 1 0 0 0.9999996 0 -8.9633e-4 0.9999998 0 -6.69192e-4 0.9999999 0 6.04271e-4 0.9999998 0 8.14643e-4 0.9999998 0 8.14643e-4 0.9999999 0 6.04271e-4 0.9999996 0 -8.92006e-4 0.9999997 0 -8.33692e-4 1 0 0 0.9999998 0 8.14643e-4 0.9999997 0 -8.33692e-4 1 0 0 0.9972693 0 0.07385101 0.9994287 0 0.03379725 0.9999911 0 0.004212641 0.9999918 0 0.004060556 0.9994287 0 0.03379725 0.9999301 0 0.01182358 0.9999991 0 0.001377703 0.9999911 0 0.004212641 0.9999911 0 0.004212641 0.9999991 0 0.001377703 0.9999996 0 -8.92006e-4 0.9999999 0 6.04271e-4 0.9999918 0 0.004060556 0.9999911 0 0.004212641 0.9999999 0 6.04271e-4 0.9999998 0 -6.69192e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9627941 0 -0.2702363 0.9947344 0 -0.1024874 0.9935132 0 -0.1137177 0.9889948 0 -0.1479498 0.9947344 0 -0.1024874 0.9989846 0 -0.04505339 0.9984014 0 -0.05652144 0.9935132 0 -0.1137177 0.9935132 0 -0.1137177 0.9984014 0 -0.05652144 0.9994628 0 -0.03277442 0.9990265 0 -0.04411556 0.9889948 0 -0.1479498 0.9935132 0 -0.1137177 0.9990265 0 -0.04411556 0.9992702 0 -0.0382004 1 0 0 1 0 0 0.9998776 0 -0.01564982 0.9999585 0 -0.00911695 1 0 0 1 0 0 0.9999785 0 -0.006562143 0.9998776 0 -0.01564982 0.9998776 0 -0.01564982 0.9999785 0 -0.006562143 0.9994628 0 -0.03277442 0.9984014 0 -0.05652144 0.9999585 0 -0.00911695 0.9998776 0 -0.01564982 0.9984014 0 -0.05652144 0.9989846 0 -0.04505339 1 0 0 0.9999764 0 -0.006876812 0.999945 0 -0.01049327 1 0 0 0.9999764 0 -0.006876812 0.9992702 0 -0.0382004 0.9990265 0 -0.04411556 0.999945 0 -0.01049327 0.999945 0 -0.01049327 0.9990265 0 -0.04411556 0.9994628 0 -0.03277442 0.9999785 0 -0.006562143 1 0 0 0.999945 0 -0.01049327 0.9999785 0 -0.006562143 1 0 0 0.996025 0 -0.08907487 0.9959368 0 0.09005485 0.9981963 0 0.06003593 0.9978837 0 0.06502487 0.9959368 0 0.09005485 0.9988505 0 0.04793487 0.9992716 0 0.0381608 0.9981963 0 0.06003593 0.9981963 0 0.06003593 0.9992716 0 0.0381608 0.999783 0 0.02083465 0.999431 0 0.03373305 0.9978837 0 0.06502487 0.9981963 0 0.06003593 0.999431 0 0.03373305 0.9995839 0 0.02884793 1 0 0 1 0 0 0.9999548 0 0.009512698 0.9999382 0 0.01112464 1 0 0 1 0 0 0.9999784 0 0.006580357 0.9999548 0 0.009512698 0.9999548 0 0.009512698 0.9999784 0 0.006580357 0.999783 0 0.02083465 0.9992716 0 0.0381608 0.9999382 0 0.01112464 0.9999548 0 0.009512698 0.9992716 0 0.0381608 0.9988505 0 0.04793487 1 0 0 0.9999729 0 0.007368226 0.999962 0 0.008729459 1 0 0 0.9999729 0 0.007368226 0.9995839 0 0.02884793 0.999431 0 0.03373305 0.999962 0 0.008729459 0.999962 0 0.008729459 0.999431 0 0.03373305 0.999783 0 0.02083465 0.9999784 0 0.006580357 1 0 0 0.999962 0 0.008729459 0.9999784 0 0.006580357 1 0 0 0.9993629 0 -0.03569141 0.9994962 0 -0.03174221 0.9998338 0 -0.0182357 0.9998729 0 -0.01594856 0.9994962 0 -0.03174221 0.9999022 0 -0.01398828 0.9999394 0 -0.01101162 0.9998338 0 -0.0182357 0.9998338 0 -0.0182357 0.9999394 0 -0.01101162 0.9999831 0 -0.005812396 0.9999517 0 -0.009833843 0.9998729 0 -0.01594856 0.9998338 0 -0.0182357 0.9999517 0 -0.009833843 0.9999667 0 -0.008157766 1 0 0 1 0 0 0.9999967 0 -0.002573115 0.999994 0 -0.003463314 1 0 0 1 0 0 0.999999 0 -0.001424399 0.9999967 0 -0.002573115 0.9999967 0 -0.002573115 0.999999 0 -0.001424399 0.9999831 0 -0.005812396 0.9999394 0 -0.01101162 0.999994 0 -0.003463314 0.9999967 0 -0.002573115 0.9999394 0 -0.01101162 0.9999022 0 -0.01398828 1 0 0 0.9999983 0 -0.001894854 0.9999971 0 -0.002432876 1 0 0 0.9999983 0 -0.001894854 0.9999667 0 -0.008157766 0.9999517 0 -0.009833843 0.9999971 0 -0.002432876 0.9999971 0 -0.002432876 0.9999517 0 -0.009833843 0.9999831 0 -0.005812396 0.999999 0 -0.001424399 1 0 0 0.9999971 0 -0.002432876 0.999999 0 -0.001424399 1 0 0 1 0 0 1 0 0 0.9999955 0 0.003020862 0.9999982 0 0.001960248 1 0 0 1 0 0 0.9999993 0 0.001247587 0.9999955 0 0.003020862 0.9999955 0 0.003020862 0.9999993 0 0.001247587 0.9999814 0 0.006098704 0.9999462 0 0.01038407 0.9999982 0 0.001960248 0.9999955 0 0.003020862 0.9999462 0 0.01038407 0.999963 0 0.008616121 1 0 0 0.9999928 0 0.003779349 0.9999963 0 0.002734166 1 0 0 0.9999928 0 0.003779349 0.9998841 0 0.01522411 0.9999304 0 0.01180049 0.9999963 0 0.002734166 0.9999963 0 0.002734166 0.9999304 0 0.01180049 0.9999814 0 0.006098704 0.9999993 0 0.001247587 1 0 0 0.9999963 0 0.002734166 0.9999993 0 0.001247587 1 0 0 0.9995003 0 0.03161101 0.9997336 0 0.02308309 0.9998087 0 0.01956217 0.99941 0 0.03434673 0.9997336 0 0.02308309 0.999963 0 0.008616121 0.9999462 0 0.01038407 0.9998087 0 0.01956217 0.9998087 0 0.01956217 0.9999462 0 0.01038407 0.9999814 0 0.006098704 0.9999304 0 0.01180049 0.99941 0 0.03434673 0.9998087 0 0.01956217 0.9999304 0 0.01180049 0.9998841 0 0.01522411 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.996025 0 -0.08907487 0.6907125 0 -0.7231295 0.9457282 0 -0.3249589 0.9996302 0 0.0271926 0.6907125 0 -0.7231295 0.8248059 0 -0.5654159 0.911104 0 -0.4121767 0.9457282 0 -0.3249589 0.9457282 0 -0.3249589 0.911104 0 -0.4121767 0.9821471 0 -0.1881149 0.9981651 0 -0.06055092 0.9996302 0 0.0271926 0.9457282 0 -0.3249589 0.9981651 0 -0.06055092 0.9999512 0 0.009882521 0.8142239 0 -0.580551 0.9786899 0 -0.2053438 0.8825265 0 -0.4702628 0.6868064 0 -0.7268404 0.9786899 0 -0.2053438 0.9974911 0 -0.07079361 0.9907676 0 -0.1355713 0.8825265 0 -0.4702628 0.8825265 0 -0.4702628 0.9907676 0 -0.1355713 0.9821471 0 -0.1881149 0.911104 0 -0.4121767 0.6868064 0 -0.7268404 0.8825265 0 -0.4702628 0.911104 0 -0.4121767 0.8248059 0 -0.5654159 1 0 0 0.9999944 0 0.003361032 0.9994513 0 -0.03312466 0.9999358 0 -0.01133725 0.9999944 0 0.003361032 0.9999512 0 0.009882521 0.9981651 0 -0.06055092 0.9994513 0 -0.03312466 0.9994513 0 -0.03312466 0.9981651 0 -0.06055092 0.9821471 0 -0.1881149 0.9907676 0 -0.1355713 0.9999358 0 -0.01133725 0.9994513 0 -0.03312466 0.9907676 0 -0.1355713 0.9974911 0 -0.07079361 1 0 0 0.9999358 0 -0.01133725 0.9999796 0 0.006393901 0.9999583 0 0.009135833 0.9999358 0 -0.01133725 0.9974911 0 -0.07079361 0.9999801 0 -0.006318056 0.9999796 0 0.006393901 0.9999796 0 0.006393901 0.9999801 0 -0.006318056 0.9994405 0 0.03344897 0.9991109 0 0.04216036 0.9999583 0 0.009135833 0.9999796 0 0.006393901 0.9991109 0 0.04216036 0.9989193 0 0.04647733 0.8142239 0 -0.580551 0.999288 0 -0.03773092 0.9997668 0 -0.02159581 0.9786899 0 -0.2053438 0.999288 0 -0.03773092 0.9992924 0 0.03761401 0.9992122 0 0.03968649 0.9997668 0 -0.02159581 0.9997668 0 -0.02159581 0.9992122 0 0.03968649 0.9994405 0 0.03344897 0.9999801 0 -0.006318056 0.9786899 0 -0.2053438 0.9997668 0 -0.02159581 0.9999801 0 -0.006318056 0.9974911 0 -0.07079361 0.9779215 0 0.2089729 0.9903573 0 0.1385369 0.9953715 0 0.0961021 0.9968823 0 0.07890325 0.9903573 0 0.1385369 0.9989193 0 0.04647733 0.9991109 0 0.04216036 0.9953715 0 0.0961021 0.9953715 0 0.0961021 0.9991109 0 0.04216036 0.9994405 0 0.03344897 0.9992122 0 0.03968649 0.9968823 0 0.07890325 0.9953715 0 0.0961021 0.9992122 0 0.03968649 0.9992924 0 0.03761401 1 0 0 1 0 0 0.9999496 0 0.01004225 0.9999944 0 0.003361032 1 0 0 1 0 0 0.999982 0 0.006007154 0.9999496 0 0.01004225 0.9999496 0 0.01004225 0.999982 0 0.006007154 0.9998315 0 0.01835719 0.9995189 0 0.03101836 0.9999944 0 0.003361032 0.9999496 0 0.01004225 0.9995189 0 0.03101836 0.9999512 0 0.009882521 1 0 0 0.9999382 0 0.01112464 0.9999354 0 0.01137518 1 0 0 0.9999382 0 0.01112464 0.9988505 0 0.04793487 0.9992362 0 0.03907781 0.9999354 0 0.01137518 0.9999354 0 0.01137518 0.9992362 0 0.03907781 0.9998315 0 0.01835719 0.999982 0 0.006007154 1 0 0 0.9999354 0 0.01137518 0.999982 0 0.006007154 1 0 0 0.996025 0 -0.08907487 0.9996302 0 0.0271926 0.998597 0 0.05295498 0.9959368 0 0.09005485 0.9996302 0 0.0271926 0.9999512 0 0.009882521 0.9995189 0 0.03101836 0.998597 0 0.05295498 0.998597 0 0.05295498 0.9995189 0 0.03101836 0.9998315 0 0.01835719 0.9992362 0 0.03907781 0.9959368 0 0.09005485 0.998597 0 0.05295498 0.9992362 0 0.03907781 0.9988505 0 0.04793487 1 0 0 1 0 0 0.9999815 0 -0.006089599 0.9999952 0 -0.003107944 1 0 0 1 0 0 0.9999801 0 -0.006309645 0.9999815 0 -0.006089599 0.9999815 0 -0.006089599 0.9999801 0 -0.006309645 0.9997411 0 -0.02275817 0.9997272 0 -0.02335703 0.9999952 0 -0.003107944 0.9999815 0 -0.006089599 0.9997272 0 -0.02335703 0.9999232 0 -0.01239903 1 0 0 0.9999515 0 -0.009843874 0.9999597 0 -0.00897592 1 0 0 0.9999515 0 -0.009843874 0.9992336 0 -0.03914398 0.9993423 0 -0.03626306 0.9999597 0 -0.00897592 0.9999597 0 -0.00897592 0.9993423 0 -0.03626306 0.9997411 0 -0.02275817 0.9999801 0 -0.006309645 1 0 0 0.9999597 0 -0.00897592 0.9999801 0 -0.006309645 1 0 0 0.9972702 0 -0.07383943 0.999422 0 -0.03399623 0.9992083 0 -0.03978432 0.9974152 0 -0.07185352 0.999422 0 -0.03399623 0.9999232 0 -0.01239903 0.9997272 0 -0.02335703 0.9992083 0 -0.03978432 0.9992083 0 -0.03978432 0.9997272 0 -0.02335703 0.9997411 0 -0.02275817 0.9993423 0 -0.03626306 0.9974152 0 -0.07185352 0.9992083 0 -0.03978432 0.9993423 0 -0.03626306 0.9992336 0 -0.03914398 1 0 0 0.9999078 0 -0.01358408 0.9998398 0 -0.01789687 0.9999539 0 -0.009603281 0.9999078 0 -0.01358408 0.998827 0 -0.04842307 0.9986568 0 -0.05181414 0.9998398 0 -0.01789687 0.9998398 0 -0.01789687 0.9986568 0 -0.05181414 0.9981993 0 -0.05998496 0.9992315 0 -0.03920045 0.9999539 0 -0.009603281 0.9998398 0 -0.01789687 0.9992315 0 -0.03920045 0.9993472 0 -0.03612855 0.9866253 0 -0.1630048 0.992608 0 -0.1213653 0.9959966 0 -0.08939229 0.9961301 0 -0.08789101 0.992608 0 -0.1213653 0.9928281 0 -0.1195514 0.9951907 0 -0.09795707 0.9959966 0 -0.08939229 0.9959966 0 -0.08939229 0.9951907 0 -0.09795707 0.9981993 0 -0.05998496 0.9986568 0 -0.05181414 0.9961301 0 -0.08789101 0.9959966 0 -0.08939229 0.9986568 0 -0.05181414 0.998827 0 -0.04842307 0.9972702 0 -0.07383943 0.9976706 0 -0.06821707 0.9976272 0 -0.06884848 0.9973894 0 -0.07221147 0.9976706 0 -0.06821707 0.9993472 0 -0.03612855 0.9992315 0 -0.03920045 0.9976272 0 -0.06884848 0.9976272 0 -0.06884848 0.9992315 0 -0.03920045 0.9981993 0 -0.05998496 0.9951907 0 -0.09795707 0.9973894 0 -0.07221147 0.9976272 0 -0.06884848 0.9951907 0 -0.09795707 0.9928281 0 -0.1195514 1 0 0 0.9999583 0 0.009135833 0.9999731 0 0.007347546 0.9999998 0 8.16541e-4 0.9999583 0 0.009135833 0.9989193 0 0.04647733 0.9995267 0 0.0307632 0.9999731 0 0.007347546 0.9999731 0 0.007347546 0.9995267 0 0.0307632 0.9995804 0 0.02896833 0.9999802 0 0.006300822 0.9999998 0 8.16541e-4 0.9999731 0 0.007347546 0.9999802 0 0.006300822 0.9999933 0 0.003668675 0.9779215 0 0.2089729 0.987209 0 0.1594323 0.9976496 0 0.06852218 0.9903573 0 0.1385369 0.987209 0 0.1594323 0.9982851 0 0.05854204 0.9994937 0 0.03181947 0.9976496 0 0.06852218 0.9976496 0 0.06852218 0.9994937 0 0.03181947 0.9995804 0 0.02896833 0.9995267 0 0.0307632 0.9903573 0 0.1385369 0.9976496 0 0.06852218 0.9995267 0 0.0307632 0.9989193 0 0.04647733 0.999842 0 0.01777685 0.9999747 0 0.007129906 0.9999453 0 0.01046563 0.9999255 0 0.01221242 0.9999747 0 0.007129906 0.9999933 0 0.003668675 0.9999802 0 0.006300822 0.9999453 0 0.01046563 0.9999453 0 0.01046563 0.9999802 0 0.006300822 0.9995804 0 0.02896833 0.9994937 0 0.03181947 0.9999255 0 0.01221242 0.9999453 0 0.01046563 0.9994937 0 0.03181947 0.9982851 0 0.05854204 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999703 0 0.007723339 0.9998943 0 0.01454928 0.9999897 0 -0.004544858 0.9999703 0 0.007723339 0.9990218 0 0.04422333 0.9979157 0 0.06453054 0.9998943 0 0.01454928 0.9998943 0 0.01454928 0.9979157 0 0.06453054 0.9988946 0 0.04700707 0.9998478 0 -0.01744856 0.9999897 0 -0.004544858 0.9998943 0 0.01454928 0.9998478 0 -0.01744856 0.9997832 0 -0.02082664 0.9719549 0 0.2351678 0.9688382 0 0.2476946 0.9815924 0 0.1909879 0.9948754 0 0.1011088 0.9688382 0 0.2476946 0.9998615 0 0.01664593 0.9986002 0 0.05289463 0.9815924 0 0.1909879 0.9815924 0 0.1909879 0.9986002 0 0.05289463 0.9988946 0 0.04700707 0.9979157 0 0.06453054 0.9948754 0 0.1011088 0.9815924 0 0.1909879 0.9979157 0 0.06453054 0.9990218 0 0.04422333 0.9979855 0 -0.0634432 0.9972212 0 -0.07449818 0.9980865 0 -0.06183481 0.9893943 0 -0.1452553 0.9972212 0 -0.07449818 0.9997832 0 -0.02082664 0.9998478 0 -0.01744856 0.9980865 0 -0.06183481 0.9980865 0 -0.06183481 0.9998478 0 -0.01744856 0.9988946 0 0.04700707 0.9986002 0 0.05289463 0.9893943 0 -0.1452553 0.9980865 0 -0.06183481 0.9986002 0 0.05289463 0.9998615 0 0.01664593 0.9979855 0 -0.0634432 0.9991903 0 0.04023588 0.9998925 0 0.01466507 0.9972212 0 -0.07449818 0.9991903 0 0.04023588 0.9982944 0 -0.05838001 0.9994217 0 -0.03400599 0.9998925 0 0.01466507 0.9998925 0 0.01466507 0.9994217 0 -0.03400599 0.9999083 0 -0.01354959 0.9999991 0 -0.001408599 0.9972212 0 -0.07449818 0.9998925 0 0.01466507 0.9999991 0 -0.001408599 0.9997832 0 -0.02082664 0.9866253 0 -0.1630048 0.9921302 0 -0.1252108 0.9962949 0 -0.08600258 0.988967 0 -0.1481365 0.9921302 0 -0.1252108 0.9988102 0 -0.04876675 0.9992346 0 -0.03911935 0.9962949 0 -0.08600258 0.9962949 0 -0.08600258 0.9992346 0 -0.03911935 0.9999083 0 -0.01354959 0.9994217 0 -0.03400599 0.988967 0 -0.1481365 0.9962949 0 -0.08600258 0.9994217 0 -0.03400599 0.9982944 0 -0.05838001 1 0 0 0.9999897 0 -0.004544858 0.999975 0 -0.00708117 0.9999396 0 -0.01099733 0.9999897 0 -0.004544858 0.9997832 0 -0.02082664 0.9999991 0 -0.001408599 0.999975 0 -0.00708117 0.999975 0 -0.00708117 0.9999991 0 -0.001408599 0.9999083 0 -0.01354959 0.9992346 0 -0.03911935 0.9999396 0 -0.01099733 0.999975 0 -0.00708117 0.9992346 0 -0.03911935 0.9988102 0 -0.04876675</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape7-texbinormals-array" count="2400" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape7-vertices" name="qt_gauge_background_Shape7-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape7-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape7-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape7-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape7-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="1200">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape7-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape7-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape7-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape7-texbinormals" offset="2" set="0"/>
+ <p>34 34 0 477 477 1 482 482 3 482 482 3 477 477 1 177 177 2 477 477 4 89 89 5 177 177 7 177 177 7 89 89 5 327 327 6 177 177 8 327 327 9 329 329 11 329 329 11 327 327 9 127 39 10 482 482 12 177 177 13 91 91 15 91 91 15 177 177 13 329 329 14 38 38 16 479 479 17 478 478 19 478 478 19 479 479 17 178 178 18 479 479 20 90 90 21 178 178 23 178 178 23 90 90 21 328 328 22 178 178 24 328 328 25 327 327 27 327 327 27 328 328 25 127 39 26 478 478 28 178 178 29 89 89 31 89 89 31 178 178 29 327 327 30 36 36 32 481 481 33 480 480 35 480 480 35 481 481 33 179 179 34 481 481 36 91 91 37 179 179 39 179 179 39 91 91 37 329 329 38 329 329 41 127 39 42 179 179 40 179 179 40 127 39 42 328 328 43 179 179 45 328 328 46 480 480 44 480 480 44 328 328 46 90 90 47 23 23 48 483 483 49 488 488 51 488 488 51 483 483 49 180 180 50 483 483 52 92 92 53 180 180 55 180 180 55 92 92 53 330 330 54 330 330 57 128 40 58 180 180 56 180 180 56 128 40 58 332 332 59 180 180 61 332 332 62 488 488 60 488 488 60 332 332 62 94 94 63 22 22 64 485 485 65 484 484 67 484 484 67 485 485 65 181 181 66 485 485 68 93 93 69 181 181 71 181 181 71 93 93 69 331 331 70 331 331 73 128 40 74 181 181 72 181 181 72 128 40 74 330 330 75 484 484 76 181 181 77 92 92 79 92 92 79 181 181 77 330 330 78 21 21 80 487 487 81 486 486 83 486 486 83 487 487 81 182 182 82 487 487 84 94 94 85 182 182 87 182 182 87 94 94 85 332 332 86 182 182 88 332 332 89 331 331 91 331 331 91 332 332 89 128 40 90 486 486 92 182 182 93 93 93 95 93 93 95 182 182 93 331 331 94 18 18 96 489 489 97 494 494 99 494 494 99 489 489 97 183 183 98 489 489 100 95 95 101 183 183 103 183 183 103 95 95 101 333 333 102 183 183 104 333 333 105 335 335 107 335 335 107 333 333 105 129 41 106 494 494 108 183 183 109 97 97 111 97 97 111 183 183 109 335 335 110 491 491 113 184 184 114 4 4 112 4 4 112 184 184 114 490 490 115 96 96 117 334 334 118 491 491 116 491 491 116 334 334 118 184 184 119 334 334 121 129 41 122 184 184 120 184 184 120 129 41 122 333 333 123 184 184 125 333 333 126 490 490 124 490 490 124 333 333 126 95 95 127 9 9 128 493 493 129 492 492 131 492 492 131 493 493 129 185 185 130 97 97 133 335 335 134 493 493 132 493 493 132 335 335 134 185 185 135 335 335 137 129 41 138 185 185 136 185 185 136 129 41 138 334 334 139 492 492 140 185 185 141 96 96 143 96 96 143 185 185 141 334 334 142 14 14 144 495 495 145 500 500 147 500 500 147 495 495 145 186 186 146 98 98 149 336 336 150 495 495 148 495 495 148 336 336 150 186 186 151 336 336 153 130 42 154 186 186 152 186 186 152 130 42 154 338 338 155 186 186 157 338 338 158 500 500 156 500 500 156 338 338 158 100 100 159 11 11 160 497 497 161 496 496 163 496 496 163 497 497 161 187 187 162 497 497 164 99 99 165 187 187 167 187 187 167 99 99 165 337 337 166 337 337 169 130 42 170 187 187 168 187 187 168 130 42 170 336 336 171 496 496 172 187 187 173 98 98 175 98 98 175 187 187 173 336 336 174 18 18 176 499 499 177 498 498 179 498 498 179 499 499 177 188 188 178 499 499 180 100 100 181 188 188 183 188 188 183 100 100 181 338 338 182 188 188 184 338 338 185 337 337 187 337 337 187 338 338 185 130 42 186 188 188 189 337 337 190 498 498 188 498 498 188 337 337 190 99 99 191 10 10 192 501 501 193 506 506 195 506 506 195 501 501 193 189 189 194 501 501 196 101 101 197 189 189 199 189 189 199 101 101 197 339 339 198 189 189 200 339 339 201 341 341 203 341 341 203 339 339 201 131 43 202 506 506 204 189 189 205 103 103 207 103 103 207 189 189 205 341 341 206 12 12 208 503 503 209 502 502 211 502 502 211 503 503 209 190 190 210 503 503 212 102 102 213 190 190 215 190 190 215 102 102 213 340 340 214 340 340 217 131 43 218 190 190 216 190 190 216 131 43 218 339 339 219 190 190 221 339 339 222 502 502 220 502 502 220 339 339 222 101 101 223 15 15 224 505 505 225 504 504 227 504 504 227 505 505 225 191 191 226 103 103 229 341 341 230 505 505 228 505 505 228 341 341 230 191 191 231 341 341 233 131 43 234 191 191 232 191 191 232 131 43 234 340 340 235 191 191 237 340 340 238 504 504 236 504 504 236 340 340 238 102 102 239 16 16 240 507 507 241 512 512 243 512 512 243 507 507 241 192 192 242 507 507 244 104 104 245 192 192 247 192 192 247 104 104 245 342 342 246 192 192 248 342 342 249 344 344 251 344 344 251 342 342 249 132 44 250 512 512 252 192 192 253 106 106 255 106 106 255 192 192 253 344 344 254 14 14 256 509 509 257 508 508 259 508 508 259 509 509 257 193 193 258 509 509 260 105 105 261 193 193 263 193 193 263 105 105 261 343 343 262 193 193 264 343 343 265 342 342 267 342 342 267 343 343 265 132 44 266 508 508 268 193 193 269 104 104 271 104 104 271 193 193 269 342 342 270 17 17 272 511 511 273 510 510 275 510 510 275 511 511 273 194 194 274 106 106 277 344 344 278 511 511 276 511 511 276 344 344 278 194 194 279 344 344 281 132 44 282 194 194 280 194 194 280 132 44 282 343 343 283 194 194 285 343 343 286 510 510 284 510 510 284 343 343 286 105 105 287 5 5 288 513 513 289 516 516 291 516 516 291 513 513 289 195 195 290 513 513 292 107 107 293 195 195 295 195 195 295 107 107 293 345 345 294 195 195 296 345 345 297 347 347 299 347 347 299 345 345 297 133 45 298 516 516 300 195 195 301 108 108 303 108 108 303 195 195 301 347 347 302 512 512 305 196 196 306 16 16 304 16 16 304 196 196 306 514 514 307 106 106 309 346 346 310 512 512 308 512 512 308 346 346 310 196 196 311 346 346 313 133 45 314 196 196 312 196 196 312 133 45 314 345 345 315 196 196 317 345 345 318 514 514 316 514 514 316 345 345 318 107 107 319 17 17 320 515 515 321 511 511 323 511 511 323 515 515 321 197 197 322 108 108 325 347 347 326 515 515 324 515 515 324 347 347 326 197 197 327 197 197 328 347 347 329 346 346 331 346 346 331 347 347 329 133 45 330 511 511 332 197 197 333 106 106 335 106 106 335 197 197 333 346 346 334 15 15 336 517 517 337 522 522 339 522 522 339 517 517 337 198 198 338 517 517 340 109 109 341 198 198 343 198 198 343 109 109 341 348 348 342 198 198 344 348 348 345 350 350 347 350 350 347 348 348 345 134 46 346 522 522 348 198 198 349 111 111 351 111 111 351 198 198 349 350 350 350 519 519 353 199 199 354 17 17 352 17 17 352 199 199 354 518 518 355 110 110 357 349 349 358 519 519 356 519 519 356 349 349 358 199 199 359 349 349 361 134 46 362 199 199 360 199 199 360 134 46 362 348 348 363 199 199 365 348 348 366 518 518 364 518 518 364 348 348 366 109 109 367 18 18 368 521 521 369 520 520 371 520 520 371 521 521 369 200 200 370 111 111 373 350 350 374 521 521 372 521 521 372 350 350 374 200 200 375 350 350 377 134 46 378 200 200 376 200 200 376 134 46 378 349 349 379 520 520 380 200 200 381 110 110 383 110 110 383 200 200 381 349 349 382 10 10 384 523 523 385 528 528 387 528 528 387 523 523 385 201 201 386 523 523 388 112 112 389 201 201 391 201 201 391 112 112 389 351 351 390 351 351 393 135 47 394 201 201 392 201 201 392 135 47 394 353 353 395 201 201 397 353 353 398 528 528 396 528 528 396 353 353 398 114 114 399 13 13 400 525 525 401 524 524 403 524 524 403 525 525 401 202 202 402 113 113 405 352 352 406 525 525 404 525 525 404 352 352 406 202 202 407 352 352 409 135 47 410 202 202 408 202 202 408 135 47 410 351 351 411 524 524 412 202 202 413 112 112 415 112 112 415 202 202 413 351 351 414 19 19 416 527 527 417 526 526 419 526 526 419 527 527 417 203 203 418 527 527 420 114 114 421 203 203 423 203 203 423 114 114 421 353 353 422 203 203 424 353 353 425 352 352 427 352 352 427 353 353 425 135 47 426 526 526 428 203 203 429 113 113 431 113 113 431 203 203 429 352 352 430 19 19 432 529 529 433 534 534 435 534 534 435 529 529 433 204 204 434 529 529 436 115 115 437 204 204 439 204 204 439 115 115 437 354 354 438 204 204 440 354 354 441 356 356 443 356 356 443 354 354 441 136 48 442 534 534 444 204 204 445 117 117 447 117 117 447 204 204 445 356 356 446 531 531 449 205 205 450 9 9 448 9 9 448 205 205 450 530 530 451 116 116 453 355 355 454 531 531 452 531 531 452 355 355 454 205 205 455 355 355 457 136 48 458 205 205 456 205 205 456 136 48 458 354 354 459 205 205 461 354 354 462 530 530 460 530 530 460 354 354 462 115 115 463 21 21 464 533 533 465 532 532 467 532 532 467 533 533 465 206 206 466 117 117 469 356 356 470 533 533 468 533 533 468 356 356 470 206 206 471 356 356 473 136 48 474 206 206 472 206 206 472 136 48 474 355 355 475 532 532 476 206 206 477 116 116 479 116 116 479 206 206 477 355 355 478 8 8 480 535 535 481 540 540 483 540 540 483 535 535 481 207 207 482 535 535 484 118 118 485 207 207 487 207 207 487 118 118 485 357 357 486 207 207 488 357 357 489 359 359 491 359 359 491 357 357 489 137 49 490 540 540 492 207 207 493 120 120 495 120 120 495 207 207 493 359 359 494 537 537 497 208 208 498 19 19 496 19 19 496 208 208 498 536 536 499 119 119 501 358 358 502 537 537 500 537 537 500 358 358 502 208 208 503 358 358 505 137 49 506 208 208 504 208 208 504 137 49 506 357 357 507 208 208 509 357 357 510 536 536 508 536 536 508 357 357 510 118 118 511 539 539 513 209 209 514 22 22 512 22 22 512 209 209 514 538 538 515 120 120 517 359 359 518 539 539 516 539 539 516 359 359 518 209 209 519 359 359 521 137 49 522 209 209 520 209 209 520 137 49 522 358 358 523 538 538 524 209 209 525 119 119 527 119 119 527 209 209 525 358 358 526 23 23 528 541 541 529 546 546 531 546 546 531 541 541 529 210 210 530 541 541 532 121 121 533 210 210 535 210 210 535 121 121 533 360 360 534 210 210 536 360 360 537 362 362 539 362 362 539 360 360 537 138 50 538 546 546 540 210 210 541 123 123 543 123 123 543 210 210 541 362 362 542 543 543 545 211 211 546 7 7 544 7 7 544 211 211 546 542 542 547 122 122 549 361 361 550 543 543 548 543 543 548 361 361 550 211 211 551 361 361 553 138 50 554 211 211 552 211 211 552 138 50 554 360 360 555 211 211 557 360 360 558 542 542 556 542 542 556 360 360 558 121 121 559 1 1 560 545 545 561 544 544 563 544 544 563 545 545 561 212 212 562 123 123 565 362 362 566 545 545 564 545 545 564 362 362 566 212 212 567 362 362 569 138 50 570 212 212 568 212 212 568 138 50 570 361 361 571 544 544 572 212 212 573 122 122 575 122 122 575 212 212 573 361 361 574 547 547 577 213 213 578 26 26 576 26 26 576 213 213 578 552 552 579 124 124 581 363 363 582 547 547 580 547 547 580 363 363 582 213 213 583 363 363 585 139 51 586 213 213 584 213 213 584 139 51 586 365 365 587 213 213 589 365 365 590 552 552 588 552 552 588 365 365 590 126 126 591 549 549 593 214 214 594 24 24 592 24 24 592 214 214 594 548 548 595 125 125 597 364 364 598 549 549 596 549 549 596 364 364 598 214 214 599 364 364 601 139 51 602 214 214 600 214 214 600 139 51 602 363 363 603 548 548 604 214 214 605 124 124 607 124 124 607 214 214 605 363 363 606 28 28 608 551 551 609 550 550 611 550 550 611 551 551 609 215 215 610 551 551 612 126 126 613 215 215 615 215 215 615 126 126 613 365 365 614 215 215 616 365 365 617 364 364 619 364 364 619 365 365 617 139 51 618 550 550 620 215 215 621 125 125 623 125 125 623 215 215 621 364 364 622 553 553 625 216 216 626 6 6 624 6 6 624 216 216 626 558 558 627 39 127 629 366 366 630 553 553 628 553 553 628 366 366 630 216 216 631 366 366 633 140 52 634 216 216 632 216 216 632 140 52 634 368 368 635 216 216 637 368 368 638 558 558 636 558 558 636 368 368 638 41 129 639 26 26 640 555 555 641 554 554 643 554 554 643 555 555 641 217 217 642 40 128 645 367 367 646 555 555 644 555 555 644 367 367 646 217 217 647 367 367 649 140 52 650 217 217 648 217 217 648 140 52 650 366 366 651 554 554 652 217 217 653 39 127 655 39 127 655 217 217 653 366 366 654 23 23 656 557 557 657 556 556 659 556 556 659 557 557 657 218 218 658 557 557 660 41 129 661 218 218 663 218 218 663 41 129 661 368 368 662 218 218 664 368 368 665 367 367 667 367 367 667 368 368 665 140 52 666 556 556 668 218 218 669 40 128 671 40 128 671 218 218 669 367 367 670 559 559 673 219 219 674 27 27 672 27 27 672 219 219 674 562 562 675 42 130 677 369 369 678 559 559 676 559 559 676 369 369 678 219 219 679 369 369 681 141 53 682 219 219 680 219 219 680 141 53 682 371 371 683 219 219 685 371 371 686 562 562 684 562 562 684 371 371 686 43 131 687 7 7 688 542 542 689 560 560 691 560 560 691 542 542 689 220 220 690 121 121 693 370 370 694 542 542 692 542 542 692 370 370 694 220 220 695 370 370 697 141 53 698 220 220 696 220 220 696 141 53 698 369 369 699 560 560 700 220 220 701 42 130 703 42 130 703 220 220 701 369 369 702 23 23 704 561 561 705 541 541 707 541 541 707 561 561 705 221 221 706 561 561 708 43 131 709 221 221 711 221 221 711 43 131 709 371 371 710 221 221 712 371 371 713 370 370 715 370 370 715 371 371 713 141 53 714 541 541 716 221 221 717 121 121 719 121 121 719 221 221 717 370 370 718 25 25 720 563 563 721 568 568 723 568 568 723 563 563 721 222 222 722 563 563 724 44 132 725 222 222 727 222 222 727 44 132 725 372 372 726 372 372 729 142 54 730 222 222 728 222 222 728 142 54 730 374 374 731 222 222 733 374 374 734 568 568 732 568 568 732 374 374 734 46 134 735 565 565 737 223 223 738 27 27 736 27 27 736 223 223 738 564 564 739 45 133 741 373 373 742 565 565 740 565 565 740 373 373 742 223 223 743 373 373 745 142 54 746 223 223 744 223 223 744 142 54 746 372 372 747 564 564 748 223 223 749 44 132 751 44 132 751 223 223 749 372 372 750 28 28 752 567 567 753 566 566 755 566 566 755 567 567 753 224 224 754 567 567 756 46 134 757 224 224 759 224 224 759 46 134 757 374 374 758 224 224 760 374 374 761 373 373 763 373 373 763 374 374 761 142 54 762 566 566 764 224 224 765 45 133 767 45 133 767 224 224 765 373 373 766 37 37 768 569 569 769 574 574 771 574 574 771 569 569 769 225 225 770 569 569 772 47 135 773 225 225 775 225 225 775 47 135 773 375 375 774 225 225 776 375 375 777 377 377 779 377 377 779 375 375 777 143 55 778 574 574 780 225 225 781 49 137 783 49 137 783 225 225 781 377 377 782 571 571 785 226 226 786 32 32 784 32 32 784 226 226 786 570 570 787 48 136 789 376 376 790 571 571 788 571 571 788 376 376 790 226 226 791 376 376 793 143 55 794 226 226 792 226 226 792 143 55 794 375 375 795 226 226 797 375 375 798 570 570 796 570 570 796 375 375 798 47 135 799 29 29 800 573 573 801 572 572 803 572 572 803 573 573 801 227 227 802 49 137 805 377 377 806 573 573 804 573 573 804 377 377 806 227 227 807 377 377 809 143 55 810 227 227 808 227 227 808 143 55 810 376 376 811 572 572 812 227 227 813 48 136 815 48 136 815 227 227 813 376 376 814 31 31 816 575 575 817 580 580 819 580 580 819 575 575 817 228 228 818 575 575 820 50 138 821 228 228 823 228 228 823 50 138 821 378 378 822 228 228 824 378 378 825 380 380 827 380 380 827 378 378 825 144 56 826 580 580 828 228 228 829 52 140 831 52 140 831 228 228 829 380 380 830 25 25 832 577 577 833 576 576 835 576 576 835 577 577 833 229 229 834 51 139 837 379 379 838 577 577 836 577 577 836 379 379 838 229 229 839 379 379 841 144 56 842 229 229 840 229 229 840 144 56 842 378 378 843 576 576 844 229 229 845 50 138 847 50 138 847 229 229 845 378 378 846 29 29 848 579 579 849 578 578 851 578 578 851 579 579 849 230 230 850 579 579 852 52 140 853 230 230 855 230 230 855 52 140 853 380 380 854 230 230 856 380 380 857 379 379 859 379 379 859 380 380 857 144 56 858 578 578 860 230 230 861 51 139 863 51 139 863 230 230 861 379 379 862 31 31 864 581 581 865 586 586 867 586 586 867 581 581 865 231 231 866 581 581 868 53 141 869 231 231 871 231 231 871 53 141 869 381 381 870 231 231 872 381 381 873 383 383 875 383 383 875 381 381 873 145 57 874 231 231 877 383 383 878 586 586 876 586 586 876 383 383 878 55 143 879 583 583 881 232 232 882 32 32 880 32 32 880 232 232 882 582 582 883 54 142 885 382 382 886 583 583 884 583 583 884 382 382 886 232 232 887 382 382 889 145 57 890 232 232 888 232 232 888 145 57 890 381 381 891 232 232 893 381 381 894 582 582 892 582 582 892 381 381 894 53 141 895 35 35 896 585 585 897 584 584 899 584 584 899 585 585 897 233 233 898 585 585 900 55 143 901 233 233 903 233 233 903 55 143 901 383 383 902 233 233 904 383 383 905 382 382 907 382 382 907 383 383 905 145 57 906 584 584 908 233 233 909 54 142 911 54 142 911 233 233 909 382 382 910 34 34 912 482 482 913 590 590 915 590 590 915 482 482 913 234 234 914 482 482 916 91 91 917 234 234 919 234 234 919 91 91 917 384 384 918 234 234 920 384 384 921 386 386 923 386 386 923 384 384 921 146 58 922 590 590 924 234 234 925 57 145 927 57 145 927 234 234 925 386 386 926 36 36 928 587 587 929 481 481 931 481 481 931 587 587 929 235 235 930 56 144 933 385 385 934 587 587 932 587 587 932 385 385 934 235 235 935 385 385 937 146 58 938 235 235 936 235 235 936 146 58 938 384 384 939 235 235 941 384 384 942 481 481 940 481 481 940 384 384 942 91 91 943 37 37 944 589 589 945 588 588 947 588 588 947 589 589 945 236 236 946 57 145 949 386 386 950 589 589 948 589 589 948 386 386 950 236 236 951 386 386 953 146 58 954 236 236 952 236 236 952 146 58 954 385 385 955 588 588 956 236 236 957 56 144 959 56 144 959 236 236 957 385 385 958 32 32 960 570 570 961 592 592 963 592 592 963 570 570 961 237 237 962 570 570 964 47 135 965 237 237 967 237 237 967 47 135 965 387 387 966 237 237 968 387 387 969 389 389 971 389 389 971 387 387 969 147 59 970 592 592 972 237 237 973 58 146 975 58 146 975 237 237 973 389 389 974 37 37 976 588 588 977 569 569 979 569 569 979 588 588 977 238 238 978 56 144 981 388 388 982 588 588 980 588 588 980 388 388 982 238 238 983 388 388 985 147 59 986 238 238 984 238 238 984 147 59 986 387 387 987 238 238 989 387 387 990 569 569 988 569 569 988 387 387 990 47 135 991 36 36 992 591 591 993 587 587 995 587 587 995 591 591 993 239 239 994 58 146 997 389 389 998 591 591 996 591 591 996 389 389 998 239 239 999 389 389 1001 147 59 1002 239 239 1000 239 239 1000 147 59 1002 388 388 1003 587 587 1004 239 239 1005 56 144 1007 56 144 1007 239 239 1005 388 388 1006 593 593 1009 240 240 1010 33 33 1008 33 33 1008 240 240 1010 598 598 1011 59 147 1013 390 390 1014 593 593 1012 593 593 1012 390 390 1014 240 240 1015 390 390 1017 148 60 1018 240 240 1016 240 240 1016 148 60 1018 392 392 1019 240 240 1021 392 392 1022 598 598 1020 598 598 1020 392 392 1022 61 149 1023 35 35 1024 595 595 1025 594 594 1027 594 594 1027 595 595 1025 241 241 1026 595 595 1028 60 148 1029 241 241 1031 241 241 1031 60 148 1029 391 391 1030 391 391 1033 148 60 1034 241 241 1032 241 241 1032 148 60 1034 390 390 1035 594 594 1036 241 241 1037 59 147 1039 59 147 1039 241 241 1037 390 390 1038 36 36 1040 597 597 1041 596 596 1043 596 596 1043 597 597 1041 242 242 1042 597 597 1044 61 149 1045 242 242 1047 242 242 1047 61 149 1045 392 392 1046 242 242 1048 392 392 1049 391 391 1051 391 391 1051 392 392 1049 148 60 1050 596 596 1052 242 242 1053 60 148 1055 60 148 1055 242 242 1053 391 391 1054 0 0 1056 599 599 1057 602 602 1059 602 602 1059 599 599 1057 243 243 1058 599 599 1060 62 150 1061 243 243 1063 243 243 1063 62 150 1061 393 393 1062 393 393 1065 149 61 1066 243 243 1064 243 243 1064 149 61 1066 395 395 1067 243 243 1069 395 395 1070 602 602 1068 602 602 1068 395 395 1070 63 151 1071 558 558 1073 244 244 1074 6 6 1072 6 6 1072 244 244 1074 600 600 1075 41 129 1077 394 394 1078 558 558 1076 558 558 1076 394 394 1078 244 244 1079 394 394 1081 149 61 1082 244 244 1080 244 244 1080 149 61 1082 393 393 1083 244 244 1085 393 393 1086 600 600 1084 600 600 1084 393 393 1086 62 150 1087 23 23 1088 601 601 1089 557 557 1091 557 557 1091 601 601 1089 245 245 1090 601 601 1092 63 151 1093 245 245 1095 245 245 1095 63 151 1093 395 395 1094 245 245 1096 395 395 1097 394 394 1099 394 394 1099 395 395 1097 149 61 1098 557 557 1100 245 245 1101 41 129 1103 41 129 1103 245 245 1101 394 394 1102 23 23 1104 488 488 1105 601 601 1107 601 601 1107 488 488 1105 246 246 1106 488 488 1108 94 94 1109 246 246 1111 246 246 1111 94 94 1109 396 396 1110 246 246 1112 396 396 1113 398 398 1115 398 398 1115 396 396 1113 150 62 1114 601 601 1116 246 246 1117 63 151 1119 63 151 1119 246 246 1117 398 398 1118 21 21 1120 603 603 1121 487 487 1123 487 487 1123 603 603 1121 247 247 1122 603 603 1124 64 152 1125 247 247 1127 247 247 1127 64 152 1125 397 397 1126 397 397 1129 150 62 1130 247 247 1128 247 247 1128 150 62 1130 396 396 1131 247 247 1133 396 396 1134 487 487 1132 487 487 1132 396 396 1134 94 94 1135 602 602 1137 248 248 1138 0 0 1136 0 0 1136 248 248 1138 604 604 1139 63 151 1141 398 398 1142 602 602 1140 602 602 1140 398 398 1142 248 248 1143 398 398 1145 150 62 1146 248 248 1144 248 248 1144 150 62 1146 397 397 1147 248 248 1149 397 397 1150 604 604 1148 604 604 1148 397 397 1150 64 152 1151 605 605 1153 249 249 1154 11 11 1152 11 11 1152 249 249 1154 497 497 1155 65 153 1157 399 399 1158 605 605 1156 605 605 1156 399 399 1158 249 249 1159 399 399 1161 151 63 1162 249 249 1160 249 249 1160 151 63 1162 401 401 1163 249 249 1165 401 401 1166 497 497 1164 497 497 1164 401 401 1166 99 99 1167 4 4 1168 490 490 1169 606 606 1171 606 606 1171 490 490 1169 250 250 1170 490 490 1172 95 95 1173 250 250 1175 250 250 1175 95 95 1173 400 400 1174 250 250 1176 400 400 1177 399 399 1179 399 399 1179 400 400 1177 151 63 1178 606 606 1180 250 250 1181 65 153 1183 65 153 1183 250 250 1181 399 399 1182 18 18 1184 498 498 1185 489 489 1187 489 489 1187 498 498 1185 251 251 1186 498 498 1188 99 99 1189 251 251 1191 251 251 1191 99 99 1189 401 401 1190 251 251 1192 401 401 1193 400 400 1195 400 400 1195 401 401 1193 151 63 1194 251 251 1197 400 400 1198 489 489 1196 489 489 1196 400 400 1198 95 95 1199 19 19 1200 526 526 1201 610 610 1203 610 610 1203 526 526 1201 252 252 1202 526 526 1204 113 113 1205 252 252 1207 252 252 1207 113 113 1205 402 402 1206 402 402 1209 152 64 1210 252 252 1208 252 252 1208 152 64 1210 404 404 1211 252 252 1213 404 404 1214 610 610 1212 610 610 1212 404 404 1214 67 155 1215 13 13 1216 607 607 1217 525 525 1219 525 525 1219 607 607 1217 253 253 1218 607 607 1220 66 154 1221 253 253 1223 253 253 1223 66 154 1221 403 403 1222 403 403 1225 152 64 1226 253 253 1224 253 253 1224 152 64 1226 402 402 1227 525 525 1228 253 253 1229 113 113 1231 113 113 1231 253 253 1229 402 402 1230 18 18 1232 609 609 1233 608 608 1235 608 608 1235 609 609 1233 254 254 1234 609 609 1236 67 155 1237 254 254 1239 254 254 1239 67 155 1237 404 404 1238 254 254 1240 404 404 1241 403 403 1243 403 403 1243 404 404 1241 152 64 1242 608 608 1244 254 254 1245 66 154 1247 66 154 1247 254 254 1245 403 403 1246 9 9 1248 530 530 1249 493 493 1251 493 493 1251 530 530 1249 255 255 1250 530 530 1252 115 115 1253 255 255 1255 255 255 1255 115 115 1253 405 405 1254 255 255 1256 405 405 1257 407 407 1259 407 407 1259 405 405 1257 153 65 1258 493 493 1260 255 255 1261 97 97 1263 97 97 1263 255 255 1261 407 407 1262 19 19 1264 610 610 1265 529 529 1267 529 529 1267 610 610 1265 256 256 1266 610 610 1268 67 155 1269 256 256 1271 256 256 1271 67 155 1269 406 406 1270 406 406 1273 153 65 1274 256 256 1272 256 256 1272 153 65 1274 405 405 1275 256 256 1277 405 405 1278 529 529 1276 529 529 1276 405 405 1278 115 115 1279 18 18 1280 494 494 1281 609 609 1283 609 609 1283 494 494 1281 257 257 1282 97 97 1285 407 407 1286 494 494 1284 494 494 1284 407 407 1286 257 257 1287 407 407 1289 153 65 1290 257 257 1288 257 257 1288 153 65 1290 406 406 1291 257 257 1293 406 406 1294 609 609 1292 609 609 1292 406 406 1294 67 155 1295 18 18 1296 520 520 1297 499 499 1299 499 499 1299 520 520 1297 258 258 1298 110 110 1301 408 408 1302 520 520 1300 520 520 1300 408 408 1302 258 258 1303 408 408 1305 154 66 1306 258 258 1304 258 258 1304 154 66 1306 410 410 1307 258 258 1309 410 410 1310 499 499 1308 499 499 1308 410 410 1310 100 100 1311 17 17 1312 510 510 1313 519 519 1315 519 519 1315 510 510 1313 259 259 1314 510 510 1316 105 105 1317 259 259 1319 259 259 1319 105 105 1317 409 409 1318 409 409 1321 154 66 1322 259 259 1320 259 259 1320 154 66 1322 408 408 1323 519 519 1324 259 259 1325 110 110 1327 110 110 1327 259 259 1325 408 408 1326 14 14 1328 500 500 1329 509 509 1331 509 509 1331 500 500 1329 260 260 1330 500 500 1332 100 100 1333 260 260 1335 260 260 1335 100 100 1333 410 410 1334 260 260 1336 410 410 1337 409 409 1339 409 409 1339 410 410 1337 154 66 1338 509 509 1340 260 260 1341 105 105 1343 105 105 1343 260 260 1341 409 409 1342 15 15 1344 611 611 1345 505 505 1347 505 505 1347 611 611 1345 261 261 1346 611 611 1348 68 156 1349 261 261 1351 261 261 1351 68 156 1349 411 411 1350 261 261 1352 411 411 1353 413 413 1355 413 413 1355 411 411 1353 155 67 1354 505 505 1356 261 261 1357 103 103 1359 103 103 1359 261 261 1357 413 413 1358 524 524 1361 262 262 1362 13 13 1360 13 13 1360 262 262 1362 612 612 1363 112 112 1365 412 412 1366 524 524 1364 524 524 1364 412 412 1366 262 262 1367 412 412 1369 155 67 1370 262 262 1368 262 262 1368 155 67 1370 411 411 1371 262 262 1373 411 411 1374 612 612 1372 612 612 1372 411 411 1374 68 156 1375 10 10 1376 506 506 1377 523 523 1379 523 523 1379 506 506 1377 263 263 1378 103 103 1381 413 413 1382 506 506 1380 506 506 1380 413 413 1382 263 263 1383 263 263 1384 413 413 1385 412 412 1387 412 412 1387 413 413 1385 155 67 1386 523 523 1388 263 263 1389 112 112 1391 112 112 1391 263 263 1389 412 412 1390 17 17 1392 518 518 1393 614 614 1395 614 614 1395 518 518 1393 264 264 1394 518 518 1396 109 109 1397 264 264 1399 264 264 1399 109 109 1397 414 414 1398 264 264 1400 414 414 1401 416 416 1403 416 416 1403 414 414 1401 156 68 1402 614 614 1404 264 264 1405 69 157 1407 69 157 1407 264 264 1405 416 416 1406 504 504 1409 265 265 1410 15 15 1408 15 15 1408 265 265 1410 517 517 1411 102 102 1413 415 415 1414 504 504 1412 504 504 1412 415 415 1414 265 265 1415 415 415 1417 156 68 1418 265 265 1416 265 265 1416 156 68 1418 414 414 1419 265 265 1421 414 414 1422 517 517 1420 517 517 1420 414 414 1422 109 109 1423 613 613 1425 266 266 1426 12 12 1424 12 12 1424 266 266 1426 503 503 1427 69 157 1429 416 416 1430 613 613 1428 613 613 1428 416 416 1430 266 266 1431 416 416 1433 156 68 1434 266 266 1432 266 266 1432 156 68 1434 415 415 1435 266 266 1437 415 415 1438 503 503 1436 503 503 1436 415 415 1438 102 102 1439 17 17 1440 614 614 1441 515 515 1443 515 515 1443 614 614 1441 267 267 1442 69 157 1445 417 417 1446 614 614 1444 614 614 1444 417 417 1446 267 267 1447 267 267 1448 417 417 1449 419 419 1451 419 419 1451 417 417 1449 157 69 1450 515 515 1452 267 267 1453 108 108 1455 108 108 1455 267 267 1453 419 419 1454 12 12 1456 615 615 1457 613 613 1459 613 613 1459 615 615 1457 268 268 1458 615 615 1460 70 158 1461 268 268 1463 268 268 1463 70 158 1461 418 418 1462 268 268 1464 418 418 1465 417 417 1467 417 417 1467 418 418 1465 157 69 1466 613 613 1468 268 268 1469 69 157 1471 69 157 1471 268 268 1469 417 417 1470 516 516 1473 269 269 1474 5 5 1472 5 5 1472 269 269 1474 616 616 1475 108 108 1477 419 419 1478 516 516 1476 516 516 1476 419 419 1478 269 269 1479 419 419 1481 157 69 1482 269 269 1480 269 269 1480 157 69 1482 418 418 1483 269 269 1485 418 418 1486 616 616 1484 616 616 1484 418 418 1486 70 158 1487 18 18 1488 608 608 1489 521 521 1491 521 521 1491 608 608 1489 270 270 1490 608 608 1492 66 154 1493 270 270 1495 270 270 1495 66 154 1493 420 420 1494 270 270 1496 420 420 1497 422 422 1499 422 422 1499 420 420 1497 158 70 1498 521 521 1500 270 270 1501 111 111 1503 111 111 1503 270 270 1501 422 422 1502 612 612 1505 271 271 1506 13 13 1504 13 13 1504 271 271 1506 607 607 1507 612 612 1508 68 156 1509 271 271 1511 271 271 1511 68 156 1509 421 421 1510 421 421 1513 158 70 1514 271 271 1512 271 271 1512 158 70 1514 420 420 1515 271 271 1517 420 420 1518 607 607 1516 607 607 1516 420 420 1518 66 154 1519 522 522 1521 272 272 1522 15 15 1520 15 15 1520 272 272 1522 611 611 1523 111 111 1525 422 422 1526 522 522 1524 522 522 1524 422 422 1526 272 272 1527 422 422 1529 158 70 1530 272 272 1528 272 272 1528 158 70 1530 421 421 1531 272 272 1533 421 421 1534 611 611 1532 611 611 1532 421 421 1534 68 156 1535 19 19 1536 536 536 1537 527 527 1539 527 527 1539 536 536 1537 273 273 1538 536 536 1540 118 118 1541 273 273 1543 273 273 1543 118 118 1541 423 423 1542 273 273 1544 423 423 1545 425 425 1547 425 425 1547 423 423 1545 159 71 1546 527 527 1548 273 273 1549 114 114 1551 114 114 1551 273 273 1549 425 425 1550 8 8 1552 617 617 1553 535 535 1555 535 535 1555 617 617 1553 274 274 1554 617 617 1556 71 159 1557 274 274 1559 274 274 1559 71 159 1557 424 424 1558 424 424 1561 159 71 1562 274 274 1560 274 274 1560 159 71 1562 423 423 1563 274 274 1565 423 423 1566 535 535 1564 535 535 1564 423 423 1566 118 118 1567 10 10 1568 528 528 1569 618 618 1571 618 618 1571 528 528 1569 275 275 1570 528 528 1572 114 114 1573 275 275 1575 275 275 1575 114 114 1573 425 425 1574 275 275 1576 425 425 1577 424 424 1579 424 424 1579 425 425 1577 159 71 1578 618 618 1580 275 275 1581 71 159 1583 71 159 1583 275 275 1581 424 424 1582 21 21 1584 486 486 1585 533 533 1587 533 533 1587 486 486 1585 276 276 1586 486 486 1588 93 93 1589 276 276 1591 276 276 1591 93 93 1589 426 426 1590 276 276 1592 426 426 1593 428 428 1595 428 428 1595 426 426 1593 160 72 1594 533 533 1596 276 276 1597 117 117 1599 117 117 1599 276 276 1597 428 428 1598 22 22 1600 538 538 1601 485 485 1603 485 485 1603 538 538 1601 277 277 1602 119 119 1605 427 427 1606 538 538 1604 538 538 1604 427 427 1606 277 277 1607 427 427 1609 160 72 1610 277 277 1608 277 277 1608 160 72 1610 426 426 1611 277 277 1613 426 426 1614 485 485 1612 485 485 1612 426 426 1614 93 93 1615 19 19 1616 534 534 1617 537 537 1619 537 537 1619 534 534 1617 278 278 1618 117 117 1621 428 428 1622 534 534 1620 534 534 1620 428 428 1622 278 278 1623 428 428 1625 160 72 1626 278 278 1624 278 278 1624 160 72 1626 427 427 1627 537 537 1628 278 278 1629 119 119 1631 119 119 1631 278 278 1629 427 427 1630 22 22 1632 619 619 1633 539 539 1635 539 539 1635 619 619 1633 279 279 1634 619 619 1636 72 160 1637 279 279 1639 279 279 1639 72 160 1637 429 429 1638 279 279 1640 429 429 1641 431 431 1643 431 431 1643 429 429 1641 161 73 1642 539 539 1644 279 279 1645 120 120 1647 120 120 1647 279 279 1645 431 431 1646 621 621 1649 280 280 1650 20 20 1648 20 20 1648 280 280 1650 620 620 1651 73 161 1653 430 430 1654 621 621 1652 621 621 1652 430 430 1654 280 280 1655 430 430 1657 161 73 1658 280 280 1656 280 280 1656 161 73 1658 429 429 1659 280 280 1661 429 429 1662 620 620 1660 620 620 1660 429 429 1662 72 160 1663 8 8 1664 540 540 1665 622 622 1667 622 622 1667 540 540 1665 281 281 1666 120 120 1669 431 431 1670 540 540 1668 540 540 1668 431 431 1670 281 281 1671 431 431 1673 161 73 1674 281 281 1672 281 281 1672 161 73 1674 430 430 1675 622 622 1676 281 281 1677 73 161 1679 73 161 1679 281 281 1677 430 430 1678 20 20 1680 620 620 1681 624 624 1683 624 624 1683 620 620 1681 282 282 1682 620 620 1684 72 160 1685 282 282 1687 282 282 1687 72 160 1685 432 432 1686 282 282 1688 432 432 1689 434 434 1691 434 434 1691 432 432 1689 162 74 1690 624 624 1692 282 282 1693 74 162 1695 74 162 1695 282 282 1693 434 434 1694 484 484 1697 283 283 1698 22 22 1696 22 22 1696 283 283 1698 619 619 1699 92 92 1701 433 433 1702 484 484 1700 484 484 1700 433 433 1702 283 283 1703 433 433 1705 162 74 1706 283 283 1704 283 283 1704 162 74 1706 432 432 1707 283 283 1709 432 432 1710 619 619 1708 619 619 1708 432 432 1710 72 160 1711 23 23 1712 623 623 1713 483 483 1715 483 483 1715 623 623 1713 284 284 1714 74 162 1717 434 434 1718 623 623 1716 623 623 1716 434 434 1718 284 284 1719 434 434 1721 162 74 1722 284 284 1720 284 284 1720 162 74 1722 433 433 1723 483 483 1724 284 284 1725 92 92 1727 92 92 1727 284 284 1725 433 433 1726 625 625 1729 285 285 1730 1 1 1728 1 1 1728 285 285 1730 545 545 1731 75 163 1733 435 435 1734 625 625 1732 625 625 1732 435 435 1734 285 285 1735 435 435 1737 163 75 1738 285 285 1736 285 285 1736 163 75 1738 437 437 1739 285 285 1741 437 437 1742 545 545 1740 545 545 1740 437 437 1742 123 123 1743 20 20 1744 624 624 1745 626 626 1747 626 626 1747 624 624 1745 286 286 1746 74 162 1749 436 436 1750 624 624 1748 624 624 1748 436 436 1750 286 286 1751 436 436 1753 163 75 1754 286 286 1752 286 286 1752 163 75 1754 435 435 1755 626 626 1756 286 286 1757 75 163 1759 75 163 1759 286 286 1757 435 435 1758 23 23 1760 546 546 1761 623 623 1763 623 623 1763 546 546 1761 287 287 1762 546 546 1764 123 123 1765 287 287 1767 287 287 1767 123 123 1765 437 437 1766 287 287 1768 437 437 1769 436 436 1771 436 436 1771 437 437 1769 163 75 1770 623 623 1772 287 287 1773 74 162 1775 74 162 1775 287 287 1773 436 436 1774 24 24 1776 627 627 1777 549 549 1779 549 549 1779 627 627 1777 288 288 1778 627 627 1780 76 164 1781 288 288 1783 288 288 1783 76 164 1781 438 438 1782 288 288 1784 438 438 1785 440 440 1787 440 440 1787 438 438 1785 164 76 1786 549 549 1788 288 288 1789 125 125 1791 125 125 1791 288 288 1789 440 440 1790 29 29 1792 629 629 1793 628 628 1795 628 628 1795 629 629 1793 289 289 1794 629 629 1796 77 165 1797 289 289 1799 289 289 1799 77 165 1797 439 439 1798 439 439 1801 164 76 1802 289 289 1800 289 289 1800 164 76 1802 438 438 1803 289 289 1805 438 438 1806 628 628 1804 628 628 1804 438 438 1806 76 164 1807 28 28 1808 550 550 1809 630 630 1811 630 630 1811 550 550 1809 290 290 1810 125 125 1813 440 440 1814 550 550 1812 550 550 1812 440 440 1814 290 290 1815 440 440 1817 164 76 1818 290 290 1816 290 290 1816 164 76 1818 439 439 1819 630 630 1820 290 290 1821 77 165 1823 77 165 1823 290 290 1821 439 439 1822 26 26 1824 552 552 1825 555 555 1827 555 555 1827 552 552 1825 291 291 1826 552 552 1828 126 126 1829 291 291 1831 291 291 1831 126 126 1829 441 441 1830 291 291 1832 441 441 1833 443 443 1835 443 443 1835 441 441 1833 165 77 1834 555 555 1836 291 291 1837 40 128 1839 40 128 1839 291 291 1837 443 443 1838 631 631 1841 292 292 1842 28 28 1840 28 28 1840 292 292 1842 551 551 1843 78 166 1845 442 442 1846 631 631 1844 631 631 1844 442 442 1846 292 292 1847 442 442 1849 165 77 1850 292 292 1848 292 292 1848 165 77 1850 441 441 1851 292 292 1853 441 441 1854 551 551 1852 551 551 1852 441 441 1854 126 126 1855 23 23 1856 556 556 1857 632 632 1859 632 632 1859 556 556 1857 293 293 1858 40 128 1861 443 443 1862 556 556 1860 556 556 1860 443 443 1862 293 293 1863 443 443 1865 165 77 1866 293 293 1864 293 293 1864 165 77 1866 442 442 1867 632 632 1868 293 293 1869 78 166 1871 78 166 1871 293 293 1869 442 442 1870 23 23 1872 632 632 1873 561 561 1875 561 561 1875 632 632 1873 294 294 1874 78 166 1877 444 444 1878 632 632 1876 632 632 1876 444 444 1878 294 294 1879 444 444 1881 166 78 1882 294 294 1880 294 294 1880 166 78 1882 446 446 1883 294 294 1885 446 446 1886 561 561 1884 561 561 1884 446 446 1886 43 131 1887 566 566 1889 295 295 1890 28 28 1888 28 28 1888 295 295 1890 631 631 1891 45 133 1893 445 445 1894 566 566 1892 566 566 1892 445 445 1894 295 295 1895 445 445 1897 166 78 1898 295 295 1896 295 295 1896 166 78 1898 444 444 1899 295 295 1901 444 444 1902 631 631 1900 631 631 1900 444 444 1902 78 166 1903 27 27 1904 562 562 1905 565 565 1907 565 565 1907 562 562 1905 296 296 1906 562 562 1908 43 131 1909 296 296 1911 296 296 1911 43 131 1909 446 446 1910 296 296 1912 446 446 1913 445 445 1915 445 445 1915 446 446 1913 166 78 1914 565 565 1916 296 296 1917 45 133 1919 45 133 1919 296 296 1917 445 445 1918 28 28 1920 630 630 1921 567 567 1923 567 567 1923 630 630 1921 297 297 1922 77 165 1925 447 447 1926 630 630 1924 630 630 1924 447 447 1926 297 297 1927 447 447 1929 167 79 1930 297 297 1928 297 297 1928 167 79 1930 449 449 1931 297 297 1933 449 449 1934 567 567 1932 567 567 1932 449 449 1934 46 134 1935 578 578 1937 298 298 1938 29 29 1936 29 29 1936 298 298 1938 629 629 1939 51 139 1941 448 448 1942 578 578 1940 578 578 1940 448 448 1942 298 298 1943 448 448 1945 167 79 1946 298 298 1944 298 298 1944 167 79 1946 447 447 1947 298 298 1949 447 447 1950 629 629 1948 629 629 1948 447 447 1950 77 165 1951 25 25 1952 568 568 1953 577 577 1955 577 577 1955 568 568 1953 299 299 1954 568 568 1956 46 134 1957 299 299 1959 299 299 1959 46 134 1957 449 449 1958 299 299 1960 449 449 1961 448 448 1963 448 448 1963 449 449 1961 167 79 1962 577 577 1964 299 299 1965 51 139 1967 51 139 1967 299 299 1965 448 448 1966 633 633 1969 300 300 1970 24 24 1968 24 24 1968 300 300 1970 638 638 1971 633 633 1972 79 167 1973 300 300 1975 300 300 1975 79 167 1973 450 450 1974 450 450 1977 168 80 1978 300 300 1976 300 300 1976 168 80 1978 452 452 1979 300 300 1981 452 452 1982 638 638 1980 638 638 1980 452 452 1982 81 169 1983 635 635 1985 301 301 1986 2 2 1984 2 2 1984 301 301 1986 634 634 1987 80 168 1989 451 451 1990 635 635 1988 635 635 1988 451 451 1990 301 301 1991 451 451 1993 168 80 1994 301 301 1992 301 301 1992 168 80 1994 450 450 1995 301 301 1997 450 450 1998 634 634 1996 634 634 1996 450 450 1998 79 167 1999 37 37 2000 637 637 2001 636 636 2003 636 636 2003 637 637 2001 302 302 2002 637 637 2004 81 169 2005 302 302 2007 302 302 2007 81 169 2005 452 452 2006 302 302 2008 452 452 2009 451 451 2011 451 451 2011 452 452 2009 168 80 2010 636 636 2012 302 302 2013 80 168 2015 80 168 2015 302 302 2013 451 451 2014 37 37 2016 636 636 2017 642 642 2019 642 642 2019 636 636 2017 303 303 2018 80 168 2021 453 453 2022 636 636 2020 636 636 2020 453 453 2022 303 303 2023 303 303 2024 453 453 2025 455 455 2027 455 455 2027 453 453 2025 169 81 2026 642 642 2028 303 303 2029 83 171 2031 83 171 2031 303 303 2029 455 455 2030 2 2 2032 639 639 2033 635 635 2035 635 635 2035 639 639 2033 304 304 2034 639 639 2036 82 170 2037 304 304 2039 304 304 2039 82 170 2037 454 454 2038 304 304 2040 454 454 2041 453 453 2043 453 453 2043 454 454 2041 169 81 2042 635 635 2044 304 304 2045 80 168 2047 80 168 2047 304 304 2045 453 453 2046 641 641 2049 305 305 2050 30 30 2048 30 30 2048 305 305 2050 640 640 2051 83 171 2053 455 455 2054 641 641 2052 641 641 2052 455 455 2054 305 305 2055 455 455 2057 169 81 2058 305 305 2056 305 305 2056 169 81 2058 454 454 2059 305 305 2061 454 454 2062 640 640 2060 640 640 2060 454 454 2062 82 170 2063 37 37 2064 574 574 2065 637 637 2067 637 637 2067 574 574 2065 306 306 2066 49 137 2069 456 456 2070 574 574 2068 574 574 2068 456 456 2070 306 306 2071 456 456 2073 170 82 2074 306 306 2072 306 306 2072 170 82 2074 458 458 2075 306 306 2077 458 458 2078 637 637 2076 637 637 2076 458 458 2078 81 169 2079 29 29 2080 628 628 2081 573 573 2083 573 573 2083 628 628 2081 307 307 2082 628 628 2084 76 164 2085 307 307 2087 307 307 2087 76 164 2085 457 457 2086 307 307 2088 457 457 2089 456 456 2091 456 456 2091 457 457 2089 170 82 2090 573 573 2092 307 307 2093 49 137 2095 49 137 2095 307 307 2093 456 456 2094 24 24 2096 638 638 2097 627 627 2099 627 627 2099 638 638 2097 308 308 2098 638 638 2100 81 169 2101 308 308 2103 308 308 2103 81 169 2101 458 458 2102 308 308 2104 458 458 2105 457 457 2107 457 457 2107 458 458 2105 170 82 2106 308 308 2109 457 457 2110 627 627 2108 627 627 2108 457 457 2110 76 164 2111 29 29 2112 572 572 2113 579 579 2115 579 579 2115 572 572 2113 309 309 2114 572 572 2116 48 136 2117 309 309 2119 309 309 2119 48 136 2117 459 459 2118 309 309 2120 459 459 2121 461 461 2123 461 461 2123 459 459 2121 171 83 2122 579 579 2124 309 309 2125 52 140 2127 52 140 2127 309 309 2125 461 461 2126 32 32 2128 582 582 2129 571 571 2131 571 571 2131 582 582 2129 310 310 2130 582 582 2132 53 141 2133 310 310 2135 310 310 2135 53 141 2133 460 460 2134 460 460 2137 171 83 2138 310 310 2136 310 310 2136 171 83 2138 459 459 2139 571 571 2140 310 310 2141 48 136 2143 48 136 2143 310 310 2141 459 459 2142 31 31 2144 580 580 2145 581 581 2147 581 581 2147 580 580 2145 311 311 2146 52 140 2149 461 461 2150 580 580 2148 580 580 2148 461 461 2150 311 311 2151 461 461 2153 171 83 2154 311 311 2152 311 311 2152 171 83 2154 460 460 2155 311 311 2157 460 460 2158 581 581 2156 581 581 2156 460 460 2158 53 141 2159 594 594 2161 312 312 2162 35 35 2160 35 35 2160 312 312 2162 585 585 2163 59 147 2165 462 462 2166 594 594 2164 594 594 2164 462 462 2166 312 312 2167 462 462 2169 172 84 2170 312 312 2168 312 312 2168 172 84 2170 464 464 2171 312 312 2173 464 464 2174 585 585 2172 585 585 2172 464 464 2174 55 143 2175 33 33 2176 643 643 2177 593 593 2179 593 593 2179 643 643 2177 313 313 2178 84 172 2181 463 463 2182 643 643 2180 643 643 2180 463 463 2182 313 313 2183 463 463 2185 172 84 2186 313 313 2184 313 313 2184 172 84 2186 462 462 2187 593 593 2188 313 313 2189 59 147 2191 59 147 2191 313 313 2189 462 462 2190 31 31 2192 586 586 2193 644 644 2195 644 644 2195 586 586 2193 314 314 2194 586 586 2196 55 143 2197 314 314 2199 314 314 2199 55 143 2197 464 464 2198 314 314 2200 464 464 2201 463 463 2203 463 463 2203 464 464 2201 172 84 2202 644 644 2204 314 314 2205 84 172 2207 84 172 2207 314 314 2205 463 463 2206 37 37 2208 642 642 2209 589 589 2211 589 589 2211 642 642 2209 315 315 2210 83 171 2213 465 465 2214 642 642 2212 642 642 2212 465 465 2214 315 315 2215 315 315 2216 465 465 2217 467 467 2219 467 467 2219 465 465 2217 173 85 2218 589 589 2220 315 315 2221 57 145 2223 57 145 2223 315 315 2221 467 467 2222 30 30 2224 645 645 2225 641 641 2227 641 641 2227 645 645 2225 316 316 2226 645 645 2228 85 173 2229 316 316 2231 316 316 2231 85 173 2229 466 466 2230 466 466 2233 173 85 2234 316 316 2232 316 316 2232 173 85 2234 465 465 2235 641 641 2236 316 316 2237 83 171 2239 83 171 2239 316 316 2237 465 465 2238 34 34 2240 590 590 2241 646 646 2243 646 646 2243 590 590 2241 317 317 2242 57 145 2245 467 467 2246 590 590 2244 590 590 2244 467 467 2246 317 317 2247 467 467 2249 173 85 2250 317 317 2248 317 317 2248 173 85 2250 466 466 2251 317 317 2253 466 466 2254 646 646 2252 646 646 2252 466 466 2254 85 173 2255 36 36 2256 596 596 2257 591 591 2259 591 591 2259 596 596 2257 318 318 2258 596 596 2260 60 148 2261 318 318 2263 318 318 2263 60 148 2261 468 468 2262 318 318 2264 468 468 2265 470 470 2267 470 470 2267 468 468 2265 174 86 2266 591 591 2268 318 318 2269 58 146 2271 58 146 2271 318 318 2269 470 470 2270 584 584 2273 319 319 2274 35 35 2272 35 35 2272 319 319 2274 595 595 2275 54 142 2277 469 469 2278 584 584 2276 584 584 2276 469 469 2278 319 319 2279 469 469 2281 174 86 2282 319 319 2280 319 319 2280 174 86 2282 468 468 2283 319 319 2285 468 468 2286 595 595 2284 595 595 2284 468 468 2286 60 148 2287 32 32 2288 592 592 2289 583 583 2291 583 583 2291 592 592 2289 320 320 2290 58 146 2293 470 470 2294 592 592 2292 592 592 2292 470 470 2294 320 320 2295 470 470 2297 174 86 2298 320 320 2296 320 320 2296 174 86 2298 469 469 2299 583 583 2300 320 320 2301 54 142 2303 54 142 2303 320 320 2301 469 469 2302 36 36 2304 480 480 2305 650 650 2307 650 650 2307 480 480 2305 321 321 2306 480 480 2308 90 90 2309 321 321 2311 321 321 2311 90 90 2309 471 471 2310 321 321 2312 471 471 2313 473 473 2315 473 473 2315 471 471 2313 175 87 2314 321 321 2317 473 473 2318 650 650 2316 650 650 2316 473 473 2318 87 175 2319 647 647 2321 322 322 2322 38 38 2320 38 38 2320 322 322 2322 479 479 2323 86 174 2325 472 472 2326 647 647 2324 647 647 2324 472 472 2326 322 322 2327 472 472 2329 175 87 2330 322 322 2328 322 322 2328 175 87 2330 471 471 2331 322 322 2333 471 471 2334 479 479 2332 479 479 2332 471 471 2334 90 90 2335 3 3 2336 649 649 2337 648 648 2339 648 648 2339 649 649 2337 323 323 2338 649 649 2340 87 175 2341 323 323 2343 323 323 2343 87 175 2341 473 473 2342 323 323 2344 473 473 2345 472 472 2347 472 472 2347 473 473 2345 175 87 2346 648 648 2348 323 323 2349 86 174 2351 86 174 2351 323 323 2349 472 472 2350 651 651 2353 324 324 2354 3 3 2352 3 3 2352 324 324 2354 649 649 2355 88 176 2357 474 474 2358 651 651 2356 651 651 2356 474 474 2358 324 324 2359 474 474 2361 176 88 2362 324 324 2360 324 324 2360 176 88 2362 476 476 2363 324 324 2365 476 476 2366 649 649 2364 649 649 2364 476 476 2366 87 175 2367 33 33 2368 598 598 2369 652 652 2371 652 652 2371 598 598 2369 325 325 2370 598 598 2372 61 149 2373 325 325 2375 325 325 2375 61 149 2373 475 475 2374 325 325 2376 475 475 2377 474 474 2379 474 474 2379 475 475 2377 176 88 2378 652 652 2380 325 325 2381 88 176 2383 88 176 2383 325 325 2381 474 474 2382 36 36 2384 650 650 2385 597 597 2387 597 597 2387 650 650 2385 326 326 2386 650 650 2388 87 175 2389 326 326 2391 326 326 2391 87 175 2389 476 476 2390 326 326 2392 476 476 2393 475 475 2395 475 475 2395 476 476 2393 176 88 2394 326 326 2397 475 475 2398 597 597 2396 597 597 2396 475 475 2398 61 149 2399</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape7</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_7" name="qt_gauge_background_7" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape7">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_7</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_8.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_8.dae
new file mode 100644
index 0000000..b15fc20
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_background_8.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:34:03</created>
+ <modified>2018-03-08T09:34:03</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="default_darkgrey" name="default_darkgrey">
+ <instance_effect url="#default_darkgrey-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="default_darkgrey-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03755869 0.03755869 0.03755869 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">default_darkgrey</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_background_Shape8" name="qt_gauge_background_Shape8">
+ <mesh>
+ <source id="qt_gauge_background_Shape8-positions" name="qt_gauge_background_Shape8-positions">
+ <float_array id="qt_gauge_background_Shape8-positions-array" count="2871">-2.228701 0 -29.01 -0.1916633 0 29.02837 75.80821 0 8.957751 7.826579 0 29.02584 -7.083679 0 29.02576 -75.80821 0 8.957751 6.24036 0 -29.0063 4.203323 0 29.02863 -38.03648 0 28.67428 -38.03651 0 -27.1832 -55.56892 0 27.7183 -55.56845 0 -22.0043 -73.67002 0 -0.7506075 -57.05461 0 0.543303 -65.82095 0 26.09673 -67.40148 0 1.567151 -75.40038 0 14.89945 -65.94781 0 13.57179 -70.89333 0 23.9907 -71.42685 0 14.20255 -73.4035 0 20.98433 -70.65014 0 20.67179 -65.94781 0 21.65222 -57.05473 0 16.32993 -68.0598 0 -12.25018 -65.14398 0 -15.81427 -54.5041 0 -13.82227 -39.73672 0 -1.221139 -19.9528 0 28.97886 -19.01825 0 -28.74344 -19.06527 0 2.262363 4.425158 0 0.0038867 38.03651 0 -27.1832 38.03648 0 28.67428 19.76115 0 -28.74235 19.9528 0 28.97886 21.79042 0 0.06402016 39.73672 0 -1.22114 55.56845 0 -22.0043 55.56892 0 27.7183 56.5885 0 -0.01575565 73.67002 0 -0.7506075 65.82095 0 26.09673 66.7315 0 1.896123 57.67076 0 14.889 65.94302 0 13.56449 75.40038 0 14.89945 70.89333 0 23.9907 71.16742 0 14.63369 66.3308 0 21.32525 70.96318 0 21.11352 73.4035 0 20.98433 68.0598 0 -12.25018 65.14398 0 -15.81427 54.50411 0 -13.82227 7.240282 0 18.50058 28.62082 0 28.88588 19.95385 0 14.47656 28.77128 0 14.35003 55.53866 0 -7.231445 47.61085 0 1.699389 47.46287 0 -8.987488 55.74738 0 22.25092 47.39702 0 28.28526 50.10778 0 19.598 68.23136 0 13.51098 65.90973 0 9.254755 69.55663 0 8.705571 55.82849 0 9.133286 61.7866 0 0.1895571 61.84983 0 7.455582 63.06457 0 13.51931 65.87202 0 17.04092 61.82375 0 18.91763 72.03056 0 20.99547 70.92719 0 19.05535 72.64234 0 18.10181 68.89784 0 18.0902 68.82433 0 25.08025 65.8511 0 24.44652 68.88743 0 23.14101 72.29805 0 22.80466 70.89935 0 22.51439 61.51061 0 -18.6661 60.18817 0 -13.71238 55.45752 0 -19.04852 63.15481 0 -7.091969 2.302989 0 -29.02868 6.082801 0 -18.48379 -0.3660672 0 -18.4852 -9.731993 0 -28.93808 -47.64117 0 1.735003 -47.46287 0 -8.987488 -38.20192 0 -12.15956 -55.81754 0 11.21269 -75.83521 0 12.08349 -73.01847 0 10.77056 -69.63057 0 8.623028 -65.82498 0 24.46756 -68.82433 0 25.08025 -61.58641 0 26.98354 -61.62165 0 23.62412 -63.20841 0 -7.056356 -66.54195 0 -14.41481 -47.56887 0 12.48896 -28.62082 0 28.88588 2.30299 0 29.02846 -0.2016499 0 14.58402 -7.168177 0 14.72782 -3.120016 0 29.0282 28.60167 0 -28.29825 12.10927 0 -28.93482 12.18019 0 14.57446 12.77772 0 29.01604 38.2019 0 10.41499 47.39701 0 -25.02316 47.34401 0 -18.41302 47.53854 0 12.41781 75.8352 0 12.08349 73.79887 0 14.85989 73.00138 0 10.79921 75.27254 0 4.711881 71.77359 0 5.563124 61.58641 0 26.98354 61.64777 0 23.60308 74.50657 0 18.10146 69.52795 0 21.03081 61.64318 0 -9.298159 66.54195 0 -14.41481 70.67225 0 -7.265333 70.76734 0 -0.5342169 66.51701 0 -5.01954 -7.800074 0 0.1651096 -18.40265 0 -14.1539 -7.840633 0 -14.51744 -55.45752 0 -19.04852 -47.39701 0 -25.02316 -47.34401 0 -18.41302 -61.51061 0 -18.6661 -60.18816 0 -13.71238 -65.97173 0 7.30232 -63.15751 0 0.1718607 -61.75637 0 7.278565 -75.27254 0 4.711882 -70.81255 0 -0.5525751 -71.8188 0 5.544765 -70.91248 0 18.01371 -68.90045 0 13.47244 -68.83484 0 17.97145 -74.50658 0 18.10146 -73.81596 0 14.83124 -72.65942 0 18.05539 -72.29804 0 22.80466 -72.01041 0 20.95002 -70.86755 0 22.48671 -68.83484 0 21.00641 -68.84968 0 23.16206 -65.83943 0 18.05516 -61.73309 0 13.68174 -61.73309 0 19.05828 -70.67225 0 -7.265333 -66.58549 0 -5.0379 -55.56898 0 -7.195829 -61.6735 0 -9.262543 -47.39702 0 28.28526 -55.70611 0 22.35276 -50.06651 0 19.73537 -28.52738 0 -28.29836 -28.56529 0 -13.84605 -38.20189 0 10.41499 -31.21669 0 0.1375737 -28.59155 0 14.56086 -12.70343 0 29.01603 -19.88415 0 18.6064 -11.74903 0 18.64376 38.20191 0 -12.15956 31.39942 0 -0.002184868 28.77129 0 -13.98581 19.93647 0 -14.29361 14.00363 0 0.02244186 11.99158 0 -14.5165 5.497297 0 29.02843 4.201937 0 18.50313 69.29678 0 -4.517281 -11.22505 0 -9.554882 -50.38109 0 -21.17658 -59.60795 0 -17.1109 -63.52269 0 4.857503 -72.56969 0 3.238703 -69.6386 0 16.69455 -73.58178 0 16.98134 -71.85014 0 22.28289 -69.627 0 22.35504 -63.24554 0 16.91682 -69.31017 0 -4.522722 -59.64105 0 -9.889185 -50.93059 0 23.55227 -25.23441 0 -18.86146 -32.22976 0 8.886656 -14.71872 0 20.89684 32.28392 0 -8.961739 14.82577 0 -9.596552 5.434459 0 20.86681 25.5576 0 19.26377 50.44034 0 -4.830444 50.94282 0 23.52209 68.01112 0 10.13511 59.98261 0 5.251378 63.51227 0 16.68855 71.92428 0 19.37952 67.87925 0 16.52536 67.99411 0 24.13053 71.8561 0 22.29109 59.60795 0 -17.1109 63.63018 0 -4.376202 2.898868 0 -20.86342 -5.430859 0 -20.05806 -50.44931 0 -4.819892 -44.3583 0 -13.61145 -59.96391 0 10.26507 -74.28638 0 12.71461 -68.15524 0 9.744476 -71.41119 0 8.212695 -67.98626 0 19.17591 -71.92337 0 19.17331 -67.98637 0 24.13676 -63.20824 0 25.12058 -59.93089 0 21.54222 -63.90085 0 -4.371089 -63.63681 0 -10.02638 -44.41112 0 8.824871 -50.9636 0 14.45319 -32.22977 0 -8.920324 -25.53549 0 20.06327 2.558457 0 20.10911 -7.742061 0 20.1512 -4.921918 0 9.720526 25.55336 0 -18.90285 9.800906 0 -20.05596 14.86206 0 9.666676 10.34618 0 20.10235 32.28391 0 8.845245 50.38109 0 -21.17658 44.3583 0 -13.61145 44.40214 0 8.814319 50.96685 0 14.03342 74.28132 0 12.7231 72.5563 0 3.244142 71.39274 0 8.226624 63.51999 0 9.886021 63.21597 0 25.11435 59.95085 0 21.50581 73.57671 0 16.98983 69.77139 0 19.38841 69.76486 0 22.35701 59.63208 0 -9.89974 63.62783 0 -10.03693 68.47018 0 -7.448343 71.17114 0 -3.364161 68.2961 0 -2.316768 -5.577535 0 -6.016553 -14.07356 0 -5.588256 -14.06558 0 -16.78552 -52.24453 0 -18.24273 -52.42279 0 -22.02772 -45.96077 0 -23.02933 -61.9306 0 -16.13913 -58.36533 0 -19.24152 -57.81475 0 -15.98033 -64.2865 0 8.295665 -64.91866 0 3.300875 -61.38929 0 3.113112 -73.89497 0 5.70766 -73.15216 0 1.687807 -70.58392 0 2.305037 -70.09673 0 18.54138 -70.24069 0 15.68475 -68.43484 0 15.57206 -73.52315 0 18.58897 -74.33691 0 16.19887 -72.8633 0 16.0661 -71.55061 0 22.98096 -72.43549 0 21.88013 -71.43137 0 21.74531 -70.13631 0 23.0665 -70.09673 0 21.74532 -68.43485 0 22.10177 -64.2865 0 18.96217 -64.2865 0 15.57206 -61.01685 0 16.31604 -71.17114 0 -3.364162 -68.47018 0 -7.448341 -68.41666 0 -2.365726 -61.93073 0 -12.04878 -57.81475 0 -11.10504 -58.66269 0 -6.528296 -46.70563 0 24.98504 -52.42299 0 25.55316 -53.46503 0 20.31485 -30.11224 0 -22.18317 -22.79417 0 -22.58945 -22.80215 0 -11.44349 -34.07435 0 15.65047 -35.1362 0 4.675556 -27.69538 0 6.423707 -11.39953 0 24.11211 -16.72337 0 24.09166 -16.31018 0 14.73877 34.07437 0 -15.64576 35.13621 0 -5.482375 28.18267 0 -5.80531 16.38145 0 -16.78503 17.28679 0 -5.961653 11.2021 0 -6.016987 6.349796 0 24.11601 4.761687 0 24.11727 5.328231 0 14.36766 30.11222 0 22.82297 23.35351 0 22.90505 23.66186 0 12.05167 52.24452 0 -8.865837 52.63915 0 -2.471288 46.27772 0 -3.21996 53.5751 0 20.04329 52.42299 0 25.55317 46.70563 0 24.98504 69.31113 0 11.60609 67.05811 0 11.58322 67.58346 0 7.323874 58.77341 0 9.090254 58.58247 0 3.577399 62.6308 0 3.349831 61.49936 0 16.04448 64.64518 0 15.26678 64.35612 0 18.62177 72.52794 0 19.90405 71.48511 0 20.21454 71.70187 0 17.84185 67.32772 0 18.38468 67.05811 0 15.26678 69.12492 0 15.76115 69.25233 0 24.07265 67.21958 0 24.94206 67.32773 0 23.3132 72.43549 0 21.88013 71.55061 0 22.98096 71.48511 0 21.81912 58.36533 0 -19.24152 61.9306 0 -16.13913 57.81476 0 -15.98033 65.15828 0 -7.448486 64.55965 0 -2.129551 61.30832 0 -3.029815 0.790445 0 -24.11213 4.433627 0 -24.11072 3.337265 0 -14.35969 -2.174063 0 -13.20193 -10.28967 0 -22.87225 -4.162222 0 -24.07863 -46.27772 0 -3.21996 -52.72001 0 -2.376314 -52.24452 0 -8.865837 -41.99863 0 -17.84676 -42.31559 0 -9.06591 -48.65496 0 -13.89124 -58.66333 0 7.265072 -58.66335 0 12.67037 -62.49165 0 11.03566 -73.13728 0 13.17678 -74.90366 0 13.69089 -74.75414 0 11.18764 -67.70403 0 6.706354 -67.2581 0 11.03566 -69.54293 0 11.52969 -71.32367 0 10.43679 -72.98203 0 8.350586 -70.00526 0 5.897733 -67.2581 0 17.36848 -67.25809 0 20.04015 -69.21275 0 19.85646 -71.74744 0 17.48117 -71.43137 0 19.85645 -72.52794 0 19.90405 -67.2581 0 23.36931 -67.21958 0 24.94206 -69.25232 0 24.07265 -60.7197 0 25.85079 -64.24798 0 25.73921 -64.28651 0 23.73232 -62.49165 0 21.38679 -58.66335 0 19.69573 -58.36619 0 23.7419 -61.76163 0 -2.93484 -65.05265 0 -2.178509 -65.15829 0 -7.448486 -61.38866 0 -6.527698 -65.20988 0 -11.04121 -64.28414 0 -12.30933 -49.13044 0 6.087771 -42.31558 0 5.199367 -41.99861 0 15.08263 -53.46503 0 15.32299 -52.72013 0 9.680607 -46.70563 0 18.62827 -27.69538 0 -5.432617 -35.13621 0 -5.482376 -34.07437 0 -15.64576 -23.22262 0 13.56149 -23.40155 0 24.04218 -30.11221 0 22.82297 2.826648 0 13.23116 3.515603 0 24.11715 1.197853 0 22.97992 -11.41694 0 13.614 -4.549713 0 22.97994 -7.4374 0 24.11587 -3.057976 0 16.93141 -9.600809 0 6.435617 -2.174062 0 6.052067 23.66187 0 -11.81618 23.31519 0 -22.58924 30.11224 0 -22.18317 8.044281 0 -13.20075 8.395761 0 -24.07577 13.22362 0 -22.87031 11.25014 0 6.048312 17.28679 0 6.049865 16.46782 0 16.90671 8.486051 0 13.22742 13.56555 0 22.96383 9.321395 0 24.11215 28.18266 0 6.051014 35.1362 0 4.675556 34.07435 0 15.65047 45.96077 0 -23.02933 52.42279 0 -22.02771 52.24453 0 -18.24273 48.65496 0 -13.89124 42.3156 0 -9.06591 41.99863 0 -17.84676 41.99861 0 15.08263 42.31559 0 5.199367 49.04958 0 5.992796 46.70563 0 18.62827 52.63926 0 9.017069 53.5751 0 14.48287 74.75414 0 11.18764 74.90366 0 13.69089 73.0917 0 13.25318 70.46334 0 2.353993 73.15216 0 1.687807 73.89497 0 5.70766 69.8847 0 5.946689 72.98204 0 8.350586 71.27809 0 10.51319 64.42564 0 6.942528 64.64518 0 11.58322 61.49936 0 11.27098 64.35612 0 23.6762 64.24798 0 25.73921 60.7197 0 25.85079 58.36618 0 23.74189 58.77341 0 19.42417 62.56128 0 21.33068 72.81773 0 16.14249 74.33692 0 16.19887 73.52315 0 18.58897 70.19512 0 17.84185 70.33669 0 20.21454 68.69069 0 19.98404 68.6907 0 22.04566 70.33669 0 21.81912 70.1363 0 23.0665 58.58182 0 -6.623268 57.81475 0 -11.10504 61.93073 0 -12.04878 64.28414 0 -12.30933 65.20988 0 -11.04121 61.30779 0 -6.622671 69.89543 0 -5.728803 69.90413 0 -2.818869 68.10252 0 -4.898532 -9.65545 0 -5.302236 -14.37662 0 -11.571 -9.653454 0 -11.72283 -52.73678 0 -20.29352 -49.16113 0 -22.94538 -49.11656 0 -20.23334 -60.58176 0 -17.74007 -57.99199 0 -17.91689 -60.0718 0 -15.6828 -64.60456 0 5.921266 -63.25029 0 2.811203 -62.7198 0 5.874325 -73.7279 0 3.875159 -71.76376 0 1.620364 -72.19792 0 4.216684 -70.2408 0 17.32478 -69.33756 0 15.39089 -69.30157 0 17.29661 -73.96352 0 17.46521 -73.63807 0 16.02427 -73.13824 0 17.43201 -72.0795 0 22.56446 -71.97002 0 21.78012 -71.46765 0 22.44353 -70.21469 0 22.46492 -69.30157 0 21.83553 -69.31147 0 22.72679 -64.44652 0 17.40181 -62.6267 0 15.54871 -62.6267 0 17.82489 -69.89543 0 -5.728804 -68.13266 0 -4.91077 -69.93428 0 -2.831106 -60.07182 0 -11.57789 -58.06633 0 -8.644473 -60.65626 0 -9.448841 -49.34738 0 25.6387 -53.04207 0 23.00844 -50.35277 0 22.05872 -26.69786 0 -23.01939 -22.30684 0 -16.80999 -26.69986 0 -16.66293 -34.73602 0 9.950609 -31.50889 0 5.207753 -30.49854 0 11.52405 -13.8238 0 24.14203 -16.91535 0 19.29811 -13.48624 0 19.31338 34.73604 0 -10.57086 31.63071 0 -5.112812 30.62037 0 -11.21359 16.92376 0 -11.66423 14.21841 0 -5.396398 13.43341 0 -11.72254 5.410702 0 24.15326 4.863803 0 19.22416 6.062955 0 19.22314 26.83768 0 23.47361 23.03404 0 17.17277 26.91477 0 17.14203 52.79086 0 -5.860702 49.29445 0 -2.075401 49.19579 0 -6.571673 53.06958 0 22.94055 49.34738 0 25.6387 50.38029 0 21.99083 68.17854 0 11.55945 67.15231 0 9.527176 68.68231 0 9.345676 58.28632 0 6.748306 60.81174 0 2.939515 60.85948 0 6.132152 63.20943 0 15.4045 64.5536 0 16.9561 62.76472 0 17.6719 72.00655 0 20.11297 71.5189 0 19.17148 72.23287 0 18.80957 67.08837 0 16.89683 68.13199 0 15.33367 68.38561 0 17.30471 68.39043 0 24.52179 67.12874 0 24.20511 68.41747 0 23.64875 72.0795 0 22.56446 71.48109 0 22.46198 71.98345 0 21.79857 60.58176 0 -17.74008 60.07179 0 -15.6828 57.99199 0 -17.91689 64.86674 0 -4.851764 62.76786 0 -2.501261 63.28984 0 -5.645397 2.692765 0 -24.15349 4.29623 0 -19.21709 1.673793 0 -19.21776 -6.273753 0 -17.46027 -7.178893 0 -23.802 -2.923273 0 -18.90655 -49.31466 0 -2.051656 -52.81108 0 -5.836957 -49.19579 0 -6.571673 -41.68166 0 -13.22671 -45.72303 0 -11.61371 -45.64378 0 -15.98632 -58.27902 0 10.34352 -60.79718 0 11.68863 -60.79717 0 8.807022 -74.07494 0 13.67176 -74.97971 0 12.47991 -73.78848 0 11.97003 -67.23244 0 8.667342 -68.47271 0 11.40346 -68.7704 0 9.172197 -72.12962 0 9.366062 -71.53999 0 6.985299 -70.58333 0 8.29848 -67.12096 0 18.72526 -68.39016 0 20.05748 -68.39017 0 18.67934 -71.51686 0 18.70751 -71.99313 0 20.02345 -72.24426 0 18.71941 -67.11134 0 24.21914 -68.39043 0 24.52179 -68.40006 0 23.66278 -62.54277 0 25.96277 -64.43689 0 24.82804 -62.5524 0 24.56108 -60.79717 0 20.38526 -58.20473 0 21.81578 -60.72289 0 22.47504 -63.37688 0 -2.489756 -64.99001 0 -4.864003 -63.40317 0 -5.621654 -63.32257 0 -8.627769 -64.86238 0 -11.88761 -62.71854 0 -9.513533 -45.84189 0 5.778533 -41.68165 0 9.939602 -45.76264 0 10.73027 -53.11636 0 12.80048 -49.42167 0 13.72459 -50.35277 0 16.90256 -31.50889 0 -5.019638 -34.73604 0 -10.57086 -30.49855 0 -11.12041 -22.98428 0 18.97163 -26.8497 0 23.75789 -26.80496 0 17.51949 3.428453 0 18.93996 2.565111 0 23.8691 1.647991 0 17.5185 -7.755394 0 17.61422 -5.827716 0 23.8688 -9.687541 0 19.03463 -6.033779 0 11.88807 -6.101539 0 5.545703 -2.647211 0 11.79218 23.02446 0 -16.90311 26.82812 0 -23.01934 26.91479 0 -16.7561 8.048371 0 -18.90464 10.75373 0 -23.79935 10.66586 0 -17.45864 14.23042 0 5.446117 16.94535 0 11.7731 13.51505 0 11.78202 11.01204 0 17.51049 11.32617 0 23.86008 8.78395 0 18.93557 31.6307 0 5.114581 34.73602 0 9.950608 30.62036 0 11.43087 49.16113 0 -22.94538 52.73678 0 -20.29352 49.11656 0 -20.23334 45.72303 0 -11.61371 41.68166 0 -13.22671 45.64378 0 -15.98632 41.68164 0 9.939603 45.82167 0 5.754788 45.74242 0 10.70652 49.40145 0 13.55871 53.12366 0 11.856 50.38029 0 16.69253 74.97971 0 12.47991 74.06355 0 13.69086 73.77707 0 11.98913 71.73361 0 1.632604 73.7279 0 3.87516 72.16778 0 4.228924 71.50983 0 6.997538 72.11822 0 9.385161 70.54179 0 8.329819 64.57098 0 9.431839 63.20943 0 11.47567 62.7821 0 8.785217 64.45429 0 24.81401 62.54277 0 25.96277 62.56981 0 24.54705 58.23224 0 21.74789 60.84209 0 20.30334 60.74029 0 22.46102 73.62666 0 16.04337 73.96352 0 17.46521 73.12685 0 17.45111 70.28938 0 19.17148 69.61173 0 20.13297 69.39012 0 18.82957 69.61173 0 21.83995 70.27468 0 22.48337 69.37542 0 22.71276 58.0461 0 -8.668218 60.07183 0 -11.57789 60.63604 0 -9.472584 64.86238 0 -11.88761 63.30235 0 -8.651513 62.69832 0 -9.537277 69.33744 0 -10.13882 72.26763 0 -4.087695 72.26688 0 -0.7575741 69.075 0 0.1497884 66.4727 0 -2.029716 66.8922 0 -8.146873 -2.77276 0 0.01463366 -12.65032 0 0.6011438 -18.54982 0 -7.445157 -18.53784 0 -20.60696 -12.81255 0 -20.72241 -2.772761 0 -8.420145 -55.19411 0 -16.88317 -55.55458 0 -20.66391 -51.70567 0 -23.60361 -42.79107 0 -26.22801 -43.38538 0 -21.56724 -50.89945 0 -16.05031 -63.65836 0 -17.04046 -58.83672 0 -20.26018 -57.77516 0 -13.64025 -62.38816 0 -14.29119 -65.8718 0 10.10636 -66.40102 0 4.594976 -65.1082 0 0.5593357 -60.87616 0 0.1355495 -59.72913 0 4.499953 -63.67775 0 10.10636 -75.63353 0 6.988299 -74.64485 0 2.131309 -72.26688 0 -0.7575741 -69.25585 0 0.07635355 -69.90147 0 3.733575 -73.6481 0 7.195929 -70.81009 0 19.37259 -71.06906 0 16.39955 -70.03016 0 13.72012 -67.68942 0 13.45575 -67.68941 0 16.23051 -69.76767 0 19.37259 -73.96301 0 19.64145 -74.99781 0 16.48167 -74.64855 0 14.90306 -72.82182 0 14.60857 -72.17799 0 16.49488 -73.03741 0 19.44398 -71.6569 0 23.43799 -72.86438 0 22.01275 -72.59337 0 20.977 -71.42489 0 20.88379 -70.81009 0 21.74422 -70.88936 0 23.14364 -69.76767 0 20.8838 -67.68942 0 21.20253 -67.68941 0 22.59579 -69.82702 0 23.58932 -65.8718 0 19.70741 -65.8718 0 16.23051 -63.67775 0 13.45575 -59.63605 0 14.5573 -59.63605 0 17.74229 -63.67775 0 20.28115 -72.26763 0 -4.087695 -69.33744 0 -10.13882 -66.8922 0 -8.146873 -66.74667 0 -2.10315 -55.19411 0 -10.30833 -56.00044 0 -3.949877 -59.72854 0 -5.556154 -63.34899 0 -12.34888 -42.79104 0 28.50259 -51.70584 0 28.02345 -55.55505 0 24.87279 -56.18701 0 19.58374 -53.62748 0 17.68287 -45.49321 0 22.88423 -33.28195 0 -27.85381 -23.77282 0 -28.57539 -24.51877 0 -7.360754 -32.68763 0 -19.81416 -38.03648 0 17.32824 -38.69816 0 4.71135 -35.27092 0 -0.3952513 -26.48696 0 0.665977 -24.62389 0 8.987067 -32.6876 0 20.39972 -9.681454 0 29.02291 -16.13281 0 29.00229 -19.96152 0 24.03403 -19.63457 0 12.21317 -14.585 0 12.23645 -9.315697 0 24.07802 38.0365 0 -18.16806 38.69817 0 -6.828558 35.27092 0 -0.3952513 27.21788 0 0.1069388 25.34281 0 -7.919792 32.68763 0 -19.81416 19.76808 0 -20.60656 20.42778 0 -8.004373 17.42349 0 0.03795719 10.27764 0 0.01288033 8.917514 0 -8.419685 15.27601 0 -20.72131 6.412694 0 29.02757 4.840727 0 29.02868 4.198179 0 24.08092 4.223503 0 11.66514 6.440478 0 11.6635 7.634762 0 24.0781 33.28192 0 28.79919 24.14663 0 28.94291 19.83759 0 20.81638 20.42777 0 8.153676 25.3428 0 8.143747 32.6876 0 20.39972 55.19411 0 -10.30833 55.87915 0 -4.09234 51.49137 0 1.435507 43.86082 0 0.8251162 43.86082 0 -5.638838 50.89944 0 -11.52869 56.3521 0 19.17641 55.55505 0 24.87279 51.70584 0 28.02345 42.79104 0 28.50259 45.49321 0 22.88423 53.79256 0 17.13338 69.46148 0 13.83471 67.09526 0 13.49531 65.89771 0 11.6127 66.12706 0 6.277288 68.45858 0 5.841111 70.37221 0 11.37379 56.3521 0 11.9614 55.87947 0 5.518311 59.60783 0 0.1329026 63.91998 0 0.6327691 63.88648 0 4.715214 59.89425 0 10.59917 60.94818 0 13.86801 64.66449 0 13.49531 65.89771 0 15.32349 65.97623 0 18.86805 63.78219 0 20.12591 59.89425 0 17.33496 72.59337 0 20.97699 71.5055 0 21.06557 70.93726 0 20.23848 71.00071 0 17.38967 72.10962 0 16.68055 73.03741 0 19.44398 69.8687 0 16.58522 67.84042 0 19.4929 69.95974 0 24.54071 67.45533 0 25.60152 65.81401 0 25.34426 65.97623 0 23.25826 67.84042 0 22.51162 69.82702 0 23.58932 72.86438 0 22.01275 71.6569 0 23.43799 70.88936 0 23.14364 70.93726 0 21.85492 58.83672 0 -20.26018 63.65836 0 -17.04046 62.38816 0 -14.29119 57.77516 0 -13.64025 55.19411 0 -16.88317 55.55458 0 -20.66391 60.66148 0 -4.231519 65.31306 0 -9.613659 0.2971593 0 -29.02464 4.16024 0 -29.02246 6.254228 0 -24.05956 5.540787 0 -11.64999 1.274558 0 -11.65061 -1.439246 0 -24.06203 -14.26369 0 -28.86105 -5.646042 0 -28.98444 -43.86082 0 0.8251162 -51.61267 0 1.577969 -50.89944 0 -11.52869 -43.86082 0 -5.638838 -38.0365 0 -18.16806 -38.69817 0 -6.828558 -56.00076 0 7.269651 -56.18702 0 13.90658 -75.67791 0 13.47211 -75.87704 0 10.61742 -74.12292 0 9.811924 -72.18781 0 12.12533 -70.48713 0 11.25919 -68.63943 0 5.625536 -65.87179 0 23.34243 -65.81401 0 25.34426 -67.45533 0 25.60152 -69.95974 0 24.54071 -58.83768 0 27.37097 -63.88941 0 26.5581 -63.67775 0 22.55194 -59.19031 0 25.18369 -65.31306 0 -9.613659 -60.87588 0 -4.089055 -67.19904 0 -13.58006 -65.96761 0 -15.01012 -43.57158 0 18.64125 -51.6127 0 7.073117 -24.14663 0 28.94291 -33.28192 0 28.79919 3.345426 0 29.02855 1.111975 0 29.02839 -0.6539245 0 20.86293 1.146904 0 8.449093 -11.69743 0 9.02424 -3.620697 0 20.86293 -1.571967 0 29.02841 -4.926893 0 29.02742 24.06998 0 -28.57495 33.28195 0 -27.85381 8.914802 0 -28.98053 15.74949 0 -28.85887 15.46946 0 20.84038 9.088011 0 8.445672 16.13281 0 29.00229 9.978614 0 29.02294 38.69816 0 4.71135 38.03648 0 17.32824 42.79107 0 -26.22801 51.70567 0 -23.60361 50.89945 0 -16.05031 43.38538 0 -21.56724 51.49141 0 6.788514 43.57158 0 18.64125 75.87704 0 10.61742 75.67791 0 13.47211 74.64855 0 14.90306 72.75346 0 14.72317 72.11945 0 12.23993 74.12292 0 9.811924 74.64485 0 2.131309 75.63353 0 6.988299 73.6481 0 7.195929 69.72062 0 3.80701 63.88941 0 26.5581 58.83768 0 27.37097 59.19031 0 25.18369 63.7822 0 22.46777 74.99781 0 16.48167 73.96301 0 19.64145 70.3486 0 21.06557 68.36738 0 21.11836 63.34899 0 -12.34888 59.60725 0 -5.698616 65.96761 0 -15.01012 67.19904 0 -13.58006</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape8-positions-array" count="957" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape8-normals" name="qt_gauge_background_Shape8-normals">
+ <float_array id="qt_gauge_background_Shape8-normals-array" count="2871">0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape8-normals-array" count="957" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape8-tangents" name="qt_gauge_background_Shape8-tangents">
+ <float_array id="qt_gauge_background_Shape8-tangents-array" count="2871">0.005794757 0 0.9999832 0 0 -1 -0.9991413 0 0.04143324 -0.001224902 0 -0.9999992 0.001098399 0 -0.9999994 0.9960896 0 0.08834922 -0.009637419 0 0.9999536 1.00048e-4 0 -1 0.03608826 0 -0.9993486 0.1396621 0 0.9901992 0.1056619 0 -0.9944021 0.3825395 0 0.9239391 0.9219019 0 0.3874233 -0.987948 0 0.1547864 0.2899787 0 -0.9570331 -0.654891 0 -0.7557234 0.9816169 0 -0.1908621 -0.9995916 0 0.02857782 0.5863549 0 -0.8100543 0.3264865 0 0.9452019 0.9230806 0 -0.3846066 -0.9890596 0 -0.1475163 -0.9989901 0 0.04493091 -0.367183 0 0.9301487 0.8394971 0 0.5433642 0.6365542 0 0.771232 -0.981261 0 -0.1926831 -0.1818524 0 0.9833258 0.00857175 0 -0.9999633 0.02472807 0 0.9996942 -0.9121972 0 0.4097514 -0.9853887 0 0.1703207 -0.1969654 0 0.9804104 -0.02626224 0 -0.9996551 -0.03882127 0 0.9992462 -0.006132863 0 -0.9999812 -0.9861084 0 -0.1661029 -0.1818526 0 -0.9833258 -0.4708095 0 0.8822349 -0.07874538 0 -0.9968948 0.7191812 0 0.6948225 -0.9472746 0 0.320423 -0.2323269 0 -0.9726378 -0.9160593 0 0.4010428 -0.955813 0 -0.2939753 0.05403019 0 -0.9985393 -0.969123 0 -0.2465778 -0.5075971 0 -0.8615946 -0.05632564 0 0.9984125 -0.6178959 0 0.7862599 0.9995614 0 -0.02961386 -0.8856832 0 -0.4642901 -0.8555514 0 0.5177179 -0.6985977 0 0.7155147 0.9755209 0 0.2199067 -0.9975082 0 0.07055049 -0.0127462 0 -0.9999188 0.9972027 0 0.07474448 -0.8394554 0 0.5434285 -0.9941688 0 0.1078354 0.2270484 0 -0.9738835 0.5945613 0 0.8040503 -0.9973204 0 -0.07315801 -0.0471317 0 -0.9988887 0.5559643 0 0.8312062 0.01379216 0 -0.9999049 0.9973467 0 0.07279823 -0.9563229 0 0.2923125 0.9999006 0 0.01410094 -0.2034078 0 0.9790941 -0.8491096 0 -0.5282167 0.01499501 0 0.9998876 -0.9983775 0 0.05694235 0.6341956 0 -0.7731726 -0.1323316 0 -0.9912055 0.9990272 0 0.04409803 -0.959306 0 0.2823686 -0.7985197 0 -0.6019686 -0.3558455 0 -0.9345448 0.9945012 0 0.1047255 -0.4306263 0 0.9025303 -0.7027569 0 -0.71143 0.9983524 0 0.05738036 -0.6035168 0 0.7973503 -0.02987966 0 -0.9995535 0.9982 0 0.0599726 0.7597327 0 0.6502356 -0.003349972 0 0.9999944 -0.9968694 0 -0.07906546 0.9819833 0 -0.1889679 0.01134547 0 0.9999356 0.0395094 0 -0.9992192 -0.6808756 0 0.7323991 -0.9956953 0 -0.09268696 -0.9907252 0 -0.1358811 0.9995932 0 -0.02852194 -0.8525112 0 0.5227089 0.9494435 0 0.3139379 -0.9999217 0 0.01251316 0.4291968 0 -0.903211 0.1816594 0 -0.9833615 -0.5399136 0 0.8417204 -0.7861798 0 0.6179978 0.7196664 0 0.69432 0.8012802 0 -0.5982892 0.01859517 0 -0.9998271 0 0 -1 0.9766822 0 0.2146901 -0.8656971 0 0.5005682 4.29631e-4 0 -0.9999999 -0.09453546 0 0.9955215 -0.02085874 0 0.9997824 0.8928025 0 -0.4504483 -0.00246603 0 -0.999997 -0.9997139 0 -0.02392066 -0.3129179 0 0.9497802 0.6231662 0 -0.7820894 -0.8432569 0 -0.5375108 -0.9936461 0 -0.1125495 0.1296829 0 -0.9915555 0.6607498 0 0.7506062 -0.9876591 0 0.1566188 0.6500281 0 -0.7599101 -0.1395688 0 -0.9902124 0.4696052 0 0.8828765 -0.942985 0 -0.3328353 -0.07522277 0 -0.9971668 -0.8704179 0 -0.4923136 -0.7857667 0 0.618523 -0.8936876 0 0.4486898 -0.3747275 0 -0.927135 0.9928802 0 0.1191173 -0.08953827 0 -0.9959834 0.9997806 0 -0.02094473 -0.76904 0 0.6392007 0.9982 0 -0.05997252 0.2530703 0 0.9674479 -0.5534695 0 -0.8328694 0.5120703 0 0.8589436 0.2544378 0 -0.9670891 0.9876607 0 -0.1566087 0.01591448 0 0.9998734 -0.8271327 0 -0.5620066 0.9716695 0 0.236344 -0.3745981 0 0.9271873 -0.6700386 0 -0.7423262 0.9953282 0 -0.09654972 0.01378608 0 0.999905 -0.8323963 0 -0.5541808 0.9569603 0 -0.2902189 0.2185685 0 0.9758216 -0.9648915 0 -0.2626489 0.8133994 0 -0.5817057 0.1123949 0 0.9936636 -0.9994496 0 -0.03317376 -0.1687666 0 0.985656 -0.4005659 0 -0.9162679 0.9998427 0 -0.01773433 -0.3852894 0 0.9227958 -0.5323329 0 -0.8465351 0.9069258 0 0.4212904 -0.9984954 0 -0.0548355 -0.9912811 0 -0.1317639 0.8788481 0 -0.4771017 0.06065053 0 -0.9981591 0.9852518 0 -0.1711105 -0.5671056 0 0.8236451 0.05816846 0 0.9983068 0.8228 0 -0.5683311 0.9962361 0 -0.086681 -0.1110288 0 0.9938172 -0.818649 0 -0.5742942 0.004006125 0 -0.999992 0.9992389 0 0.03900827 -0.9126795 0 0.4086761 -0.9956952 0 0.09268767 -0.02608769 0 -0.9996597 0.8300224 0 0.55773 -0.9969627 0 0.07788101 0.002566165 0 -0.9999967 0.8838157 0 0.4678352 -3.89273e-4 0 -0.9999999 0.999995 0 0.003153755 0.3041159 0 -0.952635 0.8096402 0 0.5869265 -0.5979037 0 0.8015679 -0.9510889 0 -0.3089173 -0.7848302 0 0.6197109 -0.9347392 0 0.3553346 -0.8725888 0 0.4884555 -0.7127325 0 0.701436 -0.3872269 0 0.9219845 -0.7624032 0 0.6471023 -0.826354 0 0.563151 -0.9381833 0 -0.346139 -0.3979256 0 -0.9174177 0.9326376 0 0.3608145 -0.8320921 0 -0.5546376 -0.8359841 0 0.5487536 0.7891351 0 0.6142196 0.8043238 0 -0.5941913 0.8365556 0 -0.5478821 0.9340456 0 0.3571538 0.8424042 0 0.5388462 0.8135544 0 -0.5814887 0.938665 0 -0.3448305 0.7618559 0 0.6477465 -0.7086775 0 0.7055326 -0.7960817 0 -0.6051892 0.8793741 0 0.4761315 -0.8385492 0 0.5448259 0.7511828 0 0.6600942 0.9681592 0 0.2503352 0.4463337 0 -0.8948666 0.9658771 0 -0.2590008 -0.8021397 0 -0.5971364 -0.4173118 0 0.9087634 0.8132395 0 0.5819292 0.8794318 0 -0.4760249 0.8682188 0 -0.4961815 0.8312675 0 0.5558726 0.6811288 0 -0.7321636 -0.1030699 0 0.9946741 0.7757778 0 -0.6310061 0.8165523 0 -0.5772715 0.7533957 0 -0.6575674 0.6490211 0 0.7607704 -0.7623049 0 -0.647218 0.9291273 0 0.36976 -0.4876004 0 0.8730669 -0.8156468 0 -0.5785502 -0.9702828 0 0.2419736 0.7858705 0 0.6183911 0.8947664 0 -0.4465345 0.9434314 0 -0.3315678 0.4977735 0 -0.867307 -0.673338 0 0.7393348 -0.8444946 0 0.535564 -0.9487735 0 0.3159572 -0.8435028 0 -0.5371248 0.598394 0 -0.801202 -0.8409771 0 -0.5410708 -0.5979037 0 -0.8015679 0.8794317 0 0.4760252 -0.8160295 0 0.5780103 -0.9765248 0 -0.2154051 0.8242267 0 -0.5662599 -0.9302206 0 -0.3670009 -0.1203893 0 -0.9927268 0.8306478 0 -0.5567982 0.6597566 0 -0.7514794 -0.7708224 0 0.6370501 -0.715914 0 -0.6981885 0.8260575 0 -0.5635859 -0.6744523 0 -0.7383184 -0.391507 0 0.9201751 -0.473477 0 -0.8808062 0.4047859 0 -0.9144115 0.5507632 0 0.8346616 -0.9535832 0 0.3011297 0.6507133 0 0.7593235 -0.9745662 0 0.2240996 0.6496212 0 -0.760258 -0.8523687 0 0.5229412 -0.3992577 0 -0.9168387 0.7103168 0 0.7038821 -0.9706872 0 -0.2403464 0.9075389 0 -0.4199681 0.3257208 0 0.945466 -0.9478668 0 0.3186668 -0.657649 0 -0.7533245 0.9854734 0 0.1698301 -0.9865205 0 0.1636376 -0.28481 0 -0.958584 0.8590443 0 0.5119013 -0.9297904 0 0.3680894 -0.6532991 0 -0.7570999 0.9432018 0 0.3322203 -0.8694827 0 0.4939633 -0.3934082 0 -0.9193639 0.9995951 0 0.02845357 -0.2388907 0 0.9710465 -0.2954142 0 -0.9553693 0.9999717 0 0.007518318 -0.8606763 0 0.5091526 0.001540089 0 -0.9999988 0.7698758 0 0.6381938 -0.9079642 0 0.4190477 -0.3835781 0 -0.9235084 0.7865488 0 0.6175282 -0.92186 0 -0.387523 0.951774 0 -0.3068001 -0.1553239 0 0.9878636 0.2070141 0 -0.978338 0.9998781 0 0.01561528 -0.6957076 0 0.718325 0.8661135 0 0.4998475 -0.9603499 0 0.2787976 0.2593981 0 -0.9657705 -0.6770024 0 -0.7359808 0.9868973 0 -0.1613494 -0.6850133 0 0.7285306 -0.9599158 0 0.2802886 -0.01004854 0 -0.9999495 0.9786776 0 0.2054024 0.01635707 0 0.9998662 -0.9928461 0 0.1194012 0.60494 0 -0.796271 0.9488693 0 -0.3156693 0.3535282 0 0.9354239 -0.9869456 0 -0.1610538 0.9627555 0 -0.2703735 0.5451908 0 0.838312 -0.9884507 0 -0.1515426 0.02949025 0 0.9995651 -0.9998705 0 0.01609094 0.9256485 0 -0.3783846 0.6852683 0 0.7282907 -0.9914827 0 0.1302384 0.7696016 0 -0.6385244 0.8925893 0 -0.4508707 0.4474454 0 0.8943112 -0.858441 0 -0.5129124 0.9972192 0 0.07452473 0.2122793 0 0.977209 -0.6683788 0 -0.743821 0.2138663 0 0.9768629 -0.9998113 0 0.01942399 0.5835622 0 -0.8120685 -0.8027622 0 0.5962992 -0.5832661 0 -0.8122811 0.9034609 0 0.4286706 -0.6265844 0 -0.7793536 0.9999406 0 0.01089991 -0.1502878 0 0.9886423 0.6702069 0 0.7421743 -0.999713 0 0.02395628 0.5419686 0 -0.8403987 -0.9075813 0 0.4198764 -0.0488086 0 -0.9988082 0.9850793 0 0.1721008 0.6436516 0 0.7653186 -0.9416396 0 0.3366228 0.04062004 0 -0.9991747 0.9850627 0 0.1721959 -0.9740054 0 0.2265246 -0.06521225 0 -0.9978714 0.45153 0 -0.8922559 0.4625204 0 0.8866086 -0.9998568 0 -0.01692019 0.9974547 0 0.07130312 -0.05211494 0 0.9986411 -0.8807626 0 -0.4735581 -0.02246054 0 -0.9997477 0.9984546 0 -0.0555739 -0.7758488 0 0.6309189 -0.4102423 0 0.9119766 -0.6485913 0 -0.7611368 0.9571754 0 -0.2895088 0.7073958 0 0.7068176 -0.962955 0 0.2696621 0.4393262 0 -0.8983276 0.9370255 0 -0.3492609 -0.5260133 0 0.8504763 -0.7249898 0 -0.6887596 0.9330866 0 -0.3596517 -0.4466506 0 0.8947085 -0.8979522 0 -0.440093 0.742179 0 0.6702017 -0.978563 0 0.2059476 0.4527723 0 -0.8916262 0.7561389 0 -0.6544112 0.5568087 0 0.8306408 -0.976143 0 -0.2171288 -0.7010551 0 0.7131072 -0.788228 0 -0.6153833 0.9988518 0 0.0479072 0.9350874 0 -0.3544173 0.2333947 0 0.9723821 -0.8798507 0 -0.4752502 0.916484 0 -0.4000714 0.6144504 0 0.7889554 -0.9981458 0 -0.06086835 0.8734001 0 -0.4870033 -0.2751062 0 0.9614138 -0.5517993 0 -0.8339769 0.3998092 0 0.9165984 -0.9160323 0 0.4011045 0.2388281 0 -0.9710619 -0.7007773 0 -0.7133801 0.8951612 0 -0.4457425 -0.3732211 0 0.9277424 0.7933249 0 0.6087985 -0.9997942 0 -0.02028537 0.3736126 0 -0.9275848 -0.5050889 0 0.8630673 -0.9973986 0 -0.07208411 0.8486367 0 -0.5289761 -0.3689496 0 -0.9294494 0.9428968 0 -0.3330849 -0.4930791 0 0.8699845 -0.9976391 0 -0.06867535 0.5921878 0 -0.8057999 -0.004142024 0 0.9999914 0.5188759 0 0.8548496 -0.9996496 0 -0.02647098 0.5370185 0 -0.8435705 0.9561455 0 -0.292892 0.002368635 0 0.9999972 -0.8834316 0 -0.4685601 0.9434875 0 -0.3314082 0.05300109 0 0.9985945 -0.9998992 0 -0.0141969 0.3987577 0 -0.9170563 0.9157081 0 0.4018441 -0.890423 0 0.4551339 -0.8531411 0 0.5216802 -0.7770881 0 -0.6293918 0.9951192 0 -0.0986803 -0.9181991 0 0.3961192 -0.4879088 0 -0.8728946 0.8728892 0 0.4879185 -0.9837266 0 0.1796716 -0.007570274 0 -0.9999713 0.9213951 0 0.3886273 -0.7425993 0 -0.669736 0.9997416 0 0.02273164 -0.7574711 0 0.6528686 0.607365 0 -0.7944229 0.7445478 0 0.6675691 -0.9911631 0 0.1326488 -0.5932363 0 -0.8050284 0.9996473 0 0.02655686 -0.3899329 0 0.9208433 -0.4937045 0 -0.8696297 0.9101933 0 -0.4141838 -0.4186059 0 0.908168 0.6932601 0 0.7206874 -0.9116186 0 0.4110372 0.08082895 0 -0.996728 -0.914634 0 0.4042828 0.1336958 0 -0.9910224 0.8814482 0 0.4722807 -0.9617367 0 -0.2739753 0.8890047 0 -0.457898 0.6722222 0 0.7403494 0.9088962 0 -0.4170225 0.2719322 0 0.9623164 -0.9745344 0 -0.224238 -0.8904177 0 -0.4551444 0.9402797 0 -0.3404029 -0.5930768 0 0.8051459 0.07382965 0 -0.9972709 0.8662139 0 0.4996734 -0.8989633 0 0.438024 0.9719289 0 -0.2352747 -0.02353524 0 0.999723 -0.9782117 0 -0.2076101 0.9033017 0 -0.4290059 0.2445425 0 0.9696386 -0.628362 0 -0.7779211 -0.8681805 0 0.4962485 0.1017951 0 -0.9948054 0.7023829 0 0.7117993 -0.6050105 0 -0.7962175 0.9722788 0 0.2338244 -0.9226617 0 0.3856103 0.9678789 0 -0.251417 -0.03983902 0 0.9992061 -0.9616988 0 -0.2741085 -0.4805779 0 -0.876952 0.9998751 0 0.01580258 -0.1019033 0 0.9947943 -0.6696684 0 0.7426602 -0.2908692 0 -0.9567628 0.9798214 0 0.199875 0.04225556 0 -0.9991068 0.7871698 0 0.6167363 -0.9653574 0 -0.2609313 -0.8965205 0 -0.4430023 0.9416053 0 -0.3367187 0.07610017 0 -0.9971002 0.9381402 0 -0.3462557 -0.5388851 0 0.8423793 0.8389478 0 0.5442119 0.3510094 0 0.9363719 -0.8231906 0 -0.5677651 -0.7164464 0 0.6976422 -0.5426806 0 0.8399392 -0.4463329 0 -0.894867 -0.9982608 0 -0.05895251 0.7011155 0 0.7130477 -0.9912553 0 -0.1319579 -0.824585 0 0.5657381 0.4815959 0 0.8763934 -0.8951409 0 -0.4457834 -0.9615874 0 0.274499 0.7230042 0 0.6908436 -0.9743602 0 -0.2249939 -0.8224562 0 0.5688284 0.7850874 0 0.619385 -0.9982749 0 0.05871328 -0.7930532 0 0.6091524 0.7753188 0 0.6315701 -0.9727309 0 0.2319368 -0.07176702 0 0.9974214 0.1837785 0 0.9829677 -0.8474625 0 -0.5308553 -0.6858983 0 0.7276975 0.3744481 0 0.9272479 -0.9111244 0 -0.4121315 -0.8097977 0 0.5867092 -0.8996678 0 0.4365751 -0.3129929 0 -0.9497555 -0.9330837 0 -0.3596594 -0.9689704 0 0.2471768 0.6201076 0 -0.7845167 -0.1801451 0 -0.98364 0.7966184 0 -0.6044825 -0.2494145 0 0.9683968 0.9924947 0 0.122288 -0.9432784 0 0.3320029 0.5738698 0 -0.8189466 -0.8337526 0 -0.5521382 0.3907651 0 0.9204904 -0.9813378 0 -0.192292 -0.8468716 0 0.5317975 0.9640158 0 -0.2658451 -0.588454 0 0.8085307 0.3596618 0 0.9330827 -0.5486376 0 -0.8360603 0.9859028 0 0.1673192 0.8319212 0 -0.5548938 -0.7019431 0 -0.7122331 0.9897057 0 0.1431174 0.8886491 0 -0.4585879 0.9999739 0 0.007228567 -0.944622 0 0.3281604 0.5230721 0 0.8522884 0.9567478 0 -0.2909185 -0.6380274 0 0.7700137 0.8327143 0 0.5537029 -0.4014415 0 -0.9158847 0.9233196 0 0.3840323 0.8125642 0 -0.5828718 -0.2637556 0 -0.9645895 0.7985522 0 0.6019255 0.9935775 0 -0.1131536 0.9931621 0 -0.1167437 -0.5777723 0 0.816198 0.5907253 0 0.8068728 0.6616703 0 0.7497949 -0.941294 0 -0.3375879 -0.8006452 0 0.5991388 -0.9732975 0 0.2295473 0.2488502 0 -0.968542 -0.7979462 0 -0.6027287 0.993767 0 -0.1114767 -0.4565857 0 0.8896794 0.8655803 0 0.5007701 0.4251384 0 0.9051283 -0.9782413 0 -0.2074702 -0.8376356 0 0.5462295 0.7025492 0 -0.7116352 0.08586564 0 0.9963067 0.733882 0 0.679277 0.7743308 0 -0.6327811 0.41467 0 0.9099719 0.9982838 0 0.05856136 -0.5426817 0 -0.8399384 0.9510904 0 -0.3089127 0.4077026 0 -0.9131148 -0.358953 0 -0.9333556 0.9085193 0 0.4178429 0.9956712 0 -0.09294518 -0.9980436 0 0.06252147 0.7624011 0 -0.6471048 -0.337992 0 -0.941149 0.951183 0 0.3086275 -0.9061035 0 0.423056 -0.1625799 0 0.9866954 0.9252901 0 -0.3792601 -0.3955217 0 0.9184566 0.8125642 0 0.5828718 0.1422788 0 -0.9898266 0.8257195 0 0.564081 0.8189869 0 -0.5738121 0.04651513 0 -0.9989176 0.8630231 0 0.5051645 0.8470234 0 -0.5315556 0.9764599 0 -0.2156989 -0.3206383 0 0.9472017 0.841525 0 0.5402182 -0.7594141 0 -0.6506076 0.9821782 0 0.1879518 0.5381231 0 -0.8428663 0.8488019 0 0.528711 -0.9945398 0 0.1043579 -0.3224457 0 0.946588 -0.4619155 0 -0.886924 0.9091233 0 0.4165272 0.8467902 0 -0.531927 -0.7534311 0 -0.6575269 0.9966499 0 0.08178594 0.8479118 0 -0.5301373 0.09372819 0 -0.9955978 0.6898555 0 0.7239471 0.7440623 0 -0.6681103 0.784618 0 -0.6199795 -0.231625 0 0.9728051 0.7094541 0 0.7047517 -0.8004762 0 0.5993645 0.15653 0 -0.9876732 -0.7876744 0 -0.6160917 0.9633356 0 -0.2682993 -0.4123081 0 0.9110445 0.9909112 0 0.1345178 0.9756771 0 -0.2192125 -0.8351957 0 0.5499529 -0.2335316 0 0.9723492 -0.905139 0 0.4251158 0.3780894 0 -0.9257691 -0.6976167 0 -0.7164711 -0.608955 0 0.7932048 -0.4272249 0 -0.9041454 -0.994933 0 0.1005404 0.9833482 0 -0.1817312 -0.5500075 0 0.8351597 0.8156563 0 0.5785368 -0.3933901 0 -0.9193716 0.9421692 0 0.3351377 0.8560325 0 -0.516922 -0.8022564 0 -0.5969796 0.9999984 0 -0.001769625 0.8459716 0 -0.5332279 -0.9999862 0 0.005255516 0.8890508 0 -0.4578086 0.1862846 0 -0.9824958 0.8897676 0 0.4564138 -0.9623227 0 0.2719099 -0.7522163 0 0.6589163 0.6202641 0 0.7843931 -0.9552458 0 -0.2958131 -0.8307126 0 0.5567015 0.5490651 0 0.8357796 -0.9690997 0 -0.2466693 -0.9117169 0 0.410819 -0.9889858 0 0.1480101 0.7110003 0 -0.7031917 -0.9022162 0 -0.431284 -0.9685486 0 -0.2488246 0.9676357 0 -0.2523514 0.2712249 0 -0.962516 -0.9850154 0 0.1724664 0.4109551 0 -0.9116556 -0.8447831 0 -0.5351088 -0.8231915 0 0.5677639 0.3510101 0 -0.9363717 -0.716446 0 -0.6976425 0.8257195 0 -0.564081 0.1422795 0 0.9898265 0.8189872 0 0.5738118 0.382225 0 0.9240693 -0.907118 0 -0.4208763 -0.6898035 0 0.7239966 -0.2902001 0 0.956966 -0.7104598 0 -0.7037378 -0.9956303 0 -0.09338221 -0.3288496 0 -0.9443823 0.9756038 0 0.2195385 0.8377235 0 -0.5460946 -0.8906546 0 0.4546806 0.4741928 0 -0.880421 -0.9590192 0 -0.2833412 -0.9954924 0 -0.09484132 0.84754 0 -0.5307315 -0.3563706 0 -0.9343447 -0.3966909 0 -0.9179522 0.9814462 0 0.1917378 0.8187894 0 -0.5740941 -0.2356982 0 -0.9718263 0.7833576 0 0.6215712 0.7153671 0 -0.6987488 0.1394827 0 0.9902245 -0.8033905 0 -0.5954525 -0.7829281 0 0.6221122 -0.9986103 0 -0.05270206 0.7756646 0 -0.6311454 -0.8020745 0 -0.597224 -0.3862826 0 -0.9223805 0.9777723 0 0.2096694 0.8323792 0 -0.5542066 -0.9588345 0 0.2839655 0.2405733 0 -0.970631 -0.659602 0 -0.751615 0.6133164 0 0.7898373 -0.9673389 0 -0.2534868 -0.1706487 0 0.9853319 -0.8318912 0 -0.5549388 0.9734966 0 0.2287017 -0.2210171 0 -0.9752699 -0.9069258 0 0.4212904 -0.9219019 0 0.3874233 -0.1473257 0 -0.989088 -0.5975238 0 -0.8018512 0.9998902 0 0.01481916 0.9618192 0 0.2736856 -0.02991829 0 -0.9995523 -0.2506912 0 -0.9680671 0.9997595 0 0.02193049 0.9982615 0 -0.058941 -0.7803811 0 0.6253042 -0.7602671 0 0.6496106 0.9926822 0 -0.1207565 0.9999464 0 -0.01035018 0.3129179 0 0.9497802 0.1969656 0 0.9804104 -0.6231664 0 -0.7820893 -0.5257722 0 -0.8506254 0.6035172 0 0.7973499 0.4708095 0 0.8822349 0.02988049 0 -0.9995535 0.4837154 0 -0.8752254 0.9993655 0 -0.03561786 0.9495095 0 -0.3137382 0.1948284 0 0.9808374 -0.1060963 0 0.9943559 -0.8078462 0 -0.5893934 -0.836505 0 -0.5479594 0.9876586 0 0.1566221 0.9472746 0 0.320423 -0.1395778 0 0.9902111 -0.6265644 0 0.7793696 -0.6866983 0 -0.7269425 -0.6320464 0 -0.7749305 0.9971731 0 -0.07513887 0.9869975 0 -0.1607358 0.2141519 0 0.9768004 -0.06648162 0 0.9977876 -0.8354014 0 -0.5496403 -0.8272186 0 -0.5618803 0.9429835 0 -0.3328394 0.969123 0 -0.2465778 0.08593775 0 0.9963005 0.2794609 0 0.9601571 -0.955558 0 -0.2948031 -0.9729001 0 -0.2312259 0.7027601 0 -0.7114269 0.8856832 0 -0.4642901 0.04621741 0 0.9989314 0.2639381 0 0.9645396 -0.9970185 0 -0.07716341 -0.999989 0 -0.004692553 -0.1303238 0 0.9914715 -0.2500025 0 0.9682452 -0.438602 0 -0.8986814 -0.3522841 0 -0.9358931 0.9998082 0 0.01958399 0.9995916 0 -0.02857782 -0.1154348 0 0.9933151 -0.5660888 0 0.8243443 -0.5315473 0 -0.8470286 -0.5169986 0 -0.8559863 0.8936876 0 0.4486898 0.8555516 0 0.5177176 -0.995169 0 0.09817632 -0.9844552 0 -0.1756359 -0.9928251 0 -0.119576 -0.9735645 0 -0.2284123 0.885486 0 -0.464666 0.8879503 0 -0.4599394 0.04713125 0 -0.9988887 0.07874538 0 -0.9968948 0.9982082 0 -0.05983568 0.9662324 0 -0.2576723 -0.4993751 0 0.8663859 -0.6133053 0 0.789846 0.09309339 0 0.9956574 0.03532266 0 0.999376 0.8483977 0 -0.5293593 0.8092799 0 -0.5874232 0.9997139 0 -0.02392011 0.9850199 0 -0.1724405 -0.1303041 0 0.9914741 -0.2102878 0 0.9776395 -0.8146736 0 -0.5799197 -0.839813 0 -0.5428759 0.002276588 0 -0.9999974 0.006132863 0 -0.9999812 0.9998984 0 0.01425439 0.9983674 0 0.05711779 -0.9144316 0 0.4047405 -0.9115396 0 0.4112123 -0.9996213 0 0.02751873 -0.9832776 0 0.1821131 -0.1010089 0 -0.9948855 0.007907437 0 -0.9999687 0.8705711 0 0.4920427 0.8092801 0 0.5874229 -0.9996444 0 0.02666459 -0.9860368 0 0.1665278 0.004536792 0 -0.9999897 0.001536718 0 -0.9999988 0.8929188 0 0.4502178 0.8728142 0 0.4880527 -9.33466e-4 0 -0.9999996 0 0 -1 0.9999998 0 6.7382e-4 0.9998505 0 0.01729014 -0.9932272 0 0.1161881 -0.9992493 0 0.03873955 -0.01859516 0 -0.9998271 -0.00857175 0 -0.9999633 0.9998319 0 0.01833507 0.9861084 0 0.1661029 -0.8753194 0 0.4835452 -0.839813 0 0.5428759 -0.9937885 0 0.1112849 -0.9851964 0 0.1714293 -0.06784488 0 -0.9976959 0.444467 0 -0.8957952 0.6808756 0 0.7323991 0.5368259 0 0.8436931 -0.9812006 0 -0.1929906 -0.9999881 0 0.004873024 -0.06065003 0 -0.9981591 -0.03608826 0 -0.9993486 0.5800808 0 0.8145589 0.5008884 0 0.8655119 0.2545059 0 -0.9670712 -0.05993306 0 -0.9982024 0.999987 0 0.005099251 0.9906168 0 0.1366685 -0.933745 0 0.3579388 -0.9715126 0 0.236988 0.9832892 0 -0.1820502 0.9918922 0 0.1270822 -0.02599414 0 0.9996621 -0.4098709 0 0.9121435 -0.8026106 0 -0.5965033 -0.8878274 0 -0.4601767 0.162571 0 0.9866969 -0.05403019 0 0.9985393 -0.9998882 0 -0.01495562 -0.9897485 0 0.1428211 0.5250702 0 -0.8510589 0.739957 0 -0.6726542 -0.03280822 0 -0.9994617 -0.0880846 0 -0.996113 0.9999638 0 -0.008511647 0.9981755 0 0.06037982 -0.9363828 0 0.3509805 -0.9729001 0 0.2312259 -0.8403228 0 -0.5420863 -0.7718039 0 -0.6358607 -0.4291956 0 -0.9032116 -0.2899777 0 -0.9570334 0.9991474 0 0.04128433 0.9835899 0 0.180419 -0.515214 0 0.8570616 -0.3522841 0 0.9358931 -0.8134024 0 -0.5817014 -0.5863549 0 -0.8100543 0.9998739 0 0.01588112 0.9993892 0 0.03494603 -0.5120707 0 0.8589433 -0.6365542 0 0.771232 -0.254439 0 -0.9670888 0.05555985 0 -0.9984554 0.9926819 0 0.1207583 0.9999464 0 0.01035017 0.7538242 0 0.6570761 0.6924834 0 0.7214338 0.002017811 0 0.999998 -0.007768093 0 0.9999698 -0.9995277 0 -0.03073043 -0.9954491 0 -0.09529466 0.9723768 0 -0.2334166 0.9875096 0 -0.1575586 0.01699648 0 0.9998555 0.007478844 0 0.999972 -0.2340054 0 -0.9722353 0.1867822 0 -0.9824014 -0.5945613 0 0.8040503 -0.7309795 0 0.6823994 -0.9996213 0 -0.02751938 -0.9832776 0 -0.1821131 -0.9989222 0 0.04641661 -0.9414669 0 -0.3371054 0.9936455 0 -0.1125548 0.9991413 0 0.04143324 -0.6554926 0 0.7552016 -0.9389776 0 0.3439784 0.9510545 0 0.309023 0.9564904 0 0.2917639 -0.9991358 0 0.04156467 -0.9999575 0 -0.009216012 0.3558443 0 -0.9345453 0.5075971 0 -0.8615946 0.1395688 0 -0.9902124 0.232326 0 -0.972638 -0.4623743 0 0.8866848 -0.5734079 0 0.81927 -0.7721325 0 0.6354616 -0.7714077 0 0.6363412 0.7857632 0 0.6185275 0.6985977 0 0.7155147 0.8385495 0 -0.5448254 0.7681985 0 -0.6402118 0.01274619 0 -0.9999188 0.02626224 0 -0.9996551 0 0 -1 0 0 -1 0.9974158 0 0.07184471 0.932228 0 0.3618715 -0.7831149 0 0.621877 -0.9220002 0 0.3871894 1.35531e-4 0 -1 7.67614e-4 0 -0.9999997 -0.06094594 0 0.9981411 -0.1396622 0 0.9901992 -0.01430811 0 0.9998976 -0.02903211 0 0.9995785 0.8854174 0 -0.4647967 0.8753444 0 -0.4834999 -0.004097672 0 -0.9999916 -0.001347175 0 -0.9999991 -0.9962362 0 -0.08668034 -1 0 0 -0.2530703 0 0.9674479 -0.3825395 0 0.9239391 0.5534698 0 -0.8328692 0.7241162 0 -0.689678 -0.818387 0 -0.5746675 -0.8755912 0 -0.4830528 -0.999593 0 -0.02852712 -0.9816169 0 -0.1908621 0.05073707 0 -0.998712 0.05632564 0 -0.9984125 0.8528899 0 0.5220909 0.4520885 0 0.8919731 -0.9716688 0 0.2363467 -0.9960896 0 0.08834922 0.6568186 0 -0.7540486 0.5386236 0 -0.8425465 -0.1816594 0 -0.9833615 -0.1056619 0 -0.9944021 0.5409546 0 0.8410518 0.4090661 0 0.9125048 -0.956959 0 -0.2902231 -0.9230806 0 -0.3846066 0.04231552 0 -0.9991043 -0.101068 0 -0.9948795 -0.8728225 0 -0.4880379 -0.8831329 0 -0.4691229 -0.7196618 0 0.6943248 -0.8394975 0 0.5433636</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape8-tangents-array" count="957" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape8-binormals" name="qt_gauge_background_Shape8-binormals">
+ <float_array id="qt_gauge_background_Shape8-binormals-array" count="2871">0.9999833 0 -0.005794757 -1 0 0 0.04143324 0 0.9991413 -0.9999993 0 0.001224902 -0.9999995 0 -0.001098399 0.08834922 0 -0.9960896 0.9999536 0 0.009637419 -1 0 -1.00048e-4 -0.9993487 0 -0.03608826 0.9901993 0 -0.1396621 -0.9944021 0 -0.1056619 0.9239392 0 -0.3825395 0.3874233 0 -0.9219019 0.1547864 0 0.9879479 -0.9570331 0 -0.2899787 -0.7557234 0 0.654891 -0.1908621 0 -0.9816169 0.02857782 0 0.9995916 -0.8100543 0 -0.5863549 0.9452019 0 -0.3264865 -0.3846066 0 -0.9230806 -0.1475163 0 0.9890597 0.04493091 0 0.9989901 0.9301487 0 0.367183 0.5433642 0 -0.8394971 0.7712321 0 -0.6365542 -0.1926831 0 0.9812611 0.9833259 0 0.1818524 -0.9999633 0 -0.00857175 0.9996942 0 -0.02472807 0.4097515 0 0.9121973 0.1703207 0 0.9853887 0.9804105 0 0.1969654 -0.9996551 0 0.02626224 0.9992462 0 0.03882127 -0.9999812 0 0.006132863 -0.1661029 0 0.9861084 -0.9833258 0 0.1818526 0.882235 0 0.4708095 -0.9968948 0 0.07874538 0.6948225 0 -0.7191812 0.320423 0 0.9472746 -0.9726378 0 0.2323269 0.4010428 0 0.9160593 -0.2939753 0 0.9558131 -0.9985394 0 -0.0540302 -0.2465778 0 0.9691231 -0.8615946 0 0.5075971 0.9984125 0 0.05632565 0.7862599 0 0.6178958 -0.02961386 0 -0.9995614 -0.4642901 0 0.8856832 0.517718 0 0.8555514 0.7155147 0 0.6985977 0.2199067 0 -0.975521 0.07055049 0 0.9975082 -0.9999188 0 0.0127462 0.07474448 0 -0.9972028 0.5434285 0 0.8394555 0.1078354 0 0.9941688 -0.9738836 0 -0.2270485 0.8040504 0 -0.5945613 -0.07315802 0 0.9973205 -0.9988887 0 0.04713171 0.8312061 0 -0.5559643 -0.999905 0 -0.01379216 0.07279823 0 -0.9973468 0.2923124 0 0.9563229 0.01410094 0 -0.9999006 0.9790941 0 0.2034078 -0.5282167 0 0.8491096 0.9998876 0 -0.01499501 0.05694235 0 0.9983775 -0.7731727 0 -0.6341956 -0.9912055 0 0.1323316 0.04409803 0 -0.9990272 0.2823686 0 0.959306 -0.6019686 0 0.7985198 -0.9345448 0 0.3558455 0.1047255 0 -0.9945012 0.9025303 0 0.4306264 -0.7114301 0 0.702757 0.05738036 0 -0.9983524 0.7973503 0 0.6035168 -0.9995535 0 0.02987966 0.0599726 0 -0.9982001 0.6502356 0 -0.7597327 0.9999944 0 0.003349972 -0.07906546 0 0.9968694 -0.1889679 0 -0.9819833 0.9999356 0 -0.01134547 -0.9992193 0 -0.03950941 0.7323991 0 0.6808755 -0.09268696 0 0.9956954 -0.1358811 0 0.9907252 -0.02852194 0 -0.9995932 0.522709 0 0.8525112 0.3139379 0 -0.9494435 0.01251316 0 0.9999218 -0.903211 0 -0.4291968 -0.9833615 0 -0.1816594 0.8417205 0 0.5399137 0.6179978 0 0.7861798 0.69432 0 -0.7196664 -0.5982893 0 -0.8012802 -0.9998271 0 -0.01859517 -1 0 0 0.2146901 0 -0.9766822 0.5005682 0 0.8656971 -1 0 -4.29631e-4 0.9955215 0 0.09453546 0.9997824 0 0.02085874 -0.4504484 0 -0.8928026 -0.999997 0 0.00246603 -0.02392066 0 0.9997139 0.9497802 0 0.3129179 -0.7820895 0 -0.6231662 -0.5375108 0 0.8432569 -0.1125495 0 0.9936461 -0.9915556 0 -0.1296829 0.7506063 0 -0.6607498 0.1566188 0 0.9876592 -0.7599102 0 -0.6500281 -0.9902124 0 0.1395688 0.8828766 0 -0.4696052 -0.3328353 0 0.942985 -0.9971668 0 0.07522278 -0.4923136 0 0.8704179 0.6185231 0 0.7857667 0.4486898 0 0.8936876 -0.9271351 0 0.3747275 0.1191173 0 -0.9928803 -0.9959834 0 0.08953828 -0.02094473 0 -0.9997807 0.6392007 0 0.76904 -0.05997253 0 -0.9982001 0.9674479 0 -0.2530703 -0.8328694 0 0.5534695 0.8589436 0 -0.5120703 -0.9670892 0 -0.2544379 -0.1566087 0 -0.9876608 0.9998735 0 -0.01591448 -0.5620066 0 0.8271328 0.236344 0 -0.9716694 0.9271873 0 0.3745981 -0.7423262 0 0.6700386 -0.09654972 0 -0.9953282 0.999905 0 -0.01378608 -0.5541807 0 0.8323963 -0.2902189 0 -0.9569603 0.9758216 0 -0.2185685 -0.262649 0 0.9648916 -0.5817057 0 -0.8133994 0.9936637 0 -0.1123949 -0.03317376 0 0.9994496 0.985656 0 0.1687666 -0.9162679 0 0.4005659 -0.01773433 0 -0.9998428 0.9227959 0 0.3852895 -0.8465351 0 0.532333 0.4212904 0 -0.9069259 -0.0548355 0 0.9984954 -0.1317639 0 0.9912812 -0.4771018 0 -0.8788482 -0.9981591 0 -0.06065053 -0.1711105 0 -0.9852518 0.8236452 0 0.5671056 0.9983069 0 -0.05816846 -0.5683311 0 -0.8228 -0.08668099 0 -0.9962361 0.9938172 0 0.1110288 -0.5742942 0 0.818649 -0.9999921 0 -0.004006125 0.03900827 0 -0.9992389 0.4086761 0 0.9126795 0.09268767 0 0.9956952 -0.9996597 0 0.02608769 0.55773 0 -0.8300225 0.07788101 0 0.9969627 -0.9999967 0 -0.002566165 0.4678352 0 -0.8838158 -1 0 3.89273e-4 0.003153755 0 -0.9999951 -0.9526351 0 -0.3041159 0.5869265 0 -0.8096403 0.801568 0 0.5979037 -0.3089173 0 0.951089 0.6197109 0 0.7848302 0.3553346 0 0.9347392 0.4884556 0 0.8725889 0.701436 0 0.7127324 0.9219845 0 0.3872268 0.6471023 0 0.7624032 0.563151 0 0.826354 -0.346139 0 0.9381832 -0.9174177 0 0.3979256 0.3608145 0 -0.9326376 -0.5546376 0 0.832092 0.5487536 0 0.8359842 0.6142197 0 -0.7891352 -0.5941913 0 -0.8043239 -0.5478821 0 -0.8365555 0.3571538 0 -0.9340456 0.5388461 0 -0.8424042 -0.5814887 0 -0.8135545 -0.3448305 0 -0.938665 0.6477465 0 -0.7618559 0.7055326 0 0.7086775 -0.6051891 0 0.7960817 0.4761315 0 -0.8793741 0.5448259 0 0.8385492 0.6600943 0 -0.7511829 0.2503352 0 -0.9681593 -0.8948666 0 -0.4463337 -0.2590007 0 -0.9658772 -0.5971364 0 0.8021398 0.9087633 0 0.4173118 0.5819292 0 -0.8132396 -0.4760249 0 -0.8794319 -0.4961815 0 -0.8682188 0.5558726 0 -0.8312675 -0.7321637 0 -0.6811287 0.9946741 0 0.1030699 -0.6310061 0 -0.7757778 -0.5772715 0 -0.8165523 -0.6575674 0 -0.7533958 0.7607704 0 -0.6490211 -0.647218 0 0.762305 0.3697599 0 -0.9291274 0.8730669 0 0.4876004 -0.5785502 0 0.8156468 0.2419736 0 0.9702829 0.6183912 0 -0.7858706 -0.4465345 0 -0.8947664 -0.3315678 0 -0.9434314 -0.8673071 0 -0.4977735 0.7393348 0 0.6733381 0.5355641 0 0.8444946 0.3159572 0 0.9487734 -0.5371248 0 0.8435029 -0.8012021 0 -0.598394 -0.5410708 0 0.8409771 -0.801568 0 0.5979037 0.4760252 0 -0.8794317 0.5780103 0 0.8160295 -0.2154051 0 0.9765248 -0.5662599 0 -0.8242268 -0.3670009 0 0.9302206 -0.9927268 0 0.1203893 -0.5567982 0 -0.8306478 -0.7514794 0 -0.6597565 0.6370501 0 0.7708225 -0.6981884 0 0.715914 -0.5635859 0 -0.8260576 -0.7383184 0 0.6744524 0.9201752 0 0.391507 -0.8808061 0 0.473477 -0.9144115 0 -0.4047859 0.8346616 0 -0.5507631 0.3011297 0 0.9535832 0.7593235 0 -0.6507133 0.2240997 0 0.9745662 -0.760258 0 -0.6496212 0.5229412 0 0.8523688 -0.9168387 0 0.3992577 0.7038822 0 -0.7103168 -0.2403464 0 0.9706872 -0.4199681 0 -0.9075389 0.945466 0 -0.3257208 0.3186668 0 0.9478669 -0.7533246 0 0.657649 0.1698301 0 -0.9854735 0.1636376 0 0.9865205 -0.958584 0 0.28481 0.5119013 0 -0.8590443 0.3680894 0 0.9297905 -0.7571 0 0.6532991 0.3322203 0 -0.9432018 0.4939634 0 0.8694828 -0.9193639 0 0.3934081 0.02845357 0 -0.9995951 0.9710465 0 0.2388908 -0.9553693 0 0.2954141 0.007518318 0 -0.9999717 0.5091526 0 0.8606763 -0.9999989 0 -0.001540089 0.6381938 0 -0.7698758 0.4190477 0 0.9079642 -0.9235085 0 0.3835782 0.6175282 0 -0.7865487 -0.387523 0 0.92186 -0.3068001 0 -0.951774 0.9878636 0 0.1553239 -0.9783379 0 -0.2070141 0.01561528 0 -0.9998781 0.718325 0 0.6957077 0.4998475 0 -0.8661135 0.2787976 0 0.9603499 -0.9657705 0 -0.2593981 -0.7359808 0 0.6770024 -0.1613494 0 -0.9868973 0.7285306 0 0.6850133 0.2802886 0 0.9599158 -0.9999495 0 0.01004854 0.2054024 0 -0.9786777 0.9998663 0 -0.01635707 0.1194012 0 0.9928461 -0.796271 0 -0.60494 -0.3156693 0 -0.9488693 0.9354239 0 -0.3535282 -0.1610538 0 0.9869456 -0.2703735 0 -0.9627556 0.838312 0 -0.5451908 -0.1515426 0 0.9884508 0.9995651 0 -0.02949025 0.01609094 0 0.9998705 -0.3783846 0 -0.9256485 0.7282907 0 -0.6852683 0.1302385 0 0.9914828 -0.6385244 0 -0.7696016 -0.4508708 0 -0.8925893 0.8943112 0 -0.4474455 -0.5129125 0 0.858441 0.07452473 0 -0.9972191 0.9772091 0 -0.2122793 -0.743821 0 0.6683788 0.976863 0 -0.2138664 0.01942399 0 0.9998114 -0.8120686 0 -0.5835622 0.5962993 0 0.8027623 -0.8122812 0 0.5832661 0.4286706 0 -0.9034609 -0.7793536 0 0.6265845 0.01089991 0 -0.9999407 0.9886423 0 0.1502878 0.7421743 0 -0.670207 0.02395628 0 0.9997131 -0.8403987 0 -0.5419686 0.4198765 0 0.9075814 -0.9988082 0 0.0488086 0.1721008 0 -0.9850793 0.7653186 0 -0.6436516 0.3366228 0 0.9416396 -0.9991748 0 -0.04062005 0.1721959 0 -0.9850628 0.2265246 0 0.9740055 -0.9978715 0 0.06521226 -0.8922559 0 -0.45153 0.8866087 0 -0.4625204 -0.01692019 0 0.9998569 0.07130312 0 -0.9974547 0.9986412 0 0.05211495 -0.4735581 0 0.8807626 -0.9997478 0 0.02246054 -0.0555739 0 -0.9984546 0.6309189 0 0.7758488 0.9119767 0 0.4102423 -0.7611368 0 0.6485913 -0.2895088 0 -0.9571754 0.7068176 0 -0.7073958 0.2696621 0 0.962955 -0.8983276 0 -0.4393262 -0.3492609 0 -0.9370256 0.8504763 0 0.5260133 -0.6887596 0 0.7249898 -0.3596517 0 -0.9330866 0.8947085 0 0.4466507 -0.440093 0 0.8979522 0.6702017 0 -0.742179 0.2059476 0 0.978563 -0.8916263 0 -0.4527723 -0.6544112 0 -0.7561389 0.8306408 0 -0.5568087 -0.2171288 0 0.9761429 0.7131072 0 0.701055 -0.6153833 0 0.788228 0.04790721 0 -0.9988519 -0.3544173 0 -0.9350874 0.9723821 0 -0.2333947 -0.4752502 0 0.8798507 -0.4000714 0 -0.916484 0.7889555 0 -0.6144504 -0.06086835 0 0.9981458 -0.4870034 0 -0.8734002 0.9614139 0 0.2751062 -0.8339769 0 0.5517993 0.9165984 0 -0.3998093 0.4011045 0 0.9160323 -0.9710618 0 -0.2388281 -0.7133801 0 0.7007773 -0.4457425 0 -0.8951613 0.9277425 0 0.3732211 0.6087986 0 -0.7933249 -0.02028537 0 0.9997943 -0.9275849 0 -0.3736126 0.8630673 0 0.5050889 -0.07208411 0 0.9973986 -0.5289761 0 -0.8486368 -0.9294494 0 0.3689496 -0.3330849 0 -0.9428969 0.8699845 0 0.4930792 -0.06867535 0 0.9976391 -0.8058 0 -0.5921878 0.9999914 0 0.004142024 0.8548496 0 -0.5188759 -0.02647098 0 0.9996496 -0.8435705 0 -0.5370185 -0.292892 0 -0.9561455 0.9999973 0 -0.002368635 -0.4685601 0 0.8834316 -0.3314082 0 -0.9434875 0.9985945 0 -0.0530011 -0.0141969 0 0.9998993 -0.9170564 0 -0.3987577 0.4018441 0 -0.9157081 0.4551339 0 0.8904231 0.5216802 0 0.8531411 -0.6293918 0 0.7770882 -0.0986803 0 -0.9951192 0.3961192 0 0.9181992 -0.8728947 0 0.4879089 0.4879186 0 -0.8728893 0.1796716 0 0.9837267 -0.9999714 0 0.007570275 0.3886273 0 -0.9213951 -0.6697361 0 0.7425993 0.02273164 0 -0.9997417 0.6528686 0 0.7574712 -0.794423 0 -0.607365 0.6675692 0 -0.7445478 0.1326488 0 0.9911631 -0.8050284 0 0.5932363 0.02655686 0 -0.9996473 0.9208432 0 0.3899329 -0.8696297 0 0.4937046 -0.4141838 0 -0.9101933 0.908168 0 0.418606 0.7206874 0 -0.6932601 0.4110372 0 0.9116186 -0.9967281 0 -0.08082894 0.4042828 0 0.914634 -0.9910225 0 -0.1336958 0.4722807 0 -0.8814483 -0.2739753 0 0.9617368 -0.457898 0 -0.8890048 0.7403494 0 -0.6722223 -0.4170226 0 -0.9088962 0.9623164 0 -0.2719322 -0.2242381 0 0.9745345 -0.4551444 0 0.8904176 -0.3404029 0 -0.9402797 0.8051459 0 0.5930768 -0.9972709 0 -0.07382966 0.4996734 0 -0.8662139 0.438024 0 0.8989633 -0.2352747 0 -0.971929 0.999723 0 0.02353524 -0.2076101 0 0.9782118 -0.429006 0 -0.9033017 0.9696386 0 -0.2445425 -0.7779211 0 0.6283619 0.4962485 0 0.8681805 -0.9948054 0 -0.1017951 0.7117993 0 -0.7023829 -0.7962176 0 0.6050105 0.2338244 0 -0.9722789 0.3856103 0 0.9226617 -0.251417 0 -0.9678789 0.9992061 0 0.03983902 -0.2741085 0 0.9616988 -0.8769521 0 0.4805779 0.01580258 0 -0.9998752 0.9947944 0 0.1019033 0.7426603 0 0.6696684 -0.9567629 0 0.2908692 0.199875 0 -0.9798215 -0.9991069 0 -0.04225556 0.6167363 0 -0.7871699 -0.2609313 0 0.9653574 -0.4430023 0 0.8965205 -0.3367187 0 -0.9416054 -0.9971002 0 -0.07610017 -0.3462557 0 -0.9381403 0.8423793 0 0.5388851 0.5442119 0 -0.8389478 0.9363719 0 -0.3510095 -0.5677651 0 0.8231906 0.6976421 0 0.7164464 0.8399392 0 0.5426806 -0.894867 0 0.4463329 -0.05895251 0 0.9982608 0.7130477 0 -0.7011155 -0.1319579 0 0.9912553 0.5657381 0 0.8245851 0.8763934 0 -0.4815959 -0.4457834 0 0.8951409 0.274499 0 0.9615874 0.6908436 0 -0.7230042 -0.2249939 0 0.9743602 0.5688285 0 0.8224563 0.619385 0 -0.7850874 0.05871328 0 0.998275 0.6091524 0 0.7930532 0.6315701 0 -0.7753189 0.2319368 0 0.9727309 0.9974214 0 0.07176702 0.9829677 0 -0.1837785 -0.5308553 0 0.8474625 0.7276974 0 0.6858982 0.9272479 0 -0.3744482 -0.4121316 0 0.9111245 0.5867092 0 0.8097977 0.4365751 0 0.8996679 -0.9497555 0 0.3129929 -0.3596594 0 0.9330837 0.2471768 0 0.9689704 -0.7845168 0 -0.6201077 -0.9836401 0 0.1801451 -0.6044825 0 -0.7966185 0.9683968 0 0.2494145 0.122288 0 -0.9924946 0.3320029 0 0.9432784 -0.8189467 0 -0.5738698 -0.5521382 0 0.8337526 0.9204904 0 -0.3907651 -0.192292 0 0.9813378 0.5317975 0 0.8468716 -0.2658451 0 -0.9640158 0.8085307 0 0.588454 0.9330828 0 -0.3596618 -0.8360603 0 0.5486376 0.1673192 0 -0.9859028 -0.5548939 0 -0.8319212 -0.7122331 0 0.7019431 0.1431174 0 -0.9897057 -0.4585879 0 -0.8886492 0.007228567 0 -0.9999739 0.3281603 0 0.944622 0.8522885 0 -0.5230721 -0.2909185 0 -0.9567479 0.7700137 0 0.6380274 0.5537029 0 -0.8327143 -0.9158847 0 0.4014415 0.3840324 0 -0.9233197 -0.5828717 0 -0.8125641 -0.9645896 0 0.2637556 0.6019256 0 -0.7985522 -0.1131537 0 -0.9935776 -0.1167437 0 -0.9931622 0.816198 0 0.5777723 0.8068728 0 -0.5907252 0.7497949 0 -0.6616703 -0.3375879 0 0.941294 0.5991388 0 0.8006452 0.2295473 0 0.9732976 -0.968542 0 -0.2488502 -0.6027287 0 0.7979463 -0.1114767 0 -0.9937671 0.8896795 0 0.4565857 0.5007702 0 -0.8655803 0.9051284 0 -0.4251384 -0.2074702 0 0.9782413 0.5462295 0 0.8376356 -0.7116352 0 -0.7025492 0.9963067 0 -0.08586564 0.679277 0 -0.733882 -0.6327811 0 -0.7743307 0.9099719 0 -0.41467 0.05856136 0 -0.9982839 -0.8399385 0 0.5426818 -0.3089127 0 -0.9510904 -0.9131148 0 -0.4077026 -0.9333556 0 0.358953 0.417843 0 -0.9085193 -0.09294518 0 -0.9956713 0.06252148 0 0.9980437 -0.6471048 0 -0.762401 -0.941149 0 0.337992 0.3086275 0 -0.9511831 0.423056 0 0.9061036 0.9866954 0 0.1625799 -0.3792601 0 -0.9252901 0.9184566 0 0.3955217 0.5828717 0 -0.8125641 -0.9898266 0 -0.1422788 0.564081 0 -0.8257195 -0.5738121 0 -0.818987 -0.9989176 0 -0.04651513 0.5051646 0 -0.8630231 -0.5315556 0 -0.8470234 -0.2156989 0 -0.9764599 0.9472018 0 0.3206383 0.5402182 0 -0.841525 -0.6506076 0 0.7594141 0.1879518 0 -0.9821783 -0.8428663 0 -0.5381231 0.528711 0 -0.848802 0.104358 0 0.9945398 0.946588 0 0.3224457 -0.886924 0 0.4619155 0.4165272 0 -0.9091234 -0.531927 0 -0.8467903 -0.6575269 0 0.7534311 0.08178595 0 -0.9966499 -0.5301373 0 -0.8479119 -0.9955979 0 -0.09372819 0.7239471 0 -0.6898555 -0.6681103 0 -0.7440623 -0.6199795 0 -0.784618 0.9728051 0 0.231625 0.7047517 0 -0.7094541 0.5993645 0 0.8004763 -0.9876732 0 -0.15653 -0.6160917 0 0.7876744 -0.2682993 0 -0.9633357 0.9110445 0 0.4123082 0.1345178 0 -0.9909112 -0.2192125 0 -0.9756772 0.5499529 0 0.8351958 0.9723492 0 0.2335315 0.4251158 0 0.905139 -0.9257691 0 -0.3780894 -0.7164711 0 0.6976168 0.7932048 0 0.608955 -0.9041454 0 0.4272249 0.1005404 0 0.9949331 -0.1817313 0 -0.9833483 0.8351597 0 0.5500075 0.5785367 0 -0.8156564 -0.9193717 0 0.3933902 0.3351377 0 -0.9421692 -0.5169221 0 -0.8560326 -0.5969796 0 0.8022564 -0.001769625 0 -0.9999985 -0.5332279 0 -0.8459716 0.005255516 0 0.9999863 -0.4578086 0 -0.8890508 -0.9824959 0 -0.1862846 0.4564139 0 -0.8897676 0.27191 0 0.9623227 0.6589163 0 0.7522163 0.7843931 0 -0.6202641 -0.2958131 0 0.9552459 0.5567015 0 0.8307126 0.8357797 0 -0.5490651 -0.2466693 0 0.9690998 0.410819 0 0.9117169 0.1480101 0 0.988986 -0.7031916 0 -0.7110003 -0.4312841 0 0.9022163 -0.2488246 0 0.9685486 -0.2523514 0 -0.9676357 -0.9625161 0 -0.2712249 0.1724664 0 0.9850155 -0.9116556 0 -0.4109551 -0.5351089 0 0.8447832 0.5677639 0 0.8231915 -0.9363717 0 -0.3510101 -0.6976426 0 0.716446 -0.564081 0 -0.8257195 0.9898266 0 -0.1422795 0.5738118 0 -0.8189872 0.9240693 0 -0.382225 -0.4208764 0 0.9071181 0.7239966 0 0.6898035 0.956966 0 0.2902001 -0.7037379 0 0.7104598 -0.09338222 0 0.9956304 -0.9443823 0 0.3288496 0.2195385 0 -0.9756039 -0.5460946 0 -0.8377236 0.4546807 0 0.8906546 -0.8804211 0 -0.4741928 -0.2833412 0 0.9590192 -0.09484132 0 0.9954924 -0.5307316 0 -0.84754 -0.9343447 0 0.3563706 -0.9179524 0 0.396691 0.1917379 0 -0.9814463 -0.5740941 0 -0.8187894 -0.9718263 0 0.2356982 0.6215712 0 -0.7833576 -0.6987488 0 -0.7153671 0.9902245 0 -0.1394826 -0.5954525 0 0.8033906 0.6221122 0 0.7829281 -0.05270207 0 0.9986104 -0.6311454 0 -0.7756646 -0.597224 0 0.8020745 -0.9223805 0 0.3862827 0.2096694 0 -0.9777724 -0.5542066 0 -0.8323792 0.2839655 0 0.9588346 -0.9706311 0 -0.2405734 -0.751615 0 0.659602 0.7898374 0 -0.6133164 -0.2534868 0 0.9673389 0.985332 0 0.1706487 -0.5549388 0 0.8318912 0.2287017 0 -0.9734966 -0.9752699 0 0.2210171 0.4212904 0 0.9069258 0.3874233 0 0.9219019 -0.9890881 0 0.1473257 -0.8018513 0 0.5975237 0.01481916 0 -0.9998903 0.2736856 0 -0.9618192 -0.9995524 0 0.02991829 -0.9680671 0 0.2506912 0.02193049 0 -0.9997595 -0.058941 0 -0.9982615 0.6253042 0 0.7803811 0.6496106 0 0.7602671 -0.1207565 0 -0.9926822 -0.01035018 0 -0.9999464 0.9497802 0 -0.3129179 0.9804104 0 -0.1969656 -0.7820892 0 0.6231664 -0.8506255 0 0.5257722 0.79735 0 -0.6035172 0.8822349 0 -0.4708095 -0.9995535 0 -0.0298805 -0.8752254 0 -0.4837154 -0.03561785 0 -0.9993656 -0.3137382 0 -0.9495096 0.9808373 0 -0.1948284 0.9943559 0 0.1060963 -0.5893934 0 0.8078462 -0.5479594 0 0.8365049 0.1566221 0 -0.9876587 0.320423 0 -0.9472746 0.9902112 0 0.1395778 0.7793697 0 0.6265644 -0.7269425 0 0.6866984 -0.7749305 0 0.6320465 -0.07513887 0 -0.9971731 -0.1607358 0 -0.9869975 0.9768004 0 -0.2141519 0.9977877 0 0.06648162 -0.5496403 0 0.8354014 -0.5618803 0 0.8272187 -0.3328394 0 -0.9429835 -0.2465778 0 -0.969123 0.9963005 0 -0.08593775 0.9601572 0 -0.279461 -0.2948031 0 0.9555581 -0.2312259 0 0.9729002 -0.7114269 0 -0.7027601 -0.4642901 0 -0.8856832 0.9989314 0 -0.04621741 0.9645397 0 -0.2639381 -0.07716341 0 0.9970185 -0.004692554 0 0.9999891 0.9914715 0 0.1303238 0.9682452 0 0.2500025 -0.8986815 0 0.438602 -0.9358932 0 0.3522841 0.01958399 0 -0.9998082 -0.02857782 0 -0.9995916 0.993315 0 0.1154348 0.8243443 0 0.5660887 -0.8470287 0 0.5315473 -0.8559863 0 0.5169985 0.4486898 0 -0.8936877 0.5177176 0 -0.8555515 0.09817632 0 0.995169 -0.1756359 0 0.9844552 -0.119576 0 0.992825 -0.2284123 0 0.9735645 -0.464666 0 -0.885486 -0.4599394 0 -0.8879504 -0.9988887 0 -0.04713125 -0.9968948 0 -0.07874538 -0.05983568 0 -0.9982083 -0.2576723 0 -0.9662324 0.8663859 0 0.4993751 0.789846 0 0.6133053 0.9956574 0 -0.0930934 0.999376 0 -0.03532266 -0.5293593 0 -0.8483977 -0.5874232 0 -0.8092799 -0.02392011 0 -0.9997139 -0.1724405 0 -0.9850199 0.9914741 0 0.1303041 0.9776396 0 0.2102878 -0.5799198 0 0.8146736 -0.5428759 0 0.839813 -0.9999975 0 -0.002276588 -0.9999812 0 -0.006132863 0.01425439 0 -0.9998984 0.0571178 0 -0.9983675 0.4047405 0 0.9144317 0.4112123 0 0.9115397 0.02751873 0 0.9996214 0.1821131 0 0.9832776 -0.9948855 0 0.1010089 -0.9999688 0 -0.007907437 0.4920427 0 -0.8705711 0.5874229 0 -0.8092802 0.02666459 0 0.9996445 0.1665278 0 0.9860368 -0.9999898 0 -0.004536793 -0.9999988 0 -0.001536718 0.4502178 0 -0.8929188 0.4880527 0 -0.8728142 -0.9999996 0 9.33466e-4 -1 0 0 6.7382e-4 0 -0.9999998 0.01729014 0 -0.9998506 0.1161881 0 0.9932272 0.03873955 0 0.9992495 -0.9998271 0 0.01859516 -0.9999633 0 0.00857175 0.01833507 0 -0.9998319 0.1661029 0 -0.9861084 0.4835452 0 0.8753194 0.5428759 0 0.839813 0.1112849 0 0.9937886 0.1714293 0 0.9851964 -0.997696 0 0.06784489 -0.8957953 0 -0.4444671 0.7323992 0 -0.6808756 0.8436931 0 -0.5368258 -0.1929906 0 0.9812006 0.004873024 0 0.9999882 -0.9981591 0 0.06065003 -0.9993486 0 0.03608826 0.8145589 0 -0.5800809 0.8655119 0 -0.5008884 -0.9670712 0 -0.2545059 -0.9982024 0 0.05993306 0.00509925 0 -0.9999871 0.1366685 0 -0.9906169 0.3579388 0 0.9337451 0.2369881 0 0.9715127 -0.1820502 0 -0.9832892 0.1270822 0 -0.9918923 0.9996621 0 0.02599414 0.9121435 0 0.4098709 -0.5965033 0 0.8026106 -0.4601767 0 0.8878274 0.986697 0 -0.162571 0.9985393 0 0.05403019 -0.01495562 0 0.9998882 0.1428211 0 0.9897485 -0.851059 0 -0.5250703 -0.6726542 0 -0.739957 -0.9994617 0 0.03280821 -0.996113 0 0.08808459 -0.008511647 0 -0.9999638 0.06037983 0 -0.9981756 0.3509805 0 0.9363828 0.2312259 0 0.9729002 -0.5420863 0 0.8403229 -0.6358607 0 0.7718039 -0.9032117 0 0.4291956 -0.9570334 0 0.2899777 0.04128434 0 -0.9991475 0.180419 0 -0.9835899 0.8570616 0 0.515214 0.9358931 0 0.3522841 -0.5817014 0 0.8134024 -0.8100543 0 0.5863549 0.01588112 0 -0.9998739 0.03494603 0 -0.9993892 0.8589433 0 0.5120707 0.7712321 0 0.6365541 -0.9670888 0 0.254439 -0.9984554 0 -0.05555986 0.1207583 0 -0.992682 0.01035017 0 -0.9999465 0.6570761 0 -0.7538243 0.7214338 0 -0.6924834 0.999998 0 -0.002017811 0.9999698 0 0.007768093 -0.03073044 0 0.9995278 -0.09529466 0 0.9954491 -0.2334166 0 -0.9723768 -0.1575586 0 -0.9875097 0.9998556 0 -0.01699648 0.999972 0 -0.007478843 -0.9722353 0 0.2340054 -0.9824014 0 -0.1867822 0.8040504 0 0.5945613 0.6823995 0 0.7309796 -0.02751938 0 0.9996213 -0.1821131 0 0.9832776 0.04641661 0 0.9989222 -0.3371055 0 0.941467 -0.1125548 0 -0.9936456 0.04143324 0 -0.9991413 0.7552016 0 0.6554926 0.3439784 0 0.9389776 0.3090231 0 -0.9510546 0.291764 0 -0.9564905 0.04156467 0 0.9991358 -0.009216012 0 0.9999576 -0.9345453 0 -0.3558443 -0.8615946 0 -0.5075971 -0.9902124 0 -0.1395688 -0.972638 0 -0.232326 0.8866848 0 0.4623743 0.81927 0 0.5734079 0.6354616 0 0.7721325 0.6363412 0 0.7714078 0.6185275 0 -0.7857631 0.7155147 0 -0.6985977 -0.5448254 0 -0.8385496 -0.6402118 0 -0.7681985 -0.9999188 0 -0.01274619 -0.9996551 0 -0.02626224 -1 0 0 -1 0 0 0.07184471 0 -0.9974158 0.3618715 0 -0.932228 0.621877 0 0.7831149 0.3871894 0 0.9220002 -1 0 -1.35531e-4 -0.9999997 0 -7.67614e-4 0.9981412 0 0.06094595 0.9901993 0 0.1396622 0.9998977 0 0.01430811 0.9995785 0 0.02903211 -0.4647967 0 -0.8854175 -0.4835 0 -0.8753445 -0.9999916 0 0.004097672 -0.9999991 0 0.001347175 -0.08668034 0 0.9962362 0 0 1 0.9674479 0 0.2530703 0.9239392 0 0.3825395 -0.8328692 0 -0.5534698 -0.689678 0 -0.7241163 -0.5746675 0 0.818387 -0.4830528 0 0.8755912 -0.02852712 0 0.999593 -0.1908621 0 0.9816169 -0.9987121 0 -0.05073708 -0.9984125 0 -0.05632565 0.5220909 0 -0.8528899 0.8919731 0 -0.4520885 0.2363467 0 0.9716688 0.08834922 0 0.9960896 -0.7540486 0 -0.6568186 -0.8425465 0 -0.5386236 -0.9833615 0 0.1816594 -0.9944021 0 0.1056619 0.8410519 0 -0.5409546 0.9125048 0 -0.4090661 -0.2902231 0 0.9569591 -0.3846066 0 0.9230806 -0.9991043 0 -0.04231552 -0.9948795 0 0.101068 -0.4880379 0 0.8728225 -0.4691229 0 0.8831329 0.6943248 0 0.7196618 0.5433636 0 0.8394974</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape8-binormals-array" count="957" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape8-map1" name="qt_gauge_background_Shape8-map1">
+ <float_array id="qt_gauge_background_Shape8-map1-array" count="1914">1 0.5 0 0.5 0.3323206 1 0 0.5393123 0 0.4606877 0.3323206 0 0.9998866 0.53125 0 0.53125 0.004088837 0.25 0.9803159 0.25 0.02075106 0.125 0.8851138 0.125 0.5 0.00876807 0.4905694 0.1250008 0.0490372 0.0625 0.472937 0.05699454 0.25 0.002366115 0.266196 0.066549 0.08664817 0.03125 0.2553331 0.03053716 0.125 0.01788053 0.1439213 0.03564227 0.1270366 0.066549 0.2186957 0.125 0.7499369 0.0625 0.75 0.06252167 0.7379694 0.1417644 0.5209558 0.238825 3.19323e-4 0.375 0.9971076 0.375 0.4609639 0.3746909 0.4998593 0.529085 0.9803159 0.75 0.004088837 0.75 0.9971076 0.625 3.19323e-4 0.625 0.498823 0.6432205 0.5209558 0.761175 0.8851138 0.875 0.02075106 0.875 0.5001974 0.8719356 0.5 0.9912319 0.0490372 0.9375 0.4672716 0.938602 0.2435113 0.8790491 0.2663216 0.9334196 0.25 0.9976339 0.08664817 0.96875 0.2479081 0.9677577 0.1326675 0.9359684 0.1363139 0.9664153 0.125 0.9821194 0.7499369 0.9375 0.75 0.9374783 0.7379694 0.8582356 0.5783031 0.9554319 0.6645253 0.4262218 0.865033 0.1686465 0.7942748 0.107785 0.4162714 0.08248846 0.443568 0.02283076 0.2124165 0.04229076 0.2073248 0.01633543 0.1158719 0.02770047 0.1149302 0.04230491 0.2085887 0.08431006 0.5783968 0.04448007 0.6697659 0.1077845 0.09422874 0.1650347 0.8250713 0.3341435 0.346837 0.2881655 0.1400325 0.4035567 0.6545334 0.7121904 0.6652436 0.5973359 0.1405619 0.5355297 0.1681127 0.6678444 0.5831149 0.831526 0.09474839 0.8350457 0.3253816 0.9470124 0.4094881 0.894244 0.2125197 0.9174431 0.1658757 0.9727248 0.2153303 0.9461457 0.08432087 0.9470712 0.1157307 0.9723388 0.7942748 0.892215 0.5761591 0.9180313 0.8592531 0.5191618 0.8454192 0.4646305 0.5829331 0.168415 0.73461 0.2084491 0.3231436 0.105879 0.2808099 0.0116581 0.3321091 0.05204027 0.3581927 0.03060132 0.169683 0.05315104 0.1694269 0.02728122 0.0842135 0.05297968 0.06723233 0.08422969 0.1288905 0.105879 0.576071 0.08018969 0.6729955 0.08170862 0.3479012 0.2081019 0.2509716 0.1650347 0.6538203 0.2881655 0.154344 0.332301 0.1536119 0.5169244 0.152886 0.4493033 0.3325216 0.4676781 0.8257844 0.6678444 0.8453844 0.5640923 0.3334367 0.5975465 0.153715 0.5675957 0.3475502 0.7121904 0.865033 0.8313536 0.73461 0.7915509 0.348083 0.7918391 0.2582008 0.8349866 0.2806637 0.9883087 0.4434744 0.9770812 0.3579528 0.9692774 0.3296714 0.9174938 0.0673397 0.9158212 0.1295175 0.8942523 0.2071786 0.9836313 0.1660235 0.958582 0.1148964 0.9586012 0.6699476 0.8921565 0.6731772 0.9182323 0.6249684 0.964366 0.5081621 0.9656549 0.5892991 0.9365624 0.4970822 0.448733 0.7438424 0.3790461 0.7501041 0.4484664 0.8284419 0.1347654 0.9327148 0.1875 0.8179476 0.1888251 0.8175569 0.09376083 0.7344942 0.1036735 0.3741673 0.06639168 0.4969662 0.08488873 0.3745764 0.09409782 0.4161603 0.004384035 0.5084783 0.03404793 0.4034353 0.02783042 0.1896982 0.03391793 0.2679069 0.04714228 0.190426 0.0475736 0.1875 0.01012332 0.245006 0.01468031 0.1879649 0.02246104 0.1058241 0.02456527 0.1381142 0.02672677 0.1126565 0.03400367 0.1381586 0.0475736 0.1010259 0.04726654 0.1889844 0.06726128 0.2643024 0.09425075 0.1717088 0.09425076 0.6249684 0.03563403 0.5896152 0.06298745 0.6238508 0.1347654 0.6578599 0.09391101 0.01241995 0.1875 0.1148354 0.1331315 0.1598966 0.170931 0.9887117 0.3125 0.7392961 0.3122509 0.32041 0.2489128 0.497556 0.2948241 0.2490108 0.3120781 1.59661e-4 0.4178438 0.1794504 0.3697694 0.1788439 0.4233213 0.710252 0.7510872 0.4999628 0.706377 0.7417029 0.6891032 0.7462497 0.6306689 0.4995393 0.5920408 0.75009 0.5784501 0 0.5352812 0.1812697 0.5278895 0.1813098 0.5466781 0.00220408 0.6875 0.2505734 0.6306887 0.2526417 0.6891032 0.6244642 0.8650354 0.4706596 0.8129288 0.6547059 0.8119562 0.1165892 0.8671398 0.01241995 0.8125 0.1622623 0.8293403 0.2672431 0.94846 0.3405429 0.9332007 0.3500009 0.9571706 0.3426347 0.8669404 0.4966614 0.9061008 0.3715279 0.9065164 0.2670998 0.9145006 0.2064513 0.9329529 0.1741309 0.9063451 0.1373316 0.9734057 0.1717593 0.9661787 0.1871656 0.9774266 0.1883808 0.9528406 0.06784268 0.953125 0.07880448 0.9331816 0.1013883 0.9529816 0.1058241 0.9754347 0.1121799 0.9662052 0.8175569 0.9062392 0.7344942 0.8963265 0.8284419 0.8652346 0.6249896 0.9144638 0.9999433 0.515625 0.8182828 0.5392476 0.8183098 0.4986926 0.9985538 0.4375 0.4700462 0.1868719 0.6547059 0.1880438 0.710252 0.2489128 0.3068237 0.1331316 0.2911603 0.001183058 0.3134379 0.01994537 0.3514224 0.0423434 0.07844208 0.06699002 0.06784268 0.046875 0.03489413 0.09375 0.09294051 0.09425075 0.6243763 0.0851839 0.7499684 0.06251083 0.2846927 0.1873471 0.00220408 0.3125 0 0.515625 0.2487637 0.4987692 0.2462873 0.4529807 0 0.4803438 0.9887117 0.6875 0.9984971 0.578125 0.2488876 0.5795953 1.59661e-4 0.5821562 0.32041 0.7510872 0.9327148 0.8125 0.8179476 0.811175 0.2859181 0.8124536 0.2911603 0.998817 0.2445126 0.9852073 0.3129445 0.9799423 0.4161603 0.995616 0.4031191 0.9718724 0.03489413 0.90625 0.09330291 0.9059209 0.1875 0.9898766 0.1377383 0.956982 0.6584733 0.9058896 0.7499684 0.9374892 0.6360073 0.9483508 0.5552919 0.969187 0.5398247 0.9488853 0.6035413 0.4633409 0.5961649 0.4074996 0.789435 0.4075521 0.8140967 0.1566158 0.8805276 0.1534904 0.8989792 0.1979167 0.773649 0.09100138 0.8325452 0.1144325 0.7751349 0.1200049 0.3570602 0.07746817 0.4430792 0.07331329 0.4463128 0.09651056 0.3989628 0.01396697 0.4682885 0.01779212 0.4602293 0.03607747 0.1806108 0.03927958 0.229807 0.03833339 0.2317477 0.05020255 0.1770833 0.01682602 0.2222867 0.01099945 0.2232395 0.02109591 0.1041302 0.02916502 0.1204038 0.02397478 0.1254333 0.03050749 0.1026571 0.03846074 0.1254333 0.03927958 0.1192945 0.05020255 0.1733641 0.07746817 0.2317477 0.07746817 0.2189351 0.09895834 0.555292 0.03081296 0.6360073 0.05164926 0.5406678 0.05032226 0.7032062 0.09100053 0.6911741 0.1200049 0.6123545 0.1144317 0.0692359 0.1930208 0.05949153 0.1534896 0.1500681 0.1485938 0.884406 0.3020833 0.8893876 0.3501823 0.6970013 0.3501298 0.229994 0.2760417 0.4194043 0.2690625 0.3892981 0.3179684 0.08466272 0.4265242 0.08491724 0.3913119 0.2460984 0.3927991 0.7718213 0.7239584 0.594341 0.7309375 0.5999024 0.6852344 0.7894306 0.6066927 0.6025954 0.6136198 0.6035489 0.5736274 0.08459608 0.5393091 0.08458424 0.5320215 0.2524899 0.5350205 0.1064707 0.6979167 0.1053524 0.6522656 0.2923748 0.6555208 0.6526113 0.8433843 0.5424861 0.8459779 0.5553793 0.8041667 0.1547449 0.8521297 0.05949152 0.8465105 0.06923589 0.8069792 0.3000488 0.955557 0.3004427 0.9407487 0.3737961 0.9442016 0.3433759 0.8862963 0.4383169 0.8850413 0.4422361 0.9116495 0.2236118 0.904213 0.2370052 0.9248893 0.1792263 0.9229895 0.1544354 0.9766328 0.151796 0.9698457 0.1926579 0.9712704 0.1833094 0.9425207 0.2370052 0.9407487 0.2284912 0.9543331 0.08532941 0.9557292 0.07008841 0.9427865 0.09843161 0.9425207 0.1204038 0.9760252 0.1041302 0.970835 0.1241623 0.9698457 0.8325452 0.8855675 0.773649 0.9089986 0.7751349 0.8799951 0.6360098 0.9265828 0.5366005 0.9243269 0.5521045 0.9029571 0.9152753 0.508125 0.9152417 0.5271875 0.7472266 0.5219346 0.7272865 0.4857107 0.8942594 0.4323698 0.9146963 0.4755729 0.5553793 0.1958333 0.5408504 0.1534906 0.6526113 0.1566158 0.8097265 0.2239583 0.6560559 0.221875 0.7391566 0.1802087 0.3748088 0.1144272 0.28172 0.1144271 0.3098727 0.08926505 0.2729988 0.01929507 0.2654785 0.00727434 0.3045878 0.008319989 0.3844309 0.055006 0.3098727 0.05793692 0.3013645 0.04291952 0.3201863 0.03121532 0.3534469 0.01996734 0.3983568 0.03988066 0.2008102 0.05793692 0.1547992 0.05793692 0.1579629 0.04508968 0.1988695 0.02843001 0.1579629 0.0305075 0.1544354 0.02336713 0.09746521 0.05793692 0.07008841 0.05721354 0.08532941 0.04427084 0.05436625 0.09895834 0.05635985 0.07674479 0.09121346 0.07746817 0.1316076 0.08926505 0.1607306 0.1144271 0.09068505 0.1144271 0.5504688 0.09406349 0.5374435 0.07243274 0.6360098 0.07341719 0.6123438 0.09651507 0.6978824 0.07307827 0.7076927 0.07553262 0.3950838 0.1770835 0.4103836 0.221875 0.2397732 0.2239583 0.2360369 0.1485938 0.3332088 0.1534897 0.1787109 0.1930208 0.593484 0.3179684 0.594341 0.2690625 0.7718212 0.2760417 0.2663731 0.3473661 0.08576909 0.3474186 0.1064707 0.3020833 0.2720622 0.5185785 0.08458613 0.5238314 0.1041719 0.508125 0.2654691 0.4249606 0.1041716 0.4703484 0.0845981 0.4525659 0.208338 0.480153 0.3890933 0.4368974 0.3956988 0.4857107 0.7034197 0.6555209 0.8893876 0.6522657 0.884406 0.6979167 0.7272673 0.5528721 0.9146391 0.5532292 0.8942313 0.5859375 0.3957634 0.5739431 0.3957365 0.6136198 0.2086547 0.6070085 0.2721267 0.5557758 0.1043404 0.5879329 0.0846624 0.5588404 0.3957165 0.6852344 0.4194043 0.7309375 0.2299941 0.7239584 0.8989792 0.8020834 0.8805276 0.8465096 0.8140967 0.8433841 0.7391566 0.8197913 0.6560559 0.778125 0.8097265 0.7760417 0.2397732 0.7760417 0.4103836 0.778125 0.3967194 0.822385 0.178711 0.8069792 0.3446361 0.8459788 0.2505053 0.8521296 0.3045878 0.99168 0.2654785 0.9927257 0.271683 0.9804054 0.4593862 0.9631301 0.4682885 0.9822079 0.3989628 0.986033 0.3975137 0.959327 0.3534469 0.9800327 0.3188705 0.9684851 0.3803636 0.9234464 0.3004427 0.9248893 0.3058199 0.904213 0.09217985 0.9229895 0.05635985 0.9232552 0.05436625 0.9010417 0.09068506 0.8855729 0.1654074 0.8862963 0.132574 0.9111927 0.2219238 0.9786046 0.2222867 0.9890006 0.1770833 0.983174 0.1926579 0.9613671 0.151796 0.9622976 0.1557656 0.9514791 0.1202609 0.9514791 0.1241623 0.9622976 0.1026571 0.9615393 0.6139901 0.8850368 0.6911741 0.8799951 0.7032062 0.9089994 0.7076927 0.9244674 0.6978823 0.9269217 0.6139795 0.9029534 0.599895 0.9593286 0.547829 0.9598056 0.586239 0.9471933 0.5912393 0.4365383 0.6993064 0.4055077 0.7019215 0.4365514 0.8497266 0.152892 0.8960079 0.1763934 0.8489905 0.1771748 0.8046973 0.1008421 0.8087975 0.1183516 0.7689558 0.1046823 0.3979515 0.07537766 0.4515122 0.08427888 0.3987599 0.08776551 0.4318796 0.01497479 0.471378 0.0279715 0.4266406 0.02538207 0.2015628 0.03833273 0.2348678 0.0442694 0.2020479 0.04450595 0.1988009 0.01377859 0.2242933 0.01590093 0.199039 0.01930554 0.1106435 0.02612465 0.124157 0.0269839 0.113403 0.03012933 0.1130348 0.03836457 0.1238797 0.04450595 0.1085248 0.04430124 0.2002363 0.07641637 0.2321499 0.08837747 0.1929501 0.08837746 0.599895 0.0406714 0.5864497 0.05260864 0.5480397 0.03999624 0.698262 0.1046821 0.6487988 0.1183514 0.6615961 0.1008409 0.05819017 0.1751693 0.1035887 0.1508854 0.1199347 0.1690495 0.8970783 0.3245248 0.78953 0.3533853 0.787501 0.3245116 0.328458 0.2716927 0.4102389 0.2929035 0.3013606 0.2995442 0.08412819 0.4098106 0.1675514 0.3891287 0.1673131 0.4117222 0.6825857 0.7283073 0.5879764 0.7078972 0.6936544 0.7012565 0.700913 0.6109896 0.5928609 0.5934525 0.7019178 0.5880488 0.08396195 0.5351373 0.1688524 0.5321492 0.1688675 0.5392432 0.09554082 0.6760873 0.2041534 0.6510872 0.2046089 0.676901 0.6008577 0.8469751 0.5356681 0.8239945 0.6131017 0.8233461 0.1047579 0.8492955 0.05819017 0.8248308 0.1211039 0.8311314 0.300852 0.9481128 0.3358514 0.9413677 0.3389771 0.951424 0.3837084 0.8830948 0.4493025 0.8996935 0.3943197 0.9000073 0.2346334 0.9154527 0.2079121 0.9242874 0.1955848 0.9125298 0.1528682 0.9732563 0.1697593 0.9700679 0.175315 0.9747438 0.2089328 0.9409475 0.2358533 0.9478069 0.2019085 0.9494739 0.07753891 0.9498894 0.08299845 0.941457 0.09264696 0.949823 0.1106435 0.9738753 0.1130853 0.969959 0.1238392 0.9731044 0.8046972 0.8991579 0.7689558 0.8953177 0.8087975 0.8816484 0.5854336 0.9259257 0.5430019 0.9125502 0.5991012 0.9155612 0.915939 0.5179427 0.8309013 0.5277493 0.830915 0.5117337 0.8007305 0.4587649 0.9099697 0.4535482 0.8255536 0.4815188 0.5352592 0.1758727 0.6004487 0.152892 0.6131017 0.176654 0.7283241 0.2260417 0.6999335 0.1994793 0.7758495 0.2000001 0.3217924 0.1169532 0.2986273 0.1004022 0.3482537 0.1004022 0.2648078 0.0130294 0.2846667 0.00699569 0.2931142 0.01492799 0.3506593 0.05810552 0.3035385 0.04995369 0.3419648 0.04799701 0.3379592 0.02583105 0.3789602 0.02970646 0.3570117 0.03608128 0.177444 0.05883825 0.1545009 0.05049623 0.1782349 0.05049623 0.1777498 0.02994558 0.1544099 0.02683199 0.1768679 0.02518133 0.08275685 0.05865741 0.07753891 0.05011068 0.09240536 0.05029152 0.05263741 0.08819662 0.07227035 0.07623553 0.07684988 0.08837747 0.1488557 0.1004022 0.1241286 0.1169531 0.112775 0.1004022 0.5428036 0.08344698 0.5856443 0.07326423 0.5986923 0.08369394 0.6504625 0.08422391 0.7055473 0.07361557 0.6627097 0.08728643 0.4004094 0.198698 0.3286476 0.2260417 0.3150309 0.1992188 0.279479 0.1508855 0.2634633 0.1751693 0.2087331 0.1690495 0.5863718 0.2929035 0.6825857 0.2716927 0.6920499 0.2995442 0.1731738 0.3492398 0.09064499 0.3238338 0.1981084 0.3238207 0.1737467 0.5227152 0.08885828 0.5171037 0.1982269 0.5108947 0.1965784 0.4490896 0.088861 0.4621218 0.1721138 0.4366896 0.2951927 0.4604052 0.4044192 0.4598968 0.2968441 0.4826639 0.7911346 0.6510873 0.8970783 0.6760873 0.7891055 0.6769011 0.8255198 0.5524107 0.9099247 0.5699479 0.8007048 0.5698587 0.4061341 0.5935314 0.2971453 0.6110685 0.2969919 0.5885224 0.1983375 0.5720711 0.0889839 0.5735292 0.1738198 0.5571273 0.4118434 0.7078972 0.328458 0.7283074 0.3029652 0.7012565 0.8960079 0.8236066 0.8497266 0.847108 0.8489906 0.8228252 0.6999335 0.8005208 0.7283241 0.7739584 0.7758495 0.8 0.3286476 0.7739584 0.4008183 0.8011692 0.3154399 0.8006484 0.2663201 0.8246979 0.2957446 0.8491626 0.2123502 0.8311314 0.2846667 0.9930043 0.2644788 0.9868957 0.2927853 0.9849972 0.4711672 0.9718304 0.4318796 0.9850252 0.4264298 0.9744198 0.3787494 0.9700955 0.3376303 0.9740941 0.356472 0.9636458 0.3374932 0.9244016 0.3022949 0.9154527 0.3486292 0.912644 0.07251194 0.9238788 0.05263741 0.9118034 0.07709147 0.911737 0.1252978 0.8832277 0.1502665 0.8998931 0.1130166 0.8997122 0.2239644 0.9840242 0.1988009 0.9862214 0.1987101 0.9806196 0.1697593 0.9619867 0.1532008 0.9575327 0.1756476 0.9560761 0.1238035 0.9575327 0.112717 0.9620298 0.1087664 0.9561192 0.6492077 0.8815157 0.698262 0.8953179 0.6620049 0.8990262 0.7055472 0.9263844 0.6508714 0.9156432 0.6631187 0.9125807 0.6874527 0.950933 0.5624842 0.9777989 0.5091169 0.9770916 0.4973464 0.9540049 0.5348811 0.9369009 0.6519414 0.93714 0.4996739 0.4817757 0.489573 0.4168541 0.6281437 0.3780788 0.8554634 0.3781576 0.8574523 0.4157878 0.6449355 0.4817756 0.790683 0.1372293 0.8576647 0.1319295 0.9089143 0.15625 0.9565153 0.21875 0.8750244 0.2148437 0.7763395 0.1654565 0.7837784 0.07814125 0.8513354 0.1093804 0.7348347 0.1202651 0.739714 0.08701817 0.3258767 0.06704861 0.4207925 0.06357019 0.4902932 0.0720675 0.4975915 0.09988324 0.422429 0.1074221 0.3258767 0.08146919 0.3742404 0.002192018 0.4580801 0.006576053 0.5091169 0.02290838 0.498611 0.04480644 0.4356274 0.04056291 0.3719984 0.01541554 0.1662959 0.03459093 0.2174969 0.03288882 0.2636415 0.03971712 0.2681944 0.055102 0.220408 0.055102 0.1662959 0.04144241 0.15625 0.01400193 0.21875 0.00624472 0.2452697 0.008745681 0.2483407 0.02136859 0.215855 0.0256003 0.1610047 0.02005209 0.09623612 0.02790763 0.115412 0.0212229 0.1346035 0.02297057 0.1402702 0.03055004 0.1254523 0.03459093 0.101317 0.03323176 0.1402702 0.04144241 0.134781 0.055102 0.1107867 0.055102 0.09364159 0.04021414 0.1605297 0.06704861 0.220408 0.06704861 0.2681944 0.08146919 0.2492236 0.1080339 0.1943723 0.1080339 0.1506487 0.08146919 0.5624842 0.02220105 0.6874527 0.04906702 0.6519414 0.06286003 0.5361458 0.06129858 0.6774535 0.1372293 0.5679498 0.1319295 0.5956123 0.1074262 0.7062639 0.08070306 0.008254394 0.21875 0.01658551 0.15625 0.07102735 0.1319271 0.1626591 0.1307031 0.1953956 0.147526 0.1052143 0.2009896 0.9845138 0.28125 0.9929097 0.34375 0.6266899 0.3388471 0.844833 0.2851562 0.2008983 0.25 0.418788 0.2456511 0.5067322 0.2681771 0.4884561 0.3259109 0.3451526 0.3381561 0.1480019 0.2851562 0 0.4392658 2.39492e-4 0.3964219 0.08585563 0.3706429 0.2895935 0.3709491 0.2891928 0.4041381 0.08524474 0.4409451 0.8164847 0.7500001 0.6175247 0.7543489 0.5067322 0.7318229 0.4980836 0.6788933 0.6363174 0.6665691 0.8448329 0.7148438 0.8554623 0.6284635 0.6377743 0.6342643 0.4992719 0.6145183 0.4997041 0.5675513 0.6449282 0.5586116 0.8574397 0.5989388 0 0.5372968 0 0.5332656 0.08520995 0.52868 0.2990319 0.5277596 0.2990602 0.542331 0.08524383 0.5465419 0.003146458 0.71875 0.001261701 0.65625 0.1412692 0.6285425 0.3595051 0.6342643 0.359676 0.666569 0.1480019 0.7148438 0.6774535 0.8627707 0.5704033 0.8672733 0.4752041 0.8384341 0.485716 0.7882813 0.5970362 0.7882813 0.6984699 0.8345435 0.1696743 0.870382 0.07102736 0.8680729 0.01658551 0.84375 0.008254394 0.78125 0.1052143 0.7990104 0.2048587 0.8535591 0.2616679 0.9565452 0.267513 0.9409928 0.2999349 0.9331217 0.3918202 0.9346293 0.3993319 0.9499535 0.3040495 0.962531 0.2939295 0.870382 0.404891 0.8672755 0.4976371 0.8917805 0.4890286 0.9201228 0.4187218 0.9199027 0.3173897 0.8936632 0.2610945 0.9005903 0.267513 0.9250163 0.2360286 0.9331217 0.174985 0.9336379 0.1533222 0.9192173 0.2013875 0.8936632 0.1346035 0.9770294 0.1371398 0.9699798 0.1513836 0.9662448 0.2004452 0.9666619 0.2126575 0.9739504 0.1610047 0.9799479 0.2142994 0.9592217 0.164224 0.9458905 0.07724542 0.9609375 0.05843994 0.9453125 0.06301603 0.9340364 0.09937777 0.9336379 0.1122363 0.9458904 0.09364159 0.9597859 0.115412 0.9787771 0.09623612 0.9720924 0.101317 0.9667683 0.1235458 0.9662449 0.8513354 0.8906196 0.7837784 0.9218587 0.739714 0.9129818 0.7348347 0.8797349 0.7906831 0.8627707 0.8576646 0.8680705 0.5727998 0.8987055 0.6772017 0.9267607 0.9999716 0.5078125 0.999915 0.5234375 0.9144021 0.5381771 0.7005606 0.5364175 0.7005707 0.5083772 0.9144585 0.4949349 0.9978306 0.40625 0.9992769 0.46875 0.485716 0.2117188 0.4727506 0.1607687 0.6984699 0.1654565 0.5970362 0.2117188 0.8164847 0.25 0.6175247 0.2456511 0.3747298 0.1319273 0.26043 0.1307031 0.2705801 0.001774586 0.3117404 5.91529e-4 0.3269463 0.01229471 0.2911066 0.02553563 0.306023 0.03671365 0.4030445 0.04885787 0.09792818 0.06704861 0.06301603 0.06596354 0.05843994 0.0546875 0.07724542 0.0390625 0.0278226 0.109375 0.04196566 0.078125 0.1115417 0.08146919 0.06567319 0.1080339 0.6772018 0.0732393 0.5703464 0.09988521 0.7499527 0.06250542 0.7499842 0.06251625 0.1782859 0.2136198 0.3781144 0.1607684 0.001261701 0.34375 0.003146458 0.28125 0 0.5234375 0 0.5078125 0.1406306 0.4960799 0.3544179 0.5075382 0.3445127 0.4231171 0.1406305 0.4765804 0 0.4901719 0 0.4705158 0.9929097 0.65625 0.9845138 0.71875 0.9991919 0.5546875 0.9978024 0.6015625 0.140856 0.5998324 0.3544767 0.5597322 2.39492e-4 0.6035781 0 0.5607343 0.418788 0.7543489 0.2008983 0.7500001 0.9565153 0.78125 0.9089143 0.84375 0.7763395 0.8345435 0.8750244 0.7851563 0.3830158 0.8384343 0.1782859 0.7863802 0.3117404 0.9994085 0.2705801 0.9982255 0.2452697 0.9912543 0.2463672 0.9781821 0.289133 0.9740151 0.3269463 0.9877053 0.4580801 0.9934239 0.3742404 0.997808 0.3719984 0.9845845 0.4343628 0.9582485 0.04196566 0.921875 0.0278226 0.890625 0.06567319 0.8919662 0.1129913 0.9192173 0.21875 0.9937552 0.15625 0.985998 0.1371398 0.9623759 0.1362306 0.9493541 0.7062639 0.9192969 0.5980659 0.8917765 0.7499842 0.9374837 0.7499527 0.9374946</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape8-map1-array" count="957" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape8-textangents">
+ <float_array id="qt_gauge_background_Shape8-textangents-array" count="10656">-0.03300889 0 -0.999455 0.1566596 0 -0.9876525 0.1100638 0 -0.9939244 0.2074768 0 -0.97824 0.2074768 0 -0.97824 0.1100638 0 -0.9939244 0.04321438 0 -0.9990658 0.1012179 0 -0.9948642 0.1100638 0 -0.9939244 0.04463048 0 -0.9990036 0.01993182 0 -0.9998013 0.04321438 0 -0.9990658 0.1566596 0 -0.9876525 0.0598864 0 -0.9982052 0.04463048 0 -0.9990036 0.1100638 0 -0.9939244 -0.137555 0 -0.9904941 0.0026872 0 -0.9999964 -0.007948059 0 -0.9999684 -0.06128643 0 -0.9981202 -0.06128643 0 -0.9981202 -0.007948059 0 -0.9999684 -0.004463417 0 -0.99999 -0.02545355 0 -0.999676 -0.007948059 0 -0.9999684 0.04321438 0 -0.9990658 0.01993182 0 -0.9998013 -0.004463417 0 -0.99999 0.0026872 0 -0.9999964 0.1012179 0 -0.9948642 0.04321438 0 -0.9990658 -0.007948059 0 -0.9999684 0 0 -0.9999999 -0.005933172 0 -0.9999823 0.0116251 0 -0.9999324 0.01251858 0 -0.9999216 0.01251858 0 -0.9999216 0.0116251 0 -0.9999324 0.04463048 0 -0.9990036 0.0598864 0 -0.9982052 0.0116251 0 -0.9999324 -0.004463417 0 -0.99999 0.01993182 0 -0.9998013 0.04463048 0 -0.9990036 -0.005933172 0 -0.9999823 -0.02545355 0 -0.999676 -0.004463417 0 -0.99999 0.0116251 0 -0.9999324 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0.02062489 0 -0.9997872 0.02240226 0 -0.9997491 0.02240226 0 -0.9997491 0.02062489 0 -0.9997872 0.1001091 0 -0.9949765 0.106852 0 -0.994275 0.02062489 0 -0.9997872 0.01202841 0 -0.9999276 0.05705278 0 -0.9983711 0.1001091 0 -0.9949765 0 0 -0.9999999 0 0 -0.9999999 0.01202841 0 -0.9999276 0.02062489 0 -0.9997872 0.4388028 0 -0.8985835 0.3018684 0 -0.9533496 0.2188657 0 -0.9757549 0.2055 0 -0.9786572 0.2055 0 -0.9786572 0.2188657 0 -0.9757549 0.09203729 0 -0.9957556 0.08108163 0 -0.9967074 0.2188657 0 -0.9757549 0.1001091 0 -0.9949765 0.05705278 0 -0.9983711 0.09203729 0 -0.9957556 0.3018684 0 -0.9533496 0.106852 0 -0.994275 0.1001091 0 -0.9949765 0.2188657 0 -0.9757549 0 0 -0.9999999 0.01377612 0 -0.9999051 0.02050063 0 -0.9997898 0 0 -0.9999999 0 0 -0.9999999 0.02050063 0 -0.9997898 0.01202841 0 -0.9999276 0 0 -0.9999999 0.02050063 0 -0.9997898 0.09203729 0 -0.9957556 0.05705278 0 -0.9983711 0.01202841 0 -0.9999276 0.01377612 0 -0.9999051 0.08108163 0 -0.9967074 0.09203729 0 -0.9957556 0.02050063 0 -0.9997898 0.2869743 0 -0.9579383 -0.003969428 0 -0.9999921 -0.00686748 0 -0.9999764 -0.04707965 0 -0.9988911 -0.04707965 0 -0.9988911 -0.00686748 0 -0.9999764 0.09087195 0 -0.9958625 0.06937449 0 -0.9975905 -0.00686748 0 -0.9999764 -0.005523513 0 -0.9999847 0.06190058 0 -0.9980823 0.09087195 0 -0.9958625 -0.003969428 0 -0.9999921 0.006580285 0 -0.9999784 -0.005523513 0 -0.9999847 -0.00686748 0 -0.9999764 0.4388028 0 -0.8985835 0.299556 0 -0.9540787 0.1726539 0 -0.9849826 0.3018684 0 -0.9533496 0.3018684 0 -0.9533496 0.1726539 0 -0.9849826 0.08112293 0 -0.9967041 0.106852 0 -0.994275 0.1726539 0 -0.9849826 0.09087195 0 -0.9958625 0.06190058 0 -0.9980823 0.08112293 0 -0.9967041 0.299556 0 -0.9540787 0.06937449 0 -0.9975905 0.09087195 0 -0.9958625 0.1726539 0 -0.9849826 0 0 -0.9999999 0.02240226 0 -0.9997491 0.0129636 0 -0.9999159 -1.67112e-4 0 -0.9999999 -1.67112e-4 0 -0.9999999 0.0129636 0 -0.9999159 -0.005523513 0 -0.9999847 0.006580285 0 -0.9999784 0.0129636 0 -0.9999159 0.08112293 0 -0.9967041 0.06190058 0 -0.9980823 -0.005523513 0 -0.9999847 0.02240226 0 -0.9997491 0.106852 0 -0.994275 0.08112293 0 -0.9967041 0.0129636 0 -0.9999159 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0.01068715 0 -0.9999429 -0.01312428 0 -0.9999139 -0.00153169 0 -0.9999989 -0.02620612 0 -0.9996566 -0.02620612 0 -0.9996566 -0.00153169 0 -0.9999989 0.05507139 0 -0.9984823 0.05229799 0 -0.9986315 -0.00153169 0 -0.9999989 8.58221e-4 0 -0.9999995 0.03773666 0 -0.9992877 0.05507139 0 -0.9984823 -0.01312428 0 -0.9999139 -0.005606961 0 -0.9999841 8.58221e-4 0 -0.9999995 -0.00153169 0 -0.9999989 0.1375555 0 -0.990494 0.153814 0 -0.9880998 0.118804 0 -0.9929177 0.06181691 0 -0.9980875 0.06181691 0 -0.9980875 0.118804 0 -0.9929177 0.05308972 0 -0.9985898 0.02946506 0 -0.9995658 0.118804 0 -0.9929177 0.05507139 0 -0.9984823 0.03773666 0 -0.9992877 0.05308972 0 -0.9985898 0.153814 0 -0.9880998 0.05229799 0 -0.9986315 0.05507139 0 -0.9984823 0.118804 0 -0.9929177 0 0 -0.9999999 0.006836796 0 -0.9999765 0.01191628 0 -0.999929 -0.001368713 0 -0.9999989 -0.001368713 0 -0.9999989 0.01191628 0 -0.999929 8.58221e-4 0 -0.9999995 -0.005606961 0 -0.9999841 0.01191628 0 -0.999929 0.05308972 0 -0.9985898 0.03773666 0 -0.9992877 8.58221e-4 0 -0.9999995 0.006836796 0 -0.9999765 0.02946506 0 -0.9995658 0.05308972 0 -0.9985898 0.01191628 0 -0.999929 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0.008961941 0 -0.9999599 0.01081525 0 -0.9999413 0.0102535 0 -0.9999473 0.01715032 0 -0.9998528 0.01715032 0 -0.9998528 0.0102535 0 -0.9999473 0.01490611 0 -0.9998888 0.0215912 0 -0.9997668 0.0102535 0 -0.9999473 0.004437672 0 -0.99999 0.008491981 0 -0.9999639 0.01490611 0 -0.9998888 0.01081525 0 -0.9999413 0.003714162 0 -0.999993 0.004437672 0 -0.99999 0.0102535 0 -0.9999473 -0.05677116 0 -0.9983872 0.02041542 0 -0.9997916 0.006577499 0 -0.9999782 -0.01449831 0 -0.9998949 -0.01449831 0 -0.9998949 0.006577499 0 -0.9999782 0.003781524 0 -0.9999928 -0.004984302 0 -0.9999874 0.006577499 0 -0.9999782 0.01490611 0 -0.9998888 0.008491981 0 -0.9999639 0.003781524 0 -0.9999928 0.02041542 0 -0.9997916 0.0215912 0 -0.9997668 0.01490611 0 -0.9998888 0.006577499 0 -0.9999782 0 0 -0.9999999 -0.002292145 0 -0.9999973 0.003229072 0 -0.9999946 7.74189e-4 0 -0.9999996 7.74189e-4 0 -0.9999996 0.003229072 0 -0.9999946 0.004437672 0 -0.99999 0.003714162 0 -0.999993 0.003229072 0 -0.9999946 0.003781524 0 -0.9999928 0.008491981 0 -0.9999639 0.004437672 0 -0.99999 -0.002292145 0 -0.9999973 -0.004984302 0 -0.9999874 0.003781524 0 -0.9999928 0.003229072 0 -0.9999946 -0.2206403 0 -0.9753553 -0.2055971 0 -0.9786366 -0.1485433 0 -0.9889058 -0.2465911 0 -0.9691197 -0.2465911 0 -0.9691197 -0.1485433 0 -0.9889058 -0.07679654 0 -0.9970468 -0.1019867 0 -0.9947858 -0.1485433 0 -0.9889058 -0.07174362 0 -0.9974231 -0.03170648 0 -0.9994972 -0.07679654 0 -0.9970468 -0.2055971 0 -0.9786366 -0.08979937 0 -0.9959598 -0.07174362 0 -0.9974231 -0.1485433 0 -0.9889058 0.008961941 0 -0.9999599 -0.018658 0 -0.9998259 -0.02716934 0 -0.9996309 -6.54515e-4 0 -0.9999997 -6.54515e-4 0 -0.9999997 -0.02716934 0 -0.9996309 -0.008404196 0 -0.9999646 0 0 -1 -0.02716934 0 -0.9996309 -0.07679654 0 -0.9970468 -0.03170648 0 -0.9994972 -0.008404196 0 -0.9999646 -0.018658 0 -0.9998259 -0.1019867 0 -0.9947858 -0.07679654 0 -0.9970468 -0.02716934 0 -0.9996309 0 0 -0.9999999 2.02364e-4 0 -0.9999999 -0.01834512 0 -0.9998317 -0.01893349 0 -0.9998208 -0.01893349 0 -0.9998208 -0.01834512 0 -0.9998317 -0.07174362 0 -0.9974231 -0.08979937 0 -0.9959598 -0.01834512 0 -0.9998317 -0.008404196 0 -0.9999646 -0.03170648 0 -0.9994972 -0.07174362 0 -0.9974231 2.02364e-4 0 -0.9999999 0 0 -1 -0.008404196 0 -0.9999646 -0.01834512 0 -0.9998317 -0.2206403 0 -0.9753553 -0.08976096 0 -0.9959633 -0.1030236 0 -0.9946789 -0.2055971 0 -0.9786366 -0.2055971 0 -0.9786366 -0.1030236 0 -0.9946789 -0.06172056 0 -0.9980935 -0.08979937 0 -0.9959598 -0.1030236 0 -0.9946789 -0.05427295 0 -0.998526 -0.04839909 0 -0.9988281 -0.06172056 0 -0.9980935 -0.08976096 0 -0.9959633 -0.03069693 0 -0.9995288 -0.05427295 0 -0.998526 -0.1030236 0 -0.9946789 0 0 -0.9999999 -0.01893349 0 -0.9998208 -0.01219007 0 -0.9999256 0 0 -0.9999999 0 0 -0.9999999 -0.01219007 0 -0.9999256 -0.01078015 0 -0.9999418 0 0 -0.9999999 -0.01219007 0 -0.9999256 -0.06172056 0 -0.9980935 -0.04839909 0 -0.9988281 -0.01078015 0 -0.9999418 -0.01893349 0 -0.9998208 -0.08979937 0 -0.9959598 -0.06172056 0 -0.9980935 -0.01219007 0 -0.9999256 0 0 -0.9999999 0 0 -0.9999999 -0.01258682 0 -0.9999207 -0.004965191 0 -0.9999876 -0.004965191 0 -0.9999876 -0.01258682 0 -0.9999207 -0.05427295 0 -0.998526 -0.03069693 0 -0.9995288 -0.01258682 0 -0.9999207 -0.01078015 0 -0.9999418 -0.04839909 0 -0.9988281 -0.05427295 0 -0.998526 0 0 -0.9999999 0 0 -0.9999999 -0.01078015 0 -0.9999418 -0.01258682 0 -0.9999207 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0.1375555 0 -0.990494 0.06181691 0 -0.9980875 0.008843317 0 -0.9999608 -0.002688478 0 -0.9999964 -0.002688478 0 -0.9999964 0.008843317 0 -0.9999608 -0.04307069 0 -0.9990721 -0.101218 0 -0.9948642 0.008843317 0 -0.9999608 0.007722562 0 -0.9999701 -0.01903455 0 -0.9998188 -0.04307069 0 -0.9990721 0.06181691 0 -0.9980875 0.02946506 0 -0.9995658 0.007722562 0 -0.9999701 0.008843317 0 -0.9999608 0.03300812 0 -0.999455 -0.2074764 0 -0.9782398 -0.1099939 0 -0.9939321 -0.1568487 0 -0.9876225 -0.1568487 0 -0.9876225 -0.1099939 0 -0.9939321 -0.04238427 0 -0.9991015 -0.06038843 0 -0.998175 -0.1099939 0 -0.9939321 -0.04307069 0 -0.9990721 -0.01903455 0 -0.9998188 -0.04238427 0 -0.9991015 -0.2074764 0 -0.9782398 -0.101218 0 -0.9948642 -0.04307069 0 -0.9990721 -0.1099939 0 -0.9939321 0 0 -0.9999999 -0.01263022 0 -0.9999201 -0.01035091 0 -0.9999464 0.006836796 0 -0.9999765 0.006836796 0 -0.9999765 -0.01035091 0 -0.9999464 0.007722562 0 -0.9999701 0.02946506 0 -0.9995658 -0.01035091 0 -0.9999464 -0.04238427 0 -0.9991015 -0.01903455 0 -0.9998188 0.007722562 0 -0.9999701 -0.01263022 0 -0.9999201 -0.06038843 0 -0.998175 -0.04238427 0 -0.9991015 -0.01035091 0 -0.9999464 0.2869743 0 -0.9579383 0.1563693 0 -0.9876985 0.0375399 0 -0.9992951 -0.003969428 0 -0.9999921 -0.003969428 0 -0.9999921 0.0375399 0 -0.9992951 0.01346795 0 -0.9999092 0.006580285 0 -0.9999784 0.0375399 0 -0.9992951 0.01653138 0 -0.9998633 0.0037424 0 -0.999993 0.01346795 0 -0.9999092 0.1563693 0 -0.9876985 0.06172335 0 -0.9980933 0.01653138 0 -0.9998633 0.0375399 0 -0.9992951 0 0 -0.9999999 -1.67112e-4 0 -0.9999999 0.003780008 0 -0.9999927 0 0 -0.9999999 0 0 -0.9999999 0.003780008 0 -0.9999927 -0.001059579 0 -0.9999993 0 0 -0.9999999 0.003780008 0 -0.9999927 0.01346795 0 -0.9999092 0.0037424 0 -0.999993 -0.001059579 0 -0.9999993 -1.67112e-4 0 -0.9999999 0.006580285 0 -0.9999784 0.01346795 0 -0.9999092 0.003780008 0 -0.9999927 0 0 -0.9999999 0 0 -0.9999999 0.004530579 0 -0.9999896 0.009919995 0 -0.9999508 0.009919995 0 -0.9999508 0.004530579 0 -0.9999896 0.01653138 0 -0.9998633 0.06172335 0 -0.9980933 0.004530579 0 -0.9999896 -0.001059579 0 -0.9999993 0.0037424 0 -0.999993 0.01653138 0 -0.9998633 0 0 -0.9999999 0 0 -0.9999999 -0.001059579 0 -0.9999993 0.004530579 0 -0.9999896 0 0 -1 0 0 -0.9999999 -0.02067078 0 -0.9997864 -0.01220641 0 -0.9999254 -0.01220641 0 -0.9999254 -0.02067078 0 -0.9997864 -0.06472033 0 -0.9979034 -0.05836279 0 -0.9982953 -0.02067078 0 -0.9997864 -0.01287676 0 -0.9999171 -0.04976799 0 -0.9987608 -0.06472033 0 -0.9979034 0 0 -0.9999999 0 0 -0.9999999 -0.01287676 0 -0.9999171 -0.02067078 0 -0.9997864 -0.2134779 0 -0.9769479 -0.1270905 0 -0.9918911 -0.1427068 0 -0.989765 -0.1888928 0 -0.9819978 -0.1888928 0 -0.9819978 -0.1427068 0 -0.989765 -0.06546752 0 -0.9978547 -0.0807729 0 -0.9967325 -0.1427068 0 -0.989765 -0.06472033 0 -0.9979034 -0.04976799 0 -0.9987608 -0.06546752 0 -0.9978547 -0.1270905 0 -0.9918911 -0.05836279 0 -0.9982953 -0.06472033 0 -0.9979034 -0.1427068 0 -0.989765 0 0 -0.9999999 -0.01930129 0 -0.9998137 -0.0169566 0 -0.9998561 0 0 -0.9999999 0 0 -0.9999999 -0.0169566 0 -0.9998561 -0.01287676 0 -0.9999171 0 0 -0.9999999 -0.0169566 0 -0.9998561 -0.06546752 0 -0.9978547 -0.04976799 0 -0.9987608 -0.01287676 0 -0.9999171 -0.01930129 0 -0.9998137 -0.0807729 0 -0.9967325 -0.06546752 0 -0.9978547 -0.0169566 0 -0.9998561 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0.1692145 0 -0.9855793 0.06536287 0 -0.9978614 0.01670527 0 -0.9998605 0.02461369 0 -0.9996969 0.02461369 0 -0.9996969 0.01670527 0 -0.9998605 0.02325688 0 -0.9997295 0.01978211 0 -0.9998041 0.01670527 0 -0.9998605 0.01005983 0 -0.9999494 0.01518861 0 -0.9998847 0.02325688 0 -0.9997295 0.06536287 0 -0.9978614 0.02038898 0 -0.9997922 0.01005983 0 -0.9999494 0.01670527 0 -0.9998605 0.09499485 0 -0.9954777 0.04739358 0 -0.9988763 0.05539263 0 -0.9984646 0.06690167 0 -0.9977595 0.06690167 0 -0.9977595 0.05539263 0 -0.9984646 0.01942818 0 -0.9998113 0.01943092 0 -0.9998111 0.05539263 0 -0.9984646 0.02325688 0 -0.9997295 0.01518861 0 -0.9998847 0.01942818 0 -0.9998113 0.04739358 0 -0.9988763 0.01978211 0 -0.9998041 0.02325688 0 -0.9997295 0.05539263 0 -0.9984646 0 0 -0.9999999 0.003635404 0 -0.9999932 0.006642811 0 -0.9999778 0.003976186 0 -0.9999919 0.003976186 0 -0.9999919 0.006642811 0 -0.9999778 0.01005983 0 -0.9999494 0.02038898 0 -0.9997922 0.006642811 0 -0.9999778 0.01942818 0 -0.9998113 0.01518861 0 -0.9998847 0.01005983 0 -0.9999494 0.003635404 0 -0.9999932 0.01943092 0 -0.9998111 0.01942818 0 -0.9998113 0.006642811 0 -0.9999778 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0.04036171 0 -0.9991851 0.0180628 0 -0.9998369 0.02051667 0 -0.9997894 0.03582906 0 -0.999358 0.03582906 0 -0.999358 0.02051667 0 -0.9997894 0.012267 0 -0.9999246 0.01566684 0 -0.9998772 0.02051667 0 -0.9997894 0.01098862 0 -0.9999394 0.006419408 0 -0.9999794 0.012267 0 -0.9999246 0.0180628 0 -0.9998369 0.009277752 0 -0.9999569 0.01098862 0 -0.9999394 0.02051667 0 -0.9997894 0 0 -0.9999999 0.003833624 0 -0.9999924 0.00283488 0 -0.9999958 0 0 -0.9999999 0 0 -0.9999999 0.00283488 0 -0.9999958 0.001571624 0 -0.9999987 0 0 -0.9999999 0.00283488 0 -0.9999958 0.012267 0 -0.9999246 0.006419408 0 -0.9999794 0.001571624 0 -0.9999987 0.003833624 0 -0.9999924 0.01566684 0 -0.9998772 0.012267 0 -0.9999246 0.00283488 0 -0.9999958 0 0 -0.9999999 0 0 -0.9999999 0.002690396 0 -0.9999963 0.002147154 0 -0.9999976 0.002147154 0 -0.9999976 0.002690396 0 -0.9999963 0.01098862 0 -0.9999394 0.009277752 0 -0.9999569 0.002690396 0 -0.9999963 0.001571624 0 -0.9999987 0.006419408 0 -0.9999794 0.01098862 0 -0.9999394 0 0 -0.9999999 0 0 -0.9999999 0.001571624 0 -0.9999987 0.002690396 0 -0.9999963 -0.3696702 0 -0.929163 -0.1933342 0 -0.9811329 -0.06443446 0 -0.9979219 -0.2437487 0 -0.9698383 -0.2437487 0 -0.9698383 -0.06443446 0 -0.9979219 -0.01966404 0 -0.9998065 -0.006253263 0 -0.9999804 -0.06443446 0 -0.9979219 -0.03384809 0 -0.999427 -0.01530015 0 -0.999883 -0.01966404 0 -0.9998065 -0.1933342 0 -0.9811329 -0.03614369 0 -0.9993466 -0.03384809 0 -0.999427 -0.06443446 0 -0.9979219 0.06203055 0 -0.9980742 0.03084339 0 -0.9995242 0.03376238 0 -0.9994298 0.03887312 0 -0.9992441 0.03887312 0 -0.9992441 0.03376238 0 -0.9994298 0.00925795 0 -0.999957 0.01051862 0 -0.9999446 0.03376238 0 -0.9994298 -0.01966404 0 -0.9998065 -0.01530015 0 -0.999883 0.00925795 0 -0.999957 0.03084339 0 -0.9995242 -0.006253263 0 -0.9999804 -0.01966404 0 -0.9998065 0.03376238 0 -0.9994298 0 0 -0.9999999 0.002018874 0 -0.9999979 -0.003955443 0 -0.999992 -0.00637432 0 -0.9999796 -0.00637432 0 -0.9999796 -0.003955443 0 -0.999992 -0.03384809 0 -0.999427 -0.03614369 0 -0.9993466 -0.003955443 0 -0.999992 0.00925795 0 -0.999957 -0.01530015 0 -0.999883 -0.03384809 0 -0.999427 0.002018874 0 -0.9999979 0.01051862 0 -0.9999446 0.00925795 0 -0.999957 -0.003955443 0 -0.999992 0 0 -1 0 0 -0.9999999 -0.006170694 0 -0.9999808 -0.003441829 0 -0.9999939 -0.003441829 0 -0.9999939 -0.006170694 0 -0.9999808 -0.02070516 0 -0.9997855 -0.01671066 0 -0.9998602 -0.006170694 0 -0.9999808 -0.002363166 0 -0.999997 -0.01207392 0 -0.999927 -0.02070516 0 -0.9997855 0 0 -0.9999999 0 0 -0.9999999 -0.002363166 0 -0.999997 -0.006170694 0 -0.9999808 -0.04938016 0 -0.99878 -0.03517974 0 -0.9993809 -0.03719437 0 -0.999308 -0.04480134 0 -0.998996 -0.04480134 0 -0.998996 -0.03719437 0 -0.999308 -0.01657252 0 -0.9998626 -0.01961608 0 -0.9998075 -0.03719437 0 -0.999308 -0.02070516 0 -0.9997855 -0.01207392 0 -0.999927 -0.01657252 0 -0.9998626 -0.03517974 0 -0.9993809 -0.01671066 0 -0.9998602 -0.02070516 0 -0.9997855 -0.03719437 0 -0.999308 0 0 -0.9999999 -0.004794565 0 -0.9999883 -0.00415193 0 -0.9999912 0 0 -0.9999999 0 0 -0.9999999 -0.00415193 0 -0.9999912 -0.002363166 0 -0.999997 0 0 -0.9999999 -0.00415193 0 -0.9999912 -0.01657252 0 -0.9998626 -0.01207392 0 -0.999927 -0.002363166 0 -0.999997 -0.004794565 0 -0.9999883 -0.01961608 0 -0.9998075 -0.01657252 0 -0.9998626 -0.00415193 0 -0.9999912 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0.01584739 0 -0.9998744 0.01491308 0 -0.9998888 0.01491308 0 -0.9998888 0.01584739 0 -0.9998744 0.06360596 0 -0.9979751 0.07711183 0 -0.9970224 0.01584739 0 -0.9998744 0.01253722 0 -0.9999214 0.04901764 0 -0.9987979 0.06360596 0 -0.9979751 0 0 -0.9999999 0 0 -0.9999999 0.01253722 0 -0.9999214 0.01584739 0 -0.9998744 0.2134765 0 -0.9769482 0.1870674 0 -0.9823469 0.141984 0 -0.989869 0.1270881 0 -0.9918914 0.1270881 0 -0.9918914 0.141984 0 -0.989869 0.06449342 0 -0.9979181 0.05836246 0 -0.9982954 0.141984 0 -0.989869 0.06360596 0 -0.9979751 0.04901764 0 -0.9987979 0.06449342 0 -0.9979181 0.1870674 0 -0.9823469 0.07711183 0 -0.9970224 0.06360596 0 -0.9979751 0.141984 0 -0.989869 0 0 -1 0.01220741 0 -0.9999254 0.02060983 0 -0.9997876 0 0 -0.9999999 0 0 -0.9999999 0.02060983 0 -0.9997876 0.01253722 0 -0.9999214 0 0 -0.9999999 0.02060983 0 -0.9997876 0.06449342 0 -0.9979181 0.04901764 0 -0.9987979 0.01253722 0 -0.9999214 0.01220741 0 -0.9999254 0.05836246 0 -0.9982954 0.06449342 0 -0.9979181 0.02060983 0 -0.9997876 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.008964197 0 -0.9999598 -0.01084073 0 -0.9999412 -0.005197713 0 -0.9999863 5.95963e-4 0 -0.9999997 5.95963e-4 0 -0.9999997 -0.005197713 0 -0.9999863 -0.001535348 0 -0.9999987 3.0303e-4 0 -0.9999999 -0.005197713 0 -0.9999863 -0.002124394 0 -0.9999976 -9.68794e-4 0 -0.9999995 -0.001535348 0 -0.9999987 -0.01084073 0 -0.9999412 -0.003712646 0 -0.999993 -0.002124394 0 -0.9999976 -0.005197713 0 -0.9999863 0 0 -0.9999999 2.02813e-4 0 -0.9999999 -4.33371e-4 0 -0.9999998 0 0 -0.9999999 0 0 -0.9999999 -4.33371e-4 0 -0.9999998 0 0 -0.9999999 0 0 -0.9999999 -4.33371e-4 0 -0.9999998 -0.001535348 0 -0.9999987 -9.68794e-4 0 -0.9999995 0 0 -0.9999999 2.02813e-4 0 -0.9999999 3.0303e-4 0 -0.9999999 -0.001535348 0 -0.9999987 -4.33371e-4 0 -0.9999998 0 0 -0.9999999 0 0 -0.9999999 -3.83113e-4 0 -0.9999998 -7.74605e-4 0 -0.9999996 -7.74605e-4 0 -0.9999996 -3.83113e-4 0 -0.9999998 -0.002124394 0 -0.9999976 -0.003712646 0 -0.999993 -3.83113e-4 0 -0.9999998 0 0 -0.9999999 -9.68794e-4 0 -0.9999995 -0.002124394 0 -0.9999976 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -3.83113e-4 0 -0.9999998 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0.220637 0 -0.975356 0.09061752 0 -0.9958858 0.03914497 0 -0.9992335 0.03081014 0 -0.9995253 0.03081014 0 -0.9995253 0.03914497 0 -0.9992335 0.1080323 0 -0.9941474 0.09450687 0 -0.9955242 0.03914497 0 -0.9992335 0.02527471 0 -0.9996805 0.07482792 0 -0.9971964 0.1080323 0 -0.9941474 0.09061752 0 -0.9958858 0.03271377 0 -0.9994648 0.02527471 0 -0.9996805 0.03914497 0 -0.9992335 0.4462471 0 -0.8949099 0.3042567 0 -0.95259 0.1720852 0 -0.985082 0.3030522 0 -0.9529738 0.3030522 0 -0.9529738 0.1720852 0 -0.985082 0.08472504 0 -0.9964043 0.1048799 0 -0.9944848 0.1720852 0 -0.985082 0.1080323 0 -0.9941474 0.07482792 0 -0.9971964 0.08472504 0 -0.9964043 0.3042567 0 -0.95259 0.09450687 0 -0.9955242 0.1080323 0 -0.9941474 0.1720852 0 -0.985082 0 0 -0.9999999 0.01934073 0 -0.999813 0.02247254 0 -0.9997475 0.005843969 0 -0.9999829 0.005843969 0 -0.9999829 0.02247254 0 -0.9997475 0.02527471 0 -0.9996805 0.03271377 0 -0.9994648 0.02247254 0 -0.9997475 0.08472504 0 -0.9964043 0.07482792 0 -0.9971964 0.02527471 0 -0.9996805 0.01934073 0 -0.999813 0.1048799 0 -0.9944848 0.08472504 0 -0.9964043 0.02247254 0 -0.9997475 -0.008964197 0 -0.9999598 5.95963e-4 0 -0.9999997 0.02335565 0 -0.9997271 0.01864992 0 -0.9998261 0.01864992 0 -0.9998261 0.02335565 0 -0.9997271 0.07749247 0 -0.9969929 0.1019792 0 -0.9947866 0.02335565 0 -0.9997271 0.007986272 0 -0.9999681 0.03227682 0 -0.9994789 0.07749247 0 -0.9969929 5.95963e-4 0 -0.9999997 3.0303e-4 0 -0.9999999 0.007986272 0 -0.9999681 0.02335565 0 -0.9997271 0.220637 0 -0.975356 0.2465889 0 -0.9691201 0.1504185 0 -0.9886224 0.1949454 0 -0.9808142 0.1949454 0 -0.9808142 0.1504185 0 -0.9886224 0.06936615 0 -0.9975912 0.09279028 0 -0.9956855 0.1504185 0 -0.9886224 0.07749247 0 -0.9969929 0.03227682 0 -0.9994789 0.06936615 0 -0.9975912 0.2465889 0 -0.9691201 0.1019792 0 -0.9947866 0.07749247 0 -0.9969929 0.1504185 0 -0.9886224 0 0 -0.9999999 0.02588515 0 -0.9996649 0.014585 0 -0.9998936 2.02813e-4 0 -0.9999999 2.02813e-4 0 -0.9999999 0.014585 0 -0.9998936 0.007986272 0 -0.9999681 3.0303e-4 0 -0.9999999 0.014585 0 -0.9998936 0.06936615 0 -0.9975912 0.03227682 0 -0.9994789 0.007986272 0 -0.9999681 0.02588515 0 -0.9996649 0.09279028 0 -0.9956855 0.06936615 0 -0.9975912 0.014585 0 -0.9998936 -0.4388025 0 -0.8985835 -0.3018685 0 -0.9533495 -0.1726526 0 -0.9849828 -0.2995549 0 -0.954079 -0.2995549 0 -0.954079 -0.1726526 0 -0.9849828 -0.09086902 0 -0.9958627 -0.06937334 0 -0.9975906 -0.1726526 0 -0.9849828 -0.08112384 0 -0.996704 -0.06189835 0 -0.9980825 -0.09086902 0 -0.9958627 -0.3018685 0 -0.9533495 -0.1068527 0 -0.9942749 -0.08112384 0 -0.996704 -0.1726526 0 -0.9849828 -0.2869729 0 -0.9579387 0.04707953 0 -0.9988911 0.006868587 0 -0.9999764 0.00396844 0 -0.9999921 0.00396844 0 -0.9999921 0.006868587 0 -0.9999764 0.005523195 0 -0.9999848 -0.006583545 0 -0.9999783 0.006868587 0 -0.9999764 -0.09086902 0 -0.9958627 -0.06189835 0 -0.9980825 0.005523195 0 -0.9999848 0.04707953 0 -0.9988911 -0.06937334 0 -0.9975906 -0.09086902 0 -0.9958627 0.006868587 0 -0.9999764 0 0 -0.9999999 1.66567e-4 0 -0.9999999 -0.01296236 0 -0.999916 -0.02240144 0 -0.9997491 -0.02240144 0 -0.9997491 -0.01296236 0 -0.999916 -0.08112384 0 -0.996704 -0.1068527 0 -0.9942749 -0.01296236 0 -0.999916 0.005523195 0 -0.9999848 -0.06189835 0 -0.9980825 -0.08112384 0 -0.996704 1.66567e-4 0 -0.9999999 -0.006583545 0 -0.9999783 0.005523195 0 -0.9999848 -0.01296236 0 -0.999916 -0.03300889 0 -0.999455 0.02237438 0 -0.9997496 0.06387185 0 -0.9979581 0.1566596 0 -0.9876525 0.1566596 0 -0.9876525 0.06387185 0 -0.9979581 0.04256669 0 -0.9990937 0.0598864 0 -0.9982052 0.06387185 0 -0.9979581 0.03285348 0 -0.9994602 0.02164816 0 -0.9997656 0.04256669 0 -0.9990937 0.02237438 0 -0.9997496 0.004027958 0 -0.999992 0.03285348 0 -0.9994602 0.06387185 0 -0.9979581 0 0 -0.9999999 0.01251858 0 -0.9999216 0.01176013 0 -0.9999308 0 0 -0.9999999 0 0 -0.9999999 0.01176013 0 -0.9999308 0.005384616 0 -0.9999854 0 0 -0.9999999 0.01176013 0 -0.9999308 0.04256669 0 -0.9990937 0.02164816 0 -0.9997656 0.005384616 0 -0.9999854 0.01251858 0 -0.9999216 0.0598864 0 -0.9982052 0.04256669 0 -0.9990937 0.01176013 0 -0.9999308 0 0 -0.9999999 0 0 -0.9999999 0.008389615 0 -0.9999647 0.002556024 0 -0.9999967 0.002556024 0 -0.9999967 0.008389615 0 -0.9999647 0.03285348 0 -0.9994602 0.004027958 0 -0.999992 0.008389615 0 -0.9999647 0.005384616 0 -0.9999854 0.02164816 0 -0.9997656 0.03285348 0 -0.9994602 0 0 -0.9999999 0 0 -0.9999999 0.005384616 0 -0.9999854 0.008389615 0 -0.9999647 -0.295599 0 -0.955312 -0.1801535 0 -0.9836385 -0.04901983 0 -0.9987978 -0.2078644 0 -0.9781577 -0.2078644 0 -0.9781577 -0.04901983 0 -0.9987978 0.02992528 0 -0.9995521 -0.01287782 0 -0.9999169 -0.04901983 0 -0.9987978 -0.02375646 0 -0.9997177 0.003766118 0 -0.9999928 0.02992528 0 -0.9995521 -0.1801535 0 -0.9836385 -0.04497956 0 -0.9989879 -0.02375646 0 -0.9997177 -0.04901983 0 -0.9987978 0.1590685 0 -0.9872675 0.08922833 0 -0.9960112 0.09376705 0 -0.9955941 0.1051462 0 -0.9944568 0.1051462 0 -0.9944568 0.09376705 0 -0.9955941 0.02890823 0 -0.9995821 0.02927994 0 -0.9995712 0.09376705 0 -0.9955941 0.02992528 0 -0.9995521 0.003766118 0 -0.9999928 0.02890823 0 -0.9995821 0.08922833 0 -0.9960112 -0.01287782 0 -0.9999169 0.02992528 0 -0.9995521 0.09376705 0 -0.9955941 0 0 -0.9999999 0.005349608 0 -0.9999856 -7.32082e-4 0 -0.9999996 -0.007689179 0 -0.9999703 -0.007689179 0 -0.9999703 -7.32082e-4 0 -0.9999996 -0.02375646 0 -0.9997177 -0.04497956 0 -0.9989879 -7.32082e-4 0 -0.9999996 0.02890823 0 -0.9995821 0.003766118 0 -0.9999928 -0.02375646 0 -0.9997177 0.005349608 0 -0.9999856 0.02927994 0 -0.9995712 0.02890823 0 -0.9995821 -7.32082e-4 0 -0.9999996 0 0 -0.9999999 -0.007689179 0 -0.9999703 -0.01191536 0 -0.9999289 0 0 -0.9999999 0 0 -0.9999999 -0.01191536 0 -0.9999289 -0.007412939 0 -0.9999724 0 0 -0.9999999 -0.01191536 0 -0.9999289 -0.04989531 0 -0.9987545 -0.03690038 0 -0.999319 -0.007412939 0 -0.9999724 -0.007689179 0 -0.9999703 -0.04497956 0 -0.9989879 -0.04989531 0 -0.9987545 -0.01191536 0 -0.9999289 0 0 -0.9999999 0 0 -0.9999999 -0.01762042 0 -0.9998447 -0.01025397 0 -0.9999473 -0.01025397 0 -0.9999473 -0.01762042 0 -0.9998447 -0.06368462 0 -0.9979701 -0.0507097 0 -0.9987134 -0.01762042 0 -0.9998447 -0.007412939 0 -0.9999724 -0.03690038 0 -0.999319 -0.06368462 0 -0.9979701 0 0 -0.9999999 0 0 -0.9999999 -0.007412939 0 -0.9999724 -0.01762042 0 -0.9998447 -0.295599 0 -0.955312 -0.1152777 0 -0.9933332 -0.1269894 0 -0.9919041 -0.1801535 0 -0.9836385 -0.1801535 0 -0.9836385 -0.1269894 0 -0.9919041 -0.04989531 0 -0.9987545 -0.04497956 0 -0.9989879 -0.1269894 0 -0.9919041 -0.06368462 0 -0.9979701 -0.03690038 0 -0.999319 -0.04989531 0 -0.9987545 -0.1152777 0 -0.9933332 -0.0507097 0 -0.9987134 -0.06368462 0 -0.9979701 -0.1269894 0 -0.9919041 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0.003922469 0 -0.9999922 6.6936e-4 0 -0.9999996 -0.002292145 0 -0.9999973 -0.002292145 0 -0.9999973 6.6936e-4 0 -0.9999996 -0.01558241 0 -0.9998785 -0.004984302 0 -0.9999874 6.6936e-4 0 -0.9999996 0.01310593 0 -0.9999139 -0.00604008 0 -0.9999818 -0.01558241 0 -0.9998785 0.003922469 0 -0.9999922 0.01486632 0 -0.9998893 0.01310593 0 -0.9999139 6.6936e-4 0 -0.9999996 -0.05677116 0 -0.9983872 -0.01449831 0 -0.9998949 -0.05237485 0 -0.9986274 -0.07333283 0 -0.9973075 -0.07333283 0 -0.9973075 -0.05237485 0 -0.9986274 -0.009087436 0 -0.9999587 3.85065e-4 0 -0.9999999 -0.05237485 0 -0.9986274 -0.01558241 0 -0.9998785 -0.00604008 0 -0.9999818 -0.009087436 0 -0.9999587 -0.01449831 0 -0.9998949 -0.004984302 0 -0.9999874 -0.01558241 0 -0.9998785 -0.05237485 0 -0.9986274 0.01068715 0 -0.9999429 0.05181549 0 -0.9986566 0.02643165 0 -0.9996505 0.02920793 0 -0.9995733 0.02920793 0 -0.9995733 0.02643165 0 -0.9996505 0.01310593 0 -0.9999139 0.01486632 0 -0.9998893 0.02643165 0 -0.9996505 -0.009087436 0 -0.9999587 -0.00604008 0 -0.9999818 0.01310593 0 -0.9999139 0.05181549 0 -0.9986566 3.85065e-4 0 -0.9999999 -0.009087436 0 -0.9999587 0.02643165 0 -0.9996505 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0.00225002 0 -0.9999973 0.003922469 0 -0.9999922 0.003922469 0 -0.9999922 0.00225002 0 -0.9999973 0.007522991 0 -0.9999716 0.01486632 0 -0.9998893 0.00225002 0 -0.9999973 0.001632383 0 -0.9999985 0.004701071 0 -0.9999889 0.007522991 0 -0.9999716 0 0 -0.9999999 0 0 -0.9999999 0.001632383 0 -0.9999985 0.00225002 0 -0.9999973 0.01068715 0 -0.9999429 0.02920793 0 -0.9995733 0.006845403 0 -0.9999765 -0.01312428 0 -0.9999139 -0.01312428 0 -0.9999139 0.006845403 0 -0.9999765 0.002672113 0 -0.9999963 -0.005606961 0 -0.9999841 0.006845403 0 -0.9999765 0.007522991 0 -0.9999716 0.004701071 0 -0.9999889 0.002672113 0 -0.9999963 0.02920793 0 -0.9995733 0.01486632 0 -0.9998893 0.007522991 0 -0.9999716 0.006845403 0 -0.9999765 0 0 -0.9999999 -0.001368713 0 -0.9999989 9.22762e-4 0 -0.9999995 0 0 -0.9999999 0 0 -0.9999999 9.22762e-4 0 -0.9999995 0.001632383 0 -0.9999985 0 0 -0.9999999 9.22762e-4 0 -0.9999995 0.002672113 0 -0.9999963 0.004701071 0 -0.9999889 0.001632383 0 -0.9999985 -0.001368713 0 -0.9999989 -0.005606961 0 -0.9999841 0.002672113 0 -0.9999963 9.22762e-4 0 -0.9999995 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 7.74189e-4 0 -0.9999996 4.30492e-4 0 -0.9999997 0 0 -0.9999999 0 0 -0.9999999 4.30492e-4 0 -0.9999997 0 0 -0.9999999 0 0 -0.9999999 4.30492e-4 0 -0.9999997 0.002207237 0 -0.9999975 0.001097033 0 -0.9999993 0 0 -0.9999999 7.74189e-4 0 -0.9999996 0.003714162 0 -0.999993 0.002207237 0 -0.9999975 4.30492e-4 0 -0.9999997 0 0 -0.9999999 0 0 -0.9999999 2.57701e-4 0 -0.9999998 2.02364e-4 0 -0.9999999 2.02364e-4 0 -0.9999999 2.57701e-4 0 -0.9999998 0.001332143 0 -0.999999 0 0 -1 2.57701e-4 0 -0.9999998 0 0 -0.9999999 0.001097033 0 -0.9999993 0.001332143 0 -0.999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 2.57701e-4 0 -0.9999998 0.008961941 0 -0.9999599 -6.54515e-4 0 -0.9999997 0.005260898 0 -0.9999861 0.01081525 0 -0.9999413 0.01081525 0 -0.9999413 0.005260898 0 -0.9999861 0.002207237 0 -0.9999975 0.003714162 0 -0.999993 0.005260898 0 -0.9999861 0.001332143 0 -0.999999 0.001097033 0 -0.9999993 0.002207237 0 -0.9999975 -6.54515e-4 0 -0.9999997 0 0 -1 0.001332143 0 -0.999999 0.005260898 0 -0.9999861 0 0 -0.9999999 -0.004965191 0 -0.9999876 -0.02321831 0 -0.9997303 -0.02034946 0 -0.9997929 -0.02034946 0 -0.9997929 -0.02321831 0 -0.9997303 -0.08721009 0 -0.9961899 -0.1071365 0 -0.9942443 -0.02321831 0 -0.9997303 -0.02437046 0 -0.9997029 -0.07623375 0 -0.9970899 -0.08721009 0 -0.9961899 -0.004965191 0 -0.9999876 -0.03069693 0 -0.9995288 -0.02437046 0 -0.9997029 -0.02321831 0 -0.9997303 -0.4462447 0 -0.8949109 -0.3041712 0 -0.9526173 -0.1738058 0 -0.98478 -0.3042589 0 -0.9525892 -0.3042589 0 -0.9525892 -0.1738058 0 -0.98478 -0.1082759 0 -0.9941209 -0.09450807 0 -0.995524 -0.1738058 0 -0.98478 -0.08721009 0 -0.9961899 -0.07623375 0 -0.9970899 -0.1082759 0 -0.9941209 -0.3041712 0 -0.9526173 -0.1071365 0 -0.9942443 -0.08721009 0 -0.9961899 -0.1738058 0 -0.98478 -0.2206403 0 -0.9753553 -0.03081075 0 -0.9995253 -0.03844962 0 -0.9992605 -0.08976096 0 -0.9959633 -0.08976096 0 -0.9959633 -0.03844962 0 -0.9992605 -0.02437046 0 -0.9997029 -0.03069693 0 -0.9995288 -0.03844962 0 -0.9992605 -0.1082759 0 -0.9941209 -0.07623375 0 -0.9970899 -0.02437046 0 -0.9997029 -0.03081075 0 -0.9995253 -0.09450807 0 -0.995524 -0.1082759 0 -0.9941209 -0.03844962 0 -0.9992605 -0.2134779 0 -0.9769479 -0.1172332 0 -0.9931043 -0.03870846 0 -0.9992505 -0.04263652 0 -0.9990905 -0.04263652 0 -0.9990905 -0.03870846 0 -0.9992505 -0.0859644 0 -0.9962982 -0.07021647 0 -0.9975318 -0.03870846 0 -0.9992505 -0.02349335 0 -0.9997239 -0.05731456 0 -0.9983561 -0.0859644 0 -0.9962982 -0.1172332 0 -0.9931043 -0.04781389 0 -0.9988562 -0.02349335 0 -0.9997239 -0.03870846 0 -0.9992505 -0.4462447 0 -0.8949109 -0.1938038 0 -0.9810402 -0.2127858 0 -0.9770988 -0.3041712 0 -0.9526173 -0.3041712 0 -0.9526173 -0.2127858 0 -0.9770988 -0.09866554 0 -0.9951206 -0.1071365 0 -0.9942443 -0.2127858 0 -0.9770988 -0.0859644 0 -0.9962982 -0.05731456 0 -0.9983561 -0.09866554 0 -0.9951206 -0.1938038 0 -0.9810402 -0.07021647 0 -0.9975318 -0.0859644 0 -0.9962982 -0.2127858 0 -0.9770988 0 0 -0.9999999 -0.02034946 0 -0.9997929 -0.02270403 0 -0.9997422 -0.009358967 0 -0.9999562 -0.009358967 0 -0.9999562 -0.02270403 0 -0.9997422 -0.02349335 0 -0.9997239 -0.04781389 0 -0.9988562 -0.02270403 0 -0.9997422 -0.09866554 0 -0.9951206 -0.05731456 0 -0.9983561 -0.02349335 0 -0.9997239 -0.02034946 0 -0.9997929 -0.1071365 0 -0.9942443 -0.09866554 0 -0.9951206 -0.02270403 0 -0.9997422 0 0 -0.9999999 -0.009358967 0 -0.9999562 -0.01958532 0 -0.9998081 0 0 -0.9999999 0 0 -0.9999999 -0.01958532 0 -0.9998081 -0.01570079 0 -0.9998767 0 0 -0.9999999 -0.01958532 0 -0.9998081 -0.07404472 0 -0.9972548 -0.03696111 0 -0.9993167 -0.01570079 0 -0.9998767 -0.009358967 0 -0.9999562 -0.04781389 0 -0.9988562 -0.07404472 0 -0.9972548 -0.01958532 0 -0.9998081 0 0 -0.9999999 0 0 -0.9999999 -0.01490019 0 -0.999889 -0.01930129 0 -0.9998137 -0.01930129 0 -0.9998137 -0.01490019 0 -0.999889 -0.06629112 0 -0.9978003 -0.0807729 0 -0.9967325 -0.01490019 0 -0.999889 -0.01570079 0 -0.9998767 -0.03696111 0 -0.9993167 -0.06629112 0 -0.9978003 0 0 -0.9999999 0 0 -0.9999999 -0.01570079 0 -0.9998767 -0.01490019 0 -0.999889 -0.2134779 0 -0.9769479 -0.1888928 0 -0.9819978 -0.1194782 0 -0.9928368 -0.1172332 0 -0.9931043 -0.1172332 0 -0.9931043 -0.1194782 0 -0.9928368 -0.07404472 0 -0.9972548 -0.04781389 0 -0.9988562 -0.1194782 0 -0.9928368 -0.06629112 0 -0.9978003 -0.03696111 0 -0.9993167 -0.07404472 0 -0.9972548 -0.1888928 0 -0.9819978 -0.0807729 0 -0.9967325 -0.06629112 0 -0.9978003 -0.1194782 0 -0.9928368 0 0 -0.9999999 -0.003571543 0 -0.9999936 -0.008996402 0 -0.9999594 0 0 -0.9999999 0 0 -0.9999999 -0.008996402 0 -0.9999594 -0.007116205 0 -0.9999747 0 0 -0.9999999 -0.008996402 0 -0.9999594 -0.03480714 0 -0.9993941 -0.02305716 0 -0.9997341 -0.007116205 0 -0.9999747 -0.003571543 0 -0.9999936 -0.006358742 0 -0.9999797 -0.03480714 0 -0.9993941 -0.008996402 0 -0.9999594 0 0 -0.9999999 0 0 -0.9999999 -0.01379689 0 -0.9999048 -0.01263022 0 -0.9999201 -0.01263022 0 -0.9999201 -0.01379689 0 -0.9999048 -0.04666538 0 -0.9989106 -0.06038843 0 -0.998175 -0.01379689 0 -0.9999048 -0.007116205 0 -0.9999747 -0.02305716 0 -0.9997341 -0.04666538 0 -0.9989106 0 0 -0.9999999 0 0 -0.9999999 -0.007116205 0 -0.9999747 -0.01379689 0 -0.9999048 0.03300812 0 -0.999455 -0.1568487 0 -0.9876225 -0.06522277 0 -0.9978707 -0.02317441 0 -0.9997314 -0.02317441 0 -0.9997314 -0.06522277 0 -0.9978707 -0.03480714 0 -0.9993941 -0.006358742 0 -0.9999797 -0.06522277 0 -0.9978707 -0.04666538 0 -0.9989106 -0.02305716 0 -0.9997341 -0.03480714 0 -0.9993941 -0.1568487 0 -0.9876225 -0.06038843 0 -0.998175 -0.04666538 0 -0.9989106 -0.06522277 0 -0.9978707 0 0 -0.9999999 0.009919995 0 -0.9999508 0.03621702 0 -0.9993439 -0.003571543 0 -0.9999936 -0.003571543 0 -0.9999936 0.03621702 0 -0.9993439 0.07687236 0 -0.997041 -0.006358742 0 -0.9999797 0.03621702 0 -0.9993439 0.1296321 0 -0.9915621 0.2020978 0 -0.9793653 0.07687236 0 -0.997041 0.009919995 0 -0.9999508 0.06172335 0 -0.9980933 0.1296321 0 -0.9915621 0.03621702 0 -0.9993439 0.03300812 0 -0.999455 -0.02317441 0 -0.9997314 0.2329025 0 -0.9725 0.4759441 0 -0.8794755 0.4759441 0 -0.8794755 0.2329025 0 -0.9725 0.356579 0 -0.934265 0.5529048 0 -0.8332445 0.2329025 0 -0.9725 0.07687236 0 -0.997041 0.2020978 0 -0.9793653 0.356579 0 -0.934265 -0.02317441 0 -0.9997314 -0.006358742 0 -0.9999797 0.07687236 0 -0.997041 0.2329025 0 -0.9725 0.2869743 0 -0.9579383 0.7040466 0 -0.7101538 0.4148879 0 -0.9098726 0.1563693 0 -0.9876985 0.1563693 0 -0.9876985 0.4148879 0 -0.9098726 0.1296321 0 -0.9915621 0.06172335 0 -0.9980933 0.4148879 0 -0.9098726 0.356579 0 -0.934265 0.2020978 0 -0.9793653 0.1296321 0 -0.9915621 0.7040466 0 -0.7101538 0.5529048 0 -0.8332445 0.356579 0 -0.934265 0.4148879 0 -0.9098726 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0.004572396 0 -0.9999894 0.003635404 0 -0.9999932 0.003635404 0 -0.9999932 0.004572396 0 -0.9999894 0.01920603 0 -0.9998155 0.01943092 0 -0.9998111 0.004572396 0 -0.9999894 0.002529859 0 -0.9999967 0.01336804 0 -0.9999107 0.01920603 0 -0.9998155 0 0 -0.9999999 0 0 -0.9999999 0.002529859 0 -0.9999967 0.004572396 0 -0.9999894 0.09499485 0 -0.9954777 0.06690167 0 -0.9977595 0.04991891 0 -0.9987532 0.04081583 0 -0.9991666 0.04081583 0 -0.9991666 0.04991891 0 -0.9987532 0.02292297 0 -0.9997373 0.01726562 0 -0.9998509 0.04991891 0 -0.9987532 0.01920603 0 -0.9998155 0.01336804 0 -0.9999107 0.02292297 0 -0.9997373 0.06690167 0 -0.9977595 0.01943092 0 -0.9998111 0.01920603 0 -0.9998155 0.04991891 0 -0.9987532 0 0 -1 0.003441869 0 -0.9999939 0.006393678 0 -0.9999794 0 0 -0.9999999 0 0 -0.9999999 0.006393678 0 -0.9999794 0.002529859 0 -0.9999967 0 0 -0.9999999 0.006393678 0 -0.9999794 0.02292297 0 -0.9997373 0.01336804 0 -0.9999107 0.002529859 0 -0.9999967 0.003441869 0 -0.9999939 0.01726562 0 -0.9998509 0.02292297 0 -0.9997373 0.006393678 0 -0.9999794 0 0 -0.9999999 8.73929e-4 0 -0.9999995 0.002558809 0 -0.9999966 0.002018874 0 -0.9999979 0.002018874 0 -0.9999979 0.002558809 0 -0.9999966 0.009269491 0 -0.9999569 0.01051862 0 -0.9999446 0.002558809 0 -0.9999966 0.003151382 0 -0.9999949 0.005801633 0 -0.9999831 0.009269491 0 -0.9999569 8.73929e-4 0 -0.9999995 0.003794762 0 -0.9999927 0.003151382 0 -0.9999949 0.002558809 0 -0.9999966 0.06203055 0 -0.9980742 0.03887312 0 -0.9992441 0.02357415 0 -0.9997221 0.02488692 0 -0.9996903 0.02488692 0 -0.9996903 0.02357415 0 -0.9997221 0.006822228 0 -0.9999767 0.01375214 0 -0.9999053 0.02357415 0 -0.9997221 0.009269491 0 -0.9999569 0.005801633 0 -0.9999831 0.006822228 0 -0.9999767 0.03887312 0 -0.9992441 0.01051862 0 -0.9999446 0.009269491 0 -0.9999569 0.02357415 0 -0.9997221 0.002527875 0 -0.9999968 0.00632861 0 -0.9999799 0.007510647 0 -0.9999716 0.009486124 0 -0.9999549 0.009486124 0 -0.9999549 0.007510647 0 -0.9999716 0.003151382 0 -0.9999949 0.003794762 0 -0.9999927 0.007510647 0 -0.9999716 0.006822228 0 -0.9999767 0.005801633 0 -0.9999831 0.003151382 0 -0.9999949 0.00632861 0 -0.9999799 0.01375214 0 -0.9999053 0.006822228 0 -0.9999767 0.007510647 0 -0.9999716 0 0 -0.9999999 0.003976186 0 -0.9999919 0.007515749 0 -0.9999716 3.89166e-4 0 -0.9999999 3.89166e-4 0 -0.9999999 0.007515749 0 -0.9999716 0.00444652 0 -0.99999 0.001668262 0 -0.9999985 0.007515749 0 -0.9999716 0.03538947 0 -0.9993736 0.02896951 0 -0.9995802 0.00444652 0 -0.99999 0.003976186 0 -0.9999919 0.02038898 0 -0.9997922 0.03538947 0 -0.9993736 0.007515749 0 -0.9999716 0.002527875 0 -0.9999968 0.004688043 0 -0.9999889 0.004692016 0 -0.999989 -0.004038785 0 -0.9999918 -0.004038785 0 -0.9999918 0.004692016 0 -0.999989 0.06232788 0 -0.9980558 0.05499243 0 -0.9984867 0.004692016 0 -0.999989 0.00444652 0 -0.99999 0.02896951 0 -0.9995802 0.06232788 0 -0.9980558 0.004688043 0 -0.9999889 0.001668262 0 -0.9999985 0.00444652 0 -0.99999 0.004692016 0 -0.999989 0.1692145 0 -0.9855793 0.1665905 0 -0.9860261 0.124486 0 -0.9922214 0.06536287 0 -0.9978614 0.06536287 0 -0.9978614 0.124486 0 -0.9922214 0.03538947 0 -0.9993736 0.02038898 0 -0.9997922 0.124486 0 -0.9922214 0.06232788 0 -0.9980558 0.02896951 0 -0.9995802 0.03538947 0 -0.9993736 0.1665905 0 -0.9860261 0.05499243 0 -0.9984867 0.06232788 0 -0.9980558 0.124486 0 -0.9922214 0.002527875 0 -0.9999968 0.009486124 0 -0.9999549 0.005171326 0 -0.9999865 0.004688043 0 -0.9999889 0.004688043 0 -0.9999889 0.005171326 0 -0.9999865 0.002745821 0 -0.9999961 0.001668262 0 -0.9999985 0.005171326 0 -0.9999865 0.003152906 0 -0.9999949 0.001677116 0 -0.9999986 0.002745821 0 -0.9999961 0.009486124 0 -0.9999549 0.003794762 0 -0.9999927 0.003152906 0 -0.9999949 0.005171326 0 -0.9999865 0 0 -0.9999999 3.89166e-4 0 -0.9999999 6.79e-4 0 -0.9999996 0 0 -0.9999999 0 0 -0.9999999 6.79e-4 0 -0.9999996 4.02599e-4 0 -0.9999998 0 0 -0.9999999 6.79e-4 0 -0.9999996 0.002745821 0 -0.9999961 0.001677116 0 -0.9999986 4.02599e-4 0 -0.9999998 3.89166e-4 0 -0.9999999 0.001668262 0 -0.9999985 0.002745821 0 -0.9999961 6.79e-4 0 -0.9999996 0 0 -0.9999999 0 0 -0.9999999 7.28164e-4 0 -0.9999996 8.73929e-4 0 -0.9999995 8.73929e-4 0 -0.9999995 7.28164e-4 0 -0.9999996 0.003152906 0 -0.9999949 0.003794762 0 -0.9999927 7.28164e-4 0 -0.9999996 4.02599e-4 0 -0.9999998 0.001677116 0 -0.9999986 0.003152906 0 -0.9999949 0 0 -0.9999999 0 0 -0.9999999 4.02599e-4 0 -0.9999998 7.28164e-4 0 -0.9999996 0 0 -0.9999999 0 0 -0.9999999 0.003328481 0 -0.9999943 0.003833624 0 -0.9999924 0.003833624 0 -0.9999924 0.003328481 0 -0.9999943 0.01326304 0 -0.9999119 0.01566684 0 -0.9998772 0.003328481 0 -0.9999943 0.001903221 0 -0.9999981 0.009686265 0 -0.999953 0.01326304 0 -0.9999119 0 0 -0.9999999 0 0 -0.9999999 0.001903221 0 -0.9999981 0.003328481 0 -0.9999943 0.04036171 0 -0.9991851 0.03582906 0 -0.999358 0.02977771 0 -0.9995565 0.0281579 0 -0.9996033 0.0281579 0 -0.9996033 0.02977771 0 -0.9995565 0.01658688 0 -0.9998624 0.01340973 0 -0.99991 0.02977771 0 -0.9995565 0.01326304 0 -0.9999119 0.009686265 0 -0.999953 0.01658688 0 -0.9998624 0.03582906 0 -0.999358 0.01566684 0 -0.9998772 0.01326304 0 -0.9999119 0.02977771 0 -0.9995565 0 0 -0.9999999 0.002768245 0 -0.999996 0.004950363 0 -0.9999876 0 0 -0.9999999 0 0 -0.9999999 0.004950363 0 -0.9999876 0.001903221 0 -0.9999981 0 0 -0.9999999 0.004950363 0 -0.9999876 0.01658688 0 -0.9998624 0.009686265 0 -0.999953 0.001903221 0 -0.9999981 0.002768245 0 -0.999996 0.01340973 0 -0.99991 0.01658688 0 -0.9998624 0.004950363 0 -0.9999876 0 0 -0.9999999 0.002147154 0 -0.9999976 0.007528428 0 -0.9999715 0.005349608 0 -0.9999856 0.005349608 0 -0.9999856 0.007528428 0 -0.9999715 0.02890719 0 -0.9995821 0.02927994 0 -0.9995712 0.007528428 0 -0.9999715 0.006046385 0 -0.9999816 0.02010975 0 -0.9997978 0.02890719 0 -0.9995821 0.002147154 0 -0.9999976 0.009277752 0 -0.9999569 0.006046385 0 -0.9999816 0.007528428 0 -0.9999715 0.1590685 0 -0.9872675 0.1051462 0 -0.9944568 0.07500274 0 -0.9971834 0.06062737 0 -0.9981603 0.06062737 0 -0.9981603 0.07500274 0 -0.9971834 0.03431256 0 -0.9994112 0.02653953 0 -0.9996476 0.07500274 0 -0.9971834 0.02890719 0 -0.9995821 0.02010975 0 -0.9997978 0.03431256 0 -0.9994112 0.1051462 0 -0.9944568 0.02927994 0 -0.9995712 0.02890719 0 -0.9995821 0.07500274 0 -0.9971834 0.04036171 0 -0.9991851 0.008770678 0 -0.9999614 0.01093013 0 -0.9999401 0.0180628 0 -0.9998369 0.0180628 0 -0.9998369 0.01093013 0 -0.9999401 0.006046385 0 -0.9999816 0.009277752 0 -0.9999569 0.01093013 0 -0.9999401 0.03431256 0 -0.9994112 0.02010975 0 -0.9997978 0.006046385 0 -0.9999816 0.008770678 0 -0.9999614 0.02653953 0 -0.9996476 0.03431256 0 -0.9994112 0.01093013 0 -0.9999401 0 0 -0.9999999 -0.00255967 0 -0.9999966 -0.003362471 0 -0.9999942 0 0 -0.9999999 0 0 -0.9999999 -0.003362471 0 -0.9999942 -0.00196926 0 -0.999998 0 0 -0.9999999 -0.003362471 0 -0.9999942 -0.01369494 0 -0.9999061 -0.008052825 0 -0.9999675 -0.00196926 0 -0.999998 -0.00255967 0 -0.9999966 -0.01113891 0 -0.9999378 -0.01369494 0 -0.9999061 -0.003362471 0 -0.9999942 0 0 -0.9999999 0 0 -0.9999999 -0.003552085 0 -0.9999936 -0.004794565 0 -0.9999883 -0.004794565 0 -0.9999883 -0.003552085 0 -0.9999936 -0.01537055 0 -0.9998817 -0.01961608 0 -0.9998075 -0.003552085 0 -0.9999936 -0.00196926 0 -0.999998 -0.008052825 0 -0.9999675 -0.01537055 0 -0.9998817 0 0 -0.9999999 0 0 -0.9999999 -0.00196926 0 -0.999998 -0.003552085 0 -0.9999936 -0.04938016 0 -0.99878 -0.04480134 0 -0.998996 -0.02562319 0 -0.9996715 -0.02143207 0 -0.9997703 -0.02143207 0 -0.9997703 -0.02562319 0 -0.9996715 -0.01369494 0 -0.9999061 -0.01113891 0 -0.9999378 -0.02562319 0 -0.9996715 -0.01537055 0 -0.9998817 -0.008052825 0 -0.9999675 -0.01369494 0 -0.9999061 -0.04480134 0 -0.998996 -0.01961608 0 -0.9998075 -0.01537055 0 -0.9998817 -0.02562319 0 -0.9996715 0 0 -0.9999999 -0.00637432 0 -0.9999796 -0.009618149 0 -0.9999536 -0.00255967 0 -0.9999966 -0.00255967 0 -0.9999966 -0.009618149 0 -0.9999536 -0.007052012 0 -0.999975 -0.01113891 0 -0.9999378 -0.009618149 0 -0.9999536 -0.03724973 0 -0.999306 -0.02566014 0 -0.9996707 -0.007052012 0 -0.999975 -0.00637432 0 -0.9999796 -0.03614369 0 -0.9993466 -0.03724973 0 -0.999306 -0.009618149 0 -0.9999536 -0.04938016 0 -0.99878 -0.02143207 0 -0.9997703 -0.0124971 0 -0.9999218 -0.008672976 0 -0.9999623 -0.008672976 0 -0.9999623 -0.0124971 0 -0.9999218 -0.04411159 0 -0.9990266 -0.03382056 0 -0.9994279 -0.0124971 0 -0.9999218 -0.007052012 0 -0.999975 -0.02566014 0 -0.9996707 -0.04411159 0 -0.9990266 -0.02143207 0 -0.9997703 -0.01113891 0 -0.9999378 -0.007052012 0 -0.999975 -0.0124971 0 -0.9999218 -0.3696702 0 -0.929163 -0.07927331 0 -0.9968529 -0.09446871 0 -0.9955277 -0.1933342 0 -0.9811329 -0.1933342 0 -0.9811329 -0.09446871 0 -0.9955277 -0.03724973 0 -0.999306 -0.03614369 0 -0.9993466 -0.09446871 0 -0.9955277 -0.04411159 0 -0.9990266 -0.02566014 0 -0.9996707 -0.03724973 0 -0.999306 -0.07927331 0 -0.9968529 -0.03382056 0 -0.9994279 -0.04411159 0 -0.9990266 -0.09446871 0 -0.9955277 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.02049942 0 -0.9997898 -0.01377387 0 -0.9999051 -0.01377387 0 -0.9999051 -0.02049942 0 -0.9997898 -0.09203624 0 -0.9957558 -0.08107894 0 -0.9967077 -0.02049942 0 -0.9997898 -0.01203016 0 -0.9999276 -0.05705654 0 -0.9983709 -0.09203624 0 -0.9957558 0 0 -0.9999999 0 0 -0.9999999 -0.01203016 0 -0.9999276 -0.02049942 0 -0.9997898 -0.4388025 0 -0.8985835 -0.2054967 0 -0.9786579 -0.2188655 0 -0.975755 -0.3018685 0 -0.9533495 -0.3018685 0 -0.9533495 -0.2188655 0 -0.975755 -0.1001123 0 -0.9949761 -0.1068527 0 -0.9942749 -0.2188655 0 -0.975755 -0.09203624 0 -0.9957558 -0.05705654 0 -0.9983709 -0.1001123 0 -0.9949761 -0.2054967 0 -0.9786579 -0.08107894 0 -0.9967077 -0.09203624 0 -0.9957558 -0.2188655 0 -0.975755 0 0 -0.9999999 -0.02240144 0 -0.9997491 -0.02062753 0 -0.9997872 0 0 -0.9999999 0 0 -0.9999999 -0.02062753 0 -0.9997872 -0.01203016 0 -0.9999276 0 0 -0.9999999 -0.02062753 0 -0.9997872 -0.1001123 0 -0.9949761 -0.05705654 0 -0.9983709 -0.01203016 0 -0.9999276 -0.02240144 0 -0.9997491 -0.1068527 0 -0.9942749 -0.1001123 0 -0.9949761 -0.02062753 0 -0.9997872 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.01068649 0 -0.9999429 -0.02903598 0 -0.9995784 -0.02633923 0 -0.9996529 -0.05181257 0 -0.9986567 -0.05181257 0 -0.9986567 -0.02633923 0 -0.9996529 0.009081314 0 -0.9999587 -3.87104e-4 0 -0.9999999 -0.02633923 0 -0.9996529 -0.01296829 0 -0.9999158 0.006075846 0 -0.9999815 0.009081314 0 -0.9999587 -0.02903598 0 -0.9995784 -0.01449359 0 -0.9998949 -0.01296829 0 -0.9999158 -0.02633923 0 -0.9996529 0.05676809 0 -0.9983873 0.07333278 0 -0.9973075 0.0523972 0 -0.9986262 0.01443529 0 -0.9998958 0.01443529 0 -0.9998958 0.0523972 0 -0.9986262 0.01561375 0 -0.999878 0.006017815 0 -0.9999818 0.0523972 0 -0.9986262 0.009081314 0 -0.9999587 0.006075846 0 -0.9999815 0.01561375 0 -0.999878 0.07333278 0 -0.9973075 -3.87104e-4 0 -0.9999999 0.009081314 0 -0.9999587 0.0523972 0 -0.9986262 0 0 -0.9999999 0.001486514 0 -0.9999988 -5.977e-4 0 -0.9999997 -0.003737659 0 -0.9999928 -0.003737659 0 -0.9999928 -5.977e-4 0 -0.9999997 -0.01296829 0 -0.9999158 -0.01449359 0 -0.9998949 -5.977e-4 0 -0.9999997 0.01561375 0 -0.999878 0.006075846 0 -0.9999815 -0.01296829 0 -0.9999158 0.001486514 0 -0.9999988 0.006017815 0 -0.9999818 0.01561375 0 -0.999878 -5.977e-4 0 -0.9999997 0 0 -0.9999999 0.001139103 0 -0.9999992 -0.01352623 0 -0.9999084 -0.005933172 0 -0.9999823 -0.005933172 0 -0.9999823 -0.01352623 0 -0.9999084 -0.0525215 0 -0.9986197 -0.02545355 0 -0.999676 -0.01352623 0 -0.9999084 -7.88023e-4 0 -0.9999995 -0.03750859 0 -0.9992963 -0.0525215 0 -0.9986197 0.001139103 0 -0.9999992 0.005468675 0 -0.9999849 -7.88023e-4 0 -0.9999995 -0.01352623 0 -0.9999084 -0.137555 0 -0.9904941 -0.06128643 0 -0.9981202 -0.1186416 0 -0.9929371 -0.1538159 0 -0.9880995 -0.1538159 0 -0.9880995 -0.1186416 0 -0.9929371 -0.05496065 0 -0.9984885 -0.05229653 0 -0.9986315 -0.1186416 0 -0.9929371 -0.0525215 0 -0.9986197 -0.03750859 0 -0.9992963 -0.05496065 0 -0.9984885 -0.06128643 0 -0.9981202 -0.02545355 0 -0.999676 -0.0525215 0 -0.9986197 -0.1186416 0 -0.9929371 -0.01068649 0 -0.9999429 0.02620723 0 -0.9996564 0.001548697 0 -0.9999987 0.01303035 0 -0.9999151 0.01303035 0 -0.9999151 0.001548697 0 -0.9999987 -7.88023e-4 0 -0.9999995 0.005468675 0 -0.9999849 0.001548697 0 -0.9999987 -0.05496065 0 -0.9984885 -0.03750859 0 -0.9992963 -7.88023e-4 0 -0.9999995 0.02620723 0 -0.9996564 -0.05229653 0 -0.9986315 -0.05496065 0 -0.9984885 0.001548697 0 -0.9999987 0 0 -0.9999999 0 0 -0.9999999 -0.001042067 0 -0.9999994 0.001139103 0 -0.9999992 0.001139103 0 -0.9999992 -0.001042067 0 -0.9999994 -0.002917903 0 -0.9999956 0.005468675 0 -0.9999849 -0.001042067 0 -0.9999994 -0.001641547 0 -0.9999985 -0.004748974 0 -0.9999887 -0.002917903 0 -0.9999956 0 0 -0.9999999 0 0 -0.9999999 -0.001641547 0 -0.9999985 -0.001042067 0 -0.9999994 -0.01068649 0 -0.9999429 0.01303035 0 -0.9999151 -0.006872803 0 -0.9999763 -0.02903598 0 -0.9995784 -0.02903598 0 -0.9995784 -0.006872803 0 -0.9999763 -0.007264796 0 -0.9999735 -0.01449359 0 -0.9998949 -0.006872803 0 -0.9999763 -0.002917903 0 -0.9999956 -0.004748974 0 -0.9999887 -0.007264796 0 -0.9999735 0.01303035 0 -0.9999151 0.005468675 0 -0.9999849 -0.002917903 0 -0.9999956 -0.006872803 0 -0.9999763 0 0 -0.9999999 -0.003737659 0 -0.9999928 -0.002076905 0 -0.9999977 0 0 -0.9999999 0 0 -0.9999999 -0.002076905 0 -0.9999977 -0.001641547 0 -0.9999985 0 0 -0.9999999 -0.002076905 0 -0.9999977 -0.007264796 0 -0.9999735 -0.004748974 0 -0.9999887 -0.001641547 0 -0.9999985 -0.003737659 0 -0.9999928 -0.01449359 0 -0.9998949 -0.007264796 0 -0.9999735 -0.002076905 0 -0.9999977 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0.008788777 0 -0.9999613 0.02161057 0 -0.9997665 0.01934073 0 -0.999813 0.01934073 0 -0.999813 0.02161057 0 -0.9997665 0.09749357 0 -0.9952361 0.1048799 0 -0.9944848 0.02161057 0 -0.9997665 0.02194537 0 -0.9997591 0.05615459 0 -0.9984221 0.09749357 0 -0.9952361 0.008788777 0 -0.9999613 0.04677973 0 -0.9989052 0.02194537 0 -0.9997591 0.02161057 0 -0.9997665 0.4462471 0 -0.8949099 0.3030522 0 -0.9529738 0.2123874 0 -0.9771855 0.1938013 0 -0.9810407 0.1938013 0 -0.9810407 0.2123874 0 -0.9771855 0.08542883 0 -0.9963442 0.07021141 0 -0.9975321 0.2123874 0 -0.9771855 0.09749357 0 -0.9952361 0.05615459 0 -0.9984221 0.08542883 0 -0.9963442 0.3030522 0 -0.9529738 0.1048799 0 -0.9944848 0.09749357 0 -0.9952361 0.2123874 0 -0.9771855 0.2134765 0 -0.9769482 0.04263418 0 -0.9990906 0.03790107 0 -0.9992815 0.1168934 0 -0.9931445 0.1168934 0 -0.9931445 0.03790107 0 -0.9992815 0.02194537 0 -0.9997591 0.04677973 0 -0.9989052 0.03790107 0 -0.9992815 0.08542883 0 -0.9963442 0.05615459 0 -0.9984221 0.02194537 0 -0.9997591 0.04263418 0 -0.9990906 0.07021141 0 -0.9975321 0.08542883 0 -0.9963442 0.03790107 0 -0.9992815 0.2134765 0 -0.9769482 0.1168934 0 -0.9931445 0.1168929 0 -0.9931445 0.1870674 0 -0.9823469 0.1870674 0 -0.9823469 0.1168929 0 -0.9931445 0.06305776 0 -0.9980099 0.07711183 0 -0.9970224 0.1168929 0 -0.9931445 0.07285748 0 -0.9973423 0.03518242 0 -0.9993809 0.06305776 0 -0.9980099 0.1168934 0 -0.9931445 0.04677973 0 -0.9989052 0.07285748 0 -0.9973423 0.1168929 0 -0.9931445 0 0 -0.9999999 0.01491308 0 -0.9998888 0.01336865 0 -0.9999105 0 0 -0.9999999 0 0 -0.9999999 0.01336865 0 -0.9999105 0.01795361 0 -0.9998388 0 0 -0.9999999 0.01336865 0 -0.9999105 0.06305776 0 -0.9980099 0.03518242 0 -0.9993809 0.01795361 0 -0.9998388 0.01491308 0 -0.9998888 0.07711183 0 -0.9970224 0.06305776 0 -0.9980099 0.01336865 0 -0.9999105 0 0 -0.9999999 0 0 -0.9999999 0.01918385 0 -0.9998159 0.008788777 0 -0.9999613 0.008788777 0 -0.9999613 0.01918385 0 -0.9998159 0.07285748 0 -0.9973423 0.04677973 0 -0.9989052 0.01918385 0 -0.9998159 0.01795361 0 -0.9998388 0.03518242 0 -0.9993809 0.07285748 0 -0.9973423 0 0 -0.9999999 0 0 -0.9999999 0.01795361 0 -0.9998388 0.01918385 0 -0.9998159 0 0 -0.9999999 -7.74605e-4 0 -0.9999996 -0.003354809 0 -0.9999943 0.001486514 0 -0.9999988 0.001486514 0 -0.9999988 -0.003354809 0 -0.9999943 -0.003390767 0 -0.9999942 0.006017815 0 -0.9999818 -0.003354809 0 -0.9999943 -0.004557915 0 -0.9999895 -0.0087993 0 -0.9999612 -0.003390767 0 -0.9999942 -7.74605e-4 0 -0.9999996 -0.003712646 0 -0.999993 -0.004557915 0 -0.9999895 -0.003354809 0 -0.9999943 0.05676809 0 -0.9983873 0.01443529 0 -0.9998958 -0.006848503 0 -0.9999763 -0.02041589 0 -0.9997916 -0.02041589 0 -0.9997916 -0.006848503 0 -0.9999763 -0.01498551 0 -0.9998877 -0.02159272 0 -0.9997668 -0.006848503 0 -0.9999763 -0.003390767 0 -0.9999942 -0.0087993 0 -0.9999612 -0.01498551 0 -0.9998877 0.01443529 0 -0.9998958 0.006017815 0 -0.9999818 -0.003390767 0 -0.9999942 -0.006848503 0 -0.9999763 -0.008964197 0 -0.9999598 -0.01715229 0 -0.9998528 -0.0103153 0 -0.9999467 -0.01084073 0 -0.9999412 -0.01084073 0 -0.9999412 -0.0103153 0 -0.9999467 -0.004557915 0 -0.9999895 -0.003712646 0 -0.999993 -0.0103153 0 -0.9999467 -0.01498551 0 -0.9998877 -0.0087993 0 -0.9999612 -0.004557915 0 -0.9999895 -0.01715229 0 -0.9998528 -0.02159272 0 -0.9997668 -0.01498551 0 -0.9998877 -0.0103153 0 -0.9999467 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0.005843969 0 -0.9999829 0.01337534 0 -0.9999105 0 0 -0.9999999 0 0 -0.9999999 0.01337534 0 -0.9999105 0.01091482 0 -0.9999404 0 0 -0.9999999 0.01337534 0 -0.9999105 0.05657277 0 -0.9983984 0.05199758 0 -0.9986472 0.01091482 0 -0.9999404 0.005843969 0 -0.9999829 0.03271377 0 -0.9994648 0.05657277 0 -0.9983984 0.01337534 0 -0.9999105 0 0 -0.9999999 0 0 -0.9999999 0.01887485 0 -0.9998218 0.02588515 0 -0.9996649 0.02588515 0 -0.9996649 0.01887485 0 -0.9998218 0.08751184 0 -0.9961635 0.09279028 0 -0.9956855 0.01887485 0 -0.9998218 0.01091482 0 -0.9999404 0.05199758 0 -0.9986472 0.08751184 0 -0.9961635 0 0 -0.9999999 0 0 -0.9999999 0.01091482 0 -0.9999404 0.01887485 0 -0.9998218 0.220637 0 -0.975356 0.1949454 0 -0.9808142 0.1005462 0 -0.9949324 0.09061752 0 -0.9958858 0.09061752 0 -0.9958858 0.1005462 0 -0.9949324 0.05657277 0 -0.9983984 0.03271377 0 -0.9994648 0.1005462 0 -0.9949324 0.08751184 0 -0.9961635 0.05199758 0 -0.9986472 0.05657277 0 -0.9983984 0.1949454 0 -0.9808142 0.09279028 0 -0.9956855 0.08751184 0 -0.9961635 0.1005462 0 -0.9949324 0 0 -0.9999999 -0.01001984 0 -0.9999498 -0.00446685 0 -0.9999899 0 0 -0.9999999 0 0 -0.9999999 -0.00446685 0 -0.9999899 0.001293229 0 -0.999999 0 0 -0.9999999 -0.00446685 0 -0.9999899 -0.01619042 0 -0.9998689 -0.00344144 0 -0.999994 0.001293229 0 -0.999999 -0.01001984 0 -0.9999498 -0.06230111 0 -0.9980574 -0.01619042 0 -0.9998689 -0.00446685 0 -0.9999899 0 0 -0.9999999 0 0 -0.9999999 -0.003741379 0 -0.9999929 1.66567e-4 0 -0.9999999 1.66567e-4 0 -0.9999999 -0.003741379 0 -0.9999929 -0.01331922 0 -0.9999111 -0.006583545 0 -0.9999783 -0.003741379 0 -0.9999929 0.001293229 0 -0.999999 -0.00344144 0 -0.999994 -0.01331922 0 -0.9999111 0 0 -0.9999999 0 0 -0.9999999 0.001293229 0 -0.999999 -0.003741379 0 -0.9999929 -0.2869729 0 -0.9579387 0.00396844 0 -0.9999921 -0.0374447 0 -0.9992986 -0.1569509 0 -0.9876063 -0.1569509 0 -0.9876063 -0.0374447 0 -0.9992986 -0.01619042 0 -0.9998689 -0.06230111 0 -0.9980574 -0.0374447 0 -0.9992986 -0.01331922 0 -0.9999111 -0.00344144 0 -0.999994 -0.01619042 0 -0.9998689 0.00396844 0 -0.9999921 -0.006583545 0 -0.9999783 -0.01331922 0 -0.9999111 -0.0374447 0 -0.9992986 -0.2869729 0 -0.9579387 -0.1569509 0 -0.9876063 -0.4153936 0 -0.9096417 -0.7040476 0 -0.7101527 -0.7040476 0 -0.7101527 -0.4153936 0 -0.9096417 -0.3570297 0 -0.9340931 -0.5529022 0 -0.8332462 -0.4153936 0 -0.9096417 -0.1310251 0 -0.9913791 -0.2033162 0 -0.9791131 -0.3570297 0 -0.9340931 -0.1569509 0 -0.9876063 -0.06230111 0 -0.9980574 -0.1310251 0 -0.9913791 -0.4153936 0 -0.9096417 -0.03300889 0 -0.999455 -0.4759427 0 -0.8794763 -0.2335333 0 -0.9723487 0.02237438 0 -0.9997496 0.02237438 0 -0.9997496 -0.2335333 0 -0.9723487 -0.07909223 0 -0.9968674 0.004027958 0 -0.999992 -0.2335333 0 -0.9723487 -0.3570297 0 -0.9340931 -0.2033162 0 -0.9791131 -0.07909223 0 -0.9968674 -0.4759427 0 -0.8794763 -0.5529022 0 -0.8332462 -0.3570297 0 -0.9340931 -0.2335333 0 -0.9723487 0 0 -0.9999999 0.002556024 0 -0.9999967 -0.03795833 0 -0.9992794 -0.01001984 0 -0.9999498 -0.01001984 0 -0.9999498 -0.03795833 0 -0.9992794 -0.1310251 0 -0.9913791 -0.06230111 0 -0.9980574 -0.03795833 0 -0.9992794 -0.07909223 0 -0.9968674 -0.2033162 0 -0.9791131 -0.1310251 0 -0.9913791 0.002556024 0 -0.9999967 0.004027958 0 -0.999992 -0.07909223 0 -0.9968674 -0.03795833 0 -0.9992794</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape8-textangents-array" count="3552" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_Shape8-texbinormals">
+ <float_array id="qt_gauge_background_Shape8-texbinormals-array" count="10656">0.9994551 0 -0.0330089 0.9876527 0 0.1566596 0.9939246 0 0.1100638 0.97824 0 0.2074768 0.97824 0 0.2074768 0.9939246 0 0.1100638 0.9990659 0 0.04321438 0.9948643 0 0.101218 0.9939246 0 0.1100638 0.9990036 0 0.04463048 0.9998014 0 0.01993182 0.9990659 0 0.04321438 0.9876527 0 0.1566596 0.9982052 0 0.0598864 0.9990036 0 0.04463048 0.9939246 0 0.1100638 0.9904941 0 -0.137555 0.9999964 0 0.0026872 0.9999684 0 -0.007948059 0.9981203 0 -0.06128644 0.9981203 0 -0.06128644 0.9999684 0 -0.007948059 0.9999901 0 -0.004463417 0.999676 0 -0.02545355 0.9999684 0 -0.007948059 0.9990659 0 0.04321438 0.9998014 0 0.01993182 0.9999901 0 -0.004463417 0.9999964 0 0.0026872 0.9948643 0 0.101218 0.9990659 0 0.04321438 0.9999684 0 -0.007948059 1 0 0 0.9999825 0 -0.005933173 0.9999325 0 0.0116251 0.9999217 0 0.01251858 0.9999217 0 0.01251858 0.9999325 0 0.0116251 0.9990036 0 0.04463048 0.9982052 0 0.0598864 0.9999325 0 0.0116251 0.9999901 0 -0.004463417 0.9998014 0 0.01993182 0.9990036 0 0.04463048 0.9999825 0 -0.005933173 0.999676 0 -0.02545355 0.9999901 0 -0.004463417 0.9999325 0 0.0116251 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9997873 0 0.02062489 0.9997491 0 0.02240226 0.9997491 0 0.02240226 0.9997873 0 0.02062489 0.9949766 0 0.1001091 0.994275 0 0.106852 0.9997873 0 0.02062489 0.9999278 0 0.01202841 0.9983712 0 0.05705279 0.9949766 0 0.1001091 1 0 0 1 0 0 0.9999278 0 0.01202841 0.9997873 0 0.02062489 0.8985834 0 0.4388027 0.9533496 0 0.3018684 0.975755 0 0.2188657 0.9786571 0 0.2055 0.9786571 0 0.2055 0.975755 0 0.2188657 0.9957556 0 0.09203729 0.9967075 0 0.08108163 0.975755 0 0.2188657 0.9949766 0 0.1001091 0.9983712 0 0.05705279 0.9957556 0 0.09203729 0.9533496 0 0.3018684 0.994275 0 0.106852 0.9949766 0 0.1001091 0.975755 0 0.2188657 1 0 0 0.9999051 0 0.01377612 0.9997898 0 0.02050063 1 0 0 1 0 0 0.9997898 0 0.02050063 0.9999278 0 0.01202841 1 0 0 0.9997898 0 0.02050063 0.9957556 0 0.09203729 0.9983712 0 0.05705279 0.9999278 0 0.01202841 0.9999051 0 0.01377612 0.9967075 0 0.08108163 0.9957556 0 0.09203729 0.9997898 0 0.02050063 0.9579384 0 0.2869743 0.9999921 0 -0.003969428 0.9999765 0 -0.006867481 0.9988912 0 -0.04707965 0.9988912 0 -0.04707965 0.9999765 0 -0.006867481 0.9958626 0 0.09087195 0.9975907 0 0.0693745 0.9999765 0 -0.006867481 0.9999847 0 -0.005523513 0.9980823 0 0.06190058 0.9958626 0 0.09087195 0.9999921 0 -0.003969428 0.9999784 0 0.006580285 0.9999847 0 -0.005523513 0.9999765 0 -0.006867481 0.8985834 0 0.4388027 0.9540788 0 0.299556 0.9849826 0 0.1726539 0.9533496 0 0.3018684 0.9533496 0 0.3018684 0.9849826 0 0.1726539 0.9967041 0 0.08112293 0.994275 0 0.106852 0.9849826 0 0.1726539 0.9958626 0 0.09087195 0.9980823 0 0.06190058 0.9967041 0 0.08112293 0.9540788 0 0.299556 0.9975907 0 0.0693745 0.9958626 0 0.09087195 0.9849826 0 0.1726539 1 0 0 0.9997491 0 0.02240226 0.999916 0 0.0129636 1 0 -1.67112e-4 1 0 -1.67112e-4 0.999916 0 0.0129636 0.9999847 0 -0.005523513 0.9999784 0 0.006580285 0.999916 0 0.0129636 0.9967041 0 0.08112293 0.9980823 0 0.06190058 0.9999847 0 -0.005523513 0.9997491 0 0.02240226 0.994275 0 0.106852 0.9967041 0 0.08112293 0.999916 0 0.0129636 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999429 0 0.01068715 0.9999139 0 -0.01312428 0.9999989 0 -0.00153169 0.9996566 0 -0.02620612 0.9996566 0 -0.02620612 0.9999989 0 -0.00153169 0.9984825 0 0.0550714 0.9986316 0 0.052298 0.9999989 0 -0.00153169 0.9999997 0 8.58221e-4 0.9992878 0 0.03773666 0.9984825 0 0.0550714 0.9999139 0 -0.01312428 0.9999843 0 -0.005606961 0.9999997 0 8.58221e-4 0.9999989 0 -0.00153169 0.9904941 0 0.1375555 0.9880999 0 0.153814 0.9929178 0 0.118804 0.9980875 0 0.06181692 0.9980875 0 0.06181692 0.9929178 0 0.118804 0.9985898 0 0.05308971 0.9995659 0 0.02946507 0.9929178 0 0.118804 0.9984825 0 0.0550714 0.9992878 0 0.03773666 0.9985898 0 0.05308971 0.9880999 0 0.153814 0.9986316 0 0.052298 0.9984825 0 0.0550714 0.9929178 0 0.118804 1 0 0 0.9999766 0 0.006836797 0.9999291 0 0.01191628 0.9999991 0 -0.001368713 0.9999991 0 -0.001368713 0.9999291 0 0.01191628 0.9999997 0 8.58221e-4 0.9999843 0 -0.005606961 0.9999291 0 0.01191628 0.9985898 0 0.05308971 0.9992878 0 0.03773666 0.9999997 0 8.58221e-4 0.9999766 0 0.006836797 0.9995659 0 0.02946507 0.9985898 0 0.05308971 0.9999291 0 0.01191628 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999599 0 0.008961941 0.9999416 0 0.01081525 0.9999475 0 0.0102535 0.999853 0 0.01715033 0.999853 0 0.01715033 0.9999475 0 0.0102535 0.999889 0 0.01490611 0.9997669 0 0.0215912 0.9999475 0 0.0102535 0.9999902 0 0.004437672 0.9999639 0 0.008491981 0.999889 0 0.01490611 0.9999416 0 0.01081525 0.9999932 0 0.003714163 0.9999902 0 0.004437672 0.9999475 0 0.0102535 0.9983872 0 -0.05677117 0.9997916 0 0.02041542 0.9999784 0 0.0065775 0.9998949 0 -0.01449831 0.9998949 0 -0.01449831 0.9999784 0 0.0065775 0.9999928 0 0.003781524 0.9999877 0 -0.004984303 0.9999784 0 0.0065775 0.999889 0 0.01490611 0.9999639 0 0.008491981 0.9999928 0 0.003781524 0.9997916 0 0.02041542 0.9997669 0 0.0215912 0.999889 0 0.01490611 0.9999784 0 0.0065775 1 0 0 0.9999974 0 -0.002292145 0.9999949 0 0.003229073 0.9999998 0 7.7419e-4 0.9999998 0 7.7419e-4 0.9999949 0 0.003229073 0.9999902 0 0.004437672 0.9999932 0 0.003714163 0.9999949 0 0.003229073 0.9999928 0 0.003781524 0.9999639 0 0.008491981 0.9999902 0 0.004437672 0.9999974 0 -0.002292145 0.9999877 0 -0.004984303 0.9999928 0 0.003781524 0.9999949 0 0.003229073 0.9753553 0 -0.2206403 0.9786368 0 -0.2055971 0.988906 0 -0.1485433 0.9691196 0 -0.246591 0.9691196 0 -0.246591 0.988906 0 -0.1485433 0.9970469 0 -0.07679655 0.9947858 0 -0.1019867 0.988906 0 -0.1485433 0.9974232 0 -0.07174363 0.9994973 0 -0.03170648 0.9970469 0 -0.07679655 0.9786368 0 -0.2055971 0.9959599 0 -0.08979937 0.9974232 0 -0.07174363 0.988906 0 -0.1485433 0.9999599 0 0.008961941 0.9998259 0 -0.018658 0.9996309 0 -0.02716934 0.9999998 0 -6.54515e-4 0.9999998 0 -6.54515e-4 0.9996309 0 -0.02716934 0.9999647 0 -0.008404197 1 0 0 0.9996309 0 -0.02716934 0.9970469 0 -0.07679655 0.9994973 0 -0.03170648 0.9999647 0 -0.008404197 0.9998259 0 -0.018658 0.9947858 0 -0.1019867 0.9970469 0 -0.07679655 0.9996309 0 -0.02716934 1 0 0 1 0 2.02364e-4 0.9998317 0 -0.01834512 0.9998208 0 -0.01893349 0.9998208 0 -0.01893349 0.9998317 0 -0.01834512 0.9974232 0 -0.07174363 0.9959599 0 -0.08979937 0.9998317 0 -0.01834512 0.9999647 0 -0.008404197 0.9994973 0 -0.03170648 0.9974232 0 -0.07174363 1 0 2.02364e-4 1 0 0 0.9999647 0 -0.008404197 0.9998317 0 -0.01834512 0.9753553 0 -0.2206403 0.9959633 0 -0.08976096 0.994679 0 -0.1030236 0.9786368 0 -0.2055971 0.9786368 0 -0.2055971 0.994679 0 -0.1030236 0.9980935 0 -0.06172056 0.9959599 0 -0.08979937 0.994679 0 -0.1030236 0.9985262 0 -0.05427296 0.9988281 0 -0.04839909 0.9980935 0 -0.06172056 0.9959633 0 -0.08976096 0.9995287 0 -0.03069692 0.9985262 0 -0.05427296 0.994679 0 -0.1030236 1 0 0 0.9998208 0 -0.01893349 0.9999258 0 -0.01219007 1 0 0 1 0 0 0.9999258 0 -0.01219007 0.9999419 0 -0.01078015 1 0 0 0.9999258 0 -0.01219007 0.9980935 0 -0.06172056 0.9988281 0 -0.04839909 0.9999419 0 -0.01078015 0.9998208 0 -0.01893349 0.9959599 0 -0.08979937 0.9980935 0 -0.06172056 0.9999258 0 -0.01219007 1 0 0 1 0 0 0.9999208 0 -0.01258682 0.9999877 0 -0.004965191 0.9999877 0 -0.004965191 0.9999208 0 -0.01258682 0.9985262 0 -0.05427296 0.9995287 0 -0.03069692 0.9999208 0 -0.01258682 0.9999419 0 -0.01078015 0.9988281 0 -0.04839909 0.9985262 0 -0.05427296 1 0 0 1 0 0 0.9999419 0 -0.01078015 0.9999208 0 -0.01258682 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9904941 0 0.1375555 0.9980875 0 0.06181692 0.9999609 0 0.008843318 0.9999965 0 -0.002688478 0.9999965 0 -0.002688478 0.9999609 0 0.008843318 0.9990721 0 -0.04307069 0.9948643 0 -0.101218 0.9999609 0 0.008843318 0.9999703 0 0.007722563 0.9998188 0 -0.01903455 0.9990721 0 -0.04307069 0.9980875 0 0.06181692 0.9995659 0 0.02946507 0.9999703 0 0.007722563 0.9999609 0 0.008843318 0.9994551 0 0.03300812 0.9782401 0 -0.2074765 0.9939323 0 -0.1099939 0.9876227 0 -0.1568488 0.9876227 0 -0.1568488 0.9939323 0 -0.1099939 0.9991015 0 -0.04238427 0.998175 0 -0.06038843 0.9939323 0 -0.1099939 0.9990721 0 -0.04307069 0.9998188 0 -0.01903455 0.9991015 0 -0.04238427 0.9782401 0 -0.2074765 0.9948643 0 -0.101218 0.9990721 0 -0.04307069 0.9939323 0 -0.1099939 1 0 0 0.9999203 0 -0.01263023 0.9999464 0 -0.01035091 0.9999766 0 0.006836797 0.9999766 0 0.006836797 0.9999464 0 -0.01035091 0.9999703 0 0.007722563 0.9995659 0 0.02946507 0.9999464 0 -0.01035091 0.9991015 0 -0.04238427 0.9998188 0 -0.01903455 0.9999703 0 0.007722563 0.9999203 0 -0.01263023 0.998175 0 -0.06038843 0.9991015 0 -0.04238427 0.9999464 0 -0.01035091 0.9579384 0 0.2869743 0.9876987 0 0.1563693 0.9992952 0 0.0375399 0.9999921 0 -0.003969428 0.9999921 0 -0.003969428 0.9992952 0 0.0375399 0.9999094 0 0.01346795 0.9999784 0 0.006580285 0.9992952 0 0.0375399 0.9998634 0 0.01653138 0.999993 0 0.0037424 0.9999094 0 0.01346795 0.9876987 0 0.1563693 0.9980933 0 0.06172335 0.9998634 0 0.01653138 0.9992952 0 0.0375399 1 0 0 1 0 -1.67112e-4 0.9999929 0 0.003780009 1 0 0 1 0 0 0.9999929 0 0.003780009 0.9999995 0 -0.001059579 1 0 0 0.9999929 0 0.003780009 0.9999094 0 0.01346795 0.999993 0 0.0037424 0.9999995 0 -0.001059579 1 0 -1.67112e-4 0.9999784 0 0.006580285 0.9999094 0 0.01346795 0.9999929 0 0.003780009 1 0 0 1 0 0 0.9999897 0 0.004530579 0.9999508 0 0.009919995 0.9999508 0 0.009919995 0.9999897 0 0.004530579 0.9998634 0 0.01653138 0.9980933 0 0.06172335 0.9999897 0 0.004530579 0.9999995 0 -0.001059579 0.999993 0 0.0037424 0.9998634 0 0.01653138 1 0 0 1 0 0 0.9999995 0 -0.001059579 0.9999897 0 0.004530579 1 0 0 1 0 0 0.9997863 0 -0.02067078 0.9999255 0 -0.01220641 0.9999255 0 -0.01220641 0.9997863 0 -0.02067078 0.9979035 0 -0.06472033 0.9982954 0 -0.0583628 0.9997863 0 -0.02067078 0.9999171 0 -0.01287676 0.9987608 0 -0.04976799 0.9979035 0 -0.06472033 1 0 0 1 0 0 0.9999171 0 -0.01287676 0.9997863 0 -0.02067078 0.9769479 0 -0.2134779 0.9918911 0 -0.1270905 0.989765 0 -0.1427068 0.9819977 0 -0.1888927 0.9819977 0 -0.1888927 0.989765 0 -0.1427068 0.9978548 0 -0.06546753 0.9967325 0 -0.0807729 0.989765 0 -0.1427068 0.9979035 0 -0.06472033 0.9987608 0 -0.04976799 0.9978548 0 -0.06546753 0.9918911 0 -0.1270905 0.9982954 0 -0.0583628 0.9979035 0 -0.06472033 0.989765 0 -0.1427068 1 0 0 0.9998137 0 -0.01930129 0.9998563 0 -0.0169566 1 0 0 1 0 0 0.9998563 0 -0.0169566 0.9999171 0 -0.01287676 1 0 0 0.9998563 0 -0.0169566 0.9978548 0 -0.06546753 0.9987608 0 -0.04976799 0.9999171 0 -0.01287676 0.9998137 0 -0.01930129 0.9967325 0 -0.0807729 0.9978548 0 -0.06546753 0.9998563 0 -0.0169566 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9855793 0 0.1692145 0.9978616 0 0.06536288 0.9998605 0 0.01670527 0.9996971 0 0.02461369 0.9996971 0 0.02461369 0.9998605 0 0.01670527 0.9997296 0 0.02325688 0.9998044 0 0.01978212 0.9998605 0 0.01670527 0.9999494 0 0.01005983 0.9998847 0 0.01518861 0.9997296 0 0.02325688 0.9978616 0 0.06536288 0.9997922 0 0.02038898 0.9999494 0 0.01005983 0.9998605 0 0.01670527 0.9954779 0 0.09499487 0.9988763 0 0.04739358 0.9984646 0 0.05539263 0.9977596 0 0.06690167 0.9977596 0 0.06690167 0.9984646 0 0.05539263 0.9998113 0 0.01942818 0.9998112 0 0.01943092 0.9984646 0 0.05539263 0.9997296 0 0.02325688 0.9998847 0 0.01518861 0.9998113 0 0.01942818 0.9988763 0 0.04739358 0.9998044 0 0.01978212 0.9997296 0 0.02325688 0.9984646 0 0.05539263 1 0 0 0.9999934 0 0.003635404 0.999978 0 0.006642813 0.9999922 0 0.003976187 0.9999922 0 0.003976187 0.999978 0 0.006642813 0.9999494 0 0.01005983 0.9997922 0 0.02038898 0.999978 0 0.006642813 0.9998113 0 0.01942818 0.9998847 0 0.01518861 0.9999494 0 0.01005983 0.9999934 0 0.003635404 0.9998112 0 0.01943092 0.9998113 0 0.01942818 0.999978 0 0.006642813 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9991851 0 0.04036171 0.9998369 0 0.0180628 0.9997896 0 0.02051667 0.999358 0 0.03582906 0.999358 0 0.03582906 0.9997896 0 0.02051667 0.9999248 0 0.012267 0.9998773 0 0.01566684 0.9997896 0 0.02051667 0.9999397 0 0.01098862 0.9999795 0 0.006419409 0.9999248 0 0.012267 0.9998369 0 0.0180628 0.999957 0 0.009277752 0.9999397 0 0.01098862 0.9997896 0 0.02051667 1 0 0 0.9999927 0 0.003833625 0.999996 0 0.00283488 1 0 0 1 0 0 0.999996 0 0.00283488 0.9999988 0 0.001571624 1 0 0 0.999996 0 0.00283488 0.9999248 0 0.012267 0.9999795 0 0.006419409 0.9999988 0 0.001571624 0.9999927 0 0.003833625 0.9998773 0 0.01566684 0.9999248 0 0.012267 0.999996 0 0.00283488 1 0 0 1 0 0 0.9999964 0 0.002690397 0.9999977 0 0.002147155 0.9999977 0 0.002147155 0.9999964 0 0.002690397 0.9999397 0 0.01098862 0.999957 0 0.009277752 0.9999964 0 0.002690397 0.9999988 0 0.001571624 0.9999795 0 0.006419409 0.9999397 0 0.01098862 1 0 0 1 0 0 0.9999988 0 0.001571624 0.9999964 0 0.002690397 0.9291631 0 -0.3696702 0.981133 0 -0.1933343 0.997922 0 -0.06443446 0.9698384 0 -0.2437488 0.9698384 0 -0.2437488 0.997922 0 -0.06443446 0.9998066 0 -0.01966404 0.9999805 0 -0.006253263 0.997922 0 -0.06443446 0.999427 0 -0.03384809 0.999883 0 -0.01530015 0.9998066 0 -0.01966404 0.981133 0 -0.1933343 0.9993466 0 -0.03614369 0.999427 0 -0.03384809 0.997922 0 -0.06443446 0.9980744 0 0.06203056 0.9995242 0 0.03084339 0.9994299 0 0.03376238 0.9992442 0 0.03887312 0.9992442 0 0.03887312 0.9994299 0 0.03376238 0.9999571 0 0.009257951 0.9999447 0 0.01051862 0.9994299 0 0.03376238 0.9998066 0 -0.01966404 0.999883 0 -0.01530015 0.9999571 0 0.009257951 0.9995242 0 0.03084339 0.9999805 0 -0.006253263 0.9998066 0 -0.01966404 0.9994299 0 0.03376238 1 0 0 0.999998 0 0.002018874 0.9999923 0 -0.003955444 0.9999797 0 -0.006374321 0.9999797 0 -0.006374321 0.9999923 0 -0.003955444 0.999427 0 -0.03384809 0.9993466 0 -0.03614369 0.9999923 0 -0.003955444 0.9999571 0 0.009257951 0.999883 0 -0.01530015 0.999427 0 -0.03384809 0.999998 0 0.002018874 0.9999447 0 0.01051862 0.9999571 0 0.009257951 0.9999923 0 -0.003955444 1 0 0 1 0 0 0.999981 0 -0.006170695 0.9999941 0 -0.00344183 0.9999941 0 -0.00344183 0.999981 0 -0.006170695 0.9997857 0 -0.02070516 0.9998604 0 -0.01671067 0.999981 0 -0.006170695 0.9999973 0 -0.002363167 0.9999271 0 -0.01207392 0.9997857 0 -0.02070516 1 0 0 1 0 0 0.9999973 0 -0.002363167 0.999981 0 -0.006170695 0.9987801 0 -0.04938017 0.9993811 0 -0.03517974 0.9993081 0 -0.03719437 0.9989959 0 -0.04480134 0.9989959 0 -0.04480134 0.9993081 0 -0.03719437 0.9998627 0 -0.01657252 0.9998076 0 -0.01961608 0.9993081 0 -0.03719437 0.9997857 0 -0.02070516 0.9999271 0 -0.01207392 0.9998627 0 -0.01657252 0.9993811 0 -0.03517974 0.9998604 0 -0.01671067 0.9997857 0 -0.02070516 0.9993081 0 -0.03719437 1 0 0 0.9999886 0 -0.004794565 0.9999915 0 -0.004151931 1 0 0 1 0 0 0.9999915 0 -0.004151931 0.9999973 0 -0.002363167 1 0 0 0.9999915 0 -0.004151931 0.9998627 0 -0.01657252 0.9999271 0 -0.01207392 0.9999973 0 -0.002363167 0.9999886 0 -0.004794565 0.9998076 0 -0.01961608 0.9998627 0 -0.01657252 0.9999915 0 -0.004151931 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9998745 0 0.01584739 0.9998888 0 0.01491308 0.9998888 0 0.01491308 0.9998745 0 0.01584739 0.9979751 0 0.06360596 0.9970225 0 0.07711184 0.9998745 0 0.01584739 0.9999214 0 0.01253722 0.998798 0 0.04901765 0.9979751 0 0.06360596 1 0 0 1 0 0 0.9999214 0 0.01253722 0.9998745 0 0.01584739 0.9769482 0 0.2134765 0.9823471 0 0.1870675 0.9898689 0 0.141984 0.9918915 0 0.1270881 0.9918915 0 0.1270881 0.9898689 0 0.141984 0.9979181 0 0.06449342 0.9982955 0 0.05836246 0.9898689 0 0.141984 0.9979751 0 0.06360596 0.998798 0 0.04901765 0.9979181 0 0.06449342 0.9823471 0 0.1870675 0.9970225 0 0.07711184 0.9979751 0 0.06360596 0.9898689 0 0.141984 1 0 0 0.9999256 0 0.01220741 0.9997877 0 0.02060984 1 0 0 1 0 0 0.9997877 0 0.02060984 0.9999214 0 0.01253722 1 0 0 0.9997877 0 0.02060984 0.9979181 0 0.06449342 0.998798 0 0.04901765 0.9999214 0 0.01253722 0.9999256 0 0.01220741 0.9982955 0 0.05836246 0.9979181 0 0.06449342 0.9997877 0 0.02060984 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999599 0 -0.008964198 0.9999413 0 -0.01084073 0.9999865 0 -0.005197714 0.9999999 0 5.95963e-4 0.9999999 0 5.95963e-4 0.9999865 0 -0.005197714 0.9999989 0 -0.001535348 1 0 3.0303e-4 0.9999865 0 -0.005197714 0.9999978 0 -0.002124394 0.9999996 0 -9.68794e-4 0.9999989 0 -0.001535348 0.9999413 0 -0.01084073 0.9999932 0 -0.003712647 0.9999978 0 -0.002124394 0.9999865 0 -0.005197714 1 0 0 1 0 2.02813e-4 0.9999999 0 -4.33371e-4 1 0 0 1 0 0 0.9999999 0 -4.33371e-4 1 0 0 1 0 0 0.9999999 0 -4.33371e-4 0.9999989 0 -0.001535348 0.9999996 0 -9.68794e-4 1 0 0 1 0 2.02813e-4 1 0 3.0303e-4 0.9999989 0 -0.001535348 0.9999999 0 -4.33371e-4 1 0 0 1 0 0 1 0 -3.83113e-4 0.9999998 0 -7.74605e-4 0.9999998 0 -7.74605e-4 1 0 -3.83113e-4 0.9999978 0 -0.002124394 0.9999932 0 -0.003712647 1 0 -3.83113e-4 1 0 0 0.9999996 0 -9.68794e-4 0.9999978 0 -0.002124394 1 0 0 1 0 0 1 0 0 1 0 -3.83113e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.975356 0 0.2206371 0.9958858 0 0.09061752 0.9992336 0 0.03914497 0.9995252 0 0.03081014 0.9995252 0 0.03081014 0.9992336 0 0.03914497 0.9941474 0 0.1080323 0.9955243 0 0.09450688 0.9992336 0 0.03914497 0.9996806 0 0.02527471 0.9971966 0 0.07482793 0.9941474 0 0.1080323 0.9958858 0 0.09061752 0.9994648 0 0.03271377 0.9996806 0 0.02527471 0.9992336 0 0.03914497 0.8949098 0 0.446247 0.9525902 0 0.3042567 0.9850821 0 0.1720852 0.952974 0 0.3030523 0.952974 0 0.3030523 0.9850821 0 0.1720852 0.9964044 0 0.08472505 0.9944849 0 0.1048799 0.9850821 0 0.1720852 0.9941474 0 0.1080323 0.9971966 0 0.07482793 0.9964044 0 0.08472505 0.9525902 0 0.3042567 0.9955243 0 0.09450688 0.9941474 0 0.1080323 0.9850821 0 0.1720852 1 0 0 0.999813 0 0.01934073 0.9997475 0 0.02247254 0.999983 0 0.00584397 0.999983 0 0.00584397 0.9997475 0 0.02247254 0.9996806 0 0.02527471 0.9994648 0 0.03271377 0.9997475 0 0.02247254 0.9964044 0 0.08472505 0.9971966 0 0.07482793 0.9996806 0 0.02527471 0.999813 0 0.01934073 0.9944849 0 0.1048799 0.9964044 0 0.08472505 0.9997475 0 0.02247254 0.9999599 0 -0.008964198 0.9999999 0 5.95963e-4 0.9997272 0 0.02335565 0.9998261 0 0.01864992 0.9998261 0 0.01864992 0.9997272 0 0.02335565 0.996993 0 0.07749248 0.9947866 0 0.1019792 0.9997272 0 0.02335565 0.9999682 0 0.007986273 0.9994791 0 0.03227682 0.996993 0 0.07749248 0.9999999 0 5.95963e-4 1 0 3.0303e-4 0.9999682 0 0.007986273 0.9997272 0 0.02335565 0.975356 0 0.2206371 0.9691202 0 0.2465889 0.9886225 0 0.1504185 0.9808141 0 0.1949453 0.9808141 0 0.1949453 0.9886225 0 0.1504185 0.9975913 0 0.06936616 0.9956857 0 0.0927903 0.9886225 0 0.1504185 0.996993 0 0.07749248 0.9994791 0 0.03227682 0.9975913 0 0.06936616 0.9691202 0 0.2465889 0.9947866 0 0.1019792 0.996993 0 0.07749248 0.9886225 0 0.1504185 1 0 0 0.999665 0 0.02588515 0.9998937 0 0.014585 1 0 2.02813e-4 1 0 2.02813e-4 0.9998937 0 0.014585 0.9999682 0 0.007986273 1 0 3.0303e-4 0.9998937 0 0.014585 0.9975913 0 0.06936616 0.9994791 0 0.03227682 0.9999682 0 0.007986273 0.999665 0 0.02588515 0.9956857 0 0.0927903 0.9975913 0 0.06936616 0.9998937 0 0.014585 0.8985836 0 -0.4388026 0.9533496 0 -0.3018685 0.9849828 0 -0.1726526 0.9540792 0 -0.2995549 0.9540792 0 -0.2995549 0.9849828 0 -0.1726526 0.995863 0 -0.09086904 0.9975908 0 -0.06937335 0.9849828 0 -0.1726526 0.9967041 0 -0.08112384 0.9980825 0 -0.06189835 0.995863 0 -0.09086904 0.9533496 0 -0.3018685 0.9942749 0 -0.1068527 0.9967041 0 -0.08112384 0.9849828 0 -0.1726526 0.9579388 0 -0.2869729 0.9988912 0 0.04707953 0.9999764 0 0.006868587 0.9999921 0 0.00396844 0.9999921 0 0.00396844 0.9999764 0 0.006868587 0.9999848 0 0.005523195 0.9999784 0 -0.006583546 0.9999764 0 0.006868587 0.995863 0 -0.09086904 0.9980825 0 -0.06189835 0.9999848 0 0.005523195 0.9988912 0 0.04707953 0.9975908 0 -0.06937335 0.995863 0 -0.09086904 0.9999764 0 0.006868587 1 0 0 1 0 1.66567e-4 0.999916 0 -0.01296236 0.9997491 0 -0.02240144 0.9997491 0 -0.02240144 0.999916 0 -0.01296236 0.9967041 0 -0.08112384 0.9942749 0 -0.1068527 0.999916 0 -0.01296236 0.9999848 0 0.005523195 0.9980825 0 -0.06189835 0.9967041 0 -0.08112384 1 0 1.66567e-4 0.9999784 0 -0.006583546 0.9999848 0 0.005523195 0.999916 0 -0.01296236 0.9994551 0 -0.0330089 0.9997497 0 0.02237438 0.9979582 0 0.06387185 0.9876527 0 0.1566596 0.9876527 0 0.1566596 0.9979582 0 0.06387185 0.9990937 0 0.04256669 0.9982052 0 0.0598864 0.9979582 0 0.06387185 0.9994602 0 0.03285348 0.9997657 0 0.02164816 0.9990937 0 0.04256669 0.9997497 0 0.02237438 0.9999919 0 0.004027958 0.9994602 0 0.03285348 0.9979582 0 0.06387185 1 0 0 0.9999217 0 0.01251858 0.9999309 0 0.01176013 1 0 0 1 0 0 0.9999309 0 0.01176013 0.9999855 0 0.005384617 1 0 0 0.9999309 0 0.01176013 0.9990937 0 0.04256669 0.9997657 0 0.02164816 0.9999855 0 0.005384617 0.9999217 0 0.01251858 0.9982052 0 0.0598864 0.9990937 0 0.04256669 0.9999309 0 0.01176013 1 0 0 1 0 0 0.9999648 0 0.008389616 0.9999967 0 0.002556024 0.9999967 0 0.002556024 0.9999648 0 0.008389616 0.9994602 0 0.03285348 0.9999919 0 0.004027958 0.9999648 0 0.008389616 0.9999855 0 0.005384617 0.9997657 0 0.02164816 0.9994602 0 0.03285348 1 0 0 1 0 0 0.9999855 0 0.005384617 0.9999648 0 0.008389616 0.9553122 0 -0.295599 0.9836385 0 -0.1801535 0.9987978 0 -0.04901983 0.9781577 0 -0.2078644 0.9781577 0 -0.2078644 0.9987978 0 -0.04901983 0.9995522 0 0.02992528 0.9999171 0 -0.01287782 0.9987978 0 -0.04901983 0.9997178 0 -0.02375646 0.9999929 0 0.003766119 0.9995522 0 0.02992528 0.9836385 0 -0.1801535 0.9989879 0 -0.04497956 0.9997178 0 -0.02375646 0.9987978 0 -0.04901983 0.9872676 0 0.1590685 0.9960112 0 0.08922833 0.9955942 0 0.09376706 0.9944568 0 0.1051462 0.9944568 0 0.1051462 0.9955942 0 0.09376706 0.9995821 0 0.02890823 0.9995713 0 0.02927995 0.9955942 0 0.09376706 0.9995522 0 0.02992528 0.9999929 0 0.003766119 0.9995821 0 0.02890823 0.9960112 0 0.08922833 0.9999171 0 -0.01287782 0.9995522 0 0.02992528 0.9955942 0 0.09376706 1 0 0 0.9999857 0 0.005349609 0.9999998 0 -7.32083e-4 0.9999704 0 -0.00768918 0.9999704 0 -0.00768918 0.9999998 0 -7.32083e-4 0.9997178 0 -0.02375646 0.9989879 0 -0.04497956 0.9999998 0 -7.32083e-4 0.9995821 0 0.02890823 0.9999929 0 0.003766119 0.9997178 0 -0.02375646 0.9999857 0 0.005349609 0.9995713 0 0.02927995 0.9995821 0 0.02890823 0.9999998 0 -7.32083e-4 1 0 0 0.9999704 0 -0.00768918 0.999929 0 -0.01191536 1 0 0 1 0 0 0.999929 0 -0.01191536 0.9999725 0 -0.00741294 1 0 0 0.999929 0 -0.01191536 0.9987545 0 -0.04989531 0.999319 0 -0.03690038 0.9999725 0 -0.00741294 0.9999704 0 -0.00768918 0.9989879 0 -0.04497956 0.9987545 0 -0.04989531 0.999929 0 -0.01191536 1 0 0 1 0 0 0.9998448 0 -0.01762042 0.9999474 0 -0.01025397 0.9999474 0 -0.01025397 0.9998448 0 -0.01762042 0.9979701 0 -0.06368462 0.9987135 0 -0.05070971 0.9998448 0 -0.01762042 0.9999725 0 -0.00741294 0.999319 0 -0.03690038 0.9979701 0 -0.06368462 1 0 0 1 0 0 0.9999725 0 -0.00741294 0.9998448 0 -0.01762042 0.9553122 0 -0.295599 0.9933333 0 -0.1152777 0.9919041 0 -0.1269894 0.9836385 0 -0.1801535 0.9836385 0 -0.1801535 0.9919041 0 -0.1269894 0.9987545 0 -0.04989531 0.9989879 0 -0.04497956 0.9919041 0 -0.1269894 0.9979701 0 -0.06368462 0.999319 0 -0.03690038 0.9987545 0 -0.04989531 0.9933333 0 -0.1152777 0.9987135 0 -0.05070971 0.9979701 0 -0.06368462 0.9919041 0 -0.1269894 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999924 0 0.00392247 0.9999998 0 6.6936e-4 0.9999974 0 -0.002292145 0.9999974 0 -0.002292145 0.9999998 0 6.6936e-4 0.9998786 0 -0.01558241 0.9999877 0 -0.004984303 0.9999998 0 6.6936e-4 0.9999142 0 0.01310594 0.9999818 0 -0.00604008 0.9998786 0 -0.01558241 0.9999924 0 0.00392247 0.9998896 0 0.01486632 0.9999142 0 0.01310594 0.9999998 0 6.6936e-4 0.9983872 0 -0.05677117 0.9998949 0 -0.01449831 0.9986275 0 -0.05237486 0.9973076 0 -0.07333284 0.9973076 0 -0.07333284 0.9986275 0 -0.05237486 0.9999588 0 -0.009087436 0.9999999 0 3.85065e-4 0.9986275 0 -0.05237486 0.9998786 0 -0.01558241 0.9999818 0 -0.00604008 0.9999588 0 -0.009087436 0.9998949 0 -0.01449831 0.9999877 0 -0.004984303 0.9998786 0 -0.01558241 0.9986275 0 -0.05237486 0.9999429 0 0.01068715 0.9986567 0 0.05181549 0.9996507 0 0.02643166 0.9995733 0 0.02920793 0.9995733 0 0.02920793 0.9996507 0 0.02643166 0.9999142 0 0.01310594 0.9998896 0 0.01486632 0.9996507 0 0.02643166 0.9999588 0 -0.009087436 0.9999818 0 -0.00604008 0.9999142 0 0.01310594 0.9986567 0 0.05181549 0.9999999 0 3.85065e-4 0.9999588 0 -0.009087436 0.9996507 0 0.02643166 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999976 0 0.00225002 0.9999924 0 0.00392247 0.9999924 0 0.00392247 0.9999976 0 0.00225002 0.9999717 0 0.007522993 0.9998896 0 0.01486632 0.9999976 0 0.00225002 0.9999987 0 0.001632384 0.999989 0 0.004701071 0.9999717 0 0.007522993 1 0 0 1 0 0 0.9999987 0 0.001632384 0.9999976 0 0.00225002 0.9999429 0 0.01068715 0.9995733 0 0.02920793 0.9999766 0 0.006845403 0.9999139 0 -0.01312428 0.9999139 0 -0.01312428 0.9999766 0 0.006845403 0.9999964 0 0.002672113 0.9999843 0 -0.005606961 0.9999766 0 0.006845403 0.9999717 0 0.007522993 0.999989 0 0.004701071 0.9999964 0 0.002672113 0.9995733 0 0.02920793 0.9998896 0 0.01486632 0.9999717 0 0.007522993 0.9999766 0 0.006845403 1 0 0 0.9999991 0 -0.001368713 0.9999996 0 9.22762e-4 1 0 0 1 0 0 0.9999996 0 9.22762e-4 0.9999987 0 0.001632384 1 0 0 0.9999996 0 9.22762e-4 0.9999964 0 0.002672113 0.999989 0 0.004701071 0.9999987 0 0.001632384 0.9999991 0 -0.001368713 0.9999843 0 -0.005606961 0.9999964 0 0.002672113 0.9999996 0 9.22762e-4 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 7.7419e-4 0.9999999 0 4.30492e-4 1 0 0 1 0 0 0.9999999 0 4.30492e-4 1 0 0 1 0 0 0.9999999 0 4.30492e-4 0.9999976 0 0.002207237 0.9999995 0 0.001097033 1 0 0 0.9999998 0 7.7419e-4 0.9999932 0 0.003714163 0.9999976 0 0.002207237 0.9999999 0 4.30492e-4 1 0 0 1 0 0 1 0 2.57701e-4 1 0 2.02364e-4 1 0 2.02364e-4 1 0 2.57701e-4 0.9999991 0 0.001332143 1 0 0 1 0 2.57701e-4 1 0 0 0.9999995 0 0.001097033 0.9999991 0 0.001332143 1 0 0 1 0 0 1 0 0 1 0 2.57701e-4 0.9999599 0 0.008961941 0.9999998 0 -6.54515e-4 0.9999862 0 0.005260899 0.9999416 0 0.01081525 0.9999416 0 0.01081525 0.9999862 0 0.005260899 0.9999976 0 0.002207237 0.9999932 0 0.003714163 0.9999862 0 0.005260899 0.9999991 0 0.001332143 0.9999995 0 0.001097033 0.9999976 0 0.002207237 0.9999998 0 -6.54515e-4 1 0 0 0.9999991 0 0.001332143 0.9999862 0 0.005260899 1 0 0 0.9999877 0 -0.004965191 0.9997305 0 -0.02321832 0.9997929 0 -0.02034946 0.9997929 0 -0.02034946 0.9997305 0 -0.02321832 0.99619 0 -0.08721009 0.9942444 0 -0.1071365 0.9997305 0 -0.02321832 0.9997031 0 -0.02437047 0.99709 0 -0.07623375 0.99619 0 -0.08721009 0.9999877 0 -0.004965191 0.9995287 0 -0.03069692 0.9997031 0 -0.02437047 0.9997305 0 -0.02321832 0.8949111 0 -0.4462447 0.9526175 0 -0.3041712 0.98478 0 -0.1738058 0.9525895 0 -0.304259 0.9525895 0 -0.304259 0.98478 0 -0.1738058 0.9941209 0 -0.1082759 0.9955242 0 -0.09450808 0.98478 0 -0.1738058 0.99619 0 -0.08721009 0.99709 0 -0.07623375 0.9941209 0 -0.1082759 0.9526175 0 -0.3041712 0.9942444 0 -0.1071365 0.99619 0 -0.08721009 0.98478 0 -0.1738058 0.9753553 0 -0.2206403 0.9995252 0 -0.03081075 0.9992606 0 -0.03844962 0.9959633 0 -0.08976096 0.9959633 0 -0.08976096 0.9992606 0 -0.03844962 0.9997031 0 -0.02437047 0.9995287 0 -0.03069692 0.9992606 0 -0.03844962 0.9941209 0 -0.1082759 0.99709 0 -0.07623375 0.9997031 0 -0.02437047 0.9995252 0 -0.03081075 0.9955242 0 -0.09450808 0.9941209 0 -0.1082759 0.9992606 0 -0.03844962 0.9769479 0 -0.2134779 0.9931045 0 -0.1172332 0.9992506 0 -0.03870846 0.9990907 0 -0.04263652 0.9990907 0 -0.04263652 0.9992506 0 -0.03870846 0.9962982 0 -0.0859644 0.9975318 0 -0.07021646 0.9992506 0 -0.03870846 0.999724 0 -0.02349335 0.9983563 0 -0.05731457 0.9962982 0 -0.0859644 0.9931045 0 -0.1172332 0.9988562 0 -0.0478139 0.999724 0 -0.02349335 0.9992506 0 -0.03870846 0.8949111 0 -0.4462447 0.9810404 0 -0.1938039 0.9770989 0 -0.2127858 0.9526175 0 -0.3041712 0.9526175 0 -0.3041712 0.9770989 0 -0.2127858 0.9951207 0 -0.09866556 0.9942444 0 -0.1071365 0.9770989 0 -0.2127858 0.9962982 0 -0.0859644 0.9983563 0 -0.05731457 0.9951207 0 -0.09866556 0.9810404 0 -0.1938039 0.9975318 0 -0.07021646 0.9962982 0 -0.0859644 0.9770989 0 -0.2127858 1 0 0 0.9997929 0 -0.02034946 0.9997423 0 -0.02270403 0.9999562 0 -0.009358967 0.9999562 0 -0.009358967 0.9997423 0 -0.02270403 0.999724 0 -0.02349335 0.9988562 0 -0.0478139 0.9997423 0 -0.02270403 0.9951207 0 -0.09866556 0.9983563 0 -0.05731457 0.999724 0 -0.02349335 0.9997929 0 -0.02034946 0.9942444 0 -0.1071365 0.9951207 0 -0.09866556 0.9997423 0 -0.02270403 1 0 0 0.9999562 0 -0.009358967 0.9998082 0 -0.01958532 1 0 0 1 0 0 0.9998082 0 -0.01958532 0.9998767 0 -0.01570079 1 0 0 0.9998082 0 -0.01958532 0.997255 0 -0.07404473 0.9993167 0 -0.03696111 0.9998767 0 -0.01570079 0.9999562 0 -0.009358967 0.9988562 0 -0.0478139 0.997255 0 -0.07404473 0.9998082 0 -0.01958532 1 0 0 1 0 0 0.9998891 0 -0.01490019 0.9998137 0 -0.01930129 0.9998137 0 -0.01930129 0.9998891 0 -0.01490019 0.9978004 0 -0.06629112 0.9967325 0 -0.0807729 0.9998891 0 -0.01490019 0.9998767 0 -0.01570079 0.9993167 0 -0.03696111 0.9978004 0 -0.06629112 1 0 0 1 0 0 0.9998767 0 -0.01570079 0.9998891 0 -0.01490019 0.9769479 0 -0.2134779 0.9819977 0 -0.1888927 0.9928369 0 -0.1194782 0.9931045 0 -0.1172332 0.9931045 0 -0.1172332 0.9928369 0 -0.1194782 0.997255 0 -0.07404473 0.9988562 0 -0.0478139 0.9928369 0 -0.1194782 0.9978004 0 -0.06629112 0.9993167 0 -0.03696111 0.997255 0 -0.07404473 0.9819977 0 -0.1888927 0.9967325 0 -0.0807729 0.9978004 0 -0.06629112 0.9928369 0 -0.1194782 1 0 0 0.9999936 0 -0.003571543 0.9999595 0 -0.008996403 1 0 0 1 0 0 0.9999595 0 -0.008996403 0.9999747 0 -0.007116205 1 0 0 0.9999595 0 -0.008996403 0.9993941 0 -0.03480714 0.9997342 0 -0.02305716 0.9999747 0 -0.007116205 0.9999936 0 -0.003571543 0.9999799 0 -0.006358742 0.9993941 0 -0.03480714 0.9999595 0 -0.008996403 1 0 0 1 0 0 0.9999049 0 -0.01379689 0.9999203 0 -0.01263023 0.9999203 0 -0.01263023 0.9999049 0 -0.01379689 0.9989107 0 -0.04666538 0.998175 0 -0.06038843 0.9999049 0 -0.01379689 0.9999747 0 -0.007116205 0.9997342 0 -0.02305716 0.9989107 0 -0.04666538 1 0 0 1 0 0 0.9999747 0 -0.007116205 0.9999049 0 -0.01379689 0.9994551 0 0.03300812 0.9876227 0 -0.1568488 0.9978707 0 -0.06522277 0.9997315 0 -0.02317441 0.9997315 0 -0.02317441 0.9978707 0 -0.06522277 0.9993941 0 -0.03480714 0.9999799 0 -0.006358742 0.9978707 0 -0.06522277 0.9989107 0 -0.04666538 0.9997342 0 -0.02305716 0.9993941 0 -0.03480714 0.9876227 0 -0.1568488 0.998175 0 -0.06038843 0.9989107 0 -0.04666538 0.9978707 0 -0.06522277 1 0 0 0.9999508 0 0.009919995 0.999344 0 0.03621702 0.9999936 0 -0.003571543 0.9999936 0 -0.003571543 0.999344 0 0.03621702 0.9970409 0 0.07687236 0.9999799 0 -0.006358742 0.999344 0 0.03621702 0.9915622 0 0.1296321 0.9793654 0 0.2020978 0.9970409 0 0.07687236 0.9999508 0 0.009919995 0.9980933 0 0.06172335 0.9915622 0 0.1296321 0.999344 0 0.03621702 0.9994551 0 0.03300812 0.9997315 0 -0.02317441 0.9725001 0 0.2329025 0.8794755 0 0.4759441 0.8794755 0 0.4759441 0.9725001 0 0.2329025 0.9342653 0 0.3565791 0.8332445 0 0.5529048 0.9725001 0 0.2329025 0.9970409 0 0.07687236 0.9793654 0 0.2020978 0.9342653 0 0.3565791 0.9997315 0 -0.02317441 0.9999799 0 -0.006358742 0.9970409 0 0.07687236 0.9725001 0 0.2329025 0.9579384 0 0.2869743 0.7101538 0 0.7040466 0.9098725 0 0.4148879 0.9876987 0 0.1563693 0.9876987 0 0.1563693 0.9098725 0 0.4148879 0.9915622 0 0.1296321 0.9980933 0 0.06172335 0.9098725 0 0.4148879 0.9342653 0 0.3565791 0.9793654 0 0.2020978 0.9915622 0 0.1296321 0.7101538 0 0.7040466 0.8332445 0 0.5529048 0.9342653 0 0.3565791 0.9098725 0 0.4148879 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999896 0 0.004572397 0.9999934 0 0.003635404 0.9999934 0 0.003635404 0.9999896 0 0.004572397 0.9998156 0 0.01920603 0.9998112 0 0.01943092 0.9999896 0 0.004572397 0.9999969 0 0.00252986 0.9999107 0 0.01336804 0.9998156 0 0.01920603 1 0 0 1 0 0 0.9999969 0 0.00252986 0.9999896 0 0.004572397 0.9954779 0 0.09499487 0.9977596 0 0.06690167 0.9987533 0 0.04991892 0.9991667 0 0.04081583 0.9991667 0 0.04081583 0.9987533 0 0.04991892 0.9997373 0 0.02292297 0.999851 0 0.01726562 0.9987533 0 0.04991892 0.9998156 0 0.01920603 0.9999107 0 0.01336804 0.9997373 0 0.02292297 0.9977596 0 0.06690167 0.9998112 0 0.01943092 0.9998156 0 0.01920603 0.9987533 0 0.04991892 1 0 0 0.9999942 0 0.00344187 0.9999796 0 0.00639368 1 0 0 1 0 0 0.9999796 0 0.00639368 0.9999969 0 0.00252986 1 0 0 0.9999796 0 0.00639368 0.9997373 0 0.02292297 0.9999107 0 0.01336804 0.9999969 0 0.00252986 0.9999942 0 0.00344187 0.999851 0 0.01726562 0.9997373 0 0.02292297 0.9999796 0 0.00639368 1 0 0 0.9999996 0 8.73929e-4 0.9999967 0 0.002558809 0.999998 0 0.002018874 0.999998 0 0.002018874 0.9999967 0 0.002558809 0.999957 0 0.009269492 0.9999447 0 0.01051862 0.9999967 0 0.002558809 0.9999951 0 0.003151383 0.9999833 0 0.005801634 0.999957 0 0.009269492 0.9999996 0 8.73929e-4 0.9999928 0 0.003794762 0.9999951 0 0.003151383 0.9999967 0 0.002558809 0.9980744 0 0.06203056 0.9992442 0 0.03887312 0.9997221 0 0.02357415 0.9996903 0 0.02488692 0.9996903 0 0.02488692 0.9997221 0 0.02357415 0.9999768 0 0.006822229 0.9999055 0 0.01375214 0.9997221 0 0.02357415 0.999957 0 0.009269492 0.9999833 0 0.005801634 0.9999768 0 0.006822229 0.9992442 0 0.03887312 0.9999447 0 0.01051862 0.999957 0 0.009269492 0.9997221 0 0.02357415 0.9999969 0 0.002527875 0.99998 0 0.00632861 0.9999718 0 0.007510649 0.9999551 0 0.009486125 0.9999551 0 0.009486125 0.9999718 0 0.007510649 0.9999951 0 0.003151383 0.9999928 0 0.003794762 0.9999718 0 0.007510649 0.9999768 0 0.006822229 0.9999833 0 0.005801634 0.9999951 0 0.003151383 0.99998 0 0.00632861 0.9999055 0 0.01375214 0.9999768 0 0.006822229 0.9999718 0 0.007510649 1 0 0 0.9999922 0 0.003976187 0.9999718 0 0.007515751 0.9999999 0 3.89166e-4 0.9999999 0 3.89166e-4 0.9999718 0 0.007515751 0.9999901 0 0.00444652 0.9999987 0 0.001668263 0.9999718 0 0.007515751 0.9993737 0 0.03538947 0.9995803 0 0.02896951 0.9999901 0 0.00444652 0.9999922 0 0.003976187 0.9997922 0 0.02038898 0.9993737 0 0.03538947 0.9999718 0 0.007515751 0.9999969 0 0.002527875 0.9999891 0 0.004688044 0.999989 0 0.004692016 0.9999918 0 -0.004038785 0.9999918 0 -0.004038785 0.999989 0 0.004692016 0.9980558 0 0.06232788 0.9984868 0 0.05499244 0.999989 0 0.004692016 0.9999901 0 0.00444652 0.9995803 0 0.02896951 0.9980558 0 0.06232788 0.9999891 0 0.004688044 0.9999987 0 0.001668263 0.9999901 0 0.00444652 0.999989 0 0.004692016 0.9855793 0 0.1692145 0.9860262 0 0.1665905 0.9922214 0 0.124486 0.9978616 0 0.06536288 0.9978616 0 0.06536288 0.9922214 0 0.124486 0.9993737 0 0.03538947 0.9997922 0 0.02038898 0.9922214 0 0.124486 0.9980558 0 0.06232788 0.9995803 0 0.02896951 0.9993737 0 0.03538947 0.9860262 0 0.1665905 0.9984868 0 0.05499244 0.9980558 0 0.06232788 0.9922214 0 0.124486 0.9999969 0 0.002527875 0.9999551 0 0.009486125 0.9999867 0 0.005171327 0.9999891 0 0.004688044 0.9999891 0 0.004688044 0.9999867 0 0.005171327 0.9999962 0 0.002745821 0.9999987 0 0.001668263 0.9999867 0 0.005171327 0.9999951 0 0.003152906 0.9999987 0 0.001677116 0.9999962 0 0.002745821 0.9999551 0 0.009486125 0.9999928 0 0.003794762 0.9999951 0 0.003152906 0.9999867 0 0.005171327 1 0 0 0.9999999 0 3.89166e-4 0.9999998 0 6.79e-4 1 0 0 1 0 0 0.9999998 0 6.79e-4 0.9999999 0 4.02599e-4 1 0 0 0.9999998 0 6.79e-4 0.9999962 0 0.002745821 0.9999987 0 0.001677116 0.9999999 0 4.02599e-4 0.9999999 0 3.89166e-4 0.9999987 0 0.001668263 0.9999962 0 0.002745821 0.9999998 0 6.79e-4 1 0 0 1 0 0 0.9999998 0 7.28164e-4 0.9999996 0 8.73929e-4 0.9999996 0 8.73929e-4 0.9999998 0 7.28164e-4 0.9999951 0 0.003152906 0.9999928 0 0.003794762 0.9999998 0 7.28164e-4 0.9999999 0 4.02599e-4 0.9999987 0 0.001677116 0.9999951 0 0.003152906 1 0 0 1 0 0 0.9999999 0 4.02599e-4 0.9999998 0 7.28164e-4 1 0 0 1 0 0 0.9999945 0 0.003328481 0.9999927 0 0.003833625 0.9999927 0 0.003833625 0.9999945 0 0.003328481 0.9999121 0 0.01326304 0.9998773 0 0.01566684 0.9999945 0 0.003328481 0.9999982 0 0.001903221 0.9999532 0 0.009686266 0.9999121 0 0.01326304 1 0 0 1 0 0 0.9999982 0 0.001903221 0.9999945 0 0.003328481 0.9991851 0 0.04036171 0.999358 0 0.03582906 0.9995565 0 0.02977771 0.9996035 0 0.02815791 0.9996035 0 0.02815791 0.9995565 0 0.02977771 0.9998625 0 0.01658688 0.9999101 0 0.01340973 0.9995565 0 0.02977771 0.9999121 0 0.01326304 0.9999532 0 0.009686266 0.9998625 0 0.01658688 0.999358 0 0.03582906 0.9998773 0 0.01566684 0.9999121 0 0.01326304 0.9995565 0 0.02977771 1 0 0 0.9999962 0 0.002768246 0.9999878 0 0.004950364 1 0 0 1 0 0 0.9999878 0 0.004950364 0.9999982 0 0.001903221 1 0 0 0.9999878 0 0.004950364 0.9998625 0 0.01658688 0.9999532 0 0.009686266 0.9999982 0 0.001903221 0.9999962 0 0.002768246 0.9999101 0 0.01340973 0.9998625 0 0.01658688 0.9999878 0 0.004950364 1 0 0 0.9999977 0 0.002147155 0.9999717 0 0.00752843 0.9999857 0 0.005349609 0.9999857 0 0.005349609 0.9999717 0 0.00752843 0.9995822 0 0.0289072 0.9995713 0 0.02927995 0.9999717 0 0.00752843 0.9999818 0 0.006046386 0.9997978 0 0.02010975 0.9995822 0 0.0289072 0.9999977 0 0.002147155 0.999957 0 0.009277752 0.9999818 0 0.006046386 0.9999717 0 0.00752843 0.9872676 0 0.1590685 0.9944568 0 0.1051462 0.9971833 0 0.07500274 0.9981605 0 0.06062739 0.9981605 0 0.06062739 0.9971833 0 0.07500274 0.9994112 0 0.03431256 0.9996479 0 0.02653953 0.9971833 0 0.07500274 0.9995822 0 0.0289072 0.9997978 0 0.02010975 0.9994112 0 0.03431256 0.9944568 0 0.1051462 0.9995713 0 0.02927995 0.9995822 0 0.0289072 0.9971833 0 0.07500274 0.9991851 0 0.04036171 0.9999616 0 0.00877068 0.9999403 0 0.01093013 0.9998369 0 0.0180628 0.9998369 0 0.0180628 0.9999403 0 0.01093013 0.9999818 0 0.006046386 0.999957 0 0.009277752 0.9999403 0 0.01093013 0.9994112 0 0.03431256 0.9997978 0 0.02010975 0.9999818 0 0.006046386 0.9999616 0 0.00877068 0.9996479 0 0.02653953 0.9994112 0 0.03431256 0.9999403 0 0.01093013 1 0 0 0.9999967 0 -0.00255967 0.9999944 0 -0.003362472 1 0 0 1 0 0 0.9999944 0 -0.003362472 0.9999981 0 -0.00196926 1 0 0 0.9999944 0 -0.003362472 0.9999063 0 -0.01369494 0.9999676 0 -0.008052825 0.9999981 0 -0.00196926 0.9999967 0 -0.00255967 0.999938 0 -0.01113892 0.9999063 0 -0.01369494 0.9999944 0 -0.003362472 1 0 0 1 0 0 0.9999937 0 -0.003552085 0.9999886 0 -0.004794565 0.9999886 0 -0.004794565 0.9999937 0 -0.003552085 0.9998819 0 -0.01537056 0.9998076 0 -0.01961608 0.9999937 0 -0.003552085 0.9999981 0 -0.00196926 0.9999676 0 -0.008052825 0.9998819 0 -0.01537056 1 0 0 1 0 0 0.9999981 0 -0.00196926 0.9999937 0 -0.003552085 0.9987801 0 -0.04938017 0.9989959 0 -0.04480134 0.9996717 0 -0.02562319 0.9997704 0 -0.02143207 0.9997704 0 -0.02143207 0.9996717 0 -0.02562319 0.9999063 0 -0.01369494 0.999938 0 -0.01113892 0.9996717 0 -0.02562319 0.9998819 0 -0.01537056 0.9999676 0 -0.008052825 0.9999063 0 -0.01369494 0.9989959 0 -0.04480134 0.9998076 0 -0.01961608 0.9998819 0 -0.01537056 0.9996717 0 -0.02562319 1 0 0 0.9999797 0 -0.006374321 0.9999538 0 -0.009618151 0.9999967 0 -0.00255967 0.9999967 0 -0.00255967 0.9999538 0 -0.009618151 0.9999751 0 -0.007052013 0.999938 0 -0.01113892 0.9999538 0 -0.009618151 0.9993061 0 -0.03724973 0.9996708 0 -0.02566015 0.9999751 0 -0.007052013 0.9999797 0 -0.006374321 0.9993466 0 -0.03614369 0.9993061 0 -0.03724973 0.9999538 0 -0.009618151 0.9987801 0 -0.04938017 0.9997704 0 -0.02143207 0.9999219 0 -0.01249711 0.9999624 0 -0.008672977 0.9999624 0 -0.008672977 0.9999219 0 -0.01249711 0.9990267 0 -0.04411159 0.999428 0 -0.03382056 0.9999219 0 -0.01249711 0.9999751 0 -0.007052013 0.9996708 0 -0.02566015 0.9990267 0 -0.04411159 0.9997704 0 -0.02143207 0.999938 0 -0.01113892 0.9999751 0 -0.007052013 0.9999219 0 -0.01249711 0.9291631 0 -0.3696702 0.996853 0 -0.07927331 0.9955279 0 -0.09446873 0.981133 0 -0.1933343 0.981133 0 -0.1933343 0.9955279 0 -0.09446873 0.9993061 0 -0.03724973 0.9993466 0 -0.03614369 0.9955279 0 -0.09446873 0.9990267 0 -0.04411159 0.9996708 0 -0.02566015 0.9993061 0 -0.03724973 0.996853 0 -0.07927331 0.999428 0 -0.03382056 0.9990267 0 -0.04411159 0.9955279 0 -0.09446873 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.99979 0 -0.02049942 0.9999052 0 -0.01377387 0.9999052 0 -0.01377387 0.99979 0 -0.02049942 0.9957557 0 -0.09203623 0.9967077 0 -0.08107894 0.99979 0 -0.02049942 0.9999276 0 -0.01203016 0.998371 0 -0.05705654 0.9957557 0 -0.09203623 1 0 0 1 0 0 0.9999276 0 -0.01203016 0.99979 0 -0.02049942 0.8985836 0 -0.4388026 0.9786578 0 -0.2054967 0.9757551 0 -0.2188655 0.9533496 0 -0.3018685 0.9533496 0 -0.3018685 0.9757551 0 -0.2188655 0.9949762 0 -0.1001124 0.9942749 0 -0.1068527 0.9757551 0 -0.2188655 0.9957557 0 -0.09203623 0.998371 0 -0.05705654 0.9949762 0 -0.1001124 0.9786578 0 -0.2054967 0.9967077 0 -0.08107894 0.9957557 0 -0.09203623 0.9757551 0 -0.2188655 1 0 0 0.9997491 0 -0.02240144 0.9997872 0 -0.02062753 1 0 0 1 0 0 0.9997872 0 -0.02062753 0.9999276 0 -0.01203016 1 0 0 0.9997872 0 -0.02062753 0.9949762 0 -0.1001124 0.998371 0 -0.05705654 0.9999276 0 -0.01203016 0.9997491 0 -0.02240144 0.9942749 0 -0.1068527 0.9949762 0 -0.1001124 0.9997872 0 -0.02062753 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.999943 0 -0.01068649 0.9995784 0 -0.02903599 0.9996531 0 -0.02633923 0.9986569 0 -0.05181257 0.9986569 0 -0.05181257 0.9996531 0 -0.02633923 0.9999588 0 0.009081315 0.9999999 0 -3.87104e-4 0.9996531 0 -0.02633923 0.999916 0 -0.01296829 0.9999816 0 0.006075846 0.9999588 0 0.009081315 0.9995784 0 -0.02903599 0.999895 0 -0.01449359 0.999916 0 -0.01296829 0.9996531 0 -0.02633923 0.9983875 0 0.0567681 0.9973076 0 0.07333278 0.9986264 0 0.05239721 0.9998958 0 0.01443529 0.9998958 0 0.01443529 0.9986264 0 0.05239721 0.9998782 0 0.01561375 0.9999819 0 0.006017816 0.9986264 0 0.05239721 0.9999588 0 0.009081315 0.9999816 0 0.006075846 0.9998782 0 0.01561375 0.9973076 0 0.07333278 0.9999999 0 -3.87104e-4 0.9999588 0 0.009081315 0.9986264 0 0.05239721 1 0 0 0.9999989 0 0.001486514 0.9999998 0 -5.977e-4 0.9999931 0 -0.00373766 0.9999931 0 -0.00373766 0.9999998 0 -5.977e-4 0.999916 0 -0.01296829 0.999895 0 -0.01449359 0.9999998 0 -5.977e-4 0.9998782 0 0.01561375 0.9999816 0 0.006075846 0.999916 0 -0.01296829 0.9999989 0 0.001486514 0.9999819 0 0.006017816 0.9998782 0 0.01561375 0.9999998 0 -5.977e-4 1 0 0 0.9999994 0 0.001139103 0.9999086 0 -0.01352623 0.9999825 0 -0.005933173 0.9999825 0 -0.005933173 0.9999086 0 -0.01352623 0.9986198 0 -0.05252151 0.999676 0 -0.02545355 0.9999086 0 -0.01352623 0.9999998 0 -7.88023e-4 0.9992964 0 -0.03750859 0.9986198 0 -0.05252151 0.9999994 0 0.001139103 0.9999851 0 0.005468677 0.9999998 0 -7.88023e-4 0.9999086 0 -0.01352623 0.9904941 0 -0.137555 0.9981203 0 -0.06128644 0.9929371 0 -0.1186416 0.9880995 0 -0.1538159 0.9880995 0 -0.1538159 0.9929371 0 -0.1186416 0.9984885 0 -0.05496065 0.9986317 0 -0.05229653 0.9929371 0 -0.1186416 0.9986198 0 -0.05252151 0.9992964 0 -0.03750859 0.9984885 0 -0.05496065 0.9981203 0 -0.06128644 0.999676 0 -0.02545355 0.9986198 0 -0.05252151 0.9929371 0 -0.1186416 0.999943 0 -0.01068649 0.9996566 0 0.02620723 0.9999989 0 0.001548697 0.9999152 0 0.01303035 0.9999152 0 0.01303035 0.9999989 0 0.001548697 0.9999998 0 -7.88023e-4 0.9999851 0 0.005468677 0.9999989 0 0.001548697 0.9984885 0 -0.05496065 0.9992964 0 -0.03750859 0.9999998 0 -7.88023e-4 0.9996566 0 0.02620723 0.9986317 0 -0.05229653 0.9984885 0 -0.05496065 0.9999989 0 0.001548697 1 0 0 1 0 0 0.9999995 0 -0.001042067 0.9999994 0 0.001139103 0.9999994 0 0.001139103 0.9999995 0 -0.001042067 0.9999958 0 -0.002917903 0.9999851 0 0.005468677 0.9999995 0 -0.001042067 0.9999987 0 -0.001641547 0.9999888 0 -0.004748974 0.9999958 0 -0.002917903 1 0 0 1 0 0 0.9999987 0 -0.001641547 0.9999995 0 -0.001042067 0.999943 0 -0.01068649 0.9999152 0 0.01303035 0.9999764 0 -0.006872804 0.9995784 0 -0.02903599 0.9995784 0 -0.02903599 0.9999764 0 -0.006872804 0.9999737 0 -0.007264797 0.999895 0 -0.01449359 0.9999764 0 -0.006872804 0.9999958 0 -0.002917903 0.9999888 0 -0.004748974 0.9999737 0 -0.007264797 0.9999152 0 0.01303035 0.9999851 0 0.005468677 0.9999958 0 -0.002917903 0.9999764 0 -0.006872804 1 0 0 0.9999931 0 -0.00373766 0.9999979 0 -0.002076905 1 0 0 1 0 0 0.9999979 0 -0.002076905 0.9999987 0 -0.001641547 1 0 0 0.9999979 0 -0.002076905 0.9999737 0 -0.007264797 0.9999888 0 -0.004748974 0.9999987 0 -0.001641547 0.9999931 0 -0.00373766 0.999895 0 -0.01449359 0.9999737 0 -0.007264797 0.9999979 0 -0.002076905 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999614 0 0.008788778 0.9997665 0 0.02161057 0.999813 0 0.01934073 0.999813 0 0.01934073 0.9997665 0 0.02161057 0.9952362 0 0.09749358 0.9944849 0 0.1048799 0.9997665 0 0.02161057 0.9997593 0 0.02194537 0.9984221 0 0.05615459 0.9952362 0 0.09749358 0.9999614 0 0.008788778 0.9989053 0 0.04677973 0.9997593 0 0.02194537 0.9997665 0 0.02161057 0.8949098 0 0.446247 0.952974 0 0.3030523 0.9771856 0 0.2123874 0.9810408 0 0.1938013 0.9810408 0 0.1938013 0.9771856 0 0.2123874 0.9963443 0 0.08542883 0.9975321 0 0.07021141 0.9771856 0 0.2123874 0.9952362 0 0.09749358 0.9984221 0 0.05615459 0.9963443 0 0.08542883 0.952974 0 0.3030523 0.9944849 0 0.1048799 0.9952362 0 0.09749358 0.9771856 0 0.2123874 0.9769482 0 0.2134765 0.9990908 0 0.04263419 0.9992816 0 0.03790108 0.9931445 0 0.1168934 0.9931445 0 0.1168934 0.9992816 0 0.03790108 0.9997593 0 0.02194537 0.9989053 0 0.04677973 0.9992816 0 0.03790108 0.9963443 0 0.08542883 0.9984221 0 0.05615459 0.9997593 0 0.02194537 0.9990908 0 0.04263419 0.9975321 0 0.07021141 0.9963443 0 0.08542883 0.9992816 0 0.03790108 0.9769482 0 0.2134765 0.9931445 0 0.1168934 0.9931446 0 0.116893 0.9823471 0 0.1870675 0.9823471 0 0.1870675 0.9931446 0 0.116893 0.99801 0 0.06305777 0.9970225 0 0.07711184 0.9931446 0 0.116893 0.9973424 0 0.07285748 0.9993809 0 0.03518242 0.99801 0 0.06305777 0.9931445 0 0.1168934 0.9989053 0 0.04677973 0.9973424 0 0.07285748 0.9931446 0 0.116893 1 0 0 0.9998888 0 0.01491308 0.9999107 0 0.01336866 1 0 0 1 0 0 0.9999107 0 0.01336866 0.9998388 0 0.01795361 1 0 0 0.9999107 0 0.01336866 0.99801 0 0.06305777 0.9993809 0 0.03518242 0.9998388 0 0.01795361 0.9998888 0 0.01491308 0.9970225 0 0.07711184 0.99801 0 0.06305777 0.9999107 0 0.01336866 1 0 0 1 0 0 0.999816 0 0.01918385 0.9999614 0 0.008788778 0.9999614 0 0.008788778 0.999816 0 0.01918385 0.9973424 0 0.07285748 0.9989053 0 0.04677973 0.999816 0 0.01918385 0.9998388 0 0.01795361 0.9993809 0 0.03518242 0.9973424 0 0.07285748 1 0 0 1 0 0 0.9998388 0 0.01795361 0.999816 0 0.01918385 1 0 0 0.9999998 0 -7.74605e-4 0.9999945 0 -0.003354809 0.9999989 0 0.001486514 0.9999989 0 0.001486514 0.9999945 0 -0.003354809 0.9999943 0 -0.003390767 0.9999819 0 0.006017816 0.9999945 0 -0.003354809 0.9999896 0 -0.004557915 0.9999614 0 -0.008799301 0.9999943 0 -0.003390767 0.9999998 0 -7.74605e-4 0.9999932 0 -0.003712647 0.9999896 0 -0.004557915 0.9999945 0 -0.003354809 0.9983875 0 0.0567681 0.9998958 0 0.01443529 0.9999766 0 -0.006848505 0.9997916 0 -0.02041589 0.9997916 0 -0.02041589 0.9999766 0 -0.006848505 0.9998878 0 -0.01498551 0.9997669 0 -0.02159272 0.9999766 0 -0.006848505 0.9999943 0 -0.003390767 0.9999614 0 -0.008799301 0.9998878 0 -0.01498551 0.9998958 0 0.01443529 0.9999819 0 0.006017816 0.9999943 0 -0.003390767 0.9999766 0 -0.006848505 0.9999599 0 -0.008964198 0.999853 0 -0.01715229 0.9999469 0 -0.0103153 0.9999413 0 -0.01084073 0.9999413 0 -0.01084073 0.9999469 0 -0.0103153 0.9999896 0 -0.004557915 0.9999932 0 -0.003712647 0.9999469 0 -0.0103153 0.9998878 0 -0.01498551 0.9999614 0 -0.008799301 0.9999896 0 -0.004557915 0.999853 0 -0.01715229 0.9997669 0 -0.02159272 0.9998878 0 -0.01498551 0.9999469 0 -0.0103153 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.999983 0 0.00584397 0.9999106 0 0.01337534 1 0 0 1 0 0 0.9999106 0 0.01337534 0.9999405 0 0.01091482 1 0 0 0.9999106 0 0.01337534 0.9983985 0 0.05657277 0.9986472 0 0.05199758 0.9999405 0 0.01091482 0.999983 0 0.00584397 0.9994648 0 0.03271377 0.9983985 0 0.05657277 0.9999106 0 0.01337534 1 0 0 1 0 0 0.9998218 0 0.01887485 0.999665 0 0.02588515 0.999665 0 0.02588515 0.9998218 0 0.01887485 0.9961635 0 0.08751184 0.9956857 0 0.0927903 0.9998218 0 0.01887485 0.9999405 0 0.01091482 0.9986472 0 0.05199758 0.9961635 0 0.08751184 1 0 0 1 0 0 0.9999405 0 0.01091482 0.9998218 0 0.01887485 0.975356 0 0.2206371 0.9808141 0 0.1949453 0.9949324 0 0.1005462 0.9958858 0 0.09061752 0.9958858 0 0.09061752 0.9949324 0 0.1005462 0.9983985 0 0.05657277 0.9994648 0 0.03271377 0.9949324 0 0.1005462 0.9961635 0 0.08751184 0.9986472 0 0.05199758 0.9983985 0 0.05657277 0.9808141 0 0.1949453 0.9956857 0 0.0927903 0.9961635 0 0.08751184 0.9949324 0 0.1005462 1 0 0 0.9999498 0 -0.01001984 0.99999 0 -0.00446685 1 0 0 1 0 0 0.99999 0 -0.00446685 0.9999992 0 0.001293229 1 0 0 0.99999 0 -0.00446685 0.999869 0 -0.01619043 0.9999941 0 -0.00344144 0.9999992 0 0.001293229 0.9999498 0 -0.01001984 0.9980575 0 -0.06230112 0.999869 0 -0.01619043 0.99999 0 -0.00446685 1 0 0 1 0 0 0.9999931 0 -0.003741379 1 0 1.66567e-4 1 0 1.66567e-4 0.9999931 0 -0.003741379 0.9999114 0 -0.01331922 0.9999784 0 -0.006583546 0.9999931 0 -0.003741379 0.9999992 0 0.001293229 0.9999941 0 -0.00344144 0.9999114 0 -0.01331922 1 0 0 1 0 0 0.9999992 0 0.001293229 0.9999931 0 -0.003741379 0.9579388 0 -0.2869729 0.9999921 0 0.00396844 0.9992988 0 -0.0374447 0.9876064 0 -0.1569509 0.9876064 0 -0.1569509 0.9992988 0 -0.0374447 0.999869 0 -0.01619043 0.9980575 0 -0.06230112 0.9992988 0 -0.0374447 0.9999114 0 -0.01331922 0.9999941 0 -0.00344144 0.999869 0 -0.01619043 0.9999921 0 0.00396844 0.9999784 0 -0.006583546 0.9999114 0 -0.01331922 0.9992988 0 -0.0374447 0.9579388 0 -0.2869729 0.9876064 0 -0.1569509 0.9096418 0 -0.4153937 0.7101527 0 -0.7040476 0.7101527 0 -0.7040476 0.9096418 0 -0.4153937 0.9340931 0 -0.3570297 0.8332462 0 -0.5529022 0.9096418 0 -0.4153937 0.991379 0 -0.1310251 0.9791132 0 -0.2033162 0.9340931 0 -0.3570297 0.9876064 0 -0.1569509 0.9980575 0 -0.06230112 0.991379 0 -0.1310251 0.9096418 0 -0.4153937 0.9994551 0 -0.0330089 0.8794763 0 -0.4759427 0.9723489 0 -0.2335334 0.9997497 0 0.02237438 0.9997497 0 0.02237438 0.9723489 0 -0.2335334 0.9968674 0 -0.07909223 0.9999919 0 0.004027958 0.9723489 0 -0.2335334 0.9340931 0 -0.3570297 0.9791132 0 -0.2033162 0.9968674 0 -0.07909223 0.8794763 0 -0.4759427 0.8332462 0 -0.5529022 0.9340931 0 -0.3570297 0.9723489 0 -0.2335334 1 0 0 0.9999967 0 0.002556024 0.9992793 0 -0.03795833 0.9999498 0 -0.01001984 0.9999498 0 -0.01001984 0.9992793 0 -0.03795833 0.991379 0 -0.1310251 0.9980575 0 -0.06230112 0.9992793 0 -0.03795833 0.9968674 0 -0.07909223 0.9791132 0 -0.2033162 0.991379 0 -0.1310251 0.9999967 0 0.002556024 0.9999919 0 0.004027958 0.9968674 0 -0.07909223 0.9992793 0 -0.03795833</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_Shape8-texbinormals-array" count="3552" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_Shape8-vertices" name="qt_gauge_background_Shape8-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_Shape8-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_Shape8-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_Shape8-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_Shape8-binormals"/>
+ </vertices>
+ <triangles material="lambert7SG" count="1776">
+ <input semantic="VERTEX" source="#qt_gauge_background_Shape8-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_Shape8-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_Shape8-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_Shape8-texbinormals" offset="2" set="0"/>
+ <p>52 52 0 706 706 1 701 701 3 701 701 3 706 706 1 257 257 2 701 701 4 257 257 5 129 129 7 129 129 7 257 257 5 479 479 6 257 257 8 481 481 9 479 479 11 479 479 11 481 481 9 183 55 10 706 706 12 131 131 13 257 257 15 257 257 15 131 131 13 481 481 14 41 41 16 702 702 17 703 703 19 703 703 19 702 702 17 258 258 18 703 703 20 258 258 21 130 130 23 130 130 23 258 258 21 480 480 22 479 479 25 183 55 26 258 258 24 258 258 24 183 55 26 480 480 27 129 129 29 479 479 30 702 702 28 702 702 28 479 479 30 258 258 31 43 43 32 704 704 33 705 705 35 705 705 35 704 704 33 259 259 34 705 705 36 259 259 37 131 131 39 131 131 39 259 259 37 481 481 38 480 480 41 183 55 42 259 259 40 259 259 40 183 55 42 481 481 43 704 704 44 130 130 45 259 259 47 259 259 47 130 130 45 480 480 46 31 31 48 712 712 49 707 707 51 707 707 51 712 712 49 260 260 50 707 707 52 260 260 53 132 132 55 132 132 55 260 260 53 482 482 54 260 260 56 484 484 57 482 482 59 482 482 59 484 484 57 184 56 58 134 134 61 484 484 62 712 712 60 712 712 60 484 484 62 260 260 63 708 708 65 261 261 66 30 30 64 30 30 64 261 261 66 709 709 67 261 261 69 483 483 70 709 709 68 709 709 68 483 483 70 133 133 71 482 482 73 184 56 74 261 261 72 261 261 72 184 56 74 483 483 75 132 132 77 482 482 78 708 708 76 708 708 76 482 482 78 261 261 79 29 29 80 710 710 81 711 711 83 711 711 83 710 710 81 262 262 82 711 711 84 262 262 85 134 134 87 134 134 87 262 262 85 484 484 86 262 262 88 483 483 89 484 484 91 484 484 91 483 483 89 184 56 90 710 710 92 133 133 93 262 262 95 262 262 95 133 133 93 483 483 94 26 26 96 718 718 97 713 713 99 713 713 99 718 718 97 263 263 98 713 713 100 263 263 101 135 135 103 135 135 103 263 263 101 485 485 102 487 487 105 185 57 106 263 263 104 263 263 104 185 57 106 485 485 107 137 137 109 487 487 110 718 718 108 718 718 108 487 487 110 263 263 111 714 714 113 264 264 114 11 11 112 11 11 112 264 264 114 715 715 115 264 264 117 486 486 118 715 715 116 715 715 116 486 486 118 136 136 119 485 485 121 185 57 122 264 264 120 264 264 120 185 57 122 486 486 123 135 135 125 485 485 126 714 714 124 714 714 124 485 485 126 264 264 127 9 9 128 716 716 129 717 717 131 717 717 131 716 716 129 265 265 130 717 717 132 265 265 133 137 137 135 137 137 135 265 265 133 487 487 134 265 265 136 486 486 137 487 487 139 487 487 139 486 486 137 185 57 138 716 716 140 136 136 141 265 265 143 265 265 143 136 136 141 486 486 142 25 25 144 722 722 145 719 719 147 719 719 147 722 722 145 266 266 146 719 719 148 266 266 149 138 138 151 138 138 151 266 266 149 488 488 150 266 266 152 490 490 153 488 488 155 488 488 155 490 490 153 186 58 154 139 139 157 490 490 158 722 722 156 722 722 156 490 490 158 266 266 159 11 11 160 720 720 161 714 714 163 714 714 163 720 720 161 267 267 162 714 714 164 267 267 165 135 135 167 135 135 167 267 267 165 489 489 166 488 488 169 186 58 170 267 267 168 267 267 168 186 58 170 489 489 171 138 138 173 488 488 174 720 720 172 720 720 172 488 488 174 267 267 175 713 713 177 268 268 178 26 26 176 26 26 176 268 268 178 721 721 179 268 268 181 490 490 182 721 721 180 721 721 180 490 490 182 139 139 183 489 489 185 186 58 186 268 268 184 268 268 184 186 58 186 490 490 187 135 135 189 489 489 190 713 713 188 713 713 188 489 489 190 268 268 191 17 17 192 728 728 193 723 723 195 723 723 195 728 728 193 269 269 194 723 723 196 269 269 197 140 140 199 140 140 199 269 269 197 491 491 198 269 269 200 493 493 201 491 491 203 491 491 203 493 493 201 187 59 202 728 728 204 142 142 205 269 269 207 269 269 207 142 142 205 493 493 206 724 724 209 270 270 210 15 15 208 15 15 208 270 270 210 725 725 211 270 270 213 492 492 214 725 725 212 725 725 212 492 492 214 141 141 215 491 491 217 187 59 218 270 270 216 270 270 216 187 59 218 492 492 219 140 140 221 491 491 222 724 724 220 724 724 220 491 491 222 270 270 223 13 13 224 726 726 225 727 727 227 727 727 227 726 726 225 271 271 226 271 271 229 493 493 230 727 727 228 727 727 228 493 493 230 142 142 231 492 492 233 187 59 234 271 271 232 271 271 232 187 59 234 493 493 235 726 726 236 141 141 237 271 271 239 271 271 239 141 141 237 492 492 238 5 5 240 734 734 241 729 729 243 729 729 243 734 734 241 272 272 242 729 729 244 272 272 245 143 143 247 143 143 247 272 272 245 494 494 246 272 272 248 496 496 249 494 494 251 494 494 251 496 496 249 188 60 250 734 734 252 145 145 253 272 272 255 272 272 255 145 145 253 496 496 254 730 730 257 273 273 258 12 12 256 12 12 256 273 273 258 731 731 259 273 273 261 495 495 262 731 731 260 731 731 260 495 495 262 144 144 263 494 494 265 188 60 266 273 273 264 273 273 264 188 60 266 495 495 267 143 143 269 494 494 270 730 730 268 730 730 268 494 494 270 273 273 271 732 732 273 274 274 274 15 15 272 15 15 272 274 274 274 733 733 275 274 274 277 496 496 278 733 733 276 733 733 276 496 496 278 145 145 279 495 495 281 188 60 282 274 274 280 274 274 280 188 60 282 496 496 283 732 732 284 144 144 285 274 274 287 274 274 287 144 144 285 495 495 286 21 21 288 740 740 289 735 735 291 735 735 291 740 740 289 275 275 290 735 735 292 275 275 293 146 146 295 146 146 295 275 275 293 497 497 294 275 275 296 499 499 297 497 497 299 497 497 299 499 499 297 189 61 298 740 740 300 148 148 301 275 275 303 275 275 303 148 148 301 499 499 302 736 736 305 276 276 306 19 19 304 19 19 304 276 276 306 737 737 307 276 276 309 498 498 310 737 737 308 737 737 308 498 498 310 147 147 311 497 497 313 189 61 314 276 276 312 276 276 312 189 61 314 498 498 315 146 146 317 497 497 318 736 736 316 736 736 316 497 497 318 276 276 319 17 17 320 738 738 321 739 739 323 739 739 323 738 738 321 277 277 322 277 277 325 499 499 326 739 739 324 739 739 324 499 499 326 148 148 327 498 498 329 189 61 330 277 277 328 277 277 328 189 61 330 499 499 331 738 738 332 147 147 333 277 277 335 277 277 335 147 147 333 498 498 334 20 20 336 746 746 337 741 741 339 741 741 339 746 746 337 278 278 338 741 741 340 278 278 341 149 149 343 149 149 343 278 278 341 500 500 342 278 278 344 502 502 345 500 500 347 500 500 347 502 502 345 190 62 346 746 746 348 151 151 349 278 278 351 278 278 351 151 151 349 502 502 350 16 16 352 742 742 353 743 743 355 743 743 355 742 742 353 279 279 354 743 743 356 279 279 357 150 150 359 150 150 359 279 279 357 501 501 358 500 500 361 190 62 362 279 279 360 279 279 360 190 62 362 501 501 363 149 149 365 500 500 366 742 742 364 742 742 364 500 500 366 279 279 367 19 19 368 744 744 369 745 745 371 745 745 371 744 744 369 280 280 370 280 280 373 502 502 374 745 745 372 745 745 372 502 502 374 151 151 375 501 501 377 190 62 378 280 280 376 280 280 376 190 62 378 502 502 379 744 744 380 150 150 381 280 280 383 280 280 383 150 150 381 501 501 382 18 18 384 752 752 385 747 747 387 747 747 387 752 752 385 281 281 386 747 747 388 281 281 389 152 152 391 152 152 391 281 281 389 503 503 390 281 281 392 505 505 393 503 503 395 503 503 395 505 505 393 191 63 394 752 752 396 154 154 397 281 281 399 281 281 399 154 154 397 505 505 398 20 20 400 748 748 401 749 749 403 749 749 403 748 748 401 282 282 402 282 282 405 504 504 406 749 749 404 749 749 404 504 504 406 153 153 407 503 503 409 191 63 410 282 282 408 282 282 408 191 63 410 504 504 411 748 748 412 152 152 413 282 282 415 282 282 415 152 152 413 503 503 414 21 21 416 750 750 417 751 751 419 751 751 419 750 750 417 283 283 418 751 751 420 283 283 421 154 154 423 154 154 423 283 283 421 505 505 422 504 504 425 191 63 426 283 283 424 283 283 424 191 63 426 505 505 427 750 750 428 153 153 429 283 283 431 283 283 431 153 153 429 504 504 430 18 18 432 756 756 433 752 752 435 752 752 435 756 756 433 284 284 434 752 752 436 284 284 437 154 154 439 154 154 439 284 284 437 506 506 438 508 508 441 192 64 442 284 284 440 284 284 440 192 64 442 506 506 443 156 156 445 508 508 446 756 756 444 756 756 444 508 508 446 284 284 447 751 751 449 285 285 450 21 21 448 21 21 448 285 285 450 753 753 451 285 285 453 507 507 454 753 753 452 753 753 452 507 507 454 155 155 455 506 506 457 192 64 458 285 285 456 285 285 456 192 64 458 507 507 459 154 154 461 506 506 462 751 751 460 751 751 460 506 506 462 285 285 463 22 22 464 754 754 465 755 755 467 755 755 467 754 754 465 286 286 466 755 755 468 286 286 469 156 156 471 156 156 471 286 286 469 508 508 470 286 286 472 507 507 473 508 508 475 508 508 475 507 507 473 192 64 474 754 754 476 155 155 477 286 286 479 286 286 479 155 155 477 507 507 478 22 22 480 762 762 481 757 757 483 757 757 483 762 762 481 287 287 482 757 757 484 287 287 485 157 157 487 157 157 487 287 287 485 509 509 486 287 287 488 511 511 489 509 509 491 509 509 491 511 511 489 193 65 490 762 762 492 159 159 493 287 287 495 287 287 495 159 159 493 511 511 494 758 758 497 288 288 498 17 17 496 17 17 496 288 288 498 759 759 499 288 288 501 510 510 502 759 759 500 759 759 500 510 510 502 158 158 503 509 509 505 193 65 506 288 288 504 288 288 504 193 65 506 510 510 507 157 157 509 509 509 510 758 758 508 758 758 508 509 509 510 288 288 511 23 23 512 760 760 513 761 761 515 761 761 515 760 760 513 289 289 514 761 761 516 289 289 517 159 159 519 159 159 519 289 289 517 511 511 518 289 289 520 510 510 521 511 511 523 511 511 523 510 510 521 193 65 522 760 760 524 158 158 525 289 289 527 289 289 527 158 158 525 510 510 526 12 12 528 731 731 529 763 763 531 763 763 531 731 731 529 290 290 530 290 290 533 512 512 534 763 763 532 763 763 532 512 512 534 160 160 535 514 514 537 194 66 538 290 290 536 290 290 536 194 66 538 512 512 539 731 731 540 144 144 541 290 290 543 290 290 543 144 144 541 514 514 542 24 24 544 764 764 545 765 765 547 765 765 547 764 764 545 291 291 546 765 765 548 291 291 549 161 161 551 161 161 551 291 291 549 513 513 550 291 291 552 512 512 553 513 513 555 513 513 555 512 512 553 194 66 554 764 764 556 160 160 557 291 291 559 291 291 559 160 160 557 512 512 558 15 15 560 766 766 561 732 732 563 732 732 563 766 766 561 292 292 562 292 292 565 514 514 566 732 732 564 732 732 564 514 514 566 144 144 567 513 513 569 194 66 570 292 292 568 292 292 568 194 66 570 514 514 571 161 161 573 513 513 574 766 766 572 766 766 572 513 513 574 292 292 575 25 25 576 770 770 577 722 722 579 722 722 579 770 770 577 293 293 578 722 722 580 293 293 581 139 139 583 139 139 583 293 293 581 515 515 582 293 293 584 517 517 585 515 515 587 515 515 587 517 517 585 195 67 586 770 770 588 163 163 589 293 293 591 293 293 591 163 163 589 517 517 590 26 26 592 721 721 593 767 767 595 767 767 595 721 721 593 294 294 594 294 294 597 516 516 598 767 767 596 767 767 596 516 516 598 162 162 599 515 515 601 195 67 602 294 294 600 294 294 600 195 67 602 516 516 603 139 139 605 515 515 606 721 721 604 721 721 604 515 515 606 294 294 607 13 13 608 768 768 609 769 769 611 769 769 611 768 768 609 295 295 610 295 295 613 517 517 614 769 769 612 769 769 612 517 517 614 163 163 615 295 295 616 516 516 617 517 517 619 517 517 619 516 516 617 195 67 618 768 768 620 162 162 621 295 295 623 295 295 623 162 162 621 516 516 622 8 8 624 776 776 625 771 771 627 771 771 627 776 776 625 296 296 626 771 771 628 296 296 629 164 164 631 164 164 631 296 296 629 518 518 630 296 296 632 520 520 633 518 518 635 518 518 635 520 520 633 196 68 634 166 166 637 520 520 638 776 776 636 776 776 636 520 520 638 296 296 639 772 772 641 297 297 642 10 10 640 10 10 640 297 297 642 773 773 643 297 297 645 519 519 646 773 773 644 773 773 644 519 519 646 165 165 647 518 518 649 196 68 650 297 297 648 297 297 648 196 68 650 519 519 651 164 164 653 518 518 654 772 772 652 772 772 652 518 518 654 297 297 655 23 23 656 774 774 657 775 775 659 775 775 659 774 774 657 298 298 658 775 775 660 298 298 661 166 166 663 166 166 663 298 298 661 520 520 662 298 298 664 519 519 665 520 520 667 520 520 667 519 519 665 196 68 666 774 774 668 165 165 669 298 298 671 298 298 671 165 165 669 519 519 670 9 9 672 780 780 673 777 777 675 777 777 675 780 780 673 299 299 674 777 777 676 299 299 677 167 167 679 167 167 679 299 299 677 521 521 678 523 523 681 197 69 682 299 299 680 299 299 680 197 69 682 521 521 683 168 168 685 523 523 686 780 780 684 780 780 684 523 523 686 299 299 687 778 778 689 300 300 690 29 29 688 29 29 688 300 300 690 710 710 691 300 300 693 522 522 694 710 710 692 710 710 692 522 522 694 133 133 695 521 521 697 197 69 698 300 300 696 300 300 696 197 69 698 522 522 699 167 167 701 521 521 702 778 778 700 778 778 700 521 521 702 300 300 703 30 30 704 709 709 705 779 779 707 779 779 707 709 709 705 301 301 706 779 779 708 301 301 709 168 168 711 168 168 711 301 301 709 523 523 710 301 301 712 522 522 713 523 523 715 523 523 715 522 522 713 197 69 714 709 709 716 133 133 717 301 301 719 301 301 719 133 133 717 522 522 718 8 8 720 786 786 721 781 781 723 781 781 723 786 786 721 302 302 722 781 781 724 302 302 725 169 169 727 169 169 727 302 302 725 524 524 726 302 302 728 526 526 729 524 524 731 524 524 731 526 526 729 198 70 730 786 786 732 171 171 733 302 302 735 302 302 735 171 171 733 526 526 734 27 27 736 782 782 737 783 783 739 783 783 739 782 782 737 303 303 738 783 783 740 303 303 741 170 170 743 170 170 743 303 303 741 525 525 742 524 524 745 198 70 746 303 303 744 303 303 744 198 70 746 525 525 747 782 782 748 169 169 749 303 303 751 303 303 751 169 169 749 524 524 750 30 30 752 784 784 753 785 785 755 785 785 755 784 784 753 304 304 754 304 304 757 526 526 758 785 785 756 785 785 756 526 526 758 171 171 759 525 525 761 198 70 762 304 304 760 304 304 760 198 70 762 526 526 763 170 170 765 525 525 766 784 784 764 784 784 764 525 525 766 304 304 767 4 4 768 792 792 769 787 787 771 787 787 771 792 792 769 305 305 770 787 787 772 305 305 773 172 172 775 172 172 775 305 305 773 527 527 774 529 529 777 199 71 778 305 305 776 305 305 776 199 71 778 527 527 779 792 792 780 174 174 781 305 305 783 305 305 783 174 174 781 529 529 782 788 788 785 306 306 786 28 28 784 28 28 784 306 306 786 789 789 787 306 306 789 528 528 790 789 789 788 789 789 788 528 528 790 173 173 791 527 527 793 199 71 794 306 306 792 306 306 792 199 71 794 528 528 795 172 172 797 527 527 798 788 788 796 788 788 796 527 527 798 306 306 799 30 30 800 790 790 801 791 791 803 791 791 803 790 790 801 307 307 802 791 791 804 307 307 805 174 174 807 174 174 807 307 307 805 529 529 806 307 307 808 528 528 809 529 529 811 529 529 811 528 528 809 199 71 810 790 790 812 173 173 813 307 307 815 307 307 815 173 173 813 528 528 814 32 32 816 798 798 817 793 793 819 793 793 819 798 798 817 308 308 818 793 793 820 308 308 821 175 175 823 175 175 823 308 308 821 530 530 822 308 308 824 532 532 825 530 530 827 530 530 827 532 532 825 200 72 826 798 798 828 177 177 829 308 308 831 308 308 831 177 177 829 532 532 830 794 794 833 309 309 834 37 37 832 37 37 832 309 309 834 795 795 835 309 309 837 531 531 838 795 795 836 795 795 836 531 531 838 176 176 839 530 530 841 200 72 842 309 309 840 309 309 840 200 72 842 531 531 843 175 175 845 530 530 846 794 794 844 794 794 844 530 530 846 309 309 847 36 36 848 796 796 849 797 797 851 797 797 851 796 796 849 310 310 850 310 310 853 532 532 854 797 797 852 797 797 852 532 532 854 177 177 855 531 531 857 200 72 858 310 310 856 310 310 856 200 72 858 532 532 859 796 796 860 176 176 861 310 310 863 310 310 863 176 176 861 531 531 862 34 34 864 804 804 865 799 799 867 799 799 867 804 804 865 311 311 866 799 799 868 311 311 869 178 178 871 178 178 871 311 311 869 533 533 870 311 311 872 535 535 873 533 533 875 533 533 875 535 535 873 201 73 874 804 804 876 180 180 877 311 311 879 311 311 879 180 180 877 535 535 878 800 800 881 312 312 882 36 36 880 36 36 880 312 312 882 801 801 883 312 312 885 534 534 886 801 801 884 801 801 884 534 534 886 179 179 887 533 533 889 201 73 890 312 312 888 312 312 888 201 73 890 534 534 891 178 178 893 533 533 894 800 800 892 800 800 892 533 533 894 312 312 895 31 31 896 802 802 897 803 803 899 803 803 899 802 802 897 313 313 898 313 313 901 535 535 902 803 803 900 803 803 900 535 535 902 180 180 903 534 534 905 201 73 906 313 313 904 313 313 904 201 73 906 535 535 907 802 802 908 179 179 909 313 313 911 313 313 911 179 179 909 534 534 910 3 3 912 810 810 913 805 805 915 805 805 915 810 810 913 314 314 914 314 314 917 536 536 918 805 805 916 805 805 916 536 536 918 181 181 919 538 538 921 202 74 922 314 314 920 314 314 920 202 74 922 536 536 923 55 183 925 538 538 926 810 810 924 810 810 924 538 538 926 314 314 927 806 806 929 315 315 930 7 7 928 7 7 928 315 315 930 807 807 931 315 315 933 537 537 934 807 807 932 807 807 932 537 537 934 182 182 935 536 536 937 202 74 938 315 315 936 315 315 936 202 74 938 537 537 939 181 181 941 536 536 942 806 806 940 806 806 940 536 536 942 315 315 943 31 31 944 808 808 945 809 809 947 809 809 947 808 808 945 316 316 946 809 809 948 316 316 949 55 183 951 55 183 951 316 316 949 538 538 950 316 316 952 537 537 953 538 538 955 538 538 955 537 537 953 202 74 954 808 808 956 182 182 957 316 316 959 316 316 959 182 182 957 537 537 958 33 33 960 816 816 961 811 811 963 811 811 963 816 816 961 317 317 962 811 811 964 317 317 965 56 184 967 56 184 967 317 317 965 539 539 966 541 541 969 203 75 970 317 317 968 317 317 968 203 75 970 539 539 971 58 186 973 541 541 974 816 816 972 816 816 972 541 541 974 317 317 975 812 812 977 318 318 978 35 35 976 35 35 976 318 318 978 813 813 979 318 318 981 540 540 982 813 813 980 813 813 980 540 540 982 57 185 983 539 539 985 203 75 986 318 318 984 318 318 984 203 75 986 540 540 987 56 184 989 539 539 990 812 812 988 812 812 988 539 539 990 318 318 991 36 36 992 814 814 993 815 815 995 815 815 995 814 814 993 319 319 994 815 815 996 319 319 997 58 186 999 58 186 999 319 319 997 541 541 998 319 319 1000 540 540 1001 541 541 1003 541 541 1003 540 540 1001 203 75 1002 814 814 1004 57 185 1005 319 319 1007 319 319 1007 57 185 1005 540 540 1006 54 54 1008 822 822 1009 817 817 1011 817 817 1011 822 822 1009 320 320 1010 817 817 1012 320 320 1013 59 187 1015 59 187 1015 320 320 1013 542 542 1014 320 320 1016 544 544 1017 542 542 1019 542 542 1019 544 544 1017 204 76 1018 822 822 1020 61 189 1021 320 320 1023 320 320 1023 61 189 1021 544 544 1022 818 818 1025 321 321 1026 40 40 1024 40 40 1024 321 321 1026 819 819 1027 321 321 1029 543 543 1030 819 819 1028 819 819 1028 543 543 1030 60 188 1031 542 542 1033 204 76 1034 321 321 1032 321 321 1032 204 76 1034 543 543 1035 59 187 1037 542 542 1038 818 818 1036 818 818 1036 542 542 1038 321 321 1039 37 37 1040 820 820 1041 821 821 1043 821 821 1043 820 820 1041 322 322 1042 322 322 1045 544 544 1046 821 821 1044 821 821 1044 544 544 1046 61 189 1047 543 543 1049 204 76 1050 322 322 1048 322 322 1048 204 76 1050 544 544 1051 820 820 1052 60 188 1053 322 322 1055 322 322 1055 60 188 1053 543 543 1054 44 44 1056 828 828 1057 823 823 1059 823 823 1059 828 828 1057 323 323 1058 823 823 1060 323 323 1061 62 190 1063 62 190 1063 323 323 1061 545 545 1062 323 323 1064 547 547 1065 545 545 1067 545 545 1067 547 547 1065 205 77 1066 828 828 1068 64 192 1069 323 323 1071 323 323 1071 64 192 1069 547 547 1070 824 824 1073 324 324 1074 39 39 1072 39 39 1072 324 324 1074 825 825 1075 324 324 1077 546 546 1078 825 825 1076 825 825 1076 546 546 1078 63 191 1079 545 545 1081 205 77 1082 324 324 1080 324 324 1080 205 77 1082 546 546 1083 62 190 1085 545 545 1086 824 824 1084 824 824 1084 545 545 1086 324 324 1087 33 33 1088 826 826 1089 827 827 1091 827 827 1091 826 826 1089 325 325 1090 325 325 1093 547 547 1094 827 827 1092 827 827 1092 547 547 1094 64 192 1095 325 325 1096 546 546 1097 547 547 1099 547 547 1099 546 546 1097 205 77 1098 826 826 1100 63 191 1101 325 325 1103 325 325 1103 63 191 1101 546 546 1102 48 48 1104 834 834 1105 829 829 1107 829 829 1107 834 834 1105 326 326 1106 829 829 1108 326 326 1109 65 193 1111 65 193 1111 326 326 1109 548 548 1110 550 550 1113 206 78 1114 326 326 1112 326 326 1112 206 78 1114 548 548 1115 67 195 1117 550 550 1118 834 834 1116 834 834 1116 550 550 1118 326 326 1119 45 45 1120 830 830 1121 831 831 1123 831 831 1123 830 830 1121 327 327 1122 327 327 1125 549 549 1126 831 831 1124 831 831 1124 549 549 1126 66 194 1127 548 548 1129 206 78 1130 327 327 1128 327 327 1128 206 78 1130 549 549 1131 65 193 1133 548 548 1134 830 830 1132 830 830 1132 548 548 1134 327 327 1135 43 43 1136 832 832 1137 833 833 1139 833 833 1139 832 832 1137 328 328 1138 833 833 1140 328 328 1141 67 195 1143 67 195 1143 328 328 1141 550 550 1142 328 328 1144 549 549 1145 550 550 1147 550 550 1147 549 549 1145 206 78 1146 832 832 1148 66 194 1149 328 328 1151 328 328 1151 66 194 1149 549 549 1150 44 44 1152 840 840 1153 835 835 1155 835 835 1155 840 840 1153 329 329 1154 835 835 1156 329 329 1157 68 196 1159 68 196 1159 329 329 1157 551 551 1158 329 329 1160 553 553 1161 551 551 1163 551 551 1163 553 553 1161 207 79 1162 840 840 1164 70 198 1165 329 329 1167 329 329 1167 70 198 1165 553 553 1166 836 836 1169 330 330 1170 40 40 1168 40 40 1168 330 330 1170 837 837 1171 330 330 1173 552 552 1174 837 837 1172 837 837 1172 552 552 1174 69 197 1175 551 551 1177 207 79 1178 330 330 1176 330 330 1176 207 79 1178 552 552 1179 68 196 1181 551 551 1182 836 836 1180 836 836 1180 551 551 1182 330 330 1183 43 43 1184 838 838 1185 839 839 1187 839 839 1187 838 838 1185 331 331 1186 331 331 1189 553 553 1190 839 839 1188 839 839 1188 553 553 1190 70 198 1191 331 331 1192 552 552 1193 553 553 1195 553 553 1195 552 552 1193 207 79 1194 838 838 1196 69 197 1197 331 331 1199 331 331 1199 69 197 1197 552 552 1198 44 44 1200 846 846 1201 841 841 1203 841 841 1203 846 846 1201 332 332 1202 332 332 1205 554 554 1206 841 841 1204 841 841 1204 554 554 1206 71 199 1207 556 556 1209 208 80 1210 332 332 1208 332 332 1208 208 80 1210 554 554 1211 846 846 1212 73 201 1213 332 332 1215 332 332 1215 73 201 1213 556 556 1214 842 842 1217 333 333 1218 45 45 1216 45 45 1216 333 333 1218 843 843 1219 333 333 1221 555 555 1222 843 843 1220 843 843 1220 555 555 1222 72 200 1223 554 554 1225 208 80 1226 333 333 1224 333 333 1224 208 80 1226 555 555 1227 842 842 1228 71 199 1229 333 333 1231 333 333 1231 71 199 1229 554 554 1230 49 49 1232 844 844 1233 845 845 1235 845 845 1235 844 844 1233 334 334 1234 845 845 1236 334 334 1237 73 201 1239 73 201 1239 334 334 1237 556 556 1238 334 334 1240 555 555 1241 556 556 1243 556 556 1243 555 555 1241 208 80 1242 844 844 1244 72 200 1245 334 334 1247 334 334 1247 72 200 1245 555 555 1246 852 852 1249 335 335 1250 51 51 1248 51 51 1248 335 335 1250 847 847 1251 335 335 1253 557 557 1254 847 847 1252 847 847 1252 557 557 1254 74 202 1255 559 559 1257 209 81 1258 335 335 1256 335 335 1256 209 81 1258 557 557 1259 76 204 1261 559 559 1262 852 852 1260 852 852 1260 559 559 1262 335 335 1263 50 50 1264 848 848 1265 849 849 1267 849 849 1267 848 848 1265 336 336 1266 336 336 1269 558 558 1270 849 849 1268 849 849 1268 558 558 1270 75 203 1271 557 557 1273 209 81 1274 336 336 1272 336 336 1272 209 81 1274 558 558 1275 848 848 1276 74 202 1277 336 336 1279 336 336 1279 74 202 1277 557 557 1278 48 48 1280 850 850 1281 851 851 1283 851 851 1283 850 850 1281 337 337 1282 851 851 1284 337 337 1285 76 204 1287 76 204 1287 337 337 1285 559 559 1286 337 337 1288 558 558 1289 559 559 1291 559 559 1291 558 558 1289 209 81 1290 850 850 1292 75 203 1293 337 337 1295 337 337 1295 75 203 1293 558 558 1294 49 49 1296 854 854 1297 844 844 1299 844 844 1299 854 854 1297 338 338 1298 844 844 1300 338 338 1301 72 200 1303 72 200 1303 338 338 1301 560 560 1302 338 338 1304 562 562 1305 560 560 1307 560 560 1307 562 562 1305 210 82 1306 854 854 1308 77 205 1309 338 338 1311 338 338 1311 77 205 1309 562 562 1310 843 843 1313 339 339 1314 45 45 1312 45 45 1312 339 339 1314 830 830 1315 339 339 1317 561 561 1318 830 830 1316 830 830 1316 561 561 1318 65 193 1319 560 560 1321 210 82 1322 339 339 1320 339 339 1320 210 82 1322 561 561 1323 72 200 1325 560 560 1326 843 843 1324 843 843 1324 560 560 1326 339 339 1327 829 829 1329 340 340 1330 48 48 1328 48 48 1328 340 340 1330 853 853 1331 340 340 1333 562 562 1334 853 853 1332 853 853 1332 562 562 1334 77 205 1335 561 561 1337 210 82 1338 340 340 1336 340 340 1336 210 82 1338 562 562 1339 65 193 1341 561 561 1342 829 829 1340 829 829 1340 561 561 1342 340 340 1343 47 47 1344 860 860 1345 855 855 1347 855 855 1347 860 860 1345 341 341 1346 855 855 1348 341 341 1349 78 206 1351 78 206 1351 341 341 1349 563 563 1350 341 341 1352 565 565 1353 563 563 1355 563 563 1355 565 565 1353 211 83 1354 860 860 1356 80 208 1357 341 341 1359 341 341 1359 80 208 1357 565 565 1358 42 42 1360 856 856 1361 857 857 1363 857 857 1363 856 856 1361 342 342 1362 857 857 1364 342 342 1365 79 207 1367 79 207 1367 342 342 1365 564 564 1366 563 563 1369 211 83 1370 342 342 1368 342 342 1368 211 83 1370 564 564 1371 78 206 1373 563 563 1374 856 856 1372 856 856 1372 563 563 1374 342 342 1375 49 49 1376 858 858 1377 859 859 1379 859 859 1379 858 858 1377 343 343 1378 343 343 1381 565 565 1382 859 859 1380 859 859 1380 565 565 1382 80 208 1383 564 564 1385 211 83 1386 343 343 1384 343 343 1384 211 83 1386 565 565 1387 79 207 1389 564 564 1390 858 858 1388 858 858 1388 564 564 1390 343 343 1391 51 51 1392 847 847 1393 861 861 1395 861 861 1395 847 847 1393 344 344 1394 861 861 1396 344 344 1397 81 209 1399 81 209 1399 344 344 1397 566 566 1398 568 568 1401 212 84 1402 344 344 1400 344 344 1400 212 84 1402 566 566 1403 847 847 1404 74 202 1405 344 344 1407 344 344 1407 74 202 1405 568 568 1406 47 47 1408 862 862 1409 863 863 1411 863 863 1411 862 862 1409 345 345 1410 863 863 1412 345 345 1413 82 210 1415 82 210 1415 345 345 1413 567 567 1414 345 345 1416 566 566 1417 567 567 1419 567 567 1419 566 566 1417 212 84 1418 862 862 1420 81 209 1421 345 345 1423 345 345 1423 81 209 1421 566 566 1422 864 864 1425 346 346 1426 50 50 1424 50 50 1424 346 346 1426 848 848 1427 346 346 1429 568 568 1430 848 848 1428 848 848 1428 568 568 1430 74 202 1431 567 567 1433 212 84 1434 346 346 1432 346 346 1432 212 84 1434 568 568 1435 82 210 1437 567 567 1438 864 864 1436 864 864 1436 567 567 1438 346 346 1439 38 38 1440 870 870 1441 865 865 1443 865 865 1443 870 870 1441 347 347 1442 347 347 1445 569 569 1446 865 865 1444 865 865 1444 569 569 1446 83 211 1447 571 571 1449 213 85 1450 347 347 1448 347 347 1448 213 85 1450 569 569 1451 870 870 1452 85 213 1453 347 347 1455 347 347 1455 85 213 1453 571 571 1454 53 53 1456 866 866 1457 867 867 1459 867 867 1459 866 866 1457 348 348 1458 348 348 1461 570 570 1462 867 867 1460 867 867 1460 570 570 1462 84 212 1463 348 348 1464 569 569 1465 570 570 1467 570 570 1467 569 569 1465 213 85 1466 866 866 1468 83 211 1469 348 348 1471 348 348 1471 83 211 1469 569 569 1470 868 868 1473 349 349 1474 54 54 1472 54 54 1472 349 349 1474 869 869 1475 349 349 1477 571 571 1478 869 869 1476 869 869 1476 571 571 1478 85 213 1479 570 570 1481 213 85 1482 349 349 1480 349 349 1480 213 85 1482 571 571 1483 84 212 1485 570 570 1486 868 868 1484 868 868 1484 570 570 1486 349 349 1487 52 52 1488 872 872 1489 706 706 1491 706 706 1491 872 872 1489 350 350 1490 706 706 1492 350 350 1493 131 131 1495 131 131 1495 350 350 1493 572 572 1494 350 350 1496 574 574 1497 572 572 1499 572 572 1499 574 574 1497 214 86 1498 872 872 1500 86 214 1501 350 350 1503 350 350 1503 86 214 1501 574 574 1502 43 43 1504 705 705 1505 838 838 1507 838 838 1507 705 705 1505 351 351 1506 351 351 1509 573 573 1510 838 838 1508 838 838 1508 573 573 1510 69 197 1511 572 572 1513 214 86 1514 351 351 1512 351 351 1512 214 86 1514 573 573 1515 131 131 1517 572 572 1518 705 705 1516 705 705 1516 572 572 1518 351 351 1519 40 40 1520 837 837 1521 871 871 1523 871 871 1523 837 837 1521 352 352 1522 352 352 1525 574 574 1526 871 871 1524 871 871 1524 574 574 1526 86 214 1527 573 573 1529 214 86 1530 352 352 1528 352 352 1528 214 86 1530 574 574 1531 837 837 1532 69 197 1533 352 352 1535 352 352 1535 69 197 1533 573 573 1534 0 0 1536 878 878 1537 873 873 1539 873 873 1539 878 878 1537 353 353 1538 873 873 1540 353 353 1541 87 215 1543 87 215 1543 353 353 1541 575 575 1542 577 577 1545 215 87 1546 353 353 1544 353 353 1544 215 87 1546 575 575 1547 878 878 1548 89 217 1549 353 353 1551 353 353 1551 89 217 1549 577 577 1550 874 874 1553 354 354 1554 6 6 1552 6 6 1552 354 354 1554 875 875 1555 354 354 1557 576 576 1558 875 875 1556 875 875 1556 576 576 1558 88 216 1559 575 575 1561 215 87 1562 354 354 1560 354 354 1560 215 87 1562 576 576 1563 87 215 1565 575 575 1566 874 874 1564 874 874 1564 575 575 1566 354 354 1567 31 31 1568 876 876 1569 877 877 1571 877 877 1571 876 876 1569 355 355 1570 877 877 1572 355 355 1573 89 217 1575 89 217 1575 355 355 1573 577 577 1574 355 355 1576 576 576 1577 577 577 1579 577 577 1579 576 576 1577 215 87 1578 876 876 1580 88 216 1581 355 355 1583 355 355 1583 88 216 1581 576 576 1582 31 31 1584 877 877 1585 712 712 1587 712 712 1587 877 877 1585 356 356 1586 712 712 1588 356 356 1589 134 134 1591 134 134 1591 356 356 1589 578 578 1590 356 356 1592 580 580 1593 578 578 1595 578 578 1595 580 580 1593 216 88 1594 877 877 1596 89 217 1597 356 356 1599 356 356 1599 89 217 1597 580 580 1598 29 29 1600 711 711 1601 879 879 1603 879 879 1603 711 711 1601 357 357 1602 879 879 1604 357 357 1605 90 218 1607 90 218 1607 357 357 1605 579 579 1606 578 578 1609 216 88 1610 357 357 1608 357 357 1608 216 88 1610 579 579 1611 134 134 1613 578 578 1614 711 711 1612 711 711 1612 578 578 1614 357 357 1615 880 880 1617 358 358 1618 0 0 1616 0 0 1616 358 358 1618 878 878 1619 358 358 1621 580 580 1622 878 878 1620 878 878 1620 580 580 1622 89 217 1623 579 579 1625 216 88 1626 358 358 1624 358 358 1624 216 88 1626 580 580 1627 90 218 1629 579 579 1630 880 880 1628 880 880 1628 579 579 1630 358 358 1631 27 27 1632 884 884 1633 881 881 1635 881 881 1635 884 884 1633 359 359 1634 881 881 1636 359 359 1637 91 219 1639 91 219 1639 359 359 1637 581 581 1638 583 583 1641 217 89 1642 359 359 1640 359 359 1640 217 89 1642 581 581 1643 92 220 1645 583 583 1646 884 884 1644 884 884 1644 583 583 1646 359 359 1647 882 882 1649 360 360 1650 13 13 1648 13 13 1648 360 360 1650 768 768 1651 360 360 1653 582 582 1654 768 768 1652 768 768 1652 582 582 1654 162 162 1655 581 581 1657 217 89 1658 360 360 1656 360 360 1656 217 89 1658 582 582 1659 91 219 1661 581 581 1662 882 882 1660 882 882 1660 581 581 1662 360 360 1663 26 26 1664 767 767 1665 883 883 1667 883 883 1667 767 767 1665 361 361 1666 883 883 1668 361 361 1669 92 220 1671 92 220 1671 361 361 1669 583 583 1670 361 361 1672 582 582 1673 583 583 1675 583 583 1675 582 582 1673 217 89 1674 767 767 1676 162 162 1677 361 361 1679 361 361 1679 162 162 1677 582 582 1678 9 9 1680 717 717 1681 885 885 1683 885 885 1683 717 717 1681 362 362 1682 362 362 1685 584 584 1686 885 885 1684 885 885 1684 584 584 1686 93 221 1687 362 362 1688 586 586 1689 584 584 1691 584 584 1691 586 586 1689 218 90 1690 717 717 1692 137 137 1693 362 362 1695 362 362 1695 137 137 1693 586 586 1694 27 27 1696 886 886 1697 884 884 1699 884 884 1699 886 886 1697 363 363 1698 884 884 1700 363 363 1701 92 220 1703 92 220 1703 363 363 1701 585 585 1702 363 363 1704 584 584 1705 585 585 1707 585 585 1707 584 584 1705 218 90 1706 886 886 1708 93 221 1709 363 363 1711 363 363 1711 93 221 1709 584 584 1710 26 26 1712 883 883 1713 718 718 1715 718 718 1715 883 883 1713 364 364 1714 718 718 1716 364 364 1717 137 137 1719 137 137 1719 364 364 1717 586 586 1718 585 585 1721 218 90 1722 364 364 1720 364 364 1720 218 90 1722 586 586 1723 883 883 1724 92 220 1725 364 364 1727 364 364 1727 92 220 1725 585 585 1726 13 13 1728 727 727 1729 887 887 1731 887 887 1731 727 727 1729 365 365 1730 365 365 1733 587 587 1734 887 887 1732 887 887 1732 587 587 1734 94 222 1735 365 365 1736 589 589 1737 587 587 1739 587 587 1739 589 589 1737 219 91 1738 727 727 1740 142 142 1741 365 365 1743 365 365 1743 142 142 1741 589 589 1742 23 23 1744 888 888 1745 760 760 1747 760 760 1747 888 888 1745 366 366 1746 366 366 1749 588 588 1750 760 760 1748 760 760 1748 588 588 1750 158 158 1751 587 587 1753 219 91 1754 366 366 1752 366 366 1752 219 91 1754 588 588 1755 888 888 1756 94 222 1757 366 366 1759 366 366 1759 94 222 1757 587 587 1758 17 17 1760 759 759 1761 728 728 1763 728 728 1763 759 759 1761 367 367 1762 367 367 1765 589 589 1766 728 728 1764 728 728 1764 589 589 1766 142 142 1767 588 588 1769 219 91 1770 367 367 1768 367 367 1768 219 91 1770 589 589 1771 759 759 1772 158 158 1773 367 367 1775 367 367 1775 158 158 1773 588 588 1774 892 892 1777 368 368 1778 19 19 1776 19 19 1776 368 368 1778 744 744 1779 368 368 1781 590 590 1782 744 744 1780 744 744 1780 590 590 1782 150 150 1783 592 592 1785 220 92 1786 368 368 1784 368 368 1784 220 92 1786 590 590 1787 96 224 1789 592 592 1790 892 892 1788 892 892 1788 592 592 1790 368 368 1791 743 743 1793 369 369 1794 16 16 1792 16 16 1792 369 369 1794 889 889 1795 369 369 1797 591 591 1798 889 889 1796 889 889 1796 591 591 1798 95 223 1799 590 590 1801 220 92 1802 369 369 1800 369 369 1800 220 92 1802 591 591 1803 150 150 1805 590 590 1806 743 743 1804 743 743 1804 590 590 1806 369 369 1807 5 5 1808 890 890 1809 891 891 1811 891 891 1811 890 890 1809 370 370 1810 891 891 1812 370 370 1813 96 224 1815 96 224 1815 370 370 1813 592 592 1814 370 370 1816 591 591 1817 592 592 1819 592 592 1819 591 591 1817 220 92 1818 890 890 1820 95 223 1821 370 370 1823 370 370 1823 95 223 1821 591 591 1822 15 15 1824 894 894 1825 724 724 1827 724 724 1827 894 894 1825 371 371 1826 724 724 1828 371 371 1829 140 140 1831 140 140 1831 371 371 1829 593 593 1830 371 371 1832 595 595 1833 593 593 1835 593 593 1835 595 595 1833 221 93 1834 894 894 1836 97 225 1837 371 371 1839 371 371 1839 97 225 1837 595 595 1838 723 723 1841 372 372 1842 17 17 1840 17 17 1840 372 372 1842 738 738 1843 372 372 1845 594 594 1846 738 738 1844 738 738 1844 594 594 1846 147 147 1847 593 593 1849 221 93 1850 372 372 1848 372 372 1848 221 93 1850 594 594 1851 140 140 1853 593 593 1854 723 723 1852 723 723 1852 593 593 1854 372 372 1855 19 19 1856 737 737 1857 893 893 1859 893 893 1859 737 737 1857 373 373 1858 373 373 1861 595 595 1862 893 893 1860 893 893 1860 595 595 1862 97 225 1863 373 373 1864 594 594 1865 595 595 1867 595 595 1867 594 594 1865 221 93 1866 737 737 1868 147 147 1869 373 373 1871 373 373 1871 147 147 1869 594 594 1870 19 19 1872 893 893 1873 892 892 1875 892 892 1875 893 893 1873 374 374 1874 892 892 1876 374 374 1877 96 224 1879 96 224 1879 374 374 1877 596 596 1878 374 374 1880 598 598 1881 596 596 1883 596 596 1883 598 598 1881 222 94 1882 893 893 1884 97 225 1885 374 374 1887 374 374 1887 97 225 1885 598 598 1886 5 5 1888 891 891 1889 734 734 1891 734 734 1891 891 891 1889 375 375 1890 375 375 1893 597 597 1894 734 734 1892 734 734 1892 597 597 1894 145 145 1895 596 596 1897 222 94 1898 375 375 1896 375 375 1896 222 94 1898 597 597 1899 96 224 1901 596 596 1902 891 891 1900 891 891 1900 596 596 1902 375 375 1903 15 15 1904 733 733 1905 894 894 1907 894 894 1907 733 733 1905 376 376 1906 894 894 1908 376 376 1909 97 225 1911 97 225 1911 376 376 1909 598 598 1910 376 376 1912 597 597 1913 598 598 1915 598 598 1915 597 597 1913 222 94 1914 733 733 1916 145 145 1917 376 376 1919 376 376 1919 145 145 1917 597 597 1918 17 17 1920 739 739 1921 758 758 1923 758 758 1923 739 739 1921 377 377 1922 758 758 1924 377 377 1925 157 157 1927 157 157 1927 377 377 1925 599 599 1926 377 377 1928 601 601 1929 599 599 1931 599 599 1931 601 601 1929 223 95 1930 739 739 1932 148 148 1933 377 377 1935 377 377 1935 148 148 1933 601 601 1934 757 757 1937 378 378 1938 22 22 1936 22 22 1936 378 378 1938 754 754 1939 378 378 1941 600 600 1942 754 754 1940 754 754 1940 600 600 1942 155 155 1943 599 599 1945 223 95 1946 378 378 1944 378 378 1944 223 95 1946 600 600 1947 157 157 1949 599 599 1950 757 757 1948 757 757 1948 599 599 1950 378 378 1951 21 21 1952 753 753 1953 740 740 1955 740 740 1955 753 753 1953 379 379 1954 379 379 1957 601 601 1958 740 740 1956 740 740 1956 601 601 1958 148 148 1959 379 379 1960 600 600 1961 601 601 1963 601 601 1963 600 600 1961 223 95 1962 753 753 1964 155 155 1965 379 379 1967 379 379 1967 155 155 1965 600 600 1966 19 19 1968 745 745 1969 736 736 1971 736 736 1971 745 745 1969 380 380 1970 736 736 1972 380 380 1973 146 146 1975 146 146 1975 380 380 1973 602 602 1974 380 380 1976 604 604 1977 602 602 1979 602 602 1979 604 604 1977 224 96 1978 745 745 1980 151 151 1981 380 380 1983 380 380 1983 151 151 1981 604 604 1982 735 735 1985 381 381 1986 21 21 1984 21 21 1984 381 381 1986 750 750 1987 381 381 1989 603 603 1990 750 750 1988 750 750 1988 603 603 1990 153 153 1991 602 602 1993 224 96 1994 381 381 1992 381 381 1992 224 96 1994 603 603 1995 146 146 1997 602 602 1998 735 735 1996 735 735 1996 602 602 1998 381 381 1999 749 749 2001 382 382 2002 20 20 2000 20 20 2000 382 382 2002 746 746 2003 382 382 2005 604 604 2006 746 746 2004 746 746 2004 604 604 2006 151 151 2007 603 603 2009 224 96 2010 382 382 2008 382 382 2008 224 96 2010 604 604 2011 153 153 2013 603 603 2014 749 749 2012 749 749 2012 603 603 2014 382 382 2015 22 22 2016 755 755 2017 895 895 2019 895 895 2019 755 755 2017 383 383 2018 383 383 2021 605 605 2022 895 895 2020 895 895 2020 605 605 2022 98 226 2023 607 607 2025 225 97 2026 383 383 2024 383 383 2024 225 97 2026 605 605 2027 156 156 2029 607 607 2030 755 755 2028 755 755 2028 607 607 2030 383 383 2031 14 14 2032 896 896 2033 897 897 2035 897 897 2035 896 896 2033 384 384 2034 384 384 2037 606 606 2038 897 897 2036 897 897 2036 606 606 2038 99 227 2039 605 605 2041 225 97 2042 384 384 2040 384 384 2040 225 97 2042 606 606 2043 896 896 2044 98 226 2045 384 384 2047 384 384 2047 98 226 2045 605 605 2046 18 18 2048 898 898 2049 756 756 2051 756 756 2051 898 898 2049 385 385 2050 756 756 2052 385 385 2053 156 156 2055 156 156 2055 385 385 2053 607 607 2054 385 385 2056 606 606 2057 607 607 2059 607 607 2059 606 606 2057 225 97 2058 898 898 2060 99 227 2061 385 385 2063 385 385 2063 99 227 2061 606 606 2062 10 10 2064 902 902 2065 899 899 2067 899 899 2067 902 902 2065 386 386 2066 899 899 2068 386 386 2069 100 228 2071 100 228 2071 386 386 2069 608 608 2070 386 386 2072 610 610 2073 608 608 2075 608 608 2075 610 610 2073 226 98 2074 902 902 2076 101 229 2077 386 386 2079 386 386 2079 101 229 2077 610 610 2078 900 900 2081 387 387 2082 14 14 2080 14 14 2080 387 387 2082 896 896 2083 387 387 2085 609 609 2086 896 896 2084 896 896 2084 609 609 2086 98 226 2087 608 608 2089 226 98 2090 387 387 2088 387 387 2088 226 98 2090 609 609 2091 100 228 2093 608 608 2094 900 900 2092 900 900 2092 608 608 2094 387 387 2095 22 22 2096 895 895 2097 901 901 2099 901 901 2099 895 895 2097 388 388 2098 388 388 2101 610 610 2102 901 901 2100 901 901 2100 610 610 2102 101 229 2103 609 609 2105 226 98 2106 388 388 2104 388 388 2104 226 98 2106 610 610 2107 895 895 2108 98 226 2109 388 388 2111 388 388 2111 98 226 2109 609 609 2110 22 22 2112 901 901 2113 762 762 2115 762 762 2115 901 901 2113 389 389 2114 762 762 2116 389 389 2117 159 159 2119 159 159 2119 389 389 2117 611 611 2118 389 389 2120 613 613 2121 611 611 2123 611 611 2123 613 613 2121 227 99 2122 901 901 2124 101 229 2125 389 389 2127 389 389 2127 101 229 2125 613 613 2126 761 761 2129 390 390 2130 23 23 2128 23 23 2128 390 390 2130 774 774 2131 390 390 2133 612 612 2134 774 774 2132 774 774 2132 612 612 2134 165 165 2135 611 611 2137 227 99 2138 390 390 2136 390 390 2136 227 99 2138 612 612 2139 159 159 2141 611 611 2142 761 761 2140 761 761 2140 611 611 2142 390 390 2143 10 10 2144 773 773 2145 902 902 2147 902 902 2147 773 773 2145 391 391 2146 391 391 2149 613 613 2150 902 902 2148 902 902 2148 613 613 2150 101 229 2151 391 391 2152 612 612 2153 613 613 2155 613 613 2155 612 612 2153 227 99 2154 773 773 2156 165 165 2157 391 391 2159 391 391 2159 165 165 2157 612 612 2158 13 13 2160 904 904 2161 726 726 2163 726 726 2163 904 904 2161 392 392 2162 726 726 2164 392 392 2165 141 141 2167 141 141 2167 392 392 2165 614 614 2166 616 616 2169 228 100 2170 392 392 2168 392 392 2168 228 100 2170 614 614 2171 102 230 2173 616 616 2174 904 904 2172 904 904 2172 616 616 2174 392 392 2175 15 15 2176 725 725 2177 766 766 2179 766 766 2179 725 725 2177 393 393 2178 766 766 2180 393 393 2181 161 161 2183 161 161 2183 393 393 2181 615 615 2182 614 614 2185 228 100 2186 393 393 2184 393 393 2184 228 100 2186 615 615 2187 725 725 2188 141 141 2189 393 393 2191 393 393 2191 141 141 2189 614 614 2190 24 24 2192 765 765 2193 903 903 2195 903 903 2195 765 765 2193 394 394 2194 903 903 2196 394 394 2197 102 230 2199 102 230 2199 394 394 2197 616 616 2198 394 394 2200 615 615 2201 616 616 2203 616 616 2203 615 615 2201 228 100 2202 765 765 2204 161 161 2205 394 394 2207 394 394 2207 161 161 2205 615 615 2206 13 13 2208 769 769 2209 904 904 2211 904 904 2211 769 769 2209 395 395 2210 904 904 2212 395 395 2213 102 230 2215 102 230 2215 395 395 2213 617 617 2214 395 395 2216 619 619 2217 617 617 2219 617 617 2219 619 619 2217 229 101 2218 769 769 2220 163 163 2221 395 395 2223 395 395 2223 163 163 2221 619 619 2222 903 903 2225 396 396 2226 24 24 2224 24 24 2224 396 396 2226 905 905 2227 396 396 2229 618 618 2230 905 905 2228 905 905 2228 618 618 2230 103 231 2231 617 617 2233 229 101 2234 396 396 2232 396 396 2232 229 101 2234 618 618 2235 102 230 2237 617 617 2238 903 903 2236 903 903 2236 617 617 2238 396 396 2239 906 906 2241 397 397 2242 25 25 2240 25 25 2240 397 397 2242 770 770 2243 397 397 2245 619 619 2246 770 770 2244 770 770 2244 619 619 2246 163 163 2247 618 618 2249 229 101 2250 397 397 2248 397 397 2248 229 101 2250 619 619 2251 906 906 2252 103 231 2253 397 397 2255 397 397 2255 103 231 2253 618 618 2254 13 13 2256 908 908 2257 882 882 2259 882 882 2259 908 908 2257 398 398 2258 882 882 2260 398 398 2261 91 219 2263 91 219 2263 398 398 2261 620 620 2262 398 398 2264 622 622 2265 620 620 2267 620 620 2267 622 622 2265 230 102 2266 908 908 2268 104 232 2269 398 398 2271 398 398 2271 104 232 2269 622 622 2270 27 27 2272 881 881 2273 782 782 2275 782 782 2275 881 881 2273 399 399 2274 399 399 2277 621 621 2278 782 782 2276 782 782 2276 621 621 2278 169 169 2279 620 620 2281 230 102 2282 399 399 2280 399 399 2280 230 102 2282 621 621 2283 91 219 2285 620 620 2286 881 881 2284 881 881 2284 620 620 2286 399 399 2287 8 8 2288 781 781 2289 907 907 2291 907 907 2291 781 781 2289 400 400 2290 907 907 2292 400 400 2293 104 232 2295 104 232 2295 400 400 2293 622 622 2294 400 400 2296 621 621 2297 622 622 2299 622 622 2299 621 621 2297 230 102 2298 781 781 2300 169 169 2301 400 400 2303 400 400 2303 169 169 2301 621 621 2302 775 775 2305 401 401 2306 23 23 2304 23 23 2304 401 401 2306 888 888 2307 401 401 2309 623 623 2310 888 888 2308 888 888 2308 623 623 2310 94 222 2311 625 625 2313 231 103 2314 401 401 2312 401 401 2312 231 103 2314 623 623 2315 166 166 2317 625 625 2318 775 775 2316 775 775 2316 625 625 2318 401 401 2319 13 13 2320 887 887 2321 908 908 2323 908 908 2323 887 887 2321 402 402 2322 908 908 2324 402 402 2325 104 232 2327 104 232 2327 402 402 2325 624 624 2326 402 402 2328 623 623 2329 624 624 2331 624 624 2331 623 623 2329 231 103 2330 887 887 2332 94 222 2333 402 402 2335 402 402 2335 94 222 2333 623 623 2334 8 8 2336 907 907 2337 776 776 2339 776 776 2339 907 907 2337 403 403 2338 776 776 2340 403 403 2341 166 166 2343 166 166 2343 403 403 2341 625 625 2342 403 403 2344 624 624 2345 625 625 2347 625 625 2347 624 624 2345 231 103 2346 907 907 2348 104 232 2349 403 403 2351 403 403 2351 104 232 2349 624 624 2350 30 30 2352 779 779 2353 784 784 2355 784 784 2355 779 779 2353 404 404 2354 784 784 2356 404 404 2357 170 170 2359 170 170 2359 404 404 2357 626 626 2358 628 628 2361 232 104 2362 404 404 2360 404 404 2360 232 104 2362 626 626 2363 168 168 2365 628 628 2366 779 779 2364 779 779 2364 628 628 2366 404 404 2367 783 783 2369 405 405 2370 27 27 2368 27 27 2368 405 405 2370 886 886 2371 405 405 2373 627 627 2374 886 886 2372 886 886 2372 627 627 2374 93 221 2375 626 626 2377 232 104 2378 405 405 2376 405 405 2376 232 104 2378 627 627 2379 170 170 2381 626 626 2382 783 783 2380 783 783 2380 626 626 2382 405 405 2383 9 9 2384 885 885 2385 780 780 2387 780 780 2387 885 885 2385 406 406 2386 780 780 2388 406 406 2389 168 168 2391 168 168 2391 406 406 2389 628 628 2390 406 406 2392 627 627 2393 628 628 2395 628 628 2395 627 627 2393 232 104 2394 885 885 2396 93 221 2397 406 406 2399 406 406 2399 93 221 2397 627 627 2398 30 30 2400 785 785 2401 790 790 2403 790 790 2403 785 785 2401 407 407 2402 790 790 2404 407 407 2405 173 173 2407 173 173 2407 407 407 2405 629 629 2406 407 407 2408 631 631 2409 629 629 2411 629 629 2411 631 631 2409 233 105 2410 785 785 2412 171 171 2413 407 407 2415 407 407 2415 171 171 2413 631 631 2414 789 789 2417 408 408 2418 28 28 2416 28 28 2416 408 408 2418 909 909 2419 408 408 2421 630 630 2422 909 909 2420 909 909 2420 630 630 2422 105 233 2423 629 629 2425 233 105 2426 408 408 2424 408 408 2424 233 105 2426 630 630 2427 173 173 2429 629 629 2430 789 789 2428 789 789 2428 629 629 2430 408 408 2431 8 8 2432 910 910 2433 786 786 2435 786 786 2435 910 910 2433 409 409 2434 409 409 2437 631 631 2438 786 786 2436 786 786 2436 631 631 2438 171 171 2439 630 630 2441 233 105 2442 409 409 2440 409 409 2440 233 105 2442 631 631 2443 910 910 2444 105 233 2445 409 409 2447 409 409 2447 105 233 2445 630 630 2446 31 31 2448 914 914 2449 808 808 2451 808 808 2451 914 914 2449 410 410 2450 808 808 2452 410 410 2453 182 182 2455 182 182 2455 410 410 2453 632 632 2454 410 410 2456 634 634 2457 632 632 2459 632 632 2459 634 634 2457 234 106 2458 914 914 2460 107 235 2461 410 410 2463 410 410 2463 107 235 2461 634 634 2462 807 807 2465 411 411 2466 7 7 2464 7 7 2464 411 411 2466 911 911 2467 911 911 2468 411 411 2469 106 234 2471 106 234 2471 411 411 2469 633 633 2470 632 632 2473 234 106 2474 411 411 2472 411 411 2472 234 106 2474 633 633 2475 182 182 2477 632 632 2478 807 807 2476 807 807 2476 632 632 2478 411 411 2479 912 912 2481 412 412 2482 1 1 2480 1 1 2480 412 412 2482 913 913 2483 412 412 2485 634 634 2486 913 913 2484 913 913 2484 634 634 2486 107 235 2487 633 633 2489 234 106 2490 412 412 2488 412 412 2488 234 106 2490 634 634 2491 106 234 2493 633 633 2494 912 912 2492 912 912 2492 633 633 2494 412 412 2495 30 30 2496 791 791 2497 915 915 2499 915 915 2499 791 791 2497 413 413 2498 915 915 2500 413 413 2501 108 236 2503 108 236 2503 413 413 2501 635 635 2502 413 413 2504 637 637 2505 635 635 2507 635 635 2507 637 637 2505 235 107 2506 791 791 2508 174 174 2509 413 413 2511 413 413 2511 174 174 2509 637 637 2510 916 916 2513 414 414 2514 1 1 2512 1 1 2512 414 414 2514 917 917 2515 917 917 2516 414 414 2517 109 237 2519 109 237 2519 414 414 2517 636 636 2518 635 635 2521 235 107 2522 414 414 2520 414 414 2520 235 107 2522 636 636 2523 108 236 2525 635 635 2526 916 916 2524 916 916 2524 635 635 2526 414 414 2527 918 918 2529 415 415 2530 4 4 2528 4 4 2528 415 415 2530 792 792 2531 415 415 2533 637 637 2534 792 792 2532 792 792 2532 637 637 2534 174 174 2535 636 636 2537 235 107 2538 415 415 2536 415 415 2536 235 107 2538 637 637 2539 109 237 2541 636 636 2542 918 918 2540 918 918 2540 636 636 2542 415 415 2543 1 1 2544 913 913 2545 916 916 2547 916 916 2547 913 913 2545 416 416 2546 916 916 2548 416 416 2549 108 236 2551 108 236 2551 416 416 2549 638 638 2550 416 416 2552 640 640 2553 638 638 2555 638 638 2555 640 640 2553 236 108 2554 913 913 2556 107 235 2557 416 416 2559 416 416 2559 107 235 2557 640 640 2558 30 30 2560 915 915 2561 708 708 2563 708 708 2563 915 915 2561 417 417 2562 708 708 2564 417 417 2565 132 132 2567 132 132 2567 417 417 2565 639 639 2566 638 638 2569 236 108 2570 417 417 2568 417 417 2568 236 108 2570 639 639 2571 108 236 2573 638 638 2574 915 915 2572 915 915 2572 638 638 2574 417 417 2575 707 707 2577 418 418 2578 31 31 2576 31 31 2576 418 418 2578 914 914 2579 418 418 2581 640 640 2582 914 914 2580 914 914 2580 640 640 2582 107 235 2583 639 639 2585 236 108 2586 418 418 2584 418 418 2584 236 108 2586 640 640 2587 132 132 2589 639 639 2590 707 707 2588 707 707 2588 639 639 2590 418 418 2591 36 36 2592 797 797 2593 800 800 2595 800 800 2595 797 797 2593 419 419 2594 800 800 2596 419 419 2597 178 178 2599 178 178 2599 419 419 2597 641 641 2598 419 419 2600 643 643 2601 641 641 2603 641 641 2603 643 643 2601 237 109 2602 797 797 2604 177 177 2605 419 419 2607 419 419 2607 177 177 2605 643 643 2606 799 799 2609 420 420 2610 34 34 2608 34 34 2608 420 420 2610 919 919 2611 420 420 2613 642 642 2614 919 919 2612 919 919 2612 642 642 2614 110 238 2615 641 641 2617 237 109 2618 420 420 2616 420 420 2616 237 109 2618 642 642 2619 178 178 2621 641 641 2622 799 799 2620 799 799 2620 641 641 2622 420 420 2623 32 32 2624 920 920 2625 798 798 2627 798 798 2627 920 920 2625 421 421 2626 421 421 2629 643 643 2630 798 798 2628 798 798 2628 643 643 2630 177 177 2631 642 642 2633 237 109 2634 421 421 2632 421 421 2632 237 109 2634 643 643 2635 920 920 2636 110 238 2637 421 421 2639 421 421 2639 110 238 2637 642 642 2638 31 31 2640 803 803 2641 876 876 2643 876 876 2643 803 803 2641 422 422 2642 876 876 2644 422 422 2645 88 216 2647 88 216 2647 422 422 2645 644 644 2646 422 422 2648 646 646 2649 644 644 2651 644 644 2651 646 646 2649 238 110 2650 803 803 2652 180 180 2653 422 422 2655 422 422 2655 180 180 2653 646 646 2654 875 875 2657 423 423 2658 6 6 2656 6 6 2656 423 423 2658 921 921 2659 423 423 2661 645 645 2662 921 921 2660 921 921 2660 645 645 2662 111 239 2663 644 644 2665 238 110 2666 423 423 2664 423 423 2664 238 110 2666 645 645 2667 88 216 2669 644 644 2670 875 875 2668 875 875 2668 644 644 2670 423 423 2671 34 34 2672 922 922 2673 804 804 2675 804 804 2675 922 922 2673 424 424 2674 424 424 2677 646 646 2678 804 804 2676 804 804 2676 646 646 2678 180 180 2679 645 645 2681 238 110 2682 424 424 2680 424 424 2680 238 110 2682 646 646 2683 922 922 2684 111 239 2685 424 424 2687 424 424 2687 111 239 2685 645 645 2686 31 31 2688 924 924 2689 802 802 2691 802 802 2691 924 924 2689 425 425 2690 802 802 2692 425 425 2693 179 179 2695 179 179 2695 425 425 2693 647 647 2694 649 649 2697 239 111 2698 425 425 2696 425 425 2696 239 111 2698 647 647 2699 112 240 2701 649 649 2702 924 924 2700 924 924 2700 649 649 2702 425 425 2703 801 801 2705 426 426 2706 36 36 2704 36 36 2704 426 426 2706 814 814 2707 426 426 2709 648 648 2710 814 814 2708 814 814 2708 648 648 2710 57 185 2711 647 647 2713 239 111 2714 426 426 2712 426 426 2712 239 111 2714 648 648 2715 179 179 2717 647 647 2718 801 801 2716 801 801 2716 647 647 2718 426 426 2719 35 35 2720 813 813 2721 923 923 2723 923 923 2723 813 813 2721 427 427 2722 923 923 2724 427 427 2725 112 240 2727 112 240 2727 427 427 2725 649 649 2726 427 427 2728 648 648 2729 649 649 2731 649 649 2731 648 648 2729 239 111 2730 813 813 2732 57 185 2733 427 427 2735 427 427 2735 57 185 2733 648 648 2734 31 31 2736 809 809 2737 924 924 2739 924 924 2739 809 809 2737 428 428 2738 924 924 2740 428 428 2741 112 240 2743 112 240 2743 428 428 2741 650 650 2742 428 428 2744 652 652 2745 650 650 2747 650 650 2747 652 652 2745 240 112 2746 809 809 2748 55 183 2749 428 428 2751 428 428 2751 55 183 2749 652 652 2750 35 35 2752 923 923 2753 925 925 2755 925 925 2755 923 923 2753 429 429 2754 925 925 2756 429 429 2757 113 241 2759 113 241 2759 429 429 2757 651 651 2758 650 650 2761 240 112 2762 429 429 2760 429 429 2760 240 112 2762 651 651 2763 112 240 2765 650 650 2766 923 923 2764 923 923 2764 650 650 2766 429 429 2767 926 926 2769 430 430 2770 3 3 2768 3 3 2768 430 430 2770 810 810 2771 430 430 2773 652 652 2774 810 810 2772 810 810 2772 652 652 2774 55 183 2775 651 651 2777 240 112 2778 430 430 2776 430 430 2776 240 112 2778 652 652 2779 113 241 2781 651 651 2782 926 926 2780 926 926 2780 651 651 2782 430 430 2783 36 36 2784 815 815 2785 796 796 2787 796 796 2787 815 815 2785 431 431 2786 431 431 2789 653 653 2790 796 796 2788 796 796 2788 653 653 2790 176 176 2791 655 655 2793 241 113 2794 431 431 2792 431 431 2792 241 113 2794 653 653 2795 58 186 2797 655 655 2798 815 815 2796 815 815 2796 655 655 2798 431 431 2799 37 37 2800 795 795 2801 927 927 2803 927 927 2803 795 795 2801 432 432 2802 927 927 2804 432 432 2805 114 242 2807 114 242 2807 432 432 2805 654 654 2806 653 653 2809 241 113 2810 432 432 2808 432 432 2808 241 113 2810 654 654 2811 795 795 2812 176 176 2813 432 432 2815 432 432 2815 176 176 2813 653 653 2814 33 33 2816 928 928 2817 816 816 2819 816 816 2819 928 928 2817 433 433 2818 816 816 2820 433 433 2821 58 186 2823 58 186 2823 433 433 2821 655 655 2822 433 433 2824 654 654 2825 655 655 2827 655 655 2827 654 654 2825 241 113 2826 928 928 2828 114 242 2829 433 433 2831 433 433 2831 114 242 2829 654 654 2830 32 32 2832 932 932 2833 929 929 2835 929 929 2835 932 932 2833 434 434 2834 929 929 2836 434 434 2837 115 243 2839 115 243 2839 434 434 2837 656 656 2838 434 434 2840 658 658 2841 656 656 2843 656 656 2843 658 658 2841 242 114 2842 932 932 2844 116 244 2845 434 434 2847 434 434 2847 116 244 2845 658 658 2846 930 930 2849 435 435 2850 38 38 2848 38 38 2848 435 435 2850 870 870 2851 435 435 2853 657 657 2854 870 870 2852 870 870 2852 657 657 2854 85 213 2855 656 656 2857 242 114 2858 435 435 2856 435 435 2856 242 114 2858 657 657 2859 115 243 2861 656 656 2862 930 930 2860 930 930 2860 656 656 2862 435 435 2863 54 54 2864 869 869 2865 931 931 2867 931 931 2867 869 869 2865 436 436 2866 436 436 2869 658 658 2870 931 931 2868 931 931 2868 658 658 2870 116 244 2871 657 657 2873 242 114 2874 436 436 2872 436 436 2872 242 114 2874 658 658 2875 869 869 2876 85 213 2877 436 436 2879 436 436 2879 85 213 2877 657 657 2878 54 54 2880 931 931 2881 822 822 2883 822 822 2883 931 931 2881 437 437 2882 822 822 2884 437 437 2885 61 189 2887 61 189 2887 437 437 2885 659 659 2886 661 661 2889 243 115 2890 437 437 2888 437 437 2888 243 115 2890 659 659 2891 931 931 2892 116 244 2893 437 437 2895 437 437 2895 116 244 2893 661 661 2894 37 37 2896 821 821 2897 794 794 2899 794 794 2899 821 821 2897 438 438 2898 794 794 2900 438 438 2901 175 175 2903 175 175 2903 438 438 2901 660 660 2902 438 438 2904 659 659 2905 660 660 2907 660 660 2907 659 659 2905 243 115 2906 821 821 2908 61 189 2909 438 438 2911 438 438 2911 61 189 2909 659 659 2910 32 32 2912 793 793 2913 932 932 2915 932 932 2915 793 793 2913 439 439 2914 932 932 2916 439 439 2917 116 244 2919 116 244 2919 439 439 2917 661 661 2918 439 439 2920 660 660 2921 661 661 2923 661 661 2923 660 660 2921 243 115 2922 175 175 2925 660 660 2926 793 793 2924 793 793 2924 660 660 2926 439 439 2927 33 33 2928 934 934 2929 928 928 2931 928 928 2931 934 934 2929 440 440 2930 928 928 2932 440 440 2933 114 242 2935 114 242 2935 440 440 2933 662 662 2934 440 440 2936 664 664 2937 662 662 2939 662 662 2939 664 664 2937 244 116 2938 934 934 2940 117 245 2941 440 440 2943 440 440 2943 117 245 2941 664 664 2942 37 37 2944 927 927 2945 820 820 2947 820 820 2947 927 927 2945 441 441 2946 441 441 2949 663 663 2950 820 820 2948 820 820 2948 663 663 2950 60 188 2951 662 662 2953 244 116 2954 441 441 2952 441 441 2952 244 116 2954 663 663 2955 114 242 2957 662 662 2958 927 927 2956 927 927 2956 662 662 2958 441 441 2959 40 40 2960 819 819 2961 933 933 2963 933 933 2963 819 819 2961 442 442 2962 933 933 2964 442 442 2965 117 245 2967 117 245 2967 442 442 2965 664 664 2966 442 442 2968 663 663 2969 664 664 2971 664 664 2971 663 663 2969 244 116 2970 819 819 2972 60 188 2973 442 442 2975 442 442 2975 60 188 2973 663 663 2974 33 33 2976 827 827 2977 934 934 2979 934 934 2979 827 827 2977 443 443 2978 934 934 2980 443 443 2981 117 245 2983 117 245 2983 443 443 2981 665 665 2982 443 443 2984 667 667 2985 665 665 2987 665 665 2987 667 667 2985 245 117 2986 827 827 2988 64 192 2989 443 443 2991 443 443 2991 64 192 2989 667 667 2990 40 40 2992 933 933 2993 836 836 2995 836 836 2995 933 933 2993 444 444 2994 836 836 2996 444 444 2997 68 196 2999 68 196 2999 444 444 2997 666 666 2998 444 444 3000 665 665 3001 666 666 3003 666 666 3003 665 665 3001 245 117 3002 933 933 3004 117 245 3005 444 444 3007 444 444 3007 117 245 3005 665 665 3006 835 835 3009 445 445 3010 44 44 3008 44 44 3008 445 445 3010 828 828 3011 445 445 3013 667 667 3014 828 828 3012 828 828 3012 667 667 3014 64 192 3015 666 666 3017 245 117 3018 445 445 3016 445 445 3016 245 117 3018 667 667 3019 68 196 3021 666 666 3022 835 835 3020 835 835 3020 666 666 3022 445 445 3023 2 2 3024 940 940 3025 935 935 3027 935 935 3027 940 940 3025 446 446 3026 935 935 3028 446 446 3029 118 246 3031 118 246 3031 446 446 3029 668 668 3030 446 446 3032 670 670 3033 668 668 3035 668 668 3035 670 670 3033 246 118 3034 940 940 3036 120 248 3037 446 446 3039 446 446 3039 120 248 3037 670 670 3038 936 936 3041 447 447 3042 46 46 3040 46 46 3040 447 447 3042 937 937 3043 447 447 3045 669 669 3046 937 937 3044 937 937 3044 669 669 3046 119 247 3047 668 668 3049 246 118 3050 447 447 3048 447 447 3048 246 118 3050 669 669 3051 118 246 3053 668 668 3054 936 936 3052 936 936 3052 668 668 3054 447 447 3055 938 938 3057 448 448 3058 48 48 3056 48 48 3056 448 448 3058 939 939 3059 448 448 3061 670 670 3062 939 939 3060 939 939 3060 670 670 3062 120 248 3063 669 669 3065 246 118 3066 448 448 3064 448 448 3064 246 118 3066 670 670 3067 119 247 3069 669 669 3070 938 938 3068 938 938 3068 669 669 3070 448 448 3071 43 43 3072 944 944 3073 704 704 3075 704 704 3075 944 944 3073 449 449 3074 704 704 3076 449 449 3077 130 130 3079 130 130 3079 449 449 3077 671 671 3078 673 673 3081 247 119 3082 449 449 3080 449 449 3080 247 119 3082 671 671 3083 122 250 3085 673 673 3086 944 944 3084 944 944 3084 673 673 3086 449 449 3087 703 703 3089 450 450 3090 41 41 3088 41 41 3088 450 450 3090 941 941 3091 450 450 3093 672 672 3094 941 941 3092 941 941 3092 672 672 3094 121 249 3095 671 671 3097 247 119 3098 450 450 3096 450 450 3096 247 119 3098 672 672 3099 130 130 3101 671 671 3102 703 703 3100 703 703 3100 671 671 3102 450 450 3103 2 2 3104 942 942 3105 943 943 3107 943 943 3107 942 942 3105 451 451 3106 943 943 3108 451 451 3109 122 250 3111 122 250 3111 451 451 3109 673 673 3110 451 451 3112 672 672 3113 673 673 3115 673 673 3115 672 672 3113 247 119 3114 942 942 3116 121 249 3117 451 451 3119 451 451 3119 121 249 3117 672 672 3118 43 43 3120 833 833 3121 944 944 3123 944 944 3123 833 833 3121 452 452 3122 944 944 3124 452 452 3125 122 250 3127 122 250 3127 452 452 3125 674 674 3126 452 452 3128 676 676 3129 674 674 3131 674 674 3131 676 676 3129 248 120 3130 833 833 3132 67 195 3133 452 452 3135 452 452 3135 67 195 3133 676 676 3134 2 2 3136 943 943 3137 940 940 3139 940 940 3139 943 943 3137 453 453 3138 453 453 3141 675 675 3142 940 940 3140 940 940 3140 675 675 3142 120 248 3143 674 674 3145 248 120 3146 453 453 3144 453 453 3144 248 120 3146 675 675 3147 122 250 3149 674 674 3150 943 943 3148 943 943 3148 674 674 3150 453 453 3151 48 48 3152 939 939 3153 834 834 3155 834 834 3155 939 939 3153 454 454 3154 834 834 3156 454 454 3157 67 195 3159 67 195 3159 454 454 3157 676 676 3158 454 454 3160 675 675 3161 676 676 3163 676 676 3163 675 675 3161 248 120 3162 939 939 3164 120 248 3165 454 454 3167 454 454 3167 120 248 3165 675 675 3166 43 43 3168 839 839 3169 832 832 3171 832 832 3171 839 839 3169 455 455 3170 832 832 3172 455 455 3173 66 194 3175 66 194 3175 455 455 3173 677 677 3174 455 455 3176 679 679 3177 677 677 3179 677 677 3179 679 679 3177 249 121 3178 839 839 3180 70 198 3181 455 455 3183 455 455 3183 70 198 3181 679 679 3182 45 45 3184 831 831 3185 842 842 3187 842 842 3187 831 831 3185 456 456 3186 456 456 3189 678 678 3190 842 842 3188 842 842 3188 678 678 3190 71 199 3191 677 677 3193 249 121 3194 456 456 3192 456 456 3192 249 121 3194 678 678 3195 66 194 3197 677 677 3198 831 831 3196 831 831 3196 677 677 3198 456 456 3199 44 44 3200 841 841 3201 840 840 3203 840 840 3203 841 841 3201 457 457 3202 457 457 3205 679 679 3206 840 840 3204 840 840 3204 679 679 3206 70 198 3207 678 678 3209 249 121 3210 457 457 3208 457 457 3208 249 121 3210 679 679 3211 841 841 3212 71 199 3213 457 457 3215 457 457 3215 71 199 3213 678 678 3214 49 49 3216 948 948 3217 858 858 3219 858 858 3219 948 948 3217 458 458 3218 858 858 3220 458 458 3221 79 207 3223 79 207 3223 458 458 3221 680 680 3222 682 682 3225 250 122 3226 458 458 3224 458 458 3224 250 122 3226 680 680 3227 124 252 3229 682 682 3230 948 948 3228 948 948 3228 682 682 3230 458 458 3231 857 857 3233 459 459 3234 42 42 3232 42 42 3232 459 459 3234 945 945 3235 459 459 3237 681 681 3238 945 945 3236 945 945 3236 681 681 3238 123 251 3239 680 680 3241 250 122 3242 459 459 3240 459 459 3240 250 122 3242 681 681 3243 79 207 3245 680 680 3246 857 857 3244 857 857 3244 680 680 3246 459 459 3247 39 39 3248 946 946 3249 947 947 3251 947 947 3251 946 946 3249 460 460 3250 947 947 3252 460 460 3253 124 252 3255 124 252 3255 460 460 3253 682 682 3254 460 460 3256 681 681 3257 682 682 3259 682 682 3259 681 681 3257 250 122 3258 946 946 3260 123 251 3261 460 460 3263 460 460 3263 123 251 3261 681 681 3262 39 39 3264 947 947 3265 824 824 3267 824 824 3267 947 947 3265 461 461 3266 824 824 3268 461 461 3269 62 190 3271 62 190 3271 461 461 3269 683 683 3270 461 461 3272 685 685 3273 683 683 3275 683 683 3275 685 685 3273 251 123 3274 124 252 3277 685 685 3278 947 947 3276 947 947 3276 685 685 3278 461 461 3279 44 44 3280 823 823 3281 846 846 3283 846 846 3283 823 823 3281 462 462 3282 846 846 3284 462 462 3285 73 201 3287 73 201 3287 462 462 3285 684 684 3286 683 683 3289 251 123 3290 462 462 3288 462 462 3288 251 123 3290 684 684 3291 62 190 3293 683 683 3294 823 823 3292 823 823 3292 683 683 3294 462 462 3295 49 49 3296 845 845 3297 948 948 3299 948 948 3299 845 845 3297 463 463 3298 948 948 3300 463 463 3301 124 252 3303 124 252 3303 463 463 3301 685 685 3302 463 463 3304 684 684 3305 685 685 3307 685 685 3307 684 684 3305 251 123 3306 845 845 3308 73 201 3309 463 463 3311 463 463 3311 73 201 3309 684 684 3310 48 48 3312 851 851 3313 938 938 3315 938 938 3315 851 851 3313 464 464 3314 464 464 3317 686 686 3318 938 938 3316 938 938 3316 686 686 3318 119 247 3319 688 688 3321 252 124 3322 464 464 3320 464 464 3320 252 124 3322 686 686 3323 76 204 3325 688 688 3326 851 851 3324 851 851 3324 688 688 3326 464 464 3327 46 46 3328 937 937 3329 949 949 3331 949 949 3331 937 937 3329 465 465 3330 465 465 3333 687 687 3334 949 949 3332 949 949 3332 687 687 3334 125 253 3335 686 686 3337 252 124 3338 465 465 3336 465 465 3336 252 124 3338 687 687 3339 937 937 3340 119 247 3341 465 465 3343 465 465 3343 119 247 3341 686 686 3342 51 51 3344 950 950 3345 852 852 3347 852 852 3347 950 950 3345 466 466 3346 852 852 3348 466 466 3349 76 204 3351 76 204 3351 466 466 3349 688 688 3350 466 466 3352 687 687 3353 688 688 3355 688 688 3355 687 687 3353 252 124 3354 950 950 3356 125 253 3357 466 466 3359 466 466 3359 125 253 3357 687 687 3358 48 48 3360 853 853 3361 850 850 3363 850 850 3363 853 853 3361 467 467 3362 850 850 3364 467 467 3365 75 203 3367 75 203 3367 467 467 3365 689 689 3366 467 467 3368 691 691 3369 689 689 3371 689 689 3371 691 691 3369 253 125 3370 853 853 3372 77 205 3373 467 467 3375 467 467 3375 77 205 3373 691 691 3374 50 50 3376 849 849 3377 951 951 3379 951 951 3379 849 849 3377 468 468 3378 951 951 3380 468 468 3381 126 254 3383 126 254 3383 468 468 3381 690 690 3382 689 689 3385 253 125 3386 468 468 3384 468 468 3384 253 125 3386 690 690 3387 75 203 3389 689 689 3390 849 849 3388 849 849 3388 689 689 3390 468 468 3391 49 49 3392 952 952 3393 854 854 3395 854 854 3395 952 952 3393 469 469 3394 469 469 3397 691 691 3398 854 854 3396 854 854 3396 691 691 3398 77 205 3399 690 690 3401 253 125 3402 469 469 3400 469 469 3400 253 125 3402 691 691 3403 952 952 3404 126 254 3405 469 469 3407 469 469 3407 126 254 3405 690 690 3406 49 49 3408 859 859 3409 952 952 3411 952 952 3411 859 859 3409 470 470 3410 952 952 3412 470 470 3413 126 254 3415 126 254 3415 470 470 3413 692 692 3414 470 470 3416 694 694 3417 692 692 3419 692 692 3419 694 694 3417 254 126 3418 859 859 3420 80 208 3421 470 470 3423 470 470 3423 80 208 3421 694 694 3422 951 951 3425 471 471 3426 50 50 3424 50 50 3424 471 471 3426 864 864 3427 864 864 3428 471 471 3429 82 210 3431 82 210 3431 471 471 3429 693 693 3430 692 692 3433 254 126 3434 471 471 3432 471 471 3432 254 126 3434 693 693 3435 126 254 3437 692 692 3438 951 951 3436 951 951 3436 692 692 3438 471 471 3439 47 47 3440 863 863 3441 860 860 3443 860 860 3443 863 863 3441 472 472 3442 472 472 3445 694 694 3446 860 860 3444 860 860 3444 694 694 3446 80 208 3447 693 693 3449 254 126 3450 472 472 3448 472 472 3448 254 126 3450 694 694 3451 82 210 3453 693 693 3454 863 863 3452 863 863 3452 693 693 3454 472 472 3455 40 40 3456 954 954 3457 818 818 3459 818 818 3459 954 954 3457 473 473 3458 818 818 3460 473 473 3461 59 187 3463 59 187 3463 473 473 3461 695 695 3462 473 473 3464 697 697 3465 695 695 3467 695 695 3467 697 697 3465 255 127 3466 127 255 3469 697 697 3470 954 954 3468 954 954 3468 697 697 3470 473 473 3471 54 54 3472 817 817 3473 868 868 3475 868 868 3475 817 817 3473 474 474 3474 474 474 3477 696 696 3478 868 868 3476 868 868 3476 696 696 3478 84 212 3479 695 695 3481 255 127 3482 474 474 3480 474 474 3480 255 127 3482 696 696 3483 59 187 3485 695 695 3486 817 817 3484 817 817 3484 695 695 3486 474 474 3487 53 53 3488 867 867 3489 953 953 3491 953 953 3491 867 867 3489 475 475 3490 953 953 3492 475 475 3493 127 255 3495 127 255 3495 475 475 3493 697 697 3494 475 475 3496 696 696 3497 697 697 3499 697 697 3499 696 696 3497 255 127 3498 867 867 3500 84 212 3501 475 475 3503 475 475 3503 84 212 3501 696 696 3502 953 953 3505 476 476 3506 53 53 3504 53 53 3504 476 476 3506 955 955 3507 955 955 3508 476 476 3509 128 256 3511 128 256 3511 476 476 3509 698 698 3510 700 700 3513 256 128 3514 476 476 3512 476 476 3512 256 128 3514 698 698 3515 127 255 3517 700 700 3518 953 953 3516 953 953 3516 700 700 3518 476 476 3519 956 956 3521 477 477 3522 52 52 3520 52 52 3520 477 477 3522 872 872 3523 477 477 3525 699 699 3526 872 872 3524 872 872 3524 699 699 3526 86 214 3527 698 698 3529 256 128 3530 477 477 3528 477 477 3528 256 128 3530 699 699 3531 128 256 3533 698 698 3534 956 956 3532 956 956 3532 698 698 3534 477 477 3535 40 40 3536 871 871 3537 954 954 3539 954 954 3539 871 871 3537 478 478 3538 954 954 3540 478 478 3541 127 255 3543 127 255 3543 478 478 3541 700 700 3542 478 478 3544 699 699 3545 700 700 3547 700 700 3547 699 699 3545 256 128 3546 871 871 3548 86 214 3549 478 478 3551 478 478 3551 86 214 3549 699 699 3550</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_Shape8</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_8" name="qt_gauge_background_8" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_Shape8">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert7SG" target="#default_darkgrey"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_8</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_round_background.dae b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_round_background.dae
new file mode 100644
index 0000000..c7b0753
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Backgrounds/gauge_round_background.dae
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:42:05</created>
+ <modified>2018-03-08T09:42:05</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="background_1" name="background_1">
+ <instance_effect url="#background_1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="background_1-fx">
+ <profile_COMMON>
+ <newparam sid="file1-surface">
+ <surface type="2D">
+ <init_from>file1</init_from>
+ </surface>
+ </newparam>
+ <newparam sid="file1-sampler">
+ <sampler2D>
+ <source>file1-surface</source>
+ </sampler2D>
+ </newparam>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <texture texture="file1-sampler" texcoord="TEX0">
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <wrapU sid="wrapU" type="bool">1</wrapU>
+ <wrapV sid="wrapV" type="bool">1</wrapV>
+ <mirrorU sid="mirrorU" type="bool">0</mirrorU>
+ <mirrorV sid="mirrorV" type="bool">0</mirrorV>
+ <coverageU sid="coverageU" type="float">1</coverageU>
+ <coverageV sid="coverageV" type="float">1</coverageV>
+ <translateFrameU sid="translateFrameU" type="float">0</translateFrameU>
+ <translateFrameV sid="translateFrameV" type="float">0</translateFrameV>
+ <rotateFrame sid="rotateFrame" type="float">0</rotateFrame>
+ <stagger sid="stagger" type="bool">0</stagger>
+ <fast sid="fast" type="bool">0</fast>
+ <repeatU sid="repeatU" type="float">1</repeatU>
+ <repeatV sid="repeatV" type="float">1</repeatV>
+ <offsetU sid="offsetU" type="float">0</offsetU>
+ <offsetV sid="offsetV" type="float">0</offsetV>
+ <rotateUV sid="rotateUV" type="float">0</rotateUV>
+ <noiseU sid="noiseU" type="float">0</noiseU>
+ <noiseV sid="noiseV" type="float">0</noiseV>
+ <blend_mode sid="blend_mode" type="string">NONE</blend_mode>
+ </technique>
+ </extra>
+ </texture>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">background_1</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_images>
+ <image id="file1" name="file1">
+ <init_from>../../../../../Documents/maya/projects/StudioModelLibrary/gradient.png</init_from>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">file1</originalMayaNodeId>
+ <dgnode_type sid="dgnode_type" type="string">kFile</dgnode_type>
+ <image_sequence sid="image_sequence" type="bool">0</image_sequence>
+ </technique>
+ </extra>
+ </image>
+ </library_images>
+ <library_geometries>
+ <geometry id="qt_gauge_background_round_Shape1" name="qt_gauge_background_round_Shape1">
+ <mesh>
+ <source id="qt_gauge_background_round_Shape1-positions" name="qt_gauge_background_round_Shape1-positions">
+ <float_array id="qt_gauge_background_round_Shape1-positions-array" count="123">0 -0.05637024 0 12.21704 -0.05637024 -1.934986 11.76393 -0.05637024 -3.822329 11.02115 -0.05637024 -5.615553 10.007 -0.05637024 -7.270504 8.746441 -0.05637024 -8.746431 7.270514 -0.05637024 -10.00699 5.615563 -0.05637024 -11.02115 3.822339 -0.05637024 -11.76393 1.934996 -0.05637024 -12.21704 0 -0.05637024 -12.36932 -1.934981 -0.05637024 -12.21704 -3.822324 -0.05637024 -11.76393 -5.615549 -0.05637024 -11.02115 -7.270499 -0.05637024 -10.00699 -8.746426 -0.05637024 -8.746434 -10.00699 -0.05637024 -7.270508 -11.02114 -0.05637024 -5.615557 -11.76392 -0.05637024 -3.822333 -12.21703 -0.05637024 -1.93499 -12.36932 -0.05637024 0 -12.21703 -0.05637024 1.934986 -11.76392 -0.05637024 3.822329 -11.02114 -0.05637024 5.615552 -10.00699 -0.05637024 7.270503 -8.746428 -0.05637024 8.746428 -7.270502 -0.05637024 10.00699 -5.615551 -0.05637024 11.02114 -3.822328 -0.05637024 11.76392 -1.934985 -0.05637024 12.21703 0 -0.05637024 12.36932 1.934991 -0.05637024 12.21703 3.822333 -0.05637024 11.76392 5.615557 -0.05637024 11.02114 7.270507 -0.05637024 10.00699 8.746433 -0.05637024 8.74643 10.00699 -0.05637024 7.270504 11.02115 -0.05637024 5.615553 11.76392 -0.05637024 3.82233 12.21704 -0.05637024 1.934988 12.36932 -0.05637024 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_round_Shape1-positions-array" count="41" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_round_Shape1-normals" name="qt_gauge_background_round_Shape1-normals">
+ <float_array id="qt_gauge_background_round_Shape1-normals-array" count="123">0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_round_Shape1-normals-array" count="41" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_round_Shape1-tangents" name="qt_gauge_background_round_Shape1-tangents">
+ <float_array id="qt_gauge_background_round_Shape1-tangents-array" count="123">-0.1564344 0 0.9876883 -0.9969176 0 0.07845511 -0.9723701 0 0.2334448 -0.9238794 0 0.3826838 -0.8526404 0 0.5224982 -0.7604064 0 0.6494476 -0.649448 0 0.760406 -0.5224988 0 0.85264 -0.3826834 0 0.9238796 -0.2334457 0 0.9723698 -0.07845939 0 0.9969173 0.07845939 0 0.9969173 0.2334453 0 0.9723699 0.3826834 0 0.9238795 0.5224983 0 0.8526403 0.649448 0 0.760406 0.7604058 0 0.6494483 0.8526403 0 0.5224983 0.9238794 0 0.3826838 0.9723698 0 0.2334458 0.9969173 0 0.07845891 0.9969173 0 -0.07845892 0.9723698 0 -0.2334458 0.9238797 0 -0.3826831 0.8526402 0 -0.5224984 0.7604057 0 -0.6494484 0.6494484 0 -0.7604057 0.5224988 0 -0.85264 0.3826835 0 -0.9238795 0.2334453 0 -0.9723699 0.07845892 0 -0.9969173 -0.07845893 0 -0.9969173 -0.2334453 0 -0.9723699 -0.3826835 0 -0.9238795 -0.5224986 0 -0.8526402 -0.649448 0 -0.760406 -0.7604064 0 -0.6494476 -0.8526402 0 -0.5224984 -0.9238797 0 -0.3826831 -0.9723698 0 -0.2334458 -0.9969173 0 -0.07845894</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_round_Shape1-tangents-array" count="41" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_round_Shape1-binormals" name="qt_gauge_background_round_Shape1-binormals">
+ <float_array id="qt_gauge_background_round_Shape1-binormals-array" count="123">0.9876884 0 0.1564344 0.07845511 0 0.9969177 0.2334448 0 0.9723701 0.3826838 0 0.9238794 0.5224983 0 0.8526404 0.6494476 0 0.7604064 0.760406 0 0.649448 0.85264 0 0.5224988 0.9238796 0 0.3826834 0.9723698 0 0.2334457 0.9969174 0 0.0784594 0.9969174 0 -0.0784594 0.97237 0 -0.2334453 0.9238796 0 -0.3826834 0.8526403 0 -0.5224983 0.760406 0 -0.649448 0.6494483 0 -0.7604058 0.5224983 0 -0.8526403 0.3826839 0 -0.9238794 0.2334458 0 -0.9723698 0.07845891 0 -0.9969174 -0.07845892 0 -0.9969174 -0.2334458 0 -0.9723699 -0.3826831 0 -0.9238797 -0.5224984 0 -0.8526402 -0.6494484 0 -0.7604057 -0.7604057 0 -0.6494484 -0.85264 0 -0.5224988 -0.9238795 0 -0.3826835 -0.97237 0 -0.2334453 -0.9969174 0 -0.07845892 -0.9969174 0 0.07845893 -0.97237 0 0.2334454 -0.9238795 0 0.3826835 -0.8526402 0 0.5224985 -0.760406 0 0.649448 -0.6494476 0 0.7604064 -0.5224984 0 0.8526402 -0.3826832 0 0.9238797 -0.2334458 0 0.9723699 -0.07845894 0 0.9969174</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_round_Shape1-binormals-array" count="41" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_round_Shape1-map1" name="qt_gauge_background_round_Shape1-map1">
+ <float_array id="qt_gauge_background_round_Shape1-map1-array" count="82">0.9829903 0.5760588 0.965077 0.6506734 0.5 0.4800001 0.9357118 0.7215669 0.8956181 0.786994 0.8457828 0.8453435 0.7874334 0.8951788 0.7220063 0.9352726 0.6511126 0.9646376 0.576498 0.982551 0.4999999 0.9885714 0.4235018 0.982551 0.3488873 0.9646376 0.2779936 0.9352724 0.2125665 0.8951788 0.154217 0.8453435 0.1043818 0.786994 0.06428802 0.7215669 0.03492293 0.6506734 0.0170095 0.5760586 0.01098901 0.4995606 0.0170095 0.4230624 0.03492293 0.3484479 0.06428802 0.2775542 0.1043819 0.212127 0.154217 0.1537776 0.2125666 0.1039423 0.2779937 0.0638485 0.3488874 0.03448343 0.423502 0.01657015 0.5000002 0.01054943 0.5764982 0.01657015 0.6511129 0.03448343 0.7220065 0.06384867 0.7874336 0.1039425 0.8457832 0.1537776 0.8956184 0.2121272 0.9357122 0.2775543 0.9650773 0.3484479 0.9829907 0.4230626 0.9890108 0.4995606</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_round_Shape1-map1-array" count="41" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_round_Shape1-textangents">
+ <float_array id="qt_gauge_background_round_Shape1-textangents-array" count="360">0.99923 0 0.03923369 0.9992946 0 0.03755501 0.9999999 0 0 0.9992946 0 0.03755501 0.9993877 0 0.03498796 0.9999999 0 0 0.9993877 0 0.03498796 0.9995004 0 0.03160663 0.9999999 0 0 0.9995004 0 0.03160663 0.9996218 0 0.0275004 0.9999999 0 0 0.9996218 0 0.0275004 0.9997407 0 0.02277226 0.9999999 0 0 0.9997407 0 0.02277226 0.9998462 0 0.01753606 0.9999999 0 0 0.9998462 0 0.01753606 0.9999291 0 0.01191041 0.9999999 0 0 0.9999291 0 0.01191041 0.9999819 0 0.006021972 0.9999999 0 0 0.9999819 0 0.006021972 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999819 0 -0.006021731 0.9999999 0 0 0.9999819 0 -0.006021731 0.9999291 0 -0.01190872 0.9999999 0 0 0.9999291 0 -0.01190872 0.9998462 0 -0.01753562 0.9999999 0 0 0.9998462 0 -0.01753562 0.9997406 0 -0.02277302 0.9999999 0 0 0.9997406 0 -0.02277302 0.9996217 0 -0.02749999 0.9999999 0 0 0.9996217 0 -0.02749999 0.9995004 0 -0.03160628 0.9999999 0 0 0.9995004 0 -0.03160628 0.9993877 0 -0.03498763 0.9999999 0 0 0.9993877 0 -0.03498763 0.9992946 0 -0.03755426 0.9999999 0 0 0.9992946 0 -0.03755426 0.99923 0 -0.03923308 0.9999999 0 0 0.99923 0 -0.03923308 0.9992009 0 -0.03996847 0.9999999 0 0 0.9992009 0 -0.03996847 0.9992107 0 -0.03972372 0.9999999 0 0 0.9992107 0 -0.03972372 0.9992591 0 -0.03848723 0.9999999 0 0 0.9992591 0 -0.03848723 0.999342 0 -0.03627167 0.9999999 0 0 0.999342 0 -0.03627167 0.9994515 0 -0.03311634 0.9999999 0 0 0.9994515 0 -0.03311634 0.9995768 0 -0.02908958 0.9999999 0 0 0.9995768 0 -0.02908958 0.9997051 0 -0.02428564 0.9999999 0 0 0.9997051 0 -0.02428564 0.9998229 0 -0.0188228 0.9999999 0 0 0.9998229 0 -0.0188228 0.9999175 0 -0.01284432 0.9999999 0 0 0.9999175 0 -0.01284432 0.9999788 0 -0.006513726 0.9999999 0 0 0.9999788 0 -0.006513726 1 0 0 0.9999999 0 0 1 0 0 0.9999788 0 0.006513726 0.9999999 0 0 0.9999788 0 0.006513726 0.9999174 0 0.01284546 0.9999999 0 0 0.9999174 0 0.01284546 0.9998227 0 0.01882427 0.9999999 0 0 0.9998227 0 0.01882427 0.9997051 0 0.02428535 0.9999999 0 0 0.9997051 0 0.02428535 0.9995768 0 0.02908969 0.9999999 0 0 0.9995768 0 0.02908969 0.9994515 0 0.03311725 0.9999999 0 0 0.9994515 0 0.03311725 0.999342 0 0.0362716 0.9999999 0 0 0.999342 0 0.0362716 0.9992591 0 0.03848734 0.9999999 0 0 0.9992591 0 0.03848734 0.9992107 0 0.03972423 0.9999999 0 0 0.9992107 0 0.03972423 0.9992009 0 0.03996859 0.9999999 0 0 0.9992009 0 0.03996859 0.99923 0 0.03923369 0.9999999 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_round_Shape1-textangents-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_background_round_Shape1-texbinormals">
+ <float_array id="qt_gauge_background_round_Shape1-texbinormals-array" count="360">0.03923369 0 -0.9992301 0.03755501 0 -0.9992946 0 0 -1 0.03755501 0 -0.9992946 0.03498796 0 -0.9993878 0 0 -1 0.03498796 0 -0.9993878 0.03160663 0 -0.9995004 0 0 -1 0.03160663 0 -0.9995004 0.0275004 0 -0.9996218 0 0 -1 0.0275004 0 -0.9996218 0.02277226 0 -0.9997408 0 0 -1 0.02277226 0 -0.9997408 0.01753607 0 -0.9998463 0 0 -1 0.01753607 0 -0.9998463 0.01191041 0 -0.9999291 0 0 -1 0.01191041 0 -0.9999291 0.006021972 0 -0.9999819 0 0 -1 0.006021972 0 -0.9999819 0 0 -1 0 0 -1 0 0 -1 -0.006021731 0 -0.9999819 0 0 -1 -0.006021731 0 -0.9999819 -0.01190872 0 -0.9999292 0 0 -1 -0.01190872 0 -0.9999292 -0.01753562 0 -0.9998463 0 0 -1 -0.01753562 0 -0.9998463 -0.02277302 0 -0.9997407 0 0 -1 -0.02277302 0 -0.9997407 -0.02749999 0 -0.9996219 0 0 -1 -0.02749999 0 -0.9996219 -0.03160628 0 -0.9995004 0 0 -1 -0.03160628 0 -0.9995004 -0.03498763 0 -0.9993877 0 0 -1 -0.03498763 0 -0.9993877 -0.03755426 0 -0.9992947 0 0 -1 -0.03755426 0 -0.9992947 -0.03923309 0 -0.9992301 0 0 -1 -0.03923309 0 -0.9992301 -0.03996847 0 -0.999201 0 0 -1 -0.03996847 0 -0.999201 -0.03972372 0 -0.9992108 0 0 -1 -0.03972372 0 -0.9992108 -0.03848723 0 -0.9992592 0 0 -1 -0.03848723 0 -0.9992592 -0.03627167 0 -0.999342 0 0 -1 -0.03627167 0 -0.999342 -0.03311634 0 -0.9994515 0 0 -1 -0.03311634 0 -0.9994515 -0.02908958 0 -0.9995769 0 0 -1 -0.02908958 0 -0.9995769 -0.02428564 0 -0.9997051 0 0 -1 -0.02428564 0 -0.9997051 -0.0188228 0 -0.9998229 0 0 -1 -0.0188228 0 -0.9998229 -0.01284432 0 -0.9999175 0 0 -1 -0.01284432 0 -0.9999175 -0.006513726 0 -0.9999788 0 0 -1 -0.006513726 0 -0.9999788 0 0 -1 0 0 -1 0 0 -1 0.006513726 0 -0.9999788 0 0 -1 0.006513726 0 -0.9999788 0.01284546 0 -0.9999176 0 0 -1 0.01284546 0 -0.9999176 0.01882427 0 -0.9998229 0 0 -1 0.01882427 0 -0.9998229 0.02428535 0 -0.9997051 0 0 -1 0.02428535 0 -0.9997051 0.02908969 0 -0.9995768 0 0 -1 0.02908969 0 -0.9995768 0.03311725 0 -0.9994516 0 0 -1 0.03311725 0 -0.9994516 0.0362716 0 -0.999342 0 0 -1 0.0362716 0 -0.999342 0.03848734 0 -0.9992591 0 0 -1 0.03848734 0 -0.9992591 0.03972423 0 -0.9992107 0 0 -1 0.03972423 0 -0.9992107 0.03996859 0 -0.999201 0 0 -1 0.03996859 0 -0.999201 0.03923369 0 -0.9992301 0 0 -1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_background_round_Shape1-texbinormals-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_background_round_Shape1-vertices" name="qt_gauge_background_round_Shape1-vertices">
+ <input semantic="POSITION" source="#qt_gauge_background_round_Shape1-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_background_round_Shape1-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_background_round_Shape1-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_background_round_Shape1-binormals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="40">
+ <input semantic="VERTEX" source="#qt_gauge_background_round_Shape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_background_round_Shape1-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_background_round_Shape1-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_background_round_Shape1-texbinormals" offset="2" set="0"/>
+ <p>1 0 0 2 1 1 0 2 2 2 1 3 3 3 4 0 2 5 3 3 6 4 4 7 0 2 8 4 4 9 5 5 10 0 2 11 5 5 12 6 6 13 0 2 14 6 6 15 7 7 16 0 2 17 7 7 18 8 8 19 0 2 20 8 8 21 9 9 22 0 2 23 9 9 24 10 10 25 0 2 26 10 10 27 11 11 28 0 2 29 11 11 30 12 12 31 0 2 32 12 12 33 13 13 34 0 2 35 13 13 36 14 14 37 0 2 38 14 14 39 15 15 40 0 2 41 15 15 42 16 16 43 0 2 44 16 16 45 17 17 46 0 2 47 17 17 48 18 18 49 0 2 50 18 18 51 19 19 52 0 2 53 19 19 54 20 20 55 0 2 56 20 20 57 21 21 58 0 2 59 21 21 60 22 22 61 0 2 62 22 22 63 23 23 64 0 2 65 23 23 66 24 24 67 0 2 68 24 24 69 25 25 70 0 2 71 25 25 72 26 26 73 0 2 74 26 26 75 27 27 76 0 2 77 27 27 78 28 28 79 0 2 80 28 28 81 29 29 82 0 2 83 29 29 84 30 30 85 0 2 86 30 30 87 31 31 88 0 2 89 31 31 90 32 32 91 0 2 92 32 32 93 33 33 94 0 2 95 33 33 96 34 34 97 0 2 98 34 34 99 35 35 100 0 2 101 35 35 102 36 36 103 0 2 104 36 36 105 37 37 106 0 2 107 37 37 108 38 38 109 0 2 110 38 38 111 39 39 112 0 2 113 39 39 114 40 40 115 0 2 116 40 40 117 1 0 118 0 2 119</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_background_round_Shape1</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_background_round_1" name="qt_gauge_background_round_1" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_background_round_Shape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#background_1">
+ <bind_vertex_input semantic="TEX0" input_semantic="TEXCOORD" input_set="0"/>
+ </instance_material>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_background_round_1</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_1.dae
new file mode 100644
index 0000000..41c0ce7
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_1.dae
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:53:58</created>
+ <modified>2018-03-08T09:53:58</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="red_transparent" name="red_transparent">
+ <instance_effect url="#red_transparent-fx"/>
+ </material>
+ <material id="black_solid" name="black_solid">
+ <instance_effect url="#black_solid-fx"/>
+ </material>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="black_solid-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2938931 0.2938931 0.2938931 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03053435 0.03053435 0.03053435 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">black_solid</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="red_transparent-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.56808 0.05568 0.05568 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0.2251908 0.2251908 0.2251908 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">red_transparent</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_1Shape" name="qt_gauge_needles_1Shape">
+ <mesh>
+ <source id="qt_gauge_needles_1Shape-positions" name="qt_gauge_needles_1Shape-positions">
+ <float_array id="qt_gauge_needles_1Shape-positions-array" count="360">-0.3002472 1.746292 -1 0.3002319 1.746292 -1 0.05418396 1.746292 -12 -0.05419922 1.746292 -12 -0.3002385 2.253457 -0.9996252 -0.2460685 2.307638 -0.9988608 0.2460434 2.307638 -0.9993942 0.3002253 2.253459 -0.9996251 0.1464934 2.1055 2.096445 0.09296012 2.158816 2.112278 0.10887 2.101303 2.165572 -0.1088729 2.101303 2.165572 -0.09302998 2.158812 2.112308 -0.1465058 2.1055 2.096445 0 2.155387 -12 -0.05419922 2.101211 -12 0.05418396 2.101211 -12 0.0382936 2.10462 2.226923 0 2.155387 2.188438 -0.03832078 2.10462 2.226923 -0.03832078 1.746292 2.226923 0.0382936 1.746292 2.226923 0.1098125 1.746292 2.164744 0.1463506 1.746292 2.0974 -0.146374 1.746292 2.0974 -0.1098225 1.746292 2.164744 -0.3002486 1.746292 0.7783952 -0.269464 1.746292 1.219458 0.2694612 1.746292 1.219458 0.3002305 1.746292 0.7783952 -0.2460089 2.307638 0.7781916 -0.2159837 2.278428 1.218312 -0.2696756 2.224094 1.21798 -0.3002399 2.253515 0.7779309 0.300224 2.253515 0.7779309 0.2696615 2.224094 1.21798 0.2159458 2.278428 1.218311 0.245995 2.307638 0.7781911 0.4370084 0 1.344998 0.8312421 0 1.144124 1.144121 0 0.8312544 1.34499 0 0.4370162 1.414215 0 0 1.344997 0 -0.4370162 1.144118 0 -0.8312542 0.8312492 0 -1.144123 0.4370155 0 -1.344997 0 0 -1.414214 -0.4370232 0 -1.344997 -0.8312569 0 -1.144123 -1.144135 0 -0.831254 -1.345006 0 -0.4370161 -1.414215 0 0 -1.344997 0 0.437016 -1.144134 0 0.8312538 -0.8312647 0 1.144123 -0.4370159 0 1.344997 0 0 1.414214 0 0 0 0 2 0 0.4370084 1.581002 1.344998 0.3986113 1.877278 1.226828 0.30592 2 0.9415401 0.8312421 1.581002 1.144124 0.758217 1.877278 1.043602 0.5818974 2 0.800922 1.144121 1.581002 0.8312544 1.043591 1.877278 0.7582213 0.8009133 2 0.5819039 1.34499 1.581002 0.4370162 1.226822 1.877278 0.3986205 0.9415299 2 0.305925 1.414215 1.581002 0 1.289948 1.877278 0 0.9899903 2 0 1.344997 1.581002 -0.4370162 1.226822 1.877278 -0.3986205 0.9415269 2 -0.3059248 1.144118 1.581002 -0.8312542 1.043598 1.877278 -0.7582211 0.8009089 2 -0.5819036 0.8312492 1.581002 -1.144123 0.7582172 1.877278 -1.043602 0.5818909 2 -0.8009216 0.4370155 1.581002 -1.344997 0.3986151 1.877278 -1.226827 0.305912 2 -0.9415399 0 1.581002 -1.414214 0 1.877278 -1.289963 0 2 -0.9899935 -0.4370232 1.581002 -1.344997 -0.3986261 1.877278 -1.226827 -0.305935 2 -0.9415399 -0.8312569 1.581002 -1.144123 -0.7582319 1.877278 -1.043602 -0.5819122 2 -0.8009217 -1.144135 1.581002 -0.831254 -1.043606 1.877278 -0.758221 -0.8009282 2 -0.5819036 -1.345006 1.581002 -0.4370161 -1.226837 1.877278 -0.3986204 -0.941545 2 -0.3059248 -1.414215 1.581002 0 -1.289978 1.877278 0 -0.9900056 2 0 -1.344997 1.581002 0.437016 -1.226838 1.877278 0.3986202 -0.9415424 2 0.3059246 -1.144134 1.581002 0.8312538 -1.043613 1.877278 0.7582207 -0.8009244 2 0.5819033 -0.8312647 1.581002 1.144123 -0.7582327 1.877278 1.043601 -0.5819064 2 0.8009213 -0.4370159 1.581002 1.344997 -0.3986307 1.877278 1.226827 -0.3059276 2 0.9415395 0 1.581002 1.414214 0 1.877278 1.289962 0 2 0.9899932</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_1Shape-positions-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_1Shape-normals" name="qt_gauge_needles_1Shape-normals">
+ <float_array id="qt_gauge_needles_1Shape-normals-array" count="480">0.9995167 0 -0.0310844 -0.9995167 0 -0.03108434 -0.9932553 0.1104729 -0.0352066 0 0.9977242 -0.06742734 0.9932576 0.1104519 -0.03520712 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 -0.9937834 0.1095181 -0.02000991 -0.1611661 0.9868332 -0.01362102 0.1614835 0.9867811 -0.01363941 0.9938191 0.1091955 -0.02000218 0.9789321 0.1098265 0.1721333 0.7558041 0.1077431 0.6458725 0.7691316 4.87871e-4 0.6390902 0.9866001 0 0.1631568 0.09607538 0.9841148 0.1492905 0 0.9879273 0.1549175 0.3984169 0.1072559 0.9109117 -0.7558136 0.1077126 0.6458666 -0.9789414 0.1097595 0.1721228 -0.9866002 0 0.1631569 -0.7691592 5.01997e-4 0.639057 -0.09608163 0.9841138 0.149293 -0.3984447 0.1072214 0.9109035 -0.3851372 0 0.9228592 0.3850913 0 0.9228786 -0.9998234 0 -0.01879276 0.9998234 0 -0.01879258 -0.9999087 0 0.01351349 -0.9935569 0 0.1133336 -0.9864298 0.1089533 0.1228224 -0.9951587 0.09723701 0.01429426 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0.9935569 0 0.1133333 0.9999087 0 0.01351103 0.9951566 0.09725665 0.01429259 0.9864215 0.1090196 0.1228308 -0.1003893 0.9948565 0.01350847 -0.1320875 0.9842951 0.1171154 0.1320769 0.9842962 0.1171183 0.1003989 0.9948556 0.01350851 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0.3090196 0 0.9510556 0.5877826 0 0.8090189 0.5866697 0.06150924 0.807487 0.308434 0.06151011 0.9492549 0.8090143 0 0.5877889 0.8074828 0.06150994 0.5866753 0.9510552 0 0.3090207 0.9492545 0.06151228 0.3084349 0.9999999 0 0 0.9981063 0.06151361 0 0.9510545 0 -0.3090234 0.9492539 0.06151237 -0.3084368 0.8090146 0 -0.5877884 0.8074831 0.06150975 -0.5866752 0.5877876 0 -0.8090153 0.5866743 0.06150977 -0.8074836 0.309019 0 -0.9510558 0.3084337 0.06151067 -0.949255 0 0 -0.9999999 0 0.06150953 -0.9981065 -0.3090157 0 -0.951057 -0.3084308 0.06150859 -0.9492561 -0.5877824 0 -0.8090189 -0.5866696 0.06150919 -0.8074872 -0.809014 0 -0.5877894 -0.8074825 0.06150993 -0.5866758 -0.9510602 0 -0.3090054 -0.9492589 0.06150856 -0.3084221 -1 0 0 -0.9981068 0.06150487 0 -0.9510597 0 0.3090072 -0.9492587 0.06150552 0.3084234 -0.8090229 0 0.5877769 -0.8074908 0.06150816 0.5866646 -0.5877792 0 0.8090214 -0.5866666 0.06150845 0.8074892 -0.3090139 0 0.9510575 -0.3084287 0.06150815 0.9492568 0 0 1 0 0.06150964 0.9981065 0.05698305 0.9828505 0.175378 0.1083897 0.9828507 0.149185 0 1 0 0.1491857 0.9828507 0.1083889 0.1753765 0.9828509 0.05698346 0.1844066 0.98285 0 0.1753753 0.9828512 -0.05698312 0.1491839 0.982851 -0.1083885 0.1083883 0.9828509 -0.1491844 0.05698344 0.9828506 -0.1753784 0 0.9828508 -0.1844026 -0.0569834 0.982851 -0.1753764 -0.1083892 0.9828508 -0.1491843 -0.1491847 0.9828508 -0.108388 -0.1753739 0.9828512 -0.05698483 -0.1844028 0.9828507 0 -0.1753728 0.9828513 0.05698411 -0.1491829 0.9828511 0.1083879 -0.1083877 0.982851 0.1491838 -0.05698351 0.9828509 0.1753767 0 0.9828508 0.1844026 0.2305076 0.6660088 0.7094353 0 0.6660079 0.7459447 0.4384575 0.6660049 0.6034835 0.6034798 0.6660098 0.4384553 0.7094341 0.6660098 0.2305085 0.7459365 0.6660171 0 0.7094305 0.6660144 -0.2305062 0.6034783 0.6660128 -0.4384529 0.4384542 0.6660117 -0.6034786 0.2305083 0.6660097 -0.7094344 0 0.6660069 -0.7459456 -0.2305094 0.6660066 -0.7094368 -0.4384575 0.6660048 -0.6034837 -0.6034796 0.66601 -0.4384554 -0.7094355 0.6660072 -0.2305115 -0.745952 0.6659997 0 -0.7094389 0.6660044 0.2305096 -0.6034827 0.6660102 0.4384508 -0.4384532 0.6660089 0.6034824 -0.2305124 0.6660051 0.7094373</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_1Shape-normals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_1Shape-tangents" name="qt_gauge_needles_1Shape-tangents">
+ <float_array id="qt_gauge_needles_1Shape-tangents-array" count="480">-0.0310844 0 -0.9995168 0 0.9999998 6.35422e-4 0.03542343 0 -0.9993723 0.06724656 -0.06727557 -0.9954656 -0.03186601 -0.03187077 -0.9989839 -0.99975 0 0.0223624 0 0 -1 0.9997499 0 0.0223624 0 0 1 0.1097578 0.993894 -0.0113007 0.02398826 -0.009880436 -0.9996635 0.9866351 -0.1617337 -0.01982899 -0.01855095 -0.01429 -0.9997258 -0.173473 0.002689523 0.9848349 0.1315497 -0.9912438 0.01141686 0.6390851 0.003489494 -0.7691282 0 1 0 -0.9438673 0.04245131 0.3275857 0.6317734 -0.120088 0.7657945 0.8499907 0.3300017 -0.4106274 -0.6493531 0.003509674 -0.7604789 -0.1113711 -0.9937788 2.95812e-4 0.1631565 0.002685128 0.9865965 4.49813e-4 0.9999999 -2.4414e-4 -0.6273026 -0.17632 0.758553 0.03986515 0.9942295 -0.09959196 0.9228593 0 0.3851372 0 1 0 0 1 0 -0.01879259 7.38736e-4 -0.9998232 0.01351349 9.14981e-4 0.9999083 0 1 0 -0.1238972 -0.003124506 -0.9922902 -0.09792215 -0.9934069 -0.05961544 0 0 -1 0.9975731 0 -0.06962702 0 0 1 -0.9975755 0 -0.06959268 0.1133327 -0.003121073 -0.9935523 0 0.9999999 0 -0.01445008 9.15135e-4 0.9998952 0.1168189 -0.991448 -0.05817298 0 -0.01357696 0.9999079 0.9885015 0.1395735 -0.05817256 0 0.1181537 -0.9929953 -0.9930047 0.1010417 -0.0610914 0 0 1 -1 0 0 0 0 -1 1 0 0 0.9903142 0 -0.1388449 0 0 1 -0.990311 0 -0.1388676 -0.8789623 0 -0.4768914 -0.6561082 0 -0.7546668 0 0 -1 0.6561978 0 -0.7545888 0.8788892 0 -0.4770259 -0.8090211 0 0.5877795 -0.4539945 0 -0.8910044 0.9510581 0 -0.3090119 -0.5877863 0 0.8090163 -0.3090185 0 0.9510559 0 0 0.9999999 0.3090172 0 0.9510564 0.587787 0 0.8090157 0.8090186 0 0.587783 0.9510566 0 0.3090166 0.9999999 0 0 0.9510551 0 -0.3090215 0.809016 0 -0.5877865 0.587781 0 -0.80902 0.3090153 0 -0.9510571 0 0 -0.9999999 -0.309017 0 -0.9510565 -0.5877815 0 -0.8090196 -0.8090133 0 -0.5877903 -0.9510564 0 -0.3090169 -0.9999999 0 0 0.9510556 0 -0.3090196 0 1 0 -0.8090189 0 0.5877826 0.02827201 -0.9980591 0.05548633 0 1 0 -0.5877883 0 0.8090147 0 0.9999999 0 -0.3090201 0 0.9510556 0 1 0 0 0 1 0 1 0 0.3090219 0 0.951055 0 0.9999999 0 0.5877882 0 0.8090149 0 0.9999999 0 0.8090155 0 0.5877873 0 1 0 0.9510559 0 0.3090188 0 0.9999999 0 1 0 0 0 1 0 0.9510568 0 -0.3090159 0 1 0 0.809019 0 -0.5877825 0 1 0 0.5877888 0 -0.8090144 0 1 0 0.3090072 0 -0.9510597 0 0.9999999 0 0 0 -1 0 1 0 -0.3090084 0 -0.9510593 0 0.9999999 0 -0.5877775 0 -0.8090226 0 1 0 -0.8090211 0 -0.5877796 0 1 0 -0.9510576 0 -0.3090138 0 0.9999999 0 -1 0 0 0.951058 0 -0.3090125 -0.4463921 0.1822086 -0.8760902 -0.8090202 0 0.587781 -0.6952732 0.1822087 -0.6952664 -0.8760934 0.1822075 -0.4463862 -0.9711505 0.1822114 -0.1538364 -0.9711499 0.1822069 0.1538455 -0.8760915 0.182207 0.4463903 -0.6952699 0.1822072 0.6952699 -0.4463907 0.1822091 0.8760909 -0.1538201 0.1822081 0.9711537 0.1538121 0.1822071 0.9711553 0.4463927 0.1822077 0.8760902 0.6952732 0.1822074 0.6952665 0.8760933 0.1822059 0.4463871 0.9711512 0.1822077 0.1538371 0.9711505 0.1822047 -0.1538452 0.8760917 0.1822059 -0.4463903 0.69527 0.1822064 -0.69527 0.4463905 0.1822076 -0.8760912 0.1538205 0.182208 -0.9711537 -0.9510562 0 0.3090179 0.1049002 -0.7418289 0.6623336 -0.3044367 0.7418312 -0.5974988 -0.4741845 0.7418279 -0.4741735 -0.5974984 0.7418266 -0.3044486 -0.6623432 0.7418219 -0.104889 -0.6623433 0.7418218 0.1048886 -0.5975048 0.7418243 0.3044417 -0.4741808 0.7418256 0.4741807 -0.304441 0.7418273 0.5975013 -0.1049006 0.7418298 0.6623325 0.1049054 0.7418303 0.6623312 0.3044364 0.7418313 0.5974988 0.4741845 0.7418277 0.4741736 0.5974958 0.741829 0.3044479 0.6623247 0.7418352 0.1049116 0.6623275 0.7418328 -0.1049111 0.5975023 0.741827 -0.3044401 0.4741789 0.7418279 -0.474179 0.3044388 0.7418317 -0.5974972</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_1Shape-tangents-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_1Shape-binormals" name="qt_gauge_needles_1Shape-binormals">
+ <float_array id="qt_gauge_needles_1Shape-binormals-array" count="480">0 1 0 0.03108435 6.35115e-4 -0.9995166 -0.1104036 -0.9938791 -0.003913329 -0.9977365 -0.004521546 -0.06709439 -0.1114618 0.9933704 -0.02813623 -0.0223624 0 -0.99975 1 0 0 -0.02236241 0 0.99975 -1 0 0 0.0186501 -0.01342669 -0.999736 -0.9866358 -0.1614386 -0.02208002 -0.02177283 -0.01025506 -0.9997104 -0.1094514 0.9939176 -0.012176 0.107698 -0.9939471 0.02168479 0.6414473 0.07633545 -0.7633599 -0.002605337 0.9999938 0.002372089 -0.1631569 0 0.9866002 0.3160444 -0.1723834 0.9329523 0.7751532 0.09786878 -0.6241469 -0.3446445 0.9378673 0.04031169 -0.08417993 -0.9941759 0.06729085 0.1710845 -0.01887993 0.9850755 -3.65011e-4 0.9999965 -0.002661234 -0.639057 0 -0.7691593 0.7728258 -0.0207689 0.6342782 -0.9163257 -0.003368583 -0.4004199 0 1 0 -0.9228786 0 0.3850913 0.01879276 0 -0.9998234 0 0.9999998 7.3892e-4 0 0.9999996 -9.14904e-4 -0.1133336 0 -0.993557 -0.1077295 -0.994042 0.01658112 0.008403183 -0.06072655 0.9981191 1 0 0 0.06962702 0 0.9975731 -1 0 0 0.06959268 0 -0.9975755 3.76934e-4 0.9999952 -0.003098316 -0.01351103 0 0.9999088 0.09723338 -0.995259 0.002316069 0.1154383 0.07173204 -0.9907213 0.9949483 0.1003801 0.001362018 -0.07360518 0.1080849 -0.9914132 -0.9912395 0.1311514 0.01560787 -0.06214204 -0.007280504 0.9980408 -1 0 0 0 0 -1 1 0 0 0 0 1 0.1388449 0 0.9903141 -1 0 0 0.1388676 0 -0.990311 0.4768913 0 -0.8789622 0.7546669 0 -0.6561083 1 0 0 0.7545889 0 0.6561979 0.477026 0 0.8788893 -0.5877796 0 -0.8090212 0.8910046 0 -0.4539945 0.3090119 0 0.9510581 -0.8090163 0 -0.5877863 -0.9510561 0 -0.3090185 -1 0 0 -0.9510565 0 0.3090172 -0.8090158 0 0.587787 -0.587783 0 0.8090187 -0.3090166 0 0.9510566 0 0 1 0.3090215 0 0.9510551 0.5877866 0 0.8090161 0.8090201 0 0.5877811 0.9510571 0 0.3090153 1 0 0 0.9510565 0 -0.309017 0.8090197 0 -0.5877815 0.5877903 0 -0.8090134 0.3090169 0 -0.9510565 0 0 -1 0 1 0 -0.8090189 0 0.5877826 0.03615407 -0.9981066 0.04976214 0.9508256 0.009723474 -0.3095744 -0.5877889 0 0.8090144 0.04976245 -0.9981065 0.03615483 -0.3090207 0 0.9510554 0.05850159 -0.9981063 0.01900853 0 0 1 0.06151361 -0.9981063 0 0.3090234 0 0.9510545 0.05850164 -0.9981063 -0.01900867 0.5877885 0 0.8090147 0.0497623 -0.9981065 -0.0361547 0.8090153 0 0.5877876 0.03615466 -0.9981065 -0.04976236 0.9510559 0 0.3090191 0.01900795 -0.9981065 -0.05850009 1 0 0 0 -0.9981066 -0.06150954 0.951057 0 -0.3090157 -0.01900713 -0.9981066 -0.05849817 0.809019 0 -0.5877826 -0.03615403 -0.9981066 -0.04976211 0.5877894 0 -0.809014 -0.04976241 -0.9981065 -0.03615484 0.3090054 0 -0.9510604 -0.05849831 -0.9981065 -0.01900659 0 0 -1 -0.06150487 -0.9981068 0 -0.3090072 0 -0.9510597 -0.05849541 -0.9981068 0.01900572 -0.587777 0 -0.809023 -0.0497615 -0.9981067 0.03615312 -0.8090214 0 -0.5877792 -0.03615342 -0.9981066 0.04976164 -0.9510576 0 -0.3090139 -0.01900687 -0.9981066 0.05849779 -1 0 0 0 -0.9981065 0.06150964 -0.3037131 0.1844032 -0.9347481 -0.8882487 0.02836413 0.4584864 0.587781 0 0.8090202 -0.7030924 0.02836393 0.7105326 -0.449114 0.02836282 0.8930242 -0.151198 0.02836888 0.9880964 0.16159 0.02835845 0.9864504 0.4584844 0.02836402 0.8882498 0.7105292 0.02836431 0.7030959 0.893022 0.02836461 0.4491182 0.9880989 0.02836417 0.1511824 0.9864557 0.02836471 -0.1615572 0.8882485 0.02836394 -0.4584868 0.7030926 0.02836382 -0.7105325 0.4491152 0.02836064 -0.8930237 0.1511988 0.02836824 -0.9880962 -0.1615897 0.0283599 -0.9864506 -0.4584842 0.02836392 -0.8882499 -0.7105292 0.0283643 -0.7030959 -0.8930221 0.02836371 -0.4491181 -0.9880989 0.02836481 -0.1511826 0.2058114 -0.7459438 0.633411 0.9944828 0.07825198 -0.06986188 -0.8456202 0.07825535 0.5280178 -0.6410626 0.07824548 0.7634896 -0.3737631 0.07825773 0.924217 -0.06985918 0.07823934 0.9944839 0.2408519 0.07826304 0.9674013 0.5280171 0.07825376 0.8456207 0.7634858 0.07825148 0.6410665 0.9242195 0.07825197 0.373758 0.9944828 0.07825245 0.0698619 0.9673987 0.07824977 -0.2408666 0.8456202 0.07825541 -0.5280176 0.6410628 0.07824535 -0.7634896 0.3737646 0.0782565 -0.9242164 0.06986895 0.07826099 -0.9944816 -0.2408709 0.0782448 -0.9673981 -0.5280148 0.07825104 -0.8456223 -0.7634876 0.07825333 -0.6410642 -0.9242192 0.07824974 -0.3737592</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_1Shape-binormals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_1Shape-map1" name="qt_gauge_needles_1Shape-map1">
+ <float_array id="qt_gauge_needles_1Shape-map1-array" count="364">0.125 0 0.375 0 0.375 0.2168929 0.1475625 0.25 0.25 0.25 0.6524243 0 0.6532698 0.2169493 0.75 0.25 0.7159615 0.2189761 0.7840385 0 0.3524334 0.25 0.125 0.2258729 0.125 0 0.125 0.2168929 0.7840385 0.2189761 0.8475757 0 0.8467302 0.2169493 0.7159615 0 0.5972994 0 0.625 0.2140784 0.625 0.9884558 0.625 0.786264 0.625 0.75 0.625 0.55812 0.625 0.3040191 0.625 0.4661455 0.625 0.2725836 0.625 0.2263644 0.625 0.5190461 0.625 0.4774164 0.375 0.75 0.5972993 1 0.375 1 0.875 0 0.625 0 0.3750468 0.22587 0.5972739 0.2725804 0.6262464 0.2439392 0.6705356 0.25 0.3750757 0.477443 0.5972425 0.5241042 0.8673054 0.25 0.875 0.219514 0.375 0 0.5972414 0.2258957 0.3751424 0.2725543 0.5972739 0.4774193 0.3750468 0.5241292 0.5972994 0.75 0.875 0.2246296 0.8749999 0 0.8491544 0.25 0.6520883 0.25 0.8357967 0.25 0.625 0.2246295 0.625 0 0.625 0.219514 0.626409 0.0644085 0.6486027 0.1079661 0.5 0.15 0.5918415 0.02984102 0.5482839 0.007647336 0.5 0 0.4517161 0.00764735 0.4081585 0.02984105 0.3735911 0.06440853 0.3513974 0.1079661 0.34375 0.15625 0.3513974 0.2045339 0.3735911 0.2480915 0.4081585 0.2826589 0.4517161 0.3048526 0.5 0.3125 0.5482839 0.3048526 0.5918415 0.2826589 0.6264089 0.2480915 0.6486026 0.2045339 0.65625 0.15625 0.375 0.3125 0.3875 0.3125 0.3875 0.6096809 0.375 0.6096809 0.4 0.3125 0.4 0.6096809 0.4125 0.3125 0.4125 0.6096809 0.425 0.3125 0.425 0.6096809 0.4374999 0.3125 0.4374999 0.6096809 0.4499999 0.3125 0.4499999 0.6096809 0.4624999 0.3125 0.4624999 0.6096809 0.4749999 0.3125 0.4749999 0.6096809 0.4874999 0.3125 0.4874999 0.6096809 0.4999999 0.3125 0.4999999 0.6096809 0.5124999 0.3125 0.5124999 0.6096809 0.5249999 0.3125 0.5249999 0.6096809 0.5374998 0.3125 0.5374998 0.6096809 0.5499998 0.3125 0.5499998 0.6096809 0.5624998 0.3125 0.5624998 0.6096809 0.5749998 0.3125 0.5749998 0.6096809 0.5874998 0.3125 0.5874998 0.6096809 0.5999998 0.3125 0.5999998 0.6096809 0.6124998 0.3125 0.6124998 0.6096809 0.6249998 0.3125 0.6249998 0.6096809 0.6040264 0.8756755 0.5884902 0.9061671 0.5 0.8375 0.5642918 0.9303652 0.5338002 0.9459018 0.5 0.9512551 0.4661998 0.9459017 0.4357082 0.9303653 0.4115099 0.906167 0.3959735 0.8756755 0.3906202 0.8418752 0.3959735 0.808075 0.4115098 0.7775833 0.435708 0.7533849 0.4661997 0.7378487 0.5 0.7324953 0.5338002 0.7378487 0.564292 0.7533849 0.5884902 0.7775833 0.6040265 0.808075 0.6093798 0.8418752 0.6249998 0.6884398 0.6124998 0.6884398 0.6486026 0.8920339 0.65625 0.84375 0.6264089 0.9355915 0.375 0.6884398 0.3875 0.6884398 0.5918415 0.9701589 0.4 0.6884398 0.5482839 0.9923526 0.4125 0.6884398 0.5 1 0.425 0.6884398 0.4517161 0.9923526 0.4374999 0.6884398 0.4081585 0.9701589 0.4499999 0.6884398 0.3735911 0.9355915 0.4624999 0.6884398 0.3513974 0.8920339 0.4749999 0.6884398 0.34375 0.84375 0.4874999 0.6884398 0.3513974 0.7954661 0.4999999 0.6884398 0.3735911 0.7519085 0.5124999 0.6884398 0.4081585 0.7173411 0.5249999 0.6884398 0.4517161 0.6951473 0.5374998 0.6884398 0.5 0.6874999 0.5499998 0.6884398 0.5482839 0.6951473 0.5624998 0.6884398 0.5918415 0.717341 0.5749998 0.6884398 0.626409 0.7519085 0.5874998 0.6884398 0.6486027 0.7954661 0.5999998 0.6884398</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_1Shape-map1-array" count="182" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_1Shape-textangents">
+ <float_array id="qt_gauge_needles_1Shape-textangents-array" count="1506">-0.02198785 0.7073043 -0.706567 -0.03108603 -4.23353e-4 0.9995165 -0.09637681 -0.6178091 0.7803994 -0.731266 -0.04598236 -0.6805407 -0.1113276 0.8240822 -0.5554231 -0.9999999 0 0 0.02728368 0 -0.9996278 0.9999999 0 0 -0.004922781 0 0.9999879 -0.01945656 0.006118971 0.9997919 -0.01100217 0.01200409 0.9998674 -0.731266 -0.04598236 -0.6805407 -0.09637681 -0.6178091 0.7803994 -0.02177283 -0.01025506 -0.9997103 -0.01872653 -0.01269537 -0.999744 -0.1113276 0.8240822 -0.5554231 -0.731266 -0.04598236 -0.6805407 0.168289 0.04343265 -0.9847804 0.6493458 0.003690998 -0.7604844 0.6390902 0 -0.7691317 0.1631569 0 -0.9866001 0.6493458 0.003690998 -0.7604844 0.5003511 0.08190908 -0.8619393 0.9999999 0 0 0.9164207 -0.005502655 -0.4001785 0.6493387 -0.003680258 0.7604905 0.175205 0.01901019 0.9843485 0.145924 0.4477116 0.8821907 0.639057 0 0.7691593 0.5004836 -0.08188399 0.861865 0.6493387 -0.003680258 0.7604905 0.9166909 0.01371826 0.3993614 0.9999999 0 0 0.9164207 -0.005502655 -0.4001785 0.9166909 0.01371826 0.3993614 0.9228592 0 0.3851372 0.9228784 0 -0.3850912 -0.01877356 0.04418202 0.998847 -0.01945656 0.006118971 0.9997919 -0.09637681 -0.6178091 0.7803994 -0.03108603 -4.23353e-4 0.9995165 0 0 0 0 0 0 0 0 0 0.05646116 -0.6523207 -0.7558371 -0.01738878 -0.3784156 -0.9254724 -0.02198785 0.7073043 -0.706567 0.003314508 -0.330633 -0.9437536 0.9164207 -0.005502655 -0.4001785 0.9228784 0 -0.3850912 0.6390902 0 -0.7691317 0.6493458 0.003690998 -0.7604844 0.6493387 -0.003680258 0.7604905 0.639057 0 0.7691593 0.9228592 0 0.3851372 0.9166909 0.01371826 0.3993614 0.168289 0.04343265 -0.9847804 0.5003511 0.08190908 -0.8619393 0.6493458 0.003690998 -0.7604844 0.6493387 -0.003680258 0.7604905 0.5004836 -0.08188399 0.861865 0.175205 0.01901019 0.9843485 0.9164207 -0.005502655 -0.4001785 0.9999999 0 0 0.9166909 0.01371826 0.3993614 0.01351348 -0.001638373 0.9999074 0.1133336 0 0.993557 0.1225597 -0.009130216 0.9924191 0.01304377 -0.01348372 0.999824 0 0 0.9999999 0.06349109 0 0.9979823 0.1266935 0 0.9919419 0.06349109 0 0.9979823 -0.1133333 0 0.993557 -0.01350253 0.03538952 0.9992823 -0.014843 0.004938143 0.9998776 -0.128503 0.04659969 0.9906137 0.003540118 -0.01321981 0.9999063 -0.04375589 -0.1238253 0.9913388 -0.006865977 -0.1172421 0.9930796 -0.03417387 -0.01012097 0.9993647 0.07359563 -0.1080862 0.9914136 0.003540118 -0.01321981 0.9999063 0.01304377 -0.01348372 0.999824 0.115374 -0.07224027 0.9906918 -0.1145946 -0.07886571 0.9902769 -0.014843 0.004938143 0.9998776 -0.03417387 -0.01012097 0.9993647 -0.07364877 -0.1080823 0.9914101 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.9999999 0 0 -0.2867484 0 0.958006 0 0 0 0.8101031 0 0.5862874 0.356148 0 0.9344295 0.463885 0 0.8858954 0.5431369 0 0.8396442 0.8439467 0 -0.536427 -0.01100217 0.01200409 0.9998674 -0.01945656 0.006118971 0.9997919 0.01304377 -0.01348372 0.999824 0.003540118 -0.01321981 0.9999063 0.2603611 -0.07955071 0.9622285 0.1370205 0.1341705 0.9814395 0.175205 0.01901019 0.9843485 0.5004836 -0.08188399 0.861865 0.01988178 0.002191344 0.9997999 0.002204377 0.01346009 0.999907 -0.03417387 -0.01012097 0.9993647 -0.014843 0.004938143 0.9998776 0.1101046 0.1159504 -0.9871334 0.138801 0.09862441 -0.9853972 0.5003511 0.08190908 -0.8619393 0.168289 0.04343265 -0.9847804 -0.01877356 0.04418202 0.998847 0.01351348 -0.001638373 0.9999074 0.01304377 -0.01348372 0.999824 -0.01945656 0.006118971 0.9997919 -0.01100217 0.01200409 0.9998674 0.003540118 -0.01321981 0.9999063 -0.03417387 -0.01012097 0.9993647 0.002204377 0.01346009 0.999907 0.01988178 0.002191344 0.9997999 -0.014843 0.004938143 0.9998776 -0.01350253 0.03538952 0.9992823 0.01879258 0 0.9998233 0.1116138 0.173742 -0.9784458 0.02832583 0.6237605 -0.7811021 -0.0210286 0.892769 -0.4500237 0.1631569 0 -0.9866001 0.1309273 0.09979507 -0.9863564 0.8522356 0.1731068 -0.4936885 0.7728258 -0.02076889 0.6342782 0.9999999 0 -2.36134e-4 0.4881177 0.084131 -0.8687133 0.0283537 -0.6237946 0.7810737 0.1057815 -0.359153 0.9272645 0.145924 0.4477116 0.8821907 0.1561861 -0.1402289 0.9777228 0.03309164 0 0.9994524 0.038477 0 0.9992595 0 0 1 0.02426406 0 0.9997056 0.03309164 0 0.9994524 0 0 1 0.01282948 0 0.9999177 0.02426406 0 0.9997056 0 0 1 0 0 1 0.01282948 0 0.9999177 0 0 1 -0.01282855 0 0.9999177 0 0 1 0 0 1 -0.02426405 0 0.9997056 -0.01282855 0 0.9999177 0 0 1 -0.03310213 0 0.999452 -0.02426405 0 0.9997056 0 0 1 -0.03848051 0 0.9992594 -0.03310213 0 0.999452 0 0 1 -0.03997072 0 0.9992008 -0.03848051 0 0.9992594 0 0 1 -0.03756084 0 0.9992944 -0.03997072 0 0.9992008 0 0 1 -0.03162215 0 0.9994999 -0.03756084 0 0.9992944 0 0 1 -0.02278633 0 0.9997404 -0.03162215 0 0.9994999 0 0 1 -0.01190376 0 0.9999292 -0.02278633 0 0.9997404 0 0 1 0 0 0.9999999 -0.01190376 0 0.9999292 0 0 1 0.01190738 0 0.9999291 0 0 0.9999999 0 0 1 0.02277142 0 0.9997407 0.01190738 0 0.9999291 0 0 1 0.03162168 0 0.9994999 0.02277142 0 0.9997407 0 0 1 0.03756754 0 0.999294 0.03162168 0 0.9994999 0 0 1 0.03996813 0 0.9992009 0.03756754 0 0.999294 0 0 1 0.038477 0 0.9992595 0.03996813 0 0.9992009 0 0 1 0.9510556 0 -0.3090196 0.8090189 0 -0.5877826 0.8088971 0.003241152 -0.5879411 0.9508255 0.009723317 -0.3095744 0.8090189 0 -0.5877826 0.5877889 0 -0.8090143 0.5876237 0.003241341 -0.8091278 0.8088971 0.003241152 -0.5879411 0.5877889 0 -0.8090143 0.3090207 0 -0.9510552 0.3088284 0.003241435 -0.951112 0.5876237 0.003241341 -0.8091278 0.3090207 0 -0.9510552 0 0 -0.9999999 -1.93195e-4 0.003241346 -0.9999946 0.3088284 0.003241435 -0.951112 0 0 -0.9999999 -0.3090233 0 -0.9510543 -0.3092102 0.00324137 -0.950988 -1.93195e-4 0.003241346 -0.9999946 -0.3090233 0 -0.9510543 -0.5877884 0 -0.8090146 -0.5879465 0.003241183 -0.8088931 -0.3092102 0.00324137 -0.950988 -0.5877884 0 -0.8090146 -0.8090152 0 -0.5877876 -0.8091285 0.003241263 -0.5876225 -0.5879465 0.003241183 -0.8088931 -0.8090152 0 -0.5877876 -0.9510558 0 -0.309019 -0.9511125 0.003241328 -0.3088272 -0.8091285 0.003241263 -0.5876225 -0.9510558 0 -0.309019 -0.9999999 0 0 -0.9999946 0.003241198 1.98979e-4 -0.9511125 0.003241328 -0.3088272 -0.9999999 0 0 -0.9510569 0 0.3090157 -0.9509901 0.003241256 0.3092042 -0.9999946 0.003241198 1.98979e-4 -0.9510569 0 0.3090157 -0.809019 0 0.5877825 -0.8088973 0.00324115 0.5879409 -0.9509901 0.003241256 0.3092042 -0.809019 0 0.5877825 -0.5877894 0 0.809014 -0.5876241 0.003241333 0.8091274 -0.8088973 0.00324115 0.5879409 -0.5877894 0 0.809014 -0.3090054 0 0.9510602 -0.3088156 0.003241039 0.9511163 -0.5876241 0.003241333 0.8091274 -0.3090054 0 0.9510602 0 0 0.9999999 2.08862e-4 0.00324098 0.9999946 -0.3088156 0.003241039 0.9511163 0 0 0.9999999 0.3090072 0 0.9510596 0.3091967 0.003240914 0.9509925 2.08862e-4 0.00324098 0.9999946 0.3090072 0 0.9510596 0.587777 0 0.809023 0.5879359 0.003241281 0.8089008 0.3091967 0.003240914 0.9509925 0.587777 0 0.809023 0.8090214 0 0.5877792 0.8091342 0.003241096 0.5876149 0.5879359 0.003241281 0.8089008 0.8090214 0 0.5877792 0.9510574 0 0.3090139 0.9511142 0.003241133 0.3088222 0.8091342 0.003241096 0.5876149 0.9510574 0 0.3090139 0.9999999 0 0 0.9999946 0.003241193 -1.9939e-4 0.9511142 0.003241133 0.3088222 0.9999999 0 0 0.9510556 0 -0.3090196 0.9511958 -0.009723467 -0.3084346 0.9999946 0.003241193 -1.9939e-4 -0.07839939 -0.1707159 0.9821963 -0.1067024 -0.1376999 0.9847097 0 0 1 -0.1067024 -0.1376999 0.9847097 -0.09857779 -0.09428625 0.9906525 0 0 1 -0.09857779 -0.09428625 0.9906525 -0.06064362 -0.04698583 0.997053 0 0 1 -0.06064362 -0.04698583 0.997053 -0.005718921 0.001073466 0.9999831 0 0 1 -0.005718921 0.001073466 0.9999831 0.05239325 0.04848066 0.997449 0 0 1 0.05239325 0.04848066 0.997449 0.1001359 0.09403495 0.9905202 0 0 1 0.1001359 0.09403495 0.9905202 0.1243653 0.1354834 0.9829432 0 0 1 0.1243653 0.1354834 0.9829432 0.1145139 0.1680701 0.9791011 0 0 1 0.1145139 0.1680701 0.9791011 0.0702705 0.1839467 0.9804211 0 0 1 0.0702705 0.1839467 0.9804211 0.01010603 0.1762207 0.9842988 0 0 1 0.01010603 0.1762207 0.9842988 -0.03654492 0.1460275 0.9886053 0 0 1 -0.03654492 0.1460275 0.9886053 -0.05163377 0.101722 0.993472 0 0 1 -0.05163377 0.101722 0.993472 -0.03668143 0.05131843 0.9980084 0 0 1 -0.03668143 0.05131843 0.9980084 -0.003625047 -6.80391e-4 0.9999933 0 0 1 -0.003625047 -6.80391e-4 0.9999933 0.03310578 -0.05196106 0.9981002 0 0 1 0.03310578 -0.05196106 0.9981002 0.05913208 -0.1005508 0.9931731 0 0 1 0.05913208 -0.1005508 0.9931731 0.06126614 -0.1431784 0.9877988 0 0 1 0.06126614 -0.1431784 0.9877988 0.03151808 -0.1738036 0.9842758 0 0 1 0.03151808 -0.1738036 0.9842758 -0.02337896 -0.1843522 0.9825821 0 0 1 -0.02337896 -0.1843522 0.9825821 -0.07839939 -0.1707159 0.9821963 0 0 1 0.9511958 -0.009723467 -0.3084346 0.9673995 -0.07825194 -0.2408626 0.9993823 -0.02621147 0.02340709 0.9999946 0.003241193 -1.9939e-4 -0.2629263 -0.6593205 0.7043908 -0.07839939 -0.1707159 0.9821963 -0.02337896 -0.1843522 0.9825821 -0.08438235 -0.7432844 0.6636322 -0.07839939 -0.1707159 0.9821963 -0.2629263 -0.6593205 0.7043908 -0.3297571 -0.505427 0.797373 -0.1067024 -0.1376999 0.9847097 0.9242205 0.07825052 -0.3737555 0.9508255 0.009723317 -0.3095744 0.8088971 0.003241152 -0.5879411 0.8222722 -0.02621137 -0.5684904 -0.1067024 -0.1376999 0.9847097 -0.3297571 -0.505427 0.797373 -0.2838902 -0.3343816 0.8986629 -0.09857779 -0.09428625 0.9906525 0.8222722 -0.02621137 -0.5684904 0.8088971 0.003241152 -0.5879411 0.5876237 0.003241341 -0.8091278 0.6063586 -0.02621403 -0.7947592 -0.09857779 -0.09428625 0.9906525 -0.2838902 -0.3343816 0.8986629 -0.1606281 -0.1656623 0.9730131 -0.06064362 -0.04698583 0.997053 0.6063586 -0.02621403 -0.7947592 0.5876237 0.003241341 -0.8091278 0.3088284 0.003241435 -0.951112 0.3310809 -0.0262093 -0.9432383 -0.06064362 -0.04698583 0.997053 -0.1606281 -0.1656623 0.9730131 0 0 0.9999999 -0.005718921 0.001073466 0.9999831 0.3310809 -0.0262093 -0.9432383 0.3088284 0.003241435 -0.951112 -1.93195e-4 0.003241346 -0.9999946 0.02340826 -0.02621448 -0.9993822 -0.005718921 0.001073466 0.9999831 0 0 0.9999999 0.1583098 0.168114 0.9729725 0.05239325 0.04848066 0.997449 0.02340826 -0.02621448 -0.9993822 -1.93195e-4 0.003241346 -0.9999946 -0.3092102 0.00324137 -0.950988 -0.2865631 -0.02621529 -0.9577026 0.05239325 0.04848066 0.997449 0.1583098 0.168114 0.9729725 0.274145 0.3430491 0.8984218 0.1001359 0.09403495 0.9905202 -0.2865631 -0.02621529 -0.9577026 -0.3092102 0.00324137 -0.950988 -0.5879465 0.003241183 -0.8088931 -0.568489 -0.02621176 -0.8222732 0.1001359 0.09403495 0.9905202 0.274145 0.3430491 0.8984218 0.3052224 0.5212132 0.7969795 0.1243653 0.1354834 0.9829432 -0.568489 -0.02621176 -0.8222732 -0.5879465 0.003241183 -0.8088931 -0.8091285 0.003241263 -0.5876225 -0.7947606 -0.02621165 -0.6063567 0.1243653 0.1354834 0.9829432 0.3052224 0.5212132 0.7969795 0.2173584 0.6754048 0.7046867 0.1145139 0.1680701 0.9791011 -0.7947606 -0.02621165 -0.6063567 -0.8091285 0.003241263 -0.5876225 -0.9511125 0.003241328 -0.3088272 -0.9432372 -0.02621304 -0.3310836 0.1145139 0.1680701 0.9791011 0.2173584 0.6754048 0.7046867 0.02415609 0.745728 0.6658124 0.0702705 0.1839467 0.9804211 -0.9432372 -0.02621304 -0.3310836 -0.9511125 0.003241328 -0.3088272 -0.9999946 0.003241198 1.98979e-4 -0.9993824 -0.02621372 -0.02339984 0.0702705 0.1839467 0.9804211 0.02415609 0.745728 0.6658124 -0.1756642 0.6886107 0.703532 0.01010603 0.1762207 0.9842988 -0.9993824 -0.02621372 -0.02339984 -0.9999946 0.003241198 1.98979e-4 -0.9509901 0.003241256 0.3092042 -0.9577016 -0.02621301 0.286567 0.01010603 0.1762207 0.9842988 -0.1756642 0.6886107 0.703532 -0.2758943 0.5393088 0.7956308 -0.03654492 0.1460275 0.9886053 -0.9577016 -0.02621301 0.286567 -0.9509901 0.003241256 0.3092042 -0.8088973 0.00324115 0.5879409 -0.8222724 -0.02621134 0.5684903 -0.03654492 0.1460275 0.9886053 -0.2758943 0.5393088 0.7956308 -0.2558482 0.3590651 0.89756 -0.05163377 0.101722 0.993472 -0.8222724 -0.02621134 0.5684903 -0.8088973 0.00324115 0.5879409 -0.5876241 0.003241333 0.8091274 -0.6063588 -0.02621409 0.7947589 -0.05163377 0.101722 0.993472 -0.2558482 0.3590651 0.89756 -0.1496982 0.1772088 0.9727218 -0.03668143 0.05131843 0.9980084 -0.6063588 -0.02621409 0.7947589 -0.5876241 0.003241333 0.8091274 -0.3088156 0.003241039 0.9511163 -0.3310879 -0.02621422 0.9432357 -0.03668143 0.05131843 0.9980084 -0.1496982 0.1772088 0.9727218 -0.002048448 -0.002298772 0.9999952 -0.003625047 -6.80391e-4 0.9999933 -0.3310879 -0.02621422 0.9432357 -0.3088156 0.003241039 0.9511163 2.08862e-4 0.00324098 0.9999946 -0.02339865 -0.02621203 0.9993825 -0.003625047 -6.80391e-4 0.9999933 -0.002048448 -0.002298772 0.9999952 0.1428982 -0.1843444 0.9724182 0.03310578 -0.05196106 0.9981002 -0.02339865 -0.02621203 0.9993825 2.08862e-4 0.00324098 0.9999946 0.3091967 0.003240914 0.9509925 0.2865695 -0.02620959 0.9577009 0.03310578 -0.05196106 0.9981002 0.1428982 -0.1843444 0.9724182 0.2399636 -0.372684 0.8963951 0.05913208 -0.1005508 0.9931731 0.2865695 -0.02620959 0.9577009 0.3091967 0.003240914 0.9509925 0.5879359 0.003241281 0.8089008 0.5684826 -0.02621413 0.8222775 0.05913208 -0.1005508 0.9931731 0.2399636 -0.372684 0.8963951 0.2429405 -0.5586438 0.7930301 0.06126614 -0.1431784 0.9877988 0.5684826 -0.02621413 0.8222775 0.5879359 0.003241281 0.8089008 0.8091342 0.003241096 0.5876149 0.7947621 -0.02621358 0.6063548 0.06126614 -0.1431784 0.9877988 0.2429405 -0.5586438 0.7930301 0.1223127 -0.7034575 0.7001336 0.03151808 -0.1738036 0.9842758 0.7947621 -0.02621358 0.6063548 0.8091342 0.003241096 0.5876149 0.9511142 0.003241133 0.3088222 0.9432371 -0.02620923 0.331084 0.03151808 -0.1738036 0.9842758 0.1223127 -0.7034575 0.7001336 -0.08438235 -0.7432844 0.6636322 -0.02337896 -0.1843522 0.9825821 0.9432371 -0.02620923 0.331084 0.9511142 0.003241133 0.3088222 0.9999946 0.003241193 -1.9939e-4 0.9993823 -0.02621147 0.02340709</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_1Shape-textangents-array" count="502" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_1Shape-texbinormals">
+ <float_array id="qt_gauge_needles_1Shape-texbinormals-array" count="1506">0.02197385 0.7069092 0.706963 0 1 4.23762e-4 0.06446204 0.7785292 0.6242893 -0.6820924 0.04931602 0.7296012 -0.03233398 0.5555978 0.8308222 0 0 -1 0.9996278 0 0.02728368 0 0 1 -0.9999879 0 -0.004922781 0.1096177 0.993966 -0.003950086 0.986866 0.1612946 0.008922658 -0.6820924 0.04931602 0.7296012 0.06446204 0.7785292 0.6242893 -0.9866353 0.1617337 0.01982899 -0.1094215 0.9939392 -0.01057205 -0.03233398 0.5555978 0.8308222 -0.6820924 0.04931602 0.7296012 -0.1156312 0.9930014 0.02403503 -0.08432085 0.994172 -0.06717285 -3.80819e-4 0.9999999 -3.05076e-4 0 1 0 -0.08432085 0.994172 -0.06717285 -0.8604757 0.1575089 -0.4845335 0 0.1549175 -0.9879275 -0.03790908 0.9942162 -0.1004839 0.08429135 0.9941753 -0.06716035 0.1047695 0.9937764 -0.03784028 -0.07298189 0.894178 -0.4417231 3.9177e-4 0.9999999 -3.13999e-4 0.8603979 0.1575281 -0.4846652 0.08429135 0.9941753 -0.06716035 0.0303241 0.9941406 -0.1037549 0 0.1549175 -0.9879275 -0.03790908 0.9942162 -0.1004839 0.0303241 0.9941406 -0.1037549 0 1 0 0 1 0 8.49617e-4 0.9990235 -0.04417386 0.1096177 0.993966 -0.003950086 0.06446204 0.7785292 0.6242893 0 1 4.23762e-4 0 0 0 0 0 0 0 0 0 0.09558189 -0.7500361 0.6544541 0.007126847 -0.9256358 0.3783485 0.02197385 0.7069092 0.706963 0.11588 -0.9372739 0.3287698 -0.03790908 0.9942162 -0.1004839 0 1 0 -3.80819e-4 0.9999999 -3.05076e-4 -0.08432085 0.994172 -0.06717285 0.08429135 0.9941753 -0.06716035 3.9177e-4 0.9999999 -3.13999e-4 0 1 0 0.0303241 0.9941406 -0.1037549 -0.1156312 0.9930014 0.02403503 -0.8604757 0.1575089 -0.4845335 -0.08432085 0.994172 -0.06717285 0.08429135 0.9941753 -0.06716035 0.8603979 0.1575281 -0.4846652 0.1047695 0.9937764 -0.03784028 -0.03790908 0.9942162 -0.1004839 0 0.1549175 -0.9879275 0.0303241 0.9941406 -0.1037549 0 0.9999987 0.001638217 0 1 0 0.1092487 0.994005 -0.00434697 0.09741265 0.99517 0.0121501 -1 0 0 -0.9979824 0 0.0634911 -0.991942 0 0.1266935 -0.9979824 0 0.0634911 0 -1 0 -4.79279e-4 -0.9993737 0.03538628 0.09717418 -0.9952471 0.006357807 0.1022724 -0.9929467 0.05997628 0.994942 0.1004278 -0.002194782 0.9902719 0.1258189 0.05942449 0.9912158 -0.131967 -0.008726818 0.9943603 -0.1007968 0.03298193 0.9885023 0.1395725 -0.05816299 0.994942 0.1004278 -0.002194782 0.09741265 0.99517 0.0121501 0.1168119 0.9914184 0.05868958 0.1176467 -0.9909062 -0.06530178 0.09717418 -0.9952471 0.006357807 0.9943603 -0.1007968 0.03298193 0.9884997 -0.139568 0.05821704 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 0 1 -0.958006 0 -0.2867484 0 0 0 -0.5862874 0 0.8101031 0.9344296 0 -0.356148 0.8858954 0 -0.463885 0.8396442 0 -0.5431369 0.5364271 0 0.8439468 0.986866 0.1612946 0.008922658 0.1096177 0.993966 -0.003950086 0.09741265 0.99517 0.0121501 0.994942 0.1004278 -0.002194782 0.9564335 0.1575906 -0.2457645 0.09045194 0.9849505 -0.1472787 0.1047695 0.9937764 -0.03784028 0.8603979 0.1575281 -0.4846652 0.1092175 -0.9940179 0 0.986873 -0.1614985 0 0.9943603 -0.1007968 0.03298193 0.09717418 -0.9952471 0.006357807 -0.1218591 0.9872539 0.1023725 -0.9814734 0.1464043 -0.1235953 -0.8604757 0.1575089 -0.4845335 -0.1156312 0.9930014 0.02403503 8.49617e-4 0.9990235 -0.04417386 0 0.9999987 0.001638217 0.09741265 0.99517 0.0121501 0.1096177 0.993966 -0.003950086 0.986866 0.1612946 0.008922658 0.994942 0.1004278 -0.002194782 0.9943603 -0.1007968 0.03298193 0.986873 -0.1614985 0 0.1092175 -0.9940179 0 0.09717418 -0.9952471 0.006357807 -4.79279e-4 -0.9993737 0.03538628 0 -1 0 0.01966791 -0.9847913 -0.1726252 0.1617724 -0.7739752 -0.6122028 0.2030998 -0.436923 -0.8762699 0 1 0 0.9825548 -0.1456089 0.1156906 0.5062087 -0.03459988 0.8617167 -0.6273026 -0.17632 0.7585531 2.38204e-4 -0.1549175 0.9879275 0.8674737 -0.1563333 0.472281 -0.1617166 -0.773957 -0.6122404 -0.04067919 -0.9332788 -0.3568418 -0.07298189 0.894178 -0.4417231 -0.131451 -0.9840166 -0.120133 -0.9994524 0 0.03309164 -0.9992596 0 0.03847701 -1 0 0 -0.9997056 0 0.02426406 -0.9994524 0 0.03309164 -1 0 0 -0.9999177 0 0.01282948 -0.9997056 0 0.02426406 -1 0 0 -1 0 0 -0.9999177 0 0.01282948 -1 0 0 -0.9999178 0 -0.01282855 -1 0 0 -1 0 0 -0.9997057 0 -0.02426405 -0.9999178 0 -0.01282855 -1 0 0 -0.999452 0 -0.03310213 -0.9997057 0 -0.02426405 -1 0 0 -0.9992594 0 -0.03848051 -0.999452 0 -0.03310213 -1 0 0 -0.9992009 0 -0.03997072 -0.9992594 0 -0.03848051 -1 0 0 -0.9992944 0 -0.03756084 -0.9992009 0 -0.03997072 -1 0 0 -0.9994999 0 -0.03162215 -0.9992944 0 -0.03756084 -1 0 0 -0.9997404 0 -0.02278633 -0.9994999 0 -0.03162215 -1 0 0 -0.9999292 0 -0.01190376 -0.9997404 0 -0.02278633 -1 0 0 -1 0 0 -0.9999292 0 -0.01190376 -1 0 0 -0.9999291 0 0.01190738 -1 0 0 -1 0 0 -0.9997407 0 0.02277142 -0.9999291 0 0.01190738 -1 0 0 -0.9994999 0 0.03162168 -0.9997407 0 0.02277142 -1 0 0 -0.9992942 0 0.03756755 -0.9994999 0 0.03162168 -1 0 0 -0.999201 0 0.03996814 -0.9992942 0 0.03756755 -1 0 0 -0.9992596 0 0.03847701 -0.999201 0 0.03996814 -1 0 0 0 1 0 0 1 0 -0.03878101 0.9981014 -0.04785318 -0.02827187 0.9980592 -0.05548639 0 1 0 0 1 0 -0.05167103 0.9981012 -0.03352737 -0.03878101 0.9981014 -0.04785318 0 1 0 0 1 0 -0.05950485 0.9981011 -0.0159198 -0.05167103 0.9981012 -0.03352737 0 1 0 0 1 0 -0.06151331 0.9981011 0.003247093 -0.05950485 0.9981011 -0.0159198 0 1 0 0 1 0 -0.05749778 0.9981011 0.02209714 -0.06151331 0.9981011 0.003247093 0 1 0 0 1 0 -0.04785329 0.9981012 0.03878164 -0.05749778 0.9981011 0.02209714 0 1 0 0 1 0 -0.03352726 0.9981012 0.05167088 -0.04785329 0.9981012 0.03878164 0 1 0 0 1 0 -0.01591932 0.9981012 0.05950331 -0.03352726 0.9981012 0.05167088 0 1 0 0 1 0 0.003247301 0.9981012 0.06150921 -0.01591932 0.9981012 0.05950331 0 1 0 0 1 0 0.0220955 0.9981013 0.05749436 0.003247301 0.9981012 0.06150921 0 1 0 0 1 0 0.03878096 0.9981014 0.04785314 0.0220955 0.9981013 0.05749436 0 1 0 0 1 0 0.05167098 0.9981012 0.0335274 0.03878096 0.9981014 0.04785314 0 1 0 0 1 0 0.05950142 0.9981014 0.01591822 0.05167098 0.9981012 0.0335274 0 1 0 0 1 0 0.06150452 0.9981015 -0.003247691 0.05950142 0.9981014 0.01591822 0 1 0 0 1 0 0.05749172 0.9981015 -0.02209377 0.06150452 0.9981015 -0.003247691 0 1 0 0 1 0 0.04785247 0.9981014 -0.03878017 0.05749172 0.9981015 -0.02209377 0 1 0 0 1 0 0.03352614 0.9981014 -0.05167005 0.04785247 0.9981014 -0.03878017 0 1 0 0 1 0 0.01591841 0.9981014 -0.05950094 0.03352614 0.9981014 -0.05167005 0 1 0 0 1 0 -0.00324732 0.9981012 -0.06150932 0.01591841 0.9981014 -0.05950094 0 1 0 0 1 0 -0.009741796 0.9980592 -0.06150721 -0.00324732 0.9981012 -0.06150932 0.9952922 -0.06971809 0.06732698 0.9883655 -0.1226508 0.0899473 1 0 0 0.9883655 -0.1226508 0.0899473 0.9838831 -0.1584759 0.08282109 1 0 0 0.9838831 -0.1584759 0.08282109 0.982632 -0.1783153 0.05136343 1 0 0 0.982632 -0.1783153 0.05136343 0.9828334 -0.1844035 0.005818796 1 0 0 0.9828334 -0.1844035 0.005818796 0.9831066 -0.1779135 -0.04299246 1 0 0 0.9831066 -0.1779135 -0.04299246 0.9837261 -0.1586232 -0.08439016 1 0 0 0.9837261 -0.1586232 -0.08439016 0.9862987 -0.1250929 -0.1075478 1 0 0 0.9862987 -0.1250929 -0.1075478 0.991786 -0.07587583 -0.1029729 1 0 0 0.991786 -0.07587583 -0.1029729 0.997528 -0.01295874 -0.06906529 1 0 0 0.997528 -0.01295874 -0.06906529 0.998324 0.05431633 -0.01997437 1 0 0 0.998324 0.05431633 -0.01997437 0.9934366 0.1126061 0.0200904 1 0 0 0.9934366 0.1126061 0.0200904 0.9874604 0.1538073 0.03557295 1 0 0 0.9874604 0.1538073 0.03557295 0.9838184 0.177115 0.02705248 1 0 0 0.9838184 0.177115 0.02705248 0.9828441 0.1844016 0.003688346 1 0 0 0.9828441 0.1844016 0.003688346 0.9839454 0.1769262 -0.0234255 1 0 0 0.9839454 0.1769262 -0.0234255 0.98704 0.1545737 -0.04311759 1 0 0 0.98704 0.1545737 -0.04311759 0.992219 0.1162052 -0.04469671 1 0 0 0.992219 0.1162052 -0.04469671 0.9978775 0.06161503 -0.02107364 1 0 0 0.9978775 0.06161503 -0.02107364 0.9997267 -0.004311048 0.02297804 1 0 0 0.9997267 -0.004311048 0.02297804 0.9952922 -0.06971809 0.06732698 1 0 0 -0.009741796 0.9980592 -0.06150721 -0.1049019 0.7418281 -0.6623343 0.03514162 0.7454841 -0.6655965 -0.00324732 0.9981012 -0.06150932 0.9368757 -0.3488966 0.02313283 0.9952922 -0.06971809 0.06732698 0.9997267 -0.004311048 0.02297804 0.9964335 -0.06294235 0.05620182 0.9952922 -0.06971809 0.06732698 0.9368757 -0.3488966 0.02313283 0.8360713 -0.5486173 -0.001988426 0.9883655 -0.1226508 0.0899473 -0.3044382 0.7418283 -0.5975018 -0.02827187 0.9980592 -0.05548639 -0.03878101 0.9981014 -0.04785318 -0.3627993 0.7454867 -0.55913 0.9883655 -0.1226508 0.0899473 0.8360713 -0.5486173 -0.001988426 0.7451298 -0.6667982 -0.01271889 0.9838831 -0.1584759 0.08282109 -0.3627993 0.7454867 -0.55913 -0.03878101 0.9981014 -0.04785318 -0.05167103 0.9981012 -0.03352737 -0.5178238 0.7454823 -0.4196604 0.9838831 -0.1584759 0.08282109 0.7451298 -0.6667982 -0.01271889 0.6862229 -0.7273149 -0.01054662 0.982632 -0.1783153 0.05136343 -0.5178238 0.7454823 -0.4196604 -0.05167103 0.9981012 -0.03352737 -0.05950485 0.9981011 -0.0159198 -0.6221645 0.7454824 -0.2390969 0.982632 -0.1783153 0.05136343 0.6862229 -0.7273149 -0.01054662 0.6660171 -0.7459365 1.01422e-4 0.9828334 -0.1844035 0.005818796 -0.6221645 0.7454824 -0.2390969 -0.05950485 0.9981011 -0.0159198 -0.06151331 0.9981011 0.003247093 -0.6656057 0.7454757 -0.03514465 0.9828334 -0.1844035 0.005818796 0.6660171 -0.7459365 1.01422e-4 0.6867652 -0.7267479 0.01382858 0.9831066 -0.1779135 -0.04299246 -0.6656057 0.7454757 -0.03514465 -0.06151331 0.9981011 0.003247093 -0.05749778 0.9981011 0.02209714 -0.6438866 0.7454781 0.1722572 0.9831066 -0.1779135 -0.04299246 0.6867652 -0.7267479 0.01382858 0.7487714 -0.6623777 0.0244386 0.9837261 -0.1586232 -0.08439016 -0.6438866 0.7454781 0.1722572 -0.05749778 0.9981011 0.02209714 -0.04785329 0.9981012 0.03878164 -0.5591372 0.7454796 0.3628027 0.9837261 -0.1586232 -0.08439016 0.7487714 -0.6623777 0.0244386 0.8453386 -0.5336341 0.02524638 0.9862987 -0.1250929 -0.1075478 -0.5591372 0.7454796 0.3628027 -0.04785329 0.9981012 0.03878164 -0.03352726 0.9981012 0.05167088 -0.4196589 0.7454807 0.5178272 0.9862987 -0.1250929 -0.1075478 0.8453386 -0.5336341 0.02524638 0.9484837 -0.3166377 0.0109236 0.991786 -0.07587583 -0.1029729 -0.4196589 0.7454807 0.5178272 -0.03352726 0.9981012 0.05167088 -0.01591932 0.9981012 0.05950331 -0.2391013 0.7454824 0.6221628 0.991786 -0.07587583 -0.1029729 0.9484837 -0.3166377 0.0109236 0.9997083 -0.01801679 -0.01609074 0.997528 -0.01295874 -0.06906529 -0.2391013 0.7454824 0.6221628 -0.01591932 0.9981012 0.05950331 0.003247301 0.9981012 0.06150921 -0.03513846 0.7454849 0.6655957 0.997528 -0.01295874 -0.06906529 0.9997083 -0.01801679 -0.01609074 0.9570829 0.2867934 -0.04173771 0.998324 0.05431633 -0.01997437 -0.03513846 0.7454849 0.6655957 0.003247301 0.9981012 0.06150921 0.0220955 0.9981013 0.05749436 0.172259 0.7454852 0.6438779 0.998324 0.05431633 -0.01997437 0.9570829 0.2867934 -0.04173771 0.8553581 0.5153481 -0.05271708 0.9934366 0.1126061 0.0200904 0.172259 0.7454852 0.6438779 0.0220955 0.9981013 0.05749436 0.03878096 0.9981014 0.04785314 0.3627991 0.7454868 0.55913 0.9934366 0.1126061 0.0200904 0.8553581 0.5153481 -0.05271708 0.755218 0.6538372 -0.04629099 0.9874604 0.1538073 0.03557295 0.3627991 0.7454868 0.55913 0.03878096 0.9981014 0.04785314 0.05167098 0.9981012 0.0335274 0.5178237 0.7454821 0.4196607 0.9874604 0.1538073 0.03557295 0.755218 0.6538372 -0.04629099 0.6886884 0.7245905 -0.02601813 0.9838184 0.177115 0.02705248 0.5178237 0.7454821 0.4196607 0.05167098 0.9981012 0.0335274 0.05950142 0.9981014 0.01591822 0.6221592 0.7454845 0.2391043 0.9838184 0.177115 0.02705248 0.6886884 0.7245905 -0.02601813 0.6659966 0.7459484 0.00307904 0.9828441 0.1844016 0.003688346 0.6221592 0.7454845 0.2391043 0.05950142 0.9981014 0.01591822 0.06150452 0.9981015 -0.003247691 0.6655886 0.7454913 0.03513641 0.9828441 0.1844016 0.003688346 0.6659966 0.7459484 0.00307904 0.690128 0.7228107 0.03561028 0.9839454 0.1769262 -0.0234255 0.6655886 0.7454913 0.03513641 0.06150452 0.9981015 -0.003247691 0.05749172 0.9981015 -0.02209377 0.6438746 0.7454873 -0.1722624 0.9839454 0.1769262 -0.0234255 0.690128 0.7228107 0.03561028 0.7604118 0.6461712 0.06509014 0.98704 0.1545737 -0.04311759 0.6438746 0.7454873 -0.1722624 0.05749172 0.9981015 -0.02209377 0.04785247 0.9981014 -0.03878017 0.5591388 0.745482 -0.3627954 0.98704 0.1545737 -0.04311759 0.7604118 0.6461712 0.06509014 0.8652969 0.494317 0.08313859 0.992219 0.1162052 -0.04469671 0.5591388 0.745482 -0.3627954 0.04785247 0.9981014 -0.03878017 0.03352614 0.9981014 -0.05167005 0.4196571 0.7454832 -0.5178252 0.992219 0.1162052 -0.04469671 0.8652969 0.494317 0.08313859 0.9653516 0.2481626 0.08069483 0.9978775 0.06161503 -0.02107364 0.4196571 0.7454832 -0.5178252 0.03352614 0.9981014 -0.05167005 0.01591841 0.9981014 -0.05950094 0.2390975 0.7454866 -0.6221593 0.9978775 0.06161503 -0.02107364 0.9653516 0.2481626 0.08069483 0.9964335 -0.06294235 0.05620182 0.9997267 -0.004311048 0.02297804 0.2390975 0.7454866 -0.6221593 0.01591841 0.9981014 -0.05950094 -0.00324732 0.9981012 -0.06150932 0.03514162 0.7454841 -0.6655965</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_1Shape-texbinormals-array" count="502" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_1Shape-vertices" name="qt_gauge_needles_1Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_1Shape-positions"/>
+ </vertices>
+ <triangles material="lambert2SG" count="64">
+ <input semantic="VERTEX" source="#qt_gauge_needles_1Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_1Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_1Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_1Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_1Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_1Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_1Shape-texbinormals" offset="3" set="0"/>
+ <p>14 3 4 3 16 4 13 4 15 2 2 2 2 0 12 0 3 1 1 1 16 4 13 4 3 1 1 1 15 2 2 2 16 4 13 4 1 5 0 5 0 6 43 6 2 8 12 8 2 8 12 8 0 6 43 6 3 7 1 7 4 9 35 9 5 10 45 10 15 2 2 12 15 2 2 12 5 10 45 10 14 3 4 11 6 11 3 13 7 12 11 14 14 3 4 16 14 3 4 16 7 12 11 14 16 4 13 15 8 13 42 17 10 14 16 18 23 16 50 20 23 16 50 20 10 14 16 18 22 15 15 19 9 17 53 22 18 18 7 23 10 14 16 21 10 14 16 21 18 18 7 23 17 19 14 24 13 21 56 26 24 22 34 27 11 20 6 25 11 20 6 25 24 22 34 27 25 23 5 28 12 24 38 29 11 20 6 30 18 18 7 32 18 18 7 32 11 20 6 30 19 25 8 31 17 19 14 33 19 25 8 34 21 27 9 36 21 27 9 36 19 25 8 34 20 26 17 35 4 9 35 38 15 2 2 39 0 28 43 37 0 28 43 37 15 2 2 39 3 1 1 40 7 12 11 44 1 29 0 45 16 4 13 47 16 4 13 47 1 29 0 45 2 0 12 46 17 19 14 48 21 27 9 49 10 14 16 51 10 14 16 51 21 27 9 49 22 15 15 50 25 23 5 53 20 26 17 54 11 20 6 52 11 20 6 52 20 26 17 54 19 25 8 55 8 13 42 56 9 17 53 57 10 14 16 58 11 20 6 59 12 24 38 60 13 21 56 61 17 19 14 62 18 18 7 63 19 25 8 64 27 31 55 66 32 32 19 67 26 30 18 65 26 30 18 65 32 32 19 67 33 33 44 68 27 34 20 69 26 35 31 70 28 37 21 72 28 37 21 72 26 35 31 70 29 36 48 71 28 38 22 73 29 39 48 74 35 41 23 76 35 41 23 76 29 39 48 74 34 40 40 75 31 43 26 81 30 42 36 82 32 32 27 84 32 32 27 84 30 42 36 82 33 33 44 83 34 40 40 86 37 45 46 87 35 41 28 85 35 41 28 85 37 45 46 87 36 44 29 88 1 46 30 89 29 47 48 90 0 49 32 92 0 49 32 92 29 47 48 90 26 48 31 91 27 50 55 93 28 51 33 94 24 57 34 100 28 51 33 94 23 52 50 95 24 57 34 100 23 52 50 95 22 53 15 96 24 57 34 100 24 57 34 100 22 53 15 96 25 56 5 99 22 53 15 96 21 54 9 97 25 56 5 99 21 54 9 97 20 55 17 98 25 56 5 99 4 9 35 102 33 33 44 103 5 10 45 101 5 10 45 101 33 33 44 103 30 42 36 104 32 32 37 106 13 21 56 107 31 43 52 105 31 43 52 105 13 21 56 107 12 24 38 108 7 12 47 109 6 11 39 110 34 40 40 112 34 40 40 112 6 11 39 110 37 45 46 111 35 41 49 113 36 44 41 114 8 13 42 116 8 13 42 116 36 44 41 114 9 17 53 115 0 28 43 117 26 30 18 118 4 9 35 120 4 9 35 120 26 30 18 118 33 33 44 119 7 12 47 125 34 40 40 126 1 29 30 128 1 29 30 128 34 40 40 126 29 39 48 127 35 41 49 130 8 13 42 131 28 38 33 129 28 38 33 129 8 13 42 131 23 16 50 132 32 32 54 138 27 31 55 139 13 21 56 141 13 21 56 141 27 31 55 139 24 22 34 140</p>
+ </triangles>
+ <triangles material="lambert3SG" count="160">
+ <input semantic="VERTEX" source="#qt_gauge_needles_1Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_1Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_1Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_1Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_1Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_1Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_1Shape-texbinormals" offset="3" set="0"/>
+ <p>39 58 57 142 38 59 58 143 58 60 59 144 40 61 60 145 39 58 57 146 58 60 59 147 41 62 61 148 40 61 60 149 58 60 59 150 42 63 62 151 41 62 61 152 58 60 59 153 43 64 63 154 42 63 62 155 58 60 59 156 44 65 64 157 43 64 63 158 58 60 59 159 45 66 65 160 44 65 64 161 58 60 59 162 46 67 66 163 45 66 65 164 58 60 59 165 47 68 67 166 46 67 66 167 58 60 59 168 48 69 68 169 47 68 67 170 58 60 59 171 49 70 69 172 48 69 68 173 58 60 59 174 50 71 70 175 49 70 69 176 58 60 59 177 51 72 71 178 50 71 70 179 58 60 59 180 52 73 72 181 51 72 71 182 58 60 59 183 53 74 73 184 52 73 72 185 58 60 59 186 54 75 74 187 53 74 73 188 58 60 59 189 55 76 75 190 54 75 74 191 58 60 59 192 56 77 76 193 55 76 75 194 58 60 59 195 57 78 77 196 56 77 76 197 58 60 59 198 38 59 58 199 57 78 77 200 58 60 59 201 38 79 78 202 39 80 79 203 60 82 81 205 60 82 81 205 39 80 79 203 63 81 80 204 39 80 79 206 40 83 82 207 63 81 80 209 63 81 80 209 40 83 82 207 66 84 83 208 40 83 82 210 41 85 84 211 66 84 83 213 66 84 83 213 41 85 84 211 69 86 85 212 41 85 84 214 42 87 86 215 69 86 85 217 69 86 85 217 42 87 86 215 72 88 87 216 42 87 86 218 43 89 88 219 72 88 87 221 72 88 87 221 43 89 88 219 75 90 89 220 43 89 88 222 44 91 90 223 75 90 89 225 75 90 89 225 44 91 90 223 78 92 91 224 44 91 90 226 45 93 92 227 78 92 91 229 78 92 91 229 45 93 92 227 81 94 93 228 45 93 92 230 46 95 94 231 81 94 93 233 81 94 93 233 46 95 94 231 84 96 95 232 46 95 94 234 47 97 96 235 84 96 95 237 84 96 95 237 47 97 96 235 87 98 97 236 47 97 96 238 48 99 98 239 87 98 97 241 87 98 97 241 48 99 98 239 90 100 99 240 48 99 98 242 49 101 100 243 90 100 99 245 90 100 99 245 49 101 100 243 93 102 101 244 49 101 100 246 50 103 102 247 93 102 101 249 93 102 101 249 50 103 102 247 96 104 103 248 50 103 102 250 51 105 104 251 96 104 103 253 96 104 103 253 51 105 104 251 99 106 105 252 51 105 104 254 52 107 106 255 99 106 105 257 99 106 105 257 52 107 106 255 102 108 107 256 52 107 106 258 53 109 108 259 102 108 107 261 102 108 107 261 53 109 108 259 105 110 109 260 53 109 108 262 54 111 110 263 105 110 109 265 105 110 109 265 54 111 110 263 108 112 111 264 54 111 110 266 55 113 112 267 108 112 111 269 108 112 111 269 55 113 112 267 111 114 113 268 55 113 112 270 56 115 114 271 111 114 113 273 111 114 113 273 56 115 114 271 114 116 115 272 56 115 114 274 57 117 116 275 114 116 115 277 114 116 115 277 57 117 116 275 117 118 117 276 57 117 116 278 38 79 118 279 117 118 117 281 117 118 117 281 38 79 118 279 60 82 119 280 62 119 120 282 65 120 121 283 59 121 122 284 65 120 121 285 68 122 123 286 59 121 122 287 68 122 123 288 71 123 124 289 59 121 122 290 71 123 124 291 74 124 125 292 59 121 122 293 74 124 125 294 77 125 126 295 59 121 122 296 77 125 126 297 80 126 127 298 59 121 122 299 80 126 127 300 83 127 128 301 59 121 122 302 83 127 128 303 86 128 129 304 59 121 122 305 86 128 129 306 89 129 130 307 59 121 122 308 89 129 130 309 92 130 131 310 59 121 122 311 92 130 131 312 95 131 132 313 59 121 122 314 95 131 132 315 98 132 133 316 59 121 122 317 98 132 133 318 101 133 134 319 59 121 122 320 101 133 134 321 104 134 135 322 59 121 122 323 104 134 135 324 107 135 136 325 59 121 122 326 107 135 136 327 110 136 137 328 59 121 122 329 110 136 137 330 113 137 138 331 59 121 122 332 113 137 138 333 116 138 139 334 59 121 122 335 116 138 139 336 119 139 140 337 59 121 122 338 119 139 140 339 62 119 120 340 59 121 122 341 60 82 119 342 61 140 141 343 117 118 117 345 117 118 117 345 61 140 141 343 118 141 142 344 61 140 143 346 62 119 120 347 118 141 144 349 118 141 144 349 62 119 120 347 119 139 140 348 62 119 120 350 61 140 143 351 65 120 121 353 65 120 121 353 61 140 143 351 64 142 145 352 61 140 146 354 60 82 81 355 64 142 147 357 64 142 147 357 60 82 81 355 63 81 80 356 65 120 121 358 64 142 145 359 68 122 123 361 68 122 123 361 64 142 145 359 67 143 148 360 64 142 147 362 63 81 80 363 67 143 149 365 67 143 149 365 63 81 80 363 66 84 83 364 68 122 123 366 67 143 148 367 71 123 124 369 71 123 124 369 67 143 148 367 70 144 150 368 67 143 149 370 66 84 83 371 70 144 151 373 70 144 151 373 66 84 83 371 69 86 85 372 71 123 124 374 70 144 150 375 74 124 125 377 74 124 125 377 70 144 150 375 73 145 152 376 70 144 151 378 69 86 85 379 73 145 153 381 73 145 153 381 69 86 85 379 72 88 87 380 74 124 125 382 73 145 152 383 77 125 126 385 77 125 126 385 73 145 152 383 76 146 154 384 73 145 153 386 72 88 87 387 76 146 155 389 76 146 155 389 72 88 87 387 75 90 89 388 77 125 126 390 76 146 154 391 80 126 127 393 80 126 127 393 76 146 154 391 79 147 156 392 76 146 155 394 75 90 89 395 79 147 157 397 79 147 157 397 75 90 89 395 78 92 91 396 80 126 127 398 79 147 156 399 83 127 128 401 83 127 128 401 79 147 156 399 82 148 158 400 79 147 157 402 78 92 91 403 82 148 159 405 82 148 159 405 78 92 91 403 81 94 93 404 83 127 128 406 82 148 158 407 86 128 129 409 86 128 129 409 82 148 158 407 85 149 160 408 82 148 159 410 81 94 93 411 85 149 161 413 85 149 161 413 81 94 93 411 84 96 95 412 86 128 129 414 85 149 160 415 89 129 130 417 89 129 130 417 85 149 160 415 88 150 162 416 85 149 161 418 84 96 95 419 88 150 163 421 88 150 163 421 84 96 95 419 87 98 97 420 89 129 130 422 88 150 162 423 92 130 131 425 92 130 131 425 88 150 162 423 91 151 164 424 88 150 163 426 87 98 97 427 91 151 165 429 91 151 165 429 87 98 97 427 90 100 99 428 92 130 131 430 91 151 164 431 95 131 132 433 95 131 132 433 91 151 164 431 94 152 166 432 91 151 165 434 90 100 99 435 94 152 167 437 94 152 167 437 90 100 99 435 93 102 101 436 95 131 132 438 94 152 166 439 98 132 133 441 98 132 133 441 94 152 166 439 97 153 168 440 94 152 167 442 93 102 101 443 97 153 169 445 97 153 169 445 93 102 101 443 96 104 103 444 98 132 133 446 97 153 168 447 101 133 134 449 101 133 134 449 97 153 168 447 100 154 170 448 97 153 169 450 96 104 103 451 100 154 171 453 100 154 171 453 96 104 103 451 99 106 105 452 101 133 134 454 100 154 170 455 104 134 135 457 104 134 135 457 100 154 170 455 103 155 172 456 100 154 171 458 99 106 105 459 103 155 173 461 103 155 173 461 99 106 105 459 102 108 107 460 104 134 135 462 103 155 172 463 107 135 136 465 107 135 136 465 103 155 172 463 106 156 174 464 103 155 173 466 102 108 107 467 106 156 175 469 106 156 175 469 102 108 107 467 105 110 109 468 107 135 136 470 106 156 174 471 110 136 137 473 110 136 137 473 106 156 174 471 109 157 176 472 106 156 175 474 105 110 109 475 109 157 177 477 109 157 177 477 105 110 109 475 108 112 111 476 110 136 137 478 109 157 176 479 113 137 138 481 113 137 138 481 109 157 176 479 112 158 178 480 109 157 177 482 108 112 111 483 112 158 179 485 112 158 179 485 108 112 111 483 111 114 113 484 113 137 138 486 112 158 178 487 116 138 139 489 116 138 139 489 112 158 178 487 115 159 180 488 112 158 179 490 111 114 113 491 115 159 181 493 115 159 181 493 111 114 113 491 114 116 115 492 116 138 139 494 115 159 180 495 119 139 140 497 119 139 140 497 115 159 180 495 118 141 144 496 115 159 181 498 114 116 115 499 118 141 142 501 118 141 142 501 114 116 115 499 117 118 117 500</p>
+ </triangles>
+ <triangles material="lambert4SG" count="8">
+ <input semantic="VERTEX" source="#qt_gauge_needles_1Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_1Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_1Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_1Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_1Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_1Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_1Shape-texbinormals" offset="3" set="0"/>
+ <p>5 10 10 41 6 11 3 42 14 3 4 43 30 42 36 77 31 43 24 78 37 45 46 80 37 45 46 80 31 43 24 78 36 44 25 79 5 10 45 121 30 42 36 122 6 11 39 124 6 11 39 124 30 42 36 122 37 45 46 123 36 44 51 133 31 43 52 134 9 17 53 137 9 17 53 137 31 43 52 134 18 18 7 136 31 43 52 134 12 24 38 135 18 18 7 136</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_1Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_1" name="qt_gauge_needles_1" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_1Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#red_transparent"/>
+ <instance_material symbol="lambert3SG" target="#black_solid"/>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_1</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_10.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_10.dae
new file mode 100644
index 0000000..dc2c629
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_10.dae
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:56:08</created>
+ <modified>2018-03-08T09:56:08</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="red_transparent" name="red_transparent">
+ <instance_effect url="#red_transparent-fx"/>
+ </material>
+ <material id="black_solid" name="black_solid">
+ <instance_effect url="#black_solid-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="black_solid-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2938931 0.2938931 0.2938931 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03053435 0.03053435 0.03053435 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">black_solid</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="red_transparent-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.56808 0.05568 0.05568 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0.2251908 0.2251908 0.2251908 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">red_transparent</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_10Shape" name="qt_gauge_needles_10Shape">
+ <mesh>
+ <source id="qt_gauge_needles_10Shape-positions" name="qt_gauge_needles_10Shape-positions">
+ <float_array id="qt_gauge_needles_10Shape-positions-array" count="174">-0.1770782 0.2356744 -12 -0.1770782 0.2356744 4 0.1770782 0.2356744 -12 0.1770782 0.2356744 4 -0.1770782 0.4723087 -12 -0.1770782 0.4723087 4 0.1770782 0.4723087 4 0.1770782 0.4723087 -12 0.3660247 0 1.366025 0.707105 0 1.224744 0.9999995 0 0.9999995 1.224746 0 0.7071065 1.366025 0 0.3660253 1.414211 0 0 1.366027 0 -0.3660251 1.224744 0 -0.7071064 1 0 -0.9999995 0.707106 0 -1.224744 0.3660269 0 -1.366025 0 0 -1.414213 -0.366025 0 -1.366025 -0.7071054 0 -1.224745 -0.9999998 0 -0.9999998 -1.224746 0 -0.7071067 -1.366025 0 -0.3660253 -1.414211 0 0 -1.366027 0 0.3660253 -1.224744 0 0.7071066 -1 0 0.9999999 -0.7071056 0 1.224745 -0.3660265 0 1.366025 0 0 1.414214 0.3660247 0.870889 1.366025 0.707105 0.870889 1.224744 0.9999995 0.870889 0.9999995 1.224746 0.870889 0.7071065 1.366025 0.870889 0.3660253 1.414211 0.870889 0 1.366027 0.870889 -0.3660251 1.224744 0.870889 -0.7071064 1 0.870889 -0.9999995 0.707106 0.870889 -1.224744 0.3660269 0.870889 -1.366025 0 0.870889 -1.414213 -0.366025 0.870889 -1.366025 -0.7071054 0.870889 -1.224745 -0.9999998 0.870889 -0.9999998 -1.224746 0.870889 -0.7071067 -1.366025 0.870889 -0.3660253 -1.414211 0.870889 0 -1.366027 0.870889 0.3660253 -1.224744 0.870889 0.7071066 -1 0.870889 0.9999999 -0.7071056 0.870889 1.224745 -0.3660265 0.870889 1.366025 0 0.870889 1.414214 0 0 0 0 0.870889 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_10Shape-positions-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_10Shape-normals" name="qt_gauge_needles_10Shape-normals">
+ <float_array id="qt_gauge_needles_10Shape-normals-array" count="366">0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.2588201 0 0.9659254 0.4999996 0 0.8660254 0.4999996 0 0.8660254 0.2588201 0 0.9659254 0.7071047 0 0.7071089 0.7071047 0 0.7071089 0.866025 0 0.5000006 0.866025 0 0.5000006 0.9659267 0 0.2588153 0.9659267 0 0.2588153 0.9999999 0 0 0.9999999 0 0 0.9659262 0 -0.2588174 0.9659262 0 -0.2588174 0.8660247 0 -0.500001 0.8660247 0 -0.500001 0.7071066 0 -0.7071068 0.7071066 0 -0.7071068 0.5000006 0 -0.8660249 0.5000006 0 -0.8660249 0.2588199 0 -0.9659255 0.2588199 0 -0.9659255 0 0 -0.9999999 0 0 -0.9999999 -0.2588186 0 -0.9659258 -0.2588186 0 -0.9659258 -0.4999996 0 -0.8660255 -0.4999996 0 -0.8660255 -0.707105 0 -0.7071086 -0.707105 0 -0.7071086 -0.8660252 0 -0.5000001 -0.8660252 0 -0.5000001 -0.9659268 0 -0.2588148 -0.9659268 0 -0.2588148 -0.9999999 0 0 -0.9999999 0 0 -0.9659261 0 0.2588174 -0.9659261 0 0.2588174 -0.8660247 0 0.500001 -0.8660247 0 0.500001 -0.7071066 0 0.7071068 -0.7071066 0 0.7071068 -0.5000007 0 0.8660249 -0.5000007 0 0.8660249 -0.2588201 0 0.9659254 -0.2588201 0 0.9659254 0 0 0.9999999 0 0 0.9999999 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_10Shape-normals-array" count="122" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_10Shape-tangents" name="qt_gauge_needles_10Shape-tangents">
+ <float_array id="qt_gauge_needles_10Shape-tangents-array" count="366">0 0 1 1 0 0 0 0 -1 -1 0 0 1 0 0 0 0 1 -1 0 0 0 0 -1 0 0 1 0 1 0 0 0 -1 0 -1 0 0.9999999 0 0 0 1 0 -0.9999999 0 0 0 -1 0 0 0 -1 0 1 0 0 0 1 0 -1 0 -0.9999999 0 0 0 1 0 0.9999999 0 0 0 -1 0 0.9659256 0 -0.2588201 0 1 0 -0.8660256 0 0.4999997 0 -1 0 0 1 0 -0.7071089 0 0.7071047 0 1 0 -0.5000006 0 0.866025 0 1 0 -0.2588153 0 0.9659268 0 1 0 0 0 1 0 1 0 0.2588174 0 0.9659263 0 1 0 0.500001 0 0.8660248 0 1 0 0.7071068 0 0.7071067 0 1 0 0.866025 0 0.5000006 0 1 0 0.9659256 0 0.2588199 0 1 0 1 0 0 0 1 0 0.965926 0 -0.2588186 0 1 0 0.8660256 0 -0.4999996 0 1 0 0.7071086 0 -0.707105 0 1 0 0.5000001 0 -0.8660253 0 1 0 0.2588149 0 -0.9659269 0 1 0 0 0 -1 0 1 0 -0.2588175 0 -0.9659262 0 0.9999999 0 -0.5000011 0 -0.8660248 0 1 0 -0.7071068 0 -0.7071067 0 1 0 -0.866025 0 -0.5000008 0 1 0 -0.9659256 0 -0.2588201 0 1 0 -1 0 0 -0.8660258 0 0.4999993 -0.3826847 0 -0.923879 0.9659259 0 -0.2588187 -0.7071068 0 0.7071068 -0.4999996 0 0.8660256 -0.258819 0 0.9659258 0 0 0.9999999 0.2588186 0 0.9659259 0.5 0 0.8660253 0.7071064 0 0.7071071 0.8660255 0 0.4999997 0.9659255 0 0.2588201 0.9999999 0 0 0.9659258 0 -0.2588188 0.8660257 0 -0.4999993 0.7071068 0 -0.7071068 0.4999996 0 -0.8660256 0.258819 0 -0.9659258 0 0 -0.9999999 -0.2588187 0 -0.9659259 -0.5000002 0 -0.8660253 -0.7071067 0 -0.7071068 -0.8660257 0 -0.4999994 -0.9659256 0 -0.2588198 -0.9999999 0 0 0.9659259 0 -0.2588187 -0.3826847 0 -0.923879 -0.8660258 0 0.4999993 -0.6087593 0 -0.793355 -0.7933514 0 -0.6087639 -0.9238804 0 -0.3826815 -0.9914456 0 -0.1305207 -0.991446 0 0.1305169 -0.9238774 0 0.3826885 -0.793355 0 0.6087593 -0.6087598 0 0.7933545 -0.3826856 0 0.9238786 -0.1305262 0 0.9914449 0.1305255 0 0.991445 0.3826841 0 0.9238793 0.6087596 0 0.7933547 0.7933517 0 0.6087636 0.9238805 0 0.3826809 0.9914456 0 0.1305203 0.9914461 0 -0.1305172 0.9238775 0 -0.3826884 0.7933548 0 -0.6087595 0.6087598 0 -0.7933545 0.3826856 0 -0.9238786 0.1305265 0 -0.9914448</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_10Shape-tangents-array" count="122" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_10Shape-binormals" name="qt_gauge_needles_10Shape-binormals">
+ <float_array id="qt_gauge_needles_10Shape-binormals-array" count="366">1 0 0 0 0 -1 -1 0 0 0 0 1 0 0 1 -1 0 0 0 0 -1 1 0 0 0 1 0 0 0 -1 0 -1 0 0 0 1 0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 0 0 0 1 0 -1 0 0 0 -1 0 1 0 1 0 0 0 -1 0 -1 0 0 0 1 0 -0.8660256 0 0.4999997 0 -1 0 0.9659256 0 -0.2588201 -0.7071089 0 0.7071047 0 -1 0 -0.5000007 0 0.8660251 0 -1 0 -0.2588153 0 0.9659268 0 -1 0 0 0 1 0 -1 0 0.2588174 0 0.9659263 0 -1 0 0.500001 0 0.8660249 0 -1 0 0.7071068 0 0.7071067 0 -1 0 0.866025 0 0.5000007 0 -1 0 0.9659256 0 0.2588199 0 -1 0 1 0 0 0 -1 0 0.9659261 0 -0.2588186 0 -1 0 0.8660256 0 -0.4999996 0 -1 0 0.7071086 0 -0.707105 0 -1 0 0.5000002 0 -0.8660253 0 -1 0 0.2588149 0 -0.9659269 0 -1 0 0 0 -1 0 -1 0 -0.2588175 0 -0.9659263 0 -1 0 -0.5000011 0 -0.8660249 0 -1 0 -0.7071068 0 -0.7071067 0 -1 0 -0.866025 0 -0.5000008 0 -1 0 -0.9659256 0 -0.2588201 0 -1 0 -1 0 0 0 -1 0 -0.4999993 0 -0.8660258 0.9238791 0 -0.3826848 0.2588187 0 0.9659259 -0.7071068 0 -0.7071068 -0.8660257 0 -0.4999996 -0.9659259 0 -0.258819 -1 0 0 -0.965926 0 0.2588186 -0.8660254 0 0.5 -0.7071072 0 0.7071065 -0.4999998 0 0.8660256 -0.2588201 0 0.9659256 0 0 1 0.2588189 0 0.9659259 0.4999994 0 0.8660259 0.7071068 0 0.7071068 0.8660256 0 0.4999997 0.9659259 0 0.258819 1 0 0 0.965926 0 -0.2588188 0.8660253 0 -0.5000002 0.7071068 0 -0.7071067 0.4999995 0 -0.8660258 0.2588198 0 -0.9659257 0 0 -1 -0.2588187 0 -0.965926 -0.923879 0 0.3826847 0.4999993 0 0.8660258 -0.793355 0 0.6087593 -0.608764 0 0.7933515 -0.3826814 0 0.9238803 -0.1305207 0 0.9914457 0.1305169 0 0.9914461 0.3826885 0 0.9238775 0.6087593 0 0.793355 0.7933546 0 0.6087599 0.9238787 0 0.3826857 0.9914449 0 0.1305262 0.991445 0 -0.1305255 0.9238794 0 -0.3826841 0.7933547 0 -0.6087596 0.6087636 0 -0.7933517 0.382681 0 -0.9238806 0.1305203 0 -0.9914457 -0.1305172 0 -0.9914461 -0.3826884 0 -0.9238775 -0.6087595 0 -0.7933549 -0.7933546 0 -0.6087599 -0.9238787 0 -0.3826857 -0.9914449 0 -0.1305265</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_10Shape-binormals-array" count="122" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_10Shape-map1" name="qt_gauge_needles_10Shape-map1">
+ <float_array id="qt_gauge_needles_10Shape-map1-array" count="224">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0.375 0.3125 0.3854167 0.3125 0.3854167 0.6884398 0.375 0.6884398 0.3958333 0.3125 0.3958333 0.6884398 0.40625 0.3125 0.40625 0.6884398 0.4166666 0.3125 0.4166666 0.6884398 0.4270833 0.3125 0.4270833 0.6884398 0.4374999 0.3125 0.4374999 0.6884398 0.4479166 0.3125 0.4479166 0.6884398 0.4583333 0.3125 0.4583333 0.6884398 0.4687499 0.3125 0.4687499 0.6884398 0.4791666 0.3125 0.4791666 0.6884398 0.4895832 0.3125 0.4895832 0.6884398 0.4999999 0.3125 0.4999999 0.6884398 0.5104166 0.3125 0.5104166 0.6884398 0.5208333 0.3125 0.5208333 0.6884398 0.5312499 0.3125 0.5312499 0.6884398 0.5416666 0.3125 0.5416666 0.6884398 0.5520833 0.3125 0.5520833 0.6884398 0.5625 0.3125 0.5625 0.6884398 0.5729167 0.3125 0.5729167 0.6884398 0.5833334 0.3125 0.5833334 0.6884398 0.5937501 0.3125 0.5937501 0.6884398 0.6041667 0.3125 0.6041667 0.6884398 0.6145834 0.3125 0.6145834 0.6884398 0.6250001 0.3125 0.6250001 0.6884398 0.6353164 0.07812506 0.6509258 0.1158096 0.5 0.15 0.6104854 0.04576464 0.578125 0.02093361 0.5404404 0.005324185 0.5 0 0.4595596 0.005324155 0.4218751 0.02093358 0.3895146 0.0457646 0.3646836 0.07812501 0.3490741 0.1158095 0.3437501 0.15625 0.3490741 0.1966905 0.3646836 0.234375 0.3895146 0.2667354 0.421875 0.2915664 0.4595595 0.3071759 0.5 0.3125 0.5404404 0.3071759 0.578125 0.2915665 0.6104854 0.2667354 0.6353165 0.234375 0.6509259 0.1966905 0.65625 0.15625 0.6509259 0.8841904 0.6353165 0.921875 0.5 0.8375 0.6104854 0.9542354 0.578125 0.9790665 0.5404404 0.9946759 0.5 1 0.4595595 0.9946759 0.421875 0.9790664 0.3895146 0.9542354 0.3646836 0.921875 0.3490741 0.8841904 0.3437501 0.84375 0.3490741 0.8033096 0.3646836 0.765625 0.3895146 0.7332646 0.4218751 0.7084336 0.4595596 0.6928241 0.5 0.6875001 0.5404404 0.6928242 0.578125 0.7084336 0.6104854 0.7332646 0.6353164 0.7656251 0.6509258 0.8033096 0.65625 0.84375</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_10Shape-map1-array" count="112" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_10Shape-textangents">
+ <float_array id="qt_gauge_needles_10Shape-textangents-array" count="792">0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0.7123158 -0.7018589 0 0 -0.9999999 0 -0.7123158 0.7018589 0.9999999 0 0 -0.4714015 0.8819187 0 -0.9999999 0 0 0.4714015 -0.8819187 0 0 0 -0.9999999 0 0.7123158 0.7018589 0 0 0.9999999 0 -0.7123158 -0.7018589 -0.9999999 0 0 0.4714015 0.8819187 0 0.9999999 0 0 -0.4714015 -0.8819187 0 0.9659255 0 -0.2588201 0.8660256 0 -0.4999996 0.8660256 0 -0.4999997 0.9659255 0 -0.2588201 0.8660256 0 -0.4999996 0.7071088 0 -0.7071046 0.7071088 0 -0.7071046 0.8660256 0 -0.4999997 0.7071088 0 -0.7071046 0.5000006 0 -0.866025 0.5000005 0 -0.866025 0.7071088 0 -0.7071046 0.5000006 0 -0.866025 0.2588153 0 -0.9659268 0.2588153 0 -0.9659268 0.5000005 0 -0.866025 0.2588153 0 -0.9659268 0 0 -0.9999999 0 0 -0.9999999 0.2588153 0 -0.9659268 0 0 -0.9999999 -0.2588174 0 -0.9659263 -0.2588174 0 -0.9659262 0 0 -0.9999999 -0.2588174 0 -0.9659263 -0.5000009 0 -0.8660247 -0.5000009 0 -0.8660247 -0.2588174 0 -0.9659262 -0.5000009 0 -0.8660247 -0.7071068 0 -0.7071067 -0.7071068 0 -0.7071067 -0.5000009 0 -0.8660247 -0.7071068 0 -0.7071067 -0.866025 0 -0.5000007 -0.866025 0 -0.5000007 -0.7071068 0 -0.7071067 -0.866025 0 -0.5000007 -0.9659255 0 -0.2588199 -0.9659255 0 -0.2588199 -0.866025 0 -0.5000007 -0.9659255 0 -0.2588199 -0.9999999 0 0 -0.9999999 0 0 -0.9659255 0 -0.2588199 -0.9999999 0 0 -0.9659259 0 0.2588186 -0.9659259 0 0.2588186 -0.9999999 0 0 -0.9659259 0 0.2588186 -0.8660256 0 0.4999996 -0.8660256 0 0.4999996 -0.9659259 0 0.2588186 -0.8660256 0 0.4999996 -0.7071086 0 0.707105 -0.7071086 0 0.707105 -0.8660256 0 0.4999996 -0.7071086 0 0.707105 -0.5000001 0 0.8660252 -0.5000001 0 0.8660252 -0.7071086 0 0.707105 -0.5000001 0 0.8660252 -0.2588149 0 0.9659269 -0.2588148 0 0.9659269 -0.5000001 0 0.8660252 -0.2588149 0 0.9659269 0 0 0.9999999 0 0 0.9999999 -0.2588148 0 0.9659269 0 0 0.9999999 0.2588174 0 0.9659262 0.2588175 0 0.9659262 0 0 0.9999999 0.2588174 0 0.9659262 0.500001 0 0.8660247 0.500001 0 0.8660247 0.2588175 0 0.9659262 0.500001 0 0.8660247 0.7071068 0 0.7071067 0.7071068 0 0.7071067 0.500001 0 0.8660247 0.7071068 0 0.7071067 0.8660249 0 0.5000007 0.8660249 0 0.5000007 0.7071068 0 0.7071067 0.8660249 0 0.5000007 0.9659255 0 0.2588201 0.9659255 0 0.2588201 0.8660249 0 0.5000007 0.9659255 0 0.2588201 0.9999999 0 0 0.9999999 0 0 0.9659255 0 0.2588201 0.9999999 0 0 0.9659255 0 -0.2588201 0.9659255 0 -0.2588201 0.9999999 0 0 0.03531285 0 0.9993762 0.03900503 0 0.999239 0 0 1 0.02907804 0 0.9995772 0.03531285 0 0.9993762 0 0 1 0.02069997 0 0.9997857 0.02907804 0 0.9995772 0 0 1 0.01076452 0 0.9999421 0.02069997 0 0.9997857 0 0 1 0 0 0.9999999 0.01076452 0 0.9999421 0 0 1 -0.01076218 0 0.9999421 0 0 0.9999999 0 0 1 -0.02069851 0 0.9997858 -0.01076218 0 0.9999421 0 0 1 -0.02908064 0 0.999577 -0.02069851 0 0.9997858 0 0 1 -0.03531403 0 0.9993763 -0.02908064 0 0.999577 0 0 1 -0.0390072 0 0.9992388 -0.03531403 0 0.9993763 0 0 1 -0.03997052 0 0.9992008 -0.0390072 0 0.9992388 0 0 1 -0.03822131 0 0.9992693 -0.03997052 0 0.9992008 0 0 1 -0.03395505 0 0.9994234 -0.03822131 0 0.9992693 0 0 1 -0.02751133 0 0.9996215 -0.03395505 0 0.9994234 0 0 1 -0.01933744 0 0.999813 -0.02751133 0 0.9996215 0 0 1 -0.009968859 0 0.9999503 -0.01933744 0 0.999813 0 0 1 0 0 1 -0.009968859 0 0.9999503 0 0 1 0.009971682 0 0.9999502 0 0 1 0 0 1 0.01933958 0 0.999813 0.009971682 0 0.9999502 0 0 1 0.02750906 0 0.9996216 0.01933958 0 0.999813 0 0 1 0.03395405 0 0.9994234 0.02750906 0 0.9996216 0 0 1 0.03821895 0 0.9992694 0.03395405 0 0.9994234 0 0 1 0.03996805 0 0.9992009 0.03821895 0 0.9992694 0 0 1 0.03900503 0 0.999239 0.03996805 0 0.9992009 0 0 1 -0.03822117 0 0.9992693 -0.03395525 0 0.9994233 0 0 0.9999999 -0.03395525 0 0.9994233 -0.02751172 0 0.9996215 0 0 0.9999999 -0.02751172 0 0.9996215 -0.01933842 0 0.999813 0 0 0.9999999 -0.01933842 0 0.999813 -0.009969573 0 0.9999503 0 0 0.9999999 -0.009969573 0 0.9999503 0 0 1 0 0 0.9999999 0 0 1 0.009970845 0 0.9999502 0 0 0.9999999 0.009970845 0 0.9999502 0.01933937 0 0.999813 0 0 0.9999999 0.01933937 0 0.999813 0.02750916 0 0.9996216 0 0 0.9999999 0.02750916 0 0.9996216 0.0339538 0 0.9994234 0 0 0.9999999 0.0339538 0 0.9994234 0.03821867 0 0.9992694 0 0 0.9999999 0.03821867 0 0.9992694 0.03996797 0 0.9992009 0 0 0.9999999 0.03996797 0 0.9992009 0.03900531 0 0.999239 0 0 0.9999999 0.03900531 0 0.999239 0.0353133 0 0.9993763 0 0 0.9999999 0.0353133 0 0.9993763 0.02907806 0 0.9995772 0 0 0.9999999 0.02907806 0 0.9995772 0.02070014 0 0.9997857 0 0 0.9999999 0.02070014 0 0.9997857 0.01076384 0 0.9999421 0 0 0.9999999 0.01076384 0 0.9999421 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.01076226 0 0.9999421 0 0 0.9999999 -0.01076226 0 0.9999421 -0.02069854 0 0.9997858 0 0 0.9999999 -0.02069854 0 0.9997858 -0.02908062 0 0.999577 0 0 0.9999999 -0.02908062 0 0.999577 -0.03531422 0 0.9993762 0 0 0.9999999 -0.03531422 0 0.9993762 -0.0390072 0 0.9992388 0 0 0.9999999 -0.0390072 0 0.9992388 -0.03997045 0 0.9992008 0 0 0.9999999 -0.03997045 0 0.9992008 -0.03822117 0 0.9992693 0 0 0.9999999</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_10Shape-textangents-array" count="264" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_10Shape-texbinormals">
+ <float_array id="qt_gauge_needles_10Shape-texbinormals-array" count="792">1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 -0.701859 -0.7123159 0 -1 0 0 0.701859 0.7123159 0 1 0 -0.8819187 -0.4714015 0 0 -1 0 0.8819187 0.4714015 0 0 1 0 0 -0.701859 0.7123159 0 -1 0 0 0.701859 -0.7123159 0 1 0 0.8819187 -0.4714015 0 0 -1 0 -0.8819187 0.4714015 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -0.9993764 0 0.03531285 -0.999239 0 0.03900503 -1 0 0 -0.9995772 0 0.02907805 -0.9993764 0 0.03531285 -1 0 0 -0.9997858 0 0.02069997 -0.9995772 0 0.02907805 -1 0 0 -0.9999421 0 0.01076452 -0.9997858 0 0.02069997 -1 0 0 -1 0 0 -0.9999421 0 0.01076452 -1 0 0 -0.9999421 0 -0.01076218 -1 0 0 -1 0 0 -0.9997858 0 -0.02069851 -0.9999421 0 -0.01076218 -1 0 0 -0.9995772 0 -0.02908064 -0.9997858 0 -0.02069851 -1 0 0 -0.9993763 0 -0.03531403 -0.9995772 0 -0.02908064 -1 0 0 -0.999239 0 -0.03900721 -0.9993763 0 -0.03531403 -1 0 0 -0.9992009 0 -0.03997053 -0.999239 0 -0.03900721 -1 0 0 -0.9992693 0 -0.03822131 -0.9992009 0 -0.03997053 -1 0 0 -0.9994234 0 -0.03395505 -0.9992693 0 -0.03822131 -1 0 0 -0.9996215 0 -0.02751133 -0.9994234 0 -0.03395505 -1 0 0 -0.999813 0 -0.01933744 -0.9996215 0 -0.02751133 -1 0 0 -0.9999504 0 -0.00996886 -0.999813 0 -0.01933744 -1 0 0 -1 0 0 -0.9999504 0 -0.00996886 -1 0 0 -0.9999503 0 0.009971683 -1 0 0 -1 0 0 -0.999813 0 0.01933958 -0.9999503 0 0.009971683 -1 0 0 -0.9996216 0 0.02750907 -0.999813 0 0.01933958 -1 0 0 -0.9994234 0 0.03395405 -0.9996216 0 0.02750907 -1 0 0 -0.9992695 0 0.03821895 -0.9994234 0 0.03395405 -1 0 0 -0.999201 0 0.03996806 -0.9992695 0 0.03821895 -1 0 0 -0.999239 0 0.03900503 -0.999201 0 0.03996806 -1 0 0 0.9992694 0 0.03822117 0.9994234 0 0.03395526 1 0 0 0.9994234 0 0.03395526 0.9996216 0 0.02751172 1 0 0 0.9996216 0 0.02751172 0.9998131 0 0.01933842 1 0 0 0.9998131 0 0.01933842 0.9999503 0 0.009969573 1 0 0 0.9999503 0 0.009969573 1 0 0 1 0 0 1 0 0 0.9999503 0 -0.009970845 1 0 0 0.9999503 0 -0.009970845 0.999813 0 -0.01933937 1 0 0 0.999813 0 -0.01933937 0.9996216 0 -0.02750916 1 0 0 0.9996216 0 -0.02750916 0.9994234 0 -0.0339538 1 0 0 0.9994234 0 -0.0339538 0.9992695 0 -0.03821867 1 0 0 0.9992695 0 -0.03821867 0.999201 0 -0.03996797 1 0 0 0.999201 0 -0.03996797 0.999239 0 -0.03900531 1 0 0 0.999239 0 -0.03900531 0.9993764 0 -0.0353133 1 0 0 0.9993764 0 -0.0353133 0.9995772 0 -0.02907806 1 0 0 0.9995772 0 -0.02907806 0.9997858 0 -0.02070015 1 0 0 0.9997858 0 -0.02070015 0.9999421 0 -0.01076384 1 0 0 0.9999421 0 -0.01076384 1 0 0 1 0 0 1 0 0 0.9999422 0 0.01076226 1 0 0 0.9999422 0 0.01076226 0.9997858 0 0.02069854 1 0 0 0.9997858 0 0.02069854 0.9995771 0 0.02908062 1 0 0 0.9995771 0 0.02908062 0.9993763 0 0.03531422 1 0 0 0.9993763 0 0.03531422 0.999239 0 0.03900721 1 0 0 0.999239 0 0.03900721 0.9992009 0 0.03997045 1 0 0 0.9992009 0 0.03997045 0.9992694 0 0.03822117 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_10Shape-texbinormals-array" count="264" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_10Shape-vertices" name="qt_gauge_needles_10Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_10Shape-positions"/>
+ </vertices>
+ <triangles material="lambert2SG" count="12">
+ <input semantic="VERTEX" source="#qt_gauge_needles_10Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_10Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_10Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_10Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_10Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_10Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_10Shape-texbinormals" offset="3" set="0"/>
+ <p>4 0 8 0 5 1 9 1 7 3 11 3 7 3 11 3 5 1 9 1 6 2 10 2 0 4 4 4 2 5 7 5 1 7 5 7 1 7 5 7 2 5 7 5 3 6 6 6 0 8 0 8 1 9 1 9 4 11 8 11 4 11 8 11 1 9 1 9 5 10 9 10 1 12 1 12 3 13 3 13 5 15 9 15 5 15 9 15 3 13 3 13 6 14 10 14 3 16 3 16 2 17 2 17 6 19 10 19 6 19 10 19 2 17 2 17 7 18 11 18 2 20 2 20 0 21 0 21 7 23 11 23 7 23 11 23 0 21 0 21 4 22 8 22</p>
+ </triangles>
+ <triangles material="lambert3SG" count="96">
+ <input semantic="VERTEX" source="#qt_gauge_needles_10Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_10Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_10Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_10Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_10Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_10Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_10Shape-texbinormals" offset="3" set="0"/>
+ <p>8 24 12 24 9 25 13 25 32 27 15 27 32 27 15 27 9 25 13 25 33 26 14 26 9 25 13 28 10 28 16 29 33 26 14 31 33 26 14 31 10 28 16 29 34 29 17 30 10 28 16 32 11 30 18 33 34 29 17 35 34 29 17 35 11 30 18 33 35 31 19 34 11 30 18 36 12 32 20 37 35 31 19 39 35 31 19 39 12 32 20 37 36 33 21 38 12 32 20 40 13 34 22 41 36 33 21 43 36 33 21 43 13 34 22 41 37 35 23 42 13 34 22 44 14 36 24 45 37 35 23 47 37 35 23 47 14 36 24 45 38 37 25 46 14 36 24 48 15 38 26 49 38 37 25 51 38 37 25 51 15 38 26 49 39 39 27 50 15 38 26 52 16 40 28 53 39 39 27 55 39 39 27 55 16 40 28 53 40 41 29 54 16 40 28 56 17 42 30 57 40 41 29 59 40 41 29 59 17 42 30 57 41 43 31 58 17 42 30 60 18 44 32 61 41 43 31 63 41 43 31 63 18 44 32 61 42 45 33 62 18 44 32 64 19 46 34 65 42 45 33 67 42 45 33 67 19 46 34 65 43 47 35 66 19 46 34 68 20 48 36 69 43 47 35 71 43 47 35 71 20 48 36 69 44 49 37 70 20 48 36 72 21 50 38 73 44 49 37 75 44 49 37 75 21 50 38 73 45 51 39 74 21 50 38 76 22 52 40 77 45 51 39 79 45 51 39 79 22 52 40 77 46 53 41 78 22 52 40 80 23 54 42 81 46 53 41 83 46 53 41 83 23 54 42 81 47 55 43 82 23 54 42 84 24 56 44 85 47 55 43 87 47 55 43 87 24 56 44 85 48 57 45 86 24 56 44 88 25 58 46 89 48 57 45 91 48 57 45 91 25 58 46 89 49 59 47 90 25 58 46 92 26 60 48 93 49 59 47 95 49 59 47 95 26 60 48 93 50 61 49 94 26 60 48 96 27 62 50 97 50 61 49 99 50 61 49 99 27 62 50 97 51 63 51 98 27 62 50 100 28 64 52 101 51 63 51 103 51 63 51 103 28 64 52 101 52 65 53 102 28 64 52 104 29 66 54 105 52 65 53 107 52 65 53 107 29 66 54 105 53 67 55 106 29 66 54 108 30 68 56 109 53 67 55 111 53 67 55 111 30 68 56 109 54 69 57 110 30 68 56 112 31 70 58 113 54 69 57 115 54 69 57 115 31 70 58 113 55 71 59 114 31 70 58 116 8 24 60 117 55 71 59 119 55 71 59 119 8 24 60 117 32 27 61 118 9 72 62 120 8 73 63 121 56 74 64 122 10 75 65 123 9 72 62 124 56 74 64 125 11 76 66 126 10 75 65 127 56 74 64 128 12 77 67 129 11 76 66 130 56 74 64 131 13 78 68 132 12 77 67 133 56 74 64 134 14 79 69 135 13 78 68 136 56 74 64 137 15 80 70 138 14 79 69 139 56 74 64 140 16 81 71 141 15 80 70 142 56 74 64 143 17 82 72 144 16 81 71 145 56 74 64 146 18 83 73 147 17 82 72 148 56 74 64 149 19 84 74 150 18 83 73 151 56 74 64 152 20 85 75 153 19 84 74 154 56 74 64 155 21 86 76 156 20 85 75 157 56 74 64 158 22 87 77 159 21 86 76 160 56 74 64 161 23 88 78 162 22 87 77 163 56 74 64 164 24 89 79 165 23 88 78 166 56 74 64 167 25 90 80 168 24 89 79 169 56 74 64 170 26 91 81 171 25 90 80 172 56 74 64 173 27 92 82 174 26 91 81 175 56 74 64 176 28 93 83 177 27 92 82 178 56 74 64 179 29 94 84 180 28 93 83 181 56 74 64 182 30 95 85 183 29 94 84 184 56 74 64 185 31 96 86 186 30 95 85 187 56 74 64 188 8 73 63 189 31 96 86 190 56 74 64 191 32 97 87 192 33 98 88 193 57 99 89 194 33 98 88 195 34 100 90 196 57 99 89 197 34 100 90 198 35 101 91 199 57 99 89 200 35 101 91 201 36 102 92 202 57 99 89 203 36 102 92 204 37 103 93 205 57 99 89 206 37 103 93 207 38 104 94 208 57 99 89 209 38 104 94 210 39 105 95 211 57 99 89 212 39 105 95 213 40 106 96 214 57 99 89 215 40 106 96 216 41 107 97 217 57 99 89 218 41 107 97 219 42 108 98 220 57 99 89 221 42 108 98 222 43 109 99 223 57 99 89 224 43 109 99 225 44 110 100 226 57 99 89 227 44 110 100 228 45 111 101 229 57 99 89 230 45 111 101 231 46 112 102 232 57 99 89 233 46 112 102 234 47 113 103 235 57 99 89 236 47 113 103 237 48 114 104 238 57 99 89 239 48 114 104 240 49 115 105 241 57 99 89 242 49 115 105 243 50 116 106 244 57 99 89 245 50 116 106 246 51 117 107 247 57 99 89 248 51 117 107 249 52 118 108 250 57 99 89 251 52 118 108 252 53 119 109 253 57 99 89 254 53 119 109 255 54 120 110 256 57 99 89 257 54 120 110 258 55 121 111 259 57 99 89 260 55 121 111 261 32 97 87 262 57 99 89 263</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_10Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_10" name="qt_gauge_needles_10" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_10Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#red_transparent"/>
+ <instance_material symbol="lambert3SG" target="#black_solid"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_10</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_11.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_11.dae
new file mode 100644
index 0000000..cf43e42
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_11.dae
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:56:33</created>
+ <modified>2018-03-08T09:56:33</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="black_solid" name="black_solid">
+ <instance_effect url="#black_solid-fx"/>
+ </material>
+ <material id="red_transparent" name="red_transparent">
+ <instance_effect url="#red_transparent-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="black_solid-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2938931 0.2938931 0.2938931 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03053435 0.03053435 0.03053435 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">black_solid</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="red_transparent-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.56808 0.05568 0.05568 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0.2251908 0.2251908 0.2251908 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">red_transparent</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_Shape11" name="qt_gauge_needles_Shape11">
+ <mesh>
+ <source id="qt_gauge_needles_Shape11-positions" name="qt_gauge_needles_Shape11-positions">
+ <float_array id="qt_gauge_needles_Shape11-positions-array" count="384">0.4006047 0 1.232937 0.7619991 0 1.0488 1.048798 0 0.7619972 1.232938 0 0.4006054 1.296387 0 0 1.232939 0 -0.4006059 1.048797 0 -0.7619973 0.7619957 0 -1.048799 0.4006073 0 -1.232938 0 0 -1.296387 -0.400605 0 -1.232938 -0.7619987 0 -1.048799 -1.048798 0 -0.7619972 -1.232938 0 -0.4006057 -1.296387 0 0 -1.232936 0 0.4006054 -1.048798 0 0.7619969 -0.7619962 0 1.048799 -0.400604 0 1.232937 0 0 1.296386 0.4006047 0.2740982 1.232937 0.7619991 0.2740982 1.0488 1.048798 0.2740982 0.7619972 1.232938 0.2740982 0.4006054 1.296387 0.2740982 0 1.232939 0.2740982 -0.4006059 1.048797 0.2740982 -0.7619973 0.7619957 0.2740982 -1.048799 0.4006073 0.2740982 -1.232938 0 0.2740982 -1.296387 -0.400605 0.2740982 -1.232938 -0.7619987 0.2740982 -1.048799 -1.048798 0.2740982 -0.7619972 -1.232938 0.2740982 -0.4006057 -1.296387 0.2740982 0 -1.232936 0.2740982 0.4006054 -1.048798 0.2740982 0.7619969 -0.7619962 0.2740982 1.048799 -0.400604 0.2740982 1.232937 0 0.2740982 1.296386 0 0 0 0.03556824 0 -12 0 0 -12 0 0.2740728 -12 0.03556824 0.2740728 -12 -0.03556824 0 -12 -0.03556824 0.2740728 -12 0 0.7820415 0 0.3885107 0.4684954 1.195708 0.3540628 0.6332758 1.089689 0.3025066 0.7433786 0.9310199 0.241694 0.7820415 0.7438569 0.4597284 0.7820415 0.632763 0.5754015 0.7433786 0.7919732 0.6734663 0.6332758 0.9269453 0.7389896 0.4684954 1.017131 0.632764 0.7820416 0.4597293 0.7919741 0.7433786 0.5754022 0.9269441 0.6332759 0.6734651 1.01713 0.4684954 0.7389885 0.7438568 0.7820415 0.2416939 0.9310201 0.7433786 0.3025067 1.089688 0.6332758 0.3540614 1.19571 0.4684954 0.388509 0.7821387 0.7820415 0 0.9789313 0.7433786 0 1.145767 0.6332758 0 1.257244 0.4684954 0 0.7438559 0.7820416 -0.241694 0.9310212 0.7433786 -0.302507 1.089691 0.6332759 -0.3540617 1.195708 0.4684954 -0.3885094 0.6327621 0.7820415 -0.459729 0.7919723 0.7433786 -0.5754021 0.9269454 0.6332758 -0.673465 1.01713 0.4684953 -0.7389885 0.4597283 0.7820416 -0.6327628 0.5754014 0.7433787 -0.7919731 0.6734655 0.6332759 -0.9269449 0.7389885 0.4684955 -1.01713 0.2416926 0.7820416 -0.7438573 0.3025079 0.7433786 -0.9310203 0.354063 0.6332759 -1.089689 0.3885086 0.4684954 -1.195709 0 0.7820415 -0.7821375 0 0.7433786 -0.9789321 0 0.6332758 -1.145766 0 0.4684954 -1.257242 -0.2416944 0.7820415 -0.7438573 -0.3025069 0.7433786 -0.9310203 -0.354063 0.6332758 -1.089689 -0.3885071 0.4684953 -1.195709 -0.4597281 0.7820416 -0.6327628 -0.5754012 0.7433787 -0.791973 -0.6734658 0.6332759 -0.9269449 -0.7389891 0.4684955 -1.01713 -0.6327637 0.7820416 -0.4597291 -0.7919738 0.7433787 -0.575402 -0.9269439 0.6332759 -0.673465 -1.017129 0.4684955 -0.7389884 -0.743857 0.7820416 -0.241694 -0.9310203 0.7433787 -0.3025069 -1.089688 0.6332759 -0.3540616 -1.195707 0.4684955 -0.3885093 -0.7821389 0.7820416 0 -0.9789315 0.7433787 0 -1.145767 0.6332759 0 -1.25724 0.4684955 0 -0.7438563 0.7820416 0.2416937 -0.9310216 0.7433787 0.3025066 -1.089687 0.6332759 0.3540612 -1.195708 0.4684955 0.388509 -0.6327624 0.7820416 0.4597287 -0.7919727 0.7433786 0.5754017 -0.9269459 0.6332759 0.6734646 -1.017131 0.4684954 0.7389881 -0.4597287 0.7820415 0.6327624 -0.5754018 0.7433786 0.7919726 -0.673466 0.6332758 0.9269445 -0.738989 0.4684954 1.01713 -0.2416931 0.7820415 0.7438568 -0.3025084 0.7433786 0.9310198 -0.3540597 0.6332758 1.089689 -0.388509 0.4684953 1.195708 0 0.7820416 0.782137 0 0.7433787 0.9789317 0 0.6332759 1.145766 0 0.4684955 1.257241</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape11-positions-array" count="128" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape11-normals" name="qt_gauge_needles_Shape11-normals">
+ <float_array id="qt_gauge_needles_Shape11-normals-array" count="513">0.3090146 0 0.9510574 0.5877855 0 0.8090167 0.585827 0.08157209 0.8063204 0.3079845 0.08157184 0.947888 0.809018 0 0.5877839 0.8063216 0.08157146 0.5858256 0.9510561 0 0.3090182 0.9478867 0.08156961 0.3079888 0.9999999 0 0 0.9966675 0.08157077 0 0.951056 0 -0.3090183 0.9478866 0.08157291 -0.3079885 0.8090149 0 -0.5877881 0.8063192 0.0815717 -0.5858287 0.5877873 0 -0.8090155 0.5858278 0.08157175 -0.8063199 0.4539942 0 -0.8910046 0.3692774 0.1153524 -0.9221324 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.4539889 0 -0.8910074 -0.5877858 0 -0.8090165 -0.5858268 0.08157318 -0.8063205 -0.3692751 0.1153518 -0.9221333 -0.8090172 0 -0.5877849 -0.8063212 0.08157336 -0.5858258 -0.9510561 0 -0.3090185 -0.9478865 0.08157533 -0.3079879 -1 0 0 -0.9966671 0.08157463 0 -0.9510561 0 0.3090182 -0.9478869 0.08157128 0.3079877 -0.8090173 0 0.5877848 -0.8063212 0.08157006 0.5858261 -0.5877851 0 0.8090171 -0.5858262 0.08157076 0.8063213 -0.3090169 0 0.9510565 -0.3079867 0.08157202 0.9478873 0 0 1 0 0.08157241 0.9966674 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0.9994257 0 -0.03388384 0.9994257 0 -0.03388384 0.9994257 0 -0.03388384 0.9994257 0 -0.03388384 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.9994257 0 -0.03388362 -0.9994257 0 -0.03388362 -0.9994257 0 -0.03388362 -0.9994257 0 -0.03388362 0 1 0 0 1 0 0 1 0 0 1 0 0.02473392 0.9967915 0.07612287 0.1272722 0.9112453 0.3917063 0.2420868 0.9112457 0.3332046 0.04704617 0.9967916 0.06475389 0.2228243 0.6928533 0.6857868 0.42384 0.6928533 0.5833644 0.2865956 0.3739563 0.8820542 0.5451398 0.3739562 0.7503194 0 0.9999999 0 0.06475407 0.9967917 0.04704651 0.07612262 0.9967916 0.02473357 0.08004066 0.9967915 0 0.07612231 0.9967917 -0.02473375 0.06475395 0.9967916 -0.04704663 0.04704652 0.9967915 -0.06475384 0.02473356 0.9967917 -0.07612275 0 0.9967916 -0.08004019 -0.02473366 0.9967917 -0.07612284 -0.04704614 0.9967917 -0.0647537 -0.06475392 0.9967915 -0.04704658 -0.07612245 0.9967916 -0.02473355 -0.08004051 0.9967916 0 -0.07612224 0.9967915 0.02473383 -0.06475378 0.9967916 0.04704652 -0.04704639 0.9967915 0.06475385 -0.02473371 0.9967916 0.07612273 0 0.9967916 0.08004013 0.75032 0.3739573 0.5451383 0.5833653 0.6928532 0.4238386 0.3332062 0.9112449 0.2420875 0.8820528 0.3739577 0.286598 0.6857845 0.6928549 0.2228259 0.3917075 0.9112446 0.1272727 0.9274461 0.373957 0 0.7210771 0.6928547 0 0.4118634 0.9112456 0 0.8820535 0.3739559 -0.2865983 0.6857871 0.6928526 -0.2228259 0.391705 0.9112458 -0.1272725 0.7503201 0.3739541 -0.5451403 0.5833651 0.6928526 -0.42384 0.3332033 0.911246 -0.2420873 0.5451404 0.3739549 -0.7503197 0.4238403 0.6928526 -0.5833648 0.2420873 0.9112458 -0.3332038 0.286595 0.3739567 -0.8820542 0.2228257 0.6928522 -0.6857874 0.1272726 0.9112453 -0.3917059 0 0.1974039 -0.9803222 0 0.3739569 -0.9274461 0 0.6928526 -0.7210791 0 0.9112453 -0.4118641 -0.286595 0.3739565 -0.8820543 -0.2228262 0.6928522 -0.6857873 -0.1272724 0.9112453 -0.391706 -0.5451392 0.3739564 -0.7503198 -0.4238404 0.6928524 -0.5833651 -0.242087 0.9112457 -0.3332044 -0.7503204 0.3739576 -0.5451376 -0.5833663 0.692852 -0.4238392 -0.3332058 0.9112449 -0.2420879 -0.8820528 0.3739587 -0.2865968 -0.6857885 0.6928509 -0.2228264 -0.3917073 0.9112446 -0.127273 -0.9274456 0.373958 0 -0.7210809 0.6928506 0 -0.4118643 0.9112451 0 -0.8820546 0.3739555 0.2865957 -0.6857877 0.6928522 0.2228252 -0.3917072 0.9112448 0.1272731 -0.7503212 0.373954 0.5451388 -0.5833659 0.6928526 0.4238387 -0.3332043 0.9112457 0.2420873 -0.5451393 0.3739547 0.7503206 -0.4238393 0.6928527 0.5833656 -0.2420871 0.9112455 0.3332047 -0.2865969 0.3739563 0.8820538 -0.2228246 0.6928524 0.6857876 -0.1272734 0.9112453 0.3917059 0 0.3739569 0.9274461 0 0.6928527 0.721079 0 0.9112453 0.4118639</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape11-normals-array" count="171" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape11-tangents" name="qt_gauge_needles_Shape11-tangents">
+ <float_array id="qt_gauge_needles_Shape11-tangents-array" count="513">0.9510573 0 -0.3090146 0 1 0 -0.8090166 0 0.5877858 0.03749103 -0.9965842 0.07358102 0 0.9999999 0 -0.5877843 0 0.8090176 0 0.9999999 0 -0.3090186 0 0.951056 0 1 0 0 0 1 0 1 0 0.3090183 0 0.9510561 0 1 0 0.5877876 0 0.8090153 0 1 0 0.809016 0 0.5877866 0 1 0 0.9283292 0 0.371759 -1 0 0 0 1 0 1 0 0 0 -1 0 0 1 0 1 0 0 -0.8910074 0 0.4539889 0 1 0 0.8090166 0 -0.5877856 -0.05258012 -0.9932705 -0.1031944 0 1 0 0.5877847 0 -0.8090174 0 1 0 0.3090178 0 -0.9510562 0 1 0 0 0 -1 0 1 0 -0.3090176 0 -0.9510563 0 1 0 -0.5877849 0 -0.8090173 0 1 0 -0.8090172 0 -0.5877848 0 1 0 -0.9510567 0 -0.3090165 0 1 0 -1 0 0 -0.8090163 0 0.5877861 -0.4539869 0 -0.8910083 0.9510567 0 -0.3090164 -0.5877858 0 0.8090165 -0.3090167 0 0.9510566 0 0 1 0.3090167 0 0.9510567 0.5877859 0 0.8090166 0.8090175 0 0.5877845 0.9510562 0 0.3090183 1 0 0 0.9510567 0 -0.3090165 0.8090165 0 -0.587786 0.5877858 0 -0.8090166 0.3090168 0 -0.9510567 0 0 -1 -0.3090173 0 -0.9510564 -0.5877857 0 -0.8090167 -0.8090174 0 -0.5877848 -0.951057 0 -0.3090158 -1 0 0 -0.9994258 0 0.03388385 0.1564322 0 -0.9876887 0.9999999 0 0 0 0 1 0.9999999 0 0 0.1564322 0 -0.9876887 -0.9994258 0 0.03388385 0 0 1 0 -1 0 -0.03388384 0 -0.9994258 0 1 0 0.03388384 0 0.9994258 -0.9999999 0 0 -0.156433 0 -0.9876885 0.9994258 0 0.03388363 0 0 1 0 1 0 0.03388363 0 -0.9994258 0 -1 0 -0.03388362 0 0.9994258 0.9994258 0 0.03388363 -0.156433 0 -0.9876885 -0.9999999 0 0 0 0 1 0.4525688 -0.07906114 0.8882178 0.9510571 0 -0.3090154 -0.4145577 0.4076395 -0.8136166 -0.8090166 0 0.5877857 0.9510551 0 -0.3090211 -0.3165687 0.7167756 -0.6213027 0.9510567 0 -0.3090163 -0.171588 0.9258238 -0.3367608 -0.8090175 0 0.5877845 -0.7048895 0.07906107 -0.7048973 -0.8882203 0.07906084 -0.4525639 -0.9845958 0.0790614 -0.1559499 -0.9845953 0.07906064 0.1559538 -0.8882184 0.07906109 0.4525675 -0.7048934 0.07906099 0.7048933 -0.4525686 0.07906088 0.8882179 -0.155945 0.07906096 0.9845966 0.1559422 0.079061 0.9845971 0.452572 0.0790607 0.8882162 0.7048894 0.07906102 0.7048972 0.8882195 0.07906065 0.4525656 0.9845957 0.0790612 0.1559504 0.9845952 0.07906058 -0.1559533 0.8882184 0.07906089 -0.4525675 0.7048934 0.07906091 -0.7048934 0.4525685 0.07906094 -0.888218 0.1559426 0.07906093 -0.984597 -0.5877851 0 0.8090171 -0.5877843 0 0.8090176 -0.6456869 0.4076409 -0.6456915 -0.3090192 0 0.9510558 -0.3090139 0 0.9510576 -0.8136168 0.4076418 -0.4145551 0 0 0.9999999 0 0 1 -0.9019009 0.40764 -0.1428436 0.3090172 0 0.9510564 0.3090194 0 0.9510558 -0.901902 0.4076388 0.1428405 0.5877873 0 0.8090155 0.5877864 0 0.8090161 -0.8136142 0.4076389 0.4145628 0.809018 0 0.587784 0.8090175 0 0.5877846 -0.6456895 0.4076392 0.6456898 0.9510557 0 0.3090194 0.9510588 0 0.3090098 -0.4145607 0.4076399 0.8136148 -0.03125012 0.9798434 0.1973074 1 0 0 1 0 0 -0.1428448 0.4076404 0.9019006 0.9510563 0 -0.3090178 0.9510602 0 -0.3090056 0.1428457 0.4076402 0.9019006 0.8090163 0 -0.5877861 0.809017 0 -0.5877853 0.4145601 0.4076396 0.8136153 0.5877846 0 -0.8090175 0.5877841 0 -0.8090178 0.6456866 0.4076408 0.6456916 0.309016 0 -0.9510568 0.3090172 0 -0.9510565 0.8136162 0.4076416 0.4145564 0 0 -1 0 0 -0.9999999 0.9019006 0.4076407 0.1428438 -0.3090166 0 -0.9510566 -0.3090148 0 -0.9510573 0.901901 0.4076411 -0.14284 -0.5877857 0 -0.8090166 -0.5877855 0 -0.8090168 0.813614 0.4076398 -0.4145625 -0.8090187 0 -0.5877829 -0.8090179 0 -0.5877839 0.6456895 0.4076397 -0.6456894 -0.9510573 0 -0.3090146 -0.9510552 0 -0.3090211 0.4145604 0.4076402 -0.8136148 -1 0 0 -1 0 0 0.1428446 0.4076402 -0.9019006</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape11-tangents-array" count="171" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape11-binormals" name="qt_gauge_needles_Shape11-binormals">
+ <float_array id="qt_gauge_needles_Shape11-binormals-array" count="513">0 1 0 -0.8090168 0 0.5877856 0.04794693 -0.9966675 0.06599318 0.9506524 0.01287548 -0.3099908 -0.5877839 0 0.809018 0.06599276 -0.9966676 0.04794644 -0.3090182 0 0.9510562 0.07757728 -0.9966677 0.02520653 0 0 1 0.08157077 -0.9966676 0 0.3090184 0 0.9510561 0.07758041 -0.9966674 -0.02520753 0.5877881 0 0.8090149 0.06599277 -0.9966676 -0.04794684 0.8090155 0 0.5877873 0.04794678 -0.9966675 -0.06599285 0.8910047 0 0.4539943 0.0428833 -0.9933246 -0.107085 0 1 0 1 0 0 0 -1 0 -1 0 0 1 0 0 0 -1 0 0 1 0 0.8090166 0 -0.5877859 -0.04794755 -0.9966674 -0.06599407 -0.9278315 0.01037876 0.3728553 0.5877849 0 -0.8090172 -0.06599427 -0.9966674 -0.04794758 0.3090185 0 -0.9510561 -0.07758273 -0.9966673 -0.02520824 0 0 -1 -0.08157464 -0.9966673 0 -0.3090182 0 -0.9510562 -0.07757889 -0.9966676 0.02520696 -0.5877848 0 -0.8090173 -0.0659916 -0.9966676 0.04794566 -0.8090171 0 -0.5877851 -0.04794605 -0.9966676 0.06599215 -0.9510565 0 -0.3090169 -0.0252071 -0.9966676 0.07757962 -1 0 0 0 -0.9966675 0.08157242 -0.5877861 0 -0.8090164 0.8910084 0 -0.453987 0.3090164 0 0.9510568 -0.8090166 0 -0.5877858 -0.9510566 0 -0.3090167 -1 0 0 -0.9510567 0 0.3090167 -0.8090165 0 0.5877858 -0.5877846 0 0.8090175 -0.3090183 0 0.9510562 0 0 1 0.3090165 0 0.9510568 0.587786 0 0.8090165 0.8090166 0 0.5877858 0.9510566 0 0.3090168 1 0 0 0.9510565 0 -0.3090173 0.8090168 0 -0.5877857 0.5877848 0 -0.8090174 0.3090158 0 -0.9510569 0 0 -1 -0.03388385 0 -0.9994258 0.9876888 0 0.1564322 0 0 1 -1 0 0 0 0 -1 -0.9876887 0 -0.1564322 0.03388385 0 0.9994258 1 0 0 -0.03388385 0 -0.9994258 0 1 0 0.03388385 0 0.9994258 0 -1 0 0 0 -1 0.9876887 0 -0.1564331 -0.03388363 0 0.9994258 -1 0 0 0.03388363 0 -0.9994258 0 -1 0 -0.03388363 0 0.9994258 0 1 0 0.03388363 0 -0.9994258 -0.9876887 0 0.1564331 0 0 1 1 0 0 0.8913864 0.01248173 -0.4530723 -0.2815889 0.411864 -0.8666463 -0.877232 0.05883333 0.476448 0.5858999 -0.08004005 0.8064211 -0.2141107 0.7210786 -0.6589403 -0.848613 0.07865805 0.5231339 -0.1155599 0.9274464 -0.3556533 -0.8205974 0.05483595 0.5688699 0.5877845 0 0.8090176 -0.7063553 0.01248238 0.7077475 -0.4530674 0.01248149 0.891389 -0.1554495 0.01248211 0.987765 0.1574089 0.01248117 0.9874547 0.4548351 0.01248215 0.8904883 0.7077512 0.01248178 0.7063514 0.8913866 0.01248197 0.453072 0.9877658 0.0124819 0.1554447 0.9874565 0.01248193 -0.1573974 0.8904859 0.01248143 -0.4548395 0.7063553 0.01248222 -0.7077475 0.4530691 0.01248159 -0.891388 0.1554501 0.01248239 -0.9877649 -0.1574085 0.0124813 -0.9874547 -0.4548351 0.01248213 -0.8904883 -0.7077513 0.01248187 -0.7063513 -0.8913866 0.01248182 -0.4530719 -0.9877661 0.01248172 -0.1554423 0.3025367 -0.9274459 0.2198081 0.5605304 -0.7210786 0.4072484 -0.6870678 0.05883569 0.7242074 0.3556542 -0.9274458 0.1155615 0.6589461 -0.721077 0.2140985 -0.4296428 0.05883317 0.9010804 0.373957 -0.927446 0 0.6928548 -0.7210771 0 -0.1301661 0.05883102 0.9897454 0.3556542 -0.9274465 -0.1155555 0.6589409 -0.7210793 -0.2141066 0.182044 0.05883599 0.9815286 0.3025322 -0.9274472 -0.219809 0.5605285 -0.7210792 -0.40725 0.476453 0.05883198 0.8772295 0.2197998 -0.9274469 -0.3025398 0.407247 -0.7210792 -0.5605307 0.7242091 0.05883294 0.6870662 0.1155695 -0.9274462 -0.3556505 0.2140929 -0.7210796 -0.6589451 0.9010778 0.05883498 0.429648 0.9995116 0.03063503 0.006169685 0 -0.9274461 -0.3739569 0 -0.7210792 -0.6928527 0.9897451 0.05883301 0.1301665 -0.115565 -0.9274462 -0.3556518 -0.2140863 -0.7210796 -0.6589471 0.9815279 0.05883351 -0.1820488 -0.2198085 -0.9274464 -0.3025353 -0.4072479 -0.7210795 -0.5605297 0.8772308 0.05883248 -0.4764504 -0.302537 -0.9274459 -0.2198084 -0.5605296 -0.7210799 -0.4072475 0.6870681 0.05883526 -0.724207 -0.3556571 -0.9274454 -0.1155559 -0.6589404 -0.7210808 -0.2141028 0.4296442 0.05883338 -0.9010797 -0.373958 -0.9274457 0 -0.6928508 -0.721081 0 0.1301658 0.05883208 -0.9897453 -0.3556523 -0.9274467 0.1155603 -0.6589424 -0.7210797 0.2141006 -0.1820439 0.05883625 -0.9815286 -0.3025327 -0.9274473 0.2198082 -0.5605286 -0.7210791 0.4072499 -0.4764527 0.05883165 -0.8772296 -0.2197995 -0.927447 0.3025398 -0.4072472 -0.7210792 0.5605307 -0.7242091 0.05883368 -0.6870661 -0.115552 -0.9274464 0.3556558 -0.2141103 -0.7210794 0.6589395 -0.9010778 0.05883419 -0.429648 0 -0.9274461 0.3739569 0 -0.7210791 0.6928528 -0.9897453 0.05883256 -0.1301665</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape11-binormals-array" count="171" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape11-map1" name="qt_gauge_needles_Shape11-map1">
+ <float_array id="qt_gauge_needles_Shape11-map1-array" count="340">0.6486027 0.1079661 0.626409 0.0644085 0.5918415 0.02984102 0.5482839 0.007647336 0.5 0 0.4517161 0.00764735 0.4081585 0.02984105 0.3735911 0.06440853 0.3513974 0.1079661 0.34375 0.15625 0.3513974 0.2045339 0.3735911 0.2480915 0.4081585 0.2826589 0.4517161 0.3048526 0.5 0.3125 0.5482839 0.3048526 0.5918415 0.2826589 0.6264089 0.2480915 0.6486026 0.2045339 0.65625 0.15625 0.375 0.3125 0.3875 0.3125 0.4 0.3125 0.4125 0.3125 0.425 0.3125 0.4374999 0.3125 0.4499999 0.3125 0.4624999 0.3125 0.4749999 0.3125 0.4874999 0.3125 0.4999999 0.3125 0.5124999 0.3125 0.5249999 0.3125 0.5374998 0.3125 0.5499998 0.3125 0.5624998 0.3125 0.5749998 0.3125 0.5874998 0.3125 0.5999998 0.3125 0.6124998 0.3125 0.6249998 0.3125 0.375 0.6884398 0.3875 0.6884398 0.4 0.6884398 0.4125 0.6884398 0.425 0.6884398 0.4374999 0.6884398 0.4499999 0.6884398 0.4624999 0.6884398 0.4749999 0.6884398 0.4874999 0.6884398 0.4999999 0.6884398 0.5124999 0.6884398 0.5249999 0.6884398 0.5374998 0.6884398 0.5499998 0.6884398 0.5624998 0.6884398 0.5749998 0.6884398 0.5874998 0.6884398 0.5999998 0.6884398 0.6124998 0.6884398 0.6249998 0.6884398 0.5 0.15 0.4749999 0.3125 0.4874999 0.3125 0.4874999 0.6884398 0.4749999 0.6884398 0.4999999 0.3125 0.4999999 0.6884398 0.5762653 0.8966807 0.5554099 0.9175359 0.5291306 0.9309258 0.5 0.9355396 0.4708693 0.9309258 0.4445902 0.9175359 0.4237349 0.8966806 0.4103449 0.8704016 0.4057311 0.8412707 0.4103449 0.81214 0.4237347 0.7858608 0.4445901 0.7650056 0.4708693 0.7516156 0.5 0.7470018 0.5291307 0.7516156 0.55541 0.7650055 0.5762652 0.7858608 0.5896552 0.81214 0.5942689 0.8412707 0.5896551 0.8704016 0.5 0.8375 0.6264089 0.9355915 0.6486026 0.8920339 0.5918415 0.9701589 0.5482839 0.9923526 0.5 1 0.4517161 0.9923526 0.4081585 0.9701589 0.3735911 0.9355915 0.3513974 0.8920339 0.34375 0.84375 0.3513974 0.7954661 0.3735911 0.7519085 0.4081585 0.7173411 0.4517161 0.6951473 0.5 0.6874999 0.5482839 0.6951473 0.5918415 0.717341 0.626409 0.7519085 0.6486027 0.7954661 0.65625 0.84375 0.6468484 0.8914639 0.6486026 0.8920339 0.619415 0.8814268 0.6015805 0.9164289 0.6264089 0.9355915 0.6249167 0.9345073 0.5738025 0.9442068 0.5918415 0.9701589 0.5907573 0.9686667 0.5388002 0.9620414 0.5482839 0.9923526 0.5477139 0.9905984 0.5 0.9681867 0.5 1 0.5 0.9981555 0.4611997 0.9620414 0.4517161 0.9923526 0.4522861 0.9905984 0.4261975 0.9442068 0.4081585 0.9701589 0.4092427 0.9686667 0.3984195 0.9164289 0.3735911 0.9355915 0.3750833 0.9345073 0.380585 0.8814267 0.3513974 0.8920339 0.3531516 0.8914639 0.3744397 0.8426264 0.34375 0.84375 0.3455944 0.84375 0.380585 0.803826 0.3513974 0.7954661 0.3531516 0.7960361 0.3984195 0.7688238 0.3735911 0.7519085 0.3750833 0.7529927 0.4261974 0.7410459 0.4081585 0.7173411 0.4092427 0.7188333 0.4611997 0.7232113 0.4517161 0.6951473 0.452286 0.6969016 0.5 0.717066 0.5 0.6874999 0.5 0.6893444 0.5388003 0.7232113 0.5482839 0.6951473 0.547714 0.6969015 0.5738026 0.7410458 0.5918415 0.717341 0.5907574 0.7188332 0.6015806 0.7688238 0.626409 0.7519085 0.6249168 0.7529926 0.6194151 0.803826 0.6486027 0.7954661 0.6468484 0.7960361 0.6255603 0.8426264 0.65625 0.84375 0.6544055 0.84375</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape11-map1-array" count="170" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape11-textangents">
+ <float_array id="qt_gauge_needles_Shape11-textangents-array" count="1632">0.9510573 0 -0.3090145 0.8090168 0 -0.5877855 0.8088025 0.004292438 -0.5880646 0.9506524 0.01287548 -0.3099908 0.8090168 0 -0.5877855 0.5877839 0 -0.809018 0.5874947 0.004291991 -0.8092165 0.8088025 0.004292438 -0.5880646 0.5877839 0 -0.809018 0.3090182 0 -0.9510561 0.3086817 0.004292177 -0.9511558 0.5874947 0.004291991 -0.8092165 0.3090182 0 -0.9510561 0 0 -0.9999999 -3.50926e-4 0.004291974 -0.9999906 0.3086817 0.004292177 -0.9511558 0 0 -0.9999999 -0.3090183 0 -0.951056 -0.3093495 0.00429239 -0.9509385 -3.50926e-4 0.004291974 -0.9999906 -0.3090183 0 -0.951056 -0.587788 0 -0.8090149 -0.5880663 0.004292145 -0.8088012 -0.3093495 0.00429239 -0.9509385 -0.587788 0 -0.8090149 -0.8090155 0 -0.5877873 -0.8092149 0.004292135 -0.5874969 -0.5880663 0.004292145 -0.8088012 -0.8090155 0 -0.5877873 -0.8910046 0 -0.4539942 -0.9278305 -0.01037905 -0.3728576 -0.8092149 0.004292135 -0.5874969 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.8910073 0 0.4539889 -0.8090165 0 0.5877858 -0.8088026 0.004292486 0.5880644 -0.9278314 0.01037869 0.3728552 -0.8090165 0 0.5877858 -0.5877849 0 0.8090172 -0.587495 0.004292034 0.8092163 -0.8088026 0.004292486 0.5880644 -0.5877849 0 0.8090172 -0.3090185 0 0.9510559 -0.3086808 0.004292436 0.9511558 -0.587495 0.004292034 0.8092163 -0.3090185 0 0.9510559 0 0 0.9999999 3.53608e-4 0.004292413 0.9999906 -0.3086808 0.004292436 0.9511558 0 0 0.9999999 0.3090182 0 0.9510561 0.3093487 0.004292145 0.9509389 3.53608e-4 0.004292413 0.9999906 0.3090182 0 0.9510561 0.5877848 0 0.8090173 0.5880637 0.004292045 0.8088033 0.3093487 0.004292145 0.9509389 0.5877848 0 0.8090173 0.8090171 0 0.5877851 0.8092161 0.004292042 0.5874951 0.5880637 0.004292045 0.8088033 0.8090171 0 0.5877851 0.9510565 0 0.3090169 0.9511563 0.004292242 0.3086795 0.8092161 0.004292042 0.5874951 0.9510565 0 0.3090169 0.9999999 0 0 0.9999906 0.00429216 -3.50732e-4 0.9511563 0.004292242 0.3086795 0.9999999 0 0 0.9510573 0 -0.3090145 0.9513037 -0.01287567 -0.3079863 0.9999906 0.00429216 -3.50732e-4 0.03310383 0 0.9994519 0.03847758 0 0.9992595 0 0 1 0.02427028 0 0.9997054 0.03310383 0 0.9994519 0 0 1 0.01283397 0 0.9999176 0.02427028 0 0.9997054 0 0 1 0 0 1 0.01283397 0 0.9999176 0 0 1 -0.01283444 0 0.9999176 0 0 1 0 0 1 -0.02426601 0 0.9997056 -0.01283444 0 0.9999176 0 0 1 -0.03310359 0 0.9994519 -0.02426601 0 0.9997056 0 0 1 -0.03848095 0 0.9992594 -0.03310359 0 0.9994519 0 0 1 -0.03996982 0 0.9992008 -0.03848095 0 0.9992594 0 0 1 -0.03756514 0 0.9992942 -0.03996982 0 0.9992008 0 0 1 -0.03161851 0 0.9995 -0.03756514 0 0.9992942 0 0 1 -0.02278628 0 0.9997403 -0.03161851 0 0.9995 0 0 1 -0.01191914 0 0.999929 -0.02278628 0 0.9997403 0 0 1 0 0 1 -0.01191914 0 0.999929 0 0 1 0.01191931 0 0.999929 0 0 1 0 0 1 0.02278603 0 0.9997404 0.01191931 0 0.999929 0 0 1 0.03162093 0 0.9994999 0.02278603 0 0.9997404 0 0 1 0.03756437 0 0.9992942 0.03162093 0 0.9994999 0 0 1 0.03996911 0 0.9992009 0.03756437 0 0.9992942 0 0 1 0.03847758 0 0.9992595 0.03996911 0 0.9992009 0 0 1 -0.9876887 0 -0.1564322 0.001661488 0 -0.9999986 0.9999999 0 0 0.01528308 0 0.9998832 0.7614832 0 -0.6481846 -0.03388384 0 -0.9994257 -0.7082806 0 0.7059309 0 0 0.9999999 0 -0.9999999 0 -0.0338811 0.01271698 -0.9993449 0 0.9999999 0 0.03388111 -0.0127158 0.999345 -0.7614835 0 -0.6481842 0.03388362 0 -0.9994257 0.7082806 0 0.7059309 0 0 0.9999999 0 0.9999999 0 0.03388089 -0.01271933 -0.9993449 0 -0.9999999 0 -0.03388089 0.01271815 0.9993449 0.9876885 0 -0.156433 -0.00166151 0 -0.9999986 -0.9999999 0 0 -0.01528296 0 0.9998832 -0.07579469 -0.07405718 0.9943695 -0.1249866 -0.3770357 0.9177268 -0.1613755 -0.3008206 0.9399281 -0.09821769 -0.05989539 0.9933608 -0.1249866 -0.3770357 0.9177268 -0.1996738 -0.6561216 0.72776 -0.2559748 -0.5261905 0.8109258 -0.1613755 -0.3008206 0.9399281 -0.1728092 0.7204052 -0.6716796 -0.201794 0.9235831 -0.3259964 -0.3174974 0.9204257 -0.2280609 -0.3946395 0.7209916 -0.5695881 0.07970352 -0.9267899 0.3670253 0.01272969 -0.9965817 0.08162615 0.01029834 -0.9955906 0.0932376 0.1646337 -0.9253263 0.3415654 -0.07579469 -0.07405718 0.9943695 -0.09821769 -0.05989539 0.9933608 0 0 1 -0.09821769 -0.05989539 0.9933608 -0.08940399 -0.04116086 0.9951445 0 0 1 -0.08940399 -0.04116086 0.9951445 -0.0551889 -0.02055547 0.9982643 0 0 1 -0.0551889 -0.02055547 0.9982643 -0.006486457 5.20628e-4 0.9999788 0 0 1 -0.006486457 5.20628e-4 0.9999788 0.04510001 0.02133829 0.9987546 0 0 1 0.04510001 0.02133829 0.9987546 0.08804063 0.04125512 0.9952622 0 0 1 0.08804063 0.04125512 0.9952622 0.110914 0.05921185 0.9920646 0 0 1 0.110914 0.05921185 0.9920646 0.1043381 0.07315622 0.9918478 0 0 1 0.1043381 0.07315622 0.9918478 0.06768746 0.07985664 0.9945056 0 0 1 0.06768746 0.07985664 0.9945056 0.0164337 0.07654124 0.9969309 0 0 1 0.0164337 0.07654124 0.9969309 -0.024497 0.06365465 0.9976713 0 0 1 -0.024497 0.06365465 0.9976713 -0.03953512 0.04454593 0.9982247 0 0 1 -0.03953512 0.04454593 0.9982247 -0.02950482 0.02254284 0.9993104 0 0 1 -0.02950482 0.02254284 0.9993104 -0.004197716 -3.37109e-4 0.9999912 0 0 1 -0.004197716 -3.37109e-4 0.9999912 0.02443533 -0.02293345 0.9994383 0 0 1 0.02443533 -0.02293345 0.9994383 0.04434059 -0.04422484 0.9980371 0 0 1 0.04434059 -0.04422484 0.9980371 0.04422964 -0.06268329 0.997053 0 0 1 0.04422964 -0.06268329 0.997053 0.01743774 -0.07570426 0.9969778 0 0 1 0.01743774 -0.07570426 0.9969778 -0.0297803 -0.08000463 0.9963495 0 0 1 -0.0297803 -0.08000463 0.9963495 -0.07579469 -0.07405718 0.9943695 0 0 1 0.1646337 -0.9253263 0.3415654 0.01029834 -0.9955906 0.0932376 0.003081314 -0.9910104 0.1337491 0.2324216 -0.9212039 0.3120316 -0.3946395 0.7209916 -0.5695881 -0.3174974 0.9204257 -0.2280609 -0.4028648 0.9124669 -0.07144265 -0.577589 0.7207661 -0.3832584 -0.09821769 -0.05989539 0.9933608 -0.1613755 -0.3008206 0.9399281 -0.1428973 -0.2049872 0.9682772 -0.08940399 -0.04116086 0.9951445 -0.1613755 -0.3008206 0.9399281 -0.2559748 -0.5261905 0.8109258 -0.2279553 -0.3611925 0.9041992 -0.1428973 -0.2049872 0.9682772 0.2324216 -0.9212039 0.3120316 0.003081314 -0.9910104 0.1337491 -0.02684401 -0.9427879 0.3323106 0.2639264 -0.896071 0.3569309 -0.577589 0.7207661 -0.3832584 -0.4028648 0.9124669 -0.07144265 -0.4462874 0.8581443 0.2538027 -0.7016631 0.7107219 -0.05043174 -0.08940399 -0.04116086 0.9951445 -0.1428973 -0.2049872 0.9682772 -0.08136017 -0.1034802 0.9912982 -0.0551889 -0.02055547 0.9982643 -0.1428973 -0.2049872 0.9682772 -0.2279553 -0.3611925 0.9041992 -0.1331713 -0.181536 0.9743254 -0.08136017 -0.1034802 0.9912982 0.2639264 -0.896071 0.3569309 -0.02684401 -0.9427879 0.3323106 -0.04480856 0.5474871 0.8356136 0.2005081 -0.4972768 0.8441043 -0.7016631 0.7107219 -0.05043174 -0.4462874 0.8581443 0.2538027 0.2494181 -0.6185779 0.7450852 -0.4728143 0.4920727 0.7309659 -0.0551889 -0.02055547 0.9982643 -0.08136017 -0.1034802 0.9912982 0.003118677 -0.001410846 0.9999941 -0.006486457 5.20628e-4 0.9999788 -0.08136017 -0.1034802 0.9912982 -0.1331713 -0.181536 0.9743254 -0.003792798 0.003945927 0.999985 0.003118677 -0.001410846 0.9999941 0.2005081 -0.4972768 0.8441043 -0.04480856 0.5474871 0.8356136 0.005170795 0.9626031 0.2708662 -0.2373313 0.8781417 0.4153806 -0.4728143 0.4920727 0.7309659 0.2494181 -0.6185779 0.7450852 0.4055567 -0.9122359 0.05787434 0.7269722 -0.6667278 0.1642721 -0.006486457 5.20628e-4 0.9999788 0.003118677 -0.001410846 0.9999941 0.08825458 0.1004773 0.9910173 0.04510001 0.02133829 0.9987546 0.003118677 -0.001410846 0.9999941 -0.003792798 0.003945927 0.999985 0.1228404 0.1915797 0.9737594 0.08825458 0.1004773 0.9910173 -0.2373313 0.8781417 0.4153806 0.005170795 0.9626031 0.2708662 0.00219126 0.9900258 0.1408687 -0.2382382 0.9221762 0.3046861 0.7269722 -0.6667278 0.1642721 0.4055567 -0.9122359 0.05787434 0.3220641 -0.9269261 -0.1925682 0.6553591 -0.7097892 -0.2582708 0.04510001 0.02133829 0.9987546 0.08825458 0.1004773 0.9910173 0.1515979 0.2016408 0.9676564 0.08804063 0.04125512 0.9952622 0.08825458 0.1004773 0.9910173 0.1228404 0.1915797 0.9737594 0.2089174 0.3762744 0.9026467 0.1515979 0.2016408 0.9676564 -0.2382382 0.9221762 0.3046861 0.00219126 0.9900258 0.1408687 0.006392839 0.9944256 0.1052463 -0.1819847 0.9264456 0.3295151 0.6553591 -0.7097892 -0.2582708 0.3220641 -0.9269261 -0.1925682 0.2084984 -0.9273566 -0.3107057 0.501892 -0.7158107 -0.4855096 0.08804063 0.04125512 0.9952622 0.1515979 0.2016408 0.9676564 0.1723354 0.2975743 0.9390154 0.110914 0.05921185 0.9920646 0.1515979 0.2016408 0.9676564 0.2089174 0.3762744 0.9026467 0.2222416 0.5448331 0.8085576 0.1723354 0.2975743 0.9390154 -0.1819847 0.9264456 0.3295151 0.006392839 0.9944256 0.1052463 0.003546395 0.9920843 0.1255231 -0.1032468 0.9273685 0.3596214 0.501892 -0.7158107 -0.4855096 0.2084984 -0.9273566 -0.3107057 0.07460527 -0.9265904 -0.3685977 0.2986084 -0.7181686 -0.6285433 0.110914 0.05921185 0.9920646 0.1723354 0.2975743 0.9390154 0.1374118 0.3749103 0.9168206 0.1043381 0.07315622 0.9918478 0.1723354 0.2975743 0.9390154 0.2222416 0.5448331 0.8085576 0.1491107 0.6709731 0.7263342 0.1374118 0.3749103 0.9168206 -0.1032468 0.9273685 0.3596214 0.003546395 0.9920843 0.1255231 0.01238891 0.9802469 0.1973888 -0.01277927 0.9273703 0.3739264 0.2986084 -0.7181686 -0.6285433 0.07460527 -0.9265904 -0.3685977 -0.06673249 -0.9253787 -0.3731233 0.06608348 -0.719503 -0.6913381 0.1043381 0.07315622 0.9918478 0.1374118 0.3749103 0.9168206 0.05502769 0.41124 0.9098644 0.06768746 0.07985664 0.9945056 0.1374118 0.3749103 0.9168206 0.1491107 0.6709731 0.7263342 0.01249839 0.7210228 0.6927986 0.05502769 0.41124 0.9098644 -0.01277927 0.9273703 0.3739264 0.01238891 0.9802469 0.1973888 0.0185395 0.9929835 0.1167903 0.0797153 0.9267904 0.3670219 0.06608348 -0.719503 -0.6913381 -0.06673249 -0.9253787 -0.3731233 -0.2017825 -0.923584 -0.3260008 -0.1727972 -0.7204058 -0.6716819 0.06768746 0.07985664 0.9945056 0.05502769 0.41124 0.9098644 -0.03750614 0.3902137 0.9199601 0.0164337 0.07654124 0.9969309 0.05502769 0.41124 0.9098644 0.01249839 0.7210228 0.6927986 -0.1265523 0.6769626 0.7250559 -0.03750614 0.3902137 0.9199601 0.0797153 0.9267904 0.3670219 0.0185395 0.9929835 0.1167903 0.01029903 0.9955905 0.09323843 0.164638 0.9253265 0.3415626 -0.1727972 -0.7204058 -0.6716819 -0.2017825 -0.923584 -0.3260008 -0.3174977 -0.9204257 -0.2280609 -0.3946345 -0.7209923 -0.5695905 0.0164337 0.07654124 0.9969309 -0.03750614 0.3902137 0.9199601 -0.0962965 0.3191584 0.9427963 -0.024497 0.06365465 0.9976713 -0.03750614 0.3902137 0.9199601 -0.1265523 0.6769626 0.7250559 -0.2053876 0.5537784 0.8069358 -0.0962965 0.3191584 0.9427963 0.164638 0.9253265 0.3415626 0.01029903 0.9955905 0.09323843 0.003084242 0.9910105 0.1337482 0.2324221 0.9212038 0.3120315 -0.3946345 -0.7209923 -0.5695905 -0.3174977 -0.9204257 -0.2280609 -0.4028641 -0.9124671 -0.07144412 -0.5775879 -0.7207673 -0.3832577 -0.024497 0.06365465 0.9976713 -0.0962965 0.3191584 0.9427963 -0.1020062 0.2204131 0.9700581 -0.03953512 0.04454593 0.9982247 -0.0962965 0.3191584 0.9427963 -0.2053876 0.5537784 0.8069358 -0.1990632 0.3839539 0.9016392 -0.1020062 0.2204131 0.9700581 0.2324221 0.9212038 0.3120315 0.003084242 0.9910105 0.1337482 -0.02683828 0.9427878 0.3323113 0.2639276 0.8960705 0.3569311 -0.5775879 -0.7207673 -0.3832577 -0.4028641 -0.9124671 -0.07144412 -0.4462882 -0.8581434 0.2538043 -0.7016599 -0.7107252 -0.05042631 -0.03953512 0.04454593 0.9982247 -0.1020062 0.2204131 0.9700581 -0.06201187 0.1118659 0.9917864 -0.02950482 0.02254284 0.9993104 -0.1020062 0.2204131 0.9700581 -0.1990632 0.3839539 0.9016392 -0.1213458 0.1930282 0.9736608 -0.06201187 0.1118659 0.9917864 0.2639276 0.8960705 0.3569311 -0.02683828 0.9427878 0.3323113 -0.04480854 -0.5474876 0.8356132 0.200508 0.4972751 0.8441052 -0.7016599 -0.7107252 -0.05042631 -0.4462882 -0.8581434 0.2538043 0.2494188 0.6185777 0.7450851 -0.4728056 -0.4920698 0.7309734 -0.02950482 0.02254284 0.9993104 -0.06201187 0.1118659 0.9917864 0.003107934 0.001404956 0.999994 -0.004197716 -3.37109e-4 0.9999912 -0.06201187 0.1118659 0.9917864 -0.1213458 0.1930282 0.9736608 -0.006036624 -0.006282098 0.999962 0.003107934 0.001404956 0.999994 0.200508 0.4972751 0.8441052 -0.04480854 -0.5474876 0.8356132 0.005173298 -0.9626022 0.2708692 -0.2373311 -0.878141 0.415382 -0.4728056 -0.4920698 0.7309734 0.2494188 0.6185777 0.7450851 0.4055561 0.9122359 0.05787602 0.7269717 0.6667279 0.1642738 -0.004197716 -3.37109e-4 0.9999912 0.003107934 0.001404956 0.999994 0.06887267 -0.1088996 0.9916639 0.02443533 -0.02293345 0.9994383 0.003107934 0.001404956 0.999994 -0.006036624 -0.006282098 0.999962 0.1060445 -0.2077701 0.9724125 0.06887267 -0.1088996 0.9916639 -0.2373311 -0.878141 0.415382 0.005173298 -0.9626022 0.2708692 0.002192083 -0.9900259 0.1408678 -0.2382365 -0.9221759 0.3046884 0.7269717 0.6667279 0.1642738 0.4055561 0.9122359 0.05787602 0.3220638 0.9269261 -0.1925684 0.6553602 0.7097889 -0.2582686 0.02443533 -0.02293345 0.9994383 0.06887267 -0.1088996 0.9916639 0.1105685 -0.2172235 0.9698395 0.04434059 -0.04422484 0.9980371 0.06887267 -0.1088996 0.9916639 0.1060445 -0.2077701 0.9724125 0.1737979 -0.4032619 0.8984286 0.1105685 -0.2172235 0.9698395 -0.2382365 -0.9221759 0.3046884 0.002192083 -0.9900259 0.1408678 0.0063976 -0.9944255 0.1052482 -0.1819845 -0.9264457 0.3295148 0.6553602 0.7097889 -0.2582686 0.3220638 0.9269261 -0.1925684 0.2085032 0.9273567 -0.310702 0.5018921 0.7158106 -0.4855096 0.04434059 -0.04422484 0.9980371 0.1105685 -0.2172235 0.9698395 0.1068472 -0.3162933 0.9426252 0.04422964 -0.06268329 0.997053 0.1105685 -0.2172235 0.9698395 0.1737979 -0.4032619 0.8984286 0.1645079 -0.5744775 0.8018183 0.1068472 -0.3162933 0.9426252 -0.1819845 -0.9264457 0.3295148 0.0063976 -0.9944255 0.1052482 0.01017196 -0.9959782 0.08901562 -0.1032351 -0.9273685 0.3596248 0.5018921 0.7158106 -0.4855096 0.2085032 0.9273567 -0.310702 0.0746166 0.926591 -0.3685939 0.2986199 0.7181677 -0.6285391 0.04422964 -0.06268329 0.997053 0.1068472 -0.3162933 0.9426252 0.04937432 -0.3886073 0.9200796 0.01743774 -0.07570426 0.9969778 0.1068472 -0.3162933 0.9426252 0.1645079 -0.5744775 0.8018183 0.07062258 -0.6901529 0.7202093 0.04937432 -0.3886073 0.9200796 -0.1032351 -0.9273685 0.3596248 0.01017196 -0.9959782 0.08901562 0.01245931 -0.99659 0.0815661 -0.0127728 -0.9273705 0.3739264 0.2986199 0.7181677 -0.6285391 0.0746166 0.926591 -0.3685939 -0.06673894 0.9253783 -0.373123 0.06608979 0.7195026 -0.6913379 0.01743774 -0.07570426 0.9969778 0.04937432 -0.3886073 0.9200796 -0.04253528 -0.4114911 0.9104207 -0.0297803 -0.08000463 0.9963495 0.04937432 -0.3886073 0.9200796 0.07062258 -0.6901529 0.7202093 -0.07289217 -0.7191608 0.6910096 -0.04253528 -0.4114911 0.9104207 0.01272969 -0.9965817 0.08162615 0.07970352 -0.9267899 0.3670253 -0.0127728 -0.9273705 0.3739264 0.01245931 -0.99659 0.0815661 -0.201794 0.9235831 -0.3259964 -0.1728092 0.7204052 -0.6716796 0.06608979 0.7195026 -0.6913379 -0.06673894 0.9253783 -0.373123 -0.1996738 -0.6561216 0.72776 -0.1249866 -0.3770357 0.9177268 -0.04253528 -0.4114911 0.9104207 -0.07289217 -0.7191608 0.6910096 -0.1249866 -0.3770357 0.9177268 -0.07579469 -0.07405718 0.9943695 -0.0297803 -0.08000463 0.9963495 -0.04253528 -0.4114911 0.9104207</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape11-textangents-array" count="544" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape11-texbinormals">
+ <float_array id="qt_gauge_needles_Shape11-texbinormals-array" count="1632">0 1 0 0 1 0 -0.05143075 0.9966583 -0.0634611 -0.03749103 0.9965844 -0.07358102 0 1 0 0 1 0 -0.06852334 0.9966583 -0.04446208 -0.05143075 0.9966583 -0.0634611 0 1 0 0 1 0 -0.07890736 0.9966585 -0.02111055 -0.06852334 0.9966583 -0.04446208 0 1 0 0 1 0 -0.08157002 0.9966584 0.004306298 -0.07890736 0.9966585 -0.02111055 0 1 0 0 1 0 -0.07624883 0.9966582 0.02930325 -0.08157002 0.9966584 0.004306298 0 1 0 0 1 0 -0.06346085 0.9966583 0.05143042 -0.07624883 0.9966582 0.02930325 0 1 0 0 1 0 -0.04446233 0.9966583 0.06852354 -0.06346085 0.9966583 0.05143042 0 1 0 0 1 0 -0.05258088 0.9932705 0.1031947 -0.04446233 0.9966583 0.06852354 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.05143141 0.9966582 0.06346197 0.05258005 0.9932706 0.1031944 0 1 0 0 1 0 0.06852489 0.9966582 0.04446319 0.05143141 0.9966582 0.06346197 0 1 0 0 1 0 0.07891289 0.996658 0.021112 0.06852489 0.9966582 0.04446319 0 1 0 0 1 0 0.08157388 0.996658 -0.004306953 0.07891289 0.996658 0.021112 0 1 0 0 1 0 0.07624739 0.9966583 -0.02930244 0.08157388 0.996658 -0.004306953 0 1 0 0 1 0 0.06345975 0.9966584 -0.05142916 0.07624739 0.9966583 -0.02930244 0 1 0 0 1 0 0.04446166 0.9966583 -0.06852277 0.06345975 0.9966584 -0.05142916 0 1 0 0 1 0 0.02111105 0.9966583 -0.0789097 0.04446166 0.9966583 -0.06852277 0 1 0 0 1 0 -0.004306467 0.9966583 -0.08157167 0.02111105 0.9966583 -0.0789097 0 1 0 0 1 0 -0.01291832 0.9965843 -0.0815651 -0.004306467 0.9966583 -0.08157167 -0.9994519 0 0.03310383 -0.9992595 0 0.03847758 -1 0 0 -0.9997055 0 0.02427028 -0.9994519 0 0.03310383 -1 0 0 -0.9999177 0 0.01283398 -0.9997055 0 0.02427028 -1 0 0 -1 0 0 -0.9999177 0 0.01283398 -1 0 0 -0.9999177 0 -0.01283444 -1 0 0 -1 0 0 -0.9997056 0 -0.02426601 -0.9999177 0 -0.01283444 -1 0 0 -0.999452 0 -0.03310359 -0.9997056 0 -0.02426601 -1 0 0 -0.9992594 0 -0.03848095 -0.999452 0 -0.03310359 -1 0 0 -0.9992009 0 -0.03996983 -0.9992594 0 -0.03848095 -1 0 0 -0.9992942 0 -0.03756514 -0.9992009 0 -0.03996983 -1 0 0 -0.9995001 0 -0.03161851 -0.9992942 0 -0.03756514 -1 0 0 -0.9997404 0 -0.02278628 -0.9995001 0 -0.03161851 -1 0 0 -0.9999291 0 -0.01191914 -0.9997404 0 -0.02278628 -1 0 0 -1 0 0 -0.9999291 0 -0.01191914 -1 0 0 -0.999929 0 0.01191931 -1 0 0 -1 0 0 -0.9997404 0 0.02278603 -0.999929 0 0.01191931 -1 0 0 -0.9995 0 0.03162094 -0.9997404 0 0.02278603 -1 0 0 -0.9992942 0 0.03756437 -0.9995 0 0.03162094 -1 0 0 -0.9992009 0 0.03996911 -0.9992942 0 0.03756437 -1 0 0 -0.9992595 0 0.03847758 -0.9992009 0 0.03996911 -1 0 0 0.1564322 0 -0.9876888 0.9999986 0 0.001661488 0 0 1 -0.9998833 0 0.01528308 -0.6481847 0 -0.7614833 -0.9994258 0 0.03388385 0.705931 0 0.7082807 1 0 0 -0.03388384 0 -0.9994258 4.309e-4 0.9999192 0.01270967 0.03388384 0 0.9994258 -4.3086e-4 -0.9999192 -0.01270849 0.6481843 0 -0.7614836 0.9994258 0 0.03388363 -0.7059309 0 0.7082807 -1 0 0 0.03388362 0 -0.9994258 -4.30977e-4 -0.9999191 0.01271203 -0.03388362 0 0.9994258 4.30937e-4 0.9999191 -0.01271085 -0.156433 0 -0.9876885 -0.9999986 0 0.00166151 0 0 1 0.9998832 0 0.01528296 0.9968167 -0.03036436 0.07371978 0.9839615 -0.1657591 0.06590725 0.9567403 -0.2813152 0.07422801 0.9940523 -0.05309381 0.09508473 0.9839615 -0.1657591 0.06590725 0.9541907 -0.2990964 -0.007855193 0.8688133 -0.4930293 -0.0456676 0.9567403 -0.2813152 0.07422801 0.9594198 -0.03115632 -0.2802552 0.9365587 0.08456412 -0.3401569 0.7758982 0.1138994 -0.620491 0.8152419 -0.0111956 -0.5790125 0.9547306 -0.03488502 -0.2954196 0.9513063 -0.01307327 -0.3079701 0.8103707 -0.04631735 -0.584084 0.8220208 -0.0626731 -0.5659981 0.9968167 -0.03036436 0.07371978 0.9940523 -0.05309381 0.09508473 1 0 0 0.9940523 -0.05309381 0.09508473 0.9938883 -0.06864581 0.08645182 1 0 0 0.9938883 -0.06864581 0.08645182 0.9955699 -0.07735552 0.0534471 1 0 0 0.9955699 -0.07735552 0.0534471 0.9967705 -0.08003896 0.006507318 1 0 0 0.9967705 -0.08003896 0.006507318 0.9960781 -0.077143 -0.04333099 1 0 0 0.9960781 -0.077143 -0.04333099 0.99401 -0.06858918 -0.08508674 1 0 0 0.99401 -0.06858918 -0.08508674 0.9927159 -0.0538553 -0.1077724 1 0 0 0.9927159 -0.0538553 -0.1077724 0.9942343 -0.03247443 -0.1021939 1 0 0 0.9942343 -0.03247443 -0.1021939 0.9977066 -0.005417689 -0.06747029 1 0 0 0.9977066 -0.005417689 -0.06747029 0.999559 0.02340677 -0.01827412 1 0 0 0.999559 0.02340677 -0.01827412 0.9985923 0.04852285 0.0214237 1 0 0 0.9985923 0.04852285 0.0214237 0.9971178 0.06649896 0.03652376 1 0 0 0.9971178 0.06649896 0.03652376 0.9966618 0.07679972 0.02769414 1 0 0 0.9966618 0.07679972 0.02769414 0.9967828 0.08003981 0.00421123 1 0 0 0.9967828 0.08003981 0.00421123 0.9967991 0.07668387 -0.02261119 1 0 0 0.9967991 0.07668387 -0.02261119 0.9969156 0.06671274 -0.0413346 1 0 0 0.9969156 0.06671274 -0.0413346 0.997913 0.04977179 -0.04113871 1 0 0 0.997913 0.04977179 -0.04113871 0.9995419 0.02598637 -0.01550935 1 0 0 0.9995419 0.02598637 -0.01550935 0.9995565 -0.002383674 0.02968476 1 0 0 0.9995565 -0.002383674 0.02968476 0.9968167 -0.03036436 0.07371978 1 0 0 0.8220208 -0.0626731 -0.5659981 0.8103707 -0.04631735 -0.584084 0.5914693 -0.1060397 -0.7993245 0.61887 -0.1074217 -0.7781134 0.8152419 -0.0111956 -0.5790125 0.7758982 0.1138994 -0.620491 0.5241371 0.1660122 -0.8352965 0.5710304 0.02122484 -0.8206545 0.9940523 -0.05309381 0.09508473 0.9567403 -0.2813152 0.07422801 0.9319625 -0.3572296 0.0619114 0.9938883 -0.06864581 0.08645182 0.9567403 -0.2813152 0.07422801 0.8688133 -0.4930293 -0.0456676 0.7795649 -0.6240948 -0.05276765 0.9319625 -0.3572296 0.0619114 0.61887 -0.1074217 -0.7781134 0.5914693 -0.1060397 -0.7993245 0.3174746 -0.3232604 -0.8914666 0.3902892 -0.2391912 -0.8890793 0.5710304 0.02122484 -0.8206545 0.5241371 0.1660122 -0.8352965 0.151031 0.3517725 -0.9238213 0.1933092 0.1217634 -0.9735529 0.9938883 -0.06864581 0.08645182 0.9319625 -0.3572296 0.0619114 0.9164855 -0.398654 0.03360503 0.9955699 -0.07735552 0.0534471 0.9319625 -0.3572296 0.0619114 0.7795649 -0.6240948 -0.05276765 0.7155172 -0.6978514 -0.03222619 0.9164855 -0.398654 0.03360503 0.3902892 -0.2391912 -0.8890793 0.3174746 -0.3232604 -0.8914666 0.06816146 -0.8328291 0.5493177 0.3156586 -0.7828614 -0.5361789 0.1933092 0.1217634 -0.9735529 0.151031 0.3517725 -0.9238213 -0.2786296 0.6910264 0.6669693 -0.5064527 0.5270833 -0.682414 0.9955699 -0.07735552 0.0534471 0.9164855 -0.398654 0.03360503 0.9112403 -0.411861 -0.003422957 0.9967705 -0.08003896 0.006507318 0.9164855 -0.398654 0.03360503 0.7155172 -0.6978514 -0.03222619 0.6928444 -0.7210664 0.005473176 0.9112403 -0.411861 -0.003422957 0.3156586 -0.7828614 -0.5361789 0.06816146 -0.8328291 0.5493177 0.3185661 -0.258343 0.9120169 0.4070079 -0.2983692 0.8633194 -0.5064527 0.5270833 -0.682414 -0.2786296 0.6910264 0.6669693 0.2398028 0.1672801 0.9563013 0.03474785 0.274644 0.9609179 0.9967705 -0.08003896 0.006507318 0.9112403 -0.411861 -0.003422957 0.9158485 -0.3994189 -0.04106417 0.9960781 -0.077143 -0.04333099 0.9112403 -0.411861 -0.003422957 0.6928444 -0.7210664 0.005473176 0.7173607 -0.6951637 0.04627259 0.9158485 -0.3994189 -0.04106417 0.4070079 -0.2983692 0.8633194 0.3185661 -0.258343 0.9120169 0.5914764 -0.1148689 0.7980982 0.616654 -0.09873891 0.7810175 0.03474785 0.274644 0.9609179 0.2398028 0.1672801 0.9563013 0.5773166 0.03108231 0.8159286 0.4797806 0.1271013 0.8681335 0.9960781 -0.077143 -0.04333099 0.9158485 -0.3994189 -0.04106417 0.9305878 -0.3591262 -0.07095563 0.99401 -0.06858918 -0.08508674 0.9158485 -0.3994189 -0.04106417 0.7173607 -0.6951637 0.04627259 0.7848812 -0.6151202 0.0747564 0.9305878 -0.3591262 -0.07095563 0.616654 -0.09873891 0.7810175 0.5914764 -0.1148689 0.7980982 0.8104104 -0.06681086 0.5820407 0.8183542 -0.04308529 0.573097 0.4797806 0.1271013 0.8681335 0.5773166 0.03108231 0.8159286 0.812004 -0.01293774 0.5835086 0.7539654 0.08700754 0.6511267 0.99401 -0.06858918 -0.08508674 0.9305878 -0.3591262 -0.07095563 0.9548268 -0.2847465 -0.08500092 0.9927159 -0.0538553 -0.1077724 0.9305878 -0.3591262 -0.07095563 0.7848812 -0.6151202 0.0747564 0.8780479 -0.4723474 0.07694159 0.9548268 -0.2847465 -0.08500092 0.8183542 -0.04308529 0.573097 0.8104104 -0.06681086 0.5820407 0.9293125 -0.04962309 0.3659452 0.9524723 -0.01199644 0.3043891 0.7539654 0.08700754 0.6511267 0.812004 -0.01293774 0.5835086 0.9551426 -0.03983239 0.2934554 0.9279988 0.06472626 0.366918 0.9927159 -0.0538553 -0.1077724 0.9548268 -0.2847465 -0.08500092 0.9823033 -0.1705112 -0.07750005 0.9942343 -0.03247443 -0.1021939 0.9548268 -0.2847465 -0.08500092 0.8780479 -0.4723474 0.07694159 0.9633871 -0.2641041 0.04619839 0.9823033 -0.1705112 -0.07750005 0.9524723 -0.01199644 0.3043891 0.9293125 -0.04962309 0.3659452 0.9999233 -0.01214528 -0.002444831 0.9999183 0.01185241 0.004778098 0.9279988 0.06472626 0.366918 0.9551426 -0.03983239 0.2934554 0.997771 -0.06189047 -0.02495587 0.9978142 0.04765101 0.04578657 0.9942343 -0.03247443 -0.1021939 0.9823033 -0.1705112 -0.07750005 0.9984848 -0.02266357 -0.0501439 0.9977066 -0.005417689 -0.06747029 0.9823033 -0.1705112 -0.07750005 0.9633871 -0.2641041 0.04619839 0.9999219 -0.009012753 -0.008659098 0.9984848 -0.02266357 -0.0501439 0.9999183 0.01185241 0.004778098 0.9999233 -0.01214528 -0.002444831 0.9291352 0.02603186 -0.3688226 0.9547297 0.03487343 -0.2954236 0.9978142 0.04765101 0.04578657 0.997771 -0.06189047 -0.02495587 0.9365613 -0.08455292 -0.3401524 0.9594215 0.03116621 -0.2802483 0.9977066 -0.005417689 -0.06747029 0.9984848 -0.02266357 -0.0501439 0.9911585 0.1317769 -0.01548612 0.999559 0.02340677 -0.01827412 0.9984848 -0.02266357 -0.0501439 0.9999219 -0.009012753 -0.008659098 0.966609 0.2483494 -0.06316303 0.9911585 0.1317769 -0.01548612 0.9547297 0.03487343 -0.2954236 0.9291352 0.02603186 -0.3688226 0.8103709 0.04631725 -0.5840837 0.8220205 0.06266803 -0.5659993 0.9594215 0.03116621 -0.2802483 0.9365613 -0.08455292 -0.3401524 0.7758985 -0.1138999 -0.6204904 0.8152441 0.01119948 -0.5790092 0.999559 0.02340677 -0.01827412 0.9911585 0.1317769 -0.01548612 0.9654641 0.2603252 0.01048566 0.9985923 0.04852285 0.0214237 0.9911585 0.1317769 -0.01548612 0.966609 0.2483494 -0.06316303 0.8821425 0.461828 -0.09241038 0.9654641 0.2603252 0.01048566 0.8220205 0.06266803 -0.5659993 0.8103709 0.04631725 -0.5840837 0.5914698 0.1060372 -0.7993245 0.6188694 0.1074216 -0.778114 0.8152441 0.01119948 -0.5790092 0.7758985 -0.1138999 -0.6204904 0.5241372 -0.1660104 -0.8352968 0.5710304 -0.02122476 -0.8206546 0.9985923 0.04852285 0.0214237 0.9654641 0.2603252 0.01048566 0.9373199 0.3479235 0.01950967 0.9971178 0.06649896 0.03652376 0.9654641 0.2603252 0.01048566 0.8821425 0.461828 -0.09241038 0.7874373 0.6103569 -0.08606442 0.9373199 0.3479235 0.01950967 0.6188694 0.1074216 -0.778114 0.5914698 0.1060372 -0.7993245 0.3174757 0.3232593 -0.8914666 0.3902885 0.2391912 -0.8890796 0.5710304 -0.02122476 -0.8206546 0.5241372 -0.1660104 -0.8352968 0.1510289 -0.3517736 -0.9238213 0.1933063 -0.1217666 -0.9735531 0.9971178 0.06649896 0.03652376 0.9373199 0.3479235 0.01950967 0.9179978 0.3963825 0.01268931 0.9966618 0.07679972 0.02769414 0.9373199 0.3479235 0.01950967 0.7874373 0.6103569 -0.08606442 0.7176136 0.6947645 -0.04830195 0.9179978 0.3963825 0.01268931 0.3902885 0.2391912 -0.8890796 0.3174757 0.3232593 -0.8914666 0.0681661 0.8328283 0.5493183 0.3156598 0.7828619 -0.5361773 0.1933063 -0.1217666 -0.9735531 0.1510289 -0.3517736 -0.9238213 -0.2786304 -0.6910261 0.6669695 -0.5064553 -0.5270912 -0.6824059 0.9966618 0.07679972 0.02769414 0.9179978 0.3963825 0.01268931 0.9112399 0.4118619 -0.003410741 0.9967828 0.08003981 0.00421123 0.9179978 0.3963825 0.01268931 0.7176136 0.6947645 -0.04830195 0.6928245 0.7210537 0.008712381 0.9112399 0.4118619 -0.003410741 0.3156598 0.7828619 -0.5361773 0.0681661 0.8328283 0.5493183 0.3185649 0.2583467 0.9120162 0.4070058 0.2983716 0.8633196 -0.5064553 -0.5270912 -0.6824059 -0.2786304 -0.6910261 0.6669695 0.2397998 -0.1672805 0.9563019 0.0347463 -0.2746446 0.9609178 0.9967828 0.08003981 0.00421123 0.9112399 0.4118619 -0.003410741 0.9175087 0.3972076 -0.02010311 0.9967991 0.07668387 -0.02261119 0.9112399 0.4118619 -0.003410741 0.6928245 0.7210537 0.008712381 0.7200346 0.690498 0.069013 0.9175087 0.3972076 -0.02010311 0.4070058 0.2983716 0.8633196 0.3185649 0.2583467 0.9120162 0.5914738 0.1148689 0.7981003 0.6166534 0.09874222 0.7810178 0.0347463 -0.2746446 0.9609178 0.2397998 -0.1672805 0.9563019 0.5773152 -0.03108127 0.8159295 0.4797782 -0.1271019 0.8681349 0.9967991 0.07668387 -0.02261119 0.9175087 0.3972076 -0.02010311 0.9363491 0.3499219 -0.02837524 0.9969156 0.06671274 -0.0413346 0.9175087 0.3972076 -0.02010311 0.7200346 0.690498 0.069013 0.7933968 0.597775 0.1148329 0.9363491 0.3499219 -0.02837524 0.6166534 0.09874222 0.7810178 0.5914738 0.1148689 0.7981003 0.8104115 0.06681568 0.5820386 0.818355 0.04308477 0.573096 0.4797782 -0.1271019 0.8681349 0.5773152 -0.03108127 0.8159295 0.8120034 0.01293162 0.5835094 0.7539659 -0.08700851 0.6511259 0.9969156 0.06671274 -0.0413346 0.9363491 0.3499219 -0.02837524 0.9643534 0.2637994 -0.02079345 0.997913 0.04977179 -0.04113871 0.9363491 0.3499219 -0.02837524 0.7933968 0.597775 0.1148329 0.8906725 0.4358104 0.1295064 0.9643534 0.2637994 -0.02079345 0.818355 0.04308477 0.573096 0.8104115 0.06681568 0.5820386 0.9513364 0.03705751 0.3059183 0.952473 0.01200841 0.3043864 0.7539659 -0.08700851 0.6511259 0.8120034 0.01293162 0.5835094 0.9551412 0.03982203 0.2934615 0.9279954 -0.06473579 0.366925 0.997913 0.04977179 -0.04113871 0.9643534 0.2637994 -0.02079345 0.990638 0.1364419 0.004467275 0.9995419 0.02598637 -0.01550935 0.9643534 0.2637994 -0.02079345 0.8906725 0.4358104 0.1295064 0.9722971 0.2089125 0.1048521 0.990638 0.1364419 0.004467275 0.952473 0.01200841 0.3043864 0.9513364 0.03705751 0.3059183 0.9999225 0.01241784 -0.001015776 0.9999185 -0.01184631 0.004775911 0.9279954 -0.06473579 0.366925 0.9551412 0.03982203 0.2934615 0.9977705 0.06189655 -0.02495805 0.9978138 -0.04765533 0.04579115 0.9995419 0.02598637 -0.01550935 0.990638 0.1364419 0.004467275 0.999095 -0.01751878 0.03876005 0.9995565 -0.002383674 0.02968476 0.990638 0.1364419 0.004467275 0.9722971 0.2089125 0.1048521 0.9973399 -0.05256039 0.05050421 0.999095 -0.01751878 0.03876005 0.9513063 -0.01307327 -0.3079701 0.9547306 -0.03488502 -0.2954196 0.9999185 -0.01184631 0.004775911 0.9999225 0.01241784 -0.001015776 0.9365587 0.08456412 -0.3401569 0.9594198 -0.03115632 -0.2802552 0.9978138 -0.04765533 0.04579115 0.9977705 0.06189655 -0.02495805 0.9541907 -0.2990964 -0.007855193 0.9839615 -0.1657591 0.06590725 0.999095 -0.01751878 0.03876005 0.9973399 -0.05256039 0.05050421 0.9839615 -0.1657591 0.06590725 0.9968167 -0.03036436 0.07371978 0.9995565 -0.002383674 0.02968476 0.999095 -0.01751878 0.03876005</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape11-texbinormals-array" count="544" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_Shape11-vertices" name="qt_gauge_needles_Shape11-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_Shape11-positions"/>
+ </vertices>
+ <triangles material="lambert3SG" count="236">
+ <input semantic="VERTEX" source="#qt_gauge_needles_Shape11-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_Shape11-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_Shape11-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_Shape11-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_Shape11-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_Shape11-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_Shape11-texbinormals" offset="3" set="0"/>
+ <p>0 0 20 0 1 1 21 1 20 3 41 3 20 3 41 3 1 1 21 1 21 2 42 2 1 1 21 4 2 4 22 5 21 2 42 7 21 2 42 7 2 4 22 5 22 5 43 6 2 4 22 8 3 6 23 9 22 5 43 11 22 5 43 11 3 6 23 9 23 7 44 10 3 6 23 12 4 8 24 13 23 7 44 15 23 7 44 15 4 8 24 13 24 9 45 14 4 8 24 16 5 10 25 17 24 9 45 19 24 9 45 19 5 10 25 17 25 11 46 18 5 10 25 20 6 12 26 21 25 11 46 23 25 11 46 23 6 12 26 21 26 13 47 22 6 12 26 24 7 14 27 25 26 13 47 27 26 13 47 27 7 14 27 25 27 15 48 26 7 14 27 28 8 16 28 29 27 15 48 31 27 15 48 31 8 16 28 29 28 17 49 30 10 24 30 40 11 25 31 41 30 27 51 43 30 27 51 43 11 25 31 41 31 26 52 42 11 25 31 44 12 28 32 45 31 26 52 47 31 26 52 47 12 28 32 45 32 29 53 46 12 28 32 48 13 30 33 49 32 29 53 51 32 29 53 51 13 30 33 49 33 31 54 50 13 30 33 52 14 32 34 53 33 31 54 55 33 31 54 55 14 32 34 53 34 33 55 54 14 32 34 56 15 34 35 57 34 33 55 59 34 33 55 59 15 34 35 57 35 35 56 58 15 34 35 60 16 36 36 61 35 35 56 63 35 35 56 63 16 36 36 61 36 37 57 62 16 36 36 64 17 38 37 65 36 37 57 67 36 37 57 67 17 38 37 65 37 39 58 66 17 38 37 68 18 40 38 69 37 39 58 71 37 39 58 71 18 40 38 69 38 41 59 70 18 40 38 72 19 42 39 73 38 41 59 75 38 41 59 75 19 42 39 73 39 43 60 74 19 42 39 76 0 0 40 77 39 43 60 79 39 43 60 79 0 0 40 77 20 3 61 78 1 44 1 80 0 45 0 81 40 46 62 82 2 47 2 83 1 44 1 84 40 46 62 85 3 48 3 86 2 47 2 87 40 46 62 88 4 49 4 89 3 48 3 90 40 46 62 91 5 50 5 92 4 49 4 93 40 46 62 94 6 51 6 95 5 50 5 96 40 46 62 97 7 52 7 98 6 51 6 99 40 46 62 100 8 53 8 101 7 52 7 102 40 46 62 103 9 54 9 104 8 53 8 105 40 46 62 106 10 55 10 107 9 54 9 108 40 46 62 109 11 56 11 110 10 55 10 111 40 46 62 112 12 57 12 113 11 56 11 114 40 46 62 115 13 58 13 116 12 57 12 117 40 46 62 118 14 59 14 119 13 58 13 120 40 46 62 121 15 60 15 122 14 59 14 123 40 46 62 124 16 61 16 125 15 60 15 126 40 46 62 127 17 62 17 128 16 61 16 129 40 46 62 130 18 63 18 131 17 62 17 132 40 46 62 133 19 64 19 134 18 63 18 135 40 46 62 136 0 45 0 137 19 64 19 138 40 46 62 139 51 89 88 164 50 90 112 165 52 92 69 167 52 92 69 167 50 90 112 165 53 91 113 166 50 90 112 168 49 93 111 169 53 91 113 171 53 91 113 171 49 93 111 169 54 94 114 170 49 93 111 172 48 95 110 173 54 94 114 175 54 94 114 175 48 95 110 173 55 96 115 174 48 95 110 176 20 3 91 177 55 96 115 179 55 96 115 179 20 3 91 177 21 2 90 178 51 89 88 180 52 92 69 181 47 97 89 182 52 92 69 183 56 98 70 184 47 97 89 185 56 98 70 186 60 99 71 187 47 97 89 188 60 99 71 189 64 100 72 190 47 97 89 191 64 100 72 192 68 101 73 193 47 97 89 194 68 101 73 195 72 102 74 196 47 97 89 197 72 102 74 198 76 103 75 199 47 97 89 200 76 103 75 201 80 104 76 202 47 97 89 203 80 104 76 204 84 105 77 205 47 97 89 206 84 105 77 207 88 106 78 208 47 97 89 209 88 106 78 210 92 107 79 211 47 97 89 212 92 107 79 213 96 108 80 214 47 97 89 215 96 108 80 216 100 109 81 217 47 97 89 218 100 109 81 219 104 110 82 220 47 97 89 221 104 110 82 222 108 111 83 223 47 97 89 224 108 111 83 225 112 112 84 226 47 97 89 227 112 112 84 228 116 113 85 229 47 97 89 230 116 113 85 231 120 114 86 232 47 97 89 233 120 114 86 234 124 115 87 235 47 97 89 236 124 115 87 237 51 89 88 238 47 97 89 239 55 96 115 240 21 2 90 241 59 116 118 243 59 116 118 243 21 2 90 241 22 5 92 242 54 94 114 244 55 96 115 245 58 117 117 247 58 117 117 247 55 96 115 245 59 116 118 246 52 92 69 248 53 91 113 249 56 98 70 251 56 98 70 251 53 91 113 249 57 118 116 250 53 91 113 252 54 94 114 253 57 118 116 255 57 118 116 255 54 94 114 253 58 117 117 254 59 116 118 256 22 5 92 257 63 119 121 259 63 119 121 259 22 5 92 257 23 7 93 258 58 117 117 260 59 116 118 261 62 120 120 263 62 120 120 263 59 116 118 261 63 119 121 262 56 98 70 264 57 118 116 265 60 99 71 267 60 99 71 267 57 118 116 265 61 121 119 266 57 118 116 268 58 117 117 269 61 121 119 271 61 121 119 271 58 117 117 269 62 120 120 270 63 119 121 272 23 7 93 273 67 122 124 275 67 122 124 275 23 7 93 273 24 9 94 274 62 120 120 276 63 119 121 277 66 123 123 279 66 123 123 279 63 119 121 277 67 122 124 278 60 99 71 280 61 121 119 281 64 100 72 283 64 100 72 283 61 121 119 281 65 124 122 282 61 121 119 284 62 120 120 285 65 124 122 287 65 124 122 287 62 120 120 285 66 123 123 286 67 122 124 288 24 9 94 289 71 125 127 291 71 125 127 291 24 9 94 289 25 11 95 290 66 123 123 292 67 122 124 293 70 126 126 295 70 126 126 295 67 122 124 293 71 125 127 294 64 100 72 296 65 124 122 297 68 101 73 299 68 101 73 299 65 124 122 297 69 127 125 298 65 124 122 300 66 123 123 301 69 127 125 303 69 127 125 303 66 123 123 301 70 126 126 302 71 125 127 304 25 11 95 305 75 128 130 307 75 128 130 307 25 11 95 305 26 13 96 306 70 126 126 308 71 125 127 309 74 129 129 311 74 129 129 311 71 125 127 309 75 128 130 310 68 101 73 312 69 127 125 313 72 102 74 315 72 102 74 315 69 127 125 313 73 130 128 314 69 127 125 316 70 126 126 317 73 130 128 319 73 130 128 319 70 126 126 317 74 129 129 318 75 128 130 320 26 13 96 321 79 131 133 323 79 131 133 323 26 13 96 321 27 15 97 322 74 129 129 324 75 128 130 325 78 132 132 327 78 132 132 327 75 128 130 325 79 131 133 326 72 102 74 328 73 130 128 329 76 103 75 331 76 103 75 331 73 130 128 329 77 133 131 330 73 130 128 332 74 129 129 333 77 133 131 335 77 133 131 335 74 129 129 333 78 132 132 334 79 131 133 336 27 15 97 337 83 134 136 339 83 134 136 339 27 15 97 337 28 17 98 338 78 132 132 340 79 131 133 341 82 135 135 343 82 135 135 343 79 131 133 341 83 134 136 342 76 103 75 344 77 133 131 345 80 104 76 347 80 104 76 347 77 133 131 345 81 136 134 346 77 133 131 348 78 132 132 349 81 136 134 351 81 136 134 351 78 132 132 349 82 135 135 350 83 134 136 352 28 17 98 353 87 138 139 355 87 138 139 355 28 17 98 353 29 137 99 354 82 135 135 356 83 134 136 357 86 139 138 359 86 139 138 359 83 134 136 357 87 138 139 358 80 104 76 360 81 136 134 361 84 105 77 363 84 105 77 363 81 136 134 361 85 140 137 362 81 136 134 364 82 135 135 365 85 140 137 367 85 140 137 367 82 135 135 365 86 139 138 366 87 138 139 368 29 137 99 369 91 141 142 371 91 141 142 371 29 137 99 369 30 27 100 370 86 139 138 372 87 138 139 373 90 142 141 375 90 142 141 375 87 138 139 373 91 141 142 374 84 105 77 376 85 140 137 377 88 106 78 379 88 106 78 379 85 140 137 377 89 143 140 378 85 140 137 380 86 139 138 381 89 143 140 383 89 143 140 383 86 139 138 381 90 142 141 382 91 141 142 384 30 27 100 385 95 144 145 387 95 144 145 387 30 27 100 385 31 26 101 386 90 142 141 388 91 141 142 389 94 145 144 391 94 145 144 391 91 141 142 389 95 144 145 390 88 106 78 392 89 143 140 393 92 107 79 395 92 107 79 395 89 143 140 393 93 146 143 394 89 143 140 396 90 142 141 397 93 146 143 399 93 146 143 399 90 142 141 397 94 145 144 398 95 144 145 400 31 26 101 401 99 147 148 403 99 147 148 403 31 26 101 401 32 29 102 402 94 145 144 404 95 144 145 405 98 148 147 407 98 148 147 407 95 144 145 405 99 147 148 406 92 107 79 408 93 146 143 409 96 108 80 411 96 108 80 411 93 146 143 409 97 149 146 410 93 146 143 412 94 145 144 413 97 149 146 415 97 149 146 415 94 145 144 413 98 148 147 414 99 147 148 416 32 29 102 417 103 150 151 419 103 150 151 419 32 29 102 417 33 31 103 418 98 148 147 420 99 147 148 421 102 151 150 423 102 151 150 423 99 147 148 421 103 150 151 422 96 108 80 424 97 149 146 425 100 109 81 427 100 109 81 427 97 149 146 425 101 152 149 426 97 149 146 428 98 148 147 429 101 152 149 431 101 152 149 431 98 148 147 429 102 151 150 430 103 150 151 432 33 31 103 433 107 153 154 435 107 153 154 435 33 31 103 433 34 33 104 434 102 151 150 436 103 150 151 437 106 154 153 439 106 154 153 439 103 150 151 437 107 153 154 438 100 109 81 440 101 152 149 441 104 110 82 443 104 110 82 443 101 152 149 441 105 155 152 442 101 152 149 444 102 151 150 445 105 155 152 447 105 155 152 447 102 151 150 445 106 154 153 446 107 153 154 448 34 33 104 449 111 156 157 451 111 156 157 451 34 33 104 449 35 35 105 450 106 154 153 452 107 153 154 453 110 157 156 455 110 157 156 455 107 153 154 453 111 156 157 454 104 110 82 456 105 155 152 457 108 111 83 459 108 111 83 459 105 155 152 457 109 158 155 458 105 155 152 460 106 154 153 461 109 158 155 463 109 158 155 463 106 154 153 461 110 157 156 462 111 156 157 464 35 35 105 465 115 159 160 467 115 159 160 467 35 35 105 465 36 37 106 466 110 157 156 468 111 156 157 469 114 160 159 471 114 160 159 471 111 156 157 469 115 159 160 470 108 111 83 472 109 158 155 473 112 112 84 475 112 112 84 475 109 158 155 473 113 161 158 474 109 158 155 476 110 157 156 477 113 161 158 479 113 161 158 479 110 157 156 477 114 160 159 478 115 159 160 480 36 37 106 481 119 162 163 483 119 162 163 483 36 37 106 481 37 39 107 482 114 160 159 484 115 159 160 485 118 163 162 487 118 163 162 487 115 159 160 485 119 162 163 486 112 112 84 488 113 161 158 489 116 113 85 491 116 113 85 491 113 161 158 489 117 164 161 490 113 161 158 492 114 160 159 493 117 164 161 495 117 164 161 495 114 160 159 493 118 163 162 494 119 162 163 496 37 39 107 497 123 165 166 499 123 165 166 499 37 39 107 497 38 41 108 498 118 163 162 500 119 162 163 501 122 166 165 503 122 166 165 503 119 162 163 501 123 165 166 502 116 113 85 504 117 164 161 505 120 114 86 507 120 114 86 507 117 164 161 505 121 167 164 506 117 164 161 508 118 163 162 509 121 167 164 511 121 167 164 511 118 163 162 509 122 166 165 510 123 165 166 512 38 41 108 513 127 168 169 515 127 168 169 515 38 41 108 513 39 43 109 514 122 166 165 516 123 165 166 517 126 169 168 519 126 169 168 519 123 165 166 517 127 168 169 518 120 114 86 520 121 167 164 521 124 115 87 523 124 115 87 523 121 167 164 521 125 170 167 522 121 167 164 524 122 166 165 525 125 170 167 527 125 170 167 527 122 166 165 525 126 169 168 526 20 3 91 528 48 95 110 529 39 43 109 531 39 43 109 531 48 95 110 529 127 168 169 530 48 95 110 532 49 93 111 533 127 168 169 535 127 168 169 535 49 93 111 533 126 169 168 534 49 93 111 536 50 90 112 537 126 169 168 539 126 169 168 539 50 90 112 537 125 170 167 538 50 90 112 540 51 89 88 541 125 170 167 543 125 170 167 543 51 89 88 541 124 115 87 542</p>
+ </triangles>
+ <triangles material="lambert2SG" count="16">
+ <input semantic="VERTEX" source="#qt_gauge_needles_Shape11-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_Shape11-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_Shape11-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_Shape11-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_Shape11-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_Shape11-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_Shape11-texbinormals" offset="3" set="0"/>
+ <p>41 18 63 32 42 19 64 33 44 21 66 35 44 21 66 35 42 19 64 33 43 20 65 34 42 19 64 36 45 22 67 37 43 20 65 39 43 20 65 39 45 22 67 37 46 23 68 38 42 67 64 142 41 68 63 143 9 66 29 141 8 65 28 140 9 66 29 141 41 68 63 143 43 72 65 147 29 69 50 144 44 71 66 146 29 69 50 144 28 70 49 145 44 71 66 146 28 73 49 148 8 74 28 149 44 76 66 151 44 76 66 151 8 74 28 149 41 75 63 150 42 80 64 155 9 77 29 152 45 79 67 154 9 77 29 152 10 78 30 153 45 79 67 154 10 81 30 156 30 82 51 157 45 84 67 159 45 84 67 159 30 82 51 157 46 83 68 158 43 87 65 162 46 88 68 163 29 86 50 161 30 85 51 160 29 86 50 161 46 88 68 163</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_Shape11</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_11" name="qt_gauge_needles_11" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_Shape11">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#black_solid"/>
+ <instance_material symbol="lambert2SG" target="#red_transparent"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_11</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_12.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_12.dae
new file mode 100644
index 0000000..773aefa
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_12.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:56:46</created>
+ <modified>2018-03-08T09:56:46</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_Shape12" name="qt_gauge_needles_Shape12">
+ <mesh>
+ <source id="qt_gauge_needles_Shape12-positions" name="qt_gauge_needles_Shape12-positions">
+ <float_array id="qt_gauge_needles_Shape12-positions-array" count="33">0 0 -12 0 0 2 -0.8000219 0 0.3999598 -0.9401233 0 -0.005423307 -0.9648963 0 -0.4212524 0 0.725308 0.3999596 0 0.8524873 -0.005407381 0 0.874786 -0.4212525 0.9648944 0 -0.4212522 0.9401219 0 -0.005423248 0.8000226 0 0.39996</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape12-positions-array" count="11" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape12-normals" name="qt_gauge_needles_Shape12-normals">
+ <float_array id="qt_gauge_needles_Shape12-normals-array" count="48">0.6708431 0.7399448 -0.04950791 0.6666873 0.7352953 0.1219376 0.6668238 0.735446 0.1202718 0.6708435 0.7399452 -0.04949641 0.6448936 0.7112988 0.2795822 0.6451954 0.7116304 0.2780379 0.6706148 0.7396976 -0.0558845 0.6367156 0.7023111 0.3183587 -0.6706194 0.7396935 -0.05588498 -0.6708481 0.7399411 -0.04949713 -0.6708476 0.7399406 -0.04950865 -0.6367219 0.702304 0.3183617 -0.6448998 0.7112917 0.2795862 -0.6452016 0.7116232 0.2780418 -0.6668301 0.7354403 0.1202717 -0.6666936 0.7352895 0.1219375</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape12-normals-array" count="16" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape12-tangents" name="qt_gauge_needles_Shape12-tangents">
+ <float_array id="qt_gauge_needles_Shape12-tangents-array" count="48">0.03325251 0.03667839 0.9987738 0.7432966 -0.6680025 -0.03581536 0.08078128 0.08910488 -0.992741 -0.7415988 0.6693873 -0.04417967 0.7634813 -0.616213 -0.1933336 0.1867478 0.2059862 -0.9605702 -0.7371424 0.6729393 0.06142846 0.7710987 -0.5799136 -0.2628821 -0.7418016 -0.6687137 0.05052155 0.7374002 0.672655 0.06145005 0.03325333 -0.03667865 -0.9987737 0.6281595 0.7118771 -0.3140805 -0.7638521 -0.5878181 -0.2664578 0.1867523 -0.2059874 0.960569 0.7365232 0.6749877 -0.04387823 -0.08190107 0.09033816 -0.9925378</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape12-tangents-array" count="16" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape12-binormals" name="qt_gauge_needles_Shape12-binormals">
+ <float_array id="qt_gauge_needles_Shape12-binormals-array" count="48">0.7408534 -0.6716668 0 0.05511975 0.1145134 -0.9918914 -0.7408242 0.671699 0 4.41738e-4 0.06634413 0.9977968 0.0347642 0.3381354 -0.9404552 -0.7408429 0.6716784 0 0.08304538 0 0.9965458 0 0.4128672 -0.9107913 0 0.0753363 0.9971583 0.07876394 0.004724455 -0.9968822 -0.7408493 -0.6716715 0 -0.4472145 0 -0.8944268 -0.02518338 -0.3854011 0.9224055 0.7408363 0.6716856 0 -0.1134517 0.05932354 -0.9917709 -0.7408184 -0.6717055 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape12-binormals-array" count="16" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape12-map1" name="qt_gauge_needles_Shape12-map1">
+ <float_array id="qt_gauge_needles_Shape12-map1-array" count="28">0 0.19998 0 1 0.9648957 1 0.4000132 0.19998 0 0.9999951 0 0 0.9648956 0.482444 1 1 1 0.1999799 0.9648957 0 1 0 1 0.499996 0.500004 0 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape12-map1-array" count="14" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape12-textangents">
+ <float_array id="qt_gauge_needles_Shape12-textangents-array" count="84">-0.506285 0.5057392 0.6985008 0.02417128 -0.1848438 0.9824706 -0.5860678 0.4178563 0.6942049 -0.7363028 0.6566054 -0.163485 -0.740824 0.671699 0 -0.7408434 0.6716777 0 -0.740842 0.6716793 0 -0.7408241 0.6716989 0 0.08304536 0 0.9965457 0.07877133 -0.004716144 0.9968815 0.07876363 -0.004724652 0.9968821 -0.740842 0.6716793 0 -0.7408434 0.6716777 0 -0.7408576 0.6716621 0 -0.08304548 0 0.9965457 -0.03965843 0.03085357 0.9987368 -0.07269639 8.23624e-4 0.9973538 -0.7408509 -0.6716694 0 -0.7408368 -0.671685 0 -0.7408353 -0.6716865 0 -0.03965843 0.03085357 0.9987368 -0.2872816 -0.4026141 0.8691208 -0.02417607 -0.1848495 0.9824694 -0.07269639 8.23624e-4 0.9973538 -0.2872816 -0.4026141 0.8691208 -0.7408353 -0.6716865 0 -0.7408368 -0.671685 0 -0.7408183 -0.6717055 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape12-textangents-array" count="28" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape12-texbinormals">
+ <float_array id="qt_gauge_needles_Shape12-texbinormals-array" count="84">-0.5418902 0.4435194 -0.7138947 -0.7449455 0.6520534 0.141006 -0.4602939 0.5333998 -0.7096578 0.08847036 -0.1461172 -0.9853034 -0.08190077 -0.09033849 0.9925379 -0.1877851 -0.2071302 0.9601218 -0.1867514 -0.205983 0.9605701 -0.08078128 -0.08910488 0.9927411 0.7371425 -0.6729394 -0.06142846 0.737404 -0.6726511 -0.06145024 0.7374044 -0.6726505 -0.06145028 -0.1867514 -0.205983 0.9605701 -0.1877851 -0.2071302 0.9601218 -0.2138299 -0.2358581 0.9479703 0.7371385 0.6729439 0.06142817 0.7405336 0.6719637 0.008646843 0.7380235 0.6726717 0.05323849 0.2138342 -0.2358583 0.9479693 0.1877898 -0.2071314 0.9601207 0.186756 -0.2059842 0.960569 0.7405336 0.6719637 0.008646843 0.6876096 0.5450041 0.4797537 0.7449397 0.6520582 0.1410144 0.7380235 0.6726717 0.05323849 0.6876096 0.5450041 0.4797537 0.186756 -0.2059842 0.960569 0.1877898 -0.2071314 0.9601207 0.08190157 -0.09033771 0.9925379</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape12-texbinormals-array" count="28" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_Shape12-vertices" name="qt_gauge_needles_Shape12-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_Shape12-positions"/>
+ </vertices>
+ <triangles material="lambert4SG" count="12">
+ <input semantic="VERTEX" source="#qt_gauge_needles_Shape12-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_Shape12-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_Shape12-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_Shape12-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_Shape12-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_Shape12-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_Shape12-texbinormals" offset="3" set="0"/>
+ <p>6 1 11 1 9 2 13 2 7 0 6 0 7 0 6 0 9 2 13 2 8 3 2 3 5 4 3 5 10 5 0 6 6 1 12 4 6 1 12 4 10 5 0 6 9 2 13 7 0 6 1 8 7 0 6 9 8 3 2 10 10 5 0 11 5 4 3 12 1 7 4 13 0 8 5 14 4 9 9 15 7 10 6 16 1 11 7 17 5 12 3 18 2 13 8 19 4 9 9 20 3 14 10 21 7 10 6 23 7 10 6 23 3 14 10 21 6 15 11 22 3 14 10 24 2 13 8 25 6 15 12 27 6 15 12 27 2 13 8 25 5 12 3 26</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_Shape12</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_12" name="qt_gauge_needles_12" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_Shape12">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_12</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_13.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_13.dae
new file mode 100644
index 0000000..6290d97
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_13.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:56:59</created>
+ <modified>2018-03-08T09:56:59</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_Shape13" name="qt_gauge_needles_Shape13">
+ <mesh>
+ <source id="qt_gauge_needles_Shape13-positions" name="qt_gauge_needles_Shape13-positions">
+ <float_array id="qt_gauge_needles_Shape13-positions-array" count="24">-0.1318893 0 -12 -0.1318893 0 1 -0.1318893 0.3685528 -12 -0.1318893 0.3685528 1 0.1318893 0.3685528 -12 0.1318893 0.3685528 1 0.1318893 0 -12 0.1318893 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape13-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape13-normals" name="qt_gauge_needles_Shape13-normals">
+ <float_array id="qt_gauge_needles_Shape13-normals-array" count="72">-1 0 0 -1 0 0 -1 0 0 -1 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape13-normals-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape13-tangents" name="qt_gauge_needles_Shape13-tangents">
+ <float_array id="qt_gauge_needles_Shape13-tangents-array" count="72">0 0 1 0 1 0 0 0 -1 0 -1 0 0 0 1 0.9999999 0 0 0 0 -1 -0.9999999 0 0 0 0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 -0.9999999 0 0 0 0 -1 0.9999999 0 0 1 0 0 0 1 0 -1 0 0 0 -1 0 -1 0 0 0 1 0 1 0 0 0 -1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape13-tangents-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape13-binormals" name="qt_gauge_needles_Shape13-binormals">
+ <float_array id="qt_gauge_needles_Shape13-binormals-array" count="72">0 1 0 0 0 -1 0 -1 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0 1 0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 0 1 0 0 0 -1 0 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape13-binormals-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape13-map1" name="qt_gauge_needles_Shape13-map1">
+ <float_array id="qt_gauge_needles_Shape13-map1-array" count="28">0.375 0 0.625 0 0.375 0.25 0.625 0.25 0.375 0.5 0.625 0.5 0.375 0.75 0.625 0.75 0.375 1 0.625 1 0.875 0 0.875 0.25 0.125 0 0.125 0.25</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape13-map1-array" count="14" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape13-textangents">
+ <float_array id="qt_gauge_needles_Shape13-textangents-array" count="72">0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape13-textangents-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape13-texbinormals">
+ <float_array id="qt_gauge_needles_Shape13-texbinormals-array" count="72">0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape13-texbinormals-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_Shape13-vertices" name="qt_gauge_needles_Shape13-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_Shape13-positions"/>
+ </vertices>
+ <triangles material="lambert4SG" count="12">
+ <input semantic="VERTEX" source="#qt_gauge_needles_Shape13-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_Shape13-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_Shape13-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_Shape13-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_Shape13-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_Shape13-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_Shape13-texbinormals" offset="3" set="0"/>
+ <p>0 0 0 0 1 1 1 1 2 3 2 3 2 3 2 3 1 1 1 1 3 2 3 2 2 4 2 4 3 5 3 5 4 7 4 7 4 7 4 7 3 5 3 5 5 6 5 6 4 8 4 8 5 9 5 9 6 11 6 11 6 11 6 11 5 9 5 9 7 10 7 10 6 12 6 12 7 13 7 13 0 15 8 15 0 15 8 15 7 13 7 13 1 14 9 14 1 16 1 16 7 17 10 17 3 19 3 19 3 19 3 19 7 17 10 17 5 18 11 18 6 20 12 20 0 21 0 21 4 23 13 23 4 23 13 23 0 21 0 21 2 22 2 22</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_Shape13</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_13" name="qt_gauge_needles_13" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_Shape13">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_13</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_2.dae
new file mode 100644
index 0000000..c74a356
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_2.dae
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:54:33</created>
+ <modified>2018-03-08T09:54:33</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="red_transparent" name="red_transparent">
+ <instance_effect url="#red_transparent-fx"/>
+ </material>
+ <material id="black_solid" name="black_solid">
+ <instance_effect url="#black_solid-fx"/>
+ </material>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="black_solid-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2938931 0.2938931 0.2938931 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03053435 0.03053435 0.03053435 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">black_solid</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="red_transparent-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.56808 0.05568 0.05568 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0.2251908 0.2251908 0.2251908 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">red_transparent</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_2Shape" name="qt_gauge_needles_2Shape">
+ <mesh>
+ <source id="qt_gauge_needles_2Shape-positions" name="qt_gauge_needles_2Shape-positions">
+ <float_array id="qt_gauge_needles_2Shape-positions-array" count="351">-0.158329 0.2163398 -11.77618 -0.158329 0.2163398 5.046935 0.158329 0.2163398 -11.77618 0.158329 0.2163398 5.046935 -0.158329 0.6562276 -11.77618 -0.158329 0.6562276 5.046935 0.158329 0.6562276 5.046935 0.158329 0.6562276 -11.77618 0.5198628 0.2767859 1.599975 0.9888386 0.2767859 1.36102 1.361019 0.2767859 0.9888386 1.599976 0.2767859 0.5198632 1.682312 0.2767859 0 1.599976 0.2767859 -0.5198632 1.361019 0.2767859 -0.9888384 0.9888381 0.2767859 -1.361019 0.5198638 0.2767859 -1.599974 0 0.2767859 -1.682312 -0.5198625 0.2767859 -1.599974 -0.9888382 0.2767859 -1.361019 -1.361019 0.2767859 -0.9888384 -1.599975 0.2767859 -0.5198632 -1.682312 0.2767859 0 -1.599972 0.2767859 0.5198628 -1.36102 0.2767859 0.9888381 -0.9888384 0.2767859 1.361019 -0.5198602 0.2767859 1.599974 0 0.2767859 1.682312 0 0.2767859 0 0.2599311 0 0.7999868 0.4944171 0 0.6805094 0.6805103 0 0.494419 0.7999877 0 0.2599314 0.841156 0 0 0.7999879 0 -0.2599315 0.6805088 0 -0.4944191 0.4944172 0 -0.6805096 0.2599319 0 -0.799987 -0.2599312 0 -0.7999871 -0.4944172 0 -0.6805096 -0.6805104 0 -0.4944192 -0.7999878 0 -0.2599316 -0.841156 0 0 -0.7999878 0 0.2599316 -0.6805125 0 0.4944193 -0.4944208 0 0.6805099 -0.2599317 0 0.7999873 0.2599311 0.843283 0.7999868 0.4944171 0.843283 0.6805094 0.6805103 0.843283 0.494419 0.7999877 0.843283 0.2599314 0.841156 0.843283 0 0.7999879 0.843283 -0.2599315 0.6805088 0.843283 -0.4944191 0.4944172 0.843283 -0.6805096 0.2599319 0.843283 -0.799987 -0.2599312 0.843283 -0.7999871 -0.4944172 0.843283 -0.6805096 -0.6805104 0.843283 -0.4944192 -0.7999878 0.843283 -0.2599316 -0.841156 0.843283 0 -0.7999878 0.843283 0.2599316 -0.6805125 0.843283 0.4944193 -0.4944208 0.843283 0.6805099 -0.2599317 0.843283 0.7999873 0.7218924 0.843283 1.599973 0.988838 0.843283 1.361019 1.361019 0.843283 0.9888381 1.599975 0.843283 0.5198629 1.682312 0.843283 0 1.599976 0.843283 -0.519863 1.361019 0.843283 -0.9888383 0.9888382 0.843283 -1.361019 0.7218902 0.843283 -1.599974 -0.7218927 0.843283 -1.599974 -0.9888383 0.843283 -1.361019 -1.361019 0.843283 -0.9888384 -1.599976 0.843283 -0.5198632 -1.682312 0.843283 0 -1.599976 0.843283 0.5198631 -1.361019 0.843283 0.9888387 -0.9888378 0.843283 1.36102 -0.7218936 0.843283 1.599975 0.7218924 0 1.599973 0.988838 0 1.361019 1.361019 0 0.9888381 1.599975 0 0.5198629 1.682312 0 0 1.599976 0 -0.519863 1.361019 0 -0.9888383 0.9888382 0 -1.361019 0.7218902 0 -1.599974 -0.7218927 0 -1.599974 -0.9888383 0 -1.361019 -1.361019 0 -0.9888384 -1.599976 0 -0.5198632 -1.682312 0 0 -1.599976 0 0.5198631 -1.361019 0 0.9888387 -0.9888378 0 1.36102 -0.7218936 0 1.599975 0.1626649 0 -6.703034 0.1626649 0.843283 -6.703034 -0.1626678 0 -6.703034 -0.1626678 0.843283 -6.703034 0.3253329 0.843283 -5.921231 -0.3253324 0.843283 -5.921231 0.3253329 0 -5.921231 -0.3253324 0 -5.921231 0.1626678 0 3.51614 0.1626678 0.843283 3.51614 -0.1626649 0 3.51614 -0.1626649 0.843283 3.51614 0.3253331 0.843283 3.516148 -0.3253322 0.843283 3.516148 0.3253331 0 3.516148 -0.3253322 0 3.516148</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_2Shape-positions-array" count="117" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_2Shape-normals" name="qt_gauge_needles_2Shape-normals">
+ <float_array id="qt_gauge_needles_2Shape-normals-array" count="807">0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 -0.5877842 0 -0.8090177 -0.4539929 0 -0.8910052 -0.4539929 0 -0.8910052 -0.5877842 0 -0.8090177 -0.8090145 0 -0.5877887 -0.8090145 0 -0.5877887 -0.9510569 0 -0.3090157 -0.9510569 0 -0.3090157 -1 0 0 -1 0 0 -0.9510561 0 0.3090182 -0.9510561 0 0.3090182 -0.8090144 0 0.5877888 -0.8090144 0 0.5877888 -0.5877864 0 0.8090161 -0.5877864 0 0.8090161 -0.4539942 0 0.8910046 -0.4539942 0 0.8910046 0.5877843 0 0.8090177 0.4539934 0 0.891005 0.4539934 0 0.891005 0.5877843 0 0.8090177 0.8090144 0 0.5877888 0.8090144 0 0.5877888 0.951057 0 0.3090154 0.951057 0 0.3090154 1 0 0 1 0 0 0.9510582 0 -0.3090117 0.9510582 0 -0.3090117 0.8090179 0 -0.587784 0.8090179 0 -0.587784 0.5877829 0 -0.8090187 0.5877829 0 -0.8090187 0.4539883 0 -0.8910076 0.4539883 0 -0.8910076 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0.6911029 0 0.7227564 0.6669629 0 0.7450908 0.6669629 0 0.7450908 0.6911029 0 0.7227564 0.8090162 0 0.5877863 0.8090162 0 0.5877863 0.9510564 0 0.3090173 0.9510564 0 0.3090173 1 0 0 1 0 0 0.9510566 0 -0.3090165 0.9510566 0 -0.3090165 0.8090162 0 -0.5877864 0.8090162 0 -0.5877864 0.6911014 0 -0.7227578 0.6911014 0 -0.7227578 0.6669602 0 -0.7450933 0.6669602 0 -0.7450933 -0.691103 0 -0.7227561 -0.6669638 0 -0.74509 -0.6669638 0 -0.74509 -0.691103 0 -0.7227561 -0.8090162 0 -0.5877864 -0.8090162 0 -0.5877864 -0.9510565 0 -0.309017 -0.9510565 0 -0.309017 -1 0 0 -1 0 0 -0.9510567 0 0.3090166 -0.9510567 0 0.3090166 -0.8090162 0 0.5877864 -0.8090162 0 0.5877864 -0.6911036 0 0.7227558 -0.6911036 0 0.7227558 -0.6669655 0 0.7450886 -0.6669655 0 0.7450886 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 -0.9998643 0 0.01647518 -0.9998643 0 0.01647518 -0.9998643 0 0.01647518 -0.9998643 0 0.01647518 0.9998643 0 0.01647459 0.9998643 0 0.01647459 0.9998643 0 0.01647459 0.9998643 0 0.01647459 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0.9958156 0 -0.09138495 0.9958156 0 -0.09138495 0.9958156 0 -0.09138495 0.9958156 0 -0.09138495 -0.9958155 0 -0.09138565 -0.9958155 0 -0.09138565 -0.9958155 0 -0.09138565 -0.9958155 0 -0.09138565 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 -0.9993594 0 -0.0357863 -0.9993594 0 -0.0357863 -0.9993594 0 -0.0357863 -0.9993594 0 -0.0357863 0.9993594 0 -0.03578757 0.9993594 0 -0.03578757 0.9993594 0 -0.03578757 0.9993594 0 -0.03578757 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0.9792493 0 0.2026592 0.9792493 0 0.2026592 0.9792493 0 0.2026592 0.9792493 0 0.2026592 -0.979249 0 0.2026604 -0.979249 0 0.2026604 -0.979249 0 0.2026604 -0.979249 0 0.2026604 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 -0.9790331 0 -0.2037012 -0.9790331 0 -0.2037012 -0.9790331 0 -0.2037012 -0.9790331 0 -0.2037012 0.9790323 0 -0.2037051 0.9790323 0 -0.2037051 0.9790323 0 -0.2037051 0.9790323 0 -0.2037051 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_2Shape-normals-array" count="269" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_2Shape-tangents" name="qt_gauge_needles_2Shape-tangents">
+ <float_array id="qt_gauge_needles_2Shape-tangents-array" count="807">0 0 0.9999999 0.9999999 0 0 0 0 -0.9999999 -0.9999999 0 0 0.9999999 0 0 0 0 0.9999999 -0.9999999 0 0 0 0 -0.9999999 0 0 1 0 0.9999999 0 0 0 -1 0 -0.9999999 0 1 0 0 0 1 0 -1 0 0 0 -1 0 0 0 -1 0 0.9999999 0 0 0 1 0 -0.9999999 0 -1 0 0 0 1 0 1 0 0 0 -1 0 0.9510566 0 -0.3090168 -0.4539901 0 -0.8910068 -0.8090171 0 0.5877852 -0.7071074 0 -0.7071062 -0.8910052 0 -0.453993 -0.9876889 0 -0.1564311 -0.9876889 0 0.1564311 -0.8910055 0 0.4539926 -0.7071064 0 0.7071072 -0.4539911 0 0.8910062 -0.1564342 0 0.9876884 0.1564345 0 0.9876884 0.4539904 0 0.8910066 0.7071069 0 0.7071066 0.891005 0 0.4539934 0.9876888 0 0.1564313 0.9876878 0 -0.1564378 0.8910083 0 -0.4539868 0.7071064 0 -0.7071072 0.4539882 0 -0.8910077 0.1564351 0 -0.9876883 -0.8090177 0 0.5877842 0 1 0 0.8910052 0 -0.4539929 0 -1 0 -0.5877887 0 0.8090145 0 -1 0 -0.3090157 0 0.951057 0 -1 0 0 0 1 0 -1 0 0.3090182 0 0.9510562 0 -1 0 0.5877888 0 0.8090144 0 -0.9999999 0 0.8090161 0 0.5877864 0 -1 0 0.8910046 0 0.4539942 0 -1 0 0.8090177 0 -0.5877842 0 1 0 -0.891005 0 0.4539934 0 -1 0 0.5877888 0 -0.8090145 0 -1 0 0.3090154 0 -0.9510571 0 -1 0 0 0 -0.9999999 0 -1 0 -0.3090117 0 -0.9510582 0 -1 0 -0.587784 0 -0.8090179 0 -1 0 -0.8090187 0 -0.5877829 0 -1 0 -0.8910076 0 -0.4539883 0 -1 0 -0.809016 0 0.5877867 0.453993 0 0.8910053 0.8659838 0 -0.5000721 -0.666963 0 -0.7450908 -0.5877859 0 0.8090166 -0.7071069 0 -0.7071066 -0.3090167 0 0.9510567 -0.8910051 0 -0.4539934 0 0 1 -0.9876888 0 -0.1564316 0.3090167 0 0.9510567 -0.9876889 0 0.1564309 0.5877846 0 0.8090175 -0.8910055 0 0.4539926 0.809016 0 0.5877867 -0.7071064 0 0.7071072 0.8659853 0 0.5000694 -0.6669602 0 0.7450934 0.8090159 0 -0.5877867 -0.4539934 0 -0.8910052 -0.8659838 0 0.500072 0.6669638 0 0.7450901 0.587786 0 -0.8090166 0.7071069 0 0.7071068 0.3090168 0 -0.9510565 0.8910051 0 0.4539934 0 0 -0.9999999 0.9876889 0 0.1564311 -0.3090167 0 -0.9510565 0.9876889 0 -0.1564311 -0.587787 0 -0.8090157 0.8910055 0 -0.4539925 -0.8090184 0 -0.5877835 0.7071064 0 -0.7071071 -0.8659837 0 -0.5000723 0.6669655 0 -0.7450887 -0.7227564 0 0.6911029 0 -1 0 0.7450908 0 -0.6669629 0 0.9999999 0 -0.5877863 0 0.8090163 0 1 0 -0.3090173 0 0.9510564 0 1 0 0 0 1 0 1 0 0.3090165 0 0.9510567 0 1 0 0.5877864 0 0.8090161 0 1 0 0.7227578 0 0.6911014 0 1 0 0.7450934 0 0.6669602 0 1 0 0.7227561 0 -0.691103 0 -0.9999999 0 -0.7450901 0 0.6669639 0 1 0 0.5877864 0 -0.8090161 0 1 0 0.309017 0 -0.9510565 0 1 0 0 0 -0.9999999 0 1 0 -0.3090166 0 -0.9510566 0 1 0 -0.5877864 0 -0.8090161 0 1 0 -0.7227557 0 -0.6911036 0 1 0 -0.7450886 0 -0.6669655 0 0.9999999 0 -0.8090159 0 0.5877867 -0.666963 0 -0.7450908 0.8659838 0 -0.5000721 0.4539929 0 0.8910052 -0.5877858 0 0.8090166 0.7071015 0 0.7071121 -0.3090166 0 0.9510566 0.8910065 0 0.4539905 0 0 0.9999999 0.9876888 0 0.1564316 0.3090167 0 0.9510567 0.9876889 0 -0.1564309 0.5877846 0 0.8090175 0.891004 0 -0.4539955 0.809016 0 0.5877867 0.7071046 0 -0.707109 0.8659853 0 0.5000695 0.4539942 0 -0.8910047 0.8090159 0 -0.5877867 0.6669637 0 0.7450901 -0.8659838 0 0.500072 -0.4539933 0 -0.8910051 0.587786 0 -0.8090166 -0.7071014 0 -0.7071121 0.3090168 0 -0.9510565 -0.8910065 0 -0.4539905 0 0 -1 -0.9876889 0 -0.1564311 -0.3090167 0 -0.9510565 -0.9876889 0 0.1564311 -0.587787 0 -0.8090158 -0.8910099 0 0.4539839 -0.8090184 0 -0.5877835 -0.7071046 0 0.7071089 -0.8659837 0 -0.5000722 -0.4539883 0 0.8910077 0 1 0 -0.01647518 0 -0.9998643 0 -1 0 0.01647518 0 0.9998643 0 -1 0 0.01647459 0 -0.9998643 0 1 0 -0.01647459 0 0.9998643 0.9998642 0 -0.01647518 -0.8659853 0 -0.5000695 -0.9958157 0 0.09138498 -0.9790323 0 0.203705 0.9958156 0 0.09138565 0.8659838 0 -0.500072 -0.9998643 0 -0.01647459 0.9790331 0 0.2037011 0 -1 0 -0.09138496 0 -0.9958157 0 1 0 0.09138496 0 0.9958157 0 1 0 0.09138565 0 -0.9958155 0 -1 0 -0.09138565 0 0.9958155 -0.9958157 0 0.09138497 -0.8659853 0 -0.5000694 0.9998643 0 -0.01647519 -0.9790322 0 0.203705 -0.9998643 0 -0.01647459 0.8659838 0 -0.500072 0.9958156 0 0.09138564 0.9790331 0 0.2037011 0 -1 0 -0.0357863 0 0.9993595 0 1 0 0.0357863 0 -0.9993595 0 1 0 0.03578757 0 0.9993594 0 -1 0 -0.03578757 0 -0.9993594 -0.9792494 0 -0.2026592 -0.8659838 0 0.5000721 0.9993595 0 0.0357863 0 0 -1 -0.9993595 0 0.03578757 0.8659837 0 0.5000722 0.9792491 0 -0.2026604 0 0 -1 0 1 0 -0.2026592 0 0.9792493 0 -1 0 0.2026592 0 -0.9792493 0 -0.9999999 0 0.2026604 0 0.979249 0 0.9999999 0 -0.2026604 0 -0.979249 0.9993595 0 0.0357863 -0.8659838 0 0.5000721 -0.9792493 0 -0.2026592 0 0 -1 0.9792491 0 -0.2026604 0.8659837 0 0.5000723 -0.9993595 0 0.03578757 0 0 -1 0 -1 0 -0.2037012 0 0.9790331 0 1 0 0.2037012 0 -0.9790331 0.2037051 0 0.9790323 0 -1 0 -0.2037051 0 -0.9790323 0 1 0 0 -1 0 0.9999999 0 0 0 1 0 -0.9999999 0 0 -1 0 0 0 -1 0 1 0 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_2Shape-tangents-array" count="269" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_2Shape-binormals" name="qt_gauge_needles_2Shape-binormals">
+ <float_array id="qt_gauge_needles_2Shape-binormals-array" count="807">1 0 0 0 0 -1 -1 0 0 0 0 1 0 0 1 -1 0 0 0 0 -1 1 0 0 0 1 0 0 0 -1 0 -1 0 0 0 1 0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 0 0 0 1 0 -1 0 0 0 -1 0 1 0 1 0 0 0 -1 0 -1 0 0 -0.3090168 0 -0.9510566 -0.8910067 0 0.4539901 0.5877852 0 0.8090171 -0.7071062 0 0.7071074 -0.4539931 0 0.8910053 -0.1564311 0 0.9876889 0.1564311 0 0.9876889 0.4539927 0 0.8910055 0.7071072 0 0.7071064 0.8910062 0 0.4539911 0.9876885 0 0.1564342 0.9876884 0 -0.1564345 0.8910066 0 -0.4539905 0.7071066 0 -0.7071069 0.4539934 0 -0.8910051 0.1564313 0 -0.9876889 -0.1564378 0 -0.9876878 -0.4539869 0 -0.8910084 -0.7071072 0 -0.7071064 -0.8910077 0 -0.4539882 -0.9876883 0 -0.1564351 0 1 0 0.8910053 0 -0.453993 0 -1 0 -0.8090177 0 0.5877842 0 1 0 -0.5877887 0 0.8090145 0 1 0 -0.3090157 0 0.951057 0 1 0 0 0 1 0 1 0 0.3090182 0 0.9510561 0 1 0 0.5877888 0 0.8090144 0 1 0 0.8090162 0 0.5877864 0 1 0 0.8910047 0 0.4539943 0 1 0 -0.8910051 0 0.4539934 0 -1 0 0.8090177 0 -0.5877843 0 1 0 0.5877888 0 -0.8090144 0 1 0 0.3090154 0 -0.9510571 0 1 0 0 0 -1 0 1 0 -0.3090117 0 -0.9510583 0 1 0 -0.587784 0 -0.8090179 0 1 0 -0.8090187 0 -0.5877829 0 1 0 -0.8910077 0 -0.4539883 0.5877867 0 0.809016 0.8910053 0 -0.453993 -0.5000721 0 -0.8659838 -0.7450908 0 0.666963 0.8090166 0 0.5877859 -0.7071066 0 0.7071069 0.9510567 0 0.3090167 -0.4539934 0 0.8910051 1 0 0 -0.1564316 0 0.9876888 0.9510567 0 -0.3090167 0.1564309 0 0.987689 0.8090175 0 -0.5877846 0.4539926 0 0.8910055 0.5877867 0 -0.8090159 0.7071072 0 0.7071064 0.5000694 0 -0.8659853 0.7450934 0 0.6669602 -0.5877867 0 -0.8090159 -0.8910052 0 0.4539934 0.500072 0 0.8659839 0.7450901 0 -0.6669638 -0.8090165 0 -0.5877859 0.7071067 0 -0.7071068 -0.9510567 0 -0.3090169 0.4539934 0 -0.8910051 -1 0 0 0.1564311 0 -0.9876889 -0.9510567 0 0.3090168 -0.1564311 0 -0.9876889 -0.8090158 0 0.587787 -0.4539926 0 -0.8910056 -0.5877835 0 0.8090184 -0.7071072 0 -0.7071065 -0.5000723 0 0.8659838 -0.7450887 0 -0.6669655 0 -1 0 0.7450909 0 -0.666963 0 1 0 -0.7227564 0 0.6911029 0 -1 0 -0.5877863 0 0.8090162 0 -1 0 -0.3090173 0 0.9510565 0 -1 0 0 0 1 0 -1 0 0.3090166 0 0.9510567 0 -1 0 0.5877864 0 0.8090162 0 -1 0 0.7227578 0 0.6911014 0 -1 0 0.7450933 0 0.6669602 0 -1 0 -0.7450901 0 0.6669639 0 1 0 0.7227562 0 -0.6911031 0 -1 0 0.5877864 0 -0.8090162 0 -1 0 0.3090171 0 -0.9510566 0 -1 0 0 0 -1 0 -1 0 -0.3090166 0 -0.9510567 0 -1 0 -0.5877864 0 -0.8090162 0 -1 0 -0.7227558 0 -0.6911036 0 -1 0 -0.7450886 0 -0.6669655 -0.5877867 0 -0.809016 0.7450908 0 -0.666963 0.5000721 0 0.8659838 -0.8910053 0 0.453993 -0.8090166 0 -0.5877858 -0.7071121 0 0.7071015 -0.9510567 0 -0.3090167 -0.4539905 0 0.8910066 -1 0 0 -0.1564316 0 0.9876888 -0.9510567 0 0.3090167 0.1564309 0 0.9876889 -0.8090175 0 0.5877846 0.4539955 0 0.8910041 -0.5877867 0 0.809016 0.707109 0 0.7071046 -0.5000695 0 0.8659853 0.8910047 0 0.4539942 0.5877867 0 0.8090159 -0.7450902 0 0.6669638 -0.500072 0 -0.8659839 0.8910052 0 -0.4539934 0.8090165 0 0.5877859 0.7071121 0 -0.7071014 0.9510567 0 0.3090169 0.4539905 0 -0.8910066 1 0 0 0.1564311 0 -0.9876889 0.9510567 0 -0.3090168 -0.1564311 0 -0.9876889 0.8090158 0 -0.587787 -0.4539839 0 -0.8910099 0.5877835 0 -0.8090184 -0.707109 0 -0.7071047 0.5000722 0 -0.8659837 -0.8910077 0 -0.4539884 -0.01647518 0 -0.9998643 0 -1 0 0.01647518 0 0.9998643 0 1 0 0.01647459 0 -0.9998643 0 1 0 -0.01647459 0 0.9998643 0 -1 0 -0.01647518 0 -0.9998643 -0.5000695 0 0.8659853 0.09138497 0 0.9958156 0.203705 0 0.9790323 0.09138565 0 -0.9958156 -0.500072 0 -0.8659839 -0.01647459 0 0.9998643 0.2037011 0 -0.9790332 -0.09138495 0 -0.9958156 0 1 0 0.09138495 0 0.9958156 0 -1 0 0.09138566 0 -0.9958156 0 -1 0 -0.09138566 0 0.9958156 0 1 0 -0.09138497 0 -0.9958157 0.5000694 0 -0.8659853 0.01647519 0 0.9998643 -0.203705 0 -0.9790324 0.01647459 0 -0.9998643 0.500072 0 0.8659839 -0.09138564 0 0.9958156 -0.2037011 0 0.9790332 -0.0357863 0 0.9993595 0 1 0 0.0357863 0 -0.9993595 0 -1 0 0.03578757 0 0.9993595 0 -1 0 -0.03578757 0 -0.9993595 0 1 0 -0.2026592 0 0.9792494 0.5000721 0 0.8659838 0.0357863 0 -0.9993595 -1 0 0 0.03578757 0 0.9993594 0.5000723 0 -0.8659838 -0.2026604 0 -0.9792491 -1 0 0 -0.2026592 0 0.9792494 0 -1 0 0.2026592 0 -0.9792494 0 1 0 0.2026604 0 0.9792492 0 1 0 -0.2026604 0 -0.9792492 0 -1 0 -0.0357863 0 0.9993595 -0.5000721 0 -0.8659838 0.2026592 0 -0.9792494 1 0 0 0.2026604 0 0.9792491 -0.5000723 0 0.8659838 -0.03578757 0 -0.9993594 1 0 0 -0.2037012 0 0.9790332 0 1 0 0.2037012 0 -0.9790332 0 -1 0 0 -1 0 -0.2037051 0 -0.9790324 0 1 0 0.2037051 0 0.9790324 1 0 0 0 1 0 -1 0 0 0 -1 0 0 -1 0 1 0 0 0 1 0 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_2Shape-binormals-array" count="269" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_2Shape-map1" name="qt_gauge_needles_2Shape-map1">
+ <float_array id="qt_gauge_needles_2Shape-map1-array" count="374">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0.6486026 0.8920339 0.6264089 0.9355915 0.5 0.8375 0.5918415 0.9701589 0.5482839 0.9923526 0.5 1 0.4517161 0.9923526 0.4081585 0.9701589 0.3735911 0.9355915 0.3513974 0.8920339 0.34375 0.84375 0.3513974 0.7954661 0.3735911 0.7519085 0.4081585 0.7173411 0.4517161 0.6951473 0.5 0.6874999 0.5482839 0.6951473 0.5918415 0.717341 0.626409 0.7519085 0.6486027 0.7954661 0.65625 0.84375 0.1 1 0.05 1 0.05 0.75 0.1 0.75 0.15 1 0.15 0.75 0.2 1 0.2 0.75 0.25 1 0.25 0.75 0.3 1 0.3 0.75 0.35 1 0.35 0.75 0.4 1 0.4 0.75 0.45 1 0.45 0.75 0.6000001 1 0.5500001 1 0.5500001 0.75 0.6000001 0.75 0.6500001 1 0.6500001 0.75 0.7000001 1 0.7000001 0.75 0.7500001 1 0.7500001 0.75 0.8000001 1 0.8000001 0.75 0.8500001 1 0.8500001 0.75 0.9000002 1 0.9000002 0.75 0.9500002 1 0.9500002 0.75 0.05 0.5 0.1 0.5 0.15 0.5 0.2 0.5 0.25 0.5 0.3 0.5 0.35 0.5 0.4 0.5 0.45 0.5 0.5500001 0.5 0.6000001 0.5 0.6500001 0.5 0.7000001 0.5 0.7500001 0.5 0.8000001 0.5 0.8500001 0.5 0.9000002 0.5 0.9500002 0.5 0.05 0.25 0.1 0.25 0.15 0.25 0.2 0.25 0.25 0.25 0.3 0.25 0.35 0.25 0.4 0.25 0.45 0.25 0.5500001 0.25 0.6000001 0.25 0.6500001 0.25 0.7000001 0.25 0.7500001 0.25 0.8000001 0.25 0.8500001 0.25 0.9000002 0.25 0.9500002 0.25 0.05 0 0.1 0 0.15 0 0.2 0 0.25 0 0.3 0 0.35 0 0.4 0 0.45 0 0.5500001 0 0.6000001 0 0.6500001 0 0.7000001 0 0.7500001 0 0.8000001 0 0.8500001 0 0.9000002 0 0.9500002 0 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_2Shape-map1-array" count="187" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_2Shape-textangents">
+ <float_array id="qt_gauge_needles_2Shape-textangents-array" count="1260">0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0.7162887 -0.697804 0 0 -0.9999999 0 -0.7162887 0.697804 0.9999999 0 0 -0.30693 0.9517321 0 -0.9999999 0 0 0.30693 -0.9517321 0 0 0 -0.9999999 0 0.7162887 0.697804 0 0 0.9999999 0 -0.7162887 -0.697804 -0.9999999 0 0 0.30693 0.9517321 0 0.9999999 0 0 -0.30693 -0.9517321 0 -0.03756439 0 0.9992942 -0.03162016 0 0.9994999 0 0 1 -0.03162016 0 0.9994999 -0.02278732 0 0.9997404 0 0 1 -0.02278732 0 0.9997404 -0.01191747 0 0.999929 0 0 1 -0.01191747 0 0.999929 0 0 0.9999999 0 0 1 0 0 0.9999999 0.01191714 0 0.999929 0 0 1 0.01191714 0 0.999929 0.02278755 0 0.9997404 0 0 1 0.02278755 0 0.9997404 0.03162001 0 0.9994999 0 0 1 0.03162001 0 0.9994999 0.0375638 0 0.9992943 0 0 1 0.0375638 0 0.9992943 0.03996991 0 0.9992008 0 0 1 0.03996991 0 0.9992008 0.03847883 0 0.9992594 0 0 1 0.03847883 0 0.9992594 0.03310204 0 0.9994519 0 0 1 0.03310204 0 0.9994519 0.02426909 0 0.9997054 0 0 1 0.02426909 0 0.9997054 0.01283554 0 0.9999176 0 0 1 0.01283554 0 0.9999176 0 0 1 0 0 1 0 0 1 -0.01283503 0 0.9999176 0 0 1 -0.01283503 0 0.9999176 -0.02427143 0 0.9997054 0 0 1 -0.02427143 0 0.9997054 -0.0331005 0 0.999452 0 0 1 -0.0331005 0 0.999452 -0.03847761 0 0.9992595 0 0 1 -0.03847761 0 0.9992595 -0.03996966 0 0.9992008 0 0 1 -0.03996966 0 0.9992008 -0.03756439 0 0.9992942 0 0 1 0.8090177 0 -0.5877842 0.8910052 0 -0.4539929 0.8910052 0 -0.4539929 0.8090177 0 -0.5877842 0.5877886 0 -0.8090144 0.8090177 0 -0.5877842 0.8090177 0 -0.5877842 0.5877886 0 -0.8090144 0.3090157 0 -0.9510569 0.5877886 0 -0.8090144 0.5877886 0 -0.8090144 0.3090157 0 -0.9510569 0 0 -0.9999999 0.3090157 0 -0.9510569 0.3090157 0 -0.9510569 0 0 -0.9999999 -0.3090182 0 -0.9510561 0 0 -0.9999999 0 0 -0.9999999 -0.3090182 0 -0.9510561 -0.5877888 0 -0.8090144 -0.3090182 0 -0.9510561 -0.3090182 0 -0.9510561 -0.5877888 0 -0.8090144 -0.8090161 0 -0.5877864 -0.5877888 0 -0.8090144 -0.5877888 0 -0.8090144 -0.8090161 0 -0.5877864 -0.8910046 0 -0.4539942 -0.8090161 0 -0.5877864 -0.8090161 0 -0.5877864 -0.8910046 0 -0.4539942 -0.8090177 0 0.5877842 -0.891005 0 0.4539934 -0.891005 0 0.4539934 -0.8090177 0 0.5877842 -0.5877887 0 0.8090144 -0.8090177 0 0.5877842 -0.8090177 0 0.5877842 -0.5877887 0 0.8090144 -0.3090154 0 0.951057 -0.5877887 0 0.8090144 -0.5877887 0 0.8090144 -0.3090154 0 0.951057 0 0 0.9999999 -0.3090154 0 0.951057 -0.3090154 0 0.951057 0 0 0.9999999 0.3090117 0 0.9510581 0 0 0.9999999 0 0 0.9999999 0.3090117 0 0.9510581 0.5877839 0 0.8090178 0.3090117 0 0.9510581 0.3090117 0 0.9510581 0.5877839 0 0.8090178 0.8090187 0 0.5877829 0.5877839 0 0.8090178 0.5877839 0 0.8090178 0.8090187 0 0.5877829 0.8910076 0 0.4539883 0.8090187 0 0.5877829 0.8090187 0 0.5877829 0.8910076 0 0.4539883 0.7769039 0 -0.6296191 0.8249495 0 -0.5652064 0.7450908 0 -0.6669629 0.7884427 0 -0.6151081 0.5443182 0 -0.8388787 0.7769039 0 -0.6296191 0.7884427 0 -0.6151081 0.6296229 0 -0.7769007 0.2584443 0 -0.9660261 0.5443182 0 -0.8388787 0.6296229 0 -0.7769007 0.3587283 0 -0.9334419 -0.05271994 0 -0.9986093 0.2584443 0 -0.9660261 0.3587283 0 -0.9334419 0.05272064 0 -0.9986092 -0.3587296 0 -0.9334415 -0.05271994 0 -0.9986093 0.05272064 0 -0.9986092 -0.2584446 0 -0.9660259 -0.6296226 0 -0.776901 -0.3587296 0 -0.9334415 -0.2584446 0 -0.9660259 -0.5443177 0 -0.838879 -0.8090166 0 -0.5877856 -0.6296226 0 -0.776901 -0.5443177 0 -0.838879 -0.7690592 0 -0.6391776 -0.8249501 0 -0.5652055 -0.8090166 0 -0.5877856 -0.7690592 0 -0.6391776 -0.7450933 0 -0.6669601 -0.7769039 0 0.6296191 -0.824949 0 0.565207 -0.7450901 0 0.6669637 -0.7884425 0 0.6151084 -0.5443182 0 0.8388786 -0.7769039 0 0.6296191 -0.7884425 0 0.6151084 -0.629623 0 0.7769006 -0.258444 0 0.9660262 -0.5443182 0 0.8388786 -0.629623 0 0.7769006 -0.3587282 0 0.933442 0.05272025 0 0.9986093 -0.258444 0 0.9660262 -0.3587282 0 0.933442 -0.05272021 0 0.9986093 0.3587256 0 0.933443 0.05272025 0 0.9986093 -0.05272021 0 0.9986093 0.2584447 0 0.9660259 0.6296192 0 0.7769037 0.3587256 0 0.933443 0.2584447 0 0.9660259 0.544314 0 0.8388815 0.8090186 0 0.5877831 0.6296192 0 0.7769037 0.544314 0 0.8388815 0.7690591 0 0.6391777 0.82495 0 0.5652057 0.8090186 0 0.5877831 0.7690591 0 0.6391777 0.7450886 0 0.6669654 0.7227563 0 -0.6911029 0.7450908 0 -0.6669629 0.7450908 0 -0.6669629 0.7227563 0 -0.6911029 0.5877863 0 -0.8090162 0.7227563 0 -0.6911029 0.7227563 0 -0.6911029 0.5877863 0 -0.8090162 0.3090173 0 -0.9510564 0.5877863 0 -0.8090162 0.5877863 0 -0.8090162 0.3090173 0 -0.9510564 0 0 -0.9999999 0.3090173 0 -0.9510564 0.3090173 0 -0.9510564 0 0 -0.9999999 -0.3090165 0 -0.9510566 0 0 -0.9999999 0 0 -0.9999999 -0.3090165 0 -0.9510566 -0.5877864 0 -0.8090161 -0.3090165 0 -0.9510566 -0.3090165 0 -0.9510566 -0.5877864 0 -0.8090161 -0.7227578 0 -0.6911014 -0.5877864 0 -0.8090161 -0.5877864 0 -0.8090161 -0.7227578 0 -0.6911014 -0.7450933 0 -0.6669601 -0.7227578 0 -0.6911014 -0.7227578 0 -0.6911014 -0.7450933 0 -0.6669601 -0.7227562 0 0.6911031 -0.7450901 0 0.6669638 -0.7450901 0 0.6669638 -0.7227562 0 0.6911031 -0.5877864 0 0.8090161 -0.7227562 0 0.6911031 -0.7227562 0 0.6911031 -0.5877864 0 0.8090161 -0.309017 0 0.9510564 -0.5877864 0 0.8090161 -0.5877864 0 0.8090161 -0.309017 0 0.9510564 0 0 0.9999999 -0.309017 0 0.9510564 -0.309017 0 0.9510564 0 0 0.9999999 0.3090166 0 0.9510566 0 0 0.9999999 0 0 0.9999999 0.3090166 0 0.9510566 0.5877864 0 0.8090161 0.3090166 0 0.9510566 0.3090166 0 0.9510566 0.5877864 0 0.8090161 0.7227557 0 0.6911036 0.5877864 0 0.8090161 0.5877864 0 0.8090161 0.7227557 0 0.6911035 0.7450885 0 0.6669654 0.7227557 0 0.6911036 0.7227557 0 0.6911035 0.7450885 0 0.6669654 0.7690594 0 -0.6391773 0.7450908 0 -0.6669629 0.8249495 0 -0.5652064 0.8090184 0 -0.5877833 0.5443161 0 -0.8388801 0.7690594 0 -0.6391773 0.8090184 0 -0.5877833 0.6296221 0 -0.7769014 0.2584453 0 -0.9660257 0.5443161 0 -0.8388801 0.6296221 0 -0.7769014 0.3587283 0 -0.9334419 -0.05271994 0 -0.9986093 0.2584453 0 -0.9660257 0.3587283 0 -0.9334419 0.05272064 0 -0.9986092 -0.3587296 0 -0.9334414 -0.05271994 0 -0.9986093 0.05272064 0 -0.9986092 -0.2584457 0 -0.9660258 -0.6296219 0 -0.7769017 -0.3587296 0 -0.9334414 -0.2584457 0 -0.9660258 -0.5443184 0 -0.8388786 -0.7884435 0 -0.6151073 -0.6296219 0 -0.7769017 -0.5443184 0 -0.8388786 -0.7769029 0 -0.6296204 -0.7450933 0 -0.6669601 -0.7884435 0 -0.6151073 -0.7769029 0 -0.6296204 -0.8249501 0 -0.5652055 -0.7690592 0 0.6391776 -0.7450901 0 0.6669637 -0.824949 0 0.565207 -0.8090182 0 0.5877834 -0.5443161 0 0.83888 -0.7690592 0 0.6391776 -0.8090182 0 0.5877834 -0.6296223 0 0.7769014 -0.258445 0 0.966026 -0.5443161 0 0.83888 -0.6296223 0 0.7769014 -0.3587282 0 0.933442 0.05272025 0 0.9986093 -0.258445 0 0.966026 -0.3587282 0 0.933442 -0.05272021 0 0.9986093 0.3587256 0 0.933443 0.05272025 0 0.9986093 -0.05272021 0 0.9986093 0.2584417 0 0.9660268 0.6296217 0 0.7769017 0.3587256 0 0.933443 0.2584417 0 0.9660268 0.5443146 0 0.838881 0.7884433 0 0.6151075 0.6296217 0 0.7769017 0.5443146 0 0.838881 0.7769042 0 0.6296186 0.7450886 0 0.6669654 0.7884433 0 0.6151075 0.7769042 0 0.6296186 0.82495 0 0.5652057 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0.9873434 0 0.1585966 0.5000694 0 -0.8659853 0.9873434 0 0.1585966 0.203705 0 0.9790323 0.5000719 0 0.8659838 0.9873429 0 -0.1586 0.2037011 0 -0.9790331 0.9873429 0 -0.1586 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.5000694 0 0.8659853 -0.9873434 0 -0.1585966 -0.203705 0 -0.9790323 -0.9873434 0 -0.1585966 -0.9873429 0 0.1586 -0.5000719 0 -0.8659838 -0.9873429 0 0.1586 -0.2037011 0 0.9790331 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.866033 0 -0.4999867 -0.5000721 0 -0.8659837 -0.866033 0 -0.4999867 -0.9999999 0 0 -0.5000722 0 0.8659837 -0.8660342 0 0.4999848 -0.9999999 0 0 -0.8660342 0 0.4999848 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0.5000721 0 0.8659837 0.866033 0 0.4999867 0.9999999 0 0 0.866033 0 0.4999867 0.8660342 0 -0.4999848 0.5000722 0 -0.8659837 0.8660342 0 -0.4999848 0.9999999 0 0 0 -0.9999999 0 -0.1871161 0.3952316 0.8993217 0 0.9999999 0 0.1871161 -0.3952316 -0.8993217 0.203705 0 0.9790322 -0.07538403 -0.929006 -0.3623052 -0.203705 0 -0.9790322 0.07538403 0.929006 0.3623052 0 -0.9999999 0 0.7711691 0.6366303 0 0 0.9999999 0 -0.7711691 -0.6366303 0 -0.9999999 0 0 0.09513446 -0.9954644 0 0.9999999 0 0 -0.09513446 0.9954644 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_2Shape-textangents-array" count="420" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_2Shape-texbinormals">
+ <float_array id="qt_gauge_needles_2Shape-texbinormals-array" count="1260">1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 -0.697804 -0.7162887 0 -1 0 0 0.697804 0.7162887 0 1 0 -0.9517321 -0.30693 0 0 -1 0 0.9517321 0.30693 0 0 1 0 0 -0.697804 0.7162887 0 -1 0 0 0.697804 -0.7162887 0 1 0 0.9517321 -0.30693 0 0 -1 0 -0.9517321 0.30693 0 0.9992943 0 0.03756439 0.9995 0 0.03162016 1 0 0 0.9995 0 0.03162016 0.9997404 0 0.02278732 1 0 0 0.9997404 0 0.02278732 0.9999291 0 0.01191747 1 0 0 0.9999291 0 0.01191747 1 0 0 1 0 0 1 0 0 0.9999291 0 -0.01191714 1 0 0 0.9999291 0 -0.01191714 0.9997404 0 -0.02278755 1 0 0 0.9997404 0 -0.02278755 0.9995 0 -0.03162001 1 0 0 0.9995 0 -0.03162001 0.9992943 0 -0.0375638 1 0 0 0.9992943 0 -0.0375638 0.9992009 0 -0.03996991 1 0 0 0.9992009 0 -0.03996991 0.9992595 0 -0.03847883 1 0 0 0.9992595 0 -0.03847883 0.999452 0 -0.03310204 1 0 0 0.999452 0 -0.03310204 0.9997056 0 -0.02426909 1 0 0 0.9997056 0 -0.02426909 0.9999177 0 -0.01283555 1 0 0 0.9999177 0 -0.01283555 1 0 0 1 0 0 1 0 0 0.9999176 0 0.01283503 1 0 0 0.9999176 0 0.01283503 0.9997055 0 0.02427144 1 0 0 0.9997055 0 0.02427144 0.9994521 0 0.03310051 1 0 0 0.9994521 0 0.03310051 0.9992595 0 0.03847761 1 0 0 0.9992595 0 0.03847761 0.9992009 0 0.03996966 1 0 0 0.9992009 0 0.03996966 0.9992943 0 0.03756439 1 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.6296191 0 -0.776904 -0.5652064 0 -0.8249496 -0.666963 0 -0.7450908 -0.6151081 0 -0.7884428 -0.8388788 0 -0.5443183 -0.6296191 0 -0.776904 -0.6151081 0 -0.7884428 -0.7769008 0 -0.6296231 -0.9660262 0 -0.2584444 -0.8388788 0 -0.5443183 -0.7769008 0 -0.6296231 -0.9334421 0 -0.3587284 -0.9986094 0 0.05271994 -0.9660262 0 -0.2584444 -0.9334421 0 -0.3587284 -0.9986093 0 -0.05272065 -0.9334416 0 0.3587297 -0.9986094 0 0.05271994 -0.9986093 0 -0.05272065 -0.9660261 0 0.2584446 -0.7769011 0 0.6296227 -0.9334416 0 0.3587297 -0.9660261 0 0.2584446 -0.8388792 0 0.5443177 -0.5877857 0 0.8090168 -0.7769011 0 0.6296227 -0.8388792 0 0.5443177 -0.6391776 0 0.7690592 -0.5652055 0 0.8249502 -0.5877857 0 0.8090168 -0.6391776 0 0.7690592 -0.6669602 0 0.7450933 0.6296192 0 0.776904 0.5652071 0 0.8249491 0.6669638 0 0.7450902 0.6151084 0 0.7884426 0.8388789 0 0.5443183 0.6296192 0 0.776904 0.6151084 0 0.7884426 0.7769008 0 0.6296231 0.9660263 0 0.258444 0.8388789 0 0.5443183 0.7769008 0 0.6296231 0.9334421 0 0.3587282 0.9986094 0 -0.05272026 0.9660263 0 0.258444 0.9334421 0 0.3587282 0.9986094 0 0.05272021 0.9334431 0 -0.3587256 0.9986094 0 -0.05272026 0.9986094 0 0.05272021 0.9660261 0 -0.2584448 0.7769039 0 -0.6296193 0.9334431 0 -0.3587256 0.9660261 0 -0.2584448 0.8388816 0 -0.544314 0.5877831 0 -0.8090187 0.7769039 0 -0.6296193 0.8388816 0 -0.544314 0.6391777 0 -0.7690592 0.5652057 0 -0.8249501 0.5877831 0 -0.8090187 0.6391777 0 -0.7690592 0.6669655 0 -0.7450886 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.6391773 0 0.7690594 0.666963 0 0.7450908 0.5652064 0 0.8249496 0.5877833 0 0.8090184 0.8388802 0 0.5443161 0.6391773 0 0.7690594 0.5877833 0 0.8090184 0.7769015 0 0.6296222 0.9660259 0 0.2584454 0.8388802 0 0.5443161 0.7769015 0 0.6296222 0.9334421 0 0.3587284 0.9986094 0 -0.05271994 0.9660259 0 0.2584454 0.9334421 0 0.3587284 0.9986093 0 0.05272065 0.9334415 0 -0.3587297 0.9986094 0 -0.05271994 0.9986093 0 0.05272065 0.9660259 0 -0.2584457 0.7769018 0 -0.6296219 0.9334415 0 -0.3587297 0.9660259 0 -0.2584457 0.8388787 0 -0.5443184 0.6151072 0 -0.7884434 0.7769018 0 -0.6296219 0.8388787 0 -0.5443184 0.6296205 0 -0.776903 0.6669602 0 -0.7450933 0.6151072 0 -0.7884434 0.6296205 0 -0.776903 0.5652055 0 -0.8249502 -0.6391776 0 -0.7690593 -0.6669638 0 -0.7450902 -0.5652071 0 -0.8249491 -0.5877835 0 -0.8090183 -0.8388802 0 -0.5443162 -0.6391776 0 -0.7690593 -0.5877835 0 -0.8090183 -0.7769015 0 -0.6296223 -0.966026 0 -0.258445 -0.8388802 0 -0.5443162 -0.7769015 0 -0.6296223 -0.9334421 0 -0.3587282 -0.9986094 0 0.05272026 -0.966026 0 -0.258445 -0.9334421 0 -0.3587282 -0.9986094 0 -0.05272022 -0.9334431 0 0.3587256 -0.9986094 0 0.05272026 -0.9986094 0 -0.05272022 -0.966027 0 0.2584417 -0.7769018 0 0.6296219 -0.9334431 0 0.3587256 -0.966027 0 0.2584417 -0.8388811 0 0.5443147 -0.6151075 0 0.7884433 -0.7769018 0 0.6296219 -0.8388811 0 0.5443147 -0.6296188 0 0.7769043 -0.6669655 0 0.7450886 -0.6151075 0 0.7884433 -0.6296188 0 0.7769043 -0.5652057 0 0.8249501 -0.01647518 0 -0.9998643 -0.01647518 0 -0.9998643 -0.01647518 0 -0.9998643 -0.01647518 0 -0.9998643 0.01647459 0 -0.9998643 0.01647459 0 -0.9998643 0.01647459 0 -0.9998643 0.01647459 0 -0.9998643 0.1585966 0 -0.9873435 -0.8659854 0 -0.5000694 0.1585966 0 -0.9873435 0.9790324 0 -0.203705 0.8659839 0 -0.500072 -0.1586 0 -0.987343 -0.9790332 0 -0.2037012 -0.1586 0 -0.987343 -0.09138495 0 -0.9958157 -0.09138495 0 -0.9958157 -0.09138495 0 -0.9958157 -0.09138495 0 -0.9958157 0.09138565 0 -0.9958156 0.09138565 0 -0.9958156 0.09138565 0 -0.9958156 0.09138565 0 -0.9958156 -0.8659854 0 -0.5000694 0.1585966 0 -0.9873435 0.9790324 0 -0.203705 0.1585966 0 -0.9873435 -0.1586 0 -0.987343 0.8659839 0 -0.500072 -0.1586 0 -0.987343 -0.9790332 0 -0.2037012 -0.0357863 0 0.9993595 -0.0357863 0 0.9993595 -0.0357863 0 0.9993595 -0.0357863 0 0.9993595 0.03578757 0 0.9993594 0.03578757 0 0.9993594 0.03578757 0 0.9993594 0.03578757 0 0.9993594 -0.4999868 0 0.8660331 -0.8659838 0 0.5000721 -0.4999868 0 0.8660331 0 0 1 0.8659837 0 0.5000722 0.4999848 0 0.8660342 0 0 1 0.4999848 0 0.8660343 -0.2026592 0 0.9792494 -0.2026592 0 0.9792494 -0.2026592 0 0.9792494 -0.2026592 0 0.9792494 0.2026604 0 0.9792492 0.2026604 0 0.9792492 0.2026604 0 0.9792492 0.2026604 0 0.9792492 -0.8659838 0 0.5000721 -0.4999868 0 0.8660331 0 0 1 -0.4999868 0 0.8660331 0.4999848 0 0.8660342 0.8659837 0 0.5000722 0.4999848 0 0.8660343 0 0 1 -0.2037012 0 0.9790331 0.08050915 0.9185816 -0.3869449 0.2037012 0 -0.9790331 -0.08050915 -0.9185816 0.3869449 0 -1 0 -0.1892433 0.3700646 -0.909527 0 1 0 0.1892433 -0.3700646 0.909527 1 0 0 -0.6366303 0.7711692 0 -1 0 0 0.6366303 -0.7711692 0 0 -1 0 0.9954644 0.09513446 0 0 1 0 -0.9954644 -0.09513446 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_2Shape-texbinormals-array" count="420" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_2Shape-vertices" name="qt_gauge_needles_2Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_2Shape-positions"/>
+ </vertices>
+ <triangles material="lambert2SG" count="12">
+ <input semantic="VERTEX" source="#qt_gauge_needles_2Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_2Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_2Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_2Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_2Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_2Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_2Shape-texbinormals" offset="3" set="0"/>
+ <p>4 0 8 0 5 1 9 1 7 3 11 3 7 3 11 3 5 1 9 1 6 2 10 2 0 4 4 4 2 5 7 5 1 7 5 7 1 7 5 7 2 5 7 5 3 6 6 6 0 8 0 8 1 9 1 9 4 11 8 11 4 11 8 11 1 9 1 9 5 10 9 10 1 12 1 12 3 13 3 13 5 15 9 15 5 15 9 15 3 13 3 13 6 14 10 14 3 16 3 16 2 17 2 17 6 19 10 19 6 19 10 19 2 17 2 17 7 18 11 18 2 20 2 20 0 21 0 21 7 23 11 23 7 23 11 23 0 21 0 21 4 22 8 22</p>
+ </triangles>
+ <triangles material="lambert3SG" count="20">
+ <input semantic="VERTEX" source="#qt_gauge_needles_2Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_2Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_2Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_2Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_2Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_2Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_2Shape-texbinormals" offset="3" set="0"/>
+ <p>8 24 12 24 9 25 13 25 28 26 14 26 9 25 13 27 10 27 15 28 28 26 14 29 10 27 15 30 11 28 16 31 28 26 14 32 11 28 16 33 12 29 17 34 28 26 14 35 12 29 17 36 13 30 18 37 28 26 14 38 13 30 18 39 14 31 19 40 28 26 14 41 14 31 19 42 15 32 20 43 28 26 14 44 15 32 20 45 16 33 21 46 28 26 14 47 16 33 21 48 17 34 22 49 28 26 14 50 17 34 22 51 18 35 23 52 28 26 14 53 18 35 23 54 19 36 24 55 28 26 14 56 19 36 24 57 20 37 25 58 28 26 14 59 20 37 25 60 21 38 26 61 28 26 14 62 21 38 26 63 22 39 27 64 28 26 14 65 22 39 27 66 23 40 28 67 28 26 14 68 23 40 28 69 24 41 29 70 28 26 14 71 24 41 29 72 25 42 30 73 28 26 14 74 25 42 30 75 26 43 31 76 28 26 14 77 26 43 31 78 27 44 32 79 28 26 14 80 27 44 32 81 8 24 12 82 28 26 14 83</p>
+ </triangles>
+ <triangles material="lambert4SG" count="168">
+ <input semantic="VERTEX" source="#qt_gauge_needles_2Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_2Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_2Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_2Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_2Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_2Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_2Shape-texbinormals" offset="3" set="0"/>
+ <p>30 45 33 84 29 46 34 85 48 48 36 87 48 48 36 87 29 46 34 85 47 47 35 86 31 49 37 88 30 45 33 89 49 50 38 91 49 50 38 91 30 45 33 89 48 48 36 90 32 51 39 92 31 49 37 93 50 52 40 95 50 52 40 95 31 49 37 93 49 50 38 94 33 53 41 96 32 51 39 97 51 54 42 99 51 54 42 99 32 51 39 97 50 52 40 98 34 55 43 100 33 53 41 101 52 56 44 103 52 56 44 103 33 53 41 101 51 54 42 102 35 57 45 104 34 55 43 105 53 58 46 107 53 58 46 107 34 55 43 105 52 56 44 106 36 59 47 108 35 57 45 109 54 60 48 111 54 60 48 111 35 57 45 109 53 58 46 110 37 61 49 112 36 59 47 113 55 62 50 115 55 62 50 115 36 59 47 113 54 60 48 114 39 63 51 116 38 64 52 117 57 66 54 119 57 66 54 119 38 64 52 117 56 65 53 118 40 67 55 120 39 63 51 121 58 68 56 123 58 68 56 123 39 63 51 121 57 66 54 122 41 69 57 124 40 67 55 125 59 70 58 127 59 70 58 127 40 67 55 125 58 68 56 126 42 71 59 128 41 69 57 129 60 72 60 131 60 72 60 131 41 69 57 129 59 70 58 130 43 73 61 132 42 71 59 133 61 74 62 135 61 74 62 135 42 71 59 133 60 72 60 134 44 75 63 136 43 73 61 137 62 76 64 139 62 76 64 139 43 73 61 137 61 74 62 138 45 77 65 140 44 75 63 141 63 78 66 143 63 78 66 143 44 75 63 141 62 76 64 142 46 79 67 144 45 77 65 145 64 80 68 147 64 80 68 147 45 77 65 145 63 78 66 146 48 81 36 148 47 82 35 149 66 84 70 151 66 84 70 151 47 82 35 149 65 83 69 150 49 85 38 152 48 81 36 153 67 86 71 155 67 86 71 155 48 81 36 153 66 84 70 154 50 87 40 156 49 85 38 157 68 88 72 159 68 88 72 159 49 85 38 157 67 86 71 158 51 89 42 160 50 87 40 161 69 90 73 163 69 90 73 163 50 87 40 161 68 88 72 162 52 91 44 164 51 89 42 165 70 92 74 167 70 92 74 167 51 89 42 165 69 90 73 166 53 93 46 168 52 91 44 169 71 94 75 171 71 94 75 171 52 91 44 169 70 92 74 170 54 95 48 172 53 93 46 173 72 96 76 175 72 96 76 175 53 93 46 173 71 94 75 174 54 95 48 177 72 96 76 178 55 97 50 176 55 97 50 176 72 96 76 178 73 98 77 179 57 99 54 180 56 100 53 181 75 102 79 183 75 102 79 183 56 100 53 181 74 101 78 182 58 103 56 184 57 99 54 185 76 104 80 187 76 104 80 187 57 99 54 185 75 102 79 186 59 105 58 188 58 103 56 189 77 106 81 191 77 106 81 191 58 103 56 189 76 104 80 190 60 107 60 192 59 105 58 193 78 108 82 195 78 108 82 195 59 105 58 193 77 106 81 194 61 109 62 196 60 107 60 197 79 110 83 199 79 110 83 199 60 107 60 197 78 108 82 198 62 111 64 200 61 109 62 201 80 112 84 203 80 112 84 203 61 109 62 201 79 110 83 202 63 113 66 204 62 111 64 205 81 114 85 207 81 114 85 207 62 111 64 205 80 112 84 206 63 113 66 209 81 114 85 210 64 115 68 208 64 115 68 208 81 114 85 210 82 116 86 211 66 117 70 212 65 118 69 213 84 120 88 215 84 120 88 215 65 118 69 213 83 119 87 214 67 121 71 216 66 117 70 217 85 122 89 219 85 122 89 219 66 117 70 217 84 120 88 218 68 123 72 220 67 121 71 221 86 124 90 223 86 124 90 223 67 121 71 221 85 122 89 222 69 125 73 224 68 123 72 225 87 126 91 227 87 126 91 227 68 123 72 225 86 124 90 226 70 127 74 228 69 125 73 229 88 128 92 231 88 128 92 231 69 125 73 229 87 126 91 230 71 129 75 232 70 127 74 233 89 130 93 235 89 130 93 235 70 127 74 233 88 128 92 234 72 131 76 236 71 129 75 237 90 132 94 239 90 132 94 239 71 129 75 237 89 130 93 238 73 133 77 240 72 131 76 241 91 134 95 243 91 134 95 243 72 131 76 241 90 132 94 242 75 135 79 244 74 136 78 245 93 138 97 247 93 138 97 247 74 136 78 245 92 137 96 246 76 139 80 248 75 135 79 249 94 140 98 251 94 140 98 251 75 135 79 249 93 138 97 250 77 141 81 252 76 139 80 253 95 142 99 255 95 142 99 255 76 139 80 253 94 140 98 254 78 143 82 256 77 141 81 257 96 144 100 259 96 144 100 259 77 141 81 257 95 142 99 258 79 145 83 260 78 143 82 261 97 146 101 263 97 146 101 263 78 143 82 261 96 144 100 262 80 147 84 264 79 145 83 265 98 148 102 267 98 148 102 267 79 145 83 265 97 146 101 266 81 149 85 268 80 147 84 269 99 150 103 271 99 150 103 271 80 147 84 269 98 148 102 270 82 151 86 272 81 149 85 273 100 152 104 275 100 152 104 275 81 149 85 273 99 150 103 274 83 154 87 277 29 155 105 278 84 153 88 276 84 153 88 276 29 155 105 278 30 156 106 279 85 157 89 280 84 153 88 281 31 158 107 283 31 158 107 283 84 153 88 281 30 156 106 282 86 159 90 284 85 157 89 285 32 160 108 287 32 160 108 287 85 157 89 285 31 158 107 286 87 161 91 288 86 159 90 289 33 162 109 291 33 162 109 291 86 159 90 289 32 160 108 290 88 163 92 292 87 161 91 293 34 164 110 295 34 164 110 295 87 161 91 293 33 162 109 294 89 165 93 296 88 163 92 297 35 166 111 299 35 166 111 299 88 163 92 297 34 164 110 298 90 167 94 300 89 165 93 301 36 168 112 303 36 168 112 303 89 165 93 301 35 166 111 302 91 169 95 304 90 167 94 305 37 170 113 307 37 170 113 307 90 167 94 305 36 168 112 306 92 172 96 309 38 173 114 310 93 171 97 308 93 171 97 308 38 173 114 310 39 174 115 311 94 175 98 312 93 171 97 313 40 176 116 315 40 176 116 315 93 171 97 313 39 174 115 314 95 177 99 316 94 175 98 317 41 178 117 319 41 178 117 319 94 175 98 317 40 176 116 318 96 179 100 320 95 177 99 321 42 180 118 323 42 180 118 323 95 177 99 321 41 178 117 322 97 181 101 324 96 179 100 325 43 182 119 327 43 182 119 327 96 179 100 325 42 180 118 326 98 183 102 328 97 181 101 329 44 184 120 331 44 184 120 331 97 181 101 329 43 182 119 330 99 185 103 332 98 183 102 333 45 186 121 335 45 186 121 335 98 183 102 333 44 184 120 334 100 187 104 336 99 185 103 337 46 188 122 339 46 188 122 339 99 185 103 337 45 186 121 338 37 189 123 340 55 190 124 341 101 192 126 343 101 192 126 343 55 190 124 341 102 191 125 342 56 193 127 344 38 194 128 345 104 196 130 347 104 196 130 347 38 194 128 345 103 195 129 346 73 198 132 349 105 199 133 350 55 197 131 348 55 197 131 348 105 199 133 350 102 200 134 351 74 201 135 352 56 202 136 353 106 204 138 355 106 204 138 355 56 202 136 353 104 203 137 354 73 205 139 356 91 206 140 357 105 208 142 359 105 208 142 359 91 206 140 357 107 207 141 358 92 209 143 360 74 210 144 361 108 212 146 363 108 212 146 363 74 210 144 361 106 211 145 362 91 213 147 364 37 214 148 365 107 216 150 367 107 216 150 367 37 214 148 365 101 215 149 366 92 218 152 369 108 219 153 370 38 217 151 368 38 217 151 368 108 219 153 370 103 220 154 371 47 221 155 372 29 222 156 373 110 224 158 375 110 224 158 375 29 222 156 373 109 223 157 374 46 225 159 376 64 226 160 377 111 228 162 379 111 228 162 379 64 226 160 377 112 227 161 378 47 230 164 381 110 231 165 382 65 229 163 380 65 229 163 380 110 231 165 382 113 232 166 383 64 233 167 384 82 234 168 385 112 236 170 387 112 236 170 387 82 234 168 385 114 235 169 386 83 237 171 388 65 238 172 389 115 240 174 391 115 240 174 391 65 238 172 389 113 239 173 390 82 241 175 392 100 242 176 393 114 244 178 395 114 244 178 395 100 242 176 393 116 243 177 394 29 245 179 396 83 246 180 397 109 248 182 399 109 248 182 399 83 246 180 397 115 247 181 398 46 250 184 401 111 251 185 402 100 249 183 400 100 249 183 400 111 251 185 402 116 252 186 403 104 253 130 404 103 254 154 405 106 256 138 407 106 256 138 407 103 254 154 405 108 255 146 406 102 257 134 408 105 258 142 409 101 260 126 411 101 260 126 411 105 258 142 409 107 259 150 410 110 261 158 412 109 262 182 413 113 264 166 415 113 264 166 415 109 262 182 413 115 263 174 414 112 265 170 416 114 266 178 417 111 268 162 419 111 268 162 419 114 266 178 417 116 267 186 418</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_2Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_2" name="qt_gauge_needles_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_2Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#red_transparent"/>
+ <instance_material symbol="lambert3SG" target="#black_solid"/>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_3.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_3.dae
new file mode 100644
index 0000000..6c40aa4
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_3.dae
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:54:44</created>
+ <modified>2018-03-08T09:54:44</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="red_transparent" name="red_transparent">
+ <instance_effect url="#red_transparent-fx"/>
+ </material>
+ <material id="black_solid" name="black_solid">
+ <instance_effect url="#black_solid-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="black_solid-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2938931 0.2938931 0.2938931 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03053435 0.03053435 0.03053435 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">black_solid</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="red_transparent-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.56808 0.05568 0.05568 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0.2251908 0.2251908 0.2251908 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">red_transparent</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_8Shape3" name="qt_gauge_needles_8Shape3">
+ <mesh>
+ <source id="qt_gauge_needles_8Shape3-positions" name="qt_gauge_needles_8Shape3-positions">
+ <float_array id="qt_gauge_needles_8Shape3-positions-array" count="570">-0.06937027 0 -8 -0.06936836 0 -0.1618332 0.06937027 0 -8 0.06936836 0 -0.1618332 -0.06937027 0.0958578 -8 -0.06936836 0.7002875 -0.1618332 0.06936836 0.7002875 -0.1618332 0.06937027 0.0958578 -8 -0.06936836 0.3020315 -6.797693 -0.06937027 0.20611 -7.38449 0.06936646 0.20611 -7.38449 0.06936836 0.3020315 -6.797693 0.06937027 0 -7.387154 0.06936836 0 -6.796488 -0.06936646 0 -7.387154 -0.06936836 0 -6.796488 -0.06936836 0.4607714 -5.615142 -0.06937027 0.3898765 -6.203689 0.06937027 0.3898765 -6.203689 0.06936836 0.4607714 -5.615142 0.06936836 0 -6.205704 0.06936836 0 -5.615038 -0.06936836 0 -6.205704 -0.06936836 0 -5.615038 -0.06936836 0.6027073 -3.879921 -0.06937027 0.5675001 -4.470063 0.06937027 0.5675001 -4.470063 0.06936836 0.6027073 -3.879921 0.06936836 0 -4.470912 0.06936836 0 -3.880246 -0.06936836 0 -4.470912 -0.06936836 0 -3.880246 0.2393169 0 0.9709425 0.4647236 0 0.8854566 0.6631241 0 0.7485113 0.8229847 0 0.5680652 0.9350166 0 0.3546051 0.9927101 0 0.1205367 0.9927101 0 -0.1205367 0.9350166 0 -0.3546051 0.8229828 0 -0.568065 0.6631241 0 -0.7485111 0.4647236 0 -0.8854564 0.2393169 0 -0.9709422 0 0 -1 -0.239315 0 -0.9709422 -0.4647236 0 -0.8854563 -0.6631222 0 -0.748511 -0.8229847 0 -0.5680649 -0.9350166 0 -0.354605 -0.9927082 0 -0.1205367 -0.9927082 0 0.1205367 -0.9350166 0 0.3546049 -0.8229828 0 0.5680648 -0.6631222 0 0.7485108 -0.4647236 0 0.885456 -0.239315 0 0.9709418 0 0 1 0 0 0 0 0.6268091 0 0.2393169 0.5966012 0.9709425 0.2320328 0.6268091 0.941397 0.4647236 0.5966012 0.8854566 0.4505825 0.6268091 0.8585125 0.6631241 0.5966012 0.7485113 0.6429443 0.6268091 0.7257342 0.8229847 0.5966012 0.5680652 0.7979412 0.6268091 0.550779 0.9350166 0.5966012 0.3546051 0.9065647 0.6268091 0.3438146 0.9927101 0.5966012 0.1205367 0.9625015 0.6268091 0.1168689 0.9927101 0.5966012 -0.1205367 0.9625015 0.6268091 -0.1168688 0.9350166 0.5966012 -0.3546051 0.9065647 0.6268091 -0.3438146 0.8229828 0.5966012 -0.568065 0.7979412 0.6268091 -0.5507789 0.6631241 0.5966012 -0.7485111 0.6429443 0.6268091 -0.7257341 0.4647236 0.5966012 -0.8854564 0.4505806 0.6268091 -0.8585122 0.2393169 0.5966012 -0.9709422 0.2320328 0.6268091 -0.9413967 0 0.5966012 -1 0 0.6268091 -0.9695706 -0.239315 0.5966012 -0.9709422 -0.2320328 0.6268091 -0.9413966 -0.4647236 0.5966012 -0.8854563 -0.4505825 0.6268091 -0.8585122 -0.6631222 0.5966012 -0.748511 -0.6429443 0.6268091 -0.725734 -0.8229847 0.5966012 -0.5680649 -0.7979412 0.6268091 -0.5507789 -0.9350166 0.5966012 -0.354605 -0.9065647 0.6268091 -0.3438144 -0.9927082 0.5966012 -0.1205367 -0.9625015 0.6268091 -0.1168688 -0.9927082 0.5966012 0.1205367 -0.9625015 0.6268091 0.1168688 -0.9350166 0.5966012 0.3546049 -0.9065628 0.6268091 0.3438144 -0.8229828 0.5966012 0.5680648 -0.7979393 0.6268091 0.5507787 -0.6631222 0.5966012 0.7485108 -0.6429443 0.6268091 0.7257338 -0.4647236 0.5966012 0.885456 -0.4505825 0.6268091 0.8585118 -0.239315 0.5966012 0.9709418 -0.2320328 0.6268091 0.9413962 0 0.5966012 1 0 0.6268091 0.9695702 0.1506271 0.6268091 0.6111158 0.1567745 0.6131297 0.6360592 0.1629238 0.6268091 0.6610026 0.2924995 0.6268091 0.5573106 0.3044376 0.6131297 0.5800579 0.3163776 0.6268091 0.6028051 0.4173737 0.6268091 0.4711166 0.4344082 0.6131297 0.4903457 0.4514446 0.6268091 0.5095749 0.5179901 0.6268091 0.3575429 0.5391331 0.6131297 0.3721364 0.560276 0.6268091 0.3867299 0.5885048 0.6268091 0.2231901 0.612524 0.6131297 0.2322999 0.6365452 0.6268091 0.2414097 0.6248169 0.6268091 0.0758664 0.6503181 0.6131297 0.07896298 0.6758213 0.6268091 0.08205956 0.624815 0.6268091 -0.0758664 0.6503201 0.6131297 -0.07896298 0.6758213 0.6268091 -0.08205956 0.5885048 0.6268091 -0.2231902 0.612524 0.6131297 -0.2322999 0.6365452 0.6268091 -0.2414097 0.517992 0.6268091 -0.3575428 0.5391312 0.6131297 -0.3721364 0.5602741 0.6268091 -0.3867299 0.4173717 0.6268091 -0.4711165 0.4344082 0.6131297 -0.4903456 0.4514446 0.6268091 -0.5095748 0.2924995 0.6268091 -0.5573105 0.3044376 0.6131297 -0.5800577 0.3163776 0.6268091 -0.602805 0.1506252 0.6268091 -0.6111156 0.1567745 0.6131297 -0.636059 0.1629219 0.6268091 -0.6610025 0 0.6268091 -0.629405 0 0.6131297 -0.6550949 0 0.6268091 -0.6807848 -0.1506271 0.6268091 -0.6111156 -0.1567745 0.6131297 -0.636059 -0.1629238 0.6268091 -0.6610024 -0.2924995 0.6268091 -0.5573105 -0.3044376 0.6131297 -0.5800577 -0.3163757 0.6268091 -0.602805 -0.4173737 0.6268091 -0.4711164 -0.4344082 0.6131297 -0.4903456 -0.4514446 0.6268091 -0.5095747 -0.5179901 0.6268091 -0.3575428 -0.5391331 0.6131297 -0.3721362 -0.5602741 0.6268091 -0.3867298 -0.5885048 0.6268091 -0.2231901 -0.612524 0.6131297 -0.2322998 -0.6365452 0.6268091 -0.2414096 -0.6248169 0.6268091 -0.0758664 -0.6503181 0.6131297 -0.07896298 -0.6758213 0.6268091 -0.08205956 -0.624815 0.6268091 0.07586634 -0.6503181 0.6131297 0.07896292 -0.6758213 0.6268091 0.0820595 -0.5885029 0.6268091 0.2231899 -0.612524 0.6131297 0.2322997 -0.6365452 0.6268091 0.2414095 -0.5179901 0.6268091 0.3575426 -0.5391312 0.6131297 0.3721361 -0.5602741 0.6268091 0.3867296 -0.4173717 0.6268091 0.4711161 -0.4344082 0.6131297 0.4903453 -0.4514427 0.6268091 0.5095744 -0.2924995 0.6268091 0.5573101 -0.3044376 0.6131297 0.5800574 -0.3163776 0.6268091 0.6028047 -0.1506271 0.6268091 0.6111153 -0.1567745 0.6131297 0.6360587 -0.1629238 0.6268091 0.6610021 0 0.6268091 0.6294046 0 0.6131297 0.6550945 0 0.6268091 0.6807844</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape3-positions-array" count="190" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape3-normals" name="qt_gauge_needles_8Shape3-normals">
+ <float_array id="qt_gauge_needles_8Shape3-normals-array" count="1158">0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 0.9856135 -0.1690147 0 0.9881055 -0.1537774 0 0.9881055 -0.1537774 0 0.9856135 -0.1690147 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 0 0.9911104 -0.133042 0 0.9947922 -0.1019243 0 0.9947922 -0.1019243 0 0.9911104 -0.133042 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 0 0.9966713 -0.08152476 0 0.9995254 -0.03080725 0 0.9995254 -0.03080725 0 0.9966713 -0.08152476 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0.9843334 -0.1763172 0 0.9843333 -0.1763171 0 -0.9999999 0 0 -1 0 -1 0 0 -1 0 0 1 0 0 1 0 0 0 0.9996557 -0.02623569 0 0.9996557 -0.02623569 1 0 0 0.9999999 0 0 0 -1 0 0 -1 0 -1 0 0 -0.9999999 0 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0.1686022 0.7096909 0.684041 0.1685977 0.7096909 0.6840421 0 0.7096897 0.7045145 0 0.7096897 0.7045144 0.3274027 0.7096913 0.6238155 0.3274033 0.7096913 0.6238152 0.4671776 0.7096933 0.5273332 0.4671762 0.7096934 0.5273345 0.5798022 0.709692 0.4002084 0.5798022 0.709692 0.4002085 0.6587323 0.7096896 0.2498248 0.6587324 0.7096896 0.2498245 0.6993736 0.7096937 0.08491947 0.6993737 0.7096937 0.08491975 0.6993736 0.7096937 -0.08491955 0.6993735 0.7096937 -0.08491968 0.6587365 0.7096846 -0.2498277 0.6587366 0.7096846 -0.2498276 0.5798094 0.7096822 -0.4002152 0.5798108 0.7096822 -0.4002132 0.4671783 0.7096924 -0.5273341 0.4671768 0.7096924 -0.5273353 0.3274022 0.7096968 -0.6238095 0.327399 0.7096968 -0.6238111 0.168603 0.7096934 -0.6840383 0.1685986 0.7096934 -0.6840394 0 0.7096905 -0.7045136 0 0.7096905 -0.7045135 -0.1686014 0.7096892 -0.684043 -0.1686016 0.7096891 -0.6840429 -0.3274052 0.7096865 -0.6238197 -0.3274058 0.7096864 -0.6238194 -0.4671819 0.7096851 -0.5273405 -0.467183 0.7096851 -0.5273395 -0.5798055 0.7096873 -0.4002116 -0.5798053 0.7096873 -0.400212 -0.6587379 0.7096841 -0.2498257 -0.6587381 0.7096841 -0.2498252 -0.69939 0.7096775 -0.08492056 -0.69939 0.7096775 -0.0849201 -0.6993848 0.7096825 0.08492158 -0.6993847 0.7096825 0.08492127 -0.6587276 0.7096942 0.2498238 -0.6587272 0.7096943 0.2498253 -0.5798016 0.7096929 0.4002075 -0.5798014 0.7096929 0.4002078 -0.4671822 0.7096862 0.5273387 -0.4671837 0.7096863 0.5273376 -0.3274047 0.7096868 0.6238193 -0.3274054 0.7096868 0.6238191 -0.1686013 0.7096891 0.6840432 -0.1686014 0.709689 0.6840431 0.2393143 0 0.9709421 0.4647233 0 0.8854559 0.4647233 0 0.8854559 0.2393143 0 0.9709421 0.6631224 0 0.748511 0.6631224 0 0.748511 0.822985 0 0.568063 0.822985 0 0.568063 0.935016 0 0.3546054 0.935016 0 0.3546054 0.9927086 0 0.1205383 0.9927086 0 0.1205383 0.9927086 0 -0.1205384 0.9927086 0 -0.1205384 0.9350147 0 -0.354609 0.9350147 0 -0.354609 0.8229849 0 -0.5680631 0.8229849 0 -0.5680631 0.6631243 0 -0.7485093 0.6631243 0 -0.7485093 0.4647232 0 -0.8854559 0.4647232 0 -0.8854559 0.2393157 0 -0.9709418 0.2393157 0 -0.9709418 0 0 -1 0 0 -1 -0.2393159 0 -0.9709417 -0.2393159 0 -0.9709417 -0.4647234 0 -0.8854558 -0.4647234 0 -0.8854558 -0.6631223 0 -0.748511 -0.6631223 0 -0.748511 -0.8229831 0 -0.5680658 -0.8229831 0 -0.5680658 -0.9350172 0 -0.3546019 -0.9350172 0 -0.3546019 -0.9927092 0 -0.1205345 -0.9927092 0 -0.1205345 -0.992709 0 0.1205345 -0.992709 0 0.1205345 -0.9350159 0 0.3546056 -0.9350159 0 0.3546056 -0.822983 0 0.5680659 -0.822983 0 0.5680659 -0.6631241 0 0.7485093 -0.6631241 0 0.7485093 -0.4647231 0 0.8854561 -0.4647231 0 0.8854561 -0.2393155 0 0.9709418 -0.2393155 0 0.9709418 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0.1124796 0.8826634 0.4563479 0.1124782 0.8826635 0.4563482 0.2184235 0.8826618 0.4161722 0.2184246 0.8826617 0.4161717 -0.112476 0.8826663 -0.4563434 -0.1124792 0.8826663 -0.4563426 -0.2184196 0.8826687 -0.4161596 -0.2184171 0.8826687 -0.416161 0.3116728 0.8826617 0.3518071 0.3116742 0.8826617 0.3518058 -0.3116651 0.8826689 -0.3517962 -0.3116638 0.8826689 -0.3517973 0.3868092 0.8826623 0.2669944 0.3868087 0.8826622 0.266995 -0.3867993 0.8826686 -0.266988 -0.3867989 0.8826685 -0.2669886 0.4394718 0.8826581 0.1666706 0.4394722 0.8826582 0.1666697 -0.4394541 0.8826687 -0.1666614 -0.439454 0.8826687 -0.1666618 0.4665823 0.8826614 0.05665373 0.4665823 0.8826615 0.05665334 -0.4665755 0.882665 -0.05665362 -0.4665754 0.8826651 -0.05665394 0.466569 0.8826686 -0.05665142 0.4665689 0.8826687 -0.05665215 -0.4665815 0.8826619 0.05665316 -0.4665815 0.8826619 0.05665272 0.4394709 0.8826587 -0.1666697 0.4394714 0.8826587 -0.1666687 -0.4394588 0.8826653 0.1666669 -0.4394585 0.8826653 0.1666677 0.3868212 0.8826532 -0.2670071 0.3868237 0.8826531 -0.2670034 -0.3868001 0.8826683 0.2669878 -0.3867996 0.8826683 0.2669885 0.311675 0.882661 -0.3518071 0.3116737 0.882661 -0.3518083 -0.3116665 0.8826689 0.3517949 -0.3116654 0.8826689 0.3517958 0.2184205 0.8826652 -0.4161666 0.2184217 0.8826652 -0.416166 -0.2184203 0.8826672 0.4161623 -0.2184177 0.8826672 0.4161637 0.112481 0.8826648 -0.456345 0.1124779 0.8826648 -0.4563457 -0.1124782 0.8826646 0.4563462 -0.1124796 0.8826646 0.4563459 0 0.8826648 -0.4700029 0 0.8826649 -0.470003 0 0.8826644 0.4700036 0 0.8826644 0.4700037 -0.1124783 0.8826641 -0.4563469 -0.1124798 0.8826642 -0.4563466 0.1124805 0.8826649 0.4563451 0.1124775 0.8826649 0.4563459 -0.2184233 0.8826618 -0.4161723 -0.2184244 0.8826618 -0.4161717 0.2184208 0.8826647 0.4161672 0.218422 0.8826649 0.4161666 -0.3116727 0.8826619 -0.351807 -0.3116741 0.8826618 -0.3518057 0.3116713 0.8826635 0.351804 0.31167 0.8826635 0.3518052 -0.386809 0.8826624 -0.2669942 -0.3868085 0.8826624 -0.266995 0.3868081 0.8826622 0.2669962 0.3868092 0.8826622 0.2669946 -0.439472 0.8826581 -0.1666707 -0.4394723 0.882658 -0.1666698 0.4394592 0.8826656 0.1666644 0.439459 0.8826656 0.1666649 -0.4665894 0.8826578 -0.05665334 -0.4665895 0.8826578 -0.05665275 0.4665685 0.882669 0.05665139 0.4665684 0.882669 0.05665153 -0.4665755 0.882665 0.05665421 -0.4665755 0.882665 0.05665456 0.4665687 0.8826688 -0.0566516 0.4665687 0.8826688 -0.05665174 -0.4394593 0.8826654 0.1666649 -0.4394591 0.8826655 0.1666654 0.4394534 0.8826686 -0.1666637 0.4394531 0.8826686 -0.1666644 -0.386808 0.8826626 0.266995 -0.386809 0.8826625 0.2669935 0.3868038 0.8826656 -0.2669912 0.3868033 0.8826656 -0.266992 -0.3116719 0.882664 0.3518026 -0.3116707 0.8826639 0.3518036 0.3116713 0.8826637 -0.3518035 0.3116729 0.8826637 -0.3518021 -0.2184221 0.8826637 0.416169 -0.2184234 0.8826637 0.4161683 0.218422 0.8826662 -0.4161635 0.2184196 0.8826662 -0.4161648 -0.1124789 0.8826635 0.4563482 -0.1124803 0.8826635 0.4563478 0.1124798 0.8826663 -0.4563425 0.1124768 0.8826663 -0.4563432 0 0.8826642 0.4700041 0 0.8826643 0.4700041 0 0.8826648 -0.4700031 0 0.8826647 -0.4700031</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape3-normals-array" count="386" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape3-tangents" name="qt_gauge_needles_8Shape3-tangents">
+ <float_array id="qt_gauge_needles_8Shape3-tangents-array" count="1158">0.9999999 0 0 0 1 0 -0.9999999 0 0 0 -1 0 -1 0 0 0 1 0 1 0 0 0 -1 0 0 -0.003987932 -0.999992 0 -0.9869014 0.1613248 0 -0.01292218 0.9999164 0 1 0 0 0.1690147 0.9856135 0.9999999 0 0 0 -0.1537774 -0.9881055 -1 0 0 0 -0.01292218 0.9999164 0 -0.9869014 0.1613249 0 -0.003987932 -0.999992 0 1 0 0 0 1 -1 0 0 0 0 -1 1 0 0 0 -2.26636e-4 -0.9999999 0 -0.9928231 0.1195931 0 -0.005168526 0.9999866 0 1 0 0 0.1330419 0.9911103 1 0 0 0 -0.1019243 -0.9947921 -1 0 0 0 -0.005168526 0.9999866 0 -0.992823 0.1195931 0 -2.26636e-4 -1 0 1 0 0 0 1 -1 0 0 0 0 -1 1 0 0 0 5.3957e-4 -0.9999998 0 -0.9982252 0.05955299 0 -0.001496468 0.9999989 0 1 0 0 0.08152476 0.9966714 1 0 0 0 -0.03080725 -0.9995254 -1 0 0 0 -0.001496469 0.9999989 0 -0.9982251 0.05955299 0 5.3957e-4 -0.9999999 0 1 0 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0.1763172 0.9843335 -1 0 0 1 0 0 0 0 1 0 0 1 0 -0.9843335 0.1763172 0 1 0 0 0 1 1 0 0 0 -0.02623569 -0.9996557 0 0 -0.9999999 0 -0.9996558 0.02623569 -0.9999999 0 0 0 0 -1 0 0.9999999 0 0 0 -1 -0.885456 0 0.4647233 -0.3546064 0 -0.9350157 0.9709415 0 -0.2393167 -0.7485103 0 0.6631231 -0.5680647 0 0.822984 -0.354605 0 0.9350163 -0.1205366 0 0.9927089 0.1205366 0 0.9927089 0.3546049 0 0.9350163 0.5680655 0 0.8229834 0.7485102 0 0.6631233 0.885456 0 0.4647234 0.9709416 0 0.2393168 1 0 0 0.970942 0 -0.239315 0.8854559 0 -0.4647234 0.7485111 0 -0.6631224 0.5680645 0 -0.8229841 0.3546048 0 -0.9350163 0.1205368 0 -0.9927089 -0.1205368 0 -0.9927089 -0.3546048 0 -0.9350163 -0.5680653 0 -0.8229835 -0.748511 0 -0.6631224 -0.8854558 0 -0.4647235 -0.9709421 0 -0.2393151 -1 0 0 -0.08585149 0.7019117 -0.707071 -0.9709353 0 0.239342 0.0858519 -0.7019132 0.7070694 1 0 0 -0.2525733 0.7019117 -0.665978 -0.8854581 0 0.4647191 -0.4046121 0.7019093 -0.5861847 -0.748503 0 0.6631316 -0.5331389 0.7019109 -0.4723177 -0.5680637 0 0.8229845 -0.6306776 0.7019134 -0.3310036 -0.354607 0 0.9350153 -0.691569 0.7019089 -0.1704588 -0.1205354 0 0.992709 -0.7122666 0.7019091 0 0.1205363 0 0.9927089 -0.69156 0.7019184 0.1704567 0.354608 0 0.9350151 -0.6306687 0.7019208 0.3310046 0.5680772 0 0.8229753 -0.5331421 0.7019101 0.4723152 0.7485025 0 0.663132 -0.4046138 0.7019061 0.5861871 0.885446 0 0.4647423 -0.252574 0.7019095 0.66598 0.9709351 0 0.2393431 -0.08585367 0.7019123 0.7070701 1 0 0 0.0858542 0.7019137 0.7070688 0.9709421 0 -0.2393145 0.2525698 0.7019164 0.6659744 0.885458 0 -0.4647192 0.40461 0.7019178 0.5861758 0.7485169 0 -0.6631157 0.5331326 0.7019154 0.4723181 0.5680631 0 -0.822985 0.6306728 0.7019188 0.3310012 0.3546062 0 -0.9350159 0.6915543 0.7019257 0.1704497 0.1205381 0 -0.9927087 0.7122554 0.7019204 0 -0.1205393 0 -0.9927085 0.6915708 0.7019082 -0.1704538 -0.3545983 0 -0.9350188 0.630678 0.7019101 -0.3310096 -0.568063 0 -0.8229852 0.5331344 0.7019166 -0.4723142 -0.7485165 0 -0.6631162 0.4046109 0.7019159 -0.5861776 -0.8854584 0 -0.4647187 0.2525706 0.7019139 -0.6659768 -0.9709421 0 -0.2393144 0.9709421 0 -0.2393143 0 1 0 -0.8854559 0 0.4647233 0 -0.9999999 0 0 1 0 -0.748511 0 0.6631225 0 1 0 -0.568063 0 0.8229851 0 1 0 -0.3546054 0 0.9350161 0 1 0 -0.1205383 0 0.9927087 0 1 0 0.1205384 0 0.9927087 0 1 0 0.354609 0 0.9350147 0 1 0 0.5680631 0 0.822985 0 1 0 0.7485093 0 0.6631243 0 1 0 0.885456 0 0.4647232 0 1 0 0.9709418 0 0.2393157 0 1 0 1 0 0 0 1 0 0.9709418 0 -0.2393159 0 1 0 0.8854559 0 -0.4647234 0 1 0 0.748511 0 -0.6631223 0 1 0 0.5680658 0 -0.8229831 0 1 0 0.354602 0 -0.9350173 0 1 0 0.1205345 0 -0.9927092 0 1 0 -0.1205345 0 -0.9927092 0 1 0 -0.3546056 0 -0.935016 0 1 0 -0.5680659 0 -0.822983 0 1 0 -0.7485095 0 -0.6631241 0 1 0 -0.8854561 0 -0.4647231 0 1 0 -0.9709418 0 -0.2393155 0 1 0 -1 0 0 0.9709416 0 -0.2393166 -0.3546053 0 -0.9350161 -0.8854557 0 0.4647236 -0.5680631 0 -0.822985 -0.7485143 0 -0.6631188 -0.8854536 0 -0.4647279 -0.9709418 0 -0.2393161 -1 0 0 -0.9709446 0 0.2393042 -0.8854585 0 0.4647182 -0.7485015 0 0.6631331 -0.568069 0 0.8229809 -0.3546011 0 0.9350176 -0.1205389 0 0.9927086 0.1205348 0 0.9927091 0.3546049 0 0.9350162 0.5680633 0 0.8229849 0.7485141 0 0.6631188 0.8854535 0 0.4647281 0.9709418 0 0.2393162 1 0 0 0.9709417 0 -0.2393163 0.8854586 0 -0.4647183 0.7485075 0 -0.6631264 0.5680688 0 -0.822981 0.3546053 0 -0.9350161 0.1205359 0 -0.992709 0.9709435 0 -0.239309 -0.3546031 0 -0.9350169 -0.885457 0 0.4647213 0.3546053 0 0.9350161 -0.568066 0 -0.822983 -0.748512 0 0.6631212 -0.7485107 0 -0.6631228 -0.5680663 0 0.8229828 -0.8854557 0 -0.4647239 -0.354605 0 0.9350162 -0.9709421 0 -0.2393145 -0.1205367 0 0.9927088 -0.9999999 0 0 0.1205365 0 0.9927089 -0.9709421 0 0.2393145 0.3546048 0 0.9350163 -0.8854557 0 0.4647239 0.5680632 0 0.8229851 -0.7485104 0 0.663123 0.748512 0 0.6631213 -0.5680619 0 0.8229859 0.8854596 0 0.4647164 -0.3546058 0 0.9350159 0.9709419 0 0.2393154 -0.1205369 0 0.9927089 1 0 0 0.1205371 0 0.9927089 0.9709435 0 -0.2393091 0.3546028 0 0.935017 0.8854541 0 -0.4647267 0.5680658 0 0.822983 0.748512 0 -0.6631213 0.7485104 0 0.663123 0.5680632 0 -0.8229849 0.8854557 0 0.4647238 0.3546047 0 -0.9350163 0.9709421 0 0.2393146 0.1205365 0 -0.9927089 1 0 0 -0.1205367 0 -0.9927089 0.9709402 0 -0.2393223 -0.354607 0 -0.9350154 0.8854556 0 -0.464724 -0.5680662 0 -0.8229828 0.7485144 0 -0.6631185 -0.7485088 0 -0.6631249 0.5680655 0 -0.8229833 -0.8854569 0 -0.4647216 0.3546028 0 -0.935017 -0.9709434 0 -0.2393092 0.1205371 0 -0.9927089 -1 0 0 0.3135006 -0.467329 0.8266323 0.9709463 0 -0.2392974 -0.3135 0.4673325 -0.8266306 -0.8854632 0 0.4647093 0.3135017 0.4673236 0.826635 0.9709326 0 -0.239353 -0.3135026 -0.4673193 -0.8266371 -0.8854399 0 0.464754 -0.5022155 0.4673325 -0.7275849 -0.7485251 0 0.6631064 -0.5022205 -0.4673192 -0.7275901 -0.7484983 0 0.6631367 -0.6617435 0.4673313 -0.5862567 -0.5680556 0 0.8229902 -0.661749 -0.4673197 -0.5862597 -0.5680569 0 0.8229892 -0.7828142 0.4673395 -0.4108476 -0.3546165 0 0.9350119 -0.7828233 -0.4673194 -0.4108531 -0.3545985 0 0.9350187 -0.8583916 0.467333 -0.2115743 -0.1205417 0 0.9927083 -0.8583952 -0.4673264 -0.2115746 -0.1205354 0 0.992709 -0.8840888 0.4673189 0 0.120528 0 0.9927099 -0.8840818 -0.4673321 0 0.1205415 0 0.9927083 -0.8583863 0.4673386 0.2115836 0.354617 0 0.9350116 -0.8583956 -0.4673255 0.2115747 0.3545994 0 0.9350183 -0.7828055 0.4673486 0.4108539 0.5681096 0 0.8229527 -0.7828184 -0.4673207 0.410861 0.5680562 0 0.8229898 -0.6617477 0.4673337 0.5862501 0.7484975 0 0.6631377 -0.6617542 -0.467319 0.5862545 0.7484971 0 0.6631379 -0.5022174 0.467326 0.7275879 0.8854633 0 0.4647093 -0.5022196 -0.4673222 0.7275888 0.8854401 0 0.4647537 -0.3135011 0.4673268 0.8266335 0.9709328 0 0.2393521 -0.3134977 -0.4673272 0.8266345 0.9709461 0 0.2392983 -0.1065643 0.4673264 0.8776389 1 0 0 -0.1065646 -0.4673273 0.8776383 1 0 0 0.1065646 0.4673279 0.877638 0.9709461 0 -0.2392983 0.1065638 -0.4673264 0.8776389 0.9709328 0 -0.2393519 0.3134997 0.4673324 0.8266308 0.8854633 0 -0.4647092 0.3135042 -0.4673269 0.8266321 0.8854634 0 -0.4647093 0.5022154 0.4673323 0.7275851 0.7485259 0 -0.6631055 0.502213 -0.4673288 0.7275891 0.7484974 0 -0.6631379 0.6617437 0.4673311 0.5862567 0.5680556 0 -0.8229901 0.6617491 -0.4673321 0.5862498 0.5680836 0 -0.8229709 0.7828141 0.4673397 0.4108477 0.3546165 0 -0.9350118 0.7828164 -0.4673249 0.4108599 0.354599 0 -0.9350185 0.8583881 0.4673398 0.2115736 0.120541 0 -0.9927083 0.8583989 -0.4673189 0.2115756 0.1205347 0 -0.992709 0.8840849 0.4673261 0 -0.1205357 0 -0.992709 0.8840886 -0.4673193 0 -0.1205348 0 -0.992709 0.8583955 0.4673255 -0.2115754 -0.3545984 0 -0.9350187 0.8583987 -0.4673194 -0.2115756 -0.3545989 0 -0.9350185 0.7828136 0.4673311 -0.4108582 -0.5680827 0 -0.8229715 0.7828161 -0.4673256 -0.4108598 -0.5680565 0 -0.8229896 0.6617497 0.4673283 -0.5862523 -0.7484971 0 -0.663138 0.6617449 -0.4673288 -0.5862571 -0.7485251 0 -0.6631066 0.5022164 0.4673289 -0.7275867 -0.8854632 0 -0.4647095 0.5022239 -0.4673239 -0.7275848 -0.8854398 0 -0.4647541 0.3135007 0.4673291 -0.8266323 -0.9709461 0 -0.2392984 0.3135016 -0.467324 -0.8266347 -0.9709329 0 -0.2393519 0.1065642 0.4673278 -0.8776381 -1 0 0 0.1065634 -0.4673269 -0.8776388 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape3-tangents-array" count="386" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape3-binormals" name="qt_gauge_needles_8Shape3-binormals">
+ <float_array id="qt_gauge_needles_8Shape3-binormals-array" count="1158">0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 0 1 0 0 0 -1 0 -1 0 0 0 -0.9999921 0.003987933 0 0.1613248 0.9869014 0 0.9999165 0.01292218 0 0 -1 1 0 0 0 -0.1537774 -0.9881055 -1 0 0 0 0.1690147 0.9856136 0 -0.9999165 -0.01292218 0 -0.1613249 -0.9869014 0 0.9999921 -0.003987933 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0 1 0 -1 2.26636e-4 0 0.1195931 0.992823 0 0.9999866 0.005168526 0 0 -1 1 0 0 0 -0.1019243 -0.9947922 -1 0 0 0 0.133042 0.9911104 0 -0.9999866 -0.005168526 0 -0.1195931 -0.992823 0 1 -2.26636e-4 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0 1 0 -0.9999999 -5.3957e-4 0 0.059553 0.9982252 0 0.9999989 0.001496468 0 0 -1 1 0 0 0 -0.03080725 -0.9995254 -1 0 0 0 0.08152476 0.9966713 0 -0.9999989 -0.001496469 0 -0.059553 -0.9982252 0 0.9999999 5.3957e-4 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0 1 1 0 0 0 0.1763172 0.9843335 0 0 1 -1 0 0 0 1 0 0 0.1763172 0.9843335 0 0 1 0 -1 0 0 -0.0262357 -0.9996558 -1 0 0 0 1 0 0 -0.02623569 -0.9996558 0 0 -1 1 0 0 0 0 -1 0 -1 0 -0.4647233 0 -0.885456 0.9350157 0 -0.3546064 0.2393167 0 0.9709415 -0.6631231 0 -0.7485103 -0.822984 0 -0.5680647 -0.9350163 0 -0.354605 -0.9927089 0 -0.1205366 -0.9927089 0 0.1205366 -0.9350162 0 0.3546049 -0.8229834 0 0.5680655 -0.6631233 0 0.7485102 -0.4647234 0 0.885456 -0.2393168 0 0.9709416 0 0 1 0.239315 0 0.970942 0.4647234 0 0.8854559 0.6631223 0 0.7485111 0.8229841 0 0.5680645 0.9350163 0 0.3546048 0.9927089 0 0.1205368 0.9927089 0 -0.1205368 0.9350163 0 -0.3546048 0.8229836 0 -0.5680653 0.6631224 0 -0.748511 0.4647235 0 -0.8854558 0.2393151 0 -0.970942 0 0 -1 -0.9819384 0.06048777 0.1792719 0.1698806 -0.7045131 0.6890587 0.996308 0.06048466 -0.06092746 0 0.7045144 -0.7096897 -0.9105022 0.06048386 0.4090569 0.3298045 -0.7045128 0.6284034 -0.7861515 0.06048696 0.6150668 0.470627 -0.7045107 0.5312014 -0.6161107 0.06048417 0.7853339 0.584066 -0.7045122 0.4031496 -0.4102651 0.06048386 0.9099584 0.6635702 -0.7045145 0.2516622 -0.1805793 0.06048675 0.9816989 0.7045196 -0.7045104 0.08554193 0.0596058 0.06048536 0.9963878 0.7045194 -0.7045103 -0.0855433 0.2963291 0.06048486 0.9531687 0.6635656 -0.7045196 -0.2516604 0.5158275 0.06048361 0.8545547 0.5840443 -0.704522 -0.4031639 0.7053397 0.0604886 0.706284 0.4706271 -0.7045116 -0.5312 0.8538709 0.06048297 0.5169588 0.3298413 -0.7045073 -0.6283902 0.9527746 0.06048403 0.2975941 0.1698812 -0.7045107 -0.689061 0.9963077 0.06048513 0.06092949 0 -0.7045136 -0.7096905 0.9819382 0.06048484 -0.1792735 -0.169838 -0.7045149 -0.6890674 0.9105023 0.06048545 -0.4090565 -0.3298022 -0.7045178 -0.6283991 0.78615 0.06048346 -0.6150691 -0.4705981 -0.704519 -0.5312161 0.6161129 0.06048676 -0.785332 -0.5840635 -0.7045168 -0.4031451 0.4102637 0.06048478 -0.909959 -0.6635651 -0.70452 -0.2516602 0.1805722 0.0604836 -0.9817003 -0.7045028 -0.7045267 -0.08554531 -0.05960819 0.06048586 -0.9963877 -0.7045079 -0.7045217 0.08554593 -0.2963234 0.06048828 -0.9531703 -0.6635802 -0.7045099 0.2516491 -0.5158249 0.06048218 -0.8545564 -0.5840675 -0.7045112 0.4031492 -0.7053428 0.06048562 -0.7062812 -0.470598 -0.7045179 0.5312175 -0.8538713 0.06048681 -0.5169576 -0.3298018 -0.7045172 0.6283997 -0.9527758 0.06048463 -0.2975901 -0.1698379 -0.704515 0.6890672 0 1 0 -0.885456 0 0.4647233 0 -1 0 0.9709423 0 -0.2393143 -0.748511 0 0.6631224 0 -1 0 -0.568063 0 0.8229851 0 -1 0 -0.3546054 0 0.9350161 0 -1 0 -0.1205383 0 0.9927087 0 -1 0 0.1205384 0 0.9927087 0 -1 0 0.354609 0 0.9350147 0 -1 0 0.5680631 0 0.8229851 0 -1 0 0.7485093 0 0.6631243 0 -1 0 0.885456 0 0.4647233 0 -1 0 0.9709419 0 0.2393157 0 -1 0 1 0 0 0 -1 0 0.9709418 0 -0.2393159 0 -1 0 0.885456 0 -0.4647234 0 -1 0 0.7485111 0 -0.6631224 0 -1 0 0.5680658 0 -0.8229832 0 -1 0 0.3546019 0 -0.9350173 0 -1 0 0.1205345 0 -0.9927092 0 -1 0 -0.1205345 0 -0.9927092 0 -1 0 -0.3546056 0 -0.935016 0 -1 0 -0.5680659 0 -0.8229831 0 -1 0 -0.7485094 0 -0.6631241 0 -1 0 -0.8854561 0 -0.4647231 0 -1 0 -0.9709419 0 -0.2393155 0 -1 0 -1 0 0 0 -1 0 -0.2393166 0 -0.9709416 -0.9350161 0 0.3546053 0.4647237 0 0.8854558 -0.822985 0 0.5680631 -0.6631188 0 0.7485143 -0.4647279 0 0.8854536 -0.2393161 0 0.9709418 0 0 1 0.2393042 0 0.9709447 0.4647183 0 0.8854586 0.6631331 0 0.7485015 0.8229809 0 0.568069 0.9350178 0 0.3546011 0.9927086 0 0.1205389 0.9927092 0 -0.1205348 0.9350163 0 -0.354605 0.822985 0 -0.5680633 0.6631188 0 -0.7485141 0.4647281 0 -0.8854535 0.2393162 0 -0.9709418 0 0 -1 -0.2393163 0 -0.9709417 -0.4647183 0 -0.8854586 -0.6631264 0 -0.7485075 -0.8229811 0 -0.5680689 -0.9350161 0 -0.3546053 -0.992709 0 -0.1205359 -0.239309 0 -0.9709435 -0.935017 0 0.3546031 0.4647213 0 0.885457 0.9350161 0 -0.3546053 -0.822983 0 0.568066 0.6631212 0 0.7485121 -0.6631228 0 0.7485107 0.8229828 0 0.5680663 -0.4647239 0 0.8854557 0.9350163 0 0.354605 -0.2393145 0 0.9709422 0.9927089 0 0.1205367 0 0 1 0.992709 0 -0.1205365 0.2393145 0 0.9709422 0.9350163 0 -0.3546048 0.4647239 0 0.8854557 0.8229849 0 -0.5680631 0.663123 0 0.7485104 0.6631213 0 -0.748512 0.8229859 0 0.5680619 0.4647164 0 -0.8854596 0.9350159 0 0.3546058 0.2393154 0 -0.970942 0.9927089 0 0.1205369 0 0 -1 0.9927089 0 -0.1205371 -0.2393092 0 -0.9709435 0.9350171 0 -0.3546028 -0.4647268 0 -0.8854542 0.8229831 0 -0.5680659 -0.6631213 0 -0.748512 0.663123 0 -0.7485104 -0.8229849 0 -0.5680632 0.4647238 0 -0.8854557 -0.9350164 0 -0.3546047 0.2393146 0 -0.9709421 -0.9927089 0 -0.1205365 0 0 -1 -0.9927089 0 0.1205367 -0.2393223 0 -0.9709402 -0.9350154 0 0.354607 -0.464724 0 -0.8854556 -0.8229828 0 0.5680662 -0.6631185 0 -0.7485144 -0.6631249 0 0.7485088 -0.8229833 0 -0.5680655 -0.4647216 0 0.8854569 -0.9350171 0 -0.3546028 -0.2393092 0 0.9709434 -0.9927089 0 -0.1205371 0 0 1 0.9429029 0.05008611 -0.3292806 -0.2112153 0.4700054 -0.85702 -0.924126 0.0500855 0.3787909 0.4101773 -0.4700087 0.7815666 0.9429029 -0.05008777 -0.3292801 -0.2112778 -0.4700001 -0.8570073 -0.9241261 -0.05008666 0.3787906 0.4102319 0.4699957 0.7815458 -0.8066223 0.05008545 0.5889413 0.5852942 -0.4700087 0.6606985 -0.8066223 -0.05008514 0.5889415 0.5853341 0.4699954 0.6606727 -0.6422415 0.05008771 0.7648641 0.726424 -0.4700078 0.5013989 -0.6422418 -0.0500858 0.764864 0.7264282 0.4699962 0.5014039 -0.4405297 0.05008385 0.8963399 0.8252947 -0.4700156 0.3130081 -0.4405313 -0.05008462 0.8963391 0.8253121 0.4699957 0.3129919 -0.2132247 0.05008576 0.9757186 0.8762253 -0.4700093 0.1063988 -0.2132253 -0.05008433 0.9757186 0.8762298 0.4700025 0.1063914 0.02646486 0.05008988 0.9983941 0.8762342 -0.4699958 -0.1063839 0.02647584 -0.05008604 0.998394 0.8762258 0.4700084 -0.1063988 0.2646473 0.05008215 0.9630439 0.825295 -0.4700145 -0.3130092 0.2646373 -0.05008774 0.9630465 0.8253095 0.4700021 -0.3129898 0.4874269 0.05008766 0.8717261 0.7263737 -0.4700249 -0.5014556 0.4874228 -0.05008194 0.8717287 0.7264284 0.4699965 -0.501403 0.6818714 0.05008802 0.7297552 0.5853299 -0.4700102 -0.6606659 0.681869 -0.05008589 0.7297575 0.5853346 0.4699953 -0.6606722 0.836702 0.05008601 0.5453634 0.4101789 -0.4700023 -0.7815697 0.8367008 -0.05008467 0.5453655 0.4102312 0.4699984 -0.7815445 0.9429025 0.0500841 0.3292818 0.2112774 -0.4700029 -0.857006 0.942904 -0.05008514 0.3292774 0.2112156 0.4700035 -0.8570209 0.9943058 0.05008798 0.09405931 0 -0.470003 -0.8826649 0.9943058 -0.05008578 0.09406079 0 0.4700037 -0.8826644 0.9879234 0.05008487 -0.146625 -0.2112155 -0.4700041 -0.8570205 0.9879233 -0.0500874 -0.1466252 -0.2112774 0.4700029 -0.857006 0.9241262 0.0500855 -0.3787905 -0.4101774 -0.4700086 -0.7815667 0.9241253 -0.05008345 -0.3787931 -0.4101787 0.4700029 -0.7815693 0.8066224 0.05008553 -0.5889412 -0.5852932 -0.4700086 -0.6606994 0.8066245 -0.05008806 -0.5889381 -0.5853321 0.4700053 -0.6606674 0.6422415 0.05008762 -0.7648642 -0.7264241 -0.4700076 -0.5013989 0.6422365 -0.05008165 -0.7648688 -0.7264019 0.470008 -0.5014308 0.4405299 0.05008387 -0.8963398 -0.8252946 -0.4700157 -0.3130081 0.4405383 -0.05008852 -0.8963354 -0.8253093 0.4700016 -0.3129908 0.2132234 0.05008743 -0.9757187 -0.8762216 -0.4700163 -0.1063983 0.2132255 -0.05008502 -0.9757184 -0.8762336 0.4699953 -0.1063918 -0.026476 0.05008714 -0.9983939 -0.8762298 -0.4700027 0.1063914 -0.02647438 -0.05008503 -0.998394 -0.8762335 0.4699956 0.1063918 -0.2646371 0.05008557 -0.9630466 -0.8253095 -0.4700018 0.3129898 -0.2646364 -0.05008625 -0.9630468 -0.8253125 0.4699959 0.312991 -0.4874243 0.0500841 -0.8717277 -0.7264027 -0.4700072 0.5014303 -0.4874237 -0.05008283 -0.8717282 -0.7264263 0.4700016 0.5014014 -0.6818711 0.05008686 -0.7297556 -0.5853319 -0.4700047 0.6606681 -0.6818758 -0.05008463 -0.7297513 -0.585295 0.470005 0.6607004 -0.8367022 0.05008587 -0.5453631 -0.4101782 -0.4700052 0.7815684 -0.8366978 -0.05008676 -0.5453699 -0.4102308 0.4700004 0.7815437 -0.9429029 0.0500868 -0.3292803 -0.2112153 -0.4700055 0.8570199 -0.9429024 -0.05008438 -0.3292819 -0.2112778 0.4700001 0.8570073 -0.9943058 0.05008503 -0.09406076 0 -0.4700041 0.8826643 -0.994306 -0.05008457 -0.09406008 0 0.4700032 0.8826649</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape3-binormals-array" count="386" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape3-map1" name="qt_gauge_needles_8Shape3-map1">
+ <float_array id="qt_gauge_needles_8Shape3-map1-array" count="542">0.5255726 0 0 0 0.07852725 1 0 1 0.07818751 0 0 0 0.07852725 0 0.07818769 1 0 1 0.1533914 0 0.2291749 1 0.2289179 1 0.1533914 1 0.1535451 1 0.2289179 0 0.1535451 0 0.2291749 0 0.3042622 0 0.4503523 1 0.450244 1 0.3042622 1 0.3042755 1 0.450244 0 0.3042755 0 0.4503524 0 0.5256431 0 1 1 1 1 0.5256431 1 0.5256017 1 1 0 0.5256017 0 1 0 0.6383526 0.08363697 0.6517098 0.1188569 0.5 0.15 0.6169549 0.05263703 0.5887602 0.0276587 0.555407 0.01015362 0.5188339 0.001139149 0.4811661 0.001139149 0.444593 0.01015362 0.4112398 0.0276587 0.3830451 0.05263703 0.3616474 0.08363696 0.3482903 0.1188569 0.3437499 0.15625 0.3482903 0.1936431 0.3616475 0.228863 0.3830452 0.2598629 0.4112399 0.2848412 0.444593 0.3023463 0.4811661 0.3113608 0.5188339 0.3113608 0.555407 0.3023463 0.5887601 0.2848412 0.6169548 0.2598629 0.6383525 0.228863 0.6517097 0.1936431 0.65625 0.15625 0.6249998 0.6703221 0.6248534 0.6884398 0.6155307 0.6884398 0.6153844 0.6703221 0.3751463 0.6884398 0.375 0.6703221 0.3846154 0.6703221 0.3844691 0.6884398 0.3847617 0.6884398 0.3942308 0.6703221 0.3940845 0.6884398 0.3943771 0.6884398 0.4038462 0.6703221 0.4036999 0.6884398 0.4039925 0.6884398 0.4134616 0.6703221 0.4133153 0.6884398 0.4136079 0.6884398 0.423077 0.6703221 0.4229306 0.6884398 0.4232233 0.6884398 0.4326923 0.6703221 0.432546 0.6884399 0.4328386 0.6884398 0.4423077 0.6703221 0.4421615 0.6884398 0.442454 0.6884398 0.4519231 0.6703221 0.4517768 0.6884398 0.4520694 0.6884398 0.4615385 0.6703221 0.4613923 0.6884398 0.4616848 0.6884398 0.4711539 0.6703221 0.4710076 0.6884398 0.4713002 0.6884398 0.4807693 0.6703221 0.480623 0.6884398 0.4809156 0.6884398 0.4903847 0.6703221 0.4902384 0.6884398 0.490531 0.6884398 0.5000001 0.6703221 0.4998538 0.6884398 0.5001463 0.6884398 0.5096154 0.6703221 0.5094692 0.6884398 0.5097617 0.6884398 0.5192308 0.6703221 0.5190845 0.6884398 0.5193771 0.6884398 0.5288461 0.6703221 0.5286999 0.6884399 0.5289924 0.6884398 0.5384615 0.6703221 0.5383152 0.6884398 0.5386078 0.6884398 0.5480769 0.6703221 0.5479306 0.6884398 0.5482231 0.6884398 0.5576922 0.6703221 0.5575459 0.6884398 0.5578385 0.6884398 0.5673076 0.6703221 0.5671613 0.6884398 0.5674539 0.6884398 0.576923 0.6703221 0.5767766 0.6884398 0.5770692 0.6884398 0.5865383 0.6703221 0.586392 0.6884398 0.5866846 0.6884398 0.5961537 0.6703221 0.5960073 0.6884398 0.5962999 0.6884398 0.605769 0.6703221 0.6056228 0.6884398 0.6059153 0.6884398 0.6152381 0.6884398 0.375 0.3125 0.3846154 0.3125 0.3942308 0.3125 0.4038462 0.3125 0.4134616 0.3125 0.423077 0.3125 0.4326923 0.3125 0.4423077 0.3125 0.4519231 0.3125 0.4615385 0.3125 0.4711539 0.3125 0.4807693 0.3125 0.4903847 0.3125 0.5000001 0.3125 0.5096154 0.3125 0.5192308 0.3125 0.5288461 0.3125 0.5384615 0.3125 0.5480769 0.3125 0.5576922 0.3125 0.5673076 0.3125 0.576923 0.3125 0.5865383 0.3125 0.5961537 0.3125 0.605769 0.3125 0.6153844 0.3125 0.6249998 0.3125 0.6457604 0.8794317 0.6329269 0.9132703 0.5 0.8375 0.6123683 0.9430544 0.5852793 0.9670532 0.5532341 0.9838719 0.5180953 0.9925328 0.4819048 0.9925328 0.4467659 0.9838719 0.4147206 0.9670535 0.3876315 0.9430547 0.3670733 0.9132702 0.3542398 0.8794316 0.3498772 0.8435049 0.3542397 0.8075782 0.3670729 0.7737394 0.3876316 0.7439553 0.4147208 0.7199566 0.4467658 0.7031379 0.4819047 0.6944767 0.5180953 0.6944767 0.5532342 0.7031379 0.5852793 0.7199565 0.6123685 0.7439551 0.6329269 0.7737395 0.6457605 0.8075782 0.6501225 0.8435049 0.6517097 0.8811431 0.6383525 0.916363 0.6383525 0.916363 0.6517097 0.8811431 0.6169548 0.9473629 0.6169548 0.9473629 0.5887601 0.9723412 0.5887601 0.9723413 0.555407 0.9898463 0.555407 0.9898463 0.5188339 0.9988608 0.5188339 0.9988608 0.4811661 0.9988608 0.4811661 0.9988607 0.444593 0.9898463 0.444593 0.9898463 0.4112399 0.9723412 0.4112399 0.9723413 0.3830452 0.9473629 0.3830452 0.9473629 0.3616475 0.916363 0.3616475 0.916363 0.3482903 0.8811431 0.3482903 0.8811431 0.3437499 0.84375 0.3437499 0.84375 0.3482903 0.8063569 0.3482902 0.8063569 0.3616474 0.7711369 0.3616474 0.7711369 0.3830451 0.740137 0.3830451 0.740137 0.4112398 0.7151587 0.4112398 0.7151587 0.444593 0.6976537 0.444593 0.6976537 0.4811661 0.6886392 0.4811661 0.6886392 0.5188339 0.6886392 0.5188339 0.6886392 0.555407 0.6976537 0.555407 0.6976536 0.5887602 0.7151587 0.5887603 0.7151587 0.6169549 0.740137 0.6169549 0.740137 0.6383526 0.771137 0.6383526 0.7711369 0.6517098 0.8063569 0.6517098 0.8063569 0.65625 0.84375 0.65625 0.84375 0.6517097 0.8811431 0.6383525 0.916363 0.6169548 0.9473629 0.5887601 0.9723412 0.555407 0.9898463 0.5188339 0.9988608 0.4811661 0.9988608 0.444593 0.9898463 0.4112399 0.9723412 0.3830452 0.9473629 0.3616475 0.916363 0.3482903 0.8811431 0.3437499 0.84375 0.3482903 0.8063569 0.3616474 0.7711369 0.3830451 0.740137 0.4112398 0.7151587 0.444593 0.6976537 0.4811661 0.6886392 0.5188339 0.6886392 0.555407 0.6976537 0.5887602 0.7151587 0.6169549 0.740137 0.6383526 0.771137 0.6517098 0.8063569 0.65625 0.84375</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape3-map1-array" count="271" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape3-textangents">
+ <float_array id="qt_gauge_needles_8Shape3-textangents-array" count="2388">0.9999999 0 0 -0.0976349 0.9952222 0 -0.9999999 0 0 0.0976349 -0.9952222 0 -0.9999999 0 0 0.4645241 0.8855605 0 0.9999999 0 0 -0.4645241 -0.8855605 0 0 -0.4544658 0.8907641 0 0 0 0 0 0 0 0 0 0 0.1690147 0.9856135 0 0.1537774 0.9881055 0 0.1537774 0.9881055 0 0.1690147 0.9856135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.2337047 0.9723076 0 0 0.9999999 0 0.1330419 0.9911103 0 0.1019243 0.9947921 0 0.1019243 0.9947921 0 0.1330419 0.9911103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.1902454 0.9817365 0 0 0.9999999 0 0.08152475 0.9966713 0 0.03080725 0.9995253 0 0.03080725 0.9995253 0 0.08152475 0.9966713 0 0 0 0 0.02623569 0.9996557 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0.1763172 0.9843333 0 0.1690147 0.9856135 0 0.1690147 0.9856135 0 0.1763171 0.9843333 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0.1545352 -0.9879872 0 0 0 0 -0.9999999 0 0 0 -0.9999999 0 0.9999999 0 0 -0.1545352 0.9879872 0 0 0 0 0.1537774 0.9881055 0 0.1330419 0.9911103 0 0.1330419 0.9911103 0 0.1537774 0.9881055 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.4544658 0.8907641 0 0 0 0 -0.2337047 0.9723076 0 -0.4544658 0.8907641 0 0.1019243 0.9947921 0 0.08152475 0.9966713 0 0.08152475 0.9966713 0 0.1019243 0.9947921 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.3735417 0.9276132 0 0 0 0 -0.1902454 0.9817365 0 -0.3735417 0.9276132 0 0.03080725 0.9995253 0 0.02623569 0.9996557 0 0.02623569 0.9996557 0 0.03080725 0.9995253 0 0.1600127 -0.9871149 0 0 0 0 0.02623569 0.9996557 0 -0.9999999 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.1600127 0.9871149 0 0 0 0 0.9999999 0 0 -0.02623569 -0.9996557 0.03605632 0 0.9993497 0.03917924 0 0.9992322 0 0 0.9999999 0.03072999 0 0.9995278 0.03605632 0 0.9993497 0 0 0.9999999 0.02347988 0 0.9997243 0.03072999 0 0.9995278 0 0 0.9999999 0.01472434 0 0.9998916 0.02347988 0 0.9997243 0 0 0.9999999 0.005015881 0 0.9999874 0.01472434 0 0.9998916 0 0 0.9999999 -0.005015882 0 0.9999874 0.005015881 0 0.9999874 0 0 0.9999999 -0.01472064 0 0.9998916 -0.005015882 0 0.9999874 0 0 0.9999999 -0.02347876 0 0.9997244 -0.01472064 0 0.9998916 0 0 0.9999999 -0.03073249 0 0.9995276 -0.02347876 0 0.9997244 0 0 0.9999999 -0.03605625 0 0.9993497 -0.03073249 0 0.9995276 0 0 0.9999999 -0.03917917 0 0.9992322 -0.03605625 0 0.9993497 0 0 0.9999999 -0.03996886 0 0.9992009 -0.03917917 0 0.9992322 0 0 0.9999999 -0.03844787 0 0.9992605 -0.03996886 0 0.9992009 0 0 0.9999999 -0.03476036 0 0.9993956 -0.03844787 0 0.9992605 0 0 0.9999999 -0.02916646 0 0.9995746 -0.03476036 0 0.9993956 0 0 0.9999999 -0.02200414 0 0.9997579 -0.02916646 0 0.9995746 0 0 0.9999999 -0.0136755 0 0.9999064 -0.02200414 0 0.9997579 0 0 0.9999999 -0.004637884 0 0.9999892 -0.0136755 0 0.9999064 0 0 0.9999999 0.004637885 0 0.9999892 -0.004637884 0 0.9999892 0 0 0.9999999 0.01367926 0 0.9999064 0.004637885 0 0.9999892 0 0 0.9999999 0.02200518 0 0.9997579 0.01367926 0 0.9999064 0 0 0.9999999 0.02916375 0 0.9995747 0.02200518 0 0.9997579 0 0 0.9999999 0.03476037 0 0.9993956 0.02916375 0 0.9995747 0 0 0.9999999 0.03844794 0 0.9992605 0.03476037 0 0.9993956 0 0 0.9999999 0.03996898 0 0.9992009 0.03844794 0 0.9992605 0 0 0.9999999 0.03917924 0 0.9992322 0.03996898 0 0.9992009 0 0 0.9999999 0.9819382 -0.06048775 -0.1792718 0.9819389 -0.06048423 -0.1792689 0.9963078 0.06048467 -0.06092745 0.9995877 0.02022772 -0.02037499 0.9527763 0.0604867 -0.297588 0.9527752 0.06048428 -0.297592 0.8756216 0.02022897 -0.4825742 0.9105022 -0.06048521 -0.4090565 0.8538707 0.0604861 -0.5169584 0.8756216 0.02022897 -0.4825742 0.7346893 0.0202276 -0.6781022 0.7861516 -0.06048445 -0.6150668 0.7053433 0.06048587 -0.7062805 0.7346893 0.0202276 -0.6781022 0.5510601 0.0202286 -0.8342202 0.6161112 -0.06048469 -0.7853334 0.5158233 0.06048479 -0.854557 0.5510601 0.0202286 -0.8342202 0.3354066 0.02022835 -0.9418563 0.4102656 -0.06048476 -0.9099581 0.296325 0.06048599 -0.9531699 0.3354066 0.02022835 -0.9418563 0.1002594 0.02022752 -0.9947557 0.1805785 -0.06048563 -0.9816989 0.05960637 0.06048507 -0.9963877 0.1002594 0.02022752 -0.9947557 -0.140716 0.02022844 -0.9898434 -0.05960588 -0.06048546 -0.9963878 -0.1805772 0.06048433 -0.9816992 -0.140716 0.02022844 -0.9898434 -0.3735135 0.02022839 -0.927404 -0.2963279 -0.06048584 -0.953169 -0.4102663 0.06048448 -0.9099577 -0.3735135 0.02022839 -0.927404 -0.5846004 0.02022674 -0.8110693 -0.515825 -0.06048293 -0.854556 -0.6161098 0.06048623 -0.7853343 -0.5846004 0.02022674 -0.8110693 -0.761714 0.02022832 -0.6475977 -0.7053421 -0.06048789 -0.7062815 -0.7861526 0.06048612 -0.6150653 -0.761714 0.02022832 -0.6475977 -0.8945601 0.02022907 -0.4464896 -0.8538721 -0.06048518 -0.5169563 -0.910503 0.06048328 -0.4090549 -0.8945601 0.02022907 -0.4464896 -0.9754176 0.02022978 -0.2194342 -0.9527752 -0.06048733 -0.2975911 -0.9819386 0.06048376 -0.1792712 -0.9754176 0.02022978 -0.2194342 -0.9995877 0.02022844 0.02037717 -0.9963077 -0.06048504 -0.0609294 -0.9963077 0.06048536 0.06092995 -0.9995877 0.02022844 0.02037717 -0.9656652 0.02022768 0.2590011 -0.9819381 -0.06048501 0.1792735 -0.9527758 0.06048401 0.29759 -0.9656652 0.02022768 0.2590011 -0.8756216 0.02022894 0.4825742 -0.9105021 -0.06048615 0.4090566 -0.8538712 0.0604858 0.5169578 -0.8756216 0.02022894 0.4825742 -0.7346907 0.02022817 0.6781005 -0.7861494 -0.06048476 0.6150695 -0.705344 0.06048404 0.70628 -0.7346907 0.02022817 0.6781005 -0.5510617 0.0202281 0.8342193 -0.6161126 -0.06048573 0.7853321 -0.5158246 0.06048565 0.8545563 -0.5510617 0.0202281 0.8342193 -0.3354049 0.02022888 0.9418568 -0.4102638 -0.06048573 0.9099588 -0.2963251 0.06048498 0.9531699 -0.3354049 0.02022888 0.9418568 -0.1002583 0.0202283 0.9947557 -0.1805727 -0.06048473 0.9817001 -0.05960758 0.06048436 0.9963877 -0.1002583 0.0202283 0.9947557 0.1407158 0.02022793 0.9898434 0.05960796 -0.06048563 0.9963876 0.1805795 0.06048825 0.9816986 0.1407158 0.02022793 0.9898434 0.3735126 0.02022752 0.9274045 0.2963273 -0.06048658 0.9531692 0.4102687 0.06048366 0.9099567 0.3735126 0.02022752 0.9274045 0.5845998 0.02022816 0.8110695 0.515824 -0.06048346 0.8545566 0.6161095 0.06048263 0.7853348 0.5845998 0.02022816 0.8110695 0.7617136 0.0202278 0.6475983 0.7053412 -0.06048523 0.7062827 0.786149 0.06048656 0.6150699 0.7617136 0.0202278 0.6475983 0.8945609 0.0202278 0.4464883 0.8538712 -0.06048603 0.5169578 0.9105023 0.06048622 0.4090562 0.8945609 0.0202278 0.4464883 0.9754181 0.0202281 0.2194322 0.9527758 -0.06048432 0.29759 0.9819382 0.06048496 0.1792733 0.9754181 0.0202281 0.2194322 0.9995877 0.02022772 -0.02037499 0.9963077 -0.06048462 0.06093042 0.9709421 0 -0.2393143 0.8854558 0 -0.4647233 0.8854558 0 -0.4647233 0.9709421 0 -0.2393143 0.8854558 0 -0.4647233 0.748511 0 -0.6631224 0.748511 0 -0.6631224 0.8854558 0 -0.4647233 0.748511 0 -0.6631224 0.568063 0 -0.822985 0.568063 0 -0.822985 0.748511 0 -0.6631224 0.568063 0 -0.822985 0.3546054 0 -0.9350159 0.3546053 0 -0.9350159 0.568063 0 -0.822985 0.3546054 0 -0.9350159 0.1205383 0 -0.9927086 0.1205383 0 -0.9927086 0.3546053 0 -0.9350159 0.1205383 0 -0.9927086 -0.1205384 0 -0.9927086 -0.1205384 0 -0.9927086 0.1205383 0 -0.9927086 -0.1205384 0 -0.9927086 -0.3546089 0 -0.9350147 -0.3546089 0 -0.9350147 -0.1205384 0 -0.9927086 -0.3546089 0 -0.9350147 -0.5680631 0 -0.822985 -0.5680631 0 -0.822985 -0.3546089 0 -0.9350147 -0.5680631 0 -0.822985 -0.7485092 0 -0.6631242 -0.7485092 0 -0.6631242 -0.5680631 0 -0.822985 -0.7485092 0 -0.6631242 -0.885456 0 -0.4647232 -0.885456 0 -0.4647232 -0.7485092 0 -0.6631242 -0.885456 0 -0.4647232 -0.9709418 0 -0.2393157 -0.9709418 0 -0.2393157 -0.885456 0 -0.4647232 -0.9709418 0 -0.2393157 -0.9999999 0 0 -0.9999999 0 0 -0.9709418 0 -0.2393157 -0.9999999 0 0 -0.9709417 0 0.2393159 -0.9709417 0 0.2393159 -0.9999999 0 0 -0.9709417 0 0.2393159 -0.8854558 0 0.4647234 -0.8854558 0 0.4647234 -0.9709417 0 0.2393159 -0.8854558 0 0.4647234 -0.748511 0 0.6631223 -0.748511 0 0.6631223 -0.8854558 0 0.4647234 -0.748511 0 0.6631223 -0.5680658 0 0.8229831 -0.5680657 0 0.8229831 -0.748511 0 0.6631223 -0.5680658 0 0.8229831 -0.3546019 0 0.9350173 -0.3546019 0 0.9350173 -0.5680657 0 0.8229831 -0.3546019 0 0.9350173 -0.1205345 0 0.9927091 -0.1205345 0 0.9927091 -0.3546019 0 0.9350173 -0.1205345 0 0.9927091 0.1205345 0 0.9927091 0.1205345 0 0.9927091 -0.1205345 0 0.9927091 0.1205345 0 0.9927091 0.3546056 0 0.9350159 0.3546056 0 0.9350159 0.1205345 0 0.9927091 0.3546056 0 0.9350159 0.5680659 0 0.8229831 0.5680659 0 0.822983 0.3546056 0 0.9350159 0.5680659 0 0.8229831 0.7485093 0 0.6631241 0.7485093 0 0.6631241 0.5680659 0 0.822983 0.7485093 0 0.6631241 0.885456 0 0.464723 0.885456 0 0.464723 0.7485093 0 0.6631241 0.885456 0 0.464723 0.9709418 0 0.2393155 0.9709418 0 0.2393155 0.885456 0 0.464723 0.9709418 0 0.2393155 0.9999999 0 0 0.9999999 0 0 0.9709418 0 0.2393155 0.9999999 0 0 0.9709421 0 -0.2393143 0.9709421 0 -0.2393143 0.9999999 0 0 -0.03844738 0 0.9992607 -0.03476184 0 0.9993956 0 0 0.9999999 -0.03476184 0 0.9993956 -0.02916347 0 0.9995747 0 0 0.9999999 -0.02916347 0 0.9995747 -0.02200126 0 0.9997579 0 0 0.9999999 -0.02200126 0 0.9997579 -0.01368053 0 0.9999064 0 0 0.9999999 -0.01368053 0 0.9999064 -0.004634251 0 0.9999893 0 0 0.9999999 -0.004634251 0 0.9999893 0.00464088 0 0.9999893 0 0 0.9999999 0.00464088 0 0.9999893 0.01367165 0 0.9999065 0 0 0.9999999 0.01367165 0 0.9999065 0.02200845 0 0.9997578 0 0 0.9999999 0.02200845 0 0.9997578 0.02916776 0 0.9995745 0 0 0.9999999 0.02916776 0 0.9995745 0.0347592 0 0.9993957 0 0 0.9999999 0.0347592 0 0.9993957 0.03844858 0 0.9992605 0 0 0.9999999 0.03844858 0 0.9992605 0.03996604 0 0.999201 0 0 0.9999999 0.03996604 0 0.999201 0.03917794 0 0.9992322 0 0 0.9999999 0.03917794 0 0.9992322 0.03605579 0 0.9993498 0 0 0.9999999 0.03605579 0 0.9993498 0.03072964 0 0.9995277 0 0 0.9999999 0.03072964 0 0.9995277 0.02347873 0 0.9997244 0 0 0.9999999 0.02347873 0 0.9997244 0.0147273 0 0.9998915 0 0 0.9999999 0.0147273 0 0.9998915 0.005026353 0 0.9999873 0 0 0.9999999 0.005026353 0 0.9999873 -0.005013404 0 0.9999874 0 0 0.9999999 -0.005013404 0 0.9999874 -0.01472967 0 0.9998915 0 0 0.9999999 -0.01472967 0 0.9998915 -0.02347665 0 0.9997244 0 0 0.9999999 -0.02347665 0 0.9997244 -0.03072939 0 0.9995277 0 0 0.9999999 -0.03072939 0 0.9995277 -0.03606003 0 0.9993496 0 0 0.9999999 -0.03606003 0 0.9993496 -0.03917888 0 0.9992322 0 0 0.9999999 -0.03917888 0 0.9992322 -0.0399693 0 0.9992009 0 0 0.9999999 -0.0399693 0 0.9992009 -0.03844738 0 0.9992607 0 0 0.9999999 0.01483156 0 -0.99989 -0.224892 0 -0.9743836 0.2806423 0 0.9598123 0.04278603 0 0.9990842 -0.224892 0 -0.9743836 -0.4515422 0 -0.8922498 0.502186 0 0.8647596 0.2806423 0 0.9598123 -0.4515422 0 -0.8922498 -0.6519507 0 -0.7582612 0.6945438 0 0.7194504 0.502186 0 0.8647596 -0.6519507 0 -0.7582612 -0.8144708 0 -0.5802045 0.8465381 0 0.532328 0.6945438 0 0.7194504 -0.8144708 0 -0.5802045 -0.9296557 0 -0.3684293 0.9493337 0 0.3142699 0.8465381 0 0.532328 -0.9296557 0 -0.3684293 -0.9908125 0 -0.1352426 0.9969574 0 0.07794765 0.9493337 0 0.3142699 -0.9908125 0 -0.1352426 -0.9943869 0 0.1058045 0.9866417 0 -0.1629051 0.9969574 0 0.07794765 -0.9943869 0 0.1058045 -0.9401714 0 0.3407017 0.9189866 0 -0.3942886 0.9866417 0 -0.1629051 -0.9401714 0 0.3407017 -0.8313157 0 0.5558004 0.7979202 0 -0.6027631 0.9189866 0 -0.3942886 -0.8313157 0 0.5558004 -0.6741437 0 0.7386001 0.6304809 0 -0.7762048 0.7979202 0 -0.6027631 -0.6741437 0 0.7386001 -0.4777989 0 0.8784691 0.4264081 0 -0.9045308 0.6304809 0 -0.7762048 -0.4777989 0 0.8784691 -0.2536859 0 0.9672866 0.1975495 0 -0.9802928 0.4264081 0 -0.9045308 -0.2536859 0 0.9672866 -0.01483095 0 0.99989 -0.04278634 0 -0.9990842 0.1975495 0 -0.9802928 -0.01483095 0 0.99989 0.2248948 0 0.9743831 -0.2806467 0 -0.9598111 -0.04278634 0 -0.9990842 0.2248948 0 0.9743831 0.4515429 0 0.8922493 -0.5021857 0 -0.8647597 -0.2806467 0 -0.9598111 0.4515429 0 0.8922493 0.6519521 0 0.7582601 -0.6945456 0 -0.7194486 -0.5021857 0 -0.8647597 0.6519521 0 0.7582601 0.8144708 0 0.5802045 -0.8465379 0 -0.5323282 -0.6945456 0 -0.7194486 0.8144708 0 0.5802045 0.9296557 0 0.3684292 -0.9493337 0 -0.3142699 -0.8465379 0 -0.5323282 0.9296557 0 0.3684292 0.9908127 0 0.1352411 -0.9969575 0 -0.07794607 -0.9493337 0 -0.3142699 0.9908127 0 0.1352411 0.9943867 0 -0.105807 -0.9866412 0 0.1629083 -0.9969575 0 -0.07794607 0.9943867 0 -0.105807 0.9401706 0 -0.340704 -0.9189856 0 0.3942906 -0.9866412 0 0.1629083 0.9401706 0 -0.340704 0.8313174 0 -0.5557979 -0.7979242 0 0.6027579 -0.9189856 0 0.3942906 0.8313174 0 -0.5557979 0.6741483 0 -0.738596 -0.6304838 0 0.7762023 -0.7979242 0 0.6027579 0.6741483 0 -0.738596 0.4777965 0 -0.8784706 -0.4264034 0 0.9045331 -0.6304838 0 0.7762023 0.4777965 0 -0.8784706 0.2536848 0 -0.9672869 -0.1975499 0 0.9802928 -0.4264034 0 0.9045331 0.2536848 0 -0.9672869 0.01483156 0 -0.99989 0.04278603 0 0.9990842 -0.1975499 0 0.9802928 -0.03401613 -0.4555727 0.8895483 -0.03445341 -0.455522 0.8895575 -0.03288189 -0.4195705 0.9071268 -0.03031123 -0.4201269 0.9069589 -0.7817518 0.2048844 0.5889708 0.6693305 -0.2721292 -0.6913338 0.4844332 -0.2721258 -0.8314277 -0.6180822 0.2048827 0.7589449 -0.03031123 -0.4201269 0.9069589 -0.03288189 -0.4195705 0.9071268 -0.03021302 -0.3608562 0.9321318 -0.0243987 -0.3626919 0.9315895 -0.6180822 0.2048827 0.7589449 0.4844332 -0.2721258 -0.8314277 0.271389 -0.2721242 -0.9231991 -0.4184975 0.2048812 0.8848071 -0.0243987 -0.3626919 0.9315895 -0.03021302 -0.3608562 0.9321318 -0.02602132 -0.2789689 0.9599475 -0.01654067 -0.2828447 0.9590231 -0.4184975 0.2048812 0.8848071 0.271389 -0.2721242 -0.9231991 0.04256575 -0.2721254 -0.9613199 -0.1945923 0.2048792 0.9592488 -0.01654067 -0.2828447 0.9590231 -0.02602132 -0.2789689 0.9599475 -0.01996623 -0.1759043 0.9842047 -0.007295191 -0.1820347 0.983265 -0.1945923 0.2048792 0.9592488 0.04256575 -0.2721254 -0.9613199 -0.1887275 -0.2721229 -0.9435736 0.04063007 0.2048796 0.9779435 -0.007295191 -0.1820347 0.983265 -0.01996623 -0.1759043 0.9842047 -0.0119652 -0.05774849 0.9982595 0.002556202 -0.06539828 0.997856 0.04063007 0.2048796 0.9779435 -0.1887275 -0.2721229 -0.9435736 -0.4090474 -0.2721263 -0.8709922 0.2734808 0.2048829 0.9398038 0.002556202 -0.06539828 0.997856 -0.0119652 -0.05774849 0.9982595 -0.002566157 0.06540081 0.9978558 0.01195244 0.05775316 0.9982594 0.2734808 0.2048829 0.9398038 -0.4090474 -0.2721263 -0.8709922 -0.6056046 -0.2721305 -0.7477887 0.490437 0.2048815 0.8470508 0.01195244 0.05775316 0.9982594 -0.002566157 0.06540081 0.9978558 0.007311873 0.1820266 0.9832664 0.01995711 0.1759067 0.9842045 0.490437 0.2048815 0.8470508 -0.6056046 -0.2721305 -0.7477887 -0.7669675 -0.2721258 -0.5811269 0.6789063 0.2048798 0.7050606 0.01995711 0.1759067 0.9842045 0.007311873 0.1820266 0.9832664 0.01656003 0.2828513 0.9590207 0.02606199 0.2789635 0.9599479 0.6789063 0.2048798 0.7050606 -0.7669675 -0.2721258 -0.5811269 -0.8837517 -0.2721213 -0.3807004 0.8279102 0.2048793 0.5221006 0.02606199 0.2789635 0.9599479 0.01656003 0.2828513 0.9590207 0.02435185 0.362708 0.9315845 0.03018527 0.3608663 0.9321288 0.8279102 0.2048793 0.5221006 -0.8837517 -0.2721213 -0.3807004 -0.949179 -0.2721223 -0.1581414 0.9287974 0.2048754 0.3088066 0.03018527 0.3608663 0.9321288 0.02435185 0.362708 0.9315845 0.03030455 0.4201228 0.906961 0.03286145 0.4195684 0.9071286 0.9287974 0.2048754 0.3088066 -0.949179 -0.2721223 -0.1581414 -0.9594436 -0.272122 0.07360395 0.9757106 0.2048748 0.07755645 0.03286145 0.4195684 0.9071286 0.03030455 0.4201228 0.906961 0.03399898 0.4555717 0.8895494 0.03442279 0.4555231 0.8895581 0.9757106 0.2048748 0.07755645 -0.9594436 -0.272122 0.07360395 -0.9139441 -0.2721281 0.3010852 0.9659157 0.2048835 -0.1582081 0.03442279 0.4555231 0.8895581 0.03399898 0.4555717 0.8895494 0.03536574 0.469709 0.8821126 0.0352677 0.4697105 0.8821157 0.9659157 0.2048835 -0.1582081 -0.9139441 -0.2721281 0.3010852 -0.8153354 -0.2721269 0.511053 0.8999878 0.2048816 -0.3847665 0.0352677 0.4697105 0.8821157 0.03536574 0.469709 0.8821126 0.03409179 0.4624189 0.8860058 0.03534015 0.462524 0.8859019 0.8999878 0.2048816 -0.3847665 -0.8153354 -0.2721269 0.511053 -0.6693299 -0.2721307 0.6913338 0.7817503 0.204886 -0.5889721 0.03534015 0.462524 0.8859019 0.03409179 0.4624189 0.8860058 0.03024353 0.4323878 0.9011803 0.03453524 0.4331939 0.9006388 0.7817503 0.204886 -0.5889721 -0.6693299 -0.2721307 0.6913338 -0.4844511 -0.2721244 0.8314177 0.6180912 0.2048798 -0.7589384 0.03453524 0.4331939 0.9006388 0.03024353 0.4323878 0.9011803 0.02382177 0.3773914 0.9257473 0.03253167 0.3799435 0.9244374 0.6180912 0.2048798 -0.7589384 -0.4844511 -0.2721244 0.8314177 -0.2713886 -0.2721313 0.923197 0.418501 0.204885 -0.8848044 0.03253167 0.3799435 0.9244374 0.02382177 0.3773914 0.9257473 0.01515924 0.2955786 0.9551981 0.02888435 0.3009869 0.9531907 0.418501 0.204885 -0.8848044 -0.2713886 -0.2721313 0.923197 -0.04258488 -0.272127 0.9613186 0.1946003 0.2048808 -0.9592469 0.02888435 0.3009869 0.9531907 0.01515924 0.2955786 0.9551981 0.004965408 0.1879335 0.9821691 0.02317467 0.1966278 0.9802043 0.1946003 0.2048808 -0.9592469 -0.04258488 -0.272127 0.9613186 0.1887252 -0.2721269 0.9435729 -0.04062477 0.2048814 -0.9779433 0.02317467 0.1966278 0.9802043 0.004965408 0.1879335 0.9821691 -0.005595796 0.06110595 0.9981155 0.01529576 0.07209533 0.9972804 -0.04062477 0.2048814 -0.9779433 0.1887252 -0.2721269 0.9435729 0.4090536 -0.2721228 0.8709904 -0.2734827 0.2048783 -0.9398042 0.01529576 0.07209533 0.9972804 -0.005595796 0.06110595 0.9981155 -0.01530161 -0.07209924 0.9972801 0.005596238 -0.06110668 0.9981155 -0.2734827 0.2048783 -0.9398042 0.4090536 -0.2721228 0.8709904 0.6056078 -0.2721227 0.747789 -0.4904447 0.204878 -0.8470472 0.005596238 -0.06110668 0.9981155 -0.01530161 -0.07209924 0.9972801 -0.02318441 -0.1966252 0.9802046 -0.004988202 -0.1879372 0.9821683 -0.4904447 0.204878 -0.8470472 0.6056078 -0.2721227 0.747789 0.7669691 -0.2721231 0.581126 -0.6789047 0.2048763 -0.7050632 -0.004988202 -0.1879372 0.9821683 -0.02318441 -0.1966252 0.9802046 -0.02888843 -0.3009885 0.95319 -0.01515452 -0.295576 0.9551989 -0.6789047 0.2048763 -0.7050632 0.7669691 -0.2721231 0.581126 0.8837514 -0.2721249 0.3806986 -0.8279097 0.204881 -0.5221008 -0.01515452 -0.295576 0.9551989 -0.02888843 -0.3009885 0.95319 -0.03257633 -0.3799528 0.924432 -0.02385892 -0.3773985 0.9257435 -0.8279097 0.204881 -0.5221008 0.8837514 -0.2721249 0.3806986 0.9491778 -0.2721293 0.1581362 -0.9287975 0.2048851 -0.3087997 -0.02385892 -0.3773985 0.9257435 -0.03257633 -0.3799528 0.924432 -0.03453098 -0.43319 0.9006407 -0.03026575 -0.4323879 0.9011795 -0.9287975 0.2048851 -0.3087997 0.9491778 -0.2721293 0.1581362 0.9594434 -0.2721232 -0.07360183 -0.9757103 0.2048759 -0.07755865 -0.03026575 -0.4323879 0.9011795 -0.03453098 -0.43319 0.9006407 -0.03531779 -0.4625237 0.8859031 -0.03408811 -0.4624196 0.8860056 -0.9757103 0.2048759 -0.07755865 0.9594434 -0.2721232 -0.07360183 0.9139501 -0.2721223 -0.3010726 -0.965919 0.204875 0.1581986 -0.03408811 -0.4624196 0.8860056 -0.03531779 -0.4625237 0.8859031 -0.03524455 -0.4697121 0.8821158 -0.03532172 -0.4697107 0.8821134 -0.965919 0.204875 0.1581986 0.9139501 -0.2721223 -0.3010726 0.8153366 -0.2721262 -0.5110514 -0.899988 0.2048818 0.3847661 0.6693305 -0.2721292 -0.6913338 -0.7817518 0.2048844 0.5889708 -0.899988 0.2048818 0.3847661 0.8153366 -0.2721262 -0.5110514 -0.03445341 -0.455522 0.8895575 -0.03401613 -0.4555727 0.8895483 -0.03532172 -0.4697107 0.8821134 -0.03524455 -0.4697121 0.8821158</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape3-textangents-array" count="796" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape3-texbinormals">
+ <float_array id="qt_gauge_needles_8Shape3-texbinormals-array" count="2388">0 1 0 -0.9952223 -0.09763492 0 0 -1 0 0.9952223 0.09763492 0 0 1 0 0.8855605 -0.4645241 0 0 -1 0 -0.8855605 0.4645241 0 0 -0.8907642 -0.4544659 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 -0.9723077 -0.2337048 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 -0.9817366 -0.1902454 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0.9996558 -0.02623569 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 -0.9879873 -0.1545352 0 0 0 0 0 1 0 1 0 0 0 1 0 -0.9879873 -0.1545352 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.8907642 -0.4544659 0 0 0 0 -0.9723077 -0.2337048 0 -0.8907642 -0.4544658 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.9276134 -0.3735418 0 0 0 0 -0.9817366 -0.1902454 0 -0.9276134 -0.3735418 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.987115 -0.1600127 0 0 0 0 0.9996558 -0.02623569 0 0 -1 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.987115 -0.1600127 0 0 0 0 0 1 0 -0.9996558 0.02623569 -0.9993498 0 0.03605633 -0.9992322 0 0.03917924 -1 0 0 -0.9995278 0 0.03072999 -0.9993498 0 0.03605633 -1 0 0 -0.9997244 0 0.02347989 -0.9995278 0 0.03072999 -1 0 0 -0.9998916 0 0.01472434 -0.9997244 0 0.02347989 -1 0 0 -0.9999874 0 0.005015881 -0.9998916 0 0.01472434 -1 0 0 -0.9999875 0 -0.005015883 -0.9999874 0 0.005015881 -1 0 0 -0.9998916 0 -0.01472064 -0.9999875 0 -0.005015883 -1 0 0 -0.9997244 0 -0.02347876 -0.9998916 0 -0.01472064 -1 0 0 -0.9995277 0 -0.03073249 -0.9997244 0 -0.02347876 -1 0 0 -0.9993498 0 -0.03605625 -0.9995277 0 -0.03073249 -1 0 0 -0.9992323 0 -0.03917918 -0.9993498 0 -0.03605625 -1 0 0 -0.999201 0 -0.03996886 -0.9992323 0 -0.03917918 -1 0 0 -0.9992607 0 -0.03844787 -0.999201 0 -0.03996886 -1 0 0 -0.9993957 0 -0.03476036 -0.9992607 0 -0.03844787 -1 0 0 -0.9995746 0 -0.02916646 -0.9993957 0 -0.03476036 -1 0 0 -0.9997579 0 -0.02200414 -0.9995746 0 -0.02916646 -1 0 0 -0.9999065 0 -0.01367551 -0.9997579 0 -0.02200414 -1 0 0 -0.9999893 0 -0.004637884 -0.9999065 0 -0.01367551 -1 0 0 -0.9999893 0 0.004637885 -0.9999893 0 -0.004637884 -1 0 0 -0.9999064 0 0.01367926 -0.9999893 0 0.004637885 -1 0 0 -0.9997579 0 0.02200518 -0.9999064 0 0.01367926 -1 0 0 -0.9995747 0 0.02916375 -0.9997579 0 0.02200518 -1 0 0 -0.9993957 0 0.03476038 -0.9995747 0 0.02916375 -1 0 0 -0.9992607 0 0.03844794 -0.9993957 0 0.03476038 -1 0 0 -0.999201 0 0.03996898 -0.9992607 0 0.03844794 -1 0 0 -0.9992322 0 0.03917924 -0.999201 0 0.03996898 -1 0 0 -0.08585149 0.7019117 -0.707071 -0.08585177 0.701912 -0.7070708 -0.08585192 0.7019133 -0.7070695 -0.02871065 0.704224 -0.7093971 -0.252571 0.7019118 -0.6659788 -0.2525721 0.701912 -0.6659781 -0.3550978 0.7042223 -0.6147979 -0.2525722 0.7019116 -0.6659786 -0.4046131 0.7019114 -0.5861813 -0.3550978 0.7042223 -0.6147979 -0.4919114 0.7042202 -0.5119542 -0.4046133 0.7019095 -0.5861835 -0.533139 0.7019094 -0.47232 -0.4919114 0.7042202 -0.5119542 -0.6001351 0.7042217 -0.3793544 -0.5331383 0.7019109 -0.4723183 -0.6306788 0.7019109 -0.3310065 -0.6001351 0.7042217 -0.3793544 -0.6734791 0.7042241 -0.2247095 -0.6306772 0.7019134 -0.3310045 -0.6915657 0.7019132 -0.1704547 -0.6734791 0.7042241 -0.2247095 -0.7076896 0.7042199 -0.05700687 -0.6915691 0.7019091 -0.1704575 -0.7122666 0.7019091 0 -0.7076896 0.7042199 -0.05700687 -0.7007678 0.7042199 0.1140125 -0.7122666 0.701909 0 -0.6915696 0.7019092 0.1704557 -0.7007678 0.7042199 0.1140125 -0.6531108 0.7042291 0.278402 -0.6915604 0.7019182 0.1704551 -0.6306723 0.7019184 0.331003 -0.6531108 0.7042291 0.278402 -0.5675064 0.7042315 0.4266082 -0.6306694 0.7019209 0.3310032 -0.5331304 0.7019206 0.4723128 -0.5675064 0.7042315 0.4266082 -0.448928 0.7042212 0.5500329 -0.5331401 0.7019102 0.4723175 -0.4046108 0.7019103 0.5861843 -0.448928 0.7042212 0.5500329 -0.3042532 0.7042168 0.6414895 -0.4046136 0.701906 0.5861875 -0.2525749 0.7019063 0.6659833 -0.3042532 0.7042168 0.6414895 -0.141893 0.7042202 0.6956582 -0.2525742 0.7019093 0.6659803 -0.08585433 0.7019095 0.7070729 -0.141893 0.7042202 0.6956582 0.02871269 0.7042232 0.7093979 -0.08585355 0.7019123 0.7070702 0.08585417 0.7019123 0.7070701 0.02871269 0.7042232 0.7093979 0.1976469 0.7042245 0.6819118 0.08585411 0.7019137 0.7070687 0.2525701 0.7019138 0.665977 0.1976469 0.7042245 0.6819118 0.3550956 0.7042272 0.6147937 0.2525695 0.7019164 0.6659745 0.4046102 0.7019164 0.5861774 0.3550956 0.7042272 0.6147937 0.4919051 0.7042285 0.5119489 0.4046098 0.7019178 0.5861761 0.5331321 0.7019178 0.4723151 0.4919051 0.7042285 0.5119489 0.6001304 0.7042263 0.3793532 0.5331332 0.7019154 0.4723173 0.6306749 0.7019154 0.3310043 0.6001304 0.7042263 0.3793532 0.6734746 0.7042295 0.224706 0.6306725 0.7019188 0.331002 0.6915602 0.7019188 0.1704535 0.6734746 0.7042295 0.224706 0.7076736 0.7042363 0.05700359 0.6915541 0.7019255 0.1704508 0.7122503 0.7019255 0 0.7076736 0.7042363 0.05700359 0.7007567 0.7042312 -0.1140106 0.7122555 0.7019204 0 0.6915576 0.70192 -0.1704587 0.7007567 0.7042312 -0.1140106 0.6531203 0.7042194 -0.2784042 0.6915698 0.7019085 -0.1704576 0.6306807 0.7019088 -0.3310076 0.6531203 0.7042194 -0.2784042 0.5675149 0.7042207 -0.4266147 0.6306789 0.7019101 -0.3310083 0.533141 0.7019101 -0.4723165 0.5675149 0.7042207 -0.4266147 0.4489247 0.7042274 -0.5500277 0.5331353 0.7019167 -0.4723133 0.4046099 0.7019165 -0.5861775 0.4489247 0.7042274 -0.5500277 0.3042484 0.7042267 -0.6414807 0.4046105 0.7019159 -0.5861777 0.2525693 0.7019159 -0.665975 0.3042484 0.7042267 -0.6414807 0.1418917 0.7042246 -0.695654 0.2525703 0.7019139 -0.6659768 0.08585399 0.7019138 -0.7070687 0.1418917 0.7042246 -0.695654 -0.02871065 0.704224 -0.7093971 0.08585398 0.7019132 -0.7070692 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.9992607 0 0.03844738 0.9993957 0 0.03476184 1 0 0 0.9993957 0 0.03476184 0.9995747 0 0.02916347 1 0 0 0.9995747 0 0.02916347 0.999758 0 0.02200126 1 0 0 0.999758 0 0.02200126 0.9999064 0 0.01368053 1 0 0 0.9999064 0 0.01368053 0.9999893 0 0.004634251 1 0 0 0.9999893 0 0.004634251 0.9999893 0 -0.00464088 1 0 0 0.9999893 0 -0.00464088 0.9999066 0 -0.01367165 1 0 0 0.9999066 0 -0.01367165 0.9997579 0 -0.02200845 1 0 0 0.9997579 0 -0.02200845 0.9995746 0 -0.02916776 1 0 0 0.9995746 0 -0.02916776 0.9993958 0 -0.03475921 1 0 0 0.9993958 0 -0.03475921 0.9992607 0 -0.03844859 1 0 0 0.9992607 0 -0.03844859 0.9992011 0 -0.03996605 1 0 0 0.9992011 0 -0.03996605 0.9992322 0 -0.03917794 1 0 0 0.9992322 0 -0.03917794 0.9993498 0 -0.03605579 1 0 0 0.9993498 0 -0.03605579 0.9995278 0 -0.03072964 1 0 0 0.9995278 0 -0.03072964 0.9997244 0 -0.02347873 1 0 0 0.9997244 0 -0.02347873 0.9998916 0 -0.0147273 1 0 0 0.9998916 0 -0.0147273 0.9999874 0 -0.005026353 1 0 0 0.9999874 0 -0.005026353 0.9999875 0 0.005013405 1 0 0 0.9999875 0 0.005013405 0.9998915 0 0.01472967 1 0 0 0.9998915 0 0.01472967 0.9997244 0 0.02347665 1 0 0 0.9997244 0 0.02347665 0.9995278 0 0.03072939 1 0 0 0.9995278 0 0.03072939 0.9993497 0 0.03606003 1 0 0 0.9993497 0 0.03606003 0.9992323 0 0.03917888 1 0 0 0.9992323 0 0.03917888 0.999201 0 0.03996931 1 0 0 0.999201 0 0.03996931 0.9992607 0 0.03844738 1 0 0 -0.9998901 0 -0.01483156 -0.9743837 0 0.224892 0.9598125 0 -0.2806423 0.9990844 0 -0.04278604 -0.9743837 0 0.224892 -0.8922498 0 0.4515422 0.8647596 0 -0.502186 0.9598125 0 -0.2806423 -0.8922498 0 0.4515422 -0.7582613 0 0.6519508 0.7194504 0 -0.6945438 0.8647596 0 -0.502186 -0.7582613 0 0.6519508 -0.5802046 0 0.8144709 0.532328 0 -0.8465382 0.7194504 0 -0.6945438 -0.5802046 0 0.8144709 -0.3684293 0 0.9296558 0.3142699 0 -0.9493338 0.532328 0 -0.8465382 -0.3684293 0 0.9296558 -0.1352426 0 0.9908126 0.07794766 0 -0.9969575 0.3142699 0 -0.9493338 -0.1352426 0 0.9908126 0.1058045 0 0.994387 -0.1629051 0 -0.9866418 0.07794766 0 -0.9969575 0.1058045 0 0.994387 0.3407018 0 0.9401715 -0.3942887 0 -0.9189867 -0.1629051 0 -0.9866418 0.3407018 0 0.9401715 0.5558005 0 0.8313158 -0.6027631 0 -0.7979203 -0.3942887 0 -0.9189867 0.5558005 0 0.8313158 0.7386001 0 0.6741438 -0.7762048 0 -0.6304809 -0.6027631 0 -0.7979203 0.7386001 0 0.6741438 0.8784692 0 0.477799 -0.9045309 0 -0.4264081 -0.7762048 0 -0.6304809 0.8784692 0 0.477799 0.9672868 0 0.2536859 -0.980293 0 -0.1975495 -0.9045309 0 -0.4264081 0.9672868 0 0.2536859 0.99989 0 0.01483095 -0.9990842 0 0.04278634 -0.980293 0 -0.1975495 0.99989 0 0.01483095 0.9743831 0 -0.2248948 -0.9598112 0 0.2806467 -0.9990842 0 0.04278634 0.9743831 0 -0.2248948 0.8922495 0 -0.451543 -0.8647598 0 0.5021858 -0.9598112 0 0.2806467 0.8922495 0 -0.451543 0.7582602 0 -0.6519521 -0.7194487 0 0.6945457 -0.8647598 0 0.5021858 0.7582602 0 -0.6519521 0.5802046 0 -0.8144709 -0.5323283 0 0.8465381 -0.7194487 0 0.6945457 0.5802046 0 -0.8144709 0.3684292 0 -0.9296558 -0.3142699 0 0.9493337 -0.5323283 0 0.8465381 0.3684292 0 -0.9296558 0.1352411 0 -0.9908127 -0.07794608 0 0.9969577 -0.3142699 0 0.9493337 0.1352411 0 -0.9908127 -0.105807 0 -0.9943867 0.1629083 0 0.9866412 -0.07794608 0 0.9969577 -0.105807 0 -0.9943867 -0.340704 0 -0.9401707 0.3942907 0 0.9189858 0.1629083 0 0.9866412 -0.340704 0 -0.9401707 -0.5557979 0 -0.8313174 0.6027579 0 0.7979242 0.3942907 0 0.9189858 -0.5557979 0 -0.8313174 -0.7385961 0 -0.6741483 0.7762024 0 0.6304839 0.6027579 0 0.7979242 -0.7385961 0 -0.6741483 -0.8784706 0 -0.4777965 0.9045332 0 0.4264034 0.7762024 0 0.6304839 -0.8784706 0 -0.4777965 -0.9672869 0 -0.2536848 0.9802929 0 0.1975499 0.9045332 0 0.4264034 -0.9672869 0 -0.2536848 -0.9998901 0 -0.01483156 0.9990844 0 -0.04278604 0.9802929 0 0.1975499 0.9930717 -0.1155793 -0.02121784 0.9930567 -0.1157786 -0.02082554 0.9753 -0.2118224 -0.06262047 0.975383 -0.2107169 -0.06501152 0.6133623 0.4229923 0.6669815 -0.7344012 -0.3832047 -0.5601866 -0.847123 -0.3832017 -0.3681564 0.7551612 0.4229883 0.500812 0.975383 -0.2107169 -0.06501152 0.9753 -0.2118224 -0.06262047 0.9497091 -0.3011493 -0.08580123 0.9498758 -0.2989361 -0.09150591 0.7551612 0.4229883 0.500812 -0.847123 -0.3832017 -0.3681564 -0.9106113 -0.3832025 -0.154735 0.8530684 0.4229887 0.3055406 0.9498758 -0.2989361 -0.09150591 0.9497091 -0.3011493 -0.08580123 0.9217926 -0.3782642 -0.0849397 0.9220116 -0.3753748 -0.09480698 0.8530684 0.4229887 0.3055406 -0.9106113 -0.3832025 -0.154735 -0.9211811 -0.3832024 0.06768647 0.9013991 0.4229904 0.09251345 0.9220116 -0.3753748 -0.09480698 0.9217926 -0.3782642 -0.0849397 0.8980345 -0.4358581 -0.05968165 0.8982266 -0.4333335 -0.07356004 0.9013991 0.4229904 0.09251345 -0.9211811 -0.3832024 0.06768647 -0.8782153 -0.3832037 0.2861694 0.8973458 0.4229898 -0.1258981 0.8982266 -0.4333335 -0.07356004 0.8980345 -0.4358581 -0.05968165 0.8843969 -0.4664481 -0.0163832 0.8844742 -0.4654372 -0.03276995 0.8973458 0.4229898 -0.1258981 -0.8782153 -0.3832037 0.2861694 -0.7842114 -0.3832096 0.4880194 0.8411395 0.4229957 -0.3369853 0.8844742 -0.4654372 -0.03276995 0.8843969 -0.4664481 -0.0163832 0.8844811 -0.4654232 0.03277906 0.8844041 -0.4664339 0.01639579 0.8411395 0.4229957 -0.3369853 -0.7842114 -0.3832096 0.4880194 -0.6446277 -0.3832139 0.6615152 0.7360525 0.4230029 -0.528484 0.8844041 -0.4664339 0.01639579 0.8844811 -0.4654232 0.03277906 0.8982271 -0.4333358 0.07354154 0.8980349 -0.435856 0.05969063 0.7360525 0.4230029 -0.528484 -0.6446277 -0.3832139 0.6615152 -0.4675862 -0.3832094 0.7965638 0.5881857 0.4229966 -0.6892833 0.8980349 -0.435856 0.05969063 0.8982271 -0.4333358 0.07354154 0.9220061 -0.3753913 0.09479614 0.9217854 -0.3782893 0.08490601 0.5881857 0.4229966 -0.6892833 -0.4675862 -0.3832094 0.7965638 -0.2633791 -0.3832059 0.8853163 0.4061412 0.4229907 -0.8100173 0.9217854 -0.3782893 0.08490601 0.9220061 -0.3753913 0.09479614 0.9498767 -0.2989188 0.09155262 0.9497097 -0.3011395 0.08582921 0.4061412 0.4229907 -0.8100173 -0.2633791 -0.3832059 0.8853163 -0.04385525 -0.3832037 0.9226222 0.2004997 0.4229914 -0.8836732 0.9497097 -0.3011395 0.08582921 0.9498767 -0.2989188 0.09155262 0.9753841 -0.2107106 0.06501467 0.975301 -0.2118124 0.06263717 0.2004997 0.4229914 -0.8836732 -0.04385525 -0.3832037 0.9226222 0.1782147 -0.3832077 0.9063066 -0.01680493 0.4229951 -0.9059762 0.975301 -0.2118124 0.06263717 0.9753841 -0.2107106 0.06501467 0.9930722 -0.1155727 0.02123347 0.9930578 -0.1157644 0.02085252 -0.01680493 0.4229951 -0.9059762 0.1782147 -0.3832077 0.9063066 0.3899419 -0.3832095 0.8373146 -0.2331424 0.4229965 -0.8756247 0.9930578 -0.1157644 0.02085252 0.9930722 -0.1155727 0.02123347 0.9993745 -0.01661957 -0.0312174 0.9993779 -0.01657775 -0.03112859 -0.2331424 0.4229965 -0.8756247 0.3899419 -0.3832095 0.8373146 0.578989 -0.3832107 0.7196676 -0.4359149 0.4229976 -0.7943873 0.9993779 -0.01657775 -0.03112859 0.9993745 -0.01661957 -0.0312174 0.9930692 0.0840988 -0.08210374 0.9930254 0.08351871 -0.08321811 -0.4359149 0.4229976 -0.7943873 0.578989 -0.3832107 0.7196676 0.7344016 -0.383207 0.5601846 -0.6133639 0.4229946 -0.6669785 0.9930254 0.08351871 -0.08321811 0.9930692 0.0840988 -0.08210374 0.9753854 0.1842523 -0.1211384 0.9752426 0.182349 -0.1251031 -0.6133639 0.4229946 -0.6669785 0.7344016 -0.383207 0.5601846 0.8471125 -0.3832116 0.3681704 -0.7551524 0.4229978 -0.5008172 0.9752426 0.182349 -0.1251031 0.9753854 0.1842523 -0.1211384 0.9498909 0.2801496 -0.1386492 0.949632 0.2766785 -0.1471331 -0.7551524 0.4229978 -0.5008172 0.8471125 -0.3832116 0.3681704 0.9106093 -0.3832096 0.1547294 -0.8530644 0.4229978 -0.3055391 0.949632 0.2766785 -0.1471331 0.9498909 0.2801496 -0.1386492 0.9220353 0.3654318 -0.127713 0.9217076 0.3609903 -0.1419194 -0.8530644 0.4229978 -0.3055391 0.9106093 -0.3832096 0.1547294 0.9211765 -0.3832159 -0.06767289 -0.9013931 0.4230028 -0.09251659 0.9217076 0.3609903 -0.1419194 0.9220353 0.3654318 -0.127713 0.8982426 0.4308083 -0.08697428 0.8979571 0.4269102 -0.1068678 -0.9013931 0.4230028 -0.09251659 0.9211765 -0.3832159 -0.06767289 0.8782132 -0.3832081 -0.2861699 -0.8973436 0.4229953 0.1258951 0.8979571 0.4269102 -0.1068678 0.8982426 0.4308083 -0.08697428 0.8844564 0.4660272 -0.02357222 0.8843418 0.464454 -0.04713985 -0.8973436 0.4229953 0.1258951 0.8782132 -0.3832081 -0.2861699 0.7842124 -0.3832032 -0.4880229 -0.8411428 0.4229898 0.3369845 0.8843418 0.464454 -0.04713985 0.8844564 0.4660272 -0.02357222 0.884349 0.4644397 0.04714594 0.8844637 0.4660134 0.02357128 -0.8411428 0.4229898 0.3369845 0.7842124 -0.3832032 -0.4880229 0.6446339 -0.3832037 -0.6615151 -0.7360554 0.4229903 0.5284899 0.8844637 0.4660134 0.02357128 0.884349 0.4644397 0.04714594 0.8979633 0.4268961 0.1068729 0.8982487 0.4307915 0.08699361 -0.7360554 0.4229903 0.5284899 0.6446339 -0.3832037 -0.6615151 0.4675887 -0.3832037 -0.796565 -0.5881916 0.4229915 0.6892815 0.8982487 0.4307915 0.08699361 0.8979633 0.4268961 0.1068729 0.9217077 0.3609885 0.1419235 0.9220353 0.3654335 0.1277078 -0.5881916 0.4229915 0.6892815 0.4675887 -0.3832037 -0.796565 0.2633747 -0.3832096 -0.885316 -0.4061388 0.4229956 0.810016 0.9220353 0.3654335 0.1277078 0.9217077 0.3609885 0.1419235 0.9496312 0.276659 0.1471746 0.9498907 0.2801335 0.1386835 -0.4061388 0.4229956 0.810016 0.2633747 -0.3832096 -0.885316 0.04384509 -0.3832107 -0.9226198 -0.2004873 0.4229974 0.8836731 0.9498907 0.2801335 0.1386835 0.9496312 0.276659 0.1471746 0.9752433 0.1823492 0.1250976 0.9753847 0.184243 0.1211581 -0.2004873 0.4229974 0.8836731 0.04384509 -0.3832107 -0.9226198 -0.1782136 -0.3832092 -0.9063061 0.01680376 0.4229967 0.9059755 0.9753847 0.184243 0.1211581 0.9752433 0.1823492 0.1250976 0.9930263 0.08352818 0.08319788 0.9930692 0.08410218 0.08210146 0.01680376 0.4229967 0.9059755 -0.1782136 -0.3832092 -0.9063061 -0.3899276 -0.3832096 -0.8373212 0.2331299 0.4229969 0.8756278 0.9930692 0.08410218 0.08210146 0.9930263 0.08352818 0.08319788 0.9993788 -0.01656449 0.03110943 0.999376 -0.01660067 0.03117759 0.2331299 0.4229969 0.8756278 -0.3899276 -0.3832096 -0.8373212 -0.5789872 -0.3832104 -0.7196691 0.4359146 0.4229969 0.794388 -0.7344012 -0.3832047 -0.5601866 0.6133623 0.4229923 0.6669815 0.4359146 0.4229969 0.794388 -0.5789872 -0.3832104 -0.7196691 0.9930567 -0.1157786 -0.02082554 0.9930717 -0.1155793 -0.02121784 0.999376 -0.01660067 0.03117759 0.9993788 -0.01656449 0.03110943</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape3-texbinormals-array" count="796" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_8Shape3-vertices" name="qt_gauge_needles_8Shape3-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_8Shape3-positions"/>
+ </vertices>
+ <triangles material="lambert2SG" count="60">
+ <input semantic="VERTEX" source="#qt_gauge_needles_8Shape3-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_8Shape3-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_8Shape3-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_8Shape3-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_8Shape3-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_8Shape3-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_8Shape3-texbinormals" offset="3" set="0"/>
+ <p>1 0 30 0 3 1 27 1 5 3 32 3 5 3 32 3 3 1 27 1 6 2 26 2 2 4 3 4 0 5 5 5 7 7 8 7 7 7 8 7 0 5 5 5 4 6 1 6 8 8 9 8 9 9 6 9 15 11 15 11 15 11 15 11 9 9 6 9 14 10 4 10 9 12 6 12 8 13 9 13 10 15 2 15 10 15 2 15 8 13 9 13 11 14 12 14 11 17 12 17 13 18 13 18 10 16 2 16 10 16 2 16 13 18 13 18 12 19 7 19 12 20 7 20 13 21 13 21 14 23 4 23 14 23 4 23 13 21 13 21 15 22 15 22 16 24 17 24 17 25 16 25 23 27 23 27 23 27 23 27 17 25 16 25 22 26 14 26 17 28 16 28 16 29 17 29 18 31 10 31 18 31 10 31 16 29 17 29 19 30 20 30 19 33 20 33 21 34 21 34 18 32 10 32 18 32 10 32 21 34 21 34 20 35 11 35 20 36 11 36 21 37 21 37 22 39 14 39 22 39 14 39 21 37 21 37 23 38 23 38 24 40 25 40 25 41 24 41 31 43 31 43 31 43 31 43 25 41 24 41 30 42 22 42 25 44 24 44 24 45 25 45 26 47 18 47 26 47 18 47 24 45 25 45 27 46 28 46 27 49 28 49 29 50 29 50 26 48 18 48 26 48 18 48 29 50 29 50 28 51 19 51 28 52 19 52 29 53 29 53 30 55 22 55 30 55 22 55 29 53 29 53 31 54 0 54 4 56 1 56 9 12 6 57 7 57 8 59 7 57 8 59 9 12 6 57 10 15 2 58 0 58 5 60 2 59 3 61 14 23 4 63 14 23 4 63 2 59 3 61 12 20 7 62 0 60 5 64 14 10 4 65 4 61 1 67 4 61 1 67 14 10 4 65 9 9 6 66 2 62 3 69 7 63 8 70 12 19 7 68 12 19 7 68 7 63 8 70 10 16 2 71 8 13 9 72 17 28 16 73 11 14 12 75 11 14 12 75 17 28 16 73 18 31 10 74 13 18 13 77 11 17 12 78 20 35 11 76 20 35 11 76 11 17 12 78 18 32 10 79 15 22 15 80 13 21 13 81 22 39 14 83 22 39 14 83 13 21 13 81 20 36 11 82 15 11 15 85 22 26 14 86 8 8 9 84 8 8 9 84 22 26 14 86 17 25 16 87 16 29 17 88 25 44 24 89 19 30 20 91 19 30 20 91 25 44 24 89 26 47 18 90 21 34 21 93 19 33 20 94 28 51 19 92 28 51 19 92 19 33 20 94 26 48 18 95 23 38 23 96 21 37 21 97 30 55 22 99 30 55 22 99 21 37 21 97 28 52 19 98 23 27 23 101 30 42 22 102 16 24 17 100 16 24 17 100 30 42 22 102 25 41 24 103 24 45 25 104 5 64 32 105 27 46 28 107 27 46 28 107 5 64 32 105 6 65 26 106 29 50 29 109 27 49 28 110 3 66 27 108 3 66 27 108 27 49 28 110 6 67 26 111 31 54 0 112 29 53 29 113 1 69 30 115 1 69 30 115 29 53 29 113 3 68 27 114 31 43 31 117 1 70 30 118 24 40 25 116 24 40 25 116 1 70 30 118 5 71 32 119</p>
+ </triangles>
+ <triangles material="lambert3SG" count="312">
+ <input semantic="VERTEX" source="#qt_gauge_needles_8Shape3-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_8Shape3-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_8Shape3-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_8Shape3-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_8Shape3-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_8Shape3-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_8Shape3-texbinormals" offset="3" set="0"/>
+ <p>33 72 33 120 32 73 34 121 58 74 35 122 34 75 36 123 33 72 33 124 58 74 35 125 35 76 37 126 34 75 36 127 58 74 35 128 36 77 38 129 35 76 37 130 58 74 35 131 37 78 39 132 36 77 38 133 58 74 35 134 38 79 40 135 37 78 39 136 58 74 35 137 39 80 41 138 38 79 40 139 58 74 35 140 40 81 42 141 39 80 41 142 58 74 35 143 41 82 43 144 40 81 42 145 58 74 35 146 42 83 44 147 41 82 43 148 58 74 35 149 43 84 45 150 42 83 44 151 58 74 35 152 44 85 46 153 43 84 45 154 58 74 35 155 45 86 47 156 44 85 46 157 58 74 35 158 46 87 48 159 45 86 47 160 58 74 35 161 47 88 49 162 46 87 48 163 58 74 35 164 48 89 50 165 47 88 49 166 58 74 35 167 49 90 51 168 48 89 50 169 58 74 35 170 50 91 52 171 49 90 51 172 58 74 35 173 51 92 53 174 50 91 52 175 58 74 35 176 52 93 54 177 51 92 53 178 58 74 35 179 53 94 55 180 52 93 54 181 58 74 35 182 54 95 56 183 53 94 55 184 58 74 35 185 55 96 57 186 54 95 56 187 58 74 35 188 56 97 58 189 55 96 57 190 58 74 35 191 57 98 59 192 56 97 58 193 58 74 35 194 32 73 34 195 57 98 59 196 58 74 35 197 60 99 60 198 61 100 61 199 110 102 63 201 110 102 63 201 61 100 61 199 111 101 62 200 61 100 64 202 60 99 65 203 63 104 67 205 63 104 67 205 60 99 65 203 62 103 66 204 63 104 68 206 62 103 66 207 65 106 70 209 65 106 70 209 62 103 66 207 64 105 69 208 65 106 71 210 64 105 69 211 67 108 73 213 67 108 73 213 64 105 69 211 66 107 72 212 67 108 74 214 66 107 72 215 69 110 76 217 69 110 76 217 66 107 72 215 68 109 75 216 69 110 77 218 68 109 75 219 71 112 79 221 71 112 79 221 68 109 75 219 70 111 78 220 71 112 80 222 70 111 78 223 73 114 82 225 73 114 82 225 70 111 78 223 72 113 81 224 73 114 83 226 72 113 81 227 75 116 85 229 75 116 85 229 72 113 81 227 74 115 84 228 75 116 86 230 74 115 84 231 77 118 88 233 77 118 88 233 74 115 84 231 76 117 87 232 77 118 89 234 76 117 87 235 79 120 91 237 79 120 91 237 76 117 87 235 78 119 90 236 79 120 92 238 78 119 90 239 81 122 94 241 81 122 94 241 78 119 90 239 80 121 93 240 81 122 95 242 80 121 93 243 83 124 97 245 83 124 97 245 80 121 93 243 82 123 96 244 83 124 98 246 82 123 96 247 85 126 100 249 85 126 100 249 82 123 96 247 84 125 99 248 85 126 101 250 84 125 99 251 87 128 103 253 87 128 103 253 84 125 99 251 86 127 102 252 87 128 104 254 86 127 102 255 89 130 106 257 89 130 106 257 86 127 102 255 88 129 105 256 89 130 107 258 88 129 105 259 91 132 109 261 91 132 109 261 88 129 105 259 90 131 108 260 91 132 110 262 90 131 108 263 93 134 112 265 93 134 112 265 90 131 108 263 92 133 111 264 93 134 113 266 92 133 111 267 95 136 115 269 95 136 115 269 92 133 111 267 94 135 114 268 95 136 116 270 94 135 114 271 97 138 118 273 97 138 118 273 94 135 114 271 96 137 117 272 97 138 119 274 96 137 117 275 99 140 121 277 99 140 121 277 96 137 117 275 98 139 120 276 99 140 122 278 98 139 120 279 101 142 124 281 101 142 124 281 98 139 120 279 100 141 123 280 101 142 125 282 100 141 123 283 103 144 127 285 103 144 127 285 100 141 123 283 102 143 126 284 103 144 128 286 102 143 126 287 105 146 130 289 105 146 130 289 102 143 126 287 104 145 129 288 105 146 131 290 104 145 129 291 107 148 133 293 107 148 133 293 104 145 129 291 106 147 132 292 107 148 134 294 106 147 132 295 109 150 136 297 109 150 136 297 106 147 132 295 108 149 135 296 109 150 137 298 108 149 135 299 111 101 138 301 111 101 138 301 108 149 135 299 110 102 63 300 32 151 139 302 33 152 140 303 60 154 65 305 60 154 65 305 33 152 140 303 62 153 66 304 33 152 140 306 34 155 141 307 62 153 66 309 62 153 66 309 34 155 141 307 64 156 69 308 34 155 141 310 35 157 142 311 64 156 69 313 64 156 69 313 35 157 142 311 66 158 72 312 35 157 142 314 36 159 143 315 66 158 72 317 66 158 72 317 36 159 143 315 68 160 75 316 36 159 143 318 37 161 144 319 68 160 75 321 68 160 75 321 37 161 144 319 70 162 78 320 37 161 144 322 38 163 145 323 70 162 78 325 70 162 78 325 38 163 145 323 72 164 81 324 38 163 145 326 39 165 146 327 72 164 81 329 72 164 81 329 39 165 146 327 74 166 84 328 39 165 146 330 40 167 147 331 74 166 84 333 74 166 84 333 40 167 147 331 76 168 87 332 40 167 147 334 41 169 148 335 76 168 87 337 76 168 87 337 41 169 148 335 78 170 90 336 41 169 148 338 42 171 149 339 78 170 90 341 78 170 90 341 42 171 149 339 80 172 93 340 42 171 149 342 43 173 150 343 80 172 93 345 80 172 93 345 43 173 150 343 82 174 96 344 43 173 150 346 44 175 151 347 82 174 96 349 82 174 96 349 44 175 151 347 84 176 99 348 44 175 151 350 45 177 152 351 84 176 99 353 84 176 99 353 45 177 152 351 86 178 102 352 45 177 152 354 46 179 153 355 86 178 102 357 86 178 102 357 46 179 153 355 88 180 105 356 46 179 153 358 47 181 154 359 88 180 105 361 88 180 105 361 47 181 154 359 90 182 108 360 47 181 154 362 48 183 155 363 90 182 108 365 90 182 108 365 48 183 155 363 92 184 111 364 48 183 155 366 49 185 156 367 92 184 111 369 92 184 111 369 49 185 156 367 94 186 114 368 49 185 156 370 50 187 157 371 94 186 114 373 94 186 114 373 50 187 157 371 96 188 117 372 50 187 157 374 51 189 158 375 96 188 117 377 96 188 117 377 51 189 158 375 98 190 120 376 51 189 158 378 52 191 159 379 98 190 120 381 98 190 120 381 52 191 159 379 100 192 123 380 52 191 159 382 53 193 160 383 100 192 123 385 100 192 123 385 53 193 160 383 102 194 126 384 53 193 160 386 54 195 161 387 102 194 126 389 102 194 126 389 54 195 161 387 104 196 129 388 54 195 161 390 55 197 162 391 104 196 129 393 104 196 129 393 55 197 162 391 106 198 132 392 55 197 162 394 56 199 163 395 106 198 132 397 106 198 132 397 56 199 163 395 108 200 135 396 56 199 163 398 57 201 164 399 108 200 135 401 108 200 135 401 57 201 164 399 110 202 63 400 57 201 164 402 32 151 165 403 110 202 63 405 110 202 63 405 32 151 165 403 60 154 60 404 112 203 166 406 115 204 167 407 59 205 168 408 115 204 167 409 118 206 169 410 59 205 168 411 118 206 169 412 121 207 170 413 59 205 168 414 121 207 170 415 124 208 171 416 59 205 168 417 124 208 171 418 127 209 172 419 59 205 168 420 127 209 172 421 130 210 173 422 59 205 168 423 130 210 173 424 133 211 174 425 59 205 168 426 133 211 174 427 136 212 175 428 59 205 168 429 136 212 175 430 139 213 176 431 59 205 168 432 139 213 176 433 142 214 177 434 59 205 168 435 142 214 177 436 145 215 178 437 59 205 168 438 145 215 178 439 148 216 179 440 59 205 168 441 148 216 179 442 151 217 180 443 59 205 168 444 151 217 180 445 154 218 181 446 59 205 168 447 154 218 181 448 157 219 182 449 59 205 168 450 157 219 182 451 160 220 183 452 59 205 168 453 160 220 183 454 163 221 184 455 59 205 168 456 163 221 184 457 166 222 185 458 59 205 168 459 166 222 185 460 169 223 186 461 59 205 168 462 169 223 186 463 172 224 187 464 59 205 168 465 172 224 187 466 175 225 188 467 59 205 168 468 175 225 188 469 178 226 189 470 59 205 168 471 178 226 189 472 181 227 190 473 59 205 168 474 181 227 190 475 184 228 191 476 59 205 168 477 184 228 191 478 187 229 192 479 59 205 168 480 187 229 192 481 112 203 166 482 59 205 168 483 61 230 193 484 63 231 194 485 114 233 196 487 114 233 196 487 63 231 194 485 117 232 195 486 63 231 194 488 65 234 197 489 117 232 195 491 117 232 195 491 65 234 197 489 120 235 198 490 65 234 197 492 67 236 199 493 120 235 198 495 120 235 198 495 67 236 199 493 123 237 200 494 67 236 199 496 69 238 201 497 123 237 200 499 123 237 200 499 69 238 201 497 126 239 202 498 69 238 201 500 71 240 203 501 126 239 202 503 126 239 202 503 71 240 203 501 129 241 204 502 71 240 203 504 73 242 205 505 129 241 204 507 129 241 204 507 73 242 205 505 132 243 206 506 73 242 205 508 75 244 207 509 132 243 206 511 132 243 206 511 75 244 207 509 135 245 208 510 75 244 207 512 77 246 209 513 135 245 208 515 135 245 208 515 77 246 209 513 138 247 210 514 77 246 209 516 79 248 211 517 138 247 210 519 138 247 210 519 79 248 211 517 141 249 212 518 79 248 211 520 81 250 213 521 141 249 212 523 141 249 212 523 81 250 213 521 144 251 214 522 81 250 213 524 83 252 215 525 144 251 214 527 144 251 214 527 83 252 215 525 147 253 216 526 83 252 215 528 85 254 217 529 147 253 216 531 147 253 216 531 85 254 217 529 150 255 218 530 85 254 217 532 87 256 219 533 150 255 218 535 150 255 218 535 87 256 219 533 153 257 220 534 87 256 219 536 89 258 221 537 153 257 220 539 153 257 220 539 89 258 221 537 156 259 222 538 89 258 221 540 91 260 223 541 156 259 222 543 156 259 222 543 91 260 223 541 159 261 224 542 91 260 223 544 93 262 225 545 159 261 224 547 159 261 224 547 93 262 225 545 162 263 226 546 93 262 225 548 95 264 227 549 162 263 226 551 162 263 226 551 95 264 227 549 165 265 228 550 95 264 227 552 97 266 229 553 165 265 228 555 165 265 228 555 97 266 229 553 168 267 230 554 97 266 229 556 99 268 231 557 168 267 230 559 168 267 230 559 99 268 231 557 171 269 232 558 99 268 231 560 101 270 233 561 171 269 232 563 171 269 232 563 101 270 233 561 174 271 234 562 101 270 233 564 103 272 235 565 174 271 234 567 174 271 234 567 103 272 235 565 177 273 236 566 103 272 235 568 105 274 237 569 177 273 236 571 177 273 236 571 105 274 237 569 180 275 238 570 105 274 237 572 107 276 239 573 180 275 238 575 180 275 238 575 107 276 239 573 183 277 240 574 107 276 239 576 109 278 241 577 183 277 240 579 183 277 240 579 109 278 241 577 186 279 242 578 109 278 241 580 111 280 243 581 186 279 242 583 186 279 242 583 111 280 243 581 189 281 244 582 111 280 243 584 61 230 193 585 189 281 244 587 189 281 244 587 61 230 193 585 114 233 196 586 112 282 166 588 113 283 245 589 115 285 167 591 115 285 167 591 113 283 245 589 116 284 246 590 113 286 245 592 114 287 196 593 116 289 246 595 116 289 246 595 114 287 196 593 117 288 195 594 115 285 167 596 116 284 246 597 118 291 169 599 118 291 169 599 116 284 246 597 119 290 247 598 116 289 246 600 117 288 195 601 119 293 247 603 119 293 247 603 117 288 195 601 120 292 198 602 118 291 169 604 119 290 247 605 121 295 170 607 121 295 170 607 119 290 247 605 122 294 248 606 119 293 247 608 120 292 198 609 122 297 248 611 122 297 248 611 120 292 198 609 123 296 200 610 121 295 170 612 122 294 248 613 124 299 171 615 124 299 171 615 122 294 248 613 125 298 249 614 122 297 248 616 123 296 200 617 125 301 249 619 125 301 249 619 123 296 200 617 126 300 202 618 124 299 171 620 125 298 249 621 127 303 172 623 127 303 172 623 125 298 249 621 128 302 250 622 125 301 249 624 126 300 202 625 128 305 250 627 128 305 250 627 126 300 202 625 129 304 204 626 127 303 172 628 128 302 250 629 130 307 173 631 130 307 173 631 128 302 250 629 131 306 251 630 128 305 250 632 129 304 204 633 131 309 251 635 131 309 251 635 129 304 204 633 132 308 206 634 130 307 173 636 131 306 251 637 133 311 174 639 133 311 174 639 131 306 251 637 134 310 252 638 131 309 251 640 132 308 206 641 134 313 252 643 134 313 252 643 132 308 206 641 135 312 208 642 133 311 174 644 134 310 252 645 136 315 175 647 136 315 175 647 134 310 252 645 137 314 253 646 134 313 252 648 135 312 208 649 137 317 253 651 137 317 253 651 135 312 208 649 138 316 210 650 136 315 175 652 137 314 253 653 139 319 176 655 139 319 176 655 137 314 253 653 140 318 254 654 137 317 253 656 138 316 210 657 140 321 254 659 140 321 254 659 138 316 210 657 141 320 212 658 139 319 176 660 140 318 254 661 142 323 177 663 142 323 177 663 140 318 254 661 143 322 255 662 140 321 254 664 141 320 212 665 143 325 255 667 143 325 255 667 141 320 212 665 144 324 214 666 142 323 177 668 143 322 255 669 145 327 178 671 145 327 178 671 143 322 255 669 146 326 256 670 143 325 255 672 144 324 214 673 146 329 256 675 146 329 256 675 144 324 214 673 147 328 216 674 145 327 178 676 146 326 256 677 148 331 179 679 148 331 179 679 146 326 256 677 149 330 257 678 146 329 256 680 147 328 216 681 149 333 257 683 149 333 257 683 147 328 216 681 150 332 218 682 148 331 179 684 149 330 257 685 151 335 180 687 151 335 180 687 149 330 257 685 152 334 258 686 149 333 257 688 150 332 218 689 152 337 258 691 152 337 258 691 150 332 218 689 153 336 220 690 151 335 180 692 152 334 258 693 154 339 181 695 154 339 181 695 152 334 258 693 155 338 259 694 152 337 258 696 153 336 220 697 155 341 259 699 155 341 259 699 153 336 220 697 156 340 222 698 154 339 181 700 155 338 259 701 157 343 182 703 157 343 182 703 155 338 259 701 158 342 260 702 155 341 259 704 156 340 222 705 158 345 260 707 158 345 260 707 156 340 222 705 159 344 224 706 157 343 182 708 158 342 260 709 160 347 183 711 160 347 183 711 158 342 260 709 161 346 261 710 158 345 260 712 159 344 224 713 161 349 261 715 161 349 261 715 159 344 224 713 162 348 226 714 160 347 183 716 161 346 261 717 163 351 184 719 163 351 184 719 161 346 261 717 164 350 262 718 161 349 261 720 162 348 226 721 164 353 262 723 164 353 262 723 162 348 226 721 165 352 228 722 163 351 184 724 164 350 262 725 166 355 185 727 166 355 185 727 164 350 262 725 167 354 263 726 164 353 262 728 165 352 228 729 167 357 263 731 167 357 263 731 165 352 228 729 168 356 230 730 166 355 185 732 167 354 263 733 169 359 186 735 169 359 186 735 167 354 263 733 170 358 264 734 167 357 263 736 168 356 230 737 170 361 264 739 170 361 264 739 168 356 230 737 171 360 232 738 169 359 186 740 170 358 264 741 172 363 187 743 172 363 187 743 170 358 264 741 173 362 265 742 170 361 264 744 171 360 232 745 173 365 265 747 173 365 265 747 171 360 232 745 174 364 234 746 172 363 187 748 173 362 265 749 175 367 188 751 175 367 188 751 173 362 265 749 176 366 266 750 173 365 265 752 174 364 234 753 176 369 266 755 176 369 266 755 174 364 234 753 177 368 236 754 175 367 188 756 176 366 266 757 178 371 189 759 178 371 189 759 176 366 266 757 179 370 267 758 176 369 266 760 177 368 236 761 179 373 267 763 179 373 267 763 177 368 236 761 180 372 238 762 178 371 189 764 179 370 267 765 181 375 190 767 181 375 190 767 179 370 267 765 182 374 268 766 179 373 267 768 180 372 238 769 182 377 268 771 182 377 268 771 180 372 238 769 183 376 240 770 181 375 190 772 182 374 268 773 184 379 191 775 184 379 191 775 182 374 268 773 185 378 269 774 182 377 268 776 183 376 240 777 185 381 269 779 185 381 269 779 183 376 240 777 186 380 242 778 184 379 191 780 185 378 269 781 187 383 192 783 187 383 192 783 185 378 269 781 188 382 270 782 185 381 269 784 186 380 242 785 188 385 270 787 188 385 270 787 186 380 242 785 189 384 244 786 114 287 196 788 113 286 245 789 189 384 244 791 189 384 244 791 113 286 245 789 188 385 270 790 113 283 245 792 112 282 166 793 188 382 270 795 188 382 270 795 112 282 166 793 187 383 192 794</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_8Shape3</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_3" name="qt_gauge_needles_3" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_8Shape3">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#red_transparent"/>
+ <instance_material symbol="lambert3SG" target="#black_solid"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_3</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_4.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_4.dae
new file mode 100644
index 0000000..b9f54cf
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_4.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:54:56</created>
+ <modified>2018-03-08T09:54:56</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_Shape4" name="qt_gauge_needles_Shape4">
+ <mesh>
+ <source id="qt_gauge_needles_Shape4-positions" name="qt_gauge_needles_Shape4-positions">
+ <float_array id="qt_gauge_needles_Shape4-positions-array" count="24">-0.1028175 0 -12 -1 0 4 0.1028175 0 -12 1 0 4 -0.1028175 0.1341655 -12 -1 1.26863 4 1 1.26863 4 0.1028175 0.1341655 -12</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape4-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape4-normals" name="qt_gauge_needles_Shape4-normals">
+ <float_array id="qt_gauge_needles_Shape4-normals-array" count="72">0 0.9974957 -0.07072645 0 0.9974957 -0.07072646 0 0.9974957 -0.07072646 0 0.9974957 -0.07072645 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 -0.9984315 0 -0.05598596 -0.9984315 0 -0.05598596 -0.9984314 0 -0.05598595 -0.9984316 0 -0.05598596 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.9984315 0 -0.05598596 0.9984315 0 -0.05598596 0.9984315 0 -0.05598596 0.9984316 0 -0.05598597 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape4-normals-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape4-tangents" name="qt_gauge_needles_Shape4-tangents">
+ <float_array id="qt_gauge_needles_Shape4-tangents-array" count="72">0 0.07072646 0.9974958 0.9984394 0.003949803 0.05570633 0 -0.07072647 -0.9974958 -0.9984394 0.003949803 0.05570633 0.9984315 0 0.05598595 0 0 0.9999999 -0.9984316 0 0.05598595 0 0 -1 -0.05598596 0 0.9984315 0 1 0 0.05598596 0 -0.9984316 -0.003953509 -0.9975036 0.07050533 0.9999999 0 0 0 1 0 -0.9999999 0 0 0 -1 0 -0.05598596 0 -0.9984316 0 1 0 0.05598596 0 0.9984315 0.003953509 -0.9975036 0.07050533 -1 0 0 0 1 0 1 0 0 0 -1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape4-tangents-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape4-binormals" name="qt_gauge_needles_Shape4-binormals">
+ <float_array id="qt_gauge_needles_Shape4-binormals-array" count="72">1 0 0 0.05584618 -0.07061608 -0.995939 -1 0 0 0.05584619 0.07061608 0.9959391 -0.05598596 0 0.9984316 -1 0 0 -0.05598596 0 -0.9984316 1 0 0 0 1 0 0.05598596 0 -0.9984316 0 -1 0 -0.05584619 0.07061609 0.9959391 0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 0 0.05598596 0 0.9984316 0 -1 0 -0.0558462 -0.07061608 -0.995939 0 1 0 1 0 0 0 -1 0 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape4-binormals-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape4-map1" name="qt_gauge_needles_Shape4-map1">
+ <float_array id="qt_gauge_needles_Shape4-map1-array" count="24">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape4-map1-array" count="12" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape4-textangents">
+ <float_array id="qt_gauge_needles_Shape4-textangents-array" count="72">-0.05584619 0.07061607 0.995939 0 0.07072646 0.9974957 0.05584619 0.07061608 0.995939 0 0.07072645 0.9974957 -0.05598595 0 0.9984315 0 0 1 0.05598595 0 0.9984315 0 0 1 -0.05598596 0 0.9984315 0.03942199 0.7100605 -0.7030363 0.05584619 -0.07061607 -0.995939 -0.03942199 -0.7100605 0.7030363 0.9999999 0 0 -0.4818488 0.8762544 0 -0.9999999 0 0 0.4818488 -0.8762544 0 -0.05598548 0.004185986 -0.9984229 0 0.9999999 0 0.0559588 0.03114641 0.997947 0 -1 0 -0.9999999 0 0 0.4762212 0.8793256 0 0.9999999 0 0 -0.4762212 -0.8793256 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape4-textangents-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape4-texbinormals">
+ <float_array id="qt_gauge_needles_Shape4-texbinormals-array" count="72">0.9984394 0.003949803 0.05570634 1 0 0 0.9984394 -0.003949804 -0.05570634 1 0 0 0.9984316 0 0.05598596 1 0 0 0.9984316 0 -0.05598595 1 0 0 0 1 0 0.03975342 -0.7041407 -0.7089468 -0.003953509 -0.9975036 0.07050532 -0.03975342 0.7041407 0.7089468 0 1 0 -0.8762544 -0.4818488 0 0 -1 0 0.8762544 0.4818488 0 2.34356e-4 0.9999913 0.00417942 0.05598596 0 0.9984316 0.001743762 -0.9995149 0.03109757 -0.05598597 0 -0.9984316 0 1 0 0.8793256 -0.4762212 0 0 -1 0 -0.8793256 0.4762212 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape4-texbinormals-array" count="24" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_Shape4-vertices" name="qt_gauge_needles_Shape4-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_Shape4-positions"/>
+ </vertices>
+ <triangles material="lambert4SG" count="12">
+ <input semantic="VERTEX" source="#qt_gauge_needles_Shape4-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_Shape4-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_Shape4-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_Shape4-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_Shape4-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_Shape4-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_Shape4-texbinormals" offset="3" set="0"/>
+ <p>4 0 8 0 5 1 9 1 7 3 11 3 5 1 9 1 6 2 10 2 7 3 11 3 0 4 4 4 2 5 7 5 1 7 5 7 2 5 7 5 3 6 6 6 1 7 5 7 0 8 0 8 1 9 1 9 4 11 8 11 1 9 1 9 5 10 9 10 4 11 8 11 1 12 1 12 3 13 3 13 5 15 9 15 5 15 9 15 3 13 3 13 6 14 10 14 2 17 2 17 7 18 11 18 3 16 3 16 3 16 3 16 7 18 11 18 6 19 10 19 2 20 2 20 0 21 0 21 7 23 11 23 7 23 11 23 0 21 0 21 4 22 8 22</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_Shape4</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_4" name="qt_gauge_needles_4" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_Shape4">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_4</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_5.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_5.dae
new file mode 100644
index 0000000..afc0240
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_5.dae
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:55:08</created>
+ <modified>2018-03-08T09:55:08</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ <material id="black_solid" name="black_solid">
+ <instance_effect url="#black_solid-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="black_solid-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2938931 0.2938931 0.2938931 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03053435 0.03053435 0.03053435 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">black_solid</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_6Shape5" name="qt_gauge_needles_6Shape5">
+ <mesh>
+ <source id="qt_gauge_needles_6Shape5-positions" name="qt_gauge_needles_6Shape5-positions">
+ <float_array id="qt_gauge_needles_6Shape5-positions-array" count="150">-0.1001625 0.1463934 -12 -0.8561974 0.1463934 4 0.1001625 0.1463934 -12 0.8561974 0.1463934 4 -0.1001625 0.4019205 -12 -0.8561974 0.4019205 4 0.8561974 0.4019205 4 0.1001625 0.4019205 -12 0.4370155 0 1.344998 0.8312531 0 1.144124 1.144123 0 0.8312544 1.344997 0 0.4370162 1.414215 0 0 1.344997 0 -0.4370162 1.144123 0 -0.8312542 0.8312531 0 -1.144123 0.4370155 0 -1.344997 0 0 -1.414214 -0.4370155 0 -1.344997 -0.8312531 0 -1.144123 -1.144123 0 -0.831254 -1.344997 0 -0.4370161 -1.414213 0 0 -1.344997 0 0.437016 -1.144123 0 0.8312538 -0.8312531 0 1.144123 -0.4370155 0 1.344997 0 0 1.414214 0.4370155 0.5337088 1.344998 0.8312531 0.5337088 1.144124 1.144123 0.5337088 0.8312544 1.344997 0.5337088 0.4370162 1.414215 0.5337088 0 1.344997 0.5337088 -0.4370162 1.144123 0.5337088 -0.8312542 0.8312531 0.5337088 -1.144123 0.4370155 0.5337088 -1.344997 0 0.5337088 -1.414214 -0.4370155 0.5337088 -1.344997 -0.8312531 0.5337088 -1.144123 -1.144123 0.5337088 -0.831254 -1.344997 0.5337088 -0.4370161 -1.414213 0.5337088 0 -1.344997 0.5337088 0.437016 -1.144123 0.5337088 0.8312538 -0.8312531 0.5337088 1.144123 -0.4370155 0.5337088 1.344997 0 0.5337088 1.414214 0 0 0 0 0.5337088 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape5-positions-array" count="50" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape5-normals" name="qt_gauge_needles_6Shape5-normals">
+ <float_array id="qt_gauge_needles_6Shape5-normals-array" count="318">0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 -0.9988854 0 -0.04719951 -0.9988854 0 -0.04719951 -0.9988854 0 -0.04719951 -0.9988854 0 -0.04719951 0 0 1 0 0 1 0 0 1 0 0 1 0.9988854 0 -0.04719951 0.9988854 0 -0.04719951 0.9988854 0 -0.04719951 0.9988854 0 -0.04719951 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.3090164 0 0.9510567 0.5877851 0 0.8090171 0.5877851 0 0.8090171 0.3090164 0 0.9510567 0.8090165 0 0.5877859 0.8090165 0 0.5877859 0.9510562 0 0.3090181 0.9510562 0 0.3090181 1 0 0 1 0 0 0.9510561 0 -0.3090182 0.9510561 0 -0.3090182 0.8090163 0 -0.5877861 0.8090163 0 -0.5877861 0.5877849 0 -0.8090172 0.5877849 0 -0.8090172 0.3090174 0 -0.9510564 0.3090174 0 -0.9510564 0 0 -1 0 0 -1 -0.3090174 0 -0.9510564 -0.3090174 0 -0.9510564 -0.5877851 0 -0.8090172 -0.5877851 0 -0.8090172 -0.8090163 0 -0.5877861 -0.8090163 0 -0.5877861 -0.9510568 0 -0.3090163 -0.9510568 0 -0.3090163 -1 0 0 -1 0 0 -0.9510568 0 0.3090164 -0.9510568 0 0.3090164 -0.8090163 0 0.5877861 -0.8090163 0 0.5877861 -0.5877849 0 0.8090172 -0.5877849 0 0.8090172 -0.3090172 0 0.9510564 -0.3090172 0 0.9510564 0 0 1 0 0 1 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape5-normals-array" count="106" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape5-tangents" name="qt_gauge_needles_6Shape5-tangents">
+ <float_array id="qt_gauge_needles_6Shape5-tangents-array" count="318">0 0 0.9999999 0.9988855 0 0.04719951 0 0 -1 -0.9988855 0 0.04719951 0.9988855 0 0.04719951 0 0 0.9999999 -0.9988855 0 0.04719951 0 0 -1 -0.04719952 0 0.9988855 0 1 0 0.04719952 0 -0.9988855 0 -1 0 1 0 0 0 1 0 -1 0 0 0 -1 0 -0.04719952 0 -0.9988855 0 1 0 0.04719952 0 0.9988855 0 -1 0 -1 0 0 0 1 0 1 0 0 0 -1 0 0.9510567 0 -0.3090164 0 1 0 -0.8090171 0 0.5877851 0 -1 0 0 1 0 -0.5877859 0 0.8090165 0 1 0 -0.3090181 0 0.9510561 0 1 0 0 0 1 0 1 0 0.3090182 0 0.9510562 0 1 0 0.5877861 0 0.8090163 0 1 0 0.8090172 0 0.5877849 0 1 0 0.9510564 0 0.3090174 0 1 0 1 0 0 0 1 0 0.9510564 0 -0.3090174 0 0.9999999 0 0.8090172 0 -0.5877851 0 1 0 0.5877861 0 -0.8090164 0 0.9999999 0 0.3090163 0 -0.9510568 0 1 0 0 0 -1 0 1 0 -0.3090164 0 -0.9510568 0 1 0 -0.5877861 0 -0.8090163 0 0.9999999 0 -0.8090172 0 -0.5877849 0 1 0 -0.9510565 0 -0.3090172 0 1 0 -1 0 0 -0.8090174 0 0.5877846 -0.453991 0 -0.8910062 0.9510567 0 -0.3090165 -0.5877854 0 0.8090169 -0.3090171 0 0.9510565 0 0 0.9999999 0.309017 0 0.9510564 0.5877852 0 0.8090169 0.8090173 0 0.5877848 0.9510566 0 0.3090166 0.9999999 0 0 0.9510566 0 -0.3090166 0.8090173 0 -0.5877848 0.5877852 0 -0.8090169 0.309017 0 -0.9510564 0 0 -0.9999999 -0.3090169 0 -0.9510565 -0.5877852 0 -0.8090171 -0.8090173 0 -0.5877849 -0.9510566 0 -0.3090167 -0.9999999 0 0 0.9510567 0 -0.3090165 -0.453991 0 -0.8910062 -0.8090174 0 0.5877846 -0.7071059 0 -0.7071077 -0.8910066 0 -0.4539905 -0.987688 0 -0.1564369 -0.987688 0 0.1564369 -0.8910065 0 0.4539906 -0.7071055 0 0.707108 -0.453991 0 0.8910062 -0.1564345 0 0.9876884 0.1564345 0 0.9876884 0.453991 0 0.8910062 0.7071058 0 0.7071079 0.8910064 0 0.4539906 0.9876885 0 0.1564327 0.9876887 0 -0.1564328 0.8910064 0 -0.4539906 0.7071056 0 -0.7071079 0.4539908 0 -0.8910064 0.1564345 0 -0.9876884</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape5-tangents-array" count="106" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape5-binormals" name="qt_gauge_needles_6Shape5-binormals">
+ <float_array id="qt_gauge_needles_6Shape5-binormals-array" count="318">1 0 0 0.04719952 0 -0.9988856 -1 0 0 0.04719952 0 0.9988856 -0.04719952 0 0.9988856 -1 0 0 -0.04719952 0 -0.9988856 1 0 0 0 1 0 0.04719952 0 -0.9988855 0 -1 0 -0.04719952 0 0.9988855 0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 0 0.04719952 0 0.9988855 0 -1 0 -0.04719952 0 -0.9988855 0 1 0 1 0 0 0 -1 0 -1 0 0 0 1 0 -0.8090172 0 0.5877851 0 -1 0 0.9510567 0 -0.3090164 -0.5877859 0 0.8090165 0 -1 0 -0.3090181 0 0.9510562 0 -1 0 0 0 1 0 -1 0 0.3090182 0 0.9510562 0 -1 0 0.5877861 0 0.8090163 0 -1 0 0.8090172 0 0.5877849 0 -1 0 0.9510565 0 0.3090174 0 -1 0 1 0 0 0 -1 0 0.9510565 0 -0.3090174 0 -1 0 0.8090172 0 -0.5877851 0 -1 0 0.5877861 0 -0.8090165 0 -1 0 0.3090163 0 -0.9510568 0 -1 0 0 0 -1 0 -1 0 -0.3090164 0 -0.9510568 0 -1 0 -0.5877861 0 -0.8090163 0 -1 0 -0.8090173 0 -0.5877849 0 -1 0 -0.9510565 0 -0.3090172 0 -1 0 -1 0 0 0 -1 0 -0.5877846 0 -0.8090175 0.8910063 0 -0.453991 0.3090165 0 0.9510568 -0.809017 0 -0.5877854 -0.9510565 0 -0.3090171 -1 0 0 -0.9510565 0 0.3090171 -0.809017 0 0.5877853 -0.5877848 0 0.8090174 -0.3090166 0 0.9510567 0 0 1 0.3090166 0 0.9510567 0.5877848 0 0.8090174 0.8090171 0 0.5877852 0.9510565 0 0.309017 1 0 0 0.9510567 0 -0.3090169 0.8090171 0 -0.5877852 0.5877849 0 -0.8090173 0.3090167 0 -0.9510567 0 0 -1 -0.3090165 0 -0.9510568 -0.8910064 0 0.453991 0.5877846 0 0.8090175 -0.7071077 0 0.7071059 -0.4539905 0 0.8910066 -0.1564369 0 0.987688 0.1564369 0 0.987688 0.4539906 0 0.8910065 0.7071081 0 0.7071055 0.8910064 0 0.453991 0.9876884 0 0.1564345 0.9876884 0 -0.1564345 0.8910063 0 -0.453991 0.7071079 0 -0.7071058 0.4539907 0 -0.8910065 0.1564327 0 -0.9876887 -0.1564328 0 -0.9876887 -0.4539907 0 -0.8910065 -0.707108 0 -0.7071056 -0.8910064 0 -0.4539908 -0.9876884 0 -0.1564345</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape5-binormals-array" count="106" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape5-map1" name="qt_gauge_needles_6Shape5-map1">
+ <float_array id="qt_gauge_needles_6Shape5-map1-array" count="192">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0.375 0.3125 0.3875 0.3125 0.3875 0.6884398 0.375 0.6884398 0.4 0.3125 0.4 0.6884398 0.4125 0.3125 0.4125 0.6884398 0.425 0.3125 0.425 0.6884398 0.4374999 0.3125 0.4374999 0.6884398 0.4499999 0.3125 0.4499999 0.6884398 0.4624999 0.3125 0.4624999 0.6884398 0.4749999 0.3125 0.4749999 0.6884398 0.4874999 0.3125 0.4874999 0.6884398 0.4999999 0.3125 0.4999999 0.6884398 0.5124999 0.3125 0.5124999 0.6884398 0.5249999 0.3125 0.5249999 0.6884398 0.5374998 0.3125 0.5374998 0.6884398 0.5499998 0.3125 0.5499998 0.6884398 0.5624998 0.3125 0.5624998 0.6884398 0.5749998 0.3125 0.5749998 0.6884398 0.5874998 0.3125 0.5874998 0.6884398 0.5999998 0.3125 0.5999998 0.6884398 0.6124998 0.3125 0.6124998 0.6884398 0.6249998 0.3125 0.6249998 0.6884398 0.626409 0.0644085 0.6486027 0.1079661 0.5 0.15 0.5918415 0.02984102 0.5482839 0.007647336 0.5 0 0.4517161 0.00764735 0.4081585 0.02984105 0.3735911 0.06440853 0.3513974 0.1079661 0.34375 0.15625 0.3513974 0.2045339 0.3735911 0.2480915 0.4081585 0.2826589 0.4517161 0.3048526 0.5 0.3125 0.5482839 0.3048526 0.5918415 0.2826589 0.6264089 0.2480915 0.6486026 0.2045339 0.65625 0.15625 0.6486026 0.8920339 0.6264089 0.9355915 0.5 0.8375 0.5918415 0.9701589 0.5482839 0.9923526 0.5 1 0.4517161 0.9923526 0.4081585 0.9701589 0.3735911 0.9355915 0.3513974 0.8920339 0.34375 0.84375 0.3513974 0.7954661 0.3735911 0.7519085 0.4081585 0.7173411 0.4517161 0.6951473 0.5 0.6874999 0.5482839 0.6951473 0.5918415 0.717341 0.626409 0.7519085 0.6486027 0.7954661 0.65625 0.84375</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape5-map1-array" count="96" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape5-textangents">
+ <float_array id="qt_gauge_needles_6Shape5-textangents-array" count="672">-0.04719951 0 0.9988855 0 0 1 0.04719951 0 0.9988855 0 0 1 -0.04719951 0 0.9988855 0 0 1 0.04719951 0 0.9988855 0 0 1 -0.04719951 0 0.9988853 0.03310785 0.7127239 -0.700663 0.04719951 0 -0.9988853 -0.03310785 -0.7127239 0.700663 0.9999999 0 0 -0.6528445 0.7574918 0 -0.9999999 0 0 0.6528445 -0.7574918 0 -0.04719951 0 -0.9988853 0.03310785 0.7127239 0.700663 0.04719951 0 0.9988853 -0.03310785 -0.7127239 -0.700663 -0.9999999 0 0 0.3263544 0.9452474 0 0.9999999 0 0 -0.3263544 -0.9452474 0 0.9510567 0 -0.3090164 0.8090171 0 -0.5877851 0.8090171 0 -0.5877851 0.9510567 0 -0.3090164 0.8090171 0 -0.5877851 0.5877858 0 -0.8090165 0.5877858 0 -0.8090165 0.8090171 0 -0.5877851 0.5877858 0 -0.8090165 0.3090181 0 -0.9510561 0.3090181 0 -0.9510561 0.5877858 0 -0.8090165 0.3090181 0 -0.9510561 0 0 -0.9999999 0 0 -0.9999999 0.3090181 0 -0.9510561 0 0 -0.9999999 -0.3090182 0 -0.9510561 -0.3090182 0 -0.9510561 0 0 -0.9999999 -0.3090182 0 -0.9510561 -0.5877861 0 -0.8090163 -0.5877861 0 -0.8090163 -0.3090182 0 -0.9510561 -0.5877861 0 -0.8090163 -0.8090172 0 -0.5877849 -0.8090172 0 -0.5877849 -0.5877861 0 -0.8090163 -0.8090172 0 -0.5877849 -0.9510562 0 -0.3090174 -0.9510562 0 -0.3090174 -0.8090172 0 -0.5877849 -0.9510562 0 -0.3090174 -0.9999999 0 0 -0.9999999 0 0 -0.9510562 0 -0.3090174 -0.9999999 0 0 -0.9510562 0 0.3090174 -0.9510562 0 0.3090174 -0.9999999 0 0 -0.9510562 0 0.3090174 -0.8090171 0 0.587785 -0.8090171 0 0.5877849 -0.9510562 0 0.3090174 -0.8090171 0 0.587785 -0.5877861 0 0.8090163 -0.587786 0 0.8090163 -0.8090171 0 0.5877849 -0.5877861 0 0.8090163 -0.3090163 0 0.9510567 -0.3090163 0 0.9510567 -0.587786 0 0.8090163 -0.3090163 0 0.9510567 0 0 0.9999999 0 0 0.9999999 -0.3090163 0 0.9510567 0 0 0.9999999 0.3090163 0 0.9510567 0.3090163 0 0.9510567 0 0 0.9999999 0.3090163 0 0.9510567 0.5877861 0 0.8090163 0.5877861 0 0.8090163 0.3090163 0 0.9510567 0.5877861 0 0.8090163 0.8090172 0 0.5877848 0.8090172 0 0.5877848 0.5877861 0 0.8090163 0.8090172 0 0.5877848 0.9510564 0 0.3090172 0.9510564 0 0.3090172 0.8090172 0 0.5877848 0.9510564 0 0.3090172 0.9999999 0 0 0.9999999 0 0 0.9510564 0 0.3090172 0.9999999 0 0 0.9510567 0 -0.3090164 0.9510567 0 -0.3090164 0.9999999 0 0 0.03310107 0 0.999452 0.03847893 0 0.9992594 0 0 1 0.02426877 0 0.9997054 0.03310107 0 0.999452 0 0 1 0.01283379 0 0.9999176 0.02426877 0 0.9997054 0 0 1 0 0 0.9999999 0.01283379 0 0.9999176 0 0 1 -0.01283412 0 0.9999176 0 0 0.9999999 0 0 1 -0.02426903 0 0.9997054 -0.01283412 0 0.9999176 0 0 1 -0.03310116 0 0.999452 -0.02426903 0 0.9997054 0 0 1 -0.03847894 0 0.9992594 -0.03310116 0 0.999452 0 0 1 -0.03996953 0 0.9992008 -0.03847894 0 0.9992594 0 0 1 -0.03756391 0 0.9992943 -0.03996953 0 0.9992008 0 0 1 -0.03162098 0 0.9994999 -0.03756391 0 0.9992943 0 0 1 -0.02278714 0 0.9997404 -0.03162098 0 0.9994999 0 0 1 -0.01191694 0 0.999929 -0.02278714 0 0.9997404 0 0 1 0 0 0.9999999 -0.01191694 0 0.999929 0 0 1 0.01191694 0 0.999929 0 0 0.9999999 0 0 1 0.02278714 0 0.9997404 0.01191694 0 0.999929 0 0 1 0.03162089 0 0.9994999 0.02278714 0 0.9997404 0 0 1 0.03756383 0 0.9992943 0.03162089 0 0.9994999 0 0 1 0.03996954 0 0.9992008 0.03756383 0 0.9992943 0 0 1 0.03847893 0 0.9992594 0.03996954 0 0.9992008 0 0 1 -0.03756417 0 0.9992942 -0.03162121 0 0.9994999 0 0 1 -0.03162121 0 0.9994999 -0.02278723 0 0.9997404 0 0 1 -0.02278723 0 0.9997404 -0.01191907 0 0.999929 0 0 1 -0.01191907 0 0.999929 0 0 1 0 0 1 0 0 1 0.01191907 0 0.999929 0 0 1 0.01191907 0 0.999929 0.02278725 0 0.9997404 0 0 1 0.02278725 0 0.9997404 0.03162122 0 0.9994999 0 0 1 0.03162122 0 0.9994999 0.03756416 0 0.9992942 0 0 1 0.03756416 0 0.9992942 0.03996971 0 0.9992008 0 0 1 0.03996971 0 0.9992008 0.03847899 0 0.9992594 0 0 1 0.03847899 0 0.9992594 0.03310122 0 0.999452 0 0 1 0.03310122 0 0.999452 0.02426946 0 0.9997054 0 0 1 0.02426946 0 0.9997054 0.01283623 0 0.9999176 0 0 1 0.01283623 0 0.9999176 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.01283562 0 0.9999176 0 0 1 -0.01283562 0 0.9999176 -0.02426872 0 0.9997054 0 0 1 -0.02426872 0 0.9997054 -0.03310125 0 0.999452 0 0 1 -0.03310125 0 0.999452 -0.03847918 0 0.9992594 0 0 1 -0.03847918 0 0.9992594 -0.03996972 0 0.9992008 0 0 1 -0.03996972 0 0.9992008 -0.03756417 0 0.9992942 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape5-textangents-array" count="224" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape5-texbinormals">
+ <float_array id="qt_gauge_needles_6Shape5-texbinormals-array" count="672">0.9988855 0 0.04719952 1 0 0 0.9988856 0 -0.04719952 1 0 0 0.9988855 0 0.04719952 1 0 0 0.9988856 0 -0.04719952 1 0 0 0 1 0 0.03364022 -0.7014447 -0.7119296 0 -1 0 -0.03364022 0.7014447 0.7119296 0 1 0 -0.7574919 -0.6528445 0 0 -1 0 0.7574919 0.6528445 0 0 1 0 0.03364022 -0.7014447 0.7119296 0 -1 0 -0.03364022 0.7014447 -0.7119296 0 1 0 0.9452475 -0.3263544 0 0 -1 0 -0.9452475 0.3263544 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -0.9994521 0 0.03310107 -0.9992594 0 0.03847893 -1 0 0 -0.9997056 0 0.02426878 -0.9994521 0 0.03310107 -1 0 0 -0.9999176 0 0.01283379 -0.9997056 0 0.02426878 -1 0 0 -1 0 0 -0.9999176 0 0.01283379 -1 0 0 -0.9999177 0 -0.01283413 -1 0 0 -1 0 0 -0.9997056 0 -0.02426904 -0.9999177 0 -0.01283413 -1 0 0 -0.999452 0 -0.03310116 -0.9997056 0 -0.02426904 -1 0 0 -0.9992595 0 -0.03847895 -0.999452 0 -0.03310116 -1 0 0 -0.9992009 0 -0.03996954 -0.9992595 0 -0.03847895 -1 0 0 -0.9992943 0 -0.03756391 -0.9992009 0 -0.03996954 -1 0 0 -0.9995 0 -0.03162098 -0.9992943 0 -0.03756391 -1 0 0 -0.9997404 0 -0.02278714 -0.9995 0 -0.03162098 -1 0 0 -0.9999291 0 -0.01191694 -0.9997404 0 -0.02278714 -1 0 0 -1 0 0 -0.9999291 0 -0.01191694 -1 0 0 -0.9999291 0 0.01191694 -1 0 0 -1 0 0 -0.9997404 0 0.02278714 -0.9999291 0 0.01191694 -1 0 0 -0.9995 0 0.0316209 -0.9997404 0 0.02278714 -1 0 0 -0.9992943 0 0.03756383 -0.9995 0 0.0316209 -1 0 0 -0.9992009 0 0.03996954 -0.9992943 0 0.03756383 -1 0 0 -0.9992594 0 0.03847893 -0.9992009 0 0.03996954 -1 0 0 0.9992942 0 0.03756417 0.9994999 0 0.03162121 1 0 0 0.9994999 0 0.03162121 0.9997404 0 0.02278723 1 0 0 0.9997404 0 0.02278723 0.999929 0 0.01191907 1 0 0 0.999929 0 0.01191907 1 0 0 1 0 0 1 0 0 0.9999291 0 -0.01191907 1 0 0 0.9999291 0 -0.01191907 0.9997404 0 -0.02278725 1 0 0 0.9997404 0 -0.02278725 0.9994999 0 -0.03162122 1 0 0 0.9994999 0 -0.03162122 0.9992943 0 -0.03756417 1 0 0 0.9992943 0 -0.03756417 0.9992009 0 -0.03996972 1 0 0 0.9992009 0 -0.03996972 0.9992595 0 -0.03847899 1 0 0 0.9992595 0 -0.03847899 0.9994521 0 -0.03310122 1 0 0 0.9994521 0 -0.03310122 0.9997056 0 -0.02426947 1 0 0 0.9997056 0 -0.02426947 0.9999176 0 -0.01283623 1 0 0 0.9999176 0 -0.01283623 1 0 0 1 0 0 1 0 0 0.9999176 0 0.01283562 1 0 0 0.9999176 0 0.01283562 0.9997056 0 0.02426872 1 0 0 0.9997056 0 0.02426872 0.999452 0 0.03310125 1 0 0 0.999452 0 0.03310125 0.9992595 0 0.03847918 1 0 0 0.9992595 0 0.03847918 0.9992009 0 0.03996972 1 0 0 0.9992009 0 0.03996972 0.9992942 0 0.03756417 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape5-texbinormals-array" count="224" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_6Shape5-vertices" name="qt_gauge_needles_6Shape5-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_6Shape5-positions"/>
+ </vertices>
+ <triangles material="lambert4SG" count="12">
+ <input semantic="VERTEX" source="#qt_gauge_needles_6Shape5-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_6Shape5-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_6Shape5-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_6Shape5-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_6Shape5-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_6Shape5-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_6Shape5-texbinormals" offset="3" set="0"/>
+ <p>4 0 8 0 5 1 9 1 7 3 11 3 5 1 9 1 6 2 10 2 7 3 11 3 0 4 4 4 2 5 7 5 1 7 5 7 2 5 7 5 3 6 6 6 1 7 5 7 0 8 0 8 1 9 1 9 4 11 8 11 4 11 8 11 1 9 1 9 5 10 9 10 1 12 1 12 3 13 3 13 5 15 9 15 5 15 9 15 3 13 3 13 6 14 10 14 3 16 3 16 2 17 2 17 6 19 10 19 6 19 10 19 2 17 2 17 7 18 11 18 2 20 2 20 0 21 0 21 7 23 11 23 7 23 11 23 0 21 0 21 4 22 8 22</p>
+ </triangles>
+ <triangles material="lambert3SG" count="80">
+ <input semantic="VERTEX" source="#qt_gauge_needles_6Shape5-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_6Shape5-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_6Shape5-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_6Shape5-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_6Shape5-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_6Shape5-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_6Shape5-texbinormals" offset="3" set="0"/>
+ <p>8 24 12 24 9 25 13 25 28 27 15 27 28 27 15 27 9 25 13 25 29 26 14 26 9 25 13 28 10 28 16 29 29 26 14 31 29 26 14 31 10 28 16 29 30 29 17 30 10 28 16 32 11 30 18 33 30 29 17 35 30 29 17 35 11 30 18 33 31 31 19 34 11 30 18 36 12 32 20 37 31 31 19 39 31 31 19 39 12 32 20 37 32 33 21 38 12 32 20 40 13 34 22 41 32 33 21 43 32 33 21 43 13 34 22 41 33 35 23 42 13 34 22 44 14 36 24 45 33 35 23 47 33 35 23 47 14 36 24 45 34 37 25 46 14 36 24 48 15 38 26 49 34 37 25 51 34 37 25 51 15 38 26 49 35 39 27 50 15 38 26 52 16 40 28 53 35 39 27 55 35 39 27 55 16 40 28 53 36 41 29 54 16 40 28 56 17 42 30 57 36 41 29 59 36 41 29 59 17 42 30 57 37 43 31 58 17 42 30 60 18 44 32 61 37 43 31 63 37 43 31 63 18 44 32 61 38 45 33 62 18 44 32 64 19 46 34 65 38 45 33 67 38 45 33 67 19 46 34 65 39 47 35 66 19 46 34 68 20 48 36 69 39 47 35 71 39 47 35 71 20 48 36 69 40 49 37 70 20 48 36 72 21 50 38 73 40 49 37 75 40 49 37 75 21 50 38 73 41 51 39 74 21 50 38 76 22 52 40 77 41 51 39 79 41 51 39 79 22 52 40 77 42 53 41 78 22 52 40 80 23 54 42 81 42 53 41 83 42 53 41 83 23 54 42 81 43 55 43 82 23 54 42 84 24 56 44 85 43 55 43 87 43 55 43 87 24 56 44 85 44 57 45 86 24 56 44 88 25 58 46 89 44 57 45 91 44 57 45 91 25 58 46 89 45 59 47 90 25 58 46 92 26 60 48 93 45 59 47 95 45 59 47 95 26 60 48 93 46 61 49 94 26 60 48 96 27 62 50 97 46 61 49 99 46 61 49 99 27 62 50 97 47 63 51 98 27 62 50 100 8 24 52 101 47 63 51 103 47 63 51 103 8 24 52 101 28 27 53 102 9 64 54 104 8 65 55 105 48 66 56 106 10 67 57 107 9 64 54 108 48 66 56 109 11 68 58 110 10 67 57 111 48 66 56 112 12 69 59 113 11 68 58 114 48 66 56 115 13 70 60 116 12 69 59 117 48 66 56 118 14 71 61 119 13 70 60 120 48 66 56 121 15 72 62 122 14 71 61 123 48 66 56 124 16 73 63 125 15 72 62 126 48 66 56 127 17 74 64 128 16 73 63 129 48 66 56 130 18 75 65 131 17 74 64 132 48 66 56 133 19 76 66 134 18 75 65 135 48 66 56 136 20 77 67 137 19 76 66 138 48 66 56 139 21 78 68 140 20 77 67 141 48 66 56 142 22 79 69 143 21 78 68 144 48 66 56 145 23 80 70 146 22 79 69 147 48 66 56 148 24 81 71 149 23 80 70 150 48 66 56 151 25 82 72 152 24 81 71 153 48 66 56 154 26 83 73 155 25 82 72 156 48 66 56 157 27 84 74 158 26 83 73 159 48 66 56 160 8 65 55 161 27 84 74 162 48 66 56 163 28 85 75 164 29 86 76 165 49 87 77 166 29 86 76 167 30 88 78 168 49 87 77 169 30 88 78 170 31 89 79 171 49 87 77 172 31 89 79 173 32 90 80 174 49 87 77 175 32 90 80 176 33 91 81 177 49 87 77 178 33 91 81 179 34 92 82 180 49 87 77 181 34 92 82 182 35 93 83 183 49 87 77 184 35 93 83 185 36 94 84 186 49 87 77 187 36 94 84 188 37 95 85 189 49 87 77 190 37 95 85 191 38 96 86 192 49 87 77 193 38 96 86 194 39 97 87 195 49 87 77 196 39 97 87 197 40 98 88 198 49 87 77 199 40 98 88 200 41 99 89 201 49 87 77 202 41 99 89 203 42 100 90 204 49 87 77 205 42 100 90 206 43 101 91 207 49 87 77 208 43 101 91 209 44 102 92 210 49 87 77 211 44 102 92 212 45 103 93 213 49 87 77 214 45 103 93 215 46 104 94 216 49 87 77 217 46 104 94 218 47 105 95 219 49 87 77 220 47 105 95 221 28 85 75 222 49 87 77 223</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_6Shape5</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_5" name="qt_gauge_needles_5" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_6Shape5">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ <instance_material symbol="lambert3SG" target="#black_solid"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_5</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_6.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_6.dae
new file mode 100644
index 0000000..a525c10
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_6.dae
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:55:20</created>
+ <modified>2018-03-08T09:55:20</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ <material id="red_transparent" name="red_transparent">
+ <instance_effect url="#red_transparent-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="red_transparent-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.56808 0.05568 0.05568 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0.2251908 0.2251908 0.2251908 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">red_transparent</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_6Shape" name="qt_gauge_needles_6Shape">
+ <mesh>
+ <source id="qt_gauge_needles_6Shape-positions" name="qt_gauge_needles_6Shape-positions">
+ <float_array id="qt_gauge_needles_6Shape-positions-array" count="270">-0.02163696 0.2356744 -12 0.02163696 0.2356744 -12 -0.02163696 0.4723087 -12 0.02163696 0.4723087 -12 0.2606413 0 0.9727232 0.5035169 0 0.8721196 0.7120827 0 0.7120827 0.8721215 0 0.5035187 0.9727224 0 0.2606405 1.007038 0 0 0.972724 0 -0.2606402 0.8721187 0 -0.5035184 0.7120812 0 -0.7120826 0.5035173 0 -0.8721198 0.2606409 0 -0.9727232 0 0 -1.007037 -0.2606413 0 -0.9727233 -0.5035172 0 -0.8721199 -0.7120829 0 -0.712083 -0.8721213 0 -0.5035186 -0.9727223 0 -0.2606404 -1.007038 0 0 -0.9727236 0 0.2606405 -0.8721183 0 0.5035188 -0.7120846 0 0.712083 -0.5035169 0 0.8721201 -0.2606404 0 0.9727237 0 0 1.007038 0.2606413 0.870889 0.9727232 0.5035169 0.870889 0.8721196 0.7120827 0.870889 0.7120827 0.8721215 0.870889 0.5035187 0.9727224 0.870889 0.2606405 1.007038 0.870889 0 0.972724 0.870889 -0.2606402 0.8721187 0.870889 -0.5035184 0.7120812 0.870889 -0.7120826 0.5035173 0.870889 -0.8721198 0.2606409 0.870889 -0.9727232 0 0.870889 -1.007037 -0.2606413 0.870889 -0.9727233 -0.5035172 0.870889 -0.8721199 -0.7120829 0.870889 -0.712083 -0.8721213 0.870889 -0.5035186 -0.9727223 0.870889 -0.2606404 -1.007038 0.870889 0 -0.9727236 0.870889 0.2606405 -0.8721183 0.870889 0.5035188 -0.7120846 0.870889 0.712083 -0.5035169 0.870889 0.8721201 -0.2606404 0.870889 0.9727237 0 0.870889 1.007038 0 0 0 0 0.870889 0 -0.3249979 0.4723087 2.313861 -0.2144747 0.4723087 1.878451 -0.1770811 0.4723087 1.428857 0.1770792 0.4723087 1.428857 0.2144728 0.4723087 1.878451 0.3249998 0.4723087 2.313861 0.1770792 0.2356744 1.428857 0.2144728 0.2356744 1.878451 0.3249998 0.2356744 2.313861 -0.1770811 0.2356744 1.428857 -0.2144747 0.2356744 1.878451 -0.3249979 0.2356744 2.313861 -0.7582755 0.4723087 3.15555 -0.5110774 0.4723087 2.749348 0.5110784 0.4723087 2.749348 0.7582726 0.4723087 3.15555 0.5110784 0.2356744 2.749348 0.7582726 0.2356744 3.15555 -0.5110774 0.2356744 2.749348 -0.7582755 0.2356744 3.15555 -1.071347 0.2356744 3.595695 -0.8627777 0.2356744 4 -1.033405 0.2356744 3.93483 -1.117143 0.2356744 3.772509 -1.071347 0.4723087 3.595695 -1.117143 0.4723087 3.772509 -1.033405 0.4723087 3.93483 -0.8627777 0.4723087 4 1.071349 0.2356744 3.595695 1.117144 0.2356744 3.772509 1.033406 0.2356744 3.93483 0.8627777 0.2356744 4 1.071349 0.4723087 3.595695 0.8627777 0.4723087 4 1.033406 0.4723087 3.93483 1.117144 0.4723087 3.772509</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape-positions-array" count="90" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape-normals" name="qt_gauge_needles_6Shape-normals">
+ <float_array id="qt_gauge_needles_6Shape-normals-array" count="582">-0.0343485 0 0.9994099 -0.0343485 0 0.9994099 0.03434861 0 0.9994099 0.03434861 0 0.9994099 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.2588205 0 0.9659255 0.500001 0 0.8660247 0.500001 0 0.8660247 0.2588205 0 0.9659255 0.7071033 0 0.7071102 0.7071033 0 0.7071102 0.8660259 0 0.4999992 0.8660259 0 0.4999992 0.965926 0 0.2588182 0.965926 0 0.2588182 1 0 0 1 0 0 0.9659247 0 -0.2588231 0.9659247 0 -0.2588231 0.8660234 0 -0.5000034 0.8660234 0 -0.5000034 0.7071067 0 -0.7071069 0.7071067 0 -0.7071069 0.5000021 0 -0.8660242 0.5000021 0 -0.8660242 0.25882 0 -0.9659256 0.25882 0 -0.9659256 0 0 -1 0 0 -1 -0.2588188 0 -0.9659259 -0.2588188 0 -0.9659259 -0.5000007 0 -0.8660251 -0.5000007 0 -0.8660251 -0.707104 0 -0.7071096 -0.707104 0 -0.7071096 -0.8660263 0 -0.4999983 -0.8660263 0 -0.4999983 -0.9659261 0 -0.2588179 -0.9659261 0 -0.2588179 -1 0 0 -1 0 0 -0.9659247 0 0.2588233 -0.9659247 0 0.2588233 -0.8660266 0 0.4999979 -0.8660266 0 0.4999979 -0.7071068 0 0.7071067 -0.7071068 0 0.7071067 -0.4999988 0 0.8660261 -0.4999988 0 0.8660261 -0.2588201 0 0.9659256 -0.2588201 0 0.9659256 0 0 1 0 0 1 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 -0.999933 0 -0.01157461 -0.9999035 0 -0.01389342 -0.9999035 0 -0.01389342 -0.999933 0 -0.01157461 0.9999035 0 -0.01389328 0.999933 0 -0.01157446 0.999933 0 -0.01157446 0.9999035 0 -0.01389328 0.8644009 0 -0.5028032 0.8644009 0 -0.5028033 0.8338464 0 -0.5519964 0.8338464 0 -0.5519964 -0.833847 0 -0.5519954 -0.833847 0 -0.5519954 -0.8644029 0 -0.5027996 -0.8644029 0 -0.5027996 0.9863179 0 -0.1648543 0.9863179 0 -0.1648543 0.9692589 0 -0.2460427 0.9692589 0 -0.2460427 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.9692611 0 -0.2460347 -0.9863186 0 -0.1648502 -0.9863186 0 -0.1648502 -0.9692611 0 -0.2460347 0.9195717 0 -0.3929223 0.8891141 0 -0.4576854 0.8891141 0 -0.4576854 0.9195717 0 -0.3929222 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.8891121 0 -0.4576894 -0.8891121 0 -0.4576894 -0.919571 0 -0.3929239 -0.919571 0 -0.3929239 -0.9680559 0 -0.2507343 -0.9680559 0 -0.2507343 -0.8887098 0 0.4584703 -0.8887098 0 0.4584703 -0.8887098 0 0.4584703 -0.8887098 0 0.4584703 -0.3568032 0 0.9341795 -0.3568032 0 0.9341795 0.3567994 0 0.9341809 0.3567994 0 0.9341809 0.8887122 0 0.4584656 0.8887122 0 0.4584656 0.8887122 0 0.4584656 0.8887122 0 0.4584656 0.9680584 0 -0.2507249 0.9680584 0 -0.2507249 0 -0.9999999 0 0 -0.9999998 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999998 0 0 -1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape-normals-array" count="194" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape-tangents" name="qt_gauge_needles_6Shape-tangents">
+ <float_array id="qt_gauge_needles_6Shape-tangents-array" count="582">0 -1 0 0.99941 0 0.0343485 0 1 0 -0.9994099 0 0.03434861 -0.9999999 0 0 0 1 0 0.9999999 0 0 0 -1 0 0.9659255 0 -0.2588205 0 1 0 -0.8660248 0 0.5000011 0 -1 0 0 1 0 -0.7071102 0 0.7071033 0 1 0 -0.4999992 0 0.8660259 0 1 0 -0.2588182 0 0.965926 0 1 0 0 0 0.9999999 0 1 0 0.2588231 0 0.9659247 0 1 0 0.5000033 0 0.8660234 0 1 0 0.7071069 0 0.7071067 0 1 0 0.8660241 0 0.5000021 0 1 0 0.9659255 0 0.25882 0 1 0 0.9999999 0 0 0 1 0 0.9659259 0 -0.2588188 0 1 0 0.866025 0 -0.5000006 0 1 0 0.7071096 0 -0.707104 0 1 0 0.4999984 0 -0.8660263 0 1 0 0.2588179 0 -0.9659261 0 1 0 0 0 -0.9999999 0 1 0 -0.2588233 0 -0.9659247 0 1 0 -0.4999978 0 -0.8660266 0 1 0 -0.7071067 0 -0.7071068 0 1 0 -0.866026 0 -0.4999988 0 1 0 -0.9659255 0 -0.2588201 0 1 0 -0.9999999 0 0 -0.8660261 0 0.4999988 -0.3826875 0 -0.9238778 0.9659256 0 -0.2588198 -0.7071068 0 0.7071068 -0.4999993 0 0.8660257 -0.2588193 0 0.9659258 0 0 1 0.2588187 0 0.9659259 0.5000004 0 0.8660252 0.7071076 0 0.7071061 0.866026 0 0.4999989 0.9659258 0 0.2588194 1 0 0 0.9659256 0 -0.2588199 0.866026 0 -0.4999989 0.7071068 0 -0.7071067 0.4999993 0 -0.8660258 0.2588193 0 -0.9659258 0 0 -1 -0.258819 0 -0.9659258 -0.5000007 0 -0.8660251 -0.7071059 0 -0.7071076 -0.8660262 0 -0.4999987 -0.9659258 0 -0.258819 -1 0 0 0.9659256 0 -0.2588198 -0.3826875 0 -0.9238778 -0.8660262 0 0.4999988 -0.6087584 0 -0.7933556 -0.7933497 0 -0.608766 -0.9238829 0 -0.3826754 -0.9914438 0 -0.1305337 -0.9914446 0 0.1305278 -0.9238769 0 0.3826895 -0.7933525 0 0.6087627 -0.6087625 0 0.7933526 -0.3826859 0 0.9238785 -0.1305259 0 0.9914449 0.1305244 0 0.9914451 0.3826865 0 0.9238783 0.6087584 0 0.7933556 0.7933509 0 0.6087646 0.9238829 0 0.3826753 0.9914439 0 0.1305332 0.9914446 0 -0.1305282 0.9238771 0 -0.3826894 0.7933594 0 -0.6087536 0.6087555 0 -0.793358 0.382686 0 -0.9238784 0.1305261 0 -0.9914449 0 0 1 0.9965591 0 0.08288559 0 0 -1 -0.9965591 0 0.08288556 0.9692611 0 0.2460347 0 0 -1 0.919571 0 0.3929238 0 0 -1 0.8542503 0 0.5198618 0 0 -1 0 0 1 -0.999933 0 0.01157446 0.999933 0 0.01157461 0 0 1 -0.999933 0 0.01157446 0 0 -1 -0.01157461 0 0.9999329 0 1 0 0.01389342 0 -0.9999035 0 -1 0 -0.01389328 0 -0.9999035 0 1 0 0.01157446 0 0.9999329 0 -1 0 0 -1 0 -0.5028033 0 -0.8644008 0 1 0 0.5519964 0 0.8338465 0 -1 0 -0.5519954 0 0.8338471 0 0.9999999 0 0.5027996 0 -0.8644029 0 -1 0 -0.1648543 0 -0.9863179 0 -1 0 -0.2460427 0 -0.969259 -0.9965591 0 0.08288556 0 0 -1 -0.969259 0 0.2460427 0 0 -1 0.2460347 0 -0.9692611 0 -1 0 -0.1648502 0 0.9863186 0 0.9999999 0 0.3929223 0 0.9195716 0 -0.9999999 0 -0.4576855 0 -0.8891141 0 1 0 -0.9195718 0 0.3929221 0 0 -1 -0.8542539 0 0.5198559 0 0 -1 0 -0.9999999 0 -0.4576894 0 0.8891121 0 -1 0 -0.3929238 0 0.919571 0 1 0 0.2507343 0 -0.9680559 0.4584702 0 0.8887098 0 1 0 -0.4584702 0 -0.8887098 0 -1 0 0.9341795 0 0.3568033 0 -1 0 0 1 0 -0.934181 0 0.3567994 0.4584655 0 -0.8887122 0 1 0 -0.4584655 0 0.8887122 0 -1 0 -0.2507249 0 -0.9680583 0 -1 0 0 0 -0.9999999 0.3568036 0 -0.9341794 0.8887097 0 -0.4584702 0.9680558 0 0.2507346 -0.8148806 0 0.5796288 -0.9680583 0 0.2507252 -0.8887122 0 -0.4584655 -0.3567999 0 -0.9341809 -0.9680583 0 0.2507252 0.8148853 0 0.5796223 0.9680558 0 0.2507346 0.8887098 0 -0.4584702 0.3568037 0 -0.9341794 0 0 -1 -0.3567999 0 -0.9341808 -0.8887122 0 -0.4584655</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape-tangents-array" count="194" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape-binormals" name="qt_gauge_needles_6Shape-binormals">
+ <float_array id="qt_gauge_needles_6Shape-binormals-array" count="582">0.9994099 0 0.0343485 0 1 0 -0.99941 0 0.03434861 0 -1 0 0 1 0 1 0 0 0 -1 0 -1 0 0 0 1 0 -0.8660249 0 0.5000011 0 -1 0 0.9659255 0 -0.2588205 -0.7071102 0 0.7071033 0 -1 0 -0.4999992 0 0.8660259 0 -1 0 -0.2588182 0 0.9659261 0 -1 0 0 0 1 0 -1 0 0.2588232 0 0.9659248 0 -1 0 0.5000035 0 0.8660235 0 -1 0 0.7071069 0 0.7071067 0 -1 0 0.8660242 0 0.5000021 0 -1 0 0.9659256 0 0.25882 0 -1 0 1 0 0 0 -1 0 0.9659259 0 -0.2588188 0 -1 0 0.8660251 0 -0.5000007 0 -1 0 0.7071096 0 -0.707104 0 -1 0 0.4999984 0 -0.8660265 0 -1 0 0.2588179 0 -0.9659261 0 -1 0 0 0 -1 0 -1 0 -0.2588233 0 -0.9659248 0 -1 0 -0.4999979 0 -0.8660266 0 -1 0 -0.7071067 0 -0.7071068 0 -1 0 -0.8660261 0 -0.4999988 0 -1 0 -0.9659256 0 -0.2588201 0 -1 0 -1 0 0 0 -1 0 -0.4999988 0 -0.8660261 0.9238778 0 -0.3826875 0.2588198 0 0.9659257 -0.7071068 0 -0.7071068 -0.8660259 0 -0.4999994 -0.9659258 0 -0.2588193 -1 0 0 -0.9659259 0 0.2588187 -0.8660253 0 0.5000004 -0.707106 0 0.7071075 -0.499999 0 0.8660261 -0.2588194 0 0.9659258 0 0 1 0.2588199 0 0.9659256 0.4999989 0 0.8660261 0.7071067 0 0.7071068 0.8660259 0 0.4999994 0.9659258 0 0.2588193 1 0 0 0.9659259 0 -0.258819 0.866025 0 -0.5000007 0.7071076 0 -0.7071059 0.4999987 0 -0.8660262 0.258819 0 -0.9659259 0 0 -1 -0.2588198 0 -0.9659257 -0.9238778 0 0.3826875 0.4999988 0 0.8660261 -0.7933557 0 0.6087584 -0.6087661 0 0.7933499 -0.3826754 0 0.9238829 -0.1305337 0 0.9914439 0.1305278 0 0.9914446 0.3826895 0 0.9238771 0.6087626 0 0.7933524 0.7933526 0 0.6087625 0.9238786 0 0.3826859 0.991445 0 0.1305259 0.9914452 0 -0.1305244 0.9238783 0 -0.3826865 0.7933556 0 -0.6087584 0.6087646 0 -0.793351 0.3826753 0 -0.9238829 0.1305332 0 -0.9914441 -0.1305282 0 -0.9914446 -0.3826894 0 -0.9238771 -0.6087536 0 -0.7933594 -0.793358 0 -0.6087555 -0.9238785 0 -0.382686 -0.9914449 0 -0.1305261 1 0 0 0.08288559 0 -0.9965591 -1 0 0 0.08288556 0 0.9965591 0.2460347 0 -0.9692611 -1 0 0 0.3929238 0 -0.919571 -1 0 0 0.5198618 0 -0.8542504 -1 0 0 1 0 0 0.01157446 0 0.999933 -0.01157461 0 0.999933 -1 0 0 -0.01157446 0 -0.999933 1 0 0 0 1 0 0.01389342 0 -0.9999035 0 -1 0 -0.01157461 0 0.999933 0 1 0 0.01157446 0 0.999933 0 -1 0 -0.01389328 0 -0.9999035 -0.5028033 0 -0.864401 0 1 0 0.5519964 0 0.8338465 0 -1 0 -0.5519955 0 0.8338472 0 1 0 0.5027996 0 -0.864403 0 -1 0 -0.1648543 0 -0.986318 0 1 0 -0.2460427 0 -0.969259 0 1 0 -0.08288556 0 -0.9965591 1 0 0 -0.2460427 0 -0.969259 1 0 0 0 -1 0 -0.1648502 0 0.9863187 0 1 0 0.2460347 0 -0.9692611 0 -1 0 -0.4576855 0 -0.8891142 0 1 0 0.3929222 0 0.9195717 -0.3929221 0 -0.9195718 1 0 0 -0.519856 0 -0.854254 1 0 0 -0.4576895 0 0.8891122 0 1 0 -0.3929239 0 0.9195711 0 1 0 0.2507344 0 -0.968056 0 -1 0 0 1 0 -0.4584703 0 -0.8887098 0 -1 0 0.4584703 0 0.8887098 0 1 0 0.9341796 0 0.3568033 -0.934181 0 0.3567995 0 -1 0 0 1 0 -0.4584656 0 0.8887122 0 -1 0 0.4584656 0 -0.8887122 0 1 0 -0.2507249 0 -0.9680584 1 0 0 0.9341794 0 0.3568037 0.4584703 0 0.8887098 -0.2507346 0 0.9680559 -0.5796288 0 -0.8148807 -0.2507252 0 -0.9680583 0.4584656 0 -0.8887122 0.9341809 0 -0.3567999 0.2507252 0 0.9680583 0.5796223 0 -0.8148853 0.2507346 0 -0.968056 -0.4584703 0 -0.8887098 -0.9341794 0 -0.3568037 -1 0 0 -0.9341809 0 0.3567999 -0.4584656 0 0.8887123</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape-binormals-array" count="194" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape-map1" name="qt_gauge_needles_6Shape-map1">
+ <float_array id="qt_gauge_needles_6Shape-map1-array" count="288">0.375 0.3125 0.3854167 0.3125 0.3854167 0.6884398 0.375 0.6884398 0.3958333 0.3125 0.3958333 0.6884398 0.40625 0.3125 0.40625 0.6884398 0.4166666 0.3125 0.4166666 0.6884398 0.4270833 0.3125 0.4270833 0.6884398 0.4374999 0.3125 0.4374999 0.6884398 0.4479166 0.3125 0.4479166 0.6884398 0.4583333 0.3125 0.4583333 0.6884398 0.4687499 0.3125 0.4687499 0.6884398 0.4791666 0.3125 0.4791666 0.6884398 0.4895832 0.3125 0.4895832 0.6884398 0.4999999 0.3125 0.4999999 0.6884398 0.5104166 0.3125 0.5104166 0.6884398 0.5208333 0.3125 0.5208333 0.6884398 0.5312499 0.3125 0.5312499 0.6884398 0.5416666 0.3125 0.5416666 0.6884398 0.5520833 0.3125 0.5520833 0.6884398 0.5625 0.3125 0.5625 0.6884398 0.5729167 0.3125 0.5729167 0.6884398 0.5833334 0.3125 0.5833334 0.6884398 0.5937501 0.3125 0.5937501 0.6884398 0.6041667 0.3125 0.6041667 0.6884398 0.6145834 0.3125 0.6145834 0.6884398 0.6250001 0.3125 0.6250001 0.6884398 0.6353164 0.07812506 0.6509258 0.1158096 0.5 0.15 0.6104854 0.04576464 0.578125 0.02093361 0.5404404 0.005324185 0.5 0 0.4595596 0.005324155 0.4218751 0.02093358 0.3895146 0.0457646 0.3646836 0.07812501 0.3490741 0.1158095 0.3437501 0.15625 0.3490741 0.1966905 0.3646836 0.234375 0.3895146 0.2667354 0.421875 0.2915664 0.4595595 0.3071759 0.5 0.3125 0.5404404 0.3071759 0.578125 0.2915665 0.6104854 0.2667354 0.6353165 0.234375 0.6509259 0.1966905 0.65625 0.15625 0.6509259 0.8841904 0.6353165 0.921875 0.5 0.8375 0.6104854 0.9542354 0.578125 0.9790665 0.5404404 0.9946759 0.5 1 0.4595595 0.9946759 0.421875 0.9790664 0.3895146 0.9542354 0.3646836 0.921875 0.3490741 0.8841904 0.3437501 0.84375 0.3490741 0.8033096 0.3646836 0.765625 0.3895146 0.7332646 0.4218751 0.7084336 0.4595596 0.6928241 0.5 0.6875001 0.5404404 0.6928242 0.578125 0.7084336 0.6104854 0.7332646 0.6353164 0.7656251 0.6509258 0.8033096 0.65625 0.84375 0 0 0.8393036 1 0 1 0.8393005 0 0 0 0.8393036 0 0.8393036 1 0 1 0.8946163 0 0.8946163 1 0.8946163 1 0.8946164 0 0.8677947 0 0.8677947 1 0.8677947 1 0.8677947 1 0.8677947 0 0.8677947 0 0.9228166 0 0.9228166 1 0.9228166 1 0.9228166 1 0.9228166 0 0.9228166 0 0.9472219 0 0.9472219 1 0.974731 0 1 0.1825521 1 0.8174479 0.974731 1 1 0.1825521 0.9472219 1 0.974731 1 0.9472219 0 0.974731 0 1 0.8174479 0.9947531 0.0877997 0.9850828 0.01920448 0.9852522 0.03077843 0.9951518 0.09939498 0.9835976 0.945353 0.9919 0.8828152 0.9924129 0.8899887 0.9850281 0.9653587</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape-map1-array" count="144" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape-textangents">
+ <float_array id="qt_gauge_needles_6Shape-textangents-array" count="1140">-0.7066895 -0.7071067 -0.02428805 0.997156 0.06712206 0.03427104 0.7066895 0.7071067 -0.02428815 -0.6683186 -0.7435204 0.02296937 -0.9999999 0 0 0.09031378 0.9959134 0 0.9999999 0 0 -0.09031378 -0.9959134 0 0.9659254 0 -0.2588205 0.8660247 0 -0.500001 0.8660247 0 -0.500001 0.9659254 0 -0.2588205 0.8660247 0 -0.500001 0.7071102 0 -0.7071033 0.7071102 0 -0.7071033 0.8660247 0 -0.500001 0.7071102 0 -0.7071033 0.4999991 0 -0.8660258 0.4999991 0 -0.8660258 0.7071102 0 -0.7071033 0.4999991 0 -0.8660258 0.2588182 0 -0.9659259 0.2588182 0 -0.9659259 0.4999991 0 -0.8660258 0.2588182 0 -0.9659259 0 0 -0.9999999 0 0 -0.9999999 0.2588182 0 -0.9659259 0 0 -0.9999999 -0.2588231 0 -0.9659247 -0.2588231 0 -0.9659247 0 0 -0.9999999 -0.2588231 0 -0.9659247 -0.5000034 0 -0.8660233 -0.5000034 0 -0.8660233 -0.2588231 0 -0.9659247 -0.5000034 0 -0.8660233 -0.7071069 0 -0.7071067 -0.7071069 0 -0.7071067 -0.5000034 0 -0.8660233 -0.7071069 0 -0.7071067 -0.8660241 0 -0.500002 -0.8660241 0 -0.500002 -0.7071069 0 -0.7071067 -0.8660241 0 -0.500002 -0.9659255 0 -0.25882 -0.9659255 0 -0.25882 -0.8660241 0 -0.500002 -0.9659255 0 -0.25882 -0.9999999 0 0 -0.9999999 0 0 -0.9659255 0 -0.25882 -0.9999999 0 0 -0.9659258 0 0.2588187 -0.9659259 0 0.2588187 -0.9999999 0 0 -0.9659258 0 0.2588187 -0.866025 0 0.5000006 -0.866025 0 0.5000005 -0.9659259 0 0.2588187 -0.866025 0 0.5000006 -0.7071095 0 0.707104 -0.7071095 0 0.707104 -0.866025 0 0.5000005 -0.7071095 0 0.707104 -0.4999983 0 0.8660263 -0.4999983 0 0.8660263 -0.7071095 0 0.707104 -0.4999983 0 0.8660263 -0.2588179 0 0.9659261 -0.2588179 0 0.9659261 -0.4999983 0 0.8660263 -0.2588179 0 0.9659261 0 0 0.9999999 0 0 0.9999999 -0.2588179 0 0.9659261 0 0 0.9999999 0.2588233 0 0.9659246 0.2588233 0 0.9659246 0 0 0.9999999 0.2588233 0 0.9659246 0.4999978 0 0.8660266 0.4999978 0 0.8660266 0.2588233 0 0.9659246 0.4999978 0 0.8660266 0.7071067 0 0.7071068 0.7071067 0 0.7071068 0.4999978 0 0.8660266 0.7071067 0 0.7071068 0.866026 0 0.4999988 0.866026 0 0.4999988 0.7071067 0 0.7071068 0.866026 0 0.4999988 0.9659255 0 0.2588201 0.9659255 0 0.2588201 0.866026 0 0.4999988 0.9659255 0 0.2588201 0.9999999 0 0 0.9999999 0 0 0.9659255 0 0.2588201 0.9999999 0 0 0.9659254 0 -0.2588205 0.9659254 0 -0.2588205 0.9999999 0 0 0.03531336 0 0.9993763 0.03900667 0 0.999239 0 0 1 0.02907622 0 0.9995772 0.03531336 0 0.9993763 0 0 1 0.02070216 0 0.9997857 0.02907622 0 0.9995772 0 0 1 0.01076118 0 0.9999421 0.02070216 0 0.9997857 0 0 1 0 0 1 0.01076118 0 0.9999421 0 0 1 -0.01075602 0 0.9999422 0 0 1 0 0 1 -0.02069533 0 0.9997858 -0.01075602 0 0.9999422 0 0 1 -0.02907889 0 0.9995771 -0.02069533 0 0.9997858 0 0 1 -0.03531452 0 0.9993762 -0.02907889 0 0.9995771 0 0 1 -0.03900672 0 0.999239 -0.03531452 0 0.9993762 0 0 1 -0.03997012 0 0.9992008 -0.03900672 0 0.999239 0 0 1 -0.0382196 0 0.9992694 -0.03997012 0 0.9992008 0 0 1 -0.03395432 0 0.9994234 -0.0382196 0 0.9992694 0 0 1 -0.02751291 0 0.9996215 -0.03395432 0 0.9994234 0 0 1 -0.01933515 0 0.9998131 -0.02751291 0 0.9996215 0 0 1 -0.009972249 0 0.9999503 -0.01933515 0 0.9998131 0 0 1 0 0 1 -0.009972249 0 0.9999503 0 0 1 0.009977926 0 0.9999502 0 0 1 0 0 1 0.01933637 0 0.999813 0.009977926 0 0.9999502 0 0 1 0.02750803 0 0.9996216 0.01933637 0 0.999813 0 0 1 0.03395716 0 0.9994233 0.02750803 0 0.9996216 0 0 1 0.03821938 0 0.9992694 0.03395716 0 0.9994233 0 0 1 0.03996852 0 0.9992009 0.03821938 0 0.9992694 0 0 1 0.03900667 0 0.999239 0.03996852 0 0.9992009 0 0 1 -0.03821941 0 0.9992694 -0.03395455 0 0.9994234 0 0 0.9999999 -0.03395455 0 0.9994234 -0.02751364 0 0.9996214 0 0 0.9999999 -0.02751364 0 0.9996214 -0.01933625 0 0.999813 0 0 0.9999999 -0.01933625 0 0.999813 -0.009972868 0 0.9999503 0 0 0.9999999 -0.009972868 0 0.9999503 0 0 1 0 0 0.9999999 0 0 1 0.009977011 0 0.9999502 0 0 0.9999999 0.009977011 0 0.9999502 0.01934259 0 0.9998129 0 0 0.9999999 0.01934259 0 0.9998129 0.0275108 0 0.9996215 0 0 0.9999999 0.0275108 0 0.9996215 0.0339531 0 0.9994234 0 0 0.9999999 0.0339531 0 0.9994234 0.03821906 0 0.9992694 0 0 0.9999999 0.03821906 0 0.9992694 0.03996844 0 0.9992009 0 0 0.9999999 0.03996844 0 0.9992009 0.03900692 0 0.999239 0 0 0.9999999 0.03900692 0 0.999239 0.03531385 0 0.9993763 0 0 0.9999999 0.03531385 0 0.9993763 0.02907655 0 0.9995772 0 0 0.9999999 0.02907655 0 0.9995772 0.02070242 0 0.9997857 0 0 0.9999999 0.02070242 0 0.9997857 0.01076043 0 0.9999421 0 0 0.9999999 0.01076043 0 0.9999421 0 0 1 0 0 0.9999999 0 0 1 -0.01075602 0 0.9999422 0 0 0.9999999 -0.01075602 0 0.9999422 -0.02070161 0 0.9997857 0 0 0.9999999 -0.02070161 0 0.9997857 -0.02908176 0 0.999577 0 0 0.9999999 -0.02908176 0 0.999577 -0.0353113 0 0.9993763 0 0 0.9999999 -0.0353113 0 0.9993763 -0.03900668 0 0.999239 0 0 0.9999999 -0.03900668 0 0.999239 -0.03997004 0 0.9992008 0 0 0.9999999 -0.03997004 0 0.9992008 -0.03821941 0 0.9992694 0 0 0.9999999 -0.02765096 0 0.9996176 -0.0827681 0 0.9965687 0.0282311 0 0.9996015 0.003867079 0 0.9999925 -0.0827681 0 0.9965687 -0.136194 0 0.9906822 0.08727464 0 0.9961843 0.0282311 0 0.9996015 -0.136194 0 0.9906822 -0.1895165 0 0.9818776 0.1478638 0 0.9890077 0.08727464 0 0.9961843 -0.1895165 0 0.9818776 0 0 1 0.5500947 0 0.8351023 0.1478638 0 0.9890077 -0.01157461 0 0.9999329 -0.02765096 0 0.9996176 0.003867079 0 0.9999925 0 0 1 -0.01157461 0 0.9999329 0 0 1 0.04726012 0 0.9988826 0 0 0.9999999 -0.01157461 0 0.999933 0 1 1.52523e-4 0.001085897 -0.9969409 -0.0781514 -0.008112067 -0.7133083 0.7008035 -0.001085885 0.9969409 -0.07815136 0.008111967 0.7133083 0.7008035 0.01157446 0 0.9999329 0 -1 1.52465e-4 0.3555355 -0.7071067 0.6112237 -0.4920457 0.2057488 -0.8459069 -0.3903204 0.7071068 -0.5896184 0.2669686 -0.8752658 0.4032832 0.3903197 -0.7071067 -0.5896189 -0.2669678 0.8752662 0.4032829 -0.355533 0.7071067 0.6112252 0.287179 -0.8208387 -0.4937123 0 -1 1.52465e-4 0.01290357 -0.996932 0.07720162 -0.01298222 0.9968944 -0.0776722 -0.001085885 0.9969409 -0.07815136 0.01290357 -0.996932 0.07720162 -0.1271282 -0.8561717 -0.5008078 -0.2460427 0 -0.9692589 -0.01298222 0.9968944 -0.0776722 0.04726012 0 0.9988826 0.08277083 0 0.9965686 -0.02822565 0 0.9996017 0 0 0.9999999 0.08277083 0 0.9965686 0.1361988 0 0.9906815 -0.08727292 0 0.9961844 -0.02822565 0 0.9996017 0.2460346 0 -0.9692609 0.01298195 -0.9968944 -0.07767249 -0.01290323 0.996932 0.07720166 0.127124 0.856172 -0.5008086 0.01298195 -0.9968944 -0.07767249 0.001085897 -0.9969409 -0.0781514 0 1 1.52523e-4 -0.01290323 0.996932 0.07720166 0.3929223 0 0.9195716 0.03339111 -0.9973351 0.06486652 -0.03319517 0.9973663 -0.06448609 0.2066149 0.8505824 0.4835491 0.03339111 -0.9973351 0.06486652 0.2669686 -0.8752658 0.4032832 -0.3903204 0.7071068 -0.5896184 -0.03319517 0.9973663 -0.06448609 0.1361988 0 0.9906815 0.189513 0 0.9818782 -0.1478687 0 0.9890069 -0.08727292 0 0.9961844 0.189513 0 0.9818782 0 0 1 -0.5500943 0 0.8351024 -0.1478687 0 0.9890069 0.3903197 -0.7071067 -0.5896189 0.03319529 -0.9973662 -0.06448554 -0.03339134 0.9973351 0.06486636 -0.2669678 0.8752662 0.4032829 0.03319529 -0.9973662 -0.06448554 -0.2066158 -0.8505823 0.4835488 -0.3929239 0 0.919571 -0.03339134 0.9973351 0.06486636 -0.355533 0.7071067 0.6112252 0.2235561 -0.4528132 -0.8631238 -0.0698915 -0.9603644 0.2698429 0.287179 -0.8208387 -0.4937123 0.0592086 -0.9916258 0.1147714 0.05925319 -0.9916131 0.1148578 0.05929778 -0.9916005 0.1149442 0.05925319 -0.9916131 0.1148578 0.0878481 -0.9955686 0.03355296 0.997156 0.06712206 0.03427104 -0.7066895 -0.7071067 -0.02428805 0.3428263 -0.9302284 0.1309401 0.7066895 0.7071067 -0.02428815 -0.3349955 0.9334921 0.1279476 -0.07109839 0.9970995 0.02715519 -0.6683186 -0.7435204 0.02296937 -0.04043295 0.9961033 0.07837722 -0.06633254 0.9894779 0.1285823 -0.09201752 0.9796512 0.1783713 -0.06633254 0.9894779 0.1285823 0.06817765 0.9623192 0.2632365 0.06658708 0.9911922 0.1144741 0.3555355 -0.7071067 0.6112237 0.112737 0.8932077 0.435282 0.2583679 0 0.9660466 -0.4003222 0 0.9163745 -0.4053769 0 0.9141496 -0.1720075 0 0.9850957 -0.5500943 0 0.8351024 0 0 1 0.02337572 0 0.9997268 0.6302139 0 0.7764216 0.2993328 0 0.9541487 0.1072586 0 0.9942311 0.2228239 0 0.9748586 0.5500947 0 0.8351023 0 0 1 -0.03597016 0 0.9993529 -0.5610753 0 0.8277647 -0.5901645 0 0.807283 -0.6475657 0 0.7620095 -0.4577586 0 0.8890765 0.2325294 0 0.9725894 0.5036951 0 0.8638815</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape-textangents-array" count="380" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_6Shape-texbinormals">
+ <float_array id="qt_gauge_needles_6Shape-texbinormals-array" count="1140">0.7066895 -0.7071068 0.02428806 -0.06708246 0.9977448 -0.002305542 -0.7066895 0.7071068 0.02428813 0.7430817 -0.6687133 -0.0255389 0 1 0 0.9959134 -0.09031378 0 0 -1 0 -0.9959134 0.09031378 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -0.9993763 0 0.03531336 -0.999239 0 0.03900667 -1 0 0 -0.9995772 0 0.02907623 -0.9993763 0 0.03531336 -1 0 0 -0.9997858 0 0.02070216 -0.9995772 0 0.02907623 -1 0 0 -0.9999422 0 0.01076119 -0.9997858 0 0.02070216 -1 0 0 -1 0 0 -0.9999422 0 0.01076119 -1 0 0 -0.9999422 0 -0.01075602 -1 0 0 -1 0 0 -0.9997858 0 -0.02069533 -0.9999422 0 -0.01075602 -1 0 0 -0.9995772 0 -0.0290789 -0.9997858 0 -0.02069533 -1 0 0 -0.9993763 0 -0.03531452 -0.9995772 0 -0.0290789 -1 0 0 -0.999239 0 -0.03900672 -0.9993763 0 -0.03531452 -1 0 0 -0.9992009 0 -0.03997013 -0.999239 0 -0.03900672 -1 0 0 -0.9992694 0 -0.0382196 -0.9992009 0 -0.03997013 -1 0 0 -0.9994234 0 -0.03395432 -0.9992694 0 -0.0382196 -1 0 0 -0.9996215 0 -0.02751291 -0.9994234 0 -0.03395432 -1 0 0 -0.9998131 0 -0.01933515 -0.9996215 0 -0.02751291 -1 0 0 -0.9999503 0 -0.009972249 -0.9998131 0 -0.01933515 -1 0 0 -1 0 0 -0.9999503 0 -0.009972249 -1 0 0 -0.9999503 0 0.009977927 -1 0 0 -1 0 0 -0.999813 0 0.01933637 -0.9999503 0 0.009977927 -1 0 0 -0.9996217 0 0.02750803 -0.999813 0 0.01933637 -1 0 0 -0.9994233 0 0.03395716 -0.9996217 0 0.02750803 -1 0 0 -0.9992694 0 0.03821938 -0.9994233 0 0.03395716 -1 0 0 -0.999201 0 0.03996853 -0.9992694 0 0.03821938 -1 0 0 -0.999239 0 0.03900667 -0.999201 0 0.03996853 -1 0 0 0.9992694 0 0.03821941 0.9994234 0 0.03395455 1 0 0 0.9994234 0 0.03395455 0.9996215 0 0.02751365 1 0 0 0.9996215 0 0.02751365 0.9998131 0 0.01933625 1 0 0 0.9998131 0 0.01933625 0.9999503 0 0.009972868 1 0 0 0.9999503 0 0.009972868 1 0 0 1 0 0 1 0 0 0.9999502 0 -0.009977011 1 0 0 0.9999502 0 -0.009977011 0.9998129 0 -0.01934259 1 0 0 0.9998129 0 -0.01934259 0.9996215 0 -0.0275108 1 0 0 0.9996215 0 -0.0275108 0.9994235 0 -0.0339531 1 0 0 0.9994235 0 -0.0339531 0.9992694 0 -0.03821906 1 0 0 0.9992694 0 -0.03821906 0.999201 0 -0.03996845 1 0 0 0.999201 0 -0.03996845 0.999239 0 -0.03900692 1 0 0 0.999239 0 -0.03900692 0.9993764 0 -0.03531385 1 0 0 0.9993764 0 -0.03531385 0.9995772 0 -0.02907656 1 0 0 0.9995772 0 -0.02907656 0.9997857 0 -0.02070242 1 0 0 0.9997857 0 -0.02070242 0.9999422 0 -0.01076043 1 0 0 0.9999422 0 -0.01076043 1 0 0 1 0 0 1 0 0 0.9999422 0 0.01075602 1 0 0 0.9999422 0 0.01075602 0.9997858 0 0.02070162 1 0 0 0.9997858 0 0.02070162 0.999577 0 0.02908176 1 0 0 0.999577 0 0.02908176 0.9993764 0 0.03531131 1 0 0 0.9993764 0 0.03531131 0.999239 0 0.03900668 1 0 0 0.999239 0 0.03900668 0.9992009 0 0.03997005 1 0 0 0.9992009 0 0.03997005 0.9992694 0 0.03821941 1 0 0 0.9996177 0 0.02765096 0.9965689 0 0.08276813 0.9996015 0 -0.0282311 0.9999925 0 -0.003867079 0.9965689 0 0.08276813 0.9906822 0 0.136194 0.9961843 0 -0.08727464 0.9996015 0 -0.0282311 0.9906822 0 0.136194 0.9818776 0 0.1895165 0.9890078 0 -0.1478638 0.9961843 0 -0.08727464 0.9818776 0 0.1895165 1 0 0 0.8351023 0 -0.5500947 0.9890078 0 -0.1478638 0.9999331 0 0.01157461 0.9996177 0 0.02765096 0.9999925 0 -0.003867079 1 0 0 0.9999331 0 0.01157461 1 0 0 0.9988827 0 -0.04726013 1 0 0 0 1 0 0.01389342 1.52538e-4 -0.9999035 -0.01385092 -0.07815894 0.9968447 -0.008256263 0.7008504 0.7132605 0.01385078 0.07815892 0.9968448 0.008256162 -0.7008504 0.7132605 0 -1 0 -0.01389328 -1.5248e-4 -0.9999035 -0.3555355 -0.7071068 -0.6112237 0.1034512 0.9786049 0.1778494 0.3903205 0.7071068 0.5896186 -0.4831436 -0.4836421 -0.7298374 -0.3903197 -0.7071068 0.589619 0.483143 0.4836414 -0.7298383 0.355533 0.7071069 -0.6112252 -0.4127175 -0.57116 0.7095355 -0.01389328 -1.5248e-4 -0.9999035 -0.1643485 -0.07827255 -0.9832919 0.1643423 0.07874966 0.9832549 0.01385078 0.07815892 0.9968448 -0.1643485 -0.07827255 -0.9832919 -0.2106548 0.5166914 -0.8298522 0 1 0 0.1643423 0.07874966 0.9832549 0.9988827 0 -0.04726013 0.9965687 0 -0.08277084 0.9996015 0 0.02822565 1 0 0 0.9965687 0 -0.08277084 0.9906816 0 -0.1361988 0.9961845 0 0.08727293 0.9996015 0 0.02822565 0 -1 0 -0.1643382 -0.0787499 0.9832555 0.1643444 0.07827255 -0.9832926 0.210648 -0.5166911 -0.829854 -0.1643382 -0.0787499 0.9832555 -0.01385092 -0.07815894 0.9968447 0.01389342 1.52538e-4 -0.9999035 0.1643444 0.07827255 -0.9832926 0 -1 0 -0.4564658 -0.07295637 -0.8867448 0.4564801 0.07252844 0.8867726 0.3342128 -0.5258417 0.7821717 -0.4564658 -0.07295637 -0.8867448 -0.4831436 -0.4836421 -0.7298374 0.3903205 0.7071068 0.5896186 0.4564801 0.07252844 0.8867726 0.9906816 0 -0.1361988 0.9818782 0 -0.189513 0.9890071 0 0.1478687 0.9961845 0 0.08727293 0.9818782 0 -0.189513 1 0 0 0.8351026 0 0.5500944 0.9890071 0 0.1478687 -0.3903197 -0.7071068 0.589619 -0.456484 -0.07252801 0.8867705 0.4564697 0.07295633 -0.8867428 0.483143 0.4836414 -0.7298383 -0.456484 -0.07252801 0.8867705 -0.3342141 0.5258418 0.782171 0 1 0 0.4564697 0.07295633 -0.8867428 0.355533 0.7071069 -0.6112252 -0.1135358 -0.8916054 0.4383486 -0.2407964 0.2787473 0.9296865 -0.4127175 -0.57116 0.7095355 0.4546309 0.1291438 0.8812676 0.4546252 0.1292411 0.8812564 0.4546194 0.1293384 0.8812451 0.4546252 0.1292411 0.8812564 0.9300399 0.09403771 0.3552221 -0.06708246 0.9977448 -0.002305542 0.7066895 -0.7071068 0.02428806 0.8690004 0.3669812 0.3319086 -0.7066895 0.7071068 0.02428813 -0.8720506 -0.358598 0.3330695 0.9314716 0.07610773 -0.3557646 0.7430817 -0.6687133 -0.0255389 0.4566792 0.08819193 -0.8852493 0.4536416 0.1446838 -0.8793612 0.4491364 0.2007076 -0.8706281 0.4536416 0.1446838 -0.8793612 -0.2412774 0.2719222 -0.9315813 -0.4983747 0.1324317 -0.8567874 -0.3555355 -0.7071068 -0.6112237 -0.2239494 0.4496444 -0.8646772 0.9660466 0 -0.2583679 0.9163746 0 0.4003222 0.9141497 0 0.4053769 0.9850957 0 0.1720075 0.8351026 0 0.5500944 1 0 0 0.9997268 0 -0.02337572 0.7764216 0 -0.6302139 0.9541488 0 -0.2993328 0.9942312 0 -0.1072586 0.9748588 0 -0.222824 0.8351023 0 -0.5500947 1 0 0 0.9993529 0 0.03597016 0.8277648 0 0.5610754 0.807283 0 0.5901644 0.7620096 0 0.6475658 0.8890765 0 0.4577586 0.9725894 0 -0.2325294 0.8638815 0 -0.5036951</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_6Shape-texbinormals-array" count="380" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_6Shape-vertices" name="qt_gauge_needles_6Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_6Shape-positions"/>
+ </vertices>
+ <triangles material="lambert4SG" count="96">
+ <input semantic="VERTEX" source="#qt_gauge_needles_6Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_6Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_6Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_6Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_6Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_6Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_6Shape-texbinormals" offset="3" set="0"/>
+ <p>4 8 0 8 5 9 1 9 28 11 3 11 28 11 3 11 5 9 1 9 29 10 2 10 5 9 1 12 6 12 4 13 29 10 2 15 29 10 2 15 6 12 4 13 30 13 5 14 6 12 4 16 7 14 6 17 30 13 5 19 30 13 5 19 7 14 6 17 31 15 7 18 7 14 6 20 8 16 8 21 31 15 7 23 31 15 7 23 8 16 8 21 32 17 9 22 8 16 8 24 9 18 10 25 32 17 9 27 32 17 9 27 9 18 10 25 33 19 11 26 9 18 10 28 10 20 12 29 33 19 11 31 33 19 11 31 10 20 12 29 34 21 13 30 10 20 12 32 11 22 14 33 34 21 13 35 34 21 13 35 11 22 14 33 35 23 15 34 11 22 14 36 12 24 16 37 35 23 15 39 35 23 15 39 12 24 16 37 36 25 17 38 12 24 16 40 13 26 18 41 36 25 17 43 36 25 17 43 13 26 18 41 37 27 19 42 13 26 18 44 14 28 20 45 37 27 19 47 37 27 19 47 14 28 20 45 38 29 21 46 14 28 20 48 15 30 22 49 38 29 21 51 38 29 21 51 15 30 22 49 39 31 23 50 15 30 22 52 16 32 24 53 39 31 23 55 39 31 23 55 16 32 24 53 40 33 25 54 16 32 24 56 17 34 26 57 40 33 25 59 40 33 25 59 17 34 26 57 41 35 27 58 17 34 26 60 18 36 28 61 41 35 27 63 41 35 27 63 18 36 28 61 42 37 29 62 18 36 28 64 19 38 30 65 42 37 29 67 42 37 29 67 19 38 30 65 43 39 31 66 19 38 30 68 20 40 32 69 43 39 31 71 43 39 31 71 20 40 32 69 44 41 33 70 20 40 32 72 21 42 34 73 44 41 33 75 44 41 33 75 21 42 34 73 45 43 35 74 21 42 34 76 22 44 36 77 45 43 35 79 45 43 35 79 22 44 36 77 46 45 37 78 22 44 36 80 23 46 38 81 46 45 37 83 46 45 37 83 23 46 38 81 47 47 39 82 23 46 38 84 24 48 40 85 47 47 39 87 47 47 39 87 24 48 40 85 48 49 41 86 24 48 40 88 25 50 42 89 48 49 41 91 48 49 41 91 25 50 42 89 49 51 43 90 25 50 42 92 26 52 44 93 49 51 43 95 49 51 43 95 26 52 44 93 50 53 45 94 26 52 44 96 27 54 46 97 50 53 45 99 50 53 45 99 27 54 46 97 51 55 47 98 27 54 46 100 4 8 48 101 51 55 47 103 51 55 47 103 4 8 48 101 28 11 49 102 5 56 50 104 4 57 51 105 52 58 52 106 6 59 53 107 5 56 50 108 52 58 52 109 7 60 54 110 6 59 53 111 52 58 52 112 8 61 55 113 7 60 54 114 52 58 52 115 9 62 56 116 8 61 55 117 52 58 52 118 10 63 57 119 9 62 56 120 52 58 52 121 11 64 58 122 10 63 57 123 52 58 52 124 12 65 59 125 11 64 58 126 52 58 52 127 13 66 60 128 12 65 59 129 52 58 52 130 14 67 61 131 13 66 60 132 52 58 52 133 15 68 62 134 14 67 61 135 52 58 52 136 16 69 63 137 15 68 62 138 52 58 52 139 17 70 64 140 16 69 63 141 52 58 52 142 18 71 65 143 17 70 64 144 52 58 52 145 19 72 66 146 18 71 65 147 52 58 52 148 20 73 67 149 19 72 66 150 52 58 52 151 21 74 68 152 20 73 67 153 52 58 52 154 22 75 69 155 21 74 68 156 52 58 52 157 23 76 70 158 22 75 69 159 52 58 52 160 24 77 71 161 23 76 70 162 52 58 52 163 25 78 72 164 24 77 71 165 52 58 52 166 26 79 73 167 25 78 72 168 52 58 52 169 27 80 74 170 26 79 73 171 52 58 52 172 4 57 51 173 27 80 74 174 52 58 52 175 28 81 75 176 29 82 76 177 53 83 77 178 29 82 76 179 30 84 78 180 53 83 77 181 30 84 78 182 31 85 79 183 53 83 77 184 31 85 79 185 32 86 80 186 53 83 77 187 32 86 80 188 33 87 81 189 53 83 77 190 33 87 81 191 34 88 82 192 53 83 77 193 34 88 82 194 35 89 83 195 53 83 77 196 35 89 83 197 36 90 84 198 53 83 77 199 36 90 84 200 37 91 85 201 53 83 77 202 37 91 85 203 38 92 86 204 53 83 77 205 38 92 86 206 39 93 87 207 53 83 77 208 39 93 87 209 40 94 88 210 53 83 77 211 40 94 88 212 41 95 89 213 53 83 77 214 41 95 89 215 42 96 90 216 53 83 77 217 42 96 90 218 43 97 91 219 53 83 77 220 43 97 91 221 44 98 92 222 53 83 77 223 44 98 92 224 45 99 93 225 53 83 77 226 45 99 93 227 46 100 94 228 53 83 77 229 46 100 94 230 47 101 95 231 53 83 77 232 47 101 95 233 48 102 96 234 53 83 77 235 48 102 96 236 49 103 97 237 53 83 77 238 49 103 97 239 50 104 98 240 53 83 77 241 50 104 98 242 51 105 99 243 53 83 77 244 51 105 99 245 28 81 75 246 53 83 77 247</p>
+ </triangles>
+ <triangles material="lambert2SG" count="76">
+ <input semantic="VERTEX" source="#qt_gauge_needles_6Shape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_6Shape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_6Shape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_6Shape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_6Shape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_6Shape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_6Shape-texbinormals" offset="3" set="0"/>
+ <p>81 0 127 0 75 1 130 1 87 3 135 3 87 3 135 3 75 1 130 1 85 2 128 2 1 4 102 4 0 5 104 5 3 7 107 7 3 7 107 7 0 5 104 5 2 6 100 6 56 106 105 248 55 107 112 249 57 109 101 251 57 109 101 251 55 107 112 249 58 108 113 250 55 107 112 252 54 110 108 253 58 108 113 255 58 108 113 255 54 110 108 253 59 111 109 254 54 110 108 256 67 112 118 257 59 111 109 259 59 111 109 259 67 112 118 257 68 113 119 258 67 112 118 260 66 114 133 261 68 113 119 263 68 113 119 263 66 114 133 261 69 115 125 262 2 116 100 264 56 106 105 265 3 117 107 267 56 106 105 265 57 109 101 266 3 117 107 267 0 118 104 268 1 119 102 269 63 121 103 271 1 119 102 269 60 120 106 270 63 121 103 271 0 122 104 272 63 123 103 273 2 125 100 275 2 125 100 275 63 123 103 273 56 124 105 274 60 126 106 276 1 127 102 277 57 129 101 279 57 129 101 279 1 127 102 277 3 128 107 278 86 130 129 280 82 131 132 281 69 133 125 283 69 133 125 283 82 131 132 281 71 132 131 282 66 134 133 284 73 135 124 285 78 137 134 287 78 137 134 287 73 135 124 285 74 136 126 286 57 129 101 288 58 138 113 289 60 126 106 291 60 126 106 291 58 138 113 289 61 139 115 290 58 138 113 292 59 140 109 293 61 139 115 295 61 139 115 295 59 140 109 293 62 141 110 294 60 120 106 296 61 142 114 297 63 121 103 299 63 121 103 299 61 142 114 297 64 143 117 298 61 142 114 300 62 144 110 301 64 143 117 303 64 143 117 303 62 144 110 301 65 145 111 302 54 146 108 304 55 147 112 305 65 149 111 307 65 149 111 307 55 147 112 305 64 148 116 306 55 147 112 308 56 124 105 309 64 148 116 311 64 148 116 311 56 124 105 309 63 123 103 310 59 150 109 312 68 151 119 313 62 153 110 315 62 153 110 315 68 151 119 313 70 152 121 314 68 151 119 316 69 133 125 317 70 152 121 319 70 152 121 319 69 133 125 317 71 132 131 318 62 144 110 320 70 154 120 321 65 145 111 323 65 145 111 323 70 154 120 321 72 155 123 322 70 154 120 324 71 156 131 325 72 155 123 327 72 155 123 327 71 156 131 325 73 157 124 326 66 134 133 328 67 158 118 329 73 135 124 331 73 135 124 331 67 158 118 329 72 159 122 330 67 158 118 332 54 160 108 333 72 159 122 335 72 159 122 335 54 160 108 333 65 161 111 334 74 136 126 336 77 162 137 337 78 137 134 339 78 137 134 339 77 162 137 337 79 163 138 338 77 164 137 340 76 165 136 341 79 167 138 343 79 167 138 343 76 165 136 341 80 166 139 342 76 168 136 344 75 1 130 345 80 169 139 347 80 169 139 347 75 1 130 345 81 0 127 346 85 2 128 348 84 170 141 349 87 3 135 351 87 3 135 351 84 170 141 349 88 171 142 350 84 172 141 352 83 173 140 353 88 175 142 355 88 175 142 355 83 173 140 353 89 174 143 354 83 176 140 356 82 131 132 357 89 177 143 359 89 177 143 359 82 131 132 357 86 130 129 358 73 157 124 364 71 156 131 365 74 181 126 363 71 156 131 365 82 182 132 366 74 181 126 363 74 181 126 363 82 182 132 366 77 180 137 362 77 180 137 362 82 182 132 366 76 179 136 361 76 179 136 361 82 182 132 366 75 178 130 360 82 182 132 366 83 183 140 367 75 178 130 360 83 183 140 367 84 184 141 368 75 178 130 360 75 178 130 360 84 184 141 368 85 185 128 369 69 115 125 371 66 114 133 372 86 186 129 370 66 114 133 372 78 187 134 373 86 186 129 370 86 186 129 370 78 187 134 373 89 193 143 379 89 193 143 379 78 187 134 373 88 192 142 378 88 192 142 378 78 187 134 373 87 191 135 377 78 187 134 373 79 188 138 374 87 191 135 377 79 188 138 374 80 189 139 375 87 191 135 377 80 189 139 375 81 190 127 376 87 191 135 377</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_6Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_6" name="qt_gauge_needles_6" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_6Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ <instance_material symbol="lambert2SG" target="#red_transparent"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_6</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_7.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_7.dae
new file mode 100644
index 0000000..e715b40
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_7.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:55:31</created>
+ <modified>2018-03-08T09:55:31</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_Shape7" name="qt_gauge_needles_Shape7">
+ <mesh>
+ <source id="qt_gauge_needles_Shape7-positions" name="qt_gauge_needles_Shape7-positions">
+ <float_array id="qt_gauge_needles_Shape7-positions-array" count="144">57.4006 0 1.232937 57.762 0 1.0488 58.0488 0 0.7619972 58.23294 0 0.4006054 58.29639 0 0 58.23294 0 -0.4006059 58.0488 0 -0.7619973 57.762 0 -1.048799 57.40061 0 -1.232938 57 0 -1.296387 56.5994 0 -1.232938 56.238 0 -1.048799 55.9512 0 -0.7619972 55.76706 0 -0.4006057 55.70361 0 0 55.76706 0 0.4006054 55.9512 0 0.7619969 56.238 0 1.048799 56.5994 0 1.232937 57 0 1.296386 57.4006 0.2740728 1.232937 57.762 0.2740728 1.0488 58.0488 0.2740728 0.7619972 58.23294 0.2740728 0.4006054 58.29639 0.2740728 0 58.23294 0.2740728 -0.4006059 58.0488 0.2740728 -0.7619973 57.762 0.2740728 -1.048799 57.40061 0.2740728 -1.232938 57 0.2740728 -1.296387 56.5994 0.2740728 -1.232938 56.238 0.2740728 -1.048799 55.9512 0.2740728 -0.7619972 55.76706 0.2740728 -0.4006057 55.70361 0.2740728 0 55.76706 0.2740728 0.4006054 55.9512 0.2740728 0.7619969 56.238 0.2740728 1.048799 56.5994 0.2740728 1.232937 57 0.2740728 1.296386 57 0 0 57 0.2740728 0 57.03557 0 -12 57 0 -12 57 0.2740728 -12 57.03557 0.2740728 -12 56.96443 0 -12 56.96443 0.2740728 -12</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape7-positions-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape7-normals" name="qt_gauge_needles_Shape7-normals">
+ <float_array id="qt_gauge_needles_Shape7-normals-array" count="330">0.3090141 0 0.9510574 0.5877854 0 0.8090169 0.5877854 0 0.8090169 0.3090141 0 0.9510574 0.8090199 0 0.5877814 0.8090199 0 0.5877814 0.9510561 0 0.3090183 0.9510561 0 0.3090183 1 0 0 1 0 0 0.9510561 0 -0.3090184 0.9510561 0 -0.3090184 0.8090149 0 -0.5877881 0.8090149 0 -0.5877881 0.5877876 0 -0.8090152 0.5877876 0 -0.8090152 0.4539935 0 -0.891005 0.4539935 0 -0.891005 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.4539898 0 -0.8910069 -0.5877855 0 -0.8090168 -0.5877855 0 -0.8090168 -0.4539898 0 -0.8910069 -0.8090172 0 -0.5877849 -0.8090172 0 -0.5877849 -0.9510561 0 -0.3090184 -0.9510561 0 -0.3090184 -1 0 0 -1 0 0 -0.951056 0 0.3090184 -0.951056 0 0.3090184 -0.8090172 0 0.5877849 -0.8090172 0 0.5877849 -0.5877854 0 0.8090169 -0.5877854 0 0.8090169 -0.3090164 0 0.9510567 -0.3090164 0 0.9510567 0 0 1 0 0 1 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.9994257 0 -0.03388391 0.9994257 0 -0.03388391 0.9994257 0 -0.03388391 0.9994257 0 -0.03388391 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 -0.9994258 0 -0.03388356 -0.9994258 0 -0.03388356 -0.9994258 0 -0.03388356 -0.9994258 0 -0.03388356 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape7-normals-array" count="110" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape7-tangents" name="qt_gauge_needles_Shape7-tangents">
+ <float_array id="qt_gauge_needles_Shape7-tangents-array" count="330">0.9510575 0 -0.3090141 0 1 0 -0.809017 0 0.5877854 0 -1 0 0 0.9999999 0 -0.5877814 0 0.8090199 0 1 0 -0.3090183 0 0.9510561 0 1 0 0 0 1 0 1 0 0.3090184 0 0.9510561 0 1 0 0.5877881 0 0.8090149 0 1 0 0.8090152 0 0.5877877 0 1 0 0.891005 0 0.4539935 -1 0 0 0 1 0 1 0 0 0 -1 0 0 1 0 1 0 0 -0.8910069 0 0.4539899 0 1 0 0.8090168 0 -0.5877855 0 -1 0 0 0.9999999 0 0.5877849 0 -0.8090172 0 1 0 0.3090184 0 -0.9510561 0 1 0 0 0 -1 0 1 0 -0.3090184 0 -0.9510561 0 0.9999999 0 -0.5877849 0 -0.8090172 0 1 0 -0.809017 0 -0.5877854 0 1 0 -0.9510567 0 -0.3090165 0 1 0 -1 0 0 -0.8090157 0 0.587787 -0.4539845 0 -0.8910095 0.9510568 0 -0.309016 -0.5877859 0 0.8090165 -0.309017 0 0.9510564 0 0 1 0.3090163 0 0.9510567 0.5877859 0 0.8090166 0.8090169 0 0.5877854 0.9510559 0 0.3090186 1 0 0 0.9510568 0 -0.309016 0.8090169 0 -0.5877854 0.5877857 0 -0.8090166 0.3090171 0 -0.9510564 0 0 -1 -0.309017 0 -0.9510566 -0.5877857 0 -0.8090166 -0.8090169 0 -0.5877854 -0.9510568 0 -0.3090161 -1 0 0 0.9510568 0 -0.309016 -0.4539845 0 -0.8910095 -0.8090157 0 0.587787 -0.7071138 0 -0.7070997 -0.8910056 0 -0.4539924 -0.9876883 0 -0.1564349 -0.9876898 0 0.1564256 -0.8910016 0 0.4540001 -0.7071086 0 0.707105 -0.4539934 0 0.8910051 -0.1564319 0 0.9876887 0.1564334 0 0.9876885 0.4539898 0 0.8910069 0.7071086 0 0.707105 0.8910055 0 0.4539926 0.9876883 0 0.1564349 0.9876882 0 -0.1564349 0.8910054 0 -0.4539926 0.7071086 0 -0.707105 0.4539895 0 -0.891007 0.1564334 0 -0.9876886 -0.9994258 0 0.03388391 0.1564319 0 -0.9876888 0.9999999 0 0 0 0 1 0.9999999 0 0 0.1564319 0 -0.9876888 -0.9994258 0 0.03388391 0 0 1 0 -1 0 -0.03388391 0 -0.9994258 0 1 0 0.03388391 0 0.9994258 -0.9999999 0 0 -0.1564334 0 -0.9876885 0.9994258 0 0.03388356 0 0 1 0 1 0 0.03388356 0 -0.9994259 0 -1 0 -0.03388356 0 0.9994259 0.9994258 0 0.03388356 -0.1564334 0 -0.9876886 -1 0 0 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape7-tangents-array" count="110" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape7-binormals" name="qt_gauge_needles_Shape7-binormals">
+ <float_array id="qt_gauge_needles_Shape7-binormals-array" count="330">0 1 0 -0.8090169 0 0.5877854 0 -1 0 0.9510576 0 -0.3090141 -0.5877814 0 0.8090199 0 -1 0 -0.3090183 0 0.9510561 0 -1 0 0 0 1 0 -1 0 0.3090184 0 0.9510561 0 -1 0 0.5877882 0 0.809015 0 -1 0 0.8090153 0 0.5877877 0 -1 0 0.891005 0 0.4539935 0 -1 0 0 1 0 1 0 0 0 -1 0 -1 0 0 1 0 0 0 -1 0 0 1 0 0.8090168 0 -0.5877855 0 -1 0 -0.8910069 0 0.4539898 0.5877849 0 -0.8090173 0 -1 0 0.3090184 0 -0.9510561 0 -1 0 0 0 -1 0 -1 0 -0.3090185 0 -0.9510561 0 -1 0 -0.5877849 0 -0.8090172 0 -1 0 -0.8090169 0 -0.5877854 0 -1 0 -0.9510568 0 -0.3090165 0 -1 0 -1 0 0 0 -1 0 -0.587787 0 -0.8090158 0.8910096 0 -0.4539846 0.309016 0 0.9510568 -0.8090166 0 -0.587786 -0.9510566 0 -0.3090171 -1 0 0 -0.9510568 0 0.3090163 -0.8090165 0 0.5877858 -0.5877854 0 0.809017 -0.3090187 0 0.9510561 0 0 1 0.309016 0 0.9510568 0.5877854 0 0.809017 0.8090166 0 0.5877858 0.9510566 0 0.3090171 1 0 0 0.9510565 0 -0.309017 0.8090166 0 -0.5877857 0.5877854 0 -0.8090169 0.3090161 0 -0.9510569 0 0 -1 -0.309016 0 -0.9510569 -0.8910096 0 0.4539846 0.587787 0 0.8090158 -0.7070997 0 0.7071138 -0.4539924 0 0.8910056 -0.1564349 0 0.9876884 0.1564256 0 0.9876899 0.4540001 0 0.8910016 0.707105 0 0.7071086 0.8910052 0 0.4539934 0.9876888 0 0.1564319 0.9876885 0 -0.1564334 0.8910069 0 -0.4539897 0.707105 0 -0.7071086 0.4539926 0 -0.8910055 0.1564349 0 -0.9876884 -0.1564349 0 -0.9876883 -0.4539927 0 -0.8910055 -0.707105 0 -0.7071086 -0.8910071 0 -0.4539896 -0.9876885 0 -0.1564334 -0.03388391 0 -0.9994258 0.9876887 0 0.1564319 0 0 1 -1 0 0 0 0 -1 -0.9876887 0 -0.1564319 0.03388391 0 0.9994258 1 0 0 -0.03388392 0 -0.9994258 0 1 0 0.03388392 0 0.9994258 0 -1 0 0 0 -1 0.9876885 0 -0.1564334 -0.03388356 0 0.9994258 -1 0 0 0.03388356 0 -0.9994258 0 -1 0 -0.03388356 0 0.9994258 0 1 0 0.03388356 0 -0.9994258 -0.9876885 0 0.1564334 0 0 1 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape7-binormals-array" count="110" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape7-map1" name="qt_gauge_needles_Shape7-map1">
+ <float_array id="qt_gauge_needles_Shape7-map1-array" count="180">0.6486027 0.1079661 0.626409 0.0644085 0.5918415 0.02984102 0.5482839 0.007647336 0.5 0 0.4517161 0.00764735 0.4081585 0.02984105 0.3735911 0.06440853 0.3513974 0.1079661 0.34375 0.15625 0.3513974 0.2045339 0.3735911 0.2480915 0.4081585 0.2826589 0.4517161 0.3048526 0.5 0.3125 0.5482839 0.3048526 0.5918415 0.2826589 0.6264089 0.2480915 0.6486026 0.2045339 0.65625 0.15625 0.375 0.3125 0.3875 0.3125 0.4 0.3125 0.4125 0.3125 0.425 0.3125 0.4374999 0.3125 0.4499999 0.3125 0.4624999 0.3125 0.4749999 0.3125 0.4874999 0.3125 0.4999999 0.3125 0.5124999 0.3125 0.5249999 0.3125 0.5374998 0.3125 0.5499998 0.3125 0.5624998 0.3125 0.5749998 0.3125 0.5874998 0.3125 0.5999998 0.3125 0.6124998 0.3125 0.6249998 0.3125 0.375 0.6884398 0.3875 0.6884398 0.4 0.6884398 0.4125 0.6884398 0.425 0.6884398 0.4374999 0.6884398 0.4499999 0.6884398 0.4624999 0.6884398 0.4749999 0.6884398 0.4874999 0.6884398 0.4999999 0.6884398 0.5124999 0.6884398 0.5249999 0.6884398 0.5374998 0.6884398 0.5499998 0.6884398 0.5624998 0.6884398 0.5749998 0.6884398 0.5874998 0.6884398 0.5999998 0.6884398 0.6124998 0.6884398 0.6249998 0.6884398 0.6486027 0.7954661 0.626409 0.7519085 0.5918415 0.717341 0.5482839 0.6951473 0.5 0.6874999 0.4517161 0.6951473 0.4081585 0.7173411 0.3735911 0.7519085 0.3513974 0.7954661 0.34375 0.84375 0.3513974 0.8920339 0.3735911 0.9355915 0.4081585 0.9701589 0.4517161 0.9923526 0.5 1 0.5482839 0.9923526 0.5918415 0.9701589 0.6264089 0.9355915 0.6486026 0.8920339 0.65625 0.84375 0.5 0.15 0.5 0.8375 0.4749999 0.3125 0.4874999 0.3125 0.4874999 0.6884398 0.4749999 0.6884398 0.4999999 0.3125 0.4999999 0.6884398</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape7-map1-array" count="90" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape7-textangents">
+ <float_array id="qt_gauge_needles_Shape7-textangents-array" count="672">0.9510574 0 -0.3090141 0.8090169 0 -0.5877853 0.8090169 0 -0.5877853 0.9510574 0 -0.3090141 0.8090169 0 -0.5877853 0.5877813 0 -0.8090199 0.5877813 0 -0.8090197 0.8090169 0 -0.5877853 0.5877813 0 -0.8090199 0.3090183 0 -0.951056 0.3090183 0 -0.951056 0.5877813 0 -0.8090197 0.3090183 0 -0.951056 0 0 -0.9999999 0 0 -0.9999999 0.3090183 0 -0.951056 0 0 -0.9999999 -0.3090183 0 -0.951056 -0.3090183 0 -0.951056 0 0 -0.9999999 -0.3090183 0 -0.951056 -0.587788 0 -0.8090149 -0.587788 0 -0.8090149 -0.3090183 0 -0.951056 -0.587788 0 -0.8090149 -0.8090152 0 -0.5877876 -0.8090152 0 -0.5877876 -0.587788 0 -0.8090149 -0.8090152 0 -0.5877876 -0.8910049 0 -0.4539934 -0.8910049 0 -0.4539934 -0.8090152 0 -0.5877876 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.8910068 0 0.4539898 -0.8090168 0 0.5877855 -0.8090168 0 0.5877855 -0.8910068 0 0.4539898 -0.8090168 0 0.5877855 -0.5877849 0 0.8090172 -0.5877849 0 0.8090172 -0.8090168 0 0.5877855 -0.5877849 0 0.8090172 -0.3090184 0 0.951056 -0.3090184 0 0.951056 -0.5877849 0 0.8090172 -0.3090184 0 0.951056 0 0 0.9999999 0 0 0.9999999 -0.3090184 0 0.951056 0 0 0.9999999 0.3090184 0 0.951056 0.3090184 0 0.951056 0 0 0.9999999 0.3090184 0 0.951056 0.5877849 0 0.8090171 0.5877849 0 0.8090171 0.3090184 0 0.951056 0.5877849 0 0.8090171 0.8090169 0 0.5877853 0.8090169 0 0.5877853 0.5877849 0 0.8090171 0.8090169 0 0.5877853 0.9510567 0 0.3090164 0.9510567 0 0.3090164 0.8090169 0 0.5877853 0.9510567 0 0.3090164 0.9999999 0 0 0.9999999 0 0 0.9510567 0 0.3090164 0.9999999 0 0 0.9510574 0 -0.3090141 0.9510574 0 -0.3090141 0.9999999 0 0 0.03310467 0 0.9994519 0.0384767 0 0.9992595 0 0 1 0.0242733 0 0.9997053 0.03310467 0 0.9994519 0 0 1 0.01283351 0 0.9999176 0.0242733 0 0.9997053 0 0 1 0 0 1 0.01283351 0 0.9999176 0 0 1 -0.01283481 0 0.9999176 0 0 1 0 0 1 -0.02426601 0 0.9997056 -0.01283481 0 0.9999176 0 0 1 -0.03310494 0 0.9994519 -0.02426601 0 0.9997056 0 0 1 -0.03848084 0 0.9992594 -0.03310494 0 0.9994519 0 0 1 -0.03996966 0 0.9992008 -0.03848084 0 0.9992594 0 0 1 -0.03756492 0 0.9992942 -0.03996966 0 0.9992008 0 0 1 -0.03161986 0 0.9994999 -0.03756492 0 0.9992942 0 0 1 -0.02278625 0 0.9997404 -0.03161986 0 0.9994999 0 0 1 -0.0119193 0 0.999929 -0.02278625 0 0.9997404 0 0 1 0 0 0.9999999 -0.0119193 0 0.999929 0 0 1 0.0119193 0 0.999929 0 0 0.9999999 0 0 1 0.02278626 0 0.9997404 0.0119193 0 0.999929 0 0 1 0.03161977 0 0.9994999 0.02278626 0 0.9997404 0 0 1 0.03756484 0 0.9992942 0.03161977 0 0.9994999 0 0 1 0.03996947 0 0.9992008 0.03756484 0 0.9992942 0 0 1 0.0384767 0 0.9992595 0.03996947 0 0.9992008 0 0 1 -0.03756683 0 0.9992942 -0.0316178 0 0.9995 0 0 1 -0.0316178 0 0.9995 -0.02278241 0 0.9997405 0 0 1 -0.02278241 0 0.9997405 -0.01191935 0 0.999929 0 0 1 -0.01191935 0 0.999929 0 0 1 0 0 1 0 0 1 0.01191849 0 0.999929 0 0 1 0.01191849 0 0.999929 0.02279026 0 0.9997402 0 0 1 0.02279026 0 0.9997402 0.03161717 0 0.9995 0 0 1 0.03161717 0 0.9995 0.03756245 0 0.9992943 0 0 1 0.03756245 0 0.9992943 0.03996983 0 0.9992008 0 0 1 0.03996983 0 0.9992008 0.03847804 0 0.9992595 0 0 1 0.03847804 0 0.9992595 0.03310236 0 0.9994519 0 0 1 0.03310236 0 0.9994519 0.02427024 0 0.9997054 0 0 1 0.02427024 0 0.9997054 0.01283388 0 0.9999176 0 0 1 0.01283388 0 0.9999176 0 0 0.9999999 0 0 1 0 0 0.9999999 -0.01283327 0 0.9999176 0 0 1 -0.01283327 0 0.9999176 -0.02426949 0 0.9997054 0 0 1 -0.02426949 0 0.9997054 -0.03310239 0 0.9994519 0 0 1 -0.03310239 0 0.9994519 -0.03847823 0 0.9992595 0 0 1 -0.03847823 0 0.9992595 -0.03996965 0 0.9992008 0 0 1 -0.03996965 0 0.9992008 -0.03756683 0 0.9992942 0 0 1 -0.9876887 0 -0.1564319 0.001661499 0 -0.9999986 0.9999999 0 0 0.0152831 0 0.9998832 0.7614832 0 -0.6481848 -0.03388391 0 -0.9994257 -0.7082806 0 0.7059309 0 0 0.9999999 0 -0.9999999 0 -0.03388118 0.01271698 -0.9993449 0 0.9999999 0 0.03388118 -0.01271698 0.9993449 -0.7614836 0 -0.6481841 0.03388356 0 -0.9994257 0.7082806 0 0.7059309 0 0 0.9999999 0 0.9999999 0 0.03388082 -0.01271698 -0.999345 0 -0.9999999 0 -0.03388082 0.01271698 0.999345 0.9876885 0 -0.1564334 -0.001661499 0 -0.9999986 -0.9999999 0 0 -0.01528293 0 0.9998832</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape7-textangents-array" count="224" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape7-texbinormals">
+ <float_array id="qt_gauge_needles_Shape7-texbinormals-array" count="672">0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -0.9994519 0 0.03310467 -0.9992595 0 0.0384767 -1 0 0 -0.9997054 0 0.0242733 -0.9994519 0 0.03310467 -1 0 0 -0.9999177 0 0.01283351 -0.9997054 0 0.0242733 -1 0 0 -1 0 0 -0.9999177 0 0.01283351 -1 0 0 -0.9999176 0 -0.01283481 -1 0 0 -1 0 0 -0.9997056 0 -0.02426601 -0.9999176 0 -0.01283481 -1 0 0 -0.9994519 0 -0.03310494 -0.9997056 0 -0.02426601 -1 0 0 -0.9992594 0 -0.03848084 -0.9994519 0 -0.03310494 -1 0 0 -0.9992009 0 -0.03996966 -0.9992594 0 -0.03848084 -1 0 0 -0.9992943 0 -0.03756492 -0.9992009 0 -0.03996966 -1 0 0 -0.9995 0 -0.03161986 -0.9992943 0 -0.03756492 -1 0 0 -0.9997404 0 -0.02278625 -0.9995 0 -0.03161986 -1 0 0 -0.999929 0 -0.0119193 -0.9997404 0 -0.02278625 -1 0 0 -1 0 0 -0.999929 0 -0.0119193 -1 0 0 -0.999929 0 0.0119193 -1 0 0 -1 0 0 -0.9997404 0 0.02278626 -0.999929 0 0.0119193 -1 0 0 -0.9995 0 0.03161978 -0.9997404 0 0.02278626 -1 0 0 -0.9992942 0 0.03756484 -0.9995 0 0.03161978 -1 0 0 -0.9992009 0 0.03996948 -0.9992942 0 0.03756484 -1 0 0 -0.9992595 0 0.0384767 -0.9992009 0 0.03996948 -1 0 0 0.9992942 0 0.03756683 0.9995001 0 0.0316178 1 0 0 0.9995001 0 0.0316178 0.9997405 0 0.02278241 1 0 0 0.9997405 0 0.02278241 0.999929 0 0.01191935 1 0 0 0.999929 0 0.01191935 1 0 0 1 0 0 1 0 0 0.9999291 0 -0.01191849 1 0 0 0.9999291 0 -0.01191849 0.9997404 0 -0.02279026 1 0 0 0.9997404 0 -0.02279026 0.9995002 0 -0.03161717 1 0 0 0.9995002 0 -0.03161717 0.9992943 0 -0.03756244 1 0 0 0.9992943 0 -0.03756244 0.9992009 0 -0.03996983 1 0 0 0.9992009 0 -0.03996983 0.9992595 0 -0.03847804 1 0 0 0.9992595 0 -0.03847804 0.999452 0 -0.03310236 1 0 0 0.999452 0 -0.03310236 0.9997054 0 -0.02427024 1 0 0 0.9997054 0 -0.02427024 0.9999177 0 -0.01283388 1 0 0 0.9999177 0 -0.01283388 1 0 0 1 0 0 1 0 0 0.9999177 0 0.01283327 1 0 0 0.9999177 0 0.01283327 0.9997055 0 0.02426949 1 0 0 0.9997055 0 0.02426949 0.999452 0 0.03310239 1 0 0 0.999452 0 0.03310239 0.9992595 0 0.03847823 1 0 0 0.9992595 0 0.03847823 0.9992009 0 0.03996966 1 0 0 0.9992009 0 0.03996966 0.9992942 0 0.03756683 1 0 0 0.1564319 0 -0.9876888 0.9999986 0 0.001661499 0 0 1 -0.9998832 0 0.0152831 -0.6481848 0 -0.7614832 -0.9994258 0 0.03388391 0.7059309 0 0.7082807 1 0 0 -0.03388391 0 -0.9994258 4.30901e-4 0.9999192 0.01270967 0.03388391 0 0.9994258 -4.30901e-4 -0.9999192 -0.01270967 0.6481842 0 -0.7614837 0.9994258 0 0.03388356 -0.7059309 0 0.7082807 -1 0 0 0.03388356 0 -0.9994258 -4.30896e-4 -0.9999192 0.01270967 -0.03388356 0 0.9994258 4.30896e-4 0.9999192 -0.01270967 -0.1564334 0 -0.9876885 -0.9999986 0 0.001661499 0 0 1 0.9998832 0 0.01528293</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape7-texbinormals-array" count="224" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_Shape7-vertices" name="qt_gauge_needles_Shape7-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_Shape7-positions"/>
+ </vertices>
+ <triangles material="lambert4SG" count="92">
+ <input semantic="VERTEX" source="#qt_gauge_needles_Shape7-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_Shape7-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_Shape7-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_Shape7-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_Shape7-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_Shape7-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_Shape7-texbinormals" offset="3" set="0"/>
+ <p>0 0 20 0 1 1 21 1 20 3 41 3 20 3 41 3 1 1 21 1 21 2 42 2 1 1 21 4 2 4 22 5 21 2 42 7 21 2 42 7 2 4 22 5 22 5 43 6 2 4 22 8 3 6 23 9 22 5 43 11 22 5 43 11 3 6 23 9 23 7 44 10 3 6 23 12 4 8 24 13 23 7 44 15 23 7 44 15 4 8 24 13 24 9 45 14 4 8 24 16 5 10 25 17 24 9 45 19 24 9 45 19 5 10 25 17 25 11 46 18 5 10 25 20 6 12 26 21 25 11 46 23 25 11 46 23 6 12 26 21 26 13 47 22 6 12 26 24 7 14 27 25 26 13 47 27 26 13 47 27 7 14 27 25 27 15 48 26 7 14 27 28 8 16 28 29 27 15 48 31 27 15 48 31 8 16 28 29 28 17 49 30 42 18 84 32 43 19 85 33 45 21 87 35 45 21 87 35 43 19 85 33 44 20 86 34 43 19 85 36 46 22 88 37 44 20 86 39 44 20 86 39 46 22 88 37 47 23 89 38 10 24 30 40 11 25 31 41 30 27 51 43 30 27 51 43 11 25 31 41 31 26 52 42 11 25 31 44 12 28 32 45 31 26 52 47 31 26 52 47 12 28 32 45 32 29 53 46 12 28 32 48 13 30 33 49 32 29 53 51 32 29 53 51 13 30 33 49 33 31 54 50 13 30 33 52 14 32 34 53 33 31 54 55 33 31 54 55 14 32 34 53 34 33 55 54 14 32 34 56 15 34 35 57 34 33 55 59 34 33 55 59 15 34 35 57 35 35 56 58 15 34 35 60 16 36 36 61 35 35 56 63 35 35 56 63 16 36 36 61 36 37 57 62 16 36 36 64 17 38 37 65 36 37 57 67 36 37 57 67 17 38 37 65 37 39 58 66 17 38 37 68 18 40 38 69 37 39 58 71 37 39 58 71 18 40 38 69 38 41 59 70 18 40 38 72 19 42 39 73 38 41 59 75 38 41 59 75 19 42 39 73 39 43 60 74 19 42 39 76 0 0 40 77 39 43 60 79 39 43 60 79 0 0 40 77 20 3 61 78 1 44 1 80 0 45 0 81 40 46 82 82 2 47 2 83 1 44 1 84 40 46 82 85 3 48 3 86 2 47 2 87 40 46 82 88 4 49 4 89 3 48 3 90 40 46 82 91 5 50 5 92 4 49 4 93 40 46 82 94 6 51 6 95 5 50 5 96 40 46 82 97 7 52 7 98 6 51 6 99 40 46 82 100 8 53 8 101 7 52 7 102 40 46 82 103 9 54 9 104 8 53 8 105 40 46 82 106 10 55 10 107 9 54 9 108 40 46 82 109 11 56 11 110 10 55 10 111 40 46 82 112 12 57 12 113 11 56 11 114 40 46 82 115 13 58 13 116 12 57 12 117 40 46 82 118 14 59 14 119 13 58 13 120 40 46 82 121 15 60 15 122 14 59 14 123 40 46 82 124 16 61 16 125 15 60 15 126 40 46 82 127 17 62 17 128 16 61 16 129 40 46 82 130 18 63 18 131 17 62 17 132 40 46 82 133 19 64 19 134 18 63 18 135 40 46 82 136 0 45 0 137 19 64 19 138 40 46 82 139 20 65 80 140 21 66 79 141 41 67 83 142 21 66 79 143 22 68 78 144 41 67 83 145 22 68 78 146 23 69 77 147 41 67 83 148 23 69 77 149 24 70 76 150 41 67 83 151 24 70 76 152 25 71 75 153 41 67 83 154 25 71 75 155 26 72 74 156 41 67 83 157 26 72 74 158 27 73 73 159 41 67 83 160 27 73 73 161 28 74 72 162 41 67 83 163 28 74 72 164 29 75 71 165 41 67 83 166 29 75 71 167 30 76 70 168 41 67 83 169 30 76 70 170 31 77 69 171 41 67 83 172 31 77 69 173 32 78 68 174 41 67 83 175 32 78 68 176 33 79 67 177 41 67 83 178 33 79 67 179 34 80 66 180 41 67 83 181 34 80 66 182 35 81 65 183 41 67 83 184 35 81 65 185 36 82 64 186 41 67 83 187 36 82 64 188 37 83 63 189 41 67 83 190 37 83 63 191 38 84 62 192 41 67 83 193 38 84 62 194 39 85 81 195 41 67 83 196 39 85 81 197 20 65 80 198 41 67 83 199 43 88 85 202 42 89 84 203 9 87 29 201 8 86 28 200 9 87 29 201 42 89 84 203 44 93 86 207 29 90 50 204 45 92 87 206 29 90 50 204 28 91 49 205 45 92 87 206 28 94 49 208 8 95 28 209 45 97 87 211 45 97 87 211 8 95 28 209 42 96 84 210 43 101 85 215 9 98 29 212 46 100 88 214 9 98 29 212 10 99 30 213 46 100 88 214 10 102 30 216 30 103 51 217 46 105 88 219 46 105 88 219 30 103 51 217 47 104 89 218 44 108 86 222 47 109 89 223 29 107 50 221 30 106 51 220 29 107 50 221 47 109 89 223</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_Shape7</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_7" name="qt_gauge_needles_7" type="NODE">
+ <matrix sid="transform">1 0 0 -57 0 1 0 -0.1370364 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_Shape7">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_7</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_8.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_8.dae
new file mode 100644
index 0000000..f4a3b4f
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_8.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T10:01:46</created>
+ <modified>2018-03-08T10:01:46</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="solidWhite" name="solidWhite">
+ <instance_effect url="#solidWhite-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="solidWhite-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.6931298 0.6931298 0.6931298 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">solidWhite</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_Shape8" name="qt_gauge_needles_Shape8">
+ <mesh>
+ <source id="qt_gauge_needles_Shape8-positions" name="qt_gauge_needles_Shape8-positions">
+ <float_array id="qt_gauge_needles_Shape8-positions-array" count="84">0.437016 0 1.344998 0.8312535 0 1.144124 1.144124 0 0.8312544 1.344998 0 0.4370162 1.414215 0 0 0.05906296 0 -12 -0.05906296 0 -12 -1.414215 0 0 -1.344997 0 0.437016 -1.144122 0 0.8312538 -0.8312533 0 1.144123 -0.4370159 0 1.344997 0 0 1.414214 0.437016 0.6827607 1.344998 0.8312535 0.6827607 1.144124 1.144124 0.6827607 0.8312544 1.344998 0.6827607 0.4370162 1.414215 0.6827607 0 0.05906296 0.6827607 -12 -0.05906296 0.6827607 -12 -1.414215 0.6827607 0 -1.344997 0.6827607 0.437016 -1.144122 0.6827607 0.8312538 -0.8312533 0.6827607 1.144123 -0.4370159 0.6827607 1.344997 0 0.6827607 1.414214 0 0 0 0 0.6827607 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape8-positions-array" count="28" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape8-normals" name="qt_gauge_needles_Shape8-normals">
+ <float_array id="qt_gauge_needles_Shape8-normals-array" count="174">0.3090158 0 0.9510568 0.5877847 0 0.8090174 0.5877847 0 0.8090174 0.3090158 0 0.9510568 0.8090163 0 0.587786 0.8090163 0 0.587786 0.9510567 0 0.3090168 0.9510567 0 0.3090168 0.9946972 0 -0.1028475 0.9946972 0 -0.1028475 0.9936838 0 -0.1122161 0.9936838 0 -0.1122161 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.9936838 0 -0.1122161 -0.9946972 0 -0.1028474 -0.9946972 0 -0.1028474 -0.9936838 0 -0.1122161 -0.9510558 0 0.3090191 -0.9510558 0 0.3090191 -0.8090168 0 0.5877855 -0.8090168 0 0.5877855 -0.5877855 0 0.8090169 -0.5877855 0 0.8090169 -0.3090176 0 0.9510563 -0.3090176 0 0.9510563 0 0 0.9999999 0 0 0.9999999 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape8-normals-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape8-tangents" name="qt_gauge_needles_Shape8-tangents">
+ <float_array id="qt_gauge_needles_Shape8-tangents-array" count="174">0.9510569 0 -0.3090158 0 1 0 -0.8090174 0 0.5877847 0 -1 0 0 1 0 -0.5877861 0 0.8090164 0 0.9999999 0 -0.3090168 0 0.9510566 0 1 0 0.1028475 0 0.9946972 0 0.9999999 0 0.1122161 0 0.9936838 -0.9999999 0 0 0 1 0 0.9999999 0 0 0 -1 0 -0.1122161 0 0.9936838 0 1 0 0.1028474 0 -0.9946972 0 -0.9999999 0 0 1 0 -0.3090191 0 -0.9510558 0 0.9999999 0 -0.5877855 0 -0.8090168 0 1 0 -0.8090168 0 -0.5877854 0 1 0 -0.9510563 0 -0.3090176 0 1 0 -0.9999999 0 0 -0.8090172 0 0.5877848 -0.453991 0 -0.8910062 0.9510565 0 -0.3090168 -0.5877849 0 0.8090172 -0.3090169 0 0.9510565 0 0 0.9999999 0.9999879 0 0.004921854 0.9999879 0 -0.004921854 0 0 -0.9999999 -0.309017 0 -0.9510565 -0.5877854 0 -0.8090169 -0.8090172 0 -0.587785 -0.9510565 0 -0.3090169 -0.9999999 0 0 0.9510565 0 -0.3090168 -0.453991 0 -0.8910062 -0.8090172 0 0.5877848 -0.7071049 0 -0.7071087 -0.891007 0 -0.4539894 -0.9876882 0 -0.1564353 -0.9936838 0 0.1122161 0 0 1 0.9936838 0 0.1122161 0.9876877 0 -0.1564381 0.8910062 0 -0.4539911 0.7071067 0 -0.7071068 0.4539909 0 -0.8910064 0.1564349 0 -0.9876882</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape8-tangents-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape8-binormals" name="qt_gauge_needles_Shape8-binormals">
+ <float_array id="qt_gauge_needles_Shape8-binormals-array" count="174">0 1 0 -0.8090174 0 0.5877847 0 -1 0 0.951057 0 -0.3090158 -0.5877861 0 0.8090165 0 -1 0 -0.3090168 0 0.9510566 0 -1 0 0.1028475 0 0.9946972 0 -1 0 0.1122161 0 0.9936839 0 -1 0 0 1 0 1 0 0 0 -1 0 -1 0 0 0 1 0 0.1028474 0 -0.9946972 0 -1 0 -0.1122161 0 0.9936839 -0.3090191 0 -0.9510559 0 -1 0 -0.5877855 0 -0.8090168 0 -1 0 -0.8090168 0 -0.5877854 0 -1 0 -0.9510563 0 -0.3090176 0 -1 0 -1 0 0 0 -1 0 -0.5877849 0 -0.8090174 0.8910064 0 -0.453991 0.3090168 0 0.9510565 -0.8090172 0 -0.5877849 -0.9510565 0 -0.3090169 -1 0 0 -0.004921854 0 0.999988 0.004921854 0 0.999988 1 0 0 0.9510565 0 -0.309017 0.8090169 0 -0.5877854 0.587785 0 -0.8090172 0.3090169 0 -0.9510566 0 0 -1 -0.3090168 0 -0.9510567 -0.8910064 0 0.453991 0.5877849 0 0.8090174 -0.7071087 0 0.7071049 -0.4539894 0 0.8910072 -0.1564353 0 0.9876883 0.1122161 0 0.9936839 1 0 0 0.1122161 0 -0.9936839 -0.1564381 0 -0.9876878 -0.4539911 0 -0.8910062 -0.7071068 0 -0.7071067 -0.8910064 0 -0.4539909 -0.9876884 0 -0.156435</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape8-binormals-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape8-map1" name="qt_gauge_needles_Shape8-map1">
+ <float_array id="qt_gauge_needles_Shape8-map1-array" count="112">0.6486027 0.1079661 0.626409 0.0644085 0.5918415 0.02984102 0.5482839 0.007647336 0.5 0 0.3696229 0.09271829 0.382513 0.2324342 0.5 0.3125 0.5482839 0.3048526 0.5918415 0.2826589 0.6264089 0.2480915 0.6486026 0.2045339 0.65625 0.15625 0.375 0.3125 0.3875 0.3125 0.4 0.3125 0.4125 0.3125 0.425 0.3125 0.4529641 0.3125517 0.5223452 0.312546 0.5499998 0.3125 0.5624998 0.3125 0.5749998 0.3125 0.5874998 0.3125 0.5999998 0.3125 0.6124998 0.3125 0.6249998 0.3125 0.375 0.6884398 0.3875 0.6884398 0.4 0.6884398 0.4125 0.6884398 0.425 0.6884398 0.4532558 0.6883814 0.5221506 0.6883841 0.5499998 0.6884398 0.5624998 0.6884398 0.5749998 0.6884398 0.5874998 0.6884398 0.5999998 0.6884398 0.6124998 0.6884398 0.6249998 0.6884398 0.6486027 0.7954661 0.626409 0.7519085 0.5918415 0.717341 0.5482839 0.6951473 0.5 0.6874999 0.382513 0.7678245 0.3696229 0.9076098 0.5 1 0.5482839 0.9923526 0.5918415 0.9701589 0.6264089 0.9355915 0.6486026 0.8920339 0.65625 0.84375 0.5 0.15 0.5 0.8375</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape8-map1-array" count="56" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape8-textangents">
+ <float_array id="qt_gauge_needles_Shape8-textangents-array" count="390">0.9510568 0 -0.3090158 0.8090174 0 -0.5877846 0.8090174 0 -0.5877846 0.9510568 0 -0.3090158 0.8090174 0 -0.5877846 0.587786 0 -0.8090163 0.587786 0 -0.8090163 0.8090174 0 -0.5877846 0.587786 0 -0.8090163 0.3090168 0 -0.9510566 0.3090168 0 -0.9510566 0.587786 0 -0.8090163 0.3090168 0 -0.9510566 -0.1028475 0 -0.9946971 -0.1028475 0 -0.9946971 0.3090168 0 -0.9510566 -0.1028475 0 -0.9946971 -0.1122161 0 -0.9936838 -0.1122161 0 -0.9936838 -0.1028475 0 -0.9946971 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.1122161 0 0.9936838 -0.1028474 0 0.9946971 -0.1028474 0 0.9946971 -0.1122161 0 0.9936838 -0.1028474 0 0.9946971 0.309019 0 0.9510558 0.309019 0 0.9510558 -0.1028474 0 0.9946971 0.309019 0 0.9510558 0.5877855 0 0.8090168 0.5877855 0 0.8090168 0.309019 0 0.9510558 0.5877855 0 0.8090168 0.8090168 0 0.5877854 0.8090168 0 0.5877854 0.5877855 0 0.8090168 0.8090168 0 0.5877854 0.9510562 0 0.3090176 0.9510562 0 0.3090176 0.8090168 0 0.5877854 0.9510562 0 0.3090176 0.9999999 0 0 0.9999999 0 0 0.9510562 0 0.3090176 0.9999999 0 0 0.9510568 0 -0.3090157 0.9510568 0 -0.3090157 0.9999999 0 0 0.03310081 0 0.999452 0.03847864 0 0.9992595 0.01871916 0 0.9998248 0.02426912 0 0.9997054 0.03310081 0 0.999452 0.01871916 0 0.9998248 0.01283537 0 0.9999176 0.02426912 0 0.9997054 0.01871916 0 0.9998248 0.02332768 0 0.9997278 0.01283537 0 0.9999176 0.01871916 0 0.9998248 0.01958643 0 0.9998081 0.02332768 0 0.9997278 0.01871916 0 0.9998248 -0.02784325 0 0.9996123 0.01958643 0 0.9998081 0.01871916 0 0.9998248 -0.02435358 0 0.9997034 -0.02784325 0 0.9996123 0.01871916 0 0.9998248 0.0119199 0 0.999929 -0.02435358 0 0.9997034 0.01871916 0 0.9998248 0.02278675 0 0.9997404 0.0119199 0 0.999929 0.01871916 0 0.9998248 0.03162001 0 0.9994999 0.02278675 0 0.9997404 0.01871916 0 0.9998248 0.03756307 0 0.9992943 0.03162001 0 0.9994999 0.01871916 0 0.9998248 0.03996848 0 0.9992009 0.03756307 0 0.9992943 0.01871916 0 0.9998248 0.03847864 0 0.9992595 0.03996848 0 0.9992009 0.01871916 0 0.9998248 -0.03756465 0 0.9992942 -0.03162152 0 0.9994999 -0.02021771 0 0.9997955 -0.03162152 0 0.9994999 -0.02278693 0 0.9997404 -0.02021771 0 0.9997955 -0.02278693 0 0.9997404 -0.01191749 0 0.999929 -0.02021771 0 0.9997955 -0.01191749 0 0.999929 0.01989831 0 0.9998019 -0.02021771 0 0.9997955 0.01989831 0 0.9998019 0.02295173 0 0.9997365 -0.02021771 0 0.9997955 0.02295173 0 0.9997365 -0.0248794 0 0.9996904 -0.02021771 0 0.9997955 -0.0248794 0 0.9996904 -0.02818346 0 0.9996028 -0.02021771 0 0.9997955 -0.02818346 0 0.9996028 -0.01283267 0 0.9999176 -0.02021771 0 0.9997955 -0.01283267 0 0.9999176 -0.02426906 0 0.9997054 -0.02021771 0 0.9997955 -0.02426906 0 0.9997054 -0.03310209 0 0.999452 -0.02021771 0 0.9997955 -0.03310209 0 0.999452 -0.03847983 0 0.9992594 -0.02021771 0 0.9997955 -0.03847983 0 0.9992594 -0.03997085 0 0.9992008 -0.02021771 0 0.9997955 -0.03997085 0 0.9992008 -0.03756465 0 0.9992942 -0.02021771 0 0.9997955</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape8-textangents-array" count="130" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_Shape8-texbinormals">
+ <float_array id="qt_gauge_needles_Shape8-texbinormals-array" count="390">0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -0.9994521 0 0.03310081 -0.9992595 0 0.03847864 -0.9998248 0 0.01871916 -0.9997055 0 0.02426912 -0.9994521 0 0.03310081 -0.9998248 0 0.01871916 -0.9999176 0 0.01283537 -0.9997055 0 0.02426912 -0.9998248 0 0.01871916 -0.999728 0 0.02332768 -0.9999176 0 0.01283537 -0.9998248 0 0.01871916 -0.9998082 0 0.01958643 -0.999728 0 0.02332768 -0.9998248 0 0.01871916 -0.9996123 0 -0.02784325 -0.9998082 0 0.01958643 -0.9998248 0 0.01871916 -0.9997035 0 -0.02435358 -0.9996123 0 -0.02784325 -0.9998248 0 0.01871916 -0.999929 0 0.0119199 -0.9997035 0 -0.02435358 -0.9998248 0 0.01871916 -0.9997404 0 0.02278675 -0.999929 0 0.0119199 -0.9998248 0 0.01871916 -0.9995 0 0.03162001 -0.9997404 0 0.02278675 -0.9998248 0 0.01871916 -0.9992943 0 0.03756307 -0.9995 0 0.03162001 -0.9998248 0 0.01871916 -0.999201 0 0.03996849 -0.9992943 0 0.03756307 -0.9998248 0 0.01871916 -0.9992595 0 0.03847864 -0.999201 0 0.03996849 -0.9998248 0 0.01871916 0.9992943 0 0.03756466 0.9994999 0 0.03162152 0.9997956 0 0.02021771 0.9994999 0 0.03162152 0.9997404 0 0.02278693 0.9997956 0 0.02021771 0.9997404 0 0.02278693 0.999929 0 0.01191749 0.9997956 0 0.02021771 0.999929 0 0.01191749 0.9998021 0 -0.01989831 0.9997956 0 0.02021771 0.9998021 0 -0.01989831 0.9997366 0 -0.02295173 0.9997956 0 0.02021771 0.9997366 0 -0.02295173 0.9996905 0 0.0248794 0.9997956 0 0.02021771 0.9996905 0 0.0248794 0.9996029 0 0.02818346 0.9997956 0 0.02021771 0.9996029 0 0.02818346 0.9999177 0 0.01283267 0.9997956 0 0.02021771 0.9999177 0 0.01283267 0.9997055 0 0.02426906 0.9997956 0 0.02021771 0.9997055 0 0.02426906 0.999452 0 0.03310209 0.9997956 0 0.02021771 0.999452 0 0.03310209 0.9992594 0 0.03847983 0.9997956 0 0.02021771 0.9992594 0 0.03847983 0.9992009 0 0.03997086 0.9997956 0 0.02021771 0.9992009 0 0.03997086 0.9992943 0 0.03756466 0.9997956 0 0.02021771</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_Shape8-texbinormals-array" count="130" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_Shape8-vertices" name="qt_gauge_needles_Shape8-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_Shape8-positions"/>
+ </vertices>
+ <triangles material="lambert4SG" count="52">
+ <input semantic="VERTEX" source="#qt_gauge_needles_Shape8-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_Shape8-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_Shape8-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_Shape8-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_Shape8-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_Shape8-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_Shape8-texbinormals" offset="3" set="0"/>
+ <p>0 0 13 0 1 1 14 1 13 3 27 3 13 3 27 3 1 1 14 1 14 2 28 2 1 1 14 4 2 4 15 5 14 2 28 7 14 2 28 7 2 4 15 5 15 5 29 6 2 4 15 8 3 6 16 9 15 5 29 11 15 5 29 11 3 6 16 9 16 7 30 10 3 6 16 12 4 8 17 13 16 7 30 15 16 7 30 15 4 8 17 13 17 9 31 14 4 8 17 16 5 10 18 17 17 9 31 19 17 9 31 19 5 10 18 17 18 11 32 18 5 12 18 20 6 13 19 21 18 15 32 23 18 15 32 23 6 13 19 21 19 14 33 22 6 16 19 24 7 17 20 25 19 19 33 27 19 19 33 27 7 17 20 25 20 18 34 26 7 17 20 28 8 20 21 29 20 18 34 31 20 18 34 31 8 20 21 29 21 21 35 30 8 20 21 32 9 22 22 33 21 21 35 35 21 21 35 35 9 22 22 33 22 23 36 34 9 22 22 36 10 24 23 37 22 23 36 39 22 23 36 39 10 24 23 37 23 25 37 38 10 24 23 40 11 26 24 41 23 25 37 43 23 25 37 43 11 26 24 41 24 27 38 42 11 26 24 44 12 28 25 45 24 27 38 47 24 27 38 47 12 28 25 45 25 29 39 46 12 28 25 48 0 0 26 49 25 29 39 51 25 29 39 51 0 0 26 49 13 3 40 50 1 30 1 52 0 31 0 53 26 32 54 54 2 33 2 55 1 30 1 56 26 32 54 57 3 34 3 58 2 33 2 59 26 32 54 60 4 35 4 61 3 34 3 62 26 32 54 63 5 36 5 64 4 35 4 65 26 32 54 66 6 37 6 67 5 36 5 68 26 32 54 69 7 38 7 70 6 37 6 71 26 32 54 72 8 39 8 73 7 38 7 74 26 32 54 75 9 40 9 76 8 39 8 77 26 32 54 78 10 41 10 79 9 40 9 80 26 32 54 81 11 42 11 82 10 41 10 83 26 32 54 84 12 43 12 85 11 42 11 86 26 32 54 87 0 31 0 88 12 43 12 89 26 32 54 90 13 44 52 91 14 45 51 92 27 46 55 93 14 45 51 94 15 47 50 95 27 46 55 96 15 47 50 97 16 48 49 98 27 46 55 99 16 48 49 100 17 49 48 101 27 46 55 102 17 49 48 103 18 50 47 104 27 46 55 105 18 50 47 106 19 51 46 107 27 46 55 108 19 51 46 109 20 52 45 110 27 46 55 111 20 52 45 112 21 53 44 113 27 46 55 114 21 53 44 115 22 54 43 116 27 46 55 117 22 54 43 118 23 55 42 119 27 46 55 120 23 55 42 121 24 56 41 122 27 46 55 123 24 56 41 124 25 57 53 125 27 46 55 126 25 57 53 127 13 44 52 128 27 46 55 129</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_Shape8</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_8" name="qt_gauge_needles_8" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_Shape8">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert4SG" target="#solidWhite"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_8</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_9.dae b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_9.dae
new file mode 100644
index 0000000..82fc4b8
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Needles/needle_9.dae
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:55:56</created>
+ <modified>2018-03-08T09:55:56</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="red_transparent" name="red_transparent">
+ <instance_effect url="#red_transparent-fx"/>
+ </material>
+ <material id="black_solid" name="black_solid">
+ <instance_effect url="#black_solid-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="black_solid-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2938931 0.2938931 0.2938931 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.03053435 0.03053435 0.03053435 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">black_solid</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ <effect id="red_transparent-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.56808 0.05568 0.05568 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0.2251908 0.2251908 0.2251908 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">red_transparent</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_needles_8Shape9" name="qt_gauge_needles_8Shape9">
+ <mesh>
+ <source id="qt_gauge_needles_8Shape9-positions" name="qt_gauge_needles_8Shape9-positions">
+ <float_array id="qt_gauge_needles_8Shape9-positions-array" count="570">-0.06937027 0 -8 -0.06936836 0 -0.1618332 0.06937027 0 -8 0.06936836 0 -0.1618332 -0.06937027 0.0958578 -8 -0.06936836 0.7002875 -0.1618332 0.06936836 0.7002875 -0.1618332 0.06937027 0.0958578 -8 -0.06936836 0.3020315 -6.797693 -0.06937027 0.20611 -7.38449 0.06936646 0.20611 -7.38449 0.06936836 0.3020315 -6.797693 0.06937027 0 -7.387154 0.06936836 0 -6.796488 -0.06936646 0 -7.387154 -0.06936836 0 -6.796488 -0.06936836 0.4607714 -5.615142 -0.06937027 0.3898765 -6.203689 0.06937027 0.3898765 -6.203689 0.06936836 0.4607714 -5.615142 0.06936836 0 -6.205704 0.06936836 0 -5.615038 -0.06936836 0 -6.205704 -0.06936836 0 -5.615038 -0.06936836 0.6027073 -3.879921 -0.06937027 0.5675001 -4.470063 0.06937027 0.5675001 -4.470063 0.06936836 0.6027073 -3.879921 0.06936836 0 -4.470912 0.06936836 0 -3.880246 -0.06936836 0 -4.470912 -0.06936836 0 -3.880246 0.2393169 0 0.9709425 0.4647236 0 0.8854566 0.6631241 0 0.7485113 0.8229847 0 0.5680652 0.9350166 0 0.3546051 0.9927101 0 0.1205367 0.9927101 0 -0.1205367 0.9350166 0 -0.3546051 0.8229828 0 -0.568065 0.6631241 0 -0.7485111 0.4647236 0 -0.8854564 0.2393169 0 -0.9709422 0 0 -1 -0.239315 0 -0.9709422 -0.4647236 0 -0.8854563 -0.6631222 0 -0.748511 -0.8229847 0 -0.5680649 -0.9350166 0 -0.354605 -0.9927082 0 -0.1205367 -0.9927082 0 0.1205367 -0.9350166 0 0.3546049 -0.8229828 0 0.5680648 -0.6631222 0 0.7485108 -0.4647236 0 0.885456 -0.239315 0 0.9709418 0 0 1 0 0 0 0 0.6268091 0 0.2393169 0.5966012 0.9709425 0.2320328 0.6268091 0.941397 0.4647236 0.5966012 0.8854566 0.4505825 0.6268091 0.8585125 0.6631241 0.5966012 0.7485113 0.6429443 0.6268091 0.7257342 0.8229847 0.5966012 0.5680652 0.7979412 0.6268091 0.550779 0.9350166 0.5966012 0.3546051 0.9065647 0.6268091 0.3438146 0.9927101 0.5966012 0.1205367 0.9625015 0.6268091 0.1168689 0.9927101 0.5966012 -0.1205367 0.9625015 0.6268091 -0.1168688 0.9350166 0.5966012 -0.3546051 0.9065647 0.6268091 -0.3438146 0.8229828 0.5966012 -0.568065 0.7979412 0.6268091 -0.5507789 0.6631241 0.5966012 -0.7485111 0.6429443 0.6268091 -0.7257341 0.4647236 0.5966012 -0.8854564 0.4505806 0.6268091 -0.8585122 0.2393169 0.5966012 -0.9709422 0.2320328 0.6268091 -0.9413967 0 0.5966012 -1 0 0.6268091 -0.9695706 -0.239315 0.5966012 -0.9709422 -0.2320328 0.6268091 -0.9413966 -0.4647236 0.5966012 -0.8854563 -0.4505825 0.6268091 -0.8585122 -0.6631222 0.5966012 -0.748511 -0.6429443 0.6268091 -0.725734 -0.8229847 0.5966012 -0.5680649 -0.7979412 0.6268091 -0.5507789 -0.9350166 0.5966012 -0.354605 -0.9065647 0.6268091 -0.3438144 -0.9927082 0.5966012 -0.1205367 -0.9625015 0.6268091 -0.1168688 -0.9927082 0.5966012 0.1205367 -0.9625015 0.6268091 0.1168688 -0.9350166 0.5966012 0.3546049 -0.9065628 0.6268091 0.3438144 -0.8229828 0.5966012 0.5680648 -0.7979393 0.6268091 0.5507787 -0.6631222 0.5966012 0.7485108 -0.6429443 0.6268091 0.7257338 -0.4647236 0.5966012 0.885456 -0.4505825 0.6268091 0.8585118 -0.239315 0.5966012 0.9709418 -0.2320328 0.6268091 0.9413962 0 0.5966012 1 0 0.6268091 0.9695702 0.1506271 0.6268091 0.6111158 0.1567745 0.6131297 0.6360592 0.1629238 0.6268091 0.6610026 0.2924995 0.6268091 0.5573106 0.3044376 0.6131297 0.5800579 0.3163776 0.6268091 0.6028051 0.4173737 0.6268091 0.4711166 0.4344082 0.6131297 0.4903457 0.4514446 0.6268091 0.5095749 0.5179901 0.6268091 0.3575429 0.5391331 0.6131297 0.3721364 0.560276 0.6268091 0.3867299 0.5885048 0.6268091 0.2231901 0.612524 0.6131297 0.2322999 0.6365452 0.6268091 0.2414097 0.6248169 0.6268091 0.0758664 0.6503181 0.6131297 0.07896298 0.6758213 0.6268091 0.08205956 0.624815 0.6268091 -0.0758664 0.6503201 0.6131297 -0.07896298 0.6758213 0.6268091 -0.08205956 0.5885048 0.6268091 -0.2231902 0.612524 0.6131297 -0.2322999 0.6365452 0.6268091 -0.2414097 0.517992 0.6268091 -0.3575428 0.5391312 0.6131297 -0.3721364 0.5602741 0.6268091 -0.3867299 0.4173717 0.6268091 -0.4711165 0.4344082 0.6131297 -0.4903456 0.4514446 0.6268091 -0.5095748 0.2924995 0.6268091 -0.5573105 0.3044376 0.6131297 -0.5800577 0.3163776 0.6268091 -0.602805 0.1506252 0.6268091 -0.6111156 0.1567745 0.6131297 -0.636059 0.1629219 0.6268091 -0.6610025 0 0.6268091 -0.629405 0 0.6131297 -0.6550949 0 0.6268091 -0.6807848 -0.1506271 0.6268091 -0.6111156 -0.1567745 0.6131297 -0.636059 -0.1629238 0.6268091 -0.6610024 -0.2924995 0.6268091 -0.5573105 -0.3044376 0.6131297 -0.5800577 -0.3163757 0.6268091 -0.602805 -0.4173737 0.6268091 -0.4711164 -0.4344082 0.6131297 -0.4903456 -0.4514446 0.6268091 -0.5095747 -0.5179901 0.6268091 -0.3575428 -0.5391331 0.6131297 -0.3721362 -0.5602741 0.6268091 -0.3867298 -0.5885048 0.6268091 -0.2231901 -0.612524 0.6131297 -0.2322998 -0.6365452 0.6268091 -0.2414096 -0.6248169 0.6268091 -0.0758664 -0.6503181 0.6131297 -0.07896298 -0.6758213 0.6268091 -0.08205956 -0.624815 0.6268091 0.07586634 -0.6503181 0.6131297 0.07896292 -0.6758213 0.6268091 0.0820595 -0.5885029 0.6268091 0.2231899 -0.612524 0.6131297 0.2322997 -0.6365452 0.6268091 0.2414095 -0.5179901 0.6268091 0.3575426 -0.5391312 0.6131297 0.3721361 -0.5602741 0.6268091 0.3867296 -0.4173717 0.6268091 0.4711161 -0.4344082 0.6131297 0.4903453 -0.4514427 0.6268091 0.5095744 -0.2924995 0.6268091 0.5573101 -0.3044376 0.6131297 0.5800574 -0.3163776 0.6268091 0.6028047 -0.1506271 0.6268091 0.6111153 -0.1567745 0.6131297 0.6360587 -0.1629238 0.6268091 0.6610021 0 0.6268091 0.6294046 0 0.6131297 0.6550945 0 0.6268091 0.6807844</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape9-positions-array" count="190" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape9-normals" name="qt_gauge_needles_8Shape9-normals">
+ <float_array id="qt_gauge_needles_8Shape9-normals-array" count="1158">0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0 0.9856135 -0.1690147 0 0.9881055 -0.1537774 0 0.9881055 -0.1537774 0 0.9856135 -0.1690147 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 0 0.9911104 -0.133042 0 0.9947922 -0.1019243 0 0.9947922 -0.1019243 0 0.9911104 -0.133042 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 0 0.9966713 -0.08152476 0 0.9995254 -0.03080725 0 0.9995254 -0.03080725 0 0.9966713 -0.08152476 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0.9843334 -0.1763172 0 0.9843333 -0.1763171 0 -0.9999999 0 0 -1 0 -1 0 0 -1 0 0 1 0 0 1 0 0 0 0.9996557 -0.02623569 0 0.9996557 -0.02623569 1 0 0 0.9999999 0 0 0 -1 0 0 -1 0 -1 0 0 -0.9999999 0 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0.1686022 0.7096909 0.684041 0.1685977 0.7096909 0.6840421 0 0.7096897 0.7045145 0 0.7096897 0.7045144 0.3274027 0.7096913 0.6238155 0.3274033 0.7096913 0.6238152 0.4671776 0.7096933 0.5273332 0.4671762 0.7096934 0.5273345 0.5798022 0.709692 0.4002084 0.5798022 0.709692 0.4002085 0.6587323 0.7096896 0.2498248 0.6587324 0.7096896 0.2498245 0.6993736 0.7096937 0.08491947 0.6993737 0.7096937 0.08491975 0.6993736 0.7096937 -0.08491955 0.6993735 0.7096937 -0.08491968 0.6587365 0.7096846 -0.2498277 0.6587366 0.7096846 -0.2498276 0.5798094 0.7096822 -0.4002152 0.5798108 0.7096822 -0.4002132 0.4671783 0.7096924 -0.5273341 0.4671768 0.7096924 -0.5273353 0.3274022 0.7096968 -0.6238095 0.327399 0.7096968 -0.6238111 0.168603 0.7096934 -0.6840383 0.1685986 0.7096934 -0.6840394 0 0.7096905 -0.7045136 0 0.7096905 -0.7045135 -0.1686014 0.7096892 -0.684043 -0.1686016 0.7096891 -0.6840429 -0.3274052 0.7096865 -0.6238197 -0.3274058 0.7096864 -0.6238194 -0.4671819 0.7096851 -0.5273405 -0.467183 0.7096851 -0.5273395 -0.5798055 0.7096873 -0.4002116 -0.5798053 0.7096873 -0.400212 -0.6587379 0.7096841 -0.2498257 -0.6587381 0.7096841 -0.2498252 -0.69939 0.7096775 -0.08492056 -0.69939 0.7096775 -0.0849201 -0.6993848 0.7096825 0.08492158 -0.6993847 0.7096825 0.08492127 -0.6587276 0.7096942 0.2498238 -0.6587272 0.7096943 0.2498253 -0.5798016 0.7096929 0.4002075 -0.5798014 0.7096929 0.4002078 -0.4671822 0.7096862 0.5273387 -0.4671837 0.7096863 0.5273376 -0.3274047 0.7096868 0.6238193 -0.3274054 0.7096868 0.6238191 -0.1686013 0.7096891 0.6840432 -0.1686014 0.709689 0.6840431 0.2393143 0 0.9709421 0.4647233 0 0.8854559 0.4647233 0 0.8854559 0.2393143 0 0.9709421 0.6631224 0 0.748511 0.6631224 0 0.748511 0.822985 0 0.568063 0.822985 0 0.568063 0.935016 0 0.3546054 0.935016 0 0.3546054 0.9927086 0 0.1205383 0.9927086 0 0.1205383 0.9927086 0 -0.1205384 0.9927086 0 -0.1205384 0.9350147 0 -0.354609 0.9350147 0 -0.354609 0.8229849 0 -0.5680631 0.8229849 0 -0.5680631 0.6631243 0 -0.7485093 0.6631243 0 -0.7485093 0.4647232 0 -0.8854559 0.4647232 0 -0.8854559 0.2393157 0 -0.9709418 0.2393157 0 -0.9709418 0 0 -1 0 0 -1 -0.2393159 0 -0.9709417 -0.2393159 0 -0.9709417 -0.4647234 0 -0.8854558 -0.4647234 0 -0.8854558 -0.6631223 0 -0.748511 -0.6631223 0 -0.748511 -0.8229831 0 -0.5680658 -0.8229831 0 -0.5680658 -0.9350172 0 -0.3546019 -0.9350172 0 -0.3546019 -0.9927092 0 -0.1205345 -0.9927092 0 -0.1205345 -0.992709 0 0.1205345 -0.992709 0 0.1205345 -0.9350159 0 0.3546056 -0.9350159 0 0.3546056 -0.822983 0 0.5680659 -0.822983 0 0.5680659 -0.6631241 0 0.7485093 -0.6631241 0 0.7485093 -0.4647231 0 0.8854561 -0.4647231 0 0.8854561 -0.2393155 0 0.9709418 -0.2393155 0 0.9709418 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0.1124796 0.8826634 0.4563479 0.1124782 0.8826635 0.4563482 0.2184235 0.8826618 0.4161722 0.2184246 0.8826617 0.4161717 -0.112476 0.8826663 -0.4563434 -0.1124792 0.8826663 -0.4563426 -0.2184196 0.8826687 -0.4161596 -0.2184171 0.8826687 -0.416161 0.3116728 0.8826617 0.3518071 0.3116742 0.8826617 0.3518058 -0.3116651 0.8826689 -0.3517962 -0.3116638 0.8826689 -0.3517973 0.3868092 0.8826623 0.2669944 0.3868087 0.8826622 0.266995 -0.3867993 0.8826686 -0.266988 -0.3867989 0.8826685 -0.2669886 0.4394718 0.8826581 0.1666706 0.4394722 0.8826582 0.1666697 -0.4394541 0.8826687 -0.1666614 -0.439454 0.8826687 -0.1666618 0.4665823 0.8826614 0.05665373 0.4665823 0.8826615 0.05665334 -0.4665755 0.882665 -0.05665362 -0.4665754 0.8826651 -0.05665394 0.466569 0.8826686 -0.05665142 0.4665689 0.8826687 -0.05665215 -0.4665815 0.8826619 0.05665316 -0.4665815 0.8826619 0.05665272 0.4394709 0.8826587 -0.1666697 0.4394714 0.8826587 -0.1666687 -0.4394588 0.8826653 0.1666669 -0.4394585 0.8826653 0.1666677 0.3868212 0.8826532 -0.2670071 0.3868237 0.8826531 -0.2670034 -0.3868001 0.8826683 0.2669878 -0.3867996 0.8826683 0.2669885 0.311675 0.882661 -0.3518071 0.3116737 0.882661 -0.3518083 -0.3116665 0.8826689 0.3517949 -0.3116654 0.8826689 0.3517958 0.2184205 0.8826652 -0.4161666 0.2184217 0.8826652 -0.416166 -0.2184203 0.8826672 0.4161623 -0.2184177 0.8826672 0.4161637 0.112481 0.8826648 -0.456345 0.1124779 0.8826648 -0.4563457 -0.1124782 0.8826646 0.4563462 -0.1124796 0.8826646 0.4563459 0 0.8826648 -0.4700029 0 0.8826649 -0.470003 0 0.8826644 0.4700036 0 0.8826644 0.4700037 -0.1124783 0.8826641 -0.4563469 -0.1124798 0.8826642 -0.4563466 0.1124805 0.8826649 0.4563451 0.1124775 0.8826649 0.4563459 -0.2184233 0.8826618 -0.4161723 -0.2184244 0.8826618 -0.4161717 0.2184208 0.8826647 0.4161672 0.218422 0.8826649 0.4161666 -0.3116727 0.8826619 -0.351807 -0.3116741 0.8826618 -0.3518057 0.3116713 0.8826635 0.351804 0.31167 0.8826635 0.3518052 -0.386809 0.8826624 -0.2669942 -0.3868085 0.8826624 -0.266995 0.3868081 0.8826622 0.2669962 0.3868092 0.8826622 0.2669946 -0.439472 0.8826581 -0.1666707 -0.4394723 0.882658 -0.1666698 0.4394592 0.8826656 0.1666644 0.439459 0.8826656 0.1666649 -0.4665894 0.8826578 -0.05665334 -0.4665895 0.8826578 -0.05665275 0.4665685 0.882669 0.05665139 0.4665684 0.882669 0.05665153 -0.4665755 0.882665 0.05665421 -0.4665755 0.882665 0.05665456 0.4665687 0.8826688 -0.0566516 0.4665687 0.8826688 -0.05665174 -0.4394593 0.8826654 0.1666649 -0.4394591 0.8826655 0.1666654 0.4394534 0.8826686 -0.1666637 0.4394531 0.8826686 -0.1666644 -0.386808 0.8826626 0.266995 -0.386809 0.8826625 0.2669935 0.3868038 0.8826656 -0.2669912 0.3868033 0.8826656 -0.266992 -0.3116719 0.882664 0.3518026 -0.3116707 0.8826639 0.3518036 0.3116713 0.8826637 -0.3518035 0.3116729 0.8826637 -0.3518021 -0.2184221 0.8826637 0.416169 -0.2184234 0.8826637 0.4161683 0.218422 0.8826662 -0.4161635 0.2184196 0.8826662 -0.4161648 -0.1124789 0.8826635 0.4563482 -0.1124803 0.8826635 0.4563478 0.1124798 0.8826663 -0.4563425 0.1124768 0.8826663 -0.4563432 0 0.8826642 0.4700041 0 0.8826643 0.4700041 0 0.8826648 -0.4700031 0 0.8826647 -0.4700031</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape9-normals-array" count="386" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape9-tangents" name="qt_gauge_needles_8Shape9-tangents">
+ <float_array id="qt_gauge_needles_8Shape9-tangents-array" count="1158">0.9999999 0 0 0 1 0 -0.9999999 0 0 0 -1 0 -1 0 0 0 1 0 1 0 0 0 -1 0 0 -0.003987932 -0.999992 0 -0.9869014 0.1613248 0 -0.01292218 0.9999164 0 1 0 0 0.1690147 0.9856135 0.9999999 0 0 0 -0.1537774 -0.9881055 -1 0 0 0 -0.01292218 0.9999164 0 -0.9869014 0.1613249 0 -0.003987932 -0.999992 0 1 0 0 0 1 -1 0 0 0 0 -1 1 0 0 0 -2.26636e-4 -0.9999999 0 -0.9928231 0.1195931 0 -0.005168526 0.9999866 0 1 0 0 0.1330419 0.9911103 1 0 0 0 -0.1019243 -0.9947921 -1 0 0 0 -0.005168526 0.9999866 0 -0.992823 0.1195931 0 -2.26636e-4 -1 0 1 0 0 0 1 -1 0 0 0 0 -1 1 0 0 0 5.3957e-4 -0.9999998 0 -0.9982252 0.05955299 0 -0.001496468 0.9999989 0 1 0 0 0.08152476 0.9966714 1 0 0 0 -0.03080725 -0.9995254 -1 0 0 0 -0.001496469 0.9999989 0 -0.9982251 0.05955299 0 5.3957e-4 -0.9999999 0 1 0 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0.1763172 0.9843335 -1 0 0 1 0 0 0 0 1 0 0 1 0 -0.9843335 0.1763172 0 1 0 0 0 1 1 0 0 0 -0.02623569 -0.9996557 0 0 -0.9999999 0 -0.9996558 0.02623569 -0.9999999 0 0 0 0 -1 0 0.9999999 0 0 0 -1 -0.885456 0 0.4647233 -0.3546064 0 -0.9350157 0.9709415 0 -0.2393167 -0.7485103 0 0.6631231 -0.5680647 0 0.822984 -0.354605 0 0.9350163 -0.1205366 0 0.9927089 0.1205366 0 0.9927089 0.3546049 0 0.9350163 0.5680655 0 0.8229834 0.7485102 0 0.6631233 0.885456 0 0.4647234 0.9709416 0 0.2393168 1 0 0 0.970942 0 -0.239315 0.8854559 0 -0.4647234 0.7485111 0 -0.6631224 0.5680645 0 -0.8229841 0.3546048 0 -0.9350163 0.1205368 0 -0.9927089 -0.1205368 0 -0.9927089 -0.3546048 0 -0.9350163 -0.5680653 0 -0.8229835 -0.748511 0 -0.6631224 -0.8854558 0 -0.4647235 -0.9709421 0 -0.2393151 -1 0 0 -0.08585149 0.7019117 -0.707071 -0.9709353 0 0.239342 0.0858519 -0.7019132 0.7070694 1 0 0 -0.2525733 0.7019117 -0.665978 -0.8854581 0 0.4647191 -0.4046121 0.7019093 -0.5861847 -0.748503 0 0.6631316 -0.5331389 0.7019109 -0.4723177 -0.5680637 0 0.8229845 -0.6306776 0.7019134 -0.3310036 -0.354607 0 0.9350153 -0.691569 0.7019089 -0.1704588 -0.1205354 0 0.992709 -0.7122666 0.7019091 0 0.1205363 0 0.9927089 -0.69156 0.7019184 0.1704567 0.354608 0 0.9350151 -0.6306687 0.7019208 0.3310046 0.5680772 0 0.8229753 -0.5331421 0.7019101 0.4723152 0.7485025 0 0.663132 -0.4046138 0.7019061 0.5861871 0.885446 0 0.4647423 -0.252574 0.7019095 0.66598 0.9709351 0 0.2393431 -0.08585367 0.7019123 0.7070701 1 0 0 0.0858542 0.7019137 0.7070688 0.9709421 0 -0.2393145 0.2525698 0.7019164 0.6659744 0.885458 0 -0.4647192 0.40461 0.7019178 0.5861758 0.7485169 0 -0.6631157 0.5331326 0.7019154 0.4723181 0.5680631 0 -0.822985 0.6306728 0.7019188 0.3310012 0.3546062 0 -0.9350159 0.6915543 0.7019257 0.1704497 0.1205381 0 -0.9927087 0.7122554 0.7019204 0 -0.1205393 0 -0.9927085 0.6915708 0.7019082 -0.1704538 -0.3545983 0 -0.9350188 0.630678 0.7019101 -0.3310096 -0.568063 0 -0.8229852 0.5331344 0.7019166 -0.4723142 -0.7485165 0 -0.6631162 0.4046109 0.7019159 -0.5861776 -0.8854584 0 -0.4647187 0.2525706 0.7019139 -0.6659768 -0.9709421 0 -0.2393144 0.9709421 0 -0.2393143 0 1 0 -0.8854559 0 0.4647233 0 -0.9999999 0 0 1 0 -0.748511 0 0.6631225 0 1 0 -0.568063 0 0.8229851 0 1 0 -0.3546054 0 0.9350161 0 1 0 -0.1205383 0 0.9927087 0 1 0 0.1205384 0 0.9927087 0 1 0 0.354609 0 0.9350147 0 1 0 0.5680631 0 0.822985 0 1 0 0.7485093 0 0.6631243 0 1 0 0.885456 0 0.4647232 0 1 0 0.9709418 0 0.2393157 0 1 0 1 0 0 0 1 0 0.9709418 0 -0.2393159 0 1 0 0.8854559 0 -0.4647234 0 1 0 0.748511 0 -0.6631223 0 1 0 0.5680658 0 -0.8229831 0 1 0 0.354602 0 -0.9350173 0 1 0 0.1205345 0 -0.9927092 0 1 0 -0.1205345 0 -0.9927092 0 1 0 -0.3546056 0 -0.935016 0 1 0 -0.5680659 0 -0.822983 0 1 0 -0.7485095 0 -0.6631241 0 1 0 -0.8854561 0 -0.4647231 0 1 0 -0.9709418 0 -0.2393155 0 1 0 -1 0 0 0.9709416 0 -0.2393166 -0.3546053 0 -0.9350161 -0.8854557 0 0.4647236 -0.5680631 0 -0.822985 -0.7485143 0 -0.6631188 -0.8854536 0 -0.4647279 -0.9709418 0 -0.2393161 -1 0 0 -0.9709446 0 0.2393042 -0.8854585 0 0.4647182 -0.7485015 0 0.6631331 -0.568069 0 0.8229809 -0.3546011 0 0.9350176 -0.1205389 0 0.9927086 0.1205348 0 0.9927091 0.3546049 0 0.9350162 0.5680633 0 0.8229849 0.7485141 0 0.6631188 0.8854535 0 0.4647281 0.9709418 0 0.2393162 1 0 0 0.9709417 0 -0.2393163 0.8854586 0 -0.4647183 0.7485075 0 -0.6631264 0.5680688 0 -0.822981 0.3546053 0 -0.9350161 0.1205359 0 -0.992709 0.9709435 0 -0.239309 -0.3546031 0 -0.9350169 -0.885457 0 0.4647213 0.3546053 0 0.9350161 -0.568066 0 -0.822983 -0.748512 0 0.6631212 -0.7485107 0 -0.6631228 -0.5680663 0 0.8229828 -0.8854557 0 -0.4647239 -0.354605 0 0.9350162 -0.9709421 0 -0.2393145 -0.1205367 0 0.9927088 -0.9999999 0 0 0.1205365 0 0.9927089 -0.9709421 0 0.2393145 0.3546048 0 0.9350163 -0.8854557 0 0.4647239 0.5680632 0 0.8229851 -0.7485104 0 0.663123 0.748512 0 0.6631213 -0.5680619 0 0.8229859 0.8854596 0 0.4647164 -0.3546058 0 0.9350159 0.9709419 0 0.2393154 -0.1205369 0 0.9927089 1 0 0 0.1205371 0 0.9927089 0.9709435 0 -0.2393091 0.3546028 0 0.935017 0.8854541 0 -0.4647267 0.5680658 0 0.822983 0.748512 0 -0.6631213 0.7485104 0 0.663123 0.5680632 0 -0.8229849 0.8854557 0 0.4647238 0.3546047 0 -0.9350163 0.9709421 0 0.2393146 0.1205365 0 -0.9927089 1 0 0 -0.1205367 0 -0.9927089 0.9709402 0 -0.2393223 -0.354607 0 -0.9350154 0.8854556 0 -0.464724 -0.5680662 0 -0.8229828 0.7485144 0 -0.6631185 -0.7485088 0 -0.6631249 0.5680655 0 -0.8229833 -0.8854569 0 -0.4647216 0.3546028 0 -0.935017 -0.9709434 0 -0.2393092 0.1205371 0 -0.9927089 -1 0 0 0.3135006 -0.467329 0.8266323 0.9709463 0 -0.2392974 -0.3135 0.4673325 -0.8266306 -0.8854632 0 0.4647093 0.3135017 0.4673236 0.826635 0.9709326 0 -0.239353 -0.3135026 -0.4673193 -0.8266371 -0.8854399 0 0.464754 -0.5022155 0.4673325 -0.7275849 -0.7485251 0 0.6631064 -0.5022205 -0.4673192 -0.7275901 -0.7484983 0 0.6631367 -0.6617435 0.4673313 -0.5862567 -0.5680556 0 0.8229902 -0.661749 -0.4673197 -0.5862597 -0.5680569 0 0.8229892 -0.7828142 0.4673395 -0.4108476 -0.3546165 0 0.9350119 -0.7828233 -0.4673194 -0.4108531 -0.3545985 0 0.9350187 -0.8583916 0.467333 -0.2115743 -0.1205417 0 0.9927083 -0.8583952 -0.4673264 -0.2115746 -0.1205354 0 0.992709 -0.8840888 0.4673189 0 0.120528 0 0.9927099 -0.8840818 -0.4673321 0 0.1205415 0 0.9927083 -0.8583863 0.4673386 0.2115836 0.354617 0 0.9350116 -0.8583956 -0.4673255 0.2115747 0.3545994 0 0.9350183 -0.7828055 0.4673486 0.4108539 0.5681096 0 0.8229527 -0.7828184 -0.4673207 0.410861 0.5680562 0 0.8229898 -0.6617477 0.4673337 0.5862501 0.7484975 0 0.6631377 -0.6617542 -0.467319 0.5862545 0.7484971 0 0.6631379 -0.5022174 0.467326 0.7275879 0.8854633 0 0.4647093 -0.5022196 -0.4673222 0.7275888 0.8854401 0 0.4647537 -0.3135011 0.4673268 0.8266335 0.9709328 0 0.2393521 -0.3134977 -0.4673272 0.8266345 0.9709461 0 0.2392983 -0.1065643 0.4673264 0.8776389 1 0 0 -0.1065646 -0.4673273 0.8776383 1 0 0 0.1065646 0.4673279 0.877638 0.9709461 0 -0.2392983 0.1065638 -0.4673264 0.8776389 0.9709328 0 -0.2393519 0.3134997 0.4673324 0.8266308 0.8854633 0 -0.4647092 0.3135042 -0.4673269 0.8266321 0.8854634 0 -0.4647093 0.5022154 0.4673323 0.7275851 0.7485259 0 -0.6631055 0.502213 -0.4673288 0.7275891 0.7484974 0 -0.6631379 0.6617437 0.4673311 0.5862567 0.5680556 0 -0.8229901 0.6617491 -0.4673321 0.5862498 0.5680836 0 -0.8229709 0.7828141 0.4673397 0.4108477 0.3546165 0 -0.9350118 0.7828164 -0.4673249 0.4108599 0.354599 0 -0.9350185 0.8583881 0.4673398 0.2115736 0.120541 0 -0.9927083 0.8583989 -0.4673189 0.2115756 0.1205347 0 -0.992709 0.8840849 0.4673261 0 -0.1205357 0 -0.992709 0.8840886 -0.4673193 0 -0.1205348 0 -0.992709 0.8583955 0.4673255 -0.2115754 -0.3545984 0 -0.9350187 0.8583987 -0.4673194 -0.2115756 -0.3545989 0 -0.9350185 0.7828136 0.4673311 -0.4108582 -0.5680827 0 -0.8229715 0.7828161 -0.4673256 -0.4108598 -0.5680565 0 -0.8229896 0.6617497 0.4673283 -0.5862523 -0.7484971 0 -0.663138 0.6617449 -0.4673288 -0.5862571 -0.7485251 0 -0.6631066 0.5022164 0.4673289 -0.7275867 -0.8854632 0 -0.4647095 0.5022239 -0.4673239 -0.7275848 -0.8854398 0 -0.4647541 0.3135007 0.4673291 -0.8266323 -0.9709461 0 -0.2392984 0.3135016 -0.467324 -0.8266347 -0.9709329 0 -0.2393519 0.1065642 0.4673278 -0.8776381 -1 0 0 0.1065634 -0.4673269 -0.8776388 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape9-tangents-array" count="386" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape9-binormals" name="qt_gauge_needles_8Shape9-binormals">
+ <float_array id="qt_gauge_needles_8Shape9-binormals-array" count="1158">0 1 0 -1 0 0 0 -1 0 1 0 0 0 1 0 1 0 0 0 -1 0 -1 0 0 0 -0.9999921 0.003987933 0 0.1613248 0.9869014 0 0.9999165 0.01292218 0 0 -1 1 0 0 0 -0.1537774 -0.9881055 -1 0 0 0 0.1690147 0.9856136 0 -0.9999165 -0.01292218 0 -0.1613249 -0.9869014 0 0.9999921 -0.003987933 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0 1 0 -1 2.26636e-4 0 0.1195931 0.992823 0 0.9999866 0.005168526 0 0 -1 1 0 0 0 -0.1019243 -0.9947922 -1 0 0 0 0.133042 0.9911104 0 -0.9999866 -0.005168526 0 -0.1195931 -0.992823 0 1 -2.26636e-4 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0 1 0 -0.9999999 -5.3957e-4 0 0.059553 0.9982252 0 0.9999989 0.001496468 0 0 -1 1 0 0 0 -0.03080725 -0.9995254 -1 0 0 0 0.08152476 0.9966713 0 -0.9999989 -0.001496469 0 -0.059553 -0.9982252 0 0.9999999 5.3957e-4 0 0 1 -1 0 0 0 0 -1 1 0 0 0 0 1 1 0 0 0 0.1763172 0.9843335 0 0 1 -1 0 0 0 1 0 0 0.1763172 0.9843335 0 0 1 0 -1 0 0 -0.0262357 -0.9996558 -1 0 0 0 1 0 0 -0.02623569 -0.9996558 0 0 -1 1 0 0 0 0 -1 0 -1 0 -0.4647233 0 -0.885456 0.9350157 0 -0.3546064 0.2393167 0 0.9709415 -0.6631231 0 -0.7485103 -0.822984 0 -0.5680647 -0.9350163 0 -0.354605 -0.9927089 0 -0.1205366 -0.9927089 0 0.1205366 -0.9350162 0 0.3546049 -0.8229834 0 0.5680655 -0.6631233 0 0.7485102 -0.4647234 0 0.885456 -0.2393168 0 0.9709416 0 0 1 0.239315 0 0.970942 0.4647234 0 0.8854559 0.6631223 0 0.7485111 0.8229841 0 0.5680645 0.9350163 0 0.3546048 0.9927089 0 0.1205368 0.9927089 0 -0.1205368 0.9350163 0 -0.3546048 0.8229836 0 -0.5680653 0.6631224 0 -0.748511 0.4647235 0 -0.8854558 0.2393151 0 -0.970942 0 0 -1 -0.9819384 0.06048777 0.1792719 0.1698806 -0.7045131 0.6890587 0.996308 0.06048466 -0.06092746 0 0.7045144 -0.7096897 -0.9105022 0.06048386 0.4090569 0.3298045 -0.7045128 0.6284034 -0.7861515 0.06048696 0.6150668 0.470627 -0.7045107 0.5312014 -0.6161107 0.06048417 0.7853339 0.584066 -0.7045122 0.4031496 -0.4102651 0.06048386 0.9099584 0.6635702 -0.7045145 0.2516622 -0.1805793 0.06048675 0.9816989 0.7045196 -0.7045104 0.08554193 0.0596058 0.06048536 0.9963878 0.7045194 -0.7045103 -0.0855433 0.2963291 0.06048486 0.9531687 0.6635656 -0.7045196 -0.2516604 0.5158275 0.06048361 0.8545547 0.5840443 -0.704522 -0.4031639 0.7053397 0.0604886 0.706284 0.4706271 -0.7045116 -0.5312 0.8538709 0.06048297 0.5169588 0.3298413 -0.7045073 -0.6283902 0.9527746 0.06048403 0.2975941 0.1698812 -0.7045107 -0.689061 0.9963077 0.06048513 0.06092949 0 -0.7045136 -0.7096905 0.9819382 0.06048484 -0.1792735 -0.169838 -0.7045149 -0.6890674 0.9105023 0.06048545 -0.4090565 -0.3298022 -0.7045178 -0.6283991 0.78615 0.06048346 -0.6150691 -0.4705981 -0.704519 -0.5312161 0.6161129 0.06048676 -0.785332 -0.5840635 -0.7045168 -0.4031451 0.4102637 0.06048478 -0.909959 -0.6635651 -0.70452 -0.2516602 0.1805722 0.0604836 -0.9817003 -0.7045028 -0.7045267 -0.08554531 -0.05960819 0.06048586 -0.9963877 -0.7045079 -0.7045217 0.08554593 -0.2963234 0.06048828 -0.9531703 -0.6635802 -0.7045099 0.2516491 -0.5158249 0.06048218 -0.8545564 -0.5840675 -0.7045112 0.4031492 -0.7053428 0.06048562 -0.7062812 -0.470598 -0.7045179 0.5312175 -0.8538713 0.06048681 -0.5169576 -0.3298018 -0.7045172 0.6283997 -0.9527758 0.06048463 -0.2975901 -0.1698379 -0.704515 0.6890672 0 1 0 -0.885456 0 0.4647233 0 -1 0 0.9709423 0 -0.2393143 -0.748511 0 0.6631224 0 -1 0 -0.568063 0 0.8229851 0 -1 0 -0.3546054 0 0.9350161 0 -1 0 -0.1205383 0 0.9927087 0 -1 0 0.1205384 0 0.9927087 0 -1 0 0.354609 0 0.9350147 0 -1 0 0.5680631 0 0.8229851 0 -1 0 0.7485093 0 0.6631243 0 -1 0 0.885456 0 0.4647233 0 -1 0 0.9709419 0 0.2393157 0 -1 0 1 0 0 0 -1 0 0.9709418 0 -0.2393159 0 -1 0 0.885456 0 -0.4647234 0 -1 0 0.7485111 0 -0.6631224 0 -1 0 0.5680658 0 -0.8229832 0 -1 0 0.3546019 0 -0.9350173 0 -1 0 0.1205345 0 -0.9927092 0 -1 0 -0.1205345 0 -0.9927092 0 -1 0 -0.3546056 0 -0.935016 0 -1 0 -0.5680659 0 -0.8229831 0 -1 0 -0.7485094 0 -0.6631241 0 -1 0 -0.8854561 0 -0.4647231 0 -1 0 -0.9709419 0 -0.2393155 0 -1 0 -1 0 0 0 -1 0 -0.2393166 0 -0.9709416 -0.9350161 0 0.3546053 0.4647237 0 0.8854558 -0.822985 0 0.5680631 -0.6631188 0 0.7485143 -0.4647279 0 0.8854536 -0.2393161 0 0.9709418 0 0 1 0.2393042 0 0.9709447 0.4647183 0 0.8854586 0.6631331 0 0.7485015 0.8229809 0 0.568069 0.9350178 0 0.3546011 0.9927086 0 0.1205389 0.9927092 0 -0.1205348 0.9350163 0 -0.354605 0.822985 0 -0.5680633 0.6631188 0 -0.7485141 0.4647281 0 -0.8854535 0.2393162 0 -0.9709418 0 0 -1 -0.2393163 0 -0.9709417 -0.4647183 0 -0.8854586 -0.6631264 0 -0.7485075 -0.8229811 0 -0.5680689 -0.9350161 0 -0.3546053 -0.992709 0 -0.1205359 -0.239309 0 -0.9709435 -0.935017 0 0.3546031 0.4647213 0 0.885457 0.9350161 0 -0.3546053 -0.822983 0 0.568066 0.6631212 0 0.7485121 -0.6631228 0 0.7485107 0.8229828 0 0.5680663 -0.4647239 0 0.8854557 0.9350163 0 0.354605 -0.2393145 0 0.9709422 0.9927089 0 0.1205367 0 0 1 0.992709 0 -0.1205365 0.2393145 0 0.9709422 0.9350163 0 -0.3546048 0.4647239 0 0.8854557 0.8229849 0 -0.5680631 0.663123 0 0.7485104 0.6631213 0 -0.748512 0.8229859 0 0.5680619 0.4647164 0 -0.8854596 0.9350159 0 0.3546058 0.2393154 0 -0.970942 0.9927089 0 0.1205369 0 0 -1 0.9927089 0 -0.1205371 -0.2393092 0 -0.9709435 0.9350171 0 -0.3546028 -0.4647268 0 -0.8854542 0.8229831 0 -0.5680659 -0.6631213 0 -0.748512 0.663123 0 -0.7485104 -0.8229849 0 -0.5680632 0.4647238 0 -0.8854557 -0.9350164 0 -0.3546047 0.2393146 0 -0.9709421 -0.9927089 0 -0.1205365 0 0 -1 -0.9927089 0 0.1205367 -0.2393223 0 -0.9709402 -0.9350154 0 0.354607 -0.464724 0 -0.8854556 -0.8229828 0 0.5680662 -0.6631185 0 -0.7485144 -0.6631249 0 0.7485088 -0.8229833 0 -0.5680655 -0.4647216 0 0.8854569 -0.9350171 0 -0.3546028 -0.2393092 0 0.9709434 -0.9927089 0 -0.1205371 0 0 1 0.9429029 0.05008611 -0.3292806 -0.2112153 0.4700054 -0.85702 -0.924126 0.0500855 0.3787909 0.4101773 -0.4700087 0.7815666 0.9429029 -0.05008777 -0.3292801 -0.2112778 -0.4700001 -0.8570073 -0.9241261 -0.05008666 0.3787906 0.4102319 0.4699957 0.7815458 -0.8066223 0.05008545 0.5889413 0.5852942 -0.4700087 0.6606985 -0.8066223 -0.05008514 0.5889415 0.5853341 0.4699954 0.6606727 -0.6422415 0.05008771 0.7648641 0.726424 -0.4700078 0.5013989 -0.6422418 -0.0500858 0.764864 0.7264282 0.4699962 0.5014039 -0.4405297 0.05008385 0.8963399 0.8252947 -0.4700156 0.3130081 -0.4405313 -0.05008462 0.8963391 0.8253121 0.4699957 0.3129919 -0.2132247 0.05008576 0.9757186 0.8762253 -0.4700093 0.1063988 -0.2132253 -0.05008433 0.9757186 0.8762298 0.4700025 0.1063914 0.02646486 0.05008988 0.9983941 0.8762342 -0.4699958 -0.1063839 0.02647584 -0.05008604 0.998394 0.8762258 0.4700084 -0.1063988 0.2646473 0.05008215 0.9630439 0.825295 -0.4700145 -0.3130092 0.2646373 -0.05008774 0.9630465 0.8253095 0.4700021 -0.3129898 0.4874269 0.05008766 0.8717261 0.7263737 -0.4700249 -0.5014556 0.4874228 -0.05008194 0.8717287 0.7264284 0.4699965 -0.501403 0.6818714 0.05008802 0.7297552 0.5853299 -0.4700102 -0.6606659 0.681869 -0.05008589 0.7297575 0.5853346 0.4699953 -0.6606722 0.836702 0.05008601 0.5453634 0.4101789 -0.4700023 -0.7815697 0.8367008 -0.05008467 0.5453655 0.4102312 0.4699984 -0.7815445 0.9429025 0.0500841 0.3292818 0.2112774 -0.4700029 -0.857006 0.942904 -0.05008514 0.3292774 0.2112156 0.4700035 -0.8570209 0.9943058 0.05008798 0.09405931 0 -0.470003 -0.8826649 0.9943058 -0.05008578 0.09406079 0 0.4700037 -0.8826644 0.9879234 0.05008487 -0.146625 -0.2112155 -0.4700041 -0.8570205 0.9879233 -0.0500874 -0.1466252 -0.2112774 0.4700029 -0.857006 0.9241262 0.0500855 -0.3787905 -0.4101774 -0.4700086 -0.7815667 0.9241253 -0.05008345 -0.3787931 -0.4101787 0.4700029 -0.7815693 0.8066224 0.05008553 -0.5889412 -0.5852932 -0.4700086 -0.6606994 0.8066245 -0.05008806 -0.5889381 -0.5853321 0.4700053 -0.6606674 0.6422415 0.05008762 -0.7648642 -0.7264241 -0.4700076 -0.5013989 0.6422365 -0.05008165 -0.7648688 -0.7264019 0.470008 -0.5014308 0.4405299 0.05008387 -0.8963398 -0.8252946 -0.4700157 -0.3130081 0.4405383 -0.05008852 -0.8963354 -0.8253093 0.4700016 -0.3129908 0.2132234 0.05008743 -0.9757187 -0.8762216 -0.4700163 -0.1063983 0.2132255 -0.05008502 -0.9757184 -0.8762336 0.4699953 -0.1063918 -0.026476 0.05008714 -0.9983939 -0.8762298 -0.4700027 0.1063914 -0.02647438 -0.05008503 -0.998394 -0.8762335 0.4699956 0.1063918 -0.2646371 0.05008557 -0.9630466 -0.8253095 -0.4700018 0.3129898 -0.2646364 -0.05008625 -0.9630468 -0.8253125 0.4699959 0.312991 -0.4874243 0.0500841 -0.8717277 -0.7264027 -0.4700072 0.5014303 -0.4874237 -0.05008283 -0.8717282 -0.7264263 0.4700016 0.5014014 -0.6818711 0.05008686 -0.7297556 -0.5853319 -0.4700047 0.6606681 -0.6818758 -0.05008463 -0.7297513 -0.585295 0.470005 0.6607004 -0.8367022 0.05008587 -0.5453631 -0.4101782 -0.4700052 0.7815684 -0.8366978 -0.05008676 -0.5453699 -0.4102308 0.4700004 0.7815437 -0.9429029 0.0500868 -0.3292803 -0.2112153 -0.4700055 0.8570199 -0.9429024 -0.05008438 -0.3292819 -0.2112778 0.4700001 0.8570073 -0.9943058 0.05008503 -0.09406076 0 -0.4700041 0.8826643 -0.994306 -0.05008457 -0.09406008 0 0.4700032 0.8826649</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape9-binormals-array" count="386" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape9-map1" name="qt_gauge_needles_8Shape9-map1">
+ <float_array id="qt_gauge_needles_8Shape9-map1-array" count="542">0.5255726 0 0 0 0.07852725 1 0 1 0.07818751 0 0 0 0.07852725 0 0.07818769 1 0 1 0.1533914 0 0.2291749 1 0.2289179 1 0.1533914 1 0.1535451 1 0.2289179 0 0.1535451 0 0.2291749 0 0.3042622 0 0.4503523 1 0.450244 1 0.3042622 1 0.3042755 1 0.450244 0 0.3042755 0 0.4503524 0 0.5256431 0 1 1 1 1 0.5256431 1 0.5256017 1 1 0 0.5256017 0 1 0 0.6383526 0.08363697 0.6517098 0.1188569 0.5 0.15 0.6169549 0.05263703 0.5887602 0.0276587 0.555407 0.01015362 0.5188339 0.001139149 0.4811661 0.001139149 0.444593 0.01015362 0.4112398 0.0276587 0.3830451 0.05263703 0.3616474 0.08363696 0.3482903 0.1188569 0.3437499 0.15625 0.3482903 0.1936431 0.3616475 0.228863 0.3830452 0.2598629 0.4112399 0.2848412 0.444593 0.3023463 0.4811661 0.3113608 0.5188339 0.3113608 0.555407 0.3023463 0.5887601 0.2848412 0.6169548 0.2598629 0.6383525 0.228863 0.6517097 0.1936431 0.65625 0.15625 0.6249998 0.6703221 0.6248534 0.6884398 0.6155307 0.6884398 0.6153844 0.6703221 0.3751463 0.6884398 0.375 0.6703221 0.3846154 0.6703221 0.3844691 0.6884398 0.3847617 0.6884398 0.3942308 0.6703221 0.3940845 0.6884398 0.3943771 0.6884398 0.4038462 0.6703221 0.4036999 0.6884398 0.4039925 0.6884398 0.4134616 0.6703221 0.4133153 0.6884398 0.4136079 0.6884398 0.423077 0.6703221 0.4229306 0.6884398 0.4232233 0.6884398 0.4326923 0.6703221 0.432546 0.6884399 0.4328386 0.6884398 0.4423077 0.6703221 0.4421615 0.6884398 0.442454 0.6884398 0.4519231 0.6703221 0.4517768 0.6884398 0.4520694 0.6884398 0.4615385 0.6703221 0.4613923 0.6884398 0.4616848 0.6884398 0.4711539 0.6703221 0.4710076 0.6884398 0.4713002 0.6884398 0.4807693 0.6703221 0.480623 0.6884398 0.4809156 0.6884398 0.4903847 0.6703221 0.4902384 0.6884398 0.490531 0.6884398 0.5000001 0.6703221 0.4998538 0.6884398 0.5001463 0.6884398 0.5096154 0.6703221 0.5094692 0.6884398 0.5097617 0.6884398 0.5192308 0.6703221 0.5190845 0.6884398 0.5193771 0.6884398 0.5288461 0.6703221 0.5286999 0.6884399 0.5289924 0.6884398 0.5384615 0.6703221 0.5383152 0.6884398 0.5386078 0.6884398 0.5480769 0.6703221 0.5479306 0.6884398 0.5482231 0.6884398 0.5576922 0.6703221 0.5575459 0.6884398 0.5578385 0.6884398 0.5673076 0.6703221 0.5671613 0.6884398 0.5674539 0.6884398 0.576923 0.6703221 0.5767766 0.6884398 0.5770692 0.6884398 0.5865383 0.6703221 0.586392 0.6884398 0.5866846 0.6884398 0.5961537 0.6703221 0.5960073 0.6884398 0.5962999 0.6884398 0.605769 0.6703221 0.6056228 0.6884398 0.6059153 0.6884398 0.6152381 0.6884398 0.375 0.3125 0.3846154 0.3125 0.3942308 0.3125 0.4038462 0.3125 0.4134616 0.3125 0.423077 0.3125 0.4326923 0.3125 0.4423077 0.3125 0.4519231 0.3125 0.4615385 0.3125 0.4711539 0.3125 0.4807693 0.3125 0.4903847 0.3125 0.5000001 0.3125 0.5096154 0.3125 0.5192308 0.3125 0.5288461 0.3125 0.5384615 0.3125 0.5480769 0.3125 0.5576922 0.3125 0.5673076 0.3125 0.576923 0.3125 0.5865383 0.3125 0.5961537 0.3125 0.605769 0.3125 0.6153844 0.3125 0.6249998 0.3125 0.6457604 0.8794317 0.6329269 0.9132703 0.5 0.8375 0.6123683 0.9430544 0.5852793 0.9670532 0.5532341 0.9838719 0.5180953 0.9925328 0.4819048 0.9925328 0.4467659 0.9838719 0.4147206 0.9670535 0.3876315 0.9430547 0.3670733 0.9132702 0.3542398 0.8794316 0.3498772 0.8435049 0.3542397 0.8075782 0.3670729 0.7737394 0.3876316 0.7439553 0.4147208 0.7199566 0.4467658 0.7031379 0.4819047 0.6944767 0.5180953 0.6944767 0.5532342 0.7031379 0.5852793 0.7199565 0.6123685 0.7439551 0.6329269 0.7737395 0.6457605 0.8075782 0.6501225 0.8435049 0.6517097 0.8811431 0.6383525 0.916363 0.6383525 0.916363 0.6517097 0.8811431 0.6169548 0.9473629 0.6169548 0.9473629 0.5887601 0.9723412 0.5887601 0.9723413 0.555407 0.9898463 0.555407 0.9898463 0.5188339 0.9988608 0.5188339 0.9988608 0.4811661 0.9988608 0.4811661 0.9988607 0.444593 0.9898463 0.444593 0.9898463 0.4112399 0.9723412 0.4112399 0.9723413 0.3830452 0.9473629 0.3830452 0.9473629 0.3616475 0.916363 0.3616475 0.916363 0.3482903 0.8811431 0.3482903 0.8811431 0.3437499 0.84375 0.3437499 0.84375 0.3482903 0.8063569 0.3482902 0.8063569 0.3616474 0.7711369 0.3616474 0.7711369 0.3830451 0.740137 0.3830451 0.740137 0.4112398 0.7151587 0.4112398 0.7151587 0.444593 0.6976537 0.444593 0.6976537 0.4811661 0.6886392 0.4811661 0.6886392 0.5188339 0.6886392 0.5188339 0.6886392 0.555407 0.6976537 0.555407 0.6976536 0.5887602 0.7151587 0.5887603 0.7151587 0.6169549 0.740137 0.6169549 0.740137 0.6383526 0.771137 0.6383526 0.7711369 0.6517098 0.8063569 0.6517098 0.8063569 0.65625 0.84375 0.65625 0.84375 0.6517097 0.8811431 0.6383525 0.916363 0.6169548 0.9473629 0.5887601 0.9723412 0.555407 0.9898463 0.5188339 0.9988608 0.4811661 0.9988608 0.444593 0.9898463 0.4112399 0.9723412 0.3830452 0.9473629 0.3616475 0.916363 0.3482903 0.8811431 0.3437499 0.84375 0.3482903 0.8063569 0.3616474 0.7711369 0.3830451 0.740137 0.4112398 0.7151587 0.444593 0.6976537 0.4811661 0.6886392 0.5188339 0.6886392 0.555407 0.6976537 0.5887602 0.7151587 0.6169549 0.740137 0.6383526 0.771137 0.6517098 0.8063569 0.65625 0.84375</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape9-map1-array" count="271" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape9-textangents">
+ <float_array id="qt_gauge_needles_8Shape9-textangents-array" count="2388">0.9999999 0 0 -0.0976349 0.9952222 0 -0.9999999 0 0 0.0976349 -0.9952222 0 -0.9999999 0 0 0.4645241 0.8855605 0 0.9999999 0 0 -0.4645241 -0.8855605 0 0 -0.4544658 0.8907641 0 0 0 0 0 0 0 0 0 0 0.1690147 0.9856135 0 0.1537774 0.9881055 0 0.1537774 0.9881055 0 0.1690147 0.9856135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.2337047 0.9723076 0 0 0.9999999 0 0.1330419 0.9911103 0 0.1019243 0.9947921 0 0.1019243 0.9947921 0 0.1330419 0.9911103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.1902454 0.9817365 0 0 0.9999999 0 0.08152475 0.9966713 0 0.03080725 0.9995253 0 0.03080725 0.9995253 0 0.08152475 0.9966713 0 0 0 0 0.02623569 0.9996557 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0.1763172 0.9843333 0 0.1690147 0.9856135 0 0.1690147 0.9856135 0 0.1763171 0.9843333 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0.1545352 -0.9879872 0 0 0 0 -0.9999999 0 0 0 -0.9999999 0 0.9999999 0 0 -0.1545352 0.9879872 0 0 0 0 0.1537774 0.9881055 0 0.1330419 0.9911103 0 0.1330419 0.9911103 0 0.1537774 0.9881055 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.4544658 0.8907641 0 0 0 0 -0.2337047 0.9723076 0 -0.4544658 0.8907641 0 0.1019243 0.9947921 0 0.08152475 0.9966713 0 0.08152475 0.9966713 0 0.1019243 0.9947921 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.3735417 0.9276132 0 0 0 0 -0.1902454 0.9817365 0 -0.3735417 0.9276132 0 0.03080725 0.9995253 0 0.02623569 0.9996557 0 0.02623569 0.9996557 0 0.03080725 0.9995253 0 0.1600127 -0.9871149 0 0 0 0 0.02623569 0.9996557 0 -0.9999999 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 -0.1600127 0.9871149 0 0 0 0 0.9999999 0 0 -0.02623569 -0.9996557 0.03605632 0 0.9993497 0.03917924 0 0.9992322 0 0 0.9999999 0.03072999 0 0.9995278 0.03605632 0 0.9993497 0 0 0.9999999 0.02347988 0 0.9997243 0.03072999 0 0.9995278 0 0 0.9999999 0.01472434 0 0.9998916 0.02347988 0 0.9997243 0 0 0.9999999 0.005015881 0 0.9999874 0.01472434 0 0.9998916 0 0 0.9999999 -0.005015882 0 0.9999874 0.005015881 0 0.9999874 0 0 0.9999999 -0.01472064 0 0.9998916 -0.005015882 0 0.9999874 0 0 0.9999999 -0.02347876 0 0.9997244 -0.01472064 0 0.9998916 0 0 0.9999999 -0.03073249 0 0.9995276 -0.02347876 0 0.9997244 0 0 0.9999999 -0.03605625 0 0.9993497 -0.03073249 0 0.9995276 0 0 0.9999999 -0.03917917 0 0.9992322 -0.03605625 0 0.9993497 0 0 0.9999999 -0.03996886 0 0.9992009 -0.03917917 0 0.9992322 0 0 0.9999999 -0.03844787 0 0.9992605 -0.03996886 0 0.9992009 0 0 0.9999999 -0.03476036 0 0.9993956 -0.03844787 0 0.9992605 0 0 0.9999999 -0.02916646 0 0.9995746 -0.03476036 0 0.9993956 0 0 0.9999999 -0.02200414 0 0.9997579 -0.02916646 0 0.9995746 0 0 0.9999999 -0.0136755 0 0.9999064 -0.02200414 0 0.9997579 0 0 0.9999999 -0.004637884 0 0.9999892 -0.0136755 0 0.9999064 0 0 0.9999999 0.004637885 0 0.9999892 -0.004637884 0 0.9999892 0 0 0.9999999 0.01367926 0 0.9999064 0.004637885 0 0.9999892 0 0 0.9999999 0.02200518 0 0.9997579 0.01367926 0 0.9999064 0 0 0.9999999 0.02916375 0 0.9995747 0.02200518 0 0.9997579 0 0 0.9999999 0.03476037 0 0.9993956 0.02916375 0 0.9995747 0 0 0.9999999 0.03844794 0 0.9992605 0.03476037 0 0.9993956 0 0 0.9999999 0.03996898 0 0.9992009 0.03844794 0 0.9992605 0 0 0.9999999 0.03917924 0 0.9992322 0.03996898 0 0.9992009 0 0 0.9999999 0.9819382 -0.06048775 -0.1792718 0.9819389 -0.06048423 -0.1792689 0.9963078 0.06048467 -0.06092745 0.9995877 0.02022772 -0.02037499 0.9527763 0.0604867 -0.297588 0.9527752 0.06048428 -0.297592 0.8756216 0.02022897 -0.4825742 0.9105022 -0.06048521 -0.4090565 0.8538707 0.0604861 -0.5169584 0.8756216 0.02022897 -0.4825742 0.7346893 0.0202276 -0.6781022 0.7861516 -0.06048445 -0.6150668 0.7053433 0.06048587 -0.7062805 0.7346893 0.0202276 -0.6781022 0.5510601 0.0202286 -0.8342202 0.6161112 -0.06048469 -0.7853334 0.5158233 0.06048479 -0.854557 0.5510601 0.0202286 -0.8342202 0.3354066 0.02022835 -0.9418563 0.4102656 -0.06048476 -0.9099581 0.296325 0.06048599 -0.9531699 0.3354066 0.02022835 -0.9418563 0.1002594 0.02022752 -0.9947557 0.1805785 -0.06048563 -0.9816989 0.05960637 0.06048507 -0.9963877 0.1002594 0.02022752 -0.9947557 -0.140716 0.02022844 -0.9898434 -0.05960588 -0.06048546 -0.9963878 -0.1805772 0.06048433 -0.9816992 -0.140716 0.02022844 -0.9898434 -0.3735135 0.02022839 -0.927404 -0.2963279 -0.06048584 -0.953169 -0.4102663 0.06048448 -0.9099577 -0.3735135 0.02022839 -0.927404 -0.5846004 0.02022674 -0.8110693 -0.515825 -0.06048293 -0.854556 -0.6161098 0.06048623 -0.7853343 -0.5846004 0.02022674 -0.8110693 -0.761714 0.02022832 -0.6475977 -0.7053421 -0.06048789 -0.7062815 -0.7861526 0.06048612 -0.6150653 -0.761714 0.02022832 -0.6475977 -0.8945601 0.02022907 -0.4464896 -0.8538721 -0.06048518 -0.5169563 -0.910503 0.06048328 -0.4090549 -0.8945601 0.02022907 -0.4464896 -0.9754176 0.02022978 -0.2194342 -0.9527752 -0.06048733 -0.2975911 -0.9819386 0.06048376 -0.1792712 -0.9754176 0.02022978 -0.2194342 -0.9995877 0.02022844 0.02037717 -0.9963077 -0.06048504 -0.0609294 -0.9963077 0.06048536 0.06092995 -0.9995877 0.02022844 0.02037717 -0.9656652 0.02022768 0.2590011 -0.9819381 -0.06048501 0.1792735 -0.9527758 0.06048401 0.29759 -0.9656652 0.02022768 0.2590011 -0.8756216 0.02022894 0.4825742 -0.9105021 -0.06048615 0.4090566 -0.8538712 0.0604858 0.5169578 -0.8756216 0.02022894 0.4825742 -0.7346907 0.02022817 0.6781005 -0.7861494 -0.06048476 0.6150695 -0.705344 0.06048404 0.70628 -0.7346907 0.02022817 0.6781005 -0.5510617 0.0202281 0.8342193 -0.6161126 -0.06048573 0.7853321 -0.5158246 0.06048565 0.8545563 -0.5510617 0.0202281 0.8342193 -0.3354049 0.02022888 0.9418568 -0.4102638 -0.06048573 0.9099588 -0.2963251 0.06048498 0.9531699 -0.3354049 0.02022888 0.9418568 -0.1002583 0.0202283 0.9947557 -0.1805727 -0.06048473 0.9817001 -0.05960758 0.06048436 0.9963877 -0.1002583 0.0202283 0.9947557 0.1407158 0.02022793 0.9898434 0.05960796 -0.06048563 0.9963876 0.1805795 0.06048825 0.9816986 0.1407158 0.02022793 0.9898434 0.3735126 0.02022752 0.9274045 0.2963273 -0.06048658 0.9531692 0.4102687 0.06048366 0.9099567 0.3735126 0.02022752 0.9274045 0.5845998 0.02022816 0.8110695 0.515824 -0.06048346 0.8545566 0.6161095 0.06048263 0.7853348 0.5845998 0.02022816 0.8110695 0.7617136 0.0202278 0.6475983 0.7053412 -0.06048523 0.7062827 0.786149 0.06048656 0.6150699 0.7617136 0.0202278 0.6475983 0.8945609 0.0202278 0.4464883 0.8538712 -0.06048603 0.5169578 0.9105023 0.06048622 0.4090562 0.8945609 0.0202278 0.4464883 0.9754181 0.0202281 0.2194322 0.9527758 -0.06048432 0.29759 0.9819382 0.06048496 0.1792733 0.9754181 0.0202281 0.2194322 0.9995877 0.02022772 -0.02037499 0.9963077 -0.06048462 0.06093042 0.9709421 0 -0.2393143 0.8854558 0 -0.4647233 0.8854558 0 -0.4647233 0.9709421 0 -0.2393143 0.8854558 0 -0.4647233 0.748511 0 -0.6631224 0.748511 0 -0.6631224 0.8854558 0 -0.4647233 0.748511 0 -0.6631224 0.568063 0 -0.822985 0.568063 0 -0.822985 0.748511 0 -0.6631224 0.568063 0 -0.822985 0.3546054 0 -0.9350159 0.3546053 0 -0.9350159 0.568063 0 -0.822985 0.3546054 0 -0.9350159 0.1205383 0 -0.9927086 0.1205383 0 -0.9927086 0.3546053 0 -0.9350159 0.1205383 0 -0.9927086 -0.1205384 0 -0.9927086 -0.1205384 0 -0.9927086 0.1205383 0 -0.9927086 -0.1205384 0 -0.9927086 -0.3546089 0 -0.9350147 -0.3546089 0 -0.9350147 -0.1205384 0 -0.9927086 -0.3546089 0 -0.9350147 -0.5680631 0 -0.822985 -0.5680631 0 -0.822985 -0.3546089 0 -0.9350147 -0.5680631 0 -0.822985 -0.7485092 0 -0.6631242 -0.7485092 0 -0.6631242 -0.5680631 0 -0.822985 -0.7485092 0 -0.6631242 -0.885456 0 -0.4647232 -0.885456 0 -0.4647232 -0.7485092 0 -0.6631242 -0.885456 0 -0.4647232 -0.9709418 0 -0.2393157 -0.9709418 0 -0.2393157 -0.885456 0 -0.4647232 -0.9709418 0 -0.2393157 -0.9999999 0 0 -0.9999999 0 0 -0.9709418 0 -0.2393157 -0.9999999 0 0 -0.9709417 0 0.2393159 -0.9709417 0 0.2393159 -0.9999999 0 0 -0.9709417 0 0.2393159 -0.8854558 0 0.4647234 -0.8854558 0 0.4647234 -0.9709417 0 0.2393159 -0.8854558 0 0.4647234 -0.748511 0 0.6631223 -0.748511 0 0.6631223 -0.8854558 0 0.4647234 -0.748511 0 0.6631223 -0.5680658 0 0.8229831 -0.5680657 0 0.8229831 -0.748511 0 0.6631223 -0.5680658 0 0.8229831 -0.3546019 0 0.9350173 -0.3546019 0 0.9350173 -0.5680657 0 0.8229831 -0.3546019 0 0.9350173 -0.1205345 0 0.9927091 -0.1205345 0 0.9927091 -0.3546019 0 0.9350173 -0.1205345 0 0.9927091 0.1205345 0 0.9927091 0.1205345 0 0.9927091 -0.1205345 0 0.9927091 0.1205345 0 0.9927091 0.3546056 0 0.9350159 0.3546056 0 0.9350159 0.1205345 0 0.9927091 0.3546056 0 0.9350159 0.5680659 0 0.8229831 0.5680659 0 0.822983 0.3546056 0 0.9350159 0.5680659 0 0.8229831 0.7485093 0 0.6631241 0.7485093 0 0.6631241 0.5680659 0 0.822983 0.7485093 0 0.6631241 0.885456 0 0.464723 0.885456 0 0.464723 0.7485093 0 0.6631241 0.885456 0 0.464723 0.9709418 0 0.2393155 0.9709418 0 0.2393155 0.885456 0 0.464723 0.9709418 0 0.2393155 0.9999999 0 0 0.9999999 0 0 0.9709418 0 0.2393155 0.9999999 0 0 0.9709421 0 -0.2393143 0.9709421 0 -0.2393143 0.9999999 0 0 -0.03844738 0 0.9992607 -0.03476184 0 0.9993956 0 0 0.9999999 -0.03476184 0 0.9993956 -0.02916347 0 0.9995747 0 0 0.9999999 -0.02916347 0 0.9995747 -0.02200126 0 0.9997579 0 0 0.9999999 -0.02200126 0 0.9997579 -0.01368053 0 0.9999064 0 0 0.9999999 -0.01368053 0 0.9999064 -0.004634251 0 0.9999893 0 0 0.9999999 -0.004634251 0 0.9999893 0.00464088 0 0.9999893 0 0 0.9999999 0.00464088 0 0.9999893 0.01367165 0 0.9999065 0 0 0.9999999 0.01367165 0 0.9999065 0.02200845 0 0.9997578 0 0 0.9999999 0.02200845 0 0.9997578 0.02916776 0 0.9995745 0 0 0.9999999 0.02916776 0 0.9995745 0.0347592 0 0.9993957 0 0 0.9999999 0.0347592 0 0.9993957 0.03844858 0 0.9992605 0 0 0.9999999 0.03844858 0 0.9992605 0.03996604 0 0.999201 0 0 0.9999999 0.03996604 0 0.999201 0.03917794 0 0.9992322 0 0 0.9999999 0.03917794 0 0.9992322 0.03605579 0 0.9993498 0 0 0.9999999 0.03605579 0 0.9993498 0.03072964 0 0.9995277 0 0 0.9999999 0.03072964 0 0.9995277 0.02347873 0 0.9997244 0 0 0.9999999 0.02347873 0 0.9997244 0.0147273 0 0.9998915 0 0 0.9999999 0.0147273 0 0.9998915 0.005026353 0 0.9999873 0 0 0.9999999 0.005026353 0 0.9999873 -0.005013404 0 0.9999874 0 0 0.9999999 -0.005013404 0 0.9999874 -0.01472967 0 0.9998915 0 0 0.9999999 -0.01472967 0 0.9998915 -0.02347665 0 0.9997244 0 0 0.9999999 -0.02347665 0 0.9997244 -0.03072939 0 0.9995277 0 0 0.9999999 -0.03072939 0 0.9995277 -0.03606003 0 0.9993496 0 0 0.9999999 -0.03606003 0 0.9993496 -0.03917888 0 0.9992322 0 0 0.9999999 -0.03917888 0 0.9992322 -0.0399693 0 0.9992009 0 0 0.9999999 -0.0399693 0 0.9992009 -0.03844738 0 0.9992607 0 0 0.9999999 0.01483156 0 -0.99989 -0.224892 0 -0.9743836 0.2806423 0 0.9598123 0.04278603 0 0.9990842 -0.224892 0 -0.9743836 -0.4515422 0 -0.8922498 0.502186 0 0.8647596 0.2806423 0 0.9598123 -0.4515422 0 -0.8922498 -0.6519507 0 -0.7582612 0.6945438 0 0.7194504 0.502186 0 0.8647596 -0.6519507 0 -0.7582612 -0.8144708 0 -0.5802045 0.8465381 0 0.532328 0.6945438 0 0.7194504 -0.8144708 0 -0.5802045 -0.9296557 0 -0.3684293 0.9493337 0 0.3142699 0.8465381 0 0.532328 -0.9296557 0 -0.3684293 -0.9908125 0 -0.1352426 0.9969574 0 0.07794765 0.9493337 0 0.3142699 -0.9908125 0 -0.1352426 -0.9943869 0 0.1058045 0.9866417 0 -0.1629051 0.9969574 0 0.07794765 -0.9943869 0 0.1058045 -0.9401714 0 0.3407017 0.9189866 0 -0.3942886 0.9866417 0 -0.1629051 -0.9401714 0 0.3407017 -0.8313157 0 0.5558004 0.7979202 0 -0.6027631 0.9189866 0 -0.3942886 -0.8313157 0 0.5558004 -0.6741437 0 0.7386001 0.6304809 0 -0.7762048 0.7979202 0 -0.6027631 -0.6741437 0 0.7386001 -0.4777989 0 0.8784691 0.4264081 0 -0.9045308 0.6304809 0 -0.7762048 -0.4777989 0 0.8784691 -0.2536859 0 0.9672866 0.1975495 0 -0.9802928 0.4264081 0 -0.9045308 -0.2536859 0 0.9672866 -0.01483095 0 0.99989 -0.04278634 0 -0.9990842 0.1975495 0 -0.9802928 -0.01483095 0 0.99989 0.2248948 0 0.9743831 -0.2806467 0 -0.9598111 -0.04278634 0 -0.9990842 0.2248948 0 0.9743831 0.4515429 0 0.8922493 -0.5021857 0 -0.8647597 -0.2806467 0 -0.9598111 0.4515429 0 0.8922493 0.6519521 0 0.7582601 -0.6945456 0 -0.7194486 -0.5021857 0 -0.8647597 0.6519521 0 0.7582601 0.8144708 0 0.5802045 -0.8465379 0 -0.5323282 -0.6945456 0 -0.7194486 0.8144708 0 0.5802045 0.9296557 0 0.3684292 -0.9493337 0 -0.3142699 -0.8465379 0 -0.5323282 0.9296557 0 0.3684292 0.9908127 0 0.1352411 -0.9969575 0 -0.07794607 -0.9493337 0 -0.3142699 0.9908127 0 0.1352411 0.9943867 0 -0.105807 -0.9866412 0 0.1629083 -0.9969575 0 -0.07794607 0.9943867 0 -0.105807 0.9401706 0 -0.340704 -0.9189856 0 0.3942906 -0.9866412 0 0.1629083 0.9401706 0 -0.340704 0.8313174 0 -0.5557979 -0.7979242 0 0.6027579 -0.9189856 0 0.3942906 0.8313174 0 -0.5557979 0.6741483 0 -0.738596 -0.6304838 0 0.7762023 -0.7979242 0 0.6027579 0.6741483 0 -0.738596 0.4777965 0 -0.8784706 -0.4264034 0 0.9045331 -0.6304838 0 0.7762023 0.4777965 0 -0.8784706 0.2536848 0 -0.9672869 -0.1975499 0 0.9802928 -0.4264034 0 0.9045331 0.2536848 0 -0.9672869 0.01483156 0 -0.99989 0.04278603 0 0.9990842 -0.1975499 0 0.9802928 -0.03401613 -0.4555727 0.8895483 -0.03445341 -0.455522 0.8895575 -0.03288189 -0.4195705 0.9071268 -0.03031123 -0.4201269 0.9069589 -0.7817518 0.2048844 0.5889708 0.6693305 -0.2721292 -0.6913338 0.4844332 -0.2721258 -0.8314277 -0.6180822 0.2048827 0.7589449 -0.03031123 -0.4201269 0.9069589 -0.03288189 -0.4195705 0.9071268 -0.03021302 -0.3608562 0.9321318 -0.0243987 -0.3626919 0.9315895 -0.6180822 0.2048827 0.7589449 0.4844332 -0.2721258 -0.8314277 0.271389 -0.2721242 -0.9231991 -0.4184975 0.2048812 0.8848071 -0.0243987 -0.3626919 0.9315895 -0.03021302 -0.3608562 0.9321318 -0.02602132 -0.2789689 0.9599475 -0.01654067 -0.2828447 0.9590231 -0.4184975 0.2048812 0.8848071 0.271389 -0.2721242 -0.9231991 0.04256575 -0.2721254 -0.9613199 -0.1945923 0.2048792 0.9592488 -0.01654067 -0.2828447 0.9590231 -0.02602132 -0.2789689 0.9599475 -0.01996623 -0.1759043 0.9842047 -0.007295191 -0.1820347 0.983265 -0.1945923 0.2048792 0.9592488 0.04256575 -0.2721254 -0.9613199 -0.1887275 -0.2721229 -0.9435736 0.04063007 0.2048796 0.9779435 -0.007295191 -0.1820347 0.983265 -0.01996623 -0.1759043 0.9842047 -0.0119652 -0.05774849 0.9982595 0.002556202 -0.06539828 0.997856 0.04063007 0.2048796 0.9779435 -0.1887275 -0.2721229 -0.9435736 -0.4090474 -0.2721263 -0.8709922 0.2734808 0.2048829 0.9398038 0.002556202 -0.06539828 0.997856 -0.0119652 -0.05774849 0.9982595 -0.002566157 0.06540081 0.9978558 0.01195244 0.05775316 0.9982594 0.2734808 0.2048829 0.9398038 -0.4090474 -0.2721263 -0.8709922 -0.6056046 -0.2721305 -0.7477887 0.490437 0.2048815 0.8470508 0.01195244 0.05775316 0.9982594 -0.002566157 0.06540081 0.9978558 0.007311873 0.1820266 0.9832664 0.01995711 0.1759067 0.9842045 0.490437 0.2048815 0.8470508 -0.6056046 -0.2721305 -0.7477887 -0.7669675 -0.2721258 -0.5811269 0.6789063 0.2048798 0.7050606 0.01995711 0.1759067 0.9842045 0.007311873 0.1820266 0.9832664 0.01656003 0.2828513 0.9590207 0.02606199 0.2789635 0.9599479 0.6789063 0.2048798 0.7050606 -0.7669675 -0.2721258 -0.5811269 -0.8837517 -0.2721213 -0.3807004 0.8279102 0.2048793 0.5221006 0.02606199 0.2789635 0.9599479 0.01656003 0.2828513 0.9590207 0.02435185 0.362708 0.9315845 0.03018527 0.3608663 0.9321288 0.8279102 0.2048793 0.5221006 -0.8837517 -0.2721213 -0.3807004 -0.949179 -0.2721223 -0.1581414 0.9287974 0.2048754 0.3088066 0.03018527 0.3608663 0.9321288 0.02435185 0.362708 0.9315845 0.03030455 0.4201228 0.906961 0.03286145 0.4195684 0.9071286 0.9287974 0.2048754 0.3088066 -0.949179 -0.2721223 -0.1581414 -0.9594436 -0.272122 0.07360395 0.9757106 0.2048748 0.07755645 0.03286145 0.4195684 0.9071286 0.03030455 0.4201228 0.906961 0.03399898 0.4555717 0.8895494 0.03442279 0.4555231 0.8895581 0.9757106 0.2048748 0.07755645 -0.9594436 -0.272122 0.07360395 -0.9139441 -0.2721281 0.3010852 0.9659157 0.2048835 -0.1582081 0.03442279 0.4555231 0.8895581 0.03399898 0.4555717 0.8895494 0.03536574 0.469709 0.8821126 0.0352677 0.4697105 0.8821157 0.9659157 0.2048835 -0.1582081 -0.9139441 -0.2721281 0.3010852 -0.8153354 -0.2721269 0.511053 0.8999878 0.2048816 -0.3847665 0.0352677 0.4697105 0.8821157 0.03536574 0.469709 0.8821126 0.03409179 0.4624189 0.8860058 0.03534015 0.462524 0.8859019 0.8999878 0.2048816 -0.3847665 -0.8153354 -0.2721269 0.511053 -0.6693299 -0.2721307 0.6913338 0.7817503 0.204886 -0.5889721 0.03534015 0.462524 0.8859019 0.03409179 0.4624189 0.8860058 0.03024353 0.4323878 0.9011803 0.03453524 0.4331939 0.9006388 0.7817503 0.204886 -0.5889721 -0.6693299 -0.2721307 0.6913338 -0.4844511 -0.2721244 0.8314177 0.6180912 0.2048798 -0.7589384 0.03453524 0.4331939 0.9006388 0.03024353 0.4323878 0.9011803 0.02382177 0.3773914 0.9257473 0.03253167 0.3799435 0.9244374 0.6180912 0.2048798 -0.7589384 -0.4844511 -0.2721244 0.8314177 -0.2713886 -0.2721313 0.923197 0.418501 0.204885 -0.8848044 0.03253167 0.3799435 0.9244374 0.02382177 0.3773914 0.9257473 0.01515924 0.2955786 0.9551981 0.02888435 0.3009869 0.9531907 0.418501 0.204885 -0.8848044 -0.2713886 -0.2721313 0.923197 -0.04258488 -0.272127 0.9613186 0.1946003 0.2048808 -0.9592469 0.02888435 0.3009869 0.9531907 0.01515924 0.2955786 0.9551981 0.004965408 0.1879335 0.9821691 0.02317467 0.1966278 0.9802043 0.1946003 0.2048808 -0.9592469 -0.04258488 -0.272127 0.9613186 0.1887252 -0.2721269 0.9435729 -0.04062477 0.2048814 -0.9779433 0.02317467 0.1966278 0.9802043 0.004965408 0.1879335 0.9821691 -0.005595796 0.06110595 0.9981155 0.01529576 0.07209533 0.9972804 -0.04062477 0.2048814 -0.9779433 0.1887252 -0.2721269 0.9435729 0.4090536 -0.2721228 0.8709904 -0.2734827 0.2048783 -0.9398042 0.01529576 0.07209533 0.9972804 -0.005595796 0.06110595 0.9981155 -0.01530161 -0.07209924 0.9972801 0.005596238 -0.06110668 0.9981155 -0.2734827 0.2048783 -0.9398042 0.4090536 -0.2721228 0.8709904 0.6056078 -0.2721227 0.747789 -0.4904447 0.204878 -0.8470472 0.005596238 -0.06110668 0.9981155 -0.01530161 -0.07209924 0.9972801 -0.02318441 -0.1966252 0.9802046 -0.004988202 -0.1879372 0.9821683 -0.4904447 0.204878 -0.8470472 0.6056078 -0.2721227 0.747789 0.7669691 -0.2721231 0.581126 -0.6789047 0.2048763 -0.7050632 -0.004988202 -0.1879372 0.9821683 -0.02318441 -0.1966252 0.9802046 -0.02888843 -0.3009885 0.95319 -0.01515452 -0.295576 0.9551989 -0.6789047 0.2048763 -0.7050632 0.7669691 -0.2721231 0.581126 0.8837514 -0.2721249 0.3806986 -0.8279097 0.204881 -0.5221008 -0.01515452 -0.295576 0.9551989 -0.02888843 -0.3009885 0.95319 -0.03257633 -0.3799528 0.924432 -0.02385892 -0.3773985 0.9257435 -0.8279097 0.204881 -0.5221008 0.8837514 -0.2721249 0.3806986 0.9491778 -0.2721293 0.1581362 -0.9287975 0.2048851 -0.3087997 -0.02385892 -0.3773985 0.9257435 -0.03257633 -0.3799528 0.924432 -0.03453098 -0.43319 0.9006407 -0.03026575 -0.4323879 0.9011795 -0.9287975 0.2048851 -0.3087997 0.9491778 -0.2721293 0.1581362 0.9594434 -0.2721232 -0.07360183 -0.9757103 0.2048759 -0.07755865 -0.03026575 -0.4323879 0.9011795 -0.03453098 -0.43319 0.9006407 -0.03531779 -0.4625237 0.8859031 -0.03408811 -0.4624196 0.8860056 -0.9757103 0.2048759 -0.07755865 0.9594434 -0.2721232 -0.07360183 0.9139501 -0.2721223 -0.3010726 -0.965919 0.204875 0.1581986 -0.03408811 -0.4624196 0.8860056 -0.03531779 -0.4625237 0.8859031 -0.03524455 -0.4697121 0.8821158 -0.03532172 -0.4697107 0.8821134 -0.965919 0.204875 0.1581986 0.9139501 -0.2721223 -0.3010726 0.8153366 -0.2721262 -0.5110514 -0.899988 0.2048818 0.3847661 0.6693305 -0.2721292 -0.6913338 -0.7817518 0.2048844 0.5889708 -0.899988 0.2048818 0.3847661 0.8153366 -0.2721262 -0.5110514 -0.03445341 -0.455522 0.8895575 -0.03401613 -0.4555727 0.8895483 -0.03532172 -0.4697107 0.8821134 -0.03524455 -0.4697121 0.8821158</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape9-textangents-array" count="796" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_needles_8Shape9-texbinormals">
+ <float_array id="qt_gauge_needles_8Shape9-texbinormals-array" count="2388">0 1 0 -0.9952223 -0.09763492 0 0 -1 0 0.9952223 0.09763492 0 0 1 0 0.8855605 -0.4645241 0 0 -1 0 -0.8855605 0.4645241 0 0 -0.8907642 -0.4544659 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 -0.9723077 -0.2337048 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 -0.9817366 -0.1902454 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0.9996558 -0.02623569 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 -0.9879873 -0.1545352 0 0 0 0 0 1 0 1 0 0 0 1 0 -0.9879873 -0.1545352 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.8907642 -0.4544659 0 0 0 0 -0.9723077 -0.2337048 0 -0.8907642 -0.4544658 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.9276134 -0.3735418 0 0 0 0 -0.9817366 -0.1902454 0 -0.9276134 -0.3735418 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.987115 -0.1600127 0 0 0 0 0.9996558 -0.02623569 0 0 -1 1 0 0 1 0 0 1 0 0 1 0 0 0 -0.987115 -0.1600127 0 0 0 0 0 1 0 -0.9996558 0.02623569 -0.9993498 0 0.03605633 -0.9992322 0 0.03917924 -1 0 0 -0.9995278 0 0.03072999 -0.9993498 0 0.03605633 -1 0 0 -0.9997244 0 0.02347989 -0.9995278 0 0.03072999 -1 0 0 -0.9998916 0 0.01472434 -0.9997244 0 0.02347989 -1 0 0 -0.9999874 0 0.005015881 -0.9998916 0 0.01472434 -1 0 0 -0.9999875 0 -0.005015883 -0.9999874 0 0.005015881 -1 0 0 -0.9998916 0 -0.01472064 -0.9999875 0 -0.005015883 -1 0 0 -0.9997244 0 -0.02347876 -0.9998916 0 -0.01472064 -1 0 0 -0.9995277 0 -0.03073249 -0.9997244 0 -0.02347876 -1 0 0 -0.9993498 0 -0.03605625 -0.9995277 0 -0.03073249 -1 0 0 -0.9992323 0 -0.03917918 -0.9993498 0 -0.03605625 -1 0 0 -0.999201 0 -0.03996886 -0.9992323 0 -0.03917918 -1 0 0 -0.9992607 0 -0.03844787 -0.999201 0 -0.03996886 -1 0 0 -0.9993957 0 -0.03476036 -0.9992607 0 -0.03844787 -1 0 0 -0.9995746 0 -0.02916646 -0.9993957 0 -0.03476036 -1 0 0 -0.9997579 0 -0.02200414 -0.9995746 0 -0.02916646 -1 0 0 -0.9999065 0 -0.01367551 -0.9997579 0 -0.02200414 -1 0 0 -0.9999893 0 -0.004637884 -0.9999065 0 -0.01367551 -1 0 0 -0.9999893 0 0.004637885 -0.9999893 0 -0.004637884 -1 0 0 -0.9999064 0 0.01367926 -0.9999893 0 0.004637885 -1 0 0 -0.9997579 0 0.02200518 -0.9999064 0 0.01367926 -1 0 0 -0.9995747 0 0.02916375 -0.9997579 0 0.02200518 -1 0 0 -0.9993957 0 0.03476038 -0.9995747 0 0.02916375 -1 0 0 -0.9992607 0 0.03844794 -0.9993957 0 0.03476038 -1 0 0 -0.999201 0 0.03996898 -0.9992607 0 0.03844794 -1 0 0 -0.9992322 0 0.03917924 -0.999201 0 0.03996898 -1 0 0 -0.08585149 0.7019117 -0.707071 -0.08585177 0.701912 -0.7070708 -0.08585192 0.7019133 -0.7070695 -0.02871065 0.704224 -0.7093971 -0.252571 0.7019118 -0.6659788 -0.2525721 0.701912 -0.6659781 -0.3550978 0.7042223 -0.6147979 -0.2525722 0.7019116 -0.6659786 -0.4046131 0.7019114 -0.5861813 -0.3550978 0.7042223 -0.6147979 -0.4919114 0.7042202 -0.5119542 -0.4046133 0.7019095 -0.5861835 -0.533139 0.7019094 -0.47232 -0.4919114 0.7042202 -0.5119542 -0.6001351 0.7042217 -0.3793544 -0.5331383 0.7019109 -0.4723183 -0.6306788 0.7019109 -0.3310065 -0.6001351 0.7042217 -0.3793544 -0.6734791 0.7042241 -0.2247095 -0.6306772 0.7019134 -0.3310045 -0.6915657 0.7019132 -0.1704547 -0.6734791 0.7042241 -0.2247095 -0.7076896 0.7042199 -0.05700687 -0.6915691 0.7019091 -0.1704575 -0.7122666 0.7019091 0 -0.7076896 0.7042199 -0.05700687 -0.7007678 0.7042199 0.1140125 -0.7122666 0.701909 0 -0.6915696 0.7019092 0.1704557 -0.7007678 0.7042199 0.1140125 -0.6531108 0.7042291 0.278402 -0.6915604 0.7019182 0.1704551 -0.6306723 0.7019184 0.331003 -0.6531108 0.7042291 0.278402 -0.5675064 0.7042315 0.4266082 -0.6306694 0.7019209 0.3310032 -0.5331304 0.7019206 0.4723128 -0.5675064 0.7042315 0.4266082 -0.448928 0.7042212 0.5500329 -0.5331401 0.7019102 0.4723175 -0.4046108 0.7019103 0.5861843 -0.448928 0.7042212 0.5500329 -0.3042532 0.7042168 0.6414895 -0.4046136 0.701906 0.5861875 -0.2525749 0.7019063 0.6659833 -0.3042532 0.7042168 0.6414895 -0.141893 0.7042202 0.6956582 -0.2525742 0.7019093 0.6659803 -0.08585433 0.7019095 0.7070729 -0.141893 0.7042202 0.6956582 0.02871269 0.7042232 0.7093979 -0.08585355 0.7019123 0.7070702 0.08585417 0.7019123 0.7070701 0.02871269 0.7042232 0.7093979 0.1976469 0.7042245 0.6819118 0.08585411 0.7019137 0.7070687 0.2525701 0.7019138 0.665977 0.1976469 0.7042245 0.6819118 0.3550956 0.7042272 0.6147937 0.2525695 0.7019164 0.6659745 0.4046102 0.7019164 0.5861774 0.3550956 0.7042272 0.6147937 0.4919051 0.7042285 0.5119489 0.4046098 0.7019178 0.5861761 0.5331321 0.7019178 0.4723151 0.4919051 0.7042285 0.5119489 0.6001304 0.7042263 0.3793532 0.5331332 0.7019154 0.4723173 0.6306749 0.7019154 0.3310043 0.6001304 0.7042263 0.3793532 0.6734746 0.7042295 0.224706 0.6306725 0.7019188 0.331002 0.6915602 0.7019188 0.1704535 0.6734746 0.7042295 0.224706 0.7076736 0.7042363 0.05700359 0.6915541 0.7019255 0.1704508 0.7122503 0.7019255 0 0.7076736 0.7042363 0.05700359 0.7007567 0.7042312 -0.1140106 0.7122555 0.7019204 0 0.6915576 0.70192 -0.1704587 0.7007567 0.7042312 -0.1140106 0.6531203 0.7042194 -0.2784042 0.6915698 0.7019085 -0.1704576 0.6306807 0.7019088 -0.3310076 0.6531203 0.7042194 -0.2784042 0.5675149 0.7042207 -0.4266147 0.6306789 0.7019101 -0.3310083 0.533141 0.7019101 -0.4723165 0.5675149 0.7042207 -0.4266147 0.4489247 0.7042274 -0.5500277 0.5331353 0.7019167 -0.4723133 0.4046099 0.7019165 -0.5861775 0.4489247 0.7042274 -0.5500277 0.3042484 0.7042267 -0.6414807 0.4046105 0.7019159 -0.5861777 0.2525693 0.7019159 -0.665975 0.3042484 0.7042267 -0.6414807 0.1418917 0.7042246 -0.695654 0.2525703 0.7019139 -0.6659768 0.08585399 0.7019138 -0.7070687 0.1418917 0.7042246 -0.695654 -0.02871065 0.704224 -0.7093971 0.08585398 0.7019132 -0.7070692 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.9992607 0 0.03844738 0.9993957 0 0.03476184 1 0 0 0.9993957 0 0.03476184 0.9995747 0 0.02916347 1 0 0 0.9995747 0 0.02916347 0.999758 0 0.02200126 1 0 0 0.999758 0 0.02200126 0.9999064 0 0.01368053 1 0 0 0.9999064 0 0.01368053 0.9999893 0 0.004634251 1 0 0 0.9999893 0 0.004634251 0.9999893 0 -0.00464088 1 0 0 0.9999893 0 -0.00464088 0.9999066 0 -0.01367165 1 0 0 0.9999066 0 -0.01367165 0.9997579 0 -0.02200845 1 0 0 0.9997579 0 -0.02200845 0.9995746 0 -0.02916776 1 0 0 0.9995746 0 -0.02916776 0.9993958 0 -0.03475921 1 0 0 0.9993958 0 -0.03475921 0.9992607 0 -0.03844859 1 0 0 0.9992607 0 -0.03844859 0.9992011 0 -0.03996605 1 0 0 0.9992011 0 -0.03996605 0.9992322 0 -0.03917794 1 0 0 0.9992322 0 -0.03917794 0.9993498 0 -0.03605579 1 0 0 0.9993498 0 -0.03605579 0.9995278 0 -0.03072964 1 0 0 0.9995278 0 -0.03072964 0.9997244 0 -0.02347873 1 0 0 0.9997244 0 -0.02347873 0.9998916 0 -0.0147273 1 0 0 0.9998916 0 -0.0147273 0.9999874 0 -0.005026353 1 0 0 0.9999874 0 -0.005026353 0.9999875 0 0.005013405 1 0 0 0.9999875 0 0.005013405 0.9998915 0 0.01472967 1 0 0 0.9998915 0 0.01472967 0.9997244 0 0.02347665 1 0 0 0.9997244 0 0.02347665 0.9995278 0 0.03072939 1 0 0 0.9995278 0 0.03072939 0.9993497 0 0.03606003 1 0 0 0.9993497 0 0.03606003 0.9992323 0 0.03917888 1 0 0 0.9992323 0 0.03917888 0.999201 0 0.03996931 1 0 0 0.999201 0 0.03996931 0.9992607 0 0.03844738 1 0 0 -0.9998901 0 -0.01483156 -0.9743837 0 0.224892 0.9598125 0 -0.2806423 0.9990844 0 -0.04278604 -0.9743837 0 0.224892 -0.8922498 0 0.4515422 0.8647596 0 -0.502186 0.9598125 0 -0.2806423 -0.8922498 0 0.4515422 -0.7582613 0 0.6519508 0.7194504 0 -0.6945438 0.8647596 0 -0.502186 -0.7582613 0 0.6519508 -0.5802046 0 0.8144709 0.532328 0 -0.8465382 0.7194504 0 -0.6945438 -0.5802046 0 0.8144709 -0.3684293 0 0.9296558 0.3142699 0 -0.9493338 0.532328 0 -0.8465382 -0.3684293 0 0.9296558 -0.1352426 0 0.9908126 0.07794766 0 -0.9969575 0.3142699 0 -0.9493338 -0.1352426 0 0.9908126 0.1058045 0 0.994387 -0.1629051 0 -0.9866418 0.07794766 0 -0.9969575 0.1058045 0 0.994387 0.3407018 0 0.9401715 -0.3942887 0 -0.9189867 -0.1629051 0 -0.9866418 0.3407018 0 0.9401715 0.5558005 0 0.8313158 -0.6027631 0 -0.7979203 -0.3942887 0 -0.9189867 0.5558005 0 0.8313158 0.7386001 0 0.6741438 -0.7762048 0 -0.6304809 -0.6027631 0 -0.7979203 0.7386001 0 0.6741438 0.8784692 0 0.477799 -0.9045309 0 -0.4264081 -0.7762048 0 -0.6304809 0.8784692 0 0.477799 0.9672868 0 0.2536859 -0.980293 0 -0.1975495 -0.9045309 0 -0.4264081 0.9672868 0 0.2536859 0.99989 0 0.01483095 -0.9990842 0 0.04278634 -0.980293 0 -0.1975495 0.99989 0 0.01483095 0.9743831 0 -0.2248948 -0.9598112 0 0.2806467 -0.9990842 0 0.04278634 0.9743831 0 -0.2248948 0.8922495 0 -0.451543 -0.8647598 0 0.5021858 -0.9598112 0 0.2806467 0.8922495 0 -0.451543 0.7582602 0 -0.6519521 -0.7194487 0 0.6945457 -0.8647598 0 0.5021858 0.7582602 0 -0.6519521 0.5802046 0 -0.8144709 -0.5323283 0 0.8465381 -0.7194487 0 0.6945457 0.5802046 0 -0.8144709 0.3684292 0 -0.9296558 -0.3142699 0 0.9493337 -0.5323283 0 0.8465381 0.3684292 0 -0.9296558 0.1352411 0 -0.9908127 -0.07794608 0 0.9969577 -0.3142699 0 0.9493337 0.1352411 0 -0.9908127 -0.105807 0 -0.9943867 0.1629083 0 0.9866412 -0.07794608 0 0.9969577 -0.105807 0 -0.9943867 -0.340704 0 -0.9401707 0.3942907 0 0.9189858 0.1629083 0 0.9866412 -0.340704 0 -0.9401707 -0.5557979 0 -0.8313174 0.6027579 0 0.7979242 0.3942907 0 0.9189858 -0.5557979 0 -0.8313174 -0.7385961 0 -0.6741483 0.7762024 0 0.6304839 0.6027579 0 0.7979242 -0.7385961 0 -0.6741483 -0.8784706 0 -0.4777965 0.9045332 0 0.4264034 0.7762024 0 0.6304839 -0.8784706 0 -0.4777965 -0.9672869 0 -0.2536848 0.9802929 0 0.1975499 0.9045332 0 0.4264034 -0.9672869 0 -0.2536848 -0.9998901 0 -0.01483156 0.9990844 0 -0.04278604 0.9802929 0 0.1975499 0.9930717 -0.1155793 -0.02121784 0.9930567 -0.1157786 -0.02082554 0.9753 -0.2118224 -0.06262047 0.975383 -0.2107169 -0.06501152 0.6133623 0.4229923 0.6669815 -0.7344012 -0.3832047 -0.5601866 -0.847123 -0.3832017 -0.3681564 0.7551612 0.4229883 0.500812 0.975383 -0.2107169 -0.06501152 0.9753 -0.2118224 -0.06262047 0.9497091 -0.3011493 -0.08580123 0.9498758 -0.2989361 -0.09150591 0.7551612 0.4229883 0.500812 -0.847123 -0.3832017 -0.3681564 -0.9106113 -0.3832025 -0.154735 0.8530684 0.4229887 0.3055406 0.9498758 -0.2989361 -0.09150591 0.9497091 -0.3011493 -0.08580123 0.9217926 -0.3782642 -0.0849397 0.9220116 -0.3753748 -0.09480698 0.8530684 0.4229887 0.3055406 -0.9106113 -0.3832025 -0.154735 -0.9211811 -0.3832024 0.06768647 0.9013991 0.4229904 0.09251345 0.9220116 -0.3753748 -0.09480698 0.9217926 -0.3782642 -0.0849397 0.8980345 -0.4358581 -0.05968165 0.8982266 -0.4333335 -0.07356004 0.9013991 0.4229904 0.09251345 -0.9211811 -0.3832024 0.06768647 -0.8782153 -0.3832037 0.2861694 0.8973458 0.4229898 -0.1258981 0.8982266 -0.4333335 -0.07356004 0.8980345 -0.4358581 -0.05968165 0.8843969 -0.4664481 -0.0163832 0.8844742 -0.4654372 -0.03276995 0.8973458 0.4229898 -0.1258981 -0.8782153 -0.3832037 0.2861694 -0.7842114 -0.3832096 0.4880194 0.8411395 0.4229957 -0.3369853 0.8844742 -0.4654372 -0.03276995 0.8843969 -0.4664481 -0.0163832 0.8844811 -0.4654232 0.03277906 0.8844041 -0.4664339 0.01639579 0.8411395 0.4229957 -0.3369853 -0.7842114 -0.3832096 0.4880194 -0.6446277 -0.3832139 0.6615152 0.7360525 0.4230029 -0.528484 0.8844041 -0.4664339 0.01639579 0.8844811 -0.4654232 0.03277906 0.8982271 -0.4333358 0.07354154 0.8980349 -0.435856 0.05969063 0.7360525 0.4230029 -0.528484 -0.6446277 -0.3832139 0.6615152 -0.4675862 -0.3832094 0.7965638 0.5881857 0.4229966 -0.6892833 0.8980349 -0.435856 0.05969063 0.8982271 -0.4333358 0.07354154 0.9220061 -0.3753913 0.09479614 0.9217854 -0.3782893 0.08490601 0.5881857 0.4229966 -0.6892833 -0.4675862 -0.3832094 0.7965638 -0.2633791 -0.3832059 0.8853163 0.4061412 0.4229907 -0.8100173 0.9217854 -0.3782893 0.08490601 0.9220061 -0.3753913 0.09479614 0.9498767 -0.2989188 0.09155262 0.9497097 -0.3011395 0.08582921 0.4061412 0.4229907 -0.8100173 -0.2633791 -0.3832059 0.8853163 -0.04385525 -0.3832037 0.9226222 0.2004997 0.4229914 -0.8836732 0.9497097 -0.3011395 0.08582921 0.9498767 -0.2989188 0.09155262 0.9753841 -0.2107106 0.06501467 0.975301 -0.2118124 0.06263717 0.2004997 0.4229914 -0.8836732 -0.04385525 -0.3832037 0.9226222 0.1782147 -0.3832077 0.9063066 -0.01680493 0.4229951 -0.9059762 0.975301 -0.2118124 0.06263717 0.9753841 -0.2107106 0.06501467 0.9930722 -0.1155727 0.02123347 0.9930578 -0.1157644 0.02085252 -0.01680493 0.4229951 -0.9059762 0.1782147 -0.3832077 0.9063066 0.3899419 -0.3832095 0.8373146 -0.2331424 0.4229965 -0.8756247 0.9930578 -0.1157644 0.02085252 0.9930722 -0.1155727 0.02123347 0.9993745 -0.01661957 -0.0312174 0.9993779 -0.01657775 -0.03112859 -0.2331424 0.4229965 -0.8756247 0.3899419 -0.3832095 0.8373146 0.578989 -0.3832107 0.7196676 -0.4359149 0.4229976 -0.7943873 0.9993779 -0.01657775 -0.03112859 0.9993745 -0.01661957 -0.0312174 0.9930692 0.0840988 -0.08210374 0.9930254 0.08351871 -0.08321811 -0.4359149 0.4229976 -0.7943873 0.578989 -0.3832107 0.7196676 0.7344016 -0.383207 0.5601846 -0.6133639 0.4229946 -0.6669785 0.9930254 0.08351871 -0.08321811 0.9930692 0.0840988 -0.08210374 0.9753854 0.1842523 -0.1211384 0.9752426 0.182349 -0.1251031 -0.6133639 0.4229946 -0.6669785 0.7344016 -0.383207 0.5601846 0.8471125 -0.3832116 0.3681704 -0.7551524 0.4229978 -0.5008172 0.9752426 0.182349 -0.1251031 0.9753854 0.1842523 -0.1211384 0.9498909 0.2801496 -0.1386492 0.949632 0.2766785 -0.1471331 -0.7551524 0.4229978 -0.5008172 0.8471125 -0.3832116 0.3681704 0.9106093 -0.3832096 0.1547294 -0.8530644 0.4229978 -0.3055391 0.949632 0.2766785 -0.1471331 0.9498909 0.2801496 -0.1386492 0.9220353 0.3654318 -0.127713 0.9217076 0.3609903 -0.1419194 -0.8530644 0.4229978 -0.3055391 0.9106093 -0.3832096 0.1547294 0.9211765 -0.3832159 -0.06767289 -0.9013931 0.4230028 -0.09251659 0.9217076 0.3609903 -0.1419194 0.9220353 0.3654318 -0.127713 0.8982426 0.4308083 -0.08697428 0.8979571 0.4269102 -0.1068678 -0.9013931 0.4230028 -0.09251659 0.9211765 -0.3832159 -0.06767289 0.8782132 -0.3832081 -0.2861699 -0.8973436 0.4229953 0.1258951 0.8979571 0.4269102 -0.1068678 0.8982426 0.4308083 -0.08697428 0.8844564 0.4660272 -0.02357222 0.8843418 0.464454 -0.04713985 -0.8973436 0.4229953 0.1258951 0.8782132 -0.3832081 -0.2861699 0.7842124 -0.3832032 -0.4880229 -0.8411428 0.4229898 0.3369845 0.8843418 0.464454 -0.04713985 0.8844564 0.4660272 -0.02357222 0.884349 0.4644397 0.04714594 0.8844637 0.4660134 0.02357128 -0.8411428 0.4229898 0.3369845 0.7842124 -0.3832032 -0.4880229 0.6446339 -0.3832037 -0.6615151 -0.7360554 0.4229903 0.5284899 0.8844637 0.4660134 0.02357128 0.884349 0.4644397 0.04714594 0.8979633 0.4268961 0.1068729 0.8982487 0.4307915 0.08699361 -0.7360554 0.4229903 0.5284899 0.6446339 -0.3832037 -0.6615151 0.4675887 -0.3832037 -0.796565 -0.5881916 0.4229915 0.6892815 0.8982487 0.4307915 0.08699361 0.8979633 0.4268961 0.1068729 0.9217077 0.3609885 0.1419235 0.9220353 0.3654335 0.1277078 -0.5881916 0.4229915 0.6892815 0.4675887 -0.3832037 -0.796565 0.2633747 -0.3832096 -0.885316 -0.4061388 0.4229956 0.810016 0.9220353 0.3654335 0.1277078 0.9217077 0.3609885 0.1419235 0.9496312 0.276659 0.1471746 0.9498907 0.2801335 0.1386835 -0.4061388 0.4229956 0.810016 0.2633747 -0.3832096 -0.885316 0.04384509 -0.3832107 -0.9226198 -0.2004873 0.4229974 0.8836731 0.9498907 0.2801335 0.1386835 0.9496312 0.276659 0.1471746 0.9752433 0.1823492 0.1250976 0.9753847 0.184243 0.1211581 -0.2004873 0.4229974 0.8836731 0.04384509 -0.3832107 -0.9226198 -0.1782136 -0.3832092 -0.9063061 0.01680376 0.4229967 0.9059755 0.9753847 0.184243 0.1211581 0.9752433 0.1823492 0.1250976 0.9930263 0.08352818 0.08319788 0.9930692 0.08410218 0.08210146 0.01680376 0.4229967 0.9059755 -0.1782136 -0.3832092 -0.9063061 -0.3899276 -0.3832096 -0.8373212 0.2331299 0.4229969 0.8756278 0.9930692 0.08410218 0.08210146 0.9930263 0.08352818 0.08319788 0.9993788 -0.01656449 0.03110943 0.999376 -0.01660067 0.03117759 0.2331299 0.4229969 0.8756278 -0.3899276 -0.3832096 -0.8373212 -0.5789872 -0.3832104 -0.7196691 0.4359146 0.4229969 0.794388 -0.7344012 -0.3832047 -0.5601866 0.6133623 0.4229923 0.6669815 0.4359146 0.4229969 0.794388 -0.5789872 -0.3832104 -0.7196691 0.9930567 -0.1157786 -0.02082554 0.9930717 -0.1155793 -0.02121784 0.999376 -0.01660067 0.03117759 0.9993788 -0.01656449 0.03110943</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_needles_8Shape9-texbinormals-array" count="796" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_needles_8Shape9-vertices" name="qt_gauge_needles_8Shape9-vertices">
+ <input semantic="POSITION" source="#qt_gauge_needles_8Shape9-positions"/>
+ </vertices>
+ <triangles material="lambert2SG" count="60">
+ <input semantic="VERTEX" source="#qt_gauge_needles_8Shape9-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_8Shape9-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_8Shape9-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_8Shape9-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_8Shape9-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_8Shape9-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_8Shape9-texbinormals" offset="3" set="0"/>
+ <p>1 0 30 0 3 1 27 1 5 3 32 3 5 3 32 3 3 1 27 1 6 2 26 2 2 4 3 4 0 5 5 5 7 7 8 7 7 7 8 7 0 5 5 5 4 6 1 6 8 8 9 8 9 9 6 9 15 11 15 11 15 11 15 11 9 9 6 9 14 10 4 10 9 12 6 12 8 13 9 13 10 15 2 15 10 15 2 15 8 13 9 13 11 14 12 14 11 17 12 17 13 18 13 18 10 16 2 16 10 16 2 16 13 18 13 18 12 19 7 19 12 20 7 20 13 21 13 21 14 23 4 23 14 23 4 23 13 21 13 21 15 22 15 22 16 24 17 24 17 25 16 25 23 27 23 27 23 27 23 27 17 25 16 25 22 26 14 26 17 28 16 28 16 29 17 29 18 31 10 31 18 31 10 31 16 29 17 29 19 30 20 30 19 33 20 33 21 34 21 34 18 32 10 32 18 32 10 32 21 34 21 34 20 35 11 35 20 36 11 36 21 37 21 37 22 39 14 39 22 39 14 39 21 37 21 37 23 38 23 38 24 40 25 40 25 41 24 41 31 43 31 43 31 43 31 43 25 41 24 41 30 42 22 42 25 44 24 44 24 45 25 45 26 47 18 47 26 47 18 47 24 45 25 45 27 46 28 46 27 49 28 49 29 50 29 50 26 48 18 48 26 48 18 48 29 50 29 50 28 51 19 51 28 52 19 52 29 53 29 53 30 55 22 55 30 55 22 55 29 53 29 53 31 54 0 54 4 56 1 56 9 12 6 57 7 57 8 59 7 57 8 59 9 12 6 57 10 15 2 58 0 58 5 60 2 59 3 61 14 23 4 63 14 23 4 63 2 59 3 61 12 20 7 62 0 60 5 64 14 10 4 65 4 61 1 67 4 61 1 67 14 10 4 65 9 9 6 66 2 62 3 69 7 63 8 70 12 19 7 68 12 19 7 68 7 63 8 70 10 16 2 71 8 13 9 72 17 28 16 73 11 14 12 75 11 14 12 75 17 28 16 73 18 31 10 74 13 18 13 77 11 17 12 78 20 35 11 76 20 35 11 76 11 17 12 78 18 32 10 79 15 22 15 80 13 21 13 81 22 39 14 83 22 39 14 83 13 21 13 81 20 36 11 82 15 11 15 85 22 26 14 86 8 8 9 84 8 8 9 84 22 26 14 86 17 25 16 87 16 29 17 88 25 44 24 89 19 30 20 91 19 30 20 91 25 44 24 89 26 47 18 90 21 34 21 93 19 33 20 94 28 51 19 92 28 51 19 92 19 33 20 94 26 48 18 95 23 38 23 96 21 37 21 97 30 55 22 99 30 55 22 99 21 37 21 97 28 52 19 98 23 27 23 101 30 42 22 102 16 24 17 100 16 24 17 100 30 42 22 102 25 41 24 103 24 45 25 104 5 64 32 105 27 46 28 107 27 46 28 107 5 64 32 105 6 65 26 106 29 50 29 109 27 49 28 110 3 66 27 108 3 66 27 108 27 49 28 110 6 67 26 111 31 54 0 112 29 53 29 113 1 69 30 115 1 69 30 115 29 53 29 113 3 68 27 114 31 43 31 117 1 70 30 118 24 40 25 116 24 40 25 116 1 70 30 118 5 71 32 119</p>
+ </triangles>
+ <triangles material="lambert3SG" count="312">
+ <input semantic="VERTEX" source="#qt_gauge_needles_8Shape9-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_needles_8Shape9-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_needles_8Shape9-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_needles_8Shape9-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_needles_8Shape9-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_needles_8Shape9-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_needles_8Shape9-texbinormals" offset="3" set="0"/>
+ <p>33 72 33 120 32 73 34 121 58 74 35 122 34 75 36 123 33 72 33 124 58 74 35 125 35 76 37 126 34 75 36 127 58 74 35 128 36 77 38 129 35 76 37 130 58 74 35 131 37 78 39 132 36 77 38 133 58 74 35 134 38 79 40 135 37 78 39 136 58 74 35 137 39 80 41 138 38 79 40 139 58 74 35 140 40 81 42 141 39 80 41 142 58 74 35 143 41 82 43 144 40 81 42 145 58 74 35 146 42 83 44 147 41 82 43 148 58 74 35 149 43 84 45 150 42 83 44 151 58 74 35 152 44 85 46 153 43 84 45 154 58 74 35 155 45 86 47 156 44 85 46 157 58 74 35 158 46 87 48 159 45 86 47 160 58 74 35 161 47 88 49 162 46 87 48 163 58 74 35 164 48 89 50 165 47 88 49 166 58 74 35 167 49 90 51 168 48 89 50 169 58 74 35 170 50 91 52 171 49 90 51 172 58 74 35 173 51 92 53 174 50 91 52 175 58 74 35 176 52 93 54 177 51 92 53 178 58 74 35 179 53 94 55 180 52 93 54 181 58 74 35 182 54 95 56 183 53 94 55 184 58 74 35 185 55 96 57 186 54 95 56 187 58 74 35 188 56 97 58 189 55 96 57 190 58 74 35 191 57 98 59 192 56 97 58 193 58 74 35 194 32 73 34 195 57 98 59 196 58 74 35 197 60 99 60 198 61 100 61 199 110 102 63 201 110 102 63 201 61 100 61 199 111 101 62 200 61 100 64 202 60 99 65 203 63 104 67 205 63 104 67 205 60 99 65 203 62 103 66 204 63 104 68 206 62 103 66 207 65 106 70 209 65 106 70 209 62 103 66 207 64 105 69 208 65 106 71 210 64 105 69 211 67 108 73 213 67 108 73 213 64 105 69 211 66 107 72 212 67 108 74 214 66 107 72 215 69 110 76 217 69 110 76 217 66 107 72 215 68 109 75 216 69 110 77 218 68 109 75 219 71 112 79 221 71 112 79 221 68 109 75 219 70 111 78 220 71 112 80 222 70 111 78 223 73 114 82 225 73 114 82 225 70 111 78 223 72 113 81 224 73 114 83 226 72 113 81 227 75 116 85 229 75 116 85 229 72 113 81 227 74 115 84 228 75 116 86 230 74 115 84 231 77 118 88 233 77 118 88 233 74 115 84 231 76 117 87 232 77 118 89 234 76 117 87 235 79 120 91 237 79 120 91 237 76 117 87 235 78 119 90 236 79 120 92 238 78 119 90 239 81 122 94 241 81 122 94 241 78 119 90 239 80 121 93 240 81 122 95 242 80 121 93 243 83 124 97 245 83 124 97 245 80 121 93 243 82 123 96 244 83 124 98 246 82 123 96 247 85 126 100 249 85 126 100 249 82 123 96 247 84 125 99 248 85 126 101 250 84 125 99 251 87 128 103 253 87 128 103 253 84 125 99 251 86 127 102 252 87 128 104 254 86 127 102 255 89 130 106 257 89 130 106 257 86 127 102 255 88 129 105 256 89 130 107 258 88 129 105 259 91 132 109 261 91 132 109 261 88 129 105 259 90 131 108 260 91 132 110 262 90 131 108 263 93 134 112 265 93 134 112 265 90 131 108 263 92 133 111 264 93 134 113 266 92 133 111 267 95 136 115 269 95 136 115 269 92 133 111 267 94 135 114 268 95 136 116 270 94 135 114 271 97 138 118 273 97 138 118 273 94 135 114 271 96 137 117 272 97 138 119 274 96 137 117 275 99 140 121 277 99 140 121 277 96 137 117 275 98 139 120 276 99 140 122 278 98 139 120 279 101 142 124 281 101 142 124 281 98 139 120 279 100 141 123 280 101 142 125 282 100 141 123 283 103 144 127 285 103 144 127 285 100 141 123 283 102 143 126 284 103 144 128 286 102 143 126 287 105 146 130 289 105 146 130 289 102 143 126 287 104 145 129 288 105 146 131 290 104 145 129 291 107 148 133 293 107 148 133 293 104 145 129 291 106 147 132 292 107 148 134 294 106 147 132 295 109 150 136 297 109 150 136 297 106 147 132 295 108 149 135 296 109 150 137 298 108 149 135 299 111 101 138 301 111 101 138 301 108 149 135 299 110 102 63 300 32 151 139 302 33 152 140 303 60 154 65 305 60 154 65 305 33 152 140 303 62 153 66 304 33 152 140 306 34 155 141 307 62 153 66 309 62 153 66 309 34 155 141 307 64 156 69 308 34 155 141 310 35 157 142 311 64 156 69 313 64 156 69 313 35 157 142 311 66 158 72 312 35 157 142 314 36 159 143 315 66 158 72 317 66 158 72 317 36 159 143 315 68 160 75 316 36 159 143 318 37 161 144 319 68 160 75 321 68 160 75 321 37 161 144 319 70 162 78 320 37 161 144 322 38 163 145 323 70 162 78 325 70 162 78 325 38 163 145 323 72 164 81 324 38 163 145 326 39 165 146 327 72 164 81 329 72 164 81 329 39 165 146 327 74 166 84 328 39 165 146 330 40 167 147 331 74 166 84 333 74 166 84 333 40 167 147 331 76 168 87 332 40 167 147 334 41 169 148 335 76 168 87 337 76 168 87 337 41 169 148 335 78 170 90 336 41 169 148 338 42 171 149 339 78 170 90 341 78 170 90 341 42 171 149 339 80 172 93 340 42 171 149 342 43 173 150 343 80 172 93 345 80 172 93 345 43 173 150 343 82 174 96 344 43 173 150 346 44 175 151 347 82 174 96 349 82 174 96 349 44 175 151 347 84 176 99 348 44 175 151 350 45 177 152 351 84 176 99 353 84 176 99 353 45 177 152 351 86 178 102 352 45 177 152 354 46 179 153 355 86 178 102 357 86 178 102 357 46 179 153 355 88 180 105 356 46 179 153 358 47 181 154 359 88 180 105 361 88 180 105 361 47 181 154 359 90 182 108 360 47 181 154 362 48 183 155 363 90 182 108 365 90 182 108 365 48 183 155 363 92 184 111 364 48 183 155 366 49 185 156 367 92 184 111 369 92 184 111 369 49 185 156 367 94 186 114 368 49 185 156 370 50 187 157 371 94 186 114 373 94 186 114 373 50 187 157 371 96 188 117 372 50 187 157 374 51 189 158 375 96 188 117 377 96 188 117 377 51 189 158 375 98 190 120 376 51 189 158 378 52 191 159 379 98 190 120 381 98 190 120 381 52 191 159 379 100 192 123 380 52 191 159 382 53 193 160 383 100 192 123 385 100 192 123 385 53 193 160 383 102 194 126 384 53 193 160 386 54 195 161 387 102 194 126 389 102 194 126 389 54 195 161 387 104 196 129 388 54 195 161 390 55 197 162 391 104 196 129 393 104 196 129 393 55 197 162 391 106 198 132 392 55 197 162 394 56 199 163 395 106 198 132 397 106 198 132 397 56 199 163 395 108 200 135 396 56 199 163 398 57 201 164 399 108 200 135 401 108 200 135 401 57 201 164 399 110 202 63 400 57 201 164 402 32 151 165 403 110 202 63 405 110 202 63 405 32 151 165 403 60 154 60 404 112 203 166 406 115 204 167 407 59 205 168 408 115 204 167 409 118 206 169 410 59 205 168 411 118 206 169 412 121 207 170 413 59 205 168 414 121 207 170 415 124 208 171 416 59 205 168 417 124 208 171 418 127 209 172 419 59 205 168 420 127 209 172 421 130 210 173 422 59 205 168 423 130 210 173 424 133 211 174 425 59 205 168 426 133 211 174 427 136 212 175 428 59 205 168 429 136 212 175 430 139 213 176 431 59 205 168 432 139 213 176 433 142 214 177 434 59 205 168 435 142 214 177 436 145 215 178 437 59 205 168 438 145 215 178 439 148 216 179 440 59 205 168 441 148 216 179 442 151 217 180 443 59 205 168 444 151 217 180 445 154 218 181 446 59 205 168 447 154 218 181 448 157 219 182 449 59 205 168 450 157 219 182 451 160 220 183 452 59 205 168 453 160 220 183 454 163 221 184 455 59 205 168 456 163 221 184 457 166 222 185 458 59 205 168 459 166 222 185 460 169 223 186 461 59 205 168 462 169 223 186 463 172 224 187 464 59 205 168 465 172 224 187 466 175 225 188 467 59 205 168 468 175 225 188 469 178 226 189 470 59 205 168 471 178 226 189 472 181 227 190 473 59 205 168 474 181 227 190 475 184 228 191 476 59 205 168 477 184 228 191 478 187 229 192 479 59 205 168 480 187 229 192 481 112 203 166 482 59 205 168 483 61 230 193 484 63 231 194 485 114 233 196 487 114 233 196 487 63 231 194 485 117 232 195 486 63 231 194 488 65 234 197 489 117 232 195 491 117 232 195 491 65 234 197 489 120 235 198 490 65 234 197 492 67 236 199 493 120 235 198 495 120 235 198 495 67 236 199 493 123 237 200 494 67 236 199 496 69 238 201 497 123 237 200 499 123 237 200 499 69 238 201 497 126 239 202 498 69 238 201 500 71 240 203 501 126 239 202 503 126 239 202 503 71 240 203 501 129 241 204 502 71 240 203 504 73 242 205 505 129 241 204 507 129 241 204 507 73 242 205 505 132 243 206 506 73 242 205 508 75 244 207 509 132 243 206 511 132 243 206 511 75 244 207 509 135 245 208 510 75 244 207 512 77 246 209 513 135 245 208 515 135 245 208 515 77 246 209 513 138 247 210 514 77 246 209 516 79 248 211 517 138 247 210 519 138 247 210 519 79 248 211 517 141 249 212 518 79 248 211 520 81 250 213 521 141 249 212 523 141 249 212 523 81 250 213 521 144 251 214 522 81 250 213 524 83 252 215 525 144 251 214 527 144 251 214 527 83 252 215 525 147 253 216 526 83 252 215 528 85 254 217 529 147 253 216 531 147 253 216 531 85 254 217 529 150 255 218 530 85 254 217 532 87 256 219 533 150 255 218 535 150 255 218 535 87 256 219 533 153 257 220 534 87 256 219 536 89 258 221 537 153 257 220 539 153 257 220 539 89 258 221 537 156 259 222 538 89 258 221 540 91 260 223 541 156 259 222 543 156 259 222 543 91 260 223 541 159 261 224 542 91 260 223 544 93 262 225 545 159 261 224 547 159 261 224 547 93 262 225 545 162 263 226 546 93 262 225 548 95 264 227 549 162 263 226 551 162 263 226 551 95 264 227 549 165 265 228 550 95 264 227 552 97 266 229 553 165 265 228 555 165 265 228 555 97 266 229 553 168 267 230 554 97 266 229 556 99 268 231 557 168 267 230 559 168 267 230 559 99 268 231 557 171 269 232 558 99 268 231 560 101 270 233 561 171 269 232 563 171 269 232 563 101 270 233 561 174 271 234 562 101 270 233 564 103 272 235 565 174 271 234 567 174 271 234 567 103 272 235 565 177 273 236 566 103 272 235 568 105 274 237 569 177 273 236 571 177 273 236 571 105 274 237 569 180 275 238 570 105 274 237 572 107 276 239 573 180 275 238 575 180 275 238 575 107 276 239 573 183 277 240 574 107 276 239 576 109 278 241 577 183 277 240 579 183 277 240 579 109 278 241 577 186 279 242 578 109 278 241 580 111 280 243 581 186 279 242 583 186 279 242 583 111 280 243 581 189 281 244 582 111 280 243 584 61 230 193 585 189 281 244 587 189 281 244 587 61 230 193 585 114 233 196 586 112 282 166 588 113 283 245 589 115 285 167 591 115 285 167 591 113 283 245 589 116 284 246 590 113 286 245 592 114 287 196 593 116 289 246 595 116 289 246 595 114 287 196 593 117 288 195 594 115 285 167 596 116 284 246 597 118 291 169 599 118 291 169 599 116 284 246 597 119 290 247 598 116 289 246 600 117 288 195 601 119 293 247 603 119 293 247 603 117 288 195 601 120 292 198 602 118 291 169 604 119 290 247 605 121 295 170 607 121 295 170 607 119 290 247 605 122 294 248 606 119 293 247 608 120 292 198 609 122 297 248 611 122 297 248 611 120 292 198 609 123 296 200 610 121 295 170 612 122 294 248 613 124 299 171 615 124 299 171 615 122 294 248 613 125 298 249 614 122 297 248 616 123 296 200 617 125 301 249 619 125 301 249 619 123 296 200 617 126 300 202 618 124 299 171 620 125 298 249 621 127 303 172 623 127 303 172 623 125 298 249 621 128 302 250 622 125 301 249 624 126 300 202 625 128 305 250 627 128 305 250 627 126 300 202 625 129 304 204 626 127 303 172 628 128 302 250 629 130 307 173 631 130 307 173 631 128 302 250 629 131 306 251 630 128 305 250 632 129 304 204 633 131 309 251 635 131 309 251 635 129 304 204 633 132 308 206 634 130 307 173 636 131 306 251 637 133 311 174 639 133 311 174 639 131 306 251 637 134 310 252 638 131 309 251 640 132 308 206 641 134 313 252 643 134 313 252 643 132 308 206 641 135 312 208 642 133 311 174 644 134 310 252 645 136 315 175 647 136 315 175 647 134 310 252 645 137 314 253 646 134 313 252 648 135 312 208 649 137 317 253 651 137 317 253 651 135 312 208 649 138 316 210 650 136 315 175 652 137 314 253 653 139 319 176 655 139 319 176 655 137 314 253 653 140 318 254 654 137 317 253 656 138 316 210 657 140 321 254 659 140 321 254 659 138 316 210 657 141 320 212 658 139 319 176 660 140 318 254 661 142 323 177 663 142 323 177 663 140 318 254 661 143 322 255 662 140 321 254 664 141 320 212 665 143 325 255 667 143 325 255 667 141 320 212 665 144 324 214 666 142 323 177 668 143 322 255 669 145 327 178 671 145 327 178 671 143 322 255 669 146 326 256 670 143 325 255 672 144 324 214 673 146 329 256 675 146 329 256 675 144 324 214 673 147 328 216 674 145 327 178 676 146 326 256 677 148 331 179 679 148 331 179 679 146 326 256 677 149 330 257 678 146 329 256 680 147 328 216 681 149 333 257 683 149 333 257 683 147 328 216 681 150 332 218 682 148 331 179 684 149 330 257 685 151 335 180 687 151 335 180 687 149 330 257 685 152 334 258 686 149 333 257 688 150 332 218 689 152 337 258 691 152 337 258 691 150 332 218 689 153 336 220 690 151 335 180 692 152 334 258 693 154 339 181 695 154 339 181 695 152 334 258 693 155 338 259 694 152 337 258 696 153 336 220 697 155 341 259 699 155 341 259 699 153 336 220 697 156 340 222 698 154 339 181 700 155 338 259 701 157 343 182 703 157 343 182 703 155 338 259 701 158 342 260 702 155 341 259 704 156 340 222 705 158 345 260 707 158 345 260 707 156 340 222 705 159 344 224 706 157 343 182 708 158 342 260 709 160 347 183 711 160 347 183 711 158 342 260 709 161 346 261 710 158 345 260 712 159 344 224 713 161 349 261 715 161 349 261 715 159 344 224 713 162 348 226 714 160 347 183 716 161 346 261 717 163 351 184 719 163 351 184 719 161 346 261 717 164 350 262 718 161 349 261 720 162 348 226 721 164 353 262 723 164 353 262 723 162 348 226 721 165 352 228 722 163 351 184 724 164 350 262 725 166 355 185 727 166 355 185 727 164 350 262 725 167 354 263 726 164 353 262 728 165 352 228 729 167 357 263 731 167 357 263 731 165 352 228 729 168 356 230 730 166 355 185 732 167 354 263 733 169 359 186 735 169 359 186 735 167 354 263 733 170 358 264 734 167 357 263 736 168 356 230 737 170 361 264 739 170 361 264 739 168 356 230 737 171 360 232 738 169 359 186 740 170 358 264 741 172 363 187 743 172 363 187 743 170 358 264 741 173 362 265 742 170 361 264 744 171 360 232 745 173 365 265 747 173 365 265 747 171 360 232 745 174 364 234 746 172 363 187 748 173 362 265 749 175 367 188 751 175 367 188 751 173 362 265 749 176 366 266 750 173 365 265 752 174 364 234 753 176 369 266 755 176 369 266 755 174 364 234 753 177 368 236 754 175 367 188 756 176 366 266 757 178 371 189 759 178 371 189 759 176 366 266 757 179 370 267 758 176 369 266 760 177 368 236 761 179 373 267 763 179 373 267 763 177 368 236 761 180 372 238 762 178 371 189 764 179 370 267 765 181 375 190 767 181 375 190 767 179 370 267 765 182 374 268 766 179 373 267 768 180 372 238 769 182 377 268 771 182 377 268 771 180 372 238 769 183 376 240 770 181 375 190 772 182 374 268 773 184 379 191 775 184 379 191 775 182 374 268 773 185 378 269 774 182 377 268 776 183 376 240 777 185 381 269 779 185 381 269 779 183 376 240 777 186 380 242 778 184 379 191 780 185 378 269 781 187 383 192 783 187 383 192 783 185 378 269 781 188 382 270 782 185 381 269 784 186 380 242 785 188 385 270 787 188 385 270 787 186 380 242 785 189 384 244 786 114 287 196 788 113 286 245 789 189 384 244 791 189 384 244 791 113 286 245 789 188 385 270 790 113 283 245 792 112 282 166 793 188 382 270 795 188 382 270 795 112 282 166 793 187 383 192 794</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_needles_8Shape9</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_needles_9" name="qt_gauge_needles_9" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_needles_8Shape9">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#red_transparent"/>
+ <instance_material symbol="lambert3SG" target="#black_solid"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_needles_9</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_1.dae
new file mode 100644
index 0000000..2f94396
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:46:58</created>
+ <modified>2018-03-08T09:46:58</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_ringShape" name="qt_gauge_ringShape">
+ <mesh>
+ <source id="qt_gauge_ringShape-positions" name="qt_gauge_ringShape-positions">
+ <float_array id="qt_gauge_ringShape-positions-array" count="456">10.90175 -0.2759812 0 10.75307 -0.2759812 -1.79437 10.31107 -0.2759812 -3.539794 9.587807 -0.2759812 -5.188662 8.603016 -0.2759812 -6.695996 7.383558 -0.2759812 -8.020681 5.962695 -0.2759812 -9.126583 4.379186 -0.2759812 -9.983536 2.676223 -0.2759812 -10.56816 0.9002604 -0.2759812 -10.86452 -0.9002592 -0.2759812 -10.86452 -2.676222 -0.2759812 -10.56816 -4.379185 -0.2759812 -9.983537 -5.962695 -0.2759812 -9.126585 -7.383558 -0.2759812 -8.020683 -8.603018 -0.2759812 -6.695998 -9.58781 -0.2759812 -5.188663 -10.31107 -0.2759812 -3.539795 -10.75307 -0.2759812 -1.794371 -10.90176 -0.2759812 0 -10.75307 -0.2759812 1.79437 -10.31107 -0.2759812 3.539794 -9.58781 -0.2759812 5.188663 -8.603019 -0.2759812 6.695998 -7.38356 -0.2759812 8.020683 -5.962697 -0.2759812 9.126586 -4.379187 -0.2759812 9.98354 -2.676224 -0.2759812 10.56817 -0.9002606 -0.2759812 10.86452 0.9002598 -0.2759812 10.86452 2.676223 -0.2759812 10.56817 4.379187 -0.2759812 9.983541 5.962697 -0.2759812 9.126589 7.383561 -0.2759812 8.020687 8.603021 -0.2759812 6.696001 9.587812 -0.2759812 5.188665 10.31107 -0.2759812 3.539797 10.75307 -0.2759812 1.794372 10.90175 0.2759812 0 10.75307 0.2759812 -1.79437 10.31107 0.2759812 -3.539794 9.587807 0.2759812 -5.188662 8.603016 0.2759812 -6.695996 7.383558 0.2759812 -8.020681 5.962695 0.2759812 -9.126583 4.379186 0.2759812 -9.983536 2.676223 0.2759812 -10.56816 0.9002604 0.2759812 -10.86452 -0.9002592 0.2759812 -10.86452 -2.676222 0.2759812 -10.56816 -4.379185 0.2759812 -9.983537 -5.962695 0.2759812 -9.126585 -7.383558 0.2759812 -8.020683 -8.603018 0.2759812 -6.695998 -9.58781 0.2759812 -5.188663 -10.31107 0.2759812 -3.539795 -10.75307 0.2759812 -1.794371 -10.90176 0.2759812 0 -10.75307 0.2759812 1.79437 -10.31107 0.2759812 3.539794 -9.58781 0.2759812 5.188663 -8.603019 0.2759812 6.695998 -7.38356 0.2759812 8.020683 -5.962697 0.2759812 9.126586 -4.379187 0.2759812 9.98354 -2.676224 0.2759812 10.56817 -0.9002606 0.2759812 10.86452 0.9002598 0.2759812 10.86452 2.676223 0.2759812 10.56817 4.379187 0.2759812 9.983541 5.962697 0.2759812 9.126589 7.383561 0.2759812 8.020687 8.603021 0.2759812 6.696001 9.587812 0.2759812 5.188665 10.31107 0.2759812 3.539797 10.75307 0.2759812 1.794372 11.40175 0.2759812 0 11.24625 0.2759812 -1.876667 10.78398 0.2759812 -3.702144 10.02754 0.2759812 -5.426635 8.997585 0.2759812 -7.003102 7.722198 0.2759812 -8.388543 6.236168 0.2759812 -9.545167 4.580032 0.2759812 -10.44142 2.798965 0.2759812 -11.05286 0.9415492 0.2759812 -11.36281 -0.9415497 0.2759812 -11.36281 -2.798965 0.2759812 -11.05286 -4.580033 0.2759812 -10.44142 -6.236169 0.2759812 -9.545167 -7.722198 0.2759812 -8.388544 -8.997587 0.2759812 -7.003103 -10.02754 0.2759812 -5.426636 -10.78398 0.2759812 -3.702144 -11.24625 0.2759812 -1.876667 -11.40176 0.2759812 0 -11.24625 0.2759812 1.876667 -10.78398 0.2759812 3.702144 -10.02754 0.2759812 5.426636 -8.997587 0.2759812 7.003104 -7.722199 0.2759812 8.388545 -6.23617 0.2759812 9.545169 -4.580034 0.2759812 10.44143 -2.798966 0.2759812 11.05287 -0.9415497 0.2759812 11.36281 0.9415497 0.2759812 11.36281 2.798966 0.2759812 11.05287 4.580034 0.2759812 10.44143 6.23617 0.2759812 9.54517 7.7222 0.2759812 8.388547 8.997589 0.2759812 7.003106 10.02755 0.2759812 5.426639 10.78398 0.2759812 3.702146 11.24625 0.2759812 1.876669 11.40175 -0.2759812 0 11.24625 -0.2759812 -1.876667 10.78398 -0.2759812 -3.702144 10.02754 -0.2759812 -5.426635 8.997585 -0.2759812 -7.003102 7.722198 -0.2759812 -8.388543 6.236168 -0.2759812 -9.545167 4.580032 -0.2759812 -10.44142 2.798965 -0.2759812 -11.05286 0.9415492 -0.2759812 -11.36281 -0.9415497 -0.2759812 -11.36281 -2.798965 -0.2759812 -11.05286 -4.580033 -0.2759812 -10.44142 -6.236169 -0.2759812 -9.545167 -7.722198 -0.2759812 -8.388544 -8.997587 -0.2759812 -7.003103 -10.02754 -0.2759812 -5.426636 -10.78398 -0.2759812 -3.702144 -11.24625 -0.2759812 -1.876667 -11.40176 -0.2759812 0 -11.24625 -0.2759812 1.876667 -10.78398 -0.2759812 3.702144 -10.02754 -0.2759812 5.426636 -8.997587 -0.2759812 7.003104 -7.722199 -0.2759812 8.388545 -6.23617 -0.2759812 9.545169 -4.580034 -0.2759812 10.44143 -2.798966 -0.2759812 11.05287 -0.9415497 -0.2759812 11.36281 0.9415497 -0.2759812 11.36281 2.798966 -0.2759812 11.05287 4.580034 -0.2759812 10.44143 6.23617 -0.2759812 9.54517 7.7222 -0.2759812 8.388547 8.997589 -0.2759812 7.003106 10.02755 -0.2759812 5.426639 10.78398 -0.2759812 3.702146 11.24625 -0.2759812 1.876669</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ringShape-positions-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ringShape-normals" name="qt_gauge_ringShape-normals">
+ <float_array id="qt_gauge_ringShape-normals-array" count="912">-0.9863613 0 0.1645945 -1 0 0 -1 0 0 -0.9863613 0 0.1645945 -0.9458172 0 0.3246996 -0.9458172 0 0.3246996 -0.8794737 0 0.4759476 -0.8794737 0 0.4759476 -0.7891406 0 0.6142125 -0.7891406 0 0.6142125 -0.6772816 0 0.7357238 -0.6772816 0 0.7357238 -0.5469481 0 0.8371664 -0.5469481 0 0.8371664 -0.4016956 0 0.9157732 -0.4016956 0 0.9157732 -0.2454858 0 0.9694002 -0.2454858 0 0.9694002 -0.08257951 0 0.9965845 -0.08257951 0 0.9965845 0.08257951 0 0.9965845 0.08257951 0 0.9965845 0.2454855 0 0.9694002 0.2454855 0 0.9694002 0.4016952 0 0.9157735 0.4016952 0 0.9157735 0.5469478 0 0.8371668 0.5469478 0 0.8371668 0.6772813 0 0.7357242 0.6772813 0 0.7357242 0.7891403 0 0.614213 0.7891403 0 0.614213 0.8794736 0 0.4759476 0.8794736 0 0.4759476 0.9458173 0 0.3246995 0.9458173 0 0.3246995 0.9863612 0 0.1645945 0.9863612 0 0.1645945 1 0 0 1 0 0 0.9863613 0 -0.1645944 0.9863613 0 -0.1645944 0.9458172 0 -0.3246995 0.9458172 0 -0.3246995 0.8794738 0 -0.4759474 0.8794738 0 -0.4759474 0.7891405 0 -0.6142126 0.7891405 0 -0.6142126 0.6772817 0 -0.7357237 0.6772817 0 -0.7357237 0.5469485 0 -0.8371662 0.5469485 0 -0.8371662 0.4016958 0 -0.9157731 0.4016958 0 -0.9157731 0.2454857 0 -0.9694002 0.2454857 0 -0.9694002 0.08257944 0 -0.9965844 0.08257944 0 -0.9965844 -0.08257946 0 -0.9965845 -0.08257946 0 -0.9965845 -0.2454852 0 -0.9694003 -0.2454852 0 -0.9694003 -0.4016951 0 -0.9157735 -0.4016951 0 -0.9157735 -0.546948 0 -0.8371666 -0.546948 0 -0.8371666 -0.6772814 0 -0.735724 -0.6772814 0 -0.735724 -0.7891405 0 -0.6142128 -0.7891405 0 -0.6142128 -0.8794737 0 -0.4759475 -0.8794737 0 -0.4759475 -0.9458173 0 -0.3246994 -0.9458173 0 -0.3246994 -0.9863616 0 -0.1645928 -0.9863616 0 -0.1645928 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0.9863613 0 -0.1645947 0.9999999 0 0 0.9999999 0 0 0.9863613 0 -0.1645947 0.9458172 0 -0.3246996 0.9458172 0 -0.3246996 0.8794736 0 -0.4759475 0.8794736 0 -0.4759475 0.7891405 0 -0.6142128 0.7891405 0 -0.6142128 0.6772818 0 -0.7357237 0.6772818 0 -0.7357237 0.5469484 0 -0.8371663 0.5469484 0 -0.8371663 0.4016953 0 -0.9157735 0.4016953 0 -0.9157735 0.2454852 0 -0.9694004 0.2454852 0 -0.9694004 0.08257937 0 -0.9965845 0.08257937 0 -0.9965845 -0.08257937 0 -0.9965845 -0.08257937 0 -0.9965845 -0.2454852 0 -0.9694004 -0.2454852 0 -0.9694004 -0.4016953 0 -0.9157735 -0.4016953 0 -0.9157735 -0.5469483 0 -0.8371665 -0.5469483 0 -0.8371665 -0.6772815 0 -0.735724 -0.6772815 0 -0.735724 -0.7891403 0 -0.6142129 -0.7891403 0 -0.6142129 -0.8794737 0 -0.4759475 -0.8794737 0 -0.4759475 -0.9458172 0 -0.3246996 -0.9458172 0 -0.3246996 -0.9863613 0 -0.1645947 -0.9863613 0 -0.1645947 -1 0 0 -1 0 0 -0.9863613 0 0.1645946 -0.9863613 0 0.1645946 -0.9458172 0 0.3246995 -0.9458172 0 0.3246995 -0.8794737 0 0.4759475 -0.8794737 0 0.4759475 -0.7891406 0 0.6142126 -0.7891406 0 0.6142126 -0.6772818 0 0.7357237 -0.6772818 0 0.7357237 -0.5469484 0 0.8371663 -0.5469484 0 0.8371663 -0.4016954 0 0.9157733 -0.4016954 0 0.9157733 -0.2454854 0 0.9694002 -0.2454854 0 0.9694002 -0.08257935 0 0.9965845 -0.08257935 0 0.9965845 0.08257935 0 0.9965845 0.08257935 0 0.9965845 0.2454852 0 0.9694003 0.2454852 0 0.9694003 0.4016952 0 0.9157735 0.4016952 0 0.9157735 0.5469481 0 0.8371665 0.5469481 0 0.8371665 0.6772813 0 0.7357241 0.6772813 0 0.7357241 0.7891403 0 0.614213 0.7891403 0 0.614213 0.8794736 0 0.4759476 0.8794736 0 0.4759476 0.9458172 0 0.3246995 0.9458172 0 0.3246995 0.9863616 0 0.1645933 0.9863616 0 0.1645933 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999998 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999998 0 0 -0.9999999 0 0 -0.9999998 0 0 -1 0 0 -0.9999998 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999998 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ringShape-normals-array" count="304" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ringShape-tangents" name="qt_gauge_ringShape-tangents">
+ <float_array id="qt_gauge_ringShape-tangents-array" count="912">0.1645945 0 0.9863614 0 0.9999999 0 0 0 -1 0 -1 0 0.3246996 0 0.9458172 0 -1 0 0.4759475 0 0.8794736 0 -1 0 0.6142126 0 0.7891407 0 -0.9999999 0 0.7357239 0 0.6772817 0 -1 0 0.8371665 0 0.5469482 0 -1 0 0.9157732 0 0.4016956 0 -1 0 0.9694002 0 0.2454858 0 -0.9999999 0 0.9965845 0 0.08257951 0 -1 0 0.9965845 0 -0.08257951 0 -1 0 0.9694002 0 -0.2454855 0 -0.9999999 0 0.9157735 0 -0.4016952 0 -0.9999999 0 0.8371668 0 -0.5469478 0 -1 0 0.7357242 0 -0.6772813 0 -0.9999999 0 0.614213 0 -0.7891403 0 -1 0 0.4759477 0 -0.8794736 0 -1 0 0.3246995 0 -0.9458172 0 -1 0 0.1645945 0 -0.9863613 0 -0.9999999 0 0 0 -1 0 -0.9999999 0 -0.1645945 0 -0.9863614 0 -1 0 -0.3246995 0 -0.9458174 0 -1 0 -0.4759474 0 -0.8794738 0 -1 0 -0.6142127 0 -0.7891406 0 -1 0 -0.7357237 0 -0.6772817 0 -0.9999999 0 -0.8371662 0 -0.5469485 0 -1 0 -0.9157733 0 -0.4016958 0 -1 0 -0.9694002 0 -0.2454857 0 -1 0 -0.9965845 0 -0.08257945 0 -1 0 -0.9965845 0 0.08257946 0 -1 0 -0.9694003 0 0.2454852 0 -1 0 -0.9157735 0 0.401695 0 -1 0 -0.8371667 0 0.546948 0 -1 0 -0.7357241 0 0.6772814 0 -1 0 -0.6142128 0 0.7891405 0 -0.9999999 0 -0.4759475 0 0.8794737 0 -1 0 -0.3246994 0 0.9458172 0 -1 0 -0.1645928 0 0.9863616 0 -1 0 0.1645948 0 0.9863614 0.9965845 0 -0.0825792 0 0 -1 -0.9965845 0 0.0825794 0.3246998 0 0.9458172 -0.9694002 0 0.2454856 0.4759478 0 0.8794736 -0.9157733 0 0.4016956 0.6142132 0 0.7891402 -0.8371664 0 0.5469484 0.7357248 0 0.6772807 -0.735724 0 0.6772815 0.8371677 0 0.5469465 -0.614213 0 0.7891403 0.9157745 0 0.401693 -0.4759476 0 0.8794737 0.9694009 0 0.2454835 -0.3246992 0 0.9458174 0.9965847 0 0.08257753 -0.1645947 0 0.9863613 0.9965844 0 -0.08258097 0 0 1 0.9694 0 -0.2454866 0.1645947 0 0.9863613 0.9157731 0 -0.4016961 0.3246992 0 0.9458174 0.8371656 0 -0.5469496 0.4759476 0 0.8794736 0.7357234 0 -0.6772822 0.6142126 0 0.7891406 0.6142125 0 -0.7891406 0.7357237 0 0.6772817 0.4759472 0 -0.879474 0.8371664 0 0.5469484 0.3246987 0 -0.9458175 0.9157733 0 0.4016955 0.1645937 0 -0.9863615 0.9694002 0 0.2454855 0 0 -1 0.9965845 0 0.08257939 -0.1645955 0 -0.9863611 0.9965845 0 -0.08257939 -0.3247004 0 -0.945817 0.9694002 0 -0.2454855 -0.4759486 0 -0.8794731 0.9157733 0 -0.4016955 -0.6142141 0 -0.7891395 0.8371664 0 -0.5469482 -0.7357253 0 -0.6772801 0.7357241 0 -0.6772813 -0.8371674 0 -0.5469466 0.6142129 0 -0.7891403 -0.9157739 0 -0.4016944 0.4759476 0 -0.8794736 -0.9694006 0 -0.2454844 0.3246996 0 -0.9458172 -0.9965846 0 -0.08257855 0.1645946 0 -0.9863613 -0.9965845 0 0.0825801 0 0 -1 -0.9694001 0 0.2454862 -0.1645946 0 -0.9863613 -0.9157732 0 0.4016959 -0.3246991 0 -0.9458173 -0.8371659 0 0.5469491 -0.4759475 0 -0.8794737 -0.7357235 0 0.677282 -0.6142124 0 -0.7891406 -0.6142129 0 0.7891404 -0.7357237 0 -0.6772817 -0.4759479 0 0.8794735 -0.8371662 0 -0.5469486 -0.3246996 0 0.9458173 -0.9157733 0 -0.4016954 -0.1645946 0 0.9863614 -0.9694002 0 -0.2454855 0.1645947 0 0.9863614 0 -1 0 0 0 -1 0 1 0 0.3246996 0 0.9458172 0 1 0 0.4759475 0 0.8794736 0 1 0 0.6142128 0 0.7891405 0 1 0 0.7357237 0 0.6772818 0 0.9999999 0 0.8371663 0 0.5469484 0 1 0 0.9157733 0 0.4016953 0 1 0 0.9694003 0 0.2454852 0 1 0 0.9965845 0 0.08257937 0 1 0 0.9965845 0 -0.08257937 0 1 0 0.9694003 0 -0.2454852 0 1 0 0.9157733 0 -0.4016953 0 1 0 0.8371665 0 -0.5469483 0 1 0 0.735724 0 -0.6772815 0 1 0 0.6142129 0 -0.7891404 0 1 0 0.4759475 0 -0.8794737 0 1 0 0.3246996 0 -0.9458172 0 0.9999999 0 0.1645947 0 -0.9863614 0 1 0 0 0 -1 0 1 0 -0.1645947 0 -0.9863614 0 1 0 -0.3246996 0 -0.9458174 0 1 0 -0.4759475 0 -0.8794737 0 1 0 -0.6142126 0 -0.7891406 0 1 0 -0.7357237 0 -0.6772818 0 1 0 -0.8371663 0 -0.5469484 0 1 0 -0.9157733 0 -0.4016955 0 1 0 -0.9694003 0 -0.2454854 0 0.9999999 0 -0.9965845 0 -0.08257935 0 1 0 -0.9965845 0 0.08257935 0 1 0 -0.9694003 0 0.2454852 0 0.9999999 0 -0.9157735 0 0.4016952 0 1 0 -0.8371665 0 0.5469481 0 0.9999999 0 -0.7357242 0 0.6772813 0 1 0 -0.614213 0 0.7891403 0 1 0 -0.4759476 0 0.8794737 0 0.9999999 0 -0.3246996 0 0.9458174 0 1 0 -0.1645933 0 0.9863614 0 0.9999999 0 0.1645948 0 0.9863613 -0.9965845 0 0.0825794 0 0 -1 0.9965845 0 -0.0825792 0.3246998 0 0.9458172 0.9694003 0 -0.2454854 0.4759478 0 0.8794735 0.9157732 0 -0.4016957 0.6142132 0 0.7891402 0.8371665 0 -0.5469481 0.7357249 0 0.6772807 0.735724 0 -0.6772814 0.8371676 0 0.5469465 0.6142127 0 -0.7891405 0.9157744 0 0.401693 0.4759475 0 -0.8794737 0.9694008 0 0.2454835 0.3246997 0 -0.9458172 0.9965847 0 0.08257753 0.1645948 0 -0.9863612 0.9965844 0 -0.08258096 0 0 -0.9999999 0.9694 0 -0.2454866 -0.1645948 0 -0.9863613 0.9157731 0 -0.4016961 -0.3246992 0 -0.9458174 0.8371657 0 -0.5469496 -0.475947 0 -0.879474 0.7357234 0 -0.6772822 -0.6142125 0 -0.7891408 0.6142126 0 -0.7891407 -0.7357237 0 -0.6772817 0.4759472 0 -0.879474 -0.8371662 0 -0.5469486 0.3246987 0 -0.9458176 -0.9157732 0 -0.4016955 0.1645937 0 -0.9863615 -0.9694003 0 -0.2454854 0 0 -1 -0.9965845 0 -0.08257918 -0.1645955 0 -0.9863611 -0.9965845 0 0.08257918 -0.3247004 0 -0.945817 -0.9694002 0 0.2454854 -0.4759486 0 -0.8794731 -0.9157732 0 0.4016955 -0.6142141 0 -0.7891395 -0.8371665 0 0.546948 -0.7357253 0 -0.6772801 -0.735724 0 0.6772814 -0.8371675 0 -0.5469467 -0.6142128 0 0.7891403 -0.9157738 0 -0.4016944 -0.4759477 0 0.8794734 -0.9694006 0 -0.2454844 -0.3247001 0 0.9458171 -0.9965846 0 -0.08257855 -0.1645948 0 0.9863613 -0.9965845 0 0.08258009 0 0 1 -0.9694001 0 0.2454862 0.1645948 0 0.9863613 -0.9157731 0 0.4016958 0.324699 0 0.9458174 -0.8371659 0 0.5469491 0.4759472 0 0.8794738 -0.7357235 0 0.677282 0.6142122 0 0.7891408 -0.6142129 0 0.7891405 0.7357239 0 0.6772816 -0.4759479 0 0.8794735 0.8371664 0 0.5469483 -0.3246995 0 0.9458172 0.9157733 0 0.4016955 -0.1645946 0 0.9863613 0.9694002 0 0.2454853</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ringShape-tangents-array" count="304" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ringShape-binormals" name="qt_gauge_ringShape-binormals">
+ <float_array id="qt_gauge_ringShape-binormals-array" count="912">0 1 0 0 0 -1 0 -1 0 0.1645945 0 0.9863613 0 1 0 0.3246996 0 0.9458172 0 1 0 0.4759475 0 0.8794736 0 1 0 0.6142126 0 0.7891407 0 1 0 0.7357239 0 0.6772816 0 1 0 0.8371665 0 0.5469482 0 1 0 0.9157733 0 0.4016957 0 1 0 0.9694003 0 0.2454858 0 1 0 0.9965845 0 0.08257951 0 1 0 0.9965845 0 -0.08257951 0 1 0 0.9694003 0 -0.2454855 0 1 0 0.9157735 0 -0.4016952 0 1 0 0.8371668 0 -0.5469478 0 1 0 0.7357242 0 -0.6772813 0 1 0 0.614213 0 -0.7891403 0 1 0 0.4759476 0 -0.8794736 0 1 0 0.3246995 0 -0.9458173 0 1 0 0.1645945 0 -0.9863614 0 1 0 0 0 -1 0 1 0 -0.1645945 0 -0.9863614 0 1 0 -0.3246995 0 -0.9458172 0 1 0 -0.4759474 0 -0.8794738 0 1 0 -0.6142126 0 -0.7891406 0 1 0 -0.7357237 0 -0.6772817 0 1 0 -0.8371662 0 -0.5469485 0 1 0 -0.9157732 0 -0.4016958 0 1 0 -0.9694003 0 -0.2454857 0 1 0 -0.9965845 0 -0.08257945 0 1 0 -0.9965845 0 0.08257946 0 1 0 -0.9694003 0 0.2454852 0 1 0 -0.9157735 0 0.4016951 0 1 0 -0.8371666 0 0.546948 0 1 0 -0.7357241 0 0.6772814 0 1 0 -0.6142128 0 0.7891405 0 1 0 -0.4759475 0 0.8794737 0 1 0 -0.3246994 0 0.9458173 0 1 0 -0.1645928 0 0.9863616 0.9863613 0 -0.1645948 -0.0825792 0 -0.9965846 -1 0 0 0.0825794 0 0.9965845 0.9458172 0 -0.3246998 0.2454856 0 0.9694003 0.8794736 0 -0.4759478 0.4016956 0 0.9157733 0.7891402 0 -0.6142132 0.5469483 0 0.8371664 0.6772807 0 -0.7357248 0.6772815 0 0.735724 0.5469464 0 -0.8371676 0.7891403 0 0.614213 0.401693 0 -0.9157744 0.8794737 0 0.4759476 0.2454835 0 -0.9694008 0.9458174 0 0.3246992 0.08257753 0 -0.9965847 0.9863613 0 0.1645947 -0.08258097 0 -0.9965844 1 0 0 -0.2454866 0 -0.9694 0.9863613 0 -0.1645947 -0.4016961 0 -0.915773 0.9458174 0 -0.3246992 -0.5469496 0 -0.8371656 0.8794737 0 -0.4759476 -0.6772822 0 -0.7357234 0.7891406 0 -0.6142126 -0.7891407 0 -0.6142125 0.6772817 0 -0.7357237 -0.8794739 0 -0.4759471 0.5469484 0 -0.8371664 -0.9458175 0 -0.3246987 0.4016955 0 -0.9157734 -0.9863614 0 -0.1645937 0.2454856 0 -0.9694003 -1 0 0 0.08257938 0 -0.9965845 -0.9863612 0 0.1645955 -0.08257938 0 -0.9965845 -0.9458169 0 0.3247004 -0.2454855 0 -0.9694003 -0.8794731 0 0.4759486 -0.4016955 0 -0.9157734 -0.7891395 0 0.6142141 -0.5469482 0 -0.8371665 -0.6772801 0 0.7357253 -0.6772814 0 -0.7357242 -0.5469466 0 0.8371675 -0.7891404 0 -0.6142129 -0.4016944 0 0.9157739 -0.8794737 0 -0.4759476 -0.2454844 0 0.9694005 -0.9458172 0 -0.3246996 -0.08257855 0 0.9965847 -0.9863614 0 -0.1645946 0.08258009 0 0.9965844 -1 0 0 0.2454862 0 0.9694002 -0.9863614 0 0.1645946 0.4016959 0 0.9157732 -0.9458175 0 0.3246992 0.5469491 0 0.8371659 -0.8794737 0 0.4759475 0.677282 0 0.7357235 -0.7891408 0 0.6142125 0.7891405 0 0.6142129 -0.6772817 0 0.7357237 0.8794736 0 0.4759479 -0.5469486 0 0.8371663 0.9458173 0 0.3246996 -0.4016954 0 0.9157734 0.9863613 0 0.1645946 -0.2454855 0 0.9694003 0 -1 0 0 0 -1 0 1 0 0.1645947 0 0.9863613 0 -1 0 0.3246996 0 0.9458173 0 -1 0 0.4759476 0 0.8794737 0 -1 0 0.6142128 0 0.7891405 0 -1 0 0.7357237 0 0.6772818 0 -1 0 0.8371663 0 0.5469484 0 -1 0 0.9157735 0 0.4016953 0 -1 0 0.9694004 0 0.2454852 0 -1 0 0.9965845 0 0.08257937 0 -1 0 0.9965845 0 -0.08257937 0 -1 0 0.9694004 0 -0.2454852 0 -1 0 0.9157735 0 -0.4016953 0 -1 0 0.8371665 0 -0.5469483 0 -1 0 0.735724 0 -0.6772815 0 -1 0 0.6142129 0 -0.7891405 0 -1 0 0.4759475 0 -0.8794737 0 -1 0 0.3246996 0 -0.9458173 0 -1 0 0.1645947 0 -0.9863613 0 -1 0 0 0 -1 0 -1 0 -0.1645947 0 -0.9863614 0 -1 0 -0.3246995 0 -0.9458172 0 -1 0 -0.4759475 0 -0.8794737 0 -1 0 -0.6142126 0 -0.7891406 0 -1 0 -0.7357237 0 -0.6772818 0 -1 0 -0.8371663 0 -0.5469484 0 -1 0 -0.9157734 0 -0.4016955 0 -1 0 -0.9694003 0 -0.2454854 0 -1 0 -0.9965845 0 -0.08257935 0 -1 0 -0.9965845 0 0.08257935 0 -1 0 -0.9694004 0 0.2454852 0 -1 0 -0.9157735 0 0.4016952 0 -1 0 -0.8371666 0 0.5469481 0 -1 0 -0.7357242 0 0.6772813 0 -1 0 -0.614213 0 0.7891403 0 -1 0 -0.4759476 0 0.8794736 0 -1 0 -0.3246995 0 0.9458172 0 -1 0 -0.1645933 0 0.9863615 -0.9863613 0 0.1645948 -0.0825794 0 -0.9965845 1 0 0 0.0825792 0 0.9965845 -0.9458172 0 0.3246998 0.2454854 0 0.9694003 -0.8794736 0 0.4759478 0.4016957 0 0.9157733 -0.7891403 0 0.6142132 0.5469482 0 0.8371665 -0.6772807 0 0.7357248 0.6772814 0 0.735724 -0.5469465 0 0.8371676 0.7891405 0 0.6142127 -0.401693 0 0.9157745 0.8794738 0 0.4759475 -0.2454835 0 0.9694008 0.9458172 0 0.3246997 -0.08257753 0 0.9965847 0.9863613 0 0.1645948 0.08258096 0 0.9965844 1 0 0 0.2454866 0 0.9694 0.9863613 0 -0.1645948 0.4016961 0 0.9157731 0.9458174 0 -0.3246992 0.5469495 0 0.8371656 0.879474 0 -0.475947 0.6772822 0 0.7357234 0.7891408 0 -0.6142125 0.7891406 0 0.6142125 0.6772818 0 -0.7357238 0.879474 0 0.4759472 0.5469486 0 -0.8371662 0.9458175 0 0.3246986 0.4016956 0 -0.9157733 0.9863614 0 0.1645937 0.2454854 0 -0.9694003 1 0 0 0.0825792 0 -0.9965846 0.9863612 0 -0.1645955 -0.08257918 0 -0.9965846 0.9458169 0 -0.3247004 -0.2454854 0 -0.9694004 0.8794731 0 -0.4759486 -0.4016956 0 -0.9157733 0.7891395 0 -0.6142141 -0.5469481 0 -0.8371666 0.6772801 0 -0.7357253 -0.6772815 0 -0.735724 0.5469467 0 -0.8371675 -0.7891404 0 -0.6142129 0.4016944 0 -0.9157739 -0.8794736 0 -0.4759478 0.2454844 0 -0.9694005 -0.9458171 0 -0.3247001 0.08257855 0 -0.9965847 -0.9863613 0 -0.1645948 -0.08258008 0 -0.9965844 -1 0 0 -0.2454862 0 -0.9694002 -0.9863613 0 0.1645948 -0.4016959 0 -0.9157732 -0.9458174 0 0.324699 -0.5469491 0 -0.8371659 -0.8794739 0 0.4759473 -0.677282 0 -0.7357235 -0.7891409 0 0.6142123 -0.7891403 0 -0.6142129 -0.6772816 0 0.7357239 -0.8794736 0 -0.4759479 -0.5469483 0 0.8371665 -0.9458173 0 -0.3246995 -0.4016955 0 0.9157733 -0.9863613 0 -0.1645946 -0.2454854 0 0.9694004</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ringShape-binormals-array" count="304" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ringShape-map1" name="qt_gauge_ringShape-map1">
+ <float_array id="qt_gauge_ringShape-map1-array" count="390">0 1 0.02631579 1 0.05263158 1 0.07894737 1 0.1052632 1 0.131579 1 0.1578947 1 0.1842105 1 0.2105263 1 0.2368421 1 0.2631579 1 0.2894737 1 0.3157895 1 0.3421052 1 0.368421 1 0.3947368 1 0.4210526 1 0.4473684 1 0.4736841 1 0.4999999 1 0.5263157 1 0.5526315 1 0.5789473 1 0.6052631 1 0.6315789 1 0.6578947 1 0.6842105 1 0.7105263 1 0.7368422 1 0.763158 1 0.7894738 1 0.8157896 1 0.8421054 1 0.8684212 1 0.894737 1 0.9210528 1 0.9473686 1 0.9736844 1 1 1 0 0.75 0.02631579 0.75 0.05263158 0.75 0.07894737 0.75 0.1052632 0.75 0.131579 0.75 0.1578947 0.75 0.1842105 0.75 0.2105263 0.75 0.2368421 0.75 0.2631579 0.75 0.2894737 0.75 0.3157895 0.75 0.3421052 0.75 0.368421 0.75 0.3947368 0.75 0.4210526 0.75 0.4473684 0.75 0.4736841 0.75 0.4999999 0.75 0.5263157 0.75 0.5526315 0.75 0.5789473 0.75 0.6052631 0.75 0.6315789 0.75 0.6578947 0.75 0.6842105 0.75 0.7105263 0.75 0.7368422 0.75 0.763158 0.75 0.7894738 0.75 0.8157896 0.75 0.8421054 0.75 0.8684212 0.75 0.894737 0.75 0.9210528 0.75 0.9473686 0.75 0.9736844 0.75 1 0.75 0 0.5 0.02631579 0.5 0.05263158 0.5 0.07894737 0.5 0.1052632 0.5 0.131579 0.5 0.1578947 0.5 0.1842105 0.5 0.2105263 0.5 0.2368421 0.5 0.2631579 0.5 0.2894737 0.5 0.3157895 0.5 0.3421052 0.5 0.368421 0.5 0.3947368 0.5 0.4210526 0.5 0.4473684 0.5 0.4736841 0.5 0.4999999 0.5 0.5263157 0.5 0.5526315 0.5 0.5789473 0.5 0.6052631 0.5 0.6315789 0.5 0.6578947 0.5 0.6842105 0.5 0.7105263 0.5 0.7368422 0.5 0.763158 0.5 0.7894738 0.5 0.8157896 0.5 0.8421054 0.5 0.8684212 0.5 0.894737 0.5 0.9210528 0.5 0.9473686 0.5 0.9736844 0.5 1 0.5 0 0.25 0.02631579 0.25 0.05263158 0.25 0.07894737 0.25 0.1052632 0.25 0.131579 0.25 0.1578947 0.25 0.1842105 0.25 0.2105263 0.25 0.2368421 0.25 0.2631579 0.25 0.2894737 0.25 0.3157895 0.25 0.3421052 0.25 0.368421 0.25 0.3947368 0.25 0.4210526 0.25 0.4473684 0.25 0.4736841 0.25 0.4999999 0.25 0.5263157 0.25 0.5526315 0.25 0.5789473 0.25 0.6052631 0.25 0.6315789 0.25 0.6578947 0.25 0.6842105 0.25 0.7105263 0.25 0.7368422 0.25 0.763158 0.25 0.7894738 0.25 0.8157896 0.25 0.8421054 0.25 0.8684212 0.25 0.894737 0.25 0.9210528 0.25 0.9473686 0.25 0.9736844 0.25 1 0.25 0 0 0.02631579 0 0.05263158 0 0.07894737 0 0.1052632 0 0.131579 0 0.1578947 0 0.1842105 0 0.2105263 0 0.2368421 0 0.2631579 0 0.2894737 0 0.3157895 0 0.3421052 0 0.368421 0 0.3947368 0 0.4210526 0 0.4473684 0 0.4736841 0 0.4999999 0 0.5263157 0 0.5526315 0 0.5789473 0 0.6052631 0 0.6315789 0 0.6578947 0 0.6842105 0 0.7105263 0 0.7368422 0 0.763158 0 0.7894738 0 0.8157896 0 0.8421054 0 0.8684212 0 0.894737 0 0.9210528 0 0.9473686 0 0.9736844 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ringShape-map1-array" count="195" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ringShape-textangents">
+ <float_array id="qt_gauge_ringShape-textangents-array" count="1824">-0.1645945 0 -0.9863613 0 0 -0.9999999 0 0 -0.9999999 -0.1645945 0 -0.9863613 -0.3246996 0 -0.9458172 -0.1645945 0 -0.9863613 -0.1645945 0 -0.9863613 -0.3246996 0 -0.9458172 -0.4759475 0 -0.8794736 -0.3246996 0 -0.9458172 -0.3246996 0 -0.9458172 -0.4759475 0 -0.8794736 -0.6142126 0 -0.7891406 -0.4759475 0 -0.8794736 -0.4759475 0 -0.8794736 -0.6142126 0 -0.7891406 -0.7357238 0 -0.6772816 -0.6142126 0 -0.7891406 -0.6142126 0 -0.7891406 -0.7357238 0 -0.6772816 -0.8371664 0 -0.5469481 -0.7357238 0 -0.6772816 -0.7357238 0 -0.6772816 -0.8371664 0 -0.5469481 -0.9157732 0 -0.4016956 -0.8371664 0 -0.5469481 -0.8371664 0 -0.5469481 -0.9157732 0 -0.4016956 -0.9694001 0 -0.2454858 -0.9157732 0 -0.4016956 -0.9157732 0 -0.4016956 -0.9694001 0 -0.2454858 -0.9965844 0 -0.08257951 -0.9694001 0 -0.2454858 -0.9694001 0 -0.2454858 -0.9965844 0 -0.0825795 -0.9965844 0 0.0825795 -0.9965844 0 -0.08257951 -0.9965844 0 -0.0825795 -0.9965844 0 0.0825795 -0.9694002 0 0.2454855 -0.9965844 0 0.0825795 -0.9965844 0 0.0825795 -0.9694002 0 0.2454855 -0.9157734 0 0.4016952 -0.9694002 0 0.2454855 -0.9694002 0 0.2454855 -0.9157734 0 0.4016952 -0.8371667 0 0.5469477 -0.9157734 0 0.4016952 -0.9157734 0 0.4016952 -0.8371667 0 0.5469477 -0.7357242 0 0.6772812 -0.8371667 0 0.5469477 -0.8371667 0 0.5469477 -0.7357242 0 0.6772812 -0.614213 0 0.7891403 -0.7357242 0 0.6772812 -0.7357242 0 0.6772812 -0.614213 0 0.7891403 -0.4759476 0 0.8794736 -0.614213 0 0.7891403 -0.614213 0 0.7891403 -0.4759476 0 0.8794736 -0.3246995 0 0.9458172 -0.4759476 0 0.8794736 -0.4759476 0 0.8794736 -0.3246995 0 0.9458172 -0.1645945 0 0.9863613 -0.3246995 0 0.9458172 -0.3246995 0 0.9458172 -0.1645945 0 0.9863613 0 0 0.9999999 -0.1645945 0 0.9863613 -0.1645945 0 0.9863613 0 0 0.9999999 0.1645944 0 0.9863613 0 0 0.9999999 0 0 0.9999999 0.1645944 0 0.9863613 0.3246994 0 0.9458172 0.1645944 0 0.9863613 0.1645944 0 0.9863613 0.3246994 0 0.9458172 0.4759474 0 0.8794737 0.3246994 0 0.9458172 0.3246994 0 0.9458172 0.4759474 0 0.8794737 0.6142126 0 0.7891405 0.4759474 0 0.8794737 0.4759474 0 0.8794737 0.6142126 0 0.7891405 0.7357237 0 0.6772817 0.6142126 0 0.7891405 0.6142126 0 0.7891405 0.7357237 0 0.6772817 0.8371662 0 0.5469485 0.7357237 0 0.6772817 0.7357237 0 0.6772817 0.8371662 0 0.5469485 0.9157731 0 0.4016958 0.8371662 0 0.5469485 0.8371662 0 0.5469485 0.9157731 0 0.4016958 0.9694002 0 0.2454857 0.9157731 0 0.4016958 0.9157731 0 0.4016958 0.9694002 0 0.2454857 0.9965844 0 0.08257944 0.9694002 0 0.2454857 0.9694002 0 0.2454857 0.9965844 0 0.08257944 0.9965844 0 -0.08257944 0.9965844 0 0.08257944 0.9965844 0 0.08257944 0.9965844 0 -0.08257945 0.9694003 0 -0.2454852 0.9965844 0 -0.08257944 0.9965844 0 -0.08257945 0.9694003 0 -0.2454852 0.9157735 0 -0.401695 0.9694003 0 -0.2454852 0.9694003 0 -0.2454852 0.9157735 0 -0.401695 0.8371665 0 -0.546948 0.9157735 0 -0.401695 0.9157735 0 -0.401695 0.8371665 0 -0.546948 0.735724 0 -0.6772813 0.8371665 0 -0.546948 0.8371665 0 -0.546948 0.735724 0 -0.6772813 0.6142128 0 -0.7891404 0.735724 0 -0.6772813 0.735724 0 -0.6772813 0.6142128 0 -0.7891404 0.4759474 0 -0.8794736 0.6142128 0 -0.7891404 0.6142128 0 -0.7891404 0.4759474 0 -0.8794736 0.3246994 0 -0.9458172 0.4759474 0 -0.8794736 0.4759474 0 -0.8794736 0.3246994 0 -0.9458172 0.1645928 0 -0.9863616 0.3246994 0 -0.9458172 0.3246994 0 -0.9458172 0.1645928 0 -0.9863616 0 0 -0.9999999 0.1645928 0 -0.9863616 0.1645928 0 -0.9863616 0 0 -0.9999999 -0.1917655 0 -0.9814407 -0.08257928 0 -0.9965844 -0.0825794 0 -0.9965844 -0.1372981 0 -0.9905297 -0.3506901 0 -0.9364915 -0.1917655 0 -0.9814407 -0.1372981 0 -0.9905297 -0.2984615 0 -0.9544216 -0.5000485 0 -0.8659973 -0.3506901 0 -0.9364915 -0.2984615 0 -0.9544216 -0.4514836 0 -0.8922793 -0.6357667 0 -0.7718811 -0.5000485 0 -0.8659973 -0.4514836 0 -0.8922793 -0.5921901 0 -0.8057982 -0.7541432 0 -0.6567099 -0.6357667 0 -0.7718811 -0.5921901 0 -0.8057982 -0.7167433 0 -0.697337 -0.8519486 0 -0.5236253 -0.7541432 0 -0.6567099 -0.7167433 0 -0.697337 -0.8217458 0 -0.5698541 -0.926515 0 -0.3762575 -0.8519486 0 -0.5236253 -0.8217458 0 -0.5698541 -0.9043332 0 -0.426827 -0.9758085 0 -0.2186266 -0.926515 0 -0.3762575 -0.9043332 0 -0.426827 -0.9622527 0 -0.2721573 -0.9984845 0 -0.05503198 -0.9758085 0 -0.2186266 -0.9622527 0 -0.2721573 -0.9939244 0 -0.1100639 -0.9939244 0 0.1100639 -0.9984845 0 -0.05503198 -0.9939244 0 -0.1100639 -0.9984845 0 0.05503192 -0.9622528 0 0.2721572 -0.9939244 0 0.1100639 -0.9984845 0 0.05503192 -0.9758086 0 0.2186265 -0.9043334 0 0.4268268 -0.9622528 0 0.2721572 -0.9758086 0 0.2186265 -0.9265151 0 0.3762574 -0.8217461 0 0.5698537 -0.9043334 0 0.4268268 -0.9265151 0 0.3762574 -0.8519487 0 0.5236251 -0.7167437 0 0.6973367 -0.8217461 0 0.5698537 -0.8519487 0 0.5236251 -0.7541435 0 0.6567096 -0.5921904 0 0.805798 -0.7167437 0 0.6973367 -0.7541435 0 0.6567096 -0.635767 0 0.7718809 -0.4514836 0 0.8922793 -0.5921904 0 0.805798 -0.635767 0 0.7718809 -0.5000486 0 0.8659973 -0.2984614 0 0.9544216 -0.4514836 0 0.8922793 -0.5000486 0 0.8659973 -0.35069 0 0.9364915 -0.1372981 0 0.9905297 -0.2984614 0 0.9544216 -0.35069 0 0.9364915 -0.1917655 0 0.9814407 0.02761027 0 0.9996187 -0.1372981 0 0.9905297 -0.1917655 0 0.9814407 -0.0276102 0 0.9996187 0.1917654 0 0.9814408 0.02761027 0 0.9996187 -0.0276102 0 0.9996187 0.1372981 0 0.9905297 0.3506899 0 0.9364915 0.1917654 0 0.9814408 0.1372981 0 0.9905297 0.2984614 0 0.9544216 0.5000484 0 0.8659974 0.3506899 0 0.9364915 0.2984614 0 0.9544216 0.4514835 0 0.8922794 0.6357667 0 0.7718812 0.5000484 0 0.8659974 0.4514835 0 0.8922794 0.59219 0 0.8057984 0.7541432 0 0.65671 0.6357667 0 0.7718812 0.59219 0 0.8057984 0.7167432 0 0.697337 0.8519485 0 0.5236255 0.7541432 0 0.65671 0.7167432 0 0.697337 0.8217458 0 0.5698541 0.9265149 0 0.3762579 0.8519485 0 0.5236255 0.8217458 0 0.5698541 0.9043331 0 0.4268272 0.9758084 0 0.2186268 0.9265149 0 0.3762579 0.9043331 0 0.4268272 0.9622526 0 0.2721575 0.9984845 0 0.05503196 0.9758084 0 0.2186268 0.9622526 0 0.2721575 0.9939244 0 0.1100639 0.9939244 0 -0.1100639 0.9984845 0 0.05503196 0.9939244 0 0.1100639 0.9984845 0 -0.05503191 0.9622528 0 -0.272157 0.9939244 0 -0.1100639 0.9984845 0 -0.05503191 0.9758086 0 -0.2186264 0.9043332 0 -0.4268268 0.9622528 0 -0.272157 0.9758086 0 -0.2186264 0.9265151 0 -0.3762573 0.8217461 0 -0.5698537 0.9043332 0 -0.4268268 0.9265151 0 -0.3762573 0.8519487 0 -0.5236251 0.7167436 0 -0.6973367 0.8217461 0 -0.5698537 0.8519487 0 -0.5236251 0.7541435 0 -0.6567096 0.5921903 0 -0.8057981 0.7167436 0 -0.6973367 0.7541435 0 -0.6567096 0.6357671 0 -0.7718809 0.4514834 0 -0.8922794 0.5921903 0 -0.8057981 0.6357671 0 -0.7718809 0.5000486 0 -0.8659973 0.2984614 0 -0.9544216 0.4514834 0 -0.8922794 0.5000486 0 -0.8659973 0.3506899 0 -0.9364915 0.1372961 0 -0.99053 0.2984614 0 -0.9544216 0.3506899 0 -0.9364915 0.1917646 0 -0.981441 0.08257594 0 -0.9965847 0.1372961 0 -0.99053 0.1917646 0 -0.981441 0.08257636 0 -0.9965846 -0.1645946 0 -0.9863612 0 0 -0.9999999 0 0 -0.9999999 -0.1645947 0 -0.9863612 -0.3246996 0 -0.9458171 -0.1645946 0 -0.9863612 -0.1645947 0 -0.9863612 -0.3246996 0 -0.9458171 -0.4759475 0 -0.8794736 -0.3246996 0 -0.9458171 -0.3246996 0 -0.9458171 -0.4759475 0 -0.8794736 -0.6142127 0 -0.7891404 -0.4759475 0 -0.8794736 -0.4759475 0 -0.8794736 -0.6142127 0 -0.7891404 -0.7357236 0 -0.6772817 -0.6142127 0 -0.7891404 -0.6142127 0 -0.7891404 -0.7357236 0 -0.6772817 -0.8371662 0 -0.5469484 -0.7357236 0 -0.6772817 -0.7357236 0 -0.6772817 -0.8371662 0 -0.5469484 -0.9157733 0 -0.4016953 -0.8371662 0 -0.5469484 -0.8371662 0 -0.5469484 -0.9157733 0 -0.4016953 -0.9694003 0 -0.2454852 -0.9157733 0 -0.4016953 -0.9157733 0 -0.4016953 -0.9694003 0 -0.2454852 -0.9965844 0 -0.08257937 -0.9694003 0 -0.2454852 -0.9694003 0 -0.2454852 -0.9965844 0 -0.08257937 -0.9965844 0 0.08257937 -0.9965844 0 -0.08257937 -0.9965844 0 -0.08257937 -0.9965844 0 0.08257937 -0.9694003 0 0.2454852 -0.9965844 0 0.08257937 -0.9965844 0 0.08257937 -0.9694003 0 0.2454852 -0.9157733 0 0.4016953 -0.9694003 0 0.2454852 -0.9694003 0 0.2454852 -0.9157733 0 0.4016953 -0.8371664 0 0.5469481 -0.9157733 0 0.4016953 -0.9157733 0 0.4016953 -0.8371664 0 0.5469482 -0.7357239 0 0.6772815 -0.8371664 0 0.5469481 -0.8371664 0 0.5469482 -0.7357239 0 0.6772815 -0.6142128 0 0.7891403 -0.7357239 0 0.6772815 -0.7357239 0 0.6772815 -0.6142128 0 0.7891403 -0.4759475 0 0.8794736 -0.6142128 0 0.7891403 -0.6142128 0 0.7891403 -0.4759475 0 0.8794736 -0.3246996 0 0.9458172 -0.4759475 0 0.8794736 -0.4759475 0 0.8794736 -0.3246996 0 0.9458172 -0.1645946 0 0.9863612 -0.3246996 0 0.9458172 -0.3246996 0 0.9458172 -0.1645946 0 0.9863612 0 0 0.9999999 -0.1645946 0 0.9863612 -0.1645946 0 0.9863612 0 0 0.9999999 0.1645946 0 0.9863612 0 0 0.9999999 0 0 0.9999999 0.1645946 0 0.9863613 0.3246995 0 0.9458172 0.1645946 0 0.9863612 0.1645946 0 0.9863613 0.3246995 0 0.9458172 0.4759474 0 0.8794736 0.3246995 0 0.9458172 0.3246995 0 0.9458172 0.4759474 0 0.8794736 0.6142126 0 0.7891405 0.4759474 0 0.8794736 0.4759474 0 0.8794736 0.6142126 0 0.7891405 0.7357236 0 0.6772817 0.6142126 0 0.7891405 0.6142126 0 0.7891405 0.7357236 0 0.6772817 0.8371662 0 0.5469483 0.7357236 0 0.6772817 0.7357236 0 0.6772817 0.8371662 0 0.5469483 0.9157733 0 0.4016954 0.8371662 0 0.5469483 0.8371662 0 0.5469483 0.9157733 0 0.4016954 0.9694002 0 0.2454854 0.9157733 0 0.4016954 0.9157733 0 0.4016954 0.9694002 0 0.2454854 0.9965844 0 0.08257935 0.9694002 0 0.2454854 0.9694002 0 0.2454854 0.9965844 0 0.08257935 0.9965844 0 -0.08257935 0.9965844 0 0.08257935 0.9965844 0 0.08257935 0.9965844 0 -0.08257935 0.9694003 0 -0.2454852 0.9965844 0 -0.08257935 0.9965844 0 -0.08257935 0.9694003 0 -0.2454852 0.9157733 0 -0.4016952 0.9694003 0 -0.2454852 0.9694003 0 -0.2454852 0.9157733 0 -0.4016952 0.8371665 0 -0.546948 0.9157733 0 -0.4016952 0.9157733 0 -0.4016952 0.8371665 0 -0.546948 0.7357241 0 -0.6772813 0.8371665 0 -0.546948 0.8371665 0 -0.546948 0.7357241 0 -0.6772813 0.614213 0 -0.7891403 0.7357241 0 -0.6772813 0.7357241 0 -0.6772813 0.614213 0 -0.7891403 0.4759476 0 -0.8794736 0.614213 0 -0.7891403 0.614213 0 -0.7891403 0.4759476 0 -0.8794736 0.3246995 0 -0.9458172 0.4759476 0 -0.8794736 0.4759476 0 -0.8794736 0.3246995 0 -0.9458172 0.1645933 0 -0.9863614 0.3246995 0 -0.9458172 0.3246995 0 -0.9458172 0.1645933 0 -0.9863614 0 0 -0.9999999 0.1645933 0 -0.9863614 0.1645933 0 -0.9863614 0 0 -0.9999999 -0.1917655 0 -0.9814407 -0.08257928 0 -0.9965844 -0.08257918 0 -0.9965844 -0.1372981 0 -0.9905297 -0.3506901 0 -0.9364915 -0.1917655 0 -0.9814407 -0.1372981 0 -0.9905297 -0.2984615 0 -0.9544216 -0.5000485 0 -0.8659974 -0.3506901 0 -0.9364915 -0.2984615 0 -0.9544216 -0.4514835 0 -0.8922794 -0.6357669 0 -0.7718811 -0.5000485 0 -0.8659974 -0.4514835 0 -0.8922794 -0.5921901 0 -0.8057982 -0.7541432 0 -0.6567099 -0.6357669 0 -0.7718811 -0.5921901 0 -0.8057982 -0.7167434 0 -0.6973369 -0.8519485 0 -0.5236254 -0.7541432 0 -0.6567099 -0.7167434 0 -0.6973369 -0.8217458 0 -0.5698541 -0.926515 0 -0.3762575 -0.8519485 0 -0.5236254 -0.8217458 0 -0.5698541 -0.9043332 0 -0.4268272 -0.9758086 0 -0.2186265 -0.926515 0 -0.3762575 -0.9043332 0 -0.4268272 -0.9622527 0 -0.2721573 -0.9984845 0 -0.05503192 -0.9758086 0 -0.2186265 -0.9622527 0 -0.2721573 -0.9939244 0 -0.1100639 -0.9939244 0 0.1100639 -0.9984845 0 -0.05503192 -0.9939244 0 -0.1100639 -0.9984845 0 0.05503198 -0.9622528 0 0.2721571 -0.9939244 0 0.1100639 -0.9984845 0 0.05503198 -0.9758086 0 0.2186265 -0.9043332 0 0.4268268 -0.9622528 0 0.2721571 -0.9758086 0 0.2186265 -0.9265152 0 0.3762572 -0.8217459 0 0.5698539 -0.9043332 0 0.4268268 -0.9265152 0 0.3762572 -0.8519487 0 0.5236251 -0.7167435 0 0.6973367 -0.8217459 0 0.5698539 -0.8519487 0 0.5236251 -0.7541435 0 0.6567096 -0.5921904 0 0.8057979 -0.7167435 0 0.6973367 -0.7541435 0 0.6567096 -0.6357672 0 0.7718809 -0.4514835 0 0.8922794 -0.5921904 0 0.8057979 -0.6357672 0 0.7718809 -0.5000486 0 0.8659973 -0.2984614 0 0.9544216 -0.4514835 0 0.8922794 -0.5000486 0 0.8659973 -0.3506899 0 0.9364915 -0.1372981 0 0.9905297 -0.2984614 0 0.9544216 -0.3506899 0 0.9364915 -0.1917654 0 0.9814408 0.0276102 0 0.9996187 -0.1372981 0 0.9905297 -0.1917654 0 0.9814408 -0.02761027 0 0.9996187 0.1917655 0 0.9814408 0.0276102 0 0.9996187 -0.02761027 0 0.9996187 0.1372981 0 0.9905297 0.35069 0 0.9364915 0.1917655 0 0.9814408 0.1372981 0 0.9905297 0.2984614 0 0.9544216 0.5000484 0 0.8659974 0.35069 0 0.9364915 0.2984614 0 0.9544216 0.4514834 0 0.8922794 0.6357667 0 0.7718811 0.5000484 0 0.8659974 0.4514834 0 0.8922794 0.59219 0 0.8057982 0.7541431 0 0.65671 0.6357667 0 0.7718811 0.59219 0 0.8057982 0.7167433 0 0.697337 0.8519485 0 0.5236255 0.7541431 0 0.65671 0.7167433 0 0.697337 0.8217457 0 0.5698542 0.9265149 0 0.3762578 0.8519485 0 0.5236255 0.8217457 0 0.5698542 0.904333 0 0.4268274 0.9758085 0 0.2186266 0.9265149 0 0.3762578 0.904333 0 0.4268274 0.9622526 0 0.2721576 0.9984845 0 0.05503191 0.9758085 0 0.2186266 0.9622526 0 0.2721576 0.9939244 0 0.1100639 0.9939244 0 -0.1100639 0.9984845 0 0.05503191 0.9939244 0 0.1100639 0.9984845 0 -0.05503196 0.9622529 0 -0.272157 0.9939244 0 -0.1100639 0.9984845 0 -0.05503196 0.9758086 0 -0.2186264 0.9043332 0 -0.4268269 0.9622529 0 -0.272157 0.9758086 0 -0.2186264 0.9265152 0 -0.3762572 0.821746 0 -0.5698538 0.9043332 0 -0.4268269 0.9265152 0 -0.3762572 0.8519487 0 -0.5236251 0.7167435 0 -0.6973367 0.821746 0 -0.5698538 0.8519487 0 -0.5236251 0.7541435 0 -0.6567096 0.5921903 0 -0.805798 0.7167435 0 -0.6973367 0.7541435 0 -0.6567096 0.635767 0 -0.7718809 0.4514835 0 -0.8922793 0.5921903 0 -0.805798 0.635767 0 -0.7718809 0.5000486 0 -0.8659973 0.2984613 0 -0.9544216 0.4514835 0 -0.8922793 0.5000486 0 -0.8659973 0.3506899 0 -0.9364915 0.1372962 0 -0.99053 0.2984613 0 -0.9544216 0.3506899 0 -0.9364915 0.1917644 0 -0.981441 0.0825768 0 -0.9965847 0.1372962 0 -0.99053 0.1917644 0 -0.981441 0.08257636 0 -0.9965846</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ringShape-textangents-array" count="608" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ringShape-texbinormals">
+ <float_array id="qt_gauge_ringShape-texbinormals-array" count="1824">0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.9814408 0 0.1917655 -0.9965845 0 0.0825793 -0.9965845 0 0.0825794 -0.9905298 0 0.1372981 -0.9364916 0 0.3506901 -0.9814408 0 0.1917655 -0.9905298 0 0.1372981 -0.9544218 0 0.2984615 -0.8659974 0 0.5000486 -0.9364916 0 0.3506901 -0.9544218 0 0.2984615 -0.8922794 0 0.4514836 -0.7718812 0 0.6357669 -0.8659974 0 0.5000486 -0.8922794 0 0.4514836 -0.8057983 0 0.5921901 -0.65671 0 0.7541433 -0.7718812 0 0.6357669 -0.8057983 0 0.5921901 -0.6973371 0 0.7167434 -0.5236254 0 0.8519487 -0.65671 0 0.7541433 -0.6973371 0 0.7167434 -0.5698542 0 0.8217458 -0.3762576 0 0.9265151 -0.5236254 0 0.8519487 -0.5698542 0 0.8217458 -0.426827 0 0.9043334 -0.2186267 0 0.9758086 -0.3762576 0 0.9265151 -0.426827 0 0.9043334 -0.2721573 0 0.9622529 -0.05503199 0 0.9984846 -0.2186267 0 0.9758086 -0.2721573 0 0.9622529 -0.1100639 0 0.9939246 0.1100639 0 0.9939246 -0.05503199 0 0.9984846 -0.1100639 0 0.9939246 0.05503193 0 0.9984846 0.2721572 0 0.9622529 0.1100639 0 0.9939246 0.05503193 0 0.9984846 0.2186265 0 0.9758086 0.4268268 0 0.9043334 0.2721572 0 0.9622529 0.2186265 0 0.9758086 0.3762574 0 0.9265152 0.5698537 0 0.8217461 0.4268268 0 0.9043334 0.3762574 0 0.9265152 0.5236251 0 0.8519488 0.6973367 0 0.7167437 0.5698537 0 0.8217461 0.5236251 0 0.8519488 0.6567096 0 0.7541436 0.8057981 0 0.5921904 0.6973367 0 0.7167437 0.6567096 0 0.7541436 0.771881 0 0.6357672 0.8922794 0 0.4514837 0.8057981 0 0.5921904 0.771881 0 0.6357672 0.8659974 0 0.5000487 0.9544217 0 0.2984615 0.8922794 0 0.4514837 0.8659974 0 0.5000487 0.9364917 0 0.35069 0.9905298 0 0.1372981 0.9544217 0 0.2984615 0.9364917 0 0.35069 0.9814408 0 0.1917656 0.9996188 0 -0.02761027 0.9905298 0 0.1372981 0.9814408 0 0.1917656 0.9996188 0 0.0276102 0.9814408 0 -0.1917654 0.9996188 0 -0.02761027 0.9996188 0 0.0276102 0.9905298 0 -0.1372981 0.9364917 0 -0.35069 0.9814408 0 -0.1917654 0.9905298 0 -0.1372981 0.9544218 0 -0.2984614 0.8659976 0 -0.5000485 0.9364917 0 -0.35069 0.9544218 0 -0.2984614 0.8922796 0 -0.4514835 0.7718812 0 -0.6357668 0.8659976 0 -0.5000485 0.8922796 0 -0.4514835 0.8057984 0 -0.59219 0.6567101 0 -0.7541432 0.7718812 0 -0.6357668 0.8057984 0 -0.59219 0.697337 0 -0.7167433 0.5236255 0 -0.8519486 0.6567101 0 -0.7541432 0.697337 0 -0.7167433 0.5698541 0 -0.8217458 0.3762579 0 -0.926515 0.5236255 0 -0.8519486 0.5698541 0 -0.8217458 0.4268273 0 -0.9043333 0.2186268 0 -0.9758086 0.3762579 0 -0.926515 0.4268273 0 -0.9043333 0.2721575 0 -0.9622527 0.05503197 0 -0.9984847 0.2186268 0 -0.9758086 0.2721575 0 -0.9622527 0.1100639 0 -0.9939246 -0.1100639 0 -0.9939246 0.05503197 0 -0.9984847 0.1100639 0 -0.9939246 -0.05503192 0 -0.9984847 -0.272157 0 -0.9622529 -0.1100639 0 -0.9939246 -0.05503192 0 -0.9984847 -0.2186265 0 -0.9758087 -0.4268269 0 -0.9043334 -0.272157 0 -0.9622529 -0.2186265 0 -0.9758087 -0.3762573 0 -0.9265153 -0.5698537 0 -0.8217461 -0.4268269 0 -0.9043334 -0.3762573 0 -0.9265153 -0.5236252 0 -0.8519488 -0.6973368 0 -0.7167438 -0.5698537 0 -0.8217461 -0.5236252 0 -0.8519488 -0.6567096 0 -0.7541437 -0.8057982 0 -0.5921903 -0.6973368 0 -0.7167438 -0.6567096 0 -0.7541437 -0.771881 0 -0.6357672 -0.8922795 0 -0.4514835 -0.8057982 0 -0.5921903 -0.771881 0 -0.6357672 -0.8659974 0 -0.5000486 -0.9544217 0 -0.2984614 -0.8922795 0 -0.4514835 -0.8659974 0 -0.5000486 -0.9364917 0 -0.3506899 -0.9905301 0 -0.1372961 -0.9544217 0 -0.2984614 -0.9364917 0 -0.3506899 -0.981441 0 -0.1917647 -0.9965848 0 -0.08257594 -0.9905301 0 -0.1372961 -0.981441 0 -0.1917647 -0.9965848 0 -0.08257638 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.9814408 0 -0.1917656 0.9965845 0 -0.0825793 0.9965845 0 -0.0825792 0.9905298 0 -0.1372981 0.9364917 0 -0.3506901 0.9814408 0 -0.1917656 0.9905298 0 -0.1372981 0.9544217 0 -0.2984615 0.8659974 0 -0.5000485 0.9364917 0 -0.3506901 0.9544217 0 -0.2984615 0.8922794 0 -0.4514835 0.7718812 0 -0.6357669 0.8659974 0 -0.5000485 0.8922794 0 -0.4514835 0.8057982 0 -0.5921901 0.65671 0 -0.7541433 0.7718812 0 -0.6357669 0.8057982 0 -0.5921901 0.697337 0 -0.7167435 0.5236255 0 -0.8519486 0.65671 0 -0.7541433 0.697337 0 -0.7167435 0.5698542 0 -0.8217459 0.3762576 0 -0.9265152 0.5236255 0 -0.8519486 0.5698542 0 -0.8217459 0.4268272 0 -0.9043333 0.2186265 0 -0.9758087 0.3762576 0 -0.9265152 0.4268272 0 -0.9043333 0.2721574 0 -0.9622528 0.05503193 0 -0.9984846 0.2186265 0 -0.9758087 0.2721574 0 -0.9622528 0.1100639 0 -0.9939246 -0.1100639 0 -0.9939246 0.05503193 0 -0.9984846 0.1100639 0 -0.9939246 -0.05503199 0 -0.9984846 -0.2721571 0 -0.9622529 -0.1100639 0 -0.9939246 -0.05503199 0 -0.9984846 -0.2186265 0 -0.9758087 -0.4268269 0 -0.9043335 -0.2721571 0 -0.9622529 -0.2186265 0 -0.9758087 -0.3762572 0 -0.9265153 -0.569854 0 -0.8217461 -0.4268269 0 -0.9043335 -0.3762572 0 -0.9265153 -0.5236251 0 -0.8519489 -0.6973368 0 -0.7167436 -0.569854 0 -0.8217461 -0.5236251 0 -0.8519489 -0.6567096 0 -0.7541435 -0.8057981 0 -0.5921905 -0.6973368 0 -0.7167436 -0.6567096 0 -0.7541435 -0.7718809 0 -0.6357672 -0.8922794 0 -0.4514835 -0.8057981 0 -0.5921905 -0.7718809 0 -0.6357672 -0.8659973 0 -0.5000486 -0.9544218 0 -0.2984615 -0.8922794 0 -0.4514835 -0.8659973 0 -0.5000486 -0.9364916 0 -0.35069 -0.9905298 0 -0.1372981 -0.9544218 0 -0.2984615 -0.9364916 0 -0.35069 -0.9814408 0 -0.1917655 -0.9996188 0 0.0276102 -0.9905298 0 -0.1372981 -0.9814408 0 -0.1917655 -0.9996188 0 -0.02761027 -0.9814408 0 0.1917655 -0.9996188 0 0.0276102 -0.9996188 0 -0.02761027 -0.9905298 0 0.1372981 -0.9364917 0 0.35069 -0.9814408 0 0.1917655 -0.9905298 0 0.1372981 -0.9544218 0 0.2984615 -0.8659975 0 0.5000485 -0.9364917 0 0.35069 -0.9544218 0 0.2984615 -0.8922796 0 0.4514835 -0.7718812 0 0.6357668 -0.8659975 0 0.5000485 -0.8922796 0 0.4514835 -0.8057983 0 0.5921901 -0.6567101 0 0.7541432 -0.7718812 0 0.6357668 -0.8057983 0 0.5921901 -0.697337 0 0.7167434 -0.5236256 0 0.8519486 -0.6567101 0 0.7541432 -0.697337 0 0.7167434 -0.5698543 0 0.8217458 -0.3762578 0 0.9265151 -0.5236256 0 0.8519486 -0.5698543 0 0.8217458 -0.4268275 0 0.9043332 -0.2186266 0 0.9758086 -0.3762578 0 0.9265151 -0.4268275 0 0.9043332 -0.2721576 0 0.9622527 -0.05503192 0 0.9984847 -0.2186266 0 0.9758086 -0.2721576 0 0.9622527 -0.1100639 0 0.9939246 0.1100639 0 0.9939246 -0.05503192 0 0.9984847 -0.1100639 0 0.9939246 0.05503197 0 0.9984846 0.272157 0 0.9622529 0.1100639 0 0.9939246 0.05503197 0 0.9984846 0.2186264 0 0.9758086 0.426827 0 0.9043334 0.272157 0 0.9622529 0.2186264 0 0.9758086 0.3762573 0 0.9265153 0.5698538 0 0.8217461 0.426827 0 0.9043334 0.3762573 0 0.9265153 0.5236251 0 0.8519489 0.6973368 0 0.7167436 0.5698538 0 0.8217461 0.5236251 0 0.8519489 0.6567096 0 0.7541436 0.8057981 0 0.5921904 0.6973368 0 0.7167436 0.6567096 0 0.7541436 0.771881 0 0.635767 0.8922795 0 0.4514836 0.8057981 0 0.5921904 0.771881 0 0.635767 0.8659974 0 0.5000486 0.9544218 0 0.2984614 0.8922795 0 0.4514836 0.8659974 0 0.5000486 0.9364917 0 0.3506899 0.9905301 0 0.1372962 0.9544218 0 0.2984614 0.9364917 0 0.3506899 0.981441 0 0.1917644 0.9965847 0 0.0825768 0.9905301 0 0.1372962 0.981441 0 0.1917644 0.9965848 0 0.08257638</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ringShape-texbinormals-array" count="608" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_ringShape-vertices" name="qt_gauge_ringShape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_ringShape-positions"/>
+ </vertices>
+ <triangles material="lambert3SG" count="304">
+ <input semantic="VERTEX" source="#qt_gauge_ringShape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_ringShape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_ringShape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_ringShape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_ringShape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_ringShape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_ringShape-texbinormals" offset="3" set="0"/>
+ <p>1 0 1 0 0 1 0 1 39 3 40 3 39 3 40 3 0 1 0 1 38 2 39 2 2 4 2 4 1 0 1 5 40 5 41 7 40 5 41 7 1 0 1 5 39 3 40 6 3 6 3 8 2 4 2 9 41 7 42 11 41 7 42 11 2 4 2 9 40 5 41 10 4 8 4 12 3 6 3 13 42 9 43 15 42 9 43 15 3 6 3 13 41 7 42 14 5 10 5 16 4 8 4 17 43 11 44 19 43 11 44 19 4 8 4 17 42 9 43 18 6 12 6 20 5 10 5 21 44 13 45 23 44 13 45 23 5 10 5 21 43 11 44 22 7 14 7 24 6 12 6 25 45 15 46 27 45 15 46 27 6 12 6 25 44 13 45 26 8 16 8 28 7 14 7 29 46 17 47 31 46 17 47 31 7 14 7 29 45 15 46 30 9 18 9 32 8 16 8 33 47 19 48 35 47 19 48 35 8 16 8 33 46 17 47 34 10 20 10 36 9 18 9 37 48 21 49 39 48 21 49 39 9 18 9 37 47 19 48 38 11 22 11 40 10 20 10 41 49 23 50 43 49 23 50 43 10 20 10 41 48 21 49 42 12 24 12 44 11 22 11 45 50 25 51 47 50 25 51 47 11 22 11 45 49 23 50 46 13 26 13 48 12 24 12 49 51 27 52 51 51 27 52 51 12 24 12 49 50 25 51 50 14 28 14 52 13 26 13 53 52 29 53 55 52 29 53 55 13 26 13 53 51 27 52 54 15 30 15 56 14 28 14 57 53 31 54 59 53 31 54 59 14 28 14 57 52 29 53 58 16 32 16 60 15 30 15 61 54 33 55 63 54 33 55 63 15 30 15 61 53 31 54 62 17 34 17 64 16 32 16 65 55 35 56 67 55 35 56 67 16 32 16 65 54 33 55 66 18 36 18 68 17 34 17 69 56 37 57 71 56 37 57 71 17 34 17 69 55 35 56 70 19 38 19 72 18 36 18 73 57 39 58 75 57 39 58 75 18 36 18 73 56 37 57 74 20 40 20 76 19 38 19 77 58 41 59 79 58 41 59 79 19 38 19 77 57 39 58 78 21 42 21 80 20 40 20 81 59 43 60 83 59 43 60 83 20 40 20 81 58 41 59 82 22 44 22 84 21 42 21 85 60 45 61 87 60 45 61 87 21 42 21 85 59 43 60 86 23 46 23 88 22 44 22 89 61 47 62 91 61 47 62 91 22 44 22 89 60 45 61 90 24 48 24 92 23 46 23 93 62 49 63 95 62 49 63 95 23 46 23 93 61 47 62 94 25 50 25 96 24 48 24 97 63 51 64 99 63 51 64 99 24 48 24 97 62 49 63 98 26 52 26 100 25 50 25 101 64 53 65 103 64 53 65 103 25 50 25 101 63 51 64 102 27 54 27 104 26 52 26 105 65 55 66 107 65 55 66 107 26 52 26 105 64 53 65 106 28 56 28 108 27 54 27 109 66 57 67 111 66 57 67 111 27 54 27 109 65 55 66 110 29 58 29 112 28 56 28 113 67 59 68 115 67 59 68 115 28 56 28 113 66 57 67 114 30 60 30 116 29 58 29 117 68 61 69 119 68 61 69 119 29 58 29 117 67 59 68 118 31 62 31 120 30 60 30 121 69 63 70 123 69 63 70 123 30 60 30 121 68 61 69 122 32 64 32 124 31 62 31 125 70 65 71 127 70 65 71 127 31 62 31 125 69 63 70 126 33 66 33 128 32 64 32 129 71 67 72 131 71 67 72 131 32 64 32 129 70 65 71 130 34 68 34 132 33 66 33 133 72 69 73 135 72 69 73 135 33 66 33 133 71 67 72 134 35 70 35 136 34 68 34 137 73 71 74 139 73 71 74 139 34 68 34 137 72 69 73 138 36 72 36 140 35 70 35 141 74 73 75 143 74 73 75 143 35 70 35 141 73 71 74 142 37 74 37 144 36 72 36 145 75 75 76 147 75 75 76 147 36 72 36 145 74 73 75 146 0 1 38 148 37 74 37 149 38 2 77 151 38 2 77 151 37 74 37 149 75 75 76 150 39 76 40 152 38 77 39 153 77 79 79 155 77 79 79 155 38 77 39 153 76 78 78 154 40 80 41 156 39 76 40 157 78 81 80 159 78 81 80 159 39 76 40 157 77 79 79 158 41 82 42 160 40 80 41 161 79 83 81 163 79 83 81 163 40 80 41 161 78 81 80 162 42 84 43 164 41 82 42 165 80 85 82 167 80 85 82 167 41 82 42 165 79 83 81 166 43 86 44 168 42 84 43 169 81 87 83 171 81 87 83 171 42 84 43 169 80 85 82 170 44 88 45 172 43 86 44 173 82 89 84 175 82 89 84 175 43 86 44 173 81 87 83 174 45 90 46 176 44 88 45 177 83 91 85 179 83 91 85 179 44 88 45 177 82 89 84 178 46 92 47 180 45 90 46 181 84 93 86 183 84 93 86 183 45 90 46 181 83 91 85 182 47 94 48 184 46 92 47 185 85 95 87 187 85 95 87 187 46 92 47 185 84 93 86 186 48 96 49 188 47 94 48 189 86 97 88 191 86 97 88 191 47 94 48 189 85 95 87 190 49 98 50 192 48 96 49 193 87 99 89 195 87 99 89 195 48 96 49 193 86 97 88 194 50 100 51 196 49 98 50 197 88 101 90 199 88 101 90 199 49 98 50 197 87 99 89 198 51 102 52 200 50 100 51 201 89 103 91 203 89 103 91 203 50 100 51 201 88 101 90 202 52 104 53 204 51 102 52 205 90 105 92 207 90 105 92 207 51 102 52 205 89 103 91 206 53 106 54 208 52 104 53 209 91 107 93 211 91 107 93 211 52 104 53 209 90 105 92 210 54 108 55 212 53 106 54 213 92 109 94 215 92 109 94 215 53 106 54 213 91 107 93 214 55 110 56 216 54 108 55 217 93 111 95 219 93 111 95 219 54 108 55 217 92 109 94 218 56 112 57 220 55 110 56 221 94 113 96 223 94 113 96 223 55 110 56 221 93 111 95 222 57 114 58 224 56 112 57 225 95 115 97 227 95 115 97 227 56 112 57 225 94 113 96 226 58 116 59 228 57 114 58 229 96 117 98 231 96 117 98 231 57 114 58 229 95 115 97 230 59 118 60 232 58 116 59 233 97 119 99 235 97 119 99 235 58 116 59 233 96 117 98 234 60 120 61 236 59 118 60 237 98 121 100 239 98 121 100 239 59 118 60 237 97 119 99 238 61 122 62 240 60 120 61 241 99 123 101 243 99 123 101 243 60 120 61 241 98 121 100 242 62 124 63 244 61 122 62 245 100 125 102 247 100 125 102 247 61 122 62 245 99 123 101 246 63 126 64 248 62 124 63 249 101 127 103 251 101 127 103 251 62 124 63 249 100 125 102 250 64 128 65 252 63 126 64 253 102 129 104 255 102 129 104 255 63 126 64 253 101 127 103 254 65 130 66 256 64 128 65 257 103 131 105 259 103 131 105 259 64 128 65 257 102 129 104 258 66 132 67 260 65 130 66 261 104 133 106 263 104 133 106 263 65 130 66 261 103 131 105 262 67 134 68 264 66 132 67 265 105 135 107 267 105 135 107 267 66 132 67 265 104 133 106 266 68 136 69 268 67 134 68 269 106 137 108 271 106 137 108 271 67 134 68 269 105 135 107 270 69 138 70 272 68 136 69 273 107 139 109 275 107 139 109 275 68 136 69 273 106 137 108 274 70 140 71 276 69 138 70 277 108 141 110 279 108 141 110 279 69 138 70 277 107 139 109 278 71 142 72 280 70 140 71 281 109 143 111 283 109 143 111 283 70 140 71 281 108 141 110 282 72 144 73 284 71 142 72 285 110 145 112 287 110 145 112 287 71 142 72 285 109 143 111 286 73 146 74 288 72 144 73 289 111 147 113 291 111 147 113 291 72 144 73 289 110 145 112 290 74 148 75 292 73 146 74 293 112 149 114 295 112 149 114 295 73 146 74 293 111 147 113 294 75 150 76 296 74 148 75 297 113 151 115 299 113 151 115 299 74 148 75 297 112 149 114 298 38 77 77 300 75 150 76 301 76 78 116 303 76 78 116 303 75 150 76 301 113 151 115 302 77 152 79 304 76 153 78 305 115 155 118 307 115 155 118 307 76 153 78 305 114 154 117 306 78 156 80 308 77 152 79 309 116 157 119 311 116 157 119 311 77 152 79 309 115 155 118 310 79 158 81 312 78 156 80 313 117 159 120 315 117 159 120 315 78 156 80 313 116 157 119 314 80 160 82 316 79 158 81 317 118 161 121 319 118 161 121 319 79 158 81 317 117 159 120 318 81 162 83 320 80 160 82 321 119 163 122 323 119 163 122 323 80 160 82 321 118 161 121 322 82 164 84 324 81 162 83 325 120 165 123 327 120 165 123 327 81 162 83 325 119 163 122 326 83 166 85 328 82 164 84 329 121 167 124 331 121 167 124 331 82 164 84 329 120 165 123 330 84 168 86 332 83 166 85 333 122 169 125 335 122 169 125 335 83 166 85 333 121 167 124 334 85 170 87 336 84 168 86 337 123 171 126 339 123 171 126 339 84 168 86 337 122 169 125 338 86 172 88 340 85 170 87 341 124 173 127 343 124 173 127 343 85 170 87 341 123 171 126 342 87 174 89 344 86 172 88 345 125 175 128 347 125 175 128 347 86 172 88 345 124 173 127 346 88 176 90 348 87 174 89 349 126 177 129 351 126 177 129 351 87 174 89 349 125 175 128 350 89 178 91 352 88 176 90 353 127 179 130 355 127 179 130 355 88 176 90 353 126 177 129 354 90 180 92 356 89 178 91 357 128 181 131 359 128 181 131 359 89 178 91 357 127 179 130 358 91 182 93 360 90 180 92 361 129 183 132 363 129 183 132 363 90 180 92 361 128 181 131 362 92 184 94 364 91 182 93 365 130 185 133 367 130 185 133 367 91 182 93 365 129 183 132 366 93 186 95 368 92 184 94 369 131 187 134 371 131 187 134 371 92 184 94 369 130 185 133 370 94 188 96 372 93 186 95 373 132 189 135 375 132 189 135 375 93 186 95 373 131 187 134 374 95 190 97 376 94 188 96 377 133 191 136 379 133 191 136 379 94 188 96 377 132 189 135 378 96 192 98 380 95 190 97 381 134 193 137 383 134 193 137 383 95 190 97 381 133 191 136 382 97 194 99 384 96 192 98 385 135 195 138 387 135 195 138 387 96 192 98 385 134 193 137 386 98 196 100 388 97 194 99 389 136 197 139 391 136 197 139 391 97 194 99 389 135 195 138 390 99 198 101 392 98 196 100 393 137 199 140 395 137 199 140 395 98 196 100 393 136 197 139 394 100 200 102 396 99 198 101 397 138 201 141 399 138 201 141 399 99 198 101 397 137 199 140 398 101 202 103 400 100 200 102 401 139 203 142 403 139 203 142 403 100 200 102 401 138 201 141 402 102 204 104 404 101 202 103 405 140 205 143 407 140 205 143 407 101 202 103 405 139 203 142 406 103 206 105 408 102 204 104 409 141 207 144 411 141 207 144 411 102 204 104 409 140 205 143 410 104 208 106 412 103 206 105 413 142 209 145 415 142 209 145 415 103 206 105 413 141 207 144 414 105 210 107 416 104 208 106 417 143 211 146 419 143 211 146 419 104 208 106 417 142 209 145 418 106 212 108 420 105 210 107 421 144 213 147 423 144 213 147 423 105 210 107 421 143 211 146 422 107 214 109 424 106 212 108 425 145 215 148 427 145 215 148 427 106 212 108 425 144 213 147 426 108 216 110 428 107 214 109 429 146 217 149 431 146 217 149 431 107 214 109 429 145 215 148 430 109 218 111 432 108 216 110 433 147 219 150 435 147 219 150 435 108 216 110 433 146 217 149 434 110 220 112 436 109 218 111 437 148 221 151 439 148 221 151 439 109 218 111 437 147 219 150 438 111 222 113 440 110 220 112 441 149 223 152 443 149 223 152 443 110 220 112 441 148 221 151 442 112 224 114 444 111 222 113 445 150 225 153 447 150 225 153 447 111 222 113 445 149 223 152 446 113 226 115 448 112 224 114 449 151 227 154 451 151 227 154 451 112 224 114 449 150 225 153 450 76 153 116 452 113 226 115 453 114 154 155 455 114 154 155 455 113 226 115 453 151 227 154 454 115 228 118 456 114 229 117 457 1 231 157 459 1 231 157 459 114 229 117 457 0 230 156 458 116 232 119 460 115 228 118 461 2 233 158 463 2 233 158 463 115 228 118 461 1 231 157 462 117 234 120 464 116 232 119 465 3 235 159 467 3 235 159 467 116 232 119 465 2 233 158 466 118 236 121 468 117 234 120 469 4 237 160 471 4 237 160 471 117 234 120 469 3 235 159 470 119 238 122 472 118 236 121 473 5 239 161 475 5 239 161 475 118 236 121 473 4 237 160 474 120 240 123 476 119 238 122 477 6 241 162 479 6 241 162 479 119 238 122 477 5 239 161 478 121 242 124 480 120 240 123 481 7 243 163 483 7 243 163 483 120 240 123 481 6 241 162 482 122 244 125 484 121 242 124 485 8 245 164 487 8 245 164 487 121 242 124 485 7 243 163 486 123 246 126 488 122 244 125 489 9 247 165 491 9 247 165 491 122 244 125 489 8 245 164 490 124 248 127 492 123 246 126 493 10 249 166 495 10 249 166 495 123 246 126 493 9 247 165 494 125 250 128 496 124 248 127 497 11 251 167 499 11 251 167 499 124 248 127 497 10 249 166 498 126 252 129 500 125 250 128 501 12 253 168 503 12 253 168 503 125 250 128 501 11 251 167 502 127 254 130 504 126 252 129 505 13 255 169 507 13 255 169 507 126 252 129 505 12 253 168 506 128 256 131 508 127 254 130 509 14 257 170 511 14 257 170 511 127 254 130 509 13 255 169 510 129 258 132 512 128 256 131 513 15 259 171 515 15 259 171 515 128 256 131 513 14 257 170 514 130 260 133 516 129 258 132 517 16 261 172 519 16 261 172 519 129 258 132 517 15 259 171 518 131 262 134 520 130 260 133 521 17 263 173 523 17 263 173 523 130 260 133 521 16 261 172 522 132 264 135 524 131 262 134 525 18 265 174 527 18 265 174 527 131 262 134 525 17 263 173 526 133 266 136 528 132 264 135 529 19 267 175 531 19 267 175 531 132 264 135 529 18 265 174 530 134 268 137 532 133 266 136 533 20 269 176 535 20 269 176 535 133 266 136 533 19 267 175 534 135 270 138 536 134 268 137 537 21 271 177 539 21 271 177 539 134 268 137 537 20 269 176 538 136 272 139 540 135 270 138 541 22 273 178 543 22 273 178 543 135 270 138 541 21 271 177 542 137 274 140 544 136 272 139 545 23 275 179 547 23 275 179 547 136 272 139 545 22 273 178 546 138 276 141 548 137 274 140 549 24 277 180 551 24 277 180 551 137 274 140 549 23 275 179 550 139 278 142 552 138 276 141 553 25 279 181 555 25 279 181 555 138 276 141 553 24 277 180 554 140 280 143 556 139 278 142 557 26 281 182 559 26 281 182 559 139 278 142 557 25 279 181 558 141 282 144 560 140 280 143 561 27 283 183 563 27 283 183 563 140 280 143 561 26 281 182 562 142 284 145 564 141 282 144 565 28 285 184 567 28 285 184 567 141 282 144 565 27 283 183 566 143 286 146 568 142 284 145 569 29 287 185 571 29 287 185 571 142 284 145 569 28 285 184 570 144 288 147 572 143 286 146 573 30 289 186 575 30 289 186 575 143 286 146 573 29 287 185 574 145 290 148 576 144 288 147 577 31 291 187 579 31 291 187 579 144 288 147 577 30 289 186 578 146 292 149 580 145 290 148 581 32 293 188 583 32 293 188 583 145 290 148 581 31 291 187 582 147 294 150 584 146 292 149 585 33 295 189 587 33 295 189 587 146 292 149 585 32 293 188 586 148 296 151 588 147 294 150 589 34 297 190 591 34 297 190 591 147 294 150 589 33 295 189 590 149 298 152 592 148 296 151 593 35 299 191 595 35 299 191 595 148 296 151 593 34 297 190 594 150 300 153 596 149 298 152 597 36 301 192 599 36 301 192 599 149 298 152 597 35 299 191 598 151 302 154 600 150 300 153 601 37 303 193 603 37 303 193 603 150 300 153 601 36 301 192 602 114 229 155 604 151 302 154 605 0 230 194 607 0 230 194 607 151 302 154 605 37 303 193 606</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_ringShape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_ring" name="qt_gauge_ring" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_ringShape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_ring</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_180.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_180.dae
new file mode 100644
index 0000000..bc8ef10
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_180.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:48:49</created>
+ <modified>2018-03-08T09:48:49</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_ring_Shape180" name="qt_gauge_ring_Shape180">
+ <mesh>
+ <source id="qt_gauge_ring_Shape180-positions" name="qt_gauge_ring_Shape180-positions">
+ <float_array id="qt_gauge_ring_Shape180-positions-array" count="126">-9.580339 0.0025 0 -9.46239 0.0025 -1.498695 -9.111445 0.0025 -2.960488 -8.536146 0.0025 -4.349383 -7.750659 0.0025 -5.631183 -6.774324 0.0025 -6.774324 -5.631183 0.0025 -7.750659 -4.349384 0.0025 -8.536146 -2.960488 0.0025 -9.111445 -1.498696 0.0025 -9.462391 0 0.0025 -9.58034 1.498695 0.0025 -9.462391 2.960488 0.0025 -9.111445 4.349384 0.0025 -8.536146 5.631184 0.0025 -7.750659 6.774325 0.0025 -6.774324 7.750659 0.0025 -5.631183 8.536147 0.0025 -4.349383 9.111446 0.0025 -2.960487 9.462392 0.0025 -1.498695 9.580341 0.0025 0 -11.18034 0.0025 0 -11.04269 0.0025 -1.748991 -10.63313 0.0025 -3.454916 -9.961756 0.0025 -5.075768 -9.045085 0.0025 -6.57164 -7.905694 0.0025 -7.905695 -6.571639 0.0025 -9.045086 -5.075768 0.0025 -9.961758 -3.454915 0.0025 -10.63314 -1.74899 0.0025 -11.04269 0 0.0025 -11.18034 1.748992 0.0025 -11.04269 3.454917 0.0025 -10.63314 5.075771 0.0025 -9.961759 6.571642 0.0025 -9.045088 7.905698 0.0025 -7.905697 9.04509 0.0025 -6.571641 9.961761 0.0025 -5.075769 10.63314 0.0025 -3.454916 11.0427 0.0025 -1.74899 11.18035 0.0025 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape180-positions-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape180-normals" name="qt_gauge_ring_Shape180-normals">
+ <float_array id="qt_gauge_ring_Shape180-normals-array" count="126">0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape180-normals-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape180-tangents" name="qt_gauge_ring_Shape180-tangents">
+ <float_array id="qt_gauge_ring_Shape180-tangents-array" count="126">0 0 -1 -0.9969174 0 -0.07845883 -0.97237 0 -0.2334449 -0.9238796 0 -0.3826834 -0.8526402 0 -0.5224984 -0.7604059 0 -0.6494481 -0.6494481 0 -0.7604059 -0.5224986 0 -0.8526402 -0.3826834 0 -0.9238796 -0.2334454 0 -0.9723699 -0.07845882 0 -0.9969174 0.07845883 0 -0.9969174 0.2334454 0 -0.9723699 0.3826833 0 -0.9238796 0.5224984 0 -0.8526402 0.6494481 0 -0.7604059 0.7604061 0 -0.6494479 0.8526402 0 -0.5224984 0.9238796 0 -0.3826834 0.9723699 0 -0.2334454 0.9969174 0 -0.07845882 0.9969173 0 0.07845911 0.9723699 0 0.2334454 0.9238796 0 0.3826833 0.8526402 0 0.5224985 0.7604061 0 0.6494479 0.649448 0 0.760406 0.5224989 0 0.85264 0.3826837 0 0.9238794 0.2334454 0 0.9723699 0.0784591 0 0.9969173 -0.0784591 0 0.9969173 -0.2334454 0 0.9723699 -0.3826832 0 0.9238796 -0.5224984 0 0.8526403 -0.6494479 0 0.7604061 -0.760406 0 0.6494481 -0.85264 0 0.5224988 -0.9238795 0 0.3826836 -0.9723699 0 0.2334453 -0.9969173 0 0.07845907 0 0 -1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape180-tangents-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape180-binormals" name="qt_gauge_ring_Shape180-binormals">
+ <float_array id="qt_gauge_ring_Shape180-binormals-array" count="126">-1 0 0 -0.07845883 0 0.9969174 -0.2334449 0 0.97237 -0.3826834 0 0.9238796 -0.5224984 0 0.8526403 -0.6494481 0 0.760406 -0.760406 0 0.6494481 -0.8526402 0 0.5224985 -0.9238796 0 0.3826834 -0.9723699 0 0.2334454 -0.9969174 0 0.07845882 -0.9969174 0 -0.07845882 -0.9723699 0 -0.2334454 -0.9238796 0 -0.3826833 -0.8526403 0 -0.5224984 -0.760406 0 -0.6494481 -0.6494479 0 -0.7604061 -0.5224984 0 -0.8526403 -0.3826834 0 -0.9238796 -0.2334454 0 -0.97237 -0.07845882 0 -0.9969174 0.07845913 0 -0.9969174 0.2334454 0 -0.97237 0.3826834 0 -0.9238796 0.5224985 0 -0.8526402 0.6494479 0 -0.7604062 0.760406 0 -0.6494482 0.85264 0 -0.5224989 0.9238794 0 -0.3826837 0.9723699 0 -0.2334454 0.9969174 0 -0.07845911 0.9969174 0 0.07845911 0.9723699 0 0.2334454 0.9238796 0 0.3826832 0.8526403 0 0.5224984 0.7604061 0 0.6494479 0.6494482 0 0.760406 0.5224988 0 0.85264 0.3826836 0 0.9238795 0.2334453 0 0.97237 0.07845907 0 0.9969174 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape180-binormals-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape180-map1" name="qt_gauge_ring_Shape180-map1">
+ <float_array id="qt_gauge_ring_Shape180-map1-array" count="84">0.006734773 0.4999999 0.05606559 0.4999999 0.1053964 0.4999999 0.1547272 0.4999999 0.2040581 0.4999999 0.2533889 0.4999999 0.3027197 0.4999999 0.3520505 0.4999999 0.4013813 0.4999999 0.4507122 0.4999999 0.500043 0.4999999 0.5493739 0.4999999 0.5987047 0.4999999 0.6480355 0.4999999 0.6973664 0.4999999 0.7466971 0.4999999 0.7960279 0.4999999 0.8453588 0.4999999 0.8946896 0.4999999 0.9440205 0.4999999 0.9933512 0.4999999 0.006734773 0 0.05606559 0 0.1053964 0 0.1547272 0 0.2040581 0 0.2533889 0 0.3027197 0 0.3520505 0 0.4013813 0 0.4507122 0 0.500043 0 0.5493739 0 0.5987047 0 0.6480355 0 0.6973664 0 0.7466971 0 0.7960279 0 0.8453588 0 0.8946896 0 0.9440205 0 0.9933512 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape180-map1-array" count="42" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape180-textangents">
+ <float_array id="qt_gauge_ring_Shape180-textangents-array" count="240">0.1822824 0 -0.9832461 0.1304786 0 -0.9914511 0.07845911 0 -0.9969173 0.07845896 0 -0.9969173 0.3338518 0 -0.9426255 0.2839692 0 -0.9588334 0.1304786 0 -0.9914511 0.1822824 0 -0.9832461 0.4772008 0 -0.8787943 0.4304677 0 -0.902606 0.2839692 0 -0.9588334 0.3338518 0 -0.9426255 0.6087993 0 -0.7933241 0.5663666 0 -0.8241534 0.4304677 0 -0.902606 0.4772008 0 -0.8787943 0.7254073 0 -0.6883197 0.6883197 0 -0.7254074 0.5663666 0 -0.8241534 0.6087993 0 -0.7933241 0.8241532 0 -0.5663669 0.7933241 0 -0.6087995 0.6883197 0 -0.7254074 0.7254073 0 -0.6883197 0.9026058 0 -0.4304679 0.8787941 0 -0.4772011 0.7933241 0 -0.6087995 0.8241532 0 -0.5663669 0.9588333 0 -0.2839694 0.9426254 0 -0.3338521 0.8787941 0 -0.4772011 0.9026058 0 -0.4304679 0.9914511 0 -0.1304786 0.9832461 0 -0.1822827 0.9426254 0 -0.3338521 0.9588333 0 -0.2839694 0.999656 0 0.02622488 0.999656 0 -0.02622479 0.9832461 0 -0.1822827 0.9914511 0 -0.1304786 0.9832461 0 0.1822826 0.9914511 0 0.1304786 0.999656 0 -0.02622479 0.999656 0 0.02622488 0.9426255 0 0.3338519 0.9588333 0 0.2839693 0.9914511 0 0.1304786 0.9832461 0 0.1822826 0.8787943 0 0.4772007 0.902606 0 0.4304677 0.9588333 0 0.2839693 0.9426255 0 0.3338519 0.7933241 0 0.6087993 0.8241534 0 0.5663665 0.902606 0 0.4304677 0.8787943 0 0.4772007 0.6883197 0 0.7254074 0.7254073 0 0.6883197 0.8241534 0 0.5663665 0.7933241 0 0.6087993 0.5663667 0 0.8241533 0.6087995 0 0.7933241 0.7254073 0 0.6883197 0.6883197 0 0.7254074 0.4304678 0 0.9026058 0.477201 0 0.8787941 0.6087995 0 0.7933241 0.5663667 0 0.8241533 0.2839693 0 0.9588333 0.3338521 0 0.9426254 0.477201 0 0.8787941 0.4304678 0 0.9026058 0.1304786 0 0.9914511 0.1822827 0 0.9832461 0.3338521 0 0.9426254 0.2839693 0 0.9588333 0.07845882 0 0.9969173 0.07845894 0 0.9969173 0.1822827 0 0.9832461 0.1304786 0 0.9914511</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape180-textangents-array" count="80" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape180-texbinormals">
+ <float_array id="qt_gauge_ring_Shape180-texbinormals-array" count="240">0.9832463 0 0.1822824 0.9914511 0 0.1304786 0.9969174 0 0.07845913 0.9969174 0 0.07845897 0.9426256 0 0.3338518 0.9588335 0 0.2839692 0.9914511 0 0.1304786 0.9832463 0 0.1822824 0.8787943 0 0.4772008 0.9026061 0 0.4304677 0.9588335 0 0.2839692 0.9426256 0 0.3338518 0.7933242 0 0.6087994 0.8241535 0 0.5663666 0.9026061 0 0.4304677 0.8787943 0 0.4772008 0.6883198 0 0.7254074 0.7254074 0 0.6883197 0.8241535 0 0.5663666 0.7933242 0 0.6087994 0.5663669 0 0.8241534 0.6087995 0 0.7933241 0.7254074 0 0.6883197 0.6883198 0 0.7254074 0.4304679 0 0.9026059 0.4772011 0 0.8787942 0.6087995 0 0.7933241 0.5663669 0 0.8241534 0.2839694 0 0.9588335 0.3338522 0 0.9426255 0.4772011 0 0.8787942 0.4304679 0 0.9026059 0.1304786 0 0.9914512 0.1822827 0 0.9832463 0.3338522 0 0.9426255 0.2839694 0 0.9588335 -0.02622488 0 0.9996561 0.02622479 0 0.9996561 0.1822827 0 0.9832463 0.1304786 0 0.9914512 -0.1822826 0 0.9832463 -0.1304786 0 0.9914512 0.02622479 0 0.9996561 -0.02622488 0 0.9996561 -0.333852 0 0.9426256 -0.2839693 0 0.9588335 -0.1304786 0 0.9914512 -0.1822826 0 0.9832463 -0.4772007 0 0.8787944 -0.4304677 0 0.9026061 -0.2839693 0 0.9588335 -0.333852 0 0.9426256 -0.6087994 0 0.7933242 -0.5663666 0 0.8241535 -0.4304677 0 0.9026061 -0.4772007 0 0.8787944 -0.7254074 0 0.6883197 -0.6883199 0 0.7254074 -0.5663666 0 0.8241535 -0.6087994 0 0.7933242 -0.8241534 0 0.5663667 -0.7933242 0 0.6087995 -0.6883199 0 0.7254074 -0.7254074 0 0.6883197 -0.902606 0 0.4304678 -0.8787942 0 0.477201 -0.7933242 0 0.6087995 -0.8241534 0 0.5663667 -0.9588335 0 0.2839694 -0.9426256 0 0.3338521 -0.8787942 0 0.477201 -0.902606 0 0.4304678 -0.9914511 0 0.1304786 -0.9832462 0 0.1822827 -0.9426256 0 0.3338521 -0.9588335 0 0.2839694 -0.9969174 0 0.07845882 -0.9969174 0 0.07845896 -0.9832462 0 0.1822827 -0.9914511 0 0.1304786</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape180-texbinormals-array" count="80" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_ring_Shape180-vertices" name="qt_gauge_ring_Shape180-vertices">
+ <input semantic="POSITION" source="#qt_gauge_ring_Shape180-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_ring_Shape180-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_ring_Shape180-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_ring_Shape180-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="40">
+ <input semantic="VERTEX" source="#qt_gauge_ring_Shape180-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_ring_Shape180-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_ring_Shape180-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_ring_Shape180-texbinormals" offset="2" set="0"/>
+ <p>1 1 0 22 22 1 0 0 3 0 0 3 22 22 1 21 21 2 2 2 4 23 23 5 1 1 7 1 1 7 23 23 5 22 22 6 3 3 8 24 24 9 2 2 11 2 2 11 24 24 9 23 23 10 4 4 12 25 25 13 3 3 15 3 3 15 25 25 13 24 24 14 5 5 16 26 26 17 4 4 19 4 4 19 26 26 17 25 25 18 6 6 20 27 27 21 5 5 23 5 5 23 27 27 21 26 26 22 7 7 24 28 28 25 6 6 27 6 6 27 28 28 25 27 27 26 8 8 28 29 29 29 7 7 31 7 7 31 29 29 29 28 28 30 9 9 32 30 30 33 8 8 35 8 8 35 30 30 33 29 29 34 10 10 36 31 31 37 9 9 39 9 9 39 31 31 37 30 30 38 11 11 40 32 32 41 10 10 43 10 10 43 32 32 41 31 31 42 12 12 44 33 33 45 11 11 47 11 11 47 33 33 45 32 32 46 13 13 48 34 34 49 12 12 51 12 12 51 34 34 49 33 33 50 14 14 52 35 35 53 13 13 55 13 13 55 35 35 53 34 34 54 15 15 56 36 36 57 14 14 59 14 14 59 36 36 57 35 35 58 16 16 60 37 37 61 15 15 63 15 15 63 37 37 61 36 36 62 17 17 64 38 38 65 16 16 67 16 16 67 38 38 65 37 37 66 18 18 68 39 39 69 17 17 71 17 17 71 39 39 69 38 38 70 19 19 72 40 40 73 18 18 75 18 18 75 40 40 73 39 39 74 20 20 76 41 41 77 19 19 79 19 19 79 41 41 77 40 40 78</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_ring_Shape180</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_ring_180" name="qt_gauge_ring_180" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_ring_Shape180">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_ring_180</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_2.dae
new file mode 100644
index 0000000..acad7a6
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_2.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:47:15</created>
+ <modified>2018-03-08T09:47:15</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_ring_Shape2" name="qt_gauge_ring_Shape2">
+ <mesh>
+ <source id="qt_gauge_ring_Shape2-positions" name="qt_gauge_ring_Shape2-positions">
+ <float_array id="qt_gauge_ring_Shape2-positions-array" count="600">10.68034 0 0 10.59612 0 -1.338602 10.3448 0 -2.656093 9.93033 0 -3.931695 9.359255 0 -5.145293 8.640578 0 -6.277747 7.785635 0 -7.311196 6.807907 0 -8.229344 5.722814 0 -9.017711 4.547469 0 -9.663862 3.300408 0 -10.15761 2.001297 0 -10.49116 0.6706251 0 -10.65927 -0.6706235 0 -10.65927 -2.001296 0 -10.49117 -3.300407 0 -10.15761 -4.547469 0 -9.663865 -5.722814 0 -9.017714 -6.807907 0 -8.229348 -7.785635 0 -7.3112 -8.64058 0 -6.27775 -9.359258 0 -5.145296 -9.930334 0 -3.931698 -10.3448 0 -2.656095 -10.59613 0 -1.338603 -10.68035 0 0 -10.59613 0 1.338602 -10.3448 0 2.656094 -9.930336 0 3.931698 -9.359261 0 5.145296 -8.640584 0 6.27775 -7.78564 0 7.311201 -6.807911 0 8.229349 -5.722818 0 9.017715 -4.547473 0 9.663868 -3.300411 0 10.15761 -2.0013 0 10.49117 -0.6706266 0 10.65928 0.6706229 0 10.65928 2.001297 0 10.49117 3.300408 0 10.15762 4.547471 0 9.663874 5.722817 0 9.017722 6.807912 0 8.229356 7.785641 0 7.311207 8.640587 0 6.277757 9.359265 0 5.145302 9.930343 0 3.931703 10.34481 0 2.656098 10.59614 0 1.338605 10.68034 0.3989106 0 10.59612 0.3989106 -1.338602 10.3448 0.3989106 -2.656093 9.93033 0.3989106 -3.931695 9.359255 0.3989106 -5.145293 8.640578 0.3989106 -6.277747 7.785635 0.3989106 -7.311196 6.807907 0.3989106 -8.229344 5.722814 0.3989106 -9.017711 4.547469 0.3989106 -9.663862 3.300408 0.3989106 -10.15761 2.001297 0.3989106 -10.49116 0.6706251 0.3989106 -10.65927 -0.6706235 0.3989106 -10.65927 -2.001296 0.3989106 -10.49117 -3.300407 0.3989106 -10.15761 -4.547469 0.3989106 -9.663865 -5.722814 0.3989106 -9.017714 -6.807907 0.3989106 -8.229348 -7.785635 0.3989106 -7.3112 -8.64058 0.3989106 -6.27775 -9.359258 0.3989106 -5.145296 -9.930334 0.3989106 -3.931698 -10.3448 0.3989106 -2.656095 -10.59613 0.3989106 -1.338603 -10.68035 0.3989106 0 -10.59613 0.3989106 1.338602 -10.3448 0.3989106 2.656094 -9.930336 0.3989106 3.931698 -9.359261 0.3989106 5.145296 -8.640584 0.3989106 6.27775 -7.78564 0.3989106 7.311201 -6.807911 0.3989106 8.229349 -5.722818 0.3989106 9.017715 -4.547473 0.3989106 9.663868 -3.300411 0.3989106 10.15761 -2.0013 0.3989106 10.49117 -0.6706266 0.3989106 10.65928 0.6706229 0.3989106 10.65928 2.001297 0.3989106 10.49117 3.300408 0.3989106 10.15762 4.547471 0.3989106 9.663874 5.722817 0.3989106 9.017722 6.807912 0.3989106 8.229356 7.785641 0.3989106 7.311207 8.640587 0.3989106 6.277757 9.359265 0.3989106 5.145302 9.930343 0.3989106 3.931703 10.34481 0.3989106 2.656098 10.59614 0.3989106 1.338605 11.18034 0.3989106 0 11.09218 0.3989106 -1.401268 10.82909 0.3989106 -2.780437 10.39522 0.3989106 -4.115757 9.797406 0.3989106 -5.386169 9.045085 0.3989106 -6.571639 8.150117 0.3989106 -7.653469 7.126616 0.3989106 -8.614599 5.990726 0.3989106 -9.439873 4.760357 0.3989106 -10.11627 3.454916 0.3989106 -10.63313 2.094987 0.3989106 -10.98231 0.7020199 0.3989106 -11.15828 -0.7020189 0.3989106 -11.15828 -2.094986 0.3989106 -10.98231 -3.454915 0.3989106 -10.63314 -4.760358 0.3989106 -10.11628 -5.990727 0.3989106 -9.439875 -7.126618 0.3989106 -8.614601 -8.150119 0.3989106 -7.653471 -9.045087 0.3989106 -6.57164 -9.797408 0.3989106 -5.386171 -10.39522 0.3989106 -4.115759 -10.82909 0.3989106 -2.780438 -11.09218 0.3989106 -1.401269 -11.18034 0.3989106 0 -11.09218 0.3989106 1.401268 -10.82909 0.3989106 2.780438 -10.39522 0.3989106 4.115758 -9.797409 0.3989106 5.38617 -9.045088 0.3989106 6.57164 -8.15012 0.3989106 7.653471 -7.126619 0.3989106 8.614602 -5.990728 0.3989106 9.439876 -4.76036 0.3989106 10.11628 -3.454917 0.3989106 10.63314 -2.094989 0.3989106 10.98231 -0.702021 0.3989106 11.15828 0.7020181 0.3989106 11.15828 2.094986 0.3989106 10.98231 3.454915 0.3989106 10.63314 4.760358 0.3989106 10.11628 5.990727 0.3989106 9.439878 7.126619 0.3989106 8.614605 8.150121 0.3989106 7.653474 9.04509 0.3989106 6.571643 9.797412 0.3989106 5.386174 10.39522 0.3989106 4.115761 10.8291 0.3989106 2.78044 11.09219 0.3989106 1.40127 11.18034 0 0 11.09218 0 -1.401268 10.82909 0 -2.780437 10.39522 0 -4.115757 9.797406 0 -5.386169 9.045085 0 -6.571639 8.150117 0 -7.653469 7.126616 0 -8.614599 5.990726 0 -9.439873 4.760357 0 -10.11627 3.454916 0 -10.63313 2.094987 0 -10.98231 0.7020199 0 -11.15828 -0.7020189 0 -11.15828 -2.094986 0 -10.98231 -3.454915 0 -10.63314 -4.760358 0 -10.11628 -5.990727 0 -9.439875 -7.126618 0 -8.614601 -8.150119 0 -7.653471 -9.045087 0 -6.57164 -9.797408 0 -5.386171 -10.39522 0 -4.115759 -10.82909 0 -2.780438 -11.09218 0 -1.401269 -11.18034 0 0 -11.09218 0 1.401268 -10.82909 0 2.780438 -10.39522 0 4.115758 -9.797409 0 5.38617 -9.045088 0 6.57164 -8.15012 0 7.653471 -7.126619 0 8.614602 -5.990728 0 9.439876 -4.76036 0 10.11628 -3.454917 0 10.63314 -2.094989 0 10.98231 -0.702021 0 11.15828 0.7020181 0 11.15828 2.094986 0 10.98231 3.454915 0 10.63314 4.760358 0 10.11628 5.990727 0 9.439878 7.126619 0 8.614605 8.150121 0 7.653474 9.04509 0 6.571643 9.797412 0 5.386174 10.39522 0 4.115761 10.8291 0 2.78044 11.09219 0 1.40127</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape2-positions-array" count="200" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape2-normals" name="qt_gauge_ring_Shape2-normals">
+ <float_array id="qt_gauge_ring_Shape2-normals-array" count="1200">-0.9921147 0 0.1253329 -0.9999999 0 0 -0.9999999 0 0 -0.9921147 0 0.1253329 -0.9685832 0 0.2486895 -0.9685832 0 0.2486895 -0.9297765 0 0.3681242 -0.9297765 0 0.3681242 -0.8763068 0 0.4817535 -0.8763068 0 0.4817535 -0.8090171 0 0.5877852 -0.8090171 0 0.5877852 -0.7289686 0 0.6845471 -0.7289686 0 0.6845471 -0.6374242 0 0.7705131 -0.6374242 0 0.7705131 -0.5358269 0 0.8443278 -0.5358269 0 0.8443278 -0.4257793 0 0.9048269 -0.4257793 0 0.9048269 -0.3090174 0 0.9510564 -0.3090174 0 0.9510564 -0.1873817 0 0.9822872 -0.1873817 0 0.9822872 -0.06279053 0 0.9980267 -0.06279053 0 0.9980267 0.06279007 0 0.9980268 0.06279007 0 0.9980268 0.1873808 0 0.9822874 0.1873808 0 0.9822874 0.3090166 0 0.9510565 0.3090166 0 0.9510565 0.425779 0 0.9048271 0.425779 0 0.9048271 0.5358266 0 0.844328 0.5358266 0 0.844328 0.6374237 0 0.7705134 0.6374237 0 0.7705134 0.7289685 0 0.6845472 0.7289685 0 0.6845472 0.8090168 0 0.5877854 0.8090168 0 0.5877854 0.8763065 0 0.4817539 0.8763065 0 0.4817539 0.9297764 0 0.3681247 0.9297764 0 0.3681247 0.9685831 0 0.2486902 0.9685831 0 0.2486902 0.9921145 0 0.1253336 0.9921145 0 0.1253336 0.9999999 0 0 1 0 0 0.9921147 0 -0.1253329 0.9921147 0 -0.1253329 0.9685832 0 -0.2486898 0.9685832 0 -0.2486898 0.9297766 0 -0.3681243 0.9297766 0 -0.3681243 0.876307 0 -0.4817532 0.876307 0 -0.4817532 0.8090171 0 -0.587785 0.8090171 0 -0.587785 0.7289686 0 -0.6845469 0.7289686 0 -0.6845469 0.637424 0 -0.7705132 0.637424 0 -0.7705132 0.535827 0 -0.8443276 0.535827 0 -0.8443276 0.4257795 0 -0.9048269 0.4257795 0 -0.9048269 0.3090172 0 -0.9510564 0.3090172 0 -0.9510564 0.187382 0 -0.9822871 0.187382 0 -0.9822871 0.06279137 0 -0.9980266 0.06279137 0 -0.9980266 -0.06278959 0 -0.9980267 -0.06278957 0 -0.9980267 -0.1873807 0 -0.9822874 -0.1873807 0 -0.9822874 -0.3090164 0 -0.9510567 -0.3090164 0 -0.9510567 -0.4257787 0 -0.9048273 -0.4257787 0 -0.9048273 -0.5358263 0 -0.8443281 -0.5358263 0 -0.8443281 -0.6374236 0 -0.7705136 -0.6374236 0 -0.7705136 -0.7289683 0 -0.6845473 -0.7289683 0 -0.6845473 -0.8090166 0 -0.5877857 -0.8090166 0 -0.5877857 -0.8763064 0 -0.4817542 -0.8763064 0 -0.4817542 -0.9297763 0 -0.368125 -0.9297763 0 -0.368125 -0.968583 0 -0.2486902 -0.968583 0 -0.2486902 -0.9921154 0 -0.1253274 -0.9921154 0 -0.1253274 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0.9921146 0 -0.1253335 0.9999999 0 0 0.9999999 0 0 0.9921146 0 -0.1253335 0.968583 0 -0.2486898 0.968583 0 -0.2486898 0.9297764 0 -0.3681245 0.9297764 0 -0.3681245 0.8763067 0 -0.4817536 0.8763067 0 -0.4817536 0.809017 0 -0.5877851 0.809017 0 -0.5877851 0.7289684 0 -0.6845473 0.7289684 0 -0.6845473 0.6374238 0 -0.7705132 0.6374238 0 -0.7705132 0.5358269 0 -0.8443278 0.5358269 0 -0.8443278 0.4257793 0 -0.9048269 0.4257793 0 -0.9048269 0.3090173 0 -0.9510564 0.3090173 0 -0.9510564 0.1873817 0 -0.982287 0.1873817 0 -0.982287 0.06279069 0 -0.9980267 0.06279069 0 -0.9980267 -0.06279026 0 -0.9980267 -0.06279026 0 -0.9980267 -0.1873808 0 -0.9822873 -0.1873808 0 -0.9822873 -0.3090168 0 -0.9510565 -0.3090168 0 -0.9510565 -0.4257792 0 -0.904827 -0.4257792 0 -0.904827 -0.5358268 0 -0.8443279 -0.5358268 0 -0.8443279 -0.637424 0 -0.7705132 -0.637424 0 -0.7705132 -0.7289684 0 -0.6845471 -0.7289684 0 -0.6845471 -0.809017 0 -0.5877851 -0.809017 0 -0.5877851 -0.8763067 0 -0.4817536 -0.8763067 0 -0.4817536 -0.9297763 0 -0.3681247 -0.9297763 0 -0.3681247 -0.968583 0 -0.2486901 -0.968583 0 -0.2486901 -0.9921146 0 -0.1253334 -0.9921146 0 -0.1253334 -0.9999999 0 0 -0.9999999 0 0 -0.9921146 0 0.1253334 -0.9921146 0 0.1253334 -0.9685831 0 0.2486898 -0.9685831 0 0.2486898 -0.9297765 0 0.3681244 -0.9297765 0 0.3681244 -0.8763067 0 0.4817534 -0.8763067 0 0.4817534 -0.8090172 0 0.5877849 -0.8090172 0 0.5877849 -0.7289686 0 0.6845469 -0.7289686 0 0.6845469 -0.6374241 0 0.7705131 -0.6374241 0 0.7705131 -0.535827 0 0.8443277 -0.535827 0 0.8443277 -0.4257792 0 0.904827 -0.4257792 0 0.904827 -0.3090168 0 0.9510565 -0.3090168 0 0.9510565 -0.1873816 0 0.9822871 -0.1873816 0 0.9822871 -0.06279111 0 0.9980266 -0.06279111 0 0.9980266 0.06278982 0 0.9980267 0.06278982 0 0.9980267 0.1873808 0 0.9822873 0.1873808 0 0.9822873 0.3090168 0 0.9510565 0.3090168 0 0.9510565 0.4257791 0 0.904827 0.4257791 0 0.904827 0.5358265 0 0.844328 0.5358265 0 0.844328 0.6374236 0 0.7705134 0.6374236 0 0.7705134 0.7289682 0 0.6845474 0.7289682 0 0.6845474 0.8090168 0 0.5877854 0.8090168 0 0.5877854 0.8763065 0 0.4817539 0.8763065 0 0.4817539 0.9297763 0 0.3681248 0.9297763 0 0.3681248 0.968583 0 0.24869 0.968583 0 0.24869 0.992115 0 0.1253307 0.992115 0 0.1253307 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape2-normals-array" count="400" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape2-tangents" name="qt_gauge_ring_Shape2-tangents">
+ <float_array id="qt_gauge_ring_Shape2-tangents-array" count="1200">0.1253329 0 0.9921148 0 1 0 0 0 -1 0 -1 0 0.2486895 0 0.9685833 0 -1 0 0.3681242 0 0.9297767 0 -1 0 0.4817535 0 0.8763069 0 -1 0 0.5877852 0 0.8090171 0 -1 0 0.6845471 0 0.7289687 0 -1 0 0.770513 0 0.6374242 0 -1 0 0.8443279 0 0.535827 0 -1 0 0.9048271 0 0.4257793 0 -1 0 0.9510564 0 0.3090174 0 -1 0 0.9822872 0 0.1873817 0 -1 0 0.9980267 0 0.06279053 0 -1 0 0.9980268 0 -0.06279007 0 -1 0 0.9822873 0 -0.1873808 0 -1 0 0.9510567 0 -0.3090166 0 -1 0 0.9048272 0 -0.425779 0 -1 0 0.8443281 0 -0.5358266 0 -1 0 0.7705135 0 -0.6374238 0 -1 0 0.6845472 0 -0.7289685 0 -0.9999999 0 0.5877855 0 -0.8090168 0 -1 0 0.4817539 0 -0.8763066 0 -0.9999999 0 0.3681248 0 -0.9297764 0 -0.9999999 0 0.2486902 0 -0.9685831 0 -1 0 0.1253336 0 -0.9921146 0 -0.9999999 0 0 0 -1 0 -0.9999999 0 -0.1253329 0 -0.9921147 0 -0.9999999 0 -0.2486898 0 -0.9685832 0 -1 0 -0.3681243 0 -0.9297766 0 -1 0 -0.4817532 0 -0.876307 0 -1 0 -0.5877851 0 -0.8090172 0 -0.9999999 0 -0.684547 0 -0.7289687 0 -1 0 -0.7705132 0 -0.6374241 0 -1 0 -0.8443277 0 -0.5358271 0 -1 0 -0.904827 0 -0.4257795 0 -1 0 -0.9510565 0 -0.3090172 0 -1 0 -0.9822871 0 -0.187382 0 -1 0 -0.9980267 0 -0.06279137 0 -1 0 -0.9980268 0 0.0627896 0 -1 0 -0.9822874 0 0.1873807 0 -1 0 -0.9510567 0 0.3090164 0 -1 0 -0.9048274 0 0.4257787 0 -1 0 -0.8443282 0 0.5358263 0 -1 0 -0.7705135 0 0.6374236 0 -1 0 -0.6845474 0 0.7289684 0 -1 0 -0.5877857 0 0.8090166 0 -1 0 -0.4817542 0 0.8763064 0 -1 0 -0.368125 0 0.9297763 0 -1 0 -0.2486903 0 0.9685832 0 -0.9999999 0 -0.1253274 0 0.9921154 0 -1 0 0.1253333 0 0.9921148 0.9980268 0 -0.06279007 0 0 -1 -0.9980267 0 0.06279066 0.2486904 0 0.9685831 -0.9822872 0 0.1873816 0.3681252 0 0.9297763 -0.9510566 0 0.3090167 0.4817544 0 0.8763064 -0.904827 0 0.4257794 0.5877861 0 0.8090165 -0.8443281 0 0.5358267 0.6845482 0 0.7289677 -0.7705132 0 0.6374241 0.7705139 0 0.6374232 -0.6845468 0 0.7289689 0.8443286 0 0.5358257 -0.5877854 0 0.8090168 0.9048275 0 0.4257784 -0.481754 0 0.8763065 0.9510566 0 0.3090169 -0.3681245 0 0.9297765 0.9822875 0 0.1873807 -0.2486902 0 0.9685831 0.9980268 0 0.06278998 -0.1253334 0 0.9921147 0.9980267 0 -0.06279104 0 0 1 0.9822872 0 -0.1873817 0.1253327 0 0.9921147 0.9510564 0 -0.3090177 0.2486895 0 0.9685833 0.9048265 0 -0.4257808 0.3681243 0 0.9297765 0.8443269 0 -0.5358286 0.4817537 0 0.8763067 0.770511 0 -0.6374267 0.5877853 0 0.8090169 0.6845447 0 -0.7289709 0.684547 0 0.7289687 0.5877836 0 -0.8090183 0.7705132 0 0.6374241 0.481753 0 -0.8763071 0.844328 0 0.5358266 0.3681248 0 -0.9297764 0.904827 0 0.4257794 0.2486895 0 -0.9685832 0.9510564 0 0.3090172 0.1253333 0 -0.9921148 0.9822872 0 0.1873816 0 0 -1 0.9980267 0 0.06279065 -0.1253333 0 -0.9921148 0.9980267 0 -0.06279065 -0.2486904 0 -0.968583 0.9822872 0 -0.1873816 -0.3681242 0 -0.9297766 0.9510566 0 -0.3090166 -0.4817539 0 -0.8763066 0.9048271 0 -0.4257793 -0.5877857 0 -0.8090167 0.8443281 0 -0.5358264 -0.6845475 0 -0.7289683 0.7705134 0 -0.6374238 -0.7705143 0 -0.6374228 0.6845472 0 -0.7289686 -0.8443288 0 -0.5358254 0.5877855 0 -0.8090169 -0.9048275 0 -0.4257783 0.4817539 0 -0.8763067 -0.9510568 0 -0.3090164 0.3681244 0 -0.9297765 -0.9822875 0 -0.1873803 0.2486901 0 -0.9685831 -0.9980268 0 -0.06278963 0.1253334 0 -0.9921147 -0.9980267 0 0.06279141 0 0 -1 -0.9822872 0 0.187382 -0.1253327 0 -0.9921148 -0.9510562 0 0.3090179 -0.2486895 0 -0.9685833 -0.9048265 0 0.4257805 -0.3681243 0 -0.9297766 -0.8443266 0 0.5358288 -0.4817535 0 -0.8763068 -0.7705116 0 0.637426 -0.5877851 0 -0.8090171 -0.6845449 0 0.7289706 -0.6845466 0 -0.728969 -0.5877828 0 0.8090187 -0.770513 0 -0.6374242 -0.4817518 0 0.8763077 -0.8443279 0 -0.535827 -0.3681225 0 0.9297773 -0.9048269 0 -0.4257798 -0.2486878 0 0.9685837 -0.9510565 0 -0.3090171 -0.1253314 0 0.992115 -0.9822872 0 -0.1873816 0.1253335 0 0.9921147 0 -1 0 0 0 -1 0 1 0 0.2486899 0 0.9685832 0 1 0 0.3681245 0 0.9297765 0 1 0 0.4817536 0 0.8763067 0 1 0 0.5877851 0 0.8090171 0 1 0 0.6845473 0 0.7289684 0 1 0 0.7705133 0 0.6374239 0 1 0 0.8443279 0 0.535827 0 1 0 0.904827 0 0.4257794 0 1 0 0.9510564 0 0.3090173 0 1 0 0.9822871 0 0.1873817 0 1 0 0.9980267 0 0.06279069 0 1 0 0.9980268 0 -0.06279027 0 1 0 0.9822873 0 -0.1873808 0 1 0 0.9510565 0 -0.3090168 0 1 0 0.9048271 0 -0.4257793 0 1 0 0.8443279 0 -0.5358269 0 1 0 0.7705132 0 -0.6374241 0 1 0 0.6845471 0 -0.7289685 0 1 0 0.5877851 0 -0.8090171 0 1 0 0.4817536 0 -0.8763067 0 1 0 0.3681248 0 -0.9297764 0 1 0 0.2486901 0 -0.968583 0 1 0 0.1253335 0 -0.9921147 0 1 0 0 0 -1 0 1 0 -0.1253334 0 -0.9921147 0 1 0 -0.2486898 0 -0.9685832 0 1 0 -0.3681244 0 -0.9297765 0 1 0 -0.4817535 0 -0.8763068 0 1 0 -0.5877849 0 -0.8090172 0 1 0 -0.684547 0 -0.7289687 0 1 0 -0.7705132 0 -0.6374241 0 1 0 -0.8443278 0 -0.535827 0 1 0 -0.9048271 0 -0.4257792 0 1 0 -0.9510565 0 -0.3090168 0 1 0 -0.9822872 0 -0.1873816 0 1 0 -0.9980267 0 -0.06279112 0 1 0 -0.9980268 0 0.06278983 0 1 0 -0.9822873 0 0.1873808 0 1 0 -0.9510567 0 0.3090168 0 1 0 -0.9048271 0 0.4257792 0 1 0 -0.8443281 0 0.5358266 0 0.9999999 0 -0.7705135 0 0.6374236 0 1 0 -0.6845475 0 0.7289683 0 1 0 -0.5877854 0 0.8090169 0 0.9999999 0 -0.4817539 0 0.8763066 0 1 0 -0.3681248 0 0.9297764 0 0.9999999 0 -0.24869 0 0.968583 0 1 0 -0.1253307 0 0.992115 0 1 0 0.1253333 0 0.9921148 -0.9980267 0 0.06279066 0 0 -1 0.9980268 0 -0.06279007 0.2486904 0 0.9685831 0.9822873 0 -0.1873812 0.3681252 0 0.9297763 0.9510567 0 -0.3090166 0.4817544 0 0.8763064 0.9048272 0 -0.4257791 0.587786 0 0.8090165 0.8443279 0 -0.5358266 0.6845483 0 0.7289677 0.7705132 0 -0.6374239 0.770514 0 0.6374232 0.6845473 0 -0.7289685 0.8443287 0 0.5358257 0.5877855 0 -0.8090168 0.9048275 0 0.4257784 0.4817538 0 -0.8763067 0.9510567 0 0.3090169 0.3681248 0 -0.9297764 0.9822874 0 0.1873807 0.2486901 0 -0.9685831 0.9980268 0 0.06278997 0.1253334 0 -0.9921147 0.9980268 0 -0.06279104 0 0 -1 0.9822872 0 -0.1873817 -0.1253327 0 -0.9921148 0.9510563 0 -0.3090177 -0.2486894 0 -0.9685833 0.9048264 0 -0.4257807 -0.368124 0 -0.9297767 0.8443268 0 -0.5358286 -0.4817536 0 -0.8763067 0.770511 0 -0.6374267 -0.5877849 0 -0.8090173 0.6845447 0 -0.7289709 -0.6845471 0 -0.7289686 0.5877836 0 -0.8090183 -0.7705131 0 -0.6374242 0.481753 0 -0.8763071 -0.8443277 0 -0.535827 0.3681248 0 -0.9297764 -0.9048269 0 -0.4257795 0.2486895 0 -0.9685832 -0.9510565 0 -0.3090171 0.1253333 0 -0.9921147 -0.9822871 0 -0.1873817 0 0 -1 -0.9980267 0 -0.06279074 -0.1253333 0 -0.9921148 -0.9980268 0 0.06279003 -0.2486904 0 -0.9685831 -0.9822873 0 0.187381 -0.3681242 0 -0.9297767 -0.9510565 0 0.309017 -0.4817539 0 -0.8763066 -0.9048272 0 0.4257789 -0.5877857 0 -0.8090167 -0.8443282 0 0.5358263 -0.6845475 0 -0.7289683 -0.7705134 0 0.6374238 -0.7705142 0 -0.6374228 -0.6845471 0 0.7289686 -0.8443289 0 -0.5358254 -0.5877854 0 0.809017 -0.9048276 0 -0.4257783 -0.4817542 0 0.8763064 -0.9510567 0 -0.3090163 -0.3681245 0 0.9297764 -0.9822875 0 -0.1873803 -0.2486907 0 0.9685829 -0.9980268 0 -0.06278963 -0.125334 0 0.9921147 -0.9980267 0 0.06279129 0 0 1 -0.9822872 0 0.187382 0.1253326 0 0.9921148 -0.9510562 0 0.3090179 0.2486892 0 0.9685834 -0.9048265 0 0.4257805 0.3681238 0 0.9297768 -0.8443267 0 0.5358289 0.4817533 0 0.8763069 -0.7705117 0 0.637426 0.5877848 0 0.8090174 -0.6845449 0 0.7289706 0.6845469 0 0.7289687 -0.5877828 0 0.8090187 0.7705129 0 0.6374244 -0.4817518 0 0.8763077 0.8443277 0 0.5358272 -0.3681225 0 0.9297773 0.9048268 0 0.4257798 -0.2486878 0 0.9685838 0.9510563 0 0.3090174 -0.1253314 0 0.992115 0.9822872 0 0.1873816</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape2-tangents-array" count="400" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape2-binormals" name="qt_gauge_ring_Shape2-binormals">
+ <float_array id="qt_gauge_ring_Shape2-binormals-array" count="1200">0 1 0 0 0 -1 0 -1 0 0.1253329 0 0.9921148 0 1 0 0.2486896 0 0.9685833 0 1 0 0.3681242 0 0.9297767 0 1 0 0.4817535 0 0.8763068 0 1 0 0.5877852 0 0.8090171 0 1 0 0.6845471 0 0.7289687 0 1 0 0.7705131 0 0.6374242 0 1 0 0.8443279 0 0.535827 0 1 0 0.9048271 0 0.4257793 0 1 0 0.9510565 0 0.3090174 0 1 0 0.9822872 0 0.1873817 0 1 0 0.9980268 0 0.06279054 0 1 0 0.9980268 0 -0.06279007 0 1 0 0.9822874 0 -0.1873808 0 1 0 0.9510567 0 -0.3090166 0 1 0 0.9048272 0 -0.425779 0 1 0 0.8443281 0 -0.5358266 0 1 0 0.7705135 0 -0.6374238 0 1 0 0.6845472 0 -0.7289685 0 1 0 0.5877855 0 -0.8090169 0 1 0 0.481754 0 -0.8763067 0 1 0 0.3681247 0 -0.9297764 0 1 0 0.2486902 0 -0.9685831 0 1 0 0.1253336 0 -0.9921147 0 1 0 0 0 -1 0 1 0 -0.1253329 0 -0.9921148 0 1 0 -0.2486898 0 -0.9685833 0 1 0 -0.3681243 0 -0.9297766 0 1 0 -0.4817532 0 -0.876307 0 1 0 -0.587785 0 -0.8090172 0 1 0 -0.684547 0 -0.7289687 0 1 0 -0.7705133 0 -0.6374241 0 1 0 -0.8443277 0 -0.5358271 0 1 0 -0.9048269 0 -0.4257795 0 1 0 -0.9510565 0 -0.3090172 0 1 0 -0.9822871 0 -0.187382 0 1 0 -0.9980267 0 -0.06279138 0 1 0 -0.9980268 0 0.06278958 0 1 0 -0.9822874 0 0.1873807 0 1 0 -0.9510568 0 0.3090165 0 1 0 -0.9048274 0 0.4257787 0 1 0 -0.8443282 0 0.5358263 0 1 0 -0.7705136 0 0.6374236 0 1 0 -0.6845474 0 0.7289684 0 1 0 -0.5877857 0 0.8090166 0 1 0 -0.4817542 0 0.8763064 0 1 0 -0.3681251 0 0.9297764 0 1 0 -0.2486903 0 0.9685831 0 1 0 -0.1253274 0 0.9921155 0.9921148 0 -0.1253333 -0.06279007 0 -0.9980268 -1 0 0 0.06279066 0 0.9980267 0.9685831 0 -0.2486904 0.1873816 0 0.9822872 0.9297763 0 -0.3681252 0.3090167 0 0.9510566 0.8763064 0 -0.4817544 0.4257794 0 0.904827 0.8090165 0 -0.5877861 0.5358266 0 0.844328 0.7289677 0 -0.6845482 0.6374241 0 0.7705133 0.6374232 0 -0.7705139 0.7289689 0 0.6845469 0.5358257 0 -0.8443286 0.8090168 0 0.5877854 0.4257784 0 -0.9048274 0.8763066 0 0.481754 0.3090169 0 -0.9510566 0.9297765 0 0.3681245 0.1873807 0 -0.9822873 0.9685832 0 0.2486902 0.06278998 0 -0.9980268 0.9921147 0 0.1253334 -0.06279104 0 -0.9980267 1 0 0 -0.1873817 0 -0.9822872 0.9921148 0 -0.1253327 -0.3090177 0 -0.9510564 0.9685833 0 -0.2486895 -0.4257807 0 -0.9048263 0.9297766 0 -0.3681243 -0.5358286 0 -0.8443267 0.8763067 0 -0.4817537 -0.6374267 0 -0.770511 0.8090169 0 -0.5877853 -0.7289709 0 -0.6845447 0.7289687 0 -0.684547 -0.8090183 0 -0.5877835 0.6374241 0 -0.7705133 -0.8763071 0 -0.481753 0.5358266 0 -0.8443281 -0.9297765 0 -0.3681248 0.4257795 0 -0.9048271 -0.9685833 0 -0.2486895 0.3090172 0 -0.9510565 -0.9921147 0 -0.1253333 0.1873816 0 -0.9822873 -1 0 0 0.06279065 0 -0.9980267 -0.9921147 0 0.1253333 -0.06279065 0 -0.9980268 -0.9685831 0 0.2486904 -0.1873816 0 -0.9822872 -0.9297767 0 0.3681242 -0.3090166 0 -0.9510566 -0.8763066 0 0.4817539 -0.4257793 0 -0.9048271 -0.8090167 0 0.5877857 -0.5358265 0 -0.8443282 -0.7289683 0 0.6845475 -0.6374239 0 -0.7705135 -0.6374228 0 0.7705144 -0.7289686 0 -0.6845472 -0.5358254 0 0.8443289 -0.8090169 0 -0.5877855 -0.4257783 0 0.9048276 -0.8763067 0 -0.4817539 -0.3090164 0 0.9510568 -0.9297765 0 -0.3681244 -0.1873803 0 0.9822874 -0.9685832 0 -0.2486902 -0.06278963 0 0.9980268 -0.9921148 0 -0.1253334 0.06279141 0 0.9980267 -1 0 0 0.187382 0 0.9822872 -0.9921148 0 0.1253327 0.3090179 0 0.9510562 -0.9685833 0 0.2486895 0.4257805 0 0.9048265 -0.9297766 0 0.3681243 0.5358288 0 0.8443267 -0.8763068 0 0.4817535 0.637426 0 0.7705117 -0.8090172 0 0.5877852 0.7289707 0 0.684545 -0.728969 0 0.6845466 0.8090189 0 0.5877829 -0.6374243 0 0.7705131 0.8763077 0 0.4817518 -0.535827 0 0.8443279 0.9297774 0 0.3681225 -0.4257798 0 0.9048269 0.9685838 0 0.2486878 -0.3090171 0 0.9510565 0.992115 0 0.1253314 -0.1873816 0 0.9822872 0 -1 0 0 0 -1 0 1 0 0.1253335 0 0.9921147 0 -1 0 0.2486899 0 0.9685832 0 -1 0 0.3681245 0 0.9297765 0 -1 0 0.4817536 0 0.8763068 0 -1 0 0.5877851 0 0.8090171 0 -1 0 0.6845473 0 0.7289684 0 -1 0 0.7705134 0 0.6374239 0 -1 0 0.8443279 0 0.535827 0 -1 0 0.904827 0 0.4257794 0 -1 0 0.9510565 0 0.3090174 0 -1 0 0.9822872 0 0.1873817 0 -1 0 0.9980268 0 0.0627907 0 -1 0 0.9980268 0 -0.06279027 0 -1 0 0.9822874 0 -0.1873808 0 -1 0 0.9510567 0 -0.3090168 0 -1 0 0.9048271 0 -0.4257793 0 -1 0 0.844328 0 -0.5358269 0 -1 0 0.7705133 0 -0.6374241 0 -1 0 0.6845472 0 -0.7289686 0 -1 0 0.5877851 0 -0.8090171 0 -1 0 0.4817536 0 -0.8763067 0 -1 0 0.3681248 0 -0.9297764 0 -1 0 0.2486902 0 -0.9685831 0 -1 0 0.1253335 0 -0.9921147 0 -1 0 0 0 -1 0 -1 0 -0.1253334 0 -0.9921147 0 -1 0 -0.2486898 0 -0.9685832 0 -1 0 -0.3681245 0 -0.9297766 0 -1 0 -0.4817535 0 -0.8763068 0 -1 0 -0.5877849 0 -0.8090172 0 -1 0 -0.6845471 0 -0.7289687 0 -1 0 -0.7705132 0 -0.6374241 0 -1 0 -0.8443279 0 -0.535827 0 -1 0 -0.9048271 0 -0.4257792 0 -1 0 -0.9510566 0 -0.3090168 0 -1 0 -0.9822872 0 -0.1873816 0 -1 0 -0.9980267 0 -0.06279112 0 -1 0 -0.9980268 0 0.06278983 0 -1 0 -0.9822874 0 0.1873808 0 -1 0 -0.9510567 0 0.3090168 0 -1 0 -0.9048271 0 0.4257792 0 -1 0 -0.8443281 0 0.5358266 0 -1 0 -0.7705135 0 0.6374236 0 -1 0 -0.6845475 0 0.7289683 0 -1 0 -0.5877854 0 0.8090169 0 -1 0 -0.4817539 0 0.8763065 0 -1 0 -0.3681248 0 0.9297764 0 -1 0 -0.24869 0 0.9685831 0 -1 0 -0.1253307 0 0.992115 -0.9921148 0 0.1253333 -0.06279066 0 -0.9980267 1 0 0 0.06279007 0 0.9980268 -0.9685831 0 0.2486904 0.1873812 0 0.9822873 -0.9297762 0 0.3681252 0.3090166 0 0.9510567 -0.8763064 0 0.4817544 0.4257791 0 0.9048272 -0.8090165 0 0.587786 0.5358267 0 0.844328 -0.7289677 0 0.6845482 0.6374239 0 0.7705134 -0.6374232 0 0.770514 0.7289685 0 0.6845473 -0.5358257 0 0.8443286 0.8090169 0 0.5877855 -0.4257784 0 0.9048275 0.8763067 0 0.4817538 -0.3090168 0 0.9510566 0.9297764 0 0.3681248 -0.1873807 0 0.9822873 0.9685831 0 0.2486901 -0.06278997 0 0.9980268 0.9921147 0 0.1253334 0.06279103 0 0.9980267 1 0 0 0.1873817 0 0.9822872 0.9921148 0 -0.1253327 0.3090177 0 0.9510564 0.9685834 0 -0.2486894 0.4257808 0 0.9048265 0.9297767 0 -0.368124 0.5358286 0 0.8443269 0.8763067 0 -0.4817536 0.6374267 0 0.770511 0.8090174 0 -0.5877849 0.7289709 0 0.6845447 0.7289687 0 -0.6845471 0.8090183 0 0.5877835 0.6374242 0 -0.7705131 0.8763071 0 0.481753 0.535827 0 -0.8443278 0.9297765 0 0.3681248 0.4257796 0 -0.904827 0.9685833 0 0.2486895 0.3090171 0 -0.9510565 0.9921147 0 0.1253333 0.1873818 0 -0.9822872 1 0 0 0.06279075 0 -0.9980268 0.9921147 0 -0.1253333 -0.06279003 0 -0.9980268 0.9685831 0 -0.2486904 -0.187381 0 -0.9822873 0.9297766 0 -0.3681242 -0.309017 0 -0.9510566 0.8763066 0 -0.4817539 -0.4257789 0 -0.9048273 0.8090167 0 -0.5877857 -0.5358263 0 -0.8443282 0.7289683 0 -0.6845475 -0.6374238 0 -0.7705134 0.6374228 0 -0.7705142 -0.7289687 0 -0.6845471 0.5358254 0 -0.8443288 -0.8090169 0 -0.5877853 0.4257783 0 -0.9048276 -0.8763065 0 -0.4817542 0.3090163 0 -0.9510568 -0.9297765 0 -0.3681245 0.1873803 0 -0.9822875 -0.968583 0 -0.2486907 0.06278963 0 -0.9980268 -0.9921147 0 -0.125334 -0.06279129 0 -0.9980267 -1 0 0 -0.187382 0 -0.9822872 -0.9921148 0 0.1253326 -0.3090179 0 -0.9510562 -0.9685833 0 0.2486892 -0.4257805 0 -0.9048265 -0.9297768 0 0.3681238 -0.5358288 0 -0.8443266 -0.8763069 0 0.4817533 -0.637426 0 -0.7705116 -0.8090174 0 0.5877848 -0.7289707 0 -0.684545 -0.7289688 0 0.6845469 -0.8090189 0 -0.5877829 -0.6374244 0 0.7705129 -0.8763077 0 -0.4817518 -0.5358272 0 0.8443277 -0.9297774 0 -0.3681225 -0.4257798 0 0.9048268 -0.9685838 0 -0.2486878 -0.3090174 0 0.9510564 -0.992115 0 -0.1253314 -0.1873816 0 0.9822872</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape2-binormals-array" count="400" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape2-map1" name="qt_gauge_ring_Shape2-map1">
+ <float_array id="qt_gauge_ring_Shape2-map1-array" count="510">0 1 0.02 1 0.04 1 0.06 1 0.08 1 0.09999999 1 0.12 1 0.14 1 0.16 1 0.18 1 0.2 1 0.22 1 0.24 1 0.26 1 0.28 1 0.3 1 0.32 1 0.34 1 0.36 1 0.38 1 0.4 1 0.42 1 0.4400001 1 0.4600001 1 0.4800001 1 0.5000001 1 0.52 1 0.54 1 0.56 1 0.58 1 0.6 1 0.6199999 1 0.6399999 1 0.6599999 1 0.6799999 1 0.6999999 1 0.7199998 1 0.7399998 1 0.7599998 1 0.7799998 1 0.7999998 1 0.8199998 1 0.8399997 1 0.8599997 1 0.8799997 1 0.8999997 1 0.9199997 1 0.9399996 1 0.9599996 1 0.9799996 1 0.9999996 1 0 0.75 0.02 0.75 0.04 0.75 0.06 0.75 0.08 0.75 0.09999999 0.75 0.12 0.75 0.14 0.75 0.16 0.75 0.18 0.75 0.2 0.75 0.22 0.75 0.24 0.75 0.26 0.75 0.28 0.75 0.3 0.75 0.32 0.75 0.34 0.75 0.36 0.75 0.38 0.75 0.4 0.75 0.42 0.75 0.4400001 0.75 0.4600001 0.75 0.4800001 0.75 0.5000001 0.75 0.52 0.75 0.54 0.75 0.56 0.75 0.58 0.75 0.6 0.75 0.6199999 0.75 0.6399999 0.75 0.6599999 0.75 0.6799999 0.75 0.6999999 0.75 0.7199998 0.75 0.7399998 0.75 0.7599998 0.75 0.7799998 0.75 0.7999998 0.75 0.8199998 0.75 0.8399997 0.75 0.8599997 0.75 0.8799997 0.75 0.8999997 0.75 0.9199997 0.75 0.9399996 0.75 0.9599996 0.75 0.9799996 0.75 0.9999996 0.75 0 0.5 0.02 0.5 0.04 0.5 0.06 0.5 0.08 0.5 0.09999999 0.5 0.12 0.5 0.14 0.5 0.16 0.5 0.18 0.5 0.2 0.5 0.22 0.5 0.24 0.5 0.26 0.5 0.28 0.5 0.3 0.5 0.32 0.5 0.34 0.5 0.36 0.5 0.38 0.5 0.4 0.5 0.42 0.5 0.4400001 0.5 0.4600001 0.5 0.4800001 0.5 0.5000001 0.5 0.52 0.5 0.54 0.5 0.56 0.5 0.58 0.5 0.6 0.5 0.6199999 0.5 0.6399999 0.5 0.6599999 0.5 0.6799999 0.5 0.6999999 0.5 0.7199998 0.5 0.7399998 0.5 0.7599998 0.5 0.7799998 0.5 0.7999998 0.5 0.8199998 0.5 0.8399997 0.5 0.8599997 0.5 0.8799997 0.5 0.8999997 0.5 0.9199997 0.5 0.9399996 0.5 0.9599996 0.5 0.9799996 0.5 0.9999996 0.5 0 0.25 0.02 0.25 0.04 0.25 0.06 0.25 0.08 0.25 0.09999999 0.25 0.12 0.25 0.14 0.25 0.16 0.25 0.18 0.25 0.2 0.25 0.22 0.25 0.24 0.25 0.26 0.25 0.28 0.25 0.3 0.25 0.32 0.25 0.34 0.25 0.36 0.25 0.38 0.25 0.4 0.25 0.42 0.25 0.4400001 0.25 0.4600001 0.25 0.4800001 0.25 0.5000001 0.25 0.52 0.25 0.54 0.25 0.56 0.25 0.58 0.25 0.6 0.25 0.6199999 0.25 0.6399999 0.25 0.6599999 0.25 0.6799999 0.25 0.6999999 0.25 0.7199998 0.25 0.7399998 0.25 0.7599998 0.25 0.7799998 0.25 0.7999998 0.25 0.8199998 0.25 0.8399997 0.25 0.8599997 0.25 0.8799997 0.25 0.8999997 0.25 0.9199997 0.25 0.9399996 0.25 0.9599996 0.25 0.9799996 0.25 0.9999996 0.25 0 0 0.02 0 0.04 0 0.06 0 0.08 0 0.09999999 0 0.12 0 0.14 0 0.16 0 0.18 0 0.2 0 0.22 0 0.24 0 0.26 0 0.28 0 0.3 0 0.32 0 0.34 0 0.36 0 0.38 0 0.4 0 0.42 0 0.4400001 0 0.4600001 0 0.4800001 0 0.5000001 0 0.52 0 0.54 0 0.56 0 0.58 0 0.6 0 0.6199999 0 0.6399999 0 0.6599999 0 0.6799999 0 0.6999999 0 0.7199998 0 0.7399998 0 0.7599998 0 0.7799998 0 0.7999998 0 0.8199998 0 0.8399997 0 0.8599997 0 0.8799997 0 0.8999997 0 0.9199997 0 0.9399996 0 0.9599996 0 0.9799996 0 0.9999996 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape2-map1-array" count="255" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape2-textangents">
+ <float_array id="qt_gauge_ring_Shape2-textangents-array" count="2400">-0.1253329 0 -0.9921147 0 0 -0.9999999 0 0 -0.9999999 -0.1253329 0 -0.9921147 -0.2486896 0 -0.9685832 -0.1253329 0 -0.9921147 -0.1253329 0 -0.9921147 -0.2486895 0 -0.9685832 -0.3681242 0 -0.9297765 -0.2486896 0 -0.9685832 -0.2486895 0 -0.9685832 -0.3681242 0 -0.9297765 -0.4817534 0 -0.8763067 -0.3681242 0 -0.9297765 -0.3681242 0 -0.9297765 -0.4817534 0 -0.8763067 -0.5877851 0 -0.809017 -0.4817534 0 -0.8763067 -0.4817534 0 -0.8763067 -0.5877851 0 -0.809017 -0.6845471 0 -0.7289686 -0.5877851 0 -0.809017 -0.5877851 0 -0.809017 -0.6845471 0 -0.7289686 -0.770513 0 -0.6374241 -0.6845471 0 -0.7289686 -0.6845471 0 -0.7289686 -0.770513 0 -0.6374241 -0.8443277 0 -0.5358269 -0.770513 0 -0.6374241 -0.770513 0 -0.6374241 -0.8443277 0 -0.5358269 -0.904827 0 -0.4257793 -0.8443277 0 -0.5358269 -0.8443277 0 -0.5358269 -0.904827 0 -0.4257793 -0.9510564 0 -0.3090173 -0.904827 0 -0.4257793 -0.904827 0 -0.4257793 -0.9510564 0 -0.3090173 -0.9822871 0 -0.1873817 -0.9510564 0 -0.3090173 -0.9510564 0 -0.3090173 -0.9822871 0 -0.1873817 -0.9980266 0 -0.06279052 -0.9822871 0 -0.1873817 -0.9822871 0 -0.1873817 -0.9980266 0 -0.06279053 -0.9980266 0 0.06279006 -0.9980266 0 -0.06279052 -0.9980266 0 -0.06279053 -0.9980266 0 0.06279007 -0.9822873 0 0.1873808 -0.9980266 0 0.06279006 -0.9980266 0 0.06279007 -0.9822873 0 0.1873808 -0.9510566 0 0.3090166 -0.9822873 0 0.1873808 -0.9822873 0 0.1873808 -0.9510566 0 0.3090166 -0.9048271 0 0.425779 -0.9510566 0 0.3090166 -0.9510566 0 0.3090166 -0.9048271 0 0.425779 -0.844328 0 0.5358266 -0.9048271 0 0.425779 -0.9048271 0 0.425779 -0.844328 0 0.5358266 -0.7705134 0 0.6374237 -0.844328 0 0.5358266 -0.844328 0 0.5358266 -0.7705134 0 0.6374237 -0.6845472 0 0.7289684 -0.7705134 0 0.6374237 -0.7705134 0 0.6374237 -0.6845472 0 0.7289684 -0.5877854 0 0.8090168 -0.6845472 0 0.7289684 -0.6845472 0 0.7289684 -0.5877854 0 0.8090168 -0.4817539 0 0.8763065 -0.5877854 0 0.8090168 -0.5877854 0 0.8090168 -0.4817539 0 0.8763065 -0.3681247 0 0.9297764 -0.4817539 0 0.8763065 -0.4817539 0 0.8763065 -0.3681247 0 0.9297764 -0.2486902 0 0.968583 -0.3681247 0 0.9297764 -0.3681247 0 0.9297764 -0.2486902 0 0.968583 -0.1253336 0 0.9921147 -0.2486902 0 0.968583 -0.2486902 0 0.968583 -0.1253336 0 0.9921147 0 0 0.9999999 -0.1253336 0 0.9921147 -0.1253336 0 0.9921147 0 0 0.9999999 0.1253328 0 0.9921147 0 0 0.9999999 0 0 0.9999999 0.1253328 0 0.9921147 0.2486898 0 0.9685831 0.1253328 0 0.9921147 0.1253328 0 0.9921147 0.2486898 0 0.9685831 0.3681243 0 0.9297764 0.2486898 0 0.9685831 0.2486898 0 0.9685831 0.3681243 0 0.9297764 0.4817532 0 0.8763069 0.3681243 0 0.9297764 0.3681243 0 0.9297764 0.4817532 0 0.8763069 0.5877849 0 0.8090171 0.4817532 0 0.8763069 0.4817532 0 0.8763069 0.5877849 0 0.8090171 0.684547 0 0.7289687 0.5877849 0 0.8090171 0.5877849 0 0.8090171 0.684547 0 0.7289687 0.7705132 0 0.6374239 0.684547 0 0.7289687 0.684547 0 0.7289687 0.7705132 0 0.637424 0.8443277 0 0.535827 0.7705132 0 0.6374239 0.7705132 0 0.637424 0.8443277 0 0.535827 0.9048269 0 0.4257794 0.8443277 0 0.535827 0.8443277 0 0.535827 0.9048269 0 0.4257795 0.9510564 0 0.3090172 0.9048269 0 0.4257794 0.9048269 0 0.4257795 0.9510564 0 0.3090172 0.982287 0 0.187382 0.9510564 0 0.3090172 0.9510564 0 0.3090172 0.982287 0 0.187382 0.9980266 0 0.06279137 0.982287 0 0.187382 0.982287 0 0.187382 0.9980266 0 0.06279137 0.9980267 0 -0.06278958 0.9980266 0 0.06279137 0.9980266 0 0.06279137 0.9980267 0 -0.06278957 0.9822873 0 -0.1873807 0.9980267 0 -0.06278958 0.9980267 0 -0.06278957 0.9822873 0 -0.1873807 0.9510567 0 -0.3090164 0.9822873 0 -0.1873807 0.9822873 0 -0.1873807 0.9510567 0 -0.3090164 0.9048273 0 -0.4257787 0.9510567 0 -0.3090164 0.9510567 0 -0.3090164 0.9048273 0 -0.4257787 0.8443282 0 -0.5358263 0.9048273 0 -0.4257787 0.9048273 0 -0.4257787 0.8443282 0 -0.5358263 0.7705135 0 -0.6374236 0.8443282 0 -0.5358263 0.8443282 0 -0.5358263 0.7705135 0 -0.6374236 0.6845473 0 -0.7289683 0.7705135 0 -0.6374236 0.7705135 0 -0.6374236 0.6845473 0 -0.7289683 0.5877857 0 -0.8090166 0.6845473 0 -0.7289683 0.6845473 0 -0.7289683 0.5877857 0 -0.8090166 0.4817542 0 -0.8763063 0.5877857 0 -0.8090166 0.5877857 0 -0.8090166 0.4817542 0 -0.8763063 0.368125 0 -0.9297763 0.4817542 0 -0.8763063 0.4817542 0 -0.8763063 0.368125 0 -0.9297763 0.2486902 0 -0.968583 0.368125 0 -0.9297763 0.368125 0 -0.9297763 0.2486902 0 -0.968583 0.1253274 0 -0.9921154 0.2486902 0 -0.968583 0.2486902 0 -0.968583 0.1253274 0 -0.9921154 0 0 -0.9999999 0.1253274 0 -0.9921154 0.1253274 0 -0.9921154 0 0 -0.9999999 -0.1461072 0 -0.9892686 -0.06279036 0 -0.9980267 -0.06279065 0 -0.9980267 -0.1045041 0 -0.9945244 -0.2689432 0 -0.963156 -0.1461072 0 -0.9892686 -0.1045041 0 -0.9945244 -0.2283269 0 -0.9735845 -0.387538 0 -0.9218537 -0.2689432 0 -0.963156 -0.2283269 0 -0.9735845 -0.3485489 0 -0.9372906 -0.5000211 0 -0.8660131 -0.387538 0 -0.9218537 -0.3485489 0 -0.9372906 -0.4632742 0 -0.8862149 -0.6046185 0 -0.796515 -0.5000211 0 -0.8660131 -0.4632742 0 -0.8862149 -0.5706933 0 -0.8211632 -0.6996809 0 -0.7144555 -0.6046185 0 -0.796515 -0.5706933 0 -0.8211632 -0.6691124 0 -0.7431611 -0.7837085 0 -0.6211287 -0.6996809 0 -0.7144555 -0.6691124 0 -0.7431611 -0.7569789 0 -0.6534392 -0.8553767 0 -0.5180062 -0.7837085 0 -0.6211287 -0.7569789 0 -0.6534392 -0.8329074 0 -0.5534121 -0.9135553 0 -0.4067143 -0.8553767 0 -0.5180062 -0.8329074 0 -0.5534121 -0.8957007 0 -0.4446573 -0.9573264 0 -0.2890085 -0.9135553 0 -0.4067143 -0.8957007 0 -0.4446573 -0.9443681 0 -0.3288899 -0.9860001 0 -0.1667447 -0.9573264 0 -0.2890085 -0.9443681 0 -0.3288899 -0.9781424 0 -0.2079359 -0.9991238 0 -0.04185119 -0.9860001 0 -0.1667447 -0.9781424 0 -0.2079359 -0.9964908 0 -0.08370239 -0.9964907 0 0.08370191 -0.9991238 0 -0.04185119 -0.9964908 0 -0.08370239 -0.9991238 0 0.04185097 -0.9781426 0 0.2079352 -0.9964907 0 0.08370191 -0.9991238 0 0.04185097 -0.9860001 0 0.166744 -0.9443684 0 0.3288893 -0.9781426 0 0.2079352 -0.9860001 0 0.166744 -0.9573266 0 0.2890079 -0.8957009 0 0.4446569 -0.9443684 0 0.3288893 -0.9573266 0 0.2890079 -0.9135555 0 0.4067139 -0.8329077 0 0.5534118 -0.8957009 0 0.4446569 -0.9135555 0 0.4067139 -0.8553769 0 0.518006 -0.7569792 0 0.653439 -0.8329077 0 0.5534118 -0.8553769 0 0.518006 -0.7837088 0 0.6211283 -0.6691124 0 0.7431611 -0.7569792 0 0.653439 -0.7837088 0 0.6211283 -0.6996809 0 0.7144555 -0.5706935 0 0.8211631 -0.6691124 0 0.7431611 -0.6996809 0 0.7144555 -0.6046186 0 0.796515 -0.4632745 0 0.8862147 -0.5706935 0 0.8211631 -0.6046186 0 0.796515 -0.5000212 0 0.8660131 -0.3485492 0 0.9372904 -0.4632745 0 0.8862147 -0.5000212 0 0.8660131 -0.3875383 0 0.9218535 -0.2283272 0 0.9735843 -0.3485492 0 0.9372904 -0.3875383 0 0.9218535 -0.2689436 0 0.9631558 -0.1045043 0 0.9945243 -0.2283272 0 0.9735843 -0.2689436 0 0.9631558 -0.1461076 0 0.9892686 0.02096675 0 0.9997801 -0.1045043 0 0.9945243 -0.1461076 0 0.9892686 -0.02096702 0 0.9997801 0.1461071 0 0.9892687 0.02096675 0 0.9997801 -0.02096702 0 0.9997801 0.104504 0 0.9945244 0.2689432 0 0.963156 0.1461071 0 0.9892687 0.104504 0 0.9945244 0.2283268 0 0.9735845 0.387538 0 0.9218537 0.2689432 0 0.963156 0.2283268 0 0.9735845 0.3485489 0 0.9372905 0.5000207 0 0.8660133 0.387538 0 0.9218537 0.3485489 0 0.9372905 0.463274 0 0.886215 0.6046184 0 0.7965153 0.5000207 0 0.8660133 0.463274 0 0.886215 0.5706931 0 0.8211634 0.6996807 0 0.7144555 0.6046184 0 0.7965153 0.5706931 0 0.8211634 0.6691121 0 0.7431613 0.7837086 0 0.6211286 0.6996807 0 0.7144555 0.6691121 0 0.7431613 0.7569788 0 0.6534392 0.8553767 0 0.5180062 0.7837086 0 0.6211286 0.7569788 0 0.6534392 0.8329076 0 0.5534121 0.9135553 0 0.4067143 0.8553767 0 0.5180062 0.8329076 0 0.5534121 0.8957007 0 0.4446573 0.9573264 0 0.2890086 0.9135553 0 0.4067143 0.8957007 0 0.4446573 0.9443682 0 0.3288898 0.986 0 0.1667451 0.9573264 0 0.2890086 0.9443682 0 0.3288898 0.9781424 0 0.2079361 0.9991238 0 0.04185187 0.986 0 0.1667451 0.9781424 0 0.2079361 0.9964907 0 0.08370281 0.9964907 0 -0.08370163 0.9991238 0 0.04185187 0.9964907 0 0.08370281 0.9991238 0 -0.04185049 0.9781426 0 -0.2079351 0.9964907 0 -0.08370163 0.9991238 0 -0.04185049 0.9860001 0 -0.166744 0.9443684 0 -0.3288892 0.9781426 0 -0.2079351 0.9860001 0 -0.166744 0.9573267 0 -0.2890078 0.8957011 0 -0.4446567 0.9443684 0 -0.3288892 0.9573267 0 -0.2890078 0.9135556 0 -0.4067138 0.8329078 0 -0.5534116 0.8957011 0 -0.4446567 0.9135556 0 -0.4067138 0.855377 0 -0.5180057 0.7569792 0 -0.6534387 0.8329078 0 -0.5534116 0.855377 0 -0.5180057 0.7837089 0 -0.6211281 0.6691126 0 -0.7431609 0.7569792 0 -0.6534387 0.7837089 0 -0.6211281 0.6996811 0 -0.7144552 0.5706937 0 -0.8211629 0.6691126 0 -0.7431609 0.6996811 0 -0.7144552 0.6046189 0 -0.7965147 0.4632747 0 -0.8862146 0.5706937 0 -0.8211629 0.6046189 0 -0.7965147 0.5000215 0 -0.8660129 0.3485494 0 -0.9372904 0.4632747 0 -0.8862146 0.5000215 0 -0.8660129 0.3875385 0 -0.9218534 0.2283273 0 -0.9735843 0.3485494 0 -0.9372904 0.3875385 0 -0.9218534 0.2689437 0 -0.9631558 0.1044984 0 -0.9945251 0.2283273 0 -0.9735843 0.2689437 0 -0.9631558 0.1461057 0 -0.989269 0.06277857 0 -0.9980274 0.1044984 0 -0.9945251 0.1461057 0 -0.989269 0.06278186 0 -0.9980271 -0.1253335 0 -0.9921147 0 0 -0.9999999 0 0 -0.9999999 -0.1253335 0 -0.9921147 -0.2486899 0 -0.9685831 -0.1253335 0 -0.9921147 -0.1253335 0 -0.9921147 -0.2486899 0 -0.9685831 -0.3681245 0 -0.9297764 -0.2486899 0 -0.9685831 -0.2486899 0 -0.9685831 -0.3681245 0 -0.9297764 -0.4817536 0 -0.8763067 -0.3681245 0 -0.9297764 -0.3681245 0 -0.9297764 -0.4817536 0 -0.8763067 -0.5877851 0 -0.809017 -0.4817536 0 -0.8763067 -0.4817536 0 -0.8763067 -0.5877851 0 -0.8090171 -0.6845472 0 -0.7289684 -0.5877851 0 -0.809017 -0.5877851 0 -0.8090171 -0.6845472 0 -0.7289684 -0.7705132 0 -0.6374238 -0.6845472 0 -0.7289684 -0.6845472 0 -0.7289684 -0.7705132 0 -0.6374238 -0.8443277 0 -0.5358269 -0.7705132 0 -0.6374238 -0.7705132 0 -0.6374238 -0.8443277 0 -0.5358269 -0.9048269 0 -0.4257793 -0.8443277 0 -0.5358269 -0.8443277 0 -0.5358269 -0.9048269 0 -0.4257793 -0.9510564 0 -0.3090173 -0.9048269 0 -0.4257793 -0.9048269 0 -0.4257793 -0.9510564 0 -0.3090173 -0.9822871 0 -0.1873817 -0.9510564 0 -0.3090173 -0.9510564 0 -0.3090173 -0.9822871 0 -0.1873817 -0.9980266 0 -0.06279068 -0.9822871 0 -0.1873817 -0.9822871 0 -0.1873817 -0.9980266 0 -0.06279069 -0.9980266 0 0.06279026 -0.9980266 0 -0.06279068 -0.9980266 0 -0.06279069 -0.9980266 0 0.06279025 -0.9822873 0 0.1873808 -0.9980266 0 0.06279026 -0.9980266 0 0.06279025 -0.9822873 0 0.1873808 -0.9510566 0 0.3090168 -0.9822873 0 0.1873808 -0.9822873 0 0.1873808 -0.9510566 0 0.3090168 -0.904827 0 0.4257792 -0.9510566 0 0.3090168 -0.9510566 0 0.3090168 -0.904827 0 0.4257792 -0.8443279 0 0.5358267 -0.904827 0 0.4257792 -0.904827 0 0.4257792 -0.8443279 0 0.5358267 -0.7705132 0 0.6374239 -0.8443279 0 0.5358267 -0.8443279 0 0.5358267 -0.7705132 0 0.6374239 -0.6845471 0 0.7289685 -0.7705132 0 0.6374239 -0.7705132 0 0.6374239 -0.6845471 0 0.7289685 -0.5877851 0 0.8090171 -0.6845471 0 0.7289685 -0.6845471 0 0.7289685 -0.5877851 0 0.8090171 -0.4817536 0 0.8763067 -0.5877851 0 0.8090171 -0.5877851 0 0.8090171 -0.4817536 0 0.8763067 -0.3681248 0 0.9297764 -0.4817536 0 0.8763067 -0.4817536 0 0.8763067 -0.3681248 0 0.9297763 -0.2486901 0 0.968583 -0.3681248 0 0.9297764 -0.3681248 0 0.9297763 -0.2486902 0 0.968583 -0.1253334 0 0.9921147 -0.2486901 0 0.968583 -0.2486902 0 0.968583 -0.1253334 0 0.9921147 0 0 0.9999999 -0.1253334 0 0.9921147 -0.1253334 0 0.9921147 0 0 0.9999999 0.1253334 0 0.9921147 0 0 0.9999999 0 0 0.9999999 0.1253334 0 0.9921147 0.2486898 0 0.9685831 0.1253334 0 0.9921147 0.1253334 0 0.9921147 0.2486898 0 0.9685831 0.3681244 0 0.9297764 0.2486898 0 0.9685831 0.2486898 0 0.9685831 0.3681244 0 0.9297764 0.4817534 0 0.8763067 0.3681244 0 0.9297764 0.3681244 0 0.9297764 0.4817534 0 0.8763067 0.5877849 0 0.8090171 0.4817534 0 0.8763067 0.4817534 0 0.8763067 0.5877849 0 0.8090171 0.6845471 0 0.7289687 0.5877849 0 0.8090171 0.5877849 0 0.8090171 0.6845471 0 0.7289687 0.7705131 0 0.6374241 0.6845471 0 0.7289687 0.6845471 0 0.7289687 0.7705131 0 0.6374241 0.8443277 0 0.535827 0.7705131 0 0.6374241 0.7705131 0 0.6374241 0.8443277 0 0.535827 0.9048271 0 0.4257792 0.8443277 0 0.535827 0.8443277 0 0.535827 0.9048271 0 0.4257792 0.9510566 0 0.3090168 0.9048271 0 0.4257792 0.9048271 0 0.4257792 0.9510565 0 0.3090168 0.9822871 0 0.1873816 0.9510566 0 0.3090168 0.9510565 0 0.3090168 0.9822871 0 0.1873816 0.9980266 0 0.0627911 0.9822871 0 0.1873816 0.9822871 0 0.1873816 0.9980266 0 0.06279112 0.9980267 0 -0.06278982 0.9980266 0 0.0627911 0.9980266 0 0.06279112 0.9980267 0 -0.06278982 0.9822873 0 -0.1873808 0.9980267 0 -0.06278982 0.9980267 0 -0.06278982 0.9822873 0 -0.1873808 0.9510566 0 -0.3090168 0.9822873 0 -0.1873808 0.9822873 0 -0.1873808 0.9510566 0 -0.3090168 0.9048271 0 -0.4257792 0.9510566 0 -0.3090168 0.9510566 0 -0.3090168 0.9048271 0 -0.4257792 0.844328 0 -0.5358265 0.9048271 0 -0.4257792 0.9048271 0 -0.4257792 0.844328 0 -0.5358265 0.7705135 0 -0.6374236 0.844328 0 -0.5358265 0.844328 0 -0.5358265 0.7705135 0 -0.6374236 0.6845475 0 -0.7289683 0.7705135 0 -0.6374236 0.7705135 0 -0.6374236 0.6845475 0 -0.7289683 0.5877854 0 -0.8090168 0.6845475 0 -0.7289683 0.6845475 0 -0.7289683 0.5877854 0 -0.8090168 0.4817539 0 -0.8763065 0.5877854 0 -0.8090168 0.5877854 0 -0.8090168 0.4817539 0 -0.8763065 0.3681248 0 -0.9297763 0.4817539 0 -0.8763065 0.4817539 0 -0.8763065 0.3681248 0 -0.9297763 0.24869 0 -0.968583 0.3681248 0 -0.9297763 0.3681248 0 -0.9297763 0.24869 0 -0.968583 0.1253307 0 -0.992115 0.24869 0 -0.968583 0.24869 0 -0.968583 0.1253307 0 -0.992115 0 0 -0.9999999 0.1253307 0 -0.992115 0.1253307 0 -0.992115 0 0 -0.9999999 -0.1461074 0 -0.9892686 -0.06279036 0 -0.9980267 -0.06279007 0 -0.9980267 -0.1045039 0 -0.9945244 -0.2689433 0 -0.963156 -0.1461074 0 -0.9892686 -0.1045039 0 -0.9945244 -0.2283269 0 -0.9735845 -0.387538 0 -0.9218537 -0.2689433 0 -0.963156 -0.2283269 0 -0.9735845 -0.3485487 0 -0.9372906 -0.5000212 0 -0.8660131 -0.387538 0 -0.9218537 -0.3485487 0 -0.9372906 -0.4632742 0 -0.8862149 -0.6046185 0 -0.796515 -0.5000212 0 -0.8660131 -0.4632742 0 -0.8862149 -0.5706933 0 -0.8211632 -0.6996809 0 -0.7144555 -0.6046185 0 -0.796515 -0.5706933 0 -0.8211632 -0.6691122 0 -0.7431613 -0.7837086 0 -0.6211286 -0.6996809 0 -0.7144555 -0.6691122 0 -0.7431613 -0.7569789 0 -0.6534392 -0.8553767 0 -0.5180062 -0.7837086 0 -0.6211286 -0.7569789 0 -0.6534392 -0.8329075 0 -0.5534121 -0.9135553 0 -0.4067144 -0.8553767 0 -0.5180062 -0.8329075 0 -0.5534121 -0.8957007 0 -0.4446573 -0.9573264 0 -0.2890085 -0.9135553 0 -0.4067144 -0.8957007 0 -0.4446573 -0.9443682 0 -0.3288899 -0.9860001 0 -0.1667448 -0.9573264 0 -0.2890085 -0.9443682 0 -0.3288899 -0.9781424 0 -0.2079359 -0.9991238 0 -0.0418512 -0.9860001 0 -0.1667448 -0.9781424 0 -0.2079359 -0.9964908 0 -0.08370239 -0.9964907 0 0.08370191 -0.9991238 0 -0.0418512 -0.9964908 0 -0.08370239 -0.9991238 0 0.04185095 -0.9781426 0 0.2079352 -0.9964907 0 0.08370191 -0.9991238 0 0.04185095 -0.9860001 0 0.166744 -0.9443684 0 0.3288894 -0.9781426 0 0.2079352 -0.9860001 0 0.166744 -0.9573267 0 0.2890078 -0.8957008 0 0.444657 -0.9443684 0 0.3288894 -0.9573267 0 0.2890078 -0.9135555 0 0.4067139 -0.8329077 0 0.5534118 -0.8957008 0 0.444657 -0.9135555 0 0.4067139 -0.855377 0 0.5180058 -0.756979 0 0.653439 -0.8329077 0 0.5534118 -0.855377 0 0.5180058 -0.7837088 0 0.6211283 -0.6691124 0 0.7431611 -0.756979 0 0.653439 -0.7837088 0 0.6211283 -0.6996809 0 0.7144554 -0.5706934 0 0.8211631 -0.6691124 0 0.7431611 -0.6996809 0 0.7144554 -0.6046188 0 0.7965149 -0.4632743 0 0.8862148 -0.5706934 0 0.8211631 -0.6046188 0 0.7965149 -0.5000213 0 0.866013 -0.3485492 0 0.9372904 -0.4632743 0 0.8862148 -0.5000213 0 0.866013 -0.3875383 0 0.9218535 -0.2283273 0 0.9735843 -0.3485492 0 0.9372904 -0.3875383 0 0.9218535 -0.2689436 0 0.9631558 -0.1045043 0 0.9945243 -0.2283273 0 0.9735843 -0.2689436 0 0.9631558 -0.1461076 0 0.9892686 0.02096678 0 0.9997801 -0.1045043 0 0.9945243 -0.1461076 0 0.9892686 -0.02096722 0 0.9997801 0.1461073 0 0.9892686 0.02096678 0 0.9997801 -0.02096722 0 0.9997801 0.1045039 0 0.9945244 0.2689434 0 0.963156 0.1461073 0 0.9892686 0.1045039 0 0.9945244 0.228327 0 0.9735845 0.3875379 0 0.9218537 0.2689434 0 0.963156 0.228327 0 0.9735845 0.3485488 0 0.9372906 0.5000209 0 0.8660132 0.3875379 0 0.9218537 0.3485488 0 0.9372906 0.463274 0 0.886215 0.6046184 0 0.7965153 0.5000209 0 0.8660132 0.463274 0 0.886215 0.570693 0 0.8211634 0.6996807 0 0.7144555 0.6046184 0 0.7965153 0.570693 0 0.8211634 0.6691121 0 0.7431613 0.7837086 0 0.6211286 0.6996807 0 0.7144555 0.6691121 0 0.7431613 0.7569789 0 0.6534392 0.8553767 0 0.5180063 0.7837086 0 0.6211286 0.7569789 0 0.6534392 0.8329074 0 0.5534121 0.9135553 0 0.4067142 0.8553767 0 0.5180063 0.8329074 0 0.5534121 0.8957006 0 0.4446573 0.9573264 0 0.2890086 0.9135553 0 0.4067142 0.8957006 0 0.4446573 0.9443681 0 0.32889 0.9859999 0 0.1667449 0.9573264 0 0.2890086 0.9443681 0 0.32889 0.9781423 0 0.2079363 0.9991238 0 0.04185165 0.9859999 0 0.1667449 0.9781423 0 0.2079363 0.9964907 0 0.08370282 0.9964907 0 -0.08370164 0.9991238 0 0.04185165 0.9964907 0 0.08370282 0.9991238 0 -0.04185046 0.9781426 0 -0.2079351 0.9964907 0 -0.08370164 0.9991238 0 -0.04185046 0.9860001 0 -0.1667439 0.9443684 0 -0.3288893 0.9781426 0 -0.2079351 0.9860001 0 -0.1667439 0.9573268 0 -0.2890077 0.8957009 0 -0.4446568 0.9443684 0 -0.3288893 0.9573268 0 -0.2890077 0.9135556 0 -0.4067137 0.8329078 0 -0.5534117 0.8957009 0 -0.4446568 0.9135556 0 -0.4067137 0.8553771 0 -0.5180057 0.7569792 0 -0.6534389 0.8329078 0 -0.5534117 0.8553771 0 -0.5180057 0.7837088 0 -0.6211282 0.6691127 0 -0.7431608 0.7569792 0 -0.6534389 0.7837088 0 -0.6211282 0.6996812 0 -0.7144552 0.5706937 0 -0.8211629 0.6691127 0 -0.7431608 0.6996812 0 -0.7144552 0.604619 0 -0.7965147 0.4632746 0 -0.8862146 0.5706937 0 -0.8211629 0.604619 0 -0.7965147 0.5000216 0 -0.8660129 0.3485494 0 -0.9372904 0.4632746 0 -0.8862146 0.5000216 0 -0.8660129 0.3875387 0 -0.9218534 0.2283272 0 -0.9735844 0.3485494 0 -0.9372904 0.3875387 0 -0.9218534 0.2689437 0 -0.9631558 0.1044984 0 -0.9945251 0.2283272 0 -0.9735844 0.2689437 0 -0.9631558 0.1461035 0 -0.9892693 0.06278516 0 -0.998027 0.1044984 0 -0.9945251 0.1461035 0 -0.9892693 0.06278186 0 -0.9980271</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape2-textangents-array" count="800" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape2-texbinormals">
+ <float_array id="qt_gauge_ring_Shape2-texbinormals-array" count="2400">0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.9892688 0 0.1461072 -0.9980268 0 0.06279037 -0.9980268 0 0.06279066 -0.9945245 0 0.1045041 -0.963156 0 0.2689432 -0.9892688 0 0.1461072 -0.9945245 0 0.1045041 -0.9735846 0 0.228327 -0.9218537 0 0.3875381 -0.963156 0 0.2689432 -0.9735846 0 0.228327 -0.9372906 0 0.3485489 -0.8660132 0 0.5000212 -0.9218537 0 0.3875381 -0.9372906 0 0.3485489 -0.886215 0 0.4632742 -0.7965152 0 0.6046186 -0.8660132 0 0.5000212 -0.886215 0 0.4632742 -0.8211634 0 0.5706933 -0.7144555 0 0.6996809 -0.7965152 0 0.6046186 -0.8211634 0 0.5706933 -0.7431613 0 0.6691125 -0.6211288 0 0.7837085 -0.7144555 0 0.6996809 -0.7431613 0 0.6691125 -0.6534392 0 0.756979 -0.5180063 0 0.8553768 -0.6211288 0 0.7837085 -0.6534392 0 0.756979 -0.5534123 0 0.8329076 -0.4067143 0 0.9135554 -0.5180063 0 0.8553768 -0.5534123 0 0.8329076 -0.4446573 0 0.8957008 -0.2890086 0 0.9573265 -0.4067143 0 0.9135554 -0.4446573 0 0.8957008 -0.32889 0 0.9443683 -0.1667448 0 0.9860002 -0.2890086 0 0.9573265 -0.32889 0 0.9443683 -0.207936 0 0.9781426 -0.0418512 0 0.9991239 -0.1667448 0 0.9860002 -0.207936 0 0.9781426 -0.08370239 0 0.9964908 0.08370192 0 0.9964908 -0.0418512 0 0.9991239 -0.08370239 0 0.9964908 0.04185097 0 0.9991239 0.2079352 0 0.9781427 0.08370192 0 0.9964908 0.04185097 0 0.9991239 0.1667441 0 0.9860002 0.3288894 0 0.9443685 0.2079352 0 0.9781427 0.1667441 0 0.9860002 0.2890079 0 0.9573268 0.444657 0 0.895701 0.3288894 0 0.9443685 0.2890079 0 0.9573268 0.406714 0 0.9135557 0.5534118 0 0.8329077 0.444657 0 0.895701 0.406714 0 0.9135557 0.518006 0 0.855377 0.653439 0 0.7569792 0.5534118 0 0.8329077 0.518006 0 0.855377 0.6211284 0 0.7837089 0.7431613 0 0.6691125 0.653439 0 0.7569792 0.6211284 0 0.7837089 0.7144555 0 0.6996809 0.8211632 0 0.5706935 0.7431613 0 0.6691125 0.7144555 0 0.6996809 0.7965151 0 0.6046186 0.8862149 0 0.4632746 0.8211632 0 0.5706935 0.7965151 0 0.6046186 0.8660132 0 0.5000213 0.9372905 0 0.3485492 0.8862149 0 0.4632746 0.8660132 0 0.5000213 0.9218537 0 0.3875384 0.9735845 0 0.2283273 0.9372905 0 0.3485492 0.9218537 0 0.3875384 0.9631559 0 0.2689436 0.9945245 0 0.1045043 0.9735845 0 0.2283273 0.9631559 0 0.2689436 0.9892688 0 0.1461076 0.9997802 0 -0.02096675 0.9945245 0 0.1045043 0.9892688 0 0.1461076 0.9997802 0 0.02096702 0.9892688 0 -0.1461071 0.9997802 0 -0.02096675 0.9997802 0 0.02096702 0.9945245 0 -0.104504 0.9631561 0 -0.2689433 0.9892688 0 -0.1461071 0.9945245 0 -0.104504 0.9735846 0 -0.2283269 0.9218537 0 -0.387538 0.9631561 0 -0.2689433 0.9735846 0 -0.2283269 0.9372906 0 -0.3485489 0.8660134 0 -0.5000208 0.9218537 0 -0.387538 0.9372906 0 -0.3485489 0.8862152 0 -0.4632741 0.7965153 0 -0.6046184 0.8660134 0 -0.5000208 0.8862152 0 -0.4632741 0.8211635 0 -0.5706931 0.7144555 0 -0.6996807 0.7965153 0 -0.6046184 0.8211635 0 -0.5706931 0.7431614 0 -0.6691122 0.6211286 0 -0.7837087 0.7144555 0 -0.6996807 0.7431614 0 -0.6691122 0.6534393 0 -0.7569789 0.5180063 0 -0.8553768 0.6211286 0 -0.7837087 0.6534393 0 -0.7569789 0.5534121 0 -0.8329077 0.4067144 0 -0.9135554 0.5180063 0 -0.8553768 0.5534121 0 -0.8329077 0.4446573 0 -0.8957008 0.2890086 0 -0.9573265 0.4067144 0 -0.9135554 0.4446573 0 -0.8957008 0.3288898 0 -0.9443683 0.1667451 0 -0.9860001 0.2890086 0 -0.9573265 0.3288898 0 -0.9443683 0.2079361 0 -0.9781424 0.04185187 0 -0.9991239 0.1667451 0 -0.9860001 0.2079361 0 -0.9781424 0.08370282 0 -0.9964908 -0.08370164 0 -0.9964908 0.04185187 0 -0.9991239 0.08370282 0 -0.9964908 -0.04185049 0 -0.9991239 -0.2079351 0 -0.9781427 -0.08370164 0 -0.9964908 -0.04185049 0 -0.9991239 -0.166744 0 -0.9860002 -0.3288893 0 -0.9443686 -0.2079351 0 -0.9781427 -0.166744 0 -0.9860002 -0.2890078 0 -0.9573268 -0.4446568 0 -0.8957012 -0.3288893 0 -0.9443686 -0.2890078 0 -0.9573268 -0.4067138 0 -0.9135556 -0.5534117 0 -0.8329079 -0.4446568 0 -0.8957012 -0.4067138 0 -0.9135556 -0.5180058 0 -0.8553771 -0.6534389 0 -0.7569793 -0.5534117 0 -0.8329079 -0.5180058 0 -0.8553771 -0.6211282 0 -0.783709 -0.743161 0 -0.6691127 -0.6534389 0 -0.7569793 -0.6211282 0 -0.783709 -0.7144552 0 -0.6996812 -0.8211631 0 -0.5706938 -0.743161 0 -0.6691127 -0.7144552 0 -0.6996812 -0.7965149 0 -0.604619 -0.8862147 0 -0.4632748 -0.8211631 0 -0.5706938 -0.7965149 0 -0.604619 -0.866013 0 -0.5000216 -0.9372904 0 -0.3485494 -0.8862147 0 -0.4632748 -0.866013 0 -0.5000216 -0.9218536 0 -0.3875386 -0.9735845 0 -0.2283273 -0.9372904 0 -0.3485494 -0.9218536 0 -0.3875386 -0.9631559 0 -0.2689437 -0.9945251 0 -0.1044984 -0.9735845 0 -0.2283273 -0.9631559 0 -0.2689437 -0.9892691 0 -0.1461057 -0.9980276 0 -0.06277858 -0.9945251 0 -0.1044984 -0.9892691 0 -0.1461057 -0.9980274 0 -0.06278187 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0.9892688 0 -0.1461074 0.9980268 0 -0.06279037 0.9980268 0 -0.06279008 0.9945245 0 -0.1045039 0.963156 0 -0.2689433 0.9892688 0 -0.1461074 0.9945245 0 -0.1045039 0.9735846 0 -0.2283269 0.9218538 0 -0.3875381 0.963156 0 -0.2689433 0.9735846 0 -0.2283269 0.9372907 0 -0.3485487 0.8660132 0 -0.5000212 0.9218538 0 -0.3875381 0.9372907 0 -0.3485487 0.886215 0 -0.4632743 0.7965152 0 -0.6046186 0.8660132 0 -0.5000212 0.886215 0 -0.4632743 0.8211634 0 -0.5706933 0.7144555 0 -0.6996809 0.7965152 0 -0.6046186 0.8211634 0 -0.5706933 0.7431614 0 -0.6691123 0.6211286 0 -0.7837088 0.7144555 0 -0.6996809 0.7431614 0 -0.6691123 0.6534393 0 -0.756979 0.5180063 0 -0.8553768 0.6211286 0 -0.7837088 0.6534393 0 -0.756979 0.5534121 0 -0.8329076 0.4067144 0 -0.9135554 0.5180063 0 -0.8553768 0.5534121 0 -0.8329076 0.4446574 0 -0.8957008 0.2890085 0 -0.9573266 0.4067144 0 -0.9135554 0.4446574 0 -0.8957008 0.3288899 0 -0.9443682 0.1667448 0 -0.9860001 0.2890085 0 -0.9573266 0.3288899 0 -0.9443682 0.2079359 0 -0.9781425 0.0418512 0 -0.9991239 0.1667448 0 -0.9860001 0.2079359 0 -0.9781425 0.08370239 0 -0.9964908 -0.08370192 0 -0.9964909 0.0418512 0 -0.9991239 0.08370239 0 -0.9964908 -0.04185095 0 -0.9991239 -0.2079352 0 -0.9781427 -0.08370192 0 -0.9964909 -0.04185095 0 -0.9991239 -0.166744 0 -0.9860002 -0.3288894 0 -0.9443685 -0.2079352 0 -0.9781427 -0.166744 0 -0.9860002 -0.2890078 0 -0.9573268 -0.4446571 0 -0.895701 -0.3288894 0 -0.9443685 -0.2890078 0 -0.9573268 -0.406714 0 -0.9135556 -0.5534118 0 -0.8329078 -0.4446571 0 -0.895701 -0.406714 0 -0.9135556 -0.5180059 0 -0.8553771 -0.6534391 0 -0.7569791 -0.5534118 0 -0.8329078 -0.5180059 0 -0.8553771 -0.6211284 0 -0.7837089 -0.7431611 0 -0.6691124 -0.6534391 0 -0.7569791 -0.6211284 0 -0.7837089 -0.7144555 0 -0.699681 -0.8211632 0 -0.5706935 -0.7431611 0 -0.6691124 -0.7144555 0 -0.699681 -0.796515 0 -0.6046188 -0.886215 0 -0.4632744 -0.8211632 0 -0.5706935 -0.796515 0 -0.6046188 -0.8660131 0 -0.5000213 -0.9372906 0 -0.3485492 -0.886215 0 -0.4632744 -0.8660131 0 -0.5000213 -0.9218537 0 -0.3875384 -0.9735845 0 -0.2283273 -0.9372906 0 -0.3485492 -0.9218537 0 -0.3875384 -0.9631559 0 -0.2689437 -0.9945245 0 -0.1045043 -0.9735845 0 -0.2283273 -0.9631559 0 -0.2689437 -0.9892687 0 -0.1461076 -0.9997802 0 0.02096678 -0.9945245 0 -0.1045043 -0.9892687 0 -0.1461076 -0.9997802 0 -0.02096723 -0.9892688 0 0.1461073 -0.9997802 0 0.02096678 -0.9997802 0 -0.02096723 -0.9945245 0 0.1045039 -0.963156 0 0.2689434 -0.9892688 0 0.1461073 -0.9945245 0 0.1045039 -0.9735846 0 0.228327 -0.9218538 0 0.387538 -0.963156 0 0.2689434 -0.9735846 0 0.228327 -0.9372907 0 0.3485488 -0.8660133 0 0.500021 -0.9218538 0 0.387538 -0.9372907 0 0.3485488 -0.8862152 0 0.4632741 -0.7965153 0 0.6046184 -0.8660133 0 0.500021 -0.8862152 0 0.4632741 -0.8211635 0 0.5706931 -0.7144556 0 0.6996808 -0.7965153 0 0.6046184 -0.8211635 0 0.5706931 -0.7431614 0 0.6691122 -0.6211287 0 0.7837087 -0.7144556 0 0.6996808 -0.7431614 0 0.6691122 -0.6534392 0 0.756979 -0.5180064 0 0.8553768 -0.6211287 0 0.7837087 -0.6534392 0 0.756979 -0.5534122 0 0.8329075 -0.4067143 0 0.9135554 -0.5180064 0 0.8553768 -0.5534122 0 0.8329075 -0.4446574 0 0.8957008 -0.2890086 0 0.9573266 -0.4067143 0 0.9135554 -0.4446574 0 0.8957008 -0.3288901 0 0.9443683 -0.166745 0 0.9860001 -0.2890086 0 0.9573266 -0.3288901 0 0.9443683 -0.2079363 0 0.9781424 -0.04185165 0 0.9991239 -0.166745 0 0.9860001 -0.2079363 0 0.9781424 -0.08370283 0 0.9964908 0.08370165 0 0.9964908 -0.04185165 0 0.9991239 -0.08370283 0 0.9964908 0.04185046 0 0.9991239 0.2079351 0 0.9781427 0.08370165 0 0.9964908 0.04185046 0 0.9991239 0.1667439 0 0.9860002 0.3288893 0 0.9443685 0.2079351 0 0.9781427 0.1667439 0 0.9860002 0.2890077 0 0.9573268 0.4446569 0 0.8957011 0.3288893 0 0.9443685 0.2890077 0 0.9573268 0.4067138 0 0.9135557 0.5534117 0 0.8329079 0.4446569 0 0.8957011 0.4067138 0 0.9135557 0.5180057 0 0.8553772 0.6534389 0 0.7569793 0.5534117 0 0.8329079 0.5180057 0 0.8553772 0.6211283 0 0.7837089 0.7431609 0 0.6691127 0.6534389 0 0.7569793 0.6211283 0 0.7837089 0.7144552 0 0.6996812 0.8211631 0 0.5706937 0.7431609 0 0.6691127 0.7144552 0 0.6996812 0.7965148 0 0.604619 0.8862149 0 0.4632747 0.8211631 0 0.5706937 0.7965148 0 0.604619 0.866013 0 0.5000216 0.9372904 0 0.3485494 0.8862149 0 0.4632747 0.866013 0 0.5000216 0.9218535 0 0.3875387 0.9735845 0 0.2283272 0.9372904 0 0.3485494 0.9218535 0 0.3875387 0.963156 0 0.2689437 0.9945251 0 0.1044984 0.9735845 0 0.2283272 0.963156 0 0.2689437 0.9892694 0 0.1461035 0.9980271 0 0.06278517 0.9945251 0 0.1044984 0.9892694 0 0.1461035 0.9980274 0 0.06278187</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape2-texbinormals-array" count="800" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_ring_Shape2-vertices" name="qt_gauge_ring_Shape2-vertices">
+ <input semantic="POSITION" source="#qt_gauge_ring_Shape2-positions"/>
+ </vertices>
+ <triangles material="lambert3SG" count="400">
+ <input semantic="VERTEX" source="#qt_gauge_ring_Shape2-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_ring_Shape2-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_ring_Shape2-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_ring_Shape2-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_ring_Shape2-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_ring_Shape2-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_ring_Shape2-texbinormals" offset="3" set="0"/>
+ <p>1 0 1 0 0 1 0 1 51 3 52 3 51 3 52 3 0 1 0 1 50 2 51 2 2 4 2 4 1 0 1 5 52 5 53 7 52 5 53 7 1 0 1 5 51 3 52 6 3 6 3 8 2 4 2 9 53 7 54 11 53 7 54 11 2 4 2 9 52 5 53 10 4 8 4 12 3 6 3 13 54 9 55 15 54 9 55 15 3 6 3 13 53 7 54 14 5 10 5 16 4 8 4 17 55 11 56 19 55 11 56 19 4 8 4 17 54 9 55 18 6 12 6 20 5 10 5 21 56 13 57 23 56 13 57 23 5 10 5 21 55 11 56 22 7 14 7 24 6 12 6 25 57 15 58 27 57 15 58 27 6 12 6 25 56 13 57 26 8 16 8 28 7 14 7 29 58 17 59 31 58 17 59 31 7 14 7 29 57 15 58 30 9 18 9 32 8 16 8 33 59 19 60 35 59 19 60 35 8 16 8 33 58 17 59 34 10 20 10 36 9 18 9 37 60 21 61 39 60 21 61 39 9 18 9 37 59 19 60 38 11 22 11 40 10 20 10 41 61 23 62 43 61 23 62 43 10 20 10 41 60 21 61 42 12 24 12 44 11 22 11 45 62 25 63 47 62 25 63 47 11 22 11 45 61 23 62 46 13 26 13 48 12 24 12 49 63 27 64 51 63 27 64 51 12 24 12 49 62 25 63 50 14 28 14 52 13 26 13 53 64 29 65 55 64 29 65 55 13 26 13 53 63 27 64 54 15 30 15 56 14 28 14 57 65 31 66 59 65 31 66 59 14 28 14 57 64 29 65 58 16 32 16 60 15 30 15 61 66 33 67 63 66 33 67 63 15 30 15 61 65 31 66 62 17 34 17 64 16 32 16 65 67 35 68 67 67 35 68 67 16 32 16 65 66 33 67 66 18 36 18 68 17 34 17 69 68 37 69 71 68 37 69 71 17 34 17 69 67 35 68 70 19 38 19 72 18 36 18 73 69 39 70 75 69 39 70 75 18 36 18 73 68 37 69 74 20 40 20 76 19 38 19 77 70 41 71 79 70 41 71 79 19 38 19 77 69 39 70 78 21 42 21 80 20 40 20 81 71 43 72 83 71 43 72 83 20 40 20 81 70 41 71 82 22 44 22 84 21 42 21 85 72 45 73 87 72 45 73 87 21 42 21 85 71 43 72 86 23 46 23 88 22 44 22 89 73 47 74 91 73 47 74 91 22 44 22 89 72 45 73 90 24 48 24 92 23 46 23 93 74 49 75 95 74 49 75 95 23 46 23 93 73 47 74 94 25 50 25 96 24 48 24 97 75 51 76 99 75 51 76 99 24 48 24 97 74 49 75 98 26 52 26 100 25 50 25 101 76 53 77 103 76 53 77 103 25 50 25 101 75 51 76 102 27 54 27 104 26 52 26 105 77 55 78 107 77 55 78 107 26 52 26 105 76 53 77 106 28 56 28 108 27 54 27 109 78 57 79 111 78 57 79 111 27 54 27 109 77 55 78 110 29 58 29 112 28 56 28 113 79 59 80 115 79 59 80 115 28 56 28 113 78 57 79 114 30 60 30 116 29 58 29 117 80 61 81 119 80 61 81 119 29 58 29 117 79 59 80 118 31 62 31 120 30 60 30 121 81 63 82 123 81 63 82 123 30 60 30 121 80 61 81 122 32 64 32 124 31 62 31 125 82 65 83 127 82 65 83 127 31 62 31 125 81 63 82 126 33 66 33 128 32 64 32 129 83 67 84 131 83 67 84 131 32 64 32 129 82 65 83 130 34 68 34 132 33 66 33 133 84 69 85 135 84 69 85 135 33 66 33 133 83 67 84 134 35 70 35 136 34 68 34 137 85 71 86 139 85 71 86 139 34 68 34 137 84 69 85 138 36 72 36 140 35 70 35 141 86 73 87 143 86 73 87 143 35 70 35 141 85 71 86 142 37 74 37 144 36 72 36 145 87 75 88 147 87 75 88 147 36 72 36 145 86 73 87 146 38 76 38 148 37 74 37 149 88 77 89 151 88 77 89 151 37 74 37 149 87 75 88 150 39 78 39 152 38 76 38 153 89 79 90 155 89 79 90 155 38 76 38 153 88 77 89 154 40 80 40 156 39 78 39 157 90 81 91 159 90 81 91 159 39 78 39 157 89 79 90 158 41 82 41 160 40 80 40 161 91 83 92 163 91 83 92 163 40 80 40 161 90 81 91 162 42 84 42 164 41 82 41 165 92 85 93 167 92 85 93 167 41 82 41 165 91 83 92 166 43 86 43 168 42 84 42 169 93 87 94 171 93 87 94 171 42 84 42 169 92 85 93 170 44 88 44 172 43 86 43 173 94 89 95 175 94 89 95 175 43 86 43 173 93 87 94 174 45 90 45 176 44 88 44 177 95 91 96 179 95 91 96 179 44 88 44 177 94 89 95 178 46 92 46 180 45 90 45 181 96 93 97 183 96 93 97 183 45 90 45 181 95 91 96 182 47 94 47 184 46 92 46 185 97 95 98 187 97 95 98 187 46 92 46 185 96 93 97 186 48 96 48 188 47 94 47 189 98 97 99 191 98 97 99 191 47 94 47 189 97 95 98 190 49 98 49 192 48 96 48 193 99 99 100 195 99 99 100 195 48 96 48 193 98 97 99 194 0 1 50 196 49 98 49 197 50 2 101 199 50 2 101 199 49 98 49 197 99 99 100 198 51 100 52 200 50 101 51 201 101 103 103 203 101 103 103 203 50 101 51 201 100 102 102 202 52 104 53 204 51 100 52 205 102 105 104 207 102 105 104 207 51 100 52 205 101 103 103 206 53 106 54 208 52 104 53 209 103 107 105 211 103 107 105 211 52 104 53 209 102 105 104 210 54 108 55 212 53 106 54 213 104 109 106 215 104 109 106 215 53 106 54 213 103 107 105 214 55 110 56 216 54 108 55 217 105 111 107 219 105 111 107 219 54 108 55 217 104 109 106 218 56 112 57 220 55 110 56 221 106 113 108 223 106 113 108 223 55 110 56 221 105 111 107 222 57 114 58 224 56 112 57 225 107 115 109 227 107 115 109 227 56 112 57 225 106 113 108 226 58 116 59 228 57 114 58 229 108 117 110 231 108 117 110 231 57 114 58 229 107 115 109 230 59 118 60 232 58 116 59 233 109 119 111 235 109 119 111 235 58 116 59 233 108 117 110 234 60 120 61 236 59 118 60 237 110 121 112 239 110 121 112 239 59 118 60 237 109 119 111 238 61 122 62 240 60 120 61 241 111 123 113 243 111 123 113 243 60 120 61 241 110 121 112 242 62 124 63 244 61 122 62 245 112 125 114 247 112 125 114 247 61 122 62 245 111 123 113 246 63 126 64 248 62 124 63 249 113 127 115 251 113 127 115 251 62 124 63 249 112 125 114 250 64 128 65 252 63 126 64 253 114 129 116 255 114 129 116 255 63 126 64 253 113 127 115 254 65 130 66 256 64 128 65 257 115 131 117 259 115 131 117 259 64 128 65 257 114 129 116 258 66 132 67 260 65 130 66 261 116 133 118 263 116 133 118 263 65 130 66 261 115 131 117 262 67 134 68 264 66 132 67 265 117 135 119 267 117 135 119 267 66 132 67 265 116 133 118 266 68 136 69 268 67 134 68 269 118 137 120 271 118 137 120 271 67 134 68 269 117 135 119 270 69 138 70 272 68 136 69 273 119 139 121 275 119 139 121 275 68 136 69 273 118 137 120 274 70 140 71 276 69 138 70 277 120 141 122 279 120 141 122 279 69 138 70 277 119 139 121 278 71 142 72 280 70 140 71 281 121 143 123 283 121 143 123 283 70 140 71 281 120 141 122 282 72 144 73 284 71 142 72 285 122 145 124 287 122 145 124 287 71 142 72 285 121 143 123 286 73 146 74 288 72 144 73 289 123 147 125 291 123 147 125 291 72 144 73 289 122 145 124 290 74 148 75 292 73 146 74 293 124 149 126 295 124 149 126 295 73 146 74 293 123 147 125 294 75 150 76 296 74 148 75 297 125 151 127 299 125 151 127 299 74 148 75 297 124 149 126 298 76 152 77 300 75 150 76 301 126 153 128 303 126 153 128 303 75 150 76 301 125 151 127 302 77 154 78 304 76 152 77 305 127 155 129 307 127 155 129 307 76 152 77 305 126 153 128 306 78 156 79 308 77 154 78 309 128 157 130 311 128 157 130 311 77 154 78 309 127 155 129 310 79 158 80 312 78 156 79 313 129 159 131 315 129 159 131 315 78 156 79 313 128 157 130 314 80 160 81 316 79 158 80 317 130 161 132 319 130 161 132 319 79 158 80 317 129 159 131 318 81 162 82 320 80 160 81 321 131 163 133 323 131 163 133 323 80 160 81 321 130 161 132 322 82 164 83 324 81 162 82 325 132 165 134 327 132 165 134 327 81 162 82 325 131 163 133 326 83 166 84 328 82 164 83 329 133 167 135 331 133 167 135 331 82 164 83 329 132 165 134 330 84 168 85 332 83 166 84 333 134 169 136 335 134 169 136 335 83 166 84 333 133 167 135 334 85 170 86 336 84 168 85 337 135 171 137 339 135 171 137 339 84 168 85 337 134 169 136 338 86 172 87 340 85 170 86 341 136 173 138 343 136 173 138 343 85 170 86 341 135 171 137 342 87 174 88 344 86 172 87 345 137 175 139 347 137 175 139 347 86 172 87 345 136 173 138 346 88 176 89 348 87 174 88 349 138 177 140 351 138 177 140 351 87 174 88 349 137 175 139 350 89 178 90 352 88 176 89 353 139 179 141 355 139 179 141 355 88 176 89 353 138 177 140 354 90 180 91 356 89 178 90 357 140 181 142 359 140 181 142 359 89 178 90 357 139 179 141 358 91 182 92 360 90 180 91 361 141 183 143 363 141 183 143 363 90 180 91 361 140 181 142 362 92 184 93 364 91 182 92 365 142 185 144 367 142 185 144 367 91 182 92 365 141 183 143 366 93 186 94 368 92 184 93 369 143 187 145 371 143 187 145 371 92 184 93 369 142 185 144 370 94 188 95 372 93 186 94 373 144 189 146 375 144 189 146 375 93 186 94 373 143 187 145 374 95 190 96 376 94 188 95 377 145 191 147 379 145 191 147 379 94 188 95 377 144 189 146 378 96 192 97 380 95 190 96 381 146 193 148 383 146 193 148 383 95 190 96 381 145 191 147 382 97 194 98 384 96 192 97 385 147 195 149 387 147 195 149 387 96 192 97 385 146 193 148 386 98 196 99 388 97 194 98 389 148 197 150 391 148 197 150 391 97 194 98 389 147 195 149 390 99 198 100 392 98 196 99 393 149 199 151 395 149 199 151 395 98 196 99 393 148 197 150 394 50 101 101 396 99 198 100 397 100 102 152 399 100 102 152 399 99 198 100 397 149 199 151 398 101 200 103 400 100 201 102 401 151 203 154 403 151 203 154 403 100 201 102 401 150 202 153 402 102 204 104 404 101 200 103 405 152 205 155 407 152 205 155 407 101 200 103 405 151 203 154 406 103 206 105 408 102 204 104 409 153 207 156 411 153 207 156 411 102 204 104 409 152 205 155 410 104 208 106 412 103 206 105 413 154 209 157 415 154 209 157 415 103 206 105 413 153 207 156 414 105 210 107 416 104 208 106 417 155 211 158 419 155 211 158 419 104 208 106 417 154 209 157 418 106 212 108 420 105 210 107 421 156 213 159 423 156 213 159 423 105 210 107 421 155 211 158 422 107 214 109 424 106 212 108 425 157 215 160 427 157 215 160 427 106 212 108 425 156 213 159 426 108 216 110 428 107 214 109 429 158 217 161 431 158 217 161 431 107 214 109 429 157 215 160 430 109 218 111 432 108 216 110 433 159 219 162 435 159 219 162 435 108 216 110 433 158 217 161 434 110 220 112 436 109 218 111 437 160 221 163 439 160 221 163 439 109 218 111 437 159 219 162 438 111 222 113 440 110 220 112 441 161 223 164 443 161 223 164 443 110 220 112 441 160 221 163 442 112 224 114 444 111 222 113 445 162 225 165 447 162 225 165 447 111 222 113 445 161 223 164 446 113 226 115 448 112 224 114 449 163 227 166 451 163 227 166 451 112 224 114 449 162 225 165 450 114 228 116 452 113 226 115 453 164 229 167 455 164 229 167 455 113 226 115 453 163 227 166 454 115 230 117 456 114 228 116 457 165 231 168 459 165 231 168 459 114 228 116 457 164 229 167 458 116 232 118 460 115 230 117 461 166 233 169 463 166 233 169 463 115 230 117 461 165 231 168 462 117 234 119 464 116 232 118 465 167 235 170 467 167 235 170 467 116 232 118 465 166 233 169 466 118 236 120 468 117 234 119 469 168 237 171 471 168 237 171 471 117 234 119 469 167 235 170 470 119 238 121 472 118 236 120 473 169 239 172 475 169 239 172 475 118 236 120 473 168 237 171 474 120 240 122 476 119 238 121 477 170 241 173 479 170 241 173 479 119 238 121 477 169 239 172 478 121 242 123 480 120 240 122 481 171 243 174 483 171 243 174 483 120 240 122 481 170 241 173 482 122 244 124 484 121 242 123 485 172 245 175 487 172 245 175 487 121 242 123 485 171 243 174 486 123 246 125 488 122 244 124 489 173 247 176 491 173 247 176 491 122 244 124 489 172 245 175 490 124 248 126 492 123 246 125 493 174 249 177 495 174 249 177 495 123 246 125 493 173 247 176 494 125 250 127 496 124 248 126 497 175 251 178 499 175 251 178 499 124 248 126 497 174 249 177 498 126 252 128 500 125 250 127 501 176 253 179 503 176 253 179 503 125 250 127 501 175 251 178 502 127 254 129 504 126 252 128 505 177 255 180 507 177 255 180 507 126 252 128 505 176 253 179 506 128 256 130 508 127 254 129 509 178 257 181 511 178 257 181 511 127 254 129 509 177 255 180 510 129 258 131 512 128 256 130 513 179 259 182 515 179 259 182 515 128 256 130 513 178 257 181 514 130 260 132 516 129 258 131 517 180 261 183 519 180 261 183 519 129 258 131 517 179 259 182 518 131 262 133 520 130 260 132 521 181 263 184 523 181 263 184 523 130 260 132 521 180 261 183 522 132 264 134 524 131 262 133 525 182 265 185 527 182 265 185 527 131 262 133 525 181 263 184 526 133 266 135 528 132 264 134 529 183 267 186 531 183 267 186 531 132 264 134 529 182 265 185 530 134 268 136 532 133 266 135 533 184 269 187 535 184 269 187 535 133 266 135 533 183 267 186 534 135 270 137 536 134 268 136 537 185 271 188 539 185 271 188 539 134 268 136 537 184 269 187 538 136 272 138 540 135 270 137 541 186 273 189 543 186 273 189 543 135 270 137 541 185 271 188 542 137 274 139 544 136 272 138 545 187 275 190 547 187 275 190 547 136 272 138 545 186 273 189 546 138 276 140 548 137 274 139 549 188 277 191 551 188 277 191 551 137 274 139 549 187 275 190 550 139 278 141 552 138 276 140 553 189 279 192 555 189 279 192 555 138 276 140 553 188 277 191 554 140 280 142 556 139 278 141 557 190 281 193 559 190 281 193 559 139 278 141 557 189 279 192 558 141 282 143 560 140 280 142 561 191 283 194 563 191 283 194 563 140 280 142 561 190 281 193 562 142 284 144 564 141 282 143 565 192 285 195 567 192 285 195 567 141 282 143 565 191 283 194 566 143 286 145 568 142 284 144 569 193 287 196 571 193 287 196 571 142 284 144 569 192 285 195 570 144 288 146 572 143 286 145 573 194 289 197 575 194 289 197 575 143 286 145 573 193 287 196 574 145 290 147 576 144 288 146 577 195 291 198 579 195 291 198 579 144 288 146 577 194 289 197 578 146 292 148 580 145 290 147 581 196 293 199 583 196 293 199 583 145 290 147 581 195 291 198 582 147 294 149 584 146 292 148 585 197 295 200 587 197 295 200 587 146 292 148 585 196 293 199 586 148 296 150 588 147 294 149 589 198 297 201 591 198 297 201 591 147 294 149 589 197 295 200 590 149 298 151 592 148 296 150 593 199 299 202 595 199 299 202 595 148 296 150 593 198 297 201 594 100 201 152 596 149 298 151 597 150 202 203 599 150 202 203 599 149 298 151 597 199 299 202 598 151 300 154 600 150 301 153 601 1 303 205 603 1 303 205 603 150 301 153 601 0 302 204 602 152 304 155 604 151 300 154 605 2 305 206 607 2 305 206 607 151 300 154 605 1 303 205 606 153 306 156 608 152 304 155 609 3 307 207 611 3 307 207 611 152 304 155 609 2 305 206 610 154 308 157 612 153 306 156 613 4 309 208 615 4 309 208 615 153 306 156 613 3 307 207 614 155 310 158 616 154 308 157 617 5 311 209 619 5 311 209 619 154 308 157 617 4 309 208 618 156 312 159 620 155 310 158 621 6 313 210 623 6 313 210 623 155 310 158 621 5 311 209 622 157 314 160 624 156 312 159 625 7 315 211 627 7 315 211 627 156 312 159 625 6 313 210 626 158 316 161 628 157 314 160 629 8 317 212 631 8 317 212 631 157 314 160 629 7 315 211 630 159 318 162 632 158 316 161 633 9 319 213 635 9 319 213 635 158 316 161 633 8 317 212 634 160 320 163 636 159 318 162 637 10 321 214 639 10 321 214 639 159 318 162 637 9 319 213 638 161 322 164 640 160 320 163 641 11 323 215 643 11 323 215 643 160 320 163 641 10 321 214 642 162 324 165 644 161 322 164 645 12 325 216 647 12 325 216 647 161 322 164 645 11 323 215 646 163 326 166 648 162 324 165 649 13 327 217 651 13 327 217 651 162 324 165 649 12 325 216 650 164 328 167 652 163 326 166 653 14 329 218 655 14 329 218 655 163 326 166 653 13 327 217 654 165 330 168 656 164 328 167 657 15 331 219 659 15 331 219 659 164 328 167 657 14 329 218 658 166 332 169 660 165 330 168 661 16 333 220 663 16 333 220 663 165 330 168 661 15 331 219 662 167 334 170 664 166 332 169 665 17 335 221 667 17 335 221 667 166 332 169 665 16 333 220 666 168 336 171 668 167 334 170 669 18 337 222 671 18 337 222 671 167 334 170 669 17 335 221 670 169 338 172 672 168 336 171 673 19 339 223 675 19 339 223 675 168 336 171 673 18 337 222 674 170 340 173 676 169 338 172 677 20 341 224 679 20 341 224 679 169 338 172 677 19 339 223 678 171 342 174 680 170 340 173 681 21 343 225 683 21 343 225 683 170 340 173 681 20 341 224 682 172 344 175 684 171 342 174 685 22 345 226 687 22 345 226 687 171 342 174 685 21 343 225 686 173 346 176 688 172 344 175 689 23 347 227 691 23 347 227 691 172 344 175 689 22 345 226 690 174 348 177 692 173 346 176 693 24 349 228 695 24 349 228 695 173 346 176 693 23 347 227 694 175 350 178 696 174 348 177 697 25 351 229 699 25 351 229 699 174 348 177 697 24 349 228 698 176 352 179 700 175 350 178 701 26 353 230 703 26 353 230 703 175 350 178 701 25 351 229 702 177 354 180 704 176 352 179 705 27 355 231 707 27 355 231 707 176 352 179 705 26 353 230 706 178 356 181 708 177 354 180 709 28 357 232 711 28 357 232 711 177 354 180 709 27 355 231 710 179 358 182 712 178 356 181 713 29 359 233 715 29 359 233 715 178 356 181 713 28 357 232 714 180 360 183 716 179 358 182 717 30 361 234 719 30 361 234 719 179 358 182 717 29 359 233 718 181 362 184 720 180 360 183 721 31 363 235 723 31 363 235 723 180 360 183 721 30 361 234 722 182 364 185 724 181 362 184 725 32 365 236 727 32 365 236 727 181 362 184 725 31 363 235 726 183 366 186 728 182 364 185 729 33 367 237 731 33 367 237 731 182 364 185 729 32 365 236 730 184 368 187 732 183 366 186 733 34 369 238 735 34 369 238 735 183 366 186 733 33 367 237 734 185 370 188 736 184 368 187 737 35 371 239 739 35 371 239 739 184 368 187 737 34 369 238 738 186 372 189 740 185 370 188 741 36 373 240 743 36 373 240 743 185 370 188 741 35 371 239 742 187 374 190 744 186 372 189 745 37 375 241 747 37 375 241 747 186 372 189 745 36 373 240 746 188 376 191 748 187 374 190 749 38 377 242 751 38 377 242 751 187 374 190 749 37 375 241 750 189 378 192 752 188 376 191 753 39 379 243 755 39 379 243 755 188 376 191 753 38 377 242 754 190 380 193 756 189 378 192 757 40 381 244 759 40 381 244 759 189 378 192 757 39 379 243 758 191 382 194 760 190 380 193 761 41 383 245 763 41 383 245 763 190 380 193 761 40 381 244 762 192 384 195 764 191 382 194 765 42 385 246 767 42 385 246 767 191 382 194 765 41 383 245 766 193 386 196 768 192 384 195 769 43 387 247 771 43 387 247 771 192 384 195 769 42 385 246 770 194 388 197 772 193 386 196 773 44 389 248 775 44 389 248 775 193 386 196 773 43 387 247 774 195 390 198 776 194 388 197 777 45 391 249 779 45 391 249 779 194 388 197 777 44 389 248 778 196 392 199 780 195 390 198 781 46 393 250 783 46 393 250 783 195 390 198 781 45 391 249 782 197 394 200 784 196 392 199 785 47 395 251 787 47 395 251 787 196 392 199 785 46 393 250 786 198 396 201 788 197 394 200 789 48 397 252 791 48 397 252 791 197 394 200 789 47 395 251 790 199 398 202 792 198 396 201 793 49 399 253 795 49 399 253 795 198 396 201 793 48 397 252 794 150 301 203 796 199 398 202 797 0 302 254 799 0 302 254 799 199 398 202 797 49 399 253 798</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_ring_Shape2</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_ring_2" name="qt_gauge_ring_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_ring_Shape2">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_ring_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_270.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_270.dae
new file mode 100644
index 0000000..ad6fd5b
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_270.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:49:18</created>
+ <modified>2018-03-08T09:49:18</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_ring_Shape270" name="qt_gauge_ring_Shape270">
+ <mesh>
+ <source id="qt_gauge_ring_Shape270-positions" name="qt_gauge_ring_Shape270-positions">
+ <float_array id="qt_gauge_ring_Shape270-positions-array" count="174">3.588529 0.1234614 4.276647 4.276644 0.1234614 3.58853 4.834814 0.1234614 2.79138 5.24608 0.1234614 1.909419 5.497946 0.1234614 0.9694376 5.582761 0.1234614 0 5.497947 0.1234614 -0.9694352 5.246078 0.1234614 -1.909417 4.834812 0.1234614 -2.791382 4.276643 0.1234614 -3.588528 3.588528 0.1234614 -4.276642 2.791379 0.1234614 -4.834813 1.909416 0.1234614 -5.246077 0.9694352 0.1234614 -5.497945 0 0.1234614 -5.582758 -0.9694371 0.1234614 -5.497942 -1.909419 0.1234614 -5.246077 -2.791382 0.1234614 -4.834808 -3.58853 0.1234614 -4.276639 -4.276645 0.1234614 -3.588527 -4.834812 0.1234614 -2.791374 -5.246076 0.1234614 -1.909413 -5.497944 0.1234614 -0.9694324 -5.582757 0.1234614 0 -5.497942 0.1234614 0.96944 -5.246077 0.1234614 1.909421 -4.834808 0.1234614 2.791383 -4.276639 0.1234614 3.588533 -3.588527 0.1234614 4.276644 3.909925 0.1234614 4.659667 4.659668 0.1234614 3.909925 5.267827 0.1234614 3.041381 5.715926 0.1234614 2.08043 5.990351 0.1234614 1.056261 6.08276 0.1234614 0 5.99035 0.1234614 -1.056261 5.715924 0.1234614 -2.080427 5.267824 0.1234614 -3.04138 4.659663 0.1234614 -3.909923 3.909922 0.1234614 -4.659666 3.041378 0.1234614 -5.267823 2.080425 0.1234614 -5.715922 1.056258 0.1234614 -5.990348 0 0.1234614 -6.082757 -1.056262 0.1234614 -5.990345 -2.080429 0.1234614 -5.715919 -3.041382 0.1234614 -5.267822 -3.909925 0.1234614 -4.659659 -4.659665 0.1234614 -3.909918 -5.267825 0.1234614 -3.041374 -5.715925 0.1234614 -2.08042 -5.99035 0.1234614 -1.056255 -6.08276 0.1234614 0 -5.990348 0.1234614 1.056265 -5.715922 0.1234614 2.080432 -5.267821 0.1234614 3.041385 -4.659662 0.1234614 3.909928 -3.909917 0.1234614 4.659667</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape270-positions-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape270-normals" name="qt_gauge_ring_Shape270-normals">
+ <float_array id="qt_gauge_ring_Shape270-normals-array" count="174">0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape270-normals-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape270-tangents" name="qt_gauge_ring_Shape270-tangents">
+ <float_array id="qt_gauge_ring_Shape270-tangents-array" count="174">0.707108 0 0.7071056 0.8191518 0 0.5735767 0.9063075 0 0.4226189 0.9659262 0 0.2588178 0.9961947 0 0.0871557 0.9961948 0 -0.087155 0.9659256 0 -0.25882 0.9063081 0 -0.4226176 0.8191512 0 -0.5735777 0.7071065 0 -0.707107 0.5735773 0 -0.8191514 0.4226163 0 -0.9063087 0.2588202 0 -0.9659255 0.08715358 0 -0.9961949 -0.08715667 0 -0.9961946 -0.2588177 0 -0.9659262 -0.42262 0 -0.906307 -0.5735762 0 -0.8191522 -0.7071058 0 -0.7071078 -0.8191546 0 -0.5735728 -0.9063081 0 -0.4226175 -0.9659255 0 -0.2588202 -0.9961948 0 -0.08715428 -0.9961946 0 0.08715646 -0.9659263 0 0.2588172 -0.9063066 0 0.4226207 -0.8191528 0 0.5735753 -0.7071058 0 0.7071078 -0.7660484 0 -0.6427829 0.7660409 0 -0.6427918 -0.7071063 0 -0.7071072 -0.8191532 0 -0.5735748 -0.9063076 0 -0.4226188 -0.965926 0 -0.2588184 -0.9961948 0 -0.08715449 -0.9961947 0 0.08715561 -0.9659256 0 0.2588198 -0.9063077 0 0.4226184 -0.8191517 0 0.573577 -0.7071075 0 0.7071061 -0.5735738 0 0.8191539 -0.4226181 0 0.9063079 -0.2588198 0 0.9659256 -0.08715464 0 0.9961948 0.08715728 0 0.9961946 0.2588198 0 0.9659256 0.4226162 0 0.9063087 0.573578 0 0.819151 0.7071079 0 0.7071057 0.8191522 0 0.5735762 0.9063079 0 0.4226179 0.9659257 0 0.2588194 0.9961948 0 0.08715497 0.9961946 0 -0.08715699 0.9659256 0 -0.2588198 0.9063074 0 -0.4226192 0.8191527 0 -0.5735756 0.7071039 0 -0.7071097</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape270-tangents-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape270-binormals" name="qt_gauge_ring_Shape270-binormals">
+ <float_array id="qt_gauge_ring_Shape270-binormals-array" count="174">0.7071056 0 -0.707108 0.5735767 0 -0.8191519 0.422619 0 -0.9063076 0.2588178 0 -0.9659262 0.0871557 0 -0.9961948 -0.087155 0 -0.9961948 -0.25882 0 -0.9659257 -0.4226176 0 -0.9063082 -0.5735777 0 -0.8191512 -0.707107 0 -0.7071065 -0.8191515 0 -0.5735773 -0.9063088 0 -0.4226164 -0.9659255 0 -0.2588202 -0.996195 0 -0.08715358 -0.9961947 0 0.08715667 -0.9659262 0 0.2588177 -0.906307 0 0.42262 -0.8191522 0 0.5735762 -0.7071078 0 0.7071058 -0.5735728 0 0.8191546 -0.4226175 0 0.9063082 -0.2588202 0 0.9659255 -0.08715428 0 0.9961949 0.08715646 0 0.9961947 0.2588173 0 0.9659264 0.4226207 0 0.9063067 0.5735753 0 0.8191529 0.7071078 0 0.7071058 -0.6427829 0 0.7660485 -0.6427918 0 -0.7660409 -0.7071072 0 0.7071064 -0.5735748 0 0.8191532 -0.4226188 0 0.9063076 -0.2588184 0 0.9659261 -0.0871545 0 0.9961949 0.08715562 0 0.9961948 0.2588198 0 0.9659257 0.4226184 0 0.9063077 0.573577 0 0.8191517 0.7071061 0 0.7071075 0.8191539 0 0.5735738 0.9063079 0 0.4226181 0.9659257 0 0.2588198 0.9961948 0 0.08715464 0.9961946 0 -0.08715728 0.9659257 0 -0.2588198 0.9063088 0 -0.4226163 0.819151 0 -0.5735779 0.7071056 0 -0.7071079 0.5735763 0 -0.8191522 0.4226179 0 -0.9063079 0.2588194 0 -0.9659258 0.08715497 0 -0.9961948 -0.08715699 0 -0.9961947 -0.2588198 0 -0.9659256 -0.4226192 0 -0.9063073 -0.5735756 0 -0.8191527 -0.7071097 0 -0.7071038</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape270-binormals-array" count="58" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape270-map1" name="qt_gauge_ring_Shape270-map1">
+ <float_array id="qt_gauge_ring_Shape270-map1-array" count="116">0.1111111 0.75 0.1388889 0.75 0.1666667 0.75 0.1944444 0.75 0.2222222 0.75 0.25 0.75 0.2777778 0.75 0.3055556 0.75 0.3333334 0.75 0.3611112 0.75 0.388889 0.75 0.4166667 0.75 0.4444445 0.75 0.4722223 0.75 0.5000001 0.75 0.5277779 0.75 0.5555557 0.75 0.5833335 0.75 0.6111113 0.75 0.6388891 0.75 0.6666669 0.75 0.6944447 0.75 0.7222224 0.75 0.7500002 0.75 0.777778 0.75 0.8055558 0.75 0.8333336 0.75 0.8611114 0.75 0.8888892 0.75 0.1111111 0.5 0.1388889 0.5 0.1666667 0.5 0.1944444 0.5 0.2222222 0.5 0.25 0.5 0.2777778 0.5 0.3055556 0.5 0.3333334 0.5 0.3611112 0.5 0.388889 0.5 0.4166667 0.5 0.4444445 0.5 0.4722223 0.5 0.5000001 0.5 0.5277779 0.5 0.5555557 0.5 0.5833335 0.5 0.6111113 0.5 0.6388891 0.5 0.6666669 0.5 0.6944447 0.5 0.7222224 0.5 0.7500002 0.5 0.777778 0.5 0.8055558 0.5 0.8333336 0.5 0.8611114 0.5 0.8888892 0.5</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape270-map1-array" count="58" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape270-textangents">
+ <float_array id="qt_gauge_ring_Shape270-textangents-array" count="336">0.6201829 0 -0.7844571 0.7071064 0 -0.7071071 0.7071072 0 -0.7071063 0.6648443 0 -0.746982 0.4745429 0 -0.8802323 0.6201829 0 -0.7844571 0.6648443 0 -0.746982 0.5250323 0 -0.8510823 0.3144819 0 -0.9492634 0.4745429 0 -0.8802323 0.5250323 0 -0.8510823 0.3692675 0 -0.9293231 0.1448659 0 -0.9894512 0.3144819 0 -0.9492634 0.3692675 0 -0.9293231 0.202281 0 -0.9793274 -0.02915022 0 -0.999575 0.1448659 0 -0.9894512 0.202281 0 -0.9793274 0.0291501 0 -0.999575 -0.2022824 0 -0.9793273 -0.02915022 0 -0.999575 0.0291501 0 -0.999575 -0.1448667 0 -0.9894511 -0.3692675 0 -0.9293231 -0.2022824 0 -0.9793273 -0.1448667 0 -0.9894511 -0.3144829 0 -0.9492631 -0.525033 0 -0.8510818 -0.3692675 0 -0.9293231 -0.3144829 0 -0.9492631 -0.4745424 0 -0.8802326 -0.6648452 0 -0.7469811 -0.525033 0 -0.8510818 -0.4745424 0 -0.8802326 -0.6201842 0 -0.7844562 -0.784457 0 -0.6201832 -0.6648452 0 -0.7469811 -0.6201842 0 -0.7844562 -0.7469818 0 -0.6648443 -0.8802328 0 -0.4745421 -0.784457 0 -0.6201832 -0.7469818 0 -0.6648443 -0.8510825 0 -0.5250319 -0.9492633 0 -0.3144822 -0.8802328 0 -0.4745421 -0.8510825 0 -0.5250319 -0.9293234 0 -0.3692668 -0.9894512 0 -0.1448661 -0.9492633 0 -0.3144822 -0.9293234 0 -0.3692668 -0.9793273 0 -0.2022823 -0.999575 0 0.02915204 -0.9894512 0 -0.1448661 -0.9793273 0 -0.2022823 -0.9995751 0 -0.02914889 -0.9793273 0 0.2022821 -0.999575 0 0.02915204 -0.9995751 0 -0.02914889 -0.989451 0 0.1448678 -0.9293234 0 0.3692668 -0.9793273 0 0.2022821 -0.989451 0 0.1448678 -0.9492636 0 0.3144814 -0.8510815 0 0.5250336 -0.9293234 0 0.3692668 -0.9492636 0 0.3144814 -0.8802323 0 0.4745429 -0.7469813 0 0.664845 -0.8510815 0 0.5250336 -0.8802323 0 0.4745429 -0.7844558 0 0.6201846 -0.620183 0 0.784457 -0.7469813 0 0.664845 -0.7844558 0 0.6201846 -0.6648449 0 0.7469814 -0.4745408 0 0.8802335 -0.620183 0 0.784457 -0.6648449 0 0.7469814 -0.5250311 0 0.851083 -0.3144826 0 0.9492633 -0.4745408 0 0.8802335 -0.5250311 0 0.851083 -0.3692671 0 0.9293233 -0.1448664 0 0.9894512 -0.3144826 0 0.9492633 -0.3692671 0 0.9293233 -0.2022823 0 0.9793273 0.02915164 0 0.999575 -0.1448664 0 0.9894512 -0.2022823 0 0.9793273 -0.02914933 0 0.9995751 0.2022819 0 0.9793273 0.02915164 0 0.999575 -0.02914933 0 0.9995751 0.1448677 0 0.989451 0.3692679 0 0.9293228 0.2022819 0 0.9793273 0.1448677 0 0.989451 0.3144823 0 0.9492633 0.5250326 0 0.8510821 0.3692679 0 0.9293228 0.3144823 0 0.9492633 0.4745432 0 0.8802322 0.6648459 0 0.7469804 0.5250326 0 0.8510821 0.4745432 0 0.8802322 0.6201843 0 0.7844561 0.7071077 0 0.7071058 0.6648459 0 0.7469804 0.6201843 0 0.7844561 0.7071087 0 0.7071048</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape270-textangents-array" count="112" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_Shape270-texbinormals">
+ <float_array id="qt_gauge_ring_Shape270-texbinormals-array" count="336">-0.7844573 0 -0.620183 -0.7071071 0 -0.7071064 -0.7071064 0 -0.7071072 -0.746982 0 -0.6648443 -0.8802325 0 -0.474543 -0.7844573 0 -0.620183 -0.746982 0 -0.6648443 -0.8510823 0 -0.5250323 -0.9492635 0 -0.3144819 -0.8802325 0 -0.474543 -0.8510823 0 -0.5250323 -0.9293232 0 -0.3692675 -0.9894513 0 -0.1448659 -0.9492635 0 -0.3144819 -0.9293232 0 -0.3692675 -0.9793276 0 -0.202281 -0.9995751 0 0.02915022 -0.9894513 0 -0.1448659 -0.9793276 0 -0.202281 -0.9995751 0 -0.0291501 -0.9793273 0 0.2022824 -0.9995751 0 0.02915022 -0.9995751 0 -0.0291501 -0.9894512 0 0.1448667 -0.9293232 0 0.3692675 -0.9793273 0 0.2022824 -0.9894512 0 0.1448667 -0.9492632 0 0.3144829 -0.8510819 0 0.5250331 -0.9293232 0 0.3692675 -0.9492632 0 0.3144829 -0.8802327 0 0.4745425 -0.7469811 0 0.6648452 -0.8510819 0 0.5250331 -0.8802327 0 0.4745425 -0.7844563 0 0.6201842 -0.6201833 0 0.784457 -0.7469811 0 0.6648452 -0.7844563 0 0.6201842 -0.6648445 0 0.7469819 -0.4745421 0 0.8802329 -0.6201833 0 0.784457 -0.6648445 0 0.7469819 -0.5250319 0 0.8510826 -0.3144823 0 0.9492635 -0.4745421 0 0.8802329 -0.5250319 0 0.8510826 -0.3692668 0 0.9293234 -0.1448661 0 0.9894513 -0.3144823 0 0.9492635 -0.3692668 0 0.9293234 -0.2022823 0 0.9793273 0.02915204 0 0.999575 -0.1448661 0 0.9894513 -0.2022823 0 0.9793273 -0.02914889 0 0.9995751 0.2022822 0 0.9793274 0.02915204 0 0.999575 -0.02914889 0 0.9995751 0.1448678 0 0.9894511 0.3692668 0 0.9293234 0.2022822 0 0.9793274 0.1448678 0 0.9894511 0.3144814 0 0.9492637 0.5250336 0 0.8510815 0.3692668 0 0.9293234 0.3144814 0 0.9492637 0.4745429 0 0.8802324 0.6648451 0 0.7469814 0.5250336 0 0.8510815 0.4745429 0 0.8802324 0.6201847 0 0.7844559 0.7844571 0 0.6201831 0.6648451 0 0.7469814 0.6201847 0 0.7844559 0.7469814 0 0.6648449 0.8802336 0 0.4745408 0.7844571 0 0.6201831 0.7469814 0 0.6648449 0.851083 0 0.5250311 0.9492633 0 0.3144826 0.8802336 0 0.4745408 0.851083 0 0.5250311 0.9293233 0 0.3692671 0.9894512 0 0.1448664 0.9492633 0 0.3144826 0.9293233 0 0.3692671 0.9793273 0 0.2022823 0.9995751 0 -0.02915164 0.9894512 0 0.1448664 0.9793273 0 0.2022823 0.9995751 0 0.02914933 0.9793274 0 -0.2022819 0.9995751 0 -0.02915164 0.9995751 0 0.02914933 0.9894511 0 -0.1448677 0.929323 0 -0.3692679 0.9793274 0 -0.2022819 0.9894511 0 -0.1448677 0.9492634 0 -0.3144823 0.8510821 0 -0.5250326 0.929323 0 -0.3692679 0.9492634 0 -0.3144823 0.8802322 0 -0.4745432 0.7469805 0 -0.6648461 0.8510821 0 -0.5250326 0.8802322 0 -0.4745432 0.7844561 0 -0.6201843 0.7071058 0 -0.7071077 0.7469805 0 -0.6648461 0.7844561 0 -0.6201843 0.7071048 0 -0.7071087</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_Shape270-texbinormals-array" count="112" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_ring_Shape270-vertices" name="qt_gauge_ring_Shape270-vertices">
+ <input semantic="POSITION" source="#qt_gauge_ring_Shape270-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_ring_Shape270-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_ring_Shape270-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_ring_Shape270-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="56">
+ <input semantic="VERTEX" source="#qt_gauge_ring_Shape270-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_ring_Shape270-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_ring_Shape270-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_ring_Shape270-texbinormals" offset="2" set="0"/>
+ <p>1 1 0 0 0 1 30 30 3 30 30 3 0 0 1 29 29 2 2 2 4 1 1 5 31 31 7 31 31 7 1 1 5 30 30 6 3 3 8 2 2 9 32 32 11 32 32 11 2 2 9 31 31 10 4 4 12 3 3 13 33 33 15 33 33 15 3 3 13 32 32 14 5 5 16 4 4 17 34 34 19 34 34 19 4 4 17 33 33 18 6 6 20 5 5 21 35 35 23 35 35 23 5 5 21 34 34 22 7 7 24 6 6 25 36 36 27 36 36 27 6 6 25 35 35 26 8 8 28 7 7 29 37 37 31 37 37 31 7 7 29 36 36 30 9 9 32 8 8 33 38 38 35 38 38 35 8 8 33 37 37 34 10 10 36 9 9 37 39 39 39 39 39 39 9 9 37 38 38 38 11 11 40 10 10 41 40 40 43 40 40 43 10 10 41 39 39 42 12 12 44 11 11 45 41 41 47 41 41 47 11 11 45 40 40 46 13 13 48 12 12 49 42 42 51 42 42 51 12 12 49 41 41 50 14 14 52 13 13 53 43 43 55 43 43 55 13 13 53 42 42 54 15 15 56 14 14 57 44 44 59 44 44 59 14 14 57 43 43 58 16 16 60 15 15 61 45 45 63 45 45 63 15 15 61 44 44 62 17 17 64 16 16 65 46 46 67 46 46 67 16 16 65 45 45 66 18 18 68 17 17 69 47 47 71 47 47 71 17 17 69 46 46 70 19 19 72 18 18 73 48 48 75 48 48 75 18 18 73 47 47 74 20 20 76 19 19 77 49 49 79 49 49 79 19 19 77 48 48 78 21 21 80 20 20 81 50 50 83 50 50 83 20 20 81 49 49 82 22 22 84 21 21 85 51 51 87 51 51 87 21 21 85 50 50 86 23 23 88 22 22 89 52 52 91 52 52 91 22 22 89 51 51 90 24 24 92 23 23 93 53 53 95 53 53 95 23 23 93 52 52 94 25 25 96 24 24 97 54 54 99 54 54 99 24 24 97 53 53 98 26 26 100 25 25 101 55 55 103 55 55 103 25 25 101 54 54 102 27 27 104 26 26 105 56 56 107 56 56 107 26 26 105 55 55 106 28 28 108 27 27 109 57 57 111 57 57 111 27 27 109 56 56 110</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_ring_Shape270</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_ring_270" name="qt_gauge_ring_270" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_ring_Shape270">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_ring_270</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_1.dae
new file mode 100644
index 0000000..a533cf6
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:47:54</created>
+ <modified>2018-03-08T09:47:54</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_ring_piecesShape" name="qt_gauge_ring_piecesShape">
+ <mesh>
+ <source id="qt_gauge_ring_piecesShape-positions" name="qt_gauge_ring_piecesShape-positions">
+ <float_array id="qt_gauge_ring_piecesShape-positions-array" count="480">4.579035 0 6.099323 6.662733 0 8.967293 7.8146 0 7.983513 5.307903 0 5.476814 3.568514 0 6.740551 5.177912 0 9.899174 6.469492 0 9.107693 4.385792 0 6.239723 2.470127 0 7.215805 3.565594 0 10.5873 4.965084 0 10.00761 3.355686 0 6.848991 -7.625946 0 0.1194305 -11.17095 0 0.1194305 -11.0521 0 1.629562 -7.550741 0 1.075001 -6.239719 0 -4.385792 -9.107687 0 -6.469498 -9.899168 0 -5.177914 -6.740547 0 -3.568516 -7.550741 0 -1.074997 -11.0521 0 -1.629562 -11.17095 0 -0.1194305 -7.625946 0 -0.1194305 -7.289612 0 -2.242962 -10.66111 0 -3.338428 -11.01473 0 -1.865482 -7.513374 0 -1.310917 -6.848988 0 -3.35569 -10.00761 0 -4.965088 -10.5873 0 -3.565598 -7.215799 0 -2.470131 4.385796 0 -6.239716 6.469496 0 -9.107689 5.177916 0 -9.89917 3.568518 0 -6.740547 6.099318 0 -4.579033 8.967283 0 -6.662735 7.983503 0 -7.814598 5.476807 0 -5.307907 5.307905 0 -5.476807 7.814604 0 -7.983498 6.662737 0 -8.967285 4.579039 0 -6.099312 7.215796 0 -2.470123 10.58729 0 -3.56559 10.0076 0 -4.965088 6.848986 0 -3.35569 6.740545 0 -3.568516 9.899164 0 -5.177914 9.107683 0 -6.469498 6.239717 0 -4.385792 3.35569 0 -6.848984 4.965088 0 -10.00761 3.565598 0 -10.5873 2.470131 0 -7.215797 1.074999 0 -7.550735 1.62956 0 -11.05209 0.1194286 0 -11.17094 0.1194286 0 -7.625946 2.24296 0 -7.289612 3.338427 0 -10.66111 1.86548 0 -11.01473 1.310919 0 -7.513374 1.310915 0 7.513378 1.865475 0 11.01474 3.338423 0 10.66111 2.242956 0 7.289616 0.1194267 0 7.625942 0.1194267 0 11.17094 1.629555 0 11.05211 1.074995 0 7.550743 -4.579041 0 -6.099319 -6.662743 0 -8.967285 -7.814604 0 -7.983505 -5.307909 0 -5.476807 -0.1194324 0 -7.625946 -0.1194324 0 -11.17094 -1.629564 0 -11.05209 -1.075003 0 -7.550735 -3.568521 0 -6.740547 -5.177919 0 -9.89917 -6.4695 0 -9.107689 -4.385798 0 -6.239723 -1.310923 0 -7.513374 -1.865484 0 -11.01473 -3.33843 0 -10.66111 -2.242964 0 -7.289612 -2.470135 0 -7.215797 -3.565601 0 -10.5873 -4.965092 0 -10.00761 -3.355694 0 -6.848984 -5.47681 0 -5.307903 -7.983505 0 -7.814606 -8.967287 0 -6.662735 -6.099319 0 -4.579033 7.550737 0 1.075005 11.0521 0 1.62957 11.17095 0 0.1194344 7.62594 0 0.1194382 7.513372 0 -1.310917 11.01473 0 -1.865475 10.6611 0 -3.338421 7.289606 0 -2.242954 6.848982 0 3.355698 10.0076 0 4.965096 10.58729 0 3.565605 7.215796 0 2.470139 7.62594 0 -0.1194229 11.17095 0 -0.1194267 11.0521 0 -1.629555 7.550737 0 -1.074997 5.476805 0 5.307911 7.9835 0 7.814613 8.967283 0 6.662743 6.099314 0 4.579041 6.239714 0 4.385799 9.107683 0 6.469501 9.899164 0 5.177921 6.740541 0 3.568523 7.289606 0 2.24297 10.6611 0 3.338436 11.01473 0 1.86549 7.513372 0 1.310925 -4.385799 0 6.239719 -6.469498 0 9.107681 -5.177919 0 9.899162 -3.568521 0 6.740543 -1.075003 0 7.550735 -1.629564 0 11.05209 -0.1194344 0 11.17094 -0.1194344 0 7.625942 -3.355694 0 6.848984 -4.965092 0 10.0076 -3.565601 0 10.58729 -2.470135 0 7.215797 -7.215799 0 2.470131 -10.5873 0 3.565598 -10.00761 0 4.965088 -6.848988 0 3.355694 -5.307909 0 5.476807 -7.814602 0 7.983498 -6.662741 0 8.967281 -4.579042 0 6.099319 -7.513374 0 1.310921 -11.01473 0 1.865482 -10.66111 0 3.338428 -7.289612 0 2.242962 -6.740547 0 3.56852 -9.899166 0 5.177914 -9.107685 0 6.469494 -6.239719 0 4.385796 -2.242964 0 7.289608 -3.33843 0 10.6611 -1.865484 0 11.01473 -1.310923 0 7.513371 -6.099319 0 4.579037 -8.967285 0 6.662735 -7.983503 0 7.814598 -5.47681 0 5.307907</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_piecesShape-positions-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_piecesShape-normals" name="qt_gauge_ring_piecesShape-normals">
+ <float_array id="qt_gauge_ring_piecesShape-normals-array" count="480">0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_piecesShape-normals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_piecesShape-tangents" name="qt_gauge_ring_piecesShape-tangents">
+ <float_array id="qt_gauge_ring_piecesShape-tangents-array" count="480">0.6494459 0 0.7604078 0.8090175 0 -0.5877846 -0.6494452 0 -0.7604084 -0.7071071 0 0.7071065 0.522498 0 0.8526405 0.8910066 0 -0.4539903 -0.5224984 0 -0.8526403 -0.8090172 0 0.5877849 0.3826862 0 0.9238784 0.9510565 0 -0.3090171 -0.3826841 0 -0.9238793 -0.8910066 0 0.4539903 -0.9969173 0 0.07845893 0 0 1 0.9969173 0 -0.07845897 -0.1564348 0 -0.9876883 -0.85264 0 -0.5224989 -0.5877863 0 0.8090163 0.852641 0 0.5224973 0.4539905 0 -0.8910065 -0.9969173 0 -0.07845924 -0.1564359 0 0.9876881 0.9969173 0 0.07845897 0 0 -1 -0.9723703 0 -0.2334437 -0.3090173 0 0.9510564 0.9723699 0 0.2334456 0.1564358 0 -0.9876881 -0.9238791 0 -0.3826845 -0.4539905 0 0.8910065 0.9238795 0 0.3826835 0.3090172 0 -0.9510565 0.5225009 0 -0.8526387 -0.8090176 0 -0.5877844 -0.5224984 0 0.8526403 0.8910066 0 0.4539903 0.7604093 0 -0.6494441 -0.5877858 0 -0.8090166 -0.7604073 0 0.6494465 0.707106 0 0.7071076 0.6494446 0 -0.7604089 -0.7071057 0 -0.7071079 -0.6494481 0 0.7604059 0.8090178 0 0.5877841 0.923881 0 -0.38268 -0.3090171 0 -0.9510565 -0.92388 0 0.3826823 0.4539908 0 0.8910064 0.85264 0 -0.5224989 -0.4539908 0 -0.8910064 -0.852641 0 0.5224973 0.5877865 0 0.8090161 0.3826862 0 -0.9238784 -0.8910066 0 -0.4539903 -0.3826841 0 0.9238793 0.9510565 0 0.3090171 0.07846486 0 -0.9969169 -0.9876883 0 -0.1564347 -0.07845959 0 0.9969173 1 0 0 0.2334446 0 -0.9723701 -0.9510565 0 -0.3090171 -0.233445 0 0.97237 0.9876883 0 0.1564347 0.2334446 0 0.9723701 0.9876884 0 -0.1564339 -0.2334494 0 -0.9723689 -0.9510565 0 0.3090171 0.07845315 0 0.9969178 1 0 0 -0.07844978 0 -0.9969181 -0.9876884 0 0.1564339 -0.6494482 0 -0.7604058 -0.8090166 0 0.5877858 0.6494471 0 0.7604068 0.7071073 0 -0.7071062 -0.07846486 0 -0.9969169 -1 0 0 0.07845959 0 0.9969173 0.9876883 0 -0.1564347 -0.522496 0 -0.8526417 -0.8910066 0 0.4539903 0.5224984 0 0.8526403 0.8090166 0 -0.5877858 -0.2334446 0 -0.9723701 -0.9876883 0 0.1564347 0.233445 0 0.97237 0.9510565 0 -0.3090171 -0.3826862 0 -0.9238784 -0.9510565 0 0.3090171 0.3826841 0 0.9238793 0.8910066 0 -0.4539903 -0.7604086 0 -0.649445 -0.7071079 0 0.7071057 0.7604088 0 0.6494447 0.5877856 0 -0.8090168 0.9969175 0 0.07845727 0.1564358 0 -0.9876881 -0.9969173 0 -0.07845939 0 0 1 0.972369 0 -0.2334493 -0.1564337 0 -0.9876885 -0.9723694 0 0.2334473 0.3090171 0 0.9510565 0.9238784 0 0.3826862 0.4539903 0 -0.8910066 -0.9238793 0 -0.3826841 -0.3090171 0 0.9510565 0.9969175 0 -0.07845664 0 0 -1 -0.9969173 0 0.07845979 0.1564337 0 0.9876885 0.7604086 0 0.649445 0.7071079 0 -0.7071057 -0.7604082 0 -0.6494454 -0.5877853 0 0.809017 0.85264 0 0.5224989 0.5877853 0 -0.809017 -0.8526403 0 -0.5224984 -0.4539903 0 0.8910066 0.9723694 0 0.2334475 0.3090171 0 -0.9510565 -0.9723694 0 -0.2334473 -0.1564358 0 0.9876881 -0.5224951 0 0.8526423 0.8090167 0 0.5877856 0.522499 0 -0.8526399 -0.8910064 0 -0.4539908 -0.07846107 0 0.9969172 0.9876883 0 0.1564347 0.07845969 0 -0.9969173 -1 0 0 -0.3826862 0 0.9238784 0.8910064 0 0.4539908 0.3826841 0 -0.9238793 -0.9510564 0 -0.3090174 -0.9238797 0 0.3826831 0.3090172 0 0.9510565 0.923879 0 -0.3826846 -0.4539899 0 -0.8910068 -0.6494492 0 0.760405 0.7071065 0 0.7071071 0.6494486 0 -0.7604055 -0.8090167 0 -0.5877856 -0.9723701 0 0.2334446 0.1564348 0 0.9876883 0.97237 0 -0.233445 -0.3090172 0 -0.9510565 -0.85264 0 0.5224989 0.4539899 0 0.8910068 0.8526403 0 -0.5224984 -0.5877851 0 -0.8090171 -0.2334446 0 0.9723701 0.9510564 0 0.3090174 0.2334473 0 -0.9723694 -0.9876883 0 -0.1564347 -0.7604086 0 0.649445 0.5877851 0 0.8090171 0.7604067 0 -0.6494472 -0.7071065 0 -0.7071071</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_piecesShape-tangents-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_piecesShape-binormals" name="qt_gauge_ring_piecesShape-binormals">
+ <float_array id="qt_gauge_ring_piecesShape-binormals-array" count="480">0.7604078 0 -0.649446 -0.5877846 0 -0.8090175 -0.7604084 0 0.6494452 0.7071065 0 0.7071071 0.8526405 0 -0.522498 -0.4539904 0 -0.8910067 -0.8526403 0 0.5224984 0.5877849 0 0.8090172 0.9238784 0 -0.3826862 -0.3090171 0 -0.9510565 -0.9238793 0 0.3826841 0.4539904 0 0.8910067 0.07845894 0 0.9969174 1 0 0 -0.07845896 0 -0.9969174 -0.9876883 0 0.1564348 -0.5224989 0 0.85264 0.8090163 0 0.5877863 0.5224973 0 -0.852641 -0.8910065 0 -0.4539905 -0.07845925 0 0.9969174 0.9876881 0 0.1564359 0.07845896 0 -0.9969174 -1 0 0 -0.2334437 0 0.9723703 0.9510565 0 0.3090173 0.2334456 0 -0.97237 -0.9876882 0 -0.1564358 -0.3826845 0 0.9238791 0.8910065 0 0.4539905 0.3826835 0 -0.9238795 -0.9510565 0 -0.3090172 -0.8526388 0 -0.5225009 -0.5877844 0 0.8090176 0.8526403 0 0.5224984 0.4539904 0 -0.8910067 -0.6494442 0 -0.7604093 -0.8090166 0 0.5877858 0.6494465 0 0.7604073 0.7071076 0 -0.707106 -0.7604089 0 -0.6494446 -0.7071078 0 0.7071057 0.7604059 0 0.6494482 0.5877841 0 -0.8090178 -0.38268 0 -0.923881 -0.9510565 0 0.3090171 0.3826823 0 0.92388 0.8910064 0 -0.4539908 -0.5224989 0 -0.85264 -0.8910064 0 0.4539908 0.5224973 0 0.8526409 0.8090162 0 -0.5877866 -0.9238784 0 -0.3826862 -0.4539904 0 0.8910067 0.9238793 0 0.3826841 0.3090171 0 -0.9510565 -0.9969169 0 -0.07846487 -0.1564347 0 0.9876884 0.9969173 0 0.07845959 0 0 -1 -0.9723701 0 -0.2334446 -0.3090171 0 0.9510565 0.97237 0 0.233445 0.1564347 0 -0.9876883 0.9723701 0 -0.2334446 -0.1564339 0 -0.9876884 -0.972369 0 0.2334494 0.3090171 0 0.9510565 0.9969179 0 -0.07845316 0 0 -1 -0.9969181 0 0.07844978 0.1564339 0 0.9876884 -0.7604059 0 0.6494483 0.5877858 0 0.8090166 0.7604068 0 -0.6494471 -0.7071063 0 -0.7071074 -0.9969169 0 0.07846487 0 0 1 0.9969174 0 -0.07845959 -0.1564347 0 -0.9876883 -0.8526418 0 0.522496 0.4539904 0 0.8910067 0.8526404 0 -0.5224984 -0.5877858 0 -0.8090166 -0.9723701 0 0.2334446 0.1564347 0 0.9876883 0.97237 0 -0.233445 -0.3090171 0 -0.9510565 -0.9238784 0 0.3826862 0.3090171 0 0.9510565 0.9238793 0 -0.3826841 -0.4539904 0 -0.8910067 -0.649445 0 0.7604087 0.7071057 0 0.7071078 0.6494447 0 -0.7604089 -0.8090168 0 -0.5877855 0.07845727 0 -0.9969175 -0.9876882 0 -0.1564358 -0.0784594 0 0.9969174 1 0 0 -0.2334493 0 -0.9723691 -0.9876885 0 0.1564337 0.2334474 0 0.9723695 0.9510565 0 -0.3090171 0.3826862 0 -0.9238784 -0.8910067 0 -0.4539904 -0.3826841 0 0.9238793 0.9510565 0 0.3090171 -0.07845664 0 -0.9969176 -1 0 0 0.07845978 0 0.9969173 0.9876885 0 -0.1564337 0.6494449 0 -0.7604086 -0.7071057 0 -0.7071078 -0.6494456 0 0.7604082 0.809017 0 0.5877853 0.5224989 0 -0.85264 -0.8090169 0 -0.5877853 -0.5224984 0 0.8526404 0.8910067 0 0.4539904 0.2334475 0 -0.9723695 -0.9510565 0 -0.3090171 -0.2334474 0 0.9723695 0.9876882 0 0.1564358 0.8526423 0 0.5224951 0.5877856 0 -0.8090168 -0.8526399 0 -0.522499 -0.4539908 0 0.8910064 0.9969172 0 0.07846107 0.1564347 0 -0.9876884 -0.9969173 0 -0.07845969 0 0 1 0.9238784 0 0.3826862 0.4539908 0 -0.8910064 -0.9238793 0 -0.3826841 -0.3090174 0 0.9510564 0.3826831 0 0.9238797 0.9510565 0 -0.3090172 -0.3826846 0 -0.923879 -0.8910068 0 0.4539899 0.7604049 0 0.6494492 0.7071071 0 -0.7071065 -0.7604055 0 -0.6494486 -0.5877856 0 0.8090168 0.2334446 0 0.9723701 0.9876883 0 -0.1564348 -0.233445 0 -0.97237 -0.9510565 0 0.3090172 0.5224989 0 0.85264 0.8910068 0 -0.4539899 -0.5224984 0 -0.8526403 -0.8090171 0 0.5877851 0.9723701 0 0.2334446 0.3090174 0 -0.9510564 -0.9723694 0 -0.2334473 -0.1564347 0 0.9876883 0.649445 0 0.7604087 0.8090171 0 -0.5877851 -0.6494472 0 -0.7604067 -0.7071071 0 0.7071065</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_piecesShape-binormals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_piecesShape-map1" name="qt_gauge_ring_piecesShape-map1">
+ <float_array id="qt_gauge_ring_piecesShape-map1-array" count="320">0.8928096 0.75 0.8935929 0.5000002 0.8722619 0.5 0.8730452 0.7499998 0.9175147 0.75 0.9182979 0.5000002 0.8969669 0.5000001 0.8977501 0.75 0.9422196 0.7499998 0.9430029 0.5000001 0.9216719 0.5000002 0.9224553 0.75 0.2504796 0.75 0.2512629 0.5 0.2299318 0.5 0.2307151 0.7499999 0.3492997 0.75 0.350083 0.5 0.3287519 0.5 0.3295352 0.7499999 0.2751846 0.75 0.275968 0.5 0.2546369 0.5 0.2554201 0.7500001 0.2998897 0.7499999 0.300673 0.5 0.2793419 0.5 0.2801251 0.75 0.3245947 0.75 0.3253779 0.5 0.3040469 0.5 0.3048302 0.7499999 0.5963497 0.75 0.5971329 0.5 0.575802 0.5 0.5765852 0.7499998 0.6457598 0.75 0.646543 0.5000002 0.6252121 0.5 0.6259952 0.7499998 0.6210547 0.7499999 0.6218381 0.5000001 0.600507 0.5000001 0.6012903 0.75 0.6951697 0.75 0.695953 0.5000002 0.6746219 0.5000001 0.6754053 0.7499999 0.6704648 0.75 0.671248 0.5000001 0.6499169 0.5 0.6507002 0.75 0.5716448 0.75 0.572428 0.5000001 0.551097 0.5000001 0.5518802 0.7499999 0.5222349 0.75 0.5230181 0.5000002 0.501687 0.5000003 0.5024703 0.75 0.5469397 0.7499998 0.547723 0.5000001 0.526392 0.5 0.5271753 0.7499999 0.9669247 0.75 0.9677079 0.5 0.9463769 0.5000002 0.9471601 0.7499999 0.9898623 0.75 0.9905834 0.5 0.9709478 0.5 0.9716688 0.75 0.3987097 0.75 0.399493 0.5 0.378162 0.5 0.3789452 0.75 0.4975298 0.75 0.4983131 0.5000002 0.476982 0.5000003 0.4777653 0.7499999 0.4234148 0.75 0.424198 0.5 0.402867 0.5 0.4036503 0.7499998 0.4728248 0.7499999 0.4736081 0.5 0.452277 0.5 0.4530603 0.7499998 0.4481198 0.7499999 0.448903 0.5 0.427572 0.5000001 0.4283553 0.75 0.3740047 0.75 0.374788 0.5 0.3534569 0.5000001 0.3542402 0.7499999 0.7692848 0.7499999 0.770068 0.5000001 0.7487369 0.5 0.7495202 0.75 0.7198747 0.7499999 0.720658 0.5 0.6993269 0.5000002 0.7001103 0.75 0.8186947 0.75 0.819478 0.5000001 0.7981469 0.5 0.7989302 0.7499999 0.7445797 0.75 0.7453629 0.5 0.724032 0.5000001 0.7248152 0.7500001 0.8681047 0.7499999 0.868888 0.5 0.8475569 0.5000002 0.8483401 0.7499999 0.8433996 0.75 0.8441829 0.5000001 0.8228519 0.5000001 0.8236352 0.75 0.7939897 0.75 0.794773 0.5000001 0.773442 0.5 0.7742252 0.7499998 0.1022495 0.7499999 0.1030328 0.5 0.08170173 0.5 0.08248496 0.75 0.02833499 0.75 0.02905467 0.5 0.009455288 0.5 0.01017496 0.75 0.07754445 0.75 0.07832773 0.5 0.05699673 0.5 0.05777997 0.75 0.2010696 0.75 0.2018528 0.5 0.1805218 0.5000001 0.1813051 0.75 0.1269545 0.7499999 0.1277378 0.5000001 0.1064068 0.5 0.10719 0.7499999 0.2257746 0.75 0.2265578 0.5 0.2052268 0.5 0.2060101 0.75 0.1763646 0.75 0.1771479 0.5000001 0.1558168 0.5000001 0.1566 0.75 0.05283949 0.75 0.05362275 0.5000001 0.0322917 0.5 0.03307495 0.75 0.1516596 0.75 0.1524428 0.5000002 0.1311118 0.5 0.131895 0.7499999</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_piecesShape-map1-array" count="160" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_piecesShape-textangents">
+ <float_array id="qt_gauge_ring_piecesShape-textangents-array" count="480">-0.760406 0 0.6494479 -0.7604064 0 0.6494474 -0.7604069 0 0.6494468 -0.7604064 0 0.6494474 -0.8526405 0 0.522498 -0.8526402 0 0.5224984 -0.8526399 0 0.5224988 -0.8526402 0 0.5224984 -0.9238794 0 0.3826837 -0.9238795 0 0.3826834 -0.9238797 0 0.382683 -0.9238795 0 0.3826834 -0.0784598 0 -0.9969172 -0.07845937 0 -0.9969172 -0.07845896 0 -0.9969173 -0.07845937 0 -0.9969172 0.5224981 0 -0.8526404 0.5224977 0 -0.8526406 0.5224972 0 -0.8526409 0.5224977 0 -0.8526406 0.07846012 0 -0.9969172 0.07845954 0 -0.9969172 0.07845896 0 -0.9969173 0.07845954 0 -0.9969172 0.2334446 0 -0.9723701 0.233445 0 -0.97237 0.2334456 0 -0.9723698 0.233445 0 -0.97237 0.3826836 0 -0.9238794 0.3826835 0 -0.9238793 0.3826835 0 -0.9238794 0.3826835 0 -0.9238793 0.8526405 0 0.5224978 0.8526404 0 0.5224981 0.8526403 0 0.5224984 0.8526404 0 0.5224981 0.6494467 0 0.7604069 0.6494473 0 0.7604066 0.6494477 0 0.7604062 0.6494473 0 0.7604066 0.7604077 0 0.6494459 0.7604066 0 0.6494472 0.7604055 0 0.6494485 0.7604066 0 0.6494472 0.3826807 0 0.9238806 0.382682 0 0.9238801 0.3826833 0 0.9238795 0.382682 0 0.9238801 0.5224988 0 0.8526399 0.5224983 0 0.8526403 0.5224977 0 0.8526406 0.5224983 0 0.8526403 0.923879 0 0.3826845 0.923879 0 0.3826846 0.923879 0 0.3826846 0.923879 0 0.3826846 0.9969168 0 0.07846486 0.996917 0 0.0784625 0.9969172 0 0.07846014 0.996917 0 0.0784625 0.9723698 0 0.2334454 0.97237 0 0.2334449 0.9723701 0 0.2334444 0.97237 0 0.2334449 -0.9723698 0 0.2334454 -0.9723697 0 0.2334464 -0.9723694 0 0.2334473 -0.9723697 0 0.2334464 -0.9969178 0 0.07845315 -0.9969179 0 0.07845146 -0.996918 0 0.07844977 -0.9969179 0 0.07845146 0.7604058 0 -0.6494482 0.7604062 0 -0.6494476 0.7604067 0 -0.649447 0.7604062 0 -0.6494476 0.9969168 0 -0.07846573 0.9969169 0 -0.07846238 0.9969173 0 -0.07845903 0.9969169 0 -0.07846238 0.8526403 0 -0.5224982 0.8526403 0 -0.5224983 0.8526403 0 -0.5224984 0.8526403 0 -0.5224983 0.9723697 0 -0.2334463 0.9723698 0 -0.2334456 0.97237 0 -0.2334449 0.9723698 0 -0.2334456 0.9238787 0 -0.3826853 0.923879 0 -0.3826844 0.9238793 0 -0.3826835 0.923879 0 -0.3826844 0.6494442 0 -0.7604091 0.6494449 0 -0.7604086 0.6494455 0 -0.760408 0.6494449 0 -0.7604086 -0.07845814 0 0.9969174 -0.07845849 0 0.9969174 -0.07845883 0 0.9969173 -0.07845849 0 0.9969174 0.2334484 0 0.9723691 0.2334468 0 0.9723696 0.2334452 0 0.9723699 0.2334468 0 0.9723696 -0.3826845 0 0.923879 -0.3826841 0 0.9238793 -0.3826835 0 0.9238793 -0.3826841 0 0.9238793 0.07845576 0 0.9969175 0.0784575 0 0.9969174 0.07845923 0 0.9969173 0.0784575 0 0.9969174 -0.6494449 0 0.7604086 -0.649446 0 0.7604077 -0.6494471 0 0.7604067 -0.649446 0 0.7604077 -0.5224988 0 0.8526399 -0.5224985 0 0.8526401 -0.5224984 0 0.8526403 -0.5224985 0 0.8526401 -0.2334449 0 0.97237 -0.2334455 0 0.9723697 -0.2334462 0 0.9723697 -0.2334455 0 0.9723697 -0.8526413 0 -0.5224966 -0.8526406 0 -0.5224977 -0.8526399 0 -0.5224989 -0.8526406 0 -0.5224977 -0.9969171 0 -0.07846106 -0.9969172 0 -0.07846037 -0.9969172 0 -0.07845968 -0.9969172 0 -0.07846037 -0.9238783 0 -0.3826861 -0.9238788 0 -0.3826851 -0.9238792 0 -0.3826841 -0.9238788 0 -0.3826851 -0.382683 0 -0.9238796 -0.3826835 0 -0.9238793 -0.3826841 0 -0.9238792 -0.3826835 0 -0.9238793 -0.7604049 0 -0.6494492 -0.7604055 0 -0.6494484 -0.7604062 0 -0.6494476 -0.7604055 0 -0.6494484 -0.2334446 0 -0.97237 -0.2334448 0 -0.97237 -0.2334449 0 -0.97237 -0.2334448 0 -0.97237 -0.5224988 0 -0.8526399 -0.5224985 0 -0.8526401 -0.5224984 0 -0.8526403 -0.5224985 0 -0.8526401 -0.97237 0 -0.2334446 -0.9723698 0 -0.2334457 -0.9723696 0 -0.2334468 -0.9723698 0 -0.2334457 -0.6494462 0 -0.7604074 -0.6494474 0 -0.7604065 -0.6494484 0 -0.7604055 -0.6494474 0 -0.7604065</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_piecesShape-textangents-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_piecesShape-texbinormals">
+ <float_array id="qt_gauge_ring_piecesShape-texbinormals-array" count="480">-0.649448 0 -0.7604061 -0.6494474 0 -0.7604066 -0.649447 0 -0.760407 -0.6494474 0 -0.7604066 -0.522498 0 -0.8526406 -0.5224984 0 -0.8526403 -0.5224988 0 -0.85264 -0.5224984 0 -0.8526403 -0.3826838 0 -0.9238795 -0.3826835 0 -0.9238796 -0.3826831 0 -0.9238798 -0.3826835 0 -0.9238796 0.9969173 0 -0.0784598 0.9969174 0 -0.07845939 0.9969174 0 -0.07845896 0.9969174 0 -0.07845939 0.8526405 0 0.5224981 0.8526407 0 0.5224977 0.852641 0 0.5224973 0.8526407 0 0.5224977 0.9969174 0 0.07846013 0.9969174 0 0.07845955 0.9969174 0 0.07845896 0.9969174 0 0.07845955 0.9723702 0 0.2334446 0.97237 0 0.2334451 0.97237 0 0.2334456 0.97237 0 0.2334451 0.9238795 0 0.3826837 0.9238796 0 0.3826836 0.9238796 0 0.3826836 0.9238796 0 0.3826836 -0.5224979 0 0.8526406 -0.5224981 0 0.8526404 -0.5224984 0 0.8526403 -0.5224982 0 0.8526405 -0.760407 0 0.6494468 -0.7604067 0 0.6494474 -0.7604063 0 0.6494478 -0.7604067 0 0.6494473 -0.649446 0 0.7604078 -0.6494473 0 0.7604067 -0.6494486 0 0.7604056 -0.6494473 0 0.7604067 -0.9238807 0 0.3826808 -0.9238801 0 0.382682 -0.9238797 0 0.3826833 -0.9238802 0 0.3826821 -0.85264 0 0.5224989 -0.8526404 0 0.5224984 -0.8526407 0 0.5224978 -0.8526404 0 0.5224984 -0.3826846 0 0.9238791 -0.3826846 0 0.9238791 -0.3826846 0 0.9238791 -0.3826846 0 0.9238791 -0.07846487 0 0.9969169 -0.0784625 0 0.9969171 -0.07846015 0 0.9969174 -0.0784625 0 0.9969171 -0.2334455 0 0.9723699 -0.2334449 0 0.97237 -0.2334444 0 0.9723702 -0.2334449 0 0.9723701 -0.2334455 0 -0.97237 -0.2334464 0 -0.9723698 -0.2334473 0 -0.9723696 -0.2334464 0 -0.9723697 -0.07845316 0 -0.9969179 -0.07845148 0 -0.996918 -0.07844978 0 -0.9969181 -0.07845147 0 -0.996918 0.6494483 0 0.7604059 0.6494477 0 0.7604063 0.6494471 0 0.7604069 0.6494477 0 0.7604063 0.07846574 0 0.9969169 0.0784624 0 0.9969172 0.07845903 0 0.9969174 0.0784624 0 0.9969172 0.5224983 0 0.8526405 0.5224983 0 0.8526404 0.5224984 0 0.8526404 0.5224983 0 0.8526404 0.2334463 0 0.9723698 0.2334457 0 0.9723699 0.233445 0 0.9723701 0.2334457 0 0.9723699 0.3826854 0 0.9238788 0.3826845 0 0.9238792 0.3826836 0 0.9238796 0.3826845 0 0.9238792 0.7604092 0 0.6494443 0.7604087 0 0.6494449 0.7604082 0 0.6494456 0.7604087 0 0.649445 -0.9969175 0 -0.07845815 -0.9969174 0 -0.07845849 -0.9969174 0 -0.07845884 -0.9969174 0 -0.07845849 -0.9723693 0 0.2334484 -0.9723696 0 0.2334468 -0.97237 0 0.2334452 -0.9723696 0 0.2334468 -0.9238791 0 -0.3826846 -0.9238794 0 -0.3826841 -0.9238796 0 -0.3826836 -0.9238794 0 -0.3826841 -0.9969176 0 0.07845576 -0.9969175 0 0.0784575 -0.9969174 0 0.07845924 -0.9969175 0 0.0784575 -0.7604086 0 -0.6494449 -0.7604078 0 -0.6494461 -0.7604067 0 -0.6494472 -0.7604077 0 -0.649446 -0.85264 0 -0.5224989 -0.8526402 0 -0.5224986 -0.8526404 0 -0.5224984 -0.8526402 0 -0.5224986 -0.97237 0 -0.2334449 -0.97237 0 -0.2334456 -0.9723697 0 -0.2334463 -0.9723699 0 -0.2334456 0.5224966 0 -0.8526415 0.5224978 0 -0.8526407 0.522499 0 -0.85264 0.5224978 0 -0.8526407 0.07846107 0 -0.9969172 0.07846037 0 -0.9969172 0.07845969 0 -0.9969174 0.07846037 0 -0.9969172 0.3826862 0 -0.9238784 0.3826852 0 -0.9238789 0.3826841 0 -0.9238793 0.3826851 0 -0.9238788 0.9238797 0 -0.3826831 0.9238795 0 -0.3826836 0.9238793 0 -0.3826841 0.9238796 0 -0.3826836 0.6494492 0 -0.760405 0.6494485 0 -0.7604057 0.6494477 0 -0.7604063 0.6494485 0 -0.7604057 0.9723702 0 -0.2334446 0.9723701 0 -0.2334448 0.9723701 0 -0.233445 0.9723701 0 -0.2334448 0.85264 0 -0.5224989 0.8526402 0 -0.5224986 0.8526403 0 -0.5224984 0.8526402 0 -0.5224986 0.2334446 0 -0.9723701 0.2334457 0 -0.9723698 0.2334468 0 -0.9723697 0.2334457 0 -0.9723699 0.7604075 0 -0.6494463 0.7604066 0 -0.6494474 0.7604057 0 -0.6494485 0.7604066 0 -0.6494474</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_piecesShape-texbinormals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_ring_piecesShape-vertices" name="qt_gauge_ring_piecesShape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_ring_piecesShape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_ring_piecesShape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_ring_piecesShape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_ring_piecesShape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="80">
+ <input semantic="VERTEX" source="#qt_gauge_ring_piecesShape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_ring_piecesShape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_ring_piecesShape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_ring_piecesShape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 3 3 3 3 3 3 1 1 1 2 2 2 4 4 4 5 5 5 7 7 7 7 7 7 5 5 5 6 6 6 8 8 8 9 9 9 11 11 11 11 11 11 9 9 9 10 10 10 12 12 12 13 13 13 15 15 15 15 15 15 13 13 13 14 14 14 16 16 16 17 17 17 19 19 19 19 19 19 17 17 17 18 18 18 20 20 20 21 21 21 23 23 23 23 23 23 21 21 21 22 22 22 24 24 24 25 25 25 27 27 27 27 27 27 25 25 25 26 26 26 28 28 28 29 29 29 31 31 31 31 31 31 29 29 29 30 30 30 32 32 32 33 33 33 35 35 35 35 35 35 33 33 33 34 34 34 36 36 36 37 37 37 39 39 39 39 39 39 37 37 37 38 38 38 40 40 40 41 41 41 43 43 43 43 43 43 41 41 41 42 42 42 44 44 44 45 45 45 47 47 47 47 47 47 45 45 45 46 46 46 48 48 48 49 49 49 51 51 51 51 51 51 49 49 49 50 50 50 52 52 52 53 53 53 55 55 55 55 55 55 53 53 53 54 54 54 56 56 56 57 57 57 59 59 59 59 59 59 57 57 57 58 58 58 60 60 60 61 61 61 63 63 63 63 63 63 61 61 61 62 62 62 64 64 64 65 65 65 67 67 67 67 67 67 65 65 65 66 66 66 68 68 68 69 69 69 71 71 71 71 71 71 69 69 69 70 70 70 72 72 72 73 73 73 75 75 75 75 75 75 73 73 73 74 74 74 76 76 76 77 77 77 79 79 79 79 79 79 77 77 77 78 78 78 80 80 80 81 81 81 83 83 83 83 83 83 81 81 81 82 82 82 84 84 84 85 85 85 87 87 87 87 87 87 85 85 85 86 86 86 88 88 88 89 89 89 91 91 91 91 91 91 89 89 89 90 90 90 92 92 92 93 93 93 95 95 95 95 95 95 93 93 93 94 94 94 96 96 96 97 97 97 99 99 99 99 99 99 97 97 97 98 98 98 100 100 100 101 101 101 103 103 103 103 103 103 101 101 101 102 102 102 104 104 104 105 105 105 107 107 107 107 107 107 105 105 105 106 106 106 108 108 108 109 109 109 111 111 111 111 111 111 109 109 109 110 110 110 112 112 112 113 113 113 115 115 115 115 115 115 113 113 113 114 114 114 116 116 116 117 117 117 119 119 119 119 119 119 117 117 117 118 118 118 120 120 120 121 121 121 123 123 123 123 123 123 121 121 121 122 122 122 124 124 124 125 125 125 127 127 127 127 127 127 125 125 125 126 126 126 128 128 128 129 129 129 131 131 131 131 131 131 129 129 129 130 130 130 132 132 132 133 133 133 135 135 135 135 135 135 133 133 133 134 134 134 136 136 136 137 137 137 139 139 139 139 139 139 137 137 137 138 138 138 140 140 140 141 141 141 143 143 143 143 143 143 141 141 141 142 142 142 144 144 144 145 145 145 147 147 147 147 147 147 145 145 145 146 146 146 148 148 148 149 149 149 151 151 151 151 151 151 149 149 149 150 150 150 152 152 152 153 153 153 155 155 155 155 155 155 153 153 153 154 154 154 156 156 156 157 157 157 159 159 159 159 159 159 157 157 157 158 158 158</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_ring_piecesShape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_ring_pieces" name="qt_gauge_ring_pieces" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_ring_piecesShape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_ring_pieces</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_2.dae
new file mode 100644
index 0000000..2240738
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gauge_ring_pieces_2.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:48:29</created>
+ <modified>2018-03-08T09:48:29</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_ring_pieces_Shape2" name="qt_gauge_ring_pieces_Shape2">
+ <mesh>
+ <source id="qt_gauge_ring_pieces_Shape2-positions" name="qt_gauge_ring_pieces_Shape2-positions">
+ <float_array id="qt_gauge_ring_pieces_Shape2-positions-array" count="480">-0.1194324 0 7.625996 0.1194286 0 7.625996 0.1194286 0 11.17093 -0.1194324 0 11.17093 -1.310921 0 7.513424 -1.075001 0 7.550713 -1.629562 0 11.05208 -1.865482 0 11.01477 -2.470133 0 7.215775 -2.242962 0 7.289661 -3.338428 0 10.66109 -3.565599 0 10.58733 -3.56852 0 6.740597 -3.355692 0 6.848961 -4.96509 0 10.00764 -5.177917 0 9.899147 -4.579041 0 6.099297 -4.385798 0 6.239773 -6.469496 0 9.107666 -6.662739 0 8.967327 -5.476809 0 5.307884 -5.307907 0 5.476784 -7.8146 0 7.983475 -7.983501 0 7.814575 -6.239717 0 4.385773 -6.099318 0 4.57909 -8.967283 0 6.662712 -9.107683 0 6.469547 -6.848986 0 3.355747 -6.740545 0 3.568497 -9.899164 0 5.177967 -10.0076 0 4.965065 -7.28961 0 2.243015 -7.215797 0 2.470108 -10.58729 0 3.565575 -10.66111 0 3.338482 -7.550739 0 1.075054 -7.513372 0 1.310898 -11.01473 0 1.865536 -11.0521 0 1.629539 -7.625944 0 -0.1194534 -7.625944 0 0.1194077 -11.17095 0 0.1194077 -11.17095 0 -0.1194534 -7.513372 0 -1.310863 -7.550739 0 -1.07502 -11.0521 0 -1.629585 -11.01473 0 -1.865429 -7.215797 0 -2.470154 -7.28961 0 -2.242908 -10.66111 0 -3.338375 -10.58729 0 -3.56562 -6.740545 0 -3.568462 -6.848986 0 -3.355713 -10.00761 0 -4.965111 -9.899166 0 -5.17786 -6.099318 0 -4.579056 -6.239717 0 -4.385738 -9.107685 0 -6.469481 -8.967285 0 -6.662718 -5.307907 0 -5.47683 -5.476809 0 -5.30785 -7.983503 0 -7.814589 -7.814602 0 -7.983488 -4.385796 0 -6.239706 -4.579039 0 -6.099302 -6.662741 0 -8.967268 -6.469498 0 -9.107672 -3.355692 0 -6.848967 -3.56852 0 -6.74053 -5.177917 0 -9.899153 -4.96509 0 -10.00759 -2.242962 0 -7.289595 -2.470133 0 -7.21578 -3.565599 0 -10.58728 -3.338428 0 -10.66109 -1.075001 0 -7.550718 -1.310921 0 -7.513357 -1.865482 0 -11.01472 -1.629562 0 -11.05208 0.1194305 0 -7.625929 -0.1194305 0 -7.625929 -0.1194305 0 -11.17093 0.1194305 0 -11.17093 1.310921 0 -7.513357 1.075001 0 -7.550718 1.629562 0 -11.05208 1.865482 0 -11.01472 2.470133 0 -7.21578 2.242962 0 -7.289595 3.338428 0 -10.66109 3.565599 0 -10.58728 3.56852 0 -6.74053 3.355692 0 -6.848967 4.96509 0 -10.00759 5.177917 0 -9.899153 4.579041 0 -6.099295 4.385798 0 -6.239698 6.469498 0 -9.107672 6.662739 0 -8.967268 5.476809 0 -5.30793 5.307907 0 -5.47683 7.814606 0 -7.98348 7.983505 0 -7.814581 6.239719 0 -4.385738 6.099319 0 -4.579056 8.967285 0 -6.662718 9.107685 0 -6.469481 6.848988 0 -3.355713 6.740547 0 -3.568462 9.899166 0 -5.17786 10.00761 0 -4.965111 7.289608 0 -2.242901 7.215797 0 -2.470146 10.5873 0 -3.565613 10.66111 0 -3.338367 7.550739 0 -1.07502 7.513374 0 -1.310863 11.01473 0 -1.865421 11.0521 0 -1.629578 7.625942 0 0.1194153 7.625942 0 -0.1194458 11.17095 0 -0.1193733 11.17095 0 0.1194878 7.513374 0 1.310978 7.550739 0 1.074982 11.0521 0 1.629547 11.01473 0 1.865543 7.215797 0 2.470116 7.289608 0 2.243023 10.66111 0 3.33849 10.5873 0 3.565582 6.740543 0 3.568577 6.848984 0 3.355675 10.00761 0 4.965073 9.899166 0 5.177975 6.099316 0 4.579018 6.239716 0 4.385853 9.107685 0 6.469555 8.967285 0 6.66272 5.307905 0 5.476791 5.476807 0 5.307964 7.983501 0 7.81459 7.814602 0 7.98349 4.385794 0 6.2397 4.579037 0 6.099377 6.662735 0 8.96727 6.469494 0 9.107738 3.355688 0 6.848969 3.568516 0 6.740604 5.177914 0 9.89922 4.965086 0 10.0076 2.242958 0 7.289669 2.470129 0 7.215782 3.565596 0 10.58729 3.338425 0 10.66115 1.074997 0 7.55072 1.310917 0 7.513432 1.865477 0 11.01478 1.629557 0 11.05209</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_pieces_Shape2-positions-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_pieces_Shape2-normals" name="qt_gauge_ring_pieces_Shape2-normals">
+ <float_array id="qt_gauge_ring_pieces_Shape2-normals-array" count="480">0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 1 0 0 0.9999998 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_pieces_Shape2-normals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_pieces_Shape2-tangents" name="qt_gauge_ring_pieces_Shape2-tangents">
+ <float_array id="qt_gauge_ring_pieces_Shape2-tangents-array" count="480">0 0 1 -1 0 0 0 0 -1 1 0 0 -0.1561184 0 0.9877383 -0.9876884 0 -0.1564344 0.1562119 0 -0.9877236 0.9876882 0 0.1564354 -0.3092993 0 0.9509647 -0.9510545 0 -0.3090231 0.3088082 0 -0.9511243 0.951058 0 0.3090124 -0.4537345 0 0.8911369 -0.8910099 0 -0.4539838 0.4541656 0 -0.8909173 0.8910024 0 0.4539986 -0.587996 0 0.8088638 -0.80901 0 -0.5877948 0.5876198 0 -0.8091372 0.8090234 0 0.5877764 -0.7071028 0 0.7071108 -0.7071065 0 -0.7071071 0.7071028 0 -0.7071108 0.7071065 0 0.7071071 -0.8091232 0 0.587639 -0.587771 0 -0.8090273 0.8089025 0 -0.5879428 0.5877992 0 0.8090069 -0.8909402 0 0.4541206 -0.454007 0 -0.8909981 0.8910719 0 -0.4538622 0.4539728 0 0.8910155 -0.951025 0 0.3091139 -0.3090172 0 -0.9510565 0.951025 0 -0.3091139 0.3090172 0 0.9510565 -0.98768 0 0.1564872 -0.1564558 0 -0.987685 0.9876962 0 -0.1563846 0.1564138 0 0.9876916 -1 0 0 0 0 -1 1 0 0 0 0 1 -0.98768 0 -0.1564872 0.1564359 0 -0.9876881 0.9876806 0 0.1564833 -0.1564358 0 0.9876881 -0.951086 0 -0.3089261 0.3090173 0 -0.9510564 0.9510872 0 0.3089225 -0.3090172 0 0.9510565 -0.8909402 0 -0.4541206 0.4539905 0 -0.8910065 0.8909402 0 0.4541206 -0.4539905 0 0.8910065 -0.8091232 0 -0.587639 0.587793 0 -0.8090114 0.8090074 0 0.5877984 -0.5877782 0 0.8090221 -0.7072704 0 -0.7069431 0.707113 0 -0.7071006 0.7071028 0 0.7071108 -0.7071017 0 0.7071119 -0.5877975 0 -0.8090081 0.8090166 0 -0.5877858 0.5877975 0 0.8090081 -0.8090166 0 0.5877858 -0.4539754 0 -0.8910142 0.8910066 0 -0.4539903 0.4539754 0 0.8910142 -0.8910066 0 0.4539903 -0.3090249 0 -0.951054 0.9510565 0 -0.3090171 0.3090249 0 0.951054 -0.9510565 0 0.3090171 -0.1564144 0 -0.9876915 0.9876883 0 -0.1564347 0.1564144 0 0.9876915 -0.9876883 0 0.1564347 0 0 -1 1 0 0 0 0 1 -1 0 0 0.1564144 0 -0.9876915 0.9876883 0 0.1564347 -0.1564144 0 0.9876915 -0.9876883 0 -0.1564347 0.3090249 0 -0.951054 0.9510565 0 0.3090171 -0.3090249 0 0.951054 -0.9510565 0 -0.3090171 0.4539754 0 -0.8910142 0.8910066 0 0.4539903 -0.4539754 0 0.8910142 -0.8910066 0 -0.4539903 0.5877975 0 -0.8090081 0.8090176 0 0.5877844 -0.5878013 0 0.8090053 -0.8090178 0 -0.5877841 0.7071028 0 -0.7071108 0.7071001 0 0.7071135 -0.7071068 0 0.7071068 -0.7071003 0 -0.7071132 0.8091232 0 -0.587639 0.5877784 0 0.809022 -0.8090074 0 0.5877984 -0.5877932 0 -0.8090112 0.8909402 0 -0.4541206 0.4539908 0 0.8910064 -0.8909402 0 0.4541206 -0.4539908 0 -0.8910064 0.9510884 0 -0.3089189 0.3090171 0 0.9510565 -0.9510884 0 0.3089189 -0.3090171 0 -0.9510565 0.9876812 0 -0.1564794 0.1564337 0 0.9876885 -0.9876812 0 0.1564794 -0.1564337 0 -0.9876885 1 0 0 0 0 1 -1 0 0 0 0 -1 0.9876969 0 0.1563807 -0.1564358 0 0.9876881 -0.9876969 0 -0.1563807 0.1564358 0 -0.9876881 0.9510274 0 0.3091067 -0.3090171 0 0.9510565 -0.9510274 0 -0.3091067 0.3090171 0 -0.9510565 0.8910719 0 0.4538622 -0.4539903 0 0.8910066 -0.8910719 0 -0.4538622 0.4539903 0 -0.8910066 0.8089025 0 0.5879428 -0.5877853 0 0.809017 -0.8089025 0 -0.5879428 0.5877853 0 -0.809017 0.706951 0 0.7072625 -0.7070971 0 0.7071165 -0.7071068 0 -0.7071068 0.7071071 0 -0.7071065 0.5875779 0 0.8091676 -0.80901 0 0.5877948 -0.5879789 0 -0.8088762 0.8090239 0 -0.5877757 0.4537345 0 0.8911369 -0.8910062 0 0.4539912 -0.4537852 0 -0.8911111 0.8910071 0 -0.4539895 0.3092993 0 0.9509647 -0.9510567 0 0.3090165 -0.3092126 0 -0.9509929 0.9510561 0 -0.3090184 0.1561184 0 0.9877383 -0.9876883 0 0.1564345 -0.1562119 0 -0.9877236 0.9876885 0 -0.1564335</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_pieces_Shape2-tangents-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_pieces_Shape2-binormals" name="qt_gauge_ring_pieces_Shape2-binormals">
+ <float_array id="qt_gauge_ring_pieces_Shape2-binormals-array" count="480">1 0 0 0 0 1 -1 0 0 0 0 -1 0.9877384 0 0.1561184 -0.1564344 0 0.9876884 -0.9877236 0 -0.1562119 0.1564354 0 -0.9876882 0.9509648 0 0.3092993 -0.3090231 0 0.9510546 -0.9511244 0 -0.3088081 0.3090124 0 -0.9510581 0.8911369 0 0.4537345 -0.4539838 0 0.89101 -0.8909173 0 -0.4541656 0.4539986 0 -0.8910024 0.8088638 0 0.5879961 -0.5877948 0 0.80901 -0.8091372 0 -0.5876198 0.5877764 0 -0.8090234 0.7071108 0 0.7071028 -0.7071071 0 0.7071065 -0.7071108 0 -0.7071028 0.7071071 0 -0.7071065 0.587639 0 0.8091233 -0.8090274 0 0.587771 -0.5879428 0 -0.8089026 0.8090069 0 -0.5877992 0.4541206 0 0.8909402 -0.8909981 0 0.454007 -0.4538622 0 -0.8910719 0.8910155 0 -0.4539728 0.3091139 0 0.9510251 -0.9510565 0 0.3090172 -0.3091139 0 -0.9510251 0.9510565 0 -0.3090172 0.1564872 0 0.98768 -0.987685 0 0.1564558 -0.1563846 0 -0.9876962 0.9876917 0 -0.1564138 0 0 1 -1 0 0 0 0 -1 1 0 0 -0.1564872 0 0.98768 -0.9876881 0 -0.1564359 0.1564833 0 -0.9876806 0.9876881 0 0.1564358 -0.3089261 0 0.9510861 -0.9510565 0 -0.3090173 0.3089226 0 -0.9510873 0.9510565 0 0.3090172 -0.4541206 0 0.8909403 -0.8910066 0 -0.4539906 0.4541206 0 -0.8909403 0.8910066 0 0.4539906 -0.587639 0 0.8091233 -0.8090114 0 -0.5877929 0.5877984 0 -0.8090075 0.8090222 0 0.5877782 -0.7069431 0 0.7072704 -0.7071006 0 -0.707113 0.7071108 0 -0.7071028 0.7071119 0 0.7071016 -0.8090081 0 0.5877975 -0.5877858 0 -0.8090166 0.8090081 0 -0.5877975 0.5877858 0 0.8090166 -0.8910143 0 0.4539754 -0.4539904 0 -0.8910067 0.8910143 0 -0.4539754 0.4539904 0 0.8910067 -0.951054 0 0.3090249 -0.3090171 0 -0.9510565 0.951054 0 -0.3090249 0.3090171 0 0.9510565 -0.9876915 0 0.1564144 -0.1564347 0 -0.9876883 0.9876915 0 -0.1564144 0.1564347 0 0.9876883 -1 0 0 0 0 -1 1 0 0 0 0 1 -0.9876915 0 -0.1564144 0.1564347 0 -0.9876883 0.9876915 0 0.1564144 -0.1564347 0 0.9876883 -0.951054 0 -0.3090249 0.3090171 0 -0.9510565 0.951054 0 0.3090249 -0.3090171 0 0.9510565 -0.8910142 0 -0.4539754 0.4539903 0 -0.8910066 0.8910142 0 0.4539754 -0.4539903 0 0.8910066 -0.8090081 0 -0.5877975 0.5877844 0 -0.8090176 0.8090053 0 0.5878013 -0.5877841 0 0.8090178 -0.7071108 0 -0.7071028 0.7071135 0 -0.7071 0.7071068 0 0.7071068 -0.7071133 0 0.7071003 -0.587639 0 -0.8091233 0.8090221 0 -0.5877784 0.5877984 0 0.8090075 -0.8090113 0 0.5877932 -0.4541206 0 -0.8909402 0.8910065 0 -0.4539908 0.4541206 0 0.8909402 -0.8910065 0 0.4539908 -0.3089189 0 -0.9510884 0.9510565 0 -0.3090171 0.3089189 0 0.9510884 -0.9510565 0 0.3090171 -0.1564794 0 -0.9876813 0.9876885 0 -0.1564337 0.1564794 0 0.9876813 -0.9876885 0 0.1564337 0 0 -1 1 0 0 0 0 1 -1 0 0 0.1563807 0 -0.9876969 0.9876881 0 0.1564358 -0.1563807 0 0.9876969 -0.9876881 0 -0.1564358 0.3091066 0 -0.9510274 0.9510565 0 0.3090171 -0.3091066 0 0.9510274 -0.9510565 0 -0.3090171 0.4538622 0 -0.8910719 0.8910066 0 0.4539903 -0.4538622 0 0.8910719 -0.8910066 0 -0.4539903 0.5879428 0 -0.8089026 0.8090169 0 0.5877853 -0.5879428 0 0.8089026 -0.8090169 0 -0.5877853 0.7072625 0 -0.706951 0.7071165 0 0.7070971 -0.7071068 0 0.7071068 -0.7071065 0 -0.7071071 0.8091676 0 -0.5875779 0.5877948 0 0.8090101 -0.8088762 0 0.587979 -0.5877758 0 -0.8090239 0.8911369 0 -0.4537345 0.4539912 0 0.8910062 -0.8911111 0 0.4537852 -0.4539895 0 -0.8910071 0.9509648 0 -0.3092993 0.3090165 0 0.9510568 -0.9509929 0 0.3092126 -0.3090184 0 -0.9510561 0.9877384 0 -0.1561184 0.1564346 0 0.9876884 -0.9877236 0 0.1562119 -0.1564336 0 -0.9876885</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_pieces_Shape2-binormals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_pieces_Shape2-map1" name="qt_gauge_ring_pieces_Shape2-map1">
+ <float_array id="qt_gauge_ring_pieces_Shape2-map1-array" count="320">0.02905467 0.5 0.01017496 0.75 0.05362275 0.5000001 0.03307495 0.75 0.07832773 0.5 0.05777997 0.75 0.1030328 0.5 0.08248496 0.75 0.1277378 0.5000001 0.10719 0.7499999 0.1524428 0.5000002 0.131895 0.7499999 0.1771479 0.5000001 0.1566 0.75 0.2018528 0.5 0.1813051 0.75 0.2265578 0.5 0.2060101 0.75 0.2512629 0.5 0.2307151 0.7499999 0.275968 0.5 0.2554201 0.7500001 0.300673 0.5 0.2801251 0.75 0.3253779 0.5 0.3048302 0.7499999 0.350083 0.5 0.3295352 0.7499999 0.374788 0.5 0.3542402 0.7499999 0.399493 0.5 0.3789452 0.75 0.424198 0.5 0.4036503 0.7499998 0.448903 0.5 0.4283553 0.75 0.4736081 0.5 0.4530603 0.7499998 0.4983131 0.5000002 0.4777653 0.7499999 0.5230181 0.5000002 0.5024703 0.75 0.547723 0.5000001 0.5271753 0.7499999 0.572428 0.5000001 0.5518802 0.7499999 0.5971329 0.5 0.5765852 0.7499998 0.6218381 0.5000001 0.6012903 0.75 0.646543 0.5000002 0.6259952 0.7499998 0.671248 0.5000001 0.6507002 0.75 0.695953 0.5000002 0.6754053 0.7499999 0.720658 0.5 0.7001103 0.75 0.7453629 0.5 0.7248152 0.7500001 0.770068 0.5000001 0.7495202 0.75 0.794773 0.5000001 0.7742252 0.7499998 0.819478 0.5000001 0.7989302 0.7499999 0.8441829 0.5000001 0.8236352 0.75 0.868888 0.5 0.8483401 0.7499999 0.8935929 0.5000002 0.8730452 0.7499998 0.9182979 0.5000002 0.8977501 0.75 0.9430029 0.5000001 0.9224553 0.75 0.9677079 0.5 0.9471601 0.7499999 0.9716688 0.75 0.007905247 0.75 0.009455288 0.5 0.007905247 0.5012408 0.02833499 0.75 0.0322917 0.5 0.05283949 0.75 0.05699673 0.5 0.07754445 0.75 0.08170173 0.5 0.1022495 0.7499999 0.1064068 0.5 0.1269545 0.7499999 0.1311118 0.5 0.1516596 0.75 0.1558168 0.5000001 0.1763646 0.75 0.1805218 0.5000001 0.2010696 0.75 0.2052268 0.5 0.2257746 0.75 0.2299318 0.5 0.2504796 0.75 0.2546369 0.5 0.2751846 0.75 0.2793419 0.5 0.2998897 0.7499999 0.3040469 0.5 0.3245947 0.75 0.3287519 0.5 0.3492997 0.75 0.3534569 0.5000001 0.3740047 0.75 0.378162 0.5 0.3987097 0.75 0.402867 0.5 0.4234148 0.75 0.427572 0.5000001 0.4481198 0.7499999 0.452277 0.5 0.4728248 0.7499999 0.476982 0.5000003 0.4975298 0.75 0.501687 0.5000003 0.5222349 0.75 0.526392 0.5 0.5469397 0.7499998 0.551097 0.5000001 0.5716448 0.75 0.575802 0.5 0.5963497 0.75 0.600507 0.5000001 0.6210547 0.7499999 0.6252121 0.5 0.6457598 0.75 0.6499169 0.5 0.6704648 0.75 0.6746219 0.5000001 0.6951697 0.75 0.6993269 0.5000002 0.7198747 0.7499999 0.724032 0.5000001 0.7445797 0.75 0.7487369 0.5 0.7692848 0.7499999 0.773442 0.5 0.7939897 0.75 0.7981469 0.5 0.8186947 0.75 0.8228519 0.5000001 0.8433996 0.75 0.8475569 0.5000002 0.8681047 0.7499999 0.8722619 0.5 0.8928096 0.75 0.8969669 0.5000001 0.9175147 0.75 0.9216719 0.5000002 0.9422196 0.7499998 0.9463769 0.5000002 0.9669247 0.75 0.9709478 0.5</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_pieces_Shape2-map1-array" count="160" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_pieces_Shape2-textangents">
+ <float_array id="qt_gauge_ring_pieces_Shape2-textangents-array" count="480">-0.9999999 0 0 -0.9993243 0 -0.03675617 -0.9972979 0 -0.07346267 -0.9993243 0 -0.03675617 -0.9877383 0 -0.1561184 -0.9877309 0 -0.1561651 -0.9877235 0 -0.1562119 -0.9877309 0 -0.1561651 -0.9509647 0 -0.3092993 -0.951044 0 -0.3090554 -0.9511232 0 -0.3088115 -0.951044 0 -0.3090554 -0.8911369 0 -0.4537344 -0.8910271 0 -0.45395 -0.8909172 0 -0.4541655 -0.8910271 0 -0.45395 -0.8088658 0 -0.5879931 -0.8090015 0 -0.5878064 -0.8091372 0 -0.5876197 -0.8090015 0 -0.5878064 -0.7071082 0 -0.7071052 -0.707107 0 -0.7071065 -0.7071057 0 -0.7071077 -0.707107 0 -0.7071065 -0.587639 0 -0.8091232 -0.587788 0 -0.8090149 -0.587937 0 -0.8089066 -0.587788 0 -0.8090149 -0.4541205 0 -0.8909402 -0.4539913 0 -0.8910061 -0.4538621 0 -0.8910719 -0.4539913 0 -0.8910061 -0.3091139 0 -0.951025 -0.3091139 0 -0.951025 -0.3091139 0 -0.951025 -0.3091139 0 -0.951025 -0.1564837 0 -0.9876805 -0.1564341 0 -0.9876884 -0.1563846 0 -0.9876962 -0.1564341 0 -0.9876884 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0.1564872 0 -0.98768 0.1564852 0 -0.9876803 0.1564833 0 -0.9876806 0.1564852 0 -0.9876803 0.3089261 0 -0.951086 0.3089243 0 -0.9510866 0.3089225 0 -0.9510872 0.3089243 0 -0.9510866 0.4541237 0 -0.8909386 0.4541221 0 -0.8909393 0.4541205 0 -0.8909402 0.4541221 0 -0.8909393 0.5876418 0 -0.8091211 0.5877172 0 -0.8090663 0.5877926 0 -0.8090115 0.5877172 0 -0.8090663 0.706943 0 -0.7072704 0.707027 0 -0.7071866 0.7071108 0 -0.7071028 0.707027 0 -0.7071866 0.8090143 0 -0.5877889 0.8090112 0 -0.5877932 0.809008 0 -0.5877974 0.8090112 0 -0.5877932 0.8910142 0 -0.4539754 0.8910134 0 -0.453977 0.8910125 0 -0.4539785 0.8910134 0 -0.453977 0.9510561 0 -0.3090181 0.951055 0 -0.3090215 0.9510539 0 -0.3090248 0.951055 0 -0.3090215 0.9876915 0 -0.1564144 0.9876901 0 -0.1564232 0.9876887 0 -0.1564319 0.9876901 0 -0.1564232 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9876904 0 0.1564214 0.9876898 0 0.1564249 0.9876893 0 0.1564284 0.9876898 0 0.1564249 0.951055 0 0.3090215 0.951055 0 0.3090215 0.951055 0 0.3090215 0.951055 0 0.3090215 0.8910077 0 0.453988 0.8910102 0 0.4539833 0.8910125 0 0.4539785 0.8910102 0 0.4539833 0.809008 0 0.5877974 0.8090087 0 0.5877964 0.8090094 0 0.5877955 0.8090087 0 0.5877964 0.7071057 0 0.7071077 0.707105 0 0.7071084 0.7071042 0 0.7071092 0.707105 0 0.7071084 0.587639 0 0.8091232 0.5877144 0 0.8090684 0.5877898 0 0.8090136 0.5877144 0 0.8090684 0.4541174 0 0.8909418 0.454119 0 0.890941 0.4541205 0 0.8909402 0.454119 0 0.890941 0.3089189 0 0.9510883 0.3089206 0 0.9510878 0.3089223 0 0.9510872 0.3089206 0 0.9510878 0.1564864 0 0.9876801 0.1564846 0 0.9876803 0.1564829 0 0.9876806 0.1564846 0 0.9876803 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.1563877 0 0.9876957 -0.1563859 0 0.987696 -0.1563842 0 0.9876962 -0.1563859 0 0.987696 -0.3091134 0 0.9510251 -0.3091134 0 0.9510251 -0.3091134 0 0.9510251 -0.3091134 0 0.9510251 -0.4538621 0 0.8910719 -0.4538621 0 0.8910719 -0.4538621 0 0.8910719 -0.4538621 0 0.8910719 -0.5879455 0 0.8089004 -0.5879398 0 0.8089045 -0.5879341 0 0.8089087 -0.5879398 0 0.8089045 -0.7072675 0 0.706946 -0.7071871 0 0.7070263 -0.7071068 0 0.7071068 -0.7071871 0 0.7070263 -0.8091675 0 0.5875779 -0.809024 0 0.5877756 -0.8088803 0 0.5879732 -0.809024 0 0.5877756 -0.8911369 0 0.4537344 -0.891124 0 0.4537598 -0.891111 0 0.4537852 -0.891124 0 0.4537598 -0.9509625 0 0.309306 -0.9509761 0 0.3092643 -0.9509896 0 0.3092227 -0.9509761 0 0.3092643 -0.9877383 0 0.1561184 -0.9877309 0 0.1561651 -0.9877235 0 0.1562119 -0.9877309 0 0.1561651</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_pieces_Shape2-textangents-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_ring_pieces_Shape2-texbinormals">
+ <float_array id="qt_gauge_ring_pieces_Shape2-texbinormals-array" count="480">0 0 -1 0.03675617 0 -0.9993243 0.07346268 0 -0.9972981 0.03675617 0 -0.9993243 0.1561184 0 -0.9877384 0.1561651 0 -0.987731 0.1562119 0 -0.9877236 0.1561651 0 -0.987731 0.3092993 0 -0.9509649 0.3090554 0 -0.9510441 0.3088115 0 -0.9511234 0.3090554 0 -0.9510441 0.4537345 0 -0.8911369 0.4539501 0 -0.8910272 0.4541656 0 -0.8909174 0.4539501 0 -0.8910272 0.5879932 0 -0.808866 0.5878065 0 -0.8090016 0.5876198 0 -0.8091373 0.5878065 0 -0.8090016 0.7071053 0 -0.7071083 0.7071066 0 -0.7071071 0.7071078 0 -0.7071058 0.7071066 0 -0.7071071 0.8091233 0 -0.587639 0.809015 0 -0.587788 0.8089067 0 -0.5879371 0.809015 0 -0.587788 0.8909403 0 -0.4541206 0.8910062 0 -0.4539914 0.891072 0 -0.4538622 0.8910062 0 -0.4539914 0.9510251 0 -0.3091139 0.9510251 0 -0.3091139 0.9510251 0 -0.3091139 0.9510251 0 -0.3091139 0.9876806 0 -0.1564837 0.9876885 0 -0.1564341 0.9876963 0 -0.1563846 0.9876885 0 -0.1564341 1 0 0 1 0 0 1 0 0 1 0 0 0.9876801 0 0.1564872 0.9876804 0 0.1564852 0.9876807 0 0.1564833 0.9876804 0 0.1564852 0.9510861 0 0.3089261 0.9510866 0 0.3089243 0.9510873 0 0.3089226 0.9510867 0 0.3089243 0.8909386 0 0.4541237 0.8909395 0 0.4541222 0.8909402 0 0.4541206 0.8909395 0 0.4541222 0.8091213 0 0.5876418 0.8090664 0 0.5877172 0.8090116 0 0.5877927 0.8090665 0 0.5877173 0.7072704 0 0.7069431 0.7071866 0 0.707027 0.7071028 0 0.7071108 0.7071866 0 0.707027 0.5877889 0 0.8090144 0.5877932 0 0.8090113 0.5877975 0 0.8090082 0.5877932 0 0.8090113 0.4539754 0 0.8910143 0.453977 0 0.8910134 0.4539786 0 0.8910127 0.453977 0 0.8910134 0.3090182 0 0.9510562 0.3090215 0 0.951055 0.3090249 0 0.951054 0.3090215 0 0.951055 0.1564144 0 0.9876916 0.1564232 0 0.9876902 0.1564319 0 0.9876888 0.1564232 0 0.9876902 0 0 1 0 0 1 0 0 1 0 0 1 -0.1564215 0 0.9876905 -0.1564249 0 0.9876899 -0.1564284 0 0.9876894 -0.1564249 0 0.9876899 -0.3090215 0 0.951055 -0.3090215 0 0.9510551 -0.3090215 0 0.951055 -0.3090215 0 0.9510551 -0.453988 0 0.8910078 -0.4539834 0 0.8910103 -0.4539786 0 0.8910127 -0.4539834 0 0.8910103 -0.5877975 0 0.8090082 -0.5877965 0 0.8090088 -0.5877956 0 0.8090096 -0.5877965 0 0.8090088 -0.7071078 0 0.7071058 -0.7071085 0 0.707105 -0.7071093 0 0.7071043 -0.7071086 0 0.7071051 -0.8091233 0 0.587639 -0.8090685 0 0.5877144 -0.8090137 0 0.5877898 -0.8090685 0 0.5877144 -0.8909419 0 0.4541174 -0.8909411 0 0.454119 -0.8909402 0 0.4541206 -0.8909411 0 0.454119 -0.9510884 0 0.3089189 -0.9510879 0 0.3089206 -0.9510874 0 0.3089223 -0.9510879 0 0.3089206 -0.9876802 0 0.1564864 -0.9876805 0 0.1564846 -0.9876807 0 0.1564829 -0.9876805 0 0.1564846 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9876958 0 -0.1563877 -0.9876961 0 -0.1563859 -0.9876963 0 -0.1563842 -0.9876961 0 -0.1563859 -0.9510252 0 -0.3091134 -0.9510252 0 -0.3091134 -0.9510252 0 -0.3091134 -0.9510252 0 -0.3091134 -0.891072 0 -0.4538622 -0.891072 0 -0.4538622 -0.891072 0 -0.4538622 -0.891072 0 -0.4538622 -0.8089005 0 -0.5879456 -0.8089046 0 -0.5879399 -0.8089088 0 -0.5879342 -0.8089046 0 -0.5879399 -0.706946 0 -0.7072675 -0.7070264 0 -0.7071872 -0.7071068 0 -0.7071068 -0.7070264 0 -0.7071872 -0.5875779 0 -0.8091676 -0.5877756 0 -0.8090241 -0.5879732 0 -0.8088804 -0.5877756 0 -0.809024 -0.4537345 0 -0.8911369 -0.4537599 0 -0.8911241 -0.4537853 0 -0.8911112 -0.4537599 0 -0.8911241 -0.309306 0 -0.9509626 -0.3092643 0 -0.9509761 -0.3092227 0 -0.9509897 -0.3092644 0 -0.9509762 -0.1561184 0 -0.9877384 -0.1561651 0 -0.987731 -0.1562119 0 -0.9877236 -0.1561651 0 -0.987731</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_ring_pieces_Shape2-texbinormals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_ring_pieces_Shape2-vertices" name="qt_gauge_ring_pieces_Shape2-vertices">
+ <input semantic="POSITION" source="#qt_gauge_ring_pieces_Shape2-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_ring_pieces_Shape2-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_ring_pieces_Shape2-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_ring_pieces_Shape2-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="80">
+ <input semantic="VERTEX" source="#qt_gauge_ring_pieces_Shape2-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_ring_pieces_Shape2-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_ring_pieces_Shape2-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_ring_pieces_Shape2-texbinormals" offset="2" set="0"/>
+ <p>1 79 0 0 1 1 2 81 3 2 81 3 0 1 1 3 80 2 5 82 4 4 3 5 6 0 7 6 0 7 4 3 5 7 83 6 9 84 8 8 5 9 10 2 11 10 2 11 8 5 9 11 85 10 13 86 12 12 7 13 14 4 15 14 4 15 12 7 13 15 87 14 17 88 16 16 9 17 18 6 19 18 6 19 16 9 17 19 89 18 21 90 20 20 11 21 22 8 23 22 8 23 20 11 21 23 91 22 25 92 24 24 13 25 26 10 27 26 10 27 24 13 25 27 93 26 29 94 28 28 15 29 30 12 31 30 12 31 28 15 29 31 95 30 33 96 32 32 17 33 34 14 35 34 14 35 32 17 33 35 97 34 37 98 36 36 19 37 38 16 39 38 16 39 36 19 37 39 99 38 41 100 40 40 21 41 42 18 43 42 18 43 40 21 41 43 101 42 45 102 44 44 23 45 46 20 47 46 20 47 44 23 45 47 103 46 49 104 48 48 25 49 50 22 51 50 22 51 48 25 49 51 105 50 53 106 52 52 27 53 54 24 55 54 24 55 52 27 53 55 107 54 57 108 56 56 29 57 58 26 59 58 26 59 56 29 57 59 109 58 61 110 60 60 31 61 62 28 63 62 28 63 60 31 61 63 111 62 65 112 64 64 33 65 66 30 67 66 30 67 64 33 65 67 113 66 69 114 68 68 35 69 70 32 71 70 32 71 68 35 69 71 115 70 73 116 72 72 37 73 74 34 75 74 34 75 72 37 73 75 117 74 77 118 76 76 39 77 78 36 79 78 36 79 76 39 77 79 119 78 81 120 80 80 41 81 82 38 83 82 38 83 80 41 81 83 121 82 85 122 84 84 43 85 86 40 87 86 40 87 84 43 85 87 123 86 89 124 88 88 45 89 90 42 91 90 42 91 88 45 89 91 125 90 93 126 92 92 47 93 94 44 95 94 44 95 92 47 93 95 127 94 97 128 96 96 49 97 98 46 99 98 46 99 96 49 97 99 129 98 101 130 100 100 51 101 102 48 103 102 48 103 100 51 101 103 131 102 105 132 104 104 53 105 106 50 107 106 50 107 104 53 105 107 133 106 109 134 108 108 55 109 110 52 111 110 52 111 108 55 109 111 135 110 113 136 112 112 57 113 114 54 115 114 54 115 112 57 113 115 137 114 117 138 116 116 59 117 118 56 119 118 56 119 116 59 117 119 139 118 121 140 120 120 61 121 122 58 123 122 58 123 120 61 121 123 141 122 125 142 124 124 63 125 126 60 127 126 60 127 124 63 125 127 143 126 129 144 128 128 65 129 130 62 131 130 62 131 128 65 129 131 145 130 133 146 132 132 67 133 134 64 135 134 64 135 132 67 133 135 147 134 137 148 136 136 69 137 138 66 139 138 66 139 136 69 137 139 149 138 141 150 140 140 71 141 142 68 143 142 68 143 140 71 141 143 151 142 145 152 144 144 73 145 146 70 147 146 70 147 144 73 145 147 153 146 149 154 148 148 75 149 150 72 151 150 72 151 148 75 149 151 155 150 153 156 152 152 77 153 154 74 155 154 74 155 152 77 153 155 157 154 157 158 156 156 78 157 158 76 159 158 76 159 156 78 157 159 159 158</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_ring_pieces_Shape2</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_ring_pieces_2" name="qt_gauge_ring_pieces_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_ring_pieces_Shape2">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_ring_pieces_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_1.dae
new file mode 100644
index 0000000..5ebdc97
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:52:29</created>
+ <modified>2018-03-08T09:52:29</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gaugefill_1Shape" name="qt_gaugefill_1Shape">
+ <mesh>
+ <source id="qt_gaugefill_1Shape-positions" name="qt_gaugefill_1Shape-positions">
+ <float_array id="qt_gaugefill_1Shape-positions-array" count="360">-7.625946 0.07193217 0.1194305 -11.17095 0.07193217 0.1194305 -11.0521 0.07193217 1.629562 -7.550741 0.07193217 1.075001 -6.239719 0.07193217 -4.385792 -9.107687 0.07193217 -6.469498 -9.899168 0.07193217 -5.177914 -6.740547 0.07193217 -3.568516 -7.550741 0.07193217 -1.074997 -11.0521 0.07193217 -1.629562 -11.17095 0.07193217 -0.1194305 -7.625946 0.07193217 -0.1194305 -7.289612 0.07193217 -2.242962 -10.66111 0.07193217 -3.338428 -11.01473 0.07193217 -1.865482 -7.513374 0.07193217 -1.310917 -6.848988 0.07193217 -3.35569 -10.00761 0.07193217 -4.965088 -10.5873 0.07193217 -3.565598 -7.215799 0.07193217 -2.470131 4.385796 0.07193217 -6.239716 6.469496 0.07193217 -9.107689 5.177916 0.07193217 -9.89917 3.568518 0.07193217 -6.740547 6.099318 0.07193217 -4.579033 8.967283 0.07193217 -6.662735 7.983503 0.07193217 -7.814598 5.476807 0.07193217 -5.307907 5.307905 0.07193217 -5.476807 7.814604 0.07193217 -7.983498 6.662737 0.07193217 -8.967285 4.579039 0.07193217 -6.099312 7.215796 0.07193217 -2.470123 10.58729 0.07193217 -3.56559 10.0076 0.07193217 -4.965088 6.848986 0.07193217 -3.35569 6.740545 0.07193217 -3.568516 9.899164 0.07193217 -5.177914 9.107683 0.07193217 -6.469498 6.239717 0.07193217 -4.385792 3.35569 0.07193217 -6.848984 4.965088 0.07193217 -10.00761 3.565598 0.07193217 -10.5873 2.470131 0.07193217 -7.215797 1.074999 0.07193217 -7.550735 1.62956 0.07193217 -11.05209 0.1194286 0.07193217 -11.17094 0.1194286 0.07193217 -7.625946 2.24296 0.07193217 -7.289612 3.338427 0.07193217 -10.66111 1.86548 0.07193217 -11.01473 1.310919 0.07193217 -7.513374 -4.579041 0.07193217 -6.099319 -6.662743 0.07193217 -8.967285 -7.814604 0.07193217 -7.983505 -5.307909 0.07193217 -5.476807 -0.1194324 0.07193217 -7.625946 -0.1194324 0.07193217 -11.17094 -1.629564 0.07193217 -11.05209 -1.075003 0.07193217 -7.550735 -3.568521 0.07193217 -6.740547 -5.177919 0.07193217 -9.89917 -6.4695 0.07193217 -9.107689 -4.385798 0.07193217 -6.239723 -1.310923 0.07193217 -7.513374 -1.865484 0.07193217 -11.01473 -3.33843 0.07193217 -10.66111 -2.242964 0.07193217 -7.289612 -2.470135 0.07193217 -7.215797 -3.565601 0.07193217 -10.5873 -4.965092 0.07193217 -10.00761 -3.355694 0.07193217 -6.848984 -5.47681 0.07193217 -5.307903 -7.983505 0.07193217 -7.814606 -8.967287 0.07193217 -6.662735 -6.099319 0.07193217 -4.579033 7.550737 0.07193217 1.075005 11.0521 0.07193217 1.62957 11.17095 0.07193217 0.1194344 7.62594 0.07193217 0.1194382 7.513372 0.07193217 -1.310917 11.01473 0.07193217 -1.865475 10.6611 0.07193217 -3.338421 7.289606 0.07193217 -2.242954 6.848982 0.07193217 3.355698 10.0076 0.07193217 4.965096 10.58729 0.07193217 3.565605 7.215796 0.07193217 2.470139 7.62594 0.07193217 -0.1194229 11.17095 0.07193217 -0.1194267 11.0521 0.07193217 -1.629555 7.550737 0.07193217 -1.074997 5.476805 0.07193217 5.307911 7.9835 0.07193217 7.814613 8.967283 0.07193217 6.662743 6.099314 0.07193217 4.579041 6.239714 0.07193217 4.385799 9.107683 0.07193217 6.469501 9.899164 0.07193217 5.177921 6.740541 0.07193217 3.568523 7.289606 0.07193217 2.24297 10.6611 0.07193217 3.338436 11.01473 0.07193217 1.86549 7.513372 0.07193217 1.310925 -7.215799 0.07193217 2.470131 -10.5873 0.07193217 3.565598 -10.00761 0.07193217 4.965088 -6.848988 0.07193217 3.355694 -7.513374 0.07193217 1.310921 -11.01473 0.07193217 1.865482 -10.66111 0.07193217 3.338428 -7.289612 0.07193217 2.242962 -6.740547 0.07193217 3.56852 -9.899166 0.07193217 5.177914 -9.107685 0.07193217 6.469494 -6.239719 0.07193217 4.385796 -6.099319 0.07193217 4.579037 -8.967285 0.07193217 6.662735 -7.983503 0.07193217 7.814598 -5.47681 0.07193217 5.307907</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_1Shape-positions-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_1Shape-normals" name="qt_gaugefill_1Shape-normals">
+ <float_array id="qt_gaugefill_1Shape-normals-array" count="360">0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_1Shape-normals-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_1Shape-tangents" name="qt_gaugefill_1Shape-tangents">
+ <float_array id="qt_gaugefill_1Shape-tangents-array" count="360">-0.9969173 0 0.07845893 0 0 1 0.9969173 0 -0.07845897 -0.1564348 0 -0.9876883 -0.85264 0 -0.5224989 -0.5877863 0 0.8090163 0.852641 0 0.5224973 0.4539905 0 -0.8910065 -0.9969173 0 -0.07845924 -0.1564359 0 0.9876881 0.9969173 0 0.07845897 0 0 -1 -0.9723703 0 -0.2334437 -0.3090173 0 0.9510564 0.9723699 0 0.2334456 0.1564358 0 -0.9876881 -0.9238791 0 -0.3826845 -0.4539905 0 0.8910065 0.9238795 0 0.3826835 0.3090172 0 -0.9510565 0.5225009 0 -0.8526387 -0.8090176 0 -0.5877844 -0.5224984 0 0.8526403 0.8910066 0 0.4539903 0.7604093 0 -0.6494441 -0.5877858 0 -0.8090166 -0.7604073 0 0.6494465 0.707106 0 0.7071076 0.6494446 0 -0.7604089 -0.7071057 0 -0.7071079 -0.6494481 0 0.7604059 0.8090178 0 0.5877841 0.923881 0 -0.38268 -0.3090171 0 -0.9510565 -0.92388 0 0.3826823 0.4539908 0 0.8910064 0.85264 0 -0.5224989 -0.4539908 0 -0.8910064 -0.852641 0 0.5224973 0.5877865 0 0.8090161 0.3826862 0 -0.9238784 -0.8910066 0 -0.4539903 -0.3826841 0 0.9238793 0.9510565 0 0.3090171 0.07846486 0 -0.9969169 -0.9876883 0 -0.1564347 -0.07845959 0 0.9969173 1 0 0 0.2334446 0 -0.9723701 -0.9510565 0 -0.3090171 -0.233445 0 0.97237 0.9876883 0 0.1564347 -0.6494482 0 -0.7604058 -0.8090166 0 0.5877858 0.6494471 0 0.7604068 0.7071073 0 -0.7071062 -0.07846486 0 -0.9969169 -1 0 0 0.07845959 0 0.9969173 0.9876883 0 -0.1564347 -0.522496 0 -0.8526417 -0.8910066 0 0.4539903 0.5224984 0 0.8526403 0.8090166 0 -0.5877858 -0.2334446 0 -0.9723701 -0.9876883 0 0.1564347 0.233445 0 0.97237 0.9510565 0 -0.3090171 -0.3826862 0 -0.9238784 -0.9510565 0 0.3090171 0.3826841 0 0.9238793 0.8910066 0 -0.4539903 -0.7604086 0 -0.649445 -0.7071079 0 0.7071057 0.7604088 0 0.6494447 0.5877856 0 -0.8090168 0.9969175 0 0.07845727 0.1564358 0 -0.9876881 -0.9969173 0 -0.07845939 0 0 1 0.972369 0 -0.2334493 -0.1564337 0 -0.9876885 -0.9723694 0 0.2334473 0.3090171 0 0.9510565 0.9238784 0 0.3826862 0.4539903 0 -0.8910066 -0.9238793 0 -0.3826841 -0.3090171 0 0.9510565 0.9969175 0 -0.07845664 0 0 -1 -0.9969173 0 0.07845979 0.1564337 0 0.9876885 0.7604086 0 0.649445 0.7071079 0 -0.7071057 -0.7604082 0 -0.6494454 -0.5877853 0 0.809017 0.85264 0 0.5224989 0.5877853 0 -0.809017 -0.8526403 0 -0.5224984 -0.4539903 0 0.8910066 0.9723694 0 0.2334475 0.3090171 0 -0.9510565 -0.9723694 0 -0.2334473 -0.1564358 0 0.9876881 -0.9238797 0 0.3826831 0.3090172 0 0.9510565 0.923879 0 -0.3826846 -0.4539899 0 -0.8910068 -0.9723701 0 0.2334446 0.1564348 0 0.9876883 0.97237 0 -0.233445 -0.3090172 0 -0.9510565 -0.85264 0 0.5224989 0.4539899 0 0.8910068 0.8526403 0 -0.5224984 -0.5877851 0 -0.8090171 -0.7604086 0 0.649445 0.5877851 0 0.8090171 0.7604067 0 -0.6494472 -0.7071065 0 -0.7071071</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_1Shape-tangents-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_1Shape-binormals" name="qt_gaugefill_1Shape-binormals">
+ <float_array id="qt_gaugefill_1Shape-binormals-array" count="360">0.07845894 0 0.9969174 1 0 0 -0.07845896 0 -0.9969174 -0.9876883 0 0.1564348 -0.5224989 0 0.85264 0.8090163 0 0.5877863 0.5224973 0 -0.852641 -0.8910065 0 -0.4539905 -0.07845925 0 0.9969174 0.9876881 0 0.1564359 0.07845896 0 -0.9969174 -1 0 0 -0.2334437 0 0.9723703 0.9510565 0 0.3090173 0.2334456 0 -0.97237 -0.9876882 0 -0.1564358 -0.3826845 0 0.9238791 0.8910065 0 0.4539905 0.3826835 0 -0.9238795 -0.9510565 0 -0.3090172 -0.8526388 0 -0.5225009 -0.5877844 0 0.8090176 0.8526403 0 0.5224984 0.4539904 0 -0.8910067 -0.6494442 0 -0.7604093 -0.8090166 0 0.5877858 0.6494465 0 0.7604073 0.7071076 0 -0.707106 -0.7604089 0 -0.6494446 -0.7071078 0 0.7071057 0.7604059 0 0.6494482 0.5877841 0 -0.8090178 -0.38268 0 -0.923881 -0.9510565 0 0.3090171 0.3826823 0 0.92388 0.8910064 0 -0.4539908 -0.5224989 0 -0.85264 -0.8910064 0 0.4539908 0.5224973 0 0.8526409 0.8090162 0 -0.5877866 -0.9238784 0 -0.3826862 -0.4539904 0 0.8910067 0.9238793 0 0.3826841 0.3090171 0 -0.9510565 -0.9969169 0 -0.07846487 -0.1564347 0 0.9876884 0.9969173 0 0.07845959 0 0 -1 -0.9723701 0 -0.2334446 -0.3090171 0 0.9510565 0.97237 0 0.233445 0.1564347 0 -0.9876883 -0.7604059 0 0.6494483 0.5877858 0 0.8090166 0.7604068 0 -0.6494471 -0.7071063 0 -0.7071074 -0.9969169 0 0.07846487 0 0 1 0.9969174 0 -0.07845959 -0.1564347 0 -0.9876883 -0.8526418 0 0.522496 0.4539904 0 0.8910067 0.8526404 0 -0.5224984 -0.5877858 0 -0.8090166 -0.9723701 0 0.2334446 0.1564347 0 0.9876883 0.97237 0 -0.233445 -0.3090171 0 -0.9510565 -0.9238784 0 0.3826862 0.3090171 0 0.9510565 0.9238793 0 -0.3826841 -0.4539904 0 -0.8910067 -0.649445 0 0.7604087 0.7071057 0 0.7071078 0.6494447 0 -0.7604089 -0.8090168 0 -0.5877855 0.07845727 0 -0.9969175 -0.9876882 0 -0.1564358 -0.0784594 0 0.9969174 1 0 0 -0.2334493 0 -0.9723691 -0.9876885 0 0.1564337 0.2334474 0 0.9723695 0.9510565 0 -0.3090171 0.3826862 0 -0.9238784 -0.8910067 0 -0.4539904 -0.3826841 0 0.9238793 0.9510565 0 0.3090171 -0.07845664 0 -0.9969176 -1 0 0 0.07845978 0 0.9969173 0.9876885 0 -0.1564337 0.6494449 0 -0.7604086 -0.7071057 0 -0.7071078 -0.6494456 0 0.7604082 0.809017 0 0.5877853 0.5224989 0 -0.85264 -0.8090169 0 -0.5877853 -0.5224984 0 0.8526404 0.8910067 0 0.4539904 0.2334475 0 -0.9723695 -0.9510565 0 -0.3090171 -0.2334474 0 0.9723695 0.9876882 0 0.1564358 0.3826831 0 0.9238797 0.9510565 0 -0.3090172 -0.3826846 0 -0.923879 -0.8910068 0 0.4539899 0.2334446 0 0.9723701 0.9876883 0 -0.1564348 -0.233445 0 -0.97237 -0.9510565 0 0.3090172 0.5224989 0 0.85264 0.8910068 0 -0.4539899 -0.5224984 0 -0.8526403 -0.8090171 0 0.5877851 0.649445 0 0.7604087 0.8090171 0 -0.5877851 -0.6494472 0 -0.7604067 -0.7071071 0 0.7071065</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_1Shape-binormals-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_1Shape-map1" name="qt_gaugefill_1Shape-map1">
+ <float_array id="qt_gaugefill_1Shape-map1-array" count="240">0.2504796 0.75 0.2512629 0.5 0.2299318 0.5 0.2307151 0.7499999 0.3492997 0.75 0.350083 0.5 0.3287519 0.5 0.3295352 0.7499999 0.2751846 0.75 0.275968 0.5 0.2546369 0.5 0.2554201 0.7500001 0.2998897 0.7499999 0.300673 0.5 0.2793419 0.5 0.2801251 0.75 0.3245947 0.75 0.3253779 0.5 0.3040469 0.5 0.3048302 0.7499999 0.5963497 0.75 0.5971329 0.5 0.575802 0.5 0.5765852 0.7499998 0.6457598 0.75 0.646543 0.5000002 0.6252121 0.5 0.6259952 0.7499998 0.6210547 0.7499999 0.6218381 0.5000001 0.600507 0.5000001 0.6012903 0.75 0.6951697 0.75 0.695953 0.5000002 0.6746219 0.5000001 0.6754053 0.7499999 0.6704648 0.75 0.671248 0.5000001 0.6499169 0.5 0.6507002 0.75 0.5716448 0.75 0.572428 0.5000001 0.551097 0.5000001 0.5518802 0.7499999 0.5222349 0.75 0.5230181 0.5000002 0.501687 0.5000003 0.5024703 0.75 0.5469397 0.7499998 0.547723 0.5000001 0.526392 0.5 0.5271753 0.7499999 0.3987097 0.75 0.399493 0.5 0.378162 0.5 0.3789452 0.75 0.4975298 0.75 0.4983131 0.5000002 0.476982 0.5000003 0.4777653 0.7499999 0.4234148 0.75 0.424198 0.5 0.402867 0.5 0.4036503 0.7499998 0.4728248 0.7499999 0.4736081 0.5 0.452277 0.5 0.4530603 0.7499998 0.4481198 0.7499999 0.448903 0.5 0.427572 0.5000001 0.4283553 0.75 0.3740047 0.75 0.374788 0.5 0.3534569 0.5000001 0.3542402 0.7499999 0.7692848 0.7499999 0.770068 0.5000001 0.7487369 0.5 0.7495202 0.75 0.7198747 0.7499999 0.720658 0.5 0.6993269 0.5000002 0.7001103 0.75 0.8186947 0.75 0.819478 0.5000001 0.7981469 0.5 0.7989302 0.7499999 0.7445797 0.75 0.7453629 0.5 0.724032 0.5000001 0.7248152 0.7500001 0.8681047 0.7499999 0.868888 0.5 0.8475569 0.5000002 0.8483401 0.7499999 0.8433996 0.75 0.8441829 0.5000001 0.8228519 0.5000001 0.8236352 0.75 0.7939897 0.75 0.794773 0.5000001 0.773442 0.5 0.7742252 0.7499998 0.2010696 0.75 0.2018528 0.5 0.1805218 0.5000001 0.1813051 0.75 0.2257746 0.75 0.2265578 0.5 0.2052268 0.5 0.2060101 0.75 0.1763646 0.75 0.1771479 0.5000001 0.1558168 0.5000001 0.1566 0.75 0.1516596 0.75 0.1524428 0.5000002 0.1311118 0.5 0.131895 0.7499999</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_1Shape-map1-array" count="120" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_1Shape-textangents">
+ <float_array id="qt_gaugefill_1Shape-textangents-array" count="360">-0.0784598 0 -0.9969172 -0.07845937 0 -0.9969172 -0.07845896 0 -0.9969173 -0.07845937 0 -0.9969172 0.5224981 0 -0.8526404 0.5224977 0 -0.8526406 0.5224972 0 -0.8526409 0.5224977 0 -0.8526406 0.07846012 0 -0.9969172 0.07845954 0 -0.9969172 0.07845896 0 -0.9969173 0.07845954 0 -0.9969172 0.2334446 0 -0.9723701 0.233445 0 -0.97237 0.2334456 0 -0.9723698 0.233445 0 -0.97237 0.3826836 0 -0.9238794 0.3826835 0 -0.9238793 0.3826835 0 -0.9238794 0.3826835 0 -0.9238793 0.8526405 0 0.5224978 0.8526404 0 0.5224981 0.8526403 0 0.5224984 0.8526404 0 0.5224981 0.6494467 0 0.7604069 0.6494473 0 0.7604066 0.6494477 0 0.7604062 0.6494473 0 0.7604066 0.7604077 0 0.6494459 0.7604066 0 0.6494472 0.7604055 0 0.6494485 0.7604066 0 0.6494472 0.3826807 0 0.9238806 0.382682 0 0.9238801 0.3826833 0 0.9238795 0.382682 0 0.9238801 0.5224988 0 0.8526399 0.5224983 0 0.8526403 0.5224977 0 0.8526406 0.5224983 0 0.8526403 0.923879 0 0.3826845 0.923879 0 0.3826846 0.923879 0 0.3826846 0.923879 0 0.3826846 0.9969168 0 0.07846486 0.996917 0 0.0784625 0.9969172 0 0.07846014 0.996917 0 0.0784625 0.9723698 0 0.2334454 0.97237 0 0.2334449 0.9723701 0 0.2334444 0.97237 0 0.2334449 0.7604058 0 -0.6494482 0.7604062 0 -0.6494476 0.7604067 0 -0.649447 0.7604062 0 -0.6494476 0.9969168 0 -0.07846573 0.9969169 0 -0.07846238 0.9969173 0 -0.07845903 0.9969169 0 -0.07846238 0.8526403 0 -0.5224982 0.8526403 0 -0.5224983 0.8526403 0 -0.5224984 0.8526403 0 -0.5224983 0.9723697 0 -0.2334463 0.9723698 0 -0.2334456 0.97237 0 -0.2334449 0.9723698 0 -0.2334456 0.9238787 0 -0.3826853 0.923879 0 -0.3826844 0.9238793 0 -0.3826835 0.923879 0 -0.3826844 0.6494442 0 -0.7604091 0.6494449 0 -0.7604086 0.6494455 0 -0.760408 0.6494449 0 -0.7604086 -0.07845814 0 0.9969174 -0.07845849 0 0.9969174 -0.07845883 0 0.9969173 -0.07845849 0 0.9969174 0.2334484 0 0.9723691 0.2334468 0 0.9723696 0.2334452 0 0.9723699 0.2334468 0 0.9723696 -0.3826845 0 0.923879 -0.3826841 0 0.9238793 -0.3826835 0 0.9238793 -0.3826841 0 0.9238793 0.07845576 0 0.9969175 0.0784575 0 0.9969174 0.07845923 0 0.9969173 0.0784575 0 0.9969174 -0.6494449 0 0.7604086 -0.649446 0 0.7604077 -0.6494471 0 0.7604067 -0.649446 0 0.7604077 -0.5224988 0 0.8526399 -0.5224985 0 0.8526401 -0.5224984 0 0.8526403 -0.5224985 0 0.8526401 -0.2334449 0 0.97237 -0.2334455 0 0.9723697 -0.2334462 0 0.9723697 -0.2334455 0 0.9723697 -0.382683 0 -0.9238796 -0.3826835 0 -0.9238793 -0.3826841 0 -0.9238792 -0.3826835 0 -0.9238793 -0.2334446 0 -0.97237 -0.2334448 0 -0.97237 -0.2334449 0 -0.97237 -0.2334448 0 -0.97237 -0.5224988 0 -0.8526399 -0.5224985 0 -0.8526401 -0.5224984 0 -0.8526403 -0.5224985 0 -0.8526401 -0.6494462 0 -0.7604074 -0.6494474 0 -0.7604065 -0.6494484 0 -0.7604055 -0.6494474 0 -0.7604065</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_1Shape-textangents-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_1Shape-texbinormals">
+ <float_array id="qt_gaugefill_1Shape-texbinormals-array" count="360">0.9969173 0 -0.0784598 0.9969174 0 -0.07845939 0.9969174 0 -0.07845896 0.9969174 0 -0.07845939 0.8526405 0 0.5224981 0.8526407 0 0.5224977 0.852641 0 0.5224973 0.8526407 0 0.5224977 0.9969174 0 0.07846013 0.9969174 0 0.07845955 0.9969174 0 0.07845896 0.9969174 0 0.07845955 0.9723702 0 0.2334446 0.97237 0 0.2334451 0.97237 0 0.2334456 0.97237 0 0.2334451 0.9238795 0 0.3826837 0.9238796 0 0.3826836 0.9238796 0 0.3826836 0.9238796 0 0.3826836 -0.5224979 0 0.8526406 -0.5224981 0 0.8526404 -0.5224984 0 0.8526403 -0.5224982 0 0.8526405 -0.760407 0 0.6494468 -0.7604067 0 0.6494474 -0.7604063 0 0.6494478 -0.7604067 0 0.6494473 -0.649446 0 0.7604078 -0.6494473 0 0.7604067 -0.6494486 0 0.7604056 -0.6494473 0 0.7604067 -0.9238807 0 0.3826808 -0.9238801 0 0.382682 -0.9238797 0 0.3826833 -0.9238802 0 0.3826821 -0.85264 0 0.5224989 -0.8526404 0 0.5224984 -0.8526407 0 0.5224978 -0.8526404 0 0.5224984 -0.3826846 0 0.9238791 -0.3826846 0 0.9238791 -0.3826846 0 0.9238791 -0.3826846 0 0.9238791 -0.07846487 0 0.9969169 -0.0784625 0 0.9969171 -0.07846015 0 0.9969174 -0.0784625 0 0.9969171 -0.2334455 0 0.9723699 -0.2334449 0 0.97237 -0.2334444 0 0.9723702 -0.2334449 0 0.9723701 0.6494483 0 0.7604059 0.6494477 0 0.7604063 0.6494471 0 0.7604069 0.6494477 0 0.7604063 0.07846574 0 0.9969169 0.0784624 0 0.9969172 0.07845903 0 0.9969174 0.0784624 0 0.9969172 0.5224983 0 0.8526405 0.5224983 0 0.8526404 0.5224984 0 0.8526404 0.5224983 0 0.8526404 0.2334463 0 0.9723698 0.2334457 0 0.9723699 0.233445 0 0.9723701 0.2334457 0 0.9723699 0.3826854 0 0.9238788 0.3826845 0 0.9238792 0.3826836 0 0.9238796 0.3826845 0 0.9238792 0.7604092 0 0.6494443 0.7604087 0 0.6494449 0.7604082 0 0.6494456 0.7604087 0 0.649445 -0.9969175 0 -0.07845815 -0.9969174 0 -0.07845849 -0.9969174 0 -0.07845884 -0.9969174 0 -0.07845849 -0.9723693 0 0.2334484 -0.9723696 0 0.2334468 -0.97237 0 0.2334452 -0.9723696 0 0.2334468 -0.9238791 0 -0.3826846 -0.9238794 0 -0.3826841 -0.9238796 0 -0.3826836 -0.9238794 0 -0.3826841 -0.9969176 0 0.07845576 -0.9969175 0 0.0784575 -0.9969174 0 0.07845924 -0.9969175 0 0.0784575 -0.7604086 0 -0.6494449 -0.7604078 0 -0.6494461 -0.7604067 0 -0.6494472 -0.7604077 0 -0.649446 -0.85264 0 -0.5224989 -0.8526402 0 -0.5224986 -0.8526404 0 -0.5224984 -0.8526402 0 -0.5224986 -0.97237 0 -0.2334449 -0.97237 0 -0.2334456 -0.9723697 0 -0.2334463 -0.9723699 0 -0.2334456 0.9238797 0 -0.3826831 0.9238795 0 -0.3826836 0.9238793 0 -0.3826841 0.9238796 0 -0.3826836 0.9723702 0 -0.2334446 0.9723701 0 -0.2334448 0.9723701 0 -0.233445 0.9723701 0 -0.2334448 0.85264 0 -0.5224989 0.8526402 0 -0.5224986 0.8526403 0 -0.5224984 0.8526402 0 -0.5224986 0.7604075 0 -0.6494463 0.7604066 0 -0.6494474 0.7604057 0 -0.6494485 0.7604066 0 -0.6494474</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_1Shape-texbinormals-array" count="120" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gaugefill_1Shape-vertices" name="qt_gaugefill_1Shape-vertices">
+ <input semantic="POSITION" source="#qt_gaugefill_1Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gaugefill_1Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gaugefill_1Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gaugefill_1Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="60">
+ <input semantic="VERTEX" source="#qt_gaugefill_1Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gaugefill_1Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gaugefill_1Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gaugefill_1Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 3 3 3 3 3 3 1 1 1 2 2 2 4 4 4 5 5 5 7 7 7 7 7 7 5 5 5 6 6 6 8 8 8 9 9 9 11 11 11 11 11 11 9 9 9 10 10 10 12 12 12 13 13 13 15 15 15 15 15 15 13 13 13 14 14 14 16 16 16 17 17 17 19 19 19 19 19 19 17 17 17 18 18 18 20 20 20 21 21 21 23 23 23 23 23 23 21 21 21 22 22 22 24 24 24 25 25 25 27 27 27 27 27 27 25 25 25 26 26 26 28 28 28 29 29 29 31 31 31 31 31 31 29 29 29 30 30 30 32 32 32 33 33 33 35 35 35 35 35 35 33 33 33 34 34 34 36 36 36 37 37 37 39 39 39 39 39 39 37 37 37 38 38 38 40 40 40 41 41 41 43 43 43 43 43 43 41 41 41 42 42 42 44 44 44 45 45 45 47 47 47 47 47 47 45 45 45 46 46 46 48 48 48 49 49 49 51 51 51 51 51 51 49 49 49 50 50 50 52 52 52 53 53 53 55 55 55 55 55 55 53 53 53 54 54 54 56 56 56 57 57 57 59 59 59 59 59 59 57 57 57 58 58 58 60 60 60 61 61 61 63 63 63 63 63 63 61 61 61 62 62 62 64 64 64 65 65 65 67 67 67 67 67 67 65 65 65 66 66 66 68 68 68 69 69 69 71 71 71 71 71 71 69 69 69 70 70 70 72 72 72 73 73 73 75 75 75 75 75 75 73 73 73 74 74 74 76 76 76 77 77 77 79 79 79 79 79 79 77 77 77 78 78 78 80 80 80 81 81 81 83 83 83 83 83 83 81 81 81 82 82 82 84 84 84 85 85 85 87 87 87 87 87 87 85 85 85 86 86 86 88 88 88 89 89 89 91 91 91 91 91 91 89 89 89 90 90 90 92 92 92 93 93 93 95 95 95 95 95 95 93 93 93 94 94 94 96 96 96 97 97 97 99 99 99 99 99 99 97 97 97 98 98 98 100 100 100 101 101 101 103 103 103 103 103 103 101 101 101 102 102 102 104 104 104 105 105 105 107 107 107 107 107 107 105 105 105 106 106 106 108 108 108 109 109 109 111 111 111 111 111 111 109 109 109 110 110 110 112 112 112 113 113 113 115 115 115 115 115 115 113 113 113 114 114 114 116 116 116 117 117 117 119 119 119 119 119 119 117 117 117 118 118 118</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gaugefill_1Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gaugefill_1" name="qt_gaugefill_1" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gaugefill_1Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gaugefill_1</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_2.dae
new file mode 100644
index 0000000..042a7c4
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_2.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:52:51</created>
+ <modified>2018-03-08T09:52:51</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gaugefill_Shape2" name="qt_gaugefill_Shape2">
+ <mesh>
+ <source id="qt_gaugefill_Shape2-positions" name="qt_gaugefill_Shape2-positions">
+ <float_array id="qt_gaugefill_Shape2-positions-array" count="240">0 0.110488 7.63534 -1.19443 0.110488 7.541335 -2.35945 0.110488 7.26164 -3.466372 0.110488 6.803137 -4.487941 0.110488 6.177119 -5.399002 0.110488 5.399 -6.177121 0.110488 4.48794 -6.803139 0.110488 3.466372 -7.261642 0.110488 2.359449 -7.541337 0.110488 1.19443 -7.635342 0.110488 0 -7.541337 0.110488 -1.194431 -7.261641 0.110488 -2.359452 -6.803139 0.110488 -3.466373 -6.177121 0.110488 -4.487942 -5.399002 0.110488 -5.399004 -4.487941 0.110488 -6.177123 -3.466372 0.110488 -6.803141 -2.359449 0.110488 -7.261644 -1.194429 0.110488 -7.541342 0 0.110488 -7.635344 1.194433 0.110488 -7.541338 2.359453 0.110488 -7.261641 3.466376 0.110488 -6.803141 4.487945 0.110488 -6.177121 5.399006 0.110488 -5.399003 6.177125 0.110488 -4.487941 6.803144 0.110488 -3.466373 7.261646 0.110488 -2.359448 7.541342 0.110488 -1.194429 7.635345 0.110488 0 7.541341 0.110488 1.194432 7.261644 0.110488 2.359455 6.803141 0.110488 3.466378 6.177123 0.110488 4.487946 5.399003 0.110488 5.399007 4.487942 0.110488 6.177126 3.466372 0.110488 6.803145 2.359449 0.110488 7.261646 1.194429 0.110488 7.541343 0 0.110488 11.18034 -1.748991 0.110488 11.04269 -3.454916 0.110488 10.63313 -5.075768 0.110488 9.961756 -6.57164 0.110488 9.045084 -7.905695 0.110488 7.905694 -9.045086 0.110488 6.571639 -9.961758 0.110488 5.075768 -10.63314 0.110488 3.454914 -11.04269 0.110488 1.74899 -11.18034 0.110488 0 -11.04269 0.110488 -1.748993 -10.63314 0.110488 -3.454917 -9.961759 0.110488 -5.07577 -9.045088 0.110488 -6.571642 -7.905697 0.110488 -7.905699 -6.571641 0.110488 -9.045091 -5.075769 0.110488 -9.961761 -3.454916 0.110488 -10.63314 -1.74899 0.110488 -11.0427 0 0.110488 -11.18035 1.748994 0.110488 -11.0427 3.454919 0.110488 -10.63314 5.075773 0.110488 -9.96176 6.571646 0.110488 -9.045088 7.905701 0.110488 -7.905696 9.045093 0.110488 -6.571641 9.961765 0.110488 -5.075768 10.63314 0.110488 -3.454914 11.0427 0.110488 -1.74899 11.18035 0.110488 0 11.0427 0.110488 1.748996 10.63314 0.110488 3.454921 9.961763 0.110488 5.075775 9.045092 0.110488 6.571648 7.9057 0.110488 7.905704 6.571643 0.110488 9.045096 5.07577 0.110488 9.961768 3.454916 0.110488 10.63315 1.748989 0.110488 11.04271</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_Shape2-positions-array" count="80" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_Shape2-normals" name="qt_gaugefill_Shape2-normals">
+ <float_array id="qt_gaugefill_Shape2-normals-array" count="240">0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_Shape2-normals-array" count="80" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_Shape2-tangents" name="qt_gaugefill_Shape2-tangents">
+ <float_array id="qt_gaugefill_Shape2-tangents-array" count="240">0.07845323 0 0.9969178 -0.07845986 0 0.9969173 -0.2334442 0 0.9723702 -0.3826839 0 0.9238794 -0.5224985 0 0.8526402 -0.6494481 0 0.7604059 -0.7604059 0 0.6494481 -0.8526401 0 0.5224987 -0.9238794 0 0.3826837 -0.97237 0 0.2334451 -0.9969173 0 0.0784594 -0.9969173 0 -0.07845953 -0.9723699 0 -0.2334455 -0.9238796 0 -0.3826833 -0.8526402 0 -0.5224985 -0.7604063 0 -0.6494477 -0.6494481 0 -0.7604059 -0.5224985 0 -0.8526402 -0.3826841 0 -0.9238793 -0.233446 0 -0.9723698 -0.07845743 0 -0.9969175 0.07846023 0 -0.9969172 0.233446 0 -0.9723698 0.382682 0 -0.9238801 0.5224992 0 -0.8526398 0.6494476 0 -0.7604063 0.7604064 0 -0.6494475 0.8526398 0 -0.5224991 0.9238798 0 -0.3826828 0.97237 0 -0.2334451 0.9969174 0 -0.07845852 0.9969173 0 0.07845956 0.97237 0 0.2334452 0.9238795 0 0.3826836 0.8526399 0 0.522499 0.7604059 0 0.6494481 0.6494477 0 0.7604063 0.5224991 0 0.8526398 0.3826823 0 0.92388 0.2334456 0 0.9723699 0.0784591 0 -0.9969173 0.2334454 0 -0.9723699 0.3826834 0 -0.9238795 0.5224988 0 -0.85264 0.6494477 0 -0.7604062 0.760406 0 -0.649448 0.85264 0 -0.5224988 0.9238792 0 -0.3826842 0.97237 0 -0.233445 0.9969173 0 -0.0784591 0.9969173 0 0.07845906 0.9723699 0 0.2334455 0.9238796 0 0.3826832 0.8526403 0 0.5224984 0.7604063 0 0.6494476 0.6494482 0 0.7604058 0.5224984 0 0.8526403 0.3826841 0 0.9238793 0.2334453 0 0.9723699 0.07845798 0 0.9969174 -0.07845852 0 0.9969174 -0.2334444 0 0.9723702 -0.3826854 0 0.9238787 -0.5224985 0 0.8526402 -0.6494482 0 0.7604058 -0.7604058 0 0.6494482 -0.8526399 0 0.5224989 -0.9238797 0 0.3826831 -0.9723699 0 0.2334455 -0.9969173 0 0.07845906 -0.9969173 0 -0.07845897 -0.9723698 0 -0.2334459 -0.9238795 0 -0.3826835 -0.8526402 0 -0.5224985 -0.7604058 0 -0.6494482 -0.6494483 0 -0.7604058 -0.5224985 0 -0.8526402 -0.3826834 0 -0.9238795 -0.2334457 0 -0.9723698 -0.07845108 0 -0.996918</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_Shape2-tangents-array" count="80" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_Shape2-binormals" name="qt_gaugefill_Shape2-binormals">
+ <float_array id="qt_gaugefill_Shape2-binormals-array" count="240">0.9969179 0 -0.07845324 0.9969173 0 0.07845986 0.9723702 0 0.2334442 0.9238794 0 0.3826839 0.8526402 0 0.5224985 0.760406 0 0.6494481 0.6494481 0 0.760406 0.5224987 0 0.8526401 0.3826838 0 0.9238795 0.2334451 0 0.9723701 0.0784594 0 0.9969174 -0.07845953 0 0.9969173 -0.2334455 0 0.9723699 -0.3826833 0 0.9238796 -0.5224985 0 0.8526403 -0.6494477 0 0.7604063 -0.760406 0 0.6494481 -0.8526402 0 0.5224985 -0.9238794 0 0.3826841 -0.9723698 0 0.2334461 -0.9969175 0 0.07845743 -0.9969172 0 -0.07846022 -0.9723698 0 -0.233446 -0.9238802 0 -0.3826821 -0.8526398 0 -0.5224992 -0.7604063 0 -0.6494476 -0.6494475 0 -0.7604064 -0.5224991 0 -0.8526398 -0.3826828 0 -0.9238798 -0.2334451 0 -0.9723701 -0.07845853 0 -0.9969175 0.07845956 0 -0.9969173 0.2334452 0 -0.97237 0.3826836 0 -0.9238795 0.522499 0 -0.8526399 0.6494481 0 -0.7604059 0.7604063 0 -0.6494477 0.8526399 0 -0.5224991 0.92388 0 -0.3826823 0.97237 0 -0.2334456 -0.9969174 0 -0.07845911 -0.9723699 0 -0.2334454 -0.9238796 0 -0.3826835 -0.85264 0 -0.5224988 -0.7604063 0 -0.6494477 -0.649448 0 -0.760406 -0.5224988 0 -0.85264 -0.3826842 0 -0.9238793 -0.233445 0 -0.97237 -0.07845911 0 -0.9969174 0.07845906 0 -0.9969174 0.2334455 0 -0.9723699 0.3826832 0 -0.9238796 0.5224984 0 -0.8526404 0.6494476 0 -0.7604063 0.7604058 0 -0.6494482 0.8526404 0 -0.5224984 0.9238793 0 -0.3826841 0.97237 0 -0.2334453 0.9969174 0 -0.07845797 0.9969175 0 0.07845853 0.9723701 0 0.2334443 0.9238787 0 0.3826854 0.8526402 0 0.5224985 0.7604058 0 0.6494482 0.6494482 0 0.7604058 0.5224989 0 0.85264 0.3826831 0 0.9238797 0.2334455 0 0.9723699 0.07845906 0 0.9969174 -0.07845897 0 0.9969174 -0.2334459 0 0.9723698 -0.3826835 0 0.9238796 -0.5224985 0 0.8526402 -0.6494482 0 0.7604058 -0.7604058 0 0.6494483 -0.8526402 0 0.5224985 -0.9238796 0 0.3826834 -0.9723698 0 0.2334457 -0.996918 0 0.07845108</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_Shape2-binormals-array" count="80" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_Shape2-map1" name="qt_gaugefill_Shape2-map1">
+ <float_array id="qt_gaugefill_Shape2-map1-array" count="164">0.007905247 0.75 0.03060471 0.75 0.05530973 0.75 0.08001472 0.75 0.1047198 0.75 0.1294248 0.75 0.1541298 0.75 0.1788348 0.75 0.2035398 0.75 0.2282448 0.75 0.2529499 0.75 0.2776549 0.75 0.3023599 0.75 0.3270649 0.75 0.35177 0.75 0.376475 0.75 0.40118 0.75 0.425885 0.75 0.45059 0.75 0.4752951 0.75 0.5000001 0.75 0.5247051 0.75 0.54941 0.75 0.574115 0.75 0.59882 0.75 0.623525 0.75 0.64823 0.75 0.672935 0.75 0.6976399 0.75 0.722345 0.75 0.7470499 0.75 0.771755 0.75 0.7964599 0.75 0.821165 0.75 0.8458699 0.75 0.870575 0.75 0.8952799 0.75 0.9199849 0.75 0.9446899 0.75 0.9693949 0.75 0.9921362 0.75 0.007905247 0.5 0.03060471 0.5 0.05530973 0.5 0.08001472 0.5 0.1047198 0.5 0.1294248 0.5 0.1541298 0.5 0.1788348 0.5 0.2035398 0.5 0.2282448 0.5 0.2529499 0.5 0.2776549 0.5 0.3023599 0.5 0.3270649 0.5 0.35177 0.5 0.376475 0.5 0.40118 0.5 0.425885 0.5 0.45059 0.5 0.4752951 0.5 0.5000001 0.5 0.5247051 0.5 0.54941 0.5 0.574115 0.5 0.59882 0.5 0.623525 0.5 0.64823 0.5 0.672935 0.5 0.6976399 0.5 0.722345 0.5 0.7470499 0.5 0.771755 0.5 0.7964599 0.5 0.821165 0.5 0.8458699 0.5 0.870575 0.5 0.8952799 0.5 0.9199849 0.5 0.9446899 0.5 0.9693949 0.5 0.9921362 0.5</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_Shape2-map1-array" count="82" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_Shape2-textangents">
+ <float_array id="qt_gaugefill_Shape2-textangents-array" count="480">-0.9832461 0 -0.1822825 -0.991451 0 -0.1304789 -0.9969173 0 -0.0784591 -0.9969172 0 -0.07845948 -0.9426256 0 -0.3338518 -0.9588335 0 -0.283969 -0.991451 0 -0.1304789 -0.9832461 0 -0.1822825 -0.8787941 0 -0.4772011 -0.9026058 0 -0.430468 -0.9588335 0 -0.283969 -0.9426256 0 -0.3338518 -0.7933242 0 -0.6087993 -0.8241534 0 -0.5663666 -0.9026058 0 -0.430468 -0.8787941 0 -0.4772011 -0.6883197 0 -0.7254073 -0.7254075 0 -0.6883197 -0.8241534 0 -0.5663666 -0.7933242 0 -0.6087993 -0.5663669 0 -0.8241532 -0.6087995 0 -0.7933241 -0.7254075 0 -0.6883197 -0.6883197 0 -0.7254073 -0.4304682 0 -0.9026057 -0.4772013 0 -0.878794 -0.6087995 0 -0.7933241 -0.5663669 0 -0.8241532 -0.2839692 0 -0.9588333 -0.3338523 0 -0.9426254 -0.4772013 0 -0.878794 -0.4304682 0 -0.9026057 -0.1304787 0 -0.9914511 -0.1822824 0 -0.9832461 -0.3338523 0 -0.9426254 -0.2839692 0 -0.9588333 0.02622491 0 -0.999656 -0.02622499 0 -0.999656 -0.1822824 0 -0.9832461 -0.1304787 0 -0.9914511 0.1822829 0 -0.9832461 0.1304788 0 -0.9914511 -0.02622499 0 -0.999656 0.02622491 0 -0.999656 0.333852 0 -0.9426255 0.2839694 0 -0.9588333 0.1304788 0 -0.9914511 0.1822829 0 -0.9832461 0.4772008 0 -0.8787943 0.4304677 0 -0.902606 0.2839694 0 -0.9588333 0.333852 0 -0.9426255 0.6087992 0 -0.7933244 0.5663664 0 -0.8241535 0.4304677 0 -0.902606 0.4772008 0 -0.8787943 0.7254072 0 -0.6883199 0.6883195 0 -0.7254076 0.5663664 0 -0.8241535 0.6087992 0 -0.7933244 0.8241534 0 -0.5663667 0.7933241 0 -0.6087995 0.6883195 0 -0.7254076 0.7254072 0 -0.6883199 0.9026058 0 -0.4304682 0.8787942 0 -0.477201 0.7933241 0 -0.6087995 0.8241534 0 -0.5663667 0.9588333 0 -0.2839698 0.9426253 0 -0.3338525 0.8787942 0 -0.477201 0.9026058 0 -0.4304682 0.9914511 0 -0.130478 0.9832461 0 -0.1822825 0.9426253 0 -0.3338525 0.9588333 0 -0.2839698 0.999656 0 0.02622562 0.9996561 0 -0.02622414 0.9832461 0 -0.1822825 0.9914511 0 -0.130478 0.9832461 0 0.1822829 0.9914511 0 0.1304785 0.9996561 0 -0.02622414 0.999656 0 0.02622562 0.9426253 0 0.3338524 0.9588332 0 0.2839699 0.9914511 0 0.1304785 0.9832461 0 0.1822829 0.8787944 0 0.4772007 0.9026058 0 0.4304679 0.9588332 0 0.2839699 0.9426253 0 0.3338524 0.7933241 0 0.6087995 0.8241531 0 0.5663669 0.9026058 0 0.4304679 0.8787944 0 0.4772007 0.6883197 0 0.7254073 0.7254075 0 0.6883196 0.8241531 0 0.5663669 0.7933241 0 0.6087995 0.5663669 0 0.8241532 0.6087995 0 0.7933241 0.7254075 0 0.6883196 0.6883197 0 0.7254073 0.4304677 0 0.902606 0.4772011 0 0.8787941 0.6087995 0 0.7933241 0.5663669 0 0.8241532 0.2839691 0 0.9588334 0.3338518 0 0.9426256 0.4772011 0 0.8787941 0.4304677 0 0.902606 0.1304783 0 0.9914511 0.1822826 0 0.9832461 0.3338518 0 0.9426256 0.2839691 0 0.9588334 -0.02622518 0 0.999656 0.02622471 0 0.999656 0.1822826 0 0.9832461 0.1304783 0 0.9914511 -0.1822829 0 0.9832461 -0.1304789 0 0.991451 0.02622471 0 0.999656 -0.02622518 0 0.999656 -0.3338521 0 0.9426254 -0.2839695 0 0.9588333 -0.1304789 0 0.991451 -0.1822829 0 0.9832461 -0.4772011 0 0.8787941 -0.4304679 0 0.9026058 -0.2839695 0 0.9588333 -0.3338521 0 0.9426254 -0.6087996 0 0.793324 -0.5663669 0 0.8241532 -0.4304679 0 0.9026058 -0.4772011 0 0.8787941 -0.7254074 0 0.6883197 -0.6883197 0 0.7254073 -0.5663669 0 0.8241532 -0.6087996 0 0.793324 -0.8241533 0 0.5663667 -0.7933241 0 0.6087993 -0.6883197 0 0.7254073 -0.7254074 0 0.6883197 -0.902606 0 0.4304676 -0.8787941 0 0.477201 -0.7933241 0 0.6087993 -0.8241533 0 0.5663667 -0.9588334 0 0.2839692 -0.9426256 0 0.3338518 -0.8787941 0 0.477201 -0.902606 0 0.4304676 -0.9914517 0 0.1304741 -0.9832466 0 0.1822802 -0.9426256 0 0.3338518 -0.9588334 0 0.2839692 -0.9969178 0 0.07845323 -0.9969178 0 0.07845215 -0.9832466 0 0.1822802 -0.9914517 0 0.1304741</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_Shape2-textangents-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gaugefill_Shape2-texbinormals">
+ <float_array id="qt_gaugefill_Shape2-texbinormals-array" count="480">0.1822825 0 -0.9832462 0.1304789 0 -0.9914511 0.07845911 0 -0.9969174 0.07845949 0 -0.9969174 0.3338518 0 -0.9426256 0.283969 0 -0.9588335 0.1304789 0 -0.9914511 0.1822825 0 -0.9832462 0.4772011 0 -0.8787942 0.4304681 0 -0.9026059 0.283969 0 -0.9588335 0.3338518 0 -0.9426256 0.6087993 0 -0.7933244 0.5663667 0 -0.8241535 0.4304681 0 -0.9026059 0.4772011 0 -0.8787942 0.7254074 0 -0.6883199 0.6883197 0 -0.7254075 0.5663667 0 -0.8241535 0.6087993 0 -0.7933244 0.8241533 0 -0.5663669 0.7933242 0 -0.6087995 0.6883197 0 -0.7254075 0.7254074 0 -0.6883199 0.9026058 0 -0.4304682 0.8787941 0 -0.4772013 0.7933242 0 -0.6087995 0.8241533 0 -0.5663669 0.9588335 0 -0.2839693 0.9426254 0 -0.3338523 0.8787941 0 -0.4772013 0.9026058 0 -0.4304682 0.9914512 0 -0.1304787 0.9832463 0 -0.1822825 0.9426254 0 -0.3338523 0.9588335 0 -0.2839693 0.9996561 0 0.02622491 0.9996561 0 -0.026225 0.9832463 0 -0.1822825 0.9914512 0 -0.1304787 0.9832462 0 0.1822829 0.9914511 0 0.1304788 0.9996561 0 -0.026225 0.9996561 0 0.02622491 0.9426256 0 0.333852 0.9588335 0 0.2839694 0.9914511 0 0.1304788 0.9832462 0 0.1822829 0.8787943 0 0.4772008 0.902606 0 0.4304677 0.9588335 0 0.2839694 0.9426256 0 0.333852 0.7933244 0 0.6087992 0.8241536 0 0.5663665 0.902606 0 0.4304677 0.8787943 0 0.4772008 0.68832 0 0.7254072 0.7254077 0 0.6883196 0.8241536 0 0.5663665 0.7933244 0 0.6087992 0.5663667 0 0.8241534 0.6087995 0 0.7933242 0.7254077 0 0.6883196 0.68832 0 0.7254072 0.4304682 0 0.9026058 0.477201 0 0.8787942 0.6087995 0 0.7933242 0.5663667 0 0.8241534 0.2839698 0 0.9588333 0.3338525 0 0.9426254 0.477201 0 0.8787942 0.4304682 0 0.9026058 0.130478 0 0.9914512 0.1822825 0 0.9832463 0.3338525 0 0.9426254 0.2839698 0 0.9588333 -0.02622562 0 0.9996561 0.02622414 0 0.9996561 0.1822825 0 0.9832463 0.130478 0 0.9914512 -0.1822829 0 0.9832462 -0.1304785 0 0.9914512 0.02622414 0 0.9996561 -0.02622562 0 0.9996561 -0.3338524 0 0.9426255 -0.2839699 0 0.9588333 -0.1304785 0 0.9914512 -0.1822829 0 0.9832462 -0.4772007 0 0.8787944 -0.430468 0 0.9026059 -0.2839699 0 0.9588333 -0.3338524 0 0.9426255 -0.6087996 0 0.7933242 -0.566367 0 0.8241532 -0.430468 0 0.9026059 -0.4772007 0 0.8787944 -0.7254074 0 0.6883198 -0.6883197 0 0.7254075 -0.566367 0 0.8241532 -0.6087996 0 0.7933242 -0.8241534 0 0.5663669 -0.7933242 0 0.6087995 -0.6883197 0 0.7254075 -0.7254074 0 0.6883198 -0.9026061 0 0.4304678 -0.8787941 0 0.4772011 -0.7933242 0 0.6087995 -0.8241534 0 0.5663669 -0.9588335 0 0.2839691 -0.9426256 0 0.3338518 -0.8787941 0 0.4772011 -0.9026061 0 0.4304678 -0.9914512 0 0.1304784 -0.9832463 0 0.1822826 -0.9426256 0 0.3338518 -0.9588335 0 0.2839691 -0.9996561 0 -0.02622519 -0.9996561 0 0.02622471 -0.9832463 0 0.1822826 -0.9914512 0 0.1304784 -0.9832462 0 -0.182283 -0.9914511 0 -0.1304789 -0.9996561 0 0.02622471 -0.9996561 0 -0.02622519 -0.9426256 0 -0.3338521 -0.9588334 0 -0.2839695 -0.9914511 0 -0.1304789 -0.9832462 0 -0.182283 -0.8787942 0 -0.4772011 -0.902606 0 -0.4304679 -0.9588334 0 -0.2839695 -0.9426256 0 -0.3338521 -0.7933241 0 -0.6087996 -0.8241532 0 -0.5663669 -0.902606 0 -0.4304679 -0.8787942 0 -0.4772011 -0.6883197 0 -0.7254075 -0.7254074 0 -0.6883198 -0.8241532 0 -0.5663669 -0.7933241 0 -0.6087996 -0.5663667 0 -0.8241534 -0.6087994 0 -0.7933242 -0.7254074 0 -0.6883198 -0.6883197 0 -0.7254075 -0.4304676 0 -0.902606 -0.477201 0 -0.8787941 -0.6087994 0 -0.7933242 -0.5663667 0 -0.8241534 -0.2839692 0 -0.9588335 -0.3338518 0 -0.9426256 -0.477201 0 -0.8787941 -0.4304676 0 -0.902606 -0.1304741 0 -0.9914518 -0.1822802 0 -0.9832466 -0.3338518 0 -0.9426256 -0.2839692 0 -0.9588335 -0.07845324 0 -0.9969179 -0.07845216 0 -0.996918 -0.1822802 0 -0.9832466 -0.1304741 0 -0.9914518</float_array>
+ <technique_common>
+ <accessor source="#qt_gaugefill_Shape2-texbinormals-array" count="160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gaugefill_Shape2-vertices" name="qt_gaugefill_Shape2-vertices">
+ <input semantic="POSITION" source="#qt_gaugefill_Shape2-positions"/>
+ <input semantic="NORMAL" source="#qt_gaugefill_Shape2-normals"/>
+ <input semantic="TANGENT" source="#qt_gaugefill_Shape2-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gaugefill_Shape2-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="80">
+ <input semantic="VERTEX" source="#qt_gaugefill_Shape2-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gaugefill_Shape2-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gaugefill_Shape2-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gaugefill_Shape2-texbinormals" offset="2" set="0"/>
+ <p>1 1 0 41 42 1 0 0 3 0 0 3 41 42 1 40 41 2 2 2 4 42 43 5 1 1 7 1 1 7 42 43 5 41 42 6 3 3 8 43 44 9 2 2 11 2 2 11 43 44 9 42 43 10 4 4 12 44 45 13 3 3 15 3 3 15 44 45 13 43 44 14 5 5 16 45 46 17 4 4 19 4 4 19 45 46 17 44 45 18 6 6 20 46 47 21 5 5 23 5 5 23 46 47 21 45 46 22 7 7 24 47 48 25 6 6 27 6 6 27 47 48 25 46 47 26 8 8 28 48 49 29 7 7 31 7 7 31 48 49 29 47 48 30 9 9 32 49 50 33 8 8 35 8 8 35 49 50 33 48 49 34 10 10 36 50 51 37 9 9 39 9 9 39 50 51 37 49 50 38 11 11 40 51 52 41 10 10 43 10 10 43 51 52 41 50 51 42 12 12 44 52 53 45 11 11 47 11 11 47 52 53 45 51 52 46 13 13 48 53 54 49 12 12 51 12 12 51 53 54 49 52 53 50 14 14 52 54 55 53 13 13 55 13 13 55 54 55 53 53 54 54 15 15 56 55 56 57 14 14 59 14 14 59 55 56 57 54 55 58 16 16 60 56 57 61 15 15 63 15 15 63 56 57 61 55 56 62 17 17 64 57 58 65 16 16 67 16 16 67 57 58 65 56 57 66 18 18 68 58 59 69 17 17 71 17 17 71 58 59 69 57 58 70 19 19 72 59 60 73 18 18 75 18 18 75 59 60 73 58 59 74 20 20 76 60 61 77 19 19 79 19 19 79 60 61 77 59 60 78 21 21 80 61 62 81 20 20 83 20 20 83 61 62 81 60 61 82 22 22 84 62 63 85 21 21 87 21 21 87 62 63 85 61 62 86 23 23 88 63 64 89 22 22 91 22 22 91 63 64 89 62 63 90 24 24 92 64 65 93 23 23 95 23 23 95 64 65 93 63 64 94 25 25 96 65 66 97 24 24 99 24 24 99 65 66 97 64 65 98 26 26 100 66 67 101 25 25 103 25 25 103 66 67 101 65 66 102 27 27 104 67 68 105 26 26 107 26 26 107 67 68 105 66 67 106 28 28 108 68 69 109 27 27 111 27 27 111 68 69 109 67 68 110 29 29 112 69 70 113 28 28 115 28 28 115 69 70 113 68 69 114 30 30 116 70 71 117 29 29 119 29 29 119 70 71 117 69 70 118 31 31 120 71 72 121 30 30 123 30 30 123 71 72 121 70 71 122 32 32 124 72 73 125 31 31 127 31 31 127 72 73 125 71 72 126 33 33 128 73 74 129 32 32 131 32 32 131 73 74 129 72 73 130 34 34 132 74 75 133 33 33 135 33 33 135 74 75 133 73 74 134 35 35 136 75 76 137 34 34 139 34 34 139 75 76 137 74 75 138 36 36 140 76 77 141 35 35 143 35 35 143 76 77 141 75 76 142 37 37 144 77 78 145 36 36 147 36 36 147 77 78 145 76 77 146 38 38 148 78 79 149 37 37 151 37 37 151 78 79 149 77 78 150 39 39 152 79 80 153 38 38 155 38 38 155 79 80 153 78 79 154 0 40 156 40 81 157 39 39 159 39 39 159 40 81 157 79 80 158</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gaugefill_Shape2</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gaugefill_2" name="qt_gaugefill_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gaugefill_Shape2">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gaugefill_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_1.dae
new file mode 100644
index 0000000..7d978f1
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:53:11</created>
+ <modified>2018-03-08T09:53:11</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_straightfill_Shape1" name="qt_straightfill_Shape1">
+ <mesh>
+ <source id="qt_straightfill_Shape1-positions" name="qt_straightfill_Shape1-positions">
+ <float_array id="qt_straightfill_Shape1-positions-array" count="66">-12 0 1 -9.6 0 1 -7.2 0 1 -4.8 0 1 -2.4 0 1 0 0 1 2.400001 0 1 4.800001 0 1 7.200001 0 1 9.6 0 1 12 0 1 -12 0 -1 -9.6 0 -1 -7.2 0 -1 -4.8 0 -1 -2.4 0 -1 0 0 -1 2.400001 0 -1 4.800001 0 -1 7.200001 0 -1 9.6 0 -1 12 0 -1</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape1-positions-array" count="22" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape1-normals" name="qt_straightfill_Shape1-normals">
+ <float_array id="qt_straightfill_Shape1-normals-array" count="66">0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape1-normals-array" count="22" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape1-tangents" name="qt_straightfill_Shape1-tangents">
+ <float_array id="qt_straightfill_Shape1-tangents-array" count="66">1 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape1-tangents-array" count="22" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape1-binormals" name="qt_straightfill_Shape1-binormals">
+ <float_array id="qt_straightfill_Shape1-binormals-array" count="66">0 0 -1 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape1-binormals-array" count="22" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape1-map1" name="qt_straightfill_Shape1-map1">
+ <float_array id="qt_straightfill_Shape1-map1-array" count="44">0.005893201 0 0.1047146 0 0.2035359 0 0.3023573 0 0.4011786 0 0.5 0 0.5988214 0 0.6976427 0 0.7964641 0 0.8952855 0 0.9941068 0 0.005893201 0.08333334 0.1047146 0.08333334 0.2035359 0.08333334 0.3023573 0.08333334 0.4011786 0.08333334 0.5 0.08333334 0.5988214 0.08333334 0.6976427 0.08333334 0.7964641 0.08333334 0.8952855 0.08333334 0.9941068 0.08333334</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape1-map1-array" count="22" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape1-textangents">
+ <float_array id="qt_straightfill_Shape1-textangents-array" count="120">0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape1-textangents-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape1-texbinormals">
+ <float_array id="qt_straightfill_Shape1-texbinormals-array" count="120">0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape1-texbinormals-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_straightfill_Shape1-vertices" name="qt_straightfill_Shape1-vertices">
+ <input semantic="POSITION" source="#qt_straightfill_Shape1-positions"/>
+ <input semantic="NORMAL" source="#qt_straightfill_Shape1-normals"/>
+ <input semantic="TANGENT" source="#qt_straightfill_Shape1-tangents"/>
+ <input semantic="BINORMAL" source="#qt_straightfill_Shape1-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="20">
+ <input semantic="VERTEX" source="#qt_straightfill_Shape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_straightfill_Shape1-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_straightfill_Shape1-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_straightfill_Shape1-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 11 11 3 11 11 3 1 1 1 12 12 2 1 1 4 2 2 5 12 12 7 12 12 7 2 2 5 13 13 6 2 2 8 3 3 9 13 13 11 13 13 11 3 3 9 14 14 10 3 3 12 4 4 13 14 14 15 14 14 15 4 4 13 15 15 14 4 4 16 5 5 17 15 15 19 15 15 19 5 5 17 16 16 18 5 5 20 6 6 21 16 16 23 16 16 23 6 6 21 17 17 22 6 6 24 7 7 25 17 17 27 17 17 27 7 7 25 18 18 26 7 7 28 8 8 29 18 18 31 18 18 31 8 8 29 19 19 30 8 8 32 9 9 33 19 19 35 19 19 35 9 9 33 20 20 34 9 9 36 10 10 37 20 20 39 20 20 39 10 10 37 21 21 38</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_straightfill_Shape1</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_straightfill_1" name="qt_straightfill_1" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_straightfill_Shape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_straightfill_1</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_2.dae
new file mode 100644
index 0000000..52e8ffa
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Other/gaugefill_straight_2.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:53:27</created>
+ <modified>2018-03-08T09:53:27</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_straightfill_Shape2" name="qt_straightfill_Shape2">
+ <mesh>
+ <source id="qt_straightfill_Shape2-positions" name="qt_straightfill_Shape2-positions">
+ <float_array id="qt_straightfill_Shape2-positions-array" count="120">-12 0 2 12 0 2 -12 0 -2 12 0 -2 -9.360024 0 2 -9.839976 0 2 -9.839976 0 -2 -9.360024 0 -2 -6.960024 0 2 -7.439976 0 2 -7.439976 0 -2 -6.960024 0 -2 -4.560024 0 2 -5.039976 0 2 -5.039976 0 -2 -4.560024 0 -2 -2.160024 0 2 -2.639976 0 2 -2.639976 0 -2 -2.160024 0 -2 0.239976 0 2 -0.239976 0 2 -0.239976 0 -2 0.239976 0 -2 2.639977 0 2 2.160025 0 2 2.160025 0 -2 2.639977 0 -2 5.039977 0 2 4.560025 0 2 4.560025 0 -2 5.039977 0 -2 7.439977 0 2 6.960025 0 2 6.960025 0 -2 7.439977 0 -2 9.839976 0 2 9.360024 0 2 9.360024 0 -2 9.839976 0 -2</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape2-positions-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape2-normals" name="qt_straightfill_Shape2-normals">
+ <float_array id="qt_straightfill_Shape2-normals-array" count="120">0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape2-normals-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape2-tangents" name="qt_straightfill_Shape2-tangents">
+ <float_array id="qt_straightfill_Shape2-tangents-array" count="120">1 0 0 0 0 -1 0 0 1 -1 0 0 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape2-tangents-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape2-binormals" name="qt_straightfill_Shape2-binormals">
+ <float_array id="qt_straightfill_Shape2-binormals-array" count="120">0 0 -1 -1 0 0 1 0 0 0 0 1 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0 0 0 -1 -1 0 0 0 0 1 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape2-binormals-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape2-map1" name="qt_straightfill_Shape2-map1">
+ <float_array id="qt_straightfill_Shape2-map1-array" count="80">0.005893201 0 0.0948334 0.08333334 0.005893201 0.08333334 0.1145957 0 0.1936548 0.08333334 0.2134171 0 0.2924761 0.08333334 0.3122385 0 0.3912975 0.08333334 0.4110598 0 0.4901188 0.08333334 0.5098811 0 0.5889403 0.08333334 0.6087025 0 0.6877616 0.08333334 0.7075239 0 0.7865829 0.08333334 0.8063452 0 0.8854043 0.08333334 0.9051666 0 0.9941068 0 0.9941068 0.08333334 0.09483339 0 0.1145957 0.08333334 0.1936548 0 0.2134171 0.08333334 0.2924761 0 0.3122384 0.08333334 0.3912975 0 0.4110598 0.08333334 0.4901188 0 0.5098811 0.08333334 0.5889403 0 0.6087025 0.08333334 0.6877616 0 0.7075239 0.08333334 0.7865829 0 0.8063452 0.08333334 0.8854043 0 0.9051666 0.08333334</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape2-map1-array" count="40" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape2-textangents">
+ <float_array id="qt_straightfill_Shape2-textangents-array" count="120">0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape2-textangents-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_straightfill_Shape2-texbinormals">
+ <float_array id="qt_straightfill_Shape2-texbinormals-array" count="120">0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1</float_array>
+ <technique_common>
+ <accessor source="#qt_straightfill_Shape2-texbinormals-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_straightfill_Shape2-vertices" name="qt_straightfill_Shape2-vertices">
+ <input semantic="POSITION" source="#qt_straightfill_Shape2-positions"/>
+ <input semantic="NORMAL" source="#qt_straightfill_Shape2-normals"/>
+ <input semantic="TANGENT" source="#qt_straightfill_Shape2-tangents"/>
+ <input semantic="BINORMAL" source="#qt_straightfill_Shape2-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="20">
+ <input semantic="VERTEX" source="#qt_straightfill_Shape2-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_straightfill_Shape2-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_straightfill_Shape2-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_straightfill_Shape2-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 5 22 1 2 2 3 2 2 3 5 22 1 6 1 2 7 23 4 4 3 5 10 4 7 10 4 7 4 3 5 9 24 6 11 25 8 8 5 9 14 6 11 14 6 11 8 5 9 13 26 10 15 27 12 12 7 13 18 8 15 18 8 15 12 7 13 17 28 14 19 29 16 16 9 17 22 10 19 22 10 19 16 9 17 21 30 18 23 31 20 20 11 21 26 12 23 26 12 23 20 11 21 25 32 22 27 33 24 24 13 25 30 14 27 30 14 27 24 13 25 29 34 26 31 35 28 28 15 29 34 16 31 34 16 31 28 15 29 33 36 30 35 37 32 32 17 33 38 18 35 38 18 35 32 17 33 37 38 34 39 39 36 36 19 37 3 21 39 3 21 39 36 19 37 1 20 38</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_straightfill_Shape2</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_straightfill_2" name="qt_straightfill_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_straightfill_Shape2">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_straightfill_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_120_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_120_1.dae
new file mode 100644
index 0000000..5271b10
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_120_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:31:27</created>
+ <modified>2018-03-08T09:31:27</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_120Shape" name="qt_gauge_tickmarks_120Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_120Shape-positions" name="qt_gauge_tickmarks_120Shape-positions">
+ <float_array id="qt_gauge_tickmarks_120Shape-positions-array" count="816">5.703898 0 -7.609445 5.862569 0 -7.487691 6.31266 0 -8.402798 6.471331 0 -8.281044 5.19477 0 -7.966229 5.361064 0 -7.855116 5.75034 0 -8.7977 5.916635 0 -8.686584 4.663397 0 -8.288952 4.836603 0 -8.188951 5.163397 0 -9.154977 5.336602 0 -9.054977 -7.843404 0 5.349353 -7.954519 0 5.183059 -8.674874 0 5.904922 -8.785988 0 5.738629 4.112055 0 -8.57623 4.29143 0 -8.487774 4.554344 0 -9.473103 4.733719 0 -9.384645 3.543105 0 -8.826836 3.72788 0 -8.750298 3.925788 0 -9.750715 4.110564 0 -9.674177 2.958982 0 -9.039691 3.148368 0 -8.975404 3.280422 0 -9.986622 3.469808 0 -9.922334 -8.963692 0 3.136657 -9.02798 0 2.947271 -9.910622 0 3.458097 -9.97491 0 3.268711 -8.476063 0 4.279719 -8.56452 0 4.100345 -9.372934 0 4.722008 -9.461392 0 4.542633 -8.738586 0 3.716169 -8.815124 0 3.531393 -9.662468 0 4.098852 -9.739002 0 3.914077 -7.475981 0 5.850858 -7.597733 0 5.692187 -8.269335 0 6.45962 -8.391087 0 6.300948 -7.076544 0 6.327258 -7.208413 0 6.176889 -7.828383 0 6.986603 -7.960253 0 6.836236 -6.646804 0 6.776514 -6.788225 0 6.635092 -7.35391 0 7.483621 -7.495332 0 7.342199 -6.338969 0 -7.088254 -6.188601 0 -7.220124 -6.998315 0 -7.840095 -6.847947 0 -7.971965 -6.788225 0 -6.658514 -6.646804 0 -6.799936 -7.495332 0 -7.365621 -7.35391 0 -7.507043 -7.208413 0 -6.200313 -7.076544 0 -6.35068 -7.960252 0 -6.859658 -7.828383 0 -7.010026 -7.597733 0 -5.71561 -7.475981 0 -5.87428 -8.391087 0 -6.32437 -8.269334 0 -6.483043 8.5 0 -0.111711 8.5 0 0.08828878 9.5 0 -0.111711 9.5 0 0.08828974 9.5 0 -0.111711 9.5 0 0.08828974 10.5 0 -0.1117115 10.5 0 0.08828926 -9.150414 0 2.543662 -9.202177 0 2.350477 -10.11634 0 2.802481 -10.1681 0 2.609296 -8.177242 0 4.824891 -8.277241 0 4.651687 -9.043267 0 5.324892 -9.143267 0 5.151687 -7.411216 0 -4.175109 -7.311216 0 -4.348313 -8.277242 0 -4.675109 -8.177241 0 -4.848313 -5.939697 0 6.069407 -6.081118 0 5.927986 -6.646804 0 6.776514 -6.788225 0 6.635092 -8.414228 0 1.196905 -8.440334 0 0.9986165 -9.405674 0 1.327432 -9.431779 0 1.129143 -9.47312 0 0.709404 -9.4862 0 0.5098324 -10.47098 0 0.7748079 -10.48406 0 0.5752354 -9.405674 0 1.327432 -9.431779 0 1.129143 -10.39712 0 1.457959 -10.42322 0 1.259669 -9.297952 0 1.939726 -9.336969 0 1.743568 -10.27874 0 2.134816 -10.31775 0 1.93866 -8.815125 0 -3.554816 -8.738588 0 -3.739592 -9.739003 0 -3.937499 -9.662466 0 -4.122274 8.476063 0 -4.303141 8.56452 0 -4.123766 9.372934 0 -4.745429 9.461391 0 -4.566054 8.177241 0 -4.848313 8.277242 0 -4.675109 9.043266 0 -5.348313 9.143267 0 -5.175108 7.843405 0 -5.372776 7.954518 0 -5.206481 8.674873 0 -5.928345 8.785988 0 -5.762052 -3.148368 0 -8.975404 -2.958982 0 -9.039691 -3.469808 0 -9.922334 -3.280422 0 -9.986622 -3.72788 0 -8.750298 -3.543105 0 -8.826836 -4.110564 0 -9.674177 -3.925788 0 -9.750715 -4.29143 0 -8.487774 -4.112055 0 -8.57623 -4.733719 0 -9.384645 -4.554344 0 -9.473103 -7.954518 0 -5.206481 -7.843405 0 -5.372776 -8.785988 0 -5.762052 -8.674873 0 -5.928345 -8.277242 0 -4.675109 -8.177241 0 -4.848313 -9.143267 0 -5.175108 -9.043266 0 -5.348313 -8.56452 0 -4.123766 -8.476063 0 -4.303141 -9.461391 0 -4.566054 -9.372934 0 -4.745429 2.362188 0 -9.213887 2.555374 0 -9.162126 2.621007 0 -10.17981 2.814192 0 -10.12805 1.75528 0 -9.34868 1.951437 0 -9.309661 1.95037 0 -10.32947 2.146527 0 -10.29045 1.140854 0 -9.44349 1.339143 0 -9.417385 1.27138 0 -10.43493 1.469669 0 -10.40883 -9.4862 0 -0.5332541 -9.47312 0 -0.7328262 -10.48406 0 -0.5986571 -10.47098 0 -0.7982297 -9.5 0 0.08828974 -9.5 0 -0.111711 -10.5 0 0.08828926 -10.5 0 -0.1117115 -9.431779 0 -1.152565 -9.405673 0 -1.350854 -10.42322 0 -1.283091 -10.39712 0 -1.481381 -9.02798 0 -2.970693 -8.963692 0 -3.160079 -9.974911 0 -3.292132 -9.910623 0 -3.481518 6.682627 0 -5.265518 6.804379 0 -5.106848 7.475981 0 -5.87428 7.597733 0 -5.71561 2.103369 0 -8.247963 2.296554 0 -8.196199 2.362188 0 -9.213887 2.555374 0 -9.162126 -3.345197 0 -7.826418 -3.160421 0 -7.902956 -3.72788 0 -8.750298 -3.543105 0 -8.826836 -1.339143 0 -9.417385 -1.140854 0 -9.44349 -1.469669 0 -10.40883 -1.27138 0 -10.43493 -1.951437 0 -9.309661 -1.75528 0 -9.34868 -2.146527 0 -10.29045 -1.95037 0 -10.32947 -2.555374 0 -9.162126 -2.362188 0 -9.213887 -2.814192 0 -10.12805 -2.621007 0 -10.17981 7.475981 0 -5.87428 7.597733 0 -5.71561 8.269334 0 -6.483043 8.391087 0 -6.32437 7.076544 0 -6.35068 7.208413 0 -6.200313 7.828383 0 -7.010026 7.960252 0 -6.859658 6.646804 0 -6.799936 6.788225 0 -6.658514 7.35391 0 -7.507043 7.495332 0 -7.365621 6.188601 0 -7.220124 6.338969 0 -7.088254 6.847947 0 -7.971965 6.998315 0 -7.840095 9.47312 0 -0.7328262 9.4862 0 -0.5332541 10.47098 0 -0.7982297 10.48406 0 -0.5986571 9.405673 0 -1.350854 9.431779 0 -1.152565 10.39712 0 -1.481381 10.42322 0 -1.283091 9.297951 0 -1.963147 9.336969 0 -1.766991 10.27874 0 -2.158238 10.31775 0 -1.962081 9.150414 0 -2.567084 9.202177 0 -2.373899 10.11634 0 -2.825904 10.1681 0 -2.632719 8.963692 0 -3.160079 9.02798 0 -2.970693 9.910623 0 -3.481518 9.974911 0 -3.292132 8.738588 0 -3.739592 8.815125 0 -3.554816 9.662466 0 -4.122274 9.739003 0 -3.937499 -9.202177 0 -2.373899 -9.150414 0 -2.567084 -10.1681 0 -2.632719 -10.11634 0 -2.825904 -9.336969 0 -1.766991 -9.297951 0 -1.963147 -10.31775 0 -1.962081 -10.27874 0 -2.158238 0.5215439 0 -9.497911 0.7211156 0 -9.484831 0.586947 0 -10.49577 0.7865188 0 -10.48269 -0.1 0 -9.511711 0.1 0 -9.511711 -0.1 0 -10.51171 0.1 0 -10.51171 -0.7211156 0 -9.484831 -0.5215439 0 -9.497911 -0.7865188 0 -10.48269 -0.586947 0 -10.49577 -4.836603 0 -8.188951 -4.663397 0 -8.288952 -5.336602 0 -9.054977 -5.163397 0 -9.154977 -5.361064 0 -7.855116 -5.19477 0 -7.966229 -5.916635 0 -8.686584 -5.75034 0 -8.7977 -5.862569 0 -7.487691 -5.703898 0 -7.609445 -6.471331 0 -8.281044 -6.31266 0 -8.402798</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_120Shape-positions-array" count="272" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_120Shape-normals" name="qt_gauge_tickmarks_120Shape-normals">
+ <float_array id="qt_gauge_tickmarks_120Shape-normals-array" count="816">0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_120Shape-normals-array" count="272" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_120Shape-tangents" name="qt_gauge_tickmarks_120Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_120Shape-tangents-array" count="816">0.7933531 0 0.6087618 0.6087664 0 -0.7933495 -0.6087664 0 0.7933495 -0.7933531 0 -0.6087618 0.8314699 0 0.5555699 0.5555665 0 -0.8314721 -0.5555747 0 0.8314666 -0.8314691 0 -0.555571 0.8660253 0 0.5000002 0.5000008 0 -0.8660249 -0.4999982 0 0.8660264 -0.8660257 0 -0.4999994 -0.5555694 0 -0.8314702 -0.8314659 0 0.5555758 0.8314703 0 -0.5555692 0.5555703 0 0.8314696 0.8968724 0 0.4422893 0.4422811 0 -0.8968765 -0.4422859 0 0.8968741 -0.8968724 0 -0.4422893 0.9238795 0 0.3826835 0.3826895 0 -0.923877 -0.3826891 0 0.9238772 -0.9238794 0 -0.3826837 0.9469301 0 0.3214397 0.3214358 0 -0.9469314 -0.3214408 0 0.9469297 -0.9469301 0 -0.3214396 -0.32144 0 -0.94693 -0.9469296 0 0.3214411 0.9469297 0 -0.3214408 0.3214398 0 0.94693 -0.4422889 0 -0.8968726 -0.8968741 0 0.4422859 0.8968722 0 -0.4422897 0.4422885 0 0.8968728 -0.3826824 0 -0.92388 -0.9238787 0 0.3826855 0.923883 0 -0.3826749 0.3826842 0 0.9238792 -0.6087613 0 -0.7933534 -0.793355 0 0.6087593 0.7933568 0 -0.608757 0.6087607 0 0.7933539 -0.6593455 0 -0.7518401 -0.751841 0 0.6593444 0.7518389 0 -0.6593468 0.6593461 0 0.7518396 -0.707107 0 -0.7071065 -0.7071092 0 0.7071044 0.707108 0 -0.7071056 0.7071068 0 0.7071068 0.7518402 0 -0.6593454 -0.6593458 0 -0.7518398 0.659347 0 0.7518388 -0.75184 0 0.6593456 0.7071068 0 -0.7071068 -0.7071115 0 -0.707102 0.7071104 0 0.7071032 -0.707107 0 0.7071065 0.6593457 0 -0.7518399 -0.7518379 0 -0.659348 0.7518434 0 0.6593417 -0.6593461 0 0.7518396 0.6087612 0 -0.7933535 -0.7933518 0 -0.6087634 0.7933553 0 0.6087588 -0.6087624 0 0.7933526 0 0 1 1 0 0 -1 0 0 0 0 -1 0 0 1 1 0 0 -1 0 0 0 0 -1 -0.2588192 0 -0.9659258 -0.9659261 0 0.2588182 0.9659274 0 -0.2588131 0.258819 0 0.9659258 -0.5000005 0 -0.8660251 -0.8660279 0 0.4999957 0.8660264 0 -0.4999982 0.4999998 0 0.8660255 0.4999998 0 -0.8660255 -0.8660248 0 -0.5000011 0.8660232 0 0.5000039 -0.4999996 0 0.8660256 -0.7071068 0 -0.7071068 -0.7071092 0 0.7071044 0.7071092 0 -0.7071044 0.7071063 0 0.7071073 -0.1305267 0 -0.9914448 -0.9914444 0 0.1305294 0.9914451 0 -0.1305247 0.1305268 0 0.9914448 -0.06540399 0 -0.9978589 -0.9978589 0 0.06540304 0.9978589 0 -0.06540273 0.06540304 0 0.9978589 -0.1305272 0 -0.9914447 -0.9914451 0 0.1305247 0.9914439 0 -0.1305331 0.1305255 0 0.991445 -0.1950907 0 -0.9807852 -0.9807857 0 0.1950883 0.9807846 0 -0.1950936 0.1950912 0 0.9807851 0.382683 0 -0.9238797 -0.9238805 0 -0.382681 0.9238787 0 0.3826855 -0.3826831 0 0.9238797 0.4422889 0 0.8968726 0.8968741 0 -0.4422859 -0.8968741 0 0.4422859 -0.4422889 0 -0.8968726 0.5000005 0 0.8660251 0.8660232 0 -0.5000039 -0.8660249 0 0.5000008 -0.4999995 0 -0.8660257 0.55557 0 0.8314698 0.8314725 0 -0.5555659 -0.8314674 0 0.5555736 -0.5555709 0 -0.8314692 0.9469301 0 -0.3214396 -0.3214358 0 -0.9469314 0.3214408 0 0.9469297 -0.9469301 0 0.3214397 0.9238794 0 -0.3826837 -0.3826895 0 -0.923877 0.3826891 0 0.9238772 -0.9238795 0 0.3826835 0.8968724 0 -0.4422893 -0.4422811 0 -0.8968765 0.4422859 0 0.8968741 -0.8968724 0 0.4422893 0.5555709 0 -0.8314692 -0.8314725 0 -0.5555659 0.8314674 0 0.5555736 -0.55557 0 0.8314698 0.4999995 0 -0.8660257 -0.8660232 0 -0.5000039 0.8660249 0 0.5000008 -0.5000005 0 0.8660251 0.4422889 0 -0.8968726 -0.8968741 0 -0.4422859 0.8968741 0 0.4422859 -0.4422889 0 0.8968726 0.9659259 0 0.2588188 0.2588087 0 -0.9659286 -0.2588226 0 0.9659249 -0.9659258 0 -0.258819 0.9807853 0 0.1950901 0.1950931 0 -0.9807847 -0.1950931 0 0.9807847 -0.9807853 0 -0.1950901 0.9914449 0 0.1305261 0.1305247 0 -0.9914451 -0.1305293 0 0.9914445 -0.9914448 0 -0.1305263 0.06540304 0 -0.9978589 -0.9978589 0 -0.06540289 0.9978589 0 0.06540273 -0.06540352 0 0.9978589 0 0 -1 -1 0 0 1 0 0 0 0 1 0.1305258 0 -0.9914449 -0.9914444 0 -0.1305297 0.9914458 0 0.1305194 -0.1305269 0 0.9914448 0.3214393 0 -0.9469302 -0.9469296 0 -0.3214411 0.9469296 0 0.3214411 -0.3214393 0 0.9469302 0.6087616 0 0.7933532 0.7933509 0 -0.6087646 -0.7933518 0 0.6087634 -0.6087613 0 -0.7933534 0.9659257 0 0.2588195 0.2588179 0 -0.9659261 -0.2588087 0 0.9659286 -0.9659258 0 -0.2588192 0.9238795 0 -0.3826834 -0.3826855 0 -0.9238787 0.3826895 0 0.923877 -0.9238797 0 0.3826831 0.9914448 0 -0.1305263 -0.1305247 0 -0.9914451 0.1305293 0 0.9914445 -0.9914449 0 0.1305261 0.9807853 0 -0.1950901 -0.1950931 0 -0.9807847 0.1950931 0 0.9807847 -0.9807853 0 0.1950901 0.9659258 0 -0.258819 -0.2588087 0 -0.9659286 0.2588226 0 0.9659249 -0.9659259 0 0.2588188 0.6087624 0 0.7933526 0.7933518 0 -0.6087634 -0.7933553 0 0.6087588 -0.6087612 0 -0.7933535 0.6593461 0 0.7518396 0.7518379 0 -0.659348 -0.7518434 0 0.6593417 -0.6593457 0 -0.7518399 0.707107 0 0.7071065 0.7071115 0 -0.707102 -0.7071104 0 0.7071032 -0.7071068 0 -0.7071068 0.75184 0 0.6593456 0.6593458 0 -0.7518398 -0.659347 0 0.7518388 -0.7518402 0 -0.6593454 0.06540352 0 0.9978589 0.9978589 0 -0.06540289 -0.9978589 0 0.06540273 -0.06540304 0 -0.9978589 0.1305269 0 0.9914448 0.9914444 0 -0.1305297 -0.9914458 0 0.1305194 -0.1305258 0 -0.9914449 0.1950911 0 0.9807851 0.9807845 0 -0.195094 -0.9807866 0 0.1950835 -0.19509 0 -0.9807853 0.2588195 0 0.9659257 0.965926 0 -0.2588185 -0.9659259 0 0.2588188 -0.2588197 0 -0.9659257 0.3214393 0 0.9469302 0.9469296 0 -0.3214411 -0.9469296 0 0.3214411 -0.3214393 0 -0.9469302 0.3826831 0 0.9238797 0.9238805 0 -0.382681 -0.9238787 0 0.3826855 -0.382683 0 -0.9238797 0.2588197 0 -0.9659257 -0.965926 0 -0.2588185 0.9659259 0 0.2588188 -0.2588195 0 0.9659257 0.19509 0 -0.9807853 -0.9807845 0 -0.195094 0.9807866 0 0.1950835 -0.1950911 0 0.9807851 0.9978589 0 0.06540316 0.06540298 0 -0.9978589 -0.06540296 0 0.9978589 -0.9978589 0 -0.06540322 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9978589 0 -0.06540322 -0.06540298 0 -0.9978589 0.06540296 0 0.9978589 -0.9978589 0 0.06540316 0.8660257 0 -0.4999994 -0.5000008 0 -0.8660249 0.4999982 0 0.8660264 -0.8660253 0 0.5000002 0.8314691 0 -0.555571 -0.5555665 0 -0.8314721 0.5555747 0 0.8314666 -0.8314699 0 0.5555699 0.7933531 0 -0.6087618 -0.6087664 0 -0.7933495 0.6087664 0 0.7933495 -0.7933531 0 0.6087618</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_120Shape-tangents-array" count="272" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_120Shape-binormals" name="qt_gauge_tickmarks_120Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_120Shape-binormals-array" count="816">0.6087618 0 -0.7933531 -0.7933495 0 -0.6087664 0.7933495 0 0.6087664 -0.6087618 0 0.7933531 0.5555699 0 -0.8314698 -0.8314722 0 -0.5555664 0.8314666 0 0.5555747 -0.555571 0 0.8314691 0.5000002 0 -0.8660254 -0.866025 0 -0.5000008 0.8660264 0 0.4999982 -0.4999994 0 0.8660257 -0.8314702 0 0.5555694 0.5555758 0 0.8314659 -0.5555692 0 -0.8314704 0.8314696 0 -0.5555703 0.4422894 0 -0.8968725 -0.8968765 0 -0.4422811 0.8968742 0 0.4422859 -0.4422893 0 0.8968725 0.3826835 0 -0.9238796 -0.923877 0 -0.3826895 0.9238772 0 0.3826891 -0.3826837 0 0.9238794 0.3214397 0 -0.9469301 -0.9469315 0 -0.3214358 0.9469297 0 0.3214408 -0.3214396 0 0.9469301 -0.94693 0 0.32144 0.3214411 0 0.9469296 -0.3214408 0 -0.9469297 0.9469301 0 -0.3214398 -0.8968727 0 0.442289 0.4422859 0 0.8968741 -0.4422898 0 -0.8968723 0.8968728 0 -0.4422885 -0.92388 0 0.3826824 0.3826855 0 0.9238787 -0.382675 0 -0.9238831 0.9238793 0 -0.3826843 -0.7933534 0 0.6087613 0.6087593 0 0.793355 -0.608757 0 -0.7933568 0.7933539 0 -0.6087607 -0.7518402 0 0.6593456 0.6593444 0 0.7518411 -0.6593468 0 -0.751839 0.7518397 0 -0.6593461 -0.7071066 0 0.7071071 0.7071044 0 0.7071092 -0.7071056 0 -0.707108 0.7071068 0 -0.7071068 -0.6593453 0 -0.7518402 -0.7518398 0 0.6593458 0.7518389 0 -0.659347 0.6593456 0 0.75184 -0.7071068 0 -0.7071068 -0.707102 0 0.7071115 0.7071032 0 -0.7071103 0.7071065 0 0.707107 -0.7518399 0 -0.6593457 -0.659348 0 0.751838 0.6593418 0 -0.7518435 0.7518396 0 0.659346 -0.7933536 0 -0.6087612 -0.6087635 0 0.7933518 0.6087588 0 -0.7933554 0.7933527 0 0.6087624 1 0 0 0 0 -1 0 0 1 -1 0 0 1 0 0 0 0 -1 0 0 1 -1 0 0 -0.9659259 0 0.2588193 0.2588181 0 0.9659261 -0.2588131 0 -0.9659275 0.9659259 0 -0.258819 -0.8660251 0 0.5000005 0.4999957 0 0.8660279 -0.4999982 0 -0.8660264 0.8660256 0 -0.4999998 -0.8660256 0 -0.4999998 -0.5000011 0 0.8660248 0.5000039 0 -0.8660232 0.8660256 0 0.4999996 -0.7071068 0 0.7071068 0.7071044 0 0.7071092 -0.7071044 0 -0.7071092 0.7071072 0 -0.7071063 -0.9914448 0 0.1305267 0.1305294 0 0.9914445 -0.1305247 0 -0.9914451 0.9914448 0 -0.1305268 -0.9978589 0 0.06540399 0.06540304 0 0.997859 -0.06540273 0 -0.9978589 0.9978589 0 -0.06540304 -0.9914448 0 0.1305272 0.1305247 0 0.9914451 -0.1305332 0 -0.9914441 0.991445 0 -0.1305255 -0.9807853 0 0.1950907 0.1950883 0 0.9807858 -0.1950936 0 -0.9807847 0.9807852 0 -0.1950912 -0.9238797 0 -0.382683 -0.382681 0 0.9238806 0.3826855 0 -0.9238787 0.9238797 0 0.3826831 0.8968726 0 -0.4422889 -0.4422859 0 -0.8968742 0.4422859 0 0.8968742 -0.8968726 0 0.4422889 0.8660251 0 -0.5000005 -0.5000039 0 -0.8660232 0.5000008 0 0.866025 -0.8660258 0 0.4999995 0.8314698 0 -0.5555699 -0.5555659 0 -0.8314725 0.5555736 0 0.8314674 -0.8314692 0 0.5555708 -0.3214396 0 -0.9469301 -0.9469314 0 0.3214358 0.9469297 0 -0.3214408 0.3214397 0 0.9469301 -0.3826837 0 -0.9238794 -0.9238771 0 0.3826896 0.9238772 0 -0.3826891 0.3826835 0 0.9238796 -0.4422893 0 -0.8968725 -0.8968766 0 0.4422811 0.8968741 0 -0.4422859 0.4422894 0 0.8968725 -0.8314693 0 -0.5555709 -0.5555659 0 0.8314725 0.5555736 0 -0.8314674 0.8314698 0 0.5555699 -0.8660257 0 -0.4999995 -0.5000039 0 0.8660232 0.5000008 0 -0.866025 0.8660251 0 0.5000005 -0.8968727 0 -0.442289 -0.4422859 0 0.8968742 0.4422859 0 -0.8968742 0.8968727 0 0.442289 0.2588188 0 -0.965926 -0.9659287 0 -0.2588087 0.965925 0 0.2588226 -0.2588191 0 0.9659259 0.1950901 0 -0.9807854 -0.9807847 0 -0.1950931 0.9807847 0 0.1950931 -0.1950901 0 0.9807854 0.1305261 0 -0.9914449 -0.9914451 0 -0.1305247 0.9914445 0 0.1305293 -0.1305263 0 0.9914448 -0.997859 0 -0.06540304 -0.06540289 0 0.9978589 0.06540273 0 -0.9978589 0.9978589 0 0.06540351 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.991445 0 -0.1305258 -0.1305297 0 0.9914445 0.1305194 0 -0.9914458 0.9914448 0 0.1305269 -0.9469303 0 -0.3214393 -0.3214411 0 0.9469296 0.3214411 0 -0.9469296 0.9469303 0 0.3214393 0.7933532 0 -0.6087616 -0.6087646 0 -0.7933509 0.6087635 0 0.7933518 -0.7933535 0 0.6087613 0.2588195 0 -0.9659258 -0.9659262 0 -0.2588179 0.9659287 0 0.2588087 -0.2588193 0 0.9659259 -0.3826834 0 -0.9238795 -0.9238787 0 0.3826855 0.9238771 0 -0.3826896 0.3826831 0 0.9238797 -0.1305263 0 -0.9914449 -0.9914451 0 0.1305247 0.9914445 0 -0.1305293 0.1305261 0 0.9914449 -0.1950901 0 -0.9807854 -0.9807847 0 0.1950931 0.9807847 0 -0.1950931 0.1950901 0 0.9807854 -0.258819 0 -0.9659259 -0.9659286 0 0.2588087 0.965925 0 -0.2588226 0.2588188 0 0.965926 0.7933526 0 -0.6087624 -0.6087635 0 -0.7933518 0.6087588 0 0.7933553 -0.7933536 0 0.6087612 0.7518397 0 -0.6593461 -0.659348 0 -0.7518379 0.6593418 0 0.7518434 -0.7518399 0 0.6593457 0.7071065 0 -0.707107 -0.707102 0 -0.7071115 0.7071032 0 0.7071103 -0.7071068 0 0.7071068 0.6593456 0 -0.75184 -0.7518398 0 -0.6593458 0.7518388 0 0.659347 -0.6593453 0 0.7518403 0.9978589 0 -0.06540351 -0.06540289 0 -0.997859 0.06540273 0 0.9978589 -0.9978589 0 0.06540304 0.9914448 0 -0.1305269 -0.1305297 0 -0.9914445 0.1305194 0 0.9914458 -0.9914449 0 0.1305258 0.9807851 0 -0.1950911 -0.195094 0 -0.9807845 0.1950835 0 0.9807867 -0.9807854 0 0.1950901 0.9659257 0 -0.2588195 -0.2588184 0 -0.9659261 0.2588187 0 0.9659259 -0.9659256 0 0.2588197 0.9469303 0 -0.3214393 -0.3214411 0 -0.9469296 0.3214411 0 0.9469296 -0.9469303 0 0.3214393 0.9238797 0 -0.3826832 -0.382681 0 -0.9238806 0.3826855 0 0.9238787 -0.9238797 0 0.382683 -0.9659257 0 -0.2588197 -0.2588184 0 0.9659261 0.2588187 0 -0.965926 0.9659258 0 0.2588195 -0.9807854 0 -0.1950901 -0.195094 0 0.9807846 0.1950835 0 -0.9807867 0.9807852 0 0.1950911 0.06540316 0 -0.9978589 -0.9978589 0 -0.06540298 0.997859 0 0.06540296 -0.06540322 0 0.9978589 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.06540322 0 -0.9978589 -0.9978589 0 0.06540298 0.9978589 0 -0.06540296 0.06540316 0 0.997859 -0.4999994 0 -0.8660257 -0.866025 0 0.5000008 0.8660264 0 -0.4999982 0.5000002 0 0.8660254 -0.555571 0 -0.8314691 -0.8314722 0 0.5555664 0.8314667 0 -0.5555748 0.5555699 0 0.8314698 -0.6087618 0 -0.7933531 -0.7933495 0 0.6087664 0.7933495 0 -0.6087664 0.6087618 0 0.7933531</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_120Shape-binormals-array" count="272" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_120Shape-map1" name="qt_gauge_tickmarks_120Shape-map1">
+ <float_array id="qt_gauge_tickmarks_120Shape-map1-array" count="544">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_120Shape-map1-array" count="272" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_120Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_120Shape-textangents-array" count="816">0.7933494 0 0.6087664 0.7933494 0 0.6087664 0.7933494 0 0.6087664 0.7933494 0 0.6087664 0.8314721 0 0.5555664 0.8314693 0 0.5555705 0.8314666 0 0.5555747 0.8314693 0 0.5555705 0.8660249 0 0.5000007 0.8660256 0 0.4999995 0.8660263 0 0.4999982 0.8660256 0 0.4999995 -0.5555757 0 -0.8314658 -0.5555725 0 -0.831468 -0.5555692 0 -0.8314703 -0.5555725 0 -0.831468 0.8968763 0 0.442281 0.8968753 0 0.4422835 0.8968741 0 0.4422858 0.8968753 0 0.4422835 0.9238769 0 0.3826895 0.9238771 0 0.3826893 0.9238771 0 0.3826891 0.9238771 0 0.3826893 0.9469314 0 0.3214358 0.9469305 0 0.3214383 0.9469296 0 0.3214408 0.9469305 0 0.3214383 -0.3214411 0 -0.9469295 -0.3214409 0 -0.9469296 -0.3214408 0 -0.9469296 -0.3214409 0 -0.9469296 -0.4422858 0 -0.8968741 -0.4422878 0 -0.8968731 -0.4422897 0 -0.8968722 -0.4422878 0 -0.8968731 -0.3826855 0 -0.9238786 -0.3826802 0 -0.9238808 -0.3826749 0 -0.923883 -0.3826802 0 -0.9238808 -0.6087592 0 -0.7933549 -0.608758 0 -0.7933558 -0.6087569 0 -0.7933567 -0.608758 0 -0.7933558 -0.6593444 0 -0.7518409 -0.6593456 0 -0.7518399 -0.6593468 0 -0.7518389 -0.6593456 0 -0.7518399 -0.7071044 0 -0.7071092 -0.7071049 0 -0.7071085 -0.7071055 0 -0.7071079 -0.7071049 0 -0.7071085 0.7518398 0 -0.6593457 0.7518392 0 -0.6593463 0.7518387 0 -0.6593469 0.7518392 0 -0.6593463 0.7071019 0 -0.7071115 0.7071025 0 -0.7071109 0.7071031 0 -0.7071103 0.7071025 0 -0.7071109 0.659348 0 -0.7518378 0.6593449 0 -0.7518406 0.6593417 0 -0.7518433 0.6593449 0 -0.7518406 0.6087634 0 -0.7933517 0.6087611 0 -0.7933535 0.6087587 0 -0.7933553 0.6087611 0 -0.7933535 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.2588181 0 -0.965926 -0.2588156 0 -0.9659267 -0.2588131 0 -0.9659274 -0.2588156 0 -0.9659267 -0.4999957 0 -0.8660278 -0.499997 0 -0.8660271 -0.4999982 0 -0.8660263 -0.499997 0 -0.8660271 0.500001 0 -0.8660247 0.5000024 0 -0.8660238 0.5000038 0 -0.8660231 0.5000024 0 -0.8660238 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.1305294 0 -0.9914444 -0.130527 0 -0.9914447 -0.1305247 0 -0.991445 -0.130527 0 -0.9914447 -0.06540304 0 -0.9978589 -0.06540288 0 -0.9978589 -0.06540272 0 -0.9978589 -0.06540288 0 -0.9978589 -0.1305247 0 -0.991445 -0.1305289 0 -0.9914445 -0.1305331 0 -0.9914439 -0.1305289 0 -0.9914445 -0.1950883 0 -0.9807856 -0.1950909 0 -0.9807851 -0.1950935 0 -0.9807845 -0.1950909 0 -0.9807851 0.382681 0 -0.9238805 0.3826832 0 -0.9238796 0.3826855 0 -0.9238786 0.3826832 0 -0.9238796 0.4422858 0 0.8968741 0.4422858 0 0.8968741 0.4422858 0 0.8968741 0.4422858 0 0.8968741 0.5000038 0 0.8660231 0.5000023 0 0.866024 0.5000007 0 0.8660249 0.5000023 0 0.866024 0.5555658 0 0.8314725 0.5555698 0 0.8314699 0.5555736 0 0.8314673 0.5555698 0 0.8314699 0.9469314 0 -0.3214358 0.9469305 0 -0.3214383 0.9469296 0 -0.3214408 0.9469305 0 -0.3214383 0.9238769 0 -0.3826895 0.9238771 0 -0.3826893 0.9238771 0 -0.3826891 0.9238771 0 -0.3826893 0.8968763 0 -0.442281 0.8968753 0 -0.4422835 0.8968741 0 -0.4422858 0.8968753 0 -0.4422835 0.5555658 0 -0.8314725 0.5555698 0 -0.8314699 0.5555736 0 -0.8314673 0.5555698 0 -0.8314699 0.5000038 0 -0.8660231 0.5000023 0 -0.866024 0.5000007 0 -0.8660249 0.5000023 0 -0.866024 0.4422858 0 -0.8968741 0.4422858 0 -0.8968741 0.4422858 0 -0.8968741 0.4422858 0 -0.8968741 0.9659286 0 0.2588086 0.9659267 0 0.2588156 0.9659249 0 0.2588226 0.9659267 0 0.2588156 0.9807847 0 0.1950931 0.9807847 0 0.1950931 0.9807847 0 0.1950931 0.9807847 0 0.1950931 0.991445 0 0.1305247 0.9914447 0 0.130527 0.9914444 0 0.1305293 0.9914447 0 0.130527 0.06540288 0 -0.9978589 0.0654028 0 -0.9978589 0.06540272 0 -0.9978589 0.0654028 0 -0.9978589 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0.1305297 0 -0.9914443 0.1305245 0 -0.991445 0.1305194 0 -0.9914456 0.1305245 0 -0.991445 0.3214411 0 -0.9469295 0.3214411 0 -0.9469295 0.3214411 0 -0.9469295 0.3214411 0 -0.9469295 0.6087645 0 0.7933509 0.608764 0 0.7933513 0.6087634 0 0.7933517 0.608764 0 0.7933513 0.9659261 0 0.2588178 0.9659274 0 0.2588133 0.9659286 0 0.2588086 0.9659274 0 0.2588133 0.9238786 0 -0.3826855 0.9238778 0 -0.3826875 0.9238769 0 -0.3826895 0.9238778 0 -0.3826875 0.991445 0 -0.1305247 0.9914447 0 -0.130527 0.9914444 0 -0.1305293 0.9914447 0 -0.130527 0.9807847 0 -0.1950931 0.9807847 0 -0.1950931 0.9807847 0 -0.1950931 0.9807847 0 -0.1950931 0.9659286 0 -0.2588086 0.9659267 0 -0.2588156 0.9659249 0 -0.2588226 0.9659267 0 -0.2588156 0.6087634 0 0.7933517 0.6087611 0 0.7933535 0.6087587 0 0.7933553 0.6087611 0 0.7933535 0.659348 0 0.7518378 0.6593449 0 0.7518406 0.6593417 0 0.7518433 0.6593449 0 0.7518406 0.7071019 0 0.7071115 0.7071025 0 0.7071109 0.7071031 0 0.7071103 0.7071025 0 0.7071109 0.7518398 0 0.6593457 0.7518392 0 0.6593463 0.7518387 0 0.6593469 0.7518392 0 0.6593463 0.06540288 0 0.9978589 0.0654028 0 0.9978589 0.06540272 0 0.9978589 0.0654028 0 0.9978589 0.1305297 0 0.9914443 0.1305245 0 0.991445 0.1305194 0 0.9914456 0.1305245 0 0.991445 0.195094 0 0.9807845 0.1950887 0 0.9807855 0.1950835 0 0.9807866 0.1950887 0 0.9807855 0.2588184 0 0.9659259 0.2588186 0 0.9659259 0.2588187 0 0.9659259 0.2588186 0 0.9659259 0.3214411 0 0.9469295 0.3214411 0 0.9469295 0.3214411 0 0.9469295 0.3214411 0 0.9469295 0.382681 0 0.9238805 0.3826832 0 0.9238796 0.3826855 0 0.9238786 0.3826832 0 0.9238796 0.2588184 0 -0.9659259 0.2588186 0 -0.9659259 0.2588187 0 -0.9659259 0.2588186 0 -0.9659259 0.195094 0 -0.9807845 0.1950887 0 -0.9807855 0.1950835 0 -0.9807866 0.1950887 0 -0.9807855 0.9978589 0 0.06540298 0.9978589 0 0.06540296 0.9978589 0 0.06540295 0.9978589 0 0.06540296 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9978589 0 -0.06540298 0.9978589 0 -0.06540296 0.9978589 0 -0.06540295 0.9978589 0 -0.06540296 0.8660249 0 -0.5000007 0.8660256 0 -0.4999995 0.8660263 0 -0.4999982 0.8660256 0 -0.4999995 0.8314721 0 -0.5555664 0.8314693 0 -0.5555705 0.8314666 0 -0.5555747 0.8314693 0 -0.5555705 0.7933494 0 -0.6087664 0.7933494 0 -0.6087664 0.7933494 0 -0.6087664 0.7933494 0 -0.6087664</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_120Shape-textangents-array" count="272" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_120Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_120Shape-texbinormals-array" count="816">0.6087664 0 -0.7933496 0.6087664 0 -0.7933496 0.6087664 0 -0.7933496 0.6087664 0 -0.7933496 0.5555664 0 -0.8314722 0.5555705 0 -0.8314694 0.5555747 0 -0.8314667 0.5555705 0 -0.8314694 0.5000008 0 -0.866025 0.4999996 0 -0.8660257 0.4999983 0 -0.8660265 0.4999996 0 -0.8660257 -0.831466 0 0.5555758 -0.8314682 0 0.5555725 -0.8314704 0 0.5555692 -0.8314682 0 0.5555725 0.4422811 0 -0.8968765 0.4422835 0 -0.8968754 0.4422859 0 -0.8968742 0.4422835 0 -0.8968753 0.3826896 0 -0.9238771 0.3826894 0 -0.9238772 0.3826891 0 -0.9238772 0.3826893 0 -0.9238771 0.3214358 0 -0.9469314 0.3214383 0 -0.9469306 0.3214408 0 -0.9469298 0.3214383 0 -0.9469306 -0.9469296 0 0.3214411 -0.9469297 0 0.321441 -0.9469298 0 0.3214408 -0.9469297 0 0.321441 -0.8968742 0 0.4422859 -0.8968732 0 0.4422878 -0.8968723 0 0.4422898 -0.8968732 0 0.4422878 -0.9238787 0 0.3826855 -0.9238809 0 0.3826803 -0.9238831 0 0.382675 -0.9238809 0 0.3826803 -0.793355 0 0.6087593 -0.7933559 0 0.6087581 -0.7933568 0 0.608757 -0.7933559 0 0.6087581 -0.7518411 0 0.6593444 -0.7518401 0 0.6593457 -0.751839 0 0.6593468 -0.7518401 0 0.6593457 -0.7071092 0 0.7071044 -0.7071086 0 0.707105 -0.707108 0 0.7071056 -0.7071086 0 0.707105 -0.6593459 0 -0.7518398 -0.6593465 0 -0.7518393 -0.6593471 0 -0.7518388 -0.6593465 0 -0.7518393 -0.7071115 0 -0.707102 -0.707111 0 -0.7071027 -0.7071104 0 -0.7071033 -0.707111 0 -0.7071027 -0.751838 0 -0.6593481 -0.7518407 0 -0.6593449 -0.7518434 0 -0.6593417 -0.7518407 0 -0.6593449 -0.7933518 0 -0.6087635 -0.7933536 0 -0.6087611 -0.7933554 0 -0.6087588 -0.7933536 0 -0.6087611 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 -0.9659261 0 0.2588181 -0.9659268 0 0.2588156 -0.9659275 0 0.2588131 -0.9659268 0 0.2588156 -0.8660279 0 0.4999957 -0.8660272 0 0.499997 -0.8660265 0 0.4999983 -0.8660272 0 0.499997 -0.8660249 0 -0.5000011 -0.866024 0 -0.5000025 -0.8660232 0 -0.5000039 -0.866024 0 -0.5000024 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.9914445 0 0.1305294 -0.9914448 0 0.130527 -0.9914451 0 0.1305247 -0.9914448 0 0.130527 -0.997859 0 0.06540304 -0.9978589 0 0.06540288 -0.997859 0 0.06540273 -0.997859 0 0.06540289 -0.9914451 0 0.1305247 -0.9914445 0 0.1305289 -0.991444 0 0.1305331 -0.9914446 0 0.1305289 -0.9807857 0 0.1950883 -0.9807853 0 0.195091 -0.9807847 0 0.1950936 -0.9807852 0 0.195091 -0.9238806 0 -0.382681 -0.9238796 0 -0.3826832 -0.9238787 0 -0.3826855 -0.9238797 0 -0.3826832 0.8968742 0 -0.4422859 0.8968742 0 -0.4422859 0.8968742 0 -0.4422859 0.8968742 0 -0.4422859 0.8660232 0 -0.5000039 0.8660241 0 -0.5000023 0.866025 0 -0.5000008 0.8660241 0 -0.5000023 0.8314726 0 -0.5555659 0.83147 0 -0.5555698 0.8314674 0 -0.5555736 0.83147 0 -0.5555698 -0.3214358 0 -0.9469315 -0.3214383 0 -0.9469306 -0.3214408 0 -0.9469298 -0.3214383 0 -0.9469306 -0.3826896 0 -0.9238771 -0.3826893 0 -0.9238771 -0.3826891 0 -0.9238772 -0.3826893 0 -0.9238772 -0.4422811 0 -0.8968766 -0.4422835 0 -0.8968753 -0.4422859 0 -0.8968742 -0.4422835 0 -0.8968754 -0.8314726 0 -0.5555659 -0.83147 0 -0.5555698 -0.8314674 0 -0.5555736 -0.83147 0 -0.5555698 -0.8660232 0 -0.5000039 -0.8660241 0 -0.5000023 -0.866025 0 -0.5000008 -0.8660241 0 -0.5000023 -0.8968742 0 -0.4422859 -0.8968742 0 -0.4422859 -0.8968742 0 -0.4422859 -0.8968742 0 -0.4422859 0.2588087 0 -0.9659287 0.2588156 0 -0.9659268 0.2588226 0 -0.965925 0.2588156 0 -0.9659268 0.1950931 0 -0.9807848 0.1950931 0 -0.9807848 0.1950931 0 -0.9807848 0.1950931 0 -0.9807848 0.1305247 0 -0.9914451 0.130527 0 -0.9914448 0.1305293 0 -0.9914445 0.130527 0 -0.9914448 -0.9978589 0 -0.06540288 -0.997859 0 -0.06540281 -0.997859 0 -0.06540273 -0.997859 0 -0.06540281 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9914444 0 -0.1305297 -0.9914451 0 -0.1305245 -0.9914458 0 -0.1305194 -0.9914451 0 -0.1305245 -0.9469296 0 -0.3214411 -0.9469296 0 -0.3214411 -0.9469296 0 -0.3214411 -0.9469296 0 -0.3214411 0.793351 0 -0.6087646 0.7933514 0 -0.6087641 0.7933518 0 -0.6087635 0.7933514 0 -0.6087641 0.2588178 0 -0.9659262 0.2588133 0 -0.9659275 0.2588087 0 -0.9659287 0.2588133 0 -0.9659274 -0.3826855 0 -0.9238787 -0.3826875 0 -0.923878 -0.3826896 0 -0.9238771 -0.3826875 0 -0.9238779 -0.1305247 0 -0.9914451 -0.130527 0 -0.9914448 -0.1305293 0 -0.9914445 -0.130527 0 -0.9914448 -0.1950931 0 -0.9807848 -0.1950931 0 -0.9807848 -0.1950931 0 -0.9807848 -0.1950931 0 -0.9807848 -0.2588086 0 -0.9659286 -0.2588156 0 -0.9659268 -0.2588226 0 -0.965925 -0.2588156 0 -0.9659268 0.7933518 0 -0.6087635 0.7933536 0 -0.6087611 0.7933554 0 -0.6087588 0.7933536 0 -0.6087611 0.751838 0 -0.659348 0.7518407 0 -0.6593449 0.7518435 0 -0.6593418 0.7518407 0 -0.6593449 0.7071116 0 -0.7071021 0.7071109 0 -0.7071026 0.7071104 0 -0.7071033 0.707111 0 -0.7071027 0.6593459 0 -0.7518398 0.6593465 0 -0.7518393 0.6593469 0 -0.7518388 0.6593465 0 -0.7518393 0.997859 0 -0.06540289 0.9978589 0 -0.0654028 0.997859 0 -0.06540273 0.997859 0 -0.06540281 0.9914444 0 -0.1305297 0.9914451 0 -0.1305245 0.9914458 0 -0.1305194 0.9914451 0 -0.1305245 0.9807846 0 -0.195094 0.9807857 0 -0.1950888 0.9807867 0 -0.1950835 0.9807857 0 -0.1950888 0.9659261 0 -0.2588184 0.9659261 0 -0.2588186 0.965926 0 -0.2588187 0.965926 0 -0.2588186 0.9469296 0 -0.3214411 0.9469296 0 -0.3214411 0.9469296 0 -0.3214411 0.9469296 0 -0.3214411 0.9238806 0 -0.382681 0.9238797 0 -0.3826832 0.9238787 0 -0.3826855 0.9238797 0 -0.3826832 -0.965926 0 -0.2588184 -0.9659261 0 -0.2588186 -0.965926 0 -0.2588187 -0.9659261 0 -0.2588186 -0.9807845 0 -0.195094 -0.9807856 0 -0.1950888 -0.9807867 0 -0.1950835 -0.9807856 0 -0.1950888 0.06540298 0 -0.997859 0.06540297 0 -0.997859 0.06540296 0 -0.997859 0.06540296 0 -0.9978589 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.06540298 0 -0.997859 -0.06540297 0 -0.997859 -0.06540295 0 -0.9978589 -0.06540297 0 -0.997859 -0.5000008 0 -0.866025 -0.4999996 0 -0.8660257 -0.4999983 0 -0.8660265 -0.4999996 0 -0.8660257 -0.5555664 0 -0.8314722 -0.5555705 0 -0.8314694 -0.5555747 0 -0.8314667 -0.5555705 0 -0.8314694 -0.6087664 0 -0.7933496 -0.6087664 0 -0.7933496 -0.6087664 0 -0.7933496 -0.6087664 0 -0.7933496</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_120Shape-texbinormals-array" count="272" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_120Shape-vertices" name="qt_gauge_tickmarks_120Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_120Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_120Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_120Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_120Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="136">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_120Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_120Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_120Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_120Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66 68 68 68 69 69 69 70 71 71 70 71 71 69 69 69 71 70 70 72 72 72 73 73 73 74 75 75 74 75 75 73 73 73 75 74 74 76 76 76 77 77 77 78 79 79 78 79 79 77 77 77 79 78 78 80 80 80 81 81 81 82 83 83 82 83 83 81 81 81 83 82 82 84 84 84 85 85 85 86 87 87 86 87 87 85 85 85 87 86 86 88 88 88 89 89 89 90 91 91 90 91 91 89 89 89 91 90 90 92 92 92 93 93 93 94 95 95 94 95 95 93 93 93 95 94 94 96 96 96 97 97 97 98 99 99 98 99 99 97 97 97 99 98 98 100 100 100 101 101 101 102 103 103 102 103 103 101 101 101 103 102 102 104 104 104 105 105 105 106 107 107 106 107 107 105 105 105 107 106 106 108 108 108 109 109 109 110 111 111 110 111 111 109 109 109 111 110 110 112 112 112 113 113 113 114 115 115 114 115 115 113 113 113 115 114 114 116 116 116 117 117 117 118 119 119 118 119 119 117 117 117 119 118 118 120 120 120 121 121 121 122 123 123 122 123 123 121 121 121 123 122 122 124 124 124 125 125 125 126 127 127 126 127 127 125 125 125 127 126 126 128 128 128 129 129 129 130 131 131 130 131 131 129 129 129 131 130 130 132 132 132 133 133 133 134 135 135 134 135 135 133 133 133 135 134 134 136 136 136 137 137 137 138 139 139 138 139 139 137 137 137 139 138 138 140 140 140 141 141 141 142 143 143 142 143 143 141 141 141 143 142 142 144 144 144 145 145 145 146 147 147 146 147 147 145 145 145 147 146 146 148 148 148 149 149 149 150 151 151 150 151 151 149 149 149 151 150 150 152 152 152 153 153 153 154 155 155 154 155 155 153 153 153 155 154 154 156 156 156 157 157 157 158 159 159 158 159 159 157 157 157 159 158 158 160 160 160 161 161 161 162 163 163 162 163 163 161 161 161 163 162 162 164 164 164 165 165 165 166 167 167 166 167 167 165 165 165 167 166 166 168 168 168 169 169 169 170 171 171 170 171 171 169 169 169 171 170 170 172 172 172 173 173 173 174 175 175 174 175 175 173 173 173 175 174 174 176 176 176 177 177 177 178 179 179 178 179 179 177 177 177 179 178 178 180 180 180 181 181 181 182 183 183 182 183 183 181 181 181 183 182 182 184 184 184 185 185 185 186 187 187 186 187 187 185 185 185 187 186 186 188 188 188 189 189 189 190 191 191 190 191 191 189 189 189 191 190 190 192 192 192 193 193 193 194 195 195 194 195 195 193 193 193 195 194 194 196 196 196 197 197 197 198 199 199 198 199 199 197 197 197 199 198 198 200 200 200 201 201 201 202 203 203 202 203 203 201 201 201 203 202 202 204 204 204 205 205 205 206 207 207 206 207 207 205 205 205 207 206 206 208 208 208 209 209 209 210 211 211 210 211 211 209 209 209 211 210 210 212 212 212 213 213 213 214 215 215 214 215 215 213 213 213 215 214 214 216 216 216 217 217 217 218 219 219 218 219 219 217 217 217 219 218 218 220 220 220 221 221 221 222 223 223 222 223 223 221 221 221 223 222 222 224 224 224 225 225 225 226 227 227 226 227 227 225 225 225 227 226 226 228 228 228 229 229 229 230 231 231 230 231 231 229 229 229 231 230 230 232 232 232 233 233 233 234 235 235 234 235 235 233 233 233 235 234 234 236 236 236 237 237 237 238 239 239 238 239 239 237 237 237 239 238 238 240 240 240 241 241 241 242 243 243 242 243 243 241 241 241 243 242 242 244 244 244 245 245 245 246 247 247 246 247 247 245 245 245 247 246 246 248 248 248 249 249 249 250 251 251 250 251 251 249 249 249 251 250 250 252 252 252 253 253 253 254 255 255 254 255 255 253 253 253 255 254 254 256 256 256 257 257 257 258 259 259 258 259 259 257 257 257 259 258 258 260 260 260 261 261 261 262 263 263 262 263 263 261 261 261 263 262 262 264 264 264 265 265 265 266 267 267 266 267 267 265 265 265 267 266 266 268 268 268 269 269 269 270 271 271 270 271 271 269 269 269 271 270 270</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_120Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_120" name="qt_gauge_tickmarks_120" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_120Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_120</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_12_clock.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_12_clock.dae
new file mode 100644
index 0000000..9a9539f
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_12_clock.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:29:12</created>
+ <modified>2018-03-08T09:29:12</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_12_clockShape" name="qt_gauge_tickmarks_12_clockShape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_12_clockShape-positions" name="qt_gauge_tickmarks_12_clockShape-positions">
+ <float_array id="qt_gauge_tickmarks_12_clockShape-positions-array" count="888">9.302797 0 1.926254 9.282007 0 2.024069 10.28095 0 2.134166 10.26015 0 2.23198 9.453184 0 0.943294 9.442732 0 1.042747 10.44771 0 1.047823 10.43725 0 1.147275 7.715051 0 5.543509 7.656272 0 5.624411 8.524067 0 6.131294 8.46529 0 6.212195 8.252241 0 4.706698 8.202242 0 4.793302 9.118267 0 5.206699 9.068267 0 5.293302 8.699018 0 3.818321 8.658345 0 3.909675 9.612564 0 4.225058 9.57189 0 4.316412 9.050488 0 2.888108 9.019587 0 2.983214 10.00154 0 3.197126 9.970642 0 3.292231 0.05000019 0 9.5 -0.05000019 0 9.5 0.05000019 0 10.5 -0.05000019 0 10.5 1.042746 0 9.442732 0.943294 0 9.453184 1.147275 0 10.43725 1.047822 0 10.44771 2.024068 0 9.282007 1.926254 0 9.302797 2.23198 0 10.26015 2.134166 0 10.28095 -5.543509 0 7.71505 -5.624411 0 7.656271 -6.131294 0 8.524067 -6.212196 0 8.465288 -4.706698 0 8.252241 -4.793302 0 8.202242 -5.206699 0 9.118267 -5.293301 0 9.068267 -3.818321 0 8.699018 -3.909676 0 8.658345 -4.225058 0 9.612564 -4.316412 0 9.57189 -2.888108 0 9.050488 -2.983214 0 9.019587 -3.197126 0 10.00154 -3.292231 0 9.970643 -1.926254 0 9.302797 -2.024068 0 9.282007 -2.134166 0 10.28095 -2.23198 0 10.26015 -0.943294 0 9.453184 -1.042746 0 9.442732 -1.047822 0 10.44771 -1.147275 0 10.43725 -7.656272 0 5.624411 -7.715051 0 5.543509 -8.46529 0 6.212195 -8.524068 0 6.131294 -7.02642 0 6.393898 -7.093332 0 6.319584 -7.769564 0 7.063028 -7.836477 0 6.988714 -6.319583 0 7.093332 -6.393898 0 7.026419 -6.988714 0 7.836477 -7.063028 0 7.769564 -9.019587 0 2.983214 -9.050488 0 2.888108 -9.970642 0 3.292231 -10.00154 0 3.197125 -8.658345 0 3.909675 -8.699018 0 3.818321 -9.571891 0 4.316411 -9.612564 0 4.225058 -8.202242 0 4.793302 -8.252241 0 4.706698 -9.068266 0 5.293302 -9.118267 0 5.206699 5.624411 0 7.656271 5.543509 0 7.71505 6.212196 0 8.465289 6.131294 0 8.524067 6.393898 0 7.026419 6.319583 0 7.093332 7.063028 0 7.769564 6.988714 0 7.836477 7.093332 0 6.319584 7.02642 0 6.393898 7.836477 0 6.988714 7.769564 0 7.063028 -9.453184 0 -0.943294 -9.442732 0 -1.042747 -10.44771 0 -1.047822 -10.43725 0 -1.147275 -9.5 0 0.04999971 -9.500001 0 -0.05000019 -10.5 0 0.05000067 -10.5 0 -0.04999924 -9.442732 0 1.042746 -9.453184 0 0.943294 -10.43725 0 1.147275 -10.44771 0 1.047823 -9.282007 0 2.024068 -9.302797 0 1.926254 -10.26015 0 2.231981 -10.28094 0 2.134166 -8.699018 0 -3.81832 -8.658345 0 -3.909675 -9.612564 0 -4.225057 -9.571891 0 -4.316412 -9.050488 0 -2.888109 -9.019587 0 -2.983215 -10.00154 0 -3.197127 -9.970642 0 -3.292231 -9.302799 0 -1.926255 -9.282007 0 -2.024069 -10.28095 0 -2.134166 -10.26015 0 -2.23198 -4.793302 0 -8.202242 -4.706698 0 -8.25224 -5.293302 0 -9.068266 -5.206699 0 -9.118267 -5.624411 0 -7.656272 -5.543509 0 -7.71505 -6.212196 0 -8.465288 -6.131294 0 -8.524068 -6.393898 0 -7.026419 -6.319583 0 -7.093332 -7.063028 0 -7.769563 -6.988714 0 -7.836477 -7.093332 0 -6.319583 -7.02642 0 -6.393898 -7.836477 0 -6.988713 -7.769564 0 -7.063028 -7.71505 0 -5.543509 -7.656272 0 -5.62441 -8.524067 0 -6.131294 -8.465288 0 -6.212195 -8.252241 0 -4.706699 -8.202241 0 -4.793301 -9.118267 0 -5.206698 -9.068267 0 -5.293302 9.5 0 -0.04999924 9.5 0 0.04999971 10.5 0 -0.04999924 10.5 0 0.05000019 9.442732 0 -1.042747 9.453184 0 -0.9432945 10.43725 0 -1.147275 10.44771 0 -1.047823 9.282007 0 -2.024069 9.302797 0 -1.926254 10.26015 0 -2.23198 10.28095 0 -2.134166 -2.024068 0 -9.282007 -1.926254 0 -9.302797 -2.23198 0 -10.26015 -2.134165 0 -10.28094 -2.983214 0 -9.019587 -2.888109 0 -9.050488 -3.292231 0 -9.970642 -3.197126 0 -10.00154 -3.909676 0 -8.658345 -3.818321 0 -8.699018 -4.316412 0 -9.571891 -4.225058 0 -9.612564 7.656272 0 -5.624411 7.71505 0 -5.543509 8.465289 0 -6.212196 8.524067 0 -6.131294 6.319583 0 -7.093332 6.393898 0 -7.026419 6.988714 0 -7.836477 7.063028 0 -7.769563 7.02642 0 -6.393898 7.093332 0 -6.319583 7.769564 0 -7.063028 7.836477 0 -6.988714 4.156247 0 -7.583064 4.489002 0 -7.390947 5.11683 0 -9.246842 5.449586 0 -9.054726 -0.1921167 0 -8.645249 0.1921167 0 -8.645249 -0.1921167 0 -10.56642 0.1921167 0 -10.56642 8.645249 0 -0.1921165 8.645249 0 0.1921169 10.56642 0 -0.1921165 10.56642 0 0.1921174 7.583063 0 4.156247 7.390947 0 4.489002 9.246843 0 5.116831 9.054726 0 5.449585 7.390947 0 -4.489002 7.583064 0 -4.156247 9.054726 0 -5.449586 9.246843 0 -5.116829 -4.156248 0 7.583064 -4.489002 0 7.390948 -5.116831 0 9.246843 -5.449586 0 9.054726 0.1921165 0 8.645249 -0.1921165 0 8.645249 0.1921165 0 10.56642 -0.1921165 0 10.56642 4.489003 0 7.390947 4.156247 0 7.583065 5.449586 0 9.054726 5.116831 0 9.246843 -7.583064 0 -4.156247 -7.390947 0 -4.489002 -9.246843 0 -5.116829 -9.054726 0 -5.449586 -8.645249 0 0.1921169 -8.645249 0 -0.1921165 -10.56642 0 0.1921174 -10.56642 0 -0.1921165 -7.390947 0 4.489002 -7.583064 0 4.156247 -9.054727 0 5.449585 -9.246842 0 5.116831 -0.1921167 0 -8.645249 0.1921167 0 -8.645249 -0.1921167 0 -10.56642 0.1921167 0 -10.56642 -4.489002 0 -7.390948 -4.156247 0 -7.583064 -5.449586 0 -9.054725 -5.116831 0 -9.246843 5.543509 0 -7.71505 5.624411 0 -7.656271 6.131294 0 -8.524067 6.212196 0 -8.465288 4.706699 0 -8.252241 4.793302 0 -8.202242 5.206698 0 -9.118266 5.293302 0 -9.068266 3.818321 0 -8.699018 3.909675 0 -8.658344 4.225058 0 -9.612565 4.316412 0 -9.57189 2.888109 0 -9.050488 2.983214 0 -9.019587 3.197126 0 -10.00154 3.292231 0 -9.970642 1.926254 0 -9.302797 2.024068 0 -9.282007 2.134165 0 -10.28094 2.23198 0 -10.26015 0.9432943 0 -9.453184 1.042747 0 -9.442731 1.047823 0 -10.44771 1.147275 0 -10.43725 -0.05 0 -9.5 0.05 0 -9.5 -0.05 0 -10.5 0.05 0 -10.5 8.658345 0 -3.909675 8.699018 0 -3.818321 9.571891 0 -4.316412 9.612564 0 -4.225057 9.019586 0 -2.983214 9.050488 0 -2.888108 9.970642 0 -3.292232 10.00154 0 -3.197126 8.202241 0 -4.793301 8.252241 0 -4.706698 9.068267 0 -5.293302 9.118267 0 -5.206698 -0.05 0 -9.5 0.05 0 -9.5 -0.05 0 -10.5 0.05 0 -10.5 -1.042747 0 -9.442731 -0.9432943 0 -9.453184 -1.147275 0 -10.43725 -1.047823 0 -10.44771 2.983214 0 9.019587 2.888108 0 9.050488 3.292231 0 9.970643 3.197126 0 10.00154 3.909675 0 8.658345 3.818321 0 8.699018 4.316412 0 9.57189 4.225058 0 9.612564 4.793302 0 8.202242 4.706699 0 8.252241 5.293302 0 9.068266 5.206699 0 9.118267</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_12_clockShape-positions-array" count="296" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_12_clockShape-normals" name="qt_gauge_tickmarks_12_clockShape-normals">
+ <float_array id="qt_gauge_tickmarks_12_clockShape-normals-array" count="888">0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_12_clockShape-normals-array" count="296" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_12_clockShape-tangents" name="qt_gauge_tickmarks_12_clockShape-tangents">
+ <float_array id="qt_gauge_tickmarks_12_clockShape-tangents-array" count="888">-0.2079113 0 0.9781477 0.9781497 0 0.2079019 -0.9781477 0 -0.207911 0.2079115 0 -0.9781476 -0.1045289 0 0.9945219 0.9945225 0 0.1045224 -0.9945225 0 -0.1045229 0.1045284 0 -0.9945219 -0.5877856 0 0.8090167 0.8090156 0 0.5877872 -0.809023 0 -0.587777 0.5877844 0 -0.8090176 -0.5000005 0 0.8660251 0.8660303 0 0.4999916 -0.8660238 0 -0.5000029 0.5000002 0 -0.8660253 -0.406737 0 0.9135453 0.9135475 0 0.4067321 -0.9135431 0 -0.4067418 0.4067369 0 -0.9135453 -0.3090172 0 0.9510565 0.9510585 0 0.309011 -0.9510557 0 -0.3090196 0.3090175 0 -0.9510564 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.9945219 0 0.1045283 0.1045227 0 0.9945225 -0.1045227 0 -0.9945225 0.9945219 0 -0.1045283 -0.9781475 0 0.207912 0.2079021 0 0.9781496 -0.207911 0 -0.9781477 0.9781476 0 -0.2079117 -0.8090167 0 -0.5877857 -0.5877826 0 0.8090189 0.5877849 0 -0.8090172 0.8090169 0 0.5877854 -0.8660253 0 -0.5000001 -0.4999916 0 0.8660303 0.5000049 0 -0.8660226 0.8660257 0 0.4999995 -0.9135452 0 -0.4067372 -0.4067312 0 0.9135479 0.4067436 0 -0.9135424 0.9135455 0 0.4067365 -0.9510564 0 -0.3090173 -0.3090089 0 0.9510592 0.3090203 0 -0.9510554 0.9510566 0 0.3090167 -0.9781476 0 -0.2079117 -0.2079021 0 0.9781496 0.207911 0 -0.9781477 0.9781475 0 0.207912 -0.9945219 0 -0.1045283 -0.1045227 0 0.9945225 0.1045227 0 -0.9945225 0.9945219 0 0.1045283 -0.5877844 0 -0.8090176 -0.8090156 0 0.5877872 0.8090185 0 -0.5877832 0.5877852 0 0.8090171 -0.6691303 0 -0.7431451 -0.7431474 0 0.6691278 0.7431429 0 -0.6691328 0.6691304 0 0.743145 -0.7431448 0 -0.6691306 -0.6691331 0 0.7431426 0.6691354 0 -0.7431405 0.743145 0 0.6691304 -0.3090177 0 -0.9510563 -0.9510582 0 0.3090117 0.9510531 0 -0.3090275 0.3090167 0 0.9510566 -0.4067362 0 -0.9135457 -0.9135475 0 0.4067321 0.9135451 0 -0.4067374 0.4067374 0 0.9135451 -0.5000006 0 -0.8660251 -0.8660303 0 0.4999916 0.8660208 0 -0.5000079 0.5000001 0 0.8660253 -0.8090175 0 0.5877846 0.5877872 0 0.8090156 -0.5877809 0 -0.8090201 0.8090171 0 -0.5877851 -0.743145 0 0.6691304 0.6691331 0 0.7431426 -0.6691354 0 -0.7431405 0.7431448 0 -0.6691306 -0.6691304 0 0.743145 0.7431474 0 0.6691278 -0.7431429 0 -0.6691328 0.6691303 0 -0.7431451 0.1045284 0 -0.9945219 -0.9945225 0 -0.1045224 0.9945225 0 0.1045224 -0.1045284 0 0.9945219 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.1045289 0 -0.9945219 -0.9945225 0 0.1045229 0.9945225 0 -0.1045229 0.1045289 0 0.9945219 -0.2079126 0 -0.9781474 -0.9781495 0 0.2079028 0.978148 0 -0.20791 0.2079115 0 0.9781476 0.406737 0 -0.9135453 -0.9135475 0 -0.4067321 0.9135475 0 0.4067321 -0.406737 0 0.9135453 0.3090169 0 -0.9510565 -0.9510589 0 -0.3090096 0.951052 0 0.309031 -0.3090162 0 0.9510568 0.2079115 0 -0.9781476 -0.9781456 0 -0.2079211 0.9781475 0 0.207912 -0.2079113 0 0.9781477 0.8660251 0 -0.5000006 -0.4999844 0 -0.8660344 0.5000079 0 0.8660208 -0.8660256 0 0.4999997 0.8090166 0 -0.5877858 -0.5877809 0 -0.8090201 0.5877934 0 0.8090111 -0.8090172 0 0.5877849 0.7431444 0 -0.6691311 -0.6691281 0 -0.7431471 0.6691407 0 0.7431357 -0.7431446 0 0.6691309 0.6691304 0 -0.743145 -0.7431474 0 -0.6691278 0.7431471 0 0.6691281 -0.6691309 0 0.7431446 0.5877857 0 -0.8090167 -0.8090179 0 -0.5877841 0.809014 0 0.5877894 -0.5877856 0 0.8090167 0.4999991 0 -0.8660259 -0.8660226 0 -0.5000049 0.8660273 0 0.4999967 -0.5000005 0 0.8660251 0 0 1 1 0 0 -1 0 0 0 0 -1 0.1045284 0 0.9945219 0.9945225 0 -0.1045229 -0.9945225 0 0.1045229 -0.1045284 0 -0.9945219 0.2079117 0 0.9781476 0.9781499 0 -0.2079009 -0.9781477 0 0.207911 -0.207912 0 -0.9781475 0.9781475 0 -0.207912 -0.2079016 0 -0.9781497 0.2079009 0 0.9781499 -0.9781476 0 0.2079116 0.9510565 0 -0.309017 -0.3090189 0 -0.9510559 0.3090282 0 0.9510529 -0.9510565 0 0.309017 0.9135456 0 -0.4067364 -0.4067321 0 -0.9135475 0.4067339 0 0.9135467 -0.9135454 0 0.4067368 0.5877852 0 0.8090171 0.8090212 0 -0.5877795 -0.8090218 0 0.5877787 -0.5877857 0 -0.8090167 0.7431446 0 0.6691309 0.6691281 0 -0.7431471 -0.6691407 0 0.7431357 -0.7431444 0 -0.6691311 0.6691309 0 0.7431446 0.7431452 0 -0.6691302 -0.7431429 0 0.6691328 -0.6691306 0 -0.7431448 0.8660253 0 0.5000002 0.500001 0 -0.8660248 -0.4999999 0 0.8660255 -0.8660251 0 -0.5000006 1 0 0 0 0 -1 0 0 1 -1 0 0 0 0 1 1 0 0 -1 0 0 0 0 -1 -0.5000001 0 0.8660254 0.8660259 0 0.4999991 -0.8660235 0 -0.5000034 0.5000003 0 -0.8660252 0.5000006 0 0.8660251 0.8660243 0 -0.5000019 -0.866025 0 0.5000007 -0.4999997 0 -0.8660256 -0.8660254 0 -0.4999999 -0.5000006 0 0.8660251 0.5000028 0 -0.8660238 0.8660252 0 0.5000004 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.8660253 0 0.5000001 0.5000014 0 0.8660246 -0.5000028 0 -0.8660238 0.8660253 0 -0.5000002 0.4999996 0 -0.8660257 -0.866024 0 -0.5000024 0.866025 0 0.5000007 -0.5000006 0 0.8660251 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.4999998 0 -0.8660255 -0.8660246 0 0.5000014 0.8660256 0 -0.4999996 0.5000005 0 0.8660251 1 0 0 0 0 -1 0 0 1 -1 0 0 0.866025 0 -0.5000006 -0.4999986 0 -0.8660262 0.5000047 0 0.8660227 -0.8660253 0 0.5000002 0.8090169 0 0.5877854 0.5877872 0 -0.8090156 -0.5877872 0 0.8090156 -0.8090169 0 -0.5877854 0.8660255 0 0.4999998 0.4999936 0 -0.8660291 -0.4999987 0 0.8660261 -0.8660251 0 -0.5000006 0.9135456 0 0.4067364 0.406741 0 -0.9135435 -0.4067498 0 0.9135396 -0.9135455 0 -0.4067366 0.9510566 0 0.3090167 0.3090103 0 -0.9510587 -0.3090282 0 0.9510529 -0.9510565 0 -0.309017 0.9781476 0 0.2079116 0.2079016 0 -0.9781497 -0.2079009 0 0.9781499 -0.9781475 0 -0.207912 0.9945219 0 0.1045285 0.1045321 0 -0.9945215 -0.1045323 0 0.9945215 -0.9945219 0 -0.1045284 1 0 0 0 0 -1 0 0 1 -1 0 0 0.406737 0 0.9135453 0.9135467 0 -0.4067339 -0.9135475 0 0.4067321 -0.4067366 0 -0.9135455 0.3090172 0 0.9510565 0.9510561 0 -0.3090182 -0.9510561 0 0.3090182 -0.3090172 0 -0.9510565 0.5000005 0 0.8660251 0.8660249 0 -0.5000008 -0.8660261 0 0.4999987 -0.5000001 0 -0.8660253 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9945219 0 -0.1045283 -0.1045321 0 -0.9945215 0.1045323 0 0.9945215 -0.9945219 0 0.1045284 -0.9510566 0 0.3090167 0.3090089 0 0.9510592 -0.3090203 0 -0.9510554 0.9510564 0 -0.3090173 -0.9135453 0 0.4067369 0.4067339 0 0.9135467 -0.4067436 0 -0.9135424 0.9135453 0 -0.406737 -0.8660251 0 0.5000006 0.4999957 0 0.8660279 -0.5000079 0 -0.8660208 0.8660257 0 -0.4999994</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_12_clockShape-tangents-array" count="296" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_12_clockShape-binormals" name="qt_gauge_tickmarks_12_clockShape-binormals">
+ <float_array id="qt_gauge_tickmarks_12_clockShape-binormals-array" count="888">0.9781477 0 0.2079113 0.2079019 0 -0.9781498 -0.207911 0 0.9781478 -0.9781476 0 -0.2079115 0.9945219 0 0.1045289 0.1045225 0 -0.9945226 -0.104523 0 0.9945225 -0.994522 0 -0.1045284 0.8090168 0 0.5877856 0.5877872 0 -0.8090157 -0.587777 0 0.8090231 -0.8090177 0 -0.5877844 0.8660252 0 0.5000005 0.4999916 0 -0.8660303 -0.5000029 0 0.8660238 -0.8660253 0 -0.5000002 0.9135454 0 0.406737 0.4067321 0 -0.9135475 -0.4067419 0 0.9135432 -0.9135454 0 -0.4067369 0.9510565 0 0.3090172 0.309011 0 -0.9510586 -0.3090196 0 0.9510557 -0.9510565 0 -0.3090175 0 0 1 1 0 0 -1 0 0 0 0 -1 0.1045283 0 0.9945219 0.9945226 0 -0.1045227 -0.9945226 0 0.1045227 -0.1045283 0 -0.9945219 0.207912 0 0.9781476 0.9781497 0 -0.2079021 -0.9781479 0 0.207911 -0.2079117 0 -0.9781477 -0.5877857 0 0.8090166 0.8090189 0 0.5877826 -0.8090173 0 -0.5877849 0.5877854 0 -0.8090169 -0.5000001 0 0.8660253 0.8660303 0 0.4999916 -0.8660226 0 -0.5000049 0.4999995 0 -0.8660258 -0.4067372 0 0.9135453 0.9135479 0 0.4067312 -0.9135424 0 -0.4067437 0.4067366 0 -0.9135455 -0.3090173 0 0.9510565 0.9510592 0 0.3090089 -0.9510555 0 -0.3090203 0.3090167 0 -0.9510566 -0.2079117 0 0.9781476 0.9781497 0 0.2079021 -0.9781478 0 -0.207911 0.207912 0 -0.9781476 -0.1045283 0 0.9945219 0.9945226 0 0.1045227 -0.9945226 0 -0.1045227 0.1045283 0 -0.9945219 -0.8090176 0 0.5877844 0.5877872 0 0.8090156 -0.5877832 0 -0.8090185 0.8090171 0 -0.5877852 -0.743145 0 0.6691303 0.6691278 0 0.7431474 -0.6691328 0 -0.7431428 0.743145 0 -0.6691304 -0.6691306 0 0.7431448 0.7431426 0 0.6691331 -0.7431405 0 -0.6691355 0.6691304 0 -0.743145 -0.9510563 0 0.3090177 0.3090117 0 0.9510583 -0.3090275 0 -0.9510531 0.9510567 0 -0.3090167 -0.9135457 0 0.4067362 0.4067321 0 0.9135475 -0.4067374 0 -0.9135452 0.9135452 0 -0.4067374 -0.8660251 0 0.5000007 0.4999916 0 0.8660303 -0.500008 0 -0.8660209 0.8660254 0 -0.5000001 0.5877846 0 0.8090175 0.8090157 0 -0.5877872 -0.8090202 0 0.587781 -0.5877851 0 -0.8090171 0.6691304 0 0.743145 0.7431426 0 -0.6691331 -0.7431405 0 0.6691355 -0.6691306 0 -0.7431448 0.743145 0 0.6691304 0.6691278 0 -0.7431474 -0.6691328 0 0.7431428 -0.743145 0 -0.6691303 -0.994522 0 -0.1045284 -0.1045225 0 0.9945226 0.1045225 0 -0.9945226 0.994522 0 0.1045284 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.9945219 0 0.1045289 0.104523 0 0.9945225 -0.104523 0 -0.9945225 0.9945219 0 -0.1045289 -0.9781474 0 0.2079126 0.2079028 0 0.9781495 -0.20791 0 -0.978148 0.9781476 0 -0.2079115 -0.9135454 0 -0.406737 -0.4067321 0 0.9135475 0.4067321 0 -0.9135475 0.9135454 0 0.406737 -0.9510567 0 -0.3090169 -0.3090096 0 0.9510589 0.309031 0 -0.951052 0.9510568 0 0.3090162 -0.9781476 0 -0.2079115 -0.2079211 0 0.9781456 0.207912 0 -0.9781476 0.9781477 0 0.2079113 -0.5000006 0 -0.8660251 -0.8660344 0 0.4999844 0.8660209 0 -0.5000079 0.4999998 0 0.8660256 -0.5877858 0 -0.8090166 -0.8090202 0 0.587781 0.809011 0 -0.5877934 0.5877849 0 0.8090173 -0.6691311 0 -0.7431444 -0.7431471 0 0.6691281 0.7431358 0 -0.6691407 0.6691309 0 0.7431446 -0.743145 0 -0.6691304 -0.6691278 0 0.7431474 0.6691281 0 -0.7431471 0.7431446 0 0.6691309 -0.8090167 0 -0.5877857 -0.5877841 0 0.8090179 0.5877894 0 -0.809014 0.8090168 0 0.5877856 -0.866026 0 -0.4999991 -0.5000049 0 0.8660226 0.4999967 0 -0.8660274 0.8660251 0 0.5000005 1 0 0 0 0 -1 0 0 1 -1 0 0 0.994522 0 -0.1045284 -0.104523 0 -0.9945226 0.104523 0 0.9945226 -0.994522 0 0.1045284 0.9781477 0 -0.2079118 -0.2079009 0 -0.9781499 0.207911 0 0.9781478 -0.9781476 0 0.207912 -0.207912 0 -0.9781476 -0.9781498 0 0.2079017 0.9781499 0 -0.2079009 0.2079116 0 0.9781476 -0.3090171 0 -0.9510566 -0.951056 0 0.3090189 0.951053 0 -0.3090283 0.309017 0 0.9510565 -0.4067364 0 -0.9135457 -0.9135475 0 0.4067321 0.9135467 0 -0.4067339 0.4067368 0 0.9135454 0.8090171 0 -0.5877852 -0.5877795 0 -0.8090212 0.5877787 0 0.8090218 -0.8090166 0 0.5877857 0.6691309 0 -0.7431446 -0.7431471 0 -0.6691281 0.7431358 0 0.6691408 -0.6691311 0 0.7431444 0.7431446 0 -0.6691309 -0.6691301 0 -0.7431452 0.6691328 0 0.7431428 -0.7431448 0 0.6691306 0.5000002 0 -0.8660253 -0.8660249 0 -0.500001 0.8660254 0 0.4999999 -0.5000006 0 0.8660251 0 0 -1 -1 0 0 1 0 0 0 0 1 1 0 0 0 0 -1 0 0 1 -1 0 0 0.8660254 0 0.5000001 0.4999991 0 -0.8660259 -0.5000034 0 0.8660235 -0.8660253 0 -0.5000004 0.8660251 0 -0.5000006 -0.5000019 0 -0.8660243 0.5000007 0 0.866025 -0.8660256 0 0.4999998 -0.4999999 0 0.8660255 0.8660251 0 0.5000006 -0.8660238 0 -0.5000029 0.5000004 0 -0.8660251 0 0 1 1 0 0 -1 0 0 0 0 -1 0.5000001 0 0.8660254 0.8660247 0 -0.5000014 -0.8660238 0 0.5000029 -0.5000002 0 -0.8660253 -0.8660257 0 -0.4999996 -0.5000024 0 0.866024 0.5000007 0 -0.8660251 0.8660251 0 0.5000006 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.8660256 0 0.4999999 0.5000014 0 0.8660247 -0.4999997 0 -0.8660257 0.8660251 0 -0.5000005 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.5000007 0 -0.8660251 -0.8660263 0 0.4999986 0.8660228 0 -0.5000047 0.5000002 0 0.8660253 0.5877854 0 -0.8090169 -0.8090156 0 -0.5877872 0.8090156 0 0.5877872 -0.5877854 0 0.8090169 0.4999998 0 -0.8660255 -0.8660291 0 -0.4999937 0.8660262 0 0.4999987 -0.5000007 0 0.8660251 0.4067364 0 -0.9135455 -0.9135435 0 -0.406741 0.9135396 0 0.4067498 -0.4067366 0 0.9135455 0.3090167 0 -0.9510567 -0.9510587 0 -0.3090103 0.951053 0 0.3090283 -0.309017 0 0.9510565 0.2079116 0 -0.9781476 -0.9781498 0 -0.2079017 0.9781499 0 0.2079009 -0.207912 0 0.9781476 0.1045285 0 -0.9945219 -0.9945215 0 -0.1045321 0.9945215 0 0.1045323 -0.1045284 0 0.994522 0 0 -1 -1 0 0 1 0 0 0 0 1 0.9135453 0 -0.406737 -0.4067339 0 -0.9135467 0.4067321 0 0.9135475 -0.9135455 0 0.4067366 0.9510565 0 -0.3090172 -0.3090182 0 -0.9510561 0.3090182 0 0.9510561 -0.9510565 0 0.3090172 0.8660251 0 -0.5000005 -0.5000008 0 -0.866025 0.4999987 0 0.8660262 -0.8660254 0 0.5000001 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.1045283 0 -0.9945219 -0.9945215 0 0.1045321 0.9945216 0 -0.1045323 0.1045284 0 0.9945219 0.3090167 0 0.9510566 0.9510592 0 -0.3090089 -0.9510555 0 0.3090203 -0.3090173 0 -0.9510565 0.4067369 0 0.9135454 0.9135467 0 -0.4067339 -0.9135424 0 0.4067437 -0.406737 0 -0.9135453 0.5000006 0 0.8660251 0.8660279 0 -0.4999957 -0.8660209 0 0.500008 -0.4999994 0 -0.8660258</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_12_clockShape-binormals-array" count="296" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_12_clockShape-map1" name="qt_gauge_tickmarks_12_clockShape-map1">
+ <float_array id="qt_gauge_tickmarks_12_clockShape-map1-array" count="592">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_12_clockShape-map1-array" count="296" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_12_clockShape-textangents">
+ <float_array id="qt_gauge_tickmarks_12_clockShape-textangents-array" count="888">-0.2079019 0 0.9781497 -0.2079064 0 0.9781486 -0.207911 0 0.9781477 -0.2079064 0 0.9781486 -0.1045225 0 0.9945225 -0.1045227 0 0.9945225 -0.1045229 0 0.9945225 -0.1045227 0 0.9945225 -0.5877872 0 0.8090156 -0.587782 0 0.8090193 -0.5877769 0 0.809023 -0.587782 0 0.8090193 -0.4999915 0 0.8660302 -0.4999972 0 0.866027 -0.5000028 0 0.8660237 -0.4999972 0 0.866027 -0.4067321 0 0.9135474 -0.4067369 0 0.9135453 -0.4067418 0 0.9135431 -0.4067369 0 0.9135453 -0.309011 0 0.9510584 -0.3090152 0 0.951057 -0.3090196 0 0.9510556 -0.3090152 0 0.951057 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9945225 0 0.1045227 -0.9945225 0 0.1045227 -0.9945225 0 0.1045227 -0.9945225 0 0.1045227 -0.9781496 0 0.2079021 -0.9781486 0 0.2079065 -0.9781477 0 0.207911 -0.9781486 0 0.2079065 -0.8090189 0 -0.5877826 -0.809018 0 -0.5877837 -0.8090172 0 -0.5877848 -0.809018 0 -0.5877837 -0.8660302 0 -0.4999915 -0.8660263 0 -0.4999982 -0.8660225 0 -0.5000049 -0.8660263 0 -0.4999982 -0.9135478 0 -0.4067312 -0.9135451 0 -0.4067374 -0.9135423 0 -0.4067436 -0.9135451 0 -0.4067374 -0.9510591 0 -0.3090088 -0.9510573 0 -0.3090146 -0.9510554 0 -0.3090203 -0.9510573 0 -0.3090146 -0.9781496 0 -0.2079021 -0.9781486 0 -0.2079065 -0.9781477 0 -0.207911 -0.9781486 0 -0.2079065 -0.9945225 0 -0.1045227 -0.9945225 0 -0.1045227 -0.9945225 0 -0.1045227 -0.9945225 0 -0.1045227 -0.5877872 0 -0.8090156 -0.5877851 0 -0.809017 -0.5877832 0 -0.8090184 -0.5877851 0 -0.809017 -0.6691277 0 -0.7431473 -0.6691303 0 -0.7431451 -0.6691327 0 -0.7431428 -0.6691303 0 -0.7431451 -0.7431425 0 -0.669133 -0.7431415 0 -0.6691342 -0.7431404 0 -0.6691354 -0.7431415 0 -0.6691342 -0.3090116 0 -0.9510582 -0.3090196 0 -0.9510556 -0.3090275 0 -0.951053 -0.3090196 0 -0.9510556 -0.4067321 0 -0.9135474 -0.4067347 0 -0.9135463 -0.4067374 0 -0.9135451 -0.4067347 0 -0.9135463 -0.4999915 0 -0.8660302 -0.4999997 0 -0.8660255 -0.5000079 0 -0.8660208 -0.4999997 0 -0.8660255 -0.8090156 0 0.5877872 -0.8090178 0 0.587784 -0.8090201 0 0.5877809 -0.8090178 0 0.587784 -0.7431425 0 0.669133 -0.7431415 0 0.6691342 -0.7431404 0 0.6691354 -0.7431415 0 0.6691342 -0.6691277 0 0.7431473 -0.6691303 0 0.7431451 -0.6691327 0 0.7431428 -0.6691303 0 0.7431451 0.1045225 0 -0.9945225 0.1045225 0 -0.9945225 0.1045225 0 -0.9945225 0.1045225 0 -0.9945225 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.1045229 0 -0.9945225 -0.1045229 0 -0.9945225 -0.1045229 0 -0.9945225 -0.1045229 0 -0.9945225 -0.2079028 0 -0.9781494 -0.2079064 0 -0.9781486 -0.20791 0 -0.9781479 -0.2079064 0 -0.9781486 0.4067321 0 -0.9135474 0.4067321 0 -0.9135474 0.4067321 0 -0.9135474 0.4067321 0 -0.9135474 0.3090096 0 -0.9510589 0.3090203 0 -0.9510554 0.309031 0 -0.9510519 0.3090203 0 -0.9510554 0.2079211 0 -0.9781455 0.2079165 0 -0.9781466 0.2079119 0 -0.9781474 0.2079165 0 -0.9781466 0.8660343 0 -0.4999844 0.8660275 0 -0.4999962 0.8660208 0 -0.5000079 0.8660275 0 -0.4999962 0.8090201 0 -0.5877809 0.8090156 0 -0.5877871 0.809011 0 -0.5877934 0.8090156 0 -0.5877871 0.7431471 0 -0.669128 0.7431414 0 -0.6691343 0.7431357 0 -0.6691406 0.7431414 0 -0.6691343 0.6691277 0 -0.7431473 0.6691279 0 -0.7431472 0.669128 0 -0.7431471 0.6691279 0 -0.7431472 0.587784 0 -0.8090178 0.5877867 0 -0.8090159 0.5877894 0 -0.8090139 0.5877867 0 -0.8090159 0.5000049 0 -0.8660225 0.5000008 0 -0.8660249 0.4999966 0 -0.8660273 0.5000008 0 -0.8660249 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.1045229 0 0.9945225 0.1045229 0 0.9945225 0.1045229 0 0.9945225 0.1045229 0 0.9945225 0.2079009 0 0.9781498 0.2079059 0 0.9781488 0.207911 0 0.9781477 0.2079059 0 0.9781488 0.9781497 0 -0.2079016 0.9781498 0 -0.2079013 0.9781498 0 -0.2079009 0.9781498 0 -0.2079013 0.9510559 0 -0.3090189 0.9510543 0 -0.3090236 0.9510528 0 -0.3090282 0.9510543 0 -0.3090236 0.9135474 0 -0.4067321 0.913547 0 -0.406733 0.9135466 0 -0.4067339 0.913547 0 -0.406733 0.5877795 0 0.8090211 0.587779 0 0.8090214 0.5877786 0 0.8090217 0.587779 0 0.8090214 0.7431471 0 0.669128 0.7431414 0 0.6691343 0.7431357 0 0.6691406 0.7431414 0 0.6691343 0.6691301 0 0.7431452 0.6691314 0 0.743144 0.6691327 0 0.7431428 0.6691314 0 0.743144 0.8660248 0 0.5000009 0.8660251 0 0.5000004 0.8660254 0 0.4999999 0.8660251 0 0.5000004 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 -0.4999991 0 0.8660259 -0.5000012 0 0.8660247 -0.5000033 0 0.8660234 -0.5000012 0 0.8660247 0.5000018 0 0.8660243 0.5000013 0 0.8660246 0.5000006 0 0.866025 0.5000013 0 0.8660246 -0.866025 0 -0.5000005 -0.8660244 0 -0.5000017 -0.8660237 0 -0.5000028 -0.8660244 0 -0.5000017 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.8660246 0 0.5000013 -0.8660241 0 0.5000021 -0.8660237 0 0.5000028 -0.8660241 0 0.5000021 0.5000024 0 -0.866024 0.5000015 0 -0.8660244 0.5000006 0 -0.866025 0.5000015 0 -0.8660244 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.5000013 0 -0.8660246 -0.5000005 0 -0.8660251 -0.4999996 0 -0.8660256 -0.5000005 0 -0.8660251 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.8660262 0 -0.4999985 0.8660243 0 -0.5000015 0.8660226 0 -0.5000046 0.8660243 0 -0.5000015 0.8090156 0 0.5877872 0.8090156 0 0.5877872 0.8090156 0 0.5877872 0.8090156 0 0.5877872 0.866029 0 0.4999936 0.8660275 0 0.4999962 0.8660261 0 0.4999987 0.8660275 0 0.4999962 0.9135435 0 0.4067409 0.9135415 0 0.4067453 0.9135395 0 0.4067498 0.9135415 0 0.4067453 0.9510586 0 0.3090102 0.9510558 0 0.3090193 0.9510528 0 0.3090282 0.9510558 0 0.3090193 0.9781497 0 0.2079016 0.9781498 0 0.2079013 0.9781498 0 0.2079009 0.9781498 0 0.2079013 0.9945214 0 0.1045321 0.9945214 0 0.1045322 0.9945214 0 0.1045322 0.9945214 0 0.1045322 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.4067339 0 0.9135466 0.406733 0 0.913547 0.4067321 0 0.9135474 0.406733 0 0.913547 0.3090182 0 0.9510561 0.3090182 0 0.9510561 0.3090182 0 0.9510561 0.3090182 0 0.9510561 0.5000007 0 0.8660249 0.4999997 0 0.8660255 0.4999987 0 0.8660261 0.4999997 0 0.8660255 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9945214 0 -0.1045321 0.9945214 0 -0.1045322 0.9945214 0 -0.1045322 0.9945214 0 -0.1045322 -0.9510591 0 0.3090088 -0.9510573 0 0.3090146 -0.9510554 0 0.3090203 -0.9510573 0 0.3090146 -0.9135466 0 0.4067339 -0.9135445 0 0.4067387 -0.9135423 0 0.4067436 -0.9135445 0 0.4067387 -0.8660278 0 0.4999957 -0.8660243 0 0.5000017 -0.8660208 0 0.5000079 -0.8660243 0 0.5000017</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_12_clockShape-textangents-array" count="296" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_12_clockShape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_12_clockShape-texbinormals-array" count="888">0.9781498 0 0.2079019 0.9781488 0 0.2079064 0.9781479 0 0.207911 0.9781488 0 0.2079064 0.9945226 0 0.1045225 0.9945225 0 0.1045227 0.9945225 0 0.104523 0.9945225 0 0.1045227 0.8090156 0 0.5877872 0.8090194 0 0.587782 0.8090231 0 0.587777 0.8090194 0 0.587782 0.8660303 0 0.4999916 0.8660271 0 0.4999973 0.8660238 0 0.5000029 0.8660271 0 0.4999973 0.9135476 0 0.4067321 0.9135454 0 0.406737 0.9135432 0 0.4067419 0.9135454 0 0.406737 0.9510586 0 0.309011 0.9510571 0 0.3090153 0.9510557 0 0.3090196 0.9510571 0 0.3090152 0 0 1 0 0 1 0 0 1 0 0 1 0.1045227 0 0.9945226 0.1045227 0 0.9945225 0.1045227 0 0.9945226 0.1045227 0 0.9945225 0.2079021 0 0.9781497 0.2079066 0 0.9781488 0.207911 0 0.9781478 0.2079066 0 0.9781488 -0.5877826 0 0.809019 -0.5877838 0 0.8090181 -0.5877849 0 0.8090172 -0.5877838 0 0.8090181 -0.4999916 0 0.8660303 -0.4999983 0 0.8660265 -0.5000049 0 0.8660226 -0.4999983 0 0.8660265 -0.4067312 0 0.9135479 -0.4067374 0 0.9135451 -0.4067436 0 0.9135424 -0.4067374 0 0.9135452 -0.3090088 0 0.9510592 -0.3090146 0 0.9510574 -0.3090203 0 0.9510555 -0.3090146 0 0.9510573 -0.2079021 0 0.9781497 -0.2079066 0 0.9781487 -0.207911 0 0.9781478 -0.2079066 0 0.9781487 -0.1045227 0 0.9945226 -0.1045227 0 0.9945225 -0.1045227 0 0.9945226 -0.1045227 0 0.9945225 -0.8090156 0 0.5877872 -0.8090171 0 0.5877852 -0.8090186 0 0.5877832 -0.8090171 0 0.5877852 -0.7431474 0 0.6691278 -0.7431451 0 0.6691303 -0.7431429 0 0.6691328 -0.7431451 0 0.6691303 -0.6691331 0 0.7431427 -0.6691343 0 0.7431415 -0.6691355 0 0.7431405 -0.6691343 0 0.7431415 -0.9510583 0 0.3090117 -0.9510558 0 0.3090196 -0.9510532 0 0.3090275 -0.9510557 0 0.3090196 -0.9135475 0 0.4067321 -0.9135464 0 0.4067348 -0.9135451 0 0.4067374 -0.9135463 0 0.4067348 -0.8660303 0 0.4999916 -0.8660256 0 0.4999998 -0.8660209 0 0.5000079 -0.8660256 0 0.4999998 0.5877872 0 0.8090156 0.5877841 0 0.809018 0.587781 0 0.8090202 0.5877841 0 0.809018 0.6691331 0 0.7431426 0.6691343 0 0.7431416 0.6691355 0 0.7431405 0.6691343 0 0.7431416 0.7431474 0 0.6691278 0.7431451 0 0.6691303 0.7431429 0 0.6691328 0.7431451 0 0.6691303 -0.9945226 0 -0.1045225 -0.9945226 0 -0.1045225 -0.9945226 0 -0.1045225 -0.9945226 0 -0.1045225 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.9945226 0 0.104523 -0.9945225 0 0.104523 -0.9945226 0 0.104523 -0.9945225 0 0.104523 -0.9781496 0 0.2079028 -0.9781488 0 0.2079064 -0.978148 0 0.20791 -0.9781488 0 0.2079064 -0.9135476 0 -0.4067321 -0.9135476 0 -0.4067321 -0.9135476 0 -0.4067321 -0.9135476 0 -0.4067321 -0.951059 0 -0.3090096 -0.9510555 0 -0.3090203 -0.951052 0 -0.309031 -0.9510555 0 -0.3090203 -0.9781457 0 -0.2079211 -0.9781467 0 -0.2079166 -0.9781476 0 -0.207912 -0.9781467 0 -0.2079166 -0.4999844 0 -0.8660344 -0.4999962 0 -0.8660277 -0.5000079 0 -0.8660209 -0.4999962 0 -0.8660277 -0.5877809 0 -0.8090202 -0.5877872 0 -0.8090157 -0.5877934 0 -0.8090111 -0.5877872 0 -0.8090157 -0.6691281 0 -0.7431471 -0.6691344 0 -0.7431415 -0.6691407 0 -0.7431358 -0.6691344 0 -0.7431415 -0.7431474 0 -0.6691278 -0.7431473 0 -0.669128 -0.7431472 0 -0.6691281 -0.7431473 0 -0.669128 -0.8090179 0 -0.587784 -0.809016 0 -0.5877867 -0.809014 0 -0.5877894 -0.809016 0 -0.5877867 -0.8660226 0 -0.5000049 -0.866025 0 -0.5000008 -0.8660274 0 -0.4999967 -0.866025 0 -0.5000008 1 0 0 1 0 0 1 0 0 1 0 0 0.9945225 0 -0.104523 0.9945226 0 -0.104523 0.9945225 0 -0.104523 0.9945226 0 -0.104523 0.97815 0 -0.2079009 0.9781489 0 -0.2079059 0.9781477 0 -0.207911 0.9781488 0 -0.2079059 -0.2079017 0 -0.9781498 -0.2079013 0 -0.9781499 -0.2079009 0 -0.97815 -0.2079013 0 -0.9781499 -0.3090189 0 -0.951056 -0.3090236 0 -0.9510545 -0.3090283 0 -0.951053 -0.3090236 0 -0.9510545 -0.4067321 0 -0.9135476 -0.406733 0 -0.9135471 -0.4067339 0 -0.9135467 -0.406733 0 -0.9135472 0.8090212 0 -0.5877795 0.8090215 0 -0.5877791 0.8090218 0 -0.5877787 0.8090215 0 -0.5877791 0.6691281 0 -0.7431472 0.6691344 0 -0.7431414 0.6691408 0 -0.7431358 0.6691344 0 -0.7431414 0.7431453 0 -0.6691302 0.7431441 0 -0.6691315 0.7431429 0 -0.6691328 0.743144 0 -0.6691315 0.500001 0 -0.8660249 0.5000004 0 -0.8660252 0.4999999 0 -0.8660254 0.5000004 0 -0.8660252 0 0 -1 0 0 -1 0 0 -1 0 0 -1 1 0 0 1 0 0 1 0 0 1 0 0 0.866026 0 0.4999991 0.8660248 0 0.5000013 0.8660235 0 0.5000034 0.8660247 0 0.5000012 0.8660244 0 -0.5000019 0.8660247 0 -0.5000013 0.8660251 0 -0.5000007 0.8660247 0 -0.5000013 -0.5000006 0 0.8660251 -0.5000017 0 0.8660245 -0.5000029 0 0.8660238 -0.5000017 0 0.8660244 0 0 1 0 0 1 0 0 1 0 0 1 0.5000014 0 0.8660247 0.5000021 0 0.8660243 0.5000029 0 0.8660238 0.5000021 0 0.8660243 -0.8660241 0 -0.5000024 -0.8660246 0 -0.5000015 -0.8660251 0 -0.5000007 -0.8660246 0 -0.5000015 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.8660247 0 0.5000014 -0.8660251 0 0.5000005 -0.8660256 0 0.4999996 -0.8660251 0 0.5000005 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.4999986 0 -0.8660263 -0.5000016 0 -0.8660244 -0.5000047 0 -0.8660228 -0.5000016 0 -0.8660244 0.5877872 0 -0.8090156 0.5877872 0 -0.8090156 0.5877872 0 -0.8090156 0.5877872 0 -0.8090156 0.4999937 0 -0.8660291 0.4999962 0 -0.8660276 0.4999987 0 -0.8660262 0.4999962 0 -0.8660277 0.406741 0 -0.9135436 0.4067454 0 -0.9135416 0.4067498 0 -0.9135396 0.4067454 0 -0.9135416 0.3090103 0 -0.9510587 0.3090193 0 -0.9510559 0.3090282 0 -0.9510529 0.3090193 0 -0.9510558 0.2079017 0 -0.9781498 0.2079013 0 -0.9781499 0.2079009 0 -0.97815 0.2079013 0 -0.9781499 0.1045321 0 -0.9945216 0.1045322 0 -0.9945216 0.1045323 0 -0.9945215 0.1045322 0 -0.9945216 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.9135467 0 -0.4067339 0.9135471 0 -0.406733 0.9135475 0 -0.4067321 0.9135472 0 -0.4067331 0.9510562 0 -0.3090182 0.9510562 0 -0.3090182 0.9510562 0 -0.3090182 0.9510562 0 -0.3090182 0.866025 0 -0.5000008 0.8660256 0 -0.4999998 0.8660262 0 -0.4999987 0.8660256 0 -0.4999998 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.1045321 0 -0.9945216 -0.1045322 0 -0.9945216 -0.1045323 0 -0.9945216 -0.1045322 0 -0.9945215 0.3090089 0 0.9510592 0.3090146 0 0.9510573 0.3090203 0 0.9510555 0.3090146 0 0.9510574 0.4067339 0 0.9135467 0.4067388 0 0.9135445 0.4067437 0 0.9135424 0.4067388 0 0.9135446 0.4999957 0 0.8660279 0.5000018 0 0.8660244 0.5000079 0 0.8660209 0.5000018 0 0.8660244</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_12_clockShape-texbinormals-array" count="296" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_12_clockShape-vertices" name="qt_gauge_tickmarks_12_clockShape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_12_clockShape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_12_clockShape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_12_clockShape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_12_clockShape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="148">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_12_clockShape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_12_clockShape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_12_clockShape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_12_clockShape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66 68 68 68 69 69 69 70 71 71 70 71 71 69 69 69 71 70 70 72 72 72 73 73 73 74 75 75 74 75 75 73 73 73 75 74 74 76 76 76 77 77 77 78 79 79 78 79 79 77 77 77 79 78 78 80 80 80 81 81 81 82 83 83 82 83 83 81 81 81 83 82 82 84 84 84 85 85 85 86 87 87 86 87 87 85 85 85 87 86 86 88 88 88 89 89 89 90 91 91 90 91 91 89 89 89 91 90 90 92 92 92 93 93 93 94 95 95 94 95 95 93 93 93 95 94 94 96 96 96 97 97 97 98 99 99 98 99 99 97 97 97 99 98 98 100 100 100 101 101 101 102 103 103 102 103 103 101 101 101 103 102 102 104 104 104 105 105 105 106 107 107 106 107 107 105 105 105 107 106 106 108 108 108 109 109 109 110 111 111 110 111 111 109 109 109 111 110 110 112 112 112 113 113 113 114 115 115 114 115 115 113 113 113 115 114 114 116 116 116 117 117 117 118 119 119 118 119 119 117 117 117 119 118 118 120 120 120 121 121 121 122 123 123 122 123 123 121 121 121 123 122 122 124 124 124 125 125 125 126 127 127 126 127 127 125 125 125 127 126 126 128 128 128 129 129 129 130 131 131 130 131 131 129 129 129 131 130 130 132 132 132 133 133 133 134 135 135 134 135 135 133 133 133 135 134 134 136 136 136 137 137 137 138 139 139 138 139 139 137 137 137 139 138 138 140 140 140 141 141 141 142 143 143 142 143 143 141 141 141 143 142 142 144 144 144 145 145 145 146 147 147 146 147 147 145 145 145 147 146 146 148 148 148 149 149 149 150 151 151 150 151 151 149 149 149 151 150 150 152 152 152 153 153 153 154 155 155 154 155 155 153 153 153 155 154 154 156 156 156 157 157 157 158 159 159 158 159 159 157 157 157 159 158 158 160 160 160 161 161 161 162 163 163 162 163 163 161 161 161 163 162 162 164 164 164 165 165 165 166 167 167 166 167 167 165 165 165 167 166 166 168 168 168 169 169 169 170 171 171 170 171 171 169 169 169 171 170 170 172 172 172 173 173 173 174 175 175 174 175 175 173 173 173 175 174 174 176 176 176 177 177 177 178 179 179 178 179 179 177 177 177 179 178 178 180 180 180 181 181 181 182 183 183 182 183 183 181 181 181 183 182 182 184 184 184 185 185 185 186 187 187 186 187 187 185 185 185 187 186 186 188 188 188 189 189 189 190 191 191 190 191 191 189 189 189 191 190 190 192 192 192 193 193 193 194 195 195 194 195 195 193 193 193 195 194 194 196 196 196 197 197 197 198 199 199 198 199 199 197 197 197 199 198 198 200 200 200 201 201 201 202 203 203 202 203 203 201 201 201 203 202 202 204 204 204 205 205 205 206 207 207 206 207 207 205 205 205 207 206 206 208 208 208 209 209 209 210 211 211 210 211 211 209 209 209 211 210 210 212 212 212 213 213 213 214 215 215 214 215 215 213 213 213 215 214 214 216 216 216 217 217 217 218 219 219 218 219 219 217 217 217 219 218 218 220 220 220 221 221 221 222 223 223 222 223 223 221 221 221 223 222 222 224 224 224 225 225 225 226 227 227 226 227 227 225 225 225 227 226 226 228 228 228 229 229 229 230 231 231 230 231 231 229 229 229 231 230 230 232 232 232 233 233 233 234 235 235 234 235 235 233 233 233 235 234 234 236 236 236 237 237 237 238 239 239 238 239 239 237 237 237 239 238 238 240 240 240 241 241 241 242 243 243 242 243 243 241 241 241 243 242 242 244 244 244 245 245 245 246 247 247 246 247 247 245 245 245 247 246 246 248 248 248 249 249 249 250 251 251 250 251 251 249 249 249 251 250 250 252 252 252 253 253 253 254 255 255 254 255 255 253 253 253 255 254 254 256 256 256 257 257 257 258 259 259 258 259 259 257 257 257 259 258 258 260 260 260 261 261 261 262 263 263 262 263 263 261 261 261 263 262 262 264 264 264 265 265 265 266 267 267 266 267 267 265 265 265 267 266 266 268 268 268 269 269 269 270 271 271 270 271 271 269 269 269 271 270 270 272 272 272 273 273 273 274 275 275 274 275 275 273 273 273 275 274 274 276 276 276 277 277 277 278 279 279 278 279 279 277 277 277 279 278 278 280 280 280 281 281 281 282 283 283 282 283 283 281 281 281 283 282 282 284 284 284 285 285 285 286 287 287 286 287 287 285 285 285 287 286 286 288 288 288 289 289 289 290 291 291 290 291 291 289 289 289 291 290 290 292 292 292 293 293 293 294 295 295 294 295 295 293 293 293 295 294 294</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_12_clockShape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_12_clock" name="qt_gauge_tickmarks_12_clock" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_12_clockShape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_12_clock</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_240_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_240_1.dae
new file mode 100644
index 0000000..24a2b14
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_240_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:26:51</created>
+ <modified>2018-03-08T09:26:51</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_240Shape" name="qt_gauge_tickmarks_240Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_240Shape-positions" name="qt_gauge_tickmarks_240Shape-positions">
+ <float_array id="qt_gauge_tickmarks_240Shape-positions-array" count="456">10.44225 0 -0.1186501 10.44225 0 0.08135016 13.44225 0 -0.1186496 13.44225 0 0.08135064 9.852877 0 -3.488458 9.917164 0 -3.299072 12.69367 0 -4.452776 12.75795 0 -4.26339 -7.131246 0 -7.781098 -6.83051 0 -8.044838 -7.790592 0 -8.53294 -7.489856 0 -8.796677 -8.301235 0 -6.525177 -8.047478 0 -6.834381 -9.074245 0 -7.159571 -8.820489 0 -7.468775 -9.251014 0 -5.095445 -9.051013 0 -5.441854 -10.11704 0 -5.595445 -9.917039 0 -5.941854 -7.411658 0 7.476682 -7.553078 0 7.33526 -9.532978 0 9.598001 -9.674399 0 9.456581 -0.8442657 0 -10.48963 -0.6446939 0 -10.50271 -1.040475 0 -13.48321 -0.8409032 0 -13.49629 -4.168311 0 -9.681117 -3.983535 0 -9.757654 -5.316361 0 -12.45276 -5.131585 0 -12.52929 -7.056062 0 -7.847033 -6.905694 0 -7.978904 -9.0341 0 -10.10255 -8.883732 0 -10.23442 -9.201014 0 -5.182048 -9.101013 0 -5.355252 -11.79909 0 -6.682046 -11.69909 0 -6.855253 -10.3755 0 -1.96902 -10.33648 0 -2.165178 -13.31786 0 -2.554291 -13.27884 0 -2.750448 -10.45487 0 1.451019 -10.48097 0 1.25273 -13.4292 0 1.842598 -13.45531 0 1.644309 -10.55867 0 -0.1623084 -10.54558 0 -0.562093 -11.55813 0 -0.1950266 -11.54505 0 -0.5948121 -10.44181 0 1.550165 -10.49402 0 1.153586 -11.43326 0 1.680689 -11.48547 0 1.284112 -9.95521 0 -3.530095 -9.814309 0 -3.904458 -10.89112 0 -3.882344 -10.75021 0 -4.256707 -10.39501 0 -1.87094 -10.31697 0 -2.263255 -11.3758 0 -2.066031 -11.29776 0 -2.458345 9.820732 0 -3.583151 9.949306 0 -3.204378 10.76766 0 -3.904589 10.89624 0 -3.525818 9.108147 0 -5.1447 9.296706 0 -4.791931 9.990068 0 -5.616096 10.17863 0 -5.263329 8.150711 0 -6.569315 8.394216 0 -6.251975 8.944065 0 -7.178078 9.187569 0 -6.860735 -10.04756 0 3.220726 -10.16368 0 2.837951 -11.0045 0 3.511011 -11.12062 0 3.128236 8.211587 0 -6.489981 8.333339 0 -6.331309 10.59165 0 -8.316266 10.7134 0 -8.157593 5.692594 0 -8.804638 5.858888 0 -8.693523 7.359304 0 -11.29905 7.525599 0 -11.18793 2.563261 0 -10.18675 2.756446 0 -10.13499 3.339718 0 -13.08453 3.532903 0 -13.03277 2.466668 0 -10.21263 2.853038 0 -10.10911 2.725487 0 -11.17856 3.111857 0 -11.07503 0.7723961 0 -10.48769 1.17047 0 -10.44849 0.8704133 0 -11.48288 1.268487 0 -11.44367 -0.9440516 0 -10.48309 -0.5449079 0 -10.50925 -1.009455 0 -11.48095 -0.6103112 0 -11.50711 -9.430681 0 4.715069 -9.519138 0 4.535694 -12.1213 0 6.041934 -12.20976 0 5.86256 10.44225 0 -0.2186491 10.44225 0 0.1813501 11.44225 0 -0.2186496 11.44225 0 0.1813496 10.26943 0 -1.926382 10.33459 0 -1.531724 11.25607 0 -2.089278 11.32123 0 -1.69462 -9.386453 0 4.804756 -9.563368 0 4.446007 -10.28333 0 5.247045 -10.46024 0 4.888295 -7.340946 0 7.547392 -7.62379 0 7.264549 -8.048054 0 8.254499 -8.330896 0 7.971656 -8.476142 0 6.259935 -8.709133 0 5.934797 -9.288987 0 6.842413 -9.52198 0 6.517274 6.974 0 -7.818941 7.265945 0 -7.545504 7.657592 0 -8.548805 7.949537 0 -8.275368 5.609447 0 -8.860195 5.942035 0 -8.637967 6.165016 0 -9.691664 6.497604 0 -9.469437 4.093504 0 -9.665261 4.45785 0 -9.500179 4.506211 0 -10.57613 4.870557 0 -10.41104 -2.636823 0 -10.19894 -2.247272 0 -10.28977 -2.863899 0 -11.17282 -2.474349 0 -11.26365 -4.260699 0 -9.642849 -3.891147 0 -9.795921 -4.643382 0 -10.56673 -4.27383 0 -10.7198 -5.7723 0 -8.829659 -5.432619 0 -9.040885 -6.300367 0 -9.678861 -5.960687 0 -9.890089</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_240Shape-positions-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_240Shape-normals" name="qt_gauge_tickmarks_240Shape-normals">
+ <float_array id="qt_gauge_tickmarks_240Shape-normals-array" count="456">0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_240Shape-normals-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_240Shape-tangents" name="qt_gauge_tickmarks_240Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_240Shape-tangents-array" count="456">0 0 1 1 0 0 -1 0 0 0 0 -1 0.3214395 0 0.9469301 0.946931 0 -0.3214369 -0.9469314 0 0.3214358 -0.3214393 0 -0.9469302 0.7518404 0 -0.6593451 -0.6593482 0 -0.7518378 0.6593435 0 0.7518418 -0.7518394 0 0.6593463 0.6343936 0 -0.7730102 -0.7730102 0 -0.6343936 0.7730113 0 0.6343922 -0.6343932 0 0.7730106 0.4999998 0 -0.8660255 -0.8660241 0 -0.5000023 0.8660241 0 0.5000023 -0.4999998 0 0.8660255 -0.7071066 0 -0.7071069 -0.7071115 0 0.707102 0.7071044 0 -0.7071092 0.7071066 0 0.7071069 0.9978589 0 -0.0654031 -0.06539822 0 -0.9978592 0.06539824 0 0.9978592 -0.9978589 0 0.06540312 0.9238795 0 -0.3826834 -0.3826846 0 -0.923879 0.3826724 0 0.9238841 -0.9238794 0 0.3826837 0.7518397 0 -0.6593459 -0.659352 0 -0.7518344 0.6593468 0 0.7518389 -0.7518396 0 0.659346 0.4999996 0 -0.8660257 -0.8660238 0 -0.5000029 0.8660294 0 0.4999931 -0.5000002 0 0.8660253 0.1950906 0 -0.9807852 -0.9807868 0 -0.1950829 0.9807846 0 0.1950936 -0.1950902 0 0.9807853 -0.1305264 0 -0.9914448 -0.9914451 0 0.1305247 0.9914445 0 -0.1305291 0.1305262 0 0.9914449 0.03271823 0 -0.9994646 -0.9994645 0 -0.03272305 0.9994647 0 0.03271583 -0.03271909 0 0.9994646 -0.1305246 0 -0.9914451 -0.9914445 0 0.1305291 0.991445 0 -0.1305249 0.1305262 0 0.9914449 0.3522496 0 -0.9359061 -0.9359055 0 -0.3522511 0.9359056 0 0.3522509 -0.3522498 0 0.935906 0.1950904 0 -0.9807853 -0.9807857 0 -0.1950882 0.9807857 0 0.1950883 -0.1950903 0 0.9807853 0.3214388 0 0.9469304 0.9469314 0 -0.3214356 -0.9469296 0 0.321441 -0.3214395 0 -0.9469301 0.4713967 0 0.8819213 0.8819203 0 -0.4713985 -0.8819211 0 0.4713971 -0.4713974 0 -0.8819209 0.6087619 0 0.793353 0.7933521 0 -0.6087631 -0.7933554 0 0.6087587 -0.6087609 0 -0.7933538 -0.2902848 0 -0.9569403 -0.9569403 0 0.2902848 0.9569409 0 -0.2902828 0.2902853 0 0.9569402 0.6087616 0 0.7933532 0.7933559 0 -0.6087581 -0.7933617 0 0.6087505 -0.6087614 0 -0.7933534 0.8314696 0 0.5555703 0.5555714 0 -0.8314688 -0.5555681 0 0.831471 -0.8314697 0 -0.5555702 0.9659258 0 0.258819 0.2588087 0 -0.9659286 -0.2588131 0 0.9659274 -0.9659258 0 -0.2588191 0.9659258 0 0.258819 0.2588155 0 -0.9659268 -0.2588153 0 0.9659268 -0.9659258 0 -0.2588192 0.9951847 0 0.09801705 0.09801628 0 -0.9951848 -0.09802099 0 0.9951843 -0.9951847 0 -0.09801729 0.9978589 0 -0.06540316 -0.06539823 0 -0.9978592 0.06540298 0 0.9978589 -0.9978589 0 0.06540309 -0.4422885 0 -0.8968728 -0.8968741 0 0.4422859 0.8968737 0 -0.4422868 0.4422887 0 0.8968727 0 0 1 1 0 0 -1 0 0 0 0 -1 0.1628957 0 0.9866433 0.9866435 0 -0.1628943 -0.9866439 0 0.1628921 -0.1628962 0 -0.9866432 -0.4422882 0 -0.896873 -0.896873 0 0.4422883 0.8968741 0 -0.4422859 0.4422882 0 0.896873 -0.7071065 0 -0.707107 -0.7071062 0 0.7071074 0.7071074 0 -0.7071062 0.707107 0 0.7071065 -0.5824786 0 -0.812846 -0.8128464 0 0.5824781 0.812845 0 -0.5824801 0.5824771 0 0.8128471 0.7298641 0 0.6835923 0.6835921 0 -0.7298643 -0.6835933 0 0.7298631 -0.7298641 0 -0.6835923 0.8314696 0 0.5555703 0.5555698 0 -0.8314699 -0.5555681 0 0.831471 -0.8314699 0 -0.5555699 0.9108639 0 0.4127069 0.4127053 0 -0.9108646 -0.4127053 0 0.9108646 -0.9108639 0 -0.4127069 0.9738771 0 -0.2270756 -0.2270792 0 -0.9738763 0.2270725 0 0.9738779 -0.9738769 0 0.2270765 0.9238796 0 -0.3826833 -0.3826812 0 -0.9238805 0.3826814 0 0.9238804 -0.9238795 0 0.3826835 0.8492023 0 -0.5280677 -0.5280663 0 -0.8492031 0.5280703 0 0.8492007 -0.8492026 0 0.5280672</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_240Shape-tangents-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_240Shape-binormals" name="qt_gauge_tickmarks_240Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_240Shape-binormals-array" count="456">1 0 0 0 0 -1 0 0 1 -1 0 0 0.9469301 0 -0.3214395 -0.3214369 0 -0.9469311 0.3214358 0 0.9469315 -0.9469302 0 0.3214393 -0.6593451 0 -0.7518405 -0.7518378 0 0.6593481 0.7518418 0 -0.6593435 0.6593463 0 0.7518394 -0.7730102 0 -0.6343936 -0.6343936 0 0.7730102 0.6343922 0 -0.7730114 0.7730106 0 0.6343932 -0.8660256 0 -0.4999998 -0.5000023 0 0.8660241 0.5000023 0 -0.8660241 0.8660256 0 0.4999998 -0.7071069 0 0.7071066 0.707102 0 0.7071115 -0.7071092 0 -0.7071044 0.7071069 0 -0.7071066 -0.0654031 0 -0.9978589 -0.9978592 0 0.06539822 0.9978592 0 -0.06539824 0.06540312 0 0.9978589 -0.3826834 0 -0.9238796 -0.923879 0 0.3826846 0.9238841 0 -0.3826724 0.3826838 0 0.9238794 -0.6593459 0 -0.7518398 -0.7518345 0 0.6593521 0.7518389 0 -0.6593468 0.659346 0 0.7518396 -0.8660257 0 -0.4999996 -0.5000029 0 0.8660238 0.4999931 0 -0.8660294 0.8660254 0 0.5000002 -0.9807853 0 -0.1950906 -0.1950829 0 0.9807868 0.1950936 0 -0.9807847 0.9807853 0 0.1950902 -0.9914449 0 0.1305264 0.1305247 0 0.9914451 -0.1305291 0 -0.9914445 0.9914449 0 -0.1305262 -0.9994647 0 -0.03271823 -0.03272305 0 0.9994645 0.03271583 0 -0.9994647 0.9994646 0 0.03271909 -0.9914451 0 0.1305246 0.1305291 0 0.9914445 -0.1305249 0 -0.9914451 0.9914449 0 -0.1305262 -0.9359061 0 -0.3522496 -0.3522511 0 0.9359055 0.3522509 0 -0.9359056 0.9359061 0 0.3522498 -0.9807853 0 -0.1950904 -0.1950883 0 0.9807858 0.1950883 0 -0.9807857 0.9807853 0 0.1950903 0.9469303 0 -0.3214388 -0.3214357 0 -0.9469315 0.321441 0 0.9469297 -0.9469302 0 0.3214395 0.8819213 0 -0.4713967 -0.4713985 0 -0.8819205 0.4713972 0 0.8819212 -0.8819209 0 0.4713975 0.793353 0 -0.6087619 -0.6087631 0 -0.7933521 0.6087587 0 0.7933555 -0.7933537 0 0.6087609 -0.9569404 0 0.2902848 0.2902848 0 0.9569404 -0.2902828 0 -0.956941 0.9569402 0 -0.2902853 0.7933532 0 -0.6087616 -0.6087582 0 -0.7933559 0.6087505 0 0.7933617 -0.7933534 0 0.6087614 0.5555703 0 -0.8314696 -0.8314689 0 -0.5555714 0.831471 0 0.5555681 -0.5555702 0 0.8314697 0.258819 0 -0.9659259 -0.9659286 0 -0.2588087 0.9659274 0 0.2588131 -0.2588191 0 0.9659258 0.258819 0 -0.9659259 -0.9659268 0 -0.2588155 0.9659268 0 0.2588153 -0.2588193 0 0.9659259 0.09801705 0 -0.9951848 -0.9951848 0 -0.09801628 0.9951844 0 0.09802099 -0.09801729 0 0.9951847 -0.06540316 0 -0.9978589 -0.9978592 0 0.06539822 0.9978589 0 -0.06540298 0.0654031 0 0.9978589 -0.8968729 0 0.4422886 0.4422859 0 0.8968742 -0.4422868 0 -0.8968737 0.8968728 0 -0.4422887 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9866434 0 -0.1628957 -0.1628942 0 -0.9866436 0.1628921 0 0.986644 -0.9866433 0 0.1628962 -0.896873 0 0.4422882 0.4422882 0 0.8968729 -0.4422859 0 -0.8968742 0.896873 0 -0.4422882 -0.7071071 0 0.7071066 0.7071074 0 0.7071062 -0.7071062 0 -0.7071074 0.7071066 0 -0.7071071 -0.812846 0 0.5824786 0.582478 0 0.8128464 -0.5824801 0 -0.812845 0.8128471 0 -0.5824771 0.6835923 0 -0.7298641 -0.7298643 0 -0.6835921 0.7298632 0 0.6835933 -0.6835923 0 0.7298641 0.5555703 0 -0.8314696 -0.83147 0 -0.5555698 0.831471 0 0.5555681 -0.5555699 0 0.8314698 0.4127069 0 -0.9108639 -0.9108647 0 -0.4127053 0.9108647 0 0.4127053 -0.4127069 0 0.9108639 -0.2270757 0 -0.9738772 -0.9738763 0 0.2270792 0.9738778 0 -0.2270725 0.2270765 0 0.973877 -0.3826833 0 -0.9238797 -0.9238805 0 0.3826812 0.9238804 0 -0.3826814 0.3826835 0 0.9238796 -0.5280676 0 -0.8492023 -0.8492032 0 0.5280663 0.8492007 0 -0.5280703 0.5280672 0 0.8492027</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_240Shape-binormals-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_240Shape-map1" name="qt_gauge_tickmarks_240Shape-map1">
+ <float_array id="qt_gauge_tickmarks_240Shape-map1-array" count="304">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_240Shape-map1-array" count="152" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_240Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_240Shape-textangents-array" count="456">0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.3214368 0 0.9469309 0.3214363 0 0.9469311 0.3214358 0 0.9469314 0.3214363 0 0.9469311 0.7518377 0 -0.6593481 0.7518397 0 -0.6593458 0.7518418 0 -0.6593435 0.7518397 0 -0.6593458 0.6343936 0 -0.7730101 0.6343929 0 -0.7730107 0.6343921 0 -0.7730113 0.6343929 0 -0.7730107 0.5000023 0 -0.866024 0.5000023 0 -0.866024 0.5000023 0 -0.866024 0.5000023 0 -0.866024 -0.7071019 0 -0.7071115 -0.7071055 0 -0.7071079 -0.7071092 0 -0.7071044 -0.7071055 0 -0.7071079 0.9978592 0 -0.06539821 0.9978592 0 -0.06539822 0.9978592 0 -0.06539823 0.9978592 0 -0.06539822 0.923879 0 -0.3826846 0.9238815 0 -0.3826785 0.923884 0 -0.3826724 0.9238815 0 -0.3826785 0.7518343 0 -0.659352 0.7518366 0 -0.6593494 0.7518389 0 -0.6593468 0.7518366 0 -0.6593494 0.5000028 0 -0.8660237 0.4999979 0 -0.8660265 0.4999931 0 -0.8660293 0.4999979 0 -0.8660265 0.1950829 0 -0.9807867 0.1950882 0 -0.9807855 0.1950935 0 -0.9807845 0.1950882 0 -0.9807855 -0.1305247 0 -0.991445 -0.1305269 0 -0.9914447 -0.1305291 0 -0.9914444 -0.1305269 0 -0.9914447 0.03272304 0 -0.9994644 0.03271943 0 -0.9994645 0.03271582 0 -0.9994646 0.03271943 0 -0.9994645 -0.1305291 0 -0.9914444 -0.1305269 0 -0.9914447 -0.1305248 0 -0.9914449 -0.1305269 0 -0.9914447 0.3522511 0 -0.9359055 0.352251 0 -0.9359055 0.3522508 0 -0.9359056 0.352251 0 -0.9359055 0.1950883 0 -0.9807857 0.1950883 0 -0.9807857 0.1950883 0 -0.9807856 0.1950883 0 -0.9807857 0.3214356 0 0.9469314 0.3214383 0 0.9469305 0.3214409 0 0.9469296 0.3214383 0 0.9469305 0.4713984 0 0.8819203 0.4713978 0 0.8819207 0.4713971 0 0.881921 0.4713978 0 0.8819207 0.608763 0 0.793352 0.6087608 0 0.7933537 0.6087587 0 0.7933554 0.6087608 0 0.7933537 -0.2902848 0 -0.9569403 -0.2902837 0 -0.9569405 -0.2902828 0 -0.9569409 -0.2902837 0 -0.9569405 0.6087581 0 0.7933558 0.6087543 0 0.7933587 0.6087505 0 0.7933617 0.6087543 0 0.7933587 0.8314688 0 0.5555714 0.8314699 0 0.5555698 0.831471 0 0.555568 0.8314699 0 0.5555698 0.9659286 0 0.2588086 0.965928 0 0.2588108 0.9659274 0 0.2588131 0.965928 0 0.2588108 0.9659267 0 0.2588155 0.9659268 0 0.2588154 0.9659268 0 0.2588153 0.9659268 0 0.2588154 0.9951848 0 0.09801627 0.9951845 0 0.09801862 0.9951843 0 0.09802098 0.9951845 0 0.09801862 0.9978592 0 -0.06539822 0.9978589 0 -0.06540059 0.9978589 0 -0.06540298 0.9978589 0 -0.06540059 -0.4422858 0 -0.8968741 -0.4422863 0 -0.8968738 -0.4422868 0 -0.8968737 -0.4422863 0 -0.8968738 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.1628942 0 0.9866435 0.1628931 0 0.9866437 0.1628921 0 0.9866439 0.1628931 0 0.9866437 -0.4422882 0 -0.8968729 -0.442287 0 -0.8968735 -0.4422858 0 -0.8968741 -0.442287 0 -0.8968735 -0.7071073 0 -0.7071061 -0.7071068 0 -0.7071068 -0.7071061 0 -0.7071073 -0.7071068 0 -0.7071068 -0.582478 0 -0.8128464 -0.582479 0 -0.8128456 -0.58248 0 -0.8128449 -0.582479 0 -0.8128456 0.7298642 0 0.683592 0.7298636 0 0.6835926 0.7298631 0 0.6835932 0.7298636 0 0.6835926 0.8314699 0 0.5555697 0.8314704 0 0.5555689 0.831471 0 0.555568 0.8314704 0 0.5555689 0.9108646 0 0.4127053 0.9108646 0 0.4127053 0.9108646 0 0.4127053 0.9108646 0 0.4127053 0.9738762 0 -0.2270791 0.973877 0 -0.2270758 0.9738778 0 -0.2270725 0.973877 0 -0.2270758 0.9238804 0 -0.3826812 0.9238803 0 -0.3826813 0.9238803 0 -0.3826814 0.9238803 0 -0.3826813 0.8492031 0 -0.5280663 0.8492019 0 -0.5280682 0.8492006 0 -0.5280702 0.8492019 0 -0.5280682</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_240Shape-textangents-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_240Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_240Shape-texbinormals-array" count="456">1 0 0 1 0 0 1 0 0 1 0 0 0.9469311 0 -0.3214369 0.9469313 0 -0.3214363 0.9469314 0 -0.3214358 0.9469312 0 -0.3214363 -0.6593481 0 -0.7518378 -0.6593459 0 -0.7518398 -0.6593435 0 -0.7518419 -0.6593459 0 -0.7518398 -0.7730103 0 -0.6343936 -0.7730108 0 -0.634393 -0.7730114 0 -0.6343923 -0.7730108 0 -0.6343929 -0.8660241 0 -0.5000023 -0.8660241 0 -0.5000023 -0.8660241 0 -0.5000023 -0.8660241 0 -0.5000023 -0.7071115 0 0.707102 -0.707108 0 0.7071056 -0.7071044 0 0.7071092 -0.707108 0 0.7071056 -0.06539822 0 -0.9978593 -0.06539823 0 -0.9978593 -0.06539824 0 -0.9978593 -0.06539823 0 -0.9978593 -0.3826846 0 -0.9238791 -0.3826786 0 -0.9238816 -0.3826725 0 -0.9238842 -0.3826786 0 -0.9238816 -0.659352 0 -0.7518344 -0.6593494 0 -0.7518367 -0.6593469 0 -0.7518389 -0.6593494 0 -0.7518367 -0.8660238 0 -0.5000029 -0.8660266 0 -0.499998 -0.8660294 0 -0.4999931 -0.8660266 0 -0.499998 -0.9807868 0 -0.1950829 -0.9807857 0 -0.1950882 -0.9807847 0 -0.1950936 -0.9807857 0 -0.1950882 -0.9914451 0 0.1305247 -0.9914448 0 0.1305269 -0.9914445 0 0.1305291 -0.9914448 0 0.1305269 -0.9994645 0 -0.03272304 -0.9994646 0 -0.03271944 -0.9994648 0 -0.03271583 -0.9994646 0 -0.03271944 -0.9914445 0 0.1305291 -0.9914448 0 0.130527 -0.9914451 0 0.1305248 -0.9914448 0 0.130527 -0.9359056 0 -0.3522511 -0.9359056 0 -0.352251 -0.9359056 0 -0.3522508 -0.9359056 0 -0.352251 -0.9807857 0 -0.1950883 -0.9807858 0 -0.1950883 -0.9807857 0 -0.1950883 -0.9807858 0 -0.1950883 0.9469315 0 -0.3214356 0.9469306 0 -0.3214383 0.9469296 0 -0.3214409 0.9469306 0 -0.3214383 0.8819205 0 -0.4713985 0.8819208 0 -0.4713978 0.8819212 0 -0.4713972 0.8819208 0 -0.4713978 0.7933521 0 -0.6087631 0.7933538 0 -0.6087609 0.7933555 0 -0.6087587 0.7933538 0 -0.6087609 -0.9569404 0 0.2902848 -0.9569407 0 0.2902838 -0.956941 0 0.2902828 -0.9569407 0 0.2902838 0.7933559 0 -0.6087582 0.7933589 0 -0.6087543 0.7933618 0 -0.6087505 0.7933589 0 -0.6087543 0.5555714 0 -0.8314689 0.5555698 0 -0.83147 0.5555681 0 -0.8314711 0.5555698 0 -0.8314699 0.2588087 0 -0.9659287 0.2588109 0 -0.9659281 0.2588131 0 -0.9659275 0.2588109 0 -0.9659281 0.2588155 0 -0.9659268 0.2588154 0 -0.9659269 0.2588153 0 -0.9659269 0.2588154 0 -0.9659269 0.09801628 0 -0.9951849 0.09801864 0 -0.9951847 0.09802099 0 -0.9951844 0.09801864 0 -0.9951847 -0.06539822 0 -0.9978593 -0.0654006 0 -0.9978592 -0.06540298 0 -0.997859 -0.0654006 0 -0.9978592 -0.8968742 0 0.4422859 -0.896874 0 0.4422864 -0.8968737 0 0.4422868 -0.896874 0 0.4422864 1 0 0 1 0 0 1 0 0 1 0 0 0.9866436 0 -0.1628942 0.9866437 0 -0.1628931 0.986644 0 -0.1628921 0.9866437 0 -0.1628931 -0.896873 0 0.4422883 -0.8968736 0 0.4422871 -0.8968742 0 0.4422859 -0.8968737 0 0.4422871 -0.7071062 0 0.7071074 -0.7071068 0 0.7071068 -0.7071074 0 0.7071062 -0.7071068 0 0.7071068 -0.8128465 0 0.582478 -0.8128458 0 0.5824791 -0.8128451 0 0.5824801 -0.8128457 0 0.5824791 0.6835921 0 -0.7298643 0.6835927 0 -0.7298638 0.6835933 0 -0.7298632 0.6835926 0 -0.7298637 0.5555698 0 -0.83147 0.5555689 0 -0.8314705 0.5555681 0 -0.8314711 0.5555689 0 -0.8314705 0.4127053 0 -0.9108647 0.4127053 0 -0.9108647 0.4127053 0 -0.9108647 0.4127053 0 -0.9108647 -0.2270792 0 -0.9738763 -0.2270758 0 -0.9738771 -0.2270725 0 -0.973878 -0.2270758 0 -0.9738771 -0.3826812 0 -0.9238805 -0.3826813 0 -0.9238805 -0.3826814 0 -0.9238804 -0.3826813 0 -0.9238804 -0.5280663 0 -0.8492032 -0.5280682 0 -0.8492019 -0.5280703 0 -0.8492007 -0.5280682 0 -0.8492019</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_240Shape-texbinormals-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_240Shape-vertices" name="qt_gauge_tickmarks_240Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_240Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_240Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_240Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_240Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="76">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_240Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_240Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_240Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_240Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66 68 68 68 69 69 69 70 71 71 70 71 71 69 69 69 71 70 70 72 72 72 73 73 73 74 75 75 74 75 75 73 73 73 75 74 74 76 76 76 77 77 77 78 79 79 78 79 79 77 77 77 79 78 78 80 80 80 81 81 81 82 83 83 82 83 83 81 81 81 83 82 82 84 84 84 85 85 85 86 87 87 86 87 87 85 85 85 87 86 86 88 88 88 89 89 89 90 91 91 90 91 91 89 89 89 91 90 90 92 92 92 93 93 93 94 95 95 94 95 95 93 93 93 95 94 94 96 96 96 97 97 97 98 99 99 98 99 99 97 97 97 99 98 98 100 100 100 101 101 101 102 103 103 102 103 103 101 101 101 103 102 102 104 104 104 105 105 105 106 107 107 106 107 107 105 105 105 107 106 106 108 108 108 109 109 109 110 111 111 110 111 111 109 109 109 111 110 110 112 112 112 113 113 113 114 115 115 114 115 115 113 113 113 115 114 114 116 116 116 117 117 117 118 119 119 118 119 119 117 117 117 119 118 118 120 120 120 121 121 121 122 123 123 122 123 123 121 121 121 123 122 122 124 124 124 125 125 125 126 127 127 126 127 127 125 125 125 127 126 126 128 128 128 129 129 129 130 131 131 130 131 131 129 129 129 131 130 130 132 132 132 133 133 133 134 135 135 134 135 135 133 133 133 135 134 134 136 136 136 137 137 137 138 139 139 138 139 139 137 137 137 139 138 138 140 140 140 141 141 141 142 143 143 142 143 143 141 141 141 143 142 142 144 144 144 145 145 145 146 147 147 146 147 147 145 145 145 147 146 146 148 148 148 149 149 149 150 151 151 150 151 151 149 149 149 151 150 150</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_240Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_240" name="qt_gauge_tickmarks_240" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_240Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_240</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_1.dae
new file mode 100644
index 0000000..2591ddb
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:25:55</created>
+ <modified>2018-03-08T09:25:55</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_260Shape" name="qt_gauge_tickmarks_260Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_260Shape-positions" name="qt_gauge_tickmarks_260Shape-positions">
+ <float_array id="qt_gauge_tickmarks_260Shape-positions-array" count="2064">-8.957281 0 2.330514 -9.005143 0 2.136326 -10.41369 0 2.689487 -10.46156 0 2.495299 -3.373597 0 -8.593691 -3.186594 0 -8.664611 -3.905504 0 -9.996215 -3.718501 0 -10.06714 -6.208736 0 -6.837663 -6.059033 0 -6.970287 -7.20342 0 -7.960429 -7.053718 0 -8.093053 -4.870953 0 -7.844494 -4.699797 0 -7.947962 -5.64696 0 -9.128166 -5.475803 0 -9.231633 -8.860918 0 -2.636681 -8.801418 0 -2.827627 -10.293 0 -3.082936 -10.2335 0 -3.27388 -7.343119 0 -5.606182 -7.219776 0 -5.763619 -8.523895 0 -6.531261 -8.400551 0 -6.688698 -8.23694 0 -4.190394 -8.143997 0 -4.367486 -9.565125 0 -4.887478 -9.47218 0 -5.064569 -9.491322 0 -0.389286 -9.486491 0 -0.4891701 -10.49015 0 -0.4376001 -10.48532 0 -0.5374827 -9.49991 0 -0.04503966 -9.498703 0 -0.1450338 -10.49984 0 -0.05712271 -10.49863 0 -0.1571159 -9.496017 0 0.2992902 -9.498434 0 0.1993194 -10.49573 0 0.3234544 -10.49814 0 0.2234836 -9.084723 0 -2.758793 -9.054974 0 -2.854266 -10.03944 0 -3.056297 -10.00969 0 -3.151768 -9.179453 0 -2.427726 -9.153183 0 -2.524214 -10.14433 0 -2.690434 -10.11806 0 -2.786922 -9.262123 0 -2.093445 -9.239366 0 -2.190821 -10.23588 0 -2.32101 -10.21313 0 -2.418387 -9.332623 0 -1.756385 -9.31341 0 -1.854523 -10.31399 0 -1.948513 -10.29478 0 -2.046649 -9.39086 0 -1.416993 -9.375217 0 -1.515762 -10.37855 0 -1.573428 -10.36291 0 -1.672196 -9.436761 0 -1.075713 -9.424707 0 -1.174984 -10.42947 0 -1.196249 -10.41742 0 -1.295521 -9.470263 0 -0.7329941 -9.461815 0 -0.8326364 -10.46669 0 -0.8174739 -10.45824 0 -0.9171176 -7.71505 0 -5.523759 -7.656272 0 -5.604661 -8.524067 0 -6.111545 -8.465288 0 -6.192446 -7.910886 0 -5.240515 -7.855078 0 -5.323494 -8.740673 0 -5.798594 -8.684865 0 -5.881574 -8.096327 0 -4.950358 -8.043563 0 -5.035306 -8.945795 0 -5.477999 -8.893031 0 -5.562947 -5.531491 0 -7.703923 -5.449885 0 -7.761719 -6.109458 0 -8.519982 -6.027853 0 -8.577779 -5.807773 0 -7.498379 -5.728315 0 -7.559096 -6.414935 0 -8.292958 -6.335478 0 -8.353675 -6.076424 0 -7.28296 -5.999218 0 -7.346517 -6.711984 0 -8.055013 -6.634778 0 -8.118568 -6.337091 0 -7.057945 -6.26224 0 -7.124259 -7.000214 0 -7.806457 -6.925363 0 -7.872769 -6.589432 0 -6.823633 -6.517034 0 -6.892615 -7.279246 0 -7.547621 -7.206847 0 -7.616602 -6.833116 0 -6.580328 -6.763265 0 -6.651888 -7.548715 0 -7.27884 -7.478864 0 -7.3504 -9.479649 0 0.6432538 -9.485687 0 0.5434361 -10.47783 0 0.7036319 -10.48386 0 0.6038146 -9.450825 0 0.9863987 -9.460476 0 0.8868651 -10.44616 0 1.082913 -10.45581 0 0.9833794 -9.409583 0 1.328273 -9.422836 0 1.229156 -10.40076 0 1.460796 -10.41402 0 1.361677 -4.660541 0 -8.258648 -4.573144 0 -8.307246 -5.146524 0 -9.132616 -5.059127 0 -9.181214 -4.957498 0 -8.084305 -4.87192 0 -8.136039 -5.474836 0 -8.940086 -5.389258 0 -8.991819 -5.247943 0 -7.899317 -5.164295 0 -7.954117 -5.795955 0 -8.735785 -5.712308 0 -8.790586 -3.415497 0 -8.845175 -3.321996 0 -8.880634 -3.770102 0 -9.78019 -3.6766 0 -9.815651 -3.734529 0 -8.715569 -3.642374 0 -8.754395 -4.122787 0 -9.63712 -4.030632 0 -9.675945 -4.048654 0 -8.574488 -3.957967 0 -8.616628 -4.470056 0 -9.481361 -4.379368 0 -9.523501 -4.35746 0 -8.422112 -4.268359 0 -8.46751 -4.81145 0 -9.313119 -4.72235 0 -9.358518 -2.433183 0 -9.163504 -2.336384 0 -9.188604 -2.684212 0 -10.13148 -2.587415 0 -10.15659 -2.764396 0 -9.069288 -2.668572 0 -9.097883 -3.050342 0 -10.02753 -2.954517 0 -10.05613 -3.091978 0 -8.963133 -2.997252 0 -8.995181 -3.412464 0 -9.910386 -3.317738 0 -9.942434 -1.422121 0 -9.373338 -1.323171 0 -9.387786 -1.56661 0 -10.36284 -1.46766 0 -10.37729 -1.761604 0 -9.315626 -1.663242 0 -9.333652 -1.941859 0 -10.29925 -1.843497 0 -10.31727 -2.098772 0 -9.245652 -2.001128 0 -9.26723 -2.314556 0 -10.22209 -2.216912 0 -10.24367 -0.3942586 0 -9.472198 -0.2943243 0 -9.475821 -0.4304998 0 -10.47154 -0.3305655 0 -10.47517 -0.7379993 0 -9.451674 -0.6382619 0 -9.458917 -0.8104341 0 -10.44905 -0.7106968 0 -10.45629 -1.08077 0 -9.418705 -0.981361 0 -9.42956 -1.189304 0 -10.4128 -1.089894 0 -10.42365 -9.290084 0 2.006416 -9.31048 0 1.908519 -10.26906 0 2.210388 -10.28946 0 2.112489 -9.211981 0 2.341795 -9.235912 0 2.244701 -10.18292 0 2.58111 -10.20686 0 2.484017 -9.35598 0 1.668428 -9.372816 0 1.569855 -10.34171 0 1.836784 -10.35854 0 1.738213 -8.271132 0 -4.653673 -8.22148 0 -4.740477 -9.139164 0 -5.150181 -9.089513 0 -5.236985 -8.435068 0 -4.350848 -8.388596 0 -4.439393 -9.320524 0 -4.815572 -9.274052 0 -4.904116 -8.587923 0 -4.04228 -8.544689 0 -4.132451 -9.489639 0 -4.474607 -9.446407 0 -4.56478 8.823008 0 -3.502611 8.859596 0 -3.409544 9.753672 0 -3.868487 9.790258 0 -3.775421 8.689558 0 -3.820054 8.729494 0 -3.728374 9.60635 0 -4.219418 9.646286 0 -4.127738 8.544689 0 -4.132451 8.587923 0 -4.04228 9.446407 0 -4.56478 9.489639 0 -4.474607 9.153183 0 -2.524214 9.179453 0 -2.427726 10.11806 0 -2.786922 10.14433 0 -2.690434 9.054974 0 -2.854266 9.084723 0 -2.758793 10.00969 0 -3.151768 10.03944 0 -3.056297 8.944866 0 -3.18054 8.978058 0 -3.086209 9.888178 0 -3.512448 9.92137 0 -3.418117 9.424707 0 -1.174984 9.436761 0 -1.075713 10.41742 0 -1.295521 10.42947 0 -1.196249 9.375217 0 -1.515762 9.39086 0 -1.416993 10.36291 0 -1.672196 10.37855 0 -1.573428 9.31341 0 -1.854523 9.332623 0 -1.756385 10.29478 0 -2.046649 10.31399 0 -1.948513 9.239366 0 -2.190821 9.262123 0 -2.093445 10.21313 0 -2.418387 10.23588 0 -2.32101 9.498703 0 -0.1450338 9.49991 0 -0.04503966 10.49863 0 -0.1571159 10.49984 0 -0.05712271 9.486491 0 -0.4891701 9.491322 0 -0.389286 10.48532 0 -0.5374827 10.49015 0 -0.4376001 9.461815 0 -0.8326364 9.470263 0 -0.7329941 10.45824 0 -0.9171176 10.46669 0 -0.8174739 9.460476 0 0.8868651 9.450825 0 0.9863987 10.45581 0 0.9833794 10.44616 0 1.082913 9.485687 0 0.5434361 9.479649 0 0.6432538 10.48386 0 0.6038146 10.47783 0 0.7036319 9.498434 0 0.1993194 9.496017 0 0.2992902 10.49814 0 0.2234836 10.49573 0 0.3234544 2.668572 0 -9.097883 2.764396 0 -9.069288 2.954517 0 -10.05613 3.050342 0 -10.02753 2.336384 0 -9.188604 2.433183 0 -9.163504 2.587415 0 -10.15659 2.684212 0 -10.13148 2.001128 0 -9.26723 2.098772 0 -9.245652 2.216912 0 -10.24367 2.314556 0 -10.22209 3.642374 0 -8.754395 3.734529 0 -8.715569 4.030632 0 -9.675945 4.122787 0 -9.63712 3.321996 0 -8.880634 3.415497 0 -8.845175 3.6766 0 -9.815651 3.770102 0 -9.78019 2.997252 0 -8.995181 3.091978 0 -8.963133 3.317738 0 -9.942434 3.412464 0 -9.910386 0.6382619 0 -9.458917 0.7379993 0 -9.451674 0.7106968 0 -10.45629 0.8104341 0 -10.44905 0.2943243 0 -9.475821 0.3942586 0 -9.472198 0.3305655 0 -10.47517 0.4304998 0 -10.47154 -0.05 0 -9.48025 0.05 0 -9.48025 -0.05 0 -10.48025 0.05 0 -10.48025 1.663242 0 -9.333652 1.761604 0 -9.315626 1.843497 0 -10.31727 1.941859 0 -10.29925 1.323171 0 -9.387786 1.422121 0 -9.373338 1.46766 0 -10.37729 1.56661 0 -10.36284 0.981361 0 -9.42956 1.08077 0 -9.418705 1.089894 0 -10.42365 1.189304 0 -10.4128 9.31048 0 1.908519 9.290084 0 2.006416 10.28946 0 2.112489 10.26906 0 2.210388 9.372816 0 1.569855 9.35598 0 1.668428 10.35854 0 1.738213 10.34171 0 1.836784 9.422836 0 1.229156 9.409583 0 1.328273 10.41402 0 1.361677 10.40076 0 1.460796 9.050488 0 2.907858 9.019587 0 3.002963 10.00154 0 3.216875 9.970642 0 3.311981 9.149211 0 2.57796 9.121777 0 2.674124 10.11084 0 2.852307 10.08341 0 2.948469 9.235912 0 2.244701 9.211981 0 2.341795 10.20686 0 2.484017 10.18292 0 2.58111 6.517034 0 -6.892615 6.589432 0 -6.823633 7.206847 0 -7.616602 7.279246 0 -7.547621 6.26224 0 -7.124259 6.337091 0 -7.057945 6.925363 0 -7.872769 7.000214 0 -7.806457 5.999218 0 -7.346517 6.076424 0 -7.28296 6.634778 0 -8.118568 6.711984 0 -8.055013 7.228758 0 -6.144467 7.293242 0 -6.068035 7.993073 0 -6.78931 8.057557 0 -6.712877 7.000609 0 -6.402396 7.067822 0 -6.328352 7.741054 0 -7.074515 7.808266 0 -7.000471 6.763265 0 -6.651888 6.833116 0 -6.580328 7.478864 0 -7.3504 7.548715 0 -7.27884 8.683569 0 3.873076 8.642529 0 3.964267 9.595469 0 4.283489 9.554427 0 4.374679 8.817514 0 3.555842 8.779804 0 3.648459 9.743689 0 3.932936 9.705979 0 4.025555 8.939873 0 3.233961 8.905545 0 3.327885 9.879107 0 3.577243 9.844778 0 3.671165 8.21406 0 4.792769 8.163363 0 4.878967 9.076029 0 5.299729 9.025333 0 5.385927 8.381643 0 4.491947 8.334105 0 4.579925 9.26142 0 4.967335 9.213881 0 5.055313 8.538216 0 4.185248 8.493896 0 4.274891 9.434642 0 4.62844 9.390324 0 4.718082 7.647507 0 5.656073 7.587754 0 5.736259 8.449362 0 6.253591 8.38961 0 6.333776 7.84675 0 5.375216 7.789943 0 5.457515 8.669735 0 5.943281 8.612927 0 6.025579 8.035684 0 5.087321 7.981897 0 5.171625 8.878714 0 5.625187 8.824928 0 5.709491 6.75287 0 6.701909 6.682158 0 6.77262 7.459976 0 7.409015 7.389266 0 7.479726 6.990602 0 6.452787 6.922502 0 6.526013 7.722872 0 7.133803 7.65477 0 7.20703 7.219151 0 6.195213 7.153749 0 6.27086 7.97562 0 6.849244 7.910217 0 6.92489 7.438215 0 5.929525 7.375597 0 6.007493 8.21789 0 6.55571 8.155272 0 6.633677 -9.019587 0 3.002963 -9.050488 0 2.907858 -9.970642 0 3.311981 -10.00154 0 3.216875 -9.121777 0 2.674124 -9.149211 0 2.57796 -10.08341 0 2.948469 -10.11084 0 2.852307 -8.642529 0 3.964267 -8.683569 0 3.873076 -9.554427 0 4.374679 -9.595469 0 4.283489 -8.779804 0 3.648459 -8.817514 0 3.555842 -9.705979 0 4.025555 -9.743689 0 3.932936 -8.905545 0 3.327885 -8.939873 0 3.233961 -9.844778 0 3.671165 -9.879107 0 3.577243 -7.067822 0 -6.328352 -7.000609 0 -6.402396 -7.808266 0 -7.000471 -7.741054 0 -7.074515 -7.293242 0 -6.068035 -7.228758 0 -6.144467 -8.057557 0 -6.712877 -7.993073 0 -6.78931 -7.509079 0 -5.799721 -7.447407 0 -5.878438 -8.296263 0 -6.41644 -8.234591 0 -6.495157 -8.493896 0 4.274891 -8.538216 0 4.185248 -9.390324 0 4.718082 -9.434642 0 4.62844 -8.334105 0 4.579925 -8.381643 0 4.491947 -9.213881 0 5.055313 -9.26142 0 4.967335 -8.163363 0 4.878967 -8.21406 0 4.792769 -9.025333 0 5.385927 -9.076029 0 5.299729 -6.922502 0 6.526013 -6.990602 0 6.452787 -7.65477 0 7.20703 -7.722872 0 7.133803 -7.153749 0 6.27086 -7.219151 0 6.195213 -7.910217 0 6.92489 -7.97562 0 6.849244 -6.682158 0 6.77262 -6.75287 0 6.701909 -7.389266 0 7.479726 -7.459976 0 7.409015 4.87192 0 -8.136039 4.957498 0 -8.084305 5.389258 0 -8.991819 5.474836 0 -8.940086 4.573144 0 -8.307246 4.660541 0 -8.258648 5.059127 0 -9.181214 5.146524 0 -9.132616 4.268359 0 -8.46751 4.35746 0 -8.422112 4.72235 0 -9.358518 4.81145 0 -9.313119 3.957967 0 -8.616628 4.048654 0 -8.574488 4.379368 0 -9.523501 4.470056 0 -9.481361 5.728315 0 -7.559096 5.807773 0 -7.498379 6.335478 0 -8.353675 6.414935 0 -8.292958 5.449885 0 -7.761719 5.531491 0 -7.703923 6.027853 0 -8.577779 6.109458 0 -8.519982 5.164295 0 -7.954117 5.247943 0 -7.899317 5.712308 0 -8.790586 5.795955 0 -8.735785 -8.729494 0 -3.728374 -8.689558 0 -3.820054 -9.646286 0 -4.127738 -9.60635 0 -4.219418 -8.859596 0 -3.409544 -8.823008 0 -3.502611 -9.790258 0 -3.775421 -9.753672 0 -3.868487 -8.978058 0 -3.086209 -8.944866 0 -3.18054 -9.92137 0 -3.418117 -9.888178 0 -3.512448 7.855078 0 -5.323494 7.910886 0 -5.240515 8.684865 0 -5.881574 8.740673 0 -5.798594 7.656272 0 -5.604661 7.71505 0 -5.523759 8.465288 0 -6.192446 8.524067 0 -6.111545 7.447407 0 -5.878438 7.509079 0 -5.799721 8.234591 0 -6.495157 8.296263 0 -6.41644 8.388596 0 -4.439393 8.435068 0 -4.350848 9.274052 0 -4.904116 9.320524 0 -4.815572 8.22148 0 -4.740477 8.271132 0 -4.653673 9.089513 0 -5.236985 9.139164 0 -5.150181 8.043563 0 -5.035306 8.096327 0 -4.950358 8.893031 0 -5.562947 8.945795 0 -5.477999 -7.789943 0 5.457515 -7.84675 0 5.375216 -8.612927 0 6.025579 -8.669735 0 5.943281 -7.981897 0 5.171625 -8.035684 0 5.087321 -8.824928 0 5.709491 -8.878714 0 5.625187 -7.587754 0 5.736259 -7.647507 0 5.656073 -8.38961 0 6.333776 -8.449362 0 6.253591 -7.375597 0 6.007493 -7.438215 0 5.929525 -8.155272 0 6.633677 -8.21789 0 6.55571 6.081118 0 5.959447 5.939697 0 6.100868 6.788225 0 6.666553 6.646804 0 6.807975 7.792191 0 3.417068 7.710108 0 3.599449 8.70409 0 3.827481 8.622007 0 4.009861 4.311793 0 -7.306125 4.482949 0 -7.202657 4.829131 0 -8.161905 5.000288 0 -8.058438 1.433806 0 -8.359046 1.63053 0 -8.322993 1.614061 0 -9.342667 1.810785 0 -9.306615 -1.63053 0 -8.322993 -1.433806 0 -8.359046 -1.810785 0 -9.306615 -1.614061 0 -9.342667 8.49053 0 0.4331498 8.478455 0 0.6327844 9.488707 0 0.4935269 9.476629 0 0.6931629 8.085377 0 -2.604498 8.144878 0 -2.413554 9.040098 0 -2.902001 9.099599 0 -2.711057 6.629388 0 -5.301079 6.752732 0 -5.143642 7.416571 0 -5.917798 7.539915 0 -5.760361 -8.394033 0 3.907258 -8.476116 0 3.724878 -9.761883 0 4.522878 -9.843966 0 4.340497 -7.555795 0 5.356647 -7.669408 0 5.192051 -8.790272 0 6.208744 -8.903883 0 6.044147 -6.470027 0 6.631198 -6.611449 0 6.489777 -7.530688 0 7.691858 -7.672109 0 7.550437 6.611449 0 6.489777 6.470027 0 6.631198 7.672109 0 7.550437 7.530688 0 7.691858 7.669408 0 5.192051 7.555795 0 5.356647 8.903883 0 6.044147 8.790272 0 6.208744 8.476116 0 3.724878 8.394033 0 3.907258 9.843966 0 4.340497 9.761883 0 4.522878 -4.482949 0 -7.202657 -4.311793 0 -7.306125 -5.000288 0 -8.058438 -4.829131 0 -8.161905 1.568997 0 -9.096762 1.765721 0 -9.060709 1.83938 0 -10.57219 2.036104 0 -10.53614 -0.1 0 -9.23025 0.1 0 -9.23025 -0.1 0 -10.73025 0.1 0 -10.73025 -1.765721 0 -9.060709 -1.568997 0 -9.096762 -2.036104 0 -10.53614 -1.83938 0 -10.57219 4.699797 0 -7.947962 4.870953 0 -7.844494 5.475803 0 -9.231633 5.64696 0 -9.128166 3.186594 0 -8.664611 3.373597 0 -8.593691 3.718501 0 -10.06714 3.905504 0 -9.996215 8.801418 0 -2.827627 8.860918 0 -2.636681 10.2335 0 -3.27388 10.293 0 -3.082936 8.143997 0 -4.367486 8.23694 0 -4.190394 9.47218 0 -5.064569 9.565125 0 -4.887478 7.219776 0 -5.763619 7.343119 0 -5.606182 8.400551 0 -6.688698 8.523895 0 -6.531261 6.059033 0 -6.970287 6.208736 0 -6.837663 7.053718 0 -8.093053 7.20342 0 -7.960429 9.005143 0 2.136326 8.957281 0 2.330514 10.46156 0 2.495299 10.41369 0 2.689487 9.239163 0 0.4784327 9.227087 0 0.6780682 10.73643 0 0.5690012 10.72435 0 0.7686357 9.170504 0 -1.194485 9.194611 0 -0.995944 10.65957 0 -1.37529 10.68367 0 -1.176748 -9.194611 0 -0.995944 -9.170504 0 -1.194485 -10.68367 0 -1.176748 -10.65957 0 -1.37529 -9.227087 0 0.6780682 -9.239163 0 0.4784327 -10.72435 0 0.7686357 -10.73643 0 0.5690012 -6.752732 0 -5.143642 -6.629388 0 -5.301079 -7.539915 0 -5.760361 -7.416571 0 -5.917798 -8.144878 0 -2.413554 -8.085377 0 -2.604498 -9.099599 0 -2.711057 -9.040098 0 -2.902001 -8.478455 0 0.6327844 -8.49053 0 0.4331498 -9.476629 0 0.6931629 -9.488707 0 0.4935269 -7.710108 0 3.599449 -7.792191 0 3.417068 -8.622007 0 4.009861 -8.70409 0 3.827481 -5.939697 0 6.100868 -6.081118 0 5.959447 -6.646804 0 6.807975 -6.788225 0 6.666553</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260Shape-positions-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260Shape-normals" name="qt_gauge_tickmarks_260Shape-normals">
+ <float_array id="qt_gauge_tickmarks_260Shape-normals-array" count="2064">0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260Shape-normals-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260Shape-tangents" name="qt_gauge_tickmarks_260Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_260Shape-tangents-array" count="2064">-0.2393154 0 -0.9709419 -0.9709431 0 0.2393103 0.9709419 0 -0.2393154 0.2393156 0 0.9709418 0.9350163 0 -0.3546048 -0.3546 0 -0.9350181 0.3546091 0 0.9350146 -0.9350163 0 0.3546047 0.7485108 0 -0.6631226 -0.6631206 0 -0.7485126 0.6631193 0 0.7485138 -0.7485106 0 0.6631228 0.8557811 0 -0.5173381 -0.517341 0 -0.8557794 0.5173343 0 0.8557834 -0.8557813 0 0.5173377 0.2975033 0 -0.9547208 -0.9547226 0 -0.2974974 0.954722 0 0.2974994 -0.2975024 0 0.9547211 0.6167192 0 -0.7871832 -0.7871863 0 -0.6167152 0.7871813 0 0.6167217 -0.6167189 0 0.7871834 0.4647227 0 -0.8854563 -0.8854589 0 -0.4647177 0.8854569 0 0.4647214 -0.464723 0 0.8854561 0.04831407 0 -0.9988322 -0.9988327 0 -0.04830324 0.9988322 0 0.04831344 -0.04831269 0 0.9988323 0.01208305 0 -0.999927 -0.9999271 0 -0.01207334 0.9999269 0 0.01209253 -0.01208212 0 0.999927 -0.0241642 0 -0.999708 -0.999708 0 0.0241661 0.999708 0 -0.0241661 0.0241642 0 0.999708 0.2975041 0 -0.9547205 -0.9547227 0 -0.297497 0.9547186 0 0.2975105 -0.2975029 0 0.9547209 0.2627078 0 -0.9648755 -0.9648778 0 -0.2626992 0.964878 0 0.2626986 -0.262708 0 0.9648754 0.2275653 0 -0.9737628 -0.9737603 0 -0.2275762 0.9737632 0 0.2275635 -0.2275667 0 0.9737625 0.1921277 0 -0.9813699 -0.9813702 0 -0.1921265 0.9813678 0 0.1921384 -0.1921265 0 0.9813702 0.1564343 0 -0.9876884 -0.9876903 0 -0.1564222 0.9876873 0 0.1564408 -0.1564346 0 0.9876883 0.1205363 0 -0.9927089 -0.9927091 0 -0.1205344 0.9927092 0 0.1205339 -0.1205368 0 0.9927089 0.08447985 0 -0.9964252 -0.9964255 0 -0.0844767 0.9964256 0 0.08447549 -0.08448127 0 0.9964251 0.5877857 0 -0.8090167 -0.8090179 0 -0.5877841 0.809014 0 0.5877894 -0.5877856 0 0.8090167 0.5580794 0 -0.8297875 -0.8297869 0 -0.5580804 0.8297884 0 0.5580782 -0.5580798 0 0.8297873 0.5276402 0 -0.849468 -0.8494705 0 -0.5276361 0.8494719 0 0.5276339 -0.5276405 0 0.8494678 0.8160599 0 -0.5779674 -0.577966 0 -0.8160608 0.5779683 0 0.8160592 -0.8160597 0 0.5779677 0.7945784 0 -0.6071616 -0.6071733 0 -0.7945695 0.6071672 0 0.7945741 -0.794578 0 0.6071621 0.772052 0 -0.6355594 -0.6355615 0 -0.7720502 0.6355582 0 0.772053 -0.7720514 0 0.6355601 0.748511 0 -0.6631224 -0.6631311 0 -0.7485032 0.6631282 0 0.7485059 -0.7485103 0 0.6631231 0.723987 0 -0.6898136 -0.6898153 0 -0.7239854 0.6898104 0 0.72399 -0.723987 0 0.6898136 0.6985114 0 -0.7155989 -0.7155977 0 -0.6985127 0.7155977 0 0.6985127 -0.6985114 0 0.7155989 -0.06037801 0 -0.9981756 -0.9981751 0 0.06038651 0.9981762 0 -0.06036779 0.0603786 0 0.9981755 -0.09651468 0 -0.9953316 -0.9953319 0 0.09651148 0.995331 0 -0.09652047 0.09651412 0 0.9953316 -0.1325224 0 -0.99118 -0.9911787 0 0.1325323 0.9911802 0 -0.132521 0.1325211 0 0.9911802 0.8739679 0 -0.4859837 -0.4859838 0 -0.8739678 0.4859818 0 0.873969 -0.8739681 0 0.4859833 0.8557814 0 -0.5173377 -0.5173399 0 -0.85578 0.5173329 0 0.8557842 -0.8557811 0 0.5173381 0.8364698 0 -0.5480131 -0.5480007 0 -0.8364779 0.5480184 0 0.8364663 -0.8364699 0 0.5480129 0.9350162 0 -0.3546049 -0.3545966 0 -0.9350194 0.3546049 0 0.9350162 -0.9350163 0 0.3546046 0.9215507 0 -0.388258 -0.388268 0 -0.9215465 0.3882501 0 0.921554 -0.9215506 0 0.3882583 0.9068741 0 -0.4214017 -0.4214009 0 -0.9068745 0.421399 0 0.9068753 -0.9068743 0 0.4214013 0.8910067 0 -0.4539901 -0.4539795 0 -0.8910121 0.453989 0 0.8910073 -0.8910067 0 0.4539901 0.9679794 0 -0.2510297 -0.2510073 0 -0.9679852 0.2510264 0 0.9679802 -0.9679794 0 0.2510297 0.9582458 0 -0.2859458 -0.2859497 0 -0.9582446 0.2859402 0 0.9582474 -0.9582458 0 0.2859458 0.9472534 0 -0.3204856 -0.3204818 0 -0.9472547 0.3204825 0 0.9472544 -0.9472533 0 0.3204859 0.9895064 0 -0.1444893 -0.1444818 0 -0.9895075 0.1444912 0 0.9895061 -0.9895064 0 0.1444891 0.9836199 0 -0.1802549 -0.1802541 0 -0.9836201 0.1802541 0 0.9836201 -0.9836199 0 0.1802549 0.9764411 0 -0.2157842 -0.2157787 0 -0.9764423 0.2157787 0 0.9764423 -0.9764411 0 0.2157842 0.9993431 0 -0.03624117 -0.03623963 0 -0.9993431 0.03623963 0 0.9993431 -0.9993431 0 0.03624117 0.9973731 0 -0.07243482 -0.07242203 0 -0.9973741 0.07244105 0 0.9973727 -0.9973732 0 0.07243474 0.9940928 0 -0.1085332 -0.108547 0 -0.9940913 0.1085187 0 0.9940944 -0.9940928 0 0.1085334 -0.2039715 0 -0.9789768 -0.9789785 0 0.2039635 0.9789733 0 -0.2039885 0.2039698 0 0.9789772 -0.2393149 0 -0.970942 -0.970942 0 0.2393148 0.9709394 0 -0.2393255 0.2393154 0 0.9709419 -0.1683562 0 -0.9857262 -0.9857253 0 0.1683617 0.9857282 0 -0.1683444 0.1683572 0 0.985726 0.4965076 0 -0.8680324 -0.8680312 0 -0.4965097 0.8680336 0 0.4965055 -0.4965083 0 0.868032 0.4647235 0 -0.8854559 -0.8854534 0 -0.4647281 0.8854524 0 0.4647301 -0.4647231 0 0.8854561 0.4323275 0 -0.9017167 -0.9017117 0 -0.4323379 0.9017227 0 0.432315 -0.4323283 0 0.9017163 0.365876 0 0.9306636 0.9306604 0 -0.3658841 -0.9306669 0 0.3658676 -0.3658767 0 -0.9306633 0.399364 0 0.9167925 0.916795 0 -0.3993582 -0.9167942 0 0.39936 -0.3993644 0 -0.9167923 0.4323283 0 0.9017163 0.9017117 0 -0.4323379 -0.9017227 0 0.432315 -0.4323275 0 -0.9017167 0.262708 0 0.9648754 0.9648778 0 -0.2626992 -0.964878 0 0.2626986 -0.2627078 0 -0.9648755 0.2975029 0 0.9547209 0.9547227 0 -0.297497 -0.9547186 0 0.2975105 -0.2975041 0 -0.9547205 0.3319084 0 0.9433116 0.9433091 0 -0.3319156 -0.9433088 0 0.3319163 -0.3319086 0 -0.9433115 0.1205368 0 0.9927089 0.9927091 0 -0.1205344 -0.9927092 0 0.1205339 -0.1205363 0 -0.9927089 0.1564346 0 0.9876883 0.9876903 0 -0.1564222 -0.9876873 0 0.1564408 -0.1564343 0 -0.9876884 0.1921265 0 0.9813702 0.9813702 0 -0.1921265 -0.9813678 0 0.1921384 -0.1921277 0 -0.9813699 0.2275667 0 0.9737625 0.9737603 0 -0.2275762 -0.9737632 0 0.2275635 -0.2275653 0 -0.9737628 0.01208212 0 0.999927 0.9999271 0 -0.01207334 -0.9999269 0 0.01209253 -0.01208305 0 -0.999927 0.04831269 0 0.9988323 0.9988327 0 -0.04830324 -0.9988322 0 0.04831344 -0.04831407 0 -0.9988322 0.08448127 0 0.9964251 0.9964255 0 -0.0844767 -0.9964256 0 0.08447549 -0.08447985 0 -0.9964252 -0.09651412 0 0.9953316 0.9953319 0 0.09651148 -0.995331 0 -0.09652047 0.09651468 0 -0.9953316 -0.0603786 0 0.9981755 0.9981751 0 0.06038651 -0.9981762 0 -0.06036779 0.06037801 0 -0.9981756 -0.0241642 0 0.999708 0.999708 0 0.0241661 -0.999708 0 -0.0241661 0.0241642 0 -0.999708 0.9582458 0 0.2859458 0.2859497 0 -0.9582446 -0.2859402 0 0.9582474 -0.9582458 0 -0.2859458 0.9679794 0 0.2510297 0.2510073 0 -0.9679852 -0.2510264 0 0.9679802 -0.9679794 0 -0.2510297 0.9764411 0 0.2157842 0.2157787 0 -0.9764423 -0.2157787 0 0.9764423 -0.9764411 0 -0.2157842 0.9215506 0 0.3882583 0.388268 0 -0.9215465 -0.3882501 0 0.921554 -0.9215507 0 -0.388258 0.9350163 0 0.3546046 0.3545966 0 -0.9350194 -0.3546049 0 0.9350162 -0.9350162 0 -0.3546049 0.9472533 0 0.3204859 0.3204818 0 -0.9472547 -0.3204825 0 0.9472544 -0.9472534 0 -0.3204856 0.9973732 0 0.07243474 0.07242203 0 -0.9973741 -0.07244105 0 0.9973727 -0.9973731 0 -0.07243482 0.9993431 0 0.03624117 0.03623963 0 -0.9993431 -0.03623963 0 0.9993431 -0.9993431 0 -0.03624117 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9836199 0 0.1802549 0.1802541 0 -0.9836201 -0.1802541 0 0.9836201 -0.9836199 0 -0.1802549 0.9895064 0 0.1444891 0.1444818 0 -0.9895075 -0.1444912 0 0.9895061 -0.9895064 0 -0.1444893 0.9940928 0 0.1085334 0.108547 0 -0.9940913 -0.1085187 0 0.9940944 -0.9940928 0 -0.1085332 -0.2039698 0 0.9789772 0.9789785 0 0.2039635 -0.9789733 0 -0.2039885 0.2039715 0 -0.9789768 -0.1683572 0 0.985726 0.9857253 0 0.1683617 -0.9857282 0 -0.1683444 0.1683562 0 -0.9857262 -0.1325211 0 0.9911802 0.9911787 0 0.1325323 -0.9911802 0 -0.132521 0.1325224 0 -0.99118 -0.3090167 0 0.9510566 0.9510582 0 0.3090117 -0.9510531 0 -0.3090275 0.3090177 0 -0.9510563 -0.2743468 0 0.9616308 0.9616322 0 0.274342 -0.9616338 0 -0.2743363 0.2743455 0 -0.9616312 -0.2393154 0 0.9709419 0.970942 0 0.2393148 -0.9709394 0 -0.2393255 0.2393149 0 -0.970942 0.723987 0 0.6898136 0.6898153 0 -0.7239854 -0.6898104 0 0.72399 -0.723987 0 -0.6898136 0.7485103 0 0.6631231 0.6631311 0 -0.7485032 -0.6631282 0 0.7485059 -0.748511 0 -0.6631224 0.7720514 0 0.6355601 0.6355615 0 -0.7720502 -0.6355582 0 0.772053 -0.772052 0 -0.6355594 0.6448422 0 0.7643157 0.7643213 0 -0.6448356 -0.7643213 0 0.6448356 -0.6448422 0 -0.7643157 0.6721186 0 0.7404435 0.7404417 0 -0.6721206 -0.7404417 0 0.6721206 -0.6721186 0 -0.7404435 0.6985114 0 0.7155989 0.7155977 0 -0.6985127 -0.7155977 0 0.6985127 -0.6985114 0 -0.7155989 -0.4104133 0 0.9118996 0.9119045 0 0.4104025 -0.9118993 0 -0.410414 0.4104129 0 -0.9118998 -0.3770949 0 0.9261746 0.9261719 0 0.3771016 -0.9261766 0 -0.3770901 0.3770954 0 -0.9261744 -0.3432815 0 0.9392326 0.939235 0 0.3432748 -0.9392302 0 -0.3432878 0.3432806 0 -0.9392329 -0.5069602 0 0.8619695 0.861969 0 0.5069609 -0.8619732 0 -0.5069539 0.5069598 0 -0.8619697 -0.4753877 0 0.8797764 0.879777 0 0.4753866 -0.879777 0 -0.4753866 0.4753877 0 -0.8797764 -0.4431922 0 0.8964266 0.8964266 0 0.4431922 -0.8964295 0 -0.4431864 0.4431914 0 -0.896427 -0.5975182 0 0.8018554 0.8018535 0 0.5975206 -0.8018564 0 -0.5975168 0.5975174 0 -0.8018559 -0.5680643 0 0.8229842 0.8229809 0 0.5680691 -0.8229786 0 -0.5680723 0.5680645 0 -0.822984 -0.5378659 0 0.8430304 0.8430328 0 0.5378621 -0.8430385 0 -0.5378532 0.5378658 0 -0.8430305 -0.7071065 0 0.707107 0.7071068 0 0.7071068 -0.7071068 0 -0.7071068 0.7071061 0 -0.7071075 -0.6810151 0 0.7322694 0.7322678 0 0.6810168 -0.7322651 0 -0.6810197 0.6810163 0 -0.7322682 -0.6540301 0 0.7564685 0.7564688 0 0.6540298 -0.7564644 0 -0.6540349 0.6540301 0 -0.7564686 -0.626185 0 0.7796745 0.7796765 0 0.6261826 -0.7796746 0 -0.6261849 0.6261847 0 -0.7796748 -0.3090177 0 -0.9510563 -0.9510582 0 0.3090117 0.9510531 0 -0.3090275 0.3090167 0 0.9510566 -0.2743455 0 -0.9616312 -0.9616322 0 0.274342 0.9616338 0 -0.2743363 0.2743468 0 0.9616308 -0.4104129 0 -0.9118998 -0.9119045 0 0.4104025 0.9118993 0 -0.410414 0.4104133 0 0.9118996 -0.3770954 0 -0.9261744 -0.9261719 0 0.3771016 0.9261766 0 -0.3770901 0.3770949 0 0.9261746 -0.3432806 0 -0.9392329 -0.939235 0 0.3432748 0.9392302 0 -0.3432878 0.3432815 0 0.9392326 0.6721186 0 -0.7404435 -0.7404417 0 -0.6721206 0.7404417 0 0.6721206 -0.6721186 0 0.7404435 0.6448422 0 -0.7643157 -0.7643213 0 -0.6448356 0.7643213 0 0.6448356 -0.6448422 0 0.7643157 0.616719 0 -0.7871834 -0.7871777 0 -0.6167263 0.7871777 0 0.6167263 -0.616719 0 0.7871834 -0.4431914 0 -0.896427 -0.8964266 0 0.4431922 0.8964295 0 -0.4431864 0.4431922 0 0.8964266 -0.4753877 0 -0.8797764 -0.879777 0 0.4753866 0.879777 0 -0.4753866 0.4753877 0 0.8797764 -0.5069598 0 -0.8619697 -0.861969 0 0.5069609 0.8619732 0 -0.5069539 0.5069602 0 0.8619695 -0.6810163 0 -0.7322682 -0.7322678 0 0.6810168 0.7322651 0 -0.6810197 0.6810151 0 0.7322694 -0.6540301 0 -0.7564686 -0.7564688 0 0.6540298 0.7564644 0 -0.6540349 0.6540301 0 0.7564685 -0.7071061 0 -0.7071075 -0.7071068 0 0.7071068 0.7071068 0 -0.7071068 0.7071065 0 0.707107 0.8557811 0 0.5173381 0.5173399 0 -0.85578 -0.5173329 0 0.8557842 -0.8557814 0 -0.5173377 0.8739681 0 0.4859833 0.4859838 0 -0.8739678 -0.4859818 0 0.873969 -0.8739679 0 -0.4859837 0.8910067 0 0.4539901 0.4539795 0 -0.8910121 -0.453989 0 0.8910073 -0.8910067 0 -0.4539901 0.9068743 0 0.4214013 0.4214009 0 -0.9068745 -0.421399 0 0.9068753 -0.9068741 0 -0.4214017 0.794578 0 0.6071621 0.6071733 0 -0.7945695 -0.6071672 0 0.7945741 -0.7945784 0 -0.6071616 0.8160597 0 0.5779677 0.577966 0 -0.8160608 -0.5779683 0 0.8160592 -0.8160599 0 -0.5779674 0.8364699 0 0.5480129 0.5480007 0 -0.8364779 -0.5480184 0 0.8364663 -0.8364698 0 -0.5480131 0.3993644 0 -0.9167923 -0.916795 0 -0.3993582 0.9167942 0 0.39936 -0.399364 0 0.9167925 0.3658767 0 -0.9306633 -0.9306604 0 -0.3658841 0.9306669 0 0.3658676 -0.365876 0 0.9306636 0.3319086 0 -0.9433115 -0.9433091 0 -0.3319156 0.9433088 0 0.3319163 -0.3319084 0 0.9433116 0.5580798 0 0.8297873 0.8297869 0 -0.5580804 -0.8297884 0 0.5580782 -0.5580794 0 -0.8297875 0.5877856 0 0.8090167 0.8090179 0 -0.5877841 -0.809014 0 0.5877894 -0.5877857 0 -0.8090167 0.616719 0 0.7871834 0.7871777 0 -0.6167263 -0.7871777 0 0.6167263 -0.616719 0 -0.7871834 0.4647231 0 0.8854561 0.8854534 0 -0.4647281 -0.8854524 0 0.4647301 -0.4647235 0 -0.8854559 0.4965083 0 0.868032 0.8680312 0 -0.4965097 -0.8680336 0 0.4965055 -0.4965076 0 -0.8680324 0.5276405 0 0.8494678 0.8494705 0 -0.5276361 -0.8494719 0 0.5276339 -0.5276402 0 -0.849468 -0.5680645 0 -0.822984 -0.8229809 0 0.5680691 0.8229786 0 -0.5680723 0.5680643 0 0.8229842 -0.5378658 0 -0.8430305 -0.8430328 0 0.5378621 0.8430385 0 -0.5378532 0.5378659 0 0.8430304 -0.5975174 0 -0.8018559 -0.8018535 0 0.5975206 0.8018564 0 -0.5975168 0.5975182 0 0.8018554 -0.6261847 0 -0.7796748 -0.7796765 0 0.6261826 0.7796746 0 -0.6261849 0.626185 0 0.7796745 -0.7071063 0 0.7071073 0.7071092 0 0.7071044 -0.7071092 0 -0.7071044 0.7071068 0 -0.7071068 -0.4104129 0 0.9118998 0.9118999 0 0.4104127 -0.9118997 0 -0.4104132 0.4104127 0 -0.9118999 0.8557811 0 0.5173381 0.5173399 0 -0.85578 -0.5173354 0 0.8557827 -0.8557811 0 -0.517338 0.9836199 0 0.180255 0.1802633 0 -0.9836184 -0.1802588 0 0.9836192 -0.98362 0 -0.1802548 0.98362 0 -0.1802548 -0.1802633 0 -0.9836184 0.1802588 0 0.9836192 -0.9836199 0 0.180255 -0.06037706 0 0.9981756 0.9981756 0 0.06037729 -0.9981751 0 -0.06038637 0.0603786 0 -0.9981755 0.2975031 0 0.9547209 0.9547193 0 -0.2975081 -0.9547207 0 0.2975037 -0.2975033 0 -0.9547208 0.6167191 0 0.7871833 0.7871824 0 -0.6167202 -0.7871813 0 0.6167217 -0.6167189 0 -0.7871835 -0.4104132 0 -0.9118997 -0.9118993 0 0.410414 0.9118997 0 -0.4104132 0.4104129 0 0.9118998 -0.5680643 0 -0.8229842 -0.8229823 0 0.568067 0.8229876 0 -0.5680594 0.5680647 0 0.8229839 -0.7071066 0 -0.7071069 -0.7071068 0 0.7071068 0.707108 0 -0.7071056 0.7071071 0 0.7071065 -0.7071071 0 0.7071065 0.7071068 0 0.7071068 -0.707108 0 -0.7071056 0.7071066 0 -0.7071069 -0.5680647 0 0.8229839 0.8229823 0 0.568067 -0.8229876 0 -0.5680594 0.5680643 0 -0.8229842 -0.4104129 0 0.9118998 0.9118993 0 0.410414 -0.9118997 0 -0.4104132 0.4104132 0 -0.9118997 0.8557811 0 -0.517338 -0.5173399 0 -0.85578 0.5173354 0 0.8557827 -0.8557811 0 0.5173381 0.9836199 0 0.1802551 0.1802633 0 -0.9836184 -0.1802587 0 0.9836192 -0.9836199 0 -0.180255 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9836199 0 -0.180255 -0.1802633 0 -0.9836184 0.1802587 0 0.9836192 -0.9836199 0 0.1802551 0.8557813 0 0.5173377 0.517341 0 -0.8557794 -0.5173343 0 0.8557834 -0.8557811 0 -0.5173381 0.9350163 0 0.3546047 0.3546 0 -0.9350181 -0.3546091 0 0.9350146 -0.9350163 0 -0.3546048 0.2975024 0 0.9547211 0.9547226 0 -0.2974974 -0.954722 0 0.2974994 -0.2975033 0 -0.9547208 0.464723 0 0.8854561 0.8854589 0 -0.4647177 -0.8854569 0 0.4647214 -0.4647227 0 -0.8854563 0.6167189 0 0.7871834 0.7871863 0 -0.6167152 -0.7871813 0 0.6167217 -0.6167192 0 -0.7871832 0.7485106 0 0.6631228 0.6631206 0 -0.7485126 -0.6631193 0 0.7485138 -0.7485108 0 -0.6631226 -0.2393156 0 0.9709418 0.9709431 0 0.2393103 -0.9709419 0 -0.2393154 0.2393154 0 -0.9709419 -0.06037908 0 0.9981755 0.9981754 0 0.06038176 -0.9981756 0 -0.06037729 0.06037841 0 -0.9981756 0.1205365 0 0.9927089 0.992709 0 -0.1205353 -0.9927085 0 0.1205397 -0.1205361 0 -0.9927089 0.1205361 0 -0.9927089 -0.992709 0 -0.1205353 0.9927085 0 0.1205397 -0.1205365 0 0.9927089 -0.06037841 0 -0.9981756 -0.9981754 0 0.06038176 0.9981756 0 -0.06037729 0.06037908 0 0.9981755 0.6167189 0 -0.7871835 -0.7871824 0 -0.6167202 0.7871813 0 0.6167217 -0.6167191 0 0.7871833 0.2975033 0 -0.9547208 -0.9547193 0 -0.2975081 0.9547207 0 0.2975037 -0.2975031 0 0.9547209 -0.0603786 0 -0.9981755 -0.9981756 0 0.06037729 0.9981751 0 -0.06038637 0.06037706 0 0.9981756 -0.4104127 0 -0.9118999 -0.9118999 0 0.4104127 0.9118997 0 -0.4104132 0.4104129 0 0.9118998 -0.7071068 0 -0.7071068 -0.7071092 0 0.7071044 0.7071092 0 -0.7071044 0.7071063 0 0.7071073</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260Shape-tangents-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260Shape-binormals" name="qt_gauge_tickmarks_260Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_260Shape-binormals-array" count="2064">-0.9709419 0 0.2393154 0.2393103 0 0.9709432 -0.2393154 0 -0.9709419 0.9709419 0 -0.2393156 -0.3546048 0 -0.9350163 -0.9350181 0 0.3546 0.9350147 0 -0.3546091 0.3546047 0 0.9350163 -0.6631226 0 -0.7485108 -0.7485126 0 0.6631206 0.7485138 0 -0.6631193 0.6631228 0 0.7485107 -0.5173382 0 -0.8557811 -0.8557794 0 0.517341 0.8557834 0 -0.5173343 0.5173377 0 0.8557813 -0.9547208 0 -0.2975033 -0.2974974 0 0.9547227 0.2974994 0 -0.9547221 0.9547212 0 0.2975025 -0.7871833 0 -0.6167192 -0.6167153 0 0.7871864 0.6167217 0 -0.7871813 0.7871835 0 0.6167189 -0.8854563 0 -0.4647227 -0.4647177 0 0.8854589 0.4647214 0 -0.885457 0.8854561 0 0.464723 -0.9988323 0 -0.04831408 -0.04830324 0 0.9988327 0.04831344 0 -0.9988322 0.9988323 0 0.04831269 -0.999927 0 -0.01208305 -0.01207334 0 0.9999271 0.01209253 0 -0.999927 0.999927 0 0.01208212 -0.9997081 0 0.0241642 0.0241661 0 0.999708 -0.0241661 0 -0.999708 0.9997081 0 -0.0241642 -0.9547206 0 -0.2975041 -0.297497 0 0.9547228 0.2975104 0 -0.9547186 0.954721 0 0.2975029 -0.9648755 0 -0.2627077 -0.2626992 0 0.9648778 0.2626986 0 -0.964878 0.9648754 0 0.262708 -0.9737629 0 -0.2275654 -0.2275762 0 0.9737602 0.2275635 0 -0.9737632 0.9737625 0 0.2275667 -0.98137 0 -0.1921277 -0.1921265 0 0.9813702 0.1921384 0 -0.9813679 0.9813702 0 0.1921265 -0.9876884 0 -0.1564343 -0.1564222 0 0.9876904 0.1564408 0 -0.9876874 0.9876884 0 0.1564346 -0.992709 0 -0.1205363 -0.1205344 0 0.9927092 0.1205339 0 -0.9927092 0.9927089 0 0.1205368 -0.9964252 0 -0.08447985 -0.0844767 0 0.9964255 0.08447549 0 -0.9964256 0.9964252 0 0.08448127 -0.8090167 0 -0.5877857 -0.5877841 0 0.8090179 0.5877894 0 -0.809014 0.8090168 0 0.5877856 -0.8297876 0 -0.5580794 -0.5580804 0 0.8297869 0.5580782 0 -0.8297883 0.8297874 0 0.5580798 -0.8494681 0 -0.5276402 -0.5276361 0 0.8494706 0.527634 0 -0.8494719 0.8494678 0 0.5276405 -0.5779673 0 -0.8160599 -0.8160608 0 0.577966 0.8160592 0 -0.5779682 0.5779677 0 0.8160597 -0.6071616 0 -0.7945784 -0.7945695 0 0.6071733 0.7945741 0 -0.6071672 0.6071621 0 0.794578 -0.6355594 0 -0.772052 -0.7720503 0 0.6355615 0.7720531 0 -0.6355582 0.6355602 0 0.7720513 -0.6631224 0 -0.748511 -0.7485033 0 0.6631311 0.7485059 0 -0.6631281 0.6631231 0 0.7485104 -0.6898136 0 -0.723987 -0.7239854 0 0.6898153 0.72399 0 -0.6898104 0.6898136 0 0.723987 -0.7155989 0 -0.6985114 -0.6985127 0 0.7155977 0.6985127 0 -0.7155977 0.7155989 0 0.6985114 -0.9981757 0 0.06037802 0.06038651 0 0.9981751 -0.06036779 0 -0.9981762 0.9981756 0 -0.06037861 -0.9953316 0 0.09651468 0.09651149 0 0.9953319 -0.09652047 0 -0.995331 0.9953317 0 -0.09651413 -0.9911801 0 0.1325224 0.1325323 0 0.9911788 -0.132521 0 -0.9911802 0.9911802 0 -0.1325211 -0.4859837 0 -0.8739679 -0.8739678 0 0.4859838 0.873969 0 -0.4859818 0.4859833 0 0.8739681 -0.5173377 0 -0.8557814 -0.8557801 0 0.5173399 0.8557842 0 -0.5173329 0.5173381 0 0.8557811 -0.5480131 0 -0.8364698 -0.8364779 0 0.5480007 0.8364663 0 -0.5480185 0.5480129 0 0.8364699 -0.3546049 0 -0.9350163 -0.9350195 0 0.3545966 0.9350162 0 -0.3546049 0.3546046 0 0.9350164 -0.388258 0 -0.9215507 -0.9215466 0 0.3882681 0.9215541 0 -0.3882501 0.3882583 0 0.9215506 -0.4214017 0 -0.9068741 -0.9068745 0 0.4214009 0.9068754 0 -0.4213991 0.4214013 0 0.9068743 -0.4539902 0 -0.8910068 -0.8910122 0 0.4539795 0.8910074 0 -0.453989 0.4539901 0 0.8910067 -0.2510297 0 -0.9679794 -0.9679853 0 0.2510073 0.9679803 0 -0.2510264 0.2510297 0 0.9679794 -0.2859458 0 -0.9582459 -0.9582447 0 0.2859497 0.9582475 0 -0.2859403 0.2859458 0 0.9582459 -0.3204857 0 -0.9472533 -0.9472548 0 0.3204818 0.9472544 0 -0.3204825 0.3204859 0 0.9472533 -0.1444893 0 -0.9895065 -0.9895076 0 0.1444819 0.9895061 0 -0.1444912 0.1444892 0 0.9895065 -0.1802549 0 -0.9836199 -0.9836202 0 0.1802541 0.9836202 0 -0.1802541 0.1802549 0 0.9836199 -0.2157842 0 -0.9764411 -0.9764423 0 0.2157787 0.9764423 0 -0.2157787 0.2157842 0 0.9764411 -0.03624117 0 -0.9993431 -0.9993432 0 0.03623962 0.9993432 0 -0.03623962 0.03624117 0 0.9993431 -0.07243482 0 -0.9973732 -0.9973741 0 0.07242203 0.9973727 0 -0.07244105 0.07243475 0 0.9973732 -0.1085332 0 -0.9940929 -0.9940914 0 0.1085471 0.9940945 0 -0.1085187 0.1085334 0 0.9940929 -0.9789768 0 0.2039715 0.2039635 0 0.9789785 -0.2039885 0 -0.9789733 0.9789773 0 -0.2039698 -0.970942 0 0.2393149 0.2393148 0 0.9709421 -0.2393255 0 -0.9709395 0.970942 0 -0.2393154 -0.9857262 0 0.1683562 0.1683617 0 0.9857253 -0.1683444 0 -0.9857283 0.9857261 0 -0.1683572 -0.8680325 0 -0.4965076 -0.4965097 0 0.8680313 0.4965056 0 -0.8680336 0.868032 0 0.4965084 -0.8854559 0 -0.4647235 -0.4647281 0 0.8854535 0.4647301 0 -0.8854524 0.8854561 0 0.4647231 -0.9017167 0 -0.4323275 -0.432338 0 0.9017118 0.432315 0 -0.9017227 0.9017164 0 0.4323283 0.9306636 0 -0.365876 -0.3658841 0 -0.9306605 0.3658676 0 0.9306669 -0.9306634 0 0.3658767 0.9167925 0 -0.399364 -0.3993583 0 -0.916795 0.39936 0 0.9167942 -0.9167924 0 0.3993644 0.9017163 0 -0.4323283 -0.4323379 0 -0.9017117 0.432315 0 0.9017227 -0.9017168 0 0.4323275 0.9648754 0 -0.262708 -0.2626992 0 -0.9648778 0.2626986 0 0.964878 -0.9648755 0 0.2627077 0.954721 0 -0.2975029 -0.297497 0 -0.9547228 0.2975105 0 0.9547186 -0.9547206 0 0.2975041 0.9433116 0 -0.3319084 -0.3319156 0 -0.9433091 0.3319163 0 0.9433089 -0.9433116 0 0.3319086 0.9927089 0 -0.1205368 -0.1205344 0 -0.9927092 0.1205339 0 0.9927092 -0.992709 0 0.1205363 0.9876884 0 -0.1564346 -0.1564222 0 -0.9876903 0.1564408 0 0.9876873 -0.9876884 0 0.1564343 0.9813702 0 -0.1921265 -0.1921265 0 -0.9813702 0.1921384 0 0.9813679 -0.98137 0 0.1921277 0.9737626 0 -0.2275667 -0.2275762 0 -0.9737602 0.2275635 0 0.9737632 -0.9737629 0 0.2275654 0.9999271 0 -0.01208212 -0.01207334 0 -0.9999272 0.01209253 0 0.9999269 -0.9999271 0 0.01208305 0.9988323 0 -0.04831269 -0.04830324 0 -0.9988327 0.04831344 0 0.9988322 -0.9988323 0 0.04831407 0.9964252 0 -0.08448127 -0.08447671 0 -0.9964256 0.08447549 0 0.9964256 -0.9964252 0 0.08447985 0.9953316 0 0.09651412 0.09651149 0 -0.9953319 -0.09652048 0 0.995331 -0.9953316 0 -0.09651468 0.9981756 0 0.06037861 0.06038651 0 -0.9981751 -0.0603678 0 0.9981763 -0.9981757 0 -0.06037802 0.9997081 0 0.0241642 0.0241661 0 -0.999708 -0.0241661 0 0.999708 -0.9997081 0 -0.0241642 0.2859458 0 -0.9582458 -0.9582447 0 -0.2859496 0.9582475 0 0.2859403 -0.2859458 0 0.9582458 0.2510297 0 -0.9679794 -0.9679852 0 -0.2510073 0.9679803 0 0.2510264 -0.2510297 0 0.9679794 0.2157842 0 -0.9764411 -0.9764424 0 -0.2157787 0.9764424 0 0.2157787 -0.2157842 0 0.9764411 0.3882583 0 -0.9215506 -0.9215465 0 -0.388268 0.9215541 0 0.3882501 -0.3882581 0 0.9215508 0.3546046 0 -0.9350165 -0.9350194 0 -0.3545966 0.9350163 0 0.3546049 -0.3546049 0 0.9350162 0.3204859 0 -0.9472533 -0.9472548 0 -0.3204818 0.9472545 0 0.3204825 -0.3204857 0 0.9472533 0.07243475 0 -0.9973732 -0.9973741 0 -0.07242203 0.9973727 0 0.07244105 -0.07243482 0 0.9973732 0.03624117 0 -0.9993432 -0.9993432 0 -0.03623962 0.9993432 0 0.03623962 -0.03624117 0 0.9993432 0 0 -1 -1 0 0 1 0 0 0 0 1 0.1802549 0 -0.98362 -0.9836201 0 -0.1802541 0.9836201 0 0.1802541 -0.1802549 0 0.98362 0.1444892 0 -0.9895065 -0.9895076 0 -0.1444819 0.9895061 0 0.1444912 -0.1444893 0 0.9895065 0.1085334 0 -0.9940929 -0.9940913 0 -0.108547 0.9940945 0 0.1085187 -0.1085332 0 0.9940929 0.9789772 0 0.2039698 0.2039635 0 -0.9789786 -0.2039885 0 0.9789733 -0.9789768 0 -0.2039715 0.9857261 0 0.1683572 0.1683617 0 -0.9857253 -0.1683444 0 0.9857283 -0.9857263 0 -0.1683562 0.9911802 0 0.1325211 0.1325323 0 -0.9911788 -0.132521 0 0.9911803 -0.9911801 0 -0.1325224 0.9510567 0 0.3090167 0.3090117 0 -0.9510583 -0.3090275 0 0.9510531 -0.9510563 0 -0.3090177 0.9616309 0 0.2743468 0.274342 0 -0.9616322 -0.2743363 0 0.9616339 -0.9616313 0 -0.2743455 0.970942 0 0.2393154 0.2393148 0 -0.9709421 -0.2393255 0 0.9709395 -0.9709421 0 -0.2393149 0.6898136 0 -0.723987 -0.7239854 0 -0.6898153 0.72399 0 0.6898104 -0.6898136 0 0.723987 0.6631231 0 -0.7485104 -0.7485033 0 -0.6631311 0.7485059 0 0.6631281 -0.6631224 0 0.748511 0.6355602 0 -0.7720514 -0.7720503 0 -0.6355615 0.7720531 0 0.6355582 -0.6355594 0 0.772052 0.7643158 0 -0.6448422 -0.6448356 0 -0.7643213 0.6448356 0 0.7643213 -0.7643158 0 0.6448422 0.7404435 0 -0.6721185 -0.6721206 0 -0.7404417 0.6721206 0 0.7404417 -0.7404435 0 0.6721185 0.7155989 0 -0.6985115 -0.6985127 0 -0.7155977 0.6985127 0 0.7155977 -0.7155989 0 0.6985115 0.9118996 0 0.4104133 0.4104026 0 -0.9119045 -0.4104141 0 0.9118994 -0.9118998 0 -0.4104128 0.9261747 0 0.377095 0.3771016 0 -0.9261719 -0.3770901 0 0.9261767 -0.9261745 0 -0.3770954 0.9392326 0 0.3432816 0.3432748 0 -0.939235 -0.3432879 0 0.9392303 -0.9392329 0 -0.3432806 0.8619695 0 0.5069602 0.5069609 0 -0.8619691 -0.5069538 0 0.8619732 -0.8619698 0 -0.5069598 0.8797764 0 0.4753878 0.4753866 0 -0.879777 -0.4753866 0 0.879777 -0.8797764 0 -0.4753878 0.8964266 0 0.4431922 0.4431922 0 -0.8964266 -0.4431864 0 0.8964295 -0.8964271 0 -0.4431915 0.8018554 0 0.5975181 0.5975206 0 -0.8018536 -0.5975168 0 0.8018564 -0.8018559 0 -0.5975174 0.8229842 0 0.5680643 0.5680691 0 -0.8229809 -0.5680723 0 0.8229787 -0.822984 0 -0.5680646 0.8430304 0 0.5378659 0.5378622 0 -0.8430329 -0.5378532 0 0.8430386 -0.8430305 0 -0.5378658 0.707107 0 0.7071065 0.7071068 0 -0.7071068 -0.7071068 0 0.7071068 -0.7071075 0 -0.7071061 0.7322693 0 0.6810151 0.6810168 0 -0.7322678 -0.6810197 0 0.7322651 -0.7322682 0 -0.6810163 0.7564686 0 0.6540301 0.6540298 0 -0.7564688 -0.6540349 0 0.7564644 -0.7564685 0 -0.6540301 0.7796746 0 0.6261849 0.6261826 0 -0.7796765 -0.626185 0 0.7796746 -0.7796748 0 -0.6261846 -0.9510563 0 0.3090177 0.3090117 0 0.9510583 -0.3090275 0 -0.9510531 0.9510567 0 -0.3090167 -0.9616313 0 0.2743455 0.274342 0 0.9616323 -0.2743363 0 -0.9616339 0.9616308 0 -0.2743468 -0.9118999 0 0.4104129 0.4104025 0 0.9119045 -0.410414 0 -0.9118993 0.9118996 0 -0.4104133 -0.9261745 0 0.3770955 0.3771016 0 0.9261719 -0.3770901 0 -0.9261766 0.9261747 0 -0.377095 -0.939233 0 0.3432806 0.3432748 0 0.939235 -0.3432879 0 -0.9392303 0.9392326 0 -0.3432815 -0.7404435 0 -0.6721185 -0.6721206 0 0.7404417 0.6721206 0 -0.7404417 0.7404435 0 0.6721185 -0.7643157 0 -0.6448422 -0.6448356 0 0.7643214 0.6448356 0 -0.7643214 0.7643157 0 0.6448422 -0.7871834 0 -0.6167189 -0.6167263 0 0.7871777 0.6167263 0 -0.7871777 0.7871834 0 0.6167189 -0.8964271 0 0.4431915 0.4431922 0 0.8964267 -0.4431865 0 -0.8964295 0.8964266 0 -0.4431922 -0.8797765 0 0.4753878 0.4753866 0 0.8797771 -0.4753866 0 -0.8797771 0.8797765 0 -0.4753878 -0.8619697 0 0.5069598 0.5069609 0 0.8619691 -0.5069538 0 -0.8619732 0.8619695 0 -0.5069602 -0.7322682 0 0.6810163 0.6810168 0 0.7322678 -0.6810197 0 -0.7322651 0.7322693 0 -0.6810151 -0.7564685 0 0.6540301 0.6540298 0 0.7564688 -0.6540349 0 -0.7564644 0.7564685 0 -0.6540301 -0.7071075 0 0.7071061 0.7071068 0 0.7071068 -0.7071068 0 -0.7071068 0.707107 0 -0.7071065 0.5173381 0 -0.8557811 -0.85578 0 -0.5173399 0.8557842 0 0.5173329 -0.5173377 0 0.8557814 0.4859833 0 -0.8739681 -0.8739678 0 -0.4859838 0.873969 0 0.4859818 -0.4859837 0 0.8739679 0.4539901 0 -0.8910068 -0.8910123 0 -0.4539796 0.8910073 0 0.453989 -0.4539901 0 0.8910068 0.4214013 0 -0.9068744 -0.9068745 0 -0.4214009 0.9068753 0 0.4213991 -0.4214017 0 0.9068742 0.6071621 0 -0.794578 -0.7945696 0 -0.6071733 0.7945741 0 0.6071672 -0.6071616 0 0.7945784 0.5779677 0 -0.8160596 -0.8160608 0 -0.577966 0.8160593 0 0.5779682 -0.5779674 0 0.8160599 0.5480129 0 -0.8364699 -0.8364779 0 -0.5480007 0.8364663 0 0.5480185 -0.5480131 0 0.8364698 -0.9167924 0 -0.3993644 -0.3993582 0 0.916795 0.39936 0 -0.9167942 0.9167925 0 0.399364 -0.9306633 0 -0.3658767 -0.3658841 0 0.9306604 0.3658676 0 -0.9306669 0.9306636 0 0.365876 -0.9433116 0 -0.3319087 -0.3319156 0 0.9433091 0.3319163 0 -0.9433089 0.9433117 0 0.3319084 0.8297873 0 -0.5580798 -0.5580804 0 -0.829787 0.5580782 0 0.8297883 -0.8297876 0 0.5580794 0.8090167 0 -0.5877856 -0.5877841 0 -0.809018 0.5877894 0 0.809014 -0.8090167 0 0.5877857 0.7871834 0 -0.6167189 -0.6167263 0 -0.7871777 0.6167263 0 0.7871777 -0.7871834 0 0.6167189 0.8854561 0 -0.4647231 -0.4647281 0 -0.8854535 0.4647301 0 0.8854525 -0.8854559 0 0.4647235 0.868032 0 -0.4965083 -0.4965097 0 -0.8680313 0.4965056 0 0.8680336 -0.8680325 0 0.4965076 0.8494678 0 -0.5276405 -0.5276361 0 -0.8494706 0.527634 0 0.8494719 -0.849468 0 0.5276402 -0.822984 0 0.5680646 0.5680691 0 0.8229809 -0.5680724 0 -0.8229787 0.8229842 0 -0.5680643 -0.8430305 0 0.5378658 0.5378622 0 0.8430329 -0.5378532 0 -0.8430386 0.8430305 0 -0.5378659 -0.801856 0 0.5975174 0.5975206 0 0.8018535 -0.5975168 0 -0.8018564 0.8018554 0 -0.5975181 -0.7796748 0 0.6261846 0.6261826 0 0.7796765 -0.6261849 0 -0.7796746 0.7796745 0 -0.6261849 0.7071072 0 0.7071063 0.7071044 0 -0.7071092 -0.7071044 0 0.7071092 -0.7071068 0 -0.7071068 0.9118999 0 0.4104129 0.4104127 0 -0.9118999 -0.4104132 0 0.9118997 -0.9118999 0 -0.4104127 0.5173381 0 -0.8557811 -0.85578 0 -0.5173399 0.8557827 0 0.5173354 -0.517338 0 0.8557812 0.180255 0 -0.9836199 -0.9836185 0 -0.1802633 0.9836192 0 0.1802588 -0.1802548 0 0.98362 -0.1802548 0 -0.98362 -0.9836185 0 0.1802633 0.9836193 0 -0.1802588 0.180255 0 0.9836199 0.9981757 0 0.06037707 0.0603773 0 -0.9981757 -0.06038637 0 0.9981751 -0.9981756 0 -0.0603786 0.9547209 0 -0.2975031 -0.2975081 0 -0.9547194 0.2975037 0 0.9547207 -0.9547208 0 0.2975033 0.7871833 0 -0.6167191 -0.6167202 0 -0.7871825 0.6167217 0 0.7871814 -0.7871835 0 0.6167189 -0.9118997 0 0.4104131 0.4104141 0 0.9118993 -0.4104131 0 -0.9118997 0.9118999 0 -0.4104129 -0.8229842 0 0.5680643 0.568067 0 0.8229824 -0.5680594 0 -0.8229876 0.8229839 0 -0.5680647 -0.7071069 0 0.7071066 0.7071068 0 0.7071068 -0.7071056 0 -0.707108 0.7071065 0 -0.7071071 0.7071065 0 0.7071071 0.7071068 0 -0.7071068 -0.7071056 0 0.707108 -0.7071069 0 -0.7071066 0.822984 0 0.5680647 0.568067 0 -0.8229823 -0.5680594 0 0.8229876 -0.8229842 0 -0.5680643 0.9118999 0 0.4104129 0.4104141 0 -0.9118994 -0.4104131 0 0.9118997 -0.9118997 0 -0.4104131 -0.517338 0 -0.8557811 -0.8557801 0 0.5173399 0.8557827 0 -0.5173354 0.5173381 0 0.8557811 0.1802551 0 -0.98362 -0.9836184 0 -0.1802633 0.9836193 0 0.1802587 -0.180255 0 0.9836199 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.180255 0 -0.9836199 -0.9836185 0 0.1802633 0.9836193 0 -0.1802587 0.1802551 0 0.9836199 0.5173377 0 -0.8557814 -0.8557794 0 -0.517341 0.8557834 0 0.5173343 -0.5173382 0 0.8557811 0.3546047 0 -0.9350163 -0.9350182 0 -0.3546 0.9350147 0 0.3546091 -0.3546048 0 0.9350163 0.9547211 0 -0.2975024 -0.2974974 0 -0.9547226 0.2974994 0 0.9547221 -0.9547208 0 0.2975033 0.8854562 0 -0.464723 -0.4647177 0 -0.8854589 0.4647215 0 0.885457 -0.8854563 0 0.4647228 0.7871835 0 -0.6167189 -0.6167153 0 -0.7871864 0.6167217 0 0.7871813 -0.7871832 0 0.6167192 0.6631228 0 -0.7485107 -0.7485126 0 -0.6631206 0.7485138 0 0.6631193 -0.6631226 0 0.7485108 0.9709418 0 0.2393156 0.2393103 0 -0.9709432 -0.2393154 0 0.970942 -0.9709419 0 -0.2393154 0.9981755 0 0.06037908 0.06038176 0 -0.9981754 -0.0603773 0 0.9981756 -0.9981756 0 -0.06037841 0.992709 0 -0.1205365 -0.1205353 0 -0.992709 0.1205397 0 0.9927085 -0.992709 0 0.1205361 -0.992709 0 -0.1205361 -0.1205353 0 0.9927091 0.1205397 0 -0.9927085 0.9927089 0 0.1205365 -0.9981756 0 0.06037841 0.06038176 0 0.9981754 -0.0603773 0 -0.9981756 0.9981755 0 -0.06037908 -0.7871835 0 -0.6167189 -0.6167202 0 0.7871825 0.6167217 0 -0.7871814 0.7871833 0 0.6167191 -0.9547209 0 -0.2975033 -0.2975081 0 0.9547194 0.2975037 0 -0.9547207 0.9547209 0 0.2975031 -0.9981756 0 0.0603786 0.0603773 0 0.9981756 -0.06038636 0 -0.9981751 0.9981757 0 -0.06037707 -0.9118999 0 0.4104127 0.4104127 0 0.9118999 -0.4104131 0 -0.9118997 0.9118998 0 -0.4104129 -0.7071068 0 0.7071068 0.7071044 0 0.7071092 -0.7071044 0 -0.7071092 0.7071072 0 -0.7071063</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260Shape-binormals-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260Shape-map1" name="qt_gauge_tickmarks_260Shape-map1">
+ <float_array id="qt_gauge_tickmarks_260Shape-map1-array" count="1376">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260Shape-map1-array" count="688" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_260Shape-textangents-array" count="2064">-0.2393103 0 -0.9709431 -0.2393128 0 -0.9709424 -0.2393153 0 -0.9709418 -0.2393128 0 -0.9709424 0.9350181 0 -0.3546 0.9350163 0 -0.3546045 0.9350146 0 -0.3546091 0.9350163 0 -0.3546045 0.7485125 0 -0.6631205 0.7485131 0 -0.6631199 0.7485137 0 -0.6631192 0.7485131 0 -0.6631199 0.8557793 0 -0.517341 0.8557813 0 -0.5173376 0.8557833 0 -0.5173343 0.8557813 0 -0.5173376 0.2974973 0 -0.9547226 0.2974984 0 -0.9547223 0.2974994 0 -0.954722 0.2974984 0 -0.9547223 0.6167152 0 -0.7871863 0.6167184 0 -0.7871838 0.6167216 0 -0.7871813 0.6167184 0 -0.7871838 0.4647177 0 -0.8854589 0.4647195 0 -0.8854579 0.4647214 0 -0.8854569 0.4647195 0 -0.8854579 0.04830323 0 -0.9988326 0.04830833 0 -0.9988324 0.04831344 0 -0.9988322 0.04830833 0 -0.9988324 0.01207334 0 -0.999927 0.01208293 0 -0.999927 0.01209253 0 -0.9999269 0.01208293 0 -0.999927 -0.0241661 0 -0.9997079 -0.0241661 0 -0.9997079 -0.0241661 0 -0.9997079 -0.0241661 0 -0.9997079 0.297497 0 -0.9547227 0.2975037 0 -0.9547206 0.2975104 0 -0.9547185 0.2975037 0 -0.9547206 0.2626992 0 -0.9648777 0.2626989 0 -0.9648778 0.2626985 0 -0.9648779 0.2626989 0 -0.9648778 0.2275762 0 -0.9737602 0.2275698 0 -0.9737617 0.2275635 0 -0.9737632 0.2275698 0 -0.9737617 0.1921265 0 -0.9813701 0.1921324 0 -0.981369 0.1921384 0 -0.9813678 0.1921324 0 -0.981369 0.1564222 0 -0.9876903 0.1564315 0 -0.9876888 0.1564407 0 -0.9876873 0.1564315 0 -0.9876888 0.1205344 0 -0.9927091 0.1205342 0 -0.9927092 0.1205339 0 -0.9927092 0.1205342 0 -0.9927092 0.0844767 0 -0.9964254 0.08447609 0 -0.9964254 0.08447549 0 -0.9964255 0.08447609 0 -0.9964254 0.587784 0 -0.8090178 0.5877867 0 -0.8090159 0.5877894 0 -0.8090139 0.5877867 0 -0.8090159 0.5580804 0 -0.8297868 0.5580793 0 -0.8297876 0.5580782 0 -0.8297883 0.5580793 0 -0.8297876 0.5276361 0 -0.8494705 0.5276349 0 -0.8494712 0.5276339 0 -0.8494718 0.5276349 0 -0.8494712 0.8160608 0 -0.577966 0.8160599 0 -0.577967 0.8160592 0 -0.5779682 0.8160599 0 -0.577967 0.7945694 0 -0.6071732 0.7945718 0 -0.6071702 0.794574 0 -0.6071672 0.7945718 0 -0.6071702 0.7720502 0 -0.6355615 0.7720516 0 -0.6355597 0.772053 0 -0.6355581 0.7720516 0 -0.6355597 0.7485032 0 -0.6631311 0.7485045 0 -0.6631296 0.7485058 0 -0.6631281 0.7485045 0 -0.6631296 0.7239853 0 -0.6898152 0.7239877 0 -0.6898128 0.72399 0 -0.6898103 0.7239877 0 -0.6898128 0.6985126 0 -0.7155976 0.6985126 0 -0.7155976 0.6985126 0 -0.7155976 0.6985126 0 -0.7155976 -0.0603865 0 -0.998175 -0.06037715 0 -0.9981756 -0.06036779 0 -0.9981762 -0.06037715 0 -0.9981756 -0.09651148 0 -0.9953318 -0.09651598 0 -0.9953314 -0.09652046 0 -0.9953309 -0.09651598 0 -0.9953314 -0.1325323 0 -0.9911786 -0.1325266 0 -0.9911794 -0.132521 0 -0.9911802 -0.1325266 0 -0.9911794 0.8739678 0 -0.4859838 0.8739683 0 -0.4859827 0.8739689 0 -0.4859817 0.8739683 0 -0.4859827 0.8557799 0 -0.5173399 0.855782 0 -0.5173363 0.8557842 0 -0.5173329 0.855782 0 -0.5173363 0.8364778 0 -0.5480006 0.836472 0 -0.5480096 0.8364662 0 -0.5480184 0.836472 0 -0.5480096 0.9350194 0 -0.3545966 0.9350178 0 -0.3546007 0.9350162 0 -0.3546049 0.9350178 0 -0.3546007 0.9215465 0 -0.388268 0.9215502 0 -0.388259 0.921554 0 -0.3882501 0.9215502 0 -0.388259 0.9068744 0 -0.4214008 0.9068748 0 -0.4213999 0.9068753 0 -0.421399 0.9068748 0 -0.4213999 0.8910121 0 -0.4539795 0.8910096 0 -0.4539842 0.8910072 0 -0.453989 0.8910096 0 -0.4539842 0.967985 0 -0.2510073 0.9679826 0 -0.2510168 0.9679802 0 -0.2510263 0.9679826 0 -0.2510168 0.9582446 0 -0.2859496 0.958246 0 -0.2859449 0.9582474 0 -0.2859403 0.958246 0 -0.2859449 0.9472547 0 -0.3204818 0.9472545 0 -0.3204821 0.9472544 0 -0.3204825 0.9472545 0 -0.3204821 0.9895074 0 -0.1444818 0.9895067 0 -0.1444865 0.989506 0 -0.1444912 0.9895067 0 -0.1444865 0.98362 0 -0.180254 0.98362 0 -0.180254 0.98362 0 -0.180254 0.98362 0 -0.180254 0.9764423 0 -0.2157787 0.9764423 0 -0.2157787 0.9764423 0 -0.2157787 0.9764423 0 -0.2157787 0.9993431 0 -0.03623962 0.9993431 0 -0.03623962 0.9993431 0 -0.03623962 0.9993431 0 -0.03623962 0.997374 0 -0.07242202 0.9973733 0 -0.07243153 0.9973726 0 -0.07244104 0.9973733 0 -0.07243153 0.9940913 0 -0.108547 0.9940928 0 -0.1085329 0.9940944 0 -0.1085187 0.9940928 0 -0.1085329 -0.2039635 0 -0.9789785 -0.203976 0 -0.9789758 -0.2039885 0 -0.9789732 -0.203976 0 -0.9789758 -0.2393148 0 -0.970942 -0.2393201 0 -0.9709407 -0.2393254 0 -0.9709393 -0.2393201 0 -0.9709407 -0.1683617 0 -0.9857252 -0.168353 0 -0.9857267 -0.1683444 0 -0.9857282 -0.168353 0 -0.9857267 0.4965096 0 -0.8680311 0.4965076 0 -0.8680323 0.4965055 0 -0.8680335 0.4965076 0 -0.8680323 0.4647281 0 -0.8854534 0.4647291 0 -0.8854529 0.4647301 0 -0.8854524 0.4647291 0 -0.8854529 0.4323379 0 -0.9017116 0.4323264 0 -0.9017171 0.4323149 0 -0.9017226 0.4323264 0 -0.9017171 0.3658841 0 0.9306604 0.3658758 0 0.9306635 0.3658676 0 0.9306669 0.3658758 0 0.9306635 0.3993582 0 0.9167949 0.3993591 0 0.9167945 0.39936 0 0.9167941 0.3993591 0 0.9167945 0.4323379 0 0.9017116 0.4323264 0 0.9017171 0.4323149 0 0.9017226 0.4323264 0 0.9017171 0.2626992 0 0.9648777 0.2626989 0 0.9648778 0.2626985 0 0.9648779 0.2626989 0 0.9648778 0.297497 0 0.9547227 0.2975037 0 0.9547206 0.2975104 0 0.9547185 0.2975037 0 0.9547206 0.3319155 0 0.9433089 0.3319159 0 0.9433089 0.3319163 0 0.9433088 0.3319159 0 0.9433089 0.1205344 0 0.9927091 0.1205342 0 0.9927092 0.1205339 0 0.9927092 0.1205342 0 0.9927092 0.1564222 0 0.9876903 0.1564315 0 0.9876888 0.1564407 0 0.9876873 0.1564315 0 0.9876888 0.1921265 0 0.9813701 0.1921324 0 0.981369 0.1921384 0 0.9813678 0.1921324 0 0.981369 0.2275762 0 0.9737602 0.2275698 0 0.9737617 0.2275635 0 0.9737632 0.2275698 0 0.9737617 0.01207334 0 0.999927 0.01208293 0 0.999927 0.01209253 0 0.9999269 0.01208293 0 0.999927 0.04830323 0 0.9988326 0.04830833 0 0.9988324 0.04831344 0 0.9988322 0.04830833 0 0.9988324 0.0844767 0 0.9964254 0.08447609 0 0.9964254 0.08447549 0 0.9964255 0.08447609 0 0.9964254 -0.09651148 0 0.9953318 -0.09651598 0 0.9953314 -0.09652046 0 0.9953309 -0.09651598 0 0.9953314 -0.0603865 0 0.998175 -0.06037715 0 0.9981756 -0.06036779 0 0.9981762 -0.06037715 0 0.9981756 -0.0241661 0 0.9997079 -0.0241661 0 0.9997079 -0.0241661 0 0.9997079 -0.0241661 0 0.9997079 0.9582446 0 0.2859496 0.958246 0 0.2859449 0.9582474 0 0.2859403 0.958246 0 0.2859449 0.967985 0 0.2510073 0.9679826 0 0.2510168 0.9679802 0 0.2510263 0.9679826 0 0.2510168 0.9764423 0 0.2157787 0.9764423 0 0.2157787 0.9764423 0 0.2157787 0.9764423 0 0.2157787 0.9215465 0 0.388268 0.9215502 0 0.388259 0.921554 0 0.3882501 0.9215502 0 0.388259 0.9350194 0 0.3545966 0.9350178 0 0.3546007 0.9350162 0 0.3546049 0.9350178 0 0.3546007 0.9472547 0 0.3204818 0.9472545 0 0.3204821 0.9472544 0 0.3204825 0.9472545 0 0.3204821 0.997374 0 0.07242202 0.9973733 0 0.07243153 0.9973726 0 0.07244104 0.9973733 0 0.07243153 0.9993431 0 0.03623962 0.9993431 0 0.03623962 0.9993431 0 0.03623962 0.9993431 0 0.03623962 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.98362 0 0.180254 0.98362 0 0.180254 0.98362 0 0.180254 0.98362 0 0.180254 0.9895074 0 0.1444818 0.9895067 0 0.1444865 0.989506 0 0.1444912 0.9895067 0 0.1444865 0.9940913 0 0.108547 0.9940928 0 0.1085329 0.9940944 0 0.1085187 0.9940928 0 0.1085329 -0.2039635 0 0.9789785 -0.203976 0 0.9789758 -0.2039885 0 0.9789732 -0.203976 0 0.9789758 -0.1683617 0 0.9857252 -0.168353 0 0.9857267 -0.1683444 0 0.9857282 -0.168353 0 0.9857267 -0.1325323 0 0.9911786 -0.1325266 0 0.9911794 -0.132521 0 0.9911802 -0.1325266 0 0.9911794 -0.3090116 0 0.9510582 -0.3090196 0 0.9510556 -0.3090275 0 0.951053 -0.3090196 0 0.9510556 -0.2743419 0 0.9616321 -0.2743391 0 0.961633 -0.2743363 0 0.9616338 -0.2743391 0 0.961633 -0.2393148 0 0.970942 -0.2393201 0 0.9709407 -0.2393254 0 0.9709393 -0.2393201 0 0.9709407 0.7239853 0 0.6898152 0.7239877 0 0.6898128 0.72399 0 0.6898103 0.7239877 0 0.6898128 0.7485032 0 0.6631311 0.7485045 0 0.6631296 0.7485058 0 0.6631281 0.7485045 0 0.6631296 0.7720502 0 0.6355615 0.7720516 0 0.6355597 0.772053 0 0.6355581 0.7720516 0 0.6355597 0.6448355 0 0.7643213 0.6448355 0 0.7643213 0.6448355 0 0.7643213 0.6448355 0 0.7643213 0.6721205 0 0.7404417 0.6721205 0 0.7404417 0.6721205 0 0.7404417 0.6721205 0 0.7404417 0.6985126 0 0.7155976 0.6985126 0 0.7155976 0.6985126 0 0.7155976 0.6985126 0 0.7155976 -0.4104025 0 0.9119044 -0.4104083 0 0.9119018 -0.410414 0 0.9118993 -0.4104083 0 0.9119018 -0.3771015 0 0.9261718 -0.3770958 0 0.9261741 -0.37709 0 0.9261765 -0.3770958 0 0.9261741 -0.3432748 0 0.939235 -0.3432813 0 0.9392326 -0.3432878 0 0.9392302 -0.3432813 0 0.9392326 -0.5069609 0 0.861969 -0.5069574 0 0.8619711 -0.5069538 0 0.8619731 -0.5069574 0 0.8619711 -0.4753866 0 0.879777 -0.4753866 0 0.879777 -0.4753866 0 0.879777 -0.4753866 0 0.879777 -0.4431922 0 0.8964266 -0.4431893 0 0.896428 -0.4431864 0 0.8964294 -0.4431893 0 0.896428 -0.5975206 0 0.8018535 -0.5975186 0 0.8018549 -0.5975167 0 0.8018563 -0.5975186 0 0.8018549 -0.568069 0 0.8229808 -0.5680707 0 0.8229797 -0.5680723 0 0.8229786 -0.5680707 0 0.8229797 -0.5378621 0 0.8430328 -0.5378577 0 0.8430356 -0.5378531 0 0.8430384 -0.5378577 0 0.8430356 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 -0.6810167 0 0.7322677 -0.6810182 0 0.7322664 -0.6810197 0 0.7322651 -0.6810182 0 0.7322664 -0.6540298 0 0.7564687 -0.6540323 0 0.7564665 -0.6540349 0 0.7564643 -0.6540323 0 0.7564665 -0.6261825 0 0.7796764 -0.6261837 0 0.7796754 -0.6261848 0 0.7796745 -0.6261837 0 0.7796754 -0.3090116 0 -0.9510582 -0.3090196 0 -0.9510556 -0.3090275 0 -0.951053 -0.3090196 0 -0.9510556 -0.2743419 0 -0.9616321 -0.2743391 0 -0.961633 -0.2743363 0 -0.9616338 -0.2743391 0 -0.961633 -0.4104025 0 -0.9119044 -0.4104083 0 -0.9119018 -0.410414 0 -0.9118993 -0.4104083 0 -0.9119018 -0.3771015 0 -0.9261718 -0.3770958 0 -0.9261741 -0.37709 0 -0.9261765 -0.3770958 0 -0.9261741 -0.3432748 0 -0.939235 -0.3432813 0 -0.9392326 -0.3432878 0 -0.9392302 -0.3432813 0 -0.9392326 0.6721205 0 -0.7404417 0.6721205 0 -0.7404417 0.6721205 0 -0.7404417 0.6721205 0 -0.7404417 0.6448355 0 -0.7643213 0.6448355 0 -0.7643213 0.6448355 0 -0.7643213 0.6448355 0 -0.7643213 0.6167262 0 -0.7871776 0.6167262 0 -0.7871776 0.6167262 0 -0.7871776 0.6167262 0 -0.7871776 -0.4431922 0 -0.8964266 -0.4431893 0 -0.896428 -0.4431864 0 -0.8964294 -0.4431893 0 -0.896428 -0.4753866 0 -0.879777 -0.4753866 0 -0.879777 -0.4753866 0 -0.879777 -0.4753866 0 -0.879777 -0.5069609 0 -0.861969 -0.5069574 0 -0.8619711 -0.5069538 0 -0.8619731 -0.5069574 0 -0.8619711 -0.6810167 0 -0.7322677 -0.6810182 0 -0.7322664 -0.6810197 0 -0.7322651 -0.6810182 0 -0.7322664 -0.6540298 0 -0.7564687 -0.6540323 0 -0.7564665 -0.6540349 0 -0.7564643 -0.6540323 0 -0.7564665 -0.7071068 0 -0.7071068 -0.7071068 0 -0.7071068 -0.7071068 0 -0.7071068 -0.7071068 0 -0.7071068 0.8557799 0 0.5173399 0.855782 0 0.5173363 0.8557842 0 0.5173329 0.855782 0 0.5173363 0.8739678 0 0.4859838 0.8739683 0 0.4859827 0.8739689 0 0.4859817 0.8739683 0 0.4859827 0.8910121 0 0.4539795 0.8910096 0 0.4539842 0.8910072 0 0.453989 0.8910096 0 0.4539842 0.9068744 0 0.4214008 0.9068748 0 0.4213999 0.9068753 0 0.421399 0.9068748 0 0.4213999 0.7945694 0 0.6071732 0.7945718 0 0.6071702 0.794574 0 0.6071672 0.7945718 0 0.6071702 0.8160608 0 0.577966 0.8160599 0 0.577967 0.8160592 0 0.5779682 0.8160599 0 0.577967 0.8364778 0 0.5480006 0.836472 0 0.5480096 0.8364662 0 0.5480184 0.836472 0 0.5480096 0.3993582 0 -0.9167949 0.3993591 0 -0.9167945 0.39936 0 -0.9167941 0.3993591 0 -0.9167945 0.3658841 0 -0.9306604 0.3658758 0 -0.9306635 0.3658676 0 -0.9306669 0.3658758 0 -0.9306635 0.3319155 0 -0.9433089 0.3319159 0 -0.9433089 0.3319163 0 -0.9433088 0.3319159 0 -0.9433089 0.5580804 0 0.8297868 0.5580793 0 0.8297876 0.5580782 0 0.8297883 0.5580793 0 0.8297876 0.587784 0 0.8090178 0.5877867 0 0.8090159 0.5877894 0 0.8090139 0.5877867 0 0.8090159 0.6167262 0 0.7871776 0.6167262 0 0.7871776 0.6167262 0 0.7871776 0.6167262 0 0.7871776 0.4647281 0 0.8854534 0.4647291 0 0.8854529 0.4647301 0 0.8854524 0.4647291 0 0.8854529 0.4965096 0 0.8680311 0.4965076 0 0.8680323 0.4965055 0 0.8680335 0.4965076 0 0.8680323 0.5276361 0 0.8494705 0.5276349 0 0.8494712 0.5276339 0 0.8494718 0.5276349 0 0.8494712 -0.568069 0 -0.8229808 -0.5680707 0 -0.8229797 -0.5680723 0 -0.8229786 -0.5680707 0 -0.8229797 -0.5378621 0 -0.8430328 -0.5378577 0 -0.8430356 -0.5378531 0 -0.8430384 -0.5378577 0 -0.8430356 -0.5975206 0 -0.8018535 -0.5975186 0 -0.8018549 -0.5975167 0 -0.8018563 -0.5975186 0 -0.8018549 -0.6261825 0 -0.7796764 -0.6261837 0 -0.7796754 -0.6261848 0 -0.7796745 -0.6261837 0 -0.7796754 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 -0.4104127 0 0.9118998 -0.4104129 0 0.9118997 -0.4104131 0 0.9118996 -0.4104129 0 0.9118997 0.8557799 0 0.5173399 0.8557813 0 0.5173376 0.8557827 0 0.5173353 0.8557813 0 0.5173376 0.9836184 0 0.1802633 0.9836187 0 0.180261 0.9836192 0 0.1802588 0.9836187 0 0.180261 0.9836184 0 -0.1802633 0.9836187 0 -0.180261 0.9836192 0 -0.1802588 0.9836187 0 -0.180261 -0.06037729 0 0.9981756 -0.06038182 0 0.9981752 -0.06038636 0 0.998175 -0.06038182 0 0.9981752 0.2975081 0 0.9547192 0.2975059 0 0.9547198 0.2975037 0 0.9547206 0.2975059 0 0.9547198 0.6167201 0 0.7871824 0.6167209 0 0.7871819 0.6167216 0 0.7871813 0.6167209 0 0.7871819 -0.410414 0 -0.9118993 -0.4104136 0 -0.9118994 -0.4104131 0 -0.9118996 -0.4104136 0 -0.9118994 -0.568067 0 -0.8229823 -0.5680631 0 -0.8229849 -0.5680593 0 -0.8229875 -0.5680631 0 -0.8229849 -0.7071068 0 -0.7071068 -0.7071061 0 -0.7071073 -0.7071055 0 -0.7071079 -0.7071061 0 -0.7071073 -0.7071068 0 0.7071068 -0.7071061 0 0.7071073 -0.7071055 0 0.7071079 -0.7071061 0 0.7071073 -0.568067 0 0.8229823 -0.5680631 0 0.8229849 -0.5680593 0 0.8229875 -0.5680631 0 0.8229849 -0.410414 0 0.9118993 -0.4104136 0 0.9118994 -0.4104131 0 0.9118996 -0.4104136 0 0.9118994 0.8557799 0 -0.5173399 0.8557813 0 -0.5173376 0.8557827 0 -0.5173353 0.8557813 0 -0.5173376 0.9836184 0 0.1802633 0.9836188 0 0.180261 0.9836192 0 0.1802587 0.9836188 0 0.180261 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9836184 0 -0.1802633 0.9836188 0 -0.180261 0.9836192 0 -0.1802587 0.9836188 0 -0.180261 0.8557793 0 0.517341 0.8557813 0 0.5173376 0.8557833 0 0.5173343 0.8557813 0 0.5173376 0.9350181 0 0.3546 0.9350163 0 0.3546045 0.9350146 0 0.3546091 0.9350163 0 0.3546045 0.2974973 0 0.9547226 0.2974984 0 0.9547223 0.2974994 0 0.954722 0.2974984 0 0.9547223 0.4647177 0 0.8854589 0.4647195 0 0.8854579 0.4647214 0 0.8854569 0.4647195 0 0.8854579 0.6167152 0 0.7871863 0.6167184 0 0.7871838 0.6167216 0 0.7871813 0.6167184 0 0.7871838 0.7485125 0 0.6631205 0.7485131 0 0.6631199 0.7485137 0 0.6631192 0.7485131 0 0.6631199 -0.2393103 0 0.9709431 -0.2393128 0 0.9709424 -0.2393153 0 0.9709418 -0.2393128 0 0.9709424 -0.06038175 0 0.9981752 -0.06037952 0 0.9981754 -0.06037729 0 0.9981756 -0.06037952 0 0.9981754 0.1205353 0 0.992709 0.1205375 0 0.9927087 0.1205397 0 0.9927084 0.1205375 0 0.9927087 0.1205353 0 -0.992709 0.1205375 0 -0.9927087 0.1205397 0 -0.9927084 0.1205375 0 -0.9927087 -0.06038175 0 -0.9981752 -0.06037952 0 -0.9981754 -0.06037729 0 -0.9981756 -0.06037952 0 -0.9981754 0.6167201 0 -0.7871824 0.6167209 0 -0.7871819 0.6167216 0 -0.7871813 0.6167209 0 -0.7871819 0.2975081 0 -0.9547192 0.2975059 0 -0.9547198 0.2975037 0 -0.9547206 0.2975059 0 -0.9547198 -0.06037729 0 -0.9981756 -0.06038182 0 -0.9981752 -0.06038636 0 -0.998175 -0.06038182 0 -0.9981752 -0.4104127 0 -0.9118998 -0.4104129 0 -0.9118997 -0.4104131 0 -0.9118996 -0.4104129 0 -0.9118997 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260Shape-textangents-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_260Shape-texbinormals-array" count="2064">-0.9709432 0 0.2393103 -0.9709426 0 0.2393128 -0.9709419 0 0.2393154 -0.9709426 0 0.2393128 -0.3546 0 -0.9350181 -0.3546045 0 -0.9350165 -0.3546091 0 -0.9350147 -0.3546045 0 -0.9350165 -0.6631206 0 -0.7485126 -0.66312 0 -0.7485132 -0.6631193 0 -0.7485138 -0.6631199 0 -0.7485132 -0.517341 0 -0.8557794 -0.5173377 0 -0.8557814 -0.5173343 0 -0.8557835 -0.5173377 0 -0.8557814 -0.9547227 0 -0.2974974 -0.9547223 0 -0.2974984 -0.9547221 0 -0.2974994 -0.9547224 0 -0.2974984 -0.7871864 0 -0.6167153 -0.7871839 0 -0.6167185 -0.7871814 0 -0.6167217 -0.7871839 0 -0.6167185 -0.8854589 0 -0.4647177 -0.8854579 0 -0.4647196 -0.885457 0 -0.4647215 -0.8854579 0 -0.4647196 -0.9988328 0 -0.04830324 -0.9988325 0 -0.04830834 -0.9988323 0 -0.04831344 -0.9988325 0 -0.04830834 -0.9999271 0 -0.01207334 -0.9999271 0 -0.01208293 -0.9999269 0 -0.01209253 -0.9999271 0 -0.01208293 -0.999708 0 0.0241661 -0.999708 0 0.0241661 -0.999708 0 0.0241661 -0.999708 0 0.0241661 -0.9547228 0 -0.297497 -0.9547207 0 -0.2975037 -0.9547186 0 -0.2975104 -0.9547207 0 -0.2975037 -0.9648778 0 -0.2626992 -0.9648779 0 -0.2626989 -0.964878 0 -0.2626986 -0.9648779 0 -0.2626989 -0.9737602 0 -0.2275762 -0.9737619 0 -0.2275699 -0.9737633 0 -0.2275635 -0.9737619 0 -0.2275699 -0.9813703 0 -0.1921265 -0.9813691 0 -0.1921325 -0.9813679 0 -0.1921384 -0.9813691 0 -0.1921325 -0.9876904 0 -0.1564222 -0.9876889 0 -0.1564315 -0.9876874 0 -0.1564408 -0.9876888 0 -0.1564315 -0.9927092 0 -0.1205344 -0.9927093 0 -0.1205342 -0.9927092 0 -0.1205339 -0.9927093 0 -0.1205342 -0.9964256 0 -0.08447671 -0.9964255 0 -0.08447609 -0.9964256 0 -0.08447549 -0.9964255 0 -0.08447609 -0.8090179 0 -0.587784 -0.809016 0 -0.5877867 -0.809014 0 -0.5877894 -0.809016 0 -0.5877867 -0.8297869 0 -0.5580804 -0.8297877 0 -0.5580794 -0.8297884 0 -0.5580782 -0.8297877 0 -0.5580794 -0.8494706 0 -0.5276361 -0.8494713 0 -0.527635 -0.8494719 0 -0.527634 -0.8494713 0 -0.527635 -0.577966 0 -0.8160609 -0.5779672 0 -0.8160601 -0.5779682 0 -0.8160593 -0.5779672 0 -0.8160601 -0.6071732 0 -0.7945695 -0.6071703 0 -0.7945719 -0.6071672 0 -0.7945741 -0.6071703 0 -0.7945719 -0.6355616 0 -0.7720503 -0.6355599 0 -0.7720517 -0.6355582 0 -0.7720531 -0.6355598 0 -0.7720517 -0.6631312 0 -0.7485033 -0.6631296 0 -0.7485046 -0.6631281 0 -0.7485059 -0.6631296 0 -0.7485046 -0.6898153 0 -0.7239854 -0.6898129 0 -0.7239878 -0.6898104 0 -0.72399 -0.6898129 0 -0.7239878 -0.7155977 0 -0.6985127 -0.7155977 0 -0.6985127 -0.7155977 0 -0.6985127 -0.7155977 0 -0.6985127 -0.9981751 0 0.06038651 -0.9981756 0 0.06037715 -0.9981762 0 0.06036779 -0.9981757 0 0.06037715 -0.9953319 0 0.09651149 -0.9953315 0 0.09651598 -0.995331 0 0.09652047 -0.9953315 0 0.09651599 -0.9911787 0 0.1325323 -0.9911795 0 0.1325266 -0.9911803 0 0.132521 -0.9911795 0 0.1325266 -0.4859838 0 -0.8739679 -0.4859828 0 -0.8739684 -0.4859818 0 -0.873969 -0.4859828 0 -0.8739684 -0.5173399 0 -0.8557801 -0.5173364 0 -0.8557821 -0.5173329 0 -0.8557842 -0.5173364 0 -0.8557822 -0.5480007 0 -0.8364779 -0.5480096 0 -0.8364721 -0.5480185 0 -0.8364663 -0.5480096 0 -0.8364721 -0.3545966 0 -0.9350194 -0.3546008 0 -0.9350179 -0.3546049 0 -0.9350163 -0.3546008 0 -0.9350179 -0.3882681 0 -0.9215466 -0.3882591 0 -0.9215504 -0.3882501 0 -0.9215541 -0.3882591 0 -0.9215504 -0.4214009 0 -0.9068745 -0.4214 0 -0.906875 -0.4213991 0 -0.9068754 -0.4214 0 -0.906875 -0.4539795 0 -0.8910122 -0.4539843 0 -0.8910098 -0.453989 0 -0.8910074 -0.4539843 0 -0.8910098 -0.2510073 0 -0.9679853 -0.2510168 0 -0.9679828 -0.2510264 0 -0.9679803 -0.2510168 0 -0.9679828 -0.2859496 0 -0.9582447 -0.285945 0 -0.9582461 -0.2859403 0 -0.9582475 -0.285945 0 -0.9582461 -0.3204818 0 -0.9472548 -0.3204821 0 -0.9472546 -0.3204825 0 -0.9472545 -0.3204821 0 -0.9472546 -0.1444819 0 -0.9895076 -0.1444865 0 -0.9895068 -0.1444912 0 -0.9895061 -0.1444865 0 -0.9895068 -0.1802541 0 -0.9836202 -0.180254 0 -0.9836201 -0.1802541 0 -0.9836202 -0.180254 0 -0.9836201 -0.2157787 0 -0.9764424 -0.2157787 0 -0.9764423 -0.2157787 0 -0.9764424 -0.2157787 0 -0.9764423 -0.03623962 0 -0.9993432 -0.03623962 0 -0.9993432 -0.03623962 0 -0.9993432 -0.03623962 0 -0.9993432 -0.07242203 0 -0.9973741 -0.07243153 0 -0.9973734 -0.07244105 0 -0.9973727 -0.07243153 0 -0.9973734 -0.1085471 0 -0.9940914 -0.1085329 0 -0.9940929 -0.1085187 0 -0.9940944 -0.1085329 0 -0.9940929 -0.9789786 0 0.2039635 -0.978976 0 0.203976 -0.9789733 0 0.2039885 -0.9789759 0 0.203976 -0.9709421 0 0.2393148 -0.9709408 0 0.2393201 -0.9709394 0 0.2393254 -0.9709408 0 0.2393201 -0.9857253 0 0.1683617 -0.9857268 0 0.1683531 -0.9857283 0 0.1683444 -0.9857268 0 0.1683531 -0.8680312 0 -0.4965096 -0.8680324 0 -0.4965076 -0.8680336 0 -0.4965056 -0.8680325 0 -0.4965076 -0.8854535 0 -0.4647281 -0.885453 0 -0.4647291 -0.8854525 0 -0.4647301 -0.8854529 0 -0.4647291 -0.9017117 0 -0.4323379 -0.9017172 0 -0.4323265 -0.9017227 0 -0.432315 -0.9017172 0 -0.4323265 0.9306605 0 -0.3658841 0.9306637 0 -0.3658759 0.9306669 0 -0.3658676 0.9306638 0 -0.3658759 0.9167951 0 -0.3993583 0.9167946 0 -0.3993591 0.9167942 0 -0.39936 0.9167947 0 -0.3993592 0.9017118 0 -0.432338 0.9017172 0 -0.4323264 0.9017227 0 -0.432315 0.9017172 0 -0.4323264 0.9648778 0 -0.2626992 0.9648779 0 -0.2626989 0.964878 0 -0.2626986 0.9648779 0 -0.2626989 0.9547228 0 -0.297497 0.9547207 0 -0.2975037 0.9547186 0 -0.2975104 0.9547207 0 -0.2975038 0.9433092 0 -0.3319156 0.9433091 0 -0.3319159 0.9433089 0 -0.3319163 0.943309 0 -0.3319159 0.9927092 0 -0.1205344 0.9927093 0 -0.1205342 0.9927092 0 -0.1205339 0.9927093 0 -0.1205342 0.9876904 0 -0.1564222 0.9876888 0 -0.1564315 0.9876873 0 -0.1564407 0.9876889 0 -0.1564315 0.9813702 0 -0.1921265 0.9813691 0 -0.1921325 0.9813679 0 -0.1921384 0.9813691 0 -0.1921325 0.9737602 0 -0.2275762 0.9737619 0 -0.2275699 0.9737633 0 -0.2275635 0.9737619 0 -0.2275699 0.9999272 0 -0.01207334 0.999927 0 -0.01208293 0.999927 0 -0.01209253 0.999927 0 -0.01208293 0.9988328 0 -0.04830324 0.9988325 0 -0.04830834 0.9988323 0 -0.04831344 0.9988325 0 -0.04830834 0.9964255 0 -0.0844767 0.9964256 0 -0.0844761 0.9964256 0 -0.08447549 0.9964256 0 -0.0844761 0.9953319 0 0.09651149 0.9953315 0 0.09651598 0.995331 0 0.09652048 0.9953315 0 0.09651598 0.9981751 0 0.06038651 0.9981757 0 0.06037715 0.9981763 0 0.0603678 0.9981756 0 0.06037715 0.9997081 0 0.02416611 0.999708 0 0.0241661 0.9997081 0 0.02416611 0.999708 0 0.0241661 0.2859497 0 -0.9582447 0.2859449 0 -0.9582461 0.2859403 0 -0.9582475 0.2859449 0 -0.9582461 0.2510073 0 -0.9679852 0.2510168 0 -0.9679827 0.2510263 0 -0.9679803 0.2510168 0 -0.9679827 0.2157787 0 -0.9764423 0.2157787 0 -0.9764424 0.2157787 0 -0.9764423 0.2157787 0 -0.9764424 0.388268 0 -0.9215465 0.3882591 0 -0.9215503 0.3882501 0 -0.9215541 0.3882591 0 -0.9215504 0.3545966 0 -0.9350195 0.3546007 0 -0.9350178 0.3546049 0 -0.9350162 0.3546007 0 -0.9350178 0.3204818 0 -0.9472548 0.3204821 0 -0.9472546 0.3204825 0 -0.9472545 0.3204822 0 -0.9472547 0.07242202 0 -0.9973741 0.07243154 0 -0.9973735 0.07244104 0 -0.9973727 0.07243154 0 -0.9973735 0.03623962 0 -0.9993432 0.03623962 0 -0.9993432 0.03623962 0 -0.9993432 0.03623962 0 -0.9993432 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.180254 0 -0.9836201 0.1802541 0 -0.9836202 0.180254 0 -0.9836201 0.1802541 0 -0.9836202 0.1444819 0 -0.9895076 0.1444865 0 -0.9895068 0.1444912 0 -0.9895061 0.1444865 0 -0.9895068 0.108547 0 -0.9940913 0.1085329 0 -0.9940929 0.1085187 0 -0.9940944 0.1085329 0 -0.9940929 0.9789786 0 0.2039635 0.9789759 0 0.203976 0.9789733 0 0.2039885 0.9789759 0 0.203976 0.9857253 0 0.1683617 0.9857268 0 0.1683531 0.9857283 0 0.1683444 0.9857268 0 0.1683531 0.9911787 0 0.1325323 0.9911795 0 0.1325266 0.9911802 0 0.132521 0.9911795 0 0.1325266 0.9510583 0 0.3090116 0.9510557 0 0.3090196 0.9510531 0 0.3090275 0.9510558 0 0.3090196 0.9616322 0 0.2743419 0.9616331 0 0.2743392 0.9616339 0 0.2743363 0.9616331 0 0.2743392 0.9709421 0 0.2393148 0.9709407 0 0.2393201 0.9709394 0 0.2393254 0.9709408 0 0.2393201 0.6898153 0 -0.7239854 0.6898129 0 -0.7239878 0.6898105 0 -0.7239901 0.6898129 0 -0.7239878 0.6631311 0 -0.7485033 0.6631297 0 -0.7485046 0.6631281 0 -0.7485059 0.6631296 0 -0.7485046 0.6355616 0 -0.7720503 0.6355599 0 -0.7720517 0.6355582 0 -0.7720531 0.6355598 0 -0.7720517 0.7643214 0 -0.6448357 0.7643214 0 -0.6448356 0.7643214 0 -0.6448357 0.7643214 0 -0.6448356 0.7404418 0 -0.6721206 0.7404418 0 -0.6721206 0.7404418 0 -0.6721206 0.7404418 0 -0.6721206 0.7155977 0 -0.6985127 0.7155977 0 -0.6985127 0.7155977 0 -0.6985127 0.7155977 0 -0.6985127 0.9119045 0 0.4104026 0.9119019 0 0.4104083 0.9118993 0 0.410414 0.911902 0 0.4104083 0.926172 0 0.3771016 0.9261743 0 0.3770958 0.9261766 0 0.3770901 0.9261743 0 0.3770958 0.9392351 0 0.3432749 0.9392327 0 0.3432813 0.9392303 0 0.3432878 0.9392326 0 0.3432813 0.8619691 0 0.5069609 0.8619712 0 0.5069574 0.8619732 0 0.5069538 0.8619711 0 0.5069574 0.879777 0 0.4753866 0.8797771 0 0.4753866 0.879777 0 0.4753866 0.8797771 0 0.4753866 0.8964267 0 0.4431922 0.8964281 0 0.4431894 0.8964295 0 0.4431865 0.8964281 0 0.4431894 0.8018536 0 0.5975206 0.801855 0 0.5975187 0.8018565 0 0.5975168 0.801855 0 0.5975187 0.8229809 0 0.5680691 0.8229798 0 0.5680707 0.8229787 0 0.5680724 0.8229798 0 0.5680707 0.8430329 0 0.5378622 0.8430358 0 0.5378577 0.8430386 0 0.5378532 0.8430357 0 0.5378577 0.7071068 0 0.7071068 0.7071068 0 0.7071068 0.7071068 0 0.7071068 0.7071068 0 0.7071068 0.7322678 0 0.6810168 0.7322665 0 0.6810183 0.7322651 0 0.6810197 0.7322665 0 0.6810183 0.7564688 0 0.6540299 0.7564666 0 0.6540323 0.7564644 0 0.6540349 0.7564666 0 0.6540323 0.7796765 0 0.6261826 0.7796755 0 0.6261838 0.7796746 0 0.6261849 0.7796755 0 0.6261838 -0.9510583 0 0.3090117 -0.9510558 0 0.3090196 -0.9510532 0 0.3090275 -0.9510557 0 0.3090196 -0.9616323 0 0.274342 -0.961633 0 0.2743391 -0.9616339 0 0.2743363 -0.9616331 0 0.2743392 -0.9119046 0 0.4104026 -0.911902 0 0.4104083 -0.9118994 0 0.4104141 -0.911902 0 0.4104083 -0.926172 0 0.3771016 -0.9261743 0 0.3770958 -0.9261766 0 0.3770901 -0.9261743 0 0.3770958 -0.9392351 0 0.3432748 -0.9392327 0 0.3432814 -0.9392303 0 0.3432878 -0.9392326 0 0.3432813 -0.7404418 0 -0.6721206 -0.7404418 0 -0.6721206 -0.7404418 0 -0.6721206 -0.7404418 0 -0.6721206 -0.7643214 0 -0.6448356 -0.7643214 0 -0.6448357 -0.7643214 0 -0.6448356 -0.7643214 0 -0.6448357 -0.7871777 0 -0.6167263 -0.7871777 0 -0.6167263 -0.7871777 0 -0.6167263 -0.7871777 0 -0.6167263 -0.8964267 0 0.4431922 -0.896428 0 0.4431893 -0.8964295 0 0.4431865 -0.896428 0 0.4431893 -0.8797771 0 0.4753866 -0.879777 0 0.4753866 -0.8797771 0 0.4753866 -0.879777 0 0.4753866 -0.8619691 0 0.5069609 -0.8619712 0 0.5069574 -0.8619732 0 0.5069538 -0.8619711 0 0.5069574 -0.7322678 0 0.6810168 -0.7322665 0 0.6810183 -0.7322651 0 0.6810197 -0.7322665 0 0.6810183 -0.7564688 0 0.6540298 -0.7564666 0 0.6540324 -0.7564644 0 0.6540349 -0.7564666 0 0.6540323 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 -0.7071068 0 0.7071068 0.5173399 0 -0.85578 0.5173364 0 -0.8557822 0.5173329 0 -0.8557843 0.5173364 0 -0.8557822 0.4859838 0 -0.8739678 0.4859828 0 -0.8739684 0.4859818 0 -0.873969 0.4859828 0 -0.8739684 0.4539796 0 -0.8910123 0.4539843 0 -0.8910097 0.453989 0 -0.8910073 0.4539843 0 -0.8910097 0.4214009 0 -0.9068746 0.4214 0 -0.906875 0.4213991 0 -0.9068753 0.4214 0 -0.906875 0.6071733 0 -0.7945696 0.6071702 0 -0.7945718 0.6071672 0 -0.7945741 0.6071703 0 -0.7945719 0.577966 0 -0.8160608 0.5779671 0 -0.8160601 0.5779682 0 -0.8160592 0.5779671 0 -0.8160601 0.5480007 0 -0.8364779 0.5480096 0 -0.8364722 0.5480185 0 -0.8364663 0.5480096 0 -0.8364721 -0.916795 0 -0.3993583 -0.9167947 0 -0.3993592 -0.9167942 0 -0.39936 -0.9167947 0 -0.3993592 -0.9306605 0 -0.3658841 -0.9306638 0 -0.3658759 -0.9306669 0 -0.3658676 -0.9306638 0 -0.3658759 -0.9433092 0 -0.3319156 -0.9433091 0 -0.3319159 -0.9433089 0 -0.3319163 -0.943309 0 -0.3319159 0.829787 0 -0.5580804 0.8297877 0 -0.5580794 0.8297884 0 -0.5580782 0.8297877 0 -0.5580794 0.809018 0 -0.5877841 0.809016 0 -0.5877867 0.809014 0 -0.5877894 0.809016 0 -0.5877867 0.7871777 0 -0.6167263 0.7871777 0 -0.6167263 0.7871777 0 -0.6167263 0.7871777 0 -0.6167263 0.8854535 0 -0.4647281 0.8854529 0 -0.4647291 0.8854524 0 -0.4647301 0.885453 0 -0.4647291 0.8680313 0 -0.4965097 0.8680324 0 -0.4965076 0.8680336 0 -0.4965056 0.8680324 0 -0.4965076 0.8494706 0 -0.5276361 0.8494713 0 -0.527635 0.8494719 0 -0.527634 0.8494713 0 -0.527635 -0.8229809 0 0.568069 -0.8229797 0 0.5680707 -0.8229787 0 0.5680723 -0.8229797 0 0.5680707 -0.8430329 0 0.5378622 -0.8430358 0 0.5378577 -0.8430386 0 0.5378532 -0.8430357 0 0.5378577 -0.8018536 0 0.5975206 -0.801855 0 0.5975187 -0.8018565 0 0.5975168 -0.801855 0 0.5975187 -0.7796765 0 0.6261826 -0.7796755 0 0.6261838 -0.7796746 0 0.6261849 -0.7796755 0 0.6261837 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.9119 0 0.4104127 0.9118998 0 0.4104129 0.9118997 0 0.4104132 0.9118998 0 0.4104129 0.5173399 0 -0.85578 0.5173377 0 -0.8557814 0.5173354 0 -0.8557828 0.5173377 0 -0.8557814 0.1802633 0 -0.9836185 0.180261 0 -0.9836189 0.1802588 0 -0.9836192 0.180261 0 -0.9836189 -0.1802633 0 -0.9836185 -0.180261 0 -0.9836189 -0.1802588 0 -0.9836193 -0.180261 0 -0.9836189 0.9981757 0 0.0603773 0.9981754 0 0.06038183 0.9981751 0 0.06038637 0.9981754 0 0.06038183 0.9547193 0 -0.2975081 0.95472 0 -0.2975059 0.9547207 0 -0.2975037 0.95472 0 -0.2975059 0.7871825 0 -0.6167202 0.7871819 0 -0.6167209 0.7871813 0 -0.6167216 0.7871819 0 -0.6167209 -0.9118994 0 0.4104141 -0.9118995 0 0.4104136 -0.9118998 0 0.4104132 -0.9118996 0 0.4104137 -0.8229824 0 0.568067 -0.822985 0 0.5680632 -0.8229876 0 0.5680594 -0.822985 0 0.5680631 -0.7071068 0 0.7071068 -0.7071074 0 0.7071062 -0.707108 0 0.7071056 -0.7071074 0 0.7071062 0.7071068 0 0.7071068 0.7071074 0 0.7071062 0.707108 0 0.7071056 0.7071074 0 0.7071062 0.8229824 0 0.568067 0.8229849 0 0.5680631 0.8229876 0 0.5680594 0.8229851 0 0.5680632 0.9118993 0 0.4104141 0.9118996 0 0.4104137 0.9118997 0 0.4104132 0.9118996 0 0.4104137 -0.5173399 0 -0.8557801 -0.5173377 0 -0.8557814 -0.5173354 0 -0.8557828 -0.5173377 0 -0.8557814 0.1802633 0 -0.9836185 0.180261 0 -0.9836188 0.1802587 0 -0.9836193 0.180261 0 -0.9836189 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.1802633 0 -0.9836184 -0.180261 0 -0.9836189 -0.1802587 0 -0.9836193 -0.180261 0 -0.9836189 0.517341 0 -0.8557794 0.5173377 0 -0.8557814 0.5173343 0 -0.8557835 0.5173377 0 -0.8557814 0.3546 0 -0.9350182 0.3546045 0 -0.9350164 0.3546091 0 -0.9350147 0.3546045 0 -0.9350165 0.9547226 0 -0.2974973 0.9547224 0 -0.2974984 0.9547221 0 -0.2974994 0.9547224 0 -0.2974984 0.8854589 0 -0.4647177 0.885458 0 -0.4647196 0.885457 0 -0.4647214 0.885458 0 -0.4647196 0.7871864 0 -0.6167153 0.7871839 0 -0.6167185 0.7871814 0 -0.6167217 0.7871839 0 -0.6167185 0.6631206 0 -0.7485126 0.6631199 0 -0.7485132 0.6631193 0 -0.7485138 0.66312 0 -0.7485132 0.9709432 0 0.2393103 0.9709426 0 0.2393128 0.970942 0 0.2393154 0.9709425 0 0.2393128 0.9981754 0 0.06038176 0.9981756 0 0.06037953 0.9981756 0 0.0603773 0.9981756 0 0.06037953 0.992709 0 -0.1205353 0.9927089 0 -0.1205375 0.9927086 0 -0.1205397 0.9927089 0 -0.1205375 -0.9927091 0 -0.1205353 -0.9927088 0 -0.1205375 -0.9927086 0 -0.1205397 -0.9927089 0 -0.1205375 -0.9981754 0 0.06038176 -0.9981756 0 0.06037953 -0.9981757 0 0.0603773 -0.9981756 0 0.06037953 -0.7871825 0 -0.6167202 -0.787182 0 -0.616721 -0.7871813 0 -0.6167216 -0.7871819 0 -0.6167209 -0.9547193 0 -0.2975081 -0.95472 0 -0.2975059 -0.9547207 0 -0.2975037 -0.9547201 0 -0.2975059 -0.9981757 0 0.0603773 -0.9981754 0 0.06038183 -0.9981751 0 0.06038637 -0.9981754 0 0.06038183 -0.9118999 0 0.4104127 -0.9118998 0 0.4104129 -0.9118997 0 0.4104132 -0.9118999 0 0.4104129 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260Shape-texbinormals-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_260Shape-vertices" name="qt_gauge_tickmarks_260Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_260Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_260Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_260Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_260Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="344">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_260Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_260Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_260Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_260Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66 68 68 68 69 69 69 70 71 71 70 71 71 69 69 69 71 70 70 72 72 72 73 73 73 74 75 75 74 75 75 73 73 73 75 74 74 76 76 76 77 77 77 78 79 79 78 79 79 77 77 77 79 78 78 80 80 80 81 81 81 82 83 83 82 83 83 81 81 81 83 82 82 84 84 84 85 85 85 86 87 87 86 87 87 85 85 85 87 86 86 88 88 88 89 89 89 90 91 91 90 91 91 89 89 89 91 90 90 92 92 92 93 93 93 94 95 95 94 95 95 93 93 93 95 94 94 96 96 96 97 97 97 98 99 99 98 99 99 97 97 97 99 98 98 100 100 100 101 101 101 102 103 103 102 103 103 101 101 101 103 102 102 104 104 104 105 105 105 106 107 107 106 107 107 105 105 105 107 106 106 108 108 108 109 109 109 110 111 111 110 111 111 109 109 109 111 110 110 112 112 112 113 113 113 114 115 115 114 115 115 113 113 113 115 114 114 116 116 116 117 117 117 118 119 119 118 119 119 117 117 117 119 118 118 120 120 120 121 121 121 122 123 123 122 123 123 121 121 121 123 122 122 124 124 124 125 125 125 126 127 127 126 127 127 125 125 125 127 126 126 128 128 128 129 129 129 130 131 131 130 131 131 129 129 129 131 130 130 132 132 132 133 133 133 134 135 135 134 135 135 133 133 133 135 134 134 136 136 136 137 137 137 138 139 139 138 139 139 137 137 137 139 138 138 140 140 140 141 141 141 142 143 143 142 143 143 141 141 141 143 142 142 144 144 144 145 145 145 146 147 147 146 147 147 145 145 145 147 146 146 148 148 148 149 149 149 150 151 151 150 151 151 149 149 149 151 150 150 152 152 152 153 153 153 154 155 155 154 155 155 153 153 153 155 154 154 156 156 156 157 157 157 158 159 159 158 159 159 157 157 157 159 158 158 160 160 160 161 161 161 162 163 163 162 163 163 161 161 161 163 162 162 164 164 164 165 165 165 166 167 167 166 167 167 165 165 165 167 166 166 168 168 168 169 169 169 170 171 171 170 171 171 169 169 169 171 170 170 172 172 172 173 173 173 174 175 175 174 175 175 173 173 173 175 174 174 176 176 176 177 177 177 178 179 179 178 179 179 177 177 177 179 178 178 180 180 180 181 181 181 182 183 183 182 183 183 181 181 181 183 182 182 184 184 184 185 185 185 186 187 187 186 187 187 185 185 185 187 186 186 188 188 188 189 189 189 190 191 191 190 191 191 189 189 189 191 190 190 192 192 192 193 193 193 194 195 195 194 195 195 193 193 193 195 194 194 196 196 196 197 197 197 198 199 199 198 199 199 197 197 197 199 198 198 200 200 200 201 201 201 202 203 203 202 203 203 201 201 201 203 202 202 204 204 204 205 205 205 206 207 207 206 207 207 205 205 205 207 206 206 208 208 208 209 209 209 210 211 211 210 211 211 209 209 209 211 210 210 212 212 212 213 213 213 214 215 215 214 215 215 213 213 213 215 214 214 216 216 216 217 217 217 218 219 219 218 219 219 217 217 217 219 218 218 220 220 220 221 221 221 222 223 223 222 223 223 221 221 221 223 222 222 224 224 224 225 225 225 226 227 227 226 227 227 225 225 225 227 226 226 228 228 228 229 229 229 230 231 231 230 231 231 229 229 229 231 230 230 232 232 232 233 233 233 234 235 235 234 235 235 233 233 233 235 234 234 236 236 236 237 237 237 238 239 239 238 239 239 237 237 237 239 238 238 240 240 240 241 241 241 242 243 243 242 243 243 241 241 241 243 242 242 244 244 244 245 245 245 246 247 247 246 247 247 245 245 245 247 246 246 248 248 248 249 249 249 250 251 251 250 251 251 249 249 249 251 250 250 252 252 252 253 253 253 254 255 255 254 255 255 253 253 253 255 254 254 256 256 256 257 257 257 258 259 259 258 259 259 257 257 257 259 258 258 260 260 260 261 261 261 262 263 263 262 263 263 261 261 261 263 262 262 264 264 264 265 265 265 266 267 267 266 267 267 265 265 265 267 266 266 268 268 268 269 269 269 270 271 271 270 271 271 269 269 269 271 270 270 272 272 272 273 273 273 274 275 275 274 275 275 273 273 273 275 274 274 276 276 276 277 277 277 278 279 279 278 279 279 277 277 277 279 278 278 280 280 280 281 281 281 282 283 283 282 283 283 281 281 281 283 282 282 284 284 284 285 285 285 286 287 287 286 287 287 285 285 285 287 286 286 288 288 288 289 289 289 290 291 291 290 291 291 289 289 289 291 290 290 292 292 292 293 293 293 294 295 295 294 295 295 293 293 293 295 294 294 296 296 296 297 297 297 298 299 299 298 299 299 297 297 297 299 298 298 300 300 300 301 301 301 302 303 303 302 303 303 301 301 301 303 302 302 304 304 304 305 305 305 306 307 307 306 307 307 305 305 305 307 306 306 308 308 308 309 309 309 310 311 311 310 311 311 309 309 309 311 310 310 312 312 312 313 313 313 314 315 315 314 315 315 313 313 313 315 314 314 316 316 316 317 317 317 318 319 319 318 319 319 317 317 317 319 318 318 320 320 320 321 321 321 322 323 323 322 323 323 321 321 321 323 322 322 324 324 324 325 325 325 326 327 327 326 327 327 325 325 325 327 326 326 328 328 328 329 329 329 330 331 331 330 331 331 329 329 329 331 330 330 332 332 332 333 333 333 334 335 335 334 335 335 333 333 333 335 334 334 336 336 336 337 337 337 338 339 339 338 339 339 337 337 337 339 338 338 340 340 340 341 341 341 342 343 343 342 343 343 341 341 341 343 342 342 344 344 344 345 345 345 346 347 347 346 347 347 345 345 345 347 346 346 348 348 348 349 349 349 350 351 351 350 351 351 349 349 349 351 350 350 352 352 352 353 353 353 354 355 355 354 355 355 353 353 353 355 354 354 356 356 356 357 357 357 358 359 359 358 359 359 357 357 357 359 358 358 360 360 360 361 361 361 362 363 363 362 363 363 361 361 361 363 362 362 364 364 364 365 365 365 366 367 367 366 367 367 365 365 365 367 366 366 368 368 368 369 369 369 370 371 371 370 371 371 369 369 369 371 370 370 372 372 372 373 373 373 374 375 375 374 375 375 373 373 373 375 374 374 376 376 376 377 377 377 378 379 379 378 379 379 377 377 377 379 378 378 380 380 380 381 381 381 382 383 383 382 383 383 381 381 381 383 382 382 384 384 384 385 385 385 386 387 387 386 387 387 385 385 385 387 386 386 388 388 388 389 389 389 390 391 391 390 391 391 389 389 389 391 390 390 392 392 392 393 393 393 394 395 395 394 395 395 393 393 393 395 394 394 396 396 396 397 397 397 398 399 399 398 399 399 397 397 397 399 398 398 400 400 400 401 401 401 402 403 403 402 403 403 401 401 401 403 402 402 404 404 404 405 405 405 406 407 407 406 407 407 405 405 405 407 406 406 408 408 408 409 409 409 410 411 411 410 411 411 409 409 409 411 410 410 412 412 412 413 413 413 414 415 415 414 415 415 413 413 413 415 414 414 416 416 416 417 417 417 418 419 419 418 419 419 417 417 417 419 418 418 420 420 420 421 421 421 422 423 423 422 423 423 421 421 421 423 422 422 424 424 424 425 425 425 426 427 427 426 427 427 425 425 425 427 426 426 428 428 428 429 429 429 430 431 431 430 431 431 429 429 429 431 430 430 432 432 432 433 433 433 434 435 435 434 435 435 433 433 433 435 434 434 436 436 436 437 437 437 438 439 439 438 439 439 437 437 437 439 438 438 440 440 440 441 441 441 442 443 443 442 443 443 441 441 441 443 442 442 444 444 444 445 445 445 446 447 447 446 447 447 445 445 445 447 446 446 448 448 448 449 449 449 450 451 451 450 451 451 449 449 449 451 450 450 452 452 452 453 453 453 454 455 455 454 455 455 453 453 453 455 454 454 456 456 456 457 457 457 458 459 459 458 459 459 457 457 457 459 458 458 460 460 460 461 461 461 462 463 463 462 463 463 461 461 461 463 462 462 464 464 464 465 465 465 466 467 467 466 467 467 465 465 465 467 466 466 468 468 468 469 469 469 470 471 471 470 471 471 469 469 469 471 470 470 472 472 472 473 473 473 474 475 475 474 475 475 473 473 473 475 474 474 476 476 476 477 477 477 478 479 479 478 479 479 477 477 477 479 478 478 480 480 480 481 481 481 482 483 483 482 483 483 481 481 481 483 482 482 484 484 484 485 485 485 486 487 487 486 487 487 485 485 485 487 486 486 488 488 488 489 489 489 490 491 491 490 491 491 489 489 489 491 490 490 492 492 492 493 493 493 494 495 495 494 495 495 493 493 493 495 494 494 496 496 496 497 497 497 498 499 499 498 499 499 497 497 497 499 498 498 500 500 500 501 501 501 502 503 503 502 503 503 501 501 501 503 502 502 504 504 504 505 505 505 506 507 507 506 507 507 505 505 505 507 506 506 508 508 508 509 509 509 510 511 511 510 511 511 509 509 509 511 510 510 512 512 512 513 513 513 514 515 515 514 515 515 513 513 513 515 514 514 516 516 516 517 517 517 518 519 519 518 519 519 517 517 517 519 518 518 520 520 520 521 521 521 522 523 523 522 523 523 521 521 521 523 522 522 524 524 524 525 525 525 526 527 527 526 527 527 525 525 525 527 526 526 528 528 528 529 529 529 530 531 531 530 531 531 529 529 529 531 530 530 532 532 532 533 533 533 534 535 535 534 535 535 533 533 533 535 534 534 536 536 536 537 537 537 538 539 539 538 539 539 537 537 537 539 538 538 540 540 540 541 541 541 542 543 543 542 543 543 541 541 541 543 542 542 544 544 544 545 545 545 546 547 547 546 547 547 545 545 545 547 546 546 548 548 548 549 549 549 550 551 551 550 551 551 549 549 549 551 550 550 552 552 552 553 553 553 554 555 555 554 555 555 553 553 553 555 554 554 556 556 556 557 557 557 558 559 559 558 559 559 557 557 557 559 558 558 560 560 560 561 561 561 562 563 563 562 563 563 561 561 561 563 562 562 564 564 564 565 565 565 566 567 567 566 567 567 565 565 565 567 566 566 568 568 568 569 569 569 570 571 571 570 571 571 569 569 569 571 570 570 572 572 572 573 573 573 574 575 575 574 575 575 573 573 573 575 574 574 576 576 576 577 577 577 578 579 579 578 579 579 577 577 577 579 578 578 580 580 580 581 581 581 582 583 583 582 583 583 581 581 581 583 582 582 584 584 584 585 585 585 586 587 587 586 587 587 585 585 585 587 586 586 588 588 588 589 589 589 590 591 591 590 591 591 589 589 589 591 590 590 592 592 592 593 593 593 594 595 595 594 595 595 593 593 593 595 594 594 596 596 596 597 597 597 598 599 599 598 599 599 597 597 597 599 598 598 600 600 600 601 601 601 602 603 603 602 603 603 601 601 601 603 602 602 604 604 604 605 605 605 606 607 607 606 607 607 605 605 605 607 606 606 608 608 608 609 609 609 610 611 611 610 611 611 609 609 609 611 610 610 612 612 612 613 613 613 614 615 615 614 615 615 613 613 613 615 614 614 616 616 616 617 617 617 618 619 619 618 619 619 617 617 617 619 618 618 620 620 620 621 621 621 622 623 623 622 623 623 621 621 621 623 622 622 624 624 624 625 625 625 626 627 627 626 627 627 625 625 625 627 626 626 628 628 628 629 629 629 630 631 631 630 631 631 629 629 629 631 630 630 632 632 632 633 633 633 634 635 635 634 635 635 633 633 633 635 634 634 636 636 636 637 637 637 638 639 639 638 639 639 637 637 637 639 638 638 640 640 640 641 641 641 642 643 643 642 643 643 641 641 641 643 642 642 644 644 644 645 645 645 646 647 647 646 647 647 645 645 645 647 646 646 648 648 648 649 649 649 650 651 651 650 651 651 649 649 649 651 650 650 652 652 652 653 653 653 654 655 655 654 655 655 653 653 653 655 654 654 656 656 656 657 657 657 658 659 659 658 659 659 657 657 657 659 658 658 660 660 660 661 661 661 662 663 663 662 663 663 661 661 661 663 662 662 664 664 664 665 665 665 666 667 667 666 667 667 665 665 665 667 666 666 668 668 668 669 669 669 670 671 671 670 671 671 669 669 669 671 670 670 672 672 672 673 673 673 674 675 675 674 675 675 673 673 673 675 674 674 676 676 676 677 677 677 678 679 679 678 679 679 677 677 677 679 678 678 680 680 680 681 681 681 682 683 683 682 683 683 681 681 681 683 682 682 684 684 684 685 685 685 686 687 687 686 687 687 685 685 685 687 686 686</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_260Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_260" name="qt_gauge_tickmarks_260" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_260Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_260</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_2.dae
new file mode 100644
index 0000000..ff29ff8
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_260_2.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:23:51</created>
+ <modified>2018-03-08T09:23:51</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_260_2Shape" name="qt_gauge_tickmarks_260_2Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_260_2Shape-positions" name="qt_gauge_tickmarks_260_2Shape-positions">
+ <float_array id="qt_gauge_tickmarks_260_2Shape-positions-array" count="2064">10.34503 0.02371596 -0.9300458 10.22006 0.02371596 -1.852601 10.0129 0.02371596 -2.76024 9.725207 0.02371596 -3.645656 9.359308 0.02371596 -4.501719 8.918143 0.02371596 -5.321536 8.405272 0.02371596 -6.098507 7.824811 0.02371596 -6.826377 7.181447 0.02371596 -7.499285 6.48035 0.02371596 -8.111813 5.727172 0.02371596 -8.659031 4.92797 0.02371596 -9.136528 4.089186 0.02371596 -9.540466 3.217571 0.02371596 -9.867589 2.320137 0.02371596 -10.11526 1.40412 0.02371596 -10.2815 0.4768873 0.02371596 -10.36495 -0.4540957 0.02371596 -10.36495 -1.381328 0.02371596 -10.2815 -2.297345 0.02371596 -10.11526 -3.194779 0.02371596 -9.867587 -4.066395 0.02371596 -9.540462 -4.905178 0.02371596 -9.136524 -5.704379 0.02371596 -8.659026 -6.457555 0.02371596 -8.111809 -7.158653 0.02371596 -7.499281 -7.802017 0.02371596 -6.826372 -8.382476 0.02371596 -6.098503 -8.895347 0.02371596 -5.321531 -9.336511 0.02371596 -4.501712 -9.702411 0.02371596 -3.64565 -9.990099 0.02371596 -2.760236 -10.19726 0.02371596 -1.852596 -10.32223 0.02371596 -0.9300416 -10.36399 0.02371596 0 -10.32223 0.02371596 0.9300446 -10.19726 0.02371596 1.8526 -9.990097 0.02371596 2.760238 -9.702408 0.02371596 3.645653 -9.336507 0.02371596 4.501716 -8.895345 0.02371596 5.321532 -8.382472 0.02371596 6.098505 -7.802012 0.02371596 6.826374 -7.158649 0.02371596 7.499282 7.181447 0.02371596 7.499281 7.82481 0.02371596 6.826372 8.40527 0.02371596 6.098503 8.918142 0.02371596 5.321531 9.359304 0.02371596 4.501713 9.725204 0.02371596 3.645651 10.01289 0.02371596 2.760236 10.22005 0.02371596 1.852598 10.34502 0.02371596 0.9300429 10.38679 0.02371596 0 10.64822 0.02371596 -0.9573326 10.51959 0.02371596 -1.906957 10.30634 0.02371596 -2.841227 10.01021 0.02371596 -3.752621 9.633579 0.02371596 -4.633801 9.179473 0.02371596 -5.477673 8.651549 0.02371596 -6.277441 8.05406 0.02371596 -7.026667 7.391818 0.02371596 -7.719318 6.670152 0.02371596 -8.349817 5.894876 0.02371596 -8.913092 5.072227 0.02371596 -9.404599 4.20883 0.02371596 -9.82039 3.31164 0.02371596 -10.15711 2.387878 0.02371596 -10.41205 1.444983 0.02371596 -10.58316 0.4905419 0.02371596 -10.66906 -0.4677543 0.02371596 -10.66906 -1.422192 0.02371596 -10.58316 -2.365087 0.02371596 -10.41205 -3.288848 0.02371596 -10.15711 -4.186038 0.02371596 -9.820385 -5.049435 0.02371596 -9.404594 -5.872082 0.02371596 -8.913088 -6.647358 0.02371596 -8.349813 -7.369024 0.02371596 -7.719314 -8.031264 0.02371596 -7.026662 -8.628754 0.02371596 -6.277435 -9.156676 0.02371596 -5.477667 -9.610782 0.02371596 -4.633796 -9.987415 0.02371596 -3.752616 -10.28354 0.02371596 -2.841222 -10.49679 0.02371596 -1.906953 -10.62542 0.02371596 -0.9573295 -10.66842 0.02371596 0 -10.62542 0.02371596 0.9573327 -10.49679 0.02371596 1.906956 -10.28354 0.02371596 2.841225 -9.987412 0.02371596 3.752619 -9.610778 0.02371596 4.633799 -9.156674 0.02371596 5.477669 -8.62875 0.02371596 6.277438 -8.031261 0.02371596 7.026663 -7.36902 0.02371596 7.719315 7.391818 0.02371596 7.719314 8.054058 0.02371596 7.026662 8.651547 0.02371596 6.277436 9.179472 0.02371596 5.477667 9.633575 0.02371596 4.633797 10.01021 0.02371596 3.752617 10.30634 0.02371596 2.841223 10.51958 0.02371596 1.906954 10.64822 0.02371596 0.9573309 10.69121 0.02371596 0 7.021245 0 6.396424 6.885041 0 6.542878 7.753513 0 7.07744 7.617311 0 7.223894 7.248444 0 6.13764 7.117638 0 6.288934 8.004912 0 6.79167 7.874106 0 6.942965 7.466115 0 5.870792 7.340878 0 6.026727 8.24579 0 6.496977 8.120553 0 6.652912 6.784815 0 6.646803 6.643394 0 6.788225 7.491922 0 7.35391 7.350501 0 7.495332 8.402004 0 4.428209 8.306926 0 4.604164 9.281779 0 4.903596 9.186702 0 5.079552 8.556966 0 4.120677 8.468328 0 4.299963 9.453393 0 4.563869 9.364755 0 4.743155 8.700681 0 3.807732 8.618598 0 3.990112 9.61258 0 4.218144 9.530498 0 4.400525 7.673973 0 5.596231 7.55447 0 5.756602 8.475829 0 6.193748 8.356324 0 6.354119 7.871744 0 5.314317 7.758131 0 5.478914 8.694728 0 5.882381 8.581115 0 6.046979 8.059168 0 5.02542 7.951594 0 5.194026 8.902199 0 5.563286 8.794625 0 5.731892 8.235999 0 4.729921 8.134606 0 4.902316 9.097968 0 5.236881 8.996577 0 5.409276 9.159518 0 2.51013 9.10465 0 2.702455 10.12115 0 2.784476 10.06628 0 2.976802 9.24447 0 2.176405 9.196607 0 2.370593 10.21541 0 2.41572 10.16755 0 2.609908 9.31727 0 1.83982 9.276476 0 2.035616 10.29625 0 2.04379 10.25545 0 2.239586 8.832959 0 3.489783 8.75754 0 3.675019 9.759133 0 3.866879 9.683716 0 4.052113 8.953629 0 3.167251 8.884973 0 3.355097 9.892861 0 3.510532 9.824204 0 3.698378 9.06253 0 2.840555 9.000726 0 3.030767 10.01359 0 3.149572 9.951781 0 3.339784 9.377824 0 1.500819 9.344152 0 1.697965 10.36355 0 1.669176 10.32988 0 1.866321 9.426053 0 1.159846 9.399549 0 1.358082 10.41723 0 1.292369 10.39073 0 1.490605 9.461892 0 0.817349 9.44259 0 1.016416 10.45722 0 0.9138632 10.43792 0 1.11293 9.480666 0 -0.5588613 9.490329 0 -0.3590937 10.4795 0 -0.6071739 10.48916 0 -0.4074073 9.454181 0 -0.9022074 9.471078 0 -0.7029233 10.45061 0 -0.9866881 10.4675 0 -0.7874022 9.415271 0 -1.244369 9.439379 0 -1.045828 10.40798 0 -1.364905 10.43209 0 -1.166364 9.485297 0 0.4737773 9.47322 0 0.6734133 10.48347 0 0.5341563 10.4714 0 0.7337914 9.496233 0 0.1295843 9.491401 0 0.3295264 10.49594 0 0.1537485 10.49111 0 0.3536901 9.49469 0 -0.2147789 9.497106 0 -0.01479292 10.49462 0 -0.2268615 10.49703 0 -0.02687597 9.136638 0 -2.592207 9.189179 0 -2.399233 10.10151 0 -2.854915 10.15405 0 -2.66194 9.036689 0 -2.921751 9.096189 0 -2.730807 9.991409 0 -3.219254 10.05091 0 -3.02831 8.924863 0 -3.247457 8.991243 0 -3.058793 9.868174 0 -3.579364 9.934556 0 -3.390702 8.801305 0 -3.568894 8.87448 0 -3.382761 9.731969 0 -3.934771 9.805144 0 -3.748638 9.363986 0 -1.584896 9.395273 0 -1.387359 10.35167 0 -1.741331 10.38296 0 -1.543792 9.300394 0 -1.923341 9.33882 0 -1.727067 10.28176 0 -2.115467 10.32019 0 -1.919194 9.224578 0 -2.259258 9.270091 0 -2.064506 10.19834 0 -2.486825 10.24385 0 -2.292073 8.666181 0 -3.885643 8.746053 0 -3.702284 9.582973 0 -4.285007 9.662846 0 -4.101649 8.519664 0 -4.197287 8.60613 0 -4.016944 9.421382 0 -4.629615 9.507846 0 -4.449271 8.361951 0 -4.503416 8.454895 0 -4.326324 9.247407 0 -4.968139 9.340351 0 -4.791048 8.193246 0 -4.803628 8.292547 0 -4.630021 9.061278 0 -5.300136 9.16058 0 -5.126529 8.013772 0 -5.097529 8.1193 0 -4.927636 8.86324 0 -5.62517 8.968767 0 -5.455275 7.823765 0 -5.384732 7.93538 0 -5.218775 8.653552 0 -5.942813 8.765168 0 -5.776855 7.623473 0 -5.664861 7.741031 0 -5.503058 8.43249 0 -6.252646 8.550048 0 -6.090843 7.413161 0 -5.937547 7.536506 0 -5.780111 8.200345 0 -6.554265 8.323689 0 -6.39683 7.193106 0 -6.202432 7.322074 0 -6.049569 7.957421 0 -6.847276 8.08639 0 -6.694412 6.221405 0 -7.177165 6.371108 0 -7.04454 6.884527 0 -7.925674 7.034229 0 -7.79305 5.957207 0 -7.398045 6.111617 0 -7.270933 6.592767 0 -8.170096 6.747177 0 -8.042984 5.685177 0 -7.609204 5.844092 0 -7.487772 6.292339 0 -8.403782 6.451255 0 -8.28235 6.963594 0 -6.459168 7.098018 0 -6.31108 7.704039 0 -7.131288 7.838462 0 -6.983197 6.72493 0 -6.707418 6.864632 0 -6.564299 7.440529 0 -7.405931 7.580231 0 -7.26281 6.477425 0 -6.946854 6.622222 0 -6.808892 7.167238 0 -7.670841 7.312036 0 -7.532878 4.526036 0 -8.351295 4.70083 0 -8.254097 5.01202 0 -9.225264 5.186813 0 -9.128065 4.2204 0 -8.50996 4.398601 0 -8.419164 4.67439 0 -9.400967 4.852592 0 -9.310168 3.909214 0 -8.657447 4.090589 0 -8.573166 4.330615 0 -9.564322 4.51199 0 -9.480041 5.405673 0 -7.810366 5.568885 0 -7.694774 5.983641 0 -8.626427 6.146852 0 -8.510834 5.119062 0 -8.001266 5.286357 0 -7.891666 5.667075 0 -8.837738 5.834369 0 -8.728134 4.825722 0 -8.181655 4.996878 0 -8.078188 5.34306 0 -9.037437 5.514215 0 -8.933969 3.592888 0 -8.793558 3.777197 0 -8.715905 3.981145 0 -9.715108 4.165455 0 -9.637457 3.271836 0 -8.918116 3.458839 0 -8.847196 3.626441 0 -9.853131 3.813444 0 -9.78221 2.946481 0 -9.030954 3.135931 0 -8.966857 3.266967 0 -9.978208 3.456417 0 -9.914112 2.61725 0 -9.13193 2.808899 0 -9.074741 2.903196 0 -10.09018 3.094845 0 -10.03299 1.270286 0 -9.414761 1.468188 0 -9.385863 1.414775 0 -10.40427 1.612676 0 -10.37537 0.9282471 0 -9.454734 1.127066 0 -9.433029 1.03678 0 -10.44883 1.235599 0 -10.42712 0.5849841 0 -9.482288 0.7844587 0 -9.467802 0.6574189 0 -10.47966 0.8568935 0 -10.46518 2.284576 0 -9.220906 2.478173 0 -9.170701 2.535606 0 -10.18889 2.729202 0 -10.13868 1.948897 0 -9.297769 2.144185 0 -9.254613 2.164681 0 -10.27421 2.359969 0 -10.23105 1.610652 0 -9.362416 1.807376 0 -9.326365 1.790907 0 -10.34604 1.987631 0 -10.30998 0.2409479 0 -9.497383 0.4408166 0 -9.490135 0.2771891 0 -10.49673 0.4770578 0 -10.48948 -0.1034092 0 -9.5 0.09659077 0 -9.5 -0.1034092 0 -10.5 0.09659077 0 -10.5 -0.447635 0 -9.490135 -0.2477664 0 -9.497383 -0.4838762 0 -10.48948 -0.2840076 0 -10.49673 -1.814194 0 -9.326365 -1.61747 0 -9.362416 -1.994449 0 -10.30998 -1.797725 0 -10.34604 -2.151003 0 -9.254613 -1.955715 0 -9.297769 -2.366787 0 -10.23105 -2.171499 0 -10.27421 -2.484991 0 -9.170701 -2.291394 0 -9.220906 -2.73602 0 -10.13868 -2.542424 0 -10.18889 -0.7912771 0 -9.467802 -0.5918025 0 -9.482288 -0.863712 0 -10.46518 -0.6642373 0 -10.47966 -1.133884 0 -9.433029 -0.9350655 0 -9.454734 -1.242417 0 -10.42712 -1.043599 0 -10.44883 -1.475006 0 -9.385863 -1.277105 0 -9.414761 -1.619495 0 -10.37537 -1.421594 0 -10.40427 -3.784015 0 -8.715905 -3.599706 0 -8.793558 -4.172274 0 -9.637457 -3.987963 0 -9.715108 -4.097407 0 -8.573166 -3.916032 0 -8.657447 -4.518808 0 -9.480041 -4.337434 0 -9.564322 -4.40542 0 -8.419164 -4.227219 0 -8.50996 -4.85941 0 -9.310168 -4.681209 0 -9.400967 -2.815718 0 -9.074741 -2.624069 0 -9.13193 -3.101663 0 -10.03299 -2.910014 0 -10.09018 -3.14275 0 -8.966857 -2.953299 0 -9.030954 -3.463236 0 -9.914112 -3.273785 0 -9.978208 -3.465657 0 -8.847196 -3.278654 0 -8.918116 -3.820262 0 -9.78221 -3.633259 0 -9.853131 -5.850911 0 -7.487772 -5.691996 0 -7.609204 -6.458074 0 -8.28235 -6.299158 0 -8.403782 -6.118436 0 -7.270933 -5.964025 0 -7.398045 -6.753996 0 -8.042984 -6.599586 0 -8.170096 -6.377926 0 -7.04454 -6.228224 0 -7.177165 -7.041048 0 -7.79305 -6.891346 0 -7.925674 -4.707648 0 -8.254097 -4.532855 0 -8.351295 -5.193632 0 -9.128065 -5.018839 0 -9.225264 -5.003697 0 -8.078188 -4.832541 0 -8.181655 -5.521034 0 -8.933969 -5.349878 0 -9.037437 -5.293176 0 -7.891666 -5.125881 0 -8.001266 -5.841187 0 -8.728134 -5.673894 0 -8.837738 -5.575704 0 -7.694774 -5.412492 0 -7.810366 -6.153671 0 -8.510834 -5.990459 0 -8.626427 -6.629041 0 -6.808892 -6.484243 0 -6.946854 -7.318854 0 -7.532878 -7.174057 0 -7.670841 -6.87145 0 -6.564299 -6.731749 0 -6.707418 -7.58705 0 -7.26281 -7.447348 0 -7.405931 -7.104837 0 -6.31108 -6.970413 0 -6.459168 -7.845281 0 -6.983197 -7.710857 0 -7.131288 -7.328893 0 -6.049569 -7.199924 0 -6.202432 -8.093209 0 -6.694412 -7.96424 0 -6.847276 -7.543324 0 -5.780111 -7.41998 0 -5.937547 -8.330508 0 -6.39683 -8.207164 0 -6.554265 -7.747849 0 -5.503058 -7.630292 0 -5.664861 -8.556867 0 -6.090843 -8.439309 0 -6.252646 -8.461714 0 -4.326324 -8.36877 0 -4.503416 -9.34717 0 -4.791048 -9.254226 0 -4.968139 -8.612948 0 -4.016944 -8.526483 0 -4.197287 -9.514665 0 -4.449271 -9.428201 0 -4.629615 -8.752872 0 -3.702284 -8.672999 0 -3.885643 -9.669664 0 -4.101649 -9.589791 0 -4.285007 -7.942199 0 -5.218775 -7.830584 0 -5.384732 -8.771987 0 -5.776855 -8.660371 0 -5.942813 -8.126119 0 -4.927636 -8.020591 0 -5.097529 -8.975586 0 -5.455275 -8.870059 0 -5.62517 -8.299366 0 -4.630021 -8.200065 0 -4.803628 -9.167398 0 -5.126529 -9.068097 0 -5.300136 -9.195998 0 -2.399233 -9.143456 0 -2.592207 -10.16087 0 -2.66194 -10.10833 0 -2.854915 -9.27691 0 -2.064506 -9.231397 0 -2.259258 -10.25067 0 -2.292073 -10.20516 0 -2.486825 -9.345638 0 -1.727067 -9.307213 0 -1.923341 -10.32701 0 -1.919194 -10.28858 0 -2.115467 -8.881299 0 -3.382761 -8.808124 0 -3.568894 -9.811963 0 -3.748638 -9.738788 0 -3.934771 -8.998062 0 -3.058793 -8.931682 0 -3.247457 -9.941375 0 -3.390702 -9.874992 0 -3.579364 -9.103008 0 -2.730807 -9.043508 0 -2.921751 -10.05773 0 -3.02831 -9.998228 0 -3.219254 -9.402092 0 -1.387359 -9.370805 0 -1.584896 -10.38978 0 -1.543792 -10.35849 0 -1.741331 -9.446198 0 -1.045828 -9.42209 0 -1.244369 -10.43891 0 -1.166364 -10.4148 0 -1.364905 -9.477897 0 -0.7029233 -9.460999 0 -0.9022074 -10.47432 0 -0.7874022 -10.45743 0 -0.9866881 -9.497148 0 -0.3590937 -9.487485 0 -0.5588613 -10.49598 0 -0.4074073 -10.48632 0 -0.6071739 -9.449409 0 1.016416 -9.468711 0 0.817349 -10.44474 0 1.11293 -10.46404 0 0.9138632 -9.406367 0 1.358082 -9.432872 0 1.159846 -10.39755 0 1.490605 -10.42405 0 1.292369 -9.350971 0 1.697965 -9.384643 0 1.500819 -10.3367 0 1.866321 -10.37037 0 1.669176 -9.503924 0 -0.01479292 -9.501509 0 -0.2147789 -10.50385 0 -0.02687597 -10.50143 0 -0.2268615 -9.498219 0 0.3295264 -9.503052 0 0.1295843 -10.49793 0 0.3536901 -10.50276 0 0.1537485 -9.480039 0 0.6734133 -9.492116 0 0.4737773 -10.47822 0 0.7337914 -10.49029 0 0.5341563 -9.007545 0 3.030767 -9.069348 0 2.840555 -9.9586 0 3.339784 -10.0204 0 3.149572 -8.891791 0 3.355097 -8.960447 0 3.167251 -9.831023 0 3.698378 -9.89968 0 3.510532 -8.764359 0 3.675019 -8.839778 0 3.489783 -9.690535 0 4.052113 -9.765952 0 3.866879 -9.283295 0 2.035616 -9.324089 0 1.83982 -10.26227 0 2.239586 -10.30307 0 2.04379 -9.203425 0 2.370593 -9.251288 0 2.176405 -10.17437 0 2.609908 -10.22223 0 2.41572 -9.111468 0 2.702455 -9.166337 0 2.51013 -10.0731 0 2.976802 -10.12797 0 2.784476 -8.141425 0 4.902316 -8.242818 0 4.729921 -9.003396 0 5.409276 -9.104787 0 5.236881 -7.958413 0 5.194026 -8.065987 0 5.02542 -8.801444 0 5.731892 -8.909018 0 5.563286 -7.76495 0 5.478914 -7.878563 0 5.314317 -8.587934 0 6.046979 -8.701547 0 5.882381 -8.625417 0 3.990112 -8.7075 0 3.807732 -9.537316 0 4.400525 -9.619399 0 4.218144 -8.475146 0 4.299963 -8.563785 0 4.120677 -9.371573 0 4.743155 -9.460212 0 4.563869 -8.313745 0 4.604164 -8.408823 0 4.428209 -9.193521 0 5.079552 -9.288598 0 4.903596 -7.561288 0 5.756602 -7.680791 0 5.596231 -8.363143 0 6.354119 -8.482648 0 6.193748 -7.347697 0 6.026727 -7.472934 0 5.870792 -8.127372 0 6.652912 -8.252609 0 6.496977 -7.124456 0 6.288934 -7.255263 0 6.13764 -7.880925 0 6.942965 -8.011731 0 6.79167 -6.89186 0 6.542878 -7.028063 0 6.396424 -7.624129 0 7.223894 -7.760332 0 7.07744 -6.650213 0 6.788225 -6.791634 0 6.646803 -7.35732 0 7.495332 -7.498741 0 7.35391 -8.148288 0 -2.433304 -8.088786 0 -2.624248 -9.103008 0 -2.730807 -9.043508 0 -2.921751 -8.481864 0 0.6130347 -8.493939 0 0.4134002 -9.480039 0 0.6734133 -9.492116 0 0.4737773 -7.713517 0 3.579699 -7.7956 0 3.397319 -8.625417 0 3.990112 -8.7075 0 3.807732 -5.943107 0 6.081119 -6.084527 0 5.939697 -6.650213 0 6.788225 -6.791634 0 6.646803 6.077708 0 5.939697 5.936288 0 6.081119 6.784815 0 6.646803 6.643394 0 6.788225 6.625978 0 -5.320828 6.749322 0 -5.163392 7.413161 0 -5.937547 7.536506 0 -5.780111 4.308384 0 -7.325874 4.47954 0 -7.222406 4.825722 0 -8.181655 4.996878 0 -8.078188 1.430397 0 -8.378796 1.62712 0 -8.342743 1.610652 0 -9.362416 1.807376 0 -9.326365 7.788781 0 3.397319 7.706698 0 3.579699 8.700681 0 3.807732 8.618598 0 3.990112 8.487121 0 0.4134002 8.475045 0 0.6130347 9.485297 0 0.4737773 9.47322 0 0.6734133 8.081967 0 -2.624248 8.141469 0 -2.433304 9.036689 0 -2.921751 9.096189 0 -2.730807 -1.633939 0 -8.342743 -1.437215 0 -8.378796 -1.814194 0 -9.326365 -1.61747 0 -9.362416 -4.486359 0 -7.222406 -4.315203 0 -7.325874 -5.003697 0 -8.078188 -4.832541 0 -8.181655 -6.756141 0 -5.163392 -6.632797 0 -5.320828 -7.543324 0 -5.780111 -7.41998 0 -5.937547</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260_2Shape-positions-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260_2Shape-normals" name="qt_gauge_tickmarks_260_2Shape-normals">
+ <float_array id="qt_gauge_tickmarks_260_2Shape-normals-array" count="2064">0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260_2Shape-normals-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260_2Shape-tangents" name="qt_gauge_tickmarks_260_2Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_260_2Shape-tangents-array" count="2064">0.9909496 0 -0.1342342 0.9749288 0 -0.2225172 0.9510558 0 -0.3090192 0.9195278 0 -0.3930251 0.8805943 0 -0.473871 0.8345747 0 -0.5508948 0.7818291 0 -0.6234927 0.7227963 0 -0.6910611 0.6579369 0 -0.7530731 0.5877874 0 -0.8090154 0.512896 0 -0.8584507 0.4338849 0 -0.9009683 0.351375 0 -0.9362348 0.2660347 0 -0.9639634 0.1785573 0 -0.9839295 0.08963909 0 -0.9959743 0 0 -1 -0.08964012 0 -0.9959742 -0.1785574 0 -0.9839295 -0.2660357 0 -0.9639632 -0.3513765 0 -0.9362342 -0.4338853 0 -0.9009681 -0.5128972 0 -0.85845 -0.5877872 0 -0.8090156 -0.6579372 0 -0.7530728 -0.7227963 0 -0.6910611 -0.7818301 0 -0.6234915 -0.8345751 0 -0.5508941 -0.8805951 0 -0.4738694 -0.9195271 0 -0.3930265 -0.9510566 0 -0.3090166 -0.974929 0 -0.2225162 -0.9909495 0 -0.1342353 -0.9989931 0 -0.04486358 -0.9989931 0 0.04486359 -0.9909494 0 0.1342363 -0.9749287 0 0.2225173 -0.9510564 0 0.3090174 -0.9195269 0 0.3930272 -0.8805955 0 0.4738687 -0.8345744 0 0.5508953 -0.7818294 0 0.6234924 -0.7227968 0 0.6910606 -0.7227986 0 -0.6910588 0.7227971 0 0.6910603 0.7818294 0 0.6234924 0.8345742 0 0.5508956 0.8805959 0 0.473868 0.9195271 0 0.3930265 0.9510567 0 0.3090165 0.974929 0 0.2225163 0.9909494 0 0.1342363 0.9989932 0 0.04486257 0.9989934 0 -0.04485732 -0.9989933 0 0.04486049 -0.99095 0 0.1342313 -0.9749278 0 0.2225215 -0.9510562 0 0.3090181 -0.9195277 0 0.3930252 -0.8805956 0 0.4738686 -0.8345726 0 0.550898 -0.7818307 0 0.6234907 -0.7227954 0 0.6910621 -0.6579378 0 0.7530723 -0.5877875 0 0.8090154 -0.5128975 0 0.8584499 -0.4338841 0 0.9009687 -0.3513726 0 0.9362357 -0.2660368 0 0.9639629 -0.1785568 0 0.9839296 -0.08964029 0 0.9959742 0 0 1 0.08964162 0 0.9959741 0.1785569 0 0.9839296 0.2660387 0 0.9639623 0.3513741 0 0.9362351 0.4338843 0 0.9009686 0.5128978 0 0.8584497 0.5877872 0 0.8090155 0.6579383 0 0.7530718 0.7227961 0 0.6910614 0.7818311 0 0.6234903 0.8345732 0 0.5508971 0.8805959 0 0.473868 0.9195281 0 0.3930243 0.9510567 0 0.3090165 0.9749278 0 0.2225215 0.9909499 0 0.1342325 0.998993 0 0.04486657 0.998993 0 -0.04486656 0.9909497 0 -0.1342335 0.9749275 0 -0.2225226 0.9510564 0 -0.3090173 0.9195276 0 -0.3930254 0.8805966 0 -0.4738667 0.8345726 0 -0.550898 0.7818308 0 -0.6234906 0.7227954 0 -0.6910621 0.7227985 0 -0.6910588 -0.7227964 0 -0.6910611 -0.7818307 0 -0.6234907 -0.8345724 0 -0.5508982 -0.8805967 0 -0.4738665 -0.919528 0 -0.3930244 -0.9510567 0 -0.3090164 -0.9749277 0 -0.2225217 -0.9909497 0 -0.1342335 -0.998993 0 -0.04486563 -0.6810158 0 0.7322687 0.7322687 0 0.6810159 -0.7322699 0 -0.6810146 0.6810156 0 -0.7322689 -0.6540298 0 0.7564688 0.7564666 0 0.6540324 -0.7564708 0 -0.6540275 0.6540304 0 -0.7564683 -0.6261842 0 0.7796752 0.7796734 0 0.6261864 -0.7796741 0 -0.6261855 0.626185 0 -0.7796745 -0.7071068 0 0.7071068 0.7071092 0 0.7071044 -0.707108 0 -0.7071056 0.707107 0 -0.7071065 -0.4753882 0 0.8797762 0.8797745 0 0.4753913 -0.879777 0 -0.4753866 0.4753881 0 -0.8797762 -0.4431914 0 0.896427 0.8964271 0 0.4431913 -0.8964271 0 -0.4431913 0.4431914 0 -0.896427 -0.4104129 0 0.9118998 0.9118997 0 0.4104132 -0.9118997 0 -0.4104132 0.4104129 0 -0.9118998 -0.5975172 0 0.8018561 0.8018572 0 0.5975157 -0.8018518 0 -0.5975229 0.5975178 0 -0.8018557 -0.5680648 0 0.8229839 0.8229846 0 0.5680636 -0.8229846 0 -0.5680636 0.5680648 0 -0.8229839 -0.5378655 0 0.8430307 0.8430293 0 0.5378677 -0.8430293 0 -0.5378677 0.5378655 0 -0.8430307 -0.5069602 0 0.8619695 0.8619684 0 0.506962 -0.8619726 0 -0.5069549 0.5069594 0 -0.86197 -0.2743459 0 0.9616311 0.9616315 0 0.2743445 -0.9616307 0 -0.2743473 0.2743473 0 -0.9616307 -0.2393158 0 0.9709418 0.9709418 0 0.2393156 -0.9709418 0 -0.2393156 0.2393158 0 -0.9709418 -0.2039704 0 0.9789771 0.9789769 0 0.203971 -0.9789759 0 -0.2039758 0.2039704 0 -0.9789771 -0.3770953 0 0.9261744 0.9261741 0 0.3770962 -0.9261766 0 -0.3770901 0.3770936 0 -0.9261751 -0.343281 0 0.9392327 0.9392329 0 0.3432806 -0.9392314 0 -0.3432848 0.3432813 0 -0.9392326 -0.309017 0 0.9510565 0.9510559 0 0.3090189 -0.9510547 0 -0.3090225 0.3090177 0 -0.9510563 -0.1683567 0 0.9857261 0.9857262 0 0.1683565 -0.9857253 0 -0.1683617 0.1683562 0 -0.9857262 -0.1325227 0 0.99118 0.99118 0 0.1325226 -0.99118 0 -0.1325223 0.1325231 0 -0.9911799 -0.09651421 0 0.9953316 0.9953318 0 0.09651171 -0.9953318 0 -0.09651171 0.09651421 0 -0.9953316 0.04831269 0 0.9988323 0.9988323 0 -0.04831287 -0.998832 0 0.04831785 -0.04831359 0 -0.9988322 0.08448072 0 0.9964251 0.9964246 0 -0.08448637 -0.9964255 0 0.0844761 -0.08447899 0 -0.9964253 0.1205363 0 0.9927089 0.9927085 0 -0.12054 -0.9927085 0 0.12054 -0.1205363 0 -0.9927089 -0.06037908 0 0.9981755 0.9981751 0 0.06038637 -0.9981756 0 -0.06037715 0.06037801 0 -0.9981756 -0.0241642 0 0.999708 0.9997081 0 0.02416128 -0.9997081 0 -0.02416134 0.02416372 0 -0.999708 0.01208259 0 0.999927 0.9999271 0 -0.01207825 -0.9999269 0 0.01208781 -0.01208305 0 -0.999927 0.2627078 0 0.9648755 0.964875 0 -0.2627096 -0.9648777 0 0.2626995 -0.2627073 0 -0.9648756 0.2975029 0 0.9547209 0.9547207 0 -0.2975037 -0.9547207 0 0.2975037 -0.2975029 0 -0.9547209 0.3319075 0 0.943312 0.9433142 0 -0.331901 -0.9433103 0 0.3319121 -0.3319083 0 -0.9433116 0.3658762 0 0.9306635 0.9306637 0 -0.3658759 -0.9306629 0 0.3658779 -0.3658773 0 -0.9306631 0.156435 0 0.9876882 0.987688 0 -0.1564365 -0.9876883 0 0.156435 -0.1564332 0 -0.9876885 0.1921263 0 0.9813702 0.9813699 0 -0.1921279 -0.9813698 0 0.1921283 -0.1921268 0 -0.9813701 0.2275665 0 0.9737625 0.9737626 0 -0.2275661 -0.9737625 0 0.2275667 -0.2275669 0 -0.9737624 0.3993642 0 0.9167924 0.9167948 0 -0.3993587 -0.9167917 0 0.3993657 -0.3993652 0 -0.9167919 0.4323275 0 0.9017167 0.9017154 0 -0.4323301 -0.9017204 0 0.4323196 -0.4323271 0 -0.9017169 0.4647231 0 0.8854561 0.8854569 0 -0.4647214 -0.8854569 0 0.4647214 -0.4647231 0 -0.8854561 0.496508 0 0.8680322 0.8680333 0 -0.4965061 -0.8680338 0 0.496505 -0.4965076 0 -0.8680324 0.5276402 0 0.849468 0.8494679 0 -0.5276403 -0.8494727 0 0.5276326 -0.5276392 0 -0.8494686 0.5580804 0 0.8297869 0.8297891 0 -0.5580771 -0.8297876 0 0.5580793 -0.5580796 0 -0.8297874 0.5877855 0 0.8090168 0.809014 0 -0.5877894 -0.8090156 0 0.5877872 -0.5877848 0 -0.8090173 0.6167184 0 0.7871839 0.7871813 0 -0.6167217 -0.7871804 0 0.6167228 -0.6167187 0 -0.7871836 0.6448431 0 0.764315 0.764317 0 -0.6448407 -0.7643156 0 0.6448423 -0.6448423 0 -0.7643156 0.7485102 0 0.6631233 0.6631219 0 -0.7485114 -0.6631218 0 0.7485115 -0.7485106 0 -0.6631228 0.7720516 0 0.6355599 0.6355596 0 -0.7720518 -0.635561 0 0.7720507 -0.7720514 0 -0.6355601 0.7945778 0 0.6071623 0.6071604 0 -0.7945793 -0.6071619 0 0.7945781 -0.7945777 0 -0.6071625 0.6721188 0 0.7404433 0.7404418 0 -0.6721204 -0.7404484 0 0.6721132 -0.6721178 0 -0.7404443 0.6985117 0 0.7155987 0.7156001 0 -0.6985102 -0.7156012 0 0.6985091 -0.698511 0 -0.7155994 0.723987 0 0.6898136 0.6898104 0 -0.7239901 -0.6898153 0 0.7239854 -0.7239866 0 -0.689814 0.8739679 0 0.4859837 0.4859911 0 -0.8739638 -0.4859911 0 0.8739638 -0.8739679 0 -0.4859837 0.8910067 0 0.4539901 0.4539842 0 -0.8910097 -0.4539909 0 0.8910063 -0.8910061 0 -0.4539913 0.9068744 0 0.4214009 0.4214048 0 -0.9068726 -0.4214048 0 0.9068726 -0.9068744 0 -0.4214009 0.81606 0 0.5779672 0.5779628 0 -0.8160631 -0.577966 0 0.8160608 -0.8160597 0 -0.5779677 0.8364705 0 0.548012 0.5480046 0 -0.8364753 -0.5480184 0 0.8364663 -0.8364699 0 -0.5480129 0.8557816 0 0.5173373 0.5173354 0 -0.8557827 -0.5173399 0 0.85578 -0.8557816 0 -0.5173373 0.9215508 0 0.3882577 0.3882648 0 -0.9215478 -0.388255 0 0.921552 -0.9215508 0 -0.3882578 0.9350162 0 0.3546049 0.3546008 0 -0.9350178 -0.3546049 0 0.9350162 -0.9350161 0 -0.3546052 0.9472533 0 0.3204859 0.3204871 0 -0.9472529 -0.3204782 0 0.9472559 -0.9472534 0 -0.3204855 0.9582459 0 0.2859455 0.2859453 0 -0.9582459 -0.2859453 0 0.9582459 -0.9582459 0 -0.2859455 0.9895064 0 0.1444891 0.1444863 0 -0.9895068 -0.1444958 0 0.9895054 -0.9895064 0 -0.1444892 0.9940928 0 0.108533 0.1085234 0 -0.9940939 -0.1085328 0 0.9940929 -0.9940928 0 -0.1085331 0.9973732 0 0.07243474 0.07243158 0 -0.9973734 -0.07243632 0 0.997373 -0.9973731 0 -0.07243481 0.9679793 0 0.2510299 0.2510258 0 -0.9679804 -0.2510264 0 0.9679802 -0.9679794 0 -0.2510295 0.9764411 0 0.215784 0.2157787 0 -0.9764423 -0.215783 0 0.9764414 -0.976441 0 -0.2157844 0.9836199 0 0.1802551 0.1802587 0 -0.9836192 -0.1802538 0 0.9836201 -0.9836199 0 -0.1802552 0.9993431 0 0.03624119 0.03623962 0 -0.9993431 -0.03623485 0 0.9993433 -0.9993431 0 -0.0362412 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9993431 0 -0.0362412 -0.03623963 0 -0.9993431 0.03623486 0 0.9993433 -0.9993431 0 0.03624124 0.9836199 0 -0.1802552 -0.1802589 0 -0.9836192 0.1802538 0 0.9836201 -0.9836199 0 0.1802549 0.976441 0 -0.2157844 -0.2157787 0 -0.9764423 0.215783 0 0.9764414 -0.9764411 0 0.215784 0.9679794 0 -0.2510295 -0.2510258 0 -0.9679804 0.2510264 0 0.9679802 -0.9679793 0 0.2510299 0.9973731 0 -0.07243481 -0.07243158 0 -0.9973734 0.07243632 0 0.997373 -0.9973732 0 0.07243474 0.9940928 0 -0.1085331 -0.1085234 0 -0.9940939 0.108533 0 0.9940928 -0.9940928 0 0.1085332 0.9895064 0 -0.1444892 -0.1444865 0 -0.9895068 0.144496 0 0.9895054 -0.9895064 0 0.1444891 0.9215506 0 -0.3882582 -0.3882648 0 -0.9215478 0.3882546 0 0.9215521 -0.9215508 0 0.3882579 0.9068744 0 -0.4214009 -0.4214039 0 -0.9068731 0.4214048 0 0.9068726 -0.9068743 0 0.4214013 0.8910061 0 -0.4539913 -0.4539842 0 -0.8910097 0.4539909 0 0.8910063 -0.8910067 0 0.4539901 0.9582459 0 -0.2859455 -0.2859453 0 -0.9582459 0.2859453 0 0.9582459 -0.9582459 0 0.2859455 0.9472534 0 -0.3204855 -0.3204871 0 -0.9472529 0.3204782 0 0.9472559 -0.9472533 0 0.3204859 0.9350161 0 -0.3546052 -0.3546008 0 -0.9350178 0.3546049 0 0.9350162 -0.9350162 0 0.3546049 0.7945777 0 -0.6071625 -0.6071604 0 -0.7945793 0.6071619 0 0.7945781 -0.7945778 0 0.6071623 0.7720514 0 -0.6355601 -0.6355596 0 -0.7720518 0.635561 0 0.7720507 -0.7720516 0 0.6355599 0.7485106 0 -0.6631228 -0.6631219 0 -0.7485114 0.6631218 0 0.7485115 -0.7485102 0 0.6631233 0.8739679 0 -0.4859837 -0.4859911 0 -0.8739638 0.4859911 0 0.8739638 -0.8739679 0 0.4859837 0.8557816 0 -0.5173373 -0.5173354 0 -0.8557827 0.5173399 0 0.85578 -0.8557816 0 0.5173373 0.8364699 0 -0.5480129 -0.5480046 0 -0.8364753 0.5480184 0 0.8364663 -0.8364705 0 0.548012 0.8160597 0 -0.5779677 -0.5779628 0 -0.8160631 0.577966 0 0.8160608 -0.81606 0 0.5779672 0.7239866 0 -0.689814 -0.6898104 0 -0.7239901 0.6898153 0 0.7239854 -0.723987 0 0.6898136 0.698511 0 -0.7155994 -0.7156001 0 -0.6985102 0.7156012 0 0.6985091 -0.6985117 0 0.7155987 0.6721178 0 -0.7404443 -0.7404418 0 -0.6721204 0.7404484 0 0.6721132 -0.6721188 0 0.7404433 0.6448423 0 -0.7643156 -0.764317 0 -0.6448407 0.7643156 0 0.6448423 -0.6448431 0 0.764315 0.6167187 0 -0.7871836 -0.7871813 0 -0.6167217 0.7871804 0 0.6167228 -0.6167184 0 0.7871839 0.5877848 0 -0.8090173 -0.809014 0 -0.5877894 0.8090156 0 0.5877872 -0.5877855 0 0.8090168 0.4647231 0 -0.8854561 -0.8854569 0 -0.4647214 0.8854569 0 0.4647214 -0.4647231 0 0.8854561 0.4323271 0 -0.9017169 -0.9017154 0 -0.4323301 0.9017204 0 0.4323196 -0.4323275 0 0.9017167 0.3993652 0 -0.9167919 -0.9167948 0 -0.3993587 0.9167917 0 0.3993657 -0.3993642 0 0.9167924 0.5580796 0 -0.8297874 -0.8297891 0 -0.5580771 0.8297876 0 0.5580793 -0.5580804 0 0.8297869 0.5276392 0 -0.8494686 -0.8494679 0 -0.5276403 0.8494727 0 0.5276326 -0.5276402 0 0.849468 0.4965076 0 -0.8680324 -0.8680333 0 -0.4965061 0.8680338 0 0.496505 -0.496508 0 0.8680322 0.2627073 0 -0.9648756 -0.964875 0 -0.2627096 0.9648777 0 0.2626995 -0.2627078 0 0.9648755 0.2275669 0 -0.9737624 -0.9737626 0 -0.2275661 0.9737625 0 0.2275667 -0.2275665 0 0.9737625 0.1921268 0 -0.9813701 -0.9813699 0 -0.1921279 0.9813698 0 0.1921283 -0.1921263 0 0.9813702 0.3658773 0 -0.9306631 -0.9306637 0 -0.3658759 0.9306629 0 0.3658779 -0.3658762 0 0.9306635 0.3319083 0 -0.9433116 -0.9433142 0 -0.331901 0.9433103 0 0.3319121 -0.3319075 0 0.943312 0.2975029 0 -0.9547209 -0.9547207 0 -0.2975037 0.9547207 0 0.2975037 -0.2975029 0 0.9547209 0.1564332 0 -0.9876885 -0.987688 0 -0.1564365 0.9876883 0 0.156435 -0.156435 0 0.9876882 0.1205363 0 -0.9927089 -0.9927085 0 -0.12054 0.9927085 0 0.12054 -0.1205363 0 0.9927089 0.08447899 0 -0.9964253 -0.9964246 0 -0.08448637 0.9964255 0 0.0844761 -0.08448072 0 0.9964251 0.04831359 0 -0.9988322 -0.9988323 0 -0.04831287 0.998832 0 0.04831785 -0.04831269 0 0.9988323 -0.09651421 0 -0.9953316 -0.9953318 0 0.09651171 0.9953318 0 -0.09651171 0.09651421 0 0.9953316 -0.1325231 0 -0.9911799 -0.99118 0 0.1325226 0.99118 0 -0.1325223 0.1325227 0 0.99118 -0.1683562 0 -0.9857262 -0.9857262 0 0.1683565 0.9857253 0 -0.1683617 0.1683567 0 0.9857261 0.01208305 0 -0.999927 -0.9999271 0 -0.01207825 0.9999269 0 0.01208781 -0.01208259 0 0.999927 -0.02416372 0 -0.999708 -0.9997081 0 0.02416128 0.9997081 0 -0.02416134 0.0241642 0 0.999708 -0.06037801 0 -0.9981756 -0.9981751 0 0.06038637 0.9981756 0 -0.06037715 0.06037908 0 0.9981755 -0.3090177 0 -0.9510563 -0.9510559 0 0.3090189 0.9510547 0 -0.3090225 0.309017 0 0.9510565 -0.3432813 0 -0.9392326 -0.9392329 0 0.3432806 0.9392314 0 -0.3432848 0.343281 0 0.9392327 -0.3770936 0 -0.9261751 -0.9261741 0 0.3770962 0.9261766 0 -0.3770901 0.3770953 0 0.9261744 -0.2039704 0 -0.9789771 -0.9789769 0 0.203971 0.9789759 0 -0.2039758 0.2039704 0 0.9789771 -0.2393158 0 -0.9709418 -0.9709418 0 0.2393156 0.9709418 0 -0.2393156 0.2393158 0 0.9709418 -0.2743473 0 -0.9616307 -0.9616315 0 0.2743445 0.9616307 0 -0.2743473 0.2743459 0 0.9616311 -0.5069594 0 -0.86197 -0.8619684 0 0.506962 0.8619726 0 -0.5069549 0.5069602 0 0.8619695 -0.5378655 0 -0.8430307 -0.8430293 0 0.5378677 0.8430293 0 -0.5378677 0.5378655 0 0.8430307 -0.5680648 0 -0.8229839 -0.8229846 0 0.5680636 0.8229846 0 -0.5680636 0.5680648 0 0.8229839 -0.4104129 0 -0.9118998 -0.9118997 0 0.4104132 0.9118997 0 -0.4104132 0.4104129 0 0.9118998 -0.4431914 0 -0.896427 -0.8964271 0 0.4431913 0.8964271 0 -0.4431913 0.4431914 0 0.896427 -0.4753881 0 -0.8797762 -0.8797745 0 0.4753913 0.879777 0 -0.4753866 0.4753882 0 0.8797762 -0.5975178 0 -0.8018557 -0.8018572 0 0.5975157 0.8018518 0 -0.5975229 0.5975172 0 0.8018561 -0.626185 0 -0.7796745 -0.7796734 0 0.6261864 0.7796741 0 -0.6261855 0.6261842 0 0.7796752 -0.6540304 0 -0.7564683 -0.7564666 0 0.6540324 0.7564708 0 -0.6540275 0.6540298 0 0.7564688 -0.6810156 0 -0.7322689 -0.7322687 0 0.6810159 0.7322699 0 -0.6810146 0.6810158 0 0.7322687 -0.707107 0 -0.7071065 -0.7071092 0 0.7071044 0.707108 0 -0.7071056 0.7071068 0 0.7071068 0.2975033 0 -0.9547208 -0.9547193 0 -0.2975081 0.9547207 0 0.2975037 -0.2975031 0 0.9547209 -0.0603786 0 -0.9981755 -0.9981756 0 0.06037729 0.9981751 0 -0.06038637 0.06037706 0 0.9981756 -0.4104127 0 -0.9118999 -0.9118999 0 0.4104127 0.9118997 0 -0.4104132 0.4104129 0 0.9118998 -0.7071068 0 -0.7071068 -0.7071092 0 0.7071044 0.7071092 0 -0.7071044 0.7071063 0 0.7071073 -0.7071063 0 0.7071073 0.7071092 0 0.7071044 -0.7071092 0 -0.7071044 0.7071068 0 -0.7071068 0.6167191 0 0.7871833 0.7871824 0 -0.6167202 -0.7871813 0 0.6167217 -0.6167189 0 -0.7871835 0.8557811 0 0.5173381 0.5173399 0 -0.85578 -0.5173354 0 0.8557827 -0.8557811 0 -0.517338 0.9836199 0 0.180255 0.1802633 0 -0.9836184 -0.1802587 0 0.9836192 -0.9836199 0 -0.1802549 -0.4104129 0 0.9118998 0.9118999 0 0.4104127 -0.9118997 0 -0.4104132 0.4104127 0 -0.9118999 -0.06037706 0 0.9981756 0.9981756 0 0.06037729 -0.9981751 0 -0.06038637 0.0603786 0 -0.9981755 0.2975031 0 0.9547209 0.9547193 0 -0.2975081 -0.9547207 0 0.2975037 -0.2975033 0 -0.9547208 0.98362 0 -0.1802546 -0.1802633 0 -0.9836184 0.1802589 0 0.9836192 -0.9836199 0 0.180255 0.8557811 0 -0.517338 -0.5173399 0 -0.85578 0.5173354 0 0.8557827 -0.8557811 0 0.5173381 0.6167189 0 -0.7871835 -0.7871824 0 -0.6167202 0.7871813 0 0.6167217 -0.6167191 0 0.7871833</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260_2Shape-tangents-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260_2Shape-binormals" name="qt_gauge_tickmarks_260_2Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_260_2Shape-binormals-array" count="2064">-0.1342342 0 -0.9909497 -0.2225172 0 -0.9749288 -0.3090192 0 -0.9510558 -0.3930251 0 -0.9195278 -0.4738711 0 -0.8805943 -0.5508949 0 -0.8345746 -0.6234927 0 -0.7818292 -0.6910611 0 -0.7227963 -0.7530732 0 -0.6579369 -0.8090155 0 -0.5877874 -0.8584508 0 -0.512896 -0.9009684 0 -0.4338849 -0.9362349 0 -0.3513751 -0.9639634 0 -0.2660347 -0.9839296 0 -0.1785573 -0.9959743 0 -0.08963909 -1 0 0 -0.9959743 0 0.08964013 -0.9839296 0 0.1785574 -0.9639632 0 0.2660357 -0.9362342 0 0.3513765 -0.9009682 0 0.4338853 -0.8584501 0 0.5128972 -0.8090156 0 0.5877872 -0.7530729 0 0.6579372 -0.6910611 0 0.7227963 -0.6234915 0 0.7818302 -0.5508941 0 0.8345751 -0.4738694 0 0.8805952 -0.3930265 0 0.9195272 -0.3090166 0 0.9510567 -0.2225162 0 0.974929 -0.1342353 0 0.9909495 -0.04486358 0 0.9989932 0.04486359 0 0.9989932 0.1342363 0 0.9909495 0.2225173 0 0.9749287 0.3090174 0 0.9510564 0.3930272 0 0.9195269 0.4738687 0 0.8805956 0.5508953 0 0.8345743 0.6234924 0 0.7818295 0.6910606 0 0.7227969 -0.6910588 0 0.7227986 0.6910603 0 -0.7227971 0.6234924 0 -0.7818295 0.5508956 0 -0.8345743 0.473868 0 -0.8805959 0.3930265 0 -0.9195272 0.3090165 0 -0.9510568 0.2225163 0 -0.974929 0.1342363 0 -0.9909495 0.04486257 0 -0.9989932 -0.04485732 0 -0.9989934 0.04486049 0 0.9989933 0.1342313 0 0.99095 0.2225215 0 0.9749278 0.3090181 0 0.9510562 0.3930252 0 0.9195278 0.4738687 0 0.8805957 0.550898 0 0.8345726 0.6234908 0 0.7818307 0.6910622 0 0.7227954 0.7530723 0 0.6579379 0.8090154 0 0.5877875 0.8584499 0 0.5128974 0.9009687 0 0.4338841 0.9362358 0 0.3513726 0.9639629 0 0.2660368 0.9839297 0 0.1785568 0.9959742 0 0.0896403 1 0 0 0.9959741 0 -0.08964162 0.9839296 0 -0.1785569 0.9639624 0 -0.2660387 0.9362351 0 -0.3513741 0.9009686 0 -0.4338843 0.8584497 0 -0.5128978 0.8090156 0 -0.5877872 0.7530719 0 -0.6579383 0.6910614 0 -0.7227961 0.6234903 0 -0.7818311 0.5508971 0 -0.8345733 0.4738681 0 -0.880596 0.3930243 0 -0.9195282 0.3090165 0 -0.9510567 0.2225215 0 -0.9749278 0.1342325 0 -0.9909499 0.04486657 0 -0.998993 -0.04486656 0 -0.998993 -0.1342335 0 -0.9909497 -0.2225226 0 -0.9749276 -0.3090173 0 -0.9510565 -0.3930254 0 -0.9195277 -0.4738668 0 -0.8805967 -0.550898 0 -0.8345727 -0.6234906 0 -0.7818309 -0.6910622 0 -0.7227954 -0.6910588 0 -0.7227985 -0.6910611 0 0.7227963 -0.6234908 0 0.7818307 -0.5508982 0 0.8345725 -0.4738665 0 0.8805967 -0.3930244 0 0.919528 -0.3090163 0 0.9510567 -0.2225217 0 0.9749277 -0.1342335 0 0.9909498 -0.04486563 0 0.998993 0.7322687 0 0.6810158 0.6810158 0 -0.7322687 -0.6810146 0 0.7322698 -0.7322689 0 -0.6810156 0.7564688 0 0.6540298 0.6540323 0 -0.7564666 -0.6540275 0 0.7564709 -0.7564683 0 -0.6540304 0.7796751 0 0.6261842 0.6261864 0 -0.7796734 -0.6261855 0 0.7796741 -0.7796745 0 -0.626185 0.7071068 0 0.7071068 0.7071044 0 -0.7071092 -0.7071056 0 0.707108 -0.7071066 0 -0.7071071 0.8797762 0 0.4753882 0.4753913 0 -0.8797745 -0.4753866 0 0.879777 -0.8797762 0 -0.4753881 0.8964271 0 0.4431915 0.4431913 0 -0.8964271 -0.4431913 0 0.8964271 -0.8964271 0 -0.4431915 0.9118998 0 0.4104129 0.4104132 0 -0.9118998 -0.4104132 0 0.9118998 -0.9118998 0 -0.4104129 0.8018562 0 0.5975172 0.5975156 0 -0.8018573 -0.5975229 0 0.8018518 -0.8018557 0 -0.5975178 0.8229839 0 0.5680647 0.5680636 0 -0.8229846 -0.5680636 0 0.8229846 -0.8229839 0 -0.5680647 0.8430307 0 0.5378655 0.5378677 0 -0.8430293 -0.5378677 0 0.8430293 -0.8430307 0 -0.5378655 0.8619695 0 0.5069602 0.506962 0 -0.8619684 -0.5069549 0 0.8619726 -0.8619699 0 -0.5069594 0.9616311 0 0.2743459 0.2743445 0 -0.9616315 -0.2743473 0 0.9616307 -0.9616307 0 -0.2743473 0.9709418 0 0.2393158 0.2393156 0 -0.9709419 -0.2393156 0 0.9709419 -0.9709418 0 -0.2393158 0.9789771 0 0.2039704 0.203971 0 -0.978977 -0.2039758 0 0.978976 -0.9789771 0 -0.2039704 0.9261745 0 0.3770953 0.3770963 0 -0.9261742 -0.3770902 0 0.9261766 -0.9261752 0 -0.3770937 0.9392328 0 0.343281 0.3432806 0 -0.939233 -0.3432848 0 0.9392315 -0.9392326 0 -0.3432813 0.9510565 0 0.309017 0.3090189 0 -0.951056 -0.3090225 0 0.9510548 -0.9510564 0 -0.3090177 0.9857262 0 0.1683567 0.1683565 0 -0.9857262 -0.1683617 0 0.9857253 -0.9857262 0 -0.1683562 0.99118 0 0.1325227 0.1325226 0 -0.99118 -0.1325223 0 0.9911801 -0.9911799 0 -0.1325231 0.9953316 0 0.09651421 0.09651171 0 -0.9953318 -0.09651171 0 0.9953318 -0.9953316 0 -0.09651421 0.9988323 0 -0.04831269 -0.04831287 0 -0.9988323 0.04831786 0 0.998832 -0.9988322 0 0.0483136 0.9964252 0 -0.08448073 -0.08448637 0 -0.9964247 0.0844761 0 0.9964255 -0.9964253 0 0.08447899 0.992709 0 -0.1205363 -0.12054 0 -0.9927086 0.12054 0 0.9927086 -0.992709 0 0.1205363 0.9981755 0 0.06037908 0.06038637 0 -0.9981751 -0.06037715 0 0.9981756 -0.9981757 0 -0.06037802 0.9997081 0 0.0241642 0.02416128 0 -0.9997081 -0.02416134 0 0.9997082 -0.9997081 0 -0.02416372 0.9999271 0 -0.0120826 -0.01207825 0 -0.9999271 0.01208782 0 0.999927 -0.999927 0 0.01208305 0.9648755 0 -0.2627077 -0.2627096 0 -0.964875 0.2626995 0 0.9648777 -0.9648756 0 0.2627074 0.9547209 0 -0.2975029 -0.2975037 0 -0.9547207 0.2975037 0 0.9547207 -0.9547209 0 0.2975029 0.943312 0 -0.3319075 -0.331901 0 -0.9433143 0.3319121 0 0.9433104 -0.9433117 0 0.3319083 0.9306635 0 -0.3658762 -0.3658759 0 -0.9306636 0.3658779 0 0.9306629 -0.9306632 0 0.3658773 0.9876882 0 -0.156435 -0.1564365 0 -0.9876881 0.156435 0 0.9876882 -0.9876886 0 0.1564332 0.9813703 0 -0.1921263 -0.1921279 0 -0.98137 0.1921283 0 0.9813699 -0.9813702 0 0.1921268 0.9737626 0 -0.2275665 -0.2275661 0 -0.9737626 0.2275667 0 0.9737626 -0.9737625 0 0.2275669 0.9167925 0 -0.3993642 -0.3993587 0 -0.9167948 0.3993658 0 0.9167918 -0.916792 0 0.3993653 0.9017168 0 -0.4323276 -0.4323301 0 -0.9017154 0.4323196 0 0.9017205 -0.9017169 0 0.4323272 0.8854561 0 -0.4647231 -0.4647214 0 -0.885457 0.4647214 0 0.885457 -0.8854561 0 0.4647231 0.8680322 0 -0.496508 -0.4965061 0 -0.8680333 0.4965051 0 0.8680339 -0.8680325 0 0.4965076 0.849468 0 -0.5276402 -0.5276403 0 -0.8494679 0.5276327 0 0.8494726 -0.8494686 0 0.5276392 0.829787 0 -0.5580804 -0.5580772 0 -0.8297891 0.5580793 0 0.8297876 -0.8297874 0 0.5580797 0.8090168 0 -0.5877855 -0.5877894 0 -0.809014 0.5877872 0 0.8090156 -0.8090173 0 0.5877848 0.7871839 0 -0.6167184 -0.6167217 0 -0.7871813 0.6167228 0 0.7871804 -0.7871836 0 0.6167186 0.764315 0 -0.644843 -0.6448407 0 -0.764317 0.6448424 0 0.7643157 -0.7643157 0 0.6448424 0.6631233 0 -0.7485102 -0.7485114 0 -0.6631219 0.7485116 0 0.6631218 -0.6631228 0 0.7485107 0.6355599 0 -0.7720516 -0.7720519 0 -0.6355596 0.7720507 0 0.635561 -0.6355601 0 0.7720514 0.6071623 0 -0.7945778 -0.7945793 0 -0.6071604 0.7945781 0 0.6071619 -0.6071625 0 0.7945777 0.7404433 0 -0.6721188 -0.6721205 0 -0.7404419 0.6721132 0 0.7404484 -0.7404443 0 0.6721178 0.7155986 0 -0.6985117 -0.6985102 0 -0.7156001 0.698509 0 0.7156012 -0.7155994 0 0.6985109 0.6898136 0 -0.723987 -0.7239901 0 -0.6898104 0.7239854 0 0.6898153 -0.689814 0 0.7239866 0.4859837 0 -0.8739679 -0.8739638 0 -0.4859911 0.8739638 0 0.4859911 -0.4859837 0 0.8739679 0.4539901 0 -0.8910067 -0.8910097 0 -0.4539843 0.8910064 0 0.4539908 -0.4539913 0 0.8910061 0.421401 0 -0.9068745 -0.9068727 0 -0.4214048 0.9068727 0 0.4214048 -0.421401 0 0.9068745 0.5779673 0 -0.8160601 -0.8160631 0 -0.5779628 0.8160609 0 0.577966 -0.5779677 0 0.8160597 0.548012 0 -0.8364705 -0.8364754 0 -0.5480046 0.8364663 0 0.5480185 -0.5480129 0 0.8364699 0.5173373 0 -0.8557817 -0.8557828 0 -0.5173354 0.8557801 0 0.5173399 -0.5173373 0 0.8557816 0.3882577 0 -0.9215509 -0.9215479 0 -0.3882649 0.921552 0 0.3882551 -0.3882579 0 0.9215509 0.3546049 0 -0.9350163 -0.9350178 0 -0.3546008 0.9350163 0 0.3546049 -0.3546053 0 0.9350162 0.3204859 0 -0.9472533 -0.9472529 0 -0.3204871 0.947256 0 0.3204782 -0.3204855 0 0.9472534 0.2859455 0 -0.9582459 -0.958246 0 -0.2859453 0.958246 0 0.2859453 -0.2859455 0 0.9582459 0.1444892 0 -0.9895065 -0.9895069 0 -0.1444864 0.9895055 0 0.1444958 -0.1444892 0 0.9895065 0.1085331 0 -0.9940929 -0.994094 0 -0.1085234 0.9940929 0 0.1085328 -0.1085331 0 0.9940929 0.07243475 0 -0.9973732 -0.9973735 0 -0.07243158 0.997373 0 0.07243633 -0.07243481 0 0.9973732 0.2510299 0 -0.9679794 -0.9679804 0 -0.2510258 0.9679803 0 0.2510264 -0.2510295 0 0.9679794 0.215784 0 -0.9764411 -0.9764423 0 -0.2157787 0.9764414 0 0.215783 -0.2157844 0 0.976441 0.1802551 0 -0.9836199 -0.9836193 0 -0.1802587 0.9836202 0 0.1802539 -0.1802552 0 0.98362 0.03624119 0 -0.9993431 -0.9993432 0 -0.03623962 0.9993434 0 0.03623486 -0.0362412 0 0.9993432 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.0362412 0 -0.9993431 -0.9993432 0 0.03623962 0.9993434 0 -0.03623487 0.03624124 0 0.9993431 -0.1802552 0 -0.98362 -0.9836193 0 0.1802589 0.9836202 0 -0.1802539 0.1802549 0 0.9836199 -0.2157845 0 -0.9764411 -0.9764423 0 0.2157787 0.9764414 0 -0.215783 0.215784 0 0.9764412 -0.2510295 0 -0.9679795 -0.9679804 0 0.2510258 0.9679803 0 -0.2510264 0.2510299 0 0.9679793 -0.07243481 0 -0.9973732 -0.9973734 0 0.07243158 0.9973731 0 -0.07243633 0.07243475 0 0.9973732 -0.1085331 0 -0.9940929 -0.9940939 0 0.1085234 0.9940929 0 -0.108533 0.1085332 0 0.9940929 -0.1444892 0 -0.9895065 -0.9895068 0 0.1444865 0.9895054 0 -0.144496 0.1444891 0 0.9895064 -0.3882582 0 -0.9215506 -0.9215479 0 0.3882649 0.9215522 0 -0.3882547 0.3882579 0 0.9215508 -0.421401 0 -0.9068745 -0.906873 0 0.4214039 0.9068727 0 -0.4214048 0.4214013 0 0.9068742 -0.4539913 0 -0.8910061 -0.8910097 0 0.4539843 0.8910064 0 -0.4539908 0.4539901 0 0.8910067 -0.2859455 0 -0.9582459 -0.9582461 0 0.2859453 0.9582461 0 -0.2859453 0.2859455 0 0.9582459 -0.3204855 0 -0.9472534 -0.9472529 0 0.3204871 0.947256 0 -0.3204782 0.3204859 0 0.9472533 -0.3546053 0 -0.9350162 -0.9350178 0 0.3546008 0.9350162 0 -0.3546049 0.3546049 0 0.9350163 -0.6071625 0 -0.7945777 -0.7945793 0 0.6071604 0.7945781 0 -0.6071619 0.6071623 0 0.7945778 -0.6355601 0 -0.7720515 -0.7720519 0 0.6355597 0.7720507 0 -0.635561 0.63556 0 0.7720516 -0.6631228 0 -0.7485107 -0.7485114 0 0.6631219 0.7485116 0 -0.6631218 0.6631233 0 0.7485102 -0.4859837 0 -0.8739679 -0.8739638 0 0.4859911 0.8739638 0 -0.4859911 0.4859837 0 0.8739679 -0.5173373 0 -0.8557816 -0.8557828 0 0.5173354 0.85578 0 -0.5173399 0.5173373 0 0.8557817 -0.5480129 0 -0.8364699 -0.8364754 0 0.5480046 0.8364663 0 -0.5480185 0.548012 0 0.8364705 -0.5779677 0 -0.8160597 -0.8160632 0 0.5779628 0.8160608 0 -0.577966 0.5779673 0 0.8160601 -0.689814 0 -0.7239866 -0.7239901 0 0.6898104 0.7239854 0 -0.6898153 0.6898136 0 0.723987 -0.7155994 0 -0.6985109 -0.6985102 0 0.7156001 0.698509 0 -0.7156012 0.7155986 0 0.6985117 -0.7404443 0 -0.6721178 -0.6721205 0 0.7404419 0.6721132 0 -0.7404484 0.7404433 0 0.6721188 -0.7643157 0 -0.6448423 -0.6448407 0 0.764317 0.6448423 0 -0.7643157 0.7643151 0 0.644843 -0.7871837 0 -0.6167186 -0.6167217 0 0.7871814 0.6167228 0 -0.7871804 0.7871839 0 0.6167184 -0.8090174 0 -0.5877848 -0.5877894 0 0.809014 0.5877872 0 -0.8090156 0.8090168 0 0.5877855 -0.8854561 0 -0.4647231 -0.4647215 0 0.885457 0.4647215 0 -0.885457 0.8854561 0 0.4647231 -0.9017169 0 -0.4323272 -0.4323301 0 0.9017154 0.4323196 0 -0.9017205 0.9017167 0 0.4323275 -0.9167919 0 -0.3993652 -0.3993587 0 0.9167948 0.3993658 0 -0.9167917 0.9167925 0 0.3993642 -0.8297874 0 -0.5580797 -0.5580772 0 0.8297891 0.5580793 0 -0.8297876 0.8297869 0 0.5580804 -0.8494686 0 -0.5276392 -0.5276403 0 0.8494679 0.5276327 0 -0.8494726 0.8494681 0 0.5276402 -0.8680325 0 -0.4965076 -0.4965061 0 0.8680333 0.4965051 0 -0.8680339 0.8680322 0 0.496508 -0.9648756 0 -0.2627074 -0.2627096 0 0.964875 0.2626995 0 -0.9648777 0.9648755 0 0.2627077 -0.9737625 0 -0.2275669 -0.2275661 0 0.9737627 0.2275667 0 -0.9737626 0.9737626 0 0.2275665 -0.9813702 0 -0.1921268 -0.1921279 0 0.9813699 0.1921283 0 -0.9813699 0.9813703 0 0.1921263 -0.9306632 0 -0.3658773 -0.3658759 0 0.9306637 0.3658779 0 -0.9306629 0.9306635 0 0.3658762 -0.9433116 0 -0.3319083 -0.331901 0 0.9433143 0.3319121 0 -0.9433103 0.943312 0 0.3319075 -0.9547209 0 -0.2975029 -0.2975037 0 0.9547207 0.2975037 0 -0.9547207 0.9547209 0 0.2975029 -0.9876886 0 -0.1564332 -0.1564365 0 0.9876881 0.156435 0 -0.9876882 0.9876882 0 0.156435 -0.9927089 0 -0.1205363 -0.12054 0 0.9927085 0.12054 0 -0.9927085 0.9927089 0 0.1205363 -0.9964253 0 -0.08447899 -0.08448637 0 0.9964247 0.0844761 0 -0.9964256 0.9964252 0 0.08448073 -0.9988323 0 -0.0483136 -0.04831287 0 0.9988323 0.04831786 0 -0.9988321 0.9988323 0 0.04831269 -0.9953316 0 0.09651421 0.09651171 0 0.9953319 -0.09651171 0 -0.9953319 0.9953316 0 -0.09651421 -0.9911799 0 0.1325231 0.1325226 0 0.99118 -0.1325223 0 -0.9911801 0.99118 0 -0.1325227 -0.9857262 0 0.1683562 0.1683565 0 0.9857262 -0.1683617 0 -0.9857253 0.9857262 0 -0.1683567 -0.9999271 0 -0.01208305 -0.01207825 0 0.9999271 0.01208782 0 -0.999927 0.999927 0 0.01208259 -0.9997081 0 0.02416372 0.02416128 0 0.9997081 -0.02416134 0 -0.9997081 0.9997081 0 -0.0241642 -0.9981757 0 0.06037802 0.06038636 0 0.9981751 -0.06037715 0 -0.9981757 0.9981755 0 -0.06037908 -0.9510564 0 0.3090177 0.3090189 0 0.951056 -0.3090225 0 -0.9510548 0.9510565 0 -0.309017 -0.9392326 0 0.3432813 0.3432806 0 0.939233 -0.3432848 0 -0.9392314 0.9392328 0 -0.343281 -0.9261751 0 0.3770936 0.3770962 0 0.9261741 -0.3770902 0 -0.9261767 0.9261745 0 -0.3770954 -0.9789771 0 0.2039704 0.203971 0 0.978977 -0.2039758 0 -0.978976 0.9789771 0 -0.2039704 -0.9709418 0 0.2393158 0.2393156 0 0.9709419 -0.2393156 0 -0.9709419 0.9709418 0 -0.2393158 -0.9616308 0 0.2743473 0.2743445 0 0.9616315 -0.2743473 0 -0.9616307 0.9616311 0 -0.2743459 -0.86197 0 0.5069594 0.506962 0 0.8619684 -0.5069549 0 -0.8619726 0.8619695 0 -0.5069602 -0.8430307 0 0.5378655 0.5378677 0 0.8430293 -0.5378677 0 -0.8430293 0.8430307 0 -0.5378655 -0.8229839 0 0.5680647 0.5680636 0 0.8229846 -0.5680636 0 -0.8229846 0.8229839 0 -0.5680647 -0.9118998 0 0.4104129 0.4104131 0 0.9118997 -0.4104131 0 -0.9118997 0.9118998 0 -0.4104129 -0.8964271 0 0.4431915 0.4431913 0 0.8964272 -0.4431913 0 -0.8964272 0.8964271 0 -0.4431915 -0.8797762 0 0.4753881 0.4753913 0 0.8797746 -0.4753866 0 -0.8797771 0.8797762 0 -0.4753882 -0.8018557 0 0.5975178 0.5975156 0 0.8018572 -0.5975229 0 -0.8018518 0.8018561 0 -0.5975172 -0.7796745 0 0.626185 0.6261864 0 0.7796734 -0.6261855 0 -0.7796741 0.7796751 0 -0.6261842 -0.7564684 0 0.6540304 0.6540323 0 0.7564666 -0.6540275 0 -0.7564709 0.7564688 0 -0.6540298 -0.7322689 0 0.6810156 0.6810158 0 0.7322687 -0.6810146 0 -0.7322698 0.7322687 0 -0.6810158 -0.7071066 0 0.7071071 0.7071044 0 0.7071092 -0.7071056 0 -0.707108 0.7071068 0 -0.7071068 -0.9547209 0 -0.2975033 -0.2975081 0 0.9547194 0.2975037 0 -0.9547207 0.9547209 0 0.2975031 -0.9981756 0 0.06037861 0.0603773 0 0.9981756 -0.06038636 0 -0.9981751 0.9981757 0 -0.06037707 -0.9119 0 0.4104127 0.4104127 0 0.9118999 -0.4104131 0 -0.9118997 0.9118998 0 -0.4104129 -0.7071068 0 0.7071068 0.7071044 0 0.7071092 -0.7071044 0 -0.7071092 0.7071072 0 -0.7071063 0.7071072 0 0.7071063 0.7071044 0 -0.7071092 -0.7071044 0 0.7071092 -0.7071068 0 -0.7071068 0.7871833 0 -0.6167191 -0.6167202 0 -0.7871825 0.6167217 0 0.7871814 -0.7871835 0 0.6167189 0.5173381 0 -0.8557811 -0.8557801 0 -0.5173399 0.8557827 0 0.5173354 -0.517338 0 0.8557811 0.180255 0 -0.9836199 -0.9836185 0 -0.1802633 0.9836193 0 0.1802587 -0.1802549 0 0.9836199 0.9118999 0 0.4104129 0.4104127 0 -0.9118999 -0.4104132 0 0.9118997 -0.9118999 0 -0.4104127 0.9981757 0 0.06037707 0.0603773 0 -0.9981756 -0.06038636 0 0.9981751 -0.9981756 0 -0.0603786 0.9547209 0 -0.2975031 -0.2975081 0 -0.9547193 0.2975037 0 0.9547207 -0.9547208 0 0.2975033 -0.1802546 0 -0.98362 -0.9836185 0 0.1802633 0.9836192 0 -0.1802589 0.180255 0 0.9836199 -0.517338 0 -0.8557811 -0.8557801 0 0.5173399 0.8557827 0 -0.5173354 0.5173381 0 0.8557811 -0.7871835 0 -0.6167189 -0.6167202 0 0.7871825 0.6167217 0 -0.7871814 0.7871833 0 0.6167191</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260_2Shape-binormals-array" count="688" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260_2Shape-map1" name="qt_gauge_tickmarks_260_2Shape-map1">
+ <float_array id="qt_gauge_tickmarks_260_2Shape-map1-array" count="1584">0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260_2Shape-map1-array" count="792" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260_2Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_260_2Shape-textangents-array" count="2376">0.1342342 0 0.9909496 0.1342327 0 0.9909497 0.1342313 0 0.99095 0.1342327 0 0.9909497 0.2225171 0 0.9749286 0.2225194 0 0.9749282 0.2225215 0 0.9749277 0.2225194 0 0.9749282 0.3090191 0 0.9510558 0.3090186 0 0.9510559 0.309018 0 0.9510561 0.3090186 0 0.9510559 0.393025 0 0.9195277 0.3930251 0 0.9195276 0.3930252 0 0.9195276 0.3930251 0 0.9195276 0.473871 0 0.8805942 0.4738698 0 0.8805948 0.4738686 0 0.8805955 0.4738698 0 0.8805948 0.5508948 0 0.8345746 0.5508963 0 0.8345736 0.5508979 0 0.8345726 0.5508963 0 0.8345736 0.6234927 0 0.7818291 0.6234917 0 0.7818299 0.6234907 0 0.7818307 0.6234917 0 0.7818299 0.6910611 0 0.7227963 0.6910616 0 0.7227958 0.6910621 0 0.7227953 0.6910616 0 0.7227958 0.753073 0 0.6579368 0.7530727 0 0.6579373 0.7530723 0 0.6579378 0.7530727 0 0.6579373 0.8090154 0 0.5877874 0.8090153 0 0.5877874 0.8090153 0 0.5877874 0.8090153 0 0.5877874 0.8584507 0 0.5128959 0.8584502 0 0.5128967 0.8584498 0 0.5128974 0.8584502 0 0.5128967 0.9009683 0 0.4338849 0.9009684 0 0.4338845 0.9009686 0 0.4338841 0.9009684 0 0.4338845 0.9362348 0 0.351375 0.9362352 0 0.3513738 0.9362357 0 0.3513726 0.9362352 0 0.3513738 0.9639634 0 0.2660347 0.9639631 0 0.2660357 0.9639629 0 0.2660368 0.9639631 0 0.2660357 0.9839295 0 0.1785573 0.9839295 0 0.178557 0.9839296 0 0.1785568 0.9839295 0 0.178557 0.9959742 0 0.08963908 0.9959742 0 0.08963969 0.9959742 0 0.0896403 0.9959742 0 0.08963969 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9959742 0 -0.08964012 0.995974 0 -0.08964086 0.9959741 0 -0.08964162 0.995974 0 -0.08964086 0.9839295 0 -0.1785574 0.9839295 0 -0.1785572 0.9839295 0 -0.1785569 0.9839295 0 -0.1785572 0.963963 0 -0.2660356 0.9639627 0 -0.2660371 0.9639623 0 -0.2660387 0.9639627 0 -0.2660371 0.9362342 0 -0.3513765 0.9362347 0 -0.3513753 0.9362351 0 -0.3513741 0.9362347 0 -0.3513753 0.9009681 0 -0.4338853 0.9009683 0 -0.4338848 0.9009686 0 -0.4338843 0.9009683 0 -0.4338848 0.85845 0 -0.5128971 0.8584498 0 -0.5128975 0.8584496 0 -0.5128978 0.8584498 0 -0.5128975 0.8090155 0 -0.5877872 0.8090155 0 -0.5877872 0.8090155 0 -0.5877872 0.8090155 0 -0.5877872 0.7530728 0 -0.6579371 0.7530723 0 -0.6579376 0.7530718 0 -0.6579382 0.7530723 0 -0.6579376 0.6910611 0 -0.7227963 0.6910612 0 -0.7227961 0.6910613 0 -0.722796 0.6910612 0 -0.7227961 0.6234915 0 -0.7818301 0.6234908 0 -0.7818305 0.6234903 0 -0.7818311 0.6234908 0 -0.7818305 0.5508941 0 -0.8345751 0.5508956 0 -0.8345742 0.550897 0 -0.8345731 0.5508956 0 -0.8345742 0.4738694 0 -0.8805951 0.4738687 0 -0.8805954 0.473868 0 -0.8805958 0.4738687 0 -0.8805954 0.3930265 0 -0.9195271 0.3930253 0 -0.9195276 0.3930242 0 -0.9195281 0.3930253 0 -0.9195276 0.3090166 0 -0.9510566 0.3090165 0 -0.9510566 0.3090165 0 -0.9510567 0.3090165 0 -0.9510566 0.2225162 0 -0.974929 0.2225188 0 -0.9749283 0.2225215 0 -0.9749277 0.2225188 0 -0.9749283 0.1342352 0 -0.9909495 0.1342339 0 -0.9909496 0.1342325 0 -0.9909498 0.1342339 0 -0.9909496 0.04486358 0 -0.9989931 0.04486508 0 -0.998993 0.04486657 0 -0.9989929 0.04486508 0 -0.998993 -0.04486359 0 -0.9989931 -0.04486507 0 -0.998993 -0.04486656 0 -0.9989929 -0.04486507 0 -0.998993 -0.1342363 0 -0.9909493 -0.1342349 0 -0.9909495 -0.1342335 0 -0.9909497 -0.1342349 0 -0.9909495 -0.2225173 0 -0.9749287 -0.2225199 0 -0.9749281 -0.2225226 0 -0.9749275 -0.2225199 0 -0.9749281 -0.3090174 0 -0.9510564 -0.3090174 0 -0.9510564 -0.3090173 0 -0.9510564 -0.3090174 0 -0.9510564 -0.3930272 0 -0.9195268 -0.3930262 0 -0.9195271 -0.3930253 0 -0.9195276 -0.3930262 0 -0.9195271 -0.4738686 0 -0.8805954 -0.4738677 0 -0.880596 -0.4738667 0 -0.8805965 -0.4738677 0 -0.880596 -0.5508953 0 -0.8345743 -0.5508966 0 -0.8345734 -0.5508979 0 -0.8345726 -0.5508966 0 -0.8345734 -0.6234923 0 -0.7818294 -0.6234914 0 -0.7818301 -0.6234906 0 -0.7818308 -0.6234914 0 -0.7818301 -0.6910605 0 -0.7227968 -0.6910613 0 -0.722796 -0.6910621 0 -0.7227953 -0.6910613 0 -0.722796 -0.6910602 0 0.722797 -0.6910607 0 0.7227967 -0.6910611 0 0.7227963 -0.6910607 0 0.7227967 -0.6234923 0 0.7818294 -0.6234915 0 0.7818301 -0.6234907 0 0.7818307 -0.6234915 0 0.7818301 -0.5508955 0 0.8345742 -0.5508968 0 0.8345733 -0.5508981 0 0.8345724 -0.5508968 0 0.8345733 -0.473868 0 0.8805958 -0.4738672 0 0.8805962 -0.4738665 0 0.8805966 -0.4738672 0 0.8805962 -0.3930265 0 0.9195271 -0.3930254 0 0.9195275 -0.3930244 0 0.9195279 -0.3930254 0 0.9195275 -0.3090165 0 0.9510567 -0.3090164 0 0.9510567 -0.3090163 0 0.9510567 -0.3090164 0 0.9510567 -0.2225163 0 0.9749289 -0.222519 0 0.9749282 -0.2225217 0 0.9749277 -0.222519 0 0.9749282 -0.1342363 0 0.9909493 -0.1342349 0 0.9909495 -0.1342335 0 0.9909497 -0.1342349 0 0.9909495 -0.04486257 0 0.9989931 -0.0448641 0 0.998993 -0.04486562 0 0.998993 -0.0448641 0 0.998993 0.04485732 0 0.9989933 0.0448589 0 0.9989933 0.04486048 0 0.9989932 0.0448589 0 0.9989933 -0.6810158 0 0.7322686 -0.6810152 0 0.7322692 -0.6810145 0 0.7322698 -0.6810152 0 0.7322692 -0.6540323 0 0.7564665 -0.6540299 0 0.7564687 -0.6540274 0 0.7564707 -0.6540299 0 0.7564687 -0.6261863 0 0.7796733 -0.6261859 0 0.7796738 -0.6261854 0 0.7796741 -0.6261859 0 0.7796738 -0.7071044 0 0.7071092 -0.7071049 0 0.7071085 -0.7071055 0 0.7071079 -0.7071049 0 0.7071085 -0.4753912 0 0.8797745 -0.4753889 0 0.8797757 -0.4753866 0 0.879777 -0.4753889 0 0.8797757 -0.4431912 0 0.896427 -0.4431912 0 0.896427 -0.4431912 0 0.896427 -0.4431912 0 0.896427 -0.4104131 0 0.9118996 -0.4104131 0 0.9118996 -0.4104131 0 0.9118996 -0.4104131 0 0.9118996 -0.5975156 0 0.8018572 -0.5975193 0 0.8018545 -0.5975229 0 0.8018517 -0.5975193 0 0.8018545 -0.5680636 0 0.8229846 -0.5680636 0 0.8229846 -0.5680636 0 0.8229846 -0.5680636 0 0.8229846 -0.5378677 0 0.8430292 -0.5378677 0 0.8430292 -0.5378677 0 0.8430292 -0.5378677 0 0.8430292 -0.5069619 0 0.8619683 -0.5069584 0 0.8619704 -0.5069548 0 0.8619725 -0.5069584 0 0.8619704 -0.2743445 0 0.9616314 -0.2743459 0 0.961631 -0.2743473 0 0.9616306 -0.2743459 0 0.961631 -0.2393156 0 0.9709418 -0.2393156 0 0.9709418 -0.2393156 0 0.9709418 -0.2393156 0 0.9709418 -0.203971 0 0.9789769 -0.2039733 0 0.9789763 -0.2039758 0 0.9789759 -0.2039733 0 0.9789763 -0.3770962 0 0.926174 -0.3770932 0 0.9261753 -0.3770901 0 0.9261765 -0.3770932 0 0.9261753 -0.3432806 0 0.9392329 -0.3432827 0 0.9392321 -0.3432848 0 0.9392313 -0.3432827 0 0.9392321 -0.3090189 0 0.9510559 -0.3090207 0 0.9510553 -0.3090225 0 0.9510547 -0.3090207 0 0.9510553 -0.1683565 0 0.9857261 -0.1683591 0 0.9857257 -0.1683617 0 0.9857252 -0.1683591 0 0.9857257 -0.1325226 0 0.9911799 -0.1325224 0 0.9911799 -0.1325223 0 0.99118 -0.1325224 0 0.9911799 -0.0965117 0 0.9953318 -0.0965117 0 0.9953318 -0.0965117 0 0.9953318 -0.0965117 0 0.9953318 0.04831287 0 0.9988322 0.04831536 0 0.9988321 0.04831785 0 0.998832 0.04831536 0 0.9988321 0.08448637 0 0.9964246 0.08448123 0 0.996425 0.08447609 0 0.9964254 0.08448123 0 0.996425 0.12054 0 0.9927084 0.12054 0 0.9927084 0.12054 0 0.9927084 0.12054 0 0.9927084 -0.06038636 0 0.998175 -0.06038175 0 0.9981753 -0.06037715 0 0.9981756 -0.06038175 0 0.9981753 -0.02416128 0 0.9997081 -0.02416131 0 0.9997081 -0.02416134 0 0.9997081 -0.02416131 0 0.9997081 0.01207825 0 0.999927 0.01208303 0 0.999927 0.01208781 0 0.9999269 0.01208303 0 0.999927 0.2627095 0 0.9648749 0.2627045 0 0.9648762 0.2626995 0 0.9648777 0.2627045 0 0.9648762 0.2975037 0 0.9547206 0.2975037 0 0.9547206 0.2975037 0 0.9547206 0.2975037 0 0.9547206 0.3319009 0 0.9433142 0.3319065 0 0.9433122 0.331912 0 0.9433103 0.3319065 0 0.9433122 0.3658758 0 0.9306636 0.3658769 0 0.9306632 0.3658779 0 0.9306628 0.3658769 0 0.9306632 0.1564365 0 0.987688 0.1564357 0 0.9876881 0.156435 0 0.9876882 0.1564357 0 0.9876881 0.1921279 0 0.9813699 0.1921281 0 0.9813698 0.1921283 0 0.9813698 0.1921281 0 0.9813698 0.2275661 0 0.9737626 0.2275664 0 0.9737625 0.2275666 0 0.9737625 0.2275664 0 0.9737625 0.3993587 0 0.9167947 0.3993622 0 0.9167932 0.3993657 0 0.9167916 0.3993622 0 0.9167932 0.4323301 0 0.9017153 0.4323249 0 0.9017179 0.4323196 0 0.9017204 0.4323249 0 0.9017179 0.4647214 0 0.8854569 0.4647214 0 0.8854569 0.4647214 0 0.8854569 0.4647214 0 0.8854569 0.4965061 0 0.8680332 0.4965055 0 0.8680335 0.496505 0 0.8680338 0.4965055 0 0.8680335 0.5276403 0 0.8494678 0.5276365 0 0.8494702 0.5276326 0 0.8494726 0.5276365 0 0.8494702 0.5580771 0 0.829789 0.5580782 0 0.8297883 0.5580792 0 0.8297876 0.5580782 0 0.8297883 0.5877894 0 0.8090139 0.5877882 0 0.8090147 0.5877872 0 0.8090156 0.5877882 0 0.8090147 0.6167216 0 0.7871813 0.6167222 0 0.7871808 0.6167228 0 0.7871803 0.6167222 0 0.7871808 0.6448407 0 0.7643169 0.6448414 0 0.7643162 0.6448423 0 0.7643156 0.6448414 0 0.7643162 0.7485113 0 0.6631219 0.7485114 0 0.6631218 0.7485115 0 0.6631217 0.7485114 0 0.6631218 0.7720518 0 0.6355596 0.7720512 0 0.6355603 0.7720506 0 0.6355609 0.7720512 0 0.6355603 0.7945792 0 0.6071604 0.7945786 0 0.6071611 0.7945781 0 0.6071619 0.7945786 0 0.6071611 0.6721204 0 0.7404418 0.6721168 0 0.7404451 0.6721131 0 0.7404484 0.6721168 0 0.7404451 0.6985102 0 0.7156 0.6985096 0 0.7156006 0.698509 0 0.7156011 0.6985096 0 0.7156006 0.7239901 0 0.6898103 0.7239877 0 0.6898128 0.7239853 0 0.6898152 0.7239877 0 0.6898128 0.8739637 0 0.485991 0.8739637 0 0.485991 0.8739637 0 0.485991 0.8739637 0 0.485991 0.8910096 0 0.4539842 0.891008 0 0.4539875 0.8910063 0 0.4539908 0.891008 0 0.4539875 0.9068726 0 0.4214048 0.9068726 0 0.4214048 0.9068726 0 0.4214048 0.9068726 0 0.4214048 0.816063 0 0.5779628 0.8160619 0 0.5779644 0.8160608 0 0.577966 0.8160619 0 0.5779644 0.8364753 0 0.5480046 0.8364707 0 0.5480115 0.8364662 0 0.5480184 0.8364707 0 0.5480115 0.8557827 0 0.5173353 0.8557813 0 0.5173376 0.8557799 0 0.5173399 0.8557813 0 0.5173376 0.9215478 0 0.3882648 0.9215499 0 0.3882599 0.9215519 0 0.388255 0.9215499 0 0.3882599 0.9350178 0 0.3546007 0.9350169 0 0.3546028 0.9350162 0 0.3546049 0.9350169 0 0.3546028 0.9472528 0 0.3204871 0.9472542 0 0.3204826 0.9472558 0 0.3204782 0.9472542 0 0.3204826 0.9582459 0 0.2859453 0.9582459 0 0.2859453 0.9582459 0 0.2859453 0.9582459 0 0.2859453 0.9895068 0 0.1444863 0.9895059 0 0.1444911 0.9895054 0 0.1444958 0.9895059 0 0.1444911 0.9940938 0 0.1085233 0.9940934 0 0.1085281 0.9940928 0 0.1085328 0.9940934 0 0.1085281 0.9973733 0 0.07243157 0.9973732 0 0.07243394 0.997373 0 0.07243632 0.9973732 0 0.07243394 0.9679803 0 0.2510258 0.9679803 0 0.2510261 0.9679802 0 0.2510263 0.9679803 0 0.2510261 0.9764423 0 0.2157787 0.9764418 0 0.2157808 0.9764413 0 0.2157829 0.9764418 0 0.2157808 0.9836192 0 0.1802587 0.9836196 0 0.1802562 0.9836201 0 0.1802538 0.9836196 0 0.1802562 0.9993431 0 0.03623962 0.9993432 0 0.03623724 0.9993433 0 0.03623485 0.9993432 0 0.03623724 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9993431 0 -0.03623962 0.9993432 0 -0.03623724 0.9993433 0 -0.03623486 0.9993432 0 -0.03623724 0.9836192 0 -0.1802589 0.9836195 0 -0.1802563 0.9836201 0 -0.1802538 0.9836195 0 -0.1802563 0.9764423 0 -0.2157787 0.9764418 0 -0.2157808 0.9764413 0 -0.2157829 0.9764418 0 -0.2157808 0.9679803 0 -0.2510258 0.9679803 0 -0.2510261 0.9679802 0 -0.2510263 0.9679803 0 -0.2510261 0.9973733 0 -0.07243157 0.9973732 0 -0.07243394 0.997373 0 -0.07243632 0.9973732 0 -0.07243394 0.9940938 0 -0.1085234 0.9940934 0 -0.1085282 0.9940928 0 -0.108533 0.9940934 0 -0.1085282 0.9895067 0 -0.1444865 0.9895059 0 -0.1444912 0.9895052 0 -0.144496 0.9895059 0 -0.1444912 0.9215478 0 -0.3882648 0.9215499 0 -0.3882597 0.9215521 0 -0.3882546 0.9215499 0 -0.3882597 0.906873 0 -0.4214039 0.9068728 0 -0.4214043 0.9068726 0 -0.4214048 0.9068728 0 -0.4214043 0.8910096 0 -0.4539842 0.891008 0 -0.4539875 0.8910063 0 -0.4539908 0.891008 0 -0.4539875 0.9582459 0 -0.2859453 0.9582459 0 -0.2859453 0.9582459 0 -0.2859453 0.9582459 0 -0.2859453 0.9472528 0 -0.3204871 0.9472542 0 -0.3204826 0.9472558 0 -0.3204782 0.9472542 0 -0.3204826 0.9350178 0 -0.3546007 0.9350169 0 -0.3546028 0.9350162 0 -0.3546049 0.9350169 0 -0.3546028 0.7945792 0 -0.6071604 0.7945786 0 -0.6071611 0.7945781 0 -0.6071619 0.7945786 0 -0.6071611 0.7720518 0 -0.6355596 0.7720512 0 -0.6355603 0.7720506 0 -0.6355609 0.7720512 0 -0.6355603 0.7485113 0 -0.6631219 0.7485114 0 -0.6631218 0.7485115 0 -0.6631217 0.7485114 0 -0.6631218 0.8739637 0 -0.485991 0.8739637 0 -0.485991 0.8739637 0 -0.485991 0.8739637 0 -0.485991 0.8557827 0 -0.5173353 0.8557813 0 -0.5173376 0.8557799 0 -0.5173399 0.8557813 0 -0.5173376 0.8364753 0 -0.5480046 0.8364707 0 -0.5480115 0.8364662 0 -0.5480184 0.8364707 0 -0.5480115 0.816063 0 -0.5779628 0.8160619 0 -0.5779644 0.8160608 0 -0.577966 0.8160619 0 -0.5779644 0.7239901 0 -0.6898103 0.7239877 0 -0.6898128 0.7239853 0 -0.6898152 0.7239877 0 -0.6898128 0.6985102 0 -0.7156 0.6985096 0 -0.7156006 0.698509 0 -0.7156011 0.6985096 0 -0.7156006 0.6721204 0 -0.7404418 0.6721168 0 -0.7404451 0.6721131 0 -0.7404484 0.6721168 0 -0.7404451 0.6448407 0 -0.7643169 0.6448414 0 -0.7643162 0.6448423 0 -0.7643156 0.6448414 0 -0.7643162 0.6167216 0 -0.7871813 0.6167222 0 -0.7871808 0.6167228 0 -0.7871803 0.6167222 0 -0.7871808 0.5877894 0 -0.8090139 0.5877882 0 -0.8090147 0.5877872 0 -0.8090156 0.5877882 0 -0.8090147 0.4647214 0 -0.8854569 0.4647214 0 -0.8854569 0.4647214 0 -0.8854569 0.4647214 0 -0.8854569 0.4323301 0 -0.9017153 0.4323249 0 -0.9017179 0.4323196 0 -0.9017204 0.4323249 0 -0.9017179 0.3993587 0 -0.9167947 0.3993622 0 -0.9167932 0.3993657 0 -0.9167916 0.3993622 0 -0.9167932 0.5580771 0 -0.829789 0.5580782 0 -0.8297883 0.5580792 0 -0.8297876 0.5580782 0 -0.8297883 0.5276403 0 -0.8494678 0.5276365 0 -0.8494702 0.5276326 0 -0.8494726 0.5276365 0 -0.8494702 0.4965061 0 -0.8680332 0.4965055 0 -0.8680335 0.496505 0 -0.8680338 0.4965055 0 -0.8680335 0.2627095 0 -0.9648749 0.2627045 0 -0.9648762 0.2626995 0 -0.9648777 0.2627045 0 -0.9648762 0.2275661 0 -0.9737626 0.2275664 0 -0.9737625 0.2275666 0 -0.9737625 0.2275664 0 -0.9737625 0.1921279 0 -0.9813699 0.1921281 0 -0.9813698 0.1921283 0 -0.9813698 0.1921281 0 -0.9813698 0.3658758 0 -0.9306636 0.3658769 0 -0.9306632 0.3658779 0 -0.9306628 0.3658769 0 -0.9306632 0.3319009 0 -0.9433142 0.3319065 0 -0.9433122 0.331912 0 -0.9433103 0.3319065 0 -0.9433122 0.2975037 0 -0.9547206 0.2975037 0 -0.9547206 0.2975037 0 -0.9547206 0.2975037 0 -0.9547206 0.1564365 0 -0.987688 0.1564357 0 -0.9876881 0.156435 0 -0.9876882 0.1564357 0 -0.9876881 0.12054 0 -0.9927084 0.12054 0 -0.9927084 0.12054 0 -0.9927084 0.12054 0 -0.9927084 0.08448637 0 -0.9964246 0.08448123 0 -0.996425 0.08447609 0 -0.9964254 0.08448123 0 -0.996425 0.04831287 0 -0.9988322 0.04831536 0 -0.9988321 0.04831785 0 -0.998832 0.04831536 0 -0.9988321 -0.0965117 0 -0.9953318 -0.0965117 0 -0.9953318 -0.0965117 0 -0.9953318 -0.0965117 0 -0.9953318 -0.1325226 0 -0.9911799 -0.1325224 0 -0.9911799 -0.1325223 0 -0.99118 -0.1325224 0 -0.9911799 -0.1683565 0 -0.9857261 -0.1683591 0 -0.9857257 -0.1683617 0 -0.9857252 -0.1683591 0 -0.9857257 0.01207825 0 -0.999927 0.01208303 0 -0.999927 0.01208781 0 -0.9999269 0.01208303 0 -0.999927 -0.02416128 0 -0.9997081 -0.02416131 0 -0.9997081 -0.02416134 0 -0.9997081 -0.02416131 0 -0.9997081 -0.06038636 0 -0.998175 -0.06038175 0 -0.9981753 -0.06037715 0 -0.9981756 -0.06038175 0 -0.9981753 -0.3090189 0 -0.9510559 -0.3090207 0 -0.9510553 -0.3090225 0 -0.9510547 -0.3090207 0 -0.9510553 -0.3432806 0 -0.9392329 -0.3432827 0 -0.9392321 -0.3432848 0 -0.9392313 -0.3432827 0 -0.9392321 -0.3770962 0 -0.926174 -0.3770932 0 -0.9261753 -0.3770901 0 -0.9261765 -0.3770932 0 -0.9261753 -0.203971 0 -0.9789769 -0.2039733 0 -0.9789763 -0.2039758 0 -0.9789759 -0.2039733 0 -0.9789763 -0.2393156 0 -0.9709418 -0.2393156 0 -0.9709418 -0.2393156 0 -0.9709418 -0.2393156 0 -0.9709418 -0.2743445 0 -0.9616314 -0.2743459 0 -0.961631 -0.2743473 0 -0.9616306 -0.2743459 0 -0.961631 -0.5069619 0 -0.8619683 -0.5069584 0 -0.8619704 -0.5069548 0 -0.8619725 -0.5069584 0 -0.8619704 -0.5378677 0 -0.8430292 -0.5378677 0 -0.8430292 -0.5378677 0 -0.8430292 -0.5378677 0 -0.8430292 -0.5680636 0 -0.8229846 -0.5680636 0 -0.8229846 -0.5680636 0 -0.8229846 -0.5680636 0 -0.8229846 -0.4104131 0 -0.9118996 -0.4104131 0 -0.9118996 -0.4104131 0 -0.9118996 -0.4104131 0 -0.9118996 -0.4431912 0 -0.896427 -0.4431912 0 -0.896427 -0.4431912 0 -0.896427 -0.4431912 0 -0.896427 -0.4753912 0 -0.8797745 -0.4753889 0 -0.8797757 -0.4753866 0 -0.879777 -0.4753889 0 -0.8797757 -0.5975156 0 -0.8018572 -0.5975193 0 -0.8018545 -0.5975229 0 -0.8018517 -0.5975193 0 -0.8018545 -0.6261863 0 -0.7796733 -0.6261859 0 -0.7796738 -0.6261854 0 -0.7796741 -0.6261859 0 -0.7796738 -0.6540323 0 -0.7564665 -0.6540299 0 -0.7564687 -0.6540274 0 -0.7564707 -0.6540299 0 -0.7564687 -0.6810158 0 -0.7322686 -0.6810152 0 -0.7322692 -0.6810145 0 -0.7322698 -0.6810152 0 -0.7322692 -0.7071044 0 -0.7071092 -0.7071049 0 -0.7071085 -0.7071055 0 -0.7071079 -0.7071049 0 -0.7071085 0.2975081 0 -0.9547192 0.2975059 0 -0.9547198 0.2975037 0 -0.9547206 0.2975059 0 -0.9547198 -0.06037729 0 -0.9981756 -0.06038182 0 -0.9981752 -0.06038636 0 -0.998175 -0.06038182 0 -0.9981752 -0.4104127 0 -0.9118998 -0.4104129 0 -0.9118997 -0.4104131 0 -0.9118996 -0.4104129 0 -0.9118997 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 0.6167201 0 0.7871824 0.6167209 0 0.7871819 0.6167216 0 0.7871813 0.6167209 0 0.7871819 0.8557799 0 0.5173399 0.8557813 0 0.5173376 0.8557827 0 0.5173353 0.8557813 0 0.5173376 0.9836184 0 0.1802633 0.9836188 0 0.180261 0.9836192 0 0.1802587 0.9836188 0 0.180261 -0.4104127 0 0.9118998 -0.4104129 0 0.9118997 -0.4104131 0 0.9118996 -0.4104129 0 0.9118997 -0.06037729 0 0.9981756 -0.06038182 0 0.9981752 -0.06038636 0 0.998175 -0.06038182 0 0.9981752 0.2975081 0 0.9547192 0.2975059 0 0.9547198 0.2975037 0 0.9547206 0.2975059 0 0.9547198 0.9836184 0 -0.1802633 0.9836187 0 -0.1802611 0.9836192 0 -0.1802589 0.9836187 0 -0.1802611 0.8557799 0 -0.5173399 0.8557813 0 -0.5173376 0.8557827 0 -0.5173353 0.8557813 0 -0.5173376 0.6167201 0 -0.7871824 0.6167209 0 -0.7871819 0.6167216 0 -0.7871813 0.6167209 0 -0.7871819</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260_2Shape-textangents-array" count="792" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_260_2Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_260_2Shape-texbinormals-array" count="2376">0.9909497 0 -0.1342342 0.9909499 0 -0.1342327 0.99095 0 -0.1342313 0.9909499 0 -0.1342327 0.9749289 0 -0.2225172 0.9749283 0 -0.2225194 0.9749278 0 -0.2225215 0.9749284 0 -0.2225194 0.9510559 0 -0.3090192 0.9510561 0 -0.3090186 0.9510562 0 -0.309018 0.951056 0 -0.3090186 0.9195278 0 -0.3930251 0.9195278 0 -0.3930252 0.9195277 0 -0.3930252 0.9195278 0 -0.3930251 0.8805943 0 -0.4738711 0.880595 0 -0.4738699 0.8805957 0 -0.4738687 0.880595 0 -0.4738699 0.8345747 0 -0.5508949 0.8345737 0 -0.5508964 0.8345726 0 -0.550898 0.8345736 0 -0.5508964 0.7818292 0 -0.6234927 0.78183 0 -0.6234917 0.7818307 0 -0.6234908 0.78183 0 -0.6234918 0.7227964 0 -0.6910612 0.7227959 0 -0.6910617 0.7227954 0 -0.6910622 0.7227958 0 -0.6910616 0.6579369 0 -0.7530732 0.6579373 0 -0.7530727 0.6579378 0 -0.7530723 0.6579374 0 -0.7530727 0.5877874 0 -0.8090155 0.5877874 0 -0.8090155 0.5877875 0 -0.8090154 0.5877874 0 -0.8090154 0.512896 0 -0.8584508 0.5128967 0 -0.8584504 0.5128974 0 -0.8584499 0.5128967 0 -0.8584504 0.4338849 0 -0.9009684 0.4338845 0 -0.9009686 0.4338841 0 -0.9009688 0.4338845 0 -0.9009685 0.3513751 0 -0.9362349 0.3513738 0 -0.9362353 0.3513726 0 -0.9362357 0.3513739 0 -0.9362354 0.2660347 0 -0.9639634 0.2660357 0 -0.9639632 0.2660368 0 -0.9639629 0.2660357 0 -0.9639633 0.1785573 0 -0.9839296 0.178557 0 -0.9839296 0.1785568 0 -0.9839296 0.178557 0 -0.9839296 0.08963909 0 -0.9959744 0.08963969 0 -0.9959743 0.0896403 0 -0.9959742 0.08963969 0 -0.9959742 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.08964012 0 -0.9959742 -0.08964087 0 -0.9959742 -0.08964163 0 -0.9959742 -0.08964087 0 -0.9959742 -0.1785574 0 -0.9839296 -0.1785572 0 -0.9839296 -0.1785569 0 -0.9839297 -0.1785572 0 -0.9839296 -0.2660357 0 -0.9639633 -0.2660372 0 -0.9639629 -0.2660387 0 -0.9639624 -0.2660372 0 -0.9639629 -0.3513765 0 -0.9362342 -0.3513753 0 -0.9362348 -0.3513741 0 -0.9362351 -0.3513753 0 -0.9362348 -0.4338853 0 -0.9009682 -0.4338848 0 -0.9009684 -0.4338843 0 -0.9009687 -0.4338848 0 -0.9009684 -0.5128972 0 -0.8584501 -0.5128976 0 -0.8584499 -0.5128978 0 -0.8584498 -0.5128976 0 -0.8584499 -0.5877872 0 -0.8090156 -0.5877872 0 -0.8090156 -0.5877873 0 -0.8090156 -0.5877873 0 -0.8090156 -0.6579372 0 -0.7530729 -0.6579378 0 -0.7530724 -0.6579383 0 -0.7530718 -0.6579378 0 -0.7530724 -0.7227964 0 -0.6910612 -0.7227963 0 -0.6910613 -0.7227961 0 -0.6910614 -0.7227963 0 -0.6910613 -0.7818303 0 -0.6234915 -0.7818307 0 -0.6234909 -0.7818311 0 -0.6234903 -0.7818306 0 -0.6234909 -0.8345752 0 -0.5508941 -0.8345743 0 -0.5508956 -0.8345732 0 -0.5508971 -0.8345742 0 -0.5508956 -0.8805952 0 -0.4738694 -0.8805955 0 -0.4738687 -0.880596 0 -0.4738681 -0.8805956 0 -0.4738688 -0.9195272 0 -0.3930265 -0.9195277 0 -0.3930254 -0.9195282 0 -0.3930242 -0.9195276 0 -0.3930254 -0.9510567 0 -0.3090166 -0.9510567 0 -0.3090166 -0.9510567 0 -0.3090165 -0.9510568 0 -0.3090166 -0.9749291 0 -0.2225162 -0.9749284 0 -0.2225189 -0.9749278 0 -0.2225215 -0.9749284 0 -0.2225189 -0.9909495 0 -0.1342352 -0.9909497 0 -0.1342339 -0.9909499 0 -0.1342325 -0.9909497 0 -0.1342339 -0.9989932 0 -0.04486359 -0.9989931 0 -0.04486508 -0.998993 0 -0.04486657 -0.9989931 0 -0.04486508 -0.9989932 0 0.04486359 -0.9989932 0 0.04486508 -0.998993 0 0.04486656 -0.9989931 0 0.04486507 -0.9909495 0 0.1342363 -0.9909496 0 0.1342349 -0.9909497 0 0.1342335 -0.9909496 0 0.1342349 -0.9749287 0 0.2225173 -0.9749282 0 0.2225199 -0.9749276 0 0.2225226 -0.9749281 0 0.2225199 -0.9510565 0 0.3090174 -0.9510564 0 0.3090174 -0.9510564 0 0.3090173 -0.9510564 0 0.3090174 -0.9195269 0 0.3930272 -0.9195274 0 0.3930263 -0.9195276 0 0.3930254 -0.9195273 0 0.3930263 -0.8805956 0 0.4738687 -0.8805962 0 0.4738677 -0.8805967 0 0.4738668 -0.8805961 0 0.4738677 -0.8345744 0 0.5508953 -0.8345736 0 0.5508966 -0.8345726 0 0.550898 -0.8345735 0 0.5508966 -0.7818295 0 0.6234924 -0.7818302 0 0.6234915 -0.7818309 0 0.6234906 -0.7818303 0 0.6234915 -0.7227969 0 0.6910606 -0.7227961 0 0.6910614 -0.7227954 0 0.6910622 -0.7227961 0 0.6910614 0.7227971 0 0.6910603 0.7227967 0 0.6910607 0.7227963 0 0.6910611 0.7227968 0 0.6910608 0.7818295 0 0.6234924 0.7818302 0 0.6234916 0.7818308 0 0.6234908 0.7818302 0 0.6234916 0.8345742 0 0.5508955 0.8345734 0 0.5508969 0.8345725 0 0.5508982 0.8345734 0 0.5508969 0.8805959 0 0.473868 0.8805964 0 0.4738673 0.8805967 0 0.4738665 0.8805963 0 0.4738673 0.9195272 0 0.3930265 0.9195276 0 0.3930255 0.9195281 0 0.3930244 0.9195276 0 0.3930255 0.9510568 0 0.3090165 0.9510568 0 0.3090164 0.9510568 0 0.3090163 0.9510568 0 0.3090164 0.974929 0 0.2225163 0.9749284 0 0.2225191 0.9749277 0 0.2225217 0.9749284 0 0.222519 0.9909495 0 0.1342363 0.9909496 0 0.1342349 0.9909498 0 0.1342335 0.9909496 0 0.1342349 0.9989932 0 0.04486257 0.9989932 0 0.0448641 0.998993 0 0.04486562 0.9989932 0 0.0448641 0.9989934 0 -0.04485732 0.9989934 0 -0.0448589 0.9989933 0 -0.04486049 0.9989933 0 -0.0448589 0.7322688 0 0.6810159 0.7322692 0 0.6810152 0.7322698 0 0.6810146 0.7322692 0 0.6810152 0.7564666 0 0.6540323 0.7564688 0 0.65403 0.7564709 0 0.6540275 0.7564687 0 0.6540299 0.7796735 0 0.6261864 0.7796739 0 0.626186 0.7796742 0 0.6261855 0.7796739 0 0.626186 0.7071092 0 0.7071044 0.7071086 0 0.707105 0.707108 0 0.7071056 0.7071086 0 0.707105 0.8797746 0 0.4753913 0.8797758 0 0.475389 0.8797771 0 0.4753866 0.8797758 0 0.475389 0.8964272 0 0.4431913 0.8964272 0 0.4431913 0.8964272 0 0.4431913 0.8964272 0 0.4431913 0.9118997 0 0.4104132 0.9118997 0 0.4104131 0.9118997 0 0.4104132 0.9118997 0 0.4104131 0.8018573 0 0.5975156 0.8018546 0 0.5975193 0.8018518 0 0.5975229 0.8018546 0 0.5975193 0.8229847 0 0.5680636 0.8229847 0 0.5680636 0.8229847 0 0.5680636 0.8229847 0 0.5680636 0.8430293 0 0.5378677 0.8430293 0 0.5378677 0.8430293 0 0.5378677 0.8430293 0 0.5378677 0.8619685 0 0.506962 0.8619705 0 0.5069585 0.8619726 0 0.5069549 0.8619705 0 0.5069584 0.9616315 0 0.2743445 0.9616312 0 0.2743459 0.9616307 0 0.2743473 0.9616312 0 0.2743459 0.9709419 0 0.2393156 0.9709418 0 0.2393156 0.9709419 0 0.2393156 0.9709418 0 0.2393156 0.978977 0 0.203971 0.9789765 0 0.2039734 0.978976 0 0.2039758 0.9789765 0 0.2039734 0.9261742 0 0.3770963 0.9261754 0 0.3770932 0.9261766 0 0.3770902 0.9261754 0 0.3770932 0.939233 0 0.3432806 0.9392322 0 0.3432827 0.9392315 0 0.3432848 0.9392322 0 0.3432827 0.951056 0 0.3090189 0.9510554 0 0.3090207 0.9510548 0 0.3090225 0.9510554 0 0.3090207 0.9857262 0 0.1683565 0.9857258 0 0.1683591 0.9857253 0 0.1683617 0.9857258 0 0.1683591 0.9911801 0 0.1325226 0.9911801 0 0.1325224 0.9911801 0 0.1325223 0.99118 0 0.1325224 0.9953319 0 0.09651171 0.9953319 0 0.09651171 0.9953319 0 0.09651171 0.9953319 0 0.09651171 0.9988323 0 -0.04831287 0.9988322 0 -0.04831536 0.9988321 0 -0.04831786 0.9988322 0 -0.04831536 0.9964247 0 -0.08448638 0.9964251 0 -0.08448123 0.9964255 0 -0.08447609 0.9964252 0 -0.08448124 0.9927085 0 -0.12054 0.9927086 0 -0.12054 0.9927085 0 -0.12054 0.9927086 0 -0.12054 0.9981751 0 0.06038637 0.9981754 0 0.06038176 0.9981757 0 0.06037715 0.9981754 0 0.06038176 0.9997081 0 0.02416128 0.9997081 0 0.02416131 0.9997081 0 0.02416134 0.9997082 0 0.02416131 0.9999271 0 -0.01207825 0.999927 0 -0.01208303 0.999927 0 -0.01208782 0.999927 0 -0.01208303 0.964875 0 -0.2627096 0.9648764 0 -0.2627045 0.9648777 0 -0.2626995 0.9648764 0 -0.2627045 0.9547207 0 -0.2975037 0.9547207 0 -0.2975037 0.9547207 0 -0.2975037 0.9547207 0 -0.2975037 0.9433143 0 -0.3319009 0.9433123 0 -0.3319065 0.9433104 0 -0.3319121 0.9433123 0 -0.3319065 0.9306637 0 -0.3658759 0.9306633 0 -0.3658769 0.9306629 0 -0.3658779 0.9306633 0 -0.3658769 0.9876881 0 -0.1564365 0.9876882 0 -0.1564358 0.9876884 0 -0.156435 0.9876882 0 -0.1564358 0.9813699 0 -0.1921279 0.9813699 0 -0.1921281 0.9813699 0 -0.1921283 0.9813699 0 -0.1921281 0.9737626 0 -0.2275661 0.9737626 0 -0.2275664 0.9737626 0 -0.2275667 0.9737626 0 -0.2275664 0.9167948 0 -0.3993587 0.9167933 0 -0.3993622 0.9167918 0 -0.3993658 0.9167933 0 -0.3993622 0.9017155 0 -0.4323302 0.901718 0 -0.4323249 0.9017205 0 -0.4323196 0.901718 0 -0.4323249 0.885457 0 -0.4647214 0.885457 0 -0.4647214 0.885457 0 -0.4647214 0.885457 0 -0.4647214 0.8680333 0 -0.4965061 0.8680336 0 -0.4965056 0.8680339 0 -0.4965051 0.8680336 0 -0.4965056 0.8494679 0 -0.5276403 0.8494703 0 -0.5276365 0.8494726 0 -0.5276327 0.8494703 0 -0.5276365 0.8297891 0 -0.5580771 0.8297884 0 -0.5580782 0.8297877 0 -0.5580793 0.8297884 0 -0.5580782 0.809014 0 -0.5877894 0.8090148 0 -0.5877883 0.8090157 0 -0.5877872 0.8090149 0 -0.5877883 0.7871814 0 -0.6167217 0.7871809 0 -0.6167222 0.7871804 0 -0.6167228 0.7871809 0 -0.6167222 0.764317 0 -0.6448407 0.7643163 0 -0.6448416 0.7643157 0 -0.6448424 0.7643164 0 -0.6448416 0.663122 0 -0.7485114 0.6631219 0 -0.7485115 0.6631218 0 -0.7485116 0.6631219 0 -0.7485115 0.6355596 0 -0.7720519 0.6355603 0 -0.7720513 0.635561 0 -0.7720507 0.6355603 0 -0.7720513 0.6071604 0 -0.7945793 0.6071612 0 -0.7945787 0.6071619 0 -0.7945782 0.6071612 0 -0.7945787 0.7404419 0 -0.6721205 0.7404451 0 -0.6721168 0.7404485 0 -0.6721132 0.7404452 0 -0.6721169 0.7156001 0 -0.6985103 0.7156007 0 -0.6985097 0.7156013 0 -0.6985091 0.7156006 0 -0.6985096 0.6898103 0 -0.7239901 0.6898128 0 -0.7239878 0.6898153 0 -0.7239854 0.6898129 0 -0.7239878 0.4859911 0 -0.8739638 0.4859911 0 -0.8739638 0.4859911 0 -0.8739638 0.4859911 0 -0.8739638 0.4539843 0 -0.8910097 0.4539876 0 -0.8910081 0.4539909 0 -0.8910064 0.4539876 0 -0.8910081 0.4214048 0 -0.9068727 0.4214048 0 -0.9068727 0.4214048 0 -0.9068727 0.4214048 0 -0.9068727 0.5779628 0 -0.8160632 0.5779644 0 -0.816062 0.577966 0 -0.8160608 0.5779644 0 -0.816062 0.5480046 0 -0.8364754 0.5480115 0 -0.8364708 0.5480185 0 -0.8364663 0.5480115 0 -0.8364708 0.5173354 0 -0.8557828 0.5173377 0 -0.8557814 0.5173399 0 -0.85578 0.5173377 0 -0.8557814 0.3882649 0 -0.9215479 0.3882599 0 -0.9215499 0.3882551 0 -0.9215521 0.3882599 0 -0.9215499 0.3546007 0 -0.9350178 0.3546028 0 -0.935017 0.3546049 0 -0.9350163 0.3546029 0 -0.9350171 0.3204871 0 -0.9472529 0.3204827 0 -0.9472545 0.3204782 0 -0.947256 0.3204827 0 -0.9472544 0.2859453 0 -0.958246 0.2859453 0 -0.958246 0.2859453 0 -0.958246 0.2859453 0 -0.958246 0.1444864 0 -0.9895069 0.1444911 0 -0.9895062 0.1444958 0 -0.9895055 0.1444911 0 -0.9895061 0.1085234 0 -0.994094 0.1085281 0 -0.9940934 0.1085328 0 -0.9940929 0.1085281 0 -0.9940935 0.07243157 0 -0.9973734 0.07243394 0 -0.9973732 0.07243632 0 -0.997373 0.07243395 0 -0.9973733 0.2510258 0 -0.9679805 0.2510261 0 -0.9679803 0.2510264 0 -0.9679803 0.2510261 0 -0.9679804 0.2157787 0 -0.9764424 0.2157808 0 -0.9764419 0.215783 0 -0.9764414 0.2157808 0 -0.9764419 0.1802587 0 -0.9836193 0.1802562 0 -0.9836197 0.1802539 0 -0.9836202 0.1802563 0 -0.9836197 0.03623962 0 -0.9993432 0.03623724 0 -0.9993433 0.03623485 0 -0.9993433 0.03623724 0 -0.9993433 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.03623962 0 -0.9993432 -0.03623724 0 -0.9993433 -0.03623487 0 -0.9993434 -0.03623724 0 -0.9993433 -0.1802589 0 -0.9836193 -0.1802564 0 -0.9836197 -0.1802539 0 -0.9836202 -0.1802564 0 -0.9836197 -0.2157787 0 -0.9764423 -0.2157808 0 -0.9764419 -0.215783 0 -0.9764414 -0.2157808 0 -0.9764419 -0.2510258 0 -0.9679805 -0.2510261 0 -0.9679803 -0.2510264 0 -0.9679803 -0.2510261 0 -0.9679804 -0.07243158 0 -0.9973735 -0.07243395 0 -0.9973733 -0.07243633 0 -0.9973731 -0.07243394 0 -0.9973732 -0.1085234 0 -0.9940939 -0.1085282 0 -0.9940935 -0.108533 0 -0.9940929 -0.1085282 0 -0.9940935 -0.1444865 0 -0.9895068 -0.1444912 0 -0.9895061 -0.144496 0 -0.9895054 -0.1444912 0 -0.9895061 -0.3882649 0 -0.9215479 -0.3882597 0 -0.92155 -0.3882547 0 -0.9215522 -0.3882597 0 -0.92155 -0.4214039 0 -0.9068732 -0.4214044 0 -0.9068729 -0.4214048 0 -0.9068727 -0.4214044 0 -0.9068729 -0.4539843 0 -0.8910097 -0.4539876 0 -0.8910081 -0.4539909 0 -0.8910064 -0.4539876 0 -0.8910081 -0.2859453 0 -0.958246 -0.2859453 0 -0.9582461 -0.2859453 0 -0.958246 -0.2859453 0 -0.9582461 -0.3204871 0 -0.9472529 -0.3204827 0 -0.9472544 -0.3204782 0 -0.9472559 -0.3204827 0 -0.9472544 -0.3546007 0 -0.9350178 -0.3546028 0 -0.935017 -0.3546049 0 -0.9350163 -0.3546028 0 -0.935017 -0.6071604 0 -0.7945793 -0.6071612 0 -0.7945787 -0.6071619 0 -0.7945782 -0.6071612 0 -0.7945787 -0.6355596 0 -0.7720519 -0.6355604 0 -0.7720513 -0.635561 0 -0.7720507 -0.6355603 0 -0.7720513 -0.6631219 0 -0.7485114 -0.6631219 0 -0.7485115 -0.6631218 0 -0.7485116 -0.6631219 0 -0.7485115 -0.4859911 0 -0.8739638 -0.4859911 0 -0.8739638 -0.4859911 0 -0.8739638 -0.4859911 0 -0.8739638 -0.5173354 0 -0.8557828 -0.5173377 0 -0.8557814 -0.5173399 0 -0.85578 -0.5173377 0 -0.8557814 -0.5480046 0 -0.8364754 -0.5480115 0 -0.8364708 -0.5480185 0 -0.8364663 -0.5480115 0 -0.8364708 -0.5779628 0 -0.8160632 -0.5779644 0 -0.816062 -0.577966 0 -0.8160609 -0.5779644 0 -0.816062 -0.6898103 0 -0.7239901 -0.6898128 0 -0.7239878 -0.6898153 0 -0.7239854 -0.6898128 0 -0.7239878 -0.7156001 0 -0.6985102 -0.7156007 0 -0.6985097 -0.7156013 0 -0.6985091 -0.7156007 0 -0.6985097 -0.7404419 0 -0.6721205 -0.7404451 0 -0.6721168 -0.7404485 0 -0.6721132 -0.7404452 0 -0.6721169 -0.764317 0 -0.6448408 -0.7643163 0 -0.6448416 -0.7643157 0 -0.6448423 -0.7643163 0 -0.6448416 -0.7871813 0 -0.6167216 -0.7871809 0 -0.6167222 -0.7871804 0 -0.6167228 -0.7871809 0 -0.6167222 -0.809014 0 -0.5877894 -0.8090149 0 -0.5877883 -0.8090157 0 -0.5877872 -0.8090149 0 -0.5877883 -0.885457 0 -0.4647214 -0.885457 0 -0.4647215 -0.885457 0 -0.4647214 -0.885457 0 -0.4647215 -0.9017155 0 -0.4323302 -0.901718 0 -0.4323249 -0.9017205 0 -0.4323196 -0.901718 0 -0.4323249 -0.9167948 0 -0.3993587 -0.9167933 0 -0.3993622 -0.9167918 0 -0.3993658 -0.9167933 0 -0.3993622 -0.8297891 0 -0.5580771 -0.8297884 0 -0.5580782 -0.8297877 0 -0.5580793 -0.8297884 0 -0.5580782 -0.8494679 0 -0.5276403 -0.8494703 0 -0.5276365 -0.8494727 0 -0.5276327 -0.8494703 0 -0.5276365 -0.8680333 0 -0.4965061 -0.8680336 0 -0.4965056 -0.8680339 0 -0.4965051 -0.8680336 0 -0.4965056 -0.964875 0 -0.2627096 -0.9648764 0 -0.2627045 -0.9648778 0 -0.2626995 -0.9648764 0 -0.2627045 -0.9737627 0 -0.2275661 -0.9737626 0 -0.2275664 -0.9737626 0 -0.2275667 -0.9737626 0 -0.2275664 -0.98137 0 -0.1921279 -0.9813699 0 -0.1921281 -0.9813699 0 -0.1921283 -0.9813699 0 -0.1921281 -0.9306638 0 -0.3658759 -0.9306633 0 -0.3658769 -0.9306629 0 -0.3658779 -0.9306633 0 -0.3658769 -0.9433143 0 -0.331901 -0.9433123 0 -0.3319065 -0.9433104 0 -0.3319121 -0.9433123 0 -0.3319065 -0.9547207 0 -0.2975037 -0.9547207 0 -0.2975037 -0.9547207 0 -0.2975037 -0.9547207 0 -0.2975037 -0.9876881 0 -0.1564365 -0.9876882 0 -0.1564358 -0.9876883 0 -0.156435 -0.9876882 0 -0.1564358 -0.9927086 0 -0.12054 -0.9927085 0 -0.12054 -0.9927086 0 -0.12054 -0.9927085 0 -0.12054 -0.9964247 0 -0.08448638 -0.9964251 0 -0.08448123 -0.9964256 0 -0.0844761 -0.9964251 0 -0.08448123 -0.9988323 0 -0.04831287 -0.9988322 0 -0.04831536 -0.9988321 0 -0.04831786 -0.9988322 0 -0.04831537 -0.9953319 0 0.09651171 -0.9953319 0 0.09651171 -0.9953319 0 0.09651171 -0.9953319 0 0.09651171 -0.9911801 0 0.1325226 -0.9911801 0 0.1325224 -0.9911801 0 0.1325223 -0.99118 0 0.1325224 -0.9857262 0 0.1683565 -0.9857258 0 0.1683591 -0.9857253 0 0.1683617 -0.9857258 0 0.1683591 -0.9999271 0 -0.01207825 -0.999927 0 -0.01208303 -0.999927 0 -0.01208782 -0.9999271 0 -0.01208303 -0.9997081 0 0.02416128 -0.9997081 0 0.02416131 -0.9997081 0 0.02416134 -0.9997081 0 0.02416131 -0.9981751 0 0.06038637 -0.9981754 0 0.06038176 -0.9981757 0 0.06037715 -0.9981754 0 0.06038176 -0.9510559 0 0.3090189 -0.9510554 0 0.3090207 -0.9510548 0 0.3090225 -0.9510554 0 0.3090207 -0.939233 0 0.3432806 -0.9392322 0 0.3432827 -0.9392314 0 0.3432848 -0.9392322 0 0.3432827 -0.9261742 0 0.3770963 -0.9261754 0 0.3770932 -0.9261766 0 0.3770902 -0.9261754 0 0.3770932 -0.978977 0 0.203971 -0.9789765 0 0.2039734 -0.978976 0 0.2039758 -0.9789765 0 0.2039734 -0.9709419 0 0.2393156 -0.9709418 0 0.2393156 -0.9709419 0 0.2393156 -0.9709418 0 0.2393156 -0.9616315 0 0.2743445 -0.9616312 0 0.2743459 -0.9616308 0 0.2743473 -0.9616312 0 0.2743459 -0.8619685 0 0.506962 -0.8619705 0 0.5069585 -0.8619726 0 0.5069549 -0.8619705 0 0.5069585 -0.8430293 0 0.5378677 -0.8430293 0 0.5378677 -0.8430293 0 0.5378677 -0.8430293 0 0.5378677 -0.8229847 0 0.5680636 -0.8229847 0 0.5680636 -0.8229847 0 0.5680636 -0.8229847 0 0.5680636 -0.9118997 0 0.4104132 -0.9118997 0 0.4104132 -0.9118997 0 0.4104132 -0.9118997 0 0.4104132 -0.8964272 0 0.4431913 -0.8964271 0 0.4431913 -0.8964272 0 0.4431913 -0.8964271 0 0.4431913 -0.8797746 0 0.4753913 -0.8797758 0 0.4753889 -0.8797771 0 0.4753866 -0.8797758 0 0.4753889 -0.8018573 0 0.5975156 -0.8018546 0 0.5975193 -0.8018519 0 0.5975229 -0.8018546 0 0.5975193 -0.7796735 0 0.6261864 -0.7796739 0 0.626186 -0.7796742 0 0.6261855 -0.7796739 0 0.626186 -0.7564666 0 0.6540324 -0.7564687 0 0.6540299 -0.7564709 0 0.6540275 -0.7564687 0 0.6540299 -0.7322687 0 0.6810158 -0.7322692 0 0.6810152 -0.7322699 0 0.6810147 -0.7322693 0 0.6810153 -0.7071092 0 0.7071044 -0.7071086 0 0.707105 -0.707108 0 0.7071056 -0.7071086 0 0.707105 -0.9547193 0 -0.2975081 -0.95472 0 -0.2975059 -0.9547207 0 -0.2975037 -0.9547201 0 -0.2975059 -0.9981756 0 0.0603773 -0.9981754 0 0.06038183 -0.9981751 0 0.06038637 -0.9981754 0 0.06038183 -0.9119 0 0.4104127 -0.9118999 0 0.4104129 -0.9118997 0 0.4104131 -0.9118999 0 0.4104129 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7871825 0 -0.6167202 0.7871819 0 -0.6167209 0.7871813 0 -0.6167216 0.7871819 0 -0.6167209 0.5173399 0 -0.85578 0.5173377 0 -0.8557814 0.5173354 0 -0.8557828 0.5173377 0 -0.8557814 0.1802633 0 -0.9836185 0.180261 0 -0.9836189 0.1802587 0 -0.9836193 0.180261 0 -0.9836189 0.9119 0 0.4104127 0.9118998 0 0.4104129 0.9118997 0 0.4104132 0.9118998 0 0.4104129 0.9981757 0 0.0603773 0.9981754 0 0.06038183 0.9981751 0 0.06038637 0.9981754 0 0.06038183 0.9547193 0 -0.2975081 0.9547201 0 -0.2975059 0.9547207 0 -0.2975037 0.9547201 0 -0.2975059 -0.1802633 0 -0.9836185 -0.1802611 0 -0.9836189 -0.1802589 0 -0.9836193 -0.1802611 0 -0.9836189 -0.5173399 0 -0.8557801 -0.5173377 0 -0.8557814 -0.5173354 0 -0.8557828 -0.5173377 0 -0.8557814 -0.7871825 0 -0.6167202 -0.787182 0 -0.616721 -0.7871813 0 -0.6167216 -0.7871819 0 -0.6167209</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_260_2Shape-texbinormals-array" count="792" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_260_2Shape-vertices" name="qt_gauge_tickmarks_260_2Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_260_2Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_260_2Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_260_2Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_260_2Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="396">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_260_2Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_260_2Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_260_2Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_260_2Shape-texbinormals" offset="2" set="0"/>
+ <p>1 0 0 0 1 1 55 3 3 55 3 3 0 1 1 54 2 2 2 4 4 1 5 5 56 7 7 56 7 7 1 5 5 55 6 6 3 8 8 2 9 9 57 11 11 57 11 11 2 9 9 56 10 10 4 12 12 3 13 13 58 15 15 58 15 15 3 13 13 57 14 14 5 16 16 4 17 17 59 19 19 59 19 19 4 17 17 58 18 18 6 20 20 5 21 21 60 23 23 60 23 23 5 21 21 59 22 22 7 24 24 6 25 25 61 27 27 61 27 27 6 25 25 60 26 26 8 28 28 7 29 29 62 31 31 62 31 31 7 29 29 61 30 30 9 32 32 8 33 33 63 35 35 63 35 35 8 33 33 62 34 34 10 36 36 9 37 37 64 39 39 64 39 39 9 37 37 63 38 38 11 40 40 10 41 41 65 43 43 65 43 43 10 41 41 64 42 42 12 44 44 11 45 45 66 47 47 66 47 47 11 45 45 65 46 46 13 48 48 12 49 49 67 51 51 67 51 51 12 49 49 66 50 50 14 52 52 13 53 53 68 55 55 68 55 55 13 53 53 67 54 54 15 56 56 14 57 57 69 59 59 69 59 59 14 57 57 68 58 58 16 60 60 15 61 61 70 63 63 70 63 63 15 61 61 69 62 62 17 64 64 16 65 65 71 67 67 71 67 67 16 65 65 70 66 66 18 68 68 17 69 69 72 71 71 72 71 71 17 69 69 71 70 70 19 72 72 18 73 73 73 75 75 73 75 75 18 73 73 72 74 74 20 76 76 19 77 77 74 79 79 74 79 79 19 77 77 73 78 78 21 80 80 20 81 81 75 83 83 75 83 83 20 81 81 74 82 82 22 84 84 21 85 85 76 87 87 76 87 87 21 85 85 75 86 86 23 88 88 22 89 89 77 91 91 77 91 91 22 89 89 76 90 90 24 92 92 23 93 93 78 95 95 78 95 95 23 93 93 77 94 94 25 96 96 24 97 97 79 99 99 79 99 99 24 97 97 78 98 98 26 100 100 25 101 101 80 103 103 80 103 103 25 101 101 79 102 102 27 104 104 26 105 105 81 107 107 81 107 107 26 105 105 80 106 106 28 108 108 27 109 109 82 111 111 82 111 111 27 109 109 81 110 110 29 112 112 28 113 113 83 115 115 83 115 115 28 113 113 82 114 114 30 116 116 29 117 117 84 119 119 84 119 119 29 117 117 83 118 118 31 120 120 30 121 121 85 123 123 85 123 123 30 121 121 84 122 122 32 124 124 31 125 125 86 127 127 86 127 127 31 125 125 85 126 126 33 128 128 32 129 129 87 131 131 87 131 131 32 129 129 86 130 130 34 132 132 33 133 133 88 135 135 88 135 135 33 133 133 87 134 134 35 136 136 34 137 137 89 139 139 89 139 139 34 137 137 88 138 138 36 140 140 35 141 141 90 143 143 90 143 143 35 141 141 89 142 142 37 144 144 36 145 145 91 147 147 91 147 147 36 145 145 90 146 146 38 148 148 37 149 149 92 151 151 92 151 151 37 149 149 91 150 150 39 152 152 38 153 153 93 155 155 93 155 155 38 153 153 92 154 154 40 156 156 39 157 157 94 159 159 94 159 159 39 157 157 93 158 158 41 160 160 40 161 161 95 163 163 95 163 163 40 161 161 94 162 162 42 164 164 41 165 165 96 167 167 96 167 167 41 165 165 95 166 166 43 168 168 42 169 169 97 171 171 97 171 171 42 169 169 96 170 170 45 172 172 44 173 173 99 175 175 99 175 175 44 173 173 98 174 174 46 176 176 45 177 177 100 179 179 100 179 179 45 177 177 99 178 178 47 180 180 46 181 181 101 183 183 101 183 183 46 181 181 100 182 182 48 184 184 47 185 185 102 187 187 102 187 187 47 185 185 101 186 186 49 188 188 48 189 189 103 191 191 103 191 191 48 189 189 102 190 190 50 192 192 49 193 193 104 195 195 104 195 195 49 193 193 103 194 194 51 196 196 50 197 197 105 199 199 105 199 199 50 197 197 104 198 198 52 200 200 51 201 201 106 203 203 106 203 203 51 201 201 105 202 202 53 204 204 52 205 205 107 207 207 107 207 207 52 205 205 106 206 206 0 208 208 53 209 209 54 211 211 54 211 211 53 209 209 107 210 210 108 212 212 109 213 213 110 215 215 110 215 215 109 213 213 111 214 214 112 216 216 113 217 217 114 219 219 114 219 219 113 217 217 115 218 218 116 220 220 117 221 221 118 223 223 118 223 223 117 221 221 119 222 222 120 224 224 121 225 225 122 227 227 122 227 227 121 225 225 123 226 226 124 228 228 125 229 229 126 231 231 126 231 231 125 229 229 127 230 230 128 232 232 129 233 233 130 235 235 130 235 235 129 233 233 131 234 234 132 236 236 133 237 237 134 239 239 134 239 239 133 237 237 135 238 238 136 240 240 137 241 241 138 243 243 138 243 243 137 241 241 139 242 242 140 244 244 141 245 245 142 247 247 142 247 247 141 245 245 143 246 246 144 248 248 145 249 249 146 251 251 146 251 251 145 249 249 147 250 250 148 252 252 149 253 253 150 255 255 150 255 255 149 253 253 151 254 254 152 256 256 153 257 257 154 259 259 154 259 259 153 257 257 155 258 258 156 260 260 157 261 261 158 263 263 158 263 263 157 261 261 159 262 262 160 264 264 161 265 265 162 267 267 162 267 267 161 265 265 163 266 266 164 268 268 165 269 269 166 271 271 166 271 271 165 269 269 167 270 270 168 272 272 169 273 273 170 275 275 170 275 275 169 273 273 171 274 274 172 276 276 173 277 277 174 279 279 174 279 279 173 277 277 175 278 278 176 280 280 177 281 281 178 283 283 178 283 283 177 281 281 179 282 282 180 284 284 181 285 285 182 287 287 182 287 287 181 285 285 183 286 286 184 288 288 185 289 289 186 291 291 186 291 291 185 289 289 187 290 290 188 292 292 189 293 293 190 295 295 190 295 295 189 293 293 191 294 294 192 296 296 193 297 297 194 299 299 194 299 299 193 297 297 195 298 298 196 300 300 197 301 301 198 303 303 198 303 303 197 301 301 199 302 302 200 304 304 201 305 305 202 307 307 202 307 307 201 305 305 203 306 306 204 308 308 205 309 309 206 311 311 206 311 311 205 309 309 207 310 310 208 312 312 209 313 313 210 315 315 210 315 315 209 313 313 211 314 314 212 316 316 213 317 317 214 319 319 214 319 319 213 317 317 215 318 318 216 320 320 217 321 321 218 323 323 218 323 323 217 321 321 219 322 322 220 324 324 221 325 325 222 327 327 222 327 327 221 325 325 223 326 326 224 328 328 225 329 329 226 331 331 226 331 331 225 329 329 227 330 330 228 332 332 229 333 333 230 335 335 230 335 335 229 333 333 231 334 334 232 336 336 233 337 337 234 339 339 234 339 339 233 337 337 235 338 338 236 340 340 237 341 341 238 343 343 238 343 343 237 341 341 239 342 342 240 344 344 241 345 345 242 347 347 242 347 347 241 345 345 243 346 346 244 348 348 245 349 349 246 351 351 246 351 351 245 349 349 247 350 350 248 352 352 249 353 353 250 355 355 250 355 355 249 353 353 251 354 354 252 356 356 253 357 357 254 359 359 254 359 359 253 357 357 255 358 358 256 360 360 257 361 361 258 363 363 258 363 363 257 361 361 259 362 362 260 364 364 261 365 365 262 367 367 262 367 367 261 365 365 263 366 366 264 368 368 265 369 369 266 371 371 266 371 371 265 369 369 267 370 370 268 372 372 269 373 373 270 375 375 270 375 375 269 373 373 271 374 374 272 376 376 273 377 377 274 379 379 274 379 379 273 377 377 275 378 378 276 380 380 277 381 381 278 383 383 278 383 383 277 381 381 279 382 382 280 384 384 281 385 385 282 387 387 282 387 387 281 385 385 283 386 386 284 388 388 285 389 389 286 391 391 286 391 391 285 389 389 287 390 390 288 392 392 289 393 393 290 395 395 290 395 395 289 393 393 291 394 394 292 396 396 293 397 397 294 399 399 294 399 399 293 397 397 295 398 398 296 400 400 297 401 401 298 403 403 298 403 403 297 401 401 299 402 402 300 404 404 301 405 405 302 407 407 302 407 407 301 405 405 303 406 406 304 408 408 305 409 409 306 411 411 306 411 411 305 409 409 307 410 410 308 412 412 309 413 413 310 415 415 310 415 415 309 413 413 311 414 414 312 416 416 313 417 417 314 419 419 314 419 419 313 417 417 315 418 418 316 420 420 317 421 421 318 423 423 318 423 423 317 421 421 319 422 422 320 424 424 321 425 425 322 427 427 322 427 427 321 425 425 323 426 426 324 428 428 325 429 429 326 431 431 326 431 431 325 429 429 327 430 430 328 432 432 329 433 433 330 435 435 330 435 435 329 433 433 331 434 434 332 436 436 333 437 437 334 439 439 334 439 439 333 437 437 335 438 438 336 440 440 337 441 441 338 443 443 338 443 443 337 441 441 339 442 442 340 444 444 341 445 445 342 447 447 342 447 447 341 445 445 343 446 446 344 448 448 345 449 449 346 451 451 346 451 451 345 449 449 347 450 450 348 452 452 349 453 453 350 455 455 350 455 455 349 453 453 351 454 454 352 456 456 353 457 457 354 459 459 354 459 459 353 457 457 355 458 458 356 460 460 357 461 461 358 463 463 358 463 463 357 461 461 359 462 462 360 464 464 361 465 465 362 467 467 362 467 467 361 465 465 363 466 466 364 468 468 365 469 469 366 471 471 366 471 471 365 469 469 367 470 470 368 472 472 369 473 473 370 475 475 370 475 475 369 473 473 371 474 474 372 476 476 373 477 477 374 479 479 374 479 479 373 477 477 375 478 478 376 480 480 377 481 481 378 483 483 378 483 483 377 481 481 379 482 482 380 484 484 381 485 485 382 487 487 382 487 487 381 485 485 383 486 486 384 488 488 385 489 489 386 491 491 386 491 491 385 489 489 387 490 490 388 492 492 389 493 493 390 495 495 390 495 495 389 493 493 391 494 494 392 496 496 393 497 497 394 499 499 394 499 499 393 497 497 395 498 498 396 500 500 397 501 501 398 503 503 398 503 503 397 501 501 399 502 502 400 504 504 401 505 505 402 507 507 402 507 507 401 505 505 403 506 506 404 508 508 405 509 509 406 511 511 406 511 511 405 509 509 407 510 510 408 512 512 409 513 513 410 515 515 410 515 515 409 513 513 411 514 514 412 516 516 413 517 517 414 519 519 414 519 519 413 517 517 415 518 518 416 520 520 417 521 521 418 523 523 418 523 523 417 521 521 419 522 522 420 524 524 421 525 525 422 527 527 422 527 527 421 525 525 423 526 526 424 528 528 425 529 529 426 531 531 426 531 531 425 529 529 427 530 530 428 532 532 429 533 533 430 535 535 430 535 535 429 533 533 431 534 534 432 536 536 433 537 537 434 539 539 434 539 539 433 537 537 435 538 538 436 540 540 437 541 541 438 543 543 438 543 543 437 541 541 439 542 542 440 544 544 441 545 545 442 547 547 442 547 547 441 545 545 443 546 546 444 548 548 445 549 549 446 551 551 446 551 551 445 549 549 447 550 550 448 552 552 449 553 553 450 555 555 450 555 555 449 553 553 451 554 554 452 556 556 453 557 557 454 559 559 454 559 559 453 557 557 455 558 558 456 560 560 457 561 561 458 563 563 458 563 563 457 561 561 459 562 562 460 564 564 461 565 565 462 567 567 462 567 567 461 565 565 463 566 566 464 568 568 465 569 569 466 571 571 466 571 571 465 569 569 467 570 570 468 572 572 469 573 573 470 575 575 470 575 575 469 573 573 471 574 574 472 576 576 473 577 577 474 579 579 474 579 579 473 577 577 475 578 578 476 580 580 477 581 581 478 583 583 478 583 583 477 581 581 479 582 582 480 584 584 481 585 585 482 587 587 482 587 587 481 585 585 483 586 586 484 588 588 485 589 589 486 591 591 486 591 591 485 589 589 487 590 590 488 592 592 489 593 593 490 595 595 490 595 595 489 593 593 491 594 594 492 596 596 493 597 597 494 599 599 494 599 599 493 597 597 495 598 598 496 600 600 497 601 601 498 603 603 498 603 603 497 601 601 499 602 602 500 604 604 501 605 605 502 607 607 502 607 607 501 605 605 503 606 606 504 608 608 505 609 609 506 611 611 506 611 611 505 609 609 507 610 610 508 612 612 509 613 613 510 615 615 510 615 615 509 613 613 511 614 614 512 616 616 513 617 617 514 619 619 514 619 619 513 617 617 515 618 618 516 620 620 517 621 621 518 623 623 518 623 623 517 621 621 519 622 622 520 624 624 521 625 625 522 627 627 522 627 627 521 625 625 523 626 626 524 628 628 525 629 629 526 631 631 526 631 631 525 629 629 527 630 630 528 632 632 529 633 633 530 635 635 530 635 635 529 633 633 531 634 634 532 636 636 533 637 637 534 639 639 534 639 639 533 637 637 535 638 638 536 640 640 537 641 641 538 643 643 538 643 643 537 641 641 539 642 642 540 644 644 541 645 645 542 647 647 542 647 647 541 645 645 543 646 646 544 648 648 545 649 649 546 651 651 546 651 651 545 649 649 547 650 650 548 652 652 549 653 653 550 655 655 550 655 655 549 653 653 551 654 654 552 656 656 553 657 657 554 659 659 554 659 659 553 657 657 555 658 658 556 660 660 557 661 661 558 663 663 558 663 663 557 661 661 559 662 662 560 664 664 561 665 665 562 667 667 562 667 667 561 665 665 563 666 666 564 668 668 565 669 669 566 671 671 566 671 671 565 669 669 567 670 670 568 672 672 569 673 673 570 675 675 570 675 675 569 673 673 571 674 674 572 676 676 573 677 677 574 679 679 574 679 679 573 677 677 575 678 678 576 680 680 577 681 681 578 683 683 578 683 683 577 681 681 579 682 682 580 684 684 581 685 685 582 687 687 582 687 687 581 685 685 583 686 686 584 688 688 585 689 689 586 691 691 586 691 691 585 689 689 587 690 690 588 692 692 589 693 693 590 695 695 590 695 695 589 693 693 591 694 694 592 696 696 593 697 697 594 699 699 594 699 699 593 697 697 595 698 698 596 700 700 597 701 701 598 703 703 598 703 703 597 701 701 599 702 702 600 704 704 601 705 705 602 707 707 602 707 707 601 705 705 603 706 706 604 708 708 605 709 709 606 711 711 606 711 711 605 709 709 607 710 710 608 712 712 609 713 713 610 715 715 610 715 715 609 713 713 611 714 714 612 716 716 613 717 717 614 719 719 614 719 719 613 717 717 615 718 718 616 720 720 617 721 721 618 723 723 618 723 723 617 721 721 619 722 722 620 724 724 621 725 725 622 727 727 622 727 727 621 725 725 623 726 726 624 728 728 625 729 729 626 731 731 626 731 731 625 729 729 627 730 730 628 732 732 629 733 733 630 735 735 630 735 735 629 733 733 631 734 734 632 736 736 633 737 737 634 739 739 634 739 739 633 737 737 635 738 738 636 740 740 637 741 741 638 743 743 638 743 743 637 741 741 639 742 742 640 744 744 641 745 745 642 747 747 642 747 747 641 745 745 643 746 746 644 748 748 645 749 749 646 751 751 646 751 751 645 749 749 647 750 750 648 752 752 649 753 753 650 755 755 650 755 755 649 753 753 651 754 754 652 756 756 653 757 757 654 759 759 654 759 759 653 757 757 655 758 758 656 760 760 657 761 761 658 763 763 658 763 763 657 761 761 659 762 762 660 764 764 661 765 765 662 767 767 662 767 767 661 765 765 663 766 766 664 768 768 665 769 769 666 771 771 666 771 771 665 769 769 667 770 770 668 772 772 669 773 773 670 775 775 670 775 775 669 773 773 671 774 774 672 776 776 673 777 777 674 779 779 674 779 779 673 777 777 675 778 778 676 780 780 677 781 781 678 783 783 678 783 783 677 781 781 679 782 782 680 784 784 681 785 785 682 787 787 682 787 787 681 785 785 683 786 786 684 788 788 685 789 789 686 791 791 686 791 791 685 789 789 687 790 790</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_260_2Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_260_2" name="qt_gauge_tickmarks_260_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 -0.1092905 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_260_2Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_260_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_1.dae
new file mode 100644
index 0000000..c28c428
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:26:32</created>
+ <modified>2018-03-08T09:26:32</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_320Shape" name="qt_gauge_tickmarks_320Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_320Shape-positions" name="qt_gauge_tickmarks_320Shape-positions">
+ <float_array id="qt_gauge_tickmarks_320Shape-positions-array" count="780">4.313352 0 4.1617 4.17193 0 4.303123 5.727565 0 5.575914 5.586143 0 5.717336 4.60857 0 3.833087 4.477936 0 3.984529 6.122989 0 5.139433 5.992353 0 5.290875 -1.837402 0 -5.722843 -1.646014 0 -5.7809 -2.417971 0 -7.636723 -2.226583 0 -7.69478 -2.25267 0 -5.572196 -2.066071 0 -5.644176 -2.972459 0 -7.438181 -2.785861 0 -7.510161 -2.65573 0 -5.39141 -2.474931 0 -5.47692 -3.510839 0 -7.199388 -3.330042 0 -7.284899 -0.5411164 0 -5.986615 -0.3416583 0 -6.001328 -0.6882455 0 -7.981196 -0.4887875 0 -7.995909 -0.9793005 0 -5.930615 -0.7814652 0 -5.959961 -1.272761 0 -7.908968 -1.074926 0 -7.938314 -1.412178 0 -5.842532 -1.217037 0 -5.886352 -1.85038 0 -7.793936 -1.65524 0 -7.837757 3.250275 0 -5.054604 3.416568 0 -4.94349 4.361415 0 -6.717544 4.527709 0 -6.60643 2.87038 0 -5.280041 3.044398 0 -5.181461 3.856176 0 -7.020215 4.030194 0 -6.921636 2.474931 0 -5.47692 2.65573 0 -5.39141 3.330042 0 -7.284899 3.510839 0 -7.199388 4.276528 0 -4.219897 4.414436 0 -4.075047 5.725022 0 -5.598979 5.862931 0 -5.454129 3.955259 0 -4.523092 4.103449 0 -4.38878 5.298377 0 -6.004994 5.446567 0 -5.870683 3.612555 0 -4.801831 3.770225 0 -4.678785 4.843018 0 -6.378523 5.000688 0 -6.255477 -5.444735 0 2.51264 -5.525783 0 2.329798 -7.273153 0 3.323123 -7.354202 0 3.14028 5.314384 0 -2.797219 5.404307 0 -2.618575 7.100833 0 -3.696442 7.190756 0 -3.517797 5.094961 0 -3.180618 5.197782 0 -3.009073 6.810419 0 -4.208824 6.913239 0 -4.037278 4.847928 0 -3.546837 4.96309 0 -3.38332 6.483098 0 -4.698453 6.598259 0 -4.534936 4.574623 0 -3.893889 4.701502 0 -3.739287 6.120645 0 -5.162677 6.247523 0 -5.008074 5.79589 0 -1.565114 5.844485 0 -1.371107 7.735952 0 -2.051074 7.784548 0 -1.857067 5.665801 0 -1.987272 5.728537 0 -1.797366 7.564857 0 -2.614636 7.627593 0 -2.42473 5.505009 0 -2.398717 5.581546 0 -2.213942 7.352768 0 -3.164084 7.429305 0 -2.979308 -4.103449 0 -4.38878 -3.955259 0 -4.523092 -5.446567 0 -5.870683 -5.298377 0 -6.004994 -4.414436 0 -4.075047 -4.276528 0 -4.219897 -5.862931 0 -5.454129 -5.725022 0 -5.598979 -4.701502 0 -3.739287 -4.574623 0 -3.893889 -6.247523 0 -5.008074 -6.120645 0 -5.162677 -4.96309 0 -3.38332 -4.847928 0 -3.546837 -6.598259 0 -4.534936 -6.483098 0 -4.698453 -3.044398 0 -5.181461 -2.87038 0 -5.280041 -4.030194 0 -6.921636 -3.856176 0 -7.020215 -3.416568 0 -4.94349 -3.250275 0 -5.054604 -4.527709 0 -6.60643 -4.361415 0 -6.717544 -3.770225 0 -4.678785 -3.612555 0 -4.801831 -5.000688 0 -6.255477 -4.843018 0 -6.378523 -5.755985 0 1.686424 -5.809328 0 1.493669 -7.683537 0 2.21985 -7.736879 0 2.027095 -5.615575 0 2.105265 -5.682954 0 1.916956 -7.498663 0 2.779044 -7.566041 0 2.590736 -5.942636 0 0.8234828 -5.967118 0 0.6249869 -7.927596 0 1.068304 -7.952077 0 0.8698083 -5.865203 0 1.258392 -5.904221 0 1.062235 -7.826774 0 1.648572 -7.865792 0 1.452415 0.7814652 0 -5.959961 0.9793005 0 -5.930615 1.074926 0 -7.938314 1.272761 0 -7.908968 0.3416583 0 -6.001328 0.5411164 0 -5.986615 0.4887875 0 -7.995909 0.6882455 0 -7.981196 -0.1 0 -6.010229 0.1 0 -6.010229 -0.1 0 -8.010229 0.1 0 -8.010229 2.066071 0 -5.644176 2.25267 0 -5.572196 2.785861 0 -7.510161 2.972459 0 -7.438181 1.646014 0 -5.7809 1.837402 0 -5.722843 2.226583 0 -7.69478 2.417971 0 -7.636723 1.217037 0 -5.886352 1.412178 0 -5.842532 1.65524 0 -7.837757 1.85038 0 -7.793936 5.525783 0 2.329798 5.444735 0 2.51264 7.354202 0 3.14028 7.273153 0 3.323123 5.682954 0 1.916956 5.615575 0 2.105265 7.566041 0 2.590736 7.498663 0 2.779044 5.809328 0 1.493669 5.755985 0 1.686424 7.736879 0 2.027095 7.683537 0 2.21985 4.878815 0 3.483646 4.759676 0 3.644287 6.48523 0 4.675045 6.36609 0 4.835686 5.122622 0 3.115271 5.015621 0 3.284242 6.812328 0 4.185266 6.705329 0 4.354238 5.338667 0 2.729959 5.244388 0 2.906343 7.102509 0 3.672753 7.00823 0 3.849137 5.995739 0 -0.2574465 6.000648 0 -0.05750699 7.995136 0 -0.3065285 8.000045 0 -0.1065893 5.961307 0 -0.6978499 5.98091 0 -0.4988131 7.951676 0 -0.8938851 7.971279 0 -0.6948473 5.89457 0 -1.134528 5.928762 0 -0.9374728 7.865125 0 -1.476452 7.899318 0 -1.279397 5.904221 0 1.062235 5.865203 0 1.258392 7.865792 0 1.452415 7.826774 0 1.648572 5.967118 0 0.6249869 5.942636 0 0.8234828 7.952077 0 0.8698083 7.927596 0 1.068304 5.99768 0 0.1842974 5.987866 0 0.3840569 7.995271 0 0.2824326 7.985457 0 0.4821916 -5.015621 0 3.284242 -5.122622 0 3.115271 -6.705329 0 4.354238 -6.812328 0 4.185266 -4.759676 0 3.644287 -4.878815 0 3.483646 -6.36609 0 4.835686 -6.48523 0 4.675045 -4.477936 0 3.984529 -4.60857 0 3.833087 -5.992353 0 5.290875 -6.122989 0 5.139433 -4.17193 0 4.303123 -4.313352 0 4.1617 -5.586143 0 5.717336 -5.727565 0 5.575914 -5.928762 0 -0.9374728 -5.89457 0 -1.134528 -7.899318 0 -1.279397 -7.865125 0 -1.476452 -5.98091 0 -0.4988131 -5.961307 0 -0.6978499 -7.971279 0 -0.6948473 -7.951676 0 -0.8938851 -6.000648 0 -0.05750699 -5.995739 0 -0.2574465 -8.000045 0 -0.1065893 -7.995136 0 -0.3065285 -5.987866 0 0.3840569 -5.99768 0 0.1842974 -7.985457 0 0.4821916 -7.995271 0 0.2824326 -5.197782 0 -3.009073 -5.094961 0 -3.180618 -6.913239 0 -4.037278 -6.810419 0 -4.208824 -5.404307 0 -2.618575 -5.314384 0 -2.797219 -7.190756 0 -3.517797 -7.100833 0 -3.696442 -5.581546 0 -2.213942 -5.505009 0 -2.398717 -7.429305 0 -2.979308 -7.352768 0 -3.164084 -5.728537 0 -1.797366 -5.665801 0 -1.987272 -7.627593 0 -2.42473 -7.564857 0 -2.614636 -5.844485 0 -1.371107 -5.79589 0 -1.565114 -7.784548 0 -1.857067 -7.735952 0 -2.051074 -5.244388 0 2.906343 -5.338667 0 2.729959 -7.00823 0 3.849137 -7.102509 0 3.672753</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320Shape-positions-array" count="260" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320Shape-normals" name="qt_gauge_tickmarks_320Shape-normals">
+ <float_array id="qt_gauge_tickmarks_320Shape-normals-array" count="780">0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320Shape-normals-array" count="260" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320Shape-tangents" name="qt_gauge_tickmarks_320Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_320Shape-tangents-array" count="780">-0.707107 0 0.7071065 0.707108 0 0.7071056 -0.7071068 0 -0.7071068 0.7071067 0 -0.7071069 -0.6531726 0 0.757209 0.7572091 0 0.6531726 -0.7572077 0 -0.6531741 0.653173 0 -0.7572087 0.9569404 0 -0.2902846 -0.2902841 0 -0.9569405 0.290287 0 0.9569396 -0.9569403 0 0.2902847 0.9329928 0 -0.359895 -0.3598948 0 -0.9329929 0.3598998 0 0.932991 -0.9329928 0 0.3598951 0.9039893 0 -0.4275552 -0.4275496 0 -0.9039919 0.4275564 0 0.9039887 -0.9039893 0 0.4275551 0.9972905 0 -0.07356455 -0.07356643 0 -0.9972903 0.07356407 0 0.9972905 -0.9972905 0 0.07356458 0.9891765 0 -0.1467305 -0.14673 0 -0.9891766 0.1467324 0 0.9891762 -0.9891765 0 0.1467305 0.9757021 0 -0.2191013 -0.2191018 0 -0.975702 0.2191042 0 0.9757015 -0.9757021 0 0.2191013 0.8314697 0 0.5555701 0.5555725 0 -0.8314681 -0.5555698 0 0.8314699 -0.8314697 0 -0.5555701 0.870087 0 0.4928982 0.4929009 0 -0.8700855 -0.4928944 0 0.8700891 -0.8700871 0 -0.492898 0.9039893 0 0.4275551 0.4275496 0 -0.9039919 -0.4275564 0 0.9039887 -0.9039893 0 -0.4275552 0.6895408 0 0.7242469 0.7242471 0 -0.6895405 -0.7242459 0 0.6895418 -0.6895406 0 -0.724247 0.7409512 0 0.6715589 0.6715599 0 -0.7409503 -0.6715591 0 0.740951 -0.7409514 0 -0.6715587 0.7883464 0 0.6152317 0.6152292 0 -0.7883483 -0.6152312 0 0.7883467 -0.7883463 0 -0.6152317 -0.4052416 0 -0.9142096 -0.9142103 0 0.4052401 0.9142089 0 -0.4052432 0.4052412 0 0.9142098 0.4496113 0 0.8932243 0.8932235 0 -0.4496129 -0.8932228 0 0.4496143 -0.4496111 0 -0.8932244 0.5141027 0 0.8577286 0.8577279 0 -0.5141039 -0.8577293 0 0.5141016 -0.5141027 0 -0.8577286 0.5758081 0 0.8175849 0.8175843 0 -0.575809 -0.8175854 0 0.5758074 -0.5758082 0 -0.8175848 0.6343934 0 0.7730104 0.7730102 0 -0.6343936 -0.7730133 0 0.6343899 -0.6343932 0 -0.7730105 0.2429802 0 0.9700313 0.9700321 0 -0.2429768 -0.9700317 0 0.2429785 -0.2429799 0 -0.9700313 0.3136817 0 0.9495282 0.9495288 0 -0.31368 -0.9495288 0 0.31368 -0.3136817 0 -0.9495282 0.3826835 0 0.9238795 0.9238785 0 -0.3826859 -0.9238795 0 0.3826834 -0.3826835 0 -0.9238795 0.7409514 0 -0.6715587 -0.6715599 0 -0.7409503 0.6715591 0 0.740951 -0.7409512 0 0.6715589 0.6895406 0 -0.724247 -0.7242471 0 -0.6895405 0.7242459 0 0.6895418 -0.6895408 0 0.7242469 0.6343932 0 -0.7730105 -0.7730102 0 -0.6343936 0.7730133 0 0.6343899 -0.6343934 0 0.7730104 0.5758082 0 -0.8175848 -0.8175843 0 -0.575809 0.8175854 0 0.5758074 -0.5758081 0 0.8175849 0.8700871 0 -0.492898 -0.4929009 0 -0.8700855 0.4928944 0 0.8700891 -0.870087 0 0.4928982 0.8314697 0 -0.5555701 -0.5555725 0 -0.8314681 0.5555698 0 0.8314699 -0.8314697 0 0.5555701 0.7883463 0 -0.6152317 -0.6152292 0 -0.7883483 0.6152312 0 0.7883467 -0.7883464 0 0.6152317 -0.2667128 0 -0.963776 -0.9637757 0 0.266714 0.9637763 0 -0.2667121 0.266713 0 0.963776 -0.3368899 0 -0.941544 -0.9415433 0 0.3368921 0.9415429 0 -0.3368932 0.3368903 0 0.9415439 -0.1224105 0 -0.9924796 -0.9924798 0 0.1224089 0.9924797 0 -0.1224091 0.1224106 0 0.9924795 -0.1950902 0 -0.9807853 -0.9807856 0 0.1950885 0.9807852 0 -0.1950906 0.19509 0 0.9807853 0.9891765 0 0.1467305 0.14673 0 -0.9891766 -0.1467324 0 0.9891762 -0.9891765 0 -0.1467305 0.9972905 0 0.07356458 0.07356643 0 -0.9972903 -0.07356407 0 0.9972905 -0.9972905 0 -0.07356455 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9329928 0 0.3598951 0.3598948 0 -0.9329929 -0.3598998 0 0.932991 -0.9329928 0 -0.359895 0.9569403 0 0.2902847 0.2902841 0 -0.9569405 -0.290287 0 0.9569396 -0.9569404 0 -0.2902846 0.9757021 0 0.2191013 0.2191018 0 -0.975702 -0.2191042 0 0.9757015 -0.9757021 0 -0.2191013 -0.4052412 0 0.9142098 0.9142103 0 0.4052401 -0.9142089 0 -0.4052432 0.4052416 0 -0.9142096 -0.3368903 0 0.9415439 0.9415433 0 0.3368921 -0.9415429 0 -0.3368932 0.3368899 0 -0.941544 -0.266713 0 0.963776 0.9637757 0 0.266714 -0.9637763 0 -0.2667121 0.2667128 0 -0.963776 -0.595699 0 0.8032078 0.8032077 0 0.595699 -0.8032071 0 -0.5956998 0.5956995 0 -0.8032074 -0.5349978 0 0.8448535 0.8448525 0 0.5349992 -0.8448544 0 -0.5349964 0.5349975 0 -0.8448537 -0.4713967 0 0.8819213 0.8819211 0 0.4713971 -0.8819213 0 -0.4713966 0.4713968 0 -0.8819212 0.02454102 0 0.9996988 0.9996988 0 -0.02454284 -0.9996988 0 0.02454287 -0.02454114 0 -0.9996988 0.09801755 0 0.9951847 0.9951846 0 -0.09801868 -0.9951851 0 0.0980135 -0.09801713 0 -0.9951847 0.170962 0 0.9852776 0.9852774 0 -0.1709631 -0.9852771 0 0.1709653 -0.1709619 0 -0.9852776 -0.19509 0 0.9807853 0.9807856 0 0.1950885 -0.9807852 0 -0.1950906 0.1950902 0 -0.9807853 -0.1224106 0 0.9924795 0.9924798 0 0.1224089 -0.9924797 0 -0.1224091 0.1224105 0 -0.9924796 -0.04906762 0 0.9987955 0.9987955 0 0.04906645 -0.9987955 0 -0.04906657 0.04906738 0 -0.9987955 -0.5349975 0 -0.8448537 -0.8448525 0 0.5349992 0.8448544 0 -0.5349964 0.5349978 0 0.8448535 -0.5956995 0 -0.8032074 -0.8032077 0 0.595699 0.8032071 0 -0.5956998 0.595699 0 0.8032078 -0.653173 0 -0.7572087 -0.7572091 0 0.6531726 0.7572077 0 -0.6531741 0.6531726 0 0.757209 -0.7071067 0 -0.7071069 -0.707108 0 0.7071056 0.7071068 0 -0.7071068 0.707107 0 0.7071065 0.1709619 0 -0.9852776 -0.9852774 0 -0.1709631 0.9852771 0 0.1709653 -0.170962 0 0.9852776 0.09801713 0 -0.9951847 -0.9951846 0 -0.09801868 0.9951851 0 0.0980135 -0.09801755 0 0.9951847 0.02454114 0 -0.9996988 -0.9996988 0 -0.02454284 0.9996988 0 0.02454287 -0.02454102 0 0.9996988 -0.04906738 0 -0.9987955 -0.9987955 0 0.04906645 0.9987955 0 -0.04906657 0.04906762 0 0.9987955 0.5141027 0 -0.8577286 -0.8577279 0 -0.5141039 0.8577293 0 0.5141016 -0.5141027 0 0.8577286 0.4496111 0 -0.8932244 -0.8932235 0 -0.4496129 0.8932228 0 0.4496143 -0.4496113 0 0.8932243 0.3826835 0 -0.9238795 -0.9238785 0 -0.3826859 0.9238795 0 0.3826834 -0.3826835 0 0.9238795 0.3136817 0 -0.9495282 -0.9495288 0 -0.31368 0.9495288 0 0.31368 -0.3136817 0 0.9495282 0.2429799 0 -0.9700313 -0.9700321 0 -0.2429768 0.9700317 0 0.2429785 -0.2429802 0 0.9700313 -0.4713968 0 -0.8819212 -0.8819211 0 0.4713971 0.8819213 0 -0.4713966 0.4713967 0 0.8819213</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320Shape-tangents-array" count="260" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320Shape-binormals" name="qt_gauge_tickmarks_320Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_320Shape-binormals-array" count="780">0.7071066 0 0.7071071 0.7071056 0 -0.707108 -0.7071068 0 0.7071068 -0.7071069 0 -0.7071066 0.7572091 0 0.6531726 0.6531726 0 -0.7572091 -0.6531742 0 0.7572078 -0.7572088 0 -0.653173 -0.2902846 0 -0.9569404 -0.9569405 0 0.2902841 0.9569396 0 -0.290287 0.2902847 0 0.9569404 -0.359895 0 -0.9329929 -0.9329929 0 0.3598948 0.932991 0 -0.3598998 0.3598951 0 0.9329928 -0.4275552 0 -0.9039893 -0.9039919 0 0.4275496 0.9039887 0 -0.4275564 0.4275551 0 0.9039893 -0.07356455 0 -0.9972906 -0.9972903 0 0.07356643 0.9972905 0 -0.07356407 0.07356458 0 0.9972905 -0.1467305 0 -0.9891765 -0.9891767 0 0.14673 0.9891762 0 -0.1467324 0.1467305 0 0.9891765 -0.2191013 0 -0.9757022 -0.9757021 0 0.2191018 0.9757015 0 -0.2191042 0.2191013 0 0.9757021 0.5555701 0 -0.8314698 -0.8314682 0 -0.5555725 0.83147 0 0.5555698 -0.5555702 0 0.8314698 0.4928982 0 -0.870087 -0.8700855 0 -0.4929009 0.8700892 0 0.4928944 -0.492898 0 0.8700871 0.4275551 0 -0.9039893 -0.9039919 0 -0.4275497 0.9039888 0 0.4275565 -0.4275552 0 0.9039893 0.7242469 0 -0.6895407 -0.6895405 0 -0.7242471 0.6895418 0 0.7242459 -0.724247 0 0.6895406 0.6715589 0 -0.7409512 -0.7409503 0 -0.6715599 0.7409509 0 0.6715592 -0.6715587 0 0.7409514 0.6152317 0 -0.7883464 -0.7883484 0 -0.6152292 0.7883468 0 0.6152312 -0.6152318 0 0.7883464 -0.9142097 0 0.4052417 0.4052402 0 0.9142104 -0.4052433 0 -0.9142089 0.9142098 0 -0.4052412 0.8932244 0 -0.4496114 -0.4496129 0 -0.8932236 0.4496143 0 0.8932229 -0.8932244 0 0.4496112 0.8577286 0 -0.5141028 -0.5141039 0 -0.857728 0.5141016 0 0.8577294 -0.8577287 0 0.5141028 0.8175849 0 -0.5758081 -0.5758089 0 -0.8175843 0.5758074 0 0.8175854 -0.8175849 0 0.5758083 0.7730104 0 -0.6343934 -0.6343936 0 -0.7730103 0.6343899 0 0.7730134 -0.7730106 0 0.6343932 0.9700313 0 -0.2429802 -0.2429768 0 -0.9700322 0.2429785 0 0.9700317 -0.9700313 0 0.2429799 0.9495283 0 -0.3136817 -0.31368 0 -0.9495288 0.31368 0 0.9495288 -0.9495283 0 0.3136817 0.9238796 0 -0.3826835 -0.382686 0 -0.9238786 0.3826835 0 0.9238796 -0.9238795 0 0.3826835 -0.6715587 0 -0.7409514 -0.7409503 0 0.6715599 0.7409509 0 -0.6715592 0.6715589 0 0.7409512 -0.724247 0 -0.6895406 -0.6895405 0 0.7242471 0.6895418 0 -0.7242459 0.7242469 0 0.6895407 -0.7730106 0 -0.6343932 -0.6343936 0 0.7730102 0.6343899 0 -0.7730133 0.7730104 0 0.6343934 -0.8175849 0 -0.5758083 -0.5758089 0 0.8175843 0.5758074 0 -0.8175854 0.8175849 0 0.5758081 -0.4928981 0 -0.8700871 -0.8700855 0 0.4929008 0.8700892 0 -0.4928945 0.4928982 0 0.8700871 -0.5555701 0 -0.8314697 -0.8314682 0 0.5555725 0.83147 0 -0.5555698 0.5555701 0 0.8314697 -0.6152318 0 -0.7883464 -0.7883484 0 0.6152291 0.7883467 0 -0.6152312 0.6152317 0 0.7883464 -0.9637761 0 0.2667128 0.266714 0 0.9637758 -0.2667121 0 -0.9637764 0.963776 0 -0.266713 -0.9415441 0 0.33689 0.3368921 0 0.9415433 -0.3368932 0 -0.9415429 0.9415439 0 -0.3368903 -0.9924796 0 0.1224105 0.1224089 0 0.9924797 -0.1224091 0 -0.9924798 0.9924796 0 -0.1224106 -0.9807853 0 0.1950902 0.1950886 0 0.9807857 -0.1950906 0 -0.9807853 0.9807854 0 -0.19509 0.1467305 0 -0.9891765 -0.9891767 0 -0.14673 0.9891762 0 0.1467324 -0.1467305 0 0.9891765 0.07356459 0 -0.9972906 -0.9972903 0 -0.07356643 0.9972906 0 0.07356407 -0.07356455 0 0.9972906 0 0 -1 -1 0 0 1 0 0 0 0 1 0.3598951 0 -0.9329929 -0.9329929 0 -0.3598948 0.932991 0 0.3598998 -0.359895 0 0.9329929 0.2902847 0 -0.9569403 -0.9569406 0 -0.2902841 0.9569397 0 0.290287 -0.2902846 0 0.9569405 0.2191013 0 -0.9757022 -0.9757021 0 -0.2191018 0.9757015 0 0.2191042 -0.2191013 0 0.9757022 0.9142098 0 0.4052412 0.4052402 0 -0.9142104 -0.4052432 0 0.9142089 -0.9142097 0 -0.4052416 0.941544 0 0.3368903 0.3368921 0 -0.9415433 -0.3368932 0 0.9415429 -0.9415441 0 -0.33689 0.963776 0 0.266713 0.266714 0 -0.9637758 -0.2667121 0 0.9637764 -0.9637761 0 -0.2667128 0.8032078 0 0.595699 0.5956991 0 -0.8032077 -0.5956998 0 0.8032072 -0.8032073 0 -0.5956995 0.8448535 0 0.5349978 0.5349993 0 -0.8448526 -0.5349964 0 0.8448544 -0.8448538 0 -0.5349975 0.8819213 0 0.4713967 0.4713971 0 -0.8819211 -0.4713966 0 0.8819214 -0.8819212 0 -0.4713968 0.9996988 0 -0.02454102 -0.02454284 0 -0.9996988 0.02454287 0 0.9996988 -0.9996988 0 0.02454114 0.9951848 0 -0.09801757 -0.09801868 0 -0.9951846 0.0980135 0 0.9951851 -0.9951848 0 0.09801713 0.9852777 0 -0.170962 -0.1709631 0 -0.9852775 0.1709653 0 0.9852771 -0.9852777 0 0.1709619 0.9807854 0 0.19509 0.1950886 0 -0.9807857 -0.1950906 0 0.9807853 -0.9807854 0 -0.1950902 0.9924796 0 0.1224106 0.1224089 0 -0.9924798 -0.1224091 0 0.9924798 -0.9924796 0 -0.1224105 0.9987956 0 0.04906763 0.04906645 0 -0.9987956 -0.04906657 0 0.9987955 -0.9987956 0 -0.04906738 -0.8448538 0 0.5349975 0.5349993 0 0.8448526 -0.5349964 0 -0.8448544 0.8448535 0 -0.5349978 -0.8032073 0 0.5956995 0.5956991 0 0.8032077 -0.5956998 0 -0.8032072 0.8032078 0 -0.595699 -0.7572088 0 0.653173 0.6531726 0 0.7572091 -0.6531742 0 -0.7572078 0.7572091 0 -0.6531726 -0.7071069 0 0.7071066 0.7071056 0 0.707108 -0.7071068 0 -0.7071068 0.7071066 0 -0.7071071 -0.9852777 0 -0.1709619 -0.1709631 0 0.9852774 0.1709653 0 -0.9852771 0.9852777 0 0.170962 -0.9951847 0 -0.09801713 -0.09801868 0 0.9951846 0.0980135 0 -0.9951851 0.9951847 0 0.09801756 -0.9996988 0 -0.02454114 -0.02454284 0 0.9996988 0.02454287 0 -0.9996988 0.9996988 0 0.02454102 -0.9987956 0 0.04906738 0.04906645 0 0.9987956 -0.04906657 0 -0.9987955 0.9987956 0 -0.04906763 -0.8577287 0 -0.5141028 -0.5141039 0 0.8577279 0.5141016 0 -0.8577294 0.8577287 0 0.5141028 -0.8932244 0 -0.4496112 -0.4496129 0 0.8932236 0.4496143 0 -0.8932228 0.8932244 0 0.4496114 -0.9238795 0 -0.3826835 -0.3826859 0 0.9238786 0.3826835 0 -0.9238796 0.9238795 0 0.3826835 -0.9495283 0 -0.3136817 -0.31368 0 0.9495288 0.31368 0 -0.9495288 0.9495283 0 0.3136817 -0.9700314 0 -0.2429799 -0.2429768 0 0.9700322 0.2429785 0 -0.9700317 0.9700313 0 0.2429802 -0.8819212 0 0.4713968 0.4713971 0 0.8819211 -0.4713966 0 -0.8819214 0.8819214 0 -0.4713967</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320Shape-binormals-array" count="260" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320Shape-map1" name="qt_gauge_tickmarks_320Shape-map1">
+ <float_array id="qt_gauge_tickmarks_320Shape-map1-array" count="520">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320Shape-map1-array" count="260" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_320Shape-textangents-array" count="780">-0.7071055 0 0.7071079 -0.7071061 0 0.7071073 -0.7071068 0 0.7071068 -0.7071061 0 0.7071073 -0.6531726 0 0.7572091 -0.6531733 0 0.7572084 -0.653174 0 0.7572076 -0.6531733 0 0.7572084 0.9569405 0 -0.2902841 0.95694 0 -0.2902855 0.9569396 0 -0.2902869 0.95694 0 -0.2902855 0.9329928 0 -0.3598948 0.9329919 0 -0.3598973 0.9329909 0 -0.3598998 0.9329919 0 -0.3598973 0.9039918 0 -0.4275496 0.9039903 0 -0.427553 0.9039887 0 -0.4275564 0.9039903 0 -0.427553 0.9972903 0 -0.07356642 0.9972904 0 -0.07356524 0.9972904 0 -0.07356406 0.9972904 0 -0.07356524 0.9891766 0 -0.14673 0.9891764 0 -0.1467312 0.9891762 0 -0.1467323 0.9891764 0 -0.1467312 0.975702 0 -0.2191018 0.9757017 0 -0.219103 0.9757014 0 -0.2191042 0.9757017 0 -0.219103 0.831468 0 0.5555725 0.8314689 0 0.555571 0.8314699 0 0.5555697 0.8314689 0 0.555571 0.8700854 0 0.4929008 0.8700873 0 0.4928976 0.8700891 0 0.4928944 0.8700873 0 0.4928976 0.9039918 0 0.4275496 0.9039903 0 0.427553 0.9039887 0 0.4275564 0.9039903 0 0.427553 0.6895404 0 0.724247 0.6895411 0 0.7242465 0.6895417 0 0.7242458 0.6895411 0 0.7242465 0.7409502 0 0.6715598 0.7409506 0 0.6715595 0.7409509 0 0.6715591 0.7409506 0 0.6715595 0.7883483 0 0.6152291 0.7883475 0 0.6152302 0.7883466 0 0.6152312 0.7883475 0 0.6152302 -0.4052401 0 -0.9142103 -0.4052417 0 -0.9142095 -0.4052432 0 -0.9142088 -0.4052417 0 -0.9142095 0.4496128 0 0.8932235 0.4496135 0 0.8932231 0.4496143 0 0.8932227 0.4496135 0 0.8932231 0.5141038 0 0.8577279 0.5141027 0 0.8577285 0.5141016 0 0.8577293 0.5141027 0 0.8577285 0.5758089 0 0.8175842 0.575808 0 0.8175848 0.5758073 0 0.8175853 0.575808 0 0.8175848 0.6343936 0 0.7730101 0.6343917 0 0.7730116 0.6343899 0 0.7730132 0.6343917 0 0.7730116 0.2429768 0 0.970032 0.2429776 0 0.9700319 0.2429785 0 0.9700316 0.2429776 0 0.9700319 0.31368 0 0.9495288 0.31368 0 0.9495288 0.31368 0 0.9495288 0.31368 0 0.9495288 0.3826859 0 0.9238785 0.3826846 0 0.923879 0.3826834 0 0.9238795 0.3826846 0 0.923879 0.7409502 0 -0.6715598 0.7409506 0 -0.6715595 0.7409509 0 -0.6715591 0.7409506 0 -0.6715595 0.6895404 0 -0.724247 0.6895411 0 -0.7242465 0.6895417 0 -0.7242458 0.6895411 0 -0.7242465 0.6343936 0 -0.7730101 0.6343917 0 -0.7730116 0.6343899 0 -0.7730132 0.6343917 0 -0.7730116 0.5758089 0 -0.8175842 0.575808 0 -0.8175848 0.5758073 0 -0.8175853 0.575808 0 -0.8175848 0.8700854 0 -0.4929008 0.8700873 0 -0.4928976 0.8700891 0 -0.4928944 0.8700873 0 -0.4928976 0.831468 0 -0.5555725 0.8314689 0 -0.555571 0.8314699 0 -0.5555697 0.8314689 0 -0.555571 0.7883483 0 -0.6152291 0.7883475 0 -0.6152302 0.7883466 0 -0.6152312 0.7883475 0 -0.6152302 -0.2667139 0 -0.9637757 -0.266713 0 -0.9637759 -0.2667121 0 -0.9637762 -0.266713 0 -0.9637759 -0.336892 0 -0.9415432 -0.3368926 0 -0.941543 -0.3368932 0 -0.9415428 -0.3368926 0 -0.941543 -0.1224089 0 -0.9924797 -0.122409 0 -0.9924797 -0.1224091 0 -0.9924797 -0.122409 0 -0.9924797 -0.1950885 0 -0.9807856 -0.1950896 0 -0.9807854 -0.1950906 0 -0.9807852 -0.1950896 0 -0.9807854 0.9891766 0 0.14673 0.9891764 0 0.1467312 0.9891762 0 0.1467323 0.9891764 0 0.1467312 0.9972903 0 0.07356642 0.9972904 0 0.07356524 0.9972904 0 0.07356406 0.9972904 0 0.07356524 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9329928 0 0.3598948 0.9329919 0 0.3598973 0.9329909 0 0.3598998 0.9329919 0 0.3598973 0.9569405 0 0.2902841 0.95694 0 0.2902855 0.9569396 0 0.2902869 0.95694 0 0.2902855 0.975702 0 0.2191018 0.9757017 0 0.219103 0.9757014 0 0.2191042 0.9757017 0 0.219103 -0.4052401 0 0.9142103 -0.4052417 0 0.9142095 -0.4052432 0 0.9142088 -0.4052417 0 0.9142095 -0.336892 0 0.9415432 -0.3368926 0 0.941543 -0.3368932 0 0.9415428 -0.3368926 0 0.941543 -0.2667139 0 0.9637757 -0.266713 0 0.9637759 -0.2667121 0 0.9637762 -0.266713 0 0.9637759 -0.595699 0 0.8032076 -0.5956994 0 0.8032074 -0.5956998 0 0.8032071 -0.5956994 0 0.8032074 -0.5349993 0 0.8448525 -0.5349978 0 0.8448534 -0.5349963 0 0.8448543 -0.5349978 0 0.8448534 -0.4713971 0 0.881921 -0.4713969 0 0.8819212 -0.4713966 0 0.8819213 -0.4713969 0 0.8819212 0.02454284 0 0.9996987 0.02454286 0 0.9996987 0.02454287 0 0.9996987 0.02454286 0 0.9996987 0.09801868 0 0.9951845 0.09801608 0 0.9951848 0.09801349 0 0.995185 0.09801608 0 0.9951848 0.1709631 0 0.9852774 0.1709642 0 0.9852772 0.1709652 0 0.985277 0.1709642 0 0.9852772 -0.1950885 0 0.9807856 -0.1950896 0 0.9807854 -0.1950906 0 0.9807852 -0.1950896 0 0.9807854 -0.1224089 0 0.9924797 -0.122409 0 0.9924797 -0.1224091 0 0.9924797 -0.122409 0 0.9924797 -0.04906645 0 0.9987955 -0.0490665 0 0.9987954 -0.04906656 0 0.9987954 -0.0490665 0 0.9987954 -0.5349993 0 -0.8448525 -0.5349978 0 -0.8448534 -0.5349963 0 -0.8448543 -0.5349978 0 -0.8448534 -0.595699 0 -0.8032076 -0.5956994 0 -0.8032074 -0.5956998 0 -0.8032071 -0.5956994 0 -0.8032074 -0.6531726 0 -0.7572091 -0.6531733 0 -0.7572084 -0.653174 0 -0.7572076 -0.6531733 0 -0.7572084 -0.7071055 0 -0.7071079 -0.7071061 0 -0.7071073 -0.7071068 0 -0.7071068 -0.7071061 0 -0.7071073 0.1709631 0 -0.9852774 0.1709642 0 -0.9852772 0.1709652 0 -0.985277 0.1709642 0 -0.9852772 0.09801868 0 -0.9951845 0.09801608 0 -0.9951848 0.09801349 0 -0.995185 0.09801608 0 -0.9951848 0.02454284 0 -0.9996987 0.02454286 0 -0.9996987 0.02454287 0 -0.9996987 0.02454286 0 -0.9996987 -0.04906645 0 -0.9987955 -0.0490665 0 -0.9987954 -0.04906656 0 -0.9987954 -0.0490665 0 -0.9987954 0.5141038 0 -0.8577279 0.5141027 0 -0.8577285 0.5141016 0 -0.8577293 0.5141027 0 -0.8577285 0.4496128 0 -0.8932235 0.4496135 0 -0.8932231 0.4496143 0 -0.8932227 0.4496135 0 -0.8932231 0.3826859 0 -0.9238785 0.3826846 0 -0.923879 0.3826834 0 -0.9238795 0.3826846 0 -0.923879 0.31368 0 -0.9495288 0.31368 0 -0.9495288 0.31368 0 -0.9495288 0.31368 0 -0.9495288 0.2429768 0 -0.970032 0.2429776 0 -0.9700319 0.2429785 0 -0.9700316 0.2429776 0 -0.9700319 -0.4713971 0 -0.881921 -0.4713969 0 -0.8819212 -0.4713966 0 -0.8819213 -0.4713969 0 -0.8819212</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320Shape-textangents-array" count="260" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_320Shape-texbinormals-array" count="780">0.707108 0 0.7071056 0.7071074 0 0.7071062 0.7071068 0 0.7071068 0.7071074 0 0.7071062 0.7572091 0 0.6531726 0.7572085 0 0.6531733 0.7572078 0 0.6531742 0.7572085 0 0.6531734 -0.2902841 0 -0.9569405 -0.2902855 0 -0.9569401 -0.290287 0 -0.9569398 -0.2902855 0 -0.9569401 -0.3598948 0 -0.9329929 -0.3598973 0 -0.932992 -0.3598998 0 -0.932991 -0.3598973 0 -0.932992 -0.4275497 0 -0.903992 -0.4275531 0 -0.9039904 -0.4275565 0 -0.9039888 -0.427553 0 -0.9039903 -0.07356643 0 -0.9972904 -0.07356525 0 -0.9972905 -0.07356406 0 -0.9972905 -0.07356525 0 -0.9972905 -0.14673 0 -0.9891767 -0.1467312 0 -0.9891765 -0.1467324 0 -0.9891763 -0.1467312 0 -0.9891765 -0.2191018 0 -0.9757021 -0.219103 0 -0.9757018 -0.2191042 0 -0.9757015 -0.219103 0 -0.9757018 0.5555725 0 -0.8314682 0.5555711 0 -0.8314691 0.5555698 0 -0.83147 0.5555711 0 -0.8314691 0.4929009 0 -0.8700855 0.4928977 0 -0.8700873 0.4928945 0 -0.8700892 0.4928977 0 -0.8700873 0.4275497 0 -0.9039919 0.427553 0 -0.9039903 0.4275564 0 -0.9039887 0.4275531 0 -0.9039904 0.7242472 0 -0.6895406 0.7242465 0 -0.6895411 0.724246 0 -0.6895418 0.7242465 0 -0.6895411 0.6715599 0 -0.7409503 0.6715595 0 -0.7409506 0.6715592 0 -0.740951 0.6715596 0 -0.7409506 0.6152291 0 -0.7883484 0.6152303 0 -0.7883476 0.6152312 0 -0.7883468 0.6152302 0 -0.7883475 -0.9142104 0 0.4052402 -0.9142097 0 0.4052417 -0.9142089 0 0.4052433 -0.9142096 0 0.4052417 0.8932236 0 -0.4496129 0.8932232 0 -0.4496136 0.8932229 0 -0.4496143 0.8932233 0 -0.4496136 0.857728 0 -0.5141039 0.8577287 0 -0.5141028 0.8577294 0 -0.5141016 0.8577287 0 -0.5141028 0.8175843 0 -0.5758089 0.8175849 0 -0.5758081 0.8175855 0 -0.5758074 0.8175849 0 -0.5758081 0.7730103 0 -0.6343936 0.7730117 0 -0.6343918 0.7730133 0 -0.6343899 0.7730117 0 -0.6343918 0.9700321 0 -0.2429768 0.9700319 0 -0.2429777 0.9700317 0 -0.2429785 0.970032 0 -0.2429777 0.9495288 0 -0.31368 0.9495288 0 -0.31368 0.9495288 0 -0.31368 0.9495288 0 -0.31368 0.9238786 0 -0.3826859 0.9238791 0 -0.3826847 0.9238796 0 -0.3826835 0.9238791 0 -0.3826847 -0.6715599 0 -0.7409503 -0.6715596 0 -0.7409506 -0.6715592 0 -0.7409509 -0.6715595 0 -0.7409506 -0.7242472 0 -0.6895406 -0.7242465 0 -0.6895411 -0.724246 0 -0.6895418 -0.7242465 0 -0.6895411 -0.7730103 0 -0.6343937 -0.7730117 0 -0.6343918 -0.7730134 0 -0.6343899 -0.7730117 0 -0.6343918 -0.8175843 0 -0.5758089 -0.8175849 0 -0.5758081 -0.8175855 0 -0.5758074 -0.8175849 0 -0.5758081 -0.4929008 0 -0.8700855 -0.4928977 0 -0.8700874 -0.4928944 0 -0.8700892 -0.4928977 0 -0.8700874 -0.5555725 0 -0.8314682 -0.5555711 0 -0.8314691 -0.5555698 0 -0.83147 -0.5555711 0 -0.8314691 -0.6152292 0 -0.7883484 -0.6152302 0 -0.7883475 -0.6152312 0 -0.7883468 -0.6152303 0 -0.7883476 -0.9637758 0 0.266714 -0.9637761 0 0.266713 -0.9637764 0 0.2667121 -0.9637761 0 0.266713 -0.9415433 0 0.3368921 -0.9415431 0 0.3368926 -0.9415429 0 0.3368932 -0.9415432 0 0.3368926 -0.9924797 0 0.1224089 -0.9924798 0 0.122409 -0.9924797 0 0.1224091 -0.9924797 0 0.122409 -0.9807857 0 0.1950886 -0.9807855 0 0.1950896 -0.9807853 0 0.1950906 -0.9807855 0 0.1950896 0.14673 0 -0.9891767 0.1467312 0 -0.9891765 0.1467324 0 -0.9891763 0.1467312 0 -0.9891765 0.07356643 0 -0.9972904 0.07356525 0 -0.9972905 0.07356407 0 -0.9972906 0.07356524 0 -0.9972904 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.3598948 0 -0.9329929 0.3598973 0 -0.932992 0.3598998 0 -0.9329911 0.3598973 0 -0.932992 0.2902841 0 -0.9569405 0.2902855 0 -0.9569402 0.290287 0 -0.9569397 0.2902855 0 -0.9569402 0.2191018 0 -0.9757021 0.219103 0 -0.9757018 0.2191042 0 -0.9757015 0.219103 0 -0.9757018 0.9142104 0 0.4052402 0.9142097 0 0.4052417 0.9142089 0 0.4052432 0.9142097 0 0.4052417 0.9415433 0 0.336892 0.9415432 0 0.3368926 0.9415429 0 0.3368932 0.9415432 0 0.3368926 0.9637758 0 0.266714 0.9637761 0 0.266713 0.9637764 0 0.2667121 0.9637761 0 0.266713 0.8032078 0 0.5956991 0.8032075 0 0.5956995 0.8032072 0 0.5956998 0.8032075 0 0.5956995 0.8448526 0 0.5349993 0.8448535 0 0.5349978 0.8448544 0 0.5349964 0.8448535 0 0.5349979 0.8819211 0 0.4713971 0.8819213 0 0.4713969 0.8819214 0 0.4713966 0.8819212 0 0.4713969 0.9996988 0 -0.02454284 0.9996988 0 -0.02454286 0.9996988 0 -0.02454287 0.9996988 0 -0.02454286 0.9951847 0 -0.09801869 0.9951849 0 -0.0980161 0.9951851 0 -0.0980135 0.9951849 0 -0.0980161 0.9852774 0 -0.1709631 0.9852772 0 -0.1709642 0.9852771 0 -0.1709653 0.9852772 0 -0.1709642 0.9807856 0 0.1950885 0.9807855 0 0.1950896 0.9807853 0 0.1950906 0.9807855 0 0.1950896 0.9924798 0 0.1224089 0.9924797 0 0.122409 0.9924797 0 0.1224091 0.9924797 0 0.122409 0.9987956 0 0.04906645 0.9987956 0 0.04906651 0.9987956 0 0.04906657 0.9987956 0 0.04906651 -0.8448526 0 0.5349993 -0.8448535 0 0.5349979 -0.8448544 0 0.5349964 -0.8448535 0 0.5349978 -0.8032078 0 0.5956991 -0.8032075 0 0.5956995 -0.8032072 0 0.5956998 -0.8032075 0 0.5956995 -0.7572091 0 0.6531726 -0.7572085 0 0.6531733 -0.7572078 0 0.6531741 -0.7572085 0 0.6531733 -0.707108 0 0.7071056 -0.7071074 0 0.7071062 -0.7071068 0 0.7071068 -0.7071074 0 0.7071062 -0.9852774 0 -0.1709631 -0.9852773 0 -0.1709642 -0.9852771 0 -0.1709652 -0.9852773 0 -0.1709642 -0.9951847 0 -0.09801869 -0.9951849 0 -0.0980161 -0.9951851 0 -0.0980135 -0.9951849 0 -0.0980161 -0.9996988 0 -0.02454284 -0.9996988 0 -0.02454286 -0.9996988 0 -0.02454287 -0.9996988 0 -0.02454286 -0.9987956 0 0.04906645 -0.9987956 0 0.04906651 -0.9987956 0 0.04906657 -0.9987956 0 0.04906651 -0.8577279 0 -0.5141038 -0.8577287 0 -0.5141028 -0.8577294 0 -0.5141016 -0.8577287 0 -0.5141028 -0.8932236 0 -0.4496129 -0.8932233 0 -0.4496136 -0.8932228 0 -0.4496143 -0.8932232 0 -0.4496136 -0.9238786 0 -0.382686 -0.9238791 0 -0.3826847 -0.9238796 0 -0.3826835 -0.9238791 0 -0.3826847 -0.9495288 0 -0.31368 -0.9495288 0 -0.31368 -0.9495288 0 -0.31368 -0.9495288 0 -0.31368 -0.9700321 0 -0.2429768 -0.9700319 0 -0.2429777 -0.9700317 0 -0.2429785 -0.970032 0 -0.2429777 -0.8819211 0 0.4713971 -0.8819213 0 0.4713969 -0.8819214 0 0.4713966 -0.8819213 0 0.4713969</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320Shape-texbinormals-array" count="260" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_320Shape-vertices" name="qt_gauge_tickmarks_320Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_320Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_320Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_320Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_320Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="130">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_320Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_320Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_320Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_320Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66 68 68 68 69 69 69 70 71 71 70 71 71 69 69 69 71 70 70 72 72 72 73 73 73 74 75 75 74 75 75 73 73 73 75 74 74 76 76 76 77 77 77 78 79 79 78 79 79 77 77 77 79 78 78 80 80 80 81 81 81 82 83 83 82 83 83 81 81 81 83 82 82 84 84 84 85 85 85 86 87 87 86 87 87 85 85 85 87 86 86 88 88 88 89 89 89 90 91 91 90 91 91 89 89 89 91 90 90 92 92 92 93 93 93 94 95 95 94 95 95 93 93 93 95 94 94 96 96 96 97 97 97 98 99 99 98 99 99 97 97 97 99 98 98 100 100 100 101 101 101 102 103 103 102 103 103 101 101 101 103 102 102 104 104 104 105 105 105 106 107 107 106 107 107 105 105 105 107 106 106 108 108 108 109 109 109 110 111 111 110 111 111 109 109 109 111 110 110 112 112 112 113 113 113 114 115 115 114 115 115 113 113 113 115 114 114 116 116 116 117 117 117 118 119 119 118 119 119 117 117 117 119 118 118 120 120 120 121 121 121 122 123 123 122 123 123 121 121 121 123 122 122 124 124 124 125 125 125 126 127 127 126 127 127 125 125 125 127 126 126 128 128 128 129 129 129 130 131 131 130 131 131 129 129 129 131 130 130 132 132 132 133 133 133 134 135 135 134 135 135 133 133 133 135 134 134 136 136 136 137 137 137 138 139 139 138 139 139 137 137 137 139 138 138 140 140 140 141 141 141 142 143 143 142 143 143 141 141 141 143 142 142 144 144 144 145 145 145 146 147 147 146 147 147 145 145 145 147 146 146 148 148 148 149 149 149 150 151 151 150 151 151 149 149 149 151 150 150 152 152 152 153 153 153 154 155 155 154 155 155 153 153 153 155 154 154 156 156 156 157 157 157 158 159 159 158 159 159 157 157 157 159 158 158 160 160 160 161 161 161 162 163 163 162 163 163 161 161 161 163 162 162 164 164 164 165 165 165 166 167 167 166 167 167 165 165 165 167 166 166 168 168 168 169 169 169 170 171 171 170 171 171 169 169 169 171 170 170 172 172 172 173 173 173 174 175 175 174 175 175 173 173 173 175 174 174 176 176 176 177 177 177 178 179 179 178 179 179 177 177 177 179 178 178 180 180 180 181 181 181 182 183 183 182 183 183 181 181 181 183 182 182 184 184 184 185 185 185 186 187 187 186 187 187 185 185 185 187 186 186 188 188 188 189 189 189 190 191 191 190 191 191 189 189 189 191 190 190 192 192 192 193 193 193 194 195 195 194 195 195 193 193 193 195 194 194 196 196 196 197 197 197 198 199 199 198 199 199 197 197 197 199 198 198 200 200 200 201 201 201 202 203 203 202 203 203 201 201 201 203 202 202 204 204 204 205 205 205 206 207 207 206 207 207 205 205 205 207 206 206 208 208 208 209 209 209 210 211 211 210 211 211 209 209 209 211 210 210 212 212 212 213 213 213 214 215 215 214 215 215 213 213 213 215 214 214 216 216 216 217 217 217 218 219 219 218 219 219 217 217 217 219 218 218 220 220 220 221 221 221 222 223 223 222 223 223 221 221 221 223 222 222 224 224 224 225 225 225 226 227 227 226 227 227 225 225 225 227 226 226 228 228 228 229 229 229 230 231 231 230 231 231 229 229 229 231 230 230 232 232 232 233 233 233 234 235 235 234 235 235 233 233 233 235 234 234 236 236 236 237 237 237 238 239 239 238 239 239 237 237 237 239 238 238 240 240 240 241 241 241 242 243 243 242 243 243 241 241 241 243 242 242 244 244 244 245 245 245 246 247 247 246 247 247 245 245 245 247 246 246 248 248 248 249 249 249 250 251 251 250 251 251 249 249 249 251 250 250 252 252 252 253 253 253 254 255 255 254 255 255 253 253 253 255 254 254 256 256 256 257 257 257 258 259 259 258 259 259 257 257 257 259 258 258</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_320Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_320" name="qt_gauge_tickmarks_320" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_320Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_320</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_2.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_2.dae
new file mode 100644
index 0000000..a58540f
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_320_2.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:26:13</created>
+ <modified>2018-03-08T09:26:13</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_320_2Shape" name="qt_gauge_tickmarks_320_2Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_320_2Shape-positions" name="qt_gauge_tickmarks_320_2Shape-positions">
+ <float_array id="qt_gauge_tickmarks_320_2Shape-positions-array" count="2460">-9.122631 0 -3.476908 -8.893021 0 -4.031235 -11.43233 0 -4.433615 -11.20272 0 -4.987944 -7.727169 0 -5.976339 -7.346535 0 -6.440145 -9.659698 0 -7.562323 -9.27906 0 -8.026129 -5.666252 0 -7.963064 -5.16737 0 -8.296408 -7.055176 0 -10.04174 -6.556293 0 -10.37508 -8.457314 0 4.837788 -8.74015 0 4.308634 -10.66212 0 6.016279 -10.94495 0 5.487127 -9.504128 0 2.17346 -9.621185 0 1.58499 -11.95609 0 2.661184 -12.07315 0 2.072714 -6.682159 0 7.083517 -7.106422 0 6.659252 -8.449924 0 8.851282 -8.874191 0 8.427019 8.893021 0 -4.031235 9.122631 0 -3.476908 11.20272 0 -4.987944 11.43233 0 -4.433615 7.346535 0 -6.440145 7.727169 0 -5.976339 9.27906 0 -8.026129 9.659697 0 -7.562323 5.16737 0 -8.296408 5.666252 0 -7.963064 6.556295 0 -10.37508 7.055176 0 -10.04174 2.543194 0 -9.440161 3.117357 0 -9.265989 3.268906 0 -11.83251 3.843069 0 -11.65834 -3.117359 0 -9.265989 -2.543194 0 -9.440161 -3.843071 0 -11.65834 -3.268906 0 -11.83251 -0.2999992 0 -9.772909 0.2999992 0 -9.772909 -0.2999992 0 -12.27291 0.2999992 0 -12.27291 -8.551594 0 4.661404 -8.645874 0 4.485018 -10.75639 0 5.839895 -10.85067 0 5.663511 -7.771706 0 5.865482 -7.890842 0 5.70484 -9.779724 0 7.354731 -9.898865 0 7.19409 8.969557 0 -3.84646 9.046093 0 -3.661682 11.27925 0 -4.803167 11.35579 0 -4.618391 8.311443 0 -5.121183 8.414265 0 -4.949636 10.45576 0 -6.406439 10.55859 0 -6.234892 7.473413 0 -6.285543 7.600292 0 -6.130941 9.405939 0 -7.871527 9.532818 0 -7.716925 9.743164 0 0.3556232 9.733349 0 0.5553818 12.24015 0 0.4782925 12.23034 0 0.6780529 9.693249 0 -1.078093 9.712852 0 -0.8790569 12.18121 0 -1.323133 12.20082 0 -1.124098 9.433506 0 -2.488966 9.482103 0 -2.294962 11.85859 0 -3.096418 11.90718 0 -2.902411 2.734581 0 -9.382105 2.925968 0 -9.324049 3.460293 0 -11.77445 3.65168 0 -11.7164 1.331703 0 -9.682051 1.529541 0 -9.652704 1.698532 0 -12.15499 1.896366 0 -12.12565 -0.09999847 0 -9.772909 0.09999847 0 -9.772909 -0.09999847 0 -12.27291 0.09999847 0 -12.27291 8.645872 0 4.485018 8.551594 0 4.661404 10.85067 0 5.663511 10.7564 0 5.839895 9.213743 0 3.167614 9.146366 0 3.355923 11.5676 0 4.00984 11.50023 0 4.198149 9.582167 0 1.781145 9.543148 0 1.977303 12.03413 0 2.268871 11.99511 0 2.465029 6.965 0 6.800673 6.82358 0 6.942095 8.732769 0 8.568441 8.591347 0 8.709862 7.890842 0 5.70484 7.771704 0 5.865482 9.898863 0 7.19409 9.779722 0 7.354731 -1.529541 0 -9.652704 -1.331703 0 -9.682051 -1.896366 0 -12.12565 -1.698532 0 -12.15499 -2.925968 0 -9.324049 -2.734581 0 -9.382105 -3.65168 0 -11.7164 -3.460293 0 -11.77445 -4.25906 0 -8.79405 -4.078262 0 -8.87956 -5.32795 0 -11.05402 -5.147152 0 -11.13953 6.473604 0 -7.314337 6.621796 0 -7.180025 8.152504 0 -9.166716 8.300692 0 -9.0324 5.333664 0 -8.185293 5.499958 0 -8.074179 6.722588 0 -10.26397 6.888882 0 -10.15285 4.078262 0 -8.87956 4.259062 0 -8.79405 5.147152 0 -11.13953 5.32795 0 -11.05402 -9.046093 0 -3.661682 -8.969559 0 -3.84646 -11.35579 0 -4.618391 -11.27925 0 -4.803167 7.507862 0 6.197784 7.443668 0 6.274458 7.891235 0 6.518761 7.82704 0 6.595434 7.687794 0 5.973993 7.625885 0 6.052525 8.080452 0 6.283541 8.018543 0 6.362072 7.861057 0 5.745001 7.801489 0 5.825321 8.262663 0 6.04285 8.203093 0 6.123171 6.929646 0 6.836027 6.858936 0 6.90674 7.283199 0 7.189581 7.21249 0 7.260292 7.128624 0 6.628988 7.060026 0 6.70175 7.492435 0 6.971977 7.423838 0 7.044739 7.321419 0 6.416178 7.254993 0 6.490931 7.695173 0 6.748304 7.628746 0 6.823055 8.027504 0 5.511005 7.970325 0 5.593046 8.437704 0 5.796898 8.380526 0 5.878939 8.186985 0 5.272211 8.132248 0 5.355898 8.605427 0 5.5459 8.55069 0 5.629589 8.339367 0 5.028822 8.287117 0 5.114084 8.765686 0 5.290071 8.713436 0 5.375334 8.875328 0 4.013617 8.833464 0 4.104433 9.329399 0 4.222948 9.287533 0 4.313761 8.990349 0 3.750505 8.951176 0 3.842512 9.450388 0 3.946373 9.411213 0 4.038382 9.097569 0 3.484119 9.061123 0 3.57724 9.563177 0 3.666353 9.52673 0 3.759476 8.484514 0 4.781052 8.434797 0 4.867817 8.918343 0 5.029633 8.868626 0 5.1164 8.622303 0 4.529116 8.575161 0 4.617308 9.063263 0 4.764814 9.016123 0 4.853006 8.752613 0 4.27323 8.70809 0 4.362772 9.200321 0 4.49584 9.1558 0 4.585382 9.446716 0 2.390505 9.421467 0 2.487265 9.930515 0 2.516752 9.905266 0 2.613512 9.513689 0 2.111271 9.491301 0 2.208733 10.001 0 2.223213 9.978607 0 2.320677 9.572411 0 1.830185 9.552902 0 1.928263 10.0628 0 1.927729 10.04329 0 2.025808 9.196899 0 3.214691 9.16321 0 3.308846 9.667671 0 3.383137 9.633982 0 3.477291 9.288252 0 2.942455 9.257351 0 3.037561 9.763781 0 3.096964 9.73288 0 3.19207 9.371548 0 2.667646 9.34346 0 2.763622 9.851421 0 2.808084 9.823332 0 2.90406 9.622829 0 1.547491 9.606216 0 1.646101 10.11588 0 1.630552 10.09927 0 1.729162 9.664902 0 1.263433 9.651201 0 1.36249 10.16019 0 1.331942 10.14648 0 1.430998 9.698591 0 0.9782619 9.687813 0 1.077681 10.19568 0 1.032154 10.1849 0 1.131571 9.723866 0 0.6922226 9.716021 0 0.791914 10.22232 0 0.7314529 10.21448 0 0.8311443 9.740709 0 0.4055614 9.735802 0 0.5054417 10.24011 0 0.4300976 10.2352 0 0.5299759 9.749104 0 0.1185303 9.747139 0 0.2185116 10.24901 0 0.1283474 10.24704 0 0.2283287 9.749039 0 -0.1686249 9.750021 0 -0.06862831 10.24902 0 -0.1735325 10.25 0 -0.07353783 9.664335 0 -1.31349 9.677065 0 -1.214304 10.16027 0 -1.377131 10.173 0 -1.277945 9.622139 0 -1.597528 9.637783 0 -1.498758 10.11598 0 -1.675745 10.13163 0 -1.576975 9.571596 0 -1.880199 9.590141 0 -1.781933 10.06292 0 -1.972925 10.08147 0 -1.87466 9.74052 0 -0.4556522 9.744446 0 -0.3557281 10.24013 0 -0.4752808 10.24406 0 -0.3753605 9.723551 0 -0.7423038 9.730419 0 -0.64254 10.22237 0 -0.7766399 10.22924 0 -0.6768761 9.698151 0 -1.028334 9.707951 0 -0.9288139 10.19574 0 -1.077341 10.20554 0 -0.9778233 9.512753 0 -2.161261 9.534184 0 -2.063583 10.00113 0 -2.268415 10.02257 0 -2.170738 9.445656 0 -2.440466 9.469954 0 -2.343462 9.930672 0 -2.561956 9.954969 0 -2.464952 9.370367 0 -2.717575 9.397511 0 -2.621328 9.851595 0 -2.853294 9.878738 0 -2.75705 9.286949 0 -2.992346 9.316916 0 -2.89694 9.763971 0 -3.142178 9.793938 0 -3.046774 9.195477 0 -3.264542 9.228241 0 -3.170061 9.667881 0 -3.428358 9.700644 0 -3.333876 9.096029 0 -3.533926 9.131561 0 -3.440451 9.563404 0 -3.711582 9.598934 0 -3.618107 8.988691 0 -3.800264 9.026958 0 -3.707876 9.450632 0 -3.991606 9.488899 0 -3.899218 8.873558 0 -4.063326 8.914528 0 -3.972105 9.329662 0 -4.26819 9.370634 0 -4.17697 8.750725 0 -4.322886 8.794367 0 -4.23291 9.2006 0 -4.54109 9.24424 0 -4.451115 8.184662 0 -5.321617 8.238575 0 -5.237394 8.60577 0 -5.591185 8.659683 0 -5.506964 8.025074 0 -5.560343 8.081446 0 -5.477745 8.438063 0 -5.842196 8.494432 0 -5.759596 7.858526 0 -5.794264 7.917305 0 -5.713362 8.263035 0 -6.088156 8.321814 0 -6.007254 8.620304 0 -4.578712 8.666576 0 -4.490061 9.063557 0 -4.81007 9.109829 0 -4.72142 8.482405 0 -4.830589 8.531267 0 -4.74334 8.918653 0 -5.0749 8.967516 0 -4.98765 8.337151 0 -5.078295 8.388559 0 -4.992523 8.766014 0 -5.335348 8.817423 0 -5.249575 7.685162 0 -6.02318 7.746298 0 -5.944044 8.080841 0 -6.328859 8.141975 0 -6.249723 7.505133 0 -6.246893 7.568571 0 -6.169592 7.891638 0 -6.564089 7.955076 0 -6.486788 7.318592 0 -6.465204 7.384281 0 -6.389807 7.695589 0 -6.793646 7.761276 0 -6.718245 7.125704 0 -6.677931 7.193584 0 -6.604498 7.492867 0 -7.017328 7.560745 0 -6.943899 6.926636 0 -6.884886 6.996649 0 -6.813482 7.283642 0 -7.234949 7.353657 0 -7.163549 6.721558 0 -7.085882 6.793644 0 -7.016577 7.068104 0 -7.44631 7.140188 0 -7.377001 6.510651 0 -7.28076 6.584747 0 -7.213602 6.846432 0 -7.651236 6.920527 0 -7.584078 5.612453 0 -7.995695 5.69393 0 -7.937716 5.902361 0 -8.40307 5.983837 0 -8.345091 5.375237 0 -8.157515 5.458384 0 -8.101957 5.653021 0 -8.573248 5.736168 0 -8.517691 5.133354 0 -8.312277 5.218103 0 -8.259192 5.398777 0 -8.736013 5.483524 0 -8.682928 6.294098 0 -7.469336 6.370138 0 -7.404394 6.618822 0 -7.849539 6.694862 0 -7.784597 6.072084 0 -7.651457 6.150005 0 -7.588781 6.385471 0 -8.041059 6.46339 0 -7.97838 5.844803 0 -7.82696 5.924538 0 -7.766607 6.146584 0 -8.225622 6.226315 0 -8.165266 4.123463 0 -8.858183 4.213861 0 -8.815424 4.33724 0 -9.310175 4.427639 0 -9.26742 3.861492 0 -8.975775 3.95311 0 -8.935705 4.061867 0 -9.433874 4.153484 0 -9.393797 3.596172 0 -9.085608 3.688931 0 -9.048246 3.782969 0 -9.549406 3.875729 0 -9.512045 4.887024 0 -8.459852 4.973297 0 -8.409285 5.139851 0 -8.891218 5.226124 0 -8.840651 4.636452 0 -8.600103 4.724174 0 -8.552099 4.876467 0 -9.038729 4.964191 0 -8.990728 4.381857 0 -8.73292 4.470959 0 -8.687521 4.608852 0 -9.178423 4.697952 0 -9.133024 2.506039 0 -9.445475 2.602547 0 -9.419275 2.637028 0 -9.928011 2.733536 0 -9.901815 2.227474 0 -9.515184 2.324711 0 -9.491842 2.344196 0 -10.00137 2.441433 0 -9.978025 1.946976 0 -9.576666 2.044861 0 -9.556196 2.049332 0 -10.06608 2.147213 0 -10.0456 3.327732 0 -9.187578 3.421551 0 -9.152967 3.50079 0 -9.656675 3.59461 0 -9.622061 3.056406 0 -9.281599 3.151203 0 -9.249765 3.215576 0 -9.75559 3.310373 0 -9.723753 2.782429 0 -9.36759 2.878124 0 -9.33856 2.92757 0 -9.84606 3.023266 0 -9.817034 1.664791 0 -9.629858 1.763237 0 -9.612276 1.752689 0 -10.12207 1.851131 0 -10.10449 1.381165 0 -9.674715 1.48008 0 -9.66004 1.454529 0 -10.1693 1.553448 0 -10.15463 1.096336 0 -9.711203 1.195644 0 -9.69945 1.155106 0 -10.20774 1.25441 0 -10.19598 0.8105583 0 -9.739286 0.9101677 0 -9.730463 0.8546791 0 -10.23733 0.9542885 0 -10.22851 0.5240784 0 -9.75894 0.6239052 0 -9.753054 0.5535126 0 -10.25807 0.6533394 0 -10.25219 0.2371407 0 -9.770151 0.3370972 0 -9.767206 0.2518654 0 -10.26993 0.3518219 0 -10.26699 -0.04999924 0 -9.772909 0.04999924 0 -9.772909 -0.04999924 0 -10.27291 0.04999924 0 -10.27291 -1.195644 0 -9.69945 -1.096336 0 -9.711203 -1.25441 0 -10.19598 -1.155106 0 -10.20774 -1.48008 0 -9.66004 -1.381165 0 -9.674715 -1.553448 0 -10.15463 -1.454529 0 -10.1693 -1.763237 0 -9.612276 -1.664791 0 -9.629858 -1.851131 0 -10.10449 -1.752689 0 -10.12207 -0.3370972 0 -9.767206 -0.2371407 0 -9.770151 -0.3518219 0 -10.26699 -0.2518654 0 -10.26993 -0.6239052 0 -9.753054 -0.5240784 0 -9.75894 -0.6533394 0 -10.25219 -0.5535126 0 -10.25807 -0.9101677 0 -9.730463 -0.8105583 0 -9.739286 -0.9542885 0 -10.22851 -0.8546791 0 -10.23733 -2.878124 0 -9.33856 -2.782429 0 -9.36759 -3.023266 0 -9.817034 -2.92757 0 -9.84606 -3.151203 0 -9.249765 -3.056404 0 -9.281599 -3.310371 0 -9.723753 -3.215576 0 -9.75559 -3.421551 0 -9.152967 -3.327732 0 -9.187578 -3.594608 0 -9.622061 -3.50079 0 -9.656675 -2.044861 0 -9.556196 -1.946976 0 -9.576666 -2.147213 0 -10.0456 -2.049332 0 -10.06608 -2.324711 0 -9.491842 -2.227474 0 -9.515184 -2.441433 0 -9.978025 -2.344196 0 -10.00137 -2.602547 0 -9.419275 -2.506039 0 -9.445475 -2.733536 0 -9.901815 -2.637028 0 -9.928011 -3.688931 0 -9.048246 -3.596172 0 -9.085608 -3.875729 0 -9.512045 -3.78297 0 -9.549406 -3.95311 0 -8.935705 -3.861492 0 -8.975775 -4.153484 0 -9.393797 -4.061867 0 -9.433874 -4.21386 0 -8.815424 -4.123463 0 -8.858183 -4.427639 0 -9.26742 -4.337242 0 -9.310175 -5.218102 0 -8.259192 -5.133354 0 -8.312277 -5.483524 0 -8.682928 -5.398777 0 -8.736013 -5.458382 0 -8.101957 -5.375237 0 -8.157515 -5.736168 0 -8.517691 -5.653023 0 -8.573248 -5.693932 0 -7.937716 -5.612453 0 -7.995695 -5.983837 0 -8.345091 -5.902363 0 -8.40307 -5.924538 0 -7.766607 -5.844803 0 -7.82696 -6.226315 0 -8.165266 -6.146584 0 -8.225622 -4.470959 0 -8.687521 -4.381859 0 -8.73292 -4.697952 0 -9.133024 -4.608852 0 -9.178423 -4.724174 0 -8.552099 -4.636452 0 -8.600103 -4.964191 0 -8.990728 -4.876465 0 -9.038729 -4.973297 0 -8.409285 -4.887024 0 -8.459852 -5.226124 0 -8.840651 -5.139851 0 -8.891218 -6.150005 0 -7.588781 -6.072083 0 -7.651457 -6.46339 0 -7.97838 -6.385471 0 -8.041059 -6.37014 0 -7.404394 -6.294098 0 -7.469336 -6.694862 0 -7.784597 -6.61882 0 -7.849539 -6.584747 0 -7.213602 -6.510651 0 -7.28076 -6.920525 0 -7.584078 -6.846432 0 -7.651236 -7.384281 0 -6.389807 -7.318592 0 -6.465204 -7.761276 0 -6.718245 -7.695587 0 -6.793646 -7.568573 0 -6.169592 -7.505135 0 -6.246893 -7.955078 0 -6.486788 -7.891636 0 -6.564089 -7.7463 0 -5.944044 -7.685162 0 -6.02318 -8.141975 0 -6.249723 -8.080841 0 -6.328859 -6.793644 0 -7.016577 -6.721558 0 -7.085882 -7.14019 0 -7.377001 -7.068104 0 -7.44631 -6.996651 0 -6.813482 -6.926636 0 -6.884886 -7.353657 0 -7.163549 -7.283642 0 -7.234949 -7.193584 0 -6.604498 -7.125702 0 -6.677931 -7.560745 0 -6.943899 -7.492867 0 -7.017328 -8.388557 0 -4.992523 -8.337151 0 -5.078295 -8.817421 0 -5.249575 -8.766014 0 -5.335348 -8.531265 0 -4.74334 -8.482407 0 -4.830589 -8.967514 0 -4.98765 -8.918655 0 -5.0749 -8.666576 0 -4.490061 -8.620304 0 -4.578712 -9.109829 0 -4.72142 -9.063557 0 -4.81007 -7.917305 0 -5.713362 -7.858524 0 -5.794264 -8.321815 0 -6.007254 -8.263035 0 -6.088156 -8.081444 0 -5.477745 -8.025074 0 -5.560343 -8.494431 0 -5.759596 -8.438065 0 -5.842196 -8.238575 0 -5.237394 -8.184662 0 -5.321617 -8.659683 0 -5.506964 -8.60577 0 -5.591185 -9.131561 0 -3.440451 -9.096031 0 -3.533926 -9.598934 0 -3.618107 -9.563404 0 -3.711582 -9.228241 0 -3.170061 -9.195477 0 -3.264542 -9.700645 0 -3.333876 -9.667881 0 -3.428358 -9.316917 0 -2.89694 -9.286949 0 -2.992346 -9.793938 0 -3.046774 -9.763969 0 -3.142178 -8.794365 0 -4.23291 -8.750725 0 -4.322886 -9.24424 0 -4.451115 -9.2006 0 -4.54109 -8.914528 0 -3.972105 -8.873558 0 -4.063326 -9.370636 0 -4.17697 -9.329662 0 -4.26819 -9.026958 0 -3.707876 -8.988693 0 -3.800264 -9.488899 0 -3.899218 -9.45063 0 -3.991606 -9.397511 0 -2.621328 -9.370369 0 -2.717575 -9.878738 0 -2.75705 -9.851593 0 -2.853294 -9.469955 0 -2.343462 -9.445656 0 -2.440466 -9.954971 0 -2.464952 -9.930672 0 -2.561956 -9.534184 0 -2.063583 -9.512753 0 -2.161261 -10.02257 0 -2.170738 -10.00114 0 -2.268415 -9.590141 0 -1.781933 -9.571594 0 -1.880199 -10.08147 0 -1.87466 -10.06292 0 -1.972925 -9.730419 0 -0.64254 -9.723549 0 -0.7423038 -10.22924 0 -0.6768761 -10.22237 0 -0.7766399 -9.744446 0 -0.3557281 -9.74052 0 -0.4556522 -10.24406 0 -0.3753605 -10.24014 0 -0.4752808 -9.750023 0 -0.06862831 -9.749039 0 -0.1686249 -10.25 0 -0.07353783 -10.24902 0 -0.1735325 -9.637783 0 -1.498758 -9.622139 0 -1.597528 -10.13163 0 -1.576975 -10.11598 0 -1.675745 -9.677063 0 -1.214304 -9.664337 0 -1.31349 -10.173 0 -1.277945 -10.16027 0 -1.377131 -9.707951 0 -0.9288139 -9.698151 0 -1.028334 -10.20554 0 -0.9778233 -10.19574 0 -1.077341 -9.687813 0 1.077681 -9.698593 0 0.9782619 -10.1849 0 1.131571 -10.19568 0 1.032154 -9.651199 0 1.36249 -9.664902 0 1.263433 -10.14648 0 1.430998 -10.16019 0 1.331942 -9.606216 0 1.646101 -9.622829 0 1.547491 -10.09927 0 1.729162 -10.11588 0 1.630552 -9.747139 0 0.2185116 -9.749104 0 0.1185303 -10.24704 0 0.2283287 -10.24901 0 0.1283474 -9.716019 0 0.791914 -9.723866 0 0.6922226 -10.21448 0 0.8311443 -10.22232 0 0.7314529 -9.34346 0 2.763622 -9.371548 0 2.667646 -9.823334 0 2.90406 -9.851421 0 2.808084 -9.257351 0 3.037561 -9.288254 0 2.942455 -9.73288 0 3.19207 -9.763779 0 3.096964 -9.491302 0 2.208733 -9.513687 0 2.111271 -9.978607 0 2.320677 -10.001 0 2.223213 -9.421467 0 2.487265 -9.446716 0 2.390505 -9.905266 0 2.613512 -9.930515 0 2.516752 -8.708092 0 4.362772 -8.752613 0 4.27323 -9.1558 0 4.585382 -9.200321 0 4.49584 -8.575161 0 4.617308 -8.622303 0 4.529116 -9.016121 0 4.853006 -9.063263 0 4.764814 -8.434799 0 4.867817 -8.484512 0 4.781052 -8.868626 0 5.1164 -8.918343 0 5.029633 -9.061123 0 3.57724 -9.097569 0 3.484119 -9.52673 0 3.759476 -9.563179 0 3.666353 -8.951176 0 3.842512 -8.990349 0 3.750505 -9.411213 0 4.038382 -9.450386 0 3.946373 -8.833466 0 4.104433 -8.875328 0 4.013617 -9.287533 0 4.313761 -9.329399 0 4.222948 -7.801491 0 5.825321 -7.861057 0 5.745001 -8.203094 0 6.123171 -8.262665 0 6.04285 -7.625885 0 6.052525 -7.687794 0 5.973993 -8.018543 0 6.362072 -8.080452 0 6.283541 -7.443668 0 6.274458 -7.507862 0 6.197784 -7.827042 0 6.595434 -7.891235 0 6.518761 -8.287117 0 5.114084 -8.339367 0 5.028822 -8.713436 0 5.375334 -8.765686 0 5.290071 -8.132248 0 5.355898 -8.186985 0 5.272211 -8.55069 0 5.629589 -8.605427 0 5.5459 -7.970325 0 5.593046 -8.027504 0 5.511005 -8.380524 0 5.878939 -8.437706 0 5.796898 -7.254993 0 6.490931 -7.321419 0 6.416178 -7.628746 0 6.823055 -7.695175 0 6.748304 -7.060028 0 6.70175 -7.128624 0 6.628988 -7.423836 0 7.044739 -7.492435 0 6.971977 -8.414265 0 -4.949636 -8.311443 0 -5.121183 -10.55859 0 -6.234892 -10.45576 0 -6.406439 -7.600292 0 -6.130941 -7.473412 0 -6.285543 -9.532818 0 -7.716925 -9.405937 0 -7.871527 -6.621796 0 -7.180025 -6.473602 0 -7.314337 -8.30069 0 -9.0324 -8.152504 0 -9.166716 -5.499958 0 -8.074179 -5.333664 0 -8.185293 -6.888882 0 -10.15285 -6.722588 0 -10.26397 -9.733349 0 0.5553818 -9.743164 0 0.3556232 -12.23034 0 0.6780529 -12.24015 0 0.4782925 -9.482101 0 -2.294962 -9.433506 0 -2.488966 -11.90718 0 -2.902411 -11.85859 0 -3.096418 -9.712852 0 -0.8790569 -9.693249 0 -1.078093 -12.20081 0 -1.124098 -12.18121 0 -1.323133 -9.146366 0 3.355923 -9.213745 0 3.167614 -11.50023 0 4.198149 -11.5676 0 4.00984 -9.732456 0 -0.6800194 -9.673645 0 -1.277128 -12.22042 0 -0.9250603 -12.16161 0 -1.522173 7.106422 0 6.659252 6.682159 0 7.083517 8.874191 0 8.427019 8.449924 0 8.851282 8.74015 0 4.308634 8.457314 0 4.837788 10.94495 0 5.487127 10.66212 0 6.016279 9.621183 0 1.58499 9.504129 0 2.17346 12.07315 0 2.072714 11.95609 0 2.661184 9.673645 0 -1.277128 9.732456 0 -0.6800194 12.16161 0 -1.522173 12.22042 0 -0.9250603</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320_2Shape-positions-array" count="820" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320_2Shape-normals" name="qt_gauge_tickmarks_320_2Shape-normals">
+ <float_array id="qt_gauge_tickmarks_320_2Shape-normals-array" count="2460">0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320_2Shape-normals-array" count="820" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320_2Shape-tangents" name="qt_gauge_tickmarks_320_2Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_320_2Shape-tangents-array" count="2460">0.3826833 0 -0.9238796 -0.9238791 0 -0.3826844 0.9238818 0 0.3826778 -0.3826834 0 0.9238796 0.6343926 0 -0.773011 -0.7730117 0 -0.6343917 0.7730086 0 0.6343955 -0.6343934 0 0.7730104 0.83147 0 -0.5555696 -0.5555714 0 -0.8314688 0.5555714 0 0.8314688 -0.83147 0 0.5555696 -0.4713966 0 -0.8819213 -0.8819224 0 0.4713945 0.8819217 0 -0.4713959 0.4713972 0 0.881921 -0.1950896 0 -0.9807854 -0.9807841 0 0.1950963 0.9807853 0 -0.1950902 0.1950899 0 0.9807854 -0.7071068 0 -0.7071068 -0.7071084 0 0.7071052 0.7071036 0 -0.70711 0.7071064 0 0.7071072 0.3826836 0 0.9238794 0.9238791 0 -0.3826844 -0.9238796 0 0.3826833 -0.382683 0 -0.9238797 0.6343934 0 0.7730104 0.7730117 0 -0.6343917 -0.7730102 0 0.6343936 -0.634393 0 -0.7730107 0.8314697 0 0.5555702 0.5555714 0 -0.8314688 -0.5555729 0 0.8314679 -0.83147 0 -0.5555696 0.9569404 0 0.2902845 0.290286 0 -0.9569399 -0.290286 0 0.9569399 -0.9569404 0 -0.2902845 0.9569404 0 -0.2902845 -0.2902851 0 -0.9569402 0.2902851 0 0.9569402 -0.9569404 0 0.2902845 1 0 0 0 0 -1 0 0 1 -1 0 0 -0.4713972 0 -0.881921 -0.8819212 0 0.4713968 0.8819191 0 -0.4714008 0.4713978 0 0.8819207 -0.5956994 0 -0.8032075 -0.8032168 0 0.5956868 0.8032043 0 -0.5957037 0.5956991 0 0.8032077 0.382683 0 0.9238797 0.9238821 0 -0.3826772 -0.9238774 0 0.3826887 -0.3826834 0 -0.9238796 0.5141023 0 0.8577289 0.8577284 0 -0.514103 -0.8577284 0 0.514103 -0.5141023 0 -0.8577289 0.6343934 0 0.7730104 0.7730102 0 -0.6343936 -0.7730102 0 0.6343936 -0.6343934 0 -0.7730104 -0.04906773 0 0.9987955 0.998795 0 0.0490762 -0.9987955 0 -0.04906622 0.04906846 0 -0.9987954 0.09801633 0 0.9951848 0.9951845 0 -0.09801927 -0.9951845 0 0.09801927 -0.09801633 0 -0.9951848 0.2429808 0 0.9700311 0.9700291 0 -0.2429889 -0.9700324 0 0.2429754 -0.2429795 0 -0.9700314 0.9569403 0 0.2902849 0.2902811 0 -0.9569414 -0.2902811 0 0.9569414 -0.9569403 0 -0.2902849 0.9891764 0 0.1467315 0.1467305 0 -0.9891765 -0.1467332 0 0.9891761 -0.9891766 0 -0.14673 1 0 0 0 0 -1 0 0 1 -1 0 0 -0.4713975 0 0.8819208 0.8819252 0 0.4713894 -0.8819231 0 -0.4713934 0.4713969 0 -0.8819212 -0.3368903 0 0.9415439 0.9415454 0 0.3368861 -0.9415424 0 -0.3368946 0.3368905 0 -0.9415438 -0.1950905 0 0.9807853 0.9807848 0 0.1950927 -0.9807848 0 -0.1950927 0.1950905 0 -0.9807853 -0.7071068 0 0.7071068 0.7071115 0 0.707102 -0.707102 0 -0.7071115 0.7071068 0 -0.7071068 -0.5956995 0 0.8032074 0.8032122 0 0.5956929 -0.8032043 0 -0.5957037 0.5956994 0 -0.8032075 0.9891766 0 -0.14673 -0.1467305 0 -0.9891765 0.1467332 0 0.9891761 -0.9891764 0 0.1467315 0.9569403 0 -0.2902849 -0.2902811 0 -0.9569414 0.2902811 0 0.9569414 -0.9569403 0 0.2902849 0.9039889 0 -0.427556 -0.4275525 0 -0.9039905 0.4275525 0 0.9039905 -0.9039889 0 0.427556 0.7409508 0 0.6715593 0.6715556 0 -0.7409542 -0.6715755 0 0.7409361 -0.7409509 0 -0.6715592 0.83147 0 0.5555696 0.5555714 0 -0.8314688 -0.5555714 0 0.8314688 -0.83147 0 -0.5555696 0.9039889 0 0.427556 0.4275488 0 -0.9039923 -0.4275525 0 0.9039905 -0.9039892 0 -0.4275553 0.3826834 0 -0.9238796 -0.9238855 0 -0.382669 0.9238774 0 0.3826887 -0.3826833 0 0.9238796 -0.6419515 0 0.7667453 0.7667481 0 0.6419481 -0.7667387 0 -0.6419593 0.6419533 0 -0.7667437 -0.6190947 0 0.7853163 0.7853186 0 0.6190919 -0.7853186 0 -0.6190919 0.6190947 0 -0.7853163 -0.5956975 0 0.8032088 0.8032134 0 0.5956914 -0.8032043 0 -0.5957037 0.5956994 0 -0.8032075 -0.7071068 0 0.7071068 0.7071259 0 0.7070877 -0.7071163 0 -0.7070972 0.7071049 0 -0.7071087 -0.6859776 0 0.7276226 0.7276191 0 0.6859814 -0.7276191 0 -0.6859814 0.6859776 0 -0.7276226 -0.6642525 0 0.7475082 0.7475166 0 0.6642431 -0.7474988 0 -0.6642632 0.6642523 0 -0.7475084 -0.5717865 0 0.8204025 0.8204049 0 0.5717829 -0.8204049 0 -0.5717829 0.5717865 0 -0.8204025 -0.5473793 0 0.8368847 0.8368836 0 0.5473809 -0.8368893 0 -0.5473722 0.5473819 0 -0.8368829 -0.5224998 0 0.8526394 0.8526352 0 0.5225066 -0.8526352 0 -0.5225066 0.5224998 0 -0.8526394 -0.4186629 0 0.9081417 0.908153 0 0.4186384 -0.9081391 0 -0.4186687 0.418658 0 -0.908144 -0.391735 0 0.9200781 0.9200777 0 0.3917359 -0.9200738 0 -0.3917452 0.3917396 0 -0.9200761 -0.3644672 0 0.9312162 0.9312186 0 0.3644612 -0.9312146 0 -0.3644713 0.3644718 0 -0.9312144 -0.4971623 0 0.8676575 0.8676533 0 0.4971697 -0.867658 0 -0.4971615 0.4971652 0 -0.8676559 -0.4713978 0 0.8819207 0.8819112 0 0.4714156 -0.8819191 0 -0.4714008 0.4713963 0 -0.8819215 -0.4452227 0 0.8954199 0.8954168 0 0.4452289 -0.8954244 0 -0.4452136 0.4452212 0 -0.8954206 -0.2524949 0 0.9675982 0.9675982 0 0.2524949 -0.9675982 0 -0.2524949 0.2524949 0 -0.9675982 -0.2238843 0 0.9746157 0.9746157 0 0.2238843 -0.9746125 0 -0.2238982 0.2238887 0 -0.9746147 -0.1950875 0 0.9807858 0.9807863 0 0.1950853 -0.980787 0 -0.1950817 0.1950912 0 -0.9807851 -0.3368912 0 0.9415436 0.9415424 0 0.3368946 -0.9415424 0 -0.3368946 0.3368912 0 -0.9415436 -0.3090169 0 0.9510565 0.9510592 0 0.3090089 -0.9510592 0 -0.3090089 0.3090169 0 -0.9510565 -0.2808753 0 0.9597443 0.9597452 0 0.2808722 -0.95974 0 -0.2808898 0.2808763 0 -0.959744 -0.1661222 0 0.9861052 0.9861037 0 0.1661308 -0.9861037 0 -0.1661308 0.1661222 0 -0.9861052 -0.1370161 0 0.9905688 0.9905702 0 0.1370059 -0.9905676 0 -0.1370246 0.1370166 0 -0.9905687 -0.1077842 0 0.9941743 0.9941744 0 0.107783 -0.9941742 0 -0.107785 0.1077804 0 -0.9941747 -0.07846065 0 0.9969172 0.9969181 0 0.07844958 -0.9969181 0 -0.07844958 0.07846065 0 -0.9969172 -0.0490723 0 0.9987952 0.9987951 0 0.04907573 -0.998795 0 -0.04907667 0.04906849 0 -0.9987954 -0.01963428 0 0.9998072 0.999807 0 0.01964557 -0.9998074 0 -0.01962651 0.01963421 0 -0.9998072 0.009815193 0 0.9999518 0.9999518 0 -0.009822709 -0.9999518 0 0.009822896 -0.009819007 0 -0.9999518 0.1272807 0 0.9918667 0.9918646 0 -0.1272971 -0.9918694 0 0.1272596 -0.1272816 0 -0.9918666 0.1564329 0 0.9876886 0.9876877 0 -0.1564386 -0.9876906 0 0.15642 -0.1564335 0 -0.9876885 0.1854513 0 0.9826535 0.9826539 0 -0.1854492 -0.9826532 0 0.1854527 -0.185455 0 -0.9826528 0.03925719 0 0.9992291 0.9992293 0 -0.03925278 -0.9992285 0 0.03927332 -0.03926466 0 -0.9992288 0.06867196 0 0.9976393 0.9976385 0 -0.06868361 -0.9976398 0 0.06866463 -0.06867222 0 -0.9976393 0.09801474 0 0.995185 0.9951866 0 -0.09799852 -0.9951864 0 0.09800038 -0.09801852 0 -0.9951846 0.2143099 0 0.9767657 0.9767661 0 -0.2143083 -0.9767661 0 0.2143083 -0.2143099 0 -0.9767657 0.2429808 0 0.9700311 0.9700324 0 -0.2429754 -0.9700324 0 0.2429754 -0.2429808 0 -0.9700311 0.2714386 0 0.9624558 0.9624576 0 -0.2714321 -0.9624562 0 0.2714371 -0.2714421 0 -0.9624548 0.2996637 0 0.9540449 0.9540459 0 -0.2996604 -0.9540442 0 0.2996659 -0.2996672 0 -0.9540438 0.3276317 0 0.9448055 0.9448016 0 -0.3276431 -0.9448095 0 0.3276202 -0.3276295 0 -0.9448063 0.3553117 0 0.9347479 0.9347458 0 -0.3553171 -0.9347522 0 0.3553004 -0.355313 0 -0.9347474 0.3826822 0 0.92388 0.9238841 0 -0.3826724 -0.9238841 0 0.3826724 -0.3826822 0 -0.92388 0.4097285 0 0.9122075 0.9122189 0 -0.4097031 -0.9122118 0 0.409719 -0.4097271 0 -0.9122081 0.4364085 0 0.8997487 0.8997449 0 -0.4364162 -0.8997524 0 0.4364008 -0.43641 0 -0.8997479 0.5391363 0 0.8422185 0.8422236 0 -0.5391284 -0.8422181 0 0.539137 -0.539139 0 -0.8422168 0.5637048 0 0.8259763 0.825971 0 -0.5637126 -0.825986 0 0.5636907 -0.5637039 0 -0.8259769 0.5877842 0 0.8090177 0.8090172 0 -0.5877849 -0.8090172 0 0.5877849 -0.5877842 0 -0.8090177 0.4627159 0 0.8865066 0.8865059 0 -0.4627172 -0.8865018 0 0.462725 -0.4627189 0 -0.886505 0.4886202 0 0.8724966 0.872495 0 -0.4886231 -0.872495 0 0.4886231 -0.4886202 0 -0.8724966 0.5141064 0 0.8577264 0.8577318 0 -0.5140974 -0.8577369 0 0.514089 -0.5141036 0 -0.8577281 0.6113561 0 0.7913556 0.7913538 0 -0.6113585 -0.791363 0 0.6113465 -0.6113579 0 -0.7913542 0.6343925 0 0.7730111 0.7730148 0 -0.6343879 -0.7730148 0 0.6343879 -0.6343925 0 -0.7730111 0.6568824 0 0.753993 0.753981 0 -0.6568962 -0.7540069 0 0.6568665 -0.65688 0 -0.7539952 0.6787961 0 0.7343268 0.7343228 0 -0.6788004 -0.7343148 0 0.6788091 -0.6788021 0 -0.7343212 0.7001299 0 0.7140155 0.7140248 0 -0.7001204 -0.7139966 0 0.7001492 -0.7001319 0 -0.7140135 0.7208521 0 0.6930889 0.6930653 0 -0.7208748 -0.6930946 0 0.7208466 -0.7208504 0 -0.6930907 0.7409497 0 0.6715605 0.6715613 0 -0.740949 -0.6715708 0 0.7409404 -0.7409516 0 -0.6715584 0.814749 0 0.5798138 0.5797957 0 -0.8147619 -0.5797957 0 0.8147619 -0.814749 0 -0.5798138 0.8314694 0 0.5555705 0.5555714 0 -0.8314688 -0.5555714 0 0.8314688 -0.8314694 0 -0.5555705 0.8474698 0 0.5308436 0.5308405 0 -0.8474718 -0.530849 0 0.8474664 -0.8474715 0 -0.5308408 0.760406 0 0.649448 0.64943 0 -0.7604214 -0.64943 0 0.7604214 -0.760406 0 -0.649448 0.7792028 0 0.6267718 0.6267584 0 -0.7792137 -0.6267909 0 0.7791875 -0.7792017 0 -0.6267732 0.7973197 0 0.6035573 0.603522 0 -0.7973464 -0.6035646 0 0.7973141 -0.7973206 0 -0.6035561 0.9039883 0 0.4275571 0.4275837 0 -0.9039758 -0.4275525 0 0.9039905 -0.9039897 0 -0.4275542 0.9161896 0 0.4007452 0.4007088 0 -0.9162055 -0.4007728 0 0.9161775 -0.9161871 0 -0.4007508 0.9275935 0 0.373591 0.3736127 0 -0.9275848 -0.3736061 0 0.9275875 -0.9275922 0 -0.3735942 0.8627355 0 0.5056555 0.5056725 0 -0.8627255 -0.5056725 0 0.8627255 -0.8627355 0 -0.5056555 0.8772517 0 0.4800306 0.4800491 0 -0.8772416 -0.4800117 0 0.8772621 -0.8772519 0 -0.4800304 0.8910063 0 0.4539909 0.4539832 0 -0.8910102 -0.4539909 0 0.8910063 -0.8910079 0 -0.4539878 0.9650737 0 0.2619784 0.2619907 0 -0.9650704 -0.2619552 0 0.96508 -0.9650742 0 -0.2619765 0.9723704 0 0.2334434 0.2334234 0 -0.9723752 -0.2334595 0 0.9723665 -0.97237 0 -0.2334451 0.9788222 0 0.2047122 0.2046915 0 -0.9788265 -0.2047357 0 0.9788173 -0.9788234 0 -0.2047064 0.9381923 0 0.3461144 0.3461102 0 -0.9381939 -0.3461375 0 0.9381838 -0.9381902 0 -0.3461202 0.9479771 0 0.3183384 0.3183384 0 -0.9479771 -0.3183727 0 0.9479656 -0.9479764 0 -0.3183407 0.9569407 0 0.2902835 0.2902932 0 -0.9569377 -0.2902583 0 0.9569483 -0.9569413 0 -0.2902814 0.9844266 0 0.1757962 0.1758131 0 -0.9844236 -0.1758197 0 0.9844224 -0.9844279 0 -0.1757888 0.9891767 0 0.1467289 0.1467547 0 -0.9891729 -0.1467118 0 0.9891793 -0.9891758 0 -0.1467353 0.9930683 0 0.1175389 0.1175296 0 -0.9930694 -0.117534 0 0.9930689 -0.9930692 0 -0.1175313 0.9960991 0 0.08824205 0.08823448 0 -0.9960997 -0.08823448 0 0.9960997 -0.9960991 0 -0.08824205 0.9982658 0 0.05886827 0.05886067 0 -0.9982662 -0.05886067 0 0.9982662 -0.9982658 0 -0.05886827 0.9995663 0 0.0294495 0.0294495 0 -0.9995663 -0.0294495 0 0.9995663 -0.9995663 0 -0.0294495 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9930692 0 -0.1175313 -0.1175296 0 -0.9930694 0.117534 0 0.9930689 -0.9930683 0 0.1175389 0.9891758 0 -0.1467353 -0.1467547 0 -0.9891729 0.1467118 0 0.9891793 -0.9891767 0 0.1467289 0.9844279 0 -0.1757888 -0.1758131 0 -0.9844236 0.1758197 0 0.9844224 -0.9844266 0 0.1757962 0.9995663 0 -0.0294495 -0.0294495 0 -0.9995663 0.0294495 0 0.9995663 -0.9995663 0 0.0294495 0.9982658 0 -0.05886827 -0.05886067 0 -0.9982662 0.05886067 0 0.9982662 -0.9982658 0 0.05886827 0.9960991 0 -0.08824205 -0.08823448 0 -0.9960997 0.08823448 0 0.9960997 -0.9960991 0 0.08824205 0.9569413 0 -0.2902814 -0.2902932 0 -0.9569377 0.2902583 0 0.9569483 -0.9569407 0 0.2902835 0.9479775 0 -0.3183373 -0.3183327 0 -0.9479791 0.3183785 0 0.9479637 -0.947976 0 0.3183418 0.9381914 0 -0.3461169 -0.3461102 0 -0.9381939 0.3461437 0 0.9381815 -0.9381923 0 0.3461144 0.9788234 0 -0.2047064 -0.2046915 0 -0.9788265 0.2047357 0 0.9788173 -0.9788222 0 0.2047122 0.97237 0 -0.2334451 -0.2334234 0 -0.9723752 0.2334595 0 0.9723665 -0.9723704 0 0.2334434 0.9650742 0 -0.2619765 -0.2619907 0 -0.9650704 0.2619552 0 0.96508 -0.9650737 0 0.2619784 0.9275922 0 -0.3735942 -0.3736127 0 -0.9275848 0.3736127 0 0.9275848 -0.9275922 0 0.3735942 0.9161871 0 -0.4007508 -0.4007088 0 -0.9162055 0.4007728 0 0.9161775 -0.9161896 0 0.4007452 0.9039883 0 -0.4275573 -0.4275911 0 -0.9039723 0.4275599 0 0.903987 -0.9039869 0 0.4275602 0.8474698 0 -0.5308436 -0.530849 0 -0.8474664 0.530849 0 0.8474664 -0.8474698 0 0.5308436 0.8314677 0 -0.5555732 -0.5555802 0 -0.8314629 0.5555802 0 0.8314629 -0.8314677 0 0.5555732 0.8147508 0 -0.5798112 -0.5797867 0 -0.8147683 0.5798047 0 0.8147555 -0.8147472 0 0.5798163 0.7973206 0 -0.6035561 -0.603522 0 -0.7973464 0.6035646 0 0.7973141 -0.7973197 0 0.6035573 0.8910079 0 -0.4539878 -0.4539909 0 -0.8910063 0.4539909 0 0.8910063 -0.8910079 0 0.4539878 0.8772519 0 -0.4800304 -0.4800491 0 -0.8772416 0.4800037 0 0.8772665 -0.8772533 0 0.4800277 0.8627355 0 -0.5056555 -0.5056725 0 -0.8627255 0.5056725 0 0.8627255 -0.8627355 0 0.5056555 0.7792017 0 -0.6267732 -0.6267491 0 -0.7792211 0.6267909 0 0.7791875 -0.779201 0 0.6267742 0.7604079 0 -0.6494458 -0.6494206 0 -0.7604294 0.6494206 0 0.7604294 -0.7604079 0 0.6494458 0.7409535 0 -0.6715563 -0.6715613 0 -0.740949 0.6715803 0 0.7409318 -0.7409497 0 0.6715605 0.65688 0 -0.7539952 -0.753981 0 -0.6568962 0.7539975 0 0.6568773 -0.6568843 0 0.7539914 0.6343925 0 -0.7730111 -0.7730148 0 -0.6343879 0.7729961 0 0.6344107 -0.6343962 0 0.773008 0.6113598 0 -0.7913528 -0.7913446 0 -0.6113704 0.791363 0 0.6113465 -0.6113561 0 0.7913556 0.7208485 0 -0.6930927 -0.6930653 0 -0.7208748 0.6930851 0 0.7208558 -0.7208521 0 0.6930889 0.7001338 0 -0.7140117 -0.7140153 0 -0.7001301 0.7139966 0 0.7001492 -0.7001299 0 0.7140155 0.6788021 0 -0.7343212 -0.7343133 0 -0.6788107 0.7343148 0 0.6788091 -0.6787942 0 0.7343285 0.5141036 0 -0.8577281 -0.8577402 0 -0.5140834 0.8577453 0 0.5140749 -0.5141064 0 0.8577264 0.4886202 0 -0.8724966 -0.8725112 0 -0.4885941 0.8725112 0 0.4885941 -0.4886202 0 0.8724966 0.4627189 0 -0.886505 -0.8865059 0 -0.4627172 0.8865018 0 0.462725 -0.4627159 0 0.8865066 0.5877824 0 -0.8090191 -0.8090082 0 -0.5877974 0.8090082 0 0.5877974 -0.5877824 0 0.8090191 0.5637039 0 -0.8259769 -0.8259799 0 -0.5636996 0.8260037 0 0.5636647 -0.563703 0 0.8259776 0.539139 0 -0.8422168 -0.8422236 0 -0.5391284 0.8422181 0 0.539137 -0.5391363 0 0.8422185 0.355313 0 -0.9347474 -0.9347522 0 -0.3553004 0.9347522 0 0.3553004 -0.355313 0 0.9347474 0.3276283 0 -0.9448067 -0.9448016 0 -0.3276431 0.9448036 0 0.3276372 -0.3276317 0 0.9448055 0.2996683 0 -0.9540435 -0.9540405 0 -0.2996778 0.9540388 0 0.2996833 -0.2996648 0 0.9540445 0.4364085 0 -0.8997487 -0.8997524 0 -0.4364008 0.8997524 0 0.4364008 -0.4364085 0 0.8997487 0.4097257 0 -0.9122088 -0.9122189 0 -0.4097031 0.9122047 0 0.4097349 -0.4097285 0 0.9122075 0.3826822 0 -0.92388 -0.9238908 0 -0.3826561 0.9238774 0 0.3826887 -0.3826849 0 0.9238789 0.2714421 0 -0.9624548 -0.9624626 0 -0.2714144 0.9624512 0 0.2714547 -0.2714406 0 0.9624552 0.2429808 0 -0.9700311 -0.970028 0 -0.2429934 0.970028 0 0.2429934 -0.2429808 0 0.9700311 0.2143091 0 -0.9767659 -0.9767661 0 -0.2143083 0.9767661 0 0.2143083 -0.2143091 0 0.9767659 0.1854557 0 -0.9826526 -0.9826504 0 -0.1854676 0.9826567 0 0.1854343 -0.1854506 0 0.9826536 0.06867196 0 -0.9976393 -0.9976372 0 -0.06870259 0.9976398 0 0.06866463 -0.06867144 0 0.9976393 0.03926466 0 -0.9992288 -0.9992293 0 -0.03925278 0.9992293 0 0.03925428 -0.03925704 0 0.9992291 0.009819007 0 -0.9999518 -0.9999516 0 -0.00984178 0.9999516 0 0.009841968 -0.009815193 0 0.9999518 0.1564335 0 -0.9876885 -0.9876877 0 -0.1564386 0.9876877 0 0.1564386 -0.1564335 0 0.9876885 0.1272811 0 -0.9918667 -0.9918694 0 -0.1272596 0.9918694 0 0.1272596 -0.1272811 0 0.9918667 0.09801852 0 -0.9951846 -0.9951866 0 -0.09799852 0.9951864 0 0.09800038 -0.09801474 0 0.995185 -0.1077808 0 -0.9941747 -0.9941724 0 0.1078018 0.9941722 0 -0.1078039 0.1077846 0 0.9941743 -0.1370161 0 -0.9905688 -0.9905676 0 0.1370246 0.9905676 0 -0.1370246 0.1370161 0 0.9905688 -0.1661222 0 -0.9861052 -0.9861037 0 0.1661308 0.9861037 0 -0.1661308 0.1661222 0 0.9861052 -0.01963421 0 -0.9998072 -0.999807 0 0.01964557 0.999807 0 -0.01964557 0.01963421 0 0.9998072 -0.07846065 0 -0.9969172 -0.9969166 0 0.07846853 0.9969166 0 -0.07846853 0.07846065 0 0.9969172 -0.2808753 0 -0.9597443 -0.9597452 0 0.2808722 0.9597452 0 -0.2808722 0.2808753 0 0.9597443 -0.3090169 0 -0.9510565 -0.9510535 0 0.3090261 0.9510648 0 -0.3089916 0.3090191 0 0.9510558 -0.2238896 0 -0.9746145 -0.9746241 0 0.2238481 0.9746084 0 -0.2239164 0.2238826 0 0.9746161 -0.2524949 0 -0.9675982 -0.9675982 0 0.2524949 0.9675982 0 -0.2524949 0.2524949 0 0.9675982 -0.4452227 0 -0.8954199 -0.8954244 0 0.4452136 0.8954244 0 -0.4452136 0.4452227 0 0.8954199 -0.4713978 0 -0.8819207 -0.8819112 0 0.4714156 0.8819112 0 -0.4714156 0.4713978 0 0.8819207 -0.4971669 0 -0.867655 -0.8676698 0 0.497141 0.867658 0 -0.4971615 0.4971607 0 0.8676585 -0.3644718 0 -0.9312144 -0.9312186 0 0.3644612 0.9312082 0 -0.3644878 0.3644659 0 0.9312167 -0.3917396 0 -0.9200761 -0.9200777 0 0.3917359 0.9200806 0 -0.391729 0.3917364 0 0.9200775 -0.4186595 0 -0.9081433 -0.9081602 0 0.4186227 0.9081391 0 -0.4186687 0.4186629 0 0.9081417 -0.5956994 0 -0.8032075 -0.8032226 0 0.595679 0.8032043 0 -0.5957037 0.5956957 0 0.8032102 -0.6190947 0 -0.7853163 -0.7853186 0 0.6190919 0.7853186 0 -0.6190919 0.6190947 0 0.7853163 -0.6419515 0 -0.7667453 -0.7667481 0 0.6419481 0.7667481 0 -0.6419481 0.6419515 0 0.7667453 -0.5224998 0 -0.8526394 -0.8526352 0 0.5225066 0.8526352 0 -0.5225066 0.5224998 0 0.8526394 -0.5473819 0 -0.8368829 -0.8368836 0 0.5473809 0.8368893 0 -0.5473722 0.5473793 0 0.8368847 -0.5717883 0 -0.8204012 -0.8204049 0 0.5717829 0.8203871 0 -0.5718086 0.5717847 0 0.8204037 -0.6642523 0 -0.7475084 -0.7475166 0 0.6642431 0.7474893 0 -0.6642739 0.6642507 0 0.7475099 -0.6859814 0 -0.7276191 -0.7276286 0 0.6859713 0.7276095 0 -0.6859915 0.6859776 0 0.7276226 0.5141023 0 -0.8577289 -0.8577284 0 -0.514103 0.8577284 0 0.514103 -0.5141023 0 0.8577289 0.6343934 0 -0.7730104 -0.7730055 0 -0.6343993 0.7730055 0 0.6343993 -0.6343934 0 0.7730104 0.7409513 0 -0.6715588 -0.6715508 0 -0.7409585 0.6715803 0 0.7409318 -0.7409505 0 0.6715597 0.83147 0 -0.5555696 -0.5555714 0 -0.8314688 0.5555714 0 0.8314688 -0.83147 0 0.5555696 -0.04906842 0 -0.9987954 -0.998795 0 0.0490762 0.998796 0 -0.0490567 0.04906773 0 0.9987955 0.2429794 0 -0.9700315 -0.9700313 0 -0.2429799 0.9700324 0 0.2429754 -0.2429808 0 0.9700311 0.0980164 0 -0.9951848 -0.9951845 0 -0.09801927 0.9951864 0 0.09800038 -0.09801626 0 0.9951848 -0.3368905 0 -0.9415438 -0.9415424 0 0.3368946 0.9415424 0 -0.3368946 0.3368905 0 0.9415438 0.0980164 0 -0.9951848 -0.9951845 0 -0.09801896 0.9951846 0 0.09801834 -0.09801792 0 0.9951847 -0.7071064 0 0.7071072 0.7071084 0 0.7071052 -0.7071036 0 -0.70711 0.7071068 0 -0.7071068 -0.4713972 0 0.881921 0.8819224 0 0.4713945 -0.8819204 0 -0.4713983 0.4713969 0 -0.8819212 -0.1950897 0 0.9807854 0.9807853 0 0.1950902 -0.9807853 0 -0.1950902 0.1950897 0 -0.9807854 0.09801784 0 0.9951847 0.9951845 0 -0.09801896 -0.9951849 0 0.09801519 -0.0980164 0 -0.9951848</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320_2Shape-tangents-array" count="820" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320_2Shape-binormals" name="qt_gauge_tickmarks_320_2Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_320_2Shape-binormals-array" count="2460">-0.9238796 0 -0.3826833 -0.3826844 0 0.9238791 0.3826779 0 -0.9238819 0.9238796 0 0.3826834 -0.773011 0 -0.6343927 -0.6343917 0 0.7730118 0.6343955 0 -0.7730086 0.7730104 0 0.6343934 -0.5555696 0 -0.83147 -0.8314689 0 0.5555714 0.8314689 0 -0.5555714 0.5555696 0 0.83147 -0.8819214 0 0.4713966 0.4713946 0 0.8819225 -0.4713959 0 -0.8819218 0.8819211 0 -0.4713973 -0.9807855 0 0.1950896 0.1950964 0 0.9807842 -0.1950902 0 -0.9807853 0.9807854 0 -0.1950899 -0.7071068 0 0.7071068 0.7071052 0 0.7071084 -0.70711 0 -0.7071036 0.7071072 0 -0.7071064 0.9238794 0 -0.3826836 -0.3826844 0 -0.9238792 0.3826833 0 0.9238797 -0.9238798 0 0.382683 0.7730104 0 -0.6343934 -0.6343917 0 -0.7730118 0.6343936 0 0.7730103 -0.7730107 0 0.634393 0.5555702 0 -0.8314697 -0.8314689 0 -0.5555714 0.8314679 0 0.5555729 -0.5555696 0 0.83147 0.2902845 0 -0.9569404 -0.9569399 0 -0.290286 0.9569399 0 0.290286 -0.2902845 0 0.9569404 -0.2902845 0 -0.9569405 -0.9569403 0 0.2902852 0.9569403 0 -0.2902852 0.2902845 0 0.9569405 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.8819211 0 0.4713973 0.4713968 0 0.8819212 -0.4714009 0 -0.8819192 0.8819207 0 -0.4713978 -0.8032075 0 0.5956994 0.5956868 0 0.8032168 -0.5957037 0 -0.8032043 0.8032077 0 -0.5956992 0.9238797 0 -0.382683 -0.3826772 0 -0.9238822 0.3826887 0 0.9238774 -0.9238796 0 0.3826834 0.8577288 0 -0.5141023 -0.5141031 0 -0.8577285 0.5141031 0 0.8577285 -0.8577288 0 0.5141023 0.7730104 0 -0.6343934 -0.6343936 0 -0.7730102 0.6343936 0 0.7730102 -0.7730104 0 0.6343934 0.9987954 0 0.04906773 0.04907621 0 -0.9987952 -0.04906622 0 0.9987956 -0.9987955 0 -0.04906846 0.9951848 0 -0.09801633 -0.09801927 0 -0.9951846 0.09801927 0 0.9951846 -0.9951848 0 0.09801633 0.9700311 0 -0.2429808 -0.2429889 0 -0.9700291 0.2429754 0 0.9700325 -0.9700314 0 0.2429795 0.2902849 0 -0.9569404 -0.9569414 0 -0.2902811 0.9569414 0 0.2902811 -0.2902849 0 0.9569404 0.1467315 0 -0.9891765 -0.9891765 0 -0.1467305 0.9891761 0 0.1467332 -0.14673 0 0.9891767 0 0 -1 -1 0 0 1 0 0 0 0 1 0.8819209 0 0.4713975 0.4713895 0 -0.8819253 -0.4713934 0 0.8819231 -0.8819212 0 -0.4713969 0.9415439 0 0.3368903 0.3368861 0 -0.9415454 -0.3368946 0 0.9415424 -0.9415438 0 -0.3368905 0.9807853 0 0.1950905 0.1950927 0 -0.9807848 -0.1950927 0 0.9807848 -0.9807853 0 -0.1950905 0.7071068 0 0.7071068 0.707102 0 -0.7071115 -0.7071115 0 0.707102 -0.7071068 0 -0.7071068 0.8032075 0 0.5956995 0.5956929 0 -0.8032122 -0.5957037 0 0.8032044 -0.8032075 0 -0.5956994 -0.14673 0 -0.9891766 -0.9891765 0 0.1467305 0.9891761 0 -0.1467332 0.1467315 0 0.9891763 -0.2902849 0 -0.9569403 -0.9569415 0 0.2902811 0.9569415 0 -0.2902811 0.2902849 0 0.9569403 -0.427556 0 -0.903989 -0.9039905 0 0.4275525 0.9039905 0 -0.4275525 0.427556 0 0.903989 0.6715593 0 -0.7409508 -0.7409542 0 -0.6715556 0.7409361 0 0.6715755 -0.6715592 0 0.7409509 0.5555696 0 -0.83147 -0.8314689 0 -0.5555714 0.8314689 0 0.5555714 -0.5555696 0 0.83147 0.4275559 0 -0.9039889 -0.9039923 0 -0.4275489 0.9039906 0 0.4275526 -0.4275553 0 0.9039892 -0.9238796 0 -0.3826834 -0.382669 0 0.9238855 0.3826887 0 -0.9238774 0.9238796 0 0.3826833 0.7667453 0 0.6419514 0.6419481 0 -0.7667481 -0.6419594 0 0.7667387 -0.7667438 0 -0.6419533 0.7853163 0 0.6190947 0.6190919 0 -0.7853187 -0.6190919 0 0.7853187 -0.7853163 0 -0.6190947 0.8032089 0 0.5956976 0.5956914 0 -0.8032135 -0.5957037 0 0.8032044 -0.8032075 0 -0.5956994 0.7071068 0 0.7071068 0.7070878 0 -0.7071259 -0.7070972 0 0.7071163 -0.7071087 0 -0.7071049 0.7276226 0 0.6859776 0.6859814 0 -0.7276191 -0.6859814 0 0.7276191 -0.7276226 0 -0.6859776 0.7475082 0 0.6642525 0.6642431 0 -0.7475166 -0.6642632 0 0.7474988 -0.7475085 0 -0.6642523 0.8204025 0 0.5717865 0.5717829 0 -0.8204049 -0.5717829 0 0.8204049 -0.8204025 0 -0.5717865 0.8368847 0 0.5473793 0.5473809 0 -0.8368836 -0.5473722 0 0.8368893 -0.8368829 0 -0.5473819 0.8526395 0 0.5224998 0.5225066 0 -0.8526353 -0.5225066 0 0.8526353 -0.8526395 0 -0.5224998 0.9081417 0 0.4186628 0.4186385 0 -0.9081531 -0.4186687 0 0.9081391 -0.9081441 0 -0.4186581 0.9200781 0 0.391735 0.3917359 0 -0.9200777 -0.3917452 0 0.9200738 -0.9200762 0 -0.3917396 0.9312162 0 0.3644672 0.3644612 0 -0.9312186 -0.3644713 0 0.9312147 -0.9312145 0 -0.3644719 0.8676576 0 0.4971624 0.4971697 0 -0.8676533 -0.4971615 0 0.867658 -0.867656 0 -0.4971653 0.8819207 0 0.4713978 0.4714157 0 -0.8819113 -0.4714009 0 0.8819192 -0.8819215 0 -0.4713962 0.8954199 0 0.4452228 0.4452289 0 -0.8954168 -0.4452136 0 0.8954244 -0.8954206 0 -0.4452212 0.9675983 0 0.2524949 0.2524949 0 -0.9675983 -0.2524949 0 0.9675983 -0.9675983 0 -0.2524949 0.9746158 0 0.2238843 0.2238843 0 -0.9746158 -0.2238982 0 0.9746125 -0.9746147 0 -0.2238888 0.9807859 0 0.1950875 0.1950853 0 -0.9807863 -0.1950817 0 0.9807871 -0.9807851 0 -0.1950912 0.9415436 0 0.3368912 0.3368946 0 -0.9415424 -0.3368946 0 0.9415424 -0.9415436 0 -0.3368912 0.9510567 0 0.3090169 0.3090089 0 -0.9510592 -0.3090089 0 0.9510592 -0.9510567 0 -0.3090169 0.9597443 0 0.2808753 0.2808722 0 -0.9597452 -0.2808897 0 0.95974 -0.959744 0 -0.2808763 0.9861052 0 0.1661222 0.1661308 0 -0.9861037 -0.1661308 0 0.9861037 -0.9861052 0 -0.1661222 0.9905688 0 0.1370161 0.1370059 0 -0.9905702 -0.1370246 0 0.9905676 -0.9905688 0 -0.1370166 0.9941744 0 0.1077842 0.107783 0 -0.9941745 -0.107785 0 0.9941742 -0.9941748 0 -0.1077804 0.9969173 0 0.07846066 0.07844958 0 -0.9969181 -0.07844958 0 0.9969181 -0.9969173 0 -0.07846066 0.9987953 0 0.04907231 0.04907574 0 -0.9987952 -0.04907667 0 0.998795 -0.9987955 0 -0.0490685 0.9998072 0 0.01963428 0.01964557 0 -0.9998071 -0.01962651 0 0.9998074 -0.9998073 0 -0.01963421 0.9999519 0 -0.009815193 -0.009822709 0 -0.9999518 0.009822896 0 0.9999518 -0.9999518 0 0.009819007 0.9918668 0 -0.1272807 -0.1272971 0 -0.9918647 0.1272596 0 0.9918694 -0.9918666 0 0.1272816 0.9876887 0 -0.1564329 -0.1564386 0 -0.9876878 0.1564199 0 0.9876907 -0.9876885 0 0.1564335 0.9826536 0 -0.1854513 -0.1854492 0 -0.9826539 0.1854527 0 0.9826532 -0.9826528 0 0.185455 0.9992291 0 -0.03925719 -0.03925278 0 -0.9992293 0.03927332 0 0.9992285 -0.9992288 0 0.03926466 0.9976394 0 -0.06867196 -0.06868362 0 -0.9976386 0.06866463 0 0.9976399 -0.9976393 0 0.06867222 0.995185 0 -0.09801475 -0.09799851 0 -0.9951866 0.09800038 0 0.9951864 -0.9951847 0 0.09801853 0.9767658 0 -0.2143099 -0.2143083 0 -0.976766 0.2143083 0 0.976766 -0.9767658 0 0.2143099 0.9700312 0 -0.2429808 -0.2429754 0 -0.9700325 0.2429754 0 0.9700325 -0.9700312 0 0.2429808 0.9624557 0 -0.2714386 -0.2714321 0 -0.9624577 0.2714371 0 0.9624563 -0.9624548 0 0.2714421 0.9540449 0 -0.2996637 -0.2996605 0 -0.954046 0.2996659 0 0.9540443 -0.9540438 0 0.2996672 0.9448056 0 -0.3276317 -0.3276431 0 -0.9448016 0.3276202 0 0.9448096 -0.9448063 0 0.3276295 0.9347479 0 -0.3553117 -0.3553171 0 -0.9347459 0.3553004 0 0.9347522 -0.9347474 0 0.355313 0.9238801 0 -0.3826822 -0.3826724 0 -0.9238841 0.3826724 0 0.9238841 -0.9238801 0 0.3826822 0.9122075 0 -0.4097285 -0.4097031 0 -0.9122189 0.409719 0 0.9122118 -0.9122081 0 0.4097271 0.8997487 0 -0.4364085 -0.4364163 0 -0.8997449 0.4364008 0 0.8997524 -0.899748 0 0.43641 0.8422185 0 -0.5391363 -0.5391284 0 -0.8422236 0.5391371 0 0.842218 -0.8422168 0 0.539139 0.8259764 0 -0.5637048 -0.5637126 0 -0.825971 0.5636907 0 0.825986 -0.8259769 0 0.563704 0.8090178 0 -0.5877843 -0.5877849 0 -0.8090172 0.5877849 0 0.8090172 -0.8090178 0 0.5877843 0.8865067 0 -0.462716 -0.4627172 0 -0.886506 0.4627251 0 0.8865019 -0.8865051 0 0.4627189 0.8724967 0 -0.4886203 -0.4886232 0 -0.8724951 0.4886232 0 0.8724951 -0.8724967 0 0.4886203 0.8577265 0 -0.5141064 -0.5140974 0 -0.8577318 0.514089 0 0.8577369 -0.8577282 0 0.5141036 0.7913557 0 -0.6113561 -0.6113585 0 -0.7913538 0.6113465 0 0.7913631 -0.7913542 0 0.611358 0.7730111 0 -0.6343925 -0.6343879 0 -0.7730148 0.6343879 0 0.7730148 -0.7730111 0 0.6343925 0.753993 0 -0.6568824 -0.6568962 0 -0.7539811 0.6568664 0 0.7540069 -0.7539952 0 0.65688 0.7343268 0 -0.6787961 -0.6788004 0 -0.7343228 0.6788091 0 0.7343147 -0.7343212 0 0.6788021 0.7140155 0 -0.7001299 -0.7001204 0 -0.7140248 0.7001492 0 0.7139965 -0.7140135 0 0.7001319 0.6930889 0 -0.7208521 -0.7208748 0 -0.6930653 0.7208467 0 0.6930946 -0.6930907 0 0.7208503 0.6715605 0 -0.7409497 -0.740949 0 -0.6715613 0.7409404 0 0.6715708 -0.6715584 0 0.7409516 0.5798138 0 -0.8147491 -0.814762 0 -0.5797957 0.814762 0 0.5797957 -0.5798138 0 0.8147491 0.5555705 0 -0.8314694 -0.8314689 0 -0.5555714 0.8314689 0 0.5555714 -0.5555705 0 0.8314694 0.5308436 0 -0.8474698 -0.8474718 0 -0.5308405 0.8474664 0 0.530849 -0.5308408 0 0.8474715 0.649448 0 -0.7604061 -0.7604213 0 -0.64943 0.7604213 0 0.64943 -0.649448 0 0.7604061 0.6267719 0 -0.7792029 -0.7792137 0 -0.6267584 0.7791875 0 0.6267909 -0.6267732 0 0.7792017 0.6035572 0 -0.7973197 -0.7973464 0 -0.603522 0.7973142 0 0.6035646 -0.6035561 0 0.7973205 0.4275571 0 -0.9039884 -0.9039758 0 -0.4275837 0.9039905 0 0.4275525 -0.4275542 0 0.9039898 0.4007452 0 -0.9161896 -0.9162055 0 -0.4007088 0.9161775 0 0.4007728 -0.4007508 0 0.9161872 0.373591 0 -0.9275936 -0.9275848 0 -0.3736127 0.9275874 0 0.3736061 -0.3735943 0 0.9275922 0.5056555 0 -0.8627356 -0.8627255 0 -0.5056725 0.8627255 0 0.5056725 -0.5056555 0 0.8627356 0.4800307 0 -0.8772518 -0.8772417 0 -0.4800491 0.8772622 0 0.4800117 -0.4800304 0 0.8772519 0.4539909 0 -0.8910064 -0.8910103 0 -0.4539832 0.8910063 0 0.4539909 -0.4539879 0 0.891008 0.2619784 0 -0.9650737 -0.9650704 0 -0.2619907 0.9650801 0 0.2619552 -0.2619765 0 0.9650742 0.2334434 0 -0.9723704 -0.9723752 0 -0.2334235 0.9723666 0 0.2334595 -0.2334451 0 0.97237 0.2047122 0 -0.9788222 -0.9788266 0 -0.2046915 0.9788174 0 0.2047357 -0.2047064 0 0.9788234 0.3461144 0 -0.9381924 -0.9381939 0 -0.3461102 0.9381838 0 0.3461375 -0.3461202 0 0.9381902 0.3183384 0 -0.9479772 -0.9479771 0 -0.3183384 0.9479656 0 0.3183727 -0.3183407 0 0.9479764 0.2902835 0 -0.9569407 -0.9569378 0 -0.2902932 0.9569483 0 0.2902583 -0.2902814 0 0.9569414 0.1757962 0 -0.9844267 -0.9844236 0 -0.1758131 0.9844224 0 0.1758197 -0.1757888 0 0.984428 0.1467289 0 -0.9891768 -0.9891729 0 -0.1467547 0.9891793 0 0.1467118 -0.1467353 0 0.9891758 0.1175389 0 -0.9930683 -0.9930695 0 -0.1175296 0.9930689 0 0.117534 -0.1175313 0 0.9930692 0.08824205 0 -0.9960992 -0.9960998 0 -0.08823448 0.9960998 0 0.08823448 -0.08824205 0 0.9960992 0.05886828 0 -0.9982659 -0.9982662 0 -0.05886067 0.9982662 0 0.05886067 -0.05886828 0 0.9982659 0.0294495 0 -0.9995663 -0.9995663 0 -0.0294495 0.9995663 0 0.0294495 -0.0294495 0 0.9995663 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.1175313 0 -0.9930692 -0.9930695 0 0.1175296 0.9930689 0 -0.117534 0.1175389 0 0.9930683 -0.1467353 0 -0.9891758 -0.989173 0 0.1467547 0.9891794 0 -0.1467118 0.1467289 0 0.9891768 -0.1757888 0 -0.984428 -0.9844236 0 0.1758131 0.9844224 0 -0.1758197 0.1757962 0 0.9844267 -0.0294495 0 -0.9995663 -0.9995663 0 0.0294495 0.9995663 0 -0.0294495 0.0294495 0 0.9995663 -0.05886828 0 -0.9982659 -0.9982662 0 0.05886067 0.9982662 0 -0.05886067 0.05886828 0 0.9982659 -0.08824205 0 -0.9960992 -0.9960998 0 0.08823448 0.9960998 0 -0.08823448 0.08824205 0 0.9960992 -0.2902814 0 -0.9569414 -0.9569377 0 0.2902932 0.9569484 0 -0.2902583 0.2902835 0 0.9569407 -0.3183373 0 -0.9479775 -0.9479791 0 0.3183327 0.9479638 0 -0.3183785 0.3183418 0 0.9479761 -0.3461169 0 -0.9381914 -0.9381939 0 0.3461102 0.9381815 0 -0.3461437 0.3461144 0 0.9381923 -0.2047064 0 -0.9788234 -0.9788266 0 0.2046915 0.9788174 0 -0.2047357 0.2047122 0 0.9788222 -0.2334451 0 -0.97237 -0.9723753 0 0.2334235 0.9723666 0 -0.2334595 0.2334434 0 0.9723704 -0.2619765 0 -0.9650742 -0.9650705 0 0.2619908 0.9650801 0 -0.2619552 0.2619784 0 0.9650738 -0.3735943 0 -0.9275922 -0.9275848 0 0.3736127 0.9275848 0 -0.3736127 0.3735943 0 0.9275922 -0.4007508 0 -0.9161871 -0.9162055 0 0.4007088 0.9161775 0 -0.4007728 0.4007452 0 0.9161896 -0.4275573 0 -0.9039882 -0.9039723 0 0.4275911 0.9039871 0 -0.4275599 0.4275602 0 0.9039869 -0.5308436 0 -0.8474698 -0.8474664 0 0.530849 0.8474664 0 -0.530849 0.5308436 0 0.8474698 -0.5555732 0 -0.8314676 -0.8314629 0 0.5555802 0.8314629 0 -0.5555802 0.5555732 0 0.8314676 -0.5798112 0 -0.8147509 -0.8147684 0 0.5797867 0.8147555 0 -0.5798047 0.5798163 0 0.8147473 -0.6035561 0 -0.7973205 -0.7973464 0 0.603522 0.7973141 0 -0.6035646 0.6035572 0 0.7973197 -0.4539878 0 -0.8910079 -0.8910063 0 0.4539909 0.8910063 0 -0.4539909 0.4539878 0 0.8910079 -0.4800304 0 -0.8772519 -0.8772417 0 0.4800491 0.8772665 0 -0.4800037 0.4800277 0 0.8772534 -0.5056555 0 -0.8627356 -0.8627255 0 0.5056725 0.8627255 0 -0.5056725 0.5056555 0 0.8627356 -0.6267732 0 -0.7792017 -0.7792211 0 0.6267491 0.7791875 0 -0.6267909 0.6267743 0 0.779201 -0.6494458 0 -0.7604079 -0.7604294 0 0.6494206 0.7604294 0 -0.6494206 0.6494458 0 0.7604079 -0.6715564 0 -0.7409535 -0.740949 0 0.6715613 0.7409318 0 -0.6715803 0.6715605 0 0.7409497 -0.7539952 0 -0.65688 -0.6568962 0 0.7539811 0.6568773 0 -0.7539975 0.7539914 0 0.6568844 -0.7730111 0 -0.6343925 -0.6343879 0 0.7730148 0.6344107 0 -0.7729961 0.773008 0 0.6343963 -0.7913528 0 -0.6113598 -0.6113704 0 0.7913446 0.6113465 0 -0.7913631 0.7913556 0 0.6113561 -0.6930927 0 -0.7208484 -0.7208748 0 0.6930653 0.7208558 0 -0.6930851 0.6930889 0 0.7208521 -0.7140117 0 -0.7001338 -0.7001302 0 0.7140152 0.7001492 0 -0.7139965 0.7140155 0 0.7001299 -0.7343212 0 -0.6788021 -0.6788107 0 0.7343133 0.6788091 0 -0.7343147 0.7343285 0 0.6787942 -0.8577282 0 -0.5141036 -0.5140834 0 0.8577403 0.5140749 0 -0.8577453 0.8577265 0 0.5141064 -0.8724966 0 -0.4886202 -0.4885941 0 0.8725112 0.4885941 0 -0.8725112 0.8724966 0 0.4886202 -0.8865051 0 -0.4627189 -0.4627173 0 0.886506 0.462725 0 -0.8865018 0.8865067 0 0.462716 -0.8090191 0 -0.5877824 -0.5877974 0 0.8090082 0.5877974 0 -0.8090082 0.8090191 0 0.5877824 -0.8259769 0 -0.563704 -0.5636996 0 0.82598 0.5636647 0 -0.8260037 0.8259776 0 0.563703 -0.8422168 0 -0.539139 -0.5391284 0 0.8422236 0.5391371 0 -0.8422181 0.8422186 0 0.5391363 -0.9347474 0 -0.355313 -0.3553004 0 0.9347522 0.3553004 0 -0.9347522 0.9347474 0 0.355313 -0.9448067 0 -0.3276283 -0.3276431 0 0.9448016 0.3276372 0 -0.9448037 0.9448055 0 0.3276317 -0.9540434 0 -0.2996683 -0.2996778 0 0.9540405 0.2996833 0 -0.9540388 0.9540446 0 0.2996648 -0.8997487 0 -0.4364085 -0.4364008 0 0.8997524 0.4364008 0 -0.8997524 0.8997487 0 0.4364085 -0.9122089 0 -0.4097257 -0.4097031 0 0.9122189 0.4097349 0 -0.9122047 0.9122075 0 0.4097286 -0.9238802 0 -0.3826822 -0.3826561 0 0.9238908 0.3826887 0 -0.9238774 0.923879 0 0.3826849 -0.9624548 0 -0.2714421 -0.2714144 0 0.9624626 0.2714547 0 -0.9624512 0.9624552 0 0.2714406 -0.9700312 0 -0.2429808 -0.2429934 0 0.970028 0.2429934 0 -0.970028 0.9700312 0 0.2429808 -0.9767659 0 -0.2143091 -0.2143083 0 0.9767661 0.2143083 0 -0.9767661 0.9767659 0 0.2143091 -0.9826527 0 -0.1854557 -0.1854676 0 0.9826504 0.1854343 0 -0.9826567 0.9826536 0 0.1854506 -0.9976393 0 -0.06867196 -0.06870259 0 0.9976372 0.06866463 0 -0.9976398 0.9976394 0 0.06867144 -0.9992288 0 -0.03926466 -0.03925278 0 0.9992294 0.03925428 0 -0.9992293 0.9992291 0 0.03925704 -0.9999518 0 -0.009819007 -0.009841781 0 0.9999516 0.009841968 0 -0.9999516 0.9999519 0 0.009815193 -0.9876885 0 -0.1564335 -0.1564386 0 0.9876877 0.1564386 0 -0.9876877 0.9876885 0 0.1564335 -0.9918667 0 -0.1272811 -0.1272596 0 0.9918694 0.1272596 0 -0.9918694 0.9918667 0 0.1272811 -0.9951846 0 -0.09801852 -0.09799852 0 0.9951866 0.09800038 0 -0.9951864 0.995185 0 0.09801475 -0.9941747 0 0.1077808 0.1078018 0 0.9941724 -0.1078039 0 -0.9941723 0.9941744 0 -0.1077846 -0.9905688 0 0.1370161 0.1370246 0 0.9905676 -0.1370246 0 -0.9905676 0.9905688 0 -0.1370161 -0.9861053 0 0.1661222 0.1661308 0 0.9861038 -0.1661308 0 -0.9861038 0.9861053 0 -0.1661222 -0.9998072 0 0.01963421 0.01964557 0 0.999807 -0.01964557 0 -0.999807 0.9998072 0 -0.01963421 -0.9969173 0 0.07846066 0.07846853 0 0.9969166 -0.07846853 0 -0.9969166 0.9969173 0 -0.07846066 -0.9597443 0 0.2808753 0.2808722 0 0.9597452 -0.2808722 0 -0.9597452 0.9597443 0 -0.2808753 -0.9510567 0 0.3090169 0.3090261 0 0.9510536 -0.3089916 0 -0.9510648 0.9510558 0 -0.3090191 -0.9746145 0 0.2238896 0.2238481 0 0.974624 -0.2239164 0 -0.9746084 0.9746161 0 -0.2238826 -0.9675983 0 0.2524949 0.2524949 0 0.9675983 -0.2524949 0 -0.9675983 0.9675983 0 -0.2524949 -0.8954199 0 0.4452228 0.4452136 0 0.8954245 -0.4452136 0 -0.8954245 0.8954199 0 -0.4452228 -0.8819207 0 0.4713978 0.4714157 0 0.8819112 -0.4714157 0 -0.8819112 0.8819207 0 -0.4713978 -0.867655 0 0.4971669 0.497141 0 0.8676698 -0.4971615 0 -0.8676581 0.8676585 0 -0.4971607 -0.9312145 0 0.3644719 0.3644612 0 0.9312186 -0.3644879 0 -0.9312083 0.9312167 0 -0.364466 -0.9200761 0 0.3917396 0.3917359 0 0.9200777 -0.391729 0 -0.9200807 0.9200776 0 -0.3917364 -0.9081434 0 0.4186595 0.4186227 0 0.9081603 -0.4186687 0 -0.9081392 0.9081418 0 -0.4186629 -0.8032076 0 0.5956994 0.595679 0 0.8032225 -0.5957037 0 -0.8032044 0.8032103 0 -0.5956957 -0.7853163 0 0.6190947 0.6190919 0 0.7853186 -0.6190919 0 -0.7853186 0.7853163 0 -0.6190947 -0.7667453 0 0.6419514 0.6419481 0 0.7667481 -0.6419481 0 -0.7667481 0.7667453 0 -0.6419514 -0.8526394 0 0.5224998 0.5225066 0 0.8526353 -0.5225066 0 -0.8526353 0.8526394 0 -0.5224998 -0.8368829 0 0.547382 0.5473809 0 0.8368836 -0.5473722 0 -0.8368893 0.8368847 0 -0.5473793 -0.8204012 0 0.5717883 0.5717829 0 0.8204049 -0.5718086 0 -0.8203871 0.8204037 0 -0.5717847 -0.7475085 0 0.6642523 0.6642431 0 0.7475166 -0.6642739 0 -0.7474893 0.7475099 0 -0.6642507 -0.7276191 0 0.6859814 0.6859713 0 0.7276286 -0.6859915 0 -0.7276095 0.7276226 0 -0.6859776 -0.8577288 0 -0.5141023 -0.5141031 0 0.8577285 0.5141031 0 -0.8577285 0.8577288 0 0.5141023 -0.7730104 0 -0.6343934 -0.6343993 0 0.7730055 0.6343993 0 -0.7730055 0.7730104 0 0.6343934 -0.6715588 0 -0.7409513 -0.7409585 0 0.6715509 0.7409318 0 -0.6715803 0.6715597 0 0.7409505 -0.5555696 0 -0.83147 -0.8314689 0 0.5555714 0.8314689 0 -0.5555714 0.5555696 0 0.83147 -0.9987955 0 0.04906842 0.04907621 0 0.9987952 -0.0490567 0 -0.998796 0.9987955 0 -0.04906774 -0.9700314 0 -0.2429794 -0.2429799 0 0.9700313 0.2429754 0 -0.9700325 0.9700312 0 0.2429808 -0.9951849 0 -0.09801642 -0.09801927 0 0.9951846 0.09800038 0 -0.9951864 0.9951848 0 0.09801625 -0.9415439 0 0.3368905 0.3368946 0 0.9415424 -0.3368946 0 -0.9415424 0.9415439 0 -0.3368905 -0.9951849 0 -0.09801642 -0.09801896 0 0.9951845 0.09801834 0 -0.9951847 0.9951847 0 0.09801792 0.7071072 0 0.7071064 0.7071052 0 -0.7071084 -0.70711 0 0.7071036 -0.7071068 0 -0.7071068 0.8819211 0 0.4713972 0.4713946 0 -0.8819225 -0.4713984 0 0.8819205 -0.8819212 0 -0.4713969 0.9807854 0 0.1950897 0.1950902 0 -0.9807853 -0.1950902 0 0.9807853 -0.9807854 0 -0.1950897 0.9951847 0 -0.09801784 -0.09801897 0 -0.9951846 0.09801519 0 0.9951849 -0.9951848 0 0.09801641</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320_2Shape-binormals-array" count="820" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320_2Shape-map1" name="qt_gauge_tickmarks_320_2Shape-map1">
+ <float_array id="qt_gauge_tickmarks_320_2Shape-map1-array" count="1640">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320_2Shape-map1-array" count="820" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320_2Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_320_2Shape-textangents-array" count="2460">0.3826844 0 -0.9238791 0.3826811 0 -0.9238805 0.3826778 0 -0.9238818 0.3826811 0 -0.9238805 0.6343917 0 -0.7730117 0.6343936 0 -0.7730101 0.6343955 0 -0.7730085 0.6343936 0 -0.7730101 0.8314688 0 -0.5555714 0.8314688 0 -0.5555714 0.8314688 0 -0.5555714 0.8314688 0 -0.5555714 -0.4713945 0 -0.8819224 -0.4713952 0 -0.881922 -0.4713959 0 -0.8819217 -0.4713952 0 -0.881922 -0.1950963 0 -0.9807841 -0.1950933 0 -0.9807847 -0.1950902 0 -0.9807853 -0.1950933 0 -0.9807847 -0.7071052 0 -0.7071083 -0.7071075 0 -0.7071059 -0.7071099 0 -0.7071036 -0.7071075 0 -0.7071059 0.3826844 0 0.9238791 0.3826838 0 0.9238793 0.3826832 0 0.9238796 0.3826838 0 0.9238793 0.6343917 0 0.7730117 0.6343926 0 0.7730109 0.6343936 0 0.7730101 0.6343926 0 0.7730109 0.8314688 0 0.5555714 0.8314683 0 0.5555721 0.8314678 0 0.5555728 0.8314683 0 0.5555721 0.9569399 0 0.290286 0.9569399 0 0.290286 0.9569399 0 0.290286 0.9569399 0 0.290286 0.9569402 0 -0.2902851 0.9569402 0 -0.2902851 0.9569402 0 -0.2902851 0.9569402 0 -0.2902851 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 -0.4713968 0 -0.8819212 -0.4713988 0 -0.8819201 -0.4714008 0 -0.8819191 -0.4713988 0 -0.8819201 -0.5956867 0 -0.8032168 -0.5956952 0 -0.8032105 -0.5957036 0 -0.8032042 -0.5956952 0 -0.8032105 0.3826772 0 0.9238821 0.3826829 0 0.9238797 0.3826887 0 0.9238773 0.3826829 0 0.9238797 0.514103 0 0.8577284 0.514103 0 0.8577284 0.514103 0 0.8577284 0.514103 0 0.8577284 0.6343936 0 0.7730101 0.6343936 0 0.7730101 0.6343936 0 0.7730101 0.6343936 0 0.7730101 -0.0490762 0 0.998795 -0.04907121 0 0.9987953 -0.04906622 0 0.9987955 -0.04907121 0 0.9987953 0.09801926 0 0.9951845 0.09801926 0 0.9951845 0.09801926 0 0.9951845 0.09801926 0 0.9951845 0.2429889 0 0.9700291 0.2429821 0 0.9700306 0.2429754 0 0.9700324 0.2429821 0 0.9700306 0.9569414 0 0.290281 0.9569414 0 0.290281 0.9569414 0 0.290281 0.9569414 0 0.290281 0.9891765 0 0.1467304 0.9891763 0 0.1467318 0.989176 0 0.1467332 0.9891763 0 0.1467318 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 -0.4713894 0 0.8819252 -0.4713914 0 0.8819241 -0.4713933 0 0.881923 -0.4713914 0 0.8819241 -0.3368861 0 0.9415454 -0.3368903 0 0.9415438 -0.3368945 0 0.9415423 -0.3368903 0 0.9415438 -0.1950926 0 0.9807847 -0.1950926 0 0.9807847 -0.1950926 0 0.9807847 -0.1950926 0 0.9807847 -0.7071019 0 0.7071115 -0.7071068 0 0.7071068 -0.7071115 0 0.7071019 -0.7071068 0 0.7071068 -0.5956929 0 0.8032122 -0.5956983 0 0.8032082 -0.5957036 0 0.8032042 -0.5956983 0 0.8032082 0.9891765 0 -0.1467304 0.9891763 0 -0.1467318 0.989176 0 -0.1467332 0.9891763 0 -0.1467318 0.9569414 0 -0.290281 0.9569414 0 -0.290281 0.9569414 0 -0.290281 0.9569414 0 -0.290281 0.9039904 0 -0.4275525 0.9039904 0 -0.4275525 0.9039904 0 -0.4275525 0.9039904 0 -0.4275525 0.7409541 0 0.6715555 0.7409451 0 0.6715655 0.740936 0 0.6715755 0.7409451 0 0.6715655 0.8314688 0 0.5555714 0.8314688 0 0.5555714 0.8314688 0 0.5555714 0.8314688 0 0.5555714 0.9039922 0 0.4275488 0.9039913 0 0.4275507 0.9039904 0 0.4275525 0.9039913 0 0.4275507 0.382669 0 -0.9238854 0.3826788 0 -0.9238814 0.3826887 0 -0.9238773 0.3826788 0 -0.9238814 -0.641948 0 0.766748 -0.6419537 0 0.7667434 -0.6419593 0 0.7667386 -0.6419537 0 0.7667434 -0.6190919 0 0.7853186 -0.6190919 0 0.7853186 -0.6190919 0 0.7853186 -0.6190919 0 0.7853186 -0.5956913 0 0.8032134 -0.5956975 0 0.8032088 -0.5957036 0 0.8032042 -0.5956975 0 0.8032088 -0.7070877 0 0.7071258 -0.7070924 0 0.707121 -0.7070972 0 0.7071162 -0.7070924 0 0.707121 -0.6859813 0 0.727619 -0.6859813 0 0.727619 -0.6859813 0 0.727619 -0.6859813 0 0.727619 -0.664243 0 0.7475166 -0.6642531 0 0.7475077 -0.6642631 0 0.7474987 -0.6642531 0 0.7475077 -0.5717829 0 0.8204049 -0.5717829 0 0.8204049 -0.5717829 0 0.8204049 -0.5717829 0 0.8204049 -0.5473809 0 0.8368835 -0.5473765 0 0.8368864 -0.5473721 0 0.8368893 -0.5473765 0 0.8368864 -0.5225065 0 0.8526352 -0.5225065 0 0.8526352 -0.5225065 0 0.8526352 -0.5225065 0 0.8526352 -0.4186384 0 0.9081529 -0.4186535 0 0.908146 -0.4186687 0 0.9081391 -0.4186535 0 0.908146 -0.3917359 0 0.9200777 -0.3917405 0 0.9200757 -0.3917452 0 0.9200737 -0.3917405 0 0.9200757 -0.3644612 0 0.9312185 -0.3644662 0 0.9312165 -0.3644712 0 0.9312146 -0.3644662 0 0.9312165 -0.4971697 0 0.8676533 -0.4971656 0 0.8676556 -0.4971615 0 0.867658 -0.4971656 0 0.8676556 -0.4714156 0 0.8819111 -0.4714082 0 0.8819151 -0.4714008 0 0.8819191 -0.4714082 0 0.8819151 -0.4452288 0 0.8954167 -0.4452212 0 0.8954206 -0.4452136 0 0.8954244 -0.4452212 0 0.8954206 -0.2524948 0 0.9675982 -0.2524948 0 0.9675982 -0.2524948 0 0.9675982 -0.2524948 0 0.9675982 -0.2238842 0 0.9746156 -0.2238912 0 0.9746141 -0.2238982 0 0.9746125 -0.2238912 0 0.9746141 -0.1950853 0 0.9807862 -0.1950835 0 0.9807866 -0.1950817 0 0.980787 -0.1950835 0 0.9807866 -0.3368945 0 0.9415423 -0.3368945 0 0.9415423 -0.3368945 0 0.9415423 -0.3368945 0 0.9415423 -0.3090088 0 0.9510591 -0.3090088 0 0.9510591 -0.3090088 0 0.9510591 -0.3090088 0 0.9510591 -0.2808722 0 0.9597451 -0.280881 0 0.9597425 -0.2808897 0 0.95974 -0.280881 0 0.9597425 -0.1661308 0 0.9861037 -0.1661308 0 0.9861037 -0.1661308 0 0.9861037 -0.1661308 0 0.9861037 -0.1370059 0 0.9905702 -0.1370153 0 0.9905689 -0.1370246 0 0.9905676 -0.1370153 0 0.9905689 -0.107783 0 0.9941744 -0.107784 0 0.9941743 -0.107785 0 0.9941742 -0.107784 0 0.9941743 -0.07844957 0 0.996918 -0.07844957 0 0.996918 -0.07844957 0 0.996918 -0.07844957 0 0.996918 -0.04907573 0 0.998795 -0.0490762 0 0.998795 -0.04907666 0 0.998795 -0.0490762 0 0.998795 -0.01964557 0 0.9998069 -0.01963604 0 0.9998071 -0.0196265 0 0.9998073 -0.01963604 0 0.9998071 0.009822708 0 0.9999517 0.009822802 0 0.9999517 0.009822895 0 0.9999517 0.009822802 0 0.9999517 0.1272971 0 0.9918646 0.1272783 0 0.9918669 0.1272596 0 0.9918694 0.1272783 0 0.9918669 0.1564385 0 0.9876876 0.1564293 0 0.9876891 0.1564199 0 0.9876906 0.1564293 0 0.9876891 0.1854492 0 0.9826538 0.1854509 0 0.9826535 0.1854527 0 0.9826531 0.1854509 0 0.9826535 0.03925278 0 0.9992293 0.03926305 0 0.9992288 0.03927332 0 0.9992285 0.03926305 0 0.9992288 0.06868361 0 0.9976385 0.06867411 0 0.9976391 0.06866463 0 0.9976398 0.06867411 0 0.9976391 0.09799851 0 0.9951865 0.09799944 0 0.9951864 0.09800037 0 0.9951863 0.09799944 0 0.9951864 0.2143083 0 0.976766 0.2143083 0 0.976766 0.2143083 0 0.976766 0.2143083 0 0.976766 0.2429754 0 0.9700324 0.2429754 0 0.9700324 0.2429754 0 0.9700324 0.2429754 0 0.9700324 0.271432 0 0.9624575 0.2714345 0 0.9624569 0.271437 0 0.9624562 0.2714345 0 0.9624569 0.2996604 0 0.9540459 0.2996632 0 0.954045 0.2996659 0 0.9540442 0.2996632 0 0.954045 0.3276431 0 0.9448015 0.3276317 0 0.9448055 0.3276202 0 0.9448095 0.3276317 0 0.9448055 0.3553171 0 0.9347458 0.3553087 0 0.9347489 0.3553004 0 0.9347521 0.3553087 0 0.9347489 0.3826724 0 0.923884 0.3826724 0 0.923884 0.3826724 0 0.923884 0.3826724 0 0.923884 0.4097031 0 0.9122189 0.409711 0 0.9122153 0.409719 0 0.9122117 0.409711 0 0.9122153 0.4364162 0 0.8997449 0.4364085 0 0.8997486 0.4364008 0 0.8997523 0.4364085 0 0.8997486 0.5391283 0 0.8422235 0.5391327 0 0.8422208 0.539137 0 0.842218 0.5391327 0 0.8422208 0.5637125 0 0.8259709 0.5637016 0 0.8259785 0.5636906 0 0.8259859 0.5637016 0 0.8259785 0.5877848 0 0.8090172 0.5877848 0 0.8090172 0.5877848 0 0.8090172 0.5877848 0 0.8090172 0.4627171 0 0.8865058 0.4627211 0 0.8865039 0.462725 0 0.8865018 0.4627211 0 0.8865039 0.4886231 0 0.8724949 0.4886231 0 0.8724949 0.4886231 0 0.8724949 0.4886231 0 0.8724949 0.5140973 0 0.8577318 0.5140932 0 0.8577343 0.5140889 0 0.8577367 0.5140932 0 0.8577343 0.6113584 0 0.7913537 0.6113525 0 0.7913584 0.6113465 0 0.7913629 0.6113525 0 0.7913584 0.6343879 0 0.7730148 0.6343879 0 0.7730148 0.6343879 0 0.7730148 0.6343879 0 0.7730148 0.6568961 0 0.753981 0.6568813 0 0.7539939 0.6568664 0 0.7540069 0.6568813 0 0.7539939 0.6788003 0 0.7343228 0.6788047 0 0.7343187 0.6788091 0 0.7343147 0.6788047 0 0.7343187 0.7001204 0 0.7140248 0.7001348 0 0.7140106 0.7001492 0 0.7139965 0.7001348 0 0.7140106 0.7208748 0 0.6930652 0.7208607 0 0.6930799 0.7208466 0 0.6930946 0.7208607 0 0.6930799 0.7409489 0 0.6715612 0.7409447 0 0.671566 0.7409403 0 0.6715707 0.7409447 0 0.671566 0.8147619 0 0.5797957 0.8147619 0 0.5797957 0.8147619 0 0.5797957 0.8147619 0 0.5797957 0.8314688 0 0.5555714 0.8314688 0 0.5555714 0.8314688 0 0.5555714 0.8314688 0 0.5555714 0.8474717 0 0.5308404 0.847469 0 0.5308447 0.8474663 0 0.530849 0.847469 0 0.5308447 0.7604213 0 0.64943 0.7604213 0 0.64943 0.7604213 0 0.64943 0.7604213 0 0.64943 0.7792136 0 0.6267583 0.7792005 0 0.6267746 0.7791874 0 0.6267908 0.7792005 0 0.6267746 0.7973463 0 0.6035219 0.7973302 0 0.6035432 0.797314 0 0.6035646 0.7973302 0 0.6035432 0.9039757 0 0.4275837 0.9039831 0 0.4275681 0.9039904 0 0.4275525 0.9039831 0 0.4275681 0.9162054 0 0.4007087 0.9161914 0 0.4007408 0.9161775 0 0.4007728 0.9161914 0 0.4007408 0.9275848 0 0.3736126 0.9275861 0 0.3736093 0.9275874 0 0.373606 0.9275861 0 0.3736093 0.8627254 0 0.5056725 0.8627254 0 0.5056725 0.8627254 0 0.5056725 0.8627254 0 0.5056725 0.8772416 0 0.4800491 0.8772518 0 0.4800304 0.8772621 0 0.4800117 0.8772518 0 0.4800304 0.8910102 0 0.4539832 0.8910082 0 0.453987 0.8910062 0 0.4539909 0.8910082 0 0.453987 0.9650703 0 0.2619907 0.9650751 0 0.2619729 0.96508 0 0.2619552 0.9650751 0 0.2619729 0.9723752 0 0.2334235 0.9723708 0 0.2334415 0.9723665 0 0.2334595 0.9723708 0 0.2334415 0.9788265 0 0.2046915 0.9788219 0 0.2047136 0.9788173 0 0.2047357 0.9788219 0 0.2047136 0.9381939 0 0.3461102 0.9381888 0 0.3461238 0.9381837 0 0.3461375 0.9381888 0 0.3461238 0.9479771 0 0.3183384 0.9479713 0 0.3183556 0.9479656 0 0.3183727 0.9479713 0 0.3183556 0.9569377 0 0.2902932 0.956943 0 0.2902758 0.9569483 0 0.2902583 0.956943 0 0.2902758 0.9844235 0 0.1758131 0.9844229 0 0.1758164 0.9844223 0 0.1758197 0.9844229 0 0.1758164 0.9891729 0 0.1467546 0.989176 0 0.1467332 0.9891793 0 0.1467118 0.989176 0 0.1467332 0.9930694 0 0.1175295 0.993069 0 0.1175318 0.9930688 0 0.117534 0.993069 0 0.1175318 0.9960997 0 0.08823448 0.9960997 0 0.08823448 0.9960997 0 0.08823448 0.9960997 0 0.08823448 0.9982662 0 0.05886066 0.9982662 0 0.05886066 0.9982662 0 0.05886066 0.9982662 0 0.05886066 0.9995663 0 0.0294495 0.9995663 0 0.0294495 0.9995663 0 0.0294495 0.9995663 0 0.0294495 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9930694 0 -0.1175295 0.993069 0 -0.1175318 0.9930688 0 -0.117534 0.993069 0 -0.1175318 0.9891729 0 -0.1467546 0.989176 0 -0.1467332 0.9891793 0 -0.1467118 0.989176 0 -0.1467332 0.9844235 0 -0.1758131 0.9844229 0 -0.1758164 0.9844223 0 -0.1758197 0.9844229 0 -0.1758164 0.9995663 0 -0.0294495 0.9995663 0 -0.0294495 0.9995663 0 -0.0294495 0.9995663 0 -0.0294495 0.9982662 0 -0.05886066 0.9982662 0 -0.05886066 0.9982662 0 -0.05886066 0.9982662 0 -0.05886066 0.9960997 0 -0.08823448 0.9960997 0 -0.08823448 0.9960997 0 -0.08823448 0.9960997 0 -0.08823448 0.9569377 0 -0.2902932 0.956943 0 -0.2902758 0.9569483 0 -0.2902583 0.956943 0 -0.2902758 0.947979 0 -0.3183326 0.9479712 0 -0.3183555 0.9479635 0 -0.3183784 0.9479712 0 -0.3183555 0.9381939 0 -0.3461102 0.9381875 0 -0.3461269 0.9381813 0 -0.3461437 0.9381875 0 -0.3461269 0.9788265 0 -0.2046915 0.9788219 0 -0.2047136 0.9788173 0 -0.2047357 0.9788219 0 -0.2047136 0.9723752 0 -0.2334235 0.9723708 0 -0.2334415 0.9723665 0 -0.2334595 0.9723708 0 -0.2334415 0.9650703 0 -0.2619907 0.9650751 0 -0.2619729 0.96508 0 -0.2619552 0.9650751 0 -0.2619729 0.9275848 0 -0.3736126 0.9275848 0 -0.3736126 0.9275848 0 -0.3736126 0.9275848 0 -0.3736126 0.9162054 0 -0.4007087 0.9161914 0 -0.4007408 0.9161775 0 -0.4007728 0.9161914 0 -0.4007408 0.9039723 0 -0.4275911 0.9039796 0 -0.4275754 0.9039869 0 -0.4275598 0.9039796 0 -0.4275754 0.8474663 0 -0.530849 0.8474663 0 -0.530849 0.8474663 0 -0.530849 0.8474663 0 -0.530849 0.8314629 0 -0.5555801 0.8314629 0 -0.5555801 0.8314629 0 -0.5555801 0.8314629 0 -0.5555801 0.8147683 0 -0.5797866 0.8147618 0 -0.5797957 0.8147554 0 -0.5798047 0.8147618 0 -0.5797957 0.7973463 0 -0.6035219 0.7973302 0 -0.6035432 0.797314 0 -0.6035646 0.7973302 0 -0.6035432 0.8910062 0 -0.4539909 0.8910062 0 -0.4539909 0.8910062 0 -0.4539909 0.8910062 0 -0.4539909 0.8772416 0 -0.4800491 0.877254 0 -0.4800264 0.8772664 0 -0.4800036 0.877254 0 -0.4800264 0.8627254 0 -0.5056725 0.8627254 0 -0.5056725 0.8627254 0 -0.5056725 0.8627254 0 -0.5056725 0.7792211 0 -0.626749 0.7792042 0 -0.62677 0.7791874 0 -0.6267908 0.7792042 0 -0.62677 0.7604293 0 -0.6494206 0.7604293 0 -0.6494206 0.7604293 0 -0.6494206 0.7604293 0 -0.6494206 0.7409489 0 -0.6715612 0.7409403 0 -0.6715707 0.7409317 0 -0.6715803 0.7409403 0 -0.6715707 0.6568961 0 -0.753981 0.6568867 0 -0.7539893 0.6568772 0 -0.7539974 0.6568867 0 -0.7539893 0.6343879 0 -0.7730148 0.6343993 0 -0.7730055 0.6344107 0 -0.7729961 0.6343993 0 -0.7730055 0.6113704 0 -0.7913445 0.6113584 0 -0.7913537 0.6113465 0 -0.7913629 0.6113584 0 -0.7913537 0.7208748 0 -0.6930652 0.7208652 0 -0.6930751 0.7208557 0 -0.693085 0.7208652 0 -0.6930751 0.7001301 0 -0.7140152 0.7001396 0 -0.7140058 0.7001492 0 -0.7139965 0.7001396 0 -0.7140058 0.6788107 0 -0.7343133 0.6788098 0 -0.734314 0.6788091 0 -0.7343147 0.6788098 0 -0.734314 0.5140833 0 -0.8577402 0.5140791 0 -0.8577427 0.5140749 0 -0.8577452 0.5140791 0 -0.8577427 0.4885941 0 -0.8725111 0.4885941 0 -0.8725111 0.4885941 0 -0.8725111 0.4885941 0 -0.8725111 0.4627171 0 -0.8865058 0.4627211 0 -0.8865039 0.462725 0 -0.8865018 0.4627211 0 -0.8865039 0.5877973 0 -0.8090081 0.5877973 0 -0.8090081 0.5877973 0 -0.8090081 0.5877973 0 -0.8090081 0.5636995 0 -0.8259799 0.563682 0 -0.8259917 0.5636646 0 -0.8260037 0.563682 0 -0.8259917 0.5391283 0 -0.8422235 0.5391327 0 -0.8422208 0.539137 0 -0.842218 0.5391327 0 -0.8422208 0.3553004 0 -0.9347521 0.3553004 0 -0.9347521 0.3553004 0 -0.9347521 0.3553004 0 -0.9347521 0.3276431 0 -0.9448015 0.3276401 0 -0.9448025 0.3276372 0 -0.9448036 0.3276401 0 -0.9448025 0.2996778 0 -0.9540404 0.2996805 0 -0.9540396 0.2996832 0 -0.9540387 0.2996805 0 -0.9540396 0.4364008 0 -0.8997523 0.4364008 0 -0.8997523 0.4364008 0 -0.8997523 0.4364008 0 -0.8997523 0.4097031 0 -0.9122189 0.409719 0 -0.9122117 0.4097349 0 -0.9122046 0.409719 0 -0.9122117 0.3826561 0 -0.9238908 0.3826724 0 -0.923884 0.3826887 0 -0.9238773 0.3826724 0 -0.923884 0.2714144 0 -0.9624625 0.2714345 0 -0.9624568 0.2714547 0 -0.9624512 0.2714345 0 -0.9624568 0.2429934 0 -0.9700279 0.2429934 0 -0.9700279 0.2429934 0 -0.9700279 0.2429934 0 -0.9700279 0.2143083 0 -0.976766 0.2143083 0 -0.976766 0.2143083 0 -0.976766 0.2143083 0 -0.976766 0.1854676 0 -0.9826503 0.1854509 0 -0.9826535 0.1854343 0 -0.9826567 0.1854509 0 -0.9826535 0.06870258 0 -0.997637 0.06868361 0 -0.9976385 0.06866463 0 -0.9976398 0.06868361 0 -0.9976385 0.03925278 0 -0.9992293 0.03925353 0 -0.9992293 0.03925427 0 -0.9992292 0.03925353 0 -0.9992293 0.00984178 0 -0.9999515 0.009841874 0 -0.9999515 0.009841968 0 -0.9999515 0.009841874 0 -0.9999515 0.1564385 0 -0.9876876 0.1564385 0 -0.9876876 0.1564385 0 -0.9876876 0.1564385 0 -0.9876876 0.1272596 0 -0.9918694 0.1272596 0 -0.9918694 0.1272596 0 -0.9918694 0.1272596 0 -0.9918694 0.09799851 0 -0.9951865 0.09799944 0 -0.9951864 0.09800037 0 -0.9951863 0.09799944 0 -0.9951864 -0.1078018 0 -0.9941723 -0.1078028 0 -0.9941722 -0.1078039 0 -0.9941722 -0.1078028 0 -0.9941722 -0.1370246 0 -0.9905676 -0.1370246 0 -0.9905676 -0.1370246 0 -0.9905676 -0.1370246 0 -0.9905676 -0.1661308 0 -0.9861037 -0.1661308 0 -0.9861037 -0.1661308 0 -0.9861037 -0.1661308 0 -0.9861037 -0.01964557 0 -0.9998069 -0.01964557 0 -0.9998069 -0.01964557 0 -0.9998069 -0.01964557 0 -0.9998069 -0.07846852 0 -0.9969165 -0.07846852 0 -0.9969165 -0.07846852 0 -0.9969165 -0.07846852 0 -0.9969165 -0.2808722 0 -0.9597451 -0.2808722 0 -0.9597451 -0.2808722 0 -0.9597451 -0.2808722 0 -0.9597451 -0.3090261 0 -0.9510535 -0.3090088 0 -0.9510591 -0.3089916 0 -0.9510647 -0.3090088 0 -0.9510591 -0.223848 0 -0.974624 -0.2238822 0 -0.9746162 -0.2239164 0 -0.9746083 -0.2238822 0 -0.9746162 -0.2524948 0 -0.9675982 -0.2524948 0 -0.9675982 -0.2524948 0 -0.9675982 -0.2524948 0 -0.9675982 -0.4452136 0 -0.8954244 -0.4452136 0 -0.8954244 -0.4452136 0 -0.8954244 -0.4452136 0 -0.8954244 -0.4714156 0 -0.8819111 -0.4714156 0 -0.8819111 -0.4714156 0 -0.8819111 -0.4714156 0 -0.8819111 -0.497141 0 -0.8676697 -0.4971513 0 -0.8676639 -0.4971615 0 -0.867658 -0.4971513 0 -0.8676639 -0.3644612 0 -0.9312185 -0.3644744 0 -0.9312133 -0.3644878 0 -0.9312081 -0.3644744 0 -0.9312133 -0.3917359 0 -0.9200777 -0.3917324 0 -0.9200791 -0.391729 0 -0.9200805 -0.3917324 0 -0.9200791 -0.4186227 0 -0.9081602 -0.4186457 0 -0.9081496 -0.4186687 0 -0.9081391 -0.4186457 0 -0.9081496 -0.595679 0 -0.8032225 -0.5956913 0 -0.8032134 -0.5957036 0 -0.8032042 -0.5956913 0 -0.8032134 -0.6190919 0 -0.7853186 -0.6190919 0 -0.7853186 -0.6190919 0 -0.7853186 -0.6190919 0 -0.7853186 -0.641948 0 -0.766748 -0.641948 0 -0.766748 -0.641948 0 -0.766748 -0.641948 0 -0.766748 -0.5225065 0 -0.8526352 -0.5225065 0 -0.8526352 -0.5225065 0 -0.8526352 -0.5225065 0 -0.8526352 -0.5473809 0 -0.8368835 -0.5473765 0 -0.8368864 -0.5473721 0 -0.8368893 -0.5473765 0 -0.8368864 -0.5717829 0 -0.8204049 -0.5717957 0 -0.8203959 -0.5718085 0 -0.8203869 -0.5717957 0 -0.8203959 -0.664243 0 -0.7475166 -0.6642584 0 -0.7475029 -0.6642738 0 -0.7474892 -0.6642584 0 -0.7475029 -0.6859713 0 -0.7276285 -0.6859813 0 -0.727619 -0.6859915 0 -0.7276095 -0.6859813 0 -0.727619 0.514103 0 -0.8577284 0.514103 0 -0.8577284 0.514103 0 -0.8577284 0.514103 0 -0.8577284 0.6343993 0 -0.7730055 0.6343993 0 -0.7730055 0.6343993 0 -0.7730055 0.6343993 0 -0.7730055 0.7409584 0 -0.6715508 0.740945 0 -0.6715655 0.7409317 0 -0.6715803 0.740945 0 -0.6715655 0.8314688 0 -0.5555714 0.8314688 0 -0.5555714 0.8314688 0 -0.5555714 0.8314688 0 -0.5555714 -0.0490762 0 -0.998795 -0.04906645 0 -0.9987955 -0.0490567 0 -0.998796 -0.04906645 0 -0.9987955 0.2429799 0 -0.9700313 0.2429776 0 -0.9700319 0.2429754 0 -0.9700324 0.2429776 0 -0.9700319 0.09801926 0 -0.9951845 0.09800981 0 -0.9951853 0.09800037 0 -0.9951863 0.09800981 0 -0.9951853 -0.3368945 0 -0.9415423 -0.3368945 0 -0.9415423 -0.3368945 0 -0.9415423 -0.3368945 0 -0.9415423 0.09801895 0 -0.9951845 0.09801865 0 -0.9951845 0.09801833 0 -0.9951845 0.09801865 0 -0.9951845 -0.7071052 0 0.7071083 -0.7071075 0 0.7071059 -0.7071099 0 0.7071036 -0.7071075 0 0.7071059 -0.4713945 0 0.8819224 -0.4713964 0 0.8819214 -0.4713983 0 0.8819204 -0.4713964 0 0.8819214 -0.1950902 0 0.9807853 -0.1950902 0 0.9807853 -0.1950902 0 0.9807853 -0.1950902 0 0.9807853 0.09801895 0 0.9951845 0.09801707 0 0.9951847 0.09801519 0 0.9951849 0.09801707 0 0.9951847</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320_2Shape-textangents-array" count="820" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_320_2Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_320_2Shape-texbinormals-array" count="2460">-0.9238792 0 -0.3826844 -0.9238806 0 -0.3826812 -0.9238819 0 -0.3826779 -0.9238806 0 -0.3826812 -0.7730118 0 -0.6343917 -0.7730102 0 -0.6343936 -0.7730086 0 -0.6343955 -0.7730103 0 -0.6343937 -0.5555714 0 -0.8314689 -0.5555714 0 -0.8314689 -0.5555714 0 -0.8314689 -0.5555714 0 -0.8314689 -0.8819225 0 0.4713946 -0.8819221 0 0.4713952 -0.8819218 0 0.4713959 -0.8819221 0 0.4713952 -0.9807841 0 0.1950963 -0.9807848 0 0.1950933 -0.9807854 0 0.1950902 -0.9807848 0 0.1950933 -0.7071084 0 0.7071053 -0.7071059 0 0.7071075 -0.7071037 0 0.70711 -0.7071059 0 0.7071075 0.9238792 0 -0.3826844 0.9238794 0 -0.3826838 0.9238796 0 -0.3826833 0.9238794 0 -0.3826838 0.7730118 0 -0.6343918 0.773011 0 -0.6343926 0.7730103 0 -0.6343936 0.773011 0 -0.6343926 0.5555714 0 -0.8314689 0.5555722 0 -0.8314684 0.5555729 0 -0.8314679 0.5555722 0 -0.8314684 0.290286 0 -0.95694 0.290286 0 -0.95694 0.290286 0 -0.95694 0.290286 0 -0.95694 -0.2902851 0 -0.9569402 -0.2902852 0 -0.9569403 -0.2902851 0 -0.9569402 -0.2902852 0 -0.9569403 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.8819212 0 0.4713968 -0.8819202 0 0.4713989 -0.8819192 0 0.4714009 -0.8819202 0 0.4713989 -0.8032168 0 0.5956868 -0.8032106 0 0.5956953 -0.8032043 0 0.5957037 -0.8032106 0 0.5956953 0.9238822 0 -0.3826772 0.9238797 0 -0.3826829 0.9238774 0 -0.3826887 0.9238798 0 -0.382683 0.8577285 0 -0.5141031 0.8577285 0 -0.5141031 0.8577285 0 -0.5141031 0.8577285 0 -0.5141031 0.7730103 0 -0.6343936 0.7730103 0 -0.6343936 0.7730103 0 -0.6343936 0.7730103 0 -0.6343936 0.9987952 0 0.0490762 0.9987954 0 0.04907122 0.9987956 0 0.04906622 0.9987954 0 0.04907122 0.9951846 0 -0.09801927 0.9951845 0 -0.09801926 0.9951846 0 -0.09801927 0.9951845 0 -0.09801926 0.9700291 0 -0.2429889 0.9700308 0 -0.2429821 0.9700325 0 -0.2429754 0.9700308 0 -0.2429822 0.290281 0 -0.9569414 0.2902811 0 -0.9569415 0.290281 0 -0.9569414 0.2902811 0 -0.9569415 0.1467305 0 -0.9891766 0.1467319 0 -0.9891764 0.1467332 0 -0.9891762 0.1467319 0 -0.9891764 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.8819253 0 0.4713895 0.8819242 0 0.4713914 0.8819231 0 0.4713934 0.8819242 0 0.4713914 0.9415455 0 0.3368861 0.9415439 0 0.3368903 0.9415424 0 0.3368946 0.9415439 0 0.3368903 0.9807849 0 0.1950927 0.9807849 0 0.1950927 0.9807849 0 0.1950927 0.9807849 0 0.1950927 0.7071116 0 0.7071021 0.7071068 0 0.7071068 0.707102 0 0.7071115 0.7071068 0 0.7071068 0.8032123 0 0.5956929 0.8032084 0 0.5956984 0.8032043 0 0.5957037 0.8032083 0 0.5956983 -0.1467305 0 -0.9891766 -0.1467319 0 -0.9891764 -0.1467332 0 -0.9891762 -0.1467319 0 -0.9891764 -0.2902811 0 -0.9569415 -0.290281 0 -0.9569414 -0.2902811 0 -0.9569415 -0.290281 0 -0.9569414 -0.4275525 0 -0.9039905 -0.4275526 0 -0.9039906 -0.4275525 0 -0.9039905 -0.4275526 0 -0.9039906 0.6715556 0 -0.7409542 0.6715656 0 -0.7409452 0.6715755 0 -0.7409361 0.6715656 0 -0.7409452 0.5555714 0 -0.8314689 0.5555714 0 -0.8314689 0.5555714 0 -0.8314689 0.5555714 0 -0.8314689 0.4275489 0 -0.9039923 0.4275507 0 -0.9039914 0.4275526 0 -0.9039906 0.4275507 0 -0.9039914 -0.9238855 0 -0.3826691 -0.9238815 0 -0.3826789 -0.9238774 0 -0.3826887 -0.9238815 0 -0.3826789 0.7667481 0 0.6419482 0.7667434 0 0.6419537 0.7667387 0 0.6419594 0.7667434 0 0.6419537 0.7853187 0 0.6190919 0.7853187 0 0.6190919 0.7853187 0 0.6190919 0.7853187 0 0.6190919 0.8032135 0 0.5956914 0.8032089 0 0.5956975 0.8032044 0 0.5957037 0.8032089 0 0.5956975 0.7071258 0 0.7070877 0.7071211 0 0.7070925 0.7071163 0 0.7070972 0.7071211 0 0.7070925 0.7276191 0 0.6859815 0.7276191 0 0.6859815 0.7276191 0 0.6859815 0.7276191 0 0.6859815 0.7475167 0 0.6642432 0.7475078 0 0.6642532 0.7474988 0 0.6642632 0.7475077 0 0.6642531 0.820405 0 0.5717829 0.820405 0 0.5717829 0.820405 0 0.5717829 0.820405 0 0.5717829 0.8368837 0 0.5473809 0.8368865 0 0.5473765 0.8368894 0 0.5473722 0.8368865 0 0.5473765 0.8526353 0 0.5225065 0.8526353 0 0.5225066 0.8526353 0 0.5225065 0.8526353 0 0.5225066 0.9081531 0 0.4186385 0.9081461 0 0.4186536 0.9081392 0 0.4186687 0.9081461 0 0.4186536 0.9200778 0 0.3917359 0.9200758 0 0.3917405 0.9200738 0 0.3917452 0.9200758 0 0.3917405 0.9312186 0 0.3644612 0.9312167 0 0.3644662 0.9312147 0 0.3644713 0.9312167 0 0.3644662 0.8676533 0 0.4971697 0.8676557 0 0.4971657 0.8676581 0 0.4971615 0.8676558 0 0.4971657 0.8819112 0 0.4714157 0.8819152 0 0.4714083 0.8819192 0 0.4714009 0.8819152 0 0.4714083 0.8954168 0 0.4452289 0.8954207 0 0.4452213 0.8954245 0 0.4452136 0.8954207 0 0.4452213 0.9675983 0 0.2524948 0.9675983 0 0.2524948 0.9675983 0 0.2524948 0.9675983 0 0.2524948 0.9746158 0 0.2238843 0.9746142 0 0.2238913 0.9746125 0 0.2238982 0.9746142 0 0.2238913 0.9807863 0 0.1950853 0.9807867 0 0.1950835 0.9807871 0 0.1950817 0.9807867 0 0.1950835 0.9415424 0 0.3368945 0.9415424 0 0.3368945 0.9415424 0 0.3368945 0.9415424 0 0.3368945 0.9510592 0 0.3090089 0.9510592 0 0.3090089 0.9510592 0 0.3090089 0.9510592 0 0.3090089 0.9597452 0 0.2808722 0.9597427 0 0.280881 0.95974 0 0.2808897 0.9597427 0 0.280881 0.9861038 0 0.1661308 0.9861038 0 0.1661308 0.9861038 0 0.1661308 0.9861038 0 0.1661308 0.9905703 0 0.1370059 0.990569 0 0.1370153 0.9905677 0 0.1370246 0.990569 0 0.1370153 0.9941745 0 0.107783 0.9941744 0 0.107784 0.9941742 0 0.107785 0.9941744 0 0.107784 0.9969181 0 0.07844958 0.9969181 0 0.07844957 0.9969181 0 0.07844958 0.9969181 0 0.07844957 0.9987952 0 0.04907574 0.9987952 0 0.04907621 0.9987951 0 0.04907667 0.9987952 0 0.04907621 0.9998071 0 0.01964557 0.9998072 0 0.01963604 0.9998074 0 0.0196265 0.9998072 0 0.01963604 0.9999518 0 -0.009822708 0.9999518 0 -0.009822802 0.9999518 0 -0.009822896 0.9999518 0 -0.009822804 0.9918647 0 -0.1272971 0.9918671 0 -0.1272784 0.9918695 0 -0.1272596 0.9918671 0 -0.1272784 0.9876877 0 -0.1564385 0.9876892 0 -0.1564293 0.9876907 0 -0.15642 0.9876892 0 -0.1564293 0.9826539 0 -0.1854492 0.9826536 0 -0.1854509 0.9826532 0 -0.1854527 0.9826536 0 -0.185451 0.9992294 0 -0.03925278 0.999229 0 -0.03926305 0.9992286 0 -0.03927333 0.9992289 0 -0.03926305 0.9976385 0 -0.06868361 0.9976392 0 -0.06867412 0.9976399 0 -0.06866463 0.9976392 0 -0.06867412 0.9951866 0 -0.09799851 0.9951865 0 -0.09799945 0.9951864 0 -0.09800038 0.9951864 0 -0.09799945 0.9767661 0 -0.2143083 0.9767661 0 -0.2143083 0.9767661 0 -0.2143083 0.9767661 0 -0.2143083 0.9700325 0 -0.2429754 0.9700325 0 -0.2429754 0.9700325 0 -0.2429754 0.9700325 0 -0.2429754 0.9624577 0 -0.2714321 0.9624569 0 -0.2714345 0.9624562 0 -0.271437 0.962457 0 -0.2714346 0.954046 0 -0.2996605 0.9540451 0 -0.2996632 0.9540443 0 -0.2996659 0.9540452 0 -0.2996632 0.9448016 0 -0.3276431 0.9448056 0 -0.3276317 0.9448096 0 -0.3276202 0.9448056 0 -0.3276317 0.9347459 0 -0.3553171 0.934749 0 -0.3553087 0.9347522 0 -0.3553004 0.934749 0 -0.3553087 0.9238842 0 -0.3826725 0.9238842 0 -0.3826725 0.9238842 0 -0.3826725 0.9238842 0 -0.3826725 0.912219 0 -0.4097032 0.9122154 0 -0.4097111 0.9122118 0 -0.409719 0.9122154 0 -0.4097111 0.8997449 0 -0.4364163 0.8997487 0 -0.4364085 0.8997524 0 -0.4364008 0.8997487 0 -0.4364085 0.8422236 0 -0.5391284 0.8422209 0 -0.5391328 0.8422181 0 -0.5391371 0.8422209 0 -0.5391328 0.8259711 0 -0.5637126 0.8259786 0 -0.5637016 0.825986 0 -0.5636907 0.8259786 0 -0.5637016 0.8090172 0 -0.5877849 0.8090173 0 -0.5877849 0.8090172 0 -0.5877849 0.8090173 0 -0.5877849 0.886506 0 -0.4627172 0.8865039 0 -0.4627211 0.8865019 0 -0.4627251 0.8865039 0 -0.4627211 0.872495 0 -0.4886231 0.8724951 0 -0.4886232 0.872495 0 -0.4886231 0.8724951 0 -0.4886232 0.8577319 0 -0.5140974 0.8577344 0 -0.5140932 0.8577369 0 -0.514089 0.8577344 0 -0.5140932 0.7913538 0 -0.6113585 0.7913584 0 -0.6113525 0.791363 0 -0.6113465 0.7913584 0 -0.6113525 0.7730149 0 -0.6343879 0.7730149 0 -0.6343879 0.7730149 0 -0.6343879 0.7730149 0 -0.6343879 0.7539811 0 -0.6568962 0.753994 0 -0.6568814 0.754007 0 -0.6568665 0.753994 0 -0.6568813 0.7343229 0 -0.6788005 0.7343189 0 -0.6788048 0.7343148 0 -0.6788092 0.7343189 0 -0.6788048 0.7140248 0 -0.7001204 0.7140107 0 -0.7001348 0.7139966 0 -0.7001493 0.7140107 0 -0.7001348 0.6930653 0 -0.7208749 0.6930799 0 -0.7208607 0.6930947 0 -0.7208467 0.6930799 0 -0.7208607 0.6715614 0 -0.740949 0.671566 0 -0.7409447 0.6715708 0 -0.7409404 0.671566 0 -0.7409447 0.5797957 0 -0.8147619 0.5797957 0 -0.814762 0.5797957 0 -0.8147619 0.5797957 0 -0.814762 0.5555714 0 -0.8314689 0.5555714 0 -0.8314689 0.5555714 0 -0.8314689 0.5555714 0 -0.8314689 0.5308405 0 -0.8474718 0.5308447 0 -0.8474692 0.530849 0 -0.8474665 0.5308447 0 -0.8474692 0.6494301 0 -0.7604214 0.64943 0 -0.7604214 0.6494301 0 -0.7604214 0.64943 0 -0.7604214 0.6267584 0 -0.7792137 0.6267747 0 -0.7792006 0.6267909 0 -0.7791876 0.6267747 0 -0.7792006 0.603522 0 -0.7973464 0.6035433 0 -0.7973303 0.6035646 0 -0.7973141 0.6035433 0 -0.7973303 0.4275837 0 -0.9039758 0.4275681 0 -0.9039832 0.4275525 0 -0.9039905 0.4275682 0 -0.9039832 0.4007088 0 -0.9162055 0.4007408 0 -0.9161915 0.4007728 0 -0.9161775 0.4007408 0 -0.9161916 0.3736126 0 -0.9275848 0.3736094 0 -0.9275862 0.3736061 0 -0.9275875 0.3736094 0 -0.9275862 0.5056725 0 -0.8627256 0.5056725 0 -0.8627256 0.5056725 0 -0.8627256 0.5056725 0 -0.8627256 0.4800491 0 -0.8772417 0.4800304 0 -0.8772519 0.4800117 0 -0.8772621 0.4800304 0 -0.8772519 0.4539832 0 -0.8910103 0.4539871 0 -0.8910084 0.4539909 0 -0.8910063 0.4539871 0 -0.8910083 0.2619907 0 -0.9650704 0.261973 0 -0.9650753 0.2619552 0 -0.9650801 0.261973 0 -0.9650753 0.2334235 0 -0.9723753 0.2334415 0 -0.9723709 0.2334595 0 -0.9723666 0.2334415 0 -0.9723709 0.2046915 0 -0.9788266 0.2047136 0 -0.978822 0.2047357 0 -0.9788174 0.2047136 0 -0.978822 0.3461102 0 -0.9381939 0.3461238 0 -0.9381889 0.3461375 0 -0.9381838 0.3461239 0 -0.9381889 0.3183384 0 -0.9479771 0.3183556 0 -0.9479715 0.3183727 0 -0.9479657 0.3183556 0 -0.9479715 0.2902932 0 -0.9569378 0.2902758 0 -0.9569432 0.2902583 0 -0.9569483 0.2902758 0 -0.9569431 0.1758131 0 -0.9844236 0.1758164 0 -0.984423 0.1758197 0 -0.9844224 0.1758164 0 -0.984423 0.1467546 0 -0.9891729 0.1467332 0 -0.9891762 0.1467118 0 -0.9891794 0.1467332 0 -0.9891761 0.1175295 0 -0.9930694 0.1175318 0 -0.9930692 0.117534 0 -0.9930689 0.1175318 0 -0.9930692 0.08823448 0 -0.9960998 0.08823448 0 -0.9960998 0.08823448 0 -0.9960998 0.08823448 0 -0.9960998 0.05886067 0 -0.9982663 0.05886067 0 -0.9982663 0.05886067 0 -0.9982663 0.05886067 0 -0.9982663 0.0294495 0 -0.9995663 0.0294495 0 -0.9995663 0.0294495 0 -0.9995663 0.0294495 0 -0.9995663 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.1175295 0 -0.9930694 -0.1175318 0 -0.9930692 -0.117534 0 -0.9930689 -0.1175318 0 -0.9930692 -0.1467547 0 -0.989173 -0.1467332 0 -0.9891761 -0.1467118 0 -0.9891793 -0.1467332 0 -0.9891762 -0.1758131 0 -0.9844236 -0.1758164 0 -0.984423 -0.1758197 0 -0.9844224 -0.1758164 0 -0.984423 -0.0294495 0 -0.9995663 -0.0294495 0 -0.9995663 -0.0294495 0 -0.9995663 -0.0294495 0 -0.9995663 -0.05886067 0 -0.9982663 -0.05886067 0 -0.9982663 -0.05886067 0 -0.9982663 -0.05886067 0 -0.9982663 -0.08823448 0 -0.9960998 -0.08823448 0 -0.9960998 -0.08823448 0 -0.9960998 -0.08823448 0 -0.9960998 -0.2902932 0 -0.9569378 -0.2902758 0 -0.9569431 -0.2902583 0 -0.9569484 -0.2902758 0 -0.9569432 -0.3183327 0 -0.9479792 -0.3183556 0 -0.9479715 -0.3183785 0 -0.9479637 -0.3183556 0 -0.9479714 -0.3461102 0 -0.938194 -0.3461269 0 -0.9381877 -0.3461438 0 -0.9381816 -0.346127 0 -0.9381878 -0.2046915 0 -0.9788266 -0.2047136 0 -0.978822 -0.2047357 0 -0.9788174 -0.2047136 0 -0.978822 -0.2334235 0 -0.9723752 -0.2334415 0 -0.9723709 -0.2334595 0 -0.9723666 -0.2334415 0 -0.9723709 -0.2619907 0 -0.9650704 -0.261973 0 -0.9650753 -0.2619552 0 -0.9650801 -0.261973 0 -0.9650753 -0.3736127 0 -0.9275849 -0.3736127 0 -0.9275849 -0.3736127 0 -0.9275849 -0.3736127 0 -0.9275849 -0.4007088 0 -0.9162055 -0.4007408 0 -0.9161915 -0.4007728 0 -0.9161775 -0.4007408 0 -0.9161916 -0.4275911 0 -0.9039724 -0.4275755 0 -0.9039797 -0.4275599 0 -0.9039871 -0.4275755 0 -0.9039797 -0.530849 0 -0.8474665 -0.530849 0 -0.8474665 -0.530849 0 -0.8474665 -0.530849 0 -0.8474665 -0.5555802 0 -0.831463 -0.5555802 0 -0.831463 -0.5555802 0 -0.831463 -0.5555802 0 -0.831463 -0.5797867 0 -0.8147684 -0.5797957 0 -0.8147619 -0.5798047 0 -0.8147555 -0.5797957 0 -0.8147619 -0.603522 0 -0.7973464 -0.6035433 0 -0.7973303 -0.6035646 0 -0.7973142 -0.6035433 0 -0.7973303 -0.453991 0 -0.8910064 -0.453991 0 -0.8910064 -0.453991 0 -0.8910064 -0.453991 0 -0.8910064 -0.4800491 0 -0.8772417 -0.4800264 0 -0.8772541 -0.4800037 0 -0.8772665 -0.4800264 0 -0.8772541 -0.5056725 0 -0.8627256 -0.5056725 0 -0.8627256 -0.5056725 0 -0.8627256 -0.5056725 0 -0.8627256 -0.6267492 0 -0.7792212 -0.62677 0 -0.7792044 -0.6267909 0 -0.7791875 -0.62677 0 -0.7792044 -0.6494207 0 -0.7604294 -0.6494206 0 -0.7604294 -0.6494207 0 -0.7604294 -0.6494206 0 -0.7604294 -0.6715614 0 -0.740949 -0.6715708 0 -0.7409405 -0.6715803 0 -0.7409317 -0.6715708 0 -0.7409404 -0.7539811 0 -0.6568962 -0.7539894 0 -0.6568868 -0.7539975 0 -0.6568773 -0.7539894 0 -0.6568868 -0.7730149 0 -0.634388 -0.7730056 0 -0.6343994 -0.7729962 0 -0.6344107 -0.7730056 0 -0.6343994 -0.7913446 0 -0.6113704 -0.7913538 0 -0.6113585 -0.7913631 0 -0.6113465 -0.7913538 0 -0.6113585 -0.6930653 0 -0.7208748 -0.6930752 0 -0.7208653 -0.6930851 0 -0.7208558 -0.6930752 0 -0.7208653 -0.7140152 0 -0.7001302 -0.7140059 0 -0.7001398 -0.7139965 0 -0.7001492 -0.7140059 0 -0.7001398 -0.7343133 0 -0.6788107 -0.7343141 0 -0.6788099 -0.7343147 0 -0.6788091 -0.7343141 0 -0.6788099 -0.8577403 0 -0.5140834 -0.8577428 0 -0.5140791 -0.8577453 0 -0.5140749 -0.8577428 0 -0.5140791 -0.8725113 0 -0.4885941 -0.8725113 0 -0.4885941 -0.8725113 0 -0.4885941 -0.8725113 0 -0.4885941 -0.886506 0 -0.4627173 -0.8865039 0 -0.4627211 -0.8865018 0 -0.462725 -0.8865039 0 -0.4627211 -0.8090082 0 -0.5877974 -0.8090082 0 -0.5877974 -0.8090082 0 -0.5877974 -0.8090082 0 -0.5877974 -0.82598 0 -0.5636996 -0.8259919 0 -0.5636821 -0.8260038 0 -0.5636647 -0.8259919 0 -0.5636821 -0.8422236 0 -0.5391284 -0.8422209 0 -0.5391328 -0.8422181 0 -0.5391371 -0.8422208 0 -0.5391327 -0.9347522 0 -0.3553004 -0.9347522 0 -0.3553004 -0.9347522 0 -0.3553004 -0.9347522 0 -0.3553004 -0.9448016 0 -0.3276431 -0.9448026 0 -0.3276401 -0.9448037 0 -0.3276372 -0.9448026 0 -0.3276401 -0.9540405 0 -0.2996778 -0.9540397 0 -0.2996806 -0.9540389 0 -0.2996833 -0.9540396 0 -0.2996805 -0.8997524 0 -0.4364008 -0.8997524 0 -0.4364008 -0.8997524 0 -0.4364008 -0.8997524 0 -0.4364008 -0.9122189 0 -0.4097031 -0.9122118 0 -0.409719 -0.9122047 0 -0.4097349 -0.9122118 0 -0.409719 -0.9238909 0 -0.3826562 -0.9238842 0 -0.3826725 -0.9238774 0 -0.3826887 -0.9238842 0 -0.3826725 -0.9624626 0 -0.2714144 -0.962457 0 -0.2714345 -0.9624513 0 -0.2714547 -0.962457 0 -0.2714345 -0.970028 0 -0.2429934 -0.970028 0 -0.2429934 -0.970028 0 -0.2429934 -0.970028 0 -0.2429934 -0.9767661 0 -0.2143083 -0.976766 0 -0.2143083 -0.9767661 0 -0.2143083 -0.976766 0 -0.2143083 -0.9826505 0 -0.1854676 -0.9826536 0 -0.185451 -0.9826568 0 -0.1854343 -0.9826536 0 -0.1854509 -0.9976373 0 -0.06870259 -0.9976386 0 -0.06868362 -0.9976399 0 -0.06866463 -0.9976385 0 -0.06868361 -0.9992294 0 -0.03925278 -0.9992293 0 -0.03925353 -0.9992293 0 -0.03925428 -0.9992294 0 -0.03925353 -0.9999517 0 -0.009841781 -0.9999516 0 -0.009841875 -0.9999516 0 -0.009841968 -0.9999516 0 -0.009841874 -0.9876878 0 -0.1564386 -0.9876878 0 -0.1564386 -0.9876878 0 -0.1564386 -0.9876878 0 -0.1564386 -0.9918695 0 -0.1272596 -0.9918695 0 -0.1272596 -0.9918695 0 -0.1272596 -0.9918695 0 -0.1272596 -0.9951866 0 -0.09799852 -0.9951864 0 -0.09799945 -0.9951864 0 -0.09800038 -0.9951864 0 -0.09799945 -0.9941724 0 0.1078018 -0.9941723 0 0.1078029 -0.9941722 0 0.1078039 -0.9941723 0 0.1078029 -0.9905677 0 0.1370246 -0.9905677 0 0.1370246 -0.9905677 0 0.1370246 -0.9905677 0 0.1370246 -0.9861037 0 0.1661308 -0.9861037 0 0.1661308 -0.9861037 0 0.1661308 -0.9861037 0 0.1661308 -0.9998071 0 0.01964557 -0.9998071 0 0.01964557 -0.9998071 0 0.01964557 -0.9998071 0 0.01964557 -0.9969167 0 0.07846853 -0.9969167 0 0.07846853 -0.9969167 0 0.07846853 -0.9969167 0 0.07846853 -0.9597452 0 0.2808722 -0.9597452 0 0.2808722 -0.9597452 0 0.2808722 -0.9597452 0 0.2808722 -0.9510536 0 0.3090261 -0.9510592 0 0.3090088 -0.9510648 0 0.3089916 -0.9510592 0 0.3090089 -0.9746241 0 0.2238481 -0.9746163 0 0.2238822 -0.9746084 0 0.2239164 -0.9746163 0 0.2238822 -0.9675983 0 0.2524948 -0.9675983 0 0.2524948 -0.9675983 0 0.2524948 -0.9675983 0 0.2524948 -0.8954244 0 0.4452136 -0.8954244 0 0.4452136 -0.8954244 0 0.4452136 -0.8954244 0 0.4452136 -0.8819112 0 0.4714157 -0.8819113 0 0.4714157 -0.8819112 0 0.4714157 -0.8819113 0 0.4714157 -0.8676698 0 0.497141 -0.867664 0 0.4971513 -0.8676581 0 0.4971615 -0.8676639 0 0.4971513 -0.9312187 0 0.3644612 -0.9312135 0 0.3644745 -0.9312083 0 0.3644878 -0.9312134 0 0.3644745 -0.9200778 0 0.3917359 -0.9200792 0 0.3917325 -0.9200807 0 0.391729 -0.9200792 0 0.3917325 -0.9081603 0 0.4186227 -0.9081497 0 0.4186457 -0.9081391 0 0.4186687 -0.9081497 0 0.4186457 -0.8032226 0 0.595679 -0.8032135 0 0.5956914 -0.8032044 0 0.5957037 -0.8032135 0 0.5956913 -0.7853186 0 0.6190919 -0.7853186 0 0.6190919 -0.7853186 0 0.6190919 -0.7853186 0 0.6190919 -0.7667481 0 0.6419481 -0.7667481 0 0.6419481 -0.7667481 0 0.6419481 -0.7667481 0 0.6419481 -0.8526353 0 0.5225066 -0.8526353 0 0.5225065 -0.8526353 0 0.5225066 -0.8526353 0 0.5225065 -0.8368836 0 0.5473809 -0.8368865 0 0.5473765 -0.8368894 0 0.5473722 -0.8368865 0 0.5473765 -0.8204049 0 0.5717829 -0.8203961 0 0.5717958 -0.8203871 0 0.5718086 -0.8203961 0 0.5717958 -0.7475166 0 0.6642431 -0.7475029 0 0.6642585 -0.7474893 0 0.6642739 -0.7475029 0 0.6642585 -0.7276286 0 0.6859714 -0.7276191 0 0.6859814 -0.7276095 0 0.6859915 -0.7276191 0 0.6859815 -0.8577285 0 -0.5141031 -0.8577285 0 -0.5141031 -0.8577285 0 -0.5141031 -0.8577285 0 -0.5141031 -0.7730056 0 -0.6343994 -0.7730055 0 -0.6343993 -0.7730056 0 -0.6343994 -0.7730055 0 -0.6343993 -0.6715509 0 -0.7409585 -0.6715656 0 -0.7409451 -0.6715803 0 -0.7409318 -0.6715656 0 -0.7409451 -0.5555714 0 -0.8314689 -0.5555714 0 -0.8314689 -0.5555714 0 -0.8314689 -0.5555714 0 -0.8314689 -0.9987952 0 0.04907621 -0.9987956 0 0.04906646 -0.998796 0 0.04905671 -0.9987955 0 0.04906645 -0.9700314 0 -0.2429799 -0.970032 0 -0.2429777 -0.9700325 0 -0.2429754 -0.970032 0 -0.2429777 -0.9951846 0 -0.09801927 -0.9951855 0 -0.09800982 -0.9951864 0 -0.09800038 -0.9951854 0 -0.09800982 -0.9415424 0 0.3368945 -0.9415424 0 0.3368946 -0.9415424 0 0.3368945 -0.9415424 0 0.3368946 -0.9951846 0 -0.09801897 -0.9951847 0 -0.09801866 -0.9951847 0 -0.09801834 -0.9951846 0 -0.09801865 0.7071084 0 0.7071053 0.707106 0 0.7071076 0.7071036 0 0.70711 0.7071059 0 0.7071075 0.8819225 0 0.4713946 0.8819215 0 0.4713965 0.8819205 0 0.4713984 0.8819215 0 0.4713965 0.9807853 0 0.1950902 0.9807854 0 0.1950902 0.9807853 0 0.1950902 0.9807854 0 0.1950902 0.9951846 0 -0.09801897 0.9951848 0 -0.09801708 0.995185 0 -0.0980152 0.9951848 0 -0.09801708</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_320_2Shape-texbinormals-array" count="820" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_320_2Shape-vertices" name="qt_gauge_tickmarks_320_2Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_320_2Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_320_2Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_320_2Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_320_2Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="410">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_320_2Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_320_2Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_320_2Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_320_2Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66 68 68 68 69 69 69 70 71 71 70 71 71 69 69 69 71 70 70 72 72 72 73 73 73 74 75 75 74 75 75 73 73 73 75 74 74 76 76 76 77 77 77 78 79 79 78 79 79 77 77 77 79 78 78 80 80 80 81 81 81 82 83 83 82 83 83 81 81 81 83 82 82 84 84 84 85 85 85 86 87 87 86 87 87 85 85 85 87 86 86 88 88 88 89 89 89 90 91 91 90 91 91 89 89 89 91 90 90 92 92 92 93 93 93 94 95 95 94 95 95 93 93 93 95 94 94 96 96 96 97 97 97 98 99 99 98 99 99 97 97 97 99 98 98 100 100 100 101 101 101 102 103 103 102 103 103 101 101 101 103 102 102 104 104 104 105 105 105 106 107 107 106 107 107 105 105 105 107 106 106 108 108 108 109 109 109 110 111 111 110 111 111 109 109 109 111 110 110 112 112 112 113 113 113 114 115 115 114 115 115 113 113 113 115 114 114 116 116 116 117 117 117 118 119 119 118 119 119 117 117 117 119 118 118 120 120 120 121 121 121 122 123 123 122 123 123 121 121 121 123 122 122 124 124 124 125 125 125 126 127 127 126 127 127 125 125 125 127 126 126 128 128 128 129 129 129 130 131 131 130 131 131 129 129 129 131 130 130 132 132 132 133 133 133 134 135 135 134 135 135 133 133 133 135 134 134 136 136 136 137 137 137 138 139 139 138 139 139 137 137 137 139 138 138 140 140 140 141 141 141 142 143 143 142 143 143 141 141 141 143 142 142 144 144 144 145 145 145 146 147 147 146 147 147 145 145 145 147 146 146 148 148 148 149 149 149 150 151 151 150 151 151 149 149 149 151 150 150 152 152 152 153 153 153 154 155 155 154 155 155 153 153 153 155 154 154 156 156 156 157 157 157 158 159 159 158 159 159 157 157 157 159 158 158 160 160 160 161 161 161 162 163 163 162 163 163 161 161 161 163 162 162 164 164 164 165 165 165 166 167 167 166 167 167 165 165 165 167 166 166 168 168 168 169 169 169 170 171 171 170 171 171 169 169 169 171 170 170 172 172 172 173 173 173 174 175 175 174 175 175 173 173 173 175 174 174 176 176 176 177 177 177 178 179 179 178 179 179 177 177 177 179 178 178 180 180 180 181 181 181 182 183 183 182 183 183 181 181 181 183 182 182 184 184 184 185 185 185 186 187 187 186 187 187 185 185 185 187 186 186 188 188 188 189 189 189 190 191 191 190 191 191 189 189 189 191 190 190 192 192 192 193 193 193 194 195 195 194 195 195 193 193 193 195 194 194 196 196 196 197 197 197 198 199 199 198 199 199 197 197 197 199 198 198 200 200 200 201 201 201 202 203 203 202 203 203 201 201 201 203 202 202 204 204 204 205 205 205 206 207 207 206 207 207 205 205 205 207 206 206 208 208 208 209 209 209 210 211 211 210 211 211 209 209 209 211 210 210 212 212 212 213 213 213 214 215 215 214 215 215 213 213 213 215 214 214 216 216 216 217 217 217 218 219 219 218 219 219 217 217 217 219 218 218 220 220 220 221 221 221 222 223 223 222 223 223 221 221 221 223 222 222 224 224 224 225 225 225 226 227 227 226 227 227 225 225 225 227 226 226 228 228 228 229 229 229 230 231 231 230 231 231 229 229 229 231 230 230 232 232 232 233 233 233 234 235 235 234 235 235 233 233 233 235 234 234 236 236 236 237 237 237 238 239 239 238 239 239 237 237 237 239 238 238 240 240 240 241 241 241 242 243 243 242 243 243 241 241 241 243 242 242 244 244 244 245 245 245 246 247 247 246 247 247 245 245 245 247 246 246 248 248 248 249 249 249 250 251 251 250 251 251 249 249 249 251 250 250 252 252 252 253 253 253 254 255 255 254 255 255 253 253 253 255 254 254 256 256 256 257 257 257 258 259 259 258 259 259 257 257 257 259 258 258 260 260 260 261 261 261 262 263 263 262 263 263 261 261 261 263 262 262 264 264 264 265 265 265 266 267 267 266 267 267 265 265 265 267 266 266 268 268 268 269 269 269 270 271 271 270 271 271 269 269 269 271 270 270 272 272 272 273 273 273 274 275 275 274 275 275 273 273 273 275 274 274 276 276 276 277 277 277 278 279 279 278 279 279 277 277 277 279 278 278 280 280 280 281 281 281 282 283 283 282 283 283 281 281 281 283 282 282 284 284 284 285 285 285 286 287 287 286 287 287 285 285 285 287 286 286 288 288 288 289 289 289 290 291 291 290 291 291 289 289 289 291 290 290 292 292 292 293 293 293 294 295 295 294 295 295 293 293 293 295 294 294 296 296 296 297 297 297 298 299 299 298 299 299 297 297 297 299 298 298 300 300 300 301 301 301 302 303 303 302 303 303 301 301 301 303 302 302 304 304 304 305 305 305 306 307 307 306 307 307 305 305 305 307 306 306 308 308 308 309 309 309 310 311 311 310 311 311 309 309 309 311 310 310 312 312 312 313 313 313 314 315 315 314 315 315 313 313 313 315 314 314 316 316 316 317 317 317 318 319 319 318 319 319 317 317 317 319 318 318 320 320 320 321 321 321 322 323 323 322 323 323 321 321 321 323 322 322 324 324 324 325 325 325 326 327 327 326 327 327 325 325 325 327 326 326 328 328 328 329 329 329 330 331 331 330 331 331 329 329 329 331 330 330 332 332 332 333 333 333 334 335 335 334 335 335 333 333 333 335 334 334 336 336 336 337 337 337 338 339 339 338 339 339 337 337 337 339 338 338 340 340 340 341 341 341 342 343 343 342 343 343 341 341 341 343 342 342 344 344 344 345 345 345 346 347 347 346 347 347 345 345 345 347 346 346 348 348 348 349 349 349 350 351 351 350 351 351 349 349 349 351 350 350 352 352 352 353 353 353 354 355 355 354 355 355 353 353 353 355 354 354 356 356 356 357 357 357 358 359 359 358 359 359 357 357 357 359 358 358 360 360 360 361 361 361 362 363 363 362 363 363 361 361 361 363 362 362 364 364 364 365 365 365 366 367 367 366 367 367 365 365 365 367 366 366 368 368 368 369 369 369 370 371 371 370 371 371 369 369 369 371 370 370 372 372 372 373 373 373 374 375 375 374 375 375 373 373 373 375 374 374 376 376 376 377 377 377 378 379 379 378 379 379 377 377 377 379 378 378 380 380 380 381 381 381 382 383 383 382 383 383 381 381 381 383 382 382 384 384 384 385 385 385 386 387 387 386 387 387 385 385 385 387 386 386 388 388 388 389 389 389 390 391 391 390 391 391 389 389 389 391 390 390 392 392 392 393 393 393 394 395 395 394 395 395 393 393 393 395 394 394 396 396 396 397 397 397 398 399 399 398 399 399 397 397 397 399 398 398 400 400 400 401 401 401 402 403 403 402 403 403 401 401 401 403 402 402 404 404 404 405 405 405 406 407 407 406 407 407 405 405 405 407 406 406 408 408 408 409 409 409 410 411 411 410 411 411 409 409 409 411 410 410 412 412 412 413 413 413 414 415 415 414 415 415 413 413 413 415 414 414 416 416 416 417 417 417 418 419 419 418 419 419 417 417 417 419 418 418 420 420 420 421 421 421 422 423 423 422 423 423 421 421 421 423 422 422 424 424 424 425 425 425 426 427 427 426 427 427 425 425 425 427 426 426 428 428 428 429 429 429 430 431 431 430 431 431 429 429 429 431 430 430 432 432 432 433 433 433 434 435 435 434 435 435 433 433 433 435 434 434 436 436 436 437 437 437 438 439 439 438 439 439 437 437 437 439 438 438 440 440 440 441 441 441 442 443 443 442 443 443 441 441 441 443 442 442 444 444 444 445 445 445 446 447 447 446 447 447 445 445 445 447 446 446 448 448 448 449 449 449 450 451 451 450 451 451 449 449 449 451 450 450 452 452 452 453 453 453 454 455 455 454 455 455 453 453 453 455 454 454 456 456 456 457 457 457 458 459 459 458 459 459 457 457 457 459 458 458 460 460 460 461 461 461 462 463 463 462 463 463 461 461 461 463 462 462 464 464 464 465 465 465 466 467 467 466 467 467 465 465 465 467 466 466 468 468 468 469 469 469 470 471 471 470 471 471 469 469 469 471 470 470 472 472 472 473 473 473 474 475 475 474 475 475 473 473 473 475 474 474 476 476 476 477 477 477 478 479 479 478 479 479 477 477 477 479 478 478 480 480 480 481 481 481 482 483 483 482 483 483 481 481 481 483 482 482 484 484 484 485 485 485 486 487 487 486 487 487 485 485 485 487 486 486 488 488 488 489 489 489 490 491 491 490 491 491 489 489 489 491 490 490 492 492 492 493 493 493 494 495 495 494 495 495 493 493 493 495 494 494 496 496 496 497 497 497 498 499 499 498 499 499 497 497 497 499 498 498 500 500 500 501 501 501 502 503 503 502 503 503 501 501 501 503 502 502 504 504 504 505 505 505 506 507 507 506 507 507 505 505 505 507 506 506 508 508 508 509 509 509 510 511 511 510 511 511 509 509 509 511 510 510 512 512 512 513 513 513 514 515 515 514 515 515 513 513 513 515 514 514 516 516 516 517 517 517 518 519 519 518 519 519 517 517 517 519 518 518 520 520 520 521 521 521 522 523 523 522 523 523 521 521 521 523 522 522 524 524 524 525 525 525 526 527 527 526 527 527 525 525 525 527 526 526 528 528 528 529 529 529 530 531 531 530 531 531 529 529 529 531 530 530 532 532 532 533 533 533 534 535 535 534 535 535 533 533 533 535 534 534 536 536 536 537 537 537 538 539 539 538 539 539 537 537 537 539 538 538 540 540 540 541 541 541 542 543 543 542 543 543 541 541 541 543 542 542 544 544 544 545 545 545 546 547 547 546 547 547 545 545 545 547 546 546 548 548 548 549 549 549 550 551 551 550 551 551 549 549 549 551 550 550 552 552 552 553 553 553 554 555 555 554 555 555 553 553 553 555 554 554 556 556 556 557 557 557 558 559 559 558 559 559 557 557 557 559 558 558 560 560 560 561 561 561 562 563 563 562 563 563 561 561 561 563 562 562 564 564 564 565 565 565 566 567 567 566 567 567 565 565 565 567 566 566 568 568 568 569 569 569 570 571 571 570 571 571 569 569 569 571 570 570 572 572 572 573 573 573 574 575 575 574 575 575 573 573 573 575 574 574 576 576 576 577 577 577 578 579 579 578 579 579 577 577 577 579 578 578 580 580 580 581 581 581 582 583 583 582 583 583 581 581 581 583 582 582 584 584 584 585 585 585 586 587 587 586 587 587 585 585 585 587 586 586 588 588 588 589 589 589 590 591 591 590 591 591 589 589 589 591 590 590 592 592 592 593 593 593 594 595 595 594 595 595 593 593 593 595 594 594 596 596 596 597 597 597 598 599 599 598 599 599 597 597 597 599 598 598 600 600 600 601 601 601 602 603 603 602 603 603 601 601 601 603 602 602 604 604 604 605 605 605 606 607 607 606 607 607 605 605 605 607 606 606 608 608 608 609 609 609 610 611 611 610 611 611 609 609 609 611 610 610 612 612 612 613 613 613 614 615 615 614 615 615 613 613 613 615 614 614 616 616 616 617 617 617 618 619 619 618 619 619 617 617 617 619 618 618 620 620 620 621 621 621 622 623 623 622 623 623 621 621 621 623 622 622 624 624 624 625 625 625 626 627 627 626 627 627 625 625 625 627 626 626 628 628 628 629 629 629 630 631 631 630 631 631 629 629 629 631 630 630 632 632 632 633 633 633 634 635 635 634 635 635 633 633 633 635 634 634 636 636 636 637 637 637 638 639 639 638 639 639 637 637 637 639 638 638 640 640 640 641 641 641 642 643 643 642 643 643 641 641 641 643 642 642 644 644 644 645 645 645 646 647 647 646 647 647 645 645 645 647 646 646 648 648 648 649 649 649 650 651 651 650 651 651 649 649 649 651 650 650 652 652 652 653 653 653 654 655 655 654 655 655 653 653 653 655 654 654 656 656 656 657 657 657 658 659 659 658 659 659 657 657 657 659 658 658 660 660 660 661 661 661 662 663 663 662 663 663 661 661 661 663 662 662 664 664 664 665 665 665 666 667 667 666 667 667 665 665 665 667 666 666 668 668 668 669 669 669 670 671 671 670 671 671 669 669 669 671 670 670 672 672 672 673 673 673 674 675 675 674 675 675 673 673 673 675 674 674 676 676 676 677 677 677 678 679 679 678 679 679 677 677 677 679 678 678 680 680 680 681 681 681 682 683 683 682 683 683 681 681 681 683 682 682 684 684 684 685 685 685 686 687 687 686 687 687 685 685 685 687 686 686 688 688 688 689 689 689 690 691 691 690 691 691 689 689 689 691 690 690 692 692 692 693 693 693 694 695 695 694 695 695 693 693 693 695 694 694 696 696 696 697 697 697 698 699 699 698 699 699 697 697 697 699 698 698 700 700 700 701 701 701 702 703 703 702 703 703 701 701 701 703 702 702 704 704 704 705 705 705 706 707 707 706 707 707 705 705 705 707 706 706 708 708 708 709 709 709 710 711 711 710 711 711 709 709 709 711 710 710 712 712 712 713 713 713 714 715 715 714 715 715 713 713 713 715 714 714 716 716 716 717 717 717 718 719 719 718 719 719 717 717 717 719 718 718 720 720 720 721 721 721 722 723 723 722 723 723 721 721 721 723 722 722 724 724 724 725 725 725 726 727 727 726 727 727 725 725 725 727 726 726 728 728 728 729 729 729 730 731 731 730 731 731 729 729 729 731 730 730 732 732 732 733 733 733 734 735 735 734 735 735 733 733 733 735 734 734 736 736 736 737 737 737 738 739 739 738 739 739 737 737 737 739 738 738 740 740 740 741 741 741 742 743 743 742 743 743 741 741 741 743 742 742 744 744 744 745 745 745 746 747 747 746 747 747 745 745 745 747 746 746 748 748 748 749 749 749 750 751 751 750 751 751 749 749 749 751 750 750 752 752 752 753 753 753 754 755 755 754 755 755 753 753 753 755 754 754 756 756 756 757 757 757 758 759 759 758 759 759 757 757 757 759 758 758 760 760 760 761 761 761 762 763 763 762 763 763 761 761 761 763 762 762 764 764 764 765 765 765 766 767 767 766 767 767 765 765 765 767 766 766 768 768 768 769 769 769 770 771 771 770 771 771 769 769 769 771 770 770 772 772 772 773 773 773 774 775 775 774 775 775 773 773 773 775 774 774 776 776 776 777 777 777 778 779 779 778 779 779 777 777 777 779 778 778 780 780 780 781 781 781 782 783 783 782 783 783 781 781 781 783 782 782 784 784 784 785 785 785 786 787 787 786 787 787 785 785 785 787 786 786 788 788 788 789 789 789 790 791 791 790 791 791 789 789 789 791 790 790 792 792 792 793 793 793 794 795 795 794 795 795 793 793 793 795 794 794 796 796 796 797 797 797 798 799 799 798 799 799 797 797 797 799 798 798 800 800 800 801 801 801 802 803 803 802 803 803 801 801 801 803 802 802 804 804 804 805 805 805 806 807 807 806 807 807 805 805 805 807 806 806 808 808 808 809 809 809 810 811 811 810 811 811 809 809 809 811 810 810 812 812 812 813 813 813 814 815 815 814 815 815 813 813 813 815 814 814 816 816 816 817 817 817 818 819 819 818 819 819 817 817 817 819 818 818</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_320_2Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_320_2" name="qt_gauge_tickmarks_320_2" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_320_2Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_320_2</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_50_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_50_1.dae
new file mode 100644
index 0000000..4e97d34
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_50_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:27:14</created>
+ <modified>2018-03-08T09:27:14</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_50Shape" name="qt_gauge_tickmarks_50Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_50Shape-positions" name="qt_gauge_tickmarks_50Shape-positions">
+ <float_array id="qt_gauge_tickmarks_50Shape-positions-array" count="204">-3.030767 0 -9.017717 -2.840556 0 -9.079522 -3.339784 0 -9.968774 -3.149573 0 -10.03058 -2.864409 0 -8.020308 -2.38888 0 -8.174817 -3.79146 0 -10.87348 -3.315931 0 -11.02799 2.38888 0 -8.174817 2.864409 0 -8.020308 3.315931 0 -11.02799 3.79146 0 -10.87348 9.5 0 -0.1135824 9.5 0 0.0864184 10.5 0 -0.1135828 10.5 0 0.08641792 -7.023592 0 -4.807504 -6.729699 0 -5.212012 -9.450643 0 -6.570859 -9.15675 0 -6.975368 -8.5 0 0.236418 -8.500001 0 -0.2635825 -11.5 0 0.236418 -11.5 0 -0.263582 8.500001 0 -0.2635825 8.5 0 0.236418 11.5 0 -0.263582 11.5 0 0.236418 6.729699 0 -5.212012 7.023592 0 -4.807504 9.15675 0 -6.975368 9.450643 0 -6.570859 9.004135 0 -3.04435 9.065938 0 -2.854138 9.955192 0 -3.353367 10.01699 0 -3.163155 7.626883 0 -5.678443 7.74444 0 -5.516641 8.4359 0 -6.266229 8.553457 0 -6.104425 -0.1 0 -9.513582 0.1 0 -9.513582 -0.1 0 -10.51358 0.1 0 -10.51358 5.503058 0 -7.758023 5.664862 0 -7.640465 6.090843 0 -8.567039 6.252647 0 -8.449483 2.840556 0 -9.079522 3.030767 0 -9.017717 3.149573 0 -10.03058 3.339784 0 -9.968774 -5.664862 0 -7.640465 -5.503058 0 -7.758023 -6.252647 0 -8.449483 -6.090843 0 -8.567039 -7.74444 0 -5.516641 -7.626883 0 -5.678443 -8.553457 0 -6.104425 -8.4359 0 -6.266229 -9.065938 0 -2.854138 -9.004135 0 -3.04435 -10.01699 0 -3.163155 -9.955192 0 -3.353367 -9.5 0 0.0864184 -9.5 0 -0.1135824 -10.5 0 0.08641792 -10.5 0 -0.1135828</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_50Shape-positions-array" count="68" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_50Shape-normals" name="qt_gauge_tickmarks_50Shape-normals">
+ <float_array id="qt_gauge_tickmarks_50Shape-normals-array" count="204">0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_50Shape-normals-array" count="68" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_50Shape-tangents" name="qt_gauge_tickmarks_50Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_50Shape-tangents-array" count="204">0.9510565 0 -0.3090172 -0.3090236 0 -0.9510544 0.3090189 0 0.9510559 -0.9510564 0 0.3090172 0.9510566 0 -0.3090168 -0.3090189 0 -0.9510559 0.3090137 0 0.9510576 -0.9510565 0 0.3090171 0.9510565 0 0.3090171 0.3090189 0 -0.9510559 -0.3090137 0 0.9510576 -0.9510566 0 -0.3090168 0 0 1 1 0 0 -1 0 0 0 0 -1 0.5877851 0 -0.8090171 -0.8090165 0 -0.5877859 0.8090168 0 0.5877855 -0.5877852 0 0.809017 0 0 -1 -1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 -1 0 0 0 0 -1 0.5877852 0 0.809017 0.8090165 0 -0.5877859 -0.8090168 0 0.5877855 -0.5877851 0 -0.8090171 0.3090172 0 0.9510565 0.9510575 0 -0.3090139 -0.9510575 0 0.3090139 -0.3090172 0 -0.9510565 0.5877855 0 0.8090168 0.809014 0 -0.5877894 -0.8090156 0 0.5877872 -0.5877848 0 -0.8090173 1 0 0 0 0 -1 0 0 1 -1 0 0 0.8090166 0 0.5877858 0.5877903 0 -0.8090133 -0.5877787 0 0.8090218 -0.8090172 0 -0.587785 0.9510564 0 0.3090172 0.3090236 0 -0.9510544 -0.3090189 0 0.9510559 -0.9510565 0 -0.3090172 0.8090172 0 -0.587785 -0.5877903 0 -0.8090133 0.5877787 0 0.8090218 -0.8090166 0 0.5877858 0.5877848 0 -0.8090173 -0.809014 0 -0.5877894 0.8090156 0 0.5877872 -0.5877855 0 0.8090168 0.3090172 0 -0.9510565 -0.9510575 0 -0.3090139 0.9510575 0 0.3090139 -0.3090172 0 0.9510565 0 0 -1 -1 0 0 1 0 0 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_50Shape-tangents-array" count="68" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_50Shape-binormals" name="qt_gauge_tickmarks_50Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_50Shape-binormals-array" count="204">-0.3090172 0 -0.9510565 -0.9510545 0 0.3090236 0.951056 0 -0.3090189 0.3090172 0 0.9510564 -0.3090168 0 -0.9510567 -0.9510559 0 0.3090189 0.9510576 0 -0.3090137 0.3090171 0 0.9510566 0.3090171 0 -0.9510565 -0.9510559 0 -0.3090189 0.9510576 0 0.3090137 -0.3090168 0 0.9510567 1 0 0 0 0 -1 0 0 1 -1 0 0 -0.8090172 0 -0.5877852 -0.5877859 0 0.8090166 0.5877855 0 -0.8090168 0.8090171 0 0.5877852 -1 0 0 0 0 1 0 0 -1 1 0 0 1 0 0 0 0 -1 0 0 1 -1 0 0 0.8090171 0 -0.5877852 -0.5877859 0 -0.8090165 0.5877855 0 0.8090169 -0.8090171 0 0.5877852 0.9510565 0 -0.3090172 -0.3090139 0 -0.9510576 0.3090139 0 0.9510576 -0.9510565 0 0.3090172 0.8090169 0 -0.5877855 -0.5877894 0 -0.809014 0.5877872 0 0.8090157 -0.8090173 0 0.5877848 0 0 -1 -1 0 0 1 0 0 0 0 1 0.5877858 0 -0.8090166 -0.8090134 0 -0.5877903 0.8090218 0 0.5877787 -0.587785 0 0.8090172 0.3090172 0 -0.9510565 -0.9510544 0 -0.3090236 0.951056 0 0.3090189 -0.3090172 0 0.9510565 -0.587785 0 -0.8090172 -0.8090133 0 0.5877903 0.8090218 0 -0.5877787 0.5877858 0 0.8090167 -0.8090174 0 -0.5877848 -0.5877894 0 0.809014 0.5877872 0 -0.8090156 0.8090168 0 0.5877855 -0.9510565 0 -0.3090172 -0.3090139 0 0.9510576 0.3090139 0 -0.9510576 0.9510565 0 0.3090172 -1 0 0 0 0 1 0 0 -1 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_50Shape-binormals-array" count="68" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_50Shape-map1" name="qt_gauge_tickmarks_50Shape-map1">
+ <float_array id="qt_gauge_tickmarks_50Shape-map1-array" count="136">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_50Shape-map1-array" count="68" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_50Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_50Shape-textangents-array" count="204">0.9510543 0 -0.3090235 0.9510551 0 -0.3090212 0.9510559 0 -0.3090189 0.9510551 0 -0.3090212 0.9510559 0 -0.3090189 0.9510567 0 -0.3090163 0.9510575 0 -0.3090137 0.9510567 0 -0.3090163 0.9510559 0 0.3090189 0.9510567 0 0.3090163 0.9510575 0 0.3090137 0.9510567 0 0.3090163 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.5877858 0 -0.8090165 0.5877856 0 -0.8090166 0.5877854 0 -0.8090168 0.5877856 0 -0.8090166 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.5877858 0 0.8090165 0.5877856 0 0.8090166 0.5877854 0 0.8090168 0.5877856 0 0.8090166 0.3090138 0 0.9510574 0.3090138 0 0.9510574 0.3090138 0 0.9510574 0.3090138 0 0.9510574 0.5877894 0 0.8090139 0.5877882 0 0.8090147 0.5877872 0 0.8090156 0.5877882 0 0.8090147 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.8090132 0 0.5877903 0.8090175 0 0.5877845 0.8090217 0 0.5877786 0.8090175 0 0.5877845 0.9510543 0 0.3090235 0.9510551 0 0.3090212 0.9510559 0 0.3090189 0.9510551 0 0.3090212 0.8090132 0 -0.5877903 0.8090175 0 -0.5877845 0.8090217 0 -0.5877786 0.8090175 0 -0.5877845 0.5877894 0 -0.8090139 0.5877882 0 -0.8090147 0.5877872 0 -0.8090156 0.5877882 0 -0.8090147 0.3090138 0 -0.9510574 0.3090138 0 -0.9510574 0.3090138 0 -0.9510574 0.3090138 0 -0.9510574 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_50Shape-textangents-array" count="68" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_50Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_50Shape-texbinormals-array" count="204">-0.3090236 0 -0.9510545 -0.3090212 0 -0.9510552 -0.3090189 0 -0.951056 -0.3090212 0 -0.9510552 -0.3090189 0 -0.9510559 -0.3090163 0 -0.9510568 -0.3090137 0 -0.9510576 -0.3090163 0 -0.9510568 0.3090189 0 -0.9510559 0.3090163 0 -0.9510568 0.3090137 0 -0.9510577 0.3090163 0 -0.9510568 1 0 0 1 0 0 1 0 0 1 0 0 -0.8090166 0 -0.5877859 -0.8090167 0 -0.5877857 -0.8090169 0 -0.5877855 -0.8090166 0 -0.5877857 -1 0 0 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.8090166 0 -0.5877859 0.8090167 0 -0.5877857 0.8090168 0 -0.5877855 0.8090167 0 -0.5877857 0.9510576 0 -0.3090139 0.9510576 0 -0.3090138 0.9510576 0 -0.3090139 0.9510576 0 -0.3090138 0.809014 0 -0.5877894 0.8090149 0 -0.5877883 0.8090156 0 -0.5877872 0.8090149 0 -0.5877883 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.5877903 0 -0.8090134 0.5877845 0 -0.8090176 0.5877787 0 -0.8090218 0.5877845 0 -0.8090176 0.3090235 0 -0.9510544 0.3090212 0 -0.9510552 0.3090189 0 -0.951056 0.3090212 0 -0.9510552 -0.5877903 0 -0.8090134 -0.5877845 0 -0.8090176 -0.5877787 0 -0.8090218 -0.5877845 0 -0.8090176 -0.809014 0 -0.5877894 -0.8090149 0 -0.5877883 -0.8090157 0 -0.5877872 -0.8090149 0 -0.5877883 -0.9510576 0 -0.3090138 -0.9510576 0 -0.3090139 -0.9510576 0 -0.3090138 -0.9510576 0 -0.3090139 -1 0 0 -1 0 0 -1 0 0 -1 0 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_50Shape-texbinormals-array" count="68" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_50Shape-vertices" name="qt_gauge_tickmarks_50Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_50Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_50Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_50Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_50Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="34">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_50Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_50Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_50Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_50Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_50Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_50" name="qt_gauge_tickmarks_50" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_50Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_50</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_60_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_60_1.dae
new file mode 100644
index 0000000..621e9fb
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_60_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:29:28</created>
+ <modified>2018-03-08T09:29:28</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.4 0.4 0.4 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">lambert1</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_60Shape" name="qt_gauge_tickmarks_60Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_60Shape-positions" name="qt_gauge_tickmarks_60Shape-positions">
+ <float_array id="qt_gauge_tickmarks_60Shape-positions-array" count="708">6.788225 0 6.646803 6.646804 0 6.788225 7.495332 0 7.35391 7.35391 0 7.495332 7.74444 0 5.503058 7.626883 0 5.664862 8.553457 0 6.090843 8.4359 0 6.252646 8.509961 0 4.223809 8.419163 0 4.402011 9.400967 0 4.677799 9.310169 0 4.856001 9.367395 0 -1.584896 9.398683 0 -1.387359 10.35508 0 -1.741331 10.38637 0 -1.543792 9.004135 0 -3.030767 9.065938 0 -2.840555 9.955192 0 -3.339784 10.01699 0 -3.149573 8.419163 0 -4.402011 8.509962 0 -4.223809 9.310169 0 -4.856001 9.400969 0 -4.6778 9.065939 0 2.840555 9.004135 0 3.030767 10.017 0 3.149572 9.955191 0 3.339784 9.398683 0 1.387359 9.367395 0 1.584896 10.38637 0 1.543793 10.35508 0 1.741331 9.5 0 -0.0999999 9.5 0 0.1000009 10.5 0 -0.1000004 10.5 0 0.1000004 7.626883 0 -5.664861 7.74444 0 -5.503058 8.4359 0 -6.252646 8.553457 0 -6.090843 6.646804 0 -6.788225 6.788225 0 -6.646802 7.35391 0 -7.495332 7.495332 0 -7.353909 5.503058 0 -7.744441 5.664862 0 -7.626883 6.090843 0 -8.553456 6.252647 0 -8.435901 -0.1 0 -9.5 0.1 0 -9.5 -0.1 0 -10.5 0.1 0 -10.5 -1.584896 0 -9.367396 -1.387359 0 -9.398684 -1.741331 0 -10.35508 -1.543793 0 -10.38637 -3.030767 0 -9.004135 -2.840556 0 -9.06594 -3.339784 0 -9.955192 -3.149573 0 -10.017 4.223809 0 -8.50996 4.40201 0 -8.419164 4.677799 0 -9.400967 4.856001 0 -9.310168 2.840556 0 -9.06594 3.030767 0 -9.004135 3.149573 0 -10.017 3.339784 0 -9.955192 1.387359 0 -9.398684 1.584896 0 -9.367396 1.543793 0 -10.38637 1.741331 0 -10.35508 -7.74444 0 -5.503058 -7.626883 0 -5.664861 -8.553457 0 -6.090843 -8.4359 0 -6.252646 -8.509962 0 -4.223809 -8.419163 0 -4.402011 -9.400969 0 -4.6778 -9.310169 0 -4.856001 -9.065938 0 -2.840555 -9.004135 0 -3.030767 -10.01699 0 -3.149573 -9.955192 0 -3.339784 -4.40201 0 -8.419164 -4.223809 0 -8.50996 -4.856001 0 -9.310168 -4.677799 0 -9.400967 -5.664862 0 -7.626883 -5.503058 0 -7.744441 -6.252647 0 -8.435901 -6.090843 0 -8.553456 -6.788225 0 -6.646802 -6.646804 0 -6.788225 -7.495332 0 -7.353909 -7.35391 0 -7.495332 -9.398683 0 -1.387359 -9.367395 0 -1.584896 -10.38637 0 -1.543792 -10.35508 0 -1.741331 -9.367395 0 1.584896 -9.398683 0 1.387359 -10.35508 0 1.741331 -10.38637 0 1.543793 -9.5 0 0.1000009 -9.5 0 -0.0999999 -10.5 0 0.1000004 -10.5 0 -0.1000004 3.959798 0 3.818377 3.818377 0 3.959798 4.666904 0 4.525483 4.525484 0 4.666904 5.5 0 -0.0999999 5.5 0 0.1000004 6.5 0 -0.09999967 6.5 0 0.1000004 3.818377 0 -3.959798 3.959798 0 -3.818376 4.525484 0 -4.666905 4.666904 0 -4.525483 -0.1 0 -5.5 0.1 0 -5.5 -0.1 0 -6.5 0.1 0 -6.5 -3.959798 0 -3.818376 -3.818377 0 -3.959798 -4.666904 0 -4.525483 -4.525484 0 -4.666905 -5.5 0 0.1000004 -5.5 0 -0.0999999 -6.5 0 0.1000004 -6.5 0 -0.09999967 -3.818377 0 3.959798 -3.959798 0 3.818377 -4.525484 0 4.666904 -4.666904 0 4.525483 4.666904 0 4.525483 4.525484 0 4.666904 5.374012 0 5.23259 5.23259 0 5.374012 6.5 0 -0.09999967 6.5 0 0.1000004 7.5 0 -0.1000001 7.5 0 0.1000006 4.525484 0 -4.666905 4.666904 0 -4.525483 5.232591 0 -5.374012 5.374012 0 -5.23259 -0.1 0 -6.5 0.1 0 -6.5 -0.1 0 -7.5 0.1 0 -7.5 -4.666904 0 -4.525483 -4.525484 0 -4.666905 -5.374012 0 -5.23259 -5.232591 0 -5.374012 -6.5 0 0.1000004 -6.5 0 -0.09999967 -7.5 0 0.1000006 -7.5 0 -0.1000001 -4.525484 0 4.666904 -4.666904 0 4.525483 -5.23259 0 5.374012 -5.374012 0 5.23259 -0.1 0 -7.5 0.1 0 -7.5 -0.1 0 -8.5 0.1 0 -8.5 -5.374012 0 -5.23259 -5.232591 0 -5.374012 -6.081118 0 -5.939696 -5.939697 0 -6.081119 -7.5 0 0.1000006 -7.5 0 -0.1000001 -8.5 0 0.0999999 -8.5 0 -0.0999999 5.374012 0 5.23259 5.23259 0 5.374012 6.081118 0 5.939697 5.939697 0 6.081119 7.5 0 -0.1000001 7.5 0 0.1000006 8.5 0 -0.0999999 8.5 0 0.0999999 5.232591 0 -5.374012 5.374012 0 -5.23259 5.939697 0 -6.081119 6.081118 0 -5.939696 -5.23259 0 5.374012 -5.374012 0 5.23259 -5.939697 0 6.081119 -6.081118 0 5.939697 6.081118 0 5.939697 5.939697 0 6.081119 6.788225 0 6.646803 6.646804 0 6.788225 8.5 0 -0.0999999 8.5 0 0.0999999 9.5 0 -0.0999999 9.5 0 0.1000009 5.939697 0 -6.081119 6.081118 0 -5.939696 6.646804 0 -6.788225 6.788225 0 -6.646802 -0.1 0 -8.5 0.1 0 -8.5 -0.1 0 -9.5 0.1 0 -9.5 -6.081118 0 -5.939696 -5.939697 0 -6.081119 -6.788225 0 -6.646802 -6.646804 0 -6.788225 -6.646804 0 6.788225 -6.788225 0 6.646803 -7.35391 0 7.495332 -7.495332 0 7.35391 -8.419163 0 4.402011 -8.509961 0 4.223809 -9.310169 0 4.856001 -9.400967 0 4.677799 -7.626883 0 5.664862 -7.74444 0 5.503058 -8.4359 0 6.252646 -8.553457 0 6.090843 -5.939697 0 6.081119 -6.081118 0 5.939697 -6.646804 0 6.788225 -6.788225 0 6.646803 -8.5 0 0.0999999 -8.5 0 -0.0999999 -9.5 0 0.1000009 -9.5 0 -0.0999999 -9.004135 0 3.030767 -9.065939 0 2.840555 -9.955191 0 3.339784 -10.017 0 3.149572</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_60Shape-positions-array" count="236" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_60Shape-normals" name="qt_gauge_tickmarks_60Shape-normals">
+ <float_array id="qt_gauge_tickmarks_60Shape-normals-array" count="708">0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_60Shape-normals-array" count="236" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_60Shape-tangents" name="qt_gauge_tickmarks_60Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_60Shape-tangents-array" count="708">-0.7071068 0 0.7071068 0.7071092 0 0.7071044 -0.707108 0 -0.7071056 0.707107 0 -0.7071065 -0.5877849 0 0.8090172 0.8090187 0 0.5877829 -0.8090156 0 -0.5877872 0.5877851 0 -0.8090171 -0.4539905 0 0.8910065 0.8910063 0 0.4539909 -0.8910083 0 -0.4539871 0.4539901 0 -0.8910067 0.156435 0 0.9876882 0.987688 0 -0.1564365 -0.9876883 0 0.156435 -0.1564332 0 -0.9876885 0.3090172 0 0.9510565 0.9510575 0 -0.3090139 -0.9510575 0 0.3090139 -0.3090172 0 -0.9510565 0.4539905 0 0.8910065 0.8910044 0 -0.4539946 -0.8910039 0 0.4539956 -0.4539909 0 -0.8910063 -0.309017 0 0.9510565 0.9510559 0 0.3090189 -0.9510547 0 -0.3090225 0.3090177 0 -0.9510563 -0.1564347 0 0.9876883 0.9876881 0 0.1564359 -0.9876888 0 -0.1564315 0.1564343 0 -0.9876884 0 0 1 1 0 0 -1 0 0 0 0 -1 0.5877855 0 0.8090168 0.809014 0 -0.5877894 -0.8090156 0 0.5877872 -0.5877848 0 -0.8090173 0.707107 0 0.7071065 0.7071115 0 -0.707102 -0.7071104 0 0.7071032 -0.7071068 0 -0.7071068 0.8090166 0 0.5877858 0.5877903 0 -0.8090133 -0.5877787 0 0.8090218 -0.8090172 0 -0.587785 1 0 0 0 0 -1 0 0 1 -1 0 0 0.9876883 0 -0.1564348 -0.1564359 0 -0.9876881 0.1564405 0 0.9876874 -0.9876883 0 0.1564345 0.9510565 0 -0.3090172 -0.3090236 0 -0.9510544 0.3090189 0 0.9510559 -0.9510564 0 0.3090172 0.8910067 0 0.4539901 0.4539842 0 -0.8910097 -0.4539909 0 0.8910063 -0.8910061 0 -0.4539913 0.9510564 0 0.3090172 0.3090236 0 -0.9510544 -0.3090189 0 0.9510559 -0.9510565 0 -0.3090172 0.9876883 0 0.1564345 0.1564359 0 -0.9876881 -0.1564405 0 0.9876874 -0.9876883 0 -0.1564348 0.5877848 0 -0.8090173 -0.809014 0 -0.5877894 0.8090156 0 0.5877872 -0.5877855 0 0.8090168 0.4539909 0 -0.8910063 -0.8910044 0 -0.4539946 0.8910039 0 0.4539956 -0.4539905 0 0.8910065 0.3090172 0 -0.9510565 -0.9510575 0 -0.3090139 0.9510575 0 0.3090139 -0.3090172 0 0.9510565 0.8910061 0 -0.4539913 -0.4539842 0 -0.8910097 0.4539909 0 0.8910063 -0.8910067 0 0.4539901 0.8090172 0 -0.587785 -0.5877903 0 -0.8090133 0.5877787 0 0.8090218 -0.8090166 0 0.5877858 0.7071068 0 -0.7071068 -0.7071115 0 -0.707102 0.7071104 0 0.7071032 -0.707107 0 0.7071065 0.1564332 0 -0.9876885 -0.987688 0 -0.1564365 0.9876883 0 0.156435 -0.156435 0 0.9876882 -0.1564343 0 -0.9876884 -0.9876881 0 0.1564359 0.9876888 0 -0.1564315 0.1564347 0 0.9876883 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071068 0 0.7071068 0.7071068 0 0.7071068 -0.7071092 0 -0.7071044 0.7071063 0 -0.7071073 0 0 1 1 0 0 -1 0 0 0 0 -1 0.7071068 0 0.7071068 0.707108 0 -0.7071056 -0.7071092 0 0.7071044 -0.707107 0 -0.7071065 1 0 0 0 0 -1 0 0 1 -1 0 0 0.707107 0 -0.7071065 -0.707108 0 -0.7071056 0.7071092 0 0.7071044 -0.7071068 0 0.7071068 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071063 0 -0.7071073 -0.7071068 0 0.7071068 0.7071092 0 -0.7071044 0.7071068 0 0.7071068 -0.7071065 0 0.707107 0.7071092 0 0.7071044 -0.7071068 0 -0.7071068 0.7071075 0 -0.7071061 0 0 1 1 0 0 -1 0 0 0 0 -1 0.7071068 0 0.7071068 0.7071092 0 -0.7071044 -0.7071104 0 0.7071032 -0.7071065 0 -0.707107 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071065 0 -0.707107 -0.7071092 0 -0.7071044 0.7071104 0 0.7071032 -0.7071068 0 0.7071068 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071075 0 -0.7071061 -0.7071092 0 0.7071044 0.7071068 0 -0.7071068 0.7071065 0 0.707107 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071068 0 -0.7071068 -0.7071104 0 -0.7071032 0.7071104 0 0.7071032 -0.7071068 0 0.7071068 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071075 0 0.7071061 0.7071068 0 0.7071068 -0.7071092 0 -0.7071044 0.7071065 0 -0.707107 0 0 1 1 0 0 -1 0 0 0 0 -1 0.7071068 0 0.7071068 0.7071104 0 -0.7071032 -0.7071104 0 0.7071032 -0.7071068 0 -0.7071068 -0.7071065 0 -0.707107 -0.7071068 0 0.7071068 0.7071092 0 -0.7071044 0.7071075 0 0.7071061 -0.7071063 0 0.7071073 0.7071092 0 0.7071044 -0.7071092 0 -0.7071044 0.7071068 0 -0.7071068 0 0 1 1 0 0 -1 0 0 0 0 -1 0.7071068 0 0.7071068 0.7071104 0 -0.7071032 -0.7071115 0 0.707102 -0.7071065 0 -0.707107 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071065 0 -0.707107 -0.7071104 0 -0.7071032 0.7071115 0 0.707102 -0.7071068 0 0.7071068 -0.707107 0 -0.7071065 -0.7071092 0 0.7071044 0.707108 0 -0.7071056 0.7071068 0 0.7071068 -0.4539901 0 -0.8910067 -0.8910063 0 0.4539909 0.8910083 0 -0.4539871 0.4539905 0 0.8910065 -0.5877851 0 -0.8090171 -0.8090187 0 0.5877829 0.8090156 0 -0.5877872 0.5877849 0 0.8090172 -0.7071068 0 -0.7071068 -0.7071092 0 0.7071044 0.7071092 0 -0.7071044 0.7071063 0 0.7071073 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.3090177 0 -0.9510563 -0.9510559 0 0.3090189 0.9510547 0 -0.3090225 0.309017 0 0.9510565</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_60Shape-tangents-array" count="236" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_60Shape-binormals" name="qt_gauge_tickmarks_60Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_60Shape-binormals-array" count="708">0.7071068 0 0.7071068 0.7071044 0 -0.7071092 -0.7071056 0 0.707108 -0.7071066 0 -0.7071071 0.8090172 0 0.5877849 0.5877829 0 -0.8090187 -0.5877872 0 0.8090156 -0.8090172 0 -0.5877851 0.8910066 0 0.4539905 0.4539908 0 -0.8910064 -0.4539871 0 0.8910083 -0.8910068 0 -0.4539901 0.9876882 0 -0.156435 -0.1564365 0 -0.9876881 0.156435 0 0.9876882 -0.9876886 0 0.1564332 0.9510565 0 -0.3090172 -0.3090139 0 -0.9510576 0.3090139 0 0.9510576 -0.9510565 0 0.3090172 0.8910066 0 -0.4539905 -0.4539947 0 -0.8910045 0.4539957 0 0.891004 -0.8910064 0 0.4539909 0.9510566 0 0.309017 0.3090189 0 -0.9510559 -0.3090225 0 0.9510548 -0.9510563 0 -0.3090177 0.9876883 0 0.1564347 0.1564359 0 -0.9876881 -0.1564315 0 0.9876889 -0.9876884 0 -0.1564343 1 0 0 0 0 -1 0 0 1 -1 0 0 0.8090169 0 -0.5877855 -0.5877894 0 -0.809014 0.5877872 0 0.8090157 -0.8090173 0 0.5877848 0.7071065 0 -0.707107 -0.707102 0 -0.7071115 0.7071032 0 0.7071103 -0.7071068 0 0.7071068 0.5877858 0 -0.8090166 -0.8090134 0 -0.5877903 0.8090218 0 0.5877787 -0.587785 0 0.8090172 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.1564348 0 -0.9876883 -0.9876881 0 0.1564359 0.9876875 0 -0.1564405 0.1564345 0 0.9876884 -0.3090172 0 -0.9510565 -0.9510545 0 0.3090236 0.951056 0 -0.3090189 0.3090172 0 0.9510564 0.4539901 0 -0.8910067 -0.8910097 0 -0.4539843 0.8910064 0 0.4539909 -0.4539913 0 0.8910061 0.3090172 0 -0.9510565 -0.9510544 0 -0.3090236 0.951056 0 0.3090189 -0.3090172 0 0.9510565 0.1564345 0 -0.9876884 -0.9876881 0 -0.1564359 0.9876875 0 0.1564405 -0.1564348 0 0.9876884 -0.8090174 0 -0.5877848 -0.5877894 0 0.809014 0.5877872 0 -0.8090156 0.8090168 0 0.5877855 -0.8910064 0 -0.4539909 -0.4539946 0 0.8910044 0.4539956 0 -0.8910039 0.8910065 0 0.4539905 -0.9510565 0 -0.3090172 -0.3090139 0 0.9510576 0.3090139 0 -0.9510576 0.9510565 0 0.3090172 -0.4539913 0 -0.8910061 -0.8910097 0 0.4539843 0.8910064 0 -0.4539909 0.4539901 0 0.8910068 -0.587785 0 -0.8090172 -0.8090133 0 0.5877903 0.8090218 0 -0.5877787 0.5877858 0 0.8090167 -0.7071068 0 -0.7071068 -0.707102 0 0.7071115 0.7071032 0 -0.7071103 0.7071065 0 0.707107 -0.9876886 0 -0.1564332 -0.1564365 0 0.9876881 0.156435 0 -0.9876882 0.9876882 0 0.156435 -0.9876884 0 0.1564343 0.1564359 0 0.9876881 -0.1564315 0 -0.9876888 0.9876883 0 -0.1564347 -1 0 0 0 0 1 0 0 -1 1 0 0 0.7071068 0 0.7071068 0.7071068 0 -0.7071068 -0.7071044 0 0.7071092 -0.7071072 0 -0.7071063 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071068 0 -0.7071068 -0.7071056 0 -0.707108 0.7071044 0 0.7071092 -0.7071065 0 0.707107 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071066 0 -0.7071071 -0.7071056 0 0.707108 0.7071044 0 -0.7071092 0.7071068 0 0.7071068 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.7071072 0 0.7071063 0.7071068 0 0.7071068 -0.7071044 0 -0.7071092 0.7071068 0 -0.7071068 0.707107 0 0.7071065 0.7071044 0 -0.7071092 -0.7071068 0 0.7071068 -0.7071061 0 -0.7071075 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071068 0 -0.7071068 -0.7071044 0 -0.7071092 0.7071032 0 0.7071103 -0.707107 0 0.7071065 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071071 0 -0.7071066 -0.7071044 0 0.7071092 0.7071032 0 -0.7071103 0.7071068 0 0.7071068 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.7071061 0 0.7071075 0.7071044 0 0.7071092 -0.7071068 0 -0.7071068 0.7071071 0 -0.7071066 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071068 0 -0.7071068 -0.7071032 0 0.7071103 0.7071032 0 -0.7071103 0.7071068 0 0.7071068 -1 0 0 0 0 1 0 0 -1 1 0 0 0.7071061 0 0.7071075 0.7071068 0 -0.7071068 -0.7071044 0 0.7071092 -0.7071071 0 -0.7071066 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071068 0 -0.7071068 -0.7071032 0 -0.7071103 0.7071032 0 0.7071103 -0.7071068 0 0.7071068 -0.707107 0 0.7071065 0.7071068 0 0.7071068 -0.7071044 0 -0.7071092 0.7071061 0 -0.7071075 0.7071072 0 0.7071063 0.7071044 0 -0.7071092 -0.7071044 0 0.7071092 -0.7071068 0 -0.7071068 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071068 0 -0.7071068 -0.7071032 0 -0.7071103 0.707102 0 0.7071115 -0.707107 0 0.7071065 0 0 -1 -1 0 0 1 0 0 0 0 1 -0.7071071 0 -0.7071066 -0.7071032 0 0.7071103 0.707102 0 -0.7071115 0.7071068 0 0.7071068 -0.7071066 0 0.7071071 0.7071044 0 0.7071092 -0.7071056 0 -0.707108 0.7071068 0 -0.7071068 -0.8910067 0 0.4539901 0.4539909 0 0.8910064 -0.4539871 0 -0.8910083 0.8910066 0 -0.4539905 -0.8090171 0 0.5877851 0.5877829 0 0.8090187 -0.5877872 0 -0.8090157 0.8090172 0 -0.5877849 -0.7071068 0 0.7071068 0.7071044 0 0.7071092 -0.7071044 0 -0.7071092 0.7071072 0 -0.7071063 -1 0 0 0 0 1 0 0 -1 1 0 0 -0.9510563 0 0.3090177 0.3090189 0 0.9510559 -0.3090225 0 -0.9510548 0.9510565 0 -0.309017</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_60Shape-binormals-array" count="236" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_60Shape-map1" name="qt_gauge_tickmarks_60Shape-map1">
+ <float_array id="qt_gauge_tickmarks_60Shape-map1-array" count="472">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_60Shape-map1-array" count="236" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_60Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_60Shape-textangents-array" count="708">-0.7071044 0 0.7071092 -0.7071049 0 0.7071085 -0.7071055 0 0.7071079 -0.7071049 0 0.7071085 -0.5877829 0 0.8090186 -0.587785 0 0.8090171 -0.5877872 0 0.8090156 -0.587785 0 0.8090171 -0.4539908 0 0.8910063 -0.4539889 0 0.8910072 -0.453987 0 0.8910082 -0.4539889 0 0.8910072 0.1564365 0 0.987688 0.1564357 0 0.9876881 0.156435 0 0.9876882 0.1564357 0 0.9876881 0.3090138 0 0.9510574 0.3090138 0 0.9510574 0.3090138 0 0.9510574 0.3090138 0 0.9510574 0.4539946 0 0.8910044 0.453995 0 0.891004 0.4539956 0 0.8910038 0.453995 0 0.891004 -0.3090189 0 0.9510559 -0.3090207 0 0.9510553 -0.3090225 0 0.9510547 -0.3090207 0 0.9510553 -0.1564359 0 0.9876881 -0.1564337 0 0.9876884 -0.1564315 0 0.9876888 -0.1564337 0 0.9876884 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.5877894 0 0.8090139 0.5877882 0 0.8090147 0.5877872 0 0.8090156 0.5877882 0 0.8090147 0.7071019 0 0.7071115 0.7071025 0 0.7071109 0.7071031 0 0.7071103 0.7071025 0 0.7071109 0.8090132 0 0.5877903 0.8090175 0 0.5877845 0.8090217 0 0.5877786 0.8090175 0 0.5877845 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9876881 0 -0.1564359 0.9876877 0 -0.1564382 0.9876873 0 -0.1564405 0.9876877 0 -0.1564382 0.9510543 0 -0.3090235 0.9510551 0 -0.3090212 0.9510559 0 -0.3090189 0.9510551 0 -0.3090212 0.8910096 0 0.4539842 0.891008 0 0.4539875 0.8910063 0 0.4539908 0.891008 0 0.4539875 0.9510543 0 0.3090235 0.9510551 0 0.3090212 0.9510559 0 0.3090189 0.9510551 0 0.3090212 0.9876881 0 0.1564359 0.9876877 0 0.1564382 0.9876873 0 0.1564405 0.9876877 0 0.1564382 0.5877894 0 -0.8090139 0.5877882 0 -0.8090147 0.5877872 0 -0.8090156 0.5877882 0 -0.8090147 0.4539946 0 -0.8910044 0.453995 0 -0.891004 0.4539956 0 -0.8910038 0.453995 0 -0.891004 0.3090138 0 -0.9510574 0.3090138 0 -0.9510574 0.3090138 0 -0.9510574 0.3090138 0 -0.9510574 0.8910096 0 -0.4539842 0.891008 0 -0.4539875 0.8910063 0 -0.4539908 0.891008 0 -0.4539875 0.8090132 0 -0.5877903 0.8090175 0 -0.5877845 0.8090217 0 -0.5877786 0.8090175 0 -0.5877845 0.7071019 0 -0.7071115 0.7071025 0 -0.7071109 0.7071031 0 -0.7071103 0.7071025 0 -0.7071109 0.1564365 0 -0.987688 0.1564357 0 -0.9876881 0.156435 0 -0.9876882 0.1564357 0 -0.9876881 -0.1564359 0 -0.9876881 -0.1564337 0 -0.9876884 -0.1564315 0 -0.9876888 -0.1564337 0 -0.9876884 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.7071068 0 0.7071068 -0.7071055 0 0.7071079 -0.7071044 0 0.7071092 -0.7071055 0 0.7071079 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.7071055 0 0.7071079 0.7071049 0 0.7071085 0.7071044 0 0.7071092 0.7071049 0 0.7071085 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.7071055 0 -0.7071079 0.7071049 0 -0.7071085 0.7071044 0 -0.7071092 0.7071049 0 -0.7071085 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.7071068 0 -0.7071068 -0.7071055 0 -0.7071079 -0.7071044 0 -0.7071092 -0.7071055 0 -0.7071079 -0.7071044 0 0.7071092 -0.7071055 0 0.7071079 -0.7071068 0 0.7071068 -0.7071055 0 0.7071079 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.7071044 0 0.7071092 0.7071038 0 0.7071097 0.7071031 0 0.7071103 0.7071038 0 0.7071097 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.7071044 0 -0.7071092 0.7071038 0 -0.7071097 0.7071031 0 -0.7071103 0.7071038 0 -0.7071097 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.7071044 0 -0.7071092 -0.7071055 0 -0.7071079 -0.7071068 0 -0.7071068 -0.7071055 0 -0.7071079 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.7071031 0 -0.7071103 0.7071031 0 -0.7071103 0.7071031 0 -0.7071103 0.7071031 0 -0.7071103 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.7071068 0 0.7071068 -0.7071055 0 0.7071079 -0.7071044 0 0.7071092 -0.7071055 0 0.7071079 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.7071031 0 0.7071103 0.7071031 0 0.7071103 0.7071031 0 0.7071103 0.7071031 0 0.7071103 -0.7071068 0 -0.7071068 -0.7071055 0 -0.7071079 -0.7071044 0 -0.7071092 -0.7071055 0 -0.7071079 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 -0.7071044 0 0.7071092 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.7071031 0 0.7071103 0.7071025 0 0.7071109 0.7071019 0 0.7071115 0.7071025 0 0.7071109 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.7071031 0 -0.7071103 0.7071025 0 -0.7071109 0.7071019 0 -0.7071115 0.7071025 0 -0.7071109 -0.7071044 0 -0.7071092 -0.7071049 0 -0.7071085 -0.7071055 0 -0.7071079 -0.7071049 0 -0.7071085 -0.4539908 0 -0.8910063 -0.4539889 0 -0.8910072 -0.453987 0 -0.8910082 -0.4539889 0 -0.8910072 -0.5877829 0 -0.8090186 -0.587785 0 -0.8090171 -0.5877872 0 -0.8090156 -0.587785 0 -0.8090171 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 -0.7071044 0 -0.7071092 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 -0.3090189 0 -0.9510559 -0.3090207 0 -0.9510553 -0.3090225 0 -0.9510547 -0.3090207 0 -0.9510553</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_60Shape-textangents-array" count="236" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_60Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_60Shape-texbinormals-array" count="708">0.7071092 0 0.7071044 0.7071086 0 0.707105 0.707108 0 0.7071056 0.7071086 0 0.707105 0.8090187 0 0.5877829 0.8090172 0 0.587785 0.8090156 0 0.5877872 0.8090172 0 0.587785 0.8910065 0 0.4539909 0.8910074 0 0.453989 0.8910084 0 0.4539871 0.8910073 0 0.453989 0.9876881 0 -0.1564365 0.9876882 0 -0.1564358 0.9876884 0 -0.156435 0.9876882 0 -0.1564358 0.9510576 0 -0.3090139 0.9510576 0 -0.3090138 0.9510576 0 -0.3090139 0.9510576 0 -0.3090138 0.8910044 0 -0.4539946 0.8910042 0 -0.4539951 0.891004 0 -0.4539956 0.8910042 0 -0.4539951 0.9510559 0 0.3090189 0.9510553 0 0.3090207 0.9510548 0 0.3090225 0.9510553 0 0.3090207 0.9876882 0 0.1564359 0.9876885 0 0.1564337 0.9876889 0 0.1564315 0.9876885 0 0.1564337 1 0 0 1 0 0 1 0 0 1 0 0 0.809014 0 -0.5877894 0.8090149 0 -0.5877883 0.8090156 0 -0.5877872 0.8090149 0 -0.5877883 0.7071116 0 -0.7071021 0.7071109 0 -0.7071026 0.7071104 0 -0.7071033 0.707111 0 -0.7071027 0.5877903 0 -0.8090134 0.5877845 0 -0.8090176 0.5877787 0 -0.8090218 0.5877845 0 -0.8090176 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.1564359 0 -0.9876882 -0.1564382 0 -0.9876878 -0.1564405 0 -0.9876874 -0.1564382 0 -0.9876878 -0.3090236 0 -0.9510545 -0.3090212 0 -0.9510552 -0.3090189 0 -0.951056 -0.3090212 0 -0.9510552 0.4539843 0 -0.8910097 0.4539876 0 -0.8910081 0.4539909 0 -0.8910064 0.4539876 0 -0.8910081 0.3090235 0 -0.9510544 0.3090212 0 -0.9510552 0.3090189 0 -0.951056 0.3090212 0 -0.9510552 0.1564359 0 -0.9876882 0.1564382 0 -0.9876878 0.1564405 0 -0.9876874 0.1564382 0 -0.9876878 -0.809014 0 -0.5877894 -0.8090149 0 -0.5877883 -0.8090157 0 -0.5877872 -0.8090149 0 -0.5877883 -0.8910045 0 -0.4539947 -0.8910043 0 -0.4539951 -0.891004 0 -0.4539956 -0.8910043 0 -0.4539951 -0.9510576 0 -0.3090138 -0.9510576 0 -0.3090139 -0.9510576 0 -0.3090138 -0.9510576 0 -0.3090139 -0.4539843 0 -0.8910097 -0.4539876 0 -0.8910081 -0.4539909 0 -0.8910065 -0.4539876 0 -0.8910081 -0.5877903 0 -0.8090134 -0.5877845 0 -0.8090176 -0.5877787 0 -0.8090218 -0.5877845 0 -0.8090176 -0.7071115 0 -0.707102 -0.707111 0 -0.7071027 -0.7071104 0 -0.7071033 -0.707111 0 -0.7071027 -0.9876881 0 -0.1564365 -0.9876882 0 -0.1564358 -0.9876883 0 -0.156435 -0.9876882 0 -0.1564358 -0.9876881 0 0.1564359 -0.9876885 0 0.1564337 -0.9876889 0 0.1564315 -0.9876885 0 0.1564337 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0.7071068 0 0.7071068 0.707108 0 0.7071056 0.7071092 0 0.7071044 0.707108 0 0.7071056 1 0 0 1 0 0 1 0 0 1 0 0 0.707108 0 -0.7071056 0.7071086 0 -0.707105 0.7071092 0 -0.7071044 0.7071086 0 -0.707105 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.707108 0 -0.7071056 -0.7071086 0 -0.707105 -0.7071092 0 -0.7071044 -0.7071086 0 -0.707105 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.7071068 0 0.7071068 -0.707108 0 0.7071056 -0.7071092 0 0.7071044 -0.707108 0 0.7071056 0.7071092 0 0.7071044 0.707108 0 0.7071056 0.7071068 0 0.7071068 0.707108 0 0.7071056 1 0 0 1 0 0 1 0 0 1 0 0 0.7071092 0 -0.7071044 0.7071097 0 -0.7071038 0.7071104 0 -0.7071033 0.7071097 0 -0.7071038 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.7071092 0 -0.7071044 -0.7071097 0 -0.7071038 -0.7071103 0 -0.7071032 -0.7071097 0 -0.7071038 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.7071092 0 0.7071044 -0.707108 0 0.7071056 -0.7071068 0 0.7071068 -0.707108 0 0.7071056 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.7071104 0 -0.7071033 -0.7071104 0 -0.7071033 -0.7071104 0 -0.7071033 -0.7071104 0 -0.7071033 -1 0 0 -1 0 0 -1 0 0 -1 0 0 0.7071068 0 0.7071068 0.707108 0 0.7071056 0.7071092 0 0.7071044 0.707108 0 0.7071056 1 0 0 1 0 0 1 0 0 1 0 0 0.7071104 0 -0.7071033 0.7071104 0 -0.7071033 0.7071104 0 -0.7071033 0.7071104 0 -0.7071033 -0.7071068 0 0.7071068 -0.707108 0 0.7071056 -0.7071092 0 0.7071044 -0.707108 0 0.7071056 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7071092 0 0.7071044 0.7071092 0 0.7071044 1 0 0 1 0 0 1 0 0 1 0 0 0.7071104 0 -0.7071033 0.7071109 0 -0.7071026 0.7071116 0 -0.7071021 0.707111 0 -0.7071027 0 0 -1 0 0 -1 0 0 -1 0 0 -1 -0.7071103 0 -0.7071032 -0.707111 0 -0.7071027 -0.7071116 0 -0.7071021 -0.7071109 0 -0.7071026 -0.7071092 0 0.7071044 -0.7071086 0 0.707105 -0.707108 0 0.7071056 -0.7071086 0 0.707105 -0.8910064 0 0.4539909 -0.8910073 0 0.453989 -0.8910084 0 0.4539871 -0.8910073 0 0.453989 -0.8090187 0 0.5877829 -0.8090172 0 0.587785 -0.8090156 0 0.5877872 -0.8090172 0 0.5877851 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -0.7071092 0 0.7071044 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.951056 0 0.3090189 -0.9510553 0 0.3090207 -0.9510548 0 0.3090225 -0.9510554 0 0.3090207</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_60Shape-texbinormals-array" count="236" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_60Shape-vertices" name="qt_gauge_tickmarks_60Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_60Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_60Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_60Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_60Shape-binormals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="118">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_60Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_60Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_60Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_60Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46 48 48 48 49 49 49 50 51 51 50 51 51 49 49 49 51 50 50 52 52 52 53 53 53 54 55 55 54 55 55 53 53 53 55 54 54 56 56 56 57 57 57 58 59 59 58 59 59 57 57 57 59 58 58 60 60 60 61 61 61 62 63 63 62 63 63 61 61 61 63 62 62 64 64 64 65 65 65 66 67 67 66 67 67 65 65 65 67 66 66 68 68 68 69 69 69 70 71 71 70 71 71 69 69 69 71 70 70 72 72 72 73 73 73 74 75 75 74 75 75 73 73 73 75 74 74 76 76 76 77 77 77 78 79 79 78 79 79 77 77 77 79 78 78 80 80 80 81 81 81 82 83 83 82 83 83 81 81 81 83 82 82 84 84 84 85 85 85 86 87 87 86 87 87 85 85 85 87 86 86 88 88 88 89 89 89 90 91 91 90 91 91 89 89 89 91 90 90 92 92 92 93 93 93 94 95 95 94 95 95 93 93 93 95 94 94 96 96 96 97 97 97 98 99 99 98 99 99 97 97 97 99 98 98 100 100 100 101 101 101 102 103 103 102 103 103 101 101 101 103 102 102 104 104 104 105 105 105 106 107 107 106 107 107 105 105 105 107 106 106 108 108 108 109 109 109 110 111 111 110 111 111 109 109 109 111 110 110 112 112 112 113 113 113 114 115 115 114 115 115 113 113 113 115 114 114 116 116 116 117 117 117 118 119 119 118 119 119 117 117 117 119 118 118 120 120 120 121 121 121 122 123 123 122 123 123 121 121 121 123 122 122 124 124 124 125 125 125 126 127 127 126 127 127 125 125 125 127 126 126 128 128 128 129 129 129 130 131 131 130 131 131 129 129 129 131 130 130 132 132 132 133 133 133 134 135 135 134 135 135 133 133 133 135 134 134 136 136 136 137 137 137 138 139 139 138 139 139 137 137 137 139 138 138 140 140 140 141 141 141 142 143 143 142 143 143 141 141 141 143 142 142 144 144 144 145 145 145 146 147 147 146 147 147 145 145 145 147 146 146 148 148 148 149 149 149 150 151 151 150 151 151 149 149 149 151 150 150 152 152 152 153 153 153 154 155 155 154 155 155 153 153 153 155 154 154 156 156 156 157 157 157 158 159 159 158 159 159 157 157 157 159 158 158 160 160 160 161 161 161 162 163 163 162 163 163 161 161 161 163 162 162 164 164 164 165 165 165 166 167 167 166 167 167 165 165 165 167 166 166 168 168 168 169 169 169 170 171 171 170 171 171 169 169 169 171 170 170 172 172 172 173 173 173 174 175 175 174 175 175 173 173 173 175 174 174 176 176 176 177 177 177 178 179 179 178 179 179 177 177 177 179 178 178 180 180 180 181 181 181 182 183 183 182 183 183 181 181 181 183 182 182 184 184 184 185 185 185 186 187 187 186 187 187 185 185 185 187 186 186 188 188 188 189 189 189 190 191 191 190 191 191 189 189 189 191 190 190 192 192 192 193 193 193 194 195 195 194 195 195 193 193 193 195 194 194 196 196 196 197 197 197 198 199 199 198 199 199 197 197 197 199 198 198 200 200 200 201 201 201 202 203 203 202 203 203 201 201 201 203 202 202 204 204 204 205 205 205 206 207 207 206 207 207 205 205 205 207 206 206 208 208 208 209 209 209 210 211 211 210 211 211 209 209 209 211 210 210 212 212 212 213 213 213 214 215 215 214 215 215 213 213 213 215 214 214 216 216 216 217 217 217 218 219 219 218 219 219 217 217 217 219 218 218 220 220 220 221 221 221 222 223 223 222 223 223 221 221 221 223 222 222 224 224 224 225 225 225 226 227 227 226 227 227 225 225 225 227 226 226 228 228 228 229 229 229 230 231 231 230 231 231 229 229 229 231 230 230 232 232 232 233 233 233 234 235 235 234 235 235 233 233 233 235 234 234</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_60Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_60" name="qt_gauge_tickmarks_60" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_60Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_60</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_1.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_1.dae
new file mode 100644
index 0000000..99ce6ec
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_1.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:30:39</created>
+ <modified>2018-03-08T09:30:39</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_8Shape" name="qt_gauge_tickmarks_8Shape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_8Shape-positions" name="qt_gauge_tickmarks_8Shape-positions">
+ <float_array id="qt_gauge_tickmarks_8Shape-positions-array" count="96">-2.465355 0 -6.288643 -1.993413 0 -6.453783 -3.291052 0 -8.648352 -2.81911 0 -8.81349 -5.848396 0 -3.379535 -5.58238 0 -3.802897 -7.965207 0 -4.709616 -7.699191 0 -5.132978 -6.679566 0 1.004189 -6.735548 0 0.5073323 -9.163847 0 1.2841 -9.21983 0 0.7872438 -4.596194 0 4.949747 -4.949748 0 4.596194 -6.363961 0 6.717514 -6.717515 0 6.363961 4.949748 0 4.596194 4.596194 0 4.949747 6.717515 0 6.363961 6.363961 0 6.717514 6.735548 0 0.5073323 6.679566 0 1.004189 9.21983 0 0.7872438 9.163847 0 1.2841 5.58238 0 -3.802897 5.848396 0 -3.379535 7.699191 0 -5.132978 7.965207 0 -4.709616 1.993413 0 -6.453783 2.465355 0 -6.288643 2.81911 0 -8.81349 3.291052 0 -8.648352</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8Shape-positions-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8Shape-normals" name="qt_gauge_tickmarks_8Shape-normals">
+ <float_array id="qt_gauge_tickmarks_8Shape-normals-array" count="96">0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8Shape-normals-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8Shape-tangents" name="qt_gauge_tickmarks_8Shape-tangents">
+ <float_array id="qt_gauge_tickmarks_8Shape-tangents-array" count="96">0.9438834 0 -0.330279 -0.3302783 0 -0.9438836 0.3302767 0 0.9438841 -0.9438833 0 0.3302792 0.532032 0 -0.8467242 -0.8467242 0 -0.5320321 0.8467239 0 0.5320326 -0.5320322 0 0.8467241 -0.1119646 0 -0.9937122 -0.9937122 0 0.1119642 0.9937121 0 -0.1119651 0.1119646 0 0.9937122 -0.7071068 0 -0.7071068 -0.7071063 0 0.7071073 0.7071058 0 -0.7071077 0.7071067 0 0.7071069 -0.7071067 0 0.7071069 0.7071063 0 0.7071073 -0.7071058 0 -0.7071077 0.7071068 0 -0.7071068 -0.1119646 0 0.9937122 0.9937122 0 0.1119642 -0.9937121 0 -0.1119651 0.1119646 0 -0.9937122 0.5320322 0 0.8467241 0.8467242 0 -0.5320321 -0.8467239 0 0.5320326 -0.532032 0 -0.8467242 0.9438833 0 0.3302792 0.3302783 0 -0.9438836 -0.3302767 0 0.9438841 -0.9438834 0 -0.330279</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8Shape-tangents-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8Shape-binormals" name="qt_gauge_tickmarks_8Shape-binormals">
+ <float_array id="qt_gauge_tickmarks_8Shape-binormals-array" count="96">-0.330279 0 -0.9438834 -0.9438837 0 0.3302783 0.9438843 0 -0.3302768 0.3302792 0 0.9438834 -0.8467242 0 -0.5320321 -0.5320321 0 0.8467242 0.5320325 0 -0.846724 0.8467242 0 0.5320323 -0.9937123 0 0.1119646 0.1119642 0 0.9937123 -0.1119652 0 -0.9937122 0.9937123 0 -0.1119646 -0.7071068 0 0.7071068 0.7071072 0 0.7071063 -0.7071077 0 -0.7071058 0.7071069 0 -0.7071067 0.7071069 0 0.7071067 0.7071072 0 -0.7071063 -0.7071077 0 0.7071058 -0.7071068 0 -0.7071068 0.9937123 0 0.1119646 0.1119642 0 -0.9937122 -0.1119652 0 0.9937122 -0.9937122 0 -0.1119646 0.8467242 0 -0.5320323 -0.5320321 0 -0.8467242 0.5320325 0 0.8467239 -0.8467242 0 0.5320321 0.3302792 0 -0.9438834 -0.9438837 0 -0.3302783 0.9438842 0 0.3302767 -0.330279 0 0.9438834</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8Shape-binormals-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8Shape-map1" name="qt_gauge_tickmarks_8Shape-map1">
+ <float_array id="qt_gauge_tickmarks_8Shape-map1-array" count="64">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8Shape-map1-array" count="32" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8Shape-textangents">
+ <float_array id="qt_gauge_tickmarks_8Shape-textangents-array" count="96">0.9438835 0 -0.3302783 0.9438838 0 -0.3302775 0.9438841 0 -0.3302767 0.9438838 0 -0.3302775 0.5320321 0 -0.8467241 0.5320323 0 -0.846724 0.5320325 0 -0.8467239 0.5320323 0 -0.846724 -0.1119642 0 -0.9937122 -0.1119647 0 -0.9937121 -0.1119651 0 -0.9937121 -0.1119647 0 -0.9937121 -0.7071072 0 -0.7071062 -0.7071074 0 -0.707106 -0.7071077 0 -0.7071058 -0.7071074 0 -0.707106 -0.7071072 0 0.7071062 -0.7071074 0 0.707106 -0.7071077 0 0.7071058 -0.7071074 0 0.707106 -0.1119642 0 0.9937122 -0.1119647 0 0.9937121 -0.1119651 0 0.9937121 -0.1119647 0 0.9937121 0.5320321 0 0.8467241 0.5320323 0 0.846724 0.5320325 0 0.8467239 0.5320323 0 0.846724 0.9438835 0 0.3302783 0.9438838 0 0.3302775 0.9438841 0 0.3302767 0.9438838 0 0.3302775</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8Shape-textangents-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8Shape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_8Shape-texbinormals-array" count="96">-0.3302783 0 -0.9438836 -0.3302775 0 -0.9438839 -0.3302767 0 -0.9438842 -0.3302775 0 -0.943884 -0.8467242 0 -0.5320321 -0.846724 0 -0.5320323 -0.8467239 0 -0.5320325 -0.846724 0 -0.5320323 -0.9937123 0 0.1119642 -0.9937122 0 0.1119647 -0.9937122 0 0.1119652 -0.9937122 0 0.1119647 -0.7071064 0 0.7071073 -0.7071061 0 0.7071075 -0.7071058 0 0.7071077 -0.7071061 0 0.7071075 0.7071064 0 0.7071073 0.7071061 0 0.7071075 0.7071058 0 0.7071077 0.7071061 0 0.7071075 0.9937123 0 0.1119642 0.9937122 0 0.1119647 0.9937122 0 0.1119652 0.9937122 0 0.1119647 0.8467242 0 -0.5320321 0.846724 0 -0.5320323 0.8467239 0 -0.5320325 0.8467241 0 -0.5320324 0.3302783 0 -0.9438836 0.3302775 0 -0.9438839 0.3302768 0 -0.9438843 0.3302775 0 -0.9438839</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8Shape-texbinormals-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_8Shape-vertices" name="qt_gauge_tickmarks_8Shape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_8Shape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_8Shape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_8Shape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_8Shape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="16">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_8Shape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_8Shape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_8Shape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_8Shape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_8Shape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_8" name="qt_gauge_tickmarks_8" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_8Shape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_8</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_extrude.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_extrude.dae
new file mode 100644
index 0000000..01487ee
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_extrude.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:29:52</created>
+ <modified>2018-03-08T09:29:52</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_8_extrudeShape" name="qt_gauge_tickmarks_8_extrudeShape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_8_extrudeShape-positions" name="qt_gauge_tickmarks_8_extrudeShape-positions">
+ <float_array id="qt_gauge_tickmarks_8_extrudeShape-positions-array" count="192">-2.465355 0 -6.288643 -1.993413 0 -6.453783 -3.291052 0 -8.648352 -2.81911 0 -8.81349 -5.848396 0 -3.379535 -5.58238 0 -3.802897 -7.965207 0 -4.709616 -7.699191 0 -5.132978 -6.679566 0 1.004189 -6.735548 0 0.5073323 -9.163847 0 1.2841 -9.21983 0 0.7872438 -4.596194 0 4.949747 -4.949748 0 4.596194 -6.363961 0 6.717514 -6.717515 0 6.363961 4.949748 0 4.596194 4.596194 0 4.949747 6.717515 0 6.363961 6.363961 0 6.717514 6.735548 0 0.5073323 6.679566 0 1.004189 9.21983 0 0.7872438 9.163847 0 1.2841 5.58238 0 -3.802897 5.848396 0 -3.379535 7.699191 0 -5.132978 7.965207 0 -4.709616 1.993413 0 -6.453783 2.465355 0 -6.288643 2.81911 0 -8.81349 3.291052 0 -8.648352 -2.403994 0.3177167 -6.416059 -2.120829 0.3177167 -6.515143 -2.880471 0.3177167 -8.686074 -3.163636 0.3177167 -8.586991 -5.879866 0.3177167 -3.517411 -5.720256 0.3177167 -3.771428 -7.667721 0.3177167 -4.995102 -7.827332 0.3177167 -4.741085 -6.790134 0.3177167 0.9160138 -6.823723 0.3177167 0.6179 -9.109262 0.3177167 0.8754185 -9.075672 0.3177167 1.173532 -4.737616 0.3177167 4.949747 -4.949748 0.3177167 4.737616 -6.576094 0.3177167 6.363961 -6.363961 0.3177167 6.576093 4.949748 0.3177167 4.737616 4.737616 0.3177167 4.949747 6.363961 0.3177167 6.576093 6.576094 0.3177167 6.363961 6.823723 0.3177167 0.6179 6.790134 0.3177167 0.9160138 9.075672 0.3177167 1.173532 9.109262 0.3177167 0.8754185 5.720256 0.3177167 -3.771428 5.879866 0.3177167 -3.517411 7.827332 0.3177167 -4.741085 7.667721 0.3177167 -4.995102 2.120829 0.3177167 -6.515143 2.403994 0.3177167 -6.416059 3.163636 0.3177167 -8.586991 2.880471 0.3177167 -8.686074</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_extrudeShape-positions-array" count="64" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_extrudeShape-normals" name="qt_gauge_tickmarks_8_extrudeShape-normals">
+ <float_array id="qt_gauge_tickmarks_8_extrudeShape-normals-array" count="576">0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999998 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999998 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -0.9999999 0 0 -1 0 0 -0.9999999 0 0.3150423 0.3002256 0.9003403 0.3150423 0.3002256 0.9003404 0.3150423 0.3002256 0.9003404 0.3150423 0.3002257 0.9003404 0.9003402 0.3002259 -0.3150427 0.9003402 0.3002259 -0.3150427 0.9003402 0.3002259 -0.3150427 0.9003401 0.3002259 -0.3150427 -0.315041 0.300225 -0.9003411 -0.315041 0.3002249 -0.900341 -0.315041 0.3002249 -0.900341 -0.315041 0.3002249 -0.9003411 -0.9003405 0.300225 0.3150426 -0.9003406 0.300225 0.3150426 -0.9003406 0.300225 0.3150426 -0.9003406 0.300225 0.3150426 0.8076629 0.3002265 0.5074885 0.8076629 0.3002265 0.5074885 0.8076629 0.3002265 0.5074885 0.807663 0.3002265 0.5074885 0.5074885 0.3002259 -0.8076632 0.5074885 0.3002259 -0.8076631 0.5074885 0.3002259 -0.8076631 0.5074885 0.3002259 -0.8076631 -0.8076622 0.3002271 -0.5074893 -0.8076622 0.3002271 -0.5074892 -0.8076623 0.3002272 -0.5074893 -0.8076622 0.3002272 -0.5074893 -0.5074885 0.3002258 0.8076632 -0.5074885 0.3002258 0.8076633 -0.5074885 0.3002258 0.8076632 -0.5074885 0.3002257 0.8076631 0.9478709 0.3002244 -0.1067992 0.9478709 0.3002244 -0.1067992 0.9478709 0.3002244 -0.1067992 0.9478709 0.3002244 -0.1067992 -0.1067995 0.3002259 -0.9478704 -0.1067995 0.3002259 -0.9478704 -0.1067995 0.3002259 -0.9478704 -0.1067995 0.3002259 -0.9478704 -0.9478702 0.3002264 0.1067997 -0.9478703 0.3002263 0.1067997 -0.9478703 0.3002264 0.1067997 -0.9478703 0.3002264 0.1067997 0.1067995 0.3002261 0.9478704 0.1067995 0.300226 0.9478703 0.1067995 0.300226 0.9478703 0.1067995 0.3002261 0.9478704 0.6744861 0.3002253 -0.6744874 0.6744862 0.3002253 -0.6744875 0.674486 0.3002252 -0.6744874 0.6744861 0.3002252 -0.6744874 -0.6744863 0.3002267 -0.6744865 -0.6744863 0.3002267 -0.6744865 -0.6744863 0.3002267 -0.6744865 -0.6744863 0.3002267 -0.6744865 -0.6744859 0.3002256 0.6744874 -0.6744859 0.3002256 0.6744874 -0.6744859 0.3002256 0.6744874 -0.6744859 0.3002256 0.6744875 0.6744867 0.3002259 0.6744866 0.6744867 0.3002259 0.6744866 0.6744867 0.3002259 0.6744866 0.6744867 0.3002259 0.6744866 -0.6744862 0.3002253 -0.6744875 -0.6744861 0.3002253 -0.6744874 -0.6744861 0.3002252 -0.6744874 -0.674486 0.3002252 -0.6744874 -0.6744867 0.3002257 0.6744866 -0.6744867 0.3002257 0.6744866 -0.6744867 0.3002257 0.6744866 -0.6744867 0.3002257 0.6744866 0.6744858 0.3002261 0.6744874 0.6744858 0.300226 0.6744874 0.6744858 0.3002261 0.6744874 0.6744858 0.300226 0.6744874 0.6744863 0.3002267 -0.6744865 0.6744863 0.3002267 -0.6744865 0.6744863 0.3002267 -0.6744865 0.6744863 0.3002267 -0.6744865 -0.9478706 0.3002256 -0.1067992 -0.9478705 0.3002256 -0.1067992 -0.9478706 0.3002256 -0.1067992 -0.9478705 0.3002256 -0.1067992 -0.1067994 0.3002259 0.9478704 -0.1067994 0.3002259 0.9478704 -0.1067994 0.3002259 0.9478704 -0.1067994 0.3002259 0.9478704 0.9478702 0.3002264 0.1067997 0.9478703 0.3002264 0.1067997 0.9478703 0.3002264 0.1067997 0.9478702 0.3002264 0.1067997 0.1067995 0.3002258 -0.9478704 0.1067995 0.3002258 -0.9478704 0.1067995 0.3002258 -0.9478704 0.1067995 0.3002258 -0.9478704 -0.8076629 0.3002267 0.5074885 -0.8076629 0.3002267 0.5074885 -0.8076629 0.3002267 0.5074884 -0.8076629 0.3002267 0.5074884 0.5074885 0.3002256 0.8076632 0.5074886 0.3002257 0.8076632 0.5074886 0.3002257 0.8076632 0.5074885 0.3002257 0.8076632 0.8076624 0.3002266 -0.5074893 0.8076624 0.3002266 -0.5074893 0.8076624 0.3002265 -0.5074893 0.8076624 0.3002266 -0.5074893 -0.5074886 0.3002259 -0.8076631 -0.5074885 0.3002259 -0.8076631 -0.5074886 0.300226 -0.8076631 -0.5074885 0.3002259 -0.807663 -0.3150423 0.3002256 0.9003404 -0.3150423 0.3002256 0.9003403 -0.3150423 0.3002257 0.9003404 -0.3150423 0.3002256 0.9003404 0.9003404 0.3002251 0.3150426 0.9003405 0.3002252 0.3150426 0.9003404 0.3002252 0.3150426 0.9003404 0.3002252 0.3150426 0.315041 0.3002249 -0.9003412 0.315041 0.3002248 -0.9003411 0.315041 0.3002249 -0.9003412 0.315041 0.3002249 -0.9003412 -0.9003403 0.3002254 -0.3150428 -0.9003403 0.3002254 -0.3150428 -0.9003403 0.3002254 -0.3150427 -0.9003404 0.3002255 -0.3150428</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_extrudeShape-normals-array" count="192" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_extrudeShape-tangents" name="qt_gauge_tickmarks_8_extrudeShape-tangents">
+ <float_array id="qt_gauge_tickmarks_8_extrudeShape-tangents-array" count="576">0.9438833 0 -0.3302791 -0.3302777 0 -0.9438838 -0.9438833 0 0.3302792 0.3302765 0 0.9438843 0.5320321 0 -0.8467242 -0.846724 0 -0.5320324 -0.5320322 0 0.8467242 0.8467233 0 0.5320335 -0.1119646 0 -0.9937122 -0.9937122 0 0.1119645 0.1119646 0 0.9937122 0.9937122 0 -0.1119645 -0.7071068 0 -0.7071068 -0.707106 0 0.7071076 0.7071066 0 0.7071069 0.7071052 0 -0.7071084 -0.7071067 0 0.7071069 0.707106 0 0.7071076 0.7071068 0 -0.7071068 -0.7071052 0 -0.7071084 -0.1119646 0 0.9937122 0.9937122 0 0.1119645 0.1119646 0 -0.9937122 -0.9937122 0 -0.1119645 0.5320323 0 0.8467242 0.8467241 0 -0.5320324 -0.5320321 0 -0.8467241 -0.8467233 0 0.5320335 0.9438833 0 0.3302792 0.3302777 0 -0.9438838 -0.9438833 0 -0.3302791 -0.3302765 0 0.9438842 -0.3302783 0 -0.9438837 0.9438834 0 -0.330279 0.3302768 0 0.9438842 -0.9438833 0 0.3302792 -0.8467242 0 -0.5320321 0.5320321 0 -0.8467242 0.8467239 0 0.5320326 -0.5320322 0 0.8467241 -0.9937122 0 0.1119642 -0.1119646 0 -0.9937121 0.9937121 0 -0.1119651 0.1119646 0 0.9937121 -0.7071064 0 0.7071073 -0.7071068 0 -0.7071068 0.7071059 0 -0.7071078 0.7071067 0 0.7071069 0.7071064 0 0.7071073 -0.7071066 0 0.7071068 -0.7071058 0 -0.7071077 0.7071068 0 -0.7071068 0.9937123 0 0.1119642 -0.1119646 0 0.9937121 -0.9937121 0 -0.1119651 0.1119646 0 -0.9937121 0.8467242 0 -0.5320321 0.5320322 0 0.8467242 -0.8467239 0 0.5320326 -0.5320321 0 -0.8467242 0.3302783 0 -0.9438836 0.9438833 0 0.3302792 -0.3302768 0 0.9438842 -0.9438834 0 -0.330279 0.9325328 -0.2742811 -0.2348458 -0.09915802 0.9538683 -0.2833781 -0.8755077 -0.2742814 0.3978142 0.09915785 -0.9538683 0.2833782 -0.2348461 -0.2742812 -0.9325327 -0.2833782 0.9538681 0.09915836 0.3978145 -0.2742798 0.875508 0.2833782 -0.9538682 -0.09915838 -0.9325331 -0.274281 0.2348445 0.09915733 0.9538685 0.2833776 0.8755084 -0.2742813 -0.3978127 -0.09915727 -0.9538685 -0.2833776 0.2348462 -0.2742811 0.9325327 0.2833774 0.9538684 -0.09915801 -0.3978142 -0.2742814 -0.8755077 -0.2833773 -0.9538684 0.09915803 0.5826597 -0.2742809 -0.7650345 -0.2542091 0.953868 -0.1597302 -0.436466 -0.2742811 0.8568941 0.254209 -0.9538679 0.1597302 -0.7650345 -0.2742814 -0.5826594 -0.1597299 0.9538681 0.2542085 0.856894 -0.2742817 0.4364659 0.1597299 -0.9538682 -0.2542085 -0.5826606 -0.2742805 0.7650339 0.2542095 0.9538677 0.1597306 0.4364664 -0.2742818 -0.8568936 -0.2542093 -0.9538677 -0.1597309 0.7650347 -0.274281 0.5826594 0.1597297 0.9538681 -0.2542084 -0.8568939 -0.2742816 -0.4364659 -0.1597297 -0.9538682 0.2542084 -0.02145008 -0.2742814 -0.9614103 -0.2983367 0.9538686 0.03361439 0.1930213 -0.2742814 0.9420789 0.2983366 -0.9538686 -0.03361446 -0.9614102 -0.2742815 0.02144985 0.03361467 0.9538682 0.2983382 0.9420785 -0.2742823 -0.1930223 -0.03361467 -0.9538681 -0.2983381 0.02145006 -0.2742813 0.9614103 0.2983386 0.953868 -0.03361489 -0.1930224 -0.2742813 -0.9420787 -0.2983386 -0.953868 0.03361469 0.9614102 -0.2742815 -0.02144984 -0.03361469 0.9538681 -0.2983383 -0.9420788 -0.2742811 0.193022 0.03361469 -0.9538681 0.2983383 -0.6162004 -0.2742817 -0.7382863 -0.2122912 0.9538684 0.2122915 0.7382875 -0.2742811 0.6161991 0.212291 -0.9538683 -0.2122915 -0.7382873 -0.2742812 0.6161994 0.2122924 0.9538679 0.2122924 0.6161996 -0.2742813 -0.7382872 -0.2122924 -0.9538679 -0.2122924 0.6162004 -0.2742817 0.7382863 0.2122913 0.9538683 -0.2122919 -0.7382877 -0.2742811 -0.616199 -0.2122911 -0.9538683 0.2122921 0.738287 -0.2742814 -0.6161997 -0.2122918 0.9538681 -0.2122918 -0.6161996 -0.2742813 0.7382871 0.2122918 -0.9538682 0.2122918 -0.7382876 -0.2742811 0.6161992 0.2122912 0.9538683 0.2122915 0.6162004 -0.2742817 -0.7382863 -0.212291 -0.9538683 -0.2122915 0.6161996 -0.2742813 0.7382871 0.2122916 0.9538682 -0.2122916 -0.738287 -0.2742814 -0.6161997 -0.2122916 -0.9538682 0.2122916 0.7382879 -0.274281 -0.6161989 -0.2122916 0.9538682 -0.2122922 -0.6162004 -0.2742817 0.7382864 0.2122914 -0.9538681 0.2122923 -0.6161996 -0.2742813 -0.7382872 -0.2122923 0.9538679 0.2122924 0.7382873 -0.2742812 0.6161994 0.2122924 -0.9538679 -0.2122924 -0.1930216 -0.2742814 0.9420788 0.2983378 0.9538683 0.03361452 0.02144977 -0.2742812 -0.9614103 -0.2983378 -0.9538682 -0.03361459 0.9420788 -0.2742811 0.193022 0.03361468 0.9538681 -0.2983381 -0.9614102 -0.2742815 -0.02144982 -0.03361467 -0.9538681 0.2983381 0.1930224 -0.2742813 -0.9420787 -0.2983387 0.953868 -0.0336149 -0.02145005 -0.2742813 0.9614103 0.2983387 -0.953868 0.0336147 -0.9420785 -0.2742823 -0.1930223 -0.03361466 0.9538682 0.2983381 0.9614102 -0.2742816 0.02144988 0.03361466 -0.9538682 -0.2983381 0.4364659 -0.2742811 0.8568941 0.2542093 0.9538679 -0.1597303 -0.5826597 -0.2742809 -0.7650344 -0.2542092 -0.9538679 0.1597303 0.8568939 -0.2742817 -0.4364659 -0.1597297 0.9538682 -0.2542084 -0.7650346 -0.274281 0.5826594 0.1597297 -0.9538682 0.2542083 -0.4364665 -0.2742819 -0.8568935 -0.254209 0.953868 0.1597303 0.5826604 -0.2742807 0.765034 0.2542089 -0.953868 -0.1597306 -0.8568939 -0.2742817 0.4364659 0.1597299 0.9538681 0.2542085 0.7650344 -0.2742814 -0.5826596 -0.1597299 -0.953868 -0.2542086 0.8755077 -0.2742814 0.3978143 0.09915803 0.9538683 -0.2833781 -0.9325328 -0.274281 -0.2348457 -0.09915785 -0.9538682 0.2833782 0.3978144 -0.2742813 -0.8755076 -0.2833775 0.9538684 -0.09915806 -0.2348461 -0.274281 0.9325327 0.2833776 -0.9538684 0.09915809 -0.8755083 -0.2742813 -0.3978127 -0.09915729 0.9538684 0.2833775 0.9325331 -0.274281 0.2348446 0.09915724 -0.9538685 -0.2833775 -0.3978143 -0.2742799 0.8755081 0.2833778 0.9538683 0.09915821 0.2348461 -0.2742812 -0.9325327 -0.2833778 -0.9538683 -0.09915823</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_extrudeShape-tangents-array" count="192" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_extrudeShape-binormals" name="qt_gauge_tickmarks_8_extrudeShape-binormals">
+ <float_array id="qt_gauge_tickmarks_8_extrudeShape-binormals-array" count="576">-0.3302791 0 -0.9438834 -0.9438838 0 0.3302777 0.3302792 0 0.9438833 0.9438843 0 -0.3302765 -0.8467242 0 -0.5320321 -0.5320324 0 0.846724 0.8467242 0 0.5320322 0.5320335 0 -0.8467233 -0.9937123 0 0.1119646 0.1119645 0 0.9937122 0.9937123 0 -0.1119646 -0.1119645 0 -0.9937122 -0.7071068 0 0.7071068 0.7071076 0 0.707106 0.7071069 0 -0.7071066 -0.7071084 0 -0.7071052 0.7071069 0 0.7071066 0.7071076 0 -0.707106 -0.7071068 0 -0.7071068 -0.7071084 0 0.7071052 0.9937123 0 0.1119646 0.1119645 0 -0.9937123 -0.9937123 0 -0.1119646 -0.1119645 0 0.9937123 0.8467242 0 -0.5320323 -0.5320324 0 -0.8467241 -0.8467242 0 0.5320321 0.5320335 0 0.8467234 0.3302792 0 -0.9438833 -0.9438838 0 -0.3302777 -0.3302791 0 0.9438834 0.9438843 0 0.3302766 0.9438837 0 -0.3302783 0.330279 0 0.9438834 -0.9438842 0 0.3302768 -0.3302792 0 -0.9438834 0.5320321 0 -0.8467242 0.8467243 0 0.5320321 -0.5320326 0 0.8467239 -0.8467242 0 -0.5320322 -0.1119642 0 -0.9937123 0.9937122 0 -0.1119646 0.1119651 0 0.9937122 -0.9937123 0 0.1119646 -0.7071072 0 -0.7071063 0.7071068 0 -0.7071068 0.7071078 0 0.7071059 -0.7071069 0 0.7071067 -0.7071072 0 0.7071063 -0.7071069 0 -0.7071067 0.7071077 0 -0.7071058 0.7071068 0 0.7071068 -0.1119642 0 0.9937123 -0.9937122 0 -0.1119646 0.1119651 0 -0.9937122 0.9937122 0 0.1119646 0.5320321 0 0.8467242 -0.8467242 0 0.5320322 -0.5320326 0 -0.8467239 0.8467243 0 -0.5320321 0.9438837 0 0.3302783 -0.3302792 0 0.9438833 -0.9438842 0 -0.3302768 0.330279 0 -0.9438834 0.1764396 0.9135833 -0.3663804 -0.9438835 0 0.3302787 0.3663806 -0.9135833 0.1764396 0.9438835 0 -0.3302786 -0.3663808 0.9135832 -0.1764395 0.3302791 0 0.9438834 0.1764403 -0.9135836 -0.3663794 -0.3302791 0 -0.9438833 -0.1764403 0.9135836 0.3663795 0.9438841 0 -0.3302772 -0.36638 -0.9135835 -0.1764396 -0.943884 0 0.3302772 0.3663799 0.9135836 0.1764397 -0.3302789 0 -0.9438835 -0.176439 -0.9135835 0.3663804 0.3302789 0 0.9438835 -0.09048926 0.9135832 -0.3964564 -0.5320323 0 0.8467241 0.3964568 -0.913583 -0.09048794 0.5320323 0 -0.8467242 -0.3964564 0.9135832 0.09048855 0.8467241 0 0.5320322 -0.09048878 -0.913583 -0.3964565 -0.8467241 0 -0.5320322 0.09048951 0.913583 0.3964566 0.5320331 0 -0.8467237 -0.3964578 -0.9135827 0.090488 -0.5320332 0 0.8467235 0.396456 0.9135833 -0.09048866 -0.8467243 0 -0.5320321 0.09048887 -0.9135832 0.3964564 0.8467242 0 0.5320321 -0.3179318 0.9135837 -0.2535435 0.1119643 0 0.9937123 0.253542 -0.9135837 -0.3179331 -0.1119643 0 -0.9937122 -0.2535436 0.9135832 0.3179334 0.9937122 0 -0.1119646 -0.3179343 -0.9135829 -0.2535431 -0.9937123 0 0.1119646 0.3179339 0.913583 0.2535432 -0.1119649 0 -0.9937122 -0.2535437 -0.9135831 0.3179335 0.1119648 0 0.9937122 0.2535435 0.9135831 -0.3179335 -0.9937123 0 0.1119646 0.3179331 -0.9135832 0.2535435 0.9937122 0 -0.1119646 -0.4066517 0.9135833 0 0.7071075 0 0.7071062 0 -0.9135835 -0.4066514 -0.7071075 0 -0.7071061 0 0.9135829 0.4066525 0.7071069 0 -0.7071067 -0.4066526 -0.9135829 0 -0.7071069 0 0.7071067 0.406652 0.9135832 0 -0.7071075 0 -0.7071061 0 -0.9135834 0.4066517 0.7071077 0 0.7071059 0 0.9135832 -0.406652 -0.7071067 0 0.7071068 0.406652 -0.9135832 0 0.7071068 0 -0.7071068 0 0.9135834 0.4066513 0.7071075 0 -0.7071062 -0.4066517 -0.9135833 0 -0.7071075 0 0.7071061 0.4066519 0.9135833 0 -0.7071067 0 -0.7071068 0 -0.9135832 0.4066519 0.7071068 0 0.7071068 0 0.9135832 -0.4066518 -0.7071077 0 0.707106 0.4066523 -0.913583 0 0.7071076 0 -0.7071059 -0.4066526 0.9135829 0 0.7071069 0 0.7071067 0 -0.9135829 -0.4066525 -0.7071069 0 -0.7071067 0.2535431 0.9135833 0.3179333 0.1119643 0 -0.9937123 -0.317933 -0.9135833 0.2535433 -0.1119643 0 0.9937122 0.3179332 0.9135832 -0.2535434 -0.9937123 0 -0.1119646 0.2535435 -0.9135831 0.3179334 0.9937123 0 0.1119646 -0.2535437 0.913583 -0.3179334 -0.1119649 0 0.9937122 0.3179339 -0.913583 -0.2535432 0.1119648 0 -0.9937122 -0.3179344 0.9135829 0.253543 0.9937122 0 0.1119646 -0.2535436 -0.9135832 -0.3179333 -0.9937123 0 -0.1119646 0.396457 0.913583 0.0904879 -0.5320323 0 -0.8467242 -0.09048937 -0.913583 0.3964565 0.5320323 0 0.8467242 0.09048893 0.9135832 -0.3964563 -0.8467242 0 0.5320322 0.3964561 -0.9135834 0.09048855 0.8467242 0 -0.5320321 -0.3964573 0.9135828 -0.09048833 0.532033 0 0.8467236 0.09048901 -0.9135832 -0.3964563 -0.5320332 0 -0.8467236 -0.09048876 0.913583 0.3964566 0.8467241 0 -0.5320322 -0.3964565 -0.9135832 -0.09048854 -0.8467241 0 0.5320323 0.3663806 0.9135833 -0.1764396 -0.9438835 0 -0.3302787 0.1764396 -0.9135833 0.3663804 0.9438835 0 0.3302786 -0.1764391 0.9135835 -0.3663805 -0.330279 0 0.9438834 0.36638 -0.9135835 -0.1764396 0.330279 0 -0.9438834 -0.36638 0.9135835 0.1764395 0.9438841 0 0.3302772 -0.1764403 -0.9135836 -0.3663794 -0.9438841 0 -0.3302772 0.1764399 0.9135838 0.3663792 0.3302791 0 -0.9438833 -0.3663803 -0.9135834 0.1764396 -0.3302792 0 0.9438834</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_extrudeShape-binormals-array" count="192" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_extrudeShape-map1" name="qt_gauge_tickmarks_8_extrudeShape-map1">
+ <float_array id="qt_gauge_tickmarks_8_extrudeShape-map1-array" count="192">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_extrudeShape-map1-array" count="96" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_extrudeShape-textangents">
+ <float_array id="qt_gauge_tickmarks_8_extrudeShape-textangents-array" count="576">0.9438838 0 -0.3302777 0.943884 0 -0.3302771 0.9438842 0 -0.3302765 0.943884 0 -0.3302771 0.5320323 0 -0.846724 0.5320328 0 -0.8467235 0.5320334 0 -0.8467233 0.5320328 0 -0.8467235 -0.1119645 0 -0.9937122 -0.1119645 0 -0.9937122 -0.1119645 0 -0.9937122 -0.1119645 0 -0.9937122 -0.7071075 0 -0.7071059 -0.7071079 0 -0.7071055 -0.7071083 0 -0.7071052 -0.7071079 0 -0.7071055 -0.7071075 0 0.7071059 -0.7071079 0 0.7071055 -0.7071083 0 0.7071052 -0.7071079 0 0.7071055 -0.1119645 0 0.9937122 -0.1119645 0 0.9937122 -0.1119645 0 0.9937122 -0.1119645 0 0.9937122 0.5320323 0 0.846724 0.5320328 0 0.8467235 0.5320334 0 0.8467233 0.5320328 0 0.8467235 0.9438838 0 0.3302777 0.943884 0 0.3302771 0.9438842 0 0.3302765 0.943884 0 0.3302771 0.9438835 0 -0.3302783 0.9438838 0 -0.3302775 0.9438841 0 -0.3302767 0.9438838 0 -0.3302775 0.5320321 0 -0.8467241 0.5320323 0 -0.846724 0.5320325 0 -0.8467239 0.5320323 0 -0.846724 -0.1119642 0 -0.9937122 -0.1119647 0 -0.9937121 -0.1119651 0 -0.9937121 -0.1119647 0 -0.9937121 -0.7071072 0 -0.7071062 -0.7071074 0 -0.707106 -0.7071077 0 -0.7071058 -0.7071074 0 -0.707106 -0.7071072 0 0.7071062 -0.7071074 0 0.707106 -0.7071077 0 0.7071058 -0.7071074 0 0.707106 -0.1119642 0 0.9937122 -0.1119647 0 0.9937121 -0.1119651 0 0.9937121 -0.1119647 0 0.9937121 0.5320321 0 0.8467241 0.5320323 0 0.846724 0.5320325 0 0.8467239 0.5320323 0 0.846724 0.9438835 0 0.3302783 0.9438838 0 0.3302775 0.9438841 0 0.3302767 0.9438838 0 0.3302775 0.9438835 0 -0.3302787 -0.6031826 0.7957534 -0.05428781 -0.9438834 0 0.3302785 0.3670095 -0.9133859 0.1761538 -0.3302791 0 -0.9438832 0.06639277 0.6206912 0.781239 0.3302791 0 0.9438832 0.06008235 -0.8027461 -0.5932865 -0.943884 0 0.3302772 0.6031821 0.7957537 0.05428831 0.943884 0 -0.3302771 -0.3670089 -0.9133862 -0.1761537 0.3302789 0 0.9438834 -0.06639343 0.6206909 -0.7812393 -0.3302789 0 -0.9438834 -0.06008175 -0.8027463 0.5932863 0.5320322 0 -0.846724 -0.5054356 0.7957533 0.3336338 -0.5320322 0 0.846724 0.3967703 -0.9133857 -0.0911037 -0.846724 0 -0.532032 0.5390031 0.6206906 0.5694023 0.846724 0 0.5320321 -0.3229336 -0.8027461 -0.5013109 -0.5320331 0 0.8467235 0.5054366 0.7957527 -0.3336337 0.5320331 0 -0.8467234 -0.3967712 -0.9133854 0.09110337 0.8467241 0 0.5320321 -0.5390031 0.6206906 -0.5694022 -0.8467241 0 -0.5320321 0.3229339 -0.802746 0.5013109 -0.1119643 0 -0.9937122 -0.1871463 0.7957538 0.5759792 0.1119643 0 0.9937122 0.2534032 -0.9133864 -0.3186096 -0.9937122 0 0.1119646 0.7764263 0.6206902 0.1091134 0.9937121 0 -0.1119646 -0.5650418 -0.8027461 -0.1905946 0.1119649 0 0.9937121 0.1871476 0.7957533 -0.5759795 -0.1119648 0 -0.9937121 -0.253405 -0.9133858 0.3186099 0.9937121 0 -0.1119646 -0.7764259 0.6206908 -0.1091137 -0.9937121 0 0.1119646 0.5650418 -0.8027461 0.1905947 -0.7071074 0 -0.7071061 0.2128001 0.7957538 0.5670026 0.7071075 0 0.707106 -5.30626e-4 -0.9133863 -0.4070936 -0.7071068 0 0.7071066 0.6750659 0.6206904 -0.3987847 0.7071068 0 -0.7071066 -0.5606019 -0.8027459 0.2032844 0.7071075 0 0.7071059 -0.2128001 0.7957536 -0.5670029 -0.7071075 0 -0.7071059 5.3068e-4 -0.9133861 0.4070941 0.7071067 0 -0.7071068 -0.6750656 0.6206907 0.3987852 -0.7071067 0 0.7071068 0.5606014 -0.8027461 -0.203285 -0.7071074 0 0.7071061 0.5670032 0.7957537 -0.2127993 0.7071074 0 -0.7071061 -0.4070939 -0.9133862 5.3018e-4 0.7071067 0 0.7071068 -0.3987853 0.6206908 -0.6750656 -0.7071067 0 -0.7071068 0.203285 -0.8027462 0.5606014 0.7071075 0 -0.7071059 -0.5670037 0.7957532 0.2127988 -0.7071077 0 0.7071058 0.4070946 -0.9133859 -5.29715e-4 -0.7071068 0 -0.7071066 0.3987849 0.6206905 0.6750659 0.7071068 0 0.7071066 -0.2032845 -0.8027459 -0.5606019 -0.1119643 0 0.9937122 0.3106224 0.7957535 -0.5198942 0.1119643 0 -0.9937122 -0.3179483 -0.913386 0.2542339 0.9937121 0 0.1119646 -0.7326794 0.6206906 -0.2791491 -0.9937121 0 -0.1119646 0.5084638 -0.802746 0.3115498 0.1119649 0 -0.9937121 -0.3106234 0.7957532 0.5198941 -0.1119649 0 0.9937121 0.3179493 -0.9133858 -0.2542336 -0.9937122 0 -0.1119646 0.7326794 0.6206906 0.2791491 0.9937121 0 0.1119646 -0.5084633 -0.8027464 -0.3115497 0.5320322 0 0.846724 -0.0812935 0.7957533 -0.60014 -0.5320322 0 -0.846724 -0.09007066 -0.9133857 0.3970062 0.8467241 0 -0.5320321 -0.7468781 0.6206908 0.2385707 -0.846724 0 0.5320321 0.5917809 -0.8027462 -0.07344275 -0.532033 0 -0.8467236 0.08129415 0.7957534 0.6001398 0.5320331 0 0.8467234 0.09007035 -0.9133858 -0.3970059 -0.846724 0 0.5320323 0.7468783 0.6206906 -0.2385707 0.846724 0 -0.5320322 -0.5917809 -0.8027462 0.07344253 0.9438835 0 0.3302787 -0.4377395 0.7957534 -0.4185218 -0.9438834 0 -0.3302785 0.1771097 -0.913386 0.3665491 0.330279 0 -0.9438834 -0.4351861 0.6206909 0.6521931 -0.3302789 0 0.9438833 0.4168817 -0.8027462 -0.4263895 -0.9438838 0 -0.3302771 0.4377401 0.7957538 0.4185205 0.943884 0 0.3302771 -0.1771104 -0.9133863 -0.3665481 -0.3302791 0 0.9438834 0.4351864 0.6206908 -0.652193 0.3302791 0 -0.9438833 -0.4168822 -0.8027458 0.42639</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_extrudeShape-textangents-array" count="192" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_extrudeShape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_8_extrudeShape-texbinormals-array" count="576">-0.3302777 0 -0.9438838 -0.3302771 0 -0.9438841 -0.3302766 0 -0.9438843 -0.3302771 0 -0.9438841 -0.8467241 0 -0.5320324 -0.8467237 0 -0.532033 -0.8467234 0 -0.5320335 -0.8467237 0 -0.532033 -0.9937123 0 0.1119645 -0.9937122 0 0.1119645 -0.9937123 0 0.1119645 -0.9937122 0 0.1119645 -0.707106 0 0.7071076 -0.7071056 0 0.707108 -0.7071053 0 0.7071084 -0.7071056 0 0.707108 0.707106 0 0.7071076 0.7071056 0 0.707108 0.7071053 0 0.7071084 0.7071056 0 0.707108 0.9937123 0 0.1119645 0.9937123 0 0.1119645 0.9937123 0 0.1119645 0.9937123 0 0.1119645 0.8467241 0 -0.5320324 0.8467237 0 -0.532033 0.8467233 0 -0.5320335 0.8467237 0 -0.532033 0.3302777 0 -0.9438839 0.3302771 0 -0.943884 0.3302766 0 -0.9438843 0.3302772 0 -0.9438841 -0.3302783 0 -0.9438837 -0.3302775 0 -0.943884 -0.3302767 0 -0.9438841 -0.3302775 0 -0.9438839 -0.8467242 0 -0.5320321 -0.846724 0 -0.5320323 -0.8467239 0 -0.5320325 -0.846724 0 -0.5320323 -0.9937122 0 0.1119642 -0.9937122 0 0.1119647 -0.9937122 0 0.1119652 -0.9937122 0 0.1119647 -0.7071064 0 0.7071073 -0.7071061 0 0.7071075 -0.7071059 0 0.7071078 -0.7071061 0 0.7071075 0.7071064 0 0.7071073 0.7071061 0 0.7071075 0.7071058 0 0.7071077 0.7071061 0 0.7071075 0.9937123 0 0.1119642 0.9937122 0 0.1119647 0.9937122 0 0.1119652 0.9937122 0 0.1119647 0.8467242 0 -0.5320321 0.8467241 0 -0.5320324 0.8467239 0 -0.5320325 0.846724 0 -0.5320323 0.3302783 0 -0.9438836 0.3302775 0 -0.943884 0.3302768 0 -0.9438843 0.3302775 0 -0.943884 -0.09915803 0.9538682 -0.2833781 -0.7327476 -0.5259668 0.431787 0.09915784 -0.9538683 0.2833782 0.8752442 0.2749376 -0.3979409 -0.2833782 0.9538682 0.09915837 0.4300924 -0.7242975 0.5389005 0.2833782 -0.9538682 -0.09915838 -0.4310193 0.5152312 -0.7407829 0.09915733 0.9538684 0.2833776 0.7327485 -0.5259666 -0.4317854 -0.09915727 -0.9538685 -0.2833776 -0.875245 0.2749376 0.3979394 0.2833774 0.9538684 -0.09915801 -0.4300916 -0.7242982 -0.5389001 -0.2833774 -0.9538684 0.09915804 0.4310186 0.5152314 0.740783 -0.2542091 0.953868 -0.1597302 -0.30367 -0.5259665 0.7944457 0.254209 -0.9538679 0.1597302 0.436181 0.2749375 -0.8568288 -0.1597298 0.9538682 0.2542085 0.6722582 -0.7242981 0.1531706 0.1597299 -0.9538682 -0.2542085 -0.798855 0.5152312 -0.3104315 0.2542095 0.9538678 0.1597306 0.30367 -0.525967 -0.7944453 -0.2542093 -0.9538678 -0.1597309 -0.4361816 0.2749379 0.8568284 0.1597297 0.9538682 -0.2542084 -0.6722582 -0.7242981 -0.1531707 -0.1597297 -0.9538682 0.2542084 0.7988549 0.5152314 0.3104313 -0.2983366 0.9538686 0.03361438 0.2579089 -0.5259669 0.8104579 0.2983367 -0.9538687 -0.03361447 -0.1932033 0.2749375 -0.9418502 0.03361467 0.9538682 0.2983382 0.6210926 -0.7242984 -0.2993927 -0.03361468 -0.9538682 -0.2983382 -0.8181208 0.5152311 0.2553731 0.2983386 0.953868 -0.03361489 -0.2579104 -0.5259666 -0.8104575 -0.2983386 -0.9538681 0.03361469 0.1932044 0.2749373 0.9418501 -0.03361469 0.9538681 -0.2983383 -0.6210932 -0.7242978 0.2993927 0.03361469 -0.9538682 0.2983383 0.8181208 0.515231 -0.2553732 -0.2122912 0.9538684 0.2122915 0.7069545 -0.5259664 0.472837 0.2122911 -0.9538684 -0.2122916 -0.7382873 0.2749369 -0.615907 0.2122923 0.953868 0.2122924 0.2989215 -0.7242978 -0.6213201 -0.2122923 -0.9538679 -0.2122924 -0.4804099 0.515231 0.7097489 0.2122913 0.9538683 -0.2122919 -0.7069546 -0.5259665 -0.4728366 -0.2122911 -0.9538683 0.2122921 0.7382876 0.2749371 0.6159067 -0.2122918 0.9538682 -0.2122918 -0.2989219 -0.724298 0.6213198 0.2122918 -0.9538682 0.2122918 0.4804101 0.5152312 -0.7097486 0.2122912 0.9538684 0.2122914 0.4728381 -0.5259666 -0.7069535 -0.2122911 -0.9538684 -0.2122916 -0.6159084 0.2749373 0.7382861 0.2122916 0.9538682 -0.2122916 -0.6213196 -0.7242981 -0.2989221 -0.2122917 -0.9538683 0.2122917 0.7097485 0.5152312 0.4804102 -0.2122916 0.9538682 -0.2122922 -0.4728378 -0.5259667 0.7069536 0.2122914 -0.9538681 0.2122924 0.6159082 0.2749375 -0.7382862 -0.2122924 0.953868 0.2122924 0.6213202 -0.7242978 0.2989214 0.2122923 -0.9538679 -0.2122924 -0.709749 0.515231 -0.4804097 0.2983378 0.9538683 0.03361452 -0.07109972 -0.5259666 -0.8475282 -0.2983378 -0.9538683 -0.0336146 -0.02122137 0.2749374 0.9612279 0.03361467 0.9538682 -0.2983381 -0.672142 -0.724298 0.1536799 -0.03361467 -0.9538682 0.2983381 0.8544345 0.5152312 -0.06692119 -0.2983387 0.953868 -0.0336149 0.07109971 -0.5259666 0.8475281 0.2983386 -0.953868 0.0336147 0.0212217 0.2749373 -0.961228 -0.03361466 0.9538682 0.2983381 0.672142 -0.7242981 -0.1536798 0.03361466 -0.9538682 -0.2983381 -0.8544349 0.5152307 0.06692091 0.2542093 0.9538679 -0.1597303 -0.5840138 -0.5259663 -0.618294 -0.2542092 -0.9538679 0.1597303 0.5827245 0.2749374 0.7647493 -0.1597297 0.9538682 -0.2542084 -0.4296841 -0.7242979 0.5392255 0.1597297 -0.9538683 0.2542084 0.6262992 0.5152311 -0.5850524 -0.254209 0.9538679 0.1597303 0.5840142 -0.5259663 0.6182935 0.2542088 -0.953868 -0.1597306 -0.5827253 0.2749371 -0.7647489 0.1597299 0.9538682 0.2542085 0.4296839 -0.724298 -0.5392256 -0.1597299 -0.9538681 -0.2542086 -0.6262992 0.5152309 0.5850526 0.09915801 0.9538682 -0.2833781 -0.8421 -0.5259667 -0.1192754 -0.09915785 -0.9538683 0.2833782 0.9324058 0.2749375 0.2345824 -0.2833775 0.9538684 -0.09915807 2.60666e-4 -0.7242981 0.689487 0.2833776 -0.9538684 0.09915809 0.1248865 0.5152314 -0.8479034 -0.0991573 0.9538685 0.2833775 0.8421002 -0.5259666 0.1192746 0.09915722 -0.9538685 -0.2833775 -0.9324061 0.2749375 -0.2345812 0.2833778 0.9538683 0.09915821 -2.60755e-4 -0.724298 -0.689487 -0.2833778 -0.9538683 -0.09915823 -0.1248862 0.5152318 0.8479031</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_extrudeShape-texbinormals-array" count="192" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_8_extrudeShape-vertices" name="qt_gauge_tickmarks_8_extrudeShape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_8_extrudeShape-positions"/>
+ </vertices>
+ <triangles material="lambert3SG" count="96">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_8_extrudeShape-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_8_extrudeShape-normals" offset="1"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_8_extrudeShape-tangents" offset="1"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_8_extrudeShape-binormals" offset="1"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_8_extrudeShape-map1" offset="2" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_8_extrudeShape-textangents" offset="3" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_8_extrudeShape-texbinormals" offset="3" set="0"/>
+ <p>32 0 64 0 33 1 65 1 35 3 67 3 35 3 67 3 33 1 65 1 34 2 66 2 36 4 68 4 37 5 69 5 39 7 71 7 39 7 71 7 37 5 69 5 38 6 70 6 40 8 72 8 41 9 73 9 43 11 75 11 43 11 75 11 41 9 73 9 42 10 74 10 44 12 76 12 45 13 77 13 47 15 79 15 47 15 79 15 45 13 77 13 46 14 78 14 48 16 80 16 49 17 81 17 51 19 83 19 51 19 83 19 49 17 81 17 50 18 82 18 52 20 84 20 53 21 85 21 55 23 87 23 55 23 87 23 53 21 85 21 54 22 86 22 56 24 88 24 57 25 89 25 59 27 91 27 59 27 91 27 57 25 89 25 58 26 90 26 60 28 92 28 61 29 93 29 63 31 95 31 63 31 95 31 61 29 93 29 62 30 94 30 0 32 32 32 2 33 35 33 1 35 33 35 1 35 33 35 2 33 35 33 3 34 34 34 4 36 36 36 6 37 39 37 5 39 37 39 5 39 37 39 6 37 39 37 7 38 38 38 8 40 40 40 10 41 43 41 9 43 41 43 9 43 41 43 10 41 43 41 11 42 42 42 12 44 44 44 14 45 47 45 13 47 45 47 13 47 45 47 14 45 47 45 15 46 46 46 16 48 48 48 18 49 51 49 17 51 49 51 17 51 49 51 18 49 51 49 19 50 50 50 20 52 52 52 22 53 55 53 21 55 53 55 21 55 53 55 22 53 55 53 23 54 54 54 24 56 56 56 26 57 59 57 25 59 57 59 25 59 57 59 26 57 59 57 27 58 58 58 28 60 60 60 30 61 63 61 29 63 61 63 29 63 61 63 30 61 63 61 31 62 62 62 0 64 0 64 1 65 1 65 32 67 64 67 32 67 64 67 1 65 1 65 33 66 65 66 1 68 1 68 3 69 3 69 33 71 65 71 33 71 65 71 3 69 3 69 34 70 66 70 3 72 3 72 2 73 2 73 34 75 66 75 34 75 66 75 2 73 2 73 35 74 67 74 2 76 2 76 0 77 0 77 35 79 67 79 35 79 67 79 0 77 0 77 32 78 64 78 4 80 4 80 5 81 5 81 36 83 68 83 36 83 68 83 5 81 5 81 37 82 69 82 5 84 5 84 7 85 6 85 37 87 69 87 37 87 69 87 7 85 6 85 38 86 70 86 7 88 6 88 6 89 7 89 38 91 70 91 38 91 70 91 6 89 7 89 39 90 71 90 6 92 7 92 4 93 4 93 39 95 71 95 39 95 71 95 4 93 4 93 36 94 68 94 8 96 8 96 9 97 9 97 40 99 72 99 40 99 72 99 9 97 9 97 41 98 73 98 9 100 9 100 11 101 10 101 41 103 73 103 41 103 73 103 11 101 10 101 42 102 74 102 11 104 10 104 10 105 11 105 42 107 74 107 42 107 74 107 10 105 11 105 43 106 75 106 10 108 11 108 8 109 8 109 43 111 75 111 43 111 75 111 8 109 8 109 40 110 72 110 12 112 12 112 13 113 13 113 44 115 76 115 44 115 76 115 13 113 13 113 45 114 77 114 13 116 13 116 15 117 14 117 45 119 77 119 45 119 77 119 15 117 14 117 46 118 78 118 15 120 14 120 14 121 15 121 46 123 78 123 46 123 78 123 14 121 15 121 47 122 79 122 14 124 15 124 12 125 12 125 47 127 79 127 47 127 79 127 12 125 12 125 44 126 76 126 16 128 16 128 17 129 17 129 48 131 80 131 48 131 80 131 17 129 17 129 49 130 81 130 17 132 17 132 19 133 18 133 49 135 81 135 49 135 81 135 19 133 18 133 50 134 82 134 19 136 18 136 18 137 19 137 50 139 82 139 50 139 82 139 18 137 19 137 51 138 83 138 18 140 19 140 16 141 16 141 51 143 83 143 51 143 83 143 16 141 16 141 48 142 80 142 20 144 20 144 21 145 21 145 52 147 84 147 52 147 84 147 21 145 21 145 53 146 85 146 21 148 21 148 23 149 22 149 53 151 85 151 53 151 85 151 23 149 22 149 54 150 86 150 23 152 22 152 22 153 23 153 54 155 86 155 54 155 86 155 22 153 23 153 55 154 87 154 22 156 23 156 20 157 20 157 55 159 87 159 55 159 87 159 20 157 20 157 52 158 84 158 24 160 24 160 25 161 25 161 56 163 88 163 56 163 88 163 25 161 25 161 57 162 89 162 25 164 25 164 27 165 26 165 57 167 89 167 57 167 89 167 27 165 26 165 58 166 90 166 27 168 26 168 26 169 27 169 58 171 90 171 58 171 90 171 26 169 27 169 59 170 91 170 26 172 27 172 24 173 24 173 59 175 91 175 59 175 91 175 24 173 24 173 56 174 88 174 28 176 28 176 29 177 29 177 60 179 92 179 60 179 92 179 29 177 29 177 61 178 93 178 29 180 29 180 31 181 30 181 61 183 93 183 61 183 93 183 31 181 30 181 62 182 94 182 31 184 30 184 30 185 31 185 62 187 94 187 62 187 94 187 30 185 31 185 63 186 95 186 30 188 31 188 28 189 28 189 63 191 95 191 63 191 95 191 28 189 28 189 60 190 92 190</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_8_extrudeShape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_8_extrude" name="qt_gauge_tickmarks_8_extrude" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_8_extrudeShape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_8_extrude</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_small.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_small.dae
new file mode 100644
index 0000000..d43d7bb
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_8_small.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T09:30:15</created>
+ <modified>2018-03-08T09:30:15</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmarks_8_smallShape" name="qt_gauge_tickmarks_8_smallShape">
+ <mesh>
+ <source id="qt_gauge_tickmarks_8_smallShape-positions" name="qt_gauge_tickmarks_8_smallShape-positions">
+ <float_array id="qt_gauge_tickmarks_8_smallShape-positions-array" count="96">-2.556742 0 -6.940895 -2.328636 0 -7.020713 -2.955829 0 -8.081421 -2.727724 0 -8.161238 -6.326518 0 -3.832508 -6.197944 0 -4.037133 -7.349644 0 -4.47538 -7.221069 0 -4.680005 -7.335801 0 0.9481444 -7.362859 0 0.7079973 -8.536537 0 1.083435 -8.563595 0 0.8432878 -5.144202 0 5.315086 -5.315086 0 5.144202 -5.998623 0 6.169507 -6.169507 0 5.998623 5.315086 0 5.144202 5.144202 0 5.315086 6.169507 0 5.998623 5.998623 0 6.169507 7.362859 0 0.7079973 7.335801 0 0.9481444 8.563595 0 0.8432878 8.536537 0 1.083435 6.197944 0 -4.037133 6.326518 0 -3.832508 7.221068 0 -4.680005 7.349643 0 -4.47538 2.328636 0 -7.020713 2.556742 0 -6.940895 2.727724 0 -8.161238 2.955829 0 -8.081421</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_smallShape-positions-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_smallShape-normals" name="qt_gauge_tickmarks_8_smallShape-normals">
+ <float_array id="qt_gauge_tickmarks_8_smallShape-normals-array" count="96">0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_smallShape-normals-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_smallShape-tangents" name="qt_gauge_tickmarks_8_smallShape-tangents">
+ <float_array id="qt_gauge_tickmarks_8_smallShape-tangents-array" count="96">0.9438834 0 -0.3302788 -0.3302798 0 -0.9438831 0.3302769 0 0.9438841 -0.9438832 0 0.3302794 0.5320317 0 -0.8467244 -0.8467244 0 -0.5320317 0.8467235 0 0.5320331 -0.5320319 0 0.8467243 -0.1119646 0 -0.9937122 -0.9937122 0 0.1119646 0.9937124 0 -0.1119626 0.1119646 0 0.9937122 -0.7071068 0 -0.7071068 -0.7071058 0 0.7071078 0.7071058 0 -0.7071078 0.7071068 0 0.7071068 -0.7071068 0 0.7071068 0.7071058 0 0.7071078 -0.7071058 0 -0.7071078 0.7071068 0 -0.7071068 -0.1119646 0 0.9937122 0.9937122 0 0.1119646 -0.9937124 0 -0.1119626 0.1119646 0 -0.9937122 0.5320324 0 0.846724 0.8467241 0 -0.5320322 -0.8467235 0 0.5320331 -0.532032 0 -0.8467242 0.9438832 0 0.3302794 0.3302798 0 -0.9438831 -0.3302769 0 0.9438841 -0.9438834 0 -0.3302788</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_smallShape-tangents-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_smallShape-binormals" name="qt_gauge_tickmarks_8_smallShape-binormals">
+ <float_array id="qt_gauge_tickmarks_8_smallShape-binormals-array" count="96">-0.3302788 0 -0.9438834 -0.9438831 0 0.3302798 0.9438842 0 -0.3302769 0.3302795 0 0.9438833 -0.8467245 0 -0.5320317 -0.5320317 0 0.8467245 0.5320331 0 -0.8467236 0.8467243 0 0.5320319 -0.9937122 0 0.1119646 0.1119646 0 0.9937122 -0.1119626 0 -0.9937124 0.9937122 0 -0.1119646 -0.7071068 0 0.7071068 0.7071078 0 0.7071058 -0.7071078 0 -0.7071058 0.7071068 0 -0.7071068 0.7071068 0 0.7071068 0.7071078 0 -0.7071058 -0.7071078 0 0.7071058 -0.7071068 0 -0.7071068 0.9937122 0 0.1119646 0.1119646 0 -0.9937122 -0.1119626 0 0.9937124 -0.9937123 0 -0.1119646 0.8467241 0 -0.5320324 -0.5320322 0 -0.8467242 0.5320331 0 0.8467236 -0.8467242 0 0.532032 0.3302794 0 -0.9438832 -0.9438832 0 -0.3302798 0.9438842 0 0.3302769 -0.3302788 0 0.9438834</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_smallShape-binormals-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_smallShape-map1" name="qt_gauge_tickmarks_8_smallShape-map1">
+ <float_array id="qt_gauge_tickmarks_8_smallShape-map1-array" count="64">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_smallShape-map1-array" count="32" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_smallShape-textangents">
+ <float_array id="qt_gauge_tickmarks_8_smallShape-textangents-array" count="96">0.9438831 0 -0.3302798 0.9438835 0 -0.3302783 0.9438841 0 -0.3302768 0.9438835 0 -0.3302783 0.5320317 0 -0.8467244 0.5320323 0 -0.8467239 0.5320331 0 -0.8467235 0.5320323 0 -0.8467239 -0.1119646 0 -0.9937122 -0.1119636 0 -0.9937122 -0.1119626 0 -0.9937124 -0.1119636 0 -0.9937122 -0.7071077 0 -0.7071058 -0.7071077 0 -0.7071058 -0.7071077 0 -0.7071058 -0.7071077 0 -0.7071058 -0.7071077 0 0.7071058 -0.7071077 0 0.7071058 -0.7071077 0 0.7071058 -0.7071077 0 0.7071058 -0.1119646 0 0.9937122 -0.1119636 0 0.9937122 -0.1119626 0 0.9937124 -0.1119636 0 0.9937122 0.5320321 0 0.8467241 0.5320326 0 0.8467238 0.5320331 0 0.8467235 0.5320326 0 0.8467238 0.9438831 0 0.3302798 0.9438835 0 0.3302783 0.9438841 0 0.3302768 0.9438835 0 0.3302783</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_smallShape-textangents-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmarks_8_smallShape-texbinormals">
+ <float_array id="qt_gauge_tickmarks_8_smallShape-texbinormals-array" count="96">-0.3302798 0 -0.9438832 -0.3302783 0 -0.9438837 -0.3302769 0 -0.9438842 -0.3302783 0 -0.9438837 -0.8467245 0 -0.5320317 -0.846724 0 -0.5320324 -0.8467236 0 -0.5320331 -0.846724 0 -0.5320324 -0.9937122 0 0.1119646 -0.9937123 0 0.1119636 -0.9937124 0 0.1119626 -0.9937124 0 0.1119636 -0.7071058 0 0.7071078 -0.7071058 0 0.7071078 -0.7071058 0 0.7071078 -0.7071058 0 0.7071078 0.7071058 0 0.7071078 0.7071058 0 0.7071078 0.7071058 0 0.7071078 0.7071058 0 0.7071078 0.9937122 0 0.1119646 0.9937124 0 0.1119636 0.9937125 0 0.1119627 0.9937124 0 0.1119636 0.8467242 0 -0.5320321 0.8467239 0 -0.5320327 0.8467236 0 -0.5320331 0.8467239 0 -0.5320327 0.3302798 0 -0.9438831 0.3302783 0 -0.9438837 0.3302769 0 -0.9438842 0.3302783 0 -0.9438837</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmarks_8_smallShape-texbinormals-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmarks_8_smallShape-vertices" name="qt_gauge_tickmarks_8_smallShape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmarks_8_smallShape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmarks_8_smallShape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmarks_8_smallShape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmarks_8_smallShape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="16">
+ <input semantic="VERTEX" source="#qt_gauge_tickmarks_8_smallShape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmarks_8_smallShape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmarks_8_smallShape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmarks_8_smallShape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmarks_8_smallShape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmarks_8_small" name="qt_gauge_tickmarks_8_small" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmarks_8_smallShape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmarks_8_small</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_90_degrees.dae b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_90_degrees.dae
new file mode 100644
index 0000000..f6cb982
--- /dev/null
+++ b/Studio/Content/Models Library/Automotive/Cluster/Tickmarks/tickmarks_90_degrees.dae
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <asset>
+ <contributor>
+ <author>tetammin</author>
+ <authoring_tool>OpenCOLLADA2017; Version: 1.6; Revision: 61</authoring_tool>
+ <comments>
+ ColladaMaya export options:
+ bakeTransforms=1;relativePaths=1;preserveSourceTree=0;copyTextures=0;exportTriangles=1;exportCgfxFileReferences=1;
+ isSampling=0;curveConstrainSampling=0;removeStaticCurves=1;exportPhysics=0;exportConvexMeshGeometries=1;exportPolygonMeshes=1;exportLights=1;
+ exportCameras=1;exportAnimationsOnly=0;exportSeparateFile=0;modelNameDAE=;exportJoints=1;exportSkin=1;exportAnimations=1;exportOptimizedBezierAnimation=0;exportInvisibleNodes=0;exportDefaultCameras=0;
+ exportTexCoords=1;exportNormals=1;exportNormalsPerVertex=1;exportVertexColors=1;exportVertexColorsPerVertex=1;
+ exportTexTangents=1;exportTangents=1;exportReferencedMaterials=0;exportMaterialsOnly=0;
+ exportXRefs=1;dereferenceXRefs=1;exportCameraAsLookat=0;cameraXFov=0;cameraYFov=1;encodedNames=1;doublePrecision=0
+ </comments>
+ <source_data>file:///C:/Users/tetammin/Dropbox%20(Qt)/Qt%203D%20Team/3D%20Models/Automotive/ClusterTemplateMaya/qt_cluster_template.mb</source_data>
+ </contributor>
+ <created>2018-03-08T10:02:29</created>
+ <modified>2018-03-08T10:02:29</modified>
+ <unit name="centimeter" meter="0.01"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Default_white" name="Default_white">
+ <instance_effect url="#Default_white-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Default_white-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>0.8 0.8 0.8 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">Default_white</originalMayaNodeId>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="qt_gauge_tickmars_90_degreesShape" name="qt_gauge_tickmars_90_degreesShape">
+ <mesh>
+ <source id="qt_gauge_tickmars_90_degreesShape-positions" name="qt_gauge_tickmars_90_degreesShape-positions">
+ <float_array id="qt_gauge_tickmars_90_degreesShape-positions-array" count="144">3.293105 0 -8.815125 3.47788 0 -8.738586 3.675788 0 -9.739004 3.860564 0 -9.662466 4.94477 0 -7.954519 5.111064 0 -7.843405 5.50034 0 -8.785989 5.666634 0 -8.674873 1.50528 0 -9.336969 1.701437 0 -9.297951 1.70037 0 -10.31775 1.896527 0 -10.27874 9.25 0 -0.0999999 9.25 0 0.1000004 10.25 0 -0.09999943 10.25 0 0.1000004 8.25 0 -0.0999999 8.25 0 0.0999999 9.25 0 -0.0999999 9.25 0 0.1000004 5.689697 0 -6.081118 5.831119 0 -5.939696 6.396803 0 -6.788224 6.538225 0 -6.646803 -0.35 0 -8.5 -0.15 0 -8.5 -0.35 0 -9.5 -0.15 0 -9.5 -0.35 0 -9.5 -0.15 0 -9.5 -0.35 0 -10.5 -0.15 0 -10.5 6.396803 0 -6.788224 6.538225 0 -6.646803 7.10391 0 -7.495331 7.245332 0 -7.35391 7.593405 0 -5.361065 7.704518 0 -5.19477 8.424873 0 -5.916635 8.535988 0 -5.750341 9.047951 0 -1.951436 9.086969 0 -1.755279 10.02874 0 -2.146526 10.06775 0 -1.950369 8.488587 0 -3.72788 8.565125 0 -3.543104 9.412466 0 -4.110563 9.489004 0 -3.925788</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmars_90_degreesShape-positions-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmars_90_degreesShape-normals" name="qt_gauge_tickmars_90_degreesShape-normals">
+ <float_array id="qt_gauge_tickmars_90_degreesShape-normals-array" count="144">0 0.9999999 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 1 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0 0 1 0 0 1 0 0 1 0 0 0.9999999 0 0 0.9999999 0</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmars_90_degreesShape-normals-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmars_90_degreesShape-tangents" name="qt_gauge_tickmars_90_degreesShape-tangents">
+ <float_array id="qt_gauge_tickmars_90_degreesShape-tangents-array" count="144">0.9238795 0 0.3826835 0.3826895 0 -0.923877 -0.3826891 0 0.9238772 -0.9238794 0 -0.3826837 0.8314698 0 0.55557 0.5555709 0 -0.8314692 -0.5555758 0 0.8314659 -0.8314693 0 -0.5555706 0.9807853 0 0.1950903 0.195093 0 -0.9807847 -0.1950884 0 0.9807857 -0.9807853 0 -0.1950902 0 0 1 1 0 0 -1 0 0 0 0 -1 0 0 1 1 0 0 -1 0 0 0 0 -1 0.7071068 0 0.7071068 0.707108 0 -0.7071056 -0.7071044 0 0.7071092 -0.707107 0 -0.7071065 1 0 0 0 0 -1 0 0 1 -1 0 0 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071068 0 0.7071068 0.7071044 0 -0.7071092 -0.7071056 0 0.707108 -0.707107 0 -0.7071065 0.5555706 0 0.8314693 0.8314725 0 -0.5555659 -0.8314688 0 0.5555714 -0.5555709 0 -0.8314692 0.1950899 0 0.9807854 0.9807847 0 -0.1950931 -0.9807857 0 0.1950881 -0.1950896 0 -0.9807854 0.3826832 0 0.9238796 0.9238789 0 -0.382685 -0.9238763 0 0.3826912 -0.3826839 0 -0.9238793</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmars_90_degreesShape-tangents-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmars_90_degreesShape-binormals" name="qt_gauge_tickmars_90_degreesShape-binormals">
+ <float_array id="qt_gauge_tickmars_90_degreesShape-binormals-array" count="144">0.3826835 0 -0.9238796 -0.923877 0 -0.3826895 0.9238772 0 0.3826891 -0.3826837 0 0.9238794 0.5555699 0 -0.8314698 -0.8314693 0 -0.5555709 0.8314659 0 0.5555758 -0.5555707 0 0.8314694 0.1950904 0 -0.9807853 -0.9807848 0 -0.195093 0.9807857 0 0.1950884 -0.1950902 0 0.9807854 1 0 0 0 0 -1 0 0 1 -1 0 0 1 0 0 0 0 -1 0 0 1 -1 0 0 0.7071068 0 -0.7071068 -0.7071056 0 -0.707108 0.7071092 0 0.7071044 -0.7071066 0 0.7071071 0 0 -1 -1 0 0 1 0 0 0 0 1 0 0 -1 -1 0 0 1 0 0 0 0 1 0.7071068 0 -0.7071068 -0.7071092 0 -0.7071044 0.707108 0 0.7071056 -0.7071066 0 0.7071071 0.8314694 0 -0.5555707 -0.5555659 0 -0.8314726 0.5555714 0 0.8314689 -0.8314693 0 0.5555709 0.9807854 0 -0.1950899 -0.1950931 0 -0.9807848 0.1950881 0 0.9807858 -0.9807854 0 0.1950896 0.9238797 0 -0.3826832 -0.3826851 0 -0.923879 0.3826913 0 0.9238763 -0.9238794 0 0.3826839</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmars_90_degreesShape-binormals-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmars_90_degreesShape-map1" name="qt_gauge_tickmars_90_degreesShape-map1">
+ <float_array id="qt_gauge_tickmars_90_degreesShape-map1-array" count="96">0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmars_90_degreesShape-map1-array" count="48" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmars_90_degreesShape-textangents">
+ <float_array id="qt_gauge_tickmars_90_degreesShape-textangents-array" count="144">0.9238769 0 0.3826895 0.9238771 0 0.3826893 0.9238771 0 0.3826891 0.9238771 0 0.3826893 0.8314692 0 0.5555708 0.8314674 0 0.5555733 0.8314658 0 0.5555757 0.8314674 0 0.5555733 0.9807846 0 0.195093 0.9807851 0 0.1950907 0.9807856 0 0.1950884 0.9807851 0 0.1950907 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0.7071055 0 0.7071079 0.7071073 0 0.7071061 0.7071092 0 0.7071044 0.7071073 0 0.7071061 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.9999999 0 0 0.7071092 0 0.7071044 0.7071085 0 0.7071049 0.7071079 0 0.7071055 0.7071085 0 0.7071049 0.5555658 0 0.8314725 0.5555686 0 0.8314706 0.5555714 0 0.8314688 0.5555686 0 0.8314706 0.1950931 0 0.9807847 0.1950906 0 0.9807852 0.1950881 0 0.9807857 0.1950906 0 0.9807852 0.382685 0 0.9238788 0.3826881 0 0.9238775 0.3826912 0 0.9238762 0.3826881 0 0.9238775</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmars_90_degreesShape-textangents-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="qt_gauge_tickmars_90_degreesShape-texbinormals">
+ <float_array id="qt_gauge_tickmars_90_degreesShape-texbinormals-array" count="144">0.3826896 0 -0.9238771 0.3826894 0 -0.9238772 0.3826891 0 -0.9238772 0.3826893 0 -0.9238771 0.5555708 0 -0.8314692 0.5555733 0 -0.8314676 0.5555758 0 -0.831466 0.5555733 0 -0.8314676 0.195093 0 -0.9807848 0.1950907 0 -0.9807853 0.1950884 0 -0.9807857 0.1950907 0 -0.9807853 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0.707108 0 -0.7071056 0.7071062 0 -0.7071074 0.7071044 0 -0.7071092 0.7071062 0 -0.7071074 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0.7071044 0 -0.7071092 0.707105 0 -0.7071086 0.7071056 0 -0.707108 0.707105 0 -0.7071086 0.8314726 0 -0.5555659 0.8314707 0 -0.5555686 0.8314689 0 -0.5555714 0.8314707 0 -0.5555686 0.9807848 0 -0.1950931 0.9807853 0 -0.1950906 0.9807858 0 -0.1950881 0.9807853 0 -0.1950906 0.923879 0 -0.3826851 0.9238777 0 -0.3826882 0.9238764 0 -0.3826913 0.9238776 0 -0.3826881</float_array>
+ <technique_common>
+ <accessor source="#qt_gauge_tickmars_90_degreesShape-texbinormals-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="qt_gauge_tickmars_90_degreesShape-vertices" name="qt_gauge_tickmars_90_degreesShape-vertices">
+ <input semantic="POSITION" source="#qt_gauge_tickmars_90_degreesShape-positions"/>
+ <input semantic="NORMAL" source="#qt_gauge_tickmars_90_degreesShape-normals"/>
+ <input semantic="TANGENT" source="#qt_gauge_tickmars_90_degreesShape-tangents"/>
+ <input semantic="BINORMAL" source="#qt_gauge_tickmars_90_degreesShape-binormals"/>
+ </vertices>
+ <triangles material="lambert3SG" count="24">
+ <input semantic="VERTEX" source="#qt_gauge_tickmars_90_degreesShape-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#qt_gauge_tickmars_90_degreesShape-map1" offset="1" set="0"/>
+ <input semantic="TEXTANGENT" source="#qt_gauge_tickmars_90_degreesShape-textangents" offset="2" set="0"/>
+ <input semantic="TEXBINORMAL" source="#qt_gauge_tickmars_90_degreesShape-texbinormals" offset="2" set="0"/>
+ <p>0 0 0 1 1 1 2 2 3 2 2 3 1 1 1 3 3 2 4 4 4 5 5 5 6 7 7 6 7 7 5 5 5 7 6 6 8 8 8 9 9 9 10 11 11 10 11 11 9 9 9 11 10 10 12 12 12 13 13 13 14 15 15 14 15 15 13 13 13 15 14 14 16 16 16 17 17 17 18 19 19 18 19 19 17 17 17 19 18 18 20 20 20 21 21 21 22 23 23 22 23 23 21 21 21 23 22 22 24 24 24 25 25 25 26 27 27 26 27 27 25 25 25 27 26 26 28 28 28 29 29 29 30 31 31 30 31 31 29 29 29 31 30 30 32 32 32 33 33 33 34 35 35 34 35 35 33 33 33 35 34 34 36 36 36 37 37 37 38 39 39 38 39 39 37 37 37 39 38 38 40 40 40 41 41 41 42 43 43 42 43 43 41 41 41 43 42 42 44 44 44 45 45 45 46 47 47 46 47 47 45 45 45 47 46 46</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId">qt_gauge_tickmars_90_degreesShape</originalMayaNodeId>
+ <double_sided sid="double_sided">1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="qt_cluster_template">
+ <node id="_qt_gauge_tickmars_90_degrees" name="qt_gauge_tickmars_90_degrees" type="NODE">
+ <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
+ <instance_geometry url="#qt_gauge_tickmars_90_degreesShape">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert3SG" target="#Default_white"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ <extra>
+ <technique profile="OpenCOLLADAMaya">
+ <originalMayaNodeId sid="originalMayaNodeId" type="string">qt_gauge_tickmars_90_degrees</originalMayaNodeId>
+ </technique>
+ </extra>
+ </node>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+ <extra>
+ <technique profile="COLLADA">
+ <source_data_base_uri>file:///C:/Users/tetammin/Documents/maya/projects/default/</source_data_base_uri>
+ </technique>
+ </extra>
+</COLLADA> \ No newline at end of file
diff --git a/Studio/Content/Models Library/Electronics/Headphones.dae b/Studio/Content/Models Library/Electronics/Headphones.dae
new file mode 100644
index 0000000..3ced163
--- /dev/null
+++ b/Studio/Content/Models Library/Electronics/Headphones.dae
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/electronics/Headphones.mb</source_data>
+ </contributor>
+ <created>2008-09-23T20:27:03Z</created>
+ <modified>2008-09-23T20:27:03Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="headpiece" name="headpiece">
+ <instance_effect url="#headpiece-fx"/>
+ </material>
+ <material id="trim" name="trim">
+ <instance_effect url="#trim-fx"/>
+ </material>
+ <material id="plastic" name="plastic">
+ <instance_effect url="#plastic-fx"/>
+ </material>
+ <material id="phone" name="phone">
+ <instance_effect url="#phone-fx"/>
+ </material>
+ <material id="earpiece" name="earpiece">
+ <instance_effect url="#earpiece-fx"/>
+ </material>
+ <material id="foam" name="foam">
+ <instance_effect url="#foam-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="headpiece-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2 0.2 0.2 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ <effect id="trim-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2 0.2 0.2 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ <effect id="plastic-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2 0.2 0.2 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ <effect id="phone-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2 0.2 0.2 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ <effect id="earpiece-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2 0.2 0.2 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ <effect id="foam-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2 0.2 0.2 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Headphones" name="Headphones">
+ <mesh>
+ <source id="Headphones-positions" name="position">
+ <float_array id="Headphones-positions-array" count="9042">41.0358 1.45843 3.02491 40.0585 -2.85087 5.11285 38.3141 -7.28645 6.05386 41.5534 5.08738 2.82599 39.0034 -2.78983 5.10091 38.2918 -2.86791 6.1526 39.4206 1.68737 4.63022 39.9566 1.81482 2.8632 37.4312 -6.96178 6.05155 36.8421 -6.79753 6.94469 40.2991 5.17249 2.74187 39.869 5.17153 4.35142 38.4357 -7.13643 7.60584 38.2967 -7.30787 4.23102 41.1984 1.75076 5.28422 40.0585 -2.85087 6.7955 40.0314 -2.94048 3.10001 40.6607 -0.506353 1.58287 41.6167 5.08303 5.07011 39.7611 5.18243 5.06932 39.3573 1.91479 5.28277 38.263 -2.5664 6.7955 36.7986 -6.57934 7.61329 39.8702 -2.88533 3.09597 40.4948 -0.469227 1.58351 38.1597 -7.21039 4.23068 37.6345 -7.00927 4.23014 39.2813 -2.79117 3.08937 39.8899 -0.404788 1.58456 37.6 -7.09958 3.86024 39.2542 -2.93965 2.73803 39.8555 -0.668652 1.30965 34.203 -16.9786 6.05386 34.3115 -16.826 7.60584 34.1875 -17.0004 4.23102 34.157 -16.7402 7.60733 34.0392 -16.9031 4.23068 33.2202 -16.6826 6.04405 33.4613 -16.7958 3.86024 33.4875 -16.7041 4.23014 32.6384 -16.4488 6.9325 32.5986 -16.2744 7.61329 38.0936 -2.66652 3.11071 36.7245 -6.59999 4.28698 32.3727 -16.3058 4.28279 38.7043 -0.35177 1.60975 38.2934 -2.85245 2.64585 36.8985 -6.72878 3.77432 32.5825 -16.3935 3.77215 38.8525 -0.713107 1.26675 38.8879 -2.88716 3.80686 37.3352 -6.94885 4.97355 33.1258 -16.6582 4.98199 39.7792 0.252845 2.02742 38.9115 -2.86728 4.07111 37.3548 -6.95149 5.19368 33.1451 -16.6631 5.19887 39.8436 0.526463 2.23323 39.6174 1.48775 4.26116 38.7586 -2.85196 5.93784 37.2839 -6.83107 6.76231 33.0787 -16.4966 6.75107 40.054 3.48323 3.90016 40.3843 3.94176 2.61978 32.7251 -16.5042 7.48569 34.0063 -16.9151 7.48043 34.0958 -16.9515 7.4507 34.0033 -17.0719 6.09107 33.9996 -17.0571 4.52725 33.9055 -17.0108 4.42492 33.2978 -16.7624 4.32589 33.2709 -16.8565 3.96545 32.6508 -16.5276 3.97262 32.5219 -16.5153 4.26848 33.1961 -16.8624 4.83592 33.2593 -16.8544 5.21753 33.3389 -16.8684 6.09099 33.1764 -16.6501 6.90681 32.7486 -16.6073 7.08346 34.4232 -16.5636 7.60584 34.3846 -16.5504 6.05386 34.3791 -16.5485 4.23102 34.2568 -16.5064 7.60733 34.2141 -16.4917 4.23068 33.66 -16.301 4.23014 33.6709 -16.3047 3.86024 32.8276 -16.0145 6.93305 32.7263 -15.9797 7.61329 32.8919 -15.9902 3.77224 32.677 -15.9163 4.28296 33.3299 -16.1874 4.98158 33.3486 -16.1938 5.19862 33.4211 -16.2188 6.04441 33.2284 -16.1525 6.75147 41.0358 1.45843 -3.02491 40.0585 -2.85087 -5.11285 38.3141 -7.28645 -6.05386 41.5534 5.08738 -2.82599 39.0034 -2.78983 -5.10091 38.2918 -2.86791 -6.1526 39.4206 1.68737 -4.63022 39.9566 1.81482 -2.8632 37.4312 -6.96178 -6.05155 36.8421 -6.79753 -6.94469 40.2991 5.17249 -2.74187 39.869 5.17153 -4.35142 38.4357 -7.13643 -7.60584 38.2967 -7.30787 -4.23102 41.1984 1.75076 -5.28422 40.0585 -2.85087 -6.7955 40.0314 -2.94048 -3.10001 40.6607 -0.506353 -1.58287 41.6167 5.08303 -5.07011 39.7611 5.18243 -5.06932 39.3573 1.91479 -5.28277 38.263 -2.5664 -6.7955 36.7986 -6.57934 -7.61329 39.8702 -2.88533 -3.09597 40.4948 -0.469227 -1.58351 38.1597 -7.21039 -4.23068 37.6345 -7.00927 -4.23014 39.2813 -2.79117 -3.08937 39.8899 -0.404788 -1.58456 37.6 -7.09958 -3.86024 39.2542 -2.93965 -2.73803 39.8555 -0.668652 -1.30965 34.203 -16.9786 -6.05386 34.3115 -16.826 -7.60584 34.1875 -17.0004 -4.23102 34.157 -16.7402 -7.60733 34.0392 -16.9031 -4.23068 33.2202 -16.6826 -6.04405 33.4613 -16.7958 -3.86024 33.4875 -16.7041 -4.23014 32.6384 -16.4488 -6.9325 32.5986 -16.2744 -7.61329 38.0936 -2.66652 -3.11071 36.7245 -6.59999 -4.28698 32.3727 -16.3058 -4.28279 38.7043 -0.35177 -1.60975 38.2934 -2.85245 -2.64586 36.8985 -6.72878 -3.77432 32.5825 -16.3935 -3.77215 38.8525 -0.713107 -1.26675 38.8879 -2.88716 -3.80686 37.3352 -6.94885 -4.97355 33.1258 -16.6582 -4.98199 39.7792 0.252845 -2.02742 38.9115 -2.86728 -4.07111 37.3548 -6.95149 -5.19368 33.1451 -16.6631 -5.19887 39.8436 0.526463 -2.23323 39.6174 1.48775 -4.26116 38.7586 -2.85196 -5.93784 37.2839 -6.83107 -6.76231 33.0787 -16.4966 -6.75107 40.054 3.48323 -3.90016 40.3843 3.94176 -2.61978 32.7251 -16.5042 -7.48569 34.0063 -16.9151 -7.48043 34.0958 -16.9515 -7.4507 34.0033 -17.0719 -6.09107 33.9996 -17.0571 -4.52725 33.9055 -17.0108 -4.42492 33.2978 -16.7624 -4.32589 33.2709 -16.8565 -3.96545 32.6508 -16.5276 -3.97262 32.5219 -16.5153 -4.26848 33.1961 -16.8624 -4.83592 33.2593 -16.8544 -5.21753 33.3389 -16.8684 -6.09099 33.1764 -16.6501 -6.90681 32.7486 -16.6073 -7.08346 34.4232 -16.5636 -7.60584 34.3846 -16.5504 -6.05386 34.3791 -16.5485 -4.23102 34.2568 -16.5064 -7.60733 34.2141 -16.4917 -4.23068 33.66 -16.301 -4.23014 33.6709 -16.3047 -3.86024 32.8276 -16.0145 -6.93305 32.7263 -15.9797 -7.61329 32.8919 -15.9902 -3.77224 32.677 -15.9163 -4.28296 33.3299 -16.1874 -4.98158 33.3486 -16.1938 -5.19862 33.4211 -16.2188 -6.04441 33.2284 -16.1525 -6.75147 41.2422 2.51901 0 41.6049 5.08889 0 40.2836 3.10687 0 40.4549 5.16806 0 40.7581 0.574058 0 40.5938 0.606495 0 39.9863 0.662585 0 39.9444 0.281999 0 38.7266 0.699332 0 38.8948 0.188449 0 39.8289 1.74732 0 39.9654 2.16694 0 40.5692 4.36144 0 31.7005 -8.70096 5.92036 31.9349 -8.05701 0 32.2328 -7.23853 0 31.9571 -7.99599 6.00027 31.0049 -10.6122 10.7946 31.2357 -9.97807 10.9907 31.1488 -10.2168 11.5916 30.904 -10.8894 11.5017 30.8822 -10.9492 5.23555 31.0735 -10.4236 0 29.6923 -14.2184 6.54629 29.8377 -13.819 6.23884 30.3692 -12.3586 9.13231 30.2735 -12.6215 9.85917 29.5747 -14.5415 0 29.5887 -14.5032 3.15953 29.3653 -15.1169 2.80102 29.3247 -15.2283 0 31.7005 -8.70096 -5.92036 31.9571 -7.99599 -6.00027 31.0049 -10.6122 -10.7946 30.904 -10.8894 -11.5017 31.1488 -10.2168 -11.5916 31.2357 -9.97807 -10.9907 30.8822 -10.9492 -5.23555 29.6923 -14.2184 -6.54629 30.2735 -12.6215 -9.85917 30.3692 -12.3586 -9.13231 29.8377 -13.819 -6.23884 29.3653 -15.1169 -2.80102 29.5887 -14.5032 -3.15953 32.9222 -7.63431 0 32.6463 -8.39208 6.00027 31.925 -10.374 10.9907 31.8382 -10.6126 11.5916 31.638 -11.1626 11.5017 30.4275 -14.4882 6.54629 31.0081 -12.8931 9.85917 30.1009 -15.3858 2.80102 30.0604 -15.4971 0 32.6463 -8.39208 -6.00027 31.638 -11.1626 -11.5017 31.8382 -10.6126 -11.5916 31.925 -10.374 -10.9907 30.4275 -14.4882 -6.54629 31.0081 -12.8931 -9.85917 30.1009 -15.3858 -2.80102 34.9157 -10.9246 4.4689 35.0873 -10.4533 4.52896 35.3116 -9.83695 0 34.3591 -12.4539 8.63155 34.2792 -12.6735 9.19695 34.438 -12.237 9.26884 34.5072 -12.047 8.78831 34.2619 -12.7208 3.95417 33.3333 -15.2723 5.23452 33.784 -14.034 7.88355 33.8587 -13.8288 7.30233 33.4456 -14.9638 4.98868 33.0506 -16.049 0 33.0817 -15.9635 2.12429 33.2534 -15.4917 2.39375 34.9157 -10.9246 -4.4689 35.0873 -10.4533 -4.52896 34.3591 -12.4539 -8.63155 34.5072 -12.047 -8.78831 34.438 -12.237 -9.26884 34.2792 -12.6735 -9.19695 34.2619 -12.7208 -3.95417 33.3333 -15.2723 -5.23452 33.4456 -14.9638 -4.98868 33.8587 -13.8288 -7.30233 33.784 -14.034 -7.88355 33.2534 -15.4917 -2.39375 33.0817 -15.9635 -2.12429 33.1792 -11.2899 10.8198 33.2601 -11.0675 10.2588 33.9349 -9.21368 5.60072 34.1938 -8.50223 0 33.9349 -9.21368 -5.60072 33.2601 -11.0675 -10.2588 33.1792 -11.2899 -10.8198 32.9928 -11.8019 -10.7358 32.4085 -13.4072 -9.20267 31.8722 -14.8808 -6.11039 31.5709 -15.7086 -2.61451 31.5335 -15.8112 0 31.5709 -15.7086 2.61451 31.8722 -14.8808 6.11039 32.4085 -13.4072 9.20267 32.9928 -11.8019 10.7358 34.8946 -10.2416 4.93291 35.125 -9.60879 0 34.8946 -10.2416 -4.93291 34.2984 -11.8798 -9.0356 34.2272 -12.0753 -9.52965 34.0637 -12.5245 -9.45574 33.5538 -13.9256 -8.10538 33.0891 -15.2022 -5.38181 32.8295 -15.9154 -2.30276 32.7974 -16.0037 0 32.8295 -15.9154 2.30276 33.0891 -15.2022 5.38181 33.5538 -13.9256 8.10538 34.0637 -12.5245 9.45574 34.2272 -12.0753 9.52965 34.2984 -11.8798 9.0356 37.3412 -12.1916 3.4624 37.517 -11.6753 3.51654 37.7416 -11.0558 -0.080431 37.5309 -11.6705 0 36.6875 -13.9879 3.07121 36.8392 -13.5711 0 35.6682 -16.7883 0 35.4343 -17.3658 -0.080428 35.4666 -17.2792 1.68651 35.679 -16.7587 1.88529 37.3412 -12.1916 -3.4624 37.517 -11.6753 -3.51655 36.6875 -13.9879 -3.07121 35.679 -16.7587 -1.88529 35.4664 -17.2793 -1.68654 37.2689 -11.5506 3.51567 37.4935 -10.9314 -0.080431 35.3353 -10.578 3.50892 35.5597 -9.96139 -0.080428 37.2689 -11.5505 -3.51568 35.3353 -10.578 -3.50892 37.0936 -12.0623 -3.4624 35.1633 -11.054 -3.4624 36.4398 -13.8585 -3.07121 34.5096 -12.8502 -3.07121 35.4313 -16.6294 -1.88529 33.5011 -15.6211 -1.88529 35.2229 -17.145 -1.68592 33.3252 -16.0979 -1.68112 35.1909 -17.2314 -0.080428 33.294 -16.1835 -0.080428 35.2231 -17.1449 1.6859 33.3252 -16.0979 1.68111 35.4313 -16.6294 1.88529 33.5011 -15.6211 1.88529 36.4398 -13.8585 3.07121 34.5096 -12.8502 3.07121 37.0936 -12.0623 3.4624 35.1633 -11.054 3.4624 18.31 -49.3874 5.82322 19.0787 -47.2753 11.2496 20.3017 -43.9154 15.9093 21.8954 -39.5367 19.4849 23.7513 -34.4376 21.7326 25.743 -28.9655 22.4992 27.7346 -23.4935 21.7326 29.5906 -18.3944 19.4849 31.1843 -14.0156 15.9093 22.6152 -48.5625 5.22096 23.3044 -46.6688 10.0861 24.4008 -43.6564 14.2639 25.8297 -39.7305 17.4697 27.4937 -35.1588 19.4849 29.2794 -30.2527 20.1722 31.065 -25.3466 19.4849 32.729 -20.7748 17.4697 34.1579 -16.849 14.2639 26.8748 -46.3078 4.26289 27.4376 -44.7617 8.23528 28.3328 -42.302 11.6464 29.4995 -39.0966 14.2639 30.8582 -35.3638 15.9093 32.3162 -31.358 16.4706 33.7742 -27.3521 15.9093 35.1328 -23.6193 14.2639 36.2995 -20.4139 11.6464 30.7988 -42.7773 3.01432 31.1967 -41.6839 5.82322 31.8297 -39.9447 8.23528 32.6547 -37.6781 10.0861 33.6154 -35.0386 11.2496 34.6464 -32.2061 11.6464 35.6773 -29.3736 11.2496 36.638 -26.7341 10.0861 37.463 -24.4675 8.23528 34.1195 -38.2113 1.56033 34.3255 -37.6453 3.01432 34.6532 -36.7451 4.26289 35.0802 -35.5718 5.22096 35.5775 -34.2055 5.82322 36.1112 -32.7392 6.02864 36.6448 -31.273 5.82322 37.1421 -29.9067 5.22096 37.5692 -28.7334 4.26289 37.8969 -27.8331 3.01432 38.1028 -27.2672 1.56033 31.604 -12.8625 14.3101 38.354 -23.6497 2.4942 34.5144 -15.8696 12.9056 36.659 -19.426 10.2764 38.0783 -22.7121 5.93795 29.7108 -14.1212 12.9056 27.6594 -19.7572 2.4942 28.8186 -16.5723 10.2764 27.9285 -19.0179 5.93795 30.4023 -12.2213 14.4563 31.1367 -13.1731 13.9634 37.6958 -23.4101 2.4942 33.4618 -15.4864 12.9056 35.9038 -19.1511 10.2764 37.4061 -22.4674 5.93795 38.2934 -24.5231 2.26873 34.3925 -16.2046 13.3702 31.4467 -13.2946 14.9094 36.5139 -19.8249 10.8296 29.4793 -12.1577 15.0574 37.9886 -23.3956 5.88247 30.29 -9.48098 11.4689 31.0737 -7.32768 5.93672 29.7153 -11.3786 14.0129 31.2132 -9.99323 11.3733 31.9904 -7.85789 5.88723 30.5442 -11.8313 13.9167 28.5406 -20.0779 2.4942 30.5919 -14.4419 12.9056 29.6998 -16.893 10.2764 28.8096 -19.3386 5.93795 31.0206 -10.5224 11.285 30.3423 -12.3859 13.6718 31.7865 -8.4181 5.80883 30.2186 -12.726 14.0444 28.236 -18.1732 5.85284 27.9841 -18.8652 2.75494 29.0839 -15.8435 10.3979 30.04 -13.2167 10.8358 29.8527 -13.7313 12.3979 30.3057 -12.4866 4.57892 28.9787 -16.1325 2.44005 32.1577 -14.6045 12.8849 33.1557 -17.0496 10.203 33.6844 -19.3192 5.77783 33.7619 -19.9753 2.2652 18.31 -49.3874 -5.82322 19.0787 -47.2753 -11.2496 20.3017 -43.9154 -15.9093 21.8954 -39.5367 -19.4849 23.7513 -34.4376 -21.7326 25.743 -28.9655 -22.4992 27.7346 -23.4935 -21.7326 29.5906 -18.3944 -19.4849 31.1843 -14.0156 -15.9093 22.6152 -48.5625 -5.22096 23.3044 -46.6688 -10.0861 24.4008 -43.6564 -14.2639 25.8297 -39.7305 -17.4697 27.4937 -35.1588 -19.4849 29.2794 -30.2527 -20.1722 31.065 -25.3466 -19.4849 32.729 -20.7748 -17.4697 34.1579 -16.849 -14.2639 26.8748 -46.3078 -4.26289 27.4376 -44.7617 -8.23528 28.3328 -42.302 -11.6464 29.4995 -39.0966 -14.2639 30.8582 -35.3638 -15.9093 32.3162 -31.358 -16.4706 33.7742 -27.3521 -15.9093 35.1328 -23.6193 -14.2639 36.2995 -20.4139 -11.6464 30.7988 -42.7773 -3.01432 31.1967 -41.6839 -5.82322 31.8297 -39.9447 -8.23528 32.6547 -37.6781 -10.0861 33.6154 -35.0386 -11.2496 34.6464 -32.2061 -11.6464 35.6773 -29.3736 -11.2496 36.638 -26.7341 -10.0861 37.463 -24.4675 -8.23528 34.1195 -38.2113 -1.56033 34.3255 -37.6453 -3.01432 34.6532 -36.7451 -4.26289 35.0802 -35.5718 -5.22096 35.5775 -34.2055 -5.82322 36.1112 -32.7392 -6.02864 36.6448 -31.273 -5.82322 37.1421 -29.9067 -5.22096 37.5692 -28.7334 -4.26289 37.8969 -27.8331 -3.01432 38.1028 -27.2672 -1.56033 31.604 -12.8625 -14.3101 38.354 -23.6497 -2.4942 34.5144 -15.8696 -12.9056 36.659 -19.426 -10.2764 38.0783 -22.7121 -5.93795 29.7108 -14.1212 -12.9056 27.6594 -19.7572 -2.4942 28.8186 -16.5723 -10.2764 27.9285 -19.0179 -5.93795 30.4023 -12.2213 -14.4563 31.1367 -13.1731 -13.9634 37.6958 -23.4101 -2.4942 33.4618 -15.4864 -12.9056 35.9038 -19.1511 -10.2764 37.4061 -22.4674 -5.93795 38.2934 -24.5231 -2.26873 34.3925 -16.2046 -13.3702 31.4467 -13.2946 -14.9094 36.5139 -19.8249 -10.8296 29.4793 -12.1577 -15.0574 37.9886 -23.3956 -5.88247 30.29 -9.48098 -11.4689 31.0737 -7.32768 -5.93672 29.7153 -11.3786 -14.0129 31.2132 -9.99323 -11.3733 31.9904 -7.85789 -5.88723 30.5442 -11.8313 -13.9167 28.5406 -20.0779 -2.4942 30.5919 -14.4419 -12.9056 29.6998 -16.893 -10.2764 28.8096 -19.3386 -5.93795 31.0206 -10.5224 -11.285 30.3423 -12.3859 -13.6718 31.7865 -8.4181 -5.80883 30.2186 -12.726 -14.0444 28.236 -18.1732 -5.85284 27.9841 -18.8652 -2.75494 29.0839 -15.8435 -10.3979 30.04 -13.2167 -10.8358 29.8527 -13.7313 -12.3979 30.3057 -12.4866 -4.57892 28.9787 -16.1325 -2.44005 32.1577 -14.6045 -12.8849 33.1557 -17.0496 -10.203 33.6844 -19.3192 -5.77783 33.7619 -19.9753 -2.2652 18.0478 -50.1079 0 27.5471 -20.0658 0 28.4283 -20.3865 0 27.9309 -19.0114 0 29.2586 -15.3636 0 30.5244 -11.8858 0 31.3411 -6.59322 0 32.2555 -7.12956 0 32.0119 -7.79891 0 22.3801 -49.2084 0 26.6829 -46.8352 0 30.663 -43.1502 0 34.0493 -38.4043 0 38.1731 -27.0742 0 38.413 -24.0206 0 37.7751 -23.7884 0 38.3476 -24.8528 0 33.7735 -20.2416 0 36.4569 -32.8651 -1.74677 36.3022 -33.2899 -1.68725 36.1581 -33.6858 -1.51274 36.0344 -34.0257 -1.23515 35.9395 -34.2866 -0.873384 35.8798 -34.4506 -0.452097 35.8594 -34.5065 0 35.8798 -34.4506 0.452097 35.9395 -34.2866 0.873384 36.0344 -34.0257 1.23515 36.1581 -33.6858 1.51274 36.3022 -33.2899 1.68725 36.4569 -32.8651 1.74677 36.6115 -32.4402 1.68725 36.7556 -32.0443 1.51274 36.8793 -31.7044 1.23515 36.9742 -31.4435 0.873384 37.0339 -31.2796 0.452096 37.0543 -31.2236 0 37.0339 -31.2796 -0.452096 36.9742 -31.4435 -0.873384 36.8793 -31.7044 -1.23515 36.7556 -32.0443 -1.51274 36.6115 -32.4402 -1.68725 36.5385 -32.8948 0 27.3075 -10.1328 14.1646 26.5263 -12.2791 16.7118 25.007 -16.4533 19.9408 27.9903 -8.25675 11.1334 28.6778 -6.3677 5.95345 28.9449 -5.63387 0 28.6778 -6.3677 -5.95345 27.9903 -8.25675 -11.1334 27.3075 -10.1328 -14.1646 26.5263 -12.2791 -16.7118 25.007 -16.4533 -19.9408 23.1095 -21.6667 -22.2353 21.0717 -27.2653 -23.0197 19.034 -32.864 -22.2353 17.1351 -38.0811 -19.9357 15.5045 -42.5611 -16.2774 14.2533 -45.9987 -11.5099 13.4668 -48.1597 -5.95794 13.1985 -48.8968 0 13.4668 -48.1597 5.95794 14.2533 -45.9987 11.5099 15.5045 -42.5611 16.2774 17.1351 -38.0811 19.9357 19.034 -32.864 22.2353 21.0717 -27.2653 23.0197 23.1095 -21.6667 22.2353 14.5629 -46.3631 -11.6464 13.767 -48.5498 -6.02864 13.4955 -49.2956 0 14.5629 -46.3631 11.6464 13.767 -48.5498 6.02864 15.8289 -42.8847 -16.4706 15.8289 -42.8847 16.4706 17.4788 -38.3515 -20.1722 17.4788 -38.3515 20.1722 19.4002 -33.0725 -22.4992 19.4002 -33.0725 22.4992 21.4622 -27.4074 -23.2929 21.4622 -27.4074 23.2929 23.5241 -21.7424 -22.4992 23.5241 -21.7424 22.4992 25.4455 -16.4634 -20.1722 25.4455 -16.4634 20.1722 27.0954 -11.9302 -16.4706 27.0954 -11.9302 16.4706 27.6852 -10.3097 -14.2232 28.3615 -8.45174 -11.6464 28.3615 -8.45174 11.6464 27.6852 -10.3097 14.2232 29.1573 -6.26511 -6.02864 29.4288 -5.51929 0 29.1573 -6.26511 6.02864 27.0498 -9.71303 14.4007 26.2527 -11.903 16.9997 24.7094 -16.1431 20.2797 27.7457 -7.80091 11.3112 28.4441 -5.8821 6.04968 28.7155 -5.13641 -0.000000 28.4441 -5.8821 -6.04968 27.7457 -7.80091 -11.3112 27.0498 -9.71303 -14.4007 26.2527 -11.903 -16.9997 24.7094 -16.1431 -20.2797 22.7814 -21.4403 -22.6111 20.7093 -27.1334 -23.4087 18.6371 -32.8267 -22.6111 16.7062 -38.1319 -20.2726 15.048 -42.6877 -16.5525 13.7757 -46.1834 -11.7044 12.9758 -48.3809 -6.05863 12.703 -49.1304 -0.000000 12.9758 -48.3809 6.05863 13.7757 -46.1834 11.7044 15.048 -42.6877 16.5525 16.7062 -38.1319 20.2726 18.6371 -32.8267 22.6111 20.7093 -27.1334 23.4087 22.7814 -21.4403 22.6111 26.2144 -9.18894 14.5601 25.4066 -11.4083 17.1941 23.8471 -15.693 20.5085 26.9192 -7.25247 11.4313 27.6249 -5.31357 6.11463 27.8993 -4.55988 0.000000 27.6249 -5.31357 -6.11463 26.9192 -7.25247 -11.4313 26.2144 -9.18894 -14.5601 25.4066 -11.4083 -17.1941 23.8471 -15.693 -20.5085 21.8986 -21.0467 -22.8648 19.8032 -26.8036 -23.6713 17.7078 -32.5607 -22.8648 15.7552 -37.9255 -20.5 14.0784 -42.5323 -16.7382 12.7918 -46.0673 -11.8357 11.983 -48.2895 -6.12659 11.7071 -49.0474 0.000000 11.983 -48.2895 6.1266 12.7918 -46.0673 11.8357 14.0784 -42.5323 16.7382 15.7552 -37.9255 20.5 17.7078 -32.5607 22.8648 19.8032 -26.8036 23.6713 21.8985 -21.0467 22.8648 25.2533 -9.01027 14.4361 24.4539 -11.2067 17.0429 22.907 -15.4568 20.3306 25.9512 -7.09274 11.3379 26.6513 -5.16946 6.06411 26.9233 -4.42199 0.000002 26.6513 -5.16946 -6.06411 25.9512 -7.09274 -11.3379 25.2533 -9.01027 -14.4361 24.4539 -11.2067 -17.0429 22.907 -15.4568 -20.3306 20.9744 -20.7665 -22.6675 18.8971 -26.4738 -23.4671 16.8198 -32.1813 -22.6675 14.884 -37.4998 -20.3231 13.2217 -42.0668 -16.5937 11.9462 -45.5713 -11.7335 11.1444 -47.7743 -6.07373 10.8709 -48.5257 0.000002 11.1444 -47.7743 6.07373 11.9462 -45.5713 11.7336 13.2217 -42.0668 16.5938 14.884 -37.4998 20.3231 16.8198 -32.1813 22.6675 18.8971 -26.4738 23.4671 20.9744 -20.7665 22.6675 24.794 -9.14461 14.2177 24.0092 -11.3007 16.7766 22.4845 -15.4898 20.0171 25.4797 -7.26045 11.1734 26.1697 -5.3647 5.9751 26.4378 -4.62821 0.000002 26.1697 -5.3647 -5.9751 25.4797 -7.26045 -11.1734 24.794 -9.14461 -14.2177 24.0092 -11.3007 -16.7766 22.4845 -15.4898 -20.0171 20.5801 -20.722 -22.3199 18.5347 -26.3419 -23.1072 16.4892 -31.9618 -22.3199 14.5831 -37.1988 -20.0115 12.9463 -41.6958 -16.3393 11.6903 -45.1465 -11.5536 10.9008 -47.3157 -5.98059 10.6315 -48.0556 0.000002 10.9008 -47.3157 5.9806 11.6903 -45.1465 11.5536 12.9463 -41.6958 16.3393 14.5831 -37.1988 20.0115 16.4892 -31.9618 22.3199 18.5347 -26.3419 23.1073 20.5801 -20.722 22.3199 24.5387 -8.77462 14.4184 23.7404 -10.9678 17.0213 22.1953 -15.2129 20.3052 25.2356 -6.8598 11.3246 25.9348 -4.93875 6.0569 26.2066 -4.19217 0.000003 25.9348 -4.93875 -6.05689 25.2356 -6.8598 -11.3246 24.5387 -8.77462 -14.4184 23.7404 -10.9678 -17.0213 22.1953 -15.2129 -20.3051 20.2651 -20.5163 -22.6393 18.1903 -26.2166 -23.4379 16.1156 -31.9169 -22.6393 14.1822 -37.2288 -20.2978 12.522 -41.7902 -16.5731 11.2481 -45.2903 -11.719 10.4472 -47.4906 -6.06618 10.1741 -48.241 0.000003 10.4472 -47.4906 6.06618 11.2481 -45.2903 11.719 12.522 -41.7902 16.5731 14.1822 -37.2288 20.2978 16.1156 -31.9169 22.6393 18.1903 -26.2166 23.4379 20.2651 -20.5163 22.6393 23.3031 -8.50421 14.2886 22.5136 -10.6734 16.863 20.9817 -14.8822 20.1187 23.9929 -6.60922 11.2268 24.6861 -4.70455 6.00397 24.9555 -3.96449 0.000004 24.6861 -4.70455 -6.00396 23.9929 -6.60922 -11.2267 23.3031 -8.50421 -14.2885 22.5136 -10.6734 -16.863 20.9817 -14.8822 -20.1187 19.0682 -20.1396 -22.4326 17.0124 -25.7879 -23.224 14.9566 -31.4362 -22.4326 13.0409 -36.6995 -20.1125 11.3958 -41.2193 -16.4218 10.1335 -44.6875 -11.612 9.34 -46.8676 -6.0108 9.06934 -47.6112 0.000004 9.34 -46.8676 6.01081 10.1335 -44.6875 11.612 11.3958 -41.2193 16.4218 13.0409 -36.6995 20.1125 14.9566 -31.4362 22.4326 17.0124 -25.7879 23.224 19.0682 -20.1396 22.4326 21.4425 -8.68268 13.6687 20.6946 -10.7373 16.1071 19.2257 -14.7731 19.2291 22.0977 -6.88237 10.7599 22.7625 -5.05583 5.75137 23.0205 -4.34691 0.000007 22.7625 -5.05583 -5.75135 22.0977 -6.88237 -10.7599 21.4425 -8.68268 -13.6687 20.6946 -10.7373 -16.1071 19.2257 -14.7731 -19.2291 17.3922 -19.8106 -21.4462 15.4267 -25.2107 -22.2028 13.4613 -30.6107 -21.4462 11.6298 -35.6426 -19.2281 10.0571 -39.9636 -15.6997 8.85032 -43.2793 -11.1014 8.09169 -45.3636 -5.74649 7.83294 -46.0745 0.000007 8.09169 -45.3636 5.7465 8.85032 -43.2793 11.1014 10.0571 -39.9636 15.6997 11.6298 -35.6426 19.2282 13.4613 -30.6107 21.4462 15.4267 -25.2107 22.2028 17.3922 -19.8106 21.4462 19.3772 -10.5226 11.7916 18.7558 -12.2301 13.818 17.4775 -15.742 16.5347 19.9281 -9.00902 9.34606 20.5068 -7.41909 4.98633 20.7305 -6.80447 0.00001 20.5068 -7.41909 -4.98631 19.9281 -9.00902 -9.34604 19.3772 -10.5226 -11.7915 18.7558 -12.2301 -13.818 17.4775 -15.742 -16.5347 15.8865 -20.1135 -18.4587 14.1944 -24.7622 -19.11 12.5028 -29.41 -18.4588 10.9264 -33.741 -16.5497 9.57279 -37.4601 -13.5128 8.5341 -40.3139 -9.55498 7.88115 -42.1078 -4.94602 7.65843 -42.7197 0.00001 7.88114 -42.1078 4.94604 8.53409 -40.3139 9.555 9.57278 -37.4601 13.5128 10.9264 -33.741 16.5497 12.5028 -29.4099 18.4588 14.1944 -24.7622 19.11 15.8864 -20.1135 18.4587 18.3016 -12.2092 10.2863 17.7814 -13.6384 11.9824 16.6561 -16.7302 14.3741 18.7688 -10.9256 8.2123 19.2784 -9.52541 4.37286 19.4746 -8.98641 0.000011 19.2784 -9.52541 -4.37284 18.7688 -10.9256 -8.21228 18.3016 -12.2092 -10.2863 17.7814 -13.6384 -11.9824 16.6561 -16.7302 -14.3741 15.2594 -20.5676 -16.063 13.7867 -24.6138 -16.6299 12.3146 -28.6584 -16.0633 10.9428 -32.4273 -14.4019 9.76484 -35.6638 -11.7591 8.86094 -38.1472 -8.31495 8.29273 -39.7083 -4.30413 8.09891 -40.2408 0.000012 8.29272 -39.7083 4.30415 8.86093 -38.1472 8.31498 9.76482 -35.6638 11.7591 10.9428 -32.4273 14.402 12.3146 -28.6584 16.0633 13.7867 -24.6138 16.6299 15.2594 -20.5676 16.0631 18.3733 -13.1399 9.63104 17.8972 -14.4479 11.1834 16.8384 -17.3569 13.4337 18.8041 -11.9564 7.71878 19.2836 -10.6388 4.10582 19.4678 -10.1327 0.000009 19.2837 -10.6388 -4.1058 18.8041 -11.9564 -7.71876 18.3733 -13.1399 -9.63102 17.8973 -14.4479 -11.1834 16.8385 -17.3569 -13.4336 15.5264 -20.9618 -15.0202 14.1492 -24.7457 -15.5504 12.7726 -28.5277 -15.0205 11.4899 -32.052 -13.467 10.3884 -35.0784 -10.9958 9.54314 -37.4006 -7.77518 9.01181 -38.8604 -4.02472 8.83058 -39.3583 0.000011 9.0118 -38.8604 4.02474 9.54312 -37.4006 7.7752 10.3883 -35.0784 10.9958 11.4898 -32.052 13.467 12.7726 -28.5277 15.0205 14.1491 -24.7457 15.5504 15.5263 -20.9618 15.0203 19.7795 -14.9149 8.71605 19.365 -16.0537 10.0676 18.3992 -18.7074 12.1204 20.1594 -13.8712 7.02962 20.597 -12.6689 3.73291 20.7645 -12.2088 0.000001 20.597 -12.6689 -3.73291 20.1594 -13.8712 -7.02962 19.7795 -14.9149 -8.71606 19.3651 -16.0537 -10.0676 18.3992 -18.7074 -12.1203 17.2053 -21.9876 -13.5641 15.9614 -25.4053 -14.0429 14.7183 -28.8207 -13.5644 13.5599 -32.0033 -12.1615 12.5651 -34.7363 -9.92982 11.8019 -36.8334 -7.02145 11.322 -38.1517 -3.63456 11.1584 -38.6013 0.000003 11.322 -38.1516 3.63457 11.8018 -36.8334 7.02145 12.5651 -34.7363 9.92982 13.5598 -32.0033 12.1615 14.7182 -28.8207 13.5644 15.9613 -25.4053 14.0429 17.2052 -21.9876 13.5641 20.8498 -15.0192 8.92266 20.4214 -16.1962 10.3196 19.4345 -18.9075 12.4169 21.2412 -13.9439 7.18523 21.6882 -12.7156 3.81711 21.8595 -12.2451 -0.000004 21.6883 -12.7156 -3.81712 21.2412 -13.9439 -7.18524 20.8498 -15.0192 -8.92267 20.4214 -16.1962 -10.3196 19.4346 -18.9075 -12.4169 18.214 -22.2611 -13.8929 16.9399 -25.7615 -14.3833 15.6667 -29.2596 -13.8932 14.4802 -32.5194 -12.4563 13.4614 -35.3186 -10.1705 12.6796 -37.4666 -7.19165 12.1882 -38.8168 -3.72267 12.0205 -39.2773 -0.000002 12.1882 -38.8168 3.72267 12.6796 -37.4666 7.19164 13.4614 -35.3186 10.1705 14.4802 -32.5194 12.4563 15.6667 -29.2596 13.8932 16.9399 -25.7615 14.3833 18.2139 -22.2611 13.8929 20.9041 -11.4576 3.94218 20.4718 -12.6451 7.27939 19.9923 -13.9626 9.47182 19.4148 -15.5493 11.2728 18.4457 -18.212 13.2813 17.1872 -21.6697 14.7675 15.8432 -25.3623 15.303 14.4961 -29.0634 14.769 13.2374 -32.5216 13.2357 12.1568 -35.4905 10.7965 11.3259 -37.7732 7.654 10.7908 -39.2436 3.95673 10.6173 -39.7203 -0.025641 10.8024 -39.2117 -3.96121 11.3223 -37.7831 -7.63933 12.1494 -35.5108 -10.7949 13.2383 -32.519 -13.2346 14.4979 -29.0583 -14.7602 15.8459 -25.3549 -15.2942 17.1857 -21.6737 -14.7708 18.4354 -18.2401 -13.2849 19.3971 -15.5979 -11.2852 19.9933 -13.96 -9.50144 20.4648 -12.6643 -7.2571 20.8936 -11.4864 -3.90658 21.0754 -10.9869 0.027026 22.9903 -11.6839 0.027026 22.8085 -12.1834 -3.90658 17.7581 -26.0592 15.303 19.1021 -22.3666 14.7675 13.2373 -38.4801 -7.63933 12.7173 -39.9086 -3.96121 13.2409 -38.4702 7.654 14.0717 -36.1875 10.7965 20.3504 -18.9371 -13.2849 19.1006 -22.3707 -14.7708 20.3606 -18.9089 13.2813 21.3297 -16.2463 11.2728 14.0643 -36.2078 -10.7949 22.3868 -13.3421 7.27939 22.819 -12.1546 3.94218 21.9082 -14.657 -9.50144 21.312 -16.2949 -11.2852 22.3798 -13.3613 -7.2571 15.1523 -33.2186 13.2357 16.411 -29.7604 14.769 17.7608 -26.0518 -15.2942 16.4129 -29.7553 -14.7602 12.7057 -39.9406 3.95673 21.9072 -14.6596 9.47182 15.1533 -33.216 -13.2346 12.5322 -40.4173 -0.025641 21.5594 -18.3316 -7.89785 22.3073 -16.2768 -4.24114 22.5432 -15.6285 1.50936 21.9674 -17.2105 6.36652 20.978 -19.9289 9.33162 19.1426 -24.9717 11.4278 17.1298 -30.5019 10.6428 15.5145 -34.9398 7.01224 14.7261 -37.1059 1.49487 14.9985 -36.3576 -4.40715 16.2384 -32.9509 -9.13015 18.1217 -27.7766 -11.4196 20.1271 -22.2668 -10.6601 17.4364 -30.5537 -5.65913 16.6677 -32.6659 -2.73086 16.9876 -31.7868 4.34916 17.9891 -29.0353 6.60013 20.9884 -20.7947 3.94881 21.3454 -19.8138 0.93737 21.1991 -20.2158 -2.62794 19.237 -25.6066 7.08683 20.375 -22.4801 5.78717 16.4988 -33.1298 0.928389 18.6041 -27.3456 -7.07858 20.7354 -21.4897 -4.8951 19.8474 -23.9296 -6.6077 19.0701 -26.0652 0.002965 31.8631 -13.5079 14.0306 38.9087 -22.8008 2.43989 34.8117 -16.1543 12.6529 37.0572 -19.2137 10.0738 38.5939 -22.0099 5.81801 30.1198 -14.4466 12.6529 28.4629 -18.9988 2.43989 29.3992 -16.4264 10.0738 28.6802 -18.4017 5.81801 30.6783 -12.912 14.174 31.4328 -13.7396 13.6906 38.2658 -22.5668 2.43989 33.7835 -15.7801 12.6529 36.3196 -18.9452 10.0738 37.9374 -21.771 5.81801 29.3235 -19.312 2.43989 30.9804 -14.7598 12.6529 30.2598 -16.7396 10.0738 29.5409 -18.7149 5.81801 30.5299 -13.3197 13.7699 29.5526 -16.005 2.34735 29.7388 -15.4933 5.37563 30.3548 -13.8009 8.51171 35.3295 -13.7814 10.3042 37.6569 -16.5918 8.1095 30.9722 -12.1046 10.5944 31.3236 -11.1391 11.4963 31.4507 -10.7898 11.8227 32.5681 -11.3376 11.7068 39.1871 -22.0359 2.43989 38.8723 -21.245 5.81801 37.3356 -18.4488 10.0738 35.0901 -15.3894 12.6529 32.1415 -12.743 14.0306 30.9567 -12.1471 14.174 30.8083 -12.5548 13.7699 30.3982 -13.6817 12.6529 29.6776 -15.6615 10.0738 28.9586 -17.6368 5.81801 28.7413 -18.2339 2.43989 32.3077 -15.474 12.6529 33.4553 -21.8718 2.43989 33.4346 -21.0798 5.81801 33.1002 -18.3632 10.0738 38.6078 -12.23 7.12674 40.1086 -7.27288 6.38726 38.9995 -19.1175 4.30809 40.4722 -14.3091 3.83942 41.5879 -9.21705 2.9614 35.3982 -11.7744 9.95378 37.4255 -10.2806 7.9831 32.4214 -11.8209 12.5059 31.248 -11.3468 12.7875 31.1306 -11.6692 12.3477 40.811 -8.02459 5.71511 41.2912 -4.07134 3.27877 41.7989 -5.05268 2.97755 42.1911 -6.57271 1.95967 30.8 -12.5778 11.2119 29.3092 -16.6737 2.37511 29.5047 -16.1364 5.50835 30.1516 -14.3591 8.98033 31.6429 -13.799 13.1096 31.1415 -13.4054 13.3999 31.2968 -13.0982 13.4908 31.9486 -13.507 13.2853 38.4029 -22.0228 2.34885 38.5788 -22.0843 2.36512 36.4374 -18.4987 9.73593 33.8969 -15.4176 12.2276 34.6447 -15.7551 12.1616 36.7916 -18.6421 9.71428 38.0623 -21.2475 5.6177 38.274 -21.3209 5.62813 29.2 -18.6717 2.41468 29.6735 -18.8353 2.50635 30.0479 -16.1823 9.70267 30.6965 -14.4078 12.3806 30.9659 -14.5535 12.1325 30.3909 -16.2614 9.53406 29.4753 -17.8323 5.67988 29.9103 -17.9699 5.73712 32.5052 -15.2826 12.0854 37.922 -21.6885 2.40367 37.9955 -18.8919 4.14823 37.7423 -20.9606 5.62625 36.7707 -18.4306 9.7123 37.1502 -16.6445 7.80245 34.6978 -15.5355 12.1746 34.8908 -13.9542 9.95446 32.0848 -13.1318 13.1425 32.3548 -12.4633 12.1694 31.3875 -12.7273 13.3917 31.6254 -12.1303 12.4919 31.2453 -12.8767 13.4893 31.5204 -12.174 12.3091 30.8616 -13.9478 12.4927 30.1769 -15.8769 9.89028 29.552 -17.6161 5.87996 29.2603 -18.4264 2.5163 33.6495 -21.3369 2.34382 33.6156 -20.5672 5.61126 33.2569 -17.9287 9.73011 39.5553 -14.0354 3.6229 38.3069 -12.2143 6.72532 40.8019 -9.05754 2.80834 37.3425 -10.284 7.8698 37.1764 -10.2908 7.64321 37.0934 -10.2942 7.52992 40.0165 -7.28835 6.29475 39.8323 -7.31929 6.10974 39.7402 -7.33476 6.01723 40.3016 -8.00008 5.38928 35.3158 -11.791 9.84028 35.1508 -11.8241 9.61327 35.0684 -11.8407 9.49977 32.5082 -11.4416 11.6322 32.3884 -11.6497 11.483 32.3285 -11.7538 11.4084 31.5477 -10.9322 11.7979 31.7416 -11.217 11.7484 31.774 -11.5368 11.5738 31.455 -11.187 11.4963 31.6532 -11.46 11.3466 31.7845 -11.5078 11.3466 31.3255 -12.769 11.2119 31.1035 -12.1525 10.5944 31.3663 -12.2481 10.5944 31.4977 -12.2959 10.5944 41.1742 -4.11559 3.21812 40.9403 -4.20407 3.09682 40.8233 -4.24832 3.03618 41.2813 -5.15996 2.75771 41.4687 -6.4954 1.80478 29.8347 -16.8649 2.37511 29.6839 -16.0528 2.34735 29.9467 -16.1484 2.34735 30.0781 -16.1963 2.34735 30.0303 -16.3276 5.50835 29.8702 -15.5412 5.37563 30.1329 -15.6368 5.37563 30.2643 -15.6846 5.37563 30.6772 -14.5504 8.98033 30.4861 -13.8488 8.51171 30.7489 -13.9444 8.51171 30.8803 -13.9922 8.51171 31.8631 -13.5079 -14.0306 38.9087 -22.8008 -2.43989 34.8117 -16.1543 -12.6529 37.0572 -19.2137 -10.0738 38.5939 -22.0099 -5.81801 30.1198 -14.4466 -12.6529 28.4629 -18.9988 -2.43989 29.3992 -16.4264 -10.0738 28.6802 -18.4017 -5.81801 30.6783 -12.912 -14.174 31.4328 -13.7396 -13.6906 38.2658 -22.5668 -2.43989 33.7835 -15.7801 -12.6529 36.3196 -18.9452 -10.0738 37.9374 -21.771 -5.81801 29.3235 -19.312 -2.43989 30.9804 -14.7598 -12.6529 30.2598 -16.7396 -10.0738 29.5409 -18.7149 -5.81801 30.5299 -13.3197 -13.7699 29.5526 -16.005 -2.34735 29.7388 -15.4933 -5.37563 30.3548 -13.8009 -8.51171 35.3295 -13.7814 -10.3042 37.6569 -16.5918 -8.1095 30.9722 -12.1046 -10.5943 31.3236 -11.1391 -11.4963 31.4507 -10.7898 -11.8227 32.5681 -11.3376 -11.7068 39.1871 -22.0359 -2.43989 38.8723 -21.245 -5.81801 37.3356 -18.4488 -10.0738 35.0901 -15.3894 -12.6529 32.1415 -12.743 -14.0306 30.9567 -12.1471 -14.174 30.8083 -12.5548 -13.7699 30.3982 -13.6817 -12.6529 29.6776 -15.6615 -10.0738 28.9586 -17.6368 -5.81801 28.7413 -18.2339 -2.43989 32.3077 -15.474 -12.6529 33.4553 -21.8718 -2.43989 33.4346 -21.0798 -5.81801 33.1002 -18.3632 -10.0738 38.6078 -12.23 -7.12674 40.1086 -7.27288 -6.38726 38.9995 -19.1175 -4.30809 40.4722 -14.3091 -3.83942 41.5879 -9.21705 -2.9614 35.3982 -11.7744 -9.95378 37.4255 -10.2806 -7.9831 32.4214 -11.8209 -12.5059 31.248 -11.3468 -12.7875 31.1306 -11.6692 -12.3477 40.811 -8.02459 -5.71511 41.2912 -4.07134 -3.27877 41.7989 -5.05268 -2.97755 42.1911 -6.57271 -1.95967 30.8 -12.5778 -11.2119 29.3092 -16.6737 -2.37511 29.5047 -16.1364 -5.50835 30.1516 -14.3591 -8.98033 31.6429 -13.799 -13.1096 31.1415 -13.4054 -13.3999 31.2968 -13.0982 -13.4908 31.9486 -13.507 -13.2853 38.4029 -22.0228 -2.34885 38.5788 -22.0843 -2.36512 36.4374 -18.4987 -9.73593 33.8969 -15.4176 -12.2276 34.6447 -15.7551 -12.1616 36.7916 -18.6421 -9.71428 38.0623 -21.2475 -5.6177 38.274 -21.3209 -5.62813 29.2 -18.6717 -2.41468 29.6735 -18.8353 -2.50635 30.0479 -16.1823 -9.70267 30.6965 -14.4078 -12.3806 30.9659 -14.5535 -12.1325 30.3909 -16.2614 -9.53406 29.4753 -17.8323 -5.67988 29.9103 -17.9699 -5.73712 32.5052 -15.2826 -12.0854 37.922 -21.6885 -2.40367 37.9955 -18.8919 -4.14823 37.7423 -20.9606 -5.62625 36.7707 -18.4306 -9.7123 37.1502 -16.6445 -7.80245 34.6978 -15.5355 -12.1746 34.8908 -13.9542 -9.95446 32.0848 -13.1318 -13.1425 32.3548 -12.4633 -12.1694 31.3875 -12.7273 -13.3917 31.6254 -12.1303 -12.4919 31.2453 -12.8767 -13.4893 31.5204 -12.174 -12.3091 30.8616 -13.9478 -12.4927 30.1769 -15.8769 -9.89028 29.552 -17.6161 -5.87996 29.2603 -18.4264 -2.5163 33.6495 -21.3369 -2.34382 33.6156 -20.5672 -5.61126 33.2569 -17.9287 -9.73011 39.5553 -14.0354 -3.6229 38.3069 -12.2143 -6.72532 40.8019 -9.05754 -2.80834 37.3425 -10.284 -7.8698 37.1764 -10.2908 -7.64321 37.0934 -10.2942 -7.52992 40.0165 -7.28835 -6.29475 39.8323 -7.31929 -6.10974 39.7402 -7.33476 -6.01723 40.3016 -8.00008 -5.38928 35.3158 -11.791 -9.84028 35.1508 -11.8241 -9.61327 35.0684 -11.8407 -9.49977 32.5082 -11.4416 -11.6322 32.3884 -11.6497 -11.483 32.3285 -11.7538 -11.4084 31.5477 -10.9322 -11.7979 31.7416 -11.217 -11.7484 31.774 -11.5368 -11.5738 31.455 -11.187 -11.4963 31.6532 -11.46 -11.3466 31.7845 -11.5078 -11.3466 31.3255 -12.769 -11.2119 31.1035 -12.1525 -10.5943 31.3663 -12.2481 -10.5943 31.4977 -12.2959 -10.5943 41.1742 -4.11559 -3.21812 40.9403 -4.20407 -3.09682 40.8233 -4.24832 -3.03618 41.2813 -5.15996 -2.75771 41.4687 -6.4954 -1.80478 29.8347 -16.8649 -2.37511 29.6839 -16.0528 -2.34735 29.9467 -16.1484 -2.34735 30.0781 -16.1963 -2.34735 30.0303 -16.3276 -5.50835 29.8702 -15.5412 -5.37563 30.1329 -15.6368 -5.37563 30.2643 -15.6846 -5.37563 30.6772 -14.5504 -8.98033 30.4861 -13.8488 -8.51171 30.7489 -13.9444 -8.51171 30.8803 -13.9922 -8.51171 28.3722 -19.248 0 29.2328 -19.5613 0 28.6506 -18.4831 0 29.4748 -16.2185 0 29.2276 -16.8979 0 29.1338 -18.8939 0 29.611 -19.0851 0 29.1856 -18.6361 0 29.7531 -17.0892 0 29.6062 -16.2663 0 29.869 -16.362 0 30.0004 -16.4098 0 38.9853 -23.1109 0 38.3622 -22.8841 0 39.2637 -22.346 0 33.4436 -22.1949 0 39.3089 -19.7951 0 38.4971 -22.3285 0 38.6526 -22.3851 0 38.1873 -19.4894 0 37.9641 -21.9707 0 33.6399 -21.6473 0 40.9589 -14.7996 0 39.8884 -14.4478 0 42.1476 -9.69492 0 41.1941 -9.44314 0 42.52 -6.10773 0 42.2528 -4.19503 0 41.7902 -3.43875 0 41.7184 -6.07298 0 41.6939 -4.37856 0 41.6841 -3.47806 0 41.4719 -3.5567 0 41.3658 -3.59602 0 2.26879 46.8666 0 2.26879 50.1374 0 6.65661 49.8534 0 12.7156 48.6616 0 18.5243 46.5662 0 23.9488 43.6156 0 28.8641 39.8777 0 33.1568 35.4388 0 36.728 30.4011 0 39.4954 24.8809 0 41.3952 19.0053 0 38.2156 18.2382 0 36.4687 23.6413 0 33.9238 28.7176 0 30.6398 33.3501 0 26.6923 37.432 0 22.1723 40.8693 0 17.184 43.5826 0 11.8425 45.5095 0 6.27078 46.6055 0 2.26879 46.8666 -5.55064 2.26879 47.7055 -6.38954 2.26879 49.2985 -6.38954 2.26879 50.1374 -5.55064 6.65661 49.8534 -5.55064 6.55765 49.0204 -6.38954 12.7156 48.6616 -5.55064 12.4916 47.8531 -6.38954 18.5243 46.5662 -5.55064 18.1805 45.801 -6.38954 23.9488 43.6156 -5.55064 23.4932 42.9112 -6.38954 28.8641 39.8777 -5.55064 28.307 39.2504 -6.38954 33.1568 35.4388 -5.55064 32.5112 34.9031 -6.38954 36.728 30.4011 -5.55064 36.0088 29.9693 -6.38954 39.4954 24.8809 -5.55064 38.7191 24.5629 -6.38954 41.3952 19.0053 -5.55064 40.5797 18.8085 -6.38954 41.5933 7.63018 -6.38954 42.4303 7.57383 -5.55064 39.1669 7.79354 -5.55064 40.0039 7.73718 -6.38954 39.0311 18.4349 -6.38954 38.2156 18.2382 -5.55064 37.245 23.9592 -6.38954 36.4687 23.6413 -5.55064 34.6431 29.1494 -6.38954 33.9238 28.7176 -5.55064 31.2854 33.8858 -6.38954 30.6398 33.3501 -5.55064 27.2493 38.0593 -6.38954 26.6923 37.432 -5.55064 22.6279 41.5737 -6.38954 22.1723 40.8693 -5.55064 17.5278 44.3479 -6.38954 17.184 43.5826 -5.55064 12.0664 46.318 -6.38954 11.8425 45.5095 -5.55064 6.36974 47.4385 -6.38954 6.27078 46.6055 -5.55064 2.26879 47.7055 6.38954 2.26879 46.8666 5.55064 2.26879 49.2985 6.38954 2.26879 50.1374 5.55064 6.55765 49.0204 6.38954 6.65661 49.8534 5.55064 12.4916 47.8531 6.38954 12.7156 48.6616 5.55064 18.1805 45.801 6.38954 18.5243 46.5662 5.55064 23.4932 42.9112 6.38954 23.9488 43.6156 5.55064 28.307 39.2504 6.38954 28.8641 39.8777 5.55064 32.5112 34.9031 6.38954 33.1568 35.4388 5.55064 36.0088 29.9693 6.38954 36.728 30.4011 5.55064 38.7191 24.5629 6.38954 39.4954 24.8809 5.55064 40.5797 18.8085 6.38954 41.3952 19.0053 5.55064 42.4303 7.57383 5.55064 41.5933 7.63018 6.38954 40.0039 7.73718 6.38954 39.1669 7.79354 5.55064 38.2156 18.2382 5.55064 39.0311 18.4349 6.38954 36.4687 23.6413 5.55064 37.245 23.9592 6.38954 33.9238 28.7176 5.55064 34.6431 29.1494 6.38954 30.6398 33.3501 5.55064 31.2854 33.8858 6.38954 26.6923 37.432 5.55064 27.2493 38.0593 6.38954 22.1723 40.8693 5.55064 22.6279 41.5737 6.38954 17.184 43.5826 5.55064 17.5278 44.3479 6.38954 11.8425 45.5095 5.55064 12.0664 46.318 6.38954 6.27078 46.6055 5.55064 6.36974 47.4385 6.38954 42.4303 7.57383 0 39.1669 7.79354 0 41.3577 7.10483 -5.90741 41.913 7.06745 -5.35093 39.6117 7.22239 -5.35093 40.1669 7.18501 -5.90741 41.913 7.06745 5.35093 41.3577 7.10483 5.90741 40.1669 7.18501 5.90741 39.6117 7.22239 5.35094 41.913 7.06745 0 39.6117 7.22239 0 41.7415 7.6825 0 41.6901 7.6783 2.82599 41.7536 7.67727 5.07011 39.8952 7.67941 5.06932 40.0036 7.67417 4.35142 40.433 7.69764 2.74187 40.5889 7.70137 0 40.433 7.69764 -2.74187 40.0036 7.67417 -4.35142 39.8952 7.67941 -5.06932 41.7536 7.67727 -5.07011 41.6901 7.6783 -2.82599 -2.26879 46.8666 0 -2.26879 50.1374 0 -6.65661 49.8534 0 -12.7156 48.6616 0 -18.5243 46.5662 0 -23.9488 43.6156 0 -28.8641 39.8777 0 -33.1568 35.4388 0 -36.728 30.4011 0 -39.4954 24.8809 0 -41.3952 19.0053 0 -38.2156 18.2382 0 -36.4687 23.6413 0 -33.9238 28.7176 0 -30.6398 33.3501 0 -26.6923 37.432 0 -22.1723 40.8693 0 -17.184 43.5826 0 -11.8425 45.5095 0 -6.27078 46.6055 0 -2.26879 46.8666 -5.55064 -2.26879 47.7055 -6.38954 -2.26879 49.2985 -6.38954 -2.26879 50.1374 -5.55064 -6.65661 49.8534 -5.55064 -6.55765 49.0204 -6.38954 -12.7156 48.6616 -5.55064 -12.4916 47.8531 -6.38954 -18.5243 46.5662 -5.55064 -18.1805 45.801 -6.38954 -23.9488 43.6156 -5.55064 -23.4932 42.9112 -6.38954 -28.8641 39.8777 -5.55064 -28.307 39.2504 -6.38954 -33.1568 35.4388 -5.55064 -32.5112 34.9031 -6.38954 -36.728 30.4011 -5.55064 -36.0088 29.9693 -6.38954 -39.4954 24.8809 -5.55064 -38.7191 24.5629 -6.38954 -41.3952 19.0053 -5.55064 -40.5797 18.8085 -6.38954 -41.5933 7.63018 -6.38954 -42.4303 7.57383 -5.55064 -39.1669 7.79354 -5.55064 -40.0039 7.73718 -6.38954 -39.0311 18.4349 -6.38954 -38.2156 18.2382 -5.55064 -37.245 23.9592 -6.38954 -36.4687 23.6413 -5.55064 -34.6431 29.1494 -6.38954 -33.9238 28.7176 -5.55064 -31.2854 33.8858 -6.38954 -30.6398 33.3501 -5.55064 -27.2493 38.0593 -6.38954 -26.6923 37.432 -5.55064 -22.6279 41.5737 -6.38954 -22.1723 40.8693 -5.55064 -17.5278 44.3479 -6.38954 -17.184 43.5826 -5.55064 -12.0664 46.318 -6.38954 -11.8425 45.5095 -5.55064 -6.36974 47.4385 -6.38954 -6.27078 46.6055 -5.55064 -2.26879 47.7055 6.38954 -2.26879 46.8666 5.55064 -2.26879 49.2985 6.38954 -2.26879 50.1374 5.55064 -6.55765 49.0204 6.38954 -6.65661 49.8534 5.55064 -12.4916 47.8531 6.38954 -12.7156 48.6616 5.55064 -18.1805 45.801 6.38954 -18.5243 46.5662 5.55064 -23.4932 42.9112 6.38954 -23.9488 43.6156 5.55064 -28.307 39.2504 6.38954 -28.8641 39.8777 5.55064 -32.5112 34.9031 6.38954 -33.1568 35.4388 5.55064 -36.0088 29.9693 6.38954 -36.728 30.4011 5.55064 -38.7191 24.5629 6.38954 -39.4954 24.8809 5.55064 -40.5797 18.8085 6.38954 -41.3952 19.0053 5.55064 -42.4303 7.57383 5.55064 -41.5933 7.63018 6.38954 -40.0039 7.73718 6.38954 -39.1669 7.79354 5.55064 -38.2156 18.2382 5.55064 -39.0311 18.4349 6.38954 -36.4687 23.6413 5.55064 -37.245 23.9592 6.38954 -33.9238 28.7176 5.55064 -34.6431 29.1494 6.38954 -30.6398 33.3501 5.55064 -31.2854 33.8858 6.38954 -26.6923 37.432 5.55064 -27.2493 38.0593 6.38954 -22.1723 40.8693 5.55064 -22.6279 41.5737 6.38954 -17.184 43.5826 5.55064 -17.5278 44.3479 6.38954 -11.8425 45.5095 5.55064 -12.0664 46.318 6.38954 -6.27078 46.6055 5.55064 -6.36974 47.4385 6.38954 -42.4303 7.57383 0 -39.1669 7.79354 0 -41.3577 7.10483 -5.90741 -41.913 7.06745 -5.35093 -39.6117 7.22239 -5.35093 -40.1669 7.18501 -5.90741 -41.913 7.06745 5.35093 -41.3577 7.10483 5.90741 -40.1669 7.18501 5.90741 -39.6117 7.22239 5.35094 -41.913 7.06745 0 -39.6117 7.22239 0 42.2569 13.6903 0 42.5045 12.1288 0 39.0173 11.8326 0 38.9979 13.4134 0 42.2569 13.6903 -5.55064 42.5045 12.1288 -5.93918 41.6101 12.0528 -6.8368 41.4211 13.6193 -6.38954 39.8338 13.4844 -6.38954 39.9117 11.9086 -6.8368 39.0173 11.8326 -5.93918 38.9979 13.4134 -5.55064 41.4211 13.6193 6.38954 41.6101 12.0528 6.8368 42.5045 12.1288 5.93918 42.2569 13.6903 5.55064 38.9979 13.4134 5.55064 39.0173 11.8326 5.93918 39.9117 11.9086 6.8368 39.8338 13.4844 6.38954 -42.5045 12.1288 0 -42.2569 13.6903 0 -38.9979 13.4134 0 -39.0173 11.8326 0 -42.2569 13.6903 -5.55064 -42.5045 12.1288 -5.93918 -41.4211 13.6193 -6.38954 -41.6101 12.0528 -6.8368 -39.9117 11.9086 -6.8368 -39.8338 13.4844 -6.38954 -39.0173 11.8326 -5.93918 -38.9979 13.4134 -5.55064 -41.6101 12.0528 6.8368 -41.4211 13.6193 6.38954 -42.2569 13.6903 5.55064 -42.5045 12.1288 5.93918 -39.0173 11.8326 5.93918 -38.9979 13.4134 5.55064 -39.9117 11.9086 6.8368 -39.8338 13.4844 6.38954 -42.5002 12.9197 0 -42.5002 12.9197 -5.92919 41.5891 12.8423 6.8253 42.5002 12.9197 5.92919 38.9479 12.6179 5.92919 38.9479 12.6179 0 -41.5891 12.8423 -6.8253 -39.859 12.6953 -6.8253 38.9479 12.6179 -5.92919 39.859 12.6953 -6.8253 -41.5891 12.8423 6.8253 -42.5002 12.9197 5.92919 39.859 12.6953 6.8253 -39.859 12.6953 6.8253 -38.9479 12.6179 0 -38.9479 12.6179 5.92919 -38.9479 12.6179 -5.92919 41.5891 12.8423 -6.8253 42.5002 12.9197 -5.92919 42.5002 12.9197 0 -41.0358 1.45843 3.02491 -40.0585 -2.85087 5.11285 -38.3141 -7.28645 6.05386 -41.5534 5.08738 2.82599 -39.0034 -2.78983 5.10091 -38.2918 -2.86791 6.1526 -39.4206 1.68737 4.63022 -39.9566 1.81482 2.8632 -37.4312 -6.96178 6.05155 -36.8421 -6.79753 6.94469 -40.2991 5.17249 2.74187 -39.869 5.17153 4.35142 -38.4357 -7.13643 7.60584 -38.2967 -7.30787 4.23102 -41.1984 1.75076 5.28422 -40.0585 -2.85087 6.7955 -40.0314 -2.94048 3.10001 -40.6607 -0.506353 1.58287 -41.6167 5.08303 5.07011 -39.7611 5.18243 5.06932 -39.3573 1.91479 5.28277 -38.263 -2.5664 6.7955 -36.7986 -6.57934 7.61329 -39.8702 -2.88533 3.09597 -40.4948 -0.469227 1.58351 -38.1597 -7.21039 4.23068 -37.6345 -7.00927 4.23014 -39.2813 -2.79117 3.08937 -39.8899 -0.404788 1.58456 -37.6 -7.09958 3.86024 -39.2542 -2.93965 2.73803 -39.8555 -0.668652 1.30965 -34.203 -16.9786 6.05386 -34.3115 -16.826 7.60584 -34.1875 -17.0004 4.23102 -34.157 -16.7402 7.60733 -34.0392 -16.9031 4.23068 -33.2202 -16.6826 6.04405 -33.4613 -16.7958 3.86024 -33.4875 -16.7041 4.23014 -32.6384 -16.4488 6.9325 -32.5986 -16.2744 7.61329 -38.0936 -2.66652 3.11071 -36.7245 -6.59999 4.28698 -32.3727 -16.3058 4.28279 -38.7043 -0.35177 1.60975 -38.2934 -2.85245 2.64585 -36.8985 -6.72878 3.77432 -32.5825 -16.3935 3.77215 -38.8525 -0.713107 1.26675 -38.8879 -2.88716 3.80686 -37.3352 -6.94885 4.97355 -33.1258 -16.6582 4.98199 -39.7792 0.252845 2.02742 -38.9115 -2.86728 4.07111 -37.3548 -6.95149 5.19368 -33.1451 -16.6631 5.19887 -39.8436 0.526463 2.23323 -39.6174 1.48775 4.26116 -38.7586 -2.85196 5.93784 -37.2839 -6.83107 6.76231 -33.0787 -16.4966 6.75107 -40.054 3.48323 3.90016 -40.3843 3.94176 2.61978 -32.7251 -16.5042 7.48569 -34.0063 -16.9151 7.48043 -34.0958 -16.9515 7.4507 -34.0033 -17.0719 6.09107 -33.9996 -17.0571 4.52725 -33.9055 -17.0108 4.42492 -33.2978 -16.7624 4.32589 -33.2709 -16.8565 3.96545 -32.6508 -16.5276 3.97262 -32.5219 -16.5153 4.26848 -33.1961 -16.8624 4.83592 -33.2593 -16.8544 5.21753 -33.3389 -16.8684 6.09099 -33.1764 -16.6501 6.90681 -32.7486 -16.6073 7.08346 -34.4232 -16.5636 7.60584 -34.3846 -16.5504 6.05386 -34.3791 -16.5485 4.23102 -34.2568 -16.5064 7.60733 -34.2141 -16.4917 4.23068 -33.66 -16.301 4.23014 -33.6709 -16.3047 3.86024 -32.8276 -16.0145 6.93305 -32.7263 -15.9797 7.61329 -32.8919 -15.9902 3.77224 -32.677 -15.9163 4.28296 -33.3299 -16.1874 4.98158 -33.3486 -16.1938 5.19862 -33.4211 -16.2188 6.04441 -33.2284 -16.1525 6.75147 -41.0358 1.45843 -3.02491 -40.0585 -2.85087 -5.11285 -38.3141 -7.28645 -6.05386 -41.5534 5.08738 -2.82599 -39.0034 -2.78983 -5.10091 -38.2918 -2.86791 -6.1526 -39.4206 1.68737 -4.63022 -39.9566 1.81482 -2.8632 -37.4312 -6.96178 -6.05155 -36.8421 -6.79753 -6.94469 -40.2991 5.17249 -2.74187 -39.869 5.17153 -4.35142 -38.4357 -7.13643 -7.60584 -38.2967 -7.30787 -4.23102 -41.1984 1.75076 -5.28422 -40.0585 -2.85087 -6.7955 -40.0314 -2.94048 -3.10001 -40.6607 -0.506353 -1.58287 -41.6167 5.08303 -5.07011 -39.7611 5.18243 -5.06932 -39.3573 1.91479 -5.28277 -38.263 -2.5664 -6.7955 -36.7986 -6.57934 -7.61329 -39.8702 -2.88533 -3.09597 -40.4948 -0.469227 -1.58351 -38.1597 -7.21039 -4.23068 -37.6345 -7.00927 -4.23014 -39.2813 -2.79117 -3.08937 -39.8899 -0.404788 -1.58456 -37.6 -7.09958 -3.86024 -39.2542 -2.93965 -2.73803 -39.8555 -0.668652 -1.30965 -34.203 -16.9786 -6.05386 -34.3115 -16.826 -7.60584 -34.1875 -17.0004 -4.23102 -34.157 -16.7402 -7.60733 -34.0392 -16.9031 -4.23068 -33.2202 -16.6826 -6.04405 -33.4613 -16.7958 -3.86024 -33.4875 -16.7041 -4.23014 -32.6384 -16.4488 -6.9325 -32.5986 -16.2744 -7.61329 -38.0936 -2.66652 -3.11071 -36.7245 -6.59999 -4.28698 -32.3727 -16.3058 -4.28279 -38.7043 -0.35177 -1.60975 -38.2934 -2.85245 -2.64586 -36.8985 -6.72878 -3.77432 -32.5825 -16.3935 -3.77215 -38.8525 -0.713107 -1.26675 -38.8879 -2.88716 -3.80686 -37.3352 -6.94885 -4.97355 -33.1258 -16.6582 -4.98199 -39.7792 0.252845 -2.02742 -38.9115 -2.86728 -4.07111 -37.3548 -6.95149 -5.19368 -33.1451 -16.6631 -5.19887 -39.8436 0.526463 -2.23323 -39.6174 1.48775 -4.26116 -38.7586 -2.85196 -5.93784 -37.2839 -6.83107 -6.76231 -33.0787 -16.4966 -6.75107 -40.054 3.48323 -3.90016 -40.3843 3.94176 -2.61978 -32.7251 -16.5042 -7.48569 -34.0063 -16.9151 -7.48043 -34.0958 -16.9515 -7.4507 -34.0033 -17.0719 -6.09107 -33.9996 -17.0571 -4.52725 -33.9055 -17.0108 -4.42492 -33.2978 -16.7624 -4.32589 -33.2709 -16.8565 -3.96545 -32.6508 -16.5276 -3.97262 -32.5219 -16.5153 -4.26848 -33.1961 -16.8624 -4.83592 -33.2593 -16.8544 -5.21753 -33.3389 -16.8684 -6.09099 -33.1764 -16.6501 -6.90681 -32.7486 -16.6073 -7.08346 -34.4232 -16.5636 -7.60584 -34.3846 -16.5504 -6.05386 -34.3791 -16.5485 -4.23102 -34.2568 -16.5064 -7.60733 -34.2141 -16.4917 -4.23068 -33.66 -16.301 -4.23014 -33.6709 -16.3047 -3.86024 -32.8276 -16.0145 -6.93305 -32.7263 -15.9797 -7.61329 -32.8919 -15.9902 -3.77224 -32.677 -15.9163 -4.28296 -33.3299 -16.1874 -4.98158 -33.3486 -16.1938 -5.19862 -33.4211 -16.2188 -6.04441 -33.2284 -16.1525 -6.75147 -41.2422 2.51901 0 -41.6049 5.08889 0 -40.2836 3.10687 0 -40.4549 5.16806 0 -40.7581 0.574058 0 -40.5938 0.606495 0 -39.9863 0.662585 0 -39.9444 0.281999 0 -38.7266 0.699332 0 -38.8948 0.188449 0 -39.8289 1.74732 0 -39.9654 2.16694 0 -40.5692 4.36144 0 -31.7005 -8.70096 5.92036 -31.9349 -8.05701 0 -32.2328 -7.23853 0 -31.9571 -7.99599 6.00027 -31.0049 -10.6122 10.7946 -31.2357 -9.97807 10.9907 -31.1488 -10.2168 11.5916 -30.904 -10.8894 11.5017 -30.8822 -10.9492 5.23555 -31.0735 -10.4236 0 -29.6923 -14.2184 6.54629 -29.8377 -13.819 6.23884 -30.3692 -12.3586 9.13231 -30.2735 -12.6215 9.85917 -29.5747 -14.5415 0 -29.5887 -14.5032 3.15953 -29.3653 -15.1169 2.80102 -29.3247 -15.2283 0 -31.7005 -8.70096 -5.92036 -31.9571 -7.99599 -6.00027 -31.0049 -10.6122 -10.7946 -30.904 -10.8894 -11.5017 -31.1488 -10.2168 -11.5916 -31.2357 -9.97807 -10.9907 -30.8822 -10.9492 -5.23555 -29.6923 -14.2184 -6.54629 -30.2735 -12.6215 -9.85917 -30.3692 -12.3586 -9.13231 -29.8377 -13.819 -6.23884 -29.3653 -15.1169 -2.80102 -29.5887 -14.5032 -3.15953 -32.9222 -7.63431 0 -32.6463 -8.39208 6.00027 -31.925 -10.374 10.9907 -31.8382 -10.6126 11.5916 -31.638 -11.1626 11.5017 -30.4275 -14.4882 6.54629 -31.0081 -12.8931 9.85917 -30.1009 -15.3858 2.80102 -30.0604 -15.4971 0 -32.6463 -8.39208 -6.00027 -31.638 -11.1626 -11.5017 -31.8382 -10.6126 -11.5916 -31.925 -10.374 -10.9907 -30.4275 -14.4882 -6.54629 -31.0081 -12.8931 -9.85917 -30.1009 -15.3858 -2.80102 -34.9157 -10.9246 4.4689 -35.0873 -10.4533 4.52896 -35.3116 -9.83695 0 -34.3591 -12.4539 8.63155 -34.2792 -12.6735 9.19695 -34.438 -12.237 9.26884 -34.5072 -12.047 8.78831 -34.2619 -12.7208 3.95417 -33.3333 -15.2723 5.23452 -33.784 -14.034 7.88355 -33.8587 -13.8288 7.30233 -33.4456 -14.9638 4.98868 -33.0506 -16.049 0 -33.0817 -15.9635 2.12429 -33.2534 -15.4917 2.39375 -34.9157 -10.9246 -4.4689 -35.0873 -10.4533 -4.52896 -34.3591 -12.4539 -8.63155 -34.5072 -12.047 -8.78831 -34.438 -12.237 -9.26884 -34.2792 -12.6735 -9.19695 -34.2619 -12.7208 -3.95417 -33.3333 -15.2723 -5.23452 -33.4456 -14.9638 -4.98868 -33.8587 -13.8288 -7.30233 -33.784 -14.034 -7.88355 -33.2534 -15.4917 -2.39375 -33.0817 -15.9635 -2.12429 -33.1792 -11.2899 10.8198 -33.2601 -11.0675 10.2588 -33.9349 -9.21368 5.60072 -34.1938 -8.50223 0 -33.9349 -9.21368 -5.60072 -33.2601 -11.0675 -10.2588 -33.1792 -11.2899 -10.8198 -32.9928 -11.8019 -10.7358 -32.4085 -13.4072 -9.20267 -31.8722 -14.8808 -6.11039 -31.5709 -15.7086 -2.61451 -31.5335 -15.8112 0 -31.5709 -15.7086 2.61451 -31.8722 -14.8808 6.11039 -32.4085 -13.4072 9.20267 -32.9928 -11.8019 10.7358 -34.8946 -10.2416 4.93291 -35.125 -9.60879 0 -34.8946 -10.2416 -4.93291 -34.2984 -11.8798 -9.0356 -34.2272 -12.0753 -9.52965 -34.0637 -12.5245 -9.45574 -33.5538 -13.9256 -8.10538 -33.0891 -15.2022 -5.38181 -32.8295 -15.9154 -2.30276 -32.7974 -16.0037 0 -32.8295 -15.9154 2.30276 -33.0891 -15.2022 5.38181 -33.5538 -13.9256 8.10538 -34.0637 -12.5245 9.45574 -34.2272 -12.0753 9.52965 -34.2984 -11.8798 9.0356 -37.3412 -12.1916 3.4624 -37.517 -11.6753 3.51654 -37.7416 -11.0558 -0.080431 -37.5309 -11.6705 0 -36.6875 -13.9879 3.07121 -36.8392 -13.5711 0 -35.6682 -16.7883 0 -35.4343 -17.3658 -0.080428 -35.4666 -17.2792 1.68651 -35.679 -16.7587 1.88529 -37.3412 -12.1916 -3.4624 -37.517 -11.6753 -3.51655 -36.6875 -13.9879 -3.07121 -35.679 -16.7587 -1.88529 -35.4664 -17.2793 -1.68654 -37.2689 -11.5506 3.51567 -37.4935 -10.9314 -0.080431 -35.3353 -10.578 3.50892 -35.5597 -9.96139 -0.080428 -37.2689 -11.5505 -3.51568 -35.3353 -10.578 -3.50892 -37.0936 -12.0623 -3.4624 -35.1633 -11.054 -3.4624 -36.4398 -13.8585 -3.07121 -34.5096 -12.8502 -3.07121 -35.4313 -16.6294 -1.88529 -33.5011 -15.6211 -1.88529 -35.2229 -17.145 -1.68592 -33.3252 -16.0979 -1.68112 -35.1909 -17.2314 -0.080428 -33.294 -16.1835 -0.080428 -35.2231 -17.1449 1.6859 -33.3252 -16.0979 1.68111 -35.4313 -16.6294 1.88529 -33.5011 -15.6211 1.88529 -36.4398 -13.8585 3.07121 -34.5096 -12.8502 3.07121 -37.0936 -12.0623 3.4624 -35.1633 -11.054 3.4624 -18.31 -49.3874 5.82322 -19.0787 -47.2753 11.2496 -20.3017 -43.9154 15.9093 -21.8954 -39.5367 19.4849 -23.7513 -34.4376 21.7326 -25.743 -28.9655 22.4992 -27.7346 -23.4935 21.7326 -29.5906 -18.3944 19.4849 -31.1843 -14.0156 15.9093 -22.6152 -48.5625 5.22096 -23.3044 -46.6688 10.0861 -24.4008 -43.6564 14.2639 -25.8297 -39.7305 17.4697 -27.4937 -35.1588 19.4849 -29.2794 -30.2527 20.1722 -31.065 -25.3466 19.4849 -32.729 -20.7748 17.4697 -34.1579 -16.849 14.2639 -26.8748 -46.3078 4.26289 -27.4376 -44.7617 8.23528 -28.3328 -42.302 11.6464 -29.4995 -39.0966 14.2639 -30.8582 -35.3638 15.9093 -32.3162 -31.358 16.4706 -33.7742 -27.3521 15.9093 -35.1328 -23.6193 14.2639 -36.2995 -20.4139 11.6464 -30.7988 -42.7773 3.01432 -31.1967 -41.6839 5.82322 -31.8297 -39.9447 8.23528 -32.6547 -37.6781 10.0861 -33.6154 -35.0386 11.2496 -34.6464 -32.2061 11.6464 -35.6773 -29.3736 11.2496 -36.638 -26.7341 10.0861 -37.463 -24.4675 8.23528 -34.1195 -38.2113 1.56033 -34.3255 -37.6453 3.01432 -34.6532 -36.7451 4.26289 -35.0802 -35.5718 5.22096 -35.5775 -34.2055 5.82322 -36.1112 -32.7392 6.02864 -36.6448 -31.273 5.82322 -37.1421 -29.9067 5.22096 -37.5692 -28.7334 4.26289 -37.8969 -27.8331 3.01432 -38.1028 -27.2672 1.56033 -31.604 -12.8625 14.3101 -38.354 -23.6497 2.4942 -34.5144 -15.8696 12.9056 -36.659 -19.426 10.2764 -38.0783 -22.7121 5.93795 -29.7108 -14.1212 12.9056 -27.6594 -19.7572 2.4942 -28.8186 -16.5723 10.2764 -27.9285 -19.0179 5.93795 -30.4023 -12.2213 14.4563 -31.1367 -13.1731 13.9634 -37.6958 -23.4101 2.4942 -33.4618 -15.4864 12.9056 -35.9038 -19.1511 10.2764 -37.4061 -22.4674 5.93795 -38.2934 -24.5231 2.26873 -34.3925 -16.2046 13.3702 -31.4467 -13.2946 14.9094 -36.5139 -19.8249 10.8296 -29.4793 -12.1577 15.0574 -37.9886 -23.3956 5.88247 -30.29 -9.48098 11.4689 -31.0737 -7.32768 5.93672 -29.7153 -11.3786 14.0129 -31.2132 -9.99323 11.3733 -31.9904 -7.85789 5.88723 -30.5442 -11.8313 13.9167 -28.5406 -20.0779 2.4942 -30.5919 -14.4419 12.9056 -29.6998 -16.893 10.2764 -28.8096 -19.3386 5.93795 -31.0206 -10.5224 11.285 -30.3423 -12.3859 13.6718 -31.7865 -8.4181 5.80883 -30.2186 -12.726 14.0444 -28.236 -18.1732 5.85284 -27.9841 -18.8652 2.75494 -29.0839 -15.8435 10.3979 -30.04 -13.2167 10.8358 -29.8527 -13.7313 12.3979 -30.3057 -12.4866 4.57892 -28.9787 -16.1325 2.44005 -32.1577 -14.6045 12.8849 -33.1557 -17.0496 10.203 -33.6844 -19.3192 5.77783 -33.7619 -19.9753 2.2652 -18.31 -49.3874 -5.82322 -19.0787 -47.2753 -11.2496 -20.3017 -43.9154 -15.9093 -21.8954 -39.5367 -19.4849 -23.7513 -34.4376 -21.7326 -25.743 -28.9655 -22.4992 -27.7346 -23.4935 -21.7326 -29.5906 -18.3944 -19.4849 -31.1843 -14.0156 -15.9093 -22.6152 -48.5625 -5.22096 -23.3044 -46.6688 -10.0861 -24.4008 -43.6564 -14.2639 -25.8297 -39.7305 -17.4697 -27.4937 -35.1588 -19.4849 -29.2794 -30.2527 -20.1722 -31.065 -25.3466 -19.4849 -32.729 -20.7748 -17.4697 -34.1579 -16.849 -14.2639 -26.8748 -46.3078 -4.26289 -27.4376 -44.7617 -8.23528 -28.3328 -42.302 -11.6464 -29.4995 -39.0966 -14.2639 -30.8582 -35.3638 -15.9093 -32.3162 -31.358 -16.4706 -33.7742 -27.3521 -15.9093 -35.1328 -23.6193 -14.2639 -36.2995 -20.4139 -11.6464 -30.7988 -42.7773 -3.01432 -31.1967 -41.6839 -5.82322 -31.8297 -39.9447 -8.23528 -32.6547 -37.6781 -10.0861 -33.6154 -35.0386 -11.2496 -34.6464 -32.2061 -11.6464 -35.6773 -29.3736 -11.2496 -36.638 -26.7341 -10.0861 -37.463 -24.4675 -8.23528 -34.1195 -38.2113 -1.56033 -34.3255 -37.6453 -3.01432 -34.6532 -36.7451 -4.26289 -35.0802 -35.5718 -5.22096 -35.5775 -34.2055 -5.82322 -36.1112 -32.7392 -6.02864 -36.6448 -31.273 -5.82322 -37.1421 -29.9067 -5.22096 -37.5692 -28.7334 -4.26289 -37.8969 -27.8331 -3.01432 -38.1028 -27.2672 -1.56033 -31.604 -12.8625 -14.3101 -38.354 -23.6497 -2.4942 -34.5144 -15.8696 -12.9056 -36.659 -19.426 -10.2764 -38.0783 -22.7121 -5.93795 -29.7108 -14.1212 -12.9056 -27.6594 -19.7572 -2.4942 -28.8186 -16.5723 -10.2764 -27.9285 -19.0179 -5.93795 -30.4023 -12.2213 -14.4563 -31.1367 -13.1731 -13.9634 -37.6958 -23.4101 -2.4942 -33.4618 -15.4864 -12.9056 -35.9038 -19.1511 -10.2764 -37.4061 -22.4674 -5.93795 -38.2934 -24.5231 -2.26873 -34.3925 -16.2046 -13.3702 -31.4467 -13.2946 -14.9094 -36.5139 -19.8249 -10.8296 -29.4793 -12.1577 -15.0574 -37.9886 -23.3956 -5.88247 -30.29 -9.48098 -11.4689 -31.0737 -7.32768 -5.93672 -29.7153 -11.3786 -14.0129 -31.2132 -9.99323 -11.3733 -31.9904 -7.85789 -5.88723 -30.5442 -11.8313 -13.9167 -28.5406 -20.0779 -2.4942 -30.5919 -14.4419 -12.9056 -29.6998 -16.893 -10.2764 -28.8096 -19.3386 -5.93795 -31.0206 -10.5224 -11.285 -30.3423 -12.3859 -13.6718 -31.7865 -8.4181 -5.80883 -30.2186 -12.726 -14.0444 -28.236 -18.1732 -5.85284 -27.9841 -18.8652 -2.75494 -29.0839 -15.8435 -10.3979 -30.04 -13.2167 -10.8358 -29.8527 -13.7313 -12.3979 -30.3057 -12.4866 -4.57892 -28.9787 -16.1325 -2.44005 -32.1577 -14.6045 -12.8849 -33.1557 -17.0496 -10.203 -33.6844 -19.3192 -5.77783 -33.7619 -19.9753 -2.2652 -18.0478 -50.1079 0 -27.5471 -20.0658 0 -28.4283 -20.3865 0 -27.9309 -19.0114 0 -29.2586 -15.3636 0 -30.5244 -11.8858 0 -31.3411 -6.59322 0 -32.2555 -7.12956 0 -32.0119 -7.79891 0 -22.3801 -49.2084 0 -26.6829 -46.8352 0 -30.663 -43.1502 0 -34.0493 -38.4043 0 -38.1731 -27.0742 0 -38.413 -24.0206 0 -37.7751 -23.7884 0 -38.3476 -24.8528 0 -33.7735 -20.2416 0 -36.4569 -32.8651 -1.74677 -36.3022 -33.2899 -1.68725 -36.1581 -33.6858 -1.51274 -36.0344 -34.0257 -1.23515 -35.9395 -34.2866 -0.873384 -35.8798 -34.4506 -0.452097 -35.8594 -34.5065 0 -35.8798 -34.4506 0.452097 -35.9395 -34.2866 0.873384 -36.0344 -34.0257 1.23515 -36.1581 -33.6858 1.51274 -36.3022 -33.2899 1.68725 -36.4569 -32.8651 1.74677 -36.6115 -32.4402 1.68725 -36.7556 -32.0443 1.51274 -36.8793 -31.7044 1.23515 -36.9742 -31.4435 0.873384 -37.0339 -31.2796 0.452096 -37.0543 -31.2236 0 -37.0339 -31.2796 -0.452096 -36.9742 -31.4435 -0.873384 -36.8793 -31.7044 -1.23515 -36.7556 -32.0443 -1.51274 -36.6115 -32.4402 -1.68725 -36.5385 -32.8948 0 -27.3075 -10.1328 14.1646 -26.5263 -12.2791 16.7118 -25.007 -16.4533 19.9408 -27.9903 -8.25675 11.1334 -28.6778 -6.3677 5.95345 -28.9449 -5.63387 0 -28.6778 -6.3677 -5.95345 -27.9903 -8.25675 -11.1334 -27.3075 -10.1328 -14.1646 -26.5263 -12.2791 -16.7118 -25.007 -16.4533 -19.9408 -23.1095 -21.6667 -22.2353 -21.0717 -27.2653 -23.0197 -19.034 -32.864 -22.2353 -17.1351 -38.0811 -19.9357 -15.5045 -42.5611 -16.2774 -14.2533 -45.9987 -11.5099 -13.4668 -48.1597 -5.95794 -13.1985 -48.8968 0 -13.4668 -48.1597 5.95794 -14.2533 -45.9987 11.5099 -15.5045 -42.5611 16.2774 -17.1351 -38.0811 19.9357 -19.034 -32.864 22.2353 -21.0717 -27.2653 23.0197 -23.1095 -21.6667 22.2353 -14.5629 -46.3631 -11.6464 -13.767 -48.5498 -6.02864 -13.4955 -49.2956 0 -14.5629 -46.3631 11.6464 -13.767 -48.5498 6.02864 -15.8289 -42.8847 -16.4706 -15.8289 -42.8847 16.4706 -17.4788 -38.3515 -20.1722 -17.4788 -38.3515 20.1722 -19.4002 -33.0725 -22.4992 -19.4002 -33.0725 22.4992 -21.4622 -27.4074 -23.2929 -21.4622 -27.4074 23.2929 -23.5241 -21.7424 -22.4992 -23.5241 -21.7424 22.4992 -25.4455 -16.4634 -20.1722 -25.4455 -16.4634 20.1722 -27.0954 -11.9302 -16.4706 -27.0954 -11.9302 16.4706 -27.6852 -10.3097 -14.2232 -28.3615 -8.45174 -11.6464 -28.3615 -8.45174 11.6464 -27.6852 -10.3097 14.2232 -29.1573 -6.26511 -6.02864 -29.4288 -5.51929 0 -29.1573 -6.26511 6.02864 -27.0498 -9.71303 14.4007 -26.2527 -11.903 16.9997 -24.7094 -16.1431 20.2797 -27.7457 -7.80091 11.3112 -28.4441 -5.8821 6.04968 -28.7155 -5.13641 -0.000000 -28.4441 -5.8821 -6.04968 -27.7457 -7.80091 -11.3112 -27.0498 -9.71303 -14.4007 -26.2527 -11.903 -16.9997 -24.7094 -16.1431 -20.2797 -22.7814 -21.4403 -22.6111 -20.7093 -27.1334 -23.4087 -18.6371 -32.8267 -22.6111 -16.7062 -38.1319 -20.2726 -15.048 -42.6877 -16.5525 -13.7757 -46.1834 -11.7044 -12.9758 -48.3809 -6.05863 -12.703 -49.1304 -0.000000 -12.9758 -48.3809 6.05863 -13.7757 -46.1834 11.7044 -15.048 -42.6877 16.5525 -16.7062 -38.1319 20.2726 -18.6371 -32.8267 22.6111 -20.7093 -27.1334 23.4087 -22.7814 -21.4403 22.6111 -26.2144 -9.18894 14.5601 -25.4066 -11.4083 17.1941 -23.8471 -15.693 20.5085 -26.9192 -7.25247 11.4313 -27.6249 -5.31357 6.11463 -27.8993 -4.55988 0.000000 -27.6249 -5.31357 -6.11463 -26.9192 -7.25247 -11.4313 -26.2144 -9.18894 -14.5601 -25.4066 -11.4083 -17.1941 -23.8471 -15.693 -20.5085 -21.8986 -21.0467 -22.8648 -19.8032 -26.8036 -23.6713 -17.7078 -32.5607 -22.8648 -15.7552 -37.9255 -20.5 -14.0784 -42.5323 -16.7382 -12.7918 -46.0673 -11.8357 -11.983 -48.2895 -6.12659 -11.7071 -49.0474 0.000000 -11.983 -48.2895 6.1266 -12.7918 -46.0673 11.8357 -14.0784 -42.5323 16.7382 -15.7552 -37.9255 20.5 -17.7078 -32.5607 22.8648 -19.8032 -26.8036 23.6713 -21.8985 -21.0467 22.8648 -25.2533 -9.01027 14.4361 -24.4539 -11.2067 17.0429 -22.907 -15.4568 20.3306 -25.9512 -7.09274 11.3379 -26.6513 -5.16946 6.06411 -26.9233 -4.42199 0.000002 -26.6513 -5.16946 -6.06411 -25.9512 -7.09274 -11.3379 -25.2533 -9.01027 -14.4361 -24.4539 -11.2067 -17.0429 -22.907 -15.4568 -20.3306 -20.9744 -20.7665 -22.6675 -18.8971 -26.4738 -23.4671 -16.8198 -32.1813 -22.6675 -14.884 -37.4998 -20.3231 -13.2217 -42.0668 -16.5937 -11.9462 -45.5713 -11.7335 -11.1444 -47.7743 -6.07373 -10.8709 -48.5257 0.000002 -11.1444 -47.7743 6.07373 -11.9462 -45.5713 11.7336 -13.2217 -42.0668 16.5938 -14.884 -37.4998 20.3231 -16.8198 -32.1813 22.6675 -18.8971 -26.4738 23.4671 -20.9744 -20.7665 22.6675 -24.794 -9.14461 14.2177 -24.0092 -11.3007 16.7766 -22.4845 -15.4898 20.0171 -25.4797 -7.26045 11.1734 -26.1697 -5.3647 5.9751 -26.4378 -4.62821 0.000002 -26.1697 -5.3647 -5.9751 -25.4797 -7.26045 -11.1734 -24.794 -9.14461 -14.2177 -24.0092 -11.3007 -16.7766 -22.4845 -15.4898 -20.0171 -20.5801 -20.722 -22.3199 -18.5347 -26.3419 -23.1072 -16.4892 -31.9618 -22.3199 -14.5831 -37.1988 -20.0115 -12.9463 -41.6958 -16.3393 -11.6903 -45.1465 -11.5536 -10.9008 -47.3157 -5.98059 -10.6315 -48.0556 0.000002 -10.9008 -47.3157 5.9806 -11.6903 -45.1465 11.5536 -12.9463 -41.6958 16.3393 -14.5831 -37.1988 20.0115 -16.4892 -31.9618 22.3199 -18.5347 -26.3419 23.1073 -20.5801 -20.722 22.3199 -24.5387 -8.77462 14.4184 -23.7404 -10.9678 17.0213 -22.1953 -15.2129 20.3052 -25.2356 -6.8598 11.3246 -25.9348 -4.93875 6.0569 -26.2066 -4.19217 0.000003 -25.9348 -4.93875 -6.05689 -25.2356 -6.8598 -11.3246 -24.5387 -8.77462 -14.4184 -23.7404 -10.9678 -17.0213 -22.1953 -15.2129 -20.3051 -20.2651 -20.5163 -22.6393 -18.1903 -26.2166 -23.4379 -16.1156 -31.9169 -22.6393 -14.1822 -37.2288 -20.2978 -12.522 -41.7902 -16.5731 -11.2481 -45.2903 -11.719 -10.4472 -47.4906 -6.06618 -10.1741 -48.241 0.000003 -10.4472 -47.4906 6.06618 -11.2481 -45.2903 11.719 -12.522 -41.7902 16.5731 -14.1822 -37.2288 20.2978 -16.1156 -31.9169 22.6393 -18.1903 -26.2166 23.4379 -20.2651 -20.5163 22.6393 -23.3031 -8.50421 14.2886 -22.5136 -10.6734 16.863 -20.9817 -14.8822 20.1187 -23.9929 -6.60922 11.2268 -24.6861 -4.70455 6.00397 -24.9555 -3.96449 0.000004 -24.6861 -4.70455 -6.00396 -23.9929 -6.60922 -11.2267 -23.3031 -8.50421 -14.2885 -22.5136 -10.6734 -16.863 -20.9817 -14.8822 -20.1187 -19.0682 -20.1396 -22.4326 -17.0124 -25.7879 -23.224 -14.9566 -31.4362 -22.4326 -13.0409 -36.6995 -20.1125 -11.3958 -41.2193 -16.4218 -10.1335 -44.6875 -11.612 -9.34 -46.8676 -6.0108 -9.06934 -47.6112 0.000004 -9.34 -46.8676 6.01081 -10.1335 -44.6875 11.612 -11.3958 -41.2193 16.4218 -13.0409 -36.6995 20.1125 -14.9566 -31.4362 22.4326 -17.0124 -25.7879 23.224 -19.0682 -20.1396 22.4326 -21.4425 -8.68268 13.6687 -20.6946 -10.7373 16.1071 -19.2257 -14.7731 19.2291 -22.0977 -6.88237 10.7599 -22.7625 -5.05583 5.75137 -23.0205 -4.34691 0.000007 -22.7625 -5.05583 -5.75135 -22.0977 -6.88237 -10.7599 -21.4425 -8.68268 -13.6687 -20.6946 -10.7373 -16.1071 -19.2257 -14.7731 -19.2291 -17.3922 -19.8106 -21.4462 -15.4267 -25.2107 -22.2028 -13.4613 -30.6107 -21.4462 -11.6298 -35.6426 -19.2281 -10.0571 -39.9636 -15.6997 -8.85032 -43.2793 -11.1014 -8.09169 -45.3636 -5.74649 -7.83294 -46.0745 0.000007 -8.09169 -45.3636 5.7465 -8.85032 -43.2793 11.1014 -10.0571 -39.9636 15.6997 -11.6298 -35.6426 19.2282 -13.4613 -30.6107 21.4462 -15.4267 -25.2107 22.2028 -17.3922 -19.8106 21.4462 -19.3772 -10.5226 11.7916 -18.7558 -12.2301 13.818 -17.4775 -15.742 16.5347 -19.9281 -9.00902 9.34606 -20.5068 -7.41909 4.98633 -20.7305 -6.80447 0.00001 -20.5068 -7.41909 -4.98631 -19.9281 -9.00902 -9.34604 -19.3772 -10.5226 -11.7915 -18.7558 -12.2301 -13.818 -17.4775 -15.742 -16.5347 -15.8865 -20.1135 -18.4587 -14.1944 -24.7622 -19.11 -12.5028 -29.41 -18.4588 -10.9264 -33.741 -16.5497 -9.57279 -37.4601 -13.5128 -8.5341 -40.3139 -9.55498 -7.88115 -42.1078 -4.94602 -7.65843 -42.7197 0.00001 -7.88114 -42.1078 4.94604 -8.53409 -40.3139 9.555 -9.57278 -37.4601 13.5128 -10.9264 -33.741 16.5497 -12.5028 -29.4099 18.4588 -14.1944 -24.7622 19.11 -15.8864 -20.1135 18.4587 -18.3016 -12.2092 10.2863 -17.7814 -13.6384 11.9824 -16.6561 -16.7302 14.3741 -18.7688 -10.9256 8.2123 -19.2784 -9.52541 4.37286 -19.4746 -8.98641 0.000011 -19.2784 -9.52541 -4.37284 -18.7688 -10.9256 -8.21228 -18.3016 -12.2092 -10.2863 -17.7814 -13.6384 -11.9824 -16.6561 -16.7302 -14.3741 -15.2594 -20.5676 -16.063 -13.7867 -24.6138 -16.6299 -12.3146 -28.6584 -16.0633 -10.9428 -32.4273 -14.4019 -9.76484 -35.6638 -11.7591 -8.86094 -38.1472 -8.31495 -8.29273 -39.7083 -4.30413 -8.09891 -40.2408 0.000012 -8.29272 -39.7083 4.30415 -8.86093 -38.1472 8.31498 -9.76482 -35.6638 11.7591 -10.9428 -32.4273 14.402 -12.3146 -28.6584 16.0633 -13.7867 -24.6138 16.6299 -15.2594 -20.5676 16.0631 -18.3733 -13.1399 9.63104 -17.8972 -14.4479 11.1834 -16.8384 -17.3569 13.4337 -18.8041 -11.9564 7.71878 -19.2836 -10.6388 4.10582 -19.4678 -10.1327 0.000009 -19.2837 -10.6388 -4.1058 -18.8041 -11.9564 -7.71876 -18.3733 -13.1399 -9.63102 -17.8973 -14.4479 -11.1834 -16.8385 -17.3569 -13.4336 -15.5264 -20.9618 -15.0202 -14.1492 -24.7457 -15.5504 -12.7726 -28.5277 -15.0205 -11.4899 -32.052 -13.467 -10.3884 -35.0784 -10.9958 -9.54314 -37.4006 -7.77518 -9.01181 -38.8604 -4.02472 -8.83058 -39.3583 0.000011 -9.0118 -38.8604 4.02474 -9.54312 -37.4006 7.7752 -10.3883 -35.0784 10.9958 -11.4898 -32.052 13.467 -12.7726 -28.5277 15.0205 -14.1491 -24.7457 15.5504 -15.5263 -20.9618 15.0203 -19.7795 -14.9149 8.71605 -19.365 -16.0537 10.0676 -18.3992 -18.7074 12.1204 -20.1594 -13.8712 7.02962 -20.597 -12.6689 3.73291 -20.7645 -12.2088 0.000001 -20.597 -12.6689 -3.73291 -20.1594 -13.8712 -7.02962 -19.7795 -14.9149 -8.71606 -19.3651 -16.0537 -10.0676 -18.3992 -18.7074 -12.1203 -17.2053 -21.9876 -13.5641 -15.9614 -25.4053 -14.0429 -14.7183 -28.8207 -13.5644 -13.5599 -32.0033 -12.1615 -12.5651 -34.7363 -9.92982 -11.8019 -36.8334 -7.02145 -11.322 -38.1517 -3.63456 -11.1584 -38.6013 0.000003 -11.322 -38.1516 3.63457 -11.8018 -36.8334 7.02145 -12.5651 -34.7363 9.92982 -13.5598 -32.0033 12.1615 -14.7182 -28.8207 13.5644 -15.9613 -25.4053 14.0429 -17.2052 -21.9876 13.5641 -20.8498 -15.0192 8.92266 -20.4214 -16.1962 10.3196 -19.4345 -18.9075 12.4169 -21.2412 -13.9439 7.18523 -21.6882 -12.7156 3.81711 -21.8595 -12.2451 -0.000004 -21.6883 -12.7156 -3.81712 -21.2412 -13.9439 -7.18524 -20.8498 -15.0192 -8.92267 -20.4214 -16.1962 -10.3196 -19.4346 -18.9075 -12.4169 -18.214 -22.2611 -13.8929 -16.9399 -25.7615 -14.3833 -15.6667 -29.2596 -13.8932 -14.4802 -32.5194 -12.4563 -13.4614 -35.3186 -10.1705 -12.6796 -37.4666 -7.19165 -12.1882 -38.8168 -3.72267 -12.0205 -39.2773 -0.000002 -12.1882 -38.8168 3.72267 -12.6796 -37.4666 7.19164 -13.4614 -35.3186 10.1705 -14.4802 -32.5194 12.4563 -15.6667 -29.2596 13.8932 -16.9399 -25.7615 14.3833 -18.2139 -22.2611 13.8929 -20.9041 -11.4576 3.94218 -20.4718 -12.6451 7.27939 -19.9923 -13.9626 9.47182 -19.4148 -15.5493 11.2728 -18.4457 -18.212 13.2813 -17.1872 -21.6697 14.7675 -15.8432 -25.3623 15.303 -14.4961 -29.0634 14.769 -13.2374 -32.5216 13.2357 -12.1568 -35.4905 10.7965 -11.3259 -37.7732 7.654 -10.7908 -39.2436 3.95673 -10.6173 -39.7203 -0.025641 -10.8024 -39.2117 -3.96121 -11.3223 -37.7831 -7.63933 -12.1494 -35.5108 -10.7949 -13.2383 -32.519 -13.2346 -14.4979 -29.0583 -14.7602 -15.8459 -25.3549 -15.2942 -17.1857 -21.6737 -14.7708 -18.4354 -18.2401 -13.2849 -19.3971 -15.5979 -11.2852 -19.9933 -13.96 -9.50144 -20.4648 -12.6643 -7.2571 -20.8936 -11.4864 -3.90658 -21.0754 -10.9869 0.027026 -22.9903 -11.6839 0.027026 -22.8085 -12.1834 -3.90658 -17.7581 -26.0592 15.303 -19.1021 -22.3666 14.7675 -13.2373 -38.4801 -7.63933 -12.7173 -39.9086 -3.96121 -13.2409 -38.4702 7.654 -14.0717 -36.1875 10.7965 -20.3504 -18.9371 -13.2849 -19.1006 -22.3707 -14.7708 -20.3606 -18.9089 13.2813 -21.3297 -16.2463 11.2728 -14.0643 -36.2078 -10.7949 -22.3868 -13.3421 7.27939 -22.819 -12.1546 3.94218 -21.9082 -14.657 -9.50144 -21.312 -16.2949 -11.2852 -22.3798 -13.3613 -7.2571 -15.1523 -33.2186 13.2357 -16.411 -29.7604 14.769 -17.7608 -26.0518 -15.2942 -16.4129 -29.7553 -14.7602 -12.7057 -39.9406 3.95673 -21.9072 -14.6596 9.47182 -15.1533 -33.216 -13.2346 -12.5322 -40.4173 -0.025641 -21.5594 -18.3316 -7.89785 -22.3073 -16.2768 -4.24114 -22.5432 -15.6285 1.50936 -21.9674 -17.2105 6.36652 -20.978 -19.9289 9.33162 -19.1426 -24.9717 11.4278 -17.1298 -30.5019 10.6428 -15.5145 -34.9398 7.01224 -14.7261 -37.1059 1.49487 -14.9985 -36.3576 -4.40715 -16.2384 -32.9509 -9.13015 -18.1217 -27.7766 -11.4196 -20.1271 -22.2668 -10.6601 -17.4364 -30.5537 -5.65913 -16.6677 -32.6659 -2.73086 -16.9876 -31.7868 4.34916 -17.9891 -29.0353 6.60013 -20.9884 -20.7947 3.94881 -21.3454 -19.8138 0.93737 -21.1991 -20.2158 -2.62794 -19.237 -25.6066 7.08683 -20.375 -22.4801 5.78717 -16.4988 -33.1298 0.928389 -18.6041 -27.3456 -7.07858 -20.7354 -21.4897 -4.8951 -19.8474 -23.9296 -6.6077 -19.0701 -26.0652 0.002965 -31.8631 -13.5079 14.0306 -38.9087 -22.8008 2.43989 -34.8117 -16.1543 12.6529 -37.0572 -19.2137 10.0738 -38.5939 -22.0099 5.81801 -30.1198 -14.4466 12.6529 -28.4629 -18.9988 2.43989 -29.3992 -16.4264 10.0738 -28.6802 -18.4017 5.81801 -30.6783 -12.912 14.174 -31.4328 -13.7396 13.6906 -38.2658 -22.5668 2.43989 -33.7835 -15.7801 12.6529 -36.3196 -18.9452 10.0738 -37.9374 -21.771 5.81801 -29.3235 -19.312 2.43989 -30.9804 -14.7598 12.6529 -30.2598 -16.7396 10.0738 -29.5409 -18.7149 5.81801 -30.5299 -13.3197 13.7699 -29.5526 -16.005 2.34735 -29.7388 -15.4933 5.37563 -30.3548 -13.8009 8.51171 -35.3295 -13.7814 10.3042 -37.6569 -16.5918 8.1095 -30.9722 -12.1046 10.5944 -31.3236 -11.1391 11.4963 -31.4507 -10.7898 11.8227 -32.5681 -11.3376 11.7068 -39.1871 -22.0359 2.43989 -38.8723 -21.245 5.81801 -37.3356 -18.4488 10.0738 -35.0901 -15.3894 12.6529 -32.1415 -12.743 14.0306 -30.9567 -12.1471 14.174 -30.8083 -12.5548 13.7699 -30.3982 -13.6817 12.6529 -29.6776 -15.6615 10.0738 -28.9586 -17.6368 5.81801 -28.7413 -18.2339 2.43989 -32.3077 -15.474 12.6529 -33.4553 -21.8718 2.43989 -33.4346 -21.0798 5.81801 -33.1002 -18.3632 10.0738 -38.6078 -12.23 7.12674 -40.1086 -7.27288 6.38726 -38.9995 -19.1175 4.30809 -40.4722 -14.3091 3.83942 -41.5879 -9.21705 2.9614 -35.3982 -11.7744 9.95378 -37.4255 -10.2806 7.9831 -32.4214 -11.8209 12.5059 -31.248 -11.3468 12.7875 -31.1306 -11.6692 12.3477 -40.811 -8.02459 5.71511 -41.2912 -4.07134 3.27877 -41.7989 -5.05268 2.97755 -42.1911 -6.57271 1.95967 -30.8 -12.5778 11.2119 -29.3092 -16.6737 2.37511 -29.5047 -16.1364 5.50835 -30.1516 -14.3591 8.98033 -31.6429 -13.799 13.1096 -31.1415 -13.4054 13.3999 -31.2968 -13.0982 13.4908 -31.9486 -13.507 13.2853 -38.4029 -22.0228 2.34885 -38.5788 -22.0843 2.36512 -36.4374 -18.4987 9.73593 -33.8969 -15.4176 12.2276 -34.6447 -15.7551 12.1616 -36.7916 -18.6421 9.71428 -38.0623 -21.2475 5.6177 -38.274 -21.3209 5.62813 -29.2 -18.6717 2.41468 -29.6735 -18.8353 2.50635 -30.0479 -16.1823 9.70267 -30.6965 -14.4078 12.3806 -30.9659 -14.5535 12.1325 -30.3909 -16.2614 9.53406 -29.4753 -17.8323 5.67988 -29.9103 -17.9699 5.73712 -32.5052 -15.2826 12.0854 -37.922 -21.6885 2.40367 -37.9955 -18.8919 4.14823 -37.7423 -20.9606 5.62625 -36.7707 -18.4306 9.7123 -37.1502 -16.6445 7.80245 -34.6978 -15.5355 12.1746 -34.8908 -13.9542 9.95446 -32.0848 -13.1318 13.1425 -32.3548 -12.4633 12.1694 -31.3875 -12.7273 13.3917 -31.6254 -12.1303 12.4919 -31.2453 -12.8767 13.4893 -31.5204 -12.174 12.3091 -30.8616 -13.9478 12.4927 -30.1769 -15.8769 9.89028 -29.552 -17.6161 5.87996 -29.2603 -18.4264 2.5163 -33.6495 -21.3369 2.34382 -33.6156 -20.5672 5.61126 -33.2569 -17.9287 9.73011 -39.5553 -14.0354 3.6229 -38.3069 -12.2143 6.72532 -40.8019 -9.05754 2.80834 -37.3425 -10.284 7.8698 -37.1764 -10.2908 7.64321 -37.0934 -10.2942 7.52992 -40.0165 -7.28835 6.29475 -39.8323 -7.31929 6.10974 -39.7402 -7.33476 6.01723 -40.3016 -8.00008 5.38928 -35.3158 -11.791 9.84028 -35.1508 -11.8241 9.61327 -35.0684 -11.8407 9.49977 -32.5082 -11.4416 11.6322 -32.3884 -11.6497 11.483 -32.3285 -11.7538 11.4084 -31.5477 -10.9322 11.7979 -31.7416 -11.217 11.7484 -31.774 -11.5368 11.5738 -31.455 -11.187 11.4963 -31.6532 -11.46 11.3466 -31.7845 -11.5078 11.3466 -31.3255 -12.769 11.2119 -31.1035 -12.1525 10.5944 -31.3663 -12.2481 10.5944 -31.4977 -12.2959 10.5944 -41.1742 -4.11559 3.21812 -40.9403 -4.20407 3.09682 -40.8233 -4.24832 3.03618 -41.2813 -5.15996 2.75771 -41.4687 -6.4954 1.80478 -29.8347 -16.8649 2.37511 -29.6839 -16.0528 2.34735 -29.9467 -16.1484 2.34735 -30.0781 -16.1963 2.34735 -30.0303 -16.3276 5.50835 -29.8702 -15.5412 5.37563 -30.1329 -15.6368 5.37563 -30.2643 -15.6846 5.37563 -30.6772 -14.5504 8.98033 -30.4861 -13.8488 8.51171 -30.7489 -13.9444 8.51171 -30.8803 -13.9922 8.51171 -31.8631 -13.5079 -14.0306 -38.9087 -22.8008 -2.43989 -34.8117 -16.1543 -12.6529 -37.0572 -19.2137 -10.0738 -38.5939 -22.0099 -5.81801 -30.1198 -14.4466 -12.6529 -28.4629 -18.9988 -2.43989 -29.3992 -16.4264 -10.0738 -28.6802 -18.4017 -5.81801 -30.6783 -12.912 -14.174 -31.4328 -13.7396 -13.6906 -38.2658 -22.5668 -2.43989 -33.7835 -15.7801 -12.6529 -36.3196 -18.9452 -10.0738 -37.9374 -21.771 -5.81801 -29.3235 -19.312 -2.43989 -30.9804 -14.7598 -12.6529 -30.2598 -16.7396 -10.0738 -29.5409 -18.7149 -5.81801 -30.5299 -13.3197 -13.7699 -29.5526 -16.005 -2.34735 -29.7388 -15.4933 -5.37563 -30.3548 -13.8009 -8.51171 -35.3295 -13.7814 -10.3042 -37.6569 -16.5918 -8.1095 -30.9722 -12.1046 -10.5943 -31.3236 -11.1391 -11.4963 -31.4507 -10.7898 -11.8227 -32.5681 -11.3376 -11.7068 -39.1871 -22.0359 -2.43989 -38.8723 -21.245 -5.81801 -37.3356 -18.4488 -10.0738 -35.0901 -15.3894 -12.6529 -32.1415 -12.743 -14.0306 -30.9567 -12.1471 -14.174 -30.8083 -12.5548 -13.7699 -30.3982 -13.6817 -12.6529 -29.6776 -15.6615 -10.0738 -28.9586 -17.6368 -5.81801 -28.7413 -18.2339 -2.43989 -32.3077 -15.474 -12.6529 -33.4553 -21.8718 -2.43989 -33.4346 -21.0798 -5.81801 -33.1002 -18.3632 -10.0738 -38.6078 -12.23 -7.12674 -40.1086 -7.27288 -6.38726 -38.9995 -19.1175 -4.30809 -40.4722 -14.3091 -3.83942 -41.5879 -9.21705 -2.9614 -35.3982 -11.7744 -9.95378 -37.4255 -10.2806 -7.9831 -32.4214 -11.8209 -12.5059 -31.248 -11.3468 -12.7875 -31.1306 -11.6692 -12.3477 -40.811 -8.02459 -5.71511 -41.2912 -4.07134 -3.27877 -41.7989 -5.05268 -2.97755 -42.1911 -6.57271 -1.95967 -30.8 -12.5778 -11.2119 -29.3092 -16.6737 -2.37511 -29.5047 -16.1364 -5.50835 -30.1516 -14.3591 -8.98033 -31.6429 -13.799 -13.1096 -31.1415 -13.4054 -13.3999 -31.2968 -13.0982 -13.4908 -31.9486 -13.507 -13.2853 -38.4029 -22.0228 -2.34885 -38.5788 -22.0843 -2.36512 -36.4374 -18.4987 -9.73593 -33.8969 -15.4176 -12.2276 -34.6447 -15.7551 -12.1616 -36.7916 -18.6421 -9.71428 -38.0623 -21.2475 -5.6177 -38.274 -21.3209 -5.62813 -29.2 -18.6717 -2.41468 -29.6735 -18.8353 -2.50635 -30.0479 -16.1823 -9.70267 -30.6965 -14.4078 -12.3806 -30.9659 -14.5535 -12.1325 -30.3909 -16.2614 -9.53406 -29.4753 -17.8323 -5.67988 -29.9103 -17.9699 -5.73712 -32.5052 -15.2826 -12.0854 -37.922 -21.6885 -2.40367 -37.9955 -18.8919 -4.14823 -37.7423 -20.9606 -5.62625 -36.7707 -18.4306 -9.7123 -37.1502 -16.6445 -7.80245 -34.6978 -15.5355 -12.1746 -34.8908 -13.9542 -9.95446 -32.0848 -13.1318 -13.1425 -32.3548 -12.4633 -12.1694 -31.3875 -12.7273 -13.3917 -31.6254 -12.1303 -12.4919 -31.2453 -12.8767 -13.4893 -31.5204 -12.174 -12.3091 -30.8616 -13.9478 -12.4927 -30.1769 -15.8769 -9.89028 -29.552 -17.6161 -5.87996 -29.2603 -18.4264 -2.5163 -33.6495 -21.3369 -2.34382 -33.6156 -20.5672 -5.61126 -33.2569 -17.9287 -9.73011 -39.5553 -14.0354 -3.6229 -38.3069 -12.2143 -6.72532 -40.8019 -9.05754 -2.80834 -37.3425 -10.284 -7.8698 -37.1764 -10.2908 -7.64321 -37.0934 -10.2942 -7.52992 -40.0165 -7.28835 -6.29475 -39.8323 -7.31929 -6.10974 -39.7402 -7.33476 -6.01723 -40.3016 -8.00008 -5.38928 -35.3158 -11.791 -9.84028 -35.1508 -11.8241 -9.61327 -35.0684 -11.8407 -9.49977 -32.5082 -11.4416 -11.6322 -32.3884 -11.6497 -11.483 -32.3285 -11.7538 -11.4084 -31.5477 -10.9322 -11.7979 -31.7416 -11.217 -11.7484 -31.774 -11.5368 -11.5738 -31.455 -11.187 -11.4963 -31.6532 -11.46 -11.3466 -31.7845 -11.5078 -11.3466 -31.3255 -12.769 -11.2119 -31.1035 -12.1525 -10.5943 -31.3663 -12.2481 -10.5943 -31.4977 -12.2959 -10.5943 -41.1742 -4.11559 -3.21812 -40.9403 -4.20407 -3.09682 -40.8233 -4.24832 -3.03618 -41.2813 -5.15996 -2.75771 -41.4687 -6.4954 -1.80478 -29.8347 -16.8649 -2.37511 -29.6839 -16.0528 -2.34735 -29.9467 -16.1484 -2.34735 -30.0781 -16.1963 -2.34735 -30.0303 -16.3276 -5.50835 -29.8702 -15.5412 -5.37563 -30.1329 -15.6368 -5.37563 -30.2643 -15.6846 -5.37563 -30.6772 -14.5504 -8.98033 -30.4861 -13.8488 -8.51171 -30.7489 -13.9444 -8.51171 -30.8803 -13.9922 -8.51171 -28.3722 -19.248 0 -29.2328 -19.5613 0 -28.6506 -18.4831 0 -29.4748 -16.2185 0 -29.2276 -16.8979 0 -29.1338 -18.8939 0 -29.611 -19.0851 0 -29.1856 -18.6361 0 -29.7531 -17.0892 0 -29.6062 -16.2663 0 -29.869 -16.362 0 -30.0004 -16.4098 0 -38.9853 -23.1109 0 -38.3622 -22.8841 0 -39.2637 -22.346 0 -33.4436 -22.1949 0 -39.3089 -19.7951 0 -38.4971 -22.3285 0 -38.6526 -22.3851 0 -38.1873 -19.4894 0 -37.9641 -21.9707 0 -33.6399 -21.6473 0 -40.9589 -14.7996 0 -39.8884 -14.4478 0 -42.1476 -9.69492 0 -41.1941 -9.44314 0 -42.52 -6.10773 0 -42.2528 -4.19503 0 -41.7902 -3.43875 0 -41.7184 -6.07298 0 -41.6939 -4.37856 0 -41.6841 -3.47806 0 -41.4719 -3.5567 0 -41.3658 -3.59602 0 -41.7415 7.6825 0 -41.6901 7.6783 2.82599 -41.7536 7.67727 5.07011 -39.8952 7.67941 5.06932 -40.0036 7.67417 4.35142 -40.433 7.69764 2.74187 -40.5889 7.70137 0 -40.433 7.69764 -2.74187 -40.0036 7.67417 -4.35142 -39.8952 7.67941 -5.06932 -41.7536 7.67727 -5.07011 -41.6901 7.6783 -2.82599</float_array>
+ <technique_common>
+ <accessor source="#Headphones-positions-array" count="3014" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Headphones-normals" name="normal">
+ <float_array id="Headphones-normals-array" count="11976">0.791994 0.475487 -0.382959 0.854851 0.350103 -0.382959 0.353879 0.14493 -0.923994 0.327858 0.196835 -0.923994 0.898001 0.216648 -0.382959 0.371741 0.089684 -0.923994 -0.898001 -0.216648 -0.38296 -0.854851 -0.350103 -0.38296 -0.353878 -0.14493 -0.923994 -0.371741 -0.089684 -0.923994 -0.791994 -0.475487 -0.382959 -0.327858 -0.196835 -0.923994 -0.710879 -0.589909 -0.382959 -0.29428 -0.244202 -0.923994 -0.613376 -0.690732 -0.38296 -0.253916 -0.285939 -0.923994 -0.2077 -0.321085 -0.923994 -0.501734 -0.775632 -0.382959 -0.156696 -0.348829 -0.923994 -0.378525 -0.842652 -0.382959 -0.102079 -0.368529 -0.923995 -0.246588 -0.890245 -0.38296 -0.049465 -0.379326 -0.92394 -0.119467 -0.916062 -0.382829 0.029864 0.92341 -0.382651 0.11925 0.91609 -0.382831 0.04939 0.379334 -0.923941 0.012381 0.382516 -0.923866 0.246589 0.890245 -0.382959 0.102079 0.368531 -0.923994 0.012381 0.382516 0.923866 0.04939 0.379334 0.923941 0.11925 0.91609 0.382831 0.029864 0.92341 0.382651 0.378524 0.842651 -0.38296 0.156696 0.348828 -0.923994 0.102079 0.368531 0.923994 0.246589 0.890245 0.382959 0.501734 0.775632 -0.38296 0.2077 0.321084 -0.923994 0.156696 0.348828 0.923994 0.378524 0.842651 0.38296 0.613376 0.690732 -0.38296 0.253916 0.285939 -0.923994 0.2077 0.321084 0.923994 0.501734 0.775632 0.38296 0.253916 0.285939 0.923994 0.613376 0.690732 0.38296 0.710879 0.589909 0.382959 0.294279 0.244202 0.923994 0.327858 0.196835 0.923994 0.791994 0.475487 0.382959 0.854851 0.350103 0.382959 0.353879 0.14493 0.923994 0.371741 0.089684 0.923994 0.898001 0.216648 0.382959 -0.030083 -0.923402 0.382654 -0.119467 -0.916062 0.382829 -0.049465 -0.379326 0.92394 -0.012456 -0.38251 0.923868 -0.371741 -0.089684 0.923994 -0.353878 -0.14493 0.923994 -0.854851 -0.350103 0.38296 -0.898001 -0.216648 0.38296 -0.791994 -0.475487 0.382959 -0.327858 -0.196835 0.923994 -0.29428 -0.244202 0.923994 -0.710879 -0.589909 0.382959 -0.253916 -0.285939 0.923994 -0.613376 -0.690732 0.38296 0.710879 0.589909 -0.382959 0.294279 0.244202 -0.923994 -0.2077 -0.321084 0.923994 -0.501734 -0.775632 0.38296 -0.378524 -0.842651 0.382959 -0.156696 -0.348828 0.923994 -0.246588 -0.890245 0.38296 -0.102079 -0.368529 0.923995 -0.030083 -0.923402 -0.382654 -0.012456 -0.38251 -0.923868 0.032305 0.999478 0 0.129063 0.991636 0 0.266939 0.963713 0 0.409762 0.912192 0 0.54314 0.839642 0 0.663996 0.747736 0 0.769545 0.638592 0 0.857354 0.514727 0 0.925398 0.378996 0 0.97211 0.234527 0 -0.97211 -0.234527 0 -0.925399 -0.378995 0 -0.857354 -0.514727 0 -0.769545 -0.638592 0 -0.663996 -0.747736 0 -0.54314 -0.839642 0 -0.409763 -0.912192 0 -0.266938 -0.963714 0 -0.129326 -0.991602 0 -0.03257 -0.999469 0 -0.791994 0.475487 -0.382959 -0.327858 0.196835 -0.923994 -0.353879 0.14493 -0.923994 -0.854851 0.350103 -0.382959 -0.371741 0.089684 -0.923994 -0.898001 0.216648 -0.382959 0.898001 -0.216648 -0.38296 0.371741 -0.089684 -0.923994 0.353878 -0.14493 -0.923994 0.854851 -0.350103 -0.38296 0.327858 -0.196835 -0.923994 0.791994 -0.475487 -0.382959 0.294279 -0.244202 -0.923994 0.710879 -0.589909 -0.382959 0.253916 -0.285938 -0.923995 0.613376 -0.690732 -0.38296 0.2077 -0.321084 -0.923994 0.501734 -0.775632 -0.38296 0.156696 -0.348828 -0.923994 0.378524 -0.842651 -0.38296 0.102079 -0.368529 -0.923995 0.246588 -0.890244 -0.382961 0.049465 -0.379326 -0.92394 0.119467 -0.916062 -0.382829 -0.029864 0.92341 -0.382651 -0.012381 0.382516 -0.923866 -0.04939 0.379334 -0.923941 -0.11925 0.916089 -0.382831 -0.102079 0.368531 -0.923994 -0.246589 0.890245 -0.382958 -0.012381 0.382516 0.923866 -0.029864 0.92341 0.382651 -0.11925 0.916089 0.382831 -0.04939 0.379334 0.923941 -0.156696 0.348828 -0.923994 -0.378524 0.842651 -0.38296 -0.246589 0.890245 0.382959 -0.102079 0.368531 0.923994 -0.2077 0.321084 -0.923994 -0.501734 0.775632 -0.38296 -0.378524 0.842651 0.38296 -0.156696 0.348827 0.923995 -0.253916 0.285939 -0.923994 -0.613377 0.690732 -0.38296 -0.501734 0.775632 0.38296 -0.2077 0.321084 0.923995 -0.613376 0.690732 0.38296 -0.253916 0.285939 0.923994 -0.710879 0.589909 0.382959 -0.294279 0.244202 0.923994 -0.791994 0.475487 0.382959 -0.327858 0.196835 0.923994 -0.854851 0.350103 0.382959 -0.353879 0.14493 0.923994 -0.898001 0.216648 0.382959 -0.371741 0.089684 0.923994 0.030083 -0.923402 0.382654 0.012456 -0.38251 0.923868 0.049465 -0.379326 0.92394 0.119467 -0.916062 0.382829 0.371741 -0.089684 0.923994 0.898001 -0.216648 0.38296 0.854851 -0.350103 0.38296 0.353878 -0.14493 0.923994 0.791994 -0.475487 0.382959 0.327858 -0.196835 0.923994 0.710879 -0.589909 0.382959 0.29428 -0.244202 0.923994 0.613376 -0.690732 0.38296 0.253916 -0.285939 0.923994 -0.294279 0.244202 -0.923994 -0.710879 0.589909 -0.382959 0.501734 -0.775632 0.38296 0.2077 -0.321085 0.923994 0.378525 -0.842651 0.382959 0.156696 -0.348829 0.923994 0.246588 -0.890244 0.382961 0.102079 -0.368529 0.923995 0.012456 -0.38251 -0.923868 0.030083 -0.923402 -0.382654 -0.129063 0.991636 0 -0.032305 0.999478 0 -0.266939 0.963713 0 -0.409762 0.912192 0 -0.54314 0.839642 0 -0.663996 0.747736 0 -0.769545 0.638592 0 -0.857354 0.514727 0 -0.925398 0.378996 0 -0.97211 0.234527 0 0.925399 -0.378995 0 0.97211 -0.234527 0 0.857354 -0.514727 0 0.769545 -0.638592 0 0.663996 -0.747736 0 0.54314 -0.839642 0 0.409763 -0.912192 0 0.266938 -0.963714 0 0.129326 -0.991602 0 0.03257 -0.999469 0 0.883161 0.291714 -0.367327 0.345159 0.300569 -0.889114 -0.393264 0.198279 -0.897791 -0.926581 0.037121 -0.374258 0.345159 0.300569 0.889114 0.883161 0.291714 0.367327 -0.926582 0.037121 0.374258 -0.393264 0.198278 0.897791 0.972918 0.231152 0 -0.998802 -0.048933 0 -0.345159 0.300569 -0.889114 -0.883161 0.291714 -0.367327 0.926581 0.037121 -0.374258 0.393264 0.198279 -0.897791 -0.345159 0.300569 0.889114 -0.883161 0.291714 0.367327 0.393264 0.198279 0.897791 0.926582 0.037121 0.374258 -0.972918 0.231152 0 0.998802 -0.048933 0 -0.227734 -0.625296 0.74642 -0.009523 -0.390135 0.920709 -0.070866 -0.364444 0.928525 -0.233388 -0.640431 0.731695 -0.242856 -0.970062 0 -0.34202 -0.939693 0 -0.338322 -0.929544 0.146579 -0.241349 -0.957044 0.160677 -0.212351 -0.783141 0.584464 0.259273 -0.642256 0.721307 0.120369 -0.481356 0.868221 -0.210322 -0.660264 0.720983 -0.336117 -0.923497 0.184875 -0.235089 -0.908055 0.346654 -0.30665 -0.842525 0.442852 -0.342023 -0.939691 0.000000 -0.437599 -0.89917 0 -0.431327 -0.889911 0.148381 -0.338327 -0.929542 0.14658 -0.287602 -0.79018 0.541203 -0.354888 -0.760917 0.543194 -0.273466 -0.659274 0.70041 -0.249676 -0.685699 0.683725 -0.408726 -0.854966 0.319338 -0.324402 -0.89129 0.316804 -0.241596 -0.651213 0.719411 0.989205 -0.146539 0 0.975296 -0.063957 0.211442 0.980671 -0.169326 0.098047 0.985413 -0.170182 0 0.932995 -0.339584 0.119178 0.939693 -0.342019 0.000000 0.956262 -0.13157 0.261252 0.926758 -0.337315 0.165341 0.871962 0.085321 0.482081 0.859323 -0.01228 0.511286 0.818477 -0.2979 0.491275 0.732153 0.264977 0.627487 0.688925 0.15459 0.708155 0.561815 0.595976 0.573739 0.449247 0.323427 0.83281 0.425114 0.740153 0.52101 0.302865 0.400265 0.864905 -0.939694 0.342017 -0.000000 -0.939693 0.342019 -0.000000 -0.939693 0.34202 -0.000001 -0.939693 0.342018 -0.000004 -0.939692 0.342023 -0.000004 -0.939692 0.342023 -0.00001 -0.939692 0.342022 -0.000000 -0.939691 0.342024 -0.000001 -0.939692 0.342022 -0.000001 -0.939691 0.342026 -0.000003 -0.939692 0.342022 -0.000000 -0.93969 0.342026 -0.000001 -0.939692 0.342023 0.000000 -0.939691 0.342025 -0.000000 -0.939692 0.342023 0 -0.939691 0.342025 0 -0.342215 -0.939622 0 -0.337795 -0.926781 0.164233 -0.322206 -0.878715 0.352197 -0.281111 -0.75735 0.589405 0.967709 -0.252069 0 0.921792 -0.212523 0.324242 0.747455 -0.059224 0.661667 0.986092 -0.166199 0 0.945447 -0.142711 0.292853 0.825623 -0.012411 0.564086 0.706372 0.097525 0.70109 0.625714 0.019086 0.779819 0.665497 0.092603 0.740633 0.621662 0.283323 0.73025 0.541873 0.532711 0.650071 0.421449 0.742152 0.521144 -0.939692 0.342021 -0.000002 -0.939692 0.342022 -0.000001 -0.939692 0.342021 -0.000000 -0.939692 0.342021 0.000000 0.920658 0.197718 0.336596 0.845881 0.349664 0.402766 0.972331 -0.014369 0.233167 0.954731 0.297469 0 0.890517 0.45495 0 0.999995 0.003239 0 -0.939693 0.342018 0.000000 -0.939694 0.342018 0 -0.939694 0.342016 0.000000 -0.939695 0.342015 0 -0.939693 0.342019 0.000000 -0.939693 0.342019 0.000000 -0.939693 0.342019 0.000000 -0.939693 0.34202 0 -0.211751 0.211768 -0.954105 0.075065 0.605301 -0.79245 -0.01183 0.417438 -0.908629 -0.169817 0.095818 -0.980806 0.340314 0.940312 0 0.241997 0.970277 0 0.240444 0.957257 -0.160763 0.336572 0.930183 -0.146559 -0.415917 0.483109 -0.770467 0.21515 0.7838 -0.582553 0.180729 0.657456 -0.731498 -0.220662 0.382544 -0.8972 0.236509 0.908048 -0.345706 0.327155 0.891186 -0.314256 0.447632 0.894218 0 0.881566 0.472061 -0.000000 0.884074 0.449195 -0.128989 0.443963 0.879055 -0.173663 0.264108 0.820266 -0.507356 0.06603 0.875026 -0.479552 -0.007252 0.79225 -0.610154 0.152132 0.7426 -0.652227 0.267633 0.902223 -0.338181 0.396445 0.854907 -0.334612 0.248438 0.677305 -0.692486 -0.977768 0.125084 -0.168297 -0.98167 0.190588 0 -0.887461 -0.460883 0 -0.889836 -0.454721 0.037678 -0.513938 -0.857827 0 -0.519694 -0.845526 0.122488 -0.908571 -0.41696 0.025338 -0.6193 -0.76227 0.18818 -0.891559 -0.043549 -0.450805 -0.912675 -0.27268 -0.304418 -0.730533 -0.257173 -0.632601 -0.714973 -0.230786 -0.659963 -0.640102 -0.483705 -0.596907 -0.545901 -0.366411 -0.753482 -0.546117 -0.617916 -0.565628 -0.546117 -0.617916 -0.565628 -0.211679 -0.090848 -0.973108 0.862212 -0.494635 -0.109206 0.649152 -0.706667 -0.281467 0.649152 -0.706667 -0.281467 0.883527 -0.444657 -0.147174 -0.00851 -0.008925 -0.999924 0.945479 -0.32451 -0.027626 0.960333 -0.228738 -0.159497 0.95161 -0.299397 -0.069278 0.932142 -0.361777 0.01514 0.927228 -0.373819 0.022535 0.940975 -0.338454 0.003941 0.944159 -0.329453 0.004899 0.955109 -0.29621 -0.005108 0.959754 -0.280841 0 0.344787 0.922718 -0.172376 0.344836 0.938663 0 0.337968 0.871069 -0.356393 0.296912 0.760997 -0.576825 -0.962089 0.272736 0 -0.93493 0.242494 -0.259042 -0.768191 0.076779 -0.6356 -0.978552 0.206001 0 -0.954189 0.187994 -0.232769 -0.850781 0.0445 -0.523633 -0.5799 0.052351 -0.813004 -0.5799 0.052351 -0.813004 -0.650353 -0.189217 -0.735689 -0.653963 -0.102946 -0.74949 -0.64177 -0.274042 -0.716263 -0.496722 -0.667782 -0.554377 -0.496722 -0.667782 -0.554377 -0.496722 -0.667782 -0.554377 -0.496722 -0.667782 -0.554377 0.830689 -0.529404 -0.172299 0.893986 -0.440715 -0.080995 0.830689 -0.529404 -0.172299 0.938317 -0.345635 0.009895 0.939471 -0.342575 0.005973 -0.943067 -0.130106 -0.306099 -0.816376 -0.221101 -0.533521 -0.868351 -0.302846 -0.392747 -0.978998 0.088926 -0.183451 -0.978406 -0.206692 0 -0.922033 -0.387111 0 -0.997057 0.076663 0 0.939184 -0.343414 0 0.939051 -0.343778 0.000515 0.939693 -0.342019 0 0.939693 -0.342019 0.000000 0.938706 -0.344716 0.001492 0.939693 -0.34202 0.000000 0.938285 -0.345842 0.003871 0.939693 -0.34202 -0.000000 -0.498052 0.803663 0.325684 -0.496916 0.804749 0.324736 -0.556659 0.697954 0.450546 -0.557123 0.697091 0.451308 -0.501424 0.800402 0.328527 -0.500307 0.801489 0.327579 -0.558056 0.695337 0.452858 -0.562944 0.715656 0.413438 -0.321475 0.940817 -0.107321 -0.42319 0.875937 0.231613 -0.350241 0.932882 -0.084036 -0.340743 0.93566 -0.091835 -0.084483 0.677319 -0.730822 -0.047204 0.677799 -0.733731 -0.157481 0.88114 -0.445862 -0.138935 0.736214 -0.662334 -0.130575 0.707088 -0.694965 0.069509 0.382022 -0.921536 0.069509 0.382022 -0.921536 -0.033817 0.508046 -0.860666 -0.033817 0.508046 -0.860666 0.366048 0.611518 -0.701466 0.318613 0.603823 -0.730673 0.408605 0.582064 -0.703024 0.408605 0.582064 -0.703024 0.571009 0.609081 -0.550426 0.491824 0.616373 -0.614975 0.709105 0.559505 -0.429096 0.824931 0.496082 -0.270908 0.248442 0.665327 -0.704 0.242608 0.666561 -0.704867 0.243883 0.670086 -0.701075 0.249079 0.66709 -0.702104 -0.477575 0.820679 0.313701 -0.477965 0.819903 0.315131 -0.55294 0.671787 0.492909 -0.478775 0.818303 0.31805 -0.479193 0.817478 0.319538 -0.379687 0.925115 0 -0.380087 0.924951 0 -0.380946 0.924597 0 -0.381404 0.924408 -0.000000 0.342009 0.939697 0 0.341995 0.939702 0 0.338784 0.93087 -0.136772 0.338793 0.930867 -0.136771 0.34204 0.939685 -0.000000 0.342031 0.939689 0 0.338813 0.930859 -0.136771 0.338824 0.930855 -0.136773 0.321314 0.882858 -0.342519 0.321322 0.882855 -0.342519 0.321334 0.88285 -0.342521 0.321338 0.882848 -0.342521 0.278806 0.766044 -0.579175 0.278814 0.766038 -0.57918 0.278815 0.766036 -0.579181 0.278809 0.766041 -0.579178 0.563169 0.599172 -0.569064 -0.032394 0.369551 -0.928646 -0.032394 0.369551 -0.928646 -0.227734 -0.625295 -0.74642 -0.233389 -0.64043 -0.731696 -0.070866 -0.364444 -0.928525 -0.009523 -0.390134 -0.920709 -0.241349 -0.957044 -0.160677 -0.338322 -0.929544 -0.146579 -0.212351 -0.783141 -0.584464 -0.210322 -0.660264 -0.720983 0.120369 -0.481356 -0.868221 0.259273 -0.642256 -0.721307 -0.235089 -0.908055 -0.346654 -0.336118 -0.923497 -0.184875 -0.30665 -0.842525 -0.442853 -0.338327 -0.929542 -0.14658 -0.431326 -0.889911 -0.148381 -0.287602 -0.79018 -0.541203 -0.249676 -0.685698 -0.683725 -0.273466 -0.659273 -0.700411 -0.354888 -0.760917 -0.543194 -0.324402 -0.89129 -0.316804 -0.408726 -0.854966 -0.319338 -0.241596 -0.651213 -0.719412 0.980671 -0.169326 -0.098047 0.975296 -0.063957 -0.211442 0.932995 -0.339584 -0.119178 0.956262 -0.13157 -0.261252 0.926758 -0.337315 -0.165341 0.859323 -0.01228 -0.511286 0.871962 0.085321 -0.48208 0.818477 -0.2979 -0.491275 0.688925 0.15459 -0.708155 0.732152 0.264978 -0.627487 0.449247 0.323428 -0.83281 0.561815 0.595976 -0.573739 0.302865 0.400265 -0.864905 0.425114 0.740153 -0.52101 -0.939693 0.342019 0.000000 -0.939693 0.342019 0.000004 -0.939693 0.34202 0.000001 -0.939693 0.34202 0.000000 -0.939692 0.342022 0.000009 -0.939692 0.342023 0.000004 -0.939691 0.342024 0.000001 -0.939692 0.342022 0.000000 -0.939691 0.342026 0.000003 -0.939692 0.342022 0.000001 -0.93969 0.342026 0.000001 -0.939692 0.342022 0.000000 -0.939691 0.342025 0.000000 -0.939692 0.342023 0 -0.337795 -0.926781 -0.164233 -0.322206 -0.878715 -0.352197 -0.281111 -0.75735 -0.589405 0.921792 -0.212523 -0.324242 0.747455 -0.059224 -0.661667 0.945447 -0.142712 -0.292853 0.625714 0.019086 -0.779819 0.706372 0.097526 -0.70109 0.825623 -0.012411 -0.564086 0.665497 0.092603 -0.740633 0.541873 0.53271 -0.650072 0.621662 0.283322 -0.73025 0.421449 0.742152 -0.521145 -0.939692 0.342022 0.000001 -0.939692 0.342023 0.000002 -0.939693 0.34202 -0.000000 -0.939692 0.342021 0.000000 0.845881 0.349664 -0.402766 0.920658 0.197719 -0.336596 0.972331 -0.014369 -0.233167 -0.939694 0.342018 -0.000000 -0.939695 0.342015 -0.000000 -0.939694 0.342018 -0.000000 -0.939694 0.342016 -0.000000 -0.939693 0.342019 -0.000000 -0.939693 0.342019 0 -0.211753 0.211768 0.954104 -0.169821 0.095817 0.980806 -0.011832 0.417438 0.908628 0.075065 0.605301 0.792449 0.336569 0.930184 0.146557 0.240443 0.957258 0.160763 -0.415921 0.48311 0.770464 -0.220662 0.382543 0.8972 0.180728 0.657456 0.731498 0.215148 0.783801 0.582552 0.327149 0.891189 0.314253 0.236507 0.908049 0.345704 0.443963 0.879055 0.173663 0.884073 0.449195 0.128989 0.264108 0.820266 0.507356 0.152132 0.742601 0.652227 -0.007253 0.79225 0.610153 0.066029 0.875025 0.479553 0.396445 0.854907 0.334613 0.267633 0.902223 0.338181 0.248438 0.677305 0.692486 -0.977768 0.125084 0.168297 -0.889836 -0.454722 -0.037677 -0.519693 -0.845527 -0.122488 -0.908571 -0.41696 -0.025338 -0.6193 -0.76227 -0.188181 -0.891559 -0.04355 0.450805 -0.912675 -0.27268 0.304418 -0.730533 -0.257173 0.632601 -0.714973 -0.230787 0.659963 -0.640103 -0.483705 0.596907 -0.545903 -0.366411 0.75348 -0.546119 -0.617915 0.565628 -0.546119 -0.617915 0.565628 -0.211684 -0.090849 0.973107 0.862214 -0.494633 0.109207 0.883528 -0.444655 0.147174 0.649155 -0.706663 0.281468 0.649155 -0.706663 0.281468 -0.008515 -0.008925 0.999924 0.945479 -0.324509 0.027626 0.95161 -0.299396 0.069278 0.960334 -0.228736 0.159497 0.932141 -0.361778 -0.01514 0.927227 -0.373821 -0.022535 0.940975 -0.338454 -0.003941 0.944159 -0.329453 -0.004899 0.955109 -0.29621 0.005108 0.344787 0.922718 0.172376 0.337968 0.871069 0.356393 0.296912 0.760997 0.576825 -0.93493 0.242494 0.259042 -0.768191 0.076779 0.6356 -0.954189 0.187994 0.232769 -0.850781 0.0445 0.523633 -0.5799 0.052351 0.813004 -0.5799 0.052351 0.813004 -0.653963 -0.102945 0.74949 -0.650352 -0.189217 0.735689 -0.641769 -0.274043 0.716263 -0.496724 -0.667781 0.554377 -0.496724 -0.667781 0.554377 -0.496724 -0.667781 0.554377 -0.496724 -0.667781 0.554377 0.830691 -0.529401 0.1723 0.830691 -0.529401 0.1723 0.893987 -0.440712 0.080995 0.939472 -0.342574 -0.005973 0.938318 -0.345633 -0.009895 -0.943067 -0.130106 0.306099 -0.868351 -0.302846 0.392747 -0.816376 -0.2211 0.533521 -0.978998 0.088926 0.18345 0.93905 -0.343779 -0.000515 0.939693 -0.34202 -0.000000 0.938706 -0.344717 -0.001492 0.939692 -0.342021 -0.000000 0.938285 -0.345843 -0.003871 0.939693 -0.34202 0.000000 -0.498054 0.803661 -0.325685 -0.557125 0.697088 -0.45131 -0.556664 0.697948 -0.450549 -0.496919 0.804746 -0.324738 -0.501426 0.800401 -0.328528 -0.562945 0.715655 -0.413438 -0.558056 0.695336 -0.452859 -0.500307 0.801489 -0.32758 -0.321476 0.940816 0.10732 -0.423197 0.875933 -0.231616 -0.350243 0.932882 0.084033 -0.340744 0.93566 0.091833 -0.084482 0.67732 0.730821 -0.15748 0.88114 0.445861 -0.047202 0.6778 0.733729 -0.138934 0.736215 0.662332 -0.130575 0.707089 0.694964 0.069511 0.382025 0.921534 0.069511 0.382025 0.921534 -0.033815 0.508049 0.860664 -0.033815 0.508049 0.860664 0.36605 0.611517 0.701466 0.40861 0.582063 0.703023 0.40861 0.582063 0.703023 0.318617 0.603819 0.730675 0.571008 0.609079 0.55043 0.82493 0.496083 0.27091 0.709104 0.559505 0.429098 0.491822 0.616372 0.614977 0.248441 0.665326 0.704001 0.242609 0.666558 0.70487 0.243884 0.670082 0.701078 0.249078 0.667089 0.702105 -0.477968 0.819901 -0.315132 -0.47758 0.820675 -0.313703 -0.552941 0.671785 -0.492911 -0.479194 0.817477 -0.31954 -0.478775 0.818302 -0.31805 0.338792 0.930867 0.13677 0.338781 0.930871 0.13677 0.338824 0.930855 0.136772 0.338813 0.930859 0.136771 0.321321 0.882856 0.342519 0.321311 0.88286 0.342518 0.321338 0.882848 0.342521 0.321334 0.88285 0.342521 0.278813 0.766038 0.57918 0.278805 0.766044 0.579176 0.278809 0.76604 0.579178 0.278815 0.766036 0.579182 0.563169 0.59917 0.569066 -0.032394 0.369551 0.928646 -0.032394 0.369551 0.928646 0.829617 -0.431975 -0.353741 0.918634 -0.395111 0 0.481089 -0.876672 0 0.411188 -0.890512 -0.194713 0.829617 -0.431975 0.353741 0.411187 -0.890512 0.194713 0.323555 -0.435495 0.840034 0.136444 -0.872014 0.470079 -0.368877 -0.416498 0.830939 -0.252103 -0.845854 0.470079 -0.856802 -0.383907 0.344248 -0.526847 -0.827357 0.194714 -0.939606 -0.342259 0 -0.594262 -0.804272 0 -0.856801 -0.383908 -0.344248 -0.526846 -0.827357 -0.194713 -0.368877 -0.416498 -0.830939 -0.252103 -0.845854 -0.47008 0.323555 -0.435495 -0.840033 0.136444 -0.872014 -0.470079 -0.829617 -0.431975 -0.353741 -0.411187 -0.890512 -0.194713 -0.481088 -0.876672 0 -0.918633 -0.395111 0 -0.411187 -0.890512 0.194713 -0.829617 -0.431975 0.353741 -0.136444 -0.872014 0.470079 -0.323555 -0.435495 0.840033 0.252103 -0.845854 0.47008 0.368877 -0.416498 0.830939 0.526846 -0.827357 0.194713 0.856801 -0.383908 0.344248 0.594262 -0.804272 0 0.939606 -0.342259 0 0.526846 -0.827357 -0.194713 0.856801 -0.383908 -0.344248 0.252103 -0.845854 -0.47008 0.368877 -0.416498 -0.830939 -0.136444 -0.872014 -0.470079 -0.323555 -0.435495 -0.840034 -0.923617 -0.016964 -0.382941 -0.999985 -0.005436 0 -0.987918 0.154974 0 -0.899513 0.227109 -0.373226 0.347845 0.280443 0.894626 0.899513 0.227108 0.373226 0.382066 -0.03813 0.923348 0.923617 -0.016965 0.382941 -0.99804 -0.062574 0 -0.921072 -0.071024 0.382859 -0.924618 0.075407 0.373358 -0.999919 -0.012692 0 0.380784 -0.061231 -0.922634 -0.382066 -0.038129 -0.923348 -0.347845 0.280444 -0.894626 0.391976 0.219925 -0.893302 -0.380784 -0.06123 -0.922634 -0.921072 -0.071023 -0.38286 -0.924618 0.075408 -0.373358 -0.391976 0.219925 -0.893302 -0.923617 -0.016965 0.382941 -0.382066 -0.03813 0.923348 -0.347845 0.280443 0.894626 -0.899513 0.227108 0.373226 -0.391976 0.219924 0.893302 -0.380784 -0.061231 0.922634 0.391976 0.219925 0.893302 0.380784 -0.06123 0.922634 0.921072 -0.071023 0.38286 0.99804 -0.062574 0 0.999919 -0.012692 0 0.924618 0.075408 0.373358 0.924618 0.075407 -0.373358 0.921072 -0.071024 -0.382859 0.347845 0.280444 -0.894626 0.382066 -0.038129 -0.923348 0.999985 -0.005435 0 0.923617 -0.016964 -0.382941 0.899513 0.227109 -0.373226 0.987919 0.154974 0 0.954244 -0.298979 -0.005498 0.982009 -0.188496 -0.011332 0.981689 -0.187837 -0.031672 0.953064 -0.302088 -0.020269 0.977003 -0.213145 -0.005778 0.955205 -0.295798 0.009286 0.925837 -0.377146 -0.024233 0.925668 -0.37811 -0.01308 0.925383 -0.379027 -0.001926 0.978977 -0.20397 0 0.985081 -0.172092 0 0.99534 -0.096424 0 0.995412 -0.095326 -0.008238 0.994952 -0.094176 -0.034658 -0.98576 0.083428 -0.146005 -0.959949 0.050781 -0.275536 -0.90861 0.068661 -0.411964 -0.977772 0.15179 -0.144647 -0.830891 0.096614 -0.547984 -0.955051 0.249322 -0.160364 -0.745638 0.235188 -0.623466 -0.920504 0.350687 -0.172311 -0.115486 -0.362168 -0.924931 -0.088474 -0.372261 -0.923901 -0.115502 -0.678935 -0.725056 -0.155519 -0.670365 -0.725551 -0.15368 -0.988121 -0.000000 -0.207393 -0.978258 -0.000000 -0.047391 -0.108799 -0.992933 -0.03768 -0.114001 -0.992766 -0.027961 -0.119192 -0.992477 -0.061398 -0.382042 -0.922103 -0.075324 -0.686363 -0.723348 -0.099502 -0.995037 -0.000000 0.926496 -0.375136 0.029629 0.933206 -0.35726 0.038615 0.933206 -0.35726 0.038615 0.926496 -0.375136 0.029629 0.973898 -0.22136 0.050229 0.973898 -0.22136 0.050229 0.973898 -0.22136 0.050229 0.973898 -0.22136 0.050229 0.99366 -0.111533 -0.014136 0.993759 -0.111547 0 0.993759 -0.111547 0 0.99366 -0.111533 -0.014136 0.026056 -0.278751 -0.96001 0.062257 -0.161531 -0.984902 -0.504188 0.075613 -0.860277 -0.546568 -0.199971 -0.813188 0.045724 -0.544969 -0.837209 0.045724 -0.544969 -0.837209 -0.741546 -0.333883 -0.581921 0.066704 -0.811752 -0.580181 0.066704 -0.811752 -0.580181 0.066704 -0.811752 -0.580181 0.066704 -0.811752 -0.580181 -0.90102 0.386253 0.197412 -0.912147 0.362732 0.190823 -0.940179 0.295974 0.168711 -0.967429 0.253142 0 -0.943609 -0.263678 -0.200188 -0.804177 0.437402 0.402466 -0.813745 0.392461 0.428712 -0.816865 0.46424 0.342363 -0.864447 0.502725 0 -0.920181 0.383489 0.078757 -0.951595 0.30634 0.024947 -0.926367 0.365689 -0.090082 -0.962866 0.243125 -0.117383 -0.97366 0.226115 0.029281 -0.98005 0.173345 -0.097232 -0.977169 0.212464 0 -0.980886 0.194582 0 -0.810648 0.063674 -0.582061 -0.894238 0.058535 -0.443748 -0.720435 0.222991 -0.656695 -0.93805 0.07016 -0.339322 -0.986739 -0.006785 -0.162175 -0.988329 0.062743 -0.138814 -0.999796 -0.020215 0 -0.998408 0.056396 0 -0.146147 -0.974276 -0.171543 -0.578912 -0.8151 0.021745 -0.52343 -0.808816 -0.268026 -0.123691 -0.985219 -0.118508 -0.526743 -0.834494 -0.161742 -0.493474 -0.782659 0.379379 -0.853097 -0.515247 0.082139 -0.853097 -0.515247 0.082139 -0.260361 -0.828037 0.496555 -0.165073 -0.536509 0.827592 -0.156923 -0.519015 0.840237 -0.118389 -0.943861 0.308399 -0.173136 -0.553718 0.814506 0.051963 -0.997426 0.049403 0.714001 -0.700118 0.006111 0.731428 -0.681778 0.013851 -0.118953 -0.984865 -0.126061 0.695717 -0.718314 -0.001785 -0.273117 -0.893822 -0.355653 -0.258848 -0.780903 -0.568497 -0.293123 -0.831968 -0.471072 -0.221137 -0.719472 -0.658376 0.387583 -0.899733 0.200651 0.387583 -0.899733 0.200651 -0.563981 -0.700193 -0.437785 -0.325377 -0.733064 -0.597283 -0.755519 -0.608889 -0.241753 -0.586343 -0.804006 0.098876 -0.904177 -0.076926 0.420174 -0.689029 -0.548775 0.473376 -0.612483 -0.788813 0.051368 -0.993431 -0.048914 0.10345 -0.615829 -0.786472 0.04708 -0.99589 -0.081035 -0.040455 -0.450727 -0.889909 -0.070052 -0.77658 -0.24958 -0.578475 -0.312719 -0.763605 -0.564902 0.920399 -0.390661 -0.015803 0.920023 -0.390851 -0.028167 0.920635 -0.39041 -0.003437 0.0078 -0.003324 0.999964 0.005854 -0.002481 0.99998 0.005033 -0.00214 0.999985 0.005595 -0.002391 0.999982 0.001773 -0.000752 -0.999998 0.001318 -0.00056 -0.999999 0.001335 -0.000567 -0.999999 0.001799 -0.000764 -0.999998 0.919122 -0.3927 0.031651 0.919262 -0.392778 0.026141 0.919262 -0.392778 0.026141 0.919122 -0.3927 0.031651 -0.906068 0.393915 -0.154505 -0.906068 0.393915 -0.154505 -0.90492 0.3933 -0.162588 -0.722286 0.314706 -0.615844 0.000862 -0.000367 -1 0.000871 -0.000371 -1 0.00339 -0.001458 0.999993 0.003649 -0.001548 0.999992 0.084544 -0.048968 -0.995216 -0.398638 0.31888 -0.859886 -0.432195 0.26086 -0.863226 0.091016 -0.045375 -0.994815 -0.855966 0.475217 0.203693 -0.727511 0.563293 -0.3917 -0.816593 0.378675 0.435639 -0.581084 0.34356 0.737772 -0.913864 0.396111 0.089152 -0.913458 0.396286 -0.092479 -0.689846 0.300453 -0.658666 -0.361531 0.158513 -0.918787 0.954244 -0.298978 0.005498 0.953065 -0.302088 0.020269 0.981689 -0.187837 0.031672 0.982009 -0.188496 0.011332 0.977004 -0.213145 0.005778 0.955206 -0.295798 -0.009286 0.925668 -0.37811 0.01308 0.925837 -0.377145 0.024234 0.925383 -0.379027 0.001926 0.995412 -0.095325 0.008238 0.994952 -0.094175 0.034658 -0.98576 0.083428 0.146005 -0.977772 0.15179 0.144647 -0.90861 0.068661 0.411964 -0.959949 0.05078 0.275536 -0.955051 0.249322 0.160365 -0.830891 0.096613 0.547984 -0.920504 0.350687 0.172312 -0.745638 0.235188 0.623466 -0.115485 -0.362167 0.924931 -0.155519 -0.670364 0.725552 -0.115502 -0.678935 0.725056 -0.088474 -0.372261 0.923902 -0.047388 -0.1088 0.992933 -0.037679 -0.114001 0.992766 -0.027962 -0.119191 0.992477 -0.061398 -0.382041 0.922103 -0.075324 -0.686363 0.723348 0.926496 -0.375136 -0.029629 0.926496 -0.375136 -0.029629 0.933206 -0.35726 -0.038615 0.933206 -0.35726 -0.038615 0.973898 -0.221359 -0.050229 0.973898 -0.221359 -0.050229 0.973898 -0.221359 -0.050229 0.973898 -0.221359 -0.050229 0.99366 -0.111538 0.014136 0.99366 -0.111538 0.014136 0.026055 -0.27875 0.96001 -0.546568 -0.19997 0.813188 -0.504188 0.075613 0.860277 0.062256 -0.16153 0.984902 0.045724 -0.54497 0.837208 -0.741546 -0.333883 0.581921 0.045724 -0.54497 0.837208 0.066704 -0.811751 0.580182 0.066704 -0.811751 0.580182 0.066704 -0.811751 0.580182 0.066704 -0.811751 0.580182 -0.912147 0.362733 -0.190823 -0.90102 0.386253 -0.197412 -0.940179 0.295975 -0.16871 -0.943609 -0.26368 0.200188 -0.804177 0.437401 -0.402466 -0.813745 0.39246 -0.428712 -0.816866 0.46424 -0.342363 -0.951596 0.306338 -0.024947 -0.920181 0.383488 -0.078757 -0.962866 0.243125 0.117383 -0.926367 0.365689 0.090082 -0.973661 0.226114 -0.029281 -0.98005 0.173345 0.097232 -0.894238 0.058535 0.443748 -0.810648 0.063673 0.582061 -0.720435 0.222991 0.656695 -0.93805 0.070159 0.339322 -0.988329 0.062742 0.138814 -0.986739 -0.006785 0.162175 -0.146146 -0.974276 0.171543 -0.123689 -0.985219 0.118507 -0.523431 -0.808816 0.268024 -0.578913 -0.8151 -0.021746 -0.526749 -0.83449 0.161743 -0.853107 -0.51523 -0.082141 -0.853107 -0.51523 -0.082141 -0.493479 -0.782655 -0.379381 -0.260362 -0.828035 -0.496558 -0.156921 -0.519013 -0.840239 -0.165073 -0.536506 -0.827594 -0.118388 -0.94386 -0.308402 -0.173138 -0.553714 -0.814509 0.051965 -0.997426 -0.049404 0.73143 -0.681776 -0.013852 0.714003 -0.700116 -0.006111 0.695717 -0.718313 0.001786 -0.118952 -0.984865 0.126059 -0.293122 -0.831971 0.471068 -0.258847 -0.780904 0.568495 -0.273117 -0.893823 0.355652 -0.221137 -0.719472 0.658376 0.387588 -0.89973 -0.200654 0.387588 -0.89973 -0.200654 -0.325378 -0.733064 0.597282 -0.563982 -0.700193 0.437783 -0.75552 -0.60889 0.24175 -0.586345 -0.804005 -0.098877 -0.68903 -0.548773 -0.473378 -0.904177 -0.076922 -0.420174 -0.993431 -0.048913 -0.10345 -0.612484 -0.788812 -0.051369 -0.61583 -0.786471 -0.04708 -0.99589 -0.081034 0.040456 -0.776581 -0.249577 0.578475 -0.450728 -0.889908 0.070052 -0.312719 -0.763603 0.564905 0.920023 -0.390851 0.028167 0.920399 -0.390661 0.015803 0.920635 -0.39041 0.003437 0.007805 -0.003324 -0.999964 0.005597 -0.002391 -0.999982 0.005034 -0.00214 -0.999985 0.005857 -0.002481 -0.99998 0.001775 -0.000753 0.999998 0.001802 -0.000765 0.999998 0.001336 -0.000568 0.999999 0.001318 -0.00056 0.999999 0.919122 -0.392699 -0.031652 0.919122 -0.392699 -0.031652 0.919262 -0.392778 -0.026142 0.919262 -0.392778 -0.026142 -0.90607 0.39391 0.154505 -0.722287 0.314704 0.615843 -0.904921 0.393297 0.162588 -0.90607 0.39391 0.154505 0.00087 -0.000371 1 0.000861 -0.000367 1 0.003389 -0.001458 -0.999993 0.003649 -0.001548 -0.999992 0.084544 -0.048968 0.995216 0.091016 -0.045375 0.994815 -0.432195 0.26086 0.863226 -0.398638 0.31888 0.859886 -0.855966 0.475217 -0.203693 -0.727511 0.563292 0.391702 -0.581084 0.343561 -0.737772 -0.816593 0.378676 -0.435639 -0.913864 0.396111 -0.089152 -0.913458 0.396285 0.092479 -0.689846 0.300453 0.658666 -0.361532 0.158514 0.918786 0.024708 0.087586 -0.995851 0.024708 0.087586 -0.995851 0.041507 0.242265 -0.969322 0.041507 0.242265 -0.969322 0.02091 0.187218 -0.982096 0.02091 0.187218 -0.982096 0.001773 0.032105 -0.999483 0.001773 0.032105 -0.999483 0.024708 0.087585 0.995851 0.024708 0.087585 0.995851 0.041507 0.242265 0.969322 0.041507 0.242265 0.969322 0.02091 0.187218 0.982096 0.02091 0.187218 0.982096 0.001772 0.032105 0.999483 0.001772 0.032105 0.999483 0.998615 -0.052621 0 0.9986 -0.052647 -0.005071 0.998213 -0.052652 -0.028264 -0.000423 0.000022 1 -0.000423 0.000022 1 -0.987371 0.053072 -0.149271 -0.977654 0.052384 -0.203589 -0.986078 0.05244 -0.157797 -0.998601 0.052887 0 -0.986078 0.05244 0.157797 -0.977654 0.052384 0.203589 -0.987371 0.053072 0.149271 -0.000423 0.000022 -1 -0.000423 0.000022 -1 0.998213 -0.052651 0.028264 0.9986 -0.052646 0.005071 0.480966 0.837282 0.260057 0.528606 0.809061 0.256896 0.531904 0.846804 0 0.49806 0.867143 0 0.253364 0.426929 0.868066 0.426779 0.3545 0.831979 0.521053 0.764754 0.379019 0.459812 0.800522 0.384366 -0.151499 -0.391106 0.907791 0.040367 -0.460206 0.886894 -0.322394 -0.877945 0.353942 -0.236194 -0.905901 0.351504 -0.148513 -0.782377 0.604838 -0.274127 -0.742075 0.611702 -0.343239 -0.939248 0 -0.276809 -0.960925 0 -0.268933 -0.952235 0.144648 -0.3399 -0.929133 0.145535 0.480966 0.837282 -0.260057 0.528606 0.809061 -0.256896 -0.151499 -0.391106 -0.907791 0.253364 0.426929 -0.868066 0.426779 0.354501 -0.831979 0.040367 -0.460206 -0.886894 0.459812 0.800523 -0.384366 0.521053 0.764754 -0.379019 -0.322394 -0.877945 -0.353942 -0.274127 -0.742075 -0.611702 -0.148513 -0.782377 -0.604839 -0.236194 -0.905901 -0.351504 -0.3399 -0.929133 -0.145535 -0.268933 -0.952235 -0.144648 -0.939694 0.342018 -0.000000 -0.939695 0.342014 -0.000001 -0.939696 0.342012 0 -0.939694 0.342017 0 0.943057 -0.332627 0.001655 0.943025 -0.332723 -0.000002 0.946264 -0.323394 -0.000005 0.946325 -0.3232 0.003311 -0.939693 0.342019 -0.000000 -0.939693 0.342019 0.000000 -0.939693 0.342019 0.000000 -0.939694 0.342017 -0.000000 0.939693 -0.34202 -0.000002 0.983175 0.071645 0.168027 0.914102 -0.064027 0.400398 0.78266 -0.492141 0.381106 -0.939693 0.34202 0.000000 -0.939692 0.342021 0 0.939693 -0.34202 -0.000000 0.939692 -0.34202 0 -0.939691 0.342023 -0.000001 -0.939693 0.34202 0 -0.939693 0.34202 0 -0.939692 0.342022 -0.000000 0.56053 -0.802487 0.204501 0.939694 -0.342016 -0.000001 0.939693 -0.342018 -0.000001 0.64519 -0.69364 0.320302 -0.939693 0.342019 0 -0.939693 0.342018 0 -0.939692 0.342022 -0.000000 -0.939692 0.342021 0 0.933166 -0.359445 -0.000024 0.933166 -0.359446 0.000523 0.926316 -0.376745 0.001048 0.926317 -0.376745 -0.000048 0.92231 -0.36092 0.138132 0.954438 0.234181 0.18495 0.873579 -0.430956 0.226133 0.903844 -0.394054 0.166696 0.939697 -0.342009 -0.000002 -0.939694 0.342017 0.000000 -0.939695 0.342014 0.000001 0.94299 -0.332819 -0.00166 0.946193 -0.323585 -0.003321 -0.939693 0.342018 0.000000 -0.939694 0.342017 0.000000 -0.939693 0.342018 -0.000000 -0.939693 0.342018 -0.000000 0.939693 -0.34202 0.000002 0.78266 -0.49214 -0.381106 0.914102 -0.064028 -0.400398 0.983175 0.071646 -0.168027 -0.939693 0.34202 -0.000000 0.939692 -0.342021 0.000000 -0.939692 0.342023 0.000000 -0.939692 0.342022 0.000000 -0.939693 0.342019 0 -0.939693 0.342019 0 0.56053 -0.802487 -0.2045 0.64519 -0.69364 -0.320302 0.939693 -0.342018 0.000002 0.939694 -0.342016 0.000001 -0.939692 0.342021 0 -0.939692 0.342022 0.000000 0.926317 -0.376744 -0.001144 0.933166 -0.359445 -0.000571 0.926616 -0.351645 -0.133148 0.92231 -0.36092 -0.138132 0.903844 -0.394054 -0.166696 0.87358 -0.430956 -0.226131 0.856894 -0.443764 -0.26231 0.704425 0.188071 0.684408 0.691549 0.631425 0.350803 0.684446 0.688553 0.239642 0.67204 0.740515 0 0.684446 0.688553 -0.239641 0.691549 0.631425 -0.350803 0.704425 0.188071 -0.684408 0.351262 -0.53297 -0.769778 0.064503 -0.820875 -0.567454 -0.099111 -0.935149 -0.340106 -0.163267 -0.976467 -0.14091 -0.180309 -0.98361 0 -0.163267 -0.976467 0.140911 -0.099111 -0.935149 0.340107 0.064503 -0.820875 0.567454 0.351262 -0.532971 0.769778 0.74671 0.665149 -0.001284 0.78758 0.616212 0 0.809839 0.547077 0.211822 0.837489 0.507896 -0.201629 0.809839 0.547077 -0.211822 0.808814 0.498137 -0.312536 0.802842 0.102849 -0.587253 0.463594 -0.546834 -0.697175 0.142368 -0.827322 -0.543387 -0.047994 -0.94253 -0.330657 -0.125474 -0.982907 -0.134721 -0.127675 -0.982349 -0.136713 -0.167742 -0.985831 -0.000000 -0.159595 -0.987183 -0.000000 -0.167601 -0.985 0.041036 -0.127675 -0.982349 0.136713 -0.082023 -0.970438 0.226985 -0.047994 -0.942529 0.330658 0.142368 -0.827322 0.543387 0.463594 -0.546835 0.697174 0.802842 0.102849 0.587254 0.808814 0.498138 0.312536 0.441345 0.879306 0.178987 0.448574 0.893736 -0.004108 0.448576 0.893735 -0.00411 0.441354 0.879319 0.178901 0.569319 0.82211 -0.003368 0.441363 0.879332 0.178814 0.683701 0.714934 0.146365 0.440649 0.877972 -0.187065 0.440657 0.877985 -0.186983 0.553787 0.81499 -0.17062 0.657477 0.7381 -0.151434 -0.046838 -0.08797 -0.995021 -0.07032 -0.133775 -0.988514 -0.069903 -0.132959 -0.988653 -0.045997 -0.086328 -0.995204 0.515542 -0.318344 -0.795534 0.538188 -0.277795 -0.795728 -0.134397 -0.257292 -0.956942 -0.134397 -0.257291 -0.956942 0.435259 -0.426428 -0.792912 -0.167277 -0.31497 -0.934244 -0.169618 -0.31933 -0.93234 0.340805 -0.481179 -0.807662 -0.385651 -0.702064 -0.598648 -0.387152 -0.704911 -0.594318 -0.169818 -0.314088 -0.934083 0.700383 -0.507347 -0.502058 -0.483351 -0.875423 -0.002516 -0.483355 -0.875421 -0.002525 -0.466728 -0.884399 -0.00175 -0.468801 -0.881747 -0.052429 -0.449937 -0.89306 -0.000966 -0.454865 -0.889242 -0.048443 -0.386368 -0.70344 0.596567 -0.387859 -0.706274 0.592235 -0.463452 -0.88477 0.048937 -0.443976 -0.89483 0.046513 -0.167306 -0.315038 0.934216 -0.169637 -0.319385 0.932318 0.340796 -0.481202 0.807652 -0.16984 -0.314172 0.934051 0.700379 -0.507345 0.502066 0.700379 -0.507345 0.502066 -0.134397 -0.257292 0.956942 -0.134397 -0.25729 0.956943 0.435259 -0.426428 0.792912 -0.070317 -0.13377 0.988514 -0.069901 -0.132955 0.988654 0.515543 -0.318341 0.795534 -0.046833 -0.087962 0.995022 -0.045992 -0.086322 0.995205 -0.045152 -0.084681 0.995385 0.89687 -0.354935 0.263903 -0.175657 -0.984451 0 0.014275 -0.999898 0 0.025168 -0.969969 0.241922 -0.164175 -0.952908 0.254978 0.057105 -0.882222 0.467357 -0.130513 -0.860425 0.492579 0.107911 -0.742637 0.660943 -0.076966 -0.713307 0.696613 -0.007184 -0.521578 0.853173 0.174121 -0.560726 0.809486 0.251224 -0.348886 0.902865 0.07408 -0.298305 0.951591 0.333966 -0.121554 0.934714 0.161288 -0.058703 0.98516 0.416708 0.105778 0.902865 0.248495 0.180897 0.951592 0.493812 0.317618 0.809487 0.32976 0.40417 0.853174 0.559918 0.497823 0.662318 0.203742 0.689424 0.695114 0.347173 -0.937801 0 0.356059 -0.913386 0.197351 0.382112 -0.841806 0.381253 0.423557 -0.727937 0.539173 0.477569 -0.579541 0.660348 0.540467 -0.40673 0.736523 0.607965 -0.221281 0.762505 0.675463 -0.035832 0.736523 0.738361 0.136979 0.660349 0.792373 0.285375 0.539172 0.585573 -0.81062 0 0.592116 -0.792642 0.145316 0.6113 -0.739935 0.280728 0.641817 -0.656091 0.397009 0.681587 -0.546822 0.486235 0.727901 -0.419576 0.542325 0.777601 -0.283025 0.561456 0.827303 -0.146472 0.542325 0.873616 -0.019226 0.486236 0.915667 0.094086 0.39077 0.750653 -0.660696 0.000000 0.754897 -0.649038 0.094239 0.767337 -0.614857 0.182057 0.787128 -0.560482 0.257467 0.81292 -0.489619 0.315332 0.842955 -0.407099 0.351706 0.875187 -0.318543 0.364113 0.907419 -0.229986 0.351706 0.937454 -0.147465 0.315331 0.965367 -0.072125 0.250727 0.864206 -0.503139 0.000000 0.866271 -0.497464 0.045867 0.872326 -0.480828 0.08861 0.881958 -0.454363 0.125313 0.894512 -0.419873 0.153477 0.909131 -0.379708 0.171182 0.924819 -0.336605 0.17722 0.940506 -0.293505 0.171181 0.955125 -0.25334 0.153476 0.967842 -0.218315 0.124978 0.812566 0.350317 0.465848 0.586876 0.574669 0.570379 0.928547 0.120082 0.351255 0.978318 -0.066909 0.196002 0.993042 -0.091645 0.073954 0.992417 -0.097224 0.075208 0.970705 -0.084446 0.224944 0.996929 -0.07831 0 0.996929 -0.078308 0 0.429665 0.673924 0.601012 0.219695 0.603178 -0.766753 0.208436 0.57182 -0.793459 0.208507 0.57175 -0.79349 0.208357 0.571898 -0.793423 0.511307 0.859398 0 0.504482 0.850735 -0.14747 0.336626 0.924888 -0.176819 0.342016 0.939694 -0.000000 0.427034 0.743586 -0.514511 0.313604 0.670313 -0.672557 0.226018 0.620982 -0.750532 0.27001 0.741845 -0.613809 0.482099 0.820329 -0.307637 0.317307 0.871798 -0.373207 0.977366 -0.191445 0.090028 0.983352 -0.175361 0.047626 0.985431 -0.170074 0 0.812566 0.350318 0.465848 0.588303 0.575535 0.568031 0.923823 0.093177 0.371307 0.435113 0.672738 0.598415 0.461071 0.738393 0.492127 0.494449 0.831091 0.254574 0.486331 0.835738 0.255 0.452961 0.742886 0.492897 0.47817 0.840311 0.255403 0.444811 0.747314 0.493625 0.505914 0.862584 0 0.497814 0.867284 0 0.48967 0.871908 0 0.427985 0.675623 0.600302 0.435918 0.671294 0.59945 0.207214 0.766164 0.608322 0.939692 -0.342021 0.000000 0.939692 -0.342021 0 0.939692 -0.342022 0 0.939692 -0.342021 0.000000 0.939693 -0.342019 0.000000 0.939694 -0.342018 0.000000 0.939693 -0.34202 0.000000 0.939694 -0.342018 0.000001 0.342021 0.939692 0.000000 0.336631 0.924886 -0.17682 0.159652 0.972391 -0.170196 0.160692 0.987005 0 0.270006 0.741846 -0.613808 0.226097 0.620906 -0.750571 0.185387 0.67071 -0.718178 0.145209 0.784997 -0.602242 0.317307 0.871799 -0.373207 0.156151 0.919375 -0.361064 0.939693 -0.34202 -0.000000 0.939693 -0.34202 0 0.939692 -0.342021 0.000000 0.939692 -0.342021 0.000002 0.939693 -0.342019 0.000001 0.939692 -0.342021 0.000000 0.279325 0.729583 -0.624248 0.939692 -0.342021 0 0.939692 -0.342022 0.000000 0.939691 -0.342025 0.000001 0.939692 -0.342022 0.000000 0.939693 -0.34202 0 0.939693 -0.34202 0 0.939692 -0.342021 0.000002 0.939692 -0.342023 0.000003 0.939692 -0.342021 0.000001 0.939693 -0.34202 -0.000000 0.939693 -0.34202 0 0.602984 0.728678 -0.324713 0.307512 0.802438 -0.511399 -0.009193 0.940845 -0.338713 0.654804 0.747295 -0.113057 0.649811 0.747553 -0.137512 -0.022631 0.987203 -0.157855 0.661987 0.749515 0 -0.026011 0.999662 0 -0.164175 -0.952907 -0.254979 0.025168 -0.969969 -0.241922 -0.130512 -0.860425 -0.49258 0.057105 -0.882222 -0.467357 -0.076966 -0.713307 -0.696613 0.107911 -0.742637 -0.660943 -0.007184 -0.521578 -0.853173 0.174121 -0.560726 -0.809486 0.07408 -0.298305 -0.951591 0.251224 -0.348886 -0.902865 0.161288 -0.058703 -0.98516 0.333966 -0.121554 -0.934715 0.248495 0.180897 -0.951592 0.416708 0.105778 -0.902865 0.32976 0.40417 -0.853174 0.493812 0.317618 -0.809487 0.407414 0.622996 -0.66775 0.559918 0.497823 -0.662318 0.356059 -0.913386 -0.197351 0.382112 -0.841806 -0.381253 0.423557 -0.727937 -0.539172 0.477569 -0.579541 -0.660348 0.540467 -0.40673 -0.736523 0.607965 -0.221281 -0.762505 0.675463 -0.035831 -0.736523 0.738361 0.136979 -0.660348 0.792373 0.285375 -0.539172 0.592116 -0.792642 -0.145316 0.6113 -0.739935 -0.280728 0.641817 -0.65609 -0.397009 0.681587 -0.546821 -0.486236 0.727901 -0.419576 -0.542325 0.777602 -0.283025 -0.561456 0.827303 -0.146472 -0.542325 0.873616 -0.019226 -0.486235 0.915667 0.094086 -0.39077 0.754897 -0.649038 -0.094239 0.767337 -0.614856 -0.182057 0.787128 -0.560482 -0.257467 0.81292 -0.489619 -0.315332 0.842955 -0.407099 -0.351706 0.875187 -0.318542 -0.364113 0.907419 -0.229986 -0.351706 0.937454 -0.147465 -0.315331 0.965367 -0.072125 -0.250727 0.866271 -0.497464 -0.045867 0.872326 -0.480829 -0.08861 0.881959 -0.454362 -0.125313 0.894512 -0.419872 -0.153477 0.909131 -0.379708 -0.171182 0.924819 -0.336605 -0.17722 0.940506 -0.293505 -0.171181 0.955125 -0.25334 -0.153476 0.967843 -0.218314 -0.124978 0.812566 0.350318 -0.465847 0.586876 0.574669 -0.570379 0.928547 0.120083 -0.351255 0.978318 -0.066908 -0.196002 0.970706 -0.084444 -0.224944 0.992417 -0.097222 -0.075208 0.993042 -0.091644 -0.073954 0.429665 0.673924 -0.601011 0.219695 0.603178 0.766753 0.208357 0.571898 0.793423 0.208507 0.57175 0.79349 0.208436 0.57182 0.793459 0.336626 0.924888 0.176819 0.504482 0.850735 0.14747 0.427034 0.743586 0.514511 0.270009 0.741845 0.613809 0.226018 0.620982 0.750532 0.313604 0.670313 0.672557 0.317307 0.871798 0.373207 0.482099 0.820329 0.307637 0.977366 -0.191445 -0.090028 0.983352 -0.175361 -0.047627 0.588303 0.575536 -0.568031 0.812566 0.350317 -0.465848 0.923823 0.093177 -0.371307 0.435114 0.672739 -0.598414 0.461071 0.738394 -0.492127 0.452961 0.742886 -0.492897 0.486331 0.835738 -0.255 0.494449 0.831091 -0.254574 0.194789 0.850499 -0.488578 0.47817 0.840311 -0.255403 0.435919 0.671294 -0.599449 0.427985 0.675623 -0.600302 0.207214 0.766163 -0.608322 0.939693 -0.34202 -0.000000 0.939693 -0.34202 -0.000000 0.939693 -0.34202 -0.000000 0.939693 -0.342019 -0.000000 0.939692 -0.342023 -0.000000 0.939692 -0.342022 -0.000001 0.159652 0.972391 0.170196 0.336631 0.924886 0.17682 0.270006 0.741846 0.613808 0.145209 0.784997 0.602242 0.185387 0.67071 0.718178 0.226097 0.620906 0.750571 0.156151 0.919375 0.361064 0.317307 0.871799 0.373207 0.939693 -0.34202 0.000000 0.939692 -0.342021 -0.000000 0.939692 -0.342022 -0.000002 0.939692 -0.342023 -0.000001 0.939691 -0.342024 -0.000000 0.279325 0.729583 0.624248 0.939692 -0.342021 0.000000 0.939692 -0.342022 -0.000000 0.93969 -0.342026 -0.000001 0.939692 -0.342023 -0.000000 0.939691 -0.342024 -0.000003 0.939692 -0.342022 -0.000002 0.939692 -0.342022 -0.000001 0.939693 -0.34202 0.000000 0.307512 0.802438 0.511399 0.602985 0.728678 0.324713 -0.009193 0.940845 0.338713 0.649812 0.747553 0.137512 0.654804 0.747295 0.113057 -0.022631 0.987203 0.157855 0.937541 -0.341231 -0.067659 0.931551 -0.35769 -0.065353 0.925969 -0.373025 -0.058594 0.921176 -0.386194 -0.04784 0.917499 -0.396298 -0.033828 0.915188 -0.402648 -0.017506 0.914398 -0.404817 0 0.915187 -0.402649 0.017506 0.917498 -0.396299 0.033828 0.921176 -0.386195 0.04784 0.925969 -0.373025 0.058594 0.931551 -0.35769 0.065353 0.937541 -0.341231 0.067659 0.943529 -0.324781 0.065355 0.94911 -0.309447 0.058594 0.953904 -0.296275 0.047842 0.957579 -0.286177 0.033835 0.959891 -0.279827 0.017516 0.960679 -0.27766 0 0.95989 -0.279828 -0.017516 0.957579 -0.286177 -0.033835 0.953904 -0.296273 -0.047842 0.94911 -0.309447 -0.058594 0.943528 -0.324782 -0.065355 0.939693 -0.34202 0 -0.179692 0.95797 0.223617 -0.179692 0.95797 0.223617 -0.069689 0.891449 0.447731 -0.069689 0.891449 0.447731 -0.016691 0.812011 0.583403 -0.120136 0.728214 0.674738 -0.213121 0.654765 0.725164 -0.213121 0.654765 0.725164 -0.401191 0.487576 0.775446 -0.401191 0.487576 0.775446 -0.441105 0.390891 0.807856 -0.441105 0.390891 0.807856 -0.516228 0.187892 0.835587 -0.516228 0.187892 0.835587 -0.590198 -0.015331 0.807113 -0.590198 -0.015331 0.807113 -0.659125 -0.204704 0.723637 -0.659125 -0.204704 0.723637 -0.718316 -0.367319 0.590846 -0.718316 -0.367319 0.590846 -0.763734 -0.492099 0.41779 -0.763734 -0.492099 0.41779 -0.79228 -0.570546 0.216265 -0.79228 -0.570546 0.216265 -0.802014 -0.597306 0.000000 -0.802014 -0.597306 0.000000 -0.79228 -0.570546 -0.216265 -0.79228 -0.570546 -0.216265 -0.763734 -0.4921 -0.417789 -0.763734 -0.4921 -0.417789 -0.718316 -0.36732 -0.590846 -0.718316 -0.36732 -0.590846 -0.659125 -0.204704 -0.723637 -0.659125 -0.204704 -0.723637 -0.590198 -0.015331 -0.807113 -0.590198 -0.015331 -0.807113 -0.516227 0.187892 -0.835587 -0.516227 0.187892 -0.835587 -0.441105 0.390891 -0.807856 -0.441105 0.390891 -0.807856 -0.309716 0.575931 -0.756558 -0.309716 0.575931 -0.756558 -0.120136 0.728214 -0.674738 -0.120136 0.728214 -0.674738 -0.016691 0.812011 -0.583403 -0.069689 0.891449 -0.44773 -0.129909 0.933408 -0.334473 -0.129909 0.933408 -0.334473 -0.226715 0.967806 -0.109323 -0.226715 0.967806 -0.109323 -0.228082 0.973642 0 -0.228082 0.973642 0 0.667311 -0.242881 0.704063 0.72956 -0.071811 0.680136 0.55002 0.037451 0.834311 0.473658 -0.172397 0.863671 0.784508 0.080753 0.614838 0.617449 0.224418 0.753919 0.827898 0.201412 0.523468 0.670657 0.372153 0.641655 0.856659 0.283358 0.431095 0.705899 0.472088 0.528053 0.880652 0.346313 0.323294 0.735324 0.549774 0.396291 0.900314 0.398719 0.174523 0.759454 0.614352 0.214012 0.908101 0.418751 0 0.769032 0.63921 0 0.900314 0.398718 -0.174522 0.759454 0.614352 -0.214012 0.880653 0.346312 -0.323294 0.735324 0.549774 -0.396292 0.856659 0.283359 -0.431095 0.705898 0.472088 -0.528053 0.827898 0.201413 -0.523467 0.670657 0.372154 -0.641655 0.78451 0.080753 -0.614836 0.617449 0.224418 -0.753918 0.729562 -0.071811 -0.680134 0.550021 0.037451 -0.834311 0.667312 -0.242882 -0.704062 0.473657 -0.172397 -0.863672 0.604987 -0.414117 -0.680072 0.397203 -0.382451 -0.834243 0.546909 -0.573684 -0.609735 0.32596 -0.57819 -0.747961 0.497037 -0.710706 -0.497847 0.264783 -0.746275 -0.610708 0.45877 -0.815846 -0.352031 0.217839 -0.875251 -0.431835 0.434712 -0.881941 -0.182225 0.188328 -0.956329 -0.223535 0.426504 -0.904486 0 0.178262 -0.983983 0 0.434712 -0.881941 0.182225 0.188329 -0.956329 0.223535 0.458769 -0.815846 0.352032 0.21784 -0.87525 0.431836 0.497036 -0.710706 0.497848 0.264783 -0.746275 0.610708 0.54691 -0.573683 0.609735 0.325961 -0.57819 0.747961 0.604989 -0.414117 0.68007 0.397205 -0.382451 0.834242 0.026874 -0.009781 -0.999591 0.11527 0.233084 -0.965601 -0.06161 -0.252892 -0.965531 -0.144064 -0.479435 -0.865672 -0.214869 -0.673973 -0.706818 -0.269202 -0.823247 -0.499796 -0.303356 -0.917084 -0.258714 -0.315004 -0.94909 0 -0.303355 -0.917084 0.258714 -0.2692 -0.823247 0.499796 -0.214868 -0.673974 0.706818 -0.144063 -0.479437 0.865671 -0.061608 -0.252894 0.965531 0.026877 -0.009782 0.999591 0.115272 0.233084 0.9656 0.193839 0.449076 0.872214 0.255851 0.619572 0.742072 0.297495 0.734222 0.610258 0.330625 0.825005 0.458316 0.358065 0.900267 0.247606 0.368754 0.929527 0 0.358064 0.900268 -0.247605 0.330624 0.825006 -0.458316 0.297494 0.734223 -0.610258 0.255849 0.619573 -0.742072 0.193836 0.449077 -0.872214 -0.191597 0.818167 0.542119 -0.229744 0.71636 0.658822 -0.16338 0.898746 0.406895 -0.139686 0.965503 0.219753 -0.13077 0.991413 0 -0.139687 0.965503 -0.219752 -0.163382 0.898745 -0.406895 -0.191599 0.818167 -0.542119 -0.229744 0.71636 -0.658822 -0.285359 0.565057 -0.774133 -0.355686 0.373489 -0.856734 -0.434128 0.158009 -0.886885 -0.512637 -0.05769 -0.856665 -0.585794 -0.25869 -0.768065 -0.648617 -0.431293 -0.627123 -0.696822 -0.563736 -0.443442 -0.727123 -0.646994 -0.229543 -0.737459 -0.675392 0 -0.727123 -0.646994 0.229544 -0.696821 -0.563737 0.443443 -0.648616 -0.431293 0.627123 -0.585794 -0.25869 0.768066 -0.512634 -0.05769 0.856667 -0.434126 0.158009 0.886887 -0.355684 0.373489 0.856735 -0.285358 0.565057 0.774132 -0.390933 0.920419 0 -0.398122 0.899251 0.181236 -0.398122 0.899251 -0.181236 -0.41748 0.844399 -0.335709 -0.440439 0.778247 -0.4476 -0.472225 0.693927 -0.543571 -0.518241 0.569005 -0.638483 -0.576367 0.41097 -0.706332 -0.641041 0.23332 -0.731183 -0.705766 0.055488 -0.706269 -0.766081 -0.110223 -0.633223 -0.817875 -0.252524 -0.517023 -0.857615 -0.361717 -0.365591 -0.882597 -0.43036 -0.189245 -0.891118 -0.453773 0.000000 -0.882597 -0.430358 0.189245 -0.857615 -0.361717 0.365592 -0.817874 -0.252524 0.517024 -0.76608 -0.110223 0.633223 -0.705764 0.055488 0.706271 -0.64104 0.233319 0.731184 -0.576367 0.41097 0.706332 -0.518243 0.569005 0.638481 -0.472227 0.693927 0.543569 -0.440437 0.778248 0.447599 -0.417478 0.8444 0.335708 -0.331712 -0.911364 0.243685 -0.331712 -0.911364 0.243685 -0.342019 -0.939687 0.003531 -0.342019 -0.939687 0.003531 -0.087813 -0.241267 -0.966478 -0.087813 -0.241267 -0.966478 -0.000116 -0.000321 -1 -0.000116 -0.000321 -1 0.330145 0.90706 0.26124 0.330145 0.90706 0.26124 0.296319 0.814129 0.499389 0.296319 0.814129 0.499389 0.24177 0.664258 -0.707325 0.24177 0.664258 -0.707325 0.295233 0.811147 -0.504855 0.295233 0.811147 -0.504855 -0.08777 -0.241146 0.966512 -0.08777 -0.241146 0.966512 -0.164638 -0.45234 0.876517 -0.164638 -0.45234 0.876517 -0.22478 -0.617578 -0.753705 -0.22478 -0.617578 -0.753705 -0.164044 -0.450708 -0.877469 -0.164044 -0.450708 -0.877469 0.241841 0.664457 0.707113 0.241841 0.664457 0.707113 -0.331837 -0.911717 -0.24219 -0.331837 -0.911717 -0.24219 -0.305633 -0.839719 -0.448844 -0.305633 -0.839719 -0.448844 -0.222308 -0.610789 0.759945 -0.222308 -0.610789 0.759945 -0.269693 -0.740975 0.614997 -0.269693 -0.740975 0.614997 -0.307306 -0.844311 0.438978 -0.307306 -0.844311 0.438978 0.0895 0.245901 -0.965154 0.0895 0.245901 -0.965154 0.171754 0.471891 -0.864765 0.171754 0.471891 -0.864765 0.089147 0.244934 0.965433 0.089147 0.244934 0.965433 0.000319 0.000877 1 0.000319 0.000877 1 0.330212 0.907251 -0.260491 0.330212 0.907251 -0.260491 -0.269972 -0.741739 -0.613953 -0.269972 -0.741739 -0.613953 0.170915 0.469589 0.866184 0.170915 0.469589 0.866184 0.342017 0.93968 0.004987 0.342017 0.93968 0.004987 -0.872996 0.443828 0.202226 -0.892487 0.431685 0.130822 -0.919373 0.357841 0.163409 -0.8931 0.388651 0.226546 -0.836219 0.544825 0.062478 -0.874717 0.480483 0.063292 -0.843885 0.523894 0.115728 -0.833441 0.552608 -0.000482 -0.871024 0.49078 -0.021287 -0.892174 0.391318 -0.2256 -0.905123 0.396964 -0.15222 -0.873687 0.441837 -0.203596 -0.882108 0.460141 -0.100775 -0.856401 0.489214 -0.165067 -0.84462 0.521911 -0.119273 -0.914227 0.330861 -0.233924 -0.933875 0.317692 -0.16416 -0.991386 0.117672 0.05751 -0.980419 0.18877 0.056082 -0.983232 0.181344 -0.019199 -0.993811 0.111072 -0.001466 -0.857281 0.487104 0.166729 -0.985481 0.133392 -0.105043 -0.975003 0.203603 -0.08897 -0.976746 0.156608 -0.146432 -0.965137 0.188646 0.18145 -0.967802 0.223375 0.116028 -0.976846 0.156838 0.145513 -0.934486 0.274951 0.226137 -0.947202 0.280423 0.15547 -0.950862 0.227127 0.210414 -0.912885 0.334385 0.234154 -0.951997 0.226039 -0.206416 -0.958687 0.248523 -0.138404 -0.933224 0.277263 -0.228513 -0.986082 0.13042 0.103116 -0.836257 0.545144 -0.0591 -0.991852 0.115055 -0.054696 -0.965627 0.186625 -0.180928 -0.9281 0.372089 0.013412 -0.92898 0.368288 0.036893 -0.934538 0.354403 -0.032217 -0.926051 0.376329 -0.028383 -0.950978 0.309235 -0.003683 -0.952104 0.304821 -0.024148 -0.953722 0.300321 0.014919 -0.945667 0.323838 -0.029018 -0.940569 0.336451 -0.046165 -0.927302 0.374287 -0.004549 -0.937543 0.346149 0.034559 -0.947654 0.318405 0.023879 -0.944194 0.32649 0.043624 -0.939693 0.34202 -0.000000 0.854491 0.392015 0.340836 0.875238 0.447325 0.184009 0.875238 0.447325 0.184009 0.854491 0.392015 0.340836 0.883466 0.468494 0.000000 0.883466 0.468494 0.000000 0.875238 0.447325 -0.184008 0.875238 0.447325 -0.184008 0.854491 0.392016 -0.340836 0.854491 0.392016 -0.340836 0.829169 0.325556 -0.454414 0.829169 0.325556 -0.454414 0.79887 0.239258 -0.551872 0.79887 0.239258 -0.551872 0.753134 0.112079 -0.648249 0.753134 0.112079 -0.648249 0.695204 -0.048762 -0.717156 0.695204 -0.048762 -0.717156 0.629568 -0.229143 -0.742386 0.629568 -0.229143 -0.742386 0.563851 -0.409699 -0.71709 0.563851 -0.409699 -0.71709 0.50261 -0.577951 -0.642927 0.50261 -0.577951 -0.642927 0.450025 -0.722432 -0.524948 0.450025 -0.722432 -0.524948 0.409673 -0.833297 -0.371194 0.409673 -0.833297 -0.371194 0.384304 -0.90299 -0.192145 0.384304 -0.90299 -0.192145 0.37565 -0.926762 0.000000 0.37565 -0.926762 0.000000 0.384304 -0.90299 0.192145 0.384304 -0.90299 0.192145 0.409674 -0.833297 0.371193 0.409674 -0.833297 0.371193 0.450027 -0.722432 0.524945 0.450027 -0.722432 0.524945 0.502613 -0.577952 0.642925 0.502613 -0.577952 0.642925 0.563851 -0.4097 0.71709 0.563851 -0.4097 0.71709 0.629568 -0.229144 0.742386 0.629568 -0.229144 0.742386 0.695207 -0.048763 0.717154 0.695207 -0.048763 0.717154 0.753139 0.112075 0.648245 0.753139 0.112075 0.648245 0.798872 0.239257 0.551869 0.798872 0.239257 0.551869 0.829169 0.325556 0.454413 0.829169 0.325556 0.454413 0.068251 0.678037 0.731852 0.109849 0.790981 0.601899 -0.072565 0.81672 0.572452 -0.112586 0.709293 0.695864 0.141985 0.880644 0.452003 -0.042486 0.901936 0.429774 0.168753 0.954933 0.244185 -0.017303 0.972528 0.232142 0.179043 0.983841 0.000000 -0.007748 0.99997 0.000000 0.168751 0.954933 -0.244184 -0.017304 0.972528 -0.232142 0.141984 0.880644 -0.452003 -0.042488 0.901936 -0.429774 0.109848 0.790981 -0.601899 -0.072567 0.816721 -0.572452 0.068249 0.678038 -0.731852 -0.112589 0.709294 -0.695864 0.00683 0.509965 -0.860168 -0.171208 0.549502 -0.817762 -0.070934 0.297047 -0.952224 -0.245373 0.347129 -0.905149 -0.158112 0.057548 -0.985743 -0.328245 0.119471 -0.937007 -0.245372 -0.182195 -0.952154 -0.41119 -0.108419 -0.905079 -0.326683 -0.4056 -0.853678 -0.488482 -0.320778 -0.811472 -0.396507 -0.597443 -0.697025 -0.554854 -0.503136 -0.662564 -0.450085 -0.744649 -0.492871 -0.605783 -0.643064 -0.468504 -0.483765 -0.837186 -0.25513 -0.637798 -0.731026 -0.242516 -0.495252 -0.868749 0.000000 -0.648718 -0.761029 0.000000 -0.483764 -0.837187 0.25513 -0.637797 -0.731027 0.242516 -0.450082 -0.74465 0.492872 -0.605781 -0.643065 0.468504 -0.396505 -0.597443 0.697026 -0.554852 -0.503137 0.662565 -0.326681 -0.405601 0.853679 -0.48848 -0.320779 0.811473 -0.245367 -0.182196 0.952155 -0.411187 -0.10842 0.90508 -0.158108 0.057546 0.985743 -0.328242 0.11947 0.937008 -0.070932 0.297046 0.952225 -0.24537 0.347128 0.90515 0.006833 0.509964 0.860168 -0.171205 0.549502 0.817763 -0.710784 0.258704 0.654108 -0.768687 0.099618 0.63182 -0.652928 0.417629 0.631878 -0.600917 0.559057 0.571274 -0.559726 0.670892 0.486426 -0.53123 0.746499 0.400667 -0.510735 0.805543 0.300416 -0.493446 0.854527 0.162155 -0.487042 0.873379 -0.000000 -0.493447 0.854527 -0.162155 -0.510737 0.805543 -0.300415 -0.531232 0.746498 -0.400666 -0.559728 0.670892 -0.486425 -0.60092 0.559056 -0.571272 -0.652931 0.417629 -0.631876 -0.710787 0.258705 -0.654105 -0.768689 0.09962 -0.631818 -0.822645 -0.048623 -0.566472 -0.868978 -0.175924 -0.462523 -0.904531 -0.273606 -0.327053 -0.92688 -0.335011 -0.169296 -0.934503 -0.355955 -0.000000 -0.92688 -0.335011 0.169296 -0.90453 -0.273607 0.327054 -0.868977 -0.175926 0.462524 -0.822643 -0.048626 0.566474 -0.823708 0.539726 0.173785 -0.835963 0.506696 0.210774 -0.814734 0.565035 0.13017 -0.807201 0.586084 0.070223 -0.804394 0.594097 -0.000000 -0.807202 0.586084 -0.070223 -0.814735 0.565033 -0.130169 -0.82371 0.539724 -0.173783 -0.835965 0.506693 -0.210771 -0.853753 0.458139 -0.247414 -0.8762 0.396817 -0.273513 -0.901241 0.328025 -0.283132 -0.926304 0.259165 -0.273485 -0.949659 0.194996 -0.2452 -0.969715 0.139893 -0.200206 -0.985104 0.097611 -0.141568 -0.994779 0.07103 -0.073281 -0.998078 0.061964 -0.000000 -0.994779 0.071029 0.073281 -0.985105 0.097608 0.141569 -0.969715 0.13989 0.200208 -0.949659 0.194993 0.245204 -0.926303 0.259163 0.27349 -0.90124 0.328024 0.283138 -0.876198 0.396819 0.273518 -0.853751 0.458142 0.247417 -0.964429 0.263503 -0.021028 -0.962132 0.269782 -0.038982 -0.965306 0.261123 -0.000001 -0.96443 0.2635 0.021027 -0.962133 0.26978 0.038983 -0.959368 0.277314 0.052054 -0.955774 0.287249 0.063122 -0.950485 0.30181 0.074089 -0.943807 0.320191 0.081895 -0.93631 0.340789 0.084774 -0.928805 0.361408 0.081884 -0.921813 0.38062 0.073415 -0.915808 0.397117 0.059942 -0.911201 0.409776 0.042384 -0.908305 0.417732 0.021938 -0.907318 0.420445 -0.000000 -0.908306 0.41773 -0.021939 -0.911203 0.409772 -0.042383 -0.91581 0.397113 -0.059939 -0.921815 0.380616 -0.073409 -0.928807 0.361406 -0.081878 -0.936311 0.340789 -0.084767 -0.943806 0.320194 -0.081887 -0.950484 0.301814 -0.074083 -0.955772 0.287255 -0.063118 -0.959367 0.277319 -0.052053 -0.919765 -0.159993 -0.358377 -0.895757 -0.091725 -0.434977 -0.939593 -0.212125 -0.268641 -0.955862 -0.255554 -0.144986 -0.962272 -0.272091 -0.000001 -0.955861 -0.255557 0.144984 -0.939592 -0.212129 0.268641 -0.919764 -0.159999 0.358377 -0.895755 -0.091731 0.43498 -0.859661 0.008583 0.510793 -0.813979 0.135358 0.564905 -0.762274 0.277445 0.584776 -0.710509 0.419669 0.564849 -0.662272 0.5522 0.506429 -0.620851 0.666007 0.413497 -0.589067 0.753333 0.292384 -0.569088 0.808228 0.151349 -0.562275 0.826951 -0.000000 -0.56909 0.808226 -0.151349 -0.589071 0.75333 -0.292384 -0.620856 0.666003 -0.413495 -0.662278 0.552198 -0.506424 -0.710514 0.419669 -0.564843 -0.762279 0.277447 -0.584769 -0.813982 0.135362 -0.564898 -0.859664 0.008588 -0.510787 -0.709852 -0.151442 0.687877 -0.758378 -0.286344 0.585552 -0.648374 0.019204 0.76108 -0.578714 0.210635 0.78786 -0.508972 0.402251 0.761014 -0.443984 0.580808 0.682306 -0.388177 0.734139 0.557099 -0.345355 0.851794 0.393927 -0.318436 0.925753 0.203911 -0.309255 0.950979 -0.000000 -0.318438 0.925752 -0.203912 -0.34536 0.851791 -0.393927 -0.388183 0.734136 -0.557098 -0.44399 0.580808 -0.682302 -0.508979 0.402253 -0.761008 -0.578721 0.210637 -0.787854 -0.64838 0.019208 -0.761075 -0.709856 -0.151438 -0.687874 -0.758381 -0.286338 -0.58555 -0.790511 -0.37778 -0.482053 -0.817394 -0.448424 -0.361639 -0.83942 -0.507195 -0.195261 -0.848164 -0.529735 -0.000001 -0.839419 -0.507196 0.19526 -0.817392 -0.448428 0.361639 -0.790508 -0.377786 0.482052 0.291962 -0.106265 0.950508 0.376101 0.124908 0.918121 0.376101 0.124908 0.918121 0.291962 -0.106265 0.950508 0.454506 0.340328 0.823165 0.454506 0.340328 0.823165 0.521834 0.525314 0.672112 0.521834 0.525314 0.672112 0.573496 0.667259 0.475255 0.573496 0.667259 0.475255 0.605971 0.75649 0.246011 0.605971 0.75649 0.246011 0.617047 0.786926 0.000000 0.617047 0.786926 0.000000 0.605969 0.756492 -0.24601 0.605969 0.756492 -0.24601 0.573491 0.667263 -0.475256 0.573491 0.667263 -0.475256 0.521828 0.525317 -0.672114 0.521828 0.525317 -0.672114 0.454499 0.340332 -0.823168 0.454499 0.340332 -0.823168 0.376092 0.124913 -0.918124 0.376092 0.124913 -0.918124 0.291951 -0.106261 -0.950512 0.291951 -0.106261 -0.950512 0.207887 -0.337201 -0.918193 0.207887 -0.337201 -0.918193 0.132705 -0.54249 -0.829514 0.132705 -0.54249 -0.829514 0.073292 -0.704571 -0.705838 0.073292 -0.704571 -0.705838 0.032798 -0.813517 -0.580615 0.032798 -0.813517 -0.580615 0.002188 -0.899976 -0.435934 0.002188 -0.899976 -0.435934 -0.023411 -0.971597 -0.235479 -0.023411 -0.971597 -0.235479 -0.033152 -0.99945 0.000000 -0.033152 -0.99945 0.000000 -0.023409 -0.971597 0.23548 -0.023409 -0.971597 0.23548 0.002193 -0.899976 0.435934 0.002193 -0.899976 0.435934 0.032803 -0.813518 0.580614 0.032803 -0.813518 0.580614 0.073299 -0.704572 0.705837 0.073299 -0.704572 0.705837 0.132715 -0.542491 0.829512 0.132715 -0.542491 0.829512 0.207898 -0.337203 0.91819 0.207898 -0.337203 0.91819 0.227734 -0.625295 0.74642 0.233389 -0.64043 0.731696 0.070866 -0.364444 0.928525 0.009523 -0.390134 0.920709 0.242856 -0.970062 0 0.241349 -0.957044 0.160677 0.338322 -0.929544 0.146579 0.34202 -0.939693 0 0.212351 -0.783141 0.584464 0.210322 -0.660264 0.720983 -0.120369 -0.481356 0.868221 -0.259273 -0.642256 0.721307 0.235089 -0.908055 0.346654 0.336118 -0.923497 0.184875 0.30665 -0.842525 0.442853 0.342023 -0.939691 -0.000000 0.338327 -0.929542 0.14658 0.431326 -0.889911 0.148381 0.437599 -0.89917 0 0.287602 -0.79018 0.541203 0.249676 -0.685698 0.683725 0.273466 -0.659273 0.700411 0.354888 -0.760917 0.543194 0.324402 -0.89129 0.316804 0.408726 -0.854966 0.319338 0.241596 -0.651213 0.719412 -0.989205 -0.146539 0 -0.985413 -0.170182 0 -0.980671 -0.169326 0.098047 -0.975296 -0.063957 0.211442 -0.939693 -0.342019 -0.000000 -0.932995 -0.339584 0.119178 -0.956262 -0.13157 0.261252 -0.926758 -0.337315 0.165341 -0.859323 -0.01228 0.511286 -0.871962 0.085321 0.48208 -0.818477 -0.2979 0.491275 -0.688925 0.154591 0.708155 -0.732152 0.264978 0.627487 -0.449247 0.323428 0.83281 -0.561815 0.595976 0.573739 -0.302865 0.400265 0.864905 -0.425114 0.740153 0.52101 0.939693 0.342019 -0.000000 0.939693 0.342019 -0.000004 0.939693 0.34202 -0.000001 0.939693 0.34202 -0.000000 0.939692 0.342022 -0.000009 0.939692 0.342023 -0.000004 0.939691 0.342024 -0.000001 0.939692 0.342022 -0.000000 0.939691 0.342026 -0.000003 0.939692 0.342022 -0.000001 0.93969 0.342026 -0.000001 0.939692 0.342022 -0.000000 0.939691 0.342025 -0.000000 0.939692 0.342023 0 0.939691 0.342025 0 0.939692 0.342023 0 0.337795 -0.926781 0.164233 0.342215 -0.939622 0 0.322206 -0.878715 0.352197 0.281111 -0.75735 0.589405 -0.921792 -0.212523 0.324242 -0.967709 -0.252069 0 -0.747455 -0.059224 0.661667 -0.945447 -0.142711 0.292853 -0.986092 -0.166199 0 -0.625714 0.019086 0.779819 -0.706372 0.097525 0.70109 -0.825623 -0.012411 0.564086 -0.665497 0.092603 0.740633 -0.541873 0.532711 0.650071 -0.621662 0.283323 0.73025 -0.421449 0.742151 0.521145 0.939692 0.342022 -0.000001 0.939692 0.342023 -0.000002 0.939692 0.342021 0.000000 0.939692 0.342022 -0.000000 -0.845881 0.349665 0.402766 -0.920658 0.197718 0.336596 -0.972331 -0.01437 0.233167 -0.890517 0.45495 0 -0.954731 0.297469 0 -0.999995 0.003238 0 0.939694 0.342018 0 0.939693 0.342018 0.000000 0.939695 0.342015 0 0.939694 0.342016 0.000000 0.939693 0.342019 0.000000 0.939693 0.342019 0.000000 0.939693 0.34202 0.000000 0.939692 0.342021 0 0.211752 0.211768 -0.954105 0.16982 0.095817 -0.980806 0.011832 0.417438 -0.908628 -0.075065 0.605301 -0.792449 -0.340314 0.940312 0 -0.336573 0.930182 -0.146559 -0.240444 0.957257 -0.160764 -0.241997 0.970277 0 0.415919 0.483109 -0.770466 0.220662 0.382543 -0.897201 -0.180728 0.657456 -0.731498 -0.215149 0.7838 -0.582553 -0.327154 0.891186 -0.314256 -0.236509 0.908048 -0.345706 -0.447632 0.894218 0 -0.443963 0.879055 -0.173663 -0.884073 0.449195 -0.128989 -0.881566 0.472061 0.000000 -0.264108 0.820266 -0.507356 -0.152132 0.742601 -0.652227 0.007253 0.79225 -0.610153 -0.066029 0.875025 -0.479553 -0.396445 0.854907 -0.334613 -0.267633 0.902223 -0.338181 -0.248438 0.677305 -0.692486 0.977768 0.125084 -0.168297 0.889836 -0.454721 0.037678 0.887461 -0.460883 0 0.98167 0.190588 0 0.519694 -0.845526 0.122488 0.513938 -0.857827 0 0.908572 -0.41696 0.025338 0.619301 -0.762269 0.188181 0.891559 -0.04355 -0.450805 0.912675 -0.27268 -0.304418 0.730533 -0.257173 -0.632601 0.714973 -0.230787 -0.659963 0.640102 -0.483706 -0.596907 0.545902 -0.366411 -0.753481 0.546117 -0.617917 -0.565628 0.546117 -0.617917 -0.565628 0.211683 -0.090848 -0.973107 -0.862214 -0.494633 -0.109206 -0.883528 -0.444655 -0.147174 -0.649155 -0.706663 -0.281468 -0.649155 -0.706663 -0.281468 0.008515 -0.008925 -0.999924 -0.945479 -0.324509 -0.027626 -0.95161 -0.299396 -0.069278 -0.960334 -0.228736 -0.159497 -0.932141 -0.361778 0.01514 -0.927227 -0.373821 0.022535 -0.940975 -0.338454 0.003941 -0.944159 -0.329453 0.004899 -0.955109 -0.29621 -0.005108 -0.959754 -0.280841 0 -0.344836 0.938663 0 -0.344787 0.922718 -0.172376 -0.337968 0.871069 -0.356393 -0.296912 0.760997 -0.576825 0.962089 0.272736 0 0.93493 0.242494 -0.259042 0.768191 0.076779 -0.6356 0.978552 0.206001 0 0.954189 0.187994 -0.232769 0.850781 0.044501 -0.523632 0.5799 0.052351 -0.813004 0.5799 0.052351 -0.813004 0.653963 -0.102945 -0.74949 0.650352 -0.189217 -0.735689 0.641769 -0.274043 -0.716263 0.496722 -0.667782 -0.554377 0.496722 -0.667782 -0.554377 0.496722 -0.667782 -0.554377 0.496722 -0.667782 -0.554377 -0.830692 -0.5294 -0.172299 -0.830692 -0.5294 -0.172299 -0.893987 -0.440713 -0.080995 -0.939472 -0.342575 0.005973 -0.938317 -0.345634 0.009895 0.943067 -0.130105 -0.306099 0.868352 -0.302845 -0.392747 0.816377 -0.221098 -0.533521 0.978998 0.088926 -0.18345 0.978406 -0.206692 0 0.922033 -0.387111 0 0.997057 0.076663 0 -0.939051 -0.343779 0.000515 -0.939184 -0.343414 0 -0.939693 -0.34202 0.000000 -0.939693 -0.342019 0 -0.938706 -0.344717 0.001492 -0.939692 -0.342021 0.000000 -0.938285 -0.345843 0.003871 -0.939693 -0.34202 -0.000000 0.498053 0.803662 0.325684 0.557123 0.69709 0.451309 0.55666 0.697952 0.450548 0.496917 0.804748 0.324738 0.501426 0.800401 0.328528 0.562945 0.715655 0.413438 0.558056 0.695336 0.452859 0.500307 0.801489 0.32758 0.321475 0.940816 -0.107321 0.423193 0.875935 0.231615 0.350243 0.932882 -0.084033 0.340744 0.93566 -0.091833 0.084483 0.677319 -0.730823 0.157482 0.881138 -0.445864 0.047203 0.677798 -0.733732 0.138935 0.736215 -0.662333 0.130575 0.707089 -0.694964 -0.069511 0.382022 -0.921535 -0.069511 0.382022 -0.921535 0.033817 0.508046 -0.860666 0.033817 0.508046 -0.860666 -0.36605 0.611517 -0.701466 -0.40861 0.582063 -0.703023 -0.40861 0.582063 -0.703023 -0.318616 0.603822 -0.730672 -0.571008 0.609082 -0.550427 -0.824931 0.496082 -0.270909 -0.709105 0.559505 -0.429098 -0.491823 0.616373 -0.614975 -0.248443 0.665327 -0.704 -0.24261 0.66656 -0.704867 -0.243882 0.670086 -0.701075 -0.249078 0.66709 -0.702105 0.477967 0.819902 0.315131 0.477576 0.820678 0.313702 0.552941 0.671785 0.492911 0.479193 0.817477 0.319539 0.478775 0.818302 0.31805 0.380088 0.92495 0.000000 0.379688 0.925115 0.000000 0.381403 0.924409 -0.000000 0.380946 0.924597 0 -0.342009 0.939697 0 -0.338793 0.930867 -0.136771 -0.338784 0.93087 -0.136772 -0.341995 0.939702 0 -0.34204 0.939685 0.000000 -0.338824 0.930855 -0.136772 -0.338813 0.930859 -0.136771 -0.342031 0.939689 0 -0.321322 0.882855 -0.34252 -0.321313 0.882858 -0.342519 -0.321338 0.882848 -0.342521 -0.321334 0.88285 -0.342521 -0.278814 0.766037 -0.57918 -0.278807 0.766044 -0.579175 -0.278809 0.76604 -0.579178 -0.278815 0.766036 -0.579182 -0.563169 0.59917 -0.569066 0.032394 0.369551 -0.928646 0.032394 0.369551 -0.928646 0.227734 -0.625296 -0.74642 0.009523 -0.390135 -0.920709 0.070866 -0.364444 -0.928525 0.233388 -0.640431 -0.731695 0.338322 -0.929544 -0.146579 0.241349 -0.957044 -0.160677 0.212351 -0.783141 -0.584464 -0.259273 -0.642256 -0.721307 -0.120369 -0.481356 -0.868221 0.210322 -0.660264 -0.720983 0.336117 -0.923497 -0.184875 0.235089 -0.908055 -0.346654 0.30665 -0.842525 -0.442852 0.431327 -0.889911 -0.148381 0.338327 -0.929542 -0.14658 0.287602 -0.79018 -0.541203 0.354888 -0.760917 -0.543194 0.273466 -0.659274 -0.70041 0.249676 -0.685699 -0.683725 0.408726 -0.854966 -0.319338 0.324402 -0.89129 -0.316804 0.241596 -0.651213 -0.719411 -0.975296 -0.063957 -0.211442 -0.980671 -0.169326 -0.098047 -0.932995 -0.339584 -0.119178 -0.956262 -0.13157 -0.261252 -0.926758 -0.337315 -0.165341 -0.871962 0.085321 -0.482081 -0.859323 -0.01228 -0.511286 -0.818477 -0.2979 -0.491275 -0.732153 0.264977 -0.627487 -0.688925 0.15459 -0.708155 -0.561815 0.595976 -0.573739 -0.449247 0.323427 -0.83281 -0.425114 0.740153 -0.52101 -0.302865 0.400265 -0.864905 0.939694 0.342017 0.000000 0.939693 0.342019 0.000000 0.939693 0.34202 0.000001 0.939693 0.342018 0.000004 0.939692 0.342023 0.000004 0.939692 0.342023 0.00001 0.939692 0.342022 0.000000 0.939691 0.342024 0.000001 0.939692 0.342023 0.000001 0.939691 0.342026 0.000003 0.939692 0.342023 0.000000 0.93969 0.342026 0.000001 0.939692 0.342023 -0.000000 0.939691 0.342025 0.000000 0.337795 -0.926781 -0.164233 0.322206 -0.878715 -0.352197 0.281111 -0.75735 -0.589405 -0.921792 -0.212523 -0.324242 -0.747455 -0.059224 -0.661667 -0.945447 -0.142712 -0.292853 -0.825623 -0.012411 -0.564086 -0.706372 0.097525 -0.70109 -0.625714 0.019086 -0.779819 -0.665497 0.092603 -0.740633 -0.621662 0.283322 -0.73025 -0.541873 0.532711 -0.650072 -0.421449 0.742152 -0.521145 0.939692 0.342021 0.000002 0.939692 0.342021 0.000001 0.939692 0.342021 0.000000 0.939692 0.342021 -0.000000 -0.920658 0.197718 -0.336596 -0.845881 0.349664 -0.402766 -0.972331 -0.01437 -0.233167 0.939694 0.342018 -0.000000 0.939695 0.342015 -0.000000 0.939694 0.342018 -0.000000 0.939694 0.342016 -0.000000 0.939693 0.342019 -0.000000 0.939693 0.342019 0 0.211752 0.211768 0.954104 -0.075065 0.605301 0.79245 0.01183 0.417438 0.908629 0.169819 0.095817 0.980806 -0.240442 0.957258 0.160762 -0.336569 0.930184 0.146557 0.415919 0.48311 0.770465 -0.215149 0.783801 0.582552 -0.180729 0.657456 0.731498 0.220661 0.382544 0.8972 -0.236506 0.908049 0.345704 -0.327149 0.89119 0.314252 -0.884074 0.449195 0.128989 -0.443963 0.879055 0.173663 -0.264108 0.820266 0.507356 -0.06603 0.875026 0.479552 0.007252 0.79225 0.610154 -0.152132 0.7426 0.652227 -0.267633 0.902223 0.338181 -0.396445 0.854907 0.334612 -0.248438 0.677305 0.692486 0.977768 0.125084 0.168297 0.889836 -0.454722 -0.037677 0.519693 -0.845527 -0.122488 0.908571 -0.416961 -0.025338 0.6193 -0.762271 -0.18818 0.891559 -0.043549 0.450805 0.912675 -0.27268 0.304418 0.730533 -0.257173 0.632601 0.714972 -0.230786 0.659964 0.640103 -0.483705 0.596907 0.545902 -0.36641 0.753481 0.546119 -0.617914 0.565629 0.546119 -0.617914 0.565629 0.211682 -0.090848 0.973107 -0.862212 -0.494635 0.109206 -0.649152 -0.706667 0.281467 -0.649152 -0.706667 0.281467 -0.883527 -0.444657 0.147174 0.00851 -0.008925 0.999924 -0.945479 -0.32451 0.027626 -0.960333 -0.228738 0.159497 -0.95161 -0.299397 0.069278 -0.932142 -0.361777 -0.01514 -0.927228 -0.373819 -0.022535 -0.940975 -0.338454 -0.003941 -0.944159 -0.329453 -0.004899 -0.955109 -0.296211 0.005108 -0.344787 0.922718 0.172376 -0.337968 0.871069 0.356393 -0.296912 0.760997 0.576825 0.93493 0.242494 0.259042 0.768191 0.076779 0.6356 0.954189 0.187994 0.232769 0.850781 0.0445 0.523633 0.5799 0.052351 0.813004 0.5799 0.052351 0.813004 0.650352 -0.189217 0.735689 0.653963 -0.102945 0.74949 0.641769 -0.274042 0.716263 0.496723 -0.667782 0.554377 0.496723 -0.667782 0.554377 0.496723 -0.667782 0.554377 0.496723 -0.667782 0.554377 -0.830688 -0.529405 0.172299 -0.893986 -0.440715 0.080995 -0.830688 -0.529405 0.172299 -0.938317 -0.345634 -0.009895 -0.939472 -0.342574 -0.005972 0.943067 -0.130105 0.306099 0.816377 -0.221099 0.533521 0.868352 -0.302845 0.392747 0.978998 0.088926 0.183451 -0.939051 -0.343779 -0.000515 -0.939693 -0.342019 -0.000000 -0.938706 -0.344717 -0.001492 -0.939692 -0.342021 -0.000000 -0.938285 -0.345843 -0.003871 -0.939693 -0.34202 0.000000 0.498054 0.803661 -0.325684 0.49692 0.804746 -0.324737 0.556663 0.697949 -0.450548 0.557125 0.697089 -0.451309 0.501424 0.800402 -0.328527 0.500307 0.801489 -0.327579 0.558056 0.695337 -0.452858 0.562944 0.715656 -0.413438 0.321477 0.940816 0.107321 0.423198 0.875932 -0.231616 0.350241 0.932882 0.084036 0.340743 0.93566 0.091835 0.084483 0.67732 0.730822 0.047203 0.6778 0.733729 0.15748 0.88114 0.445862 0.138934 0.736215 0.662333 0.130575 0.707089 0.694965 -0.069509 0.382025 0.921534 -0.069509 0.382025 0.921534 0.033815 0.508049 0.860664 0.033815 0.508049 0.860664 -0.366049 0.611517 0.701466 -0.318616 0.60382 0.730675 -0.408605 0.582064 0.703024 -0.408605 0.582064 0.703024 -0.571009 0.609078 0.55043 -0.491823 0.616372 0.614976 -0.709104 0.559506 0.429097 -0.82493 0.496083 0.270909 -0.248442 0.665327 0.704001 -0.242609 0.666558 0.704869 -0.243884 0.670082 0.701078 -0.249078 0.667089 0.702105 0.477579 0.820676 -0.313703 0.477968 0.819902 -0.315132 0.55294 0.671787 -0.492909 0.478774 0.818303 -0.31805 0.479193 0.817477 -0.319538 -0.338781 0.930871 0.13677 -0.338792 0.930867 0.13677 -0.338813 0.930859 0.136771 -0.338824 0.930855 0.136773 -0.321311 0.88286 0.342517 -0.321321 0.882855 0.342519 -0.321334 0.88285 0.342521 -0.321338 0.882848 0.342521 -0.278804 0.766045 0.579175 -0.278813 0.766038 0.57918 -0.278815 0.766036 0.579181 -0.278809 0.766041 0.579178 -0.563169 0.599172 0.569064 0.032394 0.369551 0.928646 0.032394 0.369551 0.928646 -0.954244 -0.298978 -0.005498 -0.953065 -0.302088 -0.020269 -0.981689 -0.187837 -0.031672 -0.982009 -0.188496 -0.011332 -0.977004 -0.213145 -0.005778 -0.955206 -0.295798 0.009286 -0.925668 -0.37811 -0.01308 -0.925837 -0.377145 -0.024234 -0.925383 -0.379027 -0.001926 -0.985081 -0.172092 0 -0.978977 -0.20397 0 -0.995412 -0.095326 -0.008238 -0.99534 -0.096424 0 -0.994952 -0.094176 -0.034658 0.98576 0.083428 -0.146005 0.977772 0.15179 -0.144647 0.90861 0.068662 -0.411964 0.959949 0.05078 -0.275536 0.955051 0.249322 -0.160364 0.830891 0.096614 -0.547984 0.920504 0.350687 -0.172311 0.745638 0.235188 -0.623466 0.115486 -0.362167 -0.924932 0.155519 -0.670364 -0.725552 0.115502 -0.678935 -0.725056 0.088475 -0.37226 -0.923902 0.207393 -0.978258 0.000000 0.15368 -0.988121 0.000000 0.04739 -0.108799 -0.992933 0.03768 -0.114001 -0.992766 0.027961 -0.119192 -0.992477 0.061398 -0.382041 -0.922103 0.075324 -0.686363 -0.723348 0.099502 -0.995037 0.000000 -0.926496 -0.375135 0.029629 -0.926496 -0.375135 0.029629 -0.933207 -0.357259 0.038615 -0.933207 -0.357259 0.038615 -0.973898 -0.221359 0.050229 -0.973898 -0.221359 0.050229 -0.973898 -0.221359 0.050229 -0.973898 -0.221359 0.050229 -0.99366 -0.111532 -0.014136 -0.99366 -0.111532 -0.014136 -0.993759 -0.111546 0 -0.993759 -0.111546 0 -0.026056 -0.278751 -0.96001 0.546568 -0.19997 -0.813188 0.504188 0.075613 -0.860277 -0.062257 -0.161531 -0.984902 -0.045724 -0.544969 -0.837209 0.741546 -0.333882 -0.581921 -0.045724 -0.544969 -0.837209 -0.066704 -0.811752 -0.580181 -0.066704 -0.811752 -0.580181 -0.066704 -0.811752 -0.580181 -0.066704 -0.811752 -0.580181 0.912147 0.362732 0.190823 0.90102 0.386253 0.197412 0.940179 0.295975 0.16871 0.943609 -0.263678 -0.200188 0.967429 0.253142 0.000000 0.804177 0.437402 0.402466 0.813745 0.392461 0.428712 0.816866 0.464239 0.342363 0.864447 0.502725 0.000000 0.951595 0.306339 0.024947 0.920181 0.383489 0.078757 0.962866 0.243125 -0.117383 0.926367 0.365689 -0.090082 0.973661 0.226114 0.029281 0.98005 0.173345 -0.097232 0.977169 0.212464 0 0.980886 0.194583 0 0.894238 0.058535 -0.443748 0.810648 0.063674 -0.582061 0.720435 0.222991 -0.656695 0.93805 0.070159 -0.339322 0.988329 0.062743 -0.138814 0.986739 -0.006785 -0.162175 0.998408 0.056396 0 0.999796 -0.020215 0 0.146146 -0.974276 -0.171543 0.123689 -0.985219 -0.118507 0.52343 -0.808816 -0.268025 0.578913 -0.8151 0.021746 0.526745 -0.834493 -0.161743 0.8531 -0.515242 0.08214 0.8531 -0.515242 0.08214 0.493475 -0.782658 0.37938 0.260362 -0.828035 0.496558 0.156921 -0.519014 0.840238 0.165073 -0.536506 0.827594 0.11839 -0.94386 0.308402 0.173138 -0.553714 0.814509 -0.051963 -0.997426 0.049404 -0.731429 -0.681777 0.013852 -0.714002 -0.700117 0.006111 -0.695717 -0.718313 -0.001786 0.118952 -0.984865 -0.126059 0.293122 -0.831971 -0.471068 0.258847 -0.780904 -0.568495 0.273117 -0.893823 -0.355652 0.221137 -0.719472 -0.658376 -0.387588 -0.89973 0.200654 -0.387588 -0.89973 0.200654 0.325376 -0.733064 -0.597283 0.563981 -0.700194 -0.437783 0.75552 -0.60889 -0.24175 0.586345 -0.804005 0.098877 0.68903 -0.548773 0.473378 0.904177 -0.076922 0.420174 0.993431 -0.048912 0.10345 0.612484 -0.788812 0.051369 0.615831 -0.786471 0.04708 0.99589 -0.081033 -0.040456 0.776581 -0.249576 -0.578475 0.450729 -0.889908 -0.070052 0.312719 -0.763603 -0.564905 -0.920023 -0.390851 -0.028167 -0.920399 -0.390661 -0.015803 -0.920635 -0.39041 -0.003437 -0.007805 -0.003324 0.999964 -0.005598 -0.002391 0.999982 -0.005035 -0.00214 0.999985 -0.005857 -0.002481 0.99998 -0.001772 -0.000752 -0.999998 -0.001799 -0.000764 -0.999998 -0.001335 -0.000567 -0.999999 -0.001317 -0.00056 -0.999999 -0.919122 -0.3927 0.031653 -0.919122 -0.3927 0.031653 -0.919262 -0.392778 0.026142 -0.919262 -0.392778 0.026142 0.906068 0.393916 -0.154505 0.722286 0.314706 -0.615843 0.90492 0.3933 -0.162588 0.906068 0.393916 -0.154505 -0.000871 -0.000371 -1 -0.000862 -0.000367 -1 -0.00339 -0.001458 0.999993 -0.003649 -0.001548 0.999992 -0.084544 -0.048968 -0.995216 -0.091016 -0.045375 -0.994815 0.432195 0.26086 -0.863226 0.398638 0.31888 -0.859886 0.855966 0.475217 0.203693 0.727511 0.563292 -0.391702 0.581084 0.343561 0.737772 0.816593 0.378676 0.435639 0.913864 0.396111 0.089152 0.913458 0.396286 -0.092479 0.689846 0.300453 -0.658666 0.361532 0.158514 -0.918786 -0.954244 -0.298979 0.005498 -0.982009 -0.188496 0.011332 -0.981689 -0.187837 0.031672 -0.953064 -0.302088 0.020269 -0.977003 -0.213145 0.005778 -0.955205 -0.295798 -0.009286 -0.925837 -0.377146 0.024233 -0.925668 -0.37811 0.01308 -0.925383 -0.379027 0.001926 -0.995412 -0.095325 0.008238 -0.994952 -0.094175 0.034658 0.98576 0.083428 0.146005 0.959949 0.050781 0.275536 0.90861 0.068661 0.411963 0.977772 0.15179 0.144647 0.830891 0.096613 0.547984 0.955051 0.249322 0.160365 0.745638 0.235188 0.623466 0.920504 0.350687 0.172312 0.115485 -0.362168 0.924931 0.088474 -0.372261 0.923901 0.115502 -0.678935 0.725056 0.155519 -0.670365 0.725551 0.047388 -0.1088 0.992934 0.03768 -0.114001 0.992766 0.027962 -0.119191 0.992477 0.061398 -0.382041 0.922103 0.075324 -0.686363 0.723348 -0.926496 -0.375136 -0.029629 -0.933206 -0.357261 -0.038615 -0.933206 -0.357261 -0.038615 -0.926496 -0.375136 -0.029629 -0.973898 -0.22136 -0.050229 -0.973898 -0.22136 -0.050229 -0.973898 -0.22136 -0.050229 -0.973898 -0.22136 -0.050229 -0.99366 -0.111538 0.014136 -0.99366 -0.111538 0.014136 -0.026055 -0.27875 0.96001 -0.062256 -0.16153 0.984902 0.504188 0.075613 0.860277 0.546568 -0.19997 0.813188 -0.045724 -0.54497 0.837208 -0.045724 -0.54497 0.837208 0.741546 -0.333882 0.581921 -0.066704 -0.811751 0.580182 -0.066704 -0.811751 0.580182 -0.066704 -0.811751 0.580182 -0.066704 -0.811751 0.580182 0.90102 0.386254 -0.197411 0.912147 0.362733 -0.190823 0.940178 0.295975 -0.16871 0.943609 -0.263678 0.200188 0.804177 0.437402 -0.402466 0.813745 0.39246 -0.428712 0.816865 0.46424 -0.342363 0.920182 0.383488 -0.078757 0.951596 0.306339 -0.024947 0.926367 0.365689 0.090082 0.962866 0.243125 0.117383 0.973661 0.226115 -0.029281 0.98005 0.173345 0.097232 0.810648 0.063673 0.582061 0.894238 0.058535 0.443748 0.720435 0.222991 0.656695 0.93805 0.07016 0.339322 0.986739 -0.006785 0.162175 0.988329 0.062743 0.138814 0.146147 -0.974276 0.171543 0.578912 -0.8151 -0.021745 0.523431 -0.808816 0.268025 0.123691 -0.985219 0.118508 0.526747 -0.834492 0.161742 0.493477 -0.782656 -0.37938 0.853104 -0.515235 -0.08214 0.853104 -0.515235 -0.08214 0.260361 -0.828037 -0.496555 0.165073 -0.536509 -0.827592 0.156922 -0.519014 -0.840238 0.118388 -0.943861 -0.308399 0.173136 -0.553718 -0.814506 -0.051964 -0.997426 -0.049403 -0.714002 -0.700116 -0.006111 -0.73143 -0.681776 -0.013851 0.118953 -0.984865 0.126061 -0.695717 -0.718314 0.001785 0.273117 -0.893822 0.355653 0.258848 -0.780903 0.568497 0.293123 -0.831968 0.471072 0.221137 -0.719472 0.658376 -0.387584 -0.899732 -0.200651 -0.387584 -0.899732 -0.200651 0.563981 -0.700193 0.437785 0.325378 -0.733064 0.597282 0.755519 -0.608889 0.241753 0.586343 -0.804006 -0.098876 0.904177 -0.076926 -0.420174 0.689029 -0.548775 -0.473376 0.612483 -0.788813 -0.051368 0.993431 -0.048915 -0.10345 0.615829 -0.786472 -0.04708 0.99589 -0.081036 0.040455 0.450727 -0.889909 0.070052 0.77658 -0.24958 0.578475 0.312719 -0.763605 0.564902 -0.920399 -0.390661 0.015803 -0.920023 -0.390851 0.028167 -0.920635 -0.39041 0.003437 -0.0078 -0.003324 -0.999964 -0.005854 -0.002481 -0.99998 -0.005032 -0.00214 -0.999985 -0.005595 -0.002391 -0.999982 -0.001776 -0.000753 0.999998 -0.001319 -0.00056 0.999999 -0.001336 -0.000568 0.999999 -0.001802 -0.000765 0.999998 -0.919122 -0.392699 -0.031651 -0.919262 -0.392778 -0.026141 -0.919262 -0.392778 -0.026141 -0.919122 -0.392699 -0.031651 0.90607 0.39391 0.154506 0.90607 0.39391 0.154506 0.904921 0.393297 0.162588 0.722287 0.314704 0.615844 -0.000861 -0.000367 1 -0.00087 -0.000371 1 -0.003389 -0.001458 -0.999993 -0.003648 -0.001548 -0.999992 -0.084544 -0.048968 0.995216 0.398638 0.31888 0.859886 0.432195 0.26086 0.863226 -0.091015 -0.045375 0.994815 0.855966 0.475217 -0.203693 0.727511 0.563293 0.3917 0.816593 0.378675 -0.435639 0.581084 0.34356 -0.737772 0.913865 0.39611 -0.089152 0.913458 0.396285 0.092479 0.689846 0.300453 0.658666 0.361531 0.158513 0.918787 -0.024708 0.087585 -0.995851 -0.024708 0.087585 -0.995851 -0.041507 0.242265 -0.969322 -0.041507 0.242265 -0.969322 -0.02091 0.187218 -0.982096 -0.02091 0.187218 -0.982096 -0.001772 0.032105 -0.999483 -0.001772 0.032105 -0.999483 -0.024708 0.087585 0.995851 -0.024708 0.087585 0.995851 -0.041507 0.242265 0.969322 -0.041507 0.242265 0.969322 -0.02091 0.187218 0.982096 -0.02091 0.187218 0.982096 -0.001772 0.032105 0.999483 -0.001772 0.032105 0.999483 -0.9986 -0.052647 -0.005071 -0.998615 -0.052621 0 -0.998213 -0.052652 -0.028264 0.000423 0.000022 1 0.000423 0.000022 1 0.977654 0.052384 -0.203589 0.987371 0.053072 -0.149271 0.986078 0.05244 -0.157797 0.998601 0.052887 0 0.986078 0.05244 0.157797 0.977654 0.052384 0.203589 0.987371 0.053072 0.149271 0.000423 0.000022 -1 0.000423 0.000022 -1 -0.9986 -0.052646 0.005071 -0.998213 -0.052651 0.028264 -0.480966 0.837282 0.260057 -0.49806 0.867143 0 -0.531904 0.846804 0 -0.528606 0.809061 0.256896 -0.253364 0.426929 0.868066 -0.459812 0.800523 0.384366 -0.521053 0.764754 0.37902 -0.426779 0.354501 0.831979 0.151499 -0.391106 0.907791 -0.040367 -0.460206 0.886894 0.322394 -0.877945 0.353942 0.274127 -0.742075 0.611702 0.148513 -0.782377 0.604838 0.236194 -0.905901 0.351504 0.343239 -0.939248 0 0.3399 -0.929133 0.145535 0.268933 -0.952235 0.144648 0.276809 -0.960925 0 -0.480966 0.837282 -0.260057 -0.528606 0.809061 -0.256895 0.151499 -0.391106 -0.907791 -0.040367 -0.460206 -0.886894 -0.426779 0.354501 -0.831979 -0.253364 0.426929 -0.868066 -0.521052 0.764754 -0.379019 -0.459812 0.800522 -0.384366 0.322394 -0.877945 -0.353942 0.236194 -0.905901 -0.351504 0.148513 -0.782377 -0.604839 0.274127 -0.742075 -0.611702 0.268933 -0.952235 -0.144648 0.3399 -0.929133 -0.145535 0.939694 0.342017 -0.000000 0.939694 0.342017 0 0.939696 0.342012 0 0.939695 0.342014 -0.000001 -0.943057 -0.332627 0.001655 -0.946325 -0.3232 0.003311 -0.946264 -0.323395 -0.000005 -0.943024 -0.332724 -0.000002 0.939693 0.342018 -0.000000 0.939694 0.342017 -0.000000 0.939693 0.342018 0.000000 0.939693 0.342018 0.000000 -0.939693 -0.34202 -0.000002 -0.782659 -0.492142 0.381105 -0.914102 -0.06403 0.400398 -0.983175 0.071644 0.168027 0.939693 0.34202 0.000000 0.939692 0.342021 0 -0.939692 -0.342021 -0.000000 -0.939693 -0.342021 0 0.939692 0.342023 -0.000000 0.939692 0.342022 -0.000000 0.939693 0.342019 0 0.939693 0.342019 0 -0.56053 -0.802487 0.204501 -0.64519 -0.693641 0.320301 -0.939693 -0.342018 -0.000002 -0.939694 -0.342016 -0.000001 0.939693 0.342019 0 0.939692 0.342021 0 0.939692 0.342022 -0.000000 0.939693 0.342018 0 -0.933166 -0.359445 -0.000024 -0.926317 -0.376744 -0.000048 -0.926317 -0.376743 0.001048 -0.933166 -0.359444 0.000523 -0.954438 0.234181 0.18495 -0.92231 -0.36092 0.138132 -0.903844 -0.394054 0.166696 -0.87358 -0.430955 0.226133 -0.939697 -0.342009 -0.000002 0.939694 0.342018 0.000000 0.939695 0.342014 0.000001 -0.942989 -0.332819 -0.001661 -0.946193 -0.323587 -0.003321 0.939693 0.342019 0.000000 0.939693 0.342019 -0.000000 0.939693 0.342019 -0.000000 0.939694 0.342017 0.000000 -0.939693 -0.34202 0.000002 -0.983176 0.071644 -0.168027 -0.914102 -0.06403 -0.400398 -0.782659 -0.492141 -0.381105 0.939693 0.34202 -0.000000 -0.939693 -0.34202 0.000000 0.939692 0.342023 0.000001 0.939693 0.34202 0 0.939693 0.34202 0 0.939692 0.342021 0.000000 -0.56053 -0.802487 -0.204501 -0.939694 -0.342016 0.000001 -0.939693 -0.342018 0.000001 -0.64519 -0.693641 -0.320301 0.939692 0.342022 0.000000 0.939693 0.342021 0 -0.933166 -0.359446 -0.000571 -0.926316 -0.376745 -0.001144 -0.92231 -0.360922 -0.138132 -0.926615 -0.351647 -0.133148 -0.87358 -0.430956 -0.226131 -0.903844 -0.394054 -0.166696 -0.856894 -0.443764 -0.26231 -0.704425 0.18807 0.684408 -0.691549 0.631425 0.350803 -0.684447 0.688553 0.239642 -0.67204 0.740515 0 -0.684446 0.688553 -0.239642 -0.691549 0.631425 -0.350803 -0.704425 0.18807 -0.684408 -0.351262 -0.532971 -0.769777 -0.064503 -0.820875 -0.567454 0.099111 -0.935149 -0.340106 0.163267 -0.976467 -0.14091 0.180309 -0.98361 0 0.163267 -0.976467 0.140911 0.099111 -0.935149 0.340107 -0.064503 -0.820875 0.567454 -0.351262 -0.532971 0.769778 -0.809839 0.547077 0.211822 -0.78758 0.616212 0 -0.746709 0.66515 -0.001284 -0.809839 0.547077 -0.211822 -0.837489 0.507896 -0.201629 -0.808815 0.498136 -0.312536 -0.802842 0.102846 -0.587253 -0.463594 -0.546836 -0.697174 -0.142368 -0.827323 -0.543386 0.047994 -0.94253 -0.330657 0.127675 -0.982349 -0.136713 0.125475 -0.982907 -0.134722 0.159595 -0.987183 0 0.167743 -0.985831 0 0.127675 -0.982349 0.136713 0.167601 -0.985 0.041036 0.082023 -0.970438 0.226985 0.047994 -0.94253 0.330657 -0.142368 -0.827323 0.543386 -0.463594 -0.546836 0.697174 -0.802842 0.102846 0.587254 -0.808815 0.498136 0.312536 -0.441344 0.879306 0.178987 -0.441353 0.879319 0.1789 -0.448576 0.893735 -0.00411 -0.448573 0.893737 -0.004108 -0.441363 0.879332 0.178814 -0.569318 0.82211 -0.003368 -0.683701 0.714934 0.146365 -0.440657 0.877986 -0.186983 -0.440648 0.877973 -0.187064 -0.553786 0.814991 -0.17062 -0.657474 0.738102 -0.151434 0.046838 -0.087969 -0.995021 0.045997 -0.086328 -0.995204 0.069903 -0.132958 -0.988653 0.07032 -0.133774 -0.988514 -0.538188 -0.277796 -0.795728 -0.515542 -0.318345 -0.795533 0.134397 -0.257291 -0.956943 0.134397 -0.257292 -0.956942 -0.435259 -0.426428 -0.792912 0.169617 -0.319329 -0.93234 0.167277 -0.314969 -0.934245 -0.340805 -0.481179 -0.807662 0.387152 -0.70491 -0.594319 0.385651 -0.702063 -0.598649 0.169817 -0.314088 -0.934083 -0.700383 -0.507348 -0.502058 0.483355 -0.875421 -0.002526 0.483351 -0.875423 -0.002516 0.4688 -0.881747 -0.052429 0.466729 -0.884399 -0.001751 0.454864 -0.889242 -0.048443 0.449937 -0.89306 -0.000966 0.387859 -0.706274 0.592235 0.386368 -0.70344 0.596567 0.463453 -0.884769 0.048937 0.443979 -0.894829 0.046513 0.169637 -0.319384 0.932318 0.167306 -0.315038 0.934216 0.16984 -0.314171 0.934051 -0.340797 -0.481201 0.807653 -0.70038 -0.507343 0.502066 -0.70038 -0.507343 0.502066 0.134397 -0.25729 0.956943 0.134397 -0.257291 0.956942 -0.435259 -0.426428 0.792912 0.069901 -0.132955 0.988654 0.070317 -0.13377 0.988514 -0.515543 -0.318342 0.795534 0.045992 -0.086322 0.995205 0.046832 -0.087962 0.995022 0.045152 -0.084682 0.995385 -0.896869 -0.354938 0.263902 0.175657 -0.984451 0 0.164175 -0.952907 0.254979 -0.025168 -0.969969 0.241922 -0.014275 -0.999898 0 0.130512 -0.860425 0.49258 -0.057105 -0.882222 0.467357 0.076966 -0.713307 0.696613 -0.107911 -0.742637 0.660943 0.007184 -0.521578 0.853173 -0.07408 -0.298305 0.951591 -0.251224 -0.348886 0.902865 -0.174121 -0.560726 0.809486 -0.161288 -0.058703 0.98516 -0.333966 -0.121554 0.934715 -0.248495 0.180897 0.951592 -0.416708 0.105778 0.902865 -0.32976 0.40417 0.853174 -0.493812 0.317618 0.809487 -0.203742 0.689424 0.695114 -0.559918 0.497823 0.662318 -0.356059 -0.913386 0.197351 -0.347173 -0.937801 0 -0.382112 -0.841806 0.381253 -0.423557 -0.727937 0.539172 -0.477569 -0.579541 0.660348 -0.540467 -0.40673 0.736523 -0.607965 -0.221281 0.762505 -0.675463 -0.035831 0.736523 -0.738361 0.136979 0.660348 -0.792373 0.285375 0.539172 -0.592116 -0.792642 0.145316 -0.585573 -0.81062 0 -0.6113 -0.739935 0.280728 -0.641817 -0.65609 0.397009 -0.681587 -0.546821 0.486236 -0.727901 -0.419576 0.542325 -0.777602 -0.283025 0.561456 -0.827303 -0.146472 0.542325 -0.873616 -0.019226 0.486235 -0.915667 0.094086 0.39077 -0.754897 -0.649038 0.094239 -0.750653 -0.660696 -0.000000 -0.767337 -0.614856 0.182057 -0.787128 -0.560482 0.257467 -0.81292 -0.489619 0.315332 -0.842955 -0.407099 0.351706 -0.875187 -0.318542 0.364113 -0.907419 -0.229986 0.351706 -0.937454 -0.147465 0.315331 -0.965367 -0.072125 0.250727 -0.866271 -0.497464 0.045866 -0.864206 -0.503139 -0.000000 -0.872326 -0.480828 0.08861 -0.881959 -0.454363 0.125314 -0.894512 -0.419872 0.153477 -0.909131 -0.379707 0.171182 -0.924819 -0.336605 0.17722 -0.940506 -0.293504 0.171181 -0.955125 -0.25334 0.153476 -0.967842 -0.218315 0.124978 -0.812566 0.350318 0.465847 -0.586876 0.574669 0.570379 -0.928547 0.120082 0.351255 -0.978318 -0.066908 0.196002 -0.970706 -0.084444 0.224944 -0.992417 -0.097222 0.075208 -0.993042 -0.091644 0.073954 -0.996929 -0.078308 0 -0.996929 -0.07831 0 -0.429665 0.673924 0.601011 -0.219695 0.603178 -0.766753 -0.208357 0.571898 -0.793423 -0.208507 0.57175 -0.79349 -0.208436 0.57182 -0.793459 -0.511307 0.859398 0 -0.342016 0.939694 0.000000 -0.336626 0.924888 -0.176819 -0.504482 0.850735 -0.14747 -0.427034 0.743586 -0.514511 -0.270009 0.741845 -0.613809 -0.226018 0.620982 -0.750532 -0.313604 0.670313 -0.672557 -0.317307 0.871798 -0.373207 -0.482099 0.820329 -0.307637 -0.977366 -0.191445 0.090028 -0.983352 -0.175361 0.047626 -0.985431 -0.170074 0 -0.588303 0.575536 0.568031 -0.812566 0.350317 0.465848 -0.923823 0.093177 0.371307 -0.435113 0.672739 0.598414 -0.461071 0.738394 0.492126 -0.452961 0.742886 0.492897 -0.486331 0.835737 0.255 -0.494449 0.831091 0.254574 -0.444811 0.747314 0.493625 -0.47817 0.840311 0.255403 -0.497814 0.867284 0 -0.505914 0.862584 0 -0.48967 0.871908 0 -0.435918 0.671295 0.599449 -0.427985 0.675624 0.600302 -0.207214 0.766163 0.608322 -0.939693 -0.34202 0.000000 -0.939693 -0.34202 0.000000 -0.939692 -0.342022 0 -0.939692 -0.342021 0 -0.939693 -0.342019 0.000000 -0.939694 -0.342017 0.000000 -0.939692 -0.342021 0.000000 -0.939694 -0.342018 0.000001 -0.342021 0.939692 -0.000000 -0.160692 0.987005 0 -0.159652 0.972391 -0.170196 -0.336631 0.924886 -0.17682 -0.270006 0.741846 -0.613808 -0.145209 0.784997 -0.602242 -0.185387 0.67071 -0.718178 -0.226097 0.620906 -0.750571 -0.156151 0.919375 -0.361064 -0.317307 0.871799 -0.373207 -0.939693 -0.34202 -0.000000 -0.939693 -0.34202 0 -0.939692 -0.342021 0.000000 -0.939692 -0.342022 0.000002 -0.939693 -0.342019 0.000001 -0.939692 -0.342021 0.000000 -0.279325 0.729583 -0.624248 -0.939692 -0.342021 -0.000000 -0.939692 -0.342022 0.000000 -0.93969 -0.342026 0.000001 -0.939692 -0.342023 0.000000 -0.939693 -0.34202 0 -0.939693 -0.34202 0 -0.939691 -0.342024 0.000003 -0.939692 -0.342022 0.000002 -0.939692 -0.342022 0.000001 -0.939693 -0.34202 -0.000000 -0.939693 -0.34202 0 -0.307512 0.802438 -0.511399 -0.602985 0.728678 -0.324713 0.009193 0.940845 -0.338713 -0.649812 0.747553 -0.137512 -0.654804 0.747295 -0.113057 0.022631 0.987203 -0.157855 -0.661987 0.749515 0 0.026011 0.999662 0 -0.025168 -0.969969 -0.241922 0.164175 -0.952908 -0.254978 -0.057105 -0.882222 -0.467357 0.130513 -0.860425 -0.492579 -0.107911 -0.742637 -0.660943 0.076966 -0.713307 -0.696613 -0.174121 -0.560726 -0.809486 0.007184 -0.521578 -0.853173 -0.251224 -0.348886 -0.902865 -0.07408 -0.298305 -0.951591 -0.333966 -0.121554 -0.934714 -0.161288 -0.058703 -0.98516 -0.416708 0.105778 -0.902865 -0.248495 0.180897 -0.951592 -0.493812 0.317618 -0.809487 -0.32976 0.40417 -0.853174 -0.559918 0.497823 -0.662318 -0.407414 0.622996 -0.667749 -0.356059 -0.913386 -0.197351 -0.382112 -0.841806 -0.381253 -0.423557 -0.727937 -0.539172 -0.477569 -0.579541 -0.660348 -0.540467 -0.40673 -0.736523 -0.607965 -0.221281 -0.762505 -0.675463 -0.035832 -0.736523 -0.738361 0.136979 -0.660349 -0.792373 0.285375 -0.539172 -0.592116 -0.792642 -0.145316 -0.6113 -0.739935 -0.280728 -0.641817 -0.656091 -0.397009 -0.681587 -0.546822 -0.486235 -0.727901 -0.419576 -0.542325 -0.777601 -0.283025 -0.561456 -0.827303 -0.146472 -0.542325 -0.873616 -0.019226 -0.486236 -0.915667 0.094086 -0.39077 -0.754897 -0.649038 -0.094239 -0.767337 -0.614857 -0.182057 -0.787128 -0.560482 -0.257467 -0.81292 -0.489619 -0.315332 -0.842955 -0.407099 -0.351706 -0.875187 -0.318543 -0.364113 -0.907419 -0.229986 -0.351706 -0.937454 -0.147465 -0.315331 -0.965367 -0.072125 -0.250727 -0.866271 -0.497464 -0.045867 -0.872326 -0.480829 -0.08861 -0.881959 -0.454363 -0.125313 -0.894512 -0.419873 -0.153478 -0.909131 -0.379708 -0.171182 -0.924819 -0.336605 -0.17722 -0.940506 -0.293505 -0.171181 -0.955125 -0.25334 -0.153477 -0.967843 -0.218314 -0.124978 -0.812566 0.350317 -0.465848 -0.586876 0.574669 -0.570379 -0.928547 0.120083 -0.351255 -0.978318 -0.066908 -0.196002 -0.993042 -0.091645 -0.073954 -0.992417 -0.097223 -0.075208 -0.970706 -0.084446 -0.224944 -0.429665 0.673924 -0.601011 -0.219695 0.603178 0.766753 -0.208436 0.57182 0.793459 -0.208507 0.57175 0.79349 -0.208357 0.571898 0.793423 -0.504482 0.850735 0.14747 -0.336626 0.924888 0.176819 -0.427034 0.743586 0.514511 -0.313604 0.670313 0.672557 -0.226018 0.620982 0.750532 -0.27001 0.741845 0.613809 -0.482099 0.820329 0.307637 -0.317307 0.871798 0.373207 -0.977366 -0.191445 -0.090028 -0.983352 -0.175361 -0.047626 -0.812566 0.350318 -0.465848 -0.588303 0.575535 -0.568031 -0.923823 0.093177 -0.371307 -0.435114 0.672738 -0.598414 -0.461071 0.738394 -0.492126 -0.494449 0.831091 -0.254574 -0.486331 0.835738 -0.255 -0.452961 0.742886 -0.492897 -0.47817 0.840311 -0.255403 -0.194789 0.850499 -0.488578 -0.427985 0.675624 -0.600301 -0.435918 0.671295 -0.599449 -0.207214 0.766164 -0.608322 -0.939692 -0.342021 -0.000000 -0.939692 -0.342021 -0.000000 -0.939693 -0.34202 -0.000000 -0.939693 -0.342019 -0.000000 -0.939692 -0.342022 -0.000000 -0.939692 -0.342021 -0.000001 -0.336631 0.924886 0.17682 -0.159652 0.972391 0.170196 -0.270006 0.741846 0.613808 -0.226097 0.620906 0.750571 -0.185387 0.67071 0.718178 -0.145209 0.784997 0.602242 -0.317307 0.871799 0.373207 -0.156151 0.919375 0.361064 -0.939693 -0.34202 0.000000 -0.939692 -0.342021 -0.000000 -0.939692 -0.342021 -0.000002 -0.939692 -0.342023 -0.000001 -0.939691 -0.342024 -0.000000 -0.279325 0.729583 0.624248 -0.939692 -0.342021 0 -0.939692 -0.342022 -0.000000 -0.939691 -0.342025 -0.000001 -0.939692 -0.342022 -0.000000 -0.939692 -0.342021 -0.000002 -0.939692 -0.342023 -0.000003 -0.939692 -0.342021 -0.000001 -0.939693 -0.34202 0.000000 -0.602984 0.728678 0.324713 -0.307512 0.802438 0.511399 0.009193 0.940845 0.338713 -0.654804 0.747295 0.113057 -0.649812 0.747553 0.137512 0.022631 0.987203 0.157855 -0.931551 -0.35769 -0.065353 -0.937542 -0.34123 -0.067659 -0.925969 -0.373024 -0.058595 -0.921176 -0.386195 -0.04784 -0.917498 -0.396299 -0.033828 -0.915188 -0.402648 -0.017506 -0.914398 -0.404817 -0.000000 -0.915187 -0.402649 0.017506 -0.917498 -0.396299 0.033828 -0.921176 -0.386194 0.047841 -0.92597 -0.373024 0.058594 -0.931551 -0.357689 0.065353 -0.937542 -0.34123 0.067659 -0.943529 -0.32478 0.065355 -0.94911 -0.309445 0.058594 -0.953904 -0.296274 0.047842 -0.957579 -0.286177 0.033835 -0.95989 -0.279827 0.017516 -0.960679 -0.27766 0.000000 -0.95989 -0.279828 -0.017516 -0.957579 -0.286177 -0.033835 -0.953904 -0.296273 -0.047842 -0.94911 -0.309445 -0.058594 -0.943529 -0.32478 -0.065355 -0.939693 -0.342019 0 0.179693 0.95797 0.223617 0.069688 0.891449 0.447731 0.069688 0.891449 0.447731 0.179693 0.95797 0.223617 0.016691 0.812011 0.583403 0.120136 0.728214 0.674738 0.213121 0.654765 0.725163 0.213121 0.654765 0.725163 0.401191 0.487576 0.775445 0.441105 0.390891 0.807855 0.441105 0.390891 0.807855 0.401191 0.487576 0.775445 0.516228 0.187892 0.835587 0.516228 0.187892 0.835587 0.590198 -0.015331 0.807113 0.590198 -0.015331 0.807113 0.659124 -0.204704 0.723638 0.659124 -0.204704 0.723638 0.718316 -0.367319 0.590846 0.718316 -0.367319 0.590846 0.763734 -0.4921 0.417789 0.763734 -0.4921 0.417789 0.79228 -0.570546 0.216265 0.79228 -0.570546 0.216265 0.802014 -0.597305 0 0.802014 -0.597305 0 0.79228 -0.570546 -0.216265 0.79228 -0.570546 -0.216265 0.763734 -0.4921 -0.417789 0.763734 -0.4921 -0.417789 0.718316 -0.367319 -0.590846 0.718316 -0.367319 -0.590846 0.659124 -0.204704 -0.723638 0.659124 -0.204704 -0.723638 0.590199 -0.015331 -0.807112 0.590199 -0.015331 -0.807112 0.516229 0.187892 -0.835586 0.516229 0.187892 -0.835586 0.441105 0.390891 -0.807855 0.441105 0.390891 -0.807855 0.309715 0.575931 -0.756558 0.309715 0.575931 -0.756558 0.120135 0.728214 -0.674738 0.120135 0.728214 -0.674738 0.016691 0.812012 -0.583402 0.069689 0.891449 -0.447731 0.129909 0.933408 -0.334474 0.129909 0.933408 -0.334474 0.226715 0.967806 -0.109323 0.228082 0.973642 0 0.228082 0.973642 0 0.226715 0.967806 -0.109323 -0.667311 -0.242882 0.704063 -0.473657 -0.172397 0.863671 -0.55002 0.037451 0.834311 -0.72956 -0.071811 0.680136 -0.617449 0.224418 0.753918 -0.784508 0.080754 0.614838 -0.670657 0.372153 0.641655 -0.827898 0.201412 0.523467 -0.705899 0.472088 0.528053 -0.85666 0.283357 0.431095 -0.735324 0.549774 0.396291 -0.880652 0.346313 0.323294 -0.759454 0.614352 0.214012 -0.900313 0.398721 0.174523 -0.769032 0.63921 0 -0.908101 0.41875 0 -0.759454 0.614351 -0.214012 -0.900314 0.398718 -0.174522 -0.735324 0.549774 -0.396292 -0.880652 0.346312 -0.323294 -0.705898 0.472088 -0.528053 -0.856659 0.283359 -0.431095 -0.670657 0.372154 -0.641655 -0.827898 0.201414 -0.523467 -0.617449 0.224418 -0.753918 -0.784509 0.080754 -0.614837 -0.55002 0.037451 -0.834311 -0.729561 -0.071811 -0.680135 -0.473656 -0.172397 -0.863672 -0.667311 -0.242882 -0.704062 -0.397204 -0.382451 -0.834242 -0.604988 -0.414118 -0.680071 -0.325961 -0.57819 -0.747961 -0.54691 -0.573683 -0.609735 -0.264782 -0.746275 -0.610708 -0.497037 -0.710705 -0.497848 -0.217839 -0.875251 -0.431836 -0.45877 -0.815846 -0.352032 -0.188328 -0.956329 -0.223535 -0.434712 -0.881941 -0.182225 -0.178262 -0.983983 0 -0.426504 -0.904486 0.000000 -0.188328 -0.956329 0.223535 -0.434711 -0.881941 0.182225 -0.21784 -0.87525 0.431836 -0.458769 -0.815846 0.352032 -0.264783 -0.746275 0.610708 -0.497036 -0.710706 0.497848 -0.325962 -0.57819 0.747961 -0.54691 -0.573683 0.609735 -0.397205 -0.382451 0.834242 -0.604988 -0.414117 0.680071 -0.11527 0.233084 -0.965601 -0.026874 -0.009781 -0.999591 0.06161 -0.252892 -0.965531 0.144064 -0.479435 -0.865671 0.214869 -0.673973 -0.706818 0.269201 -0.823247 -0.499796 0.303356 -0.917084 -0.258714 0.315004 -0.94909 0 0.303355 -0.917084 0.258714 0.2692 -0.823247 0.499796 0.214868 -0.673974 0.706818 0.144063 -0.479436 0.865671 0.061608 -0.252893 0.965531 -0.026877 -0.009782 0.999591 -0.115272 0.233084 0.9656 -0.193839 0.449076 0.872214 -0.255851 0.619572 0.742072 -0.297495 0.734223 0.610257 -0.330625 0.825005 0.458316 -0.358065 0.900267 0.247606 -0.368754 0.929527 0 -0.358064 0.900267 -0.247605 -0.330624 0.825006 -0.458316 -0.297494 0.734223 -0.610257 -0.255849 0.619573 -0.742072 -0.193837 0.449077 -0.872214 0.229744 0.716359 0.658822 0.191598 0.818167 0.54212 0.16338 0.898745 0.406895 0.139686 0.965503 0.219752 0.130769 0.991413 0 0.139687 0.965503 -0.219752 0.163381 0.898746 -0.406894 0.191598 0.818167 -0.542119 0.229744 0.71636 -0.658822 0.285358 0.565057 -0.774133 0.355685 0.373489 -0.856734 0.434128 0.15801 -0.886885 0.512636 -0.05769 -0.856665 0.585794 -0.25869 -0.768066 0.648617 -0.431293 -0.627122 0.696821 -0.563736 -0.443442 0.727123 -0.646994 -0.229543 0.737459 -0.675392 0 0.727123 -0.646994 0.229544 0.69682 -0.563737 0.443443 0.648616 -0.431293 0.627123 0.585793 -0.25869 0.768066 0.512634 -0.05769 0.856667 0.434126 0.158009 0.886886 0.355685 0.373489 0.856735 0.285358 0.565057 0.774133 0.398121 0.899252 0.181236 0.390932 0.92042 0 0.398122 0.899251 -0.181236 0.41748 0.844399 -0.335709 0.440438 0.778247 -0.4476 0.472225 0.693927 -0.54357 0.51824 0.569005 -0.638483 0.576366 0.41097 -0.706333 0.641041 0.23332 -0.731183 0.705765 0.055487 -0.706269 0.76608 -0.110224 -0.633223 0.817875 -0.252525 -0.517023 0.857615 -0.361717 -0.365591 0.882597 -0.43036 -0.189245 0.891118 -0.453772 0.000000 0.882597 -0.430358 0.189246 0.857614 -0.361717 0.365593 0.817873 -0.252525 0.517025 0.766079 -0.110223 0.633225 0.705763 0.055487 0.706272 0.64104 0.233319 0.731184 0.576368 0.410969 0.706332 0.518242 0.569004 0.638482 0.472227 0.693926 0.54357 0.440438 0.778246 0.447601 0.417479 0.8444 0.335709 0.331712 -0.911364 0.243685 0.342019 -0.939687 0.003531 0.342019 -0.939687 0.003531 0.331712 -0.911364 0.243685 0.087813 -0.241267 -0.966478 0.000116 -0.000321 -1 0.000116 -0.000321 -1 0.087813 -0.241267 -0.966478 -0.330145 0.90706 0.26124 -0.296319 0.814129 0.499389 -0.296319 0.814129 0.499389 -0.330145 0.90706 0.26124 -0.24177 0.664258 -0.707325 -0.295233 0.811147 -0.504855 -0.295233 0.811147 -0.504855 -0.24177 0.664258 -0.707325 0.08777 -0.241146 0.966512 0.164638 -0.45234 0.876517 0.164638 -0.45234 0.876517 0.08777 -0.241146 0.966512 0.22478 -0.617578 -0.753705 0.164044 -0.450708 -0.877469 0.164044 -0.450708 -0.877469 0.22478 -0.617578 -0.753705 -0.241841 0.664457 0.707114 -0.241841 0.664457 0.707114 0.331837 -0.911717 -0.24219 0.305633 -0.839719 -0.448844 0.305633 -0.839719 -0.448844 0.331837 -0.911717 -0.24219 0.222308 -0.610789 0.759945 0.269693 -0.740975 0.614997 0.269693 -0.740975 0.614997 0.222308 -0.610789 0.759945 0.307306 -0.844311 0.438979 0.307306 -0.844311 0.438979 -0.0895 0.245901 -0.965154 -0.171754 0.471891 -0.864765 -0.171754 0.471891 -0.864765 -0.0895 0.245901 -0.965154 -0.089148 0.244934 0.965433 -0.000319 0.000877 1 -0.000319 0.000877 1 -0.089148 0.244934 0.965433 -0.330212 0.907251 -0.260491 -0.330212 0.907251 -0.260491 0.269972 -0.741739 -0.613953 0.269972 -0.741739 -0.613953 -0.170915 0.469589 0.866184 -0.170915 0.469589 0.866184 -0.342017 0.939681 0.004987 -0.342017 0.939681 0.004987 0.872996 0.443828 0.202226 0.8931 0.388651 0.226546 0.919373 0.357841 0.163409 0.892487 0.431685 0.130822 0.836219 0.544825 0.062478 0.843885 0.523894 0.115728 0.874717 0.480483 0.063292 0.833441 0.552608 -0.000482 0.871024 0.49078 -0.021287 0.892174 0.391318 -0.2256 0.873687 0.441837 -0.203596 0.905123 0.396964 -0.15222 0.856401 0.489214 -0.165067 0.882108 0.460141 -0.100775 0.84462 0.521911 -0.119273 0.914227 0.33086 -0.233924 0.933875 0.317692 -0.16416 0.991386 0.117672 0.05751 0.993811 0.111073 -0.001466 0.983232 0.181344 -0.019199 0.980419 0.18877 0.056082 0.857282 0.487103 0.166729 0.985481 0.133392 -0.105043 0.976746 0.156608 -0.146432 0.975003 0.203603 -0.08897 0.965137 0.188646 0.18145 0.976846 0.156838 0.145513 0.967802 0.223375 0.116028 0.934486 0.274951 0.226137 0.950862 0.227127 0.210414 0.947202 0.280422 0.15547 0.912885 0.334385 0.234154 0.951997 0.226039 -0.206416 0.933224 0.277263 -0.228513 0.958687 0.248523 -0.138404 0.986082 0.13042 0.103116 0.836257 0.545144 -0.0591 0.991852 0.115055 -0.054696 0.965627 0.186625 -0.180927 0.92898 0.368287 0.036893 0.9281 0.372089 0.013412 0.926051 0.376329 -0.028384 0.934537 0.354403 -0.032217 0.952104 0.304821 -0.024148 0.950978 0.309235 -0.003683 0.953722 0.300321 0.014919 0.940569 0.336451 -0.046165 0.945667 0.323838 -0.029018 0.927302 0.374287 -0.004549 0.937543 0.346149 0.034559 0.947654 0.318405 0.023879 0.944194 0.326489 0.043624 0.939693 0.34202 -0.000000 -0.854491 0.392016 0.340836 -0.854491 0.392016 0.340836 -0.875237 0.447327 0.184009 -0.875237 0.447327 0.184009 -0.883466 0.468495 0.000000 -0.883466 0.468495 0.000000 -0.875238 0.447324 -0.184008 -0.875238 0.447324 -0.184008 -0.854491 0.392015 -0.340836 -0.854491 0.392015 -0.340836 -0.829169 0.325555 -0.454415 -0.829169 0.325555 -0.454415 -0.79887 0.239257 -0.551872 -0.79887 0.239257 -0.551872 -0.753134 0.11208 -0.648249 -0.753134 0.11208 -0.648249 -0.695204 -0.048761 -0.717156 -0.695204 -0.048761 -0.717156 -0.629566 -0.229143 -0.742388 -0.629566 -0.229143 -0.742388 -0.56385 -0.4097 -0.717091 -0.56385 -0.4097 -0.717091 -0.50261 -0.577951 -0.642927 -0.50261 -0.577951 -0.642927 -0.450025 -0.722432 -0.524948 -0.450025 -0.722432 -0.524948 -0.409673 -0.833296 -0.371194 -0.409673 -0.833296 -0.371194 -0.384304 -0.90299 -0.192144 -0.384304 -0.90299 -0.192144 -0.37565 -0.926762 0.000000 -0.37565 -0.926762 0.000000 -0.384303 -0.90299 0.192145 -0.384303 -0.90299 0.192145 -0.409674 -0.833297 0.371193 -0.409674 -0.833297 0.371193 -0.450027 -0.722432 0.524945 -0.450027 -0.722432 0.524945 -0.502612 -0.577951 0.642925 -0.502612 -0.577951 0.642925 -0.56385 -0.4097 0.717091 -0.56385 -0.4097 0.717091 -0.629567 -0.229144 0.742387 -0.629567 -0.229144 0.742387 -0.695207 -0.048763 0.717153 -0.695207 -0.048763 0.717153 -0.753139 0.112076 0.648245 -0.753139 0.112076 0.648245 -0.798872 0.239257 0.551869 -0.798872 0.239257 0.551869 -0.829169 0.325556 0.454413 -0.829169 0.325556 0.454413 -0.068251 0.678037 0.731852 0.112586 0.709294 0.695864 0.072565 0.816721 0.572452 -0.109849 0.790981 0.601899 0.042486 0.901936 0.429774 -0.141985 0.880644 0.452003 0.017303 0.972528 0.232142 -0.168753 0.954933 0.244185 0.007748 0.99997 0 -0.179043 0.983841 0.000000 0.017304 0.972528 -0.232142 -0.168751 0.954933 -0.244184 0.042488 0.901936 -0.429774 -0.141984 0.880644 -0.452003 0.072567 0.816721 -0.572452 -0.109847 0.790981 -0.601899 0.112589 0.709294 -0.695864 -0.068248 0.678038 -0.731852 0.171208 0.549502 -0.817762 -0.00683 0.509965 -0.860168 0.245372 0.347129 -0.905149 0.070934 0.297047 -0.952224 0.328245 0.119471 -0.937007 0.158111 0.057548 -0.985743 0.41119 -0.108418 -0.905079 0.245372 -0.182195 -0.952154 0.488482 -0.320778 -0.811472 0.326683 -0.4056 -0.853678 0.554854 -0.503136 -0.662564 0.396507 -0.597443 -0.697025 0.605783 -0.643064 -0.468504 0.450085 -0.744649 -0.492871 0.637798 -0.731026 -0.242516 0.483765 -0.837186 -0.25513 0.648718 -0.761029 0 0.495253 -0.868749 0 0.637797 -0.731027 0.242516 0.483764 -0.837187 0.255129 0.605781 -0.643065 0.468504 0.450082 -0.74465 0.492872 0.554852 -0.503137 0.662565 0.396505 -0.597443 0.697026 0.48848 -0.320779 0.811473 0.326681 -0.405601 0.853679 0.411187 -0.10842 0.90508 0.245367 -0.182196 0.952155 0.328242 0.11947 0.937008 0.158108 0.057546 0.985743 0.245371 0.347128 0.90515 0.070932 0.297046 0.952225 0.171205 0.549502 0.817763 -0.006833 0.509964 0.860168 0.768687 0.099618 0.63182 0.710785 0.258704 0.654108 0.652928 0.417629 0.631878 0.600917 0.559057 0.571274 0.559726 0.670893 0.486426 0.53123 0.746499 0.400667 0.510735 0.805543 0.300416 0.493446 0.854528 0.162155 0.487042 0.873379 -0.000000 0.493447 0.854527 -0.162155 0.510736 0.805543 -0.300415 0.531232 0.746498 -0.400666 0.559728 0.670891 -0.486425 0.60092 0.559056 -0.571272 0.652931 0.417629 -0.631876 0.710787 0.258705 -0.654105 0.768689 0.09962 -0.631818 0.822645 -0.048623 -0.566472 0.868978 -0.175924 -0.462523 0.904531 -0.273605 -0.327054 0.92688 -0.335011 -0.169296 0.934503 -0.355955 -0.000000 0.92688 -0.335011 0.169296 0.90453 -0.273607 0.327054 0.868977 -0.175926 0.462524 0.822644 -0.048626 0.566475 0.835963 0.506696 0.210773 0.823708 0.539726 0.173785 0.814734 0.565035 0.13017 0.807201 0.586085 0.070223 0.804394 0.594097 -0.000000 0.807202 0.586084 -0.070223 0.814735 0.565033 -0.130169 0.82371 0.539724 -0.173783 0.835965 0.506693 -0.210771 0.853753 0.458139 -0.247414 0.8762 0.396817 -0.273513 0.901241 0.328025 -0.283132 0.926304 0.259165 -0.273485 0.949659 0.194996 -0.2452 0.969715 0.139893 -0.200206 0.985104 0.097611 -0.141568 0.994779 0.07103 -0.073281 0.998078 0.061964 -0.000000 0.994779 0.071029 0.073281 0.985105 0.097608 0.141569 0.969715 0.13989 0.200208 0.949659 0.194993 0.245204 0.926303 0.259163 0.27349 0.90124 0.328024 0.283138 0.876198 0.396818 0.273518 0.853751 0.458142 0.247417 0.962132 0.269782 -0.038982 0.964429 0.263503 -0.021028 0.965306 0.261123 -0.000001 0.96443 0.2635 0.021027 0.962133 0.269779 0.038983 0.959368 0.277314 0.052054 0.955774 0.287249 0.063122 0.950485 0.30181 0.074089 0.943807 0.320191 0.081895 0.93631 0.340789 0.084774 0.928805 0.361408 0.081884 0.921813 0.38062 0.073415 0.915808 0.397117 0.059942 0.911201 0.409776 0.042384 0.908305 0.417732 0.021938 0.907318 0.420445 -0.000000 0.908306 0.41773 -0.021939 0.911203 0.409772 -0.042383 0.915811 0.397113 -0.059939 0.921815 0.380616 -0.07341 0.928807 0.361406 -0.081878 0.936311 0.340789 -0.084767 0.943806 0.320193 -0.081887 0.950484 0.301814 -0.074083 0.955772 0.287254 -0.063118 0.959367 0.277319 -0.052053 0.895758 -0.091725 -0.434977 0.919765 -0.159993 -0.358377 0.939593 -0.212125 -0.268641 0.955862 -0.255554 -0.144986 0.962272 -0.272091 -0.000001 0.955861 -0.255557 0.144984 0.939592 -0.212129 0.268641 0.919764 -0.159999 0.358377 0.895755 -0.091731 0.43498 0.859661 0.008583 0.510793 0.813978 0.135358 0.564905 0.762274 0.277445 0.584776 0.710509 0.41967 0.564849 0.662272 0.5522 0.506429 0.620851 0.666006 0.413497 0.589067 0.753333 0.292384 0.569088 0.808228 0.151349 0.562275 0.826951 -0.000000 0.56909 0.808226 -0.15135 0.589071 0.75333 -0.292384 0.620856 0.666002 -0.413495 0.662277 0.552198 -0.506425 0.710514 0.419669 -0.564843 0.762279 0.277446 -0.584769 0.813982 0.135362 -0.564898 0.859665 0.008588 -0.510787 0.758378 -0.286344 0.585552 0.709852 -0.151442 0.687877 0.648374 0.019204 0.76108 0.578714 0.210635 0.78786 0.508972 0.402251 0.761013 0.443984 0.580808 0.682306 0.388177 0.734139 0.557099 0.345355 0.851793 0.393927 0.318436 0.925753 0.203911 0.309255 0.950979 -0.000000 0.318438 0.925752 -0.203912 0.345359 0.851791 -0.393928 0.388183 0.734136 -0.557099 0.44399 0.580808 -0.682302 0.508979 0.402253 -0.761008 0.578721 0.210637 -0.787854 0.648379 0.019208 -0.761075 0.709856 -0.151438 -0.687874 0.758381 -0.286338 -0.58555 0.790511 -0.37778 -0.482053 0.817394 -0.448423 -0.361639 0.83942 -0.507195 -0.195261 0.848163 -0.529735 -0.000000 0.839419 -0.507197 0.19526 0.817392 -0.448428 0.361639 0.790509 -0.377786 0.482052 -0.291962 -0.106265 0.950508 -0.291962 -0.106265 0.950508 -0.376101 0.124908 0.918121 -0.376101 0.124908 0.918121 -0.454506 0.340328 0.823165 -0.454506 0.340328 0.823165 -0.521834 0.525314 0.672112 -0.521834 0.525314 0.672112 -0.573496 0.667259 0.475255 -0.573496 0.667259 0.475255 -0.605971 0.75649 0.246011 -0.605971 0.75649 0.246011 -0.617047 0.786926 0.000000 -0.617047 0.786926 0.000000 -0.605969 0.756492 -0.246011 -0.605969 0.756492 -0.246011 -0.573491 0.667263 -0.475256 -0.573491 0.667263 -0.475256 -0.521828 0.525317 -0.672114 -0.521828 0.525317 -0.672114 -0.454498 0.340332 -0.823168 -0.454498 0.340332 -0.823168 -0.376092 0.124913 -0.918124 -0.376092 0.124913 -0.918124 -0.291952 -0.106261 -0.950512 -0.291952 -0.106261 -0.950512 -0.207887 -0.337201 -0.918193 -0.207887 -0.337201 -0.918193 -0.132705 -0.54249 -0.829514 -0.132705 -0.54249 -0.829514 -0.073292 -0.704571 -0.705838 -0.073292 -0.704571 -0.705838 -0.032798 -0.813517 -0.580615 -0.032798 -0.813517 -0.580615 -0.002188 -0.899976 -0.435934 -0.002188 -0.899976 -0.435934 0.023411 -0.971598 -0.235479 0.023411 -0.971598 -0.235479 0.033152 -0.99945 0.000000 0.033152 -0.99945 0.000000 0.023409 -0.971597 0.23548 0.023409 -0.971597 0.23548 -0.002192 -0.899976 0.435934 -0.002192 -0.899976 0.435934 -0.032803 -0.813518 0.580614 -0.032803 -0.813518 0.580614 -0.073298 -0.704572 0.705837 -0.073298 -0.704572 0.705837 -0.132714 -0.542491 0.829512 -0.132714 -0.542491 0.829512 -0.207898 -0.337203 0.91819 -0.207898 -0.337203 0.91819</float_array>
+ <technique_common>
+ <accessor source="#Headphones-normals-array" count="3992" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Headphones-headphonesUV" name="headphonesUV">
+ <float_array id="Headphones-headphonesUV-array" count="3658">0.817372 0.157884 0.859071 0.156586 0.859328 0.164019 0.817592 0.165508 0.899633 0.155005 0.899935 0.162224 0.900854 0.18001 0.860133 0.182252 0.85975 0.174312 0.900411 0.172253 0.818284 0.184194 0.817954 0.176059 0.775464 0.185888 0.775181 0.17758 0.7318 0.187366 0.73156 0.178908 0.68721 0.180058 0.687411 0.188645 0.642244 0.181043 0.64241 0.189738 0.59677 0.181878 0.596916 0.190663 0.550949 0.182596 0.551154 0.191449 0.517539 0.163139 0.550456 0.162769 0.550624 0.171092 0.517801 0.171562 0.596504 0.162228 0.596602 0.170473 0.518134 0.077037 0.550834 0.077362 0.550631 0.08566 0.517814 0.085433 0.641955 0.1616 0.642063 0.169757 0.596665 0.077661 0.596556 0.085885 0.686859 0.160861 0.686991 0.168915 0.642002 0.077946 0.641906 0.086086 0.731137 0.16 0.731296 0.167932 0.686827 0.078267 0.686725 0.086308 0.731048 0.078656 0.730933 0.086577 0.774422 0.086916 0.774554 0.079135 0.817224 0.079734 0.81707 0.087352 0.85874 0.087929 0.858924 0.0805 0.899508 0.081556 0.899283 0.088774 0.519045 0.056752 0.551444 0.057084 0.551206 0.065898 0.518705 0.065526 0.899877 0.071529 0.859244 0.070212 0.859549 0.062276 0.900238 0.063774 0.817752 0.061065 0.817494 0.069192 0.774785 0.06837 0.775005 0.060075 0.731248 0.067699 0.731438 0.059258 0.774682 0.159011 0.774871 0.166801 0.687004 0.067148 0.68717 0.058583 0.642316 0.058021 0.642165 0.066689 0.596997 0.057538 0.596843 0.066291 0.518581 0.191938 0.518297 0.18312 0.517569 0.124256 0.550427 0.124188 0.596323 0.124034 0.641707 0.123825 0.686537 0.12357 0.730739 0.123277 0.774205 0.122956 0.816813 0.122612 0.858409 0.122255 0.898777 0.12189 0.903855 0.216837 0.862635 0.220052 0.861667 0.024505 0.902836 0.026952 0.820434 0.222884 0.819548 0.022432 0.861667 0.024505 0.777316 0.22538 0.776547 0.020668 0.819548 0.022432 0.73338 0.227562 0.732765 0.019178 0.776547 0.020668 0.688734 0.229443 0.688315 0.017934 0.732765 0.019178 0.643496 0.231039 0.643312 0.016903 0.688315 0.017934 0.597772 0.232373 0.59787 0.016049 0.643312 0.016903 0.55165 0.233455 0.552081 0.015342 0.59787 0.016049 0.518737 0.233984 0.519456 0.015006 0.552081 0.015342 0.183043 0.15764 0.182682 0.165284 0.140833 0.163465 0.141251 0.156012 0.100106 0.161234 0.100591 0.153995 0.098739 0.179085 0.099377 0.171297 0.140189 0.173793 0.139635 0.181765 0.182126 0.175869 0.181648 0.184034 0.225031 0.177616 0.224619 0.185951 0.268766 0.179081 0.268414 0.187563 0.313209 0.180292 0.312911 0.188899 0.35825 0.181277 0.357998 0.189988 0.40378 0.182065 0.403554 0.190861 0.449633 0.182705 0.449355 0.191564 0.483219 0.163173 0.482886 0.171598 0.450056 0.171193 0.450295 0.162866 0.404051 0.170649 0.404225 0.162397 0.48336 0.077072 0.483608 0.085467 0.450796 0.085754 0.450665 0.077458 0.358546 0.169975 0.358737 0.161808 0.40489 0.086048 0.404858 0.077829 0.313557 0.169128 0.313783 0.161061 0.359572 0.086285 0.359559 0.078152 0.269175 0.168079 0.269441 0.160131 0.314797 0.086495 0.314789 0.078465 0.270644 0.086692 0.270636 0.078783 0.22722 0.086886 0.22721 0.079118 0.184646 0.08709 0.184631 0.079488 0.143063 0.087345 0.143035 0.079933 0.102621 0.08777 0.10257 0.080571 0.482615 0.056792 0.482884 0.065564 0.450391 0.066001 0.450227 0.057192 0.102439 0.070576 0.102262 0.062851 0.14279 0.061767 0.14293 0.069674 0.184441 0.060872 0.184552 0.068973 0.227054 0.060104 0.227147 0.068377 0.270505 0.059425 0.270583 0.067847 0.225509 0.166807 0.22582 0.158999 0.314673 0.058814 0.314741 0.067362 0.359447 0.058254 0.359511 0.066909 0.404709 0.057725 0.404784 0.066468 0.482294 0.18316 0.481939 0.19198 0.450662 0.124276 0.48352 0.124287 0.404764 0.124187 0.359377 0.124009 0.314544 0.123738 0.270339 0.12337 0.226867 0.122899 0.184256 0.122322 0.142662 0.121636 0.102316 0.120844 0.136331 0.219788 0.094831 0.216133 0.141448 0.024185 0.10052 0.026224 0.178804 0.222934 0.18333 0.022417 0.141448 0.024185 0.222169 0.225631 0.226111 0.020859 0.18333 0.022417 0.266319 0.227919 0.269697 0.019486 0.226111 0.020859 0.311139 0.229827 0.313982 0.018281 0.269697 0.019486 0.356516 0.231389 0.358853 0.017225 0.313982 0.018281 0.40234 0.232642 0.4042 0.016298 0.358853 0.017225 0.448524 0.233611 0.449929 0.015487 0.4042 0.016298 0.481462 0.23404 0.482532 0.015059 0.449929 0.015487 0.482532 0.015059 0.519456 0.015006 0.933828 0.153051 0.934195 0.160309 0.934551 0.170183 0.934927 0.178005 0.933758 0.082825 0.933474 0.090085 0.934291 0.065135 0.934005 0.072955 0.932601 0.121571 0.93854 0.213537 0.937497 0.029588 0.902836 0.026952 0.065708 0.158844 0.066279 0.151569 0.064502 0.17661 0.065086 0.168753 0.068439 0.081397 0.068534 0.088634 0.068449 0.071567 0.068362 0.063785 0.068571 0.120074 0.059921 0.212348 0.066059 0.028436 0.10052 0.026224 0.593334 0.400911 0.597301 0.404806 0.598975 0.414824 0.59426 0.40797 0.4336 0.247163 0.4336 0.24335 0.462067 0.248564 0.462067 0.252498 0.551135 0.313388 0.551135 0.308874 0.581227 0.360312 0.581227 0.366604 0.501482 0.26186 0.501482 0.265878 0.4336 0.308297 0.4336 0.30303 0.462067 0.30722 0.462067 0.312487 0.551135 0.355737 0.551135 0.350471 0.581227 0.383757 0.581227 0.389024 0.501482 0.31726 0.501482 0.322527 0.581227 0.37175 0.4336 0.299099 0.483865 0.310491 0.462067 0.261424 0.4336 0.256211 0.501482 0.274721 0.528217 0.352956 0.551135 0.321735 0.553824 0.400208 0.581227 0.373172 0.579513 0.43317 0.597301 0.417667 0.582798 0.441141 0.598975 0.427685 0.577666 0.43572 0.59426 0.420831 0.581227 0.401884 0.551135 0.368598 0.501482 0.335387 0.462067 0.325347 0.4336 0.321157 0.4336 0.25875 0.462067 0.264183 0.501482 0.2775 0.551135 0.323173 0.4336 0.383089 0.478396 0.391335 0.516751 0.426291 0.4336 0.468914 0.468152 0.476949 0.500281 0.496998 0.508123 0.509636 0.526743 0.459067 0.549735 0.433951 0.570189 0.441296 0.571541 0.450505 0.567733 0.444633 0.557209 0.428399 0.564415 0.420445 0.468341 0.546965 0.471855 0.563464 0.456464 0.521408 0.4336 0.561384 0.4336 0.5741 0.4336 0.529226 0.461312 0.35158 0.4336 0.34781 0.460988 0.362822 0.4336 0.359232 0.497868 0.360613 0.49632 0.371425 0.538378 0.390495 0.53291 0.399879 0.588605 0.404822 0.586556 0.399912 0.589943 0.406529 0.591004 0.411695 0.4336 0.255552 0.4336 0.256504 0.461005 0.261644 0.461195 0.26061 0.546941 0.318484 0.547194 0.320896 0.576266 0.372699 0.575495 0.367024 0.499144 0.27468 0.499266 0.273445 0.4336 0.311035 0.4336 0.31425 0.461773 0.317986 0.462843 0.315237 0.544838 0.358511 0.546806 0.359842 0.578051 0.389677 0.575155 0.387227 0.49987 0.332099 0.500538 0.329786 0.574606 0.374969 0.481999 0.314284 0.4336 0.304238 0.4336 0.262519 0.461645 0.267265 0.499244 0.279502 0.524635 0.352071 0.546918 0.32204 0.549743 0.397303 0.575647 0.370716 0.575586 0.42237 0.58694 0.411129 0.579349 0.427968 0.589848 0.41793 0.577216 0.427233 0.590986 0.415418 0.579359 0.39741 0.548995 0.364975 0.502204 0.335735 0.462959 0.322111 0.4336 0.318586 0.460947 0.273177 0.4336 0.267957 0.499069 0.286118 0.547126 0.330479 0.4336 0.389004 0.47587 0.395937 0.512067 0.426556 0.4336 0.473148 0.466366 0.47963 0.496479 0.49741 0.521455 0.458838 0.503806 0.508596 0.544438 0.432837 0.566708 0.434298 0.568637 0.437946 0.565986 0.438434 0.564415 0.417229 0.557209 0.425183 0.465776 0.545161 0.469025 0.560489 0.454657 0.522708 0.4336 0.558299 0.4336 0.571456 0.4336 0.52981 0.4336 0.344594 0.461312 0.348364 0.4336 0.356016 0.460988 0.359606 0.497868 0.357397 0.49632 0.368209 0.538378 0.387279 0.53291 0.396663 0.525421 0.45901 0.507044 0.509376 0.522777 0.458896 0.504885 0.508856 0.548411 0.433673 0.545763 0.433115 0.569319 0.439547 0.567578 0.436048 0.571252 0.448111 0.570674 0.443323 0.567733 0.443829 0.565986 0.439238 0.557209 0.427595 0.557209 0.425987 0.471147 0.56272 0.469732 0.561233 0.4336 0.573439 0.4336 0.572117 0.4336 0.358428 0.460988 0.362018 0.4336 0.35682 0.460988 0.36041 0.49632 0.370621 0.49632 0.369013 0.53291 0.399075 0.53291 0.397467 0.273866 0.400911 0.27294 0.40797 0.268225 0.414824 0.269899 0.404806 0.405133 0.252498 0.405133 0.248564 0.316065 0.313388 0.285973 0.366604 0.285973 0.360312 0.316065 0.308874 0.365719 0.265878 0.365719 0.26186 0.405133 0.312487 0.405133 0.30722 0.316065 0.355737 0.285973 0.389024 0.285973 0.383757 0.316065 0.350471 0.365719 0.322527 0.365719 0.31726 0.285973 0.37175 0.405133 0.261424 0.383336 0.310491 0.365719 0.274721 0.316065 0.321735 0.338983 0.352956 0.285973 0.373172 0.313377 0.400208 0.269899 0.417667 0.287687 0.43317 0.268225 0.427685 0.284403 0.441141 0.27294 0.420831 0.289534 0.43572 0.285973 0.401884 0.316065 0.368598 0.365719 0.335387 0.405133 0.325347 0.405133 0.264183 0.365719 0.2775 0.316065 0.323173 0.388804 0.391335 0.350449 0.426291 0.399048 0.476949 0.340457 0.459067 0.359077 0.509636 0.366919 0.496998 0.317465 0.433951 0.297011 0.441296 0.29566 0.450505 0.299467 0.444633 0.302785 0.420445 0.309991 0.428399 0.395345 0.563464 0.39886 0.546965 0.410736 0.521408 0.405889 0.35158 0.406212 0.362822 0.369332 0.360613 0.37088 0.371425 0.328822 0.390495 0.33429 0.399879 0.278595 0.404822 0.276196 0.411695 0.277257 0.406529 0.280644 0.399912 0.406005 0.26061 0.406195 0.261644 0.320259 0.318484 0.291706 0.367024 0.290934 0.372699 0.320006 0.320896 0.367934 0.273445 0.368056 0.27468 0.404357 0.315237 0.405427 0.317986 0.322362 0.358511 0.292045 0.387227 0.289149 0.389677 0.320394 0.359842 0.366662 0.329786 0.36733 0.332099 0.292594 0.374969 0.385201 0.314284 0.405555 0.267265 0.367956 0.279502 0.342565 0.352071 0.320282 0.32204 0.317457 0.397303 0.291553 0.370716 0.291614 0.42237 0.280261 0.411129 0.287851 0.427968 0.277352 0.41793 0.289984 0.427233 0.276214 0.415418 0.287842 0.39741 0.318206 0.364975 0.364996 0.335735 0.404241 0.322111 0.406254 0.273177 0.368131 0.286118 0.320074 0.330479 0.39133 0.395937 0.355133 0.426556 0.400834 0.47963 0.370721 0.49741 0.363394 0.508596 0.345745 0.458838 0.322762 0.432837 0.300492 0.434298 0.298563 0.437946 0.301214 0.438434 0.309991 0.425183 0.302785 0.417229 0.401424 0.545161 0.398176 0.560489 0.412543 0.522708 0.405889 0.348364 0.406212 0.359606 0.369332 0.357397 0.37088 0.368209 0.328822 0.387279 0.33429 0.396663 0.341779 0.45901 0.360156 0.509376 0.362315 0.508856 0.344423 0.458896 0.318789 0.433673 0.321437 0.433115 0.297881 0.439547 0.299622 0.436048 0.295949 0.448111 0.296527 0.443323 0.299467 0.443829 0.301214 0.439238 0.309991 0.427595 0.309991 0.425987 0.396053 0.56272 0.397468 0.561233 0.406212 0.362018 0.406212 0.36041 0.37088 0.370621 0.37088 0.369013 0.33429 0.399075 0.33429 0.397467 0.968892 0.151846 0.968917 0.121224 0.973186 0.121183 0.972916 0.151495 0.968529 0.090611 0.972556 0.090884 0.969133 0.084912 0.974808 0.086217 0.969659 0.075688 0.975286 0.075979 0.970382 0.068801 0.975483 0.068794 0.975909 0.034233 0.980827 0.034884 0.976949 0.208143 0.971012 0.173638 0.976118 0.173546 0.981866 0.207396 0.970204 0.166758 0.975832 0.166355 0.969564 0.157537 0.975225 0.156118 0.983422 0.086657 0.986922 0.089865 0.987107 0.121048 0.987294 0.15223 0.983833 0.155507 0.031191 0.14974 0.027182 0.149305 0.027974 0.119008 0.032249 0.119126 0.029592 0.08879 0.033608 0.088593 0.027504 0.084103 0.033182 0.082915 0.027341 0.07395 0.032931 0.073752 0.027345 0.06683 0.032406 0.06691 0.02293 0.03311 0.027827 0.032531 0.021342 0.206305 0.016406 0.205473 0.023188 0.17144 0.028331 0.171619 0.023716 0.164182 0.029367 0.1647 0.024704 0.153885 0.030323 0.155436 0.01615 0.153076 0.012807 0.149734 0.014057 0.118607 0.015306 0.087479 0.018909 0.084347 0.056946 0.152393 0.058972 0.119836 0.063696 0.119954 0.061371 0.15281 0.938934 0.08274 0.938265 0.088679 0.943091 0.082773 0.942645 0.088941 0.948574 0.030771 0.944604 0.067589 0.939544 0.06735 0.943094 0.030181 0.937497 0.029588 0.055126 0.167152 0.056299 0.158568 0.060486 0.158748 0.05961 0.167615 0.944489 0.168747 0.945221 0.175351 0.94016 0.175687 0.94002 0.169136 0.059434 0.087357 0.059154 0.081208 0.063291 0.081237 0.063801 0.087161 0.93948 0.073896 0.943947 0.074199 0.062979 0.072427 0.058529 0.072664 0.05805 0.066082 0.055042 0.029467 0.060492 0.028952 0.063085 0.065915 0.066059 0.028436 0.054288 0.211557 0.059299 0.174196 0.054288 0.211557 0.048777 0.21077 0.054215 0.173779 0.949618 0.212139 0.944139 0.212836 0.944139 0.212836 0.939374 0.160295 0.943533 0.160183 0.942264 0.121477 0.943016 0.154019 0.938637 0.154365 0.937507 0.121523 0.976949 0.208143 0.949618 0.212139 0.048777 0.21077 0.021342 0.206305 0.837055 0.384384 0.794898 0.360133 0.792038 0.386374 0.837055 0.403927 0.814119 0.343384 0.837931 0.361005 0.878979 0.413338 0.880447 0.395313 0.880656 0.374141 0.80355 0.325 0.784523 0.325 0.759382 0.325 0.759397 0.357823 0.759439 0.383887 0.758467 0.383878 0.758574 0.37554 0.792658 0.378778 0.790434 0.386357 0.837221 0.39646 0.834272 0.403927 0.875664 0.40566 0.873529 0.413425 0.837392 0.360958 0.813756 0.343392 0.803232 0.325 0.879703 0.374138 0.877735 0.374131 0.836471 0.360882 0.813125 0.343404 0.802684 0.325 0.878619 0.369835 0.837923 0.356801 0.815707 0.340211 0.806407 0.325 0.874991 0.368837 0.83707 0.35573 0.816142 0.339713 0.807322 0.325 0.873731 0.374791 0.835251 0.361129 0.812607 0.343697 0.802324 0.325 0.83741 0.369215 0.877144 0.382766 0.806692 0.348548 0.792072 0.325 0.87717 0.385322 0.837215 0.372284 0.877271 0.395286 0.836458 0.384245 0.804015 0.350938 0.791411 0.358255 0.787967 0.325 0.778772 0.325 0.837065 0.393965 0.794611 0.374492 0.875992 0.403541 0.77509 0.370299 0.758564 0.356846 0.770604 0.355428 0.758608 0.325 0.766499 0.325 0.973148 0.375243 0.97073 0.374577 0.97085 0.37114 0.974068 0.371057 0.97163 0.407271 0.970622 0.411943 0.968373 0.413425 0.97008 0.405518 0.974641 0.411882 0.972931 0.413356 0.974997 0.411537 0.97377 0.413338 0.976175 0.395745 0.975263 0.395313 0.976031 0.377582 0.975476 0.374141 0.975578 0.376393 0.974524 0.374138 0.972577 0.374131 0.973474 0.369835 0.969538 0.368812 0.96868 0.374743 0.974126 0.381167 0.972128 0.382864 0.974047 0.385599 0.972176 0.385383 0.974184 0.395744 0.972367 0.395199 0.972049 0.40522 0.970547 0.403411 0.971073 0.395313 0.971203 0.413338 0.971055 0.374141 0.970643 0.413356 0.970499 0.374138 0.96867 0.369835 0.968634 0.374131 0.96549 0.413425 0.965831 0.405524 0.965594 0.368813 0.96487 0.374745 0.967523 0.382859 0.967585 0.38538 0.96783 0.395203 0.967181 0.403415 0.837055 0.265617 0.837055 0.246073 0.792038 0.263626 0.794898 0.289867 0.814119 0.306616 0.837931 0.288995 0.880447 0.254687 0.878979 0.236662 0.880656 0.275859 0.759397 0.292177 0.759439 0.266113 0.758467 0.266122 0.790434 0.263643 0.792658 0.271222 0.758574 0.27446 0.834272 0.246073 0.837221 0.25354 0.873529 0.236575 0.875664 0.24434 0.813756 0.306608 0.837392 0.289042 0.879703 0.275862 0.877735 0.275869 0.836471 0.289118 0.813125 0.306596 0.878619 0.280165 0.837923 0.293199 0.815707 0.309789 0.83707 0.29427 0.874991 0.281163 0.816142 0.310287 0.835251 0.28887 0.873731 0.275209 0.812607 0.306303 0.83741 0.280785 0.877144 0.267234 0.806692 0.301452 0.837215 0.277716 0.87717 0.264678 0.836458 0.265755 0.877271 0.254714 0.804015 0.299062 0.791411 0.291745 0.794611 0.275509 0.837065 0.256035 0.875992 0.246459 0.77509 0.279701 0.770604 0.294572 0.758564 0.293154 0.973148 0.274757 0.974068 0.278943 0.97085 0.27886 0.97073 0.275423 0.97163 0.242729 0.97008 0.244482 0.968373 0.236575 0.970622 0.238057 0.974641 0.238118 0.972931 0.236644 0.974997 0.238463 0.97377 0.236662 0.976175 0.254255 0.975263 0.254687 0.975476 0.275859 0.976031 0.272418 0.974524 0.275862 0.975578 0.273607 0.972577 0.275869 0.973474 0.280165 0.969538 0.281188 0.96868 0.275257 0.974126 0.268833 0.972128 0.267136 0.972176 0.264617 0.974047 0.264401 0.974184 0.254256 0.972367 0.254801 0.970547 0.246589 0.972049 0.24478 0.971203 0.236662 0.971073 0.254687 0.971055 0.275859 0.970643 0.236644 0.970499 0.275862 0.968634 0.275869 0.96867 0.280165 0.965831 0.244476 0.96549 0.236575 0.965594 0.281187 0.96487 0.275255 0.967523 0.267141 0.967585 0.26462 0.96783 0.254797 0.967181 0.246585 0.73401 0.325 0.734051 0.357823 0.734061 0.383887 0.73404 0.383878 0.734091 0.37554 0.733862 0.356846 0.733825 0.325 0.733862 0.293154 0.734091 0.27446 0.73404 0.266122 0.734061 0.266113 0.734051 0.292177 0.098804 0.42194 0.116821 0.42194 0.12403 0.365 0.10601 0.365 0.077677 0.475 0.095696 0.475 0.097965 0.469297 0.079947 0.469297 0.071277 0.474147 0.090463 0.474147 0.039607 0.427122 0.058825 0.427122 0.074 0.45856 0.054799 0.45856 0.03 0.365 0.049227 0.365 0.050286 0.391581 0.031059 0.391581 0.098804 0.30806 0.116821 0.30806 0.071277 0.255853 0.077677 0.255 0.095696 0.255 0.090463 0.255853 0.079947 0.260703 0.097965 0.260703 0.039607 0.302878 0.054799 0.27144 0.074 0.27144 0.058825 0.302878 0.031059 0.338419 0.050286 0.338419 0.092097 0.421182 0.098223 0.365 0.239536 0.397857 0.244494 0.365 0.25 0.364237 0.24413 0.398371 0.073915 0.467437 0.161589 0.44691 0.16546 0.448398 0.163652 0.452958 0.159499 0.452275 0.070708 0.414683 0.075709 0.365 0.222448 0.394145 0.226413 0.365 0.0573 0.451662 0.043407 0.424204 0.134776 0.414674 0.137711 0.412341 0.148509 0.434296 0.146556 0.439812 0.036533 0.365 0.036898 0.394983 0.195806 0.365 0.196087 0.382891 0.190538 0.381004 0.189692 0.364237 0.176137 0.407408 0.180622 0.407978 0.132688 0.387716 0.159049 0.402524 0.1282 0.385159 0.092097 0.308818 0.239536 0.332143 0.244129 0.331629 0.073915 0.262563 0.161589 0.28309 0.159499 0.277725 0.163652 0.277042 0.16546 0.281602 0.070708 0.315317 0.222448 0.335855 0.043407 0.305796 0.0573 0.278338 0.134776 0.315326 0.146556 0.290188 0.148509 0.295704 0.137711 0.317659 0.036898 0.335017 0.190532 0.348995 0.196087 0.347109 0.180622 0.322022 0.176137 0.322592 0.159049 0.327476 0.132688 0.342284 0.1282 0.344841 0.130748 0.467675 0.132864 0.462352 0.1505 0.418149 0.157268 0.365 0.1505 0.311851 0.132864 0.267648 0.130748 0.262325 0.125877 0.263121 0.110605 0.27767 0.096585 0.307015 0.08871 0.340189 0.087734 0.365 0.08871 0.389811 0.096585 0.422985 0.110605 0.45233 0.125877 0.466879 0.186485 0.365 0.181607 0.365 0.175586 0.411811 0.175586 0.318189 0.160002 0.279256 0.158142 0.274567 0.153868 0.275269 0.140539 0.288083 0.128394 0.313929 0.121608 0.343148 0.127387 0.365 0.120769 0.365 0.121608 0.386852 0.128394 0.416071 0.140539 0.441917 0.153868 0.454731 0.158142 0.455433 0.160002 0.450744 0.243515 0.364237 0.237645 0.398362 0.19297 0.364237 0.187106 0.398298 0.237645 0.331638 0.187106 0.331702 0.233063 0.332143 0.18261 0.332143 0.215975 0.335855 0.165522 0.335855 0.189614 0.347109 0.139161 0.347109 0.184167 0.349001 0.134564 0.349047 0.18333 0.364237 0.133748 0.364237 0.184173 0.380998 0.134564 0.380953 0.189614 0.382891 0.139161 0.382891 0.215975 0.394145 0.165522 0.394145 0.233063 0.397857 0.18261 0.397857 0.730143 0.451406 0.729839 0.501676 0.674663 0.510816 0.659572 0.465014 0.626063 0.535525 0.599512 0.497955 0.587596 0.571631 0.55322 0.543954 0.521979 0.598225 0.56103 0.615275 0.547092 0.66294 0.506177 0.656642 0.545784 0.711423 0.505505 0.715516 0.556596 0.757869 0.519054 0.771636 0.578871 0.799818 0.545537 0.822586 0.612972 0.835021 0.584311 0.867084 0.729595 0.541951 0.686227 0.548518 0.64726 0.567266 0.615767 0.595522 0.593559 0.630362 0.581528 0.668907 0.579872 0.708438 0.588269 0.746429 0.606017 0.780486 0.631937 0.807924 0.729354 0.581687 0.69721 0.58626 0.66792 0.599706 0.643799 0.620455 0.62642 0.646509 0.616671 0.675724 0.614854 0.705965 0.620765 0.73519 0.633724 0.761468 0.652453 0.783002 0.729109 0.621938 0.707951 0.624817 0.688475 0.633413 0.67217 0.646906 0.660159 0.664125 0.653154 0.683702 0.651463 0.704208 0.655004 0.724241 0.663339 0.742522 0.675698 0.757991 0.72886 0.662637 0.718451 0.664011 0.708798 0.668147 0.700604 0.674715 0.694436 0.683209 0.690694 0.693003 0.689585 0.703405 0.691127 0.713715 0.695159 0.723274 0.701363 0.731506 0.638263 0.811858 0.622071 0.840166 0.657782 0.786826 0.690677 0.765711 0.713762 0.760253 0.712221 0.765742 0.690378 0.770057 0.728266 0.759688 0.728225 0.766384 0.611421 0.859807 0.632111 0.844725 0.632021 0.854187 0.623794 0.855985 0.627405 0.84255 0.728205 0.769615 0.712503 0.770157 0.662156 0.794404 0.642338 0.821312 0.641534 0.813782 0.661367 0.789398 0.690907 0.774496 0.709309 0.73796 0.718502 0.742183 0.728364 0.743792 0.647892 0.885065 0.68612 0.907725 0.683624 0.914918 0.642546 0.891729 0.678272 0.931156 0.631552 0.907356 0.727273 0.915091 0.727226 0.922514 0.72712 0.939128 0.621732 0.869798 0.629049 0.863375 0.606171 0.887353 0.686983 0.903575 0.727304 0.910209 0.649458 0.8809 0.633455 0.859016 0.727805 0.833986 0.715662 0.83449 0.715358 0.829847 0.727831 0.829669 0.669864 0.841872 0.647214 0.848901 0.645554 0.842537 0.668761 0.83655 0.698113 0.835747 0.697316 0.831223 0.698292 0.875787 0.727508 0.8817 0.658427 0.861497 0.648949 0.853246 0.642018 0.832397 0.713825 0.83904 0.697369 0.8401 0.727773 0.839236 0.667162 0.845874 0.713959 0.854617 0.72766 0.859829 0.691919 0.804554 0.662493 0.816496 0.71386 0.801495 0.728012 0.800796 0.800546 0.465867 0.784901 0.511485 0.860206 0.499535 0.8332 0.536782 0.90594 0.546095 0.871227 0.573355 0.936521 0.600744 0.897262 0.61732 0.951614 0.659352 0.910622 0.665154 0.951573 0.718234 0.911341 0.713654 0.937346 0.774195 0.899965 0.759972 0.910244 0.824833 0.877177 0.801655 0.870921 0.868873 0.842638 0.83645 0.77288 0.549044 0.811618 0.568264 0.842768 0.596903 0.864551 0.632011 0.876113 0.670703 0.877288 0.710255 0.868428 0.748146 0.850263 0.78199 0.823998 0.809117 0.76144 0.586651 0.790565 0.600451 0.814432 0.621494 0.831493 0.647759 0.840887 0.677092 0.842336 0.707356 0.836068 0.736509 0.822787 0.762631 0.803792 0.783936 0.75023 0.625074 0.7696 0.633907 0.78574 0.647599 0.797541 0.664963 0.804306 0.684625 0.805748 0.705151 0.801962 0.725141 0.793402 0.743321 0.780854 0.758638 0.739253 0.664138 0.748854 0.668391 0.756968 0.675059 0.763032 0.683628 0.766654 0.693467 0.767636 0.703882 0.765967 0.714173 0.761819 0.723682 0.755514 0.731838 0.81762 0.812975 0.833473 0.841483 0.798417 0.787693 0.76578 0.766174 0.766025 0.770523 0.744235 0.76594 0.742762 0.760432 0.843891 0.861262 0.823371 0.845919 0.828106 0.843802 0.831559 0.857284 0.82335 0.855381 0.743899 0.770351 0.793951 0.795216 0.794801 0.790221 0.814324 0.814861 0.813424 0.822383 0.765442 0.774957 0.747489 0.738194 0.738245 0.742304 0.807129 0.886081 0.812381 0.892815 0.770938 0.915484 0.768528 0.908255 0.823171 0.90859 0.776087 0.9318 0.826216 0.864612 0.833459 0.871129 0.848809 0.888887 0.767715 0.904092 0.805624 0.881896 0.821859 0.860194 0.7403 0.830005 0.739938 0.834645 0.785618 0.8426 0.786785 0.837294 0.809973 0.843531 0.808216 0.849888 0.758318 0.83161 0.757466 0.836123 0.756815 0.87616 0.796801 0.862358 0.806415 0.854218 0.813592 0.833483 0.741718 0.839219 0.758156 0.840486 0.788272 0.846632 0.741392 0.854799 0.79335 0.817298 0.764058 0.805006 0.742155 0.801672 0.739879 0.703443 0.739544 0.700429 0.738459 0.697605 0.736692 0.695167 0.734362 0.693283 0.731629 0.692089 0.728683 0.691669 0.725733 0.692053 0.722985 0.693214 0.720632 0.695069 0.718836 0.697486 0.717716 0.700296 0.717345 0.703306 0.71774 0.706312 0.71887 0.709112 0.720653 0.711521 0.722966 0.713379 0.725655 0.714559 0.728541 0.714976 0.731431 0.714594 0.734134 0.713447 0.73647 0.711618 0.738282 0.70923 0.739447 0.706444 0.728612 0.703346 0.677147 0.935045 0.63309 0.913114 0.603885 0.891138 0.577299 0.866286 0.541588 0.825072 0.514674 0.773255 0.500796 0.716034 0.501372 0.65596 0.517362 0.596289 0.549111 0.540764 0.596273 0.493569 0.657649 0.459561 0.730181 0.445212 0.802536 0.460438 0.863499 0.495188 0.910087 0.542955 0.941161 0.598864 0.956427 0.658728 0.956276 0.71881 0.941706 0.775867 0.914164 0.827367 0.877946 0.86816 0.85105 0.892701 0.821556 0.914331 0.777162 0.935705 0.727094 0.943099 0.50967 0.775114 0.495409 0.716647 0.537141 0.828021 0.573291 0.870314 0.600272 0.895459 0.630335 0.917495 0.675775 0.939522 0.727063 0.947691 0.778477 0.940203 0.824255 0.918751 0.854611 0.89707 0.881907 0.872239 0.918577 0.83037 0.946688 0.777787 0.961656 0.719488 0.961943 0.658041 0.946493 0.596742 0.914874 0.539386 0.86733 0.49022 0.804892 0.454185 0.730225 0.437965 0.655368 0.45328 0.592502 0.488555 0.544368 0.537138 0.512057 0.594102 0.495866 0.655205 0.971604 0.720761 0.955894 0.781339 0.972151 0.656796 0.956376 0.592846 0.92377 0.532812 0.874484 0.481042 0.809341 0.442578 0.730307 0.424379 0.65106 0.441621 0.58546 0.479291 0.535553 0.530456 0.502222 0.590087 0.485673 0.653838 0.485447 0.7178 0.500423 0.778555 0.528882 0.833445 0.565805 0.877554 0.593676 0.903517 0.625458 0.925737 0.673278 0.947884 0.727007 0.956232 0.780866 0.948603 0.82903 0.927061 0.861112 0.905214 0.88931 0.879573 0.926772 0.835895 0.587032 0.911819 0.558096 0.884695 0.620756 0.934282 0.670791 0.956477 0.726948 0.964982 0.783241 0.957236 0.833626 0.935674 0.867659 0.913604 0.896936 0.886809 0.935128 0.841471 0.965246 0.784963 0.98172 0.722086 0.98255 0.65557 0.966465 0.588926 0.932882 0.526162 0.881864 0.471722 0.814014 0.430721 0.730392 0.410256 0.646532 0.429708 0.578194 0.469883 0.526523 0.523697 0.492182 0.586045 0.475291 0.652486 0.475317 0.719002 0.49103 0.782065 0.520462 0.838919 0.726915 0.969836 0.66944 0.96125 0.784529 0.96203 0.83604 0.940508 0.87127 0.918307 0.901217 0.890705 0.939744 0.84453 0.970403 0.786968 0.987305 0.722831 0.988297 0.654909 0.97205 0.58678 0.93794 0.522507 0.885981 0.466585 0.816662 0.424157 0.73044 0.402314 0.643964 0.423113 0.57414 0.464697 0.52151 0.519981 0.486624 0.583831 0.469553 0.651755 0.469725 0.719679 0.48585 0.784008 0.515811 0.841921 0.553771 0.888538 0.583368 0.916475 0.618283 0.939078 0.216383 0.815019 0.217099 0.812515 0.235103 0.81494 0.235108 0.817541 0.305273 0.763601 0.30257 0.763074 0.305022 0.745146 0.307822 0.744956 0.216123 0.675027 0.216849 0.677906 0.200015 0.684842 0.198615 0.68224 0.286371 0.693816 0.284395 0.695973 0.270012 0.68489 0.271413 0.68229 0.164669 0.763581 0.167374 0.763054 0.174175 0.779725 0.171742 0.780918 0.288639 0.794505 0.286575 0.792789 0.295768 0.779861 0.298199 0.78106 0.185572 0.695874 0.183594 0.693713 0.253744 0.815165 0.253023 0.812654 0.268298 0.806889 0.269629 0.809169 0.181261 0.794259 0.183328 0.792553 0.191492 0.800505 0.189751 0.802529 0.200435 0.809072 0.201764 0.806795 0.30528 0.726268 0.302577 0.727177 0.295559 0.710387 0.297982 0.708807 0.164719 0.726294 0.167423 0.727202 0.164978 0.745182 0.162178 0.744994 0.25309 0.677751 0.253813 0.674866 0.280066 0.802516 0.278332 0.800492 0.174405 0.7104 0.171981 0.70882 0.234862 0.675437 0.234857 0.672459 0.193191 0.711687 0.182712 0.736808 0.214808 0.695147 0.241822 0.691514 0.283692 0.723577 0.267075 0.70203 0.287285 0.750426 0.215568 0.79264 0.241888 0.795788 0.264119 0.788107 0.198831 0.782665 0.186188 0.763559 0.277691 0.77491 0.222481 0.713071 0.209078 0.723325 0.265188 0.730697 0.254886 0.717338 0.23927 0.775468 0.253053 0.770706 0.222952 0.773517 0.261468 0.762523 0.267416 0.747344 0.239229 0.710818 0.202581 0.738901 0.212575 0.767331 0.204736 0.755486 0.234993 0.745117 0.352961 0.948595 0.29969 0.972633 0.298279 0.96785 0.350482 0.944128 0.29969 0.972633 0.236996 0.983312 0.23697 0.978214 0.236996 0.983312 0.1742 0.973288 0.17556 0.968491 0.1742 0.973288 0.120687 0.949809 0.123119 0.945317 0.120687 0.949809 0.088063 0.925486 0.09168 0.921615 0.088063 0.925486 0.063365 0.89609 0.067634 0.893388 0.063365 0.89609 0.03675 0.846184 0.041245 0.844399 0.03675 0.846184 0.020267 0.78806 0.024949 0.787277 0.020267 0.78806 0.017118 0.728298 0.021803 0.728572 0.017118 0.728298 0.027284 0.67002 0.031728 0.671322 0.027284 0.67002 0.050082 0.616306 0.054046 0.61856 0.050082 0.616306 0.084282 0.570113 0.087538 0.5732 0.084282 0.570113 0.128117 0.534196 0.130458 0.53795 0.128117 0.534196 0.179226 0.51103 0.180472 0.515234 0.179226 0.51103 0.234521 0.50269 0.234544 0.507057 0.234521 0.50269 0.289898 0.510454 0.288696 0.51467 0.289898 0.510454 0.341241 0.533082 0.33894 0.53686 0.341241 0.533082 0.385441 0.568536 0.382217 0.571656 0.385441 0.568536 0.420115 0.614365 0.416175 0.61666 0.420115 0.614365 0.443469 0.667835 0.439037 0.669183 0.443469 0.667835 0.454237 0.726007 0.449555 0.726329 0.454237 0.726007 0.451702 0.785798 0.447013 0.785063 0.451702 0.785798 0.435823 0.844089 0.431309 0.842352 0.435823 0.844089 0.409726 0.894275 0.405429 0.891616 0.409726 0.894275 0.385331 0.923932 0.381674 0.920098 0.385331 0.923932 0.352961 0.948595 0.372668 0.910682 0.39491 0.88467 0.344033 0.933157 0.294694 0.955845 0.236903 0.965442 0.179019 0.95645 0.129453 0.934281 0.100587 0.912107 0.078079 0.886333 0.052555 0.839823 0.036776 0.785283 0.033642 0.729251 0.042962 0.674598 0.064062 0.624238 0.095761 0.580973 0.136362 0.547399 0.18361 0.525805 0.234601 0.518027 0.285669 0.525272 0.333135 0.546369 0.374077 0.579514 0.40622 0.62244 0.427839 0.672575 0.437723 0.72713 0.435166 0.783191 0.419951 0.837893 0.419923 0.72828 0.41099 0.677608 0.417362 0.780319 0.402983 0.831085 0.379561 0.874095 0.359572 0.896971 0.334293 0.917157 0.28935 0.938069 0.236805 0.946653 0.184178 0.938621 0.139025 0.918183 0.113534 0.898261 0.093316 0.875602 0.069451 0.832839 0.054549 0.782228 0.051453 0.730218 0.059864 0.679456 0.079125 0.632687 0.108111 0.592544 0.14521 0.561448 0.188295 0.541488 0.234686 0.534248 0.281148 0.541002 0.324435 0.560508 0.36185 0.591211 0.391247 0.631045 0.338414 0.874794 0.354583 0.856347 0.318068 0.891331 0.280494 0.909045 0.236645 0.916127 0.192726 0.909508 0.154975 0.892192 0.134463 0.875875 0.118105 0.857595 0.097585 0.820929 0.084484 0.776921 0.081543 0.731685 0.088436 0.687433 0.104574 0.646645 0.128939 0.611668 0.160083 0.584626 0.196135 0.567284 0.234825 0.560702 0.27358 0.566876 0.309807 0.583837 0.341226 0.610548 0.365948 0.645265 0.382504 0.685879 0.389851 0.730057 0.387374 0.775321 0.374725 0.819465 0.273981 0.887972 0.306104 0.872649 0.236528 0.894005 0.199016 0.888371 0.16674 0.87339 0.149826 0.859661 0.136453 0.844382 0.118722 0.812016 0.107215 0.772841 0.104481 0.732647 0.110247 0.693244 0.124002 0.656892 0.144825 0.625716 0.171407 0.601626 0.202088 0.586215 0.23493 0.580614 0.267827 0.585867 0.298664 0.600951 0.32549 0.624757 0.34663 0.655711 0.360755 0.691914 0.366924 0.731254 0.364601 0.771474 0.353496 0.810769 0.336096 0.843321 0.322881 0.858741 0.315855 0.85165 0.327681 0.837518 0.300706 0.864364 0.271061 0.878583 0.236475 0.884143 0.201836 0.878953 0.172052 0.865053 0.15677 0.852496 0.144808 0.838494 0.128435 0.80801 0.11772 0.770973 0.115103 0.733045 0.120358 0.69583 0.133014 0.661477 0.152196 0.632003 0.176661 0.609221 0.20485 0.594657 0.234977 0.589431 0.265155 0.594337 0.29349 0.6086 0.318186 0.631119 0.337667 0.660388 0.350672 0.694603 0.356307 0.73176 0.354078 0.769714 0.343741 0.806861 0.148898 0.799912 0.162219 0.826842 0.139898 0.767106 0.137556 0.733766 0.141757 0.701019 0.152107 0.670733 0.167829 0.644692 0.187818 0.624514 0.21072 0.611594 0.23507 0.607008 0.259465 0.611333 0.282497 0.624005 0.302689 0.643967 0.318674 0.669838 0.329331 0.70001 0.333864 0.73271 0.33186 0.766073 0.323193 0.798973 0.310144 0.826044 0.301459 0.837638 0.289784 0.84776 0.265153 0.859605 0.236368 0.864232 0.207539 0.859916 0.18279 0.848339 0.171029 0.838349 0.150763 0.703047 0.146992 0.734012 0.160162 0.674375 0.174445 0.649676 0.192562 0.63049 0.21323 0.618165 0.235107 0.613786 0.257027 0.617929 0.277819 0.630029 0.296127 0.649017 0.310659 0.67356 0.320347 0.702129 0.324431 0.733051 0.322509 0.76458 0.314464 0.795902 0.302587 0.821955 0.295756 0.832479 0.285736 0.841094 0.262826 0.852005 0.236325 0.85631 0.209782 0.852293 0.186765 0.841636 0.176675 0.833133 0.169733 0.822676 0.157593 0.796752 0.149232 0.765519 0.352961 0.948595 0.29969 0.972633 0.29969 0.972633 0.236996 0.983312 0.236996 0.983312 0.1742 0.973288 0.1742 0.973288 0.120687 0.949809 0.120687 0.949809 0.088063 0.925486 0.088063 0.925486 0.063365 0.89609 0.063365 0.89609 0.03675 0.846184 0.03675 0.846184 0.020267 0.78806 0.020267 0.78806 0.017118 0.728298 0.017118 0.728298 0.027284 0.67002 0.027284 0.67002 0.050082 0.616306 0.050082 0.616306 0.084282 0.570113 0.084282 0.570113 0.128117 0.534196 0.128117 0.534196 0.179226 0.51103 0.179226 0.51103 0.234521 0.50269 0.234521 0.50269 0.289898 0.510454 0.289898 0.510454 0.341241 0.533082 0.341241 0.533082 0.385441 0.568536 0.385441 0.568536 0.420115 0.614365 0.420115 0.614365 0.443469 0.667835 0.443469 0.667835 0.454237 0.726007 0.454237 0.726007 0.451702 0.785798 0.451702 0.785798 0.435823 0.844089 0.435823 0.844089 0.409726 0.894275 0.409726 0.894275 0.385331 0.923932 0.385331 0.923932 0.352961 0.948595</float_array>
+ <technique_common>
+ <accessor source="#Headphones-headphonesUV-array" count="1829" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Headphones-vertices">
+ <input semantic="POSITION" source="#Headphones-positions"/>
+ </vertices>
+ <triangles material="HeadphonesSG" count="420">
+ <input semantic="VERTEX" source="#Headphones-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Headphones-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Headphones-headphonesUV" offset="2" set="1"/>
+ <p>1381 0 0 1383 1 1 1382 3 3 1382 3 3 1383 1 1 1384 2 2 1383 1 1 1385 4 4 1384 2 2 1384 2 2 1385 4 4 1386 5 5 1392 6 6 1394 7 7 1391 9 9 1391 9 9 1394 7 7 1393 8 8 1394 7 7 1396 10 10 1393 8 8 1393 8 8 1396 10 10 1395 11 11 1396 10 10 1398 12 12 1395 11 11 1395 11 11 1398 12 12 1397 13 13 1398 12 12 1400 14 14 1397 13 13 1397 13 13 1400 14 14 1399 15 15 1401 16 16 1399 15 15 1402 17 17 1402 17 17 1399 15 15 1400 14 14 1403 18 18 1401 16 16 1404 19 19 1404 19 19 1401 16 16 1402 17 17 1405 20 20 1403 18 18 1406 21 21 1406 21 21 1403 18 18 1404 19 19 1407 22 22 1405 20 20 1408 23 23 1408 23 23 1405 20 20 1406 21 21 1368 24 24 1369 25 25 1367 27 27 1367 27 27 1369 25 25 1370 26 26 1369 25 25 1371 28 28 1370 26 26 1370 26 26 1371 28 28 1372 29 29 1413 31 31 1414 32 32 1411 30 30 1411 30 30 1414 32 32 1412 33 33 1371 28 28 1373 34 34 1372 29 29 1372 29 29 1373 34 34 1374 35 35 1413 31 31 1415 36 36 1414 32 32 1414 32 32 1415 36 36 1416 37 37 1373 34 34 1375 38 38 1374 35 35 1374 35 35 1375 38 38 1376 39 39 1415 36 36 1417 40 40 1416 37 37 1416 37 37 1417 40 40 1418 41 41 1375 38 38 1377 42 42 1376 39 39 1376 39 39 1377 42 42 1378 43 43 1417 40 40 1419 44 44 1418 41 41 1418 41 41 1419 44 44 1420 45 45 1419 44 44 1421 46 46 1420 45 45 1420 45 45 1421 46 46 1422 47 47 1424 48 48 1422 47 47 1423 49 49 1423 49 49 1422 47 47 1421 46 46 1423 49 49 1425 50 50 1424 48 48 1424 48 48 1425 50 50 1426 51 51 1428 52 52 1426 51 51 1427 53 53 1427 53 53 1426 51 51 1425 50 50 1427 53 53 1429 54 54 1428 52 52 1428 52 52 1429 54 54 1430 55 55 1451 57 57 1452 58 58 1410 56 56 1410 56 56 1452 58 58 1409 59 59 1436 60 60 1438 61 61 1435 63 63 1435 63 63 1438 61 61 1437 62 62 1439 64 64 1437 62 62 1440 65 65 1440 65 65 1437 62 62 1438 61 61 1440 65 65 1442 66 66 1439 64 64 1439 64 64 1442 66 66 1441 67 67 1442 66 66 1444 68 68 1441 67 67 1441 67 67 1444 68 68 1443 69 69 1377 42 42 1379 70 70 1378 43 43 1378 43 43 1379 70 70 1380 71 71 1444 68 68 1446 72 72 1443 69 69 1443 69 69 1446 72 72 1445 73 73 1447 74 74 1445 73 73 1448 75 75 1448 75 75 1445 73 73 1446 72 72 1449 76 76 1447 74 74 1450 77 77 1450 77 77 1447 74 74 1448 75 75 1451 57 57 1449 76 76 1452 58 58 1452 58 58 1449 76 76 1450 77 77 1408 23 23 1365 78 78 1407 22 22 1407 22 22 1365 78 78 1366 79 79 1379 70 70 1381 0 0 1380 71 71 1380 71 71 1381 0 0 1382 3 3 1367 27 27 1370 26 26 1366 79 79 1366 79 79 1370 26 26 1407 22 22 1370 26 26 1372 29 29 1407 22 22 1407 22 22 1372 29 29 1405 20 20 1372 29 29 1374 35 35 1405 20 20 1405 20 20 1374 35 35 1403 18 18 1374 35 35 1376 39 39 1403 18 18 1403 18 18 1376 39 39 1401 16 16 1376 39 39 1378 43 43 1401 16 16 1401 16 16 1378 43 43 1399 15 15 1378 43 43 1380 71 71 1399 15 15 1399 15 15 1380 71 71 1397 13 13 1380 71 71 1382 3 3 1397 13 13 1397 13 13 1382 3 3 1395 11 11 1382 3 3 1384 2 2 1395 11 11 1395 11 11 1384 2 2 1393 8 8 1384 2 2 1386 5 5 1393 8 8 1393 8 8 1386 5 5 1391 9 9 1452 58 58 1413 31 31 1409 59 59 1409 59 59 1413 31 31 1411 30 30 1450 77 77 1415 36 36 1452 58 58 1452 58 58 1415 36 36 1413 31 31 1448 75 75 1417 40 40 1450 77 77 1450 77 77 1417 40 40 1415 36 36 1446 72 72 1419 44 44 1448 75 75 1448 75 75 1419 44 44 1417 40 40 1444 68 68 1421 46 46 1446 72 72 1446 72 72 1421 46 46 1419 44 44 1442 66 66 1423 49 49 1444 68 68 1444 68 68 1423 49 49 1421 46 46 1440 65 65 1425 50 50 1442 66 66 1442 66 66 1425 50 50 1423 49 49 1438 61 61 1427 53 53 1440 65 65 1440 65 65 1427 53 53 1425 50 50 1436 60 60 1429 54 54 1438 61 61 1438 61 61 1429 54 54 1427 53 53 1368 24 24 1346 80 80 1369 25 25 1369 25 25 1346 80 80 1347 81 81 1347 81 81 1346 80 80 1414 32 32 1414 32 32 1346 80 80 1412 33 33 1369 25 25 1347 81 81 1371 28 28 1371 28 28 1347 81 81 1348 82 82 1348 82 82 1347 81 81 1416 37 37 1416 37 37 1347 81 81 1414 32 32 1371 28 28 1348 82 82 1373 34 34 1373 34 34 1348 82 82 1349 83 83 1349 83 83 1348 82 82 1418 41 41 1418 41 41 1348 82 82 1416 37 37 1373 34 34 1349 83 83 1375 38 38 1375 38 38 1349 83 83 1350 84 84 1350 84 84 1349 83 83 1420 45 45 1420 45 45 1349 83 83 1418 41 41 1375 38 38 1350 84 84 1377 42 42 1377 42 42 1350 84 84 1351 85 85 1351 85 85 1350 84 84 1422 47 47 1422 47 47 1350 84 84 1420 45 45 1377 42 42 1351 85 85 1379 70 70 1379 70 70 1351 85 85 1352 86 86 1352 86 86 1351 85 85 1424 48 48 1424 48 48 1351 85 85 1422 47 47 1379 70 70 1352 86 86 1381 0 0 1381 0 0 1352 86 86 1353 87 87 1353 87 87 1352 86 86 1426 51 51 1426 51 51 1352 86 86 1424 48 48 1381 0 0 1353 87 87 1383 1 1 1383 1 1 1353 87 87 1354 88 88 1354 88 88 1353 87 87 1428 52 52 1428 52 52 1353 87 87 1426 51 51 1383 1 1 1354 88 88 1385 4 4 1385 4 4 1354 88 88 1355 89 89 1355 89 89 1354 88 88 1430 55 55 1430 55 55 1354 88 88 1428 52 52 1392 6 6 1356 90 90 1394 7 7 1394 7 7 1356 90 90 1357 91 91 1357 91 92 1356 90 93 1437 62 62 1437 62 62 1356 90 93 1435 63 63 1394 7 7 1357 91 91 1396 10 10 1396 10 10 1357 91 91 1358 92 94 1358 92 95 1357 91 96 1439 64 64 1439 64 64 1357 91 96 1437 62 62 1396 10 10 1358 92 94 1398 12 12 1398 12 12 1358 92 94 1359 93 97 1359 93 98 1358 92 99 1441 67 67 1441 67 67 1358 92 99 1439 64 64 1398 12 12 1359 93 97 1400 14 14 1400 14 14 1359 93 97 1360 94 100 1360 94 101 1359 93 102 1443 69 69 1443 69 69 1359 93 102 1441 67 67 1400 14 14 1360 94 100 1402 17 17 1402 17 17 1360 94 100 1361 95 103 1361 95 104 1360 94 105 1445 73 73 1445 73 73 1360 94 105 1443 69 69 1402 17 17 1361 95 103 1404 19 19 1404 19 19 1361 95 103 1362 96 106 1362 96 107 1361 95 108 1447 74 74 1447 74 74 1361 95 108 1445 73 73 1404 19 19 1362 96 106 1406 21 21 1406 21 21 1362 96 106 1363 97 109 1363 97 110 1362 96 111 1449 76 76 1449 76 76 1362 96 111 1447 74 74 1406 21 21 1363 97 109 1408 23 23 1408 23 23 1363 97 109 1364 98 112 1364 98 113 1363 97 114 1451 57 57 1451 57 57 1363 97 114 1449 76 76 1408 23 23 1364 98 112 1365 78 78 1365 78 78 1364 98 112 1345 99 115 1345 99 116 1364 98 117 1410 56 56 1410 56 56 1364 98 117 1451 57 57 1513 100 118 1514 101 119 1515 103 121 1515 103 121 1514 101 119 1516 102 120 1515 103 121 1516 102 120 1517 105 123 1517 105 123 1516 102 120 1518 104 122 1524 106 124 1523 107 125 1526 109 127 1526 109 127 1523 107 125 1525 108 126 1526 109 127 1525 108 126 1528 111 129 1528 111 129 1525 108 126 1527 110 128 1528 111 129 1527 110 128 1530 113 131 1530 113 131 1527 110 128 1529 112 130 1530 113 131 1529 112 130 1532 115 133 1532 115 133 1529 112 130 1531 114 132 1533 116 134 1534 117 135 1531 114 132 1531 114 132 1534 117 135 1532 115 133 1535 118 136 1536 119 137 1533 116 134 1533 116 134 1536 119 137 1534 117 135 1537 120 138 1538 121 139 1535 118 136 1535 118 136 1538 121 139 1536 119 137 1539 122 140 1540 123 141 1537 120 138 1537 120 138 1540 123 141 1538 121 139 1500 124 142 1499 125 143 1501 127 145 1501 127 145 1499 125 143 1502 126 144 1501 127 145 1502 126 144 1503 129 147 1503 129 147 1502 126 144 1504 128 146 1544 131 149 1546 132 150 1543 130 148 1543 130 148 1546 132 150 1545 133 151 1503 129 147 1504 128 146 1505 135 153 1505 135 153 1504 128 146 1506 134 152 1545 133 151 1546 132 150 1547 137 155 1547 137 155 1546 132 150 1548 136 154 1505 135 153 1506 134 152 1507 139 157 1507 139 157 1506 134 152 1508 138 156 1547 137 155 1548 136 154 1549 141 159 1549 141 159 1548 136 154 1550 140 158 1507 139 157 1508 138 156 1509 143 161 1509 143 161 1508 138 156 1510 142 160 1549 141 159 1550 140 158 1551 145 163 1551 145 163 1550 140 158 1552 144 162 1551 145 163 1552 144 162 1553 147 165 1553 147 165 1552 144 162 1554 146 164 1556 148 166 1555 149 167 1554 146 164 1554 146 164 1555 149 167 1553 147 165 1555 149 167 1556 148 166 1557 151 169 1557 151 169 1556 148 166 1558 150 168 1560 152 170 1559 153 171 1558 150 168 1558 150 168 1559 153 171 1557 151 169 1559 153 171 1560 152 170 1561 155 173 1561 155 173 1560 152 170 1562 154 172 1541 157 175 1584 158 176 1542 156 174 1542 156 174 1584 158 176 1583 159 177 1568 160 178 1567 161 179 1570 163 181 1570 163 181 1567 161 179 1569 162 180 1571 164 182 1572 165 183 1569 162 180 1569 162 180 1572 165 183 1570 163 181 1572 165 183 1571 164 182 1574 167 185 1574 167 185 1571 164 182 1573 166 184 1574 167 185 1573 166 184 1576 169 187 1576 169 187 1573 166 184 1575 168 186 1509 143 161 1510 142 160 1511 171 189 1511 171 189 1510 142 160 1512 170 188 1576 169 187 1575 168 186 1578 173 191 1578 173 191 1575 168 186 1577 172 190 1579 174 192 1580 175 193 1577 172 190 1577 172 190 1580 175 193 1578 173 191 1581 176 194 1582 177 195 1579 174 192 1579 174 192 1582 177 195 1580 175 193 1583 159 177 1584 158 176 1581 176 194 1581 176 194 1584 158 176 1582 177 195 1540 123 141 1539 122 140 1497 179 197 1497 179 197 1539 122 140 1498 178 196 1511 171 189 1512 170 188 1513 100 118 1513 100 118 1512 170 188 1514 101 119 1499 125 143 1498 178 196 1502 126 144 1502 126 144 1498 178 196 1539 122 140 1502 126 144 1539 122 140 1504 128 146 1504 128 146 1539 122 140 1537 120 138 1504 128 146 1537 120 138 1506 134 152 1506 134 152 1537 120 138 1535 118 136 1506 134 152 1535 118 136 1508 138 156 1508 138 156 1535 118 136 1533 116 134 1508 138 156 1533 116 134 1510 142 160 1510 142 160 1533 116 134 1531 114 132 1510 142 160 1531 114 132 1512 170 188 1512 170 188 1531 114 132 1529 112 130 1512 170 188 1529 112 130 1514 101 119 1514 101 119 1529 112 130 1527 110 128 1514 101 119 1527 110 128 1516 102 120 1516 102 120 1527 110 128 1525 108 126 1516 102 120 1525 108 126 1518 104 122 1518 104 122 1525 108 126 1523 107 125 1584 158 176 1541 157 175 1545 133 151 1545 133 151 1541 157 175 1543 130 148 1582 177 195 1584 158 176 1547 137 155 1547 137 155 1584 158 176 1545 133 151 1580 175 193 1582 177 195 1549 141 159 1549 141 159 1582 177 195 1547 137 155 1578 173 191 1580 175 193 1551 145 163 1551 145 163 1580 175 193 1549 141 159 1576 169 187 1578 173 191 1553 147 165 1553 147 165 1578 173 191 1551 145 163 1574 167 185 1576 169 187 1555 149 167 1555 149 167 1576 169 187 1553 147 165 1572 165 183 1574 167 185 1557 151 169 1557 151 169 1574 167 185 1555 149 167 1570 163 181 1572 165 183 1559 153 171 1559 153 171 1572 165 183 1557 151 169 1568 160 178 1570 163 181 1561 155 173 1561 155 173 1570 163 181 1559 153 171 1500 124 142 1501 127 145 1478 181 199 1478 181 199 1501 127 145 1479 180 198 1479 180 198 1546 132 150 1478 181 199 1478 181 199 1546 132 150 1544 131 149 1501 127 145 1503 129 147 1479 180 198 1479 180 198 1503 129 147 1480 182 200 1480 182 200 1548 136 154 1479 180 198 1479 180 198 1548 136 154 1546 132 150 1503 129 147 1505 135 153 1480 182 200 1480 182 200 1505 135 153 1481 183 201 1481 183 201 1550 140 158 1480 182 200 1480 182 200 1550 140 158 1548 136 154 1505 135 153 1507 139 157 1481 183 201 1481 183 201 1507 139 157 1482 184 202 1482 184 202 1552 144 162 1481 183 201 1481 183 201 1552 144 162 1550 140 158 1507 139 157 1509 143 161 1482 184 202 1482 184 202 1509 143 161 1483 185 203 1483 185 203 1554 146 164 1482 184 202 1482 184 202 1554 146 164 1552 144 162 1509 143 161 1511 171 189 1483 185 203 1483 185 203 1511 171 189 1484 186 204 1484 186 204 1556 148 166 1483 185 203 1483 185 203 1556 148 166 1554 146 164 1511 171 189 1513 100 118 1484 186 204 1484 186 204 1513 100 118 1485 187 205 1485 187 205 1558 150 168 1484 186 204 1484 186 204 1558 150 168 1556 148 166 1513 100 118 1515 103 121 1485 187 205 1485 187 205 1515 103 121 1486 188 206 1486 188 206 1560 152 170 1485 187 205 1485 187 205 1560 152 170 1558 150 168 1515 103 121 1517 105 123 1486 188 206 1486 188 206 1517 105 123 1487 189 207 1487 189 207 1562 154 172 1486 188 206 1486 188 206 1562 154 172 1560 152 170 1524 106 124 1526 109 127 1488 191 209 1488 191 209 1526 109 127 1489 190 208 1489 190 210 1569 162 180 1488 191 211 1488 191 211 1569 162 180 1567 161 179 1526 109 127 1528 111 129 1489 190 208 1489 190 208 1528 111 129 1490 192 212 1490 192 213 1571 164 182 1489 190 214 1489 190 214 1571 164 182 1569 162 180 1528 111 129 1530 113 131 1490 192 212 1490 192 212 1530 113 131 1491 193 215 1491 193 216 1573 166 184 1490 192 217 1490 192 217 1573 166 184 1571 164 182 1530 113 131 1532 115 133 1491 193 215 1491 193 215 1532 115 133 1492 194 218 1492 194 219 1575 168 186 1491 193 220 1491 193 220 1575 168 186 1573 166 184 1532 115 133 1534 117 135 1492 194 218 1492 194 218 1534 117 135 1493 195 221 1493 195 222 1577 172 190 1492 194 223 1492 194 223 1577 172 190 1575 168 186 1534 117 135 1536 119 137 1493 195 221 1493 195 221 1536 119 137 1494 196 224 1494 196 225 1579 174 192 1493 195 226 1493 195 226 1579 174 192 1577 172 190 1536 119 137 1538 121 139 1494 196 224 1494 196 224 1538 121 139 1495 197 227 1495 197 228 1581 176 194 1494 196 229 1494 196 229 1581 176 194 1579 174 192 1538 121 139 1540 123 141 1495 197 227 1495 197 227 1540 123 141 1496 198 230 1496 198 231 1583 159 177 1495 197 232 1495 197 232 1583 159 177 1581 176 194 1540 123 141 1497 179 197 1496 198 230 1496 198 230 1497 179 197 1477 199 233 1477 199 234 1542 156 174 1496 198 235 1496 198 235 1542 156 174 1583 159 177 1498 178 196 1499 125 143 1366 79 79 1366 79 79 1499 125 143 1367 27 27 1499 125 143 1500 124 142 1367 27 27 1367 27 27 1500 124 142 1368 24 24 1500 124 142 1478 181 199 1368 24 24 1368 24 24 1478 181 199 1346 80 80 1478 181 199 1544 131 149 1346 80 80 1346 80 80 1544 131 149 1412 33 33 1544 131 149 1543 130 148 1412 33 33 1412 33 33 1543 130 148 1411 30 30 1543 130 148 1541 157 175 1411 30 30 1411 30 30 1541 157 175 1409 59 59 1541 157 175 1542 156 174 1409 59 59 1409 59 59 1542 156 174 1410 56 56 1542 156 174 1477 199 236 1410 56 56 1410 56 56 1477 199 236 1345 99 237 1477 199 233 1497 179 197 1345 99 115 1345 99 115 1497 179 197 1365 78 78 1497 179 197 1498 178 196 1365 78 78 1365 78 78 1498 178 196 1366 79 79 1601 200 238 1604 201 239 1385 4 4 1385 4 4 1604 201 239 1386 5 5 1605 202 240 1608 203 241 1391 9 9 1391 9 9 1608 203 241 1392 6 6 1430 55 55 1429 54 54 1612 205 243 1612 205 243 1429 54 54 1609 204 242 1613 206 244 1616 207 245 1435 63 63 1435 63 63 1616 207 245 1436 60 60 1604 201 239 1605 202 240 1386 5 5 1386 5 5 1605 202 240 1391 9 9 1609 204 242 1429 54 54 1616 207 245 1616 207 245 1429 54 54 1436 60 60 1355 89 89 1597 208 246 1385 4 4 1385 4 4 1597 208 246 1601 200 238 1355 89 89 1430 55 55 1597 208 246 1597 208 246 1430 55 55 1612 205 243 1600 209 247 1356 90 90 1608 203 241 1608 203 241 1356 90 90 1392 6 6 1600 209 248 1613 206 244 1356 90 249 1356 90 249 1613 206 244 1435 63 63 1518 104 122 1623 210 250 1517 105 123 1517 105 123 1623 210 250 1621 211 251 1524 106 124 1628 212 252 1523 107 125 1523 107 125 1628 212 252 1626 213 253 1630 214 254 1561 155 173 1631 215 255 1631 215 255 1561 155 173 1562 154 172 1568 160 178 1636 216 256 1567 161 179 1567 161 179 1636 216 256 1634 217 257 1523 107 125 1626 213 253 1518 104 122 1518 104 122 1626 213 253 1623 210 250 1568 160 178 1561 155 173 1636 216 256 1636 216 256 1561 155 173 1630 214 254 1621 211 251 1618 218 258 1517 105 123 1517 105 123 1618 218 258 1487 189 207 1631 215 255 1562 154 172 1618 218 258 1618 218 258 1562 154 172 1487 189 207 1524 106 124 1488 191 209 1628 212 252 1628 212 252 1488 191 209 1619 219 259 1567 161 179 1634 217 257 1488 191 261 1488 191 261 1634 217 257 1619 219 260</p>
+ </triangles>
+ <triangles material="HeadphonesSG1" count="1472">
+ <input semantic="VERTEX" source="#Headphones-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Headphones-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Headphones-headphonesUV" offset="2" set="1"/>
+ <p>1019 221 263 1028 222 264 1029 220 262 1029 220 262 1028 222 264 1038 223 265 1323 225 267 1020 226 268 1324 224 266 1324 224 266 1020 226 268 1030 227 269 1022 229 271 1021 230 272 1032 228 270 1032 228 270 1021 230 272 1031 231 273 1020 226 268 1023 232 274 1030 227 269 1030 227 269 1023 232 274 1033 233 275 1023 234 274 1022 229 271 1033 233 275 1033 233 275 1022 229 271 1032 228 270 1021 230 272 1019 221 263 1031 231 273 1031 231 273 1019 221 263 1029 220 262 1311 235 276 1312 236 277 1025 238 279 1025 238 279 1312 236 277 1034 237 278 1026 239 280 1036 240 281 1024 242 283 1024 242 283 1036 240 281 1035 241 282 1025 238 279 1034 237 278 1027 244 285 1027 244 285 1034 237 278 1037 243 284 1027 244 285 1037 243 284 1026 239 280 1026 239 280 1037 243 284 1036 240 281 1038 223 265 1024 242 283 1029 220 262 1029 220 262 1024 242 283 1035 241 282 1035 241 282 1059 245 286 1029 220 262 1029 220 262 1059 245 286 1031 231 273 1065 247 288 1048 248 289 1327 246 287 1327 246 287 1048 248 289 1325 249 290 1048 248 289 1020 250 268 1325 249 290 1325 249 290 1020 250 268 1323 251 267 1048 248 289 1065 247 288 1049 252 291 1049 252 291 1023 253 274 1048 248 289 1048 248 289 1023 253 274 1020 250 268 1065 247 288 1043 254 292 1049 252 291 1049 252 291 1043 254 292 1050 255 293 1050 255 293 1022 229 271 1049 252 291 1049 252 291 1022 229 271 1023 256 274 1043 254 292 1042 257 294 1050 255 293 1050 255 293 1042 257 294 1051 258 295 1051 258 295 1021 230 272 1050 255 293 1050 255 293 1021 230 272 1022 229 271 1042 257 294 1070 259 296 1051 258 295 1051 258 295 1070 259 296 1052 260 297 1052 260 297 1019 221 263 1051 258 295 1051 258 295 1019 221 263 1021 230 272 1070 259 296 1071 261 298 1052 260 297 1052 260 297 1071 261 298 1053 262 299 1053 262 299 1028 222 264 1052 260 297 1052 260 297 1028 222 264 1019 221 263 1072 264 300 1054 265 301 1071 263 298 1071 263 298 1054 265 301 1053 266 299 1053 266 299 1054 265 301 1028 268 264 1028 268 264 1054 265 301 1038 267 265 1054 265 301 1055 269 302 1038 267 265 1038 267 265 1055 269 302 1024 270 283 1055 269 302 1056 271 303 1024 270 283 1024 270 283 1056 271 303 1026 272 280 1056 271 303 1057 273 304 1026 272 280 1026 272 280 1057 273 304 1027 274 285 1057 273 304 1058 275 305 1027 274 285 1027 274 285 1058 275 305 1025 276 279 1058 275 305 1313 277 306 1025 276 279 1025 276 279 1313 277 306 1311 278 276 1034 237 278 1312 236 277 1060 280 308 1060 280 308 1312 236 277 1326 279 307 1060 280 308 1326 279 307 1030 227 269 1030 227 269 1326 279 307 1324 224 266 1037 243 284 1034 237 278 1061 281 309 1061 281 309 1034 237 278 1060 280 308 1061 281 309 1060 280 308 1033 233 275 1033 233 275 1060 280 308 1030 227 269 1036 240 281 1037 243 284 1062 282 310 1062 282 310 1037 243 284 1061 281 309 1062 282 310 1061 281 309 1032 228 270 1032 228 270 1061 281 309 1033 233 275 1035 241 282 1036 240 281 1059 245 286 1059 245 286 1036 240 281 1062 282 310 1059 245 286 1062 282 310 1031 231 273 1031 231 273 1062 282 310 1032 228 270 1327 246 287 1333 283 311 1065 247 288 1065 247 288 1333 283 311 1066 284 312 1065 247 288 1066 284 312 1043 254 292 1043 254 292 1066 284 312 1063 285 313 1333 283 311 1335 286 314 1066 284 312 1066 284 312 1335 286 314 1067 287 315 1063 285 313 1073 288 316 1069 290 318 1069 290 318 1073 288 316 1064 289 317 1043 254 292 1063 285 313 1042 257 294 1042 257 294 1063 285 313 1068 291 319 1068 291 319 1063 285 313 1069 290 318 1042 257 294 1068 292 319 1070 259 296 1070 259 296 1068 292 319 1047 293 320 1047 293 320 1046 294 321 1070 259 296 1070 259 296 1046 294 321 1071 261 298 1071 263 298 1046 295 321 1072 264 300 1072 264 300 1046 295 321 1045 296 322 1072 264 300 1045 296 322 1077 298 324 1077 298 324 1045 296 322 1044 297 323 1066 284 312 1067 287 315 1063 285 313 1063 285 313 1067 287 315 1073 288 316 1073 288 316 1075 299 325 1064 289 317 1064 289 317 1075 299 325 1074 300 326 1076 301 327 1075 299 325 1067 287 315 1067 287 315 1075 299 325 1073 288 316 1338 302 328 1339 303 329 1075 299 325 1075 299 325 1339 303 329 1074 300 326 1337 304 330 1338 302 328 1076 301 327 1076 301 327 1338 302 328 1075 299 325 1337 304 330 1076 301 327 1335 286 314 1335 286 314 1076 301 327 1067 287 315 1054 265 301 1072 264 300 1055 269 302 1055 269 302 1072 264 300 1077 298 324 1313 277 306 1058 275 305 1315 306 332 1315 306 332 1058 275 305 1078 305 331 1315 306 332 1078 305 331 1314 308 334 1314 308 334 1078 305 331 1039 307 333 1058 275 305 1057 273 304 1078 305 331 1078 305 331 1057 273 304 1079 309 335 1078 305 331 1079 309 335 1039 307 333 1039 307 333 1079 309 335 1040 310 336 1057 273 304 1056 271 303 1079 309 335 1079 309 335 1056 271 303 1080 311 337 1079 309 335 1080 311 337 1040 310 336 1040 310 336 1080 311 337 1041 312 338 1055 269 302 1077 298 324 1056 271 303 1056 271 303 1077 298 324 1080 311 337 1077 298 324 1044 297 323 1080 311 337 1080 311 337 1044 297 323 1041 312 338 1081 314 340 1082 315 341 1084 313 339 1084 313 339 1082 315 341 1083 316 342 1329 317 343 1328 318 344 1086 320 346 1086 320 346 1328 318 344 1085 319 345 1090 321 347 1087 322 348 1089 324 350 1089 324 350 1087 322 348 1088 323 349 1086 320 346 1085 319 345 1092 326 352 1092 326 352 1085 319 345 1091 325 351 1092 326 352 1091 325 351 1090 321 347 1090 321 347 1091 325 351 1087 322 348 1089 324 350 1088 323 349 1084 313 339 1084 313 339 1088 323 349 1081 314 340 1316 328 354 1093 329 355 1317 327 353 1317 327 353 1093 329 355 1094 330 356 1098 331 357 1095 332 358 1097 334 360 1097 334 360 1095 332 358 1096 333 359 1093 329 355 1099 335 361 1094 330 356 1094 330 356 1099 335 361 1100 336 362 1100 336 362 1099 335 361 1098 331 357 1098 331 357 1099 335 361 1095 332 358 1082 315 341 1081 314 340 1096 333 359 1096 333 359 1081 314 340 1097 334 360 1097 334 360 1081 314 340 1101 337 363 1101 337 363 1081 314 340 1088 323 349 1103 338 364 1330 339 365 1102 341 367 1102 341 367 1330 339 365 1331 340 366 1102 341 367 1331 340 366 1086 343 346 1086 343 346 1331 340 366 1329 342 343 1103 338 364 1102 341 367 1104 344 368 1104 344 368 1102 341 367 1092 345 352 1092 345 352 1102 341 367 1086 343 346 1103 338 364 1104 344 368 1106 346 369 1106 346 369 1104 344 368 1105 347 370 1105 347 370 1104 344 368 1090 321 347 1090 321 347 1104 344 368 1092 345 352 1106 346 369 1105 347 370 1108 348 371 1108 348 371 1105 347 370 1107 349 372 1107 349 372 1105 347 370 1089 324 350 1089 324 350 1105 347 370 1090 321 347 1108 348 371 1107 349 372 1110 350 373 1110 350 373 1107 349 372 1109 351 374 1109 351 374 1107 349 372 1084 313 339 1084 313 339 1107 349 372 1089 324 350 1110 350 373 1109 351 374 1112 352 375 1112 352 375 1109 351 374 1111 353 376 1111 354 376 1109 351 374 1083 316 342 1083 316 342 1109 351 374 1084 313 339 1112 356 375 1111 357 376 1114 355 377 1114 355 377 1111 357 376 1113 358 378 1111 354 376 1083 316 342 1113 359 378 1113 359 378 1083 316 342 1082 315 341 1113 358 378 1082 361 341 1115 360 379 1115 360 379 1082 361 341 1096 362 359 1115 360 379 1096 362 359 1116 363 380 1116 363 380 1096 362 359 1095 364 358 1116 363 380 1095 364 358 1117 365 381 1117 365 381 1095 364 358 1099 366 361 1117 365 381 1099 366 361 1118 367 382 1118 367 382 1099 366 361 1093 329 355 1118 367 382 1093 329 355 1318 368 383 1318 368 383 1093 329 355 1316 328 354 1094 330 356 1119 369 384 1317 327 353 1317 327 353 1119 369 384 1332 370 385 1119 369 384 1085 319 345 1332 370 385 1332 370 385 1085 319 345 1328 318 344 1100 336 362 1120 371 386 1094 330 356 1094 330 356 1120 371 386 1119 369 384 1120 371 386 1091 325 351 1119 369 384 1119 369 384 1091 325 351 1085 319 345 1098 331 357 1121 372 387 1100 336 362 1100 336 362 1121 372 387 1120 371 386 1121 372 387 1087 322 348 1120 371 386 1120 371 386 1087 322 348 1091 325 351 1097 334 360 1101 337 363 1098 331 357 1098 331 357 1101 337 363 1121 372 387 1101 337 363 1088 323 349 1121 372 387 1121 372 387 1088 323 349 1087 322 348 1330 339 365 1103 338 364 1334 373 388 1334 373 388 1103 338 364 1122 374 389 1103 338 364 1106 346 369 1122 374 389 1122 374 389 1106 346 369 1123 375 390 1334 373 388 1122 374 389 1336 376 391 1336 376 391 1122 374 389 1124 377 392 1123 375 390 1127 379 394 1131 378 393 1131 378 393 1127 379 394 1130 380 395 1123 375 390 1106 346 369 1108 348 371 1108 348 371 1134 381 396 1123 375 390 1123 375 390 1134 381 396 1127 382 394 1110 350 373 1137 383 397 1108 348 371 1108 348 371 1137 383 397 1134 381 396 1137 385 397 1110 386 373 1140 384 398 1140 384 398 1110 386 373 1112 387 375 1112 388 375 1114 355 377 1140 390 398 1140 390 398 1114 355 377 1143 389 399 1114 355 377 1144 391 400 1143 389 399 1143 389 399 1144 391 400 1147 392 401 1122 374 389 1123 375 390 1124 377 392 1124 377 392 1123 375 390 1131 378 393 1131 378 393 1130 394 395 1151 393 402 1151 393 402 1130 394 395 1150 395 403 1152 396 404 1124 377 392 1151 393 402 1151 393 402 1124 377 392 1131 378 393 1151 393 402 1150 395 403 1341 397 405 1341 397 405 1150 395 403 1344 398 406 1340 399 407 1152 396 404 1341 397 405 1341 397 405 1152 396 404 1151 393 402 1340 399 407 1336 376 391 1152 396 404 1152 396 404 1336 376 391 1124 377 392 1113 358 378 1115 360 379 1114 355 377 1114 355 377 1115 360 379 1144 391 400 1318 368 383 1319 400 408 1118 367 382 1118 367 382 1319 400 408 1153 401 409 1319 400 408 1322 402 410 1153 401 409 1153 401 409 1322 402 410 1156 403 411 1118 367 382 1153 401 409 1117 365 381 1117 365 381 1153 401 409 1157 404 412 1153 401 409 1156 403 411 1157 404 412 1157 404 412 1156 403 411 1160 405 413 1117 365 381 1157 404 412 1116 363 380 1116 363 380 1157 404 412 1161 406 414 1157 404 412 1160 405 413 1161 406 414 1161 406 414 1160 405 413 1164 407 415 1115 360 379 1116 363 380 1144 391 400 1144 391 400 1116 363 380 1161 406 414 1144 391 400 1161 406 414 1147 392 401 1147 392 401 1161 406 414 1164 407 415 1125 408 416 1069 409 318 1128 411 417 1128 411 417 1069 409 318 1064 410 317 1127 412 394 1126 413 418 1130 415 395 1130 415 395 1126 413 418 1129 414 419 1068 417 319 1069 409 318 1132 416 420 1132 416 420 1069 409 318 1125 408 416 1133 419 421 1126 413 418 1134 418 396 1134 418 396 1126 413 418 1127 412 394 1135 420 422 1047 421 320 1132 416 420 1132 416 420 1047 421 320 1068 422 319 1137 423 397 1136 424 423 1134 418 396 1134 418 396 1136 424 423 1133 419 421 1046 426 321 1047 421 320 1138 425 424 1138 425 424 1047 421 320 1135 420 422 1139 428 425 1136 424 423 1140 427 398 1140 427 398 1136 424 423 1137 423 397 1141 429 426 1045 430 322 1138 432 424 1138 432 424 1045 430 322 1046 431 321 1143 433 399 1142 434 427 1140 436 398 1140 436 398 1142 434 427 1139 435 425 1145 437 428 1044 438 323 1141 429 426 1141 429 426 1044 438 323 1045 430 322 1147 439 401 1146 440 429 1143 433 399 1143 433 399 1146 440 429 1142 434 427 1064 410 317 1074 441 326 1128 411 417 1128 411 417 1074 441 326 1148 442 430 1129 414 419 1149 444 431 1130 443 395 1130 443 395 1149 444 431 1150 445 403 1074 441 326 1339 446 329 1148 442 430 1148 442 430 1339 446 329 1342 447 432 1149 444 431 1343 448 433 1150 445 403 1150 445 403 1343 448 433 1344 449 406 1320 450 434 1314 451 334 1154 453 435 1154 453 435 1314 451 334 1039 452 333 1322 454 410 1321 455 436 1156 457 411 1156 457 411 1321 455 436 1155 456 437 1154 453 435 1039 452 333 1158 459 438 1158 459 438 1039 452 333 1040 458 336 1156 457 411 1155 456 437 1160 461 413 1160 461 413 1155 456 437 1159 460 439 1158 459 438 1040 458 336 1162 463 440 1162 463 440 1040 458 336 1041 462 338 1160 461 413 1159 460 439 1164 465 415 1164 465 415 1159 460 439 1163 464 441 1162 463 440 1041 462 338 1145 437 428 1145 437 428 1041 462 338 1044 438 323 1164 465 415 1163 464 441 1147 439 401 1147 439 401 1163 464 441 1146 440 429 1128 411 417 1148 442 430 1129 414 419 1129 414 419 1148 442 430 1149 444 431 1148 442 430 1342 447 432 1149 444 431 1149 444 431 1342 447 432 1343 448 433 1321 455 436 1320 450 434 1155 456 437 1155 456 437 1320 450 434 1154 453 435 1155 456 437 1154 453 435 1159 460 439 1159 460 439 1154 453 435 1158 459 438 1159 460 439 1158 459 438 1163 464 441 1163 464 441 1158 459 438 1162 463 440 1163 464 441 1162 463 440 1146 440 429 1146 440 429 1162 463 440 1145 437 428 1146 440 429 1145 437 428 1142 434 427 1142 434 427 1145 437 428 1141 429 426 1142 434 427 1141 429 426 1139 435 425 1139 435 425 1141 429 426 1138 466 424 1138 468 424 1135 420 422 1139 467 425 1139 467 425 1135 420 422 1136 424 423 1136 424 423 1135 420 422 1133 419 421 1133 419 421 1135 420 422 1132 416 420 1132 416 420 1125 408 416 1133 419 421 1133 419 421 1125 408 416 1126 413 418 1126 413 418 1125 408 416 1129 414 419 1129 414 419 1125 408 416 1128 411 417 1184 470 443 1174 471 444 1175 469 442 1175 469 442 1174 471 444 1165 472 445 1176 473 446 1166 474 447 1324 224 266 1324 224 266 1166 474 447 1323 225 267 1177 476 449 1167 477 450 1178 475 448 1178 475 448 1167 477 450 1168 478 451 1179 479 452 1169 480 453 1176 473 446 1176 473 446 1169 480 453 1166 474 447 1178 475 448 1168 478 451 1179 479 452 1179 479 452 1168 478 451 1169 481 453 1175 469 442 1165 472 445 1177 476 449 1177 476 449 1165 472 445 1167 477 450 1311 235 276 1171 482 454 1312 236 277 1312 236 277 1171 482 454 1180 483 455 1172 484 456 1170 485 457 1182 487 459 1182 487 459 1170 485 457 1181 486 458 1171 482 454 1173 488 460 1180 483 455 1180 483 455 1173 488 460 1183 489 461 1173 488 460 1172 484 456 1183 489 461 1183 489 461 1172 484 456 1182 487 459 1184 470 443 1175 469 442 1170 485 457 1170 485 457 1175 469 442 1181 486 458 1177 476 449 1205 490 462 1175 469 442 1175 469 442 1205 490 462 1181 486 458 1325 249 290 1194 491 463 1327 246 287 1327 246 287 1194 491 463 1211 492 464 1323 251 267 1166 493 447 1325 249 290 1325 249 290 1166 493 447 1194 491 463 1194 491 463 1195 494 465 1211 492 464 1166 493 447 1169 495 453 1194 491 463 1194 491 463 1169 495 453 1195 494 465 1211 492 464 1195 494 465 1189 497 467 1189 497 467 1195 494 465 1196 496 466 1169 498 453 1168 478 451 1195 494 465 1195 494 465 1168 478 451 1196 496 466 1189 497 467 1196 496 466 1188 500 469 1188 500 469 1196 496 466 1197 499 468 1168 478 451 1167 477 450 1196 496 466 1196 496 466 1167 477 450 1197 499 468 1188 500 469 1197 499 468 1216 502 471 1216 502 471 1197 499 468 1198 501 470 1167 477 450 1165 472 445 1197 499 468 1197 499 468 1165 472 445 1198 501 470 1216 502 471 1198 501 470 1217 504 473 1217 504 473 1198 501 470 1199 503 472 1165 472 445 1174 471 444 1198 501 470 1198 501 470 1174 471 444 1199 503 472 1199 506 472 1200 507 474 1217 505 473 1217 505 473 1200 507 474 1218 508 475 1199 506 472 1174 509 444 1200 507 474 1200 507 474 1174 509 444 1184 510 443 1200 507 474 1184 510 443 1201 512 476 1201 512 476 1184 510 443 1170 511 457 1201 512 476 1170 511 457 1202 514 477 1202 514 477 1170 511 457 1172 513 456 1202 514 477 1172 513 456 1203 516 478 1203 516 478 1172 513 456 1173 515 460 1203 516 478 1173 515 460 1204 518 479 1204 518 479 1173 515 460 1171 517 454 1204 518 479 1171 517 454 1313 277 306 1313 277 306 1171 517 454 1311 278 276 1180 483 455 1206 519 480 1312 236 277 1312 236 277 1206 519 480 1326 279 307 1206 519 480 1176 473 446 1326 279 307 1326 279 307 1176 473 446 1324 224 266 1183 489 461 1207 520 481 1180 483 455 1180 483 455 1207 520 481 1206 519 480 1207 520 481 1179 479 452 1206 519 480 1206 519 480 1179 479 452 1176 473 446 1182 487 459 1208 521 482 1183 489 461 1183 489 461 1208 521 482 1207 520 481 1208 521 482 1178 475 448 1207 520 481 1207 520 481 1178 475 448 1179 479 452 1181 486 458 1205 490 462 1182 487 459 1182 487 459 1205 490 462 1208 521 482 1205 490 462 1177 476 449 1208 521 482 1208 521 482 1177 476 449 1178 475 448 1327 246 287 1211 492 464 1333 283 311 1333 283 311 1211 492 464 1212 522 483 1211 492 464 1189 497 467 1212 522 483 1212 522 483 1189 497 467 1209 523 484 1333 283 311 1212 522 483 1335 286 314 1335 286 314 1212 522 483 1213 524 485 1209 523 484 1215 525 486 1219 527 488 1219 527 488 1215 525 486 1210 526 487 1189 497 467 1188 500 469 1209 523 484 1188 500 469 1214 528 489 1209 523 484 1209 523 484 1214 528 489 1215 525 486 1193 529 490 1214 530 489 1216 502 471 1216 502 471 1214 530 489 1188 500 469 1193 529 490 1216 502 471 1192 531 491 1192 531 491 1216 502 471 1217 504 473 1191 532 492 1192 533 491 1218 508 475 1218 508 475 1192 533 491 1217 505 473 1218 508 475 1223 534 493 1191 532 492 1191 532 492 1223 534 493 1190 535 494 1212 522 483 1209 523 484 1213 524 485 1213 524 485 1209 523 484 1219 527 488 1219 527 488 1210 526 487 1221 537 496 1221 537 496 1210 526 487 1220 536 495 1219 527 488 1221 537 496 1213 524 485 1213 524 485 1221 537 496 1222 538 497 1220 536 495 1339 303 329 1221 537 496 1221 537 496 1339 303 329 1338 302 328 1221 537 496 1338 302 328 1222 538 497 1222 538 497 1338 302 328 1337 304 330 1337 304 330 1335 286 314 1222 538 497 1222 538 497 1335 286 314 1213 524 485 1223 534 493 1218 508 475 1201 512 476 1201 512 476 1218 508 475 1200 507 474 1313 277 306 1315 306 332 1204 518 479 1204 518 479 1315 306 332 1224 539 498 1315 306 332 1314 308 334 1224 539 498 1224 539 498 1314 308 334 1185 540 499 1204 518 479 1224 539 498 1203 516 478 1203 516 478 1224 539 498 1225 541 500 1224 539 498 1185 540 499 1225 541 500 1225 541 500 1185 540 499 1186 542 501 1203 516 478 1225 541 500 1202 514 477 1202 514 477 1225 541 500 1226 543 502 1225 541 500 1186 542 501 1226 543 502 1226 543 502 1186 542 501 1187 544 503 1226 543 502 1223 534 493 1202 514 477 1202 514 477 1223 534 493 1201 512 476 1187 544 503 1190 535 494 1226 543 502 1226 543 502 1190 535 494 1223 534 493 1229 546 505 1228 547 506 1230 545 504 1230 545 504 1228 547 506 1227 548 507 1329 317 343 1232 549 508 1328 318 344 1328 318 344 1232 549 508 1231 550 509 1236 551 510 1235 552 511 1233 554 513 1233 554 513 1235 552 511 1234 553 512 1232 549 508 1238 555 514 1231 550 509 1231 550 509 1238 555 514 1237 556 515 1238 555 514 1236 551 510 1237 556 515 1237 556 515 1236 551 510 1233 554 513 1235 552 511 1230 545 504 1234 553 512 1234 553 512 1230 545 504 1227 548 507 1240 557 516 1239 558 517 1317 327 353 1317 327 353 1239 558 517 1316 328 354 1244 559 518 1243 560 519 1241 562 521 1241 562 521 1243 560 519 1242 561 520 1246 563 522 1245 564 523 1240 557 516 1240 557 516 1245 564 523 1239 558 517 1246 563 522 1244 559 518 1245 564 523 1245 564 523 1244 559 518 1241 562 521 1243 560 519 1227 548 507 1242 561 520 1242 561 520 1227 548 507 1228 547 506 1243 560 519 1247 565 524 1227 548 507 1227 548 507 1247 565 524 1234 553 512 1249 566 525 1248 567 526 1330 339 365 1330 339 365 1248 567 526 1331 340 366 1248 567 526 1232 568 508 1331 340 366 1331 340 366 1232 568 508 1329 342 343 1249 566 525 1250 569 527 1248 567 526 1250 569 527 1238 570 514 1248 567 526 1248 567 526 1238 570 514 1232 568 508 1251 572 529 1250 569 527 1252 571 528 1252 571 528 1250 569 527 1249 566 525 1251 572 529 1236 551 510 1250 569 527 1250 569 527 1236 551 510 1238 570 514 1253 574 531 1251 572 529 1254 573 530 1254 573 530 1251 572 529 1252 571 528 1253 574 531 1235 552 511 1251 572 529 1251 572 529 1235 552 511 1236 551 510 1255 576 533 1253 574 531 1256 575 532 1256 575 532 1253 574 531 1254 573 530 1255 576 533 1230 545 504 1253 574 531 1253 574 531 1230 545 504 1235 552 511 1257 578 535 1255 576 533 1258 577 534 1258 577 534 1255 576 533 1256 575 532 1257 579 535 1229 546 505 1255 576 533 1255 576 533 1229 546 505 1230 545 504 1259 581 537 1257 582 535 1260 580 536 1260 580 536 1257 582 535 1258 583 534 1228 547 506 1229 546 505 1259 584 537 1259 584 537 1229 546 505 1257 579 535 1242 586 520 1228 587 506 1261 585 538 1261 585 538 1228 587 506 1259 581 537 1241 589 521 1242 586 520 1262 588 539 1262 588 539 1242 586 520 1261 585 538 1245 591 523 1241 589 521 1263 590 540 1263 590 540 1241 589 521 1262 588 539 1239 558 517 1245 591 523 1264 592 541 1264 592 541 1245 591 523 1263 590 540 1316 328 354 1239 558 517 1318 368 383 1318 368 383 1239 558 517 1264 592 541 1332 370 385 1265 593 542 1317 327 353 1317 327 353 1265 593 542 1240 557 516 1328 318 344 1231 550 509 1332 370 385 1332 370 385 1231 550 509 1265 593 542 1265 593 542 1266 594 543 1240 557 516 1240 557 516 1266 594 543 1246 563 522 1231 550 509 1237 556 515 1265 593 542 1265 593 542 1237 556 515 1266 594 543 1266 594 543 1267 595 544 1246 563 522 1246 563 522 1267 595 544 1244 559 518 1237 556 515 1233 554 513 1266 594 543 1266 594 543 1233 554 513 1267 595 544 1267 595 544 1247 565 524 1244 559 518 1244 559 518 1247 565 524 1243 560 519 1233 554 513 1234 553 512 1267 595 544 1267 595 544 1234 553 512 1247 565 524 1268 596 545 1249 566 525 1334 373 388 1334 373 388 1249 566 525 1330 339 365 1269 597 546 1252 571 528 1268 596 545 1268 596 545 1252 571 528 1249 566 525 1270 598 547 1268 596 545 1336 376 391 1336 376 391 1268 596 545 1334 373 388 1276 600 549 1273 601 550 1277 599 548 1277 599 548 1273 601 550 1269 597 546 1269 597 546 1254 573 530 1252 571 528 1273 602 550 1280 603 551 1269 597 546 1269 597 546 1280 603 551 1254 573 530 1280 603 551 1283 604 552 1254 573 530 1254 573 530 1283 604 552 1256 575 532 1258 606 534 1256 607 532 1286 605 553 1286 605 553 1256 607 532 1283 608 552 1258 609 534 1286 610 553 1260 580 536 1260 580 536 1286 610 553 1289 611 554 1293 612 555 1290 613 556 1289 611 554 1289 611 554 1290 613 556 1260 580 536 1277 599 548 1269 597 546 1270 598 547 1270 598 547 1269 597 546 1268 596 545 1296 615 558 1276 616 549 1297 614 557 1297 614 557 1276 616 549 1277 599 548 1298 617 559 1297 614 557 1270 598 547 1270 598 547 1297 614 557 1277 599 548 1344 398 406 1296 615 558 1341 397 405 1341 397 405 1296 615 558 1297 614 557 1340 399 407 1341 397 405 1298 617 559 1298 617 559 1341 397 405 1297 614 557 1270 598 547 1336 376 391 1298 617 559 1298 617 559 1336 376 391 1340 399 407 1259 581 537 1260 580 536 1261 585 538 1261 585 538 1260 580 536 1290 613 556 1299 618 560 1319 400 408 1264 592 541 1264 592 541 1319 400 408 1318 368 383 1302 619 561 1322 402 410 1299 618 560 1299 618 560 1322 402 410 1319 400 408 1303 620 562 1299 618 560 1263 590 540 1263 590 540 1299 618 560 1264 592 541 1306 621 563 1302 619 561 1303 620 562 1303 620 562 1302 619 561 1299 618 560 1307 622 564 1303 620 562 1262 588 539 1262 588 539 1303 620 562 1263 590 540 1310 623 565 1306 621 563 1307 622 564 1307 622 564 1306 621 563 1303 620 562 1261 585 538 1290 613 556 1262 588 539 1262 588 539 1290 613 556 1307 622 564 1290 613 556 1293 612 555 1307 622 564 1307 622 564 1293 612 555 1310 623 565 1271 624 566 1274 625 567 1215 627 486 1215 627 486 1274 625 567 1210 626 487 1273 628 550 1276 629 549 1272 631 569 1272 631 569 1276 629 549 1275 630 568 1271 624 566 1215 627 486 1278 632 570 1278 632 570 1215 627 486 1214 633 489 1273 628 550 1272 631 569 1280 634 551 1280 634 551 1272 631 569 1279 635 571 1281 636 572 1278 632 570 1193 638 490 1193 638 490 1278 632 570 1214 637 489 1283 639 552 1280 634 551 1282 640 573 1282 640 573 1280 634 551 1279 635 571 1281 636 572 1193 638 490 1284 641 574 1284 641 574 1193 638 490 1192 642 491 1283 639 552 1282 640 573 1286 643 553 1286 643 553 1282 640 573 1285 644 575 1287 645 576 1284 646 574 1191 648 492 1191 648 492 1284 646 574 1192 647 491 1289 649 554 1286 650 553 1288 652 577 1288 652 577 1286 650 553 1285 651 575 1291 653 578 1287 645 576 1190 654 494 1190 654 494 1287 645 576 1191 648 492 1293 655 555 1289 649 554 1292 656 579 1292 656 579 1289 649 554 1288 652 577 1294 657 580 1220 658 495 1274 625 567 1274 625 567 1220 658 495 1210 626 487 1296 660 558 1295 661 581 1276 659 549 1276 659 549 1295 661 581 1275 630 568 1342 447 432 1339 446 329 1294 657 580 1294 657 580 1339 446 329 1220 658 495 1344 449 406 1343 448 433 1296 660 558 1296 660 558 1343 448 433 1295 661 581 1320 450 434 1300 662 582 1314 451 334 1314 451 334 1300 662 582 1185 663 499 1322 454 410 1302 664 561 1321 455 436 1321 455 436 1302 664 561 1301 665 583 1300 662 582 1304 666 584 1185 663 499 1185 663 499 1304 666 584 1186 667 501 1302 664 561 1306 668 563 1301 665 583 1301 665 583 1306 668 563 1305 669 585 1304 666 584 1308 670 586 1186 667 501 1186 667 501 1308 670 586 1187 671 503 1306 668 563 1310 672 565 1305 669 585 1305 669 585 1310 672 565 1309 673 587 1308 670 586 1291 653 578 1187 671 503 1187 671 503 1291 653 578 1190 654 494 1310 672 565 1293 655 555 1309 673 587 1309 673 587 1293 655 555 1292 656 579 1295 661 581 1294 657 580 1275 630 568 1275 630 568 1294 657 580 1274 625 567 1343 448 433 1342 447 432 1295 661 581 1295 661 581 1342 447 432 1294 657 580 1321 455 436 1301 665 583 1320 450 434 1320 450 434 1301 665 583 1300 662 582 1301 665 583 1305 669 585 1300 662 582 1300 662 582 1305 669 585 1304 666 584 1305 669 585 1309 673 587 1304 666 584 1304 666 584 1309 673 587 1308 670 586 1309 673 587 1292 656 579 1308 670 586 1308 670 586 1292 656 579 1291 653 578 1292 656 579 1288 652 577 1291 653 578 1291 653 578 1288 652 577 1287 645 576 1288 652 577 1285 651 575 1287 645 576 1287 645 576 1285 651 575 1284 674 574 1282 640 573 1281 636 572 1285 675 575 1285 675 575 1281 636 572 1284 676 574 1282 640 573 1279 635 571 1281 636 572 1281 636 572 1279 635 571 1278 632 570 1272 631 569 1271 624 566 1279 635 571 1279 635 571 1271 624 566 1278 632 570 1272 631 569 1275 630 568 1271 624 566 1271 624 566 1275 630 568 1274 625 567 1388 677 588 1453 678 589 1456 680 591 1456 680 591 1453 678 589 1463 679 590 1431 681 592 1459 682 593 1453 678 589 1453 678 589 1459 682 593 1463 679 590 1431 681 592 1432 683 594 1459 682 593 1459 682 593 1432 683 594 1460 684 595 1432 683 594 1433 685 596 1460 684 595 1460 684 595 1433 685 596 1461 686 597 1433 685 596 1434 687 598 1461 686 597 1461 686 597 1434 687 598 1462 688 599 1434 687 598 1454 689 600 1462 688 599 1462 688 599 1454 689 600 1464 690 601 1389 691 603 1457 692 604 1454 689 602 1454 689 602 1457 692 604 1464 690 605 1389 691 603 1390 693 606 1457 692 604 1457 692 604 1390 693 606 1458 694 607 1390 693 606 1387 695 608 1458 694 607 1458 694 607 1387 695 608 1455 696 609 1387 695 608 1388 677 588 1455 696 609 1455 696 609 1388 677 588 1456 680 591 1463 679 590 1459 682 593 1456 680 591 1464 690 612 1457 692 613 1462 688 611 1456 680 591 1459 682 593 1455 696 609 1462 688 611 1457 692 613 1461 686 610 1461 686 610 1457 692 613 1460 684 595 1455 696 609 1459 682 593 1458 694 614 1460 684 595 1457 692 613 1459 682 593 1459 682 593 1457 692 613 1458 694 614 1520 697 615 1588 698 616 1585 700 618 1585 700 618 1588 698 616 1595 699 617 1595 699 617 1591 701 619 1585 700 618 1585 700 618 1591 701 619 1563 702 620 1563 702 620 1591 701 619 1564 704 622 1564 704 622 1591 701 619 1592 703 621 1564 704 622 1592 703 621 1565 706 624 1565 706 624 1592 703 621 1593 705 623 1565 706 624 1593 705 623 1566 708 626 1566 708 626 1593 705 623 1594 707 625 1566 708 626 1594 707 625 1586 710 628 1586 710 628 1594 707 625 1596 709 627 1596 709 630 1589 711 631 1586 710 629 1586 710 629 1589 711 631 1521 712 632 1521 712 632 1589 711 631 1522 714 634 1522 714 634 1589 711 631 1590 713 633 1522 714 634 1590 713 633 1519 716 636 1519 716 636 1590 713 633 1587 715 635 1519 716 636 1587 715 635 1520 697 615 1520 697 615 1587 715 635 1588 698 616 1596 709 639 1594 707 640 1589 711 638 1595 699 617 1588 698 616 1591 701 619 1588 698 616 1587 715 635 1591 701 619 1589 711 638 1594 707 640 1590 713 637 1587 715 635 1590 713 637 1591 701 619 1594 707 640 1593 705 641 1590 713 637 1593 705 641 1592 703 621 1590 713 637 1590 713 637 1592 703 621 1591 701 619 1622 717 642 1617 718 643 1638 720 645 1638 720 645 1617 718 643 1637 719 644 1638 720 645 1637 719 644 1621 211 251 1621 211 251 1637 719 644 1618 218 258 1612 205 243 1609 204 242 1640 722 647 1640 722 647 1609 204 242 1639 721 646 1640 722 647 1639 721 646 1611 724 649 1611 724 649 1639 721 646 1610 723 648 1614 726 651 1641 727 652 1599 725 650 1599 725 650 1641 727 652 1642 728 653 1641 727 652 1613 206 244 1642 728 653 1642 728 653 1613 206 244 1600 209 654 1625 729 655 1624 730 656 1644 732 658 1644 732 658 1624 730 656 1643 731 657 1643 731 657 1623 210 250 1644 732 658 1644 732 658 1623 210 250 1626 213 253 1606 733 659 1607 734 660 1646 736 662 1646 736 662 1607 734 660 1645 735 661 1646 736 662 1645 735 661 1605 202 240 1605 202 240 1645 735 661 1608 203 241 1629 738 664 1647 739 665 1632 737 663 1632 737 663 1647 739 665 1648 740 666 1647 739 665 1630 214 254 1648 740 666 1648 740 666 1630 214 254 1631 215 255 1616 207 245 1649 741 667 1609 204 242 1609 204 242 1649 741 667 1639 721 646 1639 721 646 1649 741 667 1610 723 648 1610 723 648 1649 741 667 1615 742 668 1636 216 256 1630 214 254 1650 743 669 1650 743 669 1630 214 254 1647 739 665 1647 739 665 1629 738 664 1650 743 669 1650 743 669 1629 738 664 1635 744 670 1618 218 258 1637 719 644 1631 215 255 1631 215 255 1637 719 644 1648 740 666 1637 719 644 1617 718 643 1648 740 666 1648 740 666 1617 718 643 1632 737 663 1633 745 671 1620 746 672 1652 748 674 1652 748 674 1620 746 672 1651 747 673 1652 748 674 1651 747 673 1634 217 257 1634 217 257 1651 747 673 1619 219 675 1635 744 670 1633 745 671 1650 743 669 1650 743 669 1633 745 671 1652 748 674 1650 743 669 1652 748 674 1636 216 256 1636 216 256 1652 748 674 1634 217 257 1615 742 668 1649 741 667 1614 726 651 1614 726 651 1649 741 667 1641 727 652 1649 741 667 1616 207 245 1641 727 652 1641 727 652 1616 207 245 1613 206 244 1619 219 259 1651 747 676 1628 212 252 1628 212 252 1651 747 676 1653 749 677 1651 747 678 1620 746 679 1653 749 677 1653 749 677 1620 746 679 1627 750 680 1607 734 660 1599 725 681 1645 735 661 1645 735 661 1599 725 681 1642 728 682 1645 735 661 1642 728 683 1608 203 241 1608 203 241 1642 728 683 1600 209 247 1605 202 240 1604 201 239 1646 736 662 1646 736 662 1604 201 239 1654 751 684 1654 751 684 1603 752 685 1646 736 662 1646 736 662 1603 752 685 1606 733 659 1625 729 655 1644 732 658 1627 750 680 1627 750 680 1644 732 658 1653 749 677 1644 732 658 1626 213 253 1653 749 677 1653 749 677 1626 213 253 1628 212 252 1624 730 656 1622 717 642 1643 731 657 1643 731 657 1622 717 642 1638 720 645 1643 731 657 1638 720 645 1623 210 250 1623 210 250 1638 720 645 1621 211 251 1602 754 687 1655 755 688 1598 753 686 1598 753 686 1655 755 688 1656 756 689 1655 755 688 1601 200 238 1656 756 689 1656 756 689 1601 200 238 1597 208 246 1611 724 649 1598 753 686 1640 722 647 1640 722 647 1598 753 686 1656 756 689 1640 722 647 1656 756 689 1612 205 243 1612 205 243 1656 756 689 1597 208 246 1601 200 238 1655 755 688 1604 201 239 1604 201 239 1655 755 688 1654 751 684 1655 755 688 1602 754 687 1654 751 684 1654 751 684 1602 754 687 1603 752 685 1388 677 588 1387 695 608 1602 754 687 1602 754 687 1387 695 608 1603 752 685 1606 733 659 1390 693 606 1607 734 660 1607 734 660 1390 693 606 1389 691 603 1431 681 592 1611 724 649 1432 683 594 1432 683 594 1611 724 649 1610 723 648 1615 742 668 1614 726 651 1433 685 596 1433 685 596 1614 726 651 1434 687 598 1390 693 606 1606 733 659 1387 695 608 1387 695 608 1606 733 659 1603 752 685 1610 723 648 1615 742 668 1432 683 594 1432 683 594 1615 742 668 1433 685 596 1453 678 589 1388 677 588 1598 753 686 1598 753 686 1388 677 588 1602 754 687 1611 724 649 1431 681 592 1598 753 686 1598 753 686 1431 681 592 1453 678 589 1454 689 690 1599 725 691 1389 691 603 1389 691 603 1599 725 691 1607 734 660 1454 689 600 1434 687 598 1599 725 650 1599 725 650 1434 687 598 1614 726 651 1624 730 656 1519 716 636 1622 717 642 1622 717 642 1519 716 636 1520 697 615 1625 729 655 1627 750 680 1522 714 634 1522 714 634 1627 750 680 1521 712 632 1563 702 620 1564 704 622 1632 737 663 1632 737 663 1564 704 622 1629 738 664 1566 708 626 1633 745 671 1565 706 624 1565 706 624 1633 745 671 1635 744 670 1522 714 634 1519 716 636 1625 729 655 1625 729 655 1519 716 636 1624 730 656 1629 738 664 1564 704 622 1635 744 670 1635 744 670 1564 704 622 1565 706 624 1585 700 618 1617 718 643 1520 697 615 1520 697 615 1617 718 643 1622 717 642 1632 737 663 1617 718 643 1563 702 620 1563 702 620 1617 718 643 1585 700 618 1627 750 680 1620 746 692 1521 712 632 1521 712 632 1620 746 692 1586 710 693 1633 745 671 1566 708 626 1620 746 672 1620 746 672 1566 708 626 1586 710 628 2695 2147 265 2685 2148 264 2686 2146 262 2686 2146 262 2685 2148 264 2676 2149 263 2687 2151 269 2677 2152 268 2981 2150 266 2981 2150 266 2677 2152 268 2980 2153 267 2688 2155 273 2678 2156 272 2689 2154 270 2689 2154 270 2678 2156 272 2679 2157 271 2690 2158 275 2680 2159 274 2687 2151 269 2687 2151 269 2680 2159 274 2677 2152 268 2689 2154 270 2679 2157 271 2690 2158 275 2690 2158 275 2679 2157 271 2680 2160 274 2686 2146 262 2676 2149 263 2688 2155 273 2688 2155 273 2676 2149 263 2678 2156 272 2968 2161 276 2682 2162 279 2969 2164 277 2969 2164 277 2682 2162 279 2691 2163 278 2683 2165 280 2681 2166 283 2693 2168 281 2693 2168 281 2681 2166 283 2692 2167 282 2682 2162 279 2684 2169 285 2691 2163 278 2691 2163 278 2684 2169 285 2694 2170 284 2684 2169 285 2683 2165 280 2694 2170 284 2694 2170 284 2683 2165 280 2693 2168 281 2695 2147 265 2686 2146 262 2681 2166 283 2681 2166 283 2686 2146 262 2692 2167 282 2688 2155 273 2716 2171 286 2686 2146 262 2686 2146 262 2716 2171 286 2692 2167 282 2982 2173 290 2705 2174 289 2984 2172 287 2984 2172 287 2705 2174 289 2722 2175 288 2980 2176 267 2677 2177 268 2982 2173 290 2982 2173 290 2677 2177 268 2705 2174 289 2705 2174 289 2706 2178 291 2722 2175 288 2677 2177 268 2680 2179 274 2705 2174 289 2705 2174 289 2680 2179 274 2706 2178 291 2722 2175 288 2706 2178 291 2700 2181 292 2700 2181 292 2706 2178 291 2707 2180 293 2680 2182 274 2679 2157 271 2706 2178 291 2706 2178 291 2679 2157 271 2707 2180 293 2700 2181 292 2707 2180 293 2699 2184 294 2699 2184 294 2707 2180 293 2708 2183 295 2679 2157 271 2678 2156 272 2707 2180 293 2707 2180 293 2678 2156 272 2708 2183 295 2699 2184 294 2708 2183 295 2727 2186 296 2727 2186 296 2708 2183 295 2709 2185 297 2678 2156 272 2676 2149 263 2708 2183 295 2708 2183 295 2676 2149 263 2709 2185 297 2727 2186 296 2709 2185 297 2728 2188 298 2728 2188 298 2709 2185 297 2710 2187 299 2676 2149 263 2685 2148 264 2709 2185 297 2709 2185 297 2685 2148 264 2710 2187 299 2710 2190 299 2711 2191 301 2728 2189 298 2728 2189 298 2711 2191 301 2729 2192 300 2710 2190 299 2685 2193 264 2711 2191 301 2711 2191 301 2685 2193 264 2695 2194 265 2711 2191 301 2695 2194 265 2712 2196 302 2712 2196 302 2695 2194 265 2681 2195 283 2712 2196 302 2681 2195 283 2713 2198 303 2713 2198 303 2681 2195 283 2683 2197 280 2713 2198 303 2683 2197 280 2714 2200 304 2714 2200 304 2683 2197 280 2684 2199 285 2714 2200 304 2684 2199 285 2715 2202 305 2715 2202 305 2684 2199 285 2682 2201 279 2715 2202 305 2682 2201 279 2970 2204 306 2970 2204 306 2682 2201 279 2968 2203 276 2691 2163 278 2717 2205 308 2969 2164 277 2969 2164 277 2717 2205 308 2983 2206 307 2717 2205 308 2687 2151 269 2983 2206 307 2983 2206 307 2687 2151 269 2981 2150 266 2694 2170 284 2718 2207 309 2691 2163 278 2691 2163 278 2718 2207 309 2717 2205 308 2718 2207 309 2690 2158 275 2717 2205 308 2717 2205 308 2690 2158 275 2687 2151 269 2693 2168 281 2719 2208 310 2694 2170 284 2694 2170 284 2719 2208 310 2718 2207 309 2719 2208 310 2689 2154 270 2718 2207 309 2718 2207 309 2689 2154 270 2690 2158 275 2692 2167 282 2716 2171 286 2693 2168 281 2693 2168 281 2716 2171 286 2719 2208 310 2716 2171 286 2688 2155 273 2719 2208 310 2719 2208 310 2688 2155 273 2689 2154 270 2984 2172 287 2722 2175 288 2990 2210 311 2990 2210 311 2722 2175 288 2723 2209 312 2722 2175 288 2700 2181 292 2723 2209 312 2723 2209 312 2700 2181 292 2720 2211 313 2990 2210 311 2723 2209 312 2992 2213 314 2992 2213 314 2723 2209 312 2724 2212 315 2720 2211 313 2726 2214 318 2730 2216 316 2730 2216 316 2726 2214 318 2721 2215 317 2700 2181 292 2699 2184 294 2720 2211 313 2699 2184 294 2725 2217 319 2720 2211 313 2720 2211 313 2725 2217 319 2726 2214 318 2704 2218 320 2725 2219 319 2727 2186 296 2727 2186 296 2725 2219 319 2699 2184 294 2704 2218 320 2727 2186 296 2703 2220 321 2703 2220 321 2727 2186 296 2728 2188 298 2702 2221 322 2703 2222 321 2729 2192 300 2729 2192 300 2703 2222 321 2728 2189 298 2729 2192 300 2734 2223 324 2702 2221 322 2702 2221 322 2734 2223 324 2701 2224 323 2723 2209 312 2720 2211 313 2724 2212 315 2724 2212 315 2720 2211 313 2730 2216 316 2730 2216 316 2721 2215 317 2732 2226 325 2732 2226 325 2721 2215 317 2731 2225 326 2730 2216 316 2732 2226 325 2724 2212 315 2724 2212 315 2732 2226 325 2733 2227 327 2731 2225 326 2996 2228 329 2732 2226 325 2732 2226 325 2996 2228 329 2995 2229 328 2732 2226 325 2995 2229 328 2733 2227 327 2733 2227 327 2995 2229 328 2994 2230 330 2994 2230 330 2992 2213 314 2733 2227 327 2733 2227 327 2992 2213 314 2724 2212 315 2734 2223 324 2729 2192 300 2712 2196 302 2712 2196 302 2729 2192 300 2711 2191 301 2970 2204 306 2972 2231 332 2715 2202 305 2715 2202 305 2972 2231 332 2735 2232 331 2972 2231 332 2971 2233 334 2735 2232 331 2735 2232 331 2971 2233 334 2696 2234 333 2715 2202 305 2735 2232 331 2714 2200 304 2714 2200 304 2735 2232 331 2736 2235 335 2735 2232 331 2696 2234 333 2736 2235 335 2736 2235 335 2696 2234 333 2697 2236 336 2714 2200 304 2736 2235 335 2713 2198 303 2713 2198 303 2736 2235 335 2737 2237 337 2736 2235 335 2697 2236 336 2737 2237 337 2737 2237 337 2697 2236 336 2698 2238 338 2737 2237 337 2734 2223 324 2713 2198 303 2713 2198 303 2734 2223 324 2712 2196 302 2698 2238 338 2701 2224 323 2737 2237 337 2737 2237 337 2701 2224 323 2734 2223 324 2740 2240 342 2739 2241 341 2741 2239 339 2741 2239 339 2739 2241 341 2738 2242 340 2986 2243 343 2743 2244 346 2985 2246 344 2985 2246 344 2743 2244 346 2742 2245 345 2747 2247 347 2746 2248 350 2744 2250 348 2744 2250 348 2746 2248 350 2745 2249 349 2743 2244 346 2749 2251 352 2742 2245 345 2742 2245 345 2749 2251 352 2748 2252 351 2749 2251 352 2747 2247 347 2748 2252 351 2748 2252 351 2747 2247 347 2744 2250 348 2746 2248 350 2741 2239 339 2745 2249 349 2745 2249 349 2741 2239 339 2738 2242 340 2751 2254 356 2750 2255 355 2974 2253 353 2974 2253 353 2750 2255 355 2973 2256 354 2755 2257 357 2754 2258 360 2752 2260 358 2752 2260 358 2754 2258 360 2753 2259 359 2757 2261 362 2756 2262 361 2751 2254 356 2751 2254 356 2756 2262 361 2750 2255 355 2757 2261 362 2755 2257 357 2756 2262 361 2756 2262 361 2755 2257 357 2752 2260 358 2754 2258 360 2738 2242 340 2753 2259 359 2753 2259 359 2738 2242 340 2739 2241 341 2754 2258 360 2758 2263 363 2738 2242 340 2738 2242 340 2758 2263 363 2745 2249 349 2760 2264 364 2759 2265 367 2987 2267 365 2987 2267 365 2759 2265 367 2988 2266 366 2759 2265 367 2743 2268 346 2988 2266 366 2988 2266 366 2743 2268 346 2986 2269 343 2760 2264 364 2761 2270 368 2759 2265 367 2761 2270 368 2749 2271 352 2759 2265 367 2759 2265 367 2749 2271 352 2743 2268 346 2762 2273 370 2761 2270 368 2763 2272 369 2763 2272 369 2761 2270 368 2760 2264 364 2762 2273 370 2747 2247 347 2761 2270 368 2761 2270 368 2747 2247 347 2749 2271 352 2764 2275 372 2762 2273 370 2765 2274 371 2765 2274 371 2762 2273 370 2763 2272 369 2764 2275 372 2746 2248 350 2762 2273 370 2762 2273 370 2746 2248 350 2747 2247 347 2766 2277 374 2764 2275 372 2767 2276 373 2767 2276 373 2764 2275 372 2765 2274 371 2766 2277 374 2741 2239 339 2764 2275 372 2764 2275 372 2741 2239 339 2746 2248 350 2768 2279 376 2766 2277 374 2769 2278 375 2769 2278 375 2766 2277 374 2767 2276 373 2768 2280 376 2740 2240 342 2766 2277 374 2766 2277 374 2740 2240 342 2741 2239 339 2770 2282 378 2768 2283 376 2771 2281 377 2771 2281 377 2768 2283 376 2769 2284 375 2739 2241 341 2740 2240 342 2770 2285 378 2770 2285 378 2740 2240 342 2768 2280 376 2753 2287 359 2739 2288 341 2772 2286 379 2772 2286 379 2739 2288 341 2770 2282 378 2752 2290 358 2753 2287 359 2773 2289 380 2773 2289 380 2753 2287 359 2772 2286 379 2756 2292 361 2752 2290 358 2774 2291 381 2774 2291 381 2752 2290 358 2773 2289 380 2750 2255 355 2756 2292 361 2775 2293 382 2775 2293 382 2756 2292 361 2774 2291 381 2973 2256 354 2750 2255 355 2975 2294 383 2975 2294 383 2750 2255 355 2775 2293 382 2989 2295 385 2776 2296 384 2974 2253 353 2974 2253 353 2776 2296 384 2751 2254 356 2985 2246 344 2742 2245 345 2989 2295 385 2989 2295 385 2742 2245 345 2776 2296 384 2776 2296 384 2777 2297 386 2751 2254 356 2751 2254 356 2777 2297 386 2757 2261 362 2742 2245 345 2748 2252 351 2776 2296 384 2776 2296 384 2748 2252 351 2777 2297 386 2777 2297 386 2778 2298 387 2757 2261 362 2757 2261 362 2778 2298 387 2755 2257 357 2748 2252 351 2744 2250 348 2777 2297 386 2777 2297 386 2744 2250 348 2778 2298 387 2778 2298 387 2758 2263 363 2755 2257 357 2755 2257 357 2758 2263 363 2754 2258 360 2744 2250 348 2745 2249 349 2778 2298 387 2778 2298 387 2745 2249 349 2758 2263 363 2779 2300 389 2760 2264 364 2991 2299 388 2991 2299 388 2760 2264 364 2987 2267 365 2780 2301 390 2763 2272 369 2779 2300 389 2779 2300 389 2763 2272 369 2760 2264 364 2781 2303 392 2779 2300 389 2993 2302 391 2993 2302 391 2779 2300 389 2991 2299 388 2787 2305 395 2784 2306 394 2788 2304 393 2788 2304 393 2784 2306 394 2780 2301 390 2780 2301 390 2765 2274 371 2763 2272 369 2784 2307 394 2791 2308 396 2780 2301 390 2780 2301 390 2791 2308 396 2765 2274 371 2791 2308 396 2794 2309 397 2765 2274 371 2765 2274 371 2794 2309 397 2767 2276 373 2769 2311 375 2767 2312 373 2797 2310 398 2797 2310 398 2767 2312 373 2794 2313 397 2769 2314 375 2797 2315 398 2771 2281 377 2771 2281 377 2797 2315 398 2800 2316 399 2804 2317 401 2801 2318 400 2800 2316 399 2800 2316 399 2801 2318 400 2771 2281 377 2788 2304 393 2780 2301 390 2781 2303 392 2781 2303 392 2780 2301 390 2779 2300 389 2807 2320 403 2787 2321 395 2808 2319 402 2808 2319 402 2787 2321 395 2788 2304 393 2809 2322 404 2808 2319 402 2781 2303 392 2781 2303 392 2808 2319 402 2788 2304 393 3001 2324 406 2807 2320 403 2998 2323 405 2998 2323 405 2807 2320 403 2808 2319 402 2997 2325 407 2998 2323 405 2809 2322 404 2809 2322 404 2998 2323 405 2808 2319 402 2781 2303 392 2993 2302 391 2809 2322 404 2809 2322 404 2993 2302 391 2997 2325 407 2770 2282 378 2771 2281 377 2772 2286 379 2772 2286 379 2771 2281 377 2801 2318 400 2810 2326 409 2976 2327 408 2775 2293 382 2775 2293 382 2976 2327 408 2975 2294 383 2813 2328 411 2979 2329 410 2810 2326 409 2810 2326 409 2979 2329 410 2976 2327 408 2814 2330 412 2810 2326 409 2774 2291 381 2774 2291 381 2810 2326 409 2775 2293 382 2817 2331 413 2813 2328 411 2814 2330 412 2814 2330 412 2813 2328 411 2810 2326 409 2818 2332 414 2814 2330 412 2773 2289 380 2773 2289 380 2814 2330 412 2774 2291 381 2821 2333 415 2817 2331 413 2818 2332 414 2818 2332 414 2817 2331 413 2814 2330 412 2772 2286 379 2801 2318 400 2773 2289 380 2773 2289 380 2801 2318 400 2818 2332 414 2801 2318 400 2804 2317 401 2818 2332 414 2818 2332 414 2804 2317 401 2821 2333 415 2782 2334 416 2785 2335 417 2726 2337 318 2726 2337 318 2785 2335 417 2721 2336 317 2784 2338 394 2787 2339 395 2783 2341 418 2783 2341 418 2787 2339 395 2786 2340 419 2782 2334 416 2726 2337 318 2789 2342 420 2789 2342 420 2726 2337 318 2725 2343 319 2784 2338 394 2783 2341 418 2791 2344 396 2791 2344 396 2783 2341 418 2790 2345 421 2792 2346 422 2789 2342 420 2704 2348 320 2704 2348 320 2789 2342 420 2725 2347 319 2794 2349 397 2791 2344 396 2793 2350 423 2793 2350 423 2791 2344 396 2790 2345 421 2792 2346 422 2704 2348 320 2795 2351 424 2795 2351 424 2704 2348 320 2703 2352 321 2794 2349 397 2793 2350 423 2797 2353 398 2797 2353 398 2793 2350 423 2796 2354 425 2798 2355 426 2795 2356 424 2702 2358 322 2702 2358 322 2795 2356 424 2703 2357 321 2800 2359 399 2797 2360 398 2799 2362 427 2799 2362 427 2797 2360 398 2796 2361 425 2802 2363 428 2798 2355 426 2701 2364 323 2701 2364 323 2798 2355 426 2702 2358 322 2804 2365 401 2800 2359 399 2803 2366 429 2803 2366 429 2800 2359 399 2799 2362 427 2805 2367 430 2731 2368 326 2785 2335 417 2785 2335 417 2731 2368 326 2721 2336 317 2807 2370 403 2806 2371 431 2787 2369 395 2787 2369 395 2806 2371 431 2786 2340 419 2999 2372 432 2996 2373 329 2805 2367 430 2805 2367 430 2996 2373 329 2731 2368 326 3001 2374 406 3000 2375 433 2807 2370 403 2807 2370 403 3000 2375 433 2806 2371 431 2977 2376 434 2811 2377 435 2971 2379 334 2971 2379 334 2811 2377 435 2696 2378 333 2979 2380 410 2813 2381 411 2978 2383 436 2978 2383 436 2813 2381 411 2812 2382 437 2811 2377 435 2815 2384 438 2696 2378 333 2696 2378 333 2815 2384 438 2697 2385 336 2813 2381 411 2817 2386 413 2812 2382 437 2812 2382 437 2817 2386 413 2816 2387 439 2815 2384 438 2819 2388 440 2697 2385 336 2697 2385 336 2819 2388 440 2698 2389 338 2817 2386 413 2821 2390 415 2816 2387 439 2816 2387 439 2821 2390 415 2820 2391 441 2819 2388 440 2802 2363 428 2698 2389 338 2698 2389 338 2802 2363 428 2701 2364 323 2821 2390 415 2804 2365 401 2820 2391 441 2820 2391 441 2804 2365 401 2803 2366 429 2806 2371 431 2805 2367 430 2786 2340 419 2786 2340 419 2805 2367 430 2785 2335 417 3000 2375 433 2999 2372 432 2806 2371 431 2806 2371 431 2999 2372 432 2805 2367 430 2978 2383 436 2812 2382 437 2977 2376 434 2977 2376 434 2812 2382 437 2811 2377 435 2812 2382 437 2816 2387 439 2811 2377 435 2811 2377 435 2816 2387 439 2815 2384 438 2816 2387 439 2820 2391 441 2815 2384 438 2815 2384 438 2820 2391 441 2819 2388 440 2820 2391 441 2803 2366 429 2819 2388 440 2819 2388 440 2803 2366 429 2802 2363 428 2803 2366 429 2799 2362 427 2802 2363 428 2802 2363 428 2799 2362 427 2798 2355 426 2799 2362 427 2796 2361 425 2798 2355 426 2798 2355 426 2796 2361 425 2795 2392 424 2793 2350 423 2792 2346 422 2796 2393 425 2796 2393 425 2792 2346 422 2795 2394 424 2793 2350 423 2790 2345 421 2792 2346 422 2792 2346 422 2790 2345 421 2789 2342 420 2783 2341 418 2782 2334 416 2790 2345 421 2790 2345 421 2782 2334 416 2789 2342 420 2783 2341 418 2786 2340 419 2782 2334 416 2782 2334 416 2786 2340 419 2785 2335 417 2822 2396 445 2831 2397 444 2832 2395 442 2832 2395 442 2831 2397 444 2841 2398 443 2980 2153 267 2823 2399 447 2981 2150 266 2981 2150 266 2823 2399 447 2833 2400 446 2825 2402 451 2824 2403 450 2835 2401 448 2835 2401 448 2824 2403 450 2834 2404 449 2823 2399 447 2826 2405 453 2833 2400 446 2833 2400 446 2826 2405 453 2836 2406 452 2826 2407 453 2825 2402 451 2836 2406 452 2836 2406 452 2825 2402 451 2835 2401 448 2824 2403 450 2822 2396 445 2834 2404 449 2834 2404 449 2822 2396 445 2832 2395 442 2968 2161 276 2969 2164 277 2828 2409 454 2828 2409 454 2969 2164 277 2837 2408 455 2829 2410 456 2839 2411 459 2827 2413 457 2827 2413 457 2839 2411 459 2838 2412 458 2828 2409 454 2837 2408 455 2830 2415 460 2830 2415 460 2837 2408 455 2840 2414 461 2830 2415 460 2840 2414 461 2829 2410 456 2829 2410 456 2840 2414 461 2839 2411 459 2841 2398 443 2827 2413 457 2832 2395 442 2832 2395 442 2827 2413 457 2838 2412 458 2838 2412 458 2862 2416 462 2832 2395 442 2832 2395 442 2862 2416 462 2834 2404 449 2868 2417 464 2851 2418 463 2984 2172 287 2984 2172 287 2851 2418 463 2982 2173 290 2851 2418 463 2823 2419 447 2982 2173 290 2982 2173 290 2823 2419 447 2980 2176 267 2851 2418 463 2868 2417 464 2852 2420 465 2852 2420 465 2826 2421 453 2851 2418 463 2851 2418 463 2826 2421 453 2823 2419 447 2868 2417 464 2846 2422 467 2852 2420 465 2852 2420 465 2846 2422 467 2853 2423 466 2853 2423 466 2825 2402 451 2852 2420 465 2852 2420 465 2825 2402 451 2826 2424 453 2846 2422 467 2845 2425 469 2853 2423 466 2853 2423 466 2845 2425 469 2854 2426 468 2854 2426 468 2824 2403 450 2853 2423 466 2853 2423 466 2824 2403 450 2825 2402 451 2845 2425 469 2873 2427 471 2854 2426 468 2854 2426 468 2873 2427 471 2855 2428 470 2855 2428 470 2822 2396 445 2854 2426 468 2854 2426 468 2822 2396 445 2824 2403 450 2873 2427 471 2874 2429 473 2855 2428 470 2855 2428 470 2874 2429 473 2856 2430 472 2856 2430 472 2831 2397 444 2855 2428 470 2855 2428 470 2831 2397 444 2822 2396 445 2875 2432 475 2857 2433 474 2874 2431 473 2874 2431 473 2857 2433 474 2856 2434 472 2856 2434 472 2857 2433 474 2831 2436 444 2831 2436 444 2857 2433 474 2841 2435 443 2857 2433 474 2858 2437 476 2841 2435 443 2841 2435 443 2858 2437 476 2827 2438 457 2858 2437 476 2859 2439 477 2827 2438 457 2827 2438 457 2859 2439 477 2829 2440 456 2859 2439 477 2860 2441 478 2829 2440 456 2829 2440 456 2860 2441 478 2830 2442 460 2860 2441 478 2861 2443 479 2830 2442 460 2830 2442 460 2861 2443 479 2828 2444 454 2861 2443 479 2970 2204 306 2828 2444 454 2828 2444 454 2970 2204 306 2968 2203 276 2837 2408 455 2969 2164 277 2863 2445 480 2863 2445 480 2969 2164 277 2983 2206 307 2863 2445 480 2983 2206 307 2833 2400 446 2833 2400 446 2983 2206 307 2981 2150 266 2840 2414 461 2837 2408 455 2864 2446 481 2864 2446 481 2837 2408 455 2863 2445 480 2864 2446 481 2863 2445 480 2836 2406 452 2836 2406 452 2863 2445 480 2833 2400 446 2839 2411 459 2840 2414 461 2865 2447 482 2865 2447 482 2840 2414 461 2864 2446 481 2865 2447 482 2864 2446 481 2835 2401 448 2835 2401 448 2864 2446 481 2836 2406 452 2838 2412 458 2839 2411 459 2862 2416 462 2862 2416 462 2839 2411 459 2865 2447 482 2862 2416 462 2865 2447 482 2834 2404 449 2834 2404 449 2865 2447 482 2835 2401 448 2984 2172 287 2990 2210 311 2868 2417 464 2868 2417 464 2990 2210 311 2869 2448 483 2868 2417 464 2869 2448 483 2846 2422 467 2846 2422 467 2869 2448 483 2866 2449 484 2990 2210 311 2992 2213 314 2869 2448 483 2869 2448 483 2992 2213 314 2870 2450 485 2866 2449 484 2876 2451 488 2872 2453 486 2872 2453 486 2876 2451 488 2867 2452 487 2846 2422 467 2866 2449 484 2845 2425 469 2845 2425 469 2866 2449 484 2871 2454 489 2871 2454 489 2866 2449 484 2872 2453 486 2845 2425 469 2871 2455 489 2873 2427 471 2873 2427 471 2871 2455 489 2850 2456 490 2850 2456 490 2849 2457 491 2873 2427 471 2873 2427 471 2849 2457 491 2874 2429 473 2874 2431 473 2849 2458 491 2875 2432 475 2875 2432 475 2849 2458 491 2848 2459 492 2875 2432 475 2848 2459 492 2880 2461 493 2880 2461 493 2848 2459 492 2847 2460 494 2869 2448 483 2870 2450 485 2866 2449 484 2866 2449 484 2870 2450 485 2876 2451 488 2876 2451 488 2878 2462 496 2867 2452 487 2867 2452 487 2878 2462 496 2877 2463 495 2879 2464 497 2878 2462 496 2870 2450 485 2870 2450 485 2878 2462 496 2876 2451 488 2995 2229 328 2996 2228 329 2878 2462 496 2878 2462 496 2996 2228 329 2877 2463 495 2994 2230 330 2995 2229 328 2879 2464 497 2879 2464 497 2995 2229 328 2878 2462 496 2994 2230 330 2879 2464 497 2992 2213 314 2992 2213 314 2879 2464 497 2870 2450 485 2857 2433 474 2875 2432 475 2858 2437 476 2858 2437 476 2875 2432 475 2880 2461 493 2970 2204 306 2861 2443 479 2972 2231 332 2972 2231 332 2861 2443 479 2881 2465 498 2972 2231 332 2881 2465 498 2971 2233 334 2971 2233 334 2881 2465 498 2842 2466 499 2861 2443 479 2860 2441 478 2881 2465 498 2881 2465 498 2860 2441 478 2882 2467 500 2881 2465 498 2882 2467 500 2842 2466 499 2842 2466 499 2882 2467 500 2843 2468 501 2860 2441 478 2859 2439 477 2882 2467 500 2882 2467 500 2859 2439 477 2883 2469 502 2882 2467 500 2883 2469 502 2843 2468 501 2843 2468 501 2883 2469 502 2844 2470 503 2858 2437 476 2880 2461 493 2859 2439 477 2859 2439 477 2880 2461 493 2883 2469 502 2880 2461 493 2847 2460 494 2883 2469 502 2883 2469 502 2847 2460 494 2844 2470 503 2884 2472 507 2885 2473 506 2887 2471 504 2887 2471 504 2885 2473 506 2886 2474 505 2986 2243 343 2985 2246 344 2889 2476 508 2889 2476 508 2985 2246 344 2888 2475 509 2893 2477 510 2890 2478 513 2892 2480 511 2892 2480 511 2890 2478 513 2891 2479 512 2889 2476 508 2888 2475 509 2895 2482 514 2895 2482 514 2888 2475 509 2894 2481 515 2895 2482 514 2894 2481 515 2893 2477 510 2893 2477 510 2894 2481 515 2890 2478 513 2892 2480 511 2891 2479 512 2887 2471 504 2887 2471 504 2891 2479 512 2884 2472 507 2973 2256 354 2896 2483 517 2974 2253 353 2974 2253 353 2896 2483 517 2897 2484 516 2901 2485 518 2898 2486 521 2900 2488 519 2900 2488 519 2898 2486 521 2899 2487 520 2896 2483 517 2902 2489 523 2897 2484 516 2897 2484 516 2902 2489 523 2903 2490 522 2903 2490 522 2902 2489 523 2901 2485 518 2901 2485 518 2902 2489 523 2898 2486 521 2885 2473 506 2884 2472 507 2899 2487 520 2899 2487 520 2884 2472 507 2900 2488 519 2900 2488 519 2884 2472 507 2904 2491 524 2904 2491 524 2884 2472 507 2891 2479 512 2906 2492 525 2987 2267 365 2905 2493 526 2905 2493 526 2987 2267 365 2988 2266 366 2905 2493 526 2988 2266 366 2889 2494 508 2889 2494 508 2988 2266 366 2986 2269 343 2906 2492 525 2905 2493 526 2907 2495 527 2907 2495 527 2905 2493 526 2895 2496 514 2895 2496 514 2905 2493 526 2889 2494 508 2906 2492 525 2907 2495 527 2909 2497 528 2909 2497 528 2907 2495 527 2908 2498 529 2908 2498 529 2907 2495 527 2893 2477 510 2893 2477 510 2907 2495 527 2895 2496 514 2909 2497 528 2908 2498 529 2911 2499 530 2911 2499 530 2908 2498 529 2910 2500 531 2910 2500 531 2908 2498 529 2892 2480 511 2892 2480 511 2908 2498 529 2893 2477 510 2911 2499 530 2910 2500 531 2913 2501 532 2913 2501 532 2910 2500 531 2912 2502 533 2912 2502 533 2910 2500 531 2887 2471 504 2887 2471 504 2910 2500 531 2892 2480 511 2913 2501 532 2912 2502 533 2915 2503 534 2915 2503 534 2912 2502 533 2914 2504 535 2914 2505 535 2912 2502 533 2886 2474 505 2886 2474 505 2912 2502 533 2887 2471 504 2915 2507 534 2914 2508 535 2917 2506 536 2917 2506 536 2914 2508 535 2916 2509 537 2914 2505 535 2886 2474 505 2916 2510 537 2916 2510 537 2886 2474 505 2885 2473 506 2916 2509 537 2885 2512 506 2918 2511 538 2918 2511 538 2885 2512 506 2899 2513 520 2918 2511 538 2899 2513 520 2919 2514 539 2919 2514 539 2899 2513 520 2898 2515 521 2919 2514 539 2898 2515 521 2920 2516 540 2920 2516 540 2898 2515 521 2902 2517 523 2920 2516 540 2902 2517 523 2921 2518 541 2921 2518 541 2902 2517 523 2896 2483 517 2921 2518 541 2896 2483 517 2975 2294 383 2975 2294 383 2896 2483 517 2973 2256 354 2897 2484 516 2922 2519 542 2974 2253 353 2974 2253 353 2922 2519 542 2989 2295 385 2922 2519 542 2888 2475 509 2989 2295 385 2989 2295 385 2888 2475 509 2985 2246 344 2903 2490 522 2923 2520 543 2897 2484 516 2897 2484 516 2923 2520 543 2922 2519 542 2923 2520 543 2894 2481 515 2922 2519 542 2922 2519 542 2894 2481 515 2888 2475 509 2901 2485 518 2924 2521 544 2903 2490 522 2903 2490 522 2924 2521 544 2923 2520 543 2924 2521 544 2890 2478 513 2923 2520 543 2923 2520 543 2890 2478 513 2894 2481 515 2900 2488 519 2904 2491 524 2901 2485 518 2901 2485 518 2904 2491 524 2924 2521 544 2904 2491 524 2891 2479 512 2924 2521 544 2924 2521 544 2891 2479 512 2890 2478 513 2987 2267 365 2906 2492 525 2991 2299 388 2991 2299 388 2906 2492 525 2925 2522 545 2906 2492 525 2909 2497 528 2925 2522 545 2925 2522 545 2909 2497 528 2926 2523 546 2991 2299 388 2925 2522 545 2993 2302 391 2993 2302 391 2925 2522 545 2927 2524 547 2926 2523 546 2930 2526 550 2934 2525 548 2934 2525 548 2930 2526 550 2933 2527 549 2926 2523 546 2909 2497 528 2911 2499 530 2911 2499 530 2937 2528 551 2926 2523 546 2926 2523 546 2937 2528 551 2930 2529 550 2913 2501 532 2940 2530 552 2911 2499 530 2911 2499 530 2940 2530 552 2937 2528 551 2940 2532 552 2913 2533 532 2943 2531 553 2943 2531 553 2913 2533 532 2915 2534 534 2915 2535 534 2917 2506 536 2943 2537 553 2943 2537 553 2917 2506 536 2946 2536 554 2917 2506 536 2947 2538 556 2946 2536 554 2946 2536 554 2947 2538 556 2950 2539 555 2925 2522 545 2926 2523 546 2927 2524 547 2927 2524 547 2926 2523 546 2934 2525 548 2934 2525 548 2933 2541 549 2954 2540 557 2954 2540 557 2933 2541 549 2953 2542 558 2955 2543 559 2927 2524 547 2954 2540 557 2954 2540 557 2927 2524 547 2934 2525 548 2954 2540 557 2953 2542 558 2998 2323 405 2998 2323 405 2953 2542 558 3001 2324 406 2997 2325 407 2955 2543 559 2998 2323 405 2998 2323 405 2955 2543 559 2954 2540 557 2997 2325 407 2993 2302 391 2955 2543 559 2955 2543 559 2993 2302 391 2927 2524 547 2916 2509 537 2918 2511 538 2917 2506 536 2917 2506 536 2918 2511 538 2947 2538 556 2975 2294 383 2976 2327 408 2921 2518 541 2921 2518 541 2976 2327 408 2956 2544 560 2976 2327 408 2979 2329 410 2956 2544 560 2956 2544 560 2979 2329 410 2959 2545 561 2921 2518 541 2956 2544 560 2920 2516 540 2920 2516 540 2956 2544 560 2960 2546 562 2956 2544 560 2959 2545 561 2960 2546 562 2960 2546 562 2959 2545 561 2963 2547 563 2920 2516 540 2960 2546 562 2919 2514 539 2919 2514 539 2960 2546 562 2964 2548 564 2960 2546 562 2963 2547 563 2964 2548 564 2964 2548 564 2963 2547 563 2967 2549 565 2918 2511 538 2919 2514 539 2947 2538 556 2947 2538 556 2919 2514 539 2964 2548 564 2947 2538 556 2964 2548 564 2950 2539 555 2950 2539 555 2964 2548 564 2967 2549 565 2928 2550 566 2872 2551 486 2931 2553 567 2931 2553 567 2872 2551 486 2867 2552 487 2930 2554 550 2929 2555 569 2933 2557 549 2933 2557 549 2929 2555 569 2932 2556 568 2871 2559 489 2872 2551 486 2935 2558 570 2935 2558 570 2872 2551 486 2928 2550 566 2936 2561 571 2929 2555 569 2937 2560 551 2937 2560 551 2929 2555 569 2930 2554 550 2938 2562 572 2850 2563 490 2935 2558 570 2935 2558 570 2850 2563 490 2871 2564 489 2940 2565 552 2939 2566 573 2937 2560 551 2937 2560 551 2939 2566 573 2936 2561 571 2849 2568 491 2850 2563 490 2941 2567 574 2941 2567 574 2850 2563 490 2938 2562 572 2942 2570 575 2939 2566 573 2943 2569 553 2943 2569 553 2939 2566 573 2940 2565 552 2944 2571 576 2848 2572 492 2941 2574 574 2941 2574 574 2848 2572 492 2849 2573 491 2946 2575 554 2945 2576 577 2943 2578 553 2943 2578 553 2945 2576 577 2942 2577 575 2948 2579 578 2847 2580 494 2944 2571 576 2944 2571 576 2847 2580 494 2848 2572 492 2950 2581 555 2949 2582 579 2946 2575 554 2946 2575 554 2949 2582 579 2945 2576 577 2867 2552 487 2877 2583 495 2931 2553 567 2931 2553 567 2877 2583 495 2951 2584 580 2932 2556 568 2952 2586 581 2933 2585 549 2933 2585 549 2952 2586 581 2953 2587 558 2877 2583 495 2996 2373 329 2951 2584 580 2951 2584 580 2996 2373 329 2999 2372 432 2952 2586 581 3000 2375 433 2953 2587 558 2953 2587 558 3000 2375 433 3001 2374 406 2977 2376 434 2971 2379 334 2957 2589 582 2957 2589 582 2971 2379 334 2842 2588 499 2979 2380 410 2978 2383 436 2959 2591 561 2959 2591 561 2978 2383 436 2958 2590 583 2957 2589 582 2842 2588 499 2961 2593 584 2961 2593 584 2842 2588 499 2843 2592 501 2959 2591 561 2958 2590 583 2963 2595 563 2963 2595 563 2958 2590 583 2962 2594 585 2961 2593 584 2843 2592 501 2965 2597 586 2965 2597 586 2843 2592 501 2844 2596 503 2963 2595 563 2962 2594 585 2967 2599 565 2967 2599 565 2962 2594 585 2966 2598 587 2965 2597 586 2844 2596 503 2948 2579 578 2948 2579 578 2844 2596 503 2847 2580 494 2967 2599 565 2966 2598 587 2950 2581 555 2950 2581 555 2966 2598 587 2949 2582 579 2931 2553 567 2951 2584 580 2932 2556 568 2932 2556 568 2951 2584 580 2952 2586 581 2951 2584 580 2999 2372 432 2952 2586 581 2952 2586 581 2999 2372 432 3000 2375 433 2978 2383 436 2977 2376 434 2958 2590 583 2958 2590 583 2977 2376 434 2957 2589 582 2958 2590 583 2957 2589 582 2962 2594 585 2962 2594 585 2957 2589 582 2961 2593 584 2962 2594 585 2961 2593 584 2966 2598 587 2966 2598 587 2961 2593 584 2965 2597 586 2966 2598 587 2965 2597 586 2949 2582 579 2949 2582 579 2965 2597 586 2948 2579 578 2949 2582 579 2948 2579 578 2945 2576 577 2945 2576 577 2948 2579 578 2944 2571 576 2945 2576 577 2944 2571 576 2942 2577 575 2942 2577 575 2944 2571 576 2941 2600 574 2941 2602 574 2938 2562 572 2942 2601 575 2942 2601 575 2938 2562 572 2939 2566 573 2939 2566 573 2938 2562 572 2936 2561 571 2936 2561 571 2938 2562 572 2935 2558 570 2935 2558 570 2928 2550 566 2936 2561 571 2936 2561 571 2928 2550 566 2929 2555 569 2929 2555 569 2928 2550 566 2932 2556 568 2932 2556 568 2928 2550 566 2931 2553 567</p>
+ </triangles>
+ <triangles material="HeadphonesSG2" count="1400">
+ <input semantic="VERTEX" source="#Headphones-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Headphones-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Headphones-headphonesUV" offset="2" set="1"/>
+ <p>0 758 695 14 759 696 1 757 694 1 757 694 14 759 696 15 760 697 0 758 695 1 757 694 17 761 698 17 761 698 1 757 694 16 762 699 12 763 700 2 764 701 15 760 697 15 760 697 2 764 701 1 757 694 2 764 701 13 765 702 1 757 694 1 757 694 13 765 702 16 762 699 17 761 698 192 766 703 0 758 695 0 758 695 192 766 703 188 767 704 189 768 705 3 769 706 188 767 704 188 767 704 3 769 706 0 758 695 0 758 695 3 769 706 14 759 696 14 759 696 3 769 706 18 770 707 19 771 708 11 772 709 20 774 711 20 774 711 11 772 709 6 773 710 20 774 711 6 773 710 21 776 713 21 776 713 6 773 710 5 775 712 21 776 713 5 775 712 22 778 715 22 778 715 5 775 712 9 777 714 16 779 699 23 780 716 17 782 698 17 782 698 23 780 716 24 781 717 17 782 698 24 781 717 192 784 703 192 784 703 24 781 717 193 783 718 13 785 702 25 786 719 16 779 699 16 779 699 25 786 719 23 780 716 26 787 720 27 788 721 25 786 719 25 786 719 27 788 721 23 780 716 27 788 721 28 789 722 23 780 716 23 780 716 28 789 722 24 781 717 194 790 723 193 783 718 28 789 722 28 789 722 193 783 718 24 781 717 29 791 724 30 792 725 26 794 720 26 794 720 30 792 725 27 793 721 30 795 725 31 796 726 27 798 721 27 798 721 31 796 726 28 797 722 31 799 726 195 800 727 28 802 722 28 802 722 195 800 727 194 801 723 30 803 725 29 804 724 46 806 729 46 806 729 29 804 724 47 805 728 31 807 726 30 808 725 49 809 730 49 809 730 30 808 725 46 806 729 195 810 727 31 811 726 197 813 731 197 813 731 31 811 726 49 812 730 43 814 732 42 815 733 47 805 728 47 805 728 42 815 733 46 806 729 42 815 733 45 816 734 46 806 729 46 806 729 45 816 734 49 809 730 49 809 730 45 816 734 197 818 731 197 818 731 45 816 734 196 817 735 42 815 733 43 814 732 50 819 736 50 819 736 43 814 732 51 820 737 53 821 738 45 816 734 50 819 736 50 819 736 45 816 734 42 815 733 198 822 739 196 817 735 53 821 738 53 821 738 196 817 735 45 816 734 50 819 736 51 820 737 54 824 741 54 824 741 51 820 737 55 823 740 54 824 741 55 823 740 4 826 743 4 826 743 55 823 740 8 825 742 50 819 736 54 824 741 53 821 738 53 821 738 54 824 741 57 827 744 54 824 741 4 826 743 57 827 744 57 827 744 4 826 743 7 828 745 53 821 738 57 827 744 198 822 739 198 822 739 57 827 744 199 829 746 57 827 744 7 828 745 199 829 746 199 829 746 7 828 745 190 830 747 7 828 745 4 826 743 58 832 749 58 832 749 4 826 743 59 831 748 58 832 749 59 831 748 6 773 710 6 773 710 59 831 748 5 775 712 4 826 743 8 825 742 59 831 748 59 831 748 8 825 742 60 833 750 59 831 748 60 833 750 5 775 712 5 775 712 60 833 750 9 777 714 58 832 749 6 773 710 62 834 751 62 834 751 6 773 710 11 772 709 11 772 709 10 835 752 62 834 751 62 834 751 10 835 752 63 836 753 63 836 753 7 828 745 62 834 751 62 834 751 7 828 745 58 832 749 191 837 754 200 838 755 10 835 752 10 835 752 200 838 755 63 836 753 200 838 755 190 830 747 63 836 753 63 836 753 190 830 747 7 828 745 73 840 757 72 841 758 70 839 756 70 839 756 72 841 758 71 842 759 78 843 760 64 844 761 40 846 763 40 846 763 64 844 761 41 845 762 65 847 764 35 848 765 64 844 761 64 844 761 35 848 765 41 849 762 33 851 767 35 848 765 66 850 766 66 850 766 35 848 765 65 847 764 67 852 768 32 853 769 66 850 766 66 850 766 32 853 769 33 854 767 67 852 768 68 855 770 32 853 769 32 853 769 68 855 770 34 856 771 69 857 772 36 858 773 68 855 770 68 855 770 36 858 773 34 859 771 70 839 756 39 860 774 69 857 772 69 857 772 39 860 774 36 858 773 38 861 775 39 862 774 71 842 759 71 842 759 39 862 774 70 839 756 72 841 758 48 863 776 71 842 759 71 842 759 48 863 776 38 864 775 73 840 757 44 865 777 72 841 758 72 841 758 44 865 777 48 863 776 74 866 778 52 867 779 73 840 757 73 840 757 52 867 779 44 868 777 74 866 778 75 869 780 52 867 779 52 867 779 75 869 780 56 870 781 76 871 782 37 872 783 75 869 780 75 869 780 37 872 783 56 870 781 77 873 784 61 874 785 76 871 782 76 871 782 61 874 785 37 872 783 77 873 784 78 843 760 61 874 785 61 874 785 78 843 760 40 875 763 78 843 760 77 873 784 64 844 761 64 844 761 77 873 784 65 847 764 73 840 757 70 839 756 74 866 778 74 866 778 70 839 756 69 857 772 76 871 782 75 869 780 67 852 768 67 852 768 75 869 780 68 855 770 75 869 780 74 866 778 68 855 770 68 855 770 74 866 778 69 857 772 66 850 766 77 873 784 67 852 768 67 852 768 77 873 784 76 871 782 66 850 766 65 847 764 77 873 784 32 853 769 80 876 786 33 854 767 33 854 767 80 876 786 79 877 787 80 876 786 2 764 701 79 877 787 79 877 787 2 764 701 12 763 700 34 856 771 81 878 788 32 853 769 32 853 769 81 878 788 80 876 786 81 878 788 13 765 702 80 876 786 80 876 786 13 765 702 2 764 701 33 879 767 79 880 787 35 882 765 35 882 765 79 880 787 82 881 789 34 883 771 36 884 773 81 886 788 81 886 788 36 884 773 83 885 790 25 786 719 13 785 702 83 885 790 83 885 790 13 785 702 81 886 788 38 887 775 85 888 791 39 890 774 39 890 774 85 888 791 84 889 792 85 888 791 29 791 724 84 889 792 84 889 792 29 791 724 26 794 720 40 891 763 41 892 762 86 894 794 86 894 794 41 892 762 87 893 793 22 778 715 9 777 714 87 893 793 87 893 793 9 777 714 86 894 794 39 895 774 84 896 792 36 884 773 36 884 773 84 896 792 83 885 790 84 896 792 26 787 720 83 885 790 83 885 790 26 787 720 25 786 719 41 897 762 35 882 765 87 898 793 87 898 793 35 882 765 82 881 789 48 900 776 88 901 795 38 899 775 38 899 775 88 901 795 85 902 791 47 805 728 29 804 724 88 901 795 88 901 795 29 804 724 85 902 791 43 814 732 47 805 728 89 903 796 89 903 796 47 805 728 88 901 795 88 901 795 48 900 776 89 903 796 89 903 796 48 900 776 44 904 777 90 905 797 89 903 796 52 867 779 52 867 779 89 903 796 44 906 777 90 905 797 51 820 737 89 903 796 89 903 796 51 820 737 43 814 732 52 867 779 56 870 781 90 905 797 90 905 797 56 870 781 91 907 798 55 823 740 51 820 737 91 907 798 91 907 798 51 820 737 90 905 797 56 870 781 37 872 783 91 907 798 91 907 798 37 872 783 92 908 799 8 825 742 55 823 740 92 908 799 92 908 799 55 823 740 91 907 798 37 872 783 61 874 785 92 908 799 92 908 799 61 874 785 93 909 800 60 833 750 8 825 742 93 909 800 93 909 800 8 825 742 92 908 799 40 910 763 86 894 794 61 874 785 61 874 785 86 894 794 93 909 800 86 894 794 9 777 714 93 909 800 93 909 800 9 777 714 60 833 750 109 912 802 108 913 803 95 911 801 95 911 801 108 913 803 94 914 804 110 916 806 95 911 801 111 915 805 111 915 805 95 911 801 94 914 804 95 911 801 96 917 807 109 912 802 109 912 802 96 917 807 106 918 808 110 916 806 107 919 809 95 911 801 95 911 801 107 919 809 96 917 807 188 767 704 192 766 703 94 914 804 94 914 804 192 766 703 111 915 805 94 914 804 97 920 810 188 767 704 188 767 704 97 920 810 189 768 705 94 914 804 108 913 803 97 920 810 97 920 810 108 913 803 112 921 811 113 922 812 114 923 813 105 925 815 105 925 815 114 923 813 100 924 814 114 923 813 115 926 816 100 924 814 100 924 814 115 926 816 99 927 817 115 926 816 116 928 818 99 927 817 99 927 817 116 928 818 103 929 819 110 930 806 111 931 805 117 933 821 117 933 821 111 931 805 118 932 820 111 931 805 192 784 703 118 932 820 118 932 820 192 784 703 193 783 718 107 934 809 110 930 806 119 935 822 119 935 822 110 930 806 117 933 821 120 936 823 119 935 822 121 937 824 121 937 824 119 935 822 117 933 821 121 937 824 117 933 821 122 938 825 122 938 825 117 933 821 118 932 820 118 932 820 193 783 718 122 938 825 122 938 825 193 783 718 194 790 723 123 939 826 120 940 823 124 942 827 124 942 827 120 940 823 121 941 824 124 943 827 121 944 824 125 946 828 125 946 828 121 944 824 122 945 825 125 947 828 122 948 825 195 800 727 195 800 727 122 948 825 194 801 723 124 949 827 140 950 829 123 952 826 123 952 826 140 950 829 141 951 830 125 953 828 143 954 831 124 955 827 124 955 827 143 954 831 140 950 829 195 956 727 197 957 731 125 959 828 125 959 828 197 957 731 143 958 831 140 950 829 136 960 832 141 951 830 141 951 830 136 960 832 137 961 833 143 954 831 139 962 834 140 950 829 140 950 829 139 962 834 136 960 832 143 954 831 197 963 731 139 962 834 139 962 834 197 963 731 196 817 735 145 965 836 137 961 833 144 964 835 144 964 835 137 961 833 136 960 832 147 966 837 144 964 835 139 962 834 139 962 834 144 964 835 136 960 832 198 822 739 147 966 837 196 817 735 196 817 735 147 966 837 139 962 834 144 964 835 148 967 838 145 965 836 145 965 836 148 967 838 149 968 839 148 967 838 98 969 840 149 968 839 149 968 839 98 969 840 102 970 841 151 971 842 148 967 838 147 966 837 147 966 837 148 967 838 144 964 835 101 972 843 98 969 840 151 971 842 151 971 842 98 969 840 148 967 838 199 829 746 151 971 842 198 822 739 198 822 739 151 971 842 147 966 837 190 830 747 101 972 843 199 829 746 199 829 746 101 972 843 151 971 842 101 972 843 152 973 844 98 969 840 98 969 840 152 973 844 153 974 845 152 973 844 100 924 814 153 974 845 153 974 845 100 924 814 99 927 817 98 969 840 153 974 845 102 970 841 102 970 841 153 974 845 154 975 846 153 974 845 99 927 817 154 975 846 154 975 846 99 927 817 103 929 819 152 973 844 156 976 847 100 924 814 100 924 814 156 976 847 105 925 815 105 925 815 156 976 847 104 978 849 104 978 849 156 976 847 157 977 848 152 973 844 101 972 843 156 976 847 156 976 847 101 972 843 157 977 848 157 977 848 200 838 755 104 978 849 104 978 849 200 838 755 191 837 754 101 972 843 190 830 747 157 977 848 157 977 848 190 830 747 200 838 755 165 980 851 166 981 852 164 979 850 164 979 850 166 981 852 167 982 853 172 983 854 134 984 855 158 986 857 158 986 857 134 984 855 135 985 856 159 987 858 158 986 857 129 989 859 129 989 859 158 986 857 135 988 856 159 987 858 129 989 859 160 990 860 160 990 860 129 989 859 127 991 861 161 992 862 160 990 860 126 994 863 126 994 863 160 990 860 127 993 861 161 992 862 126 994 863 162 996 865 162 996 865 126 994 863 128 995 864 128 997 864 130 998 866 162 996 865 162 996 865 130 998 866 163 999 867 130 998 866 133 1000 868 163 999 867 163 999 867 133 1000 868 164 979 850 164 979 850 133 1001 868 165 980 851 165 980 851 133 1001 868 132 1002 869 132 1003 869 142 1004 870 165 980 851 165 980 851 142 1004 870 166 981 852 142 1004 870 138 1005 871 166 981 852 166 981 852 138 1005 871 167 982 853 168 1006 872 167 982 853 146 1008 873 146 1008 873 167 982 853 138 1007 871 168 1006 872 146 1008 873 169 1010 875 169 1010 875 146 1008 873 150 1009 874 170 1011 876 169 1010 875 131 1012 877 131 1012 877 169 1010 875 150 1009 874 131 1012 877 155 1013 878 170 1011 876 170 1011 876 155 1013 878 171 1014 879 171 1014 879 155 1013 878 172 983 854 172 983 854 155 1013 878 134 1015 855 159 987 858 171 1014 879 158 986 857 158 986 857 171 1014 879 172 983 854 163 999 867 164 979 850 168 1006 872 168 1006 872 164 979 850 167 982 853 162 996 865 169 1010 875 161 992 862 161 992 862 169 1010 875 170 1011 876 163 999 867 168 1006 872 162 996 865 162 996 865 168 1006 872 169 1010 875 170 1011 876 171 1014 879 161 992 862 161 992 862 171 1014 879 160 990 860 160 990 860 171 1014 879 159 987 858 126 994 863 127 993 861 174 1017 881 174 1017 881 127 993 861 173 1016 880 106 918 808 96 917 807 173 1016 880 173 1016 880 96 917 807 174 1017 881 128 995 864 126 994 863 175 1018 882 175 1018 882 126 994 863 174 1017 881 96 917 807 107 919 809 174 1017 881 174 1017 881 107 919 809 175 1018 882 127 1019 861 129 1020 859 173 1022 880 173 1022 880 129 1020 859 176 1021 883 128 1023 864 175 1024 882 130 1026 866 130 1026 866 175 1024 882 177 1025 884 175 1024 882 107 934 809 177 1025 884 177 1025 884 107 934 809 119 935 822 132 1027 869 133 1028 868 179 1030 886 179 1030 886 133 1028 868 178 1029 885 120 940 823 123 939 826 178 1029 885 178 1029 885 123 939 826 179 1030 886 134 1031 855 180 1032 887 135 1034 856 135 1034 856 180 1032 887 181 1033 888 180 1032 887 103 929 819 181 1033 888 181 1033 888 103 929 819 116 928 818 177 1025 884 178 1035 885 130 1026 866 130 1026 866 178 1035 885 133 1036 868 178 1035 885 177 1025 884 120 936 823 120 936 823 177 1025 884 119 935 822 135 1037 856 181 1038 888 129 1020 859 129 1020 859 181 1038 888 176 1021 883 179 1040 886 182 1041 889 132 1039 869 132 1039 869 182 1041 889 142 1042 870 179 1040 886 123 952 826 182 1041 889 182 1041 889 123 952 826 141 951 830 137 961 833 183 1043 890 141 951 830 141 951 830 183 1043 890 182 1041 889 182 1041 889 183 1043 890 142 1042 870 142 1042 870 183 1043 890 138 1044 871 138 1045 871 183 1043 890 146 1008 873 146 1008 873 183 1043 890 184 1046 891 137 961 833 145 965 836 183 1043 890 183 1043 890 145 965 836 184 1046 891 185 1047 892 150 1009 874 184 1046 891 184 1046 891 150 1009 874 146 1008 873 149 968 839 185 1047 892 145 965 836 145 965 836 185 1047 892 184 1046 891 186 1048 893 131 1012 877 185 1047 892 185 1047 892 131 1012 877 150 1009 874 102 970 841 186 1048 893 149 968 839 149 968 839 186 1048 893 185 1047 892 187 1049 894 155 1013 878 186 1048 893 186 1048 893 155 1013 878 131 1012 877 154 975 846 187 1049 894 102 970 841 102 970 841 187 1049 894 186 1048 893 134 1050 855 155 1013 878 180 1032 887 180 1032 887 155 1013 878 187 1049 894 154 975 846 103 929 819 187 1049 894 187 1049 894 103 929 819 180 1032 887 181 1038 888 116 1051 818 176 1021 883 106 1052 808 173 1022 880 116 1051 818 116 1051 818 173 1022 880 176 1021 883 109 1054 802 106 1052 808 115 1053 816 115 1053 816 106 1052 808 116 1051 818 108 1056 803 109 1054 802 114 1055 813 114 1055 813 109 1054 802 115 1053 816 114 1055 813 113 1057 812 108 1056 803 108 1056 803 113 1057 812 112 1058 811 87 898 793 82 881 789 22 1060 715 12 1059 700 22 1060 715 79 880 787 82 881 789 79 880 787 22 1060 715 22 1060 715 12 1059 700 21 1061 713 21 1061 713 12 1059 700 15 1062 697 21 1061 713 15 1062 697 20 1063 711 20 1063 711 15 1062 697 14 1064 696 20 1063 711 14 1064 696 19 1066 708 19 1066 708 14 1064 696 18 1065 707 1465 1067 895 1466 1068 896 189 768 705 189 768 705 1466 1068 896 3 769 706 3 769 706 1466 1068 896 18 770 707 18 770 707 1466 1068 896 1467 1069 897 1467 1070 897 1468 1071 898 18 1065 707 18 1065 707 1468 1071 898 19 1066 708 1468 1072 898 1469 1073 899 19 771 708 19 771 708 1469 1073 899 11 772 709 11 772 709 1469 1073 899 10 835 752 10 835 752 1469 1073 899 1470 1074 900 10 835 752 1470 1074 900 191 837 754 191 837 754 1470 1074 900 1471 1075 901 1471 1075 901 1472 1076 902 191 837 754 191 837 754 1472 1076 902 104 978 849 1472 1076 902 1473 1077 903 104 978 849 104 978 849 1473 1077 903 105 925 815 105 925 815 1473 1077 903 113 922 812 113 922 812 1473 1077 903 1474 1078 904 113 1057 812 1474 1079 904 112 1058 811 112 1058 811 1474 1079 904 1475 1080 905 112 921 811 1475 1081 905 97 920 810 97 920 810 1475 1081 905 1476 1082 906 97 920 810 1476 1082 906 189 768 705 189 768 705 1476 1082 906 1465 1067 895 233 1084 908 232 1085 909 204 1083 907 204 1083 907 232 1085 909 203 1086 910 235 1088 912 234 1089 913 207 1087 911 207 1087 911 234 1089 913 206 1090 914 236 1092 916 235 1088 912 208 1091 915 208 1091 915 235 1088 912 207 1087 911 237 1094 918 238 1095 919 211 1093 917 211 1093 917 238 1095 919 214 1096 920 218 1097 921 240 1098 922 217 1100 924 217 1100 924 240 1098 922 239 1099 923 238 1095 919 236 1092 916 214 1096 920 214 1096 920 236 1092 916 208 1091 915 234 1089 913 233 1084 908 206 1090 914 206 1090 914 233 1084 908 204 1083 907 217 1100 924 239 1099 923 211 1093 917 211 1093 917 239 1099 923 237 1094 918 203 1086 910 232 1085 909 220 1101 925 220 1101 925 232 1085 909 241 1102 926 223 1104 928 243 1105 929 222 1103 927 222 1103 927 243 1105 929 242 1106 930 224 1107 931 244 1108 932 223 1104 928 223 1104 928 244 1108 932 243 1105 929 227 1110 934 246 1111 935 226 1109 933 226 1109 933 246 1111 935 245 1112 936 218 1097 921 230 1113 937 240 1098 922 240 1098 922 230 1113 937 247 1114 938 222 1103 927 242 1106 930 227 1110 934 227 1110 934 242 1106 930 246 1111 935 220 1101 925 241 1102 926 224 1107 931 224 1107 931 241 1102 926 244 1108 932 230 1113 937 226 1109 933 247 1114 938 247 1114 938 226 1109 933 245 1112 936 201 1115 939 204 1116 907 202 1118 940 202 1118 940 204 1116 907 203 1117 910 308 1119 941 311 1120 942 309 1122 944 309 1122 944 311 1120 942 310 1121 943 208 1124 915 207 1125 911 205 1123 945 205 1123 945 207 1125 911 206 1126 914 254 1128 947 253 1129 948 251 1127 946 251 1127 946 253 1129 948 252 1130 949 201 1115 939 202 1118 940 209 1131 950 209 1131 950 202 1118 940 210 1132 951 312 1133 952 313 1134 953 308 1119 941 308 1119 941 313 1134 953 311 1120 942 214 1136 920 213 1137 954 211 1135 917 211 1135 917 213 1137 954 212 1138 955 259 1140 957 258 1141 958 256 1139 956 256 1139 956 258 1141 958 257 1142 959 218 1144 921 217 1145 924 215 1143 960 215 1143 960 217 1145 924 216 1146 961 317 1148 963 316 1149 964 314 1147 962 314 1147 962 316 1149 964 315 1150 965 213 1137 954 214 1136 920 205 1123 945 205 1123 945 214 1136 920 208 1124 915 258 1141 958 251 1127 946 257 1142 959 257 1142 959 251 1127 946 252 1130 949 204 1116 907 201 1115 939 206 1126 914 206 1126 914 201 1115 939 205 1123 945 251 1127 946 248 1151 966 254 1128 947 254 1128 947 248 1151 966 249 1152 967 213 1137 954 209 1131 950 212 1138 955 212 1138 955 209 1131 950 216 1146 961 258 1141 958 259 1140 957 255 1154 969 255 1154 969 259 1140 957 262 1153 968 209 1131 950 210 1132 951 216 1146 961 216 1146 961 210 1132 951 215 1143 960 314 1147 962 313 1134 953 317 1148 963 317 1148 963 313 1134 953 312 1133 952 205 1123 945 201 1115 939 213 1137 954 213 1137 954 201 1115 939 209 1131 950 251 1127 946 258 1141 958 248 1151 966 248 1151 966 258 1141 958 255 1154 969 212 1138 955 216 1146 961 211 1135 917 211 1135 917 216 1146 961 217 1145 924 259 1140 957 256 1139 956 262 1153 968 262 1153 968 256 1139 956 261 1155 970 219 1156 971 202 1118 940 220 1157 925 220 1157 925 202 1118 940 203 1117 910 318 1158 972 319 1159 973 311 1120 942 311 1120 942 319 1159 973 310 1121 943 224 1161 931 223 1162 928 221 1160 974 221 1160 974 223 1162 928 222 1163 927 268 1165 976 267 1166 977 265 1164 975 265 1164 975 267 1166 977 266 1167 978 210 1132 951 202 1118 940 225 1168 979 225 1168 979 202 1118 940 219 1156 971 320 1169 980 318 1158 972 313 1134 953 313 1134 953 318 1158 972 311 1120 942 229 1171 981 228 1172 982 226 1170 933 226 1170 933 228 1172 982 227 1173 934 273 1175 984 272 1176 985 270 1174 983 270 1174 983 272 1176 985 271 1177 986 231 1178 987 230 1179 937 215 1143 960 215 1143 960 230 1179 937 218 1144 921 315 1150 965 322 1180 988 314 1147 962 314 1147 962 322 1180 988 321 1181 989 228 1172 982 221 1160 974 227 1173 934 227 1173 934 221 1160 974 222 1163 927 272 1176 985 273 1175 984 265 1164 975 265 1164 975 273 1175 984 268 1165 976 221 1160 974 219 1156 971 224 1161 931 224 1161 931 219 1156 971 220 1157 925 264 1182 990 263 1183 991 266 1167 978 266 1167 978 263 1183 991 265 1164 975 228 1172 982 229 1171 981 225 1168 979 225 1168 979 229 1171 981 231 1178 987 272 1176 985 269 1184 992 271 1177 986 271 1177 986 269 1184 992 274 1185 993 215 1143 960 210 1132 951 231 1178 987 231 1178 987 210 1132 951 225 1168 979 320 1169 980 313 1134 953 321 1181 989 321 1181 989 313 1134 953 314 1147 962 221 1160 974 228 1172 982 219 1156 971 219 1156 971 228 1172 982 225 1168 979 265 1164 975 263 1183 991 272 1176 985 272 1176 985 263 1183 991 269 1184 992 229 1171 981 226 1170 933 231 1178 987 231 1178 987 226 1170 933 230 1179 937 271 1177 986 274 1185 993 270 1174 983 270 1174 983 274 1185 993 275 1186 994 277 1188 996 234 1089 913 276 1187 995 276 1187 995 234 1089 913 235 1088 912 278 1189 997 233 1084 908 277 1188 996 277 1188 996 233 1084 908 234 1089 913 279 1190 998 232 1085 909 278 1189 997 278 1189 997 232 1085 909 233 1084 908 279 1190 998 280 1191 999 232 1085 909 232 1085 909 280 1191 999 241 1102 926 280 1191 999 281 1192 1000 241 1102 926 241 1102 926 281 1192 1000 244 1108 932 281 1192 1000 282 1193 1001 244 1108 932 244 1108 932 282 1193 1001 243 1105 929 283 1194 1002 242 1106 930 282 1193 1001 282 1193 1001 242 1106 930 243 1105 929 284 1195 1003 246 1111 935 283 1194 1002 283 1194 1002 246 1111 935 242 1106 930 285 1196 1004 245 1112 936 284 1195 1003 284 1195 1003 245 1112 936 246 1111 935 286 1197 1005 247 1114 938 285 1196 1004 285 1196 1004 247 1114 938 245 1112 936 287 1198 1006 240 1098 922 286 1197 1005 286 1197 1005 240 1098 922 247 1114 938 287 1198 1006 288 1199 1007 240 1098 922 240 1098 922 288 1199 1007 239 1099 923 288 1199 1007 289 1200 1008 239 1099 923 239 1099 923 289 1200 1008 237 1094 918 289 1200 1008 290 1201 1009 237 1094 918 237 1094 918 290 1201 1009 238 1095 919 290 1201 1009 291 1202 1010 238 1095 919 238 1095 919 291 1202 1010 236 1092 916 291 1202 1010 276 1187 995 236 1092 916 236 1092 916 276 1187 995 235 1088 912 250 1203 1011 293 1204 1012 249 1152 967 249 1152 967 293 1204 1012 292 1205 1013 293 1204 1012 279 1190 998 292 1205 1013 292 1205 1013 279 1190 998 278 1189 997 250 1203 1011 264 1206 990 293 1204 1012 293 1204 1012 264 1206 990 294 1207 1014 293 1204 1012 294 1207 1014 279 1190 998 279 1190 998 294 1207 1014 280 1191 999 264 1206 990 266 1167 978 294 1207 1014 294 1207 1014 266 1167 978 295 1208 1015 294 1207 1014 295 1208 1015 280 1191 999 280 1191 999 295 1208 1015 281 1192 1000 266 1167 978 267 1166 977 295 1208 1015 295 1208 1015 267 1166 977 296 1209 1016 295 1208 1015 296 1209 1016 281 1192 1000 281 1192 1000 296 1209 1016 282 1193 1001 268 1165 976 297 1210 1017 267 1166 977 267 1166 977 297 1210 1017 296 1209 1016 297 1210 1017 283 1194 1002 296 1209 1016 296 1209 1016 283 1194 1002 282 1193 1001 273 1175 984 298 1211 1018 268 1165 976 268 1165 976 298 1211 1018 297 1210 1017 298 1211 1018 284 1195 1003 297 1210 1017 297 1210 1017 284 1195 1003 283 1194 1002 270 1174 983 299 1212 1019 273 1175 984 273 1175 984 299 1212 1019 298 1211 1018 299 1212 1019 285 1196 1004 298 1211 1018 298 1211 1018 285 1196 1004 284 1195 1003 275 1213 994 300 1214 1020 270 1174 983 270 1174 983 300 1214 1020 299 1212 1019 300 1214 1020 286 1197 1005 299 1212 1019 299 1212 1019 286 1197 1005 285 1196 1004 260 1215 1021 301 1216 1022 275 1213 994 275 1213 994 301 1216 1022 300 1214 1020 301 1216 1022 287 1198 1006 300 1214 1020 300 1214 1020 287 1198 1006 286 1197 1005 260 1215 1021 261 1217 970 301 1216 1022 301 1216 1022 261 1217 970 302 1218 1023 301 1216 1022 302 1218 1023 287 1198 1006 287 1198 1006 302 1218 1023 288 1199 1007 261 1219 970 256 1139 956 302 1218 1023 302 1218 1023 256 1139 956 303 1220 1024 302 1218 1023 303 1220 1024 288 1199 1007 288 1199 1007 303 1220 1024 289 1200 1008 256 1139 956 257 1142 959 303 1220 1024 303 1220 1024 257 1142 959 304 1221 1025 303 1220 1024 304 1221 1025 289 1200 1008 289 1200 1008 304 1221 1025 290 1201 1009 257 1142 959 252 1130 949 304 1221 1025 304 1221 1025 252 1130 949 305 1222 1026 304 1221 1025 305 1222 1026 290 1201 1009 290 1201 1009 305 1222 1026 291 1202 1010 252 1130 949 253 1129 948 305 1222 1026 305 1222 1026 253 1129 948 306 1223 1027 305 1222 1026 306 1223 1027 291 1202 1010 291 1202 1010 306 1223 1027 276 1187 995 254 1128 947 307 1224 1028 253 1129 948 253 1129 948 307 1224 1028 306 1223 1027 307 1224 1028 277 1188 996 306 1223 1027 306 1223 1027 277 1188 996 276 1187 995 249 1152 967 292 1205 1013 254 1128 947 254 1128 947 292 1205 1013 307 1224 1028 292 1205 1013 278 1189 997 307 1224 1028 307 1224 1028 278 1189 997 277 1188 996 309 1225 944 310 1226 943 323 1228 1030 323 1228 1030 310 1226 943 324 1227 1029 323 1228 1030 324 1227 1029 325 1230 1032 325 1230 1032 324 1227 1029 326 1229 1031 326 1229 1031 250 1203 1011 325 1231 1032 325 1231 1032 250 1203 1011 249 1152 967 319 1232 973 327 1233 1033 310 1226 943 310 1226 943 327 1233 1033 324 1227 1029 327 1233 1033 328 1234 1034 324 1227 1029 324 1227 1029 328 1234 1034 326 1229 1031 326 1229 1031 328 1234 1034 250 1203 1011 250 1203 1011 328 1234 1034 264 1235 990 318 1237 972 329 1238 1035 319 1236 973 319 1236 973 329 1238 1035 327 1239 1033 329 1238 1035 330 1240 1036 327 1239 1033 327 1239 1033 330 1240 1036 328 1241 1034 330 1240 1036 263 1183 991 328 1241 1034 328 1241 1034 263 1183 991 264 1182 990 320 1242 980 331 1243 1037 318 1237 972 318 1237 972 331 1243 1037 329 1238 1035 331 1243 1037 332 1244 1038 329 1238 1035 329 1238 1035 332 1244 1038 330 1240 1036 332 1244 1038 269 1184 992 330 1240 1036 330 1240 1036 269 1184 992 263 1183 991 321 1245 989 333 1246 1039 320 1242 980 320 1242 980 333 1246 1039 331 1243 1037 333 1246 1039 334 1247 1040 331 1243 1037 331 1243 1037 334 1247 1040 332 1244 1038 334 1247 1040 274 1185 993 332 1244 1038 332 1244 1038 274 1185 993 269 1184 992 322 1248 988 335 1249 1041 321 1245 989 321 1245 989 335 1249 1041 333 1246 1039 335 1249 1041 336 1250 1042 333 1246 1039 333 1246 1039 336 1250 1042 334 1247 1040 336 1251 1042 275 1186 994 334 1247 1040 334 1247 1040 275 1186 994 274 1185 993 315 1252 965 337 1253 1043 322 1248 988 322 1248 988 337 1253 1043 335 1249 1041 337 1253 1043 338 1254 1044 335 1249 1041 335 1249 1041 338 1254 1044 336 1255 1042 338 1254 1044 260 1256 1021 336 1255 1042 336 1255 1042 260 1256 1021 275 1257 994 315 1252 965 316 1258 964 337 1253 1043 337 1253 1043 316 1258 964 339 1259 1045 337 1253 1043 339 1259 1045 338 1254 1044 338 1254 1044 339 1259 1045 340 1260 1046 338 1254 1044 340 1260 1046 260 1256 1021 260 1256 1021 340 1260 1046 261 1261 970 316 1258 964 317 1262 963 339 1259 1045 339 1259 1045 317 1262 963 341 1263 1047 339 1259 1045 341 1263 1047 340 1265 1046 340 1265 1046 341 1263 1047 342 1264 1048 340 1266 1046 342 1264 1048 261 1267 970 261 1267 970 342 1264 1048 262 1153 968 317 1262 963 312 1268 952 341 1263 1047 341 1263 1047 312 1268 952 343 1269 1049 341 1263 1047 343 1269 1049 342 1264 1048 342 1264 1048 343 1269 1049 344 1270 1050 342 1264 1048 344 1270 1050 262 1153 968 262 1153 968 344 1270 1050 255 1154 969 312 1268 952 308 1271 941 343 1269 1049 343 1269 1049 308 1271 941 345 1272 1051 343 1269 1049 345 1272 1051 344 1270 1050 344 1270 1050 345 1272 1051 346 1273 1052 344 1270 1050 346 1273 1052 255 1154 969 255 1154 969 346 1273 1052 248 1151 966 308 1271 941 309 1274 944 345 1272 1051 345 1272 1051 309 1274 944 323 1275 1030 345 1272 1051 323 1275 1030 346 1273 1052 346 1273 1052 323 1275 1030 325 1276 1032 346 1273 1052 325 1277 1032 248 1151 966 248 1151 966 325 1277 1032 249 1152 967 1672 2604 697 1671 2605 696 1658 2603 694 1658 2603 694 1671 2605 696 1657 2606 695 1673 2608 699 1658 2603 694 1674 2607 698 1674 2607 698 1658 2603 694 1657 2606 695 1658 2603 694 1659 2609 701 1672 2604 697 1672 2604 697 1659 2609 701 1669 2610 700 1673 2608 699 1670 2611 702 1658 2603 694 1658 2603 694 1670 2611 702 1659 2609 701 1845 2612 704 1849 2613 703 1657 2606 695 1657 2606 695 1849 2613 703 1674 2607 698 1657 2606 695 1660 2614 706 1845 2612 704 1845 2612 704 1660 2614 706 1846 2615 705 1657 2606 695 1671 2605 696 1660 2614 706 1660 2614 706 1671 2605 696 1675 2616 707 1676 2617 708 1677 2618 711 1668 2620 709 1668 2620 709 1677 2618 711 1663 2619 710 1677 2618 711 1678 2621 713 1663 2619 710 1663 2619 710 1678 2621 713 1662 2622 712 1678 2621 713 1679 2623 715 1662 2622 712 1662 2622 712 1679 2623 715 1666 2624 714 1673 2625 699 1674 2626 698 1680 2628 716 1680 2628 716 1674 2626 698 1681 2627 717 1674 2626 698 1849 2629 703 1681 2627 717 1681 2627 717 1849 2629 703 1850 2630 718 1670 2631 702 1673 2625 699 1682 2632 719 1682 2632 719 1673 2625 699 1680 2628 716 1683 2633 720 1682 2632 719 1684 2634 721 1684 2634 721 1682 2632 719 1680 2628 716 1684 2634 721 1680 2628 716 1685 2635 722 1685 2635 722 1680 2628 716 1681 2627 717 1681 2627 717 1850 2630 718 1685 2635 722 1685 2635 722 1850 2630 718 1851 2636 723 1686 2637 724 1683 2638 720 1687 2640 725 1687 2640 725 1683 2638 720 1684 2639 721 1687 2641 725 1684 2642 721 1688 2644 726 1688 2644 726 1684 2642 721 1685 2643 722 1688 2645 726 1685 2646 722 1852 2648 727 1852 2648 727 1685 2646 722 1851 2647 723 1687 2649 725 1703 2650 729 1686 2652 724 1686 2652 724 1703 2650 729 1704 2651 728 1688 2653 726 1706 2654 730 1687 2655 725 1687 2655 725 1706 2654 730 1703 2650 729 1852 2656 727 1854 2657 731 1688 2659 726 1688 2659 726 1854 2657 731 1706 2658 730 1703 2650 729 1699 2660 733 1704 2651 728 1704 2651 728 1699 2660 733 1700 2661 732 1706 2654 730 1702 2662 734 1703 2650 729 1703 2650 729 1702 2662 734 1699 2660 733 1706 2654 730 1854 2663 731 1702 2662 734 1702 2662 734 1854 2663 731 1853 2664 735 1708 2666 737 1700 2661 732 1707 2665 736 1707 2665 736 1700 2661 732 1699 2660 733 1710 2667 738 1707 2665 736 1702 2662 734 1702 2662 734 1707 2665 736 1699 2660 733 1855 2668 739 1710 2667 738 1853 2664 735 1853 2664 735 1710 2667 738 1702 2662 734 1707 2665 736 1711 2669 741 1708 2666 737 1708 2666 737 1711 2669 741 1712 2670 740 1711 2669 741 1661 2671 743 1712 2670 740 1712 2670 740 1661 2671 743 1665 2672 742 1714 2673 744 1711 2669 741 1710 2667 738 1710 2667 738 1711 2669 741 1707 2665 736 1664 2674 745 1661 2671 743 1714 2673 744 1714 2673 744 1661 2671 743 1711 2669 741 1856 2675 746 1714 2673 744 1855 2668 739 1855 2668 739 1714 2673 744 1710 2667 738 1847 2676 747 1664 2674 745 1856 2675 746 1856 2675 746 1664 2674 745 1714 2673 744 1664 2674 745 1715 2677 749 1661 2671 743 1661 2671 743 1715 2677 749 1716 2678 748 1715 2677 749 1663 2619 710 1716 2678 748 1716 2678 748 1663 2619 710 1662 2622 712 1661 2671 743 1716 2678 748 1665 2672 742 1665 2672 742 1716 2678 748 1717 2679 750 1716 2678 748 1662 2622 712 1717 2679 750 1717 2679 750 1662 2622 712 1666 2624 714 1715 2677 749 1719 2680 751 1663 2619 710 1663 2619 710 1719 2680 751 1668 2620 709 1668 2620 709 1719 2680 751 1667 2682 752 1667 2682 752 1719 2680 751 1720 2681 753 1715 2677 749 1664 2674 745 1719 2680 751 1719 2680 751 1664 2674 745 1720 2681 753 1720 2681 753 1857 2683 755 1667 2682 752 1667 2682 752 1857 2683 755 1848 2684 754 1664 2674 745 1847 2676 747 1720 2681 753 1720 2681 753 1847 2676 747 1857 2683 755 1728 2686 759 1729 2687 758 1727 2685 756 1727 2685 756 1729 2687 758 1730 2688 757 1735 2689 760 1697 2690 763 1721 2692 761 1721 2692 761 1697 2690 763 1698 2691 762 1722 2693 764 1721 2692 761 1692 2695 765 1692 2695 765 1721 2692 761 1698 2694 762 1722 2693 764 1692 2695 765 1723 2696 766 1723 2696 766 1692 2695 765 1690 2697 767 1724 2698 768 1723 2696 766 1689 2700 769 1689 2700 769 1723 2696 766 1690 2699 767 1724 2698 768 1689 2700 769 1725 2702 770 1725 2702 770 1689 2700 769 1691 2701 771 1691 2703 771 1693 2704 773 1725 2702 770 1725 2702 770 1693 2704 773 1726 2705 772 1693 2704 773 1696 2706 774 1726 2705 772 1726 2705 772 1696 2706 774 1727 2685 756 1727 2685 756 1696 2707 774 1728 2686 759 1728 2686 759 1696 2707 774 1695 2708 775 1695 2709 775 1705 2710 776 1728 2686 759 1728 2686 759 1705 2710 776 1729 2687 758 1705 2710 776 1701 2711 777 1729 2687 758 1729 2687 758 1701 2711 777 1730 2688 757 1731 2712 778 1730 2688 757 1709 2714 779 1709 2714 779 1730 2688 757 1701 2713 777 1731 2712 778 1709 2714 779 1732 2716 780 1732 2716 780 1709 2714 779 1713 2715 781 1733 2717 782 1732 2716 780 1694 2718 783 1694 2718 783 1732 2716 780 1713 2715 781 1694 2718 783 1718 2719 785 1733 2717 782 1733 2717 782 1718 2719 785 1734 2720 784 1734 2720 784 1718 2719 785 1735 2689 760 1735 2689 760 1718 2719 785 1697 2721 763 1722 2693 764 1734 2720 784 1721 2692 761 1721 2692 761 1734 2720 784 1735 2689 760 1726 2705 772 1727 2685 756 1731 2712 778 1731 2712 778 1727 2685 756 1730 2688 757 1725 2702 770 1732 2716 780 1724 2698 768 1724 2698 768 1732 2716 780 1733 2717 782 1726 2705 772 1731 2712 778 1725 2702 770 1725 2702 770 1731 2712 778 1732 2716 780 1733 2717 782 1734 2720 784 1724 2698 768 1724 2698 768 1734 2720 784 1723 2696 766 1723 2696 766 1734 2720 784 1722 2693 764 1689 2700 769 1690 2699 767 1737 2723 786 1737 2723 786 1690 2699 767 1736 2722 787 1669 2610 700 1659 2609 701 1736 2722 787 1736 2722 787 1659 2609 701 1737 2723 786 1691 2701 771 1689 2700 769 1738 2724 788 1738 2724 788 1689 2700 769 1737 2723 786 1659 2609 701 1670 2611 702 1737 2723 786 1737 2723 786 1670 2611 702 1738 2724 788 1690 2725 767 1692 2726 765 1736 2728 787 1736 2728 787 1692 2726 765 1739 2727 789 1691 2729 771 1738 2730 788 1693 2732 773 1693 2732 773 1738 2730 788 1740 2731 790 1738 2730 788 1670 2631 702 1740 2731 790 1740 2731 790 1670 2631 702 1682 2632 719 1695 2733 775 1696 2734 774 1742 2736 791 1742 2736 791 1696 2734 774 1741 2735 792 1683 2638 720 1686 2637 724 1741 2735 792 1741 2735 792 1686 2637 724 1742 2736 791 1697 2737 763 1743 2738 794 1698 2740 762 1698 2740 762 1743 2738 794 1744 2739 793 1743 2738 794 1666 2624 714 1744 2739 793 1744 2739 793 1666 2624 714 1679 2623 715 1740 2731 790 1741 2741 792 1693 2732 773 1693 2732 773 1741 2741 792 1696 2742 774 1741 2741 792 1740 2731 790 1683 2633 720 1683 2633 720 1740 2731 790 1682 2632 719 1698 2743 762 1744 2744 793 1692 2726 765 1692 2726 765 1744 2744 793 1739 2727 789 1742 2746 791 1745 2747 795 1695 2745 775 1695 2745 775 1745 2747 795 1705 2748 776 1742 2746 791 1686 2652 724 1745 2747 795 1745 2747 795 1686 2652 724 1704 2651 728 1700 2661 732 1746 2749 796 1704 2651 728 1704 2651 728 1746 2749 796 1745 2747 795 1745 2747 795 1746 2749 796 1705 2748 776 1705 2748 776 1746 2749 796 1701 2750 777 1701 2751 777 1746 2749 796 1709 2714 779 1709 2714 779 1746 2749 796 1747 2752 797 1700 2661 732 1708 2666 737 1746 2749 796 1746 2749 796 1708 2666 737 1747 2752 797 1748 2753 798 1713 2715 781 1747 2752 797 1747 2752 797 1713 2715 781 1709 2714 779 1712 2670 740 1748 2753 798 1708 2666 737 1708 2666 737 1748 2753 798 1747 2752 797 1749 2754 799 1694 2718 783 1748 2753 798 1748 2753 798 1694 2718 783 1713 2715 781 1665 2672 742 1749 2754 799 1712 2670 740 1712 2670 740 1749 2754 799 1748 2753 798 1750 2755 800 1718 2719 785 1749 2754 799 1749 2754 799 1718 2719 785 1694 2718 783 1717 2679 750 1750 2755 800 1665 2672 742 1665 2672 742 1750 2755 800 1749 2754 799 1697 2756 763 1718 2719 785 1743 2738 794 1743 2738 794 1718 2719 785 1750 2755 800 1717 2679 750 1666 2624 714 1750 2755 800 1750 2755 800 1666 2624 714 1743 2738 794 1751 2758 804 1765 2759 803 1752 2757 801 1752 2757 801 1765 2759 803 1766 2760 802 1751 2758 804 1752 2757 801 1768 2761 805 1768 2761 805 1752 2757 801 1767 2762 806 1763 2763 808 1753 2764 807 1766 2760 802 1766 2760 802 1753 2764 807 1752 2757 801 1753 2764 807 1764 2765 809 1752 2757 801 1752 2757 801 1764 2765 809 1767 2762 806 1768 2761 805 1849 2613 703 1751 2758 804 1751 2758 804 1849 2613 703 1845 2612 704 1846 2615 705 1754 2766 810 1845 2612 704 1845 2612 704 1754 2766 810 1751 2758 804 1751 2758 804 1754 2766 810 1765 2759 803 1765 2759 803 1754 2766 810 1769 2767 811 1770 2768 812 1762 2769 815 1771 2771 813 1771 2771 813 1762 2769 815 1757 2770 814 1771 2771 813 1757 2770 814 1772 2773 816 1772 2773 816 1757 2770 814 1756 2772 817 1772 2773 816 1756 2772 817 1773 2775 818 1773 2775 818 1756 2772 817 1760 2774 819 1767 2776 806 1774 2777 821 1768 2779 805 1768 2779 805 1774 2777 821 1775 2778 820 1768 2779 805 1775 2778 820 1849 2629 703 1849 2629 703 1775 2778 820 1850 2630 718 1764 2780 809 1776 2781 822 1767 2776 806 1767 2776 806 1776 2781 822 1774 2777 821 1777 2782 823 1778 2783 824 1776 2781 822 1776 2781 822 1778 2783 824 1774 2777 821 1778 2783 824 1779 2784 825 1774 2777 821 1774 2777 821 1779 2784 825 1775 2778 820 1851 2636 723 1850 2630 718 1779 2784 825 1779 2784 825 1850 2630 718 1775 2778 820 1780 2785 826 1781 2786 827 1777 2788 823 1777 2788 823 1781 2786 827 1778 2787 824 1781 2789 827 1782 2790 828 1778 2792 824 1778 2792 824 1782 2790 828 1779 2791 825 1782 2793 828 1852 2648 727 1779 2794 825 1779 2794 825 1852 2648 727 1851 2647 723 1781 2795 827 1780 2796 826 1797 2798 829 1797 2798 829 1780 2796 826 1798 2797 830 1782 2799 828 1781 2800 827 1800 2801 831 1800 2801 831 1781 2800 827 1797 2798 829 1852 2802 727 1782 2803 828 1854 2805 731 1854 2805 731 1782 2803 828 1800 2804 831 1794 2806 833 1793 2807 832 1798 2797 830 1798 2797 830 1793 2807 832 1797 2798 829 1793 2807 832 1796 2808 834 1797 2798 829 1797 2798 829 1796 2808 834 1800 2801 831 1800 2801 831 1796 2808 834 1854 2809 731 1854 2809 731 1796 2808 834 1853 2664 735 1793 2807 832 1794 2806 833 1801 2810 835 1801 2810 835 1794 2806 833 1802 2811 836 1804 2812 837 1796 2808 834 1801 2810 835 1801 2810 835 1796 2808 834 1793 2807 832 1855 2668 739 1853 2664 735 1804 2812 837 1804 2812 837 1853 2664 735 1796 2808 834 1801 2810 835 1802 2811 836 1805 2814 838 1805 2814 838 1802 2811 836 1806 2813 839 1805 2814 838 1806 2813 839 1755 2816 840 1755 2816 840 1806 2813 839 1759 2815 841 1801 2810 835 1805 2814 838 1804 2812 837 1804 2812 837 1805 2814 838 1808 2817 842 1805 2814 838 1755 2816 840 1808 2817 842 1808 2817 842 1755 2816 840 1758 2818 843 1804 2812 837 1808 2817 842 1855 2668 739 1855 2668 739 1808 2817 842 1856 2675 746 1808 2817 842 1758 2818 843 1856 2675 746 1856 2675 746 1758 2818 843 1847 2676 747 1758 2818 843 1755 2816 840 1809 2820 844 1809 2820 844 1755 2816 840 1810 2819 845 1809 2820 844 1810 2819 845 1757 2770 814 1757 2770 814 1810 2819 845 1756 2772 817 1755 2816 840 1759 2815 841 1810 2819 845 1810 2819 845 1759 2815 841 1811 2821 846 1810 2819 845 1811 2821 846 1756 2772 817 1756 2772 817 1811 2821 846 1760 2774 819 1809 2820 844 1757 2770 814 1813 2822 847 1813 2822 847 1757 2770 814 1762 2769 815 1762 2769 815 1761 2823 849 1813 2822 847 1813 2822 847 1761 2823 849 1814 2824 848 1814 2824 848 1758 2818 843 1813 2822 847 1813 2822 847 1758 2818 843 1809 2820 844 1848 2684 754 1857 2683 755 1761 2823 849 1761 2823 849 1857 2683 755 1814 2824 848 1857 2683 755 1847 2676 747 1814 2824 848 1814 2824 848 1847 2676 747 1758 2818 843 1824 2826 853 1823 2827 852 1821 2825 850 1821 2825 850 1823 2827 852 1822 2828 851 1829 2829 854 1815 2830 857 1791 2832 855 1791 2832 855 1815 2830 857 1792 2831 856 1816 2833 858 1786 2834 859 1815 2830 857 1815 2830 857 1786 2834 859 1792 2835 856 1784 2837 861 1786 2834 859 1817 2836 860 1817 2836 860 1786 2834 859 1816 2833 858 1818 2838 862 1783 2839 863 1817 2836 860 1817 2836 860 1783 2839 863 1784 2840 861 1818 2838 862 1819 2841 865 1783 2839 863 1783 2839 863 1819 2841 865 1785 2842 864 1820 2843 867 1787 2844 866 1819 2841 865 1819 2841 865 1787 2844 866 1785 2845 864 1821 2825 850 1790 2846 868 1820 2843 867 1820 2843 867 1790 2846 868 1787 2844 866 1789 2847 869 1790 2848 868 1822 2828 851 1822 2828 851 1790 2848 868 1821 2825 850 1823 2827 852 1799 2849 870 1822 2828 851 1822 2828 851 1799 2849 870 1789 2850 869 1824 2826 853 1795 2851 871 1823 2827 852 1823 2827 852 1795 2851 871 1799 2849 870 1825 2852 872 1803 2853 873 1824 2826 853 1824 2826 853 1803 2853 873 1795 2854 871 1825 2852 872 1826 2855 875 1803 2853 873 1803 2853 873 1826 2855 875 1807 2856 874 1827 2857 876 1788 2858 877 1826 2855 875 1826 2855 875 1788 2858 877 1807 2856 874 1828 2859 879 1812 2860 878 1827 2857 876 1827 2857 876 1812 2860 878 1788 2858 877 1828 2859 879 1829 2829 854 1812 2860 878 1812 2860 878 1829 2829 854 1791 2861 855 1829 2829 854 1828 2859 879 1815 2830 857 1815 2830 857 1828 2859 879 1816 2833 858 1824 2826 853 1821 2825 850 1825 2852 872 1825 2852 872 1821 2825 850 1820 2843 867 1827 2857 876 1826 2855 875 1818 2838 862 1818 2838 862 1826 2855 875 1819 2841 865 1826 2855 875 1825 2852 872 1819 2841 865 1819 2841 865 1825 2852 872 1820 2843 867 1817 2836 860 1828 2859 879 1818 2838 862 1818 2838 862 1828 2859 879 1827 2857 876 1817 2836 860 1816 2833 858 1828 2859 879 1783 2839 863 1831 2862 881 1784 2840 861 1784 2840 861 1831 2862 881 1830 2863 880 1831 2862 881 1753 2764 807 1830 2863 880 1830 2863 880 1753 2764 807 1763 2763 808 1785 2842 864 1832 2864 882 1783 2839 863 1783 2839 863 1832 2864 882 1831 2862 881 1832 2864 882 1764 2765 809 1831 2862 881 1831 2862 881 1764 2765 809 1753 2764 807 1784 2865 861 1830 2866 880 1786 2868 859 1786 2868 859 1830 2866 880 1833 2867 883 1785 2869 864 1787 2870 866 1832 2872 882 1832 2872 882 1787 2870 866 1834 2871 884 1776 2781 822 1764 2780 809 1834 2871 884 1834 2871 884 1764 2780 809 1832 2872 882 1789 2873 869 1836 2874 886 1790 2876 868 1790 2876 868 1836 2874 886 1835 2875 885 1836 2874 886 1780 2785 826 1835 2875 885 1835 2875 885 1780 2785 826 1777 2788 823 1791 2877 855 1792 2878 856 1837 2880 887 1837 2880 887 1792 2878 856 1838 2879 888 1773 2775 818 1760 2774 819 1838 2879 888 1838 2879 888 1760 2774 819 1837 2880 887 1790 2881 868 1835 2882 885 1787 2870 866 1787 2870 866 1835 2882 885 1834 2871 884 1835 2882 885 1777 2782 823 1834 2871 884 1834 2871 884 1777 2782 823 1776 2781 822 1792 2883 856 1786 2868 859 1838 2884 888 1838 2884 888 1786 2868 859 1833 2867 883 1799 2886 870 1839 2887 889 1789 2885 869 1789 2885 869 1839 2887 889 1836 2888 886 1798 2797 830 1780 2796 826 1839 2887 889 1839 2887 889 1780 2796 826 1836 2888 886 1794 2806 833 1798 2797 830 1840 2889 890 1840 2889 890 1798 2797 830 1839 2887 889 1839 2887 889 1799 2886 870 1840 2889 890 1840 2889 890 1799 2886 870 1795 2890 871 1841 2891 891 1840 2889 890 1803 2853 873 1803 2853 873 1840 2889 890 1795 2892 871 1841 2891 891 1802 2811 836 1840 2889 890 1840 2889 890 1802 2811 836 1794 2806 833 1803 2853 873 1807 2856 874 1841 2891 891 1841 2891 891 1807 2856 874 1842 2893 892 1806 2813 839 1802 2811 836 1842 2893 892 1842 2893 892 1802 2811 836 1841 2891 891 1807 2856 874 1788 2858 877 1842 2893 892 1842 2893 892 1788 2858 877 1843 2894 893 1759 2815 841 1806 2813 839 1843 2894 893 1843 2894 893 1806 2813 839 1842 2893 892 1788 2858 877 1812 2860 878 1843 2894 893 1843 2894 893 1812 2860 878 1844 2895 894 1811 2821 846 1759 2815 841 1844 2895 894 1844 2895 894 1759 2815 841 1843 2894 893 1791 2896 855 1837 2880 887 1812 2860 878 1812 2860 878 1837 2880 887 1844 2895 894 1837 2880 887 1760 2774 819 1844 2895 894 1844 2895 894 1760 2774 819 1811 2821 846 1838 2884 888 1833 2867 883 1773 2898 818 1763 2897 808 1773 2898 818 1830 2866 880 1833 2867 883 1830 2866 880 1773 2898 818 1773 2898 818 1763 2897 808 1772 2899 816 1772 2899 816 1763 2897 808 1766 2900 802 1772 2899 816 1766 2900 802 1771 2901 813 1771 2901 813 1766 2900 802 1765 2902 803 1771 2901 813 1765 2902 803 1770 2904 812 1770 2904 812 1765 2902 803 1769 2903 811 1744 2744 793 1679 2905 715 1739 2727 789 1669 2906 700 1736 2728 787 1679 2905 715 1679 2905 715 1736 2728 787 1739 2727 789 1672 2908 697 1669 2906 700 1678 2907 713 1678 2907 713 1669 2906 700 1679 2905 715 1671 2910 696 1672 2908 697 1677 2909 711 1677 2909 711 1672 2908 697 1678 2907 713 1677 2909 711 1676 2911 708 1671 2910 696 1671 2910 696 1676 2911 708 1675 2912 707 1660 2614 706 3003 2913 896 1846 2615 705 1846 2615 705 3003 2913 896 3002 2914 895 1660 2614 706 1675 2616 707 3003 2913 896 3003 2913 896 1675 2616 707 3004 2915 897 1676 2911 708 3005 2916 898 1675 2912 707 1675 2912 707 3005 2916 898 3004 2917 897 1668 2620 709 3006 2918 899 1676 2617 708 1676 2617 708 3006 2918 899 3005 2919 898 1668 2620 709 1667 2682 752 3006 2918 899 3006 2918 899 1667 2682 752 3007 2920 900 1667 2682 752 1848 2684 754 3007 2920 900 3007 2920 900 1848 2684 754 3008 2921 901 1761 2823 849 3009 2922 902 1848 2684 754 1848 2684 754 3009 2922 902 3008 2921 901 1762 2769 815 3010 2923 903 1761 2823 849 1761 2823 849 3010 2923 903 3009 2922 902 1762 2769 815 1770 2768 812 3010 2923 903 3010 2923 903 1770 2768 812 3011 2924 904 1770 2904 812 1769 2903 811 3011 2926 904 3011 2926 904 1769 2903 811 3012 2925 905 1769 2767 811 1754 2766 810 3012 2928 905 3012 2928 905 1754 2766 810 3013 2927 906 1754 2766 810 1846 2615 705 3013 2927 906 3013 2927 906 1846 2615 705 3002 2914 895 1860 2930 910 1889 2931 909 1861 2929 907 1861 2929 907 1889 2931 909 1890 2932 908 1863 2934 914 1891 2935 913 1864 2933 911 1864 2933 911 1891 2935 913 1892 2936 912 1864 2933 911 1892 2936 912 1865 2937 915 1865 2937 915 1892 2936 912 1893 2938 916 1871 2940 920 1895 2941 919 1868 2939 917 1868 2939 917 1895 2941 919 1894 2942 918 1875 2943 921 1874 2944 924 1897 2946 922 1897 2946 922 1874 2944 924 1896 2945 923 1865 2937 915 1893 2938 916 1871 2940 920 1871 2940 920 1893 2938 916 1895 2941 919 1861 2929 907 1890 2932 908 1863 2934 914 1863 2934 914 1890 2932 908 1891 2935 913 1874 2944 924 1868 2939 917 1896 2945 923 1896 2945 923 1868 2939 917 1894 2942 918 1898 2948 926 1889 2931 909 1877 2947 925 1877 2947 925 1889 2931 909 1860 2930 910 1899 2950 930 1900 2951 929 1879 2949 927 1879 2949 927 1900 2951 929 1880 2952 928 1900 2951 929 1901 2953 932 1880 2952 928 1880 2952 928 1901 2953 932 1881 2954 931 1902 2956 936 1903 2957 935 1883 2955 933 1883 2955 933 1903 2957 935 1884 2958 934 1875 2943 921 1897 2946 922 1887 2960 937 1887 2960 937 1897 2946 922 1904 2959 938 1903 2957 935 1899 2950 930 1884 2958 934 1884 2958 934 1899 2950 930 1879 2949 927 1901 2953 932 1898 2948 926 1881 2954 931 1881 2954 931 1898 2948 926 1877 2947 925 1887 2960 937 1904 2959 938 1883 2955 933 1883 2955 933 1904 2959 938 1902 2956 936 1858 2961 939 1859 2962 940 1861 2964 907 1861 2964 907 1859 2962 940 1860 2963 910 1965 2965 941 1966 2966 944 1968 2968 942 1968 2968 942 1966 2966 944 1967 2967 943 1863 2970 914 1864 2971 911 1862 2969 945 1862 2969 945 1864 2971 911 1865 2972 915 1909 2974 949 1910 2975 948 1908 2973 946 1908 2973 946 1910 2975 948 1911 2976 947 1867 2978 951 1859 2962 940 1866 2977 950 1866 2977 950 1859 2962 940 1858 2961 939 1969 2979 952 1965 2965 941 1970 2980 953 1970 2980 953 1965 2965 941 1968 2968 942 1869 2982 955 1870 2983 954 1868 2981 917 1868 2981 917 1870 2983 954 1871 2984 920 1914 2986 959 1915 2987 958 1913 2985 956 1913 2985 956 1915 2987 958 1916 2988 957 1873 2990 961 1874 2991 924 1872 2989 960 1872 2989 960 1874 2991 924 1875 2992 921 1972 2994 965 1973 2995 964 1971 2993 962 1971 2993 962 1973 2995 964 1974 2996 963 1870 2983 954 1862 2969 945 1871 2984 920 1871 2984 920 1862 2969 945 1865 2972 915 1915 2987 958 1914 2986 959 1908 2973 946 1908 2973 946 1914 2986 959 1909 2974 949 1862 2969 945 1858 2961 939 1863 2970 914 1863 2970 914 1858 2961 939 1861 2964 907 1906 2997 967 1905 2998 966 1911 2976 947 1911 2976 947 1905 2998 966 1908 2973 946 1870 2983 954 1869 2982 955 1866 2977 950 1866 2977 950 1869 2982 955 1873 2990 961 1915 2987 958 1912 2999 969 1916 2988 957 1916 2988 957 1912 2999 969 1919 3000 968 1872 2989 960 1867 2978 951 1873 2990 961 1873 2990 961 1867 2978 951 1866 2977 950 1969 2979 952 1970 2980 953 1974 2996 963 1974 2996 963 1970 2980 953 1971 2993 962 1862 2969 945 1870 2983 954 1858 2961 939 1858 2961 939 1870 2983 954 1866 2977 950 1908 2973 946 1905 2998 966 1915 2987 958 1915 2987 958 1905 2998 966 1912 2999 969 1869 2982 955 1868 2981 917 1873 2990 961 1873 2990 961 1868 2981 917 1874 2991 924 1916 2988 957 1919 3000 968 1913 2985 956 1913 2985 956 1919 3000 968 1918 3001 970 1876 3002 971 1877 3003 925 1859 2962 940 1859 2962 940 1877 3003 925 1860 2963 910 1975 3004 972 1968 2968 942 1976 3005 973 1976 3005 973 1968 2968 942 1967 2967 943 1879 3007 927 1880 3008 928 1878 3006 974 1878 3006 974 1880 3008 928 1881 3009 931 1923 3011 978 1924 3012 977 1922 3010 975 1922 3010 975 1924 3012 977 1925 3013 976 1876 3002 971 1859 2962 940 1882 3014 979 1882 3014 979 1859 2962 940 1867 2978 951 1977 3015 980 1970 2980 953 1975 3004 972 1975 3004 972 1970 2980 953 1968 2968 942 1884 3017 934 1885 3018 982 1883 3016 933 1883 3016 933 1885 3018 982 1886 3019 981 1928 3021 986 1929 3022 985 1927 3020 983 1927 3020 983 1929 3022 985 1930 3023 984 1875 2992 921 1887 3024 937 1872 2989 960 1872 2989 960 1887 3024 937 1888 3025 987 1978 3026 989 1979 3027 988 1971 2993 962 1971 2993 962 1979 3027 988 1972 2994 965 1885 3018 982 1884 3017 934 1878 3006 974 1878 3006 974 1884 3017 934 1879 3007 927 1929 3022 985 1922 3010 975 1930 3023 984 1930 3023 984 1922 3010 975 1925 3013 976 1877 3003 925 1876 3002 971 1881 3009 931 1881 3009 931 1876 3002 971 1878 3006 974 1922 3010 975 1920 3028 991 1923 3011 978 1923 3011 978 1920 3028 991 1921 3029 990 1885 3018 982 1882 3014 979 1886 3019 981 1886 3019 981 1882 3014 979 1888 3025 987 1929 3022 985 1928 3021 986 1926 3031 992 1926 3031 992 1928 3021 986 1931 3030 993 1882 3014 979 1867 2978 951 1888 3025 987 1888 3025 987 1867 2978 951 1872 2989 960 1971 2993 962 1970 2980 953 1978 3026 989 1978 3026 989 1970 2980 953 1977 3015 980 1878 3006 974 1876 3002 971 1885 3018 982 1885 3018 982 1876 3002 971 1882 3014 979 1922 3010 975 1929 3022 985 1920 3028 991 1920 3028 991 1929 3022 985 1926 3031 992 1886 3019 981 1888 3025 987 1883 3016 933 1883 3016 933 1888 3025 987 1887 3024 937 1928 3021 986 1927 3020 983 1931 3030 993 1931 3030 993 1927 3020 983 1932 3032 994 1892 2936 912 1891 2935 913 1933 3033 995 1933 3033 995 1891 2935 913 1934 3034 996 1891 2935 913 1890 2932 908 1934 3034 996 1934 3034 996 1890 2932 908 1935 3035 997 1890 2932 908 1889 2931 909 1935 3035 997 1935 3035 997 1889 2931 909 1936 3036 998 1936 3036 998 1889 2931 909 1937 3037 999 1937 3037 999 1889 2931 909 1898 2948 926 1937 3037 999 1898 2948 926 1938 3038 1000 1938 3038 1000 1898 2948 926 1901 2953 932 1938 3038 1000 1901 2953 932 1939 3039 1001 1939 3039 1001 1901 2953 932 1900 2951 929 1900 2951 929 1899 2950 930 1939 3039 1001 1939 3039 1001 1899 2950 930 1940 3040 1002 1899 2950 930 1903 2957 935 1940 3040 1002 1940 3040 1002 1903 2957 935 1941 3041 1003 1903 2957 935 1902 2956 936 1941 3041 1003 1941 3041 1003 1902 2956 936 1942 3042 1004 1902 2956 936 1904 2959 938 1942 3042 1004 1942 3042 1004 1904 2959 938 1943 3043 1005 1904 2959 938 1897 2946 922 1943 3043 1005 1943 3043 1005 1897 2946 922 1944 3044 1006 1944 3044 1006 1897 2946 922 1945 3045 1007 1945 3045 1007 1897 2946 922 1896 2945 923 1945 3045 1007 1896 2945 923 1946 3046 1008 1946 3046 1008 1896 2945 923 1894 2942 918 1946 3046 1008 1894 2942 918 1947 3047 1009 1947 3047 1009 1894 2942 918 1895 2941 919 1947 3047 1009 1895 2941 919 1948 3048 1010 1948 3048 1010 1895 2941 919 1893 2938 916 1948 3048 1010 1893 2938 916 1933 3033 995 1933 3033 995 1893 2938 916 1892 2936 912 1949 3049 1013 1950 3050 1012 1906 2997 967 1906 2997 967 1950 3050 1012 1907 3051 1011 1935 3035 997 1936 3036 998 1949 3049 1013 1949 3049 1013 1936 3036 998 1950 3050 1012 1907 3051 1011 1950 3050 1012 1921 3053 990 1921 3053 990 1950 3050 1012 1951 3052 1014 1950 3050 1012 1936 3036 998 1951 3052 1014 1951 3052 1014 1936 3036 998 1937 3037 999 1921 3053 990 1951 3052 1014 1923 3011 978 1923 3011 978 1951 3052 1014 1952 3054 1015 1951 3052 1014 1937 3037 999 1952 3054 1015 1952 3054 1015 1937 3037 999 1938 3038 1000 1923 3011 978 1952 3054 1015 1924 3012 977 1924 3012 977 1952 3054 1015 1953 3055 1016 1952 3054 1015 1938 3038 1000 1953 3055 1016 1953 3055 1016 1938 3038 1000 1939 3039 1001 1953 3055 1016 1954 3056 1017 1924 3012 977 1924 3012 977 1954 3056 1017 1925 3013 976 1939 3039 1001 1940 3040 1002 1953 3055 1016 1953 3055 1016 1940 3040 1002 1954 3056 1017 1954 3056 1017 1955 3057 1018 1925 3013 976 1925 3013 976 1955 3057 1018 1930 3023 984 1940 3040 1002 1941 3041 1003 1954 3056 1017 1954 3056 1017 1941 3041 1003 1955 3057 1018 1955 3057 1018 1956 3058 1019 1930 3023 984 1930 3023 984 1956 3058 1019 1927 3020 983 1941 3041 1003 1942 3042 1004 1955 3057 1018 1955 3057 1018 1942 3042 1004 1956 3058 1019 1956 3058 1019 1957 3059 1020 1927 3020 983 1927 3020 983 1957 3059 1020 1932 3060 994 1942 3042 1004 1943 3043 1005 1956 3058 1019 1956 3058 1019 1943 3043 1005 1957 3059 1020 1957 3059 1020 1958 3061 1022 1932 3060 994 1932 3060 994 1958 3061 1022 1917 3062 1021 1943 3043 1005 1944 3044 1006 1957 3059 1020 1957 3059 1020 1944 3044 1006 1958 3061 1022 1917 3062 1021 1958 3061 1022 1918 3064 970 1918 3064 970 1958 3061 1022 1959 3063 1023 1958 3061 1022 1944 3044 1006 1959 3063 1023 1959 3063 1023 1944 3044 1006 1945 3045 1007 1918 3065 970 1959 3063 1023 1913 2985 956 1913 2985 956 1959 3063 1023 1960 3066 1024 1959 3063 1023 1945 3045 1007 1960 3066 1024 1960 3066 1024 1945 3045 1007 1946 3046 1008 1913 2985 956 1960 3066 1024 1914 2986 959 1914 2986 959 1960 3066 1024 1961 3067 1025 1960 3066 1024 1946 3046 1008 1961 3067 1025 1961 3067 1025 1946 3046 1008 1947 3047 1009 1914 2986 959 1961 3067 1025 1909 2974 949 1909 2974 949 1961 3067 1025 1962 3068 1026 1961 3067 1025 1947 3047 1009 1962 3068 1026 1962 3068 1026 1947 3047 1009 1948 3048 1010 1909 2974 949 1962 3068 1026 1910 2975 948 1910 2975 948 1962 3068 1026 1963 3069 1027 1962 3068 1026 1948 3048 1010 1963 3069 1027 1963 3069 1027 1948 3048 1010 1933 3033 995 1963 3069 1027 1964 3070 1028 1910 2975 948 1910 2975 948 1964 3070 1028 1911 2976 947 1933 3033 995 1934 3034 996 1963 3069 1027 1963 3069 1027 1934 3034 996 1964 3070 1028 1964 3070 1028 1949 3049 1013 1911 2976 947 1911 2976 947 1949 3049 1013 1906 2997 967 1934 3034 996 1935 3035 997 1964 3070 1028 1964 3070 1028 1935 3035 997 1949 3049 1013 1966 3071 944 1980 3072 1030 1967 3074 943 1967 3074 943 1980 3072 1030 1981 3073 1029 1980 3072 1030 1982 3075 1032 1981 3073 1029 1981 3073 1029 1982 3075 1032 1983 3076 1031 1906 2997 967 1907 3051 1011 1982 3077 1032 1982 3077 1032 1907 3051 1011 1983 3076 1031 1981 3073 1029 1984 3078 1033 1967 3074 943 1967 3074 943 1984 3078 1033 1976 3079 973 1983 3076 1031 1985 3080 1034 1981 3073 1029 1981 3073 1029 1985 3080 1034 1984 3078 1033 1983 3076 1031 1907 3051 1011 1985 3080 1034 1985 3080 1034 1907 3051 1011 1921 3081 990 1984 3083 1033 1986 3084 1035 1976 3082 973 1976 3082 973 1986 3084 1035 1975 3085 972 1985 3086 1034 1987 3087 1036 1984 3083 1033 1984 3083 1033 1987 3087 1036 1986 3084 1035 1921 3029 990 1920 3028 991 1985 3086 1034 1985 3086 1034 1920 3028 991 1987 3087 1036 1986 3084 1035 1988 3088 1037 1975 3085 972 1975 3085 972 1988 3088 1037 1977 3089 980 1987 3087 1036 1989 3090 1038 1986 3084 1035 1986 3084 1035 1989 3090 1038 1988 3088 1037 1920 3028 991 1926 3031 992 1987 3087 1036 1987 3087 1036 1926 3031 992 1989 3090 1038 1988 3088 1037 1990 3091 1039 1977 3089 980 1977 3089 980 1990 3091 1039 1978 3092 989 1989 3090 1038 1991 3093 1040 1988 3088 1037 1988 3088 1037 1991 3093 1040 1990 3091 1039 1926 3031 992 1931 3030 993 1989 3090 1038 1989 3090 1038 1931 3030 993 1991 3093 1040 1990 3091 1039 1992 3094 1041 1978 3092 989 1978 3092 989 1992 3094 1041 1979 3095 988 1991 3093 1040 1993 3096 1042 1990 3091 1039 1990 3091 1039 1993 3096 1042 1992 3094 1041 1931 3030 993 1932 3032 994 1991 3093 1040 1991 3093 1040 1932 3032 994 1993 3097 1042 1992 3094 1041 1994 3098 1043 1979 3095 988 1979 3095 988 1994 3098 1043 1972 3099 965 1993 3100 1042 1995 3101 1044 1992 3094 1041 1992 3094 1041 1995 3101 1044 1994 3098 1043 1932 3102 994 1917 3103 1021 1993 3100 1042 1993 3100 1042 1917 3103 1021 1995 3101 1044 1972 3099 965 1994 3098 1043 1973 3105 964 1973 3105 964 1994 3098 1043 1996 3104 1045 1994 3098 1043 1995 3101 1044 1996 3104 1045 1996 3104 1045 1995 3101 1044 1997 3106 1046 1995 3101 1044 1917 3103 1021 1997 3106 1046 1997 3106 1046 1917 3103 1021 1918 3107 970 1973 3105 964 1996 3104 1045 1974 3109 963 1974 3109 963 1996 3104 1045 1998 3108 1047 1996 3104 1045 1997 3110 1046 1998 3108 1047 1998 3108 1047 1997 3110 1046 1999 3111 1048 1997 3112 1046 1918 3113 970 1999 3111 1048 1999 3111 1048 1918 3113 970 1919 3000 968 1974 3109 963 1998 3108 1047 1969 3115 952 1969 3115 952 1998 3108 1047 2000 3114 1049 1998 3108 1047 1999 3111 1048 2000 3114 1049 2000 3114 1049 1999 3111 1048 2001 3116 1050 1999 3111 1048 1919 3000 968 2001 3116 1050 2001 3116 1050 1919 3000 968 1912 2999 969 1969 3115 952 2000 3114 1049 1965 3118 941 1965 3118 941 2000 3114 1049 2002 3117 1051 2000 3114 1049 2001 3116 1050 2002 3117 1051 2002 3117 1051 2001 3116 1050 2003 3119 1052 2001 3116 1050 1912 2999 969 2003 3119 1052 2003 3119 1052 1912 2999 969 1905 2998 966 1965 3118 941 2002 3117 1051 1966 3121 944 1966 3121 944 2002 3117 1051 1980 3120 1030 2002 3117 1051 2003 3119 1052 1980 3120 1030 1980 3120 1030 2003 3119 1052 1982 3122 1032 2003 3119 1052 1905 2998 966 1982 3123 1032 1982 3123 1032 1905 2998 966 1906 2997 967</p>
+ </triangles>
+ <triangles material="HeadphonesSG3" count="1484">
+ <input semantic="VERTEX" source="#Headphones-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Headphones-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Headphones-headphonesUV" offset="2" set="1"/>
+ <p>604 1278 1053 533 1279 1054 606 1281 1056 606 1281 1056 533 1279 1054 347 1280 1055 606 1281 1056 347 1280 1055 605 1283 1058 605 1283 1058 347 1280 1055 348 1282 1057 605 1283 1058 348 1282 1057 608 1285 1060 608 1285 1060 348 1282 1057 349 1284 1059 610 1286 1061 350 1287 1062 612 1289 1064 612 1289 1064 350 1287 1062 351 1288 1063 612 1289 1064 351 1288 1063 614 1291 1066 614 1291 1066 351 1288 1063 352 1290 1065 614 1291 1066 352 1290 1065 616 1293 1068 616 1293 1068 352 1290 1065 353 1292 1067 353 1292 1067 354 1294 1069 616 1293 1068 616 1293 1068 354 1294 1069 618 1295 1070 354 1294 1069 355 1296 1071 618 1295 1070 618 1295 1070 355 1296 1071 620 1297 1072 533 1279 1054 542 1298 1073 347 1280 1055 347 1280 1055 542 1298 1073 356 1299 1074 347 1280 1055 356 1299 1074 348 1282 1057 348 1282 1057 356 1299 1074 357 1300 1075 348 1282 1057 357 1300 1075 349 1284 1059 349 1284 1059 357 1300 1075 358 1301 1076 350 1287 1062 349 1284 1059 359 1302 1077 359 1302 1077 349 1284 1059 358 1301 1076 350 1287 1062 359 1302 1077 351 1288 1063 351 1288 1063 359 1302 1077 360 1303 1078 351 1288 1063 360 1303 1078 352 1290 1065 352 1290 1065 360 1303 1078 361 1304 1079 352 1290 1065 361 1304 1079 353 1292 1067 353 1292 1067 361 1304 1079 362 1305 1080 362 1305 1080 363 1306 1081 353 1292 1067 353 1292 1067 363 1306 1081 354 1294 1069 363 1306 1081 364 1307 1082 354 1294 1069 354 1294 1069 364 1307 1082 355 1296 1071 542 1298 1073 543 1308 1083 356 1299 1074 356 1299 1074 543 1308 1083 365 1309 1084 356 1299 1074 365 1309 1084 357 1300 1075 357 1300 1075 365 1309 1084 366 1310 1085 357 1300 1075 366 1310 1085 358 1301 1076 358 1301 1076 366 1310 1085 367 1311 1086 358 1301 1076 367 1311 1086 359 1302 1077 359 1302 1077 367 1311 1086 368 1312 1087 359 1302 1077 368 1312 1087 360 1303 1078 360 1303 1078 368 1312 1087 369 1313 1088 360 1303 1078 369 1313 1088 361 1304 1079 361 1304 1079 369 1313 1088 370 1314 1089 361 1304 1079 370 1314 1089 362 1305 1080 362 1305 1080 370 1314 1089 371 1315 1090 371 1315 1090 372 1316 1091 362 1305 1080 362 1305 1080 372 1316 1091 363 1306 1081 372 1316 1091 373 1317 1092 363 1306 1081 363 1306 1081 373 1317 1092 364 1307 1082 543 1308 1083 544 1318 1093 365 1309 1084 365 1309 1084 544 1318 1093 374 1319 1094 365 1309 1084 374 1319 1094 366 1310 1085 366 1310 1085 374 1319 1094 375 1320 1095 366 1310 1085 375 1320 1095 367 1311 1086 367 1311 1086 375 1320 1095 376 1321 1096 367 1311 1086 376 1321 1096 368 1312 1087 368 1312 1087 376 1321 1096 377 1322 1097 368 1312 1087 377 1322 1097 369 1313 1088 369 1313 1088 377 1322 1097 378 1323 1098 369 1313 1088 378 1323 1098 370 1314 1089 370 1314 1089 378 1323 1098 379 1324 1099 370 1314 1089 379 1324 1099 371 1315 1090 371 1315 1090 379 1324 1099 380 1325 1100 380 1325 1100 381 1326 1101 371 1315 1090 371 1315 1090 381 1326 1101 372 1316 1091 382 1327 1102 373 1317 1092 381 1326 1101 381 1326 1101 373 1317 1092 372 1316 1091 544 1318 1093 545 1328 1103 374 1319 1094 374 1319 1094 545 1328 1103 383 1329 1104 374 1319 1094 383 1329 1104 375 1320 1095 375 1320 1095 383 1329 1104 384 1330 1105 375 1320 1095 384 1330 1105 376 1321 1096 376 1321 1096 384 1330 1105 385 1331 1106 376 1321 1096 385 1331 1106 377 1322 1097 377 1322 1097 385 1331 1106 386 1332 1107 377 1322 1097 386 1332 1107 378 1323 1098 378 1323 1098 386 1332 1107 387 1333 1108 378 1323 1098 387 1333 1108 379 1324 1099 379 1324 1099 387 1333 1108 388 1334 1109 379 1324 1099 388 1334 1109 380 1325 1100 380 1325 1100 388 1334 1109 389 1335 1110 389 1335 1110 390 1336 1111 380 1325 1100 380 1325 1100 390 1336 1111 381 1326 1101 390 1336 1111 391 1337 1112 381 1326 1101 381 1326 1101 391 1337 1112 382 1327 1102 410 1338 1113 411 1339 1114 364 1307 1082 364 1307 1082 411 1339 1114 355 1296 1071 412 1340 1115 410 1338 1113 373 1317 1092 373 1317 1092 410 1338 1113 364 1307 1082 409 1342 1117 395 1343 1118 414 1341 1116 414 1341 1116 395 1343 1118 398 1344 1119 549 1345 1120 547 1346 1121 409 1342 1117 409 1342 1117 547 1346 1121 395 1343 1118 411 1339 1114 413 1347 1122 355 1296 1071 355 1296 1071 413 1347 1122 620 1297 1072 428 1349 1124 403 1350 1125 404 1348 1123 404 1348 1123 403 1350 1125 394 1351 1126 405 1353 1128 395 1354 1118 548 1352 1127 548 1352 1127 395 1354 1118 547 1355 1121 406 1357 1130 396 1358 1131 407 1356 1129 407 1356 1129 396 1358 1131 397 1359 1132 408 1360 1133 398 1361 1119 405 1353 1128 405 1353 1128 398 1361 1119 395 1354 1118 407 1356 1129 397 1359 1132 408 1360 1133 408 1360 1133 397 1359 1132 398 1361 1119 404 1348 1123 394 1351 1126 406 1357 1130 406 1357 1130 394 1351 1126 396 1358 1131 392 1362 1134 414 1341 1116 391 1337 1112 391 1337 1112 414 1341 1116 382 1327 1102 414 1341 1116 412 1340 1115 382 1327 1102 382 1327 1102 412 1340 1115 373 1317 1092 393 1363 1135 409 1342 1117 392 1362 1134 392 1362 1134 409 1342 1117 414 1341 1116 409 1342 1117 393 1363 1135 549 1345 1120 549 1345 1120 393 1363 1135 546 1364 1136 411 1339 1114 410 1338 1113 394 1366 1126 394 1366 1126 410 1338 1113 396 1365 1131 410 1338 1113 412 1340 1115 396 1365 1131 396 1365 1131 412 1340 1115 397 1367 1132 414 1341 1116 398 1344 1119 412 1340 1115 412 1340 1115 398 1344 1119 397 1367 1132 413 1347 1122 411 1339 1114 403 1368 1125 403 1368 1125 411 1339 1114 394 1366 1126 418 1369 1137 419 1370 1138 415 1372 1140 415 1372 1140 419 1370 1138 416 1371 1139 415 1372 1140 416 1371 1139 623 1374 1142 623 1374 1142 416 1371 1139 627 1373 1141 419 1370 1138 540 1375 1143 416 1371 1139 416 1371 1139 540 1375 1143 539 1376 1144 416 1371 1139 539 1376 1144 627 1373 1141 627 1373 1141 539 1376 1144 626 1377 1145 415 1372 1140 417 1378 1146 418 1369 1137 418 1369 1137 417 1378 1146 420 1379 1147 413 1347 1122 403 1368 1125 417 1378 1146 417 1378 1146 403 1368 1125 420 1379 1147 417 1378 1146 415 1372 1140 624 1380 1148 624 1380 1148 415 1372 1140 623 1374 1142 620 1297 1072 413 1347 1122 624 1380 1148 624 1380 1148 413 1347 1122 417 1378 1146 427 1381 1149 541 1382 1150 419 1384 1138 419 1384 1138 541 1382 1150 540 1383 1143 425 1385 1151 427 1381 1149 418 1386 1137 418 1386 1137 427 1381 1149 419 1384 1138 426 1387 1152 425 1385 1151 420 1388 1147 420 1388 1147 425 1385 1151 418 1386 1137 534 1389 1153 400 1390 1154 535 1392 1156 535 1392 1156 400 1390 1154 421 1391 1155 401 1393 1157 399 1394 1158 423 1396 1160 423 1396 1160 399 1394 1158 422 1395 1159 400 1390 1154 402 1397 1161 421 1391 1155 421 1391 1155 402 1397 1161 424 1398 1162 402 1397 1161 401 1393 1157 424 1398 1162 424 1398 1162 401 1393 1157 423 1396 1160 538 1400 1164 541 1382 1150 434 1399 1163 434 1399 1163 541 1382 1150 427 1381 1149 432 1401 1165 434 1399 1163 425 1385 1151 425 1385 1151 434 1399 1163 427 1381 1149 433 1402 1166 432 1401 1165 426 1387 1152 426 1387 1152 432 1401 1165 425 1385 1151 428 1349 1124 404 1348 1123 399 1394 1158 399 1394 1158 404 1348 1123 422 1395 1159 428 1404 1124 426 1387 1152 403 1403 1125 403 1403 1125 426 1387 1152 420 1388 1147 406 1357 1130 436 1405 1167 404 1348 1123 404 1348 1123 436 1405 1167 422 1395 1159 429 1407 1169 402 1408 1161 430 1406 1168 430 1406 1168 402 1408 1161 400 1409 1154 430 1406 1168 400 1409 1154 536 1410 1170 536 1410 1170 400 1409 1154 534 1411 1153 431 1412 1171 401 1413 1157 429 1407 1169 429 1407 1169 401 1413 1157 402 1408 1161 426 1387 1152 428 1404 1124 433 1402 1166 433 1402 1166 428 1404 1124 399 1414 1158 430 1406 1168 435 1415 1172 429 1407 1169 429 1407 1169 435 1415 1172 434 1399 1163 537 1416 1173 435 1415 1172 536 1410 1170 536 1410 1170 435 1415 1172 430 1406 1168 432 1401 1165 431 1412 1171 434 1399 1163 434 1399 1163 431 1412 1171 429 1407 1169 432 1401 1165 433 1402 1166 431 1412 1171 433 1402 1166 399 1414 1158 431 1412 1171 431 1412 1171 399 1414 1158 401 1413 1157 537 1416 1173 538 1400 1164 435 1415 1172 435 1415 1172 538 1400 1164 434 1399 1163 408 1360 1133 438 1417 1174 407 1356 1129 407 1356 1129 438 1417 1174 437 1418 1175 437 1418 1175 438 1419 1174 423 1396 1160 423 1396 1160 438 1419 1174 424 1398 1162 405 1353 1128 439 1420 1176 408 1360 1133 408 1360 1133 439 1420 1176 438 1421 1174 439 1422 1176 421 1391 1155 438 1419 1174 438 1419 1174 421 1391 1155 424 1398 1162 548 1352 1127 550 1423 1177 405 1353 1128 405 1353 1128 550 1423 1177 439 1420 1176 439 1422 1176 550 1424 1177 421 1391 1155 421 1391 1155 550 1424 1177 535 1392 1156 407 1356 1129 437 1418 1175 406 1357 1130 406 1357 1130 437 1418 1175 436 1405 1167 437 1418 1175 423 1396 1160 436 1405 1167 436 1405 1167 423 1396 1160 422 1395 1159 604 1278 1053 603 1425 1178 533 1279 1054 533 1279 1054 603 1425 1178 440 1426 1179 603 1425 1178 602 1427 1180 440 1426 1179 440 1426 1179 602 1427 1180 441 1428 1181 602 1427 1180 607 1429 1182 441 1428 1181 441 1428 1181 607 1429 1182 442 1430 1183 607 1429 1182 609 1431 1184 442 1430 1183 442 1430 1183 609 1431 1184 443 1432 1185 609 1431 1184 611 1433 1186 443 1432 1185 443 1432 1185 611 1433 1186 444 1434 1187 611 1433 1186 613 1435 1188 444 1434 1187 444 1434 1187 613 1435 1188 445 1436 1189 613 1435 1188 615 1437 1190 445 1436 1189 445 1436 1189 615 1437 1190 446 1438 1191 446 1438 1191 615 1437 1190 447 1440 1193 447 1440 1193 615 1437 1190 617 1439 1192 447 1440 1193 617 1439 1192 448 1442 1195 448 1442 1195 617 1439 1192 619 1441 1194 533 1279 1054 440 1426 1179 542 1298 1073 542 1298 1073 440 1426 1179 449 1443 1196 440 1426 1179 441 1428 1181 449 1443 1196 449 1443 1196 441 1428 1181 450 1444 1197 441 1428 1181 442 1430 1183 450 1444 1197 450 1444 1197 442 1430 1183 451 1445 1198 442 1430 1183 443 1432 1185 451 1445 1198 451 1445 1198 443 1432 1185 452 1446 1199 443 1432 1185 444 1434 1187 452 1446 1199 452 1446 1199 444 1434 1187 453 1447 1200 444 1434 1187 445 1436 1189 453 1447 1200 453 1447 1200 445 1436 1189 454 1448 1201 445 1436 1189 446 1438 1191 454 1448 1201 454 1448 1201 446 1438 1191 455 1449 1202 455 1449 1202 446 1438 1191 456 1450 1203 456 1450 1203 446 1438 1191 447 1440 1193 456 1450 1203 447 1440 1193 457 1451 1204 457 1451 1204 447 1440 1193 448 1442 1195 542 1298 1073 449 1443 1196 543 1308 1083 543 1308 1083 449 1443 1196 458 1452 1205 449 1443 1196 450 1444 1197 458 1452 1205 458 1452 1205 450 1444 1197 459 1453 1206 450 1444 1197 451 1445 1198 459 1453 1206 459 1453 1206 451 1445 1198 460 1454 1207 451 1445 1198 452 1446 1199 460 1454 1207 460 1454 1207 452 1446 1199 461 1455 1208 452 1446 1199 453 1447 1200 461 1455 1208 461 1455 1208 453 1447 1200 462 1456 1209 453 1447 1200 454 1448 1201 462 1456 1209 462 1456 1209 454 1448 1201 463 1457 1210 454 1448 1201 455 1449 1202 463 1457 1210 463 1457 1210 455 1449 1202 464 1458 1211 464 1458 1211 455 1449 1202 465 1459 1212 465 1459 1212 455 1449 1202 456 1450 1203 465 1459 1212 456 1450 1203 466 1460 1213 466 1460 1213 456 1450 1203 457 1451 1204 543 1308 1083 458 1452 1205 544 1318 1093 544 1318 1093 458 1452 1205 467 1461 1214 458 1452 1205 459 1453 1206 467 1461 1214 467 1461 1214 459 1453 1206 468 1462 1215 459 1453 1206 460 1454 1207 468 1462 1215 468 1462 1215 460 1454 1207 469 1463 1216 460 1454 1207 461 1455 1208 469 1463 1216 469 1463 1216 461 1455 1208 470 1464 1217 461 1455 1208 462 1456 1209 470 1464 1217 470 1464 1217 462 1456 1209 471 1465 1218 462 1456 1209 463 1457 1210 471 1465 1218 471 1465 1218 463 1457 1210 472 1466 1219 463 1457 1210 464 1458 1211 472 1466 1219 472 1466 1219 464 1458 1211 473 1467 1220 473 1467 1220 464 1458 1211 474 1468 1221 474 1468 1221 464 1458 1211 465 1459 1212 475 1469 1222 474 1468 1221 466 1460 1213 466 1460 1213 474 1468 1221 465 1459 1212 544 1318 1093 467 1461 1214 545 1328 1103 545 1328 1103 467 1461 1214 476 1470 1223 467 1461 1214 468 1462 1215 476 1470 1223 476 1470 1223 468 1462 1215 477 1471 1224 468 1462 1215 469 1463 1216 477 1471 1224 477 1471 1224 469 1463 1216 478 1472 1225 469 1463 1216 470 1464 1217 478 1472 1225 478 1472 1225 470 1464 1217 479 1473 1226 470 1464 1217 471 1465 1218 479 1473 1226 479 1473 1226 471 1465 1218 480 1474 1227 471 1465 1218 472 1466 1219 480 1474 1227 480 1474 1227 472 1466 1219 481 1475 1228 472 1466 1219 473 1467 1220 481 1475 1228 481 1475 1228 473 1467 1220 482 1476 1229 482 1476 1229 473 1467 1220 483 1477 1230 483 1477 1230 473 1467 1220 474 1468 1221 483 1477 1230 474 1468 1221 484 1478 1231 484 1478 1231 474 1468 1221 475 1469 1222 503 1479 1232 457 1451 1204 504 1480 1233 504 1480 1233 457 1451 1204 448 1442 1195 505 1481 1234 466 1460 1213 503 1479 1232 503 1479 1232 466 1460 1213 457 1451 1204 491 1483 1236 488 1484 1237 507 1482 1235 507 1482 1235 488 1484 1237 502 1485 1238 488 1484 1237 547 1346 1121 502 1485 1238 502 1485 1238 547 1346 1121 549 1345 1120 619 1441 1194 506 1486 1239 448 1442 1195 448 1442 1195 506 1486 1239 504 1480 1233 487 1488 1241 496 1489 1242 497 1487 1240 497 1487 1240 496 1489 1242 521 1490 1243 547 1355 1121 488 1491 1237 548 1352 1127 548 1352 1127 488 1491 1237 498 1492 1244 490 1494 1246 489 1495 1247 500 1493 1245 500 1493 1245 489 1495 1247 499 1496 1248 488 1491 1237 491 1497 1236 498 1492 1244 498 1492 1244 491 1497 1236 501 1498 1249 491 1497 1236 490 1494 1246 501 1498 1249 501 1498 1249 490 1494 1246 500 1493 1245 489 1495 1247 487 1488 1241 499 1496 1248 499 1496 1248 487 1488 1241 497 1487 1240 475 1469 1222 507 1482 1235 484 1478 1231 484 1478 1231 507 1482 1235 485 1499 1250 466 1460 1213 505 1481 1234 475 1469 1222 475 1469 1222 505 1481 1234 507 1482 1235 507 1482 1235 502 1485 1238 485 1499 1250 485 1499 1250 502 1485 1238 486 1500 1251 546 1364 1136 486 1500 1251 549 1345 1120 549 1345 1120 486 1500 1251 502 1485 1238 504 1480 1233 487 1501 1241 503 1479 1232 503 1479 1232 487 1501 1241 489 1502 1247 503 1479 1232 489 1502 1247 505 1481 1234 505 1481 1234 489 1502 1247 490 1503 1246 490 1503 1246 491 1483 1236 505 1481 1234 505 1481 1234 491 1483 1236 507 1482 1235 506 1486 1239 496 1504 1242 504 1480 1233 504 1480 1233 496 1504 1242 487 1501 1241 511 1505 1252 508 1506 1253 512 1508 1255 512 1508 1255 508 1506 1253 509 1507 1254 508 1506 1253 622 1509 1256 509 1507 1254 509 1507 1254 622 1509 1256 625 1510 1257 512 1508 1255 509 1507 1254 540 1375 1143 540 1375 1143 509 1507 1254 539 1376 1144 509 1507 1254 625 1510 1257 539 1376 1144 539 1376 1144 625 1510 1257 626 1377 1145 508 1506 1253 511 1505 1252 510 1512 1259 510 1512 1259 511 1505 1252 513 1511 1258 513 1511 1258 496 1504 1242 510 1512 1259 510 1512 1259 496 1504 1242 506 1486 1239 622 1509 1256 508 1506 1253 621 1513 1260 621 1513 1260 508 1506 1253 510 1512 1259 619 1441 1194 621 1513 1260 506 1486 1239 506 1486 1239 621 1513 1260 510 1512 1259 520 1514 1261 512 1515 1255 541 1382 1150 541 1382 1150 512 1515 1255 540 1383 1143 518 1516 1262 511 1517 1252 520 1514 1261 520 1514 1261 511 1517 1252 512 1515 1255 519 1518 1263 513 1519 1258 518 1516 1262 518 1516 1262 513 1519 1258 511 1517 1252 534 1389 1153 535 1392 1156 493 1521 1265 493 1521 1265 535 1392 1156 514 1520 1264 494 1522 1266 516 1523 1267 492 1525 1269 492 1525 1269 516 1523 1267 515 1524 1268 493 1521 1265 514 1520 1264 495 1527 1271 495 1527 1271 514 1520 1264 517 1526 1270 495 1527 1271 517 1526 1270 494 1522 1266 494 1522 1266 517 1526 1270 516 1523 1267 520 1514 1261 541 1382 1150 527 1528 1272 527 1528 1272 541 1382 1150 538 1400 1164 525 1529 1273 518 1516 1262 527 1528 1272 527 1528 1272 518 1516 1262 520 1514 1261 526 1530 1274 519 1518 1263 525 1529 1273 525 1529 1273 519 1518 1263 518 1516 1262 521 1490 1243 492 1525 1269 497 1487 1240 497 1487 1240 492 1525 1269 515 1524 1268 513 1519 1258 519 1518 1263 496 1531 1242 496 1531 1242 519 1518 1263 521 1532 1243 515 1524 1268 529 1533 1275 497 1487 1240 497 1487 1240 529 1533 1275 499 1496 1248 493 1535 1265 495 1536 1271 523 1534 1276 523 1534 1276 495 1536 1271 522 1537 1277 534 1411 1153 493 1535 1265 536 1410 1170 536 1410 1170 493 1535 1265 523 1534 1276 495 1536 1271 494 1538 1266 522 1537 1277 522 1537 1277 494 1538 1266 524 1539 1278 492 1540 1269 521 1532 1243 526 1530 1274 526 1530 1274 521 1532 1243 519 1518 1263 523 1534 1276 522 1537 1277 528 1541 1279 528 1541 1279 522 1537 1277 527 1528 1272 537 1416 1173 536 1410 1170 528 1541 1279 528 1541 1279 536 1410 1170 523 1534 1276 522 1537 1277 524 1539 1278 527 1528 1272 527 1528 1272 524 1539 1278 525 1529 1273 525 1529 1273 524 1539 1278 526 1530 1274 526 1530 1274 524 1539 1278 492 1540 1269 492 1540 1269 524 1539 1278 494 1538 1266 527 1528 1272 538 1400 1164 528 1541 1279 528 1541 1279 538 1400 1164 537 1416 1173 530 1542 1280 531 1543 1281 500 1493 1245 500 1493 1245 531 1543 1281 501 1498 1249 530 1542 1280 516 1523 1267 531 1544 1281 531 1544 1281 516 1523 1267 517 1526 1270 531 1545 1281 532 1546 1282 501 1498 1249 501 1498 1249 532 1546 1282 498 1492 1244 517 1526 1270 514 1520 1264 531 1544 1281 531 1544 1281 514 1520 1264 532 1547 1282 532 1546 1282 550 1423 1177 498 1492 1244 498 1492 1244 550 1423 1177 548 1352 1127 532 1547 1282 514 1520 1264 550 1424 1177 550 1424 1177 514 1520 1264 535 1392 1156 529 1533 1275 530 1542 1280 499 1496 1248 499 1496 1248 530 1542 1280 500 1493 1245 515 1524 1268 516 1523 1267 529 1533 1275 529 1533 1275 516 1523 1267 530 1542 1280 481 1475 1228 551 1548 1283 480 1474 1227 480 1474 1227 551 1548 1283 552 1549 1284 480 1474 1227 552 1549 1284 479 1473 1226 479 1473 1226 552 1549 1284 553 1550 1285 479 1473 1226 553 1550 1285 478 1472 1225 478 1472 1225 553 1550 1285 554 1551 1286 478 1472 1225 554 1551 1286 477 1471 1224 477 1471 1224 554 1551 1286 555 1552 1287 477 1471 1224 555 1552 1287 476 1470 1223 476 1470 1223 555 1552 1287 556 1553 1288 476 1470 1223 556 1553 1288 545 1328 1103 545 1328 1103 556 1553 1288 557 1554 1289 545 1328 1103 557 1554 1289 383 1329 1104 383 1329 1104 557 1554 1289 558 1555 1290 383 1329 1104 558 1555 1290 384 1330 1105 384 1330 1105 558 1555 1290 559 1556 1291 384 1330 1105 559 1556 1291 385 1331 1106 385 1331 1106 559 1556 1291 560 1557 1292 385 1331 1106 560 1557 1292 386 1332 1107 386 1332 1107 560 1557 1292 561 1558 1293 386 1332 1107 561 1558 1293 387 1333 1108 387 1333 1108 561 1558 1293 562 1559 1294 387 1333 1108 562 1559 1294 388 1334 1109 388 1334 1109 562 1559 1294 563 1560 1295 388 1334 1109 563 1560 1295 389 1335 1110 389 1335 1110 563 1560 1295 564 1561 1296 389 1335 1110 564 1561 1296 390 1336 1111 390 1336 1111 564 1561 1296 565 1562 1297 390 1336 1111 565 1562 1297 391 1337 1112 391 1337 1112 565 1562 1297 566 1563 1298 391 1337 1112 566 1563 1298 392 1362 1134 392 1362 1134 566 1563 1298 567 1564 1299 392 1362 1134 567 1564 1299 393 1363 1135 393 1363 1135 567 1564 1299 568 1565 1300 393 1363 1135 568 1565 1300 546 1364 1136 546 1364 1136 568 1565 1300 569 1566 1301 546 1364 1136 569 1566 1301 486 1500 1251 486 1500 1251 569 1566 1301 570 1567 1302 486 1500 1251 570 1567 1302 485 1499 1250 485 1499 1250 570 1567 1302 571 1568 1303 485 1499 1250 571 1568 1303 484 1478 1231 484 1478 1231 571 1568 1303 572 1569 1304 484 1478 1231 572 1569 1304 483 1477 1230 483 1477 1230 572 1569 1304 573 1570 1305 483 1477 1230 573 1570 1305 482 1476 1229 482 1476 1229 573 1570 1305 574 1571 1306 482 1476 1229 574 1571 1306 481 1475 1228 481 1475 1228 574 1571 1306 551 1548 1283 551 1548 1283 575 1572 1307 552 1549 1284 552 1549 1284 575 1572 1307 553 1550 1285 553 1550 1285 575 1572 1307 554 1551 1286 554 1551 1286 575 1572 1307 555 1552 1287 555 1552 1287 575 1572 1307 556 1553 1288 556 1553 1288 575 1572 1307 557 1554 1289 557 1554 1289 575 1572 1307 558 1555 1290 558 1555 1290 575 1572 1307 559 1556 1291 559 1556 1291 575 1572 1307 560 1557 1292 560 1557 1292 575 1572 1307 561 1558 1293 561 1558 1293 575 1572 1307 562 1559 1294 562 1559 1294 575 1572 1307 563 1560 1295 563 1560 1295 575 1572 1307 564 1561 1296 564 1561 1296 575 1572 1307 565 1562 1297 565 1562 1297 575 1572 1307 566 1563 1298 566 1563 1298 575 1572 1307 567 1564 1299 567 1564 1299 575 1572 1307 568 1565 1300 568 1565 1300 575 1572 1307 569 1566 1301 569 1566 1301 575 1572 1307 570 1567 1302 570 1567 1302 575 1572 1307 571 1568 1303 571 1568 1303 575 1572 1307 572 1569 1304 572 1569 1304 575 1572 1307 573 1570 1305 573 1570 1305 575 1572 1307 574 1571 1306 574 1571 1306 575 1572 1307 551 1548 1283 580 1574 1308 579 1575 1309 627 1573 1141 627 1573 1141 579 1575 1309 623 1576 1142 579 1575 1309 576 1577 1310 623 1576 1142 623 1576 1142 576 1577 1310 624 1380 1148 624 1380 1148 576 1577 1310 620 1297 1072 620 1297 1072 576 1577 1310 577 1578 1311 620 1297 1072 577 1578 1311 618 1580 1070 618 1580 1070 577 1578 1311 578 1579 1312 618 1581 1070 578 1582 1312 616 1584 1068 616 1584 1068 578 1582 1312 601 1583 1313 616 1584 1068 601 1583 1313 614 1586 1066 614 1586 1066 601 1583 1313 600 1585 1314 614 1586 1066 600 1585 1314 612 1588 1064 612 1588 1064 600 1585 1314 599 1587 1315 612 1588 1064 599 1587 1315 610 1590 1061 610 1590 1061 599 1587 1315 598 1589 1316 610 1590 1061 598 1589 1316 608 1592 1060 608 1592 1060 598 1589 1316 597 1591 1317 608 1592 1060 597 1591 1317 605 1594 1058 605 1594 1058 597 1591 1317 596 1593 1318 605 1594 1058 596 1593 1318 606 1596 1056 606 1596 1056 596 1593 1318 595 1595 1319 606 1596 1056 595 1595 1319 604 1598 1053 604 1598 1053 595 1595 1319 594 1597 1320 604 1598 1053 594 1597 1320 603 1600 1178 603 1600 1178 594 1597 1320 593 1599 1321 603 1600 1178 593 1599 1321 602 1602 1180 602 1602 1180 593 1599 1321 592 1601 1322 602 1602 1180 592 1601 1322 607 1604 1182 607 1604 1182 592 1601 1322 591 1603 1323 607 1604 1182 591 1603 1323 609 1606 1184 609 1606 1184 591 1603 1323 590 1605 1324 609 1606 1184 590 1605 1324 611 1608 1186 611 1608 1186 590 1605 1324 589 1607 1325 611 1608 1186 589 1607 1325 613 1610 1188 613 1610 1188 589 1607 1325 588 1609 1326 613 1610 1188 588 1609 1326 615 1612 1190 615 1612 1190 588 1609 1326 587 1611 1327 587 1611 1327 586 1613 1328 615 1612 1190 615 1612 1190 586 1613 1328 617 1614 1192 586 1613 1328 585 1615 1329 617 1614 1192 617 1614 1192 585 1615 1329 619 1616 1194 585 1615 1329 584 1617 1330 619 1616 1194 619 1616 1194 584 1617 1330 621 1513 1260 621 1513 1260 584 1617 1330 622 1509 1256 622 1509 1256 584 1617 1330 583 1618 1331 622 1509 1256 583 1618 1331 625 1620 1257 625 1620 1257 583 1618 1331 582 1619 1332 625 1621 1257 582 1622 1332 626 1624 1145 626 1624 1145 582 1622 1332 581 1623 1333 581 1623 1333 580 1574 1308 626 1624 1145 626 1624 1145 580 1574 1308 627 1573 1141 349 1284 1059 350 1287 1062 608 1285 1060 608 1285 1060 350 1287 1062 610 1286 1061 600 1625 1314 601 1626 1313 652 1628 1335 652 1628 1335 601 1626 1313 653 1627 1334 578 1629 1312 630 1630 1336 601 1626 1313 601 1626 1313 630 1630 1336 653 1627 1334 577 1631 1311 629 1632 1337 578 1629 1312 578 1629 1312 629 1632 1337 630 1630 1336 576 1633 1310 628 1634 1338 577 1631 1311 577 1631 1311 628 1634 1338 629 1632 1337 576 1633 1310 579 1635 1309 628 1634 1338 628 1634 1338 579 1635 1309 631 1636 1339 579 1635 1309 580 1637 1308 631 1636 1339 631 1636 1339 580 1637 1308 632 1638 1340 580 1637 1308 581 1639 1333 632 1638 1340 632 1638 1340 581 1639 1333 633 1640 1341 582 1641 1332 634 1642 1342 581 1639 1333 581 1639 1333 634 1642 1342 633 1640 1341 583 1643 1331 635 1644 1343 582 1641 1332 582 1641 1332 635 1644 1343 634 1642 1342 584 1645 1330 636 1646 1344 583 1643 1331 583 1643 1331 636 1646 1344 635 1644 1343 584 1645 1330 585 1647 1329 636 1646 1344 636 1646 1344 585 1647 1329 637 1648 1345 585 1647 1329 586 1649 1328 637 1648 1345 637 1648 1345 586 1649 1328 638 1650 1346 586 1649 1328 587 1651 1327 638 1650 1346 638 1650 1346 587 1651 1327 639 1652 1347 587 1651 1327 588 1653 1326 639 1652 1347 639 1652 1347 588 1653 1326 640 1654 1348 588 1653 1326 589 1655 1325 640 1654 1348 640 1654 1348 589 1655 1325 641 1656 1349 589 1655 1325 590 1657 1324 641 1656 1349 641 1656 1349 590 1657 1324 642 1658 1350 590 1657 1324 591 1659 1323 642 1658 1350 642 1658 1350 591 1659 1323 643 1660 1351 591 1659 1323 592 1661 1322 643 1660 1351 643 1660 1351 592 1661 1322 644 1662 1352 592 1661 1322 593 1663 1321 644 1662 1352 644 1662 1352 593 1663 1321 645 1664 1353 593 1663 1321 594 1665 1320 645 1664 1353 645 1664 1353 594 1665 1320 646 1666 1354 594 1665 1320 595 1667 1319 646 1666 1354 646 1666 1354 595 1667 1319 647 1668 1355 595 1667 1319 596 1669 1318 647 1668 1355 647 1668 1355 596 1669 1318 648 1670 1356 596 1669 1318 597 1671 1317 648 1670 1356 648 1670 1356 597 1671 1317 649 1672 1357 597 1671 1317 598 1673 1316 649 1672 1357 649 1672 1357 598 1673 1316 650 1674 1358 598 1673 1316 599 1675 1315 650 1674 1358 650 1674 1358 599 1675 1315 651 1676 1359 599 1675 1315 600 1625 1314 651 1676 1359 651 1676 1359 600 1625 1314 652 1628 1335 639 1652 1347 640 1654 1348 665 1678 1361 665 1678 1361 640 1654 1348 666 1677 1360 640 1654 1348 641 1656 1349 666 1677 1360 666 1677 1360 641 1656 1349 667 1679 1362 641 1656 1349 642 1658 1350 667 1679 1362 667 1679 1362 642 1658 1350 668 1680 1363 642 1658 1350 643 1660 1351 668 1680 1363 668 1680 1363 643 1660 1351 669 1681 1364 643 1660 1351 644 1662 1352 669 1681 1364 669 1681 1364 644 1662 1352 670 1682 1365 644 1662 1352 645 1664 1353 670 1682 1365 670 1682 1365 645 1664 1353 671 1683 1366 645 1664 1353 646 1666 1354 671 1683 1366 671 1683 1366 646 1666 1354 672 1684 1367 646 1666 1354 647 1668 1355 672 1684 1367 672 1684 1367 647 1668 1355 673 1685 1368 647 1668 1355 648 1670 1356 673 1685 1368 673 1685 1368 648 1670 1356 674 1686 1369 648 1670 1356 649 1672 1357 674 1686 1369 674 1686 1369 649 1672 1357 675 1687 1370 649 1672 1357 650 1674 1358 675 1687 1370 675 1687 1370 650 1674 1358 676 1688 1371 650 1674 1358 651 1676 1359 676 1688 1371 676 1688 1371 651 1676 1359 677 1689 1372 651 1676 1359 652 1628 1335 677 1689 1372 677 1689 1372 652 1628 1335 678 1690 1373 652 1628 1335 653 1627 1334 678 1690 1373 678 1690 1373 653 1627 1334 679 1691 1374 630 1630 1336 656 1692 1375 653 1627 1334 653 1627 1334 656 1692 1375 679 1691 1374 629 1632 1337 655 1693 1376 630 1630 1336 630 1630 1336 655 1693 1376 656 1692 1375 628 1634 1338 654 1694 1377 629 1632 1337 629 1632 1337 654 1694 1377 655 1693 1376 628 1634 1338 631 1636 1339 654 1694 1377 654 1694 1377 631 1636 1339 657 1695 1378 631 1636 1339 632 1638 1340 657 1695 1378 657 1695 1378 632 1638 1340 658 1696 1379 632 1638 1340 633 1640 1341 658 1696 1379 658 1696 1379 633 1640 1341 659 1697 1380 633 1640 1341 634 1642 1342 659 1697 1380 659 1697 1380 634 1642 1342 660 1698 1381 635 1644 1343 661 1699 1382 634 1642 1342 634 1642 1342 661 1699 1382 660 1698 1381 636 1646 1344 662 1700 1383 635 1644 1343 635 1644 1343 662 1700 1383 661 1699 1382 636 1646 1344 637 1648 1345 662 1700 1383 662 1700 1383 637 1648 1345 663 1701 1384 637 1648 1345 638 1650 1346 663 1701 1384 663 1701 1384 638 1650 1346 664 1702 1385 638 1650 1346 639 1652 1347 664 1702 1385 664 1702 1385 639 1652 1347 665 1678 1361 655 1693 1376 654 1694 1377 681 1704 1387 681 1704 1387 654 1694 1377 680 1703 1386 657 1695 1378 683 1705 1388 654 1694 1377 654 1694 1377 683 1705 1388 680 1703 1386 657 1695 1378 658 1696 1379 683 1705 1388 683 1705 1388 658 1696 1379 684 1706 1389 658 1696 1379 659 1697 1380 684 1706 1389 684 1706 1389 659 1697 1380 685 1707 1390 659 1697 1380 660 1698 1381 685 1707 1390 685 1707 1390 660 1698 1381 686 1708 1391 660 1698 1381 661 1699 1382 686 1708 1391 686 1708 1391 661 1699 1382 687 1709 1392 661 1699 1382 662 1700 1383 687 1709 1392 687 1709 1392 662 1700 1383 688 1710 1393 663 1701 1384 689 1711 1394 662 1700 1383 662 1700 1383 689 1711 1394 688 1710 1393 663 1701 1384 664 1702 1385 689 1711 1394 689 1711 1394 664 1702 1385 690 1712 1395 664 1702 1385 665 1678 1361 690 1712 1395 690 1712 1395 665 1678 1361 691 1713 1396 665 1678 1361 666 1677 1360 691 1713 1396 691 1713 1396 666 1677 1360 692 1714 1397 666 1677 1360 667 1679 1362 692 1714 1397 692 1714 1397 667 1679 1362 693 1715 1398 667 1679 1362 668 1680 1363 693 1715 1398 693 1715 1398 668 1680 1363 694 1716 1399 668 1680 1363 669 1681 1364 694 1716 1399 694 1716 1399 669 1681 1364 695 1717 1400 669 1681 1364 670 1682 1365 695 1717 1400 695 1717 1400 670 1682 1365 696 1718 1401 670 1682 1365 671 1683 1366 696 1718 1401 696 1718 1401 671 1683 1366 697 1719 1402 671 1683 1366 672 1684 1367 697 1719 1402 697 1719 1402 672 1684 1367 698 1720 1403 672 1684 1367 673 1685 1368 698 1720 1403 698 1720 1403 673 1685 1368 699 1721 1404 673 1685 1368 674 1686 1369 699 1721 1404 699 1721 1404 674 1686 1369 700 1722 1405 674 1686 1369 675 1687 1370 700 1722 1405 700 1722 1405 675 1687 1370 701 1723 1406 675 1687 1370 676 1688 1371 701 1723 1406 701 1723 1406 676 1688 1371 702 1724 1407 676 1688 1371 677 1689 1372 702 1724 1407 702 1724 1407 677 1689 1372 703 1725 1408 677 1689 1372 678 1690 1373 703 1725 1408 703 1725 1408 678 1690 1373 704 1726 1409 678 1690 1373 679 1691 1374 704 1726 1409 704 1726 1409 679 1691 1374 705 1727 1410 679 1691 1374 656 1692 1375 705 1727 1410 705 1727 1410 656 1692 1375 682 1728 1411 656 1692 1375 655 1693 1376 682 1728 1411 682 1728 1411 655 1693 1376 681 1704 1387 685 1707 1390 711 1729 1412 684 1706 1389 684 1706 1389 711 1729 1412 710 1730 1413 685 1707 1390 686 1708 1391 711 1729 1412 711 1729 1412 686 1708 1391 712 1731 1414 686 1708 1391 687 1709 1392 712 1731 1414 712 1731 1414 687 1709 1392 713 1732 1415 687 1709 1392 688 1710 1393 713 1732 1415 713 1732 1415 688 1710 1393 714 1733 1416 689 1711 1394 715 1734 1417 688 1710 1393 688 1710 1393 715 1734 1417 714 1733 1416 690 1712 1395 716 1735 1418 689 1711 1394 689 1711 1394 716 1735 1418 715 1734 1417 691 1713 1396 717 1736 1419 690 1712 1395 690 1712 1395 717 1736 1419 716 1735 1418 691 1713 1396 692 1714 1397 717 1736 1419 717 1736 1419 692 1714 1397 718 1737 1420 692 1714 1397 693 1715 1398 718 1737 1420 718 1737 1420 693 1715 1398 719 1738 1421 693 1715 1398 694 1716 1399 719 1738 1421 719 1738 1421 694 1716 1399 720 1739 1422 694 1716 1399 695 1717 1400 720 1739 1422 720 1739 1422 695 1717 1400 721 1740 1423 695 1717 1400 696 1718 1401 721 1740 1423 721 1740 1423 696 1718 1401 722 1741 1424 696 1718 1401 697 1719 1402 722 1741 1424 722 1741 1424 697 1719 1402 723 1742 1425 697 1719 1402 698 1720 1403 723 1742 1425 723 1742 1425 698 1720 1403 724 1743 1426 698 1720 1403 699 1721 1404 724 1743 1426 724 1743 1426 699 1721 1404 725 1744 1427 699 1721 1404 700 1722 1405 725 1744 1427 725 1744 1427 700 1722 1405 726 1745 1428 700 1722 1405 701 1723 1406 726 1745 1428 726 1745 1428 701 1723 1406 727 1746 1429 701 1723 1406 702 1724 1407 727 1746 1429 727 1746 1429 702 1724 1407 728 1747 1430 702 1724 1407 703 1725 1408 728 1747 1430 728 1747 1430 703 1725 1408 729 1748 1431 703 1725 1408 704 1726 1409 729 1748 1431 729 1748 1431 704 1726 1409 730 1749 1432 704 1726 1409 705 1727 1410 730 1749 1432 730 1749 1432 705 1727 1410 731 1750 1433 705 1727 1410 682 1728 1411 731 1750 1433 731 1750 1433 682 1728 1411 708 1751 1434 682 1728 1411 681 1704 1387 708 1751 1434 708 1751 1434 681 1704 1387 707 1752 1435 681 1704 1387 680 1703 1386 707 1752 1435 707 1752 1435 680 1703 1386 706 1753 1436 683 1705 1388 709 1754 1437 680 1703 1386 680 1703 1386 709 1754 1437 706 1753 1436 684 1706 1389 710 1730 1413 683 1705 1388 683 1705 1388 710 1730 1413 709 1754 1437 2261 3124 1053 2263 3125 1056 2190 3127 1054 2190 3127 1054 2263 3125 1056 2004 3126 1055 2263 3125 1056 2262 3128 1058 2004 3126 1055 2004 3126 1055 2262 3128 1058 2005 3129 1057 2262 3128 1058 2265 3130 1060 2005 3129 1057 2005 3129 1057 2265 3130 1060 2006 3131 1059 2267 3132 1061 2269 3133 1064 2007 3135 1062 2007 3135 1062 2269 3133 1064 2008 3134 1063 2269 3133 1064 2271 3136 1066 2008 3134 1063 2008 3134 1063 2271 3136 1066 2009 3137 1065 2271 3136 1066 2273 3138 1068 2009 3137 1065 2009 3137 1065 2273 3138 1068 2010 3139 1067 2010 3139 1067 2273 3138 1068 2011 3141 1069 2011 3141 1069 2273 3138 1068 2275 3140 1070 2011 3141 1069 2275 3140 1070 2012 3143 1071 2012 3143 1071 2275 3140 1070 2277 3142 1072 2190 3127 1054 2004 3126 1055 2199 3145 1073 2199 3145 1073 2004 3126 1055 2013 3144 1074 2004 3126 1055 2005 3129 1057 2013 3144 1074 2013 3144 1074 2005 3129 1057 2014 3146 1075 2005 3129 1057 2006 3131 1059 2014 3146 1075 2014 3146 1075 2006 3131 1059 2015 3147 1076 2007 3135 1062 2016 3148 1077 2006 3131 1059 2006 3131 1059 2016 3148 1077 2015 3147 1076 2007 3135 1062 2008 3134 1063 2016 3148 1077 2016 3148 1077 2008 3134 1063 2017 3149 1078 2008 3134 1063 2009 3137 1065 2017 3149 1078 2017 3149 1078 2009 3137 1065 2018 3150 1079 2009 3137 1065 2010 3139 1067 2018 3150 1079 2018 3150 1079 2010 3139 1067 2019 3151 1080 2019 3151 1080 2010 3139 1067 2020 3152 1081 2020 3152 1081 2010 3139 1067 2011 3141 1069 2020 3152 1081 2011 3141 1069 2021 3153 1082 2021 3153 1082 2011 3141 1069 2012 3143 1071 2199 3145 1073 2013 3144 1074 2200 3155 1083 2200 3155 1083 2013 3144 1074 2022 3154 1084 2013 3144 1074 2014 3146 1075 2022 3154 1084 2022 3154 1084 2014 3146 1075 2023 3156 1085 2014 3146 1075 2015 3147 1076 2023 3156 1085 2023 3156 1085 2015 3147 1076 2024 3157 1086 2015 3147 1076 2016 3148 1077 2024 3157 1086 2024 3157 1086 2016 3148 1077 2025 3158 1087 2016 3148 1077 2017 3149 1078 2025 3158 1087 2025 3158 1087 2017 3149 1078 2026 3159 1088 2017 3149 1078 2018 3150 1079 2026 3159 1088 2026 3159 1088 2018 3150 1079 2027 3160 1089 2018 3150 1079 2019 3151 1080 2027 3160 1089 2027 3160 1089 2019 3151 1080 2028 3161 1090 2028 3161 1090 2019 3151 1080 2029 3162 1091 2029 3162 1091 2019 3151 1080 2020 3152 1081 2029 3162 1091 2020 3152 1081 2030 3163 1092 2030 3163 1092 2020 3152 1081 2021 3153 1082 2200 3155 1083 2022 3154 1084 2201 3165 1093 2201 3165 1093 2022 3154 1084 2031 3164 1094 2022 3154 1084 2023 3156 1085 2031 3164 1094 2031 3164 1094 2023 3156 1085 2032 3166 1095 2023 3156 1085 2024 3157 1086 2032 3166 1095 2032 3166 1095 2024 3157 1086 2033 3167 1096 2024 3157 1086 2025 3158 1087 2033 3167 1096 2033 3167 1096 2025 3158 1087 2034 3168 1097 2025 3158 1087 2026 3159 1088 2034 3168 1097 2034 3168 1097 2026 3159 1088 2035 3169 1098 2026 3159 1088 2027 3160 1089 2035 3169 1098 2035 3169 1098 2027 3160 1089 2036 3170 1099 2027 3160 1089 2028 3161 1090 2036 3170 1099 2036 3170 1099 2028 3161 1090 2037 3171 1100 2037 3171 1100 2028 3161 1090 2038 3172 1101 2038 3172 1101 2028 3161 1090 2029 3162 1091 2039 3173 1102 2038 3172 1101 2030 3163 1092 2030 3163 1092 2038 3172 1101 2029 3162 1091 2201 3165 1093 2031 3164 1094 2202 3175 1103 2202 3175 1103 2031 3164 1094 2040 3174 1104 2031 3164 1094 2032 3166 1095 2040 3174 1104 2040 3174 1104 2032 3166 1095 2041 3176 1105 2032 3166 1095 2033 3167 1096 2041 3176 1105 2041 3176 1105 2033 3167 1096 2042 3177 1106 2033 3167 1096 2034 3168 1097 2042 3177 1106 2042 3177 1106 2034 3168 1097 2043 3178 1107 2034 3168 1097 2035 3169 1098 2043 3178 1107 2043 3178 1107 2035 3169 1098 2044 3179 1108 2035 3169 1098 2036 3170 1099 2044 3179 1108 2044 3179 1108 2036 3170 1099 2045 3180 1109 2036 3170 1099 2037 3171 1100 2045 3180 1109 2045 3180 1109 2037 3171 1100 2046 3181 1110 2046 3181 1110 2037 3171 1100 2047 3182 1111 2047 3182 1111 2037 3171 1100 2038 3172 1101 2047 3182 1111 2038 3172 1101 2048 3183 1112 2048 3183 1112 2038 3172 1101 2039 3173 1102 2067 3184 1113 2021 3153 1082 2068 3185 1114 2068 3185 1114 2021 3153 1082 2012 3143 1071 2069 3186 1115 2030 3163 1092 2067 3184 1113 2067 3184 1113 2030 3163 1092 2021 3153 1082 2055 3188 1119 2052 3189 1118 2071 3187 1116 2071 3187 1116 2052 3189 1118 2066 3190 1117 2052 3189 1118 2204 3191 1121 2066 3190 1117 2066 3190 1117 2204 3191 1121 2206 3192 1120 2277 3142 1072 2070 3193 1122 2012 3143 1071 2012 3143 1071 2070 3193 1122 2068 3185 1114 2051 3195 1126 2060 3196 1125 2061 3194 1123 2061 3194 1123 2060 3196 1125 2085 3197 1124 2204 3199 1121 2052 3200 1118 2205 3198 1127 2205 3198 1127 2052 3200 1118 2062 3201 1128 2054 3203 1132 2053 3204 1131 2064 3202 1129 2064 3202 1129 2053 3204 1131 2063 3205 1130 2052 3200 1118 2055 3206 1119 2062 3201 1128 2062 3201 1128 2055 3206 1119 2065 3207 1133 2055 3206 1119 2054 3203 1132 2065 3207 1133 2065 3207 1133 2054 3203 1132 2064 3202 1129 2053 3204 1131 2051 3195 1126 2063 3205 1130 2063 3205 1130 2051 3195 1126 2061 3194 1123 2039 3173 1102 2071 3187 1116 2048 3183 1112 2048 3183 1112 2071 3187 1116 2049 3208 1134 2030 3163 1092 2069 3186 1115 2039 3173 1102 2039 3173 1102 2069 3186 1115 2071 3187 1116 2071 3187 1116 2066 3190 1117 2049 3208 1134 2049 3208 1134 2066 3190 1117 2050 3209 1135 2203 3210 1136 2050 3209 1135 2206 3192 1120 2206 3192 1120 2050 3209 1135 2066 3190 1117 2068 3185 1114 2051 3211 1126 2067 3184 1113 2067 3184 1113 2051 3211 1126 2053 3212 1131 2067 3184 1113 2053 3212 1131 2069 3186 1115 2069 3186 1115 2053 3212 1131 2054 3213 1132 2054 3213 1132 2055 3188 1119 2069 3186 1115 2069 3186 1115 2055 3188 1119 2071 3187 1116 2070 3193 1122 2060 3214 1125 2068 3185 1114 2068 3185 1114 2060 3214 1125 2051 3211 1126 2075 3215 1137 2072 3216 1140 2076 3218 1138 2076 3218 1138 2072 3216 1140 2073 3217 1139 2072 3216 1140 2280 3219 1142 2073 3217 1139 2073 3217 1139 2280 3219 1142 2284 3220 1141 2076 3218 1138 2073 3217 1139 2197 3222 1143 2197 3222 1143 2073 3217 1139 2196 3221 1144 2073 3217 1139 2284 3220 1141 2196 3221 1144 2196 3221 1144 2284 3220 1141 2283 3223 1145 2072 3216 1140 2075 3215 1137 2074 3225 1146 2074 3225 1146 2075 3215 1137 2077 3224 1147 2077 3224 1147 2060 3214 1125 2074 3225 1146 2074 3225 1146 2060 3214 1125 2070 3193 1122 2280 3219 1142 2072 3216 1140 2281 3226 1148 2281 3226 1148 2072 3216 1140 2074 3225 1146 2277 3142 1072 2281 3226 1148 2070 3193 1122 2070 3193 1122 2281 3226 1148 2074 3225 1146 2084 3227 1149 2076 3228 1138 2198 3230 1150 2198 3230 1150 2076 3228 1138 2197 3229 1143 2082 3231 1151 2075 3232 1137 2084 3227 1149 2084 3227 1149 2075 3232 1137 2076 3228 1138 2083 3233 1152 2077 3234 1147 2082 3231 1151 2082 3231 1151 2077 3234 1147 2075 3232 1137 2191 3235 1153 2192 3236 1156 2057 3238 1154 2057 3238 1154 2192 3236 1156 2078 3237 1155 2058 3239 1157 2080 3240 1160 2056 3242 1158 2056 3242 1158 2080 3240 1160 2079 3241 1159 2057 3238 1154 2078 3237 1155 2059 3244 1161 2059 3244 1161 2078 3237 1155 2081 3243 1162 2059 3244 1161 2081 3243 1162 2058 3239 1157 2058 3239 1157 2081 3243 1162 2080 3240 1160 2084 3227 1149 2198 3230 1150 2091 3245 1163 2091 3245 1163 2198 3230 1150 2195 3246 1164 2089 3247 1165 2082 3231 1151 2091 3245 1163 2091 3245 1163 2082 3231 1151 2084 3227 1149 2090 3248 1166 2083 3233 1152 2089 3247 1165 2089 3247 1165 2083 3233 1152 2082 3231 1151 2085 3197 1124 2056 3242 1158 2061 3194 1123 2061 3194 1123 2056 3242 1158 2079 3241 1159 2077 3234 1147 2083 3233 1152 2060 3249 1125 2060 3249 1125 2083 3233 1152 2085 3250 1124 2079 3241 1159 2093 3251 1167 2061 3194 1123 2061 3194 1123 2093 3251 1167 2063 3205 1130 2057 3253 1154 2059 3254 1161 2087 3252 1168 2087 3252 1168 2059 3254 1161 2086 3255 1169 2191 3257 1153 2057 3253 1154 2193 3256 1170 2193 3256 1170 2057 3253 1154 2087 3252 1168 2059 3254 1161 2058 3258 1157 2086 3255 1169 2086 3255 1169 2058 3258 1157 2088 3259 1171 2056 3260 1158 2085 3250 1124 2090 3248 1166 2090 3248 1166 2085 3250 1124 2083 3233 1152 2087 3252 1168 2086 3255 1169 2092 3261 1172 2092 3261 1172 2086 3255 1169 2091 3245 1163 2194 3262 1173 2193 3256 1170 2092 3261 1172 2092 3261 1172 2193 3256 1170 2087 3252 1168 2086 3255 1169 2088 3259 1171 2091 3245 1163 2091 3245 1163 2088 3259 1171 2089 3247 1165 2089 3247 1165 2088 3259 1171 2090 3248 1166 2090 3248 1166 2088 3259 1171 2056 3260 1158 2056 3260 1158 2088 3259 1171 2058 3258 1157 2091 3245 1163 2195 3246 1164 2092 3261 1172 2092 3261 1172 2195 3246 1164 2194 3262 1173 2094 3263 1175 2095 3264 1174 2064 3202 1129 2064 3202 1129 2095 3264 1174 2065 3207 1133 2094 3263 1175 2080 3240 1160 2095 3265 1174 2095 3265 1174 2080 3240 1160 2081 3243 1162 2095 3266 1174 2096 3267 1176 2065 3207 1133 2065 3207 1133 2096 3267 1176 2062 3201 1128 2081 3243 1162 2078 3237 1155 2095 3265 1174 2095 3265 1174 2078 3237 1155 2096 3268 1176 2096 3267 1176 2207 3269 1177 2062 3201 1128 2062 3201 1128 2207 3269 1177 2205 3198 1127 2096 3268 1176 2078 3237 1155 2207 3270 1177 2207 3270 1177 2078 3237 1155 2192 3236 1156 2093 3251 1167 2094 3263 1175 2063 3205 1130 2063 3205 1130 2094 3263 1175 2064 3202 1129 2079 3241 1159 2080 3240 1160 2093 3251 1167 2093 3251 1167 2080 3240 1160 2094 3263 1175 2261 3124 1053 2190 3127 1054 2260 3272 1178 2260 3272 1178 2190 3127 1054 2097 3271 1179 2260 3272 1178 2097 3271 1179 2259 3274 1180 2259 3274 1180 2097 3271 1179 2098 3273 1181 2259 3274 1180 2098 3273 1181 2264 3276 1182 2264 3276 1182 2098 3273 1181 2099 3275 1183 2264 3276 1182 2099 3275 1183 2266 3278 1184 2266 3278 1184 2099 3275 1183 2100 3277 1185 2266 3278 1184 2100 3277 1185 2268 3280 1186 2268 3280 1186 2100 3277 1185 2101 3279 1187 2268 3280 1186 2101 3279 1187 2270 3282 1188 2270 3282 1188 2101 3279 1187 2102 3281 1189 2270 3282 1188 2102 3281 1189 2272 3284 1190 2272 3284 1190 2102 3281 1189 2103 3283 1191 2103 3283 1191 2104 3285 1193 2272 3284 1190 2272 3284 1190 2104 3285 1193 2274 3286 1192 2104 3285 1193 2105 3287 1195 2274 3286 1192 2274 3286 1192 2105 3287 1195 2276 3288 1194 2190 3127 1054 2199 3145 1073 2097 3271 1179 2097 3271 1179 2199 3145 1073 2106 3289 1196 2097 3271 1179 2106 3289 1196 2098 3273 1181 2098 3273 1181 2106 3289 1196 2107 3290 1197 2098 3273 1181 2107 3290 1197 2099 3275 1183 2099 3275 1183 2107 3290 1197 2108 3291 1198 2099 3275 1183 2108 3291 1198 2100 3277 1185 2100 3277 1185 2108 3291 1198 2109 3292 1199 2100 3277 1185 2109 3292 1199 2101 3279 1187 2101 3279 1187 2109 3292 1199 2110 3293 1200 2101 3279 1187 2110 3293 1200 2102 3281 1189 2102 3281 1189 2110 3293 1200 2111 3294 1201 2102 3281 1189 2111 3294 1201 2103 3283 1191 2103 3283 1191 2111 3294 1201 2112 3295 1202 2112 3295 1202 2113 3296 1203 2103 3283 1191 2103 3283 1191 2113 3296 1203 2104 3285 1193 2113 3296 1203 2114 3297 1204 2104 3285 1193 2104 3285 1193 2114 3297 1204 2105 3287 1195 2199 3145 1073 2200 3155 1083 2106 3289 1196 2106 3289 1196 2200 3155 1083 2115 3298 1205 2106 3289 1196 2115 3298 1205 2107 3290 1197 2107 3290 1197 2115 3298 1205 2116 3299 1206 2107 3290 1197 2116 3299 1206 2108 3291 1198 2108 3291 1198 2116 3299 1206 2117 3300 1207 2108 3291 1198 2117 3300 1207 2109 3292 1199 2109 3292 1199 2117 3300 1207 2118 3301 1208 2109 3292 1199 2118 3301 1208 2110 3293 1200 2110 3293 1200 2118 3301 1208 2119 3302 1209 2110 3293 1200 2119 3302 1209 2111 3294 1201 2111 3294 1201 2119 3302 1209 2120 3303 1210 2111 3294 1201 2120 3303 1210 2112 3295 1202 2112 3295 1202 2120 3303 1210 2121 3304 1211 2121 3304 1211 2122 3305 1212 2112 3295 1202 2112 3295 1202 2122 3305 1212 2113 3296 1203 2122 3305 1212 2123 3306 1213 2113 3296 1203 2113 3296 1203 2123 3306 1213 2114 3297 1204 2200 3155 1083 2201 3165 1093 2115 3298 1205 2115 3298 1205 2201 3165 1093 2124 3307 1214 2115 3298 1205 2124 3307 1214 2116 3299 1206 2116 3299 1206 2124 3307 1214 2125 3308 1215 2116 3299 1206 2125 3308 1215 2117 3300 1207 2117 3300 1207 2125 3308 1215 2126 3309 1216 2117 3300 1207 2126 3309 1216 2118 3301 1208 2118 3301 1208 2126 3309 1216 2127 3310 1217 2118 3301 1208 2127 3310 1217 2119 3302 1209 2119 3302 1209 2127 3310 1217 2128 3311 1218 2119 3302 1209 2128 3311 1218 2120 3303 1210 2120 3303 1210 2128 3311 1218 2129 3312 1219 2120 3303 1210 2129 3312 1219 2121 3304 1211 2121 3304 1211 2129 3312 1219 2130 3313 1220 2130 3313 1220 2131 3314 1221 2121 3304 1211 2121 3304 1211 2131 3314 1221 2122 3305 1212 2132 3315 1222 2123 3306 1213 2131 3314 1221 2131 3314 1221 2123 3306 1213 2122 3305 1212 2201 3165 1093 2202 3175 1103 2124 3307 1214 2124 3307 1214 2202 3175 1103 2133 3316 1223 2124 3307 1214 2133 3316 1223 2125 3308 1215 2125 3308 1215 2133 3316 1223 2134 3317 1224 2125 3308 1215 2134 3317 1224 2126 3309 1216 2126 3309 1216 2134 3317 1224 2135 3318 1225 2126 3309 1216 2135 3318 1225 2127 3310 1217 2127 3310 1217 2135 3318 1225 2136 3319 1226 2127 3310 1217 2136 3319 1226 2128 3311 1218 2128 3311 1218 2136 3319 1226 2137 3320 1227 2128 3311 1218 2137 3320 1227 2129 3312 1219 2129 3312 1219 2137 3320 1227 2138 3321 1228 2129 3312 1219 2138 3321 1228 2130 3313 1220 2130 3313 1220 2138 3321 1228 2139 3322 1229 2139 3322 1229 2140 3323 1230 2130 3313 1220 2130 3313 1220 2140 3323 1230 2131 3314 1221 2140 3323 1230 2141 3324 1231 2131 3314 1221 2131 3314 1221 2141 3324 1231 2132 3315 1222 2160 3325 1232 2161 3326 1233 2114 3297 1204 2114 3297 1204 2161 3326 1233 2105 3287 1195 2162 3327 1234 2160 3325 1232 2123 3306 1213 2123 3306 1213 2160 3325 1232 2114 3297 1204 2159 3329 1238 2145 3330 1237 2164 3328 1235 2164 3328 1235 2145 3330 1237 2148 3331 1236 2206 3192 1120 2204 3191 1121 2159 3329 1238 2159 3329 1238 2204 3191 1121 2145 3330 1237 2161 3326 1233 2163 3332 1239 2105 3287 1195 2105 3287 1195 2163 3332 1239 2276 3288 1194 2178 3334 1243 2153 3335 1242 2154 3333 1240 2154 3333 1240 2153 3335 1242 2144 3336 1241 2155 3337 1244 2145 3338 1237 2205 3198 1127 2205 3198 1127 2145 3338 1237 2204 3199 1121 2156 3340 1248 2146 3341 1247 2157 3339 1245 2157 3339 1245 2146 3341 1247 2147 3342 1246 2158 3343 1249 2148 3344 1236 2155 3337 1244 2155 3337 1244 2148 3344 1236 2145 3338 1237 2157 3339 1245 2147 3342 1246 2158 3343 1249 2158 3343 1249 2147 3342 1246 2148 3344 1236 2154 3333 1240 2144 3336 1241 2156 3340 1248 2156 3340 1248 2144 3336 1241 2146 3341 1247 2142 3345 1250 2164 3328 1235 2141 3324 1231 2141 3324 1231 2164 3328 1235 2132 3315 1222 2164 3328 1235 2162 3327 1234 2132 3315 1222 2132 3315 1222 2162 3327 1234 2123 3306 1213 2143 3346 1251 2159 3329 1238 2142 3345 1250 2142 3345 1250 2159 3329 1238 2164 3328 1235 2159 3329 1238 2143 3346 1251 2206 3192 1120 2206 3192 1120 2143 3346 1251 2203 3210 1136 2161 3326 1233 2160 3325 1232 2144 3348 1241 2144 3348 1241 2160 3325 1232 2146 3347 1247 2160 3325 1232 2162 3327 1234 2146 3347 1247 2146 3347 1247 2162 3327 1234 2147 3349 1246 2164 3328 1235 2148 3331 1236 2162 3327 1234 2162 3327 1234 2148 3331 1236 2147 3349 1246 2163 3332 1239 2161 3326 1233 2153 3350 1242 2153 3350 1242 2161 3326 1233 2144 3348 1241 2168 3351 1252 2169 3352 1255 2165 3354 1253 2165 3354 1253 2169 3352 1255 2166 3353 1254 2165 3354 1253 2166 3353 1254 2279 3356 1256 2279 3356 1256 2166 3353 1254 2282 3355 1257 2169 3352 1255 2197 3222 1143 2166 3353 1254 2166 3353 1254 2197 3222 1143 2196 3221 1144 2166 3353 1254 2196 3221 1144 2282 3355 1257 2282 3355 1257 2196 3221 1144 2283 3223 1145 2165 3354 1253 2167 3357 1259 2168 3351 1252 2168 3351 1252 2167 3357 1259 2170 3358 1258 2163 3332 1239 2153 3350 1242 2167 3357 1259 2167 3357 1259 2153 3350 1242 2170 3358 1258 2167 3357 1259 2165 3354 1253 2278 3359 1260 2278 3359 1260 2165 3354 1253 2279 3356 1256 2276 3288 1194 2163 3332 1239 2278 3359 1260 2278 3359 1260 2163 3332 1239 2167 3357 1259 2177 3360 1261 2198 3230 1150 2169 3361 1255 2169 3361 1255 2198 3230 1150 2197 3229 1143 2175 3362 1262 2177 3360 1261 2168 3363 1252 2168 3363 1252 2177 3360 1261 2169 3361 1255 2176 3364 1263 2175 3362 1262 2170 3365 1258 2170 3365 1258 2175 3362 1262 2168 3363 1252 2191 3235 1153 2150 3366 1265 2192 3236 1156 2192 3236 1156 2150 3366 1265 2171 3367 1264 2151 3368 1266 2149 3369 1269 2173 3371 1267 2173 3371 1267 2149 3369 1269 2172 3370 1268 2150 3366 1265 2152 3372 1271 2171 3367 1264 2171 3367 1264 2152 3372 1271 2174 3373 1270 2152 3372 1271 2151 3368 1266 2174 3373 1270 2174 3373 1270 2151 3368 1266 2173 3371 1267 2195 3246 1164 2198 3230 1150 2184 3374 1272 2184 3374 1272 2198 3230 1150 2177 3360 1261 2182 3375 1273 2184 3374 1272 2175 3362 1262 2175 3362 1262 2184 3374 1272 2177 3360 1261 2183 3376 1274 2182 3375 1273 2176 3364 1263 2176 3364 1263 2182 3375 1273 2175 3362 1262 2178 3334 1243 2154 3333 1240 2149 3369 1269 2149 3369 1269 2154 3333 1240 2172 3370 1268 2178 3378 1243 2176 3364 1263 2153 3377 1242 2153 3377 1242 2176 3364 1263 2170 3365 1258 2156 3340 1248 2186 3379 1275 2154 3333 1240 2154 3333 1240 2186 3379 1275 2172 3370 1268 2179 3381 1277 2152 3382 1271 2180 3380 1276 2180 3380 1276 2152 3382 1271 2150 3383 1265 2180 3380 1276 2150 3383 1265 2193 3256 1170 2193 3256 1170 2150 3383 1265 2191 3257 1153 2181 3384 1278 2151 3385 1266 2179 3381 1277 2179 3381 1277 2151 3385 1266 2152 3382 1271 2176 3364 1263 2178 3378 1243 2183 3376 1274 2183 3376 1274 2178 3378 1243 2149 3386 1269 2180 3380 1276 2185 3387 1279 2179 3381 1277 2179 3381 1277 2185 3387 1279 2184 3374 1272 2194 3262 1173 2185 3387 1279 2193 3256 1170 2193 3256 1170 2185 3387 1279 2180 3380 1276 2182 3375 1273 2181 3384 1278 2184 3374 1272 2184 3374 1272 2181 3384 1278 2179 3381 1277 2182 3375 1273 2183 3376 1274 2181 3384 1278 2183 3376 1274 2149 3386 1269 2181 3384 1278 2181 3384 1278 2149 3386 1269 2151 3385 1266 2194 3262 1173 2195 3246 1164 2185 3387 1279 2185 3387 1279 2195 3246 1164 2184 3374 1272 2158 3343 1249 2188 3388 1281 2157 3339 1245 2157 3339 1245 2188 3388 1281 2187 3389 1280 2187 3389 1280 2188 3390 1281 2173 3371 1267 2173 3371 1267 2188 3390 1281 2174 3373 1270 2155 3337 1244 2189 3391 1282 2158 3343 1249 2158 3343 1249 2189 3391 1282 2188 3392 1281 2189 3393 1282 2171 3367 1264 2188 3390 1281 2188 3390 1281 2171 3367 1264 2174 3373 1270 2205 3198 1127 2207 3269 1177 2155 3337 1244 2155 3337 1244 2207 3269 1177 2189 3391 1282 2189 3393 1282 2207 3270 1177 2171 3367 1264 2171 3367 1264 2207 3270 1177 2192 3236 1156 2157 3339 1245 2187 3389 1280 2156 3340 1248 2156 3340 1248 2187 3389 1280 2186 3379 1275 2187 3389 1280 2173 3371 1267 2186 3379 1275 2186 3379 1275 2173 3371 1267 2172 3370 1268 2138 3321 1228 2137 3320 1227 2208 3395 1283 2208 3395 1283 2137 3320 1227 2209 3394 1284 2137 3320 1227 2136 3319 1226 2209 3394 1284 2209 3394 1284 2136 3319 1226 2210 3396 1285 2136 3319 1226 2135 3318 1225 2210 3396 1285 2210 3396 1285 2135 3318 1225 2211 3397 1286 2135 3318 1225 2134 3317 1224 2211 3397 1286 2211 3397 1286 2134 3317 1224 2212 3398 1287 2134 3317 1224 2133 3316 1223 2212 3398 1287 2212 3398 1287 2133 3316 1223 2213 3399 1288 2133 3316 1223 2202 3175 1103 2213 3399 1288 2213 3399 1288 2202 3175 1103 2214 3400 1289 2202 3175 1103 2040 3174 1104 2214 3400 1289 2214 3400 1289 2040 3174 1104 2215 3401 1290 2040 3174 1104 2041 3176 1105 2215 3401 1290 2215 3401 1290 2041 3176 1105 2216 3402 1291 2041 3176 1105 2042 3177 1106 2216 3402 1291 2216 3402 1291 2042 3177 1106 2217 3403 1292 2042 3177 1106 2043 3178 1107 2217 3403 1292 2217 3403 1292 2043 3178 1107 2218 3404 1293 2043 3178 1107 2044 3179 1108 2218 3404 1293 2218 3404 1293 2044 3179 1108 2219 3405 1294 2044 3179 1108 2045 3180 1109 2219 3405 1294 2219 3405 1294 2045 3180 1109 2220 3406 1295 2045 3180 1109 2046 3181 1110 2220 3406 1295 2220 3406 1295 2046 3181 1110 2221 3407 1296 2046 3181 1110 2047 3182 1111 2221 3407 1296 2221 3407 1296 2047 3182 1111 2222 3408 1297 2047 3182 1111 2048 3183 1112 2222 3408 1297 2222 3408 1297 2048 3183 1112 2223 3409 1298 2048 3183 1112 2049 3208 1134 2223 3409 1298 2223 3409 1298 2049 3208 1134 2224 3410 1299 2049 3208 1134 2050 3209 1135 2224 3410 1299 2224 3410 1299 2050 3209 1135 2225 3411 1300 2050 3209 1135 2203 3210 1136 2225 3411 1300 2225 3411 1300 2203 3210 1136 2226 3412 1301 2203 3210 1136 2143 3346 1251 2226 3412 1301 2226 3412 1301 2143 3346 1251 2227 3413 1302 2143 3346 1251 2142 3345 1250 2227 3413 1302 2227 3413 1302 2142 3345 1250 2228 3414 1303 2142 3345 1250 2141 3324 1231 2228 3414 1303 2228 3414 1303 2141 3324 1231 2229 3415 1304 2141 3324 1231 2140 3323 1230 2229 3415 1304 2229 3415 1304 2140 3323 1230 2230 3416 1305 2140 3323 1230 2139 3322 1229 2230 3416 1305 2230 3416 1305 2139 3322 1229 2231 3417 1306 2139 3322 1229 2138 3321 1228 2231 3417 1306 2231 3417 1306 2138 3321 1228 2208 3395 1283 2208 3395 1283 2209 3394 1284 2232 3418 1307 2209 3394 1284 2210 3396 1285 2232 3418 1307 2210 3396 1285 2211 3397 1286 2232 3418 1307 2211 3397 1286 2212 3398 1287 2232 3418 1307 2212 3398 1287 2213 3399 1288 2232 3418 1307 2213 3399 1288 2214 3400 1289 2232 3418 1307 2214 3400 1289 2215 3401 1290 2232 3418 1307 2215 3401 1290 2216 3402 1291 2232 3418 1307 2216 3402 1291 2217 3403 1292 2232 3418 1307 2217 3403 1292 2218 3404 1293 2232 3418 1307 2218 3404 1293 2219 3405 1294 2232 3418 1307 2219 3405 1294 2220 3406 1295 2232 3418 1307 2220 3406 1295 2221 3407 1296 2232 3418 1307 2221 3407 1296 2222 3408 1297 2232 3418 1307 2222 3408 1297 2223 3409 1298 2232 3418 1307 2223 3409 1298 2224 3410 1299 2232 3418 1307 2224 3410 1299 2225 3411 1300 2232 3418 1307 2225 3411 1300 2226 3412 1301 2232 3418 1307 2226 3412 1301 2227 3413 1302 2232 3418 1307 2227 3413 1302 2228 3414 1303 2232 3418 1307 2228 3414 1303 2229 3415 1304 2232 3418 1307 2229 3415 1304 2230 3416 1305 2232 3418 1307 2230 3416 1305 2231 3417 1306 2232 3418 1307 2231 3417 1306 2208 3395 1283 2232 3418 1307 2280 3420 1142 2236 3421 1309 2284 3419 1141 2284 3419 1141 2236 3421 1309 2237 3422 1308 2281 3226 1148 2233 3423 1310 2280 3420 1142 2280 3420 1142 2233 3423 1310 2236 3421 1309 2281 3226 1148 2277 3142 1072 2233 3423 1310 2233 3423 1310 2277 3142 1072 2234 3424 1311 2277 3142 1072 2275 3425 1070 2234 3424 1311 2234 3424 1311 2275 3425 1070 2235 3426 1312 2275 3427 1070 2273 3428 1068 2235 3430 1312 2235 3430 1312 2273 3428 1068 2258 3429 1313 2273 3428 1068 2271 3431 1066 2258 3429 1313 2258 3429 1313 2271 3431 1066 2257 3432 1314 2271 3431 1066 2269 3433 1064 2257 3432 1314 2257 3432 1314 2269 3433 1064 2256 3434 1315 2269 3433 1064 2267 3435 1061 2256 3434 1315 2256 3434 1315 2267 3435 1061 2255 3436 1316 2267 3435 1061 2265 3437 1060 2255 3436 1316 2255 3436 1316 2265 3437 1060 2254 3438 1317 2265 3437 1060 2262 3439 1058 2254 3438 1317 2254 3438 1317 2262 3439 1058 2253 3440 1318 2262 3439 1058 2263 3441 1056 2253 3440 1318 2253 3440 1318 2263 3441 1056 2252 3442 1319 2263 3441 1056 2261 3443 1053 2252 3442 1319 2252 3442 1319 2261 3443 1053 2251 3444 1320 2261 3443 1053 2260 3445 1178 2251 3444 1320 2251 3444 1320 2260 3445 1178 2250 3446 1321 2260 3445 1178 2259 3447 1180 2250 3446 1321 2250 3446 1321 2259 3447 1180 2249 3448 1322 2259 3447 1180 2264 3449 1182 2249 3448 1322 2249 3448 1322 2264 3449 1182 2248 3450 1323 2264 3449 1182 2266 3451 1184 2248 3450 1323 2248 3450 1323 2266 3451 1184 2247 3452 1324 2266 3451 1184 2268 3453 1186 2247 3452 1324 2247 3452 1324 2268 3453 1186 2246 3454 1325 2268 3453 1186 2270 3455 1188 2246 3454 1325 2246 3454 1325 2270 3455 1188 2245 3456 1326 2270 3455 1188 2272 3457 1190 2245 3456 1326 2245 3456 1326 2272 3457 1190 2244 3458 1327 2274 3459 1192 2243 3460 1328 2272 3457 1190 2272 3457 1190 2243 3460 1328 2244 3458 1327 2276 3461 1194 2242 3462 1329 2274 3459 1192 2274 3459 1192 2242 3462 1329 2243 3460 1328 2278 3359 1260 2241 3463 1330 2276 3461 1194 2276 3461 1194 2241 3463 1330 2242 3462 1329 2278 3359 1260 2279 3356 1256 2241 3463 1330 2241 3463 1330 2279 3356 1256 2240 3464 1331 2279 3356 1256 2282 3465 1257 2240 3464 1331 2240 3464 1331 2282 3465 1257 2239 3466 1332 2282 3467 1257 2283 3468 1145 2239 3470 1332 2239 3470 1332 2283 3468 1145 2238 3469 1333 2284 3419 1141 2237 3422 1308 2283 3468 1145 2283 3468 1145 2237 3422 1308 2238 3469 1333 2006 3131 1059 2265 3130 1060 2007 3135 1062 2007 3135 1062 2265 3130 1060 2267 3132 1061 2257 3471 1314 2309 3472 1335 2258 3474 1313 2258 3474 1313 2309 3472 1335 2310 3473 1334 2310 3473 1334 2287 3475 1336 2258 3474 1313 2258 3474 1313 2287 3475 1336 2235 3476 1312 2287 3475 1336 2286 3477 1337 2235 3476 1312 2235 3476 1312 2286 3477 1337 2234 3478 1311 2286 3477 1337 2285 3479 1338 2234 3478 1311 2234 3478 1311 2285 3479 1338 2233 3480 1310 2233 3480 1310 2285 3479 1338 2236 3482 1309 2236 3482 1309 2285 3479 1338 2288 3481 1339 2236 3482 1309 2288 3481 1339 2237 3484 1308 2237 3484 1308 2288 3481 1339 2289 3483 1340 2237 3484 1308 2289 3483 1340 2238 3486 1333 2238 3486 1333 2289 3483 1340 2290 3485 1341 2290 3485 1341 2291 3487 1342 2238 3486 1333 2238 3486 1333 2291 3487 1342 2239 3488 1332 2291 3487 1342 2292 3489 1343 2239 3488 1332 2239 3488 1332 2292 3489 1343 2240 3490 1331 2292 3489 1343 2293 3491 1344 2240 3490 1331 2240 3490 1331 2293 3491 1344 2241 3492 1330 2241 3492 1330 2293 3491 1344 2242 3494 1329 2242 3494 1329 2293 3491 1344 2294 3493 1345 2242 3494 1329 2294 3493 1345 2243 3496 1328 2243 3496 1328 2294 3493 1345 2295 3495 1346 2243 3496 1328 2295 3495 1346 2244 3498 1327 2244 3498 1327 2295 3495 1346 2296 3497 1347 2244 3498 1327 2296 3497 1347 2245 3500 1326 2245 3500 1326 2296 3497 1347 2297 3499 1348 2245 3500 1326 2297 3499 1348 2246 3502 1325 2246 3502 1325 2297 3499 1348 2298 3501 1349 2246 3502 1325 2298 3501 1349 2247 3504 1324 2247 3504 1324 2298 3501 1349 2299 3503 1350 2247 3504 1324 2299 3503 1350 2248 3506 1323 2248 3506 1323 2299 3503 1350 2300 3505 1351 2248 3506 1323 2300 3505 1351 2249 3508 1322 2249 3508 1322 2300 3505 1351 2301 3507 1352 2249 3508 1322 2301 3507 1352 2250 3510 1321 2250 3510 1321 2301 3507 1352 2302 3509 1353 2250 3510 1321 2302 3509 1353 2251 3512 1320 2251 3512 1320 2302 3509 1353 2303 3511 1354 2251 3512 1320 2303 3511 1354 2252 3514 1319 2252 3514 1319 2303 3511 1354 2304 3513 1355 2252 3514 1319 2304 3513 1355 2253 3516 1318 2253 3516 1318 2304 3513 1355 2305 3515 1356 2253 3516 1318 2305 3515 1356 2254 3518 1317 2254 3518 1317 2305 3515 1356 2306 3517 1357 2254 3518 1317 2306 3517 1357 2255 3520 1316 2255 3520 1316 2306 3517 1357 2307 3519 1358 2255 3520 1316 2307 3519 1358 2256 3522 1315 2256 3522 1315 2307 3519 1358 2308 3521 1359 2256 3522 1315 2308 3521 1359 2257 3471 1314 2257 3471 1314 2308 3521 1359 2309 3472 1335 2296 3497 1347 2322 3523 1361 2297 3499 1348 2297 3499 1348 2322 3523 1361 2323 3524 1360 2297 3499 1348 2323 3524 1360 2298 3501 1349 2298 3501 1349 2323 3524 1360 2324 3525 1362 2298 3501 1349 2324 3525 1362 2299 3503 1350 2299 3503 1350 2324 3525 1362 2325 3526 1363 2299 3503 1350 2325 3526 1363 2300 3505 1351 2300 3505 1351 2325 3526 1363 2326 3527 1364 2300 3505 1351 2326 3527 1364 2301 3507 1352 2301 3507 1352 2326 3527 1364 2327 3528 1365 2301 3507 1352 2327 3528 1365 2302 3509 1353 2302 3509 1353 2327 3528 1365 2328 3529 1366 2302 3509 1353 2328 3529 1366 2303 3511 1354 2303 3511 1354 2328 3529 1366 2329 3530 1367 2303 3511 1354 2329 3530 1367 2304 3513 1355 2304 3513 1355 2329 3530 1367 2330 3531 1368 2304 3513 1355 2330 3531 1368 2305 3515 1356 2305 3515 1356 2330 3531 1368 2331 3532 1369 2305 3515 1356 2331 3532 1369 2306 3517 1357 2306 3517 1357 2331 3532 1369 2332 3533 1370 2306 3517 1357 2332 3533 1370 2307 3519 1358 2307 3519 1358 2332 3533 1370 2333 3534 1371 2307 3519 1358 2333 3534 1371 2308 3521 1359 2308 3521 1359 2333 3534 1371 2334 3535 1372 2308 3521 1359 2334 3535 1372 2309 3472 1335 2309 3472 1335 2334 3535 1372 2335 3536 1373 2309 3472 1335 2335 3536 1373 2310 3473 1334 2310 3473 1334 2335 3536 1373 2336 3537 1374 2336 3537 1374 2313 3538 1375 2310 3473 1334 2310 3473 1334 2313 3538 1375 2287 3475 1336 2313 3538 1375 2312 3539 1376 2287 3475 1336 2287 3475 1336 2312 3539 1376 2286 3477 1337 2312 3539 1376 2311 3540 1377 2286 3477 1337 2286 3477 1337 2311 3540 1377 2285 3479 1338 2285 3479 1338 2311 3540 1377 2288 3481 1339 2288 3481 1339 2311 3540 1377 2314 3541 1378 2288 3481 1339 2314 3541 1378 2289 3483 1340 2289 3483 1340 2314 3541 1378 2315 3542 1379 2289 3483 1340 2315 3542 1379 2290 3485 1341 2290 3485 1341 2315 3542 1379 2316 3543 1380 2290 3485 1341 2316 3543 1380 2291 3487 1342 2291 3487 1342 2316 3543 1380 2317 3544 1381 2317 3544 1381 2318 3545 1382 2291 3487 1342 2291 3487 1342 2318 3545 1382 2292 3489 1343 2318 3545 1382 2319 3546 1383 2292 3489 1343 2292 3489 1343 2319 3546 1383 2293 3491 1344 2293 3491 1344 2319 3546 1383 2294 3493 1345 2294 3493 1345 2319 3546 1383 2320 3547 1384 2294 3493 1345 2320 3547 1384 2295 3495 1346 2295 3495 1346 2320 3547 1384 2321 3548 1385 2295 3495 1346 2321 3548 1385 2296 3497 1347 2296 3497 1347 2321 3548 1385 2322 3523 1361 2312 3539 1376 2338 3549 1387 2311 3540 1377 2311 3540 1377 2338 3549 1387 2337 3550 1386 2337 3550 1386 2340 3551 1388 2311 3540 1377 2311 3540 1377 2340 3551 1388 2314 3541 1378 2314 3541 1378 2340 3551 1388 2315 3542 1379 2315 3542 1379 2340 3551 1388 2341 3552 1389 2315 3542 1379 2341 3552 1389 2316 3543 1380 2316 3543 1380 2341 3552 1389 2342 3553 1390 2316 3543 1380 2342 3553 1390 2317 3544 1381 2317 3544 1381 2342 3553 1390 2343 3554 1391 2317 3544 1381 2343 3554 1391 2318 3545 1382 2318 3545 1382 2343 3554 1391 2344 3555 1392 2318 3545 1382 2344 3555 1392 2319 3546 1383 2319 3546 1383 2344 3555 1392 2345 3556 1393 2345 3556 1393 2346 3557 1394 2319 3546 1383 2319 3546 1383 2346 3557 1394 2320 3547 1384 2320 3547 1384 2346 3557 1394 2321 3548 1385 2321 3548 1385 2346 3557 1394 2347 3558 1395 2321 3548 1385 2347 3558 1395 2322 3523 1361 2322 3523 1361 2347 3558 1395 2348 3559 1396 2322 3523 1361 2348 3559 1396 2323 3524 1360 2323 3524 1360 2348 3559 1396 2349 3560 1397 2323 3524 1360 2349 3560 1397 2324 3525 1362 2324 3525 1362 2349 3560 1397 2350 3561 1398 2324 3525 1362 2350 3561 1398 2325 3526 1363 2325 3526 1363 2350 3561 1398 2351 3562 1399 2325 3526 1363 2351 3562 1399 2326 3527 1364 2326 3527 1364 2351 3562 1399 2352 3563 1400 2326 3527 1364 2352 3563 1400 2327 3528 1365 2327 3528 1365 2352 3563 1400 2353 3564 1401 2327 3528 1365 2353 3564 1401 2328 3529 1366 2328 3529 1366 2353 3564 1401 2354 3565 1402 2328 3529 1366 2354 3565 1402 2329 3530 1367 2329 3530 1367 2354 3565 1402 2355 3566 1403 2329 3530 1367 2355 3566 1403 2330 3531 1368 2330 3531 1368 2355 3566 1403 2356 3567 1404 2330 3531 1368 2356 3567 1404 2331 3532 1369 2331 3532 1369 2356 3567 1404 2357 3568 1405 2331 3532 1369 2357 3568 1405 2332 3533 1370 2332 3533 1370 2357 3568 1405 2358 3569 1406 2332 3533 1370 2358 3569 1406 2333 3534 1371 2333 3534 1371 2358 3569 1406 2359 3570 1407 2333 3534 1371 2359 3570 1407 2334 3535 1372 2334 3535 1372 2359 3570 1407 2360 3571 1408 2334 3535 1372 2360 3571 1408 2335 3536 1373 2335 3536 1373 2360 3571 1408 2361 3572 1409 2335 3536 1373 2361 3572 1409 2336 3537 1374 2336 3537 1374 2361 3572 1409 2362 3573 1410 2336 3537 1374 2362 3573 1410 2313 3538 1375 2313 3538 1375 2362 3573 1410 2339 3574 1411 2313 3538 1375 2339 3574 1411 2312 3539 1376 2312 3539 1376 2339 3574 1411 2338 3549 1387 2367 3575 1413 2368 3576 1412 2341 3552 1389 2341 3552 1389 2368 3576 1412 2342 3553 1390 2342 3553 1390 2368 3576 1412 2343 3554 1391 2343 3554 1391 2368 3576 1412 2369 3577 1414 2343 3554 1391 2369 3577 1414 2344 3555 1392 2344 3555 1392 2369 3577 1414 2370 3578 1415 2344 3555 1392 2370 3578 1415 2345 3556 1393 2345 3556 1393 2370 3578 1415 2371 3579 1416 2371 3579 1416 2372 3580 1417 2345 3556 1393 2345 3556 1393 2372 3580 1417 2346 3557 1394 2372 3580 1417 2373 3581 1418 2346 3557 1394 2346 3557 1394 2373 3581 1418 2347 3558 1395 2373 3581 1418 2374 3582 1419 2347 3558 1395 2347 3558 1395 2374 3582 1419 2348 3559 1396 2348 3559 1396 2374 3582 1419 2349 3560 1397 2349 3560 1397 2374 3582 1419 2375 3583 1420 2349 3560 1397 2375 3583 1420 2350 3561 1398 2350 3561 1398 2375 3583 1420 2376 3584 1421 2350 3561 1398 2376 3584 1421 2351 3562 1399 2351 3562 1399 2376 3584 1421 2377 3585 1422 2351 3562 1399 2377 3585 1422 2352 3563 1400 2352 3563 1400 2377 3585 1422 2378 3586 1423 2352 3563 1400 2378 3586 1423 2353 3564 1401 2353 3564 1401 2378 3586 1423 2379 3587 1424 2353 3564 1401 2379 3587 1424 2354 3565 1402 2354 3565 1402 2379 3587 1424 2380 3588 1425 2354 3565 1402 2380 3588 1425 2355 3566 1403 2355 3566 1403 2380 3588 1425 2381 3589 1426 2355 3566 1403 2381 3589 1426 2356 3567 1404 2356 3567 1404 2381 3589 1426 2382 3590 1427 2356 3567 1404 2382 3590 1427 2357 3568 1405 2357 3568 1405 2382 3590 1427 2383 3591 1428 2357 3568 1405 2383 3591 1428 2358 3569 1406 2358 3569 1406 2383 3591 1428 2384 3592 1429 2358 3569 1406 2384 3592 1429 2359 3570 1407 2359 3570 1407 2384 3592 1429 2385 3593 1430 2359 3570 1407 2385 3593 1430 2360 3571 1408 2360 3571 1408 2385 3593 1430 2386 3594 1431 2360 3571 1408 2386 3594 1431 2361 3572 1409 2361 3572 1409 2386 3594 1431 2387 3595 1432 2361 3572 1409 2387 3595 1432 2362 3573 1410 2362 3573 1410 2387 3595 1432 2388 3596 1433 2362 3573 1410 2388 3596 1433 2339 3574 1411 2339 3574 1411 2388 3596 1433 2365 3597 1434 2339 3574 1411 2365 3597 1434 2338 3549 1387 2338 3549 1387 2365 3597 1434 2364 3598 1435 2338 3549 1387 2364 3598 1435 2337 3550 1386 2337 3550 1386 2364 3598 1435 2363 3599 1436 2363 3599 1436 2366 3600 1437 2337 3550 1386 2337 3550 1386 2366 3600 1437 2340 3551 1388 2366 3600 1437 2367 3575 1413 2340 3551 1388 2340 3551 1388 2367 3575 1413 2341 3552 1389</p>
+ </triangles>
+ <triangles material="HeadphonesSG4" count="260">
+ <input semantic="VERTEX" source="#Headphones-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Headphones-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Headphones-headphonesUV" offset="2" set="1"/>
+ <p>964 1755 1438 967 1756 1439 965 1758 1441 965 1758 1441 967 1756 1439 966 1757 1440 945 1759 1442 969 1760 1443 946 1762 1445 946 1762 1445 969 1760 1443 968 1761 1444 953 1763 1446 971 1764 1447 954 1766 1449 954 1766 1449 971 1764 1447 970 1765 1448 949 1767 1450 973 1768 1451 950 1770 1453 950 1770 1453 973 1768 1451 972 1769 1452 959 1771 1454 975 1772 1455 960 1774 1457 960 1774 1457 975 1772 1455 974 1773 1456 943 1775 1458 977 1776 1459 944 1778 1461 944 1778 1461 977 1776 1459 976 1777 1460 954 1766 1449 970 1765 1448 955 1780 1463 955 1780 1463 970 1765 1448 978 1779 1462 940 1781 1464 980 1782 1465 941 1784 1467 941 1784 1467 980 1782 1465 979 1783 1466 961 1785 1468 982 1786 1469 962 1788 1471 962 1788 1471 982 1786 1469 981 1787 1470 960 1774 1457 974 1773 1456 961 1785 1468 961 1785 1468 974 1773 1456 982 1786 1469 963 1789 1472 983 1790 1473 964 1755 1438 964 1755 1438 983 1790 1473 967 1756 1439 947 1791 1474 985 1792 1475 948 1794 1477 948 1794 1477 985 1792 1475 984 1793 1476 957 1795 1478 987 1796 1479 958 1798 1481 958 1798 1481 987 1796 1479 986 1797 1480 950 1770 1453 972 1769 1452 951 1800 1483 951 1800 1483 972 1769 1452 988 1799 1482 962 1788 1471 981 1787 1470 963 1789 1472 963 1789 1472 981 1787 1470 983 1790 1473 942 1801 1484 989 1802 1485 943 1775 1458 943 1775 1458 989 1802 1485 977 1776 1459 958 1798 1481 986 1797 1480 959 1771 1454 959 1771 1454 986 1797 1480 975 1772 1455 955 1780 1463 978 1779 1462 956 1804 1487 956 1804 1487 978 1779 1462 990 1803 1486 951 1800 1483 988 1799 1482 952 1806 1489 952 1806 1489 988 1799 1482 991 1805 1488 944 1778 1461 976 1777 1460 945 1759 1442 945 1759 1442 976 1777 1460 969 1760 1443 956 1804 1487 990 1803 1486 957 1795 1478 957 1795 1478 990 1803 1486 987 1796 1479 941 1784 1467 979 1783 1466 942 1801 1484 942 1801 1484 979 1783 1466 989 1802 1485 948 1794 1477 984 1793 1476 949 1767 1450 949 1767 1450 984 1793 1476 973 1768 1451 952 1806 1489 991 1805 1488 953 1763 1446 953 1763 1446 991 1805 1488 971 1764 1447 946 1762 1445 968 1761 1444 947 1791 1474 947 1791 1474 968 1761 1444 985 1792 1475 965 1758 1441 966 1757 1440 940 1781 1464 940 1781 1464 966 1757 1440 980 1782 1465 1002 1808 1490 1003 1809 1491 990 1807 1486 990 1807 1486 1003 1809 1491 987 1810 1479 971 1811 1447 1001 1812 1492 970 1813 1448 991 1814 1488 1000 1815 1493 971 1811 1447 971 1811 1447 1000 1815 1493 1001 1812 1492 985 1816 1475 998 1817 1494 984 1818 1476 984 1818 1476 998 1817 1494 973 1820 1451 973 1820 1451 998 1817 1494 999 1819 1495 973 1820 1451 999 1819 1495 972 1821 1452 968 1822 1444 997 1823 1496 985 1816 1475 985 1816 1475 997 1823 1496 998 1817 1494 967 1824 1439 993 1825 1497 966 1827 1440 966 1827 1440 993 1825 1497 994 1826 1498 970 1813 1448 1001 1812 1492 978 1828 1462 978 1828 1462 1001 1812 1492 1002 1808 1490 978 1828 1462 1002 1808 1490 990 1807 1486 979 1829 1466 995 1830 1499 989 1831 1485 982 1832 1469 992 1833 1500 981 1834 1470 975 1835 1455 1004 1836 1501 974 1837 1456 986 1838 1480 1003 1809 1491 975 1835 1455 975 1835 1455 1003 1809 1491 1004 1836 1501 976 1839 1460 996 1840 1502 969 1841 1443 969 1841 1443 996 1840 1502 997 1823 1496 981 1834 1470 992 1833 1500 983 1842 1473 983 1842 1473 992 1833 1500 993 1825 1497 999 1819 1495 1000 1815 1493 972 1821 1452 972 1821 1452 1000 1815 1493 988 1843 1482 987 1810 1479 1003 1809 1491 986 1838 1480 966 1827 1440 994 1826 1498 980 1844 1465 977 1845 1459 996 1840 1502 976 1839 1460 989 1831 1485 995 1830 1499 977 1845 1459 977 1845 1459 995 1830 1499 996 1840 1502 1004 1836 1501 992 1833 1500 974 1837 1456 974 1837 1456 992 1833 1500 982 1832 1469 988 1843 1482 1000 1815 1493 991 1814 1488 969 1841 1443 997 1823 1496 968 1822 1444 983 1842 1473 993 1825 1497 967 1824 1439 994 1826 1498 995 1830 1499 980 1844 1465 980 1844 1465 995 1830 1499 979 1829 1466 1001 1812 1492 1006 1846 1503 1002 1808 1490 1002 1808 1490 1006 1846 1503 1005 1847 1504 998 1817 1494 1008 1848 1505 999 1819 1495 999 1819 1495 1008 1848 1505 1007 1849 1506 1010 1850 1507 1009 1851 1508 994 1826 1498 994 1826 1498 1009 1851 1508 995 1830 1499 993 1825 1497 1011 1852 1509 994 1826 1498 994 1826 1498 1011 1852 1509 1010 1850 1507 996 1840 1502 1013 1853 1510 997 1823 1496 997 1823 1496 1013 1853 1510 1012 1854 1511 997 1823 1496 1012 1854 1511 998 1817 1494 998 1817 1494 1012 1854 1511 1008 1848 1505 1007 1849 1506 1014 1855 1512 999 1819 1495 999 1819 1495 1014 1855 1512 1000 1815 1493 995 1830 1499 1009 1851 1508 996 1840 1502 996 1840 1502 1009 1851 1508 1013 1853 1510 1000 1815 1493 1014 1855 1512 1001 1812 1492 1001 1812 1492 1014 1855 1512 1006 1846 1503 1005 1847 1504 1015 1856 1513 1002 1808 1490 1002 1808 1490 1015 1856 1513 1003 1809 1491 992 1833 1500 1016 1857 1514 993 1825 1497 993 1825 1497 1016 1857 1514 1011 1852 1509 1017 1858 1515 1016 1857 1514 1004 1836 1501 1004 1836 1501 1016 1857 1514 992 1833 1500 1003 1809 1491 1015 1856 1513 1004 1836 1501 1004 1836 1501 1015 1856 1513 1017 1858 1515 1007 1849 1506 1008 1848 1505 1014 1855 1512 1014 1855 1512 1008 1848 1505 1018 1859 1516 1013 1853 1510 1009 1851 1508 1018 1859 1516 1018 1859 1516 1009 1851 1508 1010 1850 1507 1010 1850 1507 1011 1852 1509 1018 1859 1516 1018 1859 1516 1011 1852 1509 1016 1857 1514 1015 1856 1513 1018 1859 1516 1017 1858 1515 1018 1859 1516 1016 1857 1514 1017 1858 1515 1014 1855 1512 1018 1859 1516 1006 1846 1503 1005 1847 1504 1006 1846 1503 1015 1856 1513 1015 1856 1513 1006 1846 1503 1018 1859 1516 1012 1854 1511 1013 1853 1510 1008 1848 1505 1008 1848 1505 1013 1853 1510 1018 1859 1516 2621 3601 1438 2622 3602 1441 2624 3604 1439 2624 3604 1439 2622 3602 1441 2623 3603 1440 2602 3605 1442 2603 3606 1445 2626 3608 1443 2626 3608 1443 2603 3606 1445 2625 3607 1444 2610 3609 1446 2611 3610 1449 2628 3612 1447 2628 3612 1447 2611 3610 1449 2627 3611 1448 2606 3613 1450 2607 3614 1453 2630 3616 1451 2630 3616 1451 2607 3614 1453 2629 3615 1452 2616 3617 1454 2617 3618 1457 2632 3620 1455 2632 3620 1455 2617 3618 1457 2631 3619 1456 2600 3621 1458 2601 3622 1461 2634 3624 1459 2634 3624 1459 2601 3622 1461 2633 3623 1460 2611 3610 1449 2612 3625 1463 2627 3611 1448 2627 3611 1448 2612 3625 1463 2635 3626 1462 2597 3627 1464 2598 3628 1467 2637 3630 1465 2637 3630 1465 2598 3628 1467 2636 3629 1466 2618 3631 1468 2619 3632 1471 2639 3634 1469 2639 3634 1469 2619 3632 1471 2638 3633 1470 2617 3618 1457 2618 3631 1468 2631 3619 1456 2631 3619 1456 2618 3631 1468 2639 3634 1469 2620 3635 1472 2621 3601 1438 2640 3636 1473 2640 3636 1473 2621 3601 1438 2624 3604 1439 2604 3637 1474 2605 3638 1477 2642 3640 1475 2642 3640 1475 2605 3638 1477 2641 3639 1476 2614 3641 1478 2615 3642 1481 2644 3644 1479 2644 3644 1479 2615 3642 1481 2643 3643 1480 2607 3614 1453 2608 3645 1483 2629 3615 1452 2629 3615 1452 2608 3645 1483 2645 3646 1482 2619 3632 1471 2620 3635 1472 2638 3633 1470 2638 3633 1470 2620 3635 1472 2640 3636 1473 2599 3647 1484 2600 3621 1458 2646 3648 1485 2646 3648 1485 2600 3621 1458 2634 3624 1459 2615 3642 1481 2616 3617 1454 2643 3643 1480 2643 3643 1480 2616 3617 1454 2632 3620 1455 2612 3625 1463 2613 3649 1487 2635 3626 1462 2635 3626 1462 2613 3649 1487 2647 3650 1486 2608 3645 1483 2609 3651 1489 2645 3646 1482 2645 3646 1482 2609 3651 1489 2648 3652 1488 2601 3622 1461 2602 3605 1442 2633 3623 1460 2633 3623 1460 2602 3605 1442 2626 3608 1443 2613 3649 1487 2614 3641 1478 2647 3650 1486 2647 3650 1486 2614 3641 1478 2644 3644 1479 2598 3628 1467 2599 3647 1484 2636 3629 1466 2636 3629 1466 2599 3647 1484 2646 3648 1485 2605 3638 1477 2606 3613 1450 2641 3639 1476 2641 3639 1476 2606 3613 1450 2630 3616 1451 2609 3651 1489 2610 3609 1446 2648 3652 1488 2648 3652 1488 2610 3609 1446 2628 3612 1447 2603 3606 1445 2604 3637 1474 2625 3607 1444 2625 3607 1444 2604 3637 1474 2642 3640 1475 2622 3602 1441 2597 3627 1464 2623 3603 1440 2623 3603 1440 2597 3627 1464 2637 3630 1465 2644 3654 1479 2660 3655 1491 2647 3653 1486 2647 3653 1486 2660 3655 1491 2659 3656 1490 2628 3657 1447 2627 3658 1448 2658 3659 1492 2648 3660 1488 2628 3657 1447 2657 3661 1493 2657 3661 1493 2628 3657 1447 2658 3659 1492 2642 3662 1475 2641 3663 1476 2655 3664 1494 2641 3663 1476 2630 3665 1451 2655 3664 1494 2655 3664 1494 2630 3665 1451 2656 3666 1495 2630 3665 1451 2629 3667 1452 2656 3666 1495 2625 3668 1444 2642 3662 1475 2654 3669 1496 2654 3669 1496 2642 3662 1475 2655 3664 1494 2624 3670 1439 2623 3671 1440 2650 3673 1497 2650 3673 1497 2623 3671 1440 2651 3672 1498 2627 3658 1448 2635 3674 1462 2658 3659 1492 2658 3659 1492 2635 3674 1462 2659 3656 1490 2635 3674 1462 2647 3653 1486 2659 3656 1490 2636 3675 1466 2646 3676 1485 2652 3677 1499 2639 3678 1469 2638 3679 1470 2649 3680 1500 2632 3681 1455 2631 3682 1456 2661 3683 1501 2643 3684 1480 2632 3681 1455 2660 3655 1491 2660 3655 1491 2632 3681 1455 2661 3683 1501 2633 3685 1460 2626 3686 1443 2653 3687 1502 2653 3687 1502 2626 3686 1443 2654 3669 1496 2638 3679 1470 2640 3688 1473 2649 3680 1500 2649 3680 1500 2640 3688 1473 2650 3673 1497 2645 3689 1482 2657 3661 1493 2629 3667 1452 2629 3667 1452 2657 3661 1493 2656 3666 1495 2644 3654 1479 2643 3684 1480 2660 3655 1491 2623 3671 1440 2637 3690 1465 2651 3672 1498 2634 3691 1459 2633 3685 1460 2653 3687 1502 2646 3676 1485 2634 3691 1459 2652 3677 1499 2652 3677 1499 2634 3691 1459 2653 3687 1502 2639 3678 1469 2649 3680 1500 2631 3682 1456 2631 3682 1456 2649 3680 1500 2661 3683 1501 2645 3689 1482 2648 3660 1488 2657 3661 1493 2626 3686 1443 2625 3668 1444 2654 3669 1496 2640 3688 1473 2624 3670 1439 2650 3673 1497 2636 3675 1466 2652 3677 1499 2637 3690 1465 2637 3690 1465 2652 3677 1499 2651 3672 1498 2658 3659 1492 2659 3656 1490 2663 3693 1503 2663 3693 1503 2659 3656 1490 2662 3692 1504 2655 3664 1494 2656 3666 1495 2665 3695 1505 2665 3695 1505 2656 3666 1495 2664 3694 1506 2652 3677 1499 2666 3696 1508 2651 3672 1498 2651 3672 1498 2666 3696 1508 2667 3697 1507 2650 3673 1497 2651 3672 1498 2668 3698 1509 2668 3698 1509 2651 3672 1498 2667 3697 1507 2653 3687 1502 2654 3669 1496 2670 3700 1510 2670 3700 1510 2654 3669 1496 2669 3699 1511 2654 3669 1496 2655 3664 1494 2669 3699 1511 2669 3699 1511 2655 3664 1494 2665 3695 1505 2657 3661 1493 2671 3701 1512 2656 3666 1495 2656 3666 1495 2671 3701 1512 2664 3694 1506 2652 3677 1499 2653 3687 1502 2666 3696 1508 2666 3696 1508 2653 3687 1502 2670 3700 1510 2657 3661 1493 2658 3659 1492 2671 3701 1512 2671 3701 1512 2658 3659 1492 2663 3693 1503 2660 3655 1491 2672 3702 1513 2659 3656 1490 2659 3656 1490 2672 3702 1513 2662 3692 1504 2649 3680 1500 2650 3673 1497 2673 3703 1514 2673 3703 1514 2650 3673 1497 2668 3698 1509 2649 3680 1500 2673 3703 1514 2661 3683 1501 2661 3683 1501 2673 3703 1514 2674 3704 1515 2660 3655 1491 2661 3683 1501 2672 3702 1513 2672 3702 1513 2661 3683 1501 2674 3704 1515 2675 3705 1516 2665 3695 1505 2671 3701 1512 2671 3701 1512 2665 3695 1505 2664 3694 1506 2667 3697 1507 2666 3696 1508 2675 3705 1516 2675 3705 1516 2666 3696 1508 2670 3700 1510 2667 3697 1507 2675 3705 1516 2668 3698 1509 2675 3705 1516 2673 3703 1514 2668 3698 1509 2672 3702 1513 2674 3704 1515 2675 3705 1516 2675 3705 1516 2674 3704 1515 2673 3703 1514 2671 3701 1512 2663 3693 1503 2675 3705 1516 2662 3692 1504 2672 3702 1513 2663 3693 1503 2663 3693 1503 2672 3702 1513 2675 3705 1516 2675 3705 1516 2670 3700 1510 2665 3695 1505 2665 3695 1505 2670 3700 1510 2669 3699 1511</p>
+ </triangles>
+ <triangles material="HeadphonesSG5" count="832">
+ <input semantic="VERTEX" source="#Headphones-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Headphones-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Headphones-headphonesUV" offset="2" set="1"/>
+ <p>709 1860 1517 710 1861 1518 735 1863 1520 735 1863 1520 710 1861 1518 736 1862 1519 710 1861 1521 711 1864 1522 736 1862 1519 736 1862 1519 711 1864 1522 737 1865 1523 712 1866 1525 738 1867 1526 711 1864 1524 711 1864 1524 738 1867 1526 737 1865 1523 713 1868 1528 739 1869 1529 712 1866 1527 712 1866 1527 739 1869 1529 738 1867 1526 714 1870 1531 740 1871 1532 713 1868 1530 713 1868 1530 740 1871 1532 739 1869 1529 714 1870 1533 715 1872 1534 740 1871 1532 740 1871 1532 715 1872 1534 741 1873 1535 715 1872 1536 716 1874 1537 741 1873 1535 741 1873 1535 716 1874 1537 742 1875 1538 716 1874 1539 717 1876 1540 742 1875 1538 742 1875 1538 717 1876 1540 743 1877 1541 717 1876 1542 718 1878 1543 743 1877 1541 743 1877 1541 718 1878 1543 744 1879 1544 718 1878 1545 719 1880 1546 744 1879 1544 744 1879 1544 719 1880 1546 745 1881 1547 719 1880 1548 720 1882 1549 745 1881 1547 745 1881 1547 720 1882 1549 746 1883 1550 720 1882 1551 721 1884 1552 746 1883 1550 746 1883 1550 721 1884 1552 747 1885 1553 721 1884 1554 722 1886 1555 747 1885 1553 747 1885 1553 722 1886 1555 748 1887 1556 722 1886 1557 723 1888 1558 748 1887 1556 748 1887 1556 723 1888 1558 749 1889 1559 723 1888 1560 724 1890 1561 749 1889 1559 749 1889 1559 724 1890 1561 750 1891 1562 724 1890 1563 725 1892 1564 750 1891 1562 750 1891 1562 725 1892 1564 751 1893 1565 725 1892 1566 726 1894 1567 751 1893 1565 751 1893 1565 726 1894 1567 752 1895 1568 726 1894 1569 727 1896 1570 752 1895 1568 752 1895 1568 727 1896 1570 753 1897 1571 727 1896 1572 728 1898 1573 753 1897 1571 753 1897 1571 728 1898 1573 754 1899 1574 728 1898 1575 729 1900 1576 754 1899 1574 754 1899 1574 729 1900 1576 755 1901 1577 729 1900 1578 730 1902 1579 755 1901 1577 755 1901 1577 730 1902 1579 756 1903 1580 730 1902 1581 731 1904 1582 756 1903 1580 756 1903 1580 731 1904 1582 757 1905 1583 708 1906 1585 734 1907 1586 731 1904 1584 731 1904 1584 734 1907 1586 757 1905 1583 707 1908 1588 733 1909 1589 708 1906 1587 708 1906 1587 733 1909 1589 734 1907 1586 706 1910 1591 732 1911 1592 707 1908 1590 707 1908 1590 732 1911 1592 733 1909 1589 706 1910 1593 709 1860 1594 732 1911 1592 732 1911 1592 709 1860 1594 735 1863 1520 733 1912 1589 732 1913 1592 759 1915 1596 759 1915 1596 732 1913 1592 758 1914 1595 735 1916 1520 761 1917 1597 732 1913 1592 732 1913 1592 761 1917 1597 758 1914 1595 736 1918 1519 762 1919 1598 735 1916 1520 735 1916 1520 762 1919 1598 761 1917 1597 736 1918 1519 737 1920 1523 762 1919 1598 762 1919 1598 737 1920 1523 763 1921 1599 737 1920 1523 738 1922 1526 763 1921 1599 763 1921 1599 738 1922 1526 764 1923 1600 738 1922 1526 739 1924 1529 764 1923 1600 764 1923 1600 739 1924 1529 765 1925 1601 739 1924 1529 740 1926 1532 765 1925 1601 765 1925 1601 740 1926 1532 766 1927 1602 741 1928 1535 767 1929 1603 740 1926 1532 740 1926 1532 767 1929 1603 766 1927 1602 741 1928 1535 742 1930 1538 767 1929 1603 767 1929 1603 742 1930 1538 768 1931 1604 742 1930 1538 743 1932 1541 768 1931 1604 768 1931 1604 743 1932 1541 769 1933 1605 743 1932 1541 744 1934 1544 769 1933 1605 769 1933 1605 744 1934 1544 770 1935 1606 744 1934 1544 745 1936 1547 770 1935 1606 770 1935 1606 745 1936 1547 771 1937 1607 745 1936 1547 746 1938 1550 771 1937 1607 771 1937 1607 746 1938 1550 772 1939 1608 746 1938 1550 747 1940 1553 772 1939 1608 772 1939 1608 747 1940 1553 773 1941 1609 747 1940 1553 748 1942 1556 773 1941 1609 773 1941 1609 748 1942 1556 774 1943 1610 748 1942 1556 749 1944 1559 774 1943 1610 774 1943 1610 749 1944 1559 775 1945 1611 749 1944 1559 750 1946 1562 775 1945 1611 775 1945 1611 750 1946 1562 776 1947 1612 750 1946 1562 751 1948 1565 776 1947 1612 776 1947 1612 751 1948 1565 777 1949 1613 751 1948 1565 752 1950 1568 777 1949 1613 777 1949 1613 752 1950 1568 778 1951 1614 752 1950 1568 753 1952 1571 778 1951 1614 778 1951 1614 753 1952 1571 779 1953 1615 753 1952 1571 754 1954 1574 779 1953 1615 779 1953 1615 754 1954 1574 780 1955 1616 754 1954 1574 755 1956 1577 780 1955 1616 780 1955 1616 755 1956 1577 781 1957 1617 755 1956 1577 756 1958 1580 781 1957 1617 781 1957 1617 756 1958 1580 782 1959 1618 756 1958 1580 757 1960 1583 782 1959 1618 782 1959 1618 757 1960 1583 783 1961 1619 757 1960 1583 734 1962 1586 783 1961 1619 783 1961 1619 734 1962 1586 760 1963 1620 734 1962 1586 733 1912 1589 760 1963 1620 760 1963 1620 733 1912 1589 759 1915 1596 781 1957 1617 782 1959 1618 807 1965 1622 807 1965 1622 782 1959 1618 808 1964 1621 782 1959 1618 783 1961 1619 808 1964 1621 808 1964 1621 783 1961 1619 809 1966 1623 783 1961 1619 760 1963 1620 809 1966 1623 809 1966 1623 760 1963 1620 786 1967 1624 760 1963 1620 759 1915 1596 786 1967 1624 786 1967 1624 759 1915 1596 785 1968 1625 759 1915 1596 758 1914 1595 785 1968 1625 785 1968 1625 758 1914 1595 784 1969 1626 761 1917 1597 787 1970 1627 758 1914 1595 758 1914 1595 787 1970 1627 784 1969 1626 762 1919 1598 788 1971 1628 761 1917 1597 761 1917 1597 788 1971 1628 787 1970 1627 763 1921 1599 789 1972 1629 762 1919 1598 762 1919 1598 789 1972 1629 788 1971 1628 763 1921 1599 764 1923 1600 789 1972 1629 789 1972 1629 764 1923 1600 790 1973 1630 764 1923 1600 765 1925 1601 790 1973 1630 790 1973 1630 765 1925 1601 791 1974 1631 765 1925 1601 766 1927 1602 791 1974 1631 791 1974 1631 766 1927 1602 792 1975 1632 767 1929 1603 793 1976 1633 766 1927 1602 766 1927 1602 793 1976 1633 792 1975 1632 768 1931 1604 794 1977 1634 767 1929 1603 767 1929 1603 794 1977 1634 793 1976 1633 769 1933 1605 795 1978 1635 768 1931 1604 768 1931 1604 795 1978 1635 794 1977 1634 769 1933 1605 770 1935 1606 795 1978 1635 795 1978 1635 770 1935 1606 796 1979 1636 770 1935 1606 771 1937 1607 796 1979 1636 796 1979 1636 771 1937 1607 797 1980 1637 771 1937 1607 772 1939 1608 797 1980 1637 797 1980 1637 772 1939 1608 798 1981 1638 772 1939 1608 773 1941 1609 798 1981 1638 798 1981 1638 773 1941 1609 799 1982 1639 773 1941 1609 774 1943 1610 799 1982 1639 799 1982 1639 774 1943 1610 800 1983 1640 774 1943 1610 775 1945 1611 800 1983 1640 800 1983 1640 775 1945 1611 801 1984 1641 775 1945 1611 776 1947 1612 801 1984 1641 801 1984 1641 776 1947 1612 802 1985 1642 776 1947 1612 777 1949 1613 802 1985 1642 802 1985 1642 777 1949 1613 803 1986 1643 777 1949 1613 778 1951 1614 803 1986 1643 803 1986 1643 778 1951 1614 804 1987 1644 778 1951 1614 779 1953 1615 804 1987 1644 804 1987 1644 779 1953 1615 805 1988 1645 779 1953 1615 780 1955 1616 805 1988 1645 805 1988 1645 780 1955 1616 806 1989 1646 780 1955 1616 781 1957 1617 806 1989 1646 806 1989 1646 781 1957 1617 807 1965 1622 785 1968 1625 784 1969 1626 811 1991 1648 811 1991 1648 784 1969 1626 810 1990 1647 787 1970 1627 813 1992 1649 784 1969 1626 784 1969 1626 813 1992 1649 810 1990 1647 788 1971 1628 814 1993 1650 787 1970 1627 787 1970 1627 814 1993 1650 813 1992 1649 789 1972 1629 815 1994 1651 788 1971 1628 788 1971 1628 815 1994 1651 814 1993 1650 789 1972 1629 790 1973 1630 815 1994 1651 815 1994 1651 790 1973 1630 816 1995 1652 790 1973 1630 791 1974 1631 816 1995 1652 816 1995 1652 791 1974 1631 817 1996 1653 791 1974 1631 792 1975 1632 817 1996 1653 817 1996 1653 792 1975 1632 818 1997 1654 793 1976 1633 819 1998 1655 792 1975 1632 792 1975 1632 819 1998 1655 818 1997 1654 794 1977 1634 820 1999 1656 793 1976 1633 793 1976 1633 820 1999 1656 819 1998 1655 795 1978 1635 821 2000 1657 794 1977 1634 794 1977 1634 821 2000 1657 820 1999 1656 795 1978 1635 796 1979 1636 821 2000 1657 821 2000 1657 796 1979 1636 822 2001 1658 796 1979 1636 797 1980 1637 822 2001 1658 822 2001 1658 797 1980 1637 823 2002 1659 797 1980 1637 798 1981 1638 823 2002 1659 823 2002 1659 798 1981 1638 824 2003 1660 798 1981 1638 799 1982 1639 824 2003 1660 824 2003 1660 799 1982 1639 825 2004 1661 799 1982 1639 800 1983 1640 825 2004 1661 825 2004 1661 800 1983 1640 826 2005 1662 800 1983 1640 801 1984 1641 826 2005 1662 826 2005 1662 801 1984 1641 827 2006 1663 801 1984 1641 802 1985 1642 827 2006 1663 827 2006 1663 802 1985 1642 828 2007 1664 802 1985 1642 803 1986 1643 828 2007 1664 828 2007 1664 803 1986 1643 829 2008 1665 803 1986 1643 804 1987 1644 829 2008 1665 829 2008 1665 804 1987 1644 830 2009 1666 804 1987 1644 805 1988 1645 830 2009 1666 830 2009 1666 805 1988 1645 831 2010 1667 805 1988 1645 806 1989 1646 831 2010 1667 831 2010 1667 806 1989 1646 832 2011 1668 806 1989 1646 807 1965 1622 832 2011 1668 832 2011 1668 807 1965 1622 833 2012 1669 807 1965 1622 808 1964 1621 833 2012 1669 833 2012 1669 808 1964 1621 834 2013 1670 808 1964 1621 809 1966 1623 834 2013 1670 834 2013 1670 809 1966 1623 835 2014 1671 809 1966 1623 786 1967 1624 835 2014 1671 835 2014 1671 786 1967 1624 812 2015 1672 786 1967 1624 785 1968 1625 812 2015 1672 812 2015 1672 785 1968 1625 811 1991 1648 814 1993 1650 840 2016 1673 813 1992 1649 813 1992 1649 840 2016 1673 839 2017 1674 815 1994 1651 841 2018 1675 814 1993 1650 814 1993 1650 841 2018 1675 840 2016 1673 815 1994 1651 816 1995 1652 841 2018 1675 841 2018 1675 816 1995 1652 842 2019 1676 816 1995 1652 817 1996 1653 842 2019 1676 842 2019 1676 817 1996 1653 843 2020 1677 817 1996 1653 818 1997 1654 843 2020 1677 843 2020 1677 818 1997 1654 844 2021 1678 819 1998 1655 845 2022 1679 818 1997 1654 818 1997 1654 845 2022 1679 844 2021 1678 820 1999 1656 846 2023 1680 819 1998 1655 819 1998 1655 846 2023 1680 845 2022 1679 821 2000 1657 847 2024 1681 820 1999 1656 820 1999 1656 847 2024 1681 846 2023 1680 821 2000 1657 822 2001 1658 847 2024 1681 847 2024 1681 822 2001 1658 848 2025 1682 822 2001 1658 823 2002 1659 848 2025 1682 848 2025 1682 823 2002 1659 849 2026 1683 823 2002 1659 824 2003 1660 849 2026 1683 849 2026 1683 824 2003 1660 850 2027 1684 824 2003 1660 825 2004 1661 850 2027 1684 850 2027 1684 825 2004 1661 851 2028 1685 825 2004 1661 826 2005 1662 851 2028 1685 851 2028 1685 826 2005 1662 852 2029 1686 826 2005 1662 827 2006 1663 852 2029 1686 852 2029 1686 827 2006 1663 853 2030 1687 827 2006 1663 828 2007 1664 853 2030 1687 853 2030 1687 828 2007 1664 854 2031 1688 828 2007 1664 829 2008 1665 854 2031 1688 854 2031 1688 829 2008 1665 855 2032 1689 829 2008 1665 830 2009 1666 855 2032 1689 855 2032 1689 830 2009 1666 856 2033 1690 830 2009 1666 831 2010 1667 856 2033 1690 856 2033 1690 831 2010 1667 857 2034 1691 831 2010 1667 832 2011 1668 857 2034 1691 857 2034 1691 832 2011 1668 858 2035 1692 832 2011 1668 833 2012 1669 858 2035 1692 858 2035 1692 833 2012 1669 859 2036 1693 833 2012 1669 834 2013 1670 859 2036 1693 859 2036 1693 834 2013 1670 860 2037 1694 834 2013 1670 835 2014 1671 860 2037 1694 860 2037 1694 835 2014 1671 861 2038 1695 835 2014 1671 812 2015 1672 861 2038 1695 861 2038 1695 812 2015 1672 838 2039 1696 812 2015 1672 811 1991 1648 838 2039 1696 838 2039 1696 811 1991 1648 837 2040 1697 811 1991 1648 810 1990 1647 837 2040 1697 837 2040 1697 810 1990 1647 836 2041 1698 813 1992 1649 839 2017 1674 810 1990 1647 810 1990 1647 839 2017 1674 836 2041 1698 837 2040 1697 836 2041 1698 863 2043 1700 863 2043 1700 836 2041 1698 862 2042 1699 839 2017 1674 865 2044 1701 836 2041 1698 836 2041 1698 865 2044 1701 862 2042 1699 840 2016 1673 866 2045 1702 839 2017 1674 839 2017 1674 866 2045 1702 865 2044 1701 841 2018 1675 867 2046 1703 840 2016 1673 840 2016 1673 867 2046 1703 866 2045 1702 841 2018 1675 842 2019 1676 867 2046 1703 867 2046 1703 842 2019 1676 868 2047 1704 842 2019 1676 843 2020 1677 868 2047 1704 868 2047 1704 843 2020 1677 869 2048 1705 843 2020 1677 844 2021 1678 869 2048 1705 869 2048 1705 844 2021 1678 870 2049 1706 845 2022 1679 871 2050 1707 844 2021 1678 844 2021 1678 871 2050 1707 870 2049 1706 846 2023 1680 872 2051 1708 845 2022 1679 845 2022 1679 872 2051 1708 871 2050 1707 847 2024 1681 873 2052 1709 846 2023 1680 846 2023 1680 873 2052 1709 872 2051 1708 847 2024 1681 848 2025 1682 873 2052 1709 873 2052 1709 848 2025 1682 874 2053 1710 848 2025 1682 849 2026 1683 874 2053 1710 874 2053 1710 849 2026 1683 875 2054 1711 849 2026 1683 850 2027 1684 875 2054 1711 875 2054 1711 850 2027 1684 876 2055 1712 850 2027 1684 851 2028 1685 876 2055 1712 876 2055 1712 851 2028 1685 877 2056 1713 851 2028 1685 852 2029 1686 877 2056 1713 877 2056 1713 852 2029 1686 878 2057 1714 852 2029 1686 853 2030 1687 878 2057 1714 878 2057 1714 853 2030 1687 879 2058 1715 853 2030 1687 854 2031 1688 879 2058 1715 879 2058 1715 854 2031 1688 880 2059 1716 854 2031 1688 855 2032 1689 880 2059 1716 880 2059 1716 855 2032 1689 881 2060 1717 855 2032 1689 856 2033 1690 881 2060 1717 881 2060 1717 856 2033 1690 882 2061 1718 856 2033 1690 857 2034 1691 882 2061 1718 882 2061 1718 857 2034 1691 883 2062 1719 857 2034 1691 858 2035 1692 883 2062 1719 883 2062 1719 858 2035 1692 884 2063 1720 858 2035 1692 859 2036 1693 884 2063 1720 884 2063 1720 859 2036 1693 885 2064 1721 859 2036 1693 860 2037 1694 885 2064 1721 885 2064 1721 860 2037 1694 886 2065 1722 860 2037 1694 861 2038 1695 886 2065 1722 886 2065 1722 861 2038 1695 887 2066 1723 861 2038 1695 838 2039 1696 887 2066 1723 887 2066 1723 838 2039 1696 864 2067 1724 838 2039 1696 837 2040 1697 864 2067 1724 864 2067 1724 837 2040 1697 863 2043 1700 872 2051 1708 898 2068 1725 871 2050 1707 871 2050 1707 898 2068 1725 897 2069 1726 873 2052 1709 899 2070 1727 872 2051 1708 872 2051 1708 899 2070 1727 898 2068 1725 873 2052 1709 874 2053 1710 899 2070 1727 899 2070 1727 874 2053 1710 900 2071 1728 874 2053 1710 875 2054 1711 900 2071 1728 900 2071 1728 875 2054 1711 901 2072 1729 875 2054 1711 876 2055 1712 901 2072 1729 901 2072 1729 876 2055 1712 902 2073 1730 876 2055 1712 877 2056 1713 902 2073 1730 902 2073 1730 877 2056 1713 903 2074 1731 877 2056 1713 878 2057 1714 903 2074 1731 903 2074 1731 878 2057 1714 904 2075 1732 878 2057 1714 879 2058 1715 904 2075 1732 904 2075 1732 879 2058 1715 905 2076 1733 879 2058 1715 880 2059 1716 905 2076 1733 905 2076 1733 880 2059 1716 906 2077 1734 880 2059 1716 881 2060 1717 906 2077 1734 906 2077 1734 881 2060 1717 907 2078 1735 881 2060 1717 882 2061 1718 907 2078 1735 907 2078 1735 882 2061 1718 908 2079 1736 882 2061 1718 883 2062 1719 908 2079 1736 908 2079 1736 883 2062 1719 909 2080 1737 883 2062 1719 884 2063 1720 909 2080 1737 909 2080 1737 884 2063 1720 910 2081 1738 884 2063 1720 885 2064 1721 910 2081 1738 910 2081 1738 885 2064 1721 911 2082 1739 885 2064 1721 886 2065 1722 911 2082 1739 911 2082 1739 886 2065 1722 912 2083 1740 886 2065 1722 887 2066 1723 912 2083 1740 912 2083 1740 887 2066 1723 913 2084 1741 887 2066 1723 864 2067 1724 913 2084 1741 913 2084 1741 864 2067 1724 890 2085 1742 864 2067 1724 863 2043 1700 890 2085 1742 890 2085 1742 863 2043 1700 889 2086 1743 863 2043 1700 862 2042 1699 889 2086 1743 889 2086 1743 862 2042 1699 888 2087 1744 865 2044 1701 891 2088 1745 862 2042 1699 862 2042 1699 891 2088 1745 888 2087 1744 866 2045 1702 892 2089 1746 865 2044 1701 865 2044 1701 892 2089 1746 891 2088 1745 867 2046 1703 893 2090 1747 866 2045 1702 866 2045 1702 893 2090 1747 892 2089 1746 867 2046 1703 868 2047 1704 893 2090 1747 893 2090 1747 868 2047 1704 894 2091 1748 868 2047 1704 869 2048 1705 894 2091 1748 894 2091 1748 869 2048 1705 895 2092 1749 869 2048 1705 870 2049 1706 895 2092 1749 895 2092 1749 870 2049 1706 896 2093 1750 871 2050 1707 897 2069 1726 870 2049 1706 870 2049 1706 897 2069 1726 896 2093 1750 900 2094 1728 901 2095 1729 926 2097 1752 926 2097 1752 901 2095 1729 927 2096 1751 901 2095 1729 902 2098 1730 927 2096 1751 927 2096 1751 902 2098 1730 928 2099 1753 902 2098 1730 903 2100 1731 928 2099 1753 928 2099 1753 903 2100 1731 929 2101 1754 903 2100 1731 904 2102 1732 929 2101 1754 929 2101 1754 904 2102 1732 930 2103 1755 904 2102 1732 905 2104 1733 930 2103 1755 930 2103 1755 905 2104 1733 931 2105 1756 905 2104 1733 906 2106 1734 931 2105 1756 931 2105 1756 906 2106 1734 932 2107 1757 906 2106 1734 907 2108 1735 932 2107 1757 932 2107 1757 907 2108 1735 933 2109 1758 907 2108 1735 908 2110 1736 933 2109 1758 933 2109 1758 908 2110 1736 934 2111 1759 908 2110 1736 909 2112 1737 934 2111 1759 934 2111 1759 909 2112 1737 935 2113 1760 909 2112 1737 910 2114 1738 935 2113 1760 935 2113 1760 910 2114 1738 936 2115 1761 910 2114 1738 911 2116 1739 936 2115 1761 936 2115 1761 911 2116 1739 937 2117 1762 911 2116 1739 912 2118 1740 937 2117 1762 937 2117 1762 912 2118 1740 938 2119 1763 912 2118 1740 913 2120 1741 938 2119 1763 938 2119 1763 913 2120 1741 939 2121 1764 890 2122 1742 916 2123 1765 913 2120 1741 913 2120 1741 916 2123 1765 939 2121 1764 889 2124 1743 915 2125 1766 890 2122 1742 890 2122 1742 915 2125 1766 916 2123 1765 888 2126 1744 914 2127 1767 889 2124 1743 889 2124 1743 914 2127 1767 915 2125 1766 888 2126 1744 891 2128 1745 914 2127 1767 914 2127 1767 891 2128 1745 917 2129 1768 891 2128 1745 892 2130 1746 917 2129 1768 917 2129 1768 892 2130 1746 918 2131 1769 892 2130 1746 893 2132 1747 918 2131 1769 918 2131 1769 893 2132 1747 919 2133 1770 894 2134 1748 920 2135 1771 893 2132 1747 893 2132 1747 920 2135 1771 919 2133 1770 895 2136 1749 921 2137 1772 894 2134 1748 894 2134 1748 921 2137 1772 920 2135 1771 896 2138 1750 922 2139 1773 895 2136 1749 895 2136 1749 922 2139 1773 921 2137 1772 896 2138 1750 897 2140 1726 922 2139 1773 922 2139 1773 897 2140 1726 923 2141 1774 897 2140 1726 898 2142 1725 923 2141 1774 923 2141 1774 898 2142 1725 924 2143 1775 898 2142 1725 899 2144 1727 924 2143 1775 924 2143 1775 899 2144 1727 925 2145 1776 899 2144 1727 900 2094 1728 925 2145 1776 925 2145 1776 900 2094 1728 926 2097 1752 2366 3706 1777 2392 3707 1520 2367 3709 1778 2367 3709 1778 2392 3707 1520 2393 3708 1519 2367 3709 1779 2393 3708 1519 2368 3711 1780 2368 3711 1780 2393 3708 1519 2394 3710 1523 2394 3710 1523 2395 3712 1526 2368 3711 1781 2368 3711 1781 2395 3712 1526 2369 3713 1782 2395 3712 1526 2396 3714 1529 2369 3713 1783 2369 3713 1783 2396 3714 1529 2370 3715 1784 2396 3714 1529 2397 3716 1532 2370 3715 1785 2370 3715 1785 2397 3716 1532 2371 3717 1786 2371 3717 1787 2397 3716 1532 2372 3719 1788 2372 3719 1788 2397 3716 1532 2398 3718 1535 2372 3719 1789 2398 3718 1535 2373 3721 1790 2373 3721 1790 2398 3718 1535 2399 3720 1538 2373 3721 1791 2399 3720 1538 2374 3723 1792 2374 3723 1792 2399 3720 1538 2400 3722 1541 2374 3723 1793 2400 3722 1541 2375 3725 1794 2375 3725 1794 2400 3722 1541 2401 3724 1544 2375 3725 1795 2401 3724 1544 2376 3727 1796 2376 3727 1796 2401 3724 1544 2402 3726 1547 2376 3727 1797 2402 3726 1547 2377 3729 1798 2377 3729 1798 2402 3726 1547 2403 3728 1550 2377 3729 1799 2403 3728 1550 2378 3731 1800 2378 3731 1800 2403 3728 1550 2404 3730 1553 2378 3731 1801 2404 3730 1553 2379 3733 1802 2379 3733 1802 2404 3730 1553 2405 3732 1556 2379 3733 1803 2405 3732 1556 2380 3735 1804 2380 3735 1804 2405 3732 1556 2406 3734 1559 2380 3735 1805 2406 3734 1559 2381 3737 1806 2381 3737 1806 2406 3734 1559 2407 3736 1562 2381 3737 1807 2407 3736 1562 2382 3739 1808 2382 3739 1808 2407 3736 1562 2408 3738 1565 2382 3739 1809 2408 3738 1565 2383 3741 1810 2383 3741 1810 2408 3738 1565 2409 3740 1568 2383 3741 1811 2409 3740 1568 2384 3743 1812 2384 3743 1812 2409 3740 1568 2410 3742 1571 2384 3743 1813 2410 3742 1571 2385 3745 1814 2385 3745 1814 2410 3742 1571 2411 3744 1574 2385 3745 1815 2411 3744 1574 2386 3747 1816 2386 3747 1816 2411 3744 1574 2412 3746 1577 2386 3747 1817 2412 3746 1577 2387 3749 1818 2387 3749 1818 2412 3746 1577 2413 3748 1580 2387 3749 1819 2413 3748 1580 2388 3751 1820 2388 3751 1820 2413 3748 1580 2414 3750 1583 2414 3750 1583 2391 3752 1586 2388 3751 1821 2388 3751 1821 2391 3752 1586 2365 3753 1822 2391 3752 1586 2390 3754 1589 2365 3753 1823 2365 3753 1823 2390 3754 1589 2364 3755 1824 2390 3754 1589 2389 3756 1592 2364 3755 1825 2364 3755 1825 2389 3756 1592 2363 3757 1826 2363 3757 1827 2389 3756 1592 2366 3706 1828 2366 3706 1828 2389 3756 1592 2392 3707 1520 2390 3758 1589 2416 3759 1596 2389 3761 1592 2389 3761 1592 2416 3759 1596 2415 3760 1595 2415 3760 1595 2418 3762 1597 2389 3761 1592 2389 3761 1592 2418 3762 1597 2392 3763 1520 2418 3762 1597 2419 3764 1598 2392 3763 1520 2392 3763 1520 2419 3764 1598 2393 3765 1519 2393 3765 1519 2419 3764 1598 2394 3767 1523 2394 3767 1523 2419 3764 1598 2420 3766 1599 2394 3767 1523 2420 3766 1599 2395 3769 1526 2395 3769 1526 2420 3766 1599 2421 3768 1600 2395 3769 1526 2421 3768 1600 2396 3771 1529 2396 3771 1529 2421 3768 1600 2422 3770 1601 2396 3771 1529 2422 3770 1601 2397 3773 1532 2397 3773 1532 2422 3770 1601 2423 3772 1602 2423 3772 1602 2424 3774 1603 2397 3773 1532 2397 3773 1532 2424 3774 1603 2398 3775 1535 2398 3775 1535 2424 3774 1603 2399 3777 1538 2399 3777 1538 2424 3774 1603 2425 3776 1604 2399 3777 1538 2425 3776 1604 2400 3779 1541 2400 3779 1541 2425 3776 1604 2426 3778 1605 2400 3779 1541 2426 3778 1605 2401 3781 1544 2401 3781 1544 2426 3778 1605 2427 3780 1606 2401 3781 1544 2427 3780 1606 2402 3783 1547 2402 3783 1547 2427 3780 1606 2428 3782 1607 2402 3783 1547 2428 3782 1607 2403 3785 1550 2403 3785 1550 2428 3782 1607 2429 3784 1608 2403 3785 1550 2429 3784 1608 2404 3787 1553 2404 3787 1553 2429 3784 1608 2430 3786 1609 2404 3787 1553 2430 3786 1609 2405 3789 1556 2405 3789 1556 2430 3786 1609 2431 3788 1610 2405 3789 1556 2431 3788 1610 2406 3791 1559 2406 3791 1559 2431 3788 1610 2432 3790 1611 2406 3791 1559 2432 3790 1611 2407 3793 1562 2407 3793 1562 2432 3790 1611 2433 3792 1612 2407 3793 1562 2433 3792 1612 2408 3795 1565 2408 3795 1565 2433 3792 1612 2434 3794 1613 2408 3795 1565 2434 3794 1613 2409 3797 1568 2409 3797 1568 2434 3794 1613 2435 3796 1614 2409 3797 1568 2435 3796 1614 2410 3799 1571 2410 3799 1571 2435 3796 1614 2436 3798 1615 2410 3799 1571 2436 3798 1615 2411 3801 1574 2411 3801 1574 2436 3798 1615 2437 3800 1616 2411 3801 1574 2437 3800 1616 2412 3803 1577 2412 3803 1577 2437 3800 1616 2438 3802 1617 2412 3803 1577 2438 3802 1617 2413 3805 1580 2413 3805 1580 2438 3802 1617 2439 3804 1618 2413 3805 1580 2439 3804 1618 2414 3807 1583 2414 3807 1583 2439 3804 1618 2440 3806 1619 2414 3807 1583 2440 3806 1619 2391 3809 1586 2391 3809 1586 2440 3806 1619 2417 3808 1620 2391 3809 1586 2417 3808 1620 2390 3758 1589 2390 3758 1589 2417 3808 1620 2416 3759 1596 2438 3802 1617 2464 3810 1622 2439 3804 1618 2439 3804 1618 2464 3810 1622 2465 3811 1621 2439 3804 1618 2465 3811 1621 2440 3806 1619 2440 3806 1619 2465 3811 1621 2466 3812 1623 2440 3806 1619 2466 3812 1623 2417 3808 1620 2417 3808 1620 2466 3812 1623 2443 3813 1624 2417 3808 1620 2443 3813 1624 2416 3759 1596 2416 3759 1596 2443 3813 1624 2442 3814 1625 2416 3759 1596 2442 3814 1625 2415 3760 1595 2415 3760 1595 2442 3814 1625 2441 3815 1626 2441 3815 1626 2444 3816 1627 2415 3760 1595 2415 3760 1595 2444 3816 1627 2418 3762 1597 2444 3816 1627 2445 3817 1628 2418 3762 1597 2418 3762 1597 2445 3817 1628 2419 3764 1598 2445 3817 1628 2446 3818 1629 2419 3764 1598 2419 3764 1598 2446 3818 1629 2420 3766 1599 2420 3766 1599 2446 3818 1629 2421 3768 1600 2421 3768 1600 2446 3818 1629 2447 3819 1630 2421 3768 1600 2447 3819 1630 2422 3770 1601 2422 3770 1601 2447 3819 1630 2448 3820 1631 2422 3770 1601 2448 3820 1631 2423 3772 1602 2423 3772 1602 2448 3820 1631 2449 3821 1632 2449 3821 1632 2450 3822 1633 2423 3772 1602 2423 3772 1602 2450 3822 1633 2424 3774 1603 2450 3822 1633 2451 3823 1634 2424 3774 1603 2424 3774 1603 2451 3823 1634 2425 3776 1604 2451 3823 1634 2452 3824 1635 2425 3776 1604 2425 3776 1604 2452 3824 1635 2426 3778 1605 2426 3778 1605 2452 3824 1635 2427 3780 1606 2427 3780 1606 2452 3824 1635 2453 3825 1636 2427 3780 1606 2453 3825 1636 2428 3782 1607 2428 3782 1607 2453 3825 1636 2454 3826 1637 2428 3782 1607 2454 3826 1637 2429 3784 1608 2429 3784 1608 2454 3826 1637 2455 3827 1638 2429 3784 1608 2455 3827 1638 2430 3786 1609 2430 3786 1609 2455 3827 1638 2456 3828 1639 2430 3786 1609 2456 3828 1639 2431 3788 1610 2431 3788 1610 2456 3828 1639 2457 3829 1640 2431 3788 1610 2457 3829 1640 2432 3790 1611 2432 3790 1611 2457 3829 1640 2458 3830 1641 2432 3790 1611 2458 3830 1641 2433 3792 1612 2433 3792 1612 2458 3830 1641 2459 3831 1642 2433 3792 1612 2459 3831 1642 2434 3794 1613 2434 3794 1613 2459 3831 1642 2460 3832 1643 2434 3794 1613 2460 3832 1643 2435 3796 1614 2435 3796 1614 2460 3832 1643 2461 3833 1644 2435 3796 1614 2461 3833 1644 2436 3798 1615 2436 3798 1615 2461 3833 1644 2462 3834 1645 2436 3798 1615 2462 3834 1645 2437 3800 1616 2437 3800 1616 2462 3834 1645 2463 3835 1646 2437 3800 1616 2463 3835 1646 2438 3802 1617 2438 3802 1617 2463 3835 1646 2464 3810 1622 2442 3814 1625 2468 3836 1648 2441 3815 1626 2441 3815 1626 2468 3836 1648 2467 3837 1647 2467 3837 1647 2470 3838 1649 2441 3815 1626 2441 3815 1626 2470 3838 1649 2444 3816 1627 2470 3838 1649 2471 3839 1650 2444 3816 1627 2444 3816 1627 2471 3839 1650 2445 3817 1628 2471 3839 1650 2472 3840 1651 2445 3817 1628 2445 3817 1628 2472 3840 1651 2446 3818 1629 2446 3818 1629 2472 3840 1651 2447 3819 1630 2447 3819 1630 2472 3840 1651 2473 3841 1652 2447 3819 1630 2473 3841 1652 2448 3820 1631 2448 3820 1631 2473 3841 1652 2474 3842 1653 2448 3820 1631 2474 3842 1653 2449 3821 1632 2449 3821 1632 2474 3842 1653 2475 3843 1654 2475 3843 1654 2476 3844 1655 2449 3821 1632 2449 3821 1632 2476 3844 1655 2450 3822 1633 2476 3844 1655 2477 3845 1656 2450 3822 1633 2450 3822 1633 2477 3845 1656 2451 3823 1634 2477 3845 1656 2478 3846 1657 2451 3823 1634 2451 3823 1634 2478 3846 1657 2452 3824 1635 2452 3824 1635 2478 3846 1657 2453 3825 1636 2453 3825 1636 2478 3846 1657 2479 3847 1658 2453 3825 1636 2479 3847 1658 2454 3826 1637 2454 3826 1637 2479 3847 1658 2480 3848 1659 2454 3826 1637 2480 3848 1659 2455 3827 1638 2455 3827 1638 2480 3848 1659 2481 3849 1660 2455 3827 1638 2481 3849 1660 2456 3828 1639 2456 3828 1639 2481 3849 1660 2482 3850 1661 2456 3828 1639 2482 3850 1661 2457 3829 1640 2457 3829 1640 2482 3850 1661 2483 3851 1662 2457 3829 1640 2483 3851 1662 2458 3830 1641 2458 3830 1641 2483 3851 1662 2484 3852 1663 2458 3830 1641 2484 3852 1663 2459 3831 1642 2459 3831 1642 2484 3852 1663 2485 3853 1664 2459 3831 1642 2485 3853 1664 2460 3832 1643 2460 3832 1643 2485 3853 1664 2486 3854 1665 2460 3832 1643 2486 3854 1665 2461 3833 1644 2461 3833 1644 2486 3854 1665 2487 3855 1666 2461 3833 1644 2487 3855 1666 2462 3834 1645 2462 3834 1645 2487 3855 1666 2488 3856 1667 2462 3834 1645 2488 3856 1667 2463 3835 1646 2463 3835 1646 2488 3856 1667 2489 3857 1668 2463 3835 1646 2489 3857 1668 2464 3810 1622 2464 3810 1622 2489 3857 1668 2490 3858 1669 2464 3810 1622 2490 3858 1669 2465 3811 1621 2465 3811 1621 2490 3858 1669 2491 3859 1670 2465 3811 1621 2491 3859 1670 2466 3812 1623 2466 3812 1623 2491 3859 1670 2492 3860 1671 2466 3812 1623 2492 3860 1671 2443 3813 1624 2443 3813 1624 2492 3860 1671 2469 3861 1672 2443 3813 1624 2469 3861 1672 2442 3814 1625 2442 3814 1625 2469 3861 1672 2468 3836 1648 2496 3862 1674 2497 3863 1673 2470 3838 1649 2470 3838 1649 2497 3863 1673 2471 3839 1650 2497 3863 1673 2498 3864 1675 2471 3839 1650 2471 3839 1650 2498 3864 1675 2472 3840 1651 2472 3840 1651 2498 3864 1675 2473 3841 1652 2473 3841 1652 2498 3864 1675 2499 3865 1676 2473 3841 1652 2499 3865 1676 2474 3842 1653 2474 3842 1653 2499 3865 1676 2500 3866 1677 2474 3842 1653 2500 3866 1677 2475 3843 1654 2475 3843 1654 2500 3866 1677 2501 3867 1678 2501 3867 1678 2502 3868 1679 2475 3843 1654 2475 3843 1654 2502 3868 1679 2476 3844 1655 2502 3868 1679 2503 3869 1680 2476 3844 1655 2476 3844 1655 2503 3869 1680 2477 3845 1656 2503 3869 1680 2504 3870 1681 2477 3845 1656 2477 3845 1656 2504 3870 1681 2478 3846 1657 2478 3846 1657 2504 3870 1681 2479 3847 1658 2479 3847 1658 2504 3870 1681 2505 3871 1682 2479 3847 1658 2505 3871 1682 2480 3848 1659 2480 3848 1659 2505 3871 1682 2506 3872 1683 2480 3848 1659 2506 3872 1683 2481 3849 1660 2481 3849 1660 2506 3872 1683 2507 3873 1684 2481 3849 1660 2507 3873 1684 2482 3850 1661 2482 3850 1661 2507 3873 1684 2508 3874 1685 2482 3850 1661 2508 3874 1685 2483 3851 1662 2483 3851 1662 2508 3874 1685 2509 3875 1686 2483 3851 1662 2509 3875 1686 2484 3852 1663 2484 3852 1663 2509 3875 1686 2510 3876 1687 2484 3852 1663 2510 3876 1687 2485 3853 1664 2485 3853 1664 2510 3876 1687 2511 3877 1688 2485 3853 1664 2511 3877 1688 2486 3854 1665 2486 3854 1665 2511 3877 1688 2512 3878 1689 2486 3854 1665 2512 3878 1689 2487 3855 1666 2487 3855 1666 2512 3878 1689 2513 3879 1690 2487 3855 1666 2513 3879 1690 2488 3856 1667 2488 3856 1667 2513 3879 1690 2514 3880 1691 2488 3856 1667 2514 3880 1691 2489 3857 1668 2489 3857 1668 2514 3880 1691 2515 3881 1692 2489 3857 1668 2515 3881 1692 2490 3858 1669 2490 3858 1669 2515 3881 1692 2516 3882 1693 2490 3858 1669 2516 3882 1693 2491 3859 1670 2491 3859 1670 2516 3882 1693 2517 3883 1694 2491 3859 1670 2517 3883 1694 2492 3860 1671 2492 3860 1671 2517 3883 1694 2518 3884 1695 2492 3860 1671 2518 3884 1695 2469 3861 1672 2469 3861 1672 2518 3884 1695 2495 3885 1696 2469 3861 1672 2495 3885 1696 2468 3836 1648 2468 3836 1648 2495 3885 1696 2494 3886 1697 2468 3836 1648 2494 3886 1697 2467 3837 1647 2467 3837 1647 2494 3886 1697 2493 3887 1698 2493 3887 1698 2496 3862 1674 2467 3837 1647 2467 3837 1647 2496 3862 1674 2470 3838 1649 2494 3886 1697 2520 3888 1700 2493 3887 1698 2493 3887 1698 2520 3888 1700 2519 3889 1699 2519 3889 1699 2522 3890 1701 2493 3887 1698 2493 3887 1698 2522 3890 1701 2496 3862 1674 2522 3890 1701 2523 3891 1702 2496 3862 1674 2496 3862 1674 2523 3891 1702 2497 3863 1673 2523 3891 1702 2524 3892 1703 2497 3863 1673 2497 3863 1673 2524 3892 1703 2498 3864 1675 2498 3864 1675 2524 3892 1703 2499 3865 1676 2499 3865 1676 2524 3892 1703 2525 3893 1704 2499 3865 1676 2525 3893 1704 2500 3866 1677 2500 3866 1677 2525 3893 1704 2526 3894 1705 2500 3866 1677 2526 3894 1705 2501 3867 1678 2501 3867 1678 2526 3894 1705 2527 3895 1706 2527 3895 1706 2528 3896 1707 2501 3867 1678 2501 3867 1678 2528 3896 1707 2502 3868 1679 2528 3896 1707 2529 3897 1708 2502 3868 1679 2502 3868 1679 2529 3897 1708 2503 3869 1680 2529 3897 1708 2530 3898 1709 2503 3869 1680 2503 3869 1680 2530 3898 1709 2504 3870 1681 2504 3870 1681 2530 3898 1709 2505 3871 1682 2505 3871 1682 2530 3898 1709 2531 3899 1710 2505 3871 1682 2531 3899 1710 2506 3872 1683 2506 3872 1683 2531 3899 1710 2532 3900 1711 2506 3872 1683 2532 3900 1711 2507 3873 1684 2507 3873 1684 2532 3900 1711 2533 3901 1712 2507 3873 1684 2533 3901 1712 2508 3874 1685 2508 3874 1685 2533 3901 1712 2534 3902 1713 2508 3874 1685 2534 3902 1713 2509 3875 1686 2509 3875 1686 2534 3902 1713 2535 3903 1714 2509 3875 1686 2535 3903 1714 2510 3876 1687 2510 3876 1687 2535 3903 1714 2536 3904 1715 2510 3876 1687 2536 3904 1715 2511 3877 1688 2511 3877 1688 2536 3904 1715 2537 3905 1716 2511 3877 1688 2537 3905 1716 2512 3878 1689 2512 3878 1689 2537 3905 1716 2538 3906 1717 2512 3878 1689 2538 3906 1717 2513 3879 1690 2513 3879 1690 2538 3906 1717 2539 3907 1718 2513 3879 1690 2539 3907 1718 2514 3880 1691 2514 3880 1691 2539 3907 1718 2540 3908 1719 2514 3880 1691 2540 3908 1719 2515 3881 1692 2515 3881 1692 2540 3908 1719 2541 3909 1720 2515 3881 1692 2541 3909 1720 2516 3882 1693 2516 3882 1693 2541 3909 1720 2542 3910 1721 2516 3882 1693 2542 3910 1721 2517 3883 1694 2517 3883 1694 2542 3910 1721 2543 3911 1722 2517 3883 1694 2543 3911 1722 2518 3884 1695 2518 3884 1695 2543 3911 1722 2544 3912 1723 2518 3884 1695 2544 3912 1723 2495 3885 1696 2495 3885 1696 2544 3912 1723 2521 3913 1724 2495 3885 1696 2521 3913 1724 2494 3886 1697 2494 3886 1697 2521 3913 1724 2520 3888 1700 2554 3914 1726 2555 3915 1725 2528 3896 1707 2528 3896 1707 2555 3915 1725 2529 3897 1708 2555 3915 1725 2556 3916 1727 2529 3897 1708 2529 3897 1708 2556 3916 1727 2530 3898 1709 2530 3898 1709 2556 3916 1727 2531 3899 1710 2531 3899 1710 2556 3916 1727 2557 3917 1728 2531 3899 1710 2557 3917 1728 2532 3900 1711 2532 3900 1711 2557 3917 1728 2558 3918 1729 2532 3900 1711 2558 3918 1729 2533 3901 1712 2533 3901 1712 2558 3918 1729 2559 3919 1730 2533 3901 1712 2559 3919 1730 2534 3902 1713 2534 3902 1713 2559 3919 1730 2560 3920 1731 2534 3902 1713 2560 3920 1731 2535 3903 1714 2535 3903 1714 2560 3920 1731 2561 3921 1732 2535 3903 1714 2561 3921 1732 2536 3904 1715 2536 3904 1715 2561 3921 1732 2562 3922 1733 2536 3904 1715 2562 3922 1733 2537 3905 1716 2537 3905 1716 2562 3922 1733 2563 3923 1734 2537 3905 1716 2563 3923 1734 2538 3906 1717 2538 3906 1717 2563 3923 1734 2564 3924 1735 2538 3906 1717 2564 3924 1735 2539 3907 1718 2539 3907 1718 2564 3924 1735 2565 3925 1736 2539 3907 1718 2565 3925 1736 2540 3908 1719 2540 3908 1719 2565 3925 1736 2566 3926 1737 2540 3908 1719 2566 3926 1737 2541 3909 1720 2541 3909 1720 2566 3926 1737 2567 3927 1738 2541 3909 1720 2567 3927 1738 2542 3910 1721 2542 3910 1721 2567 3927 1738 2568 3928 1739 2542 3910 1721 2568 3928 1739 2543 3911 1722 2543 3911 1722 2568 3928 1739 2569 3929 1740 2543 3911 1722 2569 3929 1740 2544 3912 1723 2544 3912 1723 2569 3929 1740 2570 3930 1741 2544 3912 1723 2570 3930 1741 2521 3913 1724 2521 3913 1724 2570 3930 1741 2547 3931 1742 2521 3913 1724 2547 3931 1742 2520 3888 1700 2520 3888 1700 2547 3931 1742 2546 3932 1743 2520 3888 1700 2546 3932 1743 2519 3889 1699 2519 3889 1699 2546 3932 1743 2545 3933 1744 2545 3933 1744 2548 3934 1745 2519 3889 1699 2519 3889 1699 2548 3934 1745 2522 3890 1701 2548 3934 1745 2549 3935 1746 2522 3890 1701 2522 3890 1701 2549 3935 1746 2523 3891 1702 2549 3935 1746 2550 3936 1747 2523 3891 1702 2523 3891 1702 2550 3936 1747 2524 3892 1703 2524 3892 1703 2550 3936 1747 2525 3893 1704 2525 3893 1704 2550 3936 1747 2551 3937 1748 2525 3893 1704 2551 3937 1748 2526 3894 1705 2526 3894 1705 2551 3937 1748 2552 3938 1749 2526 3894 1705 2552 3938 1749 2527 3895 1706 2527 3895 1706 2552 3938 1749 2553 3939 1750 2553 3939 1750 2554 3914 1726 2527 3895 1706 2527 3895 1706 2554 3914 1726 2528 3896 1707 2557 3940 1728 2583 3941 1752 2558 3943 1729 2558 3943 1729 2583 3941 1752 2584 3942 1751 2558 3943 1729 2584 3942 1751 2559 3945 1730 2559 3945 1730 2584 3942 1751 2585 3944 1753 2559 3945 1730 2585 3944 1753 2560 3947 1731 2560 3947 1731 2585 3944 1753 2586 3946 1754 2560 3947 1731 2586 3946 1754 2561 3949 1732 2561 3949 1732 2586 3946 1754 2587 3948 1755 2561 3949 1732 2587 3948 1755 2562 3951 1733 2562 3951 1733 2587 3948 1755 2588 3950 1756 2562 3951 1733 2588 3950 1756 2563 3953 1734 2563 3953 1734 2588 3950 1756 2589 3952 1757 2563 3953 1734 2589 3952 1757 2564 3955 1735 2564 3955 1735 2589 3952 1757 2590 3954 1758 2564 3955 1735 2590 3954 1758 2565 3957 1736 2565 3957 1736 2590 3954 1758 2591 3956 1759 2565 3957 1736 2591 3956 1759 2566 3959 1737 2566 3959 1737 2591 3956 1759 2592 3958 1760 2566 3959 1737 2592 3958 1760 2567 3961 1738 2567 3961 1738 2592 3958 1760 2593 3960 1761 2567 3961 1738 2593 3960 1761 2568 3963 1739 2568 3963 1739 2593 3960 1761 2594 3962 1762 2568 3963 1739 2594 3962 1762 2569 3965 1740 2569 3965 1740 2594 3962 1762 2595 3964 1763 2569 3965 1740 2595 3964 1763 2570 3967 1741 2570 3967 1741 2595 3964 1763 2596 3966 1764 2596 3966 1764 2573 3968 1765 2570 3967 1741 2570 3967 1741 2573 3968 1765 2547 3969 1742 2573 3968 1765 2572 3970 1766 2547 3969 1742 2547 3969 1742 2572 3970 1766 2546 3971 1743 2572 3970 1766 2571 3972 1767 2546 3971 1743 2546 3971 1743 2571 3972 1767 2545 3973 1744 2545 3973 1744 2571 3972 1767 2548 3975 1745 2548 3975 1745 2571 3972 1767 2574 3974 1768 2548 3975 1745 2574 3974 1768 2549 3977 1746 2549 3977 1746 2574 3974 1768 2575 3976 1769 2549 3977 1746 2575 3976 1769 2550 3979 1747 2550 3979 1747 2575 3976 1769 2576 3978 1770 2576 3978 1770 2577 3980 1771 2550 3979 1747 2550 3979 1747 2577 3980 1771 2551 3981 1748 2577 3980 1771 2578 3982 1772 2551 3981 1748 2551 3981 1748 2578 3982 1772 2552 3983 1749 2578 3982 1772 2579 3984 1773 2552 3983 1749 2552 3983 1749 2579 3984 1773 2553 3985 1750 2553 3985 1750 2579 3984 1773 2554 3987 1726 2554 3987 1726 2579 3984 1773 2580 3986 1774 2554 3987 1726 2580 3986 1774 2555 3989 1725 2555 3989 1725 2580 3986 1774 2581 3988 1775 2555 3989 1725 2581 3988 1775 2556 3991 1727 2556 3991 1727 2581 3988 1775 2582 3990 1776 2556 3991 1727 2582 3990 1776 2557 3940 1728 2557 3940 1728 2582 3990 1776 2583 3941 1752</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Headphones">
+ <node id="_Headphones" name="Headphones" type="NODE">
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <instance_geometry url="#Headphones">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="HeadphonesSG" target="#headpiece"/>
+ <instance_material symbol="HeadphonesSG1" target="#trim"/>
+ <instance_material symbol="HeadphonesSG2" target="#plastic"/>
+ <instance_material symbol="HeadphonesSG3" target="#phone"/>
+ <instance_material symbol="HeadphonesSG4" target="#earpiece"/>
+ <instance_material symbol="HeadphonesSG5" target="#foam"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Media/DVD_cover-reflection.dae b/Studio/Content/Models Library/Media/DVD_cover-reflection.dae
new file mode 100644
index 0000000..47dc36b
--- /dev/null
+++ b/Studio/Content/Models Library/Media/DVD_cover-reflection.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/media/DVD_cover-reflection.mb</source_data>
+ </contributor>
+ <created>2008-10-01T19:20:36Z</created>
+ <modified>2008-10-01T19:20:36Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="DVD_reflection_material" name="DVD_reflection_material">
+ <instance_effect url="#DVD_reflection_material-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="DVD_reflection_material-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="DVD_cover_reflection" name="DVD_cover_reflection">
+ <mesh>
+ <source id="DVD_cover_reflection-positions" name="position">
+ <float_array id="DVD_cover_reflection-positions-array" count="456">-35 -48 -1.65 -33 -48 -3.85 -33 -50 -1.65 33 -48 -3.85 35 -48 -1.65 33 -50 -1.65 35 -48 1.65 33 -48 3.85 33 -50 1.65 -33 -50 1.65 -33 -48 3.85 -35 -48 1.65 -35 48 -1.65 -33 50 -1.65 -33 48 -3.85 33 50 -1.65 35 48 -1.65 33 48 -3.85 33 50 1.65 33 48 3.85 35 48 1.65 -33 50 1.65 -35 48 1.65 -33 48 3.85 -33 -48.7654 3.68253 33 -48.7654 3.68253 -33 -49.4142 3.20564 33 -49.4142 3.20564 -33 -49.8478 2.4919 33 -49.8478 2.4919 -34.8478 -48.7654 -1.65 -34.8478 -48.7654 1.65 -34.4142 -49.4142 -1.65 -34.4142 -49.4142 1.65 -33.7654 -49.8478 -1.65 -33.7654 -49.8478 1.65 34.8478 -48.7654 1.65 34.8478 -48.7654 -1.65 34.4142 -49.4142 1.65 34.4142 -49.4142 -1.65 33.7654 -49.8478 1.65 33.7654 -49.8478 -1.65 33 -48.7654 -3.68253 -33 -48.7654 -3.68253 33 -49.4142 -3.20564 -33 -49.4142 -3.20564 33 -49.8478 -2.4919 -33 -49.8478 -2.4919 -34.8478 -48 2.4919 -34.8478 48 2.4919 -34.4142 -48 3.20564 -34.4142 48 3.20564 -33.7654 -48 3.68253 -33.7654 48 3.68253 33.7654 -48 3.68253 33.7654 48 3.68253 34.4142 -48 3.20564 34.4142 48 3.20564 34.8478 -48 2.4919 34.8478 48 2.4919 34.8478 -48 -2.4919 34.8478 48 -2.4919 34.4142 -48 -3.20564 34.4142 48 -3.20564 33.7654 -48 -3.68253 33.7654 48 -3.68253 -34.8478 48 -2.4919 -34.8478 -48 -2.4919 -34.4142 48 -3.20564 -34.4142 -48 -3.20564 -33.7654 48 -3.68253 -33.7654 -48 -3.68253 -33 49.8478 2.4919 33 49.8478 2.4919 -33 49.4142 3.20564 33 49.4142 3.20564 -33 48.7654 3.68253 33 48.7654 3.68253 -33.7654 49.8478 -1.65 -33.7654 49.8478 1.65 -34.4142 49.4142 -1.65 -34.4142 49.4142 1.65 -34.8478 48.7654 -1.65 -34.8478 48.7654 1.65 33.7654 49.8478 1.65 33.7654 49.8478 -1.65 34.4142 49.4142 1.65 34.4142 49.4142 -1.65 34.8478 48.7654 1.65 34.8478 48.7654 -1.65 33 49.8478 -2.4919 -33 49.8478 -2.4919 33 49.4142 -3.20564 -33 49.4142 -3.20564 33 48.7654 -3.68253 -33 48.7654 -3.68253 -34.2189 -49.2189 -2.99085 -34.3654 -49.3654 -2.44085 -34.7078 -48.7803 -2.50838 -34.3654 -48.7189 -3.15194 -33.7803 -48.7803 -3.52863 -33.7189 -49.3654 -3.15194 -33.7803 -49.7078 -2.50838 34.2189 -49.2189 -2.99085 33.7189 -49.3654 -3.15194 33.7803 -48.7803 -3.52863 34.3654 -48.7189 -3.15194 34.7078 -48.7803 -2.50838 34.3654 -49.3654 -2.44085 33.7803 -49.7078 -2.50838 34.2189 -49.2189 2.99085 34.3654 -49.3654 2.44085 34.7078 -48.7803 2.50838 34.3654 -48.7189 3.15194 33.7803 -48.7803 3.52863 33.7189 -49.3654 3.15194 33.7803 -49.7078 2.50838 -34.2189 -49.2189 2.99085 -34.3654 -49.3654 2.44085 -33.7803 -49.7078 2.50838 -33.7189 -49.3654 3.15194 -33.7803 -48.7803 3.52863 -34.3654 -48.7189 3.15194 -34.7078 -48.7803 2.50838 -34.2189 49.2189 -2.99085 -34.3654 48.7189 -3.15194 -34.7078 48.7803 -2.50838 -34.3654 49.3654 -2.44085 -33.7803 49.7078 -2.50838 -33.7189 49.3654 -3.15194 -33.7803 48.7803 -3.52863 34.2189 49.2189 -2.99085 33.7189 49.3654 -3.15194 33.7803 49.7078 -2.50838 34.3654 49.3654 -2.44085 34.7078 48.7803 -2.50838 34.3654 48.7189 -3.15194 33.7803 48.7803 -3.52863 34.2189 49.2189 2.99085 34.3654 49.3654 2.44085 33.7803 49.7078 2.50838 33.7189 49.3654 3.15194 33.7803 48.7803 3.52863 34.3654 48.7189 3.15194 34.7078 48.7803 2.50838 -34.2189 49.2189 2.99085 -33.7189 49.3654 3.15194 -33.7803 49.7078 2.50838 -34.3654 49.3654 2.44085 -34.7078 48.7803 2.50838 -34.3654 48.7189 3.15194 -33.7803 48.7803 3.52863</float_array>
+ <technique_common>
+ <accessor source="#DVD_cover_reflection-positions-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="DVD_cover_reflection-normals" name="normal">
+ <float_array id="DVD_cover_reflection-normals-array" count="456">-0.991724 -0.094924 -0.086442 -0.103983 -0.103983 -0.989128 -0.094922 -0.991724 -0.086442 0.103983 -0.103983 -0.989128 0.991724 -0.094924 -0.086442 0.094922 -0.991724 -0.086442 0.991724 -0.094924 0.086442 0.103983 -0.103983 0.989128 0.094922 -0.991724 0.086442 -0.094922 -0.991724 0.086442 -0.103983 -0.103983 0.989128 -0.991724 -0.094924 0.086442 -0.991724 0.094924 -0.086442 -0.094922 0.991724 -0.086442 -0.103983 0.103983 -0.989128 0.094922 0.991724 -0.086442 0.991724 0.094924 -0.086442 0.103983 0.103983 -0.989128 0.094922 0.991724 0.086442 0.103983 0.103983 0.989128 0.991724 0.094924 0.086442 -0.094922 0.991724 0.086442 -0.991724 0.094924 0.086442 -0.103983 0.103983 0.989128 -0.082821 -0.403027 0.911433 0.082821 -0.403026 0.911433 -0.062938 -0.735781 0.674289 0.062938 -0.735781 0.674289 -0.076983 -0.934922 0.346401 0.076983 -0.934922 0.346401 -0.924699 -0.374309 -0.06945 -0.924699 -0.374309 0.06945 -0.706048 -0.706046 -0.054732 -0.706048 -0.706046 0.054732 -0.374309 -0.924699 -0.069452 -0.374309 -0.924699 0.069452 0.924699 -0.374309 0.06945 0.924699 -0.374309 -0.06945 0.706048 -0.706046 0.054732 0.706048 -0.706046 -0.054732 0.374309 -0.924699 0.069452 0.374309 -0.924699 -0.069452 0.082821 -0.403027 -0.911433 -0.082821 -0.403026 -0.911433 0.062938 -0.735781 -0.674289 -0.062938 -0.735781 -0.674289 0.076983 -0.934922 -0.346401 -0.076983 -0.934922 -0.346401 -0.934923 -0.076983 0.3464 -0.934923 0.076984 0.346399 -0.735783 -0.062938 0.674287 -0.735783 0.062939 0.674287 -0.403028 -0.082821 0.911432 -0.403028 0.082821 0.911432 0.403028 -0.082821 0.911432 0.403028 0.082821 0.911432 0.735783 -0.062939 0.674287 0.735783 0.062938 0.674287 0.934923 -0.076984 0.346399 0.934923 0.076983 0.3464 0.934923 -0.076983 -0.3464 0.934923 0.076984 -0.346399 0.735783 -0.062938 -0.674287 0.735783 0.062939 -0.674287 0.403028 -0.082821 -0.911432 0.403028 0.082821 -0.911432 -0.934923 0.076983 -0.3464 -0.934923 -0.076984 -0.346399 -0.735783 0.062938 -0.674287 -0.735783 -0.062939 -0.674287 -0.403028 0.082821 -0.911432 -0.403028 -0.082821 -0.911432 -0.076983 0.934922 0.346401 0.076983 0.934922 0.346401 -0.062938 0.735781 0.674289 0.062938 0.735781 0.674289 -0.082821 0.403026 0.911433 0.082821 0.403027 0.911433 -0.374309 0.924699 -0.069452 -0.374309 0.924699 0.069452 -0.706048 0.706046 -0.054732 -0.706048 0.706046 0.054732 -0.924699 0.374309 -0.06945 -0.924699 0.374309 0.06945 0.374309 0.924699 0.069452 0.374309 0.924699 -0.069452 0.706048 0.706046 0.054732 0.706048 0.706046 -0.054732 0.924699 0.374309 0.06945 0.924699 0.374309 -0.06945 0.076983 0.934922 -0.346401 -0.076983 0.934922 -0.346401 0.062938 0.735781 -0.674289 -0.062938 0.735781 -0.674289 0.082821 0.403026 -0.911433 -0.082821 0.403027 -0.911433 -0.593351 -0.593351 -0.543938 -0.681524 -0.681524 -0.266553 -0.894051 -0.330281 -0.302633 -0.702338 -0.301373 -0.6449 -0.351747 -0.351747 -0.867495 -0.301373 -0.702339 -0.644899 -0.330282 -0.894051 -0.302632 0.593352 -0.59335 -0.543939 0.301373 -0.702338 -0.644899 0.351748 -0.351747 -0.867495 0.702338 -0.301372 -0.6449 0.894051 -0.330281 -0.302634 0.681524 -0.681523 -0.266553 0.330282 -0.894051 -0.302633 0.593351 -0.593351 0.543938 0.681524 -0.681524 0.266553 0.894051 -0.330281 0.302633 0.702338 -0.301373 0.6449 0.351747 -0.351747 0.867495 0.301373 -0.702339 0.644899 0.330282 -0.894051 0.302632 -0.593352 -0.59335 0.543939 -0.681524 -0.681523 0.266553 -0.330282 -0.894051 0.302633 -0.301373 -0.702338 0.644899 -0.351748 -0.351747 0.867495 -0.702338 -0.301372 0.6449 -0.894051 -0.330281 0.302634 -0.593352 0.59335 -0.543939 -0.702338 0.301372 -0.6449 -0.894051 0.330281 -0.302634 -0.681524 0.681523 -0.266553 -0.330282 0.894051 -0.302633 -0.301373 0.702338 -0.644899 -0.351748 0.351747 -0.867495 0.593351 0.593351 -0.543938 0.301373 0.702339 -0.644899 0.330282 0.894051 -0.302632 0.681524 0.681524 -0.266553 0.894051 0.330281 -0.302633 0.702338 0.301373 -0.6449 0.351747 0.351747 -0.867495 0.593352 0.59335 0.543939 0.681524 0.681523 0.266553 0.330282 0.894051 0.302633 0.301373 0.702338 0.644899 0.351748 0.351747 0.867495 0.702338 0.301372 0.6449 0.894051 0.330281 0.302634 -0.593351 0.593351 0.543938 -0.301373 0.702339 0.644899 -0.330282 0.894051 0.302632 -0.681524 0.681524 0.266553 -0.894051 0.330281 0.302633 -0.702338 0.301373 0.6449 -0.351747 0.351747 0.867495</float_array>
+ <technique_common>
+ <accessor source="#DVD_cover_reflection-normals-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="DVD_cover_reflection-DVD_Box-UV" name="DVD_Box-UV">
+ <float_array id="DVD_cover_reflection-DVD_Box-UV-array" count="566">0.68017 0.973548 0.026593 0.973548 0.026593 0.981099 0.68017 0.981099 0.026593 0.9875 0.68017 0.9875 0.870362 0.825253 0.870362 0.172675 0.862028 0.172675 0.862028 0.825253 0.852197 0.172675 0.852197 0.825253 0.764669 0.973319 0.726217 0.973319 0.726217 0.980857 0.764669 0.980857 0.726217 0.987248 0.764669 0.987248 0.852197 0.158692 0.813662 0.158692 0.813662 0.165107 0.852197 0.165107 0.813662 0.172675 0.726217 0.973319 0.726217 0.980857 0.726217 0.987248 0.813662 0.839236 0.852197 0.839236 0.852197 0.83282 0.813662 0.83282 0.813662 0.825253 0.679924 0.973548 0.026346 0.973548 0.026346 0.981099 0.679924 0.981099 0.026346 0.9875 0.679924 0.9875 0.795497 0.172675 0.795497 0.825253 0.803831 0.825253 0.803831 0.172675 0.764669 0.02778 0.774479 0.973319 0.774479 0.02778 0.782795 0.973319 0.782795 0.02778 0.012588 0.026452 0.012588 0.973548 0.019013 0.973548 0.019013 0.026452 0.026593 0.026452 0.68017 0.026452 0.687749 0.973548 0.687749 0.026452 0.694175 0.973548 0.694175 0.026452 0.708091 0.02778 0.708091 0.973319 0.716407 0.973319 0.716407 0.02778 0.726217 0.02778 0.774479 0.973319 0.774479 0.02778 0.782795 0.973319 0.782795 0.02778 0.012342 0.026452 0.012342 0.973548 0.018767 0.973548 0.018767 0.026452 0.026346 0.026452 0.726217 0.02778 0.716407 0.02778 0.716407 0.973319 0.708091 0.02778 0.708091 0.973319 0.693928 0.973548 0.693928 0.026452 0.687503 0.026452 0.687503 0.973548 0.679924 0.026452 0.852197 0.172824 0.852197 0.825402 0.862028 0.825402 0.862028 0.172824 0.870362 0.825402 0.870362 0.172824 0.68017 0.0125 0.026593 0.0125 0.026593 0.018901 0.68017 0.018901 0.813662 0.825402 0.813662 0.832969 0.852197 0.832969 0.813662 0.839385 0.852197 0.839385 0.764669 0.013851 0.726217 0.013851 0.726217 0.020242 0.764669 0.020242 0.813662 0.172824 0.852197 0.165256 0.813662 0.165256 0.852197 0.158841 0.813662 0.158841 0.764669 0.013851 0.726217 0.013851 0.726217 0.020242 0.803831 0.172824 0.803831 0.825402 0.795497 0.172824 0.795497 0.825402 0.679924 0.0125 0.026346 0.0125 0.026346 0.018901 0.679924 0.018901 0.716215 0.981004 0.717002 0.986767 0.708717 0.9804 0.710594 0.985324 0.687651 0.981247 0.693445 0.980641 0.693928 0.973548 0.687043 0.987018 0.691994 0.985574 0.693445 0.980641 0.803639 0.164959 0.796124 0.165567 0.795497 0.172675 0.813662 0.158692 0.804428 0.159175 0.804428 0.159175 0.798005 0.160622 0.796124 0.165567 0.018619 0.981247 0.019227 0.987018 0.012342 0.973548 0.012825 0.980641 0.014275 0.985574 0.774671 0.981004 0.782169 0.9804 0.773884 0.986767 0.780292 0.985324 0.782169 0.9804 0.803639 0.832968 0.804428 0.838753 0.813662 0.839236 0.795497 0.825253 0.796124 0.832361 0.796124 0.832361 0.798005 0.837305 0.804428 0.838753 0.717002 0.986767 0.708091 0.973319 0.708716 0.9804 0.710594 0.985324 0.687898 0.981247 0.693691 0.980641 0.68729 0.987018 0.692241 0.985574 0.693691 0.980641 0.86222 0.832968 0.869735 0.832361 0.870362 0.825253 0.852197 0.839236 0.861431 0.838753 0.861431 0.838753 0.867854 0.837305 0.869735 0.832361 0.86222 0.164959 0.861431 0.159175 0.852197 0.158692 0.870362 0.172675 0.869735 0.165567 0.867854 0.160622 0.018865 0.981247 0.019473 0.987018 0.012588 0.973548 0.013071 0.980641 0.014522 0.985574 0.019473 0.987018 0.774671 0.981004 0.782169 0.9804 0.773884 0.986767 0.773884 0.986767 0.780292 0.985324 0.782169 0.9804 0.716215 0.020094 0.708717 0.020699 0.726217 0.013851 0.717002 0.014332 0.710594 0.015774 0.803639 0.833117 0.804428 0.838902 0.796124 0.83251 0.798005 0.837454 0.804428 0.838902 0.687651 0.018753 0.687043 0.012981 0.679924 0.0125 0.693928 0.026452 0.693445 0.019359 0.693445 0.019359 0.691994 0.014426 0.687043 0.012981 0.803639 0.165109 0.796124 0.165715 0.804428 0.159324 0.798005 0.160771 0.774671 0.020094 0.773884 0.014332 0.764669 0.013851 0.782169 0.020699 0.780292 0.015774 0.773884 0.014332 0.018619 0.018753 0.012825 0.019359 0.012342 0.026452 0.026346 0.0125 0.019227 0.012981 0.019227 0.012981 0.014275 0.014426 0.012825 0.019359 0.86222 0.165109 0.861431 0.159324 0.869735 0.165715 0.867854 0.160771 0.687898 0.018753 0.68729 0.012981 0.68017 0.0125 0.693691 0.019359 0.692241 0.014426 0.68729 0.012981 0.708716 0.020699 0.708091 0.02778 0.726217 0.013851 0.717002 0.014332 0.717002 0.014332 0.710594 0.015774 0.708716 0.020699 0.86222 0.833117 0.869735 0.83251 0.861431 0.838902 0.867854 0.837454 0.774671 0.020094 0.773884 0.014332 0.764669 0.013851 0.782169 0.020699 0.780292 0.015774 0.773884 0.014332 0.018865 0.018753 0.013071 0.019359 0.012588 0.026452 0.026593 0.0125 0.019473 0.012981 0.019473 0.012981 0.014522 0.014426 0.013071 0.019359 0.764669 0.973319 0.764669 0.980857 0.764669 0.980857 0.764669 0.987248 0.764669 0.02778 0.764669 0.973319 0.764669 0.020242 0.764669 0.020242 0.764669 0.02778 0.764669 0.973319 0.764669 0.980857 0.764669 0.980857 0.764669 0.987248 0.716215 0.981004 0.716215 0.981004 0.716215 0.981004 0.716215 0.981004 0.764669 0.02778 0.764669 0.020242 0.764669 0.020242 0.716215 0.020094 0.716215 0.020094 0.716215 0.020094 0.716215 0.020094 0.764669 0.973319 0.764669 0.02778</float_array>
+ <technique_common>
+ <accessor source="#DVD_cover_reflection-DVD_Box-UV-array" count="283" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="DVD_cover_reflection-vertices">
+ <input semantic="POSITION" source="#DVD_cover_reflection-positions"/>
+ <input semantic="NORMAL" source="#DVD_cover_reflection-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="300">
+ <input semantic="VERTEX" source="#DVD_cover_reflection-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#DVD_cover_reflection-DVD_Box-UV" offset="1" set="1"/>
+ <p>7 0 10 1 25 3 25 3 10 1 24 2 25 3 24 2 27 5 27 5 24 2 26 4 27 6 26 7 29 9 29 9 26 7 28 8 29 9 28 8 8 11 8 11 28 8 9 10 11 12 0 13 31 15 31 15 0 13 30 14 31 15 30 14 33 17 33 17 30 14 32 16 33 18 32 19 35 21 35 21 32 19 34 20 35 21 34 20 9 10 9 10 34 20 2 22 4 257 6 23 37 258 37 258 6 23 36 24 37 259 36 24 39 260 39 260 36 24 38 25 39 26 38 27 41 29 41 29 38 27 40 28 41 29 40 28 5 30 5 30 40 28 8 11 1 31 3 32 43 34 43 34 3 32 42 33 43 34 42 33 45 36 45 36 42 33 44 35 45 37 44 38 47 40 47 40 44 38 46 39 47 40 46 39 2 22 2 22 46 39 5 30 22 41 11 12 49 43 49 43 11 12 48 42 49 43 48 42 51 45 51 45 48 42 50 44 51 46 50 47 53 49 53 49 50 47 52 48 53 49 52 48 23 50 23 50 52 48 10 1 19 51 7 0 55 53 55 53 7 0 54 52 55 53 54 52 57 55 57 55 54 52 56 54 57 56 56 57 59 59 59 59 56 57 58 58 59 59 58 58 20 60 20 60 58 58 6 23 16 261 4 262 61 62 61 62 4 262 60 61 61 62 60 61 63 64 63 64 60 61 62 63 63 65 62 66 65 68 65 68 62 66 64 67 65 68 64 67 17 69 17 69 64 67 3 32 0 13 12 70 67 72 67 72 12 70 66 71 67 72 66 71 69 74 69 74 66 71 68 73 69 75 68 76 71 78 71 78 68 76 70 77 71 78 70 77 1 31 1 31 70 77 14 79 18 80 21 81 73 83 73 83 21 81 72 82 73 83 72 82 75 85 75 85 72 82 74 84 75 86 74 87 77 89 77 89 74 87 76 88 77 89 76 88 19 51 19 51 76 88 23 50 21 81 13 90 79 92 79 92 13 90 78 91 79 92 78 91 81 94 81 94 78 91 80 93 81 95 80 96 83 98 83 98 80 96 82 97 83 98 82 97 22 41 22 41 82 97 12 70 15 99 18 80 85 101 85 101 18 80 84 100 85 101 84 100 87 103 87 103 84 100 86 102 87 104 86 105 89 263 89 263 86 105 88 106 89 264 88 106 16 265 16 265 88 106 20 60 13 90 15 99 91 108 91 108 15 99 90 107 91 108 90 107 93 110 93 110 90 107 92 109 93 111 92 112 95 114 95 114 92 112 94 113 95 114 94 113 14 79 14 79 94 113 17 69 0 13 67 72 30 14 30 14 67 72 98 115 98 115 97 116 30 14 30 14 97 116 32 16 67 72 69 74 98 115 98 115 69 74 99 117 99 117 96 118 98 115 98 115 96 118 97 116 1 31 43 34 71 78 71 78 43 34 100 119 71 78 100 119 69 121 69 121 100 119 99 120 43 34 45 36 100 119 100 119 45 36 101 122 101 122 96 123 100 119 100 119 96 123 99 124 2 22 34 20 47 40 47 40 34 20 102 125 47 40 102 125 45 127 45 127 102 125 101 126 32 128 97 129 34 20 34 20 97 129 102 125 97 130 96 131 102 125 102 125 96 131 101 132 3 32 64 67 42 33 42 33 64 67 105 133 42 33 105 133 44 35 44 35 105 133 104 134 64 67 62 135 105 133 105 133 62 135 106 136 106 136 103 137 105 133 105 133 103 137 104 134 4 266 37 267 60 61 60 61 37 267 107 138 60 61 107 138 62 63 62 63 107 138 106 139 39 269 108 140 37 268 37 268 108 140 107 138 108 140 103 141 107 138 107 138 103 141 106 142 5 30 46 39 41 29 41 29 46 39 109 143 109 143 108 144 41 29 41 29 108 144 39 145 46 39 44 146 109 143 109 143 44 146 104 147 104 148 103 149 109 143 109 143 103 149 108 150 6 23 58 58 36 24 36 24 58 58 112 270 112 271 111 151 36 24 36 24 111 151 38 25 58 58 56 152 112 272 112 272 56 152 113 153 113 153 110 154 112 273 112 273 110 154 111 151 7 0 25 3 54 52 54 52 25 3 114 155 54 52 114 155 56 54 56 54 114 155 113 156 25 3 27 5 114 155 114 155 27 5 115 157 115 157 110 158 114 155 114 155 110 158 113 159 8 11 40 28 29 9 29 9 40 28 116 160 29 9 116 160 27 162 27 162 116 160 115 161 38 163 111 164 40 28 40 28 111 164 116 160 111 165 110 166 116 160 116 160 110 166 115 167 9 10 28 8 35 21 35 21 28 8 119 168 119 168 118 169 35 21 35 21 118 169 33 170 28 8 26 171 119 168 119 168 26 171 120 172 120 172 117 173 119 168 119 168 117 173 118 169 10 1 52 48 24 2 24 2 52 48 121 174 24 2 121 174 26 4 26 4 121 174 120 175 52 48 50 176 121 174 121 174 50 176 122 177 122 177 117 178 121 174 121 174 117 178 120 179 11 12 31 15 48 42 48 42 31 15 123 180 48 42 123 180 50 44 50 44 123 180 122 181 33 17 118 182 31 15 31 15 118 182 123 180 118 183 117 184 123 180 123 180 117 184 122 185 12 70 82 97 66 71 66 71 82 97 126 186 66 71 126 186 68 73 68 73 126 186 125 187 80 188 127 189 82 97 82 97 127 189 126 186 127 189 124 190 126 186 126 186 124 190 125 187 13 90 91 108 78 91 78 91 91 108 128 191 128 191 127 192 78 91 78 91 127 192 80 93 91 108 93 110 128 191 128 191 93 110 129 193 129 193 124 194 128 191 128 191 124 194 127 195 14 79 70 77 95 114 95 114 70 77 130 196 95 114 130 196 93 198 93 198 130 196 129 197 70 77 68 199 130 196 130 196 68 199 125 200 125 201 124 202 130 196 130 196 124 202 129 203 15 99 85 101 90 107 90 107 85 101 133 204 90 107 133 204 92 109 92 109 133 204 132 205 87 103 134 206 85 101 85 101 134 206 133 204 134 206 131 207 133 204 133 204 131 207 132 205 16 274 61 62 89 275 89 275 61 62 135 208 135 208 134 209 89 276 89 276 134 209 87 210 61 62 63 64 135 208 135 208 63 64 136 211 136 211 131 212 135 208 135 208 131 212 134 213 17 69 94 113 65 68 65 68 94 113 137 214 65 68 137 214 63 216 63 216 137 214 136 215 94 113 92 217 137 214 137 214 92 217 132 218 132 219 131 220 137 214 137 214 131 220 136 221 18 80 73 83 84 100 84 100 73 83 140 222 140 222 139 223 84 100 84 100 139 223 86 102 73 83 75 85 140 222 140 222 75 85 141 224 141 224 138 225 140 222 140 222 138 225 139 223 19 51 55 53 77 89 77 89 55 53 142 226 77 89 142 226 75 228 75 228 142 226 141 227 55 53 57 55 142 226 142 226 57 55 143 229 143 229 138 230 142 226 142 226 138 230 141 231 20 60 88 106 59 59 59 59 88 106 144 277 59 59 144 278 57 233 57 233 144 278 143 232 86 234 139 235 88 106 88 106 139 235 144 279 139 236 138 237 144 280 144 280 138 237 143 238 21 81 79 92 72 82 72 82 79 92 147 239 72 82 147 239 74 84 74 84 147 239 146 240 81 94 148 241 79 92 79 92 148 241 147 239 148 241 145 242 147 239 147 239 145 242 146 240 22 41 49 43 83 98 83 98 49 43 149 243 149 243 148 244 83 98 83 98 148 244 81 245 49 43 51 45 149 243 149 243 51 45 150 246 150 246 145 247 149 243 149 243 145 247 148 248 23 50 76 88 53 49 53 49 76 88 151 249 53 49 151 249 51 251 51 251 151 249 150 250 76 88 74 252 151 249 151 249 74 252 146 253 146 254 145 255 151 249 151 249 145 255 150 256 5 30 8 11 2 22 2 22 8 11 9 10 17 69 3 32 14 79 14 79 3 32 1 31 20 60 6 23 16 282 16 282 6 23 4 281 23 50 10 1 19 51 19 51 10 1 7 0 12 70 0 13 22 41 22 41 0 13 11 12 21 81 18 80 13 90 13 90 18 80 15 99</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="DVD_cover-reflection">
+ <node id="DVD_Box_reflection" name="DVD_Box_reflection" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#DVD_cover_reflection">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#DVD_reflection_material"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Media/DVD_cover.dae b/Studio/Content/Models Library/Media/DVD_cover.dae
new file mode 100644
index 0000000..80ebc02
--- /dev/null
+++ b/Studio/Content/Models Library/Media/DVD_cover.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/media/DVD_cover.mb</source_data>
+ </contributor>
+ <created>2008-10-01T19:19:54Z</created>
+ <modified>2008-10-01T19:19:54Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="DVD_material" name="DVD_material">
+ <instance_effect url="#DVD_material-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="DVD_material-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="DVD_cover" name="DVD_cover">
+ <mesh>
+ <source id="DVD_cover-positions" name="position">
+ <float_array id="DVD_cover-positions-array" count="456">-35 -48 -1.65 -33 -48 -3.85 -33 -50 -1.65 33 -48 -3.85 35 -48 -1.65 33 -50 -1.65 35 -48 1.65 33 -48 3.85 33 -50 1.65 -33 -50 1.65 -33 -48 3.85 -35 -48 1.65 -35 48 -1.65 -33 50 -1.65 -33 48 -3.85 33 50 -1.65 35 48 -1.65 33 48 -3.85 33 50 1.65 33 48 3.85 35 48 1.65 -33 50 1.65 -35 48 1.65 -33 48 3.85 -33 -48.7654 3.68253 33 -48.7654 3.68253 -33 -49.4142 3.20564 33 -49.4142 3.20564 -33 -49.8478 2.4919 33 -49.8478 2.4919 -34.8478 -48.7654 -1.65 -34.8478 -48.7654 1.65 -34.4142 -49.4142 -1.65 -34.4142 -49.4142 1.65 -33.7654 -49.8478 -1.65 -33.7654 -49.8478 1.65 34.8478 -48.7654 1.65 34.8478 -48.7654 -1.65 34.4142 -49.4142 1.65 34.4142 -49.4142 -1.65 33.7654 -49.8478 1.65 33.7654 -49.8478 -1.65 33 -48.7654 -3.68253 -33 -48.7654 -3.68253 33 -49.4142 -3.20564 -33 -49.4142 -3.20564 33 -49.8478 -2.4919 -33 -49.8478 -2.4919 -34.8478 -48 2.4919 -34.8478 48 2.4919 -34.4142 -48 3.20564 -34.4142 48 3.20564 -33.7654 -48 3.68253 -33.7654 48 3.68253 33.7654 -48 3.68253 33.7654 48 3.68253 34.4142 -48 3.20564 34.4142 48 3.20564 34.8478 -48 2.4919 34.8478 48 2.4919 34.8478 -48 -2.4919 34.8478 48 -2.4919 34.4142 -48 -3.20564 34.4142 48 -3.20564 33.7654 -48 -3.68253 33.7654 48 -3.68253 -34.8478 48 -2.4919 -34.8478 -48 -2.4919 -34.4142 48 -3.20564 -34.4142 -48 -3.20564 -33.7654 48 -3.68253 -33.7654 -48 -3.68253 -33 49.8478 2.4919 33 49.8478 2.4919 -33 49.4142 3.20564 33 49.4142 3.20564 -33 48.7654 3.68253 33 48.7654 3.68253 -33.7654 49.8478 -1.65 -33.7654 49.8478 1.65 -34.4142 49.4142 -1.65 -34.4142 49.4142 1.65 -34.8478 48.7654 -1.65 -34.8478 48.7654 1.65 33.7654 49.8478 1.65 33.7654 49.8478 -1.65 34.4142 49.4142 1.65 34.4142 49.4142 -1.65 34.8478 48.7654 1.65 34.8478 48.7654 -1.65 33 49.8478 -2.4919 -33 49.8478 -2.4919 33 49.4142 -3.20564 -33 49.4142 -3.20564 33 48.7654 -3.68253 -33 48.7654 -3.68253 -34.2189 -49.2189 -2.99085 -34.3654 -49.3654 -2.44085 -34.7078 -48.7803 -2.50838 -34.3654 -48.7189 -3.15194 -33.7803 -48.7803 -3.52863 -33.7189 -49.3654 -3.15194 -33.7803 -49.7078 -2.50838 34.2189 -49.2189 -2.99085 33.7189 -49.3654 -3.15194 33.7803 -48.7803 -3.52863 34.3654 -48.7189 -3.15194 34.7078 -48.7803 -2.50838 34.3654 -49.3654 -2.44085 33.7803 -49.7078 -2.50838 34.2189 -49.2189 2.99085 34.3654 -49.3654 2.44085 34.7078 -48.7803 2.50838 34.3654 -48.7189 3.15194 33.7803 -48.7803 3.52863 33.7189 -49.3654 3.15194 33.7803 -49.7078 2.50838 -34.2189 -49.2189 2.99085 -34.3654 -49.3654 2.44085 -33.7803 -49.7078 2.50838 -33.7189 -49.3654 3.15194 -33.7803 -48.7803 3.52863 -34.3654 -48.7189 3.15194 -34.7078 -48.7803 2.50838 -34.2189 49.2189 -2.99085 -34.3654 48.7189 -3.15194 -34.7078 48.7803 -2.50838 -34.3654 49.3654 -2.44085 -33.7803 49.7078 -2.50838 -33.7189 49.3654 -3.15194 -33.7803 48.7803 -3.52863 34.2189 49.2189 -2.99085 33.7189 49.3654 -3.15194 33.7803 49.7078 -2.50838 34.3654 49.3654 -2.44085 34.7078 48.7803 -2.50838 34.3654 48.7189 -3.15194 33.7803 48.7803 -3.52863 34.2189 49.2189 2.99085 34.3654 49.3654 2.44085 33.7803 49.7078 2.50838 33.7189 49.3654 3.15194 33.7803 48.7803 3.52863 34.3654 48.7189 3.15194 34.7078 48.7803 2.50838 -34.2189 49.2189 2.99085 -33.7189 49.3654 3.15194 -33.7803 49.7078 2.50838 -34.3654 49.3654 2.44085 -34.7078 48.7803 2.50838 -34.3654 48.7189 3.15194 -33.7803 48.7803 3.52863</float_array>
+ <technique_common>
+ <accessor source="#DVD_cover-positions-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="DVD_cover-normals" name="normal">
+ <float_array id="DVD_cover-normals-array" count="456">-0.991724 -0.094924 -0.086442 -0.103983 -0.103983 -0.989128 -0.094922 -0.991724 -0.086442 0.103983 -0.103983 -0.989128 0.991724 -0.094924 -0.086442 0.094922 -0.991724 -0.086442 0.991724 -0.094924 0.086442 0.103983 -0.103983 0.989128 0.094922 -0.991724 0.086442 -0.094922 -0.991724 0.086442 -0.103983 -0.103983 0.989128 -0.991724 -0.094924 0.086442 -0.991724 0.094924 -0.086442 -0.094922 0.991724 -0.086442 -0.103983 0.103983 -0.989128 0.094922 0.991724 -0.086442 0.991724 0.094924 -0.086442 0.103983 0.103983 -0.989128 0.094922 0.991724 0.086442 0.103983 0.103983 0.989128 0.991724 0.094924 0.086442 -0.094922 0.991724 0.086442 -0.991724 0.094924 0.086442 -0.103983 0.103983 0.989128 -0.082821 -0.403027 0.911433 0.082821 -0.403026 0.911433 -0.062938 -0.735781 0.674289 0.062938 -0.735781 0.674289 -0.076983 -0.934922 0.346401 0.076983 -0.934922 0.346401 -0.924699 -0.374309 -0.06945 -0.924699 -0.374309 0.06945 -0.706048 -0.706046 -0.054732 -0.706048 -0.706046 0.054732 -0.374309 -0.924699 -0.069452 -0.374309 -0.924699 0.069452 0.924699 -0.374309 0.06945 0.924699 -0.374309 -0.06945 0.706048 -0.706046 0.054732 0.706048 -0.706046 -0.054732 0.374309 -0.924699 0.069452 0.374309 -0.924699 -0.069452 0.082821 -0.403027 -0.911433 -0.082821 -0.403026 -0.911433 0.062938 -0.735781 -0.674289 -0.062938 -0.735781 -0.674289 0.076983 -0.934922 -0.346401 -0.076983 -0.934922 -0.346401 -0.934923 -0.076983 0.3464 -0.934923 0.076984 0.346399 -0.735783 -0.062938 0.674287 -0.735783 0.062939 0.674287 -0.403028 -0.082821 0.911432 -0.403028 0.082821 0.911432 0.403028 -0.082821 0.911432 0.403028 0.082821 0.911432 0.735783 -0.062939 0.674287 0.735783 0.062938 0.674287 0.934923 -0.076984 0.346399 0.934923 0.076983 0.3464 0.934923 -0.076983 -0.3464 0.934923 0.076984 -0.346399 0.735783 -0.062938 -0.674287 0.735783 0.062939 -0.674287 0.403028 -0.082821 -0.911432 0.403028 0.082821 -0.911432 -0.934923 0.076983 -0.3464 -0.934923 -0.076984 -0.346399 -0.735783 0.062938 -0.674287 -0.735783 -0.062939 -0.674287 -0.403028 0.082821 -0.911432 -0.403028 -0.082821 -0.911432 -0.076983 0.934922 0.346401 0.076983 0.934922 0.346401 -0.062938 0.735781 0.674289 0.062938 0.735781 0.674289 -0.082821 0.403026 0.911433 0.082821 0.403027 0.911433 -0.374309 0.924699 -0.069452 -0.374309 0.924699 0.069452 -0.706048 0.706046 -0.054732 -0.706048 0.706046 0.054732 -0.924699 0.374309 -0.06945 -0.924699 0.374309 0.06945 0.374309 0.924699 0.069452 0.374309 0.924699 -0.069452 0.706048 0.706046 0.054732 0.706048 0.706046 -0.054732 0.924699 0.374309 0.06945 0.924699 0.374309 -0.06945 0.076983 0.934922 -0.346401 -0.076983 0.934922 -0.346401 0.062938 0.735781 -0.674289 -0.062938 0.735781 -0.674289 0.082821 0.403026 -0.911433 -0.082821 0.403027 -0.911433 -0.593351 -0.593351 -0.543938 -0.681524 -0.681524 -0.266553 -0.894051 -0.330281 -0.302633 -0.702338 -0.301373 -0.6449 -0.351747 -0.351747 -0.867495 -0.301373 -0.702339 -0.644899 -0.330282 -0.894051 -0.302632 0.593352 -0.59335 -0.543939 0.301373 -0.702338 -0.644899 0.351748 -0.351747 -0.867495 0.702338 -0.301372 -0.6449 0.894051 -0.330281 -0.302634 0.681524 -0.681523 -0.266553 0.330282 -0.894051 -0.302633 0.593351 -0.593351 0.543938 0.681524 -0.681524 0.266553 0.894051 -0.330281 0.302633 0.702338 -0.301373 0.6449 0.351747 -0.351747 0.867495 0.301373 -0.702339 0.644899 0.330282 -0.894051 0.302632 -0.593352 -0.59335 0.543939 -0.681524 -0.681523 0.266553 -0.330282 -0.894051 0.302633 -0.301373 -0.702338 0.644899 -0.351748 -0.351747 0.867495 -0.702338 -0.301372 0.6449 -0.894051 -0.330281 0.302634 -0.593352 0.59335 -0.543939 -0.702338 0.301372 -0.6449 -0.894051 0.330281 -0.302634 -0.681524 0.681523 -0.266553 -0.330282 0.894051 -0.302633 -0.301373 0.702338 -0.644899 -0.351748 0.351747 -0.867495 0.593351 0.593351 -0.543938 0.301373 0.702339 -0.644899 0.330282 0.894051 -0.302632 0.681524 0.681524 -0.266553 0.894051 0.330281 -0.302633 0.702338 0.301373 -0.6449 0.351747 0.351747 -0.867495 0.593352 0.59335 0.543939 0.681524 0.681523 0.266553 0.330282 0.894051 0.302633 0.301373 0.702338 0.644899 0.351748 0.351747 0.867495 0.702338 0.301372 0.6449 0.894051 0.330281 0.302634 -0.593351 0.593351 0.543938 -0.301373 0.702339 0.644899 -0.330282 0.894051 0.302632 -0.681524 0.681524 0.266553 -0.894051 0.330281 0.302633 -0.702338 0.301373 0.6449 -0.351747 0.351747 0.867495</float_array>
+ <technique_common>
+ <accessor source="#DVD_cover-normals-array" count="152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="DVD_cover-DVD_Box-UV" name="DVD_Box-UV">
+ <float_array id="DVD_cover-DVD_Box-UV-array" count="566">0.68017 0.026452 0.026593 0.026452 0.026593 0.018901 0.68017 0.018901 0.026593 0.0125 0.68017 0.0125 0.870362 0.174748 0.870362 0.827325 0.862028 0.827325 0.862028 0.174748 0.852197 0.827325 0.852197 0.174748 0.764669 0.026681 0.726217 0.026681 0.726217 0.019143 0.764669 0.019143 0.726217 0.012752 0.764669 0.012752 0.852197 0.841308 0.813662 0.841308 0.813662 0.834893 0.852197 0.834893 0.813662 0.827325 0.726217 0.026681 0.726217 0.019143 0.726217 0.012752 0.813662 0.160764 0.852197 0.160764 0.852197 0.16718 0.813662 0.16718 0.813662 0.174748 0.679924 0.026452 0.026346 0.026452 0.026346 0.018901 0.679924 0.018901 0.026346 0.0125 0.679924 0.0125 0.795497 0.827325 0.795497 0.174748 0.803831 0.174748 0.803831 0.827325 0.764669 0.97222 0.774479 0.026681 0.774479 0.97222 0.782795 0.026681 0.782795 0.97222 0.012588 0.973548 0.012588 0.026452 0.019013 0.026452 0.019013 0.973548 0.026593 0.973548 0.68017 0.973548 0.687749 0.026452 0.687749 0.973548 0.694175 0.026452 0.694175 0.973548 0.708091 0.97222 0.708091 0.026681 0.716407 0.026681 0.716407 0.97222 0.726217 0.97222 0.774479 0.026681 0.774479 0.97222 0.782795 0.026681 0.782795 0.97222 0.012342 0.973548 0.012342 0.026452 0.018767 0.026452 0.018767 0.973548 0.026346 0.973548 0.726217 0.97222 0.716407 0.97222 0.716407 0.026681 0.708091 0.97222 0.708091 0.026681 0.693928 0.026452 0.693928 0.973548 0.687503 0.973548 0.687503 0.026452 0.679924 0.973548 0.852197 0.827176 0.852197 0.174599 0.862028 0.174599 0.862028 0.827176 0.870362 0.174599 0.870362 0.827176 0.68017 0.9875 0.026593 0.9875 0.026593 0.981099 0.68017 0.981099 0.813662 0.174599 0.813662 0.167031 0.852197 0.167031 0.813662 0.160615 0.852197 0.160615 0.764669 0.986149 0.726217 0.986149 0.726217 0.979758 0.764669 0.979758 0.813662 0.827176 0.852197 0.834744 0.813662 0.834744 0.852197 0.841159 0.813662 0.841159 0.764669 0.986149 0.726217 0.986149 0.726217 0.979758 0.803831 0.827176 0.803831 0.174599 0.795497 0.827176 0.795497 0.174599 0.679924 0.9875 0.026346 0.9875 0.026346 0.981099 0.679924 0.981099 0.716215 0.018995 0.717002 0.013233 0.708717 0.0196 0.710594 0.014675 0.687651 0.018753 0.693445 0.019359 0.693928 0.026452 0.687043 0.012981 0.691994 0.014426 0.693445 0.019359 0.803639 0.835041 0.796124 0.834433 0.795497 0.827325 0.813662 0.841308 0.804428 0.840826 0.804428 0.840826 0.798005 0.839378 0.796124 0.834433 0.018619 0.018753 0.019227 0.012981 0.012342 0.026452 0.012825 0.019359 0.014275 0.014426 0.774671 0.018995 0.782169 0.0196 0.773884 0.013233 0.780292 0.014675 0.782169 0.0196 0.803639 0.167032 0.804428 0.161247 0.813662 0.160764 0.795497 0.174748 0.796124 0.167639 0.796124 0.167639 0.798005 0.162695 0.804428 0.161247 0.717002 0.013233 0.708091 0.026681 0.708716 0.0196 0.710594 0.014675 0.687898 0.018753 0.693691 0.019359 0.68729 0.012981 0.692241 0.014426 0.693691 0.019359 0.86222 0.167032 0.869735 0.167639 0.870362 0.174748 0.852197 0.160764 0.861431 0.161247 0.861431 0.161247 0.867854 0.162695 0.869735 0.167639 0.86222 0.835041 0.861431 0.840826 0.852197 0.841308 0.870362 0.827325 0.869735 0.834433 0.867854 0.839378 0.018865 0.018753 0.019473 0.012981 0.012588 0.026452 0.013071 0.019359 0.014522 0.014426 0.019473 0.012981 0.774671 0.018995 0.782169 0.0196 0.773884 0.013233 0.773884 0.013233 0.780292 0.014675 0.782169 0.0196 0.716215 0.979905 0.708717 0.979301 0.726217 0.986149 0.717002 0.985668 0.710594 0.984226 0.803639 0.166883 0.804428 0.161098 0.796124 0.16749 0.798005 0.162546 0.804428 0.161098 0.687651 0.981246 0.687043 0.987018 0.679924 0.9875 0.693928 0.973548 0.693445 0.980641 0.693445 0.980641 0.691994 0.985574 0.687043 0.987018 0.803639 0.834892 0.796124 0.834285 0.804428 0.840676 0.798005 0.839229 0.774671 0.979905 0.773884 0.985668 0.764669 0.986149 0.782169 0.979301 0.780292 0.984226 0.773884 0.985668 0.018619 0.981246 0.012825 0.980641 0.012342 0.973548 0.026346 0.9875 0.019227 0.987018 0.019227 0.987018 0.014275 0.985574 0.012825 0.980641 0.86222 0.834892 0.861431 0.840676 0.869735 0.834285 0.867854 0.839229 0.687898 0.981246 0.68729 0.987018 0.68017 0.9875 0.693691 0.980641 0.692241 0.985574 0.68729 0.987018 0.708716 0.979301 0.708091 0.97222 0.726217 0.986149 0.717002 0.985668 0.717002 0.985668 0.710594 0.984226 0.708716 0.979301 0.86222 0.166883 0.869735 0.16749 0.861431 0.161098 0.867854 0.162546 0.774671 0.979905 0.773884 0.985668 0.764669 0.986149 0.782169 0.979301 0.780292 0.984226 0.773884 0.985668 0.018865 0.981246 0.013071 0.980641 0.012588 0.973548 0.026593 0.9875 0.019473 0.987018 0.019473 0.987018 0.014522 0.985574 0.013071 0.980641 0.764669 0.026681 0.764669 0.019143 0.764669 0.019143 0.764669 0.012752 0.764669 0.97222 0.764669 0.026681 0.764669 0.979758 0.764669 0.979758 0.764669 0.97222 0.764669 0.026681 0.764669 0.019143 0.764669 0.019143 0.764669 0.012752 0.716215 0.018995 0.716215 0.018995 0.716215 0.018995 0.716215 0.018995 0.764669 0.97222 0.764669 0.979758 0.764669 0.979758 0.716215 0.979905 0.716215 0.979905 0.716215 0.979905 0.716215 0.979905 0.764669 0.026681 0.764669 0.97222</float_array>
+ <technique_common>
+ <accessor source="#DVD_cover-DVD_Box-UV-array" count="283" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="DVD_cover-vertices">
+ <input semantic="POSITION" source="#DVD_cover-positions"/>
+ <input semantic="NORMAL" source="#DVD_cover-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="300">
+ <input semantic="VERTEX" source="#DVD_cover-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#DVD_cover-DVD_Box-UV" offset="1" set="1"/>
+ <p>7 0 10 1 25 3 25 3 10 1 24 2 25 3 24 2 27 5 27 5 24 2 26 4 27 6 26 7 29 9 29 9 26 7 28 8 29 9 28 8 8 11 8 11 28 8 9 10 11 12 0 13 31 15 31 15 0 13 30 14 31 15 30 14 33 17 33 17 30 14 32 16 33 18 32 19 35 21 35 21 32 19 34 20 35 21 34 20 9 10 9 10 34 20 2 22 4 257 6 23 37 258 37 258 6 23 36 24 37 259 36 24 39 260 39 260 36 24 38 25 39 26 38 27 41 29 41 29 38 27 40 28 41 29 40 28 5 30 5 30 40 28 8 11 1 31 3 32 43 34 43 34 3 32 42 33 43 34 42 33 45 36 45 36 42 33 44 35 45 37 44 38 47 40 47 40 44 38 46 39 47 40 46 39 2 22 2 22 46 39 5 30 22 41 11 12 49 43 49 43 11 12 48 42 49 43 48 42 51 45 51 45 48 42 50 44 51 46 50 47 53 49 53 49 50 47 52 48 53 49 52 48 23 50 23 50 52 48 10 1 19 51 7 0 55 53 55 53 7 0 54 52 55 53 54 52 57 55 57 55 54 52 56 54 57 56 56 57 59 59 59 59 56 57 58 58 59 59 58 58 20 60 20 60 58 58 6 23 16 261 4 262 61 62 61 62 4 262 60 61 61 62 60 61 63 64 63 64 60 61 62 63 63 65 62 66 65 68 65 68 62 66 64 67 65 68 64 67 17 69 17 69 64 67 3 32 0 13 12 70 67 72 67 72 12 70 66 71 67 72 66 71 69 74 69 74 66 71 68 73 69 75 68 76 71 78 71 78 68 76 70 77 71 78 70 77 1 31 1 31 70 77 14 79 18 80 21 81 73 83 73 83 21 81 72 82 73 83 72 82 75 85 75 85 72 82 74 84 75 86 74 87 77 89 77 89 74 87 76 88 77 89 76 88 19 51 19 51 76 88 23 50 21 81 13 90 79 92 79 92 13 90 78 91 79 92 78 91 81 94 81 94 78 91 80 93 81 95 80 96 83 98 83 98 80 96 82 97 83 98 82 97 22 41 22 41 82 97 12 70 15 99 18 80 85 101 85 101 18 80 84 100 85 101 84 100 87 103 87 103 84 100 86 102 87 104 86 105 89 263 89 263 86 105 88 106 89 264 88 106 16 265 16 265 88 106 20 60 13 90 15 99 91 108 91 108 15 99 90 107 91 108 90 107 93 110 93 110 90 107 92 109 93 111 92 112 95 114 95 114 92 112 94 113 95 114 94 113 14 79 14 79 94 113 17 69 0 13 67 72 30 14 30 14 67 72 98 115 98 115 97 116 30 14 30 14 97 116 32 16 67 72 69 74 98 115 98 115 69 74 99 117 99 117 96 118 98 115 98 115 96 118 97 116 1 31 43 34 71 78 71 78 43 34 100 119 71 78 100 119 69 121 69 121 100 119 99 120 43 34 45 36 100 119 100 119 45 36 101 122 101 122 96 123 100 119 100 119 96 123 99 124 2 22 34 20 47 40 47 40 34 20 102 125 47 40 102 125 45 127 45 127 102 125 101 126 32 128 97 129 34 20 34 20 97 129 102 125 97 130 96 131 102 125 102 125 96 131 101 132 3 32 64 67 42 33 42 33 64 67 105 133 42 33 105 133 44 35 44 35 105 133 104 134 64 67 62 135 105 133 105 133 62 135 106 136 106 136 103 137 105 133 105 133 103 137 104 134 4 266 37 267 60 61 60 61 37 267 107 138 60 61 107 138 62 63 62 63 107 138 106 139 39 269 108 140 37 268 37 268 108 140 107 138 108 140 103 141 107 138 107 138 103 141 106 142 5 30 46 39 41 29 41 29 46 39 109 143 109 143 108 144 41 29 41 29 108 144 39 145 46 39 44 146 109 143 109 143 44 146 104 147 104 148 103 149 109 143 109 143 103 149 108 150 6 23 58 58 36 24 36 24 58 58 112 270 112 271 111 151 36 24 36 24 111 151 38 25 58 58 56 152 112 272 112 272 56 152 113 153 113 153 110 154 112 273 112 273 110 154 111 151 7 0 25 3 54 52 54 52 25 3 114 155 54 52 114 155 56 54 56 54 114 155 113 156 25 3 27 5 114 155 114 155 27 5 115 157 115 157 110 158 114 155 114 155 110 158 113 159 8 11 40 28 29 9 29 9 40 28 116 160 29 9 116 160 27 162 27 162 116 160 115 161 38 163 111 164 40 28 40 28 111 164 116 160 111 165 110 166 116 160 116 160 110 166 115 167 9 10 28 8 35 21 35 21 28 8 119 168 119 168 118 169 35 21 35 21 118 169 33 170 28 8 26 171 119 168 119 168 26 171 120 172 120 172 117 173 119 168 119 168 117 173 118 169 10 1 52 48 24 2 24 2 52 48 121 174 24 2 121 174 26 4 26 4 121 174 120 175 52 48 50 176 121 174 121 174 50 176 122 177 122 177 117 178 121 174 121 174 117 178 120 179 11 12 31 15 48 42 48 42 31 15 123 180 48 42 123 180 50 44 50 44 123 180 122 181 33 17 118 182 31 15 31 15 118 182 123 180 118 183 117 184 123 180 123 180 117 184 122 185 12 70 82 97 66 71 66 71 82 97 126 186 66 71 126 186 68 73 68 73 126 186 125 187 80 188 127 189 82 97 82 97 127 189 126 186 127 189 124 190 126 186 126 186 124 190 125 187 13 90 91 108 78 91 78 91 91 108 128 191 128 191 127 192 78 91 78 91 127 192 80 93 91 108 93 110 128 191 128 191 93 110 129 193 129 193 124 194 128 191 128 191 124 194 127 195 14 79 70 77 95 114 95 114 70 77 130 196 95 114 130 196 93 198 93 198 130 196 129 197 70 77 68 199 130 196 130 196 68 199 125 200 125 201 124 202 130 196 130 196 124 202 129 203 15 99 85 101 90 107 90 107 85 101 133 204 90 107 133 204 92 109 92 109 133 204 132 205 87 103 134 206 85 101 85 101 134 206 133 204 134 206 131 207 133 204 133 204 131 207 132 205 16 274 61 62 89 275 89 275 61 62 135 208 135 208 134 209 89 276 89 276 134 209 87 210 61 62 63 64 135 208 135 208 63 64 136 211 136 211 131 212 135 208 135 208 131 212 134 213 17 69 94 113 65 68 65 68 94 113 137 214 65 68 137 214 63 216 63 216 137 214 136 215 94 113 92 217 137 214 137 214 92 217 132 218 132 219 131 220 137 214 137 214 131 220 136 221 18 80 73 83 84 100 84 100 73 83 140 222 140 222 139 223 84 100 84 100 139 223 86 102 73 83 75 85 140 222 140 222 75 85 141 224 141 224 138 225 140 222 140 222 138 225 139 223 19 51 55 53 77 89 77 89 55 53 142 226 77 89 142 226 75 228 75 228 142 226 141 227 55 53 57 55 142 226 142 226 57 55 143 229 143 229 138 230 142 226 142 226 138 230 141 231 20 60 88 106 59 59 59 59 88 106 144 277 59 59 144 278 57 233 57 233 144 278 143 232 86 234 139 235 88 106 88 106 139 235 144 279 139 236 138 237 144 280 144 280 138 237 143 238 21 81 79 92 72 82 72 82 79 92 147 239 72 82 147 239 74 84 74 84 147 239 146 240 81 94 148 241 79 92 79 92 148 241 147 239 148 241 145 242 147 239 147 239 145 242 146 240 22 41 49 43 83 98 83 98 49 43 149 243 149 243 148 244 83 98 83 98 148 244 81 245 49 43 51 45 149 243 149 243 51 45 150 246 150 246 145 247 149 243 149 243 145 247 148 248 23 50 76 88 53 49 53 49 76 88 151 249 53 49 151 249 51 251 51 251 151 249 150 250 76 88 74 252 151 249 151 249 74 252 146 253 146 254 145 255 151 249 151 249 145 255 150 256 5 30 8 11 2 22 2 22 8 11 9 10 17 69 3 32 14 79 14 79 3 32 1 31 20 60 6 23 16 282 16 282 6 23 4 281 23 50 10 1 19 51 19 51 10 1 7 0 12 70 0 13 22 41 22 41 0 13 11 12 21 81 18 80 13 90 13 90 18 80 15 99</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="DVD_cover">
+ <node id="DVD_Box" name="DVD_Box" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#DVD_cover">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#DVD_material"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-1.dae b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-1.dae
new file mode 100644
index 0000000..613c91e
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-1.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/cubes/RoundedCube-1.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:59:58Z</created>
+ <modified>2008-09-19T17:59:58Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="RoundedCube" name="RoundedCube">
+ <mesh>
+ <source id="RoundedCube-positions" name="position">
+ <float_array id="RoundedCube-positions-array" count="744">-50 -40 -40 -50 -40 40 -50 40 40 -50 40 -40 -50 -42.7493 -40 -50 -42.7493 40 -50 -42.7493 40.7559 -50 -42.4822 41.7526 -50 -41.7526 42.4822 -50 -40.7559 42.7493 -50 -40 42.7493 -50 40 42.7493 -50 40.7559 42.7493 -50 41.7526 42.4822 -50 42.4822 41.7526 -50 42.7493 40.7559 -50 42.7493 40 -50 42.7493 -40 -50 42.7493 -40.7559 -50 42.4822 -41.7526 -50 41.7526 -42.4822 -50 40.7559 -42.7493 -50 40 -42.7493 -50 -40 -42.7493 -50 -40.7559 -42.7493 -50 -41.7526 -42.4822 -50 -42.4822 -41.7526 -50 -42.7493 -40.7559 -49.0286 -46.3746 -40 -49.0286 -46.3746 40 -49.0286 -46.3746 41.7526 -49.0286 -45.7554 44.0636 -49.0286 -44.0636 45.7554 -49.0286 -41.7526 46.3746 -49.0286 -40 46.3746 -49.0286 40 46.3746 -49.0286 41.7526 46.3746 -49.0286 44.0636 45.7554 -49.0286 45.7554 44.0636 -49.0286 46.3746 41.7526 -49.0286 46.3746 40 -49.0286 46.3746 -40 -49.0286 46.3746 -41.7526 -49.0286 45.7554 -44.0636 -49.0286 44.0636 -45.7554 -49.0286 41.7526 -46.3746 -49.0286 40 -46.3746 -49.0286 -40 -46.3746 -49.0286 -41.7526 -46.3746 -49.0286 -44.0636 -45.7554 -49.0286 -45.7554 -44.0636 -49.0286 -46.3746 -41.7526 -46.3746 -49.0286 -40 -46.3746 -49.0286 40 -46.3746 -49.0286 42.4822 -46.3746 -48.1515 45.7554 -46.3746 -45.7554 48.1515 -46.3746 -42.4822 49.0286 -46.3746 -40 49.0286 -46.3746 40 49.0286 -46.3746 42.4822 49.0286 -46.3746 45.7554 48.1515 -46.3746 48.1515 45.7554 -46.3746 49.0286 42.4822 -46.3746 49.0286 40 -46.3746 49.0286 -40 -46.3746 49.0286 -42.4822 -46.3746 48.1515 -45.7554 -46.3746 45.7554 -48.1515 -46.3746 42.4822 -49.0286 -46.3746 40 -49.0286 -46.3746 -40 -49.0286 -46.3746 -42.4822 -49.0286 -46.3746 -45.7554 -48.1515 -46.3746 -48.1515 -45.7554 -46.3746 -49.0286 -42.4822 -42.7493 -50 -40 -42.7493 -50 40 -42.7493 -50 42.7493 -42.7493 -49.0286 46.3746 -42.7493 -46.3746 49.0286 -42.7493 -42.7493 50 -42.7493 -40 50 -42.7493 40 50 -42.7493 42.7493 50 -42.7493 46.3746 49.0286 -42.7493 49.0286 46.3746 -42.7493 50 42.7493 -42.7493 50 40 -42.7493 50 -40 -42.7493 50 -42.7493 -42.7493 49.0286 -46.3746 -42.7493 46.3746 -49.0286 -42.7493 42.7493 -50 -42.7493 40 -50 -42.7493 -40 -50 -42.7493 -42.7493 -50 -42.7493 -46.3746 -49.0286 -42.7493 -49.0286 -46.3746 -42.7493 -50 -42.7493 -40 -50 -40 -40 -50 40 -40 -50 42.7493 -40 -49.0286 46.3746 -40 -46.3746 49.0286 -40 -42.7493 50 -40 -40 50 -40 40 50 -40 42.7493 50 -40 46.3746 49.0286 -40 49.0286 46.3746 -40 50 42.7493 -40 50 40 -40 50 -40 -40 50 -42.7493 -40 49.0286 -46.3746 -40 46.3746 -49.0286 -40 42.7493 -50 -40 40 -50 -40 -40 -50 -40 -42.7493 -50 -40 -46.3746 -49.0286 -40 -49.0286 -46.3746 -40 -50 -42.7493 40 -50 -40 40 -50 40 40 -50 42.7493 40 -49.0286 46.3746 40 -46.3746 49.0286 40 -42.7493 50 40 -40 50 40 40 50 40 42.7493 50 40 46.3746 49.0286 40 49.0286 46.3746 40 50 42.7493 40 50 40 40 50 -40 40 50 -42.7493 40 49.0286 -46.3746 40 46.3746 -49.0286 40 42.7493 -50 40 40 -50 40 -40 -50 40 -42.7493 -50 40 -46.3746 -49.0286 40 -49.0286 -46.3746 40 -50 -42.7493 42.7493 -50 -40 42.7493 -50 40 42.7493 -50 42.7493 42.7493 -49.0286 46.3746 42.7493 -46.3746 49.0286 42.7493 -42.7493 50 42.7493 -40 50 42.7493 40 50 42.7493 42.7493 50 42.7493 46.3746 49.0286 42.7493 49.0286 46.3746 42.7493 50 42.7493 42.7493 50 40 42.7493 50 -40 42.7493 50 -42.7493 42.7493 49.0286 -46.3746 42.7493 46.3746 -49.0286 42.7493 42.7493 -50 42.7493 40 -50 42.7493 -40 -50 42.7493 -42.7493 -50 42.7493 -46.3746 -49.0286 42.7493 -49.0286 -46.3746 42.7493 -50 -42.7493 46.3746 -49.0286 -40 46.3746 -49.0286 40 46.3746 -49.0286 42.4822 46.3746 -48.1515 45.7554 46.3746 -45.7554 48.1515 46.3746 -42.4822 49.0286 46.3746 -40 49.0286 46.3746 40 49.0286 46.3746 42.4822 49.0286 46.3746 45.7554 48.1515 46.3746 48.1515 45.7554 46.3746 49.0286 42.4822 46.3746 49.0286 40 46.3746 49.0286 -40 46.3746 49.0286 -42.4822 46.3746 48.1515 -45.7554 46.3746 45.7554 -48.1515 46.3746 42.4822 -49.0286 46.3746 40 -49.0286 46.3746 -40 -49.0286 46.3746 -42.4822 -49.0286 46.3746 -45.7554 -48.1515 46.3746 -48.1515 -45.7554 46.3746 -49.0286 -42.4822 49.0286 -46.3746 -40 49.0286 -46.3746 40 49.0286 -46.3746 41.7526 49.0286 -45.7554 44.0636 49.0286 -44.0636 45.7554 49.0286 -41.7526 46.3746 49.0286 -40 46.3746 49.0286 40 46.3746 49.0286 41.7526 46.3746 49.0286 44.0636 45.7554 49.0286 45.7554 44.0636 49.0286 46.3746 41.7526 49.0286 46.3746 40 49.0286 46.3746 -40 49.0286 46.3746 -41.7526 49.0286 45.7554 -44.0636 49.0286 44.0636 -45.7554 49.0286 41.7526 -46.3746 49.0286 40 -46.3746 49.0286 -40 -46.3746 49.0286 -41.7526 -46.3746 49.0286 -44.0636 -45.7554 49.0286 -45.7554 -44.0636 49.0286 -46.3746 -41.7526 50 -42.7493 -40 50 -42.7493 40 50 -42.7493 40.7559 50 -42.4822 41.7526 50 -41.7526 42.4822 50 -40.7559 42.7493 50 -40 42.7493 50 40 42.7493 50 40.7559 42.7493 50 41.7526 42.4822 50 42.4822 41.7526 50 42.7493 40.7559 50 42.7493 40 50 42.7493 -40 50 42.7493 -40.7559 50 42.4822 -41.7526 50 41.7526 -42.4822 50 40.7559 -42.7493 50 40 -42.7493 50 -40 -42.7493 50 -40.7559 -42.7493 50 -41.7526 -42.4822 50 -42.4822 -41.7526 50 -42.7493 -40.7559 50 -40 -40 50 -40 40 50 40 40 50 40 -40</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-positions-array" count="248" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-normals" name="normal">
+ <float_array id="RoundedCube-normals-array" count="816">-0.994537 -0.104385 0 -0.988123 -0.153111 0.013056 -1 -0.000000 0 -0.98733 -0.137909 0.078491 -0.989489 -0.060171 0.131498 -0.988123 -0.013058 0.15311 -0.987666 0 0.156577 -0.994537 0 0.104385 -0.988123 0.013056 0.15311 -1 0 0 -0.989489 0.060169 0.131498 -0.98733 0.137909 0.078491 -0.988123 0.15311 0.013056 -0.987666 0.156577 0 -0.994537 0.104384 0 -0.988123 0.15311 -0.013056 -1 -0.000000 0 -0.98733 0.137909 -0.078491 -0.989489 0.060167 -0.131499 -0.988123 0.013054 -0.15311 -0.987666 0 -0.156577 -0.994537 0 -0.104385 -0.988123 -0.013055 -0.15311 -1 0 0 -0.98733 -0.07849 -0.137908 -0.989489 -0.131499 -0.060168 -0.988123 -0.15311 -0.013056 -0.987666 -0.156577 0 1 -0.000000 0 0.988123 -0.15311 0.013056 0.987666 -0.156577 0 0.989489 -0.131498 0.060168 0.98733 -0.078492 0.137908 0.988123 -0.013057 0.15311 0.994537 0 0.104385 1 0 0 0.988123 0.013057 0.15311 0.987666 0 0.156577 0.989489 0.06017 0.131498 0.98733 0.137909 0.078491 0.988123 0.153111 0.013056 0.994537 0.104385 0 1 -0.000000 0 0.988123 0.15311 -0.013056 0.987666 0.156577 0 0.98733 0.137909 -0.078491 0.989489 0.060167 -0.131499 0.988123 0.013054 -0.15311 0.994537 0 -0.104385 1 0 0 0.988123 -0.013055 -0.15311 0.987666 0 -0.156577 0.989489 -0.060168 -0.131499 0.98733 -0.137909 -0.078491 0.988123 -0.15311 -0.013056 0.994537 -0.104384 0 -0.870789 -0.488742 0.05345 -0.907073 -0.420974 0 -0.841132 -0.469421 0.268592 -0.883262 -0.215339 0.416507 -0.870789 -0.053451 0.488743 -0.866026 0 0.5 -0.870789 0.05345 0.488743 -0.907073 0 0.420974 -0.857096 0.464349 0.223082 -0.866739 0.255759 0.428194 -0.870789 0.488743 0.05345 -0.866025 0.5 0 -0.870789 0.488743 -0.05345 -0.907073 0.420974 0 -0.841132 0.469421 -0.268591 -0.883262 0.215338 -0.416507 -0.870789 0.053449 -0.488743 -0.866026 0 -0.5 -0.870789 -0.053449 -0.488743 -0.907073 0 -0.420974 -0.841132 -0.268591 -0.469421 -0.883262 -0.416507 -0.215338 -0.870789 -0.488743 -0.05345 -0.866025 -0.5 0 -0.5098 -0.85376 0.105826 -0.575061 -0.818111 0 -0.736618 -0.478222 0.478224 -0.736617 -0.478224 0.478223 -0.509799 -0.105826 0.85376 -0.5 0 0.866026 -0.509799 0.105826 0.85376 -0.575061 0 0.81811 -0.736617 0.478224 0.478223 -0.736618 0.478223 0.478224 -0.509799 0.85376 0.105826 -0.5 0.866026 0 -0.509799 0.85376 -0.105826 -0.575061 0.81811 0 -0.736617 0.478223 -0.478223 -0.736617 0.478223 -0.478223 -0.509799 0.105825 -0.85376 -0.5 0 -0.866026 -0.5098 -0.105825 -0.85376 -0.575061 0 -0.81811 -0.736617 -0.478225 -0.478223 -0.736617 -0.478224 -0.478223 -0.509799 -0.85376 -0.105826 -0.5 -0.866026 0 -0.134586 -0.975822 0.172215 -0.149146 -0.988815 0 -0.114286 -0.832191 0.542583 -0.144186 -0.493073 0.857956 -0.280157 -0.678789 0.678791 -0.280157 -0.678789 0.678791 -0.134713 -0.128482 0.98252 -0.130526 0 0.991445 -0.134586 0.172215 0.975822 -0.149146 0 0.988815 -0.114287 0.542584 0.83219 -0.144186 0.857957 0.493073 -0.280157 0.678789 0.678791 -0.280156 0.678788 0.678793 -0.134713 0.98252 0.128482 -0.130526 0.991445 0 -0.134586 0.975822 -0.172215 -0.149146 0.988815 0 -0.114286 0.832191 -0.542583 -0.144186 0.493073 -0.857956 -0.280157 0.67879 -0.678791 -0.280156 0.678789 -0.678791 -0.134713 0.128481 -0.98252 -0.130526 0 -0.991445 -0.134586 -0.172215 -0.975822 -0.149146 0 -0.988815 -0.114286 -0.542584 -0.83219 -0.144186 -0.857957 -0.493073 -0.280157 -0.67879 -0.678791 -0.280157 -0.678789 -0.678792 -0.134713 -0.98252 -0.128482 -0.130526 -0.991445 0 0 -1 0 0 -0.991445 0.130526 0 -0.866025 0.5 0 -0.5 0.866025 0 -0.130526 0.991445 0 0 1 0 0 1 0 0.130526 0.991445 0 0.5 0.866026 0 0.866026 0.5 0 0.991445 0.130526 0 1 0 0 1 0 0 0.991445 -0.130526 0 0.866025 -0.5 0 0.5 -0.866025 0 0.130526 -0.991445 0 0 -1 0 0 -1 0 -0.130526 -0.991445 0 -0.5 -0.866026 0 -0.866026 -0.5 0 -0.991445 -0.130526 0 -1 0 0 -1 0 0 -0.991445 0.130526 0 -0.866026 0.5 0 -0.5 0.866026 0 -0.130526 0.991445 0 0 1 0 0 1 0 0.130526 0.991445 0 0.5 0.866026 0 0.866025 0.5 0 0.991445 0.130526 0 1 0 0 1 0 0 0.991445 -0.130526 0 0.866026 -0.5 0 0.5 -0.866026 0 0.130526 -0.991445 0 0 -1 0 0 -1 0 -0.130526 -0.991445 0 -0.5 -0.866026 0 -0.866025 -0.5 0 -0.991445 -0.130526 0 -1 0 0.130526 -0.991445 0 0.134713 -0.98252 0.128482 0.144186 -0.857957 0.493073 0.114287 -0.542584 0.83219 0.134586 -0.172215 0.975822 0.149146 0 0.988815 0.130526 0 0.991445 0.134713 0.128482 0.98252 0.144186 0.493073 0.857956 0.114286 0.832191 0.542583 0.134586 0.975822 0.172215 0.149146 0.988815 0 0.130526 0.991445 0 0.134713 0.98252 -0.128482 0.144186 0.857957 -0.493073 0.114286 0.542584 -0.83219 0.134586 0.172215 -0.975822 0.149146 0 -0.988815 0.130526 0 -0.991445 0.134713 -0.128482 -0.98252 0.144186 -0.493073 -0.857956 0.114286 -0.832191 -0.542583 0.134586 -0.975822 -0.172215 0.149146 -0.988815 0 0.509799 -0.85376 0.105826 0.5 -0.866026 0 0.45181 -0.44507 0.773163 0.5338 -0.739301 0.410477 0.509799 -0.105826 0.85376 0.575061 0 0.818111 0.509799 0.105826 0.85376 0.5 0 0.866026 0.45181 0.773163 0.445069 0.5338 0.410477 0.739301 0.5098 0.85376 0.105826 0.575061 0.818111 0 0.509799 0.85376 -0.105826 0.5 0.866026 0 0.451809 0.445069 -0.773163 0.5338 0.739301 -0.410477 0.5098 0.105825 -0.85376 0.575061 0 -0.818111 0.509799 -0.105825 -0.85376 0.5 0 -0.866026 0.45181 -0.773163 -0.445069 0.5338 -0.410477 -0.739301 0.509799 -0.85376 -0.105826 0.575061 -0.81811 0 0.870789 -0.488743 0.05345 0.866025 -0.5 0 0.841132 -0.268592 0.469421 0.883262 -0.416507 0.215338 0.870789 -0.05345 0.488743 0.907073 0 0.420974 0.870789 0.053451 0.488743 0.866026 0 0.5 0.841132 0.46942 0.268592 0.883262 0.215338 0.416507 0.870789 0.488743 0.05345 0.907073 0.420974 0 0.870789 0.488743 -0.05345 0.866025 0.5 0 0.86674 0.255759 -0.428194 0.857096 0.46435 -0.223082 0.870789 0.053449 -0.488743 0.907073 0 -0.420974 0.870789 -0.053449 -0.488743 0.866026 0 -0.5 0.841132 -0.469421 -0.268591 0.883262 -0.215338 -0.416507 0.870789 -0.488743 -0.05345 0.907073 -0.420974 0 -0.719859 -0.670469 0.179651 -0.719859 -0.179653 0.670469 -0.719859 0.179653 0.670468 -0.719859 0.670469 0.179651 -0.71986 0.670468 -0.179651 -0.71986 0.179651 -0.670468 -0.71986 -0.179651 -0.670468 -0.71986 -0.670468 -0.179651 -0.267741 -0.930661 0.249369 -0.267741 -0.24937 0.930661 -0.267741 0.24937 0.930661 -0.26774 0.930661 0.249369 -0.26774 0.930661 -0.249369 -0.26774 0.249369 -0.930661 -0.267739 -0.249369 -0.930662 -0.26774 -0.930661 -0.249369</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-normals-array" count="272" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-Texture" name="Texture">
+ <float_array id="RoundedCube-Texture-array" count="692">0.907925 0.064037 0.915634 0.064037 0.907925 0.092074 0.925798 0.06676 0.933239 0.074201 0.935963 0.084366 0.935963 0.092074 0.935963 0.907925 0.935963 0.915634 0.907925 0.907925 0.933239 0.925798 0.925798 0.933239 0.915634 0.935963 0.907925 0.935963 0.092074 0.935963 0.084366 0.935963 0.092074 0.907925 0.074201 0.933239 0.06676 0.925798 0.064037 0.915634 0.064037 0.907925 0.064037 0.092074 0.064037 0.084366 0.092074 0.092074 0.06676 0.074201 0.074201 0.06676 0.084366 0.064037 0.092074 0.064037 0.092074 0.092074 0.092074 0.064037 0.074201 0.06676 0.06676 0.074201 0.092074 0.907925 0.06676 0.925798 0.074201 0.933239 0.092074 0.935963 0.907925 0.907925 0.907925 0.935963 0.925798 0.933239 0.933239 0.925798 0.907925 0.092074 0.933239 0.074201 0.925798 0.06676 0.907925 0.064037 0.925798 0.027065 0.907925 0.027065 0.949366 0.03338 0.966619 0.050633 0.972935 0.074201 0.972935 0.092074 0.972935 0.925798 0.972935 0.907925 0.949366 0.96662 0.966619 0.949366 0.925798 0.972935 0.907925 0.972935 0.074201 0.972935 0.092074 0.972935 0.050633 0.96662 0.03338 0.949366 0.027065 0.925798 0.027065 0.907925 0.027065 0.074201 0.027065 0.092074 0.03338 0.050633 0.050633 0.03338 0.074201 0.027065 0.092074 0.027065 0.027065 0.933239 0 0.925798 0 0.907925 0 0.925798 0.966619 0.008944 0.991056 0.03338 0.027065 0.06676 0 0.074201 0 0.092074 0 0.074201 0.027065 0.933239 0 0.925798 0 0.907925 0 0.925798 0.991056 0.96662 0.966619 0.991056 0.972935 0.933239 1 0.925798 1 0.907925 1 0.925798 0.972935 0.06676 1 0.074201 0.972935 0.092074 1 0.092074 1 0.074201 0.03338 0.991056 0.008944 0.96662 0.972935 0.933239 1 0.925798 1 0.907925 1 0.925798 0.972935 0.06676 1 0.074201 1 0.092074 1 0.074201 0.008944 0.03338 0.03338 0.008944 0.027065 0.06676 0.027065 0.092074 0 0.074201 0 0.092074 0 0.074201 0.064037 0.935963 0.064037 0 0.064037 0.027065 0.027065 0.008944 0.027065 0.03338 0.027065 0.008944 0.064037 0.064037 0.027065 0.06676 0.027065 0.06676 0.064037 0.972935 0.064037 1 0.027065 0.96662 0.027065 0.991056 0.027065 0.96662 0.935963 0.935963 0.972935 0.933239 0.972935 0.933239 0.935963 0.064037 0.935963 0.092074 0.935963 1 0.935963 0.972935 0.972935 0.991056 0.972935 0.96662 0.972935 0.991056 0.972935 0.933239 0.972935 0.933239 0.935963 0.027065 0.935963 0 0.972935 0.03338 0.972935 0.008944 0.972935 0.03338 0.064037 0.092074 0.027065 0.06676 0.027065 0.06676 0.092074 0.907925 0.092074 0.935963 0.092074 0 0.092074 0.027065 0.064037 0 0.064037 0 0.092074 0.064037 0.092074 0.092074 0.092074 0.972935 0.092074 1 0.907925 0.092074 0.907925 1 0.935963 1 0.935963 1 0.907925 0 0.092074 0.092074 0.907925 0 0.092074 0 0.092074 0 0.092074 1 0.907925 1 0.907925 1 0.935963 0 0.907925 0 0.907925 0 0.064037 1 0.092074 1 0.092074 1 0.935963 0 0.972935 0.008944 0.935963 0 0.064037 1 0.027065 0.991056 0.064037 1 0.008944 0.03338 0.03338 0.008944 0.03338 0.050633 0.050633 0.03338 0.03338 0.008944 1 0.074201 1 0.074201 0.03338 0.991056 0.008944 0.96662 0.050633 0.96662 0.03338 0.949366 0.008944 0.96662 0 0.925798 0 0.925798 0.991056 0.96662 0.96662 0.991056 0.96662 0.949366 0.949366 0.96662 0.96662 0.991056 0 0.925798 0 0.925798 0.96662 0.008944 0.991056 0.03338 0.949366 0.03338 0.96662 0.050633 0.991056 0.03338 1 0.074201 1 0.074201 0.074201 0.027065 0.092074 0.027065 0.092074 0.027065 0.027065 0.092074 0.027065 0.092074 0.027065 0.925798 0.027065 0.907925 0.027065 0.907925 0.074201 0.972935 0.092074 0.972935 0.092074 0.972935 0.925798 0.972935 0.907925 0.972935 0.907925 0.972935 0.972935 0.907925 0.972935 0.907925 0.972935 0.074201 0.972935 0.092074 0.972935 0.092074 0.925798 0.027065 0.907925 0.027065 0.907925 0.027065 0 0.092074 0 0.907925 0 0.092074 0.933239 0 0.933239 0 1 0.06676 0 0.092074 0 0.907925 0 0.092074 1 0.933239 1 0.933239 0.933239 1 1 0.907925 1 0.092074 1 0.907925 0.06676 1 0.06676 1 0 0.933239 1 0.907925 1 0.092074 1 0.907925 0 0.06676 0 0.06676 0.06676 0 0.027065 0.966619 0.027065 0.966619 0.027065 0.03338 0.027065 0.06676 0.027065 0.03338 0.027065 0.96662 0.027065 0.96662 0.935963 0.972935 0.972935 0.966619 0.972935 0.933239 0.972935 0.966619 0.972935 0.03338 0.972935 0.03338 0.972935 0.96662 0.972935 0.933239 0.972935 0.96662 0.972935 0.03338 0.972935 0.03338 0.064037 0.027065 0.027065 0.03338 0.027065 0.06676 0.027065 0.03338 0.907925 0.972935 0.935963 0.972935 0.935963 0.972935 0.092074 0.027065 0.064037 0.027065 0.064037 0.027065 0.092074 0.972935 0.907925 0.972935 0.907925 0.972935 0.907925 0.027065 0.092074 0.027065 0.092074 0.027065 0.064037 0.972935 0.092074 0.972935 0.092074 0.972935 0.935963 0.027065 0.907925 0.027065 0.907925 0.027065 0.064037 0.972935 0.027065 0.966619 0.027065 0.966619 0.935963 0.027065 0.972935 0.03338 0.972935 0.03338 0.03338 0.008944 0.06676 0 0.074201 0.027065 0.06676 0 0.008944 0.03338 0 0.06676 0 0.06676 0.008944 0.96662 0 0.933239 0.027065 0.925798 0 0.933239 0.03338 0.991056 0.06676 1 0.06676 1 0.96662 0.991056 0.933239 1 0.925798 0.972935 0.933239 1 0.991056 0.96662 1 0.933239 1 0.933239 0.991056 0.03338 1 0.06676 0.972935 0.074201 1 0.06676 0.96662 0.008944 0.933239 0 0.933239 0 0.907925 0.027065 0.092074 0.027065 0.907925 0.027065 0.074201 0.027065 0.074201 0.027065 0.027065 0.092074 0.027065 0.907925 0.027065 0.092074 0.027065 0.925798 0.027065 0.925798 0.092074 0.972935 0.907925 0.972935 0.092074 0.972935 0.925798 0.972935 0.925798 0.972935 0.972935 0.907925 0.972935 0.092074 0.972935 0.907925 0.972935 0.074201 0.972935 0.074201</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-Texture-array" count="346" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="RoundedCube-vertices">
+ <input semantic="POSITION" source="#RoundedCube-positions"/>
+ </vertices>
+ <triangles material="lambert2SG" count="492">
+ <input semantic="VERTEX" source="#RoundedCube-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#RoundedCube-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#RoundedCube-Texture" offset="2" set="1"/>
+ <p>5 0 0 6 1 1 1 2 2 6 1 1 7 3 3 1 2 2 7 3 3 8 4 4 1 2 2 8 4 4 9 5 5 1 2 2 9 5 5 10 6 6 1 2 2 11 7 7 12 8 8 2 9 9 12 8 8 13 10 10 2 9 9 13 10 10 14 11 11 2 9 9 14 11 11 15 12 12 2 9 9 15 12 12 16 13 13 2 9 9 17 14 14 18 15 15 3 16 16 18 15 15 19 17 17 3 16 16 19 17 17 20 18 18 3 16 16 20 18 18 21 19 19 3 16 16 21 19 19 22 20 20 3 16 16 23 21 21 24 22 22 0 23 23 24 22 22 25 24 24 0 23 23 25 24 24 26 25 25 0 23 23 26 25 25 27 26 26 0 23 23 27 26 26 4 27 27 0 23 23 245 28 28 222 29 26 221 30 29 245 28 28 223 31 30 222 29 26 245 28 28 224 32 31 223 31 30 245 28 28 225 33 22 224 32 31 245 28 28 226 34 21 225 33 22 246 35 32 228 36 19 227 37 20 246 35 32 229 38 33 228 36 19 246 35 32 230 39 34 229 38 33 246 35 32 231 40 15 230 39 34 246 35 32 232 41 35 231 40 15 247 42 36 234 43 12 233 44 37 247 42 36 235 45 38 234 43 12 247 42 36 236 46 39 235 45 38 247 42 36 237 47 8 236 46 39 247 42 36 238 48 7 237 47 8 244 49 40 240 50 5 239 51 6 244 49 40 241 52 41 240 50 5 244 49 40 242 53 42 241 52 41 244 49 40 243 54 1 242 53 42 244 49 40 220 55 43 243 54 1 0 23 23 1 2 2 3 16 16 2 9 9 3 16 16 1 2 2 30 56 44 6 1 1 29 57 45 5 0 0 29 57 45 6 1 1 31 58 46 32 59 47 7 3 3 8 4 4 7 3 3 32 59 47 33 60 48 34 61 49 9 5 5 10 6 6 9 5 5 34 61 49 36 62 50 12 8 8 35 63 51 11 7 7 35 63 51 12 8 8 38 64 52 14 11 11 37 65 53 13 10 10 37 65 53 14 11 11 39 66 54 40 67 55 15 12 12 16 13 13 15 12 12 40 67 55 42 68 56 18 15 15 41 69 57 17 14 14 41 69 57 18 15 15 43 70 58 44 71 59 19 17 17 20 18 18 19 17 17 44 71 59 45 72 60 46 73 61 21 19 19 22 20 20 21 19 19 46 73 61 48 74 62 24 22 22 47 75 63 23 21 21 47 75 63 24 22 22 49 76 64 50 77 65 25 24 24 26 25 25 25 24 24 50 77 65 51 78 66 28 79 67 27 26 26 4 27 27 27 26 26 28 79 67 54 80 68 30 56 69 53 81 61 29 57 70 53 81 61 30 56 71 55 82 72 56 83 73 31 58 46 32 59 47 31 58 46 56 83 73 57 84 74 58 85 63 33 60 75 34 61 76 33 60 77 58 85 63 60 86 78 36 62 79 59 87 61 35 63 80 59 87 61 36 62 81 61 88 82 62 89 83 37 65 53 38 64 52 37 65 53 62 89 83 63 90 84 64 91 51 39 66 85 40 67 86 39 66 87 64 91 51 66 92 88 42 68 89 65 93 90 41 69 91 65 93 90 42 68 92 67 94 93 68 95 94 43 70 58 44 71 59 43 70 58 68 95 94 69 96 95 70 97 51 45 72 96 46 73 97 45 72 98 70 97 51 72 98 99 48 74 100 71 99 49 47 75 101 71 99 49 48 74 102 73 100 103 74 101 104 49 76 64 50 77 65 49 76 64 74 101 104 75 102 105 52 103 106 51 78 107 28 79 108 51 78 109 52 103 106 78 104 110 54 80 68 77 105 20 53 81 61 77 105 20 54 80 68 79 106 111 80 107 112 55 108 113 56 109 114 55 108 115 80 107 112 81 110 116 82 111 21 57 84 117 58 85 63 57 84 118 82 111 21 84 112 110 60 86 78 83 113 20 59 87 61 83 113 20 60 86 78 85 114 119 86 115 120 61 116 121 62 117 122 61 116 123 86 115 120 87 118 124 88 119 7 63 90 125 64 91 51 63 90 126 88 119 7 90 120 127 66 92 88 89 121 128 65 93 90 89 121 128 66 92 88 91 122 129 92 123 130 67 124 131 68 125 132 67 124 133 92 123 130 93 126 124 94 127 7 69 96 134 70 97 51 69 96 135 94 127 7 96 128 127 72 98 99 95 129 6 71 99 49 95 129 6 72 98 99 97 130 136 98 131 137 73 132 138 74 133 139 73 132 140 98 131 137 99 134 116 76 135 141 75 102 142 52 103 106 75 102 143 76 135 141 101 136 144 102 137 145 77 105 20 78 104 110 77 105 20 102 137 145 103 138 146 104 139 147 79 106 148 80 107 112 79 106 149 104 139 147 105 140 150 106 141 151 81 110 116 82 111 21 81 110 116 106 141 151 107 142 144 108 143 145 83 113 20 84 112 110 83 113 20 108 143 145 109 144 152 110 145 153 85 114 119 86 115 120 85 114 119 110 145 153 111 146 13 112 147 9 87 118 124 88 119 7 87 118 124 112 147 9 113 148 154 114 149 0 89 121 128 90 120 127 89 121 128 114 149 0 115 150 155 116 151 55 91 122 156 92 123 130 91 122 157 116 151 55 117 152 13 118 153 9 93 126 124 94 127 7 93 126 124 118 153 9 119 154 2 120 155 0 95 129 6 96 128 127 95 129 6 120 155 0 121 156 45 122 157 158 97 130 136 98 131 137 97 130 136 122 157 158 123 158 150 100 159 159 99 134 116 76 135 141 99 134 116 100 159 159 125 160 9 126 161 13 101 136 144 102 137 145 101 136 144 126 161 13 127 162 160 128 163 45 103 138 161 104 139 147 103 138 162 128 163 45 129 164 0 130 165 2 105 140 150 106 141 151 105 140 150 130 165 2 131 166 9 132 167 13 107 142 144 108 143 145 107 142 144 132 167 13 133 168 55 134 169 155 109 144 152 110 145 153 109 144 152 134 169 155 135 170 145 136 171 144 111 146 13 112 147 9 111 146 13 136 171 144 137 172 159 138 173 150 113 148 154 114 149 0 113 148 154 138 173 150 139 174 163 140 175 152 115 150 164 116 151 55 115 150 165 140 175 152 141 176 145 142 177 144 117 152 13 118 153 9 117 152 13 142 177 144 143 178 151 144 179 150 119 154 2 120 155 0 119 154 2 144 179 150 145 180 147 146 181 146 121 156 45 122 157 158 121 156 45 146 181 146 147 182 0 124 183 154 123 158 150 100 159 159 123 158 150 124 183 154 149 184 7 150 185 124 125 160 9 126 161 13 125 160 9 150 185 124 151 186 166 152 187 136 127 162 167 128 163 45 127 162 168 152 187 136 153 188 127 154 189 6 129 164 0 130 165 2 129 164 0 154 189 6 155 190 7 156 191 124 131 166 9 132 167 13 131 166 9 156 191 124 157 192 130 158 193 129 133 168 55 134 169 155 133 168 55 158 193 129 159 194 110 160 195 20 135 170 145 136 171 144 135 170 145 160 195 20 161 196 141 162 197 116 137 172 159 138 173 150 137 172 159 162 197 116 163 198 169 164 199 119 139 174 170 140 175 152 139 174 171 164 199 119 165 200 110 166 201 20 141 176 145 142 177 144 141 176 145 166 201 20 167 202 21 168 203 116 143 178 151 144 179 150 143 178 151 168 203 116 169 204 112 170 205 111 145 180 147 146 181 146 145 180 147 170 205 111 171 206 127 148 207 128 147 182 0 124 183 154 147 182 0 148 207 128 150 185 124 149 184 7 174 208 84 173 209 51 174 208 84 149 184 7 152 187 136 151 186 172 176 210 138 175 211 173 176 210 138 151 186 174 153 188 127 177 212 99 154 189 6 178 213 49 154 189 6 177 212 99 156 191 124 155 190 7 180 214 95 179 215 51 180 214 95 155 190 7 158 193 129 157 192 130 182 216 131 181 217 132 182 216 131 157 192 130 159 194 110 183 218 68 160 195 20 184 219 61 160 195 20 183 218 68 162 197 116 161 196 141 186 220 105 185 221 106 186 220 105 161 196 141 164 199 119 163 198 175 188 222 121 187 223 176 188 222 121 163 198 177 165 200 110 189 224 78 166 201 20 190 225 61 166 201 20 189 224 78 168 203 116 167 202 21 192 226 74 191 227 63 192 226 74 167 202 21 170 205 111 169 204 112 194 228 113 193 229 114 194 228 113 169 204 112 171 206 127 195 230 88 148 207 128 172 231 90 148 207 128 195 230 88 174 208 84 173 209 51 198 232 85 197 233 86 198 232 85 173 209 51 176 210 178 175 211 179 200 234 180 199 235 181 200 234 180 175 211 182 177 212 99 201 236 183 178 213 49 202 237 101 178 213 49 201 236 184 180 214 95 179 215 51 204 238 96 203 239 86 204 238 96 179 215 51 182 216 185 181 217 186 206 240 187 205 241 188 206 240 187 181 217 189 183 218 68 207 242 190 184 219 61 208 243 70 184 219 61 207 242 191 186 220 105 185 221 106 210 244 107 209 245 108 210 244 107 185 221 106 188 222 192 187 223 193 212 246 194 211 247 195 212 246 194 187 223 196 189 224 78 213 248 197 190 225 61 214 249 70 190 225 61 213 248 198 192 226 74 191 227 63 216 250 75 215 251 76 216 250 75 191 227 63 194 228 199 193 229 200 218 252 201 217 253 202 218 252 201 193 229 203 195 230 88 219 254 204 172 231 90 196 255 91 172 231 90 219 254 205 198 232 206 197 233 207 222 29 26 221 30 29 222 29 26 197 233 208 200 234 180 199 235 181 224 32 31 223 31 30 224 32 31 199 235 181 201 236 62 225 33 22 202 237 209 226 34 21 202 237 210 225 33 22 204 238 211 203 239 212 228 36 19 227 37 20 228 36 19 203 239 213 206 240 187 205 241 188 230 39 34 229 38 33 230 39 34 205 241 188 207 242 214 231 40 15 208 243 215 232 41 35 208 243 216 231 40 15 210 244 217 209 245 218 234 43 12 233 44 37 234 43 12 209 245 219 211 247 195 235 45 38 212 246 194 236 46 39 212 246 194 235 45 38 213 248 50 237 47 8 214 249 220 238 48 7 214 249 221 237 47 8 216 250 222 215 251 223 240 50 5 239 51 6 240 50 5 215 251 224 218 252 201 217 253 202 242 53 42 241 52 41 242 53 42 217 253 202 219 254 225 243 54 1 196 255 226 220 55 43 196 255 227 243 54 1 4 27 27 5 0 0 0 23 23 1 2 2 0 23 23 5 0 0 10 6 6 11 7 7 1 2 2 2 9 9 1 2 2 11 7 7 16 13 13 17 14 14 2 9 9 3 16 16 2 9 9 17 14 14 22 20 20 23 21 21 3 16 16 0 23 23 3 16 16 23 21 21 28 79 67 29 57 45 4 27 27 5 0 0 4 27 27 29 57 45 31 58 46 7 3 3 30 56 44 6 1 1 30 56 44 7 3 3 32 59 47 33 60 48 8 4 4 9 5 5 8 4 4 33 60 48 34 61 49 35 63 51 10 6 6 11 7 7 10 6 6 35 63 51 37 65 53 13 10 10 36 62 50 12 8 8 36 62 50 13 10 10 38 64 52 39 66 54 14 11 11 15 12 12 14 11 11 39 66 54 40 67 55 41 69 57 16 13 13 17 14 14 16 13 13 41 69 57 43 70 58 19 17 17 42 68 56 18 15 15 42 68 56 19 17 17 44 71 59 45 72 60 20 18 18 21 19 19 20 18 18 45 72 60 46 73 61 47 75 63 22 20 20 23 21 21 22 20 20 47 75 63 49 76 64 25 24 24 48 74 62 24 22 22 48 74 62 25 24 24 50 77 65 51 78 66 26 25 25 27 26 26 26 25 25 51 78 66 52 103 106 53 81 61 28 79 228 29 57 229 28 79 230 53 81 61 55 256 72 31 58 46 54 80 231 30 56 44 54 80 232 31 58 46 56 257 73 57 84 233 32 59 47 33 60 48 32 59 47 57 84 233 58 85 63 59 87 61 34 61 234 35 63 235 34 61 236 59 87 61 61 258 82 37 65 53 60 86 237 36 62 50 60 86 238 37 65 53 62 259 83 63 90 239 38 64 52 39 66 54 38 64 52 63 90 239 64 91 51 65 93 90 40 67 240 41 69 241 40 67 242 65 93 90 67 260 93 43 70 58 66 92 243 42 68 56 66 92 244 43 70 58 68 261 94 69 96 245 44 71 59 45 72 60 44 71 59 69 96 245 70 97 51 71 99 49 46 73 246 47 75 247 46 73 248 71 99 49 73 262 103 49 76 64 72 98 249 48 74 62 72 98 250 49 76 64 74 263 104 75 102 251 50 77 65 51 78 66 50 77 65 75 102 251 76 135 141 77 105 20 52 103 106 53 81 61 52 103 106 77 105 20 79 106 119 55 264 252 78 104 110 54 80 68 78 104 110 55 264 253 80 107 112 81 110 116 56 265 254 57 84 255 56 265 256 81 110 116 82 111 21 83 113 20 58 85 63 59 87 61 58 85 63 83 113 20 85 114 119 61 266 257 84 112 110 60 86 78 84 112 110 61 266 258 86 115 259 87 118 124 62 267 260 63 90 261 62 267 262 87 118 124 88 119 7 89 121 128 64 91 51 65 93 90 64 91 51 89 121 128 91 122 136 67 268 263 90 120 127 66 92 88 90 120 127 67 268 264 92 123 130 93 126 124 68 269 265 69 96 266 68 269 267 93 126 124 94 127 7 95 129 6 70 97 51 71 99 49 70 97 51 95 129 6 97 130 136 73 270 268 96 128 127 72 98 99 96 128 127 73 270 269 98 131 270 99 134 116 74 271 271 75 102 272 74 271 273 99 134 116 100 159 159 101 136 144 76 135 141 77 105 20 76 135 141 101 136 144 102 137 145 103 138 152 78 104 110 79 106 119 78 104 110 103 138 152 104 139 147 105 140 150 80 107 112 81 110 116 80 107 112 105 140 150 106 141 151 107 142 144 82 111 21 83 113 20 82 111 21 107 142 144 108 143 145 109 144 152 84 112 110 85 114 119 84 112 110 109 144 152 110 145 274 111 146 13 86 115 275 87 118 124 86 115 276 111 146 13 112 147 9 113 148 154 88 119 7 89 121 128 88 119 7 113 148 154 114 149 0 115 150 45 90 120 127 91 122 136 90 120 127 115 150 45 116 151 55 117 152 13 92 123 130 93 126 124 92 123 130 117 152 13 118 153 9 119 154 2 94 127 7 95 129 6 94 127 7 119 154 2 120 155 0 121 156 45 96 128 127 97 130 136 96 128 127 121 156 45 122 157 277 123 158 150 98 131 278 99 134 116 98 131 279 123 158 150 124 183 154 125 160 9 100 159 159 101 136 144 100 159 159 125 160 9 126 161 13 127 162 55 102 137 145 103 138 152 102 137 145 127 162 55 128 163 45 129 164 0 104 139 147 105 140 150 104 139 147 129 164 0 130 165 2 131 166 9 106 141 151 107 142 144 106 141 151 131 166 9 132 167 13 133 168 55 108 143 145 109 144 152 108 143 145 133 168 55 134 169 280 135 170 145 110 145 281 111 146 13 110 145 282 135 170 145 136 171 144 137 172 159 112 147 9 113 148 154 112 147 9 137 172 159 138 173 150 139 174 147 114 149 0 115 150 45 114 149 0 139 174 147 140 175 152 141 176 145 116 151 55 117 152 13 116 151 55 141 176 145 142 177 144 143 178 151 118 153 9 119 154 2 118 153 9 143 178 151 144 179 150 145 180 147 120 155 0 121 156 45 120 155 0 145 180 147 146 181 283 147 182 0 122 157 284 123 158 150 122 157 285 147 182 0 148 207 128 149 184 7 124 183 154 125 160 9 124 183 154 149 184 7 150 185 124 151 186 130 126 161 13 127 162 55 126 161 13 151 186 130 152 187 136 153 188 127 128 163 45 129 164 0 128 163 45 153 188 127 154 189 6 155 190 7 130 165 2 131 166 9 130 165 2 155 190 7 156 191 124 157 192 130 132 167 13 133 168 55 132 167 13 157 192 130 158 193 286 159 194 110 134 169 287 135 170 145 134 169 288 159 194 110 160 195 20 161 196 141 136 171 144 137 172 159 136 171 144 161 196 141 162 197 116 163 198 112 138 173 150 139 174 147 138 173 150 163 198 112 164 199 119 165 200 110 140 175 152 141 176 145 140 175 152 165 200 110 166 201 20 167 202 21 142 177 144 143 178 151 142 177 144 167 202 21 168 203 116 169 204 112 144 179 150 145 180 147 144 179 150 169 204 112 170 205 289 171 206 127 146 181 290 147 182 0 146 181 291 171 206 127 172 231 90 173 209 51 148 207 128 149 184 7 148 207 128 173 209 51 151 186 130 150 185 124 175 211 260 174 208 84 175 211 260 150 185 124 152 187 136 176 210 138 153 188 127 177 212 99 153 188 127 176 210 138 178 213 49 179 215 51 154 189 6 155 190 7 154 189 6 179 215 51 157 192 130 156 191 124 181 217 132 180 214 95 181 217 132 156 191 124 158 193 292 182 216 293 159 194 110 183 218 68 159 194 110 182 216 294 184 219 61 185 221 106 160 195 20 161 196 141 160 195 20 185 221 106 163 198 112 162 197 116 187 223 271 186 220 105 187 223 271 162 197 116 164 199 119 188 222 121 165 200 110 189 224 78 165 200 110 188 222 121 190 225 61 191 227 63 166 201 20 167 202 21 166 201 20 191 227 63 169 204 112 168 203 116 193 229 114 192 226 74 193 229 114 168 203 116 170 205 295 194 228 296 171 206 127 195 230 88 171 206 127 194 228 297 196 255 91 197 233 86 172 231 90 173 209 51 172 231 90 197 233 86 175 211 298 174 208 299 199 235 181 198 232 300 199 235 181 174 208 301 176 210 302 200 234 180 177 212 303 201 236 62 177 212 304 200 234 180 202 237 101 203 239 86 178 213 49 179 215 51 178 213 49 203 239 86 181 217 305 180 214 306 205 241 188 204 238 307 205 241 188 180 214 308 182 216 309 206 240 187 183 218 310 207 242 214 183 218 311 206 240 187 208 243 70 209 245 108 184 219 61 185 221 106 184 219 61 209 245 108 187 223 312 186 220 313 211 247 195 210 244 314 211 247 195 186 220 315 188 222 316 212 246 194 189 224 317 213 248 50 189 224 318 212 246 194 214 249 70 215 251 76 190 225 61 191 227 63 190 225 61 215 251 76 193 229 319 192 226 320 217 253 202 216 250 321 217 253 202 192 226 322 194 228 323 218 252 201 195 230 324 219 254 225 195 230 325 218 252 201 220 55 43 221 30 29 196 255 326 197 233 327 196 255 328 221 30 29 199 235 181 198 232 329 223 31 30 222 29 26 223 31 30 198 232 330 200 234 180 224 32 31 201 236 62 225 33 22 201 236 62 224 32 31 226 34 21 227 37 20 202 237 331 203 239 332 202 237 333 227 37 20 205 241 188 204 238 334 229 38 33 228 36 19 229 38 33 204 238 335 206 240 187 230 39 34 207 242 214 231 40 15 207 242 214 230 39 34 232 41 35 233 44 37 208 243 336 209 245 337 208 243 338 233 44 37 211 247 195 210 244 339 235 45 38 234 43 12 235 45 38 210 244 340 212 246 194 236 46 39 213 248 50 237 47 8 213 248 50 236 46 39 238 48 7 239 51 6 214 249 341 215 251 342 214 249 343 239 51 6 217 253 202 216 250 344 241 52 41 240 50 5 241 52 41 216 250 345 218 252 201 242 53 42 219 254 225 243 54 1 219 254 225 242 53 42 244 49 40 245 28 28 220 55 43 221 30 29 220 55 43 245 28 28 245 28 28 246 35 32 226 34 21 227 37 20 226 34 21 246 35 32 246 35 32 247 42 36 232 41 35 233 44 37 232 41 35 247 42 36 247 42 36 244 49 40 238 48 7 239 51 6 238 48 7 244 49 40 244 49 40 247 42 36 245 28 28 246 35 32 245 28 28 247 42 36</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="RoundedCube-1">
+ <node id="_RoundedCube" name="RoundedCube" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#RoundedCube">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-2.dae b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-2.dae
new file mode 100644
index 0000000..3ecce5d
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-2.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/cubes/RoundedCube-2.mb</source_data>
+ </contributor>
+ <created>2008-09-19T18:03:47Z</created>
+ <modified>2008-09-19T18:03:48Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="RoundedCube" name="RoundedCube">
+ <mesh>
+ <source id="RoundedCube-positions" name="position">
+ <float_array id="RoundedCube-positions-array" count="744">-50 -30 -30 -50 -30 30 -50 30 30 -50 30 -30 -50 -35.4985 -30 -50 -35.4985 30 -50 -35.4985 31.5117 -50 -34.9644 33.5051 -50 -33.5051 34.9644 -50 -31.5117 35.4985 -50 -30 35.4985 -50 30 35.4985 -50 31.5117 35.4985 -50 33.5051 34.9644 -50 34.9644 33.5051 -50 35.4985 31.5117 -50 35.4985 30 -50 35.4985 -30 -50 35.4985 -31.5117 -50 34.9644 -33.5051 -50 33.5051 -34.9644 -50 31.5117 -35.4985 -50 30 -35.4985 -50 -30 -35.4985 -50 -31.5117 -35.4985 -50 -33.5051 -34.9644 -50 -34.9644 -33.5051 -50 -35.4985 -31.5117 -48.0572 -42.7493 -30 -48.0572 -42.7493 30 -48.0572 -42.7493 33.5051 -48.0572 -41.5108 38.1272 -48.0572 -38.1272 41.5108 -48.0572 -33.5051 42.7493 -48.0572 -30 42.7493 -48.0572 30 42.7493 -48.0572 33.5051 42.7493 -48.0572 38.1272 41.5108 -48.0572 41.5108 38.1272 -48.0572 42.7493 33.5051 -48.0572 42.7493 30 -48.0572 42.7493 -30 -48.0572 42.7493 -33.5051 -48.0572 41.5108 -38.1272 -48.0572 38.1272 -41.5108 -48.0572 33.5051 -42.7493 -48.0572 30 -42.7493 -48.0572 -30 -42.7493 -48.0572 -33.5051 -42.7493 -48.0572 -38.1272 -41.5108 -48.0572 -41.5108 -38.1272 -48.0572 -42.7493 -33.5051 -42.7493 -48.0572 -30 -42.7493 -48.0572 30 -42.7493 -48.0572 34.9644 -42.7493 -46.3031 41.5108 -42.7493 -41.5108 46.3031 -42.7493 -34.9644 48.0572 -42.7493 -30 48.0572 -42.7493 30 48.0572 -42.7493 34.9644 48.0572 -42.7493 41.5108 46.3031 -42.7493 46.3031 41.5108 -42.7493 48.0572 34.9644 -42.7493 48.0572 30 -42.7493 48.0572 -30 -42.7493 48.0572 -34.9644 -42.7493 46.3031 -41.5108 -42.7493 41.5108 -46.3031 -42.7493 34.9644 -48.0572 -42.7493 30 -48.0572 -42.7493 -30 -48.0572 -42.7493 -34.9644 -48.0572 -42.7493 -41.5108 -46.3031 -42.7493 -46.3031 -41.5108 -42.7493 -48.0572 -34.9644 -35.4985 -50 -30 -35.4985 -50 30 -35.4985 -50 35.4985 -35.4985 -48.0572 42.7493 -35.4985 -42.7493 48.0572 -35.4985 -35.4985 50 -35.4985 -30 50 -35.4985 30 50 -35.4985 35.4985 50 -35.4985 42.7493 48.0572 -35.4985 48.0572 42.7493 -35.4985 50 35.4985 -35.4985 50 30 -35.4985 50 -30 -35.4985 50 -35.4985 -35.4985 48.0572 -42.7493 -35.4985 42.7493 -48.0572 -35.4985 35.4985 -50 -35.4985 30 -50 -35.4985 -30 -50 -35.4985 -35.4985 -50 -35.4985 -42.7493 -48.0572 -35.4985 -48.0572 -42.7493 -35.4985 -50 -35.4985 -30 -50 -30 -30 -50 30 -30 -50 35.4985 -30 -48.0572 42.7493 -30 -42.7493 48.0572 -30 -35.4985 50 -30 -30 50 -30 30 50 -30 35.4985 50 -30 42.7493 48.0572 -30 48.0572 42.7493 -30 50 35.4985 -30 50 30 -30 50 -30 -30 50 -35.4985 -30 48.0572 -42.7493 -30 42.7493 -48.0572 -30 35.4985 -50 -30 30 -50 -30 -30 -50 -30 -35.4985 -50 -30 -42.7493 -48.0572 -30 -48.0572 -42.7493 -30 -50 -35.4985 30 -50 -30 30 -50 30 30 -50 35.4985 30 -48.0572 42.7493 30 -42.7493 48.0572 30 -35.4985 50 30 -30 50 30 30 50 30 35.4985 50 30 42.7493 48.0572 30 48.0572 42.7493 30 50 35.4985 30 50 30 30 50 -30 30 50 -35.4985 30 48.0572 -42.7493 30 42.7493 -48.0572 30 35.4985 -50 30 30 -50 30 -30 -50 30 -35.4985 -50 30 -42.7493 -48.0572 30 -48.0572 -42.7493 30 -50 -35.4985 35.4985 -50 -30 35.4985 -50 30 35.4985 -50 35.4985 35.4985 -48.0572 42.7493 35.4985 -42.7493 48.0572 35.4985 -35.4985 50 35.4985 -30 50 35.4985 30 50 35.4985 35.4985 50 35.4985 42.7493 48.0572 35.4985 48.0572 42.7493 35.4985 50 35.4985 35.4985 50 30 35.4985 50 -30 35.4985 50 -35.4985 35.4985 48.0572 -42.7493 35.4985 42.7493 -48.0572 35.4985 35.4985 -50 35.4985 30 -50 35.4985 -30 -50 35.4985 -35.4985 -50 35.4985 -42.7493 -48.0572 35.4985 -48.0572 -42.7493 35.4985 -50 -35.4985 42.7493 -48.0572 -30 42.7493 -48.0572 30 42.7493 -48.0572 34.9644 42.7493 -46.3031 41.5108 42.7493 -41.5108 46.3031 42.7493 -34.9644 48.0572 42.7493 -30 48.0572 42.7493 30 48.0572 42.7493 34.9644 48.0572 42.7493 41.5108 46.3031 42.7493 46.3031 41.5108 42.7493 48.0572 34.9644 42.7493 48.0572 30 42.7493 48.0572 -30 42.7493 48.0572 -34.9644 42.7493 46.3031 -41.5108 42.7493 41.5108 -46.3031 42.7493 34.9644 -48.0572 42.7493 30 -48.0572 42.7493 -30 -48.0572 42.7493 -34.9644 -48.0572 42.7493 -41.5108 -46.3031 42.7493 -46.3031 -41.5108 42.7493 -48.0572 -34.9644 48.0572 -42.7493 -30 48.0572 -42.7493 30 48.0572 -42.7493 33.5051 48.0572 -41.5108 38.1272 48.0572 -38.1272 41.5108 48.0572 -33.5051 42.7493 48.0572 -30 42.7493 48.0572 30 42.7493 48.0572 33.5051 42.7493 48.0572 38.1272 41.5108 48.0572 41.5108 38.1272 48.0572 42.7493 33.5051 48.0572 42.7493 30 48.0572 42.7493 -30 48.0572 42.7493 -33.5051 48.0572 41.5108 -38.1272 48.0572 38.1272 -41.5108 48.0572 33.5051 -42.7493 48.0572 30 -42.7493 48.0572 -30 -42.7493 48.0572 -33.5051 -42.7493 48.0572 -38.1272 -41.5108 48.0572 -41.5108 -38.1272 48.0572 -42.7493 -33.5051 50 -35.4985 -30 50 -35.4985 30 50 -35.4985 31.5117 50 -34.9644 33.5051 50 -33.5051 34.9644 50 -31.5117 35.4985 50 -30 35.4985 50 30 35.4985 50 31.5117 35.4985 50 33.5051 34.9644 50 34.9644 33.5051 50 35.4985 31.5117 50 35.4985 30 50 35.4985 -30 50 35.4985 -31.5117 50 34.9644 -33.5051 50 33.5051 -34.9644 50 31.5117 -35.4985 50 30 -35.4985 50 -30 -35.4985 50 -31.5117 -35.4985 50 -33.5051 -34.9644 50 -34.9644 -33.5051 50 -35.4985 -31.5117 50 -30 -30 50 -30 30 50 30 30 50 30 -30</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-positions-array" count="248" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-normals" name="normal">
+ <float_array id="RoundedCube-normals-array" count="744">-1 0 0 -1 -0.000000 0 -1 0 0 -1 0.000000 0 -0.987666 -0.156577 0 -0.994537 -0.104384 0 -0.988123 -0.15311 0.013055 -0.98733 -0.137909 0.07849 -0.989489 -0.060168 0.131499 -0.988123 -0.013056 0.153111 -0.987666 0 0.156577 -0.994537 0 0.104385 -0.988123 0.013055 0.15311 -0.98733 0.07849 0.137909 -0.989489 0.131499 0.060167 -0.988123 0.15311 0.013055 -0.987666 0.156577 0 -0.994537 0.104384 0 -0.988123 0.15311 -0.013055 -0.989489 0.131499 -0.060167 -0.98733 0.078491 -0.137909 -0.988123 0.013056 -0.153111 -0.987666 0 -0.156577 -0.994537 0 -0.104385 -0.988123 -0.013055 -0.15311 -0.98733 -0.07849 -0.137909 -0.989489 -0.131499 -0.060167 -0.988123 -0.15311 -0.013055 -0.866026 -0.5 0 -0.907073 -0.420973 0 -0.870789 -0.488743 0.05345 -0.841132 -0.469421 0.268591 -0.883262 -0.215337 0.416507 -0.870789 -0.05345 0.488743 -0.866026 0 0.5 -0.907073 0 0.420974 -0.870789 0.05345 0.488743 -0.841132 0.268591 0.469421 -0.883262 0.416507 0.215337 -0.870789 0.488743 0.05345 -0.866026 0.5 0 -0.907073 0.420973 0 -0.870789 0.488743 -0.05345 -0.86674 0.428194 -0.255759 -0.857096 0.223082 -0.46435 -0.870789 0.05345 -0.488743 -0.866026 0 -0.5 -0.907073 0 -0.420974 -0.870789 -0.05345 -0.488743 -0.841132 -0.268591 -0.469421 -0.883262 -0.416507 -0.215337 -0.870789 -0.488743 -0.05345 -0.5 -0.866025 0 -0.575061 -0.818111 0 -0.509799 -0.85376 0.105826 -0.45181 -0.773163 0.44507 -0.5338 -0.410477 0.739301 -0.509799 -0.105825 0.85376 -0.5 0 0.866025 -0.575061 0 0.818111 -0.509799 0.105825 0.85376 -0.45181 0.44507 0.773163 -0.5338 0.739301 0.410477 -0.509799 0.85376 0.105826 -0.5 0.866025 0 -0.575061 0.818111 0 -0.509799 0.85376 -0.105826 -0.45181 0.773163 -0.44507 -0.5338 0.410477 -0.739301 -0.509799 0.105825 -0.85376 -0.5 0 -0.866025 -0.575061 0 -0.818111 -0.509799 -0.105825 -0.85376 -0.45181 -0.44507 -0.773163 -0.5338 -0.739301 -0.410477 -0.509799 -0.85376 -0.105826 -0.130526 -0.991445 0 -0.149146 -0.988815 0 -0.134586 -0.975822 0.172215 -0.114286 -0.832191 0.542584 -0.144186 -0.493073 0.857956 -0.134713 -0.128482 0.98252 -0.130526 0 0.991445 -0.149146 0 0.988815 -0.134586 0.172215 0.975822 -0.114286 0.542584 0.832191 -0.144186 0.857956 0.493073 -0.134713 0.98252 0.128482 -0.130526 0.991445 0 -0.149146 0.988815 0 -0.134586 0.975822 -0.172215 -0.114286 0.832191 -0.542584 -0.144186 0.493073 -0.857956 -0.134713 0.128482 -0.98252 -0.130526 0 -0.991445 -0.149146 0 -0.988815 -0.134586 -0.172215 -0.975822 -0.114286 -0.542584 -0.832191 -0.144186 -0.857956 -0.493073 -0.134713 -0.98252 -0.128482 0 -1 0 0 -1 0 0 -0.991445 0.130526 0 -0.866025 0.5 0 -0.5 0.866026 0 -0.130526 0.991445 0 0 1 0 0 1 0 0.130526 0.991445 0 0.5 0.866025 0 0.866025 0.5 0 0.991445 0.130526 0 1 0 0 1 0 0 0.991445 -0.130526 0 0.866025 -0.5 0 0.5 -0.866026 0 0.130526 -0.991445 0 0 -1 0 0 -1 0 -0.130526 -0.991445 0 -0.5 -0.866025 0 -0.866025 -0.5 0 -0.991445 -0.130526 0 -1 0 0 -1 0 0 -0.991445 0.130526 0 -0.866025 0.5 0 -0.5 0.866025 0 -0.130526 0.991445 0 0 1 0 0 1 0 0.130526 0.991445 0 0.5 0.866025 0 0.866025 0.5 0 0.991445 0.130526 0 1 0 0 1 0 0 0.991445 -0.130526 0 0.866025 -0.5 0 0.5 -0.866025 0 0.130526 -0.991445 0 0 -1 0 0 -1 0 -0.130526 -0.991445 0 -0.5 -0.866025 0 -0.866025 -0.5 0 -0.991445 -0.130526 0.149146 -0.988815 0 0.130526 -0.991445 0 0.134713 -0.98252 0.128482 0.144186 -0.857956 0.493073 0.114286 -0.542584 0.832191 0.134586 -0.172215 0.975822 0.149146 0 0.988815 0.130526 0 0.991445 0.134713 0.128482 0.98252 0.144186 0.493073 0.857956 0.114286 0.832191 0.542584 0.134586 0.975822 0.172215 0.149146 0.988815 0 0.130526 0.991445 0 0.134713 0.98252 -0.128482 0.144186 0.857956 -0.493073 0.114286 0.542584 -0.832191 0.134586 0.172215 -0.975822 0.149146 0 -0.988815 0.130526 0 -0.991445 0.134713 -0.128482 -0.98252 0.144186 -0.493073 -0.857956 0.114286 -0.832191 -0.542584 0.134586 -0.975822 -0.172215 0.575061 -0.818111 0 0.5 -0.866026 0 0.509799 -0.85376 0.105826 0.5338 -0.739301 0.410477 0.45181 -0.44507 0.773163 0.509799 -0.105825 0.85376 0.575061 0 0.818111 0.5 0 0.866025 0.509799 0.105825 0.85376 0.5338 0.410477 0.739301 0.45181 0.773163 0.445069 0.509799 0.85376 0.105826 0.575061 0.818111 0 0.5 0.866026 0 0.509799 0.85376 -0.105826 0.5338 0.739301 -0.410477 0.45181 0.44507 -0.773163 0.509799 0.105825 -0.85376 0.575061 0 -0.818111 0.5 0 -0.866025 0.509799 -0.105825 -0.85376 0.5338 -0.410477 -0.739301 0.45181 -0.773163 -0.445069 0.509799 -0.85376 -0.105826 0.907073 -0.420973 0 0.866026 -0.5 0 0.870789 -0.488743 0.05345 0.857096 -0.46435 0.223082 0.86674 -0.255759 0.428194 0.870789 -0.05345 0.488743 0.907073 0 0.420974 0.866026 0 0.5 0.870789 0.05345 0.488743 0.883262 0.215337 0.416507 0.841132 0.469421 0.268591 0.870789 0.488743 0.05345 0.907073 0.420973 0 0.866026 0.5 0 0.870789 0.488743 -0.05345 0.883262 0.416507 -0.215337 0.841132 0.268591 -0.469421 0.870789 0.05345 -0.488743 0.907073 0 -0.420974 0.866026 0 -0.5 0.870789 -0.05345 -0.488743 0.883262 -0.215337 -0.416507 0.841132 -0.469421 -0.268591 0.870789 -0.488743 -0.05345 0.994537 -0.104384 0 0.987666 -0.156577 0 0.988123 -0.15311 0.013055 0.98733 -0.137909 0.07849 0.989489 -0.060168 0.131499 0.988123 -0.013056 0.15311 0.994537 0 0.104385 0.987666 0 0.156577 0.988123 0.013055 0.153111 0.989489 0.060168 0.131499 0.98733 0.137909 0.07849 0.988123 0.15311 0.013055 0.994537 0.104384 0 0.987666 0.156577 0 0.988123 0.15311 -0.013055 0.989489 0.131499 -0.060167 0.98733 0.078491 -0.137909 0.988123 0.013056 -0.15311 0.994537 0 -0.104385 0.987666 0 -0.156577 0.988123 -0.013055 -0.153111 0.989489 -0.060168 -0.131499 0.98733 -0.137909 -0.07849 0.988123 -0.15311 -0.013055 1 0 0 1 -0.000000 0 1 0 0 1 0.000000 0</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-normals-array" count="248" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-Texture" name="Texture">
+ <float_array id="RoundedCube-Texture-array" count="620">0.812128 0.130663 0.827856 0.130663 0.812128 0.187872 0.848596 0.136221 0.863779 0.151404 0.869337 0.172144 0.869337 0.187872 0.869337 0.812128 0.869337 0.827856 0.812128 0.812128 0.863779 0.848596 0.848596 0.863779 0.827856 0.869337 0.812128 0.869337 0.187872 0.869337 0.172144 0.869337 0.187872 0.812128 0.151404 0.863779 0.136221 0.848596 0.130663 0.827856 0.130663 0.812128 0.130663 0.187872 0.130663 0.172144 0.187872 0.187872 0.136221 0.151404 0.151404 0.136221 0.172144 0.130663 0.187872 0.130663 0.187872 0.055224 0.812128 0.055224 0.896686 0.06811 0.848596 0.055224 0.93189 0.103314 0.944775 0.151404 0.944775 0.187872 0.944775 0.812128 0.93189 0.896686 0.944775 0.848596 0.896686 0.93189 0.848596 0.944775 0.812128 0.944775 0.187872 0.944775 0.103314 0.93189 0.151404 0.944775 0.06811 0.896686 0.055224 0.848596 0.055224 0.812128 0.055224 0.187872 0.06811 0.103314 0.055224 0.151404 0.103314 0.06811 0.151404 0.055224 0 0.187872 0 0.812128 0 0.187872 0.93189 0.01825 0.863779 0 0.863779 0 0.98175 0.06811 1 0.136221 0 0.187872 0 0.812128 0 0.187872 0.98175 0.93189 1 0.863779 1 0.863779 0.93189 0.98175 0.863779 1 1 0.812128 1 0.187872 1 0.812128 0.06811 0.98175 0.136221 1 0.136221 1 0.01825 0.93189 0 0.863779 1 0.812128 1 0.187872 1 0.812128 0.01825 0.06811 0 0.136221 0 0.136221 0.06811 0.01825 0.136221 0 0.130663 0.944775 0.055224 0.93189 0.130663 0.869337 0.055224 0.863779 0.055224 0.93189 0.130663 0.055224 0.130663 0.130663 0.055224 0.06811 0.055224 0.136221 0.055224 0.06811 0.055224 0.93189 0.055224 0.93189 0.869337 0.944775 0.869337 0.869337 0.944775 0.93189 0.944775 0.863779 0.944775 0.93189 0.869337 0.055224 0.944775 0.06811 0.869337 0.130663 0.944775 0.136221 0.944775 0.06811 0.944775 0.93189 0.944775 0.863779 0.944775 0.93189 0.944775 0.06811 0.944775 0.06811 0.130663 0.055224 0.055224 0.06811 0.055224 0.136221 0.055224 0.06811 0.130663 0.055224 0.130663 0.055224 0.812128 0.944775 0.869337 0.944775 0.869337 0.944775 0.187872 0.055224 0.130663 0.055224 0.130663 0.055224 0.187872 0.944775 0.812128 0.944775 0.812128 0.944775 0.812128 0.055224 0.187872 0.055224 0.187872 0.055224 0.130663 0.944775 0.187872 0.944775 0.187872 0.944775 0.869337 0.055224 0.812128 0.055224 0.812128 0.055224 0.944775 0.06811 0.944775 0.06811 0.130663 0.944775 0.055224 0.93189 0.055224 0.93189 0.869337 0.055224 0.944775 0.06811 0.944775 0.06811 0.06811 0.01825 0.136221 0 0.151404 0.055224 0.136221 0 0.01825 0.06811 0.06811 0.103314 0 0.136221 0 0.136221 0.01825 0.93189 0 0.863779 0.06811 0.896686 0.055224 0.848596 0 0.863779 0.06811 0.98175 0.136221 1 0.136221 1 0.93189 0.98175 0.863779 1 0.848596 0.944775 0.863779 1 0.98175 0.93189 1 0.863779 1 0.863779 0.98175 0.06811 1 0.136221 0.944775 0.151404 1 0.136221 0.93189 0.01825 0.863779 0 0.863779 0 0.812128 0.055224 0.187872 0.055224 0.812128 0.055224 0.151404 0.055224 0.151404 0.055224 0.055224 0.187872 0.055224 0.812128 0.055224 0.187872 0.055224 0.848596 0.055224 0.848596 0.187872 0.944775 0.812128 0.944775 0.187872 0.944775 0.848596 0.944775 0.848596 0.944775 0.944775 0.812128 0.944775 0.187872 0.944775 0.812128 0.944775 0.151404 0.944775 0.151404 0 0.848596 0 0.812128 0 0.848596 0.055224 0.136221 0 0.151404 0 0.187872 0 0.151404 0 0.848596 0 0.812128 0 0.848596 0.944775 0.863779 1 0.848596 1 0.812128 1 0.848596 1 0.151404 1 0.187872 1 0.151404 0.944775 0.863779 1 0.848596 1 0.812128 1 0.848596 1 0.151404 1 0.187872 1 0.151404 0.055224 0.136221 0 0.151404 0 0.187872 0 0.151404 0.130663 1 0.055224 0.93189 0.055224 0.98175 0.055224 0.93189 0.055224 0.136221 0.055224 0.136221 0.055224 0.93189 0.055224 0.98175 0.055224 0.93189 0.944775 0.863779 0.944775 0.863779 0.869337 1 0.944775 0.98175 0.944775 0.93189 0.944775 0.98175 0.944775 0.863779 0.944775 0.863779 0.869337 0 0.944775 0.06811 0.944775 0.01825 0.944775 0.06811 0.055224 0.136221 0.055224 0.136221 0.187872 0 0.130663 0 0.130663 0.055224 0.130663 0 0.187872 1 0.812128 1 0.869337 1 0.869337 1 0.812128 0 0.812128 0 0.187872 0 0.187872 0 0.187872 1 0.812128 1 0.812128 1 0.869337 0 0.812128 0 0.812128 0 0.130663 1 0.187872 1 0.187872 1 0.869337 1 0.130663 1 0.055224 0.98175 0.130663 1 0.055224 0.01825 0.01825 0.06811 0.06811 0.01825 0.06811 0.01825 1 0.151404 1 0.151404 0.06811 0.98175 0.01825 0.93189 0.01825 0.93189 0 0.848596 0 0.848596 0.98175 0.93189 0.93189 0.98175 0.93189 0.98175 0 0.848596 0 0.848596 0.93189 0.01825 0.98175 0.06811 0.98175 0.06811 1 0.151404 1 0.151404 0.151404 0.055224 0.187872 0.055224 0.187872 0.055224 0.055224 0.187872 0.055224 0.187872 0.055224 0.848596 0.055224 0.812128 0.055224 0.812128 0.187872 0.944775 0.187872 0.944775 0.848596 0.944775 0.812128 0.944775 0.812128 0.944775 0.944775 0.812128 0.944775 0.812128 0.944775 0.151404 0.944775 0.187872 0.944775 0.187872 0.812128 0.055224 0.812128 0.055224</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-Texture-array" count="310" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="RoundedCube-vertices">
+ <input semantic="POSITION" source="#RoundedCube-positions"/>
+ <input semantic="NORMAL" source="#RoundedCube-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="492">
+ <input semantic="VERTEX" source="#RoundedCube-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#RoundedCube-Texture" offset="1" set="1"/>
+ <p>5 0 6 1 1 2 6 1 7 3 1 2 7 3 8 4 1 2 8 4 9 5 1 2 9 5 10 6 1 2 11 7 12 8 2 9 12 8 13 10 2 9 13 10 14 11 2 9 14 11 15 12 2 9 15 12 16 13 2 9 17 14 18 15 3 16 18 15 19 17 3 16 19 17 20 18 3 16 20 18 21 19 3 16 21 19 22 20 3 16 23 21 24 22 0 23 24 22 25 24 0 23 25 24 26 25 0 23 26 25 27 26 0 23 27 26 4 27 0 23 245 23 222 26 221 27 245 23 223 25 222 26 245 23 224 24 223 25 245 23 225 22 224 24 245 23 226 21 225 22 246 16 228 19 227 20 246 16 229 18 228 19 246 16 230 17 229 18 246 16 231 15 230 17 246 16 232 14 231 15 247 9 234 12 233 13 247 9 235 11 234 12 247 9 236 10 235 11 247 9 237 8 236 10 247 9 238 7 237 8 244 2 240 5 239 6 244 2 241 4 240 5 244 2 242 3 241 4 244 2 243 1 242 3 244 2 220 0 243 1 4 27 5 0 0 23 1 2 0 23 5 0 10 6 11 7 1 2 2 9 1 2 11 7 16 13 17 14 2 9 3 16 2 9 17 14 22 20 23 21 3 16 0 23 3 16 23 21 28 28 29 29 4 27 5 0 4 27 29 29 31 30 7 3 30 31 6 1 30 31 7 3 32 32 33 33 8 4 9 5 8 4 33 33 34 34 35 35 10 6 11 7 10 6 35 35 37 36 13 10 36 37 12 8 36 37 13 10 38 38 39 39 14 11 15 12 14 11 39 39 40 40 41 41 16 13 17 14 16 13 41 41 43 42 19 17 42 43 18 15 42 43 19 17 44 44 45 45 20 18 21 19 20 18 45 45 46 46 47 47 22 20 23 21 22 20 47 47 49 48 25 24 48 49 24 22 48 49 25 24 50 50 51 51 26 25 27 26 26 25 51 51 52 47 53 46 28 52 29 53 28 54 53 46 55 55 31 30 54 56 30 31 54 57 31 30 56 58 57 59 32 32 33 33 32 32 57 59 58 47 59 46 34 60 35 61 34 62 59 46 61 63 37 36 60 64 36 37 60 65 37 36 62 66 63 67 38 38 39 39 38 38 63 67 64 35 65 34 40 68 41 69 40 70 65 34 67 71 43 42 66 72 42 43 66 73 43 42 68 74 69 75 44 44 45 45 44 44 69 75 70 35 71 34 46 76 47 77 46 78 71 34 73 79 49 48 72 80 48 49 72 81 49 48 74 82 75 83 50 50 51 51 50 50 75 83 76 21 77 20 52 47 53 46 52 47 77 20 79 84 55 85 78 86 54 87 78 86 55 88 80 89 81 90 56 91 57 92 56 93 81 90 82 21 83 20 58 47 59 46 58 47 83 20 85 84 61 94 84 86 60 87 84 86 61 95 86 96 87 97 62 98 63 99 62 100 87 97 88 7 89 6 64 35 65 34 64 35 89 6 91 101 67 102 90 103 66 104 90 103 67 105 92 96 93 97 68 106 69 107 68 108 93 97 94 7 95 6 70 35 71 34 70 35 95 6 97 101 73 109 96 103 72 104 96 103 73 110 98 111 99 90 74 112 75 113 74 114 99 90 100 23 101 16 76 21 77 20 76 21 101 16 102 14 103 41 78 86 79 84 78 86 103 41 104 28 105 27 80 115 81 90 80 116 105 27 106 23 107 16 82 21 83 20 82 21 107 16 108 14 109 41 84 86 85 84 84 86 109 41 110 117 111 13 86 118 87 97 86 119 111 13 112 9 113 2 88 7 89 6 88 7 113 2 114 0 115 29 90 103 91 101 90 103 115 29 116 40 117 13 92 96 93 97 92 96 117 13 118 9 119 2 94 7 95 6 94 7 119 2 120 0 121 29 96 103 97 101 96 103 121 29 122 120 123 27 98 121 99 90 98 122 123 27 124 2 125 9 100 23 101 16 100 23 125 9 126 13 127 40 102 14 103 41 102 14 127 40 128 29 129 0 104 28 105 27 104 28 129 0 130 2 131 9 106 23 107 16 106 23 131 9 132 13 133 40 108 14 109 41 108 14 133 40 134 123 135 14 110 124 111 13 110 125 135 14 136 16 137 23 112 9 113 2 112 9 137 23 138 27 139 28 114 0 115 29 114 0 139 28 140 41 141 14 116 40 117 13 116 40 141 14 142 16 143 23 118 9 119 2 118 9 143 23 144 27 145 28 120 0 121 29 120 0 145 28 146 126 147 0 122 127 123 27 122 128 147 0 148 6 149 7 124 2 125 9 124 2 149 7 150 97 151 96 126 13 127 40 126 13 151 96 152 101 153 103 128 29 129 0 128 29 153 103 154 6 155 7 130 2 131 9 130 2 155 7 156 97 157 96 132 13 133 40 132 13 157 96 158 129 159 86 134 130 135 14 134 131 159 86 160 20 161 21 136 16 137 23 136 16 161 21 162 90 163 89 138 27 139 28 138 27 163 89 164 84 165 86 140 41 141 14 140 41 165 86 166 20 167 21 142 16 143 23 142 16 167 21 168 90 169 89 144 27 145 28 144 27 169 89 170 132 171 103 146 133 147 0 146 134 171 103 172 34 173 35 148 6 149 7 148 6 173 35 151 96 150 97 175 98 174 99 175 98 150 97 152 101 176 135 153 103 177 104 153 103 176 136 178 34 179 35 154 6 155 7 154 6 179 35 157 96 156 97 181 98 180 99 181 98 156 97 158 137 182 138 159 86 183 87 159 86 182 139 184 46 185 47 160 20 161 21 160 20 185 47 163 89 162 90 187 91 186 92 187 91 162 90 164 84 188 85 165 86 189 87 165 86 188 85 190 46 191 47 166 20 167 21 166 20 191 47 169 89 168 90 193 91 192 92 193 91 168 90 170 140 194 141 171 103 195 104 171 103 194 142 196 69 197 68 172 34 173 35 172 34 197 68 175 143 174 144 199 50 198 145 199 50 174 146 176 147 200 148 177 149 201 49 177 150 200 148 202 69 203 68 178 34 179 35 178 34 203 68 181 151 180 152 205 153 204 154 205 153 180 155 182 156 206 42 183 157 207 43 183 158 206 42 208 53 209 52 184 46 185 47 184 46 209 52 187 159 186 160 211 38 210 161 211 38 186 162 188 163 212 36 189 164 213 37 189 165 212 36 214 53 215 52 190 46 191 47 190 46 215 52 193 166 192 167 217 32 216 168 217 32 192 169 194 170 218 30 195 171 219 31 195 172 218 30 220 0 221 27 196 173 197 174 196 175 221 27 199 50 198 176 223 25 222 26 223 25 198 177 200 148 224 24 201 49 225 22 201 49 224 24 226 21 227 20 202 178 203 179 202 180 227 20 205 153 204 181 229 18 228 19 229 18 204 182 206 42 230 17 207 43 231 15 207 43 230 17 232 14 233 13 208 183 209 184 208 185 233 13 211 38 210 186 235 11 234 12 235 11 210 187 212 36 236 10 213 37 237 8 213 37 236 10 238 7 239 6 214 188 215 189 214 190 239 6 217 32 216 191 241 4 240 5 241 4 216 192 218 30 242 3 219 31 243 1 219 31 242 3 244 2 245 23 220 0 221 27 220 0 245 23 245 23 246 16 226 21 227 20 226 21 246 16 246 16 247 9 232 14 233 13 232 14 247 9 247 9 244 2 238 7 239 6 238 7 244 2 244 2 247 9 245 23 246 16 245 23 247 9 0 23 1 2 3 16 2 9 3 16 1 2 30 31 6 1 29 29 5 0 29 29 6 1 31 30 32 32 7 3 8 4 7 3 32 32 33 33 34 34 9 5 10 6 9 5 34 34 36 37 12 8 35 35 11 7 35 35 12 8 37 36 38 38 13 10 14 11 13 10 38 38 39 39 40 40 15 12 16 13 15 12 40 40 42 43 18 15 41 41 17 14 41 41 18 15 44 44 20 18 43 42 19 17 43 42 20 18 45 45 46 46 21 19 22 20 21 19 46 46 48 49 24 22 47 47 23 21 47 47 24 22 49 48 50 50 25 24 26 25 25 24 50 50 51 51 28 28 27 26 4 27 27 26 28 28 54 87 30 193 53 46 29 194 53 46 30 195 55 55 56 58 31 30 32 32 31 30 56 58 57 196 58 47 33 197 34 198 33 199 58 47 60 87 36 200 59 46 35 201 59 46 36 202 61 63 62 66 37 36 38 38 37 36 62 66 63 203 64 35 39 204 40 205 39 206 64 35 66 104 42 207 65 34 41 208 65 34 42 209 67 71 68 74 43 42 44 44 43 42 68 74 69 210 70 35 45 211 46 212 45 213 70 35 72 104 48 214 71 34 47 215 71 34 48 216 73 79 74 82 49 48 50 50 49 48 74 82 75 217 52 47 51 218 28 219 51 220 52 47 78 86 54 87 77 20 53 46 77 20 54 87 79 84 80 221 55 222 56 223 55 224 80 221 81 90 82 21 57 225 58 47 57 226 82 21 84 86 60 87 83 20 59 46 83 20 60 87 85 84 86 221 61 227 62 228 61 229 86 221 87 97 88 7 63 230 64 35 63 231 88 7 90 103 66 104 89 6 65 34 89 6 66 104 91 232 92 96 67 233 68 234 67 235 92 96 93 97 94 7 69 236 70 35 69 237 94 7 96 103 72 104 95 6 71 34 95 6 72 104 97 101 98 238 73 239 74 240 73 241 98 238 99 90 76 21 75 242 52 47 75 243 76 21 101 16 102 14 77 20 78 86 77 20 102 14 103 244 104 28 79 245 80 246 79 247 104 28 105 27 106 23 81 90 82 21 81 90 106 23 107 16 108 14 83 20 84 86 83 20 108 14 109 41 110 248 85 84 86 221 85 84 110 248 111 13 112 9 87 97 88 7 87 97 112 9 113 2 114 0 89 6 90 103 89 6 114 0 115 249 116 40 91 250 92 96 91 251 116 40 117 13 118 9 93 97 94 7 93 97 118 9 119 2 120 0 95 6 96 103 95 6 120 0 121 29 122 252 97 101 98 238 97 101 122 252 123 27 100 23 99 90 76 21 99 90 100 23 125 9 126 13 101 16 102 14 101 16 126 13 127 253 128 29 103 254 104 28 103 255 128 29 129 0 130 2 105 27 106 23 105 27 130 2 131 9 132 13 107 16 108 14 107 16 132 13 133 40 134 249 109 41 110 248 109 41 134 249 135 14 136 16 111 13 112 9 111 13 136 16 137 23 138 27 113 2 114 0 113 2 138 27 139 256 140 41 115 257 116 40 115 258 140 41 141 14 142 16 117 13 118 9 117 13 142 16 143 23 144 27 119 2 120 0 119 2 144 27 145 28 146 244 121 29 122 252 121 29 146 244 147 0 124 2 123 27 100 23 123 27 124 2 149 7 150 97 125 9 126 13 125 9 150 97 151 259 152 101 127 260 128 29 127 261 152 101 153 103 154 6 129 0 130 2 129 0 154 6 155 7 156 97 131 9 132 13 131 9 156 97 157 96 158 232 133 40 134 249 133 40 158 232 159 86 160 20 135 14 136 16 135 14 160 20 161 21 162 90 137 23 138 27 137 23 162 90 163 262 164 84 139 263 140 41 139 264 164 84 165 86 166 20 141 14 142 16 141 14 166 20 167 21 168 90 143 23 144 27 143 23 168 90 169 89 170 245 145 28 146 244 145 28 170 245 171 103 148 6 147 0 124 2 147 0 148 6 150 97 149 7 174 99 173 35 174 99 149 7 152 265 151 96 176 233 175 98 176 233 151 96 153 103 177 104 154 6 178 34 154 6 177 104 156 97 155 7 180 99 179 35 180 99 155 7 158 232 157 96 182 233 181 98 182 233 157 96 159 86 183 87 160 20 184 46 160 20 183 87 162 90 161 21 186 92 185 47 186 92 161 21 164 84 163 266 188 85 187 267 188 85 163 268 165 86 189 87 166 20 190 46 166 20 189 87 168 90 167 21 192 92 191 47 192 92 167 21 170 245 169 89 194 269 193 91 194 269 169 89 171 103 195 104 148 6 172 34 148 6 195 104 174 99 173 35 198 204 197 68 198 204 173 35 176 270 175 271 200 148 199 50 200 148 175 272 177 104 201 273 178 34 202 69 178 34 201 274 180 99 179 35 204 204 203 68 204 204 179 35 182 275 181 276 206 42 205 153 206 42 181 277 183 87 207 278 184 46 208 53 184 46 207 279 186 92 185 47 210 197 209 52 210 197 185 47 188 280 187 281 212 36 211 38 212 36 187 282 189 87 213 283 190 46 214 53 190 46 213 284 192 92 191 47 216 197 215 52 216 197 191 47 194 285 193 286 218 30 217 32 218 30 193 287 195 104 219 288 172 34 196 69 172 34 219 289 198 290 197 291 222 26 221 27 222 26 197 292 199 50 223 25 200 148 224 24 200 148 223 25 201 49 225 22 202 293 226 21 202 294 225 22 204 295 203 296 228 19 227 20 228 19 203 297 206 42 205 153 230 17 229 18 230 17 205 153 207 43 231 15 208 298 232 14 208 299 231 15 210 300 209 301 234 12 233 13 234 12 209 302 212 36 211 38 236 10 235 11 236 10 211 38 213 37 237 8 214 303 238 7 214 304 237 8 216 305 215 306 240 5 239 6 240 5 215 307 218 30 217 32 242 3 241 4 242 3 217 32 219 31 243 1 196 308 220 0 196 309 243 1</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="RoundedCube-2">
+ <node id="_RoundedCube" name="RoundedCube" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#RoundedCube">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-3.dae b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-3.dae
new file mode 100644
index 0000000..88b6e86
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-3.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/cubes/RoundedCube-3.mb</source_data>
+ </contributor>
+ <created>2008-09-19T18:05:45Z</created>
+ <modified>2008-09-19T18:05:45Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="RoundedCube" name="RoundedCube">
+ <mesh>
+ <source id="RoundedCube-positions" name="position">
+ <float_array id="RoundedCube-positions-array" count="1032">-50 -20 -20 -50 -20 20 -50 20 20 -50 20 -20 -50 -26.7673 -20 -50 -26.7673 20 -50 -26.7673 21.5265 -50 -26.3683 23.5321 -50 -25.2323 25.2323 -50 -23.5321 26.3683 -50 -21.5265 26.7673 -50 -20 26.7673 -50 20 26.7673 -50 21.5265 26.7673 -50 23.5321 26.3683 -50 25.2323 25.2323 -50 26.3683 23.5321 -50 26.7673 21.5265 -50 26.7673 20 -50 26.7673 -20 -50 26.7673 -21.5265 -50 26.3683 -23.5321 -50 25.2323 -25.2323 -50 23.5321 -26.3683 -50 21.5265 -26.7673 -50 20 -26.7673 -50 -20 -26.7673 -50 -21.5265 -26.7673 -50 -23.5321 -26.3683 -50 -25.2323 -25.2323 -50 -26.3683 -23.5321 -50 -26.7673 -21.5265 -48.2315 -35.6581 -20 -48.2315 -35.6581 20 -48.2315 -35.6581 23.5321 -48.2315 -34.735 28.1725 -48.2315 -32.1064 32.1064 -48.2315 -28.1725 34.735 -48.2315 -23.5321 35.6581 -48.2315 -20 35.6581 -48.2315 20 35.6581 -48.2315 23.5321 35.6581 -48.2315 28.1725 34.735 -48.2315 32.1064 32.1064 -48.2315 34.735 28.1725 -48.2315 35.6581 23.5321 -48.2315 35.6581 20 -48.2315 35.6581 -20 -48.2315 35.6581 -23.5321 -48.2315 34.735 -28.1725 -48.2315 32.1064 -32.1064 -48.2315 28.1725 -34.735 -48.2315 23.5321 -35.6581 -48.2315 20 -35.6581 -48.2315 -20 -35.6581 -48.2315 -23.5321 -35.6581 -48.2315 -28.1725 -34.735 -48.2315 -32.1064 -32.1064 -48.2315 -34.735 -28.1725 -48.2315 -35.6581 -23.5321 -43.1953 -43.1953 -20 -43.1953 -43.1953 20 -43.1953 -43.1953 25.2323 -43.1953 -41.8279 32.1064 -43.1953 -37.9341 37.9341 -43.1953 -32.1064 41.8279 -43.1953 -25.2323 43.1953 -43.1953 -20 43.1953 -43.1953 20 43.1953 -43.1953 25.2323 43.1953 -43.1953 32.1064 41.8279 -43.1953 37.9341 37.9341 -43.1953 41.8279 32.1064 -43.1953 43.1953 25.2323 -43.1953 43.1953 20 -43.1953 43.1953 -20 -43.1953 43.1953 -25.2323 -43.1953 41.8279 -32.1064 -43.1953 37.9341 -37.9341 -43.1953 32.1064 -41.8279 -43.1953 25.2323 -43.1953 -43.1953 20 -43.1953 -43.1953 -20 -43.1953 -43.1953 -25.2323 -43.1953 -43.1953 -32.1064 -41.8279 -43.1953 -37.9341 -37.9341 -43.1953 -41.8279 -32.1064 -43.1953 -43.1953 -25.2323 -35.6581 -48.2315 -20 -35.6581 -48.2315 20 -35.6581 -48.2315 26.3683 -35.6581 -46.5673 34.735 -35.6581 -41.8279 41.8279 -35.6581 -34.735 46.5673 -35.6581 -26.3683 48.2315 -35.6581 -20 48.2315 -35.6581 20 48.2315 -35.6581 26.3683 48.2315 -35.6581 34.735 46.5673 -35.6581 41.8279 41.8279 -35.6581 46.5673 34.735 -35.6581 48.2315 26.3683 -35.6581 48.2315 20 -35.6581 48.2315 -20 -35.6581 48.2315 -26.3683 -35.6581 46.5673 -34.735 -35.6581 41.8279 -41.8279 -35.6581 34.735 -46.5673 -35.6581 26.3683 -48.2315 -35.6581 20 -48.2315 -35.6581 -20 -48.2315 -35.6581 -26.3683 -48.2315 -35.6581 -34.735 -46.5673 -35.6581 -41.8279 -41.8279 -35.6581 -46.5673 -34.735 -35.6581 -48.2315 -26.3683 -26.7673 -50 -20 -26.7673 -50 20 -26.7673 -50 26.7673 -26.7673 -48.2315 35.6581 -26.7673 -43.1953 43.1953 -26.7673 -35.6581 48.2315 -26.7673 -26.7673 50 -26.7673 -20 50 -26.7673 20 50 -26.7673 26.7673 50 -26.7673 35.6581 48.2315 -26.7673 43.1953 43.1953 -26.7673 48.2315 35.6581 -26.7673 50 26.7673 -26.7673 50 20 -26.7673 50 -20 -26.7673 50 -26.7673 -26.7673 48.2315 -35.6581 -26.7673 43.1953 -43.1953 -26.7673 35.6581 -48.2315 -26.7673 26.7673 -50 -26.7673 20 -50 -26.7673 -20 -50 -26.7673 -26.7673 -50 -26.7673 -35.6581 -48.2315 -26.7673 -43.1953 -43.1953 -26.7673 -48.2315 -35.6581 -26.7673 -50 -26.7673 -20 -50 -20 -20 -50 20 -20 -50 26.7673 -20 -48.2315 35.6581 -20 -43.1953 43.1953 -20 -35.6581 48.2315 -20 -26.7673 50 -20 -20 50 -20 20 50 -20 26.7673 50 -20 35.6581 48.2315 -20 43.1953 43.1953 -20 48.2315 35.6581 -20 50 26.7673 -20 50 20 -20 50 -20 -20 50 -26.7673 -20 48.2315 -35.6581 -20 43.1953 -43.1953 -20 35.6581 -48.2315 -20 26.7673 -50 -20 20 -50 -20 -20 -50 -20 -26.7673 -50 -20 -35.6581 -48.2315 -20 -43.1953 -43.1953 -20 -48.2315 -35.6581 -20 -50 -26.7673 20 -50 -20 20 -50 20 20 -50 26.7673 20 -48.2315 35.6581 20 -43.1953 43.1953 20 -35.6581 48.2315 20 -26.7673 50 20 -20 50 20 20 50 20 26.7673 50 20 35.6581 48.2315 20 43.1953 43.1953 20 48.2315 35.6581 20 50 26.7673 20 50 20 20 50 -20 20 50 -26.7673 20 48.2315 -35.6581 20 43.1953 -43.1953 20 35.6581 -48.2315 20 26.7673 -50 20 20 -50 20 -20 -50 20 -26.7673 -50 20 -35.6581 -48.2315 20 -43.1953 -43.1953 20 -48.2315 -35.6581 20 -50 -26.7673 26.7673 -50 -20 26.7673 -50 20 26.7673 -50 26.7673 26.7673 -48.2315 35.6581 26.7673 -43.1953 43.1953 26.7673 -35.6581 48.2315 26.7673 -26.7673 50 26.7673 -20 50 26.7673 20 50 26.7673 26.7673 50 26.7673 35.6581 48.2315 26.7673 43.1953 43.1953 26.7673 48.2315 35.6581 26.7673 50 26.7673 26.7673 50 20 26.7673 50 -20 26.7673 50 -26.7673 26.7673 48.2315 -35.6581 26.7673 43.1953 -43.1953 26.7673 35.6581 -48.2315 26.7673 26.7673 -50 26.7673 20 -50 26.7673 -20 -50 26.7673 -26.7673 -50 26.7673 -35.6581 -48.2315 26.7673 -43.1953 -43.1953 26.7673 -48.2315 -35.6581 26.7673 -50 -26.7673 35.6581 -48.2315 -20 35.6581 -48.2315 20 35.6581 -48.2315 26.3683 35.6581 -46.5673 34.735 35.6581 -41.8279 41.8279 35.6581 -34.735 46.5673 35.6581 -26.3683 48.2315 35.6581 -20 48.2315 35.6581 20 48.2315 35.6581 26.3683 48.2315 35.6581 34.735 46.5673 35.6581 41.8279 41.8279 35.6581 46.5673 34.735 35.6581 48.2315 26.3683 35.6581 48.2315 20 35.6581 48.2315 -20 35.6581 48.2315 -26.3683 35.6581 46.5673 -34.735 35.6581 41.8279 -41.8279 35.6581 34.735 -46.5673 35.6581 26.3683 -48.2315 35.6581 20 -48.2315 35.6581 -20 -48.2315 35.6581 -26.3683 -48.2315 35.6581 -34.735 -46.5673 35.6581 -41.8279 -41.8279 35.6581 -46.5673 -34.735 35.6581 -48.2315 -26.3683 43.1953 -43.1953 -20 43.1953 -43.1953 20 43.1953 -43.1953 25.2323 43.1953 -41.8279 32.1064 43.1953 -37.9341 37.9341 43.1953 -32.1064 41.8279 43.1953 -25.2323 43.1953 43.1953 -20 43.1953 43.1953 20 43.1953 43.1953 25.2323 43.1953 43.1953 32.1064 41.8279 43.1953 37.9341 37.9341 43.1953 41.8279 32.1064 43.1953 43.1953 25.2323 43.1953 43.1953 20 43.1953 43.1953 -20 43.1953 43.1953 -25.2323 43.1953 41.8279 -32.1064 43.1953 37.9341 -37.9341 43.1953 32.1064 -41.8279 43.1953 25.2323 -43.1953 43.1953 20 -43.1953 43.1953 -20 -43.1953 43.1953 -25.2323 -43.1953 43.1953 -32.1064 -41.8279 43.1953 -37.9341 -37.9341 43.1953 -41.8279 -32.1064 43.1953 -43.1953 -25.2323 48.2315 -35.6581 -20 48.2315 -35.6581 20 48.2315 -35.6581 23.5321 48.2315 -34.735 28.1725 48.2315 -32.1064 32.1064 48.2315 -28.1725 34.735 48.2315 -23.5321 35.6581 48.2315 -20 35.6581 48.2315 20 35.6581 48.2315 23.5321 35.6581 48.2315 28.1725 34.735 48.2315 32.1064 32.1064 48.2315 34.735 28.1725 48.2315 35.6581 23.5321 48.2315 35.6581 20 48.2315 35.6581 -20 48.2315 35.6581 -23.5321 48.2315 34.735 -28.1725 48.2315 32.1064 -32.1064 48.2315 28.1725 -34.735 48.2315 23.5321 -35.6581 48.2315 20 -35.6581 48.2315 -20 -35.6581 48.2315 -23.5321 -35.6581 48.2315 -28.1725 -34.735 48.2315 -32.1064 -32.1064 48.2315 -34.735 -28.1725 48.2315 -35.6581 -23.5321 50 -26.7673 -20 50 -26.7673 20 50 -26.7673 21.5265 50 -26.3683 23.5321 50 -25.2323 25.2323 50 -23.5321 26.3683 50 -21.5265 26.7673 50 -20 26.7673 50 20 26.7673 50 21.5265 26.7673 50 23.5321 26.3683 50 25.2323 25.2323 50 26.3683 23.5321 50 26.7673 21.5265 50 26.7673 20 50 26.7673 -20 50 26.7673 -21.5265 50 26.3683 -23.5321 50 25.2323 -25.2323 50 23.5321 -26.3683 50 21.5265 -26.7673 50 20 -26.7673 50 -20 -26.7673 50 -21.5265 -26.7673 50 -23.5321 -26.3683 50 -25.2323 -25.2323 50 -26.3683 -23.5321 50 -26.7673 -21.5265 50 -20 -20 50 -20 20 50 20 20 50 20 -20</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-positions-array" count="344" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-normals" name="normal">
+ <float_array id="RoundedCube-normals-array" count="1032">-1 0 0 -1 0 0 -1 0 0 -1 0 0 -0.993061 -0.117598 0 -0.996922 -0.078398 0 -0.993227 -0.115947 0.007469 -0.993787 -0.105555 0.035291 -0.992807 -0.084657 0.084657 -0.993787 -0.035291 0.105555 -0.993227 -0.007469 0.115947 -0.993061 0 0.117598 -0.996922 0 0.078398 -0.993227 0.007469 0.115947 -0.993787 0.035292 0.105554 -0.992807 0.084657 0.084657 -0.993787 0.105555 0.035291 -0.993227 0.115947 0.007469 -0.993061 0.117598 0 -0.996922 0.078398 0 -0.993227 0.115947 -0.007469 -0.993787 0.105554 -0.035291 -0.992807 0.084657 -0.084657 -0.993787 0.035291 -0.105554 -0.993227 0.007469 -0.115947 -0.993061 0 -0.117598 -0.996922 0 -0.078398 -0.993227 -0.007469 -0.115947 -0.993787 -0.035292 -0.105555 -0.992807 -0.084657 -0.084657 -0.993787 -0.105554 -0.035291 -0.993227 -0.115947 -0.007469 -0.92388 -0.382683 0 -0.947173 -0.320722 0 -0.925806 -0.376745 0.030759 -0.922055 -0.356058 0.15178 -0.920436 -0.261123 0.290881 -0.931551 -0.127114 0.340669 -0.925806 -0.030759 0.376745 -0.92388 0 0.382683 -0.947173 0 0.320722 -0.925806 0.030759 0.376745 -0.922055 0.15178 0.356058 -0.920436 0.290881 0.261123 -0.931551 0.340669 0.127114 -0.925806 0.376745 0.030759 -0.92388 0.382683 0 -0.947173 0.320722 0 -0.925806 0.376745 -0.030759 -0.922055 0.356058 -0.15178 -0.920436 0.261123 -0.290881 -0.931551 0.127114 -0.340669 -0.925806 0.030759 -0.376745 -0.92388 0 -0.382683 -0.947173 0 -0.320722 -0.925806 -0.030759 -0.376745 -0.922055 -0.15178 -0.356058 -0.920436 -0.290881 -0.261123 -0.931551 -0.340669 -0.127114 -0.925806 -0.376745 -0.030759 -0.707107 -0.707107 0 -0.752339 -0.658776 0 -0.712775 -0.698491 0.063742 -0.682181 -0.676059 0.278518 -0.73611 -0.471849 0.485284 -0.728929 -0.251867 0.636573 -0.712774 -0.063742 0.698491 -0.707107 0 0.707107 -0.752339 0 0.658776 -0.712775 0.063742 0.698491 -0.682181 0.278518 0.676059 -0.73611 0.485284 0.471849 -0.728929 0.636573 0.251867 -0.712774 0.698491 0.063742 -0.707107 0.707107 0 -0.752339 0.658776 0 -0.712775 0.698491 -0.063742 -0.682181 0.676059 -0.278518 -0.73611 0.471848 -0.485284 -0.728929 0.251867 -0.636573 -0.712775 0.063742 -0.698491 -0.707107 0 -0.707107 -0.752339 0 -0.658776 -0.712774 -0.063742 -0.698491 -0.682181 -0.278518 -0.676059 -0.73611 -0.485284 -0.471849 -0.728929 -0.636573 -0.251867 -0.712775 -0.698491 -0.063742 -0.382683 -0.92388 0 -0.442968 -0.896538 0 -0.388497 -0.917276 0.087603 -0.339221 -0.869305 0.359496 -0.410659 -0.640778 0.648662 -0.404562 -0.344312 0.847218 -0.388497 -0.087603 0.917276 -0.382683 0 0.92388 -0.442968 0 0.896538 -0.388497 0.087603 0.917276 -0.339221 0.359496 0.869305 -0.410659 0.648662 0.640778 -0.404562 0.847218 0.344312 -0.388497 0.917276 0.087603 -0.382683 0.92388 0 -0.442968 0.896538 0 -0.388497 0.917276 -0.087603 -0.339221 0.869305 -0.359496 -0.410659 0.640778 -0.648662 -0.404562 0.344312 -0.847218 -0.388497 0.087603 -0.917276 -0.382683 0 -0.92388 -0.442968 0 -0.896538 -0.388497 -0.087603 -0.917276 -0.339221 -0.359496 -0.869305 -0.410659 -0.648662 -0.640778 -0.404562 -0.847218 -0.344312 -0.388497 -0.917276 -0.087603 -0.098017 -0.995185 0 -0.112009 -0.993707 0 -0.100013 -0.986464 0.129944 -0.083619 -0.904647 0.417876 -0.106923 -0.702534 0.703572 -0.105389 -0.379818 0.919039 -0.100066 -0.097179 0.990224 -0.098017 0 0.995185 -0.112009 0 0.993707 -0.100013 0.129944 0.986464 -0.083619 0.417877 0.904647 -0.106923 0.703572 0.702534 -0.105389 0.919039 0.379817 -0.100066 0.990224 0.097179 -0.098017 0.995185 0 -0.112009 0.993707 0 -0.100013 0.986464 -0.129944 -0.083619 0.904647 -0.417876 -0.106923 0.702534 -0.703572 -0.105389 0.379818 -0.919039 -0.100066 0.097179 -0.990224 -0.098017 0 -0.995185 -0.112009 0 -0.993707 -0.100013 -0.129944 -0.986464 -0.083619 -0.417877 -0.904647 -0.106923 -0.703572 -0.702534 -0.105389 -0.919039 -0.379817 -0.100066 -0.990224 -0.097179 0 -1 0 0 -1 0 0 -0.995185 0.098017 0 -0.92388 0.382683 0 -0.707107 0.707107 0 -0.382683 0.92388 0 -0.098017 0.995185 0 0 1 0 0 1 0 0.098017 0.995185 0 0.382683 0.92388 0 0.707107 0.707107 0 0.92388 0.382683 0 0.995185 0.098017 0 1 0 0 1 0 0 0.995185 -0.098017 0 0.92388 -0.382683 0 0.707107 -0.707107 0 0.382683 -0.92388 0 0.098017 -0.995185 0 0 -1 0 0 -1 0 -0.098017 -0.995185 0 -0.382683 -0.92388 0 -0.707107 -0.707107 0 -0.92388 -0.382683 0 -0.995185 -0.098017 0 -1 0 0 -1 0 0 -0.995185 0.098017 0 -0.92388 0.382683 0 -0.707107 0.707107 0 -0.382683 0.92388 0 -0.098017 0.995185 0 0 1 0 0 1 0 0.098017 0.995185 0 0.382683 0.92388 0 0.707107 0.707107 0 0.92388 0.382683 0 0.995185 0.098017 0 1 0 0 1 0 0 0.995185 -0.098017 0 0.92388 -0.382683 0 0.707107 -0.707107 0 0.382683 -0.92388 0 0.098017 -0.995185 0 0 -1 0 0 -1 0 -0.098017 -0.995185 0 -0.382683 -0.92388 0 -0.707107 -0.707107 0 -0.92388 -0.382683 0 -0.995185 -0.098017 0.112009 -0.993707 0 0.098017 -0.995185 0 0.100066 -0.990224 0.097178 0.105389 -0.919039 0.379817 0.106923 -0.703572 0.702534 0.083619 -0.417877 0.904647 0.100013 -0.129944 0.986464 0.112009 0 0.993707 0.098017 0 0.995185 0.100066 0.097179 0.990224 0.105389 0.379818 0.919039 0.106923 0.702534 0.703572 0.083619 0.904647 0.417876 0.100013 0.986464 0.129944 0.112009 0.993707 0 0.098017 0.995185 0 0.100066 0.990224 -0.097178 0.105389 0.919039 -0.379817 0.106923 0.703572 -0.702534 0.083619 0.417877 -0.904647 0.100013 0.129944 -0.986464 0.112009 0 -0.993707 0.098017 0 -0.995185 0.100066 -0.097179 -0.990224 0.105389 -0.379818 -0.919039 0.106923 -0.702534 -0.703572 0.083619 -0.904647 -0.417876 0.100013 -0.986464 -0.129944 0.442968 -0.896538 0 0.382683 -0.92388 0 0.388497 -0.917276 0.087603 0.404562 -0.847218 0.344312 0.410659 -0.648662 0.640778 0.339221 -0.359496 0.869305 0.388497 -0.087603 0.917276 0.442968 0 0.896538 0.382683 0 0.92388 0.388497 0.087603 0.917276 0.404562 0.344312 0.847218 0.410659 0.640778 0.648662 0.339221 0.869305 0.359496 0.388497 0.917276 0.087603 0.442968 0.896538 0 0.382683 0.92388 0 0.388497 0.917276 -0.087603 0.404562 0.847218 -0.344312 0.410659 0.648662 -0.640778 0.339221 0.359496 -0.869305 0.388497 0.087603 -0.917276 0.442968 0 -0.896538 0.382683 0 -0.92388 0.388497 -0.087603 -0.917276 0.404562 -0.344312 -0.847218 0.410659 -0.640778 -0.648662 0.339221 -0.869305 -0.359496 0.388497 -0.917276 -0.087603 0.752339 -0.658776 0 0.707107 -0.707107 0 0.712774 -0.698491 0.063742 0.728929 -0.636573 0.251867 0.73611 -0.485284 0.471849 0.682181 -0.278518 0.676059 0.712774 -0.063742 0.698491 0.752339 0 0.658776 0.707107 0 0.707107 0.712775 0.063742 0.698491 0.728929 0.251867 0.636573 0.73611 0.471849 0.485284 0.682181 0.676059 0.278518 0.712775 0.698491 0.063742 0.752339 0.658776 0 0.707107 0.707107 0 0.712774 0.698491 -0.063742 0.728929 0.636573 -0.251867 0.73611 0.485284 -0.471849 0.682181 0.278518 -0.676059 0.712775 0.063742 -0.698491 0.752339 0 -0.658776 0.707107 0 -0.707107 0.712775 -0.063742 -0.698491 0.728929 -0.251867 -0.636573 0.73611 -0.471849 -0.485284 0.682181 -0.676059 -0.278518 0.712775 -0.698491 -0.063742 0.947173 -0.320722 0 0.92388 -0.382683 0 0.925806 -0.376745 0.030759 0.931551 -0.340669 0.127114 0.920436 -0.290881 0.261123 0.922055 -0.15178 0.356058 0.925806 -0.030759 0.376745 0.947173 0 0.320722 0.92388 0 0.382683 0.925806 0.030759 0.376745 0.931551 0.127114 0.340669 0.920436 0.261123 0.290881 0.922055 0.356058 0.15178 0.925806 0.376745 0.030759 0.947173 0.320722 0 0.92388 0.382683 0 0.925806 0.376745 -0.030759 0.931551 0.340669 -0.127114 0.920436 0.290881 -0.261123 0.922055 0.15178 -0.356058 0.925806 0.030759 -0.376745 0.947173 0 -0.320722 0.92388 0 -0.382683 0.925806 -0.030759 -0.376745 0.931551 -0.127114 -0.340669 0.920436 -0.261123 -0.290881 0.922055 -0.356058 -0.15178 0.925806 -0.376745 -0.030759 0.996922 -0.078398 0 0.993061 -0.117598 0 0.993227 -0.115947 0.007469 0.993787 -0.105555 0.035291 0.992807 -0.084657 0.084657 0.993787 -0.035292 0.105555 0.993227 -0.007469 0.115947 0.996922 0 0.078398 0.993061 0 0.117598 0.993227 0.007469 0.115947 0.993787 0.035291 0.105554 0.992807 0.084657 0.084657 0.993787 0.105555 0.035291 0.993227 0.115947 0.007469 0.996922 0.078398 0 0.993061 0.117598 0 0.993227 0.115947 -0.007469 0.993787 0.105554 -0.035291 0.992807 0.084657 -0.084657 0.993787 0.035292 -0.105554 0.993227 0.007469 -0.115947 0.996922 0 -0.078398 0.993061 0 -0.117598 0.993227 -0.007469 -0.115947 0.993787 -0.035291 -0.105555 0.992807 -0.084657 -0.084657 0.993787 -0.105554 -0.035291 0.993227 -0.115947 -0.007469 1 0 0 1 0 0 1 0 0 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-normals-array" count="344" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-Texture" name="Texture">
+ <float_array id="RoundedCube-Texture-array" count="752">0.731507 0.19016 0.749177 0.19016 0.731507 0.268493 0.772392 0.194778 0.792072 0.207928 0.805222 0.227608 0.80984 0.250823 0.80984 0.268493 0.80984 0.731507 0.80984 0.749177 0.731507 0.731507 0.805222 0.772392 0.792072 0.792072 0.772392 0.805222 0.749177 0.80984 0.731507 0.80984 0.268493 0.80984 0.250823 0.80984 0.268493 0.731507 0.227608 0.805222 0.207928 0.792072 0.194778 0.772392 0.19016 0.749177 0.19016 0.731507 0.19016 0.268493 0.19016 0.250823 0.268493 0.268493 0.194778 0.227608 0.207928 0.207928 0.227608 0.194778 0.250823 0.19016 0.268493 0.19016 0.772392 0.087246 0.731507 0.087246 0.871643 0.128357 0.826106 0.09793 0.902069 0.173894 0.912754 0.227608 0.912754 0.268493 0.912754 0.731507 0.902069 0.826106 0.912754 0.772392 0.871643 0.871643 0.826106 0.902069 0.772392 0.912754 0.731507 0.912754 0.227608 0.912754 0.268493 0.912754 0.128357 0.871643 0.173894 0.902069 0.09793 0.826106 0.087246 0.772392 0.087246 0.731507 0.087246 0.268493 0.09793 0.173894 0.087246 0.227608 0.128357 0.128357 0.173894 0.09793 0.227608 0.087246 0.268493 0.087246 0.792072 0 0.731507 0 0.871643 0.015827 0.939099 0.0609 0.984172 0.128357 1 0.207928 1 0.268493 1 0.731507 0.984172 0.871643 1 0.792072 0.939099 0.939099 0.871643 0.984172 0.792072 1 0.731507 1 0.207928 1 0.268493 1 0.128357 0.984172 0.0609 0.939099 0.015827 0.871643 0 0.792072 0 0.731507 0 0.268493 0.015827 0.128357 0 0.207928 0.0609 0.0609 0.128357 0.015827 0.207928 0 0.268493 0 0.087246 0.805222 0 0.792072 0 0.731507 0 0.792072 0.087246 0.902069 0.087246 0.984172 0 0.871643 0 0.939099 0 0.871643 0.087246 0.09793 0.087246 0.194778 0 0.128357 0 0.207928 0 0.128357 0 0.268493 0 0.731507 0 0.268493 0 0.871643 0 0.792072 0 0.871643 0.912754 0.984172 0.912754 0.902069 1 0.939099 1 0.871643 1 0.939099 0.912754 0.805222 0.912754 0.731507 1 0.792072 1 0.731507 1 0.792072 0.912754 0.194778 1 0.207928 0.912754 0.268493 1 0.268493 1 0.207928 0.912754 0.09793 0.912754 0.015827 1 0.128357 1 0.0609 1 0.128357 1 0.871643 1 0.792072 1 0.871643 1 0.731507 1 0.268493 1 0.731507 1 0.128357 1 0.207928 1 0.128357 0.087246 0.015827 0 0.0609 0 0.128357 0 0.0609 0 0.207928 0 0.268493 0 0.207928 0.19016 0.80984 0.19016 0.912754 0.19016 1 0.19016 0.087246 0.19016 0.19016 0.80984 1 0.80984 0.912754 0.912754 0.984172 0.912754 0.984172 0.80984 0.80984 0.80984 0.19016 0.80984 0.087246 0.80984 0 0.19016 0 0.087246 0.015827 0.087246 0.015827 0.731507 1 0.80984 1 0.80984 1 0.268493 0 0.19016 0 0.19016 0 0.268493 1 0.731507 1 0.731507 1 0.731507 0 0.268493 0 0.268493 0 0.19016 1 0.268493 1 0.268493 1 0.80984 0 0.731507 0 0.731507 0 0.912754 0.805222 0.912754 0.984172 0.912754 0.902069 0.912754 0.194778 0.912754 0.09793 0.19016 1 0.087246 0.902069 0.087246 0.984172 0.19016 1 0.087246 0.805222 0.087246 0.731507 0.087246 0.194778 0.087246 0.268493 0.087246 0.015827 0.087246 0.09793 0.80984 0 0.912754 0.015827 0.80984 0 0.087246 0.984172 0 0.939099 0.087246 0.984172 0.912754 0.015827 1 0.0609 0.912754 0.015827 0.207928 0 0.268493 0 0.268493 0 0.0609 0.0609 0.128357 0.015827 0.128357 0.128357 0.173894 0.09793 0.128357 0.015827 0.015827 0.128357 0 0.207928 0.087246 0.227608 0 0.207928 0 0.268493 0 0.731507 0 0.268493 0.015827 0.871643 0 0.792072 0.087246 0.772392 0 0.792072 0.128357 0.984172 0.0609 0.939099 0.173894 0.902069 0.128357 0.871643 0.0609 0.939099 0.207928 1 0.268493 1 0.268493 1 0.792072 1 0.731507 1 0.731507 1 0.939099 0.939099 0.871643 0.984172 0.826106 0.902069 0.871643 0.984172 0.984172 0.871643 1 0.792072 0.912754 0.772392 1 0.792072 1 0.731507 1 0.268493 1 0.731507 0.984172 0.128357 1 0.207928 0.912754 0.227608 1 0.207928 0.871643 0.015827 0.939099 0.0609 0.826106 0.09793 0.939099 0.0609 0.792072 0 0.731507 0 0.731507 0 0 0.268493 0 0.731507 0 0.268493 0 0.871643 0 0.792072 0 0.871643 0.087246 0.015827 0 0.0609 0 0.128357 0 0.0609 0 0.207928 0 0.268493 0 0.207928 0 0.792072 0 0.731507 0 0.792072 0 0.871643 0 0.939099 0 0.871643 1 0.871643 1 0.792072 1 0.871643 1 0.731507 1 0.268493 1 0.731507 1 0.128357 1 0.207928 1 0.128357 0.912754 0.984172 1 0.939099 1 0.871643 1 0.939099 1 0.792072 1 0.731507 1 0.792072 1 0.207928 1 0.268493 1 0.207928 1 0.128357 1 0.0609 1 0.128357 0 0.128357 0 0.207928 0 0.128357 0.19016 0 0.087246 0.015827 0.087246 0.015827 0.80984 1 0.912754 0.984172 0.912754 0.984172 0.268493 0 0.19016 0 0.19016 0 0.731507 1 0.80984 1 0.80984 1 0.731507 0 0.268493 0 0.268493 0 0.268493 1 0.731507 1 0.731507 1 0.80984 0 0.731507 0 0.731507 0 0.19016 1 0.268493 1 0.268493 1 0.80984 0 0.912754 0.015827 0.80984 0 0.19016 1 0.087246 0.984172 0.19016 1 0.912754 0.015827 1 0.0609 0.912754 0.015827 0.087246 0.984172 0 0.939099 0.087246 0.984172 0.731507 0 0.268493 0 0.731507 0 0.128357 0.015827 0.207928 0 0.207928 0 0.015827 0.128357 0.0609 0.0609 0.0609 0.0609 0 0.207928 0 0.268493 0 0.268493 0 0.792072 0 0.731507 0 0.731507 0.0609 0.939099 0.015827 0.871643 0.015827 0.871643 0.128357 0.984172 0.207928 1 0.207928 1 0.268493 1 0.731507 1 0.268493 1 0.871643 0.984172 0.792072 1 0.792072 1 0.984172 0.871643 0.939099 0.939099 0.939099 0.939099 1 0.792072 1 0.731507 1 0.731507 1 0.207928 1 0.268493 1 0.268493 0.939099 0.0609 0.984172 0.128357 0.984172 0.128357 0.871643 0.015827 0.792072 0 0.792072 0</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-Texture-array" count="376" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="RoundedCube-vertices">
+ <input semantic="POSITION" source="#RoundedCube-positions"/>
+ <input semantic="NORMAL" source="#RoundedCube-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="684">
+ <input semantic="VERTEX" source="#RoundedCube-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#RoundedCube-Texture" offset="1" set="1"/>
+ <p>5 0 6 1 1 2 6 1 7 3 1 2 7 3 8 4 1 2 8 4 9 5 1 2 9 5 10 6 1 2 10 6 11 7 1 2 12 8 13 9 2 10 13 9 14 11 2 10 14 11 15 12 2 10 15 12 16 13 2 10 16 13 17 14 2 10 17 14 18 15 2 10 19 16 20 17 3 18 20 17 21 19 3 18 21 19 22 20 3 18 22 20 23 21 3 18 23 21 24 22 3 18 24 22 25 23 3 18 26 24 27 25 0 26 27 25 28 27 0 26 28 27 29 28 0 26 29 28 30 29 0 26 30 29 31 30 0 26 31 30 4 31 0 26 341 26 314 30 313 31 341 26 315 29 314 30 341 26 316 28 315 29 341 26 317 27 316 28 341 26 318 25 317 27 341 26 319 24 318 25 342 18 321 22 320 23 342 18 322 21 321 22 342 18 323 20 322 21 342 18 324 19 323 20 342 18 325 17 324 19 342 18 326 16 325 17 343 10 328 14 327 15 343 10 329 13 328 14 343 10 330 12 329 13 343 10 331 11 330 12 343 10 332 9 331 11 343 10 333 8 332 9 340 2 335 6 334 7 340 2 336 5 335 6 340 2 337 4 336 5 340 2 338 3 337 4 340 2 339 1 338 3 340 2 312 0 339 1 0 26 1 2 3 18 2 10 3 18 1 2 11 7 12 8 1 2 2 10 1 2 12 8 25 23 26 24 3 18 0 26 3 18 26 24 34 32 6 1 33 33 5 0 33 33 6 1 36 34 8 4 35 35 7 3 35 35 8 4 37 36 38 37 9 5 10 6 9 5 38 37 39 38 40 39 11 7 12 8 11 7 40 39 42 40 14 11 41 41 13 9 41 41 14 11 43 42 44 43 15 12 16 13 15 12 44 43 45 44 46 45 17 14 18 15 17 14 46 45 48 46 20 17 47 47 19 16 47 47 20 17 50 48 22 20 49 49 21 19 49 49 22 20 51 50 52 51 23 21 24 22 23 21 52 51 53 52 54 53 25 23 26 24 25 23 54 53 56 54 28 27 55 55 27 25 55 55 28 27 57 56 58 57 29 28 30 29 29 28 58 57 59 58 32 59 31 30 4 31 31 30 32 59 62 60 34 32 61 61 33 33 61 61 34 32 63 62 64 63 35 35 36 34 35 35 64 63 65 64 66 65 37 36 38 37 37 36 66 65 67 66 68 67 39 38 40 39 39 38 68 67 70 68 42 40 69 69 41 41 69 69 42 40 71 70 72 71 43 42 44 43 43 42 72 71 73 72 74 73 45 44 46 45 45 44 74 73 76 74 48 46 75 75 47 47 75 75 48 46 77 76 78 77 49 49 50 48 49 49 78 77 79 78 80 79 51 50 52 51 51 50 80 79 81 80 82 81 53 52 54 53 53 52 82 81 84 82 56 54 83 83 55 55 83 83 56 54 85 84 86 85 57 56 58 57 57 56 86 85 87 86 60 87 59 58 32 59 59 58 60 87 90 88 62 89 89 52 61 90 89 52 62 91 91 92 92 93 63 94 64 95 63 96 92 93 93 97 94 98 65 99 66 100 65 101 94 98 95 53 96 52 67 102 68 103 67 104 96 52 98 92 70 105 97 88 69 106 97 88 70 107 99 108 100 109 71 110 72 111 71 112 100 109 101 113 102 114 73 115 74 116 73 117 102 114 104 118 76 119 103 120 75 121 103 120 76 122 105 123 106 124 77 125 78 126 77 127 106 124 107 109 108 113 79 128 80 129 79 130 108 113 109 114 110 120 81 131 82 132 81 133 110 120 112 123 84 134 111 118 83 135 111 118 84 136 113 137 114 97 85 138 86 139 85 140 114 97 115 98 88 53 87 141 60 142 87 143 88 53 118 144 90 88 117 23 89 52 117 23 90 88 119 145 120 146 91 92 92 93 91 92 120 146 121 147 122 148 93 97 94 98 93 97 122 148 123 24 124 23 95 53 96 52 95 53 124 23 126 145 98 92 125 144 97 88 125 144 98 92 127 149 128 150 99 151 100 109 99 152 128 150 129 153 130 8 101 113 102 114 101 113 130 8 132 154 104 118 131 7 103 120 131 7 104 118 133 155 134 156 105 123 106 124 105 123 134 156 135 150 136 153 107 109 108 113 107 109 136 153 137 8 138 7 109 114 110 120 109 114 138 7 140 155 112 123 139 154 111 118 139 154 112 123 141 157 142 147 113 158 114 97 113 159 142 147 143 148 116 24 115 98 88 53 115 98 116 24 145 18 146 16 117 23 118 144 117 23 146 16 147 47 148 75 119 145 120 146 119 145 148 75 149 59 150 31 121 147 122 148 121 147 150 31 151 26 152 18 123 24 124 23 123 24 152 18 153 16 154 47 125 144 126 145 125 144 154 47 155 160 156 45 127 161 128 150 127 162 156 45 157 15 158 10 129 153 130 8 129 153 158 10 159 2 160 0 131 7 132 154 131 7 160 0 161 33 162 61 133 155 134 156 133 155 162 61 163 45 164 15 135 150 136 153 135 150 164 15 165 10 166 2 137 8 138 7 137 8 166 2 167 0 168 33 139 154 140 155 139 154 168 33 169 163 170 59 141 164 142 147 141 165 170 59 171 31 144 26 143 148 116 24 143 148 144 26 173 10 174 15 145 18 146 16 145 18 174 15 175 45 176 73 147 47 148 75 147 47 176 73 177 33 178 0 149 59 150 31 149 59 178 0 179 2 180 10 151 26 152 18 151 26 180 10 181 15 182 45 153 16 154 47 153 16 182 45 183 166 184 47 155 167 156 45 155 168 184 47 185 16 186 18 157 15 158 10 157 15 186 18 187 26 188 31 159 2 160 0 159 2 188 31 189 59 190 87 161 33 162 61 161 33 190 87 191 47 192 16 163 45 164 15 163 45 192 16 193 18 194 26 165 10 166 2 165 10 194 26 195 31 196 59 167 0 168 33 167 0 196 59 197 169 198 33 169 170 170 59 169 171 198 33 199 0 172 2 171 31 144 26 171 31 172 2 201 8 202 153 173 10 174 15 173 10 202 153 203 150 204 149 175 45 176 73 175 45 204 149 205 155 206 154 177 33 178 0 177 33 206 154 207 7 208 8 179 2 180 10 179 2 208 8 209 153 210 150 181 15 182 45 181 15 210 150 211 172 212 145 183 173 184 47 183 174 212 145 213 144 214 23 185 16 186 18 185 16 214 23 215 24 216 148 187 26 188 31 187 26 216 148 217 147 218 157 189 59 190 87 189 59 218 157 219 145 220 144 191 47 192 16 191 47 220 144 221 23 222 24 193 18 194 26 193 18 222 24 223 148 224 147 195 31 196 59 195 31 224 147 225 175 226 155 197 176 198 33 197 177 226 155 227 154 200 7 199 0 172 2 199 0 200 7 202 153 201 8 230 178 229 39 230 178 201 8 204 149 203 150 232 179 231 180 232 179 203 150 234 181 206 154 233 182 205 155 233 182 206 154 235 38 236 39 207 7 208 8 207 7 236 39 237 178 238 180 209 153 210 150 209 153 238 180 212 145 211 183 240 184 239 185 240 184 211 186 213 144 241 187 214 23 242 188 214 23 241 187 216 148 215 24 244 189 243 190 244 189 215 24 218 157 217 147 246 191 245 192 246 191 217 147 248 187 220 144 247 184 219 145 247 184 220 144 249 188 250 190 221 23 222 24 221 23 250 190 251 189 252 192 223 148 224 147 223 148 252 192 226 155 225 193 254 182 253 194 254 182 225 195 227 154 255 181 200 7 228 38 200 7 255 181 230 178 229 39 258 69 257 67 258 69 229 39 232 179 231 180 260 110 259 111 260 110 231 180 233 182 261 125 234 181 262 65 234 181 261 125 263 66 264 67 235 38 236 39 235 38 264 67 238 180 237 178 266 111 265 69 266 111 237 178 240 184 239 196 268 94 267 197 268 94 239 198 241 187 269 79 242 188 270 80 242 188 269 79 244 189 243 190 272 83 271 81 272 83 243 190 246 191 245 192 274 138 273 99 274 138 245 192 247 184 275 94 248 187 276 79 248 187 275 94 277 80 278 81 249 188 250 190 249 188 278 81 252 192 251 189 280 99 279 83 280 99 251 189 254 182 253 199 282 125 281 200 282 125 253 201 255 181 283 65 228 38 256 66 228 38 283 65 258 202 257 203 286 58 285 59 286 58 257 204 260 205 259 206 288 207 287 208 288 207 259 209 261 210 289 54 262 211 290 212 262 213 289 54 291 190 292 188 263 214 264 215 263 216 292 188 266 217 265 218 294 50 293 219 294 50 265 220 268 221 267 222 296 223 295 224 296 223 267 225 269 226 297 46 270 227 298 47 270 228 297 46 272 229 271 230 300 44 299 45 300 44 271 231 274 232 273 233 302 42 301 234 302 42 273 235 275 236 303 40 276 237 304 238 276 239 303 40 305 114 306 120 277 240 278 241 277 242 306 120 280 243 279 244 308 36 307 245 308 36 279 246 282 247 281 248 310 249 309 34 310 249 281 250 283 251 311 32 256 252 284 33 256 253 311 32 286 58 285 59 314 30 313 31 314 30 285 59 288 207 287 208 316 28 315 29 316 28 287 208 289 54 317 27 290 212 318 25 290 212 317 27 319 24 320 23 291 190 292 188 291 190 320 23 294 50 293 219 322 21 321 22 322 21 293 219 295 224 323 20 296 223 324 19 296 223 323 20 297 46 325 17 298 47 326 16 298 47 325 17 300 44 299 45 328 14 327 15 328 14 299 45 302 42 301 234 330 12 329 13 330 12 301 234 303 40 331 11 304 238 332 9 304 238 331 11 333 8 334 7 305 114 306 120 305 114 334 7 308 36 307 245 336 5 335 6 336 5 307 245 309 34 337 4 310 249 338 3 310 249 337 4 311 32 339 1 284 33 312 0 284 33 339 1 341 26 342 18 319 24 320 23 319 24 342 18 343 10 340 2 333 8 334 7 333 8 340 2 4 31 5 0 0 26 1 2 0 26 5 0 18 15 19 16 2 10 3 18 2 10 19 16 32 59 33 33 4 31 5 0 4 31 33 33 35 35 7 3 34 32 6 1 34 32 7 3 36 34 37 36 8 4 9 5 8 4 37 36 38 37 39 38 10 6 11 7 10 6 39 38 41 41 13 9 40 39 12 8 40 39 13 9 43 42 15 12 42 40 14 11 42 40 15 12 44 43 45 44 16 13 17 14 16 13 45 44 46 45 47 47 18 15 19 16 18 15 47 47 49 49 21 19 48 46 20 17 48 46 21 19 50 48 51 50 22 20 23 21 22 20 51 50 52 51 53 52 24 22 25 23 24 22 53 52 55 55 27 25 54 53 26 24 54 53 27 25 57 56 29 28 56 54 28 27 56 54 29 28 58 57 59 58 30 29 31 30 30 29 59 58 60 87 61 61 32 59 33 33 32 59 61 61 63 62 35 35 62 60 34 32 62 60 35 35 64 63 65 64 36 34 37 36 36 34 65 64 66 65 67 66 38 37 39 38 38 37 67 66 69 69 41 41 68 67 40 39 68 67 41 41 70 68 71 70 42 40 43 42 42 40 71 70 72 71 73 72 44 43 45 44 44 43 73 72 74 73 75 75 46 45 47 47 46 45 75 75 77 76 49 49 76 74 48 46 76 74 49 49 78 77 79 78 50 48 51 50 50 48 79 78 80 79 81 80 52 51 53 52 52 51 81 80 83 83 55 55 82 81 54 53 82 81 55 55 84 82 85 84 56 54 57 56 56 54 85 84 86 85 87 86 58 57 59 58 58 57 87 86 88 53 89 52 60 254 61 255 60 256 89 52 91 92 63 257 90 88 62 258 90 88 63 259 92 260 93 97 64 261 65 262 64 263 93 97 94 98 95 53 66 264 67 265 66 266 95 53 97 88 69 267 96 52 68 268 96 52 69 269 98 92 99 93 70 270 71 271 70 272 99 93 100 109 101 113 72 273 73 274 72 275 101 113 102 114 103 120 74 276 75 277 74 278 103 120 105 123 77 279 104 118 76 280 104 118 77 281 106 282 107 109 78 283 79 284 78 285 107 109 108 113 109 114 80 286 81 287 80 288 109 114 111 118 83 289 110 120 82 290 110 120 83 291 112 123 113 124 84 292 85 293 84 294 113 124 114 97 115 98 86 295 87 296 86 297 115 98 116 24 117 23 88 53 89 52 88 53 117 23 119 145 91 92 118 144 90 88 118 144 91 92 120 298 121 147 92 299 93 97 92 300 121 147 122 148 123 24 94 98 95 53 94 98 123 24 125 144 97 88 124 23 96 52 124 23 97 88 126 145 127 146 98 92 99 93 98 92 127 146 128 150 129 153 100 109 101 113 100 109 129 153 130 8 131 7 102 114 103 120 102 114 131 7 133 155 105 123 132 154 104 118 132 154 105 123 134 301 135 150 106 302 107 109 106 303 135 150 136 153 137 8 108 113 109 114 108 113 137 8 139 154 111 118 138 7 110 120 138 7 111 118 140 155 141 156 112 123 113 124 112 123 141 156 142 147 143 148 114 97 115 98 114 97 143 148 144 26 145 18 116 24 117 23 116 24 145 18 146 16 147 47 118 144 119 145 118 144 147 47 148 304 149 59 120 305 121 147 120 306 149 59 150 31 151 26 122 148 123 24 122 148 151 26 152 18 153 16 124 23 125 144 124 23 153 16 154 47 155 75 126 145 127 146 126 145 155 75 156 45 157 15 128 150 129 153 128 150 157 15 158 10 159 2 130 8 131 7 130 8 159 2 160 0 161 33 132 154 133 155 132 154 161 33 162 307 163 45 134 308 135 150 134 309 163 45 164 15 165 10 136 153 137 8 136 153 165 10 166 2 167 0 138 7 139 154 138 7 167 0 168 33 169 61 140 155 141 156 140 155 169 61 170 59 171 31 142 147 143 148 142 147 171 31 172 2 173 10 144 26 145 18 144 26 173 10 174 15 175 45 146 16 147 47 146 16 175 45 176 310 177 33 148 311 149 59 148 312 177 33 178 0 179 2 150 31 151 26 150 31 179 2 180 10 181 15 152 18 153 16 152 18 181 15 182 45 183 73 154 47 155 75 154 47 183 73 184 47 185 16 156 45 157 15 156 45 185 16 186 18 187 26 158 10 159 2 158 10 187 26 188 31 189 59 160 0 161 33 160 0 189 59 190 313 191 47 162 314 163 45 162 315 191 47 192 16 193 18 164 15 165 10 164 15 193 18 194 26 195 31 166 2 167 0 166 2 195 31 196 59 197 87 168 33 169 61 168 33 197 87 198 33 199 0 170 59 171 31 170 59 199 0 200 7 201 8 172 2 173 10 172 2 201 8 202 153 203 150 174 15 175 45 174 15 203 150 204 316 205 155 176 317 177 33 176 318 205 155 206 154 207 7 178 0 179 2 178 0 207 7 208 8 209 153 180 10 181 15 180 10 209 153 210 150 211 149 182 45 183 73 182 45 211 149 212 145 213 144 184 47 185 16 184 47 213 144 214 23 215 24 186 18 187 26 186 18 215 24 216 148 217 147 188 31 189 59 188 31 217 147 218 319 219 145 190 320 191 47 190 321 219 145 220 144 221 23 192 16 193 18 192 16 221 23 222 24 223 148 194 26 195 31 194 26 223 148 224 147 225 157 196 59 197 87 196 59 225 157 226 155 227 154 198 33 199 0 198 33 227 154 228 38 229 39 200 7 201 8 200 7 229 39 230 178 231 180 202 153 203 150 202 153 231 180 205 155 204 322 233 182 232 323 233 182 204 324 206 154 234 181 207 7 235 38 207 7 234 181 209 153 208 8 237 178 236 39 237 178 208 8 211 149 210 150 239 179 238 180 239 179 210 150 241 187 213 144 240 184 212 145 240 184 213 144 242 188 243 190 214 23 215 24 214 23 243 190 244 189 245 192 216 148 217 147 216 148 245 192 219 145 218 325 247 184 246 326 247 184 218 327 220 144 248 187 221 23 249 188 221 23 248 187 223 148 222 24 251 189 250 190 251 189 222 24 225 157 224 147 253 191 252 192 253 191 224 147 255 181 227 154 254 182 226 155 254 182 227 154 256 66 257 67 228 38 229 39 228 38 257 67 231 180 230 178 259 111 258 69 259 111 230 178 233 182 232 328 261 125 260 329 261 125 232 330 234 181 262 65 235 38 263 66 235 38 262 65 237 178 236 39 265 69 264 67 265 69 236 39 239 179 238 180 267 110 266 111 267 110 238 180 240 184 268 94 241 187 269 79 241 187 268 94 270 80 271 81 242 188 243 190 242 188 271 81 245 192 244 189 273 99 272 83 273 99 244 189 247 184 246 331 275 94 274 332 275 94 246 333 248 187 276 79 249 188 277 80 249 188 276 79 251 189 250 190 279 83 278 81 279 83 250 190 253 191 252 192 281 138 280 99 281 138 252 192 254 182 282 125 255 181 283 65 255 181 282 125 284 33 285 59 256 334 257 335 256 336 285 59 259 337 258 338 287 208 286 58 287 208 258 339 261 340 260 341 289 54 288 207 289 54 260 342 262 343 290 212 263 344 291 190 263 345 290 212 265 346 264 347 293 219 292 188 293 219 264 348 267 349 266 350 295 224 294 50 295 224 266 351 268 352 296 223 269 353 297 46 269 354 296 223 298 47 299 45 270 355 271 356 270 357 299 45 273 358 272 359 301 234 300 44 301 234 272 360 275 361 274 362 303 40 302 42 303 40 274 363 276 364 304 238 277 365 305 114 277 366 304 238 279 367 278 368 307 245 306 120 307 245 278 369 281 370 280 371 309 34 308 36 309 34 280 372 282 373 310 249 283 374 311 32 283 375 310 249 312 0 313 31 284 33 285 59 284 33 313 31 287 208 286 58 315 29 314 30 315 29 286 58 288 207 316 28 289 54 317 27 289 54 316 28 290 212 318 25 291 190 319 24 291 190 318 25 293 219 292 188 321 22 320 23 321 22 292 188 295 224 294 50 323 20 322 21 323 20 294 50 296 223 324 19 297 46 325 17 297 46 324 19 326 16 327 15 298 47 299 45 298 47 327 15 301 234 300 44 329 13 328 14 329 13 300 44 302 42 330 12 303 40 331 11 303 40 330 12 304 238 332 9 305 114 333 8 305 114 332 9 307 245 306 120 335 6 334 7 335 6 306 120 309 34 308 36 337 4 336 5 337 4 308 36 310 249 338 3 311 32 339 1 311 32 338 3 340 2 341 26 312 0 313 31 312 0 341 26 342 18 343 10 326 16 327 15 326 16 343 10 340 2 343 10 341 26 342 18 341 26 343 10</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="RoundedCube-3">
+ <node id="_RoundedCube" name="RoundedCube" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#RoundedCube">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-4.dae b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-4.dae
new file mode 100644
index 0000000..3fa9d97
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-4.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-09-19T18:06:38Z</created>
+ <modified>2008-09-19T18:06:38Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="RoundedCube" name="RoundedCube">
+ <mesh>
+ <source id="RoundedCube-positions" name="position">
+ <float_array id="RoundedCube-positions-array" count="1032">-50 -10 -10 -50 -10 10 -50 10 10 -50 10 -10 -50 -19.023 -10 -50 -19.023 10 -50 -19.023 12.0354 -50 -18.4911 14.7094 -50 -16.9764 16.9764 -50 -14.7094 18.4911 -50 -12.0354 19.023 -50 -10 19.023 -50 10 19.023 -50 12.0354 19.023 -50 14.7094 18.4911 -50 16.9764 16.9764 -50 18.4911 14.7094 -50 19.023 12.0354 -50 19.023 10 -50 19.023 -10 -50 19.023 -12.0354 -50 18.4911 -14.7094 -50 16.9764 -16.9764 -50 14.7094 -18.4911 -50 12.0354 -19.023 -50 10 -19.023 -50 -10 -19.023 -50 -12.0354 -19.023 -50 -14.7094 -18.4911 -50 -16.9764 -16.9764 -50 -18.4911 -14.7094 -50 -19.023 -12.0354 -47.642 -30.8774 -10 -47.642 -30.8774 10 -47.642 -30.8774 14.7094 -47.642 -29.6467 20.8966 -47.642 -26.1419 26.1419 -47.642 -20.8967 29.6467 -47.642 -14.7094 30.8774 -47.642 -10 30.8774 -47.642 10 30.8774 -47.642 14.7094 30.8774 -47.642 20.8966 29.6467 -47.642 26.1419 26.1419 -47.642 29.6467 20.8966 -47.642 30.8774 14.7094 -47.642 30.8774 10 -47.642 30.8774 -10 -47.642 30.8774 -14.7094 -47.642 29.6467 -20.8967 -47.642 26.1419 -26.1419 -47.642 20.8966 -29.6467 -47.642 14.7094 -30.8774 -47.642 10 -30.8774 -47.642 -10 -30.8774 -47.642 -14.7094 -30.8774 -47.642 -20.8967 -29.6467 -47.642 -26.1419 -26.1419 -47.642 -29.6467 -20.8967 -47.642 -30.8774 -14.7094 -40.9271 -40.9271 -10 -40.9271 -40.9271 10 -40.9271 -40.9271 16.9764 -40.9271 -39.1039 26.1419 -40.9271 -33.9121 33.9121 -40.9271 -26.1419 39.1039 -40.9271 -16.9764 40.9271 -40.9271 -10 40.9271 -40.9271 10 40.9271 -40.9271 16.9764 40.9271 -40.9271 26.1419 39.1039 -40.9271 33.9121 33.9121 -40.9271 39.1039 26.1419 -40.9271 40.9271 16.9764 -40.9271 40.9271 10 -40.9271 40.9271 -10 -40.9271 40.9271 -16.9764 -40.9271 39.1039 -26.1419 -40.9271 33.9121 -33.9121 -40.9271 26.1419 -39.1039 -40.9271 16.9764 -40.9271 -40.9271 10 -40.9271 -40.9271 -10 -40.9271 -40.9271 -16.9764 -40.9271 -40.9271 -26.1419 -39.1039 -40.9271 -33.9121 -33.9121 -40.9271 -39.1039 -26.1419 -40.9271 -40.9271 -16.9764 -30.8774 -47.642 -10 -30.8774 -47.642 10 -30.8774 -47.642 18.4911 -30.8774 -45.423 29.6467 -30.8774 -39.1039 39.1039 -30.8774 -29.6467 45.423 -30.8774 -18.4911 47.642 -30.8774 -10 47.642 -30.8774 10 47.642 -30.8774 18.4911 47.642 -30.8774 29.6467 45.423 -30.8774 39.1039 39.1039 -30.8774 45.423 29.6467 -30.8774 47.642 18.4911 -30.8774 47.642 10 -30.8774 47.642 -10 -30.8774 47.642 -18.4911 -30.8774 45.423 -29.6467 -30.8774 39.1039 -39.1039 -30.8774 29.6467 -45.423 -30.8774 18.4911 -47.642 -30.8774 10 -47.642 -30.8774 -10 -47.642 -30.8774 -18.4911 -47.642 -30.8774 -29.6467 -45.423 -30.8774 -39.1039 -39.1039 -30.8774 -45.423 -29.6467 -30.8774 -47.642 -18.4911 -19.023 -50 -10 -19.023 -50 10 -19.023 -50 19.023 -19.023 -47.642 30.8774 -19.023 -40.9271 40.9271 -19.023 -30.8774 47.642 -19.023 -19.023 50 -19.023 -10 50 -19.023 10 50 -19.023 19.023 50 -19.023 30.8774 47.642 -19.023 40.9271 40.9271 -19.023 47.642 30.8774 -19.023 50 19.023 -19.023 50 10 -19.023 50 -10 -19.023 50 -19.023 -19.023 47.642 -30.8774 -19.023 40.9271 -40.9271 -19.023 30.8774 -47.642 -19.023 19.023 -50 -19.023 10 -50 -19.023 -10 -50 -19.023 -19.023 -50 -19.023 -30.8774 -47.642 -19.023 -40.9271 -40.9271 -19.023 -47.642 -30.8774 -19.023 -50 -19.023 -10 -50 -10 -10 -50 10 -10 -50 19.023 -10 -47.642 30.8774 -10 -40.9271 40.9271 -10 -30.8774 47.642 -10 -19.023 50 -10 -10 50 -10 10 50 -10 19.023 50 -10 30.8774 47.642 -10 40.9271 40.9271 -10 47.642 30.8774 -10 50 19.023 -10 50 10 -10 50 -10 -10 50 -19.023 -10 47.642 -30.8774 -10 40.9271 -40.9271 -10 30.8774 -47.642 -10 19.023 -50 -10 10 -50 -10 -10 -50 -10 -19.023 -50 -10 -30.8774 -47.642 -10 -40.9271 -40.9271 -10 -47.642 -30.8774 -10 -50 -19.023 10 -50 -10 10 -50 10 10 -50 19.023 10 -47.642 30.8774 10 -40.9271 40.9271 10 -30.8774 47.642 10 -19.023 50 10 -10 50 10 10 50 10 19.023 50 10 30.8774 47.642 10 40.9271 40.9271 10 47.642 30.8774 10 50 19.023 10 50 10 10 50 -10 10 50 -19.023 10 47.642 -30.8774 10 40.9271 -40.9271 10 30.8774 -47.642 10 19.023 -50 10 10 -50 10 -10 -50 10 -19.023 -50 10 -30.8774 -47.642 10 -40.9271 -40.9271 10 -47.642 -30.8774 10 -50 -19.023 19.023 -50 -10 19.023 -50 10 19.023 -50 19.023 19.023 -47.642 30.8774 19.023 -40.9271 40.9271 19.023 -30.8774 47.642 19.023 -19.023 50 19.023 -10 50 19.023 10 50 19.023 19.023 50 19.023 30.8774 47.642 19.023 40.9271 40.9271 19.023 47.642 30.8774 19.023 50 19.023 19.023 50 10 19.023 50 -10 19.023 50 -19.023 19.023 47.642 -30.8774 19.023 40.9271 -40.9271 19.023 30.8774 -47.642 19.023 19.023 -50 19.023 10 -50 19.023 -10 -50 19.023 -19.023 -50 19.023 -30.8774 -47.642 19.023 -40.9271 -40.9271 19.023 -47.642 -30.8774 19.023 -50 -19.023 30.8774 -47.642 -10 30.8774 -47.642 10 30.8774 -47.642 18.4911 30.8774 -45.423 29.6467 30.8774 -39.1039 39.1039 30.8774 -29.6467 45.423 30.8774 -18.4911 47.642 30.8774 -10 47.642 30.8774 10 47.642 30.8774 18.4911 47.642 30.8774 29.6467 45.423 30.8774 39.1039 39.1039 30.8774 45.423 29.6467 30.8774 47.642 18.4911 30.8774 47.642 10 30.8774 47.642 -10 30.8774 47.642 -18.4911 30.8774 45.423 -29.6467 30.8774 39.1039 -39.1039 30.8774 29.6467 -45.423 30.8774 18.4911 -47.642 30.8774 10 -47.642 30.8774 -10 -47.642 30.8774 -18.4911 -47.642 30.8774 -29.6467 -45.423 30.8774 -39.1039 -39.1039 30.8774 -45.423 -29.6467 30.8774 -47.642 -18.4911 40.9271 -40.9271 -10 40.9271 -40.9271 10 40.9271 -40.9271 16.9764 40.9271 -39.1039 26.1419 40.9271 -33.9121 33.9121 40.9271 -26.1419 39.1039 40.9271 -16.9764 40.9271 40.9271 -10 40.9271 40.9271 10 40.9271 40.9271 16.9764 40.9271 40.9271 26.1419 39.1039 40.9271 33.9121 33.9121 40.9271 39.1039 26.1419 40.9271 40.9271 16.9764 40.9271 40.9271 10 40.9271 40.9271 -10 40.9271 40.9271 -16.9764 40.9271 39.1039 -26.1419 40.9271 33.9121 -33.9121 40.9271 26.1419 -39.1039 40.9271 16.9764 -40.9271 40.9271 10 -40.9271 40.9271 -10 -40.9271 40.9271 -16.9764 -40.9271 40.9271 -26.1419 -39.1039 40.9271 -33.9121 -33.9121 40.9271 -39.1039 -26.1419 40.9271 -40.9271 -16.9764 47.642 -30.8774 -10 47.642 -30.8774 10 47.642 -30.8774 14.7094 47.642 -29.6467 20.8966 47.642 -26.1419 26.1419 47.642 -20.8967 29.6467 47.642 -14.7094 30.8774 47.642 -10 30.8774 47.642 10 30.8774 47.642 14.7094 30.8774 47.642 20.8966 29.6467 47.642 26.1419 26.1419 47.642 29.6467 20.8966 47.642 30.8774 14.7094 47.642 30.8774 10 47.642 30.8774 -10 47.642 30.8774 -14.7094 47.642 29.6467 -20.8967 47.642 26.1419 -26.1419 47.642 20.8966 -29.6467 47.642 14.7094 -30.8774 47.642 10 -30.8774 47.642 -10 -30.8774 47.642 -14.7094 -30.8774 47.642 -20.8967 -29.6467 47.642 -26.1419 -26.1419 47.642 -29.6467 -20.8967 47.642 -30.8774 -14.7094 50 -19.023 -10 50 -19.023 10 50 -19.023 12.0354 50 -18.4911 14.7094 50 -16.9764 16.9764 50 -14.7094 18.4911 50 -12.0354 19.023 50 -10 19.023 50 10 19.023 50 12.0354 19.023 50 14.7094 18.4911 50 16.9764 16.9764 50 18.4911 14.7094 50 19.023 12.0354 50 19.023 10 50 19.023 -10 50 19.023 -12.0354 50 18.4911 -14.7094 50 16.9764 -16.9764 50 14.7094 -18.4911 50 12.0354 -19.023 50 10 -19.023 50 -10 -19.023 50 -12.0354 -19.023 50 -14.7094 -18.4911 50 -16.9764 -16.9764 50 -18.4911 -14.7094 50 -19.023 -12.0354 50 -10 -10 50 -10 10 50 10 10 50 10 -10</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-positions-array" count="344" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-normals" name="normal">
+ <float_array id="RoundedCube-normals-array" count="1032">-1 -0.000000 0 -1 -0.000000 0 -1 0.000000 0 -1 0 0 -0.993061 -0.117598 0 -0.996922 -0.078398 0 -0.993227 -0.115947 0.007469 -0.993787 -0.105554 0.035291 -0.992807 -0.084657 0.084657 -0.993787 -0.035292 0.105554 -0.993227 -0.007469 0.115947 -0.993061 0 0.117598 -0.996922 0 0.078398 -0.993227 0.007469 0.115947 -0.993787 0.035291 0.105554 -0.992807 0.084657 0.084657 -0.993787 0.105554 0.035291 -0.993227 0.115947 0.007469 -0.993061 0.117598 0 -0.996922 0.078398 0 -0.993227 0.115947 -0.007469 -0.993787 0.105554 -0.035291 -0.992807 0.084657 -0.084657 -0.993787 0.035291 -0.105554 -0.993227 0.007469 -0.115947 -0.993061 0 -0.117598 -0.996922 0 -0.078398 -0.993227 -0.007469 -0.115947 -0.993787 -0.035291 -0.105554 -0.992807 -0.084657 -0.084657 -0.993787 -0.105555 -0.035291 -0.993227 -0.115947 -0.007469 -0.92388 -0.382683 0 -0.947173 -0.320722 0 -0.925806 -0.376745 0.030759 -0.922055 -0.356058 0.15178 -0.920436 -0.261123 0.290881 -0.931551 -0.127114 0.340669 -0.925806 -0.030759 0.376745 -0.92388 0 0.382683 -0.947173 0 0.320722 -0.925806 0.030759 0.376745 -0.922055 0.15178 0.356058 -0.920436 0.290881 0.261123 -0.931551 0.340669 0.127114 -0.925806 0.376745 0.030759 -0.92388 0.382683 0 -0.947173 0.320722 0 -0.925806 0.376745 -0.030759 -0.922055 0.356058 -0.15178 -0.920436 0.261123 -0.290881 -0.931551 0.127114 -0.340669 -0.925806 0.030759 -0.376745 -0.92388 0 -0.382683 -0.947173 0 -0.320722 -0.925806 -0.030759 -0.376745 -0.922055 -0.15178 -0.356058 -0.920436 -0.290881 -0.261123 -0.931551 -0.340669 -0.127114 -0.925806 -0.376745 -0.030759 -0.707107 -0.707107 0 -0.752339 -0.658776 0 -0.712774 -0.698491 0.063742 -0.682181 -0.676059 0.278518 -0.73611 -0.471849 0.485284 -0.728929 -0.251867 0.636573 -0.712774 -0.063742 0.698491 -0.707107 0 0.707107 -0.752339 0 0.658776 -0.712774 0.063742 0.698491 -0.682181 0.278518 0.676059 -0.73611 0.485284 0.471849 -0.728929 0.636573 0.251867 -0.712775 0.698491 0.063742 -0.707107 0.707107 0 -0.752339 0.658776 0 -0.712775 0.698491 -0.063742 -0.682181 0.676059 -0.278519 -0.73611 0.471849 -0.485284 -0.728929 0.251867 -0.636573 -0.712775 0.063742 -0.698491 -0.707107 0 -0.707107 -0.752339 0 -0.658776 -0.712775 -0.063742 -0.698491 -0.682181 -0.278518 -0.676059 -0.73611 -0.485284 -0.471849 -0.728929 -0.636573 -0.251867 -0.712775 -0.698491 -0.063742 -0.382683 -0.92388 0 -0.442968 -0.896538 0 -0.388497 -0.917276 0.087603 -0.339221 -0.869305 0.359496 -0.410659 -0.640778 0.648662 -0.404562 -0.344312 0.847218 -0.388497 -0.087603 0.917276 -0.382683 0 0.92388 -0.442968 0 0.896538 -0.388497 0.087603 0.917276 -0.339221 0.359496 0.869305 -0.410659 0.648662 0.640778 -0.404562 0.847218 0.344312 -0.388497 0.917276 0.087603 -0.382683 0.92388 0 -0.442968 0.896538 0 -0.388497 0.917276 -0.087603 -0.339221 0.869305 -0.359496 -0.410659 0.640778 -0.648662 -0.404562 0.344312 -0.847218 -0.388497 0.087603 -0.917276 -0.382683 0 -0.92388 -0.442968 0 -0.896538 -0.388497 -0.087603 -0.917276 -0.339221 -0.359496 -0.869305 -0.410659 -0.648662 -0.640778 -0.404562 -0.847218 -0.344312 -0.388497 -0.917276 -0.087603 -0.098017 -0.995185 0 -0.112008 -0.993707 0 -0.100013 -0.986464 0.129944 -0.083619 -0.904647 0.417877 -0.106923 -0.702534 0.703572 -0.105389 -0.379817 0.919039 -0.100066 -0.097179 0.990224 -0.098017 0 0.995185 -0.112008 0 0.993707 -0.100013 0.129944 0.986464 -0.083619 0.417876 0.904648 -0.106923 0.703572 0.702534 -0.105389 0.919039 0.379817 -0.100066 0.990224 0.097178 -0.098017 0.995185 0 -0.112008 0.993707 0 -0.100013 0.986464 -0.129944 -0.083619 0.904647 -0.417877 -0.106923 0.702534 -0.703572 -0.105389 0.379817 -0.919039 -0.100066 0.097179 -0.990224 -0.098017 0 -0.995185 -0.112008 0 -0.993707 -0.100013 -0.129944 -0.986464 -0.083619 -0.417876 -0.904648 -0.106923 -0.703572 -0.702534 -0.105389 -0.919039 -0.379818 -0.100066 -0.990224 -0.097178 0 -1 0 0 -1 0 0 -0.995185 0.098017 0 -0.92388 0.382683 0 -0.707107 0.707107 0 -0.382683 0.92388 0 -0.098017 0.995185 0 0 1 0 0 1 0 0.098017 0.995185 0 0.382683 0.92388 0 0.707107 0.707107 0 0.92388 0.382683 0 0.995185 0.098017 0 1 0 0 1 0 0 0.995185 -0.098017 0 0.92388 -0.382683 0 0.707107 -0.707107 0 0.382683 -0.92388 0 0.098017 -0.995185 0 0 -1 0 0 -1 0 -0.098017 -0.995185 0 -0.382683 -0.92388 0 -0.707107 -0.707107 0 -0.92388 -0.382683 0 -0.995185 -0.098017 0 -1 0 0 -1 0 0 -0.995185 0.098017 0 -0.92388 0.382683 0 -0.707107 0.707107 0 -0.382683 0.92388 0 -0.098017 0.995185 0 0 1 0 0 1 0 0.098017 0.995185 0 0.382683 0.92388 0 0.707107 0.707107 0 0.92388 0.382683 0 0.995185 0.098017 0 1 0 0 1 0 0 0.995185 -0.098017 0 0.92388 -0.382683 0 0.707107 -0.707107 0 0.382683 -0.92388 0 0.098017 -0.995185 0 0 -1 0 0 -1 0 -0.098017 -0.995185 0 -0.382683 -0.92388 0 -0.707107 -0.707107 0 -0.92388 -0.382683 0 -0.995185 -0.098017 0.112008 -0.993707 0 0.098017 -0.995185 0 0.100066 -0.990224 0.097178 0.105389 -0.919039 0.379818 0.106923 -0.703572 0.702534 0.083619 -0.417876 0.904648 0.100013 -0.129944 0.986464 0.112008 0 0.993707 0.098017 0 0.995185 0.100066 0.097179 0.990224 0.105389 0.379817 0.919039 0.106923 0.702534 0.703572 0.083619 0.904647 0.417877 0.100013 0.986465 0.129944 0.112008 0.993707 0 0.098017 0.995185 0 0.100066 0.990224 -0.097178 0.105389 0.919039 -0.379818 0.106923 0.703572 -0.702534 0.083619 0.417876 -0.904648 0.100013 0.129944 -0.986464 0.112008 0 -0.993707 0.098017 0 -0.995185 0.100066 -0.097179 -0.990224 0.105389 -0.379817 -0.919039 0.106923 -0.702534 -0.703572 0.083619 -0.904647 -0.417877 0.100013 -0.986465 -0.129944 0.442968 -0.896538 0 0.382683 -0.92388 0 0.388497 -0.917276 0.087603 0.404562 -0.847218 0.344312 0.410659 -0.648662 0.640778 0.33922 -0.359496 0.869305 0.388497 -0.087603 0.917276 0.442968 0 0.896538 0.382683 0 0.92388 0.388497 0.087603 0.917276 0.404562 0.344312 0.847218 0.410659 0.640778 0.648662 0.339221 0.869305 0.359496 0.388497 0.917276 0.087603 0.442968 0.896538 0 0.382683 0.92388 0 0.388497 0.917276 -0.087603 0.404562 0.847218 -0.344312 0.410659 0.648662 -0.640778 0.339221 0.359496 -0.869305 0.388497 0.087603 -0.917276 0.442968 0 -0.896538 0.382683 0 -0.92388 0.388497 -0.087603 -0.917276 0.404562 -0.344312 -0.847218 0.410659 -0.640778 -0.648662 0.339221 -0.869305 -0.359496 0.388497 -0.917276 -0.087603 0.752339 -0.658776 0 0.707107 -0.707107 0 0.712774 -0.698491 0.063742 0.728929 -0.636573 0.251867 0.73611 -0.485284 0.471849 0.682181 -0.278518 0.676059 0.712775 -0.063742 0.698491 0.752339 0 0.658776 0.707107 0 0.707107 0.712774 0.063742 0.698491 0.728929 0.251867 0.636573 0.73611 0.471849 0.485284 0.682181 0.676059 0.278518 0.712775 0.698491 0.063742 0.752339 0.658776 0 0.707107 0.707107 0 0.712775 0.698491 -0.063742 0.728929 0.636573 -0.251867 0.73611 0.485284 -0.471849 0.682181 0.278518 -0.676059 0.712774 0.063742 -0.698491 0.752339 0 -0.658776 0.707107 0 -0.707107 0.712775 -0.063742 -0.698491 0.728929 -0.251867 -0.636573 0.73611 -0.471849 -0.485284 0.682181 -0.676059 -0.278518 0.712775 -0.698491 -0.063742 0.947173 -0.320722 0 0.92388 -0.382683 0 0.925806 -0.376745 0.030759 0.931551 -0.340669 0.127114 0.920436 -0.290881 0.261123 0.922055 -0.15178 0.356058 0.925806 -0.030759 0.376745 0.947173 0 0.320722 0.92388 0 0.382683 0.925806 0.030759 0.376745 0.931551 0.127114 0.340669 0.920436 0.261123 0.290881 0.922055 0.356058 0.15178 0.925806 0.376745 0.030759 0.947173 0.320722 0 0.92388 0.382683 0 0.925806 0.376745 -0.030759 0.931551 0.340669 -0.127114 0.920436 0.290881 -0.261123 0.922055 0.15178 -0.356058 0.925806 0.030759 -0.376745 0.947173 0 -0.320722 0.92388 0 -0.382683 0.925806 -0.030759 -0.376745 0.931551 -0.127114 -0.340669 0.920436 -0.261123 -0.290881 0.922055 -0.356058 -0.15178 0.925806 -0.376745 -0.030759 0.996922 -0.078398 0 0.993061 -0.117598 0 0.993227 -0.115947 0.007469 0.993787 -0.105554 0.035291 0.992807 -0.084657 0.084657 0.993787 -0.035292 0.105554 0.993227 -0.007469 0.115947 0.996922 0 0.078398 0.993061 0 0.117598 0.993227 0.007469 0.115947 0.993787 0.035291 0.105554 0.992807 0.084656 0.084657 0.993787 0.105554 0.035291 0.993227 0.115947 0.007469 0.996922 0.078398 0 0.993061 0.117598 0 0.993227 0.115947 -0.007469 0.993787 0.105555 -0.035291 0.992807 0.084657 -0.084657 0.993787 0.035291 -0.105554 0.993227 0.007469 -0.115947 0.996922 0 -0.078398 0.993061 0 -0.117598 0.993227 -0.007469 -0.115947 0.993787 -0.035291 -0.105554 0.992807 -0.084657 -0.084657 0.993787 -0.105555 -0.035291 0.993227 -0.115947 -0.007469 1 -0.000000 0 1 -0.000000 0 1 0.000000 0 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-normals-array" count="344" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-Texture" name="Texture">
+ <float_array id="RoundedCube-Texture-array" count="768">0.622169 0.267598 0.647035 0.267598 0.622169 0.377831 0.679703 0.274096 0.707398 0.292602 0.725904 0.320297 0.732402 0.352966 0.732402 0.377831 0.732402 0.622169 0.732402 0.647035 0.622169 0.622169 0.725904 0.679703 0.707398 0.707398 0.679703 0.725904 0.647035 0.732402 0.622169 0.732402 0.377831 0.732402 0.352966 0.732402 0.377831 0.622169 0.320297 0.725904 0.292602 0.707398 0.274096 0.679703 0.267598 0.647035 0.267598 0.622169 0.267598 0.377831 0.267598 0.352966 0.377831 0.377831 0.274096 0.320297 0.292602 0.292602 0.320297 0.274096 0.352966 0.267598 0.377831 0.267598 0.320297 0.274096 0.292602 0.292602 0.267598 0.352966 0.267598 0.377831 0.267598 0.647035 0.267598 0.622169 0.292602 0.707398 0.320297 0.725904 0.647034 0.732402 0.707398 0.707398 0.732402 0.647035 0.732402 0.622169 0.732402 0.352966 0.732402 0.377831 0.707398 0.292602 0.647034 0.267598 0.377831 0.122775 0.622169 0.122775 0.755291 0.137811 0.679703 0.122775 0.819372 0.180628 0.862189 0.244709 0.877225 0.320297 0.877225 0.377831 0.877225 0.679703 0.877225 0.622169 0.819372 0.819372 0.862189 0.755291 0.755291 0.862189 0.679703 0.877225 0.622169 0.877225 0.377831 0.877225 0.244709 0.862189 0.320297 0.877225 0.180628 0.819372 0.137811 0.755291 0.122775 0.679703 0.122775 0.622169 0.122775 0.320297 0.122775 0.377831 0.180628 0.180628 0.137811 0.244709 0.244709 0.137811 0.320297 0.122775 0.377831 0 0.622169 0 0.819372 0.022273 0.707398 0 0.914299 0.085701 0.977727 0.180628 1 0.292602 1 0.377831 1 0.707398 1 0.622169 0.977727 0.819372 0.914299 0.914299 0.819372 0.977727 0.707398 1 0.622169 1 0.377831 1 0.180628 0.977727 0.292602 1 0.085701 0.914299 0.022273 0.819372 0 0.707398 0 0.622169 0 0.292602 0 0.377831 0.022273 0.180628 0.085701 0.085701 0.180628 0.022273 0.292602 0 0 0.377831 0 0.622169 0 0.377831 0.122775 0.862189 0 0.819372 0.122775 0.725904 0 0.707398 0 0.819372 0.122775 0.022273 0.122775 0.137811 0 0.085701 0 0.180628 0 0.085701 0.122775 0.274096 0 0.292602 0 0.377831 0 0.292602 0 0.707398 0 0.622169 0 0.707398 0.122775 0.977727 0 0.819372 0 0.914299 0 0.819372 0.877225 0.862189 0.877225 0.725904 1 0.819372 1 0.707398 1 0.819372 1 0.622169 1 0.377831 1 0.622169 0.877225 0.137811 1 0.180628 0.877225 0.274096 1 0.292602 1 0.180628 0.877225 0.977727 1 0.914299 1 0.819372 1 0.914299 1 0.707398 1 0.622169 1 0.707398 1 0.292602 1 0.377831 1 0.292602 0.877225 0.022273 1 0.180628 1 0.085701 1 0.180628 0 0.180628 0 0.292602 0 0.180628 0.267598 0.877225 0.267598 0.732402 0.267598 0 0.267598 0.122775 0.122775 0.022273 0.122775 0.022273 0.267598 0.267598 0.267598 1 0.732402 0.877225 0.732402 0.732402 0.732402 0.122775 0.732402 0.267598 0.732402 1 0.877225 0.977727 0.877225 0.977727 0.732402 0 0.377831 0 0.267598 0 0.267598 0 0.622169 1 0.732402 1 0.732402 1 0.622169 0 0.377831 0 0.377831 0 0.377831 1 0.622169 1 0.622169 1 0.732402 0.732402 0.732402 0.877225 0.732402 0 0.732402 0.122775 0.622169 0 0.622169 0 0.732402 0.267598 0.732402 1 0.267598 0.877225 0.267598 0.732402 0.267598 0.267598 0.267598 0.122775 0.267598 1 0.377831 1 0.377831 1 0.267598 0 0.732402 0 0.877225 0.022273 0.732402 0 0.267598 1 0.122775 0.977727 0.267598 1 0.877225 0.022273 1 0.085701 0.877225 0.022273 0.122775 0.977727 0 0.914299 0.122775 0.977727 0.622169 0 0.377831 0 0.622169 0 0.180628 0.022273 0.292602 0 0.244709 0.137811 0.320297 0.122775 0.292602 0 0.022273 0.180628 0.085701 0.085701 0.180628 0.180628 0.085701 0.085701 0 0.292602 0 0.377831 0 0.377831 0 0.707398 0 0.622169 0 0.622169 0.085701 0.914299 0.022273 0.819372 0.180628 0.819372 0.022273 0.819372 0.180628 0.977727 0.244709 0.862189 0.292602 1 0.320297 0.877225 0.292602 1 0.377831 1 0.622169 1 0.377831 1 0.819372 0.977727 0.707398 1 0.707398 1 0.977727 0.819372 0.914299 0.914299 0.914299 0.914299 1 0.707398 1 0.622169 1 0.622169 1 0.292602 1 0.377831 1 0.377831 0.914299 0.085701 0.977727 0.180628 0.977727 0.180628 0.819372 0.022273 0.707398 0 0.707398 0 0 0.707398 0 0.622169 0 0.707398 0 0.819372 0 0.914299 0 0.819372 0 0.180628 0 0.292602 0 0.180628 0 0.377831 0 0.622169 0 0.377831 0 0.819372 0 0.707398 0 0.819372 0.877225 0.977727 1 0.914299 1 0.819372 1 0.914299 1 0.707398 1 0.622169 1 0.707398 1 0.292602 1 0.377831 1 0.292602 1 0.180628 1 0.085701 1 0.180628 1 0.819372 1 0.707398 1 0.819372 1 0.622169 1 0.377831 1 0.622169 1 0.180628 1 0.292602 1 0.180628 0.122775 0.022273 0 0.085701 0 0.180628 0 0.085701 0 0.292602 0 0.377831 0 0.292602 0.732402 1 0.877225 0.977727 0.877225 0.977727 0.267598 0 0.122775 0.022273 0.122775 0.022273 0.622169 1 0.732402 1 0.732402 1 0.377831 0 0.267598 0 0.267598 0 0.377831 1 0.622169 1 0.622169 1 0.622169 0 0.377831 0 0.377831 0 0.267598 1 0.377831 1 0.377831 1 0.732402 0 0.622169 0 0.622169 0 0.267598 1 0.122775 0.977727 0.267598 1 0.732402 0 0.877225 0.022273 0.732402 0 0.122775 0.977727 0 0.914299 0.122775 0.977727 0.877225 0.022273 1 0.085701 0.877225 0.022273 0.292602 0 0.377831 0 0.377831 0 0.085701 0.085701 0.180628 0.022273 0.180628 0.022273 0.022273 0.180628 0 0.292602 0 0.292602 0 0.377831 0 0.622169 0 0.377831 0.022273 0.819372 0 0.707398 0 0.707398 0.180628 0.977727 0.085701 0.914299 0.085701 0.914299 0.292602 1 0.377831 1 0.377831 1 0.707398 1 0.622169 1 0.622169 1 0.914299 0.914299 0.819372 0.977727 0.819372 0.977727 0.977727 0.819372 1 0.707398 1 0.707398 1 0.622169 1 0.377831 1 0.622169 0.977727 0.180628 1 0.292602 1 0.292602 0.819372 0.022273 0.914299 0.085701 0.914299 0.085701 0.707398 0 0.622169 0 0.622169 0</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-Texture-array" count="384" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="RoundedCube-vertices">
+ <input semantic="POSITION" source="#RoundedCube-positions"/>
+ <input semantic="NORMAL" source="#RoundedCube-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="684">
+ <input semantic="VERTEX" source="#RoundedCube-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#RoundedCube-Texture" offset="1" set="1"/>
+ <p>5 0 6 1 1 2 6 1 7 3 1 2 7 3 8 4 1 2 8 4 9 5 1 2 9 5 10 6 1 2 10 6 11 7 1 2 12 8 13 9 2 10 13 9 14 11 2 10 14 11 15 12 2 10 15 12 16 13 2 10 16 13 17 14 2 10 17 14 18 15 2 10 19 16 20 17 3 18 20 17 21 19 3 18 21 19 22 20 3 18 22 20 23 21 3 18 23 21 24 22 3 18 24 22 25 23 3 18 26 24 27 25 0 26 27 25 28 27 0 26 28 27 29 28 0 26 29 28 30 29 0 26 30 29 31 30 0 26 31 30 4 31 0 26 341 26 314 30 313 31 341 26 315 32 314 30 341 26 316 33 315 32 341 26 317 27 316 33 341 26 318 34 317 27 341 26 319 35 318 34 342 18 321 36 320 37 342 18 322 21 321 36 342 18 323 38 322 21 342 18 324 39 323 38 342 18 325 17 324 39 342 18 326 16 325 17 343 10 328 40 327 15 343 10 329 13 328 40 343 10 330 41 329 13 343 10 331 11 330 41 343 10 332 42 331 11 343 10 333 43 332 42 340 2 335 44 334 45 340 2 336 5 335 44 340 2 337 46 336 5 340 2 338 3 337 46 340 2 339 47 338 3 340 2 312 0 339 47 4 31 5 0 0 26 1 2 0 26 5 0 18 15 19 16 2 10 3 18 2 10 19 16 32 48 33 49 4 31 5 0 4 31 33 49 35 50 7 3 34 51 6 1 34 51 7 3 36 52 37 53 8 4 9 5 8 4 37 53 38 54 39 55 10 6 11 7 10 6 39 55 41 56 13 9 40 57 12 8 40 57 13 9 43 58 15 12 42 59 14 11 42 59 15 12 44 60 45 61 16 13 17 14 16 13 45 61 46 62 47 63 18 15 19 16 18 15 47 63 49 64 21 19 48 65 20 17 48 65 21 19 50 66 51 67 22 20 23 21 22 20 51 67 52 68 53 69 24 22 25 23 24 22 53 69 55 70 27 25 54 71 26 24 54 71 27 25 57 72 29 28 56 73 28 27 56 73 29 28 58 74 59 75 30 29 31 30 30 29 59 75 60 76 61 77 32 48 33 49 32 48 61 77 63 78 35 50 62 79 34 51 62 79 35 50 64 80 65 81 36 52 37 53 36 52 65 81 66 82 67 83 38 54 39 55 38 54 67 83 69 84 41 56 68 85 40 57 68 85 41 56 70 86 71 87 42 59 43 58 42 59 71 87 72 88 73 89 44 60 45 61 44 60 73 89 74 90 75 91 46 62 47 63 46 62 75 91 77 92 49 64 76 93 48 65 76 93 49 64 78 94 79 95 50 66 51 67 50 66 79 95 80 96 81 97 52 68 53 69 52 68 81 97 83 98 55 70 82 99 54 71 82 99 55 70 84 100 85 101 56 73 57 72 56 73 85 101 86 102 87 103 58 74 59 75 58 74 87 103 88 71 89 69 60 104 61 105 60 106 89 69 91 107 63 108 90 109 62 110 90 109 63 111 92 112 93 113 64 114 65 115 64 116 93 113 94 117 95 71 66 118 67 119 66 120 95 71 97 109 69 121 96 69 68 122 96 69 69 123 98 107 99 124 70 125 71 126 70 127 99 124 100 128 101 129 72 130 73 131 72 132 101 129 102 57 103 55 74 133 75 134 74 135 103 55 105 136 77 137 104 138 76 139 104 138 77 140 106 141 107 128 78 142 79 143 78 144 107 128 108 129 109 57 80 145 81 146 80 147 109 57 111 138 83 148 110 55 82 149 110 55 83 150 112 136 113 151 84 152 85 153 84 154 113 151 114 113 115 117 86 155 87 156 86 157 115 117 116 24 117 23 88 71 89 69 88 71 117 23 119 158 91 107 118 159 90 109 118 159 91 107 120 160 121 161 92 162 93 113 92 163 121 161 122 164 123 24 94 117 95 71 94 117 123 24 125 159 97 109 124 23 96 69 124 23 97 109 126 158 127 165 98 107 99 124 98 107 127 165 128 166 129 167 100 128 101 129 100 128 129 167 130 43 131 45 102 57 103 55 102 57 131 45 133 168 105 136 132 169 104 138 132 169 105 136 134 170 135 166 106 171 107 128 106 172 135 166 136 167 137 43 108 129 109 57 108 129 137 43 139 169 111 138 138 45 110 55 138 45 111 138 140 168 141 173 112 136 113 151 112 136 141 173 142 161 143 164 114 113 115 117 114 113 143 164 144 26 145 18 116 24 117 23 116 24 145 18 146 16 147 63 118 159 119 158 118 159 147 63 148 174 149 48 120 175 121 161 120 176 149 48 150 31 151 26 122 164 123 24 122 164 151 26 152 18 153 16 124 23 125 159 124 23 153 16 154 63 155 91 126 158 127 165 126 158 155 91 156 62 157 15 128 166 129 167 128 166 157 15 158 10 159 2 130 43 131 45 130 43 159 2 160 0 161 49 132 169 133 168 132 169 161 49 162 177 163 62 134 178 135 166 134 179 163 62 164 15 165 10 136 167 137 43 136 167 165 10 166 2 167 0 138 45 139 169 138 45 167 0 168 49 169 77 140 168 141 173 140 168 169 77 170 48 171 31 142 161 143 164 142 161 171 31 172 2 173 10 144 26 145 18 144 26 173 10 174 15 175 62 146 16 147 63 146 16 175 62 176 180 177 49 148 181 149 48 148 182 177 49 178 0 179 2 150 31 151 26 150 31 179 2 180 10 181 15 152 18 153 16 152 18 181 15 182 62 183 90 154 63 155 91 154 63 183 90 184 63 185 16 156 62 157 15 156 62 185 16 186 18 187 26 158 10 159 2 158 10 187 26 188 31 189 48 160 0 161 49 160 0 189 48 190 183 191 63 162 184 163 62 162 185 191 63 192 16 193 18 164 15 165 10 164 15 193 18 194 26 195 31 166 2 167 0 166 2 195 31 196 48 197 76 168 49 169 77 168 49 197 76 198 49 199 0 170 48 171 31 170 48 199 0 200 7 201 8 172 2 173 10 172 2 201 8 202 186 203 187 174 15 175 62 174 15 203 187 204 188 205 189 176 190 177 49 176 191 205 189 206 192 207 7 178 0 179 2 178 0 207 7 208 8 209 186 180 10 181 15 180 10 209 186 210 187 211 193 182 62 183 90 182 62 211 193 212 194 213 195 184 63 185 16 184 63 213 195 214 37 215 35 186 18 187 26 186 18 215 35 216 196 217 197 188 31 189 48 188 31 217 197 218 198 219 194 190 199 191 63 190 200 219 194 220 195 221 37 192 16 193 18 192 16 221 37 222 35 223 196 194 26 195 31 194 26 223 196 224 197 225 201 196 48 197 76 196 48 225 201 226 189 227 192 198 49 199 0 198 49 227 192 228 55 229 57 200 7 201 8 200 7 229 57 230 129 231 128 202 186 203 187 202 186 231 128 205 189 204 202 233 136 232 203 233 136 204 204 206 192 234 138 207 7 235 55 207 7 234 138 209 186 208 8 237 129 236 57 237 129 208 8 211 193 210 187 239 141 238 128 239 141 210 187 241 109 213 195 240 107 212 194 240 107 213 195 242 69 243 71 214 37 215 35 214 37 243 71 244 117 245 113 216 196 217 197 216 196 245 113 219 194 218 205 247 107 246 206 247 107 218 207 220 195 248 109 221 37 249 69 221 37 248 109 223 196 222 35 251 117 250 71 251 117 222 35 225 201 224 197 253 112 252 113 253 112 224 197 255 138 227 192 254 136 226 189 254 136 227 192 256 83 257 85 228 55 229 57 228 55 257 85 231 128 230 129 259 130 258 84 259 130 230 129 233 136 232 208 261 137 260 209 261 137 232 210 234 138 262 82 235 55 263 83 235 55 262 82 237 129 236 57 265 84 264 85 265 84 236 57 239 141 238 128 267 142 266 130 267 142 238 128 240 107 268 108 241 109 269 96 241 109 268 108 270 97 271 99 242 69 243 71 242 69 271 99 245 113 244 117 273 115 272 98 273 115 244 117 247 107 246 211 275 108 274 212 275 108 246 213 248 109 276 96 249 69 277 97 249 69 276 96 251 117 250 71 279 98 278 99 279 98 250 71 253 112 252 113 281 114 280 115 281 114 252 113 254 136 282 137 255 138 283 82 255 138 282 137 284 49 285 48 256 214 257 215 256 216 285 48 259 217 258 218 287 219 286 220 287 219 258 221 261 222 260 223 289 73 288 224 289 73 260 225 262 226 290 70 263 227 291 71 263 228 290 70 265 229 264 230 293 68 292 69 293 68 264 231 267 232 266 233 295 234 294 67 295 234 266 235 268 236 296 237 269 238 297 239 269 240 296 237 298 63 299 62 270 241 271 242 270 243 299 62 273 244 272 245 301 60 300 61 301 60 272 246 275 247 274 248 303 59 302 58 303 59 274 249 276 250 304 56 277 251 305 57 277 252 304 56 279 253 278 254 307 54 306 55 307 54 278 255 281 256 280 257 309 52 308 53 309 52 280 258 282 259 310 50 283 260 311 51 283 261 310 50 312 0 313 31 284 49 285 48 284 49 313 31 287 219 286 220 315 32 314 30 315 32 286 220 288 224 316 33 289 73 317 27 289 73 316 33 290 70 318 34 291 71 319 35 291 71 318 34 293 68 292 69 321 36 320 37 321 36 292 69 295 234 294 67 323 38 322 21 323 38 294 67 296 237 324 39 297 239 325 17 297 239 324 39 326 16 327 15 298 63 299 62 298 63 327 15 301 60 300 61 329 13 328 40 329 13 300 61 302 58 330 41 303 59 331 11 303 59 330 41 304 56 332 42 305 57 333 43 305 57 332 42 307 54 306 55 335 44 334 45 335 44 306 55 309 52 308 53 337 46 336 5 337 46 308 53 310 50 338 3 311 51 339 47 311 51 338 3 340 2 341 26 312 0 313 31 312 0 341 26 342 18 343 10 326 16 327 15 326 16 343 10 340 2 343 10 341 26 342 18 341 26 343 10 0 26 1 2 3 18 2 10 3 18 1 2 11 7 12 8 1 2 2 10 1 2 12 8 25 23 26 24 3 18 0 26 3 18 26 24 34 51 6 1 33 49 5 0 33 49 6 1 36 52 8 4 35 50 7 3 35 50 8 4 37 53 38 54 9 5 10 6 9 5 38 54 39 55 40 57 11 7 12 8 11 7 40 57 42 59 14 11 41 56 13 9 41 56 14 11 43 58 44 60 15 12 16 13 15 12 44 60 45 61 46 62 17 14 18 15 17 14 46 62 48 65 20 17 47 63 19 16 47 63 20 17 50 66 22 20 49 64 21 19 49 64 22 20 51 67 52 68 23 21 24 22 23 21 52 68 53 69 54 71 25 23 26 24 25 23 54 71 56 73 28 27 55 70 27 25 55 70 28 27 57 72 58 74 29 28 30 29 29 28 58 74 59 75 32 48 31 30 4 31 31 30 32 48 62 79 34 51 61 77 33 49 61 77 34 51 63 78 64 80 35 50 36 52 35 50 64 80 65 81 66 82 37 53 38 54 37 53 66 82 67 83 68 85 39 55 40 57 39 55 68 85 70 86 42 59 69 84 41 56 69 84 42 59 71 87 72 88 43 58 44 60 43 58 72 88 73 89 74 90 45 61 46 62 45 61 74 90 76 93 48 65 75 91 47 63 75 91 48 65 77 92 78 94 49 64 50 66 49 64 78 94 79 95 80 96 51 67 52 68 51 67 80 96 81 97 82 99 53 69 54 71 53 69 82 99 84 100 56 73 83 98 55 70 83 98 56 73 85 101 86 102 57 72 58 74 57 72 86 102 87 103 60 76 59 75 32 48 59 75 60 76 90 109 62 262 89 69 61 263 89 69 62 264 91 107 92 124 63 265 64 266 63 267 92 124 93 113 94 117 65 268 66 269 65 270 94 117 95 71 96 69 67 271 68 272 67 273 96 69 98 107 70 274 97 109 69 275 97 109 70 276 99 277 100 128 71 278 72 279 71 280 100 128 101 129 102 57 73 281 74 282 73 283 102 57 104 138 76 284 103 55 75 285 103 55 76 286 105 136 106 151 77 287 78 288 77 289 106 151 107 128 108 129 79 290 80 291 79 292 108 129 109 57 110 55 81 293 82 294 81 295 110 55 112 136 84 296 111 138 83 297 111 138 84 298 113 299 114 113 85 300 86 301 85 302 114 113 115 117 88 71 87 303 60 304 87 305 88 71 118 159 90 109 117 23 89 69 117 23 90 109 119 158 120 165 91 107 92 124 91 107 120 165 121 161 122 164 93 113 94 117 93 113 122 164 123 24 124 23 95 71 96 69 95 71 124 23 126 158 98 107 125 159 97 109 125 159 98 107 127 306 128 166 99 307 100 128 99 308 128 166 129 167 130 43 101 129 102 57 101 129 130 43 132 169 104 138 131 45 103 55 131 45 104 138 133 168 134 173 105 136 106 151 105 136 134 173 135 166 136 167 107 128 108 129 107 128 136 167 137 43 138 45 109 57 110 55 109 57 138 45 140 168 112 136 139 169 111 138 139 169 112 136 141 309 142 161 113 310 114 113 113 311 142 161 143 164 116 24 115 117 88 71 115 117 116 24 145 18 146 16 117 23 118 159 117 23 146 16 147 63 148 91 119 158 120 165 119 158 148 91 149 48 150 31 121 161 122 164 121 161 150 31 151 26 152 18 123 24 124 23 123 24 152 18 153 16 154 63 125 159 126 158 125 159 154 63 155 312 156 62 127 313 128 166 127 314 156 62 157 15 158 10 129 167 130 43 129 167 158 10 159 2 160 0 131 45 132 169 131 45 160 0 161 49 162 77 133 168 134 173 133 168 162 77 163 62 164 15 135 166 136 167 135 166 164 15 165 10 166 2 137 43 138 45 137 43 166 2 167 0 168 49 139 169 140 168 139 169 168 49 169 315 170 48 141 316 142 161 141 317 170 48 171 31 144 26 143 164 116 24 143 164 144 26 173 10 174 15 145 18 146 16 145 18 174 15 175 62 176 90 147 63 148 91 147 63 176 90 177 49 178 0 149 48 150 31 149 48 178 0 179 2 180 10 151 26 152 18 151 26 180 10 181 15 182 62 153 16 154 63 153 16 182 62 183 318 184 63 155 319 156 62 155 320 184 63 185 16 186 18 157 15 158 10 157 15 186 18 187 26 188 31 159 2 160 0 159 2 188 31 189 48 190 76 161 49 162 77 161 49 190 76 191 63 192 16 163 62 164 15 163 62 192 16 193 18 194 26 165 10 166 2 165 10 194 26 195 31 196 48 167 0 168 49 167 0 196 48 197 321 198 49 169 322 170 48 169 323 198 49 199 0 172 2 171 31 144 26 171 31 172 2 201 8 202 186 173 10 174 15 173 10 202 186 203 187 204 193 175 62 176 90 175 62 204 193 205 189 206 192 177 49 178 0 177 49 206 192 207 7 208 8 179 2 180 10 179 2 208 8 209 186 210 187 181 15 182 62 181 15 210 187 211 324 212 194 183 325 184 63 183 326 212 194 213 195 214 37 185 16 186 18 185 16 214 37 215 35 216 196 187 26 188 31 187 26 216 196 217 197 218 201 189 48 190 76 189 48 218 201 219 194 220 195 191 63 192 16 191 63 220 195 221 37 222 35 193 18 194 26 193 18 222 35 223 196 224 197 195 31 196 48 195 31 224 197 225 327 226 189 197 328 198 49 197 329 226 189 227 192 200 7 199 0 172 2 199 0 200 7 202 186 201 8 230 129 229 57 230 129 201 8 204 193 203 187 232 141 231 128 232 141 203 187 234 138 206 192 233 136 205 189 233 136 206 192 235 55 236 57 207 7 208 8 207 7 236 57 237 129 238 128 209 186 210 187 209 186 238 128 212 194 211 330 240 107 239 331 240 107 211 332 213 195 241 109 214 37 242 69 214 37 241 109 216 196 215 35 244 117 243 71 244 117 215 35 218 201 217 197 246 112 245 113 246 112 217 197 248 109 220 195 247 107 219 194 247 107 220 195 249 69 250 71 221 37 222 35 221 37 250 71 251 117 252 113 223 196 224 197 223 196 252 113 226 189 225 333 254 136 253 334 254 136 225 335 227 192 255 138 200 7 228 55 200 7 255 138 230 129 229 57 258 84 257 85 258 84 229 57 232 141 231 128 260 142 259 130 260 142 231 128 233 136 261 137 234 138 262 82 234 138 261 137 263 83 264 85 235 55 236 57 235 55 264 85 238 128 237 129 266 130 265 84 266 130 237 129 240 107 239 336 268 108 267 337 268 108 239 338 241 109 269 96 242 69 270 97 242 69 269 96 244 117 243 71 272 98 271 99 272 98 243 71 246 112 245 113 274 114 273 115 274 114 245 113 247 107 275 108 248 109 276 96 248 109 275 108 277 97 278 99 249 69 250 71 249 69 278 99 252 113 251 117 280 115 279 98 280 115 251 117 254 136 253 339 282 137 281 340 282 137 253 341 255 138 283 82 228 55 256 83 228 55 283 82 258 342 257 343 286 220 285 48 286 220 257 344 260 345 259 346 288 224 287 219 288 224 259 347 261 348 289 73 262 349 290 70 262 350 289 73 291 71 292 69 263 351 264 352 263 353 292 69 266 354 265 355 294 67 293 68 294 67 265 356 268 357 267 358 296 237 295 234 296 237 267 359 269 360 297 239 270 361 298 63 270 362 297 239 272 363 271 364 300 61 299 62 300 61 271 365 274 366 273 367 302 58 301 60 302 58 273 368 275 369 303 59 276 370 304 56 276 371 303 59 305 57 306 55 277 372 278 373 277 374 306 55 280 375 279 376 308 53 307 54 308 53 279 377 282 378 281 379 310 50 309 52 310 50 281 380 283 381 311 51 256 382 284 49 256 383 311 51 286 220 285 48 314 30 313 31 314 30 285 48 288 224 287 219 316 33 315 32 316 33 287 219 289 73 317 27 290 70 318 34 290 70 317 27 319 35 320 37 291 71 292 69 291 71 320 37 294 67 293 68 322 21 321 36 322 21 293 68 295 234 323 38 296 237 324 39 296 237 323 38 297 239 325 17 298 63 326 16 298 63 325 17 300 61 299 62 328 40 327 15 328 40 299 62 302 58 301 60 330 41 329 13 330 41 301 60 303 59 331 11 304 56 332 42 304 56 331 11 333 43 334 45 305 57 306 55 305 57 334 45 308 53 307 54 336 5 335 44 336 5 307 54 309 52 337 46 310 50 338 3 310 50 337 46 311 51 339 47 284 49 312 0 284 49 339 47 341 26 342 18 319 35 320 37 319 35 342 18 343 10 340 2 333 43 334 45 333 43 340 2</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="_RoundedCube" name="RoundedCube" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#RoundedCube">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-5.dae b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-5.dae
new file mode 100644
index 0000000..66c1029
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Cubes/RoundedCube-5.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/cubes/RoundedCube-5.mb</source_data>
+ </contributor>
+ <created>2008-09-19T18:07:45Z</created>
+ <modified>2008-09-19T18:07:45Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="RoundedCube" name="RoundedCube">
+ <mesh>
+ <source id="RoundedCube-positions" name="position">
+ <float_array id="RoundedCube-positions-array" count="1098">-50 -9.56229 1.82875 -50 -9.18378 4.21854 -50 -8.08531 6.37441 -50 -6.37441 8.08532 -50 -4.21854 9.18378 -50 -1.82875 9.56229 -50 1.82875 9.56229 -50 4.21854 9.18378 -50 6.37441 8.08532 -50 8.08532 6.37441 -50 9.18378 4.21854 -50 9.56229 1.82875 -50 9.56229 -1.82875 -50 9.18378 -4.21854 -50 8.08532 -6.37441 -50 6.37441 -8.08531 -50 4.21854 -9.18378 -50 1.82875 -9.56229 -50 -1.82875 -9.56229 -50 -4.21854 -9.18378 -50 -6.37441 -8.08531 -50 -8.08531 -6.37441 -50 -9.18378 -4.21854 -50 -9.56229 -1.82875 -48.0208 -22.0582 4.21854 -48.0208 -21.1851 9.73131 -48.0208 -18.6512 14.7044 -48.0208 -14.7044 18.6512 -48.0208 -9.73131 21.1851 -48.0208 -4.21854 22.0582 -48.0208 4.21854 22.0582 -48.0208 9.73131 21.1851 -48.0208 14.7044 18.6512 -48.0208 18.6512 14.7044 -48.0208 21.1851 9.73131 -48.0208 22.0582 4.21854 -48.0208 22.0582 -4.21854 -48.0208 21.1851 -9.73131 -48.0208 18.6512 -14.7044 -48.0208 14.7044 -18.6512 -48.0208 9.73131 -21.1851 -48.0208 4.21854 -22.0582 -48.0208 -4.21854 -22.0582 -48.0208 -9.73131 -21.1851 -48.0208 -14.7044 -18.6512 -48.0208 -18.6512 -14.7044 -48.0208 -21.1851 -9.73131 -48.0208 -22.0582 -4.21854 -42.2771 -33.331 6.37441 -42.2771 -32.0116 14.7044 -42.2771 -28.1827 22.2191 -42.2771 -22.2191 28.1827 -42.2771 -14.7044 32.0116 -42.2771 -6.37441 33.331 -42.2771 6.37441 33.331 -42.2771 14.7044 32.0116 -42.2771 22.2191 28.1827 -42.2771 28.1827 22.2191 -42.2771 32.0116 14.7044 -42.2771 33.331 6.37441 -42.2771 33.331 -6.37441 -42.2771 32.0116 -14.7044 -42.2771 28.1827 -22.2191 -42.2771 22.2191 -28.1827 -42.2771 14.7044 -32.0116 -42.2771 6.37441 -33.331 -42.2771 -6.37441 -33.331 -42.2771 -14.7044 -32.0116 -42.2771 -22.2191 -28.1827 -42.2771 -28.1827 -22.2191 -42.2771 -32.0116 -14.7044 -42.2771 -33.331 -6.37441 -33.331 -42.2771 8.08532 -33.331 -40.6036 18.6512 -33.331 -35.747 28.1827 -33.331 -28.1827 35.747 -33.331 -18.6512 40.6036 -33.331 -8.08531 42.2771 -33.331 8.08532 42.2771 -33.331 18.6512 40.6036 -33.331 28.1827 35.747 -33.331 35.747 28.1827 -33.331 40.6036 18.6512 -33.331 42.2771 8.08532 -33.331 42.2771 -8.08531 -33.331 40.6036 -18.6512 -33.331 35.747 -28.1827 -33.331 28.1827 -35.747 -33.331 18.6512 -40.6036 -33.331 8.08532 -42.2771 -33.331 -8.08531 -42.2771 -33.331 -18.6512 -40.6036 -33.331 -28.1827 -35.747 -33.331 -35.747 -28.1827 -33.331 -40.6036 -18.6512 -33.331 -42.2771 -8.08531 -22.0582 -48.0208 9.18378 -22.0582 -46.12 21.1851 -22.0582 -40.6036 32.0116 -22.0582 -32.0116 40.6036 -22.0582 -21.1851 46.12 -22.0582 -9.18378 48.0208 -22.0582 9.18378 48.0208 -22.0582 21.1851 46.12 -22.0582 32.0116 40.6036 -22.0582 40.6036 32.0116 -22.0582 46.12 21.1851 -22.0582 48.0208 9.18378 -22.0582 48.0208 -9.18378 -22.0582 46.12 -21.1851 -22.0582 40.6036 -32.0116 -22.0582 32.0116 -40.6036 -22.0582 21.1851 -46.12 -22.0582 9.18378 -48.0208 -22.0582 -9.18378 -48.0208 -22.0582 -21.1851 -46.12 -22.0582 -32.0116 -40.6036 -22.0582 -40.6036 -32.0116 -22.0582 -46.12 -21.1851 -22.0582 -48.0208 -9.18378 -9.56229 -50 9.56229 -9.56229 -48.0208 22.0582 -9.56229 -42.2771 33.331 -9.56229 -33.331 42.2771 -9.56229 -22.0582 48.0208 -9.56229 -9.56229 50 -9.56229 9.56229 50 -9.56229 22.0582 48.0208 -9.56229 33.331 42.2771 -9.56229 42.2771 33.331 -9.56229 48.0208 22.0582 -9.56229 50 9.56229 -9.56229 50 -9.56229 -9.56229 48.0208 -22.0582 -9.56229 42.2771 -33.331 -9.56229 33.331 -42.2771 -9.56229 22.0582 -48.0208 -9.56229 9.56229 -50 -9.56229 -9.56229 -50 -9.56229 -22.0582 -48.0208 -9.56229 -33.331 -42.2771 -9.56229 -42.2771 -33.331 -9.56229 -48.0208 -22.0582 -9.56229 -50 -9.56229 9.56229 -50 9.56229 9.56229 -48.0208 22.0582 9.56229 -42.2771 33.331 9.56229 -33.331 42.2771 9.56229 -22.0582 48.0208 9.56229 -9.56229 50 9.56229 9.56229 50 9.56229 22.0582 48.0208 9.56229 33.331 42.2771 9.56229 42.2771 33.331 9.56229 48.0208 22.0582 9.56229 50 9.56229 9.56229 50 -9.56229 9.56229 48.0208 -22.0582 9.56229 42.2771 -33.331 9.56229 33.331 -42.2771 9.56229 22.0582 -48.0208 9.56229 9.56229 -50 9.56229 -9.56229 -50 9.56229 -22.0582 -48.0208 9.56229 -33.331 -42.2771 9.56229 -42.2771 -33.331 9.56229 -48.0208 -22.0582 9.56229 -50 -9.56229 22.0582 -48.0208 9.18378 22.0582 -46.12 21.1851 22.0582 -40.6036 32.0116 22.0582 -32.0116 40.6036 22.0582 -21.1851 46.12 22.0582 -9.18378 48.0208 22.0582 9.18378 48.0208 22.0582 21.1851 46.12 22.0582 32.0116 40.6036 22.0582 40.6036 32.0116 22.0582 46.12 21.1851 22.0582 48.0208 9.18378 22.0582 48.0208 -9.18378 22.0582 46.12 -21.1851 22.0582 40.6036 -32.0116 22.0582 32.0116 -40.6036 22.0582 21.1851 -46.12 22.0582 9.18378 -48.0208 22.0582 -9.18378 -48.0208 22.0582 -21.1851 -46.12 22.0582 -32.0116 -40.6036 22.0582 -40.6036 -32.0116 22.0582 -46.12 -21.1851 22.0582 -48.0208 -9.18378 33.331 -42.2771 8.08532 33.331 -40.6036 18.6512 33.331 -35.747 28.1827 33.331 -28.1827 35.747 33.331 -18.6512 40.6036 33.331 -8.08531 42.2771 33.331 8.08532 42.2771 33.331 18.6512 40.6036 33.331 28.1827 35.747 33.331 35.747 28.1827 33.331 40.6036 18.6512 33.331 42.2771 8.08532 33.331 42.2771 -8.08531 33.331 40.6036 -18.6512 33.331 35.747 -28.1827 33.331 28.1827 -35.747 33.331 18.6512 -40.6036 33.331 8.08532 -42.2771 33.331 -8.08531 -42.2771 33.331 -18.6512 -40.6036 33.331 -28.1827 -35.747 33.331 -35.747 -28.1827 33.331 -40.6036 -18.6512 33.331 -42.2771 -8.08531 42.2771 -33.331 6.37441 42.2771 -32.0116 14.7044 42.2771 -28.1827 22.2191 42.2771 -22.2191 28.1827 42.2771 -14.7044 32.0116 42.2771 -6.37441 33.331 42.2771 6.37441 33.331 42.2771 14.7044 32.0116 42.2771 22.2191 28.1827 42.2771 28.1827 22.2191 42.2771 32.0116 14.7044 42.2771 33.331 6.37441 42.2771 33.331 -6.37441 42.2771 32.0116 -14.7044 42.2771 28.1827 -22.2191 42.2771 22.2191 -28.1827 42.2771 14.7044 -32.0116 42.2771 6.37441 -33.331 42.2771 -6.37441 -33.331 42.2771 -14.7044 -32.0116 42.2771 -22.2191 -28.1827 42.2771 -28.1827 -22.2191 42.2771 -32.0116 -14.7044 42.2771 -33.331 -6.37441 48.0208 -22.0582 4.21854 48.0208 -21.1851 9.73131 48.0208 -18.6512 14.7044 48.0208 -14.7044 18.6512 48.0208 -9.73131 21.1851 48.0208 -4.21854 22.0582 48.0208 4.21854 22.0582 48.0208 9.73131 21.1851 48.0208 14.7044 18.6512 48.0208 18.6512 14.7044 48.0208 21.1851 9.73131 48.0208 22.0582 4.21854 48.0208 22.0582 -4.21854 48.0208 21.1851 -9.73131 48.0208 18.6512 -14.7044 48.0208 14.7044 -18.6512 48.0208 9.73131 -21.1851 48.0208 4.21854 -22.0582 48.0208 -4.21854 -22.0582 48.0208 -9.73131 -21.1851 48.0208 -14.7044 -18.6512 48.0208 -18.6512 -14.7044 48.0208 -21.1851 -9.73131 48.0208 -22.0582 -4.21854 50 -9.56229 1.82875 50 -9.18378 4.21854 50 -8.08531 6.37441 50 -6.37441 8.08532 50 -4.21854 9.18378 50 -1.82875 9.56229 50 1.82875 9.56229 50 4.21854 9.18378 50 6.37441 8.08532 50 8.08532 6.37441 50 9.18378 4.21854 50 9.56229 1.82875 50 9.56229 -1.82875 50 9.18378 -4.21854 50 8.08532 -6.37441 50 6.37441 -8.08531 50 4.21854 -9.18378 50 1.82875 -9.56229 50 -1.82875 -9.56229 50 -4.21854 -9.18378 50 -6.37441 -8.08531 50 -8.08531 -6.37441 50 -9.18378 -4.21854 50 -9.56229 -1.82875 0 -33.331 -42.2771 0 -42.2771 -33.331 -42.2771 0 -33.331 -33.331 0 -42.2771 -22.0582 0 -48.0208 -9.56229 0 -50 0 0 -50 0 -9.56229 -50 0 -22.0582 -48.0208 9.56229 0 -50 22.0582 0 -48.0208 33.331 0 -42.2771 42.2771 0 -33.331 0 22.0582 -48.0208 0 9.56229 -50 0 42.2771 -33.331 0 33.331 -42.2771 -42.2771 -33.331 0 -33.331 -42.2771 0 -22.0582 -48.0208 0 -9.56229 -50 0 0 -50 0 0 -48.0208 -22.0582 0 -50 -9.56229 9.56229 -50 0 22.0582 -48.0208 0 33.331 -42.2771 0 42.2771 -33.331 0 -50 0 0 -50 -9.56229 0 -50 0 -9.56229 -48.0208 -22.0582 0 -48.0208 0 -22.0582 48.0208 -22.0582 0 48.0208 0 -22.0582 50 -9.56229 0 50 0 -9.56229 50 0 0 -50 9.56229 0 -48.0208 22.0582 0 48.0208 22.0582 0 50 9.56229 0 -42.2771 33.331 0 -33.331 42.2771 0 -22.0582 48.0208 0 -9.56229 50 0 0 50 0 0 50 -9.56229 0 48.0208 -22.0582 9.56229 50 0 22.0582 48.0208 0 33.331 42.2771 0 42.2771 33.331 0 0 -50 9.56229 0 -48.0208 22.0582 -50 0 9.56229 -48.0208 0 22.0582 48.0208 0 22.0582 50 0 9.56229 0 48.0208 22.0582 0 50 9.56229 0 -42.2771 33.331 0 -33.331 42.2771 -42.2771 0 33.331 -33.331 0 42.2771 -22.0582 0 48.0208 -9.56229 0 50 0 -22.0582 48.0208 0 -9.56229 50 0 0 50 9.56229 0 50 22.0582 0 48.0208 33.331 0 42.2771 42.2771 0 33.331 0 9.56229 50 0 22.0582 48.0208 0 33.331 42.2771 0 42.2771 33.331</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-positions-array" count="366" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-normals" name="normal">
+ <float_array id="RoundedCube-normals-array" count="1098">-0.995633 -0.093228 0.004825 -0.9959 -0.087443 0.023157 -0.995253 -0.078789 0.057128 -0.996129 -0.047786 0.073785 -0.9959 -0.023156 0.087443 -0.995633 -0.004825 0.093228 -0.995633 0.004825 0.093228 -0.9959 0.023157 0.087443 -0.995253 0.057127 0.078789 -0.996128 0.073785 0.047787 -0.9959 0.087443 0.023157 -0.995633 0.093228 0.004825 -0.995633 0.093228 -0.004825 -0.9959 0.087443 -0.023157 -0.995253 0.07879 -0.057128 -0.996129 0.047786 -0.073785 -0.9959 0.023159 -0.087443 -0.995633 0.004827 -0.093228 -0.995633 -0.004827 -0.093228 -0.9959 -0.023158 -0.087443 -0.995253 -0.057128 -0.078789 -0.996128 -0.073786 -0.047787 -0.9959 -0.087443 -0.023157 -0.995633 -0.093228 -0.004825 -0.95196 -0.305572 0.019942 -0.954862 -0.284995 0.083767 -0.941486 -0.272843 0.197888 -0.956966 -0.164232 0.239258 -0.954862 -0.083767 0.284995 -0.95196 -0.019942 0.305572 -0.95196 0.019942 0.305572 -0.954862 0.083767 0.284995 -0.941486 0.197888 0.272843 -0.956966 0.239258 0.164232 -0.954862 0.284995 0.083767 -0.95196 0.305572 0.019942 -0.95196 0.305572 -0.019942 -0.954862 0.284995 -0.083767 -0.941486 0.272844 -0.197888 -0.956966 0.164232 -0.239258 -0.954862 0.083767 -0.284995 -0.95196 0.019943 -0.305572 -0.95196 -0.019943 -0.305572 -0.954862 -0.083767 -0.284995 -0.941486 -0.197888 -0.272843 -0.956966 -0.239258 -0.164232 -0.954862 -0.284995 -0.083767 -0.95196 -0.305572 -0.019942 -0.812092 -0.582002 0.04219 -0.80943 -0.55564 0.189967 -0.810428 -0.461046 0.361445 -0.827886 -0.323952 0.457885 -0.821536 -0.168789 0.544599 -0.812092 -0.04219 0.582002 -0.812092 0.04219 0.582002 -0.80943 0.189967 0.55564 -0.810429 0.361445 0.461046 -0.827886 0.457885 0.323952 -0.821537 0.544599 0.168789 -0.812092 0.582002 0.04219 -0.812092 0.582002 -0.04219 -0.80943 0.55564 -0.189967 -0.810428 0.461046 -0.361445 -0.827886 0.323952 -0.457885 -0.821537 0.168788 -0.544599 -0.812092 0.042189 -0.582002 -0.812092 -0.042189 -0.582002 -0.80943 -0.189967 -0.55564 -0.810428 -0.361445 -0.461046 -0.827886 -0.457885 -0.323952 -0.821536 -0.544599 -0.168789 -0.812092 -0.582002 -0.04219 -0.592275 -0.803455 0.060577 -0.562273 -0.786704 0.254843 -0.614617 -0.63529 0.467602 -0.614748 -0.459184 0.641276 -0.605902 -0.240241 0.758398 -0.592275 -0.060577 0.803455 -0.592275 0.060577 0.803455 -0.562274 0.254843 0.786704 -0.614617 0.467602 0.63529 -0.614748 0.641276 0.459184 -0.605902 0.758398 0.240241 -0.592275 0.803455 0.060577 -0.592275 0.803455 -0.060577 -0.562274 0.786704 -0.254843 -0.614617 0.63529 -0.467602 -0.614748 0.459184 -0.641276 -0.605902 0.240241 -0.758398 -0.592275 0.060577 -0.803455 -0.592275 -0.060577 -0.803455 -0.562273 -0.254843 -0.786704 -0.614617 -0.467602 -0.63529 -0.614748 -0.641276 -0.459184 -0.605902 -0.758398 -0.240241 -0.592275 -0.803455 -0.060577 -0.312566 -0.947075 0.073156 -0.269894 -0.915838 0.297319 -0.328823 -0.762415 0.557314 -0.329327 -0.552594 0.765626 -0.323021 -0.289533 0.901015 -0.312565 -0.073156 0.947075 -0.312565 0.073156 0.947075 -0.269894 0.297319 0.915837 -0.328822 0.557314 0.762416 -0.329327 0.765626 0.552594 -0.323022 0.901015 0.289533 -0.312565 0.947075 0.073156 -0.312565 0.947075 -0.073156 -0.269894 0.915838 -0.297319 -0.328822 0.762416 -0.557314 -0.329327 0.552594 -0.765627 -0.323022 0.289533 -0.901015 -0.312565 0.073156 -0.947075 -0.312565 -0.073156 -0.947075 -0.269894 -0.297319 -0.915838 -0.328823 -0.557314 -0.762416 -0.329327 -0.765626 -0.552594 -0.323022 -0.901015 -0.289534 -0.312566 -0.947075 -0.073156 -0.079579 -0.991364 0.104237 -0.065797 -0.938711 0.338368 -0.084134 -0.80594 0.585988 -0.084477 -0.585376 0.806349 -0.082795 -0.307587 0.947911 -0.079606 -0.078037 0.993767 -0.079579 0.104237 0.991364 -0.065797 0.338368 0.938711 -0.084134 0.585988 0.80594 -0.084477 0.806349 0.585376 -0.082795 0.947911 0.307587 -0.079606 0.993767 0.078037 -0.079579 0.991364 -0.104237 -0.065797 0.938711 -0.338368 -0.084134 0.80594 -0.585988 -0.084477 0.585376 -0.806349 -0.082795 0.307587 -0.947911 -0.079606 0.078037 -0.993767 -0.079579 -0.104237 -0.991364 -0.065797 -0.338368 -0.938711 -0.084134 -0.585988 -0.805941 -0.084477 -0.806349 -0.585376 -0.082795 -0.947911 -0.307587 -0.079606 -0.993767 -0.078037 0.079606 -0.993767 0.078037 0.082795 -0.947911 0.307587 0.084477 -0.806349 0.585376 0.084134 -0.585988 0.80594 0.065797 -0.338368 0.938711 0.079579 -0.104237 0.991364 0.079606 0.078037 0.993767 0.082795 0.307587 0.947911 0.084477 0.585376 0.806349 0.084134 0.80594 0.585988 0.065797 0.938711 0.338368 0.079579 0.991364 0.104237 0.079606 0.993767 -0.078037 0.082795 0.947911 -0.307587 0.084477 0.806349 -0.585376 0.084134 0.585988 -0.80594 0.065797 0.338368 -0.938711 0.079579 0.104237 -0.991364 0.079606 -0.078037 -0.993767 0.082795 -0.307587 -0.947911 0.084477 -0.585376 -0.806349 0.084134 -0.805941 -0.585987 0.065797 -0.938711 -0.338368 0.079579 -0.991364 -0.104237 0.312566 -0.947075 0.073156 0.323022 -0.901015 0.289533 0.329327 -0.765626 0.552594 0.328822 -0.557314 0.762416 0.269894 -0.297319 0.915837 0.312565 -0.073156 0.947075 0.312565 0.073156 0.947075 0.323022 0.289534 0.901015 0.329327 0.552594 0.765626 0.328823 0.762416 0.557314 0.269894 0.915837 0.297319 0.312565 0.947075 0.073156 0.312565 0.947075 -0.073156 0.323022 0.901015 -0.289533 0.329327 0.765627 -0.552594 0.328822 0.557314 -0.762415 0.269894 0.297319 -0.915838 0.312565 0.073156 -0.947075 0.312566 -0.073156 -0.947075 0.323022 -0.289533 -0.901015 0.329327 -0.552594 -0.765627 0.328823 -0.762415 -0.557314 0.269894 -0.915838 -0.297319 0.312566 -0.947075 -0.073156 0.592275 -0.803455 0.060577 0.605902 -0.758398 0.240241 0.614748 -0.641276 0.459184 0.614617 -0.467602 0.63529 0.562273 -0.254843 0.786704 0.592275 -0.060577 0.803455 0.592275 0.060577 0.803455 0.605902 0.240241 0.758398 0.614748 0.459184 0.641276 0.614617 0.63529 0.467602 0.562274 0.786704 0.254843 0.592275 0.803455 0.060577 0.592275 0.803455 -0.060577 0.605902 0.758398 -0.240241 0.614748 0.641276 -0.459184 0.614617 0.467602 -0.635291 0.562274 0.254843 -0.786704 0.592275 0.060577 -0.803455 0.592275 -0.060577 -0.803455 0.605902 -0.240241 -0.758398 0.614748 -0.459184 -0.641276 0.614617 -0.63529 -0.467602 0.562274 -0.786704 -0.254843 0.592275 -0.803455 -0.060577 0.812092 -0.582002 0.04219 0.821536 -0.544599 0.168789 0.827886 -0.457885 0.323953 0.810428 -0.361445 0.461046 0.80943 -0.189967 0.55564 0.812092 -0.04219 0.582002 0.812092 0.04219 0.582002 0.821536 0.168789 0.544599 0.827886 0.323953 0.457885 0.810428 0.461046 0.361445 0.80943 0.55564 0.189967 0.812092 0.582002 0.04219 0.812092 0.582002 -0.04219 0.821536 0.544599 -0.168789 0.827886 0.457885 -0.323953 0.810428 0.361445 -0.461046 0.80943 0.189967 -0.55564 0.812092 0.04219 -0.582002 0.812092 -0.042189 -0.582002 0.821536 -0.168788 -0.544599 0.827886 -0.323953 -0.457885 0.810428 -0.461046 -0.361445 0.80943 -0.55564 -0.189967 0.812092 -0.582002 -0.04219 0.95196 -0.305572 0.019942 0.954862 -0.284995 0.083767 0.956966 -0.239258 0.164232 0.941486 -0.197888 0.272844 0.954862 -0.083767 0.284995 0.95196 -0.019942 0.305572 0.95196 0.019942 0.305572 0.954862 0.083767 0.284995 0.956966 0.164232 0.239258 0.941486 0.272843 0.197888 0.954862 0.284995 0.083767 0.95196 0.305572 0.019942 0.95196 0.305572 -0.019942 0.954862 0.284995 -0.083767 0.956966 0.239258 -0.164232 0.941486 0.197888 -0.272843 0.954862 0.083767 -0.284995 0.95196 0.019942 -0.305572 0.95196 -0.019942 -0.305572 0.954862 -0.083767 -0.284995 0.956966 -0.164232 -0.239258 0.941486 -0.272844 -0.197888 0.954862 -0.284995 -0.083767 0.95196 -0.305572 -0.019942 0.995633 -0.093228 0.004825 0.9959 -0.087442 0.023157 0.996129 -0.073785 0.047786 0.995253 -0.057128 0.078789 0.9959 -0.023157 0.087443 0.995633 -0.004825 0.093228 0.995633 0.004825 0.093228 0.9959 0.023156 0.087443 0.996128 0.047786 0.073785 0.995253 0.078789 0.057128 0.9959 0.087443 0.023157 0.995633 0.093228 0.004825 0.995633 0.093228 -0.004825 0.9959 0.087442 -0.023157 0.996129 0.073786 -0.047787 0.995253 0.057128 -0.078789 0.9959 0.023157 -0.087443 0.995633 0.004826 -0.093228 0.995633 -0.004826 -0.093228 0.9959 -0.023158 -0.087443 0.996129 -0.047786 -0.073785 0.995253 -0.078789 -0.057128 0.9959 -0.087442 -0.023157 0.995633 -0.093228 -0.004825 0 -0.587785 -0.809017 0 -0.809017 -0.587785 -0.838881 0 -0.544315 -0.62962 0 -0.776903 -0.358728 0 -0.933442 -0.089662 0 -0.995972 0 0 -1 0 -0.078459 -0.996917 0 -0.309017 -0.951056 0.089662 0 -0.995972 0.358728 0 -0.933442 0.62962 0 -0.776903 0.838881 0 -0.544315 0 0.309017 -0.951056 0 0.078459 -0.996917 0 0.809017 -0.587785 0 0.587785 -0.809017 -0.838881 -0.544315 0 -0.62962 -0.776903 0 -0.358728 -0.933442 0 -0.089661 -0.995972 0 0 -1 0 0 -0.951056 -0.309017 0 -0.996917 -0.078459 0.089661 -0.995972 0 0.358728 -0.933442 0 0.62962 -0.776903 0 0.838881 -0.544315 0 -1 0 0 -0.996917 -0.078459 0 -0.996917 0 -0.078459 -0.966026 -0.258446 0 -0.966026 0 -0.258446 0.966026 -0.258446 0 0.966026 0 -0.258446 0.996917 -0.078459 0 0.996917 0 -0.078459 1 0 0 -0.996917 0.078459 0 -0.966026 0.258446 0 0.966026 0.258446 0 0.996917 0.078459 0 -0.838881 0.544315 0 -0.62962 0.776903 0 -0.358728 0.933442 0 -0.089661 0.995972 0 0 1 0 0 0.996917 -0.078459 0 0.951056 -0.309017 0.089661 0.995972 0 0.358728 0.933442 0 0.62962 0.776903 0 0.838881 0.544315 0 0 -0.996917 0.078459 0 -0.951057 0.309017 -0.996917 0 0.078459 -0.966026 0 0.258446 0.966026 0 0.258446 0.996917 0 0.078459 0 0.951056 0.309017 0 0.996917 0.078458 0 -0.809017 0.587785 0 -0.587785 0.809017 -0.838881 0 0.544315 -0.62962 0 0.776903 -0.358728 0 0.933442 -0.089661 0 0.995972 0 -0.309017 0.951056 0 -0.078459 0.996917 0 0 1 0.089661 0 0.995972 0.358728 0 0.933442 0.62962 0 0.776903 0.838881 0 0.544315 0 0.078459 0.996917 0 0.309017 0.951056 0 0.587785 0.809017 0 0.809017 0.587785</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-normals-array" count="366" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="RoundedCube-Texture" name="Texture">
+ <float_array id="RoundedCube-Texture-array" count="818">0.5 0.404377 0.518287 0.404377 0.5 0.5 0.542185 0.408162 0.563744 0.419147 0.580853 0.436256 0.591838 0.457815 0.595623 0.481713 0.595623 0.5 0.595623 0.518287 0.591838 0.542185 0.580853 0.563744 0.563744 0.580853 0.542185 0.591838 0.518287 0.595623 0.5 0.595623 0.481713 0.595623 0.457815 0.591838 0.436256 0.580853 0.419147 0.563744 0.408162 0.542185 0.404377 0.518287 0.404377 0.5 0.404377 0.481713 0.408162 0.457815 0.419147 0.436256 0.436256 0.419147 0.457815 0.408162 0.481713 0.404377 0.436256 0.419147 0.419147 0.436256 0.419147 0.563744 0.436256 0.580853 0.597313 0.288149 0.542185 0.279418 0.647044 0.313488 0.686512 0.352956 0.711851 0.402687 0.720582 0.457815 0.686512 0.647044 0.711851 0.597313 0.647044 0.686512 0.597313 0.711851 0.402687 0.711851 0.457815 0.720582 0.352956 0.686512 0.313488 0.647044 0.288149 0.597313 0.279418 0.542185 0.313488 0.352956 0.288149 0.402687 0.352956 0.313488 0.402687 0.288149 0.647044 0.179884 0.563744 0.16669 0.722191 0.218173 0.781827 0.277809 0.820116 0.352956 0.83331 0.436256 0.781827 0.722191 0.820116 0.647044 0.722191 0.781827 0.647044 0.820116 0.352956 0.820116 0.436256 0.83331 0.277809 0.781827 0.218173 0.722191 0.179884 0.647044 0.16669 0.563744 0.218173 0.277809 0.179884 0.352956 0.277809 0.218173 0.352956 0.179884 0.686512 0.093963 0.580853 0.077229 0.580853 0.077229 0.781827 0.14253 0.85747 0.218173 0.906036 0.313488 0.922771 0.419147 0.906036 0.686512 0.85747 0.781827 0.781827 0.85747 0.686512 0.906036 0.313488 0.906036 0.419147 0.922771 0.218173 0.85747 0.14253 0.781827 0.093963 0.686512 0.077229 0.580853 0.093963 0.313488 0.14253 0.218173 0.218173 0.14253 0.313488 0.093963 0.279418 0.711851 0.16669 0.686512 0.279418 0.591838 0.16669 0.580853 0.16669 0.686512 0.279418 0.820116 0.279418 0.906036 0.16669 0.781827 0.16669 0.85747 0.16669 0.781827 0.279418 0.288149 0.279418 0.408162 0.16669 0.313488 0.16669 0.419147 0.16669 0.313488 0.16669 0.686512 0.16669 0.781827 0.16669 0.686512 0.720582 0.820116 0.720582 0.711851 0.83331 0.781827 0.83331 0.686512 0.83331 0.781827 0.720582 0.288149 0.83331 0.313488 0.720582 0.408162 0.83331 0.419147 0.83331 0.313488 0.720582 0.906036 0.83331 0.85747 0.83331 0.781827 0.83331 0.85747 0.720582 0.591838 0.83331 0.686512 0.83331 0.580853 0.83331 0.686512 0.720582 0.179884 0.83331 0.313488 0.83331 0.218173 0.83331 0.313488 0.279418 0.179884 0.16669 0.218173 0.16669 0.313488 0.16669 0.218173 0.404377 0.720582 0.404377 0.595623 0.404377 0.83331 0.404377 0.922771 0.404377 0.279418 0.404377 0.404377 0.595623 0.83331 0.595623 0.720582 0.720582 0.820116 0.720582 0.820116 0.595623 0.279418 0.595623 0.404377 0.595623 0.922771 0.720582 0.906036 0.720582 0.906036 0.595623 0.595623 0.595623 0.16669 0.404377 0.16669 0.279418 0.179884 0.279418 0.179884 0.404377 0.83331 0.279418 0.820116 0.404377 0.83331 0.404377 0.922771 0.279418 0.906036 0.404377 0.922771 0.595623 0.16669 0.720582 0.179884 0.595623 0.16669 0.279418 0.820116 0.16669 0.686512 0.16669 0.781827 0.279418 0.820116 0.16669 0.313488 0.16669 0.419147 0.279418 0.906036 0.16669 0.85747 0.279418 0.906036 0.16669 0.580853 0.16669 0.218173 0.720582 0.179884 0.83331 0.218173 0.720582 0.179884 0.313488 0.093963 0.419147 0.077229 0.436256 0.16669 0.419147 0.077229 0.14253 0.218173 0.218173 0.14253 0.277809 0.218173 0.218173 0.14253 0.093963 0.313488 0.179884 0.352956 0.077229 0.419147 0.16669 0.436256 0.077229 0.419147 0.14253 0.781827 0.093963 0.686512 0.179884 0.647044 0.093963 0.686512 0.313488 0.906036 0.218173 0.85747 0.277809 0.781827 0.218173 0.85747 0.686512 0.906036 0.580853 0.922771 0.563744 0.83331 0.580853 0.922771 0.85747 0.781827 0.781827 0.85747 0.781827 0.85747 0.906036 0.686512 0.922771 0.580853 0.83331 0.563744 0.922771 0.580853 0.85747 0.218173 0.906036 0.313488 0.906036 0.313488 0.686512 0.093963 0.781827 0.14253 0.781827 0.14253 0.436256 0.16669 0.457815 0.279418 0.436256 0.16669 0.279418 0.457815 0.563744 0.83331 0.542185 0.720582 0.563744 0.83331 0.720582 0.542185 0.5 0.279418 0.720582 0.5 0.5 0.720582 0.279418 0.5 0.5 0.16669 0.83331 0.5 0.5 0.83331 0.16669 0.436256 0.16669 0.5 0.077229 0.563744 0.077229 0.5 0.077229 0.563744 0.922771 0.5 0.5 0.922771 0.922771 0.436256 0.922771 0.5 0.922771 0.436256 0.16669 0.580853 0.16669 0.5 0.16669 0.580853 0.83331 0.419147 0.83331 0.5 0.83331 0.419147 0.5 0.16669 0.404377 0.16669 0.404377 0.16669 0.5 0.077229 0.595623 0.077229 0.595623 0.16669 0.5 0.16669 0.5 0.16669 0.404377 0.077229 0.16669 0.5 0.922771 0.563744 0.077229 0.436256 0.436256 0.16669 0.5 0.16669 0.5 0.16669 0.16669 0.563744 0.16669 0.5 0.16669 0.5 0.563744 0.83331 0.5 0.83331 0.5 0.83331 0.83331 0.436256 0.83331 0.5 0.83331 0.5 0.436256 0.16669 0.077229 0.419147 0.077229 0.419147 0.419147 0.077229 0.16669 0.686512 0.16669 0.781827 0.16669 0.686512 0.279418 0.179884 0.16669 0.218173 0.16669 0.313488 0.16669 0.218173 0.16669 0.686512 0.16669 0.580853 0.16669 0.686512 0.16669 0.781827 0.16669 0.85747 0.16669 0.781827 0.83331 0.686512 0.83331 0.580853 0.83331 0.686512 0.83331 0.313488 0.83331 0.218173 0.83331 0.313488 0.83331 0.781827 0.83331 0.686512 0.83331 0.781827 0.83331 0.313488 0.83331 0.313488 0.720582 0.093963 0.83331 0.218173 0.83331 0.14253 0.83331 0.218173 0.16669 0.313488 0.16669 0.419147 0.16669 0.313488 0.404377 0.16669 0.279418 0.179884 0.279418 0.179884 0.595623 0.16669 0.720582 0.179884 0.595623 0.16669 0.279418 0.093963 0.720582 0.179884 0.83331 0.218173 0.720582 0.179884 0.16669 0.14253 0.218173 0.14253 0.313488 0.093963 0.313488 0.093963 0.093963 0.313488 0.14253 0.218173 0.14253 0.218173 0.093963 0.686512 0.077229 0.580853 0.16669 0.563744 0.077229 0.580853 0.218173 0.85747 0.14253 0.781827 0.14253 0.781827 0.313488 0.906036 0.419147 0.922771 0.436256 0.83331 0.419147 0.922771 0.781827 0.85747 0.686512 0.906036 0.686512 0.906036 0.906036 0.686512 0.85747 0.781827 0.85747 0.781827 0.906036 0.313488 0.922771 0.419147 0.83331 0.436256 0.922771 0.419147 0.781827 0.14253 0.85747 0.218173 0.85747 0.218173 0.686512 0.093963 0.580853 0.077229 0.580853 0.077229 0.16669 0.563744 0.16669 0.563744 0.83331 0.436256 0.83331 0.436256 0.83331 0.580853 0.922771 0.563744 0.922771 0.5 0.922771 0.563744 0.16669 0.419147 0.077229 0.436256 0.077229 0.5 0.077229 0.436256 0.16669 0.419147 0.16669 0.5 0.16669 0.419147 0.83331 0.580853 0.83331 0.5 0.83331 0.580853 0.83331 0.580853 0.83331 0.580853 0.16669 0.419147 0.16669 0.419147 0.5 0.83331 0.595623 0.83331 0.595623 0.83331 0.5 0.922771 0.595623 0.922771 0.595623 0.922771 0.5 0.16669 0.404377 0.16669 0.404377 0.16669 0.404377 0.83331 0.5 0.83331 0.5 0.83331 0.404377 0.922771 0.5 0.922771 0.5 0.922771 0.595623 0.16669 0.5 0.16669 0.5 0.16669 0.922771 0.436256 0.922771 0.436256 0.077229 0.563744 0.077229 0.563744 0.077229 0.563744 0.077229 0.563744 0.922771 0.436256 0.922771 0.436256 0.16669 0.5 0.16669 0.5 0.5 0.83331 0.5 0.83331 0.83331 0.5 0.83331 0.5 0.5 0.16669 0.5 0.16669</float_array>
+ <technique_common>
+ <accessor source="#RoundedCube-Texture-array" count="409" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="RoundedCube-vertices">
+ <input semantic="POSITION" source="#RoundedCube-positions"/>
+ <input semantic="NORMAL" source="#RoundedCube-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="728">
+ <input semantic="VERTEX" source="#RoundedCube-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#RoundedCube-Texture" offset="1" set="1"/>
+ <p>317 0 0 1 316 2 0 1 1 3 316 2 1 3 2 4 316 2 2 4 3 5 316 2 3 5 4 6 316 2 4 6 5 7 316 2 5 7 343 8 316 2 343 8 6 9 316 2 6 9 7 10 316 2 7 10 8 11 316 2 8 11 9 12 316 2 9 12 10 13 316 2 10 13 11 14 316 2 11 14 326 15 316 2 326 15 12 16 316 2 12 16 13 17 316 2 13 17 14 18 316 2 14 18 15 19 316 2 15 19 16 20 316 2 16 20 17 21 316 2 17 21 318 22 316 2 318 22 18 23 316 2 18 23 19 24 316 2 19 24 20 25 316 2 20 25 21 26 316 2 21 26 22 27 316 2 22 27 23 28 316 2 23 28 317 0 316 2 325 2 264 28 323 0 325 2 265 27 264 28 325 2 266 29 265 27 325 2 267 30 266 29 325 2 268 24 267 30 325 2 269 23 268 24 325 2 346 22 269 23 325 2 270 21 346 22 325 2 271 20 270 21 325 2 272 31 271 20 325 2 273 32 272 31 325 2 274 17 273 32 325 2 275 16 274 17 325 2 329 15 275 16 325 2 276 14 329 15 325 2 277 13 276 14 325 2 278 12 277 13 325 2 279 11 278 12 325 2 280 10 279 11 325 2 281 9 280 10 325 2 324 8 281 9 325 2 282 7 324 8 325 2 283 6 282 7 325 2 284 5 283 6 325 2 285 4 284 5 325 2 286 3 285 4 325 2 287 1 286 3 325 2 323 0 287 1 25 33 1 3 24 34 0 1 24 34 1 3 26 35 27 36 2 4 3 5 2 4 27 36 28 37 29 38 4 6 5 7 4 6 29 38 32 39 8 11 31 40 7 10 31 40 8 11 33 41 34 42 9 12 10 13 9 12 34 42 37 43 13 17 36 44 12 16 36 44 13 17 38 45 39 46 14 18 15 19 14 18 39 46 40 47 41 48 16 20 17 21 16 20 41 48 44 49 20 25 43 50 19 24 43 50 20 25 45 51 46 52 21 26 22 27 21 26 46 52 49 53 25 33 48 54 24 34 48 54 25 33 50 55 51 56 26 35 27 36 26 35 51 56 52 57 53 58 28 37 29 38 28 37 53 58 56 59 32 39 55 60 31 40 55 60 32 39 57 61 58 62 33 41 34 42 33 41 58 62 61 63 37 43 60 64 36 44 60 64 37 43 62 65 63 66 38 45 39 46 38 45 63 66 64 67 65 68 40 47 41 48 40 47 65 68 68 69 44 49 67 70 43 50 67 70 44 49 69 71 70 72 45 51 46 52 45 51 70 72 73 73 49 53 72 74 48 54 72 75 49 53 74 76 75 77 50 55 51 56 50 55 75 77 76 78 77 79 52 57 53 58 52 57 77 79 79 80 80 81 55 60 56 59 55 60 80 81 81 82 82 83 57 61 58 62 57 61 82 83 85 84 61 63 84 85 60 64 84 85 61 63 86 86 87 87 62 65 63 66 62 65 87 87 88 88 89 89 64 67 65 68 64 67 89 89 91 90 92 91 67 70 68 69 67 70 92 91 93 92 94 93 69 71 70 72 69 71 94 93 97 94 73 95 96 96 72 97 96 96 73 98 98 99 99 100 74 101 75 102 74 103 99 100 100 104 101 105 76 106 77 107 76 108 101 105 103 94 104 99 79 109 80 110 79 111 104 99 105 112 106 113 81 114 82 115 81 116 106 113 109 117 85 118 108 119 84 120 108 119 85 121 110 122 111 112 86 123 87 124 86 125 111 112 112 113 113 126 88 127 89 128 88 129 113 126 115 117 116 130 91 131 92 132 91 133 116 130 117 134 118 104 93 135 94 136 93 137 118 104 121 138 97 94 120 139 96 96 120 139 97 94 122 140 123 141 98 99 99 100 98 99 123 141 124 142 125 143 100 104 101 105 100 104 125 143 127 138 128 140 103 94 104 99 103 94 128 140 129 144 130 145 105 146 106 113 105 147 130 145 133 148 109 117 132 149 108 119 132 149 109 117 134 150 135 144 110 151 111 112 110 152 135 144 136 145 137 153 112 113 113 126 112 113 137 153 139 148 140 154 115 117 116 130 115 117 140 154 141 155 142 142 117 156 118 104 117 157 142 142 168 126 169 113 144 153 145 145 144 153 169 113 147 150 146 144 171 122 170 112 171 122 146 144 173 119 149 149 172 117 148 148 172 117 149 149 152 144 151 145 176 112 175 113 176 112 151 145 154 138 153 158 178 94 177 159 178 94 153 160 180 105 181 104 156 143 157 142 156 143 181 104 159 140 158 161 183 99 182 162 183 99 158 163 185 96 161 139 184 94 160 138 184 94 161 139 164 155 163 142 188 134 187 104 188 134 163 142 166 148 165 164 190 117 189 165 190 117 165 166 169 113 168 126 193 115 192 128 193 115 168 126 171 122 170 112 195 123 194 114 195 123 170 112 172 117 196 118 173 119 197 120 173 119 196 118 176 112 175 113 200 114 199 115 200 114 175 113 178 94 177 167 202 168 201 169 202 168 177 170 181 104 180 105 205 171 204 172 205 171 180 105 183 99 182 173 207 169 206 174 207 169 182 175 184 94 208 168 185 96 209 176 185 96 208 168 188 134 187 104 212 177 211 171 212 177 187 104 190 117 189 178 214 118 213 179 214 118 189 180 193 181 192 182 217 72 216 183 217 72 192 184 195 185 194 186 219 69 218 187 219 69 194 188 196 189 220 190 197 191 221 192 197 193 220 190 200 194 199 195 224 66 223 196 224 66 199 197 202 198 201 199 226 63 225 200 226 63 201 201 205 202 204 203 229 62 228 204 229 62 204 205 207 206 206 207 231 59 230 61 231 59 206 208 208 209 232 60 209 210 233 211 209 212 232 60 212 213 211 214 236 56 235 57 236 56 211 215 214 216 213 217 238 53 237 55 238 53 213 218 217 72 216 219 241 52 240 220 241 52 216 221 219 69 218 187 243 49 242 51 243 49 218 187 220 190 244 50 221 192 245 222 221 192 244 50 224 66 223 196 248 46 247 47 248 46 223 196 225 200 249 45 226 63 250 43 226 63 249 45 229 62 228 223 253 42 252 224 253 42 228 225 231 59 230 61 255 39 254 41 255 39 230 61 232 60 256 40 233 211 257 226 233 211 256 40 236 56 235 57 260 36 259 37 260 36 235 57 237 55 261 35 238 53 262 33 238 53 261 35 241 52 240 220 265 27 264 28 265 27 240 220 243 49 242 51 267 30 266 29 267 30 242 51 244 50 268 24 245 222 269 23 245 222 268 24 248 46 247 47 272 31 271 20 272 31 247 47 249 45 273 32 250 43 274 17 250 43 273 32 253 42 252 224 277 13 276 14 277 13 252 224 255 39 254 41 279 11 278 12 279 11 254 41 256 40 280 10 257 226 281 9 257 226 280 10 260 36 259 37 284 5 283 6 284 5 259 37 261 35 285 4 262 33 286 3 262 33 285 4 24 34 0 1 319 227 317 0 319 227 0 1 30 226 6 9 344 228 343 8 344 228 6 9 36 44 12 16 327 229 326 15 327 229 12 16 42 222 18 23 320 230 318 22 320 230 18 23 48 54 24 34 305 231 319 227 305 231 24 34 54 211 30 226 351 232 344 228 351 232 30 226 60 64 36 44 330 233 327 229 330 233 36 44 66 234 42 222 290 235 320 230 290 235 42 222 72 97 48 236 306 235 305 237 306 235 48 238 78 210 54 211 352 239 351 232 352 239 54 211 84 85 60 64 331 240 330 233 331 240 60 64 90 120 66 241 291 232 290 242 291 232 66 243 96 96 72 97 307 230 306 235 307 230 72 97 102 96 78 244 353 230 352 245 353 230 78 246 108 119 84 247 332 228 331 248 332 228 84 249 114 119 90 120 292 228 291 232 292 228 90 120 120 139 96 96 308 22 307 230 308 22 96 96 126 139 102 96 354 22 353 230 354 22 102 96 132 149 108 119 333 8 332 228 333 8 108 119 138 149 114 119 293 8 292 228 293 8 114 119 309 2 341 15 308 22 120 139 308 22 341 15 342 229 349 233 121 138 122 140 121 138 349 233 350 250 355 227 123 251 124 142 123 252 355 227 356 0 357 2 125 143 354 22 125 143 357 2 362 15 363 229 126 139 127 138 126 139 363 229 364 233 365 240 128 140 129 141 128 140 365 240 347 229 348 15 130 145 131 153 130 145 348 15 334 2 335 0 333 8 132 149 333 8 335 0 336 227 303 231 133 148 134 154 133 148 303 231 304 233 301 229 135 144 136 145 135 144 301 229 302 15 294 2 137 153 293 8 137 153 294 2 295 0 296 227 138 149 139 148 138 149 296 227 288 231 289 253 140 154 141 254 140 154 289 253 310 227 311 0 142 142 143 143 142 142 311 0 312 8 144 153 309 2 341 15 309 2 144 153 145 145 146 144 342 229 349 233 342 229 146 144 147 255 148 148 350 256 355 227 350 257 148 148 149 149 358 8 356 0 357 2 356 0 358 8 150 153 151 145 362 15 363 229 362 15 151 145 152 144 153 150 364 233 365 240 364 233 153 150 154 138 155 139 347 229 348 15 347 229 155 139 337 22 156 143 334 2 335 0 334 2 156 143 157 142 158 155 336 227 303 231 336 227 158 155 159 140 160 138 304 233 301 229 304 233 160 138 161 139 297 22 302 15 294 2 302 15 297 22 162 143 163 142 295 0 296 227 295 0 163 142 164 155 165 258 288 231 289 253 288 231 165 258 166 148 167 149 310 227 311 0 310 227 167 149 144 153 312 8 168 126 313 228 168 126 312 8 150 153 358 8 174 126 359 228 174 126 358 8 156 143 337 22 180 105 338 230 180 105 337 22 162 143 297 22 186 105 298 230 186 105 297 22 168 126 313 228 192 128 314 232 192 128 313 228 174 126 359 228 198 128 360 232 198 128 359 228 180 105 338 230 204 172 339 259 204 172 338 230 186 105 298 230 210 172 299 259 210 172 298 230 192 128 314 232 216 260 315 239 216 260 314 232 198 128 360 232 222 260 361 239 222 260 360 232 204 172 339 259 228 261 340 237 228 261 339 259 210 172 299 259 234 261 300 237 234 261 299 259 216 262 315 263 240 220 321 227 240 220 315 264 222 265 361 266 246 48 345 230 246 48 361 267 228 268 340 269 252 224 328 229 252 224 340 270 234 271 300 272 258 38 322 228 258 38 300 273 240 220 321 227 264 28 323 0 264 28 321 227 246 48 345 230 270 21 346 22 270 21 345 230 252 224 328 229 276 14 329 15 276 14 328 229 258 38 322 228 282 7 324 8 282 7 322 228 26 35 2 4 25 33 1 3 25 33 2 4 27 36 28 37 3 5 4 6 3 5 28 37 31 40 7 10 30 226 6 9 30 226 7 10 32 39 33 41 8 11 9 12 8 11 33 41 34 42 35 224 10 13 11 14 10 13 35 224 38 45 14 18 37 43 13 17 37 43 14 18 39 46 40 47 15 19 16 20 15 19 40 47 43 50 19 24 42 222 18 23 42 222 19 24 44 49 45 51 20 25 21 26 20 25 45 51 46 52 47 220 22 27 23 28 22 27 47 220 50 55 26 35 49 53 25 33 49 53 26 35 51 56 52 57 27 36 28 37 27 36 52 57 55 60 31 40 54 211 30 226 54 211 31 40 56 59 57 61 32 39 33 41 32 39 57 61 58 62 59 204 34 42 35 224 34 42 59 204 62 65 38 45 61 63 37 43 61 63 38 45 63 66 64 67 39 46 40 47 39 46 64 67 67 70 43 50 66 234 42 222 66 234 43 50 68 69 69 71 44 49 45 51 44 49 69 71 70 72 71 274 46 52 47 220 46 52 71 274 73 73 74 76 49 53 50 55 49 53 74 76 75 77 76 78 51 56 52 57 51 56 76 78 79 80 55 60 78 210 54 211 78 210 55 60 80 81 81 82 56 59 57 61 56 59 81 82 82 83 83 203 58 62 59 204 58 62 83 203 85 84 86 86 61 63 62 65 61 63 86 86 87 87 88 88 63 66 64 67 63 66 88 88 91 90 67 70 90 275 66 234 90 276 67 70 92 91 93 92 68 69 69 71 68 69 93 92 94 93 95 277 70 72 71 274 70 72 95 277 97 94 98 99 73 278 74 279 73 280 98 99 99 281 100 104 75 282 76 283 75 284 100 104 103 94 79 285 102 96 78 286 102 96 79 287 104 99 105 100 80 288 81 289 80 290 105 100 106 113 107 126 82 291 83 292 82 293 107 126 109 117 110 130 85 294 86 295 85 296 110 130 111 112 112 113 87 297 88 298 87 299 112 113 115 117 91 300 114 119 90 120 114 119 91 301 116 130 117 302 92 303 93 304 92 305 117 302 118 104 119 105 94 306 95 307 94 308 119 105 121 138 122 140 97 94 98 99 97 94 122 140 123 309 124 142 99 310 100 104 99 311 124 142 127 138 103 94 126 139 102 96 126 139 103 94 128 140 129 141 104 99 105 100 104 99 129 141 130 145 131 153 106 113 107 126 106 113 131 153 133 148 134 154 109 117 110 130 109 117 134 154 135 144 136 145 111 112 112 113 111 112 136 145 139 148 115 117 138 149 114 119 138 149 115 117 140 154 141 254 116 130 117 302 116 130 141 254 142 142 143 143 118 104 119 105 118 104 143 143 146 144 145 145 170 112 169 113 170 112 145 145 148 148 147 312 172 117 171 313 172 117 147 314 174 126 175 113 150 153 151 145 150 153 175 113 153 150 152 144 177 122 176 112 177 122 152 144 179 96 155 139 178 94 154 138 178 94 155 139 158 155 157 142 182 134 181 104 182 134 157 142 160 138 159 140 184 94 183 99 184 94 159 140 186 105 187 104 162 143 163 142 162 143 187 104 165 258 164 155 189 315 188 134 189 315 164 155 191 119 167 149 190 117 166 148 190 117 167 149 170 112 169 113 194 114 193 115 194 114 169 113 172 117 171 316 196 118 195 317 196 118 171 318 175 113 174 126 199 115 198 128 199 115 174 126 177 122 176 112 201 123 200 114 201 123 176 112 178 94 202 168 179 96 203 176 179 96 202 168 182 134 181 104 206 177 205 171 206 177 181 104 184 94 183 99 208 168 207 169 208 168 183 99 187 104 186 105 211 171 210 172 211 171 186 105 189 315 188 134 213 319 212 177 213 319 188 134 190 117 214 118 191 119 215 120 191 119 214 118 194 320 193 321 218 187 217 72 218 187 193 322 196 323 195 324 220 190 219 69 220 190 195 325 199 326 198 327 223 196 222 328 223 196 198 329 201 330 200 331 225 200 224 66 225 200 200 332 202 333 226 63 203 334 227 335 203 336 226 63 206 337 205 338 230 61 229 62 230 61 205 339 208 340 207 341 232 60 231 59 232 60 207 342 211 343 210 344 235 57 234 345 235 57 210 346 213 347 212 348 237 55 236 56 237 55 212 349 214 350 238 53 215 351 239 54 215 352 238 53 218 187 217 72 242 51 241 52 242 51 217 72 219 69 243 49 220 190 244 50 220 190 243 49 223 196 222 353 247 47 246 48 247 47 222 354 225 200 224 66 249 45 248 46 249 45 224 66 226 63 250 43 227 335 251 44 227 335 250 43 230 61 229 62 254 41 253 42 254 41 229 62 231 59 255 39 232 60 256 40 232 60 255 39 235 57 234 355 259 37 258 38 259 37 234 356 237 55 236 56 261 35 260 36 261 35 236 56 238 53 262 33 239 54 263 34 239 54 262 33 242 51 241 52 266 29 265 27 266 29 241 52 243 49 267 30 244 50 268 24 244 50 267 30 247 47 246 48 271 20 270 21 271 20 246 48 249 45 248 46 273 32 272 31 273 32 248 46 250 43 274 17 251 44 275 16 251 44 274 17 254 41 253 42 278 12 277 13 278 12 253 42 255 39 279 11 256 40 280 10 256 40 279 11 259 37 258 38 283 6 282 7 283 6 258 38 261 35 260 36 285 4 284 5 285 4 260 36 262 33 286 3 263 34 287 1 263 34 286 3 29 38 344 228 5 7 343 8 5 7 344 228 35 224 327 229 11 14 326 15 11 14 327 229 41 48 320 230 17 21 318 22 17 21 320 230 47 220 319 227 23 28 317 0 23 28 319 227 53 58 351 232 29 38 344 228 29 38 351 232 59 204 330 233 35 224 327 229 35 224 330 233 65 68 290 235 41 48 320 230 41 48 290 235 71 274 305 231 47 220 319 227 47 220 305 231 77 79 352 239 53 58 351 232 53 58 352 239 83 203 331 240 59 204 330 233 59 204 331 240 89 357 291 232 65 358 290 359 65 360 291 232 95 361 306 235 71 362 305 363 71 364 306 235 101 105 353 230 77 365 352 366 77 367 353 230 107 126 332 228 83 368 331 369 83 370 332 228 113 126 292 228 89 371 291 232 89 372 292 228 119 105 307 230 95 373 306 235 95 374 307 230 125 143 354 22 101 105 353 230 101 105 354 22 131 153 333 8 107 126 332 228 107 126 333 8 137 153 293 8 113 126 292 228 113 126 293 8 143 143 308 22 119 105 307 230 119 105 308 22 341 15 342 229 120 139 121 138 120 139 342 229 349 233 350 240 122 140 123 141 122 140 350 240 355 227 356 0 124 142 125 143 124 142 356 0 357 2 362 15 354 22 126 139 354 22 362 15 363 229 364 233 127 138 128 140 127 138 364 233 365 375 347 229 129 376 130 145 129 377 347 229 348 15 334 2 131 153 333 8 131 153 334 2 335 0 336 227 132 149 133 148 132 149 336 227 303 378 304 233 134 379 135 144 134 380 304 233 301 229 302 15 136 145 137 153 136 145 302 15 294 2 295 0 293 8 138 149 293 8 295 0 296 227 288 231 139 148 140 154 139 148 288 231 289 381 310 227 141 382 142 142 141 383 310 227 311 0 309 2 143 143 308 22 143 143 309 2 144 153 145 145 341 15 342 229 341 15 145 145 146 144 147 150 349 233 350 240 349 233 147 150 148 148 149 149 355 227 356 0 355 227 149 149 358 8 150 153 357 2 362 15 357 2 150 153 151 145 152 144 363 229 364 233 363 229 152 144 153 384 154 138 365 385 347 229 365 386 154 138 155 139 337 22 348 15 334 2 348 15 337 22 156 143 157 142 335 0 336 227 335 0 157 142 158 387 159 140 303 388 304 233 303 389 159 140 160 138 161 139 301 229 302 15 301 229 161 139 297 22 162 143 294 2 295 0 294 2 162 143 163 142 164 155 296 227 288 231 296 227 164 155 165 390 166 148 289 391 310 227 289 392 166 148 167 149 312 8 311 0 309 2 311 0 312 8 149 149 173 119 358 8 359 228 358 8 173 119 155 139 179 96 337 22 338 230 337 22 179 96 161 139 185 96 297 22 298 230 297 22 185 96 167 149 191 119 312 8 313 228 312 8 191 119 173 119 197 120 359 228 360 232 359 228 197 120 179 96 203 176 338 230 339 259 338 230 203 176 185 96 209 176 298 230 299 259 298 230 209 176 191 119 215 120 313 228 314 232 313 228 215 120 197 120 221 393 360 232 361 239 360 232 221 394 203 176 227 395 339 259 340 237 339 259 227 396 209 176 233 397 299 259 300 237 299 259 233 398 215 120 239 399 314 232 315 239 314 232 239 400 221 192 245 222 361 401 345 230 361 402 245 222 227 335 251 44 340 403 328 229 340 404 251 44 233 211 257 226 300 405 322 228 300 406 257 226 239 54 263 34 315 407 321 227 315 408 263 34 245 222 269 23 345 230 346 22 345 230 269 23 251 44 275 16 328 229 329 15 328 229 275 16 257 226 281 9 322 228 324 8 322 228 281 9 263 34 287 1 321 227 323 0 321 227 287 1</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="RoundedCube-5">
+ <node id="_RoundedCube" name="RoundedCube" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#RoundedCube">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided-mirroredUVs.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided-mirroredUVs.dae
new file mode 100644
index 0000000..c036404
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided-mirroredUVs.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-10-16T17:45:36Z</created>
+ <modified>2008-10-16T17:45:36Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="plane" name="plane">
+ <instance_effect url="#plane-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="plane-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane_doubleSided" name="Plane_doubleSided">
+ <mesh>
+ <source id="Plane_doubleSided-positions" name="position">
+ <float_array id="Plane_doubleSided-positions-array" count="24">50 -50 0 -50 -50 0 50 50 0 -50 50 0 -50 -50 0 50 -50 0 -50 50 0 50 50 0</float_array>
+ <technique_common>
+ <accessor source="#Plane_doubleSided-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane_doubleSided-normals" name="normal">
+ <float_array id="Plane_doubleSided-normals-array" count="24">0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1</float_array>
+ <technique_common>
+ <accessor source="#Plane_doubleSided-normals-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane_doubleSided-Texture" name="Texture">
+ <float_array id="Plane_doubleSided-Texture-array" count="8">1 0 0 0 0 1 1 1</float_array>
+ <technique_common>
+ <accessor source="#Plane_doubleSided-Texture-array" count="4" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane_doubleSided-vertices">
+ <input semantic="POSITION" source="#Plane_doubleSided-positions"/>
+ <input semantic="NORMAL" source="#Plane_doubleSided-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="4">
+ <input semantic="VERTEX" source="#Plane_doubleSided-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane_doubleSided-Texture" offset="1" set="1"/>
+ <p>2 0 3 1 0 3 0 3 3 1 1 2 6 0 7 1 4 3 4 3 7 1 5 2</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="_Plane_doubleSided" name="Plane_doubleSided" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane_doubleSided">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#plane"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided.dae
new file mode 100644
index 0000000..b84c198
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-DoubleSided.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-DoubleSided.mb</source_data>
+ </contributor>
+ <created>2008-10-13T20:21:17Z</created>
+ <modified>2008-10-13T20:21:17Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="plane" name="plane">
+ <instance_effect url="#plane-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="plane-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane_doubleSided" name="Plane_doubleSided">
+ <mesh>
+ <source id="Plane_doubleSided-positions" name="position">
+ <float_array id="Plane_doubleSided-positions-array" count="24">50 -50 0 -50 -50 0 50 50 0 -50 50 0 -50 -50 0 50 -50 0 -50 50 0 50 50 0</float_array>
+ <technique_common>
+ <accessor source="#Plane_doubleSided-positions-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane_doubleSided-normals" name="normal">
+ <float_array id="Plane_doubleSided-normals-array" count="24">0 0 1 0 0 1 0 0 1 0 0 1 0 0 -1 0 0 -1 0 0 -1 0 0 -1</float_array>
+ <technique_common>
+ <accessor source="#Plane_doubleSided-normals-array" count="8" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane_doubleSided-Texture" name="Texture">
+ <float_array id="Plane_doubleSided-Texture-array" count="8">1 1 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#Plane_doubleSided-Texture-array" count="4" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane_doubleSided-vertices">
+ <input semantic="POSITION" source="#Plane_doubleSided-positions"/>
+ <input semantic="NORMAL" source="#Plane_doubleSided-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="4">
+ <input semantic="VERTEX" source="#Plane_doubleSided-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane_doubleSided-Texture" offset="1" set="1"/>
+ <p>2 0 3 1 0 3 0 3 3 1 1 2 6 0 7 1 4 3 4 3 7 1 5 2</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-DoubleSided">
+ <node id="_Plane_doubleSided" name="Plane_doubleSided" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane_doubleSided">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#plane"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-16X16.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-16X16.dae
new file mode 100644
index 0000000..9ca0f7f
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-16X16.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-SingleSided-16X16.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:35:55Z</created>
+ <modified>2008-09-19T17:35:55Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane16X16" name="Plane16X16">
+ <mesh>
+ <source id="Plane16X16-positions" name="position">
+ <float_array id="Plane16X16-positions-array" count="867">50 -50 0 -50 -50 0 50 50 0 -50 50 0 0 50 0 -50 0 0 0 -50 0 50 0 0 0 0 0 25 50 0 0 25 0 25 0 0 50 25 0 25 25 0 -50 25 0 -25 0 0 -25 50 0 -25 25 0 -25 -50 0 0 -25 0 -50 -25 0 -25 -25 0 50 -25 0 25 -50 0 25 -25 0 37.5 50 0 25 37.5 0 37.5 25 0 50 37.5 0 37.5 37.5 0 0 37.5 0 12.5 25 0 12.5 50 0 12.5 37.5 0 12.5 0 0 25 12.5 0 0 12.5 0 12.5 12.5 0 50 12.5 0 37.5 0 0 37.5 12.5 0 -50 37.5 0 -37.5 25 0 -25 37.5 0 -37.5 50 0 -37.5 37.5 0 -37.5 0 0 -25 12.5 0 -50 12.5 0 -37.5 12.5 0 -12.5 25 0 -12.5 0 0 -12.5 12.5 0 -12.5 50 0 -12.5 37.5 0 -37.5 -50 0 -25 -37.5 0 -37.5 -25 0 -50 -37.5 0 -37.5 -37.5 0 0 -37.5 0 -12.5 -25 0 -12.5 -50 0 -12.5 -37.5 0 -25 -12.5 0 0 -12.5 0 -12.5 -12.5 0 -50 -12.5 0 -37.5 -12.5 0 50 -37.5 0 37.5 -25 0 25 -37.5 0 37.5 -50 0 37.5 -37.5 0 25 -12.5 0 50 -12.5 0 37.5 -12.5 0 12.5 -25 0 12.5 -12.5 0 12.5 -50 0 12.5 -37.5 0 43.75 50 0 37.5 43.75 0 43.75 37.5 0 50 43.75 0 43.75 43.75 0 25 43.75 0 31.25 37.5 0 31.25 50 0 31.25 43.75 0 31.25 25 0 37.5 31.25 0 25 31.25 0 31.25 31.25 0 50 31.25 0 43.75 25 0 43.75 31.25 0 0 43.75 0 6.25 37.5 0 12.5 43.75 0 6.25 50 0 6.25 43.75 0 6.25 25 0 12.5 31.25 0 0 31.25 0 6.25 31.25 0 18.75 37.5 0 18.75 25 0 18.75 31.25 0 18.75 50 0 18.75 43.75 0 6.25 0 0 12.5 6.25 0 6.25 12.5 0 0 6.25 0 6.25 6.25 0 25 6.25 0 18.75 12.5 0 18.75 0 0 18.75 6.25 0 12.5 18.75 0 25 18.75 0 18.75 18.75 0 0 18.75 0 6.25 18.75 0 50 6.25 0 43.75 12.5 0 37.5 6.25 0 43.75 0 0 43.75 6.25 0 37.5 18.75 0 50 18.75 0 43.75 18.75 0 31.25 12.5 0 31.25 18.75 0 31.25 0 0 31.25 6.25 0 -50 43.75 0 -43.75 37.5 0 -37.5 43.75 0 -43.75 50 0 -43.75 43.75 0 -43.75 25 0 -37.5 31.25 0 -50 31.25 0 -43.75 31.25 0 -25 31.25 0 -31.25 37.5 0 -31.25 25 0 -31.25 31.25 0 -31.25 50 0 -25 43.75 0 -31.25 43.75 0 -43.75 0 0 -37.5 6.25 0 -43.75 12.5 0 -50 6.25 0 -43.75 6.25 0 -25 6.25 0 -31.25 12.5 0 -31.25 0 0 -31.25 6.25 0 -37.5 18.75 0 -25 18.75 0 -31.25 18.75 0 -50 18.75 0 -43.75 18.75 0 -6.25 12.5 0 -12.5 6.25 0 -6.25 0 0 -6.25 6.25 0 -6.25 25 0 -12.5 18.75 0 -6.25 18.75 0 -18.75 12.5 0 -18.75 25 0 -18.75 18.75 0 -18.75 0 0 -18.75 6.25 0 -6.25 50 0 -12.5 43.75 0 -6.25 37.5 0 -6.25 43.75 0 -18.75 37.5 0 -18.75 50 0 -18.75 43.75 0 -12.5 31.25 0 -18.75 31.25 0 -6.25 31.25 0 -43.75 -50 0 -37.5 -43.75 0 -43.75 -37.5 0 -50 -43.75 0 -43.75 -43.75 0 -25 -43.75 0 -31.25 -37.5 0 -31.25 -50 0 -31.25 -43.75 0 -31.25 -25 0 -37.5 -31.25 0 -25 -31.25 0 -31.25 -31.25 0 -50 -31.25 0 -43.75 -25 0 -43.75 -31.25 0 0 -43.75 0 -6.25 -37.5 0 -12.5 -43.75 0 -6.25 -50 0 -6.25 -43.75 0 -6.25 -25 0 -12.5 -31.25 0 0 -31.25 0 -6.25 -31.25 0 -18.75 -37.5 0 -18.75 -25 0 -18.75 -31.25 0 -18.75 -50 0 -18.75 -43.75 0 -12.5 -6.25 0 -6.25 -12.5 0 0 -6.25 0 -6.25 -6.25 0 -25 -6.25 0 -18.75 -12.5 0 -18.75 -6.25 0 -12.5 -18.75 0 -25 -18.75 0 -18.75 -18.75 0 0 -18.75 0 -6.25 -18.75 0 -50 -6.25 0 -43.75 -12.5 0 -37.5 -6.25 0 -43.75 -6.25 0 -37.5 -18.75 0 -50 -18.75 0 -43.75 -18.75 0 -31.25 -12.5 0 -31.25 -18.75 0 -31.25 -6.25 0 50 -43.75 0 43.75 -37.5 0 37.5 -43.75 0 43.75 -50 0 43.75 -43.75 0 43.75 -25 0 37.5 -31.25 0 50 -31.25 0 43.75 -31.25 0 25 -31.25 0 31.25 -37.5 0 31.25 -25 0 31.25 -31.25 0 31.25 -50 0 25 -43.75 0 31.25 -43.75 0 37.5 -6.25 0 43.75 -12.5 0 50 -6.25 0 43.75 -6.25 0 25 -6.25 0 31.25 -12.5 0 31.25 -6.25 0 37.5 -18.75 0 25 -18.75 0 31.25 -18.75 0 50 -18.75 0 43.75 -18.75 0 6.25 -12.5 0 12.5 -6.25 0 6.25 -6.25 0 6.25 -25 0 12.5 -18.75 0 6.25 -18.75 0 18.75 -12.5 0 18.75 -25 0 18.75 -18.75 0 18.75 -6.25 0 6.25 -50 0 12.5 -43.75 0 6.25 -37.5 0 6.25 -43.75 0 18.75 -37.5 0 18.75 -50 0 18.75 -43.75 0 12.5 -31.25 0 18.75 -31.25 0 6.25 -31.25 0</float_array>
+ <technique_common>
+ <accessor source="#Plane16X16-positions-array" count="289" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane16X16-normals" name="normal">
+ <float_array id="Plane16X16-normals-array" count="867">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#Plane16X16-normals-array" count="289" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane16X16-Rectangle-UV" name="Rectangle-UV">
+ <float_array id="Plane16X16-Rectangle-UV-array" count="578">0.875 1 0.875 0.9375 0.9375 1 0.9375 0.9375 1 0.875 1 0.9375 0.9375 0.875 0.75 0.875 0.8125 0.875 0.75 0.9375 0.8125 0.9375 0.8125 1 0.875 0.75 0.875 0.8125 0.8125 0.75 0.8125 0.8125 0.75 0.8125 1 0.8125 0.9375 0.8125 0.9375 0.75 0.5 0.875 0.5625 0.875 0.5 0.9375 0.5625 0.9375 0.625 1 0.5625 1 0.625 0.9375 0.625 0.75 0.625 0.8125 0.5625 0.75 0.5625 0.8125 0.5 0.8125 0.6875 0.875 0.6875 0.8125 0.6875 0.75 0.6875 1 0.6875 0.9375 0.625 0.5 0.625 0.5625 0.5625 0.5 0.5625 0.5625 0.5 0.625 0.5 0.5625 0.5625 0.625 0.75 0.625 0.6875 0.625 0.75 0.5625 0.6875 0.5625 0.6875 0.5 0.625 0.6875 0.6875 0.6875 0.75 0.6875 0.5 0.6875 0.5625 0.6875 1 0.625 0.9375 0.625 1 0.5625 0.9375 0.5625 0.875 0.5 0.9375 0.5 0.875 0.5625 0.875 0.6875 0.9375 0.6875 1 0.6875 0.8125 0.625 0.8125 0.6875 0.8125 0.5 0.8125 0.5625 0 0.875 0.0625 0.875 0 0.9375 0.0625 0.9375 0.125 1 0.0625 1 0.125 0.9375 0.125 0.75 0.125 0.8125 0.0625 0.75 0.0625 0.8125 0 0.8125 0.25 0.875 0.1875 0.875 0.25 0.8125 0.1875 0.8125 0.1875 0.75 0.1875 1 0.1875 0.9375 0.25 0.9375 0.125 0.5 0.125 0.5625 0.0625 0.5 0.0625 0.5625 0 0.625 0 0.5625 0.0625 0.625 0.25 0.625 0.1875 0.625 0.25 0.5625 0.1875 0.5625 0.1875 0.5 0.125 0.6875 0.1875 0.6875 0.25 0.6875 0 0.6875 0.0625 0.6875 0.4375 0.625 0.4375 0.5625 0.375 0.5 0.4375 0.5 0.375 0.5625 0.375 0.75 0.375 0.6875 0.4375 0.75 0.4375 0.6875 0.3125 0.625 0.3125 0.6875 0.3125 0.75 0.3125 0.5 0.3125 0.5625 0.375 1 0.375 0.9375 0.4375 1 0.4375 0.9375 0.4375 0.875 0.3125 0.875 0.3125 0.9375 0.3125 1 0.375 0.8125 0.3125 0.8125 0.4375 0.8125 0.125 0 0.125 0.0625 0.0625 0 0.0625 0.0625 0 0.125 0 0.0625 0.0625 0.125 0.25 0.125 0.1875 0.125 0.25 0.0625 0.1875 0.0625 0.1875 0 0.125 0.25 0.125 0.1875 0.1875 0.25 0.1875 0.1875 0.25 0.1875 0 0.1875 0.0625 0.1875 0.0625 0.25 0.5 0.125 0.4375 0.125 0.5 0.0625 0.4375 0.0625 0.375 0 0.4375 0 0.375 0.0625 0.375 0.25 0.375 0.1875 0.4375 0.25 0.4375 0.1875 0.5 0.1875 0.3125 0.125 0.3125 0.1875 0.3125 0.25 0.3125 0 0.3125 0.0625 0.375 0.4375 0.4375 0.4375 0.5 0.375 0.5 0.4375 0.4375 0.375 0.25 0.375 0.3125 0.375 0.25 0.4375 0.3125 0.4375 0.375 0.3125 0.3125 0.3125 0.25 0.3125 0.5 0.3125 0.4375 0.3125 0 0.375 0.0625 0.375 0 0.4375 0.0625 0.4375 0.125 0.4375 0.125 0.3125 0.0625 0.3125 0 0.3125 0.1875 0.375 0.1875 0.3125 0.1875 0.4375 1 0.125 0.9375 0.125 1 0.0625 0.9375 0.0625 0.875 0 0.9375 0 0.875 0.0625 0.875 0.25 0.875 0.1875 0.9375 0.25 0.9375 0.1875 1 0.1875 0.75 0.125 0.8125 0.125 0.75 0.1875 0.8125 0.1875 0.8125 0.25 0.8125 0 0.8125 0.0625 0.75 0.0625 0.875 0.4375 0.9375 0.4375 1 0.375 1 0.4375 0.9375 0.375 0.75 0.375 0.8125 0.375 0.75 0.4375 0.8125 0.4375 0.875 0.3125 0.8125 0.3125 0.75 0.3125 1 0.3125 0.9375 0.3125 0.5625 0.375 0.5625 0.4375 0.625 0.4375 0.625 0.25 0.625 0.3125 0.5625 0.25 0.5625 0.3125 0.6875 0.375 0.6875 0.3125 0.6875 0.25 0.6875 0.4375 0.625 0 0.625 0.0625 0.5625 0 0.5625 0.0625 0.5625 0.125 0.6875 0.125 0.6875 0.0625 0.6875 0 0.625 0.1875 0.6875 0.1875 0.5625 0.1875 1 1 0.875 0.875 0.75 1 0.75 0.75 1 0.75 0.5 1 0.625 0.875 0.5 0.75 0.5 0.5 0.625 0.625 0.75 0.5 1 0.5 0.875 0.625 0 1 0.125 0.875 0 0.75 0.25 0.75 0.25 1 0 0.5 0.125 0.625 0.25 0.5 0.375 0.625 0.375 0.875 0 0 0.125 0.125 0.25 0 0.25 0.25 0 0.25 0.5 0 0.375 0.125 0.5 0.25 0.375 0.375 0.125 0.375 1 0 0.875 0.125 1 0.25 0.75 0.25 0.75 0 0.875 0.375 0.625 0.375 0.625 0.125</float_array>
+ <technique_common>
+ <accessor source="#Plane16X16-Rectangle-UV-array" count="289" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane16X16-vertices">
+ <input semantic="POSITION" source="#Plane16X16-positions"/>
+ <input semantic="NORMAL" source="#Plane16X16-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="512">
+ <input semantic="VERTEX" source="#Plane16X16-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane16X16-Rectangle-UV" offset="1" set="1"/>
+ <p>25 0 82 1 81 2 85 3 81 2 82 1 28 4 84 5 83 6 85 3 83 6 84 5 26 7 87 8 86 9 89 10 86 9 87 8 25 0 88 11 82 1 89 10 82 1 88 11 27 12 91 13 90 14 93 15 90 14 91 13 26 7 92 16 87 8 93 15 87 8 92 16 28 4 83 6 94 17 96 18 94 17 83 6 27 12 95 19 91 13 96 18 91 13 95 19 30 20 98 21 97 22 101 23 97 22 98 21 32 24 100 25 99 26 101 23 99 26 100 25 31 27 103 28 102 29 105 30 102 29 103 28 30 20 104 31 98 21 105 30 98 21 104 31 26 7 106 32 92 16 108 33 92 16 106 32 31 27 107 34 103 28 108 33 103 28 107 34 32 24 99 26 109 35 110 36 109 35 99 26 26 7 86 9 106 32 110 36 106 32 86 9 34 37 112 38 111 39 115 40 111 39 112 38 36 41 114 42 113 43 115 40 113 43 114 42 35 44 117 45 116 46 119 47 116 46 117 45 34 37 118 48 112 38 119 47 112 38 118 48 31 27 120 49 107 34 122 50 107 34 120 49 35 44 121 51 117 45 122 50 117 45 121 51 36 41 113 43 123 52 124 53 123 52 113 43 31 27 102 29 120 49 124 53 120 49 102 29 38 54 126 55 125 56 129 57 125 56 126 55 39 58 128 59 127 60 129 57 127 60 128 59 27 12 130 61 95 19 132 62 95 19 130 61 38 54 131 63 126 55 132 62 126 55 131 63 35 44 133 64 121 51 134 65 121 51 133 64 27 12 90 14 130 61 134 65 130 61 90 14 39 58 127 60 135 66 136 67 135 66 127 60 35 44 116 46 133 64 136 67 133 64 116 46 41 68 138 69 137 70 141 71 137 70 138 69 44 72 140 73 139 74 141 71 139 74 140 73 42 75 143 76 142 77 145 78 142 77 143 76 41 68 144 79 138 69 145 78 138 69 144 79 43 80 147 81 146 82 149 83 146 82 147 81 42 75 148 84 143 76 149 83 143 76 148 84 44 72 139 74 150 85 152 86 150 85 139 74 43 80 151 87 147 81 152 86 147 81 151 87 46 88 154 89 153 90 157 91 153 90 154 89 48 92 156 93 155 94 157 91 155 94 156 93 47 95 159 96 158 97 161 98 158 97 159 96 46 88 160 99 154 89 161 98 154 89 160 99 42 75 162 100 148 84 164 101 148 84 162 100 47 95 163 102 159 96 164 101 159 96 163 102 48 92 155 94 165 103 166 104 165 103 155 94 42 75 142 77 162 100 166 104 162 100 142 77 36 41 167 105 114 42 170 106 114 42 167 105 51 107 169 108 168 109 170 106 168 109 169 108 50 110 172 111 171 112 173 113 171 112 172 111 36 41 123 52 167 105 173 113 167 105 123 52 47 95 174 114 163 102 176 115 163 102 174 114 50 110 175 116 172 111 176 115 172 111 175 116 51 107 168 109 177 117 178 118 177 117 168 109 47 95 158 97 174 114 178 118 174 114 158 97 53 119 180 120 179 121 182 122 179 121 180 120 30 20 97 22 181 123 182 122 181 123 97 22 43 80 183 124 151 87 185 125 151 87 183 124 53 119 184 126 180 120 185 125 180 120 184 126 50 110 186 127 175 116 187 128 175 116 186 127 43 80 146 82 183 124 187 128 183 124 146 82 30 20 181 123 104 31 188 129 104 31 181 123 50 110 171 112 186 127 188 129 186 127 171 112 55 130 190 131 189 132 193 133 189 132 190 131 58 134 192 135 191 136 193 133 191 136 192 135 56 137 195 138 194 139 197 140 194 139 195 138 55 130 196 141 190 131 197 140 190 131 196 141 57 142 199 143 198 144 201 145 198 144 199 143 56 137 200 146 195 138 201 145 195 138 200 146 58 134 191 136 202 147 204 148 202 147 191 136 57 142 203 149 199 143 204 148 199 143 203 149 60 150 206 151 205 152 209 153 205 152 206 151 62 154 208 155 207 156 209 153 207 156 208 155 61 157 211 158 210 159 213 160 210 159 211 158 60 150 212 161 206 151 213 160 206 151 212 161 56 137 214 162 200 146 216 163 200 146 214 162 61 157 215 164 211 158 216 163 211 158 215 164 62 154 207 156 217 165 218 166 217 165 207 156 56 137 194 139 214 162 218 166 214 162 194 139 51 107 219 167 169 108 222 168 169 108 219 167 65 169 221 170 220 171 222 168 220 171 221 170 64 172 224 173 223 174 225 175 223 174 224 173 51 107 177 117 219 167 225 175 219 167 177 117 61 157 226 176 215 164 228 177 215 164 226 176 64 172 227 178 224 173 228 177 224 173 227 178 65 169 220 171 229 179 230 180 229 179 220 171 61 157 210 159 226 176 230 180 226 176 210 159 67 181 232 182 231 183 234 184 231 183 232 182 46 88 153 90 233 185 234 184 233 185 153 90 57 142 235 186 203 149 237 187 203 149 235 186 67 181 236 188 232 182 237 187 232 182 236 188 64 172 238 189 227 178 239 190 227 178 238 189 57 142 198 144 235 186 239 190 235 186 198 144 46 88 233 185 160 99 240 191 160 99 233 185 64 172 223 174 238 189 240 191 238 189 223 174 69 192 242 193 241 194 245 195 241 194 242 193 72 196 244 197 243 198 245 195 243 198 244 197 70 199 247 200 246 201 249 202 246 201 247 200 69 192 248 203 242 193 249 202 242 193 248 203 71 204 251 205 250 206 253 207 250 206 251 205 70 199 252 208 247 200 253 207 247 200 252 208 72 196 243 198 254 209 256 210 254 209 243 198 71 204 255 211 251 205 256 210 251 205 255 211 39 58 257 212 128 59 260 213 128 59 257 212 75 214 259 215 258 216 260 213 258 216 259 215 74 217 262 218 261 219 263 220 261 219 262 218 39 58 135 66 257 212 263 220 257 212 135 66 70 199 264 221 252 208 266 222 252 208 264 221 74 217 265 223 262 218 266 222 262 218 265 223 75 214 258 216 267 224 268 225 267 224 258 216 70 199 246 201 264 221 268 225 264 221 246 201 65 169 269 226 221 170 271 227 221 170 269 226 34 37 111 39 270 228 271 227 270 228 111 39 77 229 273 230 272 231 274 232 272 231 273 230 65 169 229 179 269 226 274 232 269 226 229 179 74 217 275 233 265 223 277 234 265 223 275 233 77 229 276 235 273 230 277 234 273 230 276 235 34 37 270 228 118 48 278 236 118 48 270 228 74 217 261 219 275 233 278 236 275 233 261 219 79 237 280 238 279 239 282 240 279 239 280 238 60 150 205 152 281 241 282 240 281 241 205 152 71 204 283 242 255 211 285 243 255 211 283 242 79 237 284 244 280 238 285 243 280 238 284 244 77 229 286 245 276 235 287 246 276 235 286 245 71 204 250 206 283 242 287 246 283 242 250 206 60 150 281 241 212 161 288 247 212 161 281 241 77 229 272 231 286 245 288 247 286 245 272 231 2 248 81 2 84 5 85 3 84 5 81 2 29 249 83 6 82 1 85 3 82 1 83 6 9 250 86 9 88 11 89 10 88 11 86 9 29 249 82 1 87 8 89 10 87 8 82 1 13 251 90 14 92 16 93 15 92 16 90 14 29 249 87 8 91 13 93 15 91 13 87 8 12 252 94 17 95 19 96 18 95 19 94 17 29 249 91 13 83 6 96 18 83 6 91 13 4 253 97 22 100 25 101 23 100 25 97 22 33 254 99 26 98 21 101 23 98 21 99 26 10 255 102 29 104 31 105 30 104 31 102 29 33 254 98 21 103 28 105 30 103 28 98 21 13 251 92 16 107 34 108 33 107 34 92 16 33 254 103 28 106 32 108 33 106 32 103 28 9 250 109 35 86 9 110 36 86 9 109 35 33 254 106 32 99 26 110 36 99 26 106 32 8 256 111 39 114 42 115 40 114 42 111 39 37 257 113 43 112 38 115 40 112 38 113 43 11 258 116 46 118 48 119 47 118 48 116 46 37 257 112 38 117 45 119 47 117 45 112 38 13 251 107 34 121 51 122 50 121 51 107 34 37 257 117 45 120 49 122 50 120 49 117 45 10 255 123 52 102 29 124 53 102 29 123 52 37 257 120 49 113 43 124 53 113 43 120 49 7 259 125 56 128 59 129 57 128 59 125 56 40 260 127 60 126 55 129 57 126 55 127 60 12 252 95 19 131 63 132 62 131 63 95 19 40 260 126 55 130 61 132 62 130 61 126 55 13 251 121 51 90 14 134 65 90 14 121 51 40 260 130 61 133 64 134 65 133 64 130 61 11 258 135 66 116 46 136 67 116 46 135 66 40 260 133 64 127 60 136 67 127 60 133 64 3 261 137 70 140 73 141 71 140 73 137 70 45 262 139 74 138 69 141 71 138 69 139 74 14 263 142 77 144 79 145 78 144 79 142 77 45 262 138 69 143 76 145 78 143 76 138 69 17 264 146 82 148 84 149 83 148 84 146 82 45 262 143 76 147 81 149 83 147 81 143 76 16 265 150 85 151 87 152 86 151 87 150 85 45 262 147 81 139 74 152 86 139 74 147 81 5 266 153 90 156 93 157 91 156 93 153 90 49 267 155 94 154 89 157 91 154 89 155 94 15 268 158 97 160 99 161 98 160 99 158 97 49 267 154 89 159 96 161 98 159 96 154 89 17 264 148 84 163 102 164 101 163 102 148 84 49 267 159 96 162 100 164 101 162 100 159 96 14 263 165 103 142 77 166 104 142 77 165 103 49 267 162 100 155 94 166 104 155 94 162 100 8 256 114 42 169 108 170 106 169 108 114 42 52 269 168 109 167 105 170 106 167 105 168 109 10 255 171 112 123 52 173 113 123 52 171 112 52 269 167 105 172 111 173 113 172 111 167 105 17 264 163 102 175 116 176 115 175 116 163 102 52 269 172 111 174 114 176 115 174 114 172 111 15 268 177 117 158 97 178 118 158 97 177 117 52 269 174 114 168 109 178 118 168 109 174 114 4 253 179 121 97 22 182 122 97 22 179 121 54 270 181 123 180 120 182 122 180 120 181 123 16 265 151 87 184 126 185 125 184 126 151 87 54 270 180 120 183 124 185 125 183 124 180 120 17 264 175 116 146 82 187 128 146 82 175 116 54 270 183 124 186 127 187 128 186 127 183 124 10 255 104 31 171 112 188 129 171 112 104 31 54 270 186 127 181 123 188 129 181 123 186 127 1 271 189 132 192 135 193 133 192 135 189 132 59 272 191 136 190 131 193 133 190 131 191 136 18 273 194 139 196 141 197 140 196 141 194 139 59 272 190 131 195 138 197 140 195 138 190 131 21 274 198 144 200 146 201 145 200 146 198 144 59 272 195 138 199 143 201 145 199 143 195 138 20 275 202 147 203 149 204 148 203 149 202 147 59 272 199 143 191 136 204 148 191 136 199 143 6 276 205 152 208 155 209 153 208 155 205 152 63 277 207 156 206 151 209 153 206 151 207 156 19 278 210 159 212 161 213 160 212 161 210 159 63 277 206 151 211 158 213 160 211 158 206 151 21 274 200 146 215 164 216 163 215 164 200 146 63 277 211 158 214 162 216 163 214 162 211 158 18 273 217 165 194 139 218 166 194 139 217 165 63 277 214 162 207 156 218 166 207 156 214 162 8 256 169 108 221 170 222 168 221 170 169 108 66 279 220 171 219 167 222 168 219 167 220 171 15 268 223 174 177 117 225 175 177 117 223 174 66 279 219 167 224 173 225 175 224 173 219 167 21 274 215 164 227 178 228 177 227 178 215 164 66 279 224 173 226 176 228 177 226 176 224 173 19 278 229 179 210 159 230 180 210 159 229 179 66 279 226 176 220 171 230 180 220 171 226 176 5 266 231 183 153 90 234 184 153 90 231 183 68 280 233 185 232 182 234 184 232 182 233 185 20 275 203 149 236 188 237 187 236 188 203 149 68 280 232 182 235 186 237 187 235 186 232 182 21 274 227 178 198 144 239 190 198 144 227 178 68 280 235 186 238 189 239 190 238 189 235 186 15 268 160 99 223 174 240 191 223 174 160 99 68 280 238 189 233 185 240 191 233 185 238 189 0 281 241 194 244 197 245 195 244 197 241 194 73 282 243 198 242 193 245 195 242 193 243 198 22 283 246 201 248 203 249 202 248 203 246 201 73 282 242 193 247 200 249 202 247 200 242 193 24 284 250 206 252 208 253 207 252 208 250 206 73 282 247 200 251 205 253 207 251 205 247 200 23 285 254 209 255 211 256 210 255 211 254 209 73 282 251 205 243 198 256 210 243 198 251 205 7 259 128 59 259 215 260 213 259 215 128 59 76 286 258 216 257 212 260 213 257 212 258 216 11 258 261 219 135 66 263 220 135 66 261 219 76 286 257 212 262 218 263 220 262 218 257 212 24 284 252 208 265 223 266 222 265 223 252 208 76 286 262 218 264 221 266 222 264 221 262 218 22 283 267 224 246 201 268 225 246 201 267 224 76 286 264 221 258 216 268 225 258 216 264 221 8 256 221 170 111 39 271 227 111 39 221 170 78 287 270 228 269 226 271 227 269 226 270 228 19 278 272 231 229 179 274 232 229 179 272 231 78 287 269 226 273 230 274 232 273 230 269 226 24 284 265 223 276 235 277 234 276 235 265 223 78 287 273 230 275 233 277 234 275 233 273 230 11 258 118 48 261 219 278 236 261 219 118 48 78 287 275 233 270 228 278 236 270 228 275 233 6 276 279 239 205 152 282 240 205 152 279 239 80 288 281 241 280 238 282 240 280 238 281 241 23 285 255 211 284 244 285 243 284 244 255 211 80 288 280 238 283 242 285 243 283 242 280 238 24 284 276 235 250 206 287 246 250 206 276 235 80 288 283 242 286 245 287 246 286 245 283 242 19 278 212 161 272 231 288 247 272 231 212 161 80 288 286 245 281 241 288 247 281 241 286 245</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-SingleSided-16X16">
+ <node id="Plane" name="Plane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane16X16">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-2X2.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-2X2.dae
new file mode 100644
index 0000000..2efa389
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-2X2.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-SingleSided-2X2.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:32:28Z</created>
+ <modified>2008-09-19T17:32:28Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane2X2" name="Plane2X2">
+ <mesh>
+ <source id="Plane2X2-positions" name="position">
+ <float_array id="Plane2X2-positions-array" count="27">50 -50 0 -50 -50 0 50 50 0 -50 50 0 0 50 0 -50 0 0 0 -50 0 50 0 0 0 0 0</float_array>
+ <technique_common>
+ <accessor source="#Plane2X2-positions-array" count="9" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane2X2-normals" name="normal">
+ <float_array id="Plane2X2-normals-array" count="27">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#Plane2X2-normals-array" count="9" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane2X2-Rectangle-UV" name="Rectangle-UV">
+ <float_array id="Plane2X2-Rectangle-UV-array" count="18">0 1 0 0.5 0.5 1 0.5 0.5 1 0 1 0.5 0.5 0 1 1 0 0</float_array>
+ <technique_common>
+ <accessor source="#Plane2X2-Rectangle-UV-array" count="9" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane2X2-vertices">
+ <input semantic="POSITION" source="#Plane2X2-positions"/>
+ <input semantic="NORMAL" source="#Plane2X2-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="8">
+ <input semantic="VERTEX" source="#Plane2X2-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane2X2-Rectangle-UV" offset="1" set="1"/>
+ <p>3 0 5 1 4 2 8 3 4 2 5 1 0 4 7 5 6 6 8 3 6 6 7 5 2 7 4 2 7 5 8 3 7 5 4 2 1 8 6 6 5 1 8 3 5 1 6 6</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-SingleSided-2X2">
+ <node id="Plane" name="Plane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane2X2">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-32X32.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-32X32.dae
new file mode 100644
index 0000000..deebe78
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-32X32.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-SingleSided-32X32.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:36:33Z</created>
+ <modified>2008-09-19T17:36:33Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane32X32" name="Plane32X32">
+ <mesh>
+ <source id="Plane32X32-positions" name="position">
+ <float_array id="Plane32X32-positions-array" count="3267">50 -50 0 -50 -50 0 50 50 0 -50 50 0 0 50 0 -50 0 0 0 -50 0 50 0 0 0 0 0 25 50 0 0 25 0 25 0 0 50 25 0 25 25 0 -50 25 0 -25 0 0 -25 50 0 -25 25 0 -25 -50 0 0 -25 0 -50 -25 0 -25 -25 0 50 -25 0 25 -50 0 25 -25 0 37.5 50 0 25 37.5 0 37.5 25 0 50 37.5 0 37.5 37.5 0 0 37.5 0 12.5 25 0 12.5 50 0 12.5 37.5 0 12.5 0 0 25 12.5 0 0 12.5 0 12.5 12.5 0 50 12.5 0 37.5 0 0 37.5 12.5 0 -50 37.5 0 -37.5 25 0 -25 37.5 0 -37.5 50 0 -37.5 37.5 0 -37.5 0 0 -25 12.5 0 -50 12.5 0 -37.5 12.5 0 -12.5 25 0 -12.5 0 0 -12.5 12.5 0 -12.5 50 0 -12.5 37.5 0 -37.5 -50 0 -25 -37.5 0 -37.5 -25 0 -50 -37.5 0 -37.5 -37.5 0 0 -37.5 0 -12.5 -25 0 -12.5 -50 0 -12.5 -37.5 0 -25 -12.5 0 0 -12.5 0 -12.5 -12.5 0 -50 -12.5 0 -37.5 -12.5 0 50 -37.5 0 37.5 -25 0 25 -37.5 0 37.5 -50 0 37.5 -37.5 0 25 -12.5 0 50 -12.5 0 37.5 -12.5 0 12.5 -25 0 12.5 -12.5 0 12.5 -50 0 12.5 -37.5 0 43.75 50 0 37.5 43.75 0 43.75 37.5 0 50 43.75 0 43.75 43.75 0 25 43.75 0 31.25 37.5 0 31.25 50 0 31.25 43.75 0 31.25 25 0 37.5 31.25 0 25 31.25 0 31.25 31.25 0 50 31.25 0 43.75 25 0 43.75 31.25 0 0 43.75 0 6.25 37.5 0 12.5 43.75 0 6.25 50 0 6.25 43.75 0 6.25 25 0 12.5 31.25 0 0 31.25 0 6.25 31.25 0 18.75 37.5 0 18.75 25 0 18.75 31.25 0 18.75 50 0 18.75 43.75 0 6.25 0 0 12.5 6.25 0 6.25 12.5 0 0 6.25 0 6.25 6.25 0 25 6.25 0 18.75 12.5 0 18.75 0 0 18.75 6.25 0 12.5 18.75 0 25 18.75 0 18.75 18.75 0 0 18.75 0 6.25 18.75 0 50 6.25 0 43.75 12.5 0 37.5 6.25 0 43.75 0 0 43.75 6.25 0 37.5 18.75 0 50 18.75 0 43.75 18.75 0 31.25 12.5 0 31.25 18.75 0 31.25 0 0 31.25 6.25 0 -50 43.75 0 -43.75 37.5 0 -37.5 43.75 0 -43.75 50 0 -43.75 43.75 0 -43.75 25 0 -37.5 31.25 0 -50 31.25 0 -43.75 31.25 0 -25 31.25 0 -31.25 37.5 0 -31.25 25 0 -31.25 31.25 0 -31.25 50 0 -25 43.75 0 -31.25 43.75 0 -43.75 0 0 -37.5 6.25 0 -43.75 12.5 0 -50 6.25 0 -43.75 6.25 0 -25 6.25 0 -31.25 12.5 0 -31.25 0 0 -31.25 6.25 0 -37.5 18.75 0 -25 18.75 0 -31.25 18.75 0 -50 18.75 0 -43.75 18.75 0 -6.25 12.5 0 -12.5 6.25 0 -6.25 0 0 -6.25 6.25 0 -6.25 25 0 -12.5 18.75 0 -6.25 18.75 0 -18.75 12.5 0 -18.75 25 0 -18.75 18.75 0 -18.75 0 0 -18.75 6.25 0 -6.25 50 0 -12.5 43.75 0 -6.25 37.5 0 -6.25 43.75 0 -18.75 37.5 0 -18.75 50 0 -18.75 43.75 0 -12.5 31.25 0 -18.75 31.25 0 -6.25 31.25 0 -43.75 -50 0 -37.5 -43.75 0 -43.75 -37.5 0 -50 -43.75 0 -43.75 -43.75 0 -25 -43.75 0 -31.25 -37.5 0 -31.25 -50 0 -31.25 -43.75 0 -31.25 -25 0 -37.5 -31.25 0 -25 -31.25 0 -31.25 -31.25 0 -50 -31.25 0 -43.75 -25 0 -43.75 -31.25 0 0 -43.75 0 -6.25 -37.5 0 -12.5 -43.75 0 -6.25 -50 0 -6.25 -43.75 0 -6.25 -25 0 -12.5 -31.25 0 0 -31.25 0 -6.25 -31.25 0 -18.75 -37.5 0 -18.75 -25 0 -18.75 -31.25 0 -18.75 -50 0 -18.75 -43.75 0 -12.5 -6.25 0 -6.25 -12.5 0 0 -6.25 0 -6.25 -6.25 0 -25 -6.25 0 -18.75 -12.5 0 -18.75 -6.25 0 -12.5 -18.75 0 -25 -18.75 0 -18.75 -18.75 0 0 -18.75 0 -6.25 -18.75 0 -50 -6.25 0 -43.75 -12.5 0 -37.5 -6.25 0 -43.75 -6.25 0 -37.5 -18.75 0 -50 -18.75 0 -43.75 -18.75 0 -31.25 -12.5 0 -31.25 -18.75 0 -31.25 -6.25 0 50 -43.75 0 43.75 -37.5 0 37.5 -43.75 0 43.75 -50 0 43.75 -43.75 0 43.75 -25 0 37.5 -31.25 0 50 -31.25 0 43.75 -31.25 0 25 -31.25 0 31.25 -37.5 0 31.25 -25 0 31.25 -31.25 0 31.25 -50 0 25 -43.75 0 31.25 -43.75 0 37.5 -6.25 0 43.75 -12.5 0 50 -6.25 0 43.75 -6.25 0 25 -6.25 0 31.25 -12.5 0 31.25 -6.25 0 37.5 -18.75 0 25 -18.75 0 31.25 -18.75 0 50 -18.75 0 43.75 -18.75 0 6.25 -12.5 0 12.5 -6.25 0 6.25 -6.25 0 6.25 -25 0 12.5 -18.75 0 6.25 -18.75 0 18.75 -12.5 0 18.75 -25 0 18.75 -18.75 0 18.75 -6.25 0 6.25 -50 0 12.5 -43.75 0 6.25 -37.5 0 6.25 -43.75 0 18.75 -37.5 0 18.75 -50 0 18.75 -43.75 0 12.5 -31.25 0 18.75 -31.25 0 6.25 -31.25 0 46.875 50 0 43.75 46.875 0 46.875 43.75 0 50 46.875 0 46.875 46.875 0 37.5 46.875 0 40.625 43.75 0 40.625 50 0 40.625 46.875 0 40.625 37.5 0 43.75 40.625 0 37.5 40.625 0 40.625 40.625 0 50 40.625 0 46.875 37.5 0 46.875 40.625 0 25 46.875 0 28.125 43.75 0 31.25 46.875 0 28.125 50 0 28.125 46.875 0 28.125 37.5 0 31.25 40.625 0 25 40.625 0 28.125 40.625 0 34.375 43.75 0 34.375 37.5 0 34.375 40.625 0 34.375 50 0 34.375 46.875 0 28.125 25 0 31.25 28.125 0 28.125 31.25 0 25 28.125 0 28.125 28.125 0 37.5 28.125 0 34.375 31.25 0 34.375 25 0 34.375 28.125 0 31.25 34.375 0 37.5 34.375 0 34.375 34.375 0 25 34.375 0 28.125 34.375 0 50 28.125 0 46.875 31.25 0 43.75 28.125 0 46.875 25 0 46.875 28.125 0 43.75 34.375 0 50 34.375 0 46.875 34.375 0 40.625 31.25 0 40.625 34.375 0 40.625 25 0 40.625 28.125 0 0 46.875 0 3.125 43.75 0 6.25 46.875 0 3.125 50 0 3.125 46.875 0 3.125 37.5 0 6.25 40.625 0 0 40.625 0 3.125 40.625 0 12.5 40.625 0 9.375 43.75 0 9.375 37.5 0 9.375 40.625 0 9.375 50 0 12.5 46.875 0 9.375 46.875 0 3.125 25 0 6.25 28.125 0 3.125 31.25 0 0 28.125 0 3.125 28.125 0 12.5 28.125 0 9.375 31.25 0 9.375 25 0 9.375 28.125 0 6.25 34.375 0 12.5 34.375 0 9.375 34.375 0 0 34.375 0 3.125 34.375 0 21.875 31.25 0 18.75 28.125 0 21.875 25 0 21.875 28.125 0 21.875 37.5 0 18.75 34.375 0 21.875 34.375 0 15.625 31.25 0 15.625 37.5 0 15.625 34.375 0 15.625 25 0 15.625 28.125 0 21.875 50 0 18.75 46.875 0 21.875 43.75 0 21.875 46.875 0 15.625 43.75 0 15.625 50 0 15.625 46.875 0 18.75 40.625 0 15.625 40.625 0 21.875 40.625 0 3.125 0 0 6.25 3.125 0 3.125 6.25 0 0 3.125 0 3.125 3.125 0 12.5 3.125 0 9.375 6.25 0 9.375 0 0 9.375 3.125 0 9.375 12.5 0 6.25 9.375 0 12.5 9.375 0 9.375 9.375 0 0 9.375 0 3.125 12.5 0 3.125 9.375 0 25 3.125 0 21.875 6.25 0 18.75 3.125 0 21.875 0 0 21.875 3.125 0 21.875 12.5 0 18.75 9.375 0 25 9.375 0 21.875 9.375 0 15.625 6.25 0 15.625 12.5 0 15.625 9.375 0 15.625 0 0 15.625 3.125 0 18.75 21.875 0 21.875 18.75 0 25 21.875 0 21.875 21.875 0 12.5 21.875 0 15.625 18.75 0 15.625 21.875 0 18.75 15.625 0 12.5 15.625 0 15.625 15.625 0 25 15.625 0 21.875 15.625 0 0 21.875 0 3.125 18.75 0 6.25 21.875 0 3.125 21.875 0 6.25 15.625 0 0 15.625 0 3.125 15.625 0 9.375 18.75 0 9.375 15.625 0 9.375 21.875 0 50 3.125 0 46.875 6.25 0 43.75 3.125 0 46.875 0 0 46.875 3.125 0 46.875 12.5 0 43.75 9.375 0 50 9.375 0 46.875 9.375 0 37.5 9.375 0 40.625 6.25 0 40.625 12.5 0 40.625 9.375 0 40.625 0 0 37.5 3.125 0 40.625 3.125 0 43.75 21.875 0 46.875 18.75 0 50 21.875 0 46.875 21.875 0 37.5 21.875 0 40.625 18.75 0 40.625 21.875 0 43.75 15.625 0 37.5 15.625 0 40.625 15.625 0 50 15.625 0 46.875 15.625 0 28.125 18.75 0 31.25 21.875 0 28.125 21.875 0 28.125 12.5 0 31.25 15.625 0 28.125 15.625 0 34.375 18.75 0 34.375 12.5 0 34.375 15.625 0 34.375 21.875 0 28.125 0 0 31.25 3.125 0 28.125 6.25 0 28.125 3.125 0 34.375 6.25 0 34.375 0 0 34.375 3.125 0 31.25 9.375 0 34.375 9.375 0 28.125 9.375 0 -50 46.875 0 -46.875 43.75 0 -43.75 46.875 0 -46.875 50 0 -46.875 46.875 0 -46.875 37.5 0 -43.75 40.625 0 -50 40.625 0 -46.875 40.625 0 -37.5 40.625 0 -40.625 43.75 0 -40.625 37.5 0 -40.625 40.625 0 -40.625 50 0 -37.5 46.875 0 -40.625 46.875 0 -46.875 25 0 -43.75 28.125 0 -46.875 31.25 0 -50 28.125 0 -46.875 28.125 0 -37.5 28.125 0 -40.625 31.25 0 -40.625 25 0 -40.625 28.125 0 -43.75 34.375 0 -37.5 34.375 0 -40.625 34.375 0 -50 34.375 0 -46.875 34.375 0 -25 28.125 0 -28.125 31.25 0 -31.25 28.125 0 -28.125 25 0 -28.125 28.125 0 -28.125 37.5 0 -31.25 34.375 0 -25 34.375 0 -28.125 34.375 0 -34.375 31.25 0 -34.375 37.5 0 -34.375 34.375 0 -34.375 25 0 -34.375 28.125 0 -28.125 50 0 -31.25 46.875 0 -28.125 43.75 0 -25 46.875 0 -28.125 46.875 0 -34.375 43.75 0 -34.375 50 0 -34.375 46.875 0 -31.25 40.625 0 -34.375 40.625 0 -25 40.625 0 -28.125 40.625 0 -46.875 0 0 -43.75 3.125 0 -46.875 6.25 0 -50 3.125 0 -46.875 3.125 0 -37.5 3.125 0 -40.625 6.25 0 -40.625 0 0 -40.625 3.125 0 -40.625 12.5 0 -43.75 9.375 0 -37.5 9.375 0 -40.625 9.375 0 -50 9.375 0 -46.875 12.5 0 -46.875 9.375 0 -25 3.125 0 -28.125 6.25 0 -31.25 3.125 0 -28.125 0 0 -28.125 3.125 0 -28.125 12.5 0 -31.25 9.375 0 -25 9.375 0 -28.125 9.375 0 -34.375 6.25 0 -34.375 12.5 0 -34.375 9.375 0 -34.375 0 0 -34.375 3.125 0 -31.25 21.875 0 -28.125 18.75 0 -25 21.875 0 -28.125 21.875 0 -37.5 21.875 0 -34.375 18.75 0 -34.375 21.875 0 -31.25 15.625 0 -37.5 15.625 0 -34.375 15.625 0 -25 15.625 0 -28.125 15.625 0 -50 21.875 0 -46.875 18.75 0 -43.75 21.875 0 -46.875 21.875 0 -43.75 15.625 0 -50 15.625 0 -46.875 15.625 0 -40.625 18.75 0 -40.625 15.625 0 -40.625 21.875 0 -3.125 6.25 0 -6.25 3.125 0 -3.125 0 0 -3.125 3.125 0 -3.125 12.5 0 -6.25 9.375 0 -3.125 9.375 0 -12.5 9.375 0 -9.375 6.25 0 -9.375 12.5 0 -9.375 9.375 0 -9.375 0 0 -12.5 3.125 0 -9.375 3.125 0 -3.125 25 0 -6.25 21.875 0 -3.125 18.75 0 -3.125 21.875 0 -12.5 21.875 0 -9.375 18.75 0 -9.375 25 0 -9.375 21.875 0 -6.25 15.625 0 -12.5 15.625 0 -9.375 15.625 0 -3.125 15.625 0 -21.875 18.75 0 -18.75 21.875 0 -21.875 25 0 -21.875 21.875 0 -21.875 12.5 0 -18.75 15.625 0 -21.875 15.625 0 -15.625 18.75 0 -15.625 12.5 0 -15.625 15.625 0 -15.625 25 0 -15.625 21.875 0 -21.875 0 0 -18.75 3.125 0 -21.875 6.25 0 -21.875 3.125 0 -15.625 6.25 0 -15.625 0 0 -15.625 3.125 0 -18.75 9.375 0 -15.625 9.375 0 -21.875 9.375 0 -3.125 50 0 -6.25 46.875 0 -3.125 43.75 0 -3.125 46.875 0 -12.5 46.875 0 -9.375 43.75 0 -9.375 50 0 -9.375 46.875 0 -9.375 37.5 0 -6.25 40.625 0 -12.5 40.625 0 -9.375 40.625 0 -3.125 37.5 0 -3.125 40.625 0 -21.875 43.75 0 -18.75 46.875 0 -21.875 50 0 -21.875 46.875 0 -21.875 37.5 0 -18.75 40.625 0 -21.875 40.625 0 -15.625 43.75 0 -15.625 37.5 0 -15.625 40.625 0 -15.625 50 0 -15.625 46.875 0 -18.75 28.125 0 -21.875 31.25 0 -21.875 28.125 0 -12.5 28.125 0 -15.625 31.25 0 -15.625 28.125 0 -18.75 34.375 0 -12.5 34.375 0 -15.625 34.375 0 -21.875 34.375 0 -3.125 31.25 0 -6.25 28.125 0 -3.125 28.125 0 -6.25 34.375 0 -3.125 34.375 0 -9.375 31.25 0 -9.375 34.375 0 -9.375 28.125 0 -46.875 -50 0 -43.75 -46.875 0 -46.875 -43.75 0 -50 -46.875 0 -46.875 -46.875 0 -37.5 -46.875 0 -40.625 -43.75 0 -40.625 -50 0 -40.625 -46.875 0 -40.625 -37.5 0 -43.75 -40.625 0 -37.5 -40.625 0 -40.625 -40.625 0 -50 -40.625 0 -46.875 -37.5 0 -46.875 -40.625 0 -25 -46.875 0 -28.125 -43.75 0 -31.25 -46.875 0 -28.125 -50 0 -28.125 -46.875 0 -28.125 -37.5 0 -31.25 -40.625 0 -25 -40.625 0 -28.125 -40.625 0 -34.375 -43.75 0 -34.375 -37.5 0 -34.375 -40.625 0 -34.375 -50 0 -34.375 -46.875 0 -28.125 -25 0 -31.25 -28.125 0 -28.125 -31.25 0 -25 -28.125 0 -28.125 -28.125 0 -37.5 -28.125 0 -34.375 -31.25 0 -34.375 -25 0 -34.375 -28.125 0 -31.25 -34.375 0 -37.5 -34.375 0 -34.375 -34.375 0 -25 -34.375 0 -28.125 -34.375 0 -50 -28.125 0 -46.875 -31.25 0 -43.75 -28.125 0 -46.875 -25 0 -46.875 -28.125 0 -43.75 -34.375 0 -50 -34.375 0 -46.875 -34.375 0 -40.625 -31.25 0 -40.625 -34.375 0 -40.625 -25 0 -40.625 -28.125 0 0 -46.875 0 -3.125 -43.75 0 -6.25 -46.875 0 -3.125 -50 0 -3.125 -46.875 0 -3.125 -37.5 0 -6.25 -40.625 0 0 -40.625 0 -3.125 -40.625 0 -12.5 -40.625 0 -9.375 -43.75 0 -9.375 -37.5 0 -9.375 -40.625 0 -9.375 -50 0 -12.5 -46.875 0 -9.375 -46.875 0 -3.125 -25 0 -6.25 -28.125 0 -3.125 -31.25 0 0 -28.125 0 -3.125 -28.125 0 -12.5 -28.125 0 -9.375 -31.25 0 -9.375 -25 0 -9.375 -28.125 0 -6.25 -34.375 0 -12.5 -34.375 0 -9.375 -34.375 0 0 -34.375 0 -3.125 -34.375 0 -21.875 -31.25 0 -18.75 -28.125 0 -21.875 -25 0 -21.875 -28.125 0 -21.875 -37.5 0 -18.75 -34.375 0 -21.875 -34.375 0 -15.625 -31.25 0 -15.625 -37.5 0 -15.625 -34.375 0 -15.625 -25 0 -15.625 -28.125 0 -21.875 -50 0 -18.75 -46.875 0 -21.875 -43.75 0 -21.875 -46.875 0 -15.625 -43.75 0 -15.625 -50 0 -15.625 -46.875 0 -18.75 -40.625 0 -15.625 -40.625 0 -21.875 -40.625 0 -6.25 -3.125 0 -3.125 -6.25 0 0 -3.125 0 -3.125 -3.125 0 -12.5 -3.125 0 -9.375 -6.25 0 -9.375 -3.125 0 -9.375 -12.5 0 -6.25 -9.375 0 -12.5 -9.375 0 -9.375 -9.375 0 0 -9.375 0 -3.125 -12.5 0 -3.125 -9.375 0 -25 -3.125 0 -21.875 -6.25 0 -18.75 -3.125 0 -21.875 -3.125 0 -21.875 -12.5 0 -18.75 -9.375 0 -25 -9.375 0 -21.875 -9.375 0 -15.625 -6.25 0 -15.625 -12.5 0 -15.625 -9.375 0 -15.625 -3.125 0 -18.75 -21.875 0 -21.875 -18.75 0 -25 -21.875 0 -21.875 -21.875 0 -12.5 -21.875 0 -15.625 -18.75 0 -15.625 -21.875 0 -18.75 -15.625 0 -12.5 -15.625 0 -15.625 -15.625 0 -25 -15.625 0 -21.875 -15.625 0 0 -21.875 0 -3.125 -18.75 0 -6.25 -21.875 0 -3.125 -21.875 0 -6.25 -15.625 0 0 -15.625 0 -3.125 -15.625 0 -9.375 -18.75 0 -9.375 -15.625 0 -9.375 -21.875 0 -50 -3.125 0 -46.875 -6.25 0 -43.75 -3.125 0 -46.875 -3.125 0 -46.875 -12.5 0 -43.75 -9.375 0 -50 -9.375 0 -46.875 -9.375 0 -37.5 -9.375 0 -40.625 -6.25 0 -40.625 -12.5 0 -40.625 -9.375 0 -37.5 -3.125 0 -40.625 -3.125 0 -43.75 -21.875 0 -46.875 -18.75 0 -50 -21.875 0 -46.875 -21.875 0 -37.5 -21.875 0 -40.625 -18.75 0 -40.625 -21.875 0 -43.75 -15.625 0 -37.5 -15.625 0 -40.625 -15.625 0 -50 -15.625 0 -46.875 -15.625 0 -28.125 -18.75 0 -31.25 -21.875 0 -28.125 -21.875 0 -28.125 -12.5 0 -31.25 -15.625 0 -28.125 -15.625 0 -34.375 -18.75 0 -34.375 -12.5 0 -34.375 -15.625 0 -34.375 -21.875 0 -31.25 -3.125 0 -28.125 -6.25 0 -28.125 -3.125 0 -34.375 -6.25 0 -34.375 -3.125 0 -31.25 -9.375 0 -34.375 -9.375 0 -28.125 -9.375 0 50 -46.875 0 46.875 -43.75 0 43.75 -46.875 0 46.875 -50 0 46.875 -46.875 0 46.875 -37.5 0 43.75 -40.625 0 50 -40.625 0 46.875 -40.625 0 37.5 -40.625 0 40.625 -43.75 0 40.625 -37.5 0 40.625 -40.625 0 40.625 -50 0 37.5 -46.875 0 40.625 -46.875 0 46.875 -25 0 43.75 -28.125 0 46.875 -31.25 0 50 -28.125 0 46.875 -28.125 0 37.5 -28.125 0 40.625 -31.25 0 40.625 -25 0 40.625 -28.125 0 43.75 -34.375 0 37.5 -34.375 0 40.625 -34.375 0 50 -34.375 0 46.875 -34.375 0 25 -28.125 0 28.125 -31.25 0 31.25 -28.125 0 28.125 -25 0 28.125 -28.125 0 28.125 -37.5 0 31.25 -34.375 0 25 -34.375 0 28.125 -34.375 0 34.375 -31.25 0 34.375 -37.5 0 34.375 -34.375 0 34.375 -25 0 34.375 -28.125 0 28.125 -50 0 31.25 -46.875 0 28.125 -43.75 0 25 -46.875 0 28.125 -46.875 0 34.375 -43.75 0 34.375 -50 0 34.375 -46.875 0 31.25 -40.625 0 34.375 -40.625 0 25 -40.625 0 28.125 -40.625 0 43.75 -3.125 0 46.875 -6.25 0 50 -3.125 0 46.875 -3.125 0 37.5 -3.125 0 40.625 -6.25 0 40.625 -3.125 0 40.625 -12.5 0 43.75 -9.375 0 37.5 -9.375 0 40.625 -9.375 0 50 -9.375 0 46.875 -12.5 0 46.875 -9.375 0 25 -3.125 0 28.125 -6.25 0 31.25 -3.125 0 28.125 -3.125 0 28.125 -12.5 0 31.25 -9.375 0 25 -9.375 0 28.125 -9.375 0 34.375 -6.25 0 34.375 -12.5 0 34.375 -9.375 0 34.375 -3.125 0 31.25 -21.875 0 28.125 -18.75 0 25 -21.875 0 28.125 -21.875 0 37.5 -21.875 0 34.375 -18.75 0 34.375 -21.875 0 31.25 -15.625 0 37.5 -15.625 0 34.375 -15.625 0 25 -15.625 0 28.125 -15.625 0 50 -21.875 0 46.875 -18.75 0 43.75 -21.875 0 46.875 -21.875 0 43.75 -15.625 0 50 -15.625 0 46.875 -15.625 0 40.625 -18.75 0 40.625 -15.625 0 40.625 -21.875 0 3.125 -6.25 0 6.25 -3.125 0 3.125 -3.125 0 3.125 -12.5 0 6.25 -9.375 0 3.125 -9.375 0 12.5 -9.375 0 9.375 -6.25 0 9.375 -12.5 0 9.375 -9.375 0 12.5 -3.125 0 9.375 -3.125 0 3.125 -25 0 6.25 -21.875 0 3.125 -18.75 0 3.125 -21.875 0 12.5 -21.875 0 9.375 -18.75 0 9.375 -25 0 9.375 -21.875 0 6.25 -15.625 0 12.5 -15.625 0 9.375 -15.625 0 3.125 -15.625 0 21.875 -18.75 0 18.75 -21.875 0 21.875 -25 0 21.875 -21.875 0 21.875 -12.5 0 18.75 -15.625 0 21.875 -15.625 0 15.625 -18.75 0 15.625 -12.5 0 15.625 -15.625 0 15.625 -25 0 15.625 -21.875 0 18.75 -3.125 0 21.875 -6.25 0 21.875 -3.125 0 15.625 -6.25 0 15.625 -3.125 0 18.75 -9.375 0 15.625 -9.375 0 21.875 -9.375 0 3.125 -50 0 6.25 -46.875 0 3.125 -43.75 0 3.125 -46.875 0 12.5 -46.875 0 9.375 -43.75 0 9.375 -50 0 9.375 -46.875 0 9.375 -37.5 0 6.25 -40.625 0 12.5 -40.625 0 9.375 -40.625 0 3.125 -37.5 0 3.125 -40.625 0 21.875 -43.75 0 18.75 -46.875 0 21.875 -50 0 21.875 -46.875 0 21.875 -37.5 0 18.75 -40.625 0 21.875 -40.625 0 15.625 -43.75 0 15.625 -37.5 0 15.625 -40.625 0 15.625 -50 0 15.625 -46.875 0 18.75 -28.125 0 21.875 -31.25 0 21.875 -28.125 0 12.5 -28.125 0 15.625 -31.25 0 15.625 -28.125 0 18.75 -34.375 0 12.5 -34.375 0 15.625 -34.375 0 21.875 -34.375 0 3.125 -31.25 0 6.25 -28.125 0 3.125 -28.125 0 6.25 -34.375 0 3.125 -34.375 0 9.375 -31.25 0 9.375 -34.375 0 9.375 -28.125 0</float_array>
+ <technique_common>
+ <accessor source="#Plane32X32-positions-array" count="1089" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane32X32-normals" name="normal">
+ <float_array id="Plane32X32-normals-array" count="3267">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#Plane32X32-normals-array" count="1089" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane32X32-Rectangle-UV" name="Rectangle-UV">
+ <float_array id="Plane32X32-Rectangle-UV-array" count="2178">1 1 0.96875 1 1 0.96875 0.96875 0.96875 0.9375 0.9375 0.96875 0.9375 0.9375 0.96875 0.875 1 0.875 0.96875 0.90625 1 0.90625 0.96875 0.90625 0.9375 0.875 0.875 0.90625 0.875 0.875 0.90625 0.90625 0.90625 0.9375 0.90625 1 0.875 1 0.90625 0.96875 0.875 0.96875 0.90625 0.75 1 0.75 0.96875 0.78125 1 0.78125 0.96875 0.8125 0.9375 0.8125 0.96875 0.78125 0.9375 0.75 0.875 0.78125 0.875 0.75 0.90625 0.78125 0.90625 0.8125 0.90625 0.84375 0.875 0.84375 0.90625 0.84375 0.9375 0.84375 1 0.84375 0.96875 0.75 0.75 0.78125 0.75 0.75 0.78125 0.78125 0.78125 0.8125 0.8125 0.78125 0.8125 0.8125 0.78125 0.875 0.75 0.875 0.78125 0.84375 0.75 0.84375 0.78125 0.84375 0.8125 0.875 0.84375 0.84375 0.84375 0.8125 0.84375 0.75 0.84375 0.78125 0.84375 1 0.75 1 0.78125 0.96875 0.75 0.96875 0.78125 0.9375 0.8125 0.9375 0.78125 0.96875 0.8125 1 0.84375 0.96875 0.84375 0.9375 0.84375 0.90625 0.84375 0.90625 0.8125 0.90625 0.75 0.90625 0.78125 0.5 1 0.5 0.96875 0.53125 1 0.53125 0.96875 0.5625 0.9375 0.5625 0.96875 0.53125 0.9375 0.5 0.875 0.53125 0.875 0.5 0.90625 0.53125 0.90625 0.5625 0.90625 0.625 0.875 0.625 0.90625 0.59375 0.875 0.59375 0.90625 0.59375 0.9375 0.625 1 0.59375 1 0.625 0.96875 0.59375 0.96875 0.5 0.75 0.53125 0.75 0.5 0.78125 0.53125 0.78125 0.5625 0.8125 0.53125 0.8125 0.5625 0.78125 0.625 0.75 0.625 0.78125 0.59375 0.75 0.59375 0.78125 0.59375 0.8125 0.625 0.84375 0.59375 0.84375 0.5625 0.84375 0.5 0.84375 0.53125 0.84375 0.71875 0.75 0.71875 0.78125 0.6875 0.8125 0.6875 0.78125 0.71875 0.8125 0.71875 0.875 0.71875 0.84375 0.6875 0.84375 0.65625 0.875 0.65625 0.84375 0.65625 0.8125 0.65625 0.75 0.65625 0.78125 0.71875 1 0.71875 0.96875 0.6875 0.9375 0.71875 0.9375 0.6875 0.96875 0.65625 1 0.65625 0.96875 0.65625 0.9375 0.65625 0.90625 0.6875 0.90625 0.71875 0.90625 0.5 0.5 0.53125 0.5 0.5 0.53125 0.53125 0.53125 0.5625 0.5625 0.53125 0.5625 0.5625 0.53125 0.625 0.5 0.625 0.53125 0.59375 0.5 0.59375 0.53125 0.59375 0.5625 0.625 0.625 0.59375 0.625 0.625 0.59375 0.59375 0.59375 0.5625 0.59375 0.5 0.625 0.5 0.59375 0.53125 0.625 0.53125 0.59375 0.75 0.5 0.75 0.53125 0.71875 0.5 0.71875 0.53125 0.6875 0.5625 0.6875 0.53125 0.71875 0.5625 0.75 0.625 0.71875 0.625 0.75 0.59375 0.71875 0.59375 0.6875 0.59375 0.65625 0.625 0.65625 0.59375 0.65625 0.5625 0.65625 0.5 0.65625 0.53125 0.75 0.71875 0.71875 0.71875 0.6875 0.6875 0.71875 0.6875 0.6875 0.71875 0.625 0.71875 0.65625 0.71875 0.65625 0.6875 0.625 0.65625 0.65625 0.65625 0.6875 0.65625 0.75 0.65625 0.71875 0.65625 0.5 0.71875 0.53125 0.71875 0.5625 0.6875 0.5625 0.71875 0.53125 0.6875 0.5 0.65625 0.53125 0.65625 0.5625 0.65625 0.59375 0.65625 0.59375 0.6875 0.59375 0.71875 1 0.5 1 0.53125 0.96875 0.5 0.96875 0.53125 0.9375 0.5625 0.9375 0.53125 0.96875 0.5625 1 0.625 0.96875 0.625 1 0.59375 0.96875 0.59375 0.9375 0.59375 0.875 0.625 0.875 0.59375 0.90625 0.625 0.90625 0.59375 0.90625 0.5625 0.875 0.5 0.90625 0.5 0.875 0.53125 0.90625 0.53125 1 0.71875 0.96875 0.71875 0.9375 0.6875 0.96875 0.6875 0.9375 0.71875 0.875 0.71875 0.90625 0.71875 0.90625 0.6875 0.875 0.65625 0.90625 0.65625 0.9375 0.65625 1 0.65625 0.96875 0.65625 0.78125 0.71875 0.8125 0.6875 0.8125 0.71875 0.78125 0.6875 0.78125 0.625 0.78125 0.65625 0.8125 0.65625 0.84375 0.625 0.84375 0.65625 0.84375 0.6875 0.84375 0.71875 0.78125 0.5 0.78125 0.53125 0.8125 0.5625 0.78125 0.5625 0.8125 0.53125 0.84375 0.5 0.84375 0.53125 0.84375 0.5625 0.84375 0.59375 0.8125 0.59375 0.78125 0.59375 0 1 0 0.96875 0.03125 1 0.03125 0.96875 0.0625 0.9375 0.0625 0.96875 0.03125 0.9375 0 0.875 0.03125 0.875 0 0.90625 0.03125 0.90625 0.0625 0.90625 0.125 0.875 0.125 0.90625 0.09375 0.875 0.09375 0.90625 0.09375 0.9375 0.125 1 0.09375 1 0.125 0.96875 0.09375 0.96875 0 0.75 0.03125 0.75 0 0.78125 0.03125 0.78125 0.0625 0.8125 0.03125 0.8125 0.0625 0.78125 0.125 0.75 0.125 0.78125 0.09375 0.75 0.09375 0.78125 0.09375 0.8125 0.125 0.84375 0.09375 0.84375 0.0625 0.84375 0 0.84375 0.03125 0.84375 0.25 0.75 0.25 0.78125 0.21875 0.75 0.21875 0.78125 0.1875 0.8125 0.1875 0.78125 0.21875 0.8125 0.25 0.875 0.21875 0.875 0.25 0.84375 0.21875 0.84375 0.1875 0.84375 0.15625 0.875 0.15625 0.84375 0.15625 0.8125 0.15625 0.75 0.15625 0.78125 0.25 1 0.21875 1 0.25 0.96875 0.21875 0.96875 0.1875 0.9375 0.21875 0.9375 0.1875 0.96875 0.15625 1 0.15625 0.96875 0.15625 0.9375 0.15625 0.90625 0.1875 0.90625 0.25 0.90625 0.21875 0.90625 0 0.5 0.03125 0.5 0 0.53125 0.03125 0.53125 0.0625 0.5625 0.03125 0.5625 0.0625 0.53125 0.125 0.5 0.125 0.53125 0.09375 0.5 0.09375 0.53125 0.09375 0.5625 0.125 0.625 0.09375 0.625 0.125 0.59375 0.09375 0.59375 0.0625 0.59375 0 0.625 0 0.59375 0.03125 0.625 0.03125 0.59375 0.25 0.5 0.25 0.53125 0.21875 0.5 0.21875 0.53125 0.1875 0.5625 0.1875 0.53125 0.21875 0.5625 0.25 0.625 0.21875 0.625 0.25 0.59375 0.21875 0.59375 0.1875 0.59375 0.15625 0.625 0.15625 0.59375 0.15625 0.5625 0.15625 0.5 0.15625 0.53125 0.25 0.71875 0.21875 0.71875 0.1875 0.6875 0.21875 0.6875 0.1875 0.71875 0.125 0.71875 0.15625 0.71875 0.15625 0.6875 0.125 0.65625 0.15625 0.65625 0.1875 0.65625 0.25 0.65625 0.21875 0.65625 0 0.71875 0.03125 0.71875 0.0625 0.6875 0.0625 0.71875 0.03125 0.6875 0 0.65625 0.03125 0.65625 0.0625 0.65625 0.09375 0.65625 0.09375 0.6875 0.09375 0.71875 0.46875 0.5 0.46875 0.53125 0.4375 0.5625 0.4375 0.53125 0.46875 0.5625 0.46875 0.625 0.46875 0.59375 0.4375 0.59375 0.375 0.625 0.375 0.59375 0.40625 0.625 0.40625 0.59375 0.40625 0.5625 0.375 0.5 0.40625 0.5 0.375 0.53125 0.40625 0.53125 0.46875 0.75 0.46875 0.71875 0.4375 0.6875 0.46875 0.6875 0.4375 0.71875 0.375 0.75 0.375 0.71875 0.40625 0.75 0.40625 0.71875 0.40625 0.6875 0.375 0.65625 0.40625 0.65625 0.4375 0.65625 0.46875 0.65625 0.28125 0.75 0.28125 0.71875 0.3125 0.6875 0.3125 0.71875 0.28125 0.6875 0.28125 0.625 0.28125 0.65625 0.3125 0.65625 0.34375 0.625 0.34375 0.65625 0.34375 0.6875 0.34375 0.75 0.34375 0.71875 0.28125 0.5 0.28125 0.53125 0.3125 0.5625 0.28125 0.5625 0.3125 0.53125 0.34375 0.5 0.34375 0.53125 0.34375 0.5625 0.34375 0.59375 0.3125 0.59375 0.28125 0.59375 0.46875 1 0.46875 0.96875 0.4375 0.9375 0.46875 0.9375 0.4375 0.96875 0.375 1 0.375 0.96875 0.40625 1 0.40625 0.96875 0.40625 0.9375 0.375 0.875 0.40625 0.875 0.375 0.90625 0.40625 0.90625 0.4375 0.90625 0.46875 0.875 0.46875 0.90625 0.28125 1 0.28125 0.96875 0.3125 0.9375 0.3125 0.96875 0.28125 0.9375 0.28125 0.875 0.28125 0.90625 0.3125 0.90625 0.34375 0.875 0.34375 0.90625 0.34375 0.9375 0.34375 1 0.34375 0.96875 0.28125 0.78125 0.3125 0.8125 0.28125 0.8125 0.3125 0.78125 0.375 0.78125 0.34375 0.78125 0.34375 0.8125 0.375 0.84375 0.34375 0.84375 0.3125 0.84375 0.28125 0.84375 0.46875 0.78125 0.4375 0.8125 0.4375 0.78125 0.46875 0.8125 0.46875 0.84375 0.4375 0.84375 0.40625 0.84375 0.40625 0.8125 0.40625 0.78125 0 0 0.03125 0 0 0.03125 0.03125 0.03125 0.0625 0.0625 0.03125 0.0625 0.0625 0.03125 0.125 0 0.125 0.03125 0.09375 0 0.09375 0.03125 0.09375 0.0625 0.125 0.125 0.09375 0.125 0.125 0.09375 0.09375 0.09375 0.0625 0.09375 0 0.125 0 0.09375 0.03125 0.125 0.03125 0.09375 0.25 0 0.25 0.03125 0.21875 0 0.21875 0.03125 0.1875 0.0625 0.1875 0.03125 0.21875 0.0625 0.25 0.125 0.21875 0.125 0.25 0.09375 0.21875 0.09375 0.1875 0.09375 0.15625 0.125 0.15625 0.09375 0.15625 0.0625 0.15625 0 0.15625 0.03125 0.25 0.25 0.21875 0.25 0.25 0.21875 0.21875 0.21875 0.1875 0.1875 0.21875 0.1875 0.1875 0.21875 0.125 0.25 0.125 0.21875 0.15625 0.25 0.15625 0.21875 0.15625 0.1875 0.125 0.15625 0.15625 0.15625 0.1875 0.15625 0.25 0.15625 0.21875 0.15625 0 0.25 0 0.21875 0.03125 0.25 0.03125 0.21875 0.0625 0.1875 0.0625 0.21875 0.03125 0.1875 0 0.15625 0.03125 0.15625 0.0625 0.15625 0.09375 0.15625 0.09375 0.1875 0.09375 0.25 0.09375 0.21875 0.5 0 0.5 0.03125 0.46875 0 0.46875 0.03125 0.4375 0.0625 0.4375 0.03125 0.46875 0.0625 0.5 0.125 0.46875 0.125 0.5 0.09375 0.46875 0.09375 0.4375 0.09375 0.375 0.125 0.375 0.09375 0.40625 0.125 0.40625 0.09375 0.40625 0.0625 0.375 0 0.40625 0 0.375 0.03125 0.40625 0.03125 0.5 0.25 0.46875 0.25 0.5 0.21875 0.46875 0.21875 0.4375 0.1875 0.46875 0.1875 0.4375 0.21875 0.375 0.25 0.375 0.21875 0.40625 0.25 0.40625 0.21875 0.40625 0.1875 0.375 0.15625 0.40625 0.15625 0.4375 0.15625 0.5 0.15625 0.46875 0.15625 0.28125 0.25 0.28125 0.21875 0.3125 0.1875 0.3125 0.21875 0.28125 0.1875 0.28125 0.125 0.28125 0.15625 0.3125 0.15625 0.34375 0.125 0.34375 0.15625 0.34375 0.1875 0.34375 0.25 0.34375 0.21875 0.28125 0 0.28125 0.03125 0.3125 0.0625 0.28125 0.0625 0.3125 0.03125 0.34375 0 0.34375 0.03125 0.34375 0.0625 0.34375 0.09375 0.3125 0.09375 0.28125 0.09375 0.5 0.46875 0.46875 0.46875 0.4375 0.4375 0.46875 0.4375 0.4375 0.46875 0.375 0.46875 0.40625 0.46875 0.40625 0.4375 0.375 0.375 0.40625 0.375 0.375 0.40625 0.40625 0.40625 0.4375 0.40625 0.5 0.375 0.5 0.40625 0.46875 0.375 0.46875 0.40625 0.25 0.46875 0.28125 0.46875 0.3125 0.4375 0.3125 0.46875 0.28125 0.4375 0.25 0.375 0.28125 0.375 0.25 0.40625 0.28125 0.40625 0.3125 0.40625 0.34375 0.375 0.34375 0.40625 0.34375 0.4375 0.34375 0.46875 0.25 0.28125 0.28125 0.28125 0.3125 0.3125 0.28125 0.3125 0.3125 0.28125 0.375 0.28125 0.34375 0.28125 0.34375 0.3125 0.375 0.34375 0.34375 0.34375 0.3125 0.34375 0.25 0.34375 0.28125 0.34375 0.5 0.28125 0.46875 0.28125 0.4375 0.3125 0.4375 0.28125 0.46875 0.3125 0.5 0.34375 0.46875 0.34375 0.4375 0.34375 0.40625 0.34375 0.40625 0.3125 0.40625 0.28125 0 0.46875 0.03125 0.46875 0.0625 0.4375 0.0625 0.46875 0.03125 0.4375 0 0.375 0.03125 0.375 0 0.40625 0.03125 0.40625 0.0625 0.40625 0.125 0.375 0.125 0.40625 0.09375 0.375 0.09375 0.40625 0.09375 0.4375 0.125 0.46875 0.09375 0.46875 0 0.28125 0.03125 0.28125 0.0625 0.3125 0.03125 0.3125 0.0625 0.28125 0.125 0.28125 0.09375 0.28125 0.09375 0.3125 0.125 0.34375 0.09375 0.34375 0.0625 0.34375 0 0.34375 0.03125 0.34375 0.21875 0.28125 0.1875 0.3125 0.1875 0.28125 0.21875 0.3125 0.21875 0.375 0.21875 0.34375 0.1875 0.34375 0.15625 0.375 0.15625 0.34375 0.15625 0.3125 0.15625 0.28125 0.21875 0.46875 0.1875 0.4375 0.21875 0.4375 0.1875 0.46875 0.15625 0.46875 0.15625 0.4375 0.15625 0.40625 0.1875 0.40625 0.21875 0.40625 1 0 1 0.03125 0.96875 0 0.96875 0.03125 0.9375 0.0625 0.9375 0.03125 0.96875 0.0625 1 0.125 0.96875 0.125 1 0.09375 0.96875 0.09375 0.9375 0.09375 0.875 0.125 0.875 0.09375 0.90625 0.125 0.90625 0.09375 0.90625 0.0625 0.875 0 0.90625 0 0.875 0.03125 0.90625 0.03125 1 0.25 0.96875 0.25 1 0.21875 0.96875 0.21875 0.9375 0.1875 0.96875 0.1875 0.9375 0.21875 0.875 0.25 0.875 0.21875 0.90625 0.25 0.90625 0.21875 0.90625 0.1875 0.875 0.15625 0.90625 0.15625 0.9375 0.15625 1 0.15625 0.96875 0.15625 0.75 0.25 0.75 0.21875 0.78125 0.25 0.78125 0.21875 0.8125 0.1875 0.8125 0.21875 0.78125 0.1875 0.75 0.125 0.78125 0.125 0.75 0.15625 0.78125 0.15625 0.8125 0.15625 0.84375 0.125 0.84375 0.15625 0.84375 0.1875 0.84375 0.25 0.84375 0.21875 0.75 0 0.78125 0 0.75 0.03125 0.78125 0.03125 0.8125 0.0625 0.78125 0.0625 0.8125 0.03125 0.84375 0 0.84375 0.03125 0.84375 0.0625 0.84375 0.09375 0.8125 0.09375 0.75 0.09375 0.78125 0.09375 1 0.46875 0.96875 0.46875 0.9375 0.4375 0.96875 0.4375 0.9375 0.46875 0.875 0.46875 0.90625 0.46875 0.90625 0.4375 0.875 0.375 0.90625 0.375 0.875 0.40625 0.90625 0.40625 0.9375 0.40625 1 0.375 1 0.40625 0.96875 0.375 0.96875 0.40625 0.75 0.46875 0.78125 0.46875 0.8125 0.4375 0.8125 0.46875 0.78125 0.4375 0.75 0.375 0.78125 0.375 0.75 0.40625 0.78125 0.40625 0.8125 0.40625 0.84375 0.375 0.84375 0.40625 0.84375 0.4375 0.84375 0.46875 0.75 0.28125 0.78125 0.28125 0.8125 0.3125 0.78125 0.3125 0.8125 0.28125 0.875 0.28125 0.84375 0.28125 0.84375 0.3125 0.875 0.34375 0.84375 0.34375 0.8125 0.34375 0.75 0.34375 0.78125 0.34375 1 0.28125 0.96875 0.28125 0.9375 0.3125 0.9375 0.28125 0.96875 0.3125 1 0.34375 0.96875 0.34375 0.9375 0.34375 0.90625 0.34375 0.90625 0.3125 0.90625 0.28125 0.53125 0.46875 0.5625 0.4375 0.5625 0.46875 0.53125 0.4375 0.53125 0.375 0.53125 0.40625 0.5625 0.40625 0.625 0.375 0.625 0.40625 0.59375 0.375 0.59375 0.40625 0.59375 0.4375 0.625 0.46875 0.59375 0.46875 0.53125 0.25 0.53125 0.28125 0.5625 0.3125 0.53125 0.3125 0.5625 0.28125 0.625 0.25 0.625 0.28125 0.59375 0.25 0.59375 0.28125 0.59375 0.3125 0.625 0.34375 0.59375 0.34375 0.5625 0.34375 0.53125 0.34375 0.71875 0.25 0.71875 0.28125 0.6875 0.3125 0.6875 0.28125 0.71875 0.3125 0.71875 0.375 0.71875 0.34375 0.6875 0.34375 0.65625 0.375 0.65625 0.34375 0.65625 0.3125 0.65625 0.25 0.65625 0.28125 0.71875 0.46875 0.6875 0.4375 0.71875 0.4375 0.6875 0.46875 0.65625 0.46875 0.65625 0.4375 0.65625 0.40625 0.6875 0.40625 0.71875 0.40625 0.53125 0 0.53125 0.03125 0.5625 0.0625 0.53125 0.0625 0.5625 0.03125 0.625 0 0.625 0.03125 0.59375 0 0.59375 0.03125 0.59375 0.0625 0.625 0.125 0.59375 0.125 0.625 0.09375 0.59375 0.09375 0.5625 0.09375 0.53125 0.125 0.53125 0.09375 0.71875 0 0.71875 0.03125 0.6875 0.0625 0.6875 0.03125 0.71875 0.0625 0.71875 0.125 0.71875 0.09375 0.6875 0.09375 0.65625 0.125 0.65625 0.09375 0.65625 0.0625 0.65625 0 0.65625 0.03125 0.71875 0.21875 0.6875 0.1875 0.71875 0.1875 0.6875 0.21875 0.625 0.21875 0.65625 0.21875 0.65625 0.1875 0.625 0.15625 0.65625 0.15625 0.6875 0.15625 0.71875 0.15625 0.53125 0.21875 0.5625 0.1875 0.5625 0.21875 0.53125 0.1875 0.53125 0.15625 0.5625 0.15625 0.59375 0.15625 0.59375 0.1875 0.59375 0.21875 0.9375 1 1 0.9375 0.875 0.9375 0.9375 0.875 0.75 0.9375 0.8125 1 0.8125 0.875 0.8125 0.75 0.75 0.8125 0.875 0.8125 1 0.8125 0.9375 0.75 0.5 0.9375 0.5625 1 0.5625 0.875 0.625 0.9375 0.5625 0.75 0.5 0.8125 0.625 0.8125 0.6875 0.75 0.6875 0.875 0.6875 1 0.5625 0.5 0.5 0.5625 0.625 0.5625 0.5625 0.625 0.75 0.5625 0.6875 0.5 0.6875 0.625 0.75 0.6875 0.625 0.6875 0.5 0.6875 1 0.5625 0.9375 0.5 0.9375 0.625 0.875 0.5625 1 0.6875 0.875 0.6875 0.8125 0.625 0.8125 0.5 0 0.9375 0.0625 1 0.0625 0.875 0.125 0.9375 0.0625 0.75 0 0.8125 0.125 0.8125 0.25 0.8125 0.1875 0.75 0.1875 0.875 0.1875 1 0.25 0.9375 0.0625 0.5 0 0.5625 0.125 0.5625 0.0625 0.625 0.25 0.5625 0.1875 0.5 0.1875 0.625 0.25 0.6875 0.125 0.6875 0 0.6875 0.4375 0.5 0.4375 0.625 0.375 0.5625 0.4375 0.75 0.375 0.6875 0.3125 0.75 0.3125 0.625 0.3125 0.5 0.4375 1 0.375 0.9375 0.4375 0.875 0.3125 1 0.3125 0.875 0.375 0.8125 0.0625 0 0 0.0625 0.125 0.0625 0.0625 0.125 0.25 0.0625 0.1875 0 0.1875 0.125 0.1875 0.25 0.25 0.1875 0.125 0.1875 0 0.1875 0.0625 0.25 0.5 0.0625 0.4375 0 0.4375 0.125 0.375 0.0625 0.4375 0.25 0.5 0.1875 0.375 0.1875 0.3125 0.25 0.3125 0.125 0.3125 0 0.5 0.4375 0.375 0.4375 0.4375 0.375 0.25 0.4375 0.3125 0.375 0.25 0.3125 0.375 0.3125 0.5 0.3125 0 0.4375 0.0625 0.375 0.125 0.4375 0 0.3125 0.125 0.3125 0.1875 0.375 1 0.0625 0.9375 0 0.9375 0.125 0.875 0.0625 0.9375 0.25 1 0.1875 0.875 0.1875 0.75 0.1875 0.8125 0.25 0.8125 0.125 0.8125 0 0.75 0.0625 1 0.4375 0.875 0.4375 0.9375 0.375 0.75 0.4375 0.8125 0.375 0.75 0.3125 0.875 0.3125 1 0.3125 0.5625 0.375 0.625 0.4375 0.5625 0.25 0.625 0.3125 0.6875 0.25 0.6875 0.375 0.5625 0 0.625 0.0625 0.5625 0.125 0.6875 0 0.6875 0.125 0.625 0.1875</float_array>
+ <technique_common>
+ <accessor source="#Plane32X32-Rectangle-UV-array" count="1089" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane32X32-vertices">
+ <input semantic="POSITION" source="#Plane32X32-positions"/>
+ <input semantic="NORMAL" source="#Plane32X32-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="2048">
+ <input semantic="VERTEX" source="#Plane32X32-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane32X32-Rectangle-UV" offset="1" set="1"/>
+ <p>2 0 289 1 292 2 293 3 292 2 289 1 85 4 291 5 290 6 293 3 290 6 291 5 25 7 294 8 296 9 297 10 296 9 294 8 85 4 290 6 295 11 297 10 295 11 290 6 29 12 298 13 300 14 301 15 300 14 298 13 85 4 295 11 299 16 301 15 299 16 295 11 28 17 302 18 303 19 304 20 303 19 302 18 85 4 299 16 291 5 304 20 291 5 299 16 9 21 305 22 308 23 309 24 308 23 305 22 89 25 307 26 306 27 309 24 306 27 307 26 26 28 310 29 312 30 313 31 312 30 310 29 89 25 306 27 311 32 313 31 311 32 306 27 29 12 300 14 315 33 316 34 315 33 300 14 89 25 311 32 314 35 316 34 314 35 311 32 25 7 317 36 294 8 318 37 294 8 317 36 89 25 314 35 307 26 318 37 307 26 314 35 13 38 319 39 322 40 323 41 322 40 319 39 93 42 321 43 320 44 323 41 320 44 321 43 27 45 324 46 326 47 327 48 326 47 324 46 93 42 320 44 325 49 327 48 325 49 320 44 29 12 315 33 329 50 330 51 329 50 315 33 93 42 325 49 328 52 330 51 328 52 325 49 26 28 331 53 310 29 332 54 310 29 331 53 93 42 328 52 321 43 332 54 321 43 328 52 12 55 333 56 336 57 337 58 336 57 333 56 96 59 335 60 334 61 337 58 334 61 335 60 28 17 303 19 339 62 340 63 339 62 303 19 96 59 334 61 338 64 340 63 338 64 334 61 29 12 329 50 298 13 342 65 298 13 329 50 96 59 338 64 341 66 342 65 341 66 338 64 27 45 343 67 324 46 344 68 324 46 343 67 96 59 341 66 335 60 344 68 335 60 341 66 4 69 345 70 348 71 349 72 348 71 345 70 101 73 347 74 346 75 349 72 346 75 347 74 30 76 350 77 352 78 353 79 352 78 350 77 101 73 346 75 351 80 353 79 351 80 346 75 33 81 354 82 356 83 357 84 356 83 354 82 101 73 351 80 355 85 357 84 355 85 351 80 32 86 358 87 359 88 360 89 359 88 358 87 101 73 355 85 347 74 360 89 347 74 355 85 10 90 361 91 364 92 365 93 364 92 361 91 105 94 363 95 362 96 365 93 362 96 363 95 31 97 366 98 368 99 369 100 368 99 366 98 105 94 362 96 367 101 369 100 367 101 362 96 33 81 356 83 371 102 372 103 371 102 356 83 105 94 367 101 370 104 372 103 370 104 367 101 30 76 373 105 350 77 374 106 350 77 373 105 105 94 370 104 363 95 374 106 363 95 370 104 13 38 322 40 377 107 378 108 377 107 322 40 108 109 376 110 375 111 378 108 375 111 376 110 26 28 379 112 331 53 381 113 331 53 379 112 108 109 375 111 380 114 381 113 380 114 375 111 33 81 371 102 383 115 384 116 383 115 371 102 108 109 380 114 382 117 384 116 382 117 380 114 31 97 385 118 366 98 386 119 366 98 385 118 108 109 382 117 376 110 386 119 376 110 382 117 9 21 387 120 305 22 390 121 305 22 387 120 110 122 389 123 388 124 390 121 388 124 389 123 32 86 359 88 392 125 393 126 392 125 359 88 110 122 388 124 391 127 393 126 391 127 388 124 33 81 383 115 354 82 395 128 354 82 383 115 110 122 391 127 394 129 395 128 394 129 391 127 26 28 312 30 379 112 396 130 379 112 312 30 110 122 394 129 389 123 396 130 389 123 394 129 8 131 397 132 400 133 401 134 400 133 397 132 115 135 399 136 398 137 401 134 398 137 399 136 34 138 402 139 404 140 405 141 404 140 402 139 115 135 398 137 403 142 405 141 403 142 398 137 37 143 406 144 408 145 409 146 408 145 406 144 115 135 403 142 407 147 409 146 407 147 403 142 36 148 410 149 411 150 412 151 411 150 410 149 115 135 407 147 399 136 412 151 399 136 407 147 11 152 413 153 416 154 417 155 416 154 413 153 119 156 415 157 414 158 417 155 414 158 415 157 35 159 418 160 420 161 421 162 420 161 418 160 119 156 414 158 419 163 421 162 419 163 414 158 37 143 408 145 423 164 424 165 423 164 408 145 119 156 419 163 422 166 424 165 422 166 419 163 34 138 425 167 402 139 426 168 402 139 425 167 119 156 422 166 415 157 426 168 415 157 422 166 13 38 377 107 429 169 430 170 429 169 377 107 122 171 428 172 427 173 430 170 427 173 428 172 31 97 431 174 385 118 433 175 385 118 431 174 122 171 427 173 432 176 433 175 432 176 427 173 37 143 423 164 435 177 436 178 435 177 423 164 122 171 432 176 434 179 436 178 434 179 432 176 35 159 437 180 418 160 438 181 418 160 437 180 122 171 434 179 428 172 438 181 428 172 434 179 10 90 439 182 361 91 442 183 361 91 439 182 124 184 441 185 440 186 442 183 440 186 441 185 36 148 411 150 444 187 445 188 444 187 411 150 124 184 440 186 443 189 445 188 443 189 440 186 37 143 435 177 406 144 447 190 406 144 435 177 124 184 443 189 446 191 447 190 446 191 443 189 31 97 368 99 431 174 448 192 431 174 368 99 124 184 446 191 441 185 448 192 441 185 446 191 7 193 449 194 452 195 453 196 452 195 449 194 129 197 451 198 450 199 453 196 450 199 451 198 38 200 454 201 456 202 457 203 456 202 454 201 129 197 450 199 455 204 457 203 455 204 450 199 40 205 458 206 460 207 461 208 460 207 458 206 129 197 455 204 459 209 461 208 459 209 455 204 39 210 462 211 463 212 464 213 463 212 462 211 129 197 459 209 451 198 464 213 451 198 459 209 12 55 336 57 467 214 468 215 467 214 336 57 132 216 466 217 465 218 468 215 465 218 466 217 27 45 469 219 343 67 471 220 343 67 469 219 132 216 465 218 470 221 471 220 470 221 465 218 40 205 460 207 473 222 474 223 473 222 460 207 132 216 470 221 472 224 474 223 472 224 470 221 38 200 475 225 454 201 476 226 454 201 475 225 132 216 472 224 466 217 476 226 466 217 472 224 13 38 429 169 319 39 479 227 319 39 429 169 134 228 478 229 477 230 479 227 477 230 478 229 35 159 480 231 437 180 482 232 437 180 480 231 134 228 477 230 481 233 482 232 481 233 477 230 40 205 473 222 484 234 485 235 484 234 473 222 134 228 481 233 483 236 485 235 483 236 481 233 27 45 326 47 469 219 486 237 469 219 326 47 134 228 483 236 478 229 486 237 478 229 483 236 11 152 487 238 413 153 490 239 413 153 487 238 136 240 489 241 488 242 490 239 488 242 489 241 39 210 463 212 492 243 493 244 492 243 463 212 136 240 488 242 491 245 493 244 491 245 488 242 40 205 484 234 458 206 495 246 458 206 484 234 136 240 491 245 494 247 495 246 494 247 491 245 35 159 420 161 480 231 496 248 480 231 420 161 136 240 494 247 489 241 496 248 489 241 494 247 3 249 497 250 500 251 501 252 500 251 497 250 141 253 499 254 498 255 501 252 498 255 499 254 41 256 502 257 504 258 505 259 504 258 502 257 141 253 498 255 503 260 505 259 503 260 498 255 45 261 506 262 508 263 509 264 508 263 506 262 141 253 503 260 507 265 509 264 507 265 503 260 44 266 510 267 511 268 512 269 511 268 510 267 141 253 507 265 499 254 512 269 499 254 507 265 14 270 513 271 516 272 517 273 516 272 513 271 145 274 515 275 514 276 517 273 514 276 515 275 42 277 518 278 520 279 521 280 520 279 518 278 145 274 514 276 519 281 521 280 519 281 514 276 45 261 508 263 523 282 524 283 523 282 508 263 145 274 519 281 522 284 524 283 522 284 519 281 41 256 525 285 502 257 526 286 502 257 525 285 145 274 522 284 515 275 526 286 515 275 522 284 17 287 527 288 530 289 531 290 530 289 527 288 149 291 529 292 528 293 531 290 528 293 529 292 43 294 532 295 534 296 535 297 534 296 532 295 149 291 528 293 533 298 535 297 533 298 528 293 45 261 523 282 537 299 538 300 537 299 523 282 149 291 533 298 536 301 538 300 536 301 533 298 42 277 539 302 518 278 540 303 518 278 539 302 149 291 536 301 529 292 540 303 529 292 536 301 16 304 541 305 544 306 545 307 544 306 541 305 152 308 543 309 542 310 545 307 542 310 543 309 44 266 511 268 547 311 548 312 547 311 511 268 152 308 542 310 546 313 548 312 546 313 542 310 45 261 537 299 506 262 550 314 506 262 537 299 152 308 546 313 549 315 550 314 549 315 546 313 43 294 551 316 532 295 552 317 532 295 551 316 152 308 549 315 543 309 552 317 543 309 549 315 5 318 553 319 556 320 557 321 556 320 553 319 157 322 555 323 554 324 557 321 554 324 555 323 46 325 558 326 560 327 561 328 560 327 558 326 157 322 554 324 559 329 561 328 559 329 554 324 49 330 562 331 564 332 565 333 564 332 562 331 157 322 559 329 563 334 565 333 563 334 559 329 48 335 566 336 567 337 568 338 567 337 566 336 157 322 563 334 555 323 568 338 555 323 563 334 15 339 569 340 572 341 573 342 572 341 569 340 161 343 571 344 570 345 573 342 570 345 571 344 47 346 574 347 576 348 577 349 576 348 574 347 161 343 570 345 575 350 577 349 575 350 570 345 49 330 564 332 579 351 580 352 579 351 564 332 161 343 575 350 578 353 580 352 578 353 575 350 46 325 581 354 558 326 582 355 558 326 581 354 161 343 578 353 571 344 582 355 571 344 578 353 17 287 530 289 585 356 586 357 585 356 530 289 164 358 584 359 583 360 586 357 583 360 584 359 42 277 587 361 539 302 589 362 539 302 587 361 164 358 583 360 588 363 589 362 588 363 583 360 49 330 579 351 591 364 592 365 591 364 579 351 164 358 588 363 590 366 592 365 590 366 588 363 47 346 593 367 574 347 594 368 574 347 593 367 164 358 590 366 584 359 594 368 584 359 590 366 14 270 595 369 513 271 598 370 513 271 595 369 166 371 597 372 596 373 598 370 596 373 597 372 48 335 567 337 600 374 601 375 600 374 567 337 166 371 596 373 599 376 601 375 599 376 596 373 49 330 591 364 562 331 603 377 562 331 591 364 166 371 599 376 602 378 603 377 602 378 599 376 42 277 520 279 587 361 604 379 587 361 520 279 166 371 602 378 597 372 604 379 597 372 602 378 8 131 400 133 607 380 608 381 607 380 400 133 170 382 606 383 605 384 608 381 605 384 606 383 36 148 609 385 410 149 611 386 410 149 609 385 170 382 605 384 610 387 611 386 610 387 605 384 52 388 612 389 614 390 615 391 614 390 612 389 170 382 610 387 613 392 615 391 613 392 610 387 51 393 616 394 617 395 618 396 617 395 616 394 170 382 613 392 606 383 618 396 606 383 613 392 10 90 619 397 439 182 622 398 439 182 619 397 173 399 621 400 620 401 622 398 620 401 621 400 50 402 623 403 625 404 626 405 625 404 623 403 173 399 620 401 624 406 626 405 624 406 620 401 52 388 614 390 628 407 629 408 628 407 614 390 173 399 624 406 627 409 629 408 627 409 624 406 36 148 444 187 609 385 630 410 609 385 444 187 173 399 627 409 621 400 630 410 621 400 627 409 17 287 585 356 633 411 634 412 633 411 585 356 176 413 632 414 631 415 634 412 631 415 632 414 47 346 635 416 593 367 637 417 593 367 635 416 176 413 631 415 636 418 637 417 636 418 631 415 52 388 628 407 639 419 640 420 639 419 628 407 176 413 636 418 638 421 640 420 638 421 636 418 50 402 641 422 623 403 642 423 623 403 641 422 176 413 638 421 632 414 642 423 632 414 638 421 15 339 643 424 569 340 646 425 569 340 643 424 178 426 645 427 644 428 646 425 644 428 645 427 51 393 617 395 648 429 649 430 648 429 617 395 178 426 644 428 647 431 649 430 647 431 644 428 52 388 639 419 612 389 651 432 612 389 639 419 178 426 647 431 650 433 651 432 650 433 647 431 47 346 576 348 635 416 652 434 635 416 576 348 178 426 650 433 645 427 652 434 645 427 650 433 4 69 653 435 345 70 656 436 345 70 653 435 182 437 655 438 654 439 656 436 654 439 655 438 53 440 657 441 659 442 660 443 659 442 657 441 182 437 654 439 658 444 660 443 658 444 654 439 54 445 661 446 663 447 664 448 663 447 661 446 182 437 658 444 662 449 664 448 662 449 658 444 30 76 352 78 665 450 666 451 665 450 352 78 182 437 662 449 655 438 666 451 655 438 662 449 16 304 544 306 669 452 670 453 669 452 544 306 185 454 668 455 667 456 670 453 667 456 668 455 43 294 671 457 551 316 673 458 551 316 671 457 185 454 667 456 672 459 673 458 672 459 667 456 54 445 663 447 675 460 676 461 675 460 663 447 185 454 672 459 674 462 676 461 674 462 672 459 53 440 677 463 657 441 678 464 657 441 677 463 185 454 674 462 668 455 678 464 668 455 674 462 17 287 633 411 527 288 681 465 527 288 633 411 187 466 680 467 679 468 681 465 679 468 680 467 50 402 682 469 641 422 684 470 641 422 682 469 187 466 679 468 683 471 684 470 683 471 679 468 54 445 675 460 686 472 687 473 686 472 675 460 187 466 683 471 685 474 687 473 685 474 683 471 43 294 534 296 671 457 688 475 671 457 534 296 187 466 685 474 680 467 688 475 680 467 685 474 10 90 364 92 619 397 691 476 619 397 364 92 188 477 690 478 689 479 691 476 689 479 690 478 30 76 665 450 373 105 693 480 373 105 665 450 188 477 689 479 692 481 693 480 692 481 689 479 54 445 686 472 661 446 695 482 661 446 686 472 188 477 692 481 694 483 695 482 694 483 692 481 50 402 625 404 682 469 696 484 682 469 625 404 188 477 694 483 690 478 696 484 690 478 694 483 1 485 697 486 700 487 701 488 700 487 697 486 193 489 699 490 698 491 701 488 698 491 699 490 55 492 702 493 704 494 705 495 704 494 702 493 193 489 698 491 703 496 705 495 703 496 698 491 59 497 706 498 708 499 709 500 708 499 706 498 193 489 703 496 707 501 709 500 707 501 703 496 58 502 710 503 711 504 712 505 711 504 710 503 193 489 707 501 699 490 712 505 699 490 707 501 18 506 713 507 716 508 717 509 716 508 713 507 197 510 715 511 714 512 717 509 714 512 715 511 56 513 718 514 720 515 721 516 720 515 718 514 197 510 714 512 719 517 721 516 719 517 714 512 59 497 708 499 723 518 724 519 723 518 708 499 197 510 719 517 722 520 724 519 722 520 719 517 55 492 725 521 702 493 726 522 702 493 725 521 197 510 722 520 715 511 726 522 715 511 722 520 21 523 727 524 730 525 731 526 730 525 727 524 201 527 729 528 728 529 731 526 728 529 729 528 57 530 732 531 734 532 735 533 734 532 732 531 201 527 728 529 733 534 735 533 733 534 728 529 59 497 723 518 737 535 738 536 737 535 723 518 201 527 733 534 736 537 738 536 736 537 733 534 56 513 739 538 718 514 740 539 718 514 739 538 201 527 736 537 729 528 740 539 729 528 736 537 20 540 741 541 744 542 745 543 744 542 741 541 204 544 743 545 742 546 745 543 742 546 743 545 58 502 711 504 747 547 748 548 747 547 711 504 204 544 742 546 746 549 748 548 746 549 742 546 59 497 737 535 706 498 750 550 706 498 737 535 204 544 746 549 749 551 750 550 749 551 746 549 57 530 751 552 732 531 752 553 732 531 751 552 204 544 749 551 743 545 752 553 743 545 749 551 6 554 753 555 756 556 757 557 756 556 753 555 209 558 755 559 754 560 757 557 754 560 755 559 60 561 758 562 760 563 761 564 760 563 758 562 209 558 754 560 759 565 761 564 759 565 754 560 63 566 762 567 764 568 765 569 764 568 762 567 209 558 759 565 763 570 765 569 763 570 759 565 62 571 766 572 767 573 768 574 767 573 766 572 209 558 763 570 755 559 768 574 755 559 763 570 19 575 769 576 772 577 773 578 772 577 769 576 213 579 771 580 770 581 773 578 770 581 771 580 61 582 774 583 776 584 777 585 776 584 774 583 213 579 770 581 775 586 777 585 775 586 770 581 63 566 764 568 779 587 780 588 779 587 764 568 213 579 775 586 778 589 780 588 778 589 775 586 60 561 781 590 758 562 782 591 758 562 781 590 213 579 778 589 771 580 782 591 771 580 778 589 21 523 730 525 785 592 786 593 785 592 730 525 216 594 784 595 783 596 786 593 783 596 784 595 56 513 787 597 739 538 789 598 739 538 787 597 216 594 783 596 788 599 789 598 788 599 783 596 63 566 779 587 791 600 792 601 791 600 779 587 216 594 788 599 790 602 792 601 790 602 788 599 61 582 793 603 774 583 794 604 774 583 793 603 216 594 790 602 784 595 794 604 784 595 790 602 18 506 795 605 713 507 798 606 713 507 795 605 218 607 797 608 796 609 798 606 796 609 797 608 62 571 767 573 800 610 801 611 800 610 767 573 218 607 796 609 799 612 801 611 799 612 796 609 63 566 791 600 762 567 803 613 762 567 791 600 218 607 799 612 802 614 803 613 802 614 799 612 56 513 720 515 787 597 804 615 787 597 720 515 218 607 802 614 797 608 804 615 797 608 802 614 8 131 607 380 807 616 808 617 807 616 607 380 222 618 806 619 805 620 808 617 805 620 806 619 51 393 809 621 616 394 811 622 616 394 809 621 222 618 805 620 810 623 811 622 810 623 805 620 66 624 812 625 814 626 815 627 814 626 812 625 222 618 810 623 813 628 815 627 813 628 810 623 65 629 816 630 817 631 818 632 817 631 816 630 222 618 813 628 806 619 818 632 806 619 813 628 15 339 819 633 643 424 822 634 643 424 819 633 225 635 821 636 820 637 822 634 820 637 821 636 64 638 823 639 825 640 826 641 825 640 823 639 225 635 820 637 824 642 826 641 824 642 820 637 66 624 814 626 828 643 829 644 828 643 814 626 225 635 824 642 827 645 829 644 827 645 824 642 51 393 648 429 809 621 830 646 809 621 648 429 225 635 827 645 821 636 830 646 821 636 827 645 21 523 785 592 833 647 834 648 833 647 785 592 228 649 832 650 831 651 834 648 831 651 832 650 61 582 835 652 793 603 837 653 793 603 835 652 228 649 831 651 836 654 837 653 836 654 831 651 66 624 828 643 839 655 840 656 839 655 828 643 228 649 836 654 838 657 840 656 838 657 836 654 64 638 841 658 823 639 842 659 823 639 841 658 228 649 838 657 832 650 842 659 832 650 838 657 19 575 843 660 769 576 846 661 769 576 843 660 230 662 845 663 844 664 846 661 844 664 845 663 65 629 817 631 848 665 849 666 848 665 817 631 230 662 844 664 847 667 849 666 847 667 844 664 66 624 839 655 812 625 851 668 812 625 839 655 230 662 847 667 850 669 851 668 850 669 847 667 61 582 776 584 835 652 852 670 835 652 776 584 230 662 850 669 845 663 852 670 845 663 850 669 5 318 853 671 553 319 856 672 553 319 853 671 234 673 855 674 854 675 856 672 854 675 855 674 67 676 857 677 859 678 860 679 859 678 857 677 234 673 854 675 858 680 860 679 858 680 854 675 68 681 861 682 863 683 864 684 863 683 861 682 234 673 858 680 862 685 864 684 862 685 858 680 46 325 560 327 865 686 866 687 865 686 560 327 234 673 862 685 855 674 866 687 855 674 862 685 20 540 744 542 869 688 870 689 869 688 744 542 237 690 868 691 867 692 870 689 867 692 868 691 57 530 871 693 751 552 873 694 751 552 871 693 237 690 867 692 872 695 873 694 872 695 867 692 68 681 863 683 875 696 876 697 875 696 863 683 237 690 872 695 874 698 876 697 874 698 872 695 67 676 877 699 857 677 878 700 857 677 877 699 237 690 874 698 868 691 878 700 868 691 874 698 21 523 833 647 727 524 881 701 727 524 833 647 239 702 880 703 879 704 881 701 879 704 880 703 64 638 882 705 841 658 884 706 841 658 882 705 239 702 879 704 883 707 884 706 883 707 879 704 68 681 875 696 886 708 887 709 886 708 875 696 239 702 883 707 885 710 887 709 885 710 883 707 57 530 734 532 871 693 888 711 871 693 734 532 239 702 885 710 880 703 888 711 880 703 885 710 15 339 572 341 819 633 891 712 819 633 572 341 240 713 890 714 889 715 891 712 889 715 890 714 46 325 865 686 581 354 893 716 581 354 865 686 240 713 889 715 892 717 893 716 892 717 889 715 68 681 886 708 861 682 895 718 861 682 886 708 240 713 892 717 894 719 895 718 894 719 892 717 64 638 825 640 882 705 896 720 882 705 825 640 240 713 894 719 890 714 896 720 890 714 894 719 0 721 897 722 900 723 901 724 900 723 897 722 245 725 899 726 898 727 901 724 898 727 899 726 69 728 902 729 904 730 905 731 904 730 902 729 245 725 898 727 903 732 905 731 903 732 898 727 73 733 906 734 908 735 909 736 908 735 906 734 245 725 903 732 907 737 909 736 907 737 903 732 72 738 910 739 911 740 912 741 911 740 910 739 245 725 907 737 899 726 912 741 899 726 907 737 22 742 913 743 916 744 917 745 916 744 913 743 249 746 915 747 914 748 917 745 914 748 915 747 70 749 918 750 920 751 921 752 920 751 918 750 249 746 914 748 919 753 921 752 919 753 914 748 73 733 908 735 923 754 924 755 923 754 908 735 249 746 919 753 922 756 924 755 922 756 919 753 69 728 925 757 902 729 926 758 902 729 925 757 249 746 922 756 915 747 926 758 915 747 922 756 24 759 927 760 930 761 931 762 930 761 927 760 253 763 929 764 928 765 931 762 928 765 929 764 71 766 932 767 934 768 935 769 934 768 932 767 253 763 928 765 933 770 935 769 933 770 928 765 73 733 923 754 937 771 938 772 937 771 923 754 253 763 933 770 936 773 938 772 936 773 933 770 70 749 939 774 918 750 940 775 918 750 939 774 253 763 936 773 929 764 940 775 929 764 936 773 23 776 941 777 944 778 945 779 944 778 941 777 256 780 943 781 942 782 945 779 942 782 943 781 72 738 911 740 947 783 948 784 947 783 911 740 256 780 942 782 946 785 948 784 946 785 942 782 73 733 937 771 906 734 950 786 906 734 937 771 256 780 946 785 949 787 950 786 949 787 946 785 71 766 951 788 932 767 952 789 932 767 951 788 256 780 949 787 943 781 952 789 943 781 949 787 7 193 452 195 955 790 956 791 955 790 452 195 260 792 954 793 953 794 956 791 953 794 954 793 39 210 957 795 462 211 959 796 462 211 957 795 260 792 953 794 958 797 959 796 958 797 953 794 76 798 960 799 962 800 963 801 962 800 960 799 260 792 958 797 961 802 963 801 961 802 958 797 75 803 964 804 965 805 966 806 965 805 964 804 260 792 961 802 954 793 966 806 954 793 961 802 11 152 967 807 487 238 970 808 487 238 967 807 263 809 969 810 968 811 970 808 968 811 969 810 74 812 971 813 973 814 974 815 973 814 971 813 263 809 968 811 972 816 974 815 972 816 968 811 76 798 962 800 976 817 977 818 976 817 962 800 263 809 972 816 975 819 977 818 975 819 972 816 39 210 492 243 957 795 978 820 957 795 492 243 263 809 975 819 969 810 978 820 969 810 975 819 24 759 930 761 981 821 982 822 981 821 930 761 266 823 980 824 979 825 982 822 979 825 980 824 70 749 983 826 939 774 985 827 939 774 983 826 266 823 979 825 984 828 985 827 984 828 979 825 76 798 976 817 987 829 988 830 987 829 976 817 266 823 984 828 986 831 988 830 986 831 984 828 74 812 989 832 971 813 990 833 971 813 989 832 266 823 986 831 980 824 990 833 980 824 986 831 22 742 991 834 913 743 994 835 913 743 991 834 268 836 993 837 992 838 994 835 992 838 993 837 75 803 965 805 996 839 997 840 996 839 965 805 268 836 992 838 995 841 997 840 995 841 992 838 76 798 987 829 960 799 999 842 960 799 987 829 268 836 995 841 998 843 999 842 998 843 995 841 70 749 920 751 983 826 1000 844 983 826 920 751 268 836 998 843 993 837 1000 844 993 837 998 843 8 131 807 616 397 132 1003 845 397 132 807 616 271 846 1002 847 1001 848 1003 845 1001 848 1002 847 65 629 1004 849 816 630 1006 850 816 630 1004 849 271 846 1001 848 1005 851 1006 850 1005 851 1001 848 78 852 1007 853 1009 854 1010 855 1009 854 1007 853 271 846 1005 851 1008 856 1010 855 1008 856 1005 851 34 138 404 140 1011 857 1012 858 1011 857 404 140 271 846 1008 856 1002 847 1012 858 1002 847 1008 856 19 575 1013 859 843 660 1016 860 843 660 1013 859 274 861 1015 862 1014 863 1016 860 1014 863 1015 862 77 864 1017 865 1019 866 1020 867 1019 866 1017 865 274 861 1014 863 1018 868 1020 867 1018 868 1014 863 78 852 1009 854 1022 869 1023 870 1022 869 1009 854 274 861 1018 868 1021 871 1023 870 1021 871 1018 868 65 629 848 665 1004 849 1024 872 1004 849 848 665 274 861 1021 871 1015 862 1024 872 1015 862 1021 871 24 759 981 821 1027 873 1028 874 1027 873 981 821 277 875 1026 876 1025 877 1028 874 1025 877 1026 876 74 812 1029 878 989 832 1031 879 989 832 1029 878 277 875 1025 877 1030 880 1031 879 1030 880 1025 877 78 852 1022 869 1033 881 1034 882 1033 881 1022 869 277 875 1030 880 1032 883 1034 882 1032 883 1030 880 77 864 1035 884 1017 865 1036 885 1017 865 1035 884 277 875 1032 883 1026 876 1036 885 1026 876 1032 883 11 152 416 154 967 807 1039 886 967 807 416 154 278 887 1038 888 1037 889 1039 886 1037 889 1038 888 34 138 1011 857 425 167 1041 890 425 167 1011 857 278 887 1037 889 1040 891 1041 890 1040 891 1037 889 78 852 1033 881 1007 853 1043 892 1007 853 1033 881 278 887 1040 891 1042 893 1043 892 1042 893 1040 891 74 812 973 814 1029 878 1044 894 1029 878 973 814 278 887 1042 893 1038 888 1044 894 1038 888 1042 893 6 554 1045 895 753 555 1048 896 753 555 1045 895 282 897 1047 898 1046 899 1048 896 1046 899 1047 898 79 900 1049 901 1051 902 1052 903 1051 902 1049 901 282 897 1046 899 1050 904 1052 903 1050 904 1046 899 80 905 1053 906 1055 907 1056 908 1055 907 1053 906 282 897 1050 904 1054 909 1056 908 1054 909 1050 904 60 561 760 563 1057 910 1058 911 1057 910 760 563 282 897 1054 909 1047 898 1058 911 1047 898 1054 909 23 776 944 778 1061 912 1062 913 1061 912 944 778 285 914 1060 915 1059 916 1062 913 1059 916 1060 915 71 766 1063 917 951 788 1065 918 951 788 1063 917 285 914 1059 916 1064 919 1065 918 1064 919 1059 916 80 905 1055 907 1067 920 1068 921 1067 920 1055 907 285 914 1064 919 1066 922 1068 921 1066 922 1064 919 79 900 1069 923 1049 901 1070 924 1049 901 1069 923 285 914 1066 922 1060 915 1070 924 1060 915 1066 922 24 759 1027 873 927 760 1073 925 927 760 1027 873 287 926 1072 927 1071 928 1073 925 1071 928 1072 927 77 864 1074 929 1035 884 1076 930 1035 884 1074 929 287 926 1071 928 1075 931 1076 930 1075 931 1071 928 80 905 1067 920 1078 932 1079 933 1078 932 1067 920 287 926 1075 931 1077 934 1079 933 1077 934 1075 931 71 766 934 768 1063 917 1080 935 1063 917 934 768 287 926 1077 934 1072 927 1080 935 1072 927 1077 934 19 575 772 577 1013 859 1083 936 1013 859 772 577 288 937 1082 938 1081 939 1083 936 1081 939 1082 938 60 561 1057 910 781 590 1085 940 781 590 1057 910 288 937 1081 939 1084 941 1085 940 1084 941 1081 939 80 905 1078 932 1053 906 1087 942 1053 906 1078 932 288 937 1084 941 1086 943 1087 942 1086 943 1084 941 77 864 1019 866 1074 929 1088 944 1074 929 1019 866 288 937 1086 943 1082 938 1088 944 1082 938 1086 943 81 945 290 6 289 1 293 3 289 1 290 6 84 946 292 2 291 5 293 3 291 5 292 2 82 947 295 11 294 8 297 10 294 8 295 11 81 945 296 9 290 6 297 10 290 6 296 9 83 948 299 16 298 13 301 15 298 13 299 16 82 947 300 14 295 11 301 15 295 11 300 14 84 946 291 5 302 18 304 20 302 18 291 5 83 948 303 19 299 16 304 20 299 16 303 19 86 949 306 27 305 22 309 24 305 22 306 27 88 950 308 23 307 26 309 24 307 26 308 23 87 951 311 32 310 29 313 31 310 29 311 32 86 949 312 30 306 27 313 31 306 27 312 30 82 947 314 35 300 14 316 34 300 14 314 35 87 951 315 33 311 32 316 34 311 32 315 33 88 950 307 26 317 36 318 37 317 36 307 26 82 947 294 8 314 35 318 37 314 35 294 8 90 952 320 44 319 39 323 41 319 39 320 44 92 953 322 40 321 43 323 41 321 43 322 40 91 954 325 49 324 46 327 48 324 46 325 49 90 952 326 47 320 44 327 48 320 44 326 47 87 951 328 52 315 33 330 51 315 33 328 52 91 954 329 50 325 49 330 51 325 49 329 50 92 953 321 43 331 53 332 54 331 53 321 43 87 951 310 29 328 52 332 54 328 52 310 29 94 955 334 61 333 56 337 58 333 56 334 61 95 956 336 57 335 60 337 58 335 60 336 57 83 948 338 64 303 19 340 63 303 19 338 64 94 955 339 62 334 61 340 63 334 61 339 62 91 954 341 66 329 50 342 65 329 50 341 66 83 948 298 13 338 64 342 65 338 64 298 13 95 956 335 60 343 67 344 68 343 67 335 60 91 954 324 46 341 66 344 68 341 66 324 46 97 957 346 75 345 70 349 72 345 70 346 75 100 958 348 71 347 74 349 72 347 74 348 71 98 959 351 80 350 77 353 79 350 77 351 80 97 957 352 78 346 75 353 79 346 75 352 78 99 960 355 85 354 82 357 84 354 82 355 85 98 959 356 83 351 80 357 84 351 80 356 83 100 958 347 74 358 87 360 89 358 87 347 74 99 960 359 88 355 85 360 89 355 85 359 88 102 961 362 96 361 91 365 93 361 91 362 96 104 962 364 92 363 95 365 93 363 95 364 92 103 963 367 101 366 98 369 100 366 98 367 101 102 961 368 99 362 96 369 100 362 96 368 99 98 959 370 104 356 83 372 103 356 83 370 104 103 963 371 102 367 101 372 103 367 101 371 102 104 962 363 95 373 105 374 106 373 105 363 95 98 959 350 77 370 104 374 106 370 104 350 77 92 953 375 111 322 40 378 108 322 40 375 111 107 964 377 107 376 110 378 108 376 110 377 107 106 965 380 114 379 112 381 113 379 112 380 114 92 953 331 53 375 111 381 113 375 111 331 53 103 963 382 117 371 102 384 116 371 102 382 117 106 965 383 115 380 114 384 116 380 114 383 115 107 964 376 110 385 118 386 119 385 118 376 110 103 963 366 98 382 117 386 119 382 117 366 98 109 966 388 124 387 120 390 121 387 120 388 124 86 949 305 22 389 123 390 121 389 123 305 22 99 960 391 127 359 88 393 126 359 88 391 127 109 966 392 125 388 124 393 126 388 124 392 125 106 965 394 129 383 115 395 128 383 115 394 129 99 960 354 82 391 127 395 128 391 127 354 82 86 949 389 123 312 30 396 130 312 30 389 123 106 965 379 112 394 129 396 130 394 129 379 112 111 967 398 137 397 132 401 134 397 132 398 137 114 968 400 133 399 136 401 134 399 136 400 133 112 969 403 142 402 139 405 141 402 139 403 142 111 967 404 140 398 137 405 141 398 137 404 140 113 970 407 147 406 144 409 146 406 144 407 147 112 969 408 145 403 142 409 146 403 142 408 145 114 968 399 136 410 149 412 151 410 149 399 136 113 970 411 150 407 147 412 151 407 147 411 150 116 971 414 158 413 153 417 155 413 153 414 158 118 972 416 154 415 157 417 155 415 157 416 154 117 973 419 163 418 160 421 162 418 160 419 163 116 971 420 161 414 158 421 162 414 158 420 161 112 969 422 166 408 145 424 165 408 145 422 166 117 973 423 164 419 163 424 165 419 163 423 164 118 972 415 157 425 167 426 168 425 167 415 157 112 969 402 139 422 166 426 168 422 166 402 139 107 964 427 173 377 107 430 170 377 107 427 173 121 974 429 169 428 172 430 170 428 172 429 169 120 975 432 176 431 174 433 175 431 174 432 176 107 964 385 118 427 173 433 175 427 173 385 118 117 973 434 179 423 164 436 178 423 164 434 179 120 975 435 177 432 176 436 178 432 176 435 177 121 974 428 172 437 180 438 181 437 180 428 172 117 973 418 160 434 179 438 181 434 179 418 160 123 976 440 186 439 182 442 183 439 182 440 186 102 961 361 91 441 185 442 183 441 185 361 91 113 970 443 189 411 150 445 188 411 150 443 189 123 976 444 187 440 186 445 188 440 186 444 187 120 975 446 191 435 177 447 190 435 177 446 191 113 970 406 144 443 189 447 190 443 189 406 144 102 961 441 185 368 99 448 192 368 99 441 185 120 975 431 174 446 191 448 192 446 191 431 174 125 977 450 199 449 194 453 196 449 194 450 199 128 978 452 195 451 198 453 196 451 198 452 195 126 979 455 204 454 201 457 203 454 201 455 204 125 977 456 202 450 199 457 203 450 199 456 202 127 980 459 209 458 206 461 208 458 206 459 209 126 979 460 207 455 204 461 208 455 204 460 207 128 978 451 198 462 211 464 213 462 211 451 198 127 980 463 212 459 209 464 213 459 209 463 212 95 956 465 218 336 57 468 215 336 57 465 218 131 981 467 214 466 217 468 215 466 217 467 214 130 982 470 221 469 219 471 220 469 219 470 221 95 956 343 67 465 218 471 220 465 218 343 67 126 979 472 224 460 207 474 223 460 207 472 224 130 982 473 222 470 221 474 223 470 221 473 222 131 981 466 217 475 225 476 226 475 225 466 217 126 979 454 201 472 224 476 226 472 224 454 201 121 974 477 230 429 169 479 227 429 169 477 230 90 952 319 39 478 229 479 227 478 229 319 39 133 983 481 233 480 231 482 232 480 231 481 233 121 974 437 180 477 230 482 232 477 230 437 180 130 982 483 236 473 222 485 235 473 222 483 236 133 983 484 234 481 233 485 235 481 233 484 234 90 952 478 229 326 47 486 237 326 47 478 229 130 982 469 219 483 236 486 237 483 236 469 219 135 984 488 242 487 238 490 239 487 238 488 242 116 971 413 153 489 241 490 239 489 241 413 153 127 980 491 245 463 212 493 244 463 212 491 245 135 984 492 243 488 242 493 244 488 242 492 243 133 983 494 247 484 234 495 246 484 234 494 247 127 980 458 206 491 245 495 246 491 245 458 206 116 971 489 241 420 161 496 248 420 161 489 241 133 983 480 231 494 247 496 248 494 247 480 231 137 985 498 255 497 250 501 252 497 250 498 255 140 986 500 251 499 254 501 252 499 254 500 251 138 987 503 260 502 257 505 259 502 257 503 260 137 985 504 258 498 255 505 259 498 255 504 258 139 988 507 265 506 262 509 264 506 262 507 265 138 987 508 263 503 260 509 264 503 260 508 263 140 986 499 254 510 267 512 269 510 267 499 254 139 988 511 268 507 265 512 269 507 265 511 268 142 989 514 276 513 271 517 273 513 271 514 276 144 990 516 272 515 275 517 273 515 275 516 272 143 991 519 281 518 278 521 280 518 278 519 281 142 989 520 279 514 276 521 280 514 276 520 279 138 987 522 284 508 263 524 283 508 263 522 284 143 991 523 282 519 281 524 283 519 281 523 282 144 990 515 275 525 285 526 286 525 285 515 275 138 987 502 257 522 284 526 286 522 284 502 257 146 992 528 293 527 288 531 290 527 288 528 293 148 993 530 289 529 292 531 290 529 292 530 289 147 994 533 298 532 295 535 297 532 295 533 298 146 992 534 296 528 293 535 297 528 293 534 296 143 991 536 301 523 282 538 300 523 282 536 301 147 994 537 299 533 298 538 300 533 298 537 299 148 993 529 292 539 302 540 303 539 302 529 292 143 991 518 278 536 301 540 303 536 301 518 278 150 995 542 310 541 305 545 307 541 305 542 310 151 996 544 306 543 309 545 307 543 309 544 306 139 988 546 313 511 268 548 312 511 268 546 313 150 995 547 311 542 310 548 312 542 310 547 311 147 994 549 315 537 299 550 314 537 299 549 315 139 988 506 262 546 313 550 314 546 313 506 262 151 996 543 309 551 316 552 317 551 316 543 309 147 994 532 295 549 315 552 317 549 315 532 295 153 997 554 324 553 319 557 321 553 319 554 324 156 998 556 320 555 323 557 321 555 323 556 320 154 999 559 329 558 326 561 328 558 326 559 329 153 997 560 327 554 324 561 328 554 324 560 327 155 1000 563 334 562 331 565 333 562 331 563 334 154 999 564 332 559 329 565 333 559 329 564 332 156 998 555 323 566 336 568 338 566 336 555 323 155 1000 567 337 563 334 568 338 563 334 567 337 158 1001 570 345 569 340 573 342 569 340 570 345 160 1002 572 341 571 344 573 342 571 344 572 341 159 1003 575 350 574 347 577 349 574 347 575 350 158 1001 576 348 570 345 577 349 570 345 576 348 154 999 578 353 564 332 580 352 564 332 578 353 159 1003 579 351 575 350 580 352 575 350 579 351 160 1002 571 344 581 354 582 355 581 354 571 344 154 999 558 326 578 353 582 355 578 353 558 326 148 993 583 360 530 289 586 357 530 289 583 360 163 1004 585 356 584 359 586 357 584 359 585 356 162 1005 588 363 587 361 589 362 587 361 588 363 148 993 539 302 583 360 589 362 583 360 539 302 159 1003 590 366 579 351 592 365 579 351 590 366 162 1005 591 364 588 363 592 365 588 363 591 364 163 1004 584 359 593 367 594 368 593 367 584 359 159 1003 574 347 590 366 594 368 590 366 574 347 165 1006 596 373 595 369 598 370 595 369 596 373 142 989 513 271 597 372 598 370 597 372 513 271 155 1000 599 376 567 337 601 375 567 337 599 376 165 1006 600 374 596 373 601 375 596 373 600 374 162 1005 602 378 591 364 603 377 591 364 602 378 155 1000 562 331 599 376 603 377 599 376 562 331 142 989 597 372 520 279 604 379 520 279 597 372 162 1005 587 361 602 378 604 379 602 378 587 361 114 968 605 384 400 133 608 381 400 133 605 384 169 1007 607 380 606 383 608 381 606 383 607 380 167 1008 610 387 609 385 611 386 609 385 610 387 114 968 410 149 605 384 611 386 605 384 410 149 168 1009 613 392 612 389 615 391 612 389 613 392 167 1008 614 390 610 387 615 391 610 387 614 390 169 1007 606 383 616 394 618 396 616 394 606 383 168 1009 617 395 613 392 618 396 613 392 617 395 171 1010 620 401 619 397 622 398 619 397 620 401 123 976 439 182 621 400 622 398 621 400 439 182 172 1011 624 406 623 403 626 405 623 403 624 406 171 1010 625 404 620 401 626 405 620 401 625 404 167 1008 627 409 614 390 629 408 614 390 627 409 172 1011 628 407 624 406 629 408 624 406 628 407 123 976 621 400 444 187 630 410 444 187 621 400 167 1008 609 385 627 409 630 410 627 409 609 385 163 1004 631 415 585 356 634 412 585 356 631 415 175 1012 633 411 632 414 634 412 632 414 633 411 174 1013 636 418 635 416 637 417 635 416 636 418 163 1004 593 367 631 415 637 417 631 415 593 367 172 1011 638 421 628 407 640 420 628 407 638 421 174 1013 639 419 636 418 640 420 636 418 639 419 175 1012 632 414 641 422 642 423 641 422 632 414 172 1011 623 403 638 421 642 423 638 421 623 403 177 1014 644 428 643 424 646 425 643 424 644 428 158 1001 569 340 645 427 646 425 645 427 569 340 168 1009 647 431 617 395 649 430 617 395 647 431 177 1014 648 429 644 428 649 430 644 428 648 429 174 1013 650 433 639 419 651 432 639 419 650 433 168 1009 612 389 647 431 651 432 647 431 612 389 158 1001 645 427 576 348 652 434 576 348 645 427 174 1013 635 416 650 433 652 434 650 433 635 416 179 1015 654 439 653 435 656 436 653 435 654 439 97 957 345 70 655 438 656 436 655 438 345 70 180 1016 658 444 657 441 660 443 657 441 658 444 179 1015 659 442 654 439 660 443 654 439 659 442 181 1017 662 449 661 446 664 448 661 446 662 449 180 1016 663 447 658 444 664 448 658 444 663 447 97 957 655 438 352 78 666 451 352 78 655 438 181 1017 665 450 662 449 666 451 662 449 665 450 151 996 667 456 544 306 670 453 544 306 667 456 184 1018 669 452 668 455 670 453 668 455 669 452 183 1019 672 459 671 457 673 458 671 457 672 459 151 996 551 316 667 456 673 458 667 456 551 316 180 1016 674 462 663 447 676 461 663 447 674 462 183 1019 675 460 672 459 676 461 672 459 675 460 184 1018 668 455 677 463 678 464 677 463 668 455 180 1016 657 441 674 462 678 464 674 462 657 441 175 1012 679 468 633 411 681 465 633 411 679 468 146 992 527 288 680 467 681 465 680 467 527 288 186 1020 683 471 682 469 684 470 682 469 683 471 175 1012 641 422 679 468 684 470 679 468 641 422 183 1019 685 474 675 460 687 473 675 460 685 474 186 1020 686 472 683 471 687 473 683 471 686 472 146 992 680 467 534 296 688 475 534 296 680 467 183 1019 671 457 685 474 688 475 685 474 671 457 104 962 689 479 364 92 691 476 364 92 689 479 171 1010 619 397 690 478 691 476 690 478 619 397 181 1017 692 481 665 450 693 480 665 450 692 481 104 962 373 105 689 479 693 480 689 479 373 105 186 1020 694 483 686 472 695 482 686 472 694 483 181 1017 661 446 692 481 695 482 692 481 661 446 171 1010 690 478 625 404 696 484 625 404 690 478 186 1020 682 469 694 483 696 484 694 483 682 469 189 1021 698 491 697 486 701 488 697 486 698 491 192 1022 700 487 699 490 701 488 699 490 700 487 190 1023 703 496 702 493 705 495 702 493 703 496 189 1021 704 494 698 491 705 495 698 491 704 494 191 1024 707 501 706 498 709 500 706 498 707 501 190 1023 708 499 703 496 709 500 703 496 708 499 192 1022 699 490 710 503 712 505 710 503 699 490 191 1024 711 504 707 501 712 505 707 501 711 504 194 1025 714 512 713 507 717 509 713 507 714 512 196 1026 716 508 715 511 717 509 715 511 716 508 195 1027 719 517 718 514 721 516 718 514 719 517 194 1025 720 515 714 512 721 516 714 512 720 515 190 1023 722 520 708 499 724 519 708 499 722 520 195 1027 723 518 719 517 724 519 719 517 723 518 196 1026 715 511 725 521 726 522 725 521 715 511 190 1023 702 493 722 520 726 522 722 520 702 493 198 1028 728 529 727 524 731 526 727 524 728 529 200 1029 730 525 729 528 731 526 729 528 730 525 199 1030 733 534 732 531 735 533 732 531 733 534 198 1028 734 532 728 529 735 533 728 529 734 532 195 1027 736 537 723 518 738 536 723 518 736 537 199 1030 737 535 733 534 738 536 733 534 737 535 200 1029 729 528 739 538 740 539 739 538 729 528 195 1027 718 514 736 537 740 539 736 537 718 514 202 1031 742 546 741 541 745 543 741 541 742 546 203 1032 744 542 743 545 745 543 743 545 744 542 191 1024 746 549 711 504 748 548 711 504 746 549 202 1031 747 547 742 546 748 548 742 546 747 547 199 1030 749 551 737 535 750 550 737 535 749 551 191 1024 706 498 746 549 750 550 746 549 706 498 203 1032 743 545 751 552 752 553 751 552 743 545 199 1030 732 531 749 551 752 553 749 551 732 531 205 1033 754 560 753 555 757 557 753 555 754 560 208 1034 756 556 755 559 757 557 755 559 756 556 206 1035 759 565 758 562 761 564 758 562 759 565 205 1033 760 563 754 560 761 564 754 560 760 563 207 1036 763 570 762 567 765 569 762 567 763 570 206 1035 764 568 759 565 765 569 759 565 764 568 208 1034 755 559 766 572 768 574 766 572 755 559 207 1036 767 573 763 570 768 574 763 570 767 573 210 1037 770 581 769 576 773 578 769 576 770 581 212 1038 772 577 771 580 773 578 771 580 772 577 211 1039 775 586 774 583 777 585 774 583 775 586 210 1037 776 584 770 581 777 585 770 581 776 584 206 1035 778 589 764 568 780 588 764 568 778 589 211 1039 779 587 775 586 780 588 775 586 779 587 212 1038 771 580 781 590 782 591 781 590 771 580 206 1035 758 562 778 589 782 591 778 589 758 562 200 1029 783 596 730 525 786 593 730 525 783 596 215 1040 785 592 784 595 786 593 784 595 785 592 214 1041 788 599 787 597 789 598 787 597 788 599 200 1029 739 538 783 596 789 598 783 596 739 538 211 1039 790 602 779 587 792 601 779 587 790 602 214 1041 791 600 788 599 792 601 788 599 791 600 215 1040 784 595 793 603 794 604 793 603 784 595 211 1039 774 583 790 602 794 604 790 602 774 583 217 1042 796 609 795 605 798 606 795 605 796 609 194 1025 713 507 797 608 798 606 797 608 713 507 207 1036 799 612 767 573 801 611 767 573 799 612 217 1042 800 610 796 609 801 611 796 609 800 610 214 1041 802 614 791 600 803 613 791 600 802 614 207 1036 762 567 799 612 803 613 799 612 762 567 194 1025 797 608 720 515 804 615 720 515 797 608 214 1041 787 597 802 614 804 615 802 614 787 597 169 1007 805 620 607 380 808 617 607 380 805 620 221 1043 807 616 806 619 808 617 806 619 807 616 219 1044 810 623 809 621 811 622 809 621 810 623 169 1007 616 394 805 620 811 622 805 620 616 394 220 1045 813 628 812 625 815 627 812 625 813 628 219 1044 814 626 810 623 815 627 810 623 814 626 221 1043 806 619 816 630 818 632 816 630 806 619 220 1045 817 631 813 628 818 632 813 628 817 631 223 1046 820 637 819 633 822 634 819 633 820 637 177 1014 643 424 821 636 822 634 821 636 643 424 224 1047 824 642 823 639 826 641 823 639 824 642 223 1046 825 640 820 637 826 641 820 637 825 640 219 1044 827 645 814 626 829 644 814 626 827 645 224 1047 828 643 824 642 829 644 824 642 828 643 177 1014 821 636 648 429 830 646 648 429 821 636 219 1044 809 621 827 645 830 646 827 645 809 621 215 1040 831 651 785 592 834 648 785 592 831 651 227 1048 833 647 832 650 834 648 832 650 833 647 226 1049 836 654 835 652 837 653 835 652 836 654 215 1040 793 603 831 651 837 653 831 651 793 603 224 1047 838 657 828 643 840 656 828 643 838 657 226 1049 839 655 836 654 840 656 836 654 839 655 227 1048 832 650 841 658 842 659 841 658 832 650 224 1047 823 639 838 657 842 659 838 657 823 639 229 1050 844 664 843 660 846 661 843 660 844 664 210 1037 769 576 845 663 846 661 845 663 769 576 220 1045 847 667 817 631 849 666 817 631 847 667 229 1050 848 665 844 664 849 666 844 664 848 665 226 1049 850 669 839 655 851 668 839 655 850 669 220 1045 812 625 847 667 851 668 847 667 812 625 210 1037 845 663 776 584 852 670 776 584 845 663 226 1049 835 652 850 669 852 670 850 669 835 652 231 1051 854 675 853 671 856 672 853 671 854 675 153 997 553 319 855 674 856 672 855 674 553 319 232 1052 858 680 857 677 860 679 857 677 858 680 231 1051 859 678 854 675 860 679 854 675 859 678 233 1053 862 685 861 682 864 684 861 682 862 685 232 1052 863 683 858 680 864 684 858 680 863 683 153 997 855 674 560 327 866 687 560 327 855 674 233 1053 865 686 862 685 866 687 862 685 865 686 203 1032 867 692 744 542 870 689 744 542 867 692 236 1054 869 688 868 691 870 689 868 691 869 688 235 1055 872 695 871 693 873 694 871 693 872 695 203 1032 751 552 867 692 873 694 867 692 751 552 232 1052 874 698 863 683 876 697 863 683 874 698 235 1055 875 696 872 695 876 697 872 695 875 696 236 1054 868 691 877 699 878 700 877 699 868 691 232 1052 857 677 874 698 878 700 874 698 857 677 227 1048 879 704 833 647 881 701 833 647 879 704 198 1028 727 524 880 703 881 701 880 703 727 524 238 1056 883 707 882 705 884 706 882 705 883 707 227 1048 841 658 879 704 884 706 879 704 841 658 235 1055 885 710 875 696 887 709 875 696 885 710 238 1056 886 708 883 707 887 709 883 707 886 708 198 1028 880 703 734 532 888 711 734 532 880 703 235 1055 871 693 885 710 888 711 885 710 871 693 160 1002 889 715 572 341 891 712 572 341 889 715 223 1046 819 633 890 714 891 712 890 714 819 633 233 1053 892 717 865 686 893 716 865 686 892 717 160 1002 581 354 889 715 893 716 889 715 581 354 238 1056 894 719 886 708 895 718 886 708 894 719 233 1053 861 682 892 717 895 718 892 717 861 682 223 1046 890 714 825 640 896 720 825 640 890 714 238 1056 882 705 894 719 896 720 894 719 882 705 241 1057 898 727 897 722 901 724 897 722 898 727 244 1058 900 723 899 726 901 724 899 726 900 723 242 1059 903 732 902 729 905 731 902 729 903 732 241 1057 904 730 898 727 905 731 898 727 904 730 243 1060 907 737 906 734 909 736 906 734 907 737 242 1059 908 735 903 732 909 736 903 732 908 735 244 1058 899 726 910 739 912 741 910 739 899 726 243 1060 911 740 907 737 912 741 907 737 911 740 246 1061 914 748 913 743 917 745 913 743 914 748 248 1062 916 744 915 747 917 745 915 747 916 744 247 1063 919 753 918 750 921 752 918 750 919 753 246 1061 920 751 914 748 921 752 914 748 920 751 242 1059 922 756 908 735 924 755 908 735 922 756 247 1063 923 754 919 753 924 755 919 753 923 754 248 1062 915 747 925 757 926 758 925 757 915 747 242 1059 902 729 922 756 926 758 922 756 902 729 250 1064 928 765 927 760 931 762 927 760 928 765 252 1065 930 761 929 764 931 762 929 764 930 761 251 1066 933 770 932 767 935 769 932 767 933 770 250 1064 934 768 928 765 935 769 928 765 934 768 247 1063 936 773 923 754 938 772 923 754 936 773 251 1066 937 771 933 770 938 772 933 770 937 771 252 1065 929 764 939 774 940 775 939 774 929 764 247 1063 918 750 936 773 940 775 936 773 918 750 254 1067 942 782 941 777 945 779 941 777 942 782 255 1068 944 778 943 781 945 779 943 781 944 778 243 1060 946 785 911 740 948 784 911 740 946 785 254 1067 947 783 942 782 948 784 942 782 947 783 251 1066 949 787 937 771 950 786 937 771 949 787 243 1060 906 734 946 785 950 786 946 785 906 734 255 1068 943 781 951 788 952 789 951 788 943 781 251 1066 932 767 949 787 952 789 949 787 932 767 128 978 953 794 452 195 956 791 452 195 953 794 259 1069 955 790 954 793 956 791 954 793 955 790 257 1070 958 797 957 795 959 796 957 795 958 797 128 978 462 211 953 794 959 796 953 794 462 211 258 1071 961 802 960 799 963 801 960 799 961 802 257 1070 962 800 958 797 963 801 958 797 962 800 259 1069 954 793 964 804 966 806 964 804 954 793 258 1071 965 805 961 802 966 806 961 802 965 805 261 1072 968 811 967 807 970 808 967 807 968 811 135 984 487 238 969 810 970 808 969 810 487 238 262 1073 972 816 971 813 974 815 971 813 972 816 261 1072 973 814 968 811 974 815 968 811 973 814 257 1070 975 819 962 800 977 818 962 800 975 819 262 1073 976 817 972 816 977 818 972 816 976 817 135 984 969 810 492 243 978 820 492 243 969 810 257 1070 957 795 975 819 978 820 975 819 957 795 252 1065 979 825 930 761 982 822 930 761 979 825 265 1074 981 821 980 824 982 822 980 824 981 821 264 1075 984 828 983 826 985 827 983 826 984 828 252 1065 939 774 979 825 985 827 979 825 939 774 262 1073 986 831 976 817 988 830 976 817 986 831 264 1075 987 829 984 828 988 830 984 828 987 829 265 1074 980 824 989 832 990 833 989 832 980 824 262 1073 971 813 986 831 990 833 986 831 971 813 267 1076 992 838 991 834 994 835 991 834 992 838 246 1061 913 743 993 837 994 835 993 837 913 743 258 1071 995 841 965 805 997 840 965 805 995 841 267 1076 996 839 992 838 997 840 992 838 996 839 264 1075 998 843 987 829 999 842 987 829 998 843 258 1071 960 799 995 841 999 842 995 841 960 799 246 1061 993 837 920 751 1000 844 920 751 993 837 264 1075 983 826 998 843 1000 844 998 843 983 826 221 1043 1001 848 807 616 1003 845 807 616 1001 848 111 967 397 132 1002 847 1003 845 1002 847 397 132 269 1077 1005 851 1004 849 1006 850 1004 849 1005 851 221 1043 816 630 1001 848 1006 850 1001 848 816 630 270 1078 1008 856 1007 853 1010 855 1007 853 1008 856 269 1077 1009 854 1005 851 1010 855 1005 851 1009 854 111 967 1002 847 404 140 1012 858 404 140 1002 847 270 1078 1011 857 1008 856 1012 858 1008 856 1011 857 272 1079 1014 863 1013 859 1016 860 1013 859 1014 863 229 1050 843 660 1015 862 1016 860 1015 862 843 660 273 1080 1018 868 1017 865 1020 867 1017 865 1018 868 272 1079 1019 866 1014 863 1020 867 1014 863 1019 866 269 1077 1021 871 1009 854 1023 870 1009 854 1021 871 273 1080 1022 869 1018 868 1023 870 1018 868 1022 869 229 1050 1015 862 848 665 1024 872 848 665 1015 862 269 1077 1004 849 1021 871 1024 872 1021 871 1004 849 265 1074 1025 877 981 821 1028 874 981 821 1025 877 276 1081 1027 873 1026 876 1028 874 1026 876 1027 873 275 1082 1030 880 1029 878 1031 879 1029 878 1030 880 265 1074 989 832 1025 877 1031 879 1025 877 989 832 273 1080 1032 883 1022 869 1034 882 1022 869 1032 883 275 1082 1033 881 1030 880 1034 882 1030 880 1033 881 276 1081 1026 876 1035 884 1036 885 1035 884 1026 876 273 1080 1017 865 1032 883 1036 885 1032 883 1017 865 118 972 1037 889 416 154 1039 886 416 154 1037 889 261 1072 967 807 1038 888 1039 886 1038 888 967 807 270 1078 1040 891 1011 857 1041 890 1011 857 1040 891 118 972 425 167 1037 889 1041 890 1037 889 425 167 275 1082 1042 893 1033 881 1043 892 1033 881 1042 893 270 1078 1007 853 1040 891 1043 892 1040 891 1007 853 261 1072 1038 888 973 814 1044 894 973 814 1038 888 275 1082 1029 878 1042 893 1044 894 1042 893 1029 878 279 1083 1046 899 1045 895 1048 896 1045 895 1046 899 205 1033 753 555 1047 898 1048 896 1047 898 753 555 280 1084 1050 904 1049 901 1052 903 1049 901 1050 904 279 1083 1051 902 1046 899 1052 903 1046 899 1051 902 281 1085 1054 909 1053 906 1056 908 1053 906 1054 909 280 1084 1055 907 1050 904 1056 908 1050 904 1055 907 205 1033 1047 898 760 563 1058 911 760 563 1047 898 281 1085 1057 910 1054 909 1058 911 1054 909 1057 910 255 1068 1059 916 944 778 1062 913 944 778 1059 916 284 1086 1061 912 1060 915 1062 913 1060 915 1061 912 283 1087 1064 919 1063 917 1065 918 1063 917 1064 919 255 1068 951 788 1059 916 1065 918 1059 916 951 788 280 1084 1066 922 1055 907 1068 921 1055 907 1066 922 283 1087 1067 920 1064 919 1068 921 1064 919 1067 920 284 1086 1060 915 1069 923 1070 924 1069 923 1060 915 280 1084 1049 901 1066 922 1070 924 1066 922 1049 901 276 1081 1071 928 1027 873 1073 925 1027 873 1071 928 250 1064 927 760 1072 927 1073 925 1072 927 927 760 286 1088 1075 931 1074 929 1076 930 1074 929 1075 931 276 1081 1035 884 1071 928 1076 930 1071 928 1035 884 283 1087 1077 934 1067 920 1079 933 1067 920 1077 934 286 1088 1078 932 1075 931 1079 933 1075 931 1078 932 250 1064 1072 927 934 768 1080 935 934 768 1072 927 283 1087 1063 917 1077 934 1080 935 1077 934 1063 917 212 1038 1081 939 772 577 1083 936 772 577 1081 939 272 1079 1013 859 1082 938 1083 936 1082 938 1013 859 281 1085 1084 941 1057 910 1085 940 1057 910 1084 941 212 1038 781 590 1081 939 1085 940 1081 939 781 590 286 1088 1086 943 1078 932 1087 942 1078 932 1086 943 281 1085 1053 906 1084 941 1087 942 1084 941 1053 906 272 1079 1082 938 1019 866 1088 944 1019 866 1082 938 286 1088 1074 929 1086 943 1088 944 1086 943 1074 929</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-SingleSided-32X32">
+ <node id="Plane" name="Plane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane32X32">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-4X4.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-4X4.dae
new file mode 100644
index 0000000..0b47e3b
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-4X4.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-SingleSided-4X4.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:34:40Z</created>
+ <modified>2008-09-19T17:34:40Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane4X4" name="Plane4X4">
+ <mesh>
+ <source id="Plane4X4-positions" name="position">
+ <float_array id="Plane4X4-positions-array" count="75">50 -50 0 -50 -50 0 50 50 0 -50 50 0 0 50 0 -50 0 0 0 -50 0 50 0 0 0 0 0 25 50 0 0 25 0 25 0 0 50 25 0 25 25 0 -50 25 0 -25 0 0 -25 50 0 -25 25 0 -25 -50 0 0 -25 0 -50 -25 0 -25 -25 0 50 -25 0 25 -50 0 25 -25 0</float_array>
+ <technique_common>
+ <accessor source="#Plane4X4-positions-array" count="25" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane4X4-normals" name="normal">
+ <float_array id="Plane4X4-normals-array" count="75">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#Plane4X4-normals-array" count="25" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane4X4-Rectangle-UV" name="Rectangle-UV">
+ <float_array id="Plane4X4-Rectangle-UV-array" count="50">0.5 1 0.5 0.75 0.75 1 0.75 0.75 1 0.5 1 0.75 0.75 0.5 0 0.5 0.25 0.5 0 0.75 0.25 0.75 0.25 1 0.5 0 0.5 0.25 0.25 0 0.25 0.25 0 0.25 1 0.25 0.75 0.25 0.75 0 1 1 0.5 0.5 0 1 0 0 1 0</float_array>
+ <technique_common>
+ <accessor source="#Plane4X4-Rectangle-UV-array" count="25" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane4X4-vertices">
+ <input semantic="POSITION" source="#Plane4X4-positions"/>
+ <input semantic="NORMAL" source="#Plane4X4-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="32">
+ <input semantic="VERTEX" source="#Plane4X4-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane4X4-Rectangle-UV" offset="1" set="1"/>
+ <p>4 0 10 1 9 2 13 3 9 2 10 1 7 4 12 5 11 6 13 3 11 6 12 5 5 7 15 8 14 9 17 10 14 9 15 8 4 0 16 11 10 1 17 10 10 1 16 11 6 12 19 13 18 14 21 15 18 14 19 13 5 7 20 16 15 8 21 15 15 8 20 16 7 4 11 6 22 17 24 18 22 17 11 6 6 12 23 19 19 13 24 18 19 13 23 19 2 20 9 2 12 5 13 3 12 5 9 2 8 21 11 6 10 1 13 3 10 1 11 6 3 22 14 9 16 11 17 10 16 11 14 9 8 21 10 1 15 8 17 10 15 8 10 1 1 23 18 14 20 16 21 15 20 16 18 14 8 21 15 8 19 13 21 15 19 13 15 8 0 24 22 17 23 19 24 18 23 19 22 17 8 21 19 13 11 6 24 18 11 6 19 13</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-SingleSided-4X4">
+ <node id="Plane" name="Plane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane4X4">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-8X8.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-8X8.dae
new file mode 100644
index 0000000..2562982
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-8X8.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-SingleSided-8X8.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:35:19Z</created>
+ <modified>2008-09-19T17:35:19Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane8X8" name="Plane8X8">
+ <mesh>
+ <source id="Plane8X8-positions" name="position">
+ <float_array id="Plane8X8-positions-array" count="243">50 -50 0 -50 -50 0 50 50 0 -50 50 0 0 50 0 -50 0 0 0 -50 0 50 0 0 0 0 0 25 50 0 0 25 0 25 0 0 50 25 0 25 25 0 -50 25 0 -25 0 0 -25 50 0 -25 25 0 -25 -50 0 0 -25 0 -50 -25 0 -25 -25 0 50 -25 0 25 -50 0 25 -25 0 37.5 50 0 25 37.5 0 37.5 25 0 50 37.5 0 37.5 37.5 0 0 37.5 0 12.5 25 0 12.5 50 0 12.5 37.5 0 12.5 0 0 25 12.5 0 0 12.5 0 12.5 12.5 0 50 12.5 0 37.5 0 0 37.5 12.5 0 -50 37.5 0 -37.5 25 0 -25 37.5 0 -37.5 50 0 -37.5 37.5 0 -37.5 0 0 -25 12.5 0 -50 12.5 0 -37.5 12.5 0 -12.5 25 0 -12.5 0 0 -12.5 12.5 0 -12.5 50 0 -12.5 37.5 0 -37.5 -50 0 -25 -37.5 0 -37.5 -25 0 -50 -37.5 0 -37.5 -37.5 0 0 -37.5 0 -12.5 -25 0 -12.5 -50 0 -12.5 -37.5 0 -25 -12.5 0 0 -12.5 0 -12.5 -12.5 0 -50 -12.5 0 -37.5 -12.5 0 50 -37.5 0 37.5 -25 0 25 -37.5 0 37.5 -50 0 37.5 -37.5 0 25 -12.5 0 50 -12.5 0 37.5 -12.5 0 12.5 -25 0 12.5 -12.5 0 12.5 -50 0 12.5 -37.5 0</float_array>
+ <technique_common>
+ <accessor source="#Plane8X8-positions-array" count="81" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane8X8-normals" name="normal">
+ <float_array id="Plane8X8-normals-array" count="243">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#Plane8X8-normals-array" count="81" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane8X8-Rectangle-UV" name="Rectangle-UV">
+ <float_array id="Plane8X8-Rectangle-UV-array" count="162">0.75 1 0.75 0.875 0.875 1 0.875 0.875 1 0.75 1 0.875 0.875 0.75 0.5 0.75 0.625 0.75 0.5 0.875 0.625 0.875 0.625 1 0.75 0.5 0.75 0.625 0.625 0.5 0.625 0.625 0.5 0.625 1 0.625 0.875 0.625 0.875 0.5 0 0.75 0.125 0.75 0 0.875 0.125 0.875 0.25 1 0.125 1 0.25 0.875 0.25 0.5 0.25 0.625 0.125 0.5 0.125 0.625 0 0.625 0.375 0.75 0.375 0.625 0.375 0.5 0.375 1 0.375 0.875 0.25 0 0.25 0.125 0.125 0 0.125 0.125 0 0.25 0 0.125 0.125 0.25 0.5 0.25 0.375 0.25 0.5 0.125 0.375 0.125 0.375 0 0.25 0.375 0.375 0.375 0.5 0.375 0 0.375 0.125 0.375 1 0.25 0.875 0.25 1 0.125 0.875 0.125 0.75 0 0.875 0 0.75 0.125 0.75 0.375 0.875 0.375 1 0.375 0.625 0.25 0.625 0.375 0.625 0 0.625 0.125 1 1 0.75 0.75 0.5 1 0.5 0.5 1 0.5 0 1 0.25 0.75 0 0.5 0 0 0.25 0.25 0.5 0 1 0 0.75 0.25</float_array>
+ <technique_common>
+ <accessor source="#Plane8X8-Rectangle-UV-array" count="81" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane8X8-vertices">
+ <input semantic="POSITION" source="#Plane8X8-positions"/>
+ <input semantic="NORMAL" source="#Plane8X8-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="128">
+ <input semantic="VERTEX" source="#Plane8X8-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane8X8-Rectangle-UV" offset="1" set="1"/>
+ <p>9 0 26 1 25 2 29 3 25 2 26 1 12 4 28 5 27 6 29 3 27 6 28 5 10 7 31 8 30 9 33 10 30 9 31 8 9 0 32 11 26 1 33 10 26 1 32 11 11 12 35 13 34 14 37 15 34 14 35 13 10 7 36 16 31 8 37 15 31 8 36 16 12 4 27 6 38 17 40 18 38 17 27 6 11 12 39 19 35 13 40 18 35 13 39 19 14 20 42 21 41 22 45 23 41 22 42 21 16 24 44 25 43 26 45 23 43 26 44 25 15 27 47 28 46 29 49 30 46 29 47 28 14 20 48 31 42 21 49 30 42 21 48 31 10 7 50 32 36 16 52 33 36 16 50 32 15 27 51 34 47 28 52 33 47 28 51 34 16 24 43 26 53 35 54 36 53 35 43 26 10 7 30 9 50 32 54 36 50 32 30 9 18 37 56 38 55 39 59 40 55 39 56 38 20 41 58 42 57 43 59 40 57 43 58 42 19 44 61 45 60 46 63 47 60 46 61 45 18 37 62 48 56 38 63 47 56 38 62 48 15 27 64 49 51 34 66 50 51 34 64 49 19 44 65 51 61 45 66 50 61 45 65 51 20 41 57 43 67 52 68 53 67 52 57 43 15 27 46 29 64 49 68 53 64 49 46 29 22 54 70 55 69 56 73 57 69 56 70 55 23 58 72 59 71 60 73 57 71 60 72 59 11 12 74 61 39 19 76 62 39 19 74 61 22 54 75 63 70 55 76 62 70 55 75 63 19 44 77 64 65 51 78 65 65 51 77 64 11 12 34 14 74 61 78 65 74 61 34 14 23 58 71 60 79 66 80 67 79 66 71 60 19 44 60 46 77 64 80 67 77 64 60 46 2 68 25 2 28 5 29 3 28 5 25 2 13 69 27 6 26 1 29 3 26 1 27 6 4 70 30 9 32 11 33 10 32 11 30 9 13 69 26 1 31 8 33 10 31 8 26 1 8 71 34 14 36 16 37 15 36 16 34 14 13 69 31 8 35 13 37 15 35 13 31 8 7 72 38 17 39 19 40 18 39 19 38 17 13 69 35 13 27 6 40 18 27 6 35 13 3 73 41 22 44 25 45 23 44 25 41 22 17 74 43 26 42 21 45 23 42 21 43 26 5 75 46 29 48 31 49 30 48 31 46 29 17 74 42 21 47 28 49 30 47 28 42 21 8 71 36 16 51 34 52 33 51 34 36 16 17 74 47 28 50 32 52 33 50 32 47 28 4 70 53 35 30 9 54 36 30 9 53 35 17 74 50 32 43 26 54 36 43 26 50 32 1 76 55 39 58 42 59 40 58 42 55 39 21 77 57 43 56 38 59 40 56 38 57 43 6 78 60 46 62 48 63 47 62 48 60 46 21 77 56 38 61 45 63 47 61 45 56 38 8 71 51 34 65 51 66 50 65 51 51 34 21 77 61 45 64 49 66 50 64 49 61 45 5 75 67 52 46 29 68 53 46 29 67 52 21 77 64 49 57 43 68 53 57 43 64 49 0 79 69 56 72 59 73 57 72 59 69 56 24 80 71 60 70 55 73 57 70 55 71 60 7 72 39 19 75 63 76 62 75 63 39 19 24 80 70 55 74 61 76 62 74 61 70 55 8 71 65 51 34 14 78 65 34 14 65 51 24 80 74 61 77 64 78 65 77 64 74 61 6 78 79 66 60 46 80 67 60 46 79 66 24 80 77 64 71 60 80 67 71 60 77 64</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-SingleSided-8X8">
+ <node id="Plane" name="Plane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane8X8">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-mirroredUVs.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-mirroredUVs.dae
new file mode 100644
index 0000000..9ad4ada
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided-mirroredUVs.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-SingleSided-mirrored-UVs.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:41:42Z</created>
+ <modified>2008-09-19T17:41:42Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="polySurfaceShape1" name="polySurfaceShape1">
+ <mesh>
+ <source id="polySurfaceShape1-positions" name="position">
+ <float_array id="polySurfaceShape1-positions-array" count="12">50 -50 0 -50 -50 0 50 50 0 -50 50 0</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-positions-array" count="4" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-normals" name="normal">
+ <float_array id="polySurfaceShape1-normals-array" count="12">0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-normals-array" count="4" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-Rectangle-UV" name="Rectangle-UV">
+ <float_array id="polySurfaceShape1-Rectangle-UV-array" count="8">1 0 0 0 1 1 0 1</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-Rectangle-UV-array" count="4" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="polySurfaceShape1-vertices">
+ <input semantic="POSITION" source="#polySurfaceShape1-positions"/>
+ <input semantic="NORMAL" source="#polySurfaceShape1-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="2">
+ <input semantic="VERTEX" source="#polySurfaceShape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#polySurfaceShape1-Rectangle-UV" offset="1" set="1"/>
+ <p>2 0 3 1 0 2 1 3 0 2 3 1</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-SingleSided-mirrored-UVs">
+ <node id="Plane" name="Plane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#polySurfaceShape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided.dae b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided.dae
new file mode 100644
index 0000000..fb800e5
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/Plane-SingleSided.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/planes/Plane-SingleSided.mb</source_data>
+ </contributor>
+ <created>2008-09-19T17:40:13Z</created>
+ <modified>2008-09-19T17:40:13Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Plane" name="Plane">
+ <mesh>
+ <source id="Plane-positions" name="position">
+ <float_array id="Plane-positions-array" count="12">50 -50 0 -50 -50 0 50 50 0 -50 50 0</float_array>
+ <technique_common>
+ <accessor source="#Plane-positions-array" count="4" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane-normals" name="normal">
+ <float_array id="Plane-normals-array" count="12">0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#Plane-normals-array" count="4" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Plane-Rectangle-UV" name="Rectangle-UV">
+ <float_array id="Plane-Rectangle-UV-array" count="8">1 1 0 1 1 0 0 0</float_array>
+ <technique_common>
+ <accessor source="#Plane-Rectangle-UV-array" count="4" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Plane-vertices">
+ <input semantic="POSITION" source="#Plane-positions"/>
+ <input semantic="NORMAL" source="#Plane-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="2">
+ <input semantic="VERTEX" source="#Plane-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Plane-Rectangle-UV" offset="1" set="1"/>
+ <p>2 0 3 1 0 2 1 3 0 2 3 1</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Plane-SingleSided">
+ <node id="_Plane" name="Plane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Plane">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-1.dae b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-1.dae
new file mode 100644
index 0000000..69f2742
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-1.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-09-19T17:45:23Z</created>
+ <modified>2008-09-19T17:45:23Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="polySurfaceShape1" name="polySurfaceShape1">
+ <mesh>
+ <source id="polySurfaceShape1-positions" name="position">
+ <float_array id="polySurfaceShape1-positions-array" count="96">-50 -32.5 0 -50 32.5 0 -50 36.4476 0 -48.9684 41.6339 0 -46.0306 46.0306 0 -41.6339 48.9684 0 -36.4476 50 0 -32.5 50 0 32.5 50 0 36.4476 50 0 41.6339 48.9684 0 46.0306 46.0306 0 48.9684 41.6339 0 50 36.4476 0 50 32.5 0 50 -32.5 0 50 -36.4476 0 48.9684 -41.6339 0 46.0306 -46.0306 0 41.6339 -48.9684 0 36.4476 -50 0 32.5 -50 0 -32.5 -50 0 -36.4476 -50 0 -41.6339 -48.9684 0 -46.0306 -46.0306 0 -48.9684 -41.6339 0 -50 -36.4476 0 -32.5 -32.5 0 32.5 -32.5 0 -32.5 32.5 0 32.5 32.5 0</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-positions-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-normals" name="normal">
+ <float_array id="polySurfaceShape1-normals-array" count="96">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-normals-array" count="32" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-Texture" name="Texture">
+ <float_array id="polySurfaceShape1-Texture-array" count="64">0 0.825 0.175 0.825 0 0.864476 0.010316 0.916339 0.039694 0.960306 0.083661 0.989684 0.135524 1 0.175 1 0.825 1 0.825 0.825 0.864476 1 0.916339 0.989684 0.960306 0.960306 0.989684 0.916339 1 0.864476 1 0.825 1 0.175 0.825 0.175 1 0.135524 0.989684 0.083661 0.960306 0.039694 0.916339 0.010316 0.864476 0 0.825 0 0.175 0 0.175 0.175 0.135524 0 0.083661 0.010316 0.039694 0.039694 0.010316 0.083661 0 0.135524 0 0.175</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-Texture-array" count="32" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="polySurfaceShape1-vertices">
+ <input semantic="POSITION" source="#polySurfaceShape1-positions"/>
+ <input semantic="NORMAL" source="#polySurfaceShape1-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="34">
+ <input semantic="VERTEX" source="#polySurfaceShape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#polySurfaceShape1-Texture" offset="1" set="1"/>
+ <p>1 0 30 1 2 2 2 2 30 1 3 3 3 3 30 1 4 4 4 4 30 1 5 5 5 5 30 1 6 6 6 6 30 1 7 7 8 8 31 9 9 10 9 10 31 9 10 11 10 11 31 9 11 12 11 12 31 9 12 13 12 13 31 9 13 14 13 14 31 9 14 15 15 16 29 17 16 18 16 18 29 17 17 19 17 19 29 17 18 20 18 20 29 17 19 21 19 21 29 17 20 22 20 22 29 17 21 23 22 24 28 25 23 26 23 26 28 25 24 27 24 27 28 25 25 28 25 28 28 25 26 29 26 29 28 25 27 30 27 30 28 25 0 31 0 31 28 25 1 0 30 1 1 0 28 25 14 15 31 9 15 16 29 17 15 16 31 9 28 25 29 17 30 1 31 9 30 1 29 17 7 7 30 1 8 8 31 9 8 8 30 1 21 23 29 17 22 24 28 25 22 24 29 17</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="RoundedPlane" name="RoundedPlane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#polySurfaceShape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-2.dae b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-2.dae
new file mode 100644
index 0000000..5b38d1b
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-2.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-09-19T17:46:34Z</created>
+ <modified>2008-09-19T17:46:34Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="polySurfaceShape1" name="polySurfaceShape1">
+ <mesh>
+ <source id="polySurfaceShape1-positions" name="position">
+ <float_array id="polySurfaceShape1-positions-array" count="108">-50 -25 0 -50 25 0 -50 29.7811 0 -49.0104 36.0291 0 -46.1385 41.6655 0 -41.6655 46.1385 0 -36.0291 49.0104 0 -29.7811 50 0 -25 50 0 25 50 0 29.7811 50 0 36.0291 49.0104 0 41.6655 46.1385 0 46.1385 41.6655 0 49.0104 36.0291 0 50 29.7811 0 50 25 0 50 -25 0 50 -29.7811 0 49.0104 -36.0291 0 46.1385 -41.6655 0 41.6655 -46.1385 0 36.0291 -49.0104 0 29.7811 -50 0 25 -50 0 -25 -50 0 -29.7811 -50 0 -36.0291 -49.0104 0 -41.6655 -46.1385 0 -46.1385 -41.6655 0 -49.0104 -36.0291 0 -50 -29.7811 0 -25 -25 0 25 -25 0 -25 25 0 25 25 0</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-positions-array" count="36" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-normals" name="normal">
+ <float_array id="polySurfaceShape1-normals-array" count="108">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-normals-array" count="36" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-Texture" name="Texture">
+ <float_array id="polySurfaceShape1-Texture-array" count="72">0 0.75 0.25 0.75 0 0.797811 0.009895 0.860291 0.038614 0.916655 0.083345 0.961385 0.139709 0.990104 0.202189 1 0.25 1 0.75 1 0.75 0.75 0.797811 1 0.860291 0.990104 0.916655 0.961385 0.961385 0.916655 0.990104 0.860291 1 0.797811 1 0.75 1 0.25 0.75 0.25 1 0.202189 0.990104 0.139709 0.961385 0.083345 0.916655 0.038614 0.860291 0.009895 0.797811 0 0.75 0 0.25 0 0.25 0.25 0.202189 0 0.139709 0.009895 0.083345 0.038614 0.038614 0.083345 0.009895 0.139709 0 0.202189 0 0.25</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-Texture-array" count="36" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="polySurfaceShape1-vertices">
+ <input semantic="POSITION" source="#polySurfaceShape1-positions"/>
+ <input semantic="NORMAL" source="#polySurfaceShape1-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="38">
+ <input semantic="VERTEX" source="#polySurfaceShape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#polySurfaceShape1-Texture" offset="1" set="1"/>
+ <p>1 0 34 1 2 2 2 2 34 1 3 3 3 3 34 1 4 4 4 4 34 1 5 5 5 5 34 1 6 6 6 6 34 1 7 7 7 7 34 1 8 8 9 9 35 10 10 11 10 11 35 10 11 12 11 12 35 10 12 13 12 13 35 10 13 14 13 14 35 10 14 15 14 15 35 10 15 16 15 16 35 10 16 17 17 18 33 19 18 20 18 20 33 19 19 21 19 21 33 19 20 22 20 22 33 19 21 23 21 23 33 19 22 24 22 24 33 19 23 25 23 25 33 19 24 26 25 27 32 28 26 29 26 29 32 28 27 30 27 30 32 28 28 31 28 31 32 28 29 32 29 32 32 28 30 33 30 33 32 28 31 34 31 34 32 28 0 35 0 35 32 28 1 0 34 1 1 0 32 28 8 8 34 1 9 9 35 10 9 9 34 1 16 17 35 10 17 18 33 19 17 18 35 10 24 26 33 19 25 27 32 28 25 27 33 19 32 28 33 19 34 1 35 10 34 1 33 19</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="RoundedPlane" name="RoundedPlane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#polySurfaceShape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3a.dae b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3a.dae
new file mode 100644
index 0000000..f9de3a8
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3a.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-09-19T17:47:28Z</created>
+ <modified>2008-09-19T17:47:28Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="polySurfaceShape1" name="polySurfaceShape1">
+ <mesh>
+ <source id="polySurfaceShape1-positions" name="position">
+ <float_array id="polySurfaceShape1-positions-array" count="120">-50 -7.5 0 -50 7.5 0 -50 14.5544 0 -48.7922 23.7284 0 -45.2512 32.2772 0 -39.6182 39.6182 0 -32.2772 45.2512 0 -23.7284 48.7922 0 -14.5544 50 0 -7.5 50 0 7.5 50 0 14.5544 50 0 23.7284 48.7922 0 32.2772 45.2512 0 39.6182 39.6182 0 45.2512 32.2772 0 48.7922 23.7284 0 50 14.5544 0 50 7.5 0 50 -7.5 0 50 -14.5544 0 48.7922 -23.7284 0 45.2512 -32.2772 0 39.6182 -39.6182 0 32.2772 -45.2512 0 23.7284 -48.7922 0 14.5544 -50 0 7.5 -50 0 -7.5 -50 0 -14.5544 -50 0 -23.7284 -48.7922 0 -32.2772 -45.2512 0 -39.6182 -39.6182 0 -45.2512 -32.2772 0 -48.7922 -23.7284 0 -50 -14.5544 0 -7.5 -7.5 0 7.5 -7.5 0 -7.5 7.5 0 7.5 7.5 0</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-positions-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-normals" name="normal">
+ <float_array id="polySurfaceShape1-normals-array" count="120">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-normals-array" count="40" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-Texture" name="Texture">
+ <float_array id="polySurfaceShape1-Texture-array" count="80">0 0.575 0.425 0.575 0 0.645544 0.012077 0.737284 0.047488 0.822772 0.103818 0.896182 0.177228 0.952512 0.262716 0.987922 0.354456 1 0.425 1 0.575 1 0.575 0.575 0.645544 1 0.737284 0.987922 0.822772 0.952512 0.896182 0.896182 0.952512 0.822772 0.987922 0.737284 1 0.645544 1 0.575 1 0.425 0.575 0.425 1 0.354456 0.987922 0.262716 0.952512 0.177228 0.896182 0.103818 0.822772 0.047488 0.737284 0.012077 0.645544 0 0.575 0 0.425 0 0.425 0.425 0.354456 0 0.262716 0.012077 0.177228 0.047488 0.103818 0.103818 0.047488 0.177228 0.012077 0.262716 0 0.354456 0 0.425</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-Texture-array" count="40" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="polySurfaceShape1-vertices">
+ <input semantic="POSITION" source="#polySurfaceShape1-positions"/>
+ <input semantic="NORMAL" source="#polySurfaceShape1-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="42">
+ <input semantic="VERTEX" source="#polySurfaceShape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#polySurfaceShape1-Texture" offset="1" set="1"/>
+ <p>1 0 38 1 2 2 2 2 38 1 3 3 3 3 38 1 4 4 4 4 38 1 5 5 5 5 38 1 6 6 6 6 38 1 7 7 7 7 38 1 8 8 8 8 38 1 9 9 10 10 39 11 11 12 11 12 39 11 12 13 12 13 39 11 13 14 13 14 39 11 14 15 14 15 39 11 15 16 15 16 39 11 16 17 16 17 39 11 17 18 17 18 39 11 18 19 19 20 37 21 20 22 20 22 37 21 21 23 21 23 37 21 22 24 22 24 37 21 23 25 23 25 37 21 24 26 24 26 37 21 25 27 25 27 37 21 26 28 26 28 37 21 27 29 28 30 36 31 29 32 29 32 36 31 30 33 30 33 36 31 31 34 31 34 36 31 32 35 32 35 36 31 33 36 33 36 36 31 34 37 34 37 36 31 35 38 35 38 36 31 0 39 0 39 36 31 1 0 38 1 1 0 36 31 18 19 39 11 19 20 37 21 19 20 39 11 36 31 37 21 38 1 39 11 38 1 37 21 9 9 38 1 10 10 39 11 10 10 38 1 27 29 37 21 28 30 36 31 28 30 37 21</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="RoundedPlane" name="RoundedPlane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#polySurfaceShape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3b.dae b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3b.dae
new file mode 100644
index 0000000..41fd5f2
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Planes/RoundedPlane-3b.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-09-19T17:48:26Z</created>
+ <modified>2008-09-19T17:48:26Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="polySurfaceShape1" name="polySurfaceShape1">
+ <mesh>
+ <source id="polySurfaceShape1-positions" name="position">
+ <float_array id="polySurfaceShape1-positions-array" count="144">-50 -7.5 0 -50 7.5 0 -50 13.0802 0 -49.2906 20.2829 0 -47.1896 27.2088 0 -43.7779 33.5917 0 -39.1864 39.1864 0 -33.5917 43.7779 0 -27.2088 47.1897 0 -20.2829 49.2906 0 -13.0802 50 0 -7.5 50 0 7.5 50 0 13.0802 50 0 20.2829 49.2906 0 27.2088 47.1897 0 33.5917 43.7779 0 39.1864 39.1864 0 43.7779 33.5917 0 47.1897 27.2088 0 49.2906 20.2829 0 50 13.0802 0 50 7.5 0 50 -7.5 0 50 -13.0802 0 49.2906 -20.2829 0 47.1897 -27.2088 0 43.7779 -33.5917 0 39.1864 -39.1864 0 33.5917 -43.7779 0 27.2088 -47.1896 0 20.2829 -49.2906 0 13.0802 -50 0 7.5 -50 0 -7.5 -50 0 -13.0802 -50 0 -20.2829 -49.2906 0 -27.2088 -47.1896 0 -33.5917 -43.7779 0 -39.1864 -39.1864 0 -43.7779 -33.5917 0 -47.1896 -27.2088 0 -49.2906 -20.2829 0 -50 -13.0802 0 -7.5 -7.5 0 7.5 -7.5 0 -7.5 7.5 0 7.5 7.5 0</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-positions-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-normals" name="normal">
+ <float_array id="polySurfaceShape1-normals-array" count="144">0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-normals-array" count="48" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="polySurfaceShape1-Texture" name="Texture">
+ <float_array id="polySurfaceShape1-Texture-array" count="96">0 0.575 0.425 0.575 0 0.630802 0.007094 0.702829 0.028103 0.772088 0.062221 0.835917 0.108136 0.891864 0.164083 0.937779 0.227912 0.971897 0.297171 0.992906 0.369198 1 0.425 1 0.575 1 0.575 0.575 0.630802 1 0.702829 0.992906 0.772088 0.971897 0.835917 0.937779 0.891864 0.891864 0.937779 0.835917 0.971897 0.772088 0.992906 0.702829 1 0.630802 1 0.575 1 0.425 0.575 0.425 1 0.369198 0.992906 0.297171 0.971897 0.227912 0.937779 0.164083 0.891864 0.108136 0.835917 0.062221 0.772088 0.028103 0.702829 0.007094 0.630802 0 0.575 0 0.425 0 0.425 0.425 0.369198 0 0.297171 0.007094 0.227912 0.028103 0.164083 0.062221 0.108136 0.108136 0.062221 0.164083 0.028103 0.227912 0.007094 0.297171 0 0.369198 0 0.425</float_array>
+ <technique_common>
+ <accessor source="#polySurfaceShape1-Texture-array" count="48" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="polySurfaceShape1-vertices">
+ <input semantic="POSITION" source="#polySurfaceShape1-positions"/>
+ <input semantic="NORMAL" source="#polySurfaceShape1-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="50">
+ <input semantic="VERTEX" source="#polySurfaceShape1-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#polySurfaceShape1-Texture" offset="1" set="1"/>
+ <p>1 0 46 1 2 2 2 2 46 1 3 3 3 3 46 1 4 4 4 4 46 1 5 5 5 5 46 1 6 6 6 6 46 1 7 7 7 7 46 1 8 8 8 8 46 1 9 9 9 9 46 1 10 10 10 10 46 1 11 11 12 12 47 13 13 14 13 14 47 13 14 15 14 15 47 13 15 16 15 16 47 13 16 17 16 17 47 13 17 18 17 18 47 13 18 19 18 19 47 13 19 20 19 20 47 13 20 21 20 21 47 13 21 22 21 22 47 13 22 23 23 24 45 25 24 26 24 26 45 25 25 27 25 27 45 25 26 28 26 28 45 25 27 29 27 29 45 25 28 30 28 30 45 25 29 31 29 31 45 25 30 32 30 32 45 25 31 33 31 33 45 25 32 34 32 34 45 25 33 35 34 36 44 37 35 38 35 38 44 37 36 39 36 39 44 37 37 40 37 40 44 37 38 41 38 41 44 37 39 42 39 42 44 37 40 43 40 43 44 37 41 44 41 44 44 37 42 45 42 45 44 37 43 46 43 46 44 37 0 47 0 47 44 37 1 0 46 1 1 0 44 37 22 23 47 13 23 24 45 25 23 24 47 13 44 37 45 25 46 1 47 13 46 1 45 25 11 11 46 1 12 12 47 13 12 12 46 1 33 35 45 25 34 36 44 37 34 36 45 25</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="RoundedPlane" name="RoundedPlane" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#polySurfaceShape1">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-high-doublesided.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-high-doublesided.dae
new file mode 100644
index 0000000..2e904ce
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-high-doublesided.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/spheres/Sphere-high-doublesided.mb</source_data>
+ </contributor>
+ <created>2008-09-19T22:05:55Z</created>
+ <modified>2008-09-19T22:05:55Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="2172">0 50 0 8.72494 49.1512 2.8349 0 49.1512 9.17395 17.1537 46.6335 5.57358 8.84255 47.6832 12.1707 0 46.6335 18.0365 25 42.5325 8.12299 17.2996 44.4764 14.919 8.84298 44.4764 21.0631 0 42.5325 26.2866 31.9975 36.9875 10.3966 26.1426 38.7299 17.7923 17.8411 39.7327 24.5562 8.84298 38.7299 30.3612 0 36.9875 33.6441 37.9086 30.1865 12.3172 32.6527 32.2104 19.9071 26.1426 33.2344 26.6841 17.2996 33.2344 33.1089 8.84255 32.2104 37.2062 0 30.1865 39.8594 42.5325 22.3607 13.8197 37.9086 24.5167 21.4912 31.9975 25.8403 28.4331 25 26.2866 34.4095 17.1537 25.8403 39.2177 8.72494 24.5167 42.6943 0 22.3607 44.7214 5.39231 49.1512 -7.42188 10.6016 46.6335 -14.5918 14.3075 47.6832 -4.6488 15.4509 42.5325 -21.2663 19.5347 44.4764 -11.8426 22.7648 44.4764 -1.90132 19.7755 36.9875 -27.2187 25 38.7299 -19.3649 28.8675 39.7327 -9.37962 31.6078 38.7299 0.971941 23.4288 30.1865 -32.247 29.023 32.2104 -24.9029 33.4566 33.2344 -16.6172 36.8343 33.2344 -6.22166 38.1177 32.2104 3.08758 26.2866 22.3607 -36.1803 32.1537 24.5167 -29.4121 36.9292 25.8403 -21.6451 40.4509 26.2866 -13.1433 42.599 25.8403 -4.19521 43.3009 24.5167 4.89537 -5.39231 49.1512 -7.42188 -10.6016 46.6335 -14.5918 0 47.6832 -15.0438 -15.4509 42.5325 -21.2663 -5.22646 44.4764 -22.2382 5.22646 44.4764 -22.2382 -19.7755 36.9875 -27.2187 -10.6917 38.7299 -29.7605 0 39.7327 -30.3531 10.6917 38.7299 -29.7605 -23.4288 30.1865 -32.247 -14.7155 32.2104 -35.298 -5.46526 33.2344 -36.9541 5.46526 33.2344 -36.9541 14.7155 32.2104 -35.298 -26.2866 22.3607 -36.1803 -18.0365 24.5167 -39.6688 -9.17395 25.8403 -41.8105 0 26.2866 -42.5325 9.17395 25.8403 -41.8105 18.0365 24.5167 -39.6688 -8.72494 49.1512 2.8349 -17.1537 46.6335 5.57358 -14.3075 47.6832 -4.6488 -25 42.5325 8.12299 -22.7648 44.4764 -1.90132 -19.5347 44.4764 -11.8426 -31.9975 36.9875 10.3966 -31.6078 38.7299 0.971941 -28.8675 39.7327 -9.37962 -25 38.7299 -19.3649 -37.9086 30.1865 12.3172 -38.1177 32.2104 3.08758 -36.8343 33.2344 -6.22166 -33.4566 33.2344 -16.6172 -29.023 32.2104 -24.9029 -42.5325 22.3607 13.8197 -43.3009 24.5167 4.89537 -42.599 25.8403 -4.19521 -40.4509 26.2866 -13.1433 -36.9292 25.8403 -21.6451 -32.1537 24.5167 -29.4121 -8.84255 47.6832 12.1707 -8.84298 44.4764 21.0631 -17.2996 44.4764 14.919 -8.84298 38.7299 30.3612 -17.8411 39.7327 24.5562 -26.1426 38.7299 17.7923 -8.84255 32.2104 37.2062 -17.2996 33.2344 33.1089 -26.1426 33.2344 26.6841 -32.6527 32.2104 19.9071 -8.72494 24.5167 42.6943 -17.1537 25.8403 39.2177 -25 26.2866 34.4095 -31.9975 25.8403 28.4331 -37.9086 24.5167 21.4912 0 -50 0 5.39231 -49.1512 7.42188 8.72494 -49.1512 -2.8349 10.6016 -46.6335 14.5918 14.3075 -47.6832 4.6488 17.1537 -46.6335 -5.57358 15.4509 -42.5325 21.2663 19.5347 -44.4764 11.8426 22.7648 -44.4764 1.90132 25 -42.5325 -8.12299 19.7755 -36.9875 27.2187 25 -38.7299 19.3649 28.8675 -39.7327 9.37962 31.6078 -38.7299 -0.971941 31.9975 -36.9875 -10.3966 23.4288 -30.1865 32.247 29.023 -32.2104 24.9029 33.4566 -33.2344 16.6172 36.8343 -33.2344 6.22166 38.1177 -32.2104 -3.08758 37.9086 -30.1865 -12.3172 26.2866 -22.3607 36.1803 32.1537 -24.5167 29.4121 36.9292 -25.8403 21.6451 40.4509 -26.2866 13.1433 42.599 -25.8403 4.19521 43.3009 -24.5167 -4.89537 42.5325 -22.3607 -13.8197 0 -49.1512 -9.17395 8.84255 -47.6832 -12.1707 0 -46.6335 -18.0365 17.2996 -44.4764 -14.919 8.84298 -44.4764 -21.0631 0 -42.5325 -26.2866 26.1426 -38.7299 -17.7923 17.8411 -39.7327 -24.5562 8.84298 -38.7299 -30.3612 0 -36.9875 -33.6441 32.6527 -32.2104 -19.9071 26.1426 -33.2344 -26.6841 17.2996 -33.2344 -33.1089 8.84255 -32.2104 -37.2062 0 -30.1865 -39.8594 37.9086 -24.5167 -21.4912 31.9975 -25.8403 -28.4331 25 -26.2866 -34.4095 17.1537 -25.8403 -39.2177 8.72494 -24.5167 -42.6943 0 -22.3607 -44.7214 -8.72494 -49.1512 -2.8349 -8.84255 -47.6832 -12.1707 -17.1537 -46.6335 -5.57358 -8.84298 -44.4764 -21.0631 -17.2996 -44.4764 -14.919 -25 -42.5325 -8.12299 -8.84298 -38.7299 -30.3612 -17.8411 -39.7327 -24.5562 -26.1426 -38.7299 -17.7923 -31.9975 -36.9875 -10.3966 -8.84255 -32.2104 -37.2062 -17.2996 -33.2344 -33.1089 -26.1426 -33.2344 -26.6841 -32.6527 -32.2104 -19.9071 -37.9086 -30.1865 -12.3172 -8.72494 -24.5167 -42.6943 -17.1537 -25.8403 -39.2177 -25 -26.2866 -34.4095 -31.9975 -25.8403 -28.4331 -37.9086 -24.5167 -21.4912 -42.5325 -22.3607 -13.8197 -5.39231 -49.1512 7.42188 -14.3075 -47.6832 4.6488 -10.6016 -46.6335 14.5918 -22.7648 -44.4764 1.90132 -19.5347 -44.4764 11.8426 -15.4509 -42.5325 21.2663 -31.6078 -38.7299 -0.971941 -28.8675 -39.7327 9.37962 -25 -38.7299 19.3649 -19.7755 -36.9875 27.2187 -38.1177 -32.2104 -3.08758 -36.8343 -33.2344 6.22166 -33.4566 -33.2344 16.6172 -29.023 -32.2104 24.9029 -23.4288 -30.1865 32.247 -43.3009 -24.5167 -4.89537 -42.599 -25.8403 4.19521 -40.4509 -26.2866 13.1433 -36.9292 -25.8403 21.6451 -32.1537 -24.5167 29.4121 -26.2866 -22.3607 36.1803 0 -47.6832 15.0438 -5.22646 -44.4764 22.2382 5.22646 -44.4764 22.2382 -10.6917 -38.7299 29.7605 0 -39.7327 30.3531 10.6917 -38.7299 29.7605 -14.7155 -32.2104 35.298 -5.46526 -33.2344 36.9541 5.46526 -33.2344 36.9541 14.7155 -32.2104 35.298 -18.0365 -24.5167 39.6688 -9.17395 -25.8403 41.8105 0 -26.2866 42.5325 9.17395 -25.8403 41.8105 18.0365 -24.5167 39.6688 5.39231 15.3427 47.2813 14.3075 17.1665 44.7281 10.6016 7.80382 48.236 22.7648 18.1898 40.6312 19.5347 9.29806 45.0771 15.4509 0 47.5528 31.6078 18.1898 34.2064 28.8675 9.37962 39.7327 25 0 43.3013 19.7755 -7.80382 45.2552 38.1177 17.1665 27.429 36.8343 9.29806 32.5082 33.4566 0 37.1572 29.023 -7.86893 39.9468 23.4288 -15.3427 41.4209 43.3009 15.3427 19.7391 42.599 7.80382 24.9884 40.4509 0 29.3893 36.9292 -7.80382 32.7923 32.1537 -15.3427 35.0819 46.6335 15.3427 9.48234 46.9602 17.1665 0.214459 49.1512 7.80382 4.82303 45.6773 18.1898 -9.09492 48.9074 9.29806 -4.64903 50 0 0 42.2995 18.1898 -19.4905 46.7086 9.37962 -15.1765 48.9074 0 -10.3955 49.1512 -7.80382 -4.82303 37.8656 17.1665 -27.776 42.2995 9.29806 -24.9859 45.6773 0 -20.3369 46.9602 -7.86893 -15.2583 46.6335 -15.3427 -9.48234 32.1537 15.3427 -35.0819 36.9292 7.80382 -32.7923 40.4509 0 -29.3893 42.599 -7.80382 -24.9884 43.3009 -15.3427 -19.7391 23.4288 15.3427 -41.4209 14.7155 17.1665 -44.5956 19.7755 7.80382 -45.2552 5.46526 18.1898 -46.2521 10.6917 9.29806 -47.9503 15.4509 0 -47.5528 -5.46526 18.1898 -46.2521 0 9.37962 -49.1123 5.22646 0 -49.7261 10.6016 -7.80382 -48.236 -14.7155 17.1665 -44.5956 -10.6917 9.29806 -47.9503 -5.22646 0 -49.7261 0 -7.86893 -49.3769 5.39231 -15.3427 -47.2813 -23.4288 15.3427 -41.4209 -19.7755 7.80382 -45.2552 -15.4509 0 -47.5528 -10.6016 -7.80382 -48.236 -5.39231 -15.3427 -47.2813 -32.1537 15.3427 -35.0819 -37.8656 17.1665 -27.776 -36.9292 7.80382 -32.7923 -42.2995 18.1898 -19.4905 -42.2995 9.29806 -24.9859 -40.4509 0 -29.3893 -45.6773 18.1898 -9.09492 -46.7086 9.37962 -15.1765 -45.6773 0 -20.3369 -42.599 -7.80382 -24.9884 -46.9602 17.1665 0.214459 -48.9074 9.29806 -4.64903 -48.9074 0 -10.3955 -46.9602 -7.86893 -15.2583 -43.3009 -15.3427 -19.7391 -46.6335 15.3427 9.48234 -49.1512 7.80382 4.82303 -50 0 0 -49.1512 -7.80382 -4.82303 -46.6335 -15.3427 -9.48234 -43.3009 15.3427 19.7391 -38.1177 17.1665 27.429 -42.599 7.80382 24.9884 -31.6078 18.1898 34.2064 -36.8343 9.29806 32.5082 -40.4509 0 29.3893 -22.7648 18.1898 40.6312 -28.8675 9.37962 39.7327 -33.4566 0 37.1572 -36.9292 -7.80382 32.7923 -14.3075 17.1665 44.7281 -19.5347 9.29806 45.0771 -25 0 43.3013 -29.023 -7.86893 39.9468 -32.1537 -15.3427 35.0819 -5.39231 15.3427 47.2813 -10.6016 7.80382 48.236 -15.4509 0 47.5528 -19.7755 -7.80382 45.2552 -23.4288 -15.3427 41.4209 46.9602 -17.1665 -0.214459 45.6773 -18.1898 9.09492 48.9074 -9.29806 4.64903 42.2995 -18.1898 19.4905 46.7086 -9.37962 15.1765 48.9074 0 10.3955 37.8656 -17.1665 27.776 42.2995 -9.29806 24.9859 45.6773 0 20.3369 46.9602 7.86893 15.2583 14.3075 -17.1665 -44.7281 22.7648 -18.1898 -40.6312 19.5347 -9.29806 -45.0771 31.6078 -18.1898 -34.2064 28.8675 -9.37962 -39.7327 25 0 -43.3013 38.1177 -17.1665 -27.429 36.8343 -9.29806 -32.5082 33.4566 0 -37.1572 29.023 7.86893 -39.9468 -38.1177 -17.1665 -27.429 -31.6078 -18.1898 -34.2064 -36.8343 -9.29806 -32.5082 -22.7648 -18.1898 -40.6312 -28.8675 -9.37962 -39.7327 -33.4566 0 -37.1572 -14.3075 -17.1665 -44.7281 -19.5347 -9.29806 -45.0771 -25 0 -43.3013 -29.023 7.86893 -39.9468 -37.8656 -17.1665 27.776 -42.2995 -18.1898 19.4905 -42.2995 -9.29806 24.9859 -45.6773 -18.1898 9.09492 -46.7086 -9.37962 15.1765 -45.6773 0 20.3369 -46.9602 -17.1665 -0.214459 -48.9074 -9.29806 4.64903 -48.9074 0 10.3955 -46.9602 7.86893 15.2583 14.7155 -17.1665 44.5956 5.46526 -18.1898 46.2521 10.6917 -9.29806 47.9503 -5.46526 -18.1898 46.2521 0 -9.37962 49.1123 5.22646 0 49.7261 -14.7155 -17.1665 44.5956 -10.6917 -9.29806 47.9503 -5.22646 0 49.7261 0 7.86893 49.3769 0 50 0 8.72494 49.1512 2.8349 0 49.1512 9.17395 17.1537 46.6335 5.57358 8.84255 47.6832 12.1707 0 46.6335 18.0365 25 42.5325 8.12299 17.2996 44.4764 14.919 8.84298 44.4764 21.0631 0 42.5325 26.2866 31.9975 36.9875 10.3966 26.1426 38.7299 17.7923 17.8411 39.7327 24.5562 8.84298 38.7299 30.3612 0 36.9875 33.6441 37.9086 30.1865 12.3172 32.6527 32.2104 19.9071 26.1426 33.2344 26.6841 17.2996 33.2344 33.1089 8.84255 32.2104 37.2062 0 30.1865 39.8594 42.5325 22.3607 13.8197 37.9086 24.5167 21.4912 31.9975 25.8403 28.4331 25 26.2866 34.4095 17.1537 25.8403 39.2177 8.72494 24.5167 42.6943 0 22.3607 44.7214 5.39231 49.1512 -7.42188 10.6016 46.6335 -14.5918 14.3075 47.6832 -4.6488 15.4509 42.5325 -21.2663 19.5347 44.4764 -11.8426 22.7648 44.4764 -1.90132 19.7755 36.9875 -27.2187 25 38.7299 -19.3649 28.8675 39.7327 -9.37962 31.6078 38.7299 0.971941 23.4288 30.1865 -32.247 29.023 32.2104 -24.9029 33.4566 33.2344 -16.6172 36.8343 33.2344 -6.22166 38.1177 32.2104 3.08758 26.2866 22.3607 -36.1803 32.1537 24.5167 -29.4121 36.9292 25.8403 -21.6451 40.4509 26.2866 -13.1433 42.599 25.8403 -4.19521 43.3009 24.5167 4.89537 -5.39231 49.1512 -7.42188 -10.6016 46.6335 -14.5918 0 47.6832 -15.0438 -15.4509 42.5325 -21.2663 -5.22646 44.4764 -22.2382 5.22646 44.4764 -22.2382 -19.7755 36.9875 -27.2187 -10.6917 38.7299 -29.7605 0 39.7327 -30.3531 10.6917 38.7299 -29.7605 -23.4288 30.1865 -32.247 -14.7155 32.2104 -35.298 -5.46526 33.2344 -36.9541 5.46526 33.2344 -36.9541 14.7155 32.2104 -35.298 -26.2866 22.3607 -36.1803 -18.0365 24.5167 -39.6688 -9.17395 25.8403 -41.8105 0 26.2866 -42.5325 9.17395 25.8403 -41.8105 18.0365 24.5167 -39.6688 -8.72494 49.1512 2.8349 -17.1537 46.6335 5.57358 -14.3075 47.6832 -4.6488 -25 42.5325 8.12299 -22.7648 44.4764 -1.90132 -19.5347 44.4764 -11.8426 -31.9975 36.9875 10.3966 -31.6078 38.7299 0.971941 -28.8675 39.7327 -9.37962 -25 38.7299 -19.3649 -37.9086 30.1865 12.3172 -38.1177 32.2104 3.08758 -36.8343 33.2344 -6.22166 -33.4566 33.2344 -16.6172 -29.023 32.2104 -24.9029 -42.5325 22.3607 13.8197 -43.3009 24.5167 4.89537 -42.599 25.8403 -4.19521 -40.4509 26.2866 -13.1433 -36.9292 25.8403 -21.6451 -32.1537 24.5167 -29.4121 -8.84255 47.6832 12.1707 -8.84298 44.4764 21.0631 -17.2996 44.4764 14.919 -8.84298 38.7299 30.3612 -17.8411 39.7327 24.5562 -26.1426 38.7299 17.7923 -8.84255 32.2104 37.2062 -17.2996 33.2344 33.1089 -26.1426 33.2344 26.6841 -32.6527 32.2104 19.9071 -8.72494 24.5167 42.6943 -17.1537 25.8403 39.2177 -25 26.2866 34.4095 -31.9975 25.8403 28.4331 -37.9086 24.5167 21.4912 0 -50 0 5.39231 -49.1512 7.42188 8.72494 -49.1512 -2.8349 10.6016 -46.6335 14.5918 14.3075 -47.6832 4.6488 17.1537 -46.6335 -5.57358 15.4509 -42.5325 21.2663 19.5347 -44.4764 11.8426 22.7648 -44.4764 1.90132 25 -42.5325 -8.12299 19.7755 -36.9875 27.2187 25 -38.7299 19.3649 28.8675 -39.7327 9.37962 31.6078 -38.7299 -0.971941 31.9975 -36.9875 -10.3966 23.4288 -30.1865 32.247 29.023 -32.2104 24.9029 33.4566 -33.2344 16.6172 36.8343 -33.2344 6.22166 38.1177 -32.2104 -3.08758 37.9086 -30.1865 -12.3172 26.2866 -22.3607 36.1803 32.1537 -24.5167 29.4121 36.9292 -25.8403 21.6451 40.4509 -26.2866 13.1433 42.599 -25.8403 4.19521 43.3009 -24.5167 -4.89537 42.5325 -22.3607 -13.8197 0 -49.1512 -9.17395 8.84255 -47.6832 -12.1707 0 -46.6335 -18.0365 17.2996 -44.4764 -14.919 8.84298 -44.4764 -21.0631 0 -42.5325 -26.2866 26.1426 -38.7299 -17.7923 17.8411 -39.7327 -24.5562 8.84298 -38.7299 -30.3612 0 -36.9875 -33.6441 32.6527 -32.2104 -19.9071 26.1426 -33.2344 -26.6841 17.2996 -33.2344 -33.1089 8.84255 -32.2104 -37.2062 0 -30.1865 -39.8594 37.9086 -24.5167 -21.4912 31.9975 -25.8403 -28.4331 25 -26.2866 -34.4095 17.1537 -25.8403 -39.2177 8.72494 -24.5167 -42.6943 0 -22.3607 -44.7214 -8.72494 -49.1512 -2.8349 -8.84255 -47.6832 -12.1707 -17.1537 -46.6335 -5.57358 -8.84298 -44.4764 -21.0631 -17.2996 -44.4764 -14.919 -25 -42.5325 -8.12299 -8.84298 -38.7299 -30.3612 -17.8411 -39.7327 -24.5562 -26.1426 -38.7299 -17.7923 -31.9975 -36.9875 -10.3966 -8.84255 -32.2104 -37.2062 -17.2996 -33.2344 -33.1089 -26.1426 -33.2344 -26.6841 -32.6527 -32.2104 -19.9071 -37.9086 -30.1865 -12.3172 -8.72494 -24.5167 -42.6943 -17.1537 -25.8403 -39.2177 -25 -26.2866 -34.4095 -31.9975 -25.8403 -28.4331 -37.9086 -24.5167 -21.4912 -42.5325 -22.3607 -13.8197 -5.39231 -49.1512 7.42188 -14.3075 -47.6832 4.6488 -10.6016 -46.6335 14.5918 -22.7648 -44.4764 1.90132 -19.5347 -44.4764 11.8426 -15.4509 -42.5325 21.2663 -31.6078 -38.7299 -0.971941 -28.8675 -39.7327 9.37962 -25 -38.7299 19.3649 -19.7755 -36.9875 27.2187 -38.1177 -32.2104 -3.08758 -36.8343 -33.2344 6.22166 -33.4566 -33.2344 16.6172 -29.023 -32.2104 24.9029 -23.4288 -30.1865 32.247 -43.3009 -24.5167 -4.89537 -42.599 -25.8403 4.19521 -40.4509 -26.2866 13.1433 -36.9292 -25.8403 21.6451 -32.1537 -24.5167 29.4121 -26.2866 -22.3607 36.1803 0 -47.6832 15.0438 -5.22646 -44.4764 22.2382 5.22646 -44.4764 22.2382 -10.6917 -38.7299 29.7605 0 -39.7327 30.3531 10.6917 -38.7299 29.7605 -14.7155 -32.2104 35.298 -5.46526 -33.2344 36.9541 5.46526 -33.2344 36.9541 14.7155 -32.2104 35.298 -18.0365 -24.5167 39.6688 -9.17395 -25.8403 41.8105 0 -26.2866 42.5325 9.17395 -25.8403 41.8105 18.0365 -24.5167 39.6688 5.39231 15.3427 47.2813 14.3075 17.1665 44.7281 10.6016 7.80382 48.236 22.7648 18.1898 40.6312 19.5347 9.29806 45.0771 15.4509 0 47.5528 31.6078 18.1898 34.2064 28.8675 9.37962 39.7327 25 0 43.3013 19.7755 -7.80382 45.2552 38.1177 17.1665 27.429 36.8343 9.29806 32.5082 33.4566 0 37.1572 29.023 -7.86893 39.9468 23.4288 -15.3427 41.4209 43.3009 15.3427 19.7391 42.599 7.80382 24.9884 40.4509 0 29.3893 36.9292 -7.80382 32.7923 32.1537 -15.3427 35.0819 46.6335 15.3427 9.48234 46.9602 17.1665 0.214459 49.1512 7.80382 4.82303 45.6773 18.1898 -9.09492 48.9074 9.29806 -4.64903 50 0 0 42.2995 18.1898 -19.4905 46.7086 9.37962 -15.1765 48.9074 0 -10.3955 49.1512 -7.80382 -4.82303 37.8656 17.1665 -27.776 42.2995 9.29806 -24.9859 45.6773 0 -20.3369 46.9602 -7.86893 -15.2583 46.6335 -15.3427 -9.48234 32.1537 15.3427 -35.0819 36.9292 7.80382 -32.7923 40.4509 0 -29.3893 42.599 -7.80382 -24.9884 43.3009 -15.3427 -19.7391 23.4288 15.3427 -41.4209 14.7155 17.1665 -44.5956 19.7755 7.80382 -45.2552 5.46526 18.1898 -46.2521 10.6917 9.29806 -47.9503 15.4509 0 -47.5528 -5.46526 18.1898 -46.2521 0 9.37962 -49.1123 5.22646 0 -49.7261 10.6016 -7.80382 -48.236 -14.7155 17.1665 -44.5956 -10.6917 9.29806 -47.9503 -5.22646 0 -49.7261 0 -7.86893 -49.3769 5.39231 -15.3427 -47.2813 -23.4288 15.3427 -41.4209 -19.7755 7.80382 -45.2552 -15.4509 0 -47.5528 -10.6016 -7.80382 -48.236 -5.39231 -15.3427 -47.2813 -32.1537 15.3427 -35.0819 -37.8656 17.1665 -27.776 -36.9292 7.80382 -32.7923 -42.2995 18.1898 -19.4905 -42.2995 9.29806 -24.9859 -40.4509 0 -29.3893 -45.6773 18.1898 -9.09492 -46.7086 9.37962 -15.1765 -45.6773 0 -20.3369 -42.599 -7.80382 -24.9884 -46.9602 17.1665 0.214459 -48.9074 9.29806 -4.64903 -48.9074 0 -10.3955 -46.9602 -7.86893 -15.2583 -43.3009 -15.3427 -19.7391 -46.6335 15.3427 9.48234 -49.1512 7.80382 4.82303 -50 0 0 -49.1512 -7.80382 -4.82303 -46.6335 -15.3427 -9.48234 -43.3009 15.3427 19.7391 -38.1177 17.1665 27.429 -42.599 7.80382 24.9884 -31.6078 18.1898 34.2064 -36.8343 9.29806 32.5082 -40.4509 0 29.3893 -22.7648 18.1898 40.6312 -28.8675 9.37962 39.7327 -33.4566 0 37.1572 -36.9292 -7.80382 32.7923 -14.3075 17.1665 44.7281 -19.5347 9.29806 45.0771 -25 0 43.3013 -29.023 -7.86893 39.9468 -32.1537 -15.3427 35.0819 -5.39231 15.3427 47.2813 -10.6016 7.80382 48.236 -15.4509 0 47.5528 -19.7755 -7.80382 45.2552 -23.4288 -15.3427 41.4209 46.9602 -17.1665 -0.214459 45.6773 -18.1898 9.09492 48.9074 -9.29806 4.64903 42.2995 -18.1898 19.4905 46.7086 -9.37962 15.1765 48.9074 0 10.3955 37.8656 -17.1665 27.776 42.2995 -9.29806 24.9859 45.6773 0 20.3369 46.9602 7.86893 15.2583 14.3075 -17.1665 -44.7281 22.7648 -18.1898 -40.6312 19.5347 -9.29806 -45.0771 31.6078 -18.1898 -34.2064 28.8675 -9.37962 -39.7327 25 0 -43.3013 38.1177 -17.1665 -27.429 36.8343 -9.29806 -32.5082 33.4566 0 -37.1572 29.023 7.86893 -39.9468 -38.1177 -17.1665 -27.429 -31.6078 -18.1898 -34.2064 -36.8343 -9.29806 -32.5082 -22.7648 -18.1898 -40.6312 -28.8675 -9.37962 -39.7327 -33.4566 0 -37.1572 -14.3075 -17.1665 -44.7281 -19.5347 -9.29806 -45.0771 -25 0 -43.3013 -29.023 7.86893 -39.9468 -37.8656 -17.1665 27.776 -42.2995 -18.1898 19.4905 -42.2995 -9.29806 24.9859 -45.6773 -18.1898 9.09492 -46.7086 -9.37962 15.1765 -45.6773 0 20.3369 -46.9602 -17.1665 -0.214459 -48.9074 -9.29806 4.64903 -48.9074 0 10.3955 -46.9602 7.86893 15.2583 14.7155 -17.1665 44.5956 5.46526 -18.1898 46.2521 10.6917 -9.29806 47.9503 -5.46526 -18.1898 46.2521 0 -9.37962 49.1123 5.22646 0 49.7261 -14.7155 -17.1665 44.5956 -10.6917 -9.29806 47.9503 -5.22646 0 49.7261 0 7.86893 49.3769</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="724" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="2172">0 1 -0.000000 0.165156 0.984806 0.053662 0 0.984806 0.173655 0.33628 0.935402 0.109264 0.1769 0.953637 0.243482 0 0.935402 0.353586 0.5 0.850651 0.16246 0.351546 0.885484 0.303864 0.180358 0.885484 0.428239 0 0.850651 0.525731 0.645311 0.734581 0.209674 0.515363 0.77903 0.357091 0.356822 0.794655 0.491123 0.180358 0.77903 0.600487 0 0.734581 0.678521 0.763866 0.595741 0.248195 0.652988 0.644256 0.398172 0.515363 0.667784 0.537089 0.351546 0.667784 0.656109 0.1769 0.644256 0.74407 0 0.595741 0.803176 0.850651 0.447214 0.276393 0.763866 0.488416 0.421851 0.645312 0.516053 0.56326 0.5 0.525731 0.688191 0.33628 0.516053 0.787785 0.165156 0.488416 0.856839 0 0.447214 0.894427 0.102072 0.984806 -0.14049 0.207833 0.935402 -0.286057 0.28623 0.953637 -0.093001 0.309017 0.850651 -0.425326 0.397625 0.885484 -0.240441 0.463014 0.885484 -0.039197 0.398825 0.734581 -0.548935 0.49887 0.77903 -0.379792 0.57735 0.794654 -0.187592 0.62683 0.77903 0.01403 0.472095 0.595741 -0.649783 0.580469 0.644256 -0.497986 0.670058 0.667784 -0.32417 0.732631 0.667785 -0.131591 0.762318 0.644256 0.061688 0.525731 0.447214 -0.723607 0.637252 0.488416 -0.596121 0.735105 0.516053 -0.439671 0.809017 0.525731 -0.262865 0.853144 0.516053 -0.076382 0.865939 0.488416 0.107705 -0.102072 0.984806 -0.14049 -0.207833 0.935402 -0.286057 0 0.953637 -0.30096 -0.309017 0.850651 -0.425326 -0.105801 0.885484 -0.452465 0.105801 0.885484 -0.452465 -0.398825 0.734581 -0.548935 -0.207045 0.77903 -0.591815 0 0.794654 -0.607062 0.207045 0.77903 -0.591815 -0.472095 0.595741 -0.649783 -0.294238 0.644256 -0.705945 -0.101244 0.667784 -0.737437 0.101244 0.667784 -0.737437 0.294238 0.644256 -0.705945 -0.525731 0.447214 -0.723607 -0.370023 0.488416 -0.790274 -0.190992 0.516053 -0.834992 0 0.525731 -0.850651 0.190992 0.516053 -0.834992 0.370023 0.488416 -0.790274 -0.165156 0.984806 0.053662 -0.33628 0.935402 0.109264 -0.28623 0.953637 -0.093001 -0.5 0.850651 0.16246 -0.463014 0.885484 -0.039197 -0.397625 0.885484 -0.240441 -0.645311 0.734581 0.209674 -0.62683 0.77903 0.01403 -0.57735 0.794654 -0.187592 -0.49887 0.77903 -0.379792 -0.763866 0.595741 0.248195 -0.762318 0.644256 0.061688 -0.732631 0.667785 -0.131591 -0.670058 0.667784 -0.32417 -0.580469 0.644256 -0.497986 -0.850651 0.447214 0.276393 -0.865939 0.488416 0.107705 -0.853144 0.516053 -0.076382 -0.809017 0.525731 -0.262865 -0.735105 0.516053 -0.439671 -0.637252 0.488416 -0.596121 -0.1769 0.953637 0.243482 -0.180358 0.885484 0.428239 -0.351546 0.885484 0.303864 -0.180358 0.77903 0.600487 -0.356822 0.794655 0.491123 -0.515363 0.77903 0.357091 -0.1769 0.644256 0.74407 -0.351546 0.667785 0.656109 -0.515363 0.667784 0.537089 -0.652988 0.644256 0.398172 -0.165156 0.488416 0.856839 -0.33628 0.516053 0.787785 -0.5 0.525731 0.688191 -0.645312 0.516053 0.56326 -0.763866 0.488416 0.421851 0 -1 0.000000 0.102072 -0.984806 0.14049 0.165156 -0.984806 -0.053662 0.207833 -0.935402 0.286057 0.28623 -0.953637 0.093001 0.33628 -0.935402 -0.109264 0.309017 -0.850651 0.425326 0.397625 -0.885484 0.240441 0.463014 -0.885484 0.039197 0.5 -0.850651 -0.16246 0.398825 -0.734581 0.548935 0.49887 -0.77903 0.379792 0.57735 -0.794654 0.187592 0.62683 -0.77903 -0.01403 0.645311 -0.734581 -0.209674 0.472095 -0.595741 0.649783 0.580469 -0.644256 0.497986 0.670058 -0.667784 0.32417 0.732631 -0.667785 0.131591 0.762318 -0.644256 -0.061688 0.763866 -0.595741 -0.248195 0.525731 -0.447214 0.723607 0.637252 -0.488416 0.596121 0.735105 -0.516053 0.439671 0.809017 -0.525731 0.262865 0.853144 -0.516053 0.076382 0.865939 -0.488416 -0.107705 0.850651 -0.447214 -0.276393 0 -0.984806 -0.173655 0.1769 -0.953637 -0.243482 0 -0.935402 -0.353586 0.351546 -0.885484 -0.303864 0.180358 -0.885484 -0.428239 0 -0.850651 -0.525731 0.515363 -0.77903 -0.357091 0.356822 -0.794655 -0.491123 0.180358 -0.77903 -0.600487 0 -0.734581 -0.678521 0.652988 -0.644256 -0.398172 0.515363 -0.667784 -0.537089 0.351546 -0.667784 -0.656109 0.1769 -0.644256 -0.74407 0 -0.595741 -0.803176 0.763866 -0.488416 -0.421851 0.645312 -0.516053 -0.56326 0.5 -0.525731 -0.688191 0.33628 -0.516053 -0.787785 0.165156 -0.488416 -0.856839 0 -0.447214 -0.894427 -0.165156 -0.984806 -0.053662 -0.1769 -0.953637 -0.243482 -0.33628 -0.935402 -0.109264 -0.180358 -0.885484 -0.428239 -0.351546 -0.885484 -0.303864 -0.5 -0.850651 -0.16246 -0.180358 -0.77903 -0.600487 -0.356822 -0.794655 -0.491123 -0.515363 -0.77903 -0.357091 -0.645311 -0.734581 -0.209674 -0.1769 -0.644256 -0.74407 -0.351546 -0.667785 -0.656109 -0.515363 -0.667784 -0.537089 -0.652988 -0.644256 -0.398172 -0.763866 -0.595741 -0.248195 -0.165156 -0.488416 -0.856839 -0.33628 -0.516053 -0.787785 -0.5 -0.525731 -0.688191 -0.645312 -0.516053 -0.56326 -0.763866 -0.488416 -0.421851 -0.850651 -0.447214 -0.276393 -0.102072 -0.984806 0.14049 -0.28623 -0.953637 0.093001 -0.207833 -0.935402 0.286057 -0.463014 -0.885484 0.039197 -0.397625 -0.885484 0.240441 -0.309017 -0.850651 0.425326 -0.62683 -0.77903 -0.01403 -0.57735 -0.794654 0.187592 -0.49887 -0.77903 0.379792 -0.398825 -0.734581 0.548935 -0.762318 -0.644256 -0.061688 -0.732631 -0.667785 0.131591 -0.670058 -0.667784 0.32417 -0.580469 -0.644256 0.497986 -0.472095 -0.595741 0.649783 -0.865939 -0.488416 -0.107705 -0.853144 -0.516053 0.076382 -0.809017 -0.525731 0.262865 -0.735105 -0.516053 0.439671 -0.637252 -0.488416 0.596121 -0.525731 -0.447214 0.723607 0 -0.953637 0.30096 -0.105801 -0.885484 0.452465 0.105801 -0.885484 0.452465 -0.207045 -0.77903 0.591815 0 -0.794654 0.607062 0.207045 -0.77903 0.591815 -0.294238 -0.644256 0.705945 -0.101244 -0.667784 0.737437 0.101244 -0.667784 0.737437 0.294238 -0.644256 0.705945 -0.370023 -0.488416 0.790274 -0.190992 -0.516053 0.834992 0 -0.525731 0.850651 0.190992 -0.516053 0.834992 0.370023 -0.488416 0.790274 0.102072 0.31476 0.943667 0.28623 0.343296 0.89455 0.207832 0.162468 0.964578 0.463014 0.360942 0.80953 0.397625 0.180943 0.89953 0.309017 0 0.951057 0.62683 0.360942 0.690511 0.57735 0.187592 0.794654 0.49887 0.008696 0.866633 0.398824 -0.162468 0.902521 0.762318 0.343296 0.548653 0.73263 0.180943 0.656134 0.670058 0.008696 0.742258 0.580469 -0.157292 0.798946 0.472095 -0.31476 0.823439 0.865939 0.31476 0.388686 0.853144 0.162468 0.495731 0.809017 0 0.587785 0.735104 -0.162467 0.658199 0.637252 -0.31476 0.703446 0.929023 0.31476 0.194533 0.939218 0.343296 0.004209 0.981592 0.162467 0.10041 0.912988 0.360942 -0.190193 0.978377 0.180943 -0.100194 1 0 0 0.850416 0.360942 -0.382771 0.934172 0.187592 -0.303531 0.978377 0.008696 -0.206649 0.981592 -0.162467 -0.10041 0.757369 0.343296 -0.555464 0.850416 0.180943 -0.494017 0.912988 0.008695 -0.407893 0.939218 -0.157292 -0.30517 0.929023 -0.31476 -0.194533 0.637252 0.31476 -0.703446 0.735104 0.162467 -0.658199 0.809017 0 -0.587785 0.853144 -0.162468 -0.495731 0.865938 -0.31476 -0.388686 0.472095 0.31476 -0.823439 0.294238 0.343296 -0.891948 0.398824 0.162468 -0.902521 0.101244 0.360941 -0.927076 0.207045 0.180943 -0.961453 0.309017 0 -0.951057 -0.101244 0.360941 -0.927076 0 0.187592 -0.982247 0.1058 0.008696 -0.994349 0.207832 -0.162468 -0.964578 -0.294238 0.343296 -0.891948 -0.207045 0.180943 -0.961453 -0.1058 0.008696 -0.994349 0 -0.157292 -0.987552 0.102072 -0.31476 -0.943667 -0.472095 0.31476 -0.823439 -0.398825 0.162468 -0.902521 -0.309017 0 -0.951057 -0.207832 -0.162468 -0.964578 -0.102072 -0.31476 -0.943667 -0.637252 0.31476 -0.703446 -0.757369 0.343296 -0.555464 -0.735105 0.162467 -0.658199 -0.850416 0.360942 -0.382771 -0.850416 0.180943 -0.494017 -0.809017 0 -0.587785 -0.912988 0.360942 -0.190193 -0.934172 0.187592 -0.303531 -0.912988 0.008695 -0.407893 -0.853144 -0.162468 -0.495731 -0.939218 0.343296 0.004209 -0.978377 0.180943 -0.100194 -0.978377 0.008696 -0.206649 -0.939218 -0.157292 -0.30517 -0.865938 -0.31476 -0.388686 -0.929023 0.31476 0.194533 -0.981592 0.162467 0.10041 -1 0 0 -0.981592 -0.162467 -0.10041 -0.929023 -0.31476 -0.194533 -0.865938 0.31476 0.388686 -0.762318 0.343296 0.548653 -0.853144 0.162468 0.495731 -0.62683 0.360942 0.690511 -0.73263 0.180943 0.656134 -0.809017 0 0.587785 -0.463014 0.360942 0.80953 -0.57735 0.187592 0.794654 -0.670058 0.008696 0.742258 -0.735105 -0.162467 0.658199 -0.28623 0.343296 0.89455 -0.397625 0.180943 0.89953 -0.49887 0.008696 0.866633 -0.580469 -0.157292 0.798946 -0.637252 -0.31476 0.703446 -0.102072 0.31476 0.943667 -0.207832 0.162468 0.964578 -0.309017 0 0.951057 -0.398825 -0.162468 0.902521 -0.472095 -0.31476 0.823439 0.939218 -0.343296 -0.004209 0.912988 -0.360942 0.190193 0.978377 -0.180943 0.100194 0.850416 -0.360942 0.382771 0.934172 -0.187592 0.303531 0.978377 -0.008696 0.206649 0.757369 -0.343296 0.555464 0.850416 -0.180943 0.494017 0.912988 -0.008695 0.407893 0.939218 0.157292 0.30517 0.28623 -0.343296 -0.89455 0.463014 -0.360942 -0.80953 0.397625 -0.180943 -0.89953 0.62683 -0.360942 -0.690511 0.57735 -0.187592 -0.794654 0.49887 -0.008696 -0.866633 0.762318 -0.343296 -0.548653 0.73263 -0.180943 -0.656134 0.670058 -0.008696 -0.742258 0.580469 0.157292 -0.798946 -0.762318 -0.343296 -0.548653 -0.62683 -0.360942 -0.690511 -0.73263 -0.180943 -0.656134 -0.463014 -0.360942 -0.80953 -0.57735 -0.187592 -0.794654 -0.670058 -0.008696 -0.742258 -0.28623 -0.343296 -0.89455 -0.397625 -0.180943 -0.89953 -0.49887 -0.008696 -0.866633 -0.580469 0.157292 -0.798946 -0.757369 -0.343296 0.555464 -0.850416 -0.360942 0.382771 -0.850416 -0.180943 0.494017 -0.912988 -0.360942 0.190193 -0.934172 -0.187592 0.303531 -0.912988 -0.008695 0.407893 -0.939218 -0.343296 -0.004209 -0.978377 -0.180943 0.100194 -0.978377 -0.008696 0.206649 -0.939218 0.157292 0.30517 0.294238 -0.343296 0.891948 0.101244 -0.360941 0.927076 0.207045 -0.180943 0.961453 -0.101244 -0.360941 0.927076 0 -0.187592 0.982247 0.1058 -0.008696 0.994349 -0.294238 -0.343296 0.891948 -0.207045 -0.180943 0.961453 -0.1058 -0.008696 0.994349 0 0.157292 0.987552 0 -1 0.000000 -0.165156 -0.984806 -0.053662 0 -0.984806 -0.173655 -0.33628 -0.935402 -0.109264 -0.1769 -0.953637 -0.243482 0 -0.935402 -0.353586 -0.5 -0.850651 -0.16246 -0.351546 -0.885484 -0.303864 -0.180358 -0.885484 -0.42824 0 -0.850651 -0.525731 -0.645311 -0.734581 -0.209674 -0.515363 -0.779029 -0.357091 -0.356822 -0.794654 -0.491124 -0.180358 -0.77903 -0.600487 0 -0.734581 -0.678521 -0.763866 -0.595741 -0.248195 -0.652988 -0.644256 -0.398172 -0.515363 -0.667784 -0.537089 -0.351546 -0.667784 -0.656109 -0.1769 -0.644256 -0.74407 0 -0.595741 -0.803176 -0.850651 -0.447214 -0.276393 -0.763866 -0.488416 -0.421851 -0.645312 -0.516053 -0.56326 -0.5 -0.525731 -0.688191 -0.33628 -0.516053 -0.787785 -0.165156 -0.488416 -0.856839 0 -0.447214 -0.894427 -0.102072 -0.984806 0.14049 -0.207833 -0.935402 0.286057 -0.28623 -0.953637 0.093001 -0.309017 -0.850651 0.425326 -0.397625 -0.885484 0.240441 -0.463014 -0.885484 0.039197 -0.398825 -0.734581 0.548935 -0.49887 -0.77903 0.379792 -0.57735 -0.794654 0.187592 -0.62683 -0.77903 -0.01403 -0.472095 -0.595741 0.649783 -0.580469 -0.644256 0.497986 -0.670058 -0.667784 0.32417 -0.732631 -0.667784 0.131591 -0.762318 -0.644256 -0.061688 -0.525731 -0.447214 0.723607 -0.637252 -0.488416 0.596121 -0.735105 -0.516053 0.439671 -0.809017 -0.525731 0.262865 -0.853144 -0.516053 0.076382 -0.865939 -0.488416 -0.107705 0.102072 -0.984806 0.14049 0.207833 -0.935402 0.286057 0 -0.953637 0.30096 0.309017 -0.850651 0.425325 0.105801 -0.885484 0.452465 -0.105801 -0.885484 0.452464 0.398825 -0.734581 0.548935 0.207045 -0.77903 0.591815 0 -0.794654 0.607062 -0.207045 -0.77903 0.591816 0.472095 -0.595741 0.649783 0.294238 -0.644256 0.705945 0.101244 -0.667784 0.737437 -0.101244 -0.667784 0.737437 -0.294238 -0.644256 0.705945 0.525731 -0.447214 0.723607 0.370023 -0.488416 0.790274 0.190992 -0.516053 0.834992 0 -0.525731 0.850651 -0.190992 -0.516053 0.834992 -0.370023 -0.488416 0.790274 0.165156 -0.984806 -0.053662 0.33628 -0.935402 -0.109264 0.28623 -0.953637 0.093002 0.5 -0.850651 -0.16246 0.463014 -0.885484 0.039197 0.397625 -0.885484 0.240441 0.645311 -0.734581 -0.209674 0.62683 -0.77903 -0.01403 0.57735 -0.794654 0.187592 0.49887 -0.77903 0.379792 0.763866 -0.595741 -0.248195 0.762318 -0.644256 -0.061688 0.732631 -0.667785 0.131592 0.670058 -0.667784 0.32417 0.580469 -0.644256 0.497986 0.850651 -0.447214 -0.276393 0.865938 -0.488416 -0.107705 0.853144 -0.516053 0.076382 0.809017 -0.525731 0.262865 0.735105 -0.516053 0.439671 0.637252 -0.488416 0.596121 0.1769 -0.953637 -0.243482 0.180358 -0.885484 -0.42824 0.351546 -0.885484 -0.303864 0.180358 -0.77903 -0.600487 0.356822 -0.794654 -0.491123 0.515363 -0.779029 -0.357091 0.1769 -0.644256 -0.74407 0.351547 -0.667784 -0.656109 0.515363 -0.667784 -0.537089 0.652988 -0.644256 -0.398172 0.165156 -0.488416 -0.856839 0.33628 -0.516053 -0.787785 0.5 -0.525731 -0.688191 0.645312 -0.516053 -0.56326 0.763866 -0.488416 -0.421851 0 1 -0.000000 -0.102072 0.984806 -0.14049 -0.165156 0.984806 0.053662 -0.207833 0.935402 -0.286057 -0.28623 0.953637 -0.093001 -0.33628 0.935402 0.109264 -0.309017 0.850651 -0.425326 -0.397625 0.885484 -0.240441 -0.463014 0.885484 -0.039197 -0.5 0.850651 0.16246 -0.398825 0.734581 -0.548935 -0.49887 0.77903 -0.379792 -0.57735 0.794654 -0.187592 -0.62683 0.77903 0.01403 -0.645312 0.734581 0.209674 -0.472095 0.595741 -0.649783 -0.580469 0.644256 -0.497986 -0.670058 0.667784 -0.32417 -0.732631 0.667784 -0.131591 -0.762318 0.644256 0.061688 -0.763866 0.595741 0.248195 -0.525731 0.447214 -0.723607 -0.637252 0.488416 -0.596121 -0.735105 0.516053 -0.439671 -0.809017 0.525731 -0.262865 -0.853144 0.516053 -0.076382 -0.865939 0.488416 0.107705 -0.850651 0.447214 0.276393 0 0.984806 0.173655 -0.1769 0.953637 0.243482 0 0.935402 0.353586 -0.351546 0.885484 0.303864 -0.180358 0.885484 0.42824 0 0.850651 0.525731 -0.515363 0.779029 0.357091 -0.356822 0.794654 0.491124 -0.180358 0.77903 0.600487 0 0.734581 0.678521 -0.652988 0.644256 0.398172 -0.515363 0.667784 0.537089 -0.351546 0.667784 0.656109 -0.1769 0.644256 0.74407 0 0.595741 0.803176 -0.763866 0.488416 0.421851 -0.645312 0.516053 0.56326 -0.5 0.525731 0.688191 -0.33628 0.516053 0.787785 -0.165156 0.488416 0.856839 0 0.447214 0.894427 0.165156 0.984806 0.053662 0.1769 0.953637 0.243482 0.33628 0.935402 0.109264 0.180358 0.885484 0.42824 0.351546 0.885484 0.303864 0.5 0.850651 0.16246 0.180358 0.77903 0.600487 0.356822 0.794654 0.491123 0.515363 0.779029 0.357091 0.645312 0.734581 0.209674 0.1769 0.644256 0.74407 0.351547 0.667784 0.656109 0.515363 0.667784 0.537089 0.652988 0.644256 0.398172 0.763866 0.595741 0.248195 0.165156 0.488416 0.856839 0.33628 0.516053 0.787785 0.5 0.525731 0.688191 0.645312 0.516053 0.56326 0.763866 0.488416 0.421851 0.850651 0.447214 0.276393 0.102072 0.984806 -0.14049 0.28623 0.953637 -0.093002 0.207833 0.935402 -0.286057 0.463014 0.885484 -0.039197 0.397625 0.885484 -0.240441 0.309017 0.850651 -0.425326 0.62683 0.77903 0.01403 0.57735 0.794654 -0.187592 0.49887 0.77903 -0.379792 0.398825 0.734581 -0.548935 0.762318 0.644256 0.061688 0.732631 0.667785 -0.131592 0.670058 0.667784 -0.32417 0.580469 0.644256 -0.497986 0.472095 0.595741 -0.649783 0.865938 0.488416 0.107705 0.853144 0.516053 -0.076382 0.809017 0.525731 -0.262865 0.735105 0.516053 -0.439671 0.637252 0.488416 -0.596121 0.525731 0.447214 -0.723607 0 0.953637 -0.30096 0.105801 0.885484 -0.452465 -0.105801 0.885484 -0.452464 0.207045 0.77903 -0.591815 0 0.794654 -0.607062 -0.207045 0.77903 -0.591816 0.294238 0.644256 -0.705945 0.101244 0.667784 -0.737437 -0.101244 0.667784 -0.737437 -0.294238 0.644256 -0.705945 0.370023 0.488416 -0.790274 0.190992 0.516053 -0.834992 0 0.525731 -0.850651 -0.190992 0.516053 -0.834992 -0.370023 0.488416 -0.790274 -0.102072 -0.31476 -0.943667 -0.28623 -0.343296 -0.89455 -0.207832 -0.162468 -0.964578 -0.463014 -0.360942 -0.80953 -0.397625 -0.180943 -0.89953 -0.309017 0 -0.951057 -0.62683 -0.360942 -0.690511 -0.57735 -0.187592 -0.794654 -0.49887 -0.008696 -0.866633 -0.398824 0.162468 -0.902521 -0.762318 -0.343296 -0.548653 -0.73263 -0.180943 -0.656134 -0.670058 -0.008696 -0.742258 -0.580469 0.157292 -0.798946 -0.472095 0.31476 -0.823439 -0.865938 -0.31476 -0.388686 -0.853144 -0.162468 -0.495731 -0.809017 0 -0.587785 -0.735105 0.162468 -0.658199 -0.637252 0.31476 -0.703446 -0.929023 -0.31476 -0.194533 -0.939218 -0.343296 -0.004209 -0.981592 -0.162467 -0.10041 -0.912988 -0.360942 0.190193 -0.978377 -0.180943 0.100194 -1 0 0 -0.850416 -0.360942 0.382771 -0.934172 -0.187592 0.303531 -0.978377 -0.008696 0.206649 -0.981592 0.162467 0.10041 -0.757369 -0.343296 0.555464 -0.850416 -0.180943 0.494017 -0.912988 -0.008695 0.407893 -0.939218 0.157292 0.30517 -0.929023 0.31476 0.194533 -0.637252 -0.31476 0.703446 -0.735105 -0.162468 0.658199 -0.809017 0 0.587785 -0.853144 0.162468 0.495731 -0.865938 0.31476 0.388686 -0.472095 -0.31476 0.823439 -0.294238 -0.343296 0.891948 -0.398825 -0.162468 0.902521 -0.101244 -0.360942 0.927077 -0.207045 -0.180943 0.961453 -0.309017 0 0.951057 0.101244 -0.360942 0.927077 0 -0.187592 0.982247 -0.1058 -0.008696 0.994349 -0.207832 0.162468 0.964578 0.294238 -0.343296 0.891948 0.207045 -0.180943 0.961453 0.1058 -0.008696 0.994349 0 0.157292 0.987552 -0.102072 0.31476 0.943667 0.472095 -0.31476 0.823439 0.398825 -0.162468 0.902521 0.309017 0 0.951057 0.207832 0.162468 0.964578 0.102072 0.31476 0.943667 0.637252 -0.31476 0.703446 0.757369 -0.343296 0.555464 0.735105 -0.162468 0.658199 0.850416 -0.360942 0.382771 0.850416 -0.180943 0.494017 0.809017 0 0.587785 0.912988 -0.360942 0.190193 0.934172 -0.187592 0.303531 0.912988 -0.008695 0.407893 0.853144 0.162468 0.495731 0.939218 -0.343296 -0.004209 0.978377 -0.180943 0.100194 0.978377 -0.008696 0.206649 0.939218 0.157292 0.30517 0.865938 0.31476 0.388686 0.929023 -0.31476 -0.194533 0.981592 -0.162467 -0.10041 1 0 0 0.981592 0.162467 0.10041 0.929023 0.31476 0.194533 0.865938 -0.31476 -0.388686 0.762318 -0.343296 -0.548653 0.853144 -0.162468 -0.495731 0.62683 -0.360942 -0.690511 0.73263 -0.180943 -0.656134 0.809017 0 -0.587785 0.463014 -0.360941 -0.80953 0.57735 -0.187592 -0.794654 0.670058 -0.008696 -0.742258 0.735105 0.162468 -0.658199 0.28623 -0.343296 -0.89455 0.397625 -0.180943 -0.89953 0.49887 -0.008696 -0.866633 0.580469 0.157292 -0.798946 0.637252 0.31476 -0.703446 0.102072 -0.31476 -0.943667 0.207832 -0.162468 -0.964578 0.309017 0 -0.951057 0.398824 0.162468 -0.902521 0.472095 0.31476 -0.823439 -0.939218 0.343296 0.004209 -0.912988 0.360942 -0.190193 -0.978377 0.180943 -0.100194 -0.850416 0.360942 -0.382771 -0.934172 0.187592 -0.303531 -0.978377 0.008696 -0.206649 -0.757369 0.343296 -0.555464 -0.850416 0.180943 -0.494017 -0.912988 0.008695 -0.407893 -0.939218 -0.157292 -0.30517 -0.28623 0.343296 0.89455 -0.463014 0.360942 0.80953 -0.397625 0.180943 0.89953 -0.62683 0.360942 0.690511 -0.57735 0.187592 0.794654 -0.49887 0.008696 0.866633 -0.762318 0.343296 0.548653 -0.73263 0.180943 0.656134 -0.670058 0.008696 0.742258 -0.580469 -0.157292 0.798946 0.762318 0.343296 0.548653 0.62683 0.360942 0.690511 0.73263 0.180943 0.656134 0.463014 0.360941 0.80953 0.57735 0.187592 0.794654 0.670058 0.008696 0.742258 0.28623 0.343296 0.89455 0.397625 0.180943 0.89953 0.49887 0.008696 0.866633 0.580469 -0.157292 0.798946 0.757369 0.343296 -0.555464 0.850416 0.360942 -0.382771 0.850416 0.180943 -0.494017 0.912988 0.360942 -0.190193 0.934172 0.187592 -0.303531 0.912988 0.008695 -0.407893 0.939218 0.343296 0.004209 0.978377 0.180943 -0.100194 0.978377 0.008696 -0.206649 0.939218 -0.157292 -0.30517 -0.294238 0.343296 -0.891948 -0.101244 0.360942 -0.927077 -0.207045 0.180943 -0.961453 0.101244 0.360942 -0.927077 0 0.187592 -0.982247 -0.1058 0.008696 -0.994349 0.294238 0.343296 -0.891948 0.207045 0.180943 -0.961453 0.1058 0.008696 -0.994349 0 -0.157292 -0.987552</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="724" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="1436">0.106061 0.944444 0.075757 0.944444 0.090909 1 0.121212 0.888889 0.090909 0.888889 0.060606 0.888889 0.136364 0.833333 0.106061 0.833333 0.075757 0.833333 0.045454 0.833333 0.151515 0.777778 0.121212 0.777778 0.090909 0.777778 0.060606 0.777778 0.030303 0.777778 0.166667 0.722222 0.136364 0.722222 0.106061 0.722222 0.075757 0.722222 0.045454 0.722222 0.015151 0.722222 0.181818 0.666667 0.151515 0.666667 0.121212 0.666667 0.090909 0.666667 0.060606 0.666667 0.030303 0.666667 0 0.666667 0.287879 0.944444 0.257576 0.944444 0.272727 1 0.30303 0.888889 0.272727 0.888889 0.242424 0.888889 0.257576 0.944444 0.257576 0.944444 0.318182 0.833333 0.287879 0.833333 0.257576 0.833333 0.227273 0.833333 0.242424 0.888889 0.242424 0.888889 0.333333 0.777778 0.30303 0.777778 0.272727 0.777778 0.242424 0.777778 0.212121 0.777778 0.227273 0.833333 0.227273 0.833333 0.348485 0.722222 0.318182 0.722222 0.287879 0.722222 0.257576 0.722222 0.227273 0.722222 0.19697 0.722222 0.212121 0.777778 0.212121 0.777778 0.363636 0.666667 0.333333 0.666667 0.30303 0.666667 0.272727 0.666667 0.242424 0.666667 0.212121 0.666667 0.19697 0.722222 0.19697 0.722222 0.469697 0.944444 0.439394 0.944444 0.454545 1 0.484848 0.888889 0.454545 0.888889 0.424242 0.888889 0.439394 0.944444 0.439394 0.944444 0.5 0.833333 0.469697 0.833333 0.439394 0.833333 0.409091 0.833333 0.424242 0.888889 0.424242 0.888889 0.515152 0.777778 0.484848 0.777778 0.454545 0.777778 0.424242 0.777778 0.393939 0.777778 0.409091 0.833333 0.409091 0.833333 0.530303 0.722222 0.5 0.722222 0.469697 0.722222 0.439394 0.722222 0.409091 0.722222 0.378788 0.722222 0.393939 0.777778 0.393939 0.777778 0.545455 0.666667 0.515152 0.666667 0.484848 0.666667 0.454545 0.666667 0.424242 0.666667 0.393939 0.666667 0.378788 0.722222 0.378788 0.722222 0.651515 0.944444 0.621212 0.944444 0.636364 1 0.666667 0.888889 0.636364 0.888889 0.606061 0.888889 0.621212 0.944444 0.621212 0.944444 0.681818 0.833333 0.651515 0.833333 0.621212 0.833333 0.590909 0.833333 0.606061 0.888889 0.606061 0.888889 0.69697 0.777778 0.666667 0.777778 0.636364 0.777778 0.606061 0.777778 0.575758 0.777778 0.590909 0.833333 0.590909 0.833333 0.712121 0.722222 0.681818 0.722222 0.651515 0.722222 0.621212 0.722222 0.590909 0.722222 0.560606 0.722222 0.575758 0.777778 0.575758 0.777778 0.727273 0.666667 0.69697 0.666667 0.666667 0.666667 0.636364 0.666667 0.606061 0.666667 0.575758 0.666667 0.560606 0.722222 0.560606 0.722222 0.833333 0.944444 0.80303 0.944444 0.818182 1 0.848485 0.888889 0.818182 0.888889 0.833333 0.944444 0.787879 0.888889 0.80303 0.944444 0.80303 0.944444 0.833333 0.944444 0.863636 0.833333 0.833333 0.833333 0.848485 0.888889 0.80303 0.833333 0.772727 0.833333 0.787879 0.888889 0.848485 0.888889 0.787879 0.888889 0.878788 0.777778 0.848485 0.777778 0.863636 0.833333 0.818182 0.777778 0.787879 0.777778 0.757576 0.777778 0.772727 0.833333 0.863636 0.833333 0.772727 0.833333 0.893939 0.722222 0.863636 0.722222 0.878788 0.777778 0.833333 0.722222 0.80303 0.722222 0.772727 0.722222 0.742424 0.722222 0.757576 0.777778 0.878788 0.777778 0.757576 0.777778 0.909091 0.666667 0.878788 0.666667 0.893939 0.722222 0.848485 0.666667 0.818182 0.666667 0.787879 0.666667 0.757576 0.666667 0.742424 0.722222 0.893939 0.722222 0.742424 0.722222 0.166667 0.055555 0.19697 0.055555 0.181818 0 0.151515 0.111111 0.181818 0.111111 0.212121 0.111111 0.136364 0.166667 0.166667 0.166667 0.19697 0.166667 0.227273 0.166667 0.121212 0.222222 0.151515 0.222222 0.181818 0.222222 0.212121 0.222222 0.242424 0.222222 0.106061 0.277778 0.136364 0.277778 0.166667 0.277778 0.19697 0.277778 0.227273 0.277778 0.257576 0.277778 0.090909 0.333333 0.121212 0.333333 0.151515 0.333333 0.181818 0.333333 0.212121 0.333333 0.242424 0.333333 0.272727 0.333333 0.348485 0.055555 0.378788 0.055555 0.363636 0 0.333333 0.111111 0.363636 0.111111 0.348485 0.055555 0.393939 0.111111 0.348485 0.055555 0.318182 0.166667 0.348485 0.166667 0.333333 0.111111 0.378788 0.166667 0.409091 0.166667 0.333333 0.111111 0.30303 0.222222 0.333333 0.222222 0.318182 0.166667 0.363636 0.222222 0.393939 0.222222 0.424242 0.222222 0.318182 0.166667 0.287879 0.277778 0.318182 0.277778 0.30303 0.222222 0.348485 0.277778 0.378788 0.277778 0.409091 0.277778 0.439394 0.277778 0.30303 0.222222 0.30303 0.333333 0.287879 0.277778 0.333333 0.333333 0.363636 0.333333 0.393939 0.333333 0.424242 0.333333 0.454545 0.333333 0.287879 0.277778 0.530303 0.055555 0.560606 0.055555 0.545455 0 0.515152 0.111111 0.545455 0.111111 0.530303 0.055555 0.575758 0.111111 0.530303 0.055555 0.5 0.166667 0.530303 0.166667 0.515152 0.111111 0.560606 0.166667 0.590909 0.166667 0.515152 0.111111 0.484848 0.222222 0.515152 0.222222 0.5 0.166667 0.545455 0.222222 0.575758 0.222222 0.606061 0.222222 0.5 0.166667 0.469697 0.277778 0.5 0.277778 0.484848 0.222222 0.530303 0.277778 0.560606 0.277778 0.590909 0.277778 0.621212 0.277778 0.484848 0.222222 0.484848 0.333333 0.469697 0.277778 0.515152 0.333333 0.545455 0.333333 0.575758 0.333333 0.606061 0.333333 0.636364 0.333333 0.469697 0.277778 0.712121 0.055555 0.742424 0.055555 0.727273 0 0.69697 0.111111 0.727273 0.111111 0.712121 0.055555 0.757576 0.111111 0.712121 0.055555 0.681818 0.166667 0.712121 0.166667 0.69697 0.111111 0.742424 0.166667 0.772727 0.166667 0.69697 0.111111 0.666667 0.222222 0.69697 0.222222 0.681818 0.166667 0.727273 0.222222 0.757576 0.222222 0.787879 0.222222 0.681818 0.166667 0.651515 0.277778 0.681818 0.277778 0.666667 0.222222 0.712121 0.277778 0.742424 0.277778 0.772727 0.277778 0.80303 0.277778 0.666667 0.222222 0.666667 0.333333 0.651515 0.277778 0.69697 0.333333 0.727273 0.333333 0.757576 0.333333 0.787879 0.333333 0.818182 0.333333 0.651515 0.277778 0.893939 0.055555 0.924242 0.055555 0.909091 0 0.878788 0.111111 0.909091 0.111111 0.893939 0.055555 0.939394 0.111111 0.924242 0.055555 0.924242 0.055555 0.893939 0.055555 0.863636 0.166667 0.893939 0.166667 0.878788 0.111111 0.924242 0.166667 0.954545 0.166667 0.939394 0.111111 0.878788 0.111111 0.939394 0.111111 0.848485 0.222222 0.878788 0.222222 0.863636 0.166667 0.909091 0.222222 0.939394 0.222222 0.969697 0.222222 0.954545 0.166667 0.863636 0.166667 0.954545 0.166667 0.833333 0.277778 0.863636 0.277778 0.848485 0.222222 0.893939 0.277778 0.924242 0.277778 0.954545 0.277778 0.984848 0.277778 0.969697 0.222222 0.848485 0.222222 0.969697 0.222222 0.848485 0.333333 0.833333 0.277778 0.878788 0.333333 0.909091 0.333333 0.939394 0.333333 0.969697 0.333333 1 0.333333 0.984848 0.277778 0.833333 0.277778 0.984848 0.277778 0.015151 0.611111 0.045454 0.611111 0.030303 0.555556 0.075757 0.611111 0.060606 0.555556 0.045454 0.5 0.106061 0.611111 0.090909 0.555556 0.075757 0.5 0.060606 0.444444 0.136364 0.611111 0.121212 0.555556 0.106061 0.5 0.090909 0.444444 0.075757 0.388889 0.166667 0.611111 0.151515 0.555556 0.136364 0.5 0.121212 0.444444 0.106061 0.388889 0.19697 0.611111 0.227273 0.611111 0.212121 0.555556 0.257576 0.611111 0.242424 0.555556 0.227273 0.5 0.287879 0.611111 0.272727 0.555556 0.257576 0.5 0.242424 0.444444 0.318182 0.611111 0.30303 0.555556 0.287879 0.5 0.272727 0.444444 0.257576 0.388889 0.348485 0.611111 0.333333 0.555556 0.318182 0.5 0.30303 0.444444 0.287879 0.388889 0.378788 0.611111 0.409091 0.611111 0.393939 0.555556 0.439394 0.611111 0.424242 0.555556 0.409091 0.5 0.469697 0.611111 0.454545 0.555556 0.439394 0.5 0.424242 0.444444 0.5 0.611111 0.484848 0.555556 0.469697 0.5 0.454545 0.444444 0.439394 0.388889 0.530303 0.611111 0.515152 0.555556 0.5 0.5 0.484848 0.444444 0.469697 0.388889 0.560606 0.611111 0.590909 0.611111 0.575758 0.555556 0.621212 0.611111 0.606061 0.555556 0.590909 0.5 0.651515 0.611111 0.636364 0.555556 0.621212 0.5 0.606061 0.444444 0.681818 0.611111 0.666667 0.555556 0.651515 0.5 0.636364 0.444444 0.621212 0.388889 0.712121 0.611111 0.69697 0.555556 0.681818 0.5 0.666667 0.444444 0.651515 0.388889 0.742424 0.611111 0.772727 0.611111 0.757576 0.555556 0.80303 0.611111 0.787879 0.555556 0.772727 0.5 0.833333 0.611111 0.818182 0.555556 0.80303 0.5 0.787879 0.444444 0.863636 0.611111 0.848485 0.555556 0.833333 0.5 0.818182 0.444444 0.80303 0.388889 0.909091 0.666667 0.893939 0.611111 0.878788 0.555556 0.863636 0.5 0.848485 0.444444 0.833333 0.388889 0.227273 0.388889 0.19697 0.388889 0.212121 0.444444 0.166667 0.388889 0.181818 0.444444 0.19697 0.5 0.136364 0.388889 0.151515 0.444444 0.166667 0.5 0.181818 0.555556 0.409091 0.388889 0.378788 0.388889 0.393939 0.444444 0.348485 0.388889 0.363636 0.444444 0.378788 0.5 0.318182 0.388889 0.333333 0.444444 0.348485 0.5 0.363636 0.555556 0.590909 0.388889 0.560606 0.388889 0.575758 0.444444 0.530303 0.388889 0.545455 0.444444 0.560606 0.5 0.5 0.388889 0.515152 0.444444 0.530303 0.5 0.545455 0.555556 0.772727 0.388889 0.742424 0.388889 0.757576 0.444444 0.712121 0.388889 0.727273 0.444444 0.742424 0.5 0.681818 0.388889 0.69697 0.444444 0.712121 0.5 0.727273 0.555556 0.984848 0.388889 1 0.333333 0.954545 0.388889 0.969697 0.444444 0.984848 0.388889 0.984848 0.388889 0.924242 0.388889 0.939394 0.444444 0.954545 0.5 0.969697 0.444444 0.969697 0.444444 0.893939 0.388889 0.909091 0.444444 0.924242 0.5 0.939394 0.555556 0.954545 0.5 0.954545 0.5 0.863636 0.388889 0.878788 0.444444 0.893939 0.5 0.909091 0.555556 0.924242 0.611111 0.939394 0.555556 0.939394 0.555556 0.909091 0.666667 0.924242 0.611111 0.924242 0.611111 0.272727 1 0.257576 0.944444 0.257576 0.944444 0.242424 0.888889 0.257576 0.944444 0.242424 0.888889 0.227273 0.833333 0.242424 0.888889 0.227273 0.833333 0.212121 0.777778 0.227273 0.833333 0.212121 0.777778 0.19697 0.722222 0.212121 0.777778 0.19697 0.722222 0.19697 0.722222 0.454545 1 0.439394 0.944444 0.439394 0.944444 0.424242 0.888889 0.439394 0.944444 0.424242 0.888889 0.409091 0.833333 0.424242 0.888889 0.409091 0.833333 0.393939 0.777778 0.409091 0.833333 0.393939 0.777778 0.378788 0.722222 0.393939 0.777778 0.378788 0.722222 0.378788 0.722222 0.636364 1 0.621212 0.944444 0.621212 0.944444 0.606061 0.888889 0.621212 0.944444 0.606061 0.888889 0.590909 0.833333 0.606061 0.888889 0.590909 0.833333 0.575758 0.777778 0.590909 0.833333 0.575758 0.777778 0.560606 0.722222 0.575758 0.777778 0.560606 0.722222 0.560606 0.722222 0.833333 0.944444 0.818182 1 0.80303 0.944444 0.848485 0.888889 0.833333 0.944444 0.80303 0.944444 0.787879 0.888889 0.80303 0.944444 0.833333 0.944444 0.863636 0.833333 0.848485 0.888889 0.787879 0.888889 0.772727 0.833333 0.848485 0.888889 0.787879 0.888889 0.878788 0.777778 0.863636 0.833333 0.772727 0.833333 0.757576 0.777778 0.863636 0.833333 0.772727 0.833333 0.893939 0.722222 0.878788 0.777778 0.757576 0.777778 0.742424 0.722222 0.878788 0.777778 0.757576 0.777778 0.909091 0.666667 0.893939 0.722222 0.742424 0.722222 0.893939 0.722222 0.742424 0.722222 0.348485 0.055555 0.363636 0 0.333333 0.111111 0.348485 0.055555 0.348485 0.055555 0.318182 0.166667 0.333333 0.111111 0.333333 0.111111 0.30303 0.222222 0.318182 0.166667 0.318182 0.166667 0.287879 0.277778 0.30303 0.222222 0.30303 0.222222 0.287879 0.277778 0.287879 0.277778 0.530303 0.055555 0.545455 0 0.515152 0.111111 0.530303 0.055555 0.530303 0.055555 0.5 0.166667 0.515152 0.111111 0.515152 0.111111 0.484848 0.222222 0.5 0.166667 0.5 0.166667 0.469697 0.277778 0.484848 0.222222 0.484848 0.222222 0.469697 0.277778 0.469697 0.277778 0.712121 0.055555 0.727273 0 0.69697 0.111111 0.712121 0.055555 0.712121 0.055555 0.681818 0.166667 0.69697 0.111111 0.69697 0.111111 0.666667 0.222222 0.681818 0.166667 0.681818 0.166667 0.651515 0.277778 0.666667 0.222222 0.666667 0.222222 0.651515 0.277778 0.651515 0.277778 0.893939 0.055555 0.909091 0 0.924242 0.055555 0.878788 0.111111 0.893939 0.055555 0.924242 0.055555 0.939394 0.111111 0.924242 0.055555 0.893939 0.055555 0.863636 0.166667 0.878788 0.111111 0.939394 0.111111 0.954545 0.166667 0.878788 0.111111 0.939394 0.111111 0.848485 0.222222 0.863636 0.166667 0.954545 0.166667 0.969697 0.222222 0.863636 0.166667 0.954545 0.166667 0.833333 0.277778 0.848485 0.222222 0.969697 0.222222 0.984848 0.277778 0.848485 0.222222 0.969697 0.222222 0.833333 0.277778 0.984848 0.277778 1 0.333333 0.833333 0.277778 0.984848 0.277778 0.909091 0.666667 1 0.333333 0.984848 0.388889 0.984848 0.388889 0.969697 0.444444 0.984848 0.388889 0.969697 0.444444 0.954545 0.5 0.969697 0.444444 0.954545 0.5 0.939394 0.555556 0.954545 0.5 0.939394 0.555556 0.924242 0.611111 0.939394 0.555556 0.924242 0.611111 0.909091 0.666667 0.924242 0.611111</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="718" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="1440">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>363 0 364 1 362 2 365 3 366 4 363 0 366 4 367 5 364 1 364 1 363 0 366 4 368 6 369 7 365 3 369 7 370 8 366 4 370 8 371 9 367 5 366 4 365 3 369 7 367 5 366 4 370 8 372 10 373 11 368 6 373 11 374 12 369 7 374 12 375 13 370 8 375 13 376 14 371 9 369 7 368 6 373 11 370 8 369 7 374 12 371 9 370 8 375 13 377 15 378 16 372 10 378 16 379 17 373 11 379 17 380 18 374 12 380 18 381 19 375 13 381 19 382 20 376 14 373 11 372 10 378 16 374 12 373 11 379 17 375 13 374 12 380 18 376 14 375 13 381 19 383 21 384 22 377 15 384 22 385 23 378 16 385 23 386 24 379 17 386 24 387 25 380 18 387 25 388 26 381 19 388 26 389 27 382 20 378 16 377 15 384 22 379 17 378 16 385 23 380 18 379 17 386 24 381 19 380 18 387 25 382 20 381 19 388 26 390 28 363 29 362 30 391 31 392 32 390 28 392 32 365 33 363 34 363 35 390 28 392 32 393 36 394 37 391 31 394 37 395 38 392 32 395 38 368 39 365 40 392 32 391 31 394 37 365 41 392 32 395 38 396 42 397 43 393 36 397 43 398 44 394 37 398 44 399 45 395 38 399 45 372 46 368 47 394 37 393 36 397 43 395 38 394 37 398 44 368 48 395 38 399 45 400 49 401 50 396 42 401 50 402 51 397 43 402 51 403 52 398 44 403 52 404 53 399 45 404 53 377 54 372 55 397 43 396 42 401 50 398 44 397 43 402 51 399 45 398 44 403 52 372 56 399 45 404 53 405 57 406 58 400 49 406 58 407 59 401 50 407 59 408 60 402 51 408 60 409 61 403 52 409 61 410 62 404 53 410 62 383 21 377 63 401 50 400 49 406 58 402 51 401 50 407 59 403 52 402 51 408 60 404 53 403 52 409 61 377 64 404 53 410 62 411 65 390 66 362 67 412 68 413 69 411 65 413 69 391 70 390 71 390 72 411 65 413 69 414 73 415 74 412 68 415 74 416 75 413 69 416 75 393 76 391 77 413 69 412 68 415 74 391 78 413 69 416 75 417 79 418 80 414 73 418 80 419 81 415 74 419 81 420 82 416 75 420 82 396 83 393 84 415 74 414 73 418 80 416 75 415 74 419 81 393 85 416 75 420 82 421 86 422 87 417 79 422 87 423 88 418 80 423 88 424 89 419 81 424 89 425 90 420 82 425 90 400 91 396 92 418 80 417 79 422 87 419 81 418 80 423 88 420 82 419 81 424 89 396 93 420 82 425 90 426 94 427 95 421 86 427 95 428 96 422 87 428 96 429 97 423 88 429 97 430 98 424 89 430 98 431 99 425 90 431 99 405 57 400 100 422 87 421 86 427 95 423 88 422 87 428 96 424 89 423 88 429 97 425 90 424 89 430 98 400 101 425 90 431 99 432 102 411 103 362 104 433 105 434 106 432 102 434 106 412 107 411 108 411 109 432 102 434 106 435 110 436 111 433 105 436 111 437 112 434 106 437 112 414 113 412 114 434 106 433 105 436 111 412 115 434 106 437 112 438 116 439 117 435 110 439 117 440 118 436 111 440 118 441 119 437 112 441 119 417 120 414 121 436 111 435 110 439 117 437 112 436 111 440 118 414 122 437 112 441 119 442 123 443 124 438 116 443 124 444 125 439 117 444 125 445 126 440 118 445 126 446 127 441 119 446 127 421 128 417 129 439 117 438 116 443 124 440 118 439 117 444 125 441 119 440 118 445 126 417 130 441 119 446 127 447 131 448 132 442 123 448 132 449 133 443 124 449 133 450 134 444 125 450 134 451 135 445 126 451 135 452 136 446 127 452 136 426 94 421 137 443 124 442 123 448 132 444 125 443 124 449 133 445 126 444 125 450 134 446 127 445 126 451 135 421 138 446 127 452 136 364 139 432 140 362 141 367 142 453 143 364 144 453 143 433 145 432 146 432 147 364 148 453 143 371 149 454 150 367 151 454 150 455 152 453 143 455 152 435 153 433 154 453 143 367 155 454 150 433 156 453 143 455 152 376 157 456 158 371 159 456 158 457 160 454 150 457 160 458 161 455 152 458 161 438 162 435 163 454 150 371 164 456 158 455 152 454 150 457 160 435 165 455 152 458 161 382 166 459 167 376 168 459 167 460 169 456 158 460 169 461 170 457 160 461 170 462 171 458 161 462 171 442 172 438 173 456 158 376 174 459 167 457 160 456 158 460 169 458 161 457 160 461 170 438 175 458 161 462 171 389 176 463 177 382 178 463 177 464 179 459 167 464 179 465 180 460 169 465 180 466 181 461 170 466 181 467 182 462 171 467 182 447 131 442 183 459 167 382 184 463 177 460 169 459 167 464 179 461 170 460 169 465 180 462 171 461 170 466 181 442 185 462 171 467 182 469 186 470 187 468 188 471 189 472 190 469 186 472 190 473 191 470 187 470 187 469 186 472 190 474 192 475 193 471 189 475 193 476 194 472 190 476 194 477 195 473 191 472 190 471 189 475 193 473 191 472 190 476 194 478 196 479 197 474 192 479 197 480 198 475 193 480 198 481 199 476 194 481 199 482 200 477 195 475 193 474 192 479 197 476 194 475 193 480 198 477 195 476 194 481 199 483 201 484 202 478 196 484 202 485 203 479 197 485 203 486 204 480 198 486 204 487 205 481 199 487 205 488 206 482 200 479 197 478 196 484 202 480 198 479 197 485 203 481 199 480 198 486 204 482 200 481 199 487 205 489 207 490 208 483 201 490 208 491 209 484 202 491 209 492 210 485 203 492 210 493 211 486 204 493 211 494 212 487 205 494 212 495 213 488 206 484 202 483 201 490 208 485 203 484 202 491 209 486 204 485 203 492 210 487 205 486 204 493 211 488 206 487 205 494 212 470 214 496 215 468 216 473 217 497 218 470 219 497 218 498 220 496 215 496 215 470 221 497 218 477 222 499 223 473 224 499 223 500 225 497 218 500 225 501 226 498 220 497 218 473 227 499 223 498 220 497 218 500 225 482 228 502 229 477 230 502 229 503 231 499 223 503 231 504 232 500 225 504 232 505 233 501 226 499 223 477 234 502 229 500 225 499 223 503 231 501 226 500 225 504 232 488 235 506 236 482 237 506 236 507 238 502 229 507 238 508 239 503 231 508 239 509 240 504 232 509 240 510 241 505 233 502 229 482 242 506 236 503 231 502 229 507 238 504 232 503 231 508 239 505 233 504 232 509 240 495 213 511 243 488 244 511 243 512 245 506 236 512 245 513 246 507 238 513 246 514 247 508 239 514 247 515 248 509 240 515 248 516 249 510 241 506 236 488 250 511 243 507 238 506 236 512 245 508 239 507 238 513 246 509 240 508 239 514 247 510 241 509 240 515 248 496 251 517 252 468 253 498 254 518 255 496 256 518 255 519 257 517 252 517 252 496 258 518 255 501 259 520 260 498 261 520 260 521 262 518 255 521 262 522 263 519 257 518 255 498 264 520 260 519 257 518 255 521 262 505 265 523 266 501 267 523 266 524 268 520 260 524 268 525 269 521 262 525 269 526 270 522 263 520 260 501 271 523 266 521 262 520 260 524 268 522 263 521 262 525 269 510 272 527 273 505 274 527 273 528 275 523 266 528 275 529 276 524 268 529 276 530 277 525 269 530 277 531 278 526 270 523 266 505 279 527 273 524 268 523 266 528 275 525 269 524 268 529 276 526 270 525 269 530 277 516 249 532 280 510 281 532 280 533 282 527 273 533 282 534 283 528 275 534 283 535 284 529 276 535 284 536 285 530 277 536 285 537 286 531 278 527 273 510 287 532 280 528 275 527 273 533 282 529 276 528 275 534 283 530 277 529 276 535 284 531 278 530 277 536 285 517 288 538 289 468 290 519 291 539 292 517 293 539 292 540 294 538 289 538 289 517 295 539 292 522 296 541 297 519 298 541 297 542 299 539 292 542 299 543 300 540 294 539 292 519 301 541 297 540 294 539 292 542 299 526 302 544 303 522 304 544 303 545 305 541 297 545 305 546 306 542 299 546 306 547 307 543 300 541 297 522 308 544 303 542 299 541 297 545 305 543 300 542 299 546 306 531 309 548 310 526 311 548 310 549 312 544 303 549 312 550 313 545 305 550 313 551 314 546 306 551 314 552 315 547 307 544 303 526 316 548 310 545 305 544 303 549 312 546 306 545 305 550 313 547 307 546 306 551 314 537 286 553 317 531 318 553 317 554 319 548 310 554 319 555 320 549 312 555 320 556 321 550 313 556 321 557 322 551 314 557 322 558 323 552 315 548 310 531 324 553 317 549 312 548 310 554 319 550 313 549 312 555 320 551 314 550 313 556 321 552 315 551 314 557 322 538 325 469 326 468 327 540 328 559 329 538 330 559 329 471 331 469 332 469 333 538 334 559 329 543 335 560 336 540 337 560 336 561 338 559 329 561 338 474 339 471 340 559 329 540 341 560 336 471 342 559 329 561 338 547 343 562 344 543 345 562 344 563 346 560 336 563 346 564 347 561 338 564 347 478 348 474 349 560 336 543 350 562 344 561 338 560 336 563 346 474 351 561 338 564 347 552 352 565 353 547 354 565 353 566 355 562 344 566 355 567 356 563 346 567 356 568 357 564 347 568 357 483 358 478 359 562 344 547 360 565 353 563 346 562 344 566 355 564 347 563 346 567 356 478 361 564 347 568 357 558 323 569 362 552 363 569 362 570 364 565 353 570 364 571 365 566 355 571 365 572 366 567 356 572 366 573 367 568 357 573 367 489 368 483 369 565 353 552 370 569 362 566 355 565 353 570 364 567 356 566 355 571 365 568 357 567 356 572 366 483 371 568 357 573 367 388 26 574 372 389 27 387 25 575 373 388 26 575 373 576 374 574 372 574 372 388 26 575 373 386 24 577 375 387 25 577 375 578 376 575 373 578 376 579 377 576 374 575 373 387 25 577 375 576 374 575 373 578 376 385 23 580 378 386 24 580 378 581 379 577 375 581 379 582 380 578 376 582 380 583 381 579 377 577 375 386 24 580 378 578 376 577 375 581 379 579 377 578 376 582 380 384 22 584 382 385 23 584 382 585 383 580 378 585 383 586 384 581 379 586 384 587 385 582 380 587 385 588 386 583 381 580 378 385 23 584 382 581 379 580 378 585 383 582 380 581 379 586 384 583 381 582 380 587 385 383 21 589 387 384 22 589 387 590 388 584 382 590 388 591 389 585 383 591 389 592 390 586 384 592 390 593 391 587 385 593 391 489 207 588 386 584 382 384 22 589 387 585 383 584 382 590 388 586 384 585 383 591 389 587 385 586 384 592 390 588 386 587 385 593 391 410 62 594 392 383 21 409 61 595 393 410 62 595 393 596 394 594 392 594 392 410 62 595 393 408 60 597 395 409 61 597 395 598 396 595 393 598 396 599 397 596 394 595 393 409 61 597 395 596 394 595 393 598 396 407 59 600 398 408 60 600 398 601 399 597 395 601 399 602 400 598 396 602 400 603 401 599 397 597 395 408 60 600 398 598 396 597 395 601 399 599 397 598 396 602 400 406 58 604 402 407 59 604 402 605 403 600 398 605 403 606 404 601 399 606 404 607 405 602 400 607 405 608 406 603 401 600 398 407 59 604 402 601 399 600 398 605 403 602 400 601 399 606 404 603 401 602 400 607 405 405 57 609 407 406 58 609 407 610 408 604 402 610 408 611 409 605 403 611 409 612 410 606 404 612 410 613 411 607 405 613 411 495 213 608 406 604 402 406 58 609 407 605 403 604 402 610 408 606 404 605 403 611 409 607 405 606 404 612 410 608 406 607 405 613 411 431 99 614 412 405 57 430 98 615 413 431 99 615 413 616 414 614 412 614 412 431 99 615 413 429 97 617 415 430 98 617 415 618 416 615 413 618 416 619 417 616 414 615 413 430 98 617 415 616 414 615 413 618 416 428 96 620 418 429 97 620 418 621 419 617 415 621 419 622 420 618 416 622 420 623 421 619 417 617 415 429 97 620 418 618 416 617 415 621 419 619 417 618 416 622 420 427 95 624 422 428 96 624 422 625 423 620 418 625 423 626 424 621 419 626 424 627 425 622 420 627 425 628 426 623 421 620 418 428 96 624 422 621 419 620 418 625 423 622 420 621 419 626 424 623 421 622 420 627 425 426 94 629 427 427 95 629 427 630 428 624 422 630 428 631 429 625 423 631 429 632 430 626 424 632 430 633 431 627 425 633 431 516 249 628 426 624 422 427 95 629 427 625 423 624 422 630 428 626 424 625 423 631 429 627 425 626 424 632 430 628 426 627 425 633 431 452 136 634 432 426 94 451 135 635 433 452 136 635 433 636 434 634 432 634 432 452 136 635 433 450 134 637 435 451 135 637 435 638 436 635 433 638 436 639 437 636 434 635 433 451 135 637 435 636 434 635 433 638 436 449 133 640 438 450 134 640 438 641 439 637 435 641 439 642 440 638 436 642 440 643 441 639 437 637 435 450 134 640 438 638 436 637 435 641 439 639 437 638 436 642 440 448 132 644 442 449 133 644 442 645 443 640 438 645 443 646 444 641 439 646 444 647 445 642 440 647 445 648 446 643 441 640 438 449 133 644 442 641 439 640 438 645 443 642 440 641 439 646 444 643 441 642 440 647 445 447 131 649 447 448 132 649 447 650 448 644 442 650 448 651 449 645 443 651 449 652 450 646 444 652 450 653 451 647 445 653 451 537 286 648 446 644 442 448 132 649 447 645 443 644 442 650 448 646 444 645 443 651 449 647 445 646 444 652 450 648 446 647 445 653 451 467 182 654 452 447 131 466 181 655 453 467 182 655 453 656 454 654 452 654 452 467 182 655 453 465 180 657 455 466 181 657 455 658 456 655 453 658 456 659 457 656 454 655 453 466 181 657 455 656 454 655 453 658 456 464 179 660 458 465 180 660 458 661 459 657 455 661 459 662 460 658 456 662 460 663 461 659 457 657 455 465 180 660 458 658 456 657 455 661 459 659 457 658 456 662 460 463 177 664 462 464 179 664 462 665 463 660 458 665 463 666 464 661 459 666 464 667 465 662 460 667 465 668 466 663 461 660 458 464 179 664 462 661 459 660 458 665 463 662 460 661 459 666 464 663 461 662 460 667 465 389 467 669 468 463 177 669 468 670 469 664 462 670 469 671 470 665 463 671 470 672 471 666 464 672 471 673 472 667 465 673 472 558 323 668 466 664 462 463 177 669 468 665 463 664 462 670 469 666 464 665 463 671 470 667 465 666 464 672 471 668 466 667 465 673 472 494 212 608 406 495 213 493 211 674 473 494 212 674 473 603 401 608 406 608 406 494 212 674 473 492 210 675 474 493 211 675 474 676 475 674 473 676 475 599 397 603 401 674 473 493 211 675 474 603 401 674 473 676 475 491 209 677 476 492 210 677 476 678 477 675 474 678 477 679 478 676 475 679 478 596 394 599 397 675 474 492 210 677 476 676 475 675 474 678 477 599 397 676 475 679 478 490 208 680 479 491 209 680 479 681 480 677 476 681 480 682 481 678 477 682 481 683 482 679 478 683 482 594 392 596 394 677 476 491 209 680 479 678 477 677 476 681 480 679 478 678 477 682 481 596 394 679 478 683 482 489 207 593 391 490 208 593 391 592 390 680 479 592 390 591 389 681 480 591 389 590 388 682 481 590 388 589 387 683 482 589 387 383 21 594 392 680 479 490 208 593 391 681 480 680 479 592 390 682 481 681 480 591 389 683 482 682 481 590 388 594 392 683 482 589 387 515 248 628 426 516 249 514 247 684 483 515 248 684 483 623 421 628 426 628 426 515 248 684 483 513 246 685 484 514 247 685 484 686 485 684 483 686 485 619 417 623 421 684 483 514 247 685 484 623 421 684 483 686 485 512 245 687 486 513 246 687 486 688 487 685 484 688 487 689 488 686 485 689 488 616 414 619 417 685 484 513 246 687 486 686 485 685 484 688 487 619 417 686 485 689 488 511 243 690 489 512 245 690 489 691 490 687 486 691 490 692 491 688 487 692 491 693 492 689 488 693 492 614 412 616 414 687 486 512 245 690 489 688 487 687 486 691 490 689 488 688 487 692 491 616 414 689 488 693 492 495 213 613 411 511 243 613 411 612 410 690 489 612 410 611 409 691 490 611 409 610 408 692 491 610 408 609 407 693 492 609 407 405 57 614 412 690 489 511 243 613 411 691 490 690 489 612 410 692 491 691 490 611 409 693 492 692 491 610 408 614 412 693 492 609 407 536 285 648 446 537 286 535 284 694 493 536 285 694 493 643 441 648 446 648 446 536 285 694 493 534 283 695 494 535 284 695 494 696 495 694 493 696 495 639 437 643 441 694 493 535 284 695 494 643 441 694 493 696 495 533 282 697 496 534 283 697 496 698 497 695 494 698 497 699 498 696 495 699 498 636 434 639 437 695 494 534 283 697 496 696 495 695 494 698 497 639 437 696 495 699 498 532 280 700 499 533 282 700 499 701 500 697 496 701 500 702 501 698 497 702 501 703 502 699 498 703 502 634 432 636 434 697 496 533 282 700 499 698 497 697 496 701 500 699 498 698 497 702 501 636 434 699 498 703 502 516 249 633 431 532 280 633 431 632 430 700 499 632 430 631 429 701 500 631 429 630 428 702 501 630 428 629 427 703 502 629 427 426 94 634 432 700 499 532 280 633 431 701 500 700 499 632 430 702 501 701 500 631 429 703 502 702 501 630 428 634 432 703 502 629 427 557 322 668 466 558 323 556 321 704 503 557 322 704 503 663 461 668 466 668 466 557 322 704 503 555 320 705 504 556 321 705 504 706 505 704 503 706 505 659 457 663 461 704 503 556 321 705 504 663 461 704 503 706 505 554 319 707 506 555 320 707 506 708 507 705 504 708 507 709 508 706 505 709 508 656 454 659 457 705 504 555 320 707 506 706 505 705 504 708 507 659 457 706 505 709 508 553 317 710 509 554 319 710 509 711 510 707 506 711 510 712 511 708 507 712 511 713 512 709 508 713 512 654 452 656 454 707 506 554 319 710 509 708 507 707 506 711 510 709 508 708 507 712 511 656 454 709 508 713 512 537 286 653 451 553 317 653 451 652 450 710 509 652 450 651 449 711 510 651 449 650 448 712 511 650 448 649 447 713 512 649 447 447 131 654 452 710 509 553 317 653 451 711 510 710 509 652 450 712 511 711 510 651 449 713 512 712 511 650 448 654 452 713 512 649 447 573 367 588 513 489 514 572 366 714 515 573 367 714 515 583 516 588 517 588 518 573 367 714 515 571 365 715 519 572 366 715 519 716 520 714 515 716 520 579 521 583 522 714 515 572 366 715 519 583 523 714 515 716 520 570 364 717 524 571 365 717 524 718 525 715 519 718 525 719 526 716 520 719 526 576 527 579 528 715 519 571 365 717 524 716 520 715 519 718 525 579 529 716 520 719 526 569 362 720 530 570 364 720 530 721 531 717 524 721 531 722 532 718 525 722 532 723 533 719 526 723 533 574 534 576 535 717 524 570 364 720 530 718 525 717 524 721 531 719 526 718 525 722 532 576 536 719 526 723 533 558 323 673 472 569 362 673 472 672 471 720 530 672 471 671 470 721 531 671 470 670 469 722 532 670 469 669 468 723 533 669 468 389 537 574 538 720 530 569 362 673 472 721 531 720 530 672 471 722 532 721 531 671 470 723 533 722 532 670 469 574 539 723 533 669 468 1 0 0 2 2 1 3 3 1 0 4 4 4 4 2 1 5 5 2 1 4 4 1 0 6 6 3 3 7 7 7 7 4 4 8 8 8 8 5 5 9 9 4 4 7 7 3 3 5 5 8 8 4 4 10 10 6 6 11 11 11 11 7 7 12 12 12 12 8 8 13 13 13 13 9 9 14 14 7 7 11 11 6 6 8 8 12 12 7 7 9 9 13 13 8 8 15 15 10 10 16 16 16 16 11 11 17 17 17 17 12 12 18 18 18 18 13 13 19 19 19 19 14 14 20 20 11 11 16 16 10 10 12 12 17 17 11 11 13 13 18 18 12 12 14 14 19 19 13 13 21 21 15 15 22 22 22 22 16 16 23 23 23 23 17 17 24 24 24 24 18 18 25 25 25 25 19 19 26 26 26 26 20 20 27 27 16 16 22 22 15 15 17 17 23 23 16 16 18 18 24 24 17 17 19 19 25 25 18 18 20 20 26 26 19 19 28 28 0 540 1 541 29 31 28 28 30 32 30 32 1 542 3 543 1 544 30 32 28 28 31 36 29 31 32 37 32 37 30 32 33 38 33 38 3 545 6 546 30 32 32 37 29 31 3 547 33 38 30 32 34 42 31 36 35 43 35 43 32 37 36 44 36 44 33 38 37 45 37 45 6 548 10 549 32 37 35 43 31 36 33 38 36 44 32 37 6 550 37 45 33 38 38 49 34 42 39 50 39 50 35 43 40 51 40 51 36 44 41 52 41 52 37 45 42 53 42 53 10 551 15 552 35 43 39 50 34 42 36 44 40 51 35 43 37 45 41 52 36 44 10 553 42 53 37 45 43 57 38 49 44 58 44 58 39 50 45 59 45 59 40 51 46 60 46 60 41 52 47 61 47 61 42 53 48 62 48 62 15 554 21 21 39 50 44 58 38 49 40 51 45 59 39 50 41 52 46 60 40 51 42 53 47 61 41 52 15 555 48 62 42 53 49 65 0 556 28 557 50 68 49 65 51 69 51 69 28 558 29 559 28 560 51 69 49 65 52 73 50 68 53 74 53 74 51 69 54 75 54 75 29 561 31 562 51 69 53 74 50 68 29 563 54 75 51 69 55 79 52 73 56 80 56 80 53 74 57 81 57 81 54 75 58 82 58 82 31 564 34 565 53 74 56 80 52 73 54 75 57 81 53 74 31 566 58 82 54 75 59 86 55 79 60 87 60 87 56 80 61 88 61 88 57 81 62 89 62 89 58 82 63 90 63 90 34 567 38 568 56 80 60 87 55 79 57 81 61 88 56 80 58 82 62 89 57 81 34 569 63 90 58 82 64 94 59 86 65 95 65 95 60 87 66 96 66 96 61 88 67 97 67 97 62 89 68 98 68 98 63 90 69 99 69 99 38 570 43 57 60 87 65 95 59 86 61 88 66 96 60 87 62 89 67 97 61 88 63 90 68 98 62 89 38 571 69 99 63 90 70 102 0 572 49 573 71 105 70 102 72 106 72 106 49 574 50 575 49 576 72 106 70 102 73 110 71 105 74 111 74 111 72 106 75 112 75 112 50 577 52 578 72 106 74 111 71 105 50 579 75 112 72 106 76 116 73 110 77 117 77 117 74 111 78 118 78 118 75 112 79 119 79 119 52 580 55 581 74 111 77 117 73 110 75 112 78 118 74 111 52 582 79 119 75 112 80 123 76 116 81 124 81 124 77 117 82 125 82 125 78 118 83 126 83 126 79 119 84 127 84 127 55 583 59 584 77 117 81 124 76 116 78 118 82 125 77 117 79 119 83 126 78 118 55 585 84 127 79 119 85 131 80 123 86 132 86 132 81 124 87 133 87 133 82 125 88 134 88 134 83 126 89 135 89 135 84 127 90 136 90 136 59 586 64 94 81 124 86 132 80 123 82 125 87 133 81 124 83 126 88 134 82 125 84 127 89 135 83 126 59 587 90 136 84 127 2 588 0 589 70 590 5 591 2 592 91 143 91 143 70 593 71 594 70 595 91 143 2 596 9 597 5 598 92 150 92 150 91 143 93 152 93 152 71 599 73 600 91 143 92 150 5 601 71 602 93 152 91 143 14 603 9 604 94 158 94 158 92 150 95 160 95 160 93 152 96 161 96 161 73 605 76 606 92 150 94 158 9 607 93 152 95 160 92 150 73 608 96 161 93 152 20 609 14 610 97 167 97 167 94 158 98 169 98 169 95 160 99 170 99 170 96 161 100 171 100 171 76 611 80 612 94 158 97 167 14 613 95 160 98 169 94 158 96 161 99 170 95 160 76 614 100 171 96 161 27 615 20 616 101 177 101 177 97 167 102 179 102 179 98 169 103 180 103 180 99 170 104 181 104 181 100 171 105 182 105 182 80 617 85 131 97 167 101 177 20 618 98 169 102 179 97 167 99 170 103 180 98 169 100 171 104 181 99 170 80 619 105 182 100 171 107 186 106 188 108 187 109 189 107 186 110 190 110 190 108 187 111 191 108 187 110 190 107 186 112 192 109 189 113 193 113 193 110 190 114 194 114 194 111 191 115 195 110 190 113 193 109 189 111 191 114 194 110 190 116 196 112 192 117 197 117 197 113 193 118 198 118 198 114 194 119 199 119 199 115 195 120 200 113 193 117 197 112 192 114 194 118 198 113 193 115 195 119 199 114 194 121 201 116 196 122 202 122 202 117 197 123 203 123 203 118 198 124 204 124 204 119 199 125 205 125 205 120 200 126 206 117 197 122 202 116 196 118 198 123 203 117 197 119 199 124 204 118 198 120 200 125 205 119 199 127 207 121 201 128 208 128 208 122 202 129 209 129 209 123 203 130 210 130 210 124 204 131 211 131 211 125 205 132 212 132 212 126 206 133 213 122 202 128 208 121 201 123 203 129 209 122 202 124 204 130 210 123 203 125 205 131 211 124 204 126 206 132 212 125 205 108 620 106 621 134 215 111 622 108 623 135 218 135 218 134 215 136 220 134 215 135 218 108 624 115 625 111 626 137 223 137 223 135 218 138 225 138 225 136 220 139 226 135 218 137 223 111 627 136 220 138 225 135 218 120 628 115 629 140 229 140 229 137 223 141 231 141 231 138 225 142 232 142 232 139 226 143 233 137 223 140 229 115 630 138 225 141 231 137 223 139 226 142 232 138 225 126 631 120 632 144 236 144 236 140 229 145 238 145 238 141 231 146 239 146 239 142 232 147 240 147 240 143 233 148 241 140 229 144 236 120 633 141 231 145 238 140 229 142 232 146 239 141 231 143 233 147 240 142 232 133 213 126 634 149 243 149 243 144 236 150 245 150 245 145 238 151 246 151 246 146 239 152 247 152 247 147 240 153 248 153 248 148 241 154 249 144 236 149 243 126 635 145 238 150 245 144 236 146 239 151 246 145 238 147 240 152 247 146 239 148 241 153 248 147 240 134 636 106 637 155 252 136 638 134 639 156 255 156 255 155 252 157 257 155 252 156 255 134 640 139 641 136 642 158 260 158 260 156 255 159 262 159 262 157 257 160 263 156 255 158 260 136 643 157 257 159 262 156 255 143 644 139 645 161 266 161 266 158 260 162 268 162 268 159 262 163 269 163 269 160 263 164 270 158 260 161 266 139 646 159 262 162 268 158 260 160 263 163 269 159 262 148 647 143 648 165 273 165 273 161 266 166 275 166 275 162 268 167 276 167 276 163 269 168 277 168 277 164 270 169 278 161 266 165 273 143 649 162 268 166 275 161 266 163 269 167 276 162 268 164 270 168 277 163 269 154 249 148 650 170 280 170 280 165 273 171 282 171 282 166 275 172 283 172 283 167 276 173 284 173 284 168 277 174 285 174 285 169 278 175 286 165 273 170 280 148 651 166 275 171 282 165 273 167 276 172 283 166 275 168 277 173 284 167 276 169 278 174 285 168 277 155 652 106 653 176 289 157 654 155 655 177 292 177 292 176 289 178 294 176 289 177 292 155 656 160 657 157 658 179 297 179 297 177 292 180 299 180 299 178 294 181 300 177 292 179 297 157 659 178 294 180 299 177 292 164 660 160 661 182 303 182 303 179 297 183 305 183 305 180 299 184 306 184 306 181 300 185 307 179 297 182 303 160 662 180 299 183 305 179 297 181 300 184 306 180 299 169 663 164 664 186 310 186 310 182 303 187 312 187 312 183 305 188 313 188 313 184 306 189 314 189 314 185 307 190 315 182 303 186 310 164 665 183 305 187 312 182 303 184 306 188 313 183 305 185 307 189 314 184 306 175 286 169 666 191 317 191 317 186 310 192 319 192 319 187 312 193 320 193 320 188 313 194 321 194 321 189 314 195 322 195 322 190 315 196 323 186 310 191 317 169 667 187 312 192 319 186 310 188 313 193 320 187 312 189 314 194 321 188 313 190 315 195 322 189 314 176 668 106 669 107 670 178 671 176 672 197 329 197 329 107 673 109 674 107 675 197 329 176 676 181 677 178 678 198 336 198 336 197 329 199 338 199 338 109 679 112 680 197 329 198 336 178 681 109 682 199 338 197 329 185 683 181 684 200 344 200 344 198 336 201 346 201 346 199 338 202 347 202 347 112 685 116 686 198 336 200 344 181 687 199 338 201 346 198 336 112 688 202 347 199 338 190 689 185 690 203 353 203 353 200 344 204 355 204 355 201 346 205 356 205 356 202 347 206 357 206 357 116 691 121 692 200 344 203 353 185 693 201 346 204 355 200 344 202 347 205 356 201 346 116 694 206 357 202 347 196 323 190 695 207 362 207 362 203 353 208 364 208 364 204 355 209 365 209 365 205 356 210 366 210 366 206 357 211 367 211 367 121 696 127 697 203 353 207 362 190 698 204 355 208 364 203 353 205 356 209 365 204 355 206 357 210 366 205 356 121 699 211 367 206 357 26 26 27 27 212 372 25 25 26 26 213 373 213 373 212 372 214 374 212 372 213 373 26 26 24 24 25 25 215 375 215 375 213 373 216 376 216 376 214 374 217 377 213 373 215 375 25 25 214 374 216 376 213 373 23 23 24 24 218 378 218 378 215 375 219 379 219 379 216 376 220 380 220 380 217 377 221 381 215 375 218 378 24 24 216 376 219 379 215 375 217 377 220 380 216 376 22 22 23 23 222 382 222 382 218 378 223 383 223 383 219 379 224 384 224 384 220 380 225 385 225 385 221 381 226 386 218 378 222 382 23 23 219 379 223 383 218 378 220 380 224 384 219 379 221 381 225 385 220 380 21 21 22 22 227 387 227 387 222 382 228 388 228 388 223 383 229 389 229 389 224 384 230 390 230 390 225 385 231 391 231 391 226 386 127 207 222 382 227 387 22 22 223 383 228 388 222 382 224 384 229 389 223 383 225 385 230 390 224 384 226 386 231 391 225 385 48 62 21 21 232 392 47 61 48 62 233 393 233 393 232 392 234 394 232 392 233 393 48 62 46 60 47 61 235 395 235 395 233 393 236 396 236 396 234 394 237 397 233 393 235 395 47 61 234 394 236 396 233 393 45 59 46 60 238 398 238 398 235 395 239 399 239 399 236 396 240 400 240 400 237 397 241 401 235 395 238 398 46 60 236 396 239 399 235 395 237 397 240 400 236 396 44 58 45 59 242 402 242 402 238 398 243 403 243 403 239 399 244 404 244 404 240 400 245 405 245 405 241 401 246 406 238 398 242 402 45 59 239 399 243 403 238 398 240 400 244 404 239 399 241 401 245 405 240 400 43 57 44 58 247 407 247 407 242 402 248 408 248 408 243 403 249 409 249 409 244 404 250 410 250 410 245 405 251 411 251 411 246 406 133 213 242 402 247 407 44 58 243 403 248 408 242 402 244 404 249 409 243 403 245 405 250 410 244 404 246 406 251 411 245 405 69 99 43 57 252 412 68 98 69 99 253 413 253 413 252 412 254 414 252 412 253 413 69 99 67 97 68 98 255 415 255 415 253 413 256 416 256 416 254 414 257 417 253 413 255 415 68 98 254 414 256 416 253 413 66 96 67 97 258 418 258 418 255 415 259 419 259 419 256 416 260 420 260 420 257 417 261 421 255 415 258 418 67 97 256 416 259 419 255 415 257 417 260 420 256 416 65 95 66 96 262 422 262 422 258 418 263 423 263 423 259 419 264 424 264 424 260 420 265 425 265 425 261 421 266 426 258 418 262 422 66 96 259 419 263 423 258 418 260 420 264 424 259 419 261 421 265 425 260 420 64 94 65 95 267 427 267 427 262 422 268 428 268 428 263 423 269 429 269 429 264 424 270 430 270 430 265 425 271 431 271 431 266 426 154 249 262 422 267 427 65 95 263 423 268 428 262 422 264 424 269 429 263 423 265 425 270 430 264 424 266 426 271 431 265 425 90 136 64 94 272 432 89 135 90 136 273 433 273 433 272 432 274 434 272 432 273 433 90 136 88 134 89 135 275 435 275 435 273 433 276 436 276 436 274 434 277 437 273 433 275 435 89 135 274 434 276 436 273 433 87 133 88 134 278 438 278 438 275 435 279 439 279 439 276 436 280 440 280 440 277 437 281 441 275 435 278 438 88 134 276 436 279 439 275 435 277 437 280 440 276 436 86 132 87 133 282 442 282 442 278 438 283 443 283 443 279 439 284 444 284 444 280 440 285 445 285 445 281 441 286 446 278 438 282 442 87 133 279 439 283 443 278 438 280 440 284 444 279 439 281 441 285 445 280 440 85 131 86 132 287 447 287 447 282 442 288 448 288 448 283 443 289 449 289 449 284 444 290 450 290 450 285 445 291 451 291 451 286 446 175 286 282 442 287 447 86 132 283 443 288 448 282 442 284 444 289 449 283 443 285 445 290 450 284 444 286 446 291 451 285 445 105 182 85 131 292 452 104 181 105 182 293 453 293 453 292 452 294 454 292 452 293 453 105 182 103 180 104 181 295 455 295 455 293 453 296 456 296 456 294 454 297 457 293 453 295 455 104 181 294 454 296 456 293 453 102 179 103 180 298 458 298 458 295 455 299 459 299 459 296 456 300 460 300 460 297 457 301 461 295 455 298 458 103 180 296 456 299 459 295 455 297 457 300 460 296 456 101 177 102 179 302 462 302 462 298 458 303 463 303 463 299 459 304 464 304 464 300 460 305 465 305 465 301 461 306 466 298 458 302 462 102 179 299 459 303 463 298 458 300 460 304 464 299 459 301 461 305 465 300 460 27 700 101 177 307 468 307 468 302 462 308 469 308 469 303 463 309 470 309 470 304 464 310 471 310 471 305 465 311 472 311 472 306 466 196 323 302 462 307 468 101 177 303 463 308 469 302 462 304 464 309 470 303 463 305 465 310 471 304 464 306 466 311 472 305 465 132 212 133 213 246 406 131 211 132 212 312 473 312 473 246 406 241 401 246 406 312 473 132 212 130 210 131 211 313 474 313 474 312 473 314 475 314 475 241 401 237 397 312 473 313 474 131 211 241 401 314 475 312 473 129 209 130 210 315 476 315 476 313 474 316 477 316 477 314 475 317 478 317 478 237 397 234 394 313 474 315 476 130 210 314 475 316 477 313 474 237 397 317 478 314 475 128 208 129 209 318 479 318 479 315 476 319 480 319 480 316 477 320 481 320 481 317 478 321 482 321 482 234 394 232 392 315 476 318 479 129 209 316 477 319 480 315 476 317 478 320 481 316 477 234 394 321 482 317 478 127 207 128 208 231 391 231 391 318 479 230 390 230 390 319 480 229 389 229 389 320 481 228 388 228 388 321 482 227 387 227 387 232 392 21 21 318 479 231 391 128 208 319 480 230 390 318 479 320 481 229 389 319 480 321 482 228 388 320 481 232 392 227 387 321 482 153 248 154 249 266 426 152 247 153 248 322 483 322 483 266 426 261 421 266 426 322 483 153 248 151 246 152 247 323 484 323 484 322 483 324 485 324 485 261 421 257 417 322 483 323 484 152 247 261 421 324 485 322 483 150 245 151 246 325 486 325 486 323 484 326 487 326 487 324 485 327 488 327 488 257 417 254 414 323 484 325 486 151 246 324 485 326 487 323 484 257 417 327 488 324 485 149 243 150 245 328 489 328 489 325 486 329 490 329 490 326 487 330 491 330 491 327 488 331 492 331 492 254 414 252 412 325 486 328 489 150 245 326 487 329 490 325 486 327 488 330 491 326 487 254 414 331 492 327 488 133 213 149 243 251 411 251 411 328 489 250 410 250 410 329 490 249 409 249 409 330 491 248 408 248 408 331 492 247 407 247 407 252 412 43 57 328 489 251 411 149 243 329 490 250 410 328 489 330 491 249 409 329 490 331 492 248 408 330 491 252 412 247 407 331 492 174 285 175 286 286 446 173 284 174 285 332 493 332 493 286 446 281 441 286 446 332 493 174 285 172 283 173 284 333 494 333 494 332 493 334 495 334 495 281 441 277 437 332 493 333 494 173 284 281 441 334 495 332 493 171 282 172 283 335 496 335 496 333 494 336 497 336 497 334 495 337 498 337 498 277 437 274 434 333 494 335 496 172 283 334 495 336 497 333 494 277 437 337 498 334 495 170 280 171 282 338 499 338 499 335 496 339 500 339 500 336 497 340 501 340 501 337 498 341 502 341 502 274 434 272 432 335 496 338 499 171 282 336 497 339 500 335 496 337 498 340 501 336 497 274 434 341 502 337 498 154 249 170 280 271 431 271 431 338 499 270 430 270 430 339 500 269 429 269 429 340 501 268 428 268 428 341 502 267 427 267 427 272 432 64 94 338 499 271 431 170 280 339 500 270 430 338 499 340 501 269 429 339 500 341 502 268 428 340 501 272 432 267 427 341 502 195 322 196 323 306 466 194 321 195 322 342 503 342 503 306 466 301 461 306 466 342 503 195 322 193 320 194 321 343 504 343 504 342 503 344 505 344 505 301 461 297 457 342 503 343 504 194 321 301 461 344 505 342 503 192 319 193 320 345 506 345 506 343 504 346 507 346 507 344 505 347 508 347 508 297 457 294 454 343 504 345 506 193 320 344 505 346 507 343 504 297 457 347 508 344 505 191 317 192 319 348 509 348 509 345 506 349 510 349 510 346 507 350 511 350 511 347 508 351 512 351 512 294 454 292 452 345 506 348 509 192 319 346 507 349 510 345 506 347 508 350 511 346 507 294 454 351 512 347 508 175 286 191 317 291 451 291 451 348 509 290 450 290 450 349 510 289 449 289 449 350 511 288 448 288 448 351 512 287 447 287 447 292 452 85 131 348 509 291 451 191 317 349 510 290 450 348 509 350 511 289 449 349 510 351 512 288 448 350 511 292 452 287 447 351 512 211 367 127 701 226 702 210 366 211 367 352 515 352 515 226 703 221 704 226 705 352 515 211 367 209 365 210 366 353 519 353 519 352 515 354 520 354 520 221 706 217 707 352 515 353 519 210 366 221 708 354 520 352 515 208 364 209 365 355 524 355 524 353 519 356 525 356 525 354 520 357 526 357 526 217 709 214 710 353 519 355 524 209 365 354 520 356 525 353 519 217 711 357 526 354 520 207 362 208 364 358 530 358 530 355 524 359 531 359 531 356 525 360 532 360 532 357 526 361 533 361 533 214 712 212 713 355 524 358 530 208 364 356 525 359 531 355 524 357 526 360 532 356 525 214 714 361 533 357 526 196 323 207 362 311 472 311 472 358 530 310 471 310 471 359 531 309 470 309 470 360 532 308 469 308 469 361 533 307 468 307 468 212 715 27 716 358 530 311 472 207 362 359 531 310 471 358 530 360 532 309 470 359 531 361 533 308 469 360 532 212 717 307 468 361 533</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Sphere-high-doublesided">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-high-inverted.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-high-inverted.dae
new file mode 100644
index 0000000..0881cd1
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-high-inverted.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/spheres/Sphere-high-inverted.mb</source_data>
+ </contributor>
+ <created>2008-09-19T22:05:04Z</created>
+ <modified>2008-09-19T22:05:04Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="1086">0 50 0 8.72494 49.1512 2.8349 0 49.1512 9.17395 17.1537 46.6335 5.57358 8.84255 47.6832 12.1707 0 46.6335 18.0365 25 42.5325 8.12299 17.2996 44.4764 14.919 8.84298 44.4764 21.0631 0 42.5325 26.2866 31.9975 36.9875 10.3966 26.1426 38.7299 17.7923 17.8411 39.7327 24.5562 8.84298 38.7299 30.3612 0 36.9875 33.6441 37.9086 30.1865 12.3172 32.6527 32.2104 19.9071 26.1426 33.2344 26.6841 17.2996 33.2344 33.1089 8.84255 32.2104 37.2062 0 30.1865 39.8594 42.5325 22.3607 13.8197 37.9086 24.5167 21.4912 31.9975 25.8403 28.4331 25 26.2866 34.4095 17.1537 25.8403 39.2177 8.72494 24.5167 42.6943 0 22.3607 44.7214 5.39231 49.1512 -7.42188 10.6016 46.6335 -14.5918 14.3075 47.6832 -4.6488 15.4509 42.5325 -21.2663 19.5347 44.4764 -11.8426 22.7648 44.4764 -1.90132 19.7755 36.9875 -27.2187 25 38.7299 -19.3649 28.8675 39.7327 -9.37962 31.6078 38.7299 0.971941 23.4288 30.1865 -32.247 29.023 32.2104 -24.9029 33.4566 33.2344 -16.6172 36.8343 33.2344 -6.22166 38.1177 32.2104 3.08758 26.2866 22.3607 -36.1803 32.1537 24.5167 -29.4121 36.9292 25.8403 -21.6451 40.4509 26.2866 -13.1433 42.599 25.8403 -4.19521 43.3009 24.5167 4.89537 -5.39231 49.1512 -7.42188 -10.6016 46.6335 -14.5918 0 47.6832 -15.0438 -15.4509 42.5325 -21.2663 -5.22646 44.4764 -22.2382 5.22646 44.4764 -22.2382 -19.7755 36.9875 -27.2187 -10.6917 38.7299 -29.7605 0 39.7327 -30.3531 10.6917 38.7299 -29.7605 -23.4288 30.1865 -32.247 -14.7155 32.2104 -35.298 -5.46526 33.2344 -36.9541 5.46526 33.2344 -36.9541 14.7155 32.2104 -35.298 -26.2866 22.3607 -36.1803 -18.0365 24.5167 -39.6688 -9.17395 25.8403 -41.8105 0 26.2866 -42.5325 9.17395 25.8403 -41.8105 18.0365 24.5167 -39.6688 -8.72494 49.1512 2.8349 -17.1537 46.6335 5.57358 -14.3075 47.6832 -4.6488 -25 42.5325 8.12299 -22.7648 44.4764 -1.90132 -19.5347 44.4764 -11.8426 -31.9975 36.9875 10.3966 -31.6078 38.7299 0.971941 -28.8675 39.7327 -9.37962 -25 38.7299 -19.3649 -37.9086 30.1865 12.3172 -38.1177 32.2104 3.08758 -36.8343 33.2344 -6.22166 -33.4566 33.2344 -16.6172 -29.023 32.2104 -24.9029 -42.5325 22.3607 13.8197 -43.3009 24.5167 4.89537 -42.599 25.8403 -4.19521 -40.4509 26.2866 -13.1433 -36.9292 25.8403 -21.6451 -32.1537 24.5167 -29.4121 -8.84255 47.6832 12.1707 -8.84298 44.4764 21.0631 -17.2996 44.4764 14.919 -8.84298 38.7299 30.3612 -17.8411 39.7327 24.5562 -26.1426 38.7299 17.7923 -8.84255 32.2104 37.2062 -17.2996 33.2344 33.1089 -26.1426 33.2344 26.6841 -32.6527 32.2104 19.9071 -8.72494 24.5167 42.6943 -17.1537 25.8403 39.2177 -25 26.2866 34.4095 -31.9975 25.8403 28.4331 -37.9086 24.5167 21.4912 0 -50 0 5.39231 -49.1512 7.42188 8.72494 -49.1512 -2.8349 10.6016 -46.6335 14.5918 14.3075 -47.6832 4.6488 17.1537 -46.6335 -5.57358 15.4509 -42.5325 21.2663 19.5347 -44.4764 11.8426 22.7648 -44.4764 1.90132 25 -42.5325 -8.12299 19.7755 -36.9875 27.2187 25 -38.7299 19.3649 28.8675 -39.7327 9.37962 31.6078 -38.7299 -0.971941 31.9975 -36.9875 -10.3966 23.4288 -30.1865 32.247 29.023 -32.2104 24.9029 33.4566 -33.2344 16.6172 36.8343 -33.2344 6.22166 38.1177 -32.2104 -3.08758 37.9086 -30.1865 -12.3172 26.2866 -22.3607 36.1803 32.1537 -24.5167 29.4121 36.9292 -25.8403 21.6451 40.4509 -26.2866 13.1433 42.599 -25.8403 4.19521 43.3009 -24.5167 -4.89537 42.5325 -22.3607 -13.8197 0 -49.1512 -9.17395 8.84255 -47.6832 -12.1707 0 -46.6335 -18.0365 17.2996 -44.4764 -14.919 8.84298 -44.4764 -21.0631 0 -42.5325 -26.2866 26.1426 -38.7299 -17.7923 17.8411 -39.7327 -24.5562 8.84298 -38.7299 -30.3612 0 -36.9875 -33.6441 32.6527 -32.2104 -19.9071 26.1426 -33.2344 -26.6841 17.2996 -33.2344 -33.1089 8.84255 -32.2104 -37.2062 0 -30.1865 -39.8594 37.9086 -24.5167 -21.4912 31.9975 -25.8403 -28.4331 25 -26.2866 -34.4095 17.1537 -25.8403 -39.2177 8.72494 -24.5167 -42.6943 0 -22.3607 -44.7214 -8.72494 -49.1512 -2.8349 -8.84255 -47.6832 -12.1707 -17.1537 -46.6335 -5.57358 -8.84298 -44.4764 -21.0631 -17.2996 -44.4764 -14.919 -25 -42.5325 -8.12299 -8.84298 -38.7299 -30.3612 -17.8411 -39.7327 -24.5562 -26.1426 -38.7299 -17.7923 -31.9975 -36.9875 -10.3966 -8.84255 -32.2104 -37.2062 -17.2996 -33.2344 -33.1089 -26.1426 -33.2344 -26.6841 -32.6527 -32.2104 -19.9071 -37.9086 -30.1865 -12.3172 -8.72494 -24.5167 -42.6943 -17.1537 -25.8403 -39.2177 -25 -26.2866 -34.4095 -31.9975 -25.8403 -28.4331 -37.9086 -24.5167 -21.4912 -42.5325 -22.3607 -13.8197 -5.39231 -49.1512 7.42188 -14.3075 -47.6832 4.6488 -10.6016 -46.6335 14.5918 -22.7648 -44.4764 1.90132 -19.5347 -44.4764 11.8426 -15.4509 -42.5325 21.2663 -31.6078 -38.7299 -0.971941 -28.8675 -39.7327 9.37962 -25 -38.7299 19.3649 -19.7755 -36.9875 27.2187 -38.1177 -32.2104 -3.08758 -36.8343 -33.2344 6.22166 -33.4566 -33.2344 16.6172 -29.023 -32.2104 24.9029 -23.4288 -30.1865 32.247 -43.3009 -24.5167 -4.89537 -42.599 -25.8403 4.19521 -40.4509 -26.2866 13.1433 -36.9292 -25.8403 21.6451 -32.1537 -24.5167 29.4121 -26.2866 -22.3607 36.1803 0 -47.6832 15.0438 -5.22646 -44.4764 22.2382 5.22646 -44.4764 22.2382 -10.6917 -38.7299 29.7605 0 -39.7327 30.3531 10.6917 -38.7299 29.7605 -14.7155 -32.2104 35.298 -5.46526 -33.2344 36.9541 5.46526 -33.2344 36.9541 14.7155 -32.2104 35.298 -18.0365 -24.5167 39.6688 -9.17395 -25.8403 41.8105 0 -26.2866 42.5325 9.17395 -25.8403 41.8105 18.0365 -24.5167 39.6688 5.39231 15.3427 47.2813 14.3075 17.1665 44.7281 10.6016 7.80382 48.236 22.7648 18.1898 40.6312 19.5347 9.29806 45.0771 15.4509 0 47.5528 31.6078 18.1898 34.2064 28.8675 9.37962 39.7327 25 0 43.3013 19.7755 -7.80382 45.2552 38.1177 17.1665 27.429 36.8343 9.29806 32.5082 33.4566 0 37.1572 29.023 -7.86893 39.9468 23.4288 -15.3427 41.4209 43.3009 15.3427 19.7391 42.599 7.80382 24.9884 40.4509 0 29.3893 36.9292 -7.80382 32.7923 32.1537 -15.3427 35.0819 46.6335 15.3427 9.48234 46.9602 17.1665 0.214459 49.1512 7.80382 4.82303 45.6773 18.1898 -9.09492 48.9074 9.29806 -4.64903 50 0 0 42.2995 18.1898 -19.4905 46.7086 9.37962 -15.1765 48.9074 0 -10.3955 49.1512 -7.80382 -4.82303 37.8656 17.1665 -27.776 42.2995 9.29806 -24.9859 45.6773 0 -20.3369 46.9602 -7.86893 -15.2583 46.6335 -15.3427 -9.48234 32.1537 15.3427 -35.0819 36.9292 7.80382 -32.7923 40.4509 0 -29.3893 42.599 -7.80382 -24.9884 43.3009 -15.3427 -19.7391 23.4288 15.3427 -41.4209 14.7155 17.1665 -44.5956 19.7755 7.80382 -45.2552 5.46526 18.1898 -46.2521 10.6917 9.29806 -47.9503 15.4509 0 -47.5528 -5.46526 18.1898 -46.2521 0 9.37962 -49.1123 5.22646 0 -49.7261 10.6016 -7.80382 -48.236 -14.7155 17.1665 -44.5956 -10.6917 9.29806 -47.9503 -5.22646 0 -49.7261 0 -7.86893 -49.3769 5.39231 -15.3427 -47.2813 -23.4288 15.3427 -41.4209 -19.7755 7.80382 -45.2552 -15.4509 0 -47.5528 -10.6016 -7.80382 -48.236 -5.39231 -15.3427 -47.2813 -32.1537 15.3427 -35.0819 -37.8656 17.1665 -27.776 -36.9292 7.80382 -32.7923 -42.2995 18.1898 -19.4905 -42.2995 9.29806 -24.9859 -40.4509 0 -29.3893 -45.6773 18.1898 -9.09492 -46.7086 9.37962 -15.1765 -45.6773 0 -20.3369 -42.599 -7.80382 -24.9884 -46.9602 17.1665 0.214459 -48.9074 9.29806 -4.64903 -48.9074 0 -10.3955 -46.9602 -7.86893 -15.2583 -43.3009 -15.3427 -19.7391 -46.6335 15.3427 9.48234 -49.1512 7.80382 4.82303 -50 0 0 -49.1512 -7.80382 -4.82303 -46.6335 -15.3427 -9.48234 -43.3009 15.3427 19.7391 -38.1177 17.1665 27.429 -42.599 7.80382 24.9884 -31.6078 18.1898 34.2064 -36.8343 9.29806 32.5082 -40.4509 0 29.3893 -22.7648 18.1898 40.6312 -28.8675 9.37962 39.7327 -33.4566 0 37.1572 -36.9292 -7.80382 32.7923 -14.3075 17.1665 44.7281 -19.5347 9.29806 45.0771 -25 0 43.3013 -29.023 -7.86893 39.9468 -32.1537 -15.3427 35.0819 -5.39231 15.3427 47.2813 -10.6016 7.80382 48.236 -15.4509 0 47.5528 -19.7755 -7.80382 45.2552 -23.4288 -15.3427 41.4209 46.9602 -17.1665 -0.214459 45.6773 -18.1898 9.09492 48.9074 -9.29806 4.64903 42.2995 -18.1898 19.4905 46.7086 -9.37962 15.1765 48.9074 0 10.3955 37.8656 -17.1665 27.776 42.2995 -9.29806 24.9859 45.6773 0 20.3369 46.9602 7.86893 15.2583 14.3075 -17.1665 -44.7281 22.7648 -18.1898 -40.6312 19.5347 -9.29806 -45.0771 31.6078 -18.1898 -34.2064 28.8675 -9.37962 -39.7327 25 0 -43.3013 38.1177 -17.1665 -27.429 36.8343 -9.29806 -32.5082 33.4566 0 -37.1572 29.023 7.86893 -39.9468 -38.1177 -17.1665 -27.429 -31.6078 -18.1898 -34.2064 -36.8343 -9.29806 -32.5082 -22.7648 -18.1898 -40.6312 -28.8675 -9.37962 -39.7327 -33.4566 0 -37.1572 -14.3075 -17.1665 -44.7281 -19.5347 -9.29806 -45.0771 -25 0 -43.3013 -29.023 7.86893 -39.9468 -37.8656 -17.1665 27.776 -42.2995 -18.1898 19.4905 -42.2995 -9.29806 24.9859 -45.6773 -18.1898 9.09492 -46.7086 -9.37962 15.1765 -45.6773 0 20.3369 -46.9602 -17.1665 -0.214459 -48.9074 -9.29806 4.64903 -48.9074 0 10.3955 -46.9602 7.86893 15.2583 14.7155 -17.1665 44.5956 5.46526 -18.1898 46.2521 10.6917 -9.29806 47.9503 -5.46526 -18.1898 46.2521 0 -9.37962 49.1123 5.22646 0 49.7261 -14.7155 -17.1665 44.5956 -10.6917 -9.29806 47.9503 -5.22646 0 49.7261 0 7.86893 49.3769</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="362" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="1086">0 -1 0.000000 -0.165156 -0.984806 -0.053662 0 -0.984806 -0.173655 -0.33628 -0.935402 -0.109264 -0.1769 -0.953637 -0.243482 0 -0.935402 -0.353586 -0.5 -0.850651 -0.16246 -0.351546 -0.885484 -0.303864 -0.180358 -0.885484 -0.42824 0 -0.850651 -0.525731 -0.645311 -0.734581 -0.209674 -0.515363 -0.779029 -0.357091 -0.356822 -0.794654 -0.491124 -0.180358 -0.77903 -0.600487 0 -0.734581 -0.678521 -0.763866 -0.595741 -0.248195 -0.652988 -0.644256 -0.398172 -0.515363 -0.667784 -0.537089 -0.351546 -0.667784 -0.656109 -0.1769 -0.644256 -0.74407 0 -0.595741 -0.803176 -0.850651 -0.447214 -0.276393 -0.763866 -0.488416 -0.421851 -0.645312 -0.516053 -0.56326 -0.5 -0.525731 -0.688191 -0.33628 -0.516053 -0.787785 -0.165156 -0.488416 -0.856839 0 -0.447214 -0.894427 -0.102072 -0.984806 0.14049 -0.207833 -0.935402 0.286057 -0.28623 -0.953637 0.093001 -0.309017 -0.850651 0.425326 -0.397625 -0.885484 0.240441 -0.463014 -0.885484 0.039197 -0.398825 -0.734581 0.548935 -0.49887 -0.77903 0.379792 -0.57735 -0.794654 0.187592 -0.62683 -0.77903 -0.01403 -0.472095 -0.595741 0.649783 -0.580469 -0.644256 0.497986 -0.670058 -0.667784 0.32417 -0.732631 -0.667784 0.131591 -0.762318 -0.644256 -0.061688 -0.525731 -0.447214 0.723607 -0.637252 -0.488416 0.596121 -0.735105 -0.516053 0.439671 -0.809017 -0.525731 0.262865 -0.853144 -0.516053 0.076382 -0.865939 -0.488416 -0.107705 0.102072 -0.984806 0.14049 0.207833 -0.935402 0.286057 0 -0.953637 0.30096 0.309017 -0.850651 0.425325 0.105801 -0.885484 0.452465 -0.105801 -0.885484 0.452464 0.398825 -0.734581 0.548935 0.207045 -0.77903 0.591815 0 -0.794654 0.607062 -0.207045 -0.77903 0.591816 0.472095 -0.595741 0.649783 0.294238 -0.644256 0.705945 0.101244 -0.667784 0.737437 -0.101244 -0.667784 0.737437 -0.294238 -0.644256 0.705945 0.525731 -0.447214 0.723607 0.370023 -0.488416 0.790274 0.190992 -0.516053 0.834992 0 -0.525731 0.850651 -0.190992 -0.516053 0.834992 -0.370023 -0.488416 0.790274 0.165156 -0.984806 -0.053662 0.33628 -0.935402 -0.109264 0.28623 -0.953637 0.093002 0.5 -0.850651 -0.16246 0.463014 -0.885484 0.039197 0.397625 -0.885484 0.240441 0.645311 -0.734581 -0.209674 0.62683 -0.77903 -0.01403 0.57735 -0.794654 0.187592 0.49887 -0.77903 0.379792 0.763866 -0.595741 -0.248195 0.762318 -0.644256 -0.061688 0.732631 -0.667785 0.131592 0.670058 -0.667784 0.32417 0.580469 -0.644256 0.497986 0.850651 -0.447214 -0.276393 0.865938 -0.488416 -0.107705 0.853144 -0.516053 0.076382 0.809017 -0.525731 0.262865 0.735105 -0.516053 0.439671 0.637252 -0.488416 0.596121 0.1769 -0.953637 -0.243482 0.180358 -0.885484 -0.42824 0.351546 -0.885484 -0.303864 0.180358 -0.77903 -0.600487 0.356822 -0.794654 -0.491123 0.515363 -0.779029 -0.357091 0.1769 -0.644256 -0.74407 0.351547 -0.667784 -0.656109 0.515363 -0.667784 -0.537089 0.652988 -0.644256 -0.398172 0.165156 -0.488416 -0.856839 0.33628 -0.516053 -0.787785 0.5 -0.525731 -0.688191 0.645312 -0.516053 -0.56326 0.763866 -0.488416 -0.421851 0 1 -0.000000 -0.102072 0.984806 -0.14049 -0.165156 0.984806 0.053662 -0.207833 0.935402 -0.286057 -0.28623 0.953637 -0.093001 -0.33628 0.935402 0.109264 -0.309017 0.850651 -0.425326 -0.397625 0.885484 -0.240441 -0.463014 0.885484 -0.039197 -0.5 0.850651 0.16246 -0.398825 0.734581 -0.548935 -0.49887 0.77903 -0.379792 -0.57735 0.794654 -0.187592 -0.62683 0.77903 0.01403 -0.645312 0.734581 0.209674 -0.472095 0.595741 -0.649783 -0.580469 0.644256 -0.497986 -0.670058 0.667784 -0.32417 -0.732631 0.667784 -0.131591 -0.762318 0.644256 0.061688 -0.763866 0.595741 0.248195 -0.525731 0.447214 -0.723607 -0.637252 0.488416 -0.596121 -0.735105 0.516053 -0.439671 -0.809017 0.525731 -0.262865 -0.853144 0.516053 -0.076382 -0.865939 0.488416 0.107705 -0.850651 0.447214 0.276393 0 0.984806 0.173655 -0.1769 0.953637 0.243482 0 0.935402 0.353586 -0.351546 0.885484 0.303864 -0.180358 0.885484 0.42824 0 0.850651 0.525731 -0.515363 0.779029 0.357091 -0.356822 0.794654 0.491124 -0.180358 0.77903 0.600487 0 0.734581 0.678521 -0.652988 0.644256 0.398172 -0.515363 0.667784 0.537089 -0.351546 0.667784 0.656109 -0.1769 0.644256 0.74407 0 0.595741 0.803176 -0.763866 0.488416 0.421851 -0.645312 0.516053 0.56326 -0.5 0.525731 0.688191 -0.33628 0.516053 0.787785 -0.165156 0.488416 0.856839 0 0.447214 0.894427 0.165156 0.984806 0.053662 0.1769 0.953637 0.243482 0.33628 0.935402 0.109264 0.180358 0.885484 0.42824 0.351546 0.885484 0.303864 0.5 0.850651 0.16246 0.180358 0.77903 0.600487 0.356822 0.794654 0.491123 0.515363 0.779029 0.357091 0.645312 0.734581 0.209674 0.1769 0.644256 0.74407 0.351547 0.667784 0.656109 0.515363 0.667784 0.537089 0.652988 0.644256 0.398172 0.763866 0.595741 0.248195 0.165156 0.488416 0.856839 0.33628 0.516053 0.787785 0.5 0.525731 0.688191 0.645312 0.516053 0.56326 0.763866 0.488416 0.421851 0.850651 0.447214 0.276393 0.102072 0.984806 -0.14049 0.28623 0.953637 -0.093002 0.207833 0.935402 -0.286057 0.463014 0.885484 -0.039197 0.397625 0.885484 -0.240441 0.309017 0.850651 -0.425326 0.62683 0.77903 0.01403 0.57735 0.794654 -0.187592 0.49887 0.77903 -0.379792 0.398825 0.734581 -0.548935 0.762318 0.644256 0.061688 0.732631 0.667785 -0.131592 0.670058 0.667784 -0.32417 0.580469 0.644256 -0.497986 0.472095 0.595741 -0.649783 0.865938 0.488416 0.107705 0.853144 0.516053 -0.076382 0.809017 0.525731 -0.262865 0.735105 0.516053 -0.439671 0.637252 0.488416 -0.596121 0.525731 0.447214 -0.723607 0 0.953637 -0.30096 0.105801 0.885484 -0.452465 -0.105801 0.885484 -0.452464 0.207045 0.77903 -0.591815 0 0.794654 -0.607062 -0.207045 0.77903 -0.591816 0.294238 0.644256 -0.705945 0.101244 0.667784 -0.737437 -0.101244 0.667784 -0.737437 -0.294238 0.644256 -0.705945 0.370023 0.488416 -0.790274 0.190992 0.516053 -0.834992 0 0.525731 -0.850651 -0.190992 0.516053 -0.834992 -0.370023 0.488416 -0.790274 -0.102072 -0.31476 -0.943667 -0.28623 -0.343296 -0.89455 -0.207832 -0.162468 -0.964578 -0.463014 -0.360942 -0.80953 -0.397625 -0.180943 -0.89953 -0.309017 0 -0.951057 -0.62683 -0.360942 -0.690511 -0.57735 -0.187592 -0.794654 -0.49887 -0.008696 -0.866633 -0.398824 0.162468 -0.902521 -0.762318 -0.343296 -0.548653 -0.73263 -0.180943 -0.656134 -0.670058 -0.008696 -0.742258 -0.580469 0.157292 -0.798946 -0.472095 0.31476 -0.823439 -0.865938 -0.31476 -0.388686 -0.853144 -0.162468 -0.495731 -0.809017 0 -0.587785 -0.735105 0.162468 -0.658199 -0.637252 0.31476 -0.703446 -0.929023 -0.31476 -0.194533 -0.939218 -0.343296 -0.004209 -0.981592 -0.162467 -0.10041 -0.912988 -0.360942 0.190193 -0.978377 -0.180943 0.100194 -1 0 0 -0.850416 -0.360942 0.382771 -0.934172 -0.187592 0.303531 -0.978377 -0.008696 0.206649 -0.981592 0.162467 0.10041 -0.757369 -0.343296 0.555464 -0.850416 -0.180943 0.494017 -0.912988 -0.008695 0.407893 -0.939218 0.157292 0.30517 -0.929023 0.31476 0.194533 -0.637252 -0.31476 0.703446 -0.735105 -0.162468 0.658199 -0.809017 0 0.587785 -0.853144 0.162468 0.495731 -0.865938 0.31476 0.388686 -0.472095 -0.31476 0.823439 -0.294238 -0.343296 0.891948 -0.398825 -0.162468 0.902521 -0.101244 -0.360942 0.927077 -0.207045 -0.180943 0.961453 -0.309017 0 0.951057 0.101244 -0.360942 0.927077 0 -0.187592 0.982247 -0.1058 -0.008696 0.994349 -0.207832 0.162468 0.964578 0.294238 -0.343296 0.891948 0.207045 -0.180943 0.961453 0.1058 -0.008696 0.994349 0 0.157292 0.987552 -0.102072 0.31476 0.943667 0.472095 -0.31476 0.823439 0.398825 -0.162468 0.902521 0.309017 0 0.951057 0.207832 0.162468 0.964578 0.102072 0.31476 0.943667 0.637252 -0.31476 0.703446 0.757369 -0.343296 0.555464 0.735105 -0.162468 0.658199 0.850416 -0.360942 0.382771 0.850416 -0.180943 0.494017 0.809017 0 0.587785 0.912988 -0.360942 0.190193 0.934172 -0.187592 0.303531 0.912988 -0.008695 0.407893 0.853144 0.162468 0.495731 0.939218 -0.343296 -0.004209 0.978377 -0.180943 0.100194 0.978377 -0.008696 0.206649 0.939218 0.157292 0.30517 0.865938 0.31476 0.388686 0.929023 -0.31476 -0.194533 0.981592 -0.162467 -0.10041 1 0 0 0.981592 0.162467 0.10041 0.929023 0.31476 0.194533 0.865938 -0.31476 -0.388686 0.762318 -0.343296 -0.548653 0.853144 -0.162468 -0.495731 0.62683 -0.360942 -0.690511 0.73263 -0.180943 -0.656134 0.809017 0 -0.587785 0.463014 -0.360941 -0.80953 0.57735 -0.187592 -0.794654 0.670058 -0.008696 -0.742258 0.735105 0.162468 -0.658199 0.28623 -0.343296 -0.89455 0.397625 -0.180943 -0.89953 0.49887 -0.008696 -0.866633 0.580469 0.157292 -0.798946 0.637252 0.31476 -0.703446 0.102072 -0.31476 -0.943667 0.207832 -0.162468 -0.964578 0.309017 0 -0.951057 0.398824 0.162468 -0.902521 0.472095 0.31476 -0.823439 -0.939218 0.343296 0.004209 -0.912988 0.360942 -0.190193 -0.978377 0.180943 -0.100194 -0.850416 0.360942 -0.382771 -0.934172 0.187592 -0.303531 -0.978377 0.008696 -0.206649 -0.757369 0.343296 -0.555464 -0.850416 0.180943 -0.494017 -0.912988 0.008695 -0.407893 -0.939218 -0.157292 -0.30517 -0.28623 0.343296 0.89455 -0.463014 0.360942 0.80953 -0.397625 0.180943 0.89953 -0.62683 0.360942 0.690511 -0.57735 0.187592 0.794654 -0.49887 0.008696 0.866633 -0.762318 0.343296 0.548653 -0.73263 0.180943 0.656134 -0.670058 0.008696 0.742258 -0.580469 -0.157292 0.798946 0.762318 0.343296 0.548653 0.62683 0.360942 0.690511 0.73263 0.180943 0.656134 0.463014 0.360941 0.80953 0.57735 0.187592 0.794654 0.670058 0.008696 0.742258 0.28623 0.343296 0.89455 0.397625 0.180943 0.89953 0.49887 0.008696 0.866633 0.580469 -0.157292 0.798946 0.757369 0.343296 -0.555464 0.850416 0.360942 -0.382771 0.850416 0.180943 -0.494017 0.912988 0.360942 -0.190193 0.934172 0.187592 -0.303531 0.912988 0.008695 -0.407893 0.939218 0.343296 0.004209 0.978377 0.180943 -0.100194 0.978377 0.008696 -0.206649 0.939218 -0.157292 -0.30517 -0.294238 0.343296 -0.891948 -0.101244 0.360942 -0.927077 -0.207045 0.180943 -0.961453 0.101244 0.360942 -0.927077 0 0.187592 -0.982247 -0.1058 0.008696 -0.994349 0.294238 0.343296 -0.891948 0.207045 0.180943 -0.961453 0.1058 0.008696 -0.994349 0 -0.157292 -0.987552</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="362" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="1080">0.106061 0.944444 0.075757 0.944444 0.090909 1 0.121212 0.888889 0.090909 0.888889 0.060606 0.888889 0.136364 0.833333 0.106061 0.833333 0.075757 0.833333 0.045454 0.833333 0.151515 0.777778 0.121212 0.777778 0.090909 0.777778 0.060606 0.777778 0.030303 0.777778 0.166667 0.722222 0.136364 0.722222 0.106061 0.722222 0.075757 0.722222 0.045454 0.722222 0.015151 0.722222 0.181818 0.666667 0.151515 0.666667 0.121212 0.666667 0.090909 0.666667 0.060606 0.666667 0.030303 0.666667 0 0.666667 0.287879 0.944444 0.257576 0.944444 0.272727 1 0.30303 0.888889 0.272727 0.888889 0.242424 0.888889 0.257576 0.944444 0.257576 0.944444 0.318182 0.833333 0.287879 0.833333 0.257576 0.833333 0.227273 0.833333 0.242424 0.888889 0.242424 0.888889 0.333333 0.777778 0.30303 0.777778 0.272727 0.777778 0.242424 0.777778 0.212121 0.777778 0.227273 0.833333 0.227273 0.833333 0.348485 0.722222 0.318182 0.722222 0.287879 0.722222 0.257576 0.722222 0.227273 0.722222 0.19697 0.722222 0.212121 0.777778 0.212121 0.777778 0.363636 0.666667 0.333333 0.666667 0.30303 0.666667 0.272727 0.666667 0.242424 0.666667 0.212121 0.666667 0.19697 0.722222 0.19697 0.722222 0.469697 0.944444 0.439394 0.944444 0.454545 1 0.484848 0.888889 0.454545 0.888889 0.424242 0.888889 0.439394 0.944444 0.439394 0.944444 0.5 0.833333 0.469697 0.833333 0.439394 0.833333 0.409091 0.833333 0.424242 0.888889 0.424242 0.888889 0.515152 0.777778 0.484848 0.777778 0.454545 0.777778 0.424242 0.777778 0.393939 0.777778 0.409091 0.833333 0.409091 0.833333 0.530303 0.722222 0.5 0.722222 0.469697 0.722222 0.439394 0.722222 0.409091 0.722222 0.378788 0.722222 0.393939 0.777778 0.393939 0.777778 0.545455 0.666667 0.515152 0.666667 0.484848 0.666667 0.454545 0.666667 0.424242 0.666667 0.393939 0.666667 0.378788 0.722222 0.378788 0.722222 0.651515 0.944444 0.621212 0.944444 0.636364 1 0.666667 0.888889 0.636364 0.888889 0.606061 0.888889 0.621212 0.944444 0.621212 0.944444 0.681818 0.833333 0.651515 0.833333 0.621212 0.833333 0.590909 0.833333 0.606061 0.888889 0.606061 0.888889 0.69697 0.777778 0.666667 0.777778 0.636364 0.777778 0.606061 0.777778 0.575758 0.777778 0.590909 0.833333 0.590909 0.833333 0.712121 0.722222 0.681818 0.722222 0.651515 0.722222 0.621212 0.722222 0.590909 0.722222 0.560606 0.722222 0.575758 0.777778 0.575758 0.777778 0.727273 0.666667 0.69697 0.666667 0.666667 0.666667 0.636364 0.666667 0.606061 0.666667 0.575758 0.666667 0.560606 0.722222 0.560606 0.722222 0.833333 0.944444 0.80303 0.944444 0.818182 1 0.848485 0.888889 0.818182 0.888889 0.833333 0.944444 0.787879 0.888889 0.80303 0.944444 0.80303 0.944444 0.833333 0.944444 0.863636 0.833333 0.833333 0.833333 0.848485 0.888889 0.80303 0.833333 0.772727 0.833333 0.787879 0.888889 0.848485 0.888889 0.787879 0.888889 0.878788 0.777778 0.848485 0.777778 0.863636 0.833333 0.818182 0.777778 0.787879 0.777778 0.757576 0.777778 0.772727 0.833333 0.863636 0.833333 0.772727 0.833333 0.893939 0.722222 0.863636 0.722222 0.878788 0.777778 0.833333 0.722222 0.80303 0.722222 0.772727 0.722222 0.742424 0.722222 0.757576 0.777778 0.878788 0.777778 0.757576 0.777778 0.909091 0.666667 0.878788 0.666667 0.893939 0.722222 0.848485 0.666667 0.818182 0.666667 0.787879 0.666667 0.757576 0.666667 0.742424 0.722222 0.893939 0.722222 0.742424 0.722222 0.166667 0.055555 0.19697 0.055555 0.181818 0 0.151515 0.111111 0.181818 0.111111 0.212121 0.111111 0.136364 0.166667 0.166667 0.166667 0.19697 0.166667 0.227273 0.166667 0.121212 0.222222 0.151515 0.222222 0.181818 0.222222 0.212121 0.222222 0.242424 0.222222 0.106061 0.277778 0.136364 0.277778 0.166667 0.277778 0.19697 0.277778 0.227273 0.277778 0.257576 0.277778 0.090909 0.333333 0.121212 0.333333 0.151515 0.333333 0.181818 0.333333 0.212121 0.333333 0.242424 0.333333 0.272727 0.333333 0.348485 0.055555 0.378788 0.055555 0.363636 0 0.333333 0.111111 0.363636 0.111111 0.348485 0.055555 0.393939 0.111111 0.348485 0.055555 0.318182 0.166667 0.348485 0.166667 0.333333 0.111111 0.378788 0.166667 0.409091 0.166667 0.333333 0.111111 0.30303 0.222222 0.333333 0.222222 0.318182 0.166667 0.363636 0.222222 0.393939 0.222222 0.424242 0.222222 0.318182 0.166667 0.287879 0.277778 0.318182 0.277778 0.30303 0.222222 0.348485 0.277778 0.378788 0.277778 0.409091 0.277778 0.439394 0.277778 0.30303 0.222222 0.30303 0.333333 0.287879 0.277778 0.333333 0.333333 0.363636 0.333333 0.393939 0.333333 0.424242 0.333333 0.454545 0.333333 0.287879 0.277778 0.530303 0.055555 0.560606 0.055555 0.545455 0 0.515152 0.111111 0.545455 0.111111 0.530303 0.055555 0.575758 0.111111 0.530303 0.055555 0.5 0.166667 0.530303 0.166667 0.515152 0.111111 0.560606 0.166667 0.590909 0.166667 0.515152 0.111111 0.484848 0.222222 0.515152 0.222222 0.5 0.166667 0.545455 0.222222 0.575758 0.222222 0.606061 0.222222 0.5 0.166667 0.469697 0.277778 0.5 0.277778 0.484848 0.222222 0.530303 0.277778 0.560606 0.277778 0.590909 0.277778 0.621212 0.277778 0.484848 0.222222 0.484848 0.333333 0.469697 0.277778 0.515152 0.333333 0.545455 0.333333 0.575758 0.333333 0.606061 0.333333 0.636364 0.333333 0.469697 0.277778 0.712121 0.055555 0.742424 0.055555 0.727273 0 0.69697 0.111111 0.727273 0.111111 0.712121 0.055555 0.757576 0.111111 0.712121 0.055555 0.681818 0.166667 0.712121 0.166667 0.69697 0.111111 0.742424 0.166667 0.772727 0.166667 0.69697 0.111111 0.666667 0.222222 0.69697 0.222222 0.681818 0.166667 0.727273 0.222222 0.757576 0.222222 0.787879 0.222222 0.681818 0.166667 0.651515 0.277778 0.681818 0.277778 0.666667 0.222222 0.712121 0.277778 0.742424 0.277778 0.772727 0.277778 0.80303 0.277778 0.666667 0.222222 0.666667 0.333333 0.651515 0.277778 0.69697 0.333333 0.727273 0.333333 0.757576 0.333333 0.787879 0.333333 0.818182 0.333333 0.651515 0.277778 0.893939 0.055555 0.924242 0.055555 0.909091 0 0.878788 0.111111 0.909091 0.111111 0.893939 0.055555 0.939394 0.111111 0.924242 0.055555 0.924242 0.055555 0.893939 0.055555 0.863636 0.166667 0.893939 0.166667 0.878788 0.111111 0.924242 0.166667 0.954545 0.166667 0.939394 0.111111 0.878788 0.111111 0.939394 0.111111 0.848485 0.222222 0.878788 0.222222 0.863636 0.166667 0.909091 0.222222 0.939394 0.222222 0.969697 0.222222 0.954545 0.166667 0.863636 0.166667 0.954545 0.166667 0.833333 0.277778 0.863636 0.277778 0.848485 0.222222 0.893939 0.277778 0.924242 0.277778 0.954545 0.277778 0.984848 0.277778 0.969697 0.222222 0.848485 0.222222 0.969697 0.222222 0.848485 0.333333 0.833333 0.277778 0.878788 0.333333 0.909091 0.333333 0.939394 0.333333 0.969697 0.333333 1 0.333333 0.984848 0.277778 0.833333 0.277778 0.984848 0.277778 0.015151 0.611111 0.045454 0.611111 0.030303 0.555556 0.075757 0.611111 0.060606 0.555556 0.045454 0.5 0.106061 0.611111 0.090909 0.555556 0.075757 0.5 0.060606 0.444444 0.136364 0.611111 0.121212 0.555556 0.106061 0.5 0.090909 0.444444 0.075757 0.388889 0.166667 0.611111 0.151515 0.555556 0.136364 0.5 0.121212 0.444444 0.106061 0.388889 0.19697 0.611111 0.227273 0.611111 0.212121 0.555556 0.257576 0.611111 0.242424 0.555556 0.227273 0.5 0.287879 0.611111 0.272727 0.555556 0.257576 0.5 0.242424 0.444444 0.318182 0.611111 0.30303 0.555556 0.287879 0.5 0.272727 0.444444 0.257576 0.388889 0.348485 0.611111 0.333333 0.555556 0.318182 0.5 0.30303 0.444444 0.287879 0.388889 0.378788 0.611111 0.409091 0.611111 0.393939 0.555556 0.439394 0.611111 0.424242 0.555556 0.409091 0.5 0.469697 0.611111 0.454545 0.555556 0.439394 0.5 0.424242 0.444444 0.5 0.611111 0.484848 0.555556 0.469697 0.5 0.454545 0.444444 0.439394 0.388889 0.530303 0.611111 0.515152 0.555556 0.5 0.5 0.484848 0.444444 0.469697 0.388889 0.560606 0.611111 0.590909 0.611111 0.575758 0.555556 0.621212 0.611111 0.606061 0.555556 0.590909 0.5 0.651515 0.611111 0.636364 0.555556 0.621212 0.5 0.606061 0.444444 0.681818 0.611111 0.666667 0.555556 0.651515 0.5 0.636364 0.444444 0.621212 0.388889 0.712121 0.611111 0.69697 0.555556 0.681818 0.5 0.666667 0.444444 0.651515 0.388889 0.742424 0.611111 0.772727 0.611111 0.757576 0.555556 0.80303 0.611111 0.787879 0.555556 0.772727 0.5 0.833333 0.611111 0.818182 0.555556 0.80303 0.5 0.787879 0.444444 0.863636 0.611111 0.848485 0.555556 0.833333 0.5 0.818182 0.444444 0.80303 0.388889 0.909091 0.666667 0.893939 0.611111 0.878788 0.555556 0.863636 0.5 0.848485 0.444444 0.833333 0.388889 0.227273 0.388889 0.19697 0.388889 0.212121 0.444444 0.166667 0.388889 0.181818 0.444444 0.19697 0.5 0.136364 0.388889 0.151515 0.444444 0.166667 0.5 0.181818 0.555556 0.409091 0.388889 0.378788 0.388889 0.393939 0.444444 0.348485 0.388889 0.363636 0.444444 0.378788 0.5 0.318182 0.388889 0.333333 0.444444 0.348485 0.5 0.363636 0.555556 0.590909 0.388889 0.560606 0.388889 0.575758 0.444444 0.530303 0.388889 0.545455 0.444444 0.560606 0.5 0.5 0.388889 0.515152 0.444444 0.530303 0.5 0.545455 0.555556 0.772727 0.388889 0.742424 0.388889 0.757576 0.444444 0.712121 0.388889 0.727273 0.444444 0.742424 0.5 0.681818 0.388889 0.69697 0.444444 0.712121 0.5 0.727273 0.555556 0.984848 0.388889 1 0.333333 0.954545 0.388889 0.969697 0.444444 0.984848 0.388889 0.984848 0.388889 0.924242 0.388889 0.939394 0.444444 0.954545 0.5 0.969697 0.444444 0.969697 0.444444 0.893939 0.388889 0.909091 0.444444 0.924242 0.5 0.939394 0.555556 0.954545 0.5 0.954545 0.5 0.863636 0.388889 0.878788 0.444444 0.893939 0.5 0.909091 0.555556 0.924242 0.611111 0.939394 0.555556 0.939394 0.555556 0.909091 0.666667 0.924242 0.611111 0.924242 0.611111</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="540" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="720">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>1 0 2 1 0 2 3 3 4 4 1 0 4 4 5 5 2 1 2 1 1 0 4 4 6 6 7 7 3 3 7 7 8 8 4 4 8 8 9 9 5 5 4 4 3 3 7 7 5 5 4 4 8 8 10 10 11 11 6 6 11 11 12 12 7 7 12 12 13 13 8 8 13 13 14 14 9 9 7 7 6 6 11 11 8 8 7 7 12 12 9 9 8 8 13 13 15 15 16 16 10 10 16 16 17 17 11 11 17 17 18 18 12 12 18 18 19 19 13 13 19 19 20 20 14 14 11 11 10 10 16 16 12 12 11 11 17 17 13 13 12 12 18 18 14 14 13 13 19 19 21 21 22 22 15 15 22 22 23 23 16 16 23 23 24 24 17 17 24 24 25 25 18 18 25 25 26 26 19 19 26 26 27 27 20 20 16 16 15 15 22 22 17 17 16 16 23 23 18 18 17 17 24 24 19 19 18 18 25 25 20 20 19 19 26 26 28 28 1 29 0 30 29 31 30 32 28 28 30 32 3 33 1 34 1 35 28 28 30 32 31 36 32 37 29 31 32 37 33 38 30 32 33 38 6 39 3 40 30 32 29 31 32 37 3 41 30 32 33 38 34 42 35 43 31 36 35 43 36 44 32 37 36 44 37 45 33 38 37 45 10 46 6 47 32 37 31 36 35 43 33 38 32 37 36 44 6 48 33 38 37 45 38 49 39 50 34 42 39 50 40 51 35 43 40 51 41 52 36 44 41 52 42 53 37 45 42 53 15 54 10 55 35 43 34 42 39 50 36 44 35 43 40 51 37 45 36 44 41 52 10 56 37 45 42 53 43 57 44 58 38 49 44 58 45 59 39 50 45 59 46 60 40 51 46 60 47 61 41 52 47 61 48 62 42 53 48 62 21 21 15 63 39 50 38 49 44 58 40 51 39 50 45 59 41 52 40 51 46 60 42 53 41 52 47 61 15 64 42 53 48 62 49 65 28 66 0 67 50 68 51 69 49 65 51 69 29 70 28 71 28 72 49 65 51 69 52 73 53 74 50 68 53 74 54 75 51 69 54 75 31 76 29 77 51 69 50 68 53 74 29 78 51 69 54 75 55 79 56 80 52 73 56 80 57 81 53 74 57 81 58 82 54 75 58 82 34 83 31 84 53 74 52 73 56 80 54 75 53 74 57 81 31 85 54 75 58 82 59 86 60 87 55 79 60 87 61 88 56 80 61 88 62 89 57 81 62 89 63 90 58 82 63 90 38 91 34 92 56 80 55 79 60 87 57 81 56 80 61 88 58 82 57 81 62 89 34 93 58 82 63 90 64 94 65 95 59 86 65 95 66 96 60 87 66 96 67 97 61 88 67 97 68 98 62 89 68 98 69 99 63 90 69 99 43 57 38 100 60 87 59 86 65 95 61 88 60 87 66 96 62 89 61 88 67 97 63 90 62 89 68 98 38 101 63 90 69 99 70 102 49 103 0 104 71 105 72 106 70 102 72 106 50 107 49 108 49 109 70 102 72 106 73 110 74 111 71 105 74 111 75 112 72 106 75 112 52 113 50 114 72 106 71 105 74 111 50 115 72 106 75 112 76 116 77 117 73 110 77 117 78 118 74 111 78 118 79 119 75 112 79 119 55 120 52 121 74 111 73 110 77 117 75 112 74 111 78 118 52 122 75 112 79 119 80 123 81 124 76 116 81 124 82 125 77 117 82 125 83 126 78 118 83 126 84 127 79 119 84 127 59 128 55 129 77 117 76 116 81 124 78 118 77 117 82 125 79 119 78 118 83 126 55 130 79 119 84 127 85 131 86 132 80 123 86 132 87 133 81 124 87 133 88 134 82 125 88 134 89 135 83 126 89 135 90 136 84 127 90 136 64 94 59 137 81 124 80 123 86 132 82 125 81 124 87 133 83 126 82 125 88 134 84 127 83 126 89 135 59 138 84 127 90 136 2 139 70 140 0 141 5 142 91 143 2 144 91 143 71 145 70 146 70 147 2 148 91 143 9 149 92 150 5 151 92 150 93 152 91 143 93 152 73 153 71 154 91 143 5 155 92 150 71 156 91 143 93 152 14 157 94 158 9 159 94 158 95 160 92 150 95 160 96 161 93 152 96 161 76 162 73 163 92 150 9 164 94 158 93 152 92 150 95 160 73 165 93 152 96 161 20 166 97 167 14 168 97 167 98 169 94 158 98 169 99 170 95 160 99 170 100 171 96 161 100 171 80 172 76 173 94 158 14 174 97 167 95 160 94 158 98 169 96 161 95 160 99 170 76 175 96 161 100 171 27 176 101 177 20 178 101 177 102 179 97 167 102 179 103 180 98 169 103 180 104 181 99 170 104 181 105 182 100 171 105 182 85 131 80 183 97 167 20 184 101 177 98 169 97 167 102 179 99 170 98 169 103 180 100 171 99 170 104 181 80 185 100 171 105 182 107 186 108 187 106 188 109 189 110 190 107 186 110 190 111 191 108 187 108 187 107 186 110 190 112 192 113 193 109 189 113 193 114 194 110 190 114 194 115 195 111 191 110 190 109 189 113 193 111 191 110 190 114 194 116 196 117 197 112 192 117 197 118 198 113 193 118 198 119 199 114 194 119 199 120 200 115 195 113 193 112 192 117 197 114 194 113 193 118 198 115 195 114 194 119 199 121 201 122 202 116 196 122 202 123 203 117 197 123 203 124 204 118 198 124 204 125 205 119 199 125 205 126 206 120 200 117 197 116 196 122 202 118 198 117 197 123 203 119 199 118 198 124 204 120 200 119 199 125 205 127 207 128 208 121 201 128 208 129 209 122 202 129 209 130 210 123 203 130 210 131 211 124 204 131 211 132 212 125 205 132 212 133 213 126 206 122 202 121 201 128 208 123 203 122 202 129 209 124 204 123 203 130 210 125 205 124 204 131 211 126 206 125 205 132 212 108 214 134 215 106 216 111 217 135 218 108 219 135 218 136 220 134 215 134 215 108 221 135 218 115 222 137 223 111 224 137 223 138 225 135 218 138 225 139 226 136 220 135 218 111 227 137 223 136 220 135 218 138 225 120 228 140 229 115 230 140 229 141 231 137 223 141 231 142 232 138 225 142 232 143 233 139 226 137 223 115 234 140 229 138 225 137 223 141 231 139 226 138 225 142 232 126 235 144 236 120 237 144 236 145 238 140 229 145 238 146 239 141 231 146 239 147 240 142 232 147 240 148 241 143 233 140 229 120 242 144 236 141 231 140 229 145 238 142 232 141 231 146 239 143 233 142 232 147 240 133 213 149 243 126 244 149 243 150 245 144 236 150 245 151 246 145 238 151 246 152 247 146 239 152 247 153 248 147 240 153 248 154 249 148 241 144 236 126 250 149 243 145 238 144 236 150 245 146 239 145 238 151 246 147 240 146 239 152 247 148 241 147 240 153 248 134 251 155 252 106 253 136 254 156 255 134 256 156 255 157 257 155 252 155 252 134 258 156 255 139 259 158 260 136 261 158 260 159 262 156 255 159 262 160 263 157 257 156 255 136 264 158 260 157 257 156 255 159 262 143 265 161 266 139 267 161 266 162 268 158 260 162 268 163 269 159 262 163 269 164 270 160 263 158 260 139 271 161 266 159 262 158 260 162 268 160 263 159 262 163 269 148 272 165 273 143 274 165 273 166 275 161 266 166 275 167 276 162 268 167 276 168 277 163 269 168 277 169 278 164 270 161 266 143 279 165 273 162 268 161 266 166 275 163 269 162 268 167 276 164 270 163 269 168 277 154 249 170 280 148 281 170 280 171 282 165 273 171 282 172 283 166 275 172 283 173 284 167 276 173 284 174 285 168 277 174 285 175 286 169 278 165 273 148 287 170 280 166 275 165 273 171 282 167 276 166 275 172 283 168 277 167 276 173 284 169 278 168 277 174 285 155 288 176 289 106 290 157 291 177 292 155 293 177 292 178 294 176 289 176 289 155 295 177 292 160 296 179 297 157 298 179 297 180 299 177 292 180 299 181 300 178 294 177 292 157 301 179 297 178 294 177 292 180 299 164 302 182 303 160 304 182 303 183 305 179 297 183 305 184 306 180 299 184 306 185 307 181 300 179 297 160 308 182 303 180 299 179 297 183 305 181 300 180 299 184 306 169 309 186 310 164 311 186 310 187 312 182 303 187 312 188 313 183 305 188 313 189 314 184 306 189 314 190 315 185 307 182 303 164 316 186 310 183 305 182 303 187 312 184 306 183 305 188 313 185 307 184 306 189 314 175 286 191 317 169 318 191 317 192 319 186 310 192 319 193 320 187 312 193 320 194 321 188 313 194 321 195 322 189 314 195 322 196 323 190 315 186 310 169 324 191 317 187 312 186 310 192 319 188 313 187 312 193 320 189 314 188 313 194 321 190 315 189 314 195 322 176 325 107 326 106 327 178 328 197 329 176 330 197 329 109 331 107 332 107 333 176 334 197 329 181 335 198 336 178 337 198 336 199 338 197 329 199 338 112 339 109 340 197 329 178 341 198 336 109 342 197 329 199 338 185 343 200 344 181 345 200 344 201 346 198 336 201 346 202 347 199 338 202 347 116 348 112 349 198 336 181 350 200 344 199 338 198 336 201 346 112 351 199 338 202 347 190 352 203 353 185 354 203 353 204 355 200 344 204 355 205 356 201 346 205 356 206 357 202 347 206 357 121 358 116 359 200 344 185 360 203 353 201 346 200 344 204 355 202 347 201 346 205 356 116 361 202 347 206 357 196 323 207 362 190 363 207 362 208 364 203 353 208 364 209 365 204 355 209 365 210 366 205 356 210 366 211 367 206 357 211 367 127 368 121 369 203 353 190 370 207 362 204 355 203 353 208 364 205 356 204 355 209 365 206 357 205 356 210 366 121 371 206 357 211 367 26 26 212 372 27 27 25 25 213 373 26 26 213 373 214 374 212 372 212 372 26 26 213 373 24 24 215 375 25 25 215 375 216 376 213 373 216 376 217 377 214 374 213 373 25 25 215 375 214 374 213 373 216 376 23 23 218 378 24 24 218 378 219 379 215 375 219 379 220 380 216 376 220 380 221 381 217 377 215 375 24 24 218 378 216 376 215 375 219 379 217 377 216 376 220 380 22 22 222 382 23 23 222 382 223 383 218 378 223 383 224 384 219 379 224 384 225 385 220 380 225 385 226 386 221 381 218 378 23 23 222 382 219 379 218 378 223 383 220 380 219 379 224 384 221 381 220 380 225 385 21 21 227 387 22 22 227 387 228 388 222 382 228 388 229 389 223 383 229 389 230 390 224 384 230 390 231 391 225 385 231 391 127 207 226 386 222 382 22 22 227 387 223 383 222 382 228 388 224 384 223 383 229 389 225 385 224 384 230 390 226 386 225 385 231 391 48 62 232 392 21 21 47 61 233 393 48 62 233 393 234 394 232 392 232 392 48 62 233 393 46 60 235 395 47 61 235 395 236 396 233 393 236 396 237 397 234 394 233 393 47 61 235 395 234 394 233 393 236 396 45 59 238 398 46 60 238 398 239 399 235 395 239 399 240 400 236 396 240 400 241 401 237 397 235 395 46 60 238 398 236 396 235 395 239 399 237 397 236 396 240 400 44 58 242 402 45 59 242 402 243 403 238 398 243 403 244 404 239 399 244 404 245 405 240 400 245 405 246 406 241 401 238 398 45 59 242 402 239 399 238 398 243 403 240 400 239 399 244 404 241 401 240 400 245 405 43 57 247 407 44 58 247 407 248 408 242 402 248 408 249 409 243 403 249 409 250 410 244 404 250 410 251 411 245 405 251 411 133 213 246 406 242 402 44 58 247 407 243 403 242 402 248 408 244 404 243 403 249 409 245 405 244 404 250 410 246 406 245 405 251 411 69 99 252 412 43 57 68 98 253 413 69 99 253 413 254 414 252 412 252 412 69 99 253 413 67 97 255 415 68 98 255 415 256 416 253 413 256 416 257 417 254 414 253 413 68 98 255 415 254 414 253 413 256 416 66 96 258 418 67 97 258 418 259 419 255 415 259 419 260 420 256 416 260 420 261 421 257 417 255 415 67 97 258 418 256 416 255 415 259 419 257 417 256 416 260 420 65 95 262 422 66 96 262 422 263 423 258 418 263 423 264 424 259 419 264 424 265 425 260 420 265 425 266 426 261 421 258 418 66 96 262 422 259 419 258 418 263 423 260 420 259 419 264 424 261 421 260 420 265 425 64 94 267 427 65 95 267 427 268 428 262 422 268 428 269 429 263 423 269 429 270 430 264 424 270 430 271 431 265 425 271 431 154 249 266 426 262 422 65 95 267 427 263 423 262 422 268 428 264 424 263 423 269 429 265 425 264 424 270 430 266 426 265 425 271 431 90 136 272 432 64 94 89 135 273 433 90 136 273 433 274 434 272 432 272 432 90 136 273 433 88 134 275 435 89 135 275 435 276 436 273 433 276 436 277 437 274 434 273 433 89 135 275 435 274 434 273 433 276 436 87 133 278 438 88 134 278 438 279 439 275 435 279 439 280 440 276 436 280 440 281 441 277 437 275 435 88 134 278 438 276 436 275 435 279 439 277 437 276 436 280 440 86 132 282 442 87 133 282 442 283 443 278 438 283 443 284 444 279 439 284 444 285 445 280 440 285 445 286 446 281 441 278 438 87 133 282 442 279 439 278 438 283 443 280 440 279 439 284 444 281 441 280 440 285 445 85 131 287 447 86 132 287 447 288 448 282 442 288 448 289 449 283 443 289 449 290 450 284 444 290 450 291 451 285 445 291 451 175 286 286 446 282 442 86 132 287 447 283 443 282 442 288 448 284 444 283 443 289 449 285 445 284 444 290 450 286 446 285 445 291 451 105 182 292 452 85 131 104 181 293 453 105 182 293 453 294 454 292 452 292 452 105 182 293 453 103 180 295 455 104 181 295 455 296 456 293 453 296 456 297 457 294 454 293 453 104 181 295 455 294 454 293 453 296 456 102 179 298 458 103 180 298 458 299 459 295 455 299 459 300 460 296 456 300 460 301 461 297 457 295 455 103 180 298 458 296 456 295 455 299 459 297 457 296 456 300 460 101 177 302 462 102 179 302 462 303 463 298 458 303 463 304 464 299 459 304 464 305 465 300 460 305 465 306 466 301 461 298 458 102 179 302 462 299 459 298 458 303 463 300 460 299 459 304 464 301 461 300 460 305 465 27 467 307 468 101 177 307 468 308 469 302 462 308 469 309 470 303 463 309 470 310 471 304 464 310 471 311 472 305 465 311 472 196 323 306 466 302 462 101 177 307 468 303 463 302 462 308 469 304 464 303 463 309 470 305 465 304 464 310 471 306 466 305 465 311 472 132 212 246 406 133 213 131 211 312 473 132 212 312 473 241 401 246 406 246 406 132 212 312 473 130 210 313 474 131 211 313 474 314 475 312 473 314 475 237 397 241 401 312 473 131 211 313 474 241 401 312 473 314 475 129 209 315 476 130 210 315 476 316 477 313 474 316 477 317 478 314 475 317 478 234 394 237 397 313 474 130 210 315 476 314 475 313 474 316 477 237 397 314 475 317 478 128 208 318 479 129 209 318 479 319 480 315 476 319 480 320 481 316 477 320 481 321 482 317 478 321 482 232 392 234 394 315 476 129 209 318 479 316 477 315 476 319 480 317 478 316 477 320 481 234 394 317 478 321 482 127 207 231 391 128 208 231 391 230 390 318 479 230 390 229 389 319 480 229 389 228 388 320 481 228 388 227 387 321 482 227 387 21 21 232 392 318 479 128 208 231 391 319 480 318 479 230 390 320 481 319 480 229 389 321 482 320 481 228 388 232 392 321 482 227 387 153 248 266 426 154 249 152 247 322 483 153 248 322 483 261 421 266 426 266 426 153 248 322 483 151 246 323 484 152 247 323 484 324 485 322 483 324 485 257 417 261 421 322 483 152 247 323 484 261 421 322 483 324 485 150 245 325 486 151 246 325 486 326 487 323 484 326 487 327 488 324 485 327 488 254 414 257 417 323 484 151 246 325 486 324 485 323 484 326 487 257 417 324 485 327 488 149 243 328 489 150 245 328 489 329 490 325 486 329 490 330 491 326 487 330 491 331 492 327 488 331 492 252 412 254 414 325 486 150 245 328 489 326 487 325 486 329 490 327 488 326 487 330 491 254 414 327 488 331 492 133 213 251 411 149 243 251 411 250 410 328 489 250 410 249 409 329 490 249 409 248 408 330 491 248 408 247 407 331 492 247 407 43 57 252 412 328 489 149 243 251 411 329 490 328 489 250 410 330 491 329 490 249 409 331 492 330 491 248 408 252 412 331 492 247 407 174 285 286 446 175 286 173 284 332 493 174 285 332 493 281 441 286 446 286 446 174 285 332 493 172 283 333 494 173 284 333 494 334 495 332 493 334 495 277 437 281 441 332 493 173 284 333 494 281 441 332 493 334 495 171 282 335 496 172 283 335 496 336 497 333 494 336 497 337 498 334 495 337 498 274 434 277 437 333 494 172 283 335 496 334 495 333 494 336 497 277 437 334 495 337 498 170 280 338 499 171 282 338 499 339 500 335 496 339 500 340 501 336 497 340 501 341 502 337 498 341 502 272 432 274 434 335 496 171 282 338 499 336 497 335 496 339 500 337 498 336 497 340 501 274 434 337 498 341 502 154 249 271 431 170 280 271 431 270 430 338 499 270 430 269 429 339 500 269 429 268 428 340 501 268 428 267 427 341 502 267 427 64 94 272 432 338 499 170 280 271 431 339 500 338 499 270 430 340 501 339 500 269 429 341 502 340 501 268 428 272 432 341 502 267 427 195 322 306 466 196 323 194 321 342 503 195 322 342 503 301 461 306 466 306 466 195 322 342 503 193 320 343 504 194 321 343 504 344 505 342 503 344 505 297 457 301 461 342 503 194 321 343 504 301 461 342 503 344 505 192 319 345 506 193 320 345 506 346 507 343 504 346 507 347 508 344 505 347 508 294 454 297 457 343 504 193 320 345 506 344 505 343 504 346 507 297 457 344 505 347 508 191 317 348 509 192 319 348 509 349 510 345 506 349 510 350 511 346 507 350 511 351 512 347 508 351 512 292 452 294 454 345 506 192 319 348 509 346 507 345 506 349 510 347 508 346 507 350 511 294 454 347 508 351 512 175 286 291 451 191 317 291 451 290 450 348 509 290 450 289 449 349 510 289 449 288 448 350 511 288 448 287 447 351 512 287 447 85 131 292 452 348 509 191 317 291 451 349 510 348 509 290 450 350 511 349 510 289 449 351 512 350 511 288 448 292 452 351 512 287 447 211 367 226 513 127 514 210 366 352 515 211 367 352 515 221 516 226 517 226 518 211 367 352 515 209 365 353 519 210 366 353 519 354 520 352 515 354 520 217 521 221 522 352 515 210 366 353 519 221 523 352 515 354 520 208 364 355 524 209 365 355 524 356 525 353 519 356 525 357 526 354 520 357 526 214 527 217 528 353 519 209 365 355 524 354 520 353 519 356 525 217 529 354 520 357 526 207 362 358 530 208 364 358 530 359 531 355 524 359 531 360 532 356 525 360 532 361 533 357 526 361 533 212 534 214 535 355 524 208 364 358 530 356 525 355 524 359 531 357 526 356 525 360 532 214 536 357 526 361 533 196 323 311 472 207 362 311 472 310 471 358 530 310 471 309 470 359 531 309 470 308 469 360 532 308 469 307 468 361 533 307 468 27 537 212 538 358 530 207 362 311 472 359 531 358 530 310 471 360 532 359 531 309 470 361 533 360 532 308 469 212 539 361 533 307 468</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Sphere-high-inverted">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-high.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-high.dae
new file mode 100644
index 0000000..44a68b6
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-high.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/spheres/Sphere-high.mb</source_data>
+ </contributor>
+ <created>2008-09-19T22:04:03Z</created>
+ <modified>2008-09-19T22:04:03Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="1086">0 50 0 8.72494 49.1512 2.8349 0 49.1512 9.17395 17.1537 46.6335 5.57358 8.84255 47.6832 12.1707 0 46.6335 18.0365 25 42.5325 8.12299 17.2996 44.4764 14.919 8.84298 44.4764 21.0631 0 42.5325 26.2866 31.9975 36.9875 10.3966 26.1426 38.7299 17.7923 17.8411 39.7327 24.5562 8.84298 38.7299 30.3612 0 36.9875 33.6441 37.9086 30.1865 12.3172 32.6527 32.2104 19.9071 26.1426 33.2344 26.6841 17.2996 33.2344 33.1089 8.84255 32.2104 37.2062 0 30.1865 39.8594 42.5325 22.3607 13.8197 37.9086 24.5167 21.4912 31.9975 25.8403 28.4331 25 26.2866 34.4095 17.1537 25.8403 39.2177 8.72494 24.5167 42.6943 0 22.3607 44.7214 5.39231 49.1512 -7.42188 10.6016 46.6335 -14.5918 14.3075 47.6832 -4.6488 15.4509 42.5325 -21.2663 19.5347 44.4764 -11.8426 22.7648 44.4764 -1.90132 19.7755 36.9875 -27.2187 25 38.7299 -19.3649 28.8675 39.7327 -9.37962 31.6078 38.7299 0.971941 23.4288 30.1865 -32.247 29.023 32.2104 -24.9029 33.4566 33.2344 -16.6172 36.8343 33.2344 -6.22166 38.1177 32.2104 3.08758 26.2866 22.3607 -36.1803 32.1537 24.5167 -29.4121 36.9292 25.8403 -21.6451 40.4509 26.2866 -13.1433 42.599 25.8403 -4.19521 43.3009 24.5167 4.89537 -5.39231 49.1512 -7.42188 -10.6016 46.6335 -14.5918 0 47.6832 -15.0438 -15.4509 42.5325 -21.2663 -5.22646 44.4764 -22.2382 5.22646 44.4764 -22.2382 -19.7755 36.9875 -27.2187 -10.6917 38.7299 -29.7605 0 39.7327 -30.3531 10.6917 38.7299 -29.7605 -23.4288 30.1865 -32.247 -14.7155 32.2104 -35.298 -5.46526 33.2344 -36.9541 5.46526 33.2344 -36.9541 14.7155 32.2104 -35.298 -26.2866 22.3607 -36.1803 -18.0365 24.5167 -39.6688 -9.17395 25.8403 -41.8105 0 26.2866 -42.5325 9.17395 25.8403 -41.8105 18.0365 24.5167 -39.6688 -8.72494 49.1512 2.8349 -17.1537 46.6335 5.57358 -14.3075 47.6832 -4.6488 -25 42.5325 8.12299 -22.7648 44.4764 -1.90132 -19.5347 44.4764 -11.8426 -31.9975 36.9875 10.3966 -31.6078 38.7299 0.971941 -28.8675 39.7327 -9.37962 -25 38.7299 -19.3649 -37.9086 30.1865 12.3172 -38.1177 32.2104 3.08758 -36.8343 33.2344 -6.22166 -33.4566 33.2344 -16.6172 -29.023 32.2104 -24.9029 -42.5325 22.3607 13.8197 -43.3009 24.5167 4.89537 -42.599 25.8403 -4.19521 -40.4509 26.2866 -13.1433 -36.9292 25.8403 -21.6451 -32.1537 24.5167 -29.4121 -8.84255 47.6832 12.1707 -8.84298 44.4764 21.0631 -17.2996 44.4764 14.919 -8.84298 38.7299 30.3612 -17.8411 39.7327 24.5562 -26.1426 38.7299 17.7923 -8.84255 32.2104 37.2062 -17.2996 33.2344 33.1089 -26.1426 33.2344 26.6841 -32.6527 32.2104 19.9071 -8.72494 24.5167 42.6943 -17.1537 25.8403 39.2177 -25 26.2866 34.4095 -31.9975 25.8403 28.4331 -37.9086 24.5167 21.4912 0 -50 0 5.39231 -49.1512 7.42188 8.72494 -49.1512 -2.8349 10.6016 -46.6335 14.5918 14.3075 -47.6832 4.6488 17.1537 -46.6335 -5.57358 15.4509 -42.5325 21.2663 19.5347 -44.4764 11.8426 22.7648 -44.4764 1.90132 25 -42.5325 -8.12299 19.7755 -36.9875 27.2187 25 -38.7299 19.3649 28.8675 -39.7327 9.37962 31.6078 -38.7299 -0.971941 31.9975 -36.9875 -10.3966 23.4288 -30.1865 32.247 29.023 -32.2104 24.9029 33.4566 -33.2344 16.6172 36.8343 -33.2344 6.22166 38.1177 -32.2104 -3.08758 37.9086 -30.1865 -12.3172 26.2866 -22.3607 36.1803 32.1537 -24.5167 29.4121 36.9292 -25.8403 21.6451 40.4509 -26.2866 13.1433 42.599 -25.8403 4.19521 43.3009 -24.5167 -4.89537 42.5325 -22.3607 -13.8197 0 -49.1512 -9.17395 8.84255 -47.6832 -12.1707 0 -46.6335 -18.0365 17.2996 -44.4764 -14.919 8.84298 -44.4764 -21.0631 0 -42.5325 -26.2866 26.1426 -38.7299 -17.7923 17.8411 -39.7327 -24.5562 8.84298 -38.7299 -30.3612 0 -36.9875 -33.6441 32.6527 -32.2104 -19.9071 26.1426 -33.2344 -26.6841 17.2996 -33.2344 -33.1089 8.84255 -32.2104 -37.2062 0 -30.1865 -39.8594 37.9086 -24.5167 -21.4912 31.9975 -25.8403 -28.4331 25 -26.2866 -34.4095 17.1537 -25.8403 -39.2177 8.72494 -24.5167 -42.6943 0 -22.3607 -44.7214 -8.72494 -49.1512 -2.8349 -8.84255 -47.6832 -12.1707 -17.1537 -46.6335 -5.57358 -8.84298 -44.4764 -21.0631 -17.2996 -44.4764 -14.919 -25 -42.5325 -8.12299 -8.84298 -38.7299 -30.3612 -17.8411 -39.7327 -24.5562 -26.1426 -38.7299 -17.7923 -31.9975 -36.9875 -10.3966 -8.84255 -32.2104 -37.2062 -17.2996 -33.2344 -33.1089 -26.1426 -33.2344 -26.6841 -32.6527 -32.2104 -19.9071 -37.9086 -30.1865 -12.3172 -8.72494 -24.5167 -42.6943 -17.1537 -25.8403 -39.2177 -25 -26.2866 -34.4095 -31.9975 -25.8403 -28.4331 -37.9086 -24.5167 -21.4912 -42.5325 -22.3607 -13.8197 -5.39231 -49.1512 7.42188 -14.3075 -47.6832 4.6488 -10.6016 -46.6335 14.5918 -22.7648 -44.4764 1.90132 -19.5347 -44.4764 11.8426 -15.4509 -42.5325 21.2663 -31.6078 -38.7299 -0.971941 -28.8675 -39.7327 9.37962 -25 -38.7299 19.3649 -19.7755 -36.9875 27.2187 -38.1177 -32.2104 -3.08758 -36.8343 -33.2344 6.22166 -33.4566 -33.2344 16.6172 -29.023 -32.2104 24.9029 -23.4288 -30.1865 32.247 -43.3009 -24.5167 -4.89537 -42.599 -25.8403 4.19521 -40.4509 -26.2866 13.1433 -36.9292 -25.8403 21.6451 -32.1537 -24.5167 29.4121 -26.2866 -22.3607 36.1803 0 -47.6832 15.0438 -5.22646 -44.4764 22.2382 5.22646 -44.4764 22.2382 -10.6917 -38.7299 29.7605 0 -39.7327 30.3531 10.6917 -38.7299 29.7605 -14.7155 -32.2104 35.298 -5.46526 -33.2344 36.9541 5.46526 -33.2344 36.9541 14.7155 -32.2104 35.298 -18.0365 -24.5167 39.6688 -9.17395 -25.8403 41.8105 0 -26.2866 42.5325 9.17395 -25.8403 41.8105 18.0365 -24.5167 39.6688 5.39231 15.3427 47.2813 14.3075 17.1665 44.7281 10.6016 7.80382 48.236 22.7648 18.1898 40.6312 19.5347 9.29806 45.0771 15.4509 0 47.5528 31.6078 18.1898 34.2064 28.8675 9.37962 39.7327 25 0 43.3013 19.7755 -7.80382 45.2552 38.1177 17.1665 27.429 36.8343 9.29806 32.5082 33.4566 0 37.1572 29.023 -7.86893 39.9468 23.4288 -15.3427 41.4209 43.3009 15.3427 19.7391 42.599 7.80382 24.9884 40.4509 0 29.3893 36.9292 -7.80382 32.7923 32.1537 -15.3427 35.0819 46.6335 15.3427 9.48234 46.9602 17.1665 0.214459 49.1512 7.80382 4.82303 45.6773 18.1898 -9.09492 48.9074 9.29806 -4.64903 50 0 0 42.2995 18.1898 -19.4905 46.7086 9.37962 -15.1765 48.9074 0 -10.3955 49.1512 -7.80382 -4.82303 37.8656 17.1665 -27.776 42.2995 9.29806 -24.9859 45.6773 0 -20.3369 46.9602 -7.86893 -15.2583 46.6335 -15.3427 -9.48234 32.1537 15.3427 -35.0819 36.9292 7.80382 -32.7923 40.4509 0 -29.3893 42.599 -7.80382 -24.9884 43.3009 -15.3427 -19.7391 23.4288 15.3427 -41.4209 14.7155 17.1665 -44.5956 19.7755 7.80382 -45.2552 5.46526 18.1898 -46.2521 10.6917 9.29806 -47.9503 15.4509 0 -47.5528 -5.46526 18.1898 -46.2521 0 9.37962 -49.1123 5.22646 0 -49.7261 10.6016 -7.80382 -48.236 -14.7155 17.1665 -44.5956 -10.6917 9.29806 -47.9503 -5.22646 0 -49.7261 0 -7.86893 -49.3769 5.39231 -15.3427 -47.2813 -23.4288 15.3427 -41.4209 -19.7755 7.80382 -45.2552 -15.4509 0 -47.5528 -10.6016 -7.80382 -48.236 -5.39231 -15.3427 -47.2813 -32.1537 15.3427 -35.0819 -37.8656 17.1665 -27.776 -36.9292 7.80382 -32.7923 -42.2995 18.1898 -19.4905 -42.2995 9.29806 -24.9859 -40.4509 0 -29.3893 -45.6773 18.1898 -9.09492 -46.7086 9.37962 -15.1765 -45.6773 0 -20.3369 -42.599 -7.80382 -24.9884 -46.9602 17.1665 0.214459 -48.9074 9.29806 -4.64903 -48.9074 0 -10.3955 -46.9602 -7.86893 -15.2583 -43.3009 -15.3427 -19.7391 -46.6335 15.3427 9.48234 -49.1512 7.80382 4.82303 -50 0 0 -49.1512 -7.80382 -4.82303 -46.6335 -15.3427 -9.48234 -43.3009 15.3427 19.7391 -38.1177 17.1665 27.429 -42.599 7.80382 24.9884 -31.6078 18.1898 34.2064 -36.8343 9.29806 32.5082 -40.4509 0 29.3893 -22.7648 18.1898 40.6312 -28.8675 9.37962 39.7327 -33.4566 0 37.1572 -36.9292 -7.80382 32.7923 -14.3075 17.1665 44.7281 -19.5347 9.29806 45.0771 -25 0 43.3013 -29.023 -7.86893 39.9468 -32.1537 -15.3427 35.0819 -5.39231 15.3427 47.2813 -10.6016 7.80382 48.236 -15.4509 0 47.5528 -19.7755 -7.80382 45.2552 -23.4288 -15.3427 41.4209 46.9602 -17.1665 -0.214459 45.6773 -18.1898 9.09492 48.9074 -9.29806 4.64903 42.2995 -18.1898 19.4905 46.7086 -9.37962 15.1765 48.9074 0 10.3955 37.8656 -17.1665 27.776 42.2995 -9.29806 24.9859 45.6773 0 20.3369 46.9602 7.86893 15.2583 14.3075 -17.1665 -44.7281 22.7648 -18.1898 -40.6312 19.5347 -9.29806 -45.0771 31.6078 -18.1898 -34.2064 28.8675 -9.37962 -39.7327 25 0 -43.3013 38.1177 -17.1665 -27.429 36.8343 -9.29806 -32.5082 33.4566 0 -37.1572 29.023 7.86893 -39.9468 -38.1177 -17.1665 -27.429 -31.6078 -18.1898 -34.2064 -36.8343 -9.29806 -32.5082 -22.7648 -18.1898 -40.6312 -28.8675 -9.37962 -39.7327 -33.4566 0 -37.1572 -14.3075 -17.1665 -44.7281 -19.5347 -9.29806 -45.0771 -25 0 -43.3013 -29.023 7.86893 -39.9468 -37.8656 -17.1665 27.776 -42.2995 -18.1898 19.4905 -42.2995 -9.29806 24.9859 -45.6773 -18.1898 9.09492 -46.7086 -9.37962 15.1765 -45.6773 0 20.3369 -46.9602 -17.1665 -0.214459 -48.9074 -9.29806 4.64903 -48.9074 0 10.3955 -46.9602 7.86893 15.2583 14.7155 -17.1665 44.5956 5.46526 -18.1898 46.2521 10.6917 -9.29806 47.9503 -5.46526 -18.1898 46.2521 0 -9.37962 49.1123 5.22646 0 49.7261 -14.7155 -17.1665 44.5956 -10.6917 -9.29806 47.9503 -5.22646 0 49.7261 0 7.86893 49.3769</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="362" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="1086">0 1 -0.000000 0.165156 0.984806 0.053662 0 0.984806 0.173655 0.33628 0.935402 0.109264 0.1769 0.953637 0.243482 0 0.935402 0.353586 0.5 0.850651 0.16246 0.351546 0.885484 0.303864 0.180358 0.885484 0.428239 0 0.850651 0.525731 0.645311 0.734581 0.209674 0.515363 0.77903 0.357091 0.356822 0.794655 0.491123 0.180358 0.77903 0.600487 0 0.734581 0.678521 0.763866 0.595741 0.248195 0.652988 0.644256 0.398172 0.515363 0.667784 0.537089 0.351546 0.667784 0.656109 0.1769 0.644256 0.74407 0 0.595741 0.803176 0.850651 0.447214 0.276393 0.763866 0.488416 0.421851 0.645312 0.516053 0.56326 0.5 0.525731 0.688191 0.33628 0.516053 0.787785 0.165156 0.488416 0.856839 0 0.447214 0.894427 0.102072 0.984806 -0.14049 0.207833 0.935402 -0.286057 0.28623 0.953637 -0.093001 0.309017 0.850651 -0.425326 0.397625 0.885484 -0.240441 0.463014 0.885484 -0.039197 0.398825 0.734581 -0.548935 0.49887 0.77903 -0.379792 0.57735 0.794654 -0.187592 0.62683 0.77903 0.01403 0.472095 0.595741 -0.649783 0.580469 0.644256 -0.497986 0.670058 0.667784 -0.32417 0.732631 0.667785 -0.131591 0.762318 0.644256 0.061688 0.525731 0.447214 -0.723607 0.637252 0.488416 -0.596121 0.735105 0.516053 -0.439671 0.809017 0.525731 -0.262865 0.853144 0.516053 -0.076382 0.865939 0.488416 0.107705 -0.102072 0.984806 -0.14049 -0.207833 0.935402 -0.286057 0 0.953637 -0.30096 -0.309017 0.850651 -0.425326 -0.105801 0.885484 -0.452465 0.105801 0.885484 -0.452465 -0.398825 0.734581 -0.548935 -0.207045 0.77903 -0.591815 0 0.794654 -0.607062 0.207045 0.77903 -0.591815 -0.472095 0.595741 -0.649783 -0.294238 0.644256 -0.705945 -0.101244 0.667784 -0.737437 0.101244 0.667784 -0.737437 0.294238 0.644256 -0.705945 -0.525731 0.447214 -0.723607 -0.370023 0.488416 -0.790274 -0.190992 0.516053 -0.834992 0 0.525731 -0.850651 0.190992 0.516053 -0.834992 0.370023 0.488416 -0.790274 -0.165156 0.984806 0.053662 -0.33628 0.935402 0.109264 -0.28623 0.953637 -0.093001 -0.5 0.850651 0.16246 -0.463014 0.885484 -0.039197 -0.397625 0.885484 -0.240441 -0.645311 0.734581 0.209674 -0.62683 0.77903 0.01403 -0.57735 0.794654 -0.187592 -0.49887 0.77903 -0.379792 -0.763866 0.595741 0.248195 -0.762318 0.644256 0.061688 -0.732631 0.667785 -0.131591 -0.670058 0.667784 -0.32417 -0.580469 0.644256 -0.497986 -0.850651 0.447214 0.276393 -0.865939 0.488416 0.107705 -0.853144 0.516053 -0.076382 -0.809017 0.525731 -0.262865 -0.735105 0.516053 -0.439671 -0.637252 0.488416 -0.596121 -0.1769 0.953637 0.243482 -0.180358 0.885484 0.428239 -0.351546 0.885484 0.303864 -0.180358 0.77903 0.600487 -0.356822 0.794655 0.491123 -0.515363 0.77903 0.357091 -0.1769 0.644256 0.74407 -0.351546 0.667785 0.656109 -0.515363 0.667784 0.537089 -0.652988 0.644256 0.398172 -0.165156 0.488416 0.856839 -0.33628 0.516053 0.787785 -0.5 0.525731 0.688191 -0.645312 0.516053 0.56326 -0.763866 0.488416 0.421851 0 -1 0.000000 0.102072 -0.984806 0.14049 0.165156 -0.984806 -0.053662 0.207833 -0.935402 0.286057 0.28623 -0.953637 0.093001 0.33628 -0.935402 -0.109264 0.309017 -0.850651 0.425326 0.397625 -0.885484 0.240441 0.463014 -0.885484 0.039197 0.5 -0.850651 -0.16246 0.398825 -0.734581 0.548935 0.49887 -0.77903 0.379792 0.57735 -0.794654 0.187592 0.62683 -0.77903 -0.01403 0.645311 -0.734581 -0.209674 0.472095 -0.595741 0.649783 0.580469 -0.644256 0.497986 0.670058 -0.667784 0.32417 0.732631 -0.667785 0.131591 0.762318 -0.644256 -0.061688 0.763866 -0.595741 -0.248195 0.525731 -0.447214 0.723607 0.637252 -0.488416 0.596121 0.735105 -0.516053 0.439671 0.809017 -0.525731 0.262865 0.853144 -0.516053 0.076382 0.865939 -0.488416 -0.107705 0.850651 -0.447214 -0.276393 0 -0.984806 -0.173655 0.1769 -0.953637 -0.243482 0 -0.935402 -0.353586 0.351546 -0.885484 -0.303864 0.180358 -0.885484 -0.428239 0 -0.850651 -0.525731 0.515363 -0.77903 -0.357091 0.356822 -0.794655 -0.491123 0.180358 -0.77903 -0.600487 0 -0.734581 -0.678521 0.652988 -0.644256 -0.398172 0.515363 -0.667784 -0.537089 0.351546 -0.667784 -0.656109 0.1769 -0.644256 -0.74407 0 -0.595741 -0.803176 0.763866 -0.488416 -0.421851 0.645312 -0.516053 -0.56326 0.5 -0.525731 -0.688191 0.33628 -0.516053 -0.787785 0.165156 -0.488416 -0.856839 0 -0.447214 -0.894427 -0.165156 -0.984806 -0.053662 -0.1769 -0.953637 -0.243482 -0.33628 -0.935402 -0.109264 -0.180358 -0.885484 -0.428239 -0.351546 -0.885484 -0.303864 -0.5 -0.850651 -0.16246 -0.180358 -0.77903 -0.600487 -0.356822 -0.794655 -0.491123 -0.515363 -0.77903 -0.357091 -0.645311 -0.734581 -0.209674 -0.1769 -0.644256 -0.74407 -0.351546 -0.667785 -0.656109 -0.515363 -0.667784 -0.537089 -0.652988 -0.644256 -0.398172 -0.763866 -0.595741 -0.248195 -0.165156 -0.488416 -0.856839 -0.33628 -0.516053 -0.787785 -0.5 -0.525731 -0.688191 -0.645312 -0.516053 -0.56326 -0.763866 -0.488416 -0.421851 -0.850651 -0.447214 -0.276393 -0.102072 -0.984806 0.14049 -0.28623 -0.953637 0.093001 -0.207833 -0.935402 0.286057 -0.463014 -0.885484 0.039197 -0.397625 -0.885484 0.240441 -0.309017 -0.850651 0.425326 -0.62683 -0.77903 -0.01403 -0.57735 -0.794654 0.187592 -0.49887 -0.77903 0.379792 -0.398825 -0.734581 0.548935 -0.762318 -0.644256 -0.061688 -0.732631 -0.667785 0.131591 -0.670058 -0.667784 0.32417 -0.580469 -0.644256 0.497986 -0.472095 -0.595741 0.649783 -0.865939 -0.488416 -0.107705 -0.853144 -0.516053 0.076382 -0.809017 -0.525731 0.262865 -0.735105 -0.516053 0.439671 -0.637252 -0.488416 0.596121 -0.525731 -0.447214 0.723607 0 -0.953637 0.30096 -0.105801 -0.885484 0.452465 0.105801 -0.885484 0.452465 -0.207045 -0.77903 0.591815 0 -0.794654 0.607062 0.207045 -0.77903 0.591815 -0.294238 -0.644256 0.705945 -0.101244 -0.667784 0.737437 0.101244 -0.667784 0.737437 0.294238 -0.644256 0.705945 -0.370023 -0.488416 0.790274 -0.190992 -0.516053 0.834992 0 -0.525731 0.850651 0.190992 -0.516053 0.834992 0.370023 -0.488416 0.790274 0.102072 0.31476 0.943667 0.28623 0.343296 0.89455 0.207832 0.162468 0.964578 0.463014 0.360942 0.80953 0.397625 0.180943 0.89953 0.309017 0 0.951057 0.62683 0.360942 0.690511 0.57735 0.187592 0.794654 0.49887 0.008696 0.866633 0.398824 -0.162468 0.902521 0.762318 0.343296 0.548653 0.73263 0.180943 0.656134 0.670058 0.008696 0.742258 0.580469 -0.157292 0.798946 0.472095 -0.31476 0.823439 0.865939 0.31476 0.388686 0.853144 0.162468 0.495731 0.809017 0 0.587785 0.735104 -0.162467 0.658199 0.637252 -0.31476 0.703446 0.929023 0.31476 0.194533 0.939218 0.343296 0.004209 0.981592 0.162467 0.10041 0.912988 0.360942 -0.190193 0.978377 0.180943 -0.100194 1 0 0 0.850416 0.360942 -0.382771 0.934172 0.187592 -0.303531 0.978377 0.008696 -0.206649 0.981592 -0.162467 -0.10041 0.757369 0.343296 -0.555464 0.850416 0.180943 -0.494017 0.912988 0.008695 -0.407893 0.939218 -0.157292 -0.30517 0.929023 -0.31476 -0.194533 0.637252 0.31476 -0.703446 0.735104 0.162467 -0.658199 0.809017 0 -0.587785 0.853144 -0.162468 -0.495731 0.865938 -0.31476 -0.388686 0.472095 0.31476 -0.823439 0.294238 0.343296 -0.891948 0.398824 0.162468 -0.902521 0.101244 0.360941 -0.927076 0.207045 0.180943 -0.961453 0.309017 0 -0.951057 -0.101244 0.360941 -0.927076 0 0.187592 -0.982247 0.1058 0.008696 -0.994349 0.207832 -0.162468 -0.964578 -0.294238 0.343296 -0.891948 -0.207045 0.180943 -0.961453 -0.1058 0.008696 -0.994349 0 -0.157292 -0.987552 0.102072 -0.31476 -0.943667 -0.472095 0.31476 -0.823439 -0.398825 0.162468 -0.902521 -0.309017 0 -0.951057 -0.207832 -0.162468 -0.964578 -0.102072 -0.31476 -0.943667 -0.637252 0.31476 -0.703446 -0.757369 0.343296 -0.555464 -0.735105 0.162467 -0.658199 -0.850416 0.360942 -0.382771 -0.850416 0.180943 -0.494017 -0.809017 0 -0.587785 -0.912988 0.360942 -0.190193 -0.934172 0.187592 -0.303531 -0.912988 0.008695 -0.407893 -0.853144 -0.162468 -0.495731 -0.939218 0.343296 0.004209 -0.978377 0.180943 -0.100194 -0.978377 0.008696 -0.206649 -0.939218 -0.157292 -0.30517 -0.865938 -0.31476 -0.388686 -0.929023 0.31476 0.194533 -0.981592 0.162467 0.10041 -1 0 0 -0.981592 -0.162467 -0.10041 -0.929023 -0.31476 -0.194533 -0.865938 0.31476 0.388686 -0.762318 0.343296 0.548653 -0.853144 0.162468 0.495731 -0.62683 0.360942 0.690511 -0.73263 0.180943 0.656134 -0.809017 0 0.587785 -0.463014 0.360942 0.80953 -0.57735 0.187592 0.794654 -0.670058 0.008696 0.742258 -0.735105 -0.162467 0.658199 -0.28623 0.343296 0.89455 -0.397625 0.180943 0.89953 -0.49887 0.008696 0.866633 -0.580469 -0.157292 0.798946 -0.637252 -0.31476 0.703446 -0.102072 0.31476 0.943667 -0.207832 0.162468 0.964578 -0.309017 0 0.951057 -0.398825 -0.162468 0.902521 -0.472095 -0.31476 0.823439 0.939218 -0.343296 -0.004209 0.912988 -0.360942 0.190193 0.978377 -0.180943 0.100194 0.850416 -0.360942 0.382771 0.934172 -0.187592 0.303531 0.978377 -0.008696 0.206649 0.757369 -0.343296 0.555464 0.850416 -0.180943 0.494017 0.912988 -0.008695 0.407893 0.939218 0.157292 0.30517 0.28623 -0.343296 -0.89455 0.463014 -0.360942 -0.80953 0.397625 -0.180943 -0.89953 0.62683 -0.360942 -0.690511 0.57735 -0.187592 -0.794654 0.49887 -0.008696 -0.866633 0.762318 -0.343296 -0.548653 0.73263 -0.180943 -0.656134 0.670058 -0.008696 -0.742258 0.580469 0.157292 -0.798946 -0.762318 -0.343296 -0.548653 -0.62683 -0.360942 -0.690511 -0.73263 -0.180943 -0.656134 -0.463014 -0.360942 -0.80953 -0.57735 -0.187592 -0.794654 -0.670058 -0.008696 -0.742258 -0.28623 -0.343296 -0.89455 -0.397625 -0.180943 -0.89953 -0.49887 -0.008696 -0.866633 -0.580469 0.157292 -0.798946 -0.757369 -0.343296 0.555464 -0.850416 -0.360942 0.382771 -0.850416 -0.180943 0.494017 -0.912988 -0.360942 0.190193 -0.934172 -0.187592 0.303531 -0.912988 -0.008695 0.407893 -0.939218 -0.343296 -0.004209 -0.978377 -0.180943 0.100194 -0.978377 -0.008696 0.206649 -0.939218 0.157292 0.30517 0.294238 -0.343296 0.891948 0.101244 -0.360941 0.927076 0.207045 -0.180943 0.961453 -0.101244 -0.360941 0.927076 0 -0.187592 0.982247 0.1058 -0.008696 0.994349 -0.294238 -0.343296 0.891948 -0.207045 -0.180943 0.961453 -0.1058 -0.008696 0.994349 0 0.157292 0.987552</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="362" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="1080">0.106061 0.944444 0.090909 1 0.075757 0.944444 0.121212 0.888889 0.090909 0.888889 0.060606 0.888889 0.136364 0.833333 0.106061 0.833333 0.075757 0.833333 0.045454 0.833333 0.151515 0.777778 0.121212 0.777778 0.090909 0.777778 0.060606 0.777778 0.030303 0.777778 0.166667 0.722222 0.136364 0.722222 0.106061 0.722222 0.075757 0.722222 0.045454 0.722222 0.015151 0.722222 0.181818 0.666667 0.151515 0.666667 0.121212 0.666667 0.090909 0.666667 0.060606 0.666667 0.030303 0.666667 0 0.666667 0.287879 0.944444 0.272727 1 0.257576 0.944444 0.30303 0.888889 0.272727 0.888889 0.257576 0.944444 0.242424 0.888889 0.257576 0.944444 0.318182 0.833333 0.287879 0.833333 0.257576 0.833333 0.242424 0.888889 0.227273 0.833333 0.242424 0.888889 0.333333 0.777778 0.30303 0.777778 0.272727 0.777778 0.242424 0.777778 0.227273 0.833333 0.212121 0.777778 0.227273 0.833333 0.348485 0.722222 0.318182 0.722222 0.287879 0.722222 0.257576 0.722222 0.227273 0.722222 0.212121 0.777778 0.19697 0.722222 0.212121 0.777778 0.363636 0.666667 0.333333 0.666667 0.30303 0.666667 0.272727 0.666667 0.242424 0.666667 0.212121 0.666667 0.19697 0.722222 0.19697 0.722222 0.469697 0.944444 0.454545 1 0.439394 0.944444 0.484848 0.888889 0.454545 0.888889 0.439394 0.944444 0.424242 0.888889 0.439394 0.944444 0.5 0.833333 0.469697 0.833333 0.439394 0.833333 0.424242 0.888889 0.409091 0.833333 0.424242 0.888889 0.515152 0.777778 0.484848 0.777778 0.454545 0.777778 0.424242 0.777778 0.409091 0.833333 0.393939 0.777778 0.409091 0.833333 0.530303 0.722222 0.5 0.722222 0.469697 0.722222 0.439394 0.722222 0.409091 0.722222 0.393939 0.777778 0.378788 0.722222 0.393939 0.777778 0.545455 0.666667 0.515152 0.666667 0.484848 0.666667 0.454545 0.666667 0.424242 0.666667 0.393939 0.666667 0.378788 0.722222 0.378788 0.722222 0.651515 0.944444 0.636364 1 0.621212 0.944444 0.666667 0.888889 0.636364 0.888889 0.621212 0.944444 0.606061 0.888889 0.621212 0.944444 0.681818 0.833333 0.651515 0.833333 0.621212 0.833333 0.606061 0.888889 0.590909 0.833333 0.606061 0.888889 0.69697 0.777778 0.666667 0.777778 0.636364 0.777778 0.606061 0.777778 0.590909 0.833333 0.575758 0.777778 0.590909 0.833333 0.712121 0.722222 0.681818 0.722222 0.651515 0.722222 0.621212 0.722222 0.590909 0.722222 0.575758 0.777778 0.560606 0.722222 0.575758 0.777778 0.727273 0.666667 0.69697 0.666667 0.666667 0.666667 0.636364 0.666667 0.606061 0.666667 0.575758 0.666667 0.560606 0.722222 0.560606 0.722222 0.833333 0.944444 0.818182 1 0.80303 0.944444 0.848485 0.888889 0.833333 0.944444 0.818182 0.888889 0.80303 0.944444 0.787879 0.888889 0.80303 0.944444 0.833333 0.944444 0.863636 0.833333 0.848485 0.888889 0.833333 0.833333 0.80303 0.833333 0.787879 0.888889 0.772727 0.833333 0.848485 0.888889 0.787879 0.888889 0.878788 0.777778 0.863636 0.833333 0.848485 0.777778 0.818182 0.777778 0.787879 0.777778 0.772727 0.833333 0.757576 0.777778 0.863636 0.833333 0.772727 0.833333 0.893939 0.722222 0.878788 0.777778 0.863636 0.722222 0.833333 0.722222 0.80303 0.722222 0.772727 0.722222 0.757576 0.777778 0.742424 0.722222 0.878788 0.777778 0.757576 0.777778 0.909091 0.666667 0.893939 0.722222 0.878788 0.666667 0.848485 0.666667 0.818182 0.666667 0.787879 0.666667 0.757576 0.666667 0.742424 0.722222 0.893939 0.722222 0.742424 0.722222 0.166667 0.055555 0.181818 0 0.19697 0.055555 0.151515 0.111111 0.181818 0.111111 0.212121 0.111111 0.136364 0.166667 0.166667 0.166667 0.19697 0.166667 0.227273 0.166667 0.121212 0.222222 0.151515 0.222222 0.181818 0.222222 0.212121 0.222222 0.242424 0.222222 0.106061 0.277778 0.136364 0.277778 0.166667 0.277778 0.19697 0.277778 0.227273 0.277778 0.257576 0.277778 0.090909 0.333333 0.121212 0.333333 0.151515 0.333333 0.181818 0.333333 0.212121 0.333333 0.242424 0.333333 0.272727 0.333333 0.348485 0.055555 0.363636 0 0.378788 0.055555 0.333333 0.111111 0.348485 0.055555 0.363636 0.111111 0.393939 0.111111 0.348485 0.055555 0.318182 0.166667 0.333333 0.111111 0.348485 0.166667 0.378788 0.166667 0.409091 0.166667 0.333333 0.111111 0.30303 0.222222 0.318182 0.166667 0.333333 0.222222 0.363636 0.222222 0.393939 0.222222 0.424242 0.222222 0.318182 0.166667 0.287879 0.277778 0.30303 0.222222 0.318182 0.277778 0.348485 0.277778 0.378788 0.277778 0.409091 0.277778 0.439394 0.277778 0.30303 0.222222 0.287879 0.277778 0.30303 0.333333 0.333333 0.333333 0.363636 0.333333 0.393939 0.333333 0.424242 0.333333 0.454545 0.333333 0.287879 0.277778 0.530303 0.055555 0.545455 0 0.560606 0.055555 0.515152 0.111111 0.530303 0.055555 0.545455 0.111111 0.575758 0.111111 0.530303 0.055555 0.5 0.166667 0.515152 0.111111 0.530303 0.166667 0.560606 0.166667 0.590909 0.166667 0.515152 0.111111 0.484848 0.222222 0.5 0.166667 0.515152 0.222222 0.545455 0.222222 0.575758 0.222222 0.606061 0.222222 0.5 0.166667 0.469697 0.277778 0.484848 0.222222 0.5 0.277778 0.530303 0.277778 0.560606 0.277778 0.590909 0.277778 0.621212 0.277778 0.484848 0.222222 0.469697 0.277778 0.484848 0.333333 0.515152 0.333333 0.545455 0.333333 0.575758 0.333333 0.606061 0.333333 0.636364 0.333333 0.469697 0.277778 0.712121 0.055555 0.727273 0 0.742424 0.055555 0.69697 0.111111 0.712121 0.055555 0.727273 0.111111 0.757576 0.111111 0.712121 0.055555 0.681818 0.166667 0.69697 0.111111 0.712121 0.166667 0.742424 0.166667 0.772727 0.166667 0.69697 0.111111 0.666667 0.222222 0.681818 0.166667 0.69697 0.222222 0.727273 0.222222 0.757576 0.222222 0.787879 0.222222 0.681818 0.166667 0.651515 0.277778 0.666667 0.222222 0.681818 0.277778 0.712121 0.277778 0.742424 0.277778 0.772727 0.277778 0.80303 0.277778 0.666667 0.222222 0.651515 0.277778 0.666667 0.333333 0.69697 0.333333 0.727273 0.333333 0.757576 0.333333 0.787879 0.333333 0.818182 0.333333 0.651515 0.277778 0.893939 0.055555 0.909091 0 0.924242 0.055555 0.878788 0.111111 0.893939 0.055555 0.909091 0.111111 0.924242 0.055555 0.939394 0.111111 0.924242 0.055555 0.893939 0.055555 0.863636 0.166667 0.878788 0.111111 0.893939 0.166667 0.924242 0.166667 0.939394 0.111111 0.954545 0.166667 0.878788 0.111111 0.939394 0.111111 0.848485 0.222222 0.863636 0.166667 0.878788 0.222222 0.909091 0.222222 0.939394 0.222222 0.954545 0.166667 0.969697 0.222222 0.863636 0.166667 0.954545 0.166667 0.833333 0.277778 0.848485 0.222222 0.863636 0.277778 0.893939 0.277778 0.924242 0.277778 0.954545 0.277778 0.969697 0.222222 0.984848 0.277778 0.848485 0.222222 0.969697 0.222222 0.833333 0.277778 0.848485 0.333333 0.878788 0.333333 0.909091 0.333333 0.939394 0.333333 0.969697 0.333333 0.984848 0.277778 1 0.333333 0.833333 0.277778 0.984848 0.277778 0.015151 0.611111 0.045454 0.611111 0.030303 0.555556 0.075757 0.611111 0.060606 0.555556 0.045454 0.5 0.106061 0.611111 0.090909 0.555556 0.075757 0.5 0.060606 0.444444 0.136364 0.611111 0.121212 0.555556 0.106061 0.5 0.090909 0.444444 0.075757 0.388889 0.166667 0.611111 0.151515 0.555556 0.136364 0.5 0.121212 0.444444 0.106061 0.388889 0.19697 0.611111 0.227273 0.611111 0.212121 0.555556 0.257576 0.611111 0.242424 0.555556 0.227273 0.5 0.287879 0.611111 0.272727 0.555556 0.257576 0.5 0.242424 0.444444 0.318182 0.611111 0.30303 0.555556 0.287879 0.5 0.272727 0.444444 0.257576 0.388889 0.348485 0.611111 0.333333 0.555556 0.318182 0.5 0.30303 0.444444 0.287879 0.388889 0.378788 0.611111 0.409091 0.611111 0.393939 0.555556 0.439394 0.611111 0.424242 0.555556 0.409091 0.5 0.469697 0.611111 0.454545 0.555556 0.439394 0.5 0.424242 0.444444 0.5 0.611111 0.484848 0.555556 0.469697 0.5 0.454545 0.444444 0.439394 0.388889 0.530303 0.611111 0.515152 0.555556 0.5 0.5 0.484848 0.444444 0.469697 0.388889 0.560606 0.611111 0.590909 0.611111 0.575758 0.555556 0.621212 0.611111 0.606061 0.555556 0.590909 0.5 0.651515 0.611111 0.636364 0.555556 0.621212 0.5 0.606061 0.444444 0.681818 0.611111 0.666667 0.555556 0.651515 0.5 0.636364 0.444444 0.621212 0.388889 0.712121 0.611111 0.69697 0.555556 0.681818 0.5 0.666667 0.444444 0.651515 0.388889 0.742424 0.611111 0.772727 0.611111 0.757576 0.555556 0.80303 0.611111 0.787879 0.555556 0.772727 0.5 0.833333 0.611111 0.818182 0.555556 0.80303 0.5 0.787879 0.444444 0.863636 0.611111 0.848485 0.555556 0.833333 0.5 0.818182 0.444444 0.80303 0.388889 0.909091 0.666667 0.893939 0.611111 0.878788 0.555556 0.863636 0.5 0.848485 0.444444 0.833333 0.388889 0.227273 0.388889 0.19697 0.388889 0.212121 0.444444 0.166667 0.388889 0.181818 0.444444 0.19697 0.5 0.136364 0.388889 0.151515 0.444444 0.166667 0.5 0.181818 0.555556 0.409091 0.388889 0.378788 0.388889 0.393939 0.444444 0.348485 0.388889 0.363636 0.444444 0.378788 0.5 0.318182 0.388889 0.333333 0.444444 0.348485 0.5 0.363636 0.555556 0.590909 0.388889 0.560606 0.388889 0.575758 0.444444 0.530303 0.388889 0.545455 0.444444 0.560606 0.5 0.5 0.388889 0.515152 0.444444 0.530303 0.5 0.545455 0.555556 0.772727 0.388889 0.742424 0.388889 0.757576 0.444444 0.712121 0.388889 0.727273 0.444444 0.742424 0.5 0.681818 0.388889 0.69697 0.444444 0.712121 0.5 0.727273 0.555556 1 0.333333 0.984848 0.388889 0.954545 0.388889 0.984848 0.388889 0.969697 0.444444 0.984848 0.388889 0.924242 0.388889 0.939394 0.444444 0.969697 0.444444 0.954545 0.5 0.969697 0.444444 0.893939 0.388889 0.909091 0.444444 0.924242 0.5 0.954545 0.5 0.939394 0.555556 0.954545 0.5 0.863636 0.388889 0.878788 0.444444 0.893939 0.5 0.909091 0.555556 0.939394 0.555556 0.924242 0.611111 0.939394 0.555556 0.924242 0.611111 0.909091 0.666667 0.924242 0.611111</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="540" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="720">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>1 0 0 1 2 2 3 3 1 0 4 4 4 4 2 2 5 5 2 2 4 4 1 0 6 6 3 3 7 7 7 7 4 4 8 8 8 8 5 5 9 9 4 4 7 7 3 3 5 5 8 8 4 4 10 10 6 6 11 11 11 11 7 7 12 12 12 12 8 8 13 13 13 13 9 9 14 14 7 7 11 11 6 6 8 8 12 12 7 7 9 9 13 13 8 8 15 15 10 10 16 16 16 16 11 11 17 17 17 17 12 12 18 18 18 18 13 13 19 19 19 19 14 14 20 20 11 11 16 16 10 10 12 12 17 17 11 11 13 13 18 18 12 12 14 14 19 19 13 13 21 21 15 15 22 22 22 22 16 16 23 23 23 23 17 17 24 24 24 24 18 18 25 25 25 25 19 19 26 26 26 26 20 20 27 27 16 16 22 22 15 15 17 17 23 23 16 16 18 18 24 24 17 17 19 19 25 25 18 18 20 20 26 26 19 19 28 28 0 29 1 30 29 31 28 28 30 32 30 32 1 33 3 34 1 35 30 32 28 28 31 36 29 31 32 37 32 37 30 32 33 38 33 38 3 39 6 40 30 32 32 37 29 31 3 41 33 38 30 32 34 42 31 36 35 43 35 43 32 37 36 44 36 44 33 38 37 45 37 45 6 46 10 47 32 37 35 43 31 36 33 38 36 44 32 37 6 48 37 45 33 38 38 49 34 42 39 50 39 50 35 43 40 51 40 51 36 44 41 52 41 52 37 45 42 53 42 53 10 54 15 55 35 43 39 50 34 42 36 44 40 51 35 43 37 45 41 52 36 44 10 56 42 53 37 45 43 57 38 49 44 58 44 58 39 50 45 59 45 59 40 51 46 60 46 60 41 52 47 61 47 61 42 53 48 62 48 62 15 63 21 21 39 50 44 58 38 49 40 51 45 59 39 50 41 52 46 60 40 51 42 53 47 61 41 52 15 64 48 62 42 53 49 65 0 66 28 67 50 68 49 65 51 69 51 69 28 70 29 71 28 72 51 69 49 65 52 73 50 68 53 74 53 74 51 69 54 75 54 75 29 76 31 77 51 69 53 74 50 68 29 78 54 75 51 69 55 79 52 73 56 80 56 80 53 74 57 81 57 81 54 75 58 82 58 82 31 83 34 84 53 74 56 80 52 73 54 75 57 81 53 74 31 85 58 82 54 75 59 86 55 79 60 87 60 87 56 80 61 88 61 88 57 81 62 89 62 89 58 82 63 90 63 90 34 91 38 92 56 80 60 87 55 79 57 81 61 88 56 80 58 82 62 89 57 81 34 93 63 90 58 82 64 94 59 86 65 95 65 95 60 87 66 96 66 96 61 88 67 97 67 97 62 89 68 98 68 98 63 90 69 99 69 99 38 100 43 57 60 87 65 95 59 86 61 88 66 96 60 87 62 89 67 97 61 88 63 90 68 98 62 89 38 101 69 99 63 90 70 102 0 103 49 104 71 105 70 102 72 106 72 106 49 107 50 108 49 109 72 106 70 102 73 110 71 105 74 111 74 111 72 106 75 112 75 112 50 113 52 114 72 106 74 111 71 105 50 115 75 112 72 106 76 116 73 110 77 117 77 117 74 111 78 118 78 118 75 112 79 119 79 119 52 120 55 121 74 111 77 117 73 110 75 112 78 118 74 111 52 122 79 119 75 112 80 123 76 116 81 124 81 124 77 117 82 125 82 125 78 118 83 126 83 126 79 119 84 127 84 127 55 128 59 129 77 117 81 124 76 116 78 118 82 125 77 117 79 119 83 126 78 118 55 130 84 127 79 119 85 131 80 123 86 132 86 132 81 124 87 133 87 133 82 125 88 134 88 134 83 126 89 135 89 135 84 127 90 136 90 136 59 137 64 94 81 124 86 132 80 123 82 125 87 133 81 124 83 126 88 134 82 125 84 127 89 135 83 126 59 138 90 136 84 127 2 139 0 140 70 141 5 142 2 143 91 144 91 144 70 145 71 146 70 147 91 144 2 148 9 149 5 150 92 151 92 151 91 144 93 152 93 152 71 153 73 154 91 144 92 151 5 155 71 156 93 152 91 144 14 157 9 158 94 159 94 159 92 151 95 160 95 160 93 152 96 161 96 161 73 162 76 163 92 151 94 159 9 164 93 152 95 160 92 151 73 165 96 161 93 152 20 166 14 167 97 168 97 168 94 159 98 169 98 169 95 160 99 170 99 170 96 161 100 171 100 171 76 172 80 173 94 159 97 168 14 174 95 160 98 169 94 159 96 161 99 170 95 160 76 175 100 171 96 161 27 176 20 177 101 178 101 178 97 168 102 179 102 179 98 169 103 180 103 180 99 170 104 181 104 181 100 171 105 182 105 182 80 183 85 131 97 168 101 178 20 184 98 169 102 179 97 168 99 170 103 180 98 169 100 171 104 181 99 170 80 185 105 182 100 171 107 186 106 187 108 188 109 189 107 186 110 190 110 190 108 188 111 191 108 188 110 190 107 186 112 192 109 189 113 193 113 193 110 190 114 194 114 194 111 191 115 195 110 190 113 193 109 189 111 191 114 194 110 190 116 196 112 192 117 197 117 197 113 193 118 198 118 198 114 194 119 199 119 199 115 195 120 200 113 193 117 197 112 192 114 194 118 198 113 193 115 195 119 199 114 194 121 201 116 196 122 202 122 202 117 197 123 203 123 203 118 198 124 204 124 204 119 199 125 205 125 205 120 200 126 206 117 197 122 202 116 196 118 198 123 203 117 197 119 199 124 204 118 198 120 200 125 205 119 199 127 207 121 201 128 208 128 208 122 202 129 209 129 209 123 203 130 210 130 210 124 204 131 211 131 211 125 205 132 212 132 212 126 206 133 213 122 202 128 208 121 201 123 203 129 209 122 202 124 204 130 210 123 203 125 205 131 211 124 204 126 206 132 212 125 205 108 214 106 215 134 216 111 217 108 218 135 219 135 219 134 216 136 220 134 216 135 219 108 221 115 222 111 223 137 224 137 224 135 219 138 225 138 225 136 220 139 226 135 219 137 224 111 227 136 220 138 225 135 219 120 228 115 229 140 230 140 230 137 224 141 231 141 231 138 225 142 232 142 232 139 226 143 233 137 224 140 230 115 234 138 225 141 231 137 224 139 226 142 232 138 225 126 235 120 236 144 237 144 237 140 230 145 238 145 238 141 231 146 239 146 239 142 232 147 240 147 240 143 233 148 241 140 230 144 237 120 242 141 231 145 238 140 230 142 232 146 239 141 231 143 233 147 240 142 232 133 213 126 243 149 244 149 244 144 237 150 245 150 245 145 238 151 246 151 246 146 239 152 247 152 247 147 240 153 248 153 248 148 241 154 249 144 237 149 244 126 250 145 238 150 245 144 237 146 239 151 246 145 238 147 240 152 247 146 239 148 241 153 248 147 240 134 251 106 252 155 253 136 254 134 255 156 256 156 256 155 253 157 257 155 253 156 256 134 258 139 259 136 260 158 261 158 261 156 256 159 262 159 262 157 257 160 263 156 256 158 261 136 264 157 257 159 262 156 256 143 265 139 266 161 267 161 267 158 261 162 268 162 268 159 262 163 269 163 269 160 263 164 270 158 261 161 267 139 271 159 262 162 268 158 261 160 263 163 269 159 262 148 272 143 273 165 274 165 274 161 267 166 275 166 275 162 268 167 276 167 276 163 269 168 277 168 277 164 270 169 278 161 267 165 274 143 279 162 268 166 275 161 267 163 269 167 276 162 268 164 270 168 277 163 269 154 249 148 280 170 281 170 281 165 274 171 282 171 282 166 275 172 283 172 283 167 276 173 284 173 284 168 277 174 285 174 285 169 278 175 286 165 274 170 281 148 287 166 275 171 282 165 274 167 276 172 283 166 275 168 277 173 284 167 276 169 278 174 285 168 277 155 288 106 289 176 290 157 291 155 292 177 293 177 293 176 290 178 294 176 290 177 293 155 295 160 296 157 297 179 298 179 298 177 293 180 299 180 299 178 294 181 300 177 293 179 298 157 301 178 294 180 299 177 293 164 302 160 303 182 304 182 304 179 298 183 305 183 305 180 299 184 306 184 306 181 300 185 307 179 298 182 304 160 308 180 299 183 305 179 298 181 300 184 306 180 299 169 309 164 310 186 311 186 311 182 304 187 312 187 312 183 305 188 313 188 313 184 306 189 314 189 314 185 307 190 315 182 304 186 311 164 316 183 305 187 312 182 304 184 306 188 313 183 305 185 307 189 314 184 306 175 286 169 317 191 318 191 318 186 311 192 319 192 319 187 312 193 320 193 320 188 313 194 321 194 321 189 314 195 322 195 322 190 315 196 323 186 311 191 318 169 324 187 312 192 319 186 311 188 313 193 320 187 312 189 314 194 321 188 313 190 315 195 322 189 314 176 325 106 326 107 327 178 328 176 329 197 330 197 330 107 331 109 332 107 333 197 330 176 334 181 335 178 336 198 337 198 337 197 330 199 338 199 338 109 339 112 340 197 330 198 337 178 341 109 342 199 338 197 330 185 343 181 344 200 345 200 345 198 337 201 346 201 346 199 338 202 347 202 347 112 348 116 349 198 337 200 345 181 350 199 338 201 346 198 337 112 351 202 347 199 338 190 352 185 353 203 354 203 354 200 345 204 355 204 355 201 346 205 356 205 356 202 347 206 357 206 357 116 358 121 359 200 345 203 354 185 360 201 346 204 355 200 345 202 347 205 356 201 346 116 361 206 357 202 347 196 323 190 362 207 363 207 363 203 354 208 364 208 364 204 355 209 365 209 365 205 356 210 366 210 366 206 357 211 367 211 367 121 368 127 369 203 354 207 363 190 370 204 355 208 364 203 354 205 356 209 365 204 355 206 357 210 366 205 356 121 371 211 367 206 357 26 26 27 27 212 372 25 25 26 26 213 373 213 373 212 372 214 374 212 372 213 373 26 26 24 24 25 25 215 375 215 375 213 373 216 376 216 376 214 374 217 377 213 373 215 375 25 25 214 374 216 376 213 373 23 23 24 24 218 378 218 378 215 375 219 379 219 379 216 376 220 380 220 380 217 377 221 381 215 375 218 378 24 24 216 376 219 379 215 375 217 377 220 380 216 376 22 22 23 23 222 382 222 382 218 378 223 383 223 383 219 379 224 384 224 384 220 380 225 385 225 385 221 381 226 386 218 378 222 382 23 23 219 379 223 383 218 378 220 380 224 384 219 379 221 381 225 385 220 380 21 21 22 22 227 387 227 387 222 382 228 388 228 388 223 383 229 389 229 389 224 384 230 390 230 390 225 385 231 391 231 391 226 386 127 207 222 382 227 387 22 22 223 383 228 388 222 382 224 384 229 389 223 383 225 385 230 390 224 384 226 386 231 391 225 385 48 62 21 21 232 392 47 61 48 62 233 393 233 393 232 392 234 394 232 392 233 393 48 62 46 60 47 61 235 395 235 395 233 393 236 396 236 396 234 394 237 397 233 393 235 395 47 61 234 394 236 396 233 393 45 59 46 60 238 398 238 398 235 395 239 399 239 399 236 396 240 400 240 400 237 397 241 401 235 395 238 398 46 60 236 396 239 399 235 395 237 397 240 400 236 396 44 58 45 59 242 402 242 402 238 398 243 403 243 403 239 399 244 404 244 404 240 400 245 405 245 405 241 401 246 406 238 398 242 402 45 59 239 399 243 403 238 398 240 400 244 404 239 399 241 401 245 405 240 400 43 57 44 58 247 407 247 407 242 402 248 408 248 408 243 403 249 409 249 409 244 404 250 410 250 410 245 405 251 411 251 411 246 406 133 213 242 402 247 407 44 58 243 403 248 408 242 402 244 404 249 409 243 403 245 405 250 410 244 404 246 406 251 411 245 405 69 99 43 57 252 412 68 98 69 99 253 413 253 413 252 412 254 414 252 412 253 413 69 99 67 97 68 98 255 415 255 415 253 413 256 416 256 416 254 414 257 417 253 413 255 415 68 98 254 414 256 416 253 413 66 96 67 97 258 418 258 418 255 415 259 419 259 419 256 416 260 420 260 420 257 417 261 421 255 415 258 418 67 97 256 416 259 419 255 415 257 417 260 420 256 416 65 95 66 96 262 422 262 422 258 418 263 423 263 423 259 419 264 424 264 424 260 420 265 425 265 425 261 421 266 426 258 418 262 422 66 96 259 419 263 423 258 418 260 420 264 424 259 419 261 421 265 425 260 420 64 94 65 95 267 427 267 427 262 422 268 428 268 428 263 423 269 429 269 429 264 424 270 430 270 430 265 425 271 431 271 431 266 426 154 249 262 422 267 427 65 95 263 423 268 428 262 422 264 424 269 429 263 423 265 425 270 430 264 424 266 426 271 431 265 425 90 136 64 94 272 432 89 135 90 136 273 433 273 433 272 432 274 434 272 432 273 433 90 136 88 134 89 135 275 435 275 435 273 433 276 436 276 436 274 434 277 437 273 433 275 435 89 135 274 434 276 436 273 433 87 133 88 134 278 438 278 438 275 435 279 439 279 439 276 436 280 440 280 440 277 437 281 441 275 435 278 438 88 134 276 436 279 439 275 435 277 437 280 440 276 436 86 132 87 133 282 442 282 442 278 438 283 443 283 443 279 439 284 444 284 444 280 440 285 445 285 445 281 441 286 446 278 438 282 442 87 133 279 439 283 443 278 438 280 440 284 444 279 439 281 441 285 445 280 440 85 131 86 132 287 447 287 447 282 442 288 448 288 448 283 443 289 449 289 449 284 444 290 450 290 450 285 445 291 451 291 451 286 446 175 286 282 442 287 447 86 132 283 443 288 448 282 442 284 444 289 449 283 443 285 445 290 450 284 444 286 446 291 451 285 445 105 182 85 131 292 452 104 181 105 182 293 453 293 453 292 452 294 454 292 452 293 453 105 182 103 180 104 181 295 455 295 455 293 453 296 456 296 456 294 454 297 457 293 453 295 455 104 181 294 454 296 456 293 453 102 179 103 180 298 458 298 458 295 455 299 459 299 459 296 456 300 460 300 460 297 457 301 461 295 455 298 458 103 180 296 456 299 459 295 455 297 457 300 460 296 456 101 178 102 179 302 462 302 462 298 458 303 463 303 463 299 459 304 464 304 464 300 460 305 465 305 465 301 461 306 466 298 458 302 462 102 179 299 459 303 463 298 458 300 460 304 464 299 459 301 461 305 465 300 460 27 467 101 178 307 468 307 468 302 462 308 469 308 469 303 463 309 470 309 470 304 464 310 471 310 471 305 465 311 472 311 472 306 466 196 323 302 462 307 468 101 178 303 463 308 469 302 462 304 464 309 470 303 463 305 465 310 471 304 464 306 466 311 472 305 465 132 212 133 213 246 406 131 211 132 212 312 473 312 473 246 406 241 401 246 406 312 473 132 212 130 210 131 211 313 474 313 474 312 473 314 475 314 475 241 401 237 397 312 473 313 474 131 211 241 401 314 475 312 473 129 209 130 210 315 476 315 476 313 474 316 477 316 477 314 475 317 478 317 478 237 397 234 394 313 474 315 476 130 210 314 475 316 477 313 474 237 397 317 478 314 475 128 208 129 209 318 479 318 479 315 476 319 480 319 480 316 477 320 481 320 481 317 478 321 482 321 482 234 394 232 392 315 476 318 479 129 209 316 477 319 480 315 476 317 478 320 481 316 477 234 394 321 482 317 478 127 207 128 208 231 391 231 391 318 479 230 390 230 390 319 480 229 389 229 389 320 481 228 388 228 388 321 482 227 387 227 387 232 392 21 21 318 479 231 391 128 208 319 480 230 390 318 479 320 481 229 389 319 480 321 482 228 388 320 481 232 392 227 387 321 482 153 248 154 249 266 426 152 247 153 248 322 483 322 483 266 426 261 421 266 426 322 483 153 248 151 246 152 247 323 484 323 484 322 483 324 485 324 485 261 421 257 417 322 483 323 484 152 247 261 421 324 485 322 483 150 245 151 246 325 486 325 486 323 484 326 487 326 487 324 485 327 488 327 488 257 417 254 414 323 484 325 486 151 246 324 485 326 487 323 484 257 417 327 488 324 485 149 244 150 245 328 489 328 489 325 486 329 490 329 490 326 487 330 491 330 491 327 488 331 492 331 492 254 414 252 412 325 486 328 489 150 245 326 487 329 490 325 486 327 488 330 491 326 487 254 414 331 492 327 488 133 213 149 244 251 411 251 411 328 489 250 410 250 410 329 490 249 409 249 409 330 491 248 408 248 408 331 492 247 407 247 407 252 412 43 57 328 489 251 411 149 244 329 490 250 410 328 489 330 491 249 409 329 490 331 492 248 408 330 491 252 412 247 407 331 492 174 285 175 286 286 446 173 284 174 285 332 493 332 493 286 446 281 441 286 446 332 493 174 285 172 283 173 284 333 494 333 494 332 493 334 495 334 495 281 441 277 437 332 493 333 494 173 284 281 441 334 495 332 493 171 282 172 283 335 496 335 496 333 494 336 497 336 497 334 495 337 498 337 498 277 437 274 434 333 494 335 496 172 283 334 495 336 497 333 494 277 437 337 498 334 495 170 281 171 282 338 499 338 499 335 496 339 500 339 500 336 497 340 501 340 501 337 498 341 502 341 502 274 434 272 432 335 496 338 499 171 282 336 497 339 500 335 496 337 498 340 501 336 497 274 434 341 502 337 498 154 249 170 281 271 431 271 431 338 499 270 430 270 430 339 500 269 429 269 429 340 501 268 428 268 428 341 502 267 427 267 427 272 432 64 94 338 499 271 431 170 281 339 500 270 430 338 499 340 501 269 429 339 500 341 502 268 428 340 501 272 432 267 427 341 502 195 322 196 323 306 466 194 321 195 322 342 503 342 503 306 466 301 461 306 466 342 503 195 322 193 320 194 321 343 504 343 504 342 503 344 505 344 505 301 461 297 457 342 503 343 504 194 321 301 461 344 505 342 503 192 319 193 320 345 506 345 506 343 504 346 507 346 507 344 505 347 508 347 508 297 457 294 454 343 504 345 506 193 320 344 505 346 507 343 504 297 457 347 508 344 505 191 318 192 319 348 509 348 509 345 506 349 510 349 510 346 507 350 511 350 511 347 508 351 512 351 512 294 454 292 452 345 506 348 509 192 319 346 507 349 510 345 506 347 508 350 511 346 507 294 454 351 512 347 508 175 286 191 318 291 451 291 451 348 509 290 450 290 450 349 510 289 449 289 449 350 511 288 448 288 448 351 512 287 447 287 447 292 452 85 131 348 509 291 451 191 318 349 510 290 450 348 509 350 511 289 449 349 510 351 512 288 448 350 511 292 452 287 447 351 512 211 367 127 513 226 514 210 366 211 367 352 515 352 515 226 516 221 517 226 518 352 515 211 367 209 365 210 366 353 519 353 519 352 515 354 520 354 520 221 521 217 522 352 515 353 519 210 366 221 523 354 520 352 515 208 364 209 365 355 524 355 524 353 519 356 525 356 525 354 520 357 526 357 526 217 527 214 528 353 519 355 524 209 365 354 520 356 525 353 519 217 529 357 526 354 520 207 363 208 364 358 530 358 530 355 524 359 531 359 531 356 525 360 532 360 532 357 526 361 533 361 533 214 534 212 535 355 524 358 530 208 364 356 525 359 531 355 524 357 526 360 532 356 525 214 536 361 533 357 526 196 323 207 363 311 472 311 472 358 530 310 471 310 471 359 531 309 470 309 470 360 532 308 469 308 469 361 533 307 468 307 468 212 537 27 538 358 530 311 472 207 363 359 531 310 471 358 530 360 532 309 470 359 531 361 533 308 469 360 532 212 539 307 468 361 533</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Sphere-high">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-low-doublesided.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-low-doublesided.dae
new file mode 100644
index 0000000..d9ca1c4
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-low-doublesided.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/spheres/Sphere-low-doublesided.mb</source_data>
+ </contributor>
+ <created>2008-09-19T21:54:57Z</created>
+ <modified>2008-09-19T21:54:57Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="252">0 50 0 25 42.5325 8.12299 0 42.5325 26.2866 42.5325 22.3607 13.8197 25 26.2866 34.4095 0 22.3607 44.7214 15.4509 42.5325 -21.2663 26.2866 22.3607 -36.1803 40.4509 26.2866 -13.1433 -15.4509 42.5325 -21.2663 -26.2866 22.3607 -36.1803 0 26.2866 -42.5325 -25 42.5325 8.12299 -42.5325 22.3607 13.8197 -40.4509 26.2866 -13.1433 -25 26.2866 34.4095 0 -50 0 15.4509 -42.5325 21.2663 25 -42.5325 -8.12299 26.2866 -22.3607 36.1803 40.4509 -26.2866 13.1433 42.5325 -22.3607 -13.8197 0 -42.5325 -26.2866 25 -26.2866 -34.4095 0 -22.3607 -44.7214 -25 -42.5325 -8.12299 -25 -26.2866 -34.4095 -42.5325 -22.3607 -13.8197 -15.4509 -42.5325 21.2663 -40.4509 -26.2866 13.1433 -26.2866 -22.3607 36.1803 0 -26.2866 42.5325 15.4509 0 47.5528 40.4509 0 29.3893 50 0 0 40.4509 0 -29.3893 15.4509 0 -47.5528 -15.4509 0 -47.5528 -40.4509 0 -29.3893 -50 0 0 -40.4509 0 29.3893 -15.4509 0 47.5528 0 50 0 25 42.5325 8.12299 0 42.5325 26.2866 42.5325 22.3607 13.8197 25 26.2866 34.4095 0 22.3607 44.7214 15.4509 42.5325 -21.2663 26.2866 22.3607 -36.1803 40.4509 26.2866 -13.1433 -15.4509 42.5325 -21.2663 -26.2866 22.3607 -36.1803 0 26.2866 -42.5325 -25 42.5325 8.12299 -42.5325 22.3607 13.8197 -40.4509 26.2866 -13.1433 -25 26.2866 34.4095 0 -50 0 15.4509 -42.5325 21.2663 25 -42.5325 -8.12299 26.2866 -22.3607 36.1803 40.4509 -26.2866 13.1433 42.5325 -22.3607 -13.8197 0 -42.5325 -26.2866 25 -26.2866 -34.4095 0 -22.3607 -44.7214 -25 -42.5325 -8.12299 -25 -26.2866 -34.4095 -42.5325 -22.3607 -13.8197 -15.4509 -42.5325 21.2663 -40.4509 -26.2866 13.1433 -26.2866 -22.3607 36.1803 0 -26.2866 42.5325 15.4509 0 47.5528 40.4509 0 29.3893 50 0 0 40.4509 0 -29.3893 15.4509 0 -47.5528 -15.4509 0 -47.5528 -40.4509 0 -29.3893 -50 0 0 -40.4509 0 29.3893 -15.4509 0 47.5528</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="84" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="252">0 1 0 0.5 0.850651 0.16246 0 0.850651 0.525731 0.850651 0.447214 0.276393 0.5 0.525731 0.688191 0 0.447214 0.894427 0.309017 0.850651 -0.425325 0.525731 0.447214 -0.723607 0.809017 0.525731 -0.262866 -0.309017 0.850651 -0.425325 -0.525731 0.447214 -0.723607 0 0.525731 -0.850651 -0.5 0.850651 0.16246 -0.850651 0.447214 0.276393 -0.809017 0.525731 -0.262866 -0.5 0.525731 0.688191 0 -1 0 0.309017 -0.850651 0.425325 0.5 -0.850651 -0.16246 0.525731 -0.447214 0.723607 0.809017 -0.525731 0.262866 0.850651 -0.447214 -0.276393 0 -0.850651 -0.525731 0.5 -0.525731 -0.688191 0 -0.447214 -0.894427 -0.5 -0.850651 -0.16246 -0.5 -0.525731 -0.688191 -0.850651 -0.447214 -0.276393 -0.309017 -0.850651 0.425325 -0.809017 -0.525731 0.262866 -0.525731 -0.447214 0.723607 0 -0.525731 0.850651 0.309017 0 0.951057 0.809017 0 0.587785 1 0 0 0.809017 0 -0.587785 0.309017 0 -0.951057 -0.309017 0 -0.951057 -0.809017 0 -0.587785 -1 0 0 -0.809017 0 0.587785 -0.309017 0 0.951057 0 -1 0 -0.5 -0.850651 -0.16246 0 -0.850651 -0.525731 -0.850651 -0.447214 -0.276393 -0.5 -0.525731 -0.688191 0 -0.447214 -0.894427 -0.309017 -0.850651 0.425325 -0.525731 -0.447214 0.723607 -0.809017 -0.525731 0.262866 0.309017 -0.850651 0.425325 0.525731 -0.447214 0.723607 0 -0.525731 0.850651 0.5 -0.850651 -0.16246 0.850651 -0.447214 -0.276393 0.809017 -0.525731 0.262866 0.5 -0.525731 -0.688191 0 1 0 -0.309017 0.850651 -0.425325 -0.5 0.850651 0.16246 -0.525731 0.447214 -0.723607 -0.809017 0.525731 -0.262866 -0.850651 0.447214 0.276393 0 0.850651 0.525731 -0.5 0.525731 0.688191 0 0.447214 0.894427 0.5 0.850651 0.16246 0.5 0.525731 0.688191 0.850651 0.447214 0.276393 0.309017 0.850651 -0.425325 0.809017 0.525731 -0.262866 0.525731 0.447214 -0.723607 0 0.525731 -0.850651 -0.309017 0 -0.951057 -0.809017 0 -0.587785 -1 0 0 -0.809017 0 0.587785 -0.309017 0 0.951057 0.309017 0 0.951057 0.809017 0 0.587785 1 0 0 0.809017 0 -0.587785 0.309017 0 -0.951057</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="84" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="268">0.136364 0.833333 0.045454 0.833333 0.090909 1 0.181818 0.666667 0.090909 0.666667 0 0.666667 0.318182 0.833333 0.227273 0.833333 0.272727 1 0.363636 0.666667 0.272727 0.666667 0.227273 0.833333 0.227273 0.833333 0.5 0.833333 0.409091 0.833333 0.454545 1 0.545455 0.666667 0.454545 0.666667 0.409091 0.833333 0.409091 0.833333 0.681818 0.833333 0.590909 0.833333 0.636364 1 0.727273 0.666667 0.636364 0.666667 0.590909 0.833333 0.590909 0.833333 0.863636 0.833333 0.772727 0.833333 0.818182 1 0.909091 0.666667 0.818182 0.666667 0.863636 0.833333 0.772727 0.833333 0.772727 0.833333 0.863636 0.833333 0.136364 0.166667 0.227273 0.166667 0.181818 0 0.090909 0.333333 0.181818 0.333333 0.272727 0.333333 0.318182 0.166667 0.409091 0.166667 0.363636 0 0.363636 0.333333 0.318182 0.166667 0.454545 0.333333 0.318182 0.166667 0.5 0.166667 0.590909 0.166667 0.545455 0 0.545455 0.333333 0.5 0.166667 0.636364 0.333333 0.5 0.166667 0.681818 0.166667 0.772727 0.166667 0.727273 0 0.727273 0.333333 0.681818 0.166667 0.818182 0.333333 0.681818 0.166667 0.863636 0.166667 0.954545 0.166667 0.909091 0 0.909091 0.333333 0.863636 0.166667 1 0.333333 0.954545 0.166667 0.954545 0.166667 0.863636 0.166667 0.045454 0.5 0.136364 0.5 0.227273 0.5 0.318182 0.5 0.409091 0.5 0.5 0.5 0.590909 0.5 0.681818 0.5 0.772727 0.5 0.909091 0.666667 0.863636 0.5 0.954545 0.5 1 0.333333 0.909091 0.666667 0.954545 0.5 0.954545 0.5 0.272727 1 0.227273 0.833333 0.227273 0.833333 0.227273 0.833333 0.454545 1 0.409091 0.833333 0.409091 0.833333 0.409091 0.833333 0.636364 1 0.590909 0.833333 0.590909 0.833333 0.590909 0.833333 0.863636 0.833333 0.818182 1 0.772727 0.833333 0.909091 0.666667 0.863636 0.833333 0.772727 0.833333 0.772727 0.833333 0.863636 0.833333 0.318182 0.166667 0.363636 0 0.318182 0.166667 0.318182 0.166667 0.5 0.166667 0.545455 0 0.5 0.166667 0.5 0.166667 0.681818 0.166667 0.727273 0 0.681818 0.166667 0.681818 0.166667 0.863636 0.166667 0.909091 0 0.954545 0.166667 0.863636 0.166667 0.954545 0.166667 1 0.333333 0.954545 0.166667 0.863636 0.166667 0.909091 0.666667 1 0.333333 0.954545 0.5 0.954545 0.5 0.909091 0.666667 0.954545 0.5</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="134" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="160">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>43 0 44 1 42 2 45 3 46 4 43 0 46 4 47 5 44 1 44 1 43 0 46 4 48 6 43 7 42 8 49 9 50 10 48 6 50 10 45 3 43 11 43 12 48 6 50 10 51 13 48 14 42 15 52 16 53 17 51 13 53 17 49 9 48 18 48 19 51 13 53 17 54 20 51 21 42 22 55 23 56 24 54 20 56 24 52 16 51 25 51 26 54 20 56 24 44 27 54 28 42 29 47 30 57 31 44 32 57 31 55 23 54 33 54 34 44 35 57 31 59 36 60 37 58 38 61 39 62 40 59 36 62 40 63 41 60 37 60 37 59 36 62 40 60 42 64 43 58 44 63 41 65 45 60 46 65 45 66 47 64 43 64 43 60 48 65 45 64 49 67 50 58 51 66 47 68 52 64 53 68 52 69 54 67 50 67 50 64 55 68 52 67 56 70 57 58 58 69 54 71 59 67 60 71 59 72 61 70 57 70 57 67 62 71 59 70 63 59 64 58 65 72 61 73 66 70 67 73 66 61 68 59 69 59 70 70 71 73 66 46 4 74 72 47 5 45 3 75 73 46 4 75 73 61 39 74 72 74 72 46 4 75 73 50 10 76 74 45 3 49 9 77 75 50 10 77 75 63 41 76 74 76 74 50 10 77 75 53 17 78 76 49 9 52 16 79 77 53 17 79 77 66 47 78 76 78 76 53 17 79 77 56 24 80 78 52 16 55 23 81 79 56 24 81 79 69 54 80 78 80 78 56 24 81 79 57 31 82 80 55 23 47 81 83 82 57 31 83 82 72 61 82 80 82 80 57 31 83 82 62 40 76 74 63 41 61 39 75 73 62 40 75 73 45 3 76 74 76 74 62 40 75 73 65 45 78 76 66 47 63 41 77 75 65 45 77 75 49 9 78 76 78 76 65 45 77 75 68 52 80 78 69 54 66 47 79 77 68 52 79 77 52 16 80 78 80 78 68 52 79 77 71 59 82 80 72 61 69 54 81 79 71 59 81 79 55 23 82 80 82 80 71 59 81 79 73 66 74 83 61 84 72 61 83 82 73 66 83 82 47 85 74 86 74 87 73 66 83 82 1 0 0 2 2 1 3 3 1 0 4 4 4 4 2 1 5 5 2 1 4 4 1 0 6 6 0 88 1 89 7 9 6 6 8 10 8 10 1 90 3 3 1 91 8 10 6 6 9 13 0 92 6 93 10 16 9 13 11 17 11 17 6 94 7 9 6 95 11 17 9 13 12 20 0 96 9 97 13 23 12 20 14 24 14 24 9 98 10 16 9 99 14 24 12 20 2 100 0 101 12 102 5 103 2 104 15 31 15 31 12 105 13 23 12 106 15 31 2 107 17 36 16 38 18 37 19 39 17 36 20 40 20 40 18 37 21 41 18 37 20 40 17 36 18 108 16 109 22 43 21 41 18 110 23 45 23 45 22 43 24 47 22 43 23 45 18 111 22 112 16 113 25 50 24 47 22 114 26 52 26 52 25 50 27 54 25 50 26 52 22 115 25 116 16 117 28 57 27 54 25 118 29 59 29 59 28 57 30 61 28 57 29 59 25 119 28 120 16 121 17 122 30 61 28 123 31 66 31 66 17 124 19 125 17 126 31 66 28 127 4 4 5 5 32 72 3 3 4 4 33 73 33 73 32 72 19 39 32 72 33 73 4 4 8 10 3 3 34 74 7 9 8 10 35 75 35 75 34 74 21 41 34 74 35 75 8 10 11 17 7 9 36 76 10 16 11 17 37 77 37 77 36 76 24 47 36 76 37 77 11 17 14 24 10 16 38 78 13 23 14 24 39 79 39 79 38 78 27 54 38 78 39 79 14 24 15 31 13 23 40 80 5 128 15 31 41 82 41 82 40 80 30 61 40 80 41 82 15 31 20 40 21 41 34 74 19 39 20 40 33 73 33 73 34 74 3 3 34 74 33 73 20 40 23 45 24 47 36 76 21 41 23 45 35 75 35 75 36 76 7 9 36 76 35 75 23 45 26 52 27 54 38 78 24 47 26 52 37 77 37 77 38 78 10 16 38 78 37 77 26 52 29 59 30 61 40 80 27 54 29 59 39 79 39 79 40 80 13 23 40 80 39 79 29 59 31 66 19 129 32 130 30 61 31 66 41 82 41 82 32 131 5 132 32 133 41 82 31 66</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Sphere-low-doublesided">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-low-inverted.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-low-inverted.dae
new file mode 100644
index 0000000..68da762
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-low-inverted.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/spheres/Sphere-low-inverted.mb</source_data>
+ </contributor>
+ <created>2008-09-19T21:52:39Z</created>
+ <modified>2008-09-19T21:52:39Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="126">0 50 0 25 42.5325 8.12299 0 42.5325 26.2866 42.5325 22.3607 13.8197 25 26.2866 34.4095 0 22.3607 44.7214 15.4509 42.5325 -21.2663 26.2866 22.3607 -36.1803 40.4509 26.2866 -13.1433 -15.4509 42.5325 -21.2663 -26.2866 22.3607 -36.1803 0 26.2866 -42.5325 -25 42.5325 8.12299 -42.5325 22.3607 13.8197 -40.4509 26.2866 -13.1433 -25 26.2866 34.4095 0 -50 0 15.4509 -42.5325 21.2663 25 -42.5325 -8.12299 26.2866 -22.3607 36.1803 40.4509 -26.2866 13.1433 42.5325 -22.3607 -13.8197 0 -42.5325 -26.2866 25 -26.2866 -34.4095 0 -22.3607 -44.7214 -25 -42.5325 -8.12299 -25 -26.2866 -34.4095 -42.5325 -22.3607 -13.8197 -15.4509 -42.5325 21.2663 -40.4509 -26.2866 13.1433 -26.2866 -22.3607 36.1803 0 -26.2866 42.5325 15.4509 0 47.5528 40.4509 0 29.3893 50 0 0 40.4509 0 -29.3893 15.4509 0 -47.5528 -15.4509 0 -47.5528 -40.4509 0 -29.3893 -50 0 0 -40.4509 0 29.3893 -15.4509 0 47.5528</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="126">0 -1 0 -0.5 -0.850651 -0.16246 0 -0.850651 -0.525731 -0.850651 -0.447214 -0.276393 -0.5 -0.525731 -0.688191 0 -0.447214 -0.894427 -0.309017 -0.850651 0.425325 -0.525731 -0.447214 0.723607 -0.809017 -0.525731 0.262866 0.309017 -0.850651 0.425325 0.525731 -0.447214 0.723607 0 -0.525731 0.850651 0.5 -0.850651 -0.16246 0.850651 -0.447214 -0.276393 0.809017 -0.525731 0.262866 0.5 -0.525731 -0.688191 0 1 0 -0.309017 0.850651 -0.425325 -0.5 0.850651 0.16246 -0.525731 0.447214 -0.723607 -0.809017 0.525731 -0.262866 -0.850651 0.447214 0.276393 0 0.850651 0.525731 -0.5 0.525731 0.688191 0 0.447214 0.894427 0.5 0.850651 0.16246 0.5 0.525731 0.688191 0.850651 0.447214 0.276393 0.309017 0.850651 -0.425325 0.809017 0.525731 -0.262866 0.525731 0.447214 -0.723607 0 0.525731 -0.850651 -0.309017 0 -0.951057 -0.809017 0 -0.587785 -1 0 0 -0.809017 0 0.587785 -0.309017 0 0.951057 0.309017 0 0.951057 0.809017 0 0.587785 1 0 0 0.809017 0 -0.587785 0.309017 0 -0.951057</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="176">0.136364 0.833333 0.045454 0.833333 0.090909 1 0.181818 0.666667 0.090909 0.666667 0 0.666667 0.318182 0.833333 0.227273 0.833333 0.272727 1 0.363636 0.666667 0.272727 0.666667 0.227273 0.833333 0.227273 0.833333 0.5 0.833333 0.409091 0.833333 0.454545 1 0.545455 0.666667 0.454545 0.666667 0.409091 0.833333 0.409091 0.833333 0.681818 0.833333 0.590909 0.833333 0.636364 1 0.727273 0.666667 0.636364 0.666667 0.590909 0.833333 0.590909 0.833333 0.863636 0.833333 0.772727 0.833333 0.818182 1 0.909091 0.666667 0.818182 0.666667 0.863636 0.833333 0.772727 0.833333 0.772727 0.833333 0.863636 0.833333 0.136364 0.166667 0.227273 0.166667 0.181818 0 0.090909 0.333333 0.181818 0.333333 0.272727 0.333333 0.318182 0.166667 0.409091 0.166667 0.363636 0 0.363636 0.333333 0.318182 0.166667 0.454545 0.333333 0.318182 0.166667 0.5 0.166667 0.590909 0.166667 0.545455 0 0.545455 0.333333 0.5 0.166667 0.636364 0.333333 0.5 0.166667 0.681818 0.166667 0.772727 0.166667 0.727273 0 0.727273 0.333333 0.681818 0.166667 0.818182 0.333333 0.681818 0.166667 0.863636 0.166667 0.954545 0.166667 0.909091 0 0.909091 0.333333 0.863636 0.166667 1 0.333333 0.954545 0.166667 0.954545 0.166667 0.863636 0.166667 0.045454 0.5 0.136364 0.5 0.227273 0.5 0.318182 0.5 0.409091 0.5 0.5 0.5 0.590909 0.5 0.681818 0.5 0.772727 0.5 0.909091 0.666667 0.863636 0.5 0.954545 0.5 1 0.333333 0.909091 0.666667 0.954545 0.5 0.954545 0.5</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="88" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="80">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>1 0 2 1 0 2 3 3 4 4 1 0 4 4 5 5 2 1 2 1 1 0 4 4 6 6 1 7 0 8 7 9 8 10 6 6 8 10 3 3 1 11 1 12 6 6 8 10 9 13 6 14 0 15 10 16 11 17 9 13 11 17 7 9 6 18 6 19 9 13 11 17 12 20 9 21 0 22 13 23 14 24 12 20 14 24 10 16 9 25 9 26 12 20 14 24 2 27 12 28 0 29 5 30 15 31 2 32 15 31 13 23 12 33 12 34 2 35 15 31 17 36 18 37 16 38 19 39 20 40 17 36 20 40 21 41 18 37 18 37 17 36 20 40 18 42 22 43 16 44 21 41 23 45 18 46 23 45 24 47 22 43 22 43 18 48 23 45 22 49 25 50 16 51 24 47 26 52 22 53 26 52 27 54 25 50 25 50 22 55 26 52 25 56 28 57 16 58 27 54 29 59 25 60 29 59 30 61 28 57 28 57 25 62 29 59 28 63 17 64 16 65 30 61 31 66 28 67 31 66 19 68 17 69 17 70 28 71 31 66 4 4 32 72 5 5 3 3 33 73 4 4 33 73 19 39 32 72 32 72 4 4 33 73 8 10 34 74 3 3 7 9 35 75 8 10 35 75 21 41 34 74 34 74 8 10 35 75 11 17 36 76 7 9 10 16 37 77 11 17 37 77 24 47 36 76 36 76 11 17 37 77 14 24 38 78 10 16 13 23 39 79 14 24 39 79 27 54 38 78 38 78 14 24 39 79 15 31 40 80 13 23 5 81 41 82 15 31 41 82 30 61 40 80 40 80 15 31 41 82 20 40 34 74 21 41 19 39 33 73 20 40 33 73 3 3 34 74 34 74 20 40 33 73 23 45 36 76 24 47 21 41 35 75 23 45 35 75 7 9 36 76 36 76 23 45 35 75 26 52 38 78 27 54 24 47 37 77 26 52 37 77 10 16 38 78 38 78 26 52 37 77 29 59 40 80 30 61 27 54 39 79 29 59 39 79 13 23 40 80 40 80 29 59 39 79 31 66 32 83 19 84 30 61 41 82 31 66 41 82 5 85 32 86 32 87 31 66 41 82</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Sphere-low-inverted">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-low.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-low.dae
new file mode 100644
index 0000000..2dc7d56
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-low.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-09-19T21:48:50Z</created>
+ <modified>2008-09-19T21:48:50Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="126">0 50 0 25 42.5325 8.12299 0 42.5325 26.2866 42.5325 22.3607 13.8197 25 26.2866 34.4095 0 22.3607 44.7214 15.4509 42.5325 -21.2663 26.2866 22.3607 -36.1803 40.4509 26.2866 -13.1433 -15.4509 42.5325 -21.2663 -26.2866 22.3607 -36.1803 0 26.2866 -42.5325 -25 42.5325 8.12299 -42.5325 22.3607 13.8197 -40.4509 26.2866 -13.1433 -25 26.2866 34.4095 0 -50 0 15.4509 -42.5325 21.2663 25 -42.5325 -8.12299 26.2866 -22.3607 36.1803 40.4509 -26.2866 13.1433 42.5325 -22.3607 -13.8197 0 -42.5325 -26.2866 25 -26.2866 -34.4095 0 -22.3607 -44.7214 -25 -42.5325 -8.12299 -25 -26.2866 -34.4095 -42.5325 -22.3607 -13.8197 -15.4509 -42.5325 21.2663 -40.4509 -26.2866 13.1433 -26.2866 -22.3607 36.1803 0 -26.2866 42.5325 15.4509 0 47.5528 40.4509 0 29.3893 50 0 0 40.4509 0 -29.3893 15.4509 0 -47.5528 -15.4509 0 -47.5528 -40.4509 0 -29.3893 -50 0 0 -40.4509 0 29.3893 -15.4509 0 47.5528</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="126">0 1 0 0.5 0.850651 0.16246 0 0.850651 0.525731 0.850651 0.447214 0.276393 0.5 0.525731 0.688191 0 0.447214 0.894427 0.309017 0.850651 -0.425325 0.525731 0.447214 -0.723607 0.809017 0.525731 -0.262866 -0.309017 0.850651 -0.425325 -0.525731 0.447214 -0.723607 0 0.525731 -0.850651 -0.5 0.850651 0.16246 -0.850651 0.447214 0.276393 -0.809017 0.525731 -0.262866 -0.5 0.525731 0.688191 0 -1 0 0.309017 -0.850651 0.425325 0.5 -0.850651 -0.16246 0.525731 -0.447214 0.723607 0.809017 -0.525731 0.262866 0.850651 -0.447214 -0.276393 0 -0.850651 -0.525731 0.5 -0.525731 -0.688191 0 -0.447214 -0.894427 -0.5 -0.850651 -0.16246 -0.5 -0.525731 -0.688191 -0.850651 -0.447214 -0.276393 -0.309017 -0.850651 0.425325 -0.809017 -0.525731 0.262866 -0.525731 -0.447214 0.723607 0 -0.525731 0.850651 0.309017 0 0.951057 0.809017 0 0.587785 1 0 0 0.809017 0 -0.587785 0.309017 0 -0.951057 -0.309017 0 -0.951057 -0.809017 0 -0.587785 -1 0 0 -0.809017 0 0.587785 -0.309017 0 0.951057</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="42" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="176">0.136364 0.833333 0.090909 1 0.045454 0.833333 0.181818 0.666667 0.090909 0.666667 0 0.666667 0.318182 0.833333 0.272727 1 0.227273 0.833333 0.363636 0.666667 0.272727 0.666667 0.227273 0.833333 0.227273 0.833333 0.5 0.833333 0.454545 1 0.409091 0.833333 0.545455 0.666667 0.454545 0.666667 0.409091 0.833333 0.409091 0.833333 0.681818 0.833333 0.636364 1 0.590909 0.833333 0.727273 0.666667 0.636364 0.666667 0.590909 0.833333 0.590909 0.833333 0.863636 0.833333 0.818182 1 0.772727 0.833333 0.909091 0.666667 0.863636 0.833333 0.818182 0.666667 0.772727 0.833333 0.772727 0.833333 0.863636 0.833333 0.136364 0.166667 0.181818 0 0.227273 0.166667 0.090909 0.333333 0.181818 0.333333 0.272727 0.333333 0.318182 0.166667 0.363636 0 0.409091 0.166667 0.318182 0.166667 0.363636 0.333333 0.454545 0.333333 0.318182 0.166667 0.5 0.166667 0.545455 0 0.590909 0.166667 0.5 0.166667 0.545455 0.333333 0.636364 0.333333 0.5 0.166667 0.681818 0.166667 0.727273 0 0.772727 0.166667 0.681818 0.166667 0.727273 0.333333 0.818182 0.333333 0.681818 0.166667 0.863636 0.166667 0.909091 0 0.954545 0.166667 0.863636 0.166667 0.909091 0.333333 0.954545 0.166667 1 0.333333 0.954545 0.166667 0.863636 0.166667 0.045454 0.5 0.136364 0.5 0.227273 0.5 0.318182 0.5 0.409091 0.5 0.5 0.5 0.590909 0.5 0.681818 0.5 0.772727 0.5 0.909091 0.666667 0.863636 0.5 1 0.333333 0.954545 0.5 0.954545 0.5 0.909091 0.666667 0.954545 0.5</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="88" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="80">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>1 0 0 1 2 2 3 3 1 0 4 4 4 4 2 2 5 5 2 2 4 4 1 0 6 6 0 7 1 8 7 9 6 6 8 10 8 10 1 11 3 3 1 12 8 10 6 6 9 13 0 14 6 15 10 16 9 13 11 17 11 17 6 18 7 9 6 19 11 17 9 13 12 20 0 21 9 22 13 23 12 20 14 24 14 24 9 25 10 16 9 26 14 24 12 20 2 27 0 28 12 29 5 30 2 31 15 32 15 32 12 33 13 23 12 34 15 32 2 35 17 36 16 37 18 38 19 39 17 36 20 40 20 40 18 38 21 41 18 38 20 40 17 36 18 42 16 43 22 44 21 41 18 45 23 46 23 46 22 44 24 47 22 44 23 46 18 48 22 49 16 50 25 51 24 47 22 52 26 53 26 53 25 51 27 54 25 51 26 53 22 55 25 56 16 57 28 58 27 54 25 59 29 60 29 60 28 58 30 61 28 58 29 60 25 62 28 63 16 64 17 65 30 61 28 66 31 67 31 67 17 68 19 69 17 70 31 67 28 71 4 4 5 5 32 72 3 3 4 4 33 73 33 73 32 72 19 39 32 72 33 73 4 4 8 10 3 3 34 74 7 9 8 10 35 75 35 75 34 74 21 41 34 74 35 75 8 10 11 17 7 9 36 76 10 16 11 17 37 77 37 77 36 76 24 47 36 76 37 77 11 17 14 24 10 16 38 78 13 23 14 24 39 79 39 79 38 78 27 54 38 78 39 79 14 24 15 32 13 23 40 80 5 81 15 32 41 82 41 82 40 80 30 61 40 80 41 82 15 32 20 40 21 41 34 74 19 39 20 40 33 73 33 73 34 74 3 3 34 74 33 73 20 40 23 46 24 47 36 76 21 41 23 46 35 75 35 75 36 76 7 9 36 76 35 75 23 46 26 53 27 54 38 78 24 47 26 53 37 77 37 77 38 78 10 16 38 78 37 77 26 53 29 60 30 61 40 80 27 54 29 60 39 79 39 79 40 80 13 23 40 80 39 79 29 60 31 67 19 83 32 84 30 61 31 67 41 82 41 82 32 85 5 86 32 87 41 82 31 67</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-doublesided.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-doublesided.dae
new file mode 100644
index 0000000..bc6374e
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-doublesided.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/spheres/Sphere-medium-doublesided.mb</source_data>
+ </contributor>
+ <created>2008-09-19T22:02:13Z</created>
+ <modified>2008-09-19T22:02:13Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="552">0 50 0 17.1537 46.6335 5.57358 0 46.6335 18.0365 31.9975 36.9875 10.3966 17.8411 39.7327 24.5562 0 36.9875 33.6441 42.5325 22.3607 13.8197 31.9975 25.8403 28.4331 17.1537 25.8403 39.2177 0 22.3607 44.7214 10.6016 46.6335 -14.5918 19.7755 36.9875 -27.2187 28.8675 39.7327 -9.37962 26.2866 22.3607 -36.1803 36.9292 25.8403 -21.6451 42.599 25.8403 -4.19521 -10.6016 46.6335 -14.5918 -19.7755 36.9875 -27.2187 0 39.7327 -30.3531 -26.2866 22.3607 -36.1803 -9.17395 25.8403 -41.8105 9.17395 25.8403 -41.8105 -17.1537 46.6335 5.57358 -31.9975 36.9875 10.3966 -28.8675 39.7327 -9.37962 -42.5325 22.3607 13.8197 -42.599 25.8403 -4.19521 -36.9292 25.8403 -21.6451 -17.8411 39.7327 24.5562 -17.1537 25.8403 39.2177 -31.9975 25.8403 28.4331 0 -50 0 10.6016 -46.6335 14.5918 17.1537 -46.6335 -5.57358 19.7755 -36.9875 27.2187 28.8675 -39.7327 9.37962 31.9975 -36.9875 -10.3966 26.2866 -22.3607 36.1803 36.9292 -25.8403 21.6451 42.599 -25.8403 4.19521 42.5325 -22.3607 -13.8197 0 -46.6335 -18.0365 17.8411 -39.7327 -24.5562 0 -36.9875 -33.6441 31.9975 -25.8403 -28.4331 17.1537 -25.8403 -39.2177 0 -22.3607 -44.7214 -17.1537 -46.6335 -5.57358 -17.8411 -39.7327 -24.5562 -31.9975 -36.9875 -10.3966 -17.1537 -25.8403 -39.2177 -31.9975 -25.8403 -28.4331 -42.5325 -22.3607 -13.8197 -10.6016 -46.6335 14.5918 -28.8675 -39.7327 9.37962 -19.7755 -36.9875 27.2187 -42.599 -25.8403 4.19521 -36.9292 -25.8403 21.6451 -26.2866 -22.3607 36.1803 0 -39.7327 30.3531 -9.17395 -25.8403 41.8105 9.17395 -25.8403 41.8105 10.6016 7.80382 48.236 28.8675 9.37962 39.7327 19.7755 -7.80382 45.2552 42.599 7.80382 24.9884 36.9292 -7.80382 32.7923 49.1512 7.80382 4.82303 46.7086 9.37962 -15.1765 49.1512 -7.80382 -4.82303 36.9292 7.80382 -32.7923 42.599 -7.80382 -24.9884 19.7755 7.80382 -45.2552 0 9.37962 -49.1123 10.6016 -7.80382 -48.236 -19.7755 7.80382 -45.2552 -10.6016 -7.80382 -48.236 -36.9292 7.80382 -32.7923 -46.7086 9.37962 -15.1765 -42.599 -7.80382 -24.9884 -49.1512 7.80382 4.82303 -49.1512 -7.80382 -4.82303 -42.599 7.80382 24.9884 -28.8675 9.37962 39.7327 -36.9292 -7.80382 32.7923 -10.6016 7.80382 48.236 -19.7755 -7.80382 45.2552 46.7086 -9.37962 15.1765 28.8675 -9.37962 -39.7327 -28.8675 -9.37962 -39.7327 -46.7086 -9.37962 15.1765 0 -9.37962 49.1123 0 50 0 17.1537 46.6335 5.57358 0 46.6335 18.0365 31.9975 36.9875 10.3966 17.8411 39.7327 24.5562 0 36.9875 33.6441 42.5325 22.3607 13.8197 31.9975 25.8403 28.4331 17.1537 25.8403 39.2177 0 22.3607 44.7214 10.6016 46.6335 -14.5918 19.7755 36.9875 -27.2187 28.8675 39.7327 -9.37962 26.2866 22.3607 -36.1803 36.9292 25.8403 -21.6451 42.599 25.8403 -4.19521 -10.6016 46.6335 -14.5918 -19.7755 36.9875 -27.2187 0 39.7327 -30.3531 -26.2866 22.3607 -36.1803 -9.17395 25.8403 -41.8105 9.17395 25.8403 -41.8105 -17.1537 46.6335 5.57358 -31.9975 36.9875 10.3966 -28.8675 39.7327 -9.37962 -42.5325 22.3607 13.8197 -42.599 25.8403 -4.19521 -36.9292 25.8403 -21.6451 -17.8411 39.7327 24.5562 -17.1537 25.8403 39.2177 -31.9975 25.8403 28.4331 0 -50 0 10.6016 -46.6335 14.5918 17.1537 -46.6335 -5.57358 19.7755 -36.9875 27.2187 28.8675 -39.7327 9.37962 31.9975 -36.9875 -10.3966 26.2866 -22.3607 36.1803 36.9292 -25.8403 21.6451 42.599 -25.8403 4.19521 42.5325 -22.3607 -13.8197 0 -46.6335 -18.0365 17.8411 -39.7327 -24.5562 0 -36.9875 -33.6441 31.9975 -25.8403 -28.4331 17.1537 -25.8403 -39.2177 0 -22.3607 -44.7214 -17.1537 -46.6335 -5.57358 -17.8411 -39.7327 -24.5562 -31.9975 -36.9875 -10.3966 -17.1537 -25.8403 -39.2177 -31.9975 -25.8403 -28.4331 -42.5325 -22.3607 -13.8197 -10.6016 -46.6335 14.5918 -28.8675 -39.7327 9.37962 -19.7755 -36.9875 27.2187 -42.599 -25.8403 4.19521 -36.9292 -25.8403 21.6451 -26.2866 -22.3607 36.1803 0 -39.7327 30.3531 -9.17395 -25.8403 41.8105 9.17395 -25.8403 41.8105 10.6016 7.80382 48.236 28.8675 9.37962 39.7327 19.7755 -7.80382 45.2552 42.599 7.80382 24.9884 36.9292 -7.80382 32.7923 49.1512 7.80382 4.82303 46.7086 9.37962 -15.1765 49.1512 -7.80382 -4.82303 36.9292 7.80382 -32.7923 42.599 -7.80382 -24.9884 19.7755 7.80382 -45.2552 0 9.37962 -49.1123 10.6016 -7.80382 -48.236 -19.7755 7.80382 -45.2552 -10.6016 -7.80382 -48.236 -36.9292 7.80382 -32.7923 -46.7086 9.37962 -15.1765 -42.599 -7.80382 -24.9884 -49.1512 7.80382 4.82303 -49.1512 -7.80382 -4.82303 -42.599 7.80382 24.9884 -28.8675 9.37962 39.7327 -36.9292 -7.80382 32.7923 -10.6016 7.80382 48.236 -19.7755 -7.80382 45.2552 46.7086 -9.37962 15.1765 28.8675 -9.37962 -39.7327 -28.8675 -9.37962 -39.7327 -46.7086 -9.37962 15.1765 0 -9.37962 49.1123</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="184" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="552">0 1 0 0.334582 0.936075 0.108712 0 0.936075 0.351801 0.646643 0.733285 0.210107 0.356822 0.794655 0.491123 0 0.733285 0.679921 0.850651 0.447214 0.276393 0.646644 0.515861 0.561907 0.334582 0.515861 0.788633 0 0.447213 0.894427 0.206783 0.936075 -0.284613 0.399648 0.733285 -0.550068 0.57735 0.794654 -0.187592 0.525731 0.447214 -0.723607 0.73423 0.515861 -0.441355 0.853426 0.515861 -0.074505 -0.206783 0.936075 -0.284613 -0.399648 0.733285 -0.550068 0 0.794654 -0.607062 -0.525731 0.447214 -0.723607 -0.192864 0.515861 -0.83468 0.192864 0.515861 -0.83468 -0.334582 0.936075 0.108712 -0.646643 0.733285 0.210107 -0.57735 0.794654 -0.187592 -0.850651 0.447214 0.276393 -0.853426 0.515861 -0.074505 -0.73423 0.515861 -0.441355 -0.356822 0.794654 0.491123 -0.334582 0.515861 0.788633 -0.646644 0.515861 0.561907 0 -1 0 0.206783 -0.936075 0.284613 0.334582 -0.936075 -0.108712 0.399648 -0.733285 0.550068 0.57735 -0.794654 0.187592 0.646643 -0.733285 -0.210107 0.525731 -0.447214 0.723607 0.73423 -0.515861 0.441355 0.853426 -0.515861 0.074505 0.850651 -0.447214 -0.276393 0 -0.936075 -0.351801 0.356822 -0.794655 -0.491123 0 -0.733285 -0.679921 0.646644 -0.515861 -0.561907 0.334582 -0.515861 -0.788633 0 -0.447213 -0.894427 -0.334582 -0.936075 -0.108712 -0.356822 -0.794654 -0.491123 -0.646643 -0.733285 -0.210107 -0.334582 -0.515861 -0.788633 -0.646644 -0.515861 -0.561907 -0.850651 -0.447214 -0.276393 -0.206783 -0.936075 0.284613 -0.57735 -0.794654 0.187592 -0.399648 -0.733285 0.550068 -0.853426 -0.515861 0.074505 -0.73423 -0.515861 0.441355 -0.525731 -0.447214 0.723607 0 -0.794654 0.607062 -0.192864 -0.515861 0.83468 0.192864 -0.515861 0.83468 0.206783 0.16406 0.964534 0.57735 0.187592 0.794654 0.399647 -0.16406 0.901868 0.853426 0.16406 0.49472 0.73423 -0.16406 0.65878 0.981225 0.16406 0.101395 0.934172 0.187593 -0.303531 0.981225 -0.16406 -0.101395 0.73423 0.16406 -0.65878 0.853426 -0.16406 -0.49472 0.399647 0.16406 -0.901868 0 0.187592 -0.982247 0.206783 -0.16406 -0.964534 -0.399647 0.16406 -0.901868 -0.206783 -0.16406 -0.964534 -0.73423 0.16406 -0.65878 -0.934172 0.187593 -0.303531 -0.853426 -0.16406 -0.49472 -0.981225 0.16406 0.101395 -0.981225 -0.16406 -0.101395 -0.853426 0.16406 0.49472 -0.57735 0.187592 0.794654 -0.73423 -0.16406 0.65878 -0.206783 0.16406 0.964534 -0.399647 -0.16406 0.901868 0.934172 -0.187593 0.303531 0.57735 -0.187592 -0.794654 -0.57735 -0.187592 -0.794654 -0.934172 -0.187593 0.303531 0 -0.187592 0.982247 0 -1 -0.000000 -0.334582 -0.936075 -0.108712 0 -0.936075 -0.3518 -0.646643 -0.733285 -0.210107 -0.356822 -0.794655 -0.491123 0 -0.733285 -0.679921 -0.850651 -0.447214 -0.276393 -0.646644 -0.515861 -0.561907 -0.334582 -0.515861 -0.788633 0 -0.447213 -0.894427 -0.206783 -0.936075 0.284613 -0.399648 -0.733285 0.550068 -0.57735 -0.794654 0.187592 -0.525731 -0.447214 0.723607 -0.73423 -0.515861 0.441355 -0.853426 -0.515861 0.074505 0.206783 -0.936075 0.284613 0.399648 -0.733285 0.550068 0 -0.794654 0.607062 0.525731 -0.447214 0.723607 0.192864 -0.515861 0.83468 -0.192864 -0.515861 0.83468 0.334582 -0.936075 -0.108712 0.646643 -0.733285 -0.210107 0.57735 -0.794654 0.187592 0.850651 -0.447214 -0.276393 0.853426 -0.515861 0.074505 0.73423 -0.515861 0.441355 0.356822 -0.794655 -0.491123 0.334582 -0.515861 -0.788633 0.646644 -0.515861 -0.561907 0 1 0.000000 -0.206783 0.936075 -0.284613 -0.334582 0.936075 0.108712 -0.399648 0.733285 -0.550068 -0.57735 0.794654 -0.187592 -0.646643 0.733285 0.210107 -0.525731 0.447214 -0.723607 -0.73423 0.515861 -0.441355 -0.853426 0.515861 -0.074505 -0.850651 0.447214 0.276393 0 0.936075 0.3518 -0.356822 0.794655 0.491123 0 0.733285 0.679921 -0.646644 0.515861 0.561907 -0.334582 0.515861 0.788633 0 0.447213 0.894427 0.334582 0.936075 0.108712 0.356822 0.794655 0.491123 0.646643 0.733285 0.210107 0.334582 0.515861 0.788633 0.646644 0.515861 0.561907 0.850651 0.447214 0.276393 0.206783 0.936075 -0.284613 0.57735 0.794654 -0.187592 0.399648 0.733285 -0.550068 0.853426 0.515861 -0.074505 0.73423 0.515861 -0.441355 0.525731 0.447214 -0.723607 0 0.794654 -0.607062 0.192864 0.515861 -0.83468 -0.192864 0.515861 -0.83468 -0.206783 -0.16406 -0.964534 -0.57735 -0.187592 -0.794654 -0.399647 0.16406 -0.901868 -0.853426 -0.16406 -0.49472 -0.73423 0.16406 -0.65878 -0.981225 -0.16406 -0.101395 -0.934172 -0.187593 0.303531 -0.981225 0.16406 0.101395 -0.73423 -0.16406 0.65878 -0.853426 0.16406 0.49472 -0.399647 -0.16406 0.901868 0 -0.187592 0.982247 -0.206783 0.16406 0.964534 0.399647 -0.16406 0.901868 0.206783 0.16406 0.964534 0.73423 -0.16406 0.65878 0.934172 -0.187593 0.303531 0.853426 0.16406 0.49472 0.981225 -0.16406 -0.101395 0.981225 0.16406 0.101395 0.853426 -0.16406 -0.49472 0.57735 -0.187592 -0.794654 0.73423 0.16406 -0.65878 0.206783 -0.16406 -0.964534 0.399647 0.16406 -0.901868 -0.934172 0.187593 -0.303531 -0.57735 0.187592 0.794654 0.57735 0.187592 0.794654 0.934172 0.187593 -0.303531 0 0.187592 -0.982247</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="184" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="500">0.121212 0.888889 0.060606 0.888889 0.090909 1 0.151515 0.777778 0.090909 0.777778 0.030303 0.777778 0.181818 0.666667 0.121212 0.666667 0.060606 0.666667 0 0.666667 0.30303 0.888889 0.242424 0.888889 0.272727 1 0.333333 0.777778 0.272727 0.777778 0.212121 0.777778 0.242424 0.888889 0.242424 0.888889 0.363636 0.666667 0.30303 0.666667 0.242424 0.666667 0.212121 0.777778 0.212121 0.777778 0.484848 0.888889 0.424242 0.888889 0.454545 1 0.515152 0.777778 0.454545 0.777778 0.393939 0.777778 0.424242 0.888889 0.424242 0.888889 0.545455 0.666667 0.484848 0.666667 0.424242 0.666667 0.393939 0.777778 0.393939 0.777778 0.666667 0.888889 0.606061 0.888889 0.636364 1 0.69697 0.777778 0.636364 0.777778 0.575758 0.777778 0.606061 0.888889 0.606061 0.888889 0.727273 0.666667 0.666667 0.666667 0.606061 0.666667 0.575758 0.777778 0.575758 0.777778 0.848485 0.888889 0.787879 0.888889 0.818182 1 0.878788 0.777778 0.818182 0.777778 0.848485 0.888889 0.757576 0.777778 0.787879 0.888889 0.787879 0.888889 0.848485 0.888889 0.909091 0.666667 0.848485 0.666667 0.878788 0.777778 0.787879 0.666667 0.757576 0.777778 0.878788 0.777778 0.757576 0.777778 0.151515 0.111111 0.212121 0.111111 0.181818 0 0.121212 0.222222 0.181818 0.222222 0.242424 0.222222 0.090909 0.333333 0.151515 0.333333 0.212121 0.333333 0.272727 0.333333 0.333333 0.111111 0.393939 0.111111 0.363636 0 0.30303 0.222222 0.363636 0.222222 0.333333 0.111111 0.424242 0.222222 0.333333 0.111111 0.333333 0.333333 0.30303 0.222222 0.393939 0.333333 0.454545 0.333333 0.30303 0.222222 0.515152 0.111111 0.575758 0.111111 0.545455 0 0.484848 0.222222 0.545455 0.222222 0.515152 0.111111 0.606061 0.222222 0.515152 0.111111 0.515152 0.333333 0.484848 0.222222 0.575758 0.333333 0.636364 0.333333 0.484848 0.222222 0.69697 0.111111 0.757576 0.111111 0.727273 0 0.666667 0.222222 0.727273 0.222222 0.69697 0.111111 0.787879 0.222222 0.69697 0.111111 0.69697 0.333333 0.666667 0.222222 0.757576 0.333333 0.818182 0.333333 0.666667 0.222222 0.878788 0.111111 0.939394 0.111111 0.909091 0 0.848485 0.222222 0.909091 0.222222 0.878788 0.111111 0.969697 0.222222 0.939394 0.111111 0.939394 0.111111 0.878788 0.111111 0.878788 0.333333 0.848485 0.222222 0.939394 0.333333 1 0.333333 0.969697 0.222222 0.848485 0.222222 0.969697 0.222222 0.030303 0.555556 0.090909 0.555556 0.060606 0.444444 0.151515 0.555556 0.121212 0.444444 0.212121 0.555556 0.272727 0.555556 0.242424 0.444444 0.333333 0.555556 0.30303 0.444444 0.393939 0.555556 0.454545 0.555556 0.424242 0.444444 0.515152 0.555556 0.484848 0.444444 0.575758 0.555556 0.636364 0.555556 0.606061 0.444444 0.69697 0.555556 0.666667 0.444444 0.757576 0.555556 0.818182 0.555556 0.787879 0.444444 0.909091 0.666667 0.878788 0.555556 0.848485 0.444444 0.181818 0.444444 0.363636 0.444444 0.545455 0.444444 0.727273 0.444444 0.969697 0.444444 1 0.333333 0.909091 0.444444 0.939394 0.555556 0.969697 0.444444 0.969697 0.444444 0.909091 0.666667 0.939394 0.555556 0.939394 0.555556 0.272727 1 0.242424 0.888889 0.242424 0.888889 0.212121 0.777778 0.242424 0.888889 0.212121 0.777778 0.212121 0.777778 0.454545 1 0.424242 0.888889 0.424242 0.888889 0.393939 0.777778 0.424242 0.888889 0.393939 0.777778 0.393939 0.777778 0.636364 1 0.606061 0.888889 0.606061 0.888889 0.575758 0.777778 0.606061 0.888889 0.575758 0.777778 0.575758 0.777778 0.848485 0.888889 0.818182 1 0.787879 0.888889 0.878788 0.777778 0.848485 0.888889 0.787879 0.888889 0.757576 0.777778 0.787879 0.888889 0.848485 0.888889 0.909091 0.666667 0.878788 0.777778 0.757576 0.777778 0.878788 0.777778 0.757576 0.777778 0.333333 0.111111 0.363636 0 0.30303 0.222222 0.333333 0.111111 0.333333 0.111111 0.30303 0.222222 0.30303 0.222222 0.515152 0.111111 0.545455 0 0.484848 0.222222 0.515152 0.111111 0.515152 0.111111 0.484848 0.222222 0.484848 0.222222 0.69697 0.111111 0.727273 0 0.666667 0.222222 0.69697 0.111111 0.69697 0.111111 0.666667 0.222222 0.666667 0.222222 0.878788 0.111111 0.909091 0 0.939394 0.111111 0.848485 0.222222 0.878788 0.111111 0.939394 0.111111 0.969697 0.222222 0.939394 0.111111 0.878788 0.111111 0.848485 0.222222 0.969697 0.222222 1 0.333333 0.848485 0.222222 0.969697 0.222222 0.909091 0.666667 1 0.333333 0.969697 0.444444 0.969697 0.444444 0.939394 0.555556 0.969697 0.444444 0.939394 0.555556 0.909091 0.666667 0.939394 0.555556</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="250" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="360">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>93 0 94 1 92 2 95 3 96 4 93 0 96 4 97 5 94 1 94 1 93 0 96 4 98 6 99 7 95 3 99 7 100 8 96 4 100 8 101 9 97 5 96 4 95 3 99 7 97 5 96 4 100 8 102 10 93 11 92 12 103 13 104 14 102 10 104 14 95 15 93 16 93 17 102 10 104 14 105 18 106 19 103 13 106 19 107 20 104 14 107 20 98 6 95 21 104 14 103 13 106 19 95 22 104 14 107 20 108 23 102 24 92 25 109 26 110 27 108 23 110 27 103 28 102 29 102 30 108 23 110 27 111 31 112 32 109 26 112 32 113 33 110 27 113 33 105 18 103 34 110 27 109 26 112 32 103 35 110 27 113 33 114 36 108 37 92 38 115 39 116 40 114 36 116 40 109 41 108 42 108 43 114 36 116 40 117 44 118 45 115 39 118 45 119 46 116 40 119 46 111 31 109 47 116 40 115 39 118 45 109 48 116 40 119 46 94 49 114 50 92 51 97 52 120 53 94 54 120 53 115 55 114 56 114 57 94 58 120 53 101 59 121 60 97 61 121 60 122 62 120 53 122 62 117 44 115 63 120 53 97 64 121 60 115 65 120 53 122 62 124 66 125 67 123 68 126 69 127 70 124 66 127 70 128 71 125 67 125 67 124 66 127 70 129 72 130 73 126 69 130 73 131 74 127 70 131 74 132 75 128 71 127 70 126 69 130 73 128 71 127 70 131 74 125 76 133 77 123 78 128 79 134 80 125 81 134 80 135 82 133 77 133 77 125 83 134 80 132 75 136 84 128 85 136 84 137 86 134 80 137 86 138 87 135 82 134 80 128 88 136 84 135 82 134 80 137 86 133 89 139 90 123 91 135 92 140 93 133 94 140 93 141 95 139 90 139 90 133 96 140 93 138 87 142 97 135 98 142 97 143 99 140 93 143 99 144 100 141 95 140 93 135 101 142 97 141 95 140 93 143 99 139 102 145 103 123 104 141 105 146 106 139 107 146 106 147 108 145 103 145 103 139 109 146 106 144 100 148 110 141 111 148 110 149 112 146 106 149 112 150 113 147 108 146 106 141 114 148 110 147 108 146 106 149 112 145 115 124 116 123 117 147 118 151 119 145 120 151 119 126 121 124 122 124 123 145 124 151 119 150 113 152 125 147 126 152 125 153 127 151 119 153 127 129 128 126 129 151 119 147 130 152 125 126 131 151 119 153 127 100 8 154 132 101 9 99 7 155 133 100 8 155 133 156 134 154 132 154 132 100 8 155 133 98 6 157 135 99 7 157 135 158 136 155 133 158 136 129 72 156 134 155 133 99 7 157 135 156 134 155 133 158 136 107 20 159 137 98 6 106 19 160 138 107 20 160 138 161 139 159 137 159 137 107 20 160 138 105 18 162 140 106 19 162 140 163 141 160 138 163 141 132 75 161 139 160 138 106 19 162 140 161 139 160 138 163 141 113 33 164 142 105 18 112 32 165 143 113 33 165 143 166 144 164 142 164 142 113 33 165 143 111 31 167 145 112 32 167 145 168 146 165 143 168 146 138 87 166 144 165 143 112 32 167 145 166 144 165 143 168 146 119 46 169 147 111 31 118 45 170 148 119 46 170 148 171 149 169 147 169 147 119 46 170 148 117 44 172 150 118 45 172 150 173 151 170 148 173 151 144 100 171 149 170 148 118 45 172 150 171 149 170 148 173 151 122 62 174 152 117 44 121 60 175 153 122 62 175 153 176 154 174 152 174 152 122 62 175 153 101 155 177 156 121 60 177 156 178 157 175 153 178 157 150 113 176 154 175 153 121 60 177 156 176 154 175 153 178 157 131 74 161 139 132 75 130 73 179 158 131 74 179 158 159 137 161 139 161 139 131 74 179 158 129 72 158 136 130 73 158 136 157 135 179 158 157 135 98 6 159 137 179 158 130 73 158 136 159 137 179 158 157 135 137 86 166 144 138 87 136 84 180 159 137 86 180 159 164 142 166 144 166 144 137 86 180 159 132 75 163 141 136 84 163 141 162 140 180 159 162 140 105 18 164 142 180 159 136 84 163 141 164 142 180 159 162 140 143 99 171 149 144 100 142 97 181 160 143 99 181 160 169 147 171 149 171 149 143 99 181 160 138 87 168 146 142 97 168 146 167 145 181 160 167 145 111 31 169 147 181 160 142 97 168 146 169 147 181 160 167 145 149 112 176 154 150 113 148 110 182 161 149 112 182 161 174 152 176 154 176 154 149 112 182 161 144 100 173 151 148 110 173 151 172 150 182 161 172 150 117 44 174 152 182 161 148 110 173 151 174 152 182 161 172 150 153 127 156 162 129 163 152 125 183 164 153 127 183 164 154 165 156 166 156 167 153 127 183 164 150 113 178 157 152 125 178 157 177 156 183 164 177 156 101 168 154 169 183 164 152 125 178 157 154 170 183 164 177 156 1 0 0 2 2 1 3 3 1 0 4 4 4 4 2 1 5 5 2 1 4 4 1 0 6 6 3 3 7 7 7 7 4 4 8 8 8 8 5 5 9 9 4 4 7 7 3 3 5 5 8 8 4 4 10 10 0 171 1 172 11 13 10 10 12 14 12 14 1 173 3 174 1 175 12 14 10 10 13 18 11 13 14 19 14 19 12 14 15 20 15 20 3 176 6 6 12 14 14 19 11 13 3 177 15 20 12 14 16 23 0 178 10 179 17 26 16 23 18 27 18 27 10 180 11 181 10 182 18 27 16 23 19 31 17 26 20 32 20 32 18 27 21 33 21 33 11 183 13 18 18 27 20 32 17 26 11 184 21 33 18 27 22 36 0 185 16 186 23 39 22 36 24 40 24 40 16 187 17 188 16 189 24 40 22 36 25 44 23 39 26 45 26 45 24 40 27 46 27 46 17 190 19 31 24 40 26 45 23 39 17 191 27 46 24 40 2 192 0 193 22 194 5 195 2 196 28 53 28 53 22 197 23 198 22 199 28 53 2 200 9 201 5 202 29 60 29 60 28 53 30 62 30 62 23 203 25 44 28 53 29 60 5 204 23 205 30 62 28 53 32 66 31 68 33 67 34 69 32 66 35 70 35 70 33 67 36 71 33 67 35 70 32 66 37 72 34 69 38 73 38 73 35 70 39 74 39 74 36 71 40 75 35 70 38 73 34 69 36 71 39 74 35 70 33 206 31 207 41 77 36 208 33 209 42 80 42 80 41 77 43 82 41 77 42 80 33 210 40 75 36 211 44 84 44 84 42 80 45 86 45 86 43 82 46 87 42 80 44 84 36 212 43 82 45 86 42 80 41 213 31 214 47 90 43 215 41 216 48 93 48 93 47 90 49 95 47 90 48 93 41 217 46 87 43 218 50 97 50 97 48 93 51 99 51 99 49 95 52 100 48 93 50 97 43 219 49 95 51 99 48 93 47 220 31 221 53 103 49 222 47 223 54 106 54 106 53 103 55 108 53 103 54 106 47 224 52 100 49 225 56 110 56 110 54 106 57 112 57 112 55 108 58 113 54 106 56 110 49 226 55 108 57 112 54 106 53 227 31 228 32 229 55 230 53 231 59 119 59 119 32 232 34 233 32 234 59 119 53 235 58 113 55 236 60 125 60 125 59 119 61 127 61 127 34 237 37 238 59 119 60 125 55 239 34 240 61 127 59 119 8 8 9 9 62 132 7 7 8 8 63 133 63 133 62 132 64 134 62 132 63 133 8 8 6 6 7 7 65 135 65 135 63 133 66 136 66 136 64 134 37 72 63 133 65 135 7 7 64 134 66 136 63 133 15 20 6 6 67 137 14 19 15 20 68 138 68 138 67 137 69 139 67 137 68 138 15 20 13 18 14 19 70 140 70 140 68 138 71 141 71 141 69 139 40 75 68 138 70 140 14 19 69 139 71 141 68 138 21 33 13 18 72 142 20 32 21 33 73 143 73 143 72 142 74 144 72 142 73 143 21 33 19 31 20 32 75 145 75 145 73 143 76 146 76 146 74 144 46 87 73 143 75 145 20 32 74 144 76 146 73 143 27 46 19 31 77 147 26 45 27 46 78 148 78 148 77 147 79 149 77 147 78 148 27 46 25 44 26 45 80 150 80 150 78 148 81 151 81 151 79 149 52 100 78 148 80 150 26 45 79 149 81 151 78 148 30 62 25 44 82 152 29 60 30 62 83 153 83 153 82 152 84 154 82 152 83 153 30 62 9 241 29 60 85 156 85 156 83 153 86 157 86 157 84 154 58 113 83 153 85 156 29 60 84 154 86 157 83 153 39 74 40 75 69 139 38 73 39 74 87 158 87 158 69 139 67 137 69 139 87 158 39 74 37 72 38 73 66 136 66 136 87 158 65 135 65 135 67 137 6 6 87 158 66 136 38 73 67 137 65 135 87 158 45 86 46 87 74 144 44 84 45 86 88 159 88 159 74 144 72 142 74 144 88 159 45 86 40 75 44 84 71 141 71 141 88 159 70 140 70 140 72 142 13 18 88 159 71 141 44 84 72 142 70 140 88 159 51 99 52 100 79 149 50 97 51 99 89 160 89 160 79 149 77 147 79 149 89 160 51 99 46 87 50 97 76 146 76 146 89 160 75 145 75 145 77 147 19 31 89 160 76 146 50 97 77 147 75 145 89 160 57 112 58 113 84 154 56 110 57 112 90 161 90 161 84 154 82 152 84 154 90 161 57 112 52 100 56 110 81 151 81 151 90 161 80 150 80 150 82 152 25 44 90 161 81 151 56 110 82 152 80 150 90 161 61 127 37 242 64 243 60 125 61 127 91 164 91 164 64 244 62 245 64 246 91 164 61 127 58 113 60 125 86 157 86 157 91 164 85 156 85 156 62 247 9 248 91 164 86 157 60 125 62 249 85 156 91 164</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Sphere-medium-doublesided">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-inverted.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-inverted.dae
new file mode 100644
index 0000000..4af5f46
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium-inverted.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-09-19T22:01:10Z</created>
+ <modified>2008-09-19T22:01:10Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="276">0 50 0 17.1537 46.6335 5.57358 0 46.6335 18.0365 31.9975 36.9875 10.3966 17.8411 39.7327 24.5562 0 36.9875 33.6441 42.5325 22.3607 13.8197 31.9975 25.8403 28.4331 17.1537 25.8403 39.2177 0 22.3607 44.7214 10.6016 46.6335 -14.5918 19.7755 36.9875 -27.2187 28.8675 39.7327 -9.37962 26.2866 22.3607 -36.1803 36.9292 25.8403 -21.6451 42.599 25.8403 -4.19521 -10.6016 46.6335 -14.5918 -19.7755 36.9875 -27.2187 0 39.7327 -30.3531 -26.2866 22.3607 -36.1803 -9.17395 25.8403 -41.8105 9.17395 25.8403 -41.8105 -17.1537 46.6335 5.57358 -31.9975 36.9875 10.3966 -28.8675 39.7327 -9.37962 -42.5325 22.3607 13.8197 -42.599 25.8403 -4.19521 -36.9292 25.8403 -21.6451 -17.8411 39.7327 24.5562 -17.1537 25.8403 39.2177 -31.9975 25.8403 28.4331 0 -50 0 10.6016 -46.6335 14.5918 17.1537 -46.6335 -5.57358 19.7755 -36.9875 27.2187 28.8675 -39.7327 9.37962 31.9975 -36.9875 -10.3966 26.2866 -22.3607 36.1803 36.9292 -25.8403 21.6451 42.599 -25.8403 4.19521 42.5325 -22.3607 -13.8197 0 -46.6335 -18.0365 17.8411 -39.7327 -24.5562 0 -36.9875 -33.6441 31.9975 -25.8403 -28.4331 17.1537 -25.8403 -39.2177 0 -22.3607 -44.7214 -17.1537 -46.6335 -5.57358 -17.8411 -39.7327 -24.5562 -31.9975 -36.9875 -10.3966 -17.1537 -25.8403 -39.2177 -31.9975 -25.8403 -28.4331 -42.5325 -22.3607 -13.8197 -10.6016 -46.6335 14.5918 -28.8675 -39.7327 9.37962 -19.7755 -36.9875 27.2187 -42.599 -25.8403 4.19521 -36.9292 -25.8403 21.6451 -26.2866 -22.3607 36.1803 0 -39.7327 30.3531 -9.17395 -25.8403 41.8105 9.17395 -25.8403 41.8105 10.6016 7.80382 48.236 28.8675 9.37962 39.7327 19.7755 -7.80382 45.2552 42.599 7.80382 24.9884 36.9292 -7.80382 32.7923 49.1512 7.80382 4.82303 46.7086 9.37962 -15.1765 49.1512 -7.80382 -4.82303 36.9292 7.80382 -32.7923 42.599 -7.80382 -24.9884 19.7755 7.80382 -45.2552 0 9.37962 -49.1123 10.6016 -7.80382 -48.236 -19.7755 7.80382 -45.2552 -10.6016 -7.80382 -48.236 -36.9292 7.80382 -32.7923 -46.7086 9.37962 -15.1765 -42.599 -7.80382 -24.9884 -49.1512 7.80382 4.82303 -49.1512 -7.80382 -4.82303 -42.599 7.80382 24.9884 -28.8675 9.37962 39.7327 -36.9292 -7.80382 32.7923 -10.6016 7.80382 48.236 -19.7755 -7.80382 45.2552 46.7086 -9.37962 15.1765 28.8675 -9.37962 -39.7327 -28.8675 -9.37962 -39.7327 -46.7086 -9.37962 15.1765 0 -9.37962 49.1123</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="92" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="276">0 -1 -0.000000 -0.334582 -0.936075 -0.108712 0 -0.936075 -0.3518 -0.646643 -0.733285 -0.210107 -0.356822 -0.794655 -0.491123 0 -0.733285 -0.679921 -0.850651 -0.447214 -0.276393 -0.646644 -0.515861 -0.561907 -0.334582 -0.515861 -0.788633 0 -0.447213 -0.894427 -0.206783 -0.936075 0.284613 -0.399648 -0.733285 0.550068 -0.57735 -0.794654 0.187592 -0.525731 -0.447214 0.723607 -0.73423 -0.515861 0.441355 -0.853426 -0.515861 0.074505 0.206783 -0.936075 0.284613 0.399648 -0.733285 0.550068 0 -0.794654 0.607062 0.525731 -0.447214 0.723607 0.192864 -0.515861 0.83468 -0.192864 -0.515861 0.83468 0.334582 -0.936075 -0.108712 0.646643 -0.733285 -0.210107 0.57735 -0.794654 0.187592 0.850651 -0.447214 -0.276393 0.853426 -0.515861 0.074505 0.73423 -0.515861 0.441355 0.356822 -0.794655 -0.491123 0.334582 -0.515861 -0.788633 0.646644 -0.515861 -0.561907 0 1 0.000000 -0.206783 0.936075 -0.284613 -0.334582 0.936075 0.108712 -0.399648 0.733285 -0.550068 -0.57735 0.794654 -0.187592 -0.646643 0.733285 0.210107 -0.525731 0.447214 -0.723607 -0.73423 0.515861 -0.441355 -0.853426 0.515861 -0.074505 -0.850651 0.447214 0.276393 0 0.936075 0.3518 -0.356822 0.794655 0.491123 0 0.733285 0.679921 -0.646644 0.515861 0.561907 -0.334582 0.515861 0.788633 0 0.447213 0.894427 0.334582 0.936075 0.108712 0.356822 0.794655 0.491123 0.646643 0.733285 0.210107 0.334582 0.515861 0.788633 0.646644 0.515861 0.561907 0.850651 0.447214 0.276393 0.206783 0.936075 -0.284613 0.57735 0.794654 -0.187592 0.399648 0.733285 -0.550068 0.853426 0.515861 -0.074505 0.73423 0.515861 -0.441355 0.525731 0.447214 -0.723607 0 0.794654 -0.607062 0.192864 0.515861 -0.83468 -0.192864 0.515861 -0.83468 -0.206783 -0.16406 -0.964534 -0.57735 -0.187592 -0.794654 -0.399647 0.16406 -0.901868 -0.853426 -0.16406 -0.49472 -0.73423 0.16406 -0.65878 -0.981225 -0.16406 -0.101395 -0.934172 -0.187593 0.303531 -0.981225 0.16406 0.101395 -0.73423 -0.16406 0.65878 -0.853426 0.16406 0.49472 -0.399647 -0.16406 0.901868 0 -0.187592 0.982247 -0.206783 0.16406 0.964534 0.399647 -0.16406 0.901868 0.206783 0.16406 0.964534 0.73423 -0.16406 0.65878 0.934172 -0.187593 0.303531 0.853426 0.16406 0.49472 0.981225 -0.16406 -0.101395 0.981225 0.16406 0.101395 0.853426 -0.16406 -0.49472 0.57735 -0.187592 -0.794654 0.73423 0.16406 -0.65878 0.206783 -0.16406 -0.964534 0.399647 0.16406 -0.901868 -0.934172 0.187593 -0.303531 -0.57735 0.187592 0.794654 0.57735 0.187592 0.794654 0.934172 0.187593 -0.303531 0 0.187592 -0.982247</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="92" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="342">0.121212 0.888889 0.060606 0.888889 0.090909 1 0.151515 0.777778 0.090909 0.777778 0.030303 0.777778 0.181818 0.666667 0.121212 0.666667 0.060606 0.666667 0 0.666667 0.30303 0.888889 0.242424 0.888889 0.272727 1 0.333333 0.777778 0.272727 0.777778 0.212121 0.777778 0.242424 0.888889 0.242424 0.888889 0.363636 0.666667 0.30303 0.666667 0.242424 0.666667 0.212121 0.777778 0.212121 0.777778 0.484848 0.888889 0.424242 0.888889 0.454545 1 0.515152 0.777778 0.454545 0.777778 0.393939 0.777778 0.424242 0.888889 0.424242 0.888889 0.545455 0.666667 0.484848 0.666667 0.424242 0.666667 0.393939 0.777778 0.393939 0.777778 0.666667 0.888889 0.606061 0.888889 0.636364 1 0.69697 0.777778 0.636364 0.777778 0.575758 0.777778 0.606061 0.888889 0.606061 0.888889 0.727273 0.666667 0.666667 0.666667 0.606061 0.666667 0.575758 0.777778 0.575758 0.777778 0.848485 0.888889 0.787879 0.888889 0.818182 1 0.878788 0.777778 0.818182 0.777778 0.848485 0.888889 0.757576 0.777778 0.787879 0.888889 0.787879 0.888889 0.848485 0.888889 0.909091 0.666667 0.848485 0.666667 0.878788 0.777778 0.787879 0.666667 0.757576 0.777778 0.878788 0.777778 0.757576 0.777778 0.151515 0.111111 0.212121 0.111111 0.181818 0 0.121212 0.222222 0.181818 0.222222 0.242424 0.222222 0.090909 0.333333 0.151515 0.333333 0.212121 0.333333 0.272727 0.333333 0.333333 0.111111 0.393939 0.111111 0.363636 0 0.30303 0.222222 0.363636 0.222222 0.333333 0.111111 0.424242 0.222222 0.333333 0.111111 0.333333 0.333333 0.30303 0.222222 0.393939 0.333333 0.454545 0.333333 0.30303 0.222222 0.515152 0.111111 0.575758 0.111111 0.545455 0 0.484848 0.222222 0.545455 0.222222 0.515152 0.111111 0.606061 0.222222 0.515152 0.111111 0.515152 0.333333 0.484848 0.222222 0.575758 0.333333 0.636364 0.333333 0.484848 0.222222 0.69697 0.111111 0.757576 0.111111 0.727273 0 0.666667 0.222222 0.727273 0.222222 0.69697 0.111111 0.787879 0.222222 0.69697 0.111111 0.69697 0.333333 0.666667 0.222222 0.757576 0.333333 0.818182 0.333333 0.666667 0.222222 0.878788 0.111111 0.939394 0.111111 0.909091 0 0.848485 0.222222 0.909091 0.222222 0.878788 0.111111 0.969697 0.222222 0.939394 0.111111 0.939394 0.111111 0.878788 0.111111 0.878788 0.333333 0.848485 0.222222 0.939394 0.333333 1 0.333333 0.969697 0.222222 0.848485 0.222222 0.969697 0.222222 0.030303 0.555556 0.090909 0.555556 0.060606 0.444444 0.151515 0.555556 0.121212 0.444444 0.212121 0.555556 0.272727 0.555556 0.242424 0.444444 0.333333 0.555556 0.30303 0.444444 0.393939 0.555556 0.454545 0.555556 0.424242 0.444444 0.515152 0.555556 0.484848 0.444444 0.575758 0.555556 0.636364 0.555556 0.606061 0.444444 0.69697 0.555556 0.666667 0.444444 0.757576 0.555556 0.818182 0.555556 0.787879 0.444444 0.909091 0.666667 0.878788 0.555556 0.848485 0.444444 0.181818 0.444444 0.363636 0.444444 0.545455 0.444444 0.727273 0.444444 0.969697 0.444444 1 0.333333 0.909091 0.444444 0.939394 0.555556 0.969697 0.444444 0.969697 0.444444 0.909091 0.666667 0.939394 0.555556 0.939394 0.555556</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="171" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="180">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>1 0 2 1 0 2 3 3 4 4 1 0 4 4 5 5 2 1 2 1 1 0 4 4 6 6 7 7 3 3 7 7 8 8 4 4 8 8 9 9 5 5 4 4 3 3 7 7 5 5 4 4 8 8 10 10 1 11 0 12 11 13 12 14 10 10 12 14 3 15 1 16 1 17 10 10 12 14 13 18 14 19 11 13 14 19 15 20 12 14 15 20 6 6 3 21 12 14 11 13 14 19 3 22 12 14 15 20 16 23 10 24 0 25 17 26 18 27 16 23 18 27 11 28 10 29 10 30 16 23 18 27 19 31 20 32 17 26 20 32 21 33 18 27 21 33 13 18 11 34 18 27 17 26 20 32 11 35 18 27 21 33 22 36 16 37 0 38 23 39 24 40 22 36 24 40 17 41 16 42 16 43 22 36 24 40 25 44 26 45 23 39 26 45 27 46 24 40 27 46 19 31 17 47 24 40 23 39 26 45 17 48 24 40 27 46 2 49 22 50 0 51 5 52 28 53 2 54 28 53 23 55 22 56 22 57 2 58 28 53 9 59 29 60 5 61 29 60 30 62 28 53 30 62 25 44 23 63 28 53 5 64 29 60 23 65 28 53 30 62 32 66 33 67 31 68 34 69 35 70 32 66 35 70 36 71 33 67 33 67 32 66 35 70 37 72 38 73 34 69 38 73 39 74 35 70 39 74 40 75 36 71 35 70 34 69 38 73 36 71 35 70 39 74 33 76 41 77 31 78 36 79 42 80 33 81 42 80 43 82 41 77 41 77 33 83 42 80 40 75 44 84 36 85 44 84 45 86 42 80 45 86 46 87 43 82 42 80 36 88 44 84 43 82 42 80 45 86 41 89 47 90 31 91 43 92 48 93 41 94 48 93 49 95 47 90 47 90 41 96 48 93 46 87 50 97 43 98 50 97 51 99 48 93 51 99 52 100 49 95 48 93 43 101 50 97 49 95 48 93 51 99 47 102 53 103 31 104 49 105 54 106 47 107 54 106 55 108 53 103 53 103 47 109 54 106 52 100 56 110 49 111 56 110 57 112 54 106 57 112 58 113 55 108 54 106 49 114 56 110 55 108 54 106 57 112 53 115 32 116 31 117 55 118 59 119 53 120 59 119 34 121 32 122 32 123 53 124 59 119 58 113 60 125 55 126 60 125 61 127 59 119 61 127 37 128 34 129 59 119 55 130 60 125 34 131 59 119 61 127 8 8 62 132 9 9 7 7 63 133 8 8 63 133 64 134 62 132 62 132 8 8 63 133 6 6 65 135 7 7 65 135 66 136 63 133 66 136 37 72 64 134 63 133 7 7 65 135 64 134 63 133 66 136 15 20 67 137 6 6 14 19 68 138 15 20 68 138 69 139 67 137 67 137 15 20 68 138 13 18 70 140 14 19 70 140 71 141 68 138 71 141 40 75 69 139 68 138 14 19 70 140 69 139 68 138 71 141 21 33 72 142 13 18 20 32 73 143 21 33 73 143 74 144 72 142 72 142 21 33 73 143 19 31 75 145 20 32 75 145 76 146 73 143 76 146 46 87 74 144 73 143 20 32 75 145 74 144 73 143 76 146 27 46 77 147 19 31 26 45 78 148 27 46 78 148 79 149 77 147 77 147 27 46 78 148 25 44 80 150 26 45 80 150 81 151 78 148 81 151 52 100 79 149 78 148 26 45 80 150 79 149 78 148 81 151 30 62 82 152 25 44 29 60 83 153 30 62 83 153 84 154 82 152 82 152 30 62 83 153 9 155 85 156 29 60 85 156 86 157 83 153 86 157 58 113 84 154 83 153 29 60 85 156 84 154 83 153 86 157 39 74 69 139 40 75 38 73 87 158 39 74 87 158 67 137 69 139 69 139 39 74 87 158 37 72 66 136 38 73 66 136 65 135 87 158 65 135 6 6 67 137 87 158 38 73 66 136 67 137 87 158 65 135 45 86 74 144 46 87 44 84 88 159 45 86 88 159 72 142 74 144 74 144 45 86 88 159 40 75 71 141 44 84 71 141 70 140 88 159 70 140 13 18 72 142 88 159 44 84 71 141 72 142 88 159 70 140 51 99 79 149 52 100 50 97 89 160 51 99 89 160 77 147 79 149 79 149 51 99 89 160 46 87 76 146 50 97 76 146 75 145 89 160 75 145 19 31 77 147 89 160 50 97 76 146 77 147 89 160 75 145 57 112 84 154 58 113 56 110 90 161 57 112 90 161 82 152 84 154 84 154 57 112 90 161 52 100 81 151 56 110 81 151 80 150 90 161 80 150 25 44 82 152 90 161 56 110 81 151 82 152 90 161 80 150 61 127 64 162 37 163 60 125 91 164 61 127 91 164 62 165 64 166 64 167 61 127 91 164 58 113 86 157 60 125 86 157 85 156 91 164 85 156 9 168 62 169 91 164 60 125 86 157 62 170 91 164 85 156</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium.dae
new file mode 100644
index 0000000..4e1446e
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-medium.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/spheres/Sphere-medium.mb</source_data>
+ </contributor>
+ <created>2008-09-19T21:56:36Z</created>
+ <modified>2008-09-19T21:56:36Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert1" name="lambert1">
+ <instance_effect url="#lambert1-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert1-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="276">0 50 0 17.1537 46.6335 5.57358 0 46.6335 18.0365 31.9975 36.9875 10.3966 17.8411 39.7327 24.5562 0 36.9875 33.6441 42.5325 22.3607 13.8197 31.9975 25.8403 28.4331 17.1537 25.8403 39.2177 0 22.3607 44.7214 10.6016 46.6335 -14.5918 19.7755 36.9875 -27.2187 28.8675 39.7327 -9.37962 26.2866 22.3607 -36.1803 36.9292 25.8403 -21.6451 42.599 25.8403 -4.19521 -10.6016 46.6335 -14.5918 -19.7755 36.9875 -27.2187 0 39.7327 -30.3531 -26.2866 22.3607 -36.1803 -9.17395 25.8403 -41.8105 9.17395 25.8403 -41.8105 -17.1537 46.6335 5.57358 -31.9975 36.9875 10.3966 -28.8675 39.7327 -9.37962 -42.5325 22.3607 13.8197 -42.599 25.8403 -4.19521 -36.9292 25.8403 -21.6451 -17.8411 39.7327 24.5562 -17.1537 25.8403 39.2177 -31.9975 25.8403 28.4331 0 -50 0 10.6016 -46.6335 14.5918 17.1537 -46.6335 -5.57358 19.7755 -36.9875 27.2187 28.8675 -39.7327 9.37962 31.9975 -36.9875 -10.3966 26.2866 -22.3607 36.1803 36.9292 -25.8403 21.6451 42.599 -25.8403 4.19521 42.5325 -22.3607 -13.8197 0 -46.6335 -18.0365 17.8411 -39.7327 -24.5562 0 -36.9875 -33.6441 31.9975 -25.8403 -28.4331 17.1537 -25.8403 -39.2177 0 -22.3607 -44.7214 -17.1537 -46.6335 -5.57358 -17.8411 -39.7327 -24.5562 -31.9975 -36.9875 -10.3966 -17.1537 -25.8403 -39.2177 -31.9975 -25.8403 -28.4331 -42.5325 -22.3607 -13.8197 -10.6016 -46.6335 14.5918 -28.8675 -39.7327 9.37962 -19.7755 -36.9875 27.2187 -42.599 -25.8403 4.19521 -36.9292 -25.8403 21.6451 -26.2866 -22.3607 36.1803 0 -39.7327 30.3531 -9.17395 -25.8403 41.8105 9.17395 -25.8403 41.8105 10.6016 7.80382 48.236 28.8675 9.37962 39.7327 19.7755 -7.80382 45.2552 42.599 7.80382 24.9884 36.9292 -7.80382 32.7923 49.1512 7.80382 4.82303 46.7086 9.37962 -15.1765 49.1512 -7.80382 -4.82303 36.9292 7.80382 -32.7923 42.599 -7.80382 -24.9884 19.7755 7.80382 -45.2552 0 9.37962 -49.1123 10.6016 -7.80382 -48.236 -19.7755 7.80382 -45.2552 -10.6016 -7.80382 -48.236 -36.9292 7.80382 -32.7923 -46.7086 9.37962 -15.1765 -42.599 -7.80382 -24.9884 -49.1512 7.80382 4.82303 -49.1512 -7.80382 -4.82303 -42.599 7.80382 24.9884 -28.8675 9.37962 39.7327 -36.9292 -7.80382 32.7923 -10.6016 7.80382 48.236 -19.7755 -7.80382 45.2552 46.7086 -9.37962 15.1765 28.8675 -9.37962 -39.7327 -28.8675 -9.37962 -39.7327 -46.7086 -9.37962 15.1765 0 -9.37962 49.1123</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="92" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="276">0 1 0 0.334582 0.936075 0.108712 0 0.936075 0.351801 0.646643 0.733285 0.210107 0.356822 0.794655 0.491123 0 0.733285 0.679921 0.850651 0.447214 0.276393 0.646644 0.515861 0.561907 0.334582 0.515861 0.788633 0 0.447213 0.894427 0.206783 0.936075 -0.284613 0.399648 0.733285 -0.550068 0.57735 0.794654 -0.187592 0.525731 0.447214 -0.723607 0.73423 0.515861 -0.441355 0.853426 0.515861 -0.074505 -0.206783 0.936075 -0.284613 -0.399648 0.733285 -0.550068 0 0.794654 -0.607062 -0.525731 0.447214 -0.723607 -0.192864 0.515861 -0.83468 0.192864 0.515861 -0.83468 -0.334582 0.936075 0.108712 -0.646643 0.733285 0.210107 -0.57735 0.794654 -0.187592 -0.850651 0.447214 0.276393 -0.853426 0.515861 -0.074505 -0.73423 0.515861 -0.441355 -0.356822 0.794654 0.491123 -0.334582 0.515861 0.788633 -0.646644 0.515861 0.561907 0 -1 0 0.206783 -0.936075 0.284613 0.334582 -0.936075 -0.108712 0.399648 -0.733285 0.550068 0.57735 -0.794654 0.187592 0.646643 -0.733285 -0.210107 0.525731 -0.447214 0.723607 0.73423 -0.515861 0.441355 0.853426 -0.515861 0.074505 0.850651 -0.447214 -0.276393 0 -0.936075 -0.351801 0.356822 -0.794655 -0.491123 0 -0.733285 -0.679921 0.646644 -0.515861 -0.561907 0.334582 -0.515861 -0.788633 0 -0.447213 -0.894427 -0.334582 -0.936075 -0.108712 -0.356822 -0.794654 -0.491123 -0.646643 -0.733285 -0.210107 -0.334582 -0.515861 -0.788633 -0.646644 -0.515861 -0.561907 -0.850651 -0.447214 -0.276393 -0.206783 -0.936075 0.284613 -0.57735 -0.794654 0.187592 -0.399648 -0.733285 0.550068 -0.853426 -0.515861 0.074505 -0.73423 -0.515861 0.441355 -0.525731 -0.447214 0.723607 0 -0.794654 0.607062 -0.192864 -0.515861 0.83468 0.192864 -0.515861 0.83468 0.206783 0.16406 0.964534 0.57735 0.187592 0.794654 0.399647 -0.16406 0.901868 0.853426 0.16406 0.49472 0.73423 -0.16406 0.65878 0.981225 0.16406 0.101395 0.934172 0.187593 -0.303531 0.981225 -0.16406 -0.101395 0.73423 0.16406 -0.65878 0.853426 -0.16406 -0.49472 0.399647 0.16406 -0.901868 0 0.187592 -0.982247 0.206783 -0.16406 -0.964534 -0.399647 0.16406 -0.901868 -0.206783 -0.16406 -0.964534 -0.73423 0.16406 -0.65878 -0.934172 0.187593 -0.303531 -0.853426 -0.16406 -0.49472 -0.981225 0.16406 0.101395 -0.981225 -0.16406 -0.101395 -0.853426 0.16406 0.49472 -0.57735 0.187592 0.794654 -0.73423 -0.16406 0.65878 -0.206783 0.16406 0.964534 -0.399647 -0.16406 0.901868 0.934172 -0.187593 0.303531 0.57735 -0.187592 -0.794654 -0.57735 -0.187592 -0.794654 -0.934172 -0.187593 0.303531 0 -0.187592 0.982247</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="92" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="342">0.121212 0.888889 0.090909 1 0.060606 0.888889 0.151515 0.777778 0.090909 0.777778 0.030303 0.777778 0.181818 0.666667 0.121212 0.666667 0.060606 0.666667 0 0.666667 0.30303 0.888889 0.272727 1 0.242424 0.888889 0.333333 0.777778 0.272727 0.777778 0.242424 0.888889 0.212121 0.777778 0.242424 0.888889 0.363636 0.666667 0.30303 0.666667 0.242424 0.666667 0.212121 0.777778 0.212121 0.777778 0.484848 0.888889 0.454545 1 0.424242 0.888889 0.515152 0.777778 0.454545 0.777778 0.424242 0.888889 0.393939 0.777778 0.424242 0.888889 0.545455 0.666667 0.484848 0.666667 0.424242 0.666667 0.393939 0.777778 0.393939 0.777778 0.666667 0.888889 0.636364 1 0.606061 0.888889 0.69697 0.777778 0.636364 0.777778 0.606061 0.888889 0.575758 0.777778 0.606061 0.888889 0.727273 0.666667 0.666667 0.666667 0.606061 0.666667 0.575758 0.777778 0.575758 0.777778 0.848485 0.888889 0.818182 1 0.787879 0.888889 0.878788 0.777778 0.848485 0.888889 0.818182 0.777778 0.787879 0.888889 0.757576 0.777778 0.787879 0.888889 0.848485 0.888889 0.909091 0.666667 0.878788 0.777778 0.848485 0.666667 0.787879 0.666667 0.757576 0.777778 0.878788 0.777778 0.757576 0.777778 0.151515 0.111111 0.181818 0 0.212121 0.111111 0.121212 0.222222 0.181818 0.222222 0.242424 0.222222 0.090909 0.333333 0.151515 0.333333 0.212121 0.333333 0.272727 0.333333 0.333333 0.111111 0.363636 0 0.393939 0.111111 0.30303 0.222222 0.333333 0.111111 0.363636 0.222222 0.424242 0.222222 0.333333 0.111111 0.30303 0.222222 0.333333 0.333333 0.393939 0.333333 0.454545 0.333333 0.30303 0.222222 0.515152 0.111111 0.545455 0 0.575758 0.111111 0.484848 0.222222 0.515152 0.111111 0.545455 0.222222 0.606061 0.222222 0.515152 0.111111 0.484848 0.222222 0.515152 0.333333 0.575758 0.333333 0.636364 0.333333 0.484848 0.222222 0.69697 0.111111 0.727273 0 0.757576 0.111111 0.666667 0.222222 0.69697 0.111111 0.727273 0.222222 0.787879 0.222222 0.69697 0.111111 0.666667 0.222222 0.69697 0.333333 0.757576 0.333333 0.818182 0.333333 0.666667 0.222222 0.878788 0.111111 0.909091 0 0.939394 0.111111 0.848485 0.222222 0.878788 0.111111 0.909091 0.222222 0.939394 0.111111 0.969697 0.222222 0.939394 0.111111 0.878788 0.111111 0.848485 0.222222 0.878788 0.333333 0.939394 0.333333 0.969697 0.222222 1 0.333333 0.848485 0.222222 0.969697 0.222222 0.030303 0.555556 0.090909 0.555556 0.060606 0.444444 0.151515 0.555556 0.121212 0.444444 0.212121 0.555556 0.272727 0.555556 0.242424 0.444444 0.333333 0.555556 0.30303 0.444444 0.393939 0.555556 0.454545 0.555556 0.424242 0.444444 0.515152 0.555556 0.484848 0.444444 0.575758 0.555556 0.636364 0.555556 0.606061 0.444444 0.69697 0.555556 0.666667 0.444444 0.757576 0.555556 0.818182 0.555556 0.787879 0.444444 0.909091 0.666667 0.878788 0.555556 0.848485 0.444444 0.181818 0.444444 0.363636 0.444444 0.545455 0.444444 0.727273 0.444444 1 0.333333 0.969697 0.444444 0.909091 0.444444 0.969697 0.444444 0.939394 0.555556 0.969697 0.444444 0.939394 0.555556 0.909091 0.666667 0.939394 0.555556</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="171" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="initialShadingGroup" count="180">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>1 0 0 1 2 2 3 3 1 0 4 4 4 4 2 2 5 5 2 2 4 4 1 0 6 6 3 3 7 7 7 7 4 4 8 8 8 8 5 5 9 9 4 4 7 7 3 3 5 5 8 8 4 4 10 10 0 11 1 12 11 13 10 10 12 14 12 14 1 15 3 16 1 17 12 14 10 10 13 18 11 13 14 19 14 19 12 14 15 20 15 20 3 21 6 6 12 14 14 19 11 13 3 22 15 20 12 14 16 23 0 24 10 25 17 26 16 23 18 27 18 27 10 28 11 29 10 30 18 27 16 23 19 31 17 26 20 32 20 32 18 27 21 33 21 33 11 34 13 18 18 27 20 32 17 26 11 35 21 33 18 27 22 36 0 37 16 38 23 39 22 36 24 40 24 40 16 41 17 42 16 43 24 40 22 36 25 44 23 39 26 45 26 45 24 40 27 46 27 46 17 47 19 31 24 40 26 45 23 39 17 48 27 46 24 40 2 49 0 50 22 51 5 52 2 53 28 54 28 54 22 55 23 56 22 57 28 54 2 58 9 59 5 60 29 61 29 61 28 54 30 62 30 62 23 63 25 44 28 54 29 61 5 64 23 65 30 62 28 54 32 66 31 67 33 68 34 69 32 66 35 70 35 70 33 68 36 71 33 68 35 70 32 66 37 72 34 69 38 73 38 73 35 70 39 74 39 74 36 71 40 75 35 70 38 73 34 69 36 71 39 74 35 70 33 76 31 77 41 78 36 79 33 80 42 81 42 81 41 78 43 82 41 78 42 81 33 83 40 75 36 84 44 85 44 85 42 81 45 86 45 86 43 82 46 87 42 81 44 85 36 88 43 82 45 86 42 81 41 89 31 90 47 91 43 92 41 93 48 94 48 94 47 91 49 95 47 91 48 94 41 96 46 87 43 97 50 98 50 98 48 94 51 99 51 99 49 95 52 100 48 94 50 98 43 101 49 95 51 99 48 94 47 102 31 103 53 104 49 105 47 106 54 107 54 107 53 104 55 108 53 104 54 107 47 109 52 100 49 110 56 111 56 111 54 107 57 112 57 112 55 108 58 113 54 107 56 111 49 114 55 108 57 112 54 107 53 115 31 116 32 117 55 118 53 119 59 120 59 120 32 121 34 122 32 123 59 120 53 124 58 113 55 125 60 126 60 126 59 120 61 127 61 127 34 128 37 129 59 120 60 126 55 130 34 131 61 127 59 120 8 8 9 9 62 132 7 7 8 8 63 133 63 133 62 132 64 134 62 132 63 133 8 8 6 6 7 7 65 135 65 135 63 133 66 136 66 136 64 134 37 72 63 133 65 135 7 7 64 134 66 136 63 133 15 20 6 6 67 137 14 19 15 20 68 138 68 138 67 137 69 139 67 137 68 138 15 20 13 18 14 19 70 140 70 140 68 138 71 141 71 141 69 139 40 75 68 138 70 140 14 19 69 139 71 141 68 138 21 33 13 18 72 142 20 32 21 33 73 143 73 143 72 142 74 144 72 142 73 143 21 33 19 31 20 32 75 145 75 145 73 143 76 146 76 146 74 144 46 87 73 143 75 145 20 32 74 144 76 146 73 143 27 46 19 31 77 147 26 45 27 46 78 148 78 148 77 147 79 149 77 147 78 148 27 46 25 44 26 45 80 150 80 150 78 148 81 151 81 151 79 149 52 100 78 148 80 150 26 45 79 149 81 151 78 148 30 62 25 44 82 152 29 61 30 62 83 153 83 153 82 152 84 154 82 152 83 153 30 62 9 155 29 61 85 156 85 156 83 153 86 157 86 157 84 154 58 113 83 153 85 156 29 61 84 154 86 157 83 153 39 74 40 75 69 139 38 73 39 74 87 158 87 158 69 139 67 137 69 139 87 158 39 74 37 72 38 73 66 136 66 136 87 158 65 135 65 135 67 137 6 6 87 158 66 136 38 73 67 137 65 135 87 158 45 86 46 87 74 144 44 85 45 86 88 159 88 159 74 144 72 142 74 144 88 159 45 86 40 75 44 85 71 141 71 141 88 159 70 140 70 140 72 142 13 18 88 159 71 141 44 85 72 142 70 140 88 159 51 99 52 100 79 149 50 98 51 99 89 160 89 160 79 149 77 147 79 149 89 160 51 99 46 87 50 98 76 146 76 146 89 160 75 145 75 145 77 147 19 31 89 160 76 146 50 98 77 147 75 145 89 160 57 112 58 113 84 154 56 111 57 112 90 161 90 161 84 154 82 152 84 154 90 161 57 112 52 100 56 111 81 151 81 151 90 161 80 150 80 150 82 152 25 44 90 161 81 151 56 111 82 152 80 150 90 161 61 127 37 162 64 163 60 126 61 127 91 164 91 164 64 165 62 166 64 167 91 164 61 127 58 113 60 126 86 157 86 157 91 164 85 156 85 156 62 168 9 169 91 164 86 157 60 126 62 170 85 156 91 164</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Sphere-medium">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="initialShadingGroup" target="#lambert1"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Spheres/Sphere-planerUVprojection.dae b/Studio/Content/Models Library/Primitives/Spheres/Sphere-planerUVprojection.dae
new file mode 100644
index 0000000..fe6c096
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Spheres/Sphere-planerUVprojection.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Documents%20and%20Settings/jgiles/My%20Documents/maya/projects/default/untitled</source_data>
+ </contributor>
+ <created>2008-10-21T18:16:28Z</created>
+ <modified>2008-10-21T18:16:28Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="spherePlanerProjection" name="spherePlanerProjection">
+ <instance_effect url="#spherePlanerProjection-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="spherePlanerProjection-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0.2 0.2 0.2 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Sphere" name="Sphere">
+ <mesh>
+ <source id="Sphere-positions" name="position">
+ <float_array id="Sphere-positions-array" count="486">0 50 0 12.9946 48.0969 4.2222 0 48.0969 13.6633 25 42.5325 8.12299 13.1433 44.7214 18.0902 0 42.5325 26.2866 35.1023 33.7304 11.4054 26.2866 36.1803 22.3607 13.1433 36.1803 31.9098 0 33.7304 36.9088 42.5325 22.3607 13.8197 35.1023 25.286 25.0688 25 26.2866 34.4095 12.9946 25.286 41.131 0 22.3607 44.7214 8.0311 48.0969 -11.0539 15.4509 42.5325 -21.2663 21.2663 44.7214 -6.90983 21.6944 33.7304 -29.8598 29.3893 36.1803 -18.0902 34.4095 36.1803 -2.63932 26.2866 22.3607 -36.1803 34.689 25.286 -25.6376 40.4509 26.2866 -13.1433 43.1334 25.286 0.351573 -8.0311 48.0969 -11.0539 -15.4509 42.5325 -21.2663 0 44.7214 -22.3607 -21.6944 33.7304 -29.8598 -8.12299 36.1803 -33.541 8.12299 36.1803 -33.541 -26.2866 22.3607 -36.1803 -13.6633 25.286 -40.9137 0 26.2866 -42.5325 13.6633 25.286 -40.9137 -12.9946 48.0969 4.2222 -25 42.5325 8.12299 -21.2663 44.7214 -6.90983 -35.1023 33.7304 11.4054 -34.4095 36.1803 -2.63932 -29.3893 36.1803 -18.0902 -42.5325 22.3607 13.8197 -43.1334 25.286 0.351573 -40.4509 26.2866 -13.1433 -34.689 25.286 -25.6376 -13.1433 44.7214 18.0902 -13.1433 36.1803 31.9098 -26.2866 36.1803 22.3607 -12.9946 25.286 41.131 -25 26.2866 34.4095 -35.1023 25.286 25.0688 0 -50 0 8.0311 -48.0969 11.0539 12.9946 -48.0969 -4.2222 15.4509 -42.5325 21.2663 21.2663 -44.7214 6.90983 25 -42.5325 -8.12299 21.6944 -33.7304 29.8598 29.3893 -36.1803 18.0902 34.4095 -36.1803 2.63932 35.1023 -33.7304 -11.4054 26.2866 -22.3607 36.1803 34.689 -25.286 25.6376 40.4509 -26.2866 13.1433 43.1334 -25.286 -0.351573 42.5325 -22.3607 -13.8197 0 -48.0969 -13.6633 13.1433 -44.7214 -18.0902 0 -42.5325 -26.2866 26.2866 -36.1803 -22.3607 13.1433 -36.1803 -31.9098 0 -33.7304 -36.9088 35.1023 -25.286 -25.0688 25 -26.2866 -34.4095 12.9946 -25.286 -41.131 0 -22.3607 -44.7214 -12.9946 -48.0969 -4.2222 -13.1433 -44.7214 -18.0902 -25 -42.5325 -8.12299 -13.1433 -36.1803 -31.9098 -26.2866 -36.1803 -22.3607 -35.1023 -33.7304 -11.4054 -12.9946 -25.286 -41.131 -25 -26.2866 -34.4095 -35.1023 -25.286 -25.0688 -42.5325 -22.3607 -13.8197 -8.0311 -48.0969 11.0539 -21.2663 -44.7214 6.90983 -15.4509 -42.5325 21.2663 -34.4095 -36.1803 2.63932 -29.3893 -36.1803 18.0902 -21.6944 -33.7304 29.8598 -43.1334 -25.286 -0.351573 -40.4509 -26.2866 13.1433 -34.689 -25.286 25.6376 -26.2866 -22.3607 36.1803 0 -44.7214 22.3607 -8.12299 -36.1803 33.541 8.12299 -36.1803 33.541 -13.6633 -25.286 40.9137 0 -26.2866 42.5325 13.6633 -25.286 40.9137 8.0311 11.6227 47.9626 21.2663 13.8197 43.0902 15.4509 0 47.5528 34.4095 13.8197 33.541 29.3893 0 40.4509 21.6944 -11.6227 43.5231 43.1334 11.6227 22.4593 40.4509 0 29.3893 34.689 -11.6227 34.082 48.0969 11.6227 7.18324 47.5528 13.8197 -6.90983 50 0 0 42.5325 13.8197 -22.3607 47.5528 0 -15.4509 48.0969 -11.6227 -7.18324 34.689 11.6227 -34.082 40.4509 0 -29.3893 43.1334 -11.6227 -22.4593 21.6944 11.6227 -43.5231 8.12299 13.8197 -47.3607 15.4509 0 -47.5528 -8.12299 13.8197 -47.3607 0 0 -50 8.0311 -11.6227 -47.9626 -21.6944 11.6227 -43.5231 -15.4509 0 -47.5528 -8.0311 -11.6227 -47.9626 -34.689 11.6227 -34.082 -42.5325 13.8197 -22.3607 -40.4509 0 -29.3893 -47.5528 13.8197 -6.90983 -47.5528 0 -15.4509 -43.1334 -11.6227 -22.4593 -48.0969 11.6227 7.18324 -50 0 0 -48.0969 -11.6227 -7.18324 -43.1334 11.6227 22.4593 -34.4095 13.8197 33.541 -40.4509 0 29.3893 -21.2663 13.8197 43.0902 -29.3893 0 40.4509 -34.689 -11.6227 34.082 -8.0311 11.6227 47.9626 -15.4509 0 47.5528 -21.6944 -11.6227 43.5231 47.5528 -13.8197 6.90983 42.5325 -13.8197 22.3607 47.5528 0 15.4509 21.2663 -13.8197 -43.0902 34.4095 -13.8197 -33.541 29.3893 0 -40.4509 -34.4095 -13.8197 -33.541 -21.2663 -13.8197 -43.0902 -29.3893 0 -40.4509 -42.5325 -13.8197 22.3607 -47.5528 -13.8197 6.90983 -47.5528 0 15.4509 8.12299 -13.8197 47.3607 -8.12299 -13.8197 47.3607 0 0 50</float_array>
+ <technique_common>
+ <accessor source="#Sphere-positions-array" count="162" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-normals" name="normal">
+ <float_array id="Sphere-normals-array" count="486">0 1 0 0.247736 0.965478 0.080494 0 0.965478 0.260485 0.5 0.850651 0.16246 0.269751 0.888474 0.37128 0 0.850651 0.525731 0.710494 0.664759 0.230853 0.514508 0.729421 0.450807 0.269751 0.729421 0.628633 0 0.66476 0.747057 0.850651 0.447214 0.276393 0.710494 0.503771 0.491338 0.5 0.525731 0.688191 0.247736 0.503771 0.827552 0 0.447214 0.894427 0.153109 0.965478 -0.210737 0.309017 0.850651 -0.425326 0.436466 0.888474 -0.141816 0.439109 0.66476 -0.604382 0.587735 0.729421 -0.35002 0.681224 0.729421 -0.062289 0.525731 0.447214 -0.723607 0.686845 0.503771 -0.523888 0.809017 0.525731 -0.262865 0.863603 0.503771 0.020116 -0.153109 0.965478 -0.210737 -0.309017 0.850651 -0.425326 0 0.888474 -0.458928 -0.439109 0.66476 -0.604382 -0.151268 0.729421 -0.667131 0.151268 0.729421 -0.667131 -0.525731 0.447214 -0.723607 -0.286 0.503771 -0.815119 0 0.525731 -0.850651 0.286 0.503771 -0.815119 -0.247736 0.965478 0.080494 -0.5 0.850651 0.16246 -0.436466 0.888474 -0.141816 -0.710494 0.66476 0.230853 -0.681224 0.729421 -0.062289 -0.587735 0.729421 -0.35002 -0.850651 0.447214 0.276393 -0.863603 0.503771 0.020116 -0.809017 0.525731 -0.262865 -0.686845 0.503771 -0.523888 -0.269751 0.888474 0.37128 -0.269751 0.729421 0.628633 -0.514508 0.729421 0.450807 -0.247736 0.503771 0.827552 -0.5 0.525731 0.688191 -0.710494 0.503771 0.491338 0 -1 0 0.153109 -0.965478 0.210737 0.247736 -0.965478 -0.080494 0.309017 -0.850651 0.425326 0.436466 -0.888474 0.141816 0.5 -0.850651 -0.16246 0.439109 -0.66476 0.604382 0.587735 -0.729421 0.35002 0.681224 -0.729421 0.062289 0.710494 -0.66476 -0.230853 0.525731 -0.447214 0.723607 0.686845 -0.503771 0.523888 0.809017 -0.525731 0.262865 0.863603 -0.503771 -0.020116 0.850651 -0.447214 -0.276393 0 -0.965478 -0.260485 0.269751 -0.888474 -0.37128 0 -0.850651 -0.525731 0.514508 -0.729421 -0.450807 0.269751 -0.729421 -0.628633 0 -0.66476 -0.747057 0.710494 -0.503771 -0.491338 0.5 -0.525731 -0.688191 0.247736 -0.503771 -0.827552 0 -0.447214 -0.894427 -0.247736 -0.965478 -0.080494 -0.269751 -0.888474 -0.37128 -0.5 -0.850651 -0.16246 -0.269751 -0.729421 -0.628633 -0.514508 -0.729421 -0.450807 -0.710494 -0.664759 -0.230853 -0.247736 -0.503771 -0.827552 -0.5 -0.525731 -0.688191 -0.710494 -0.503771 -0.491338 -0.850651 -0.447214 -0.276393 -0.153109 -0.965478 0.210737 -0.436466 -0.888474 0.141816 -0.309017 -0.850651 0.425326 -0.681224 -0.729421 0.062289 -0.587735 -0.729421 0.35002 -0.439109 -0.66476 0.604382 -0.863603 -0.503771 -0.020116 -0.809017 -0.525731 0.262865 -0.686845 -0.503771 0.523888 -0.525731 -0.447214 0.723607 0 -0.888474 0.458928 -0.151268 -0.729421 0.667131 0.151268 -0.729421 0.667131 -0.286 -0.503771 0.815119 0 -0.525731 0.850651 0.286 -0.503771 0.815119 0.153109 0.243286 0.957794 0.436466 0.270493 0.858097 0.309017 0 0.951057 0.681224 0.270493 0.680271 0.587735 0.013139 0.808947 0.439109 -0.243286 0.864867 0.863603 0.243286 0.44159 0.809017 0.000000 0.587785 0.686845 -0.243286 0.684876 0.95823 0.243286 0.150359 0.950974 0.270493 -0.149937 1 0 0 0.857485 0.270493 -0.437667 0.950975 0.01314 -0.30899 0.95823 -0.243286 -0.150359 0.686845 0.243286 -0.684876 0.809017 -0.000000 -0.587785 0.863603 -0.243286 -0.44159 0.439109 0.243286 -0.864867 0.151268 0.270493 -0.950764 0.309017 0 -0.951057 -0.151268 0.270493 -0.950764 0 0.013139 -0.999914 0.153109 -0.243286 -0.957794 -0.439109 0.243286 -0.864867 -0.309017 0 -0.951057 -0.153109 -0.243286 -0.957794 -0.686845 0.243286 -0.684876 -0.857485 0.270493 -0.437667 -0.809017 -0.000000 -0.587785 -0.950974 0.270493 -0.149937 -0.950975 0.01314 -0.30899 -0.863603 -0.243286 -0.44159 -0.95823 0.243286 0.150359 -1 0 0 -0.95823 -0.243286 -0.150359 -0.863603 0.243286 0.44159 -0.681224 0.270493 0.680271 -0.809017 0.000000 0.587785 -0.436466 0.270493 0.858097 -0.587735 0.013139 0.808947 -0.686845 -0.243286 0.684876 -0.153109 0.243286 0.957794 -0.309017 0 0.951057 -0.439109 -0.243286 0.864867 0.950974 -0.270493 0.149937 0.857485 -0.270493 0.437667 0.950975 -0.01314 0.30899 0.436466 -0.270493 -0.858097 0.681224 -0.270493 -0.680271 0.587735 -0.013139 -0.808947 -0.681224 -0.270493 -0.680271 -0.436466 -0.270493 -0.858097 -0.587735 -0.013139 -0.808947 -0.857485 -0.270493 0.437667 -0.950974 -0.270493 0.149937 -0.950975 -0.01314 0.30899 0.151268 -0.270493 0.950764 -0.151268 -0.270493 0.950764 0 -0.013139 0.999914</float_array>
+ <technique_common>
+ <accessor source="#Sphere-normals-array" count="162" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Sphere-Texture" name="Texture">
+ <float_array id="Sphere-Texture-array" count="306">0.629946 0.980969 0.5 1 0.5 0.980969 0.75 0.925325 0.631433 0.947214 0.5 0.925325 0.851023 0.837304 0.762866 0.861803 0.631433 0.861803 0.5 0.837304 0.925325 0.723607 0.851023 0.75286 0.75 0.762866 0.629946 0.75286 0.5 0.723607 0.580311 0.980969 0.654508 0.925325 0.712663 0.947214 0.716944 0.837304 0.793893 0.861803 0.844095 0.861803 0.762866 0.723607 0.84689 0.75286 0.904508 0.762866 0.931334 0.75286 0.419689 0.980969 0.345491 0.925325 0.5 0.947214 0.283056 0.837304 0.41877 0.861803 0.58123 0.861803 0.237134 0.723607 0.363367 0.75286 0.5 0.762866 0.636633 0.75286 0.370054 0.980969 0.25 0.925325 0.287337 0.947214 0.148977 0.837304 0.155905 0.861803 0.206107 0.861803 0.074674 0.723607 0.068665 0.75286 0.095491 0.762866 0.15311 0.75286 0.368567 0.947214 0.368567 0.861803 0.237134 0.861803 0.370054 0.75286 0.25 0.762866 0.148977 0.75286 0.580311 0.01903 0.5 0 0.629946 0.01903 0.654508 0.074674 0.712663 0.052786 0.75 0.074674 0.716944 0.162696 0.793893 0.138197 0.844095 0.138197 0.851023 0.162696 0.762866 0.276393 0.84689 0.24714 0.904508 0.237134 0.931334 0.24714 0.925325 0.276393 0.5 0.01903 0.631433 0.052786 0.5 0.074674 0.762866 0.138197 0.631433 0.138197 0.5 0.162696 0.851023 0.24714 0.75 0.237134 0.629946 0.24714 0.5 0.276393 0.370054 0.01903 0.368567 0.052786 0.25 0.074674 0.368567 0.138197 0.237134 0.138197 0.148977 0.162696 0.370054 0.24714 0.25 0.237134 0.148977 0.24714 0.074674 0.276393 0.419689 0.01903 0.287337 0.052786 0.345491 0.074674 0.155905 0.138197 0.206107 0.138197 0.283056 0.162696 0.068665 0.24714 0.095491 0.237134 0.15311 0.24714 0.237134 0.276393 0.5 0.052786 0.41877 0.138197 0.58123 0.138197 0.363367 0.24714 0.5 0.237134 0.636633 0.24714 0.580311 0.616227 0.712663 0.638197 0.654508 0.5 0.844095 0.638197 0.793893 0.5 0.716944 0.383773 0.931334 0.616227 0.904508 0.5 0.84689 0.383773 0.980969 0.616227 0.975528 0.638197 1 0.5 0.925325 0.638197 0.975528 0.5 0.980969 0.383773 0.84689 0.616227 0.931334 0.383773 0.716944 0.616227 0.58123 0.638197 0.41877 0.638197 0.5 0.5 0.580311 0.383773 0.283056 0.616227 0.345491 0.5 0.419689 0.383773 0.15311 0.616227 0.074674 0.638197 0.095491 0.5 0.024471 0.638197 0.024471 0.5 0.068665 0.383773 0.01903 0.616227 0 0.5 0.01903 0.383773 0.068665 0.616227 0.155905 0.638197 0.287337 0.638197 0.206107 0.5 0.15311 0.383773 0.419689 0.616227 0.283056 0.383773 0.975528 0.361803 0.925325 0.361803 0.712663 0.361803 0.844095 0.361803 0.155905 0.361803 0.287337 0.361803 0.074674 0.361803 0.024471 0.361803 0.58123 0.361803 0.41877 0.361803</float_array>
+ <technique_common>
+ <accessor source="#Sphere-Texture-array" count="153" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Sphere-vertices">
+ <input semantic="POSITION" source="#Sphere-positions"/>
+ <input semantic="NORMAL" source="#Sphere-normals"/>
+ </vertices>
+ <triangles material="SphereSG" count="320">
+ <input semantic="VERTEX" source="#Sphere-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Sphere-Texture" offset="1" set="1"/>
+ <p>1 0 0 1 2 2 3 3 1 0 4 4 4 4 2 2 5 5 2 2 4 4 1 0 6 6 3 3 7 7 7 7 4 4 8 8 8 8 5 5 9 9 4 4 7 7 3 3 5 5 8 8 4 4 10 10 6 6 11 11 11 11 7 7 12 12 12 12 8 8 13 13 13 13 9 9 14 14 7 7 11 11 6 6 8 8 12 12 7 7 9 9 13 13 8 8 15 15 0 1 1 0 16 16 15 15 17 17 17 17 1 0 3 3 1 0 17 17 15 15 18 18 16 16 19 19 19 19 17 17 20 20 20 20 3 3 6 6 17 17 19 19 16 16 3 3 20 20 17 17 21 21 18 18 22 22 22 22 19 19 23 23 23 23 20 20 24 24 24 24 6 6 10 10 19 19 22 22 18 18 20 20 23 23 19 19 6 6 24 24 20 20 25 25 0 1 15 15 26 26 25 25 27 27 27 27 15 15 16 16 15 15 27 27 25 25 28 28 26 26 29 29 29 29 27 27 30 30 30 30 16 16 18 18 27 27 29 29 26 26 16 16 30 30 27 27 31 31 28 28 32 32 32 32 29 29 33 33 33 33 30 30 34 34 34 34 18 18 21 21 29 29 32 32 28 28 30 30 33 33 29 29 18 18 34 34 30 30 35 35 0 1 25 25 36 36 35 35 37 37 37 37 25 25 26 26 25 25 37 37 35 35 38 38 36 36 39 39 39 39 37 37 40 40 40 40 26 26 28 28 37 37 39 39 36 36 26 26 40 40 37 37 41 41 38 38 42 42 42 42 39 39 43 43 43 43 40 40 44 44 44 44 28 28 31 31 39 39 42 42 38 38 40 40 43 43 39 39 28 28 44 44 40 40 2 2 0 1 35 35 5 5 2 2 45 45 45 45 35 35 36 36 35 35 45 45 2 2 9 9 5 5 46 46 46 46 45 45 47 47 47 47 36 36 38 38 45 45 46 46 5 5 36 36 47 47 45 45 14 14 9 9 48 48 48 48 46 46 49 49 49 49 47 47 50 50 50 50 38 38 41 41 46 46 48 48 9 9 47 47 49 49 46 46 38 38 50 50 47 47 52 51 51 52 53 53 54 54 52 51 55 55 55 55 53 53 56 56 53 53 55 55 52 51 57 57 54 54 58 58 58 58 55 55 59 59 59 59 56 56 60 60 55 55 58 58 54 54 56 56 59 59 55 55 61 61 57 57 62 62 62 62 58 58 63 63 63 63 59 59 64 64 64 64 60 60 65 65 58 58 62 62 57 57 59 59 63 63 58 58 60 60 64 64 59 59 53 53 51 52 66 66 56 56 53 53 67 67 67 67 66 66 68 68 66 66 67 67 53 53 60 60 56 56 69 69 69 69 67 67 70 70 70 70 68 68 71 71 67 67 69 69 56 56 68 68 70 70 67 67 65 65 60 60 72 72 72 72 69 69 73 73 73 73 70 70 74 74 74 74 71 71 75 75 69 69 72 72 60 60 70 70 73 73 69 69 71 71 74 74 70 70 66 66 51 52 76 76 68 68 66 66 77 77 77 77 76 76 78 78 76 76 77 77 66 66 71 71 68 68 79 79 79 79 77 77 80 80 80 80 78 78 81 81 77 77 79 79 68 68 78 78 80 80 77 77 75 75 71 71 82 82 82 82 79 79 83 83 83 83 80 80 84 84 84 84 81 81 85 85 79 79 82 82 71 71 80 80 83 83 79 79 81 81 84 84 80 80 76 76 51 52 86 86 78 78 76 76 87 87 87 87 86 86 88 88 86 86 87 87 76 76 81 81 78 78 89 89 89 89 87 87 90 90 90 90 88 88 91 91 87 87 89 89 78 78 88 88 90 90 87 87 85 85 81 81 92 92 92 92 89 89 93 93 93 93 90 90 94 94 94 94 91 91 95 95 89 89 92 92 81 81 90 90 93 93 89 89 91 91 94 94 90 90 86 86 51 52 52 51 88 88 86 86 96 96 96 96 52 51 54 54 52 51 96 96 86 86 91 91 88 88 97 97 97 97 96 96 98 98 98 98 54 54 57 57 96 96 97 97 88 88 54 54 98 98 96 96 95 95 91 91 99 99 99 99 97 97 100 100 100 100 98 98 101 101 101 101 57 57 61 61 97 97 99 99 91 91 98 98 100 100 97 97 57 57 101 101 98 98 13 13 14 14 102 102 12 12 13 13 103 103 103 103 102 102 104 104 102 102 103 103 13 13 11 11 12 12 105 105 105 105 103 103 106 106 106 106 104 104 107 107 103 103 105 105 12 12 104 104 106 106 103 103 10 10 11 11 108 108 108 108 105 105 109 109 109 109 106 106 110 110 110 110 107 107 61 61 105 105 108 108 11 11 106 106 109 109 105 105 107 107 110 110 106 106 24 24 10 10 111 111 23 23 24 24 112 112 112 112 111 111 113 113 111 111 112 112 24 24 22 22 23 23 114 114 114 114 112 112 115 115 115 115 113 113 116 116 112 112 114 114 23 23 113 113 115 115 112 112 21 21 22 22 117 117 117 117 114 114 118 109 118 109 115 115 119 118 119 118 116 116 65 65 114 114 117 117 22 22 115 115 118 109 114 114 116 116 119 118 115 115 34 34 21 21 120 119 33 33 34 34 121 120 121 120 120 119 122 104 120 119 121 120 34 34 32 32 33 33 123 121 123 121 121 120 124 122 124 122 122 104 125 123 121 120 123 121 33 33 122 104 124 122 121 120 31 31 32 32 126 124 126 124 123 121 127 125 127 125 124 122 128 126 128 126 125 123 75 75 123 121 126 124 32 32 124 122 127 125 123 121 125 123 128 126 124 122 44 44 31 31 129 127 43 43 44 44 130 128 130 128 129 127 131 129 129 127 130 128 44 44 42 42 43 43 132 130 132 130 130 128 133 131 133 131 131 129 134 132 130 128 132 130 43 43 131 129 133 131 130 128 41 41 42 42 135 133 135 133 132 130 136 134 136 134 133 131 137 135 137 135 134 132 85 85 132 130 135 133 42 42 133 131 136 134 132 130 134 132 137 135 133 131 50 50 41 41 138 136 49 49 50 50 139 137 139 137 138 136 140 129 138 136 139 137 50 50 48 48 49 49 141 138 141 138 139 137 142 139 142 139 140 129 143 140 139 137 141 138 49 49 140 129 142 139 139 137 14 14 48 48 144 141 144 141 141 138 145 125 145 125 142 139 146 142 146 142 143 140 95 95 141 138 144 141 48 48 142 139 145 125 141 138 143 140 146 142 142 139 64 64 65 65 116 116 63 63 64 64 147 143 147 143 116 116 113 113 116 116 147 143 64 64 62 62 63 63 148 144 148 144 147 143 149 115 149 115 113 113 111 111 147 143 148 144 63 63 113 113 149 115 147 143 61 61 62 62 110 110 110 110 148 144 109 109 109 109 149 115 108 108 108 108 111 111 10 10 148 144 110 110 62 62 149 115 109 109 148 144 111 111 108 108 149 115 74 74 75 75 125 123 73 73 74 74 150 145 150 145 125 123 122 104 125 123 150 145 74 74 72 72 73 73 151 146 151 146 150 145 152 106 152 106 122 104 120 119 150 145 151 146 73 73 122 104 152 106 150 145 65 65 72 72 119 118 119 118 151 146 118 109 118 109 152 106 117 117 117 117 120 119 21 21 151 146 119 118 72 72 152 106 118 109 151 146 120 119 117 117 152 106 84 84 85 85 134 132 83 83 84 84 153 147 153 147 134 132 131 129 134 132 153 147 84 84 82 82 83 83 154 148 154 148 153 147 155 139 155 139 131 129 129 127 153 147 154 148 83 83 131 129 155 139 153 147 75 75 82 82 128 126 128 126 154 148 127 125 127 125 155 139 126 124 126 124 129 127 31 31 154 148 128 126 82 82 155 139 127 125 154 148 129 127 126 124 155 139 94 94 95 95 143 140 93 93 94 94 156 149 156 149 143 140 140 129 143 140 156 149 94 94 92 92 93 93 157 150 157 150 156 149 158 131 158 131 140 129 138 136 156 149 157 150 93 93 140 129 158 131 156 149 85 85 92 92 137 135 137 135 157 150 136 134 136 134 158 131 135 133 135 133 138 136 41 41 157 150 137 135 92 92 158 131 136 134 157 150 138 136 135 133 158 131 101 101 61 61 107 107 100 100 101 101 159 151 159 151 107 107 104 104 107 107 159 151 101 101 99 99 100 100 160 152 160 152 159 151 161 122 161 122 104 104 102 102 159 151 160 152 100 100 104 104 161 122 159 151 95 95 99 99 146 142 146 142 160 152 145 125 145 125 161 122 144 141 144 141 102 102 14 14 160 152 146 142 99 99 161 122 145 125 160 152 102 102 144 141 161 122</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="untitled">
+ <node id="_Sphere" name="Sphere" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Sphere">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="SphereSG" target="#spherePlanerProjection"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-1.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-1.dae
new file mode 100644
index 0000000..ece584a
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-1.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-1.max</source_data>
+ </contributor>
+ <created>2008-10-31T15:58:11Z</created>
+ <modified>2008-10-31T15:58:26Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="4320">29.798338 -0.005190 15.656205 31.396685 -3.472341 19.151783 30.672070 -6.009082 23.605412 27.818653 -6.935693 27.823742 23.601004 -6.003891 30.676479 19.149239 -3.463352 31.399231 15.656206 0.005189 29.798340 14.057859 3.472340 26.302761 14.782473 6.009080 21.849134 17.635889 6.935693 17.630806 21.853535 6.003894 14.778067 26.305300 3.463356 14.055312 31.398304 1.638942 17.148842 33.119843 -1.148603 21.156437 32.486954 -2.943101 25.970390 29.669222 -3.263716 30.300808 25.421656 -2.024540 32.987358 20.882387 0.442389 33.310181 17.267710 3.476061 31.182777 15.546171 6.263606 27.175186 16.179056 8.058104 22.361231 18.996786 8.378720 18.030815 23.244350 7.139547 15.344261 27.783619 4.672618 15.021437 32.915474 3.736625 18.279196 34.847492 1.852942 22.696659 34.372246 0.945802 27.770727 31.617083 1.258272 32.141808 27.320242 2.706627 34.638672 22.633060 4.902780 34.592293 18.811462 7.258274 32.015095 16.879446 9.141957 27.597633 17.354687 10.049098 22.523567 20.109850 9.736629 18.152487 24.406689 8.288276 15.655617 29.093870 6.092123 15.701994 34.275383 6.367074 18.861647 36.470741 5.596050 23.485590 36.191425 5.696714 28.653450 33.512283 6.642095 32.980499 29.151186 8.178876 35.307312 24.276688 9.895280 35.010422 20.194906 11.331397 32.169376 17.999552 12.102421 27.545433 18.278864 12.001757 22.377575 20.958006 11.056377 18.050524 25.319099 9.519597 15.723707 30.193598 7.803193 16.020597 35.370987 9.556320 18.679157 37.807228 10.019417 23.222855 37.704590 11.177790 28.266918 35.090572 12.721052 32.459789 30.665604 14.235689 34.677998 25.615349 15.315855 34.327171 21.293018 15.672121 31.501318 18.856779 15.209024 26.957621 18.959415 14.050653 21.913559 21.573429 12.507390 17.720688 25.998396 10.992753 15.502477 31.048651 9.912586 15.853300 36.057991 13.256317 17.511818 38.632168 14.927196 21.680355 38.626736 17.085424 26.385347 36.043148 19.152706 30.366093 31.573677 20.575115 32.555958 26.415915 20.971516 32.368168 21.951880 20.235699 29.853043 19.377703 18.564821 25.684507 19.383133 16.406593 20.979517 21.966719 14.339313 16.998772 26.436186 12.916903 14.808905 31.593948 12.520498 14.996691 36.162621 17.336857 15.172624 38.734211 20.054415 18.749876 38.719170 23.059748 22.964453 36.121525 25.547581 26.687065 31.637312 26.851301 28.920238 26.468075 26.621580 29.065599 21.998905 24.919968 27.084198 19.427313 22.202412 23.506948 19.442354 19.197079 19.292372 22.039997 16.709246 15.569759 26.524208 15.405522 13.336582 31.693445 15.635244 13.191218 35.506596 21.572290 11.561490 37.945908 25.115690 14.440550 37.823685 28.777868 18.096836 35.172672 31.577545 21.550653 30.703203 32.764549 23.876553 25.612877 32.020828 24.451311 21.265635 29.545656 23.120922 18.826319 26.002260 20.241863 18.948542 22.340082 16.585577 21.599554 19.540403 13.131761 26.069017 18.353397 10.805860 31.159346 19.097116 10.231100 33.948502 25.653332 6.720037 36.156372 29.810152 8.874346 35.853962 33.951111 11.965617 33.122295 36.966633 15.165545 28.693323 38.048717 17.616713 23.753786 36.907417 18.662333 19.627228 33.848549 18.022232 17.419353 29.691725 15.867924 17.721764 25.550770 12.776653 20.453426 22.535246 9.576726 24.882397 21.453161 7.125555 29.821934 22.594458 6.079935 31.434988 29.218554 0.878888 33.336872 33.812801 2.317860 32.801880 38.287518 4.864546 29.973364 41.443710 7.836563 25.609222 42.435673 10.437560 20.878824 40.997616 11.970606 17.049673 37.514862 12.024919 15.147789 32.920612 10.585948 15.682779 28.445896 8.039264 18.511293 25.289705 5.067247 22.875433 24.297741 2.466248 27.605831 25.735796 0.933203 28.039013 31.924191 -5.547154 29.571203 36.813080 -4.808184 28.762089 41.506718 -2.780864 25.828470 44.747448 -0.008415 21.556408 45.666920 2.766289 17.090601 44.018761 4.799767 13.627653 40.244595 5.547151 12.095461 35.355709 4.808181 12.904573 30.662071 2.780863 15.838189 27.421339 0.008414 20.110250 26.501865 -2.766289 24.576059 28.150023 -4.799768 23.963612 33.522957 -12.025459 25.059511 38.581791 -11.979461 23.935650 43.398411 -10.452358 20.893166 46.682205 -7.853338 16.747288 47.553284 -4.878806 12.608905 45.778240 -2.325786 9.586888 41.832703 -0.878355 8.490987 36.773869 -0.924353 9.614846 31.957253 -2.451454 12.657330 28.673456 -5.050473 16.803205 27.802376 -8.025005 20.941591 29.577412 -10.578027 19.499128 33.921886 -18.023392 20.078209 39.024746 -18.671764 18.592186 43.872974 -17.631889 15.439236 47.167488 -15.182400 11.464190 48.025532 -11.979634 7.732161 46.217182 -8.881773 5.243139 42.226994 -6.718884 4.664058 37.124134 -6.070511 6.150080 32.275909 -7.110385 9.303028 28.981392 -9.559873 13.278072 28.123350 -12.762636 17.010103 29.931692 -15.860498 14.952111 33.188789 -23.123337 14.913963 38.188961 -24.461887 13.007593 42.967712 -23.892456 9.743811 46.244568 -21.567625 5.997143 47.141506 -18.110327 2.771508 45.418190 -14.446945 0.931211 41.536377 -11.559078 0.969357 36.536205 -10.220528 2.875726 31.757460 -10.789957 6.139508 28.480600 -13.114787 9.886174 27.583660 -16.572084 13.111811 29.306974 -20.235466 10.579253 31.510542 -27.086445 9.808814 36.227139 -29.075180 7.416893 40.815586 -28.934584 4.044401 44.046417 -26.702332 0.594997 45.053928 -22.976549 -2.007055 43.568165 -18.755562 -3.064538 39.987232 -15.170376 -2.294100 35.270638 -13.181642 0.097821 30.682188 -13.322235 3.470311 27.451357 -15.554486 6.919715 26.443840 -19.280266 9.521769 27.929604 -23.501253 6.544839 29.126806 -29.855762 4.939646 33.353615 -32.376144 2.010878 37.617512 -32.567055 -1.456703 40.775982 -30.377337 -4.533962 41.982716 -26.393723 -6.396350 40.914379 -21.683619 -6.544842 37.857216 -17.509096 -4.939650 33.630409 -14.988712 -2.010883 29.366514 -14.797799 1.456697 26.208044 -16.987516 4.533957 25.001307 -20.971128 6.396346 26.069645 -25.681232 2.920587 26.273342 -31.504322 0.440484 29.829641 -34.332176 -3.026275 33.657558 -34.683659 -6.550776 36.731411 -32.464592 -9.188629 38.227558 -28.269571 -10.233027 37.745110 -23.222652 -9.404122 35.413342 -18.676151 -6.924020 31.857044 -15.848299 -3.457262 28.029125 -15.496814 0.067238 24.955275 -17.715878 2.705093 23.459124 -21.910896 3.749492 23.941570 -26.957815 -0.291039 23.150927 -32.172245 -3.584448 25.959192 -35.011616 -7.512753 29.317226 -35.306511 -11.023368 32.325241 -32.977917 -13.175626 34.177242 -28.649776 -13.392831 34.376991 -23.481815 -11.616785 32.870964 -18.858782 -8.323378 30.062698 -16.019409 -4.395073 26.704666 -15.724512 -0.884459 23.696651 -18.053104 1.267801 21.844648 -22.381243 1.485008 21.644897 -27.549204 -3.128228 19.915319 -32.017403 -7.085955 22.039740 -34.589981 -11.334366 24.996786 -34.632359 -14.735103 27.994122 -32.133183 -16.376942 30.228611 -27.762102 -15.819952 31.101526 -22.690346 -13.213382 30.378969 -18.276890 -9.255656 28.254551 -15.704311 -5.007245 25.297504 -15.661932 -1.606508 22.300169 -18.161106 0.035333 20.065680 -22.532185 -0.521654 19.192762 -27.603939 -5.632783 16.686794 -31.184052 -10.072082 18.295391 -33.305363 -14.479108 20.990887 -32.977737 -17.673004 24.051025 -30.288967 -18.797968 26.655846 -25.959497 -17.552567 28.107384 -21.149414 -14.270504 28.016708 -17.147568 -9.831207 26.408113 -15.026257 -5.424181 23.712620 -15.353878 -2.230284 20.652479 -18.042648 -1.105318 18.047661 -22.372116 -2.350717 16.596119 -27.182199 -7.832913 13.555894 -29.798338 -12.586268 14.843616 -31.392799 -17.012020 17.427885 -30.665340 -19.924292 20.616247 -27.810883 -20.542742 23.554386 -23.594275 -18.701660 25.455025 -19.145355 -14.894361 25.808895 -15.656206 -10.141008 24.521173 -14.061743 -5.715257 21.936905 -14.789200 -2.802984 18.748543 -17.643658 -2.184530 15.810406 -21.860264 -4.025610 13.909765 -26.309183 -9.735031 10.587971 -27.974195 -14.669402 11.721512 -29.052155 -19.014959 14.313932 -27.961094 -21.607313 17.670597 -24.993362 -21.751844 20.892088 -20.944160 -19.409830 23.115211 -16.898472 -15.208808 23.744282 -13.940332 -10.274439 22.610741 -12.862375 -5.928882 20.018322 -13.953433 -3.336527 16.661659 -16.921162 -3.191991 13.440168 -20.970362 -5.534004 11.217043 -25.016052 -11.333332 7.821912 -25.820749 -16.354595 8.914133 -26.444366 -20.566629 11.586010 -25.060616 -22.840824 15.121614 -22.040276 -22.567812 18.573584 -18.192640 -19.820745 21.016966 -14.548684 -15.335700 21.797058 -12.084799 -10.314440 20.704838 -11.461182 -6.102405 18.032963 -12.844930 -3.828208 14.497360 -15.865270 -4.101217 11.045391 -19.712902 -6.848281 8.602007 -23.356859 -12.629478 5.268320 -23.440256 -17.678659 6.380333 -23.693466 -21.742285 9.160543 -22.095877 -23.731510 12.863996 -19.075554 -23.113321 16.498352 -15.441793 -20.053366 19.089790 -12.168258 -15.371554 19.943937 -10.132090 -10.322374 18.831924 -9.878878 -6.258749 16.051716 -11.476468 -4.269523 12.348266 -14.496789 -4.887707 8.713909 -18.130548 -7.947661 6.122469 -21.404083 -13.639122 2.917055 -20.920912 -18.685339 4.070110 -20.888077 -22.612785 6.957346 -19.146250 -24.369104 10.805131 -16.162157 -23.483692 14.582453 -12.735379 -20.193794 17.277182 -9.784122 -15.380938 18.167269 -8.099169 -10.334722 17.014215 -8.132005 -6.407275 14.126981 -9.873828 -4.650954 10.279197 -12.857922 -5.536363 6.501875 -16.284698 -8.826259 3.807144 -19.235956 -14.390182 0.746928 -18.332632 -19.421907 1.937199 -18.087826 -23.240641 4.912662 -16.255119 -24.823158 8.876041 -13.325584 -23.745426 12.765358 -10.084189 -20.296221 15.538467 -7.399465 -15.399755 16.452320 -5.990776 -10.368032 15.262052 -6.235583 -6.549297 12.286591 -8.068289 -4.966777 8.323212 -10.997821 -6.044507 4.433896 -14.239214 -9.493711 1.660785 -16.923943 -14.923439 -1.270719 -15.722205 -19.940144 -0.059334 -15.322033 -23.681408 2.978921 -13.433416 -25.144760 7.029950 -10.562408 -23.938097 11.008282 -7.478292 -20.384747 13.847925 -5.007458 -15.436823 14.788001 -3.811959 -10.420119 13.576618 -4.212131 -6.678855 10.538364 -6.100747 -5.215501 6.487337 -8.971753 -6.422159 2.509006 -12.055868 -9.975509 -0.330640 -14.526705 -15.276306 -3.160922 -13.123853 -20.282560 -1.949135 -12.610126 -23.976316 1.124307 -10.685279 -25.367836 5.235878 -7.865071 -24.084261 9.283888 -4.905176 -20.469528 12.183672 -2.598695 -15.492199 13.158240 -1.563647 -10.485946 11.946455 -2.077373 -6.792189 8.873014 -4.002219 -5.400668 4.761444 -6.822426 -6.684238 0.713435 -9.782320 -10.298970 -2.186352 -12.088802 -15.489143 -4.950829 -10.554756 -20.490181 -3.757617 -9.954102 -24.159718 -0.673565 -8.000116 -25.514500 3.474957 -5.216369 -24.191519 7.576356 -2.348763 -20.545265 10.531666 -0.165672 -15.552750 11.549015 0.747949 -10.551712 10.355804 0.147295 -6.882176 7.271754 -1.806690 -5.527391 3.123233 -4.590436 -6.850369 -0.978167 -7.458041 -10.496621 -3.933478 -9.641133 -15.595454 -6.663393 -8.026957 -20.595238 -5.504448 -7.353207 -24.256395 -2.431267 -5.366652 -25.597923 1.732695 -2.599588 -24.260361 5.871707 0.206553 -20.602108 8.876723 2.299867 -15.603388 9.942554 3.119453 -10.603606 8.783611 2.445704 -6.942447 5.710432 0.459150 -5.600917 1.546471 -2.307914 -6.938477 -2.592541 -5.114054 -10.596728 -5.597559 -7.207369 -15.624999 -8.320971 -5.546305 -20.624998 -7.206468 -4.802797 -24.285254 -4.160995 -2.772391 -25.625000 -0.000581 0.000866 -24.285254 4.159993 2.773884 -20.625002 7.205904 4.803633 -15.625003 8.321005 5.546246 -10.625004 7.206504 4.802739 -6.964748 4.161032 2.772334 -5.625000 0.000620 -0.000923 -6.964742 -4.159954 -2.773940 -10.624993 -7.205867 -4.803691 -15.603543 -9.942065 -3.120182 -20.602221 -8.876910 -2.299463 -24.260405 -5.872509 -0.205137 -25.597883 -1.733890 2.601622 -24.256283 2.430009 5.368745 -20.595085 5.503473 7.354784 -15.595304 6.662972 8.027583 -10.596626 5.597819 7.206865 -6.938442 2.593421 5.112540 -5.600961 -1.545198 2.305782 -6.942558 -5.709097 -0.461341 -10.603755 -8.782563 -2.447382 -15.553334 -11.548116 -0.749250 -20.545729 -10.531341 0.165675 -24.191738 -7.576682 2.350058 -25.514414 -3.475837 5.218597 -24.159351 0.672376 8.002667 -20.489635 3.756446 9.956282 -15.488564 4.950000 10.555969 -10.496171 3.933227 9.641045 -6.850162 0.978570 7.456663 -5.527482 -3.122274 4.588125 -6.882542 -7.270487 1.804054 -10.552257 -10.354559 -0.149560 -15.493553 -13.156838 1.561694 -20.470613 -12.182793 2.598527 -24.084789 -9.283756 4.906825 -25.367662 -5.236521 7.868082 -23.975491 -1.125540 10.688829 -20.281305 1.947649 12.613253 -15.274960 3.159593 13.125703 -10.297900 2.185549 12.088871 -6.683724 -0.713487 9.780574 -5.400848 -4.760721 6.819319 -6.793016 -8.871700 3.998570 -10.487201 -11.944893 2.074146 -15.439208 -14.786095 3.809488 -20.386648 -13.846434 5.007315 -23.939009 -11.007595 7.480504 -25.144432 -7.030242 10.566363 -23.679932 -2.980103 13.438042 -19.937920 0.057589 15.326073 -14.921061 1.268890 15.724562 -9.973621 0.329231 14.526735 -6.421262 -2.509607 12.053549 -5.215835 -6.486959 8.967690 -6.680331 -10.537098 6.096012 -10.422343 -13.574791 4.207979 -15.403617 -16.449736 5.987804 -20.299295 -15.535939 7.399270 -23.746891 -12.763553 10.086812 -24.822622 -8.875435 13.330306 -23.238249 -4.913403 16.260662 -19.418303 -1.939080 18.092691 -14.386335 -0.749434 18.335505 -9.490659 -1.663229 16.924042 -6.043063 -4.435613 14.236501 -4.967330 -8.323730 10.993006 -6.551699 -12.285763 8.062651 -10.371643 -15.260086 6.230618 -15.386561 -18.163895 8.095926 -20.198053 -17.274187 9.784978 -23.485445 -14.580626 12.740093 -24.367884 -10.804952 16.169451 -22.608921 -6.958851 19.154160 -18.679871 -4.072886 20.894466 -13.633516 -2.920345 20.924059 -8.822026 -3.810051 19.235008 -5.534634 -6.503611 16.279894 -4.652193 -10.279284 12.850536 -6.411152 -14.125385 9.865829 -10.340201 -17.011353 8.125521 -15.378310 -19.940105 10.129260 -20.058220 -19.086521 12.170035 -23.114977 -16.496510 15.447687 -23.729523 -12.864063 19.083971 -21.737194 -9.162489 22.104551 -17.671833 -6.383625 23.700062 -12.622748 -5.272062 23.442989 -7.942839 -6.125645 21.402218 -4.886082 -8.715654 18.124567 -4.271533 -12.348101 14.488281 -6.263858 -16.049675 11.467702 -10.329219 -18.828541 9.872189 -15.343148 -21.792896 12.082738 -19.825615 -21.014008 14.551692 -22.568802 -18.572609 18.199902 -22.837673 -15.122873 22.049828 -20.560184 -11.589151 25.069891 -16.346590 -8.918303 26.450863 -11.325915 -7.825978 25.822720 -6.843448 -8.604865 23.353765 -4.100260 -11.046261 19.705559 -3.831387 -14.495997 15.855632 -6.108872 -18.029718 12.835569 -10.322467 -20.700569 11.454594 -15.218573 -23.738758 13.938974 -19.415474 -23.112019 16.903454 -21.751862 -20.892071 20.954138 -21.601702 -17.673744 25.005648 -19.005228 -14.319386 27.972385 -14.658168 -11.727798 29.059418 -9.725308 -10.593390 27.975473 -5.528407 -11.220129 25.010998 -3.192019 -13.440077 20.960314 -3.342177 -16.658401 16.908804 -5.938647 -20.012760 13.942064 -10.285707 -22.604351 12.855030 -14.904174 -25.803188 15.656172 -18.705839 -25.453775 19.151909 -20.540174 -23.557909 23.605652 -19.915670 -20.623589 27.824024 -16.999664 -17.437059 30.676718 -12.573496 -14.852152 31.399353 -7.823155 -13.561488 29.798304 -4.021490 -13.910901 26.302570 -2.187153 -15.806767 21.848827 -2.811655 -18.741087 17.630455 -5.727659 -21.927614 14.777760 -10.153826 -24.512524 14.055120 -14.279753 -28.011177 17.148804 -17.554651 -28.108269 21.156364 -18.792339 -26.662888 25.970295 -17.661179 -24.062325 30.300705 -14.464264 -21.003399 32.987270 -10.058206 -18.305748 33.310123 -5.623603 -16.692204 31.182758 -2.348704 -16.595114 27.175201 -1.111014 -18.040491 22.361271 -2.242173 -20.641054 18.030861 -5.439086 -23.699978 15.344293 -9.845144 -26.397631 15.021437 -13.222122 -30.373669 18.279278 -15.819350 -31.104956 22.696806 -16.367168 -30.239836 27.770893 -14.718791 -28.010113 32.141949 -11.315896 -25.013243 34.638744 -7.070291 -22.052233 34.592270 -3.119578 -19.920483 32.014980 -0.522350 -19.189194 27.597454 0.025470 -20.054314 22.523367 -1.622906 -22.284037 18.152313 -5.025798 -25.280905 15.655514 -9.271404 -28.241917 15.701984 -11.622940 -32.867275 18.861326 -13.388689 -34.382896 23.485172 -13.162313 -34.191143 28.653044 -11.004466 -32.343388 32.980217 -7.493344 -29.334740 35.307224 -3.569749 -25.971365 35.010555 -0.285004 -23.154472 32.169697 1.480745 -21.638851 27.545853 1.254370 -21.830606 22.377983 -0.903475 -23.678358 18.050810 -4.414595 -26.687002 15.723795 -8.338190 -30.050379 16.020462 -9.408913 -35.410622 18.678814 -10.226686 -37.751522 23.222637 -9.172878 -38.241367 28.266886 -6.529854 -36.748894 32.459961 -3.005809 -33.674015 34.678329 0.454989 -29.840645 34.327579 2.925225 -26.275921 31.501698 3.743000 -23.935019 26.957872 2.689193 -23.445175 21.913624 0.046170 -24.937645 17.720551 -3.477874 -28.012520 15.502180 -6.938673 -31.845894 15.852926 -6.549235 -37.855000 17.512192 -6.388803 -40.920033 21.680498 -4.516522 -41.994713 26.385235 -1.434068 -40.791080 30.365770 2.032618 -37.631653 32.555527 4.954639 -33.362995 32.367760 6.549044 -29.128887 29.852777 6.388613 -26.063858 25.684471 4.516333 -24.989176 20.979736 1.433880 -26.192804 16.999201 -2.032805 -29.352228 14.809442 -4.954827 -33.620888 14.997208 -3.067703 -39.985950 15.173099 -1.999528 -43.572010 18.749979 0.611169 -45.061859 22.964186 4.064856 -44.056290 26.686523 7.436118 -40.824745 28.919598 9.821630 -36.233112 29.065054 10.582195 -31.511715 27.083920 9.514022 -27.925655 23.507042 6.903326 -26.435802 19.292835 3.449641 -27.441374 15.570498 0.078378 -30.672916 13.337423 -2.307135 -35.264549 13.191963 0.929404 -41.535904 11.560925 2.778284 -45.420078 14.440116 6.010653 -47.145245 18.096687 9.760400 -46.249146 21.550861 13.022783 -42.971889 23.877098 14.923650 -38.191616 24.452080 14.953666 -33.189194 23.121746 13.104787 -29.305019 20.242558 9.872419 -27.579853 16.585987 6.122673 -28.475950 13.131811 2.860289 -31.753201 10.805574 0.959420 -36.533470 10.230589 5.242403 -42.226944 6.719768 7.738253 -46.217419 8.874240 11.475444 -48.025990 11.965745 15.452598 -47.168049 15.165916 18.604040 -43.873478 17.617271 20.085344 -39.025059 18.662971 19.499596 -33.921921 18.022820 17.003748 -29.931444 15.868350 13.266559 -28.122873 12.776846 9.289405 -28.980814 9.576674 6.137961 -32.275383 7.125319 4.656655 -37.123798 6.079618 9.586010 -41.832882 0.879621 12.613850 -45.777077 2.318518 16.756697 -47.551098 4.865005 20.904478 -46.679588 7.836756 23.945801 -43.396072 10.437490 25.065742 -38.580372 11.970344 23.964218 -33.522839 12.024591 20.936380 -29.578644 10.585695 16.793535 -27.804626 8.039209 12.645753 -28.676130 5.067459 9.604430 -31.959642 2.466724 8.484486 -36.775345 0.933869 13.627075 -40.244926 -5.546140 17.094902 -44.016277 -4.807204 21.564405 -45.662300 -2.780122 25.837984 -44.741951 -0.008049 28.770538 -41.501839 2.766242 29.576292 -36.810139 4.799380 28.039345 -31.923996 5.546588 24.571522 -28.152649 4.807654 20.102018 -26.506620 2.780573 15.828439 -27.426968 0.008500 12.895883 -30.667082 -2.765790 12.090126 -35.358776 -4.798930 17.050053 -37.514427 -12.025733 20.883198 -40.992905 -11.979778 25.616392 -42.427975 -10.452579 29.981382 -41.435120 -7.853344 32.808571 -38.280369 -4.878541 33.340416 -33.809036 -2.325263 31.434412 -29.219210 -0.877658 27.601269 -25.740734 -0.923613 22.868074 -24.305658 -2.450811 18.503084 -25.298513 -5.050044 15.675893 -28.453262 -8.024847 15.144045 -32.924595 -10.578126 19.627777 -33.847412 -18.023758 23.757448 -36.900333 -18.672153 28.699097 -38.037617 -17.632145 33.128613 -36.954529 -15.182405 35.859112 -33.941280 -11.979339 36.158955 -29.805273 -8.881205 33.947807 -25.654743 -6.718144 29.818140 -22.601820 -6.069750 24.876492 -21.464535 -7.109756 20.446976 -22.547621 -9.559495 17.716476 -25.560867 -12.762561 17.416626 -29.696875 -15.860697 21.265779 -29.545151 -23.121429 25.615034 -32.012558 -24.459637 30.706787 -32.750778 -23.890421 35.176708 -31.562000 -21.566301 37.827084 -28.764757 -18.110022 37.947750 -25.108572 -14.447694 35.506374 -21.573112 -11.560630 31.157122 -19.105705 -10.222422 26.065369 -18.367485 -10.791637 21.595449 -19.556261 -13.115756 18.945070 -22.353500 -16.572035 18.824402 -26.009686 -20.234364 21.999350 -24.916931 -27.086649 26.469280 -26.607889 -29.075445 31.638952 -26.830671 -28.934805 36.123158 -25.525579 -26.702415 38.720356 -23.042315 -22.976442 38.734631 -20.046267 -18.755259 36.162159 -17.340221 -15.169924 31.692230 -15.649263 -13.181129 26.522558 -15.426480 -13.321766 22.038353 -16.731571 -15.554154 19.441153 -19.214834 -19.280127 19.426874 -22.210884 -23.501310 21.952211 -20.230556 -29.856327 26.415369 -20.953518 -32.376740 31.572403 -20.549124 -32.567497 36.041489 -19.125732 -30.377487 38.625141 -17.064737 -26.393524 38.631069 -14.918384 -21.683105 36.057690 -13.261784 -17.508385 31.594534 -12.538822 -14.987974 26.437500 -12.943215 -14.797215 21.968414 -14.366606 -16.987221 19.384760 -16.427599 -20.971182 19.378828 -18.573954 -25.681601 21.293129 -15.666029 -31.504343 25.612968 -15.296051 -34.332245 30.661381 -14.207521 -34.683750 35.085648 -12.692111 -32.464672 37.700291 -11.155869 -28.269611 37.804718 -10.010435 -23.222633 35.370953 -9.562723 -18.676071 31.051113 -9.932700 -15.848169 26.002701 -11.021229 -15.496663 21.578434 -12.536640 -17.715736 18.963789 -14.072881 -21.910795 18.859358 -15.218317 -26.957771 20.194855 -11.322945 -32.172474 24.273500 -9.874395 -35.011711 29.145731 -8.151194 -35.306454 33.506035 -6.615071 -32.977722 36.186073 -5.677630 -28.649498 36.467735 -5.590056 -23.481529 34.275543 -6.375816 -18.858566 30.196899 -7.824365 -16.019325 25.324671 -9.547565 -15.724583 20.964365 -11.083689 -18.053310 18.284325 -12.021131 -22.381533 18.002663 -12.108706 -27.549501 18.811378 -7.250381 -32.017021 22.630205 -4.886063 -34.590244 27.315399 -2.685599 -34.633205 31.611565 -1.238604 -32.134388 34.367550 -0.932798 -27.763351 34.844887 -1.850122 -22.691315 32.915680 -3.744779 -18.277321 29.096855 -6.109097 -15.704098 24.411663 -8.309561 -15.661136 20.115498 -9.756557 -18.159950 17.359510 -10.062364 -22.530985 16.882170 -9.145041 -27.603024 17.267645 -3.465125 -31.184134 20.880400 -0.424838 -33.305351 25.418297 2.043972 -32.977654 29.665411 3.279789 -30.288841 32.483727 2.951477 -25.959381 33.118084 1.147008 -21.149351 31.398506 -1.650113 -17.147593 27.785751 -4.690400 -15.026374 23.247854 -7.159210 -15.354071 19.000742 -8.395027 -18.042881 16.182423 -8.066718 -22.372339 15.548064 -6.262249 -27.182369 15.656277 0.005568 -29.798409 19.148335 3.477995 -31.392994 23.599384 6.018469 -30.665623 27.816771 6.946270 -27.811199 30.670450 6.012796 -23.594557 31.395781 3.468171 -19.145546 29.798410 -0.005776 -15.656277 26.306355 -3.478203 -14.061693 21.855305 -6.018677 -14.789061 17.637917 -6.946479 -17.643482 14.784237 -6.013008 -21.860123 14.058905 -3.468383 -26.309132 14.037041 3.136751 -27.974276 17.485878 6.843308 -29.052183 21.903740 9.310476 -27.961086 26.106867 9.877178 -24.993343 28.969032 8.391568 -20.944160 29.723322 5.251715 -16.898512 28.167625 1.298939 -13.940424 24.718792 -2.407618 -12.862516 20.300930 -4.874786 -13.953610 16.097803 -5.441491 -16.921352 13.235636 -3.955883 -20.970533 12.481343 -0.816031 -25.016184 12.440699 5.903224 -25.821009 15.896967 9.705875 -26.444683 20.316713 12.018015 -25.060930 24.515673 12.220106 -22.040531 27.368734 10.257998 -18.192791 28.111425 6.657437 -14.548717 26.544741 2.383191 -12.084730 23.088474 -1.419460 -11.461056 18.668728 -3.731600 -12.844805 14.469770 -3.933692 -15.865206 11.616706 -1.971587 -19.712942 10.874014 1.628972 -23.357018 10.877306 8.303156 -23.440378 14.364908 12.119886 -23.693598 18.804440 14.249016 -22.096006 23.006330 14.120043 -19.075674 25.844687 11.767527 -15.441898 26.558975 7.821825 -12.168348 24.957804 3.340183 -10.132166 21.470203 -0.476548 -9.878945 17.030674 -2.605677 -11.476537 12.828784 -2.476707 -14.496867 9.990424 -0.124194 -18.130640 9.276134 3.821507 -21.404192 9.345882 10.352356 -20.921444 12.867456 14.146084 -20.888954 17.331516 16.104048 -19.147270 21.541922 15.701609 -16.163069 24.370495 13.046600 -12.735966 25.059326 8.850435 -9.784253 23.423841 4.237467 -8.098836 19.902267 0.443739 -8.131323 15.438209 -1.514224 -9.873009 11.227804 -1.111788 -12.857208 8.399228 1.543216 -16.284309 7.710396 5.739382 -19.236023 7.842031 12.088509 -18.332884 11.388534 15.851120 -18.087948 15.874602 17.670681 -16.255106 20.098200 17.059641 -13.325467 22.927614 14.181726 -10.084026 23.604708 9.808075 -7.399324 21.948055 5.110601 -5.990725 18.401554 1.347989 -6.235661 13.915487 -0.471573 -8.068501 9.691892 0.139466 -10.998138 6.862474 3.017377 -14.239579 6.185378 7.391027 -16.924282 6.361202 13.560130 -15.721714 9.918825 17.298847 -15.321430 14.420824 19.019417 -13.432892 18.660892 18.260809 -10.562131 21.502905 15.226295 -7.478367 22.185349 10.728970 -5.007891 20.525364 5.973888 -3.812664 16.967743 2.235170 -4.212948 12.465745 0.514601 -6.101484 8.225678 1.273207 -8.972244 5.383663 4.307718 -12.056008 4.701217 8.805042 -14.526485 4.900838 14.809858 -13.124192 8.453462 18.539482 -12.610685 12.962046 20.201691 -10.685936 17.218517 19.351093 -7.865679 20.082361 16.215609 -4.905602 20.786209 11.635389 -2.598853 19.141470 6.837698 -1.563523 15.588848 3.108075 -2.077030 11.080265 1.445866 -4.001778 6.823792 2.296461 -6.822033 3.959948 5.431942 -9.782111 3.256097 10.012161 -12.088861 3.457189 15.889164 -10.555134 6.990893 19.623711 -9.954275 11.496379 21.259741 -8.000070 15.766405 20.358883 -5.216143 18.656824 17.162521 -2.348448 19.393147 12.527119 -0.165381 17.778080 7.694727 0.748109 14.244377 3.960182 0.147252 9.738893 2.324150 -1.806953 5.468866 3.225006 -4.590878 2.578446 6.421365 -7.458573 1.842121 11.056767 -9.641642 2.026373 16.838568 -8.025473 5.530158 20.588852 -7.351844 10.022550 22.222559 -5.365808 14.299816 21.301931 -2.599519 17.215868 18.073654 0.205797 17.989349 13.402745 2.298457 16.413010 8.540764 3.117736 12.909227 4.790480 2.444109 8.416837 3.156774 0.458072 4.139570 4.077398 -2.308215 1.223517 7.305672 -5.113531 0.450032 11.976582 -7.206192 0.607076 17.691700 -5.547601 4.072214 21.464603 -4.804006 8.539578 23.111866 -2.773220 12.812144 22.192108 0.000612 15.745080 18.951771 2.774242 16.552507 14.259106 4.804479 15.018080 9.371506 5.547323 11.552944 5.598601 4.803730 7.085581 3.951336 2.772945 2.813015 4.871095 -0.000886 -0.119923 8.111428 -2.774517 -0.927353 12.804092 -4.804755 -0.808108 18.484035 -3.120488 2.613694 22.280428 -2.299756 7.044643 23.946304 -0.205368 11.297472 23.035294 2.601485 14.232637 19.791504 5.368711 15.063665 15.084102 7.354833 13.567883 10.174435 8.027671 10.146083 6.378042 7.206940 5.715135 4.712164 5.112553 1.462306 5.623172 2.305700 -1.472862 8.866961 -0.461526 -2.303892 13.574360 -2.447649 -2.223995 19.243624 -0.749640 1.152842 23.058712 0.165232 5.534657 24.738867 2.349653 9.747347 23.833893 5.218308 12.662125 20.586275 8.002544 13.497978 15.866213 9.956327 12.030942 10.938440 10.556142 8.654107 7.123352 9.641271 4.272294 5.443194 7.456851 0.059604 6.348167 4.588196 -2.855176 9.595782 1.803960 -3.691032 14.315844 -0.149824 -3.647139 19.996244 1.561420 -0.315061 23.819460 2.598336 4.002621 25.499882 4.906740 8.148988 24.587238 7.868098 11.013023 21.326071 10.688917 11.827312 16.590214 12.613359 10.373667 11.648628 13.125774 7.041591 7.825412 12.088861 2.723910 6.144990 9.780457 -1.422457 7.057631 6.819100 -4.286495 10.318794 3.998281 -5.100786 15.054652 2.073836 -5.086255 20.763441 3.810067 -1.798816 24.578371 5.007552 2.436047 26.235582 7.480305 6.483606 25.291027 10.565753 9.259321 21.997793 13.437154 10.019443 17.238308 15.325118 8.560296 12.287865 15.723767 5.272859 8.472934 14.526283 1.037997 6.815722 12.053533 -3.009562 7.760276 8.968084 -5.785279 11.053505 6.096683 -6.545403 15.812991 4.208718 -6.543874 21.564823 5.987609 -3.304612 25.347664 7.399071 0.820147 26.947128 10.086636 4.725177 25.934639 13.330170 7.364130 22.581491 16.260574 8.029899 17.786163 18.092648 6.544093 12.833558 18.335487 3.304833 9.050718 16.924026 -0.819926 7.451253 14.236465 -4.724956 8.463740 10.992930 -7.363910 11.816882 8.062526 -8.029681 16.612209 6.230451 -8.036623 22.407301 8.095596 -4.860265 26.129194 9.784735 -0.883912 27.629227 12.739972 2.826977 26.505466 16.169458 5.278073 23.059021 19.154266 5.812605 18.213366 20.894615 4.287348 13.266891 20.924185 1.110992 9.544997 19.235050 -2.865361 8.044963 16.279812 -6.576250 9.168723 12.850326 -9.027347 12.615164 9.865519 -9.561881 17.460817 8.125166 -9.581348 23.286871 10.129976 -6.502129 26.913506 12.169794 -2.730179 28.266407 15.446525 0.723807 26.983072 19.082174 2.934339 23.407368 22.102571 3.309106 18.497398 23.698404 1.747690 13.568790 23.442068 -1.331529 9.942157 21.402252 -5.103477 8.589252 18.125523 -8.557464 9.872585 14.489873 -10.767997 13.448288 11.469475 -11.142766 18.358255 9.873642 -11.200872 24.184383 12.082476 -8.285387 27.676737 14.551956 -4.799867 28.831505 18.200598 -1.678255 27.339266 22.050751 0.243015 23.599863 25.070770 0.449142 18.615271 26.451443 -1.115106 13.721106 25.822821 -4.030590 10.228751 23.353344 -7.516109 9.073982 19.704702 -10.637721 10.566218 15.854549 -12.558993 14.305618 12.834528 -12.765121 19.290209 11.453854 -12.948956 25.049057 13.938903 -10.307741 28.370300 16.903400 -7.217029 29.283686 20.954098 -4.504974 27.544466 25.005615 -2.898269 23.618668 27.972351 -2.827429 18.558207 29.059372 -4.311435 13.719027 27.975410 -6.952649 10.397781 25.010918 -10.043360 9.484396 20.960220 -12.755415 11.223613 16.908703 -14.362122 15.149408 13.941964 -14.432963 20.209869 12.854942 -14.894463 25.808739 15.656119 -12.690886 28.926497 19.151653 -10.131633 29.567301 23.605249 -7.902454 27.559450 27.823570 -6.600656 23.440947 30.676317 -6.575054 18.315340 31.399101 -7.832507 13.556032 29.798252 -10.036083 10.438274 26.302719 -12.595335 9.797468 21.849125 -14.824514 11.805316 17.630806 -16.126314 15.923818 14.778057 -16.151918 21.049423 14.055270 -17.117718 26.372618 17.148870 -15.564696 29.257080 21.156729 -13.694559 29.605984 25.970850 -12.008410 27.325844 30.301296 -10.958050 23.027617 32.987732 -10.824923 17.863014 33.310322 -11.644700 13.215885 31.182631 -13.197721 10.331421 27.174776 -15.067858 9.982515 22.360655 -16.754007 12.262654 18.030209 -17.804369 16.560877 15.343773 -17.937496 21.725481 15.021179 -19.693884 26.637177 18.279083 -19.028460 29.252291 22.696472 -18.005070 29.294403 27.770504 -16.897928 26.752228 32.141602 -16.003693 22.306934 34.638531 -15.561975 17.149645 34.592243 -15.691131 12.662245 32.015141 -16.356552 10.047129 27.597755 -17.379944 10.005014 22.523722 -18.487083 12.547190 18.152626 -19.381319 16.992477 15.655692 -19.823038 22.149769 15.701979 -22.653763 26.498627 18.860743 -23.082878 28.786093 23.484407 -23.029205 28.494724 28.652302 -22.507122 25.702589 32.979694 -21.656523 21.157837 35.307064 -20.705324 16.078238 35.010796 -19.908398 11.824859 32.170269 -19.479282 9.537390 27.546606 -19.532955 9.828757 22.378710 -20.055037 12.620890 18.051319 -20.905636 17.165638 15.723945 -21.856836 22.245239 16.020214 -25.961336 25.854073 18.679205 -27.580385 27.732403 23.222933 -28.532158 27.064350 28.267014 -28.561632 24.028919 32.459888 -27.660908 19.439447 34.678082 -26.071335 14.525686 34.327225 -24.218836 10.604267 31.501339 -22.599789 8.725935 26.957611 -21.648014 9.393986 21.913532 -21.618540 12.429417 17.720657 -22.519262 17.018887 15.502462 -24.108835 21.932650 15.853312 -29.507601 24.600073 17.513083 -32.242981 25.993141 21.681053 -34.110687 24.908464 26.385315 -34.610279 21.636681 30.365358 -33.607883 17.054461 32.554741 -31.372095 12.389607 32.366814 -28.501989 8.892065 29.851936 -25.766613 7.498997 25.683966 -23.898903 8.583672 20.979706 -23.399311 11.855454 16.999662 -24.401705 16.437672 14.810279 -26.637493 21.102524 14.998202 -33.095337 22.649410 15.172739 -36.734535 23.517740 18.750048 -39.329666 22.002077 22.964666 -40.185356 18.508539 26.687286 -39.072330 13.973219 28.920437 -36.288826 9.611353 29.065750 -32.580673 6.591696 27.084284 -28.941475 5.723364 23.506977 -26.346348 7.239027 19.292360 -25.490652 10.732563 15.569739 -26.603674 15.267881 13.336585 -29.387180 19.629749 13.191273 -36.436714 19.962187 11.559688 -40.724354 20.303692 14.439691 -43.833916 18.367634 18.097181 -44.932186 14.672773 21.552137 -43.724888 10.209146 23.878809 -40.535515 6.172781 24.453762 -36.218662 3.645214 23.122940 -31.931019 3.303707 20.242939 -28.821461 5.239766 16.585451 -27.723188 8.934624 13.130494 -28.930483 13.398249 10.803822 -32.119850 17.434616 10.228867 -39.190659 16.573643 6.720101 -43.894531 16.407267 8.874359 -47.329506 14.074881 11.965610 -48.575184 10.201441 15.165558 -47.297787 5.824833 17.616781 -43.839592 2.117769 18.662472 -39.127220 0.073549 18.022442 -34.423347 0.239923 15.868188 -30.988373 2.572309 12.776937 -29.742695 6.445747 9.576989 -31.020088 10.822353 7.125766 -34.478283 14.529419 6.080071 -41.021034 12.615633 0.881013 -45.950825 11.965251 2.319444 -49.558750 9.263976 4.865205 -50.878071 5.235611 7.836164 -49.555271 0.959555 10.436253 -45.944801 -2.418427 11.968781 -41.014080 -3.993210 12.023109 -36.084290 -3.342830 10.584681 -32.476360 -0.641556 8.038919 -31.157042 3.386807 5.067962 -32.479836 7.662864 2.467872 -36.090305 11.040848 0.935342 -41.666664 8.320580 -5.546885 -46.666660 7.203043 -4.807930 -50.326916 4.155477 -2.780662 -51.666660 -0.005525 -0.008286 -50.326912 -4.165025 2.766341 -46.666664 -7.208488 4.799761 -41.666664 -8.320424 5.547121 -36.666668 -7.202887 4.808166 -33.006416 -4.155323 2.780900 -31.666668 0.005678 0.008525 -33.006413 4.165178 -2.766103 -36.666660 7.208643 -4.799524 -41.013111 3.990373 -12.027334 -45.942123 2.409980 -11.981455 -49.551617 -0.971310 -10.453918 -50.874424 -5.247483 -7.854026 -49.556107 -9.272743 -4.878419 -45.949902 -11.968523 -2.324408 -41.022095 -12.612494 -0.876337 -36.093082 -11.032103 -0.922215 -32.483589 -7.650815 -2.449751 -31.160778 -3.374642 -5.049642 -32.479092 0.650618 -8.025249 -36.085293 3.346401 -10.579261 -39.126732 -0.074268 -18.023489 -43.835480 -2.124205 -18.671869 -47.291172 -5.835226 -17.631958 -48.567863 -10.212967 -15.182396 -47.323467 -14.084417 -11.979543 -43.891415 -16.412224 -8.881601 -39.191322 -16.572653 -6.718661 -34.482578 -14.522718 -6.070279 -31.026882 -10.811699 -7.110190 -29.750189 -6.433958 -9.559751 -30.994583 -2.562507 -12.762602 -34.426636 -0.234699 -15.860544 -36.219883 -3.643983 -23.121227 -40.531456 -6.176739 -24.459295 -43.716663 -10.217204 -23.890064 -44.922028 -14.682739 -21.566057 -43.824581 -18.376808 -18.109993 -40.718380 -20.309587 -14.447920 -36.435726 -19.963192 -11.561086 -32.124157 -17.430437 -10.223018 -28.938950 -13.389973 -10.792248 -27.733580 -8.924438 -13.116252 -28.831024 -5.230369 -16.572315 -31.937225 -3.297587 -20.234388 -32.578503 -6.593410 -27.086502 -36.278030 -9.618895 -29.075186 -39.055843 -13.984545 -28.934536 -40.167625 -18.520588 -26.702236 -39.315479 -22.011597 -22.976431 -36.727734 -23.522158 -18.755449 -33.097775 -22.647518 -15.170296 -29.398247 -19.622036 -13.181612 -26.620436 -15.256388 -13.322262 -25.508652 -10.720345 -15.554559 -26.360796 -7.229334 -19.280361 -28.948540 -5.718770 -23.501343 -28.494896 -8.896778 -29.857346 -31.352125 -12.400813 -32.377838 -33.580429 -17.069141 -32.568409 -34.582733 -21.650883 -30.377987 -34.090469 -24.918365 -26.393497 -32.235542 -25.996071 -21.682585 -29.514978 -24.595230 -17.507530 -26.657749 -21.091198 -14.987037 -24.429445 -16.422873 -14.796466 -23.427141 -11.841130 -16.986885 -23.919401 -8.573645 -20.971373 -25.774326 -7.495935 -25.682285 -24.213945 -10.607207 -31.504166 -26.053619 -14.533190 -34.332092 -27.635155 -19.449495 -34.683674 -28.534777 -24.038803 -32.464699 -28.511435 -27.071415 -28.269745 -27.571383 -27.734739 -23.222845 -25.966505 -25.851044 -18.676310 -24.126831 -21.925064 -15.848381 -22.545298 -17.008760 -15.496799 -21.645674 -12.419452 -17.715769 -21.669016 -9.386840 -21.910723 -22.609068 -8.723511 -26.957623 -19.905249 -11.826674 -32.171623 -20.690994 -16.082664 -35.011353 -21.634890 -21.163687 -35.306679 -22.484016 -25.708281 -32.978466 -23.010855 -28.498728 -28.650560 -23.074236 -28.787331 -23.482620 -22.657179 -26.496761 -18.859392 -21.871433 -22.240770 -16.019663 -20.927538 -17.159752 -15.724335 -20.078411 -12.615156 -18.052544 -19.551573 -9.824706 -22.380445 -19.488192 -9.536101 -27.548386 -15.683434 -12.666561 -32.017284 -15.544940 -17.156143 -34.590103 -15.981918 -22.313871 -34.632687 -16.877279 -26.757736 -32.133625 -17.991116 -29.297009 -27.762539 -19.024971 -29.251289 -22.690659 -19.701828 -26.632837 -18.276993 -19.840322 -22.143257 -15.704172 -19.403345 -16.985531 -15.661587 -18.507982 -12.541664 -18.160645 -17.394148 -10.002390 -22.531729 -16.360292 -10.048105 -27.603607 -11.633666 -13.222141 -31.184183 -10.807022 -17.871170 -33.305058 -10.938109 -23.035486 -32.977077 -11.991804 -27.331316 -30.288118 -13.685768 -29.607595 -25.958691 -15.566105 -29.254396 -21.148857 -17.128981 -26.366362 -17.147409 -17.955626 -21.717333 -15.026535 -17.824539 -16.553017 -15.354514 -16.770845 -12.257188 -18.043470 -15.076882 -9.980907 -22.372896 -13.196545 -10.334103 -27.182732 -7.823611 -13.561234 -29.798311 -6.562028 -18.321558 -31.392876 -6.587018 -23.446518 -30.665489 -7.891887 -27.562881 -27.811058 -10.126996 -29.567675 -23.594423 -12.693447 -28.923716 -19.145428 -14.903564 -25.803553 -15.656179 -16.165148 -21.043228 -14.061615 -16.140160 -15.918270 -14.789000 -14.835291 -11.801906 -17.643429 -12.600184 -9.797109 -21.860062 -10.033732 -10.441066 -26.309055 -4.301488 -13.724998 -27.974102 -2.816119 -18.565123 -29.051964 -2.888653 -23.624680 -27.960846 -4.499653 -27.547966 -24.993114 -7.217454 -29.283737 -20.943970 -10.313823 -28.366898 -16.898376 -12.959089 -25.043112 -13.940349 -14.444459 -20.202988 -12.862489 -14.371926 -15.143431 -13.953603 -12.760927 -11.220146 -16.921333 -10.043128 -9.484371 -20.970476 -6.946759 -10.401209 -25.016071 -1.105855 -13.726733 -25.820316 0.458666 -18.621531 -26.443325 0.250238 -23.605082 -25.059237 -1.675292 -27.342045 -22.038912 -4.801980 -28.831106 -18.191648 -8.292031 -27.673275 -14.548316 -11.210291 -24.178787 -12.085140 -12.774813 -19.283989 -11.462132 -12.566386 -14.300438 -12.846218 -10.640858 -10.563475 -15.866542 -7.514171 -9.074409 -19.713804 -4.024120 -10.232241 -23.357136 1.751035 -13.570839 -23.440718 3.312894 -18.499443 -23.694420 2.937535 -23.408865 -22.097044 0.725533 -26.983627 -19.076607 -2.730407 -28.265875 -15.442430 -6.504267 -26.912033 -12.168289 -9.584846 -23.284861 -10.131487 -11.146707 -18.356256 -9.877784 -10.771349 -13.446836 -11.475158 -8.559348 -9.872072 -14.495595 -5.103411 -8.589822 -18.129770 -1.329550 -9.943663 -21.403912 4.294730 -13.271091 -20.920074 5.818930 -18.217869 -20.886723 5.281629 -23.062626 -19.144720 2.826796 -26.507210 -16.160839 -0.887800 -27.628649 -12.734606 -4.866833 -26.126455 -9.784078 -8.044127 -22.403141 -8.099846 -9.568329 -17.456364 -8.133198 -9.031029 -12.611606 -9.875198 -6.576197 -9.167021 -12.859078 -2.861603 -8.045579 -16.285311 1.117431 -9.547771 -19.235840 6.550520 -12.836811 -18.330976 8.034844 -17.789738 -18.085596 7.366256 -22.584435 -16.252892 4.723900 -25.936161 -13.323933 0.815796 -26.946829 -10.083534 -3.310883 -25.345631 -7.399956 -6.550398 -21.561605 -5.992260 -8.034723 -16.608679 -6.237640 -7.366136 -11.813985 -8.070343 -4.723783 -8.462255 -10.999301 -0.815680 -7.451584 -14.239699 3.311000 -9.052780 -16.923279 8.559740 -12.287674 -15.724259 10.019855 -17.237747 -15.324565 9.260584 -21.997019 -13.435716 6.485368 -25.290249 -10.563827 2.437826 -26.235014 -7.478418 -1.797505 -24.578171 -5.006225 -5.085774 -20.763666 -3.809665 -6.545891 -15.813594 -4.209359 -5.786620 -11.054321 -6.098206 -3.011406 -7.761092 -8.970095 1.036134 -6.816322 -12.055502 5.271466 -8.473166 -14.527699 10.374134 -11.648773 -13.125299 11.828353 -16.590067 -12.611694 11.014350 -21.325676 -10.686516 8.150236 -24.586700 -7.865613 4.003450 -25.499352 -4.904844 -0.314880 -23.819082 -2.597546 -3.647663 -19.996122 -1.561955 -5.101882 -15.054832 -2.075558 -4.287881 -10.319221 -4.000735 -1.423770 -7.058196 -6.821638 2.723015 -6.145543 -9.782406 7.041346 -7.825809 -12.089706 12.030798 -10.938441 -10.556322 13.498433 -15.865925 -9.955592 12.663052 -20.585777 -8.001101 9.748491 -23.833321 -5.216549 5.535707 -24.738377 -2.348058 1.153512 -23.058437 -0.164236 -2.223890 -19.243641 0.749763 -3.691527 -14.316159 0.149035 -2.856147 -9.596306 -1.805456 0.058411 -6.348763 -4.590006 4.271194 -5.443703 -7.458498 8.653390 -7.123641 -9.642321 13.569963 -10.174023 -8.024686 15.065849 -15.083549 -7.351054 14.234336 -19.790962 -5.365159 11.298224 -23.034912 -2.599120 7.044246 -23.946182 0.205906 2.612251 -22.280602 2.298314 -0.810214 -18.484463 3.117445 -2.306100 -13.574936 2.443815 -1.474588 -8.867524 0.457921 1.461521 -5.623574 -2.308118 5.715498 -4.712300 -5.113144 10.147494 -6.377878 -7.205553 15.019448 -9.370708 -5.544965 16.554142 -14.258156 -4.801669 15.746539 -18.950926 -2.771739 12.813036 -22.191593 0.000905 8.539662 -23.111824 2.773336 4.071466 -21.465042 4.802683 0.605696 -17.692505 5.545186 -0.928998 -12.805058 4.801889 -0.121397 -8.112289 2.771961 2.812104 -4.871621 -0.000683 7.085476 -3.951388 -2.773114 11.553673 -5.598166 -4.802462 16.411146 -8.542888 -3.121722 17.988007 -13.404404 -2.300686 17.215405 -18.074406 -0.205672 14.300358 -21.301571 2.601965 10.023951 -22.221182 5.369920 5.532044 -20.586834 7.356521 2.028239 -16.836445 8.029461 0.451377 -11.974930 7.208426 1.223978 -7.304929 5.113413 4.139023 -4.077763 2.305777 8.415428 -3.158148 -0.462178 12.907336 -4.792495 -2.448780 17.778435 -7.694009 -0.747132 19.394234 -12.525992 0.167225 18.658350 -17.161289 2.350671 15.767965 -20.357872 5.218153 11.497554 -21.259218 8.001331 6.991373 -19.623817 9.954455 3.456845 -15.889874 10.554189 1.841046 -11.057892 9.639832 2.576927 -6.422596 7.456388 5.467310 -3.226012 4.588907 9.737719 -2.324661 1.805728 14.243902 -3.960059 -0.147397 19.141571 -6.837359 1.563875 20.786924 -11.634661 2.600040 20.083500 -16.214685 4.907311 17.219780 -19.350216 7.867458 12.963096 -20.201092 10.687311 8.454024 -18.539324 12.611292 4.900765 -14.810179 13.123875 3.255411 -10.012879 12.087709 3.958834 -5.432857 9.780439 6.822552 -2.297323 6.820294 11.079234 -1.446443 4.000441 15.588306 -3.108210 2.076458 20.524488 -5.980209 3.807610 22.183979 -10.734537 5.006513 21.501413 -15.229613 7.481046 18.659683 -18.260984 10.568161 14.420228 -19.016397 13.440669 9.919009 -17.293440 15.328881 6.362121 -13.553778 15.726856 4.702630 -8.799450 14.527954 5.385194 -4.304374 12.053423 8.226922 -1.273003 8.966308 12.466374 -0.517587 6.093800 16.967594 -2.240542 4.205586 21.947735 -5.116407 5.987090 23.603893 -9.813029 7.399107 22.926533 -14.184496 10.087301 20.097147 -17.059475 13.331370 15.873868 -17.667620 16.262070 11.388324 -15.845978 18.094122 7.842407 -12.082657 18.336630 6.186246 -7.386036 16.924614 6.863606 -3.014569 14.236421 9.692990 -0.139589 10.992352 13.916266 0.468559 8.061650 18.401812 -1.353081 6.229598 23.423786 -4.244947 8.095219 25.058573 -8.856600 9.784908 24.369257 -13.049791 12.740734 21.540537 -15.700957 16.170687 17.330366 -16.099722 19.155712 12.866860 -14.139237 20.895975 9.346008 -10.344812 20.925175 7.711221 -5.733160 19.235487 8.400537 -1.539970 16.279661 11.229255 1.111198 12.849710 15.439423 1.509966 9.864683 19.902929 -0.450518 8.124418 24.957916 -3.346223 10.130033 26.558876 -7.826197 12.170057 25.844412 -11.769047 15.447004 23.005962 -14.118289 19.082825 18.804090 -14.244447 22.103300 14.364684 -12.113718 23.699099 10.877277 -8.297028 23.442625 9.276318 -3.817055 21.402605 9.990781 0.125795 18.125656 12.829227 2.475038 14.489837 17.031097 2.601200 11.469360 21.470505 0.470472 9.873562 26.544920 -2.390386 12.083067 28.111742 -6.661820 14.551840 27.369120 -10.258378 18.199881 24.516035 -12.216366 22.049700 20.316969 -12.011140 25.069742 15.897061 -9.697695 26.450788 12.440619 -5.895913 25.822790 10.873796 -1.624480 23.354019 11.616417 1.972078 19.705978 14.469501 3.930067 15.856160 18.668564 3.724845 12.836119 23.088472 1.411400 11.455069 28.167831 -1.310941 13.939068 29.723341 -5.258778 16.903841 28.968876 -8.391780 20.954769 26.106592 -9.870459 25.006405 21.903439 -9.298606 27.973120 17.485645 -6.829449 29.059980 14.036955 -3.124596 27.975769 12.481443 0.823240 25.010998 13.235907 3.956242 20.960072 16.098188 5.434922 16.908436 20.301340 4.863071 13.941719 24.719135 2.393916 12.854855</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="1440" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="4320">0.711029 -0.012962 -0.703043 0.712312 -0.107338 -0.693606 0.878988 -0.380802 -0.287003 0.866840 -0.357365 -0.347677 0.811136 -0.552187 0.192736 0.790661 -0.604342 0.098118 0.530355 -0.578876 0.619376 0.506044 -0.691282 0.515799 0.111412 -0.455314 0.883333 0.089131 -0.597257 0.797082 -0.337285 -0.213395 0.916898 -0.351405 -0.347054 0.869522 -0.699237 0.085184 0.709796 -0.700655 -0.004954 0.713483 -0.877527 0.363015 0.313315 -0.865356 0.340260 0.367944 -0.820639 0.545750 -0.169433 -0.798611 0.596880 -0.077170 -0.539730 0.581171 -0.609041 -0.514964 0.693845 -0.503380 -0.109244 0.453369 -0.884603 -0.089357 0.599836 -0.795117 0.351030 0.198193 -0.915149 0.361081 0.338650 -0.868871 0.714099 -0.190650 -0.673584 0.900042 -0.371867 -0.227245 0.846724 -0.454915 0.275883 0.572214 -0.419954 0.704422 0.149328 -0.276940 0.949213 -0.313366 -0.062356 0.947583 -0.696384 0.169219 0.697434 -0.897004 0.357444 0.260035 -0.856522 0.450903 -0.251109 -0.580435 0.420332 -0.697435 -0.142347 0.268832 -0.952611 0.333473 0.043078 -0.941775 0.716271 -0.257405 -0.648613 0.926808 -0.327873 -0.183101 0.891637 -0.312756 0.327365 0.624520 -0.217361 0.750153 0.196158 -0.066667 0.978303 -0.284229 0.101065 0.953415 -0.693212 0.242858 0.678585 -0.921107 0.320869 0.220467 -0.900701 0.311972 -0.302343 -0.630267 0.214445 -0.746175 -0.183192 0.054410 -0.981570 0.310989 -0.118299 -0.943022 0.718100 -0.307551 -0.624296 0.951852 -0.256899 -0.167273 0.933384 -0.140013 0.330440 0.672634 0.011947 0.739879 0.238596 0.160117 0.957828 -0.258488 0.266825 0.928433 -0.691227 0.303910 0.655625 -0.943623 0.259689 0.205273 -0.941271 0.143152 -0.305804 -0.676868 -0.015990 -0.735931 -0.223104 -0.171077 -0.959665 0.288764 -0.276946 -0.916469 0.719521 -0.344264 -0.603135 0.967347 -0.175155 -0.183195 0.958693 0.038025 0.281891 0.701133 0.239858 0.671477 0.262816 0.379243 0.887188 -0.244924 0.420512 0.873603 -0.691824 0.351409 0.630786 -0.957985 0.187142 0.217353 -0.965393 -0.030876 -0.258964 -0.705024 -0.242907 -0.666287 -0.248035 -0.386993 -0.888096 0.275192 -0.422942 -0.863359 0.721022 -0.370405 -0.585600 0.969579 -0.098086 -0.224268 0.960963 0.197590 0.193671 0.702398 0.440265 0.559289 0.262225 0.568598 0.779701 -0.247408 0.549417 0.798079 -0.695222 0.385411 0.606733 -0.960782 0.116404 0.251689 -0.966677 -0.187388 -0.174414 -0.705454 -0.441636 -0.554340 -0.248266 -0.573140 -0.780944 0.275717 -0.545716 -0.791312 0.722974 -0.387898 -0.571702 0.959415 -0.033688 -0.279978 0.941381 0.326780 0.083759 0.677936 0.600423 0.424141 0.238564 0.717851 0.654047 -0.264311 0.648350 0.713990 -0.700464 0.407338 0.586025 -0.952252 0.055085 0.300302 -0.946538 -0.315150 -0.068894 -0.680013 -0.600529 -0.420651 -0.225334 -0.719851 -0.656536 0.289814 -0.640575 -0.711106 0.725160 -0.398235 -0.561741 0.939349 0.017030 -0.342539 0.904460 0.425183 -0.034212 0.633353 0.720682 0.281924 0.197356 0.828265 0.524431 -0.291530 0.719452 0.630396 -0.706071 0.419789 0.570299 -0.934110 0.005351 0.356944 -0.909430 -0.413384 0.045288 -0.634669 -0.720279 -0.279988 -0.184850 -0.828670 -0.528334 0.314234 -0.709287 -0.631006 0.726831 -0.402952 -0.556189 0.911004 0.055868 -0.408597 0.853774 0.497350 -0.153990 0.573362 0.807238 0.140080 0.143349 0.906328 0.397518 -0.325502 0.768075 0.551461 -0.710677 0.425650 0.560142 -0.907602 -0.033286 0.418511 -0.858809 -0.485922 0.162256 -0.574083 -0.806842 -0.139405 -0.131331 -0.905818 -0.402798 0.345958 -0.756417 -0.555109 0.726879 -0.403781 -0.555525 0.874357 0.084299 -0.477905 0.790421 0.547530 -0.274675 0.499916 0.866074 -0.000157 0.078836 0.958368 0.274437 -0.364223 0.799388 0.477829 -0.713128 0.427589 0.555532 -0.872714 -0.061446 0.484350 -0.795764 -0.536513 0.280916 -0.500147 -0.865941 -0.000229 -0.066960 -0.957295 -0.281251 0.383094 -0.786476 -0.484452 0.723973 -0.402626 -0.560138 0.827859 0.102165 -0.551554 0.713058 0.577341 -0.397776 0.412199 0.900209 -0.140409 0.003680 0.988103 0.153750 -0.407170 0.816896 0.408527 -0.712386 0.427962 0.556197 -0.828141 -0.078595 0.554983 -0.719064 -0.566575 0.402418 -0.412073 -0.900498 0.138918 0.008332 -0.986659 -0.162589 0.424918 -0.802630 -0.418603 0.716591 -0.401563 -0.570303 0.768725 0.107257 -0.630522 0.618378 0.585029 -0.524737 0.307173 0.908820 -0.282297 -0.084203 0.995870 0.033949 -0.454983 0.822012 0.342471 -0.707467 0.428869 0.561749 -0.771519 -0.082539 0.630830 -0.625633 -0.574427 0.527842 -0.306981 -0.909780 0.279398 0.096372 -0.994298 -0.045657 0.471620 -0.806288 -0.357035 0.702999 -0.402924 -0.586042 0.693472 0.095244 -0.714160 0.502033 0.565422 -0.654417 0.180608 0.887198 -0.424572 -0.187961 0.978573 -0.084052 -0.508956 0.814010 0.279914 -0.697428 0.432129 0.571716 -0.699907 -0.069417 0.710853 -0.511429 -0.555255 0.655845 -0.180927 -0.889372 0.419861 0.199834 -0.977436 0.068443 0.523745 -0.797151 -0.300403 0.681373 -0.409330 -0.606779 0.599247 0.060359 -0.798286 0.360782 0.511149 -0.780105 0.029505 0.828143 -0.559740 -0.309750 0.930824 -0.193964 -0.569842 0.790572 0.224224 -0.681311 0.439148 0.585632 -0.610870 -0.034381 0.790984 -0.373390 -0.502165 0.780007 -0.031171 -0.832399 0.553300 0.320292 -0.931228 0.173861 0.581090 -0.773899 -0.251821 0.650189 -0.423356 -0.630891 0.486242 -0.002013 -0.873822 0.196317 0.416812 -0.887540 -0.143599 0.726649 -0.671834 -0.446917 0.848937 -0.282083 -0.635493 0.750049 0.183237 -0.657916 0.450847 0.603227 -0.504490 0.026216 0.863020 -0.213006 -0.409684 0.887010 0.139933 -0.733510 0.665118 0.454922 -0.852228 0.258367 0.640940 -0.736118 -0.217545 0.608673 -0.446558 -0.655823 0.359790 -0.090661 -0.928618 0.018513 0.286147 -0.958007 -0.326837 0.587878 -0.739985 -0.588495 0.737913 -0.330391 -0.698511 0.695724 0.167484 -0.625362 0.467892 0.624499 -0.384980 0.110546 0.916281 -0.039058 -0.281203 0.958853 0.321867 -0.596748 0.735046 0.593509 -0.744688 0.305267 0.696583 -0.687395 -0.205575 0.556655 -0.478802 -0.678884 0.228984 -0.195846 -0.953526 -0.156727 0.136003 -0.978233 -0.501353 0.431581 -0.749922 -0.717154 0.615432 -0.327008 -0.747354 0.638580 0.183515 -0.580914 0.491321 0.648955 -0.258620 0.208806 0.943141 0.136410 -0.134552 0.981472 0.498513 -0.441672 0.745930 0.719672 -0.625236 0.301916 0.738283 -0.637288 -0.220911 0.494298 -0.518393 -0.697810 0.101922 -0.302737 -0.947609 -0.315403 -0.009548 -0.948910 -0.650544 0.285181 -0.703892 -0.817655 0.505640 -0.275261 -0.771908 0.593507 0.227831 -0.521838 0.522811 0.674057 -0.129728 0.308928 0.942197 0.302630 0.008262 0.953072 0.652953 -0.295116 0.697538 0.818272 -0.517304 0.250653 0.757834 -0.598130 -0.260631 0.422792 -0.562927 -0.710183 -0.016982 -0.398884 -0.916844 -0.450856 -0.131350 -0.882880 -0.767089 0.169751 -0.618676 -0.883914 0.426427 -0.191980 -0.768947 0.570939 0.287662 -0.448610 0.562967 0.694130 -0.003752 0.401907 0.915673 0.446785 0.129946 0.885154 0.772693 -0.178651 0.609121 0.882690 -0.438556 0.168900 0.752808 -0.578528 -0.313983 0.345350 -0.609299 -0.713784 -0.125668 -0.477896 -0.869381 -0.562537 -0.221460 -0.796560 -0.852124 0.092690 -0.515067 -0.918701 0.382761 -0.097374 -0.742498 0.572179 0.348294 -0.366187 0.609051 0.703536 0.113070 0.481070 0.869360 0.564167 0.221040 0.795523 0.858265 -0.100295 0.503311 0.916007 -0.393777 0.076618 0.726910 -0.579456 -0.368554 0.267292 -0.654262 -0.707457 -0.222045 -0.538916 -0.812567 -0.652052 -0.281696 -0.703901 -0.910667 0.049766 -0.410133 -0.929472 0.368820 -0.007354 -0.701007 0.591037 0.399080 -0.282488 0.655790 0.700100 0.215721 0.543292 0.811356 0.656292 0.282250 0.699726 0.915945 -0.055853 0.397399 0.925906 -0.377598 -0.010888 0.687480 -0.596027 -0.414877 0.194767 -0.695182 -0.691945 -0.303671 -0.584432 -0.752478 -0.721309 -0.319124 -0.614714 -0.948648 0.030914 -0.314821 -0.924931 0.373821 0.068999 -0.654026 0.618532 0.435509 -0.205434 0.698275 0.685718 0.301017 0.589386 0.749675 0.726033 0.320100 0.608615 0.952539 -0.035672 0.302318 0.920971 -0.380317 -0.084683 0.642875 -0.621152 -0.448198 0.132571 -0.730433 -0.669995 -0.369170 -0.618021 -0.694092 -0.772751 -0.341632 -0.534924 -0.971812 0.025876 -0.234334 -0.912752 0.387679 0.128797 -0.609146 0.647366 0.458102 -0.140148 0.734108 0.664413 0.368231 0.622720 0.690380 0.776890 0.342576 0.528283 0.974360 -0.029626 0.223036 0.908785 -0.392398 -0.141894 0.600131 -0.648412 -0.468407 0.083231 -0.759546 -0.645107 -0.418741 -0.643235 -0.641018 -0.809305 -0.355860 -0.467321 -0.985114 0.026652 -0.169826 -0.898626 0.403168 0.172996 -0.571132 0.673115 0.469814 -0.088861 0.763006 0.640255 0.418393 0.647222 0.637221 0.812522 0.356582 0.461147 0.986626 -0.029678 0.160276 0.894924 -0.406704 -0.183584 0.563854 -0.673429 -0.478080 0.047203 -0.782894 -0.620361 -0.453834 -0.663044 -0.595321 -0.833986 -0.366590 -0.412406 -0.992377 0.027938 -0.120028 -0.886133 0.415925 0.204388 -0.542223 0.693613 0.474231 -0.051714 0.785630 0.616531 0.453431 0.666136 0.592168 0.836232 0.367028 0.407439 0.993174 -0.030490 0.112588 0.882850 -0.418831 -0.212503 0.536280 -0.693884 -0.480550 0.022889 -0.800975 -0.598260 -0.477092 -0.679115 -0.557840 -0.849830 -0.376153 -0.369186 -0.996222 0.027453 -0.082384 -0.876694 0.424442 0.226399 -0.522108 0.708606 0.474639 -0.026660 0.803045 0.595322 0.476489 0.681531 0.555404 0.851305 0.376506 0.365409 0.996612 -0.029501 0.076770 0.873927 -0.426836 -0.232515 0.517258 -0.708944 -0.479419 0.008456 -0.814509 -0.580090 -0.490880 -0.692707 -0.528388 -0.859123 -0.386018 -0.336003 -0.998246 0.023912 -0.054155 -0.870756 0.427960 0.242146 -0.509934 0.718045 0.473686 -0.011798 0.815893 0.578082 0.489937 0.694551 0.526840 0.859931 0.386366 0.333526 0.998409 -0.025517 0.050291 0.868523 -0.430024 -0.246470 0.505947 -0.718616 -0.477083 0.001202 -0.823894 -0.566743 -0.497959 -0.704025 -0.506345 -0.863964 -0.396109 -0.310909 -0.999312 0.017701 -0.032592 -0.867670 0.427105 0.254423 -0.503667 0.722637 0.473408 -0.004261 0.824755 0.565474 0.496661 0.705507 0.505556 0.864224 0.396617 0.309536 0.999369 -0.018787 0.030155 0.865966 -0.428811 -0.257340 0.500406 -0.723370 -0.475742 -0.001279 -0.829486 -0.558525 -0.500620 -0.713086 -0.490803 -0.865924 -0.406098 -0.291994 -0.999839 0.009397 -0.015267 -0.866575 0.422539 0.265533 -0.501400 0.722925 0.475371 -0.001626 0.829894 0.557918 0.498926 0.714309 0.490750 0.865688 0.406840 0.291662 0.999851 -0.009951 0.014101 0.865377 -0.423908 -0.267254 0.498743 -0.723813 -0.476812 -0.001425 -0.831464 -0.555577 -0.501068 -0.719552 -0.480809 -0.866381 -0.415218 -0.277451 -1.000000 -0.000006 0.000006 -0.866382 0.415208 0.277460 -0.501071 0.719546 0.480814 -0.001429 0.831461 0.555581 0.498926 0.720587 0.481484 0.865667 0.416250 0.278131 1.000000 -0.000004 0.000009 0.865669 -0.416256 -0.278116 0.498930 -0.720590 -0.481475 -0.001636 -0.829899 -0.557912 -0.501409 -0.722924 -0.475363 -0.866581 -0.422536 -0.265519 -0.999839 -0.009397 0.015288 -0.865918 0.406097 0.292014 -0.500610 0.713085 0.490815 -0.001268 0.829484 0.558529 0.498753 0.723807 0.476812 0.865383 0.423894 0.267257 0.999851 0.009931 -0.014091 0.865683 -0.406859 -0.291648 0.498917 -0.714322 -0.490740 -0.004308 -0.824764 -0.565461 -0.503709 -0.722621 -0.473388 -0.867694 -0.427075 -0.254389 -0.999311 -0.017671 0.032637 -0.863938 0.396130 0.310955 -0.497915 0.704034 0.506376 0.001251 0.823888 0.566751 0.500448 0.723348 0.475731 0.865991 0.428771 0.257324 0.999369 0.018734 -0.030162 0.864201 -0.396669 -0.309532 0.496621 -0.705542 -0.505547 -0.011914 -0.815908 -0.578058 -0.510035 -0.718003 -0.473642 -0.870814 -0.427882 -0.242075 -0.998243 -0.023829 0.054245 -0.859060 0.386081 0.336091 -0.490775 0.692737 0.528446 0.008575 0.814500 0.580100 0.506050 0.718567 0.477048 0.868582 0.429936 0.246415 0.998409 0.025404 -0.050336 0.859874 -0.386477 -0.333544 0.489838 -0.694625 -0.526834 -0.026860 -0.803076 -0.595272 -0.522282 -0.708535 -0.474551 -0.876792 -0.424307 -0.226273 -0.996214 -0.027306 0.082537 -0.849717 0.376267 0.369331 -0.476905 0.679170 0.557933 0.023100 0.800961 0.598271 0.517437 0.708859 0.479351 0.874029 0.426685 0.232407 0.996611 0.029307 -0.076861 0.851203 -0.376697 -0.365448 0.476316 -0.681662 -0.555392 -0.052040 -0.785679 -0.616442 -0.542506 -0.693496 -0.474079 -0.886287 -0.415701 -0.204175 -0.992354 -0.027695 0.120275 -0.833794 0.366777 0.412629 -0.453527 0.663136 0.595454 0.047542 0.782875 0.620360 0.536564 0.693753 0.480423 0.883005 0.418598 0.212314 0.993165 0.030190 -0.112747 0.836066 -0.367329 -0.407508 0.453151 -0.666346 -0.592146 -0.089346 -0.763063 -0.640119 -0.571538 -0.672932 -0.469581 -0.898833 -0.402843 -0.172676 -0.985061 -0.026312 0.170185 -0.809011 0.356121 0.467631 -0.418288 0.643366 0.641182 0.083724 0.759528 0.645064 0.564261 0.673256 0.477846 0.895139 0.406378 0.183258 0.986594 0.029241 -0.160550 0.812257 -0.357025 -0.461272 0.417963 -0.647525 -0.637196 -0.140708 -0.734186 -0.664208 -0.609607 -0.647157 -0.457786 -0.912965 -0.387317 -0.128378 -0.971712 -0.025511 0.234789 -0.772372 0.341899 0.535301 -0.368617 0.618148 0.694272 0.133150 0.730404 0.669912 0.600589 0.648215 0.468093 0.909011 0.392021 0.141491 0.974307 0.029097 -0.223338 0.776581 -0.343134 -0.528376 0.367738 -0.623107 -0.690294 -0.205964 -0.698422 -0.685409 -0.654464 -0.618356 -0.435100 -0.925098 -0.373502 -0.068482 -0.948475 -0.030615 0.315369 -0.720846 0.319316 0.615157 -0.303051 0.584496 0.752678 0.195382 0.695117 0.691837 0.643337 0.620931 0.447842 0.921186 0.379886 0.084277 0.952497 0.035021 -0.302528 0.725775 -0.320827 -0.608540 0.300579 -0.589911 -0.749438 -0.283249 -0.655900 -0.699689 -0.701583 -0.590738 -0.398510 -0.929636 -0.368390 0.008059 -0.910368 -0.049400 0.410839 -0.651395 0.281927 0.704415 -0.221226 0.539023 0.812720 0.268059 0.654253 0.707176 0.688018 0.595836 0.414259 0.926122 0.377087 0.010224 0.915845 0.054953 -0.397755 0.655906 -0.283288 -0.699668 0.215069 -0.543975 -0.811071 -0.366821 -0.609254 -0.703031 -0.742956 -0.571975 -0.347650 -0.918725 -0.382507 0.098145 -0.851685 -0.092552 0.515816 -0.561783 0.221488 0.797084 -0.124825 0.477893 0.869504 0.346065 0.609290 0.713446 0.727367 0.579306 0.367888 0.916210 0.393183 -0.077244 0.858321 0.099048 -0.503463 0.564059 -0.222529 -0.795184 0.112635 -0.482013 -0.868894 -0.449082 -0.563234 -0.693609 -0.769263 -0.570841 -0.287009 -0.883771 -0.426384 0.192731 -0.766498 -0.169875 0.619373 -0.450020 0.131158 0.883334 -0.016164 0.398781 0.916904 0.423390 0.562952 0.709807 0.753146 0.578441 0.313332 0.882964 0.437808 -0.169408 0.773206 0.176818 -0.609006 0.447308 -0.132102 -0.884571 -0.003821 -0.403125 -0.915137 -0.522200 -0.523095 -0.673557 -0.772089 -0.593507 -0.227217 -0.817339 -0.505800 0.275904 -0.649798 -0.285542 0.704435 -0.314494 0.009182 0.949215 0.102692 0.302592 0.947572 0.494749 0.518501 0.697409 0.758056 0.598123 0.259998 0.818733 0.516331 -0.251156 0.654171 0.292520 -0.697490 0.303892 -0.011130 -0.952641 -0.129504 -0.310332 -0.941766 -0.581017 -0.491594 -0.648655 -0.747332 -0.638710 -0.183152 -0.716682 -0.615816 0.327319 -0.500534 -0.432182 0.750123 -0.155860 -0.136556 0.978294 0.229599 0.195602 0.953428 0.556907 0.478887 0.678617 0.738439 0.637244 0.220516 0.720547 0.624049 -0.302284 0.500863 0.438669 -0.746127 0.138736 0.131532 -0.981556 -0.257908 -0.210124 -0.943044 -0.625387 -0.468097 -0.624321 -0.698404 -0.695875 -0.167300 -0.587961 -0.738326 0.330420 -0.326002 -0.588487 0.739869 0.019328 -0.286686 0.957830 0.360290 0.090438 0.928446 0.608796 0.446649 0.655647 0.696716 0.687342 0.205300 0.594615 0.743596 -0.305774 0.324562 0.594239 -0.735893 -0.036637 0.278840 -0.959638 -0.384229 -0.111546 -0.916475 -0.657908 -0.450998 -0.603123 -0.635366 -0.750171 -0.183178 -0.446409 -0.849263 0.281905 -0.142831 -0.727125 0.671483 0.197037 -0.417223 0.887187 0.486639 0.001861 0.873601 0.650237 0.423445 0.630782 0.641056 0.736078 0.217339 0.455957 0.851484 -0.258995 0.142159 0.731988 -0.666322 -0.211116 0.408267 -0.888115 -0.503872 -0.026869 -0.863360 -0.681289 -0.439230 -0.585595 -0.569734 -0.790639 -0.224262 -0.309355 -0.931017 0.193669 0.030097 -0.828433 0.559279 0.361325 -0.511397 0.779691 0.599523 -0.060444 0.798072 0.681386 0.409381 0.606728 0.581201 0.773861 0.251682 0.321081 0.930849 -0.174435 -0.029687 0.831734 -0.554381 -0.372173 0.501546 -0.780985 -0.610443 0.034058 -0.791327 -0.697416 -0.432165 -0.571703 -0.508880 -0.814034 -0.279983 -0.187689 -0.978651 0.083753 0.181012 -0.887322 0.424139 0.502392 -0.565527 0.654050 0.693639 -0.095273 0.713994 0.702997 0.402951 0.586025 0.523839 0.797129 0.300296 0.200358 0.977297 -0.068904 -0.180051 0.889172 -0.420661 -0.510738 0.555069 -0.656541 -0.699662 0.069300 -0.711105 -0.707462 -0.428888 -0.561741 -0.454925 -0.822015 -0.342540 -0.084011 -0.995877 -0.034210 0.307450 -0.908840 0.281930 0.618615 -0.585047 0.524439 0.768823 -0.107253 0.630403 0.716582 0.401580 0.570301 0.471693 0.806287 0.356940 0.096718 0.994281 0.045281 -0.306446 0.909777 -0.279992 -0.625228 0.574418 -0.528331 -0.771381 0.082510 -0.631002 -0.712383 -0.427976 -0.556190 -0.407124 -0.816886 -0.408593 0.003826 -0.988066 -0.153984 0.412405 -0.900166 0.140084 0.713228 -0.577308 0.397518 0.827924 -0.102147 0.551459 0.723964 0.402637 0.560143 0.424975 0.802648 0.418514 0.008584 0.986711 0.162257 -0.411701 0.900593 -0.139411 -0.718789 0.566647 -0.402806 -0.828051 0.078604 -0.555116 -0.713124 -0.427606 -0.555524 -0.364176 -0.799368 -0.477898 0.078960 -0.958292 -0.274667 0.500081 -0.865979 -0.000153 0.790552 -0.547459 0.274438 0.874403 -0.084267 0.477827 0.726867 0.403794 0.555532 0.383141 0.786516 0.484352 -0.066753 0.957408 0.280917 -0.499850 0.866112 -0.000232 -0.795556 0.536641 -0.281259 -0.872651 0.061472 -0.484459 -0.710671 -0.425667 -0.560138 -0.325452 -0.768029 -0.551555 0.143462 -0.906197 -0.397777 0.573502 -0.807082 -0.140408 0.853879 -0.497242 0.153754 0.911036 -0.055831 0.408530 0.726819 0.402964 0.556196 0.346009 0.756492 0.554975 -0.131129 0.906021 0.402408 -0.573811 0.807121 0.138911 -0.858635 0.486117 -0.162592 -0.907558 0.033325 -0.418603 -0.706063 -0.419801 -0.570300 -0.291480 -0.719365 -0.630518 0.197458 -0.828050 -0.524732 0.633473 -0.720433 -0.282290 0.904549 -0.425015 0.033954 0.939375 -0.016983 0.342472 0.725148 0.398244 0.561749 0.314283 0.709419 0.630833 -0.184651 0.829025 0.527846 -0.634404 0.720742 0.279396 -0.909272 0.413690 -0.045663 -0.934075 -0.005287 -0.357037 -0.700444 -0.407352 -0.586040 -0.264259 -0.648201 -0.714145 0.238646 -0.717505 -0.654396 0.678026 -0.600026 -0.424558 0.941449 -0.326511 -0.084052 0.959434 0.033767 0.279905 0.722952 0.387924 0.571714 0.289835 0.640829 0.710868 -0.225156 0.720514 0.655870 -0.679757 0.601360 0.419877 -0.946400 0.315664 0.068442 -0.952224 -0.054988 -0.300409 -0.695170 -0.385426 -0.606783 -0.247343 -0.549146 -0.798286 0.262280 -0.568024 -0.780102 0.702441 -0.439628 -0.559736 0.960992 -0.197166 -0.193960 0.969575 0.098211 0.224230 0.720961 0.370468 0.585635 0.275649 0.546238 0.790975 -0.248195 0.574474 0.779986 -0.705288 0.443217 0.553288 -0.966612 0.188242 0.173858 -0.960760 -0.116291 -0.251826 -0.691714 -0.351409 -0.630907 -0.244843 -0.420077 -0.873835 0.262832 -0.378396 -0.887545 0.701111 -0.238944 -0.671825 0.958667 -0.037421 -0.282060 0.967303 0.175325 0.183265 0.719384 0.344357 0.603245 0.274915 0.423841 0.863007 -0.248331 0.389399 0.886961 -0.705231 0.245639 0.665065 -0.965520 0.032148 0.258335 -0.957959 -0.187028 -0.217564 -0.691068 -0.303837 -0.655827 -0.258413 -0.266233 -0.928624 0.238549 -0.159073 -0.958014 0.672531 -0.010860 -0.739989 0.933296 0.140712 -0.330393 0.951769 0.257070 0.167485 0.717884 0.307650 0.624495 0.288214 0.278203 0.916262 -0.224018 0.174584 0.958820 -0.677752 0.019779 0.735025 -0.941684 -0.141590 0.305260 -0.943595 -0.259550 -0.205577 -0.692951 -0.242697 -0.678909 -0.284065 -0.100397 -0.953534 0.196179 0.067720 -0.978227 0.624467 0.218385 -0.749899 0.891576 0.313339 -0.326972 0.926707 0.327905 0.183557 0.715935 0.257372 0.648996 0.310086 0.119481 0.943171 -0.184834 -0.050983 0.981447 -0.631838 -0.210972 0.745836 -0.901322 -0.310670 0.301833 -0.921030 -0.320751 -0.220959 -0.696171 -0.168894 -0.697726 -0.313230 0.063056 -0.947581 0.149347 0.277872 -0.948937 0.572176 0.420775 -0.703962 0.846679 0.455317 -0.275356 0.899940 0.371819 0.227726 0.713745 0.190644 0.673960 0.332561 -0.041957 0.942148 -0.143928 -0.266039 0.953157 -0.581902 -0.417793 0.697739 -0.857110 -0.449936 0.250839 -0.896960 -0.357218 -0.260494 -0.698876 -0.084696 -0.710211 -0.336915 0.214127 -0.916863 0.111714 0.456096 -0.882891 0.530586 0.579407 -0.618681 0.811277 0.552245 -0.191977 0.878932 0.380423 0.287675 0.711843 0.106964 0.694145 0.349914 -0.197832 0.915654 -0.110877 -0.452092 0.885053 -0.541059 -0.579985 0.608993 -0.821130 -0.545203 0.168820 -0.877403 -0.362700 -0.314027 -0.700340 0.005574 -0.713787 -0.351026 0.347781 -0.869384 0.089493 0.597897 -0.796561 0.506347 0.691607 -0.515065 0.790841 0.604227 -0.097369 0.866770 0.356925 0.348302 0.710540 0.012602 0.703544 0.360078 -0.338445 0.869367 -0.090656 -0.599086 0.795536 -0.515989 -0.693124 0.503324 -0.799027 -0.596393 0.076623 -0.865281 -0.339789 -0.368555 -0.700244 0.095646 -0.707468 -0.355681 0.461749 -0.812575 0.082083 0.705534 -0.703906 0.498443 0.763768 -0.410137 0.784153 0.620524 -0.007357 0.862363 0.311555 0.399078 0.709177 -0.083276 0.700095 0.362639 -0.458492 0.811343 -0.083718 -0.709512 0.699703 -0.506347 -0.765314 0.397375 -0.789960 -0.613062 -0.010905 -0.859908 -0.297364 -0.414889 -0.699465 0.178880 -0.691918 -0.354351 0.555176 -0.752473 0.084225 0.784229 -0.614728 0.501041 0.806120 -0.314847 0.786167 0.614154 0.068969 0.862668 0.257209 0.435485 0.707462 -0.171147 0.685716 0.359956 -0.555311 0.749708 -0.085760 -0.788768 0.608679 -0.507136 -0.807075 0.302394 -0.789844 -0.607443 -0.084614 -0.859387 -0.246205 -0.448148 -0.698843 0.250395 -0.670015 -0.350621 0.628708 -0.694112 0.090530 0.840025 -0.534941 0.508331 0.828662 -0.234348 0.792132 0.596609 0.128785 0.865223 0.203827 0.458088 0.705839 -0.245716 0.664391 0.355179 -0.630291 0.690348 -0.091764 -0.844117 0.528247 -0.512833 -0.829018 0.223005 -0.794210 -0.590838 -0.141918 -0.861593 -0.195531 -0.468428 -0.699448 0.307637 -0.645083 -0.347751 0.684222 -0.641023 0.096400 0.878803 -0.467346 0.515578 0.839838 -0.169860 0.798428 0.576712 0.172963 0.868496 0.158141 0.469794 0.705246 -0.304462 0.640259 0.351377 -0.685885 0.637257 -0.097384 -0.881929 0.461213 -0.518966 -0.839619 0.160358 -0.799663 -0.571720 -0.183509 -0.865153 -0.151657 -0.478027 -0.701617 0.350553 -0.620360 -0.347312 0.724543 -0.595325 0.099498 0.905546 -0.412415 0.520366 0.845464 -0.120039 0.803258 0.559469 0.204378 0.871798 0.122794 0.474225 0.706241 -0.348010 0.616532 0.350189 -0.725738 0.592175 -0.100247 -0.907709 0.407450 -0.522982 -0.844873 0.112602 -0.804138 -0.555166 -0.212491 -0.869063 -0.117506 -0.480543 -0.705065 0.380711 -0.598283 -0.349524 0.752757 -0.557844 0.099224 0.924048 -0.369174 0.521945 0.848993 -0.082364 0.805961 0.546956 0.226417 0.874729 0.097779 0.474645 0.708759 -0.378507 0.595310 0.351927 -0.753467 0.555369 -0.099644 -0.925520 0.365353 -0.523894 -0.848323 0.076706 -0.806626 -0.543382 -0.232575 -0.872574 -0.093434 -0.479464 -0.709630 0.399917 -0.580079 -0.354483 0.771461 -0.528385 0.095238 0.937033 -0.336005 0.519812 0.852562 -0.054159 0.805989 0.540138 0.242143 0.876808 0.082620 0.473689 0.712490 -0.397702 0.578093 0.356545 -0.771554 0.526858 -0.095346 -0.937898 0.333550 -0.521291 -0.851894 0.050317 -0.806671 -0.537165 -0.246446 -0.875322 -0.078873 -0.477064 -0.714124 0.410896 -0.566738 -0.360739 0.783252 -0.506344 0.088925 0.946270 -0.310912 0.514971 0.856587 -0.032596 0.803710 0.537886 0.254419 0.877654 0.074887 0.473409 0.716394 -0.408672 0.565480 0.362666 -0.782863 0.505568 -0.088622 -0.946744 0.309552 -0.515946 -0.856090 0.030171 -0.804342 -0.535553 -0.257327 -0.876663 -0.071691 -0.475733 -0.717691 0.415882 -0.558535 -0.367205 0.790111 -0.490800 0.081310 0.952961 -0.291983 0.508093 0.861167 -0.015255 0.799238 0.539171 0.265543 0.876774 0.072719 0.475373 0.719506 -0.413578 0.557911 0.369117 -0.789262 0.490732 -0.080544 -0.953133 0.291634 -0.508570 -0.860906 0.014068 -0.799813 -0.537455 -0.267285 -0.876203 -0.069982 -0.476834 -0.719362 0.416965 -0.555571 -0.372621 0.793712 -0.480805 0.073596 0.957918 -0.277448 0.499990 0.866031 0.000008 0.792768 0.542709 0.277463 0.873678 0.074173 0.480817 0.720781 -0.414487 0.555585 0.374585 -0.792373 0.481489 -0.072349 -0.957813 0.278137 -0.500003 -0.866024 0.000017 -0.793324 -0.541565 -0.278108 -0.873519 -0.071793 -0.481467 -0.717894 0.416370 -0.557910 -0.375362 0.795697 -0.475362 0.067367 0.961749 -0.265518 0.491785 0.870583 0.015289 0.784650 0.546856 0.292016 0.867854 0.076995 0.490818 0.718986 -0.413647 0.558530 0.377456 -0.793838 0.476811 -0.065591 -0.961391 0.267255 -0.491328 -0.870861 -0.014092 -0.785194 -0.546270 -0.291648 -0.868081 -0.074910 -0.490738 -0.712107 0.416124 -0.565460 -0.373943 0.797542 -0.473385 0.064002 0.964983 -0.254385 0.484363 0.874258 0.032642 0.775033 0.550116 0.310959 0.858669 0.079178 0.506378 0.712877 -0.413039 0.566749 0.376204 -0.795082 0.475726 -0.061679 -0.964357 0.257316 -0.483469 -0.874841 -0.030171 -0.775631 -0.550076 -0.309538 -0.859328 -0.077303 -0.505548 -0.700623 0.418288 -0.578068 -0.366768 0.800713 -0.473645 0.064874 0.968086 -0.242076 0.478505 0.876408 0.054244 0.763900 0.550910 0.336088 0.845322 0.078635 0.528439 0.701089 -0.414696 0.580088 0.369264 -0.797550 0.477031 -0.061966 -0.967187 0.246394 -0.477213 -0.877344 -0.050359 -0.764637 -0.551420 -0.333566 -0.846474 -0.076881 -0.526851 -0.682108 0.424732 -0.595258 -0.352545 0.806539 -0.474560 0.070856 0.971478 -0.226295 0.474395 0.876437 0.082511 0.750678 0.547806 0.369312 0.826625 0.073501 0.557932 0.682125 -0.420417 0.598293 0.355214 -0.802496 0.479399 -0.067445 -0.970261 0.232473 -0.472885 -0.877772 -0.076789 -0.751816 -0.548877 -0.365386 -0.828515 -0.071748 -0.555352 -0.654384 0.437922 -0.616446 -0.329315 0.816579 -0.474079 0.083154 0.975397 -0.204173 0.472209 0.873243 0.120276 0.734547 0.538683 0.412627 0.801061 0.061182 0.595448 0.654218 -0.432624 0.620352 0.332521 -0.811563 0.480411 -0.078993 -0.974007 0.212299 -0.470444 -0.875195 -0.112764 -0.736151 -0.540377 -0.407523 -0.803641 -0.059250 -0.592157 -0.616077 0.458966 -0.640156 -0.296919 0.831459 -0.469591 0.100624 0.979825 -0.172676 0.469811 0.866208 0.170181 0.712964 0.522511 0.467616 0.766344 0.040504 0.641152 0.615915 -0.452328 0.645017 0.300917 -0.825333 0.477780 -0.095650 -0.978416 0.183173 -0.467978 -0.869015 -0.160651 -0.715298 -0.524867 -0.461371 -0.769697 -0.038132 -0.637270 -0.565682 0.488744 -0.664179 -0.255895 0.851415 -0.457833 0.120829 0.984326 -0.128459 0.463589 0.854398 0.234712 0.682179 0.498125 0.535260 0.719617 0.010365 0.694294 0.566014 -0.480325 0.670012 0.261157 -0.844106 0.468275 -0.114917 -0.983211 0.141738 -0.461899 -0.858424 -0.223063 -0.685478 -0.501188 -0.528139 -0.723625 -0.007174 -0.690156 -0.501741 0.527669 -0.685435 -0.208156 0.875995 -0.435091 0.139192 0.987896 -0.068460 0.447803 0.836662 0.315387 0.637012 0.464542 0.615155 0.657745 -0.029878 0.752648 0.504310 -0.516837 0.691774 0.216070 -0.867663 0.447745 -0.131614 -0.987723 0.084148 -0.445919 -0.842344 -0.302676 -0.640686 -0.468014 -0.608674 -0.661068 0.034771 -0.749520 -0.426411 0.573252 -0.699683 -0.160807 0.902958 -0.398506 0.145780 0.989284 0.008062 0.412400 0.813102 0.410842 0.569851 0.423160 0.704419 0.577417 -0.077927 0.812722 0.432567 -0.559275 0.707176 0.171997 -0.893759 0.414260 -0.136499 -0.990587 0.010229 -0.410340 -0.820621 -0.397745 -0.573301 -0.426389 -0.699656 -0.578645 0.085732 -0.811061 -0.344283 0.622256 -0.703041 -0.123919 0.929391 -0.347674 0.128060 0.986901 0.098121 0.345660 0.783882 0.515799 0.472685 0.375811 0.797079 0.476268 -0.130805 0.869517 0.354621 -0.604312 0.713478 0.138004 -0.919551 0.367942 -0.117614 -0.990057 -0.077165 -0.343424 -0.792896 -0.503365 -0.474817 -0.377306 -0.795103 -0.473829 0.143382 -0.868866 -0.263154 0.670605 -0.693570 -0.109663 0.951645 -0.286959 0.072681 0.978547 0.192777 0.236173 0.748706 0.619405 0.338625 0.324096 0.883343 0.353458 -0.185450 0.916883 0.275855 -0.648190 0.709756 0.124389 -0.941489 0.313250 -0.062310 -0.983555 -0.169517 -0.233435 -0.757938 -0.609129 -0.337983 -0.321184 -0.884652 -0.347120 0.204999 -0.915141 -0.191934 0.713747 -0.673592 -0.127977 0.965388 -0.227262 -0.029391 0.960748 0.275860 0.077601 0.705546 0.704402 0.165202 0.267813 0.949202 0.210715 -0.240188 0.947580 0.201664 -0.687686 0.697438 0.138951 -0.955547 0.260045 0.037773 -0.967225 -0.251097 -0.073754 -0.712837 -0.697440 -0.161566 -0.257679 -0.952627 -0.204002 0.267261 -0.941783 -0.135232 0.748903 -0.648735 -0.179504 0.966541 -0.183238 -0.175003 0.928594 0.327243 -0.124033 0.649622 0.750072 -0.040339 0.203333 0.978278 0.054589 -0.296563 0.953452 0.136254 -0.721685 0.678680 0.182607 -0.958117 0.220607 0.180112 -0.936081 -0.302179 0.129437 -0.653213 -0.746029 0.044569 -0.186072 -0.981525 -0.052990 0.328295 -0.943088 -0.092685 0.775675 -0.624290 -0.253435 0.952782 -0.167263 -0.345431 0.878339 0.330451 -0.346656 0.576540 0.739886 -0.257952 0.126571 0.957831 -0.101821 -0.357263 0.928437 0.082432 -0.750568 0.655631 0.246921 -0.947045 0.205270 0.346653 -0.886736 -0.305830 0.352270 -0.578158 -0.735961 0.259723 -0.107638 -0.959666 0.095486 0.388565 -0.916461 -0.061645 0.795283 -0.603096 -0.331985 0.925335 -0.183141 -0.512283 0.811222 0.281931 -0.558309 0.487227 0.671491 -0.459862 0.037931 0.887180 -0.241712 -0.422410 0.873582 0.041613 -0.774863 0.630758 0.316962 -0.923205 0.217317 0.509428 -0.820604 -0.259022 0.562772 -0.489116 -0.666373 0.459021 -0.021306 -0.888170 0.228595 0.449816 -0.863371 -0.039743 0.809625 -0.585600 -0.399843 0.888723 -0.224269 -0.651596 0.733427 0.193667 -0.732479 0.388167 0.559286 -0.623534 -0.057206 0.779700 -0.352105 -0.488977 0.798075 0.013836 -0.794791 0.606725 0.379576 -0.890267 0.251686 0.645607 -0.743487 -0.174410 0.735174 -0.390151 -0.554348 0.620462 0.071547 -0.780966 0.334721 0.511634 -0.791323 -0.025552 0.820062 -0.571704 -0.450535 0.847717 -0.279990 -0.753687 0.651874 0.083759 -0.858934 0.286916 0.424159 -0.740938 -0.152300 0.654076 -0.429318 -0.553058 0.714012 -0.002535 -0.810286 0.586030 0.428410 -0.852226 0.300294 0.746195 -0.662153 -0.068892 0.860101 -0.288625 -0.420621 0.736108 0.164810 -0.656492 0.409869 0.571289 -0.711081 -0.017693 0.827123 -0.561742 -0.484423 0.804985 -0.342540 -0.820451 0.570693 -0.034208 -0.940803 0.188159 0.281931 -0.815973 -0.243212 0.524438 -0.477298 -0.612191 0.630403 -0.010516 -0.821366 0.570305 0.462419 -0.811640 0.356944 0.812717 -0.580897 0.045281 0.941114 -0.189494 -0.279992 0.810076 0.254254 -0.528329 0.457151 0.626777 -0.631002 -0.014445 0.830929 -0.556190 -0.503880 0.761026 -0.408588 -0.857602 0.490722 -0.153985 -0.985771 0.092928 0.140074 -0.856582 -0.329026 0.397503 -0.502429 -0.665936 0.551448 -0.013291 -0.828290 0.560141 0.482625 -0.769360 0.418520 0.850224 -0.500790 0.162261 0.985785 -0.093764 -0.139417 0.850125 0.339152 -0.402820 0.482098 0.677803 -0.555126 -0.013759 0.831387 -0.555523 -0.510185 0.715067 -0.477902 -0.869384 0.410762 -0.274674 -1.000000 -0.000094 -0.000159 -0.869390 -0.410909 0.274436 -0.510178 -0.715121 0.477828 -0.013734 -0.831383 0.555531 0.489574 -0.725070 0.484346 0.862515 -0.420900 0.280911 1.000000 -0.000178 -0.000233 0.862523 0.420654 -0.281255 0.489559 0.725007 -0.484455 -0.013298 0.828292 -0.560139 -0.502400 0.665858 -0.551568 -0.856515 0.328850 -0.397794 -0.985703 -0.093130 -0.140418 -0.857565 -0.490858 0.153753 -0.503873 -0.761060 0.408534 -0.014437 -0.830926 0.556196 0.482134 -0.677908 0.554966 0.850202 -0.339461 0.402396 0.985894 0.093368 0.138907 0.850307 0.500543 -0.162585 0.482641 0.769309 -0.418595 -0.010526 0.821369 -0.570300 -0.477248 0.612112 -0.630519 -0.815841 0.243019 -0.524732 -0.940649 -0.188392 -0.282291 -0.820346 -0.570858 0.033953 -0.484393 -0.805032 0.342471 -0.017686 -0.827118 0.561750 0.457230 -0.626885 0.630838 0.810280 -0.254594 0.527853 0.941380 0.189046 0.279400 0.812899 0.580612 -0.045661 0.462458 0.811577 -0.357036 -0.002555 0.810279 -0.586038 -0.429233 0.552960 -0.714139 -0.740707 0.152085 -0.654388 -0.858655 -0.287170 -0.424553 -0.753492 -0.652063 -0.084053 -0.450472 -0.847780 0.279901 -0.025526 -0.820056 0.571713 0.410046 -0.571411 0.710881 0.736543 -0.165249 0.655894 0.860656 0.288023 0.419898 0.746566 0.661781 0.068450 0.428491 0.852144 -0.300408 0.013803 0.794744 -0.606788 -0.351894 0.488775 -0.798292 -0.623055 0.056870 -0.780108 -0.731945 -0.388515 -0.559744 -0.651245 -0.733660 -0.193969 -0.399733 -0.888784 0.224223 -0.039641 -0.809609 0.585629 0.335240 -0.511844 0.790968 0.621611 -0.072305 0.779982 0.736480 0.389178 0.553298 0.646327 0.742987 0.173872 0.379672 0.890188 -0.251822 0.041504 0.774730 -0.630929 -0.241378 0.422045 -0.873851 -0.459106 -0.038461 -0.887549 -0.557476 -0.487741 -0.671810 -0.511737 -0.811533 -0.282027 -0.331814 -0.925364 0.183306 -0.061458 -0.795159 0.603279 0.229634 -0.449970 0.863015 0.461441 0.020399 0.886937 0.565359 0.487965 0.665026 0.510573 0.820119 0.258303 0.316969 0.923139 -0.217589 0.082403 0.750416 -0.655809 -0.101367 0.356932 -0.928614 -0.257051 -0.127034 -0.958012 -0.345684 -0.576988 -0.739991 -0.344793 -0.878610 -0.330398 -0.253261 -0.952791 0.167474 -0.092541 -0.775534 0.624487 0.096733 -0.388690 0.916276 0.263049 0.106776 0.958856 0.355882 0.577125 0.735034 0.348180 0.886333 0.305260 0.247017 0.946956 -0.205562 0.136345 0.721536 -0.678819 0.055105 0.296314 -0.953500 -0.039438 -0.203644 -0.978250 -0.123092 -0.649910 -0.749977 -0.174386 -0.928764 -0.327089 -0.179321 -0.966540 0.183424 -0.135039 -0.748818 0.648873 -0.051604 -0.328484 0.943099 0.048156 0.185291 0.981503 0.133136 0.652478 0.746021 0.181638 0.935838 0.302019 0.182803 0.958030 -0.220820 0.201793 0.687288 -0.697792 0.211202 0.239661 -0.947606 0.165946 -0.268344 -0.948922 0.078281 -0.705955 -0.703917 -0.029067 -0.960921 -0.275292 -0.128017 -0.965255 0.227802 -0.191824 -0.713359 0.674034 -0.202687 -0.266858 0.942181 -0.158550 0.257894 0.953076 -0.070983 0.712988 0.697574 0.038835 0.967286 0.250699 0.139083 0.955377 -0.260598 0.276101 0.647542 -0.710252 0.353916 0.184648 -0.916869 0.339146 -0.324860 -0.882863 0.236480 -0.749251 -0.618627 0.072585 -0.978724 -0.191912 -0.110064 -0.951365 0.287735 -0.263338 -0.669893 0.694188 -0.346295 -0.204029 0.915670 -0.336046 0.322154 0.885037 -0.231714 0.758617 0.608941 -0.061584 0.983734 0.168745 0.124597 0.941180 -0.314096 0.355015 0.603767 -0.713744 0.476734 0.130157 -0.869358 0.473098 -0.376405 -0.796553 0.345839 -0.784280 -0.515074 0.127926 -0.986990 -0.097392 -0.124206 -0.929127 0.348275 -0.344278 -0.621705 0.703531 -0.473056 -0.142699 0.869399 -0.473417 0.377978 0.795618 -0.342219 0.793384 0.503417 -0.116957 0.990171 0.076700 0.138385 0.919272 -0.368495 0.432983 0.558587 -0.707465 0.577753 0.077131 -0.812559 0.569987 -0.423872 -0.703880 0.412229 -0.813560 -0.410106 0.145317 -0.989358 -0.007325 -0.161359 -0.902594 0.399107 -0.426684 -0.572511 0.700123 -0.578347 -0.084798 0.811372 -0.572560 0.427263 0.699730 -0.409583 0.821173 0.397388 -0.135925 0.990659 -0.010909 0.172456 0.893376 -0.414896 0.504682 0.516136 -0.692026 0.657952 0.029087 -0.752498 0.636958 -0.465237 -0.614686 0.447435 -0.837095 -0.314761 0.138570 -0.987942 0.069066 -0.208828 -0.875605 0.435554 -0.502172 -0.526902 0.685710 -0.661047 -0.033811 0.749583 -0.640272 0.468883 0.608441 -0.445357 0.842844 0.302110 -0.131077 0.987733 -0.084872 0.216538 0.867239 -0.448339 0.566287 0.480168 -0.669894 0.719853 -0.010546 -0.694046 0.682336 -0.498271 -0.534923 0.463646 -0.854463 -0.234363 0.120825 -0.984288 0.128760 -0.255854 -0.851289 0.458090 -0.565487 -0.488581 0.664465 -0.723271 0.007338 0.690525 -0.685075 0.501353 0.528505 -0.461542 0.858561 0.223277 -0.114612 0.983255 -0.141683 0.261441 0.844033 -0.468249 0.616216 0.451735 -0.645146 0.766430 -0.041150 -0.641008 0.712787 -0.523056 -0.467277 0.469380 -0.866523 -0.169766 0.100036 -0.979819 0.173054 -0.297493 -0.831106 0.469852 -0.616446 -0.458334 0.640254 -0.769745 0.038876 0.637166 -0.715049 0.525496 0.461040 -0.467548 0.869341 0.160143 -0.095165 0.978363 -0.183711 0.301354 0.824948 -0.478171 0.654467 0.432122 -0.620438 0.801111 -0.061733 -0.595323 0.734358 -0.539151 -0.412351 0.471801 -0.873508 -0.119947 0.082624 -0.975381 0.204461 -0.329813 -0.816271 0.474262 -0.654695 -0.437392 0.616492 -0.803679 0.059857 0.592044 -0.735936 0.540880 0.407243 -0.470069 0.875448 0.112362 -0.078569 0.973951 -0.212711 0.332899 0.811236 -0.480702 0.682152 0.420531 -0.598183 0.826700 -0.073379 -0.557837 0.750796 -0.547697 -0.369235 0.474542 -0.876362 -0.082456 0.071021 -0.971457 0.226334 -0.352373 -0.806583 0.474613 -0.681953 -0.424829 0.595366 -0.828403 0.071636 0.555533 -0.751765 0.548799 0.365609 -0.472886 0.877753 0.077002 -0.067469 0.970301 -0.232300 0.355201 0.802582 -0.479264 0.701099 0.414653 -0.580106 0.845321 -0.078678 -0.528434 0.763886 -0.550943 -0.336066 0.478475 -0.876426 -0.054219 0.064829 -0.968085 0.242091 -0.366816 -0.800692 0.473644 -0.700656 -0.418249 0.578056 -0.846479 0.076928 0.526835 -0.764616 0.551460 0.333547 -0.477178 0.877364 0.050333 -0.061933 0.967180 -0.246428 0.369287 0.797519 -0.477065 0.712878 0.413057 -0.566735 0.858681 -0.079156 -0.506360 0.775056 -0.550095 -0.310940 0.484390 -0.874244 -0.032627 0.064028 -0.964979 0.254394 -0.373920 -0.797548 0.473394 -0.712085 -0.416136 0.565478 -0.859309 0.077290 0.505582 -0.775619 0.550067 0.309583 -0.483467 0.874841 0.030212 -0.061684 0.964364 -0.257288 0.376199 0.795095 -0.475709 0.719014 0.413576 -0.558545 0.867855 -0.077069 -0.490804 0.784621 -0.546915 -0.291983 0.491727 -0.870616 -0.015254 0.067292 -0.961748 0.265541 -0.375434 -0.795660 0.475368 -0.717940 -0.416305 0.557900 -0.868087 0.074984 0.490715 -0.785164 0.546333 0.291612 -0.491274 0.870892 0.014044 -0.065533 0.961380 -0.267309 0.377504 0.793789 -0.476853 0.720784 0.414511 -0.555564 0.873691 -0.074147 -0.480797 0.792791 -0.542687 -0.277441 0.500017 -0.866015 0.000013 0.073623 -0.957910 0.277465 -0.372597 -0.793715 0.480820 -0.719341 -0.416974 0.555591 -0.873502 0.071783 0.481498 -0.793314 0.541560 0.278147 -0.499998 0.866026 0.000024 -0.072350 0.957823 -0.278103 0.374582 0.792390 -0.481463 0.719548 0.413478 -0.557930 0.876768 -0.072829 -0.475367 0.799188 -0.539261 -0.265512 0.508010 -0.861215 0.015298 0.081214 -0.952958 0.292020 -0.367296 -0.790063 0.490810 -0.717758 -0.415803 0.558508 -0.876228 0.070072 0.476776 -0.799787 0.537531 0.267209 -0.508500 0.860946 -0.014143 -0.080455 0.953122 -0.291696 0.369195 0.789199 -0.490775 0.716374 0.408728 -0.565464 0.877658 -0.074828 -0.473410 0.803743 -0.537834 -0.254424 0.515027 -0.856554 0.032595 0.088990 -0.946262 0.310917 -0.360683 -0.783270 0.506356 -0.714087 -0.410933 0.566757 -0.876649 0.071647 0.475766 -0.804348 0.535518 0.257379 -0.515970 0.856077 -0.030104 -0.088656 0.946761 -0.309489 0.362632 0.782906 -0.505526 0.712487 0.397815 -0.578019 0.876840 -0.082513 -0.473649 0.806055 -0.540053 -0.242111 0.519904 -0.852503 0.054202 0.095340 -0.937002 0.336062 -0.354387 -0.771460 0.528450 -0.709555 -0.399944 0.580152 -0.875278 0.078832 0.477153 -0.806657 0.537135 0.246559 -0.521300 0.851897 -0.050178 -0.095370 0.937948 -0.333405 0.356521 0.771646 -0.526740 0.709012 0.378042 -0.595304 0.874740 -0.098289 -0.474519 0.805742 -0.547370 -0.226199 0.521567 -0.849200 0.082621 0.098786 -0.924007 0.369394 -0.349923 -0.752497 0.557945 -0.705341 -0.380312 0.598211 -0.872662 0.093865 0.479219 -0.806489 0.543736 0.232221 -0.523550 0.848502 -0.077064 -0.099185 0.925464 -0.365621 0.352353 0.753172 -0.555499 0.706504 0.347713 -0.616399 0.871860 -0.123148 -0.474020 0.803128 -0.559757 -0.204103 0.520107 -0.845579 0.120355 0.099193 -0.905447 0.412705 -0.347585 -0.724260 0.595510 -0.701792 -0.350165 0.620381 -0.869086 0.117901 0.480405 -0.803977 0.555483 0.212272 -0.522652 0.845053 -0.112786 -0.099821 0.907724 -0.407520 0.350590 0.725584 -0.592128 0.705572 0.303952 -0.640142 0.868528 -0.158698 -0.469547 0.798195 -0.577138 -0.172614 0.515174 -0.840007 0.170248 0.095935 -0.878680 0.467672 -0.348175 -0.683858 0.641180 -0.699740 -0.307140 0.645003 -0.865233 0.152160 0.477722 -0.799478 0.572114 0.183085 -0.518528 0.839816 -0.160742 -0.096801 0.881875 -0.461438 0.351918 0.685570 -0.637297 0.706126 0.245442 -0.664188 0.865286 -0.204166 -0.457816 0.792005 -0.596853 -0.128432 0.508086 -0.828702 0.234738 0.090244 -0.839842 0.535277 -0.350883 -0.628359 0.694295 -0.699017 -0.249975 0.669990 -0.861613 0.195928 0.468226 -0.794022 0.591151 0.141664 -0.512441 0.829221 -0.223152 -0.091261 0.844190 -0.528219 0.355640 0.630191 -0.690203 0.707808 0.170877 -0.685426 0.862743 -0.257567 -0.435125 0.786031 -0.614379 -0.068508 0.500784 -0.806084 0.315347 0.083926 -0.783936 0.615143 -0.354627 -0.554721 0.752678 -0.699654 -0.178384 0.691855 -0.859402 0.246650 0.447875 -0.789596 0.607807 0.084316 -0.506608 0.807369 -0.302494 -0.085087 0.788962 -0.608523 0.360545 0.555290 -0.749440 0.709666 0.082515 -0.699690 0.862362 -0.312324 -0.398479 0.783801 -0.620960 0.008099 0.497896 -0.763731 0.410872 0.081465 -0.705085 0.704428 -0.356267 -0.461073 0.812703 -0.700685 -0.094947 0.707125 -0.860050 0.297949 0.414174 -0.789629 0.613501 0.010109 -0.505480 0.765622 -0.397886 -0.082564 0.709570 -0.699781 0.363610 0.458102 -0.811129</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="1440" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="4719">0 0 0 0 0.083333 0 0 0.166667 0 0 0.250000 0 0 0.333333 0 0 0.416667 0 0 0.500000 0 0 0.583333 0 0 0.666667 0 0 0.750000 0 0 0.833333 0 0 0.916667 0 0 1.000000 0 0.008333 0 0 0.008333 0.083333 0 0.008333 0.166667 0 0.008333 0.250000 0 0.008333 0.333333 0 0.008333 0.416667 0 0.008333 0.500000 0 0.008333 0.583333 0 0.008333 0.666667 0 0.008333 0.750000 0 0.008333 0.833333 0 0.008333 0.916667 0 0.008333 1.000000 0 0.016667 0 0 0.016667 0.083333 0 0.016667 0.166667 0 0.016667 0.250000 0 0.016667 0.333333 0 0.016667 0.416667 0 0.016667 0.500000 0 0.016667 0.583333 0 0.016667 0.666667 0 0.016667 0.750000 0 0.016667 0.833333 0 0.016667 0.916667 0 0.016667 1.000000 0 0.025000 0 0 0.025000 0.083333 0 0.025000 0.166667 0 0.025000 0.250000 0 0.025000 0.333333 0 0.025000 0.416667 0 0.025000 0.500000 0 0.025000 0.583333 0 0.025000 0.666667 0 0.025000 0.750000 0 0.025000 0.833333 0 0.025000 0.916667 0 0.025000 1.000000 0 0.033333 0 0 0.033333 0.083333 0 0.033333 0.166667 0 0.033333 0.250000 0 0.033333 0.333333 0 0.033333 0.416667 0 0.033333 0.500000 0 0.033333 0.583333 0 0.033333 0.666667 0 0.033333 0.750000 0 0.033333 0.833333 0 0.033333 0.916667 0 0.033333 1.000000 0 0.041667 0 0 0.041667 0.083333 0 0.041667 0.166667 0 0.041667 0.250000 0 0.041667 0.333333 0 0.041667 0.416667 0 0.041667 0.500000 0 0.041667 0.583333 0 0.041667 0.666667 0 0.041667 0.750000 0 0.041667 0.833333 0 0.041667 0.916667 0 0.041667 1.000000 0 0.050000 0 0 0.050000 0.083333 0 0.050000 0.166667 0 0.050000 0.250000 0 0.050000 0.333333 0 0.050000 0.416667 0 0.050000 0.500000 0 0.050000 0.583333 0 0.050000 0.666667 0 0.050000 0.750000 0 0.050000 0.833333 0 0.050000 0.916667 0 0.050000 1.000000 0 0.058333 0 0 0.058333 0.083333 0 0.058333 0.166667 0 0.058333 0.250000 0 0.058333 0.333333 0 0.058333 0.416667 0 0.058333 0.500000 0 0.058333 0.583333 0 0.058333 0.666667 0 0.058333 0.750000 0 0.058333 0.833333 0 0.058333 0.916667 0 0.058333 1.000000 0 0.066667 0 0 0.066667 0.083333 0 0.066667 0.166667 0 0.066667 0.250000 0 0.066667 0.333333 0 0.066667 0.416667 0 0.066667 0.500000 0 0.066667 0.583333 0 0.066667 0.666667 0 0.066667 0.750000 0 0.066667 0.833333 0 0.066667 0.916667 0 0.066667 1.000000 0 0.075000 0 0 0.075000 0.083333 0 0.075000 0.166667 0 0.075000 0.250000 0 0.075000 0.333333 0 0.075000 0.416667 0 0.075000 0.500000 0 0.075000 0.583333 0 0.075000 0.666667 0 0.075000 0.750000 0 0.075000 0.833333 0 0.075000 0.916667 0 0.075000 1.000000 0 0.083333 0 0 0.083333 0.083333 0 0.083333 0.166667 0 0.083333 0.250000 0 0.083333 0.333333 0 0.083333 0.416667 0 0.083333 0.500000 0 0.083333 0.583333 0 0.083333 0.666667 0 0.083333 0.750000 0 0.083333 0.833333 0 0.083333 0.916667 0 0.083333 1.000000 0 0.091667 0 0 0.091667 0.083333 0 0.091667 0.166667 0 0.091667 0.250000 0 0.091667 0.333333 0 0.091667 0.416667 0 0.091667 0.500000 0 0.091667 0.583333 0 0.091667 0.666667 0 0.091667 0.750000 0 0.091667 0.833333 0 0.091667 0.916667 0 0.091667 1.000000 0 0.100000 0 0 0.100000 0.083333 0 0.100000 0.166667 0 0.100000 0.250000 0 0.100000 0.333333 0 0.100000 0.416667 0 0.100000 0.500000 0 0.100000 0.583333 0 0.100000 0.666667 0 0.100000 0.750000 0 0.100000 0.833333 0 0.100000 0.916667 0 0.100000 1.000000 0 0.108333 0 0 0.108333 0.083333 0 0.108333 0.166667 0 0.108333 0.250000 0 0.108333 0.333333 0 0.108333 0.416667 0 0.108333 0.500000 0 0.108333 0.583333 0 0.108333 0.666667 0 0.108333 0.750000 0 0.108333 0.833333 0 0.108333 0.916667 0 0.108333 1.000000 0 0.116667 0 0 0.116667 0.083333 0 0.116667 0.166667 0 0.116667 0.250000 0 0.116667 0.333333 0 0.116667 0.416667 0 0.116667 0.500000 0 0.116667 0.583333 0 0.116667 0.666667 0 0.116667 0.750000 0 0.116667 0.833333 0 0.116667 0.916667 0 0.116667 1.000000 0 0.125000 0 0 0.125000 0.083333 0 0.125000 0.166667 0 0.125000 0.250000 0 0.125000 0.333333 0 0.125000 0.416667 0 0.125000 0.500000 0 0.125000 0.583333 0 0.125000 0.666667 0 0.125000 0.750000 0 0.125000 0.833333 0 0.125000 0.916667 0 0.125000 1.000000 0 0.133333 0 0 0.133333 0.083333 0 0.133333 0.166667 0 0.133333 0.250000 0 0.133333 0.333333 0 0.133333 0.416667 0 0.133333 0.500000 0 0.133333 0.583333 0 0.133333 0.666667 0 0.133333 0.750000 0 0.133333 0.833333 0 0.133333 0.916667 0 0.133333 1.000000 0 0.141667 0 0 0.141667 0.083333 0 0.141667 0.166667 0 0.141667 0.250000 0 0.141667 0.333333 0 0.141667 0.416667 0 0.141667 0.500000 0 0.141667 0.583333 0 0.141667 0.666667 0 0.141667 0.750000 0 0.141667 0.833333 0 0.141667 0.916667 0 0.141667 1.000000 0 0.150000 0 0 0.150000 0.083333 0 0.150000 0.166667 0 0.150000 0.250000 0 0.150000 0.333333 0 0.150000 0.416667 0 0.150000 0.500000 0 0.150000 0.583333 0 0.150000 0.666667 0 0.150000 0.750000 0 0.150000 0.833333 0 0.150000 0.916667 0 0.150000 1.000000 0 0.158333 0 0 0.158333 0.083333 0 0.158333 0.166667 0 0.158333 0.250000 0 0.158333 0.333333 0 0.158333 0.416667 0 0.158333 0.500000 0 0.158333 0.583333 0 0.158333 0.666667 0 0.158333 0.750000 0 0.158333 0.833333 0 0.158333 0.916667 0 0.158333 1.000000 0 0.166667 0 0 0.166667 0.083333 0 0.166667 0.166667 0 0.166667 0.250000 0 0.166667 0.333333 0 0.166667 0.416667 0 0.166667 0.500000 0 0.166667 0.583333 0 0.166667 0.666667 0 0.166667 0.750000 0 0.166667 0.833333 0 0.166667 0.916667 0 0.166667 1.000000 0 0.175000 0 0 0.175000 0.083333 0 0.175000 0.166667 0 0.175000 0.250000 0 0.175000 0.333333 0 0.175000 0.416667 0 0.175000 0.500000 0 0.175000 0.583333 0 0.175000 0.666667 0 0.175000 0.750000 0 0.175000 0.833333 0 0.175000 0.916667 0 0.175000 1.000000 0 0.183333 0 0 0.183333 0.083333 0 0.183333 0.166667 0 0.183333 0.250000 0 0.183333 0.333333 0 0.183333 0.416667 0 0.183333 0.500000 0 0.183333 0.583333 0 0.183333 0.666667 0 0.183333 0.750000 0 0.183333 0.833333 0 0.183333 0.916667 0 0.183333 1.000000 0 0.191667 0 0 0.191667 0.083333 0 0.191667 0.166667 0 0.191667 0.250000 0 0.191667 0.333333 0 0.191667 0.416667 0 0.191667 0.500000 0 0.191667 0.583333 0 0.191667 0.666667 0 0.191667 0.750000 0 0.191667 0.833333 0 0.191667 0.916667 0 0.191667 1.000000 0 0.200000 0 0 0.200000 0.083333 0 0.200000 0.166667 0 0.200000 0.250000 0 0.200000 0.333333 0 0.200000 0.416667 0 0.200000 0.500000 0 0.200000 0.583333 0 0.200000 0.666667 0 0.200000 0.750000 0 0.200000 0.833333 0 0.200000 0.916667 0 0.200000 1.000000 0 0.208333 0 0 0.208333 0.083333 0 0.208333 0.166667 0 0.208333 0.250000 0 0.208333 0.333333 0 0.208333 0.416667 0 0.208333 0.500000 0 0.208333 0.583333 0 0.208333 0.666667 0 0.208333 0.750000 0 0.208333 0.833333 0 0.208333 0.916667 0 0.208333 1.000000 0 0.216667 0 0 0.216667 0.083333 0 0.216667 0.166667 0 0.216667 0.250000 0 0.216667 0.333333 0 0.216667 0.416667 0 0.216667 0.500000 0 0.216667 0.583333 0 0.216667 0.666667 0 0.216667 0.750000 0 0.216667 0.833333 0 0.216667 0.916667 0 0.216667 1.000000 0 0.225000 0 0 0.225000 0.083333 0 0.225000 0.166667 0 0.225000 0.250000 0 0.225000 0.333333 0 0.225000 0.416667 0 0.225000 0.500000 0 0.225000 0.583333 0 0.225000 0.666667 0 0.225000 0.750000 0 0.225000 0.833333 0 0.225000 0.916667 0 0.225000 1.000000 0 0.233333 0 0 0.233333 0.083333 0 0.233333 0.166667 0 0.233333 0.250000 0 0.233333 0.333333 0 0.233333 0.416667 0 0.233333 0.500000 0 0.233333 0.583333 0 0.233333 0.666667 0 0.233333 0.750000 0 0.233333 0.833333 0 0.233333 0.916667 0 0.233333 1.000000 0 0.241667 0 0 0.241667 0.083333 0 0.241667 0.166667 0 0.241667 0.250000 0 0.241667 0.333333 0 0.241667 0.416667 0 0.241667 0.500000 0 0.241667 0.583333 0 0.241667 0.666667 0 0.241667 0.750000 0 0.241667 0.833333 0 0.241667 0.916667 0 0.241667 1.000000 0 0.250000 0 0 0.250000 0.083333 0 0.250000 0.166667 0 0.250000 0.250000 0 0.250000 0.333333 0 0.250000 0.416667 0 0.250000 0.500000 0 0.250000 0.583333 0 0.250000 0.666667 0 0.250000 0.750000 0 0.250000 0.833333 0 0.250000 0.916667 0 0.250000 1.000000 0 0.258333 0 0 0.258333 0.083333 0 0.258333 0.166667 0 0.258333 0.250000 0 0.258333 0.333333 0 0.258333 0.416667 0 0.258333 0.500000 0 0.258333 0.583333 0 0.258333 0.666667 0 0.258333 0.750000 0 0.258333 0.833333 0 0.258333 0.916667 0 0.258333 1.000000 0 0.266667 0 0 0.266667 0.083333 0 0.266667 0.166667 0 0.266667 0.250000 0 0.266667 0.333333 0 0.266667 0.416667 0 0.266667 0.500000 0 0.266667 0.583333 0 0.266667 0.666667 0 0.266667 0.750000 0 0.266667 0.833333 0 0.266667 0.916667 0 0.266667 1.000000 0 0.275000 0 0 0.275000 0.083333 0 0.275000 0.166667 0 0.275000 0.250000 0 0.275000 0.333333 0 0.275000 0.416667 0 0.275000 0.500000 0 0.275000 0.583333 0 0.275000 0.666667 0 0.275000 0.750000 0 0.275000 0.833333 0 0.275000 0.916667 0 0.275000 1.000000 0 0.283333 0 0 0.283333 0.083333 0 0.283333 0.166667 0 0.283333 0.250000 0 0.283333 0.333333 0 0.283333 0.416667 0 0.283333 0.500000 0 0.283333 0.583333 0 0.283333 0.666667 0 0.283333 0.750000 0 0.283333 0.833333 0 0.283333 0.916667 0 0.283333 1.000000 0 0.291667 0 0 0.291667 0.083333 0 0.291667 0.166667 0 0.291667 0.250000 0 0.291667 0.333333 0 0.291667 0.416667 0 0.291667 0.500000 0 0.291667 0.583333 0 0.291667 0.666667 0 0.291667 0.750000 0 0.291667 0.833333 0 0.291667 0.916667 0 0.291667 1.000000 0 0.300000 0 0 0.300000 0.083333 0 0.300000 0.166667 0 0.300000 0.250000 0 0.300000 0.333333 0 0.300000 0.416667 0 0.300000 0.500000 0 0.300000 0.583333 0 0.300000 0.666667 0 0.300000 0.750000 0 0.300000 0.833333 0 0.300000 0.916667 0 0.300000 1.000000 0 0.308333 0 0 0.308333 0.083333 0 0.308333 0.166667 0 0.308333 0.250000 0 0.308333 0.333333 0 0.308333 0.416667 0 0.308333 0.500000 0 0.308333 0.583333 0 0.308333 0.666667 0 0.308333 0.750000 0 0.308333 0.833333 0 0.308333 0.916667 0 0.308333 1.000000 0 0.316666 0 0 0.316666 0.083333 0 0.316666 0.166667 0 0.316666 0.250000 0 0.316666 0.333333 0 0.316666 0.416667 0 0.316666 0.500000 0 0.316666 0.583333 0 0.316666 0.666667 0 0.316666 0.750000 0 0.316666 0.833333 0 0.316666 0.916667 0 0.316666 1.000000 0 0.325000 0 0 0.325000 0.083333 0 0.325000 0.166667 0 0.325000 0.250000 0 0.325000 0.333333 0 0.325000 0.416667 0 0.325000 0.500000 0 0.325000 0.583333 0 0.325000 0.666667 0 0.325000 0.750000 0 0.325000 0.833333 0 0.325000 0.916667 0 0.325000 1.000000 0 0.333333 0 0 0.333333 0.083333 0 0.333333 0.166667 0 0.333333 0.250000 0 0.333333 0.333333 0 0.333333 0.416667 0 0.333333 0.500000 0 0.333333 0.583333 0 0.333333 0.666667 0 0.333333 0.750000 0 0.333333 0.833333 0 0.333333 0.916667 0 0.333333 1.000000 0 0.341666 0 0 0.341666 0.083333 0 0.341666 0.166667 0 0.341666 0.250000 0 0.341666 0.333333 0 0.341666 0.416667 0 0.341666 0.500000 0 0.341666 0.583333 0 0.341666 0.666667 0 0.341666 0.750000 0 0.341666 0.833333 0 0.341666 0.916667 0 0.341666 1.000000 0 0.350000 0 0 0.350000 0.083333 0 0.350000 0.166667 0 0.350000 0.250000 0 0.350000 0.333333 0 0.350000 0.416667 0 0.350000 0.500000 0 0.350000 0.583333 0 0.350000 0.666667 0 0.350000 0.750000 0 0.350000 0.833333 0 0.350000 0.916667 0 0.350000 1.000000 0 0.358333 0 0 0.358333 0.083333 0 0.358333 0.166667 0 0.358333 0.250000 0 0.358333 0.333333 0 0.358333 0.416667 0 0.358333 0.500000 0 0.358333 0.583333 0 0.358333 0.666667 0 0.358333 0.750000 0 0.358333 0.833333 0 0.358333 0.916667 0 0.358333 1.000000 0 0.366666 0 0 0.366666 0.083333 0 0.366666 0.166667 0 0.366666 0.250000 0 0.366666 0.333333 0 0.366666 0.416667 0 0.366666 0.500000 0 0.366666 0.583333 0 0.366666 0.666667 0 0.366666 0.750000 0 0.366666 0.833333 0 0.366666 0.916667 0 0.366666 1.000000 0 0.375000 0 0 0.375000 0.083333 0 0.375000 0.166667 0 0.375000 0.250000 0 0.375000 0.333333 0 0.375000 0.416667 0 0.375000 0.500000 0 0.375000 0.583333 0 0.375000 0.666667 0 0.375000 0.750000 0 0.375000 0.833333 0 0.375000 0.916667 0 0.375000 1.000000 0 0.383333 0 0 0.383333 0.083333 0 0.383333 0.166667 0 0.383333 0.250000 0 0.383333 0.333333 0 0.383333 0.416667 0 0.383333 0.500000 0 0.383333 0.583333 0 0.383333 0.666667 0 0.383333 0.750000 0 0.383333 0.833333 0 0.383333 0.916667 0 0.383333 1.000000 0 0.391666 0 0 0.391666 0.083333 0 0.391666 0.166667 0 0.391666 0.250000 0 0.391666 0.333333 0 0.391666 0.416667 0 0.391666 0.500000 0 0.391666 0.583333 0 0.391666 0.666667 0 0.391666 0.750000 0 0.391666 0.833333 0 0.391666 0.916667 0 0.391666 1.000000 0 0.400000 0 0 0.400000 0.083333 0 0.400000 0.166667 0 0.400000 0.250000 0 0.400000 0.333333 0 0.400000 0.416667 0 0.400000 0.500000 0 0.400000 0.583333 0 0.400000 0.666667 0 0.400000 0.750000 0 0.400000 0.833333 0 0.400000 0.916667 0 0.400000 1.000000 0 0.408333 0 0 0.408333 0.083333 0 0.408333 0.166667 0 0.408333 0.250000 0 0.408333 0.333333 0 0.408333 0.416667 0 0.408333 0.500000 0 0.408333 0.583333 0 0.408333 0.666667 0 0.408333 0.750000 0 0.408333 0.833333 0 0.408333 0.916667 0 0.408333 1.000000 0 0.416666 0 0 0.416666 0.083333 0 0.416666 0.166667 0 0.416666 0.250000 0 0.416666 0.333333 0 0.416666 0.416667 0 0.416666 0.500000 0 0.416666 0.583333 0 0.416666 0.666667 0 0.416666 0.750000 0 0.416666 0.833333 0 0.416666 0.916667 0 0.416666 1.000000 0 0.425000 0 0 0.425000 0.083333 0 0.425000 0.166667 0 0.425000 0.250000 0 0.425000 0.333333 0 0.425000 0.416667 0 0.425000 0.500000 0 0.425000 0.583333 0 0.425000 0.666667 0 0.425000 0.750000 0 0.425000 0.833333 0 0.425000 0.916667 0 0.425000 1.000000 0 0.433333 0 0 0.433333 0.083333 0 0.433333 0.166667 0 0.433333 0.250000 0 0.433333 0.333333 0 0.433333 0.416667 0 0.433333 0.500000 0 0.433333 0.583333 0 0.433333 0.666667 0 0.433333 0.750000 0 0.433333 0.833333 0 0.433333 0.916667 0 0.433333 1.000000 0 0.441666 0 0 0.441666 0.083333 0 0.441666 0.166667 0 0.441666 0.250000 0 0.441666 0.333333 0 0.441666 0.416667 0 0.441666 0.500000 0 0.441666 0.583333 0 0.441666 0.666667 0 0.441666 0.750000 0 0.441666 0.833333 0 0.441666 0.916667 0 0.441666 1.000000 0 0.450000 0 0 0.450000 0.083333 0 0.450000 0.166667 0 0.450000 0.250000 0 0.450000 0.333333 0 0.450000 0.416667 0 0.450000 0.500000 0 0.450000 0.583333 0 0.450000 0.666667 0 0.450000 0.750000 0 0.450000 0.833333 0 0.450000 0.916667 0 0.450000 1.000000 0 0.458333 0 0 0.458333 0.083333 0 0.458333 0.166667 0 0.458333 0.250000 0 0.458333 0.333333 0 0.458333 0.416667 0 0.458333 0.500000 0 0.458333 0.583333 0 0.458333 0.666667 0 0.458333 0.750000 0 0.458333 0.833333 0 0.458333 0.916667 0 0.458333 1.000000 0 0.466666 0 0 0.466666 0.083333 0 0.466666 0.166667 0 0.466666 0.250000 0 0.466666 0.333333 0 0.466666 0.416667 0 0.466666 0.500000 0 0.466666 0.583333 0 0.466666 0.666667 0 0.466666 0.750000 0 0.466666 0.833333 0 0.466666 0.916667 0 0.466666 1.000000 0 0.475000 0 0 0.475000 0.083333 0 0.475000 0.166667 0 0.475000 0.250000 0 0.475000 0.333333 0 0.475000 0.416667 0 0.475000 0.500000 0 0.475000 0.583333 0 0.475000 0.666667 0 0.475000 0.750000 0 0.475000 0.833333 0 0.475000 0.916667 0 0.475000 1.000000 0 0.483333 0 0 0.483333 0.083333 0 0.483333 0.166667 0 0.483333 0.250000 0 0.483333 0.333333 0 0.483333 0.416667 0 0.483333 0.500000 0 0.483333 0.583333 0 0.483333 0.666667 0 0.483333 0.750000 0 0.483333 0.833333 0 0.483333 0.916667 0 0.483333 1.000000 0 0.491666 0 0 0.491666 0.083333 0 0.491666 0.166667 0 0.491666 0.250000 0 0.491666 0.333333 0 0.491666 0.416667 0 0.491666 0.500000 0 0.491666 0.583333 0 0.491666 0.666667 0 0.491666 0.750000 0 0.491666 0.833333 0 0.491666 0.916667 0 0.491666 1.000000 0 0.500000 0 0 0.500000 0.083333 0 0.500000 0.166667 0 0.500000 0.250000 0 0.500000 0.333333 0 0.500000 0.416667 0 0.500000 0.500000 0 0.500000 0.583333 0 0.500000 0.666667 0 0.500000 0.750000 0 0.500000 0.833333 0 0.500000 0.916667 0 0.500000 1.000000 0 0.508333 0 0 0.508333 0.083333 0 0.508333 0.166667 0 0.508333 0.250000 0 0.508333 0.333333 0 0.508333 0.416667 0 0.508333 0.500000 0 0.508333 0.583333 0 0.508333 0.666667 0 0.508333 0.750000 0 0.508333 0.833333 0 0.508333 0.916667 0 0.508333 1.000000 0 0.516666 0 0 0.516666 0.083333 0 0.516666 0.166667 0 0.516666 0.250000 0 0.516666 0.333333 0 0.516666 0.416667 0 0.516666 0.500000 0 0.516666 0.583333 0 0.516666 0.666667 0 0.516666 0.750000 0 0.516666 0.833333 0 0.516666 0.916667 0 0.516666 1.000000 0 0.525000 0 0 0.525000 0.083333 0 0.525000 0.166667 0 0.525000 0.250000 0 0.525000 0.333333 0 0.525000 0.416667 0 0.525000 0.500000 0 0.525000 0.583333 0 0.525000 0.666667 0 0.525000 0.750000 0 0.525000 0.833333 0 0.525000 0.916667 0 0.525000 1.000000 0 0.533333 0 0 0.533333 0.083333 0 0.533333 0.166667 0 0.533333 0.250000 0 0.533333 0.333333 0 0.533333 0.416667 0 0.533333 0.500000 0 0.533333 0.583333 0 0.533333 0.666667 0 0.533333 0.750000 0 0.533333 0.833333 0 0.533333 0.916667 0 0.533333 1.000000 0 0.541666 0 0 0.541666 0.083333 0 0.541666 0.166667 0 0.541666 0.250000 0 0.541666 0.333333 0 0.541666 0.416667 0 0.541666 0.500000 0 0.541666 0.583333 0 0.541666 0.666667 0 0.541666 0.750000 0 0.541666 0.833333 0 0.541666 0.916667 0 0.541666 1.000000 0 0.550000 0 0 0.550000 0.083333 0 0.550000 0.166667 0 0.550000 0.250000 0 0.550000 0.333333 0 0.550000 0.416667 0 0.550000 0.500000 0 0.550000 0.583333 0 0.550000 0.666667 0 0.550000 0.750000 0 0.550000 0.833333 0 0.550000 0.916667 0 0.550000 1.000000 0 0.558333 0 0 0.558333 0.083333 0 0.558333 0.166667 0 0.558333 0.250000 0 0.558333 0.333333 0 0.558333 0.416667 0 0.558333 0.500000 0 0.558333 0.583333 0 0.558333 0.666667 0 0.558333 0.750000 0 0.558333 0.833333 0 0.558333 0.916667 0 0.558333 1.000000 0 0.566666 0 0 0.566666 0.083333 0 0.566666 0.166667 0 0.566666 0.250000 0 0.566666 0.333333 0 0.566666 0.416667 0 0.566666 0.500000 0 0.566666 0.583333 0 0.566666 0.666667 0 0.566666 0.750000 0 0.566666 0.833333 0 0.566666 0.916667 0 0.566666 1.000000 0 0.575000 0 0 0.575000 0.083333 0 0.575000 0.166667 0 0.575000 0.250000 0 0.575000 0.333333 0 0.575000 0.416667 0 0.575000 0.500000 0 0.575000 0.583333 0 0.575000 0.666667 0 0.575000 0.750000 0 0.575000 0.833333 0 0.575000 0.916667 0 0.575000 1.000000 0 0.583333 0 0 0.583333 0.083333 0 0.583333 0.166667 0 0.583333 0.250000 0 0.583333 0.333333 0 0.583333 0.416667 0 0.583333 0.500000 0 0.583333 0.583333 0 0.583333 0.666667 0 0.583333 0.750000 0 0.583333 0.833333 0 0.583333 0.916667 0 0.583333 1.000000 0 0.591666 0 0 0.591666 0.083333 0 0.591666 0.166667 0 0.591666 0.250000 0 0.591666 0.333333 0 0.591666 0.416667 0 0.591666 0.500000 0 0.591666 0.583333 0 0.591666 0.666667 0 0.591666 0.750000 0 0.591666 0.833333 0 0.591666 0.916667 0 0.591666 1.000000 0 0.599999 0 0 0.599999 0.083333 0 0.599999 0.166667 0 0.599999 0.250000 0 0.599999 0.333333 0 0.599999 0.416667 0 0.599999 0.500000 0 0.599999 0.583333 0 0.599999 0.666667 0 0.599999 0.750000 0 0.599999 0.833333 0 0.599999 0.916667 0 0.599999 1.000000 0 0.608333 0 0 0.608333 0.083333 0 0.608333 0.166667 0 0.608333 0.250000 0 0.608333 0.333333 0 0.608333 0.416667 0 0.608333 0.500000 0 0.608333 0.583333 0 0.608333 0.666667 0 0.608333 0.750000 0 0.608333 0.833333 0 0.608333 0.916667 0 0.608333 1.000000 0 0.616666 0 0 0.616666 0.083333 0 0.616666 0.166667 0 0.616666 0.250000 0 0.616666 0.333333 0 0.616666 0.416667 0 0.616666 0.500000 0 0.616666 0.583333 0 0.616666 0.666667 0 0.616666 0.750000 0 0.616666 0.833333 0 0.616666 0.916667 0 0.616666 1.000000 0 0.624999 0 0 0.624999 0.083333 0 0.624999 0.166667 0 0.624999 0.250000 0 0.624999 0.333333 0 0.624999 0.416667 0 0.624999 0.500000 0 0.624999 0.583333 0 0.624999 0.666667 0 0.624999 0.750000 0 0.624999 0.833333 0 0.624999 0.916667 0 0.624999 1.000000 0 0.633333 0 0 0.633333 0.083333 0 0.633333 0.166667 0 0.633333 0.250000 0 0.633333 0.333333 0 0.633333 0.416667 0 0.633333 0.500000 0 0.633333 0.583333 0 0.633333 0.666667 0 0.633333 0.750000 0 0.633333 0.833333 0 0.633333 0.916667 0 0.633333 1.000000 0 0.641666 0 0 0.641666 0.083333 0 0.641666 0.166667 0 0.641666 0.250000 0 0.641666 0.333333 0 0.641666 0.416667 0 0.641666 0.500000 0 0.641666 0.583333 0 0.641666 0.666667 0 0.641666 0.750000 0 0.641666 0.833333 0 0.641666 0.916667 0 0.641666 1.000000 0 0.649999 0 0 0.649999 0.083333 0 0.649999 0.166667 0 0.649999 0.250000 0 0.649999 0.333333 0 0.649999 0.416667 0 0.649999 0.500000 0 0.649999 0.583333 0 0.649999 0.666667 0 0.649999 0.750000 0 0.649999 0.833333 0 0.649999 0.916667 0 0.649999 1.000000 0 0.658333 0 0 0.658333 0.083333 0 0.658333 0.166667 0 0.658333 0.250000 0 0.658333 0.333333 0 0.658333 0.416667 0 0.658333 0.500000 0 0.658333 0.583333 0 0.658333 0.666667 0 0.658333 0.750000 0 0.658333 0.833333 0 0.658333 0.916667 0 0.658333 1.000000 0 0.666666 0 0 0.666666 0.083333 0 0.666666 0.166667 0 0.666666 0.250000 0 0.666666 0.333333 0 0.666666 0.416667 0 0.666666 0.500000 0 0.666666 0.583333 0 0.666666 0.666667 0 0.666666 0.750000 0 0.666666 0.833333 0 0.666666 0.916667 0 0.666666 1.000000 0 0.675000 0 0 0.675000 0.083333 0 0.675000 0.166667 0 0.675000 0.250000 0 0.675000 0.333333 0 0.675000 0.416667 0 0.675000 0.500000 0 0.675000 0.583333 0 0.675000 0.666667 0 0.675000 0.750000 0 0.675000 0.833333 0 0.675000 0.916667 0 0.675000 1.000000 0 0.683333 0 0 0.683333 0.083333 0 0.683333 0.166667 0 0.683333 0.250000 0 0.683333 0.333333 0 0.683333 0.416667 0 0.683333 0.500000 0 0.683333 0.583333 0 0.683333 0.666667 0 0.683333 0.750000 0 0.683333 0.833333 0 0.683333 0.916667 0 0.683333 1.000000 0 0.691666 0 0 0.691666 0.083333 0 0.691666 0.166667 0 0.691666 0.250000 0 0.691666 0.333333 0 0.691666 0.416667 0 0.691666 0.500000 0 0.691666 0.583333 0 0.691666 0.666667 0 0.691666 0.750000 0 0.691666 0.833333 0 0.691666 0.916667 0 0.691666 1.000000 0 0.700000 0 0 0.700000 0.083333 0 0.700000 0.166667 0 0.700000 0.250000 0 0.700000 0.333333 0 0.700000 0.416667 0 0.700000 0.500000 0 0.700000 0.583333 0 0.700000 0.666667 0 0.700000 0.750000 0 0.700000 0.833333 0 0.700000 0.916667 0 0.700000 1.000000 0 0.708333 0 0 0.708333 0.083333 0 0.708333 0.166667 0 0.708333 0.250000 0 0.708333 0.333333 0 0.708333 0.416667 0 0.708333 0.500000 0 0.708333 0.583333 0 0.708333 0.666667 0 0.708333 0.750000 0 0.708333 0.833333 0 0.708333 0.916667 0 0.708333 1.000000 0 0.716666 0 0 0.716666 0.083333 0 0.716666 0.166667 0 0.716666 0.250000 0 0.716666 0.333333 0 0.716666 0.416667 0 0.716666 0.500000 0 0.716666 0.583333 0 0.716666 0.666667 0 0.716666 0.750000 0 0.716666 0.833333 0 0.716666 0.916667 0 0.716666 1.000000 0 0.725000 0 0 0.725000 0.083333 0 0.725000 0.166667 0 0.725000 0.250000 0 0.725000 0.333333 0 0.725000 0.416667 0 0.725000 0.500000 0 0.725000 0.583333 0 0.725000 0.666667 0 0.725000 0.750000 0 0.725000 0.833333 0 0.725000 0.916667 0 0.725000 1.000000 0 0.733333 0 0 0.733333 0.083333 0 0.733333 0.166667 0 0.733333 0.250000 0 0.733333 0.333333 0 0.733333 0.416667 0 0.733333 0.500000 0 0.733333 0.583333 0 0.733333 0.666667 0 0.733333 0.750000 0 0.733333 0.833333 0 0.733333 0.916667 0 0.733333 1.000000 0 0.741666 0 0 0.741666 0.083333 0 0.741666 0.166667 0 0.741666 0.250000 0 0.741666 0.333333 0 0.741666 0.416667 0 0.741666 0.500000 0 0.741666 0.583333 0 0.741666 0.666667 0 0.741666 0.750000 0 0.741666 0.833333 0 0.741666 0.916667 0 0.741666 1.000000 0 0.750000 0 0 0.750000 0.083333 0 0.750000 0.166667 0 0.750000 0.250000 0 0.750000 0.333333 0 0.750000 0.416667 0 0.750000 0.500000 0 0.750000 0.583333 0 0.750000 0.666667 0 0.750000 0.750000 0 0.750000 0.833333 0 0.750000 0.916667 0 0.750000 1.000000 0 0.758333 0 0 0.758333 0.083333 0 0.758333 0.166667 0 0.758333 0.250000 0 0.758333 0.333333 0 0.758333 0.416667 0 0.758333 0.500000 0 0.758333 0.583333 0 0.758333 0.666667 0 0.758333 0.750000 0 0.758333 0.833333 0 0.758333 0.916667 0 0.758333 1.000000 0 0.766667 0 0 0.766667 0.083333 0 0.766667 0.166667 0 0.766667 0.250000 0 0.766667 0.333333 0 0.766667 0.416667 0 0.766667 0.500000 0 0.766667 0.583333 0 0.766667 0.666667 0 0.766667 0.750000 0 0.766667 0.833333 0 0.766667 0.916667 0 0.766667 1.000000 0 0.775000 0 0 0.775000 0.083333 0 0.775000 0.166667 0 0.775000 0.250000 0 0.775000 0.333333 0 0.775000 0.416667 0 0.775000 0.500000 0 0.775000 0.583333 0 0.775000 0.666667 0 0.775000 0.750000 0 0.775000 0.833333 0 0.775000 0.916667 0 0.775000 1.000000 0 0.783333 0 0 0.783333 0.083333 0 0.783333 0.166667 0 0.783333 0.250000 0 0.783333 0.333333 0 0.783333 0.416667 0 0.783333 0.500000 0 0.783333 0.583333 0 0.783333 0.666667 0 0.783333 0.750000 0 0.783333 0.833333 0 0.783333 0.916667 0 0.783333 1.000000 0 0.791667 0 0 0.791667 0.083333 0 0.791667 0.166667 0 0.791667 0.250000 0 0.791667 0.333333 0 0.791667 0.416667 0 0.791667 0.500000 0 0.791667 0.583333 0 0.791667 0.666667 0 0.791667 0.750000 0 0.791667 0.833333 0 0.791667 0.916667 0 0.791667 1.000000 0 0.800000 0 0 0.800000 0.083333 0 0.800000 0.166667 0 0.800000 0.250000 0 0.800000 0.333333 0 0.800000 0.416667 0 0.800000 0.500000 0 0.800000 0.583333 0 0.800000 0.666667 0 0.800000 0.750000 0 0.800000 0.833333 0 0.800000 0.916667 0 0.800000 1.000000 0 0.808333 0 0 0.808333 0.083333 0 0.808333 0.166667 0 0.808333 0.250000 0 0.808333 0.333333 0 0.808333 0.416667 0 0.808333 0.500000 0 0.808333 0.583333 0 0.808333 0.666667 0 0.808333 0.750000 0 0.808333 0.833333 0 0.808333 0.916667 0 0.808333 1.000000 0 0.816667 0 0 0.816667 0.083333 0 0.816667 0.166667 0 0.816667 0.250000 0 0.816667 0.333333 0 0.816667 0.416667 0 0.816667 0.500000 0 0.816667 0.583333 0 0.816667 0.666667 0 0.816667 0.750000 0 0.816667 0.833333 0 0.816667 0.916667 0 0.816667 1.000000 0 0.825000 0 0 0.825000 0.083333 0 0.825000 0.166667 0 0.825000 0.250000 0 0.825000 0.333333 0 0.825000 0.416667 0 0.825000 0.500000 0 0.825000 0.583333 0 0.825000 0.666667 0 0.825000 0.750000 0 0.825000 0.833333 0 0.825000 0.916667 0 0.825000 1.000000 0 0.833333 0 0 0.833333 0.083333 0 0.833333 0.166667 0 0.833333 0.250000 0 0.833333 0.333333 0 0.833333 0.416667 0 0.833333 0.500000 0 0.833333 0.583333 0 0.833333 0.666667 0 0.833333 0.750000 0 0.833333 0.833333 0 0.833333 0.916667 0 0.833333 1.000000 0 0.841667 0 0 0.841667 0.083333 0 0.841667 0.166667 0 0.841667 0.250000 0 0.841667 0.333333 0 0.841667 0.416667 0 0.841667 0.500000 0 0.841667 0.583333 0 0.841667 0.666667 0 0.841667 0.750000 0 0.841667 0.833333 0 0.841667 0.916667 0 0.841667 1.000000 0 0.850000 0 0 0.850000 0.083333 0 0.850000 0.166667 0 0.850000 0.250000 0 0.850000 0.333333 0 0.850000 0.416667 0 0.850000 0.500000 0 0.850000 0.583333 0 0.850000 0.666667 0 0.850000 0.750000 0 0.850000 0.833333 0 0.850000 0.916667 0 0.850000 1.000000 0 0.858334 0 0 0.858334 0.083333 0 0.858334 0.166667 0 0.858334 0.250000 0 0.858334 0.333333 0 0.858334 0.416667 0 0.858334 0.500000 0 0.858334 0.583333 0 0.858334 0.666667 0 0.858334 0.750000 0 0.858334 0.833333 0 0.858334 0.916667 0 0.858334 1.000000 0 0.866667 0 0 0.866667 0.083333 0 0.866667 0.166667 0 0.866667 0.250000 0 0.866667 0.333333 0 0.866667 0.416667 0 0.866667 0.500000 0 0.866667 0.583333 0 0.866667 0.666667 0 0.866667 0.750000 0 0.866667 0.833333 0 0.866667 0.916667 0 0.866667 1.000000 0 0.875000 0 0 0.875000 0.083333 0 0.875000 0.166667 0 0.875000 0.250000 0 0.875000 0.333333 0 0.875000 0.416667 0 0.875000 0.500000 0 0.875000 0.583333 0 0.875000 0.666667 0 0.875000 0.750000 0 0.875000 0.833333 0 0.875000 0.916667 0 0.875000 1.000000 0 0.883334 0 0 0.883334 0.083333 0 0.883334 0.166667 0 0.883334 0.250000 0 0.883334 0.333333 0 0.883334 0.416667 0 0.883334 0.500000 0 0.883334 0.583333 0 0.883334 0.666667 0 0.883334 0.750000 0 0.883334 0.833333 0 0.883334 0.916667 0 0.883334 1.000000 0 0.891667 0 0 0.891667 0.083333 0 0.891667 0.166667 0 0.891667 0.250000 0 0.891667 0.333333 0 0.891667 0.416667 0 0.891667 0.500000 0 0.891667 0.583333 0 0.891667 0.666667 0 0.891667 0.750000 0 0.891667 0.833333 0 0.891667 0.916667 0 0.891667 1.000000 0 0.900000 0 0 0.900000 0.083333 0 0.900000 0.166667 0 0.900000 0.250000 0 0.900000 0.333333 0 0.900000 0.416667 0 0.900000 0.500000 0 0.900000 0.583333 0 0.900000 0.666667 0 0.900000 0.750000 0 0.900000 0.833333 0 0.900000 0.916667 0 0.900000 1.000000 0 0.908334 0 0 0.908334 0.083333 0 0.908334 0.166667 0 0.908334 0.250000 0 0.908334 0.333333 0 0.908334 0.416667 0 0.908334 0.500000 0 0.908334 0.583333 0 0.908334 0.666667 0 0.908334 0.750000 0 0.908334 0.833333 0 0.908334 0.916667 0 0.908334 1.000000 0 0.916667 0 0 0.916667 0.083333 0 0.916667 0.166667 0 0.916667 0.250000 0 0.916667 0.333333 0 0.916667 0.416667 0 0.916667 0.500000 0 0.916667 0.583333 0 0.916667 0.666667 0 0.916667 0.750000 0 0.916667 0.833333 0 0.916667 0.916667 0 0.916667 1.000000 0 0.925000 0 0 0.925000 0.083333 0 0.925000 0.166667 0 0.925000 0.250000 0 0.925000 0.333333 0 0.925000 0.416667 0 0.925000 0.500000 0 0.925000 0.583333 0 0.925000 0.666667 0 0.925000 0.750000 0 0.925000 0.833333 0 0.925000 0.916667 0 0.925000 1.000000 0 0.933334 0 0 0.933334 0.083333 0 0.933334 0.166667 0 0.933334 0.250000 0 0.933334 0.333333 0 0.933334 0.416667 0 0.933334 0.500000 0 0.933334 0.583333 0 0.933334 0.666667 0 0.933334 0.750000 0 0.933334 0.833333 0 0.933334 0.916667 0 0.933334 1.000000 0 0.941667 0 0 0.941667 0.083333 0 0.941667 0.166667 0 0.941667 0.250000 0 0.941667 0.333333 0 0.941667 0.416667 0 0.941667 0.500000 0 0.941667 0.583333 0 0.941667 0.666667 0 0.941667 0.750000 0 0.941667 0.833333 0 0.941667 0.916667 0 0.941667 1.000000 0 0.950001 0 0 0.950001 0.083333 0 0.950001 0.166667 0 0.950001 0.250000 0 0.950001 0.333333 0 0.950001 0.416667 0 0.950001 0.500000 0 0.950001 0.583333 0 0.950001 0.666667 0 0.950001 0.750000 0 0.950001 0.833333 0 0.950001 0.916667 0 0.950001 1.000000 0 0.958334 0 0 0.958334 0.083333 0 0.958334 0.166667 0 0.958334 0.250000 0 0.958334 0.333333 0 0.958334 0.416667 0 0.958334 0.500000 0 0.958334 0.583333 0 0.958334 0.666667 0 0.958334 0.750000 0 0.958334 0.833333 0 0.958334 0.916667 0 0.958334 1.000000 0 0.966667 0 0 0.966667 0.083333 0 0.966667 0.166667 0 0.966667 0.250000 0 0.966667 0.333333 0 0.966667 0.416667 0 0.966667 0.500000 0 0.966667 0.583333 0 0.966667 0.666667 0 0.966667 0.750000 0 0.966667 0.833333 0 0.966667 0.916667 0 0.966667 1.000000 0 0.975001 0 0 0.975001 0.083333 0 0.975001 0.166667 0 0.975001 0.250000 0 0.975001 0.333333 0 0.975001 0.416667 0 0.975001 0.500000 0 0.975001 0.583333 0 0.975001 0.666667 0 0.975001 0.750000 0 0.975001 0.833333 0 0.975001 0.916667 0 0.975001 1.000000 0 0.983334 0 0 0.983334 0.083333 0 0.983334 0.166667 0 0.983334 0.250000 0 0.983334 0.333333 0 0.983334 0.416667 0 0.983334 0.500000 0 0.983334 0.583333 0 0.983334 0.666667 0 0.983334 0.750000 0 0.983334 0.833333 0 0.983334 0.916667 0 0.983334 1.000000 0 0.991667 0 0 0.991667 0.083333 0 0.991667 0.166667 0 0.991667 0.250000 0 0.991667 0.333333 0 0.991667 0.416667 0 0.991667 0.500000 0 0.991667 0.583333 0 0.991667 0.666667 0 0.991667 0.750000 0 0.991667 0.833333 0 0.991667 0.916667 0 0.991667 1.000000 0 1.000001 0 0 1.000001 0.083333 0 1.000001 0.166667 0 1.000001 0.250000 0 1.000001 0.333333 0 1.000001 0.416667 0 1.000001 0.500000 0 1.000001 0.583333 0 1.000001 0.666667 0 1.000001 0.750000 0 1.000001 0.833333 0 1.000001 0.916667 0 1.000001 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="1573" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="2880">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 12 1 13 13 2 14 0 0 0 13 2 14 1 3 1 1 3 1 13 2 14 14 4 15 1 3 1 14 4 15 2 5 2 2 5 2 14 4 15 15 6 16 2 5 2 15 6 16 3 7 3 3 7 3 15 6 16 16 8 17 3 7 3 16 8 17 4 9 4 4 9 4 16 8 17 17 10 18 4 9 4 17 10 18 5 11 5 5 11 5 17 10 18 18 12 19 5 11 5 18 12 19 6 13 6 6 13 6 18 12 19 19 14 20 6 13 6 19 14 20 7 15 7 7 15 7 19 14 20 20 16 21 7 15 7 20 16 21 8 17 8 8 17 8 20 16 21 21 18 22 8 17 8 21 18 22 9 19 9 9 19 9 21 18 22 22 20 23 9 19 9 22 20 23 10 21 10 10 21 10 22 20 23 23 22 24 10 21 10 23 22 24 11 23 11 11 23 11 23 22 24 12 1 25 11 23 11 12 1 25 0 0 12 12 1 13 24 24 26 25 25 27 12 1 13 25 25 27 13 2 14 13 2 14 25 25 27 26 26 28 13 2 14 26 26 28 14 4 15 14 4 15 26 26 28 27 27 29 14 4 15 27 27 29 15 6 16 15 6 16 27 27 29 28 28 30 15 6 16 28 28 30 16 8 17 16 8 17 28 28 30 29 29 31 16 8 17 29 29 31 17 10 18 17 10 18 29 29 31 30 30 32 17 10 18 30 30 32 18 12 19 18 12 19 30 30 32 31 31 33 18 12 19 31 31 33 19 14 20 19 14 20 31 31 33 32 32 34 19 14 20 32 32 34 20 16 21 20 16 21 32 32 34 33 33 35 20 16 21 33 33 35 21 18 22 21 18 22 33 33 35 34 34 36 21 18 22 34 34 36 22 20 23 22 20 23 34 34 36 35 35 37 22 20 23 35 35 37 23 22 24 23 22 24 35 35 37 24 24 38 23 22 24 24 24 38 12 1 25 24 24 26 36 36 39 37 37 40 24 24 26 37 37 40 25 25 27 25 25 27 37 37 40 38 38 41 25 25 27 38 38 41 26 26 28 26 26 28 38 38 41 39 39 42 26 26 28 39 39 42 27 27 29 27 27 29 39 39 42 40 40 43 27 27 29 40 40 43 28 28 30 28 28 30 40 40 43 41 41 44 28 28 30 41 41 44 29 29 31 29 29 31 41 41 44 42 42 45 29 29 31 42 42 45 30 30 32 30 30 32 42 42 45 43 43 46 30 30 32 43 43 46 31 31 33 31 31 33 43 43 46 44 44 47 31 31 33 44 44 47 32 32 34 32 32 34 44 44 47 45 45 48 32 32 34 45 45 48 33 33 35 33 33 35 45 45 48 46 46 49 33 33 35 46 46 49 34 34 36 34 34 36 46 46 49 47 47 50 34 34 36 47 47 50 35 35 37 35 35 37 47 47 50 36 36 51 35 35 37 36 36 51 24 24 38 36 36 39 48 48 52 49 49 53 36 36 39 49 49 53 37 37 40 37 37 40 49 49 53 50 50 54 37 37 40 50 50 54 38 38 41 38 38 41 50 50 54 51 51 55 38 38 41 51 51 55 39 39 42 39 39 42 51 51 55 52 52 56 39 39 42 52 52 56 40 40 43 40 40 43 52 52 56 53 53 57 40 40 43 53 53 57 41 41 44 41 41 44 53 53 57 54 54 58 41 41 44 54 54 58 42 42 45 42 42 45 54 54 58 55 55 59 42 42 45 55 55 59 43 43 46 43 43 46 55 55 59 56 56 60 43 43 46 56 56 60 44 44 47 44 44 47 56 56 60 57 57 61 44 44 47 57 57 61 45 45 48 45 45 48 57 57 61 58 58 62 45 45 48 58 58 62 46 46 49 46 46 49 58 58 62 59 59 63 46 46 49 59 59 63 47 47 50 47 47 50 59 59 63 48 48 64 47 47 50 48 48 64 36 36 51 48 48 52 60 60 65 61 61 66 48 48 52 61 61 66 49 49 53 49 49 53 61 61 66 62 62 67 49 49 53 62 62 67 50 50 54 50 50 54 62 62 67 63 63 68 50 50 54 63 63 68 51 51 55 51 51 55 63 63 68 64 64 69 51 51 55 64 64 69 52 52 56 52 52 56 64 64 69 65 65 70 52 52 56 65 65 70 53 53 57 53 53 57 65 65 70 66 66 71 53 53 57 66 66 71 54 54 58 54 54 58 66 66 71 67 67 72 54 54 58 67 67 72 55 55 59 55 55 59 67 67 72 68 68 73 55 55 59 68 68 73 56 56 60 56 56 60 68 68 73 69 69 74 56 56 60 69 69 74 57 57 61 57 57 61 69 69 74 70 70 75 57 57 61 70 70 75 58 58 62 58 58 62 70 70 75 71 71 76 58 58 62 71 71 76 59 59 63 59 59 63 71 71 76 60 60 77 59 59 63 60 60 77 48 48 64 60 60 65 72 72 78 73 73 79 60 60 65 73 73 79 61 61 66 61 61 66 73 73 79 74 74 80 61 61 66 74 74 80 62 62 67 62 62 67 74 74 80 75 75 81 62 62 67 75 75 81 63 63 68 63 63 68 75 75 81 76 76 82 63 63 68 76 76 82 64 64 69 64 64 69 76 76 82 77 77 83 64 64 69 77 77 83 65 65 70 65 65 70 77 77 83 78 78 84 65 65 70 78 78 84 66 66 71 66 66 71 78 78 84 79 79 85 66 66 71 79 79 85 67 67 72 67 67 72 79 79 85 80 80 86 67 67 72 80 80 86 68 68 73 68 68 73 80 80 86 81 81 87 68 68 73 81 81 87 69 69 74 69 69 74 81 81 87 82 82 88 69 69 74 82 82 88 70 70 75 70 70 75 82 82 88 83 83 89 70 70 75 83 83 89 71 71 76 71 71 76 83 83 89 72 72 90 71 71 76 72 72 90 60 60 77 72 72 78 84 84 91 85 85 92 72 72 78 85 85 92 73 73 79 73 73 79 85 85 92 86 86 93 73 73 79 86 86 93 74 74 80 74 74 80 86 86 93 87 87 94 74 74 80 87 87 94 75 75 81 75 75 81 87 87 94 88 88 95 75 75 81 88 88 95 76 76 82 76 76 82 88 88 95 89 89 96 76 76 82 89 89 96 77 77 83 77 77 83 89 89 96 90 90 97 77 77 83 90 90 97 78 78 84 78 78 84 90 90 97 91 91 98 78 78 84 91 91 98 79 79 85 79 79 85 91 91 98 92 92 99 79 79 85 92 92 99 80 80 86 80 80 86 92 92 99 93 93 100 80 80 86 93 93 100 81 81 87 81 81 87 93 93 100 94 94 101 81 81 87 94 94 101 82 82 88 82 82 88 94 94 101 95 95 102 82 82 88 95 95 102 83 83 89 83 83 89 95 95 102 84 84 103 83 83 89 84 84 103 72 72 90 84 84 91 96 96 104 97 97 105 84 84 91 97 97 105 85 85 92 85 85 92 97 97 105 98 98 106 85 85 92 98 98 106 86 86 93 86 86 93 98 98 106 99 99 107 86 86 93 99 99 107 87 87 94 87 87 94 99 99 107 100 100 108 87 87 94 100 100 108 88 88 95 88 88 95 100 100 108 101 101 109 88 88 95 101 101 109 89 89 96 89 89 96 101 101 109 102 102 110 89 89 96 102 102 110 90 90 97 90 90 97 102 102 110 103 103 111 90 90 97 103 103 111 91 91 98 91 91 98 103 103 111 104 104 112 91 91 98 104 104 112 92 92 99 92 92 99 104 104 112 105 105 113 92 92 99 105 105 113 93 93 100 93 93 100 105 105 113 106 106 114 93 93 100 106 106 114 94 94 101 94 94 101 106 106 114 107 107 115 94 94 101 107 107 115 95 95 102 95 95 102 107 107 115 96 96 116 95 95 102 96 96 116 84 84 103 96 96 104 108 108 117 109 109 118 96 96 104 109 109 118 97 97 105 97 97 105 109 109 118 110 110 119 97 97 105 110 110 119 98 98 106 98 98 106 110 110 119 111 111 120 98 98 106 111 111 120 99 99 107 99 99 107 111 111 120 112 112 121 99 99 107 112 112 121 100 100 108 100 100 108 112 112 121 113 113 122 100 100 108 113 113 122 101 101 109 101 101 109 113 113 122 114 114 123 101 101 109 114 114 123 102 102 110 102 102 110 114 114 123 115 115 124 102 102 110 115 115 124 103 103 111 103 103 111 115 115 124 116 116 125 103 103 111 116 116 125 104 104 112 104 104 112 116 116 125 117 117 126 104 104 112 117 117 126 105 105 113 105 105 113 117 117 126 118 118 127 105 105 113 118 118 127 106 106 114 106 106 114 118 118 127 119 119 128 106 106 114 119 119 128 107 107 115 107 107 115 119 119 128 108 108 129 107 107 115 108 108 129 96 96 116 108 108 117 120 120 130 121 121 131 108 108 117 121 121 131 109 109 118 109 109 118 121 121 131 122 122 132 109 109 118 122 122 132 110 110 119 110 110 119 122 122 132 123 123 133 110 110 119 123 123 133 111 111 120 111 111 120 123 123 133 124 124 134 111 111 120 124 124 134 112 112 121 112 112 121 124 124 134 125 125 135 112 112 121 125 125 135 113 113 122 113 113 122 125 125 135 126 126 136 113 113 122 126 126 136 114 114 123 114 114 123 126 126 136 127 127 137 114 114 123 127 127 137 115 115 124 115 115 124 127 127 137 128 128 138 115 115 124 128 128 138 116 116 125 116 116 125 128 128 138 129 129 139 116 116 125 129 129 139 117 117 126 117 117 126 129 129 139 130 130 140 117 117 126 130 130 140 118 118 127 118 118 127 130 130 140 131 131 141 118 118 127 131 131 141 119 119 128 119 119 128 131 131 141 120 120 142 119 119 128 120 120 142 108 108 129 120 120 130 132 132 143 133 133 144 120 120 130 133 133 144 121 121 131 121 121 131 133 133 144 134 134 145 121 121 131 134 134 145 122 122 132 122 122 132 134 134 145 135 135 146 122 122 132 135 135 146 123 123 133 123 123 133 135 135 146 136 136 147 123 123 133 136 136 147 124 124 134 124 124 134 136 136 147 137 137 148 124 124 134 137 137 148 125 125 135 125 125 135 137 137 148 138 138 149 125 125 135 138 138 149 126 126 136 126 126 136 138 138 149 139 139 150 126 126 136 139 139 150 127 127 137 127 127 137 139 139 150 140 140 151 127 127 137 140 140 151 128 128 138 128 128 138 140 140 151 141 141 152 128 128 138 141 141 152 129 129 139 129 129 139 141 141 152 142 142 153 129 129 139 142 142 153 130 130 140 130 130 140 142 142 153 143 143 154 130 130 140 143 143 154 131 131 141 131 131 141 143 143 154 132 132 155 131 131 141 132 132 155 120 120 142 132 132 143 144 144 156 145 145 157 132 132 143 145 145 157 133 133 144 133 133 144 145 145 157 146 146 158 133 133 144 146 146 158 134 134 145 134 134 145 146 146 158 147 147 159 134 134 145 147 147 159 135 135 146 135 135 146 147 147 159 148 148 160 135 135 146 148 148 160 136 136 147 136 136 147 148 148 160 149 149 161 136 136 147 149 149 161 137 137 148 137 137 148 149 149 161 150 150 162 137 137 148 150 150 162 138 138 149 138 138 149 150 150 162 151 151 163 138 138 149 151 151 163 139 139 150 139 139 150 151 151 163 152 152 164 139 139 150 152 152 164 140 140 151 140 140 151 152 152 164 153 153 165 140 140 151 153 153 165 141 141 152 141 141 152 153 153 165 154 154 166 141 141 152 154 154 166 142 142 153 142 142 153 154 154 166 155 155 167 142 142 153 155 155 167 143 143 154 143 143 154 155 155 167 144 144 168 143 143 154 144 144 168 132 132 155 144 144 156 156 156 169 157 157 170 144 144 156 157 157 170 145 145 157 145 145 157 157 157 170 158 158 171 145 145 157 158 158 171 146 146 158 146 146 158 158 158 171 159 159 172 146 146 158 159 159 172 147 147 159 147 147 159 159 159 172 160 160 173 147 147 159 160 160 173 148 148 160 148 148 160 160 160 173 161 161 174 148 148 160 161 161 174 149 149 161 149 149 161 161 161 174 162 162 175 149 149 161 162 162 175 150 150 162 150 150 162 162 162 175 163 163 176 150 150 162 163 163 176 151 151 163 151 151 163 163 163 176 164 164 177 151 151 163 164 164 177 152 152 164 152 152 164 164 164 177 165 165 178 152 152 164 165 165 178 153 153 165 153 153 165 165 165 178 166 166 179 153 153 165 166 166 179 154 154 166 154 154 166 166 166 179 167 167 180 154 154 166 167 167 180 155 155 167 155 155 167 167 167 180 156 156 181 155 155 167 156 156 181 144 144 168 156 156 169 168 168 182 169 169 183 156 156 169 169 169 183 157 157 170 157 157 170 169 169 183 170 170 184 157 157 170 170 170 184 158 158 171 158 158 171 170 170 184 171 171 185 158 158 171 171 171 185 159 159 172 159 159 172 171 171 185 172 172 186 159 159 172 172 172 186 160 160 173 160 160 173 172 172 186 173 173 187 160 160 173 173 173 187 161 161 174 161 161 174 173 173 187 174 174 188 161 161 174 174 174 188 162 162 175 162 162 175 174 174 188 175 175 189 162 162 175 175 175 189 163 163 176 163 163 176 175 175 189 176 176 190 163 163 176 176 176 190 164 164 177 164 164 177 176 176 190 177 177 191 164 164 177 177 177 191 165 165 178 165 165 178 177 177 191 178 178 192 165 165 178 178 178 192 166 166 179 166 166 179 178 178 192 179 179 193 166 166 179 179 179 193 167 167 180 167 167 180 179 179 193 168 168 194 167 167 180 168 168 194 156 156 181 168 168 182 180 180 195 181 181 196 168 168 182 181 181 196 169 169 183 169 169 183 181 181 196 182 182 197 169 169 183 182 182 197 170 170 184 170 170 184 182 182 197 183 183 198 170 170 184 183 183 198 171 171 185 171 171 185 183 183 198 184 184 199 171 171 185 184 184 199 172 172 186 172 172 186 184 184 199 185 185 200 172 172 186 185 185 200 173 173 187 173 173 187 185 185 200 186 186 201 173 173 187 186 186 201 174 174 188 174 174 188 186 186 201 187 187 202 174 174 188 187 187 202 175 175 189 175 175 189 187 187 202 188 188 203 175 175 189 188 188 203 176 176 190 176 176 190 188 188 203 189 189 204 176 176 190 189 189 204 177 177 191 177 177 191 189 189 204 190 190 205 177 177 191 190 190 205 178 178 192 178 178 192 190 190 205 191 191 206 178 178 192 191 191 206 179 179 193 179 179 193 191 191 206 180 180 207 179 179 193 180 180 207 168 168 194 180 180 195 192 192 208 193 193 209 180 180 195 193 193 209 181 181 196 181 181 196 193 193 209 194 194 210 181 181 196 194 194 210 182 182 197 182 182 197 194 194 210 195 195 211 182 182 197 195 195 211 183 183 198 183 183 198 195 195 211 196 196 212 183 183 198 196 196 212 184 184 199 184 184 199 196 196 212 197 197 213 184 184 199 197 197 213 185 185 200 185 185 200 197 197 213 198 198 214 185 185 200 198 198 214 186 186 201 186 186 201 198 198 214 199 199 215 186 186 201 199 199 215 187 187 202 187 187 202 199 199 215 200 200 216 187 187 202 200 200 216 188 188 203 188 188 203 200 200 216 201 201 217 188 188 203 201 201 217 189 189 204 189 189 204 201 201 217 202 202 218 189 189 204 202 202 218 190 190 205 190 190 205 202 202 218 203 203 219 190 190 205 203 203 219 191 191 206 191 191 206 203 203 219 192 192 220 191 191 206 192 192 220 180 180 207 192 192 208 204 204 221 205 205 222 192 192 208 205 205 222 193 193 209 193 193 209 205 205 222 206 206 223 193 193 209 206 206 223 194 194 210 194 194 210 206 206 223 207 207 224 194 194 210 207 207 224 195 195 211 195 195 211 207 207 224 208 208 225 195 195 211 208 208 225 196 196 212 196 196 212 208 208 225 209 209 226 196 196 212 209 209 226 197 197 213 197 197 213 209 209 226 210 210 227 197 197 213 210 210 227 198 198 214 198 198 214 210 210 227 211 211 228 198 198 214 211 211 228 199 199 215 199 199 215 211 211 228 212 212 229 199 199 215 212 212 229 200 200 216 200 200 216 212 212 229 213 213 230 200 200 216 213 213 230 201 201 217 201 201 217 213 213 230 214 214 231 201 201 217 214 214 231 202 202 218 202 202 218 214 214 231 215 215 232 202 202 218 215 215 232 203 203 219 203 203 219 215 215 232 204 204 233 203 203 219 204 204 233 192 192 220 204 204 221 216 216 234 217 217 235 204 204 221 217 217 235 205 205 222 205 205 222 217 217 235 218 218 236 205 205 222 218 218 236 206 206 223 206 206 223 218 218 236 219 219 237 206 206 223 219 219 237 207 207 224 207 207 224 219 219 237 220 220 238 207 207 224 220 220 238 208 208 225 208 208 225 220 220 238 221 221 239 208 208 225 221 221 239 209 209 226 209 209 226 221 221 239 222 222 240 209 209 226 222 222 240 210 210 227 210 210 227 222 222 240 223 223 241 210 210 227 223 223 241 211 211 228 211 211 228 223 223 241 224 224 242 211 211 228 224 224 242 212 212 229 212 212 229 224 224 242 225 225 243 212 212 229 225 225 243 213 213 230 213 213 230 225 225 243 226 226 244 213 213 230 226 226 244 214 214 231 214 214 231 226 226 244 227 227 245 214 214 231 227 227 245 215 215 232 215 215 232 227 227 245 216 216 246 215 215 232 216 216 246 204 204 233 216 216 234 228 228 247 229 229 248 216 216 234 229 229 248 217 217 235 217 217 235 229 229 248 230 230 249 217 217 235 230 230 249 218 218 236 218 218 236 230 230 249 231 231 250 218 218 236 231 231 250 219 219 237 219 219 237 231 231 250 232 232 251 219 219 237 232 232 251 220 220 238 220 220 238 232 232 251 233 233 252 220 220 238 233 233 252 221 221 239 221 221 239 233 233 252 234 234 253 221 221 239 234 234 253 222 222 240 222 222 240 234 234 253 235 235 254 222 222 240 235 235 254 223 223 241 223 223 241 235 235 254 236 236 255 223 223 241 236 236 255 224 224 242 224 224 242 236 236 255 237 237 256 224 224 242 237 237 256 225 225 243 225 225 243 237 237 256 238 238 257 225 225 243 238 238 257 226 226 244 226 226 244 238 238 257 239 239 258 226 226 244 239 239 258 227 227 245 227 227 245 239 239 258 228 228 259 227 227 245 228 228 259 216 216 246 228 228 247 240 240 260 241 241 261 228 228 247 241 241 261 229 229 248 229 229 248 241 241 261 242 242 262 229 229 248 242 242 262 230 230 249 230 230 249 242 242 262 243 243 263 230 230 249 243 243 263 231 231 250 231 231 250 243 243 263 244 244 264 231 231 250 244 244 264 232 232 251 232 232 251 244 244 264 245 245 265 232 232 251 245 245 265 233 233 252 233 233 252 245 245 265 246 246 266 233 233 252 246 246 266 234 234 253 234 234 253 246 246 266 247 247 267 234 234 253 247 247 267 235 235 254 235 235 254 247 247 267 248 248 268 235 235 254 248 248 268 236 236 255 236 236 255 248 248 268 249 249 269 236 236 255 249 249 269 237 237 256 237 237 256 249 249 269 250 250 270 237 237 256 250 250 270 238 238 257 238 238 257 250 250 270 251 251 271 238 238 257 251 251 271 239 239 258 239 239 258 251 251 271 240 240 272 239 239 258 240 240 272 228 228 259 240 240 260 252 252 273 253 253 274 240 240 260 253 253 274 241 241 261 241 241 261 253 253 274 254 254 275 241 241 261 254 254 275 242 242 262 242 242 262 254 254 275 255 255 276 242 242 262 255 255 276 243 243 263 243 243 263 255 255 276 256 256 277 243 243 263 256 256 277 244 244 264 244 244 264 256 256 277 257 257 278 244 244 264 257 257 278 245 245 265 245 245 265 257 257 278 258 258 279 245 245 265 258 258 279 246 246 266 246 246 266 258 258 279 259 259 280 246 246 266 259 259 280 247 247 267 247 247 267 259 259 280 260 260 281 247 247 267 260 260 281 248 248 268 248 248 268 260 260 281 261 261 282 248 248 268 261 261 282 249 249 269 249 249 269 261 261 282 262 262 283 249 249 269 262 262 283 250 250 270 250 250 270 262 262 283 263 263 284 250 250 270 263 263 284 251 251 271 251 251 271 263 263 284 252 252 285 251 251 271 252 252 285 240 240 272 252 252 273 264 264 286 265 265 287 252 252 273 265 265 287 253 253 274 253 253 274 265 265 287 266 266 288 253 253 274 266 266 288 254 254 275 254 254 275 266 266 288 267 267 289 254 254 275 267 267 289 255 255 276 255 255 276 267 267 289 268 268 290 255 255 276 268 268 290 256 256 277 256 256 277 268 268 290 269 269 291 256 256 277 269 269 291 257 257 278 257 257 278 269 269 291 270 270 292 257 257 278 270 270 292 258 258 279 258 258 279 270 270 292 271 271 293 258 258 279 271 271 293 259 259 280 259 259 280 271 271 293 272 272 294 259 259 280 272 272 294 260 260 281 260 260 281 272 272 294 273 273 295 260 260 281 273 273 295 261 261 282 261 261 282 273 273 295 274 274 296 261 261 282 274 274 296 262 262 283 262 262 283 274 274 296 275 275 297 262 262 283 275 275 297 263 263 284 263 263 284 275 275 297 264 264 298 263 263 284 264 264 298 252 252 285 264 264 286 276 276 299 277 277 300 264 264 286 277 277 300 265 265 287 265 265 287 277 277 300 278 278 301 265 265 287 278 278 301 266 266 288 266 266 288 278 278 301 279 279 302 266 266 288 279 279 302 267 267 289 267 267 289 279 279 302 280 280 303 267 267 289 280 280 303 268 268 290 268 268 290 280 280 303 281 281 304 268 268 290 281 281 304 269 269 291 269 269 291 281 281 304 282 282 305 269 269 291 282 282 305 270 270 292 270 270 292 282 282 305 283 283 306 270 270 292 283 283 306 271 271 293 271 271 293 283 283 306 284 284 307 271 271 293 284 284 307 272 272 294 272 272 294 284 284 307 285 285 308 272 272 294 285 285 308 273 273 295 273 273 295 285 285 308 286 286 309 273 273 295 286 286 309 274 274 296 274 274 296 286 286 309 287 287 310 274 274 296 287 287 310 275 275 297 275 275 297 287 287 310 276 276 311 275 275 297 276 276 311 264 264 298 276 276 299 288 288 312 289 289 313 276 276 299 289 289 313 277 277 300 277 277 300 289 289 313 290 290 314 277 277 300 290 290 314 278 278 301 278 278 301 290 290 314 291 291 315 278 278 301 291 291 315 279 279 302 279 279 302 291 291 315 292 292 316 279 279 302 292 292 316 280 280 303 280 280 303 292 292 316 293 293 317 280 280 303 293 293 317 281 281 304 281 281 304 293 293 317 294 294 318 281 281 304 294 294 318 282 282 305 282 282 305 294 294 318 295 295 319 282 282 305 295 295 319 283 283 306 283 283 306 295 295 319 296 296 320 283 283 306 296 296 320 284 284 307 284 284 307 296 296 320 297 297 321 284 284 307 297 297 321 285 285 308 285 285 308 297 297 321 298 298 322 285 285 308 298 298 322 286 286 309 286 286 309 298 298 322 299 299 323 286 286 309 299 299 323 287 287 310 287 287 310 299 299 323 288 288 324 287 287 310 288 288 324 276 276 311 288 288 312 300 300 325 301 301 326 288 288 312 301 301 326 289 289 313 289 289 313 301 301 326 302 302 327 289 289 313 302 302 327 290 290 314 290 290 314 302 302 327 303 303 328 290 290 314 303 303 328 291 291 315 291 291 315 303 303 328 304 304 329 291 291 315 304 304 329 292 292 316 292 292 316 304 304 329 305 305 330 292 292 316 305 305 330 293 293 317 293 293 317 305 305 330 306 306 331 293 293 317 306 306 331 294 294 318 294 294 318 306 306 331 307 307 332 294 294 318 307 307 332 295 295 319 295 295 319 307 307 332 308 308 333 295 295 319 308 308 333 296 296 320 296 296 320 308 308 333 309 309 334 296 296 320 309 309 334 297 297 321 297 297 321 309 309 334 310 310 335 297 297 321 310 310 335 298 298 322 298 298 322 310 310 335 311 311 336 298 298 322 311 311 336 299 299 323 299 299 323 311 311 336 300 300 337 299 299 323 300 300 337 288 288 324 300 300 325 312 312 338 313 313 339 300 300 325 313 313 339 301 301 326 301 301 326 313 313 339 314 314 340 301 301 326 314 314 340 302 302 327 302 302 327 314 314 340 315 315 341 302 302 327 315 315 341 303 303 328 303 303 328 315 315 341 316 316 342 303 303 328 316 316 342 304 304 329 304 304 329 316 316 342 317 317 343 304 304 329 317 317 343 305 305 330 305 305 330 317 317 343 318 318 344 305 305 330 318 318 344 306 306 331 306 306 331 318 318 344 319 319 345 306 306 331 319 319 345 307 307 332 307 307 332 319 319 345 320 320 346 307 307 332 320 320 346 308 308 333 308 308 333 320 320 346 321 321 347 308 308 333 321 321 347 309 309 334 309 309 334 321 321 347 322 322 348 309 309 334 322 322 348 310 310 335 310 310 335 322 322 348 323 323 349 310 310 335 323 323 349 311 311 336 311 311 336 323 323 349 312 312 350 311 311 336 312 312 350 300 300 337 312 312 338 324 324 351 325 325 352 312 312 338 325 325 352 313 313 339 313 313 339 325 325 352 326 326 353 313 313 339 326 326 353 314 314 340 314 314 340 326 326 353 327 327 354 314 314 340 327 327 354 315 315 341 315 315 341 327 327 354 328 328 355 315 315 341 328 328 355 316 316 342 316 316 342 328 328 355 329 329 356 316 316 342 329 329 356 317 317 343 317 317 343 329 329 356 330 330 357 317 317 343 330 330 357 318 318 344 318 318 344 330 330 357 331 331 358 318 318 344 331 331 358 319 319 345 319 319 345 331 331 358 332 332 359 319 319 345 332 332 359 320 320 346 320 320 346 332 332 359 333 333 360 320 320 346 333 333 360 321 321 347 321 321 347 333 333 360 334 334 361 321 321 347 334 334 361 322 322 348 322 322 348 334 334 361 335 335 362 322 322 348 335 335 362 323 323 349 323 323 349 335 335 362 324 324 363 323 323 349 324 324 363 312 312 350 324 324 351 336 336 364 337 337 365 324 324 351 337 337 365 325 325 352 325 325 352 337 337 365 338 338 366 325 325 352 338 338 366 326 326 353 326 326 353 338 338 366 339 339 367 326 326 353 339 339 367 327 327 354 327 327 354 339 339 367 340 340 368 327 327 354 340 340 368 328 328 355 328 328 355 340 340 368 341 341 369 328 328 355 341 341 369 329 329 356 329 329 356 341 341 369 342 342 370 329 329 356 342 342 370 330 330 357 330 330 357 342 342 370 343 343 371 330 330 357 343 343 371 331 331 358 331 331 358 343 343 371 344 344 372 331 331 358 344 344 372 332 332 359 332 332 359 344 344 372 345 345 373 332 332 359 345 345 373 333 333 360 333 333 360 345 345 373 346 346 374 333 333 360 346 346 374 334 334 361 334 334 361 346 346 374 347 347 375 334 334 361 347 347 375 335 335 362 335 335 362 347 347 375 336 336 376 335 335 362 336 336 376 324 324 363 336 336 364 348 348 377 349 349 378 336 336 364 349 349 378 337 337 365 337 337 365 349 349 378 350 350 379 337 337 365 350 350 379 338 338 366 338 338 366 350 350 379 351 351 380 338 338 366 351 351 380 339 339 367 339 339 367 351 351 380 352 352 381 339 339 367 352 352 381 340 340 368 340 340 368 352 352 381 353 353 382 340 340 368 353 353 382 341 341 369 341 341 369 353 353 382 354 354 383 341 341 369 354 354 383 342 342 370 342 342 370 354 354 383 355 355 384 342 342 370 355 355 384 343 343 371 343 343 371 355 355 384 356 356 385 343 343 371 356 356 385 344 344 372 344 344 372 356 356 385 357 357 386 344 344 372 357 357 386 345 345 373 345 345 373 357 357 386 358 358 387 345 345 373 358 358 387 346 346 374 346 346 374 358 358 387 359 359 388 346 346 374 359 359 388 347 347 375 347 347 375 359 359 388 348 348 389 347 347 375 348 348 389 336 336 376 348 348 377 360 360 390 361 361 391 348 348 377 361 361 391 349 349 378 349 349 378 361 361 391 362 362 392 349 349 378 362 362 392 350 350 379 350 350 379 362 362 392 363 363 393 350 350 379 363 363 393 351 351 380 351 351 380 363 363 393 364 364 394 351 351 380 364 364 394 352 352 381 352 352 381 364 364 394 365 365 395 352 352 381 365 365 395 353 353 382 353 353 382 365 365 395 366 366 396 353 353 382 366 366 396 354 354 383 354 354 383 366 366 396 367 367 397 354 354 383 367 367 397 355 355 384 355 355 384 367 367 397 368 368 398 355 355 384 368 368 398 356 356 385 356 356 385 368 368 398 369 369 399 356 356 385 369 369 399 357 357 386 357 357 386 369 369 399 370 370 400 357 357 386 370 370 400 358 358 387 358 358 387 370 370 400 371 371 401 358 358 387 371 371 401 359 359 388 359 359 388 371 371 401 360 360 402 359 359 388 360 360 402 348 348 389 360 360 390 372 372 403 373 373 404 360 360 390 373 373 404 361 361 391 361 361 391 373 373 404 374 374 405 361 361 391 374 374 405 362 362 392 362 362 392 374 374 405 375 375 406 362 362 392 375 375 406 363 363 393 363 363 393 375 375 406 376 376 407 363 363 393 376 376 407 364 364 394 364 364 394 376 376 407 377 377 408 364 364 394 377 377 408 365 365 395 365 365 395 377 377 408 378 378 409 365 365 395 378 378 409 366 366 396 366 366 396 378 378 409 379 379 410 366 366 396 379 379 410 367 367 397 367 367 397 379 379 410 380 380 411 367 367 397 380 380 411 368 368 398 368 368 398 380 380 411 381 381 412 368 368 398 381 381 412 369 369 399 369 369 399 381 381 412 382 382 413 369 369 399 382 382 413 370 370 400 370 370 400 382 382 413 383 383 414 370 370 400 383 383 414 371 371 401 371 371 401 383 383 414 372 372 415 371 371 401 372 372 415 360 360 402 372 372 403 384 384 416 385 385 417 372 372 403 385 385 417 373 373 404 373 373 404 385 385 417 386 386 418 373 373 404 386 386 418 374 374 405 374 374 405 386 386 418 387 387 419 374 374 405 387 387 419 375 375 406 375 375 406 387 387 419 388 388 420 375 375 406 388 388 420 376 376 407 376 376 407 388 388 420 389 389 421 376 376 407 389 389 421 377 377 408 377 377 408 389 389 421 390 390 422 377 377 408 390 390 422 378 378 409 378 378 409 390 390 422 391 391 423 378 378 409 391 391 423 379 379 410 379 379 410 391 391 423 392 392 424 379 379 410 392 392 424 380 380 411 380 380 411 392 392 424 393 393 425 380 380 411 393 393 425 381 381 412 381 381 412 393 393 425 394 394 426 381 381 412 394 394 426 382 382 413 382 382 413 394 394 426 395 395 427 382 382 413 395 395 427 383 383 414 383 383 414 395 395 427 384 384 428 383 383 414 384 384 428 372 372 415 384 384 416 396 396 429 397 397 430 384 384 416 397 397 430 385 385 417 385 385 417 397 397 430 398 398 431 385 385 417 398 398 431 386 386 418 386 386 418 398 398 431 399 399 432 386 386 418 399 399 432 387 387 419 387 387 419 399 399 432 400 400 433 387 387 419 400 400 433 388 388 420 388 388 420 400 400 433 401 401 434 388 388 420 401 401 434 389 389 421 389 389 421 401 401 434 402 402 435 389 389 421 402 402 435 390 390 422 390 390 422 402 402 435 403 403 436 390 390 422 403 403 436 391 391 423 391 391 423 403 403 436 404 404 437 391 391 423 404 404 437 392 392 424 392 392 424 404 404 437 405 405 438 392 392 424 405 405 438 393 393 425 393 393 425 405 405 438 406 406 439 393 393 425 406 406 439 394 394 426 394 394 426 406 406 439 407 407 440 394 394 426 407 407 440 395 395 427 395 395 427 407 407 440 396 396 441 395 395 427 396 396 441 384 384 428 396 396 429 408 408 442 409 409 443 396 396 429 409 409 443 397 397 430 397 397 430 409 409 443 410 410 444 397 397 430 410 410 444 398 398 431 398 398 431 410 410 444 411 411 445 398 398 431 411 411 445 399 399 432 399 399 432 411 411 445 412 412 446 399 399 432 412 412 446 400 400 433 400 400 433 412 412 446 413 413 447 400 400 433 413 413 447 401 401 434 401 401 434 413 413 447 414 414 448 401 401 434 414 414 448 402 402 435 402 402 435 414 414 448 415 415 449 402 402 435 415 415 449 403 403 436 403 403 436 415 415 449 416 416 450 403 403 436 416 416 450 404 404 437 404 404 437 416 416 450 417 417 451 404 404 437 417 417 451 405 405 438 405 405 438 417 417 451 418 418 452 405 405 438 418 418 452 406 406 439 406 406 439 418 418 452 419 419 453 406 406 439 419 419 453 407 407 440 407 407 440 419 419 453 408 408 454 407 407 440 408 408 454 396 396 441 408 408 442 420 420 455 421 421 456 408 408 442 421 421 456 409 409 443 409 409 443 421 421 456 422 422 457 409 409 443 422 422 457 410 410 444 410 410 444 422 422 457 423 423 458 410 410 444 423 423 458 411 411 445 411 411 445 423 423 458 424 424 459 411 411 445 424 424 459 412 412 446 412 412 446 424 424 459 425 425 460 412 412 446 425 425 460 413 413 447 413 413 447 425 425 460 426 426 461 413 413 447 426 426 461 414 414 448 414 414 448 426 426 461 427 427 462 414 414 448 427 427 462 415 415 449 415 415 449 427 427 462 428 428 463 415 415 449 428 428 463 416 416 450 416 416 450 428 428 463 429 429 464 416 416 450 429 429 464 417 417 451 417 417 451 429 429 464 430 430 465 417 417 451 430 430 465 418 418 452 418 418 452 430 430 465 431 431 466 418 418 452 431 431 466 419 419 453 419 419 453 431 431 466 420 420 467 419 419 453 420 420 467 408 408 454 420 420 455 432 432 468 433 433 469 420 420 455 433 433 469 421 421 456 421 421 456 433 433 469 434 434 470 421 421 456 434 434 470 422 422 457 422 422 457 434 434 470 435 435 471 422 422 457 435 435 471 423 423 458 423 423 458 435 435 471 436 436 472 423 423 458 436 436 472 424 424 459 424 424 459 436 436 472 437 437 473 424 424 459 437 437 473 425 425 460 425 425 460 437 437 473 438 438 474 425 425 460 438 438 474 426 426 461 426 426 461 438 438 474 439 439 475 426 426 461 439 439 475 427 427 462 427 427 462 439 439 475 440 440 476 427 427 462 440 440 476 428 428 463 428 428 463 440 440 476 441 441 477 428 428 463 441 441 477 429 429 464 429 429 464 441 441 477 442 442 478 429 429 464 442 442 478 430 430 465 430 430 465 442 442 478 443 443 479 430 430 465 443 443 479 431 431 466 431 431 466 443 443 479 432 432 480 431 431 466 432 432 480 420 420 467 432 432 468 444 444 481 445 445 482 432 432 468 445 445 482 433 433 469 433 433 469 445 445 482 446 446 483 433 433 469 446 446 483 434 434 470 434 434 470 446 446 483 447 447 484 434 434 470 447 447 484 435 435 471 435 435 471 447 447 484 448 448 485 435 435 471 448 448 485 436 436 472 436 436 472 448 448 485 449 449 486 436 436 472 449 449 486 437 437 473 437 437 473 449 449 486 450 450 487 437 437 473 450 450 487 438 438 474 438 438 474 450 450 487 451 451 488 438 438 474 451 451 488 439 439 475 439 439 475 451 451 488 452 452 489 439 439 475 452 452 489 440 440 476 440 440 476 452 452 489 453 453 490 440 440 476 453 453 490 441 441 477 441 441 477 453 453 490 454 454 491 441 441 477 454 454 491 442 442 478 442 442 478 454 454 491 455 455 492 442 442 478 455 455 492 443 443 479 443 443 479 455 455 492 444 444 493 443 443 479 444 444 493 432 432 480 444 444 481 456 456 494 457 457 495 444 444 481 457 457 495 445 445 482 445 445 482 457 457 495 458 458 496 445 445 482 458 458 496 446 446 483 446 446 483 458 458 496 459 459 497 446 446 483 459 459 497 447 447 484 447 447 484 459 459 497 460 460 498 447 447 484 460 460 498 448 448 485 448 448 485 460 460 498 461 461 499 448 448 485 461 461 499 449 449 486 449 449 486 461 461 499 462 462 500 449 449 486 462 462 500 450 450 487 450 450 487 462 462 500 463 463 501 450 450 487 463 463 501 451 451 488 451 451 488 463 463 501 464 464 502 451 451 488 464 464 502 452 452 489 452 452 489 464 464 502 465 465 503 452 452 489 465 465 503 453 453 490 453 453 490 465 465 503 466 466 504 453 453 490 466 466 504 454 454 491 454 454 491 466 466 504 467 467 505 454 454 491 467 467 505 455 455 492 455 455 492 467 467 505 456 456 506 455 455 492 456 456 506 444 444 493 456 456 494 468 468 507 469 469 508 456 456 494 469 469 508 457 457 495 457 457 495 469 469 508 470 470 509 457 457 495 470 470 509 458 458 496 458 458 496 470 470 509 471 471 510 458 458 496 471 471 510 459 459 497 459 459 497 471 471 510 472 472 511 459 459 497 472 472 511 460 460 498 460 460 498 472 472 511 473 473 512 460 460 498 473 473 512 461 461 499 461 461 499 473 473 512 474 474 513 461 461 499 474 474 513 462 462 500 462 462 500 474 474 513 475 475 514 462 462 500 475 475 514 463 463 501 463 463 501 475 475 514 476 476 515 463 463 501 476 476 515 464 464 502 464 464 502 476 476 515 477 477 516 464 464 502 477 477 516 465 465 503 465 465 503 477 477 516 478 478 517 465 465 503 478 478 517 466 466 504 466 466 504 478 478 517 479 479 518 466 466 504 479 479 518 467 467 505 467 467 505 479 479 518 468 468 519 467 467 505 468 468 519 456 456 506 468 468 507 480 480 520 481 481 521 468 468 507 481 481 521 469 469 508 469 469 508 481 481 521 482 482 522 469 469 508 482 482 522 470 470 509 470 470 509 482 482 522 483 483 523 470 470 509 483 483 523 471 471 510 471 471 510 483 483 523 484 484 524 471 471 510 484 484 524 472 472 511 472 472 511 484 484 524 485 485 525 472 472 511 485 485 525 473 473 512 473 473 512 485 485 525 486 486 526 473 473 512 486 486 526 474 474 513 474 474 513 486 486 526 487 487 527 474 474 513 487 487 527 475 475 514 475 475 514 487 487 527 488 488 528 475 475 514 488 488 528 476 476 515 476 476 515 488 488 528 489 489 529 476 476 515 489 489 529 477 477 516 477 477 516 489 489 529 490 490 530 477 477 516 490 490 530 478 478 517 478 478 517 490 490 530 491 491 531 478 478 517 491 491 531 479 479 518 479 479 518 491 491 531 480 480 532 479 479 518 480 480 532 468 468 519 480 480 520 492 492 533 493 493 534 480 480 520 493 493 534 481 481 521 481 481 521 493 493 534 494 494 535 481 481 521 494 494 535 482 482 522 482 482 522 494 494 535 495 495 536 482 482 522 495 495 536 483 483 523 483 483 523 495 495 536 496 496 537 483 483 523 496 496 537 484 484 524 484 484 524 496 496 537 497 497 538 484 484 524 497 497 538 485 485 525 485 485 525 497 497 538 498 498 539 485 485 525 498 498 539 486 486 526 486 486 526 498 498 539 499 499 540 486 486 526 499 499 540 487 487 527 487 487 527 499 499 540 500 500 541 487 487 527 500 500 541 488 488 528 488 488 528 500 500 541 501 501 542 488 488 528 501 501 542 489 489 529 489 489 529 501 501 542 502 502 543 489 489 529 502 502 543 490 490 530 490 490 530 502 502 543 503 503 544 490 490 530 503 503 544 491 491 531 491 491 531 503 503 544 492 492 545 491 491 531 492 492 545 480 480 532 492 492 533 504 504 546 505 505 547 492 492 533 505 505 547 493 493 534 493 493 534 505 505 547 506 506 548 493 493 534 506 506 548 494 494 535 494 494 535 506 506 548 507 507 549 494 494 535 507 507 549 495 495 536 495 495 536 507 507 549 508 508 550 495 495 536 508 508 550 496 496 537 496 496 537 508 508 550 509 509 551 496 496 537 509 509 551 497 497 538 497 497 538 509 509 551 510 510 552 497 497 538 510 510 552 498 498 539 498 498 539 510 510 552 511 511 553 498 498 539 511 511 553 499 499 540 499 499 540 511 511 553 512 512 554 499 499 540 512 512 554 500 500 541 500 500 541 512 512 554 513 513 555 500 500 541 513 513 555 501 501 542 501 501 542 513 513 555 514 514 556 501 501 542 514 514 556 502 502 543 502 502 543 514 514 556 515 515 557 502 502 543 515 515 557 503 503 544 503 503 544 515 515 557 504 504 558 503 503 544 504 504 558 492 492 545 504 504 546 516 516 559 517 517 560 504 504 546 517 517 560 505 505 547 505 505 547 517 517 560 518 518 561 505 505 547 518 518 561 506 506 548 506 506 548 518 518 561 519 519 562 506 506 548 519 519 562 507 507 549 507 507 549 519 519 562 520 520 563 507 507 549 520 520 563 508 508 550 508 508 550 520 520 563 521 521 564 508 508 550 521 521 564 509 509 551 509 509 551 521 521 564 522 522 565 509 509 551 522 522 565 510 510 552 510 510 552 522 522 565 523 523 566 510 510 552 523 523 566 511 511 553 511 511 553 523 523 566 524 524 567 511 511 553 524 524 567 512 512 554 512 512 554 524 524 567 525 525 568 512 512 554 525 525 568 513 513 555 513 513 555 525 525 568 526 526 569 513 513 555 526 526 569 514 514 556 514 514 556 526 526 569 527 527 570 514 514 556 527 527 570 515 515 557 515 515 557 527 527 570 516 516 571 515 515 557 516 516 571 504 504 558 516 516 559 528 528 572 529 529 573 516 516 559 529 529 573 517 517 560 517 517 560 529 529 573 530 530 574 517 517 560 530 530 574 518 518 561 518 518 561 530 530 574 531 531 575 518 518 561 531 531 575 519 519 562 519 519 562 531 531 575 532 532 576 519 519 562 532 532 576 520 520 563 520 520 563 532 532 576 533 533 577 520 520 563 533 533 577 521 521 564 521 521 564 533 533 577 534 534 578 521 521 564 534 534 578 522 522 565 522 522 565 534 534 578 535 535 579 522 522 565 535 535 579 523 523 566 523 523 566 535 535 579 536 536 580 523 523 566 536 536 580 524 524 567 524 524 567 536 536 580 537 537 581 524 524 567 537 537 581 525 525 568 525 525 568 537 537 581 538 538 582 525 525 568 538 538 582 526 526 569 526 526 569 538 538 582 539 539 583 526 526 569 539 539 583 527 527 570 527 527 570 539 539 583 528 528 584 527 527 570 528 528 584 516 516 571 528 528 572 540 540 585 541 541 586 528 528 572 541 541 586 529 529 573 529 529 573 541 541 586 542 542 587 529 529 573 542 542 587 530 530 574 530 530 574 542 542 587 543 543 588 530 530 574 543 543 588 531 531 575 531 531 575 543 543 588 544 544 589 531 531 575 544 544 589 532 532 576 532 532 576 544 544 589 545 545 590 532 532 576 545 545 590 533 533 577 533 533 577 545 545 590 546 546 591 533 533 577 546 546 591 534 534 578 534 534 578 546 546 591 547 547 592 534 534 578 547 547 592 535 535 579 535 535 579 547 547 592 548 548 593 535 535 579 548 548 593 536 536 580 536 536 580 548 548 593 549 549 594 536 536 580 549 549 594 537 537 581 537 537 581 549 549 594 550 550 595 537 537 581 550 550 595 538 538 582 538 538 582 550 550 595 551 551 596 538 538 582 551 551 596 539 539 583 539 539 583 551 551 596 540 540 597 539 539 583 540 540 597 528 528 584 540 540 585 552 552 598 553 553 599 540 540 585 553 553 599 541 541 586 541 541 586 553 553 599 554 554 600 541 541 586 554 554 600 542 542 587 542 542 587 554 554 600 555 555 601 542 542 587 555 555 601 543 543 588 543 543 588 555 555 601 556 556 602 543 543 588 556 556 602 544 544 589 544 544 589 556 556 602 557 557 603 544 544 589 557 557 603 545 545 590 545 545 590 557 557 603 558 558 604 545 545 590 558 558 604 546 546 591 546 546 591 558 558 604 559 559 605 546 546 591 559 559 605 547 547 592 547 547 592 559 559 605 560 560 606 547 547 592 560 560 606 548 548 593 548 548 593 560 560 606 561 561 607 548 548 593 561 561 607 549 549 594 549 549 594 561 561 607 562 562 608 549 549 594 562 562 608 550 550 595 550 550 595 562 562 608 563 563 609 550 550 595 563 563 609 551 551 596 551 551 596 563 563 609 552 552 610 551 551 596 552 552 610 540 540 597 552 552 598 564 564 611 565 565 612 552 552 598 565 565 612 553 553 599 553 553 599 565 565 612 566 566 613 553 553 599 566 566 613 554 554 600 554 554 600 566 566 613 567 567 614 554 554 600 567 567 614 555 555 601 555 555 601 567 567 614 568 568 615 555 555 601 568 568 615 556 556 602 556 556 602 568 568 615 569 569 616 556 556 602 569 569 616 557 557 603 557 557 603 569 569 616 570 570 617 557 557 603 570 570 617 558 558 604 558 558 604 570 570 617 571 571 618 558 558 604 571 571 618 559 559 605 559 559 605 571 571 618 572 572 619 559 559 605 572 572 619 560 560 606 560 560 606 572 572 619 573 573 620 560 560 606 573 573 620 561 561 607 561 561 607 573 573 620 574 574 621 561 561 607 574 574 621 562 562 608 562 562 608 574 574 621 575 575 622 562 562 608 575 575 622 563 563 609 563 563 609 575 575 622 564 564 623 563 563 609 564 564 623 552 552 610 564 564 611 576 576 624 577 577 625 564 564 611 577 577 625 565 565 612 565 565 612 577 577 625 578 578 626 565 565 612 578 578 626 566 566 613 566 566 613 578 578 626 579 579 627 566 566 613 579 579 627 567 567 614 567 567 614 579 579 627 580 580 628 567 567 614 580 580 628 568 568 615 568 568 615 580 580 628 581 581 629 568 568 615 581 581 629 569 569 616 569 569 616 581 581 629 582 582 630 569 569 616 582 582 630 570 570 617 570 570 617 582 582 630 583 583 631 570 570 617 583 583 631 571 571 618 571 571 618 583 583 631 584 584 632 571 571 618 584 584 632 572 572 619 572 572 619 584 584 632 585 585 633 572 572 619 585 585 633 573 573 620 573 573 620 585 585 633 586 586 634 573 573 620 586 586 634 574 574 621 574 574 621 586 586 634 587 587 635 574 574 621 587 587 635 575 575 622 575 575 622 587 587 635 576 576 636 575 575 622 576 576 636 564 564 623 576 576 624 588 588 637 589 589 638 576 576 624 589 589 638 577 577 625 577 577 625 589 589 638 590 590 639 577 577 625 590 590 639 578 578 626 578 578 626 590 590 639 591 591 640 578 578 626 591 591 640 579 579 627 579 579 627 591 591 640 592 592 641 579 579 627 592 592 641 580 580 628 580 580 628 592 592 641 593 593 642 580 580 628 593 593 642 581 581 629 581 581 629 593 593 642 594 594 643 581 581 629 594 594 643 582 582 630 582 582 630 594 594 643 595 595 644 582 582 630 595 595 644 583 583 631 583 583 631 595 595 644 596 596 645 583 583 631 596 596 645 584 584 632 584 584 632 596 596 645 597 597 646 584 584 632 597 597 646 585 585 633 585 585 633 597 597 646 598 598 647 585 585 633 598 598 647 586 586 634 586 586 634 598 598 647 599 599 648 586 586 634 599 599 648 587 587 635 587 587 635 599 599 648 588 588 649 587 587 635 588 588 649 576 576 636 588 588 637 600 600 650 601 601 651 588 588 637 601 601 651 589 589 638 589 589 638 601 601 651 602 602 652 589 589 638 602 602 652 590 590 639 590 590 639 602 602 652 603 603 653 590 590 639 603 603 653 591 591 640 591 591 640 603 603 653 604 604 654 591 591 640 604 604 654 592 592 641 592 592 641 604 604 654 605 605 655 592 592 641 605 605 655 593 593 642 593 593 642 605 605 655 606 606 656 593 593 642 606 606 656 594 594 643 594 594 643 606 606 656 607 607 657 594 594 643 607 607 657 595 595 644 595 595 644 607 607 657 608 608 658 595 595 644 608 608 658 596 596 645 596 596 645 608 608 658 609 609 659 596 596 645 609 609 659 597 597 646 597 597 646 609 609 659 610 610 660 597 597 646 610 610 660 598 598 647 598 598 647 610 610 660 611 611 661 598 598 647 611 611 661 599 599 648 599 599 648 611 611 661 600 600 662 599 599 648 600 600 662 588 588 649 600 600 650 612 612 663 613 613 664 600 600 650 613 613 664 601 601 651 601 601 651 613 613 664 614 614 665 601 601 651 614 614 665 602 602 652 602 602 652 614 614 665 615 615 666 602 602 652 615 615 666 603 603 653 603 603 653 615 615 666 616 616 667 603 603 653 616 616 667 604 604 654 604 604 654 616 616 667 617 617 668 604 604 654 617 617 668 605 605 655 605 605 655 617 617 668 618 618 669 605 605 655 618 618 669 606 606 656 606 606 656 618 618 669 619 619 670 606 606 656 619 619 670 607 607 657 607 607 657 619 619 670 620 620 671 607 607 657 620 620 671 608 608 658 608 608 658 620 620 671 621 621 672 608 608 658 621 621 672 609 609 659 609 609 659 621 621 672 622 622 673 609 609 659 622 622 673 610 610 660 610 610 660 622 622 673 623 623 674 610 610 660 623 623 674 611 611 661 611 611 661 623 623 674 612 612 675 611 611 661 612 612 675 600 600 662 612 612 663 624 624 676 625 625 677 612 612 663 625 625 677 613 613 664 613 613 664 625 625 677 626 626 678 613 613 664 626 626 678 614 614 665 614 614 665 626 626 678 627 627 679 614 614 665 627 627 679 615 615 666 615 615 666 627 627 679 628 628 680 615 615 666 628 628 680 616 616 667 616 616 667 628 628 680 629 629 681 616 616 667 629 629 681 617 617 668 617 617 668 629 629 681 630 630 682 617 617 668 630 630 682 618 618 669 618 618 669 630 630 682 631 631 683 618 618 669 631 631 683 619 619 670 619 619 670 631 631 683 632 632 684 619 619 670 632 632 684 620 620 671 620 620 671 632 632 684 633 633 685 620 620 671 633 633 685 621 621 672 621 621 672 633 633 685 634 634 686 621 621 672 634 634 686 622 622 673 622 622 673 634 634 686 635 635 687 622 622 673 635 635 687 623 623 674 623 623 674 635 635 687 624 624 688 623 623 674 624 624 688 612 612 675 624 624 676 636 636 689 637 637 690 624 624 676 637 637 690 625 625 677 625 625 677 637 637 690 638 638 691 625 625 677 638 638 691 626 626 678 626 626 678 638 638 691 639 639 692 626 626 678 639 639 692 627 627 679 627 627 679 639 639 692 640 640 693 627 627 679 640 640 693 628 628 680 628 628 680 640 640 693 641 641 694 628 628 680 641 641 694 629 629 681 629 629 681 641 641 694 642 642 695 629 629 681 642 642 695 630 630 682 630 630 682 642 642 695 643 643 696 630 630 682 643 643 696 631 631 683 631 631 683 643 643 696 644 644 697 631 631 683 644 644 697 632 632 684 632 632 684 644 644 697 645 645 698 632 632 684 645 645 698 633 633 685 633 633 685 645 645 698 646 646 699 633 633 685 646 646 699 634 634 686 634 634 686 646 646 699 647 647 700 634 634 686 647 647 700 635 635 687 635 635 687 647 647 700 636 636 701 635 635 687 636 636 701 624 624 688 636 636 689 648 648 702 649 649 703 636 636 689 649 649 703 637 637 690 637 637 690 649 649 703 650 650 704 637 637 690 650 650 704 638 638 691 638 638 691 650 650 704 651 651 705 638 638 691 651 651 705 639 639 692 639 639 692 651 651 705 652 652 706 639 639 692 652 652 706 640 640 693 640 640 693 652 652 706 653 653 707 640 640 693 653 653 707 641 641 694 641 641 694 653 653 707 654 654 708 641 641 694 654 654 708 642 642 695 642 642 695 654 654 708 655 655 709 642 642 695 655 655 709 643 643 696 643 643 696 655 655 709 656 656 710 643 643 696 656 656 710 644 644 697 644 644 697 656 656 710 657 657 711 644 644 697 657 657 711 645 645 698 645 645 698 657 657 711 658 658 712 645 645 698 658 658 712 646 646 699 646 646 699 658 658 712 659 659 713 646 646 699 659 659 713 647 647 700 647 647 700 659 659 713 648 648 714 647 647 700 648 648 714 636 636 701 648 648 702 660 660 715 661 661 716 648 648 702 661 661 716 649 649 703 649 649 703 661 661 716 662 662 717 649 649 703 662 662 717 650 650 704 650 650 704 662 662 717 663 663 718 650 650 704 663 663 718 651 651 705 651 651 705 663 663 718 664 664 719 651 651 705 664 664 719 652 652 706 652 652 706 664 664 719 665 665 720 652 652 706 665 665 720 653 653 707 653 653 707 665 665 720 666 666 721 653 653 707 666 666 721 654 654 708 654 654 708 666 666 721 667 667 722 654 654 708 667 667 722 655 655 709 655 655 709 667 667 722 668 668 723 655 655 709 668 668 723 656 656 710 656 656 710 668 668 723 669 669 724 656 656 710 669 669 724 657 657 711 657 657 711 669 669 724 670 670 725 657 657 711 670 670 725 658 658 712 658 658 712 670 670 725 671 671 726 658 658 712 671 671 726 659 659 713 659 659 713 671 671 726 660 660 727 659 659 713 660 660 727 648 648 714 660 660 715 672 672 728 673 673 729 660 660 715 673 673 729 661 661 716 661 661 716 673 673 729 674 674 730 661 661 716 674 674 730 662 662 717 662 662 717 674 674 730 675 675 731 662 662 717 675 675 731 663 663 718 663 663 718 675 675 731 676 676 732 663 663 718 676 676 732 664 664 719 664 664 719 676 676 732 677 677 733 664 664 719 677 677 733 665 665 720 665 665 720 677 677 733 678 678 734 665 665 720 678 678 734 666 666 721 666 666 721 678 678 734 679 679 735 666 666 721 679 679 735 667 667 722 667 667 722 679 679 735 680 680 736 667 667 722 680 680 736 668 668 723 668 668 723 680 680 736 681 681 737 668 668 723 681 681 737 669 669 724 669 669 724 681 681 737 682 682 738 669 669 724 682 682 738 670 670 725 670 670 725 682 682 738 683 683 739 670 670 725 683 683 739 671 671 726 671 671 726 683 683 739 672 672 740 671 671 726 672 672 740 660 660 727 672 672 728 684 684 741 685 685 742 672 672 728 685 685 742 673 673 729 673 673 729 685 685 742 686 686 743 673 673 729 686 686 743 674 674 730 674 674 730 686 686 743 687 687 744 674 674 730 687 687 744 675 675 731 675 675 731 687 687 744 688 688 745 675 675 731 688 688 745 676 676 732 676 676 732 688 688 745 689 689 746 676 676 732 689 689 746 677 677 733 677 677 733 689 689 746 690 690 747 677 677 733 690 690 747 678 678 734 678 678 734 690 690 747 691 691 748 678 678 734 691 691 748 679 679 735 679 679 735 691 691 748 692 692 749 679 679 735 692 692 749 680 680 736 680 680 736 692 692 749 693 693 750 680 680 736 693 693 750 681 681 737 681 681 737 693 693 750 694 694 751 681 681 737 694 694 751 682 682 738 682 682 738 694 694 751 695 695 752 682 682 738 695 695 752 683 683 739 683 683 739 695 695 752 684 684 753 683 683 739 684 684 753 672 672 740 684 684 741 696 696 754 697 697 755 684 684 741 697 697 755 685 685 742 685 685 742 697 697 755 698 698 756 685 685 742 698 698 756 686 686 743 686 686 743 698 698 756 699 699 757 686 686 743 699 699 757 687 687 744 687 687 744 699 699 757 700 700 758 687 687 744 700 700 758 688 688 745 688 688 745 700 700 758 701 701 759 688 688 745 701 701 759 689 689 746 689 689 746 701 701 759 702 702 760 689 689 746 702 702 760 690 690 747 690 690 747 702 702 760 703 703 761 690 690 747 703 703 761 691 691 748 691 691 748 703 703 761 704 704 762 691 691 748 704 704 762 692 692 749 692 692 749 704 704 762 705 705 763 692 692 749 705 705 763 693 693 750 693 693 750 705 705 763 706 706 764 693 693 750 706 706 764 694 694 751 694 694 751 706 706 764 707 707 765 694 694 751 707 707 765 695 695 752 695 695 752 707 707 765 696 696 766 695 695 752 696 696 766 684 684 753 696 696 754 708 708 767 709 709 768 696 696 754 709 709 768 697 697 755 697 697 755 709 709 768 710 710 769 697 697 755 710 710 769 698 698 756 698 698 756 710 710 769 711 711 770 698 698 756 711 711 770 699 699 757 699 699 757 711 711 770 712 712 771 699 699 757 712 712 771 700 700 758 700 700 758 712 712 771 713 713 772 700 700 758 713 713 772 701 701 759 701 701 759 713 713 772 714 714 773 701 701 759 714 714 773 702 702 760 702 702 760 714 714 773 715 715 774 702 702 760 715 715 774 703 703 761 703 703 761 715 715 774 716 716 775 703 703 761 716 716 775 704 704 762 704 704 762 716 716 775 717 717 776 704 704 762 717 717 776 705 705 763 705 705 763 717 717 776 718 718 777 705 705 763 718 718 777 706 706 764 706 706 764 718 718 777 719 719 778 706 706 764 719 719 778 707 707 765 707 707 765 719 719 778 708 708 779 707 707 765 708 708 779 696 696 766 708 708 767 720 720 780 721 721 781 708 708 767 721 721 781 709 709 768 709 709 768 721 721 781 722 722 782 709 709 768 722 722 782 710 710 769 710 710 769 722 722 782 723 723 783 710 710 769 723 723 783 711 711 770 711 711 770 723 723 783 724 724 784 711 711 770 724 724 784 712 712 771 712 712 771 724 724 784 725 725 785 712 712 771 725 725 785 713 713 772 713 713 772 725 725 785 726 726 786 713 713 772 726 726 786 714 714 773 714 714 773 726 726 786 727 727 787 714 714 773 727 727 787 715 715 774 715 715 774 727 727 787 728 728 788 715 715 774 728 728 788 716 716 775 716 716 775 728 728 788 729 729 789 716 716 775 729 729 789 717 717 776 717 717 776 729 729 789 730 730 790 717 717 776 730 730 790 718 718 777 718 718 777 730 730 790 731 731 791 718 718 777 731 731 791 719 719 778 719 719 778 731 731 791 720 720 792 719 719 778 720 720 792 708 708 779 720 720 780 732 732 793 733 733 794 720 720 780 733 733 794 721 721 781 721 721 781 733 733 794 734 734 795 721 721 781 734 734 795 722 722 782 722 722 782 734 734 795 735 735 796 722 722 782 735 735 796 723 723 783 723 723 783 735 735 796 736 736 797 723 723 783 736 736 797 724 724 784 724 724 784 736 736 797 737 737 798 724 724 784 737 737 798 725 725 785 725 725 785 737 737 798 738 738 799 725 725 785 738 738 799 726 726 786 726 726 786 738 738 799 739 739 800 726 726 786 739 739 800 727 727 787 727 727 787 739 739 800 740 740 801 727 727 787 740 740 801 728 728 788 728 728 788 740 740 801 741 741 802 728 728 788 741 741 802 729 729 789 729 729 789 741 741 802 742 742 803 729 729 789 742 742 803 730 730 790 730 730 790 742 742 803 743 743 804 730 730 790 743 743 804 731 731 791 731 731 791 743 743 804 732 732 805 731 731 791 732 732 805 720 720 792 732 732 793 744 744 806 745 745 807 732 732 793 745 745 807 733 733 794 733 733 794 745 745 807 746 746 808 733 733 794 746 746 808 734 734 795 734 734 795 746 746 808 747 747 809 734 734 795 747 747 809 735 735 796 735 735 796 747 747 809 748 748 810 735 735 796 748 748 810 736 736 797 736 736 797 748 748 810 749 749 811 736 736 797 749 749 811 737 737 798 737 737 798 749 749 811 750 750 812 737 737 798 750 750 812 738 738 799 738 738 799 750 750 812 751 751 813 738 738 799 751 751 813 739 739 800 739 739 800 751 751 813 752 752 814 739 739 800 752 752 814 740 740 801 740 740 801 752 752 814 753 753 815 740 740 801 753 753 815 741 741 802 741 741 802 753 753 815 754 754 816 741 741 802 754 754 816 742 742 803 742 742 803 754 754 816 755 755 817 742 742 803 755 755 817 743 743 804 743 743 804 755 755 817 744 744 818 743 743 804 744 744 818 732 732 805 744 744 806 756 756 819 757 757 820 744 744 806 757 757 820 745 745 807 745 745 807 757 757 820 758 758 821 745 745 807 758 758 821 746 746 808 746 746 808 758 758 821 759 759 822 746 746 808 759 759 822 747 747 809 747 747 809 759 759 822 760 760 823 747 747 809 760 760 823 748 748 810 748 748 810 760 760 823 761 761 824 748 748 810 761 761 824 749 749 811 749 749 811 761 761 824 762 762 825 749 749 811 762 762 825 750 750 812 750 750 812 762 762 825 763 763 826 750 750 812 763 763 826 751 751 813 751 751 813 763 763 826 764 764 827 751 751 813 764 764 827 752 752 814 752 752 814 764 764 827 765 765 828 752 752 814 765 765 828 753 753 815 753 753 815 765 765 828 766 766 829 753 753 815 766 766 829 754 754 816 754 754 816 766 766 829 767 767 830 754 754 816 767 767 830 755 755 817 755 755 817 767 767 830 756 756 831 755 755 817 756 756 831 744 744 818 756 756 819 768 768 832 769 769 833 756 756 819 769 769 833 757 757 820 757 757 820 769 769 833 770 770 834 757 757 820 770 770 834 758 758 821 758 758 821 770 770 834 771 771 835 758 758 821 771 771 835 759 759 822 759 759 822 771 771 835 772 772 836 759 759 822 772 772 836 760 760 823 760 760 823 772 772 836 773 773 837 760 760 823 773 773 837 761 761 824 761 761 824 773 773 837 774 774 838 761 761 824 774 774 838 762 762 825 762 762 825 774 774 838 775 775 839 762 762 825 775 775 839 763 763 826 763 763 826 775 775 839 776 776 840 763 763 826 776 776 840 764 764 827 764 764 827 776 776 840 777 777 841 764 764 827 777 777 841 765 765 828 765 765 828 777 777 841 778 778 842 765 765 828 778 778 842 766 766 829 766 766 829 778 778 842 779 779 843 766 766 829 779 779 843 767 767 830 767 767 830 779 779 843 768 768 844 767 767 830 768 768 844 756 756 831 768 768 832 780 780 845 781 781 846 768 768 832 781 781 846 769 769 833 769 769 833 781 781 846 782 782 847 769 769 833 782 782 847 770 770 834 770 770 834 782 782 847 783 783 848 770 770 834 783 783 848 771 771 835 771 771 835 783 783 848 784 784 849 771 771 835 784 784 849 772 772 836 772 772 836 784 784 849 785 785 850 772 772 836 785 785 850 773 773 837 773 773 837 785 785 850 786 786 851 773 773 837 786 786 851 774 774 838 774 774 838 786 786 851 787 787 852 774 774 838 787 787 852 775 775 839 775 775 839 787 787 852 788 788 853 775 775 839 788 788 853 776 776 840 776 776 840 788 788 853 789 789 854 776 776 840 789 789 854 777 777 841 777 777 841 789 789 854 790 790 855 777 777 841 790 790 855 778 778 842 778 778 842 790 790 855 791 791 856 778 778 842 791 791 856 779 779 843 779 779 843 791 791 856 780 780 857 779 779 843 780 780 857 768 768 844 780 780 845 792 792 858 793 793 859 780 780 845 793 793 859 781 781 846 781 781 846 793 793 859 794 794 860 781 781 846 794 794 860 782 782 847 782 782 847 794 794 860 795 795 861 782 782 847 795 795 861 783 783 848 783 783 848 795 795 861 796 796 862 783 783 848 796 796 862 784 784 849 784 784 849 796 796 862 797 797 863 784 784 849 797 797 863 785 785 850 785 785 850 797 797 863 798 798 864 785 785 850 798 798 864 786 786 851 786 786 851 798 798 864 799 799 865 786 786 851 799 799 865 787 787 852 787 787 852 799 799 865 800 800 866 787 787 852 800 800 866 788 788 853 788 788 853 800 800 866 801 801 867 788 788 853 801 801 867 789 789 854 789 789 854 801 801 867 802 802 868 789 789 854 802 802 868 790 790 855 790 790 855 802 802 868 803 803 869 790 790 855 803 803 869 791 791 856 791 791 856 803 803 869 792 792 870 791 791 856 792 792 870 780 780 857 792 792 858 804 804 871 805 805 872 792 792 858 805 805 872 793 793 859 793 793 859 805 805 872 806 806 873 793 793 859 806 806 873 794 794 860 794 794 860 806 806 873 807 807 874 794 794 860 807 807 874 795 795 861 795 795 861 807 807 874 808 808 875 795 795 861 808 808 875 796 796 862 796 796 862 808 808 875 809 809 876 796 796 862 809 809 876 797 797 863 797 797 863 809 809 876 810 810 877 797 797 863 810 810 877 798 798 864 798 798 864 810 810 877 811 811 878 798 798 864 811 811 878 799 799 865 799 799 865 811 811 878 812 812 879 799 799 865 812 812 879 800 800 866 800 800 866 812 812 879 813 813 880 800 800 866 813 813 880 801 801 867 801 801 867 813 813 880 814 814 881 801 801 867 814 814 881 802 802 868 802 802 868 814 814 881 815 815 882 802 802 868 815 815 882 803 803 869 803 803 869 815 815 882 804 804 883 803 803 869 804 804 883 792 792 870 804 804 871 816 816 884 817 817 885 804 804 871 817 817 885 805 805 872 805 805 872 817 817 885 818 818 886 805 805 872 818 818 886 806 806 873 806 806 873 818 818 886 819 819 887 806 806 873 819 819 887 807 807 874 807 807 874 819 819 887 820 820 888 807 807 874 820 820 888 808 808 875 808 808 875 820 820 888 821 821 889 808 808 875 821 821 889 809 809 876 809 809 876 821 821 889 822 822 890 809 809 876 822 822 890 810 810 877 810 810 877 822 822 890 823 823 891 810 810 877 823 823 891 811 811 878 811 811 878 823 823 891 824 824 892 811 811 878 824 824 892 812 812 879 812 812 879 824 824 892 825 825 893 812 812 879 825 825 893 813 813 880 813 813 880 825 825 893 826 826 894 813 813 880 826 826 894 814 814 881 814 814 881 826 826 894 827 827 895 814 814 881 827 827 895 815 815 882 815 815 882 827 827 895 816 816 896 815 815 882 816 816 896 804 804 883 816 816 884 828 828 897 829 829 898 816 816 884 829 829 898 817 817 885 817 817 885 829 829 898 830 830 899 817 817 885 830 830 899 818 818 886 818 818 886 830 830 899 831 831 900 818 818 886 831 831 900 819 819 887 819 819 887 831 831 900 832 832 901 819 819 887 832 832 901 820 820 888 820 820 888 832 832 901 833 833 902 820 820 888 833 833 902 821 821 889 821 821 889 833 833 902 834 834 903 821 821 889 834 834 903 822 822 890 822 822 890 834 834 903 835 835 904 822 822 890 835 835 904 823 823 891 823 823 891 835 835 904 836 836 905 823 823 891 836 836 905 824 824 892 824 824 892 836 836 905 837 837 906 824 824 892 837 837 906 825 825 893 825 825 893 837 837 906 838 838 907 825 825 893 838 838 907 826 826 894 826 826 894 838 838 907 839 839 908 826 826 894 839 839 908 827 827 895 827 827 895 839 839 908 828 828 909 827 827 895 828 828 909 816 816 896 828 828 897 840 840 910 841 841 911 828 828 897 841 841 911 829 829 898 829 829 898 841 841 911 842 842 912 829 829 898 842 842 912 830 830 899 830 830 899 842 842 912 843 843 913 830 830 899 843 843 913 831 831 900 831 831 900 843 843 913 844 844 914 831 831 900 844 844 914 832 832 901 832 832 901 844 844 914 845 845 915 832 832 901 845 845 915 833 833 902 833 833 902 845 845 915 846 846 916 833 833 902 846 846 916 834 834 903 834 834 903 846 846 916 847 847 917 834 834 903 847 847 917 835 835 904 835 835 904 847 847 917 848 848 918 835 835 904 848 848 918 836 836 905 836 836 905 848 848 918 849 849 919 836 836 905 849 849 919 837 837 906 837 837 906 849 849 919 850 850 920 837 837 906 850 850 920 838 838 907 838 838 907 850 850 920 851 851 921 838 838 907 851 851 921 839 839 908 839 839 908 851 851 921 840 840 922 839 839 908 840 840 922 828 828 909 840 840 910 852 852 923 853 853 924 840 840 910 853 853 924 841 841 911 841 841 911 853 853 924 854 854 925 841 841 911 854 854 925 842 842 912 842 842 912 854 854 925 855 855 926 842 842 912 855 855 926 843 843 913 843 843 913 855 855 926 856 856 927 843 843 913 856 856 927 844 844 914 844 844 914 856 856 927 857 857 928 844 844 914 857 857 928 845 845 915 845 845 915 857 857 928 858 858 929 845 845 915 858 858 929 846 846 916 846 846 916 858 858 929 859 859 930 846 846 916 859 859 930 847 847 917 847 847 917 859 859 930 860 860 931 847 847 917 860 860 931 848 848 918 848 848 918 860 860 931 861 861 932 848 848 918 861 861 932 849 849 919 849 849 919 861 861 932 862 862 933 849 849 919 862 862 933 850 850 920 850 850 920 862 862 933 863 863 934 850 850 920 863 863 934 851 851 921 851 851 921 863 863 934 852 852 935 851 851 921 852 852 935 840 840 922 852 852 923 864 864 936 865 865 937 852 852 923 865 865 937 853 853 924 853 853 924 865 865 937 866 866 938 853 853 924 866 866 938 854 854 925 854 854 925 866 866 938 867 867 939 854 854 925 867 867 939 855 855 926 855 855 926 867 867 939 868 868 940 855 855 926 868 868 940 856 856 927 856 856 927 868 868 940 869 869 941 856 856 927 869 869 941 857 857 928 857 857 928 869 869 941 870 870 942 857 857 928 870 870 942 858 858 929 858 858 929 870 870 942 871 871 943 858 858 929 871 871 943 859 859 930 859 859 930 871 871 943 872 872 944 859 859 930 872 872 944 860 860 931 860 860 931 872 872 944 873 873 945 860 860 931 873 873 945 861 861 932 861 861 932 873 873 945 874 874 946 861 861 932 874 874 946 862 862 933 862 862 933 874 874 946 875 875 947 862 862 933 875 875 947 863 863 934 863 863 934 875 875 947 864 864 948 863 863 934 864 864 948 852 852 935 864 864 936 876 876 949 877 877 950 864 864 936 877 877 950 865 865 937 865 865 937 877 877 950 878 878 951 865 865 937 878 878 951 866 866 938 866 866 938 878 878 951 879 879 952 866 866 938 879 879 952 867 867 939 867 867 939 879 879 952 880 880 953 867 867 939 880 880 953 868 868 940 868 868 940 880 880 953 881 881 954 868 868 940 881 881 954 869 869 941 869 869 941 881 881 954 882 882 955 869 869 941 882 882 955 870 870 942 870 870 942 882 882 955 883 883 956 870 870 942 883 883 956 871 871 943 871 871 943 883 883 956 884 884 957 871 871 943 884 884 957 872 872 944 872 872 944 884 884 957 885 885 958 872 872 944 885 885 958 873 873 945 873 873 945 885 885 958 886 886 959 873 873 945 886 886 959 874 874 946 874 874 946 886 886 959 887 887 960 874 874 946 887 887 960 875 875 947 875 875 947 887 887 960 876 876 961 875 875 947 876 876 961 864 864 948 876 876 949 888 888 962 889 889 963 876 876 949 889 889 963 877 877 950 877 877 950 889 889 963 890 890 964 877 877 950 890 890 964 878 878 951 878 878 951 890 890 964 891 891 965 878 878 951 891 891 965 879 879 952 879 879 952 891 891 965 892 892 966 879 879 952 892 892 966 880 880 953 880 880 953 892 892 966 893 893 967 880 880 953 893 893 967 881 881 954 881 881 954 893 893 967 894 894 968 881 881 954 894 894 968 882 882 955 882 882 955 894 894 968 895 895 969 882 882 955 895 895 969 883 883 956 883 883 956 895 895 969 896 896 970 883 883 956 896 896 970 884 884 957 884 884 957 896 896 970 897 897 971 884 884 957 897 897 971 885 885 958 885 885 958 897 897 971 898 898 972 885 885 958 898 898 972 886 886 959 886 886 959 898 898 972 899 899 973 886 886 959 899 899 973 887 887 960 887 887 960 899 899 973 888 888 974 887 887 960 888 888 974 876 876 961 888 888 962 900 900 975 901 901 976 888 888 962 901 901 976 889 889 963 889 889 963 901 901 976 902 902 977 889 889 963 902 902 977 890 890 964 890 890 964 902 902 977 903 903 978 890 890 964 903 903 978 891 891 965 891 891 965 903 903 978 904 904 979 891 891 965 904 904 979 892 892 966 892 892 966 904 904 979 905 905 980 892 892 966 905 905 980 893 893 967 893 893 967 905 905 980 906 906 981 893 893 967 906 906 981 894 894 968 894 894 968 906 906 981 907 907 982 894 894 968 907 907 982 895 895 969 895 895 969 907 907 982 908 908 983 895 895 969 908 908 983 896 896 970 896 896 970 908 908 983 909 909 984 896 896 970 909 909 984 897 897 971 897 897 971 909 909 984 910 910 985 897 897 971 910 910 985 898 898 972 898 898 972 910 910 985 911 911 986 898 898 972 911 911 986 899 899 973 899 899 973 911 911 986 900 900 987 899 899 973 900 900 987 888 888 974 900 900 975 912 912 988 913 913 989 900 900 975 913 913 989 901 901 976 901 901 976 913 913 989 914 914 990 901 901 976 914 914 990 902 902 977 902 902 977 914 914 990 915 915 991 902 902 977 915 915 991 903 903 978 903 903 978 915 915 991 916 916 992 903 903 978 916 916 992 904 904 979 904 904 979 916 916 992 917 917 993 904 904 979 917 917 993 905 905 980 905 905 980 917 917 993 918 918 994 905 905 980 918 918 994 906 906 981 906 906 981 918 918 994 919 919 995 906 906 981 919 919 995 907 907 982 907 907 982 919 919 995 920 920 996 907 907 982 920 920 996 908 908 983 908 908 983 920 920 996 921 921 997 908 908 983 921 921 997 909 909 984 909 909 984 921 921 997 922 922 998 909 909 984 922 922 998 910 910 985 910 910 985 922 922 998 923 923 999 910 910 985 923 923 999 911 911 986 911 911 986 923 923 999 912 912 1000 911 911 986 912 912 1000 900 900 987 912 912 988 924 924 1001 925 925 1002 912 912 988 925 925 1002 913 913 989 913 913 989 925 925 1002 926 926 1003 913 913 989 926 926 1003 914 914 990 914 914 990 926 926 1003 927 927 1004 914 914 990 927 927 1004 915 915 991 915 915 991 927 927 1004 928 928 1005 915 915 991 928 928 1005 916 916 992 916 916 992 928 928 1005 929 929 1006 916 916 992 929 929 1006 917 917 993 917 917 993 929 929 1006 930 930 1007 917 917 993 930 930 1007 918 918 994 918 918 994 930 930 1007 931 931 1008 918 918 994 931 931 1008 919 919 995 919 919 995 931 931 1008 932 932 1009 919 919 995 932 932 1009 920 920 996 920 920 996 932 932 1009 933 933 1010 920 920 996 933 933 1010 921 921 997 921 921 997 933 933 1010 934 934 1011 921 921 997 934 934 1011 922 922 998 922 922 998 934 934 1011 935 935 1012 922 922 998 935 935 1012 923 923 999 923 923 999 935 935 1012 924 924 1013 923 923 999 924 924 1013 912 912 1000 924 924 1001 936 936 1014 937 937 1015 924 924 1001 937 937 1015 925 925 1002 925 925 1002 937 937 1015 938 938 1016 925 925 1002 938 938 1016 926 926 1003 926 926 1003 938 938 1016 939 939 1017 926 926 1003 939 939 1017 927 927 1004 927 927 1004 939 939 1017 940 940 1018 927 927 1004 940 940 1018 928 928 1005 928 928 1005 940 940 1018 941 941 1019 928 928 1005 941 941 1019 929 929 1006 929 929 1006 941 941 1019 942 942 1020 929 929 1006 942 942 1020 930 930 1007 930 930 1007 942 942 1020 943 943 1021 930 930 1007 943 943 1021 931 931 1008 931 931 1008 943 943 1021 944 944 1022 931 931 1008 944 944 1022 932 932 1009 932 932 1009 944 944 1022 945 945 1023 932 932 1009 945 945 1023 933 933 1010 933 933 1010 945 945 1023 946 946 1024 933 933 1010 946 946 1024 934 934 1011 934 934 1011 946 946 1024 947 947 1025 934 934 1011 947 947 1025 935 935 1012 935 935 1012 947 947 1025 936 936 1026 935 935 1012 936 936 1026 924 924 1013 936 936 1014 948 948 1027 949 949 1028 936 936 1014 949 949 1028 937 937 1015 937 937 1015 949 949 1028 950 950 1029 937 937 1015 950 950 1029 938 938 1016 938 938 1016 950 950 1029 951 951 1030 938 938 1016 951 951 1030 939 939 1017 939 939 1017 951 951 1030 952 952 1031 939 939 1017 952 952 1031 940 940 1018 940 940 1018 952 952 1031 953 953 1032 940 940 1018 953 953 1032 941 941 1019 941 941 1019 953 953 1032 954 954 1033 941 941 1019 954 954 1033 942 942 1020 942 942 1020 954 954 1033 955 955 1034 942 942 1020 955 955 1034 943 943 1021 943 943 1021 955 955 1034 956 956 1035 943 943 1021 956 956 1035 944 944 1022 944 944 1022 956 956 1035 957 957 1036 944 944 1022 957 957 1036 945 945 1023 945 945 1023 957 957 1036 958 958 1037 945 945 1023 958 958 1037 946 946 1024 946 946 1024 958 958 1037 959 959 1038 946 946 1024 959 959 1038 947 947 1025 947 947 1025 959 959 1038 948 948 1039 947 947 1025 948 948 1039 936 936 1026 948 948 1027 960 960 1040 961 961 1041 948 948 1027 961 961 1041 949 949 1028 949 949 1028 961 961 1041 962 962 1042 949 949 1028 962 962 1042 950 950 1029 950 950 1029 962 962 1042 963 963 1043 950 950 1029 963 963 1043 951 951 1030 951 951 1030 963 963 1043 964 964 1044 951 951 1030 964 964 1044 952 952 1031 952 952 1031 964 964 1044 965 965 1045 952 952 1031 965 965 1045 953 953 1032 953 953 1032 965 965 1045 966 966 1046 953 953 1032 966 966 1046 954 954 1033 954 954 1033 966 966 1046 967 967 1047 954 954 1033 967 967 1047 955 955 1034 955 955 1034 967 967 1047 968 968 1048 955 955 1034 968 968 1048 956 956 1035 956 956 1035 968 968 1048 969 969 1049 956 956 1035 969 969 1049 957 957 1036 957 957 1036 969 969 1049 970 970 1050 957 957 1036 970 970 1050 958 958 1037 958 958 1037 970 970 1050 971 971 1051 958 958 1037 971 971 1051 959 959 1038 959 959 1038 971 971 1051 960 960 1052 959 959 1038 960 960 1052 948 948 1039 960 960 1040 972 972 1053 973 973 1054 960 960 1040 973 973 1054 961 961 1041 961 961 1041 973 973 1054 974 974 1055 961 961 1041 974 974 1055 962 962 1042 962 962 1042 974 974 1055 975 975 1056 962 962 1042 975 975 1056 963 963 1043 963 963 1043 975 975 1056 976 976 1057 963 963 1043 976 976 1057 964 964 1044 964 964 1044 976 976 1057 977 977 1058 964 964 1044 977 977 1058 965 965 1045 965 965 1045 977 977 1058 978 978 1059 965 965 1045 978 978 1059 966 966 1046 966 966 1046 978 978 1059 979 979 1060 966 966 1046 979 979 1060 967 967 1047 967 967 1047 979 979 1060 980 980 1061 967 967 1047 980 980 1061 968 968 1048 968 968 1048 980 980 1061 981 981 1062 968 968 1048 981 981 1062 969 969 1049 969 969 1049 981 981 1062 982 982 1063 969 969 1049 982 982 1063 970 970 1050 970 970 1050 982 982 1063 983 983 1064 970 970 1050 983 983 1064 971 971 1051 971 971 1051 983 983 1064 972 972 1065 971 971 1051 972 972 1065 960 960 1052 972 972 1053 984 984 1066 985 985 1067 972 972 1053 985 985 1067 973 973 1054 973 973 1054 985 985 1067 986 986 1068 973 973 1054 986 986 1068 974 974 1055 974 974 1055 986 986 1068 987 987 1069 974 974 1055 987 987 1069 975 975 1056 975 975 1056 987 987 1069 988 988 1070 975 975 1056 988 988 1070 976 976 1057 976 976 1057 988 988 1070 989 989 1071 976 976 1057 989 989 1071 977 977 1058 977 977 1058 989 989 1071 990 990 1072 977 977 1058 990 990 1072 978 978 1059 978 978 1059 990 990 1072 991 991 1073 978 978 1059 991 991 1073 979 979 1060 979 979 1060 991 991 1073 992 992 1074 979 979 1060 992 992 1074 980 980 1061 980 980 1061 992 992 1074 993 993 1075 980 980 1061 993 993 1075 981 981 1062 981 981 1062 993 993 1075 994 994 1076 981 981 1062 994 994 1076 982 982 1063 982 982 1063 994 994 1076 995 995 1077 982 982 1063 995 995 1077 983 983 1064 983 983 1064 995 995 1077 984 984 1078 983 983 1064 984 984 1078 972 972 1065 984 984 1066 996 996 1079 997 997 1080 984 984 1066 997 997 1080 985 985 1067 985 985 1067 997 997 1080 998 998 1081 985 985 1067 998 998 1081 986 986 1068 986 986 1068 998 998 1081 999 999 1082 986 986 1068 999 999 1082 987 987 1069 987 987 1069 999 999 1082 1000 1000 1083 987 987 1069 1000 1000 1083 988 988 1070 988 988 1070 1000 1000 1083 1001 1001 1084 988 988 1070 1001 1001 1084 989 989 1071 989 989 1071 1001 1001 1084 1002 1002 1085 989 989 1071 1002 1002 1085 990 990 1072 990 990 1072 1002 1002 1085 1003 1003 1086 990 990 1072 1003 1003 1086 991 991 1073 991 991 1073 1003 1003 1086 1004 1004 1087 991 991 1073 1004 1004 1087 992 992 1074 992 992 1074 1004 1004 1087 1005 1005 1088 992 992 1074 1005 1005 1088 993 993 1075 993 993 1075 1005 1005 1088 1006 1006 1089 993 993 1075 1006 1006 1089 994 994 1076 994 994 1076 1006 1006 1089 1007 1007 1090 994 994 1076 1007 1007 1090 995 995 1077 995 995 1077 1007 1007 1090 996 996 1091 995 995 1077 996 996 1091 984 984 1078 996 996 1079 1008 1008 1092 1009 1009 1093 996 996 1079 1009 1009 1093 997 997 1080 997 997 1080 1009 1009 1093 1010 1010 1094 997 997 1080 1010 1010 1094 998 998 1081 998 998 1081 1010 1010 1094 1011 1011 1095 998 998 1081 1011 1011 1095 999 999 1082 999 999 1082 1011 1011 1095 1012 1012 1096 999 999 1082 1012 1012 1096 1000 1000 1083 1000 1000 1083 1012 1012 1096 1013 1013 1097 1000 1000 1083 1013 1013 1097 1001 1001 1084 1001 1001 1084 1013 1013 1097 1014 1014 1098 1001 1001 1084 1014 1014 1098 1002 1002 1085 1002 1002 1085 1014 1014 1098 1015 1015 1099 1002 1002 1085 1015 1015 1099 1003 1003 1086 1003 1003 1086 1015 1015 1099 1016 1016 1100 1003 1003 1086 1016 1016 1100 1004 1004 1087 1004 1004 1087 1016 1016 1100 1017 1017 1101 1004 1004 1087 1017 1017 1101 1005 1005 1088 1005 1005 1088 1017 1017 1101 1018 1018 1102 1005 1005 1088 1018 1018 1102 1006 1006 1089 1006 1006 1089 1018 1018 1102 1019 1019 1103 1006 1006 1089 1019 1019 1103 1007 1007 1090 1007 1007 1090 1019 1019 1103 1008 1008 1104 1007 1007 1090 1008 1008 1104 996 996 1091 1008 1008 1092 1020 1020 1105 1021 1021 1106 1008 1008 1092 1021 1021 1106 1009 1009 1093 1009 1009 1093 1021 1021 1106 1022 1022 1107 1009 1009 1093 1022 1022 1107 1010 1010 1094 1010 1010 1094 1022 1022 1107 1023 1023 1108 1010 1010 1094 1023 1023 1108 1011 1011 1095 1011 1011 1095 1023 1023 1108 1024 1024 1109 1011 1011 1095 1024 1024 1109 1012 1012 1096 1012 1012 1096 1024 1024 1109 1025 1025 1110 1012 1012 1096 1025 1025 1110 1013 1013 1097 1013 1013 1097 1025 1025 1110 1026 1026 1111 1013 1013 1097 1026 1026 1111 1014 1014 1098 1014 1014 1098 1026 1026 1111 1027 1027 1112 1014 1014 1098 1027 1027 1112 1015 1015 1099 1015 1015 1099 1027 1027 1112 1028 1028 1113 1015 1015 1099 1028 1028 1113 1016 1016 1100 1016 1016 1100 1028 1028 1113 1029 1029 1114 1016 1016 1100 1029 1029 1114 1017 1017 1101 1017 1017 1101 1029 1029 1114 1030 1030 1115 1017 1017 1101 1030 1030 1115 1018 1018 1102 1018 1018 1102 1030 1030 1115 1031 1031 1116 1018 1018 1102 1031 1031 1116 1019 1019 1103 1019 1019 1103 1031 1031 1116 1020 1020 1117 1019 1019 1103 1020 1020 1117 1008 1008 1104 1020 1020 1105 1032 1032 1118 1033 1033 1119 1020 1020 1105 1033 1033 1119 1021 1021 1106 1021 1021 1106 1033 1033 1119 1034 1034 1120 1021 1021 1106 1034 1034 1120 1022 1022 1107 1022 1022 1107 1034 1034 1120 1035 1035 1121 1022 1022 1107 1035 1035 1121 1023 1023 1108 1023 1023 1108 1035 1035 1121 1036 1036 1122 1023 1023 1108 1036 1036 1122 1024 1024 1109 1024 1024 1109 1036 1036 1122 1037 1037 1123 1024 1024 1109 1037 1037 1123 1025 1025 1110 1025 1025 1110 1037 1037 1123 1038 1038 1124 1025 1025 1110 1038 1038 1124 1026 1026 1111 1026 1026 1111 1038 1038 1124 1039 1039 1125 1026 1026 1111 1039 1039 1125 1027 1027 1112 1027 1027 1112 1039 1039 1125 1040 1040 1126 1027 1027 1112 1040 1040 1126 1028 1028 1113 1028 1028 1113 1040 1040 1126 1041 1041 1127 1028 1028 1113 1041 1041 1127 1029 1029 1114 1029 1029 1114 1041 1041 1127 1042 1042 1128 1029 1029 1114 1042 1042 1128 1030 1030 1115 1030 1030 1115 1042 1042 1128 1043 1043 1129 1030 1030 1115 1043 1043 1129 1031 1031 1116 1031 1031 1116 1043 1043 1129 1032 1032 1130 1031 1031 1116 1032 1032 1130 1020 1020 1117 1032 1032 1118 1044 1044 1131 1045 1045 1132 1032 1032 1118 1045 1045 1132 1033 1033 1119 1033 1033 1119 1045 1045 1132 1046 1046 1133 1033 1033 1119 1046 1046 1133 1034 1034 1120 1034 1034 1120 1046 1046 1133 1047 1047 1134 1034 1034 1120 1047 1047 1134 1035 1035 1121 1035 1035 1121 1047 1047 1134 1048 1048 1135 1035 1035 1121 1048 1048 1135 1036 1036 1122 1036 1036 1122 1048 1048 1135 1049 1049 1136 1036 1036 1122 1049 1049 1136 1037 1037 1123 1037 1037 1123 1049 1049 1136 1050 1050 1137 1037 1037 1123 1050 1050 1137 1038 1038 1124 1038 1038 1124 1050 1050 1137 1051 1051 1138 1038 1038 1124 1051 1051 1138 1039 1039 1125 1039 1039 1125 1051 1051 1138 1052 1052 1139 1039 1039 1125 1052 1052 1139 1040 1040 1126 1040 1040 1126 1052 1052 1139 1053 1053 1140 1040 1040 1126 1053 1053 1140 1041 1041 1127 1041 1041 1127 1053 1053 1140 1054 1054 1141 1041 1041 1127 1054 1054 1141 1042 1042 1128 1042 1042 1128 1054 1054 1141 1055 1055 1142 1042 1042 1128 1055 1055 1142 1043 1043 1129 1043 1043 1129 1055 1055 1142 1044 1044 1143 1043 1043 1129 1044 1044 1143 1032 1032 1130 1044 1044 1131 1056 1056 1144 1057 1057 1145 1044 1044 1131 1057 1057 1145 1045 1045 1132 1045 1045 1132 1057 1057 1145 1058 1058 1146 1045 1045 1132 1058 1058 1146 1046 1046 1133 1046 1046 1133 1058 1058 1146 1059 1059 1147 1046 1046 1133 1059 1059 1147 1047 1047 1134 1047 1047 1134 1059 1059 1147 1060 1060 1148 1047 1047 1134 1060 1060 1148 1048 1048 1135 1048 1048 1135 1060 1060 1148 1061 1061 1149 1048 1048 1135 1061 1061 1149 1049 1049 1136 1049 1049 1136 1061 1061 1149 1062 1062 1150 1049 1049 1136 1062 1062 1150 1050 1050 1137 1050 1050 1137 1062 1062 1150 1063 1063 1151 1050 1050 1137 1063 1063 1151 1051 1051 1138 1051 1051 1138 1063 1063 1151 1064 1064 1152 1051 1051 1138 1064 1064 1152 1052 1052 1139 1052 1052 1139 1064 1064 1152 1065 1065 1153 1052 1052 1139 1065 1065 1153 1053 1053 1140 1053 1053 1140 1065 1065 1153 1066 1066 1154 1053 1053 1140 1066 1066 1154 1054 1054 1141 1054 1054 1141 1066 1066 1154 1067 1067 1155 1054 1054 1141 1067 1067 1155 1055 1055 1142 1055 1055 1142 1067 1067 1155 1056 1056 1156 1055 1055 1142 1056 1056 1156 1044 1044 1143 1056 1056 1144 1068 1068 1157 1069 1069 1158 1056 1056 1144 1069 1069 1158 1057 1057 1145 1057 1057 1145 1069 1069 1158 1070 1070 1159 1057 1057 1145 1070 1070 1159 1058 1058 1146 1058 1058 1146 1070 1070 1159 1071 1071 1160 1058 1058 1146 1071 1071 1160 1059 1059 1147 1059 1059 1147 1071 1071 1160 1072 1072 1161 1059 1059 1147 1072 1072 1161 1060 1060 1148 1060 1060 1148 1072 1072 1161 1073 1073 1162 1060 1060 1148 1073 1073 1162 1061 1061 1149 1061 1061 1149 1073 1073 1162 1074 1074 1163 1061 1061 1149 1074 1074 1163 1062 1062 1150 1062 1062 1150 1074 1074 1163 1075 1075 1164 1062 1062 1150 1075 1075 1164 1063 1063 1151 1063 1063 1151 1075 1075 1164 1076 1076 1165 1063 1063 1151 1076 1076 1165 1064 1064 1152 1064 1064 1152 1076 1076 1165 1077 1077 1166 1064 1064 1152 1077 1077 1166 1065 1065 1153 1065 1065 1153 1077 1077 1166 1078 1078 1167 1065 1065 1153 1078 1078 1167 1066 1066 1154 1066 1066 1154 1078 1078 1167 1079 1079 1168 1066 1066 1154 1079 1079 1168 1067 1067 1155 1067 1067 1155 1079 1079 1168 1068 1068 1169 1067 1067 1155 1068 1068 1169 1056 1056 1156 1068 1068 1157 1080 1080 1170 1081 1081 1171 1068 1068 1157 1081 1081 1171 1069 1069 1158 1069 1069 1158 1081 1081 1171 1082 1082 1172 1069 1069 1158 1082 1082 1172 1070 1070 1159 1070 1070 1159 1082 1082 1172 1083 1083 1173 1070 1070 1159 1083 1083 1173 1071 1071 1160 1071 1071 1160 1083 1083 1173 1084 1084 1174 1071 1071 1160 1084 1084 1174 1072 1072 1161 1072 1072 1161 1084 1084 1174 1085 1085 1175 1072 1072 1161 1085 1085 1175 1073 1073 1162 1073 1073 1162 1085 1085 1175 1086 1086 1176 1073 1073 1162 1086 1086 1176 1074 1074 1163 1074 1074 1163 1086 1086 1176 1087 1087 1177 1074 1074 1163 1087 1087 1177 1075 1075 1164 1075 1075 1164 1087 1087 1177 1088 1088 1178 1075 1075 1164 1088 1088 1178 1076 1076 1165 1076 1076 1165 1088 1088 1178 1089 1089 1179 1076 1076 1165 1089 1089 1179 1077 1077 1166 1077 1077 1166 1089 1089 1179 1090 1090 1180 1077 1077 1166 1090 1090 1180 1078 1078 1167 1078 1078 1167 1090 1090 1180 1091 1091 1181 1078 1078 1167 1091 1091 1181 1079 1079 1168 1079 1079 1168 1091 1091 1181 1080 1080 1182 1079 1079 1168 1080 1080 1182 1068 1068 1169 1080 1080 1170 1092 1092 1183 1093 1093 1184 1080 1080 1170 1093 1093 1184 1081 1081 1171 1081 1081 1171 1093 1093 1184 1094 1094 1185 1081 1081 1171 1094 1094 1185 1082 1082 1172 1082 1082 1172 1094 1094 1185 1095 1095 1186 1082 1082 1172 1095 1095 1186 1083 1083 1173 1083 1083 1173 1095 1095 1186 1096 1096 1187 1083 1083 1173 1096 1096 1187 1084 1084 1174 1084 1084 1174 1096 1096 1187 1097 1097 1188 1084 1084 1174 1097 1097 1188 1085 1085 1175 1085 1085 1175 1097 1097 1188 1098 1098 1189 1085 1085 1175 1098 1098 1189 1086 1086 1176 1086 1086 1176 1098 1098 1189 1099 1099 1190 1086 1086 1176 1099 1099 1190 1087 1087 1177 1087 1087 1177 1099 1099 1190 1100 1100 1191 1087 1087 1177 1100 1100 1191 1088 1088 1178 1088 1088 1178 1100 1100 1191 1101 1101 1192 1088 1088 1178 1101 1101 1192 1089 1089 1179 1089 1089 1179 1101 1101 1192 1102 1102 1193 1089 1089 1179 1102 1102 1193 1090 1090 1180 1090 1090 1180 1102 1102 1193 1103 1103 1194 1090 1090 1180 1103 1103 1194 1091 1091 1181 1091 1091 1181 1103 1103 1194 1092 1092 1195 1091 1091 1181 1092 1092 1195 1080 1080 1182 1092 1092 1183 1104 1104 1196 1105 1105 1197 1092 1092 1183 1105 1105 1197 1093 1093 1184 1093 1093 1184 1105 1105 1197 1106 1106 1198 1093 1093 1184 1106 1106 1198 1094 1094 1185 1094 1094 1185 1106 1106 1198 1107 1107 1199 1094 1094 1185 1107 1107 1199 1095 1095 1186 1095 1095 1186 1107 1107 1199 1108 1108 1200 1095 1095 1186 1108 1108 1200 1096 1096 1187 1096 1096 1187 1108 1108 1200 1109 1109 1201 1096 1096 1187 1109 1109 1201 1097 1097 1188 1097 1097 1188 1109 1109 1201 1110 1110 1202 1097 1097 1188 1110 1110 1202 1098 1098 1189 1098 1098 1189 1110 1110 1202 1111 1111 1203 1098 1098 1189 1111 1111 1203 1099 1099 1190 1099 1099 1190 1111 1111 1203 1112 1112 1204 1099 1099 1190 1112 1112 1204 1100 1100 1191 1100 1100 1191 1112 1112 1204 1113 1113 1205 1100 1100 1191 1113 1113 1205 1101 1101 1192 1101 1101 1192 1113 1113 1205 1114 1114 1206 1101 1101 1192 1114 1114 1206 1102 1102 1193 1102 1102 1193 1114 1114 1206 1115 1115 1207 1102 1102 1193 1115 1115 1207 1103 1103 1194 1103 1103 1194 1115 1115 1207 1104 1104 1208 1103 1103 1194 1104 1104 1208 1092 1092 1195 1104 1104 1196 1116 1116 1209 1117 1117 1210 1104 1104 1196 1117 1117 1210 1105 1105 1197 1105 1105 1197 1117 1117 1210 1118 1118 1211 1105 1105 1197 1118 1118 1211 1106 1106 1198 1106 1106 1198 1118 1118 1211 1119 1119 1212 1106 1106 1198 1119 1119 1212 1107 1107 1199 1107 1107 1199 1119 1119 1212 1120 1120 1213 1107 1107 1199 1120 1120 1213 1108 1108 1200 1108 1108 1200 1120 1120 1213 1121 1121 1214 1108 1108 1200 1121 1121 1214 1109 1109 1201 1109 1109 1201 1121 1121 1214 1122 1122 1215 1109 1109 1201 1122 1122 1215 1110 1110 1202 1110 1110 1202 1122 1122 1215 1123 1123 1216 1110 1110 1202 1123 1123 1216 1111 1111 1203 1111 1111 1203 1123 1123 1216 1124 1124 1217 1111 1111 1203 1124 1124 1217 1112 1112 1204 1112 1112 1204 1124 1124 1217 1125 1125 1218 1112 1112 1204 1125 1125 1218 1113 1113 1205 1113 1113 1205 1125 1125 1218 1126 1126 1219 1113 1113 1205 1126 1126 1219 1114 1114 1206 1114 1114 1206 1126 1126 1219 1127 1127 1220 1114 1114 1206 1127 1127 1220 1115 1115 1207 1115 1115 1207 1127 1127 1220 1116 1116 1221 1115 1115 1207 1116 1116 1221 1104 1104 1208 1116 1116 1209 1128 1128 1222 1129 1129 1223 1116 1116 1209 1129 1129 1223 1117 1117 1210 1117 1117 1210 1129 1129 1223 1130 1130 1224 1117 1117 1210 1130 1130 1224 1118 1118 1211 1118 1118 1211 1130 1130 1224 1131 1131 1225 1118 1118 1211 1131 1131 1225 1119 1119 1212 1119 1119 1212 1131 1131 1225 1132 1132 1226 1119 1119 1212 1132 1132 1226 1120 1120 1213 1120 1120 1213 1132 1132 1226 1133 1133 1227 1120 1120 1213 1133 1133 1227 1121 1121 1214 1121 1121 1214 1133 1133 1227 1134 1134 1228 1121 1121 1214 1134 1134 1228 1122 1122 1215 1122 1122 1215 1134 1134 1228 1135 1135 1229 1122 1122 1215 1135 1135 1229 1123 1123 1216 1123 1123 1216 1135 1135 1229 1136 1136 1230 1123 1123 1216 1136 1136 1230 1124 1124 1217 1124 1124 1217 1136 1136 1230 1137 1137 1231 1124 1124 1217 1137 1137 1231 1125 1125 1218 1125 1125 1218 1137 1137 1231 1138 1138 1232 1125 1125 1218 1138 1138 1232 1126 1126 1219 1126 1126 1219 1138 1138 1232 1139 1139 1233 1126 1126 1219 1139 1139 1233 1127 1127 1220 1127 1127 1220 1139 1139 1233 1128 1128 1234 1127 1127 1220 1128 1128 1234 1116 1116 1221 1128 1128 1222 1140 1140 1235 1141 1141 1236 1128 1128 1222 1141 1141 1236 1129 1129 1223 1129 1129 1223 1141 1141 1236 1142 1142 1237 1129 1129 1223 1142 1142 1237 1130 1130 1224 1130 1130 1224 1142 1142 1237 1143 1143 1238 1130 1130 1224 1143 1143 1238 1131 1131 1225 1131 1131 1225 1143 1143 1238 1144 1144 1239 1131 1131 1225 1144 1144 1239 1132 1132 1226 1132 1132 1226 1144 1144 1239 1145 1145 1240 1132 1132 1226 1145 1145 1240 1133 1133 1227 1133 1133 1227 1145 1145 1240 1146 1146 1241 1133 1133 1227 1146 1146 1241 1134 1134 1228 1134 1134 1228 1146 1146 1241 1147 1147 1242 1134 1134 1228 1147 1147 1242 1135 1135 1229 1135 1135 1229 1147 1147 1242 1148 1148 1243 1135 1135 1229 1148 1148 1243 1136 1136 1230 1136 1136 1230 1148 1148 1243 1149 1149 1244 1136 1136 1230 1149 1149 1244 1137 1137 1231 1137 1137 1231 1149 1149 1244 1150 1150 1245 1137 1137 1231 1150 1150 1245 1138 1138 1232 1138 1138 1232 1150 1150 1245 1151 1151 1246 1138 1138 1232 1151 1151 1246 1139 1139 1233 1139 1139 1233 1151 1151 1246 1140 1140 1247 1139 1139 1233 1140 1140 1247 1128 1128 1234 1140 1140 1235 1152 1152 1248 1153 1153 1249 1140 1140 1235 1153 1153 1249 1141 1141 1236 1141 1141 1236 1153 1153 1249 1154 1154 1250 1141 1141 1236 1154 1154 1250 1142 1142 1237 1142 1142 1237 1154 1154 1250 1155 1155 1251 1142 1142 1237 1155 1155 1251 1143 1143 1238 1143 1143 1238 1155 1155 1251 1156 1156 1252 1143 1143 1238 1156 1156 1252 1144 1144 1239 1144 1144 1239 1156 1156 1252 1157 1157 1253 1144 1144 1239 1157 1157 1253 1145 1145 1240 1145 1145 1240 1157 1157 1253 1158 1158 1254 1145 1145 1240 1158 1158 1254 1146 1146 1241 1146 1146 1241 1158 1158 1254 1159 1159 1255 1146 1146 1241 1159 1159 1255 1147 1147 1242 1147 1147 1242 1159 1159 1255 1160 1160 1256 1147 1147 1242 1160 1160 1256 1148 1148 1243 1148 1148 1243 1160 1160 1256 1161 1161 1257 1148 1148 1243 1161 1161 1257 1149 1149 1244 1149 1149 1244 1161 1161 1257 1162 1162 1258 1149 1149 1244 1162 1162 1258 1150 1150 1245 1150 1150 1245 1162 1162 1258 1163 1163 1259 1150 1150 1245 1163 1163 1259 1151 1151 1246 1151 1151 1246 1163 1163 1259 1152 1152 1260 1151 1151 1246 1152 1152 1260 1140 1140 1247 1152 1152 1248 1164 1164 1261 1165 1165 1262 1152 1152 1248 1165 1165 1262 1153 1153 1249 1153 1153 1249 1165 1165 1262 1166 1166 1263 1153 1153 1249 1166 1166 1263 1154 1154 1250 1154 1154 1250 1166 1166 1263 1167 1167 1264 1154 1154 1250 1167 1167 1264 1155 1155 1251 1155 1155 1251 1167 1167 1264 1168 1168 1265 1155 1155 1251 1168 1168 1265 1156 1156 1252 1156 1156 1252 1168 1168 1265 1169 1169 1266 1156 1156 1252 1169 1169 1266 1157 1157 1253 1157 1157 1253 1169 1169 1266 1170 1170 1267 1157 1157 1253 1170 1170 1267 1158 1158 1254 1158 1158 1254 1170 1170 1267 1171 1171 1268 1158 1158 1254 1171 1171 1268 1159 1159 1255 1159 1159 1255 1171 1171 1268 1172 1172 1269 1159 1159 1255 1172 1172 1269 1160 1160 1256 1160 1160 1256 1172 1172 1269 1173 1173 1270 1160 1160 1256 1173 1173 1270 1161 1161 1257 1161 1161 1257 1173 1173 1270 1174 1174 1271 1161 1161 1257 1174 1174 1271 1162 1162 1258 1162 1162 1258 1174 1174 1271 1175 1175 1272 1162 1162 1258 1175 1175 1272 1163 1163 1259 1163 1163 1259 1175 1175 1272 1164 1164 1273 1163 1163 1259 1164 1164 1273 1152 1152 1260 1164 1164 1261 1176 1176 1274 1177 1177 1275 1164 1164 1261 1177 1177 1275 1165 1165 1262 1165 1165 1262 1177 1177 1275 1178 1178 1276 1165 1165 1262 1178 1178 1276 1166 1166 1263 1166 1166 1263 1178 1178 1276 1179 1179 1277 1166 1166 1263 1179 1179 1277 1167 1167 1264 1167 1167 1264 1179 1179 1277 1180 1180 1278 1167 1167 1264 1180 1180 1278 1168 1168 1265 1168 1168 1265 1180 1180 1278 1181 1181 1279 1168 1168 1265 1181 1181 1279 1169 1169 1266 1169 1169 1266 1181 1181 1279 1182 1182 1280 1169 1169 1266 1182 1182 1280 1170 1170 1267 1170 1170 1267 1182 1182 1280 1183 1183 1281 1170 1170 1267 1183 1183 1281 1171 1171 1268 1171 1171 1268 1183 1183 1281 1184 1184 1282 1171 1171 1268 1184 1184 1282 1172 1172 1269 1172 1172 1269 1184 1184 1282 1185 1185 1283 1172 1172 1269 1185 1185 1283 1173 1173 1270 1173 1173 1270 1185 1185 1283 1186 1186 1284 1173 1173 1270 1186 1186 1284 1174 1174 1271 1174 1174 1271 1186 1186 1284 1187 1187 1285 1174 1174 1271 1187 1187 1285 1175 1175 1272 1175 1175 1272 1187 1187 1285 1176 1176 1286 1175 1175 1272 1176 1176 1286 1164 1164 1273 1176 1176 1274 1188 1188 1287 1189 1189 1288 1176 1176 1274 1189 1189 1288 1177 1177 1275 1177 1177 1275 1189 1189 1288 1190 1190 1289 1177 1177 1275 1190 1190 1289 1178 1178 1276 1178 1178 1276 1190 1190 1289 1191 1191 1290 1178 1178 1276 1191 1191 1290 1179 1179 1277 1179 1179 1277 1191 1191 1290 1192 1192 1291 1179 1179 1277 1192 1192 1291 1180 1180 1278 1180 1180 1278 1192 1192 1291 1193 1193 1292 1180 1180 1278 1193 1193 1292 1181 1181 1279 1181 1181 1279 1193 1193 1292 1194 1194 1293 1181 1181 1279 1194 1194 1293 1182 1182 1280 1182 1182 1280 1194 1194 1293 1195 1195 1294 1182 1182 1280 1195 1195 1294 1183 1183 1281 1183 1183 1281 1195 1195 1294 1196 1196 1295 1183 1183 1281 1196 1196 1295 1184 1184 1282 1184 1184 1282 1196 1196 1295 1197 1197 1296 1184 1184 1282 1197 1197 1296 1185 1185 1283 1185 1185 1283 1197 1197 1296 1198 1198 1297 1185 1185 1283 1198 1198 1297 1186 1186 1284 1186 1186 1284 1198 1198 1297 1199 1199 1298 1186 1186 1284 1199 1199 1298 1187 1187 1285 1187 1187 1285 1199 1199 1298 1188 1188 1299 1187 1187 1285 1188 1188 1299 1176 1176 1286 1188 1188 1287 1200 1200 1300 1201 1201 1301 1188 1188 1287 1201 1201 1301 1189 1189 1288 1189 1189 1288 1201 1201 1301 1202 1202 1302 1189 1189 1288 1202 1202 1302 1190 1190 1289 1190 1190 1289 1202 1202 1302 1203 1203 1303 1190 1190 1289 1203 1203 1303 1191 1191 1290 1191 1191 1290 1203 1203 1303 1204 1204 1304 1191 1191 1290 1204 1204 1304 1192 1192 1291 1192 1192 1291 1204 1204 1304 1205 1205 1305 1192 1192 1291 1205 1205 1305 1193 1193 1292 1193 1193 1292 1205 1205 1305 1206 1206 1306 1193 1193 1292 1206 1206 1306 1194 1194 1293 1194 1194 1293 1206 1206 1306 1207 1207 1307 1194 1194 1293 1207 1207 1307 1195 1195 1294 1195 1195 1294 1207 1207 1307 1208 1208 1308 1195 1195 1294 1208 1208 1308 1196 1196 1295 1196 1196 1295 1208 1208 1308 1209 1209 1309 1196 1196 1295 1209 1209 1309 1197 1197 1296 1197 1197 1296 1209 1209 1309 1210 1210 1310 1197 1197 1296 1210 1210 1310 1198 1198 1297 1198 1198 1297 1210 1210 1310 1211 1211 1311 1198 1198 1297 1211 1211 1311 1199 1199 1298 1199 1199 1298 1211 1211 1311 1200 1200 1312 1199 1199 1298 1200 1200 1312 1188 1188 1299 1200 1200 1300 1212 1212 1313 1213 1213 1314 1200 1200 1300 1213 1213 1314 1201 1201 1301 1201 1201 1301 1213 1213 1314 1214 1214 1315 1201 1201 1301 1214 1214 1315 1202 1202 1302 1202 1202 1302 1214 1214 1315 1215 1215 1316 1202 1202 1302 1215 1215 1316 1203 1203 1303 1203 1203 1303 1215 1215 1316 1216 1216 1317 1203 1203 1303 1216 1216 1317 1204 1204 1304 1204 1204 1304 1216 1216 1317 1217 1217 1318 1204 1204 1304 1217 1217 1318 1205 1205 1305 1205 1205 1305 1217 1217 1318 1218 1218 1319 1205 1205 1305 1218 1218 1319 1206 1206 1306 1206 1206 1306 1218 1218 1319 1219 1219 1320 1206 1206 1306 1219 1219 1320 1207 1207 1307 1207 1207 1307 1219 1219 1320 1220 1220 1321 1207 1207 1307 1220 1220 1321 1208 1208 1308 1208 1208 1308 1220 1220 1321 1221 1221 1322 1208 1208 1308 1221 1221 1322 1209 1209 1309 1209 1209 1309 1221 1221 1322 1222 1222 1323 1209 1209 1309 1222 1222 1323 1210 1210 1310 1210 1210 1310 1222 1222 1323 1223 1223 1324 1210 1210 1310 1223 1223 1324 1211 1211 1311 1211 1211 1311 1223 1223 1324 1212 1212 1325 1211 1211 1311 1212 1212 1325 1200 1200 1312 1212 1212 1313 1224 1224 1326 1225 1225 1327 1212 1212 1313 1225 1225 1327 1213 1213 1314 1213 1213 1314 1225 1225 1327 1226 1226 1328 1213 1213 1314 1226 1226 1328 1214 1214 1315 1214 1214 1315 1226 1226 1328 1227 1227 1329 1214 1214 1315 1227 1227 1329 1215 1215 1316 1215 1215 1316 1227 1227 1329 1228 1228 1330 1215 1215 1316 1228 1228 1330 1216 1216 1317 1216 1216 1317 1228 1228 1330 1229 1229 1331 1216 1216 1317 1229 1229 1331 1217 1217 1318 1217 1217 1318 1229 1229 1331 1230 1230 1332 1217 1217 1318 1230 1230 1332 1218 1218 1319 1218 1218 1319 1230 1230 1332 1231 1231 1333 1218 1218 1319 1231 1231 1333 1219 1219 1320 1219 1219 1320 1231 1231 1333 1232 1232 1334 1219 1219 1320 1232 1232 1334 1220 1220 1321 1220 1220 1321 1232 1232 1334 1233 1233 1335 1220 1220 1321 1233 1233 1335 1221 1221 1322 1221 1221 1322 1233 1233 1335 1234 1234 1336 1221 1221 1322 1234 1234 1336 1222 1222 1323 1222 1222 1323 1234 1234 1336 1235 1235 1337 1222 1222 1323 1235 1235 1337 1223 1223 1324 1223 1223 1324 1235 1235 1337 1224 1224 1338 1223 1223 1324 1224 1224 1338 1212 1212 1325 1224 1224 1326 1236 1236 1339 1237 1237 1340 1224 1224 1326 1237 1237 1340 1225 1225 1327 1225 1225 1327 1237 1237 1340 1238 1238 1341 1225 1225 1327 1238 1238 1341 1226 1226 1328 1226 1226 1328 1238 1238 1341 1239 1239 1342 1226 1226 1328 1239 1239 1342 1227 1227 1329 1227 1227 1329 1239 1239 1342 1240 1240 1343 1227 1227 1329 1240 1240 1343 1228 1228 1330 1228 1228 1330 1240 1240 1343 1241 1241 1344 1228 1228 1330 1241 1241 1344 1229 1229 1331 1229 1229 1331 1241 1241 1344 1242 1242 1345 1229 1229 1331 1242 1242 1345 1230 1230 1332 1230 1230 1332 1242 1242 1345 1243 1243 1346 1230 1230 1332 1243 1243 1346 1231 1231 1333 1231 1231 1333 1243 1243 1346 1244 1244 1347 1231 1231 1333 1244 1244 1347 1232 1232 1334 1232 1232 1334 1244 1244 1347 1245 1245 1348 1232 1232 1334 1245 1245 1348 1233 1233 1335 1233 1233 1335 1245 1245 1348 1246 1246 1349 1233 1233 1335 1246 1246 1349 1234 1234 1336 1234 1234 1336 1246 1246 1349 1247 1247 1350 1234 1234 1336 1247 1247 1350 1235 1235 1337 1235 1235 1337 1247 1247 1350 1236 1236 1351 1235 1235 1337 1236 1236 1351 1224 1224 1338 1236 1236 1339 1248 1248 1352 1249 1249 1353 1236 1236 1339 1249 1249 1353 1237 1237 1340 1237 1237 1340 1249 1249 1353 1250 1250 1354 1237 1237 1340 1250 1250 1354 1238 1238 1341 1238 1238 1341 1250 1250 1354 1251 1251 1355 1238 1238 1341 1251 1251 1355 1239 1239 1342 1239 1239 1342 1251 1251 1355 1252 1252 1356 1239 1239 1342 1252 1252 1356 1240 1240 1343 1240 1240 1343 1252 1252 1356 1253 1253 1357 1240 1240 1343 1253 1253 1357 1241 1241 1344 1241 1241 1344 1253 1253 1357 1254 1254 1358 1241 1241 1344 1254 1254 1358 1242 1242 1345 1242 1242 1345 1254 1254 1358 1255 1255 1359 1242 1242 1345 1255 1255 1359 1243 1243 1346 1243 1243 1346 1255 1255 1359 1256 1256 1360 1243 1243 1346 1256 1256 1360 1244 1244 1347 1244 1244 1347 1256 1256 1360 1257 1257 1361 1244 1244 1347 1257 1257 1361 1245 1245 1348 1245 1245 1348 1257 1257 1361 1258 1258 1362 1245 1245 1348 1258 1258 1362 1246 1246 1349 1246 1246 1349 1258 1258 1362 1259 1259 1363 1246 1246 1349 1259 1259 1363 1247 1247 1350 1247 1247 1350 1259 1259 1363 1248 1248 1364 1247 1247 1350 1248 1248 1364 1236 1236 1351 1248 1248 1352 1260 1260 1365 1261 1261 1366 1248 1248 1352 1261 1261 1366 1249 1249 1353 1249 1249 1353 1261 1261 1366 1262 1262 1367 1249 1249 1353 1262 1262 1367 1250 1250 1354 1250 1250 1354 1262 1262 1367 1263 1263 1368 1250 1250 1354 1263 1263 1368 1251 1251 1355 1251 1251 1355 1263 1263 1368 1264 1264 1369 1251 1251 1355 1264 1264 1369 1252 1252 1356 1252 1252 1356 1264 1264 1369 1265 1265 1370 1252 1252 1356 1265 1265 1370 1253 1253 1357 1253 1253 1357 1265 1265 1370 1266 1266 1371 1253 1253 1357 1266 1266 1371 1254 1254 1358 1254 1254 1358 1266 1266 1371 1267 1267 1372 1254 1254 1358 1267 1267 1372 1255 1255 1359 1255 1255 1359 1267 1267 1372 1268 1268 1373 1255 1255 1359 1268 1268 1373 1256 1256 1360 1256 1256 1360 1268 1268 1373 1269 1269 1374 1256 1256 1360 1269 1269 1374 1257 1257 1361 1257 1257 1361 1269 1269 1374 1270 1270 1375 1257 1257 1361 1270 1270 1375 1258 1258 1362 1258 1258 1362 1270 1270 1375 1271 1271 1376 1258 1258 1362 1271 1271 1376 1259 1259 1363 1259 1259 1363 1271 1271 1376 1260 1260 1377 1259 1259 1363 1260 1260 1377 1248 1248 1364 1260 1260 1365 1272 1272 1378 1273 1273 1379 1260 1260 1365 1273 1273 1379 1261 1261 1366 1261 1261 1366 1273 1273 1379 1274 1274 1380 1261 1261 1366 1274 1274 1380 1262 1262 1367 1262 1262 1367 1274 1274 1380 1275 1275 1381 1262 1262 1367 1275 1275 1381 1263 1263 1368 1263 1263 1368 1275 1275 1381 1276 1276 1382 1263 1263 1368 1276 1276 1382 1264 1264 1369 1264 1264 1369 1276 1276 1382 1277 1277 1383 1264 1264 1369 1277 1277 1383 1265 1265 1370 1265 1265 1370 1277 1277 1383 1278 1278 1384 1265 1265 1370 1278 1278 1384 1266 1266 1371 1266 1266 1371 1278 1278 1384 1279 1279 1385 1266 1266 1371 1279 1279 1385 1267 1267 1372 1267 1267 1372 1279 1279 1385 1280 1280 1386 1267 1267 1372 1280 1280 1386 1268 1268 1373 1268 1268 1373 1280 1280 1386 1281 1281 1387 1268 1268 1373 1281 1281 1387 1269 1269 1374 1269 1269 1374 1281 1281 1387 1282 1282 1388 1269 1269 1374 1282 1282 1388 1270 1270 1375 1270 1270 1375 1282 1282 1388 1283 1283 1389 1270 1270 1375 1283 1283 1389 1271 1271 1376 1271 1271 1376 1283 1283 1389 1272 1272 1390 1271 1271 1376 1272 1272 1390 1260 1260 1377 1272 1272 1378 1284 1284 1391 1285 1285 1392 1272 1272 1378 1285 1285 1392 1273 1273 1379 1273 1273 1379 1285 1285 1392 1286 1286 1393 1273 1273 1379 1286 1286 1393 1274 1274 1380 1274 1274 1380 1286 1286 1393 1287 1287 1394 1274 1274 1380 1287 1287 1394 1275 1275 1381 1275 1275 1381 1287 1287 1394 1288 1288 1395 1275 1275 1381 1288 1288 1395 1276 1276 1382 1276 1276 1382 1288 1288 1395 1289 1289 1396 1276 1276 1382 1289 1289 1396 1277 1277 1383 1277 1277 1383 1289 1289 1396 1290 1290 1397 1277 1277 1383 1290 1290 1397 1278 1278 1384 1278 1278 1384 1290 1290 1397 1291 1291 1398 1278 1278 1384 1291 1291 1398 1279 1279 1385 1279 1279 1385 1291 1291 1398 1292 1292 1399 1279 1279 1385 1292 1292 1399 1280 1280 1386 1280 1280 1386 1292 1292 1399 1293 1293 1400 1280 1280 1386 1293 1293 1400 1281 1281 1387 1281 1281 1387 1293 1293 1400 1294 1294 1401 1281 1281 1387 1294 1294 1401 1282 1282 1388 1282 1282 1388 1294 1294 1401 1295 1295 1402 1282 1282 1388 1295 1295 1402 1283 1283 1389 1283 1283 1389 1295 1295 1402 1284 1284 1403 1283 1283 1389 1284 1284 1403 1272 1272 1390 1284 1284 1391 1296 1296 1404 1297 1297 1405 1284 1284 1391 1297 1297 1405 1285 1285 1392 1285 1285 1392 1297 1297 1405 1298 1298 1406 1285 1285 1392 1298 1298 1406 1286 1286 1393 1286 1286 1393 1298 1298 1406 1299 1299 1407 1286 1286 1393 1299 1299 1407 1287 1287 1394 1287 1287 1394 1299 1299 1407 1300 1300 1408 1287 1287 1394 1300 1300 1408 1288 1288 1395 1288 1288 1395 1300 1300 1408 1301 1301 1409 1288 1288 1395 1301 1301 1409 1289 1289 1396 1289 1289 1396 1301 1301 1409 1302 1302 1410 1289 1289 1396 1302 1302 1410 1290 1290 1397 1290 1290 1397 1302 1302 1410 1303 1303 1411 1290 1290 1397 1303 1303 1411 1291 1291 1398 1291 1291 1398 1303 1303 1411 1304 1304 1412 1291 1291 1398 1304 1304 1412 1292 1292 1399 1292 1292 1399 1304 1304 1412 1305 1305 1413 1292 1292 1399 1305 1305 1413 1293 1293 1400 1293 1293 1400 1305 1305 1413 1306 1306 1414 1293 1293 1400 1306 1306 1414 1294 1294 1401 1294 1294 1401 1306 1306 1414 1307 1307 1415 1294 1294 1401 1307 1307 1415 1295 1295 1402 1295 1295 1402 1307 1307 1415 1296 1296 1416 1295 1295 1402 1296 1296 1416 1284 1284 1403 1296 1296 1404 1308 1308 1417 1309 1309 1418 1296 1296 1404 1309 1309 1418 1297 1297 1405 1297 1297 1405 1309 1309 1418 1310 1310 1419 1297 1297 1405 1310 1310 1419 1298 1298 1406 1298 1298 1406 1310 1310 1419 1311 1311 1420 1298 1298 1406 1311 1311 1420 1299 1299 1407 1299 1299 1407 1311 1311 1420 1312 1312 1421 1299 1299 1407 1312 1312 1421 1300 1300 1408 1300 1300 1408 1312 1312 1421 1313 1313 1422 1300 1300 1408 1313 1313 1422 1301 1301 1409 1301 1301 1409 1313 1313 1422 1314 1314 1423 1301 1301 1409 1314 1314 1423 1302 1302 1410 1302 1302 1410 1314 1314 1423 1315 1315 1424 1302 1302 1410 1315 1315 1424 1303 1303 1411 1303 1303 1411 1315 1315 1424 1316 1316 1425 1303 1303 1411 1316 1316 1425 1304 1304 1412 1304 1304 1412 1316 1316 1425 1317 1317 1426 1304 1304 1412 1317 1317 1426 1305 1305 1413 1305 1305 1413 1317 1317 1426 1318 1318 1427 1305 1305 1413 1318 1318 1427 1306 1306 1414 1306 1306 1414 1318 1318 1427 1319 1319 1428 1306 1306 1414 1319 1319 1428 1307 1307 1415 1307 1307 1415 1319 1319 1428 1308 1308 1429 1307 1307 1415 1308 1308 1429 1296 1296 1416 1308 1308 1417 1320 1320 1430 1321 1321 1431 1308 1308 1417 1321 1321 1431 1309 1309 1418 1309 1309 1418 1321 1321 1431 1322 1322 1432 1309 1309 1418 1322 1322 1432 1310 1310 1419 1310 1310 1419 1322 1322 1432 1323 1323 1433 1310 1310 1419 1323 1323 1433 1311 1311 1420 1311 1311 1420 1323 1323 1433 1324 1324 1434 1311 1311 1420 1324 1324 1434 1312 1312 1421 1312 1312 1421 1324 1324 1434 1325 1325 1435 1312 1312 1421 1325 1325 1435 1313 1313 1422 1313 1313 1422 1325 1325 1435 1326 1326 1436 1313 1313 1422 1326 1326 1436 1314 1314 1423 1314 1314 1423 1326 1326 1436 1327 1327 1437 1314 1314 1423 1327 1327 1437 1315 1315 1424 1315 1315 1424 1327 1327 1437 1328 1328 1438 1315 1315 1424 1328 1328 1438 1316 1316 1425 1316 1316 1425 1328 1328 1438 1329 1329 1439 1316 1316 1425 1329 1329 1439 1317 1317 1426 1317 1317 1426 1329 1329 1439 1330 1330 1440 1317 1317 1426 1330 1330 1440 1318 1318 1427 1318 1318 1427 1330 1330 1440 1331 1331 1441 1318 1318 1427 1331 1331 1441 1319 1319 1428 1319 1319 1428 1331 1331 1441 1320 1320 1442 1319 1319 1428 1320 1320 1442 1308 1308 1429 1320 1320 1430 1332 1332 1443 1333 1333 1444 1320 1320 1430 1333 1333 1444 1321 1321 1431 1321 1321 1431 1333 1333 1444 1334 1334 1445 1321 1321 1431 1334 1334 1445 1322 1322 1432 1322 1322 1432 1334 1334 1445 1335 1335 1446 1322 1322 1432 1335 1335 1446 1323 1323 1433 1323 1323 1433 1335 1335 1446 1336 1336 1447 1323 1323 1433 1336 1336 1447 1324 1324 1434 1324 1324 1434 1336 1336 1447 1337 1337 1448 1324 1324 1434 1337 1337 1448 1325 1325 1435 1325 1325 1435 1337 1337 1448 1338 1338 1449 1325 1325 1435 1338 1338 1449 1326 1326 1436 1326 1326 1436 1338 1338 1449 1339 1339 1450 1326 1326 1436 1339 1339 1450 1327 1327 1437 1327 1327 1437 1339 1339 1450 1340 1340 1451 1327 1327 1437 1340 1340 1451 1328 1328 1438 1328 1328 1438 1340 1340 1451 1341 1341 1452 1328 1328 1438 1341 1341 1452 1329 1329 1439 1329 1329 1439 1341 1341 1452 1342 1342 1453 1329 1329 1439 1342 1342 1453 1330 1330 1440 1330 1330 1440 1342 1342 1453 1343 1343 1454 1330 1330 1440 1343 1343 1454 1331 1331 1441 1331 1331 1441 1343 1343 1454 1332 1332 1455 1331 1331 1441 1332 1332 1455 1320 1320 1442 1332 1332 1443 1344 1344 1456 1345 1345 1457 1332 1332 1443 1345 1345 1457 1333 1333 1444 1333 1333 1444 1345 1345 1457 1346 1346 1458 1333 1333 1444 1346 1346 1458 1334 1334 1445 1334 1334 1445 1346 1346 1458 1347 1347 1459 1334 1334 1445 1347 1347 1459 1335 1335 1446 1335 1335 1446 1347 1347 1459 1348 1348 1460 1335 1335 1446 1348 1348 1460 1336 1336 1447 1336 1336 1447 1348 1348 1460 1349 1349 1461 1336 1336 1447 1349 1349 1461 1337 1337 1448 1337 1337 1448 1349 1349 1461 1350 1350 1462 1337 1337 1448 1350 1350 1462 1338 1338 1449 1338 1338 1449 1350 1350 1462 1351 1351 1463 1338 1338 1449 1351 1351 1463 1339 1339 1450 1339 1339 1450 1351 1351 1463 1352 1352 1464 1339 1339 1450 1352 1352 1464 1340 1340 1451 1340 1340 1451 1352 1352 1464 1353 1353 1465 1340 1340 1451 1353 1353 1465 1341 1341 1452 1341 1341 1452 1353 1353 1465 1354 1354 1466 1341 1341 1452 1354 1354 1466 1342 1342 1453 1342 1342 1453 1354 1354 1466 1355 1355 1467 1342 1342 1453 1355 1355 1467 1343 1343 1454 1343 1343 1454 1355 1355 1467 1344 1344 1468 1343 1343 1454 1344 1344 1468 1332 1332 1455 1344 1344 1456 1356 1356 1469 1357 1357 1470 1344 1344 1456 1357 1357 1470 1345 1345 1457 1345 1345 1457 1357 1357 1470 1358 1358 1471 1345 1345 1457 1358 1358 1471 1346 1346 1458 1346 1346 1458 1358 1358 1471 1359 1359 1472 1346 1346 1458 1359 1359 1472 1347 1347 1459 1347 1347 1459 1359 1359 1472 1360 1360 1473 1347 1347 1459 1360 1360 1473 1348 1348 1460 1348 1348 1460 1360 1360 1473 1361 1361 1474 1348 1348 1460 1361 1361 1474 1349 1349 1461 1349 1349 1461 1361 1361 1474 1362 1362 1475 1349 1349 1461 1362 1362 1475 1350 1350 1462 1350 1350 1462 1362 1362 1475 1363 1363 1476 1350 1350 1462 1363 1363 1476 1351 1351 1463 1351 1351 1463 1363 1363 1476 1364 1364 1477 1351 1351 1463 1364 1364 1477 1352 1352 1464 1352 1352 1464 1364 1364 1477 1365 1365 1478 1352 1352 1464 1365 1365 1478 1353 1353 1465 1353 1353 1465 1365 1365 1478 1366 1366 1479 1353 1353 1465 1366 1366 1479 1354 1354 1466 1354 1354 1466 1366 1366 1479 1367 1367 1480 1354 1354 1466 1367 1367 1480 1355 1355 1467 1355 1355 1467 1367 1367 1480 1356 1356 1481 1355 1355 1467 1356 1356 1481 1344 1344 1468 1356 1356 1469 1368 1368 1482 1369 1369 1483 1356 1356 1469 1369 1369 1483 1357 1357 1470 1357 1357 1470 1369 1369 1483 1370 1370 1484 1357 1357 1470 1370 1370 1484 1358 1358 1471 1358 1358 1471 1370 1370 1484 1371 1371 1485 1358 1358 1471 1371 1371 1485 1359 1359 1472 1359 1359 1472 1371 1371 1485 1372 1372 1486 1359 1359 1472 1372 1372 1486 1360 1360 1473 1360 1360 1473 1372 1372 1486 1373 1373 1487 1360 1360 1473 1373 1373 1487 1361 1361 1474 1361 1361 1474 1373 1373 1487 1374 1374 1488 1361 1361 1474 1374 1374 1488 1362 1362 1475 1362 1362 1475 1374 1374 1488 1375 1375 1489 1362 1362 1475 1375 1375 1489 1363 1363 1476 1363 1363 1476 1375 1375 1489 1376 1376 1490 1363 1363 1476 1376 1376 1490 1364 1364 1477 1364 1364 1477 1376 1376 1490 1377 1377 1491 1364 1364 1477 1377 1377 1491 1365 1365 1478 1365 1365 1478 1377 1377 1491 1378 1378 1492 1365 1365 1478 1378 1378 1492 1366 1366 1479 1366 1366 1479 1378 1378 1492 1379 1379 1493 1366 1366 1479 1379 1379 1493 1367 1367 1480 1367 1367 1480 1379 1379 1493 1368 1368 1494 1367 1367 1480 1368 1368 1494 1356 1356 1481 1368 1368 1482 1380 1380 1495 1381 1381 1496 1368 1368 1482 1381 1381 1496 1369 1369 1483 1369 1369 1483 1381 1381 1496 1382 1382 1497 1369 1369 1483 1382 1382 1497 1370 1370 1484 1370 1370 1484 1382 1382 1497 1383 1383 1498 1370 1370 1484 1383 1383 1498 1371 1371 1485 1371 1371 1485 1383 1383 1498 1384 1384 1499 1371 1371 1485 1384 1384 1499 1372 1372 1486 1372 1372 1486 1384 1384 1499 1385 1385 1500 1372 1372 1486 1385 1385 1500 1373 1373 1487 1373 1373 1487 1385 1385 1500 1386 1386 1501 1373 1373 1487 1386 1386 1501 1374 1374 1488 1374 1374 1488 1386 1386 1501 1387 1387 1502 1374 1374 1488 1387 1387 1502 1375 1375 1489 1375 1375 1489 1387 1387 1502 1388 1388 1503 1375 1375 1489 1388 1388 1503 1376 1376 1490 1376 1376 1490 1388 1388 1503 1389 1389 1504 1376 1376 1490 1389 1389 1504 1377 1377 1491 1377 1377 1491 1389 1389 1504 1390 1390 1505 1377 1377 1491 1390 1390 1505 1378 1378 1492 1378 1378 1492 1390 1390 1505 1391 1391 1506 1378 1378 1492 1391 1391 1506 1379 1379 1493 1379 1379 1493 1391 1391 1506 1380 1380 1507 1379 1379 1493 1380 1380 1507 1368 1368 1494 1380 1380 1495 1392 1392 1508 1393 1393 1509 1380 1380 1495 1393 1393 1509 1381 1381 1496 1381 1381 1496 1393 1393 1509 1394 1394 1510 1381 1381 1496 1394 1394 1510 1382 1382 1497 1382 1382 1497 1394 1394 1510 1395 1395 1511 1382 1382 1497 1395 1395 1511 1383 1383 1498 1383 1383 1498 1395 1395 1511 1396 1396 1512 1383 1383 1498 1396 1396 1512 1384 1384 1499 1384 1384 1499 1396 1396 1512 1397 1397 1513 1384 1384 1499 1397 1397 1513 1385 1385 1500 1385 1385 1500 1397 1397 1513 1398 1398 1514 1385 1385 1500 1398 1398 1514 1386 1386 1501 1386 1386 1501 1398 1398 1514 1399 1399 1515 1386 1386 1501 1399 1399 1515 1387 1387 1502 1387 1387 1502 1399 1399 1515 1400 1400 1516 1387 1387 1502 1400 1400 1516 1388 1388 1503 1388 1388 1503 1400 1400 1516 1401 1401 1517 1388 1388 1503 1401 1401 1517 1389 1389 1504 1389 1389 1504 1401 1401 1517 1402 1402 1518 1389 1389 1504 1402 1402 1518 1390 1390 1505 1390 1390 1505 1402 1402 1518 1403 1403 1519 1390 1390 1505 1403 1403 1519 1391 1391 1506 1391 1391 1506 1403 1403 1519 1392 1392 1520 1391 1391 1506 1392 1392 1520 1380 1380 1507 1392 1392 1508 1404 1404 1521 1405 1405 1522 1392 1392 1508 1405 1405 1522 1393 1393 1509 1393 1393 1509 1405 1405 1522 1406 1406 1523 1393 1393 1509 1406 1406 1523 1394 1394 1510 1394 1394 1510 1406 1406 1523 1407 1407 1524 1394 1394 1510 1407 1407 1524 1395 1395 1511 1395 1395 1511 1407 1407 1524 1408 1408 1525 1395 1395 1511 1408 1408 1525 1396 1396 1512 1396 1396 1512 1408 1408 1525 1409 1409 1526 1396 1396 1512 1409 1409 1526 1397 1397 1513 1397 1397 1513 1409 1409 1526 1410 1410 1527 1397 1397 1513 1410 1410 1527 1398 1398 1514 1398 1398 1514 1410 1410 1527 1411 1411 1528 1398 1398 1514 1411 1411 1528 1399 1399 1515 1399 1399 1515 1411 1411 1528 1412 1412 1529 1399 1399 1515 1412 1412 1529 1400 1400 1516 1400 1400 1516 1412 1412 1529 1413 1413 1530 1400 1400 1516 1413 1413 1530 1401 1401 1517 1401 1401 1517 1413 1413 1530 1414 1414 1531 1401 1401 1517 1414 1414 1531 1402 1402 1518 1402 1402 1518 1414 1414 1531 1415 1415 1532 1402 1402 1518 1415 1415 1532 1403 1403 1519 1403 1403 1519 1415 1415 1532 1404 1404 1533 1403 1403 1519 1404 1404 1533 1392 1392 1520 1404 1404 1521 1416 1416 1534 1417 1417 1535 1404 1404 1521 1417 1417 1535 1405 1405 1522 1405 1405 1522 1417 1417 1535 1418 1418 1536 1405 1405 1522 1418 1418 1536 1406 1406 1523 1406 1406 1523 1418 1418 1536 1419 1419 1537 1406 1406 1523 1419 1419 1537 1407 1407 1524 1407 1407 1524 1419 1419 1537 1420 1420 1538 1407 1407 1524 1420 1420 1538 1408 1408 1525 1408 1408 1525 1420 1420 1538 1421 1421 1539 1408 1408 1525 1421 1421 1539 1409 1409 1526 1409 1409 1526 1421 1421 1539 1422 1422 1540 1409 1409 1526 1422 1422 1540 1410 1410 1527 1410 1410 1527 1422 1422 1540 1423 1423 1541 1410 1410 1527 1423 1423 1541 1411 1411 1528 1411 1411 1528 1423 1423 1541 1424 1424 1542 1411 1411 1528 1424 1424 1542 1412 1412 1529 1412 1412 1529 1424 1424 1542 1425 1425 1543 1412 1412 1529 1425 1425 1543 1413 1413 1530 1413 1413 1530 1425 1425 1543 1426 1426 1544 1413 1413 1530 1426 1426 1544 1414 1414 1531 1414 1414 1531 1426 1426 1544 1427 1427 1545 1414 1414 1531 1427 1427 1545 1415 1415 1532 1415 1415 1532 1427 1427 1545 1416 1416 1546 1415 1415 1532 1416 1416 1546 1404 1404 1533 1416 1416 1534 1428 1428 1547 1429 1429 1548 1416 1416 1534 1429 1429 1548 1417 1417 1535 1417 1417 1535 1429 1429 1548 1430 1430 1549 1417 1417 1535 1430 1430 1549 1418 1418 1536 1418 1418 1536 1430 1430 1549 1431 1431 1550 1418 1418 1536 1431 1431 1550 1419 1419 1537 1419 1419 1537 1431 1431 1550 1432 1432 1551 1419 1419 1537 1432 1432 1551 1420 1420 1538 1420 1420 1538 1432 1432 1551 1433 1433 1552 1420 1420 1538 1433 1433 1552 1421 1421 1539 1421 1421 1539 1433 1433 1552 1434 1434 1553 1421 1421 1539 1434 1434 1553 1422 1422 1540 1422 1422 1540 1434 1434 1553 1435 1435 1554 1422 1422 1540 1435 1435 1554 1423 1423 1541 1423 1423 1541 1435 1435 1554 1436 1436 1555 1423 1423 1541 1436 1436 1555 1424 1424 1542 1424 1424 1542 1436 1436 1555 1437 1437 1556 1424 1424 1542 1437 1437 1556 1425 1425 1543 1425 1425 1543 1437 1437 1556 1438 1438 1557 1425 1425 1543 1438 1438 1557 1426 1426 1544 1426 1426 1544 1438 1438 1557 1439 1439 1558 1426 1426 1544 1439 1439 1558 1427 1427 1545 1427 1427 1545 1439 1439 1558 1428 1428 1559 1427 1427 1545 1428 1428 1559 1416 1416 1546 1428 1428 1547 0 0 1560 1 3 1561 1428 1428 1547 1 3 1561 1429 1429 1548 1429 1429 1548 1 3 1561 2 5 1562 1429 1429 1548 2 5 1562 1430 1430 1549 1430 1430 1549 2 5 1562 3 7 1563 1430 1430 1549 3 7 1563 1431 1431 1550 1431 1431 1550 3 7 1563 4 9 1564 1431 1431 1550 4 9 1564 1432 1432 1551 1432 1432 1551 4 9 1564 5 11 1565 1432 1432 1551 5 11 1565 1433 1433 1552 1433 1433 1552 5 11 1565 6 13 1566 1433 1433 1552 6 13 1566 1434 1434 1553 1434 1434 1553 6 13 1566 7 15 1567 1434 1434 1553 7 15 1567 1435 1435 1554 1435 1435 1554 7 15 1567 8 17 1568 1435 1435 1554 8 17 1568 1436 1436 1555 1436 1436 1555 8 17 1568 9 19 1569 1436 1436 1555 9 19 1569 1437 1437 1556 1437 1437 1556 9 19 1569 10 21 1570 1437 1437 1556 10 21 1570 1438 1438 1557 1438 1438 1557 10 21 1570 11 23 1571 1438 1438 1557 11 23 1571 1439 1439 1558 1439 1439 1558 11 23 1571 0 0 1572 1439 1439 1558 0 0 1572 1428 1428 1559</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-1_max" name="Torus_Knot-1_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-1_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-2.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-2.dae
new file mode 100644
index 0000000..f06ef59
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-2.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-2.max</source_data>
+ </contributor>
+ <created>2008-10-31T16:02:11Z</created>
+ <modified>2008-10-31T16:02:12Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="4320">25.477133 -0.002018 19.977411 28.316290 -4.371233 23.556599 29.657873 -7.569179 26.913568 29.142408 -8.738970 29.148823 26.908012 -7.567160 29.663429 23.553392 -4.367737 28.319496 19.977413 0.002017 25.477135 17.138256 4.371231 21.897947 15.796671 7.569177 18.540979 16.312134 8.738970 16.305723 18.546528 7.567163 15.791115 21.901148 4.367742 17.135044 26.968250 2.319252 21.315863 30.205357 -1.341455 25.326075 31.868971 -3.957439 29.025393 31.513329 -4.827750 31.422590 29.233727 -3.719189 31.875340 25.640980 -0.928794 30.262327 21.697763 2.795751 27.015759 18.460657 6.456457 23.005547 16.797043 9.072441 19.306231 17.152681 9.942754 16.909031 19.432281 8.834195 16.456280 23.025028 6.043802 18.069290 28.357008 4.988758 22.206573 32.092251 2.284904 26.530756 34.158497 0.441848 30.484200 34.002094 -0.046562 33.007584 31.664957 0.950540 33.424770 27.773314 3.165983 31.623974 23.369930 6.006141 28.087717 19.634687 8.709995 23.763535 17.568439 10.553051 19.810091 17.724838 11.041462 17.286705 20.061975 10.044362 16.869516 23.953617 7.828919 18.670311 29.557436 8.030107 22.505615 33.846058 6.521844 26.898144 36.363289 5.637204 30.920197 36.434643 5.613225 33.494064 34.040997 6.456332 33.930088 29.823732 7.940616 32.111435 24.912857 9.668364 28.525408 20.624237 11.176626 24.132881 18.107004 12.061267 20.110828 18.035648 12.085247 17.536957 20.429289 11.242140 17.100929 24.646553 9.757856 18.919582 30.463106 11.442386 22.055658 35.264442 11.264678 26.163822 38.208237 11.448579 29.984324 38.505699 11.944813 32.493458 36.077129 12.620415 33.018902 31.573261 13.294355 31.419868 26.200899 13.786056 28.124817 21.399565 13.963763 24.016651 18.455770 13.779863 20.196152 18.158302 13.283628 17.687019 20.586870 12.608027 17.161572 25.090738 11.934086 18.760603 30.945921 15.192908 20.691792 36.118904 16.296526 24.153536 39.385708 17.520578 27.489048 39.870991 18.537088 29.804581 37.444721 19.073679 30.479687 32.757019 18.986570 29.333475 27.063950 18.299107 26.673069 21.890965 17.195492 23.211327 18.624163 15.971437 19.875816 18.138878 14.954928 17.560282 20.565144 14.418338 16.885174 25.252844 14.505445 18.031384 30.853916 19.195019 18.257629 36.213638 21.363714 20.813316 39.662113 23.469360 23.453434 40.275326 24.947754 25.470564 37.888962 25.402756 26.324217 33.142448 24.712450 25.785658 27.307611 23.061806 23.999193 21.947889 20.893110 21.443504 18.499413 18.787464 18.803389 17.886200 17.309072 16.786259 20.272560 16.854069 15.932604 25.019070 17.544373 16.471161 30.025459 23.272793 14.656176 35.404984 26.218857 16.186813 38.903805 28.988106 18.026773 39.584419 30.838524 19.683031 37.264458 31.274290 20.711803 32.565552 30.178640 20.837423 26.746771 27.845156 20.026237 21.367249 24.899092 18.495598 17.868425 22.129843 16.655640 17.187807 20.279425 14.999380 19.507765 19.843658 13.970611 24.206669 20.939304 13.844987 28.329855 27.153845 9.921474 33.603813 30.604673 10.409883 37.051445 33.826748 11.423808 37.748959 35.956707 12.691568 35.509453 36.423840 13.873468 30.933006 35.102974 14.652819 25.245872 32.348030 14.820794 19.971912 28.897203 14.332385 16.524282 25.675133 13.318460 15.826767 23.545170 12.050700 18.066269 23.078037 10.868800 22.642714 24.398901 10.089449 25.722780 30.503351 4.276375 30.798662 34.234432 3.751136 34.117779 37.733009 3.949566 34.790779 40.061638 4.818495 32.637329 40.596363 6.125095 28.234447 39.193913 7.519262 22.761883 36.230064 8.627432 17.686001 32.498985 9.152671 14.366883 29.000408 8.954241 13.693882 26.671778 8.085312 15.847328 26.137049 6.778713 20.250208 27.539499 5.384546 22.288839 32.998806 -1.866579 27.088953 36.828255 -3.368448 30.212879 40.458393 -3.967744 30.823563 42.916519 -3.503887 28.757372 43.543980 -2.101167 24.567942 42.172653 -0.135441 19.377827 39.169983 1.866575 14.577712 35.340527 3.368444 11.453787 31.710394 3.967741 10.843101 29.252268 3.503885 12.909289 28.624804 2.101165 17.098717 29.996130 0.135440 18.247540 34.415554 -7.972891 22.692532 38.184559 -10.421992 25.551991 41.817783 -11.807312 26.059731 44.341709 -11.757656 24.079699 45.080055 -10.286328 20.142448 43.834984 -7.787571 15.302959 40.940105 -4.930924 10.857970 37.171104 -2.481823 7.998509 33.537880 -1.096502 7.490769 31.013950 -1.146158 9.470797 30.275600 -2.617484 13.408045 31.520672 -5.116240 13.912412 34.689453 -13.506830 17.909201 38.239796 -16.880577 20.422070 41.745834 -19.046024 20.777697 44.268120 -19.422939 18.880791 45.130817 -17.910330 15.239630 44.102764 -14.913500 10.829858 41.459431 -11.235446 6.833069 37.909088 -7.861699 4.320200 34.403049 -5.696253 3.964571 31.880760 -5.319335 5.861473 31.018061 -6.831942 9.502633 32.046112 -9.828772 9.619333 33.927425 -18.054348 13.056349 37.081493 -22.320517 15.122888 40.310879 -25.252483 15.265223 42.750271 -26.064631 13.445214 43.746037 -24.539345 10.150535 43.031361 -21.085323 6.263989 40.797741 -16.628069 2.826974 37.643677 -12.361901 0.760435 34.414291 -9.429932 0.618098 31.974897 -8.617785 2.438104 30.979130 -10.143068 5.732782 31.693802 -13.597088 5.654198 32.364838 -21.399857 8.410243 34.916275 -26.484715 9.919551 37.690811 -30.134356 9.777703 39.945015 -31.370861 8.022710 41.074863 -29.862911 5.124819 40.777618 -26.014559 1.860519 39.132935 -20.856968 -0.895526 36.581497 -15.772109 -2.404834 33.806961 -12.122467 -2.262989 31.552761 -10.885958 -0.507997 30.422913 -12.393908 2.389893 30.720150 -16.242258 2.200311 30.288651 -23.539001 4.172174 32.018063 -29.290724 5.026107 34.142418 -33.539711 4.533297 36.092499 -35.147442 2.825794 37.345779 -33.683136 0.361121 37.566444 -29.539146 -2.200314 36.695374 -23.825855 -4.172177 34.965961 -18.074135 -5.026110 32.841610 -13.825150 -4.533301 30.891529 -12.217415 -2.825799 29.638245 -13.681719 -0.361127 29.417578 -17.825705 -0.681908 27.952492 -24.628099 0.465314 28.682333 -30.801643 0.619227 29.991213 -35.444820 -0.261411 31.528425 -37.313492 -1.940632 32.882065 -35.906956 -3.968492 33.689434 -31.602087 -5.801626 33.734192 -25.552376 -6.948848 33.004353 -19.378834 -7.102761 31.695469 -14.735658 -6.222126 30.158262 -12.866980 -4.542905 28.804619 -14.273516 -2.515045 27.997252 -18.578381 -3.035895 25.517643 -24.889339 -2.664178 25.182703 -31.191010 -3.173943 25.605589 -35.971939 -4.428598 26.672989 -37.951073 -6.091959 28.098890 -36.598110 -7.718331 29.501230 -32.275574 -8.871928 30.504248 -26.141687 -9.243646 30.839184 -19.840017 -8.733881 30.416298 -15.059092 -7.479227 29.348902 -13.079952 -5.815866 27.922998 -14.432911 -4.189494 26.520660 -18.755444 -4.952910 23.055527 -24.519640 -5.244713 21.723440 -30.692307 -6.320560 21.308731 -35.379154 -7.892178 21.922523 -37.324341 -9.538454 23.400349 -36.006660 -10.818269 25.346228 -31.779179 -11.388699 27.238762 -25.774652 -11.096895 28.570848 -19.601988 -10.021049 28.985558 -14.915142 -8.449431 28.371767 -12.969952 -6.803156 26.893942 -14.287631 -5.523340 24.948065 -18.515106 -6.518570 20.597672 -23.655235 -7.345964 18.422583 -29.532806 -8.871548 17.300312 -33.972294 -10.686543 17.531570 -35.784142 -12.304621 19.054392 -34.482864 -13.292221 21.460739 -30.417145 -13.384716 24.105831 -24.676384 -12.557323 26.280918 -18.798817 -11.031739 27.403191 -14.359328 -9.216745 27.171934 -12.547478 -7.598667 25.649113 -13.848751 -6.611066 23.242767 -17.914469 -7.793983 18.176619 -22.390102 -9.042483 15.329926 -27.894556 -10.912934 13.649472 -32.014439 -12.904151 13.585536 -33.645836 -14.482589 15.155248 -32.351608 -15.225305 17.938004 -28.478548 -14.933291 21.188168 -23.064442 -13.684792 24.034861 -17.559990 -11.814341 25.715315 -13.440105 -9.823125 25.779253 -11.808710 -8.244687 24.209543 -13.102933 -7.501969 21.426788 -16.975988 -8.823277 15.829939 -20.797598 -10.388645 12.460699 -25.912210 -12.512224 10.352274 -29.699150 -14.625004 10.069614 -31.143707 -16.160866 11.688461 -29.858816 -16.708277 14.775043 -26.188761 -16.120560 18.502312 -21.116932 -14.555194 21.871552 -16.002319 -12.431616 23.979977 -12.215382 -10.318836 24.262638 -10.770822 -8.782974 22.643793 -12.055710 -8.235561 19.557215 -15.725762 -9.640692 13.593333 -18.942230 -11.419758 9.814666 -23.687544 -13.711881 7.374357 -27.164183 -15.902889 6.926284 -28.440580 -17.405704 8.590509 -27.174726 -17.817648 11.921103 -23.705811 -17.028339 16.025637 -18.963320 -15.249274 19.804304 -14.218005 -12.957152 22.244614 -10.741368 -10.766143 22.692688 -9.464968 -9.263328 21.028465 -10.730818 -8.851383 17.697872 -14.199734 -10.276514 11.489870 -16.882341 -12.166037 7.381869 -21.299969 -14.547107 4.673702 -24.508129 -16.781717 4.091023 -25.647198 -18.271109 5.789961 -24.411961 -18.616198 9.315283 -21.133402 -17.724518 13.722385 -16.690006 -15.834996 17.830387 -12.272377 -13.453927 20.538553 -9.064218 -11.219316 21.121235 -7.925148 -9.729924 19.422300 -9.160382 -9.384834 15.896979 -12.438939 -10.758936 9.528566 -14.669413 -12.659042 5.146857 -18.810867 -15.055119 2.210816 -21.799919 -17.305138 1.507154 -22.835653 -18.806211 3.224412 -21.640547 -19.156124 6.902456 -18.534826 -18.261122 11.555756 -14.350669 -16.361017 15.937464 -10.209215 -13.964941 18.873507 -7.220163 -11.714921 19.577171 -6.184426 -10.213848 17.859915 -7.379531 -9.863933 14.181873 -10.485250 -11.114755 7.705402 -12.345623 -12.932881 3.091652 -16.265972 -15.276747 -0.046241 -19.086590 -17.518316 -0.867481 -20.051685 -19.056959 0.847982 -18.902670 -19.480402 4.640491 -15.947417 -18.675180 9.493846 -11.977787 -16.857056 14.107595 -8.057437 -14.513191 17.245487 -5.236822 -12.271623 18.066730 -4.271722 -10.732978 16.351273 -5.420737 -10.309534 12.558764 -8.375987 -11.368921 6.006227 -9.946047 -13.026557 1.194614 -13.695988 -15.261241 -2.126122 -16.393181 -17.474192 -3.066193 -17.314915 -19.072449 -1.373706 -16.214214 -19.627764 2.497834 -13.386011 -18.991339 7.511055 -9.588119 -17.333704 12.322666 -5.838179 -15.099021 15.643402 -3.140986 -12.886071 16.583475 -2.219249 -11.287812 14.890993 -3.319947 -10.732496 11.019454 -6.148149 -11.542978 4.411149 -7.495147 -12.974364 -0.564006 -11.122872 -15.051477 -4.048648 -13.737985 -17.217756 -5.109073 -14.639767 -18.892750 -3.461138 -13.586588 -19.627644 0.453592 -10.860645 -19.225525 5.586168 -7.192354 -17.794140 10.561322 -3.564630 -15.717028 14.045965 -0.949516 -13.550748 15.106391 -0.047733 -11.875754 13.458460 -1.100910 -11.140860 9.543732 -3.826851 -11.654559 2.895715 -5.012090 -12.810739 -2.207637 -8.558985 -14.693115 -5.835466 -11.126370 -16.797308 -7.015697 -12.026316 -18.559502 -5.432087 -11.017683 -19.507515 -1.508968 -8.370735 -19.387333 3.702468 -4.794719 -18.231153 8.805820 -1.247824 -16.348778 12.433649 1.319561 -14.244584 13.613883 2.219509 -12.482391 12.030277 1.210878 -11.534376 8.107159 -1.436069 -11.716360 1.434428 -2.510548 -12.563766 -3.758718 -6.014052 -14.224574 -7.505396 -8.563578 -16.253771 -8.801683 -9.475980 -18.107635 -7.300242 -8.506782 -19.289425 -3.403385 -5.915680 -19.482481 1.844731 -2.396958 -18.635075 7.037878 1.106547 -16.974268 10.784555 3.656073 -14.945072 12.080845 4.568476 -13.091208 10.579407 3.599280 -11.909417 6.682552 1.008179 -11.736110 0.000248 -0.000379 -12.257125 -5.242002 -3.494484 -13.680559 -9.079659 -6.052253 -15.625006 -10.484423 -6.988334 -17.569450 -9.079888 -6.051903 -18.992880 -5.242403 -3.493879 -19.513891 -0.000215 0.000319 -18.992876 5.242034 3.494424 -17.569443 9.079690 6.052192 -15.624996 10.484457 6.988275 -13.680552 9.079926 6.051847 -12.257120 5.242443 3.493824 -11.716375 -1.433929 2.509698 -11.909535 -6.681782 -1.009414 -13.091398 -10.578572 -3.600586 -14.945284 -12.080157 -4.569518 -16.974445 -10.784189 -3.656583 -18.635170 -7.037922 -1.106404 -19.482470 -1.845165 2.397702 -19.289310 3.402687 5.916813 -18.107449 7.299478 8.507986 -16.253563 8.801065 9.476919 -14.224401 7.505100 8.563987 -12.563676 3.758836 6.013809 -11.654572 -2.895365 5.011216 -11.534764 -8.106243 1.434372 -12.483052 -12.029041 -1.212959 -14.245341 -13.612646 -2.221427 -16.349428 -12.432734 -1.320815 -18.231525 -8.805461 1.247559 -19.387325 -3.702752 4.795502 -19.507132 1.508126 8.372345 -18.558846 5.430923 11.019676 -16.796556 7.014531 12.028147 -14.692471 5.834621 11.127536 -12.810373 2.207350 8.559163 -11.542967 -4.410938 7.494033 -11.141715 -9.542624 3.824398 -11.877248 -13.456747 1.097756 -13.552481 -15.104524 0.044710 -15.718536 -14.044432 0.947423 -17.795021 -10.560524 3.564011 -19.225544 -5.586309 7.193363 -19.626797 -0.454625 10.862997 -18.891264 3.459500 13.589640 -17.216032 5.107278 14.642687 -15.049977 4.047189 13.739977 -12.973492 0.563283 11.123390 -11.368857 -6.006216 9.944656 -10.733959 -11.018240 6.144928 -11.290411 -14.888899 3.315737 -12.889111 -16.581051 2.215164 -15.101687 -15.641285 3.138106 -17.335285 -12.321413 5.837260 -18.991409 -7.510991 9.589393 -19.626308 -2.498967 13.389120 -19.069857 1.371691 16.218311 -17.471159 3.063845 17.318886 -15.258583 2.124082 16.395947 -13.024985 -1.195787 13.696793 -11.114578 -7.705835 12.344072 -10.311825 -12.557673 8.372086 -10.737122 -16.348944 5.415510 -12.276513 -18.063780 4.266559 -14.517519 -17.242695 5.233093 -16.859665 -14.105694 8.056129 -18.675373 -9.493336 11.979235 -19.478127 -4.641499 15.951221 -19.052830 -0.850228 18.907797 -17.513439 0.864611 20.056749 -15.272435 0.043527 19.090218 -12.930289 -3.093471 16.267185 -10.758725 -9.528978 14.667030 -9.867362 -14.180251 10.479840 -10.220000 -17.856689 7.372526 -11.722152 -19.573195 6.177691 -13.971314 -18.869829 7.215489 -16.364828 -15.935063 10.207844 -18.261351 -11.555263 14.352954 -19.152714 -6.903991 18.540142 -18.800077 -3.227554 21.647457 -17.297928 -1.511046 22.842295 -15.048765 -2.214408 21.804497 -12.655252 -5.149172 18.812147 -10.276311 -11.490316 16.879604 -9.389086 -15.895103 12.433022 -9.737492 -19.418598 9.152847 -11.228175 -21.116688 7.918005 -13.461709 -20.534367 9.059368 -15.839619 -17.827669 12.271111 -17.724745 -13.721852 16.692646 -18.611971 -9.317067 21.139229 -18.263565 -5.793571 24.419401 -16.772882 -4.095481 25.654245 -14.539351 -4.677800 24.512884 -12.161441 -7.384494 21.301146 -9.640656 -13.593473 18.939089 -8.856450 -17.695282 14.193394 -9.272142 -21.023830 10.722960 -10.776349 -22.687237 9.457684 -12.966019 -22.239792 10.736599 -15.254430 -19.801392 14.217018 -17.028406 -16.025400 18.966366 -17.812613 -11.923594 23.712061 -17.396919 -8.595046 27.182495 -15.892714 -6.931639 28.447773 -13.703046 -7.379080 27.168861 -11.414634 -9.817478 23.688444 -8.823529 -15.829748 20.793516 -8.242869 -19.553055 15.717962 -8.795385 -22.636770 12.046265 -10.333032 -24.254620 10.762252 -12.443797 -23.973097 12.209972 -14.562102 -21.867640 16.001513 -16.120350 -18.502403 21.120930 -16.701010 -14.779097 26.196484 -16.148495 -11.695381 29.868179 -14.610850 -10.077530 31.152197 -12.500086 -10.359051 29.704479 -10.381780 -12.464506 25.912941 -7.795019 -18.175175 22.385628 -7.510939 -21.420115 16.967964 -8.259194 -24.199421 13.093494 -9.839290 -25.768379 11.800377 -11.827840 -25.706585 13.435102 -13.692014 -24.030602 17.559650 -14.932308 -21.189505 23.068844 -15.216389 -17.944565 28.486509 -14.468134 -15.165258 32.360977 -12.888040 -13.596300 33.654099 -10.899490 -13.658091 32.019375 -9.035316 -15.334072 27.894833 -6.520520 -20.595066 23.651096 -6.621703 -23.233715 17.907516 -7.615150 -25.636026 13.840834 -9.234668 -27.158302 12.540712 -11.046308 -27.392649 14.355518 -12.564642 -26.276278 18.798977 -13.382834 -24.108316 24.680464 -13.281651 -21.469666 30.424044 -12.288205 -19.067356 34.490726 -10.668689 -17.545078 35.790852 -8.857049 -17.310730 33.976048 -7.338714 -18.427101 29.532593 -4.956114 -23.051601 24.516304 -5.536617 -24.936043 18.510199 -6.822959 -26.877031 14.282452 -8.470469 -28.354477 12.965888 -10.037695 -28.972504 14.913276 -11.104702 -28.565510 19.602818 -11.385585 -27.242548 25.777950 -10.805083 -25.358110 31.784058 -9.518741 -23.417122 36.011803 -7.871233 -21.939674 37.328373 -6.304006 -21.321648 35.380985 -5.236999 -21.728642 30.691448 -3.040195 -25.512951 24.888014 -4.203731 -26.507599 18.754639 -5.836244 -27.905046 14.432835 -7.500301 -29.330853 13.080624 -8.750021 -30.402969 15.060333 -9.250542 -30.834127 19.841496 -8.867749 -30.508797 26.143007 -7.704213 -29.514151 32.276379 -6.071701 -28.116701 36.598183 -4.407643 -26.690897 37.950397 -3.157924 -25.618778 35.970692 -2.657402 -25.187620 31.189531 -0.686827 -27.948034 24.628767 -2.530377 -27.984747 18.582163 -4.564564 -28.787399 14.279398 -6.244329 -30.140921 12.873394 -7.119580 -31.682636 14.740888 -6.955795 -32.999443 19.381483 -5.796861 -33.738506 25.551741 -3.953311 -33.701794 31.598341 -1.919125 -32.899143 35.901108 -0.239359 -31.545624 37.307114 0.635893 -30.003910 35.439625 0.472109 -28.687099 30.799030 2.195147 -30.285002 23.541412 -0.377654 -29.406700 17.834337 -2.849289 -29.623037 13.694269 -4.557485 -30.876045 12.230534 -5.044532 -32.829979 13.835341 -4.179927 -34.961285 18.078678 -2.195339 -36.698887 23.823553 0.377462 -37.577187 29.530628 2.849097 -37.360847 33.670696 4.557293 -36.107845 35.134434 5.044341 -34.153908 33.529629 4.179738 -32.022602 29.286293 5.649614 -32.362553 21.403332 2.374993 -30.713007 16.253839 -0.529256 -30.412807 12.410510 -2.284940 -31.542391 10.903162 -2.421623 -33.799088 12.135689 -0.902686 -36.578217 15.777834 1.864877 -39.135113 20.853687 5.139498 -40.784660 26.003178 8.043746 -41.084858 29.846508 9.799431 -39.955273 31.353857 9.936116 -37.698582 30.121334 8.417180 -34.919456 26.479191 9.615621 -33.926392 18.058086 5.720701 -31.690481 13.609297 2.420851 -30.974394 10.160503 0.600265 -31.970011 8.635809 0.746766 -34.410553 9.443754 2.821098 -37.642082 12.367848 6.267447 -40.798706 16.624584 10.162367 -43.034618 21.073372 13.462215 -43.750702 24.522163 15.282804 -42.755089 26.046860 15.136305 -40.314545 25.238918 13.061975 -37.083023 22.314825 13.909377 -34.689327 13.510557 9.492887 -32.045708 9.840773 5.847585 -31.017483 6.849037 3.950227 -31.880163 5.336987 4.309208 -34.402588 5.709774 6.828338 -37.908886 7.867509 10.832621 -41.459538 11.232029 15.249109 -44.103153 14.901814 18.894411 -45.131382 17.893549 20.791771 -44.268707 19.405602 20.432793 -41.746277 19.032814 17.913664 -38.239983 16.875082 18.245218 -34.416096 7.976294 13.399714 -31.522604 5.128447 9.458646 -30.278412 2.635272 7.478020 -31.016895 1.164816 7.988544 -33.540180 1.111085 10.853419 -37.172150 2.488475 15.305009 -40.939625 4.927917 20.150513 -43.833115 7.775764 24.091579 -45.077309 10.268938 26.072206 -44.338829 11.739395 25.561687 -41.815544 11.793128 22.696814 -38.183578 10.415739 22.286991 -32.999863 1.869779 17.091703 -30.000185 -0.123289 12.898947 -28.630783 -2.083262 10.832171 -29.258589 -3.484967 11.445166 -31.715382 -3.952817 14.573678 -35.342865 -3.361453 19.379427 -39.169060 -1.869331 24.574715 -42.168739 0.123737 28.767469 -43.538139 2.083710 30.834248 -42.910336 3.485414 30.221256 -40.453545 3.953265 27.092747 -36.826057 3.361903 25.721077 -30.505180 -4.272814 20.244301 -27.545837 -5.372193 15.838768 -26.146219 -6.760825 13.684937 -26.681358 -8.066626 14.359924 -29.007858 -8.939707 17.682865 -32.502338 -9.146128 22.763384 -36.228451 -8.630578 28.240158 -39.187798 -7.531199 32.645691 -40.587414 -6.142567 34.799526 -40.052280 -4.836766 34.124542 -37.725784 -3.963684 30.801601 -34.231304 -3.757263 28.328547 -27.156366 -9.917988 22.638056 -24.407833 -10.077043 18.059484 -23.091019 -10.850748 15.819655 -23.558758 -12.031791 16.518730 -25.685726 -13.303711 19.969391 -28.902000 -14.325700 25.247036 -32.345783 -14.823915 30.937525 -35.094318 -14.664861 35.516098 -36.411133 -13.891157 37.755928 -35.943394 -12.710114 37.056858 -33.816425 -11.438192 33.606201 -30.600157 -10.416204 30.024780 -23.275375 -14.653544 24.203722 -20.950659 -13.833543 19.503323 -19.860779 -13.953369 17.183050 -20.297768 -14.980917 17.864620 -22.144535 -16.640854 21.365404 -24.906240 -18.488403 26.747370 -27.842888 -20.028515 32.568428 -30.167604 -20.848518 37.268826 -31.257484 -20.728691 39.589100 -30.820496 -19.701145 38.907536 -28.973730 -18.041208 35.406754 -26.212025 -16.193657 30.853533 -19.199026 -18.254688 25.017843 -17.560530 -16.459841 20.270807 -16.878090 -15.915896 17.884390 -17.334562 -16.768610 18.498028 -18.807640 -18.789495 21.947298 -20.902607 -21.437056 27.307972 -23.058125 -24.001883 33.143658 -24.696621 -25.796734 37.890697 -25.379063 -26.340675 40.277115 -24.922590 -25.487965 39.663483 -23.449514 -23.467081 36.214214 -21.354546 -20.819519 30.945978 -15.197793 -20.689295 25.253965 -14.525350 -18.022793 20.567026 -14.447972 -16.872766 18.141022 -14.986396 -17.547363 18.625998 -15.996349 -19.865826 21.892004 -17.207216 -23.206924 27.063919 -18.294548 -26.675415 32.755932 -18.966991 -29.341917 37.442871 -19.044369 -30.491945 39.868877 -18.505947 -29.817348 39.383904 -17.495993 -27.498888 36.117901 -16.285126 -24.157791 30.463511 -11.447270 -22.054062 25.094158 -11.955453 -18.756603 20.592394 -12.640194 -17.156227 18.164463 -13.318016 -17.681755 18.460924 -13.807299 -20.192373 21.402342 -13.976939 -24.015358 26.200567 -13.781482 -28.126348 31.569916 -13.273299 -31.423807 36.071682 -12.588559 -33.024185 38.499615 -11.910737 -32.498661 38.203156 -11.421454 -29.988045 35.261742 -11.251813 -26.165060 29.557907 -8.035209 -22.504601 24.650877 -9.778354 -18.920759 20.436314 -11.272580 -17.103975 18.043507 -12.117512 -17.541061 18.113605 -12.086750 -20.114895 20.627829 -11.188539 -24.135818 24.912489 -9.663552 -28.526434 29.819519 -7.920409 -32.110279 34.034081 -6.426183 -33.927059 36.426891 -5.581250 -33.489975 36.356792 -5.612010 -30.916147 33.842575 -6.510220 -26.895222 28.357347 -4.992801 -22.206160 23.957401 -7.844313 -18.674759 20.068201 -10.067019 -16.877636 17.731855 -11.065349 -17.296328 17.574385 -10.571799 -19.818649 19.637983 -8.718617 -23.768740 23.369711 -6.002361 -28.088181 27.769653 -3.150850 -31.619579 31.658854 -0.928142 -33.416702 33.995201 0.070188 -32.998016 34.152676 -0.423360 -30.475698 32.089077 -2.276541 -26.525608 26.968445 -2.323997 -21.315649 23.027637 -6.057745 -18.076731 19.436621 -8.853638 -16.469393 17.157606 -9.962516 -16.924316 16.801252 -9.087259 -19.319607 18.463043 -6.462391 -23.013447 21.697704 -2.791242 -27.016075 25.638510 0.942505 -30.254992 29.229525 3.738397 -31.862333 31.508541 4.847278 -31.407412 31.864897 3.972022 -29.012123 30.203110 1.347156 -25.318285 25.477198 -0.002317 -19.977478 21.902439 -4.378234 -17.143072 18.548712 -7.581036 -15.804968 16.314646 -8.752532 -16.321709 15.798856 -7.578823 -18.554834 17.139549 -4.374403 -21.905979 19.977486 0.002106 -25.477207 23.552244 4.378023 -28.311611 26.905972 7.580825 -29.649717 29.140039 8.752324 -29.132978 29.655830 7.578617 -26.899855 28.315140 4.374199 -23.548712 23.948034 2.016864 -18.314423 20.651194 -2.805273 -15.897968 17.475233 -6.281468 -14.837171 15.271152 -7.480281 -15.416269 14.629532 -6.080487 -17.480097 15.722293 -2.457164 -20.475651 18.256630 2.418823 -23.600273 21.553471 7.240959 -26.016729 24.729429 10.717155 -27.077528 26.933512 11.915969 -26.498432 27.575134 10.516178 -24.434607 26.482376 6.892858 -21.439053 22.424330 3.790823 -16.422068 19.348829 -1.338436 -14.374284 16.311884 -4.998895 -13.553329 14.127242 -6.209732 -14.179176 13.380275 -4.646509 -16.084131 14.271132 -0.728090 -18.757761 16.561110 4.495589 -21.483671 19.636608 9.624848 -23.531456 22.673553 13.285305 -24.352409 24.858196 14.496146 -23.726564 25.605164 12.932926 -21.821609 24.714310 9.014510 -19.147980 20.931297 5.373355 -14.369696 18.054907 0.025251 -12.613113 15.141712 -3.769707 -11.974726 12.972302 -4.994664 -12.625587 12.127970 -3.321393 -14.391302 12.834950 0.801753 -16.798746 14.903811 6.269980 -19.202848 17.780201 11.618084 -20.959429 20.693396 15.413042 -21.597820 22.862806 16.638000 -20.946957 23.707140 14.964733 -19.181244 23.000160 10.841590 -16.773802 19.479393 6.811598 -12.204982 16.808838 1.295393 -10.655456 14.024679 -2.613246 -10.138788 11.872929 -3.867004 -10.793421 10.930147 -2.129933 -12.443946 11.448952 2.132515 -14.648105 13.290328 7.778222 -16.815296 15.960882 13.294427 -18.364822 18.745041 17.203068 -18.881491 20.896791 18.456825 -18.226858 21.839575 16.719759 -16.576336 21.320772 12.457314 -14.372177 18.068127 8.140486 -9.960835 15.626744 2.484854 -8.541359 12.989304 -1.532348 -8.091979 10.862504 -2.834715 -8.733106 9.816220 -1.073278 -10.292950 10.130803 3.279984 -12.353551 11.721959 9.058621 -14.362774 14.163342 14.714251 -15.782248 16.800781 18.731453 -16.231630 18.927582 20.033825 -15.590504 19.973866 18.272390 -14.030662 19.659285 13.919129 -11.970060 16.689644 9.384820 -7.660404 14.507235 3.608388 -6.307136 12.039739 -0.517848 -5.880986 9.948323 -1.888264 -6.496142 8.793379 -0.135659 -7.987772 8.884372 4.270357 -9.956196 10.196922 10.149195 -11.873974 12.379331 15.925627 -13.227242 14.846826 20.051865 -13.653391 16.938242 21.422281 -13.038237 18.093187 19.669680 -11.546608 18.002195 15.263668 -9.578185 15.330580 10.564998 -5.317975 13.437894 4.684338 -3.977453 11.165594 0.448735 -3.538955 9.122540 -1.006881 -4.119979 7.856168 0.707517 -5.564838 7.705800 5.132558 -7.486384 8.711727 11.082557 -9.369740 10.604412 16.963215 -10.710262 12.876711 21.198818 -11.148760 14.919765 22.654438 -10.567738 16.186138 20.940044 -9.122879 16.336508 16.515003 -7.201334 13.975917 11.691404 -2.945121 12.397509 5.724428 -1.579381 10.342183 1.383238 -1.104339 8.360665 -0.168947 -1.647283 6.983901 1.483781 -3.062731 6.580791 5.898571 -4.971414 7.259351 11.892485 -6.861903 8.837759 17.859459 -8.227643 10.893083 22.200649 -8.702685 12.874600 23.752838 -8.159743 14.251366 22.100115 -6.744297 14.654476 17.685328 -4.835613 12.609100 12.772562 -0.549004 11.360732 6.740455 0.871098 9.538674 2.302434 1.400279 7.631146 0.647666 0.896744 6.149266 2.219540 -0.504586 5.490105 6.596875 -2.428223 5.830282 12.606769 -4.358732 7.078649 18.638874 -5.778834 8.900706 23.076895 -6.308015 10.808234 24.731667 -5.804482 12.290114 23.159796 -4.403153 12.949278 18.782461 -2.479516 11.211440 13.814508 1.868328 10.298053 7.741040 3.365033 8.718685 3.219148 3.960043 6.896526 1.460470 3.493925 5.319822 2.936242 2.091576 4.411051 7.251031 0.128754 4.413715 13.248693 -1.868605 5.327101 19.322161 -3.365309 6.906469 23.844053 -3.960320 8.728628 25.602734 -3.494203 10.305331 24.126966 -2.091855 11.214104 19.812180 -0.129034 9.765815 14.818116 4.302904 9.180266 8.727057 5.889585 7.844359 4.137095 6.555594 6.116047 2.278112 6.122475 4.458431 3.648216 4.706281 3.315668 7.880289 2.686481 2.993959 13.840351 0.604279 3.579507 19.931408 -0.982402 4.915413 24.521370 -1.648411 6.643725 26.380356 -1.215293 8.301341 25.010256 0.200900 9.444105 20.778185 2.220699 8.253130 15.783012 6.753772 7.974852 9.696511 8.438553 6.873600 5.055467 9.176052 5.244453 3.103445 8.768658 3.523942 4.363487 7.325531 2.173075 8.497964 5.233356 1.553816 14.399049 3.052730 1.832095 20.485548 1.367949 2.933347 25.126591 0.630449 4.562491 27.078617 1.037842 6.283002 25.818579 2.480968 7.633870 21.684105 4.573142 6.653211 16.706060 9.219476 6.648753 10.641614 11.003819 5.763950 5.965364 11.807409 4.235886 3.930308 11.414925 2.474002 5.081738 9.931531 0.950396 9.111128 7.754703 0.073316 14.938807 5.467720 0.077774 21.003254 3.683376 0.962575 25.679504 2.879785 2.490640 27.714561 3.272269 4.252522 26.563137 4.755661 5.776129 22.533749 6.932488 4.944098 17.581821 11.696327 5.168520 11.550085 13.574948 4.473474 6.851547 14.433211 3.045197 4.745179 14.041143 1.266395 5.795381 12.503801 -0.386303 9.720748 10.233112 -1.470058 15.469482 7.837508 -1.694480 21.501217 5.958887 -0.999434 26.199753 5.100624 0.428842 28.306124 5.492690 2.207643 27.255924 7.030031 3.860342 23.330563 9.300719 3.098943 18.400816 14.180655 3.494047 12.403591 16.139891 2.952954 7.691343 17.033133 1.620647 5.526714 16.621037 -0.145881 6.489717 15.014025 -1.873291 10.322313 12.642695 -3.098725 15.997561 10.142443 -3.493829 21.994785 8.183208 -2.952735 26.707035 7.289966 -1.620430 28.871666 7.702060 0.146097 27.908667 9.309070 1.873507 24.076073 11.680399 1.087592 19.153002 16.658623 1.593661 13.182844 18.674194 1.170403 8.459788 19.573942 -0.068772 6.249376 19.116779 -1.791826 7.143882 17.425207 -3.537071 10.903625 14.952478 -4.836867 16.521187 12.361158 -5.342937 22.491344 10.345589 -4.919679 27.214399 9.445841 -3.680506 29.424816 9.903000 -1.957451 28.530313 11.594570 -0.212207 24.770571 14.067300 -1.128007 19.824232 19.108950 -0.568176 13.866238 21.146177 -0.905614 9.130515 22.015104 -2.049905 6.886003 21.482903 -3.694436 7.734114 19.692175 -5.398558 11.447596 17.122747 -6.705652 17.031425 14.463093 -7.265483 22.989420 12.425868 -6.928046 27.725142 11.556941 -5.783756 29.969656 12.089142 -4.139225 29.121550 13.879866 -2.435103 25.408072 16.449293 -3.595865 20.395416 21.497778 -3.027745 14.430097 23.511133 -3.298371 9.676615 24.303047 -4.335230 7.408665 23.661325 -5.860496 8.233942 21.757917 -7.465474 11.931312 19.102840 -8.720114 17.510069 16.407520 -9.288235 23.475389 14.394163 -9.017609 28.228870 13.602248 -7.980751 30.496820 14.243968 -6.455485 29.671549 16.147377 -4.850507 25.974180 18.802452 -6.370023 20.845678 23.764061 -5.806425 14.856642 25.707056 -5.999455 10.080720 26.377323 -6.897389 7.797615 25.595259 -8.259628 8.619083 23.570417 -9.721160 12.325013 20.845356 -10.890368 17.922403 18.150253 -11.453966 23.911438 16.207256 -11.260937 28.687359 15.536993 -10.363003 30.970467 16.319056 -9.000765 30.149000 18.343893 -7.539233 26.443073 21.068953 -9.511271 21.144037 25.818520 -8.923167 15.124420 27.656929 -8.988944 10.326103 28.174419 -9.690977 8.034797 27.232327 -10.841158 8.864451 25.083084 -12.131295 12.592762 22.302584 -13.215699 18.220728 19.635853 -13.803803 24.240345 17.797443 -13.738027 29.038662 17.279953 -13.035994 31.329971 18.222046 -11.885814 30.500320 20.371284 -10.595676 26.772013 23.151785 -13.075891 21.242537 27.530581 -12.393333 15.201694 29.263725 -12.243426 10.391426 29.630873 -12.666337 8.100637 28.533644 -13.548745 8.943143 26.266043 -14.654212 12.693192 23.435669 -15.686528 18.345964 20.800920 -16.369085 24.386803 19.067776 -16.518991 29.197071 18.700628 -16.096083 31.487862 19.797855 -15.213675 30.645361 22.065456 -14.108208 26.895313 24.895828 -17.093649 21.067751 28.718386 -16.225630 15.036267 30.400394 -15.750659 10.240950 30.674793 -15.796005 7.966702 29.468050 -16.349518 8.822910 27.103518 -17.262882 12.580147 24.214767 -18.291365 18.231665 21.575840 -19.159384 24.263149 19.893829 -19.634354 29.058466 19.619432 -19.589008 31.332714 20.826172 -19.035498 30.476513 23.190702 -18.122133 26.719278 26.079453 -21.534901 20.513939 29.152893 -20.416739 14.540809 30.894396 -19.530174 9.805853 31.194626 -19.112766 7.577798 29.973141 -19.276356 8.453652 27.557238 -19.977108 12.198730 24.594252 -21.027260 17.809540 21.878115 -22.145422 23.782673 20.136616 -23.031984 28.517628 19.836382 -23.449394 30.745686 21.057865 -23.285807 29.869833 23.473770 -22.585052 26.124758 26.436754 -26.269354 19.457922 28.586409 -24.913492 13.595619 30.524569 -23.604948 8.974874 31.006615 -22.694345 6.833808 29.903383 -22.425680 7.746122 27.510481 -22.870941 11.467359 24.469084 -23.910818 17.000418 21.594135 -25.266680 22.862717 19.655973 -26.575222 27.483463 19.173925 -27.485825 29.624531 20.277159 -27.754492 28.712221 22.670059 -27.309233 24.990988 25.711454 -31.059818 17.792643 26.813808 -29.564510 12.075562 29.058905 -27.919226 7.609938 29.863401 -26.564821 5.592335 29.011730 -25.864204 6.563367 26.732101 -26.005106 10.262844 23.635334 -26.949772 15.699495 20.551208 -28.445080 21.416574 18.306112 -30.090363 25.882198 17.501617 -31.444769 27.899803 18.353285 -32.145386 26.928776 20.632912 -32.004486 23.229300 23.729677 -35.612064 15.450332 23.724575 -34.119438 9.882250 26.318789 -32.283455 5.583793 27.522276 -30.596062 3.706729 27.012556 -29.509396 4.754015 24.926212 -29.314629 8.445030 21.822279 -30.063946 13.790772 18.532450 -31.556570 19.358854 15.938233 -33.392555 23.657310 14.734747 -35.079948 25.534378 15.244466 -36.166615 24.487095 17.330807 -36.361382 20.796082 20.434740 -39.626049 12.409383 19.310429 -38.268299 6.968914 22.229200 -36.390564 2.823920 23.838266 -34.495979 1.085053 23.706478 -33.092197 2.218239 21.869152 -32.555367 5.919841 18.818594 -33.029320 11.198017 15.372201 -34.387074 16.638485 12.453430 -36.264809 20.783478 10.844364 -38.159393 22.522346 10.976149 -39.563171 21.389164 12.813475 -40.100006 17.687565 15.864031 -42.799465 8.714500 13.681709 -41.671757 3.369412 16.862862 -39.870743 -0.648207 18.840496 -37.879002 -2.261837 19.084707 -36.230217 -1.039111 17.530060 -35.366184 2.692346 14.593119 -35.518414 7.932690 11.060836 -36.646122 13.277777 7.879683 -38.447136 17.295395 5.902048 -40.438877 18.909029 5.657835 -42.087658 17.686306 7.212482 -42.951694 13.954851 10.149422 -44.846874 4.501185 7.102975 -44.006531 -0.779359 10.475080 -42.365295 -4.695889 12.769220 -40.362930 -6.198974 13.370684 -38.535973 -4.885862 12.118307 -37.373955 -1.108404 9.347665 -37.188236 4.121236 5.801149 -38.028580 9.401779 2.429044 -39.669815 13.318310 0.134902 -41.672176 14.821398 -0.466562 -43.499134 13.508288 0.785813 -44.661156 9.730832 3.556453 -45.555553 -0.002103 -0.003149 -45.034534 -5.243725 3.491900 -43.611099 -9.080275 6.051328 -41.666653 -10.483750 6.989339 -39.722210 -9.078091 6.054594 -38.298782 -5.239946 3.497557 -37.777775 0.002259 0.003385 -38.298794 5.243880 -3.491663 -39.722229 9.080429 -6.051091 -41.666676 10.483907 -6.989103 -43.611118 9.078252 -6.054360 -45.034546 5.240108 -3.497325 -44.845467 -4.505770 -7.109861 -44.660446 -9.733292 -3.560185 -43.499329 -13.507933 -0.785325 -41.673233 -14.818277 0.471199 -39.671463 -13.313222 -0.127299 -38.030388 -9.396046 -2.420451 -37.189735 -4.116352 -5.793809 -37.374756 1.111169 -9.343485 -38.535873 4.885808 -12.118345 -40.361965 6.196157 -13.374870 -42.363739 4.691105 -12.776374 -44.004814 0.773931 -10.483223 -42.796665 -8.718917 -13.688147 -42.949142 -13.958883 -10.155313 -42.086063 -17.688845 -7.216191 -40.438686 -18.909357 -5.658316 -38.448425 -17.293388 -5.899119 -36.648571 -13.273935 -7.874077 -35.521389 -7.928007 -11.054001 -35.368912 -2.688040 -14.586835 -36.231991 1.041921 -17.525955 -37.879364 2.262436 -19.083832 -39.869625 0.646470 -18.843031 -41.669483 -3.372981 -16.868076 -39.622292 -12.413079 -19.315578 -40.095055 -17.692432 -15.870825 -39.558388 -21.393875 -12.820044 -38.156090 -22.525608 -10.980692 -36.263905 -20.784382 -10.845621 -34.388840 -16.636761 -12.451023 -33.033318 -11.194097 -15.366732 -32.560555 -5.914744 -18.811485 -33.097218 -2.213301 -21.862267 -34.499516 -1.081566 -23.701620 -36.391705 -2.822787 -23.836691 -38.266769 -6.970406 -22.231293 -35.605217 -15.455013 -23.730375 -36.354542 -20.800592 -20.440283 -36.161648 -24.490211 -17.334568 -35.078224 -25.535240 -15.245411 -33.394569 -23.655663 -14.732594 -31.561821 -19.355112 -15.933527 -30.071062 -13.785917 -18.526421 -29.321737 -8.440338 -21.816513 -29.514629 -4.750720 -24.922226 -30.598053 -3.705688 -27.011385 -32.281704 -5.585262 -27.524204 -34.114452 -9.885810 -26.323273 -31.048832 -17.798424 -26.819057 -31.994871 -23.233709 -23.732943 -32.139759 -26.930620 -20.633295 -31.444675 -27.898571 -18.350664 -30.095863 -25.878201 -17.496677 -28.454741 -21.410866 -18.300159 -26.961040 -15.693586 -20.545818 -26.015001 -10.258303 -23.631931 -25.870113 -6.561391 -26.731579 -26.565197 -5.593437 -29.014212 -27.914007 -7.613805 -29.868198 -29.555130 -12.081137 -29.064718 -26.258905 -19.461916 -28.588505 -27.297956 -24.994576 -25.712488 -27.745447 -28.714436 -22.669739 -27.481474 -29.624769 -20.275560 -26.576767 -27.481647 -19.171471 -25.273743 -22.859322 -19.653307 -23.921545 -16.996338 -21.591967 -22.882494 -11.463679 -24.467983 -22.435003 -7.743816 -27.510731 -22.698977 -6.833482 -29.904911 -23.603682 -8.976601 -31.009003 -24.906706 -13.598925 -30.527164 -21.526140 -20.516254 -29.152636 -22.574167 -26.126955 -26.435450 -23.275747 -29.871326 -23.471764 -23.442894 -30.746065 -21.055700 -23.030821 -28.516787 -19.834637 -22.149940 -23.780827 -20.135757 -21.036287 -17.807180 -21.878378 -19.988262 -12.196480 -24.595564 -19.286680 -8.452108 -27.559246 -19.119534 -7.577369 -29.975313 -19.531607 -9.806643 -31.196377 -20.412485 -14.542601 -30.895258 -17.085157 -21.070391 -28.715899 -18.113974 -26.720476 -26.074026 -19.029892 -30.475952 -23.183792 -19.587492 -31.330542 -20.819633 -19.637365 -29.055258 -19.615028 -19.166149 -24.259764 -19.892746 -18.300104 -18.229006 -21.578373 -17.271288 -12.578922 -24.220247 -16.355370 -8.823446 -27.110477 -15.797770 -7.968855 -29.474636 -15.747895 -10.244135 -30.679245 -16.219112 -15.039627 -30.401529 -13.068244 -21.245543 -27.526308 -14.103080 -26.895962 -24.887501 -15.212470 -30.643482 -22.055311 -16.099155 -31.483959 -19.788626 -16.525551 -29.192188 -18.694799 -16.377399 -24.382250 -19.066921 -15.694404 -18.342960 -20.805283 -14.659569 -12.692542 -23.444090 -13.550179 -8.945022 -26.276279 -12.663492 -8.104540 -28.542967 -12.237098 -10.396307 -29.636793 -12.385247 -15.206244 -29.264673 -9.506032 -21.146215 -25.814342 -10.592706 -26.772135 -23.144213 -11.885937 -30.498363 -20.362354 -13.039205 -31.326460 -18.214169 -13.743493 -29.034538 -17.275257 -13.810087 -24.236717 -17.797201 -13.221145 -18.218571 -19.640146 -12.134472 -12.592652 -22.310278 -10.841241 -8.866424 -25.092133 -9.687972 -8.038323 -27.240322 -8.983685 -10.330242 -28.179234 -8.917089 -15.128059 -27.657291 -6.366224 -20.848097 -23.759735 -7.539409 -26.443207 -21.061625 -9.004894 -30.146824 -18.335541 -10.370004 -30.966564 -16.311935 -11.268959 -28.682781 -15.533033 -11.460884 -23.907412 -16.207537 -10.894354 -17.920013 -18.154715 -9.721170 -12.324903 -20.852825 -8.255686 -8.621286 -23.578907 -6.890575 -7.801543 -25.602512 -5.991621 -10.085324 -26.381418 -5.799694 -14.860689 -25.706917 -3.592857 -20.397593 -21.493515 -4.851548 -25.974218 -18.795671 -6.460322 -29.669451 -16.139912 -7.988108 -30.493153 -14.237844 -9.025537 -28.224617 -13.599126 -9.294633 -23.471695 -14.394899 -8.723289 -17.507927 -16.411942 -7.464599 -11.931302 -19.109785 -5.855826 -8.236069 -21.765543 -4.328040 -7.412364 -23.667612 -3.290610 -9.680897 -24.306330 -3.021513 -14.433816 -23.510559 -1.126703 -19.824917 -19.106972 -2.434951 -25.407873 -16.446047 -4.140288 -29.120537 -13.876242 -5.785770 -29.968105 -12.086132 -6.930491 -27.723467 -11.555374 -7.267725 -22.988079 -12.426184 -6.707110 -17.030783 -14.465233 -5.398862 -11.447827 -17.126156 -3.693526 -7.735164 -19.695961 -2.048044 -6.887594 -21.486073 -0.903322 -9.132225 -22.016830 -0.566087 -13.867611 -21.146021 1.089432 -19.154613 -16.655092 -0.214164 -24.770729 -14.062542 -1.962698 -28.528988 -11.589876 -3.687654 -29.422365 -9.899645 -4.926829 -27.211487 -9.444744 -5.348189 -22.488752 -10.347065 -4.838830 -16.519615 -12.364828 -3.535235 -10.903502 -14.957376 -1.786701 -7.145245 -17.430042 -0.061747 -6.251863 -19.120274 1.177430 -8.462738 -19.575176 1.598790 -13.185470 -18.672857 3.100337 -18.402143 -14.177729 1.871270 -24.076443 -11.677104 0.140814 -27.907995 -9.306304 -1.627356 -28.870134 -7.700584 -2.959461 -26.705059 -7.290194 -3.498566 -21.992899 -8.185099 -3.100216 -15.996273 -10.145507 -1.871150 -10.321973 -12.646132 -0.140695 -6.490422 -15.016931 1.627476 -5.528279 -16.622652 2.959582 -7.693351 -17.033043 3.498687 -12.405509 -16.138140 4.944380 -17.581575 -11.695987 3.861636 -23.330059 -9.299318 2.209594 -27.255314 -7.027955 0.430916 -28.305565 -5.490507 -0.997803 -26.199406 -5.098930 -1.693738 -21.501179 -5.958149 -1.470414 -15.469765 -7.837937 -0.387672 -9.721282 -10.234605 1.264370 -5.796028 -12.505968 3.043049 -4.745772 -14.043417 4.471767 -6.851928 -14.434994 5.167703 -11.550155 -13.575776 6.653645 -16.705984 -9.218736 5.776927 -22.533352 -6.930822 4.253461 -26.562542 -4.753518 2.491461 -27.713928 -3.270233 0.963051 -25.679003 -2.878409 0.077769 -21.003025 -3.683038 0.072825 -14.938913 -5.468517 0.949543 -9.111545 -7.756431 2.473008 -5.082356 -9.933734 4.235008 -3.930966 -11.417021 5.763418 -5.965888 -11.808845 6.648701 -10.641865 -11.004218 8.253338 -15.782888 -6.753438 7.634685 -21.683697 -4.571891 6.284200 -25.818008 -2.479139 4.563746 -27.078037 -1.035934 2.934316 -25.126160 -0.628981 1.832515 -20.485382 -1.367322 1.553569 -14.399194 -3.053120 2.172221 -8.498387 -5.234666 3.522705 -4.364075 -7.327418 5.243159 -3.104043 -8.770624 6.872590 -5.055918 -9.177578 7.974391 -9.696693 -8.439238 9.766647 -14.817905 -4.301442 9.444510 -20.777935 -2.219208 8.301205 -25.010042 -0.199783 6.643081 -26.380239 1.215727 4.914432 -24.521378 1.648039 3.578446 -19.931543 0.981315 2.993102 -13.840580 -0.605797 3.315240 -7.880552 -2.688032 4.458544 -3.648444 -4.707456 6.116667 -2.278246 -6.122967 7.845316 -4.137102 -6.555279 9.181301 -8.726932 -5.888556 11.212072 -13.814142 -1.867252 11.214707 -19.811825 0.130051 10.305743 -24.126728 2.092536 8.728736 -25.602676 3.494358 6.906243 -23.844191 3.959898 5.326601 -19.322456 3.364417 4.413072 -13.249070 1.867473 4.410436 -7.251388 -0.129830 5.319400 -2.936486 -2.092315 6.896406 -1.460534 -3.494137 8.718899 -3.219017 -3.959678 10.298542 -7.740747 -3.364198 12.608550 -12.773234 0.548056 12.949639 -18.782228 2.481205 12.291292 -23.158726 4.407030 10.809912 -24.730047 5.809507 8.902433 -23.075157 6.312843 7.079965 -18.637486 5.782171 5.830834 -12.606100 4.359684 5.489745 -6.597106 2.426535 6.148092 -2.220608 0.500711 7.629471 -0.649284 -0.901767 9.536949 -2.304171 -1.405105 11.359418 -6.741840 -0.874434 13.976293 -11.690985 2.945793 14.655608 -17.684561 4.837095 14.252954 -22.099211 6.746197 12.876220 -23.752039 8.161558 10.894300 -22.200165 8.703932 8.838251 -17.859419 8.227991 7.258987 -11.892898 6.861263 6.579670 -5.899324 4.969963 6.982325 -1.484673 3.060861 8.359057 0.168156 1.645500 10.340976 -1.383712 1.103125 12.397026 -5.724456 1.579064 15.330800 -10.564746 5.318358 16.337416 -16.514341 7.202624 16.187498 -20.939152 9.124739 14.921214 -22.653555 10.569671 12.877866 -21.198174 11.150254 10.604966 -16.962982 10.710920 8.711536 -11.082793 9.369390 7.704919 -5.133199 7.485126 7.854837 -0.708387 5.563012 9.121119 1.006018 4.118079 11.164467 -0.449359 3.537495 13.437366 -4.684548 3.976827 16.689184 -9.387169 7.659281 18.001242 -15.264573 9.581793 18.092003 -19.668903 11.553993 16.937149 -21.420027 13.047433 14.846122 -20.048727 13.661945 12.379211 -15.922447 13.232874 10.197424 -10.146818 11.875186 8.885367 -4.269415 9.952674 8.794605 0.134917 7.980474 9.949458 1.886042 6.487034 12.040483 0.514746 5.872520 14.507394 -3.611532 6.301592 18.067913 -8.142633 9.960091 19.658508 -13.919944 11.973578 19.972744 -18.271654 14.037516 18.926420 -20.031725 15.598871 16.799900 -18.728548 16.239285 14.162983 -14.711313 15.787153 11.722228 -9.056430 14.363628 10.131633 -3.279122 12.350142 9.817397 1.072587 10.286205 10.863719 2.832662 8.724849 12.990237 1.529491 8.084435 15.627154 -2.487743 8.536565 19.479279 -6.814370 12.204252 21.319818 -12.458337 14.376686 21.838051 -16.718760 16.584892 20.895113 -18.454062 18.237190 18.743668 -17.199268 18.890841 15.960193 -13.290604 18.370701 13.290517 -7.775390 16.816143 11.449977 -2.131424 14.643709 10.931745 2.128999 12.435501 11.874680 3.864302 10.783205 14.026123 2.609513 10.129555 16.809599 -1.299149 10.649692 20.931341 -5.375540 14.369343 22.999947 -10.841805 16.778124 23.706741 -14.962917 19.189102 22.862341 -16.634628 20.956261 20.692997 -15.409002 21.606089 17.779989 -11.614447 20.964468 14.903854 -6.267711 19.203316 12.835247 -0.801446 16.794537 12.128451 3.319666 14.383557 12.972852 4.991379 12.616399 15.142193 3.765756 11.966568 18.055201 -0.028797 12.608190 22.424438 -3.793416 16.421827 24.714603 -9.013955 19.153591 25.605583 -12.929366 21.831589 24.858639 -14.490516 23.738251 22.673914 -13.279098 24.362690 19.636805 -9.619711 23.537588 16.561100 -4.492884 21.484032 14.270935 0.727655 18.752266 13.379956 4.643065 16.074270 14.126899 6.204218 14.167607 16.311623 4.992803 13.543167 19.348730 1.333419 14.368268 23.948141 -2.021338 18.314199 26.482267 -6.892138 21.447077 27.574862 -10.510445 24.448751 26.933163 -11.906735 26.514925 24.729113 -10.706875 27.091969 21.553288 -7.232366 26.025267 18.256645 -2.414200 23.600637 15.722518 2.456600 20.467760 14.629923 6.074907 17.466089 15.271621 7.471200 15.399914 17.475668 6.271342 14.822868 20.651493 2.796835 15.889570</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="1440" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="4320">0.707578 -0.003730 -0.706625 0.677872 -0.065107 -0.732291 0.777600 -0.170680 -0.605150 0.799245 -0.124726 -0.587920 0.884178 -0.371881 -0.282726 0.880257 -0.372132 -0.294390 0.558754 -0.581163 0.591646 0.500073 -0.690638 0.522443 -0.251836 -0.274679 0.927971 -0.316641 -0.391234 0.864103 -0.554998 -0.057089 0.829891 -0.600707 -0.142010 0.786756 -0.674450 0.058364 0.736010 -0.704714 -0.001199 0.709491 -0.766792 0.173202 0.618086 -0.778223 0.144187 0.611211 -0.870242 0.376476 0.317717 -0.849122 0.400673 0.344169 -0.573484 0.583139 -0.575382 -0.518839 0.692693 -0.500982 0.253756 0.244506 -0.935855 0.295704 0.337942 -0.893507 0.552806 0.037870 -0.832449 0.586083 0.108647 -0.802934 0.641857 -0.135163 -0.754818 0.750948 -0.223659 -0.621333 0.889607 -0.363161 -0.276972 0.634038 -0.432440 0.641086 -0.171070 -0.123205 0.977525 -0.497982 0.049738 0.865760 -0.636856 0.127562 0.760356 -0.754109 0.192796 0.627813 -0.902540 0.308805 0.300102 -0.639796 0.437353 -0.631967 0.210575 0.162677 -0.963947 0.515150 -0.033223 -0.856456 0.599097 -0.214612 -0.771378 0.720768 -0.280819 -0.633746 0.895800 -0.343364 -0.282213 0.718034 -0.247539 0.650501 -0.082209 0.058690 0.994886 -0.433898 0.175832 0.883638 -0.591664 0.207973 0.778897 -0.731977 0.212011 0.647503 -0.923445 0.214630 0.318094 -0.725131 0.258189 -0.638376 0.148262 0.077252 -0.985926 0.466147 -0.112895 -0.877475 0.551701 -0.303616 -0.776817 0.688679 -0.340172 -0.640316 0.898696 -0.316763 -0.303325 0.795667 -0.043705 0.604156 0.001781 0.256931 0.966428 -0.370400 0.313618 0.874327 -0.541851 0.299944 0.785131 -0.696174 0.247572 0.673832 -0.915050 0.147208 0.375516 -0.818116 0.050678 -0.572816 0.058142 -0.061442 -0.996416 0.404042 -0.216463 -0.888760 0.504164 -0.399117 -0.765849 0.656185 -0.400438 -0.639587 0.893609 -0.293006 -0.340016 0.851780 0.151177 0.501613 0.068387 0.449814 0.890500 -0.315490 0.450852 0.834984 -0.493070 0.399179 0.773006 -0.651515 0.307385 0.693572 -0.885161 0.136288 0.444877 -0.877578 -0.141639 -0.458034 -0.035492 -0.262520 -0.964274 0.337876 -0.346583 -0.875054 0.461336 -0.494855 -0.736401 0.624625 -0.460671 -0.630575 0.878719 -0.281090 -0.385800 0.879572 0.312237 0.358972 0.111993 0.617643 0.778444 -0.273569 0.575737 0.770511 -0.450525 0.497872 0.741047 -0.606886 0.383649 0.696063 -0.848417 0.164344 0.503170 -0.901067 -0.294881 -0.317998 -0.105601 -0.471554 -0.875492 0.280670 -0.485064 -0.828213 0.426416 -0.584583 -0.690241 0.595475 -0.519970 -0.612406 0.855893 -0.284689 -0.431740 0.881353 0.428839 0.198279 0.134148 0.751283 0.646203 -0.244917 0.681952 0.689171 -0.416818 0.589088 0.692270 -0.568097 0.463540 0.679997 -0.811592 0.207883 0.545988 -0.898586 -0.406616 -0.164943 -0.146353 -0.646297 -0.748920 0.239085 -0.611667 -0.754123 0.400604 -0.664514 -0.630823 0.570337 -0.577245 -0.584383 0.828725 -0.302464 -0.470882 0.863343 0.503347 0.035791 0.139092 0.851665 0.505293 -0.228030 0.768879 0.597351 -0.392336 0.669390 0.630865 -0.536711 0.538923 0.649233 -0.776103 0.256481 0.576091 -0.877796 -0.478940 -0.009498 -0.163613 -0.778355 -0.606130 0.212928 -0.717381 -0.663345 0.384110 -0.733356 -0.560936 0.550779 -0.631178 -0.546130 0.800587 -0.330742 -0.499670 0.830731 0.543338 -0.121118 0.129776 0.923698 0.360472 -0.221919 0.838383 0.497862 -0.376828 0.738110 0.559637 -0.512386 0.607001 0.607462 -0.741777 0.307265 0.596117 -0.843692 -0.517689 0.142065 -0.163622 -0.873527 -0.458453 0.199857 -0.801864 -0.563091 0.377294 -0.790930 -0.481746 0.538343 -0.680289 -0.497387 0.773879 -0.365697 -0.517085 0.785935 0.555642 -0.271234 0.106677 0.971436 0.211972 -0.226957 0.892037 0.390847 -0.370569 0.795500 0.479435 -0.494760 0.667540 0.556420 -0.708116 0.359857 0.607515 -0.798443 -0.528627 0.288169 -0.149813 -0.939078 -0.309336 0.198343 -0.867518 -0.456151 0.381448 -0.836654 -0.393073 0.534893 -0.722631 -0.437829 0.750238 -0.404083 -0.523316 0.728776 0.543977 -0.415902 0.067973 0.995981 0.058316 -0.245043 0.929620 0.275248 -0.374960 0.841154 0.389698 -0.484322 0.720668 0.496055 -0.674686 0.414717 0.610580 -0.741835 -0.515038 0.429438 -0.122881 -0.979689 -0.158459 0.208568 -0.916072 -0.342508 0.399170 -0.868327 -0.294402 0.542908 -0.755126 -0.367472 0.730937 -0.443044 -0.519079 0.657269 0.508489 -0.556270 0.010085 0.994814 -0.101211 -0.279511 0.948286 0.150422 -0.392839 0.872830 0.289559 -0.482904 0.765489 0.425241 -0.641478 0.472504 0.604356 -0.672077 -0.477170 0.566235 -0.081514 -0.996661 -0.004711 0.232520 -0.947099 -0.221219 0.434179 -0.881278 -0.186647 0.565233 -0.773030 -0.287987 0.717013 -0.479748 -0.505702 0.568887 0.446138 -0.690890 -0.071149 0.961950 -0.263799 -0.334429 0.942241 0.018415 -0.428300 0.885589 0.179699 -0.494127 0.798911 0.342899 -0.609737 0.533320 0.586337 -0.586980 -0.412729 0.696497 -0.023176 -0.988175 0.151567 0.273802 -0.957345 -0.092325 0.489942 -0.868542 -0.074777 0.603657 -0.770513 -0.204715 0.708921 -0.511473 -0.485620 0.462809 0.352421 -0.813393 -0.177832 0.889900 -0.420065 -0.412452 0.903928 -0.113122 -0.485236 0.871947 0.065232 -0.523388 0.814515 0.250261 -0.583875 0.594813 0.552528 -0.485913 -0.318298 0.813987 0.055354 -0.950098 0.307001 0.337089 -0.940585 0.040876 0.566499 -0.823523 0.029809 0.656350 -0.743555 -0.127790 0.705928 -0.536437 -0.462493 0.343010 0.225614 -0.911835 -0.305991 0.774959 -0.552998 -0.511089 0.828364 -0.229351 -0.563814 0.824855 -0.041571 -0.575875 0.802759 0.154747 -0.574511 0.647934 0.500119 -0.372487 -0.190748 0.908223 0.159772 -0.875886 0.455299 0.426870 -0.888327 0.169282 0.656826 -0.745888 0.110597 0.716126 -0.694495 -0.069568 0.705848 -0.554822 -0.440398 0.219749 0.072539 -0.972856 -0.443127 0.624553 -0.643095 -0.619938 0.719908 -0.312106 -0.656437 0.744302 -0.122906 -0.650637 0.755886 0.072857 -0.595550 0.674191 0.436793 -0.256845 -0.030860 0.965960 0.301461 -0.752773 0.585196 0.543589 -0.792783 0.275690 0.747164 -0.646640 0.153633 0.772556 -0.633796 -0.038204 0.705501 -0.569082 -0.422391 0.105842 -0.090072 -0.990295 -0.571906 0.459467 -0.679569 -0.723430 0.595199 -0.349839 -0.748460 0.642475 -0.164416 -0.734972 0.677659 0.024395 -0.645656 0.658558 0.386561 -0.154864 0.137521 0.978317 0.479906 -0.568968 0.667806 0.674836 -0.656475 0.337100 0.823766 -0.544936 0.156379 0.817669 -0.574726 -0.033279 0.702329 -0.582092 -0.409761 0.009167 -0.242408 -0.970131 -0.679463 0.304740 -0.667431 -0.809009 0.475944 -0.344937 -0.825639 0.539654 -0.164598 -0.809139 0.587334 0.018255 -0.697498 0.612896 0.371289 -0.064793 0.277317 0.958591 0.654152 -0.351600 0.669673 0.794069 -0.503725 0.340171 0.879724 -0.457730 0.128724 0.849192 -0.525907 -0.047901 0.695786 -0.594985 -0.402335 -0.069414 -0.371645 -0.925776 -0.762529 0.176124 -0.622519 -0.872655 0.376906 -0.310507 -0.881353 0.452835 -0.134752 -0.859830 0.508594 0.044996 -0.724774 0.570366 0.386505 0.023498 0.390703 0.920217 0.779454 -0.161744 0.605219 0.880341 -0.369716 0.297170 0.915852 -0.392253 0.085749 0.869324 -0.488672 -0.073998 0.687396 -0.606329 -0.399814 -0.132458 -0.474640 -0.870156 -0.824544 0.075608 -0.560723 -0.917185 0.301023 -0.261067 -0.916901 0.388688 -0.090633 -0.886265 0.455307 0.085029 -0.725118 0.553549 0.409618 0.101867 0.486171 0.867906 0.853111 -0.031409 0.520784 0.932420 -0.274001 0.235621 0.937136 -0.346572 0.040801 0.881974 -0.459452 -0.105004 0.679949 -0.613294 -0.401920 -0.181276 -0.554866 -0.811950 -0.870142 -0.003848 -0.492787 -0.947682 0.242832 -0.207201 -0.937668 0.344550 -0.045439 -0.895761 0.427842 0.120677 -0.710565 0.563289 0.421668 0.162655 0.563706 0.809802 0.892940 0.045854 0.447834 0.960129 -0.215188 0.178453 0.949417 -0.314007 0.002621 0.890867 -0.433459 -0.135897 0.676248 -0.613598 -0.407660 -0.214932 -0.618107 -0.756140 -0.902272 -0.071132 -0.425259 -0.968490 0.194550 -0.155494 -0.949677 0.313146 -0.007320 -0.897373 0.417686 0.142340 -0.693823 0.588311 0.415330 0.203066 0.625136 0.753637 0.913178 0.089377 0.397640 0.973805 -0.181298 0.137240 0.957564 -0.287143 -0.024900 0.898865 -0.406698 -0.163213 0.678175 -0.606183 -0.415477 -0.232452 -0.669320 -0.705675 -0.922515 -0.132801 -0.362394 -0.982583 0.149873 -0.109860 -0.957731 0.286954 0.020229 -0.898006 0.414289 0.148156 -0.683047 0.616041 0.392351 0.223586 0.674335 0.703763 0.921667 0.116938 0.369939 0.980615 -0.159115 0.114352 0.964704 -0.260085 -0.041246 0.907811 -0.376379 -0.184982 0.686614 -0.590784 -0.423716 -0.233766 -0.711879 -0.662255 -0.931978 -0.192734 -0.307035 -0.991869 0.104662 -0.072395 -0.964853 0.260194 0.036834 -0.901501 0.409281 0.140657 -0.681944 0.637632 0.358298 0.225780 0.714939 0.661729 0.922230 0.140606 0.360169 0.984484 -0.138735 0.107445 0.972222 -0.229159 -0.047655 0.918436 -0.341282 -0.200005 0.701502 -0.568037 -0.430383 -0.219491 -0.747739 -0.626666 -0.931649 -0.252382 -0.261406 -0.997398 0.056957 -0.044200 -0.972378 0.229258 0.043839 -0.909255 0.397223 0.124379 -0.691341 0.647906 0.319789 0.211437 0.749303 0.627566 0.916835 0.167540 0.362415 0.987130 -0.114000 0.112155 0.980167 -0.192680 -0.046337 0.930548 -0.301025 -0.208482 0.721691 -0.538707 -0.434691 -0.192528 -0.777365 -0.598863 -0.922878 -0.311626 -0.226241 -0.999662 0.006351 -0.025226 -0.980294 0.192769 0.043165 -0.920791 0.376090 0.103439 -0.709711 0.645597 0.281984 0.184165 0.777970 0.600705 0.906615 0.200204 0.371440 0.988850 -0.082358 0.124065 0.987839 -0.150460 -0.039182 0.943447 -0.255953 -0.210703 0.745995 -0.503554 -0.435804 -0.154500 -0.800961 -0.578439 -0.906820 -0.370116 -0.201721 -0.998786 -0.046964 -0.014851 -0.987931 0.150455 0.036830 -0.934878 0.345575 0.081125 -0.735034 0.630987 0.248155 0.145952 0.801097 0.580466 0.891988 0.238743 0.383873 0.989207 -0.043546 0.139905 0.994254 -0.103289 -0.028129 0.956087 -0.207066 -0.207415 0.772619 -0.463786 -0.433547 -0.108837 -0.818133 -0.564635 -0.884856 -0.426433 -0.187575 -0.994733 -0.101754 -0.012338 -0.994299 0.103264 0.026557 -0.949921 0.306695 0.059896 -0.764741 0.605426 0.220523 0.100141 0.818081 0.566317 0.873488 0.281885 0.396938 0.987619 0.001467 0.156863 0.998510 -0.052572 -0.014641 0.967471 -0.155529 -0.199527 0.800005 -0.420322 -0.428160 -0.057894 -0.828585 -0.556862 -0.858214 -0.479571 -0.182975 -0.987490 -0.156810 -0.016525 -0.998522 0.052546 0.013860 -0.964434 0.261084 0.041261 -0.796502 0.570609 0.199974 0.049163 0.828520 0.557797 0.851499 0.327717 0.409329 0.983552 0.050892 0.173310 1.000000 -0.000005 0.000003 0.976791 -0.102888 -0.187865 0.826688 -0.374462 -0.419958 -0.004426 -0.832079 -0.554639 -0.828256 -0.528123 -0.187290 -0.977234 -0.210504 -0.026482 -1.000000 0 0.000006 -0.977237 0.210491 0.026505 -0.828271 0.528087 0.187324 -0.004447 0.832083 0.554633 0.826702 0.374475 0.419920 0.976794 0.102887 0.187852 0.998511 0.052551 0.014638 0.983555 -0.050928 -0.173281 0.851497 -0.327754 -0.409305 0.049177 -0.828517 -0.557800 -0.796500 -0.570602 -0.200004 -0.964439 -0.261063 -0.041281 -0.998523 -0.052535 -0.013841 -0.987493 0.156787 0.016601 -0.858223 0.479515 0.183079 -0.057888 0.828586 0.556861 0.800040 0.420361 0.428057 0.967483 0.155540 0.199460 0.994260 0.103235 0.028104 0.987629 -0.001562 -0.156804 0.873488 -0.281995 -0.396860 0.100125 -0.818085 -0.566314 -0.764769 -0.605360 -0.220606 -0.949943 -0.306619 -0.059942 -0.994305 -0.103221 -0.026515 -0.994733 0.101738 0.012482 -0.884847 0.426369 0.187763 -0.108794 0.818132 0.564644 0.772684 0.463838 0.433375 0.956115 0.207070 0.207283 0.987858 0.150352 0.039117 0.989224 0.043367 -0.139837 0.891983 -0.238955 -0.383754 0.145879 -0.801122 -0.580451 -0.735117 -0.630843 -0.248274 -0.934930 -0.345422 -0.081182 -0.987948 -0.150359 -0.036749 -0.998782 0.046976 0.015077 -0.906778 0.370066 0.202004 -0.154377 0.800963 0.578469 0.746109 0.503603 0.435552 0.943499 0.255933 0.210493 0.980208 0.192500 0.046215 0.988885 0.082057 -0.123990 0.906608 -0.200563 -0.371264 0.184027 -0.778033 -0.600665 -0.709873 -0.645354 -0.282132 -0.920889 -0.375836 -0.103487 -0.980333 -0.192606 -0.043023 -0.999654 -0.006300 0.025549 -0.922792 0.311598 0.226630 -0.192323 0.777376 0.598914 0.721862 0.538751 0.434354 0.930633 0.300973 0.208176 0.972295 0.228889 0.047446 0.987186 0.113552 -0.112111 0.916815 -0.168089 -0.362211 0.211173 -0.749443 -0.627487 -0.691619 -0.647538 -0.319935 -0.909420 -0.396841 -0.124392 -0.972447 -0.229007 -0.043613 -0.997384 -0.056851 0.044643 -0.931501 0.252393 0.261924 -0.219154 0.747766 0.626752 0.701748 0.568067 0.429943 0.918563 0.341185 0.199584 0.964813 0.259733 0.040926 0.984552 0.138187 -0.107529 0.922166 -0.141297 -0.360062 0.225329 -0.715198 -0.661603 -0.682339 -0.637203 -0.358310 -0.901730 -0.408815 -0.140549 -0.964958 -0.259852 -0.036512 -0.991854 -0.104450 0.072907 -0.931762 0.192860 0.307611 -0.233233 0.711944 0.662373 0.686958 0.590730 0.423234 0.907988 0.376196 0.184486 0.957695 0.286741 0.024499 0.980684 0.158528 -0.114575 0.921568 -0.117687 -0.369950 0.223068 -0.674706 -0.703571 -0.683494 -0.615667 -0.392161 -0.898264 -0.413828 -0.147881 -0.957853 -0.286573 -0.019814 -0.982568 -0.149581 0.110392 -0.922263 0.133021 0.362954 -0.231851 0.669387 0.705809 0.678574 0.606039 0.415035 0.899075 0.406436 0.162709 0.949564 0.313559 -0.003084 0.973925 0.180509 -0.137427 0.913161 -0.090450 -0.397437 0.202757 -0.625648 -0.753295 -0.694337 -0.587832 -0.415150 -0.897678 -0.417144 -0.142005 -0.949795 -0.312774 0.007842 -0.968428 -0.194329 0.156154 -0.901947 0.071242 0.425930 -0.214357 0.618100 0.756309 0.676628 0.613518 0.407149 0.891066 0.433239 0.135296 0.937280 0.346107 -0.041428 0.960257 0.214317 -0.178817 0.892903 -0.047220 -0.447766 0.161897 -0.564586 -0.809341 -0.711212 -0.562795 -0.421235 -0.896111 -0.427250 -0.120176 -0.937793 -0.344124 0.046085 -0.947587 -0.242549 0.207962 -0.869701 0.004041 0.493562 -0.180373 0.554932 0.812106 0.680430 0.613180 0.401280 0.882184 0.459217 0.104266 0.915985 0.391803 -0.086389 0.932527 0.273215 -0.236106 0.853150 0.030032 -0.520800 0.101555 -0.487476 -0.867210 -0.725558 -0.553519 -0.408879 -0.886506 -0.454969 -0.084325 -0.916967 -0.388366 0.091346 -0.917064 -0.300758 0.261799 -0.824086 -0.075435 0.561419 -0.131590 0.474572 0.870325 0.687898 0.606107 0.399287 0.869548 0.488372 0.073335 0.879841 0.457335 -0.129321 0.880558 0.368861 -0.297589 0.779922 0.159934 -0.605097 0.023913 -0.392599 -0.919399 -0.725006 -0.570566 -0.385773 -0.859981 -0.508398 -0.044313 -0.881335 -0.452663 0.135444 -0.872443 -0.376815 0.311213 -0.761988 -0.176156 0.623173 -0.068557 0.371436 0.925924 0.696225 0.594819 0.401823 0.849360 0.525694 0.047266 0.823873 0.544624 -0.156899 0.794422 0.502922 -0.340535 0.655244 0.349499 -0.669705 -0.063530 -0.279903 -0.957924 -0.697413 -0.613370 -0.370665 -0.809173 -0.587304 -0.017693 -0.825543 -0.539622 0.165186 -0.808726 -0.475988 0.345539 -0.678853 -0.304922 0.667968 0.010088 0.242123 0.970193 0.702732 0.581962 0.409252 0.817791 0.574585 0.032700 0.747311 0.646385 -0.153990 0.675459 0.655694 -0.337374 0.481845 0.566930 -0.668144 -0.152376 -0.139910 -0.978370 -0.645271 -0.659081 -0.386313 -0.734909 -0.677737 -0.024096 -0.748283 -0.642591 0.164771 -0.723074 -0.595420 0.350198 -0.571277 -0.459863 0.679830 0.106619 0.089613 0.990253 0.705795 0.568999 0.422010 0.772626 0.633736 0.037788 0.656978 0.745715 -0.110857 0.544459 0.792075 -0.276010 0.303804 0.751161 -0.586055 -0.254197 0.028951 -0.966719 -0.595288 -0.674404 -0.436819 -0.650677 -0.755862 -0.072756 -0.656245 -0.744445 0.123062 -0.619497 -0.720231 0.312234 -0.442413 -0.625067 0.643088 0.220500 -0.072992 0.972652 0.705985 0.554889 0.440095 0.716074 0.694578 0.069279 0.566627 0.823428 -0.030002 0.427707 0.887853 -0.169659 0.161805 0.874961 -0.456358 -0.370274 0.189657 -0.909356 -0.574375 -0.647958 -0.500244 -0.575988 -0.802681 -0.154728 -0.563658 -0.824960 0.041600 -0.510663 -0.828638 0.229309 -0.305301 -0.775390 0.552776 0.343729 -0.225941 0.911483 0.705985 0.536573 0.462250 0.656239 0.743684 0.127608 0.490041 0.868497 0.074653 0.337737 0.940337 -0.041223 0.056812 0.949704 -0.307953 -0.484456 0.317828 -0.815039 -0.583875 -0.594724 -0.552624 -0.523534 -0.814420 -0.250265 -0.485139 -0.871997 -0.065278 -0.412127 -0.904094 0.112981 -0.177297 -0.890164 0.419730 0.463377 -0.352612 0.812986 0.708945 0.511599 0.485451 0.603553 0.770618 0.204626 0.434247 0.881261 0.186568 0.274240 0.957246 0.092048 -0.022268 0.988086 -0.152282 -0.586131 0.412626 -0.697274 -0.609796 -0.533211 -0.586375 -0.494270 -0.798828 -0.342886 -0.428251 -0.885601 -0.179756 -0.334201 -0.942319 -0.018577 -0.070773 -0.962071 0.263459 0.569285 -0.446206 0.690518 0.717008 0.479858 0.505605 0.565143 0.773106 0.287959 0.399214 0.868326 0.294345 0.232806 0.947079 0.221003 -0.080959 0.996709 0.004190 -0.671555 0.477233 -0.566800 -0.641529 -0.472408 -0.604377 -0.483016 -0.765433 -0.425215 -0.392812 -0.872828 -0.289604 -0.279345 -0.948312 -0.150569 0.010359 -0.994842 0.100906 0.657548 -0.508475 0.555953 0.730911 0.443140 0.519033 0.542828 0.755183 0.367473 0.381477 0.836663 0.393028 0.208780 0.916093 0.342323 -0.122486 0.979807 0.158034 -0.741449 0.515210 -0.429898 -0.674726 -0.414625 -0.610599 -0.484412 -0.720629 -0.496024 -0.374941 -0.841147 -0.389731 -0.244909 -0.929616 -0.275380 0.068193 -0.995950 -0.058592 0.728994 -0.543907 0.415611 0.750205 0.404167 0.523299 0.534818 0.722675 0.437848 0.377314 0.790946 0.481704 0.198518 0.867571 0.455974 -0.149491 0.939261 0.308936 -0.798126 0.528875 -0.288595 -0.708158 -0.359769 -0.607518 -0.494842 -0.667515 -0.556377 -0.370553 -0.795491 -0.479463 -0.226839 -0.892010 -0.390975 0.106864 -0.971358 -0.212237 0.786119 -0.555521 0.270951 0.773845 0.365779 0.517078 0.538272 0.680326 0.497412 0.384128 0.733382 0.560888 0.200022 0.801959 0.562898 -0.163334 0.873804 0.458027 -0.843398 0.518047 -0.142502 -0.741824 -0.307160 -0.596112 -0.512467 -0.606984 -0.607411 -0.376813 -0.738094 -0.559669 -0.221809 -0.838327 -0.498005 0.129942 -0.923563 -0.360759 0.830887 -0.543167 0.120819 0.800551 0.330823 0.499674 0.550709 0.631209 0.546164 0.400617 0.664553 0.630773 0.213097 0.717550 0.663107 -0.163325 0.778815 0.605617 -0.877485 0.479519 0.008992 -0.776161 -0.256341 -0.576077 -0.536800 -0.538914 -0.649167 -0.392321 -0.669364 -0.630902 -0.227920 -0.768779 -0.597521 0.139251 -0.851442 -0.505624 0.863480 -0.503088 -0.036134 0.828684 0.302544 0.470903 0.570259 0.577262 0.584443 0.426413 0.584649 0.690187 0.239254 0.611981 0.753814 -0.146075 0.647132 0.748253 -0.898241 0.407638 0.164299 -0.811666 -0.207706 -0.545946 -0.568192 -0.463575 -0.679895 -0.416794 -0.589051 -0.692316 -0.244796 -0.681771 -0.689393 0.134301 -0.750909 -0.646606 0.881461 -0.428426 -0.198691 0.855844 0.284772 0.431782 0.595381 0.519964 0.612502 0.461282 0.494975 0.736355 0.280780 0.485709 0.827798 -0.105435 0.473271 0.874584 -0.900695 0.296826 0.317243 -0.848519 -0.164163 -0.503056 -0.606970 -0.383788 -0.695912 -0.450476 -0.497817 -0.741114 -0.273439 -0.575417 -0.770796 0.112124 -0.617018 -0.778920 0.879628 -0.311574 -0.359411 0.878643 0.281178 0.385909 0.624495 0.460621 0.630741 0.504015 0.399270 0.765867 0.337796 0.347695 0.874644 -0.035751 0.265752 0.963378 -0.877402 0.145112 0.457283 -0.885251 -0.136187 -0.444728 -0.651526 -0.307685 -0.693429 -0.492969 -0.399105 -0.773109 -0.315354 -0.450376 -0.835292 0.068474 -0.448913 -0.890948 0.851759 -0.150217 -0.501938 0.893496 0.293104 0.340227 0.656014 0.400312 0.639841 0.551443 0.303752 0.776946 0.403615 0.218034 0.888570 0.057107 0.066463 0.996153 -0.818468 -0.045440 0.572753 -0.915046 -0.147405 -0.375451 -0.696025 -0.248056 -0.673809 -0.541688 -0.299821 -0.785290 -0.370284 -0.312975 -0.874606 0.001781 -0.255799 -0.966728 0.795535 0.044843 -0.604246 0.898574 0.316797 0.303654 0.688499 0.339919 0.640644 0.598752 0.214605 0.771648 0.465434 0.114273 0.877674 0.146537 -0.072309 0.986559 -0.726970 -0.252413 0.638594 -0.923274 -0.214862 -0.318431 -0.731646 -0.212464 -0.647729 -0.591406 -0.207807 -0.779137 -0.433728 -0.175172 -0.883852 -0.082159 -0.057570 -0.994955 0.717963 0.248645 -0.650158 0.895656 0.343325 0.282715 0.720560 0.280470 0.634137 0.641470 0.135054 0.755167 0.514224 0.034289 0.856970 0.208646 -0.158911 0.964994 -0.641781 -0.433290 0.632753 -0.902271 -0.308986 -0.300725 -0.753663 -0.193044 -0.628272 -0.636585 -0.127256 -0.760635 -0.497859 -0.049002 -0.865872 -0.171091 0.124272 -0.977386 0.633906 0.433296 -0.640638 0.889549 0.362951 0.277433 0.750794 0.223204 0.621682 0.677449 0.064740 0.732715 0.551865 -0.037451 0.833092 0.251908 -0.242586 0.936853 -0.575549 -0.581161 0.575322 -0.869902 -0.376446 -0.318684 -0.766251 -0.173205 -0.618757 -0.674072 -0.057940 -0.736390 -0.554742 0.057864 -0.830008 -0.251625 0.275693 -0.927727 0.558971 0.581764 -0.590849 0.884183 0.371412 0.283327 0.777434 0.170034 0.605545 0.707148 0.003254 0.707058 0.585261 -0.108712 0.803524 0.294372 -0.337238 0.894212 -0.520127 -0.691628 0.501118 -0.849017 -0.400225 -0.344949 -0.777803 -0.143800 -0.611836 -0.704353 0.001773 -0.709847 -0.600413 0.142771 -0.786842 -0.316362 0.392088 -0.863818 0.500312 0.691021 -0.521706 0.880281 0.371632 0.294949 0.799059 0.124083 0.588309 0.732329 -0.048426 0.679227 0.619076 -0.176727 0.765188 0.340611 -0.430510 0.835850 -0.476418 -0.767987 0.428044 -0.845327 -0.394490 -0.360278 -0.793351 -0.107699 -0.599162 -0.729498 0.051645 -0.682030 -0.634763 0.205914 -0.744765 -0.364187 0.475404 -0.800848 0.457323 0.767189 -0.449752 0.876137 0.369588 0.309497 0.815094 0.088290 0.572562 0.754872 -0.087717 0.649980 0.654700 -0.234655 0.718543 0.390094 -0.510105 0.766564 -0.440439 -0.819550 0.366541 -0.854338 -0.377284 -0.357442 -0.813778 -0.072868 -0.576589 -0.751963 0.089713 -0.653072 -0.660619 0.248491 -0.708403 -0.399129 0.530171 -0.748074 0.423617 0.819593 -0.385766 0.869651 0.371255 0.325387 0.826096 0.065154 0.559750 0.776197 -0.112507 0.620371 0.691704 -0.277041 0.666929 0.441251 -0.569822 0.693254 -0.407379 -0.855605 0.319346 -0.868858 -0.361899 -0.337810 -0.837200 -0.046976 -0.544875 -0.773311 0.113776 -0.623735 -0.681361 0.272152 -0.679471 -0.426420 0.561592 -0.709070 0.393050 0.856582 -0.334333 0.859665 0.380008 0.341423 0.833329 0.055651 0.549969 0.796928 -0.121655 0.591698 0.728978 -0.301038 0.614791 0.493061 -0.607662 0.622606 -0.372099 -0.882715 0.286978 -0.882939 -0.356081 -0.305981 -0.861149 -0.034769 -0.507162 -0.794307 0.122639 -0.595009 -0.699974 0.278732 -0.657529 -0.451099 0.574166 -0.683259 0.360288 0.884326 -0.296918 0.845837 0.397385 0.355872 0.838022 0.059839 0.542345 0.816906 -0.115636 0.565060 0.765015 -0.306473 0.566415 0.544078 -0.624614 0.560211 -0.332171 -0.904618 0.267073 -0.892270 -0.363053 -0.268416 -0.883026 -0.037995 -0.467783 -0.814705 0.116559 -0.568040 -0.718227 0.270524 -0.641067 -0.476459 0.571932 -0.667743 0.322906 0.906346 -0.272525 0.828645 0.422794 0.366867 0.841085 0.076439 0.535475 0.835417 -0.096035 0.541162 0.798747 -0.295357 0.524182 0.593462 -0.623825 0.508572 -0.287382 -0.922732 0.256859 -0.895027 -0.382218 -0.229860 -0.901139 -0.055692 -0.429938 -0.833619 0.096916 -0.543771 -0.736238 0.249623 -0.629000 -0.503350 0.557765 -0.659952 0.280649 0.924234 -0.258895 0.808206 0.455048 0.373812 0.842461 0.103835 0.528657 0.851357 -0.064730 0.520578 0.828902 -0.269956 0.489945 0.640368 -0.607937 0.469406 -0.236922 -0.937539 0.254730 -0.890280 -0.412097 -0.193850 -0.914203 -0.085948 -0.396038 -0.850078 0.065672 -0.522546 -0.753863 0.218254 -0.619723 -0.532316 0.533913 -0.656945 0.232838 0.938565 -0.254720 0.784741 0.492832 0.375896 0.841817 0.140211 0.521234 0.863648 -0.024403 0.503505 0.854272 -0.233292 0.464537 0.683347 -0.580212 0.443160 -0.183090 -0.948539 0.258364 -0.877950 -0.449970 -0.163493 -0.921162 -0.126058 -0.368199 -0.862797 0.025343 -0.504915 -0.770113 0.178915 -0.612304 -0.562235 0.502829 -0.656548 0.181697 0.949139 -0.257141 0.758874 0.533742 0.373135 0.838776 0.182995 0.512804 0.871296 0.022460 0.490244 0.874028 -0.188267 0.447918 0.721551 -0.543393 0.429055 -0.127126 -0.955392 0.266579 -0.858723 -0.493056 -0.139610 -0.921770 -0.173075 -0.346967 -0.870839 -0.021552 -0.491095 -0.783716 0.133656 -0.606569 -0.591525 0.465995 -0.657987 0.128436 0.955730 -0.264733 0.730461 0.576286 0.366498 0.832530 0.230159 0.503905 0.873570 0.073442 0.481125 0.887266 -0.137420 0.440312 0.753758 -0.499713 0.426773 -0.070697 -0.957872 0.278357 -0.833151 -0.539119 -0.123328 -0.915746 -0.224456 -0.333211 -0.873515 -0.072554 -0.481359 -0.793940 0.084746 -0.602061 -0.619156 0.425253 -0.660156 0.074579 0.958150 -0.276383 0.700136 0.618742 0.356327 0.822850 0.279520 0.494759 0.870043 0.126032 0.476593 0.893194 -0.083330 0.441883 0.778548 -0.451456 0.435949 -0.016002 -0.956044 0.292787 -0.801954 -0.586090 -0.115626 -0.903002 -0.277755 -0.327780 -0.870356 -0.125188 -0.476244 -0.800119 0.034523 -0.598847 -0.643896 0.382667 -0.662544 0.022541 0.956593 -0.290554 0.668905 0.659280 0.343387 0.809807 0.328807 0.485900 0.860512 0.177903 0.477356 0.891132 -0.028435 0.452852 0.794490 -0.400812 0.456218 0.034828 -0.950374 0.309153 -0.765887 -0.632205 -0.117191 -0.883659 -0.330711 -0.331327 -0.861197 -0.177102 -0.476418 -0.801787 -0.014790 -0.597427 -0.664678 0.340155 -0.665205 -0.025783 0.951551 -0.306407 0.637742 0.696523 0.328847 0.793608 0.376015 0.478330 0.844954 0.226874 0.484336 0.880464 0.024873 0.473459 0.800089 -0.350112 0.487113 0.079584 -0.941768 0.326709 -0.725639 -0.675927 -0.128727 -0.857808 -0.381282 -0.344659 -0.846003 -0.226121 -0.482854 -0.798689 -0.060996 -0.598644 -0.680617 0.299861 -0.668464 -0.068167 0.944012 -0.322792 0.607913 0.729206 0.314165 0.774687 0.419284 0.473352 0.823260 0.270966 0.498819 0.860194 0.074401 0.504510 0.793398 -0.301494 0.528792 0.116754 -0.931361 0.344870 -0.681259 -0.716206 -0.151446 -0.825186 -0.427698 -0.368975 -0.824778 -0.270221 -0.496710 -0.790902 -0.101930 -0.603394 -0.691328 0.263933 -0.672611 -0.103014 0.935170 -0.338889 0.580812 0.756366 0.300945 0.753612 0.456939 0.472521 0.795230 0.308200 0.522132 0.829669 0.117493 0.545752 0.772822 -0.258242 0.579704 0.143071 -0.921199 0.361833 -0.633197 -0.751312 -0.185988 -0.785437 -0.467965 -0.405090 -0.797075 -0.307525 -0.519712 -0.777593 -0.135662 -0.613958 -0.695209 0.234714 -0.679407 -0.127481 0.927096 -0.352479 0.557167 0.777154 0.292568 0.730343 0.487543 0.478435 0.759716 0.337532 0.555791 0.788001 0.152290 0.596542 0.737504 -0.222633 0.637591 0.158761 -0.912664 0.376617 -0.581127 -0.780232 -0.231363 -0.737850 -0.500658 -0.452680 -0.761876 -0.336927 -0.553196 -0.757154 -0.161285 -0.633012 -0.690246 0.213127 -0.691475 -0.141196 0.921209 -0.362544 0.535419 0.791994 0.293381 0.703247 0.510766 0.494532 0.714496 0.358328 0.600914 0.733387 0.177445 0.656244 0.686081 -0.196644 0.700446 0.163827 -0.907230 0.387421 -0.523197 -0.802262 -0.287471 -0.680187 -0.524836 -0.511755 -0.716874 -0.357810 -0.598385 -0.727069 -0.178384 -0.662986 -0.673983 0.199860 -0.711198 -0.144056 0.918911 -0.367219 0.512835 0.801499 0.307569 0.669614 0.526616 0.523729 0.655881 0.370584 0.657638 0.664673 0.192006 0.722041 0.619482 -0.182241 0.763564 0.159442 -0.906446 0.391067 -0.458175 -0.816354 -0.351628 -0.610158 -0.539729 -0.579999 -0.657892 -0.370249 -0.655816 -0.681373 -0.187720 -0.707454 -0.640460 0.194622 -0.742922 -0.136358 0.921474 -0.363720 0.482287 0.807043 0.340707 0.623374 0.535994 0.569312 0.577766 0.376010 0.724433 0.579925 0.197383 0.790397 0.539960 -0.178102 0.822631 0.151342 -0.909198 0.387885 -0.383705 -0.823236 -0.418395 -0.524914 -0.546293 -0.652709 -0.579004 -0.375806 -0.723550 -0.611457 -0.191647 -0.767718 -0.582194 0.194758 -0.789379 -0.124348 0.927810 -0.351718 0.431329 0.811072 0.395118 0.554643 0.541088 0.632135 0.472443 0.376687 0.796808 0.475446 0.196403 0.857541 0.448653 -0.180954 0.875195 0.145540 -0.913620 0.379627 -0.295559 -0.824530 -0.482489 -0.419860 -0.546643 -0.724499 -0.472481 -0.376472 -0.796888 -0.507121 -0.192110 -0.840192 -0.491360 0.198297 -0.848082 -0.116096 0.936094 -0.332040 0.346277 0.814213 0.465992 0.452249 0.543303 0.707314 0.331697 0.373902 0.866126 0.346125 0.192180 0.918294 0.345080 -0.186126 0.919933 0.147569 -0.916602 0.371569 -0.189216 -0.822165 -0.536882 -0.290148 -0.543137 -0.787919 -0.330311 -0.373446 -0.866852 -0.358093 -0.189150 -0.914326 -0.360915 0.204675 -0.909862 -0.120943 0.943083 -0.309786 0.214368 0.814242 0.539496 0.305435 0.542069 0.782860 0.150169 0.366435 0.918245 0.185528 0.186054 0.964864 0.223848 -0.189495 0.956025 0.159114 -0.914147 0.372851 -0.058534 -0.817229 -0.573333 -0.130197 -0.536807 -0.833599 -0.147696 -0.365513 -0.919014 -0.161193 -0.179533 -0.970456 -0.190938 0.215478 -0.957660 -0.144267 0.944158 -0.296232 0.032225 0.805459 0.591774 0.110242 0.533633 0.838500 -0.067952 0.349464 0.934483 -0.008883 0.174804 0.984563 0.076684 -0.192157 0.978364 0.174680 -0.903909 0.390429 0.102132 -0.806975 -0.581688 0.063621 -0.524463 -0.849053 0.070957 -0.347984 -0.934811 0.071576 -0.157588 -0.984908 0.006361 0.234341 -0.972134 -0.179966 0.935801 -0.303131 -0.185619 0.780754 0.596632 -0.122791 0.511702 0.850343 -0.303554 0.317765 0.898265 -0.226908 0.152331 0.961930 -0.096990 -0.200720 0.974836 0.183200 -0.887039 0.423793 0.287692 -0.784858 -0.548845 0.283249 -0.499364 -0.818783 0.306378 -0.315837 -0.897986 0.312230 -0.120234 -0.942367 0.208301 0.263232 -0.941977 -0.212345 0.917901 -0.335213 -0.407895 0.737153 0.538728 -0.366868 0.472034 0.801619 -0.526774 0.271077 0.805622 -0.444439 0.115423 0.888342 -0.282673 -0.221402 0.933315 0.175247 -0.867992 0.464627 0.475166 -0.746301 -0.466104 0.503207 -0.457439 -0.733166 0.528635 -0.269109 -0.805062 0.528712 -0.071064 -0.845821 0.390930 0.299445 -0.870348 -0.225464 0.894511 -0.386026 -0.598927 0.679731 0.423381 -0.587701 0.417241 0.693194 -0.711514 0.215070 0.668949 -0.634859 0.066971 0.769720 -0.456955 -0.254591 0.852277 0.149847 -0.851567 0.502374 0.634273 -0.694325 -0.340015 0.692154 -0.402338 -0.599205 0.712277 -0.213561 -0.668620 0.701595 -0.017322 -0.712366 0.540597 0.338192 -0.770312 -0.213534 0.871593 -0.441280 -0.736821 0.618412 0.273241 -0.760422 0.355603 0.543420 -0.846894 0.157025 0.508049 -0.782611 0.013489 0.622365 -0.601934 -0.295317 0.741932 0.112115 -0.839756 0.531262 0.746722 -0.637500 -0.189738 0.831779 -0.342513 -0.436840 0.847000 -0.156176 -0.508134 0.827731 0.035605 -0.559995 0.655779 0.376506 -0.654368 -0.181325 0.853157 -0.489127 -0.820257 0.560915 0.112040 -0.878896 0.294998 0.374858 -0.935401 0.101549 0.338693 -0.885943 -0.039595 0.462102 -0.712110 -0.338117 0.615285 0.066946 -0.832358 0.550180 0.811630 -0.583202 -0.033648 0.921296 -0.284678 -0.264900 0.935306 -0.101234 -0.339048 0.912388 0.085776 -0.400239 0.740326 0.413903 -0.529719 -0.136781 0.840269 -0.524632 -0.859003 0.509864 -0.046406 -0.949613 0.239086 0.202666 -0.984410 0.049641 0.168737 -0.950256 -0.090189 0.298127 -0.790018 -0.380290 0.480887 0.017497 -0.828800 0.559272 0.836914 -0.534461 0.118010 0.968369 -0.231254 -0.093716 0.984354 -0.049607 -0.169076 0.962008 0.133805 -0.237983 0.798081 0.451498 -0.399019 -0.086417 0.832424 -0.547360 -0.863378 0.464276 -0.197552 -0.981666 0.187721 0.033067 -1.000000 -0.000034 -0.000066 -0.981295 -0.138906 0.133290 -0.839794 -0.421807 0.341795 -0.034212 -0.828774 0.558537 0.830748 -0.491115 0.262037 0.980602 -0.181654 0.073627 1.000000 -0.000058 -0.000078 0.980608 0.181560 -0.073783 0.830722 0.491086 -0.262173 -0.034256 0.828793 -0.558506 -0.839768 0.421818 -0.341846 -0.981285 0.138864 -0.133401 -0.984380 -0.049724 -0.168888 -0.981653 -0.187763 -0.033196 -0.863410 -0.464251 0.197471 -0.086459 -0.832402 0.547387 0.798120 -0.451557 0.398875 0.962037 -0.133932 0.237796 0.984391 0.049475 0.168897 0.968398 0.231186 0.093581 0.836888 0.534484 -0.118091 0.017456 0.828821 -0.559241 -0.789964 0.380257 -0.481000 -0.950217 0.090110 -0.298276 -0.935332 -0.101659 -0.338850 -0.949552 -0.239186 -0.202834 -0.858983 -0.509911 0.046250 -0.136809 -0.840250 0.524656 0.740382 -0.413875 0.529663 0.912448 -0.085851 0.400085 0.935396 0.101095 0.338843 0.921382 0.284570 0.264716 0.811648 0.583184 0.033525 0.066947 0.832385 -0.550140 -0.712031 0.338104 -0.615384 -0.885871 0.039514 -0.462245 -0.846767 -0.157146 -0.508223 -0.878760 -0.295136 -0.375067 -0.820170 -0.561004 -0.112233 -0.181293 -0.853145 0.489159 0.655855 -0.376435 0.654333 0.827835 -0.035667 0.559837 0.847171 0.156004 0.507902 0.831990 0.342322 0.436588 0.746881 0.637379 0.189519 0.112137 0.839787 -0.531209 -0.601893 0.295376 -0.741942 -0.782525 -0.013534 -0.622473 -0.711262 -0.215259 -0.669156 -0.760129 -0.355814 -0.543692 -0.736622 -0.618539 -0.273492 -0.213514 -0.871578 0.441320 0.540743 -0.338093 0.770254 0.701838 0.017242 0.712127 0.712657 0.213343 0.668285 0.692617 0.402093 0.598834 0.634636 0.694168 0.339659 0.149778 0.851594 -0.502349 -0.456991 0.254660 -0.852237 -0.634740 -0.067050 -0.769811 -0.526392 -0.271408 -0.805760 -0.587278 -0.417565 -0.693357 -0.598606 -0.679943 -0.423496 -0.225379 -0.894432 0.386258 0.391180 -0.299185 0.870326 0.529161 0.071081 0.845539 0.529311 0.268961 0.804667 0.503916 0.457314 0.732757 0.475580 0.746323 0.465647 0.175000 0.867909 -0.464874 -0.282670 0.221290 -0.933343 -0.444203 -0.115671 -0.888428 -0.303088 -0.318102 -0.898303 -0.366395 -0.472356 -0.801645 -0.407530 -0.737366 -0.538712 -0.212305 -0.917823 0.335451 0.208516 -0.262953 0.942007 0.312770 0.120315 0.942178 0.307233 0.315765 0.897720 0.284122 0.499306 0.818516 0.288194 0.784903 0.548518 0.183123 0.886962 -0.423986 -0.096855 0.200571 -0.974880 -0.226546 -0.152609 -0.961971 -0.067479 -0.349759 -0.934407 -0.122082 -0.512024 -0.850252 -0.184903 -0.780990 -0.596545 -0.179912 -0.935799 0.303168 0.006130 -0.234056 0.972204 0.071797 0.157794 0.984858 0.071818 0.348031 0.934728 0.064905 0.524417 0.848984 0.103242 0.806901 0.581594 0.174697 0.903910 -0.390419 0.076416 0.192089 -0.978398 -0.008775 -0.175017 -0.984526 0.150496 -0.366930 -0.917994 0.110973 -0.534122 -0.838093 0.033034 -0.805829 -0.591227 -0.144307 -0.943982 0.296772 -0.191547 -0.214862 0.957677 -0.161301 0.180061 0.970340 -0.146966 0.365910 0.918973 -0.128778 0.537099 0.833631 -0.057092 0.817422 0.573204 0.159179 0.913890 -0.373453 0.223200 0.189055 -0.956264 0.185318 -0.186522 -0.964814 0.331864 -0.374610 -0.865756 0.305663 -0.542717 -0.782323 0.214455 -0.814725 -0.538732 -0.121402 -0.942707 0.310749 -0.361107 -0.203813 0.909979 -0.357902 0.189911 0.914243 -0.329762 0.374144 0.866760 -0.289386 0.543775 0.787759 -0.188467 0.822653 0.536398 0.147863 0.916130 -0.372616 0.344971 0.185298 -0.920141 0.346139 -0.192934 -0.918131 0.472590 -0.377359 -0.796404 0.452338 -0.543905 -0.706794 0.346203 -0.814610 -0.465353 -0.116342 -0.935887 0.332535 -0.491373 -0.197632 0.848230 -0.506838 0.192843 0.840195 -0.472033 0.377187 0.796816 -0.419383 0.547277 0.724297 -0.295124 0.824926 0.482078 0.145855 0.913380 -0.380083 0.448854 0.180253 -0.875237 0.475607 -0.197119 -0.857287 0.577771 -0.376746 -0.724047 0.554595 -0.541750 -0.631610 0.431089 -0.811541 -0.394414 -0.124955 -0.927463 0.352418 -0.582409 -0.193933 0.789424 -0.611369 0.192455 0.767586 -0.578722 0.376583 0.723372 -0.524513 0.546999 0.652440 -0.383198 0.823727 0.417892 0.151858 0.908801 -0.388614 0.540104 0.177257 -0.822720 0.579955 -0.198178 -0.790176 0.655807 -0.371256 -0.657333 0.622870 -0.536684 -0.569212 0.481380 -0.807635 -0.340586 -0.137206 -0.921068 0.364428 -0.640118 -0.193700 0.743458 -0.680928 0.188534 0.707666 -0.657726 0.370941 0.655591 -0.610304 0.540295 0.579319 -0.458295 0.816741 0.350571 0.160140 0.905985 -0.391851 0.620153 0.181540 -0.763186 0.665008 -0.192661 -0.721558 0.714566 -0.358679 -0.600621 0.669542 -0.526942 -0.523495 0.512674 -0.801651 -0.307443 -0.143757 -0.919000 0.367114 -0.673784 -0.199583 0.711464 -0.726815 0.178833 0.663143 -0.716664 0.358238 0.598379 -0.680048 0.525177 0.511590 -0.523125 0.802378 0.287279 0.163684 0.907369 -0.387155 0.686364 0.196465 -0.700218 0.733587 -0.177778 -0.655930 0.759626 -0.338063 -0.555592 0.703184 -0.511219 -0.494153 0.535217 -0.792334 -0.292829 -0.141957 -0.920882 0.363077 -0.690660 -0.212518 0.691249 -0.757300 0.161817 0.632703 -0.761795 0.337457 0.552984 -0.737549 0.501203 0.452567 -0.580570 0.780707 0.231159 0.159478 0.912300 -0.377193 0.737501 0.221937 -0.637837 0.787874 -0.152898 -0.596554 0.795154 -0.308636 -0.521991 0.729821 -0.488066 -0.478699 0.556316 -0.777634 -0.292914 -0.128119 -0.926840 0.352922 -0.694860 -0.234001 0.680009 -0.777236 0.136242 0.614282 -0.797029 0.307950 0.519530 -0.785682 0.468222 0.404318 -0.633397 0.751431 0.184823 0.143843 0.920911 -0.362261 0.773483 0.257928 -0.578962 0.830013 -0.117811 -0.545159 0.823316 -0.271001 -0.498708 0.753404 -0.457054 -0.472740 0.580523 -0.756418 -0.301370 -0.102674 -0.935304 0.338621 -0.690882 -0.263834 0.673108 -0.790579 0.102099 0.603788 -0.824710 0.270305 0.496778 -0.825358 0.427641 0.368657 -0.681605 0.715973 0.150987 0.116250 0.931516 -0.344621 0.793729 0.301769 -0.528137 0.860485 -0.074299 -0.504028 0.844947 -0.226891 -0.484340 0.774695 -0.419304 -0.473320 0.607917 -0.729228 -0.314109 -0.068254 -0.943980 0.322867 -0.680679 -0.299814 0.668422 -0.798721 0.061021 0.598599 -0.846006 0.226134 0.482842 -0.857788 0.381298 0.344690 -0.725592 0.675971 0.128764 0.079692 0.941746 -0.326747 0.800060 0.350081 -0.487183 0.880439 -0.024888 -0.473506 0.860522 -0.177909 -0.477337 0.793629 -0.376019 -0.478291 0.637759 -0.696514 -0.328833 -0.025752 -0.951559 0.306387 -0.664674 -0.340131 0.665222 -0.801781 0.014818 0.597435 -0.861185 0.177119 0.476434 -0.883630 0.330730 0.331386 -0.765853 0.632226 0.117299 0.034698 0.950389 -0.309122 0.794434 0.400829 -0.456301 0.891113 0.028430 -0.452890 0.870036 -0.126072 -0.476595 0.809795 -0.328846 -0.485893 0.668870 -0.659318 -0.343384 0.022442 -0.956570 0.290637 -0.643922 -0.382577 0.662570 -0.800123 -0.034464 0.598845 -0.870362 0.125226 0.476223 -0.902995 0.277799 0.327761 -0.801898 0.586170 0.115608 -0.015817 0.956030 -0.292844 0.778540 0.451398 -0.436022 0.893177 0.083287 -0.441925 0.873584 -0.073458 -0.481098 0.822879 -0.279529 -0.494706 0.700218 -0.618698 -0.356241 0.074695 -0.958175 0.276263 -0.619233 -0.425288 0.660061 -0.793987 -0.084735 0.602001 -0.873505 0.072583 0.481373 -0.915731 0.224477 0.333237 -0.833163 0.539110 0.123288 -0.070721 0.957878 -0.278332 0.753793 0.499768 -0.426648 0.887301 0.137439 -0.440236 0.871290 -0.022519 -0.490252 0.832495 -0.230256 -0.503919 0.730387 -0.576409 -0.366453 0.128187 -0.955699 0.264968 -0.591615 -0.465892 0.657979 -0.783755 -0.133592 0.606532 -0.870861 0.021585 0.491056 -0.921795 0.173073 0.346899 -0.858742 0.493052 0.139509 -0.127033 0.955402 -0.266589 0.721614 0.543384 -0.428961 0.874055 0.188253 -0.447872 0.863653 0.024428 -0.503495 0.838739 -0.183010 -0.512859 0.758813 -0.533747 -0.373252 0.181823 -0.949136 0.257064 -0.562094 -0.502772 0.656712 -0.770025 -0.178862 0.612429 -0.862784 -0.025350 0.504937 -0.921195 0.125997 0.368138 -0.878002 0.449888 0.163443 -0.183208 0.948532 -0.258306 0.683333 0.580291 -0.443079 0.854283 0.233355 -0.464485 0.851400 0.064707 -0.520510 0.842086 -0.140093 -0.520832 0.785140 -0.492585 -0.375387 0.233119 -0.938549 0.254521 -0.532613 -0.534153 0.656508 -0.754093 -0.218342 0.619412 -0.850059 -0.065604 0.522586 -0.913992 0.086146 0.396481 -0.890046 0.412301 0.194488 -0.237225 0.937508 -0.254566 0.640124 0.607839 -0.469864 0.828772 0.269828 -0.490234 0.835490 0.095668 -0.541113 0.842681 -0.104107 -0.528253 0.808378 -0.455301 -0.373130 0.280009 -0.924277 0.259435 -0.504019 -0.557639 0.659549 -0.736663 -0.249432 0.628579 -0.833754 -0.096598 0.543621 -0.901031 0.056133 0.430106 -0.894725 0.382772 0.230115 -0.286674 0.922876 -0.257134 0.593553 0.623326 -0.509077 0.798719 0.294895 -0.524486 0.817067 0.115240 -0.564908 0.841217 -0.076827 -0.535212 0.828646 -0.423108 -0.366504 0.322671 -0.906350 0.272787 -0.476778 -0.571643 0.667762 -0.718457 -0.270127 0.640977 -0.814833 -0.116132 0.567944 -0.883043 0.038429 0.467717 -0.892126 0.363443 0.268364 -0.331887 0.904699 -0.267153 0.544347 0.624318 -0.560279 0.765198 0.306085 -0.566378 0.797106 0.121178 -0.591556 0.838122 -0.060344 -0.542135 0.845763 -0.397867 -0.355509 0.359762 -0.884372 0.297419 -0.451508 -0.573754 0.683335 -0.700249 -0.278266 0.657434 -0.794506 -0.122177 0.594839 -0.861269 0.035211 0.506927 -0.882875 0.356526 0.305648 -0.371422 0.882886 -0.287328 0.493531 0.607325 -0.622562 0.729245 0.300612 -0.614683 0.776408 0.112115 -0.620178 0.833430 -0.056080 -0.549773 0.859614 -0.380368 -0.341150 0.392861 -0.856539 0.334667 -0.426651 -0.561202 0.709240 -0.681550 -0.271695 0.679464 -0.773478 -0.113336 0.623607 -0.837328 0.047382 0.544643 -0.868822 0.362250 0.337526 -0.407040 0.855769 -0.319341 0.441716 0.569694 -0.693062 0.692036 0.276732 -0.666712 0.755147 0.087289 -0.649718 0.826399 -0.065429 -0.559270 0.869832 -0.371386 -0.324752 0.423435 -0.819482 0.386201 -0.399589 -0.529919 0.748007 -0.661000 -0.248132 0.708173 -0.752178 -0.089207 0.652894 -0.813735 0.073582 0.576560 -0.853904 0.378128 0.357584 -0.439973 0.819877 -0.366368 0.390307 0.509584 -0.766801 0.654898 0.234059 -0.718558 0.732692 0.047795 -0.678880 0.815378 -0.088874 -0.572066 0.876207 -0.370067 -0.308727 0.456664 -0.767060 0.450641 -0.364828 -0.474814 0.800907 -0.635260 -0.205327 0.744504 -0.729889 -0.051041 0.681657 -0.793584 0.108384 0.598730 -0.845139 0.395381 0.359741 -0.475051 0.768459 -0.428716 0.341433 0.430058 -0.835747 0.619541 0.176090 -0.764958</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="1440" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="4719">0 0 0 0 0.083333 0 0 0.166667 0 0 0.250000 0 0 0.333333 0 0 0.416667 0 0 0.500000 0 0 0.583333 0 0 0.666667 0 0 0.750000 0 0 0.833333 0 0 0.916667 0 0 1.000000 0 0.008333 0 0 0.008333 0.083333 0 0.008333 0.166667 0 0.008333 0.250000 0 0.008333 0.333333 0 0.008333 0.416667 0 0.008333 0.500000 0 0.008333 0.583333 0 0.008333 0.666667 0 0.008333 0.750000 0 0.008333 0.833333 0 0.008333 0.916667 0 0.008333 1.000000 0 0.016667 0 0 0.016667 0.083333 0 0.016667 0.166667 0 0.016667 0.250000 0 0.016667 0.333333 0 0.016667 0.416667 0 0.016667 0.500000 0 0.016667 0.583333 0 0.016667 0.666667 0 0.016667 0.750000 0 0.016667 0.833333 0 0.016667 0.916667 0 0.016667 1.000000 0 0.025000 0 0 0.025000 0.083333 0 0.025000 0.166667 0 0.025000 0.250000 0 0.025000 0.333333 0 0.025000 0.416667 0 0.025000 0.500000 0 0.025000 0.583333 0 0.025000 0.666667 0 0.025000 0.750000 0 0.025000 0.833333 0 0.025000 0.916667 0 0.025000 1.000000 0 0.033333 0 0 0.033333 0.083333 0 0.033333 0.166667 0 0.033333 0.250000 0 0.033333 0.333333 0 0.033333 0.416667 0 0.033333 0.500000 0 0.033333 0.583333 0 0.033333 0.666667 0 0.033333 0.750000 0 0.033333 0.833333 0 0.033333 0.916667 0 0.033333 1.000000 0 0.041667 0 0 0.041667 0.083333 0 0.041667 0.166667 0 0.041667 0.250000 0 0.041667 0.333333 0 0.041667 0.416667 0 0.041667 0.500000 0 0.041667 0.583333 0 0.041667 0.666667 0 0.041667 0.750000 0 0.041667 0.833333 0 0.041667 0.916667 0 0.041667 1.000000 0 0.050000 0 0 0.050000 0.083333 0 0.050000 0.166667 0 0.050000 0.250000 0 0.050000 0.333333 0 0.050000 0.416667 0 0.050000 0.500000 0 0.050000 0.583333 0 0.050000 0.666667 0 0.050000 0.750000 0 0.050000 0.833333 0 0.050000 0.916667 0 0.050000 1.000000 0 0.058333 0 0 0.058333 0.083333 0 0.058333 0.166667 0 0.058333 0.250000 0 0.058333 0.333333 0 0.058333 0.416667 0 0.058333 0.500000 0 0.058333 0.583333 0 0.058333 0.666667 0 0.058333 0.750000 0 0.058333 0.833333 0 0.058333 0.916667 0 0.058333 1.000000 0 0.066667 0 0 0.066667 0.083333 0 0.066667 0.166667 0 0.066667 0.250000 0 0.066667 0.333333 0 0.066667 0.416667 0 0.066667 0.500000 0 0.066667 0.583333 0 0.066667 0.666667 0 0.066667 0.750000 0 0.066667 0.833333 0 0.066667 0.916667 0 0.066667 1.000000 0 0.075000 0 0 0.075000 0.083333 0 0.075000 0.166667 0 0.075000 0.250000 0 0.075000 0.333333 0 0.075000 0.416667 0 0.075000 0.500000 0 0.075000 0.583333 0 0.075000 0.666667 0 0.075000 0.750000 0 0.075000 0.833333 0 0.075000 0.916667 0 0.075000 1.000000 0 0.083333 0 0 0.083333 0.083333 0 0.083333 0.166667 0 0.083333 0.250000 0 0.083333 0.333333 0 0.083333 0.416667 0 0.083333 0.500000 0 0.083333 0.583333 0 0.083333 0.666667 0 0.083333 0.750000 0 0.083333 0.833333 0 0.083333 0.916667 0 0.083333 1.000000 0 0.091667 0 0 0.091667 0.083333 0 0.091667 0.166667 0 0.091667 0.250000 0 0.091667 0.333333 0 0.091667 0.416667 0 0.091667 0.500000 0 0.091667 0.583333 0 0.091667 0.666667 0 0.091667 0.750000 0 0.091667 0.833333 0 0.091667 0.916667 0 0.091667 1.000000 0 0.100000 0 0 0.100000 0.083333 0 0.100000 0.166667 0 0.100000 0.250000 0 0.100000 0.333333 0 0.100000 0.416667 0 0.100000 0.500000 0 0.100000 0.583333 0 0.100000 0.666667 0 0.100000 0.750000 0 0.100000 0.833333 0 0.100000 0.916667 0 0.100000 1.000000 0 0.108333 0 0 0.108333 0.083333 0 0.108333 0.166667 0 0.108333 0.250000 0 0.108333 0.333333 0 0.108333 0.416667 0 0.108333 0.500000 0 0.108333 0.583333 0 0.108333 0.666667 0 0.108333 0.750000 0 0.108333 0.833333 0 0.108333 0.916667 0 0.108333 1.000000 0 0.116667 0 0 0.116667 0.083333 0 0.116667 0.166667 0 0.116667 0.250000 0 0.116667 0.333333 0 0.116667 0.416667 0 0.116667 0.500000 0 0.116667 0.583333 0 0.116667 0.666667 0 0.116667 0.750000 0 0.116667 0.833333 0 0.116667 0.916667 0 0.116667 1.000000 0 0.125000 0 0 0.125000 0.083333 0 0.125000 0.166667 0 0.125000 0.250000 0 0.125000 0.333333 0 0.125000 0.416667 0 0.125000 0.500000 0 0.125000 0.583333 0 0.125000 0.666667 0 0.125000 0.750000 0 0.125000 0.833333 0 0.125000 0.916667 0 0.125000 1.000000 0 0.133333 0 0 0.133333 0.083333 0 0.133333 0.166667 0 0.133333 0.250000 0 0.133333 0.333333 0 0.133333 0.416667 0 0.133333 0.500000 0 0.133333 0.583333 0 0.133333 0.666667 0 0.133333 0.750000 0 0.133333 0.833333 0 0.133333 0.916667 0 0.133333 1.000000 0 0.141667 0 0 0.141667 0.083333 0 0.141667 0.166667 0 0.141667 0.250000 0 0.141667 0.333333 0 0.141667 0.416667 0 0.141667 0.500000 0 0.141667 0.583333 0 0.141667 0.666667 0 0.141667 0.750000 0 0.141667 0.833333 0 0.141667 0.916667 0 0.141667 1.000000 0 0.150000 0 0 0.150000 0.083333 0 0.150000 0.166667 0 0.150000 0.250000 0 0.150000 0.333333 0 0.150000 0.416667 0 0.150000 0.500000 0 0.150000 0.583333 0 0.150000 0.666667 0 0.150000 0.750000 0 0.150000 0.833333 0 0.150000 0.916667 0 0.150000 1.000000 0 0.158333 0 0 0.158333 0.083333 0 0.158333 0.166667 0 0.158333 0.250000 0 0.158333 0.333333 0 0.158333 0.416667 0 0.158333 0.500000 0 0.158333 0.583333 0 0.158333 0.666667 0 0.158333 0.750000 0 0.158333 0.833333 0 0.158333 0.916667 0 0.158333 1.000000 0 0.166667 0 0 0.166667 0.083333 0 0.166667 0.166667 0 0.166667 0.250000 0 0.166667 0.333333 0 0.166667 0.416667 0 0.166667 0.500000 0 0.166667 0.583333 0 0.166667 0.666667 0 0.166667 0.750000 0 0.166667 0.833333 0 0.166667 0.916667 0 0.166667 1.000000 0 0.175000 0 0 0.175000 0.083333 0 0.175000 0.166667 0 0.175000 0.250000 0 0.175000 0.333333 0 0.175000 0.416667 0 0.175000 0.500000 0 0.175000 0.583333 0 0.175000 0.666667 0 0.175000 0.750000 0 0.175000 0.833333 0 0.175000 0.916667 0 0.175000 1.000000 0 0.183333 0 0 0.183333 0.083333 0 0.183333 0.166667 0 0.183333 0.250000 0 0.183333 0.333333 0 0.183333 0.416667 0 0.183333 0.500000 0 0.183333 0.583333 0 0.183333 0.666667 0 0.183333 0.750000 0 0.183333 0.833333 0 0.183333 0.916667 0 0.183333 1.000000 0 0.191667 0 0 0.191667 0.083333 0 0.191667 0.166667 0 0.191667 0.250000 0 0.191667 0.333333 0 0.191667 0.416667 0 0.191667 0.500000 0 0.191667 0.583333 0 0.191667 0.666667 0 0.191667 0.750000 0 0.191667 0.833333 0 0.191667 0.916667 0 0.191667 1.000000 0 0.200000 0 0 0.200000 0.083333 0 0.200000 0.166667 0 0.200000 0.250000 0 0.200000 0.333333 0 0.200000 0.416667 0 0.200000 0.500000 0 0.200000 0.583333 0 0.200000 0.666667 0 0.200000 0.750000 0 0.200000 0.833333 0 0.200000 0.916667 0 0.200000 1.000000 0 0.208333 0 0 0.208333 0.083333 0 0.208333 0.166667 0 0.208333 0.250000 0 0.208333 0.333333 0 0.208333 0.416667 0 0.208333 0.500000 0 0.208333 0.583333 0 0.208333 0.666667 0 0.208333 0.750000 0 0.208333 0.833333 0 0.208333 0.916667 0 0.208333 1.000000 0 0.216667 0 0 0.216667 0.083333 0 0.216667 0.166667 0 0.216667 0.250000 0 0.216667 0.333333 0 0.216667 0.416667 0 0.216667 0.500000 0 0.216667 0.583333 0 0.216667 0.666667 0 0.216667 0.750000 0 0.216667 0.833333 0 0.216667 0.916667 0 0.216667 1.000000 0 0.225000 0 0 0.225000 0.083333 0 0.225000 0.166667 0 0.225000 0.250000 0 0.225000 0.333333 0 0.225000 0.416667 0 0.225000 0.500000 0 0.225000 0.583333 0 0.225000 0.666667 0 0.225000 0.750000 0 0.225000 0.833333 0 0.225000 0.916667 0 0.225000 1.000000 0 0.233333 0 0 0.233333 0.083333 0 0.233333 0.166667 0 0.233333 0.250000 0 0.233333 0.333333 0 0.233333 0.416667 0 0.233333 0.500000 0 0.233333 0.583333 0 0.233333 0.666667 0 0.233333 0.750000 0 0.233333 0.833333 0 0.233333 0.916667 0 0.233333 1.000000 0 0.241667 0 0 0.241667 0.083333 0 0.241667 0.166667 0 0.241667 0.250000 0 0.241667 0.333333 0 0.241667 0.416667 0 0.241667 0.500000 0 0.241667 0.583333 0 0.241667 0.666667 0 0.241667 0.750000 0 0.241667 0.833333 0 0.241667 0.916667 0 0.241667 1.000000 0 0.250000 0 0 0.250000 0.083333 0 0.250000 0.166667 0 0.250000 0.250000 0 0.250000 0.333333 0 0.250000 0.416667 0 0.250000 0.500000 0 0.250000 0.583333 0 0.250000 0.666667 0 0.250000 0.750000 0 0.250000 0.833333 0 0.250000 0.916667 0 0.250000 1.000000 0 0.258333 0 0 0.258333 0.083333 0 0.258333 0.166667 0 0.258333 0.250000 0 0.258333 0.333333 0 0.258333 0.416667 0 0.258333 0.500000 0 0.258333 0.583333 0 0.258333 0.666667 0 0.258333 0.750000 0 0.258333 0.833333 0 0.258333 0.916667 0 0.258333 1.000000 0 0.266667 0 0 0.266667 0.083333 0 0.266667 0.166667 0 0.266667 0.250000 0 0.266667 0.333333 0 0.266667 0.416667 0 0.266667 0.500000 0 0.266667 0.583333 0 0.266667 0.666667 0 0.266667 0.750000 0 0.266667 0.833333 0 0.266667 0.916667 0 0.266667 1.000000 0 0.275000 0 0 0.275000 0.083333 0 0.275000 0.166667 0 0.275000 0.250000 0 0.275000 0.333333 0 0.275000 0.416667 0 0.275000 0.500000 0 0.275000 0.583333 0 0.275000 0.666667 0 0.275000 0.750000 0 0.275000 0.833333 0 0.275000 0.916667 0 0.275000 1.000000 0 0.283333 0 0 0.283333 0.083333 0 0.283333 0.166667 0 0.283333 0.250000 0 0.283333 0.333333 0 0.283333 0.416667 0 0.283333 0.500000 0 0.283333 0.583333 0 0.283333 0.666667 0 0.283333 0.750000 0 0.283333 0.833333 0 0.283333 0.916667 0 0.283333 1.000000 0 0.291667 0 0 0.291667 0.083333 0 0.291667 0.166667 0 0.291667 0.250000 0 0.291667 0.333333 0 0.291667 0.416667 0 0.291667 0.500000 0 0.291667 0.583333 0 0.291667 0.666667 0 0.291667 0.750000 0 0.291667 0.833333 0 0.291667 0.916667 0 0.291667 1.000000 0 0.300000 0 0 0.300000 0.083333 0 0.300000 0.166667 0 0.300000 0.250000 0 0.300000 0.333333 0 0.300000 0.416667 0 0.300000 0.500000 0 0.300000 0.583333 0 0.300000 0.666667 0 0.300000 0.750000 0 0.300000 0.833333 0 0.300000 0.916667 0 0.300000 1.000000 0 0.308333 0 0 0.308333 0.083333 0 0.308333 0.166667 0 0.308333 0.250000 0 0.308333 0.333333 0 0.308333 0.416667 0 0.308333 0.500000 0 0.308333 0.583333 0 0.308333 0.666667 0 0.308333 0.750000 0 0.308333 0.833333 0 0.308333 0.916667 0 0.308333 1.000000 0 0.316666 0 0 0.316666 0.083333 0 0.316666 0.166667 0 0.316666 0.250000 0 0.316666 0.333333 0 0.316666 0.416667 0 0.316666 0.500000 0 0.316666 0.583333 0 0.316666 0.666667 0 0.316666 0.750000 0 0.316666 0.833333 0 0.316666 0.916667 0 0.316666 1.000000 0 0.325000 0 0 0.325000 0.083333 0 0.325000 0.166667 0 0.325000 0.250000 0 0.325000 0.333333 0 0.325000 0.416667 0 0.325000 0.500000 0 0.325000 0.583333 0 0.325000 0.666667 0 0.325000 0.750000 0 0.325000 0.833333 0 0.325000 0.916667 0 0.325000 1.000000 0 0.333333 0 0 0.333333 0.083333 0 0.333333 0.166667 0 0.333333 0.250000 0 0.333333 0.333333 0 0.333333 0.416667 0 0.333333 0.500000 0 0.333333 0.583333 0 0.333333 0.666667 0 0.333333 0.750000 0 0.333333 0.833333 0 0.333333 0.916667 0 0.333333 1.000000 0 0.341666 0 0 0.341666 0.083333 0 0.341666 0.166667 0 0.341666 0.250000 0 0.341666 0.333333 0 0.341666 0.416667 0 0.341666 0.500000 0 0.341666 0.583333 0 0.341666 0.666667 0 0.341666 0.750000 0 0.341666 0.833333 0 0.341666 0.916667 0 0.341666 1.000000 0 0.350000 0 0 0.350000 0.083333 0 0.350000 0.166667 0 0.350000 0.250000 0 0.350000 0.333333 0 0.350000 0.416667 0 0.350000 0.500000 0 0.350000 0.583333 0 0.350000 0.666667 0 0.350000 0.750000 0 0.350000 0.833333 0 0.350000 0.916667 0 0.350000 1.000000 0 0.358333 0 0 0.358333 0.083333 0 0.358333 0.166667 0 0.358333 0.250000 0 0.358333 0.333333 0 0.358333 0.416667 0 0.358333 0.500000 0 0.358333 0.583333 0 0.358333 0.666667 0 0.358333 0.750000 0 0.358333 0.833333 0 0.358333 0.916667 0 0.358333 1.000000 0 0.366666 0 0 0.366666 0.083333 0 0.366666 0.166667 0 0.366666 0.250000 0 0.366666 0.333333 0 0.366666 0.416667 0 0.366666 0.500000 0 0.366666 0.583333 0 0.366666 0.666667 0 0.366666 0.750000 0 0.366666 0.833333 0 0.366666 0.916667 0 0.366666 1.000000 0 0.375000 0 0 0.375000 0.083333 0 0.375000 0.166667 0 0.375000 0.250000 0 0.375000 0.333333 0 0.375000 0.416667 0 0.375000 0.500000 0 0.375000 0.583333 0 0.375000 0.666667 0 0.375000 0.750000 0 0.375000 0.833333 0 0.375000 0.916667 0 0.375000 1.000000 0 0.383333 0 0 0.383333 0.083333 0 0.383333 0.166667 0 0.383333 0.250000 0 0.383333 0.333333 0 0.383333 0.416667 0 0.383333 0.500000 0 0.383333 0.583333 0 0.383333 0.666667 0 0.383333 0.750000 0 0.383333 0.833333 0 0.383333 0.916667 0 0.383333 1.000000 0 0.391666 0 0 0.391666 0.083333 0 0.391666 0.166667 0 0.391666 0.250000 0 0.391666 0.333333 0 0.391666 0.416667 0 0.391666 0.500000 0 0.391666 0.583333 0 0.391666 0.666667 0 0.391666 0.750000 0 0.391666 0.833333 0 0.391666 0.916667 0 0.391666 1.000000 0 0.400000 0 0 0.400000 0.083333 0 0.400000 0.166667 0 0.400000 0.250000 0 0.400000 0.333333 0 0.400000 0.416667 0 0.400000 0.500000 0 0.400000 0.583333 0 0.400000 0.666667 0 0.400000 0.750000 0 0.400000 0.833333 0 0.400000 0.916667 0 0.400000 1.000000 0 0.408333 0 0 0.408333 0.083333 0 0.408333 0.166667 0 0.408333 0.250000 0 0.408333 0.333333 0 0.408333 0.416667 0 0.408333 0.500000 0 0.408333 0.583333 0 0.408333 0.666667 0 0.408333 0.750000 0 0.408333 0.833333 0 0.408333 0.916667 0 0.408333 1.000000 0 0.416666 0 0 0.416666 0.083333 0 0.416666 0.166667 0 0.416666 0.250000 0 0.416666 0.333333 0 0.416666 0.416667 0 0.416666 0.500000 0 0.416666 0.583333 0 0.416666 0.666667 0 0.416666 0.750000 0 0.416666 0.833333 0 0.416666 0.916667 0 0.416666 1.000000 0 0.425000 0 0 0.425000 0.083333 0 0.425000 0.166667 0 0.425000 0.250000 0 0.425000 0.333333 0 0.425000 0.416667 0 0.425000 0.500000 0 0.425000 0.583333 0 0.425000 0.666667 0 0.425000 0.750000 0 0.425000 0.833333 0 0.425000 0.916667 0 0.425000 1.000000 0 0.433333 0 0 0.433333 0.083333 0 0.433333 0.166667 0 0.433333 0.250000 0 0.433333 0.333333 0 0.433333 0.416667 0 0.433333 0.500000 0 0.433333 0.583333 0 0.433333 0.666667 0 0.433333 0.750000 0 0.433333 0.833333 0 0.433333 0.916667 0 0.433333 1.000000 0 0.441666 0 0 0.441666 0.083333 0 0.441666 0.166667 0 0.441666 0.250000 0 0.441666 0.333333 0 0.441666 0.416667 0 0.441666 0.500000 0 0.441666 0.583333 0 0.441666 0.666667 0 0.441666 0.750000 0 0.441666 0.833333 0 0.441666 0.916667 0 0.441666 1.000000 0 0.450000 0 0 0.450000 0.083333 0 0.450000 0.166667 0 0.450000 0.250000 0 0.450000 0.333333 0 0.450000 0.416667 0 0.450000 0.500000 0 0.450000 0.583333 0 0.450000 0.666667 0 0.450000 0.750000 0 0.450000 0.833333 0 0.450000 0.916667 0 0.450000 1.000000 0 0.458333 0 0 0.458333 0.083333 0 0.458333 0.166667 0 0.458333 0.250000 0 0.458333 0.333333 0 0.458333 0.416667 0 0.458333 0.500000 0 0.458333 0.583333 0 0.458333 0.666667 0 0.458333 0.750000 0 0.458333 0.833333 0 0.458333 0.916667 0 0.458333 1.000000 0 0.466666 0 0 0.466666 0.083333 0 0.466666 0.166667 0 0.466666 0.250000 0 0.466666 0.333333 0 0.466666 0.416667 0 0.466666 0.500000 0 0.466666 0.583333 0 0.466666 0.666667 0 0.466666 0.750000 0 0.466666 0.833333 0 0.466666 0.916667 0 0.466666 1.000000 0 0.475000 0 0 0.475000 0.083333 0 0.475000 0.166667 0 0.475000 0.250000 0 0.475000 0.333333 0 0.475000 0.416667 0 0.475000 0.500000 0 0.475000 0.583333 0 0.475000 0.666667 0 0.475000 0.750000 0 0.475000 0.833333 0 0.475000 0.916667 0 0.475000 1.000000 0 0.483333 0 0 0.483333 0.083333 0 0.483333 0.166667 0 0.483333 0.250000 0 0.483333 0.333333 0 0.483333 0.416667 0 0.483333 0.500000 0 0.483333 0.583333 0 0.483333 0.666667 0 0.483333 0.750000 0 0.483333 0.833333 0 0.483333 0.916667 0 0.483333 1.000000 0 0.491666 0 0 0.491666 0.083333 0 0.491666 0.166667 0 0.491666 0.250000 0 0.491666 0.333333 0 0.491666 0.416667 0 0.491666 0.500000 0 0.491666 0.583333 0 0.491666 0.666667 0 0.491666 0.750000 0 0.491666 0.833333 0 0.491666 0.916667 0 0.491666 1.000000 0 0.500000 0 0 0.500000 0.083333 0 0.500000 0.166667 0 0.500000 0.250000 0 0.500000 0.333333 0 0.500000 0.416667 0 0.500000 0.500000 0 0.500000 0.583333 0 0.500000 0.666667 0 0.500000 0.750000 0 0.500000 0.833333 0 0.500000 0.916667 0 0.500000 1.000000 0 0.508333 0 0 0.508333 0.083333 0 0.508333 0.166667 0 0.508333 0.250000 0 0.508333 0.333333 0 0.508333 0.416667 0 0.508333 0.500000 0 0.508333 0.583333 0 0.508333 0.666667 0 0.508333 0.750000 0 0.508333 0.833333 0 0.508333 0.916667 0 0.508333 1.000000 0 0.516666 0 0 0.516666 0.083333 0 0.516666 0.166667 0 0.516666 0.250000 0 0.516666 0.333333 0 0.516666 0.416667 0 0.516666 0.500000 0 0.516666 0.583333 0 0.516666 0.666667 0 0.516666 0.750000 0 0.516666 0.833333 0 0.516666 0.916667 0 0.516666 1.000000 0 0.525000 0 0 0.525000 0.083333 0 0.525000 0.166667 0 0.525000 0.250000 0 0.525000 0.333333 0 0.525000 0.416667 0 0.525000 0.500000 0 0.525000 0.583333 0 0.525000 0.666667 0 0.525000 0.750000 0 0.525000 0.833333 0 0.525000 0.916667 0 0.525000 1.000000 0 0.533333 0 0 0.533333 0.083333 0 0.533333 0.166667 0 0.533333 0.250000 0 0.533333 0.333333 0 0.533333 0.416667 0 0.533333 0.500000 0 0.533333 0.583333 0 0.533333 0.666667 0 0.533333 0.750000 0 0.533333 0.833333 0 0.533333 0.916667 0 0.533333 1.000000 0 0.541666 0 0 0.541666 0.083333 0 0.541666 0.166667 0 0.541666 0.250000 0 0.541666 0.333333 0 0.541666 0.416667 0 0.541666 0.500000 0 0.541666 0.583333 0 0.541666 0.666667 0 0.541666 0.750000 0 0.541666 0.833333 0 0.541666 0.916667 0 0.541666 1.000000 0 0.550000 0 0 0.550000 0.083333 0 0.550000 0.166667 0 0.550000 0.250000 0 0.550000 0.333333 0 0.550000 0.416667 0 0.550000 0.500000 0 0.550000 0.583333 0 0.550000 0.666667 0 0.550000 0.750000 0 0.550000 0.833333 0 0.550000 0.916667 0 0.550000 1.000000 0 0.558333 0 0 0.558333 0.083333 0 0.558333 0.166667 0 0.558333 0.250000 0 0.558333 0.333333 0 0.558333 0.416667 0 0.558333 0.500000 0 0.558333 0.583333 0 0.558333 0.666667 0 0.558333 0.750000 0 0.558333 0.833333 0 0.558333 0.916667 0 0.558333 1.000000 0 0.566666 0 0 0.566666 0.083333 0 0.566666 0.166667 0 0.566666 0.250000 0 0.566666 0.333333 0 0.566666 0.416667 0 0.566666 0.500000 0 0.566666 0.583333 0 0.566666 0.666667 0 0.566666 0.750000 0 0.566666 0.833333 0 0.566666 0.916667 0 0.566666 1.000000 0 0.575000 0 0 0.575000 0.083333 0 0.575000 0.166667 0 0.575000 0.250000 0 0.575000 0.333333 0 0.575000 0.416667 0 0.575000 0.500000 0 0.575000 0.583333 0 0.575000 0.666667 0 0.575000 0.750000 0 0.575000 0.833333 0 0.575000 0.916667 0 0.575000 1.000000 0 0.583333 0 0 0.583333 0.083333 0 0.583333 0.166667 0 0.583333 0.250000 0 0.583333 0.333333 0 0.583333 0.416667 0 0.583333 0.500000 0 0.583333 0.583333 0 0.583333 0.666667 0 0.583333 0.750000 0 0.583333 0.833333 0 0.583333 0.916667 0 0.583333 1.000000 0 0.591666 0 0 0.591666 0.083333 0 0.591666 0.166667 0 0.591666 0.250000 0 0.591666 0.333333 0 0.591666 0.416667 0 0.591666 0.500000 0 0.591666 0.583333 0 0.591666 0.666667 0 0.591666 0.750000 0 0.591666 0.833333 0 0.591666 0.916667 0 0.591666 1.000000 0 0.599999 0 0 0.599999 0.083333 0 0.599999 0.166667 0 0.599999 0.250000 0 0.599999 0.333333 0 0.599999 0.416667 0 0.599999 0.500000 0 0.599999 0.583333 0 0.599999 0.666667 0 0.599999 0.750000 0 0.599999 0.833333 0 0.599999 0.916667 0 0.599999 1.000000 0 0.608333 0 0 0.608333 0.083333 0 0.608333 0.166667 0 0.608333 0.250000 0 0.608333 0.333333 0 0.608333 0.416667 0 0.608333 0.500000 0 0.608333 0.583333 0 0.608333 0.666667 0 0.608333 0.750000 0 0.608333 0.833333 0 0.608333 0.916667 0 0.608333 1.000000 0 0.616666 0 0 0.616666 0.083333 0 0.616666 0.166667 0 0.616666 0.250000 0 0.616666 0.333333 0 0.616666 0.416667 0 0.616666 0.500000 0 0.616666 0.583333 0 0.616666 0.666667 0 0.616666 0.750000 0 0.616666 0.833333 0 0.616666 0.916667 0 0.616666 1.000000 0 0.624999 0 0 0.624999 0.083333 0 0.624999 0.166667 0 0.624999 0.250000 0 0.624999 0.333333 0 0.624999 0.416667 0 0.624999 0.500000 0 0.624999 0.583333 0 0.624999 0.666667 0 0.624999 0.750000 0 0.624999 0.833333 0 0.624999 0.916667 0 0.624999 1.000000 0 0.633333 0 0 0.633333 0.083333 0 0.633333 0.166667 0 0.633333 0.250000 0 0.633333 0.333333 0 0.633333 0.416667 0 0.633333 0.500000 0 0.633333 0.583333 0 0.633333 0.666667 0 0.633333 0.750000 0 0.633333 0.833333 0 0.633333 0.916667 0 0.633333 1.000000 0 0.641666 0 0 0.641666 0.083333 0 0.641666 0.166667 0 0.641666 0.250000 0 0.641666 0.333333 0 0.641666 0.416667 0 0.641666 0.500000 0 0.641666 0.583333 0 0.641666 0.666667 0 0.641666 0.750000 0 0.641666 0.833333 0 0.641666 0.916667 0 0.641666 1.000000 0 0.649999 0 0 0.649999 0.083333 0 0.649999 0.166667 0 0.649999 0.250000 0 0.649999 0.333333 0 0.649999 0.416667 0 0.649999 0.500000 0 0.649999 0.583333 0 0.649999 0.666667 0 0.649999 0.750000 0 0.649999 0.833333 0 0.649999 0.916667 0 0.649999 1.000000 0 0.658333 0 0 0.658333 0.083333 0 0.658333 0.166667 0 0.658333 0.250000 0 0.658333 0.333333 0 0.658333 0.416667 0 0.658333 0.500000 0 0.658333 0.583333 0 0.658333 0.666667 0 0.658333 0.750000 0 0.658333 0.833333 0 0.658333 0.916667 0 0.658333 1.000000 0 0.666666 0 0 0.666666 0.083333 0 0.666666 0.166667 0 0.666666 0.250000 0 0.666666 0.333333 0 0.666666 0.416667 0 0.666666 0.500000 0 0.666666 0.583333 0 0.666666 0.666667 0 0.666666 0.750000 0 0.666666 0.833333 0 0.666666 0.916667 0 0.666666 1.000000 0 0.675000 0 0 0.675000 0.083333 0 0.675000 0.166667 0 0.675000 0.250000 0 0.675000 0.333333 0 0.675000 0.416667 0 0.675000 0.500000 0 0.675000 0.583333 0 0.675000 0.666667 0 0.675000 0.750000 0 0.675000 0.833333 0 0.675000 0.916667 0 0.675000 1.000000 0 0.683333 0 0 0.683333 0.083333 0 0.683333 0.166667 0 0.683333 0.250000 0 0.683333 0.333333 0 0.683333 0.416667 0 0.683333 0.500000 0 0.683333 0.583333 0 0.683333 0.666667 0 0.683333 0.750000 0 0.683333 0.833333 0 0.683333 0.916667 0 0.683333 1.000000 0 0.691666 0 0 0.691666 0.083333 0 0.691666 0.166667 0 0.691666 0.250000 0 0.691666 0.333333 0 0.691666 0.416667 0 0.691666 0.500000 0 0.691666 0.583333 0 0.691666 0.666667 0 0.691666 0.750000 0 0.691666 0.833333 0 0.691666 0.916667 0 0.691666 1.000000 0 0.700000 0 0 0.700000 0.083333 0 0.700000 0.166667 0 0.700000 0.250000 0 0.700000 0.333333 0 0.700000 0.416667 0 0.700000 0.500000 0 0.700000 0.583333 0 0.700000 0.666667 0 0.700000 0.750000 0 0.700000 0.833333 0 0.700000 0.916667 0 0.700000 1.000000 0 0.708333 0 0 0.708333 0.083333 0 0.708333 0.166667 0 0.708333 0.250000 0 0.708333 0.333333 0 0.708333 0.416667 0 0.708333 0.500000 0 0.708333 0.583333 0 0.708333 0.666667 0 0.708333 0.750000 0 0.708333 0.833333 0 0.708333 0.916667 0 0.708333 1.000000 0 0.716666 0 0 0.716666 0.083333 0 0.716666 0.166667 0 0.716666 0.250000 0 0.716666 0.333333 0 0.716666 0.416667 0 0.716666 0.500000 0 0.716666 0.583333 0 0.716666 0.666667 0 0.716666 0.750000 0 0.716666 0.833333 0 0.716666 0.916667 0 0.716666 1.000000 0 0.725000 0 0 0.725000 0.083333 0 0.725000 0.166667 0 0.725000 0.250000 0 0.725000 0.333333 0 0.725000 0.416667 0 0.725000 0.500000 0 0.725000 0.583333 0 0.725000 0.666667 0 0.725000 0.750000 0 0.725000 0.833333 0 0.725000 0.916667 0 0.725000 1.000000 0 0.733333 0 0 0.733333 0.083333 0 0.733333 0.166667 0 0.733333 0.250000 0 0.733333 0.333333 0 0.733333 0.416667 0 0.733333 0.500000 0 0.733333 0.583333 0 0.733333 0.666667 0 0.733333 0.750000 0 0.733333 0.833333 0 0.733333 0.916667 0 0.733333 1.000000 0 0.741666 0 0 0.741666 0.083333 0 0.741666 0.166667 0 0.741666 0.250000 0 0.741666 0.333333 0 0.741666 0.416667 0 0.741666 0.500000 0 0.741666 0.583333 0 0.741666 0.666667 0 0.741666 0.750000 0 0.741666 0.833333 0 0.741666 0.916667 0 0.741666 1.000000 0 0.750000 0 0 0.750000 0.083333 0 0.750000 0.166667 0 0.750000 0.250000 0 0.750000 0.333333 0 0.750000 0.416667 0 0.750000 0.500000 0 0.750000 0.583333 0 0.750000 0.666667 0 0.750000 0.750000 0 0.750000 0.833333 0 0.750000 0.916667 0 0.750000 1.000000 0 0.758333 0 0 0.758333 0.083333 0 0.758333 0.166667 0 0.758333 0.250000 0 0.758333 0.333333 0 0.758333 0.416667 0 0.758333 0.500000 0 0.758333 0.583333 0 0.758333 0.666667 0 0.758333 0.750000 0 0.758333 0.833333 0 0.758333 0.916667 0 0.758333 1.000000 0 0.766667 0 0 0.766667 0.083333 0 0.766667 0.166667 0 0.766667 0.250000 0 0.766667 0.333333 0 0.766667 0.416667 0 0.766667 0.500000 0 0.766667 0.583333 0 0.766667 0.666667 0 0.766667 0.750000 0 0.766667 0.833333 0 0.766667 0.916667 0 0.766667 1.000000 0 0.775000 0 0 0.775000 0.083333 0 0.775000 0.166667 0 0.775000 0.250000 0 0.775000 0.333333 0 0.775000 0.416667 0 0.775000 0.500000 0 0.775000 0.583333 0 0.775000 0.666667 0 0.775000 0.750000 0 0.775000 0.833333 0 0.775000 0.916667 0 0.775000 1.000000 0 0.783333 0 0 0.783333 0.083333 0 0.783333 0.166667 0 0.783333 0.250000 0 0.783333 0.333333 0 0.783333 0.416667 0 0.783333 0.500000 0 0.783333 0.583333 0 0.783333 0.666667 0 0.783333 0.750000 0 0.783333 0.833333 0 0.783333 0.916667 0 0.783333 1.000000 0 0.791667 0 0 0.791667 0.083333 0 0.791667 0.166667 0 0.791667 0.250000 0 0.791667 0.333333 0 0.791667 0.416667 0 0.791667 0.500000 0 0.791667 0.583333 0 0.791667 0.666667 0 0.791667 0.750000 0 0.791667 0.833333 0 0.791667 0.916667 0 0.791667 1.000000 0 0.800000 0 0 0.800000 0.083333 0 0.800000 0.166667 0 0.800000 0.250000 0 0.800000 0.333333 0 0.800000 0.416667 0 0.800000 0.500000 0 0.800000 0.583333 0 0.800000 0.666667 0 0.800000 0.750000 0 0.800000 0.833333 0 0.800000 0.916667 0 0.800000 1.000000 0 0.808333 0 0 0.808333 0.083333 0 0.808333 0.166667 0 0.808333 0.250000 0 0.808333 0.333333 0 0.808333 0.416667 0 0.808333 0.500000 0 0.808333 0.583333 0 0.808333 0.666667 0 0.808333 0.750000 0 0.808333 0.833333 0 0.808333 0.916667 0 0.808333 1.000000 0 0.816667 0 0 0.816667 0.083333 0 0.816667 0.166667 0 0.816667 0.250000 0 0.816667 0.333333 0 0.816667 0.416667 0 0.816667 0.500000 0 0.816667 0.583333 0 0.816667 0.666667 0 0.816667 0.750000 0 0.816667 0.833333 0 0.816667 0.916667 0 0.816667 1.000000 0 0.825000 0 0 0.825000 0.083333 0 0.825000 0.166667 0 0.825000 0.250000 0 0.825000 0.333333 0 0.825000 0.416667 0 0.825000 0.500000 0 0.825000 0.583333 0 0.825000 0.666667 0 0.825000 0.750000 0 0.825000 0.833333 0 0.825000 0.916667 0 0.825000 1.000000 0 0.833333 0 0 0.833333 0.083333 0 0.833333 0.166667 0 0.833333 0.250000 0 0.833333 0.333333 0 0.833333 0.416667 0 0.833333 0.500000 0 0.833333 0.583333 0 0.833333 0.666667 0 0.833333 0.750000 0 0.833333 0.833333 0 0.833333 0.916667 0 0.833333 1.000000 0 0.841667 0 0 0.841667 0.083333 0 0.841667 0.166667 0 0.841667 0.250000 0 0.841667 0.333333 0 0.841667 0.416667 0 0.841667 0.500000 0 0.841667 0.583333 0 0.841667 0.666667 0 0.841667 0.750000 0 0.841667 0.833333 0 0.841667 0.916667 0 0.841667 1.000000 0 0.850000 0 0 0.850000 0.083333 0 0.850000 0.166667 0 0.850000 0.250000 0 0.850000 0.333333 0 0.850000 0.416667 0 0.850000 0.500000 0 0.850000 0.583333 0 0.850000 0.666667 0 0.850000 0.750000 0 0.850000 0.833333 0 0.850000 0.916667 0 0.850000 1.000000 0 0.858334 0 0 0.858334 0.083333 0 0.858334 0.166667 0 0.858334 0.250000 0 0.858334 0.333333 0 0.858334 0.416667 0 0.858334 0.500000 0 0.858334 0.583333 0 0.858334 0.666667 0 0.858334 0.750000 0 0.858334 0.833333 0 0.858334 0.916667 0 0.858334 1.000000 0 0.866667 0 0 0.866667 0.083333 0 0.866667 0.166667 0 0.866667 0.250000 0 0.866667 0.333333 0 0.866667 0.416667 0 0.866667 0.500000 0 0.866667 0.583333 0 0.866667 0.666667 0 0.866667 0.750000 0 0.866667 0.833333 0 0.866667 0.916667 0 0.866667 1.000000 0 0.875000 0 0 0.875000 0.083333 0 0.875000 0.166667 0 0.875000 0.250000 0 0.875000 0.333333 0 0.875000 0.416667 0 0.875000 0.500000 0 0.875000 0.583333 0 0.875000 0.666667 0 0.875000 0.750000 0 0.875000 0.833333 0 0.875000 0.916667 0 0.875000 1.000000 0 0.883334 0 0 0.883334 0.083333 0 0.883334 0.166667 0 0.883334 0.250000 0 0.883334 0.333333 0 0.883334 0.416667 0 0.883334 0.500000 0 0.883334 0.583333 0 0.883334 0.666667 0 0.883334 0.750000 0 0.883334 0.833333 0 0.883334 0.916667 0 0.883334 1.000000 0 0.891667 0 0 0.891667 0.083333 0 0.891667 0.166667 0 0.891667 0.250000 0 0.891667 0.333333 0 0.891667 0.416667 0 0.891667 0.500000 0 0.891667 0.583333 0 0.891667 0.666667 0 0.891667 0.750000 0 0.891667 0.833333 0 0.891667 0.916667 0 0.891667 1.000000 0 0.900000 0 0 0.900000 0.083333 0 0.900000 0.166667 0 0.900000 0.250000 0 0.900000 0.333333 0 0.900000 0.416667 0 0.900000 0.500000 0 0.900000 0.583333 0 0.900000 0.666667 0 0.900000 0.750000 0 0.900000 0.833333 0 0.900000 0.916667 0 0.900000 1.000000 0 0.908334 0 0 0.908334 0.083333 0 0.908334 0.166667 0 0.908334 0.250000 0 0.908334 0.333333 0 0.908334 0.416667 0 0.908334 0.500000 0 0.908334 0.583333 0 0.908334 0.666667 0 0.908334 0.750000 0 0.908334 0.833333 0 0.908334 0.916667 0 0.908334 1.000000 0 0.916667 0 0 0.916667 0.083333 0 0.916667 0.166667 0 0.916667 0.250000 0 0.916667 0.333333 0 0.916667 0.416667 0 0.916667 0.500000 0 0.916667 0.583333 0 0.916667 0.666667 0 0.916667 0.750000 0 0.916667 0.833333 0 0.916667 0.916667 0 0.916667 1.000000 0 0.925000 0 0 0.925000 0.083333 0 0.925000 0.166667 0 0.925000 0.250000 0 0.925000 0.333333 0 0.925000 0.416667 0 0.925000 0.500000 0 0.925000 0.583333 0 0.925000 0.666667 0 0.925000 0.750000 0 0.925000 0.833333 0 0.925000 0.916667 0 0.925000 1.000000 0 0.933334 0 0 0.933334 0.083333 0 0.933334 0.166667 0 0.933334 0.250000 0 0.933334 0.333333 0 0.933334 0.416667 0 0.933334 0.500000 0 0.933334 0.583333 0 0.933334 0.666667 0 0.933334 0.750000 0 0.933334 0.833333 0 0.933334 0.916667 0 0.933334 1.000000 0 0.941667 0 0 0.941667 0.083333 0 0.941667 0.166667 0 0.941667 0.250000 0 0.941667 0.333333 0 0.941667 0.416667 0 0.941667 0.500000 0 0.941667 0.583333 0 0.941667 0.666667 0 0.941667 0.750000 0 0.941667 0.833333 0 0.941667 0.916667 0 0.941667 1.000000 0 0.950001 0 0 0.950001 0.083333 0 0.950001 0.166667 0 0.950001 0.250000 0 0.950001 0.333333 0 0.950001 0.416667 0 0.950001 0.500000 0 0.950001 0.583333 0 0.950001 0.666667 0 0.950001 0.750000 0 0.950001 0.833333 0 0.950001 0.916667 0 0.950001 1.000000 0 0.958334 0 0 0.958334 0.083333 0 0.958334 0.166667 0 0.958334 0.250000 0 0.958334 0.333333 0 0.958334 0.416667 0 0.958334 0.500000 0 0.958334 0.583333 0 0.958334 0.666667 0 0.958334 0.750000 0 0.958334 0.833333 0 0.958334 0.916667 0 0.958334 1.000000 0 0.966667 0 0 0.966667 0.083333 0 0.966667 0.166667 0 0.966667 0.250000 0 0.966667 0.333333 0 0.966667 0.416667 0 0.966667 0.500000 0 0.966667 0.583333 0 0.966667 0.666667 0 0.966667 0.750000 0 0.966667 0.833333 0 0.966667 0.916667 0 0.966667 1.000000 0 0.975001 0 0 0.975001 0.083333 0 0.975001 0.166667 0 0.975001 0.250000 0 0.975001 0.333333 0 0.975001 0.416667 0 0.975001 0.500000 0 0.975001 0.583333 0 0.975001 0.666667 0 0.975001 0.750000 0 0.975001 0.833333 0 0.975001 0.916667 0 0.975001 1.000000 0 0.983334 0 0 0.983334 0.083333 0 0.983334 0.166667 0 0.983334 0.250000 0 0.983334 0.333333 0 0.983334 0.416667 0 0.983334 0.500000 0 0.983334 0.583333 0 0.983334 0.666667 0 0.983334 0.750000 0 0.983334 0.833333 0 0.983334 0.916667 0 0.983334 1.000000 0 0.991667 0 0 0.991667 0.083333 0 0.991667 0.166667 0 0.991667 0.250000 0 0.991667 0.333333 0 0.991667 0.416667 0 0.991667 0.500000 0 0.991667 0.583333 0 0.991667 0.666667 0 0.991667 0.750000 0 0.991667 0.833333 0 0.991667 0.916667 0 0.991667 1.000000 0 1.000001 0 0 1.000001 0.083333 0 1.000001 0.166667 0 1.000001 0.250000 0 1.000001 0.333333 0 1.000001 0.416667 0 1.000001 0.500000 0 1.000001 0.583333 0 1.000001 0.666667 0 1.000001 0.750000 0 1.000001 0.833333 0 1.000001 0.916667 0 1.000001 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="1573" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="2880">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 12 1 13 13 2 14 0 0 0 13 2 14 1 3 1 1 3 1 13 2 14 14 4 15 1 3 1 14 4 15 2 5 2 2 5 2 14 4 15 15 6 16 2 5 2 15 6 16 3 7 3 3 7 3 15 6 16 16 8 17 3 7 3 16 8 17 4 9 4 4 9 4 16 8 17 17 10 18 4 9 4 17 10 18 5 11 5 5 11 5 17 10 18 18 12 19 5 11 5 18 12 19 6 13 6 6 13 6 18 12 19 19 14 20 6 13 6 19 14 20 7 15 7 7 15 7 19 14 20 20 16 21 7 15 7 20 16 21 8 17 8 8 17 8 20 16 21 21 18 22 8 17 8 21 18 22 9 19 9 9 19 9 21 18 22 22 20 23 9 19 9 22 20 23 10 21 10 10 21 10 22 20 23 23 22 24 10 21 10 23 22 24 11 23 11 11 23 11 23 22 24 12 1 25 11 23 11 12 1 25 0 0 12 12 1 13 24 24 26 25 25 27 12 1 13 25 25 27 13 2 14 13 2 14 25 25 27 26 26 28 13 2 14 26 26 28 14 4 15 14 4 15 26 26 28 27 27 29 14 4 15 27 27 29 15 6 16 15 6 16 27 27 29 28 28 30 15 6 16 28 28 30 16 8 17 16 8 17 28 28 30 29 29 31 16 8 17 29 29 31 17 10 18 17 10 18 29 29 31 30 30 32 17 10 18 30 30 32 18 12 19 18 12 19 30 30 32 31 31 33 18 12 19 31 31 33 19 14 20 19 14 20 31 31 33 32 32 34 19 14 20 32 32 34 20 16 21 20 16 21 32 32 34 33 33 35 20 16 21 33 33 35 21 18 22 21 18 22 33 33 35 34 34 36 21 18 22 34 34 36 22 20 23 22 20 23 34 34 36 35 35 37 22 20 23 35 35 37 23 22 24 23 22 24 35 35 37 24 24 38 23 22 24 24 24 38 12 1 25 24 24 26 36 36 39 37 37 40 24 24 26 37 37 40 25 25 27 25 25 27 37 37 40 38 38 41 25 25 27 38 38 41 26 26 28 26 26 28 38 38 41 39 39 42 26 26 28 39 39 42 27 27 29 27 27 29 39 39 42 40 40 43 27 27 29 40 40 43 28 28 30 28 28 30 40 40 43 41 41 44 28 28 30 41 41 44 29 29 31 29 29 31 41 41 44 42 42 45 29 29 31 42 42 45 30 30 32 30 30 32 42 42 45 43 43 46 30 30 32 43 43 46 31 31 33 31 31 33 43 43 46 44 44 47 31 31 33 44 44 47 32 32 34 32 32 34 44 44 47 45 45 48 32 32 34 45 45 48 33 33 35 33 33 35 45 45 48 46 46 49 33 33 35 46 46 49 34 34 36 34 34 36 46 46 49 47 47 50 34 34 36 47 47 50 35 35 37 35 35 37 47 47 50 36 36 51 35 35 37 36 36 51 24 24 38 36 36 39 48 48 52 49 49 53 36 36 39 49 49 53 37 37 40 37 37 40 49 49 53 50 50 54 37 37 40 50 50 54 38 38 41 38 38 41 50 50 54 51 51 55 38 38 41 51 51 55 39 39 42 39 39 42 51 51 55 52 52 56 39 39 42 52 52 56 40 40 43 40 40 43 52 52 56 53 53 57 40 40 43 53 53 57 41 41 44 41 41 44 53 53 57 54 54 58 41 41 44 54 54 58 42 42 45 42 42 45 54 54 58 55 55 59 42 42 45 55 55 59 43 43 46 43 43 46 55 55 59 56 56 60 43 43 46 56 56 60 44 44 47 44 44 47 56 56 60 57 57 61 44 44 47 57 57 61 45 45 48 45 45 48 57 57 61 58 58 62 45 45 48 58 58 62 46 46 49 46 46 49 58 58 62 59 59 63 46 46 49 59 59 63 47 47 50 47 47 50 59 59 63 48 48 64 47 47 50 48 48 64 36 36 51 48 48 52 60 60 65 61 61 66 48 48 52 61 61 66 49 49 53 49 49 53 61 61 66 62 62 67 49 49 53 62 62 67 50 50 54 50 50 54 62 62 67 63 63 68 50 50 54 63 63 68 51 51 55 51 51 55 63 63 68 64 64 69 51 51 55 64 64 69 52 52 56 52 52 56 64 64 69 65 65 70 52 52 56 65 65 70 53 53 57 53 53 57 65 65 70 66 66 71 53 53 57 66 66 71 54 54 58 54 54 58 66 66 71 67 67 72 54 54 58 67 67 72 55 55 59 55 55 59 67 67 72 68 68 73 55 55 59 68 68 73 56 56 60 56 56 60 68 68 73 69 69 74 56 56 60 69 69 74 57 57 61 57 57 61 69 69 74 70 70 75 57 57 61 70 70 75 58 58 62 58 58 62 70 70 75 71 71 76 58 58 62 71 71 76 59 59 63 59 59 63 71 71 76 60 60 77 59 59 63 60 60 77 48 48 64 60 60 65 72 72 78 73 73 79 60 60 65 73 73 79 61 61 66 61 61 66 73 73 79 74 74 80 61 61 66 74 74 80 62 62 67 62 62 67 74 74 80 75 75 81 62 62 67 75 75 81 63 63 68 63 63 68 75 75 81 76 76 82 63 63 68 76 76 82 64 64 69 64 64 69 76 76 82 77 77 83 64 64 69 77 77 83 65 65 70 65 65 70 77 77 83 78 78 84 65 65 70 78 78 84 66 66 71 66 66 71 78 78 84 79 79 85 66 66 71 79 79 85 67 67 72 67 67 72 79 79 85 80 80 86 67 67 72 80 80 86 68 68 73 68 68 73 80 80 86 81 81 87 68 68 73 81 81 87 69 69 74 69 69 74 81 81 87 82 82 88 69 69 74 82 82 88 70 70 75 70 70 75 82 82 88 83 83 89 70 70 75 83 83 89 71 71 76 71 71 76 83 83 89 72 72 90 71 71 76 72 72 90 60 60 77 72 72 78 84 84 91 85 85 92 72 72 78 85 85 92 73 73 79 73 73 79 85 85 92 86 86 93 73 73 79 86 86 93 74 74 80 74 74 80 86 86 93 87 87 94 74 74 80 87 87 94 75 75 81 75 75 81 87 87 94 88 88 95 75 75 81 88 88 95 76 76 82 76 76 82 88 88 95 89 89 96 76 76 82 89 89 96 77 77 83 77 77 83 89 89 96 90 90 97 77 77 83 90 90 97 78 78 84 78 78 84 90 90 97 91 91 98 78 78 84 91 91 98 79 79 85 79 79 85 91 91 98 92 92 99 79 79 85 92 92 99 80 80 86 80 80 86 92 92 99 93 93 100 80 80 86 93 93 100 81 81 87 81 81 87 93 93 100 94 94 101 81 81 87 94 94 101 82 82 88 82 82 88 94 94 101 95 95 102 82 82 88 95 95 102 83 83 89 83 83 89 95 95 102 84 84 103 83 83 89 84 84 103 72 72 90 84 84 91 96 96 104 97 97 105 84 84 91 97 97 105 85 85 92 85 85 92 97 97 105 98 98 106 85 85 92 98 98 106 86 86 93 86 86 93 98 98 106 99 99 107 86 86 93 99 99 107 87 87 94 87 87 94 99 99 107 100 100 108 87 87 94 100 100 108 88 88 95 88 88 95 100 100 108 101 101 109 88 88 95 101 101 109 89 89 96 89 89 96 101 101 109 102 102 110 89 89 96 102 102 110 90 90 97 90 90 97 102 102 110 103 103 111 90 90 97 103 103 111 91 91 98 91 91 98 103 103 111 104 104 112 91 91 98 104 104 112 92 92 99 92 92 99 104 104 112 105 105 113 92 92 99 105 105 113 93 93 100 93 93 100 105 105 113 106 106 114 93 93 100 106 106 114 94 94 101 94 94 101 106 106 114 107 107 115 94 94 101 107 107 115 95 95 102 95 95 102 107 107 115 96 96 116 95 95 102 96 96 116 84 84 103 96 96 104 108 108 117 109 109 118 96 96 104 109 109 118 97 97 105 97 97 105 109 109 118 110 110 119 97 97 105 110 110 119 98 98 106 98 98 106 110 110 119 111 111 120 98 98 106 111 111 120 99 99 107 99 99 107 111 111 120 112 112 121 99 99 107 112 112 121 100 100 108 100 100 108 112 112 121 113 113 122 100 100 108 113 113 122 101 101 109 101 101 109 113 113 122 114 114 123 101 101 109 114 114 123 102 102 110 102 102 110 114 114 123 115 115 124 102 102 110 115 115 124 103 103 111 103 103 111 115 115 124 116 116 125 103 103 111 116 116 125 104 104 112 104 104 112 116 116 125 117 117 126 104 104 112 117 117 126 105 105 113 105 105 113 117 117 126 118 118 127 105 105 113 118 118 127 106 106 114 106 106 114 118 118 127 119 119 128 106 106 114 119 119 128 107 107 115 107 107 115 119 119 128 108 108 129 107 107 115 108 108 129 96 96 116 108 108 117 120 120 130 121 121 131 108 108 117 121 121 131 109 109 118 109 109 118 121 121 131 122 122 132 109 109 118 122 122 132 110 110 119 110 110 119 122 122 132 123 123 133 110 110 119 123 123 133 111 111 120 111 111 120 123 123 133 124 124 134 111 111 120 124 124 134 112 112 121 112 112 121 124 124 134 125 125 135 112 112 121 125 125 135 113 113 122 113 113 122 125 125 135 126 126 136 113 113 122 126 126 136 114 114 123 114 114 123 126 126 136 127 127 137 114 114 123 127 127 137 115 115 124 115 115 124 127 127 137 128 128 138 115 115 124 128 128 138 116 116 125 116 116 125 128 128 138 129 129 139 116 116 125 129 129 139 117 117 126 117 117 126 129 129 139 130 130 140 117 117 126 130 130 140 118 118 127 118 118 127 130 130 140 131 131 141 118 118 127 131 131 141 119 119 128 119 119 128 131 131 141 120 120 142 119 119 128 120 120 142 108 108 129 120 120 130 132 132 143 133 133 144 120 120 130 133 133 144 121 121 131 121 121 131 133 133 144 134 134 145 121 121 131 134 134 145 122 122 132 122 122 132 134 134 145 135 135 146 122 122 132 135 135 146 123 123 133 123 123 133 135 135 146 136 136 147 123 123 133 136 136 147 124 124 134 124 124 134 136 136 147 137 137 148 124 124 134 137 137 148 125 125 135 125 125 135 137 137 148 138 138 149 125 125 135 138 138 149 126 126 136 126 126 136 138 138 149 139 139 150 126 126 136 139 139 150 127 127 137 127 127 137 139 139 150 140 140 151 127 127 137 140 140 151 128 128 138 128 128 138 140 140 151 141 141 152 128 128 138 141 141 152 129 129 139 129 129 139 141 141 152 142 142 153 129 129 139 142 142 153 130 130 140 130 130 140 142 142 153 143 143 154 130 130 140 143 143 154 131 131 141 131 131 141 143 143 154 132 132 155 131 131 141 132 132 155 120 120 142 132 132 143 144 144 156 145 145 157 132 132 143 145 145 157 133 133 144 133 133 144 145 145 157 146 146 158 133 133 144 146 146 158 134 134 145 134 134 145 146 146 158 147 147 159 134 134 145 147 147 159 135 135 146 135 135 146 147 147 159 148 148 160 135 135 146 148 148 160 136 136 147 136 136 147 148 148 160 149 149 161 136 136 147 149 149 161 137 137 148 137 137 148 149 149 161 150 150 162 137 137 148 150 150 162 138 138 149 138 138 149 150 150 162 151 151 163 138 138 149 151 151 163 139 139 150 139 139 150 151 151 163 152 152 164 139 139 150 152 152 164 140 140 151 140 140 151 152 152 164 153 153 165 140 140 151 153 153 165 141 141 152 141 141 152 153 153 165 154 154 166 141 141 152 154 154 166 142 142 153 142 142 153 154 154 166 155 155 167 142 142 153 155 155 167 143 143 154 143 143 154 155 155 167 144 144 168 143 143 154 144 144 168 132 132 155 144 144 156 156 156 169 157 157 170 144 144 156 157 157 170 145 145 157 145 145 157 157 157 170 158 158 171 145 145 157 158 158 171 146 146 158 146 146 158 158 158 171 159 159 172 146 146 158 159 159 172 147 147 159 147 147 159 159 159 172 160 160 173 147 147 159 160 160 173 148 148 160 148 148 160 160 160 173 161 161 174 148 148 160 161 161 174 149 149 161 149 149 161 161 161 174 162 162 175 149 149 161 162 162 175 150 150 162 150 150 162 162 162 175 163 163 176 150 150 162 163 163 176 151 151 163 151 151 163 163 163 176 164 164 177 151 151 163 164 164 177 152 152 164 152 152 164 164 164 177 165 165 178 152 152 164 165 165 178 153 153 165 153 153 165 165 165 178 166 166 179 153 153 165 166 166 179 154 154 166 154 154 166 166 166 179 167 167 180 154 154 166 167 167 180 155 155 167 155 155 167 167 167 180 156 156 181 155 155 167 156 156 181 144 144 168 156 156 169 168 168 182 169 169 183 156 156 169 169 169 183 157 157 170 157 157 170 169 169 183 170 170 184 157 157 170 170 170 184 158 158 171 158 158 171 170 170 184 171 171 185 158 158 171 171 171 185 159 159 172 159 159 172 171 171 185 172 172 186 159 159 172 172 172 186 160 160 173 160 160 173 172 172 186 173 173 187 160 160 173 173 173 187 161 161 174 161 161 174 173 173 187 174 174 188 161 161 174 174 174 188 162 162 175 162 162 175 174 174 188 175 175 189 162 162 175 175 175 189 163 163 176 163 163 176 175 175 189 176 176 190 163 163 176 176 176 190 164 164 177 164 164 177 176 176 190 177 177 191 164 164 177 177 177 191 165 165 178 165 165 178 177 177 191 178 178 192 165 165 178 178 178 192 166 166 179 166 166 179 178 178 192 179 179 193 166 166 179 179 179 193 167 167 180 167 167 180 179 179 193 168 168 194 167 167 180 168 168 194 156 156 181 168 168 182 180 180 195 181 181 196 168 168 182 181 181 196 169 169 183 169 169 183 181 181 196 182 182 197 169 169 183 182 182 197 170 170 184 170 170 184 182 182 197 183 183 198 170 170 184 183 183 198 171 171 185 171 171 185 183 183 198 184 184 199 171 171 185 184 184 199 172 172 186 172 172 186 184 184 199 185 185 200 172 172 186 185 185 200 173 173 187 173 173 187 185 185 200 186 186 201 173 173 187 186 186 201 174 174 188 174 174 188 186 186 201 187 187 202 174 174 188 187 187 202 175 175 189 175 175 189 187 187 202 188 188 203 175 175 189 188 188 203 176 176 190 176 176 190 188 188 203 189 189 204 176 176 190 189 189 204 177 177 191 177 177 191 189 189 204 190 190 205 177 177 191 190 190 205 178 178 192 178 178 192 190 190 205 191 191 206 178 178 192 191 191 206 179 179 193 179 179 193 191 191 206 180 180 207 179 179 193 180 180 207 168 168 194 180 180 195 192 192 208 193 193 209 180 180 195 193 193 209 181 181 196 181 181 196 193 193 209 194 194 210 181 181 196 194 194 210 182 182 197 182 182 197 194 194 210 195 195 211 182 182 197 195 195 211 183 183 198 183 183 198 195 195 211 196 196 212 183 183 198 196 196 212 184 184 199 184 184 199 196 196 212 197 197 213 184 184 199 197 197 213 185 185 200 185 185 200 197 197 213 198 198 214 185 185 200 198 198 214 186 186 201 186 186 201 198 198 214 199 199 215 186 186 201 199 199 215 187 187 202 187 187 202 199 199 215 200 200 216 187 187 202 200 200 216 188 188 203 188 188 203 200 200 216 201 201 217 188 188 203 201 201 217 189 189 204 189 189 204 201 201 217 202 202 218 189 189 204 202 202 218 190 190 205 190 190 205 202 202 218 203 203 219 190 190 205 203 203 219 191 191 206 191 191 206 203 203 219 192 192 220 191 191 206 192 192 220 180 180 207 192 192 208 204 204 221 205 205 222 192 192 208 205 205 222 193 193 209 193 193 209 205 205 222 206 206 223 193 193 209 206 206 223 194 194 210 194 194 210 206 206 223 207 207 224 194 194 210 207 207 224 195 195 211 195 195 211 207 207 224 208 208 225 195 195 211 208 208 225 196 196 212 196 196 212 208 208 225 209 209 226 196 196 212 209 209 226 197 197 213 197 197 213 209 209 226 210 210 227 197 197 213 210 210 227 198 198 214 198 198 214 210 210 227 211 211 228 198 198 214 211 211 228 199 199 215 199 199 215 211 211 228 212 212 229 199 199 215 212 212 229 200 200 216 200 200 216 212 212 229 213 213 230 200 200 216 213 213 230 201 201 217 201 201 217 213 213 230 214 214 231 201 201 217 214 214 231 202 202 218 202 202 218 214 214 231 215 215 232 202 202 218 215 215 232 203 203 219 203 203 219 215 215 232 204 204 233 203 203 219 204 204 233 192 192 220 204 204 221 216 216 234 217 217 235 204 204 221 217 217 235 205 205 222 205 205 222 217 217 235 218 218 236 205 205 222 218 218 236 206 206 223 206 206 223 218 218 236 219 219 237 206 206 223 219 219 237 207 207 224 207 207 224 219 219 237 220 220 238 207 207 224 220 220 238 208 208 225 208 208 225 220 220 238 221 221 239 208 208 225 221 221 239 209 209 226 209 209 226 221 221 239 222 222 240 209 209 226 222 222 240 210 210 227 210 210 227 222 222 240 223 223 241 210 210 227 223 223 241 211 211 228 211 211 228 223 223 241 224 224 242 211 211 228 224 224 242 212 212 229 212 212 229 224 224 242 225 225 243 212 212 229 225 225 243 213 213 230 213 213 230 225 225 243 226 226 244 213 213 230 226 226 244 214 214 231 214 214 231 226 226 244 227 227 245 214 214 231 227 227 245 215 215 232 215 215 232 227 227 245 216 216 246 215 215 232 216 216 246 204 204 233 216 216 234 228 228 247 229 229 248 216 216 234 229 229 248 217 217 235 217 217 235 229 229 248 230 230 249 217 217 235 230 230 249 218 218 236 218 218 236 230 230 249 231 231 250 218 218 236 231 231 250 219 219 237 219 219 237 231 231 250 232 232 251 219 219 237 232 232 251 220 220 238 220 220 238 232 232 251 233 233 252 220 220 238 233 233 252 221 221 239 221 221 239 233 233 252 234 234 253 221 221 239 234 234 253 222 222 240 222 222 240 234 234 253 235 235 254 222 222 240 235 235 254 223 223 241 223 223 241 235 235 254 236 236 255 223 223 241 236 236 255 224 224 242 224 224 242 236 236 255 237 237 256 224 224 242 237 237 256 225 225 243 225 225 243 237 237 256 238 238 257 225 225 243 238 238 257 226 226 244 226 226 244 238 238 257 239 239 258 226 226 244 239 239 258 227 227 245 227 227 245 239 239 258 228 228 259 227 227 245 228 228 259 216 216 246 228 228 247 240 240 260 241 241 261 228 228 247 241 241 261 229 229 248 229 229 248 241 241 261 242 242 262 229 229 248 242 242 262 230 230 249 230 230 249 242 242 262 243 243 263 230 230 249 243 243 263 231 231 250 231 231 250 243 243 263 244 244 264 231 231 250 244 244 264 232 232 251 232 232 251 244 244 264 245 245 265 232 232 251 245 245 265 233 233 252 233 233 252 245 245 265 246 246 266 233 233 252 246 246 266 234 234 253 234 234 253 246 246 266 247 247 267 234 234 253 247 247 267 235 235 254 235 235 254 247 247 267 248 248 268 235 235 254 248 248 268 236 236 255 236 236 255 248 248 268 249 249 269 236 236 255 249 249 269 237 237 256 237 237 256 249 249 269 250 250 270 237 237 256 250 250 270 238 238 257 238 238 257 250 250 270 251 251 271 238 238 257 251 251 271 239 239 258 239 239 258 251 251 271 240 240 272 239 239 258 240 240 272 228 228 259 240 240 260 252 252 273 253 253 274 240 240 260 253 253 274 241 241 261 241 241 261 253 253 274 254 254 275 241 241 261 254 254 275 242 242 262 242 242 262 254 254 275 255 255 276 242 242 262 255 255 276 243 243 263 243 243 263 255 255 276 256 256 277 243 243 263 256 256 277 244 244 264 244 244 264 256 256 277 257 257 278 244 244 264 257 257 278 245 245 265 245 245 265 257 257 278 258 258 279 245 245 265 258 258 279 246 246 266 246 246 266 258 258 279 259 259 280 246 246 266 259 259 280 247 247 267 247 247 267 259 259 280 260 260 281 247 247 267 260 260 281 248 248 268 248 248 268 260 260 281 261 261 282 248 248 268 261 261 282 249 249 269 249 249 269 261 261 282 262 262 283 249 249 269 262 262 283 250 250 270 250 250 270 262 262 283 263 263 284 250 250 270 263 263 284 251 251 271 251 251 271 263 263 284 252 252 285 251 251 271 252 252 285 240 240 272 252 252 273 264 264 286 265 265 287 252 252 273 265 265 287 253 253 274 253 253 274 265 265 287 266 266 288 253 253 274 266 266 288 254 254 275 254 254 275 266 266 288 267 267 289 254 254 275 267 267 289 255 255 276 255 255 276 267 267 289 268 268 290 255 255 276 268 268 290 256 256 277 256 256 277 268 268 290 269 269 291 256 256 277 269 269 291 257 257 278 257 257 278 269 269 291 270 270 292 257 257 278 270 270 292 258 258 279 258 258 279 270 270 292 271 271 293 258 258 279 271 271 293 259 259 280 259 259 280 271 271 293 272 272 294 259 259 280 272 272 294 260 260 281 260 260 281 272 272 294 273 273 295 260 260 281 273 273 295 261 261 282 261 261 282 273 273 295 274 274 296 261 261 282 274 274 296 262 262 283 262 262 283 274 274 296 275 275 297 262 262 283 275 275 297 263 263 284 263 263 284 275 275 297 264 264 298 263 263 284 264 264 298 252 252 285 264 264 286 276 276 299 277 277 300 264 264 286 277 277 300 265 265 287 265 265 287 277 277 300 278 278 301 265 265 287 278 278 301 266 266 288 266 266 288 278 278 301 279 279 302 266 266 288 279 279 302 267 267 289 267 267 289 279 279 302 280 280 303 267 267 289 280 280 303 268 268 290 268 268 290 280 280 303 281 281 304 268 268 290 281 281 304 269 269 291 269 269 291 281 281 304 282 282 305 269 269 291 282 282 305 270 270 292 270 270 292 282 282 305 283 283 306 270 270 292 283 283 306 271 271 293 271 271 293 283 283 306 284 284 307 271 271 293 284 284 307 272 272 294 272 272 294 284 284 307 285 285 308 272 272 294 285 285 308 273 273 295 273 273 295 285 285 308 286 286 309 273 273 295 286 286 309 274 274 296 274 274 296 286 286 309 287 287 310 274 274 296 287 287 310 275 275 297 275 275 297 287 287 310 276 276 311 275 275 297 276 276 311 264 264 298 276 276 299 288 288 312 289 289 313 276 276 299 289 289 313 277 277 300 277 277 300 289 289 313 290 290 314 277 277 300 290 290 314 278 278 301 278 278 301 290 290 314 291 291 315 278 278 301 291 291 315 279 279 302 279 279 302 291 291 315 292 292 316 279 279 302 292 292 316 280 280 303 280 280 303 292 292 316 293 293 317 280 280 303 293 293 317 281 281 304 281 281 304 293 293 317 294 294 318 281 281 304 294 294 318 282 282 305 282 282 305 294 294 318 295 295 319 282 282 305 295 295 319 283 283 306 283 283 306 295 295 319 296 296 320 283 283 306 296 296 320 284 284 307 284 284 307 296 296 320 297 297 321 284 284 307 297 297 321 285 285 308 285 285 308 297 297 321 298 298 322 285 285 308 298 298 322 286 286 309 286 286 309 298 298 322 299 299 323 286 286 309 299 299 323 287 287 310 287 287 310 299 299 323 288 288 324 287 287 310 288 288 324 276 276 311 288 288 312 300 300 325 301 301 326 288 288 312 301 301 326 289 289 313 289 289 313 301 301 326 302 302 327 289 289 313 302 302 327 290 290 314 290 290 314 302 302 327 303 303 328 290 290 314 303 303 328 291 291 315 291 291 315 303 303 328 304 304 329 291 291 315 304 304 329 292 292 316 292 292 316 304 304 329 305 305 330 292 292 316 305 305 330 293 293 317 293 293 317 305 305 330 306 306 331 293 293 317 306 306 331 294 294 318 294 294 318 306 306 331 307 307 332 294 294 318 307 307 332 295 295 319 295 295 319 307 307 332 308 308 333 295 295 319 308 308 333 296 296 320 296 296 320 308 308 333 309 309 334 296 296 320 309 309 334 297 297 321 297 297 321 309 309 334 310 310 335 297 297 321 310 310 335 298 298 322 298 298 322 310 310 335 311 311 336 298 298 322 311 311 336 299 299 323 299 299 323 311 311 336 300 300 337 299 299 323 300 300 337 288 288 324 300 300 325 312 312 338 313 313 339 300 300 325 313 313 339 301 301 326 301 301 326 313 313 339 314 314 340 301 301 326 314 314 340 302 302 327 302 302 327 314 314 340 315 315 341 302 302 327 315 315 341 303 303 328 303 303 328 315 315 341 316 316 342 303 303 328 316 316 342 304 304 329 304 304 329 316 316 342 317 317 343 304 304 329 317 317 343 305 305 330 305 305 330 317 317 343 318 318 344 305 305 330 318 318 344 306 306 331 306 306 331 318 318 344 319 319 345 306 306 331 319 319 345 307 307 332 307 307 332 319 319 345 320 320 346 307 307 332 320 320 346 308 308 333 308 308 333 320 320 346 321 321 347 308 308 333 321 321 347 309 309 334 309 309 334 321 321 347 322 322 348 309 309 334 322 322 348 310 310 335 310 310 335 322 322 348 323 323 349 310 310 335 323 323 349 311 311 336 311 311 336 323 323 349 312 312 350 311 311 336 312 312 350 300 300 337 312 312 338 324 324 351 325 325 352 312 312 338 325 325 352 313 313 339 313 313 339 325 325 352 326 326 353 313 313 339 326 326 353 314 314 340 314 314 340 326 326 353 327 327 354 314 314 340 327 327 354 315 315 341 315 315 341 327 327 354 328 328 355 315 315 341 328 328 355 316 316 342 316 316 342 328 328 355 329 329 356 316 316 342 329 329 356 317 317 343 317 317 343 329 329 356 330 330 357 317 317 343 330 330 357 318 318 344 318 318 344 330 330 357 331 331 358 318 318 344 331 331 358 319 319 345 319 319 345 331 331 358 332 332 359 319 319 345 332 332 359 320 320 346 320 320 346 332 332 359 333 333 360 320 320 346 333 333 360 321 321 347 321 321 347 333 333 360 334 334 361 321 321 347 334 334 361 322 322 348 322 322 348 334 334 361 335 335 362 322 322 348 335 335 362 323 323 349 323 323 349 335 335 362 324 324 363 323 323 349 324 324 363 312 312 350 324 324 351 336 336 364 337 337 365 324 324 351 337 337 365 325 325 352 325 325 352 337 337 365 338 338 366 325 325 352 338 338 366 326 326 353 326 326 353 338 338 366 339 339 367 326 326 353 339 339 367 327 327 354 327 327 354 339 339 367 340 340 368 327 327 354 340 340 368 328 328 355 328 328 355 340 340 368 341 341 369 328 328 355 341 341 369 329 329 356 329 329 356 341 341 369 342 342 370 329 329 356 342 342 370 330 330 357 330 330 357 342 342 370 343 343 371 330 330 357 343 343 371 331 331 358 331 331 358 343 343 371 344 344 372 331 331 358 344 344 372 332 332 359 332 332 359 344 344 372 345 345 373 332 332 359 345 345 373 333 333 360 333 333 360 345 345 373 346 346 374 333 333 360 346 346 374 334 334 361 334 334 361 346 346 374 347 347 375 334 334 361 347 347 375 335 335 362 335 335 362 347 347 375 336 336 376 335 335 362 336 336 376 324 324 363 336 336 364 348 348 377 349 349 378 336 336 364 349 349 378 337 337 365 337 337 365 349 349 378 350 350 379 337 337 365 350 350 379 338 338 366 338 338 366 350 350 379 351 351 380 338 338 366 351 351 380 339 339 367 339 339 367 351 351 380 352 352 381 339 339 367 352 352 381 340 340 368 340 340 368 352 352 381 353 353 382 340 340 368 353 353 382 341 341 369 341 341 369 353 353 382 354 354 383 341 341 369 354 354 383 342 342 370 342 342 370 354 354 383 355 355 384 342 342 370 355 355 384 343 343 371 343 343 371 355 355 384 356 356 385 343 343 371 356 356 385 344 344 372 344 344 372 356 356 385 357 357 386 344 344 372 357 357 386 345 345 373 345 345 373 357 357 386 358 358 387 345 345 373 358 358 387 346 346 374 346 346 374 358 358 387 359 359 388 346 346 374 359 359 388 347 347 375 347 347 375 359 359 388 348 348 389 347 347 375 348 348 389 336 336 376 348 348 377 360 360 390 361 361 391 348 348 377 361 361 391 349 349 378 349 349 378 361 361 391 362 362 392 349 349 378 362 362 392 350 350 379 350 350 379 362 362 392 363 363 393 350 350 379 363 363 393 351 351 380 351 351 380 363 363 393 364 364 394 351 351 380 364 364 394 352 352 381 352 352 381 364 364 394 365 365 395 352 352 381 365 365 395 353 353 382 353 353 382 365 365 395 366 366 396 353 353 382 366 366 396 354 354 383 354 354 383 366 366 396 367 367 397 354 354 383 367 367 397 355 355 384 355 355 384 367 367 397 368 368 398 355 355 384 368 368 398 356 356 385 356 356 385 368 368 398 369 369 399 356 356 385 369 369 399 357 357 386 357 357 386 369 369 399 370 370 400 357 357 386 370 370 400 358 358 387 358 358 387 370 370 400 371 371 401 358 358 387 371 371 401 359 359 388 359 359 388 371 371 401 360 360 402 359 359 388 360 360 402 348 348 389 360 360 390 372 372 403 373 373 404 360 360 390 373 373 404 361 361 391 361 361 391 373 373 404 374 374 405 361 361 391 374 374 405 362 362 392 362 362 392 374 374 405 375 375 406 362 362 392 375 375 406 363 363 393 363 363 393 375 375 406 376 376 407 363 363 393 376 376 407 364 364 394 364 364 394 376 376 407 377 377 408 364 364 394 377 377 408 365 365 395 365 365 395 377 377 408 378 378 409 365 365 395 378 378 409 366 366 396 366 366 396 378 378 409 379 379 410 366 366 396 379 379 410 367 367 397 367 367 397 379 379 410 380 380 411 367 367 397 380 380 411 368 368 398 368 368 398 380 380 411 381 381 412 368 368 398 381 381 412 369 369 399 369 369 399 381 381 412 382 382 413 369 369 399 382 382 413 370 370 400 370 370 400 382 382 413 383 383 414 370 370 400 383 383 414 371 371 401 371 371 401 383 383 414 372 372 415 371 371 401 372 372 415 360 360 402 372 372 403 384 384 416 385 385 417 372 372 403 385 385 417 373 373 404 373 373 404 385 385 417 386 386 418 373 373 404 386 386 418 374 374 405 374 374 405 386 386 418 387 387 419 374 374 405 387 387 419 375 375 406 375 375 406 387 387 419 388 388 420 375 375 406 388 388 420 376 376 407 376 376 407 388 388 420 389 389 421 376 376 407 389 389 421 377 377 408 377 377 408 389 389 421 390 390 422 377 377 408 390 390 422 378 378 409 378 378 409 390 390 422 391 391 423 378 378 409 391 391 423 379 379 410 379 379 410 391 391 423 392 392 424 379 379 410 392 392 424 380 380 411 380 380 411 392 392 424 393 393 425 380 380 411 393 393 425 381 381 412 381 381 412 393 393 425 394 394 426 381 381 412 394 394 426 382 382 413 382 382 413 394 394 426 395 395 427 382 382 413 395 395 427 383 383 414 383 383 414 395 395 427 384 384 428 383 383 414 384 384 428 372 372 415 384 384 416 396 396 429 397 397 430 384 384 416 397 397 430 385 385 417 385 385 417 397 397 430 398 398 431 385 385 417 398 398 431 386 386 418 386 386 418 398 398 431 399 399 432 386 386 418 399 399 432 387 387 419 387 387 419 399 399 432 400 400 433 387 387 419 400 400 433 388 388 420 388 388 420 400 400 433 401 401 434 388 388 420 401 401 434 389 389 421 389 389 421 401 401 434 402 402 435 389 389 421 402 402 435 390 390 422 390 390 422 402 402 435 403 403 436 390 390 422 403 403 436 391 391 423 391 391 423 403 403 436 404 404 437 391 391 423 404 404 437 392 392 424 392 392 424 404 404 437 405 405 438 392 392 424 405 405 438 393 393 425 393 393 425 405 405 438 406 406 439 393 393 425 406 406 439 394 394 426 394 394 426 406 406 439 407 407 440 394 394 426 407 407 440 395 395 427 395 395 427 407 407 440 396 396 441 395 395 427 396 396 441 384 384 428 396 396 429 408 408 442 409 409 443 396 396 429 409 409 443 397 397 430 397 397 430 409 409 443 410 410 444 397 397 430 410 410 444 398 398 431 398 398 431 410 410 444 411 411 445 398 398 431 411 411 445 399 399 432 399 399 432 411 411 445 412 412 446 399 399 432 412 412 446 400 400 433 400 400 433 412 412 446 413 413 447 400 400 433 413 413 447 401 401 434 401 401 434 413 413 447 414 414 448 401 401 434 414 414 448 402 402 435 402 402 435 414 414 448 415 415 449 402 402 435 415 415 449 403 403 436 403 403 436 415 415 449 416 416 450 403 403 436 416 416 450 404 404 437 404 404 437 416 416 450 417 417 451 404 404 437 417 417 451 405 405 438 405 405 438 417 417 451 418 418 452 405 405 438 418 418 452 406 406 439 406 406 439 418 418 452 419 419 453 406 406 439 419 419 453 407 407 440 407 407 440 419 419 453 408 408 454 407 407 440 408 408 454 396 396 441 408 408 442 420 420 455 421 421 456 408 408 442 421 421 456 409 409 443 409 409 443 421 421 456 422 422 457 409 409 443 422 422 457 410 410 444 410 410 444 422 422 457 423 423 458 410 410 444 423 423 458 411 411 445 411 411 445 423 423 458 424 424 459 411 411 445 424 424 459 412 412 446 412 412 446 424 424 459 425 425 460 412 412 446 425 425 460 413 413 447 413 413 447 425 425 460 426 426 461 413 413 447 426 426 461 414 414 448 414 414 448 426 426 461 427 427 462 414 414 448 427 427 462 415 415 449 415 415 449 427 427 462 428 428 463 415 415 449 428 428 463 416 416 450 416 416 450 428 428 463 429 429 464 416 416 450 429 429 464 417 417 451 417 417 451 429 429 464 430 430 465 417 417 451 430 430 465 418 418 452 418 418 452 430 430 465 431 431 466 418 418 452 431 431 466 419 419 453 419 419 453 431 431 466 420 420 467 419 419 453 420 420 467 408 408 454 420 420 455 432 432 468 433 433 469 420 420 455 433 433 469 421 421 456 421 421 456 433 433 469 434 434 470 421 421 456 434 434 470 422 422 457 422 422 457 434 434 470 435 435 471 422 422 457 435 435 471 423 423 458 423 423 458 435 435 471 436 436 472 423 423 458 436 436 472 424 424 459 424 424 459 436 436 472 437 437 473 424 424 459 437 437 473 425 425 460 425 425 460 437 437 473 438 438 474 425 425 460 438 438 474 426 426 461 426 426 461 438 438 474 439 439 475 426 426 461 439 439 475 427 427 462 427 427 462 439 439 475 440 440 476 427 427 462 440 440 476 428 428 463 428 428 463 440 440 476 441 441 477 428 428 463 441 441 477 429 429 464 429 429 464 441 441 477 442 442 478 429 429 464 442 442 478 430 430 465 430 430 465 442 442 478 443 443 479 430 430 465 443 443 479 431 431 466 431 431 466 443 443 479 432 432 480 431 431 466 432 432 480 420 420 467 432 432 468 444 444 481 445 445 482 432 432 468 445 445 482 433 433 469 433 433 469 445 445 482 446 446 483 433 433 469 446 446 483 434 434 470 434 434 470 446 446 483 447 447 484 434 434 470 447 447 484 435 435 471 435 435 471 447 447 484 448 448 485 435 435 471 448 448 485 436 436 472 436 436 472 448 448 485 449 449 486 436 436 472 449 449 486 437 437 473 437 437 473 449 449 486 450 450 487 437 437 473 450 450 487 438 438 474 438 438 474 450 450 487 451 451 488 438 438 474 451 451 488 439 439 475 439 439 475 451 451 488 452 452 489 439 439 475 452 452 489 440 440 476 440 440 476 452 452 489 453 453 490 440 440 476 453 453 490 441 441 477 441 441 477 453 453 490 454 454 491 441 441 477 454 454 491 442 442 478 442 442 478 454 454 491 455 455 492 442 442 478 455 455 492 443 443 479 443 443 479 455 455 492 444 444 493 443 443 479 444 444 493 432 432 480 444 444 481 456 456 494 457 457 495 444 444 481 457 457 495 445 445 482 445 445 482 457 457 495 458 458 496 445 445 482 458 458 496 446 446 483 446 446 483 458 458 496 459 459 497 446 446 483 459 459 497 447 447 484 447 447 484 459 459 497 460 460 498 447 447 484 460 460 498 448 448 485 448 448 485 460 460 498 461 461 499 448 448 485 461 461 499 449 449 486 449 449 486 461 461 499 462 462 500 449 449 486 462 462 500 450 450 487 450 450 487 462 462 500 463 463 501 450 450 487 463 463 501 451 451 488 451 451 488 463 463 501 464 464 502 451 451 488 464 464 502 452 452 489 452 452 489 464 464 502 465 465 503 452 452 489 465 465 503 453 453 490 453 453 490 465 465 503 466 466 504 453 453 490 466 466 504 454 454 491 454 454 491 466 466 504 467 467 505 454 454 491 467 467 505 455 455 492 455 455 492 467 467 505 456 456 506 455 455 492 456 456 506 444 444 493 456 456 494 468 468 507 469 469 508 456 456 494 469 469 508 457 457 495 457 457 495 469 469 508 470 470 509 457 457 495 470 470 509 458 458 496 458 458 496 470 470 509 471 471 510 458 458 496 471 471 510 459 459 497 459 459 497 471 471 510 472 472 511 459 459 497 472 472 511 460 460 498 460 460 498 472 472 511 473 473 512 460 460 498 473 473 512 461 461 499 461 461 499 473 473 512 474 474 513 461 461 499 474 474 513 462 462 500 462 462 500 474 474 513 475 475 514 462 462 500 475 475 514 463 463 501 463 463 501 475 475 514 476 476 515 463 463 501 476 476 515 464 464 502 464 464 502 476 476 515 477 477 516 464 464 502 477 477 516 465 465 503 465 465 503 477 477 516 478 478 517 465 465 503 478 478 517 466 466 504 466 466 504 478 478 517 479 479 518 466 466 504 479 479 518 467 467 505 467 467 505 479 479 518 468 468 519 467 467 505 468 468 519 456 456 506 468 468 507 480 480 520 481 481 521 468 468 507 481 481 521 469 469 508 469 469 508 481 481 521 482 482 522 469 469 508 482 482 522 470 470 509 470 470 509 482 482 522 483 483 523 470 470 509 483 483 523 471 471 510 471 471 510 483 483 523 484 484 524 471 471 510 484 484 524 472 472 511 472 472 511 484 484 524 485 485 525 472 472 511 485 485 525 473 473 512 473 473 512 485 485 525 486 486 526 473 473 512 486 486 526 474 474 513 474 474 513 486 486 526 487 487 527 474 474 513 487 487 527 475 475 514 475 475 514 487 487 527 488 488 528 475 475 514 488 488 528 476 476 515 476 476 515 488 488 528 489 489 529 476 476 515 489 489 529 477 477 516 477 477 516 489 489 529 490 490 530 477 477 516 490 490 530 478 478 517 478 478 517 490 490 530 491 491 531 478 478 517 491 491 531 479 479 518 479 479 518 491 491 531 480 480 532 479 479 518 480 480 532 468 468 519 480 480 520 492 492 533 493 493 534 480 480 520 493 493 534 481 481 521 481 481 521 493 493 534 494 494 535 481 481 521 494 494 535 482 482 522 482 482 522 494 494 535 495 495 536 482 482 522 495 495 536 483 483 523 483 483 523 495 495 536 496 496 537 483 483 523 496 496 537 484 484 524 484 484 524 496 496 537 497 497 538 484 484 524 497 497 538 485 485 525 485 485 525 497 497 538 498 498 539 485 485 525 498 498 539 486 486 526 486 486 526 498 498 539 499 499 540 486 486 526 499 499 540 487 487 527 487 487 527 499 499 540 500 500 541 487 487 527 500 500 541 488 488 528 488 488 528 500 500 541 501 501 542 488 488 528 501 501 542 489 489 529 489 489 529 501 501 542 502 502 543 489 489 529 502 502 543 490 490 530 490 490 530 502 502 543 503 503 544 490 490 530 503 503 544 491 491 531 491 491 531 503 503 544 492 492 545 491 491 531 492 492 545 480 480 532 492 492 533 504 504 546 505 505 547 492 492 533 505 505 547 493 493 534 493 493 534 505 505 547 506 506 548 493 493 534 506 506 548 494 494 535 494 494 535 506 506 548 507 507 549 494 494 535 507 507 549 495 495 536 495 495 536 507 507 549 508 508 550 495 495 536 508 508 550 496 496 537 496 496 537 508 508 550 509 509 551 496 496 537 509 509 551 497 497 538 497 497 538 509 509 551 510 510 552 497 497 538 510 510 552 498 498 539 498 498 539 510 510 552 511 511 553 498 498 539 511 511 553 499 499 540 499 499 540 511 511 553 512 512 554 499 499 540 512 512 554 500 500 541 500 500 541 512 512 554 513 513 555 500 500 541 513 513 555 501 501 542 501 501 542 513 513 555 514 514 556 501 501 542 514 514 556 502 502 543 502 502 543 514 514 556 515 515 557 502 502 543 515 515 557 503 503 544 503 503 544 515 515 557 504 504 558 503 503 544 504 504 558 492 492 545 504 504 546 516 516 559 517 517 560 504 504 546 517 517 560 505 505 547 505 505 547 517 517 560 518 518 561 505 505 547 518 518 561 506 506 548 506 506 548 518 518 561 519 519 562 506 506 548 519 519 562 507 507 549 507 507 549 519 519 562 520 520 563 507 507 549 520 520 563 508 508 550 508 508 550 520 520 563 521 521 564 508 508 550 521 521 564 509 509 551 509 509 551 521 521 564 522 522 565 509 509 551 522 522 565 510 510 552 510 510 552 522 522 565 523 523 566 510 510 552 523 523 566 511 511 553 511 511 553 523 523 566 524 524 567 511 511 553 524 524 567 512 512 554 512 512 554 524 524 567 525 525 568 512 512 554 525 525 568 513 513 555 513 513 555 525 525 568 526 526 569 513 513 555 526 526 569 514 514 556 514 514 556 526 526 569 527 527 570 514 514 556 527 527 570 515 515 557 515 515 557 527 527 570 516 516 571 515 515 557 516 516 571 504 504 558 516 516 559 528 528 572 529 529 573 516 516 559 529 529 573 517 517 560 517 517 560 529 529 573 530 530 574 517 517 560 530 530 574 518 518 561 518 518 561 530 530 574 531 531 575 518 518 561 531 531 575 519 519 562 519 519 562 531 531 575 532 532 576 519 519 562 532 532 576 520 520 563 520 520 563 532 532 576 533 533 577 520 520 563 533 533 577 521 521 564 521 521 564 533 533 577 534 534 578 521 521 564 534 534 578 522 522 565 522 522 565 534 534 578 535 535 579 522 522 565 535 535 579 523 523 566 523 523 566 535 535 579 536 536 580 523 523 566 536 536 580 524 524 567 524 524 567 536 536 580 537 537 581 524 524 567 537 537 581 525 525 568 525 525 568 537 537 581 538 538 582 525 525 568 538 538 582 526 526 569 526 526 569 538 538 582 539 539 583 526 526 569 539 539 583 527 527 570 527 527 570 539 539 583 528 528 584 527 527 570 528 528 584 516 516 571 528 528 572 540 540 585 541 541 586 528 528 572 541 541 586 529 529 573 529 529 573 541 541 586 542 542 587 529 529 573 542 542 587 530 530 574 530 530 574 542 542 587 543 543 588 530 530 574 543 543 588 531 531 575 531 531 575 543 543 588 544 544 589 531 531 575 544 544 589 532 532 576 532 532 576 544 544 589 545 545 590 532 532 576 545 545 590 533 533 577 533 533 577 545 545 590 546 546 591 533 533 577 546 546 591 534 534 578 534 534 578 546 546 591 547 547 592 534 534 578 547 547 592 535 535 579 535 535 579 547 547 592 548 548 593 535 535 579 548 548 593 536 536 580 536 536 580 548 548 593 549 549 594 536 536 580 549 549 594 537 537 581 537 537 581 549 549 594 550 550 595 537 537 581 550 550 595 538 538 582 538 538 582 550 550 595 551 551 596 538 538 582 551 551 596 539 539 583 539 539 583 551 551 596 540 540 597 539 539 583 540 540 597 528 528 584 540 540 585 552 552 598 553 553 599 540 540 585 553 553 599 541 541 586 541 541 586 553 553 599 554 554 600 541 541 586 554 554 600 542 542 587 542 542 587 554 554 600 555 555 601 542 542 587 555 555 601 543 543 588 543 543 588 555 555 601 556 556 602 543 543 588 556 556 602 544 544 589 544 544 589 556 556 602 557 557 603 544 544 589 557 557 603 545 545 590 545 545 590 557 557 603 558 558 604 545 545 590 558 558 604 546 546 591 546 546 591 558 558 604 559 559 605 546 546 591 559 559 605 547 547 592 547 547 592 559 559 605 560 560 606 547 547 592 560 560 606 548 548 593 548 548 593 560 560 606 561 561 607 548 548 593 561 561 607 549 549 594 549 549 594 561 561 607 562 562 608 549 549 594 562 562 608 550 550 595 550 550 595 562 562 608 563 563 609 550 550 595 563 563 609 551 551 596 551 551 596 563 563 609 552 552 610 551 551 596 552 552 610 540 540 597 552 552 598 564 564 611 565 565 612 552 552 598 565 565 612 553 553 599 553 553 599 565 565 612 566 566 613 553 553 599 566 566 613 554 554 600 554 554 600 566 566 613 567 567 614 554 554 600 567 567 614 555 555 601 555 555 601 567 567 614 568 568 615 555 555 601 568 568 615 556 556 602 556 556 602 568 568 615 569 569 616 556 556 602 569 569 616 557 557 603 557 557 603 569 569 616 570 570 617 557 557 603 570 570 617 558 558 604 558 558 604 570 570 617 571 571 618 558 558 604 571 571 618 559 559 605 559 559 605 571 571 618 572 572 619 559 559 605 572 572 619 560 560 606 560 560 606 572 572 619 573 573 620 560 560 606 573 573 620 561 561 607 561 561 607 573 573 620 574 574 621 561 561 607 574 574 621 562 562 608 562 562 608 574 574 621 575 575 622 562 562 608 575 575 622 563 563 609 563 563 609 575 575 622 564 564 623 563 563 609 564 564 623 552 552 610 564 564 611 576 576 624 577 577 625 564 564 611 577 577 625 565 565 612 565 565 612 577 577 625 578 578 626 565 565 612 578 578 626 566 566 613 566 566 613 578 578 626 579 579 627 566 566 613 579 579 627 567 567 614 567 567 614 579 579 627 580 580 628 567 567 614 580 580 628 568 568 615 568 568 615 580 580 628 581 581 629 568 568 615 581 581 629 569 569 616 569 569 616 581 581 629 582 582 630 569 569 616 582 582 630 570 570 617 570 570 617 582 582 630 583 583 631 570 570 617 583 583 631 571 571 618 571 571 618 583 583 631 584 584 632 571 571 618 584 584 632 572 572 619 572 572 619 584 584 632 585 585 633 572 572 619 585 585 633 573 573 620 573 573 620 585 585 633 586 586 634 573 573 620 586 586 634 574 574 621 574 574 621 586 586 634 587 587 635 574 574 621 587 587 635 575 575 622 575 575 622 587 587 635 576 576 636 575 575 622 576 576 636 564 564 623 576 576 624 588 588 637 589 589 638 576 576 624 589 589 638 577 577 625 577 577 625 589 589 638 590 590 639 577 577 625 590 590 639 578 578 626 578 578 626 590 590 639 591 591 640 578 578 626 591 591 640 579 579 627 579 579 627 591 591 640 592 592 641 579 579 627 592 592 641 580 580 628 580 580 628 592 592 641 593 593 642 580 580 628 593 593 642 581 581 629 581 581 629 593 593 642 594 594 643 581 581 629 594 594 643 582 582 630 582 582 630 594 594 643 595 595 644 582 582 630 595 595 644 583 583 631 583 583 631 595 595 644 596 596 645 583 583 631 596 596 645 584 584 632 584 584 632 596 596 645 597 597 646 584 584 632 597 597 646 585 585 633 585 585 633 597 597 646 598 598 647 585 585 633 598 598 647 586 586 634 586 586 634 598 598 647 599 599 648 586 586 634 599 599 648 587 587 635 587 587 635 599 599 648 588 588 649 587 587 635 588 588 649 576 576 636 588 588 637 600 600 650 601 601 651 588 588 637 601 601 651 589 589 638 589 589 638 601 601 651 602 602 652 589 589 638 602 602 652 590 590 639 590 590 639 602 602 652 603 603 653 590 590 639 603 603 653 591 591 640 591 591 640 603 603 653 604 604 654 591 591 640 604 604 654 592 592 641 592 592 641 604 604 654 605 605 655 592 592 641 605 605 655 593 593 642 593 593 642 605 605 655 606 606 656 593 593 642 606 606 656 594 594 643 594 594 643 606 606 656 607 607 657 594 594 643 607 607 657 595 595 644 595 595 644 607 607 657 608 608 658 595 595 644 608 608 658 596 596 645 596 596 645 608 608 658 609 609 659 596 596 645 609 609 659 597 597 646 597 597 646 609 609 659 610 610 660 597 597 646 610 610 660 598 598 647 598 598 647 610 610 660 611 611 661 598 598 647 611 611 661 599 599 648 599 599 648 611 611 661 600 600 662 599 599 648 600 600 662 588 588 649 600 600 650 612 612 663 613 613 664 600 600 650 613 613 664 601 601 651 601 601 651 613 613 664 614 614 665 601 601 651 614 614 665 602 602 652 602 602 652 614 614 665 615 615 666 602 602 652 615 615 666 603 603 653 603 603 653 615 615 666 616 616 667 603 603 653 616 616 667 604 604 654 604 604 654 616 616 667 617 617 668 604 604 654 617 617 668 605 605 655 605 605 655 617 617 668 618 618 669 605 605 655 618 618 669 606 606 656 606 606 656 618 618 669 619 619 670 606 606 656 619 619 670 607 607 657 607 607 657 619 619 670 620 620 671 607 607 657 620 620 671 608 608 658 608 608 658 620 620 671 621 621 672 608 608 658 621 621 672 609 609 659 609 609 659 621 621 672 622 622 673 609 609 659 622 622 673 610 610 660 610 610 660 622 622 673 623 623 674 610 610 660 623 623 674 611 611 661 611 611 661 623 623 674 612 612 675 611 611 661 612 612 675 600 600 662 612 612 663 624 624 676 625 625 677 612 612 663 625 625 677 613 613 664 613 613 664 625 625 677 626 626 678 613 613 664 626 626 678 614 614 665 614 614 665 626 626 678 627 627 679 614 614 665 627 627 679 615 615 666 615 615 666 627 627 679 628 628 680 615 615 666 628 628 680 616 616 667 616 616 667 628 628 680 629 629 681 616 616 667 629 629 681 617 617 668 617 617 668 629 629 681 630 630 682 617 617 668 630 630 682 618 618 669 618 618 669 630 630 682 631 631 683 618 618 669 631 631 683 619 619 670 619 619 670 631 631 683 632 632 684 619 619 670 632 632 684 620 620 671 620 620 671 632 632 684 633 633 685 620 620 671 633 633 685 621 621 672 621 621 672 633 633 685 634 634 686 621 621 672 634 634 686 622 622 673 622 622 673 634 634 686 635 635 687 622 622 673 635 635 687 623 623 674 623 623 674 635 635 687 624 624 688 623 623 674 624 624 688 612 612 675 624 624 676 636 636 689 637 637 690 624 624 676 637 637 690 625 625 677 625 625 677 637 637 690 638 638 691 625 625 677 638 638 691 626 626 678 626 626 678 638 638 691 639 639 692 626 626 678 639 639 692 627 627 679 627 627 679 639 639 692 640 640 693 627 627 679 640 640 693 628 628 680 628 628 680 640 640 693 641 641 694 628 628 680 641 641 694 629 629 681 629 629 681 641 641 694 642 642 695 629 629 681 642 642 695 630 630 682 630 630 682 642 642 695 643 643 696 630 630 682 643 643 696 631 631 683 631 631 683 643 643 696 644 644 697 631 631 683 644 644 697 632 632 684 632 632 684 644 644 697 645 645 698 632 632 684 645 645 698 633 633 685 633 633 685 645 645 698 646 646 699 633 633 685 646 646 699 634 634 686 634 634 686 646 646 699 647 647 700 634 634 686 647 647 700 635 635 687 635 635 687 647 647 700 636 636 701 635 635 687 636 636 701 624 624 688 636 636 689 648 648 702 649 649 703 636 636 689 649 649 703 637 637 690 637 637 690 649 649 703 650 650 704 637 637 690 650 650 704 638 638 691 638 638 691 650 650 704 651 651 705 638 638 691 651 651 705 639 639 692 639 639 692 651 651 705 652 652 706 639 639 692 652 652 706 640 640 693 640 640 693 652 652 706 653 653 707 640 640 693 653 653 707 641 641 694 641 641 694 653 653 707 654 654 708 641 641 694 654 654 708 642 642 695 642 642 695 654 654 708 655 655 709 642 642 695 655 655 709 643 643 696 643 643 696 655 655 709 656 656 710 643 643 696 656 656 710 644 644 697 644 644 697 656 656 710 657 657 711 644 644 697 657 657 711 645 645 698 645 645 698 657 657 711 658 658 712 645 645 698 658 658 712 646 646 699 646 646 699 658 658 712 659 659 713 646 646 699 659 659 713 647 647 700 647 647 700 659 659 713 648 648 714 647 647 700 648 648 714 636 636 701 648 648 702 660 660 715 661 661 716 648 648 702 661 661 716 649 649 703 649 649 703 661 661 716 662 662 717 649 649 703 662 662 717 650 650 704 650 650 704 662 662 717 663 663 718 650 650 704 663 663 718 651 651 705 651 651 705 663 663 718 664 664 719 651 651 705 664 664 719 652 652 706 652 652 706 664 664 719 665 665 720 652 652 706 665 665 720 653 653 707 653 653 707 665 665 720 666 666 721 653 653 707 666 666 721 654 654 708 654 654 708 666 666 721 667 667 722 654 654 708 667 667 722 655 655 709 655 655 709 667 667 722 668 668 723 655 655 709 668 668 723 656 656 710 656 656 710 668 668 723 669 669 724 656 656 710 669 669 724 657 657 711 657 657 711 669 669 724 670 670 725 657 657 711 670 670 725 658 658 712 658 658 712 670 670 725 671 671 726 658 658 712 671 671 726 659 659 713 659 659 713 671 671 726 660 660 727 659 659 713 660 660 727 648 648 714 660 660 715 672 672 728 673 673 729 660 660 715 673 673 729 661 661 716 661 661 716 673 673 729 674 674 730 661 661 716 674 674 730 662 662 717 662 662 717 674 674 730 675 675 731 662 662 717 675 675 731 663 663 718 663 663 718 675 675 731 676 676 732 663 663 718 676 676 732 664 664 719 664 664 719 676 676 732 677 677 733 664 664 719 677 677 733 665 665 720 665 665 720 677 677 733 678 678 734 665 665 720 678 678 734 666 666 721 666 666 721 678 678 734 679 679 735 666 666 721 679 679 735 667 667 722 667 667 722 679 679 735 680 680 736 667 667 722 680 680 736 668 668 723 668 668 723 680 680 736 681 681 737 668 668 723 681 681 737 669 669 724 669 669 724 681 681 737 682 682 738 669 669 724 682 682 738 670 670 725 670 670 725 682 682 738 683 683 739 670 670 725 683 683 739 671 671 726 671 671 726 683 683 739 672 672 740 671 671 726 672 672 740 660 660 727 672 672 728 684 684 741 685 685 742 672 672 728 685 685 742 673 673 729 673 673 729 685 685 742 686 686 743 673 673 729 686 686 743 674 674 730 674 674 730 686 686 743 687 687 744 674 674 730 687 687 744 675 675 731 675 675 731 687 687 744 688 688 745 675 675 731 688 688 745 676 676 732 676 676 732 688 688 745 689 689 746 676 676 732 689 689 746 677 677 733 677 677 733 689 689 746 690 690 747 677 677 733 690 690 747 678 678 734 678 678 734 690 690 747 691 691 748 678 678 734 691 691 748 679 679 735 679 679 735 691 691 748 692 692 749 679 679 735 692 692 749 680 680 736 680 680 736 692 692 749 693 693 750 680 680 736 693 693 750 681 681 737 681 681 737 693 693 750 694 694 751 681 681 737 694 694 751 682 682 738 682 682 738 694 694 751 695 695 752 682 682 738 695 695 752 683 683 739 683 683 739 695 695 752 684 684 753 683 683 739 684 684 753 672 672 740 684 684 741 696 696 754 697 697 755 684 684 741 697 697 755 685 685 742 685 685 742 697 697 755 698 698 756 685 685 742 698 698 756 686 686 743 686 686 743 698 698 756 699 699 757 686 686 743 699 699 757 687 687 744 687 687 744 699 699 757 700 700 758 687 687 744 700 700 758 688 688 745 688 688 745 700 700 758 701 701 759 688 688 745 701 701 759 689 689 746 689 689 746 701 701 759 702 702 760 689 689 746 702 702 760 690 690 747 690 690 747 702 702 760 703 703 761 690 690 747 703 703 761 691 691 748 691 691 748 703 703 761 704 704 762 691 691 748 704 704 762 692 692 749 692 692 749 704 704 762 705 705 763 692 692 749 705 705 763 693 693 750 693 693 750 705 705 763 706 706 764 693 693 750 706 706 764 694 694 751 694 694 751 706 706 764 707 707 765 694 694 751 707 707 765 695 695 752 695 695 752 707 707 765 696 696 766 695 695 752 696 696 766 684 684 753 696 696 754 708 708 767 709 709 768 696 696 754 709 709 768 697 697 755 697 697 755 709 709 768 710 710 769 697 697 755 710 710 769 698 698 756 698 698 756 710 710 769 711 711 770 698 698 756 711 711 770 699 699 757 699 699 757 711 711 770 712 712 771 699 699 757 712 712 771 700 700 758 700 700 758 712 712 771 713 713 772 700 700 758 713 713 772 701 701 759 701 701 759 713 713 772 714 714 773 701 701 759 714 714 773 702 702 760 702 702 760 714 714 773 715 715 774 702 702 760 715 715 774 703 703 761 703 703 761 715 715 774 716 716 775 703 703 761 716 716 775 704 704 762 704 704 762 716 716 775 717 717 776 704 704 762 717 717 776 705 705 763 705 705 763 717 717 776 718 718 777 705 705 763 718 718 777 706 706 764 706 706 764 718 718 777 719 719 778 706 706 764 719 719 778 707 707 765 707 707 765 719 719 778 708 708 779 707 707 765 708 708 779 696 696 766 708 708 767 720 720 780 721 721 781 708 708 767 721 721 781 709 709 768 709 709 768 721 721 781 722 722 782 709 709 768 722 722 782 710 710 769 710 710 769 722 722 782 723 723 783 710 710 769 723 723 783 711 711 770 711 711 770 723 723 783 724 724 784 711 711 770 724 724 784 712 712 771 712 712 771 724 724 784 725 725 785 712 712 771 725 725 785 713 713 772 713 713 772 725 725 785 726 726 786 713 713 772 726 726 786 714 714 773 714 714 773 726 726 786 727 727 787 714 714 773 727 727 787 715 715 774 715 715 774 727 727 787 728 728 788 715 715 774 728 728 788 716 716 775 716 716 775 728 728 788 729 729 789 716 716 775 729 729 789 717 717 776 717 717 776 729 729 789 730 730 790 717 717 776 730 730 790 718 718 777 718 718 777 730 730 790 731 731 791 718 718 777 731 731 791 719 719 778 719 719 778 731 731 791 720 720 792 719 719 778 720 720 792 708 708 779 720 720 780 732 732 793 733 733 794 720 720 780 733 733 794 721 721 781 721 721 781 733 733 794 734 734 795 721 721 781 734 734 795 722 722 782 722 722 782 734 734 795 735 735 796 722 722 782 735 735 796 723 723 783 723 723 783 735 735 796 736 736 797 723 723 783 736 736 797 724 724 784 724 724 784 736 736 797 737 737 798 724 724 784 737 737 798 725 725 785 725 725 785 737 737 798 738 738 799 725 725 785 738 738 799 726 726 786 726 726 786 738 738 799 739 739 800 726 726 786 739 739 800 727 727 787 727 727 787 739 739 800 740 740 801 727 727 787 740 740 801 728 728 788 728 728 788 740 740 801 741 741 802 728 728 788 741 741 802 729 729 789 729 729 789 741 741 802 742 742 803 729 729 789 742 742 803 730 730 790 730 730 790 742 742 803 743 743 804 730 730 790 743 743 804 731 731 791 731 731 791 743 743 804 732 732 805 731 731 791 732 732 805 720 720 792 732 732 793 744 744 806 745 745 807 732 732 793 745 745 807 733 733 794 733 733 794 745 745 807 746 746 808 733 733 794 746 746 808 734 734 795 734 734 795 746 746 808 747 747 809 734 734 795 747 747 809 735 735 796 735 735 796 747 747 809 748 748 810 735 735 796 748 748 810 736 736 797 736 736 797 748 748 810 749 749 811 736 736 797 749 749 811 737 737 798 737 737 798 749 749 811 750 750 812 737 737 798 750 750 812 738 738 799 738 738 799 750 750 812 751 751 813 738 738 799 751 751 813 739 739 800 739 739 800 751 751 813 752 752 814 739 739 800 752 752 814 740 740 801 740 740 801 752 752 814 753 753 815 740 740 801 753 753 815 741 741 802 741 741 802 753 753 815 754 754 816 741 741 802 754 754 816 742 742 803 742 742 803 754 754 816 755 755 817 742 742 803 755 755 817 743 743 804 743 743 804 755 755 817 744 744 818 743 743 804 744 744 818 732 732 805 744 744 806 756 756 819 757 757 820 744 744 806 757 757 820 745 745 807 745 745 807 757 757 820 758 758 821 745 745 807 758 758 821 746 746 808 746 746 808 758 758 821 759 759 822 746 746 808 759 759 822 747 747 809 747 747 809 759 759 822 760 760 823 747 747 809 760 760 823 748 748 810 748 748 810 760 760 823 761 761 824 748 748 810 761 761 824 749 749 811 749 749 811 761 761 824 762 762 825 749 749 811 762 762 825 750 750 812 750 750 812 762 762 825 763 763 826 750 750 812 763 763 826 751 751 813 751 751 813 763 763 826 764 764 827 751 751 813 764 764 827 752 752 814 752 752 814 764 764 827 765 765 828 752 752 814 765 765 828 753 753 815 753 753 815 765 765 828 766 766 829 753 753 815 766 766 829 754 754 816 754 754 816 766 766 829 767 767 830 754 754 816 767 767 830 755 755 817 755 755 817 767 767 830 756 756 831 755 755 817 756 756 831 744 744 818 756 756 819 768 768 832 769 769 833 756 756 819 769 769 833 757 757 820 757 757 820 769 769 833 770 770 834 757 757 820 770 770 834 758 758 821 758 758 821 770 770 834 771 771 835 758 758 821 771 771 835 759 759 822 759 759 822 771 771 835 772 772 836 759 759 822 772 772 836 760 760 823 760 760 823 772 772 836 773 773 837 760 760 823 773 773 837 761 761 824 761 761 824 773 773 837 774 774 838 761 761 824 774 774 838 762 762 825 762 762 825 774 774 838 775 775 839 762 762 825 775 775 839 763 763 826 763 763 826 775 775 839 776 776 840 763 763 826 776 776 840 764 764 827 764 764 827 776 776 840 777 777 841 764 764 827 777 777 841 765 765 828 765 765 828 777 777 841 778 778 842 765 765 828 778 778 842 766 766 829 766 766 829 778 778 842 779 779 843 766 766 829 779 779 843 767 767 830 767 767 830 779 779 843 768 768 844 767 767 830 768 768 844 756 756 831 768 768 832 780 780 845 781 781 846 768 768 832 781 781 846 769 769 833 769 769 833 781 781 846 782 782 847 769 769 833 782 782 847 770 770 834 770 770 834 782 782 847 783 783 848 770 770 834 783 783 848 771 771 835 771 771 835 783 783 848 784 784 849 771 771 835 784 784 849 772 772 836 772 772 836 784 784 849 785 785 850 772 772 836 785 785 850 773 773 837 773 773 837 785 785 850 786 786 851 773 773 837 786 786 851 774 774 838 774 774 838 786 786 851 787 787 852 774 774 838 787 787 852 775 775 839 775 775 839 787 787 852 788 788 853 775 775 839 788 788 853 776 776 840 776 776 840 788 788 853 789 789 854 776 776 840 789 789 854 777 777 841 777 777 841 789 789 854 790 790 855 777 777 841 790 790 855 778 778 842 778 778 842 790 790 855 791 791 856 778 778 842 791 791 856 779 779 843 779 779 843 791 791 856 780 780 857 779 779 843 780 780 857 768 768 844 780 780 845 792 792 858 793 793 859 780 780 845 793 793 859 781 781 846 781 781 846 793 793 859 794 794 860 781 781 846 794 794 860 782 782 847 782 782 847 794 794 860 795 795 861 782 782 847 795 795 861 783 783 848 783 783 848 795 795 861 796 796 862 783 783 848 796 796 862 784 784 849 784 784 849 796 796 862 797 797 863 784 784 849 797 797 863 785 785 850 785 785 850 797 797 863 798 798 864 785 785 850 798 798 864 786 786 851 786 786 851 798 798 864 799 799 865 786 786 851 799 799 865 787 787 852 787 787 852 799 799 865 800 800 866 787 787 852 800 800 866 788 788 853 788 788 853 800 800 866 801 801 867 788 788 853 801 801 867 789 789 854 789 789 854 801 801 867 802 802 868 789 789 854 802 802 868 790 790 855 790 790 855 802 802 868 803 803 869 790 790 855 803 803 869 791 791 856 791 791 856 803 803 869 792 792 870 791 791 856 792 792 870 780 780 857 792 792 858 804 804 871 805 805 872 792 792 858 805 805 872 793 793 859 793 793 859 805 805 872 806 806 873 793 793 859 806 806 873 794 794 860 794 794 860 806 806 873 807 807 874 794 794 860 807 807 874 795 795 861 795 795 861 807 807 874 808 808 875 795 795 861 808 808 875 796 796 862 796 796 862 808 808 875 809 809 876 796 796 862 809 809 876 797 797 863 797 797 863 809 809 876 810 810 877 797 797 863 810 810 877 798 798 864 798 798 864 810 810 877 811 811 878 798 798 864 811 811 878 799 799 865 799 799 865 811 811 878 812 812 879 799 799 865 812 812 879 800 800 866 800 800 866 812 812 879 813 813 880 800 800 866 813 813 880 801 801 867 801 801 867 813 813 880 814 814 881 801 801 867 814 814 881 802 802 868 802 802 868 814 814 881 815 815 882 802 802 868 815 815 882 803 803 869 803 803 869 815 815 882 804 804 883 803 803 869 804 804 883 792 792 870 804 804 871 816 816 884 817 817 885 804 804 871 817 817 885 805 805 872 805 805 872 817 817 885 818 818 886 805 805 872 818 818 886 806 806 873 806 806 873 818 818 886 819 819 887 806 806 873 819 819 887 807 807 874 807 807 874 819 819 887 820 820 888 807 807 874 820 820 888 808 808 875 808 808 875 820 820 888 821 821 889 808 808 875 821 821 889 809 809 876 809 809 876 821 821 889 822 822 890 809 809 876 822 822 890 810 810 877 810 810 877 822 822 890 823 823 891 810 810 877 823 823 891 811 811 878 811 811 878 823 823 891 824 824 892 811 811 878 824 824 892 812 812 879 812 812 879 824 824 892 825 825 893 812 812 879 825 825 893 813 813 880 813 813 880 825 825 893 826 826 894 813 813 880 826 826 894 814 814 881 814 814 881 826 826 894 827 827 895 814 814 881 827 827 895 815 815 882 815 815 882 827 827 895 816 816 896 815 815 882 816 816 896 804 804 883 816 816 884 828 828 897 829 829 898 816 816 884 829 829 898 817 817 885 817 817 885 829 829 898 830 830 899 817 817 885 830 830 899 818 818 886 818 818 886 830 830 899 831 831 900 818 818 886 831 831 900 819 819 887 819 819 887 831 831 900 832 832 901 819 819 887 832 832 901 820 820 888 820 820 888 832 832 901 833 833 902 820 820 888 833 833 902 821 821 889 821 821 889 833 833 902 834 834 903 821 821 889 834 834 903 822 822 890 822 822 890 834 834 903 835 835 904 822 822 890 835 835 904 823 823 891 823 823 891 835 835 904 836 836 905 823 823 891 836 836 905 824 824 892 824 824 892 836 836 905 837 837 906 824 824 892 837 837 906 825 825 893 825 825 893 837 837 906 838 838 907 825 825 893 838 838 907 826 826 894 826 826 894 838 838 907 839 839 908 826 826 894 839 839 908 827 827 895 827 827 895 839 839 908 828 828 909 827 827 895 828 828 909 816 816 896 828 828 897 840 840 910 841 841 911 828 828 897 841 841 911 829 829 898 829 829 898 841 841 911 842 842 912 829 829 898 842 842 912 830 830 899 830 830 899 842 842 912 843 843 913 830 830 899 843 843 913 831 831 900 831 831 900 843 843 913 844 844 914 831 831 900 844 844 914 832 832 901 832 832 901 844 844 914 845 845 915 832 832 901 845 845 915 833 833 902 833 833 902 845 845 915 846 846 916 833 833 902 846 846 916 834 834 903 834 834 903 846 846 916 847 847 917 834 834 903 847 847 917 835 835 904 835 835 904 847 847 917 848 848 918 835 835 904 848 848 918 836 836 905 836 836 905 848 848 918 849 849 919 836 836 905 849 849 919 837 837 906 837 837 906 849 849 919 850 850 920 837 837 906 850 850 920 838 838 907 838 838 907 850 850 920 851 851 921 838 838 907 851 851 921 839 839 908 839 839 908 851 851 921 840 840 922 839 839 908 840 840 922 828 828 909 840 840 910 852 852 923 853 853 924 840 840 910 853 853 924 841 841 911 841 841 911 853 853 924 854 854 925 841 841 911 854 854 925 842 842 912 842 842 912 854 854 925 855 855 926 842 842 912 855 855 926 843 843 913 843 843 913 855 855 926 856 856 927 843 843 913 856 856 927 844 844 914 844 844 914 856 856 927 857 857 928 844 844 914 857 857 928 845 845 915 845 845 915 857 857 928 858 858 929 845 845 915 858 858 929 846 846 916 846 846 916 858 858 929 859 859 930 846 846 916 859 859 930 847 847 917 847 847 917 859 859 930 860 860 931 847 847 917 860 860 931 848 848 918 848 848 918 860 860 931 861 861 932 848 848 918 861 861 932 849 849 919 849 849 919 861 861 932 862 862 933 849 849 919 862 862 933 850 850 920 850 850 920 862 862 933 863 863 934 850 850 920 863 863 934 851 851 921 851 851 921 863 863 934 852 852 935 851 851 921 852 852 935 840 840 922 852 852 923 864 864 936 865 865 937 852 852 923 865 865 937 853 853 924 853 853 924 865 865 937 866 866 938 853 853 924 866 866 938 854 854 925 854 854 925 866 866 938 867 867 939 854 854 925 867 867 939 855 855 926 855 855 926 867 867 939 868 868 940 855 855 926 868 868 940 856 856 927 856 856 927 868 868 940 869 869 941 856 856 927 869 869 941 857 857 928 857 857 928 869 869 941 870 870 942 857 857 928 870 870 942 858 858 929 858 858 929 870 870 942 871 871 943 858 858 929 871 871 943 859 859 930 859 859 930 871 871 943 872 872 944 859 859 930 872 872 944 860 860 931 860 860 931 872 872 944 873 873 945 860 860 931 873 873 945 861 861 932 861 861 932 873 873 945 874 874 946 861 861 932 874 874 946 862 862 933 862 862 933 874 874 946 875 875 947 862 862 933 875 875 947 863 863 934 863 863 934 875 875 947 864 864 948 863 863 934 864 864 948 852 852 935 864 864 936 876 876 949 877 877 950 864 864 936 877 877 950 865 865 937 865 865 937 877 877 950 878 878 951 865 865 937 878 878 951 866 866 938 866 866 938 878 878 951 879 879 952 866 866 938 879 879 952 867 867 939 867 867 939 879 879 952 880 880 953 867 867 939 880 880 953 868 868 940 868 868 940 880 880 953 881 881 954 868 868 940 881 881 954 869 869 941 869 869 941 881 881 954 882 882 955 869 869 941 882 882 955 870 870 942 870 870 942 882 882 955 883 883 956 870 870 942 883 883 956 871 871 943 871 871 943 883 883 956 884 884 957 871 871 943 884 884 957 872 872 944 872 872 944 884 884 957 885 885 958 872 872 944 885 885 958 873 873 945 873 873 945 885 885 958 886 886 959 873 873 945 886 886 959 874 874 946 874 874 946 886 886 959 887 887 960 874 874 946 887 887 960 875 875 947 875 875 947 887 887 960 876 876 961 875 875 947 876 876 961 864 864 948 876 876 949 888 888 962 889 889 963 876 876 949 889 889 963 877 877 950 877 877 950 889 889 963 890 890 964 877 877 950 890 890 964 878 878 951 878 878 951 890 890 964 891 891 965 878 878 951 891 891 965 879 879 952 879 879 952 891 891 965 892 892 966 879 879 952 892 892 966 880 880 953 880 880 953 892 892 966 893 893 967 880 880 953 893 893 967 881 881 954 881 881 954 893 893 967 894 894 968 881 881 954 894 894 968 882 882 955 882 882 955 894 894 968 895 895 969 882 882 955 895 895 969 883 883 956 883 883 956 895 895 969 896 896 970 883 883 956 896 896 970 884 884 957 884 884 957 896 896 970 897 897 971 884 884 957 897 897 971 885 885 958 885 885 958 897 897 971 898 898 972 885 885 958 898 898 972 886 886 959 886 886 959 898 898 972 899 899 973 886 886 959 899 899 973 887 887 960 887 887 960 899 899 973 888 888 974 887 887 960 888 888 974 876 876 961 888 888 962 900 900 975 901 901 976 888 888 962 901 901 976 889 889 963 889 889 963 901 901 976 902 902 977 889 889 963 902 902 977 890 890 964 890 890 964 902 902 977 903 903 978 890 890 964 903 903 978 891 891 965 891 891 965 903 903 978 904 904 979 891 891 965 904 904 979 892 892 966 892 892 966 904 904 979 905 905 980 892 892 966 905 905 980 893 893 967 893 893 967 905 905 980 906 906 981 893 893 967 906 906 981 894 894 968 894 894 968 906 906 981 907 907 982 894 894 968 907 907 982 895 895 969 895 895 969 907 907 982 908 908 983 895 895 969 908 908 983 896 896 970 896 896 970 908 908 983 909 909 984 896 896 970 909 909 984 897 897 971 897 897 971 909 909 984 910 910 985 897 897 971 910 910 985 898 898 972 898 898 972 910 910 985 911 911 986 898 898 972 911 911 986 899 899 973 899 899 973 911 911 986 900 900 987 899 899 973 900 900 987 888 888 974 900 900 975 912 912 988 913 913 989 900 900 975 913 913 989 901 901 976 901 901 976 913 913 989 914 914 990 901 901 976 914 914 990 902 902 977 902 902 977 914 914 990 915 915 991 902 902 977 915 915 991 903 903 978 903 903 978 915 915 991 916 916 992 903 903 978 916 916 992 904 904 979 904 904 979 916 916 992 917 917 993 904 904 979 917 917 993 905 905 980 905 905 980 917 917 993 918 918 994 905 905 980 918 918 994 906 906 981 906 906 981 918 918 994 919 919 995 906 906 981 919 919 995 907 907 982 907 907 982 919 919 995 920 920 996 907 907 982 920 920 996 908 908 983 908 908 983 920 920 996 921 921 997 908 908 983 921 921 997 909 909 984 909 909 984 921 921 997 922 922 998 909 909 984 922 922 998 910 910 985 910 910 985 922 922 998 923 923 999 910 910 985 923 923 999 911 911 986 911 911 986 923 923 999 912 912 1000 911 911 986 912 912 1000 900 900 987 912 912 988 924 924 1001 925 925 1002 912 912 988 925 925 1002 913 913 989 913 913 989 925 925 1002 926 926 1003 913 913 989 926 926 1003 914 914 990 914 914 990 926 926 1003 927 927 1004 914 914 990 927 927 1004 915 915 991 915 915 991 927 927 1004 928 928 1005 915 915 991 928 928 1005 916 916 992 916 916 992 928 928 1005 929 929 1006 916 916 992 929 929 1006 917 917 993 917 917 993 929 929 1006 930 930 1007 917 917 993 930 930 1007 918 918 994 918 918 994 930 930 1007 931 931 1008 918 918 994 931 931 1008 919 919 995 919 919 995 931 931 1008 932 932 1009 919 919 995 932 932 1009 920 920 996 920 920 996 932 932 1009 933 933 1010 920 920 996 933 933 1010 921 921 997 921 921 997 933 933 1010 934 934 1011 921 921 997 934 934 1011 922 922 998 922 922 998 934 934 1011 935 935 1012 922 922 998 935 935 1012 923 923 999 923 923 999 935 935 1012 924 924 1013 923 923 999 924 924 1013 912 912 1000 924 924 1001 936 936 1014 937 937 1015 924 924 1001 937 937 1015 925 925 1002 925 925 1002 937 937 1015 938 938 1016 925 925 1002 938 938 1016 926 926 1003 926 926 1003 938 938 1016 939 939 1017 926 926 1003 939 939 1017 927 927 1004 927 927 1004 939 939 1017 940 940 1018 927 927 1004 940 940 1018 928 928 1005 928 928 1005 940 940 1018 941 941 1019 928 928 1005 941 941 1019 929 929 1006 929 929 1006 941 941 1019 942 942 1020 929 929 1006 942 942 1020 930 930 1007 930 930 1007 942 942 1020 943 943 1021 930 930 1007 943 943 1021 931 931 1008 931 931 1008 943 943 1021 944 944 1022 931 931 1008 944 944 1022 932 932 1009 932 932 1009 944 944 1022 945 945 1023 932 932 1009 945 945 1023 933 933 1010 933 933 1010 945 945 1023 946 946 1024 933 933 1010 946 946 1024 934 934 1011 934 934 1011 946 946 1024 947 947 1025 934 934 1011 947 947 1025 935 935 1012 935 935 1012 947 947 1025 936 936 1026 935 935 1012 936 936 1026 924 924 1013 936 936 1014 948 948 1027 949 949 1028 936 936 1014 949 949 1028 937 937 1015 937 937 1015 949 949 1028 950 950 1029 937 937 1015 950 950 1029 938 938 1016 938 938 1016 950 950 1029 951 951 1030 938 938 1016 951 951 1030 939 939 1017 939 939 1017 951 951 1030 952 952 1031 939 939 1017 952 952 1031 940 940 1018 940 940 1018 952 952 1031 953 953 1032 940 940 1018 953 953 1032 941 941 1019 941 941 1019 953 953 1032 954 954 1033 941 941 1019 954 954 1033 942 942 1020 942 942 1020 954 954 1033 955 955 1034 942 942 1020 955 955 1034 943 943 1021 943 943 1021 955 955 1034 956 956 1035 943 943 1021 956 956 1035 944 944 1022 944 944 1022 956 956 1035 957 957 1036 944 944 1022 957 957 1036 945 945 1023 945 945 1023 957 957 1036 958 958 1037 945 945 1023 958 958 1037 946 946 1024 946 946 1024 958 958 1037 959 959 1038 946 946 1024 959 959 1038 947 947 1025 947 947 1025 959 959 1038 948 948 1039 947 947 1025 948 948 1039 936 936 1026 948 948 1027 960 960 1040 961 961 1041 948 948 1027 961 961 1041 949 949 1028 949 949 1028 961 961 1041 962 962 1042 949 949 1028 962 962 1042 950 950 1029 950 950 1029 962 962 1042 963 963 1043 950 950 1029 963 963 1043 951 951 1030 951 951 1030 963 963 1043 964 964 1044 951 951 1030 964 964 1044 952 952 1031 952 952 1031 964 964 1044 965 965 1045 952 952 1031 965 965 1045 953 953 1032 953 953 1032 965 965 1045 966 966 1046 953 953 1032 966 966 1046 954 954 1033 954 954 1033 966 966 1046 967 967 1047 954 954 1033 967 967 1047 955 955 1034 955 955 1034 967 967 1047 968 968 1048 955 955 1034 968 968 1048 956 956 1035 956 956 1035 968 968 1048 969 969 1049 956 956 1035 969 969 1049 957 957 1036 957 957 1036 969 969 1049 970 970 1050 957 957 1036 970 970 1050 958 958 1037 958 958 1037 970 970 1050 971 971 1051 958 958 1037 971 971 1051 959 959 1038 959 959 1038 971 971 1051 960 960 1052 959 959 1038 960 960 1052 948 948 1039 960 960 1040 972 972 1053 973 973 1054 960 960 1040 973 973 1054 961 961 1041 961 961 1041 973 973 1054 974 974 1055 961 961 1041 974 974 1055 962 962 1042 962 962 1042 974 974 1055 975 975 1056 962 962 1042 975 975 1056 963 963 1043 963 963 1043 975 975 1056 976 976 1057 963 963 1043 976 976 1057 964 964 1044 964 964 1044 976 976 1057 977 977 1058 964 964 1044 977 977 1058 965 965 1045 965 965 1045 977 977 1058 978 978 1059 965 965 1045 978 978 1059 966 966 1046 966 966 1046 978 978 1059 979 979 1060 966 966 1046 979 979 1060 967 967 1047 967 967 1047 979 979 1060 980 980 1061 967 967 1047 980 980 1061 968 968 1048 968 968 1048 980 980 1061 981 981 1062 968 968 1048 981 981 1062 969 969 1049 969 969 1049 981 981 1062 982 982 1063 969 969 1049 982 982 1063 970 970 1050 970 970 1050 982 982 1063 983 983 1064 970 970 1050 983 983 1064 971 971 1051 971 971 1051 983 983 1064 972 972 1065 971 971 1051 972 972 1065 960 960 1052 972 972 1053 984 984 1066 985 985 1067 972 972 1053 985 985 1067 973 973 1054 973 973 1054 985 985 1067 986 986 1068 973 973 1054 986 986 1068 974 974 1055 974 974 1055 986 986 1068 987 987 1069 974 974 1055 987 987 1069 975 975 1056 975 975 1056 987 987 1069 988 988 1070 975 975 1056 988 988 1070 976 976 1057 976 976 1057 988 988 1070 989 989 1071 976 976 1057 989 989 1071 977 977 1058 977 977 1058 989 989 1071 990 990 1072 977 977 1058 990 990 1072 978 978 1059 978 978 1059 990 990 1072 991 991 1073 978 978 1059 991 991 1073 979 979 1060 979 979 1060 991 991 1073 992 992 1074 979 979 1060 992 992 1074 980 980 1061 980 980 1061 992 992 1074 993 993 1075 980 980 1061 993 993 1075 981 981 1062 981 981 1062 993 993 1075 994 994 1076 981 981 1062 994 994 1076 982 982 1063 982 982 1063 994 994 1076 995 995 1077 982 982 1063 995 995 1077 983 983 1064 983 983 1064 995 995 1077 984 984 1078 983 983 1064 984 984 1078 972 972 1065 984 984 1066 996 996 1079 997 997 1080 984 984 1066 997 997 1080 985 985 1067 985 985 1067 997 997 1080 998 998 1081 985 985 1067 998 998 1081 986 986 1068 986 986 1068 998 998 1081 999 999 1082 986 986 1068 999 999 1082 987 987 1069 987 987 1069 999 999 1082 1000 1000 1083 987 987 1069 1000 1000 1083 988 988 1070 988 988 1070 1000 1000 1083 1001 1001 1084 988 988 1070 1001 1001 1084 989 989 1071 989 989 1071 1001 1001 1084 1002 1002 1085 989 989 1071 1002 1002 1085 990 990 1072 990 990 1072 1002 1002 1085 1003 1003 1086 990 990 1072 1003 1003 1086 991 991 1073 991 991 1073 1003 1003 1086 1004 1004 1087 991 991 1073 1004 1004 1087 992 992 1074 992 992 1074 1004 1004 1087 1005 1005 1088 992 992 1074 1005 1005 1088 993 993 1075 993 993 1075 1005 1005 1088 1006 1006 1089 993 993 1075 1006 1006 1089 994 994 1076 994 994 1076 1006 1006 1089 1007 1007 1090 994 994 1076 1007 1007 1090 995 995 1077 995 995 1077 1007 1007 1090 996 996 1091 995 995 1077 996 996 1091 984 984 1078 996 996 1079 1008 1008 1092 1009 1009 1093 996 996 1079 1009 1009 1093 997 997 1080 997 997 1080 1009 1009 1093 1010 1010 1094 997 997 1080 1010 1010 1094 998 998 1081 998 998 1081 1010 1010 1094 1011 1011 1095 998 998 1081 1011 1011 1095 999 999 1082 999 999 1082 1011 1011 1095 1012 1012 1096 999 999 1082 1012 1012 1096 1000 1000 1083 1000 1000 1083 1012 1012 1096 1013 1013 1097 1000 1000 1083 1013 1013 1097 1001 1001 1084 1001 1001 1084 1013 1013 1097 1014 1014 1098 1001 1001 1084 1014 1014 1098 1002 1002 1085 1002 1002 1085 1014 1014 1098 1015 1015 1099 1002 1002 1085 1015 1015 1099 1003 1003 1086 1003 1003 1086 1015 1015 1099 1016 1016 1100 1003 1003 1086 1016 1016 1100 1004 1004 1087 1004 1004 1087 1016 1016 1100 1017 1017 1101 1004 1004 1087 1017 1017 1101 1005 1005 1088 1005 1005 1088 1017 1017 1101 1018 1018 1102 1005 1005 1088 1018 1018 1102 1006 1006 1089 1006 1006 1089 1018 1018 1102 1019 1019 1103 1006 1006 1089 1019 1019 1103 1007 1007 1090 1007 1007 1090 1019 1019 1103 1008 1008 1104 1007 1007 1090 1008 1008 1104 996 996 1091 1008 1008 1092 1020 1020 1105 1021 1021 1106 1008 1008 1092 1021 1021 1106 1009 1009 1093 1009 1009 1093 1021 1021 1106 1022 1022 1107 1009 1009 1093 1022 1022 1107 1010 1010 1094 1010 1010 1094 1022 1022 1107 1023 1023 1108 1010 1010 1094 1023 1023 1108 1011 1011 1095 1011 1011 1095 1023 1023 1108 1024 1024 1109 1011 1011 1095 1024 1024 1109 1012 1012 1096 1012 1012 1096 1024 1024 1109 1025 1025 1110 1012 1012 1096 1025 1025 1110 1013 1013 1097 1013 1013 1097 1025 1025 1110 1026 1026 1111 1013 1013 1097 1026 1026 1111 1014 1014 1098 1014 1014 1098 1026 1026 1111 1027 1027 1112 1014 1014 1098 1027 1027 1112 1015 1015 1099 1015 1015 1099 1027 1027 1112 1028 1028 1113 1015 1015 1099 1028 1028 1113 1016 1016 1100 1016 1016 1100 1028 1028 1113 1029 1029 1114 1016 1016 1100 1029 1029 1114 1017 1017 1101 1017 1017 1101 1029 1029 1114 1030 1030 1115 1017 1017 1101 1030 1030 1115 1018 1018 1102 1018 1018 1102 1030 1030 1115 1031 1031 1116 1018 1018 1102 1031 1031 1116 1019 1019 1103 1019 1019 1103 1031 1031 1116 1020 1020 1117 1019 1019 1103 1020 1020 1117 1008 1008 1104 1020 1020 1105 1032 1032 1118 1033 1033 1119 1020 1020 1105 1033 1033 1119 1021 1021 1106 1021 1021 1106 1033 1033 1119 1034 1034 1120 1021 1021 1106 1034 1034 1120 1022 1022 1107 1022 1022 1107 1034 1034 1120 1035 1035 1121 1022 1022 1107 1035 1035 1121 1023 1023 1108 1023 1023 1108 1035 1035 1121 1036 1036 1122 1023 1023 1108 1036 1036 1122 1024 1024 1109 1024 1024 1109 1036 1036 1122 1037 1037 1123 1024 1024 1109 1037 1037 1123 1025 1025 1110 1025 1025 1110 1037 1037 1123 1038 1038 1124 1025 1025 1110 1038 1038 1124 1026 1026 1111 1026 1026 1111 1038 1038 1124 1039 1039 1125 1026 1026 1111 1039 1039 1125 1027 1027 1112 1027 1027 1112 1039 1039 1125 1040 1040 1126 1027 1027 1112 1040 1040 1126 1028 1028 1113 1028 1028 1113 1040 1040 1126 1041 1041 1127 1028 1028 1113 1041 1041 1127 1029 1029 1114 1029 1029 1114 1041 1041 1127 1042 1042 1128 1029 1029 1114 1042 1042 1128 1030 1030 1115 1030 1030 1115 1042 1042 1128 1043 1043 1129 1030 1030 1115 1043 1043 1129 1031 1031 1116 1031 1031 1116 1043 1043 1129 1032 1032 1130 1031 1031 1116 1032 1032 1130 1020 1020 1117 1032 1032 1118 1044 1044 1131 1045 1045 1132 1032 1032 1118 1045 1045 1132 1033 1033 1119 1033 1033 1119 1045 1045 1132 1046 1046 1133 1033 1033 1119 1046 1046 1133 1034 1034 1120 1034 1034 1120 1046 1046 1133 1047 1047 1134 1034 1034 1120 1047 1047 1134 1035 1035 1121 1035 1035 1121 1047 1047 1134 1048 1048 1135 1035 1035 1121 1048 1048 1135 1036 1036 1122 1036 1036 1122 1048 1048 1135 1049 1049 1136 1036 1036 1122 1049 1049 1136 1037 1037 1123 1037 1037 1123 1049 1049 1136 1050 1050 1137 1037 1037 1123 1050 1050 1137 1038 1038 1124 1038 1038 1124 1050 1050 1137 1051 1051 1138 1038 1038 1124 1051 1051 1138 1039 1039 1125 1039 1039 1125 1051 1051 1138 1052 1052 1139 1039 1039 1125 1052 1052 1139 1040 1040 1126 1040 1040 1126 1052 1052 1139 1053 1053 1140 1040 1040 1126 1053 1053 1140 1041 1041 1127 1041 1041 1127 1053 1053 1140 1054 1054 1141 1041 1041 1127 1054 1054 1141 1042 1042 1128 1042 1042 1128 1054 1054 1141 1055 1055 1142 1042 1042 1128 1055 1055 1142 1043 1043 1129 1043 1043 1129 1055 1055 1142 1044 1044 1143 1043 1043 1129 1044 1044 1143 1032 1032 1130 1044 1044 1131 1056 1056 1144 1057 1057 1145 1044 1044 1131 1057 1057 1145 1045 1045 1132 1045 1045 1132 1057 1057 1145 1058 1058 1146 1045 1045 1132 1058 1058 1146 1046 1046 1133 1046 1046 1133 1058 1058 1146 1059 1059 1147 1046 1046 1133 1059 1059 1147 1047 1047 1134 1047 1047 1134 1059 1059 1147 1060 1060 1148 1047 1047 1134 1060 1060 1148 1048 1048 1135 1048 1048 1135 1060 1060 1148 1061 1061 1149 1048 1048 1135 1061 1061 1149 1049 1049 1136 1049 1049 1136 1061 1061 1149 1062 1062 1150 1049 1049 1136 1062 1062 1150 1050 1050 1137 1050 1050 1137 1062 1062 1150 1063 1063 1151 1050 1050 1137 1063 1063 1151 1051 1051 1138 1051 1051 1138 1063 1063 1151 1064 1064 1152 1051 1051 1138 1064 1064 1152 1052 1052 1139 1052 1052 1139 1064 1064 1152 1065 1065 1153 1052 1052 1139 1065 1065 1153 1053 1053 1140 1053 1053 1140 1065 1065 1153 1066 1066 1154 1053 1053 1140 1066 1066 1154 1054 1054 1141 1054 1054 1141 1066 1066 1154 1067 1067 1155 1054 1054 1141 1067 1067 1155 1055 1055 1142 1055 1055 1142 1067 1067 1155 1056 1056 1156 1055 1055 1142 1056 1056 1156 1044 1044 1143 1056 1056 1144 1068 1068 1157 1069 1069 1158 1056 1056 1144 1069 1069 1158 1057 1057 1145 1057 1057 1145 1069 1069 1158 1070 1070 1159 1057 1057 1145 1070 1070 1159 1058 1058 1146 1058 1058 1146 1070 1070 1159 1071 1071 1160 1058 1058 1146 1071 1071 1160 1059 1059 1147 1059 1059 1147 1071 1071 1160 1072 1072 1161 1059 1059 1147 1072 1072 1161 1060 1060 1148 1060 1060 1148 1072 1072 1161 1073 1073 1162 1060 1060 1148 1073 1073 1162 1061 1061 1149 1061 1061 1149 1073 1073 1162 1074 1074 1163 1061 1061 1149 1074 1074 1163 1062 1062 1150 1062 1062 1150 1074 1074 1163 1075 1075 1164 1062 1062 1150 1075 1075 1164 1063 1063 1151 1063 1063 1151 1075 1075 1164 1076 1076 1165 1063 1063 1151 1076 1076 1165 1064 1064 1152 1064 1064 1152 1076 1076 1165 1077 1077 1166 1064 1064 1152 1077 1077 1166 1065 1065 1153 1065 1065 1153 1077 1077 1166 1078 1078 1167 1065 1065 1153 1078 1078 1167 1066 1066 1154 1066 1066 1154 1078 1078 1167 1079 1079 1168 1066 1066 1154 1079 1079 1168 1067 1067 1155 1067 1067 1155 1079 1079 1168 1068 1068 1169 1067 1067 1155 1068 1068 1169 1056 1056 1156 1068 1068 1157 1080 1080 1170 1081 1081 1171 1068 1068 1157 1081 1081 1171 1069 1069 1158 1069 1069 1158 1081 1081 1171 1082 1082 1172 1069 1069 1158 1082 1082 1172 1070 1070 1159 1070 1070 1159 1082 1082 1172 1083 1083 1173 1070 1070 1159 1083 1083 1173 1071 1071 1160 1071 1071 1160 1083 1083 1173 1084 1084 1174 1071 1071 1160 1084 1084 1174 1072 1072 1161 1072 1072 1161 1084 1084 1174 1085 1085 1175 1072 1072 1161 1085 1085 1175 1073 1073 1162 1073 1073 1162 1085 1085 1175 1086 1086 1176 1073 1073 1162 1086 1086 1176 1074 1074 1163 1074 1074 1163 1086 1086 1176 1087 1087 1177 1074 1074 1163 1087 1087 1177 1075 1075 1164 1075 1075 1164 1087 1087 1177 1088 1088 1178 1075 1075 1164 1088 1088 1178 1076 1076 1165 1076 1076 1165 1088 1088 1178 1089 1089 1179 1076 1076 1165 1089 1089 1179 1077 1077 1166 1077 1077 1166 1089 1089 1179 1090 1090 1180 1077 1077 1166 1090 1090 1180 1078 1078 1167 1078 1078 1167 1090 1090 1180 1091 1091 1181 1078 1078 1167 1091 1091 1181 1079 1079 1168 1079 1079 1168 1091 1091 1181 1080 1080 1182 1079 1079 1168 1080 1080 1182 1068 1068 1169 1080 1080 1170 1092 1092 1183 1093 1093 1184 1080 1080 1170 1093 1093 1184 1081 1081 1171 1081 1081 1171 1093 1093 1184 1094 1094 1185 1081 1081 1171 1094 1094 1185 1082 1082 1172 1082 1082 1172 1094 1094 1185 1095 1095 1186 1082 1082 1172 1095 1095 1186 1083 1083 1173 1083 1083 1173 1095 1095 1186 1096 1096 1187 1083 1083 1173 1096 1096 1187 1084 1084 1174 1084 1084 1174 1096 1096 1187 1097 1097 1188 1084 1084 1174 1097 1097 1188 1085 1085 1175 1085 1085 1175 1097 1097 1188 1098 1098 1189 1085 1085 1175 1098 1098 1189 1086 1086 1176 1086 1086 1176 1098 1098 1189 1099 1099 1190 1086 1086 1176 1099 1099 1190 1087 1087 1177 1087 1087 1177 1099 1099 1190 1100 1100 1191 1087 1087 1177 1100 1100 1191 1088 1088 1178 1088 1088 1178 1100 1100 1191 1101 1101 1192 1088 1088 1178 1101 1101 1192 1089 1089 1179 1089 1089 1179 1101 1101 1192 1102 1102 1193 1089 1089 1179 1102 1102 1193 1090 1090 1180 1090 1090 1180 1102 1102 1193 1103 1103 1194 1090 1090 1180 1103 1103 1194 1091 1091 1181 1091 1091 1181 1103 1103 1194 1092 1092 1195 1091 1091 1181 1092 1092 1195 1080 1080 1182 1092 1092 1183 1104 1104 1196 1105 1105 1197 1092 1092 1183 1105 1105 1197 1093 1093 1184 1093 1093 1184 1105 1105 1197 1106 1106 1198 1093 1093 1184 1106 1106 1198 1094 1094 1185 1094 1094 1185 1106 1106 1198 1107 1107 1199 1094 1094 1185 1107 1107 1199 1095 1095 1186 1095 1095 1186 1107 1107 1199 1108 1108 1200 1095 1095 1186 1108 1108 1200 1096 1096 1187 1096 1096 1187 1108 1108 1200 1109 1109 1201 1096 1096 1187 1109 1109 1201 1097 1097 1188 1097 1097 1188 1109 1109 1201 1110 1110 1202 1097 1097 1188 1110 1110 1202 1098 1098 1189 1098 1098 1189 1110 1110 1202 1111 1111 1203 1098 1098 1189 1111 1111 1203 1099 1099 1190 1099 1099 1190 1111 1111 1203 1112 1112 1204 1099 1099 1190 1112 1112 1204 1100 1100 1191 1100 1100 1191 1112 1112 1204 1113 1113 1205 1100 1100 1191 1113 1113 1205 1101 1101 1192 1101 1101 1192 1113 1113 1205 1114 1114 1206 1101 1101 1192 1114 1114 1206 1102 1102 1193 1102 1102 1193 1114 1114 1206 1115 1115 1207 1102 1102 1193 1115 1115 1207 1103 1103 1194 1103 1103 1194 1115 1115 1207 1104 1104 1208 1103 1103 1194 1104 1104 1208 1092 1092 1195 1104 1104 1196 1116 1116 1209 1117 1117 1210 1104 1104 1196 1117 1117 1210 1105 1105 1197 1105 1105 1197 1117 1117 1210 1118 1118 1211 1105 1105 1197 1118 1118 1211 1106 1106 1198 1106 1106 1198 1118 1118 1211 1119 1119 1212 1106 1106 1198 1119 1119 1212 1107 1107 1199 1107 1107 1199 1119 1119 1212 1120 1120 1213 1107 1107 1199 1120 1120 1213 1108 1108 1200 1108 1108 1200 1120 1120 1213 1121 1121 1214 1108 1108 1200 1121 1121 1214 1109 1109 1201 1109 1109 1201 1121 1121 1214 1122 1122 1215 1109 1109 1201 1122 1122 1215 1110 1110 1202 1110 1110 1202 1122 1122 1215 1123 1123 1216 1110 1110 1202 1123 1123 1216 1111 1111 1203 1111 1111 1203 1123 1123 1216 1124 1124 1217 1111 1111 1203 1124 1124 1217 1112 1112 1204 1112 1112 1204 1124 1124 1217 1125 1125 1218 1112 1112 1204 1125 1125 1218 1113 1113 1205 1113 1113 1205 1125 1125 1218 1126 1126 1219 1113 1113 1205 1126 1126 1219 1114 1114 1206 1114 1114 1206 1126 1126 1219 1127 1127 1220 1114 1114 1206 1127 1127 1220 1115 1115 1207 1115 1115 1207 1127 1127 1220 1116 1116 1221 1115 1115 1207 1116 1116 1221 1104 1104 1208 1116 1116 1209 1128 1128 1222 1129 1129 1223 1116 1116 1209 1129 1129 1223 1117 1117 1210 1117 1117 1210 1129 1129 1223 1130 1130 1224 1117 1117 1210 1130 1130 1224 1118 1118 1211 1118 1118 1211 1130 1130 1224 1131 1131 1225 1118 1118 1211 1131 1131 1225 1119 1119 1212 1119 1119 1212 1131 1131 1225 1132 1132 1226 1119 1119 1212 1132 1132 1226 1120 1120 1213 1120 1120 1213 1132 1132 1226 1133 1133 1227 1120 1120 1213 1133 1133 1227 1121 1121 1214 1121 1121 1214 1133 1133 1227 1134 1134 1228 1121 1121 1214 1134 1134 1228 1122 1122 1215 1122 1122 1215 1134 1134 1228 1135 1135 1229 1122 1122 1215 1135 1135 1229 1123 1123 1216 1123 1123 1216 1135 1135 1229 1136 1136 1230 1123 1123 1216 1136 1136 1230 1124 1124 1217 1124 1124 1217 1136 1136 1230 1137 1137 1231 1124 1124 1217 1137 1137 1231 1125 1125 1218 1125 1125 1218 1137 1137 1231 1138 1138 1232 1125 1125 1218 1138 1138 1232 1126 1126 1219 1126 1126 1219 1138 1138 1232 1139 1139 1233 1126 1126 1219 1139 1139 1233 1127 1127 1220 1127 1127 1220 1139 1139 1233 1128 1128 1234 1127 1127 1220 1128 1128 1234 1116 1116 1221 1128 1128 1222 1140 1140 1235 1141 1141 1236 1128 1128 1222 1141 1141 1236 1129 1129 1223 1129 1129 1223 1141 1141 1236 1142 1142 1237 1129 1129 1223 1142 1142 1237 1130 1130 1224 1130 1130 1224 1142 1142 1237 1143 1143 1238 1130 1130 1224 1143 1143 1238 1131 1131 1225 1131 1131 1225 1143 1143 1238 1144 1144 1239 1131 1131 1225 1144 1144 1239 1132 1132 1226 1132 1132 1226 1144 1144 1239 1145 1145 1240 1132 1132 1226 1145 1145 1240 1133 1133 1227 1133 1133 1227 1145 1145 1240 1146 1146 1241 1133 1133 1227 1146 1146 1241 1134 1134 1228 1134 1134 1228 1146 1146 1241 1147 1147 1242 1134 1134 1228 1147 1147 1242 1135 1135 1229 1135 1135 1229 1147 1147 1242 1148 1148 1243 1135 1135 1229 1148 1148 1243 1136 1136 1230 1136 1136 1230 1148 1148 1243 1149 1149 1244 1136 1136 1230 1149 1149 1244 1137 1137 1231 1137 1137 1231 1149 1149 1244 1150 1150 1245 1137 1137 1231 1150 1150 1245 1138 1138 1232 1138 1138 1232 1150 1150 1245 1151 1151 1246 1138 1138 1232 1151 1151 1246 1139 1139 1233 1139 1139 1233 1151 1151 1246 1140 1140 1247 1139 1139 1233 1140 1140 1247 1128 1128 1234 1140 1140 1235 1152 1152 1248 1153 1153 1249 1140 1140 1235 1153 1153 1249 1141 1141 1236 1141 1141 1236 1153 1153 1249 1154 1154 1250 1141 1141 1236 1154 1154 1250 1142 1142 1237 1142 1142 1237 1154 1154 1250 1155 1155 1251 1142 1142 1237 1155 1155 1251 1143 1143 1238 1143 1143 1238 1155 1155 1251 1156 1156 1252 1143 1143 1238 1156 1156 1252 1144 1144 1239 1144 1144 1239 1156 1156 1252 1157 1157 1253 1144 1144 1239 1157 1157 1253 1145 1145 1240 1145 1145 1240 1157 1157 1253 1158 1158 1254 1145 1145 1240 1158 1158 1254 1146 1146 1241 1146 1146 1241 1158 1158 1254 1159 1159 1255 1146 1146 1241 1159 1159 1255 1147 1147 1242 1147 1147 1242 1159 1159 1255 1160 1160 1256 1147 1147 1242 1160 1160 1256 1148 1148 1243 1148 1148 1243 1160 1160 1256 1161 1161 1257 1148 1148 1243 1161 1161 1257 1149 1149 1244 1149 1149 1244 1161 1161 1257 1162 1162 1258 1149 1149 1244 1162 1162 1258 1150 1150 1245 1150 1150 1245 1162 1162 1258 1163 1163 1259 1150 1150 1245 1163 1163 1259 1151 1151 1246 1151 1151 1246 1163 1163 1259 1152 1152 1260 1151 1151 1246 1152 1152 1260 1140 1140 1247 1152 1152 1248 1164 1164 1261 1165 1165 1262 1152 1152 1248 1165 1165 1262 1153 1153 1249 1153 1153 1249 1165 1165 1262 1166 1166 1263 1153 1153 1249 1166 1166 1263 1154 1154 1250 1154 1154 1250 1166 1166 1263 1167 1167 1264 1154 1154 1250 1167 1167 1264 1155 1155 1251 1155 1155 1251 1167 1167 1264 1168 1168 1265 1155 1155 1251 1168 1168 1265 1156 1156 1252 1156 1156 1252 1168 1168 1265 1169 1169 1266 1156 1156 1252 1169 1169 1266 1157 1157 1253 1157 1157 1253 1169 1169 1266 1170 1170 1267 1157 1157 1253 1170 1170 1267 1158 1158 1254 1158 1158 1254 1170 1170 1267 1171 1171 1268 1158 1158 1254 1171 1171 1268 1159 1159 1255 1159 1159 1255 1171 1171 1268 1172 1172 1269 1159 1159 1255 1172 1172 1269 1160 1160 1256 1160 1160 1256 1172 1172 1269 1173 1173 1270 1160 1160 1256 1173 1173 1270 1161 1161 1257 1161 1161 1257 1173 1173 1270 1174 1174 1271 1161 1161 1257 1174 1174 1271 1162 1162 1258 1162 1162 1258 1174 1174 1271 1175 1175 1272 1162 1162 1258 1175 1175 1272 1163 1163 1259 1163 1163 1259 1175 1175 1272 1164 1164 1273 1163 1163 1259 1164 1164 1273 1152 1152 1260 1164 1164 1261 1176 1176 1274 1177 1177 1275 1164 1164 1261 1177 1177 1275 1165 1165 1262 1165 1165 1262 1177 1177 1275 1178 1178 1276 1165 1165 1262 1178 1178 1276 1166 1166 1263 1166 1166 1263 1178 1178 1276 1179 1179 1277 1166 1166 1263 1179 1179 1277 1167 1167 1264 1167 1167 1264 1179 1179 1277 1180 1180 1278 1167 1167 1264 1180 1180 1278 1168 1168 1265 1168 1168 1265 1180 1180 1278 1181 1181 1279 1168 1168 1265 1181 1181 1279 1169 1169 1266 1169 1169 1266 1181 1181 1279 1182 1182 1280 1169 1169 1266 1182 1182 1280 1170 1170 1267 1170 1170 1267 1182 1182 1280 1183 1183 1281 1170 1170 1267 1183 1183 1281 1171 1171 1268 1171 1171 1268 1183 1183 1281 1184 1184 1282 1171 1171 1268 1184 1184 1282 1172 1172 1269 1172 1172 1269 1184 1184 1282 1185 1185 1283 1172 1172 1269 1185 1185 1283 1173 1173 1270 1173 1173 1270 1185 1185 1283 1186 1186 1284 1173 1173 1270 1186 1186 1284 1174 1174 1271 1174 1174 1271 1186 1186 1284 1187 1187 1285 1174 1174 1271 1187 1187 1285 1175 1175 1272 1175 1175 1272 1187 1187 1285 1176 1176 1286 1175 1175 1272 1176 1176 1286 1164 1164 1273 1176 1176 1274 1188 1188 1287 1189 1189 1288 1176 1176 1274 1189 1189 1288 1177 1177 1275 1177 1177 1275 1189 1189 1288 1190 1190 1289 1177 1177 1275 1190 1190 1289 1178 1178 1276 1178 1178 1276 1190 1190 1289 1191 1191 1290 1178 1178 1276 1191 1191 1290 1179 1179 1277 1179 1179 1277 1191 1191 1290 1192 1192 1291 1179 1179 1277 1192 1192 1291 1180 1180 1278 1180 1180 1278 1192 1192 1291 1193 1193 1292 1180 1180 1278 1193 1193 1292 1181 1181 1279 1181 1181 1279 1193 1193 1292 1194 1194 1293 1181 1181 1279 1194 1194 1293 1182 1182 1280 1182 1182 1280 1194 1194 1293 1195 1195 1294 1182 1182 1280 1195 1195 1294 1183 1183 1281 1183 1183 1281 1195 1195 1294 1196 1196 1295 1183 1183 1281 1196 1196 1295 1184 1184 1282 1184 1184 1282 1196 1196 1295 1197 1197 1296 1184 1184 1282 1197 1197 1296 1185 1185 1283 1185 1185 1283 1197 1197 1296 1198 1198 1297 1185 1185 1283 1198 1198 1297 1186 1186 1284 1186 1186 1284 1198 1198 1297 1199 1199 1298 1186 1186 1284 1199 1199 1298 1187 1187 1285 1187 1187 1285 1199 1199 1298 1188 1188 1299 1187 1187 1285 1188 1188 1299 1176 1176 1286 1188 1188 1287 1200 1200 1300 1201 1201 1301 1188 1188 1287 1201 1201 1301 1189 1189 1288 1189 1189 1288 1201 1201 1301 1202 1202 1302 1189 1189 1288 1202 1202 1302 1190 1190 1289 1190 1190 1289 1202 1202 1302 1203 1203 1303 1190 1190 1289 1203 1203 1303 1191 1191 1290 1191 1191 1290 1203 1203 1303 1204 1204 1304 1191 1191 1290 1204 1204 1304 1192 1192 1291 1192 1192 1291 1204 1204 1304 1205 1205 1305 1192 1192 1291 1205 1205 1305 1193 1193 1292 1193 1193 1292 1205 1205 1305 1206 1206 1306 1193 1193 1292 1206 1206 1306 1194 1194 1293 1194 1194 1293 1206 1206 1306 1207 1207 1307 1194 1194 1293 1207 1207 1307 1195 1195 1294 1195 1195 1294 1207 1207 1307 1208 1208 1308 1195 1195 1294 1208 1208 1308 1196 1196 1295 1196 1196 1295 1208 1208 1308 1209 1209 1309 1196 1196 1295 1209 1209 1309 1197 1197 1296 1197 1197 1296 1209 1209 1309 1210 1210 1310 1197 1197 1296 1210 1210 1310 1198 1198 1297 1198 1198 1297 1210 1210 1310 1211 1211 1311 1198 1198 1297 1211 1211 1311 1199 1199 1298 1199 1199 1298 1211 1211 1311 1200 1200 1312 1199 1199 1298 1200 1200 1312 1188 1188 1299 1200 1200 1300 1212 1212 1313 1213 1213 1314 1200 1200 1300 1213 1213 1314 1201 1201 1301 1201 1201 1301 1213 1213 1314 1214 1214 1315 1201 1201 1301 1214 1214 1315 1202 1202 1302 1202 1202 1302 1214 1214 1315 1215 1215 1316 1202 1202 1302 1215 1215 1316 1203 1203 1303 1203 1203 1303 1215 1215 1316 1216 1216 1317 1203 1203 1303 1216 1216 1317 1204 1204 1304 1204 1204 1304 1216 1216 1317 1217 1217 1318 1204 1204 1304 1217 1217 1318 1205 1205 1305 1205 1205 1305 1217 1217 1318 1218 1218 1319 1205 1205 1305 1218 1218 1319 1206 1206 1306 1206 1206 1306 1218 1218 1319 1219 1219 1320 1206 1206 1306 1219 1219 1320 1207 1207 1307 1207 1207 1307 1219 1219 1320 1220 1220 1321 1207 1207 1307 1220 1220 1321 1208 1208 1308 1208 1208 1308 1220 1220 1321 1221 1221 1322 1208 1208 1308 1221 1221 1322 1209 1209 1309 1209 1209 1309 1221 1221 1322 1222 1222 1323 1209 1209 1309 1222 1222 1323 1210 1210 1310 1210 1210 1310 1222 1222 1323 1223 1223 1324 1210 1210 1310 1223 1223 1324 1211 1211 1311 1211 1211 1311 1223 1223 1324 1212 1212 1325 1211 1211 1311 1212 1212 1325 1200 1200 1312 1212 1212 1313 1224 1224 1326 1225 1225 1327 1212 1212 1313 1225 1225 1327 1213 1213 1314 1213 1213 1314 1225 1225 1327 1226 1226 1328 1213 1213 1314 1226 1226 1328 1214 1214 1315 1214 1214 1315 1226 1226 1328 1227 1227 1329 1214 1214 1315 1227 1227 1329 1215 1215 1316 1215 1215 1316 1227 1227 1329 1228 1228 1330 1215 1215 1316 1228 1228 1330 1216 1216 1317 1216 1216 1317 1228 1228 1330 1229 1229 1331 1216 1216 1317 1229 1229 1331 1217 1217 1318 1217 1217 1318 1229 1229 1331 1230 1230 1332 1217 1217 1318 1230 1230 1332 1218 1218 1319 1218 1218 1319 1230 1230 1332 1231 1231 1333 1218 1218 1319 1231 1231 1333 1219 1219 1320 1219 1219 1320 1231 1231 1333 1232 1232 1334 1219 1219 1320 1232 1232 1334 1220 1220 1321 1220 1220 1321 1232 1232 1334 1233 1233 1335 1220 1220 1321 1233 1233 1335 1221 1221 1322 1221 1221 1322 1233 1233 1335 1234 1234 1336 1221 1221 1322 1234 1234 1336 1222 1222 1323 1222 1222 1323 1234 1234 1336 1235 1235 1337 1222 1222 1323 1235 1235 1337 1223 1223 1324 1223 1223 1324 1235 1235 1337 1224 1224 1338 1223 1223 1324 1224 1224 1338 1212 1212 1325 1224 1224 1326 1236 1236 1339 1237 1237 1340 1224 1224 1326 1237 1237 1340 1225 1225 1327 1225 1225 1327 1237 1237 1340 1238 1238 1341 1225 1225 1327 1238 1238 1341 1226 1226 1328 1226 1226 1328 1238 1238 1341 1239 1239 1342 1226 1226 1328 1239 1239 1342 1227 1227 1329 1227 1227 1329 1239 1239 1342 1240 1240 1343 1227 1227 1329 1240 1240 1343 1228 1228 1330 1228 1228 1330 1240 1240 1343 1241 1241 1344 1228 1228 1330 1241 1241 1344 1229 1229 1331 1229 1229 1331 1241 1241 1344 1242 1242 1345 1229 1229 1331 1242 1242 1345 1230 1230 1332 1230 1230 1332 1242 1242 1345 1243 1243 1346 1230 1230 1332 1243 1243 1346 1231 1231 1333 1231 1231 1333 1243 1243 1346 1244 1244 1347 1231 1231 1333 1244 1244 1347 1232 1232 1334 1232 1232 1334 1244 1244 1347 1245 1245 1348 1232 1232 1334 1245 1245 1348 1233 1233 1335 1233 1233 1335 1245 1245 1348 1246 1246 1349 1233 1233 1335 1246 1246 1349 1234 1234 1336 1234 1234 1336 1246 1246 1349 1247 1247 1350 1234 1234 1336 1247 1247 1350 1235 1235 1337 1235 1235 1337 1247 1247 1350 1236 1236 1351 1235 1235 1337 1236 1236 1351 1224 1224 1338 1236 1236 1339 1248 1248 1352 1249 1249 1353 1236 1236 1339 1249 1249 1353 1237 1237 1340 1237 1237 1340 1249 1249 1353 1250 1250 1354 1237 1237 1340 1250 1250 1354 1238 1238 1341 1238 1238 1341 1250 1250 1354 1251 1251 1355 1238 1238 1341 1251 1251 1355 1239 1239 1342 1239 1239 1342 1251 1251 1355 1252 1252 1356 1239 1239 1342 1252 1252 1356 1240 1240 1343 1240 1240 1343 1252 1252 1356 1253 1253 1357 1240 1240 1343 1253 1253 1357 1241 1241 1344 1241 1241 1344 1253 1253 1357 1254 1254 1358 1241 1241 1344 1254 1254 1358 1242 1242 1345 1242 1242 1345 1254 1254 1358 1255 1255 1359 1242 1242 1345 1255 1255 1359 1243 1243 1346 1243 1243 1346 1255 1255 1359 1256 1256 1360 1243 1243 1346 1256 1256 1360 1244 1244 1347 1244 1244 1347 1256 1256 1360 1257 1257 1361 1244 1244 1347 1257 1257 1361 1245 1245 1348 1245 1245 1348 1257 1257 1361 1258 1258 1362 1245 1245 1348 1258 1258 1362 1246 1246 1349 1246 1246 1349 1258 1258 1362 1259 1259 1363 1246 1246 1349 1259 1259 1363 1247 1247 1350 1247 1247 1350 1259 1259 1363 1248 1248 1364 1247 1247 1350 1248 1248 1364 1236 1236 1351 1248 1248 1352 1260 1260 1365 1261 1261 1366 1248 1248 1352 1261 1261 1366 1249 1249 1353 1249 1249 1353 1261 1261 1366 1262 1262 1367 1249 1249 1353 1262 1262 1367 1250 1250 1354 1250 1250 1354 1262 1262 1367 1263 1263 1368 1250 1250 1354 1263 1263 1368 1251 1251 1355 1251 1251 1355 1263 1263 1368 1264 1264 1369 1251 1251 1355 1264 1264 1369 1252 1252 1356 1252 1252 1356 1264 1264 1369 1265 1265 1370 1252 1252 1356 1265 1265 1370 1253 1253 1357 1253 1253 1357 1265 1265 1370 1266 1266 1371 1253 1253 1357 1266 1266 1371 1254 1254 1358 1254 1254 1358 1266 1266 1371 1267 1267 1372 1254 1254 1358 1267 1267 1372 1255 1255 1359 1255 1255 1359 1267 1267 1372 1268 1268 1373 1255 1255 1359 1268 1268 1373 1256 1256 1360 1256 1256 1360 1268 1268 1373 1269 1269 1374 1256 1256 1360 1269 1269 1374 1257 1257 1361 1257 1257 1361 1269 1269 1374 1270 1270 1375 1257 1257 1361 1270 1270 1375 1258 1258 1362 1258 1258 1362 1270 1270 1375 1271 1271 1376 1258 1258 1362 1271 1271 1376 1259 1259 1363 1259 1259 1363 1271 1271 1376 1260 1260 1377 1259 1259 1363 1260 1260 1377 1248 1248 1364 1260 1260 1365 1272 1272 1378 1273 1273 1379 1260 1260 1365 1273 1273 1379 1261 1261 1366 1261 1261 1366 1273 1273 1379 1274 1274 1380 1261 1261 1366 1274 1274 1380 1262 1262 1367 1262 1262 1367 1274 1274 1380 1275 1275 1381 1262 1262 1367 1275 1275 1381 1263 1263 1368 1263 1263 1368 1275 1275 1381 1276 1276 1382 1263 1263 1368 1276 1276 1382 1264 1264 1369 1264 1264 1369 1276 1276 1382 1277 1277 1383 1264 1264 1369 1277 1277 1383 1265 1265 1370 1265 1265 1370 1277 1277 1383 1278 1278 1384 1265 1265 1370 1278 1278 1384 1266 1266 1371 1266 1266 1371 1278 1278 1384 1279 1279 1385 1266 1266 1371 1279 1279 1385 1267 1267 1372 1267 1267 1372 1279 1279 1385 1280 1280 1386 1267 1267 1372 1280 1280 1386 1268 1268 1373 1268 1268 1373 1280 1280 1386 1281 1281 1387 1268 1268 1373 1281 1281 1387 1269 1269 1374 1269 1269 1374 1281 1281 1387 1282 1282 1388 1269 1269 1374 1282 1282 1388 1270 1270 1375 1270 1270 1375 1282 1282 1388 1283 1283 1389 1270 1270 1375 1283 1283 1389 1271 1271 1376 1271 1271 1376 1283 1283 1389 1272 1272 1390 1271 1271 1376 1272 1272 1390 1260 1260 1377 1272 1272 1378 1284 1284 1391 1285 1285 1392 1272 1272 1378 1285 1285 1392 1273 1273 1379 1273 1273 1379 1285 1285 1392 1286 1286 1393 1273 1273 1379 1286 1286 1393 1274 1274 1380 1274 1274 1380 1286 1286 1393 1287 1287 1394 1274 1274 1380 1287 1287 1394 1275 1275 1381 1275 1275 1381 1287 1287 1394 1288 1288 1395 1275 1275 1381 1288 1288 1395 1276 1276 1382 1276 1276 1382 1288 1288 1395 1289 1289 1396 1276 1276 1382 1289 1289 1396 1277 1277 1383 1277 1277 1383 1289 1289 1396 1290 1290 1397 1277 1277 1383 1290 1290 1397 1278 1278 1384 1278 1278 1384 1290 1290 1397 1291 1291 1398 1278 1278 1384 1291 1291 1398 1279 1279 1385 1279 1279 1385 1291 1291 1398 1292 1292 1399 1279 1279 1385 1292 1292 1399 1280 1280 1386 1280 1280 1386 1292 1292 1399 1293 1293 1400 1280 1280 1386 1293 1293 1400 1281 1281 1387 1281 1281 1387 1293 1293 1400 1294 1294 1401 1281 1281 1387 1294 1294 1401 1282 1282 1388 1282 1282 1388 1294 1294 1401 1295 1295 1402 1282 1282 1388 1295 1295 1402 1283 1283 1389 1283 1283 1389 1295 1295 1402 1284 1284 1403 1283 1283 1389 1284 1284 1403 1272 1272 1390 1284 1284 1391 1296 1296 1404 1297 1297 1405 1284 1284 1391 1297 1297 1405 1285 1285 1392 1285 1285 1392 1297 1297 1405 1298 1298 1406 1285 1285 1392 1298 1298 1406 1286 1286 1393 1286 1286 1393 1298 1298 1406 1299 1299 1407 1286 1286 1393 1299 1299 1407 1287 1287 1394 1287 1287 1394 1299 1299 1407 1300 1300 1408 1287 1287 1394 1300 1300 1408 1288 1288 1395 1288 1288 1395 1300 1300 1408 1301 1301 1409 1288 1288 1395 1301 1301 1409 1289 1289 1396 1289 1289 1396 1301 1301 1409 1302 1302 1410 1289 1289 1396 1302 1302 1410 1290 1290 1397 1290 1290 1397 1302 1302 1410 1303 1303 1411 1290 1290 1397 1303 1303 1411 1291 1291 1398 1291 1291 1398 1303 1303 1411 1304 1304 1412 1291 1291 1398 1304 1304 1412 1292 1292 1399 1292 1292 1399 1304 1304 1412 1305 1305 1413 1292 1292 1399 1305 1305 1413 1293 1293 1400 1293 1293 1400 1305 1305 1413 1306 1306 1414 1293 1293 1400 1306 1306 1414 1294 1294 1401 1294 1294 1401 1306 1306 1414 1307 1307 1415 1294 1294 1401 1307 1307 1415 1295 1295 1402 1295 1295 1402 1307 1307 1415 1296 1296 1416 1295 1295 1402 1296 1296 1416 1284 1284 1403 1296 1296 1404 1308 1308 1417 1309 1309 1418 1296 1296 1404 1309 1309 1418 1297 1297 1405 1297 1297 1405 1309 1309 1418 1310 1310 1419 1297 1297 1405 1310 1310 1419 1298 1298 1406 1298 1298 1406 1310 1310 1419 1311 1311 1420 1298 1298 1406 1311 1311 1420 1299 1299 1407 1299 1299 1407 1311 1311 1420 1312 1312 1421 1299 1299 1407 1312 1312 1421 1300 1300 1408 1300 1300 1408 1312 1312 1421 1313 1313 1422 1300 1300 1408 1313 1313 1422 1301 1301 1409 1301 1301 1409 1313 1313 1422 1314 1314 1423 1301 1301 1409 1314 1314 1423 1302 1302 1410 1302 1302 1410 1314 1314 1423 1315 1315 1424 1302 1302 1410 1315 1315 1424 1303 1303 1411 1303 1303 1411 1315 1315 1424 1316 1316 1425 1303 1303 1411 1316 1316 1425 1304 1304 1412 1304 1304 1412 1316 1316 1425 1317 1317 1426 1304 1304 1412 1317 1317 1426 1305 1305 1413 1305 1305 1413 1317 1317 1426 1318 1318 1427 1305 1305 1413 1318 1318 1427 1306 1306 1414 1306 1306 1414 1318 1318 1427 1319 1319 1428 1306 1306 1414 1319 1319 1428 1307 1307 1415 1307 1307 1415 1319 1319 1428 1308 1308 1429 1307 1307 1415 1308 1308 1429 1296 1296 1416 1308 1308 1417 1320 1320 1430 1321 1321 1431 1308 1308 1417 1321 1321 1431 1309 1309 1418 1309 1309 1418 1321 1321 1431 1322 1322 1432 1309 1309 1418 1322 1322 1432 1310 1310 1419 1310 1310 1419 1322 1322 1432 1323 1323 1433 1310 1310 1419 1323 1323 1433 1311 1311 1420 1311 1311 1420 1323 1323 1433 1324 1324 1434 1311 1311 1420 1324 1324 1434 1312 1312 1421 1312 1312 1421 1324 1324 1434 1325 1325 1435 1312 1312 1421 1325 1325 1435 1313 1313 1422 1313 1313 1422 1325 1325 1435 1326 1326 1436 1313 1313 1422 1326 1326 1436 1314 1314 1423 1314 1314 1423 1326 1326 1436 1327 1327 1437 1314 1314 1423 1327 1327 1437 1315 1315 1424 1315 1315 1424 1327 1327 1437 1328 1328 1438 1315 1315 1424 1328 1328 1438 1316 1316 1425 1316 1316 1425 1328 1328 1438 1329 1329 1439 1316 1316 1425 1329 1329 1439 1317 1317 1426 1317 1317 1426 1329 1329 1439 1330 1330 1440 1317 1317 1426 1330 1330 1440 1318 1318 1427 1318 1318 1427 1330 1330 1440 1331 1331 1441 1318 1318 1427 1331 1331 1441 1319 1319 1428 1319 1319 1428 1331 1331 1441 1320 1320 1442 1319 1319 1428 1320 1320 1442 1308 1308 1429 1320 1320 1430 1332 1332 1443 1333 1333 1444 1320 1320 1430 1333 1333 1444 1321 1321 1431 1321 1321 1431 1333 1333 1444 1334 1334 1445 1321 1321 1431 1334 1334 1445 1322 1322 1432 1322 1322 1432 1334 1334 1445 1335 1335 1446 1322 1322 1432 1335 1335 1446 1323 1323 1433 1323 1323 1433 1335 1335 1446 1336 1336 1447 1323 1323 1433 1336 1336 1447 1324 1324 1434 1324 1324 1434 1336 1336 1447 1337 1337 1448 1324 1324 1434 1337 1337 1448 1325 1325 1435 1325 1325 1435 1337 1337 1448 1338 1338 1449 1325 1325 1435 1338 1338 1449 1326 1326 1436 1326 1326 1436 1338 1338 1449 1339 1339 1450 1326 1326 1436 1339 1339 1450 1327 1327 1437 1327 1327 1437 1339 1339 1450 1340 1340 1451 1327 1327 1437 1340 1340 1451 1328 1328 1438 1328 1328 1438 1340 1340 1451 1341 1341 1452 1328 1328 1438 1341 1341 1452 1329 1329 1439 1329 1329 1439 1341 1341 1452 1342 1342 1453 1329 1329 1439 1342 1342 1453 1330 1330 1440 1330 1330 1440 1342 1342 1453 1343 1343 1454 1330 1330 1440 1343 1343 1454 1331 1331 1441 1331 1331 1441 1343 1343 1454 1332 1332 1455 1331 1331 1441 1332 1332 1455 1320 1320 1442 1332 1332 1443 1344 1344 1456 1345 1345 1457 1332 1332 1443 1345 1345 1457 1333 1333 1444 1333 1333 1444 1345 1345 1457 1346 1346 1458 1333 1333 1444 1346 1346 1458 1334 1334 1445 1334 1334 1445 1346 1346 1458 1347 1347 1459 1334 1334 1445 1347 1347 1459 1335 1335 1446 1335 1335 1446 1347 1347 1459 1348 1348 1460 1335 1335 1446 1348 1348 1460 1336 1336 1447 1336 1336 1447 1348 1348 1460 1349 1349 1461 1336 1336 1447 1349 1349 1461 1337 1337 1448 1337 1337 1448 1349 1349 1461 1350 1350 1462 1337 1337 1448 1350 1350 1462 1338 1338 1449 1338 1338 1449 1350 1350 1462 1351 1351 1463 1338 1338 1449 1351 1351 1463 1339 1339 1450 1339 1339 1450 1351 1351 1463 1352 1352 1464 1339 1339 1450 1352 1352 1464 1340 1340 1451 1340 1340 1451 1352 1352 1464 1353 1353 1465 1340 1340 1451 1353 1353 1465 1341 1341 1452 1341 1341 1452 1353 1353 1465 1354 1354 1466 1341 1341 1452 1354 1354 1466 1342 1342 1453 1342 1342 1453 1354 1354 1466 1355 1355 1467 1342 1342 1453 1355 1355 1467 1343 1343 1454 1343 1343 1454 1355 1355 1467 1344 1344 1468 1343 1343 1454 1344 1344 1468 1332 1332 1455 1344 1344 1456 1356 1356 1469 1357 1357 1470 1344 1344 1456 1357 1357 1470 1345 1345 1457 1345 1345 1457 1357 1357 1470 1358 1358 1471 1345 1345 1457 1358 1358 1471 1346 1346 1458 1346 1346 1458 1358 1358 1471 1359 1359 1472 1346 1346 1458 1359 1359 1472 1347 1347 1459 1347 1347 1459 1359 1359 1472 1360 1360 1473 1347 1347 1459 1360 1360 1473 1348 1348 1460 1348 1348 1460 1360 1360 1473 1361 1361 1474 1348 1348 1460 1361 1361 1474 1349 1349 1461 1349 1349 1461 1361 1361 1474 1362 1362 1475 1349 1349 1461 1362 1362 1475 1350 1350 1462 1350 1350 1462 1362 1362 1475 1363 1363 1476 1350 1350 1462 1363 1363 1476 1351 1351 1463 1351 1351 1463 1363 1363 1476 1364 1364 1477 1351 1351 1463 1364 1364 1477 1352 1352 1464 1352 1352 1464 1364 1364 1477 1365 1365 1478 1352 1352 1464 1365 1365 1478 1353 1353 1465 1353 1353 1465 1365 1365 1478 1366 1366 1479 1353 1353 1465 1366 1366 1479 1354 1354 1466 1354 1354 1466 1366 1366 1479 1367 1367 1480 1354 1354 1466 1367 1367 1480 1355 1355 1467 1355 1355 1467 1367 1367 1480 1356 1356 1481 1355 1355 1467 1356 1356 1481 1344 1344 1468 1356 1356 1469 1368 1368 1482 1369 1369 1483 1356 1356 1469 1369 1369 1483 1357 1357 1470 1357 1357 1470 1369 1369 1483 1370 1370 1484 1357 1357 1470 1370 1370 1484 1358 1358 1471 1358 1358 1471 1370 1370 1484 1371 1371 1485 1358 1358 1471 1371 1371 1485 1359 1359 1472 1359 1359 1472 1371 1371 1485 1372 1372 1486 1359 1359 1472 1372 1372 1486 1360 1360 1473 1360 1360 1473 1372 1372 1486 1373 1373 1487 1360 1360 1473 1373 1373 1487 1361 1361 1474 1361 1361 1474 1373 1373 1487 1374 1374 1488 1361 1361 1474 1374 1374 1488 1362 1362 1475 1362 1362 1475 1374 1374 1488 1375 1375 1489 1362 1362 1475 1375 1375 1489 1363 1363 1476 1363 1363 1476 1375 1375 1489 1376 1376 1490 1363 1363 1476 1376 1376 1490 1364 1364 1477 1364 1364 1477 1376 1376 1490 1377 1377 1491 1364 1364 1477 1377 1377 1491 1365 1365 1478 1365 1365 1478 1377 1377 1491 1378 1378 1492 1365 1365 1478 1378 1378 1492 1366 1366 1479 1366 1366 1479 1378 1378 1492 1379 1379 1493 1366 1366 1479 1379 1379 1493 1367 1367 1480 1367 1367 1480 1379 1379 1493 1368 1368 1494 1367 1367 1480 1368 1368 1494 1356 1356 1481 1368 1368 1482 1380 1380 1495 1381 1381 1496 1368 1368 1482 1381 1381 1496 1369 1369 1483 1369 1369 1483 1381 1381 1496 1382 1382 1497 1369 1369 1483 1382 1382 1497 1370 1370 1484 1370 1370 1484 1382 1382 1497 1383 1383 1498 1370 1370 1484 1383 1383 1498 1371 1371 1485 1371 1371 1485 1383 1383 1498 1384 1384 1499 1371 1371 1485 1384 1384 1499 1372 1372 1486 1372 1372 1486 1384 1384 1499 1385 1385 1500 1372 1372 1486 1385 1385 1500 1373 1373 1487 1373 1373 1487 1385 1385 1500 1386 1386 1501 1373 1373 1487 1386 1386 1501 1374 1374 1488 1374 1374 1488 1386 1386 1501 1387 1387 1502 1374 1374 1488 1387 1387 1502 1375 1375 1489 1375 1375 1489 1387 1387 1502 1388 1388 1503 1375 1375 1489 1388 1388 1503 1376 1376 1490 1376 1376 1490 1388 1388 1503 1389 1389 1504 1376 1376 1490 1389 1389 1504 1377 1377 1491 1377 1377 1491 1389 1389 1504 1390 1390 1505 1377 1377 1491 1390 1390 1505 1378 1378 1492 1378 1378 1492 1390 1390 1505 1391 1391 1506 1378 1378 1492 1391 1391 1506 1379 1379 1493 1379 1379 1493 1391 1391 1506 1380 1380 1507 1379 1379 1493 1380 1380 1507 1368 1368 1494 1380 1380 1495 1392 1392 1508 1393 1393 1509 1380 1380 1495 1393 1393 1509 1381 1381 1496 1381 1381 1496 1393 1393 1509 1394 1394 1510 1381 1381 1496 1394 1394 1510 1382 1382 1497 1382 1382 1497 1394 1394 1510 1395 1395 1511 1382 1382 1497 1395 1395 1511 1383 1383 1498 1383 1383 1498 1395 1395 1511 1396 1396 1512 1383 1383 1498 1396 1396 1512 1384 1384 1499 1384 1384 1499 1396 1396 1512 1397 1397 1513 1384 1384 1499 1397 1397 1513 1385 1385 1500 1385 1385 1500 1397 1397 1513 1398 1398 1514 1385 1385 1500 1398 1398 1514 1386 1386 1501 1386 1386 1501 1398 1398 1514 1399 1399 1515 1386 1386 1501 1399 1399 1515 1387 1387 1502 1387 1387 1502 1399 1399 1515 1400 1400 1516 1387 1387 1502 1400 1400 1516 1388 1388 1503 1388 1388 1503 1400 1400 1516 1401 1401 1517 1388 1388 1503 1401 1401 1517 1389 1389 1504 1389 1389 1504 1401 1401 1517 1402 1402 1518 1389 1389 1504 1402 1402 1518 1390 1390 1505 1390 1390 1505 1402 1402 1518 1403 1403 1519 1390 1390 1505 1403 1403 1519 1391 1391 1506 1391 1391 1506 1403 1403 1519 1392 1392 1520 1391 1391 1506 1392 1392 1520 1380 1380 1507 1392 1392 1508 1404 1404 1521 1405 1405 1522 1392 1392 1508 1405 1405 1522 1393 1393 1509 1393 1393 1509 1405 1405 1522 1406 1406 1523 1393 1393 1509 1406 1406 1523 1394 1394 1510 1394 1394 1510 1406 1406 1523 1407 1407 1524 1394 1394 1510 1407 1407 1524 1395 1395 1511 1395 1395 1511 1407 1407 1524 1408 1408 1525 1395 1395 1511 1408 1408 1525 1396 1396 1512 1396 1396 1512 1408 1408 1525 1409 1409 1526 1396 1396 1512 1409 1409 1526 1397 1397 1513 1397 1397 1513 1409 1409 1526 1410 1410 1527 1397 1397 1513 1410 1410 1527 1398 1398 1514 1398 1398 1514 1410 1410 1527 1411 1411 1528 1398 1398 1514 1411 1411 1528 1399 1399 1515 1399 1399 1515 1411 1411 1528 1412 1412 1529 1399 1399 1515 1412 1412 1529 1400 1400 1516 1400 1400 1516 1412 1412 1529 1413 1413 1530 1400 1400 1516 1413 1413 1530 1401 1401 1517 1401 1401 1517 1413 1413 1530 1414 1414 1531 1401 1401 1517 1414 1414 1531 1402 1402 1518 1402 1402 1518 1414 1414 1531 1415 1415 1532 1402 1402 1518 1415 1415 1532 1403 1403 1519 1403 1403 1519 1415 1415 1532 1404 1404 1533 1403 1403 1519 1404 1404 1533 1392 1392 1520 1404 1404 1521 1416 1416 1534 1417 1417 1535 1404 1404 1521 1417 1417 1535 1405 1405 1522 1405 1405 1522 1417 1417 1535 1418 1418 1536 1405 1405 1522 1418 1418 1536 1406 1406 1523 1406 1406 1523 1418 1418 1536 1419 1419 1537 1406 1406 1523 1419 1419 1537 1407 1407 1524 1407 1407 1524 1419 1419 1537 1420 1420 1538 1407 1407 1524 1420 1420 1538 1408 1408 1525 1408 1408 1525 1420 1420 1538 1421 1421 1539 1408 1408 1525 1421 1421 1539 1409 1409 1526 1409 1409 1526 1421 1421 1539 1422 1422 1540 1409 1409 1526 1422 1422 1540 1410 1410 1527 1410 1410 1527 1422 1422 1540 1423 1423 1541 1410 1410 1527 1423 1423 1541 1411 1411 1528 1411 1411 1528 1423 1423 1541 1424 1424 1542 1411 1411 1528 1424 1424 1542 1412 1412 1529 1412 1412 1529 1424 1424 1542 1425 1425 1543 1412 1412 1529 1425 1425 1543 1413 1413 1530 1413 1413 1530 1425 1425 1543 1426 1426 1544 1413 1413 1530 1426 1426 1544 1414 1414 1531 1414 1414 1531 1426 1426 1544 1427 1427 1545 1414 1414 1531 1427 1427 1545 1415 1415 1532 1415 1415 1532 1427 1427 1545 1416 1416 1546 1415 1415 1532 1416 1416 1546 1404 1404 1533 1416 1416 1534 1428 1428 1547 1429 1429 1548 1416 1416 1534 1429 1429 1548 1417 1417 1535 1417 1417 1535 1429 1429 1548 1430 1430 1549 1417 1417 1535 1430 1430 1549 1418 1418 1536 1418 1418 1536 1430 1430 1549 1431 1431 1550 1418 1418 1536 1431 1431 1550 1419 1419 1537 1419 1419 1537 1431 1431 1550 1432 1432 1551 1419 1419 1537 1432 1432 1551 1420 1420 1538 1420 1420 1538 1432 1432 1551 1433 1433 1552 1420 1420 1538 1433 1433 1552 1421 1421 1539 1421 1421 1539 1433 1433 1552 1434 1434 1553 1421 1421 1539 1434 1434 1553 1422 1422 1540 1422 1422 1540 1434 1434 1553 1435 1435 1554 1422 1422 1540 1435 1435 1554 1423 1423 1541 1423 1423 1541 1435 1435 1554 1436 1436 1555 1423 1423 1541 1436 1436 1555 1424 1424 1542 1424 1424 1542 1436 1436 1555 1437 1437 1556 1424 1424 1542 1437 1437 1556 1425 1425 1543 1425 1425 1543 1437 1437 1556 1438 1438 1557 1425 1425 1543 1438 1438 1557 1426 1426 1544 1426 1426 1544 1438 1438 1557 1439 1439 1558 1426 1426 1544 1439 1439 1558 1427 1427 1545 1427 1427 1545 1439 1439 1558 1428 1428 1559 1427 1427 1545 1428 1428 1559 1416 1416 1546 1428 1428 1547 0 0 1560 1 3 1561 1428 1428 1547 1 3 1561 1429 1429 1548 1429 1429 1548 1 3 1561 2 5 1562 1429 1429 1548 2 5 1562 1430 1430 1549 1430 1430 1549 2 5 1562 3 7 1563 1430 1430 1549 3 7 1563 1431 1431 1550 1431 1431 1550 3 7 1563 4 9 1564 1431 1431 1550 4 9 1564 1432 1432 1551 1432 1432 1551 4 9 1564 5 11 1565 1432 1432 1551 5 11 1565 1433 1433 1552 1433 1433 1552 5 11 1565 6 13 1566 1433 1433 1552 6 13 1566 1434 1434 1553 1434 1434 1553 6 13 1566 7 15 1567 1434 1434 1553 7 15 1567 1435 1435 1554 1435 1435 1554 7 15 1567 8 17 1568 1435 1435 1554 8 17 1568 1436 1436 1555 1436 1436 1555 8 17 1568 9 19 1569 1436 1436 1555 9 19 1569 1437 1437 1556 1437 1437 1556 9 19 1569 10 21 1570 1437 1437 1556 10 21 1570 1438 1438 1557 1438 1438 1557 10 21 1570 11 23 1571 1438 1438 1557 11 23 1571 1439 1439 1558 1439 1439 1558 11 23 1571 0 0 1572 1439 1439 1558 0 0 1572 1428 1428 1559</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-2_max" name="Torus_Knot-2_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-2_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-3.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-3.dae
new file mode 100644
index 0000000..18f48e7
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-3.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-3.max</source_data>
+ </contributor>
+ <created>2008-10-31T16:19:36Z</created>
+ <modified>2008-10-31T16:19:38Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="6480">31.726814 -0.006605 13.727729 31.854496 -0.919483 14.941559 30.881302 -1.721458 17.094463 28.924608 -2.315799 19.926765 26.220427 -2.630821 23.096849 23.094917 -2.628527 26.222359 19.925066 -2.309194 28.926308 17.093203 -1.711338 30.882561 14.940891 -0.907069 31.855167 13.727730 0.006605 31.726814 13.600047 0.919483 30.512985 14.573242 1.721457 28.360083 16.529932 2.315799 25.527782 19.234114 2.630821 22.357698 22.359619 2.628527 19.232191 25.529472 2.309195 16.528240 28.361336 1.711339 14.571986 30.513649 0.907071 13.599378 30.786390 3.735097 13.259359 31.352966 2.897694 14.399877 31.072830 2.019259 16.718313 29.979773 1.205744 19.935024 28.205629 0.555271 23.662033 25.964392 0.146297 27.449804 23.526386 0.028149 30.841475 21.185671 0.215079 33.427963 19.224569 0.684540 34.897301 17.879622 1.379907 35.072258 17.313046 2.217310 33.931744 17.593182 3.095744 31.613310 18.686237 3.909259 28.396599 20.460379 4.559732 24.669594 22.701614 4.968707 20.881823 25.139622 5.086854 17.490150 27.480337 4.899925 14.903660 29.441439 4.430465 13.434322 28.820398 6.855691 12.842863 29.800817 6.185897 13.798473 30.306332 5.433066 16.122902 30.275972 4.688000 19.535786 29.713400 4.040566 23.625481 28.686468 3.568854 27.898714 27.319040 3.329759 31.840065 25.776051 3.352119 34.974152 24.243605 3.633238 36.922958 22.906538 4.139208 37.451424 21.926121 4.809002 36.495815 21.420605 5.561833 34.171391 21.450964 6.306899 30.758507 22.013535 6.954332 26.668812 23.040466 7.426045 22.395580 24.407892 7.665141 18.454227 25.950882 7.642780 15.320143 27.483330 7.361662 13.371334 26.038576 9.264955 12.851428 27.346571 8.804632 13.484112 28.641127 8.349689 15.567957 29.766098 7.954998 18.851625 30.585802 7.668165 22.939054 31.001366 7.523787 27.337246 30.962667 7.539279 31.515707 30.474377 7.712769 34.970455 29.595385 8.023335 37.284798 28.431715 8.433516 38.179592 27.123722 8.893839 37.546913 25.829166 9.348783 35.463066 24.704193 9.743473 32.179401 23.884491 10.030306 28.091972 23.468925 10.174684 23.693781 23.507622 10.159193 19.515322 23.995913 9.985703 16.060570 24.874903 9.675138 13.746226 22.919579 11.282253 13.648422 24.402512 10.983977 13.835441 26.359400 10.882333 15.379955 28.554211 10.989581 18.095673 30.722221 11.292784 21.655039 32.601936 11.755372 25.628738 33.966633 12.321548 29.537489 34.651714 12.923027 32.909832 34.574539 13.487258 35.339016 33.744427 13.946188 36.532051 32.261494 14.244464 36.345036 30.304607 14.346108 34.800522 28.109797 14.238860 32.084805 25.941786 13.935658 28.525442 24.062071 13.473071 24.551743 22.697372 12.906894 20.642992 22.012293 12.305415 17.270647 22.089464 11.741184 14.841459 20.047205 13.682938 15.175947 21.516153 13.408149 14.876420 23.888359 13.535955 15.639026 26.877699 14.050941 17.371786 30.123613 14.890992 19.865704 33.234600 15.954785 22.819975 35.835426 17.114012 25.878269 37.612396 18.228851 28.671713 38.351177 19.164839 30.863377 37.962662 19.809078 32.188911 36.493717 20.083868 32.488441 34.121513 19.956060 31.725836 31.132174 19.441074 29.993076 27.886259 18.601025 27.499161 24.775272 17.537233 24.544891 22.174446 16.378006 21.486597 20.397476 15.263166 18.693151 19.658693 14.327180 16.501488 17.773115 17.270491 16.742393 19.055439 16.848503 16.034857 21.546965 16.942738 15.941678 24.947178 17.541828 16.474096 28.845963 18.573513 17.567892 32.773067 19.913355 19.091139 36.254826 21.399752 20.860113 38.871284 22.853418 22.661446 40.306866 24.099028 24.277872 40.388412 24.986334 25.514427 39.106087 25.408319 26.221964 36.614563 25.314085 26.315142 33.214352 24.714996 25.782726 29.315569 23.683313 24.688931 25.388466 22.343472 23.165684 21.906706 20.857077 21.396711 19.290245 19.403408 19.595379 17.854664 18.157799 17.978952 16.071514 22.344303 17.330664 17.047451 21.647644 16.389786 19.390995 21.422750 15.563663 22.819485 21.696747 14.951938 26.919392 22.436584 14.628393 31.196209 23.553028 14.632054 35.134083 24.911419 14.962479 38.258057 26.347912 15.579813 40.191326 27.689251 16.409597 40.700714 28.773643 17.351748 39.724781 29.470303 18.292625 37.381233 29.695194 19.118748 33.952747 29.421200 19.730473 29.852842 28.681362 20.054016 25.576027 27.564922 20.050356 21.638151 26.206532 19.719933 18.514177 24.770035 19.102600 16.580906 23.428699 18.272816 14.676125 28.572083 16.099361 15.285969 27.557344 15.139450 17.283110 26.807186 13.845638 20.426666 26.412088 12.373980 24.337475 26.419704 10.901978 28.543839 26.829117 9.607178 32.538403 27.590944 8.645752 35.839371 28.613300 8.133661 38.048588 29.772869 8.132673 38.899601 30.929794 8.642906 38.289757 31.944530 9.602818 36.292618 32.694691 10.896628 33.149063 33.089790 12.368286 29.238256 33.082172 13.840288 25.031895 32.672760 15.135088 21.037327 31.910934 16.096516 17.736362 30.888580 16.608604 15.527139 29.729010 16.609594 13.282096 35.211140 12.653103 13.518038 33.919609 11.878950 15.047488 32.561394 10.450216 17.685972 31.300304 8.539226 21.115252 30.288456 6.376473 24.921701 29.647892 4.222819 28.646208 29.455872 2.338026 31.839542 29.735554 0.949427 34.116543 30.453207 0.224507 35.202564 31.522272 0.250704 34.966625 32.813801 1.024856 33.437176 34.172020 2.453589 30.798691 35.433105 4.364578 27.369415 36.444958 6.527330 23.562967 37.085522 8.680984 19.838459 37.277542 10.565778 16.645124 36.997860 11.954378 14.368123 36.280209 12.679298 11.662464 41.379196 7.060013 11.557786 39.919147 6.635350 12.571877 37.996574 5.410366 14.582420 35.843361 3.532811 17.346916 33.719223 1.229146 20.531925 31.880356 -1.222771 23.753288 30.548559 -3.527204 26.622461 29.884464 -5.406205 28.793379 29.968174 -6.633137 30.004200 30.789589 -7.060017 30.108877 32.249634 -6.635354 29.094788 34.172211 -5.410370 27.084246 36.325420 -3.532817 24.319752 38.449562 -1.229154 21.134745 40.288425 1.222763 17.913382 41.620228 3.527197 15.044208 42.284321 5.406198 12.873287 42.200615 6.633132 9.693753 46.248405 -0.256655 9.312621 44.772961 -0.227977 9.831593 42.441734 -0.949997 11.188072 39.535912 -2.335630 13.218448 36.405975 -4.217746 15.677826 33.429443 -6.369334 18.269569 30.965332 -8.530882 20.681076 29.310844 -10.441675 22.621481 28.665541 -11.871243 23.856745 29.107252 -12.647160 24.237879 30.582699 -12.675838 23.718906 32.913925 -11.953817 22.362429 35.819744 -10.568187 20.332054 38.949684 -8.686072 17.872677 41.926212 -6.534484 15.280934 44.390324 -4.372936 12.869428 46.044811 -2.462143 10.929021 46.690121 -1.032573 7.326954 49.152576 -8.654326 6.752618 47.837208 -8.141521 6.855957 45.344303 -8.138869 7.624508 41.974545 -8.646692 8.965573 38.134377 -9.603738 10.717399 34.286976 -10.894573 12.668689 30.896406 -12.363503 14.584089 28.371611 -13.833354 16.232574 27.017118 -15.126841 17.415314 26.996304 -16.087948 17.989649 28.311672 -16.600754 17.886311 30.804577 -16.603405 17.117760 34.174332 -16.095585 15.776697 38.014496 -15.138539 14.024872 41.861893 -13.847705 12.073583 45.252468 -12.378775 10.158182 47.777267 -10.908923 8.509696 49.131760 -9.615437 4.552809 49.630367 -17.367418 3.870878 48.647713 -16.422752 3.679944 46.303902 -15.588865 4.003036 42.881638 -14.966338 4.801185 38.793697 -14.630255 5.978121 34.533138 -14.621153 7.391889 30.613855 -14.940128 8.871967 27.508566 -15.548710 10.239837 25.591820 -16.373493 11.330513 25.094799 -17.314997 12.012444 26.077452 -18.259663 12.203377 28.421259 -19.093548 11.880286 31.843523 -19.716076 11.082138 35.931465 -20.052160 9.905203 40.192020 -20.061264 8.491435 44.111305 -19.742289 7.011357 47.216595 -19.133705 5.643487 49.133347 -18.308924 1.421793 47.459431 -25.532022 0.696638 46.946350 -24.293505 0.340652 45.082687 -22.673229 0.396771 42.093227 -20.866625 0.858226 38.338551 -19.091595 1.669359 34.271519 -17.562237 2.732336 30.382683 -16.463011 3.918945 27.141087 -15.926502 5.086065 24.937723 -16.017420 6.092923 24.038342 -16.724798 6.818077 24.551424 -17.963316 7.174064 26.415085 -19.583591 7.117946 29.404539 -21.390196 6.656490 33.159218 -23.165222 5.845358 37.226246 -24.694582 4.782382 41.115086 -25.793808 3.595773 44.356678 -26.330318 2.428653 46.560047 -26.239403 -1.853985 42.762520 -32.203224 -2.603986 42.778240 -30.876469 -3.039907 41.673904 -28.682003 -3.109172 39.582710 -25.884516 -2.803424 36.756889 -22.821424 -2.159542 33.537277 -19.862183 -1.255188 30.312204 -17.363720 -0.199440 27.470661 -15.627386 0.880363 25.355383 -14.862608 1.853981 24.221504 -15.161632 2.603982 24.205784 -16.488388 3.039904 25.310118 -18.682852 3.109169 27.401310 -21.480337 2.803422 30.227129 -24.543428 2.159541 33.446743 -27.502670 1.255187 36.671814 -30.001133 0.199439 39.513359 -31.737469 -0.880364 41.628635 -32.502247 -4.823488 36.173115 -36.539043 -5.634474 36.663593 -35.345409 -6.156865 36.452068 -32.914848 -6.327651 35.564041 -29.540525 -6.126234 34.106632 -25.629431 -5.576909 32.255619 -21.653299 -4.745930 30.234268 -18.091717 -3.733528 28.286377 -15.374257 -2.661811 26.646896 -13.828688 -1.660047 25.513567 -13.641427 -0.849060 25.023088 -14.835061 -0.326670 25.234617 -17.265621 -0.155883 26.122641 -20.639944 -0.357299 27.580050 -24.551039 -0.906625 29.431061 -28.527166 -1.737603 31.452412 -32.088753 -2.750005 33.400303 -34.806213 -3.821721 35.039787 -36.351784 -6.937376 28.817459 -38.179077 -7.873696 29.620474 -37.283810 -8.578462 30.229355 -34.969109 -8.966667 30.570665 -31.514170 -8.991490 30.603233 -27.335701 -8.649937 30.323135 -22.937689 -7.983203 29.764151 -18.850603 -7.071707 28.993704 -15.567404 -6.025388 28.104723 -13.484092 -4.970448 27.204430 -12.851947 -4.034129 26.401417 -13.747212 -3.329363 25.792532 -16.061909 -2.941157 25.451223 -19.516851 -2.916333 25.418653 -23.695318 -3.257886 25.698753 -28.093327 -3.924619 26.257736 -32.180416 -4.836115 27.028183 -35.463615 -5.882433 27.917164 -37.546928 -7.889362 21.889946 -37.447350 -8.995914 22.794601 -36.918030 -10.002944 23.983006 -34.968967 -10.788991 25.311825 -31.835251 -11.259247 26.620779 -27.894848 -11.356991 27.751991 -23.623030 -11.070433 28.569021 -19.535046 -10.434138 28.973322 -16.123962 -9.524852 28.916128 -13.801210 -8.452247 28.404343 -12.846941 -7.345696 27.499689 -13.376261 -6.338665 26.311283 -15.325321 -5.552618 24.982466 -18.459040 -5.082362 23.673512 -22.399441 -4.984617 22.542297 -26.671255 -5.271174 21.725269 -30.759239 -5.907469 21.320967 -34.170322 -6.816755 21.378159 -36.493080 -7.760707 16.162996 -35.069145 -9.035542 16.979540 -34.892838 -10.420874 18.444052 -33.422691 -11.749608 20.379890 -30.836029 -12.861482 22.553564 -27.444839 -13.622386 24.702896 -23.658154 -13.940544 26.568642 -19.932695 -13.777582 27.925774 -16.717815 -13.153155 28.610594 -14.401273 -12.142579 28.540506 -13.262478 -10.867745 27.723965 -13.438782 -9.482414 26.259453 -14.908927 -8.153679 24.323614 -17.495586 -7.041806 22.149942 -20.886774 -6.280901 20.000612 -24.673460 -5.962742 18.134861 -28.398916 -6.125703 16.777731 -31.613798 -6.750128 16.092911 -33.930344 -6.869986 11.885027 -31.726812 -8.268233 12.478233 -31.853474 -10.039833 13.940369 -30.879377 -11.971102 16.095076 -28.922018 -13.829103 18.682467 -26.217482 -15.389731 21.390463 -23.091972 -16.464754 23.892443 -19.922478 -16.924505 25.886627 -17.091282 -16.713535 27.132490 -14.939869 -15.857289 27.479761 -13.727732 -14.459042 26.886555 -13.601070 -12.687443 25.424419 -14.575165 -10.756174 23.269714 -16.532524 -8.898174 20.682325 -19.237059 -7.337545 17.974329 -22.362566 -6.262522 15.472349 -25.532063 -5.802769 13.478165 -28.363258 -6.013737 12.232300 -30.514671 -5.566194 9.005283 -27.863438 -7.015347 9.292950 -28.237919 -9.122643 10.530238 -27.734245 -11.633911 12.567912 -26.413172 -14.246256 15.160198 -24.434032 -16.644588 17.994429 -22.035543 -18.539637 20.728752 -19.506998 -19.702827 23.033371 -17.153378 -19.993864 24.630316 -15.258562 -19.377645 25.326969 -14.051093 -17.928492 25.039303 -13.676610 -15.821197 23.802015 -14.180281 -13.309930 21.764343 -15.501356 -10.697586 19.172058 -17.480494 -8.299253 16.337830 -19.878979 -6.404204 13.603504 -22.407524 -5.241013 11.298884 -24.761147 -4.949974 9.701940 -26.655964 -4.162405 7.381169 -23.714716 -5.573366 7.321577 -24.288013 -7.920436 8.165138 -24.217804 -10.920525 9.810104 -23.512554 -14.211776 12.058069 -22.257326 -17.397217 14.637897 -20.603519 -20.092634 17.238420 -18.750612 -21.972925 19.545979 -16.922087 -22.811295 21.282244 -15.338492 -22.506626 22.237801 -14.190834 -21.095667 22.297394 -13.617535 -18.748596 21.453835 -13.687744 -15.748510 19.808868 -14.392993 -12.457260 17.560905 -15.648219 -9.271820 14.981078 -17.302023 -6.576400 12.380555 -19.154932 -4.696110 10.072998 -20.983456 -3.857737 8.336729 -22.567053 -2.955263 6.851263 -19.406757 -4.228479 6.436589 -20.134766 -6.680349 6.766053 -20.458885 -10.015138 7.799917 -20.340023 -13.830623 9.413481 -19.792513 -17.666599 11.412125 -18.882393 -21.060390 13.554783 -17.719439 -23.602659 15.583019 -16.443918 -24.986765 17.252199 -15.209680 -25.045771 18.360994 -14.165589 -23.772552 18.775669 -13.437580 -21.320686 18.446205 -13.113461 -17.985899 17.412342 -13.232324 -14.170415 15.798779 -13.779833 -10.334439 13.800137 -14.689952 -6.940646 11.657478 -15.852905 -4.398378 9.629242 -17.128426 -3.014268 7.960061 -18.362663 -2.233730 7.224931 -15.031631 -3.266190 6.480771 -15.870253 -5.654822 6.226475 -16.544813 -9.111522 6.492713 -16.973949 -13.219363 7.247375 -17.105904 -17.482878 8.399439 -16.924757 -21.387821 9.809944 -16.452360 -24.463202 11.308766 -15.745691 -26.338083 12.715124 -14.889983 -26.786327 13.859392 -13.988451 -25.753870 14.603553 -13.149828 -23.365238 14.857849 -12.475267 -19.908541 14.591612 -12.046130 -15.800701 13.836949 -11.914177 -11.537188 12.684889 -12.095324 -7.632244 11.274383 -12.567720 -4.556861 9.775560 -13.274388 -2.681977 8.369202 -14.130095 -2.259084 8.247806 -10.680413 -2.954654 7.234997 -11.582319 -5.090402 6.386784 -12.554109 -8.408727 5.805472 -13.478568 -12.509387 5.561176 -14.244194 -16.897783 5.683361 -14.758640 -21.044611 6.157291 -14.959859 -24.449699 6.925802 -14.823578 -26.702347 7.896201 -14.366236 -27.530851 8.951444 -13.642995 -26.835283 9.964252 -12.741089 -24.699535 10.812465 -11.769300 -21.381214 11.393777 -10.844841 -17.280556 11.638075 -10.079215 -12.892160 11.515888 -9.564768 -8.745333 11.041960 -9.363549 -5.340242 10.273449 -9.499829 -3.087592 9.303050 -9.957170 -3.219531 9.588124 -6.462287 -3.503232 8.400906 -7.375007 -5.195341 7.015604 -8.576246 -8.091761 5.599310 -9.921118 -11.843143 4.322848 -11.247410 -15.997017 3.340179 -12.395154 -20.052361 2.769826 -13.225913 -23.520041 2.680584 -13.639486 -25.981804 3.083216 -13.585990 -27.140728 3.929158 -13.071878 -26.857027 5.116376 -12.159159 -25.164921 6.501677 -10.957920 -22.268503 7.917971 -9.613049 -18.517122 9.194433 -8.286757 -14.363251 10.177103 -7.139013 -10.307907 10.747456 -6.308253 -6.840226 10.836699 -5.894679 -4.378459 10.434068 -5.948174 -5.185308 10.858491 -2.482939 -5.016171 9.617501 -3.351485 -6.097577 7.819412 -4.701558 -8.299094 5.681098 -6.370317 -11.355186 3.460472 -8.156487 -14.897243 1.425374 -9.844629 -18.498039 -0.178733 -11.231127 -21.723265 -1.158370 -12.148751 -24.183914 -1.395379 -12.486820 -25.583195 -0.861173 -12.204561 -25.752333 0.379816 -11.336016 -24.670927 2.177905 -9.985943 -22.469412 4.316218 -8.317185 -19.413322 6.536843 -6.531015 -15.871267 8.571941 -4.842874 -12.270472 10.176050 -3.456374 -9.045243 11.155687 -2.538751 -6.584592 11.392696 -2.200679 -8.077580 11.662115 1.149674 -7.459403 10.500497 0.380563 -7.813565 8.470284 -1.025873 -9.097352 5.816347 -2.899996 -11.155920 2.858793 -5.015760 -13.740973 -0.045654 -7.117973 -16.540718 -2.546675 -8.953074 -19.217463 -4.342610 -10.299726 -21.448353 -5.216844 -10.995502 -22.964310 -5.063930 -10.956482 -23.582489 -3.902312 -10.187371 -23.228327 -1.872099 -8.780935 -21.944540 0.781835 -6.906814 -19.885975 3.739388 -4.791050 -17.300922 6.643835 -2.688839 -14.501179 9.144856 -0.853735 -11.824433 10.940793 0.492917 -9.593542 11.815028 1.188695 -11.671829 11.653167 4.349606 -10.656389 10.699757 3.730797 -10.237152 8.653555 2.366040 -10.464684 5.761364 0.419946 -11.311541 2.372026 -1.872760 -12.675580 -1.105656 -4.235541 -14.392276 -4.252222 -6.383412 -16.254572 -6.688149 -8.057308 -18.037846 -8.119630 -9.055332 -19.527012 -8.374006 -9.257111 -20.542452 -7.420596 -8.638302 -20.961689 -5.374395 -7.273546 -20.734158 -2.482206 -5.327452 -19.887302 0.907131 -3.034748 -18.523264 4.384812 -0.671967 -16.806568 7.531379 1.475905 -14.944273 9.967306 3.149802 -13.160997 11.398789 4.147828 -15.624960 10.590368 7.058868 -14.308185 9.951767 6.633044 -13.150237 8.112837 5.407174 -12.290783 5.295383 3.529114 -11.833485 1.839228 1.225388 -11.833498 -1.838763 -1.226142 -12.290824 -5.294968 -3.529784 -13.150299 -8.112521 -5.407686 -14.308261 -9.951581 -6.633344 -15.625040 -10.590334 -7.058928 -16.941814 -9.951734 -6.633104 -18.099762 -8.112804 -5.407234 -18.959217 -5.295352 -3.529176 -19.416515 -1.839199 -1.225451 -19.416502 1.838791 1.226078 -18.959177 5.294997 3.529721 -18.099703 8.112551 5.407623 -16.941742 9.951613 6.633283 -19.526730 8.373028 9.258712 -18.037579 8.118843 9.056598 -16.254349 6.687651 8.058077 -14.392126 4.252076 6.383584 -12.675521 1.105884 4.235090 -11.311582 -2.371447 1.871734 -10.464819 -5.760499 -0.421428 -10.237365 -8.652504 -2.367806 -10.656654 -10.698642 -3.732641 -11.672114 -11.652121 -4.351311 -13.161265 -11.397936 -4.149197 -14.944494 -9.966744 -3.150676 -16.806717 -7.531171 -1.476185 -18.523321 -4.384981 0.672308 -19.887262 -0.907652 3.035663 -20.734026 2.481401 5.328825 -20.961479 5.373406 7.275205 -20.542192 7.419547 8.640039 -22.963579 5.062431 10.959457 -21.447624 5.215464 10.998146 -19.216825 4.341518 10.301716 -16.540249 2.546007 8.954163 -13.740730 0.045494 7.118023 -11.155931 -2.858422 5.014762 -9.097619 -5.815483 2.898065 -7.814055 -8.469027 1.023236 -7.460055 -10.498996 -0.383593 -8.078318 -11.660546 -1.152738 -9.594272 -11.813580 -1.191429 -11.825069 -10.939634 -0.494998 -14.501644 -9.144124 0.852554 -17.301163 -6.643613 2.688693 -19.885962 -3.739699 4.791953 -21.944275 -0.782637 6.908650 -23.227840 1.870906 8.783480 -23.581841 3.900877 10.190310 -25.581957 0.859544 12.209121 -24.182613 1.393755 12.491066 -21.722059 1.156950 12.152162 -18.497072 0.177691 11.233287 -14.896633 -1.425906 9.845268 -11.355008 -3.460427 8.155525 -8.299371 -5.680476 6.367864 -6.098275 -7.818283 4.697903 -5.017205 -9.615998 3.347063 -5.186554 -10.856790 2.478277 -6.585895 -11.391000 2.196332 -9.046450 -11.154196 2.535234 -12.271435 -10.174938 3.454109 -15.871873 -8.571342 4.842125 -19.413496 -6.536823 6.531868 -22.469135 -4.316774 8.319530 -24.670231 -2.178967 9.989491 -25.751305 -0.381251 11.340332 -27.139366 -3.930191 13.077672 -25.980232 -3.084406 13.591568 -23.518448 -2.681785 13.644169 -20.050938 -2.770887 13.229127 -15.995936 -3.340967 12.396505 -11.842538 -4.323264 11.246730 -8.091703 -5.599299 9.918481 -5.195838 -7.015163 8.571963 -3.504226 -8.400082 7.369588 -3.220900 -9.587013 6.456378 -4.380033 -10.432798 5.942482 -6.841818 -10.835421 5.889882 -10.309326 -10.746319 6.304922 -14.364325 -10.176240 7.137543 -18.517723 -9.193943 8.287317 -22.268559 -7.917909 9.615567 -25.164425 -6.502045 10.962085 -26.856039 -5.117126 12.164460 -27.530163 -8.950616 13.649069 -26.701183 -7.895757 14.372325 -24.448202 -6.925789 14.828941 -21.042961 -6.157705 14.963843 -16.896181 -5.684149 14.760760 -12.508026 -5.562237 14.244185 -8.407774 -5.806674 13.476428 -5.089974 -6.387977 12.550090 -2.954802 -7.236032 11.576900 -2.259789 -8.248553 10.674241 -3.088766 -9.303411 9.950985 -5.341747 -10.273379 9.494369 -8.746986 -11.041463 9.359467 -12.893764 -11.515020 9.562550 -17.281918 -11.636933 10.079123 -21.382170 -11.392497 10.846879 -24.699972 -10.811193 11.773217 -26.835148 -9.963139 12.746408 -26.787075 -13.857814 13.996091 -26.338026 -12.714049 14.897859 -24.462345 -11.308317 15.752846 -21.386271 -9.810170 16.457926 -17.480820 -8.400307 16.928059 -13.217049 -7.248778 17.106533 -9.109233 -6.494476 16.971828 -5.652833 -6.228378 16.540190 -3.264743 -6.482582 15.863680 -2.233001 -7.226425 15.023895 -2.682050 -8.370190 14.122127 -4.557730 -9.775922 13.267139 -7.633803 -11.274069 12.562059 -11.539251 -12.683931 12.091928 -15.803020 -13.835459 11.913451 -19.910837 -14.589764 12.048155 -23.367237 -14.855862 12.479794 -25.755329 -14.601658 13.156304 -25.048807 -18.358185 14.172234 -24.988741 -17.249964 15.216874 -23.603334 -15.581624 16.450790 -21.059687 -13.554388 17.725151 -17.664598 -11.412774 18.886251 -13.827571 -9.415091 19.794048 -10.011406 -7.802289 20.339043 -6.676387 -6.768894 20.455503 -4.224768 -6.439552 20.129383 -2.952249 -6.853983 19.400017 -3.012315 -7.962203 18.355377 -4.397722 -9.630543 17.121462 -6.941368 -11.657776 15.847101 -10.336452 -13.799390 14.686000 -14.173478 -15.797074 13.778205 -17.989645 -17.409878 13.233209 -21.324663 -18.443272 13.116747 -23.776285 -18.772615 13.442865 -22.511982 -22.234463 14.195948 -22.815411 -21.279556 15.344477 -21.975304 -19.544258 16.928215 -20.092993 -17.237871 18.756138 -17.395512 -14.638579 20.607775 -14.208216 -12.059895 22.259789 -10.915542 -9.812847 23.512918 -7.914633 -8.168461 24.216026 -5.567444 -7.325074 24.284302 -4.157080 -7.384411 23.709509 -3.853651 -8.339316 22.560982 -4.693757 -10.074614 20.977243 -6.576066 -12.380999 19.149319 -9.273546 -14.980290 17.297686 -12.460840 -17.558975 15.645672 -15.753514 -19.806023 14.392538 -18.754423 -21.450411 13.689431 -21.101614 -22.293798 13.621157 -19.387312 -25.321537 14.054355 -20.001844 -24.625830 15.263227 -19.708158 -23.030363 17.158878 -18.541677 -20.727575 19.512667 -16.643097 -17.995220 22.040691 -14.241414 -15.162857 24.438032 -11.626306 -12.572111 26.415535 -9.113194 -10.535467 27.734688 -7.005196 -9.298573 28.236378 -5.556568 -9.010612 27.860092 -4.942036 -9.706320 26.651222 -5.235721 -11.301785 24.755569 -6.402200 -13.604572 22.401783 -8.300779 -16.336926 19.873760 -10.702462 -19.169289 17.476419 -13.317570 -21.760035 15.498915 -15.830682 -23.796679 14.179762 -17.938681 -25.033577 13.678071 -15.869843 -27.472523 13.727739 -16.724194 -27.126654 14.941615 -16.931984 -25.882889 17.094553 -16.468153 -23.891247 19.926874 -15.388645 -21.391949 23.096962 -13.823666 -18.686447 26.222454 -11.961973 -16.101065 28.926373 -10.028116 -13.947635 30.882584 -8.255346 -12.485897 31.855137 -6.857485 -11.892155 31.726736 -6.003135 -12.238024 30.512859 -5.795344 -13.481787 28.359924 -6.259174 -15.473427 25.527605 -7.338680 -17.972725 22.357519 -8.903659 -20.678226 19.232027 -10.765350 -23.263609 16.528107 -12.699207 -25.417040 14.571895 -14.471978 -26.878778 13.599338 -12.158510 -28.529387 13.259381 -13.167016 -28.601337 14.399896 -13.787704 -27.919487 16.718319 -13.945712 -26.566080 19.935017 -13.621980 -24.704355 23.662008 -12.855555 -22.558865 27.449760 -11.738879 -20.388386 30.841417 -10.406641 -18.454708 33.427895 -9.019527 -16.991068 34.897221 -7.744845 -16.173994 35.072182 -6.736339 -16.102043 33.931667 -6.115650 -16.783892 31.613245 -5.957643 -18.137299 28.396549 -6.281374 -19.999022 24.669559 -7.047799 -22.144512 20.881807 -8.164474 -24.314991 17.490150 -9.496711 -26.248669 14.903674 -10.883825 -27.712311 13.434341 -8.473561 -28.386921 12.842847 -9.543814 -28.901058 13.798491 -10.448466 -28.962412 16.122948 -11.078404 -28.563576 19.535854 -11.357650 -27.752663 23.625565 -11.252519 -26.627476 27.898796 -10.775694 -25.323732 31.840137 -9.984687 -23.998682 34.974201 -8.974903 -22.812141 36.922977 -7.868139 -21.907232 37.451412 -6.797887 -21.393093 36.495770 -5.893234 -21.331741 34.171310 -5.263296 -21.730574 30.758408 -4.984050 -22.541487 26.668701 -5.089180 -23.666674 22.395470 -5.566005 -24.970417 18.454126 -6.357012 -26.295469 15.320063 -7.366795 -27.482008 13.371284 -4.994665 -27.182959 12.851474 -6.047331 -28.085567 13.484106 -7.088737 -28.979168 15.567904 -7.993272 -29.755978 18.851530 -8.651838 -30.322300 22.938931 -8.985003 -30.609835 27.337107 -8.952579 -30.583893 31.515570 -8.558479 -30.247606 34.970337 -7.850238 -29.641539 37.284710 -6.913279 -28.838791 38.179546 -5.860614 -27.936180 37.546917 -4.819209 -27.042582 35.463120 -3.914672 -26.265772 32.179493 -3.256106 -25.699448 28.092096 -2.922942 -25.411915 23.693922 -2.955364 -25.437855 19.515459 -3.349463 -25.774139 16.060692 -4.057704 -26.380207 13.746314 -1.687464 -25.491268 13.648071 -2.687317 -26.626324 13.835084 -3.754055 -28.270006 15.379635 -4.759012 -30.224064 18.095432 -5.580976 -32.252804 21.654907 -6.120807 -34.111534 25.628736 -6.313392 -35.576065 29.537613 -6.135503 -36.469749 32.910076 -5.608596 -36.684799 35.339352 -4.796224 -36.195271 36.532436 -3.796371 -35.060219 36.345425 -2.729634 -33.416534 34.800873 -1.724676 -31.462481 32.085079 -0.902712 -29.433741 28.525608 -0.362881 -27.575010 24.551779 -0.170295 -26.110479 20.642900 -0.348184 -25.216793 17.270437 -0.875090 -25.001743 14.841160 1.824890 -24.202177 15.176413 0.852453 -25.336945 14.876908 -0.222815 -27.455322 15.639488 -1.271219 -30.301809 17.372169 -2.166307 -33.533073 19.865971 -2.800118 -36.759377 22.820099 -3.096204 -39.591576 25.878242 -3.018855 -41.688072 28.671545 -2.577398 -42.795994 30.863092 -1.825081 -42.781712 32.188557 -0.852644 -41.646942 32.488060 0.222623 -39.528564 31.725481 1.271027 -36.682079 29.992798 2.166115 -33.450817 27.499001 2.799926 -30.224516 24.544874 3.096014 -27.392313 21.486731 3.018664 -25.295818 18.693428 2.577209 -24.187893 16.501877 6.069046 -24.026768 16.743036 5.062400 -24.926298 16.035545 3.898333 -27.131184 15.942338 2.717249 -30.375484 16.474663 1.661604 -34.267891 17.568308 0.858725 -38.338924 19.091366 0.405450 -42.097549 20.860134 0.356451 -45.090427 22.661272 0.717638 -46.956573 24.277538 1.445446 -47.470898 25.513981 2.452092 -46.571369 26.221476 3.616159 -44.366486 26.314682 4.797242 -41.122185 25.782358 5.852887 -37.229778 24.688715 6.655767 -33.158749 23.165655 7.109042 -29.400122 21.396889 7.158042 -26.407244 19.595751 6.796855 -24.541098 17.979485 11.314355 -25.090321 17.331146 10.223169 -25.587217 16.390167 8.856786 -27.504393 15.563913 7.380009 -30.610605 14.952042 5.970961 -34.531204 14.628354 4.799592 -38.793308 14.631891 4.007189 -42.882835 14.962230 3.689326 -46.306538 15.579521 3.884341 -48.651459 16.409313 4.568714 -49.634773 17.351524 5.659899 -49.137882 18.292503 7.026282 -47.220707 19.118757 8.503058 -44.114494 19.730629 9.912107 -40.193897 20.054316 11.083475 -35.931801 20.050779 11.875879 -31.842272 19.720444 12.193743 -28.418568 19.103149 11.998729 -26.073641 18.273357 17.405622 -26.995857 16.099737 16.221972 -27.016645 15.139753 14.573834 -28.371166 13.845852 12.660005 -30.896048 12.374097 10.711316 -34.286747 10.902004 8.962810 -38.134296 9.607129 7.625381 -41.974625 8.645655 6.860344 -45.344532 8.133545 6.759974 -47.837559 8.132572 7.336376 -49.153008 8.642851 8.520027 -49.132217 9.602835 10.168162 -47.777702 10.896736 12.081992 -45.252823 12.368489 14.030681 -41.862125 13.840582 15.779186 -38.014576 15.135456 17.116615 -34.174248 16.096931 17.881653 -30.804340 16.609041 17.982025 -28.311310 16.610016 23.852930 -29.108049 12.652629 22.616417 -28.666641 11.878533 20.675356 -29.312117 10.449930 18.263868 -30.966625 8.539131 15.672814 -33.430607 6.376606 13.214714 -36.406868 4.223186 11.186051 -39.536430 2.338609 9.831512 -42.441822 0.950179 9.314474 -44.772614 0.225363 9.697298 -46.247665 0.251583 10.933811 -46.689079 1.025678 12.874871 -46.043602 2.454280 15.286358 -44.389099 4.365079 17.877411 -41.925117 6.527603 20.335510 -38.948856 8.681022 22.364174 -35.819294 10.565600 23.718714 -32.913898 11.954031 24.235754 -30.583111 12.678848 30.004591 -30.789207 7.059236 28.792463 -29.968557 6.634607 26.620331 -29.885578 5.409774 23.750185 -30.550272 3.532469 20.528210 -31.882469 1.229123 17.343023 -33.721497 -1.222446 14.578804 -35.845524 -3.526542 12.568958 -37.998375 -5.405259 11.555904 -39.920376 -6.631994 11.661828 -41.379715 -7.058787 12.873956 -42.200367 -6.634159 15.046088 -42.283344 -5.409326 17.916231 -41.618652 -3.532023 21.138205 -40.286453 -1.228678 24.323393 -38.447430 1.222890 27.087612 -36.323402 3.526987 29.097458 -34.170551 5.405704 30.110516 -32.248547 6.632441 35.205036 -31.519501 -0.255899 34.117809 -30.451725 -0.227214 31.839443 -29.735550 -0.949295 28.644739 -29.457357 -2.335044 24.919029 -29.650709 -4.217324 21.111687 -30.292274 -6.369101 17.681934 -31.304676 -8.530840 15.043451 -32.565804 -10.441803 13.514476 -33.923542 -11.871501 13.279426 -35.214134 -12.647491 14.366651 -36.281910 -12.676176 16.645018 -36.998085 -11.954098 19.839720 -37.276276 -10.568348 23.565428 -37.082928 -8.686070 27.372770 -36.441360 -6.534293 30.802523 -35.428959 -4.372554 33.441006 -34.167831 -2.461590 34.969986 -32.810097 -1.031891 38.903656 -30.921968 -8.653635 38.051655 -29.766928 -8.140801 35.841064 -28.609970 -8.138186 32.538517 -27.590649 -8.646105 28.542345 -26.831907 -9.603294 24.334549 -26.425259 -10.894304 20.422653 -26.419754 -12.363420 17.278484 -26.816055 -13.833444 15.281281 -27.566364 -15.127069 14.671929 -28.580181 -16.088268 15.523930 -29.735226 -16.601103 17.734520 -30.892179 -16.603718 21.037064 -31.911503 -16.095800 25.033234 -32.670246 -15.138611 29.241028 -33.076893 -13.847601 33.152927 -33.082397 -12.378486 36.297092 -32.686096 -10.908462 38.294300 -31.935789 -9.614836 40.704758 -28.758032 -17.367249 40.194775 -27.675873 -16.422857 38.260490 -26.338402 -15.589209 35.135201 -24.906939 -14.966857 31.195871 -23.554140 -14.630864 26.917639 -22.443172 -14.621759 22.816521 -21.708036 -14.940638 19.387175 -21.437397 -15.549039 17.043228 -21.663904 -16.373581 16.067394 -22.360229 -17.314810 16.577377 -23.442390 -18.259203 18.511662 -24.779861 -19.092850 21.636946 -26.211323 -19.715202 25.576275 -27.564121 -20.051193 29.854507 -28.675089 -20.060301 33.955624 -29.410225 -19.741425 37.384972 -29.680862 -19.133022 39.728920 -29.454361 -18.308483 40.390278 -24.960855 -25.531912 40.308479 -24.076389 -24.293339 38.872456 -22.836376 -22.673010 36.255405 -21.390379 -20.866367 32.772987 -19.912804 -19.091316 28.845228 -18.581865 -17.561953 24.945881 -17.558102 -16.462742 21.545259 -16.964987 -15.926265 19.053530 -16.874065 -16.017227 17.771231 -17.296297 -16.724661 17.853025 -18.180759 -17.963234 19.289051 -19.420773 -19.583561 21.906099 -20.866772 -21.390205 25.388515 -22.344349 -23.165257 29.316271 -23.675285 -24.694618 33.215618 -24.699051 -25.793829 36.616241 -25.292164 -26.330307 39.107971 -25.383087 -26.239346 37.960655 -19.774651 -32.203342 38.349239 -19.133192 -30.876478 37.610760 -18.203821 -28.681896 35.834297 -17.098639 -25.884298 33.234112 -15.950941 -22.821112 30.123827 -14.899159 -19.861803 26.878590 -14.070157 -17.363312 23.889824 -13.563919 -15.626990 21.518017 -13.441508 -14.862263 20.049244 -13.717689 -15.161370 19.660662 -14.359148 -16.488234 20.399137 -15.288517 -18.682812 22.175600 -16.393702 -21.480412 24.775784 -17.541397 -24.543596 27.886066 -18.593178 -27.502903 31.131304 -19.422182 -30.001396 34.120071 -19.928419 -31.737719 36.491879 -20.050831 -32.502449 33.738621 -13.908622 -36.539108 34.568871 -13.451563 -35.345451 34.646866 -12.893527 -32.914860 33.963200 -12.301822 -29.540499 32.600330 -11.747815 -25.629368 30.722643 -11.298328 -21.653206 28.556614 -11.007576 -18.091597 26.363499 -10.910628 -15.374123 24.407818 -11.019177 -13.828555 22.925455 -11.320130 -13.641304 22.095207 -11.777189 -14.834959 22.017212 -12.335224 -17.265551 22.700878 -12.926929 -20.639908 24.063745 -13.480936 -24.551039 25.941431 -13.930423 -28.527199 28.107460 -14.221175 -32.088810 30.300575 -14.318124 -34.806286 32.256256 -14.209576 -36.351856 28.425356 -8.399202 -38.179024 29.588934 -7.989913 -37.283707 30.468618 -7.684288 -34.968967 30.958303 -7.519190 -31.514006 30.998928 -7.514533 -27.335533 30.585592 -7.670878 -22.937546 29.768148 -7.969369 -18.850496 28.645193 -8.374002 -15.567348 27.352173 -8.835971 -13.484097 26.045042 -9.299559 -12.852011 24.881464 -9.708848 -13.747329 24.001780 -10.014473 -16.062065 23.512094 -10.179571 -19.517027 23.471470 -10.184228 -23.695496 23.884806 -10.027883 -28.093485 24.702248 -9.729393 -32.180534 25.825203 -9.324761 -35.463680 27.118223 -8.862791 -37.546936 22.902422 -4.116192 -37.447868 24.239161 -3.610131 -36.918663 25.771824 -3.331725 -34.969635 27.315548 -3.314553 -31.835876 28.684137 -3.560686 -27.895361 29.712519 -4.040437 -23.623373 30.276655 -4.695942 -19.535179 30.308504 -5.448135 -16.123875 29.804224 -6.206293 -13.800909 28.824638 -6.878969 -12.846472 27.487898 -7.385029 -13.375680 25.955236 -7.663436 -15.324703 24.411512 -7.680609 -18.458460 23.042923 -7.434476 -22.398973 22.014542 -6.954725 -26.670961 21.450403 -6.299221 -30.759155 21.418554 -5.547027 -34.170464 21.922834 -4.788870 -36.493427 17.878126 -1.360176 -35.069229 19.222696 -0.664430 -34.892879 21.183655 -0.197030 -33.422695 23.524479 -0.014352 -30.835999 25.962833 -0.138429 -27.444786 28.204613 -0.554297 -23.658089 29.979429 -1.211795 -19.932634 31.073210 -2.031619 -16.717773 31.354033 -2.914886 -14.401260 30.788023 -3.755063 -13.262499 29.443453 -4.450809 -13.438848 27.482496 -4.918209 -14.909030 25.141672 -5.100887 -17.495724 22.703320 -4.976810 -20.886934 20.461540 -4.560943 -24.673632 18.686724 -3.903445 -28.399086 17.592939 -3.083621 -31.613949 17.312117 -2.200354 -33.930462 13.727890 0.007237 -31.726974 14.940800 0.921477 -31.853647 17.092884 1.724561 -30.879555 19.924564 2.319624 -28.922184 23.094303 2.634894 -26.217625 26.219780 2.632345 -23.092083 28.924017 2.312283 -19.922552 30.880844 1.713313 -17.091318 31.854239 0.907680 -14.939875 31.726795 -0.007445 -13.727711 30.513885 -0.921685 -13.601038 28.361803 -1.724769 -14.575130 25.530125 -2.319833 -16.532501 22.360388 -2.635103 -19.237059 19.234911 -2.632554 -22.362597 16.530672 -2.312493 -25.532129 14.573844 -1.713523 -28.363361 13.600447 -0.907890 -30.514809 10.582041 0.317885 -27.863663 11.555747 1.429061 -28.238115 13.680915 2.635376 -27.734398 16.701214 3.791331 -26.413269 20.252354 4.757500 -24.434074 23.906013 5.417349 -22.035538 27.221508 5.691290 -19.506954 29.798939 5.546283 -17.153313 31.327431 4.999817 -15.258491 31.622625 4.117804 -14.051036 30.648920 3.006628 -13.676583 28.523752 1.800313 -14.180302 25.503456 0.644359 -15.501429 21.952318 -0.321810 -17.480621 18.298658 -0.981660 -19.879156 14.983164 -1.255602 -22.407740 12.405731 -1.110595 -24.761383 10.877237 -0.564130 -26.656204 8.473923 -0.086689 -23.714977 9.127733 1.165062 -24.288288 11.031713 2.776021 -24.218069 13.956216 4.551883 -23.512789 17.548504 6.278452 -22.257517 21.375292 7.747479 -20.603653 24.975014 8.781777 -18.750683 27.913490 9.256598 -16.922098 29.836296 9.114666 -15.338453 30.511517 8.373103 -14.190763 29.857708 7.121353 -13.617451 27.953728 5.510394 -13.687670 25.029226 3.734534 -14.392948 21.436941 2.007964 -15.648222 17.610153 0.538937 -17.302082 14.010432 -0.495363 -19.155054 11.071955 -0.970182 -20.983637 9.149145 -0.828252 -22.567284 7.411061 -0.866313 -19.406971 7.688565 0.443662 -20.134974 9.199835 2.402305 -20.459074 11.762591 4.773374 -20.340179 15.067727 7.270883 -19.792633 18.716595 9.593595 -18.882471 22.269085 11.461356 -17.719481 25.296717 12.648888 -16.443930 27.434313 13.012957 -15.209672 28.424047 12.509651 -14.165574 28.146545 11.199677 -13.437571 26.635277 9.241034 -13.113471 24.072523 6.869967 -13.232365 20.767387 4.372458 -13.779911 17.118523 2.049746 -14.690070 13.566031 0.181983 -15.853062 10.538399 -1.005549 -17.128611 8.400801 -1.369620 -18.362869 7.374080 -1.678274 -15.031033 7.245843 -0.412145 -15.869783 8.219906 1.783570 -16.544540 10.178783 4.644034 -16.973919 12.886206 7.824234 -17.106131 16.015617 10.940589 -16.925226 19.189566 13.617220 -16.453026 22.025223 15.531288 -15.746485 24.180571 16.451927 -14.890823 25.395641 16.268097 -13.989247 25.523880 15.001968 -13.150496 24.549816 12.806253 -12.475738 22.590940 9.945790 -12.046359 19.883520 6.765593 -11.914148 16.754110 3.649239 -12.095053 13.580162 0.972605 -12.567251 10.744504 -0.941463 -13.273792 8.589154 -1.862105 -14.129454 8.272704 -2.167763 -10.680900 7.743366 -1.058980 -11.582806 8.076626 1.214765 -12.554547 9.232288 4.379226 -13.478917 11.070962 8.052719 -14.244425 13.370876 11.792171 -14.758739 15.854628 15.146544 -14.959822 18.222637 17.711250 -14.823424 20.189291 19.176956 -14.365995 21.517382 19.366871 -13.642710 22.046721 18.258089 -12.740804 21.713461 15.984345 -11.769062 20.557800 12.819885 -10.844691 18.719128 9.146394 -10.079185 16.419214 5.406944 -9.564871 13.935464 2.052570 -9.363787 11.567452 -0.512140 -9.500184 9.600798 -1.977847 -9.957612 9.912877 -2.005986 -6.463190 9.026575 -1.166563 -7.375807 8.672993 0.991611 -8.576860 8.894778 4.208227 -9.921484 9.665180 8.095314 -11.247499 10.891277 12.184033 -12.394964 12.425184 15.981222 -13.225483 14.081888 19.028887 -13.638880 15.661567 20.959431 -13.585294 16.973688 21.540005 -13.071188 17.859991 20.700583 -12.158572 18.213573 18.542410 -10.957519 17.991789 15.325794 -9.612895 17.221388 11.438708 -8.286881 15.995292 7.349991 -7.139414 14.461385 3.552802 -6.308896 12.804681 0.505137 -5.895498 11.225001 -1.425410 -5.949083 11.996103 -0.938429 -2.482436 10.836823 -0.464425 -3.351012 9.820391 1.371102 -4.701184 9.069404 4.346763 -6.370101 8.674441 8.103647 -8.156468 8.683141 12.188619 -9.844823 9.094454 16.108971 -11.231524 9.858770 19.391850 -12.149315 10.883903 21.641293 -12.487495 12.046204 22.585985 -12.205279 13.205482 22.111982 -11.336704 14.221915 20.276455 -9.986532 14.972902 17.300798 -8.317616 15.367867 13.543916 -6.531249 15.359167 9.458944 -4.842896 14.947854 5.538592 -3.456194 14.183537 2.255713 -2.538403 13.158406 0.006267 -2.200220 14.138521 1.164269 1.149538 12.823478 1.209700 0.380363 11.242377 2.531507 -1.026125 9.585923 4.970259 -2.900284 8.053908 8.231808 -5.016061 6.831117 11.922761 -7.118264 6.065036 15.597936 -8.953335 5.848065 18.814051 -10.299936 6.206374 21.183197 -10.995650 7.096746 22.419621 -10.956563 8.411789 22.374191 -10.187389 9.992888 21.052385 -8.780901 11.649343 18.613636 -6.906743 13.181357 15.352089 -4.790967 14.404149 11.661137 -2.688764 15.170231 7.985962 -0.853693 15.387202 4.769846 0.492909 15.028894 2.400697 1.188625 15.928606 4.280380 4.347451 14.595098 3.877818 3.728798 12.613235 4.538096 2.364423 10.222062 6.181574 0.418891 7.709987 8.610023 -1.873137 5.380005 11.530538 -4.235211 3.513147 14.590859 -6.382428 2.334582 17.421869 -8.055803 1.986462 19.682106 -9.053502 2.510777 21.098951 -9.255188 3.844285 21.501514 -8.636535 5.826146 20.841236 -7.272161 8.217318 19.197760 -5.326631 10.729392 16.769312 -3.034603 13.059373 13.848799 -0.672530 14.926232 10.788477 1.474688 16.104799 7.957467 3.148063 16.452919 5.697229 4.145764 16.983110 8.236740 7.060270 15.771711 7.415674 6.634364 13.600323 7.332279 5.408238 10.730848 7.996613 3.529783 7.509386 9.328548 1.225567 4.324493 11.167435 -1.226487 1.560316 13.291473 -3.530625 -0.449746 15.444475 -5.408935 -1.463251 17.366756 -6.634863 -1.357955 18.826462 -7.060547 -0.146557 19.647530 -6.634642 2.024831 19.730927 -5.408517 4.894304 19.066591 -3.530063 8.115765 17.734657 -1.225848 11.300656 15.895772 1.226206 14.064835 13.771733 3.530344 16.074898 11.618731 5.408655 17.088406 9.696449 6.634584 17.014498 12.723945 9.258860 16.049774 11.561411 9.056730 13.918718 10.732718 8.058167 10.878368 10.337818 6.383607 7.295435 10.424341 4.235030 3.602073 10.981853 1.871585 0.243757 11.943108 -0.421661 -2.374450 13.192163 -2.368109 -3.936757 14.578367 -3.732989 -4.254724 15.934523 -4.351676 -3.290001 17.097057 -4.149549 -1.158946 17.925751 -3.150984 1.881402 18.320650 -1.476426 5.464334 18.234127 0.672150 9.157695 17.676617 3.035594 12.516012 16.715363 5.328840 15.134220 15.466306 7.275288 16.696529 14.080103 8.640169 15.865992 17.355515 10.959558 15.240489 15.966170 10.998268 13.368189 14.471271 10.301828 10.474919 13.051122 8.954241 6.909651 11.877017 7.118043 3.102407 11.090570 5.014709 -0.487600 10.786638 2.897932 -3.427364 11.001879 1.023026 -5.362307 11.710332 -0.383868 -6.059045 12.826548 -1.153058 -5.433543 14.215892 -1.191767 -3.561243 15.710792 -0.495328 -0.667976 17.130939 0.852259 2.897291 18.305042 2.688455 6.704533 19.091492 4.791788 10.294540 19.395424 6.908565 13.234305 19.180183 8.783472 15.169250 18.471731 10.190367 13.535406 21.724602 12.209349 13.298341 20.245632 12.491276 11.862957 18.233160 12.152317 9.402385 15.929919 11.233355 6.213406 13.613713 9.845232 2.680657 11.563912 8.155374 -0.769758 10.027754 6.367604 -3.721671 9.190516 4.697555 -5.819035 9.153189 3.346656 -6.808879 9.920269 2.477847 -6.571814 11.399239 2.195920 -5.136432 13.411709 2.534878 -2.675862 15.714950 3.453838 0.513116 18.031153 4.841961 4.045863 20.080956 6.531817 7.496279 21.617115 8.319587 10.448192 22.454351 9.989637 12.545558 22.491682 11.340537 10.166134 25.468718 13.076781 10.319137 24.041986 13.590654 9.437010 21.708675 13.643329 7.626151 18.750216 13.228451 5.104975 15.523441 12.396059 2.177574 12.417547 11.246555 -0.802963 9.807151 9.918585 -3.477141 8.007107 8.572322 -5.522414 7.234523 7.370144 -6.692093 7.582587 6.457053 -6.845097 9.009315 5.943180 -5.962970 11.342626 5.890506 -4.152113 14.301085 6.305384 -1.630939 17.527859 7.137774 1.296460 20.633751 8.287277 4.276998 23.244148 9.615246 6.951176 25.044193 10.961510 8.996451 25.816778 12.163688 6.013992 28.316931 13.649035 6.512996 27.071569 14.372295 6.226449 24.635456 14.828908 5.188913 21.302416 14.963797 3.525532 17.474468 14.760694 1.436931 13.613317 14.244095 -0.824970 10.184676 13.476311 -2.987355 7.602088 12.549947 -4.789407 6.177053 11.576736 -6.013774 6.081449 10.674063 -6.512778 7.326807 9.950802 -6.226232 9.762922 9.494190 -5.188697 13.095960 9.359300 -3.525316 16.923906 9.562403 -1.436718 20.785057 10.079000 0.825184 24.213699 10.846785 2.987569 26.796288 11.773149 4.789622 28.221327 12.746360 1.393072 30.126997 13.996147 2.158993 29.166183 14.897941 2.438400 26.838911 15.752931 2.197590 23.425890 16.457989 1.465609 19.338776 16.928080 0.330746 15.070538 17.106501 -1.070120 11.135986 16.971733 -2.568022 8.009690 16.540030 -3.982291 6.068723 15.863462 -5.142347 5.547193 15.023633 -5.908269 6.508007 14.121840 -6.187675 8.835277 13.266851 -5.946866 12.248297 12.561791 -5.214887 16.335409 12.091702 -4.080024 20.603645 11.913280 -2.679159 24.538198 12.048048 -1.181257 27.664497 12.479751 0.233013 29.605467 13.156319 -3.375949 30.871838 14.171118 -2.445954 30.265875 15.215605 -1.693368 28.232069 16.449507 -1.208964 25.015730 17.723999 -1.051169 21.004791 18.885355 -1.239015 16.683033 19.793503 -1.749845 12.571722 20.338902 -2.522045 9.166746 20.455772 -3.462476 6.878793 20.130016 -4.457709 5.983823 19.400927 -5.387704 6.589783 18.356440 -6.140291 8.623587 17.122540 -6.624694 11.839926 15.848047 -6.782490 15.850863 14.686690 -6.594645 20.172619 13.778543 -6.083816 24.283932 13.233143 -5.311616 27.688908 13.116272 -4.371184 29.976864 13.442026 -7.999032 30.613510 14.196533 -7.020466 30.398750 15.345151 -5.937873 28.803432 16.928883 -4.881829 26.019976 18.756714 -3.979708 22.384106 20.608175 -3.340321 18.334366 22.259956 -3.040786 14.359209 23.512829 -3.117232 10.938101 24.215673 -3.560437 8.483677 24.283720 -4.316946 7.291976 23.708763 -5.295512 7.506735 22.560146 -6.378105 9.102053 20.976414 -7.434149 11.885507 19.148586 -8.336269 15.521375 17.297123 -8.975657 19.571115 15.645342 -9.275193 23.546272 14.392469 -9.198748 26.967381 13.689623 -8.755543 29.421806 13.621574 -12.235234 29.450766 14.054381 -11.325471 29.635090 15.263260 -10.090617 28.582987 17.158907 -8.679615 26.421356 19.512678 -7.262652 23.410919 22.040676 -6.010635 19.914782 24.437984 -5.074576 16.354630 26.415455 -4.567377 13.159870 27.734573 -4.550214 10.715838 28.236237 -5.025156 9.317316 27.859936 -5.934920 9.132991 26.651056 -7.169774 10.185093 24.755409 -8.580775 12.346724 22.401640 -9.997738 15.357158 19.873642 -11.249755 18.853294 17.476334 -12.185814 22.413445 15.498863 -12.693013 25.608206 14.179743 -12.710177 28.052240 13.678079 -15.857386 27.479731 13.727750 -15.130622 28.046713 14.941578 -13.949486 27.604836 17.094465 -12.456440 26.207392 19.926741 -10.831568 24.022938 23.096792 -9.270852 21.314947 26.222265 -7.962540 18.410046 28.926178 -7.064431 15.658609 30.882402 -6.684852 13.392498 31.854984 -6.869585 11.885040 31.726624 -7.596348 11.318057 30.512794 -8.777484 11.759934 28.359909 -10.270529 13.157374 25.527634 -11.895401 15.341827 22.357584 -13.456116 18.049816 19.232113 -14.764429 20.954718 16.528198 -15.662539 23.706154 14.571975 -16.042118 25.972267 13.599389 -18.626760 24.794989 13.259263 -18.184914 25.704281 14.399872 -17.284283 25.900738 16.718391 -16.033499 25.360661 19.935173 -14.583426 24.149191 23.662224 -13.108961 22.412453 27.450008 -11.787949 20.359921 30.841661 -10.779722 18.239161 33.428101 -10.205888 16.305969 34.897366 -10.135658 14.793512 35.072239 -10.577505 13.884221 33.931629 -11.478135 13.687765 31.613111 -12.728918 14.227840 28.396332 -14.178991 15.439308 24.669283 -15.653456 17.176044 20.881500 -16.974468 19.228577 17.489845 -17.982695 21.349337 14.903405 -18.556530 23.282532 13.434137 -20.347668 21.531267 12.842909 -20.257793 22.715237 13.798508 -19.858509 23.529461 16.122915 -19.197973 23.875729 19.535776 -18.355856 23.712275 23.625444 -17.433727 23.058817 27.898651 -16.542814 21.994171 31.839979 -15.790568 20.646748 34.974049 -15.267726 19.179066 36.922844 -15.037347 17.768152 37.451317 -15.127219 16.584183 36.495720 -15.526504 15.769960 34.171310 -16.187038 15.423691 30.758451 -17.029156 15.587143 26.668785 -17.951284 16.240601 22.395580 -18.842199 17.305246 18.454250 -19.594444 18.652668 15.320179 -20.117287 20.120350 13.371380 -21.045597 17.915722 12.851557 -21.300924 19.278713 13.484091 -21.553856 20.627594 15.567791 -21.773890 21.799673 18.851332 -21.934481 22.653578 22.938671 -22.016264 23.086317 27.336815 -22.009371 23.045692 31.515280 -21.914637 22.536608 34.970081 -21.743486 21.620462 37.284527 -21.516563 20.407761 38.179451 -21.261236 19.044771 37.546921 -21.008305 17.695889 35.463223 -20.788273 16.523809 32.179684 -20.627680 15.669905 28.092346 -20.545897 15.237166 23.694204 -20.552790 15.277790 19.515738 -20.647522 15.786874 16.060932 -20.818674 16.703018 13.746487 -21.230688 14.207916 13.648324 -21.713812 15.641317 13.835369 -22.604164 17.386852 15.379923 -23.794355 19.233982 18.095688 -25.140831 20.959919 21.655104 -26.481186 22.356483 25.628851 -27.653753 23.255236 29.537636 -28.517105 23.547770 32.910004 -28.967106 23.198803 35.339195 -28.949484 22.250423 36.532219 -28.466360 20.817024 36.345173 -27.576008 19.071487 34.800621 -26.385818 17.224360 32.084858 -25.039343 15.498425 28.525446 -23.698988 14.101858 24.551699 -22.526421 13.203106 20.642914 -21.663069 12.910571 17.270546 -21.213066 13.259538 14.841350 -21.870548 10.521764 15.176973 -22.367012 11.931339 14.877554 -23.664091 13.921643 15.640141 -25.605337 16.252613 17.372759 -27.956610 18.643103 19.866423 -30.434307 20.804781 22.820364 -32.739586 22.476919 25.878292 -34.594391 23.457832 28.671377 -35.775009 23.629208 30.862730 -36.139042 22.970375 32.188046 -35.642578 21.560801 32.487465 -34.345501 19.570498 31.724874 -32.404255 17.239527 29.992262 -30.052984 14.849039 27.498596 -27.575287 12.687360 24.544657 -25.270010 11.015221 21.486729 -23.415201 10.034307 18.693645 -22.234583 9.862930 16.502291 -23.843273 6.756771 16.742249 -24.118990 8.078296 16.034729 -25.446346 10.188913 15.941593 -27.665249 12.834053 16.474075 -30.508060 15.694670 17.567953 -33.631897 18.425734 19.091288 -36.659981 20.697836 20.860340 -39.227074 22.236927 22.661736 -41.023556 22.857372 24.278206 -41.832737 22.484335 25.514774 -41.557022 21.162811 26.222296 -40.229664 19.052195 26.315430 -38.010765 16.407057 25.782948 -35.167953 13.546439 24.689070 -32.044117 10.815376 23.165739 -29.016035 8.543275 21.396687 -26.448938 7.004181 19.595287 -24.652458 6.383735 17.978821 -27.386375 2.746305 17.330704 -27.271252 3.939600 16.389521 -28.248468 6.081421 15.563135 -30.200159 8.913434 14.951226 -32.890919 12.094055 14.627598 -35.996204 15.239656 14.631282 -39.141472 17.970829 14.961838 -41.947353 19.958155 15.579391 -44.075420 20.961933 16.409460 -45.268997 20.861095 17.351925 -45.384121 19.667803 18.293110 -44.406906 17.525982 19.119492 -42.455215 14.693971 19.731401 -39.764458 11.513350 20.055033 -36.659176 8.367750 20.051346 -33.513908 5.636576 19.720793 -30.708025 3.649249 19.103237 -28.579956 2.645468 18.273170 -32.082001 -1.575897 16.099613 -31.508144 -0.540384 15.139698 -31.857088 1.564256 13.845872 -33.086742 4.484173 12.374186 -35.048794 7.867181 10.902149 -37.506588 11.305239 9.607309 -40.163681 14.383667 8.645845 -42.699589 16.731159 8.133722 -44.808441 18.064579 8.132710 -46.235878 18.223089 8.642932 -46.809734 17.187576 9.602846 -46.460793 15.082937 10.896672 -45.231140 12.163022 12.368357 -43.269089 8.780015 13.840393 -40.811295 5.341959 15.135233 -38.154202 2.263530 16.096697 -35.618294 -0.083965 16.608820 -33.509441 -1.417384 16.609833 -37.135181 -6.104305 12.651072 -36.134598 -5.254019 11.877197 -35.722973 -3.250025 10.448971 -35.949955 -0.334033 8.538657 -36.788162 3.142244 6.376670 -38.136497 6.759516 4.223776 -39.832329 10.081485 2.339646 -41.671120 12.707474 0.951535 -43.431076 14.320751 0.226867 -44.899929 14.726729 0.253050 -45.900513 13.876444 1.026925 -46.312138 11.872450 2.455151 -46.085155 8.956459 4.365463 -45.246952 5.480184 6.527450 -43.898617 1.862914 8.680343 -42.202785 -1.459056 10.564473 -40.363995 -4.085047 11.952585 -38.604038 -5.698325 12.677254 -41.666592 -10.589655 7.059942 -40.349819 -9.950272 6.635285 -39.191879 -8.110729 5.410329 -38.332432 -5.292904 3.532821 -37.875145 -1.836666 1.229218 -37.875168 1.841110 -1.222634 -38.332504 5.296829 -3.527003 -39.191990 8.113683 -5.405950 -40.349957 9.951917 -6.632844 -41.666737 10.589811 -7.059707 -42.983509 9.950430 -6.635050 -44.141449 8.110888 -5.410095 -45.000896 5.293065 -3.532588 -45.458183 1.836829 -1.228985 -45.458160 -1.840946 1.222865 -45.000824 -5.296667 3.527235 -44.141342 -8.113522 5.406182 -42.983376 -9.951756 6.633078 -44.899616 -14.727714 -0.254508 -43.431286 -14.320027 -0.225784 -41.671825 -12.705112 -0.948014 -39.833458 -10.077749 -2.334086 -38.137917 -6.754840 -4.216820 -36.789707 -3.137174 -6.369130 -35.951443 0.338903 -8.531414 -35.724232 3.254126 -10.442871 -36.135479 5.256875 -11.872950 -37.135586 6.105592 -12.649163 -38.603916 5.697906 -12.677887 -40.363373 4.082992 -11.955658 -42.201740 1.455632 -10.569587 -43.897285 -1.867276 -8.686854 -45.245495 -5.484941 -6.534545 -46.083759 -8.961018 -4.372260 -46.310970 -11.876242 -2.460804 -45.899723 -13.878994 -1.030723 -46.230907 -18.230846 -8.654118 -44.804600 -18.070538 -8.141304 -42.697353 -16.734591 -8.138662 -40.163330 -14.384134 -8.646513 -37.508175 -11.302671 -9.603600 -35.052135 -7.861873 -10.894485 -33.091450 -4.476748 -12.363469 -31.862600 -1.555594 -13.833370 -31.513811 0.549255 -15.126897 -32.087147 1.583925 -16.088032 -33.513454 1.423619 -16.600845 -35.620701 0.087670 -16.603487 -38.154720 -2.262784 -16.095638 -40.809875 -5.344245 -15.138552 -43.265915 -8.785043 -13.847667 -45.226604 -12.170168 -12.378683 -46.455452 -15.091322 -10.908781 -46.804245 -17.196173 -9.615254 -45.257637 -20.872269 -17.367323 -44.065422 -20.971754 -16.422997 -41.939930 -19.965424 -15.589415 -39.137535 -17.974657 -14.967118 -35.996246 -15.239567 -14.631166 -32.894947 -12.090046 -14.622078 -30.207705 -8.905976 -14.940950 -28.258633 -6.071400 -15.549324 -27.282824 -3.928210 -16.373819 -27.397970 -2.734907 -17.314987 -28.590189 -2.635419 -18.259315 -30.715675 -3.641748 -19.092896 -33.518070 -5.632514 -19.715193 -36.659359 -8.367602 -20.051146 -39.760654 -11.517121 -20.060236 -42.447903 -14.701192 -19.741362 -44.396973 -17.535769 -19.132990 -45.372784 -19.678959 -18.308495 -41.812122 -22.498322 -25.531870 -41.005199 -22.869780 -24.293354 -39.213203 -22.246250 -22.673096 -36.652283 -20.702938 -20.866528 -33.631321 -18.425987 -19.091541 -30.514688 -15.690037 -17.562233 -27.678299 -12.825080 -16.463055 -25.464262 -10.176673 -15.926588 -24.139624 -8.064253 -16.017536 -23.864153 -6.742608 -16.724926 -24.671080 -6.371148 -17.963444 -26.463072 -6.994678 -19.583698 -29.023991 -8.537990 -21.390270 -32.044952 -10.814938 -23.165253 -35.161583 -13.550887 -24.694563 -37.997974 -16.415844 -25.793741 -40.212009 -19.064251 -26.330208 -41.536652 -21.176674 -26.239264 -36.103951 -22.988581 -32.204048 -35.742989 -23.645676 -30.877033 -34.569317 -23.470566 -28.682243 -32.724499 -22.484379 -25.884403 -30.431049 -20.806057 -22.820976 -27.965586 -18.638031 -19.861454 -25.625486 -16.241802 -17.362797 -23.692997 -13.906386 -15.626382 -22.401205 -11.913470 -14.861648 -21.905922 -10.503428 -15.160830 -22.266882 -9.846333 -16.487843 -23.440554 -10.021441 -18.682631 -25.285370 -11.007628 -21.480467 -27.578819 -12.685949 -24.543896 -30.044281 -14.853972 -27.503420 -32.384384 -17.250202 -30.002075 -34.316872 -19.585619 -31.738491 -35.608665 -21.578535 -32.503227 -28.914995 -22.263700 -36.539116 -28.934235 -23.211302 -35.345505 -28.489828 -23.557978 -32.914955 -27.635380 -23.261915 -29.540627 -26.473949 -22.358826 -25.629515 -25.145620 -20.957634 -21.653360 -23.810610 -19.227341 -18.091743 -22.629940 -17.376652 -15.374249 -21.746017 -15.628782 -13.828644 -21.265455 -14.194552 -13.641354 -21.246216 -13.246951 -14.834967 -21.690620 -12.900274 -17.265518 -22.545069 -13.196335 -20.639845 -23.706499 -14.099422 -24.550953 -25.034828 -15.500616 -28.527107 -26.369839 -17.230906 -32.088726 -27.550508 -19.081596 -34.806221 -28.434431 -20.829468 -36.351830 -21.490339 -20.415142 -38.179184 -21.717403 -21.627640 -37.284023 -21.891857 -22.542715 -34.969402 -21.992657 -23.049990 -31.514502 -22.007647 -23.088282 -27.336035 -21.935019 -22.652971 -22.937984 -21.783531 -21.796566 -18.850822 -21.571457 -20.622356 -15.567519 -21.324375 -19.271975 -13.484091 -21.072088 -17.908293 -12.851828 -20.845024 -16.695793 -13.746990 -20.670572 -15.780719 -16.061609 -20.569771 -15.273443 -19.516506 -20.554781 -15.235150 -23.694973 -20.627409 -15.670460 -28.093021 -20.778896 -16.526867 -32.180183 -20.990971 -17.701075 -35.463490 -21.238050 -19.051456 -37.546921 -15.013886 -17.776873 -37.447559 -15.244083 -19.187513 -36.918285 -15.769610 -20.653902 -34.969238 -16.527082 -21.999168 -31.835503 -17.425137 -23.061056 -27.895050 -18.355455 -23.711481 -23.623156 -19.205828 -23.871998 -19.535080 -19.873686 -23.523241 -16.123898 -20.278475 -22.707279 -13.801054 -20.371376 -21.522528 -12.846714 -20.141178 -20.111885 -13.375986 -19.615652 -18.645494 -15.325031 -18.858179 -17.300228 -18.458769 -17.960125 -16.238340 -22.399220 -17.029808 -15.587915 -26.671110 -16.179436 -15.427399 -30.759188 -15.511578 -15.776155 -34.170368 -15.106787 -16.592117 -36.493217 -10.115683 -14.803371 -35.068962 -10.185488 -16.315670 -34.892559 -10.761373 -18.247534 -33.422348 -11.773877 -20.365957 -30.835663 -13.100879 -22.415422 -27.444494 -14.582320 -24.148737 -23.657864 -16.039518 -25.356834 -19.932499 -17.296715 -25.894005 -16.717731 -18.202271 -25.695452 -14.401312 -18.646965 -24.785130 -13.262632 -18.577160 -23.272835 -13.439034 -18.001276 -21.340969 -14.909241 -16.988771 -19.222546 -17.495924 -15.661772 -17.173080 -20.887094 -14.180330 -15.439767 -24.673723 -12.723131 -14.231667 -28.399088 -11.465935 -13.694498 -31.613855 -10.560378 -13.893049 -33.930275 -6.858185 -11.891773 -31.726753 -6.672746 -13.399284 -31.853447 -7.053092 -15.664634 -30.879385 -7.953347 -18.414583 -28.922054 -9.264928 -21.317448 -26.217539 -10.829638 -24.023102 -23.092041 -12.458751 -26.205202 -19.922546 -13.955770 -27.600555 -17.091339 -15.140134 -28.040859 -14.939904 -15.868992 -27.473011 -13.727737 -16.054432 -25.965500 -13.601043 -15.674086 -23.700153 -14.575105 -14.773830 -20.950205 -16.532433 -13.462251 -18.047340 -19.236948 -11.897541 -15.341686 -22.362444 -10.268429 -13.159586 -25.531939 -8.771409 -11.764231 -28.363148 -7.587044 -11.323924 -30.514584 -5.015151 -9.323261 -27.863365 -4.539734 -10.722114 -28.237827 -4.557699 -13.165724 -27.734138 -5.066879 -16.359360 -26.413055 -6.005858 -19.917814 -24.433918 -7.261383 -23.411894 -22.035442 -8.682017 -26.420153 -19.506916 -10.096413 -28.579758 -17.153318 -11.333972 -29.630222 -15.258530 -12.245427 -29.444849 -14.051087 -12.720843 -28.045998 -13.676626 -12.702879 -25.602385 -14.180311 -12.193701 -22.408752 -15.501394 -11.254722 -18.850296 -17.480528 -9.999198 -15.356220 -19.879005 -8.578564 -12.347960 -22.407532 -7.164168 -10.188354 -24.761129 -5.926608 -9.137888 -26.655920 -4.309603 -7.295757 -23.715191 -3.552497 -8.487972 -24.288292 -3.109661 -10.942396 -24.217846 -3.034510 -14.362988 -23.512346 -3.336106 -18.337175 -22.256891 -3.978073 -22.385609 -20.602905 -4.882980 -26.019991 -18.749886 -5.941682 -28.801960 -16.921329 -7.026484 -30.395969 -15.337790 -8.006543 -30.609762 -14.190266 -8.763649 -29.417545 -13.617165 -9.206485 -26.963123 -13.687611 -9.281637 -23.542534 -14.393108 -8.980042 -19.568348 -15.648563 -8.338075 -15.519916 -17.302549 -7.433168 -11.885533 -19.155569 -6.374467 -9.103563 -20.984125 -5.289664 -7.509550 -22.567665 -4.456978 -5.984826 -19.405848 -3.461288 -6.880007 -20.134054 -2.520553 -9.168030 -20.458447 -1.748239 -12.572924 -20.339903 -1.237498 -16.684008 -19.792717 -1.049933 -21.005424 -18.882889 -1.208168 -25.015947 -17.720158 -1.693116 -28.231848 -16.444765 -2.446285 -30.265244 -15.210543 -3.376834 -30.870872 -14.166357 -4.372523 -29.975691 -13.438150 -5.313259 -27.687670 -13.113756 -6.085573 -24.282780 -13.232302 -6.596314 -20.171696 -13.779488 -6.783880 -15.850280 -14.689314 -6.625646 -11.839757 -15.852045 -6.140698 -8.623856 -17.127438 -5.387529 -6.590458 -18.361658 -5.139244 -5.546748 -15.032660 -3.978448 -6.068910 -15.871071 -2.563909 -8.010492 -16.545313 -1.066242 -11.137310 -16.974058 0.333914 -15.072225 -17.105600 1.467679 -19.340624 -16.924068 2.198303 -23.427677 -16.451359 2.437663 -26.840427 -15.744489 2.156889 -29.167244 -14.888716 1.389846 -30.127481 -13.987261 0.229050 -29.605320 -13.148849 -1.185488 -27.663738 -12.474609 -2.683155 -24.536922 -12.045862 -4.083311 -20.602011 -11.914321 -5.217075 -16.333612 -12.095852 -5.947701 -12.246558 -12.568561 -6.187061 -8.833809 -13.275430 -5.906288 -6.506988 -14.131202 -6.012189 -6.079504 -10.682225 -4.787064 -6.175660 -11.583809 -2.984539 -7.601421 -12.555084 -0.822029 -10.184816 -13.478903 1.439638 -13.614250 -14.243836 3.527671 -17.476084 -14.757626 5.190221 -21.304520 -14.958296 6.226762 -24.637798 -14.821647 6.512270 -27.073868 -14.364159 6.012311 -28.318911 -13.641011 4.787186 -28.222755 -12.739429 2.984662 -26.796995 -11.768152 0.822152 -24.213602 -10.844334 -1.439514 -20.784168 -10.079400 -3.527546 -16.922338 -9.565612 -5.190098 -13.093901 -9.364940 -6.226639 -9.760624 -9.501589 -6.512149 -7.324551 -9.959077 -6.694061 -7.583588 -6.459356 -5.524398 -7.235477 -7.372450 -3.478905 -8.007902 -8.574357 -0.804299 -9.807694 -9.920111 2.176823 -12.417773 -11.247393 5.104894 -15.523327 -12.396112 7.626744 -18.749777 -13.227716 9.438204 -21.707964 -13.641904 10.320781 -24.041092 -13.588717 10.168027 -25.467751 -13.074569 8.998364 -25.815861 -12.161475 6.952873 -25.043438 -10.959568 4.278267 -23.243647 -9.613815 1.297147 -20.633568 -8.286534 -1.630924 -17.528017 -7.137815 -4.152776 -14.301569 -6.306209 -5.964235 -11.343380 -5.892020 -6.846815 -9.010250 -5.945207 -6.810575 -9.920686 -2.480874 -5.820670 -9.153641 -3.349645 -3.723051 -9.190952 -4.700150 -0.770720 -10.028120 -6.369497 2.680226 -11.564169 -8.156339 6.213553 -13.613831 -9.845155 9.403090 -15.929883 -11.232249 11.864130 -18.232977 -12.150320 13.299838 -20.245325 -12.488632 13.537045 -21.724209 -12.206380 12.547141 -22.491255 -11.337609 10.449523 -22.453943 -9.987104 7.497195 -21.616777 -8.317759 4.046250 -20.080730 -6.530918 0.512923 -18.031071 -4.842102 -2.676614 -15.715017 -3.455006 -5.137655 -13.411924 -2.536936 -6.573366 -11.399574 -2.198622 -6.059808 -12.826948 1.151831 -5.363154 -11.710772 0.382509 -3.428196 -11.002307 -1.024357 -0.488317 -10.787002 -2.899079 3.101889 -11.090828 -5.015536 6.909390 -11.877139 -7.118454 10.474944 -13.051094 -8.954189 13.368495 -14.471096 -10.301325 15.241036 -15.965872 -10.997375 15.866715 -17.355133 -10.958389 15.170062 -18.471310 -10.189068 13.235105 -19.179773 -8.782203 10.295227 -19.395079 -6.907482 6.705023 -19.091255 -4.791025 2.897524 -18.304945 -2.688108 -0.668032 -17.130991 -0.852372 -3.561583 -15.710988 0.494763 -5.434128 -14.216211 1.190816 -4.257581 -15.935158 4.347052 -3.939451 -14.578997 3.728463 -2.376657 -13.192711 2.364223 0.242304 -11.943508 0.418881 3.601546 -10.982059 -1.872929 7.295897 -10.424331 -4.234777 10.879760 -10.337591 -6.381792 13.920871 -10.732305 -8.055011 16.052425 -11.560860 -9.052620 17.017330 -12.723324 -9.254293 16.699202 -14.079486 -8.635704 15.136407 -15.465772 -7.271465 12.517449 -16.714973 -5.326123 9.158208 -17.676422 -3.034315 5.463860 -18.234152 -0.672467 1.879995 -18.320892 1.474548 -1.161116 -17.926182 3.147768 -3.292675 -17.097626 4.145378 -1.359717 -18.827473 7.057481 -1.465026 -17.367775 6.631776 -0.451318 -15.445376 5.406195 1.559136 -13.292151 3.528560 4.323847 -11.167807 1.225341 7.509350 -9.328571 -1.225658 10.731425 -7.996284 -3.528811 13.601444 -7.331638 -5.406325 15.773239 -7.414802 -6.631742 16.984861 -8.235739 -7.057261 17.090170 -9.695436 -6.631557 16.076464 -11.617834 -5.405976 14.066010 -13.771057 -3.528342 11.301301 -15.895401 -1.225125 8.115800 -17.734638 1.225874 4.893724 -19.066925 3.529027 2.023705 -19.731571 5.406542 -0.148092 -19.648411 6.631960 2.513249 -21.096239 9.260976 1.988793 -19.679518 9.058798 2.336491 -17.419716 8.059967 3.514404 -14.589398 6.384958 5.380460 -11.529947 4.235802 7.709583 -8.610374 1.871718 10.220848 -6.182826 -0.422148 12.611358 -4.540097 -2.369125 14.592784 -3.880326 -3.734378 15.926135 -4.283092 -4.353237 16.450592 -5.699814 -4.151059 16.102894 -7.959615 -3.152229 14.924982 -10.789929 -1.477221 13.058928 -13.849380 0.671934 10.729806 -16.768953 3.036016 8.218541 -19.196503 5.329884 5.828031 -20.839231 7.276861 3.846604 -21.499004 8.642115 7.097570 -22.419605 10.957074 6.206955 -21.183348 10.995846 5.848334 -18.814346 10.299795 6.064961 -15.598340 8.952874 6.830709 -11.923224 7.117542 8.053216 -8.232275 5.015168 9.585031 -4.970675 2.899328 11.241392 -2.531819 1.025225 12.822520 -1.209870 -0.381098 14.137708 -1.164275 -1.150017 15.028323 -2.400532 -1.188790 15.386945 -4.769533 -0.492739 15.170319 -7.985537 0.854181 14.404572 -11.660650 2.689511 13.182065 -15.351601 4.791885 11.650251 -18.613203 6.907725 9.993890 -21.052059 8.781828 8.412761 -22.374010 10.188152 12.047471 -22.585335 12.206842 10.884989 -21.640785 12.488794 9.859546 -19.391546 12.150195 9.094827 -16.108908 11.231881 8.683067 -12.188801 9.844616 8.673932 -8.104052 8.155725 9.068523 -4.347341 6.368913 9.819247 -1.371784 4.699696 10.835554 0.463725 3.349406 11.994864 0.937797 2.480907 13.157346 -0.006749 2.198954 14.182789 -2.255988 2.537554 14.947509 -5.538626 3.455866 15.359267 -9.458731 4.843131 15.368403 -13.543479 6.532021 14.973813 -17.300190 8.318832 14.223090 -20.275749 9.988050 13.206783 -22.111259 11.338341 16.972622 -21.537722 13.080452 15.660729 -20.956490 13.594398 14.081384 -19.025637 13.646731 12.425076 -15.978056 13.231140 10.891581 -12.181329 12.397751 9.665861 -8.093397 11.247082 8.895758 -4.207327 9.917921 8.674155 -0.991834 8.570586 9.027781 1.165246 7.367584 9.913985 2.003737 6.454014 11.225878 1.422505 5.940068 12.805223 -0.508346 5.887734 14.461531 -3.555925 6.303324 15.995026 -7.352651 7.136714 17.220745 -11.440580 8.287382 17.990850 -15.326652 9.616542 18.212454 -18.542145 10.963878 17.858828 -20.699228 12.166880 21.516088 -19.366642 13.650161 20.188129 -19.175980 14.373487 18.221746 -17.709641 14.830060 15.854119 -15.144489 14.964808 13.370816 -11.789918 14.761478 11.071361 -8.050539 14.244596 9.233101 -4.377378 13.476507 8.077759 -1.213471 12.549850 7.744684 1.059568 11.576398 8.274051 2.167579 10.673559 9.602011 1.976918 9.950232 11.568391 0.510580 9.493659 13.936018 -2.054571 9.358911 16.419321 -5.409140 9.562240 18.718777 -9.148517 10.079121 20.557037 -12.821678 10.847210 21.712379 -15.985586 11.773867 22.045456 -18.258627 12.747319 25.393970 -16.270220 13.996949 24.178963 -16.452963 14.898832 22.023876 -15.531104 15.753842 19.188646 -13.615835 16.458851 16.015242 -10.938168 16.928822 12.886422 -7.821064 17.107069 10.179572 -4.640495 16.972097 8.221175 -1.780085 16.540184 7.247445 0.415160 15.863424 7.375824 1.680461 15.023444 8.590830 1.863204 14.121560 10.745916 0.941347 13.266551 13.581145 -0.973919 12.561543 16.754549 -3.651587 12.091573 19.883368 -6.768688 11.913323 22.590218 -9.949257 12.048296 24.548616 -12.809669 12.480209 25.522350 -15.004915 13.156969 28.423754 -12.512323 14.171221 27.434010 -13.014691 15.215762 25.296444 -12.649470 16.449736 22.268881 -11.460710 17.724308 18.716490 -9.591791 18.885746 15.067739 -7.268135 19.793964 11.762725 -4.770010 20.339417 9.200079 -2.398725 20.456314 7.688894 -0.440292 20.130558 7.411440 0.869074 19.401438 8.401184 1.371443 18.356897 10.538748 1.006220 17.122923 13.566308 -0.182539 15.848351 17.118698 -2.051455 14.686913 20.767448 -4.375110 13.778695 24.072464 -6.873235 13.233242 26.635111 -9.244520 13.116344 28.146299 -11.202955 13.442100 30.511934 -8.377662 14.195780 29.836729 -9.117996 15.344269 27.913887 -9.258291 16.928020 24.975334 -8.781625 18.756004 21.375504 -7.745489 20.607738 17.548588 -6.274858 22.259878 13.956169 -4.547112 23.513153 11.031547 -2.770642 24.216396 9.127472 -1.159717 24.284788 8.473603 0.091363 23.710079 9.148809 0.831698 22.561588 11.071650 0.971994 20.977839 14.010200 0.495328 19.149857 17.610029 -0.540807 17.298120 21.436945 -2.011437 15.645981 25.029364 -3.739183 14.392706 27.953987 -5.515653 13.689461 29.858065 -7.126579 13.621070 31.622692 -4.129625 14.054400 31.327463 -5.009600 15.263334 29.798939 -5.552838 17.159058 27.221481 -5.693818 19.512918 23.905972 -5.415534 22.041008 20.252310 -4.751553 24.438400 16.701180 -3.781960 26.415936 13.680902 -2.623703 27.735092 11.555765 -1.416483 28.236763 10.582091 -0.305911 27.860435 10.877320 0.574063 26.651505 12.405846 1.117302 24.755781 14.983299 1.258282 22.401922 18.298807 0.979999 19.873833 21.952469 0.316018 17.476440 25.503597 -0.653574 15.498903 28.523876 -1.811831 14.179747 30.649015 -3.019050 13.678075</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="2160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="6480">0.742838 0.034130 -0.668600 0.553596 0.168309 -0.815600 0.966540 0.250659 -0.054507 0.989081 -0.001672 0.147362 0.965262 0.101118 0.240922 0.883274 -0.128780 0.450825 0.927453 -0.166826 0.334663 0.772587 -0.345139 0.532906 0.808700 -0.459718 0.366966 0.608911 -0.587383 0.533112 0.632664 -0.678914 0.372574 0.402329 -0.774582 0.488011 0.452687 -0.801384 0.390971 0.194914 -0.873088 0.446907 0.270784 -0.841688 0.467158 -0.012703 -0.887175 0.461258 -0.013302 -0.726325 0.687223 -0.316974 -0.729747 0.605803 -0.501520 -0.124810 0.856096 -0.710597 -0.036058 0.702674 -0.632513 0.616025 0.469511 -0.580336 0.738663 0.342908 -0.563844 0.813796 0.140769 -0.402573 0.913877 0.052563 -0.581682 0.811618 -0.054056 -0.388561 0.909359 -0.148614 -0.671723 0.697071 -0.250759 -0.462221 0.801377 -0.379665 -0.777287 0.419550 -0.468831 -0.555376 0.546130 -0.627136 -0.778773 0.047000 -0.625542 -0.570859 0.225452 -0.789488 -0.674689 -0.205650 -0.708875 -0.485938 0.004524 -0.873982 -0.419102 -0.241892 -0.875124 -0.172671 -0.065575 -0.982794 0.265519 0.223692 -0.937796 0.829120 0.491713 -0.266041 0.938339 0.345389 -0.015026 0.996736 0.033487 0.073454 0.940274 -0.310884 0.138695 0.806916 -0.556660 0.197527 0.668641 -0.692112 0.271845 0.533050 -0.743634 0.403568 0.305721 -0.648919 0.696734 -0.220987 -0.130806 0.966465 -0.593564 0.520092 0.614155 -0.654541 0.705638 0.271387 -0.713037 0.695526 0.088442 -0.818198 0.570879 -0.068184 -0.932061 0.271974 -0.239358 -0.912241 -0.155469 -0.379006 -0.769257 -0.448077 -0.455490 -0.589456 -0.495904 -0.637668 -0.090855 0.110492 -0.989716 0.600379 0.645894 -0.471557 0.796613 0.524323 -0.300821 0.951202 0.192573 -0.241101 0.971204 -0.188203 -0.146091 0.893742 -0.447272 -0.034250 0.808966 -0.581258 0.087824 0.735598 -0.625288 0.260598 0.599832 -0.519357 0.608662 0.104661 -0.046645 0.993414 -0.455308 0.487046 0.745305 -0.649151 0.627958 0.429268 -0.753741 0.598325 0.271812 -0.871853 0.462116 0.162237 -0.985975 0.158186 0.053204 -0.954557 -0.291940 -0.059930 -0.776366 -0.612734 -0.147692 -0.643133 -0.690036 -0.332009 -0.419280 -0.161428 -0.893390 0.343080 0.635194 -0.691972 0.587042 0.547997 -0.595886 0.791594 0.229541 -0.566295 0.881448 -0.148594 -0.448296 0.869450 -0.398691 -0.291723 0.845092 -0.516974 -0.136227 0.841445 -0.537591 0.054458 0.821049 -0.388973 0.417826 0.429358 0.099849 0.897598 -0.233667 0.536081 0.811182 -0.538618 0.618418 0.572232 -0.685365 0.563423 0.461335 -0.812102 0.418383 0.406751 -0.921163 0.133099 0.365710 -0.912139 -0.286005 0.293605 -0.765271 -0.617282 0.182547 -0.687986 -0.723910 -0.051279 -0.696207 -0.370035 -0.615118 0.048591 0.406335 -0.912431 0.341740 0.372199 -0.862949 0.547021 0.099725 -0.831158 0.680602 -0.225765 -0.697001 0.734431 -0.441343 -0.515584 0.771141 -0.534225 -0.346331 0.834820 -0.525298 -0.164735 0.933971 -0.319852 0.159348 0.700896 0.244188 0.670162 0.029241 0.645870 0.762887 -0.343281 0.685487 0.642080 -0.517145 0.612297 0.598041 -0.644902 0.467792 0.604378 -0.746566 0.219077 0.628208 -0.778262 -0.130241 0.614284 -0.730600 -0.445464 0.517480 -0.759323 -0.601422 0.248435 -0.882653 -0.391307 -0.260389 -0.291216 0.040226 -0.955811 0.052401 0.047405 -0.997500 0.250922 -0.155093 -0.955502 0.407207 -0.399202 -0.821474 0.516045 -0.565474 -0.643378 0.607685 -0.630999 -0.482245 0.728610 -0.598389 -0.333254 0.931815 -0.349001 -0.099598 0.882393 0.315064 0.349452 0.283337 0.758605 0.586718 -0.105400 0.795412 0.596834 -0.285044 0.723873 0.628298 -0.404225 0.594937 0.694732 -0.496139 0.392313 0.774556 -0.557794 0.121783 0.820996 -0.605641 -0.147899 0.781872 -0.757769 -0.350100 0.550651 -0.955643 -0.284878 0.074768 -0.589072 -0.256649 -0.766241 -0.249689 -0.282560 -0.926183 -0.055483 -0.429042 -0.901579 0.110649 -0.603137 -0.789925 0.255782 -0.725704 -0.638693 0.389841 -0.770778 -0.503910 0.553622 -0.729055 -0.402468 0.833520 -0.469792 -0.290756 0.962178 0.272375 0.005121 0.491372 0.813333 0.311517 0.131301 0.891971 0.432607 -0.033603 0.846112 0.531945 -0.135197 0.748456 0.649258 -0.214101 0.596586 0.773463 -0.288595 0.398109 0.870759 -0.393135 0.186430 0.900382 -0.645679 -0.030288 0.763008 -0.932637 -0.094131 0.348320 -0.799242 -0.390492 -0.456868 -0.513784 -0.503731 -0.694464 -0.332718 -0.631775 -0.700113 -0.168114 -0.767512 -0.618598 -0.005727 -0.865091 -0.501583 0.155038 -0.902881 -0.400960 0.345486 -0.870261 -0.351121 0.670798 -0.643384 -0.368900 0.948606 0.118518 -0.293430 0.633819 0.773392 -0.011722 0.334096 0.925736 0.177180 0.199603 0.924618 0.324407 0.122788 0.869869 0.477757 0.061068 0.771019 0.633878 -0.012638 0.637604 0.770261 -0.141137 0.487665 0.861547 -0.456413 0.295178 0.839379 -0.837367 0.156475 0.523767 -0.920862 -0.366985 -0.131661 -0.714394 -0.582738 -0.387373 -0.557273 -0.721038 -0.411767 -0.402868 -0.845116 -0.351391 -0.236626 -0.936022 -0.260521 -0.062861 -0.979940 -0.189117 0.138943 -0.973185 -0.183316 0.478729 -0.818809 -0.316814 0.860458 -0.115312 -0.496301 0.702811 0.629913 -0.330556 0.481301 0.867328 -0.126852 0.387895 0.920711 0.042760 0.341719 0.914778 0.215430 0.302085 0.869500 0.390787 0.239733 0.797467 0.553691 0.109736 0.713361 0.692152 -0.232545 0.583137 0.778379 -0.694442 0.431319 0.575947 -0.965097 -0.220590 0.141167 -0.845674 -0.528195 -0.076461 -0.719029 -0.688136 -0.097293 -0.579296 -0.814098 -0.040737 -0.415459 -0.908706 0.040589 -0.236384 -0.966786 0.097198 -0.034347 -0.996486 0.076387 0.291860 -0.945973 -0.141254 0.720769 -0.385801 -0.575890 0.697199 0.393939 -0.598937 0.559543 0.707041 -0.432440 0.514289 0.815163 -0.266487 0.504100 0.858841 -0.090969 0.491651 0.866043 0.090820 0.448780 0.853050 0.266275 0.332626 0.838216 0.432149 -0.007224 0.800948 0.598690 -0.530110 0.687515 0.496292 -0.948455 0.004725 0.316876 -0.912120 -0.366655 0.183308 -0.817122 -0.544588 0.189039 -0.692343 -0.672953 0.260377 -0.530602 -0.771414 0.351258 -0.345910 -0.843115 0.411708 -0.147415 -0.910080 0.387328 0.142829 -0.980977 0.131471 0.554168 -0.647047 -0.523668 0.621224 0.089703 -0.778482 0.562920 0.451370 -0.692377 0.570744 0.606196 -0.553875 0.601899 0.696344 -0.390925 0.621232 0.753389 -0.215583 0.603253 0.796391 -0.042992 0.510360 0.850603 0.126517 0.194130 0.923734 0.330195 -0.371820 0.880748 0.293315 -0.892635 0.258745 0.369125 -0.926273 -0.136481 0.351272 -0.859305 -0.317514 0.400974 -0.746343 -0.437606 0.501471 -0.580824 -0.529268 0.618481 -0.381014 -0.603881 0.700112 -0.179473 -0.696732 0.694517 0.061458 -0.887525 0.456643 0.384625 -0.854886 -0.348185 0.483700 -0.248345 -0.839261 0.492914 0.120990 -0.861625 0.558536 0.307527 -0.770367 0.637141 0.438309 -0.633985 0.691757 0.541350 -0.477924 0.700659 0.635336 -0.324692 0.634349 0.752371 -0.177592 0.352648 0.935689 0.011238 -0.245593 0.969358 -0.005377 -0.823757 0.486482 0.291136 -0.908089 0.114278 0.402883 -0.862278 -0.048257 0.504131 -0.756351 -0.141536 0.638671 -0.577887 -0.205605 0.789793 -0.344153 -0.262161 0.901571 -0.120083 -0.357096 0.926317 0.072036 -0.638686 0.766088 0.230561 -0.970194 -0.074605 0.296211 -0.575138 -0.762545 0.357936 -0.248187 -0.900159 0.489123 -0.051431 -0.870697 0.623692 0.112717 -0.773501 0.715571 0.257251 -0.649446 0.749165 0.394188 -0.532323 0.706310 0.559917 -0.433151 0.458179 0.832245 -0.312153 -0.169102 0.921426 -0.349827 -0.768462 0.632028 0.100034 -0.882508 0.331172 0.333924 -0.850155 0.210246 0.482736 -0.747672 0.163920 0.643519 -0.549538 0.153268 0.821290 -0.260174 0.140540 0.955279 0.014552 0.070126 0.997432 0.179868 -0.232114 0.955913 0.101380 -0.960043 0.260843 0.074937 -0.831985 -0.549714 0.174477 -0.599570 -0.781072 0.384401 -0.422909 -0.820600 0.587840 -0.233707 -0.774484 0.717132 -0.052434 -0.694962 0.768958 0.115400 -0.628798 0.740878 0.306715 -0.597516 0.514496 0.624663 -0.587444 -0.140068 0.728567 -0.670501 -0.744543 0.648390 -0.158893 -0.872481 0.459744 0.165568 -0.848163 0.400224 0.347046 -0.749353 0.415103 0.515907 -0.535970 0.476740 0.696746 -0.187582 0.524531 0.830470 0.151026 0.483519 0.862207 0.326790 0.245844 0.912562 0.026400 -0.787334 0.615961 -0.142106 -0.958473 -0.247255 -0.020742 -0.856350 -0.515979 0.276386 -0.739824 -0.613409 0.563064 -0.537173 -0.628016 0.727392 -0.324383 -0.604712 0.788388 -0.141339 -0.598722 0.764565 0.045778 -0.642919 0.543725 0.348189 -0.763628 -0.129491 0.421096 -0.897725 -0.748174 0.515885 -0.417251 -0.886647 0.459343 -0.053493 -0.870356 0.472948 0.137116 -0.779978 0.553388 0.292228 -0.569500 0.689128 0.448076 -0.197573 0.800897 0.565269 0.180098 0.783596 0.594594 0.377184 0.615635 0.691899 0.069443 -0.442213 0.894218 -0.283288 -0.957608 0.052291 -0.151627 -0.971781 -0.180698 0.208582 -0.933272 -0.292398 0.575881 -0.731287 -0.365485 0.768242 -0.493896 -0.407272 0.830254 -0.311454 -0.462249 0.804216 -0.156883 -0.573257 0.580081 0.065673 -0.811907 -0.093898 0.066764 -0.993341 -0.750541 0.259111 -0.607905 -0.909807 0.323892 -0.259510 -0.908120 0.409613 -0.086802 -0.834302 0.550200 0.034931 -0.648650 0.746935 0.146087 -0.309328 0.920123 0.240187 0.054608 0.952556 0.299424 0.257568 0.843651 0.471075 0.140068 -0.022266 0.989892 -0.275399 -0.901807 0.333016 -0.141459 -0.978608 0.149387 0.224877 -0.972473 0.061043 0.629940 -0.774827 -0.053081 0.836009 -0.523961 -0.162956 0.894764 -0.353397 -0.272961 0.867860 -0.247942 -0.430515 0.648534 -0.150716 -0.746116 -0.003868 -0.257102 -0.966376 -0.715651 -0.060205 -0.695859 -0.911083 0.089473 -0.402397 -0.934074 0.232827 -0.270734 -0.885735 0.420452 -0.196709 -0.739449 0.658829 -0.138416 -0.469695 0.879730 -0.073907 -0.170993 0.985173 0.014007 0.009922 0.964092 0.265383 0.060384 0.342320 0.937641 -0.133824 -0.758228 0.638108 -0.002275 -0.889697 0.456545 0.321949 -0.867333 0.379582 0.701474 -0.671337 0.239251 0.903420 -0.423429 0.067375 0.958711 -0.269859 -0.089719 0.937959 -0.214002 -0.272831 0.746360 -0.253931 -0.615195 0.141753 -0.496858 -0.856177 -0.623079 -0.374989 -0.686408 -0.864881 -0.186523 -0.466037 -0.920820 -0.008674 -0.389892 -0.904608 0.208579 -0.371724 -0.802628 0.470618 -0.366480 -0.608393 0.719634 -0.334643 -0.395600 0.886145 -0.241346 -0.266979 0.962182 0.054112 -0.131187 0.563386 0.815712 0.001151 -0.483792 0.875182 0.160305 -0.686543 0.709197 0.430560 -0.650599 0.625572 0.751968 -0.463683 0.468553 0.939596 -0.233752 0.250037 0.993747 -0.098340 0.052871 0.986465 -0.081635 -0.142207 0.849064 -0.239831 -0.470713 0.323411 -0.633392 -0.703008 -0.474028 -0.639435 -0.605327 -0.762485 -0.454540 -0.460445 -0.854073 -0.267570 -0.446055 -0.872398 -0.038587 -0.487270 -0.813425 0.233894 -0.532573 -0.685381 0.496547 -0.532630 -0.553391 0.700353 -0.450848 -0.496216 0.855577 -0.147504 -0.341489 0.660276 0.668896 0.030586 -0.182470 0.982735 0.247710 -0.418344 0.873858 0.481135 -0.381625 0.789222 0.750813 -0.208379 0.626784 0.925335 -0.000354 0.379150 0.982020 0.117475 0.147771 0.992736 0.107672 -0.053688 0.929392 -0.133713 -0.344023 0.517354 -0.669720 -0.532747 -0.282108 -0.831836 -0.477979 -0.608278 -0.683827 -0.402961 -0.731523 -0.511295 -0.451055 -0.782241 -0.286766 -0.553050 -0.762206 -0.012595 -0.647212 -0.689399 0.255444 -0.677847 -0.626901 0.477449 -0.615661 -0.651424 0.683946 -0.328428 -0.541988 0.665570 0.513095 -0.041745 0.058810 0.997396 0.234329 -0.158808 0.959098 0.450029 -0.117420 0.885261 0.685460 0.049688 0.726413 0.853054 0.242754 0.461920 0.916812 0.344852 0.201328 0.947958 0.318358 -0.004947 0.968859 0.032204 -0.245510 0.702030 -0.615444 -0.358307 -0.065076 -0.944177 -0.322948 -0.413219 -0.856648 -0.308875 -0.557444 -0.718423 -0.416083 -0.633853 -0.512783 -0.579038 -0.647747 -0.243427 -0.721919 -0.622031 0.024777 -0.782601 -0.619513 0.250660 -0.743891 -0.730482 0.477821 -0.487937 -0.722299 0.594282 0.353713 -0.181700 0.213890 0.959810 0.137115 0.049802 0.989302 0.343356 0.108235 0.932948 0.555743 0.282322 0.781949 0.721366 0.471704 0.507076 0.797527 0.560880 0.222181 0.851481 0.524238 0.012460 0.957760 0.229114 -0.173789 0.856043 -0.482265 -0.186042 0.157307 -0.975502 -0.153785 -0.192594 -0.962592 -0.190588 -0.341138 -0.872672 -0.349383 -0.431556 -0.698175 -0.571236 -0.473558 -0.439589 -0.763220 -0.489575 -0.175951 -0.854024 -0.539495 0.041702 -0.840955 -0.735323 0.258243 -0.626586 -0.868961 0.455546 0.193352 -0.356873 0.280422 0.891070 -0.018237 0.190759 0.981467 0.176567 0.277870 0.944252 0.367900 0.470751 0.801899 0.533039 0.667200 0.520301 0.627661 0.747545 0.217297 0.707984 0.706190 0.007381 0.892945 0.432933 -0.123364 0.958326 -0.284929 -0.020677 0.365202 -0.930736 0.018907 0.035675 -0.997653 -0.058444 -0.097113 -0.961460 -0.257223 -0.185270 -0.826092 -0.532210 -0.248195 -0.583796 -0.773034 -0.302013 -0.329914 -0.894396 -0.396995 -0.131423 -0.908363 -0.667877 0.044290 -0.742953 -0.964875 0.260341 0.035210 -0.538526 0.262041 0.800827 -0.206495 0.257218 0.944033 -0.031894 0.380191 0.924358 0.133436 0.599332 0.789301 0.296031 0.811386 0.504003 0.414770 0.889574 0.191371 0.525504 0.850692 -0.013019 0.776155 0.624309 -0.088439 0.990125 -0.043991 0.133107 0.540902 -0.820076 0.186816 0.253503 -0.964117 0.078833 0.155553 -0.977048 -0.145534 0.088104 -0.881871 -0.463185 0.013023 -0.660481 -0.750730 -0.074743 -0.422414 -0.903316 -0.206212 -0.252746 -0.945302 -0.532963 -0.144047 -0.833787 -0.992819 0.025676 -0.116834 -0.699839 0.166400 0.694648 -0.402497 0.247253 0.881398 -0.260370 0.407381 0.875356 -0.129888 0.654676 0.744667 0.024978 0.888192 0.458794 0.170621 0.974312 0.146986 0.313724 0.948478 -0.044356 0.612096 0.788105 -0.065038 0.938757 0.213987 0.270084 0.670039 -0.657555 0.344484 0.444666 -0.869458 0.215208 0.395146 -0.918402 -0.019923 0.364916 -0.856098 -0.365969 0.287697 -0.657917 -0.695971 0.170936 -0.441955 -0.880600 0.013362 -0.308636 -0.951086 -0.341631 -0.285884 -0.895298 -0.940223 -0.225553 -0.255159 -0.815497 0.006373 0.578727 -0.580248 0.163992 0.797758 -0.483595 0.356397 0.799448 -0.397823 0.628218 0.668640 -0.258227 0.886080 0.384942 -0.088457 0.992448 0.084982 0.083772 0.992835 -0.085213 0.407730 0.911625 -0.051929 0.800788 0.458781 0.385042 0.741732 -0.459296 0.488754 0.595629 -0.724316 0.347263 0.600244 -0.791592 0.114414 0.617387 -0.747917 -0.243831 0.548298 -0.572350 -0.609742 0.409578 -0.384442 -0.827315 0.237889 -0.292080 -0.926336 -0.111955 -0.363545 -0.924825 -0.802628 -0.464704 -0.373951 -0.865543 -0.198454 0.459838 -0.715527 0.017469 0.698366 -0.675174 0.231406 0.700422 -0.642310 0.519181 0.563816 -0.526778 0.801161 0.283983 -0.342447 0.939522 0.005271 -0.151416 0.978944 -0.136900 0.172130 0.983742 -0.051204 0.583960 0.660303 0.472218 0.747657 -0.243539 0.617817 0.694604 -0.541648 0.473437 0.751647 -0.609268 0.252626 0.817591 -0.566622 -0.102393 0.765779 -0.409960 -0.495495 0.614661 -0.255040 -0.746422 0.441622 -0.205070 -0.873451 0.131226 -0.366738 -0.921023 -0.586941 -0.662720 -0.465083 -0.837981 -0.422027 0.345949 -0.788582 -0.173921 0.589822 -0.810549 0.045997 0.583862 -0.834926 0.337153 0.435001 -0.752054 0.639533 0.159411 -0.568381 0.817628 -0.091802 -0.375310 0.904671 -0.201773 -0.080713 0.994484 -0.066987 0.307032 0.792853 0.526417 0.683486 -0.030962 0.729306 0.731781 -0.337126 0.592319 0.834217 -0.389668 0.390180 0.942031 -0.331612 0.051094 0.914316 -0.187442 -0.359015 0.763067 -0.067921 -0.642740 0.601511 -0.058370 -0.796729 0.360692 -0.294393 -0.885005 -0.311063 -0.793526 -0.523027 -0.731588 -0.636277 0.244808 -0.787731 -0.386552 0.479642 -0.871301 -0.178578 0.457104 -0.951817 0.101524 0.289374 -0.908476 0.417594 0.016963 -0.743412 0.636861 -0.204323 -0.568586 0.773005 -0.281378 -0.331415 0.937796 -0.103449 -0.002265 0.839354 0.543580 0.551178 0.155905 0.819693 0.700956 -0.129736 0.701305 0.838674 -0.155430 0.521985 0.975641 -0.069913 0.207935 0.975636 0.069920 -0.207955 0.838596 0.155487 -0.522093 0.700794 0.129832 -0.701449 0.551013 -0.155795 -0.819825 -0.002266 -0.839343 -0.543597 -0.556286 -0.814871 0.162883 -0.711439 -0.594297 0.375054 -0.848313 -0.415571 0.328126 -0.977683 -0.160447 0.135618 -0.977690 0.160440 -0.135577 -0.848387 0.415503 -0.328020 -0.711592 0.594207 -0.374906 -0.556440 0.814795 -0.162740 -0.311015 0.793510 0.523078 0.360887 0.294495 0.884891 0.601716 0.058444 0.796569 0.763190 0.067951 0.642591 0.914342 0.187426 0.358956 0.942031 0.331615 -0.051085 0.834167 0.389734 -0.390221 0.731663 0.337226 -0.592408 0.683363 0.031052 -0.729418 0.307050 -0.792801 -0.526486 -0.331258 -0.937844 0.103525 -0.568431 -0.773093 0.281449 -0.743336 -0.636935 0.204365 -0.908472 -0.417603 -0.016949 -0.951838 -0.101508 -0.289309 -0.871387 0.178548 -0.456953 -0.787881 0.386493 -0.479445 -0.731714 0.636205 -0.244619 -0.586855 0.662744 0.465157 0.131438 0.366872 0.920939 0.441877 0.205160 0.873300 0.614854 0.255071 0.746253 0.765857 0.409927 0.495401 0.817598 0.566608 0.102416 0.751599 0.609334 -0.252609 0.694493 0.541759 -0.473472 0.747552 0.243639 -0.617904 0.583965 -0.660259 -0.472275 -0.080595 -0.994491 0.067028 -0.375162 -0.904729 0.201792 -0.568303 -0.817682 0.091802 -0.752065 -0.639523 -0.159404 -0.834996 -0.337108 -0.434901 -0.810692 -0.045992 -0.583664 -0.788778 0.173896 -0.589568 -0.838108 0.421985 -0.345692 -0.802505 0.464765 0.374139 -0.111722 0.363722 0.924784 0.238207 0.292213 0.926212 0.409861 0.384501 0.827147 0.548466 0.572315 0.609623 0.617435 0.747870 0.243853 0.600204 0.791631 -0.114346 0.595519 0.724419 -0.347238 0.741634 0.459399 -0.488806 0.800763 -0.458721 -0.385166 0.172176 -0.983734 0.051205 -0.151298 -0.978966 0.136873 -0.342393 -0.939542 -0.005303 -0.526834 -0.801126 -0.283978 -0.642467 -0.519122 -0.563693 -0.675418 -0.231383 -0.700194 -0.715818 -0.017468 -0.698069 -0.865722 0.198463 -0.459498 -0.940110 0.225695 0.255449 -0.341397 0.286065 0.895330 0.013710 0.308789 0.951032 0.171295 0.442058 0.880479 0.287978 0.657915 0.695856 0.365063 0.856017 0.366012 0.395184 0.918382 0.020108 0.444640 0.869519 -0.215015 0.670020 0.657618 -0.344401 0.938704 -0.213933 -0.270310 0.407680 -0.911657 0.051758 0.083798 -0.992847 0.085045 -0.088489 -0.992436 -0.085090 -0.258372 -0.886040 -0.384937 -0.398091 -0.628178 -0.668518 -0.483952 -0.356361 -0.799248 -0.580639 -0.163937 -0.797486 -0.815754 -0.006267 -0.578366 -0.992801 -0.025367 0.117058 -0.532809 0.144344 0.833834 -0.205888 0.253028 0.945297 -0.074333 0.422640 0.903244 0.013423 0.660563 0.750650 0.088385 0.881811 0.463246 0.155686 0.976998 0.145731 0.253525 0.964127 -0.078644 0.540897 0.820092 -0.186762 0.990123 0.043735 -0.133208 0.611900 -0.788275 0.064808 0.313601 -0.948528 0.044148 0.170454 -0.974321 -0.147120 0.024697 -0.888195 -0.458802 -0.130292 -0.654728 -0.744550 -0.260860 -0.407471 -0.875169 -0.403039 -0.247334 -0.881127 -0.700269 -0.166354 -0.694226 -0.964971 -0.260058 -0.034654 -0.667741 -0.043953 0.743095 -0.396674 0.131769 0.908453 -0.301566 0.330231 0.894430 -0.247703 0.583991 0.773045 -0.184848 0.826120 0.532313 -0.096851 0.961429 0.257436 0.035779 0.997637 0.058653 0.365237 0.930723 -0.018865 0.958385 0.284757 0.020306 0.775907 -0.624664 0.088113 0.525257 -0.850848 0.012776 0.414466 -0.889685 -0.191517 0.295619 -0.811516 -0.504036 0.132916 -0.599501 -0.789260 -0.032510 -0.380358 -0.924268 -0.207201 -0.257347 -0.943843 -0.539197 -0.262019 -0.800383 -0.869235 -0.455212 -0.192908 -0.735221 -0.258023 0.626797 -0.539188 -0.041479 0.841164 -0.489138 0.176229 0.854217 -0.473043 0.439854 0.763386 -0.431055 0.698327 0.571429 -0.340757 0.872716 0.349646 -0.192355 0.962587 0.190854 0.157481 0.975460 0.153877 0.856296 0.481952 0.185688 0.892787 -0.433419 0.122797 0.707691 -0.706478 -0.007822 0.627283 -0.747785 -0.217562 0.532584 -0.667486 -0.520401 0.367373 -0.471056 -0.801962 0.175935 -0.278086 -0.944307 -0.018985 -0.190880 -0.981430 -0.357665 -0.280396 -0.890760 -0.722725 -0.593976 -0.353357 -0.730530 -0.477611 0.488071 -0.619381 -0.250406 0.744086 -0.621738 -0.024413 0.782844 -0.647288 0.243786 0.722210 -0.633316 0.512985 0.579446 -0.556975 0.718471 0.416627 -0.412865 0.856617 0.309434 -0.064789 0.944100 0.323230 0.702358 0.615353 0.357818 0.957802 -0.229564 0.172960 0.851239 -0.524613 -0.013153 0.797137 -0.561257 -0.222627 0.720923 -0.472165 -0.507277 0.555305 -0.282782 -0.782094 0.342820 -0.108541 -0.933110 0.136417 -0.049996 -0.989389 -0.182555 -0.214008 -0.959622 -0.542534 -0.665480 -0.512633 -0.651466 -0.683853 0.328538 -0.626836 -0.477296 0.615846 -0.689217 -0.255087 0.678167 -0.761828 0.013036 0.647648 -0.781699 0.287081 0.553652 -0.730957 0.511429 0.451821 -0.607748 0.683837 0.403744 -0.281556 0.831748 0.478458 0.518114 0.669429 0.532374 0.969131 -0.032747 0.244362 0.947783 -0.318892 0.003903 0.916438 -0.345417 -0.202059 0.852652 -0.243389 -0.462327 0.685100 -0.050219 -0.726716 0.449512 0.117169 -0.885557 0.233575 0.158688 -0.959302 -0.042763 -0.059075 -0.997337 -0.341889 -0.660375 -0.668593 -0.496004 -0.855720 0.147388 -0.553183 -0.700521 0.450841 -0.685213 -0.496472 0.532915 -0.813152 -0.233602 0.533117 -0.871962 0.038884 0.488026 -0.853552 0.267744 0.446947 -0.761933 0.454580 0.461319 -0.473428 0.639362 0.605873 0.324208 0.633328 0.702698 0.929897 0.133273 0.342825 0.992737 -0.108258 0.052477 0.981802 -0.118144 -0.148684 0.925108 -0.000380 -0.379703 0.750644 0.207889 -0.627149 0.480684 0.381620 -0.789499 0.246899 0.418537 -0.873996 0.029545 0.182277 -0.982803 -0.131017 -0.563627 -0.815573 -0.266204 -0.962374 -0.054512 -0.395065 -0.886499 0.240921 -0.608198 -0.719786 0.334668 -0.802472 -0.470496 0.366978 -0.904286 -0.208441 0.372585 -0.920361 0.008666 0.390973 -0.864315 0.186356 0.467152 -0.622376 0.374702 0.687202 0.142621 0.496775 0.856081 0.849746 0.239747 0.469524 0.986691 0.081376 0.140779 0.993726 0.097915 -0.054053 0.939546 0.233172 -0.250765 0.751988 0.463361 -0.468839 0.430093 0.650934 -0.625543 0.159245 0.687127 -0.708871 0.000058 0.483911 -0.875117 0.060777 -0.341669 -0.937853 0.011196 -0.963896 -0.266042 -0.170112 -0.985310 -0.015009 -0.469387 -0.879930 0.073476 -0.739377 -0.658849 0.138711 -0.885549 -0.420453 0.197540 -0.933715 -0.232958 0.271858 -0.910531 -0.089760 0.403579 -0.714821 0.059748 0.696750 -0.002698 0.256771 0.966469 0.747235 0.253957 0.614122 0.938388 0.213987 0.271361 0.958873 0.269713 0.088423 0.903497 0.423134 -0.068198 0.701550 0.671213 -0.239374 0.321490 0.867744 -0.379031 -0.003330 0.890212 -0.455534 -0.134596 0.758365 -0.637782 0.141016 0.023422 -0.989730 0.258919 -0.842854 -0.471761 0.055589 -0.952043 -0.300872 -0.308878 -0.920034 -0.241107 -0.648582 -0.746990 -0.146112 -0.834229 -0.550350 -0.034289 -0.907898 -0.409899 0.087771 -0.909363 -0.324319 0.260531 -0.749771 -0.259712 0.608599 -0.092816 -0.067293 0.993407 0.649442 0.150713 0.745326 0.868416 0.248102 0.429300 0.895055 0.353515 0.271853 0.836150 0.523950 0.162266 0.629992 0.774777 0.053196 0.224547 0.972616 -0.059973 -0.142229 0.978738 -0.147794 -0.275727 0.901984 -0.332263 0.070641 0.443371 -0.893550 0.378661 -0.614741 -0.691888 0.181184 -0.782429 -0.595799 -0.196962 -0.800334 -0.566278 -0.569408 -0.689060 -0.448297 -0.779988 -0.553625 -0.291751 -0.870237 -0.473406 -0.136287 -0.886275 -0.459955 0.054382 -0.747400 -0.516590 0.417765 -0.128320 -0.421733 0.897594 0.581008 -0.065650 0.811246 0.804815 0.157273 0.572309 0.830582 0.311847 0.461394 0.768366 0.494108 0.406780 0.575851 0.731195 0.365718 0.208330 0.932951 0.293599 -0.152137 0.971362 0.182511 -0.283254 0.957679 -0.051167 0.027127 0.788134 -0.614905 0.328045 -0.245566 -0.912186 0.151830 -0.482159 -0.862827 -0.186970 -0.523675 -0.831148 -0.535798 -0.476566 -0.696997 -0.749429 -0.415386 -0.515569 -0.848204 -0.400765 -0.346319 -0.872294 -0.460402 -0.164724 -0.743922 -0.648987 0.159365 -0.138891 -0.729093 0.670173 0.544710 -0.348198 0.762921 0.765260 -0.045375 0.642120 0.788808 0.141777 0.598064 0.727553 0.324635 0.604383 0.563006 0.537008 0.628209 0.276278 0.739126 0.614298 -0.020691 0.855426 0.517512 -0.141476 0.958235 0.248537 0.102454 0.960061 -0.260357 0.180449 0.232063 -0.955816 0.014840 -0.069058 -0.997502 -0.259778 -0.139744 -0.955503 -0.549318 -0.153060 -0.821476 -0.747737 -0.164197 -0.643372 -0.850307 -0.210806 -0.482224 -0.882525 -0.331837 -0.333218 -0.768136 -0.632499 -0.099562 -0.168307 -0.921714 0.349450 0.515340 -0.624678 0.586687 0.741581 -0.306414 0.596798 0.769440 -0.115065 0.628269 0.717354 0.052614 0.694719 0.587813 0.233518 0.774561 0.384342 0.422158 0.821014 0.174725 0.598414 0.781903 0.075706 0.831269 0.550691 0.231129 0.970047 0.074752 0.072267 0.638506 -0.766216 -0.119883 0.357560 -0.926163 -0.343837 0.262597 -0.901565 -0.577663 0.205750 -0.789920 -0.756371 0.141329 -0.638693 -0.862437 0.047761 -0.503906 -0.908195 -0.114934 -0.402458 -0.823615 -0.486955 -0.290747 -0.245192 -0.969461 0.005119 0.458712 -0.832193 0.311508 0.706847 -0.559673 0.432589 0.749576 -0.393936 0.531931 0.715790 -0.257129 0.649253 0.623706 -0.112864 0.773468 0.489055 0.050883 0.870767 0.358010 0.247252 0.900386 0.296614 0.574327 0.762999 0.384799 0.854752 0.348321 0.061436 0.887421 -0.456847 -0.179360 0.696825 -0.694453 -0.380776 0.604030 -0.700113 -0.580629 0.529341 -0.618602 -0.746334 0.437496 -0.501580 -0.859449 0.317161 -0.400945 -0.926422 0.135919 -0.351095 -0.892593 -0.259244 -0.368878 -0.371646 -0.880784 -0.293427 0.352894 -0.935590 -0.011724 0.634681 -0.752188 0.177181 0.700950 -0.635157 0.324414 0.691937 -0.541260 0.477766 0.637190 -0.438385 0.633882 0.558510 -0.307850 0.770256 0.492921 -0.121598 0.861535 0.483859 0.247686 0.839364 0.554190 0.646960 0.523752 0.142572 0.980990 -0.131653 -0.147510 0.910047 -0.387369 -0.345824 0.843120 -0.411771 -0.530465 0.771443 -0.351401 -0.692306 0.672932 -0.260528 -0.817224 0.544410 -0.189113 -0.912278 0.366265 -0.183299 -0.948480 -0.005188 -0.316795 -0.530106 -0.687521 -0.496289 0.194112 -0.923606 -0.330563 0.510475 -0.850483 -0.126861 0.603411 -0.796283 0.042760 0.621363 -0.753323 0.215437 0.601973 -0.696354 0.390794 0.570778 -0.606333 0.553690 0.562949 -0.451696 0.692141 0.621311 -0.090161 0.778360 0.720750 0.385785 0.575925 0.291496 0.946103 0.141135 -0.034612 0.996469 -0.076491 -0.236444 0.966760 -0.097313 -0.415391 0.908730 -0.040748 -0.579231 0.814153 0.040578 -0.719056 0.688124 0.097180 -0.845792 0.528019 0.076362 -0.965158 0.220255 -0.141276 -0.694519 -0.431301 -0.575867 -0.007462 -0.800782 -0.598910 0.332524 -0.838118 -0.432419 0.448797 -0.852979 -0.266474 0.491728 -0.865985 -0.090959 0.504197 -0.858798 0.090833 0.514382 -0.815167 0.266296 0.559609 -0.707150 0.432177 0.697254 -0.394189 0.598708 0.860453 0.115319 0.496308 0.478326 0.819032 0.316844 0.138541 0.973252 0.183268 -0.063058 0.979948 0.189010 -0.236624 0.936067 0.260359 -0.402772 0.845223 0.351244 -0.557215 0.721128 0.411687 -0.714458 0.582712 0.387293 -0.920972 0.366795 0.131427 -0.837425 -0.156419 -0.523691 -0.232925 -0.582874 -0.778462 0.109438 -0.713213 -0.692351 0.239613 -0.797390 -0.553854 0.302107 -0.869435 -0.390914 0.341839 -0.914698 -0.215576 0.388063 -0.920630 -0.042982 0.481448 -0.867293 0.126534 0.702890 -0.630002 0.330217 0.948653 -0.118381 0.293332 0.670390 0.643668 0.369146 0.344933 0.870410 0.351294 0.154668 0.902931 0.400991 -0.005819 0.865155 0.501471 -0.167962 0.767653 0.618465 -0.332488 0.631921 0.700091 -0.513676 0.503792 0.694500 -0.799368 0.390515 0.456628 -0.932654 0.094347 -0.348218 -0.456897 -0.294699 -0.839284 -0.141651 -0.487343 -0.861645 -0.012925 -0.637455 -0.770379 0.061024 -0.770936 -0.633983 0.122944 -0.869763 -0.477910 0.199882 -0.924464 -0.324675 0.334388 -0.925553 -0.177583 0.633998 -0.773253 0.011241 0.962289 -0.271977 -0.005372 0.833202 0.470123 0.291134 0.553029 0.729270 0.402895 0.389351 0.770873 0.504143 0.255603 0.725778 0.638681 0.110890 0.603249 0.789807 -0.054947 0.429091 0.901588 -0.249174 0.282497 0.926341 -0.589072 0.256924 0.766149 -0.955492 0.285426 -0.074616 -0.646141 0.031014 -0.762587 -0.393861 -0.185910 -0.900173 -0.289074 -0.397894 -0.870699 -0.214208 -0.596502 -0.773499 -0.134980 -0.748333 -0.649444 -0.033181 -0.845892 -0.532321 0.131785 -0.891638 -0.433145 0.491694 -0.812902 -0.312134 0.882535 -0.314260 -0.349819 0.931578 0.349497 0.100067 0.728040 0.598697 0.333946 0.607134 0.631148 0.482743 0.515774 0.565562 0.643519 0.407486 0.399279 0.821299 0.251779 0.154992 0.955293 0.053435 -0.047762 0.997428 -0.290972 -0.039780 0.955904 -0.882106 0.392248 0.260826 -0.757988 0.351109 -0.549706 -0.606505 0.148656 -0.781059 -0.558464 -0.121495 -0.820584 -0.496310 -0.392257 -0.774475 -0.403960 -0.594830 -0.694977 -0.284523 -0.723612 -0.628834 -0.104800 -0.794947 -0.597558 0.283737 -0.757872 -0.587472 0.701025 -0.242922 -0.670487 0.933791 0.320635 -0.158832 0.834365 0.525738 0.165632 0.770656 0.534429 0.347096 0.734138 0.441416 0.515939 0.680835 0.225810 0.696759 0.548044 -0.099787 0.830476 0.343227 -0.372526 0.862218 0.049452 -0.405856 0.912598 -0.695046 0.370731 0.616011 -0.758994 0.602343 -0.247208 -0.731251 0.446178 -0.515943 -0.778902 0.130575 -0.613401 -0.746728 -0.219047 -0.628026 -0.644592 -0.467760 -0.604733 -0.516560 -0.612099 -0.598749 -0.342600 -0.685014 -0.642947 0.029712 -0.644947 -0.763649 0.429427 -0.098401 -0.897725 0.820862 0.390005 -0.417230 0.841126 0.538191 -0.053456 0.844756 0.517277 0.137153 0.869227 0.398788 0.292254 0.881551 0.148642 0.448077 0.792402 -0.229357 0.565238 0.588583 -0.547812 0.594535 0.344591 -0.634542 0.691819 -0.417620 0.161239 0.894201 -0.687617 0.724188 0.052301 -0.765740 0.617257 -0.180652 -0.912522 0.286042 -0.292376 -0.921250 -0.133071 -0.365500 -0.811835 -0.418363 -0.407304 -0.684839 -0.563282 -0.462287 -0.537957 -0.618009 -0.573295 -0.233155 -0.535174 -0.811928 0.104836 0.048114 -0.993325 0.599617 0.520594 -0.607817 0.735323 0.626094 -0.259435 0.808744 0.581729 -0.086751 0.893629 0.447443 0.034962 0.971191 0.188255 0.146113 0.951520 -0.192082 0.240239 0.797781 -0.523262 0.299571 0.602017 -0.644410 0.471499 -0.089211 -0.111296 0.989775 -0.643503 0.689126 0.333182 -0.776985 0.611519 0.149465 -0.954673 0.291333 0.061025 -0.985988 -0.158142 -0.053093 -0.871734 -0.462080 -0.162979 -0.753331 -0.598300 -0.273000 -0.648505 -0.627749 -0.430550 -0.454650 -0.486370 -0.746149 -0.220810 0.131545 -0.966405 0.305610 0.649781 -0.695979 0.532957 0.744277 -0.402504 0.668616 0.692537 -0.270823 0.806956 0.556872 -0.196762 0.940277 0.310991 -0.138434 0.996717 -0.033059 -0.073904 0.938710 -0.344421 0.014054 0.830001 -0.490534 0.265473 0.265994 -0.222247 0.938005 -0.589748 0.494450 0.638527 -0.769496 0.446502 0.456630 -0.912122 0.154672 0.379619 -0.932117 -0.271837 0.239294 -0.818419 -0.570648 0.067455 -0.713075 -0.695341 -0.089587 -0.654337 -0.705335 -0.272665 -0.593142 -0.519534 -0.615034 -0.501139 0.125811 -0.856172 -0.013077 0.727026 -0.686486 0.271052 0.842167 -0.466139 0.453005 0.801696 -0.389961 0.632983 0.679066 -0.371755 0.808883 0.459784 -0.366479 0.927426 0.167056 -0.334623 0.965217 -0.100580 -0.241331 0.966718 -0.250063 0.054071 0.553600 -0.168391 0.815580 -0.419665 0.241289 0.875021 -0.674728 0.204766 0.709093 -0.778757 -0.047431 0.625530 -0.777561 -0.419391 0.468519 -0.672252 -0.696820 0.250038 -0.582127 -0.811374 0.052909 -0.564072 -0.813394 -0.142170 -0.632357 -0.615267 -0.470713 -0.710228 0.036630 -0.703018 -0.316732 0.730261 -0.605309 -0.012383 0.887615 -0.460420 0.195331 0.873442 -0.446032 0.402802 0.774814 -0.487252 0.609292 0.587492 -0.532556 0.772729 0.345271 -0.532614 0.883231 0.129064 -0.450828 0.989064 0.001936 -0.147474 0.742546 -0.034407 0.668911 -0.173305 0.064735 0.982738 -0.486149 -0.005361 0.873860 -0.571070 -0.225865 0.789217 -0.555878 -0.546032 0.626776 -0.462984 -0.801189 0.379132 -0.389274 -0.909196 0.147744 -0.403110 -0.913574 -0.053714 -0.580478 -0.738025 -0.344041 -0.838692 -0.113121 -0.532728 -0.579353 0.660267 -0.477909 -0.288094 0.868719 -0.402901 -0.077046 0.889180 -0.451023 0.142779 0.820826 -0.553045 0.370214 0.666375 -0.647214 0.565936 0.469305 -0.677842 0.726943 0.304191 -0.615647 0.918032 0.222189 -0.328405 0.847385 0.136587 0.513111 0.071788 0.006739 0.997397 -0.254719 -0.123522 0.959094 -0.326730 -0.330999 0.885261 -0.299719 -0.618454 0.726418 -0.216284 -0.860161 0.461892 -0.159707 -0.966431 0.201257 -0.198201 -0.980148 -0.005033 -0.456480 -0.855170 -0.245582 -0.883932 -0.300403 -0.358361 -0.785175 0.528392 -0.322958 -0.535309 0.786156 -0.308875 -0.343487 0.841958 -0.416082 -0.127184 0.805320 -0.579037 0.113041 0.682679 -0.721922 0.332463 0.526303 -0.782607 0.526828 0.411180 -0.743897 0.779037 0.393705 -0.487953 0.875815 0.328401 0.353696 0.276102 0.050418 0.959805 -0.025421 -0.143646 0.989303 -0.077938 -0.351465 0.932951 -0.033369 -0.622432 0.781963 0.047834 -0.860557 0.507104 0.086996 -0.971108 0.222217 0.028298 -0.999521 0.012501 -0.280414 -0.944022 -0.173753 -0.845735 -0.500145 -0.185974 -0.923455 0.351525 -0.153820 -0.737326 0.648082 -0.190628 -0.585187 0.731760 -0.349404 -0.388865 0.722811 -0.571251 -0.143907 0.629882 -0.763243 0.092441 0.511915 -0.854048 0.305902 0.446306 -0.840973 0.591338 0.507643 -0.626593 0.828967 0.524790 0.193413 0.421227 0.168880 0.891093 0.174278 -0.079554 0.981478 0.152344 -0.291835 0.944258 0.223741 -0.553992 0.801893 0.311301 -0.795223 0.520301 0.333553 -0.917338 0.217333 0.257561 -0.966233 0.007440 -0.071593 -0.989783 -0.123307 -0.725898 -0.687492 -0.020650 -0.988641 0.149097 0.018955 -0.881837 0.467924 -0.058397 -0.784114 0.564817 -0.257190 -0.622808 0.573481 -0.532194 -0.381514 0.506830 -0.773027 -0.134744 0.426501 -0.894394 0.084641 0.409522 -0.908365 0.372256 0.556253 -0.742973 0.707929 0.705414 0.035041 0.496247 0.335417 0.800771 0.326045 0.050269 0.944017 0.345229 -0.162434 0.924355 0.452337 -0.415188 0.789309 0.554694 -0.662035 0.504008 0.563049 -0.803966 0.191350 0.474022 -0.880416 -0.013061 0.152679 -0.984307 -0.088477 -0.533088 -0.835537 0.133022 -0.980663 -0.058426 0.186780 -0.961716 0.262485 0.078764 -0.923922 0.353783 -0.145621 -0.807758 0.364623 -0.463225 -0.578536 0.318992 -0.750693 -0.328535 0.276017 -0.903260 -0.115871 0.305073 -0.945254 0.141671 0.533688 -0.833730 0.518631 0.846984 -0.116786 0.494123 0.522846 0.694604 0.415474 0.224896 0.881365 0.483045 0.021753 0.875326 0.631924 -0.214864 0.744651 0.756706 -0.465715 0.458810 0.758477 -0.634903 0.147009 0.664563 -0.745916 -0.044339 0.376498 -0.924133 -0.065025 -0.284120 -0.919962 0.270084 -0.904502 -0.251535 0.344393 -0.975329 0.049614 0.215110 -0.992931 0.116999 -0.020000 -0.923842 0.112037 -0.366009 -0.713589 0.079826 -0.696001 -0.468150 0.072962 -0.880632 -0.273881 0.142750 -0.951111 -0.076686 0.438804 -0.895304 0.274773 0.927086 -0.254971 0.413221 0.702990 0.578838 0.432087 0.420456 0.797820 0.550411 0.240558 0.799487 0.742955 0.030363 0.668652 0.896466 -0.219458 0.384950 0.903693 -0.419652 0.085037 0.817916 -0.569007 -0.085114 0.585558 -0.808973 -0.051812 -0.003154 -0.922856 0.385132 -0.768637 -0.412695 0.488754 -0.925089 -0.153634 0.347284 -0.985660 -0.123992 0.114459 -0.956420 -0.160690 -0.243801 -0.769804 -0.188664 -0.609761 -0.537670 -0.162511 -0.827346 -0.371827 -0.060029 -0.926359 -0.258809 0.278660 -0.924860 -0.001075 0.927381 -0.374116 0.260860 0.848821 0.459843 0.372835 0.610946 0.698383 0.537953 0.469028 0.700442 0.770765 0.296665 0.563836 0.957212 0.055610 0.283993 0.984871 -0.173211 0.005277 0.923490 -0.358365 -0.136897 0.765866 -0.640958 -0.051208 0.279815 -0.835858 0.472277 -0.584767 -0.525568 0.617921 -0.816368 -0.330613 0.473539 -0.903465 -0.346270 0.252682 -0.899513 -0.424725 -0.102398 -0.737974 -0.458162 -0.495461 -0.528356 -0.404748 -0.746337 -0.398637 -0.279861 -0.873365 -0.383413 0.069816 -0.920934 -0.280412 0.839624 -0.465189 0.053638 0.936778 0.345790 0.243822 0.769926 0.589715 0.445201 0.678951 0.583799 0.709460 0.554486 0.434985 0.929883 0.331536 0.159381 0.992269 0.083383 -0.091920 0.971076 -0.127358 -0.201971 0.901581 -0.427358 -0.067212 0.533353 -0.662436 0.526035 -0.368477 -0.576546 0.729259 -0.657810 -0.465282 0.592283 -0.754557 -0.527672 0.390135 -0.758200 -0.650020 0.051065 -0.619476 -0.698087 -0.359058 -0.440305 -0.626819 -0.642829 -0.351204 -0.491648 -0.796830 -0.435193 -0.165089 -0.885072 -0.531837 0.666393 -0.522561 -0.185205 0.951668 0.245003 0.059126 0.875400 0.479770 0.281019 0.843810 0.457178 0.563863 0.773503 0.289399 0.815897 0.577947 0.017001 0.923245 0.325427 -0.204247 0.953756 0.105999 -0.281271 0.977886 -0.181827 -0.103337 0.727804 -0.417672 0.543922 -0.140549 -0.555450 0.819586 -0.462841 -0.542332 0.701181 -0.553946 -0.648670 0.521891 -0.548370 -0.809978 0.207911 -0.427267 -0.879881 -0.207971 -0.284565 -0.803981 -0.522147 -0.237802 -0.671819 -0.701506 -0.410237 -0.399340 -0.819898 -0.725572 0.421463 -0.543980 -0.427657 0.889120 0.163017 -0.159092 0.913192 0.375194 0.064172 0.942415 0.328231 0.349883 0.926917 0.135669 0.627809 0.766473 -0.135557 0.784049 0.526988 -0.327948 0.870438 0.319190 -0.374773 0.983883 0.074511 -0.162552 0.842748 -0.127445 0.523005 0.074518 -0.459717 0.884934 -0.250318 -0.550237 0.796605 -0.322807 -0.694868 0.642615 -0.294893 -0.885546 0.358951 -0.183846 -0.981627 -0.051080 -0.079598 -0.917296 -0.390169 -0.073850 -0.802296 -0.592341 -0.314879 -0.607360 -0.729360 -0.840151 0.130532 -0.526410 -0.646531 0.755847 0.103402 -0.385259 0.878879 0.281331 -0.179898 0.962239 0.204288 0.092596 0.995559 -0.016969 0.388031 0.875064 -0.289301 0.590358 0.665330 -0.456961 0.728683 0.489006 -0.479473 0.916838 0.315506 -0.244673 0.867384 0.176833 0.465162 0.251998 -0.297276 0.920936 -0.043279 -0.485267 0.873294 -0.086549 -0.660024 0.746242 -0.027940 -0.868223 0.495387 0.081885 -0.991367 0.102405 0.151892 -0.955571 -0.252614 0.121929 -0.872328 -0.473474 -0.162775 -0.769217 -0.617907 -0.863796 -0.175570 -0.472262 -0.820938 0.567070 0.067030 -0.595919 0.777279 0.201788 -0.423962 0.901016 0.091800 -0.177788 0.971074 -0.159396 0.125577 0.891687 -0.434884 0.365540 0.725081 -0.583642 0.545014 0.596155 -0.589542 0.784527 0.514817 -0.345661 0.803702 0.462599 0.374253 0.370755 -0.085088 0.924825 0.133865 -0.352353 0.926244 0.127988 -0.547161 0.827185 0.221383 -0.761137 0.609639 0.338965 -0.908658 0.243810 0.385477 -0.915598 -0.114402 0.329605 -0.877934 -0.347265 0.027018 -0.871972 -0.488809 -0.797638 -0.464113 -0.385192 -0.938021 0.342776 0.051196 -0.772150 0.620526 0.136862 -0.642458 0.766303 -0.005307 -0.430365 0.856821 -0.283977 -0.128314 0.815948 -0.563706 0.137374 0.700589 -0.700217 0.342839 0.628590 -0.698095 0.604785 0.650446 -0.459517 0.665576 0.701322 0.255257 0.418441 0.152670 0.895321 0.260556 -0.166219 0.951042 0.297181 -0.369333 0.880498 0.425774 -0.578330 0.695881 0.558795 -0.744154 0.366036 0.597749 -0.801430 0.020133 0.530699 -0.819840 -0.214991 0.234492 -0.909073 -0.344382 -0.654597 -0.705998 -0.270314 -0.993367 0.102708 0.051711 -0.901744 0.423829 0.085011 -0.815243 0.572832 -0.085105 -0.638169 0.666758 -0.384934 -0.345006 0.658829 -0.668517 -0.066678 0.597268 -0.799266 0.148302 0.584777 -0.797523 0.402402 0.709557 -0.578448 0.474425 0.872471 0.117117 0.391491 0.389225 0.833810 0.322178 0.051751 0.945263 0.403269 -0.146990 0.903199 0.565386 -0.341931 0.750614 0.719456 -0.517457 0.463273 0.768226 -0.623352 0.145811 0.708162 -0.701666 -0.078563 0.439730 -0.878508 -0.186709 -0.457208 -0.879327 -0.133208 -0.988622 -0.135761 0.064774 -0.978246 0.202705 0.044117 -0.928999 0.339571 -0.147145 -0.781530 0.422730 -0.458813 -0.501867 0.440216 -0.744540 -0.222478 0.429673 -0.875149 -0.012717 0.472752 -0.881104 0.206041 0.689677 -0.694185 0.257219 0.965737 -0.034505 0.295690 0.600221 0.743170 0.312316 0.277636 0.908503 0.436663 0.096058 0.894482 0.629581 -0.077473 0.773062 0.807922 -0.253000 0.532215 0.881095 -0.396871 0.257226 0.846102 -0.529810 0.058414 0.623406 -0.781667 -0.019033 -0.232807 -0.972308 0.020446 -0.928966 -0.359493 0.088245 -0.999485 -0.029381 0.012901 -0.977735 0.085946 -0.191437 -0.850603 0.149761 -0.504030 -0.585590 0.184644 -0.789298 -0.313059 0.218328 -0.924298 -0.119173 0.308098 -0.943861 0.042766 0.597966 -0.800380 0.040451 0.980318 -0.193239 0.144190 0.765813 0.626689 0.233696 0.487765 0.841113 0.397187 0.335569 0.854187 0.617412 0.189817 0.763395 0.820266 0.024226 0.571470 0.926173 -0.141156 0.349683 0.929831 -0.314611 0.190877 0.766123 -0.624005 0.153858 -0.010306 -0.982588 0.185512 -0.821622 -0.556627 0.122899 -0.965642 -0.259763 -0.007715 -0.961246 -0.169451 -0.217468 -0.844385 -0.127569 -0.520326 -0.591684 -0.082710 -0.801916 -0.328859 -0.013420 -0.944284 -0.155895 0.111765 -0.981430 -0.064086 0.449788 -0.890833 -0.153114 0.922950 -0.353157 -0.048266 0.871457 0.488092 0.092987 0.661601 0.744068 0.289882 0.550625 0.782803 0.534857 0.438647 0.722161 0.760904 0.291969 0.579465 0.900643 0.123131 0.416749 0.948226 -0.070757 0.309615 0.849919 -0.415982 0.323413 0.181473 -0.915945 0.357929 -0.677722 -0.714725 0.172803 -0.879924 -0.474927 -0.013321 -0.884592 -0.409727 -0.222758 -0.769330 -0.388245 -0.507343 -0.522557 -0.339487 -0.782102 -0.265462 -0.242570 -0.933107 -0.111580 -0.093065 -0.989388 -0.094135 0.265226 -0.959580 -0.305029 0.802589 -0.512649 -0.266542 0.906091 0.328564 -0.100005 0.781468 0.615878 0.123626 0.724400 0.678205 0.392177 0.653232 0.647677 0.639499 0.533410 0.553638 0.808443 0.377275 0.451755 0.896145 0.184368 0.403648 0.861136 -0.172065 0.478370 0.320683 -0.783429 0.532355 -0.512981 -0.822874 0.244397 -0.750102 -0.661310 0.003948 -0.757393 -0.620920 -0.202026 -0.637128 -0.616709 -0.462319 -0.386041 -0.568190 -0.726727 -0.123274 -0.447854 -0.885568 0.020658 -0.281608 -0.959307 -0.029751 0.066582 -0.997337 -0.400991 0.626268 -0.668577 -0.493089 0.857403 0.147386 -0.330078 0.829335 0.450835 -0.087338 0.841654 0.532909 0.204272 0.821011 0.533117 0.469627 0.735707 0.488043 0.658603 0.605352 0.446980 0.774595 0.432603 0.461364 0.790394 0.090366 0.605898 0.386504 -0.597382 0.702673 -0.349445 -0.871981 0.342836 -0.590072 -0.805644 0.052474 -0.593190 -0.791213 -0.148688 -0.462887 -0.800979 -0.379695 -0.195302 -0.754028 -0.627135 0.090173 -0.607101 -0.789492 0.239081 -0.423081 -0.873981 0.143170 -0.116739 -0.982789 -0.422418 0.395318 -0.815651 -0.700309 0.711756 -0.054507 -0.570167 0.785405 0.240933 -0.319223 0.886613 0.334685 -0.006194 0.930203 0.366993 0.271662 0.887336 0.372606 0.467716 0.792690 0.391006 0.593568 0.655294 0.467190 0.635676 0.351568 0.687253 0.358736 -0.372032 0.856097 -0.217312 -0.855807 0.469436 -0.422899 -0.895187 0.140701 -0.412080 -0.909539 -0.054112 -0.267839 -0.930247 -0.250804 0.025295 -0.882906 -0.468869 0.348646 -0.697932 -0.625569 0.515368 -0.481502 -0.708909 0.418900 -0.242009 -0.875188 -0.326254 0.118261 -0.937855 -0.840214 0.472425 -0.266185 -0.768162 0.640079 -0.015051 -0.527348 0.846468 0.073461 -0.200925 0.969739 0.138690 0.078681 0.977141 0.197496 0.265213 0.925093 0.271782 0.377679 0.833408 0.403473 0.409307 0.589196 0.696647 0.223787 -0.125989 0.966460 -0.153821 -0.774039 0.614168 -0.284048 -0.919589 0.271429 -0.245997 -0.965222 0.088497 -0.085366 -0.994016 -0.068151 0.230523 -0.943166 -0.239368 0.590684 -0.712329 -0.379051 0.772461 -0.442386 -0.455629 0.723810 -0.262793 -0.637996 -0.051107 -0.134360 -0.989614 -0.859473 0.197015 -0.471689 -0.852381 0.427723 -0.300832 -0.642383 0.727461 -0.241133 -0.322633 0.935173 -0.146151 -0.059540 0.997635 -0.034354 0.098898 0.991227 0.087679 0.173733 0.949734 0.260427 0.149929 0.779261 0.608502 -0.011753 0.114196 0.993389 -0.194102 -0.637708 0.745421 -0.219270 -0.876087 0.429408 -0.141329 -0.951878 0.271945 0.035678 -0.986092 0.162328 0.355956 -0.932985 0.053235 0.730102 -0.680703 -0.059944 0.918842 -0.365919 -0.147756 0.919227 -0.211762 -0.331930 0.349232 -0.282457 -0.893451 -0.722174 -0.020929 -0.691395 -0.768436 0.233949 -0.595629 -0.594770 0.570620 -0.566252 -0.312054 0.837655 -0.448282 -0.089484 0.952308 -0.291723 0.025047 0.990357 -0.136254 0.044662 0.997519 0.054423 -0.073839 0.905529 0.417810 -0.301156 0.321889 0.897604 -0.347249 -0.470391 0.811265 -0.266042 -0.775665 0.572333 -0.145080 -0.875250 0.461400 0.043799 -0.912478 0.406775 0.345290 -0.864305 0.365721 0.703814 -0.646863 0.293623 0.917370 -0.353689 0.182582 0.971094 -0.233189 -0.050986 0.669267 -0.417415 -0.614691 -0.376599 -0.161190 -0.912245 -0.493357 0.109707 -0.862881 -0.359984 0.423807 -0.831144 -0.144831 0.702310 -0.696982 0.014965 0.856740 -0.515532 0.077029 0.934977 -0.346242 0.037435 0.985647 -0.164617 -0.190080 0.968732 0.159463 -0.562033 0.484744 0.670181 -0.573960 -0.297704 0.762851 -0.421963 -0.640103 0.642040 -0.271636 -0.754060 0.598003 -0.082625 -0.792422 0.604352 0.183569 -0.756085 0.628202 0.501915 -0.608857 0.614308 0.751060 -0.409929 0.517559 0.900500 -0.356802 0.248580 0.780033 -0.568905 -0.260570 0.111056 -0.272168 -0.955820 -0.066984 0.021865 -0.997514 0.009004 0.294955 -0.955469 0.142138 0.552272 -0.821457 0.231674 0.729651 -0.643379 0.242614 0.841780 -0.482229 0.153938 0.930199 -0.333216 -0.163617 0.981487 -0.099559 -0.714028 0.606670 0.349450 -0.798685 -0.133957 0.586650 -0.636202 -0.489029 0.596739 -0.484416 -0.608832 0.628223 -0.313132 -0.647565 0.694699 -0.091654 -0.625822 0.774562 0.173459 -0.543930 0.821007 0.430878 -0.450580 0.781870 0.682017 -0.481333 0.550609 0.724531 -0.685178 0.074738 0.516840 -0.381890 -0.766183 0.369588 -0.074991 -0.926165 0.399334 0.166468 -0.901566 0.467029 0.397400 -0.789910 0.500599 0.584368 -0.638682 0.472604 0.722995 -0.503908 0.354595 0.843963 -0.402478 -0.009872 0.956739 -0.290781 -0.716977 0.697078 0.005124 -0.950041 0.018841 0.311555 -0.838098 -0.332299 0.432631 -0.715935 -0.452168 0.531960 -0.580569 -0.491319 0.649266 -0.409588 -0.483718 0.773469 -0.200438 -0.448992 0.870765 0.035176 -0.433687 0.900376 0.349145 -0.544038 0.762968 0.547833 -0.760609 0.348358 0.737826 -0.496900 -0.456841 0.693138 -0.193073 -0.694465 0.713474 0.027745 -0.700132 0.748728 0.238165 -0.618614 0.752054 0.427599 -0.501572 0.704403 0.585732 -0.400917 0.580929 0.734355 -0.351061 0.221785 0.902639 -0.368854 -0.576964 0.762242 -0.293426 -0.986690 0.162187 -0.011729 -0.968756 -0.173540 0.177186 -0.900538 -0.289445 0.324426 -0.814714 -0.328594 0.477774 -0.698254 -0.332634 0.633874 -0.545881 -0.329785 0.770231 -0.351798 -0.366123 0.861506 -0.027457 -0.542903 0.839347 0.283220 -0.803446 0.523699 0.778295 -0.613934 -0.131691 0.861884 -0.327237 -0.387392 0.903075 -0.122043 -0.411778 0.933320 0.073678 -0.351404 0.928931 0.263072 -0.260537 0.880096 0.435500 -0.189130 0.773355 0.606889 -0.183324 0.469768 0.823984 -0.316811 -0.330306 0.802885 -0.496259 -0.896903 0.293756 -0.330564 -0.991776 -0.016796 -0.126875 -0.991311 -0.124401 0.042744 -0.963083 -0.161444 0.215424 -0.904049 -0.173147 0.390790 -0.810485 -0.191147 0.553695 -0.672645 -0.261686 0.692148 -0.388729 -0.493001 0.778357 -0.026294 -0.817068 0.575942 0.673572 -0.725532 0.141083 0.880244 -0.468308 -0.076540 0.955448 -0.278647 -0.097337 0.994677 -0.094639 -0.040749 0.994693 0.094550 0.040577 0.955464 0.278655 0.097157 0.880183 0.468459 0.076311 0.673326 0.725711 -0.141335 -0.026281 0.817108 -0.575885 -0.689784 0.406873 -0.598876 -0.892108 0.131102 -0.432384 -0.963104 0.037827 -0.266457 -0.995829 0.007148 -0.090962 -0.995840 -0.007238 0.090827 -0.963145 -0.037857 0.266304 -0.892208 -0.131012 0.432204 -0.690004 -0.406690 0.598747 -0.330410 -0.802797 0.496333 0.470117 -0.823764 0.316866 0.773570 -0.606626 0.183288 0.880175 -0.435388 0.189021 0.928966 -0.263126 0.260361 0.933371 -0.073796 0.351244 0.903115 0.122033 0.411692 0.861847 0.327443 0.387299 0.778098 0.614239 0.131427 0.283230 0.803421 -0.523733 -0.388307 0.493115 -0.778495 -0.672370 0.261792 -0.692376 -0.810361 0.191161 -0.553871 -0.904003 0.173081 -0.390925 -0.963066 0.161320 -0.215591 -0.991316 0.124269 -0.043007 -0.991825 0.016739 0.126499 -0.897067 -0.293676 0.330191 -0.576830 -0.762385 0.293321 0.222230 -0.902400 0.369171 0.581320 -0.733916 0.351332 0.704616 -0.585404 0.401022 0.752145 -0.427537 0.501487 0.748782 -0.238373 0.618469 0.713498 -0.028024 0.700096 0.693118 0.192957 0.694517 0.737857 0.497011 0.456669 0.548046 0.760543 -0.348166 -0.026742 0.543011 -0.839300 -0.351197 0.366312 -0.861671 -0.545571 0.329900 -0.770401 -0.698155 0.332614 -0.633994 -0.814707 0.328411 -0.477911 -0.900549 0.289131 -0.324675 -0.968747 0.173182 -0.177589 -0.986653 -0.162450 0.011230 -0.716689 -0.697372 -0.005381 -0.009476 -0.956642 0.291112 0.355039 -0.843586 0.402877 0.472910 -0.722636 0.504136 0.500730 -0.584253 0.638685 0.466972 -0.397659 0.789813 0.399070 -0.166966 0.901591 0.369237 0.074524 0.926342 0.517038 0.381665 0.766162 0.724933 0.684765 -0.074622 0.349909 0.544077 -0.762590 0.035914 0.434057 -0.900169 -0.200051 0.449298 -0.870695 -0.409477 0.483768 -0.773497 -0.580581 0.491073 -0.649441 -0.715972 0.451694 -0.532312 -0.838076 0.331701 -0.433132 -0.949845 -0.019360 -0.312122 -0.713449 -0.607130 -0.349835 -0.163169 -0.981510 0.100068 0.154425 -0.929853 0.333957 0.243001 -0.841373 0.482745 0.231893 -0.729463 0.643513 0.142009 -0.552534 0.821304 0.008228 -0.295490 0.955310 -0.068265 -0.022285 0.997418 0.110819 0.271959 0.955907 0.780867 0.567694 0.260710 0.683102 0.480794 -0.549735 0.432015 0.450891 -0.781064 0.174008 0.544399 -0.820579 -0.091552 0.625947 -0.774473 -0.313133 0.647246 -0.694996 -0.484362 0.608200 -0.628877 -0.635999 0.488223 -0.597615 -0.798172 0.133211 -0.587517 -0.560806 -0.485745 -0.670484 -0.189148 -0.969028 -0.158770 0.038170 -0.985439 0.165690 0.077530 -0.934605 0.347136 0.015221 -0.856476 0.515962 -0.144838 -0.702520 0.696769 -0.360367 -0.424763 0.830489 -0.494115 -0.111074 0.862272 -0.375924 0.160041 0.912726 0.668084 0.416922 0.616311 0.901147 0.356196 -0.247102 0.752045 0.410224 -0.515892 0.502550 0.609269 -0.613379 0.183667 0.756215 -0.628017 -0.082820 0.792110 -0.604733 -0.271848 0.753386 -0.598756 -0.421969 0.639180 -0.642956 -0.573394 0.296698 -0.763668 -0.299928 -0.322680 -0.897731 -0.072524 -0.905876 -0.417288 0.045683 -0.997520 -0.053540 0.025697 -0.990227 0.137076 -0.089231 -0.952182 0.292211 -0.312041 -0.837775 0.448067 -0.594647 -0.571709 0.565282 -0.768369 -0.236262 0.594802 -0.721280 0.018393 0.692399 0.348283 0.281267 0.894197 0.970798 0.234069 0.052559 0.917268 0.354947 -0.180645 0.703904 0.647331 -0.292374 0.345410 0.864362 -0.365474 0.043549 0.912280 -0.407245 -0.145548 0.874758 -0.462185 -0.266428 0.774920 -0.573163 -0.347066 0.469552 -0.811829 -0.010995 -0.114528 -0.993359 0.150853 -0.779456 -0.608023 0.174425 -0.949822 -0.259644 0.099351 -0.991249 -0.086921 -0.059315 -0.997631 0.034844 -0.322527 -0.935226 0.146042 -0.642154 -0.727977 0.240182 -0.852181 -0.429066 0.299481 -0.859362 -0.198854 0.471120 -0.050138 0.132114 0.989966 0.918526 0.212749 0.333240 0.918133 0.367041 0.149374 0.729657 0.681084 0.061036 0.356044 0.932962 -0.053047 0.035784 0.985998 -0.162871 -0.141323 0.951622 -0.272843 -0.219223 0.875618 -0.430388 -0.193801 0.637105 -0.746015 0.224499 0.125268 -0.966389 0.409759 -0.589671 -0.695978 0.377857 -0.833788 -0.402520 0.265263 -0.925361 -0.270820 0.078700 -0.977290 -0.196752 -0.200805 -0.969802 -0.138425 -0.527035 -0.846625 -0.073899 -0.767812 -0.640523 0.013996 -0.840069 -0.473200 0.265263 -0.326482 -0.118823 0.937705 0.723807 0.263000 0.637914 0.771816 0.442683 0.456434 0.590214 0.712449 0.379556 0.230620 0.943172 0.239252 -0.084947 0.994101 0.067426 -0.245484 0.965249 -0.089626 -0.283433 0.919392 -0.272734 -0.153098 0.773422 -0.615126 0.359639 0.371022 -0.856156 0.636300 -0.352211 -0.686346 0.593932 -0.655816 -0.465994 0.467871 -0.793164 -0.389856 0.271622 -0.887729 -0.371698 -0.006286 -0.930413 -0.366459 -0.319057 -0.886697 -0.334620 -0.569675 -0.785640 -0.241331 -0.699852 -0.712236 0.054106 -0.422614 -0.395245 0.815585 0.418679 0.242845 0.875063 0.514605 0.481993 0.709129 0.348281 0.698139 0.625541 0.025593 0.883084 0.468517 -0.267387 0.930601 0.249973 -0.411713 0.909783 0.052783 -0.422512 0.895115 -0.142313 -0.216751 0.855187 -0.470823 0.386650 0.596854 -0.703041 0.790806 -0.090737 -0.605304 0.774944 -0.433012 -0.460394 0.658817 -0.605831 -0.446014 0.469658 -0.736214 -0.487248 0.204165 -0.821390 -0.532574 -0.087335 -0.841819 -0.532647 -0.329818 -0.829419 -0.450871 -0.492822 -0.857533 -0.147529 -0.401034 -0.625887 0.668907 0.142630 0.117711 0.982752 0.238361 0.423699 0.873878 0.089902 0.607475 0.789235 -0.194924 0.754404 0.626801 -0.462351 0.801542 0.379159 -0.592769 0.791700 0.147768 -0.589662 0.805863 -0.053690 -0.348988 0.871703 -0.344007 0.321323 0.782877 -0.532781 0.861377 0.171553 -0.478121 0.896271 -0.184948 -0.403103 0.808477 -0.377938 -0.451140 0.639428 -0.534095 -0.553060 0.392047 -0.653811 -0.647171 0.123561 -0.724785 -0.677805 -0.099960 -0.781667 -0.615633 -0.266574 -0.906137 -0.328411 -0.305442 -0.802156 0.513080 -0.030081 -0.065543 0.997396 0.020342 0.282354 0.959095 -0.123359 0.448468 0.885245 -0.385775 0.568803 0.726389 -0.636716 0.617423 0.461932 -0.756978 0.621631 0.201395 -0.749587 0.661888 -0.004857 -0.512201 0.823048 -0.245444 0.182338 0.915671 -0.358188 0.850330 0.415641 -0.322772 0.948549 0.070411 -0.308701 0.900945 -0.123591 -0.415961 0.761014 -0.292590 -0.579007 0.534606 -0.439306 -0.721946 0.289425 -0.551123 -0.782622 0.092551 -0.661858 -0.743894 -0.048647 -0.871542 -0.487901 -0.153470 -0.922602 0.353910 -0.094333 -0.264160 0.959854 -0.111633 0.093932 0.989300 -0.265372 0.243304 0.932942 -0.522368 0.340183 0.781925 -0.769227 0.388916 0.506985 -0.884528 0.410268 0.222016 -0.879742 0.475293 0.012253 -0.677237 0.714898 -0.173985 -0.010804 0.982443 -0.186250 0.766088 0.624073 -0.153758 0.929915 0.314580 -0.190519 0.926338 0.140965 -0.349323 0.820456 -0.024608 -0.571180 0.617534 -0.190276 -0.763182 0.397229 -0.335954 -0.854016 0.233693 -0.488011 -0.840971 0.144047 -0.765863 -0.626661 0.039868 -0.980385 0.193020 -0.064419 -0.449426 0.890992 -0.156081 -0.111274 0.981456 -0.328902 0.013906 0.944262 -0.591585 0.083188 0.801939 -0.844305 0.127981 0.520356 -0.961231 0.169723 0.217323 -0.965601 0.259923 0.007386 -0.821515 0.556682 -0.123363 -0.232248 0.972437 -0.020668 0.623414 0.781669 0.018674 0.846132 0.529724 -0.058758 0.881153 0.396560 -0.257507 0.808003 0.252507 -0.532327 0.629772 0.076906 -0.772964 0.436964 -0.096619 -0.894275 0.312605 -0.278137 -0.908250 0.295800 -0.600603 -0.742818 0.256978 -0.965769 0.035402 0.042100 -0.597394 0.800842 -0.119742 -0.307422 0.944009 -0.313484 -0.217668 0.924310 -0.585837 -0.184038 0.789256 -0.850696 -0.149245 0.504026 -0.977769 -0.085495 0.191464 -0.999470 0.029882 -0.012898 -0.928683 0.360203 -0.088328 -0.456741 0.879571 0.133201 0.439848 0.878409 0.186899 0.708277 0.701501 0.078993 0.768469 0.623161 -0.145345 0.719730 0.517193 -0.463141 0.565361 0.341386 -0.750881 0.402895 0.146246 -0.903486 0.321612 -0.052434 -0.945419 0.390947 -0.389706 -0.833840 0.474279 -0.872656 -0.116325 0.205843 -0.688973 0.694942 -0.012807 -0.471924 0.881546 -0.222582 -0.428998 0.875453 -0.502077 -0.439723 0.744690 -0.781774 -0.422363 0.458737 -0.929143 -0.339266 0.146944 -0.978298 -0.202396 -0.044364 -0.988536 0.136263 -0.065030 -0.654856 0.705860 0.270046 0.234419 0.909029 0.344550 0.530649 0.819770 0.215380 0.597800 0.801404 -0.019657 0.558970 0.744155 -0.365768 0.425810 0.578178 -0.695986 0.296959 0.369010 -0.880708 0.260195 0.165881 -0.951200 0.418014 -0.152852 -0.895489 0.665289 -0.701411 -0.255760 0.402588 -0.709306 0.578626 0.148486 -0.584412 0.797756 -0.066542 -0.596997 0.799479 -0.344958 -0.658696 0.668673 -0.638167 -0.666759 0.384936 -0.815191 -0.572924 0.084978 -0.901651 -0.423988 -0.085203 -0.993332 -0.102921 -0.051946 -0.797723 0.464044 0.385099 0.026919 0.872022 0.488726 0.329464 0.878018 0.347185 0.385368 0.915652 0.114339 0.338919 0.908667 -0.243840 0.221416 0.761102 -0.609671 0.128075 0.547059 -0.827238 0.133970 0.352195 -0.926289 0.370847 0.084928 -0.924802 0.803820 -0.462625 -0.373967 0.604748 -0.650383 0.459654 0.342759 -0.628507 0.698209 0.137291 -0.700528 0.700294 -0.128372 -0.815925 0.563726 -0.430348 -0.856831 0.283975 -0.642369 -0.766377 0.005336 -0.772050 -0.620664 -0.136805 -0.937979 -0.342903 -0.051120 -0.863631 0.175648 0.472535 -0.162702 0.769197 0.617951 0.121890 0.872305 0.473525 0.151818 0.955573 0.252648 0.081864 0.991369 -0.102404 -0.027829 0.868242 -0.495360 -0.086345 0.660110 -0.746190 -0.043015 0.485385 -0.873242 0.252223 0.297334 -0.920856 0.867192 -0.176899 -0.465495 0.784528 -0.514888 0.345553 0.544957 -0.596204 0.589544 0.365469 -0.725083 0.583684 0.125550 -0.891669 0.434929 -0.177761 -0.971087 0.159343 -0.423910 -0.901021 -0.091985 -0.595838 -0.777270 -0.202058 -0.820877 -0.567125 -0.067304 -0.840341 -0.130701 0.526065 -0.314771 0.607276 0.729476 -0.073851 0.802177 0.592501 -0.079637 0.917245 0.390281 -0.183861 0.981624 0.051082 -0.294804 0.885555 -0.359004 -0.322575 0.694926 -0.642669 -0.249980 0.550319 -0.796655 0.074897 0.459742 -0.884888 0.843072 0.127409 -0.522490 0.916764 -0.315681 0.244722 0.728520 -0.489185 0.479538 0.590195 -0.665432 0.457024 0.387945 -0.875091 0.289333 0.092592 -0.995560 0.016924 -0.179847 -0.962211 -0.204463 -0.385156 -0.878835 -0.281608 -0.646460 -0.755866 -0.103710 -0.725873 -0.421785 0.543328 -0.410999 0.399315 0.819528 -0.238475 0.671933 0.701167 -0.284927 0.804025 0.521881 -0.427314 0.879868 0.207931 -0.548389 0.809945 -0.207988 -0.553981 0.648338 -0.522267 -0.462878 0.541666 -0.701671 -0.140725 0.554757 -0.820025 0.728127 0.417741 -0.543436 0.983791 -0.074161 0.163266 0.870332 -0.318773 0.375374 0.784050 -0.526754 0.328324 0.627798 -0.766461 0.135677 0.349937 -0.926917 -0.135534 0.064531 -0.942513 -0.327880 -0.158556 -0.913498 -0.374676 -0.427223 -0.889429 -0.162467 -0.531420 -0.665792 0.523750 -0.435394 0.165388 0.884917 -0.351410 0.491932 0.796564 -0.440411 0.626979 0.642600 -0.619510 0.698110 0.358957 -0.758221 0.649992 -0.051106 -0.754617 0.527531 -0.390209 -0.657923 0.465040 -0.592348 -0.368634 0.576318 -0.729360 0.532714 0.662188 -0.526994 0.977819 0.182084 0.103513 0.953735 -0.105675 0.281465 0.923275 -0.325247 0.204395 0.815896 -0.577951 -0.016933 0.563794 -0.773567 -0.289362 0.280962 -0.843916 -0.457018 0.059073 -0.875555 -0.479493 -0.185245 -0.951766 -0.244592 -0.280570 -0.839821 0.464738 -0.383040 -0.069597 0.921106 -0.398171 0.280037 0.873521 -0.528027 0.404871 0.746503 -0.737861 0.458245 0.495553 -0.899527 0.424695 0.102398 -0.903500 0.346226 -0.252617 -0.816411 0.330682 -0.473416 -0.584716 0.525778 -0.617790 0.279984 0.835992 -0.471939 0.901569 0.427454 0.066755 0.971158 0.127397 0.201548 0.992298 -0.083346 0.091643 0.929891 -0.331471 -0.159469 0.709460 -0.554483 -0.434989 0.445089 -0.678969 -0.583863 0.243629 -0.769870 -0.589869 0.053486 -0.936669 -0.346108 -0.001282 -0.927584 0.373612 -0.259444 -0.278993 0.924582 -0.372563 0.059865 0.926074 -0.538206 0.162465 0.827006 -0.769926 0.188714 0.609591 -0.956349 0.160780 0.244020 -0.985688 0.123997 -0.114207 -0.925124 0.153511 -0.347246 -0.768668 0.412470 -0.488896 -0.003196 0.922860 -0.385123 0.765754 0.641079 0.051366 0.923397 0.358550 0.137041 0.984847 0.173345 -0.005216 0.957219 -0.055603 -0.283972 0.770888 -0.296691 -0.563654 0.538358 -0.469048 -0.700118 0.373455 -0.611016 -0.697991 0.261400 -0.848856 -0.459471 0.274654 -0.926821 0.256063 -0.077340 -0.438760 0.895270 -0.274668 -0.142621 0.950903 -0.468817 -0.072733 0.880296 -0.713913 -0.079570 0.695699 -0.923862 -0.111795 0.366035 -0.992943 -0.116857 0.020232 -0.975368 -0.049630 -0.214926 -0.904528 0.251462 -0.344378 -0.284035 0.919895 -0.270403 0.585830 0.808772 0.051875 0.817986 0.568903 0.085139 0.903767 0.419490 -0.085050 0.896545 0.219140 -0.384948 0.743089 -0.030784 -0.668484 0.550711 -0.241049 -0.799133 0.432490 -0.421035 -0.797297 0.413486 -0.703509 -0.578017 0.518271 -0.847173 0.117015 0.141446 -0.533500 0.833889 -0.116109 -0.304664 0.945356 -0.328807 -0.275545 0.903306 -0.578795 -0.318532 0.750689 -0.807907 -0.364272 0.463241 -0.923968 -0.353616 0.145737 -0.961732 -0.262477 -0.078595 -0.980676 0.058398 -0.186719 -0.532910 0.835606 -0.133302 0.376780 0.924044 0.064649 0.664701 0.745813 0.044006 0.758596 0.634716 -0.147198 0.756896 0.465417 -0.458797 0.632207 0.214443 -0.744532 0.483306 -0.022298 -0.875167 0.415651 -0.225518 -0.881122 0.494085 -0.523400 -0.694214 0.707732 -0.705642 -0.034427 0.371975 -0.556121 0.743212 0.084307 -0.409209 0.908538 -0.135132 -0.426117 0.894518 -0.381905 -0.506447 0.773084 -0.623105 -0.573148 0.532204 -0.784277 -0.564585 0.257203 -0.881893 -0.467819 0.058401 -0.988649 -0.149034 -0.019038 -0.725580 0.687834 0.020442 0.153237 0.984246 0.088190 0.474354 0.880240 0.012850 0.563341 0.803732 -0.191470 0.555034 0.661723 -0.504043 0.452728 0.414763 -0.789310 0.345611 0.161878 -0.924310 0.326390 -0.050938 -0.943862 0.496445 -0.336121 -0.800353 0.828781 -0.525165 -0.193195 0.591178 -0.507639 0.626746 0.305664 -0.446104 0.841166 0.092120 -0.511633 0.854252 -0.144270 -0.629567 0.763434 -0.389186 -0.722520 0.571401 -0.585393 -0.731549 0.349501 -0.737411 -0.647977 0.190658 -0.923482 -0.351508 0.153697 -0.845734 0.500302 0.185560 -0.071127 0.989854 0.123002 0.257932 0.966133 -0.007610 0.333912 0.917193 -0.217396 0.311717 0.795050 -0.520314 0.224178 0.553736 -0.801948 0.152743 0.291440 -0.944316 0.174652 0.079042 -0.981452 0.421493 -0.169466 -0.890856 0.875772 -0.328858 -0.353377 0.778896 -0.393917 0.488006 0.526547 -0.411320 0.744019 0.332004 -0.526351 0.782770 0.112546 -0.682516 0.722154 -0.127504 -0.804952 0.579479 -0.343594 -0.841573 0.416771 -0.535304 -0.785856 0.309645 -0.785140 -0.528158 0.323426 -0.884113 0.300478 0.357852 -0.280276 0.944222 0.172885 0.028546 0.999505 -0.013258 0.087371 0.970963 -0.222705 0.048363 0.860417 -0.507290 -0.032802 0.622341 -0.782058 -0.077437 0.351234 -0.933080 -0.024924 0.143219 -0.989377 0.276611 -0.051008 -0.959627 0.847610 -0.137098 -0.512603 0.917963 -0.222257 0.328551 0.726765 -0.304215 0.615846 0.565516 -0.469348 0.678163 0.369618 -0.666294 0.647637 0.142223 -0.820519 0.553643 -0.077444 -0.888739 0.451825 -0.288364 -0.868230 0.403760 -0.579559 -0.659658 0.478500 -0.838720 0.114205 0.532453 -0.456168 0.855701 0.244309 -0.197716 0.980252 0.003850 -0.159085 0.966358 -0.202100 -0.215565 0.860094 -0.462354 -0.299074 0.618402 -0.726729 -0.326224 0.330697 -0.885560 -0.254199 0.122948 -0.959305 0.072581 -0.007482 -0.997335</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="2160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="6897">0 0 0 0 0.055556 0 0 0.111111 0 0 0.166667 0 0 0.222222 0 0 0.277778 0 0 0.333333 0 0 0.388889 0 0 0.444444 0 0 0.500000 0 0 0.555556 0 0 0.611111 0 0 0.666667 0 0 0.722222 0 0 0.777778 0 0 0.833333 0 0 0.888889 0 0 0.944444 0 0 1.000000 0 0.008333 0 0 0.008333 0.055556 0 0.008333 0.111111 0 0.008333 0.166667 0 0.008333 0.222222 0 0.008333 0.277778 0 0.008333 0.333333 0 0.008333 0.388889 0 0.008333 0.444444 0 0.008333 0.500000 0 0.008333 0.555556 0 0.008333 0.611111 0 0.008333 0.666667 0 0.008333 0.722222 0 0.008333 0.777778 0 0.008333 0.833333 0 0.008333 0.888889 0 0.008333 0.944444 0 0.008333 1.000000 0 0.016667 0 0 0.016667 0.055556 0 0.016667 0.111111 0 0.016667 0.166667 0 0.016667 0.222222 0 0.016667 0.277778 0 0.016667 0.333333 0 0.016667 0.388889 0 0.016667 0.444444 0 0.016667 0.500000 0 0.016667 0.555556 0 0.016667 0.611111 0 0.016667 0.666667 0 0.016667 0.722222 0 0.016667 0.777778 0 0.016667 0.833333 0 0.016667 0.888889 0 0.016667 0.944444 0 0.016667 1.000000 0 0.025000 0 0 0.025000 0.055556 0 0.025000 0.111111 0 0.025000 0.166667 0 0.025000 0.222222 0 0.025000 0.277778 0 0.025000 0.333333 0 0.025000 0.388889 0 0.025000 0.444444 0 0.025000 0.500000 0 0.025000 0.555556 0 0.025000 0.611111 0 0.025000 0.666667 0 0.025000 0.722222 0 0.025000 0.777778 0 0.025000 0.833333 0 0.025000 0.888889 0 0.025000 0.944444 0 0.025000 1.000000 0 0.033333 0 0 0.033333 0.055556 0 0.033333 0.111111 0 0.033333 0.166667 0 0.033333 0.222222 0 0.033333 0.277778 0 0.033333 0.333333 0 0.033333 0.388889 0 0.033333 0.444444 0 0.033333 0.500000 0 0.033333 0.555556 0 0.033333 0.611111 0 0.033333 0.666667 0 0.033333 0.722222 0 0.033333 0.777778 0 0.033333 0.833333 0 0.033333 0.888889 0 0.033333 0.944444 0 0.033333 1.000000 0 0.041667 0 0 0.041667 0.055556 0 0.041667 0.111111 0 0.041667 0.166667 0 0.041667 0.222222 0 0.041667 0.277778 0 0.041667 0.333333 0 0.041667 0.388889 0 0.041667 0.444444 0 0.041667 0.500000 0 0.041667 0.555556 0 0.041667 0.611111 0 0.041667 0.666667 0 0.041667 0.722222 0 0.041667 0.777778 0 0.041667 0.833333 0 0.041667 0.888889 0 0.041667 0.944444 0 0.041667 1.000000 0 0.050000 0 0 0.050000 0.055556 0 0.050000 0.111111 0 0.050000 0.166667 0 0.050000 0.222222 0 0.050000 0.277778 0 0.050000 0.333333 0 0.050000 0.388889 0 0.050000 0.444444 0 0.050000 0.500000 0 0.050000 0.555556 0 0.050000 0.611111 0 0.050000 0.666667 0 0.050000 0.722222 0 0.050000 0.777778 0 0.050000 0.833333 0 0.050000 0.888889 0 0.050000 0.944444 0 0.050000 1.000000 0 0.058333 0 0 0.058333 0.055556 0 0.058333 0.111111 0 0.058333 0.166667 0 0.058333 0.222222 0 0.058333 0.277778 0 0.058333 0.333333 0 0.058333 0.388889 0 0.058333 0.444444 0 0.058333 0.500000 0 0.058333 0.555556 0 0.058333 0.611111 0 0.058333 0.666667 0 0.058333 0.722222 0 0.058333 0.777778 0 0.058333 0.833333 0 0.058333 0.888889 0 0.058333 0.944444 0 0.058333 1.000000 0 0.066667 0 0 0.066667 0.055556 0 0.066667 0.111111 0 0.066667 0.166667 0 0.066667 0.222222 0 0.066667 0.277778 0 0.066667 0.333333 0 0.066667 0.388889 0 0.066667 0.444444 0 0.066667 0.500000 0 0.066667 0.555556 0 0.066667 0.611111 0 0.066667 0.666667 0 0.066667 0.722222 0 0.066667 0.777778 0 0.066667 0.833333 0 0.066667 0.888889 0 0.066667 0.944444 0 0.066667 1.000000 0 0.075000 0 0 0.075000 0.055556 0 0.075000 0.111111 0 0.075000 0.166667 0 0.075000 0.222222 0 0.075000 0.277778 0 0.075000 0.333333 0 0.075000 0.388889 0 0.075000 0.444444 0 0.075000 0.500000 0 0.075000 0.555556 0 0.075000 0.611111 0 0.075000 0.666667 0 0.075000 0.722222 0 0.075000 0.777778 0 0.075000 0.833333 0 0.075000 0.888889 0 0.075000 0.944444 0 0.075000 1.000000 0 0.083333 0 0 0.083333 0.055556 0 0.083333 0.111111 0 0.083333 0.166667 0 0.083333 0.222222 0 0.083333 0.277778 0 0.083333 0.333333 0 0.083333 0.388889 0 0.083333 0.444444 0 0.083333 0.500000 0 0.083333 0.555556 0 0.083333 0.611111 0 0.083333 0.666667 0 0.083333 0.722222 0 0.083333 0.777778 0 0.083333 0.833333 0 0.083333 0.888889 0 0.083333 0.944444 0 0.083333 1.000000 0 0.091667 0 0 0.091667 0.055556 0 0.091667 0.111111 0 0.091667 0.166667 0 0.091667 0.222222 0 0.091667 0.277778 0 0.091667 0.333333 0 0.091667 0.388889 0 0.091667 0.444444 0 0.091667 0.500000 0 0.091667 0.555556 0 0.091667 0.611111 0 0.091667 0.666667 0 0.091667 0.722222 0 0.091667 0.777778 0 0.091667 0.833333 0 0.091667 0.888889 0 0.091667 0.944444 0 0.091667 1.000000 0 0.100000 0 0 0.100000 0.055556 0 0.100000 0.111111 0 0.100000 0.166667 0 0.100000 0.222222 0 0.100000 0.277778 0 0.100000 0.333333 0 0.100000 0.388889 0 0.100000 0.444444 0 0.100000 0.500000 0 0.100000 0.555556 0 0.100000 0.611111 0 0.100000 0.666667 0 0.100000 0.722222 0 0.100000 0.777778 0 0.100000 0.833333 0 0.100000 0.888889 0 0.100000 0.944444 0 0.100000 1.000000 0 0.108333 0 0 0.108333 0.055556 0 0.108333 0.111111 0 0.108333 0.166667 0 0.108333 0.222222 0 0.108333 0.277778 0 0.108333 0.333333 0 0.108333 0.388889 0 0.108333 0.444444 0 0.108333 0.500000 0 0.108333 0.555556 0 0.108333 0.611111 0 0.108333 0.666667 0 0.108333 0.722222 0 0.108333 0.777778 0 0.108333 0.833333 0 0.108333 0.888889 0 0.108333 0.944444 0 0.108333 1.000000 0 0.116667 0 0 0.116667 0.055556 0 0.116667 0.111111 0 0.116667 0.166667 0 0.116667 0.222222 0 0.116667 0.277778 0 0.116667 0.333333 0 0.116667 0.388889 0 0.116667 0.444444 0 0.116667 0.500000 0 0.116667 0.555556 0 0.116667 0.611111 0 0.116667 0.666667 0 0.116667 0.722222 0 0.116667 0.777778 0 0.116667 0.833333 0 0.116667 0.888889 0 0.116667 0.944444 0 0.116667 1.000000 0 0.125000 0 0 0.125000 0.055556 0 0.125000 0.111111 0 0.125000 0.166667 0 0.125000 0.222222 0 0.125000 0.277778 0 0.125000 0.333333 0 0.125000 0.388889 0 0.125000 0.444444 0 0.125000 0.500000 0 0.125000 0.555556 0 0.125000 0.611111 0 0.125000 0.666667 0 0.125000 0.722222 0 0.125000 0.777778 0 0.125000 0.833333 0 0.125000 0.888889 0 0.125000 0.944444 0 0.125000 1.000000 0 0.133333 0 0 0.133333 0.055556 0 0.133333 0.111111 0 0.133333 0.166667 0 0.133333 0.222222 0 0.133333 0.277778 0 0.133333 0.333333 0 0.133333 0.388889 0 0.133333 0.444444 0 0.133333 0.500000 0 0.133333 0.555556 0 0.133333 0.611111 0 0.133333 0.666667 0 0.133333 0.722222 0 0.133333 0.777778 0 0.133333 0.833333 0 0.133333 0.888889 0 0.133333 0.944444 0 0.133333 1.000000 0 0.141667 0 0 0.141667 0.055556 0 0.141667 0.111111 0 0.141667 0.166667 0 0.141667 0.222222 0 0.141667 0.277778 0 0.141667 0.333333 0 0.141667 0.388889 0 0.141667 0.444444 0 0.141667 0.500000 0 0.141667 0.555556 0 0.141667 0.611111 0 0.141667 0.666667 0 0.141667 0.722222 0 0.141667 0.777778 0 0.141667 0.833333 0 0.141667 0.888889 0 0.141667 0.944444 0 0.141667 1.000000 0 0.150000 0 0 0.150000 0.055556 0 0.150000 0.111111 0 0.150000 0.166667 0 0.150000 0.222222 0 0.150000 0.277778 0 0.150000 0.333333 0 0.150000 0.388889 0 0.150000 0.444444 0 0.150000 0.500000 0 0.150000 0.555556 0 0.150000 0.611111 0 0.150000 0.666667 0 0.150000 0.722222 0 0.150000 0.777778 0 0.150000 0.833333 0 0.150000 0.888889 0 0.150000 0.944444 0 0.150000 1.000000 0 0.158333 0 0 0.158333 0.055556 0 0.158333 0.111111 0 0.158333 0.166667 0 0.158333 0.222222 0 0.158333 0.277778 0 0.158333 0.333333 0 0.158333 0.388889 0 0.158333 0.444444 0 0.158333 0.500000 0 0.158333 0.555556 0 0.158333 0.611111 0 0.158333 0.666667 0 0.158333 0.722222 0 0.158333 0.777778 0 0.158333 0.833333 0 0.158333 0.888889 0 0.158333 0.944444 0 0.158333 1.000000 0 0.166667 0 0 0.166667 0.055556 0 0.166667 0.111111 0 0.166667 0.166667 0 0.166667 0.222222 0 0.166667 0.277778 0 0.166667 0.333333 0 0.166667 0.388889 0 0.166667 0.444444 0 0.166667 0.500000 0 0.166667 0.555556 0 0.166667 0.611111 0 0.166667 0.666667 0 0.166667 0.722222 0 0.166667 0.777778 0 0.166667 0.833333 0 0.166667 0.888889 0 0.166667 0.944444 0 0.166667 1.000000 0 0.175000 0 0 0.175000 0.055556 0 0.175000 0.111111 0 0.175000 0.166667 0 0.175000 0.222222 0 0.175000 0.277778 0 0.175000 0.333333 0 0.175000 0.388889 0 0.175000 0.444444 0 0.175000 0.500000 0 0.175000 0.555556 0 0.175000 0.611111 0 0.175000 0.666667 0 0.175000 0.722222 0 0.175000 0.777778 0 0.175000 0.833333 0 0.175000 0.888889 0 0.175000 0.944444 0 0.175000 1.000000 0 0.183333 0 0 0.183333 0.055556 0 0.183333 0.111111 0 0.183333 0.166667 0 0.183333 0.222222 0 0.183333 0.277778 0 0.183333 0.333333 0 0.183333 0.388889 0 0.183333 0.444444 0 0.183333 0.500000 0 0.183333 0.555556 0 0.183333 0.611111 0 0.183333 0.666667 0 0.183333 0.722222 0 0.183333 0.777778 0 0.183333 0.833333 0 0.183333 0.888889 0 0.183333 0.944444 0 0.183333 1.000000 0 0.191667 0 0 0.191667 0.055556 0 0.191667 0.111111 0 0.191667 0.166667 0 0.191667 0.222222 0 0.191667 0.277778 0 0.191667 0.333333 0 0.191667 0.388889 0 0.191667 0.444444 0 0.191667 0.500000 0 0.191667 0.555556 0 0.191667 0.611111 0 0.191667 0.666667 0 0.191667 0.722222 0 0.191667 0.777778 0 0.191667 0.833333 0 0.191667 0.888889 0 0.191667 0.944444 0 0.191667 1.000000 0 0.200000 0 0 0.200000 0.055556 0 0.200000 0.111111 0 0.200000 0.166667 0 0.200000 0.222222 0 0.200000 0.277778 0 0.200000 0.333333 0 0.200000 0.388889 0 0.200000 0.444444 0 0.200000 0.500000 0 0.200000 0.555556 0 0.200000 0.611111 0 0.200000 0.666667 0 0.200000 0.722222 0 0.200000 0.777778 0 0.200000 0.833333 0 0.200000 0.888889 0 0.200000 0.944444 0 0.200000 1.000000 0 0.208333 0 0 0.208333 0.055556 0 0.208333 0.111111 0 0.208333 0.166667 0 0.208333 0.222222 0 0.208333 0.277778 0 0.208333 0.333333 0 0.208333 0.388889 0 0.208333 0.444444 0 0.208333 0.500000 0 0.208333 0.555556 0 0.208333 0.611111 0 0.208333 0.666667 0 0.208333 0.722222 0 0.208333 0.777778 0 0.208333 0.833333 0 0.208333 0.888889 0 0.208333 0.944444 0 0.208333 1.000000 0 0.216667 0 0 0.216667 0.055556 0 0.216667 0.111111 0 0.216667 0.166667 0 0.216667 0.222222 0 0.216667 0.277778 0 0.216667 0.333333 0 0.216667 0.388889 0 0.216667 0.444444 0 0.216667 0.500000 0 0.216667 0.555556 0 0.216667 0.611111 0 0.216667 0.666667 0 0.216667 0.722222 0 0.216667 0.777778 0 0.216667 0.833333 0 0.216667 0.888889 0 0.216667 0.944444 0 0.216667 1.000000 0 0.225000 0 0 0.225000 0.055556 0 0.225000 0.111111 0 0.225000 0.166667 0 0.225000 0.222222 0 0.225000 0.277778 0 0.225000 0.333333 0 0.225000 0.388889 0 0.225000 0.444444 0 0.225000 0.500000 0 0.225000 0.555556 0 0.225000 0.611111 0 0.225000 0.666667 0 0.225000 0.722222 0 0.225000 0.777778 0 0.225000 0.833333 0 0.225000 0.888889 0 0.225000 0.944444 0 0.225000 1.000000 0 0.233333 0 0 0.233333 0.055556 0 0.233333 0.111111 0 0.233333 0.166667 0 0.233333 0.222222 0 0.233333 0.277778 0 0.233333 0.333333 0 0.233333 0.388889 0 0.233333 0.444444 0 0.233333 0.500000 0 0.233333 0.555556 0 0.233333 0.611111 0 0.233333 0.666667 0 0.233333 0.722222 0 0.233333 0.777778 0 0.233333 0.833333 0 0.233333 0.888889 0 0.233333 0.944444 0 0.233333 1.000000 0 0.241667 0 0 0.241667 0.055556 0 0.241667 0.111111 0 0.241667 0.166667 0 0.241667 0.222222 0 0.241667 0.277778 0 0.241667 0.333333 0 0.241667 0.388889 0 0.241667 0.444444 0 0.241667 0.500000 0 0.241667 0.555556 0 0.241667 0.611111 0 0.241667 0.666667 0 0.241667 0.722222 0 0.241667 0.777778 0 0.241667 0.833333 0 0.241667 0.888889 0 0.241667 0.944444 0 0.241667 1.000000 0 0.250000 0 0 0.250000 0.055556 0 0.250000 0.111111 0 0.250000 0.166667 0 0.250000 0.222222 0 0.250000 0.277778 0 0.250000 0.333333 0 0.250000 0.388889 0 0.250000 0.444444 0 0.250000 0.500000 0 0.250000 0.555556 0 0.250000 0.611111 0 0.250000 0.666667 0 0.250000 0.722222 0 0.250000 0.777778 0 0.250000 0.833333 0 0.250000 0.888889 0 0.250000 0.944444 0 0.250000 1.000000 0 0.258333 0 0 0.258333 0.055556 0 0.258333 0.111111 0 0.258333 0.166667 0 0.258333 0.222222 0 0.258333 0.277778 0 0.258333 0.333333 0 0.258333 0.388889 0 0.258333 0.444444 0 0.258333 0.500000 0 0.258333 0.555556 0 0.258333 0.611111 0 0.258333 0.666667 0 0.258333 0.722222 0 0.258333 0.777778 0 0.258333 0.833333 0 0.258333 0.888889 0 0.258333 0.944444 0 0.258333 1.000000 0 0.266667 0 0 0.266667 0.055556 0 0.266667 0.111111 0 0.266667 0.166667 0 0.266667 0.222222 0 0.266667 0.277778 0 0.266667 0.333333 0 0.266667 0.388889 0 0.266667 0.444444 0 0.266667 0.500000 0 0.266667 0.555556 0 0.266667 0.611111 0 0.266667 0.666667 0 0.266667 0.722222 0 0.266667 0.777778 0 0.266667 0.833333 0 0.266667 0.888889 0 0.266667 0.944444 0 0.266667 1.000000 0 0.275000 0 0 0.275000 0.055556 0 0.275000 0.111111 0 0.275000 0.166667 0 0.275000 0.222222 0 0.275000 0.277778 0 0.275000 0.333333 0 0.275000 0.388889 0 0.275000 0.444444 0 0.275000 0.500000 0 0.275000 0.555556 0 0.275000 0.611111 0 0.275000 0.666667 0 0.275000 0.722222 0 0.275000 0.777778 0 0.275000 0.833333 0 0.275000 0.888889 0 0.275000 0.944444 0 0.275000 1.000000 0 0.283333 0 0 0.283333 0.055556 0 0.283333 0.111111 0 0.283333 0.166667 0 0.283333 0.222222 0 0.283333 0.277778 0 0.283333 0.333333 0 0.283333 0.388889 0 0.283333 0.444444 0 0.283333 0.500000 0 0.283333 0.555556 0 0.283333 0.611111 0 0.283333 0.666667 0 0.283333 0.722222 0 0.283333 0.777778 0 0.283333 0.833333 0 0.283333 0.888889 0 0.283333 0.944444 0 0.283333 1.000000 0 0.291667 0 0 0.291667 0.055556 0 0.291667 0.111111 0 0.291667 0.166667 0 0.291667 0.222222 0 0.291667 0.277778 0 0.291667 0.333333 0 0.291667 0.388889 0 0.291667 0.444444 0 0.291667 0.500000 0 0.291667 0.555556 0 0.291667 0.611111 0 0.291667 0.666667 0 0.291667 0.722222 0 0.291667 0.777778 0 0.291667 0.833333 0 0.291667 0.888889 0 0.291667 0.944444 0 0.291667 1.000000 0 0.300000 0 0 0.300000 0.055556 0 0.300000 0.111111 0 0.300000 0.166667 0 0.300000 0.222222 0 0.300000 0.277778 0 0.300000 0.333333 0 0.300000 0.388889 0 0.300000 0.444444 0 0.300000 0.500000 0 0.300000 0.555556 0 0.300000 0.611111 0 0.300000 0.666667 0 0.300000 0.722222 0 0.300000 0.777778 0 0.300000 0.833333 0 0.300000 0.888889 0 0.300000 0.944444 0 0.300000 1.000000 0 0.308333 0 0 0.308333 0.055556 0 0.308333 0.111111 0 0.308333 0.166667 0 0.308333 0.222222 0 0.308333 0.277778 0 0.308333 0.333333 0 0.308333 0.388889 0 0.308333 0.444444 0 0.308333 0.500000 0 0.308333 0.555556 0 0.308333 0.611111 0 0.308333 0.666667 0 0.308333 0.722222 0 0.308333 0.777778 0 0.308333 0.833333 0 0.308333 0.888889 0 0.308333 0.944444 0 0.308333 1.000000 0 0.316666 0 0 0.316666 0.055556 0 0.316666 0.111111 0 0.316666 0.166667 0 0.316666 0.222222 0 0.316666 0.277778 0 0.316666 0.333333 0 0.316666 0.388889 0 0.316666 0.444444 0 0.316666 0.500000 0 0.316666 0.555556 0 0.316666 0.611111 0 0.316666 0.666667 0 0.316666 0.722222 0 0.316666 0.777778 0 0.316666 0.833333 0 0.316666 0.888889 0 0.316666 0.944444 0 0.316666 1.000000 0 0.325000 0 0 0.325000 0.055556 0 0.325000 0.111111 0 0.325000 0.166667 0 0.325000 0.222222 0 0.325000 0.277778 0 0.325000 0.333333 0 0.325000 0.388889 0 0.325000 0.444444 0 0.325000 0.500000 0 0.325000 0.555556 0 0.325000 0.611111 0 0.325000 0.666667 0 0.325000 0.722222 0 0.325000 0.777778 0 0.325000 0.833333 0 0.325000 0.888889 0 0.325000 0.944444 0 0.325000 1.000000 0 0.333333 0 0 0.333333 0.055556 0 0.333333 0.111111 0 0.333333 0.166667 0 0.333333 0.222222 0 0.333333 0.277778 0 0.333333 0.333333 0 0.333333 0.388889 0 0.333333 0.444444 0 0.333333 0.500000 0 0.333333 0.555556 0 0.333333 0.611111 0 0.333333 0.666667 0 0.333333 0.722222 0 0.333333 0.777778 0 0.333333 0.833333 0 0.333333 0.888889 0 0.333333 0.944444 0 0.333333 1.000000 0 0.341666 0 0 0.341666 0.055556 0 0.341666 0.111111 0 0.341666 0.166667 0 0.341666 0.222222 0 0.341666 0.277778 0 0.341666 0.333333 0 0.341666 0.388889 0 0.341666 0.444444 0 0.341666 0.500000 0 0.341666 0.555556 0 0.341666 0.611111 0 0.341666 0.666667 0 0.341666 0.722222 0 0.341666 0.777778 0 0.341666 0.833333 0 0.341666 0.888889 0 0.341666 0.944444 0 0.341666 1.000000 0 0.350000 0 0 0.350000 0.055556 0 0.350000 0.111111 0 0.350000 0.166667 0 0.350000 0.222222 0 0.350000 0.277778 0 0.350000 0.333333 0 0.350000 0.388889 0 0.350000 0.444444 0 0.350000 0.500000 0 0.350000 0.555556 0 0.350000 0.611111 0 0.350000 0.666667 0 0.350000 0.722222 0 0.350000 0.777778 0 0.350000 0.833333 0 0.350000 0.888889 0 0.350000 0.944444 0 0.350000 1.000000 0 0.358333 0 0 0.358333 0.055556 0 0.358333 0.111111 0 0.358333 0.166667 0 0.358333 0.222222 0 0.358333 0.277778 0 0.358333 0.333333 0 0.358333 0.388889 0 0.358333 0.444444 0 0.358333 0.500000 0 0.358333 0.555556 0 0.358333 0.611111 0 0.358333 0.666667 0 0.358333 0.722222 0 0.358333 0.777778 0 0.358333 0.833333 0 0.358333 0.888889 0 0.358333 0.944444 0 0.358333 1.000000 0 0.366666 0 0 0.366666 0.055556 0 0.366666 0.111111 0 0.366666 0.166667 0 0.366666 0.222222 0 0.366666 0.277778 0 0.366666 0.333333 0 0.366666 0.388889 0 0.366666 0.444444 0 0.366666 0.500000 0 0.366666 0.555556 0 0.366666 0.611111 0 0.366666 0.666667 0 0.366666 0.722222 0 0.366666 0.777778 0 0.366666 0.833333 0 0.366666 0.888889 0 0.366666 0.944444 0 0.366666 1.000000 0 0.375000 0 0 0.375000 0.055556 0 0.375000 0.111111 0 0.375000 0.166667 0 0.375000 0.222222 0 0.375000 0.277778 0 0.375000 0.333333 0 0.375000 0.388889 0 0.375000 0.444444 0 0.375000 0.500000 0 0.375000 0.555556 0 0.375000 0.611111 0 0.375000 0.666667 0 0.375000 0.722222 0 0.375000 0.777778 0 0.375000 0.833333 0 0.375000 0.888889 0 0.375000 0.944444 0 0.375000 1.000000 0 0.383333 0 0 0.383333 0.055556 0 0.383333 0.111111 0 0.383333 0.166667 0 0.383333 0.222222 0 0.383333 0.277778 0 0.383333 0.333333 0 0.383333 0.388889 0 0.383333 0.444444 0 0.383333 0.500000 0 0.383333 0.555556 0 0.383333 0.611111 0 0.383333 0.666667 0 0.383333 0.722222 0 0.383333 0.777778 0 0.383333 0.833333 0 0.383333 0.888889 0 0.383333 0.944444 0 0.383333 1.000000 0 0.391666 0 0 0.391666 0.055556 0 0.391666 0.111111 0 0.391666 0.166667 0 0.391666 0.222222 0 0.391666 0.277778 0 0.391666 0.333333 0 0.391666 0.388889 0 0.391666 0.444444 0 0.391666 0.500000 0 0.391666 0.555556 0 0.391666 0.611111 0 0.391666 0.666667 0 0.391666 0.722222 0 0.391666 0.777778 0 0.391666 0.833333 0 0.391666 0.888889 0 0.391666 0.944444 0 0.391666 1.000000 0 0.400000 0 0 0.400000 0.055556 0 0.400000 0.111111 0 0.400000 0.166667 0 0.400000 0.222222 0 0.400000 0.277778 0 0.400000 0.333333 0 0.400000 0.388889 0 0.400000 0.444444 0 0.400000 0.500000 0 0.400000 0.555556 0 0.400000 0.611111 0 0.400000 0.666667 0 0.400000 0.722222 0 0.400000 0.777778 0 0.400000 0.833333 0 0.400000 0.888889 0 0.400000 0.944444 0 0.400000 1.000000 0 0.408333 0 0 0.408333 0.055556 0 0.408333 0.111111 0 0.408333 0.166667 0 0.408333 0.222222 0 0.408333 0.277778 0 0.408333 0.333333 0 0.408333 0.388889 0 0.408333 0.444444 0 0.408333 0.500000 0 0.408333 0.555556 0 0.408333 0.611111 0 0.408333 0.666667 0 0.408333 0.722222 0 0.408333 0.777778 0 0.408333 0.833333 0 0.408333 0.888889 0 0.408333 0.944444 0 0.408333 1.000000 0 0.416666 0 0 0.416666 0.055556 0 0.416666 0.111111 0 0.416666 0.166667 0 0.416666 0.222222 0 0.416666 0.277778 0 0.416666 0.333333 0 0.416666 0.388889 0 0.416666 0.444444 0 0.416666 0.500000 0 0.416666 0.555556 0 0.416666 0.611111 0 0.416666 0.666667 0 0.416666 0.722222 0 0.416666 0.777778 0 0.416666 0.833333 0 0.416666 0.888889 0 0.416666 0.944444 0 0.416666 1.000000 0 0.425000 0 0 0.425000 0.055556 0 0.425000 0.111111 0 0.425000 0.166667 0 0.425000 0.222222 0 0.425000 0.277778 0 0.425000 0.333333 0 0.425000 0.388889 0 0.425000 0.444444 0 0.425000 0.500000 0 0.425000 0.555556 0 0.425000 0.611111 0 0.425000 0.666667 0 0.425000 0.722222 0 0.425000 0.777778 0 0.425000 0.833333 0 0.425000 0.888889 0 0.425000 0.944444 0 0.425000 1.000000 0 0.433333 0 0 0.433333 0.055556 0 0.433333 0.111111 0 0.433333 0.166667 0 0.433333 0.222222 0 0.433333 0.277778 0 0.433333 0.333333 0 0.433333 0.388889 0 0.433333 0.444444 0 0.433333 0.500000 0 0.433333 0.555556 0 0.433333 0.611111 0 0.433333 0.666667 0 0.433333 0.722222 0 0.433333 0.777778 0 0.433333 0.833333 0 0.433333 0.888889 0 0.433333 0.944444 0 0.433333 1.000000 0 0.441666 0 0 0.441666 0.055556 0 0.441666 0.111111 0 0.441666 0.166667 0 0.441666 0.222222 0 0.441666 0.277778 0 0.441666 0.333333 0 0.441666 0.388889 0 0.441666 0.444444 0 0.441666 0.500000 0 0.441666 0.555556 0 0.441666 0.611111 0 0.441666 0.666667 0 0.441666 0.722222 0 0.441666 0.777778 0 0.441666 0.833333 0 0.441666 0.888889 0 0.441666 0.944444 0 0.441666 1.000000 0 0.450000 0 0 0.450000 0.055556 0 0.450000 0.111111 0 0.450000 0.166667 0 0.450000 0.222222 0 0.450000 0.277778 0 0.450000 0.333333 0 0.450000 0.388889 0 0.450000 0.444444 0 0.450000 0.500000 0 0.450000 0.555556 0 0.450000 0.611111 0 0.450000 0.666667 0 0.450000 0.722222 0 0.450000 0.777778 0 0.450000 0.833333 0 0.450000 0.888889 0 0.450000 0.944444 0 0.450000 1.000000 0 0.458333 0 0 0.458333 0.055556 0 0.458333 0.111111 0 0.458333 0.166667 0 0.458333 0.222222 0 0.458333 0.277778 0 0.458333 0.333333 0 0.458333 0.388889 0 0.458333 0.444444 0 0.458333 0.500000 0 0.458333 0.555556 0 0.458333 0.611111 0 0.458333 0.666667 0 0.458333 0.722222 0 0.458333 0.777778 0 0.458333 0.833333 0 0.458333 0.888889 0 0.458333 0.944444 0 0.458333 1.000000 0 0.466666 0 0 0.466666 0.055556 0 0.466666 0.111111 0 0.466666 0.166667 0 0.466666 0.222222 0 0.466666 0.277778 0 0.466666 0.333333 0 0.466666 0.388889 0 0.466666 0.444444 0 0.466666 0.500000 0 0.466666 0.555556 0 0.466666 0.611111 0 0.466666 0.666667 0 0.466666 0.722222 0 0.466666 0.777778 0 0.466666 0.833333 0 0.466666 0.888889 0 0.466666 0.944444 0 0.466666 1.000000 0 0.475000 0 0 0.475000 0.055556 0 0.475000 0.111111 0 0.475000 0.166667 0 0.475000 0.222222 0 0.475000 0.277778 0 0.475000 0.333333 0 0.475000 0.388889 0 0.475000 0.444444 0 0.475000 0.500000 0 0.475000 0.555556 0 0.475000 0.611111 0 0.475000 0.666667 0 0.475000 0.722222 0 0.475000 0.777778 0 0.475000 0.833333 0 0.475000 0.888889 0 0.475000 0.944444 0 0.475000 1.000000 0 0.483333 0 0 0.483333 0.055556 0 0.483333 0.111111 0 0.483333 0.166667 0 0.483333 0.222222 0 0.483333 0.277778 0 0.483333 0.333333 0 0.483333 0.388889 0 0.483333 0.444444 0 0.483333 0.500000 0 0.483333 0.555556 0 0.483333 0.611111 0 0.483333 0.666667 0 0.483333 0.722222 0 0.483333 0.777778 0 0.483333 0.833333 0 0.483333 0.888889 0 0.483333 0.944444 0 0.483333 1.000000 0 0.491666 0 0 0.491666 0.055556 0 0.491666 0.111111 0 0.491666 0.166667 0 0.491666 0.222222 0 0.491666 0.277778 0 0.491666 0.333333 0 0.491666 0.388889 0 0.491666 0.444444 0 0.491666 0.500000 0 0.491666 0.555556 0 0.491666 0.611111 0 0.491666 0.666667 0 0.491666 0.722222 0 0.491666 0.777778 0 0.491666 0.833333 0 0.491666 0.888889 0 0.491666 0.944444 0 0.491666 1.000000 0 0.500000 0 0 0.500000 0.055556 0 0.500000 0.111111 0 0.500000 0.166667 0 0.500000 0.222222 0 0.500000 0.277778 0 0.500000 0.333333 0 0.500000 0.388889 0 0.500000 0.444444 0 0.500000 0.500000 0 0.500000 0.555556 0 0.500000 0.611111 0 0.500000 0.666667 0 0.500000 0.722222 0 0.500000 0.777778 0 0.500000 0.833333 0 0.500000 0.888889 0 0.500000 0.944444 0 0.500000 1.000000 0 0.508333 0 0 0.508333 0.055556 0 0.508333 0.111111 0 0.508333 0.166667 0 0.508333 0.222222 0 0.508333 0.277778 0 0.508333 0.333333 0 0.508333 0.388889 0 0.508333 0.444444 0 0.508333 0.500000 0 0.508333 0.555556 0 0.508333 0.611111 0 0.508333 0.666667 0 0.508333 0.722222 0 0.508333 0.777778 0 0.508333 0.833333 0 0.508333 0.888889 0 0.508333 0.944444 0 0.508333 1.000000 0 0.516666 0 0 0.516666 0.055556 0 0.516666 0.111111 0 0.516666 0.166667 0 0.516666 0.222222 0 0.516666 0.277778 0 0.516666 0.333333 0 0.516666 0.388889 0 0.516666 0.444444 0 0.516666 0.500000 0 0.516666 0.555556 0 0.516666 0.611111 0 0.516666 0.666667 0 0.516666 0.722222 0 0.516666 0.777778 0 0.516666 0.833333 0 0.516666 0.888889 0 0.516666 0.944444 0 0.516666 1.000000 0 0.525000 0 0 0.525000 0.055556 0 0.525000 0.111111 0 0.525000 0.166667 0 0.525000 0.222222 0 0.525000 0.277778 0 0.525000 0.333333 0 0.525000 0.388889 0 0.525000 0.444444 0 0.525000 0.500000 0 0.525000 0.555556 0 0.525000 0.611111 0 0.525000 0.666667 0 0.525000 0.722222 0 0.525000 0.777778 0 0.525000 0.833333 0 0.525000 0.888889 0 0.525000 0.944444 0 0.525000 1.000000 0 0.533333 0 0 0.533333 0.055556 0 0.533333 0.111111 0 0.533333 0.166667 0 0.533333 0.222222 0 0.533333 0.277778 0 0.533333 0.333333 0 0.533333 0.388889 0 0.533333 0.444444 0 0.533333 0.500000 0 0.533333 0.555556 0 0.533333 0.611111 0 0.533333 0.666667 0 0.533333 0.722222 0 0.533333 0.777778 0 0.533333 0.833333 0 0.533333 0.888889 0 0.533333 0.944444 0 0.533333 1.000000 0 0.541666 0 0 0.541666 0.055556 0 0.541666 0.111111 0 0.541666 0.166667 0 0.541666 0.222222 0 0.541666 0.277778 0 0.541666 0.333333 0 0.541666 0.388889 0 0.541666 0.444444 0 0.541666 0.500000 0 0.541666 0.555556 0 0.541666 0.611111 0 0.541666 0.666667 0 0.541666 0.722222 0 0.541666 0.777778 0 0.541666 0.833333 0 0.541666 0.888889 0 0.541666 0.944444 0 0.541666 1.000000 0 0.550000 0 0 0.550000 0.055556 0 0.550000 0.111111 0 0.550000 0.166667 0 0.550000 0.222222 0 0.550000 0.277778 0 0.550000 0.333333 0 0.550000 0.388889 0 0.550000 0.444444 0 0.550000 0.500000 0 0.550000 0.555556 0 0.550000 0.611111 0 0.550000 0.666667 0 0.550000 0.722222 0 0.550000 0.777778 0 0.550000 0.833333 0 0.550000 0.888889 0 0.550000 0.944444 0 0.550000 1.000000 0 0.558333 0 0 0.558333 0.055556 0 0.558333 0.111111 0 0.558333 0.166667 0 0.558333 0.222222 0 0.558333 0.277778 0 0.558333 0.333333 0 0.558333 0.388889 0 0.558333 0.444444 0 0.558333 0.500000 0 0.558333 0.555556 0 0.558333 0.611111 0 0.558333 0.666667 0 0.558333 0.722222 0 0.558333 0.777778 0 0.558333 0.833333 0 0.558333 0.888889 0 0.558333 0.944444 0 0.558333 1.000000 0 0.566666 0 0 0.566666 0.055556 0 0.566666 0.111111 0 0.566666 0.166667 0 0.566666 0.222222 0 0.566666 0.277778 0 0.566666 0.333333 0 0.566666 0.388889 0 0.566666 0.444444 0 0.566666 0.500000 0 0.566666 0.555556 0 0.566666 0.611111 0 0.566666 0.666667 0 0.566666 0.722222 0 0.566666 0.777778 0 0.566666 0.833333 0 0.566666 0.888889 0 0.566666 0.944444 0 0.566666 1.000000 0 0.575000 0 0 0.575000 0.055556 0 0.575000 0.111111 0 0.575000 0.166667 0 0.575000 0.222222 0 0.575000 0.277778 0 0.575000 0.333333 0 0.575000 0.388889 0 0.575000 0.444444 0 0.575000 0.500000 0 0.575000 0.555556 0 0.575000 0.611111 0 0.575000 0.666667 0 0.575000 0.722222 0 0.575000 0.777778 0 0.575000 0.833333 0 0.575000 0.888889 0 0.575000 0.944444 0 0.575000 1.000000 0 0.583333 0 0 0.583333 0.055556 0 0.583333 0.111111 0 0.583333 0.166667 0 0.583333 0.222222 0 0.583333 0.277778 0 0.583333 0.333333 0 0.583333 0.388889 0 0.583333 0.444444 0 0.583333 0.500000 0 0.583333 0.555556 0 0.583333 0.611111 0 0.583333 0.666667 0 0.583333 0.722222 0 0.583333 0.777778 0 0.583333 0.833333 0 0.583333 0.888889 0 0.583333 0.944444 0 0.583333 1.000000 0 0.591666 0 0 0.591666 0.055556 0 0.591666 0.111111 0 0.591666 0.166667 0 0.591666 0.222222 0 0.591666 0.277778 0 0.591666 0.333333 0 0.591666 0.388889 0 0.591666 0.444444 0 0.591666 0.500000 0 0.591666 0.555556 0 0.591666 0.611111 0 0.591666 0.666667 0 0.591666 0.722222 0 0.591666 0.777778 0 0.591666 0.833333 0 0.591666 0.888889 0 0.591666 0.944444 0 0.591666 1.000000 0 0.599999 0 0 0.599999 0.055556 0 0.599999 0.111111 0 0.599999 0.166667 0 0.599999 0.222222 0 0.599999 0.277778 0 0.599999 0.333333 0 0.599999 0.388889 0 0.599999 0.444444 0 0.599999 0.500000 0 0.599999 0.555556 0 0.599999 0.611111 0 0.599999 0.666667 0 0.599999 0.722222 0 0.599999 0.777778 0 0.599999 0.833333 0 0.599999 0.888889 0 0.599999 0.944444 0 0.599999 1.000000 0 0.608333 0 0 0.608333 0.055556 0 0.608333 0.111111 0 0.608333 0.166667 0 0.608333 0.222222 0 0.608333 0.277778 0 0.608333 0.333333 0 0.608333 0.388889 0 0.608333 0.444444 0 0.608333 0.500000 0 0.608333 0.555556 0 0.608333 0.611111 0 0.608333 0.666667 0 0.608333 0.722222 0 0.608333 0.777778 0 0.608333 0.833333 0 0.608333 0.888889 0 0.608333 0.944444 0 0.608333 1.000000 0 0.616666 0 0 0.616666 0.055556 0 0.616666 0.111111 0 0.616666 0.166667 0 0.616666 0.222222 0 0.616666 0.277778 0 0.616666 0.333333 0 0.616666 0.388889 0 0.616666 0.444444 0 0.616666 0.500000 0 0.616666 0.555556 0 0.616666 0.611111 0 0.616666 0.666667 0 0.616666 0.722222 0 0.616666 0.777778 0 0.616666 0.833333 0 0.616666 0.888889 0 0.616666 0.944444 0 0.616666 1.000000 0 0.624999 0 0 0.624999 0.055556 0 0.624999 0.111111 0 0.624999 0.166667 0 0.624999 0.222222 0 0.624999 0.277778 0 0.624999 0.333333 0 0.624999 0.388889 0 0.624999 0.444444 0 0.624999 0.500000 0 0.624999 0.555556 0 0.624999 0.611111 0 0.624999 0.666667 0 0.624999 0.722222 0 0.624999 0.777778 0 0.624999 0.833333 0 0.624999 0.888889 0 0.624999 0.944444 0 0.624999 1.000000 0 0.633333 0 0 0.633333 0.055556 0 0.633333 0.111111 0 0.633333 0.166667 0 0.633333 0.222222 0 0.633333 0.277778 0 0.633333 0.333333 0 0.633333 0.388889 0 0.633333 0.444444 0 0.633333 0.500000 0 0.633333 0.555556 0 0.633333 0.611111 0 0.633333 0.666667 0 0.633333 0.722222 0 0.633333 0.777778 0 0.633333 0.833333 0 0.633333 0.888889 0 0.633333 0.944444 0 0.633333 1.000000 0 0.641666 0 0 0.641666 0.055556 0 0.641666 0.111111 0 0.641666 0.166667 0 0.641666 0.222222 0 0.641666 0.277778 0 0.641666 0.333333 0 0.641666 0.388889 0 0.641666 0.444444 0 0.641666 0.500000 0 0.641666 0.555556 0 0.641666 0.611111 0 0.641666 0.666667 0 0.641666 0.722222 0 0.641666 0.777778 0 0.641666 0.833333 0 0.641666 0.888889 0 0.641666 0.944444 0 0.641666 1.000000 0 0.649999 0 0 0.649999 0.055556 0 0.649999 0.111111 0 0.649999 0.166667 0 0.649999 0.222222 0 0.649999 0.277778 0 0.649999 0.333333 0 0.649999 0.388889 0 0.649999 0.444444 0 0.649999 0.500000 0 0.649999 0.555556 0 0.649999 0.611111 0 0.649999 0.666667 0 0.649999 0.722222 0 0.649999 0.777778 0 0.649999 0.833333 0 0.649999 0.888889 0 0.649999 0.944444 0 0.649999 1.000000 0 0.658333 0 0 0.658333 0.055556 0 0.658333 0.111111 0 0.658333 0.166667 0 0.658333 0.222222 0 0.658333 0.277778 0 0.658333 0.333333 0 0.658333 0.388889 0 0.658333 0.444444 0 0.658333 0.500000 0 0.658333 0.555556 0 0.658333 0.611111 0 0.658333 0.666667 0 0.658333 0.722222 0 0.658333 0.777778 0 0.658333 0.833333 0 0.658333 0.888889 0 0.658333 0.944444 0 0.658333 1.000000 0 0.666666 0 0 0.666666 0.055556 0 0.666666 0.111111 0 0.666666 0.166667 0 0.666666 0.222222 0 0.666666 0.277778 0 0.666666 0.333333 0 0.666666 0.388889 0 0.666666 0.444444 0 0.666666 0.500000 0 0.666666 0.555556 0 0.666666 0.611111 0 0.666666 0.666667 0 0.666666 0.722222 0 0.666666 0.777778 0 0.666666 0.833333 0 0.666666 0.888889 0 0.666666 0.944444 0 0.666666 1.000000 0 0.675000 0 0 0.675000 0.055556 0 0.675000 0.111111 0 0.675000 0.166667 0 0.675000 0.222222 0 0.675000 0.277778 0 0.675000 0.333333 0 0.675000 0.388889 0 0.675000 0.444444 0 0.675000 0.500000 0 0.675000 0.555556 0 0.675000 0.611111 0 0.675000 0.666667 0 0.675000 0.722222 0 0.675000 0.777778 0 0.675000 0.833333 0 0.675000 0.888889 0 0.675000 0.944444 0 0.675000 1.000000 0 0.683333 0 0 0.683333 0.055556 0 0.683333 0.111111 0 0.683333 0.166667 0 0.683333 0.222222 0 0.683333 0.277778 0 0.683333 0.333333 0 0.683333 0.388889 0 0.683333 0.444444 0 0.683333 0.500000 0 0.683333 0.555556 0 0.683333 0.611111 0 0.683333 0.666667 0 0.683333 0.722222 0 0.683333 0.777778 0 0.683333 0.833333 0 0.683333 0.888889 0 0.683333 0.944444 0 0.683333 1.000000 0 0.691666 0 0 0.691666 0.055556 0 0.691666 0.111111 0 0.691666 0.166667 0 0.691666 0.222222 0 0.691666 0.277778 0 0.691666 0.333333 0 0.691666 0.388889 0 0.691666 0.444444 0 0.691666 0.500000 0 0.691666 0.555556 0 0.691666 0.611111 0 0.691666 0.666667 0 0.691666 0.722222 0 0.691666 0.777778 0 0.691666 0.833333 0 0.691666 0.888889 0 0.691666 0.944444 0 0.691666 1.000000 0 0.700000 0 0 0.700000 0.055556 0 0.700000 0.111111 0 0.700000 0.166667 0 0.700000 0.222222 0 0.700000 0.277778 0 0.700000 0.333333 0 0.700000 0.388889 0 0.700000 0.444444 0 0.700000 0.500000 0 0.700000 0.555556 0 0.700000 0.611111 0 0.700000 0.666667 0 0.700000 0.722222 0 0.700000 0.777778 0 0.700000 0.833333 0 0.700000 0.888889 0 0.700000 0.944444 0 0.700000 1.000000 0 0.708333 0 0 0.708333 0.055556 0 0.708333 0.111111 0 0.708333 0.166667 0 0.708333 0.222222 0 0.708333 0.277778 0 0.708333 0.333333 0 0.708333 0.388889 0 0.708333 0.444444 0 0.708333 0.500000 0 0.708333 0.555556 0 0.708333 0.611111 0 0.708333 0.666667 0 0.708333 0.722222 0 0.708333 0.777778 0 0.708333 0.833333 0 0.708333 0.888889 0 0.708333 0.944444 0 0.708333 1.000000 0 0.716666 0 0 0.716666 0.055556 0 0.716666 0.111111 0 0.716666 0.166667 0 0.716666 0.222222 0 0.716666 0.277778 0 0.716666 0.333333 0 0.716666 0.388889 0 0.716666 0.444444 0 0.716666 0.500000 0 0.716666 0.555556 0 0.716666 0.611111 0 0.716666 0.666667 0 0.716666 0.722222 0 0.716666 0.777778 0 0.716666 0.833333 0 0.716666 0.888889 0 0.716666 0.944444 0 0.716666 1.000000 0 0.725000 0 0 0.725000 0.055556 0 0.725000 0.111111 0 0.725000 0.166667 0 0.725000 0.222222 0 0.725000 0.277778 0 0.725000 0.333333 0 0.725000 0.388889 0 0.725000 0.444444 0 0.725000 0.500000 0 0.725000 0.555556 0 0.725000 0.611111 0 0.725000 0.666667 0 0.725000 0.722222 0 0.725000 0.777778 0 0.725000 0.833333 0 0.725000 0.888889 0 0.725000 0.944444 0 0.725000 1.000000 0 0.733333 0 0 0.733333 0.055556 0 0.733333 0.111111 0 0.733333 0.166667 0 0.733333 0.222222 0 0.733333 0.277778 0 0.733333 0.333333 0 0.733333 0.388889 0 0.733333 0.444444 0 0.733333 0.500000 0 0.733333 0.555556 0 0.733333 0.611111 0 0.733333 0.666667 0 0.733333 0.722222 0 0.733333 0.777778 0 0.733333 0.833333 0 0.733333 0.888889 0 0.733333 0.944444 0 0.733333 1.000000 0 0.741666 0 0 0.741666 0.055556 0 0.741666 0.111111 0 0.741666 0.166667 0 0.741666 0.222222 0 0.741666 0.277778 0 0.741666 0.333333 0 0.741666 0.388889 0 0.741666 0.444444 0 0.741666 0.500000 0 0.741666 0.555556 0 0.741666 0.611111 0 0.741666 0.666667 0 0.741666 0.722222 0 0.741666 0.777778 0 0.741666 0.833333 0 0.741666 0.888889 0 0.741666 0.944444 0 0.741666 1.000000 0 0.750000 0 0 0.750000 0.055556 0 0.750000 0.111111 0 0.750000 0.166667 0 0.750000 0.222222 0 0.750000 0.277778 0 0.750000 0.333333 0 0.750000 0.388889 0 0.750000 0.444444 0 0.750000 0.500000 0 0.750000 0.555556 0 0.750000 0.611111 0 0.750000 0.666667 0 0.750000 0.722222 0 0.750000 0.777778 0 0.750000 0.833333 0 0.750000 0.888889 0 0.750000 0.944444 0 0.750000 1.000000 0 0.758333 0 0 0.758333 0.055556 0 0.758333 0.111111 0 0.758333 0.166667 0 0.758333 0.222222 0 0.758333 0.277778 0 0.758333 0.333333 0 0.758333 0.388889 0 0.758333 0.444444 0 0.758333 0.500000 0 0.758333 0.555556 0 0.758333 0.611111 0 0.758333 0.666667 0 0.758333 0.722222 0 0.758333 0.777778 0 0.758333 0.833333 0 0.758333 0.888889 0 0.758333 0.944444 0 0.758333 1.000000 0 0.766667 0 0 0.766667 0.055556 0 0.766667 0.111111 0 0.766667 0.166667 0 0.766667 0.222222 0 0.766667 0.277778 0 0.766667 0.333333 0 0.766667 0.388889 0 0.766667 0.444444 0 0.766667 0.500000 0 0.766667 0.555556 0 0.766667 0.611111 0 0.766667 0.666667 0 0.766667 0.722222 0 0.766667 0.777778 0 0.766667 0.833333 0 0.766667 0.888889 0 0.766667 0.944444 0 0.766667 1.000000 0 0.775000 0 0 0.775000 0.055556 0 0.775000 0.111111 0 0.775000 0.166667 0 0.775000 0.222222 0 0.775000 0.277778 0 0.775000 0.333333 0 0.775000 0.388889 0 0.775000 0.444444 0 0.775000 0.500000 0 0.775000 0.555556 0 0.775000 0.611111 0 0.775000 0.666667 0 0.775000 0.722222 0 0.775000 0.777778 0 0.775000 0.833333 0 0.775000 0.888889 0 0.775000 0.944444 0 0.775000 1.000000 0 0.783333 0 0 0.783333 0.055556 0 0.783333 0.111111 0 0.783333 0.166667 0 0.783333 0.222222 0 0.783333 0.277778 0 0.783333 0.333333 0 0.783333 0.388889 0 0.783333 0.444444 0 0.783333 0.500000 0 0.783333 0.555556 0 0.783333 0.611111 0 0.783333 0.666667 0 0.783333 0.722222 0 0.783333 0.777778 0 0.783333 0.833333 0 0.783333 0.888889 0 0.783333 0.944444 0 0.783333 1.000000 0 0.791667 0 0 0.791667 0.055556 0 0.791667 0.111111 0 0.791667 0.166667 0 0.791667 0.222222 0 0.791667 0.277778 0 0.791667 0.333333 0 0.791667 0.388889 0 0.791667 0.444444 0 0.791667 0.500000 0 0.791667 0.555556 0 0.791667 0.611111 0 0.791667 0.666667 0 0.791667 0.722222 0 0.791667 0.777778 0 0.791667 0.833333 0 0.791667 0.888889 0 0.791667 0.944444 0 0.791667 1.000000 0 0.800000 0 0 0.800000 0.055556 0 0.800000 0.111111 0 0.800000 0.166667 0 0.800000 0.222222 0 0.800000 0.277778 0 0.800000 0.333333 0 0.800000 0.388889 0 0.800000 0.444444 0 0.800000 0.500000 0 0.800000 0.555556 0 0.800000 0.611111 0 0.800000 0.666667 0 0.800000 0.722222 0 0.800000 0.777778 0 0.800000 0.833333 0 0.800000 0.888889 0 0.800000 0.944444 0 0.800000 1.000000 0 0.808333 0 0 0.808333 0.055556 0 0.808333 0.111111 0 0.808333 0.166667 0 0.808333 0.222222 0 0.808333 0.277778 0 0.808333 0.333333 0 0.808333 0.388889 0 0.808333 0.444444 0 0.808333 0.500000 0 0.808333 0.555556 0 0.808333 0.611111 0 0.808333 0.666667 0 0.808333 0.722222 0 0.808333 0.777778 0 0.808333 0.833333 0 0.808333 0.888889 0 0.808333 0.944444 0 0.808333 1.000000 0 0.816667 0 0 0.816667 0.055556 0 0.816667 0.111111 0 0.816667 0.166667 0 0.816667 0.222222 0 0.816667 0.277778 0 0.816667 0.333333 0 0.816667 0.388889 0 0.816667 0.444444 0 0.816667 0.500000 0 0.816667 0.555556 0 0.816667 0.611111 0 0.816667 0.666667 0 0.816667 0.722222 0 0.816667 0.777778 0 0.816667 0.833333 0 0.816667 0.888889 0 0.816667 0.944444 0 0.816667 1.000000 0 0.825000 0 0 0.825000 0.055556 0 0.825000 0.111111 0 0.825000 0.166667 0 0.825000 0.222222 0 0.825000 0.277778 0 0.825000 0.333333 0 0.825000 0.388889 0 0.825000 0.444444 0 0.825000 0.500000 0 0.825000 0.555556 0 0.825000 0.611111 0 0.825000 0.666667 0 0.825000 0.722222 0 0.825000 0.777778 0 0.825000 0.833333 0 0.825000 0.888889 0 0.825000 0.944444 0 0.825000 1.000000 0 0.833333 0 0 0.833333 0.055556 0 0.833333 0.111111 0 0.833333 0.166667 0 0.833333 0.222222 0 0.833333 0.277778 0 0.833333 0.333333 0 0.833333 0.388889 0 0.833333 0.444444 0 0.833333 0.500000 0 0.833333 0.555556 0 0.833333 0.611111 0 0.833333 0.666667 0 0.833333 0.722222 0 0.833333 0.777778 0 0.833333 0.833333 0 0.833333 0.888889 0 0.833333 0.944444 0 0.833333 1.000000 0 0.841667 0 0 0.841667 0.055556 0 0.841667 0.111111 0 0.841667 0.166667 0 0.841667 0.222222 0 0.841667 0.277778 0 0.841667 0.333333 0 0.841667 0.388889 0 0.841667 0.444444 0 0.841667 0.500000 0 0.841667 0.555556 0 0.841667 0.611111 0 0.841667 0.666667 0 0.841667 0.722222 0 0.841667 0.777778 0 0.841667 0.833333 0 0.841667 0.888889 0 0.841667 0.944444 0 0.841667 1.000000 0 0.850000 0 0 0.850000 0.055556 0 0.850000 0.111111 0 0.850000 0.166667 0 0.850000 0.222222 0 0.850000 0.277778 0 0.850000 0.333333 0 0.850000 0.388889 0 0.850000 0.444444 0 0.850000 0.500000 0 0.850000 0.555556 0 0.850000 0.611111 0 0.850000 0.666667 0 0.850000 0.722222 0 0.850000 0.777778 0 0.850000 0.833333 0 0.850000 0.888889 0 0.850000 0.944444 0 0.850000 1.000000 0 0.858334 0 0 0.858334 0.055556 0 0.858334 0.111111 0 0.858334 0.166667 0 0.858334 0.222222 0 0.858334 0.277778 0 0.858334 0.333333 0 0.858334 0.388889 0 0.858334 0.444444 0 0.858334 0.500000 0 0.858334 0.555556 0 0.858334 0.611111 0 0.858334 0.666667 0 0.858334 0.722222 0 0.858334 0.777778 0 0.858334 0.833333 0 0.858334 0.888889 0 0.858334 0.944444 0 0.858334 1.000000 0 0.866667 0 0 0.866667 0.055556 0 0.866667 0.111111 0 0.866667 0.166667 0 0.866667 0.222222 0 0.866667 0.277778 0 0.866667 0.333333 0 0.866667 0.388889 0 0.866667 0.444444 0 0.866667 0.500000 0 0.866667 0.555556 0 0.866667 0.611111 0 0.866667 0.666667 0 0.866667 0.722222 0 0.866667 0.777778 0 0.866667 0.833333 0 0.866667 0.888889 0 0.866667 0.944444 0 0.866667 1.000000 0 0.875000 0 0 0.875000 0.055556 0 0.875000 0.111111 0 0.875000 0.166667 0 0.875000 0.222222 0 0.875000 0.277778 0 0.875000 0.333333 0 0.875000 0.388889 0 0.875000 0.444444 0 0.875000 0.500000 0 0.875000 0.555556 0 0.875000 0.611111 0 0.875000 0.666667 0 0.875000 0.722222 0 0.875000 0.777778 0 0.875000 0.833333 0 0.875000 0.888889 0 0.875000 0.944444 0 0.875000 1.000000 0 0.883334 0 0 0.883334 0.055556 0 0.883334 0.111111 0 0.883334 0.166667 0 0.883334 0.222222 0 0.883334 0.277778 0 0.883334 0.333333 0 0.883334 0.388889 0 0.883334 0.444444 0 0.883334 0.500000 0 0.883334 0.555556 0 0.883334 0.611111 0 0.883334 0.666667 0 0.883334 0.722222 0 0.883334 0.777778 0 0.883334 0.833333 0 0.883334 0.888889 0 0.883334 0.944444 0 0.883334 1.000000 0 0.891667 0 0 0.891667 0.055556 0 0.891667 0.111111 0 0.891667 0.166667 0 0.891667 0.222222 0 0.891667 0.277778 0 0.891667 0.333333 0 0.891667 0.388889 0 0.891667 0.444444 0 0.891667 0.500000 0 0.891667 0.555556 0 0.891667 0.611111 0 0.891667 0.666667 0 0.891667 0.722222 0 0.891667 0.777778 0 0.891667 0.833333 0 0.891667 0.888889 0 0.891667 0.944444 0 0.891667 1.000000 0 0.900000 0 0 0.900000 0.055556 0 0.900000 0.111111 0 0.900000 0.166667 0 0.900000 0.222222 0 0.900000 0.277778 0 0.900000 0.333333 0 0.900000 0.388889 0 0.900000 0.444444 0 0.900000 0.500000 0 0.900000 0.555556 0 0.900000 0.611111 0 0.900000 0.666667 0 0.900000 0.722222 0 0.900000 0.777778 0 0.900000 0.833333 0 0.900000 0.888889 0 0.900000 0.944444 0 0.900000 1.000000 0 0.908334 0 0 0.908334 0.055556 0 0.908334 0.111111 0 0.908334 0.166667 0 0.908334 0.222222 0 0.908334 0.277778 0 0.908334 0.333333 0 0.908334 0.388889 0 0.908334 0.444444 0 0.908334 0.500000 0 0.908334 0.555556 0 0.908334 0.611111 0 0.908334 0.666667 0 0.908334 0.722222 0 0.908334 0.777778 0 0.908334 0.833333 0 0.908334 0.888889 0 0.908334 0.944444 0 0.908334 1.000000 0 0.916667 0 0 0.916667 0.055556 0 0.916667 0.111111 0 0.916667 0.166667 0 0.916667 0.222222 0 0.916667 0.277778 0 0.916667 0.333333 0 0.916667 0.388889 0 0.916667 0.444444 0 0.916667 0.500000 0 0.916667 0.555556 0 0.916667 0.611111 0 0.916667 0.666667 0 0.916667 0.722222 0 0.916667 0.777778 0 0.916667 0.833333 0 0.916667 0.888889 0 0.916667 0.944444 0 0.916667 1.000000 0 0.925000 0 0 0.925000 0.055556 0 0.925000 0.111111 0 0.925000 0.166667 0 0.925000 0.222222 0 0.925000 0.277778 0 0.925000 0.333333 0 0.925000 0.388889 0 0.925000 0.444444 0 0.925000 0.500000 0 0.925000 0.555556 0 0.925000 0.611111 0 0.925000 0.666667 0 0.925000 0.722222 0 0.925000 0.777778 0 0.925000 0.833333 0 0.925000 0.888889 0 0.925000 0.944444 0 0.925000 1.000000 0 0.933334 0 0 0.933334 0.055556 0 0.933334 0.111111 0 0.933334 0.166667 0 0.933334 0.222222 0 0.933334 0.277778 0 0.933334 0.333333 0 0.933334 0.388889 0 0.933334 0.444444 0 0.933334 0.500000 0 0.933334 0.555556 0 0.933334 0.611111 0 0.933334 0.666667 0 0.933334 0.722222 0 0.933334 0.777778 0 0.933334 0.833333 0 0.933334 0.888889 0 0.933334 0.944444 0 0.933334 1.000000 0 0.941667 0 0 0.941667 0.055556 0 0.941667 0.111111 0 0.941667 0.166667 0 0.941667 0.222222 0 0.941667 0.277778 0 0.941667 0.333333 0 0.941667 0.388889 0 0.941667 0.444444 0 0.941667 0.500000 0 0.941667 0.555556 0 0.941667 0.611111 0 0.941667 0.666667 0 0.941667 0.722222 0 0.941667 0.777778 0 0.941667 0.833333 0 0.941667 0.888889 0 0.941667 0.944444 0 0.941667 1.000000 0 0.950001 0 0 0.950001 0.055556 0 0.950001 0.111111 0 0.950001 0.166667 0 0.950001 0.222222 0 0.950001 0.277778 0 0.950001 0.333333 0 0.950001 0.388889 0 0.950001 0.444444 0 0.950001 0.500000 0 0.950001 0.555556 0 0.950001 0.611111 0 0.950001 0.666667 0 0.950001 0.722222 0 0.950001 0.777778 0 0.950001 0.833333 0 0.950001 0.888889 0 0.950001 0.944444 0 0.950001 1.000000 0 0.958334 0 0 0.958334 0.055556 0 0.958334 0.111111 0 0.958334 0.166667 0 0.958334 0.222222 0 0.958334 0.277778 0 0.958334 0.333333 0 0.958334 0.388889 0 0.958334 0.444444 0 0.958334 0.500000 0 0.958334 0.555556 0 0.958334 0.611111 0 0.958334 0.666667 0 0.958334 0.722222 0 0.958334 0.777778 0 0.958334 0.833333 0 0.958334 0.888889 0 0.958334 0.944444 0 0.958334 1.000000 0 0.966667 0 0 0.966667 0.055556 0 0.966667 0.111111 0 0.966667 0.166667 0 0.966667 0.222222 0 0.966667 0.277778 0 0.966667 0.333333 0 0.966667 0.388889 0 0.966667 0.444444 0 0.966667 0.500000 0 0.966667 0.555556 0 0.966667 0.611111 0 0.966667 0.666667 0 0.966667 0.722222 0 0.966667 0.777778 0 0.966667 0.833333 0 0.966667 0.888889 0 0.966667 0.944444 0 0.966667 1.000000 0 0.975001 0 0 0.975001 0.055556 0 0.975001 0.111111 0 0.975001 0.166667 0 0.975001 0.222222 0 0.975001 0.277778 0 0.975001 0.333333 0 0.975001 0.388889 0 0.975001 0.444444 0 0.975001 0.500000 0 0.975001 0.555556 0 0.975001 0.611111 0 0.975001 0.666667 0 0.975001 0.722222 0 0.975001 0.777778 0 0.975001 0.833333 0 0.975001 0.888889 0 0.975001 0.944444 0 0.975001 1.000000 0 0.983334 0 0 0.983334 0.055556 0 0.983334 0.111111 0 0.983334 0.166667 0 0.983334 0.222222 0 0.983334 0.277778 0 0.983334 0.333333 0 0.983334 0.388889 0 0.983334 0.444444 0 0.983334 0.500000 0 0.983334 0.555556 0 0.983334 0.611111 0 0.983334 0.666667 0 0.983334 0.722222 0 0.983334 0.777778 0 0.983334 0.833333 0 0.983334 0.888889 0 0.983334 0.944444 0 0.983334 1.000000 0 0.991667 0 0 0.991667 0.055556 0 0.991667 0.111111 0 0.991667 0.166667 0 0.991667 0.222222 0 0.991667 0.277778 0 0.991667 0.333333 0 0.991667 0.388889 0 0.991667 0.444444 0 0.991667 0.500000 0 0.991667 0.555556 0 0.991667 0.611111 0 0.991667 0.666667 0 0.991667 0.722222 0 0.991667 0.777778 0 0.991667 0.833333 0 0.991667 0.888889 0 0.991667 0.944444 0 0.991667 1.000000 0 1.000001 0 0 1.000001 0.055556 0 1.000001 0.111111 0 1.000001 0.166667 0 1.000001 0.222222 0 1.000001 0.277778 0 1.000001 0.333333 0 1.000001 0.388889 0 1.000001 0.444444 0 1.000001 0.500000 0 1.000001 0.555556 0 1.000001 0.611111 0 1.000001 0.666667 0 1.000001 0.722222 0 1.000001 0.777778 0 1.000001 0.833333 0 1.000001 0.888889 0 1.000001 0.944444 0 1.000001 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="2299" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="4320">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 18 1 19 19 2 20 0 0 0 19 2 20 1 3 1 1 3 1 19 2 20 20 4 21 1 3 1 20 4 21 2 5 2 2 5 2 20 4 21 21 6 22 2 5 2 21 6 22 3 7 3 3 7 3 21 6 22 22 8 23 3 7 3 22 8 23 4 9 4 4 9 4 22 8 23 23 10 24 4 9 4 23 10 24 5 11 5 5 11 5 23 10 24 24 12 25 5 11 5 24 12 25 6 13 6 6 13 6 24 12 25 25 14 26 6 13 6 25 14 26 7 15 7 7 15 7 25 14 26 26 16 27 7 15 7 26 16 27 8 17 8 8 17 8 26 16 27 27 18 28 8 17 8 27 18 28 9 19 9 9 19 9 27 18 28 28 20 29 9 19 9 28 20 29 10 21 10 10 21 10 28 20 29 29 22 30 10 21 10 29 22 30 11 23 11 11 23 11 29 22 30 30 24 31 11 23 11 30 24 31 12 25 12 12 25 12 30 24 31 31 26 32 12 25 12 31 26 32 13 27 13 13 27 13 31 26 32 32 28 33 13 27 13 32 28 33 14 29 14 14 29 14 32 28 33 33 30 34 14 29 14 33 30 34 15 31 15 15 31 15 33 30 34 34 32 35 15 31 15 34 32 35 16 33 16 16 33 16 34 32 35 35 34 36 16 33 16 35 34 36 17 35 17 17 35 17 35 34 36 18 1 37 17 35 17 18 1 37 0 0 18 18 1 19 36 36 38 37 37 39 18 1 19 37 37 39 19 2 20 19 2 20 37 37 39 38 38 40 19 2 20 38 38 40 20 4 21 20 4 21 38 38 40 39 39 41 20 4 21 39 39 41 21 6 22 21 6 22 39 39 41 40 40 42 21 6 22 40 40 42 22 8 23 22 8 23 40 40 42 41 41 43 22 8 23 41 41 43 23 10 24 23 10 24 41 41 43 42 42 44 23 10 24 42 42 44 24 12 25 24 12 25 42 42 44 43 43 45 24 12 25 43 43 45 25 14 26 25 14 26 43 43 45 44 44 46 25 14 26 44 44 46 26 16 27 26 16 27 44 44 46 45 45 47 26 16 27 45 45 47 27 18 28 27 18 28 45 45 47 46 46 48 27 18 28 46 46 48 28 20 29 28 20 29 46 46 48 47 47 49 28 20 29 47 47 49 29 22 30 29 22 30 47 47 49 48 48 50 29 22 30 48 48 50 30 24 31 30 24 31 48 48 50 49 49 51 30 24 31 49 49 51 31 26 32 31 26 32 49 49 51 50 50 52 31 26 32 50 50 52 32 28 33 32 28 33 50 50 52 51 51 53 32 28 33 51 51 53 33 30 34 33 30 34 51 51 53 52 52 54 33 30 34 52 52 54 34 32 35 34 32 35 52 52 54 53 53 55 34 32 35 53 53 55 35 34 36 35 34 36 53 53 55 36 36 56 35 34 36 36 36 56 18 1 37 36 36 38 54 54 57 55 55 58 36 36 38 55 55 58 37 37 39 37 37 39 55 55 58 56 56 59 37 37 39 56 56 59 38 38 40 38 38 40 56 56 59 57 57 60 38 38 40 57 57 60 39 39 41 39 39 41 57 57 60 58 58 61 39 39 41 58 58 61 40 40 42 40 40 42 58 58 61 59 59 62 40 40 42 59 59 62 41 41 43 41 41 43 59 59 62 60 60 63 41 41 43 60 60 63 42 42 44 42 42 44 60 60 63 61 61 64 42 42 44 61 61 64 43 43 45 43 43 45 61 61 64 62 62 65 43 43 45 62 62 65 44 44 46 44 44 46 62 62 65 63 63 66 44 44 46 63 63 66 45 45 47 45 45 47 63 63 66 64 64 67 45 45 47 64 64 67 46 46 48 46 46 48 64 64 67 65 65 68 46 46 48 65 65 68 47 47 49 47 47 49 65 65 68 66 66 69 47 47 49 66 66 69 48 48 50 48 48 50 66 66 69 67 67 70 48 48 50 67 67 70 49 49 51 49 49 51 67 67 70 68 68 71 49 49 51 68 68 71 50 50 52 50 50 52 68 68 71 69 69 72 50 50 52 69 69 72 51 51 53 51 51 53 69 69 72 70 70 73 51 51 53 70 70 73 52 52 54 52 52 54 70 70 73 71 71 74 52 52 54 71 71 74 53 53 55 53 53 55 71 71 74 54 54 75 53 53 55 54 54 75 36 36 56 54 54 57 72 72 76 73 73 77 54 54 57 73 73 77 55 55 58 55 55 58 73 73 77 74 74 78 55 55 58 74 74 78 56 56 59 56 56 59 74 74 78 75 75 79 56 56 59 75 75 79 57 57 60 57 57 60 75 75 79 76 76 80 57 57 60 76 76 80 58 58 61 58 58 61 76 76 80 77 77 81 58 58 61 77 77 81 59 59 62 59 59 62 77 77 81 78 78 82 59 59 62 78 78 82 60 60 63 60 60 63 78 78 82 79 79 83 60 60 63 79 79 83 61 61 64 61 61 64 79 79 83 80 80 84 61 61 64 80 80 84 62 62 65 62 62 65 80 80 84 81 81 85 62 62 65 81 81 85 63 63 66 63 63 66 81 81 85 82 82 86 63 63 66 82 82 86 64 64 67 64 64 67 82 82 86 83 83 87 64 64 67 83 83 87 65 65 68 65 65 68 83 83 87 84 84 88 65 65 68 84 84 88 66 66 69 66 66 69 84 84 88 85 85 89 66 66 69 85 85 89 67 67 70 67 67 70 85 85 89 86 86 90 67 67 70 86 86 90 68 68 71 68 68 71 86 86 90 87 87 91 68 68 71 87 87 91 69 69 72 69 69 72 87 87 91 88 88 92 69 69 72 88 88 92 70 70 73 70 70 73 88 88 92 89 89 93 70 70 73 89 89 93 71 71 74 71 71 74 89 89 93 72 72 94 71 71 74 72 72 94 54 54 75 72 72 76 90 90 95 91 91 96 72 72 76 91 91 96 73 73 77 73 73 77 91 91 96 92 92 97 73 73 77 92 92 97 74 74 78 74 74 78 92 92 97 93 93 98 74 74 78 93 93 98 75 75 79 75 75 79 93 93 98 94 94 99 75 75 79 94 94 99 76 76 80 76 76 80 94 94 99 95 95 100 76 76 80 95 95 100 77 77 81 77 77 81 95 95 100 96 96 101 77 77 81 96 96 101 78 78 82 78 78 82 96 96 101 97 97 102 78 78 82 97 97 102 79 79 83 79 79 83 97 97 102 98 98 103 79 79 83 98 98 103 80 80 84 80 80 84 98 98 103 99 99 104 80 80 84 99 99 104 81 81 85 81 81 85 99 99 104 100 100 105 81 81 85 100 100 105 82 82 86 82 82 86 100 100 105 101 101 106 82 82 86 101 101 106 83 83 87 83 83 87 101 101 106 102 102 107 83 83 87 102 102 107 84 84 88 84 84 88 102 102 107 103 103 108 84 84 88 103 103 108 85 85 89 85 85 89 103 103 108 104 104 109 85 85 89 104 104 109 86 86 90 86 86 90 104 104 109 105 105 110 86 86 90 105 105 110 87 87 91 87 87 91 105 105 110 106 106 111 87 87 91 106 106 111 88 88 92 88 88 92 106 106 111 107 107 112 88 88 92 107 107 112 89 89 93 89 89 93 107 107 112 90 90 113 89 89 93 90 90 113 72 72 94 90 90 95 108 108 114 109 109 115 90 90 95 109 109 115 91 91 96 91 91 96 109 109 115 110 110 116 91 91 96 110 110 116 92 92 97 92 92 97 110 110 116 111 111 117 92 92 97 111 111 117 93 93 98 93 93 98 111 111 117 112 112 118 93 93 98 112 112 118 94 94 99 94 94 99 112 112 118 113 113 119 94 94 99 113 113 119 95 95 100 95 95 100 113 113 119 114 114 120 95 95 100 114 114 120 96 96 101 96 96 101 114 114 120 115 115 121 96 96 101 115 115 121 97 97 102 97 97 102 115 115 121 116 116 122 97 97 102 116 116 122 98 98 103 98 98 103 116 116 122 117 117 123 98 98 103 117 117 123 99 99 104 99 99 104 117 117 123 118 118 124 99 99 104 118 118 124 100 100 105 100 100 105 118 118 124 119 119 125 100 100 105 119 119 125 101 101 106 101 101 106 119 119 125 120 120 126 101 101 106 120 120 126 102 102 107 102 102 107 120 120 126 121 121 127 102 102 107 121 121 127 103 103 108 103 103 108 121 121 127 122 122 128 103 103 108 122 122 128 104 104 109 104 104 109 122 122 128 123 123 129 104 104 109 123 123 129 105 105 110 105 105 110 123 123 129 124 124 130 105 105 110 124 124 130 106 106 111 106 106 111 124 124 130 125 125 131 106 106 111 125 125 131 107 107 112 107 107 112 125 125 131 108 108 132 107 107 112 108 108 132 90 90 113 108 108 114 126 126 133 127 127 134 108 108 114 127 127 134 109 109 115 109 109 115 127 127 134 128 128 135 109 109 115 128 128 135 110 110 116 110 110 116 128 128 135 129 129 136 110 110 116 129 129 136 111 111 117 111 111 117 129 129 136 130 130 137 111 111 117 130 130 137 112 112 118 112 112 118 130 130 137 131 131 138 112 112 118 131 131 138 113 113 119 113 113 119 131 131 138 132 132 139 113 113 119 132 132 139 114 114 120 114 114 120 132 132 139 133 133 140 114 114 120 133 133 140 115 115 121 115 115 121 133 133 140 134 134 141 115 115 121 134 134 141 116 116 122 116 116 122 134 134 141 135 135 142 116 116 122 135 135 142 117 117 123 117 117 123 135 135 142 136 136 143 117 117 123 136 136 143 118 118 124 118 118 124 136 136 143 137 137 144 118 118 124 137 137 144 119 119 125 119 119 125 137 137 144 138 138 145 119 119 125 138 138 145 120 120 126 120 120 126 138 138 145 139 139 146 120 120 126 139 139 146 121 121 127 121 121 127 139 139 146 140 140 147 121 121 127 140 140 147 122 122 128 122 122 128 140 140 147 141 141 148 122 122 128 141 141 148 123 123 129 123 123 129 141 141 148 142 142 149 123 123 129 142 142 149 124 124 130 124 124 130 142 142 149 143 143 150 124 124 130 143 143 150 125 125 131 125 125 131 143 143 150 126 126 151 125 125 131 126 126 151 108 108 132 126 126 133 144 144 152 145 145 153 126 126 133 145 145 153 127 127 134 127 127 134 145 145 153 146 146 154 127 127 134 146 146 154 128 128 135 128 128 135 146 146 154 147 147 155 128 128 135 147 147 155 129 129 136 129 129 136 147 147 155 148 148 156 129 129 136 148 148 156 130 130 137 130 130 137 148 148 156 149 149 157 130 130 137 149 149 157 131 131 138 131 131 138 149 149 157 150 150 158 131 131 138 150 150 158 132 132 139 132 132 139 150 150 158 151 151 159 132 132 139 151 151 159 133 133 140 133 133 140 151 151 159 152 152 160 133 133 140 152 152 160 134 134 141 134 134 141 152 152 160 153 153 161 134 134 141 153 153 161 135 135 142 135 135 142 153 153 161 154 154 162 135 135 142 154 154 162 136 136 143 136 136 143 154 154 162 155 155 163 136 136 143 155 155 163 137 137 144 137 137 144 155 155 163 156 156 164 137 137 144 156 156 164 138 138 145 138 138 145 156 156 164 157 157 165 138 138 145 157 157 165 139 139 146 139 139 146 157 157 165 158 158 166 139 139 146 158 158 166 140 140 147 140 140 147 158 158 166 159 159 167 140 140 147 159 159 167 141 141 148 141 141 148 159 159 167 160 160 168 141 141 148 160 160 168 142 142 149 142 142 149 160 160 168 161 161 169 142 142 149 161 161 169 143 143 150 143 143 150 161 161 169 144 144 170 143 143 150 144 144 170 126 126 151 144 144 152 162 162 171 163 163 172 144 144 152 163 163 172 145 145 153 145 145 153 163 163 172 164 164 173 145 145 153 164 164 173 146 146 154 146 146 154 164 164 173 165 165 174 146 146 154 165 165 174 147 147 155 147 147 155 165 165 174 166 166 175 147 147 155 166 166 175 148 148 156 148 148 156 166 166 175 167 167 176 148 148 156 167 167 176 149 149 157 149 149 157 167 167 176 168 168 177 149 149 157 168 168 177 150 150 158 150 150 158 168 168 177 169 169 178 150 150 158 169 169 178 151 151 159 151 151 159 169 169 178 170 170 179 151 151 159 170 170 179 152 152 160 152 152 160 170 170 179 171 171 180 152 152 160 171 171 180 153 153 161 153 153 161 171 171 180 172 172 181 153 153 161 172 172 181 154 154 162 154 154 162 172 172 181 173 173 182 154 154 162 173 173 182 155 155 163 155 155 163 173 173 182 174 174 183 155 155 163 174 174 183 156 156 164 156 156 164 174 174 183 175 175 184 156 156 164 175 175 184 157 157 165 157 157 165 175 175 184 176 176 185 157 157 165 176 176 185 158 158 166 158 158 166 176 176 185 177 177 186 158 158 166 177 177 186 159 159 167 159 159 167 177 177 186 178 178 187 159 159 167 178 178 187 160 160 168 160 160 168 178 178 187 179 179 188 160 160 168 179 179 188 161 161 169 161 161 169 179 179 188 162 162 189 161 161 169 162 162 189 144 144 170 162 162 171 180 180 190 181 181 191 162 162 171 181 181 191 163 163 172 163 163 172 181 181 191 182 182 192 163 163 172 182 182 192 164 164 173 164 164 173 182 182 192 183 183 193 164 164 173 183 183 193 165 165 174 165 165 174 183 183 193 184 184 194 165 165 174 184 184 194 166 166 175 166 166 175 184 184 194 185 185 195 166 166 175 185 185 195 167 167 176 167 167 176 185 185 195 186 186 196 167 167 176 186 186 196 168 168 177 168 168 177 186 186 196 187 187 197 168 168 177 187 187 197 169 169 178 169 169 178 187 187 197 188 188 198 169 169 178 188 188 198 170 170 179 170 170 179 188 188 198 189 189 199 170 170 179 189 189 199 171 171 180 171 171 180 189 189 199 190 190 200 171 171 180 190 190 200 172 172 181 172 172 181 190 190 200 191 191 201 172 172 181 191 191 201 173 173 182 173 173 182 191 191 201 192 192 202 173 173 182 192 192 202 174 174 183 174 174 183 192 192 202 193 193 203 174 174 183 193 193 203 175 175 184 175 175 184 193 193 203 194 194 204 175 175 184 194 194 204 176 176 185 176 176 185 194 194 204 195 195 205 176 176 185 195 195 205 177 177 186 177 177 186 195 195 205 196 196 206 177 177 186 196 196 206 178 178 187 178 178 187 196 196 206 197 197 207 178 178 187 197 197 207 179 179 188 179 179 188 197 197 207 180 180 208 179 179 188 180 180 208 162 162 189 180 180 190 198 198 209 199 199 210 180 180 190 199 199 210 181 181 191 181 181 191 199 199 210 200 200 211 181 181 191 200 200 211 182 182 192 182 182 192 200 200 211 201 201 212 182 182 192 201 201 212 183 183 193 183 183 193 201 201 212 202 202 213 183 183 193 202 202 213 184 184 194 184 184 194 202 202 213 203 203 214 184 184 194 203 203 214 185 185 195 185 185 195 203 203 214 204 204 215 185 185 195 204 204 215 186 186 196 186 186 196 204 204 215 205 205 216 186 186 196 205 205 216 187 187 197 187 187 197 205 205 216 206 206 217 187 187 197 206 206 217 188 188 198 188 188 198 206 206 217 207 207 218 188 188 198 207 207 218 189 189 199 189 189 199 207 207 218 208 208 219 189 189 199 208 208 219 190 190 200 190 190 200 208 208 219 209 209 220 190 190 200 209 209 220 191 191 201 191 191 201 209 209 220 210 210 221 191 191 201 210 210 221 192 192 202 192 192 202 210 210 221 211 211 222 192 192 202 211 211 222 193 193 203 193 193 203 211 211 222 212 212 223 193 193 203 212 212 223 194 194 204 194 194 204 212 212 223 213 213 224 194 194 204 213 213 224 195 195 205 195 195 205 213 213 224 214 214 225 195 195 205 214 214 225 196 196 206 196 196 206 214 214 225 215 215 226 196 196 206 215 215 226 197 197 207 197 197 207 215 215 226 198 198 227 197 197 207 198 198 227 180 180 208 198 198 209 216 216 228 217 217 229 198 198 209 217 217 229 199 199 210 199 199 210 217 217 229 218 218 230 199 199 210 218 218 230 200 200 211 200 200 211 218 218 230 219 219 231 200 200 211 219 219 231 201 201 212 201 201 212 219 219 231 220 220 232 201 201 212 220 220 232 202 202 213 202 202 213 220 220 232 221 221 233 202 202 213 221 221 233 203 203 214 203 203 214 221 221 233 222 222 234 203 203 214 222 222 234 204 204 215 204 204 215 222 222 234 223 223 235 204 204 215 223 223 235 205 205 216 205 205 216 223 223 235 224 224 236 205 205 216 224 224 236 206 206 217 206 206 217 224 224 236 225 225 237 206 206 217 225 225 237 207 207 218 207 207 218 225 225 237 226 226 238 207 207 218 226 226 238 208 208 219 208 208 219 226 226 238 227 227 239 208 208 219 227 227 239 209 209 220 209 209 220 227 227 239 228 228 240 209 209 220 228 228 240 210 210 221 210 210 221 228 228 240 229 229 241 210 210 221 229 229 241 211 211 222 211 211 222 229 229 241 230 230 242 211 211 222 230 230 242 212 212 223 212 212 223 230 230 242 231 231 243 212 212 223 231 231 243 213 213 224 213 213 224 231 231 243 232 232 244 213 213 224 232 232 244 214 214 225 214 214 225 232 232 244 233 233 245 214 214 225 233 233 245 215 215 226 215 215 226 233 233 245 216 216 246 215 215 226 216 216 246 198 198 227 216 216 228 234 234 247 235 235 248 216 216 228 235 235 248 217 217 229 217 217 229 235 235 248 236 236 249 217 217 229 236 236 249 218 218 230 218 218 230 236 236 249 237 237 250 218 218 230 237 237 250 219 219 231 219 219 231 237 237 250 238 238 251 219 219 231 238 238 251 220 220 232 220 220 232 238 238 251 239 239 252 220 220 232 239 239 252 221 221 233 221 221 233 239 239 252 240 240 253 221 221 233 240 240 253 222 222 234 222 222 234 240 240 253 241 241 254 222 222 234 241 241 254 223 223 235 223 223 235 241 241 254 242 242 255 223 223 235 242 242 255 224 224 236 224 224 236 242 242 255 243 243 256 224 224 236 243 243 256 225 225 237 225 225 237 243 243 256 244 244 257 225 225 237 244 244 257 226 226 238 226 226 238 244 244 257 245 245 258 226 226 238 245 245 258 227 227 239 227 227 239 245 245 258 246 246 259 227 227 239 246 246 259 228 228 240 228 228 240 246 246 259 247 247 260 228 228 240 247 247 260 229 229 241 229 229 241 247 247 260 248 248 261 229 229 241 248 248 261 230 230 242 230 230 242 248 248 261 249 249 262 230 230 242 249 249 262 231 231 243 231 231 243 249 249 262 250 250 263 231 231 243 250 250 263 232 232 244 232 232 244 250 250 263 251 251 264 232 232 244 251 251 264 233 233 245 233 233 245 251 251 264 234 234 265 233 233 245 234 234 265 216 216 246 234 234 247 252 252 266 253 253 267 234 234 247 253 253 267 235 235 248 235 235 248 253 253 267 254 254 268 235 235 248 254 254 268 236 236 249 236 236 249 254 254 268 255 255 269 236 236 249 255 255 269 237 237 250 237 237 250 255 255 269 256 256 270 237 237 250 256 256 270 238 238 251 238 238 251 256 256 270 257 257 271 238 238 251 257 257 271 239 239 252 239 239 252 257 257 271 258 258 272 239 239 252 258 258 272 240 240 253 240 240 253 258 258 272 259 259 273 240 240 253 259 259 273 241 241 254 241 241 254 259 259 273 260 260 274 241 241 254 260 260 274 242 242 255 242 242 255 260 260 274 261 261 275 242 242 255 261 261 275 243 243 256 243 243 256 261 261 275 262 262 276 243 243 256 262 262 276 244 244 257 244 244 257 262 262 276 263 263 277 244 244 257 263 263 277 245 245 258 245 245 258 263 263 277 264 264 278 245 245 258 264 264 278 246 246 259 246 246 259 264 264 278 265 265 279 246 246 259 265 265 279 247 247 260 247 247 260 265 265 279 266 266 280 247 247 260 266 266 280 248 248 261 248 248 261 266 266 280 267 267 281 248 248 261 267 267 281 249 249 262 249 249 262 267 267 281 268 268 282 249 249 262 268 268 282 250 250 263 250 250 263 268 268 282 269 269 283 250 250 263 269 269 283 251 251 264 251 251 264 269 269 283 252 252 284 251 251 264 252 252 284 234 234 265 252 252 266 270 270 285 271 271 286 252 252 266 271 271 286 253 253 267 253 253 267 271 271 286 272 272 287 253 253 267 272 272 287 254 254 268 254 254 268 272 272 287 273 273 288 254 254 268 273 273 288 255 255 269 255 255 269 273 273 288 274 274 289 255 255 269 274 274 289 256 256 270 256 256 270 274 274 289 275 275 290 256 256 270 275 275 290 257 257 271 257 257 271 275 275 290 276 276 291 257 257 271 276 276 291 258 258 272 258 258 272 276 276 291 277 277 292 258 258 272 277 277 292 259 259 273 259 259 273 277 277 292 278 278 293 259 259 273 278 278 293 260 260 274 260 260 274 278 278 293 279 279 294 260 260 274 279 279 294 261 261 275 261 261 275 279 279 294 280 280 295 261 261 275 280 280 295 262 262 276 262 262 276 280 280 295 281 281 296 262 262 276 281 281 296 263 263 277 263 263 277 281 281 296 282 282 297 263 263 277 282 282 297 264 264 278 264 264 278 282 282 297 283 283 298 264 264 278 283 283 298 265 265 279 265 265 279 283 283 298 284 284 299 265 265 279 284 284 299 266 266 280 266 266 280 284 284 299 285 285 300 266 266 280 285 285 300 267 267 281 267 267 281 285 285 300 286 286 301 267 267 281 286 286 301 268 268 282 268 268 282 286 286 301 287 287 302 268 268 282 287 287 302 269 269 283 269 269 283 287 287 302 270 270 303 269 269 283 270 270 303 252 252 284 270 270 285 288 288 304 289 289 305 270 270 285 289 289 305 271 271 286 271 271 286 289 289 305 290 290 306 271 271 286 290 290 306 272 272 287 272 272 287 290 290 306 291 291 307 272 272 287 291 291 307 273 273 288 273 273 288 291 291 307 292 292 308 273 273 288 292 292 308 274 274 289 274 274 289 292 292 308 293 293 309 274 274 289 293 293 309 275 275 290 275 275 290 293 293 309 294 294 310 275 275 290 294 294 310 276 276 291 276 276 291 294 294 310 295 295 311 276 276 291 295 295 311 277 277 292 277 277 292 295 295 311 296 296 312 277 277 292 296 296 312 278 278 293 278 278 293 296 296 312 297 297 313 278 278 293 297 297 313 279 279 294 279 279 294 297 297 313 298 298 314 279 279 294 298 298 314 280 280 295 280 280 295 298 298 314 299 299 315 280 280 295 299 299 315 281 281 296 281 281 296 299 299 315 300 300 316 281 281 296 300 300 316 282 282 297 282 282 297 300 300 316 301 301 317 282 282 297 301 301 317 283 283 298 283 283 298 301 301 317 302 302 318 283 283 298 302 302 318 284 284 299 284 284 299 302 302 318 303 303 319 284 284 299 303 303 319 285 285 300 285 285 300 303 303 319 304 304 320 285 285 300 304 304 320 286 286 301 286 286 301 304 304 320 305 305 321 286 286 301 305 305 321 287 287 302 287 287 302 305 305 321 288 288 322 287 287 302 288 288 322 270 270 303 288 288 304 306 306 323 307 307 324 288 288 304 307 307 324 289 289 305 289 289 305 307 307 324 308 308 325 289 289 305 308 308 325 290 290 306 290 290 306 308 308 325 309 309 326 290 290 306 309 309 326 291 291 307 291 291 307 309 309 326 310 310 327 291 291 307 310 310 327 292 292 308 292 292 308 310 310 327 311 311 328 292 292 308 311 311 328 293 293 309 293 293 309 311 311 328 312 312 329 293 293 309 312 312 329 294 294 310 294 294 310 312 312 329 313 313 330 294 294 310 313 313 330 295 295 311 295 295 311 313 313 330 314 314 331 295 295 311 314 314 331 296 296 312 296 296 312 314 314 331 315 315 332 296 296 312 315 315 332 297 297 313 297 297 313 315 315 332 316 316 333 297 297 313 316 316 333 298 298 314 298 298 314 316 316 333 317 317 334 298 298 314 317 317 334 299 299 315 299 299 315 317 317 334 318 318 335 299 299 315 318 318 335 300 300 316 300 300 316 318 318 335 319 319 336 300 300 316 319 319 336 301 301 317 301 301 317 319 319 336 320 320 337 301 301 317 320 320 337 302 302 318 302 302 318 320 320 337 321 321 338 302 302 318 321 321 338 303 303 319 303 303 319 321 321 338 322 322 339 303 303 319 322 322 339 304 304 320 304 304 320 322 322 339 323 323 340 304 304 320 323 323 340 305 305 321 305 305 321 323 323 340 306 306 341 305 305 321 306 306 341 288 288 322 306 306 323 324 324 342 325 325 343 306 306 323 325 325 343 307 307 324 307 307 324 325 325 343 326 326 344 307 307 324 326 326 344 308 308 325 308 308 325 326 326 344 327 327 345 308 308 325 327 327 345 309 309 326 309 309 326 327 327 345 328 328 346 309 309 326 328 328 346 310 310 327 310 310 327 328 328 346 329 329 347 310 310 327 329 329 347 311 311 328 311 311 328 329 329 347 330 330 348 311 311 328 330 330 348 312 312 329 312 312 329 330 330 348 331 331 349 312 312 329 331 331 349 313 313 330 313 313 330 331 331 349 332 332 350 313 313 330 332 332 350 314 314 331 314 314 331 332 332 350 333 333 351 314 314 331 333 333 351 315 315 332 315 315 332 333 333 351 334 334 352 315 315 332 334 334 352 316 316 333 316 316 333 334 334 352 335 335 353 316 316 333 335 335 353 317 317 334 317 317 334 335 335 353 336 336 354 317 317 334 336 336 354 318 318 335 318 318 335 336 336 354 337 337 355 318 318 335 337 337 355 319 319 336 319 319 336 337 337 355 338 338 356 319 319 336 338 338 356 320 320 337 320 320 337 338 338 356 339 339 357 320 320 337 339 339 357 321 321 338 321 321 338 339 339 357 340 340 358 321 321 338 340 340 358 322 322 339 322 322 339 340 340 358 341 341 359 322 322 339 341 341 359 323 323 340 323 323 340 341 341 359 324 324 360 323 323 340 324 324 360 306 306 341 324 324 342 342 342 361 343 343 362 324 324 342 343 343 362 325 325 343 325 325 343 343 343 362 344 344 363 325 325 343 344 344 363 326 326 344 326 326 344 344 344 363 345 345 364 326 326 344 345 345 364 327 327 345 327 327 345 345 345 364 346 346 365 327 327 345 346 346 365 328 328 346 328 328 346 346 346 365 347 347 366 328 328 346 347 347 366 329 329 347 329 329 347 347 347 366 348 348 367 329 329 347 348 348 367 330 330 348 330 330 348 348 348 367 349 349 368 330 330 348 349 349 368 331 331 349 331 331 349 349 349 368 350 350 369 331 331 349 350 350 369 332 332 350 332 332 350 350 350 369 351 351 370 332 332 350 351 351 370 333 333 351 333 333 351 351 351 370 352 352 371 333 333 351 352 352 371 334 334 352 334 334 352 352 352 371 353 353 372 334 334 352 353 353 372 335 335 353 335 335 353 353 353 372 354 354 373 335 335 353 354 354 373 336 336 354 336 336 354 354 354 373 355 355 374 336 336 354 355 355 374 337 337 355 337 337 355 355 355 374 356 356 375 337 337 355 356 356 375 338 338 356 338 338 356 356 356 375 357 357 376 338 338 356 357 357 376 339 339 357 339 339 357 357 357 376 358 358 377 339 339 357 358 358 377 340 340 358 340 340 358 358 358 377 359 359 378 340 340 358 359 359 378 341 341 359 341 341 359 359 359 378 342 342 379 341 341 359 342 342 379 324 324 360 342 342 361 360 360 380 361 361 381 342 342 361 361 361 381 343 343 362 343 343 362 361 361 381 362 362 382 343 343 362 362 362 382 344 344 363 344 344 363 362 362 382 363 363 383 344 344 363 363 363 383 345 345 364 345 345 364 363 363 383 364 364 384 345 345 364 364 364 384 346 346 365 346 346 365 364 364 384 365 365 385 346 346 365 365 365 385 347 347 366 347 347 366 365 365 385 366 366 386 347 347 366 366 366 386 348 348 367 348 348 367 366 366 386 367 367 387 348 348 367 367 367 387 349 349 368 349 349 368 367 367 387 368 368 388 349 349 368 368 368 388 350 350 369 350 350 369 368 368 388 369 369 389 350 350 369 369 369 389 351 351 370 351 351 370 369 369 389 370 370 390 351 351 370 370 370 390 352 352 371 352 352 371 370 370 390 371 371 391 352 352 371 371 371 391 353 353 372 353 353 372 371 371 391 372 372 392 353 353 372 372 372 392 354 354 373 354 354 373 372 372 392 373 373 393 354 354 373 373 373 393 355 355 374 355 355 374 373 373 393 374 374 394 355 355 374 374 374 394 356 356 375 356 356 375 374 374 394 375 375 395 356 356 375 375 375 395 357 357 376 357 357 376 375 375 395 376 376 396 357 357 376 376 376 396 358 358 377 358 358 377 376 376 396 377 377 397 358 358 377 377 377 397 359 359 378 359 359 378 377 377 397 360 360 398 359 359 378 360 360 398 342 342 379 360 360 380 378 378 399 379 379 400 360 360 380 379 379 400 361 361 381 361 361 381 379 379 400 380 380 401 361 361 381 380 380 401 362 362 382 362 362 382 380 380 401 381 381 402 362 362 382 381 381 402 363 363 383 363 363 383 381 381 402 382 382 403 363 363 383 382 382 403 364 364 384 364 364 384 382 382 403 383 383 404 364 364 384 383 383 404 365 365 385 365 365 385 383 383 404 384 384 405 365 365 385 384 384 405 366 366 386 366 366 386 384 384 405 385 385 406 366 366 386 385 385 406 367 367 387 367 367 387 385 385 406 386 386 407 367 367 387 386 386 407 368 368 388 368 368 388 386 386 407 387 387 408 368 368 388 387 387 408 369 369 389 369 369 389 387 387 408 388 388 409 369 369 389 388 388 409 370 370 390 370 370 390 388 388 409 389 389 410 370 370 390 389 389 410 371 371 391 371 371 391 389 389 410 390 390 411 371 371 391 390 390 411 372 372 392 372 372 392 390 390 411 391 391 412 372 372 392 391 391 412 373 373 393 373 373 393 391 391 412 392 392 413 373 373 393 392 392 413 374 374 394 374 374 394 392 392 413 393 393 414 374 374 394 393 393 414 375 375 395 375 375 395 393 393 414 394 394 415 375 375 395 394 394 415 376 376 396 376 376 396 394 394 415 395 395 416 376 376 396 395 395 416 377 377 397 377 377 397 395 395 416 378 378 417 377 377 397 378 378 417 360 360 398 378 378 399 396 396 418 397 397 419 378 378 399 397 397 419 379 379 400 379 379 400 397 397 419 398 398 420 379 379 400 398 398 420 380 380 401 380 380 401 398 398 420 399 399 421 380 380 401 399 399 421 381 381 402 381 381 402 399 399 421 400 400 422 381 381 402 400 400 422 382 382 403 382 382 403 400 400 422 401 401 423 382 382 403 401 401 423 383 383 404 383 383 404 401 401 423 402 402 424 383 383 404 402 402 424 384 384 405 384 384 405 402 402 424 403 403 425 384 384 405 403 403 425 385 385 406 385 385 406 403 403 425 404 404 426 385 385 406 404 404 426 386 386 407 386 386 407 404 404 426 405 405 427 386 386 407 405 405 427 387 387 408 387 387 408 405 405 427 406 406 428 387 387 408 406 406 428 388 388 409 388 388 409 406 406 428 407 407 429 388 388 409 407 407 429 389 389 410 389 389 410 407 407 429 408 408 430 389 389 410 408 408 430 390 390 411 390 390 411 408 408 430 409 409 431 390 390 411 409 409 431 391 391 412 391 391 412 409 409 431 410 410 432 391 391 412 410 410 432 392 392 413 392 392 413 410 410 432 411 411 433 392 392 413 411 411 433 393 393 414 393 393 414 411 411 433 412 412 434 393 393 414 412 412 434 394 394 415 394 394 415 412 412 434 413 413 435 394 394 415 413 413 435 395 395 416 395 395 416 413 413 435 396 396 436 395 395 416 396 396 436 378 378 417 396 396 418 414 414 437 415 415 438 396 396 418 415 415 438 397 397 419 397 397 419 415 415 438 416 416 439 397 397 419 416 416 439 398 398 420 398 398 420 416 416 439 417 417 440 398 398 420 417 417 440 399 399 421 399 399 421 417 417 440 418 418 441 399 399 421 418 418 441 400 400 422 400 400 422 418 418 441 419 419 442 400 400 422 419 419 442 401 401 423 401 401 423 419 419 442 420 420 443 401 401 423 420 420 443 402 402 424 402 402 424 420 420 443 421 421 444 402 402 424 421 421 444 403 403 425 403 403 425 421 421 444 422 422 445 403 403 425 422 422 445 404 404 426 404 404 426 422 422 445 423 423 446 404 404 426 423 423 446 405 405 427 405 405 427 423 423 446 424 424 447 405 405 427 424 424 447 406 406 428 406 406 428 424 424 447 425 425 448 406 406 428 425 425 448 407 407 429 407 407 429 425 425 448 426 426 449 407 407 429 426 426 449 408 408 430 408 408 430 426 426 449 427 427 450 408 408 430 427 427 450 409 409 431 409 409 431 427 427 450 428 428 451 409 409 431 428 428 451 410 410 432 410 410 432 428 428 451 429 429 452 410 410 432 429 429 452 411 411 433 411 411 433 429 429 452 430 430 453 411 411 433 430 430 453 412 412 434 412 412 434 430 430 453 431 431 454 412 412 434 431 431 454 413 413 435 413 413 435 431 431 454 414 414 455 413 413 435 414 414 455 396 396 436 414 414 437 432 432 456 433 433 457 414 414 437 433 433 457 415 415 438 415 415 438 433 433 457 434 434 458 415 415 438 434 434 458 416 416 439 416 416 439 434 434 458 435 435 459 416 416 439 435 435 459 417 417 440 417 417 440 435 435 459 436 436 460 417 417 440 436 436 460 418 418 441 418 418 441 436 436 460 437 437 461 418 418 441 437 437 461 419 419 442 419 419 442 437 437 461 438 438 462 419 419 442 438 438 462 420 420 443 420 420 443 438 438 462 439 439 463 420 420 443 439 439 463 421 421 444 421 421 444 439 439 463 440 440 464 421 421 444 440 440 464 422 422 445 422 422 445 440 440 464 441 441 465 422 422 445 441 441 465 423 423 446 423 423 446 441 441 465 442 442 466 423 423 446 442 442 466 424 424 447 424 424 447 442 442 466 443 443 467 424 424 447 443 443 467 425 425 448 425 425 448 443 443 467 444 444 468 425 425 448 444 444 468 426 426 449 426 426 449 444 444 468 445 445 469 426 426 449 445 445 469 427 427 450 427 427 450 445 445 469 446 446 470 427 427 450 446 446 470 428 428 451 428 428 451 446 446 470 447 447 471 428 428 451 447 447 471 429 429 452 429 429 452 447 447 471 448 448 472 429 429 452 448 448 472 430 430 453 430 430 453 448 448 472 449 449 473 430 430 453 449 449 473 431 431 454 431 431 454 449 449 473 432 432 474 431 431 454 432 432 474 414 414 455 432 432 456 450 450 475 451 451 476 432 432 456 451 451 476 433 433 457 433 433 457 451 451 476 452 452 477 433 433 457 452 452 477 434 434 458 434 434 458 452 452 477 453 453 478 434 434 458 453 453 478 435 435 459 435 435 459 453 453 478 454 454 479 435 435 459 454 454 479 436 436 460 436 436 460 454 454 479 455 455 480 436 436 460 455 455 480 437 437 461 437 437 461 455 455 480 456 456 481 437 437 461 456 456 481 438 438 462 438 438 462 456 456 481 457 457 482 438 438 462 457 457 482 439 439 463 439 439 463 457 457 482 458 458 483 439 439 463 458 458 483 440 440 464 440 440 464 458 458 483 459 459 484 440 440 464 459 459 484 441 441 465 441 441 465 459 459 484 460 460 485 441 441 465 460 460 485 442 442 466 442 442 466 460 460 485 461 461 486 442 442 466 461 461 486 443 443 467 443 443 467 461 461 486 462 462 487 443 443 467 462 462 487 444 444 468 444 444 468 462 462 487 463 463 488 444 444 468 463 463 488 445 445 469 445 445 469 463 463 488 464 464 489 445 445 469 464 464 489 446 446 470 446 446 470 464 464 489 465 465 490 446 446 470 465 465 490 447 447 471 447 447 471 465 465 490 466 466 491 447 447 471 466 466 491 448 448 472 448 448 472 466 466 491 467 467 492 448 448 472 467 467 492 449 449 473 449 449 473 467 467 492 450 450 493 449 449 473 450 450 493 432 432 474 450 450 475 468 468 494 469 469 495 450 450 475 469 469 495 451 451 476 451 451 476 469 469 495 470 470 496 451 451 476 470 470 496 452 452 477 452 452 477 470 470 496 471 471 497 452 452 477 471 471 497 453 453 478 453 453 478 471 471 497 472 472 498 453 453 478 472 472 498 454 454 479 454 454 479 472 472 498 473 473 499 454 454 479 473 473 499 455 455 480 455 455 480 473 473 499 474 474 500 455 455 480 474 474 500 456 456 481 456 456 481 474 474 500 475 475 501 456 456 481 475 475 501 457 457 482 457 457 482 475 475 501 476 476 502 457 457 482 476 476 502 458 458 483 458 458 483 476 476 502 477 477 503 458 458 483 477 477 503 459 459 484 459 459 484 477 477 503 478 478 504 459 459 484 478 478 504 460 460 485 460 460 485 478 478 504 479 479 505 460 460 485 479 479 505 461 461 486 461 461 486 479 479 505 480 480 506 461 461 486 480 480 506 462 462 487 462 462 487 480 480 506 481 481 507 462 462 487 481 481 507 463 463 488 463 463 488 481 481 507 482 482 508 463 463 488 482 482 508 464 464 489 464 464 489 482 482 508 483 483 509 464 464 489 483 483 509 465 465 490 465 465 490 483 483 509 484 484 510 465 465 490 484 484 510 466 466 491 466 466 491 484 484 510 485 485 511 466 466 491 485 485 511 467 467 492 467 467 492 485 485 511 468 468 512 467 467 492 468 468 512 450 450 493 468 468 494 486 486 513 487 487 514 468 468 494 487 487 514 469 469 495 469 469 495 487 487 514 488 488 515 469 469 495 488 488 515 470 470 496 470 470 496 488 488 515 489 489 516 470 470 496 489 489 516 471 471 497 471 471 497 489 489 516 490 490 517 471 471 497 490 490 517 472 472 498 472 472 498 490 490 517 491 491 518 472 472 498 491 491 518 473 473 499 473 473 499 491 491 518 492 492 519 473 473 499 492 492 519 474 474 500 474 474 500 492 492 519 493 493 520 474 474 500 493 493 520 475 475 501 475 475 501 493 493 520 494 494 521 475 475 501 494 494 521 476 476 502 476 476 502 494 494 521 495 495 522 476 476 502 495 495 522 477 477 503 477 477 503 495 495 522 496 496 523 477 477 503 496 496 523 478 478 504 478 478 504 496 496 523 497 497 524 478 478 504 497 497 524 479 479 505 479 479 505 497 497 524 498 498 525 479 479 505 498 498 525 480 480 506 480 480 506 498 498 525 499 499 526 480 480 506 499 499 526 481 481 507 481 481 507 499 499 526 500 500 527 481 481 507 500 500 527 482 482 508 482 482 508 500 500 527 501 501 528 482 482 508 501 501 528 483 483 509 483 483 509 501 501 528 502 502 529 483 483 509 502 502 529 484 484 510 484 484 510 502 502 529 503 503 530 484 484 510 503 503 530 485 485 511 485 485 511 503 503 530 486 486 531 485 485 511 486 486 531 468 468 512 486 486 513 504 504 532 505 505 533 486 486 513 505 505 533 487 487 514 487 487 514 505 505 533 506 506 534 487 487 514 506 506 534 488 488 515 488 488 515 506 506 534 507 507 535 488 488 515 507 507 535 489 489 516 489 489 516 507 507 535 508 508 536 489 489 516 508 508 536 490 490 517 490 490 517 508 508 536 509 509 537 490 490 517 509 509 537 491 491 518 491 491 518 509 509 537 510 510 538 491 491 518 510 510 538 492 492 519 492 492 519 510 510 538 511 511 539 492 492 519 511 511 539 493 493 520 493 493 520 511 511 539 512 512 540 493 493 520 512 512 540 494 494 521 494 494 521 512 512 540 513 513 541 494 494 521 513 513 541 495 495 522 495 495 522 513 513 541 514 514 542 495 495 522 514 514 542 496 496 523 496 496 523 514 514 542 515 515 543 496 496 523 515 515 543 497 497 524 497 497 524 515 515 543 516 516 544 497 497 524 516 516 544 498 498 525 498 498 525 516 516 544 517 517 545 498 498 525 517 517 545 499 499 526 499 499 526 517 517 545 518 518 546 499 499 526 518 518 546 500 500 527 500 500 527 518 518 546 519 519 547 500 500 527 519 519 547 501 501 528 501 501 528 519 519 547 520 520 548 501 501 528 520 520 548 502 502 529 502 502 529 520 520 548 521 521 549 502 502 529 521 521 549 503 503 530 503 503 530 521 521 549 504 504 550 503 503 530 504 504 550 486 486 531 504 504 532 522 522 551 523 523 552 504 504 532 523 523 552 505 505 533 505 505 533 523 523 552 524 524 553 505 505 533 524 524 553 506 506 534 506 506 534 524 524 553 525 525 554 506 506 534 525 525 554 507 507 535 507 507 535 525 525 554 526 526 555 507 507 535 526 526 555 508 508 536 508 508 536 526 526 555 527 527 556 508 508 536 527 527 556 509 509 537 509 509 537 527 527 556 528 528 557 509 509 537 528 528 557 510 510 538 510 510 538 528 528 557 529 529 558 510 510 538 529 529 558 511 511 539 511 511 539 529 529 558 530 530 559 511 511 539 530 530 559 512 512 540 512 512 540 530 530 559 531 531 560 512 512 540 531 531 560 513 513 541 513 513 541 531 531 560 532 532 561 513 513 541 532 532 561 514 514 542 514 514 542 532 532 561 533 533 562 514 514 542 533 533 562 515 515 543 515 515 543 533 533 562 534 534 563 515 515 543 534 534 563 516 516 544 516 516 544 534 534 563 535 535 564 516 516 544 535 535 564 517 517 545 517 517 545 535 535 564 536 536 565 517 517 545 536 536 565 518 518 546 518 518 546 536 536 565 537 537 566 518 518 546 537 537 566 519 519 547 519 519 547 537 537 566 538 538 567 519 519 547 538 538 567 520 520 548 520 520 548 538 538 567 539 539 568 520 520 548 539 539 568 521 521 549 521 521 549 539 539 568 522 522 569 521 521 549 522 522 569 504 504 550 522 522 551 540 540 570 541 541 571 522 522 551 541 541 571 523 523 552 523 523 552 541 541 571 542 542 572 523 523 552 542 542 572 524 524 553 524 524 553 542 542 572 543 543 573 524 524 553 543 543 573 525 525 554 525 525 554 543 543 573 544 544 574 525 525 554 544 544 574 526 526 555 526 526 555 544 544 574 545 545 575 526 526 555 545 545 575 527 527 556 527 527 556 545 545 575 546 546 576 527 527 556 546 546 576 528 528 557 528 528 557 546 546 576 547 547 577 528 528 557 547 547 577 529 529 558 529 529 558 547 547 577 548 548 578 529 529 558 548 548 578 530 530 559 530 530 559 548 548 578 549 549 579 530 530 559 549 549 579 531 531 560 531 531 560 549 549 579 550 550 580 531 531 560 550 550 580 532 532 561 532 532 561 550 550 580 551 551 581 532 532 561 551 551 581 533 533 562 533 533 562 551 551 581 552 552 582 533 533 562 552 552 582 534 534 563 534 534 563 552 552 582 553 553 583 534 534 563 553 553 583 535 535 564 535 535 564 553 553 583 554 554 584 535 535 564 554 554 584 536 536 565 536 536 565 554 554 584 555 555 585 536 536 565 555 555 585 537 537 566 537 537 566 555 555 585 556 556 586 537 537 566 556 556 586 538 538 567 538 538 567 556 556 586 557 557 587 538 538 567 557 557 587 539 539 568 539 539 568 557 557 587 540 540 588 539 539 568 540 540 588 522 522 569 540 540 570 558 558 589 559 559 590 540 540 570 559 559 590 541 541 571 541 541 571 559 559 590 560 560 591 541 541 571 560 560 591 542 542 572 542 542 572 560 560 591 561 561 592 542 542 572 561 561 592 543 543 573 543 543 573 561 561 592 562 562 593 543 543 573 562 562 593 544 544 574 544 544 574 562 562 593 563 563 594 544 544 574 563 563 594 545 545 575 545 545 575 563 563 594 564 564 595 545 545 575 564 564 595 546 546 576 546 546 576 564 564 595 565 565 596 546 546 576 565 565 596 547 547 577 547 547 577 565 565 596 566 566 597 547 547 577 566 566 597 548 548 578 548 548 578 566 566 597 567 567 598 548 548 578 567 567 598 549 549 579 549 549 579 567 567 598 568 568 599 549 549 579 568 568 599 550 550 580 550 550 580 568 568 599 569 569 600 550 550 580 569 569 600 551 551 581 551 551 581 569 569 600 570 570 601 551 551 581 570 570 601 552 552 582 552 552 582 570 570 601 571 571 602 552 552 582 571 571 602 553 553 583 553 553 583 571 571 602 572 572 603 553 553 583 572 572 603 554 554 584 554 554 584 572 572 603 573 573 604 554 554 584 573 573 604 555 555 585 555 555 585 573 573 604 574 574 605 555 555 585 574 574 605 556 556 586 556 556 586 574 574 605 575 575 606 556 556 586 575 575 606 557 557 587 557 557 587 575 575 606 558 558 607 557 557 587 558 558 607 540 540 588 558 558 589 576 576 608 577 577 609 558 558 589 577 577 609 559 559 590 559 559 590 577 577 609 578 578 610 559 559 590 578 578 610 560 560 591 560 560 591 578 578 610 579 579 611 560 560 591 579 579 611 561 561 592 561 561 592 579 579 611 580 580 612 561 561 592 580 580 612 562 562 593 562 562 593 580 580 612 581 581 613 562 562 593 581 581 613 563 563 594 563 563 594 581 581 613 582 582 614 563 563 594 582 582 614 564 564 595 564 564 595 582 582 614 583 583 615 564 564 595 583 583 615 565 565 596 565 565 596 583 583 615 584 584 616 565 565 596 584 584 616 566 566 597 566 566 597 584 584 616 585 585 617 566 566 597 585 585 617 567 567 598 567 567 598 585 585 617 586 586 618 567 567 598 586 586 618 568 568 599 568 568 599 586 586 618 587 587 619 568 568 599 587 587 619 569 569 600 569 569 600 587 587 619 588 588 620 569 569 600 588 588 620 570 570 601 570 570 601 588 588 620 589 589 621 570 570 601 589 589 621 571 571 602 571 571 602 589 589 621 590 590 622 571 571 602 590 590 622 572 572 603 572 572 603 590 590 622 591 591 623 572 572 603 591 591 623 573 573 604 573 573 604 591 591 623 592 592 624 573 573 604 592 592 624 574 574 605 574 574 605 592 592 624 593 593 625 574 574 605 593 593 625 575 575 606 575 575 606 593 593 625 576 576 626 575 575 606 576 576 626 558 558 607 576 576 608 594 594 627 595 595 628 576 576 608 595 595 628 577 577 609 577 577 609 595 595 628 596 596 629 577 577 609 596 596 629 578 578 610 578 578 610 596 596 629 597 597 630 578 578 610 597 597 630 579 579 611 579 579 611 597 597 630 598 598 631 579 579 611 598 598 631 580 580 612 580 580 612 598 598 631 599 599 632 580 580 612 599 599 632 581 581 613 581 581 613 599 599 632 600 600 633 581 581 613 600 600 633 582 582 614 582 582 614 600 600 633 601 601 634 582 582 614 601 601 634 583 583 615 583 583 615 601 601 634 602 602 635 583 583 615 602 602 635 584 584 616 584 584 616 602 602 635 603 603 636 584 584 616 603 603 636 585 585 617 585 585 617 603 603 636 604 604 637 585 585 617 604 604 637 586 586 618 586 586 618 604 604 637 605 605 638 586 586 618 605 605 638 587 587 619 587 587 619 605 605 638 606 606 639 587 587 619 606 606 639 588 588 620 588 588 620 606 606 639 607 607 640 588 588 620 607 607 640 589 589 621 589 589 621 607 607 640 608 608 641 589 589 621 608 608 641 590 590 622 590 590 622 608 608 641 609 609 642 590 590 622 609 609 642 591 591 623 591 591 623 609 609 642 610 610 643 591 591 623 610 610 643 592 592 624 592 592 624 610 610 643 611 611 644 592 592 624 611 611 644 593 593 625 593 593 625 611 611 644 594 594 645 593 593 625 594 594 645 576 576 626 594 594 627 612 612 646 613 613 647 594 594 627 613 613 647 595 595 628 595 595 628 613 613 647 614 614 648 595 595 628 614 614 648 596 596 629 596 596 629 614 614 648 615 615 649 596 596 629 615 615 649 597 597 630 597 597 630 615 615 649 616 616 650 597 597 630 616 616 650 598 598 631 598 598 631 616 616 650 617 617 651 598 598 631 617 617 651 599 599 632 599 599 632 617 617 651 618 618 652 599 599 632 618 618 652 600 600 633 600 600 633 618 618 652 619 619 653 600 600 633 619 619 653 601 601 634 601 601 634 619 619 653 620 620 654 601 601 634 620 620 654 602 602 635 602 602 635 620 620 654 621 621 655 602 602 635 621 621 655 603 603 636 603 603 636 621 621 655 622 622 656 603 603 636 622 622 656 604 604 637 604 604 637 622 622 656 623 623 657 604 604 637 623 623 657 605 605 638 605 605 638 623 623 657 624 624 658 605 605 638 624 624 658 606 606 639 606 606 639 624 624 658 625 625 659 606 606 639 625 625 659 607 607 640 607 607 640 625 625 659 626 626 660 607 607 640 626 626 660 608 608 641 608 608 641 626 626 660 627 627 661 608 608 641 627 627 661 609 609 642 609 609 642 627 627 661 628 628 662 609 609 642 628 628 662 610 610 643 610 610 643 628 628 662 629 629 663 610 610 643 629 629 663 611 611 644 611 611 644 629 629 663 612 612 664 611 611 644 612 612 664 594 594 645 612 612 646 630 630 665 631 631 666 612 612 646 631 631 666 613 613 647 613 613 647 631 631 666 632 632 667 613 613 647 632 632 667 614 614 648 614 614 648 632 632 667 633 633 668 614 614 648 633 633 668 615 615 649 615 615 649 633 633 668 634 634 669 615 615 649 634 634 669 616 616 650 616 616 650 634 634 669 635 635 670 616 616 650 635 635 670 617 617 651 617 617 651 635 635 670 636 636 671 617 617 651 636 636 671 618 618 652 618 618 652 636 636 671 637 637 672 618 618 652 637 637 672 619 619 653 619 619 653 637 637 672 638 638 673 619 619 653 638 638 673 620 620 654 620 620 654 638 638 673 639 639 674 620 620 654 639 639 674 621 621 655 621 621 655 639 639 674 640 640 675 621 621 655 640 640 675 622 622 656 622 622 656 640 640 675 641 641 676 622 622 656 641 641 676 623 623 657 623 623 657 641 641 676 642 642 677 623 623 657 642 642 677 624 624 658 624 624 658 642 642 677 643 643 678 624 624 658 643 643 678 625 625 659 625 625 659 643 643 678 644 644 679 625 625 659 644 644 679 626 626 660 626 626 660 644 644 679 645 645 680 626 626 660 645 645 680 627 627 661 627 627 661 645 645 680 646 646 681 627 627 661 646 646 681 628 628 662 628 628 662 646 646 681 647 647 682 628 628 662 647 647 682 629 629 663 629 629 663 647 647 682 630 630 683 629 629 663 630 630 683 612 612 664 630 630 665 648 648 684 649 649 685 630 630 665 649 649 685 631 631 666 631 631 666 649 649 685 650 650 686 631 631 666 650 650 686 632 632 667 632 632 667 650 650 686 651 651 687 632 632 667 651 651 687 633 633 668 633 633 668 651 651 687 652 652 688 633 633 668 652 652 688 634 634 669 634 634 669 652 652 688 653 653 689 634 634 669 653 653 689 635 635 670 635 635 670 653 653 689 654 654 690 635 635 670 654 654 690 636 636 671 636 636 671 654 654 690 655 655 691 636 636 671 655 655 691 637 637 672 637 637 672 655 655 691 656 656 692 637 637 672 656 656 692 638 638 673 638 638 673 656 656 692 657 657 693 638 638 673 657 657 693 639 639 674 639 639 674 657 657 693 658 658 694 639 639 674 658 658 694 640 640 675 640 640 675 658 658 694 659 659 695 640 640 675 659 659 695 641 641 676 641 641 676 659 659 695 660 660 696 641 641 676 660 660 696 642 642 677 642 642 677 660 660 696 661 661 697 642 642 677 661 661 697 643 643 678 643 643 678 661 661 697 662 662 698 643 643 678 662 662 698 644 644 679 644 644 679 662 662 698 663 663 699 644 644 679 663 663 699 645 645 680 645 645 680 663 663 699 664 664 700 645 645 680 664 664 700 646 646 681 646 646 681 664 664 700 665 665 701 646 646 681 665 665 701 647 647 682 647 647 682 665 665 701 648 648 702 647 647 682 648 648 702 630 630 683 648 648 684 666 666 703 667 667 704 648 648 684 667 667 704 649 649 685 649 649 685 667 667 704 668 668 705 649 649 685 668 668 705 650 650 686 650 650 686 668 668 705 669 669 706 650 650 686 669 669 706 651 651 687 651 651 687 669 669 706 670 670 707 651 651 687 670 670 707 652 652 688 652 652 688 670 670 707 671 671 708 652 652 688 671 671 708 653 653 689 653 653 689 671 671 708 672 672 709 653 653 689 672 672 709 654 654 690 654 654 690 672 672 709 673 673 710 654 654 690 673 673 710 655 655 691 655 655 691 673 673 710 674 674 711 655 655 691 674 674 711 656 656 692 656 656 692 674 674 711 675 675 712 656 656 692 675 675 712 657 657 693 657 657 693 675 675 712 676 676 713 657 657 693 676 676 713 658 658 694 658 658 694 676 676 713 677 677 714 658 658 694 677 677 714 659 659 695 659 659 695 677 677 714 678 678 715 659 659 695 678 678 715 660 660 696 660 660 696 678 678 715 679 679 716 660 660 696 679 679 716 661 661 697 661 661 697 679 679 716 680 680 717 661 661 697 680 680 717 662 662 698 662 662 698 680 680 717 681 681 718 662 662 698 681 681 718 663 663 699 663 663 699 681 681 718 682 682 719 663 663 699 682 682 719 664 664 700 664 664 700 682 682 719 683 683 720 664 664 700 683 683 720 665 665 701 665 665 701 683 683 720 666 666 721 665 665 701 666 666 721 648 648 702 666 666 703 684 684 722 685 685 723 666 666 703 685 685 723 667 667 704 667 667 704 685 685 723 686 686 724 667 667 704 686 686 724 668 668 705 668 668 705 686 686 724 687 687 725 668 668 705 687 687 725 669 669 706 669 669 706 687 687 725 688 688 726 669 669 706 688 688 726 670 670 707 670 670 707 688 688 726 689 689 727 670 670 707 689 689 727 671 671 708 671 671 708 689 689 727 690 690 728 671 671 708 690 690 728 672 672 709 672 672 709 690 690 728 691 691 729 672 672 709 691 691 729 673 673 710 673 673 710 691 691 729 692 692 730 673 673 710 692 692 730 674 674 711 674 674 711 692 692 730 693 693 731 674 674 711 693 693 731 675 675 712 675 675 712 693 693 731 694 694 732 675 675 712 694 694 732 676 676 713 676 676 713 694 694 732 695 695 733 676 676 713 695 695 733 677 677 714 677 677 714 695 695 733 696 696 734 677 677 714 696 696 734 678 678 715 678 678 715 696 696 734 697 697 735 678 678 715 697 697 735 679 679 716 679 679 716 697 697 735 698 698 736 679 679 716 698 698 736 680 680 717 680 680 717 698 698 736 699 699 737 680 680 717 699 699 737 681 681 718 681 681 718 699 699 737 700 700 738 681 681 718 700 700 738 682 682 719 682 682 719 700 700 738 701 701 739 682 682 719 701 701 739 683 683 720 683 683 720 701 701 739 684 684 740 683 683 720 684 684 740 666 666 721 684 684 722 702 702 741 703 703 742 684 684 722 703 703 742 685 685 723 685 685 723 703 703 742 704 704 743 685 685 723 704 704 743 686 686 724 686 686 724 704 704 743 705 705 744 686 686 724 705 705 744 687 687 725 687 687 725 705 705 744 706 706 745 687 687 725 706 706 745 688 688 726 688 688 726 706 706 745 707 707 746 688 688 726 707 707 746 689 689 727 689 689 727 707 707 746 708 708 747 689 689 727 708 708 747 690 690 728 690 690 728 708 708 747 709 709 748 690 690 728 709 709 748 691 691 729 691 691 729 709 709 748 710 710 749 691 691 729 710 710 749 692 692 730 692 692 730 710 710 749 711 711 750 692 692 730 711 711 750 693 693 731 693 693 731 711 711 750 712 712 751 693 693 731 712 712 751 694 694 732 694 694 732 712 712 751 713 713 752 694 694 732 713 713 752 695 695 733 695 695 733 713 713 752 714 714 753 695 695 733 714 714 753 696 696 734 696 696 734 714 714 753 715 715 754 696 696 734 715 715 754 697 697 735 697 697 735 715 715 754 716 716 755 697 697 735 716 716 755 698 698 736 698 698 736 716 716 755 717 717 756 698 698 736 717 717 756 699 699 737 699 699 737 717 717 756 718 718 757 699 699 737 718 718 757 700 700 738 700 700 738 718 718 757 719 719 758 700 700 738 719 719 758 701 701 739 701 701 739 719 719 758 702 702 759 701 701 739 702 702 759 684 684 740 702 702 741 720 720 760 721 721 761 702 702 741 721 721 761 703 703 742 703 703 742 721 721 761 722 722 762 703 703 742 722 722 762 704 704 743 704 704 743 722 722 762 723 723 763 704 704 743 723 723 763 705 705 744 705 705 744 723 723 763 724 724 764 705 705 744 724 724 764 706 706 745 706 706 745 724 724 764 725 725 765 706 706 745 725 725 765 707 707 746 707 707 746 725 725 765 726 726 766 707 707 746 726 726 766 708 708 747 708 708 747 726 726 766 727 727 767 708 708 747 727 727 767 709 709 748 709 709 748 727 727 767 728 728 768 709 709 748 728 728 768 710 710 749 710 710 749 728 728 768 729 729 769 710 710 749 729 729 769 711 711 750 711 711 750 729 729 769 730 730 770 711 711 750 730 730 770 712 712 751 712 712 751 730 730 770 731 731 771 712 712 751 731 731 771 713 713 752 713 713 752 731 731 771 732 732 772 713 713 752 732 732 772 714 714 753 714 714 753 732 732 772 733 733 773 714 714 753 733 733 773 715 715 754 715 715 754 733 733 773 734 734 774 715 715 754 734 734 774 716 716 755 716 716 755 734 734 774 735 735 775 716 716 755 735 735 775 717 717 756 717 717 756 735 735 775 736 736 776 717 717 756 736 736 776 718 718 757 718 718 757 736 736 776 737 737 777 718 718 757 737 737 777 719 719 758 719 719 758 737 737 777 720 720 778 719 719 758 720 720 778 702 702 759 720 720 760 738 738 779 739 739 780 720 720 760 739 739 780 721 721 761 721 721 761 739 739 780 740 740 781 721 721 761 740 740 781 722 722 762 722 722 762 740 740 781 741 741 782 722 722 762 741 741 782 723 723 763 723 723 763 741 741 782 742 742 783 723 723 763 742 742 783 724 724 764 724 724 764 742 742 783 743 743 784 724 724 764 743 743 784 725 725 765 725 725 765 743 743 784 744 744 785 725 725 765 744 744 785 726 726 766 726 726 766 744 744 785 745 745 786 726 726 766 745 745 786 727 727 767 727 727 767 745 745 786 746 746 787 727 727 767 746 746 787 728 728 768 728 728 768 746 746 787 747 747 788 728 728 768 747 747 788 729 729 769 729 729 769 747 747 788 748 748 789 729 729 769 748 748 789 730 730 770 730 730 770 748 748 789 749 749 790 730 730 770 749 749 790 731 731 771 731 731 771 749 749 790 750 750 791 731 731 771 750 750 791 732 732 772 732 732 772 750 750 791 751 751 792 732 732 772 751 751 792 733 733 773 733 733 773 751 751 792 752 752 793 733 733 773 752 752 793 734 734 774 734 734 774 752 752 793 753 753 794 734 734 774 753 753 794 735 735 775 735 735 775 753 753 794 754 754 795 735 735 775 754 754 795 736 736 776 736 736 776 754 754 795 755 755 796 736 736 776 755 755 796 737 737 777 737 737 777 755 755 796 738 738 797 737 737 777 738 738 797 720 720 778 738 738 779 756 756 798 757 757 799 738 738 779 757 757 799 739 739 780 739 739 780 757 757 799 758 758 800 739 739 780 758 758 800 740 740 781 740 740 781 758 758 800 759 759 801 740 740 781 759 759 801 741 741 782 741 741 782 759 759 801 760 760 802 741 741 782 760 760 802 742 742 783 742 742 783 760 760 802 761 761 803 742 742 783 761 761 803 743 743 784 743 743 784 761 761 803 762 762 804 743 743 784 762 762 804 744 744 785 744 744 785 762 762 804 763 763 805 744 744 785 763 763 805 745 745 786 745 745 786 763 763 805 764 764 806 745 745 786 764 764 806 746 746 787 746 746 787 764 764 806 765 765 807 746 746 787 765 765 807 747 747 788 747 747 788 765 765 807 766 766 808 747 747 788 766 766 808 748 748 789 748 748 789 766 766 808 767 767 809 748 748 789 767 767 809 749 749 790 749 749 790 767 767 809 768 768 810 749 749 790 768 768 810 750 750 791 750 750 791 768 768 810 769 769 811 750 750 791 769 769 811 751 751 792 751 751 792 769 769 811 770 770 812 751 751 792 770 770 812 752 752 793 752 752 793 770 770 812 771 771 813 752 752 793 771 771 813 753 753 794 753 753 794 771 771 813 772 772 814 753 753 794 772 772 814 754 754 795 754 754 795 772 772 814 773 773 815 754 754 795 773 773 815 755 755 796 755 755 796 773 773 815 756 756 816 755 755 796 756 756 816 738 738 797 756 756 798 774 774 817 775 775 818 756 756 798 775 775 818 757 757 799 757 757 799 775 775 818 776 776 819 757 757 799 776 776 819 758 758 800 758 758 800 776 776 819 777 777 820 758 758 800 777 777 820 759 759 801 759 759 801 777 777 820 778 778 821 759 759 801 778 778 821 760 760 802 760 760 802 778 778 821 779 779 822 760 760 802 779 779 822 761 761 803 761 761 803 779 779 822 780 780 823 761 761 803 780 780 823 762 762 804 762 762 804 780 780 823 781 781 824 762 762 804 781 781 824 763 763 805 763 763 805 781 781 824 782 782 825 763 763 805 782 782 825 764 764 806 764 764 806 782 782 825 783 783 826 764 764 806 783 783 826 765 765 807 765 765 807 783 783 826 784 784 827 765 765 807 784 784 827 766 766 808 766 766 808 784 784 827 785 785 828 766 766 808 785 785 828 767 767 809 767 767 809 785 785 828 786 786 829 767 767 809 786 786 829 768 768 810 768 768 810 786 786 829 787 787 830 768 768 810 787 787 830 769 769 811 769 769 811 787 787 830 788 788 831 769 769 811 788 788 831 770 770 812 770 770 812 788 788 831 789 789 832 770 770 812 789 789 832 771 771 813 771 771 813 789 789 832 790 790 833 771 771 813 790 790 833 772 772 814 772 772 814 790 790 833 791 791 834 772 772 814 791 791 834 773 773 815 773 773 815 791 791 834 774 774 835 773 773 815 774 774 835 756 756 816 774 774 817 792 792 836 793 793 837 774 774 817 793 793 837 775 775 818 775 775 818 793 793 837 794 794 838 775 775 818 794 794 838 776 776 819 776 776 819 794 794 838 795 795 839 776 776 819 795 795 839 777 777 820 777 777 820 795 795 839 796 796 840 777 777 820 796 796 840 778 778 821 778 778 821 796 796 840 797 797 841 778 778 821 797 797 841 779 779 822 779 779 822 797 797 841 798 798 842 779 779 822 798 798 842 780 780 823 780 780 823 798 798 842 799 799 843 780 780 823 799 799 843 781 781 824 781 781 824 799 799 843 800 800 844 781 781 824 800 800 844 782 782 825 782 782 825 800 800 844 801 801 845 782 782 825 801 801 845 783 783 826 783 783 826 801 801 845 802 802 846 783 783 826 802 802 846 784 784 827 784 784 827 802 802 846 803 803 847 784 784 827 803 803 847 785 785 828 785 785 828 803 803 847 804 804 848 785 785 828 804 804 848 786 786 829 786 786 829 804 804 848 805 805 849 786 786 829 805 805 849 787 787 830 787 787 830 805 805 849 806 806 850 787 787 830 806 806 850 788 788 831 788 788 831 806 806 850 807 807 851 788 788 831 807 807 851 789 789 832 789 789 832 807 807 851 808 808 852 789 789 832 808 808 852 790 790 833 790 790 833 808 808 852 809 809 853 790 790 833 809 809 853 791 791 834 791 791 834 809 809 853 792 792 854 791 791 834 792 792 854 774 774 835 792 792 836 810 810 855 811 811 856 792 792 836 811 811 856 793 793 837 793 793 837 811 811 856 812 812 857 793 793 837 812 812 857 794 794 838 794 794 838 812 812 857 813 813 858 794 794 838 813 813 858 795 795 839 795 795 839 813 813 858 814 814 859 795 795 839 814 814 859 796 796 840 796 796 840 814 814 859 815 815 860 796 796 840 815 815 860 797 797 841 797 797 841 815 815 860 816 816 861 797 797 841 816 816 861 798 798 842 798 798 842 816 816 861 817 817 862 798 798 842 817 817 862 799 799 843 799 799 843 817 817 862 818 818 863 799 799 843 818 818 863 800 800 844 800 800 844 818 818 863 819 819 864 800 800 844 819 819 864 801 801 845 801 801 845 819 819 864 820 820 865 801 801 845 820 820 865 802 802 846 802 802 846 820 820 865 821 821 866 802 802 846 821 821 866 803 803 847 803 803 847 821 821 866 822 822 867 803 803 847 822 822 867 804 804 848 804 804 848 822 822 867 823 823 868 804 804 848 823 823 868 805 805 849 805 805 849 823 823 868 824 824 869 805 805 849 824 824 869 806 806 850 806 806 850 824 824 869 825 825 870 806 806 850 825 825 870 807 807 851 807 807 851 825 825 870 826 826 871 807 807 851 826 826 871 808 808 852 808 808 852 826 826 871 827 827 872 808 808 852 827 827 872 809 809 853 809 809 853 827 827 872 810 810 873 809 809 853 810 810 873 792 792 854 810 810 855 828 828 874 829 829 875 810 810 855 829 829 875 811 811 856 811 811 856 829 829 875 830 830 876 811 811 856 830 830 876 812 812 857 812 812 857 830 830 876 831 831 877 812 812 857 831 831 877 813 813 858 813 813 858 831 831 877 832 832 878 813 813 858 832 832 878 814 814 859 814 814 859 832 832 878 833 833 879 814 814 859 833 833 879 815 815 860 815 815 860 833 833 879 834 834 880 815 815 860 834 834 880 816 816 861 816 816 861 834 834 880 835 835 881 816 816 861 835 835 881 817 817 862 817 817 862 835 835 881 836 836 882 817 817 862 836 836 882 818 818 863 818 818 863 836 836 882 837 837 883 818 818 863 837 837 883 819 819 864 819 819 864 837 837 883 838 838 884 819 819 864 838 838 884 820 820 865 820 820 865 838 838 884 839 839 885 820 820 865 839 839 885 821 821 866 821 821 866 839 839 885 840 840 886 821 821 866 840 840 886 822 822 867 822 822 867 840 840 886 841 841 887 822 822 867 841 841 887 823 823 868 823 823 868 841 841 887 842 842 888 823 823 868 842 842 888 824 824 869 824 824 869 842 842 888 843 843 889 824 824 869 843 843 889 825 825 870 825 825 870 843 843 889 844 844 890 825 825 870 844 844 890 826 826 871 826 826 871 844 844 890 845 845 891 826 826 871 845 845 891 827 827 872 827 827 872 845 845 891 828 828 892 827 827 872 828 828 892 810 810 873 828 828 874 846 846 893 847 847 894 828 828 874 847 847 894 829 829 875 829 829 875 847 847 894 848 848 895 829 829 875 848 848 895 830 830 876 830 830 876 848 848 895 849 849 896 830 830 876 849 849 896 831 831 877 831 831 877 849 849 896 850 850 897 831 831 877 850 850 897 832 832 878 832 832 878 850 850 897 851 851 898 832 832 878 851 851 898 833 833 879 833 833 879 851 851 898 852 852 899 833 833 879 852 852 899 834 834 880 834 834 880 852 852 899 853 853 900 834 834 880 853 853 900 835 835 881 835 835 881 853 853 900 854 854 901 835 835 881 854 854 901 836 836 882 836 836 882 854 854 901 855 855 902 836 836 882 855 855 902 837 837 883 837 837 883 855 855 902 856 856 903 837 837 883 856 856 903 838 838 884 838 838 884 856 856 903 857 857 904 838 838 884 857 857 904 839 839 885 839 839 885 857 857 904 858 858 905 839 839 885 858 858 905 840 840 886 840 840 886 858 858 905 859 859 906 840 840 886 859 859 906 841 841 887 841 841 887 859 859 906 860 860 907 841 841 887 860 860 907 842 842 888 842 842 888 860 860 907 861 861 908 842 842 888 861 861 908 843 843 889 843 843 889 861 861 908 862 862 909 843 843 889 862 862 909 844 844 890 844 844 890 862 862 909 863 863 910 844 844 890 863 863 910 845 845 891 845 845 891 863 863 910 846 846 911 845 845 891 846 846 911 828 828 892 846 846 893 864 864 912 865 865 913 846 846 893 865 865 913 847 847 894 847 847 894 865 865 913 866 866 914 847 847 894 866 866 914 848 848 895 848 848 895 866 866 914 867 867 915 848 848 895 867 867 915 849 849 896 849 849 896 867 867 915 868 868 916 849 849 896 868 868 916 850 850 897 850 850 897 868 868 916 869 869 917 850 850 897 869 869 917 851 851 898 851 851 898 869 869 917 870 870 918 851 851 898 870 870 918 852 852 899 852 852 899 870 870 918 871 871 919 852 852 899 871 871 919 853 853 900 853 853 900 871 871 919 872 872 920 853 853 900 872 872 920 854 854 901 854 854 901 872 872 920 873 873 921 854 854 901 873 873 921 855 855 902 855 855 902 873 873 921 874 874 922 855 855 902 874 874 922 856 856 903 856 856 903 874 874 922 875 875 923 856 856 903 875 875 923 857 857 904 857 857 904 875 875 923 876 876 924 857 857 904 876 876 924 858 858 905 858 858 905 876 876 924 877 877 925 858 858 905 877 877 925 859 859 906 859 859 906 877 877 925 878 878 926 859 859 906 878 878 926 860 860 907 860 860 907 878 878 926 879 879 927 860 860 907 879 879 927 861 861 908 861 861 908 879 879 927 880 880 928 861 861 908 880 880 928 862 862 909 862 862 909 880 880 928 881 881 929 862 862 909 881 881 929 863 863 910 863 863 910 881 881 929 864 864 930 863 863 910 864 864 930 846 846 911 864 864 912 882 882 931 883 883 932 864 864 912 883 883 932 865 865 913 865 865 913 883 883 932 884 884 933 865 865 913 884 884 933 866 866 914 866 866 914 884 884 933 885 885 934 866 866 914 885 885 934 867 867 915 867 867 915 885 885 934 886 886 935 867 867 915 886 886 935 868 868 916 868 868 916 886 886 935 887 887 936 868 868 916 887 887 936 869 869 917 869 869 917 887 887 936 888 888 937 869 869 917 888 888 937 870 870 918 870 870 918 888 888 937 889 889 938 870 870 918 889 889 938 871 871 919 871 871 919 889 889 938 890 890 939 871 871 919 890 890 939 872 872 920 872 872 920 890 890 939 891 891 940 872 872 920 891 891 940 873 873 921 873 873 921 891 891 940 892 892 941 873 873 921 892 892 941 874 874 922 874 874 922 892 892 941 893 893 942 874 874 922 893 893 942 875 875 923 875 875 923 893 893 942 894 894 943 875 875 923 894 894 943 876 876 924 876 876 924 894 894 943 895 895 944 876 876 924 895 895 944 877 877 925 877 877 925 895 895 944 896 896 945 877 877 925 896 896 945 878 878 926 878 878 926 896 896 945 897 897 946 878 878 926 897 897 946 879 879 927 879 879 927 897 897 946 898 898 947 879 879 927 898 898 947 880 880 928 880 880 928 898 898 947 899 899 948 880 880 928 899 899 948 881 881 929 881 881 929 899 899 948 882 882 949 881 881 929 882 882 949 864 864 930 882 882 931 900 900 950 901 901 951 882 882 931 901 901 951 883 883 932 883 883 932 901 901 951 902 902 952 883 883 932 902 902 952 884 884 933 884 884 933 902 902 952 903 903 953 884 884 933 903 903 953 885 885 934 885 885 934 903 903 953 904 904 954 885 885 934 904 904 954 886 886 935 886 886 935 904 904 954 905 905 955 886 886 935 905 905 955 887 887 936 887 887 936 905 905 955 906 906 956 887 887 936 906 906 956 888 888 937 888 888 937 906 906 956 907 907 957 888 888 937 907 907 957 889 889 938 889 889 938 907 907 957 908 908 958 889 889 938 908 908 958 890 890 939 890 890 939 908 908 958 909 909 959 890 890 939 909 909 959 891 891 940 891 891 940 909 909 959 910 910 960 891 891 940 910 910 960 892 892 941 892 892 941 910 910 960 911 911 961 892 892 941 911 911 961 893 893 942 893 893 942 911 911 961 912 912 962 893 893 942 912 912 962 894 894 943 894 894 943 912 912 962 913 913 963 894 894 943 913 913 963 895 895 944 895 895 944 913 913 963 914 914 964 895 895 944 914 914 964 896 896 945 896 896 945 914 914 964 915 915 965 896 896 945 915 915 965 897 897 946 897 897 946 915 915 965 916 916 966 897 897 946 916 916 966 898 898 947 898 898 947 916 916 966 917 917 967 898 898 947 917 917 967 899 899 948 899 899 948 917 917 967 900 900 968 899 899 948 900 900 968 882 882 949 900 900 950 918 918 969 919 919 970 900 900 950 919 919 970 901 901 951 901 901 951 919 919 970 920 920 971 901 901 951 920 920 971 902 902 952 902 902 952 920 920 971 921 921 972 902 902 952 921 921 972 903 903 953 903 903 953 921 921 972 922 922 973 903 903 953 922 922 973 904 904 954 904 904 954 922 922 973 923 923 974 904 904 954 923 923 974 905 905 955 905 905 955 923 923 974 924 924 975 905 905 955 924 924 975 906 906 956 906 906 956 924 924 975 925 925 976 906 906 956 925 925 976 907 907 957 907 907 957 925 925 976 926 926 977 907 907 957 926 926 977 908 908 958 908 908 958 926 926 977 927 927 978 908 908 958 927 927 978 909 909 959 909 909 959 927 927 978 928 928 979 909 909 959 928 928 979 910 910 960 910 910 960 928 928 979 929 929 980 910 910 960 929 929 980 911 911 961 911 911 961 929 929 980 930 930 981 911 911 961 930 930 981 912 912 962 912 912 962 930 930 981 931 931 982 912 912 962 931 931 982 913 913 963 913 913 963 931 931 982 932 932 983 913 913 963 932 932 983 914 914 964 914 914 964 932 932 983 933 933 984 914 914 964 933 933 984 915 915 965 915 915 965 933 933 984 934 934 985 915 915 965 934 934 985 916 916 966 916 916 966 934 934 985 935 935 986 916 916 966 935 935 986 917 917 967 917 917 967 935 935 986 918 918 987 917 917 967 918 918 987 900 900 968 918 918 969 936 936 988 937 937 989 918 918 969 937 937 989 919 919 970 919 919 970 937 937 989 938 938 990 919 919 970 938 938 990 920 920 971 920 920 971 938 938 990 939 939 991 920 920 971 939 939 991 921 921 972 921 921 972 939 939 991 940 940 992 921 921 972 940 940 992 922 922 973 922 922 973 940 940 992 941 941 993 922 922 973 941 941 993 923 923 974 923 923 974 941 941 993 942 942 994 923 923 974 942 942 994 924 924 975 924 924 975 942 942 994 943 943 995 924 924 975 943 943 995 925 925 976 925 925 976 943 943 995 944 944 996 925 925 976 944 944 996 926 926 977 926 926 977 944 944 996 945 945 997 926 926 977 945 945 997 927 927 978 927 927 978 945 945 997 946 946 998 927 927 978 946 946 998 928 928 979 928 928 979 946 946 998 947 947 999 928 928 979 947 947 999 929 929 980 929 929 980 947 947 999 948 948 1000 929 929 980 948 948 1000 930 930 981 930 930 981 948 948 1000 949 949 1001 930 930 981 949 949 1001 931 931 982 931 931 982 949 949 1001 950 950 1002 931 931 982 950 950 1002 932 932 983 932 932 983 950 950 1002 951 951 1003 932 932 983 951 951 1003 933 933 984 933 933 984 951 951 1003 952 952 1004 933 933 984 952 952 1004 934 934 985 934 934 985 952 952 1004 953 953 1005 934 934 985 953 953 1005 935 935 986 935 935 986 953 953 1005 936 936 1006 935 935 986 936 936 1006 918 918 987 936 936 988 954 954 1007 955 955 1008 936 936 988 955 955 1008 937 937 989 937 937 989 955 955 1008 956 956 1009 937 937 989 956 956 1009 938 938 990 938 938 990 956 956 1009 957 957 1010 938 938 990 957 957 1010 939 939 991 939 939 991 957 957 1010 958 958 1011 939 939 991 958 958 1011 940 940 992 940 940 992 958 958 1011 959 959 1012 940 940 992 959 959 1012 941 941 993 941 941 993 959 959 1012 960 960 1013 941 941 993 960 960 1013 942 942 994 942 942 994 960 960 1013 961 961 1014 942 942 994 961 961 1014 943 943 995 943 943 995 961 961 1014 962 962 1015 943 943 995 962 962 1015 944 944 996 944 944 996 962 962 1015 963 963 1016 944 944 996 963 963 1016 945 945 997 945 945 997 963 963 1016 964 964 1017 945 945 997 964 964 1017 946 946 998 946 946 998 964 964 1017 965 965 1018 946 946 998 965 965 1018 947 947 999 947 947 999 965 965 1018 966 966 1019 947 947 999 966 966 1019 948 948 1000 948 948 1000 966 966 1019 967 967 1020 948 948 1000 967 967 1020 949 949 1001 949 949 1001 967 967 1020 968 968 1021 949 949 1001 968 968 1021 950 950 1002 950 950 1002 968 968 1021 969 969 1022 950 950 1002 969 969 1022 951 951 1003 951 951 1003 969 969 1022 970 970 1023 951 951 1003 970 970 1023 952 952 1004 952 952 1004 970 970 1023 971 971 1024 952 952 1004 971 971 1024 953 953 1005 953 953 1005 971 971 1024 954 954 1025 953 953 1005 954 954 1025 936 936 1006 954 954 1007 972 972 1026 973 973 1027 954 954 1007 973 973 1027 955 955 1008 955 955 1008 973 973 1027 974 974 1028 955 955 1008 974 974 1028 956 956 1009 956 956 1009 974 974 1028 975 975 1029 956 956 1009 975 975 1029 957 957 1010 957 957 1010 975 975 1029 976 976 1030 957 957 1010 976 976 1030 958 958 1011 958 958 1011 976 976 1030 977 977 1031 958 958 1011 977 977 1031 959 959 1012 959 959 1012 977 977 1031 978 978 1032 959 959 1012 978 978 1032 960 960 1013 960 960 1013 978 978 1032 979 979 1033 960 960 1013 979 979 1033 961 961 1014 961 961 1014 979 979 1033 980 980 1034 961 961 1014 980 980 1034 962 962 1015 962 962 1015 980 980 1034 981 981 1035 962 962 1015 981 981 1035 963 963 1016 963 963 1016 981 981 1035 982 982 1036 963 963 1016 982 982 1036 964 964 1017 964 964 1017 982 982 1036 983 983 1037 964 964 1017 983 983 1037 965 965 1018 965 965 1018 983 983 1037 984 984 1038 965 965 1018 984 984 1038 966 966 1019 966 966 1019 984 984 1038 985 985 1039 966 966 1019 985 985 1039 967 967 1020 967 967 1020 985 985 1039 986 986 1040 967 967 1020 986 986 1040 968 968 1021 968 968 1021 986 986 1040 987 987 1041 968 968 1021 987 987 1041 969 969 1022 969 969 1022 987 987 1041 988 988 1042 969 969 1022 988 988 1042 970 970 1023 970 970 1023 988 988 1042 989 989 1043 970 970 1023 989 989 1043 971 971 1024 971 971 1024 989 989 1043 972 972 1044 971 971 1024 972 972 1044 954 954 1025 972 972 1026 990 990 1045 991 991 1046 972 972 1026 991 991 1046 973 973 1027 973 973 1027 991 991 1046 992 992 1047 973 973 1027 992 992 1047 974 974 1028 974 974 1028 992 992 1047 993 993 1048 974 974 1028 993 993 1048 975 975 1029 975 975 1029 993 993 1048 994 994 1049 975 975 1029 994 994 1049 976 976 1030 976 976 1030 994 994 1049 995 995 1050 976 976 1030 995 995 1050 977 977 1031 977 977 1031 995 995 1050 996 996 1051 977 977 1031 996 996 1051 978 978 1032 978 978 1032 996 996 1051 997 997 1052 978 978 1032 997 997 1052 979 979 1033 979 979 1033 997 997 1052 998 998 1053 979 979 1033 998 998 1053 980 980 1034 980 980 1034 998 998 1053 999 999 1054 980 980 1034 999 999 1054 981 981 1035 981 981 1035 999 999 1054 1000 1000 1055 981 981 1035 1000 1000 1055 982 982 1036 982 982 1036 1000 1000 1055 1001 1001 1056 982 982 1036 1001 1001 1056 983 983 1037 983 983 1037 1001 1001 1056 1002 1002 1057 983 983 1037 1002 1002 1057 984 984 1038 984 984 1038 1002 1002 1057 1003 1003 1058 984 984 1038 1003 1003 1058 985 985 1039 985 985 1039 1003 1003 1058 1004 1004 1059 985 985 1039 1004 1004 1059 986 986 1040 986 986 1040 1004 1004 1059 1005 1005 1060 986 986 1040 1005 1005 1060 987 987 1041 987 987 1041 1005 1005 1060 1006 1006 1061 987 987 1041 1006 1006 1061 988 988 1042 988 988 1042 1006 1006 1061 1007 1007 1062 988 988 1042 1007 1007 1062 989 989 1043 989 989 1043 1007 1007 1062 990 990 1063 989 989 1043 990 990 1063 972 972 1044 990 990 1045 1008 1008 1064 1009 1009 1065 990 990 1045 1009 1009 1065 991 991 1046 991 991 1046 1009 1009 1065 1010 1010 1066 991 991 1046 1010 1010 1066 992 992 1047 992 992 1047 1010 1010 1066 1011 1011 1067 992 992 1047 1011 1011 1067 993 993 1048 993 993 1048 1011 1011 1067 1012 1012 1068 993 993 1048 1012 1012 1068 994 994 1049 994 994 1049 1012 1012 1068 1013 1013 1069 994 994 1049 1013 1013 1069 995 995 1050 995 995 1050 1013 1013 1069 1014 1014 1070 995 995 1050 1014 1014 1070 996 996 1051 996 996 1051 1014 1014 1070 1015 1015 1071 996 996 1051 1015 1015 1071 997 997 1052 997 997 1052 1015 1015 1071 1016 1016 1072 997 997 1052 1016 1016 1072 998 998 1053 998 998 1053 1016 1016 1072 1017 1017 1073 998 998 1053 1017 1017 1073 999 999 1054 999 999 1054 1017 1017 1073 1018 1018 1074 999 999 1054 1018 1018 1074 1000 1000 1055 1000 1000 1055 1018 1018 1074 1019 1019 1075 1000 1000 1055 1019 1019 1075 1001 1001 1056 1001 1001 1056 1019 1019 1075 1020 1020 1076 1001 1001 1056 1020 1020 1076 1002 1002 1057 1002 1002 1057 1020 1020 1076 1021 1021 1077 1002 1002 1057 1021 1021 1077 1003 1003 1058 1003 1003 1058 1021 1021 1077 1022 1022 1078 1003 1003 1058 1022 1022 1078 1004 1004 1059 1004 1004 1059 1022 1022 1078 1023 1023 1079 1004 1004 1059 1023 1023 1079 1005 1005 1060 1005 1005 1060 1023 1023 1079 1024 1024 1080 1005 1005 1060 1024 1024 1080 1006 1006 1061 1006 1006 1061 1024 1024 1080 1025 1025 1081 1006 1006 1061 1025 1025 1081 1007 1007 1062 1007 1007 1062 1025 1025 1081 1008 1008 1082 1007 1007 1062 1008 1008 1082 990 990 1063 1008 1008 1064 1026 1026 1083 1027 1027 1084 1008 1008 1064 1027 1027 1084 1009 1009 1065 1009 1009 1065 1027 1027 1084 1028 1028 1085 1009 1009 1065 1028 1028 1085 1010 1010 1066 1010 1010 1066 1028 1028 1085 1029 1029 1086 1010 1010 1066 1029 1029 1086 1011 1011 1067 1011 1011 1067 1029 1029 1086 1030 1030 1087 1011 1011 1067 1030 1030 1087 1012 1012 1068 1012 1012 1068 1030 1030 1087 1031 1031 1088 1012 1012 1068 1031 1031 1088 1013 1013 1069 1013 1013 1069 1031 1031 1088 1032 1032 1089 1013 1013 1069 1032 1032 1089 1014 1014 1070 1014 1014 1070 1032 1032 1089 1033 1033 1090 1014 1014 1070 1033 1033 1090 1015 1015 1071 1015 1015 1071 1033 1033 1090 1034 1034 1091 1015 1015 1071 1034 1034 1091 1016 1016 1072 1016 1016 1072 1034 1034 1091 1035 1035 1092 1016 1016 1072 1035 1035 1092 1017 1017 1073 1017 1017 1073 1035 1035 1092 1036 1036 1093 1017 1017 1073 1036 1036 1093 1018 1018 1074 1018 1018 1074 1036 1036 1093 1037 1037 1094 1018 1018 1074 1037 1037 1094 1019 1019 1075 1019 1019 1075 1037 1037 1094 1038 1038 1095 1019 1019 1075 1038 1038 1095 1020 1020 1076 1020 1020 1076 1038 1038 1095 1039 1039 1096 1020 1020 1076 1039 1039 1096 1021 1021 1077 1021 1021 1077 1039 1039 1096 1040 1040 1097 1021 1021 1077 1040 1040 1097 1022 1022 1078 1022 1022 1078 1040 1040 1097 1041 1041 1098 1022 1022 1078 1041 1041 1098 1023 1023 1079 1023 1023 1079 1041 1041 1098 1042 1042 1099 1023 1023 1079 1042 1042 1099 1024 1024 1080 1024 1024 1080 1042 1042 1099 1043 1043 1100 1024 1024 1080 1043 1043 1100 1025 1025 1081 1025 1025 1081 1043 1043 1100 1026 1026 1101 1025 1025 1081 1026 1026 1101 1008 1008 1082 1026 1026 1083 1044 1044 1102 1045 1045 1103 1026 1026 1083 1045 1045 1103 1027 1027 1084 1027 1027 1084 1045 1045 1103 1046 1046 1104 1027 1027 1084 1046 1046 1104 1028 1028 1085 1028 1028 1085 1046 1046 1104 1047 1047 1105 1028 1028 1085 1047 1047 1105 1029 1029 1086 1029 1029 1086 1047 1047 1105 1048 1048 1106 1029 1029 1086 1048 1048 1106 1030 1030 1087 1030 1030 1087 1048 1048 1106 1049 1049 1107 1030 1030 1087 1049 1049 1107 1031 1031 1088 1031 1031 1088 1049 1049 1107 1050 1050 1108 1031 1031 1088 1050 1050 1108 1032 1032 1089 1032 1032 1089 1050 1050 1108 1051 1051 1109 1032 1032 1089 1051 1051 1109 1033 1033 1090 1033 1033 1090 1051 1051 1109 1052 1052 1110 1033 1033 1090 1052 1052 1110 1034 1034 1091 1034 1034 1091 1052 1052 1110 1053 1053 1111 1034 1034 1091 1053 1053 1111 1035 1035 1092 1035 1035 1092 1053 1053 1111 1054 1054 1112 1035 1035 1092 1054 1054 1112 1036 1036 1093 1036 1036 1093 1054 1054 1112 1055 1055 1113 1036 1036 1093 1055 1055 1113 1037 1037 1094 1037 1037 1094 1055 1055 1113 1056 1056 1114 1037 1037 1094 1056 1056 1114 1038 1038 1095 1038 1038 1095 1056 1056 1114 1057 1057 1115 1038 1038 1095 1057 1057 1115 1039 1039 1096 1039 1039 1096 1057 1057 1115 1058 1058 1116 1039 1039 1096 1058 1058 1116 1040 1040 1097 1040 1040 1097 1058 1058 1116 1059 1059 1117 1040 1040 1097 1059 1059 1117 1041 1041 1098 1041 1041 1098 1059 1059 1117 1060 1060 1118 1041 1041 1098 1060 1060 1118 1042 1042 1099 1042 1042 1099 1060 1060 1118 1061 1061 1119 1042 1042 1099 1061 1061 1119 1043 1043 1100 1043 1043 1100 1061 1061 1119 1044 1044 1120 1043 1043 1100 1044 1044 1120 1026 1026 1101 1044 1044 1102 1062 1062 1121 1063 1063 1122 1044 1044 1102 1063 1063 1122 1045 1045 1103 1045 1045 1103 1063 1063 1122 1064 1064 1123 1045 1045 1103 1064 1064 1123 1046 1046 1104 1046 1046 1104 1064 1064 1123 1065 1065 1124 1046 1046 1104 1065 1065 1124 1047 1047 1105 1047 1047 1105 1065 1065 1124 1066 1066 1125 1047 1047 1105 1066 1066 1125 1048 1048 1106 1048 1048 1106 1066 1066 1125 1067 1067 1126 1048 1048 1106 1067 1067 1126 1049 1049 1107 1049 1049 1107 1067 1067 1126 1068 1068 1127 1049 1049 1107 1068 1068 1127 1050 1050 1108 1050 1050 1108 1068 1068 1127 1069 1069 1128 1050 1050 1108 1069 1069 1128 1051 1051 1109 1051 1051 1109 1069 1069 1128 1070 1070 1129 1051 1051 1109 1070 1070 1129 1052 1052 1110 1052 1052 1110 1070 1070 1129 1071 1071 1130 1052 1052 1110 1071 1071 1130 1053 1053 1111 1053 1053 1111 1071 1071 1130 1072 1072 1131 1053 1053 1111 1072 1072 1131 1054 1054 1112 1054 1054 1112 1072 1072 1131 1073 1073 1132 1054 1054 1112 1073 1073 1132 1055 1055 1113 1055 1055 1113 1073 1073 1132 1074 1074 1133 1055 1055 1113 1074 1074 1133 1056 1056 1114 1056 1056 1114 1074 1074 1133 1075 1075 1134 1056 1056 1114 1075 1075 1134 1057 1057 1115 1057 1057 1115 1075 1075 1134 1076 1076 1135 1057 1057 1115 1076 1076 1135 1058 1058 1116 1058 1058 1116 1076 1076 1135 1077 1077 1136 1058 1058 1116 1077 1077 1136 1059 1059 1117 1059 1059 1117 1077 1077 1136 1078 1078 1137 1059 1059 1117 1078 1078 1137 1060 1060 1118 1060 1060 1118 1078 1078 1137 1079 1079 1138 1060 1060 1118 1079 1079 1138 1061 1061 1119 1061 1061 1119 1079 1079 1138 1062 1062 1139 1061 1061 1119 1062 1062 1139 1044 1044 1120 1062 1062 1121 1080 1080 1140 1081 1081 1141 1062 1062 1121 1081 1081 1141 1063 1063 1122 1063 1063 1122 1081 1081 1141 1082 1082 1142 1063 1063 1122 1082 1082 1142 1064 1064 1123 1064 1064 1123 1082 1082 1142 1083 1083 1143 1064 1064 1123 1083 1083 1143 1065 1065 1124 1065 1065 1124 1083 1083 1143 1084 1084 1144 1065 1065 1124 1084 1084 1144 1066 1066 1125 1066 1066 1125 1084 1084 1144 1085 1085 1145 1066 1066 1125 1085 1085 1145 1067 1067 1126 1067 1067 1126 1085 1085 1145 1086 1086 1146 1067 1067 1126 1086 1086 1146 1068 1068 1127 1068 1068 1127 1086 1086 1146 1087 1087 1147 1068 1068 1127 1087 1087 1147 1069 1069 1128 1069 1069 1128 1087 1087 1147 1088 1088 1148 1069 1069 1128 1088 1088 1148 1070 1070 1129 1070 1070 1129 1088 1088 1148 1089 1089 1149 1070 1070 1129 1089 1089 1149 1071 1071 1130 1071 1071 1130 1089 1089 1149 1090 1090 1150 1071 1071 1130 1090 1090 1150 1072 1072 1131 1072 1072 1131 1090 1090 1150 1091 1091 1151 1072 1072 1131 1091 1091 1151 1073 1073 1132 1073 1073 1132 1091 1091 1151 1092 1092 1152 1073 1073 1132 1092 1092 1152 1074 1074 1133 1074 1074 1133 1092 1092 1152 1093 1093 1153 1074 1074 1133 1093 1093 1153 1075 1075 1134 1075 1075 1134 1093 1093 1153 1094 1094 1154 1075 1075 1134 1094 1094 1154 1076 1076 1135 1076 1076 1135 1094 1094 1154 1095 1095 1155 1076 1076 1135 1095 1095 1155 1077 1077 1136 1077 1077 1136 1095 1095 1155 1096 1096 1156 1077 1077 1136 1096 1096 1156 1078 1078 1137 1078 1078 1137 1096 1096 1156 1097 1097 1157 1078 1078 1137 1097 1097 1157 1079 1079 1138 1079 1079 1138 1097 1097 1157 1080 1080 1158 1079 1079 1138 1080 1080 1158 1062 1062 1139 1080 1080 1140 1098 1098 1159 1099 1099 1160 1080 1080 1140 1099 1099 1160 1081 1081 1141 1081 1081 1141 1099 1099 1160 1100 1100 1161 1081 1081 1141 1100 1100 1161 1082 1082 1142 1082 1082 1142 1100 1100 1161 1101 1101 1162 1082 1082 1142 1101 1101 1162 1083 1083 1143 1083 1083 1143 1101 1101 1162 1102 1102 1163 1083 1083 1143 1102 1102 1163 1084 1084 1144 1084 1084 1144 1102 1102 1163 1103 1103 1164 1084 1084 1144 1103 1103 1164 1085 1085 1145 1085 1085 1145 1103 1103 1164 1104 1104 1165 1085 1085 1145 1104 1104 1165 1086 1086 1146 1086 1086 1146 1104 1104 1165 1105 1105 1166 1086 1086 1146 1105 1105 1166 1087 1087 1147 1087 1087 1147 1105 1105 1166 1106 1106 1167 1087 1087 1147 1106 1106 1167 1088 1088 1148 1088 1088 1148 1106 1106 1167 1107 1107 1168 1088 1088 1148 1107 1107 1168 1089 1089 1149 1089 1089 1149 1107 1107 1168 1108 1108 1169 1089 1089 1149 1108 1108 1169 1090 1090 1150 1090 1090 1150 1108 1108 1169 1109 1109 1170 1090 1090 1150 1109 1109 1170 1091 1091 1151 1091 1091 1151 1109 1109 1170 1110 1110 1171 1091 1091 1151 1110 1110 1171 1092 1092 1152 1092 1092 1152 1110 1110 1171 1111 1111 1172 1092 1092 1152 1111 1111 1172 1093 1093 1153 1093 1093 1153 1111 1111 1172 1112 1112 1173 1093 1093 1153 1112 1112 1173 1094 1094 1154 1094 1094 1154 1112 1112 1173 1113 1113 1174 1094 1094 1154 1113 1113 1174 1095 1095 1155 1095 1095 1155 1113 1113 1174 1114 1114 1175 1095 1095 1155 1114 1114 1175 1096 1096 1156 1096 1096 1156 1114 1114 1175 1115 1115 1176 1096 1096 1156 1115 1115 1176 1097 1097 1157 1097 1097 1157 1115 1115 1176 1098 1098 1177 1097 1097 1157 1098 1098 1177 1080 1080 1158 1098 1098 1159 1116 1116 1178 1117 1117 1179 1098 1098 1159 1117 1117 1179 1099 1099 1160 1099 1099 1160 1117 1117 1179 1118 1118 1180 1099 1099 1160 1118 1118 1180 1100 1100 1161 1100 1100 1161 1118 1118 1180 1119 1119 1181 1100 1100 1161 1119 1119 1181 1101 1101 1162 1101 1101 1162 1119 1119 1181 1120 1120 1182 1101 1101 1162 1120 1120 1182 1102 1102 1163 1102 1102 1163 1120 1120 1182 1121 1121 1183 1102 1102 1163 1121 1121 1183 1103 1103 1164 1103 1103 1164 1121 1121 1183 1122 1122 1184 1103 1103 1164 1122 1122 1184 1104 1104 1165 1104 1104 1165 1122 1122 1184 1123 1123 1185 1104 1104 1165 1123 1123 1185 1105 1105 1166 1105 1105 1166 1123 1123 1185 1124 1124 1186 1105 1105 1166 1124 1124 1186 1106 1106 1167 1106 1106 1167 1124 1124 1186 1125 1125 1187 1106 1106 1167 1125 1125 1187 1107 1107 1168 1107 1107 1168 1125 1125 1187 1126 1126 1188 1107 1107 1168 1126 1126 1188 1108 1108 1169 1108 1108 1169 1126 1126 1188 1127 1127 1189 1108 1108 1169 1127 1127 1189 1109 1109 1170 1109 1109 1170 1127 1127 1189 1128 1128 1190 1109 1109 1170 1128 1128 1190 1110 1110 1171 1110 1110 1171 1128 1128 1190 1129 1129 1191 1110 1110 1171 1129 1129 1191 1111 1111 1172 1111 1111 1172 1129 1129 1191 1130 1130 1192 1111 1111 1172 1130 1130 1192 1112 1112 1173 1112 1112 1173 1130 1130 1192 1131 1131 1193 1112 1112 1173 1131 1131 1193 1113 1113 1174 1113 1113 1174 1131 1131 1193 1132 1132 1194 1113 1113 1174 1132 1132 1194 1114 1114 1175 1114 1114 1175 1132 1132 1194 1133 1133 1195 1114 1114 1175 1133 1133 1195 1115 1115 1176 1115 1115 1176 1133 1133 1195 1116 1116 1196 1115 1115 1176 1116 1116 1196 1098 1098 1177 1116 1116 1178 1134 1134 1197 1135 1135 1198 1116 1116 1178 1135 1135 1198 1117 1117 1179 1117 1117 1179 1135 1135 1198 1136 1136 1199 1117 1117 1179 1136 1136 1199 1118 1118 1180 1118 1118 1180 1136 1136 1199 1137 1137 1200 1118 1118 1180 1137 1137 1200 1119 1119 1181 1119 1119 1181 1137 1137 1200 1138 1138 1201 1119 1119 1181 1138 1138 1201 1120 1120 1182 1120 1120 1182 1138 1138 1201 1139 1139 1202 1120 1120 1182 1139 1139 1202 1121 1121 1183 1121 1121 1183 1139 1139 1202 1140 1140 1203 1121 1121 1183 1140 1140 1203 1122 1122 1184 1122 1122 1184 1140 1140 1203 1141 1141 1204 1122 1122 1184 1141 1141 1204 1123 1123 1185 1123 1123 1185 1141 1141 1204 1142 1142 1205 1123 1123 1185 1142 1142 1205 1124 1124 1186 1124 1124 1186 1142 1142 1205 1143 1143 1206 1124 1124 1186 1143 1143 1206 1125 1125 1187 1125 1125 1187 1143 1143 1206 1144 1144 1207 1125 1125 1187 1144 1144 1207 1126 1126 1188 1126 1126 1188 1144 1144 1207 1145 1145 1208 1126 1126 1188 1145 1145 1208 1127 1127 1189 1127 1127 1189 1145 1145 1208 1146 1146 1209 1127 1127 1189 1146 1146 1209 1128 1128 1190 1128 1128 1190 1146 1146 1209 1147 1147 1210 1128 1128 1190 1147 1147 1210 1129 1129 1191 1129 1129 1191 1147 1147 1210 1148 1148 1211 1129 1129 1191 1148 1148 1211 1130 1130 1192 1130 1130 1192 1148 1148 1211 1149 1149 1212 1130 1130 1192 1149 1149 1212 1131 1131 1193 1131 1131 1193 1149 1149 1212 1150 1150 1213 1131 1131 1193 1150 1150 1213 1132 1132 1194 1132 1132 1194 1150 1150 1213 1151 1151 1214 1132 1132 1194 1151 1151 1214 1133 1133 1195 1133 1133 1195 1151 1151 1214 1134 1134 1215 1133 1133 1195 1134 1134 1215 1116 1116 1196 1134 1134 1197 1152 1152 1216 1153 1153 1217 1134 1134 1197 1153 1153 1217 1135 1135 1198 1135 1135 1198 1153 1153 1217 1154 1154 1218 1135 1135 1198 1154 1154 1218 1136 1136 1199 1136 1136 1199 1154 1154 1218 1155 1155 1219 1136 1136 1199 1155 1155 1219 1137 1137 1200 1137 1137 1200 1155 1155 1219 1156 1156 1220 1137 1137 1200 1156 1156 1220 1138 1138 1201 1138 1138 1201 1156 1156 1220 1157 1157 1221 1138 1138 1201 1157 1157 1221 1139 1139 1202 1139 1139 1202 1157 1157 1221 1158 1158 1222 1139 1139 1202 1158 1158 1222 1140 1140 1203 1140 1140 1203 1158 1158 1222 1159 1159 1223 1140 1140 1203 1159 1159 1223 1141 1141 1204 1141 1141 1204 1159 1159 1223 1160 1160 1224 1141 1141 1204 1160 1160 1224 1142 1142 1205 1142 1142 1205 1160 1160 1224 1161 1161 1225 1142 1142 1205 1161 1161 1225 1143 1143 1206 1143 1143 1206 1161 1161 1225 1162 1162 1226 1143 1143 1206 1162 1162 1226 1144 1144 1207 1144 1144 1207 1162 1162 1226 1163 1163 1227 1144 1144 1207 1163 1163 1227 1145 1145 1208 1145 1145 1208 1163 1163 1227 1164 1164 1228 1145 1145 1208 1164 1164 1228 1146 1146 1209 1146 1146 1209 1164 1164 1228 1165 1165 1229 1146 1146 1209 1165 1165 1229 1147 1147 1210 1147 1147 1210 1165 1165 1229 1166 1166 1230 1147 1147 1210 1166 1166 1230 1148 1148 1211 1148 1148 1211 1166 1166 1230 1167 1167 1231 1148 1148 1211 1167 1167 1231 1149 1149 1212 1149 1149 1212 1167 1167 1231 1168 1168 1232 1149 1149 1212 1168 1168 1232 1150 1150 1213 1150 1150 1213 1168 1168 1232 1169 1169 1233 1150 1150 1213 1169 1169 1233 1151 1151 1214 1151 1151 1214 1169 1169 1233 1152 1152 1234 1151 1151 1214 1152 1152 1234 1134 1134 1215 1152 1152 1216 1170 1170 1235 1171 1171 1236 1152 1152 1216 1171 1171 1236 1153 1153 1217 1153 1153 1217 1171 1171 1236 1172 1172 1237 1153 1153 1217 1172 1172 1237 1154 1154 1218 1154 1154 1218 1172 1172 1237 1173 1173 1238 1154 1154 1218 1173 1173 1238 1155 1155 1219 1155 1155 1219 1173 1173 1238 1174 1174 1239 1155 1155 1219 1174 1174 1239 1156 1156 1220 1156 1156 1220 1174 1174 1239 1175 1175 1240 1156 1156 1220 1175 1175 1240 1157 1157 1221 1157 1157 1221 1175 1175 1240 1176 1176 1241 1157 1157 1221 1176 1176 1241 1158 1158 1222 1158 1158 1222 1176 1176 1241 1177 1177 1242 1158 1158 1222 1177 1177 1242 1159 1159 1223 1159 1159 1223 1177 1177 1242 1178 1178 1243 1159 1159 1223 1178 1178 1243 1160 1160 1224 1160 1160 1224 1178 1178 1243 1179 1179 1244 1160 1160 1224 1179 1179 1244 1161 1161 1225 1161 1161 1225 1179 1179 1244 1180 1180 1245 1161 1161 1225 1180 1180 1245 1162 1162 1226 1162 1162 1226 1180 1180 1245 1181 1181 1246 1162 1162 1226 1181 1181 1246 1163 1163 1227 1163 1163 1227 1181 1181 1246 1182 1182 1247 1163 1163 1227 1182 1182 1247 1164 1164 1228 1164 1164 1228 1182 1182 1247 1183 1183 1248 1164 1164 1228 1183 1183 1248 1165 1165 1229 1165 1165 1229 1183 1183 1248 1184 1184 1249 1165 1165 1229 1184 1184 1249 1166 1166 1230 1166 1166 1230 1184 1184 1249 1185 1185 1250 1166 1166 1230 1185 1185 1250 1167 1167 1231 1167 1167 1231 1185 1185 1250 1186 1186 1251 1167 1167 1231 1186 1186 1251 1168 1168 1232 1168 1168 1232 1186 1186 1251 1187 1187 1252 1168 1168 1232 1187 1187 1252 1169 1169 1233 1169 1169 1233 1187 1187 1252 1170 1170 1253 1169 1169 1233 1170 1170 1253 1152 1152 1234 1170 1170 1235 1188 1188 1254 1189 1189 1255 1170 1170 1235 1189 1189 1255 1171 1171 1236 1171 1171 1236 1189 1189 1255 1190 1190 1256 1171 1171 1236 1190 1190 1256 1172 1172 1237 1172 1172 1237 1190 1190 1256 1191 1191 1257 1172 1172 1237 1191 1191 1257 1173 1173 1238 1173 1173 1238 1191 1191 1257 1192 1192 1258 1173 1173 1238 1192 1192 1258 1174 1174 1239 1174 1174 1239 1192 1192 1258 1193 1193 1259 1174 1174 1239 1193 1193 1259 1175 1175 1240 1175 1175 1240 1193 1193 1259 1194 1194 1260 1175 1175 1240 1194 1194 1260 1176 1176 1241 1176 1176 1241 1194 1194 1260 1195 1195 1261 1176 1176 1241 1195 1195 1261 1177 1177 1242 1177 1177 1242 1195 1195 1261 1196 1196 1262 1177 1177 1242 1196 1196 1262 1178 1178 1243 1178 1178 1243 1196 1196 1262 1197 1197 1263 1178 1178 1243 1197 1197 1263 1179 1179 1244 1179 1179 1244 1197 1197 1263 1198 1198 1264 1179 1179 1244 1198 1198 1264 1180 1180 1245 1180 1180 1245 1198 1198 1264 1199 1199 1265 1180 1180 1245 1199 1199 1265 1181 1181 1246 1181 1181 1246 1199 1199 1265 1200 1200 1266 1181 1181 1246 1200 1200 1266 1182 1182 1247 1182 1182 1247 1200 1200 1266 1201 1201 1267 1182 1182 1247 1201 1201 1267 1183 1183 1248 1183 1183 1248 1201 1201 1267 1202 1202 1268 1183 1183 1248 1202 1202 1268 1184 1184 1249 1184 1184 1249 1202 1202 1268 1203 1203 1269 1184 1184 1249 1203 1203 1269 1185 1185 1250 1185 1185 1250 1203 1203 1269 1204 1204 1270 1185 1185 1250 1204 1204 1270 1186 1186 1251 1186 1186 1251 1204 1204 1270 1205 1205 1271 1186 1186 1251 1205 1205 1271 1187 1187 1252 1187 1187 1252 1205 1205 1271 1188 1188 1272 1187 1187 1252 1188 1188 1272 1170 1170 1253 1188 1188 1254 1206 1206 1273 1207 1207 1274 1188 1188 1254 1207 1207 1274 1189 1189 1255 1189 1189 1255 1207 1207 1274 1208 1208 1275 1189 1189 1255 1208 1208 1275 1190 1190 1256 1190 1190 1256 1208 1208 1275 1209 1209 1276 1190 1190 1256 1209 1209 1276 1191 1191 1257 1191 1191 1257 1209 1209 1276 1210 1210 1277 1191 1191 1257 1210 1210 1277 1192 1192 1258 1192 1192 1258 1210 1210 1277 1211 1211 1278 1192 1192 1258 1211 1211 1278 1193 1193 1259 1193 1193 1259 1211 1211 1278 1212 1212 1279 1193 1193 1259 1212 1212 1279 1194 1194 1260 1194 1194 1260 1212 1212 1279 1213 1213 1280 1194 1194 1260 1213 1213 1280 1195 1195 1261 1195 1195 1261 1213 1213 1280 1214 1214 1281 1195 1195 1261 1214 1214 1281 1196 1196 1262 1196 1196 1262 1214 1214 1281 1215 1215 1282 1196 1196 1262 1215 1215 1282 1197 1197 1263 1197 1197 1263 1215 1215 1282 1216 1216 1283 1197 1197 1263 1216 1216 1283 1198 1198 1264 1198 1198 1264 1216 1216 1283 1217 1217 1284 1198 1198 1264 1217 1217 1284 1199 1199 1265 1199 1199 1265 1217 1217 1284 1218 1218 1285 1199 1199 1265 1218 1218 1285 1200 1200 1266 1200 1200 1266 1218 1218 1285 1219 1219 1286 1200 1200 1266 1219 1219 1286 1201 1201 1267 1201 1201 1267 1219 1219 1286 1220 1220 1287 1201 1201 1267 1220 1220 1287 1202 1202 1268 1202 1202 1268 1220 1220 1287 1221 1221 1288 1202 1202 1268 1221 1221 1288 1203 1203 1269 1203 1203 1269 1221 1221 1288 1222 1222 1289 1203 1203 1269 1222 1222 1289 1204 1204 1270 1204 1204 1270 1222 1222 1289 1223 1223 1290 1204 1204 1270 1223 1223 1290 1205 1205 1271 1205 1205 1271 1223 1223 1290 1206 1206 1291 1205 1205 1271 1206 1206 1291 1188 1188 1272 1206 1206 1273 1224 1224 1292 1225 1225 1293 1206 1206 1273 1225 1225 1293 1207 1207 1274 1207 1207 1274 1225 1225 1293 1226 1226 1294 1207 1207 1274 1226 1226 1294 1208 1208 1275 1208 1208 1275 1226 1226 1294 1227 1227 1295 1208 1208 1275 1227 1227 1295 1209 1209 1276 1209 1209 1276 1227 1227 1295 1228 1228 1296 1209 1209 1276 1228 1228 1296 1210 1210 1277 1210 1210 1277 1228 1228 1296 1229 1229 1297 1210 1210 1277 1229 1229 1297 1211 1211 1278 1211 1211 1278 1229 1229 1297 1230 1230 1298 1211 1211 1278 1230 1230 1298 1212 1212 1279 1212 1212 1279 1230 1230 1298 1231 1231 1299 1212 1212 1279 1231 1231 1299 1213 1213 1280 1213 1213 1280 1231 1231 1299 1232 1232 1300 1213 1213 1280 1232 1232 1300 1214 1214 1281 1214 1214 1281 1232 1232 1300 1233 1233 1301 1214 1214 1281 1233 1233 1301 1215 1215 1282 1215 1215 1282 1233 1233 1301 1234 1234 1302 1215 1215 1282 1234 1234 1302 1216 1216 1283 1216 1216 1283 1234 1234 1302 1235 1235 1303 1216 1216 1283 1235 1235 1303 1217 1217 1284 1217 1217 1284 1235 1235 1303 1236 1236 1304 1217 1217 1284 1236 1236 1304 1218 1218 1285 1218 1218 1285 1236 1236 1304 1237 1237 1305 1218 1218 1285 1237 1237 1305 1219 1219 1286 1219 1219 1286 1237 1237 1305 1238 1238 1306 1219 1219 1286 1238 1238 1306 1220 1220 1287 1220 1220 1287 1238 1238 1306 1239 1239 1307 1220 1220 1287 1239 1239 1307 1221 1221 1288 1221 1221 1288 1239 1239 1307 1240 1240 1308 1221 1221 1288 1240 1240 1308 1222 1222 1289 1222 1222 1289 1240 1240 1308 1241 1241 1309 1222 1222 1289 1241 1241 1309 1223 1223 1290 1223 1223 1290 1241 1241 1309 1224 1224 1310 1223 1223 1290 1224 1224 1310 1206 1206 1291 1224 1224 1292 1242 1242 1311 1243 1243 1312 1224 1224 1292 1243 1243 1312 1225 1225 1293 1225 1225 1293 1243 1243 1312 1244 1244 1313 1225 1225 1293 1244 1244 1313 1226 1226 1294 1226 1226 1294 1244 1244 1313 1245 1245 1314 1226 1226 1294 1245 1245 1314 1227 1227 1295 1227 1227 1295 1245 1245 1314 1246 1246 1315 1227 1227 1295 1246 1246 1315 1228 1228 1296 1228 1228 1296 1246 1246 1315 1247 1247 1316 1228 1228 1296 1247 1247 1316 1229 1229 1297 1229 1229 1297 1247 1247 1316 1248 1248 1317 1229 1229 1297 1248 1248 1317 1230 1230 1298 1230 1230 1298 1248 1248 1317 1249 1249 1318 1230 1230 1298 1249 1249 1318 1231 1231 1299 1231 1231 1299 1249 1249 1318 1250 1250 1319 1231 1231 1299 1250 1250 1319 1232 1232 1300 1232 1232 1300 1250 1250 1319 1251 1251 1320 1232 1232 1300 1251 1251 1320 1233 1233 1301 1233 1233 1301 1251 1251 1320 1252 1252 1321 1233 1233 1301 1252 1252 1321 1234 1234 1302 1234 1234 1302 1252 1252 1321 1253 1253 1322 1234 1234 1302 1253 1253 1322 1235 1235 1303 1235 1235 1303 1253 1253 1322 1254 1254 1323 1235 1235 1303 1254 1254 1323 1236 1236 1304 1236 1236 1304 1254 1254 1323 1255 1255 1324 1236 1236 1304 1255 1255 1324 1237 1237 1305 1237 1237 1305 1255 1255 1324 1256 1256 1325 1237 1237 1305 1256 1256 1325 1238 1238 1306 1238 1238 1306 1256 1256 1325 1257 1257 1326 1238 1238 1306 1257 1257 1326 1239 1239 1307 1239 1239 1307 1257 1257 1326 1258 1258 1327 1239 1239 1307 1258 1258 1327 1240 1240 1308 1240 1240 1308 1258 1258 1327 1259 1259 1328 1240 1240 1308 1259 1259 1328 1241 1241 1309 1241 1241 1309 1259 1259 1328 1242 1242 1329 1241 1241 1309 1242 1242 1329 1224 1224 1310 1242 1242 1311 1260 1260 1330 1261 1261 1331 1242 1242 1311 1261 1261 1331 1243 1243 1312 1243 1243 1312 1261 1261 1331 1262 1262 1332 1243 1243 1312 1262 1262 1332 1244 1244 1313 1244 1244 1313 1262 1262 1332 1263 1263 1333 1244 1244 1313 1263 1263 1333 1245 1245 1314 1245 1245 1314 1263 1263 1333 1264 1264 1334 1245 1245 1314 1264 1264 1334 1246 1246 1315 1246 1246 1315 1264 1264 1334 1265 1265 1335 1246 1246 1315 1265 1265 1335 1247 1247 1316 1247 1247 1316 1265 1265 1335 1266 1266 1336 1247 1247 1316 1266 1266 1336 1248 1248 1317 1248 1248 1317 1266 1266 1336 1267 1267 1337 1248 1248 1317 1267 1267 1337 1249 1249 1318 1249 1249 1318 1267 1267 1337 1268 1268 1338 1249 1249 1318 1268 1268 1338 1250 1250 1319 1250 1250 1319 1268 1268 1338 1269 1269 1339 1250 1250 1319 1269 1269 1339 1251 1251 1320 1251 1251 1320 1269 1269 1339 1270 1270 1340 1251 1251 1320 1270 1270 1340 1252 1252 1321 1252 1252 1321 1270 1270 1340 1271 1271 1341 1252 1252 1321 1271 1271 1341 1253 1253 1322 1253 1253 1322 1271 1271 1341 1272 1272 1342 1253 1253 1322 1272 1272 1342 1254 1254 1323 1254 1254 1323 1272 1272 1342 1273 1273 1343 1254 1254 1323 1273 1273 1343 1255 1255 1324 1255 1255 1324 1273 1273 1343 1274 1274 1344 1255 1255 1324 1274 1274 1344 1256 1256 1325 1256 1256 1325 1274 1274 1344 1275 1275 1345 1256 1256 1325 1275 1275 1345 1257 1257 1326 1257 1257 1326 1275 1275 1345 1276 1276 1346 1257 1257 1326 1276 1276 1346 1258 1258 1327 1258 1258 1327 1276 1276 1346 1277 1277 1347 1258 1258 1327 1277 1277 1347 1259 1259 1328 1259 1259 1328 1277 1277 1347 1260 1260 1348 1259 1259 1328 1260 1260 1348 1242 1242 1329 1260 1260 1330 1278 1278 1349 1279 1279 1350 1260 1260 1330 1279 1279 1350 1261 1261 1331 1261 1261 1331 1279 1279 1350 1280 1280 1351 1261 1261 1331 1280 1280 1351 1262 1262 1332 1262 1262 1332 1280 1280 1351 1281 1281 1352 1262 1262 1332 1281 1281 1352 1263 1263 1333 1263 1263 1333 1281 1281 1352 1282 1282 1353 1263 1263 1333 1282 1282 1353 1264 1264 1334 1264 1264 1334 1282 1282 1353 1283 1283 1354 1264 1264 1334 1283 1283 1354 1265 1265 1335 1265 1265 1335 1283 1283 1354 1284 1284 1355 1265 1265 1335 1284 1284 1355 1266 1266 1336 1266 1266 1336 1284 1284 1355 1285 1285 1356 1266 1266 1336 1285 1285 1356 1267 1267 1337 1267 1267 1337 1285 1285 1356 1286 1286 1357 1267 1267 1337 1286 1286 1357 1268 1268 1338 1268 1268 1338 1286 1286 1357 1287 1287 1358 1268 1268 1338 1287 1287 1358 1269 1269 1339 1269 1269 1339 1287 1287 1358 1288 1288 1359 1269 1269 1339 1288 1288 1359 1270 1270 1340 1270 1270 1340 1288 1288 1359 1289 1289 1360 1270 1270 1340 1289 1289 1360 1271 1271 1341 1271 1271 1341 1289 1289 1360 1290 1290 1361 1271 1271 1341 1290 1290 1361 1272 1272 1342 1272 1272 1342 1290 1290 1361 1291 1291 1362 1272 1272 1342 1291 1291 1362 1273 1273 1343 1273 1273 1343 1291 1291 1362 1292 1292 1363 1273 1273 1343 1292 1292 1363 1274 1274 1344 1274 1274 1344 1292 1292 1363 1293 1293 1364 1274 1274 1344 1293 1293 1364 1275 1275 1345 1275 1275 1345 1293 1293 1364 1294 1294 1365 1275 1275 1345 1294 1294 1365 1276 1276 1346 1276 1276 1346 1294 1294 1365 1295 1295 1366 1276 1276 1346 1295 1295 1366 1277 1277 1347 1277 1277 1347 1295 1295 1366 1278 1278 1367 1277 1277 1347 1278 1278 1367 1260 1260 1348 1278 1278 1349 1296 1296 1368 1297 1297 1369 1278 1278 1349 1297 1297 1369 1279 1279 1350 1279 1279 1350 1297 1297 1369 1298 1298 1370 1279 1279 1350 1298 1298 1370 1280 1280 1351 1280 1280 1351 1298 1298 1370 1299 1299 1371 1280 1280 1351 1299 1299 1371 1281 1281 1352 1281 1281 1352 1299 1299 1371 1300 1300 1372 1281 1281 1352 1300 1300 1372 1282 1282 1353 1282 1282 1353 1300 1300 1372 1301 1301 1373 1282 1282 1353 1301 1301 1373 1283 1283 1354 1283 1283 1354 1301 1301 1373 1302 1302 1374 1283 1283 1354 1302 1302 1374 1284 1284 1355 1284 1284 1355 1302 1302 1374 1303 1303 1375 1284 1284 1355 1303 1303 1375 1285 1285 1356 1285 1285 1356 1303 1303 1375 1304 1304 1376 1285 1285 1356 1304 1304 1376 1286 1286 1357 1286 1286 1357 1304 1304 1376 1305 1305 1377 1286 1286 1357 1305 1305 1377 1287 1287 1358 1287 1287 1358 1305 1305 1377 1306 1306 1378 1287 1287 1358 1306 1306 1378 1288 1288 1359 1288 1288 1359 1306 1306 1378 1307 1307 1379 1288 1288 1359 1307 1307 1379 1289 1289 1360 1289 1289 1360 1307 1307 1379 1308 1308 1380 1289 1289 1360 1308 1308 1380 1290 1290 1361 1290 1290 1361 1308 1308 1380 1309 1309 1381 1290 1290 1361 1309 1309 1381 1291 1291 1362 1291 1291 1362 1309 1309 1381 1310 1310 1382 1291 1291 1362 1310 1310 1382 1292 1292 1363 1292 1292 1363 1310 1310 1382 1311 1311 1383 1292 1292 1363 1311 1311 1383 1293 1293 1364 1293 1293 1364 1311 1311 1383 1312 1312 1384 1293 1293 1364 1312 1312 1384 1294 1294 1365 1294 1294 1365 1312 1312 1384 1313 1313 1385 1294 1294 1365 1313 1313 1385 1295 1295 1366 1295 1295 1366 1313 1313 1385 1296 1296 1386 1295 1295 1366 1296 1296 1386 1278 1278 1367 1296 1296 1368 1314 1314 1387 1315 1315 1388 1296 1296 1368 1315 1315 1388 1297 1297 1369 1297 1297 1369 1315 1315 1388 1316 1316 1389 1297 1297 1369 1316 1316 1389 1298 1298 1370 1298 1298 1370 1316 1316 1389 1317 1317 1390 1298 1298 1370 1317 1317 1390 1299 1299 1371 1299 1299 1371 1317 1317 1390 1318 1318 1391 1299 1299 1371 1318 1318 1391 1300 1300 1372 1300 1300 1372 1318 1318 1391 1319 1319 1392 1300 1300 1372 1319 1319 1392 1301 1301 1373 1301 1301 1373 1319 1319 1392 1320 1320 1393 1301 1301 1373 1320 1320 1393 1302 1302 1374 1302 1302 1374 1320 1320 1393 1321 1321 1394 1302 1302 1374 1321 1321 1394 1303 1303 1375 1303 1303 1375 1321 1321 1394 1322 1322 1395 1303 1303 1375 1322 1322 1395 1304 1304 1376 1304 1304 1376 1322 1322 1395 1323 1323 1396 1304 1304 1376 1323 1323 1396 1305 1305 1377 1305 1305 1377 1323 1323 1396 1324 1324 1397 1305 1305 1377 1324 1324 1397 1306 1306 1378 1306 1306 1378 1324 1324 1397 1325 1325 1398 1306 1306 1378 1325 1325 1398 1307 1307 1379 1307 1307 1379 1325 1325 1398 1326 1326 1399 1307 1307 1379 1326 1326 1399 1308 1308 1380 1308 1308 1380 1326 1326 1399 1327 1327 1400 1308 1308 1380 1327 1327 1400 1309 1309 1381 1309 1309 1381 1327 1327 1400 1328 1328 1401 1309 1309 1381 1328 1328 1401 1310 1310 1382 1310 1310 1382 1328 1328 1401 1329 1329 1402 1310 1310 1382 1329 1329 1402 1311 1311 1383 1311 1311 1383 1329 1329 1402 1330 1330 1403 1311 1311 1383 1330 1330 1403 1312 1312 1384 1312 1312 1384 1330 1330 1403 1331 1331 1404 1312 1312 1384 1331 1331 1404 1313 1313 1385 1313 1313 1385 1331 1331 1404 1314 1314 1405 1313 1313 1385 1314 1314 1405 1296 1296 1386 1314 1314 1387 1332 1332 1406 1333 1333 1407 1314 1314 1387 1333 1333 1407 1315 1315 1388 1315 1315 1388 1333 1333 1407 1334 1334 1408 1315 1315 1388 1334 1334 1408 1316 1316 1389 1316 1316 1389 1334 1334 1408 1335 1335 1409 1316 1316 1389 1335 1335 1409 1317 1317 1390 1317 1317 1390 1335 1335 1409 1336 1336 1410 1317 1317 1390 1336 1336 1410 1318 1318 1391 1318 1318 1391 1336 1336 1410 1337 1337 1411 1318 1318 1391 1337 1337 1411 1319 1319 1392 1319 1319 1392 1337 1337 1411 1338 1338 1412 1319 1319 1392 1338 1338 1412 1320 1320 1393 1320 1320 1393 1338 1338 1412 1339 1339 1413 1320 1320 1393 1339 1339 1413 1321 1321 1394 1321 1321 1394 1339 1339 1413 1340 1340 1414 1321 1321 1394 1340 1340 1414 1322 1322 1395 1322 1322 1395 1340 1340 1414 1341 1341 1415 1322 1322 1395 1341 1341 1415 1323 1323 1396 1323 1323 1396 1341 1341 1415 1342 1342 1416 1323 1323 1396 1342 1342 1416 1324 1324 1397 1324 1324 1397 1342 1342 1416 1343 1343 1417 1324 1324 1397 1343 1343 1417 1325 1325 1398 1325 1325 1398 1343 1343 1417 1344 1344 1418 1325 1325 1398 1344 1344 1418 1326 1326 1399 1326 1326 1399 1344 1344 1418 1345 1345 1419 1326 1326 1399 1345 1345 1419 1327 1327 1400 1327 1327 1400 1345 1345 1419 1346 1346 1420 1327 1327 1400 1346 1346 1420 1328 1328 1401 1328 1328 1401 1346 1346 1420 1347 1347 1421 1328 1328 1401 1347 1347 1421 1329 1329 1402 1329 1329 1402 1347 1347 1421 1348 1348 1422 1329 1329 1402 1348 1348 1422 1330 1330 1403 1330 1330 1403 1348 1348 1422 1349 1349 1423 1330 1330 1403 1349 1349 1423 1331 1331 1404 1331 1331 1404 1349 1349 1423 1332 1332 1424 1331 1331 1404 1332 1332 1424 1314 1314 1405 1332 1332 1406 1350 1350 1425 1351 1351 1426 1332 1332 1406 1351 1351 1426 1333 1333 1407 1333 1333 1407 1351 1351 1426 1352 1352 1427 1333 1333 1407 1352 1352 1427 1334 1334 1408 1334 1334 1408 1352 1352 1427 1353 1353 1428 1334 1334 1408 1353 1353 1428 1335 1335 1409 1335 1335 1409 1353 1353 1428 1354 1354 1429 1335 1335 1409 1354 1354 1429 1336 1336 1410 1336 1336 1410 1354 1354 1429 1355 1355 1430 1336 1336 1410 1355 1355 1430 1337 1337 1411 1337 1337 1411 1355 1355 1430 1356 1356 1431 1337 1337 1411 1356 1356 1431 1338 1338 1412 1338 1338 1412 1356 1356 1431 1357 1357 1432 1338 1338 1412 1357 1357 1432 1339 1339 1413 1339 1339 1413 1357 1357 1432 1358 1358 1433 1339 1339 1413 1358 1358 1433 1340 1340 1414 1340 1340 1414 1358 1358 1433 1359 1359 1434 1340 1340 1414 1359 1359 1434 1341 1341 1415 1341 1341 1415 1359 1359 1434 1360 1360 1435 1341 1341 1415 1360 1360 1435 1342 1342 1416 1342 1342 1416 1360 1360 1435 1361 1361 1436 1342 1342 1416 1361 1361 1436 1343 1343 1417 1343 1343 1417 1361 1361 1436 1362 1362 1437 1343 1343 1417 1362 1362 1437 1344 1344 1418 1344 1344 1418 1362 1362 1437 1363 1363 1438 1344 1344 1418 1363 1363 1438 1345 1345 1419 1345 1345 1419 1363 1363 1438 1364 1364 1439 1345 1345 1419 1364 1364 1439 1346 1346 1420 1346 1346 1420 1364 1364 1439 1365 1365 1440 1346 1346 1420 1365 1365 1440 1347 1347 1421 1347 1347 1421 1365 1365 1440 1366 1366 1441 1347 1347 1421 1366 1366 1441 1348 1348 1422 1348 1348 1422 1366 1366 1441 1367 1367 1442 1348 1348 1422 1367 1367 1442 1349 1349 1423 1349 1349 1423 1367 1367 1442 1350 1350 1443 1349 1349 1423 1350 1350 1443 1332 1332 1424 1350 1350 1425 1368 1368 1444 1369 1369 1445 1350 1350 1425 1369 1369 1445 1351 1351 1426 1351 1351 1426 1369 1369 1445 1370 1370 1446 1351 1351 1426 1370 1370 1446 1352 1352 1427 1352 1352 1427 1370 1370 1446 1371 1371 1447 1352 1352 1427 1371 1371 1447 1353 1353 1428 1353 1353 1428 1371 1371 1447 1372 1372 1448 1353 1353 1428 1372 1372 1448 1354 1354 1429 1354 1354 1429 1372 1372 1448 1373 1373 1449 1354 1354 1429 1373 1373 1449 1355 1355 1430 1355 1355 1430 1373 1373 1449 1374 1374 1450 1355 1355 1430 1374 1374 1450 1356 1356 1431 1356 1356 1431 1374 1374 1450 1375 1375 1451 1356 1356 1431 1375 1375 1451 1357 1357 1432 1357 1357 1432 1375 1375 1451 1376 1376 1452 1357 1357 1432 1376 1376 1452 1358 1358 1433 1358 1358 1433 1376 1376 1452 1377 1377 1453 1358 1358 1433 1377 1377 1453 1359 1359 1434 1359 1359 1434 1377 1377 1453 1378 1378 1454 1359 1359 1434 1378 1378 1454 1360 1360 1435 1360 1360 1435 1378 1378 1454 1379 1379 1455 1360 1360 1435 1379 1379 1455 1361 1361 1436 1361 1361 1436 1379 1379 1455 1380 1380 1456 1361 1361 1436 1380 1380 1456 1362 1362 1437 1362 1362 1437 1380 1380 1456 1381 1381 1457 1362 1362 1437 1381 1381 1457 1363 1363 1438 1363 1363 1438 1381 1381 1457 1382 1382 1458 1363 1363 1438 1382 1382 1458 1364 1364 1439 1364 1364 1439 1382 1382 1458 1383 1383 1459 1364 1364 1439 1383 1383 1459 1365 1365 1440 1365 1365 1440 1383 1383 1459 1384 1384 1460 1365 1365 1440 1384 1384 1460 1366 1366 1441 1366 1366 1441 1384 1384 1460 1385 1385 1461 1366 1366 1441 1385 1385 1461 1367 1367 1442 1367 1367 1442 1385 1385 1461 1368 1368 1462 1367 1367 1442 1368 1368 1462 1350 1350 1443 1368 1368 1444 1386 1386 1463 1387 1387 1464 1368 1368 1444 1387 1387 1464 1369 1369 1445 1369 1369 1445 1387 1387 1464 1388 1388 1465 1369 1369 1445 1388 1388 1465 1370 1370 1446 1370 1370 1446 1388 1388 1465 1389 1389 1466 1370 1370 1446 1389 1389 1466 1371 1371 1447 1371 1371 1447 1389 1389 1466 1390 1390 1467 1371 1371 1447 1390 1390 1467 1372 1372 1448 1372 1372 1448 1390 1390 1467 1391 1391 1468 1372 1372 1448 1391 1391 1468 1373 1373 1449 1373 1373 1449 1391 1391 1468 1392 1392 1469 1373 1373 1449 1392 1392 1469 1374 1374 1450 1374 1374 1450 1392 1392 1469 1393 1393 1470 1374 1374 1450 1393 1393 1470 1375 1375 1451 1375 1375 1451 1393 1393 1470 1394 1394 1471 1375 1375 1451 1394 1394 1471 1376 1376 1452 1376 1376 1452 1394 1394 1471 1395 1395 1472 1376 1376 1452 1395 1395 1472 1377 1377 1453 1377 1377 1453 1395 1395 1472 1396 1396 1473 1377 1377 1453 1396 1396 1473 1378 1378 1454 1378 1378 1454 1396 1396 1473 1397 1397 1474 1378 1378 1454 1397 1397 1474 1379 1379 1455 1379 1379 1455 1397 1397 1474 1398 1398 1475 1379 1379 1455 1398 1398 1475 1380 1380 1456 1380 1380 1456 1398 1398 1475 1399 1399 1476 1380 1380 1456 1399 1399 1476 1381 1381 1457 1381 1381 1457 1399 1399 1476 1400 1400 1477 1381 1381 1457 1400 1400 1477 1382 1382 1458 1382 1382 1458 1400 1400 1477 1401 1401 1478 1382 1382 1458 1401 1401 1478 1383 1383 1459 1383 1383 1459 1401 1401 1478 1402 1402 1479 1383 1383 1459 1402 1402 1479 1384 1384 1460 1384 1384 1460 1402 1402 1479 1403 1403 1480 1384 1384 1460 1403 1403 1480 1385 1385 1461 1385 1385 1461 1403 1403 1480 1386 1386 1481 1385 1385 1461 1386 1386 1481 1368 1368 1462 1386 1386 1463 1404 1404 1482 1405 1405 1483 1386 1386 1463 1405 1405 1483 1387 1387 1464 1387 1387 1464 1405 1405 1483 1406 1406 1484 1387 1387 1464 1406 1406 1484 1388 1388 1465 1388 1388 1465 1406 1406 1484 1407 1407 1485 1388 1388 1465 1407 1407 1485 1389 1389 1466 1389 1389 1466 1407 1407 1485 1408 1408 1486 1389 1389 1466 1408 1408 1486 1390 1390 1467 1390 1390 1467 1408 1408 1486 1409 1409 1487 1390 1390 1467 1409 1409 1487 1391 1391 1468 1391 1391 1468 1409 1409 1487 1410 1410 1488 1391 1391 1468 1410 1410 1488 1392 1392 1469 1392 1392 1469 1410 1410 1488 1411 1411 1489 1392 1392 1469 1411 1411 1489 1393 1393 1470 1393 1393 1470 1411 1411 1489 1412 1412 1490 1393 1393 1470 1412 1412 1490 1394 1394 1471 1394 1394 1471 1412 1412 1490 1413 1413 1491 1394 1394 1471 1413 1413 1491 1395 1395 1472 1395 1395 1472 1413 1413 1491 1414 1414 1492 1395 1395 1472 1414 1414 1492 1396 1396 1473 1396 1396 1473 1414 1414 1492 1415 1415 1493 1396 1396 1473 1415 1415 1493 1397 1397 1474 1397 1397 1474 1415 1415 1493 1416 1416 1494 1397 1397 1474 1416 1416 1494 1398 1398 1475 1398 1398 1475 1416 1416 1494 1417 1417 1495 1398 1398 1475 1417 1417 1495 1399 1399 1476 1399 1399 1476 1417 1417 1495 1418 1418 1496 1399 1399 1476 1418 1418 1496 1400 1400 1477 1400 1400 1477 1418 1418 1496 1419 1419 1497 1400 1400 1477 1419 1419 1497 1401 1401 1478 1401 1401 1478 1419 1419 1497 1420 1420 1498 1401 1401 1478 1420 1420 1498 1402 1402 1479 1402 1402 1479 1420 1420 1498 1421 1421 1499 1402 1402 1479 1421 1421 1499 1403 1403 1480 1403 1403 1480 1421 1421 1499 1404 1404 1500 1403 1403 1480 1404 1404 1500 1386 1386 1481 1404 1404 1482 1422 1422 1501 1423 1423 1502 1404 1404 1482 1423 1423 1502 1405 1405 1483 1405 1405 1483 1423 1423 1502 1424 1424 1503 1405 1405 1483 1424 1424 1503 1406 1406 1484 1406 1406 1484 1424 1424 1503 1425 1425 1504 1406 1406 1484 1425 1425 1504 1407 1407 1485 1407 1407 1485 1425 1425 1504 1426 1426 1505 1407 1407 1485 1426 1426 1505 1408 1408 1486 1408 1408 1486 1426 1426 1505 1427 1427 1506 1408 1408 1486 1427 1427 1506 1409 1409 1487 1409 1409 1487 1427 1427 1506 1428 1428 1507 1409 1409 1487 1428 1428 1507 1410 1410 1488 1410 1410 1488 1428 1428 1507 1429 1429 1508 1410 1410 1488 1429 1429 1508 1411 1411 1489 1411 1411 1489 1429 1429 1508 1430 1430 1509 1411 1411 1489 1430 1430 1509 1412 1412 1490 1412 1412 1490 1430 1430 1509 1431 1431 1510 1412 1412 1490 1431 1431 1510 1413 1413 1491 1413 1413 1491 1431 1431 1510 1432 1432 1511 1413 1413 1491 1432 1432 1511 1414 1414 1492 1414 1414 1492 1432 1432 1511 1433 1433 1512 1414 1414 1492 1433 1433 1512 1415 1415 1493 1415 1415 1493 1433 1433 1512 1434 1434 1513 1415 1415 1493 1434 1434 1513 1416 1416 1494 1416 1416 1494 1434 1434 1513 1435 1435 1514 1416 1416 1494 1435 1435 1514 1417 1417 1495 1417 1417 1495 1435 1435 1514 1436 1436 1515 1417 1417 1495 1436 1436 1515 1418 1418 1496 1418 1418 1496 1436 1436 1515 1437 1437 1516 1418 1418 1496 1437 1437 1516 1419 1419 1497 1419 1419 1497 1437 1437 1516 1438 1438 1517 1419 1419 1497 1438 1438 1517 1420 1420 1498 1420 1420 1498 1438 1438 1517 1439 1439 1518 1420 1420 1498 1439 1439 1518 1421 1421 1499 1421 1421 1499 1439 1439 1518 1422 1422 1519 1421 1421 1499 1422 1422 1519 1404 1404 1500 1422 1422 1501 1440 1440 1520 1441 1441 1521 1422 1422 1501 1441 1441 1521 1423 1423 1502 1423 1423 1502 1441 1441 1521 1442 1442 1522 1423 1423 1502 1442 1442 1522 1424 1424 1503 1424 1424 1503 1442 1442 1522 1443 1443 1523 1424 1424 1503 1443 1443 1523 1425 1425 1504 1425 1425 1504 1443 1443 1523 1444 1444 1524 1425 1425 1504 1444 1444 1524 1426 1426 1505 1426 1426 1505 1444 1444 1524 1445 1445 1525 1426 1426 1505 1445 1445 1525 1427 1427 1506 1427 1427 1506 1445 1445 1525 1446 1446 1526 1427 1427 1506 1446 1446 1526 1428 1428 1507 1428 1428 1507 1446 1446 1526 1447 1447 1527 1428 1428 1507 1447 1447 1527 1429 1429 1508 1429 1429 1508 1447 1447 1527 1448 1448 1528 1429 1429 1508 1448 1448 1528 1430 1430 1509 1430 1430 1509 1448 1448 1528 1449 1449 1529 1430 1430 1509 1449 1449 1529 1431 1431 1510 1431 1431 1510 1449 1449 1529 1450 1450 1530 1431 1431 1510 1450 1450 1530 1432 1432 1511 1432 1432 1511 1450 1450 1530 1451 1451 1531 1432 1432 1511 1451 1451 1531 1433 1433 1512 1433 1433 1512 1451 1451 1531 1452 1452 1532 1433 1433 1512 1452 1452 1532 1434 1434 1513 1434 1434 1513 1452 1452 1532 1453 1453 1533 1434 1434 1513 1453 1453 1533 1435 1435 1514 1435 1435 1514 1453 1453 1533 1454 1454 1534 1435 1435 1514 1454 1454 1534 1436 1436 1515 1436 1436 1515 1454 1454 1534 1455 1455 1535 1436 1436 1515 1455 1455 1535 1437 1437 1516 1437 1437 1516 1455 1455 1535 1456 1456 1536 1437 1437 1516 1456 1456 1536 1438 1438 1517 1438 1438 1517 1456 1456 1536 1457 1457 1537 1438 1438 1517 1457 1457 1537 1439 1439 1518 1439 1439 1518 1457 1457 1537 1440 1440 1538 1439 1439 1518 1440 1440 1538 1422 1422 1519 1440 1440 1520 1458 1458 1539 1459 1459 1540 1440 1440 1520 1459 1459 1540 1441 1441 1521 1441 1441 1521 1459 1459 1540 1460 1460 1541 1441 1441 1521 1460 1460 1541 1442 1442 1522 1442 1442 1522 1460 1460 1541 1461 1461 1542 1442 1442 1522 1461 1461 1542 1443 1443 1523 1443 1443 1523 1461 1461 1542 1462 1462 1543 1443 1443 1523 1462 1462 1543 1444 1444 1524 1444 1444 1524 1462 1462 1543 1463 1463 1544 1444 1444 1524 1463 1463 1544 1445 1445 1525 1445 1445 1525 1463 1463 1544 1464 1464 1545 1445 1445 1525 1464 1464 1545 1446 1446 1526 1446 1446 1526 1464 1464 1545 1465 1465 1546 1446 1446 1526 1465 1465 1546 1447 1447 1527 1447 1447 1527 1465 1465 1546 1466 1466 1547 1447 1447 1527 1466 1466 1547 1448 1448 1528 1448 1448 1528 1466 1466 1547 1467 1467 1548 1448 1448 1528 1467 1467 1548 1449 1449 1529 1449 1449 1529 1467 1467 1548 1468 1468 1549 1449 1449 1529 1468 1468 1549 1450 1450 1530 1450 1450 1530 1468 1468 1549 1469 1469 1550 1450 1450 1530 1469 1469 1550 1451 1451 1531 1451 1451 1531 1469 1469 1550 1470 1470 1551 1451 1451 1531 1470 1470 1551 1452 1452 1532 1452 1452 1532 1470 1470 1551 1471 1471 1552 1452 1452 1532 1471 1471 1552 1453 1453 1533 1453 1453 1533 1471 1471 1552 1472 1472 1553 1453 1453 1533 1472 1472 1553 1454 1454 1534 1454 1454 1534 1472 1472 1553 1473 1473 1554 1454 1454 1534 1473 1473 1554 1455 1455 1535 1455 1455 1535 1473 1473 1554 1474 1474 1555 1455 1455 1535 1474 1474 1555 1456 1456 1536 1456 1456 1536 1474 1474 1555 1475 1475 1556 1456 1456 1536 1475 1475 1556 1457 1457 1537 1457 1457 1537 1475 1475 1556 1458 1458 1557 1457 1457 1537 1458 1458 1557 1440 1440 1538 1458 1458 1539 1476 1476 1558 1477 1477 1559 1458 1458 1539 1477 1477 1559 1459 1459 1540 1459 1459 1540 1477 1477 1559 1478 1478 1560 1459 1459 1540 1478 1478 1560 1460 1460 1541 1460 1460 1541 1478 1478 1560 1479 1479 1561 1460 1460 1541 1479 1479 1561 1461 1461 1542 1461 1461 1542 1479 1479 1561 1480 1480 1562 1461 1461 1542 1480 1480 1562 1462 1462 1543 1462 1462 1543 1480 1480 1562 1481 1481 1563 1462 1462 1543 1481 1481 1563 1463 1463 1544 1463 1463 1544 1481 1481 1563 1482 1482 1564 1463 1463 1544 1482 1482 1564 1464 1464 1545 1464 1464 1545 1482 1482 1564 1483 1483 1565 1464 1464 1545 1483 1483 1565 1465 1465 1546 1465 1465 1546 1483 1483 1565 1484 1484 1566 1465 1465 1546 1484 1484 1566 1466 1466 1547 1466 1466 1547 1484 1484 1566 1485 1485 1567 1466 1466 1547 1485 1485 1567 1467 1467 1548 1467 1467 1548 1485 1485 1567 1486 1486 1568 1467 1467 1548 1486 1486 1568 1468 1468 1549 1468 1468 1549 1486 1486 1568 1487 1487 1569 1468 1468 1549 1487 1487 1569 1469 1469 1550 1469 1469 1550 1487 1487 1569 1488 1488 1570 1469 1469 1550 1488 1488 1570 1470 1470 1551 1470 1470 1551 1488 1488 1570 1489 1489 1571 1470 1470 1551 1489 1489 1571 1471 1471 1552 1471 1471 1552 1489 1489 1571 1490 1490 1572 1471 1471 1552 1490 1490 1572 1472 1472 1553 1472 1472 1553 1490 1490 1572 1491 1491 1573 1472 1472 1553 1491 1491 1573 1473 1473 1554 1473 1473 1554 1491 1491 1573 1492 1492 1574 1473 1473 1554 1492 1492 1574 1474 1474 1555 1474 1474 1555 1492 1492 1574 1493 1493 1575 1474 1474 1555 1493 1493 1575 1475 1475 1556 1475 1475 1556 1493 1493 1575 1476 1476 1576 1475 1475 1556 1476 1476 1576 1458 1458 1557 1476 1476 1558 1494 1494 1577 1495 1495 1578 1476 1476 1558 1495 1495 1578 1477 1477 1559 1477 1477 1559 1495 1495 1578 1496 1496 1579 1477 1477 1559 1496 1496 1579 1478 1478 1560 1478 1478 1560 1496 1496 1579 1497 1497 1580 1478 1478 1560 1497 1497 1580 1479 1479 1561 1479 1479 1561 1497 1497 1580 1498 1498 1581 1479 1479 1561 1498 1498 1581 1480 1480 1562 1480 1480 1562 1498 1498 1581 1499 1499 1582 1480 1480 1562 1499 1499 1582 1481 1481 1563 1481 1481 1563 1499 1499 1582 1500 1500 1583 1481 1481 1563 1500 1500 1583 1482 1482 1564 1482 1482 1564 1500 1500 1583 1501 1501 1584 1482 1482 1564 1501 1501 1584 1483 1483 1565 1483 1483 1565 1501 1501 1584 1502 1502 1585 1483 1483 1565 1502 1502 1585 1484 1484 1566 1484 1484 1566 1502 1502 1585 1503 1503 1586 1484 1484 1566 1503 1503 1586 1485 1485 1567 1485 1485 1567 1503 1503 1586 1504 1504 1587 1485 1485 1567 1504 1504 1587 1486 1486 1568 1486 1486 1568 1504 1504 1587 1505 1505 1588 1486 1486 1568 1505 1505 1588 1487 1487 1569 1487 1487 1569 1505 1505 1588 1506 1506 1589 1487 1487 1569 1506 1506 1589 1488 1488 1570 1488 1488 1570 1506 1506 1589 1507 1507 1590 1488 1488 1570 1507 1507 1590 1489 1489 1571 1489 1489 1571 1507 1507 1590 1508 1508 1591 1489 1489 1571 1508 1508 1591 1490 1490 1572 1490 1490 1572 1508 1508 1591 1509 1509 1592 1490 1490 1572 1509 1509 1592 1491 1491 1573 1491 1491 1573 1509 1509 1592 1510 1510 1593 1491 1491 1573 1510 1510 1593 1492 1492 1574 1492 1492 1574 1510 1510 1593 1511 1511 1594 1492 1492 1574 1511 1511 1594 1493 1493 1575 1493 1493 1575 1511 1511 1594 1494 1494 1595 1493 1493 1575 1494 1494 1595 1476 1476 1576 1494 1494 1577 1512 1512 1596 1513 1513 1597 1494 1494 1577 1513 1513 1597 1495 1495 1578 1495 1495 1578 1513 1513 1597 1514 1514 1598 1495 1495 1578 1514 1514 1598 1496 1496 1579 1496 1496 1579 1514 1514 1598 1515 1515 1599 1496 1496 1579 1515 1515 1599 1497 1497 1580 1497 1497 1580 1515 1515 1599 1516 1516 1600 1497 1497 1580 1516 1516 1600 1498 1498 1581 1498 1498 1581 1516 1516 1600 1517 1517 1601 1498 1498 1581 1517 1517 1601 1499 1499 1582 1499 1499 1582 1517 1517 1601 1518 1518 1602 1499 1499 1582 1518 1518 1602 1500 1500 1583 1500 1500 1583 1518 1518 1602 1519 1519 1603 1500 1500 1583 1519 1519 1603 1501 1501 1584 1501 1501 1584 1519 1519 1603 1520 1520 1604 1501 1501 1584 1520 1520 1604 1502 1502 1585 1502 1502 1585 1520 1520 1604 1521 1521 1605 1502 1502 1585 1521 1521 1605 1503 1503 1586 1503 1503 1586 1521 1521 1605 1522 1522 1606 1503 1503 1586 1522 1522 1606 1504 1504 1587 1504 1504 1587 1522 1522 1606 1523 1523 1607 1504 1504 1587 1523 1523 1607 1505 1505 1588 1505 1505 1588 1523 1523 1607 1524 1524 1608 1505 1505 1588 1524 1524 1608 1506 1506 1589 1506 1506 1589 1524 1524 1608 1525 1525 1609 1506 1506 1589 1525 1525 1609 1507 1507 1590 1507 1507 1590 1525 1525 1609 1526 1526 1610 1507 1507 1590 1526 1526 1610 1508 1508 1591 1508 1508 1591 1526 1526 1610 1527 1527 1611 1508 1508 1591 1527 1527 1611 1509 1509 1592 1509 1509 1592 1527 1527 1611 1528 1528 1612 1509 1509 1592 1528 1528 1612 1510 1510 1593 1510 1510 1593 1528 1528 1612 1529 1529 1613 1510 1510 1593 1529 1529 1613 1511 1511 1594 1511 1511 1594 1529 1529 1613 1512 1512 1614 1511 1511 1594 1512 1512 1614 1494 1494 1595 1512 1512 1596 1530 1530 1615 1531 1531 1616 1512 1512 1596 1531 1531 1616 1513 1513 1597 1513 1513 1597 1531 1531 1616 1532 1532 1617 1513 1513 1597 1532 1532 1617 1514 1514 1598 1514 1514 1598 1532 1532 1617 1533 1533 1618 1514 1514 1598 1533 1533 1618 1515 1515 1599 1515 1515 1599 1533 1533 1618 1534 1534 1619 1515 1515 1599 1534 1534 1619 1516 1516 1600 1516 1516 1600 1534 1534 1619 1535 1535 1620 1516 1516 1600 1535 1535 1620 1517 1517 1601 1517 1517 1601 1535 1535 1620 1536 1536 1621 1517 1517 1601 1536 1536 1621 1518 1518 1602 1518 1518 1602 1536 1536 1621 1537 1537 1622 1518 1518 1602 1537 1537 1622 1519 1519 1603 1519 1519 1603 1537 1537 1622 1538 1538 1623 1519 1519 1603 1538 1538 1623 1520 1520 1604 1520 1520 1604 1538 1538 1623 1539 1539 1624 1520 1520 1604 1539 1539 1624 1521 1521 1605 1521 1521 1605 1539 1539 1624 1540 1540 1625 1521 1521 1605 1540 1540 1625 1522 1522 1606 1522 1522 1606 1540 1540 1625 1541 1541 1626 1522 1522 1606 1541 1541 1626 1523 1523 1607 1523 1523 1607 1541 1541 1626 1542 1542 1627 1523 1523 1607 1542 1542 1627 1524 1524 1608 1524 1524 1608 1542 1542 1627 1543 1543 1628 1524 1524 1608 1543 1543 1628 1525 1525 1609 1525 1525 1609 1543 1543 1628 1544 1544 1629 1525 1525 1609 1544 1544 1629 1526 1526 1610 1526 1526 1610 1544 1544 1629 1545 1545 1630 1526 1526 1610 1545 1545 1630 1527 1527 1611 1527 1527 1611 1545 1545 1630 1546 1546 1631 1527 1527 1611 1546 1546 1631 1528 1528 1612 1528 1528 1612 1546 1546 1631 1547 1547 1632 1528 1528 1612 1547 1547 1632 1529 1529 1613 1529 1529 1613 1547 1547 1632 1530 1530 1633 1529 1529 1613 1530 1530 1633 1512 1512 1614 1530 1530 1615 1548 1548 1634 1549 1549 1635 1530 1530 1615 1549 1549 1635 1531 1531 1616 1531 1531 1616 1549 1549 1635 1550 1550 1636 1531 1531 1616 1550 1550 1636 1532 1532 1617 1532 1532 1617 1550 1550 1636 1551 1551 1637 1532 1532 1617 1551 1551 1637 1533 1533 1618 1533 1533 1618 1551 1551 1637 1552 1552 1638 1533 1533 1618 1552 1552 1638 1534 1534 1619 1534 1534 1619 1552 1552 1638 1553 1553 1639 1534 1534 1619 1553 1553 1639 1535 1535 1620 1535 1535 1620 1553 1553 1639 1554 1554 1640 1535 1535 1620 1554 1554 1640 1536 1536 1621 1536 1536 1621 1554 1554 1640 1555 1555 1641 1536 1536 1621 1555 1555 1641 1537 1537 1622 1537 1537 1622 1555 1555 1641 1556 1556 1642 1537 1537 1622 1556 1556 1642 1538 1538 1623 1538 1538 1623 1556 1556 1642 1557 1557 1643 1538 1538 1623 1557 1557 1643 1539 1539 1624 1539 1539 1624 1557 1557 1643 1558 1558 1644 1539 1539 1624 1558 1558 1644 1540 1540 1625 1540 1540 1625 1558 1558 1644 1559 1559 1645 1540 1540 1625 1559 1559 1645 1541 1541 1626 1541 1541 1626 1559 1559 1645 1560 1560 1646 1541 1541 1626 1560 1560 1646 1542 1542 1627 1542 1542 1627 1560 1560 1646 1561 1561 1647 1542 1542 1627 1561 1561 1647 1543 1543 1628 1543 1543 1628 1561 1561 1647 1562 1562 1648 1543 1543 1628 1562 1562 1648 1544 1544 1629 1544 1544 1629 1562 1562 1648 1563 1563 1649 1544 1544 1629 1563 1563 1649 1545 1545 1630 1545 1545 1630 1563 1563 1649 1564 1564 1650 1545 1545 1630 1564 1564 1650 1546 1546 1631 1546 1546 1631 1564 1564 1650 1565 1565 1651 1546 1546 1631 1565 1565 1651 1547 1547 1632 1547 1547 1632 1565 1565 1651 1548 1548 1652 1547 1547 1632 1548 1548 1652 1530 1530 1633 1548 1548 1634 1566 1566 1653 1567 1567 1654 1548 1548 1634 1567 1567 1654 1549 1549 1635 1549 1549 1635 1567 1567 1654 1568 1568 1655 1549 1549 1635 1568 1568 1655 1550 1550 1636 1550 1550 1636 1568 1568 1655 1569 1569 1656 1550 1550 1636 1569 1569 1656 1551 1551 1637 1551 1551 1637 1569 1569 1656 1570 1570 1657 1551 1551 1637 1570 1570 1657 1552 1552 1638 1552 1552 1638 1570 1570 1657 1571 1571 1658 1552 1552 1638 1571 1571 1658 1553 1553 1639 1553 1553 1639 1571 1571 1658 1572 1572 1659 1553 1553 1639 1572 1572 1659 1554 1554 1640 1554 1554 1640 1572 1572 1659 1573 1573 1660 1554 1554 1640 1573 1573 1660 1555 1555 1641 1555 1555 1641 1573 1573 1660 1574 1574 1661 1555 1555 1641 1574 1574 1661 1556 1556 1642 1556 1556 1642 1574 1574 1661 1575 1575 1662 1556 1556 1642 1575 1575 1662 1557 1557 1643 1557 1557 1643 1575 1575 1662 1576 1576 1663 1557 1557 1643 1576 1576 1663 1558 1558 1644 1558 1558 1644 1576 1576 1663 1577 1577 1664 1558 1558 1644 1577 1577 1664 1559 1559 1645 1559 1559 1645 1577 1577 1664 1578 1578 1665 1559 1559 1645 1578 1578 1665 1560 1560 1646 1560 1560 1646 1578 1578 1665 1579 1579 1666 1560 1560 1646 1579 1579 1666 1561 1561 1647 1561 1561 1647 1579 1579 1666 1580 1580 1667 1561 1561 1647 1580 1580 1667 1562 1562 1648 1562 1562 1648 1580 1580 1667 1581 1581 1668 1562 1562 1648 1581 1581 1668 1563 1563 1649 1563 1563 1649 1581 1581 1668 1582 1582 1669 1563 1563 1649 1582 1582 1669 1564 1564 1650 1564 1564 1650 1582 1582 1669 1583 1583 1670 1564 1564 1650 1583 1583 1670 1565 1565 1651 1565 1565 1651 1583 1583 1670 1566 1566 1671 1565 1565 1651 1566 1566 1671 1548 1548 1652 1566 1566 1653 1584 1584 1672 1585 1585 1673 1566 1566 1653 1585 1585 1673 1567 1567 1654 1567 1567 1654 1585 1585 1673 1586 1586 1674 1567 1567 1654 1586 1586 1674 1568 1568 1655 1568 1568 1655 1586 1586 1674 1587 1587 1675 1568 1568 1655 1587 1587 1675 1569 1569 1656 1569 1569 1656 1587 1587 1675 1588 1588 1676 1569 1569 1656 1588 1588 1676 1570 1570 1657 1570 1570 1657 1588 1588 1676 1589 1589 1677 1570 1570 1657 1589 1589 1677 1571 1571 1658 1571 1571 1658 1589 1589 1677 1590 1590 1678 1571 1571 1658 1590 1590 1678 1572 1572 1659 1572 1572 1659 1590 1590 1678 1591 1591 1679 1572 1572 1659 1591 1591 1679 1573 1573 1660 1573 1573 1660 1591 1591 1679 1592 1592 1680 1573 1573 1660 1592 1592 1680 1574 1574 1661 1574 1574 1661 1592 1592 1680 1593 1593 1681 1574 1574 1661 1593 1593 1681 1575 1575 1662 1575 1575 1662 1593 1593 1681 1594 1594 1682 1575 1575 1662 1594 1594 1682 1576 1576 1663 1576 1576 1663 1594 1594 1682 1595 1595 1683 1576 1576 1663 1595 1595 1683 1577 1577 1664 1577 1577 1664 1595 1595 1683 1596 1596 1684 1577 1577 1664 1596 1596 1684 1578 1578 1665 1578 1578 1665 1596 1596 1684 1597 1597 1685 1578 1578 1665 1597 1597 1685 1579 1579 1666 1579 1579 1666 1597 1597 1685 1598 1598 1686 1579 1579 1666 1598 1598 1686 1580 1580 1667 1580 1580 1667 1598 1598 1686 1599 1599 1687 1580 1580 1667 1599 1599 1687 1581 1581 1668 1581 1581 1668 1599 1599 1687 1600 1600 1688 1581 1581 1668 1600 1600 1688 1582 1582 1669 1582 1582 1669 1600 1600 1688 1601 1601 1689 1582 1582 1669 1601 1601 1689 1583 1583 1670 1583 1583 1670 1601 1601 1689 1584 1584 1690 1583 1583 1670 1584 1584 1690 1566 1566 1671 1584 1584 1672 1602 1602 1691 1603 1603 1692 1584 1584 1672 1603 1603 1692 1585 1585 1673 1585 1585 1673 1603 1603 1692 1604 1604 1693 1585 1585 1673 1604 1604 1693 1586 1586 1674 1586 1586 1674 1604 1604 1693 1605 1605 1694 1586 1586 1674 1605 1605 1694 1587 1587 1675 1587 1587 1675 1605 1605 1694 1606 1606 1695 1587 1587 1675 1606 1606 1695 1588 1588 1676 1588 1588 1676 1606 1606 1695 1607 1607 1696 1588 1588 1676 1607 1607 1696 1589 1589 1677 1589 1589 1677 1607 1607 1696 1608 1608 1697 1589 1589 1677 1608 1608 1697 1590 1590 1678 1590 1590 1678 1608 1608 1697 1609 1609 1698 1590 1590 1678 1609 1609 1698 1591 1591 1679 1591 1591 1679 1609 1609 1698 1610 1610 1699 1591 1591 1679 1610 1610 1699 1592 1592 1680 1592 1592 1680 1610 1610 1699 1611 1611 1700 1592 1592 1680 1611 1611 1700 1593 1593 1681 1593 1593 1681 1611 1611 1700 1612 1612 1701 1593 1593 1681 1612 1612 1701 1594 1594 1682 1594 1594 1682 1612 1612 1701 1613 1613 1702 1594 1594 1682 1613 1613 1702 1595 1595 1683 1595 1595 1683 1613 1613 1702 1614 1614 1703 1595 1595 1683 1614 1614 1703 1596 1596 1684 1596 1596 1684 1614 1614 1703 1615 1615 1704 1596 1596 1684 1615 1615 1704 1597 1597 1685 1597 1597 1685 1615 1615 1704 1616 1616 1705 1597 1597 1685 1616 1616 1705 1598 1598 1686 1598 1598 1686 1616 1616 1705 1617 1617 1706 1598 1598 1686 1617 1617 1706 1599 1599 1687 1599 1599 1687 1617 1617 1706 1618 1618 1707 1599 1599 1687 1618 1618 1707 1600 1600 1688 1600 1600 1688 1618 1618 1707 1619 1619 1708 1600 1600 1688 1619 1619 1708 1601 1601 1689 1601 1601 1689 1619 1619 1708 1602 1602 1709 1601 1601 1689 1602 1602 1709 1584 1584 1690 1602 1602 1691 1620 1620 1710 1621 1621 1711 1602 1602 1691 1621 1621 1711 1603 1603 1692 1603 1603 1692 1621 1621 1711 1622 1622 1712 1603 1603 1692 1622 1622 1712 1604 1604 1693 1604 1604 1693 1622 1622 1712 1623 1623 1713 1604 1604 1693 1623 1623 1713 1605 1605 1694 1605 1605 1694 1623 1623 1713 1624 1624 1714 1605 1605 1694 1624 1624 1714 1606 1606 1695 1606 1606 1695 1624 1624 1714 1625 1625 1715 1606 1606 1695 1625 1625 1715 1607 1607 1696 1607 1607 1696 1625 1625 1715 1626 1626 1716 1607 1607 1696 1626 1626 1716 1608 1608 1697 1608 1608 1697 1626 1626 1716 1627 1627 1717 1608 1608 1697 1627 1627 1717 1609 1609 1698 1609 1609 1698 1627 1627 1717 1628 1628 1718 1609 1609 1698 1628 1628 1718 1610 1610 1699 1610 1610 1699 1628 1628 1718 1629 1629 1719 1610 1610 1699 1629 1629 1719 1611 1611 1700 1611 1611 1700 1629 1629 1719 1630 1630 1720 1611 1611 1700 1630 1630 1720 1612 1612 1701 1612 1612 1701 1630 1630 1720 1631 1631 1721 1612 1612 1701 1631 1631 1721 1613 1613 1702 1613 1613 1702 1631 1631 1721 1632 1632 1722 1613 1613 1702 1632 1632 1722 1614 1614 1703 1614 1614 1703 1632 1632 1722 1633 1633 1723 1614 1614 1703 1633 1633 1723 1615 1615 1704 1615 1615 1704 1633 1633 1723 1634 1634 1724 1615 1615 1704 1634 1634 1724 1616 1616 1705 1616 1616 1705 1634 1634 1724 1635 1635 1725 1616 1616 1705 1635 1635 1725 1617 1617 1706 1617 1617 1706 1635 1635 1725 1636 1636 1726 1617 1617 1706 1636 1636 1726 1618 1618 1707 1618 1618 1707 1636 1636 1726 1637 1637 1727 1618 1618 1707 1637 1637 1727 1619 1619 1708 1619 1619 1708 1637 1637 1727 1620 1620 1728 1619 1619 1708 1620 1620 1728 1602 1602 1709 1620 1620 1710 1638 1638 1729 1639 1639 1730 1620 1620 1710 1639 1639 1730 1621 1621 1711 1621 1621 1711 1639 1639 1730 1640 1640 1731 1621 1621 1711 1640 1640 1731 1622 1622 1712 1622 1622 1712 1640 1640 1731 1641 1641 1732 1622 1622 1712 1641 1641 1732 1623 1623 1713 1623 1623 1713 1641 1641 1732 1642 1642 1733 1623 1623 1713 1642 1642 1733 1624 1624 1714 1624 1624 1714 1642 1642 1733 1643 1643 1734 1624 1624 1714 1643 1643 1734 1625 1625 1715 1625 1625 1715 1643 1643 1734 1644 1644 1735 1625 1625 1715 1644 1644 1735 1626 1626 1716 1626 1626 1716 1644 1644 1735 1645 1645 1736 1626 1626 1716 1645 1645 1736 1627 1627 1717 1627 1627 1717 1645 1645 1736 1646 1646 1737 1627 1627 1717 1646 1646 1737 1628 1628 1718 1628 1628 1718 1646 1646 1737 1647 1647 1738 1628 1628 1718 1647 1647 1738 1629 1629 1719 1629 1629 1719 1647 1647 1738 1648 1648 1739 1629 1629 1719 1648 1648 1739 1630 1630 1720 1630 1630 1720 1648 1648 1739 1649 1649 1740 1630 1630 1720 1649 1649 1740 1631 1631 1721 1631 1631 1721 1649 1649 1740 1650 1650 1741 1631 1631 1721 1650 1650 1741 1632 1632 1722 1632 1632 1722 1650 1650 1741 1651 1651 1742 1632 1632 1722 1651 1651 1742 1633 1633 1723 1633 1633 1723 1651 1651 1742 1652 1652 1743 1633 1633 1723 1652 1652 1743 1634 1634 1724 1634 1634 1724 1652 1652 1743 1653 1653 1744 1634 1634 1724 1653 1653 1744 1635 1635 1725 1635 1635 1725 1653 1653 1744 1654 1654 1745 1635 1635 1725 1654 1654 1745 1636 1636 1726 1636 1636 1726 1654 1654 1745 1655 1655 1746 1636 1636 1726 1655 1655 1746 1637 1637 1727 1637 1637 1727 1655 1655 1746 1638 1638 1747 1637 1637 1727 1638 1638 1747 1620 1620 1728 1638 1638 1729 1656 1656 1748 1657 1657 1749 1638 1638 1729 1657 1657 1749 1639 1639 1730 1639 1639 1730 1657 1657 1749 1658 1658 1750 1639 1639 1730 1658 1658 1750 1640 1640 1731 1640 1640 1731 1658 1658 1750 1659 1659 1751 1640 1640 1731 1659 1659 1751 1641 1641 1732 1641 1641 1732 1659 1659 1751 1660 1660 1752 1641 1641 1732 1660 1660 1752 1642 1642 1733 1642 1642 1733 1660 1660 1752 1661 1661 1753 1642 1642 1733 1661 1661 1753 1643 1643 1734 1643 1643 1734 1661 1661 1753 1662 1662 1754 1643 1643 1734 1662 1662 1754 1644 1644 1735 1644 1644 1735 1662 1662 1754 1663 1663 1755 1644 1644 1735 1663 1663 1755 1645 1645 1736 1645 1645 1736 1663 1663 1755 1664 1664 1756 1645 1645 1736 1664 1664 1756 1646 1646 1737 1646 1646 1737 1664 1664 1756 1665 1665 1757 1646 1646 1737 1665 1665 1757 1647 1647 1738 1647 1647 1738 1665 1665 1757 1666 1666 1758 1647 1647 1738 1666 1666 1758 1648 1648 1739 1648 1648 1739 1666 1666 1758 1667 1667 1759 1648 1648 1739 1667 1667 1759 1649 1649 1740 1649 1649 1740 1667 1667 1759 1668 1668 1760 1649 1649 1740 1668 1668 1760 1650 1650 1741 1650 1650 1741 1668 1668 1760 1669 1669 1761 1650 1650 1741 1669 1669 1761 1651 1651 1742 1651 1651 1742 1669 1669 1761 1670 1670 1762 1651 1651 1742 1670 1670 1762 1652 1652 1743 1652 1652 1743 1670 1670 1762 1671 1671 1763 1652 1652 1743 1671 1671 1763 1653 1653 1744 1653 1653 1744 1671 1671 1763 1672 1672 1764 1653 1653 1744 1672 1672 1764 1654 1654 1745 1654 1654 1745 1672 1672 1764 1673 1673 1765 1654 1654 1745 1673 1673 1765 1655 1655 1746 1655 1655 1746 1673 1673 1765 1656 1656 1766 1655 1655 1746 1656 1656 1766 1638 1638 1747 1656 1656 1748 1674 1674 1767 1675 1675 1768 1656 1656 1748 1675 1675 1768 1657 1657 1749 1657 1657 1749 1675 1675 1768 1676 1676 1769 1657 1657 1749 1676 1676 1769 1658 1658 1750 1658 1658 1750 1676 1676 1769 1677 1677 1770 1658 1658 1750 1677 1677 1770 1659 1659 1751 1659 1659 1751 1677 1677 1770 1678 1678 1771 1659 1659 1751 1678 1678 1771 1660 1660 1752 1660 1660 1752 1678 1678 1771 1679 1679 1772 1660 1660 1752 1679 1679 1772 1661 1661 1753 1661 1661 1753 1679 1679 1772 1680 1680 1773 1661 1661 1753 1680 1680 1773 1662 1662 1754 1662 1662 1754 1680 1680 1773 1681 1681 1774 1662 1662 1754 1681 1681 1774 1663 1663 1755 1663 1663 1755 1681 1681 1774 1682 1682 1775 1663 1663 1755 1682 1682 1775 1664 1664 1756 1664 1664 1756 1682 1682 1775 1683 1683 1776 1664 1664 1756 1683 1683 1776 1665 1665 1757 1665 1665 1757 1683 1683 1776 1684 1684 1777 1665 1665 1757 1684 1684 1777 1666 1666 1758 1666 1666 1758 1684 1684 1777 1685 1685 1778 1666 1666 1758 1685 1685 1778 1667 1667 1759 1667 1667 1759 1685 1685 1778 1686 1686 1779 1667 1667 1759 1686 1686 1779 1668 1668 1760 1668 1668 1760 1686 1686 1779 1687 1687 1780 1668 1668 1760 1687 1687 1780 1669 1669 1761 1669 1669 1761 1687 1687 1780 1688 1688 1781 1669 1669 1761 1688 1688 1781 1670 1670 1762 1670 1670 1762 1688 1688 1781 1689 1689 1782 1670 1670 1762 1689 1689 1782 1671 1671 1763 1671 1671 1763 1689 1689 1782 1690 1690 1783 1671 1671 1763 1690 1690 1783 1672 1672 1764 1672 1672 1764 1690 1690 1783 1691 1691 1784 1672 1672 1764 1691 1691 1784 1673 1673 1765 1673 1673 1765 1691 1691 1784 1674 1674 1785 1673 1673 1765 1674 1674 1785 1656 1656 1766 1674 1674 1767 1692 1692 1786 1693 1693 1787 1674 1674 1767 1693 1693 1787 1675 1675 1768 1675 1675 1768 1693 1693 1787 1694 1694 1788 1675 1675 1768 1694 1694 1788 1676 1676 1769 1676 1676 1769 1694 1694 1788 1695 1695 1789 1676 1676 1769 1695 1695 1789 1677 1677 1770 1677 1677 1770 1695 1695 1789 1696 1696 1790 1677 1677 1770 1696 1696 1790 1678 1678 1771 1678 1678 1771 1696 1696 1790 1697 1697 1791 1678 1678 1771 1697 1697 1791 1679 1679 1772 1679 1679 1772 1697 1697 1791 1698 1698 1792 1679 1679 1772 1698 1698 1792 1680 1680 1773 1680 1680 1773 1698 1698 1792 1699 1699 1793 1680 1680 1773 1699 1699 1793 1681 1681 1774 1681 1681 1774 1699 1699 1793 1700 1700 1794 1681 1681 1774 1700 1700 1794 1682 1682 1775 1682 1682 1775 1700 1700 1794 1701 1701 1795 1682 1682 1775 1701 1701 1795 1683 1683 1776 1683 1683 1776 1701 1701 1795 1702 1702 1796 1683 1683 1776 1702 1702 1796 1684 1684 1777 1684 1684 1777 1702 1702 1796 1703 1703 1797 1684 1684 1777 1703 1703 1797 1685 1685 1778 1685 1685 1778 1703 1703 1797 1704 1704 1798 1685 1685 1778 1704 1704 1798 1686 1686 1779 1686 1686 1779 1704 1704 1798 1705 1705 1799 1686 1686 1779 1705 1705 1799 1687 1687 1780 1687 1687 1780 1705 1705 1799 1706 1706 1800 1687 1687 1780 1706 1706 1800 1688 1688 1781 1688 1688 1781 1706 1706 1800 1707 1707 1801 1688 1688 1781 1707 1707 1801 1689 1689 1782 1689 1689 1782 1707 1707 1801 1708 1708 1802 1689 1689 1782 1708 1708 1802 1690 1690 1783 1690 1690 1783 1708 1708 1802 1709 1709 1803 1690 1690 1783 1709 1709 1803 1691 1691 1784 1691 1691 1784 1709 1709 1803 1692 1692 1804 1691 1691 1784 1692 1692 1804 1674 1674 1785 1692 1692 1786 1710 1710 1805 1711 1711 1806 1692 1692 1786 1711 1711 1806 1693 1693 1787 1693 1693 1787 1711 1711 1806 1712 1712 1807 1693 1693 1787 1712 1712 1807 1694 1694 1788 1694 1694 1788 1712 1712 1807 1713 1713 1808 1694 1694 1788 1713 1713 1808 1695 1695 1789 1695 1695 1789 1713 1713 1808 1714 1714 1809 1695 1695 1789 1714 1714 1809 1696 1696 1790 1696 1696 1790 1714 1714 1809 1715 1715 1810 1696 1696 1790 1715 1715 1810 1697 1697 1791 1697 1697 1791 1715 1715 1810 1716 1716 1811 1697 1697 1791 1716 1716 1811 1698 1698 1792 1698 1698 1792 1716 1716 1811 1717 1717 1812 1698 1698 1792 1717 1717 1812 1699 1699 1793 1699 1699 1793 1717 1717 1812 1718 1718 1813 1699 1699 1793 1718 1718 1813 1700 1700 1794 1700 1700 1794 1718 1718 1813 1719 1719 1814 1700 1700 1794 1719 1719 1814 1701 1701 1795 1701 1701 1795 1719 1719 1814 1720 1720 1815 1701 1701 1795 1720 1720 1815 1702 1702 1796 1702 1702 1796 1720 1720 1815 1721 1721 1816 1702 1702 1796 1721 1721 1816 1703 1703 1797 1703 1703 1797 1721 1721 1816 1722 1722 1817 1703 1703 1797 1722 1722 1817 1704 1704 1798 1704 1704 1798 1722 1722 1817 1723 1723 1818 1704 1704 1798 1723 1723 1818 1705 1705 1799 1705 1705 1799 1723 1723 1818 1724 1724 1819 1705 1705 1799 1724 1724 1819 1706 1706 1800 1706 1706 1800 1724 1724 1819 1725 1725 1820 1706 1706 1800 1725 1725 1820 1707 1707 1801 1707 1707 1801 1725 1725 1820 1726 1726 1821 1707 1707 1801 1726 1726 1821 1708 1708 1802 1708 1708 1802 1726 1726 1821 1727 1727 1822 1708 1708 1802 1727 1727 1822 1709 1709 1803 1709 1709 1803 1727 1727 1822 1710 1710 1823 1709 1709 1803 1710 1710 1823 1692 1692 1804 1710 1710 1805 1728 1728 1824 1729 1729 1825 1710 1710 1805 1729 1729 1825 1711 1711 1806 1711 1711 1806 1729 1729 1825 1730 1730 1826 1711 1711 1806 1730 1730 1826 1712 1712 1807 1712 1712 1807 1730 1730 1826 1731 1731 1827 1712 1712 1807 1731 1731 1827 1713 1713 1808 1713 1713 1808 1731 1731 1827 1732 1732 1828 1713 1713 1808 1732 1732 1828 1714 1714 1809 1714 1714 1809 1732 1732 1828 1733 1733 1829 1714 1714 1809 1733 1733 1829 1715 1715 1810 1715 1715 1810 1733 1733 1829 1734 1734 1830 1715 1715 1810 1734 1734 1830 1716 1716 1811 1716 1716 1811 1734 1734 1830 1735 1735 1831 1716 1716 1811 1735 1735 1831 1717 1717 1812 1717 1717 1812 1735 1735 1831 1736 1736 1832 1717 1717 1812 1736 1736 1832 1718 1718 1813 1718 1718 1813 1736 1736 1832 1737 1737 1833 1718 1718 1813 1737 1737 1833 1719 1719 1814 1719 1719 1814 1737 1737 1833 1738 1738 1834 1719 1719 1814 1738 1738 1834 1720 1720 1815 1720 1720 1815 1738 1738 1834 1739 1739 1835 1720 1720 1815 1739 1739 1835 1721 1721 1816 1721 1721 1816 1739 1739 1835 1740 1740 1836 1721 1721 1816 1740 1740 1836 1722 1722 1817 1722 1722 1817 1740 1740 1836 1741 1741 1837 1722 1722 1817 1741 1741 1837 1723 1723 1818 1723 1723 1818 1741 1741 1837 1742 1742 1838 1723 1723 1818 1742 1742 1838 1724 1724 1819 1724 1724 1819 1742 1742 1838 1743 1743 1839 1724 1724 1819 1743 1743 1839 1725 1725 1820 1725 1725 1820 1743 1743 1839 1744 1744 1840 1725 1725 1820 1744 1744 1840 1726 1726 1821 1726 1726 1821 1744 1744 1840 1745 1745 1841 1726 1726 1821 1745 1745 1841 1727 1727 1822 1727 1727 1822 1745 1745 1841 1728 1728 1842 1727 1727 1822 1728 1728 1842 1710 1710 1823 1728 1728 1824 1746 1746 1843 1747 1747 1844 1728 1728 1824 1747 1747 1844 1729 1729 1825 1729 1729 1825 1747 1747 1844 1748 1748 1845 1729 1729 1825 1748 1748 1845 1730 1730 1826 1730 1730 1826 1748 1748 1845 1749 1749 1846 1730 1730 1826 1749 1749 1846 1731 1731 1827 1731 1731 1827 1749 1749 1846 1750 1750 1847 1731 1731 1827 1750 1750 1847 1732 1732 1828 1732 1732 1828 1750 1750 1847 1751 1751 1848 1732 1732 1828 1751 1751 1848 1733 1733 1829 1733 1733 1829 1751 1751 1848 1752 1752 1849 1733 1733 1829 1752 1752 1849 1734 1734 1830 1734 1734 1830 1752 1752 1849 1753 1753 1850 1734 1734 1830 1753 1753 1850 1735 1735 1831 1735 1735 1831 1753 1753 1850 1754 1754 1851 1735 1735 1831 1754 1754 1851 1736 1736 1832 1736 1736 1832 1754 1754 1851 1755 1755 1852 1736 1736 1832 1755 1755 1852 1737 1737 1833 1737 1737 1833 1755 1755 1852 1756 1756 1853 1737 1737 1833 1756 1756 1853 1738 1738 1834 1738 1738 1834 1756 1756 1853 1757 1757 1854 1738 1738 1834 1757 1757 1854 1739 1739 1835 1739 1739 1835 1757 1757 1854 1758 1758 1855 1739 1739 1835 1758 1758 1855 1740 1740 1836 1740 1740 1836 1758 1758 1855 1759 1759 1856 1740 1740 1836 1759 1759 1856 1741 1741 1837 1741 1741 1837 1759 1759 1856 1760 1760 1857 1741 1741 1837 1760 1760 1857 1742 1742 1838 1742 1742 1838 1760 1760 1857 1761 1761 1858 1742 1742 1838 1761 1761 1858 1743 1743 1839 1743 1743 1839 1761 1761 1858 1762 1762 1859 1743 1743 1839 1762 1762 1859 1744 1744 1840 1744 1744 1840 1762 1762 1859 1763 1763 1860 1744 1744 1840 1763 1763 1860 1745 1745 1841 1745 1745 1841 1763 1763 1860 1746 1746 1861 1745 1745 1841 1746 1746 1861 1728 1728 1842 1746 1746 1843 1764 1764 1862 1765 1765 1863 1746 1746 1843 1765 1765 1863 1747 1747 1844 1747 1747 1844 1765 1765 1863 1766 1766 1864 1747 1747 1844 1766 1766 1864 1748 1748 1845 1748 1748 1845 1766 1766 1864 1767 1767 1865 1748 1748 1845 1767 1767 1865 1749 1749 1846 1749 1749 1846 1767 1767 1865 1768 1768 1866 1749 1749 1846 1768 1768 1866 1750 1750 1847 1750 1750 1847 1768 1768 1866 1769 1769 1867 1750 1750 1847 1769 1769 1867 1751 1751 1848 1751 1751 1848 1769 1769 1867 1770 1770 1868 1751 1751 1848 1770 1770 1868 1752 1752 1849 1752 1752 1849 1770 1770 1868 1771 1771 1869 1752 1752 1849 1771 1771 1869 1753 1753 1850 1753 1753 1850 1771 1771 1869 1772 1772 1870 1753 1753 1850 1772 1772 1870 1754 1754 1851 1754 1754 1851 1772 1772 1870 1773 1773 1871 1754 1754 1851 1773 1773 1871 1755 1755 1852 1755 1755 1852 1773 1773 1871 1774 1774 1872 1755 1755 1852 1774 1774 1872 1756 1756 1853 1756 1756 1853 1774 1774 1872 1775 1775 1873 1756 1756 1853 1775 1775 1873 1757 1757 1854 1757 1757 1854 1775 1775 1873 1776 1776 1874 1757 1757 1854 1776 1776 1874 1758 1758 1855 1758 1758 1855 1776 1776 1874 1777 1777 1875 1758 1758 1855 1777 1777 1875 1759 1759 1856 1759 1759 1856 1777 1777 1875 1778 1778 1876 1759 1759 1856 1778 1778 1876 1760 1760 1857 1760 1760 1857 1778 1778 1876 1779 1779 1877 1760 1760 1857 1779 1779 1877 1761 1761 1858 1761 1761 1858 1779 1779 1877 1780 1780 1878 1761 1761 1858 1780 1780 1878 1762 1762 1859 1762 1762 1859 1780 1780 1878 1781 1781 1879 1762 1762 1859 1781 1781 1879 1763 1763 1860 1763 1763 1860 1781 1781 1879 1764 1764 1880 1763 1763 1860 1764 1764 1880 1746 1746 1861 1764 1764 1862 1782 1782 1881 1783 1783 1882 1764 1764 1862 1783 1783 1882 1765 1765 1863 1765 1765 1863 1783 1783 1882 1784 1784 1883 1765 1765 1863 1784 1784 1883 1766 1766 1864 1766 1766 1864 1784 1784 1883 1785 1785 1884 1766 1766 1864 1785 1785 1884 1767 1767 1865 1767 1767 1865 1785 1785 1884 1786 1786 1885 1767 1767 1865 1786 1786 1885 1768 1768 1866 1768 1768 1866 1786 1786 1885 1787 1787 1886 1768 1768 1866 1787 1787 1886 1769 1769 1867 1769 1769 1867 1787 1787 1886 1788 1788 1887 1769 1769 1867 1788 1788 1887 1770 1770 1868 1770 1770 1868 1788 1788 1887 1789 1789 1888 1770 1770 1868 1789 1789 1888 1771 1771 1869 1771 1771 1869 1789 1789 1888 1790 1790 1889 1771 1771 1869 1790 1790 1889 1772 1772 1870 1772 1772 1870 1790 1790 1889 1791 1791 1890 1772 1772 1870 1791 1791 1890 1773 1773 1871 1773 1773 1871 1791 1791 1890 1792 1792 1891 1773 1773 1871 1792 1792 1891 1774 1774 1872 1774 1774 1872 1792 1792 1891 1793 1793 1892 1774 1774 1872 1793 1793 1892 1775 1775 1873 1775 1775 1873 1793 1793 1892 1794 1794 1893 1775 1775 1873 1794 1794 1893 1776 1776 1874 1776 1776 1874 1794 1794 1893 1795 1795 1894 1776 1776 1874 1795 1795 1894 1777 1777 1875 1777 1777 1875 1795 1795 1894 1796 1796 1895 1777 1777 1875 1796 1796 1895 1778 1778 1876 1778 1778 1876 1796 1796 1895 1797 1797 1896 1778 1778 1876 1797 1797 1896 1779 1779 1877 1779 1779 1877 1797 1797 1896 1798 1798 1897 1779 1779 1877 1798 1798 1897 1780 1780 1878 1780 1780 1878 1798 1798 1897 1799 1799 1898 1780 1780 1878 1799 1799 1898 1781 1781 1879 1781 1781 1879 1799 1799 1898 1782 1782 1899 1781 1781 1879 1782 1782 1899 1764 1764 1880 1782 1782 1881 1800 1800 1900 1801 1801 1901 1782 1782 1881 1801 1801 1901 1783 1783 1882 1783 1783 1882 1801 1801 1901 1802 1802 1902 1783 1783 1882 1802 1802 1902 1784 1784 1883 1784 1784 1883 1802 1802 1902 1803 1803 1903 1784 1784 1883 1803 1803 1903 1785 1785 1884 1785 1785 1884 1803 1803 1903 1804 1804 1904 1785 1785 1884 1804 1804 1904 1786 1786 1885 1786 1786 1885 1804 1804 1904 1805 1805 1905 1786 1786 1885 1805 1805 1905 1787 1787 1886 1787 1787 1886 1805 1805 1905 1806 1806 1906 1787 1787 1886 1806 1806 1906 1788 1788 1887 1788 1788 1887 1806 1806 1906 1807 1807 1907 1788 1788 1887 1807 1807 1907 1789 1789 1888 1789 1789 1888 1807 1807 1907 1808 1808 1908 1789 1789 1888 1808 1808 1908 1790 1790 1889 1790 1790 1889 1808 1808 1908 1809 1809 1909 1790 1790 1889 1809 1809 1909 1791 1791 1890 1791 1791 1890 1809 1809 1909 1810 1810 1910 1791 1791 1890 1810 1810 1910 1792 1792 1891 1792 1792 1891 1810 1810 1910 1811 1811 1911 1792 1792 1891 1811 1811 1911 1793 1793 1892 1793 1793 1892 1811 1811 1911 1812 1812 1912 1793 1793 1892 1812 1812 1912 1794 1794 1893 1794 1794 1893 1812 1812 1912 1813 1813 1913 1794 1794 1893 1813 1813 1913 1795 1795 1894 1795 1795 1894 1813 1813 1913 1814 1814 1914 1795 1795 1894 1814 1814 1914 1796 1796 1895 1796 1796 1895 1814 1814 1914 1815 1815 1915 1796 1796 1895 1815 1815 1915 1797 1797 1896 1797 1797 1896 1815 1815 1915 1816 1816 1916 1797 1797 1896 1816 1816 1916 1798 1798 1897 1798 1798 1897 1816 1816 1916 1817 1817 1917 1798 1798 1897 1817 1817 1917 1799 1799 1898 1799 1799 1898 1817 1817 1917 1800 1800 1918 1799 1799 1898 1800 1800 1918 1782 1782 1899 1800 1800 1900 1818 1818 1919 1819 1819 1920 1800 1800 1900 1819 1819 1920 1801 1801 1901 1801 1801 1901 1819 1819 1920 1820 1820 1921 1801 1801 1901 1820 1820 1921 1802 1802 1902 1802 1802 1902 1820 1820 1921 1821 1821 1922 1802 1802 1902 1821 1821 1922 1803 1803 1903 1803 1803 1903 1821 1821 1922 1822 1822 1923 1803 1803 1903 1822 1822 1923 1804 1804 1904 1804 1804 1904 1822 1822 1923 1823 1823 1924 1804 1804 1904 1823 1823 1924 1805 1805 1905 1805 1805 1905 1823 1823 1924 1824 1824 1925 1805 1805 1905 1824 1824 1925 1806 1806 1906 1806 1806 1906 1824 1824 1925 1825 1825 1926 1806 1806 1906 1825 1825 1926 1807 1807 1907 1807 1807 1907 1825 1825 1926 1826 1826 1927 1807 1807 1907 1826 1826 1927 1808 1808 1908 1808 1808 1908 1826 1826 1927 1827 1827 1928 1808 1808 1908 1827 1827 1928 1809 1809 1909 1809 1809 1909 1827 1827 1928 1828 1828 1929 1809 1809 1909 1828 1828 1929 1810 1810 1910 1810 1810 1910 1828 1828 1929 1829 1829 1930 1810 1810 1910 1829 1829 1930 1811 1811 1911 1811 1811 1911 1829 1829 1930 1830 1830 1931 1811 1811 1911 1830 1830 1931 1812 1812 1912 1812 1812 1912 1830 1830 1931 1831 1831 1932 1812 1812 1912 1831 1831 1932 1813 1813 1913 1813 1813 1913 1831 1831 1932 1832 1832 1933 1813 1813 1913 1832 1832 1933 1814 1814 1914 1814 1814 1914 1832 1832 1933 1833 1833 1934 1814 1814 1914 1833 1833 1934 1815 1815 1915 1815 1815 1915 1833 1833 1934 1834 1834 1935 1815 1815 1915 1834 1834 1935 1816 1816 1916 1816 1816 1916 1834 1834 1935 1835 1835 1936 1816 1816 1916 1835 1835 1936 1817 1817 1917 1817 1817 1917 1835 1835 1936 1818 1818 1937 1817 1817 1917 1818 1818 1937 1800 1800 1918 1818 1818 1919 1836 1836 1938 1837 1837 1939 1818 1818 1919 1837 1837 1939 1819 1819 1920 1819 1819 1920 1837 1837 1939 1838 1838 1940 1819 1819 1920 1838 1838 1940 1820 1820 1921 1820 1820 1921 1838 1838 1940 1839 1839 1941 1820 1820 1921 1839 1839 1941 1821 1821 1922 1821 1821 1922 1839 1839 1941 1840 1840 1942 1821 1821 1922 1840 1840 1942 1822 1822 1923 1822 1822 1923 1840 1840 1942 1841 1841 1943 1822 1822 1923 1841 1841 1943 1823 1823 1924 1823 1823 1924 1841 1841 1943 1842 1842 1944 1823 1823 1924 1842 1842 1944 1824 1824 1925 1824 1824 1925 1842 1842 1944 1843 1843 1945 1824 1824 1925 1843 1843 1945 1825 1825 1926 1825 1825 1926 1843 1843 1945 1844 1844 1946 1825 1825 1926 1844 1844 1946 1826 1826 1927 1826 1826 1927 1844 1844 1946 1845 1845 1947 1826 1826 1927 1845 1845 1947 1827 1827 1928 1827 1827 1928 1845 1845 1947 1846 1846 1948 1827 1827 1928 1846 1846 1948 1828 1828 1929 1828 1828 1929 1846 1846 1948 1847 1847 1949 1828 1828 1929 1847 1847 1949 1829 1829 1930 1829 1829 1930 1847 1847 1949 1848 1848 1950 1829 1829 1930 1848 1848 1950 1830 1830 1931 1830 1830 1931 1848 1848 1950 1849 1849 1951 1830 1830 1931 1849 1849 1951 1831 1831 1932 1831 1831 1932 1849 1849 1951 1850 1850 1952 1831 1831 1932 1850 1850 1952 1832 1832 1933 1832 1832 1933 1850 1850 1952 1851 1851 1953 1832 1832 1933 1851 1851 1953 1833 1833 1934 1833 1833 1934 1851 1851 1953 1852 1852 1954 1833 1833 1934 1852 1852 1954 1834 1834 1935 1834 1834 1935 1852 1852 1954 1853 1853 1955 1834 1834 1935 1853 1853 1955 1835 1835 1936 1835 1835 1936 1853 1853 1955 1836 1836 1956 1835 1835 1936 1836 1836 1956 1818 1818 1937 1836 1836 1938 1854 1854 1957 1855 1855 1958 1836 1836 1938 1855 1855 1958 1837 1837 1939 1837 1837 1939 1855 1855 1958 1856 1856 1959 1837 1837 1939 1856 1856 1959 1838 1838 1940 1838 1838 1940 1856 1856 1959 1857 1857 1960 1838 1838 1940 1857 1857 1960 1839 1839 1941 1839 1839 1941 1857 1857 1960 1858 1858 1961 1839 1839 1941 1858 1858 1961 1840 1840 1942 1840 1840 1942 1858 1858 1961 1859 1859 1962 1840 1840 1942 1859 1859 1962 1841 1841 1943 1841 1841 1943 1859 1859 1962 1860 1860 1963 1841 1841 1943 1860 1860 1963 1842 1842 1944 1842 1842 1944 1860 1860 1963 1861 1861 1964 1842 1842 1944 1861 1861 1964 1843 1843 1945 1843 1843 1945 1861 1861 1964 1862 1862 1965 1843 1843 1945 1862 1862 1965 1844 1844 1946 1844 1844 1946 1862 1862 1965 1863 1863 1966 1844 1844 1946 1863 1863 1966 1845 1845 1947 1845 1845 1947 1863 1863 1966 1864 1864 1967 1845 1845 1947 1864 1864 1967 1846 1846 1948 1846 1846 1948 1864 1864 1967 1865 1865 1968 1846 1846 1948 1865 1865 1968 1847 1847 1949 1847 1847 1949 1865 1865 1968 1866 1866 1969 1847 1847 1949 1866 1866 1969 1848 1848 1950 1848 1848 1950 1866 1866 1969 1867 1867 1970 1848 1848 1950 1867 1867 1970 1849 1849 1951 1849 1849 1951 1867 1867 1970 1868 1868 1971 1849 1849 1951 1868 1868 1971 1850 1850 1952 1850 1850 1952 1868 1868 1971 1869 1869 1972 1850 1850 1952 1869 1869 1972 1851 1851 1953 1851 1851 1953 1869 1869 1972 1870 1870 1973 1851 1851 1953 1870 1870 1973 1852 1852 1954 1852 1852 1954 1870 1870 1973 1871 1871 1974 1852 1852 1954 1871 1871 1974 1853 1853 1955 1853 1853 1955 1871 1871 1974 1854 1854 1975 1853 1853 1955 1854 1854 1975 1836 1836 1956 1854 1854 1957 1872 1872 1976 1873 1873 1977 1854 1854 1957 1873 1873 1977 1855 1855 1958 1855 1855 1958 1873 1873 1977 1874 1874 1978 1855 1855 1958 1874 1874 1978 1856 1856 1959 1856 1856 1959 1874 1874 1978 1875 1875 1979 1856 1856 1959 1875 1875 1979 1857 1857 1960 1857 1857 1960 1875 1875 1979 1876 1876 1980 1857 1857 1960 1876 1876 1980 1858 1858 1961 1858 1858 1961 1876 1876 1980 1877 1877 1981 1858 1858 1961 1877 1877 1981 1859 1859 1962 1859 1859 1962 1877 1877 1981 1878 1878 1982 1859 1859 1962 1878 1878 1982 1860 1860 1963 1860 1860 1963 1878 1878 1982 1879 1879 1983 1860 1860 1963 1879 1879 1983 1861 1861 1964 1861 1861 1964 1879 1879 1983 1880 1880 1984 1861 1861 1964 1880 1880 1984 1862 1862 1965 1862 1862 1965 1880 1880 1984 1881 1881 1985 1862 1862 1965 1881 1881 1985 1863 1863 1966 1863 1863 1966 1881 1881 1985 1882 1882 1986 1863 1863 1966 1882 1882 1986 1864 1864 1967 1864 1864 1967 1882 1882 1986 1883 1883 1987 1864 1864 1967 1883 1883 1987 1865 1865 1968 1865 1865 1968 1883 1883 1987 1884 1884 1988 1865 1865 1968 1884 1884 1988 1866 1866 1969 1866 1866 1969 1884 1884 1988 1885 1885 1989 1866 1866 1969 1885 1885 1989 1867 1867 1970 1867 1867 1970 1885 1885 1989 1886 1886 1990 1867 1867 1970 1886 1886 1990 1868 1868 1971 1868 1868 1971 1886 1886 1990 1887 1887 1991 1868 1868 1971 1887 1887 1991 1869 1869 1972 1869 1869 1972 1887 1887 1991 1888 1888 1992 1869 1869 1972 1888 1888 1992 1870 1870 1973 1870 1870 1973 1888 1888 1992 1889 1889 1993 1870 1870 1973 1889 1889 1993 1871 1871 1974 1871 1871 1974 1889 1889 1993 1872 1872 1994 1871 1871 1974 1872 1872 1994 1854 1854 1975 1872 1872 1976 1890 1890 1995 1891 1891 1996 1872 1872 1976 1891 1891 1996 1873 1873 1977 1873 1873 1977 1891 1891 1996 1892 1892 1997 1873 1873 1977 1892 1892 1997 1874 1874 1978 1874 1874 1978 1892 1892 1997 1893 1893 1998 1874 1874 1978 1893 1893 1998 1875 1875 1979 1875 1875 1979 1893 1893 1998 1894 1894 1999 1875 1875 1979 1894 1894 1999 1876 1876 1980 1876 1876 1980 1894 1894 1999 1895 1895 2000 1876 1876 1980 1895 1895 2000 1877 1877 1981 1877 1877 1981 1895 1895 2000 1896 1896 2001 1877 1877 1981 1896 1896 2001 1878 1878 1982 1878 1878 1982 1896 1896 2001 1897 1897 2002 1878 1878 1982 1897 1897 2002 1879 1879 1983 1879 1879 1983 1897 1897 2002 1898 1898 2003 1879 1879 1983 1898 1898 2003 1880 1880 1984 1880 1880 1984 1898 1898 2003 1899 1899 2004 1880 1880 1984 1899 1899 2004 1881 1881 1985 1881 1881 1985 1899 1899 2004 1900 1900 2005 1881 1881 1985 1900 1900 2005 1882 1882 1986 1882 1882 1986 1900 1900 2005 1901 1901 2006 1882 1882 1986 1901 1901 2006 1883 1883 1987 1883 1883 1987 1901 1901 2006 1902 1902 2007 1883 1883 1987 1902 1902 2007 1884 1884 1988 1884 1884 1988 1902 1902 2007 1903 1903 2008 1884 1884 1988 1903 1903 2008 1885 1885 1989 1885 1885 1989 1903 1903 2008 1904 1904 2009 1885 1885 1989 1904 1904 2009 1886 1886 1990 1886 1886 1990 1904 1904 2009 1905 1905 2010 1886 1886 1990 1905 1905 2010 1887 1887 1991 1887 1887 1991 1905 1905 2010 1906 1906 2011 1887 1887 1991 1906 1906 2011 1888 1888 1992 1888 1888 1992 1906 1906 2011 1907 1907 2012 1888 1888 1992 1907 1907 2012 1889 1889 1993 1889 1889 1993 1907 1907 2012 1890 1890 2013 1889 1889 1993 1890 1890 2013 1872 1872 1994 1890 1890 1995 1908 1908 2014 1909 1909 2015 1890 1890 1995 1909 1909 2015 1891 1891 1996 1891 1891 1996 1909 1909 2015 1910 1910 2016 1891 1891 1996 1910 1910 2016 1892 1892 1997 1892 1892 1997 1910 1910 2016 1911 1911 2017 1892 1892 1997 1911 1911 2017 1893 1893 1998 1893 1893 1998 1911 1911 2017 1912 1912 2018 1893 1893 1998 1912 1912 2018 1894 1894 1999 1894 1894 1999 1912 1912 2018 1913 1913 2019 1894 1894 1999 1913 1913 2019 1895 1895 2000 1895 1895 2000 1913 1913 2019 1914 1914 2020 1895 1895 2000 1914 1914 2020 1896 1896 2001 1896 1896 2001 1914 1914 2020 1915 1915 2021 1896 1896 2001 1915 1915 2021 1897 1897 2002 1897 1897 2002 1915 1915 2021 1916 1916 2022 1897 1897 2002 1916 1916 2022 1898 1898 2003 1898 1898 2003 1916 1916 2022 1917 1917 2023 1898 1898 2003 1917 1917 2023 1899 1899 2004 1899 1899 2004 1917 1917 2023 1918 1918 2024 1899 1899 2004 1918 1918 2024 1900 1900 2005 1900 1900 2005 1918 1918 2024 1919 1919 2025 1900 1900 2005 1919 1919 2025 1901 1901 2006 1901 1901 2006 1919 1919 2025 1920 1920 2026 1901 1901 2006 1920 1920 2026 1902 1902 2007 1902 1902 2007 1920 1920 2026 1921 1921 2027 1902 1902 2007 1921 1921 2027 1903 1903 2008 1903 1903 2008 1921 1921 2027 1922 1922 2028 1903 1903 2008 1922 1922 2028 1904 1904 2009 1904 1904 2009 1922 1922 2028 1923 1923 2029 1904 1904 2009 1923 1923 2029 1905 1905 2010 1905 1905 2010 1923 1923 2029 1924 1924 2030 1905 1905 2010 1924 1924 2030 1906 1906 2011 1906 1906 2011 1924 1924 2030 1925 1925 2031 1906 1906 2011 1925 1925 2031 1907 1907 2012 1907 1907 2012 1925 1925 2031 1908 1908 2032 1907 1907 2012 1908 1908 2032 1890 1890 2013 1908 1908 2014 1926 1926 2033 1927 1927 2034 1908 1908 2014 1927 1927 2034 1909 1909 2015 1909 1909 2015 1927 1927 2034 1928 1928 2035 1909 1909 2015 1928 1928 2035 1910 1910 2016 1910 1910 2016 1928 1928 2035 1929 1929 2036 1910 1910 2016 1929 1929 2036 1911 1911 2017 1911 1911 2017 1929 1929 2036 1930 1930 2037 1911 1911 2017 1930 1930 2037 1912 1912 2018 1912 1912 2018 1930 1930 2037 1931 1931 2038 1912 1912 2018 1931 1931 2038 1913 1913 2019 1913 1913 2019 1931 1931 2038 1932 1932 2039 1913 1913 2019 1932 1932 2039 1914 1914 2020 1914 1914 2020 1932 1932 2039 1933 1933 2040 1914 1914 2020 1933 1933 2040 1915 1915 2021 1915 1915 2021 1933 1933 2040 1934 1934 2041 1915 1915 2021 1934 1934 2041 1916 1916 2022 1916 1916 2022 1934 1934 2041 1935 1935 2042 1916 1916 2022 1935 1935 2042 1917 1917 2023 1917 1917 2023 1935 1935 2042 1936 1936 2043 1917 1917 2023 1936 1936 2043 1918 1918 2024 1918 1918 2024 1936 1936 2043 1937 1937 2044 1918 1918 2024 1937 1937 2044 1919 1919 2025 1919 1919 2025 1937 1937 2044 1938 1938 2045 1919 1919 2025 1938 1938 2045 1920 1920 2026 1920 1920 2026 1938 1938 2045 1939 1939 2046 1920 1920 2026 1939 1939 2046 1921 1921 2027 1921 1921 2027 1939 1939 2046 1940 1940 2047 1921 1921 2027 1940 1940 2047 1922 1922 2028 1922 1922 2028 1940 1940 2047 1941 1941 2048 1922 1922 2028 1941 1941 2048 1923 1923 2029 1923 1923 2029 1941 1941 2048 1942 1942 2049 1923 1923 2029 1942 1942 2049 1924 1924 2030 1924 1924 2030 1942 1942 2049 1943 1943 2050 1924 1924 2030 1943 1943 2050 1925 1925 2031 1925 1925 2031 1943 1943 2050 1926 1926 2051 1925 1925 2031 1926 1926 2051 1908 1908 2032 1926 1926 2033 1944 1944 2052 1945 1945 2053 1926 1926 2033 1945 1945 2053 1927 1927 2034 1927 1927 2034 1945 1945 2053 1946 1946 2054 1927 1927 2034 1946 1946 2054 1928 1928 2035 1928 1928 2035 1946 1946 2054 1947 1947 2055 1928 1928 2035 1947 1947 2055 1929 1929 2036 1929 1929 2036 1947 1947 2055 1948 1948 2056 1929 1929 2036 1948 1948 2056 1930 1930 2037 1930 1930 2037 1948 1948 2056 1949 1949 2057 1930 1930 2037 1949 1949 2057 1931 1931 2038 1931 1931 2038 1949 1949 2057 1950 1950 2058 1931 1931 2038 1950 1950 2058 1932 1932 2039 1932 1932 2039 1950 1950 2058 1951 1951 2059 1932 1932 2039 1951 1951 2059 1933 1933 2040 1933 1933 2040 1951 1951 2059 1952 1952 2060 1933 1933 2040 1952 1952 2060 1934 1934 2041 1934 1934 2041 1952 1952 2060 1953 1953 2061 1934 1934 2041 1953 1953 2061 1935 1935 2042 1935 1935 2042 1953 1953 2061 1954 1954 2062 1935 1935 2042 1954 1954 2062 1936 1936 2043 1936 1936 2043 1954 1954 2062 1955 1955 2063 1936 1936 2043 1955 1955 2063 1937 1937 2044 1937 1937 2044 1955 1955 2063 1956 1956 2064 1937 1937 2044 1956 1956 2064 1938 1938 2045 1938 1938 2045 1956 1956 2064 1957 1957 2065 1938 1938 2045 1957 1957 2065 1939 1939 2046 1939 1939 2046 1957 1957 2065 1958 1958 2066 1939 1939 2046 1958 1958 2066 1940 1940 2047 1940 1940 2047 1958 1958 2066 1959 1959 2067 1940 1940 2047 1959 1959 2067 1941 1941 2048 1941 1941 2048 1959 1959 2067 1960 1960 2068 1941 1941 2048 1960 1960 2068 1942 1942 2049 1942 1942 2049 1960 1960 2068 1961 1961 2069 1942 1942 2049 1961 1961 2069 1943 1943 2050 1943 1943 2050 1961 1961 2069 1944 1944 2070 1943 1943 2050 1944 1944 2070 1926 1926 2051 1944 1944 2052 1962 1962 2071 1963 1963 2072 1944 1944 2052 1963 1963 2072 1945 1945 2053 1945 1945 2053 1963 1963 2072 1964 1964 2073 1945 1945 2053 1964 1964 2073 1946 1946 2054 1946 1946 2054 1964 1964 2073 1965 1965 2074 1946 1946 2054 1965 1965 2074 1947 1947 2055 1947 1947 2055 1965 1965 2074 1966 1966 2075 1947 1947 2055 1966 1966 2075 1948 1948 2056 1948 1948 2056 1966 1966 2075 1967 1967 2076 1948 1948 2056 1967 1967 2076 1949 1949 2057 1949 1949 2057 1967 1967 2076 1968 1968 2077 1949 1949 2057 1968 1968 2077 1950 1950 2058 1950 1950 2058 1968 1968 2077 1969 1969 2078 1950 1950 2058 1969 1969 2078 1951 1951 2059 1951 1951 2059 1969 1969 2078 1970 1970 2079 1951 1951 2059 1970 1970 2079 1952 1952 2060 1952 1952 2060 1970 1970 2079 1971 1971 2080 1952 1952 2060 1971 1971 2080 1953 1953 2061 1953 1953 2061 1971 1971 2080 1972 1972 2081 1953 1953 2061 1972 1972 2081 1954 1954 2062 1954 1954 2062 1972 1972 2081 1973 1973 2082 1954 1954 2062 1973 1973 2082 1955 1955 2063 1955 1955 2063 1973 1973 2082 1974 1974 2083 1955 1955 2063 1974 1974 2083 1956 1956 2064 1956 1956 2064 1974 1974 2083 1975 1975 2084 1956 1956 2064 1975 1975 2084 1957 1957 2065 1957 1957 2065 1975 1975 2084 1976 1976 2085 1957 1957 2065 1976 1976 2085 1958 1958 2066 1958 1958 2066 1976 1976 2085 1977 1977 2086 1958 1958 2066 1977 1977 2086 1959 1959 2067 1959 1959 2067 1977 1977 2086 1978 1978 2087 1959 1959 2067 1978 1978 2087 1960 1960 2068 1960 1960 2068 1978 1978 2087 1979 1979 2088 1960 1960 2068 1979 1979 2088 1961 1961 2069 1961 1961 2069 1979 1979 2088 1962 1962 2089 1961 1961 2069 1962 1962 2089 1944 1944 2070 1962 1962 2071 1980 1980 2090 1981 1981 2091 1962 1962 2071 1981 1981 2091 1963 1963 2072 1963 1963 2072 1981 1981 2091 1982 1982 2092 1963 1963 2072 1982 1982 2092 1964 1964 2073 1964 1964 2073 1982 1982 2092 1983 1983 2093 1964 1964 2073 1983 1983 2093 1965 1965 2074 1965 1965 2074 1983 1983 2093 1984 1984 2094 1965 1965 2074 1984 1984 2094 1966 1966 2075 1966 1966 2075 1984 1984 2094 1985 1985 2095 1966 1966 2075 1985 1985 2095 1967 1967 2076 1967 1967 2076 1985 1985 2095 1986 1986 2096 1967 1967 2076 1986 1986 2096 1968 1968 2077 1968 1968 2077 1986 1986 2096 1987 1987 2097 1968 1968 2077 1987 1987 2097 1969 1969 2078 1969 1969 2078 1987 1987 2097 1988 1988 2098 1969 1969 2078 1988 1988 2098 1970 1970 2079 1970 1970 2079 1988 1988 2098 1989 1989 2099 1970 1970 2079 1989 1989 2099 1971 1971 2080 1971 1971 2080 1989 1989 2099 1990 1990 2100 1971 1971 2080 1990 1990 2100 1972 1972 2081 1972 1972 2081 1990 1990 2100 1991 1991 2101 1972 1972 2081 1991 1991 2101 1973 1973 2082 1973 1973 2082 1991 1991 2101 1992 1992 2102 1973 1973 2082 1992 1992 2102 1974 1974 2083 1974 1974 2083 1992 1992 2102 1993 1993 2103 1974 1974 2083 1993 1993 2103 1975 1975 2084 1975 1975 2084 1993 1993 2103 1994 1994 2104 1975 1975 2084 1994 1994 2104 1976 1976 2085 1976 1976 2085 1994 1994 2104 1995 1995 2105 1976 1976 2085 1995 1995 2105 1977 1977 2086 1977 1977 2086 1995 1995 2105 1996 1996 2106 1977 1977 2086 1996 1996 2106 1978 1978 2087 1978 1978 2087 1996 1996 2106 1997 1997 2107 1978 1978 2087 1997 1997 2107 1979 1979 2088 1979 1979 2088 1997 1997 2107 1980 1980 2108 1979 1979 2088 1980 1980 2108 1962 1962 2089 1980 1980 2090 1998 1998 2109 1999 1999 2110 1980 1980 2090 1999 1999 2110 1981 1981 2091 1981 1981 2091 1999 1999 2110 2000 2000 2111 1981 1981 2091 2000 2000 2111 1982 1982 2092 1982 1982 2092 2000 2000 2111 2001 2001 2112 1982 1982 2092 2001 2001 2112 1983 1983 2093 1983 1983 2093 2001 2001 2112 2002 2002 2113 1983 1983 2093 2002 2002 2113 1984 1984 2094 1984 1984 2094 2002 2002 2113 2003 2003 2114 1984 1984 2094 2003 2003 2114 1985 1985 2095 1985 1985 2095 2003 2003 2114 2004 2004 2115 1985 1985 2095 2004 2004 2115 1986 1986 2096 1986 1986 2096 2004 2004 2115 2005 2005 2116 1986 1986 2096 2005 2005 2116 1987 1987 2097 1987 1987 2097 2005 2005 2116 2006 2006 2117 1987 1987 2097 2006 2006 2117 1988 1988 2098 1988 1988 2098 2006 2006 2117 2007 2007 2118 1988 1988 2098 2007 2007 2118 1989 1989 2099 1989 1989 2099 2007 2007 2118 2008 2008 2119 1989 1989 2099 2008 2008 2119 1990 1990 2100 1990 1990 2100 2008 2008 2119 2009 2009 2120 1990 1990 2100 2009 2009 2120 1991 1991 2101 1991 1991 2101 2009 2009 2120 2010 2010 2121 1991 1991 2101 2010 2010 2121 1992 1992 2102 1992 1992 2102 2010 2010 2121 2011 2011 2122 1992 1992 2102 2011 2011 2122 1993 1993 2103 1993 1993 2103 2011 2011 2122 2012 2012 2123 1993 1993 2103 2012 2012 2123 1994 1994 2104 1994 1994 2104 2012 2012 2123 2013 2013 2124 1994 1994 2104 2013 2013 2124 1995 1995 2105 1995 1995 2105 2013 2013 2124 2014 2014 2125 1995 1995 2105 2014 2014 2125 1996 1996 2106 1996 1996 2106 2014 2014 2125 2015 2015 2126 1996 1996 2106 2015 2015 2126 1997 1997 2107 1997 1997 2107 2015 2015 2126 1998 1998 2127 1997 1997 2107 1998 1998 2127 1980 1980 2108 1998 1998 2109 2016 2016 2128 2017 2017 2129 1998 1998 2109 2017 2017 2129 1999 1999 2110 1999 1999 2110 2017 2017 2129 2018 2018 2130 1999 1999 2110 2018 2018 2130 2000 2000 2111 2000 2000 2111 2018 2018 2130 2019 2019 2131 2000 2000 2111 2019 2019 2131 2001 2001 2112 2001 2001 2112 2019 2019 2131 2020 2020 2132 2001 2001 2112 2020 2020 2132 2002 2002 2113 2002 2002 2113 2020 2020 2132 2021 2021 2133 2002 2002 2113 2021 2021 2133 2003 2003 2114 2003 2003 2114 2021 2021 2133 2022 2022 2134 2003 2003 2114 2022 2022 2134 2004 2004 2115 2004 2004 2115 2022 2022 2134 2023 2023 2135 2004 2004 2115 2023 2023 2135 2005 2005 2116 2005 2005 2116 2023 2023 2135 2024 2024 2136 2005 2005 2116 2024 2024 2136 2006 2006 2117 2006 2006 2117 2024 2024 2136 2025 2025 2137 2006 2006 2117 2025 2025 2137 2007 2007 2118 2007 2007 2118 2025 2025 2137 2026 2026 2138 2007 2007 2118 2026 2026 2138 2008 2008 2119 2008 2008 2119 2026 2026 2138 2027 2027 2139 2008 2008 2119 2027 2027 2139 2009 2009 2120 2009 2009 2120 2027 2027 2139 2028 2028 2140 2009 2009 2120 2028 2028 2140 2010 2010 2121 2010 2010 2121 2028 2028 2140 2029 2029 2141 2010 2010 2121 2029 2029 2141 2011 2011 2122 2011 2011 2122 2029 2029 2141 2030 2030 2142 2011 2011 2122 2030 2030 2142 2012 2012 2123 2012 2012 2123 2030 2030 2142 2031 2031 2143 2012 2012 2123 2031 2031 2143 2013 2013 2124 2013 2013 2124 2031 2031 2143 2032 2032 2144 2013 2013 2124 2032 2032 2144 2014 2014 2125 2014 2014 2125 2032 2032 2144 2033 2033 2145 2014 2014 2125 2033 2033 2145 2015 2015 2126 2015 2015 2126 2033 2033 2145 2016 2016 2146 2015 2015 2126 2016 2016 2146 1998 1998 2127 2016 2016 2128 2034 2034 2147 2035 2035 2148 2016 2016 2128 2035 2035 2148 2017 2017 2129 2017 2017 2129 2035 2035 2148 2036 2036 2149 2017 2017 2129 2036 2036 2149 2018 2018 2130 2018 2018 2130 2036 2036 2149 2037 2037 2150 2018 2018 2130 2037 2037 2150 2019 2019 2131 2019 2019 2131 2037 2037 2150 2038 2038 2151 2019 2019 2131 2038 2038 2151 2020 2020 2132 2020 2020 2132 2038 2038 2151 2039 2039 2152 2020 2020 2132 2039 2039 2152 2021 2021 2133 2021 2021 2133 2039 2039 2152 2040 2040 2153 2021 2021 2133 2040 2040 2153 2022 2022 2134 2022 2022 2134 2040 2040 2153 2041 2041 2154 2022 2022 2134 2041 2041 2154 2023 2023 2135 2023 2023 2135 2041 2041 2154 2042 2042 2155 2023 2023 2135 2042 2042 2155 2024 2024 2136 2024 2024 2136 2042 2042 2155 2043 2043 2156 2024 2024 2136 2043 2043 2156 2025 2025 2137 2025 2025 2137 2043 2043 2156 2044 2044 2157 2025 2025 2137 2044 2044 2157 2026 2026 2138 2026 2026 2138 2044 2044 2157 2045 2045 2158 2026 2026 2138 2045 2045 2158 2027 2027 2139 2027 2027 2139 2045 2045 2158 2046 2046 2159 2027 2027 2139 2046 2046 2159 2028 2028 2140 2028 2028 2140 2046 2046 2159 2047 2047 2160 2028 2028 2140 2047 2047 2160 2029 2029 2141 2029 2029 2141 2047 2047 2160 2048 2048 2161 2029 2029 2141 2048 2048 2161 2030 2030 2142 2030 2030 2142 2048 2048 2161 2049 2049 2162 2030 2030 2142 2049 2049 2162 2031 2031 2143 2031 2031 2143 2049 2049 2162 2050 2050 2163 2031 2031 2143 2050 2050 2163 2032 2032 2144 2032 2032 2144 2050 2050 2163 2051 2051 2164 2032 2032 2144 2051 2051 2164 2033 2033 2145 2033 2033 2145 2051 2051 2164 2034 2034 2165 2033 2033 2145 2034 2034 2165 2016 2016 2146 2034 2034 2147 2052 2052 2166 2053 2053 2167 2034 2034 2147 2053 2053 2167 2035 2035 2148 2035 2035 2148 2053 2053 2167 2054 2054 2168 2035 2035 2148 2054 2054 2168 2036 2036 2149 2036 2036 2149 2054 2054 2168 2055 2055 2169 2036 2036 2149 2055 2055 2169 2037 2037 2150 2037 2037 2150 2055 2055 2169 2056 2056 2170 2037 2037 2150 2056 2056 2170 2038 2038 2151 2038 2038 2151 2056 2056 2170 2057 2057 2171 2038 2038 2151 2057 2057 2171 2039 2039 2152 2039 2039 2152 2057 2057 2171 2058 2058 2172 2039 2039 2152 2058 2058 2172 2040 2040 2153 2040 2040 2153 2058 2058 2172 2059 2059 2173 2040 2040 2153 2059 2059 2173 2041 2041 2154 2041 2041 2154 2059 2059 2173 2060 2060 2174 2041 2041 2154 2060 2060 2174 2042 2042 2155 2042 2042 2155 2060 2060 2174 2061 2061 2175 2042 2042 2155 2061 2061 2175 2043 2043 2156 2043 2043 2156 2061 2061 2175 2062 2062 2176 2043 2043 2156 2062 2062 2176 2044 2044 2157 2044 2044 2157 2062 2062 2176 2063 2063 2177 2044 2044 2157 2063 2063 2177 2045 2045 2158 2045 2045 2158 2063 2063 2177 2064 2064 2178 2045 2045 2158 2064 2064 2178 2046 2046 2159 2046 2046 2159 2064 2064 2178 2065 2065 2179 2046 2046 2159 2065 2065 2179 2047 2047 2160 2047 2047 2160 2065 2065 2179 2066 2066 2180 2047 2047 2160 2066 2066 2180 2048 2048 2161 2048 2048 2161 2066 2066 2180 2067 2067 2181 2048 2048 2161 2067 2067 2181 2049 2049 2162 2049 2049 2162 2067 2067 2181 2068 2068 2182 2049 2049 2162 2068 2068 2182 2050 2050 2163 2050 2050 2163 2068 2068 2182 2069 2069 2183 2050 2050 2163 2069 2069 2183 2051 2051 2164 2051 2051 2164 2069 2069 2183 2052 2052 2184 2051 2051 2164 2052 2052 2184 2034 2034 2165 2052 2052 2166 2070 2070 2185 2071 2071 2186 2052 2052 2166 2071 2071 2186 2053 2053 2167 2053 2053 2167 2071 2071 2186 2072 2072 2187 2053 2053 2167 2072 2072 2187 2054 2054 2168 2054 2054 2168 2072 2072 2187 2073 2073 2188 2054 2054 2168 2073 2073 2188 2055 2055 2169 2055 2055 2169 2073 2073 2188 2074 2074 2189 2055 2055 2169 2074 2074 2189 2056 2056 2170 2056 2056 2170 2074 2074 2189 2075 2075 2190 2056 2056 2170 2075 2075 2190 2057 2057 2171 2057 2057 2171 2075 2075 2190 2076 2076 2191 2057 2057 2171 2076 2076 2191 2058 2058 2172 2058 2058 2172 2076 2076 2191 2077 2077 2192 2058 2058 2172 2077 2077 2192 2059 2059 2173 2059 2059 2173 2077 2077 2192 2078 2078 2193 2059 2059 2173 2078 2078 2193 2060 2060 2174 2060 2060 2174 2078 2078 2193 2079 2079 2194 2060 2060 2174 2079 2079 2194 2061 2061 2175 2061 2061 2175 2079 2079 2194 2080 2080 2195 2061 2061 2175 2080 2080 2195 2062 2062 2176 2062 2062 2176 2080 2080 2195 2081 2081 2196 2062 2062 2176 2081 2081 2196 2063 2063 2177 2063 2063 2177 2081 2081 2196 2082 2082 2197 2063 2063 2177 2082 2082 2197 2064 2064 2178 2064 2064 2178 2082 2082 2197 2083 2083 2198 2064 2064 2178 2083 2083 2198 2065 2065 2179 2065 2065 2179 2083 2083 2198 2084 2084 2199 2065 2065 2179 2084 2084 2199 2066 2066 2180 2066 2066 2180 2084 2084 2199 2085 2085 2200 2066 2066 2180 2085 2085 2200 2067 2067 2181 2067 2067 2181 2085 2085 2200 2086 2086 2201 2067 2067 2181 2086 2086 2201 2068 2068 2182 2068 2068 2182 2086 2086 2201 2087 2087 2202 2068 2068 2182 2087 2087 2202 2069 2069 2183 2069 2069 2183 2087 2087 2202 2070 2070 2203 2069 2069 2183 2070 2070 2203 2052 2052 2184 2070 2070 2185 2088 2088 2204 2089 2089 2205 2070 2070 2185 2089 2089 2205 2071 2071 2186 2071 2071 2186 2089 2089 2205 2090 2090 2206 2071 2071 2186 2090 2090 2206 2072 2072 2187 2072 2072 2187 2090 2090 2206 2091 2091 2207 2072 2072 2187 2091 2091 2207 2073 2073 2188 2073 2073 2188 2091 2091 2207 2092 2092 2208 2073 2073 2188 2092 2092 2208 2074 2074 2189 2074 2074 2189 2092 2092 2208 2093 2093 2209 2074 2074 2189 2093 2093 2209 2075 2075 2190 2075 2075 2190 2093 2093 2209 2094 2094 2210 2075 2075 2190 2094 2094 2210 2076 2076 2191 2076 2076 2191 2094 2094 2210 2095 2095 2211 2076 2076 2191 2095 2095 2211 2077 2077 2192 2077 2077 2192 2095 2095 2211 2096 2096 2212 2077 2077 2192 2096 2096 2212 2078 2078 2193 2078 2078 2193 2096 2096 2212 2097 2097 2213 2078 2078 2193 2097 2097 2213 2079 2079 2194 2079 2079 2194 2097 2097 2213 2098 2098 2214 2079 2079 2194 2098 2098 2214 2080 2080 2195 2080 2080 2195 2098 2098 2214 2099 2099 2215 2080 2080 2195 2099 2099 2215 2081 2081 2196 2081 2081 2196 2099 2099 2215 2100 2100 2216 2081 2081 2196 2100 2100 2216 2082 2082 2197 2082 2082 2197 2100 2100 2216 2101 2101 2217 2082 2082 2197 2101 2101 2217 2083 2083 2198 2083 2083 2198 2101 2101 2217 2102 2102 2218 2083 2083 2198 2102 2102 2218 2084 2084 2199 2084 2084 2199 2102 2102 2218 2103 2103 2219 2084 2084 2199 2103 2103 2219 2085 2085 2200 2085 2085 2200 2103 2103 2219 2104 2104 2220 2085 2085 2200 2104 2104 2220 2086 2086 2201 2086 2086 2201 2104 2104 2220 2105 2105 2221 2086 2086 2201 2105 2105 2221 2087 2087 2202 2087 2087 2202 2105 2105 2221 2088 2088 2222 2087 2087 2202 2088 2088 2222 2070 2070 2203 2088 2088 2204 2106 2106 2223 2107 2107 2224 2088 2088 2204 2107 2107 2224 2089 2089 2205 2089 2089 2205 2107 2107 2224 2108 2108 2225 2089 2089 2205 2108 2108 2225 2090 2090 2206 2090 2090 2206 2108 2108 2225 2109 2109 2226 2090 2090 2206 2109 2109 2226 2091 2091 2207 2091 2091 2207 2109 2109 2226 2110 2110 2227 2091 2091 2207 2110 2110 2227 2092 2092 2208 2092 2092 2208 2110 2110 2227 2111 2111 2228 2092 2092 2208 2111 2111 2228 2093 2093 2209 2093 2093 2209 2111 2111 2228 2112 2112 2229 2093 2093 2209 2112 2112 2229 2094 2094 2210 2094 2094 2210 2112 2112 2229 2113 2113 2230 2094 2094 2210 2113 2113 2230 2095 2095 2211 2095 2095 2211 2113 2113 2230 2114 2114 2231 2095 2095 2211 2114 2114 2231 2096 2096 2212 2096 2096 2212 2114 2114 2231 2115 2115 2232 2096 2096 2212 2115 2115 2232 2097 2097 2213 2097 2097 2213 2115 2115 2232 2116 2116 2233 2097 2097 2213 2116 2116 2233 2098 2098 2214 2098 2098 2214 2116 2116 2233 2117 2117 2234 2098 2098 2214 2117 2117 2234 2099 2099 2215 2099 2099 2215 2117 2117 2234 2118 2118 2235 2099 2099 2215 2118 2118 2235 2100 2100 2216 2100 2100 2216 2118 2118 2235 2119 2119 2236 2100 2100 2216 2119 2119 2236 2101 2101 2217 2101 2101 2217 2119 2119 2236 2120 2120 2237 2101 2101 2217 2120 2120 2237 2102 2102 2218 2102 2102 2218 2120 2120 2237 2121 2121 2238 2102 2102 2218 2121 2121 2238 2103 2103 2219 2103 2103 2219 2121 2121 2238 2122 2122 2239 2103 2103 2219 2122 2122 2239 2104 2104 2220 2104 2104 2220 2122 2122 2239 2123 2123 2240 2104 2104 2220 2123 2123 2240 2105 2105 2221 2105 2105 2221 2123 2123 2240 2106 2106 2241 2105 2105 2221 2106 2106 2241 2088 2088 2222 2106 2106 2223 2124 2124 2242 2125 2125 2243 2106 2106 2223 2125 2125 2243 2107 2107 2224 2107 2107 2224 2125 2125 2243 2126 2126 2244 2107 2107 2224 2126 2126 2244 2108 2108 2225 2108 2108 2225 2126 2126 2244 2127 2127 2245 2108 2108 2225 2127 2127 2245 2109 2109 2226 2109 2109 2226 2127 2127 2245 2128 2128 2246 2109 2109 2226 2128 2128 2246 2110 2110 2227 2110 2110 2227 2128 2128 2246 2129 2129 2247 2110 2110 2227 2129 2129 2247 2111 2111 2228 2111 2111 2228 2129 2129 2247 2130 2130 2248 2111 2111 2228 2130 2130 2248 2112 2112 2229 2112 2112 2229 2130 2130 2248 2131 2131 2249 2112 2112 2229 2131 2131 2249 2113 2113 2230 2113 2113 2230 2131 2131 2249 2132 2132 2250 2113 2113 2230 2132 2132 2250 2114 2114 2231 2114 2114 2231 2132 2132 2250 2133 2133 2251 2114 2114 2231 2133 2133 2251 2115 2115 2232 2115 2115 2232 2133 2133 2251 2134 2134 2252 2115 2115 2232 2134 2134 2252 2116 2116 2233 2116 2116 2233 2134 2134 2252 2135 2135 2253 2116 2116 2233 2135 2135 2253 2117 2117 2234 2117 2117 2234 2135 2135 2253 2136 2136 2254 2117 2117 2234 2136 2136 2254 2118 2118 2235 2118 2118 2235 2136 2136 2254 2137 2137 2255 2118 2118 2235 2137 2137 2255 2119 2119 2236 2119 2119 2236 2137 2137 2255 2138 2138 2256 2119 2119 2236 2138 2138 2256 2120 2120 2237 2120 2120 2237 2138 2138 2256 2139 2139 2257 2120 2120 2237 2139 2139 2257 2121 2121 2238 2121 2121 2238 2139 2139 2257 2140 2140 2258 2121 2121 2238 2140 2140 2258 2122 2122 2239 2122 2122 2239 2140 2140 2258 2141 2141 2259 2122 2122 2239 2141 2141 2259 2123 2123 2240 2123 2123 2240 2141 2141 2259 2124 2124 2260 2123 2123 2240 2124 2124 2260 2106 2106 2241 2124 2124 2242 2142 2142 2261 2143 2143 2262 2124 2124 2242 2143 2143 2262 2125 2125 2243 2125 2125 2243 2143 2143 2262 2144 2144 2263 2125 2125 2243 2144 2144 2263 2126 2126 2244 2126 2126 2244 2144 2144 2263 2145 2145 2264 2126 2126 2244 2145 2145 2264 2127 2127 2245 2127 2127 2245 2145 2145 2264 2146 2146 2265 2127 2127 2245 2146 2146 2265 2128 2128 2246 2128 2128 2246 2146 2146 2265 2147 2147 2266 2128 2128 2246 2147 2147 2266 2129 2129 2247 2129 2129 2247 2147 2147 2266 2148 2148 2267 2129 2129 2247 2148 2148 2267 2130 2130 2248 2130 2130 2248 2148 2148 2267 2149 2149 2268 2130 2130 2248 2149 2149 2268 2131 2131 2249 2131 2131 2249 2149 2149 2268 2150 2150 2269 2131 2131 2249 2150 2150 2269 2132 2132 2250 2132 2132 2250 2150 2150 2269 2151 2151 2270 2132 2132 2250 2151 2151 2270 2133 2133 2251 2133 2133 2251 2151 2151 2270 2152 2152 2271 2133 2133 2251 2152 2152 2271 2134 2134 2252 2134 2134 2252 2152 2152 2271 2153 2153 2272 2134 2134 2252 2153 2153 2272 2135 2135 2253 2135 2135 2253 2153 2153 2272 2154 2154 2273 2135 2135 2253 2154 2154 2273 2136 2136 2254 2136 2136 2254 2154 2154 2273 2155 2155 2274 2136 2136 2254 2155 2155 2274 2137 2137 2255 2137 2137 2255 2155 2155 2274 2156 2156 2275 2137 2137 2255 2156 2156 2275 2138 2138 2256 2138 2138 2256 2156 2156 2275 2157 2157 2276 2138 2138 2256 2157 2157 2276 2139 2139 2257 2139 2139 2257 2157 2157 2276 2158 2158 2277 2139 2139 2257 2158 2158 2277 2140 2140 2258 2140 2140 2258 2158 2158 2277 2159 2159 2278 2140 2140 2258 2159 2159 2278 2141 2141 2259 2141 2141 2259 2159 2159 2278 2142 2142 2279 2141 2141 2259 2142 2142 2279 2124 2124 2260 2142 2142 2261 0 0 2280 1 3 2281 2142 2142 2261 1 3 2281 2143 2143 2262 2143 2143 2262 1 3 2281 2 5 2282 2143 2143 2262 2 5 2282 2144 2144 2263 2144 2144 2263 2 5 2282 3 7 2283 2144 2144 2263 3 7 2283 2145 2145 2264 2145 2145 2264 3 7 2283 4 9 2284 2145 2145 2264 4 9 2284 2146 2146 2265 2146 2146 2265 4 9 2284 5 11 2285 2146 2146 2265 5 11 2285 2147 2147 2266 2147 2147 2266 5 11 2285 6 13 2286 2147 2147 2266 6 13 2286 2148 2148 2267 2148 2148 2267 6 13 2286 7 15 2287 2148 2148 2267 7 15 2287 2149 2149 2268 2149 2149 2268 7 15 2287 8 17 2288 2149 2149 2268 8 17 2288 2150 2150 2269 2150 2150 2269 8 17 2288 9 19 2289 2150 2150 2269 9 19 2289 2151 2151 2270 2151 2151 2270 9 19 2289 10 21 2290 2151 2151 2270 10 21 2290 2152 2152 2271 2152 2152 2271 10 21 2290 11 23 2291 2152 2152 2271 11 23 2291 2153 2153 2272 2153 2153 2272 11 23 2291 12 25 2292 2153 2153 2272 12 25 2292 2154 2154 2273 2154 2154 2273 12 25 2292 13 27 2293 2154 2154 2273 13 27 2293 2155 2155 2274 2155 2155 2274 13 27 2293 14 29 2294 2155 2155 2274 14 29 2294 2156 2156 2275 2156 2156 2275 14 29 2294 15 31 2295 2156 2156 2275 15 31 2295 2157 2157 2276 2157 2157 2276 15 31 2295 16 33 2296 2157 2157 2276 16 33 2296 2158 2158 2277 2158 2158 2277 16 33 2296 17 35 2297 2158 2158 2277 17 35 2297 2159 2159 2278 2159 2159 2278 17 35 2297 0 0 2298 2159 2159 2278 0 0 2298 2142 2142 2279</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-3_max" name="Torus_Knot-3_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-3_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-4.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-4.dae
new file mode 100644
index 0000000..20d8adb
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-4.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-4.max</source_data>
+ </contributor>
+ <created>2008-10-31T16:20:22Z</created>
+ <modified>2008-10-31T16:20:23Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="6480">36.869415 -0.010380 8.585130 36.443169 -0.590930 9.865063 34.362587 -1.100204 12.696369 30.878613 -1.476778 16.737549 26.411465 -1.675231 21.501183 21.499950 -1.671626 26.412697 16.736469 -1.466398 30.879692 12.695569 -1.084301 34.363388 9.864638 -0.571422 36.443596 8.585131 0.010380 36.869415 9.011374 0.590929 35.589485 11.091956 1.100204 32.758179 14.575928 1.476778 28.716999 19.043072 1.675231 23.953369 23.954586 1.671626 19.041855 28.718067 1.466399 14.574858 32.758968 1.084302 11.091161 35.589901 0.571423 9.010949 38.463608 0.720380 10.131867 38.058578 0.343384 11.492300 35.998039 0.233443 14.381344 32.530525 0.403818 18.450539 28.074268 0.833959 23.209082 23.166761 1.471985 28.083017 18.399921 2.240940 32.484482 14.348699 3.048077 35.882591 11.501730 3.796043 37.867485 10.202403 4.394623 38.199753 10.607434 4.771620 36.839321 12.667971 4.881561 33.950279 16.135483 4.711186 29.881084 20.591736 4.281046 25.122547 25.499243 3.643020 20.248608 30.266083 2.874066 15.847145 34.317307 2.066929 12.449034 37.164276 1.318962 10.464139 39.967487 1.975798 11.411241 39.599033 1.832959 12.825733 37.573872 2.132110 15.726371 34.136257 2.837172 19.763292 29.700823 3.863102 24.449587 24.802547 5.086159 29.220016 20.032238 6.358824 33.499199 15.965258 7.527594 36.770996 13.092149 8.451498 38.640789 11.759449 9.019101 38.883049 12.127901 9.161942 37.468555 14.153064 8.862790 34.567921 17.590675 8.157729 30.531000 22.026106 7.131799 25.844707 26.924379 5.908743 21.074280 31.694691 4.636078 16.795097 35.761673 3.467308 13.523296 38.634785 2.543403 11.653501 41.315632 3.884909 12.207775 40.992466 3.999348 13.635859 39.009968 4.698754 16.496801 35.607246 5.898769 20.445536 31.194729 7.454656 25.005783 26.304626 9.178749 29.627512 21.526760 10.863096 33.753273 17.437407 12.304543 36.885437 14.529808 13.329229 38.646217 13.154658 13.813562 38.823246 13.477822 13.699123 37.395164 15.460322 12.999718 34.534222 18.863039 11.799704 30.585489 23.275555 10.243817 26.025244 28.165657 8.519726 21.403517 32.943523 6.835378 17.277756 37.032879 5.393930 14.145589 39.940479 4.369244 12.384804 42.409981 6.498417 12.268070 42.127308 6.876197 13.658872 40.180717 7.946067 16.428465 36.805000 9.578985 20.242796 32.407310 11.577999 24.641800 27.518078 13.701996 29.094893 22.727020 15.694790 33.064964 18.612005 17.316021 36.073166 15.669364 18.370148 37.756664 14.254025 18.730024 37.912403 14.536695 18.352245 36.521603 16.483284 17.282375 33.752010 19.859001 15.649458 29.937681 24.256689 13.650446 25.538679 29.145918 11.526449 21.085588 33.936977 9.533655 17.115515 38.051994 7.912422 14.107312 40.994637 6.858294 12.423811 43.111057 9.766623 11.341201 42.850121 10.389200 12.645524 40.919250 11.778502 15.281062 37.551334 13.766958 18.929930 33.152599 16.114733 23.152020 28.253593 18.538649 27.438084 23.445213 20.746344 31.271160 19.307415 22.471540 34.188923 16.339281 23.506155 35.839451 14.898812 23.725393 36.023659 15.159749 23.102816 34.719337 17.090616 21.713516 32.083801 20.458529 19.725060 28.434937 24.857262 17.377285 24.212849 29.756266 14.953371 19.926785 34.564648 12.745676 16.093708 38.702446 11.020477 13.175941 41.670582 9.985863 11.525412 43.244488 13.545299 9.216830 42.980289 14.372921 10.400972 41.039604 16.015354 12.879004 37.656506 18.274496 16.352034 33.239044 20.877867 20.401165 28.320034 23.511456 24.538015 23.492781 25.857611 28.263615 19.339520 27.633358 31.128603 16.361195 28.624512 32.787422 14.917038 28.711525 33.039989 15.181234 27.883904 31.855850 17.121918 26.241472 29.377819 20.505014 23.982330 25.904791 24.922472 21.378962 21.855661 29.841482 18.745375 17.718813 34.668736 16.399216 13.993214 38.821999 14.623469 11.128222 41.800327 13.632314 9.469400 42.627083 17.585602 5.781768 42.336926 18.570782 6.831616 40.364098 20.398840 9.149078 36.946545 22.849285 12.454632 32.496475 25.626560 16.349577 27.550638 28.395681 20.364128 22.705574 30.822655 24.014071 18.545664 32.614754 26.859165 15.572659 33.555817 28.556255 14.145144 33.532345 28.900642 14.435300 32.547165 27.850796 16.408129 30.719110 25.533337 19.825680 28.268665 22.227783 24.275745 25.491392 18.332840 29.221581 22.722269 14.318290 34.066647 20.295296 10.668347 38.226559 18.503197 7.823250 41.199566 17.562132 6.126157 41.109146 21.555719 1.068933 40.776257 22.654591 1.984696 38.756165 24.609385 4.153217 35.292519 27.184326 7.312940 30.803083 30.068840 11.082758 25.829353 32.915009 15.007972 20.971235 35.379547 18.615143 16.814690 37.165188 21.469194 13.861053 38.056564 23.225887 12.466581 37.946159 23.673336 12.799466 36.847290 22.757572 14.819557 34.892494 20.589052 18.283203 32.317551 17.429331 22.772635 29.433041 13.659515 27.746363 26.586872 9.734303 32.604481 24.122334 6.127132 36.761028 22.336691 3.273078 39.714668 21.445314 1.516383 38.627655 25.070396 -4.694134 38.240345 26.247536 -3.905918 36.164669 28.283352 -1.868396 32.650982 30.932297 1.172676 28.123085 33.874866 4.850502 23.127115 36.756145 8.721481 18.265657 39.228607 12.318714 14.125073 40.994038 15.208323 11.204780 41.839500 17.041779 9.857007 41.663017 17.597940 10.244315 40.485878 16.809725 12.319991 38.450066 14.772205 15.833675 35.801117 11.731134 20.361568 32.858547 8.053309 25.357538 29.977270 4.182333 30.218996 27.504808 0.585098 34.359581 25.739374 -2.304513 37.279877 24.893915 -4.137970 35.244701 27.763985 -11.094314 34.794155 28.991686 -10.425950 32.659729 31.074875 -8.500063 29.098866 33.762283 -5.548943 24.541056 36.729771 -1.928538 19.536037 39.619419 1.924477 14.687496 42.082687 5.545370 10.580232 43.822479 8.497410 7.709643 44.628941 10.424537 6.421964 44.404800 11.094310 6.872507 43.177101 10.425947 9.006931 41.093914 8.500061 12.567794 38.406506 5.548943 17.125603 35.439018 1.928540 22.130617 32.549370 -1.924474 26.979160 30.086102 -5.545367 31.086426 28.346310 -8.497409 33.957016 27.539848 -10.424538 31.151981 29.368080 -17.599018 30.630020 30.623739 -17.044197 28.436966 32.730225 -15.211792 24.837339 35.433468 -12.322813 20.265303 38.407410 -8.725716 15.272316 41.293358 -4.854364 10.460606 43.743217 -1.175702 6.410535 45.461502 1.866574 3.610600 46.240963 3.905519 2.398518 45.987579 4.695204 2.920479 44.731922 4.140385 5.113530 42.625435 2.307979 8.713156 39.922195 -0.580997 13.285189 36.948254 -4.178092 18.278173 34.062305 -8.049443 23.089886 31.612444 -11.728107 27.139957 29.894157 -14.770384 29.939896 29.114700 -16.809330 26.627132 29.769325 -23.675652 26.024481 31.032137 -23.229477 23.775036 33.144352 -21.473625 20.150110 35.851212 -18.619877 15.586926 38.826225 -15.012441 10.635869 41.710560 -11.086423 5.894112 44.156326 -7.315362 1.933579 45.868526 -4.154101 -0.768031 46.640648 -1.983937 -1.884864 46.379555 -1.066623 -1.282215 45.116745 -1.512798 0.967230 43.004528 -3.268649 4.592152 40.297672 -6.122394 9.155334 37.322662 -9.729830 14.106390 34.438324 -13.655846 18.848148 31.992558 -17.426907 22.808683 30.280357 -20.588169 25.510296 29.508236 -22.758335 21.962570 29.014990 -28.905474 21.268017 30.262678 -28.562216 18.966108 32.366718 -26.865538 15.334488 35.073330 -24.020086 10.811184 38.056065 -20.369061 5.941772 40.955154 -16.352833 1.313579 43.420925 -12.455818 -2.515171 45.155972 -9.148054 -5.082673 45.951023 -6.828505 -6.079247 45.710175 -5.776941 -5.384696 44.462494 -6.120198 -3.082789 42.358452 -7.816875 0.548829 39.651840 -10.662327 5.072131 36.669106 -14.313348 9.941541 33.770020 -18.329575 14.569736 31.304245 -22.226589 18.398487 29.569197 -25.534357 20.965992 28.774147 -27.853909 17.401157 27.272192 -33.044487 16.602388 28.478689 -32.792923 14.254320 30.562078 -31.134449 10.640162 33.271076 -28.269102 6.195835 36.278934 -24.542479 1.457392 39.222858 -20.404068 -3.003639 41.747768 -16.353025 -6.649195 43.549126 -12.877963 -9.039568 44.409664 -10.398027 -9.886442 44.225578 -9.212335 -9.087674 43.019085 -9.463895 -6.739606 40.935696 -11.122368 -3.125450 38.226700 -13.987717 1.318874 35.218842 -17.714336 6.057315 32.274918 -21.852745 10.518347 29.750008 -25.903790 14.163905 27.948643 -29.378853 16.554281 27.088108 -31.858788 13.089686 24.761597 -36.029102 12.178218 25.898464 -35.845505 9.797875 27.951227 -34.194862 6.235765 30.672287 -31.276264 1.921528 33.733452 -27.441736 -2.624473 36.765495 -23.153782 -6.853923 39.402702 -18.929590 -10.256690 41.327000 -15.278660 -12.422349 42.306278 -12.641349 -13.089690 42.222427 -11.335754 -12.178222 41.085560 -11.519350 -9.797881 39.032803 -13.169991 -6.235773 36.311737 -16.088587 -1.921538 33.250576 -19.923115 2.624463 30.218536 -24.211067 6.853914 27.581324 -28.435261 10.256682 25.657026 -32.086189 12.422343 24.677746 -34.723503 9.082949 21.703339 -37.918415 8.062400 22.747938 -37.762718 5.678401 24.768965 -36.078529 2.218498 27.522650 -33.068989 -1.899994 30.676859 -29.097094 -6.180323 33.851147 -24.641912 -10.106217 36.662651 -20.240807 -13.204160 38.772263 -16.424616 -15.100490 39.925526 -13.653624 -15.566483 39.983345 -12.262057 -14.545935 38.938747 -12.417756 -12.161938 36.917725 -14.101943 -8.702037 34.164040 -17.111481 -4.583547 31.009830 -21.083372 -0.303219 27.835541 -25.538551 3.622678 25.024036 -29.939657 6.720621 22.914425 -33.755852 8.616953 21.761160 -36.526844 5.371840 18.290901 -38.828987 4.264019 19.238607 -38.651398 1.923765 21.244389 -36.889427 -1.366653 24.066313 -33.755592 -5.210363 27.364021 -29.627884 -9.143756 30.739756 -25.004162 -12.692406 33.786354 -20.442118 -15.428293 36.136356 -16.492001 -17.021433 37.506310 -13.630250 -17.279665 37.730988 -12.202039 -16.171844 36.783283 -12.379627 -13.831592 34.777504 -14.141598 -10.541175 31.955578 -17.275427 -6.697466 28.657873 -21.403133 -2.764074 25.282139 -26.026854 0.784576 22.235538 -30.588900 3.520467 19.885536 -34.539017 5.113606 18.515577 -37.400772 1.914354 14.683488 -38.887669 0.756090 15.553085 -38.644409 -1.478889 17.579868 -36.773178 -4.521012 20.519377 -33.499676 -8.003355 24.017063 -29.218737 -11.505894 27.651052 -24.446703 -14.606171 30.983034 -19.759153 -16.930248 33.611122 -15.721477 -18.197807 35.218327 -12.820673 -18.255962 35.610802 -11.406624 -17.097700 34.741203 -11.649883 -14.862721 32.714424 -13.521112 -11.820600 29.774914 -16.794611 -8.338259 26.277231 -21.075548 -4.835720 22.643242 -25.847580 -1.735442 19.311260 -30.535130 0.588637 16.683170 -34.572811 1.856199 15.075964 -37.473618 -1.313918 11.021830 -38.202301 -2.481848 11.847498 -37.868881 -4.550744 13.940134 -35.882675 -7.271069 17.047337 -32.483242 -10.314712 20.794329 -28.080601 -13.314562 24.729170 -23.205778 -15.908794 28.377258 -18.446751 -17.784506 31.298582 -14.377527 -18.715460 33.140785 -11.488914 -18.589369 33.681671 -10.129320 -17.421440 32.856007 -10.462734 -15.352544 30.763371 -12.448939 -12.632220 27.656170 -15.848373 -9.588579 23.909180 -20.251013 -6.588729 19.974340 -25.125834 -3.994496 16.326250 -29.884859 -2.118782 13.404925 -33.954086 -1.187827 11.562718 -36.842705 -4.302186 7.429386 -36.869415 -5.445383 8.246586 -36.442520 -7.302408 10.443111 -34.361362 -9.649278 13.754031 -30.876965 -12.202925 17.780001 -26.409590 -14.655341 22.035427 -21.498075 -16.710730 26.007040 -16.734821 -18.121180 29.215809 -12.694345 -18.716570 31.274708 -9.863988 -18.425089 31.935402 -8.585131 -17.281893 31.118202 -9.012026 -15.424868 28.921679 -11.093180 -13.077999 25.610760 -14.577576 -10.524353 21.584793 -19.044947 -8.071937 17.329369 -23.956459 -6.016548 13.357755 -28.719715 -4.606097 10.148984 -32.760193 -4.010705 8.090082 -35.590553 -6.998141 4.009809 -34.991135 -8.093750 4.845504 -34.482994 -9.717430 7.167247 -32.343449 -11.673343 10.695004 -28.830563 -13.725575 15.003274 -24.368040 -15.626598 19.572416 -19.494127 -17.147120 23.851322 -14.796692 -18.103745 27.323895 -10.842312 -18.381086 29.571293 -8.107944 -17.945698 30.322445 -6.923393 -16.850090 29.486750 -7.431535 -15.226410 27.165009 -9.571076 -13.270498 23.637253 -13.083961 -11.218266 19.328985 -17.546480 -9.317243 14.759845 -22.420391 -7.796720 10.480937 -27.117828 -6.840095 7.008362 -31.072212 -6.562751 4.760962 -33.806580 -9.332147 0.834331 -32.688732 -10.370099 1.703290 -32.119068 -11.765604 4.153050 -29.961357 -13.350343 7.888134 -26.475847 -14.933172 12.458036 -22.082943 -16.323181 17.311558 -17.312494 -17.352711 21.863289 -12.739889 -17.897589 25.564232 -8.916649 -17.892092 27.967991 -6.303912 -17.336885 28.784641 -5.216816 -16.298933 27.915684 -5.786478 -14.903429 25.465923 -7.944188 -13.318690 21.730843 -11.429697 -11.735861 17.160942 -15.822598 -10.345853 12.307423 -20.593046 -9.316321 7.755689 -25.165653 -8.771442 4.054746 -28.988895 -8.776938 1.650984 -31.601633 -11.258440 -2.069497 -30.094347 -12.239215 -1.162840 -29.483604 -13.432428 1.404556 -27.341364 -14.694162 5.323029 -23.926012 -15.872232 10.119952 -19.649488 -16.824545 15.216743 -15.027607 -17.436237 19.998655 -10.617838 -17.633533 23.888920 -6.952059 -17.392632 26.418314 -4.472419 -16.742592 27.281754 -3.477999 -15.761818 26.375099 -4.088739 -14.568604 23.807705 -6.230979 -13.306871 19.889233 -9.646330 -12.128801 15.092313 -13.922852 -11.176488 9.995522 -18.544731 -10.564795 5.213610 -22.954502 -10.367498 1.323343 -26.620281 -10.608398 -1.206054 -29.099924 -12.768213 -4.708061 -27.331791 -13.699398 -3.766325 -26.696983 -14.728356 -1.098774 -24.592251 -15.730981 2.972846 -21.271454 -16.586342 7.957438 -17.135132 -17.191267 13.253786 -12.682184 -17.472797 18.223070 -8.449704 -17.396973 22.265924 -4.948190 -16.972940 24.894720 -2.599976 -16.251844 25.792385 -1.688291 -15.320661 24.850651 -2.323096 -14.291702 22.183102 -4.427828 -13.289078 18.111483 -7.748622 -12.433718 13.126893 -11.884943 -11.828791 7.830547 -16.337889 -11.547261 2.861262 -20.570370 -11.623085 -1.181595 -24.071884 -12.047116 -3.810393 -26.420101 -13.885397 -7.105777 -24.503567 -14.778214 -6.135464 -23.856789 -15.685112 -3.387879 -21.799412 -16.496708 0.805573 -18.579582 -17.115110 5.939105 -14.585664 -17.465731 11.393534 -10.299379 -17.506279 16.510975 -6.237720 -17.231865 20.674191 -2.890580 -16.675587 23.381037 -0.661674 -15.904539 24.305027 0.180159 -15.011724 23.334713 -0.466618 -14.104825 20.587132 -2.523994 -13.293229 16.393681 -5.743821 -12.674828 11.260153 -9.737738 -12.324206 5.805725 -14.024021 -12.283658 0.688282 -18.085682 -12.558071 -3.474936 -21.432823 -13.114348 -6.181785 -23.661732 -14.666747 -9.300088 -21.677334 -15.532693 -8.308895 -21.025703 -16.356113 -5.500333 -19.016115 -17.037695 -1.213158 -15.890957 -17.495226 4.035534 -12.027169 -17.673521 9.612673 -7.890781 -17.551077 14.845572 -3.980704 -17.142662 19.103069 -0.768549 -16.497538 21.871645 1.358250 -15.693513 22.817371 2.143170 -14.827568 21.826178 1.491540 -14.004147 19.017620 -0.518047 -13.322566 14.730446 -3.643203 -12.865035 9.481756 -7.506989 -12.686739 3.904619 -11.643375 -12.809182 -1.328281 -15.553453 -13.217596 -5.585780 -18.765610 -13.862721 -8.354359 -20.892410 -15.168360 -11.320513 -18.903961 -16.017952 -10.316467 -18.250481 -16.791113 -7.465193 -16.281487 -17.394583 -3.110595 -13.234468 -17.755579 2.222102 -9.476942 -17.830557 7.889691 -5.462122 -17.610476 13.208577 -1.674255 -17.121878 17.537228 1.429787 -16.423697 20.353542 3.475612 -15.600143 21.317831 4.216462 -14.750551 20.313787 3.562981 -13.977391 17.462515 1.593987 -13.373920 13.107918 -1.453028 -13.012924 7.775225 -5.210552 -12.937945 2.107637 -9.225370 -13.158028 -3.211250 -13.013239 -13.646625 -7.539903 -16.117283 -14.344805 -10.356220 -18.163109 -15.457341 -13.200760 -16.206116 -16.298586 -12.190961 -15.550703 -17.046036 -9.312833 -13.611071 -17.609537 -4.913520 -10.621163 -17.921124 0.476357 -6.941609 -17.943213 6.206696 -3.016219 -17.673141 11.586334 0.681549 -17.143484 15.966409 3.705689 -16.418123 18.818619 5.691446 -15.584551 19.798946 6.399308 -14.743306 18.789148 5.743897 -13.995856 15.911022 3.804265 -13.432355 11.511711 0.814360 -13.120769 6.121838 -2.865192 -13.098679 0.391500 -6.790582 -13.368750 -4.988140 -10.488350 -13.898407 -9.368217 -13.512491 -14.623766 -12.220431 -15.498251 -15.591489 -14.966376 -13.600168 -16.429790 -13.957111 -12.940178 -17.167938 -11.066657 -11.015369 -17.716898 -6.643641 -8.057903 -18.010460 -1.221546 -4.424493 -18.013214 4.545643 -0.553383 -17.724831 9.962317 3.088513 -17.180090 14.375146 6.061932 -16.444698 17.251879 8.008232 -15.607352 18.245537 8.692663 -14.769052 17.236275 8.032675 -14.030904 14.345821 6.107867 -13.481943 9.922809 3.150403 -13.188381 4.500716 -0.483006 -13.185627 -1.266472 -4.354115 -13.474010 -6.683146 -7.996012 -14.018750 -11.095978 -10.969431 -14.754142 -13.972713 -12.915735 -15.624997 -16.641966 -11.092587 -16.462946 -15.638383 -10.423549 -17.199827 -12.748577 -8.497280 -17.746759 -8.321101 -5.546118 -18.037777 -2.889976 -1.926015 -18.037777 2.889725 1.926390 -17.746761 8.320883 5.546440 -17.199831 12.748423 8.497503 -16.462952 15.638316 10.423640 -15.625003 16.642000 11.092527 -14.787054 15.638419 10.423491 -14.050174 12.748614 8.497223 -13.503241 8.321141 5.546062 -13.212223 2.890019 1.925961 -13.212222 -2.889681 -1.926443 -13.503237 -8.320840 -5.546493 -14.050168 -12.748382 -8.497559 -14.787047 -15.638279 -10.423697 -15.607663 -18.244593 -8.694071 -16.444986 -17.251093 -8.009382 -17.180323 -14.374608 -6.062693 -17.724977 -9.962088 -3.088800 -18.013260 -4.545744 0.553601 -18.010397 1.221129 4.425182 -17.716736 6.642961 8.058972 -17.167696 11.065801 11.016684 -16.429499 13.956189 12.941574 -15.591182 14.965501 13.601471 -14.753860 13.972001 12.916784 -14.018523 11.095518 10.970097 -13.473867 6.683001 7.996204 -13.185585 1.266660 4.353806 -13.188447 -4.500211 0.482226 -13.482108 -9.922045 -3.151565 -14.031148 -14.344886 -6.109279 -14.769345 -17.235277 -8.034171 -15.585720 -19.797182 -6.401866 -16.419214 -18.817038 -5.693662 -17.144365 -15.965196 -3.707301 -17.673708 -11.585629 -0.682367 -17.943398 -6.206579 3.016288 -17.920902 -0.476839 6.942553 -17.608938 4.912498 10.622858 -17.045130 9.311400 13.613309 -16.297485 12.189297 15.553211 -15.456178 13.199067 16.208584 -14.622683 12.218925 15.500381 -13.897532 9.367083 13.514023 -13.368189 4.987519 10.489090 -13.098500 -0.391528 6.790436 -13.120995 -6.121266 2.864173 -13.432959 -11.510604 -0.816134 -13.996765 -15.909510 -3.806586 -14.744411 -18.787409 -5.746491 -15.602850 -21.315063 -4.220317 -16.426226 -20.350996 -3.478981 -17.123924 -17.535206 -1.432270 -17.611794 -13.207319 1.672952 -17.830988 -7.889341 5.462151 -17.755072 -2.222701 9.478292 -17.393198 3.109121 13.236969 -16.789019 7.463031 16.284830 -16.015402 10.313881 18.254259 -15.165661 11.317818 18.907715 -14.342285 10.353751 18.166380 -13.644587 7.537964 16.119671 -13.156718 3.210078 13.014449 -12.937523 -2.107896 9.225252 -13.013440 -7.774535 5.209112 -13.375312 -13.106359 1.450435 -13.979492 -17.460270 -1.597429 -14.753107 -20.311123 -3.566860 -15.698283 -22.813595 -2.148056 -16.501993 -21.868122 -1.362509 -17.146265 -19.100220 0.765425 -17.553394 -14.843735 3.979085 -17.674273 -9.612062 7.890856 -17.494322 -4.036221 12.028921 -17.035246 1.211259 15.894167 -16.352415 5.497458 19.020390 -15.528190 8.305393 21.030519 -14.661984 9.296391 21.682106 -13.858275 8.350920 20.896561 -13.214003 5.583018 18.768627 -12.806873 1.326535 15.554970 -12.685994 -3.905135 11.643200 -12.865946 -9.480974 7.505136 -13.325022 -14.728456 3.639890 -14.007852 -19.014656 0.513665 -14.832076 -21.822596 -1.496468 -15.912259 -24.299894 -0.186053 -16.682795 -23.376165 0.656531 -17.237694 -20.670162 2.886805 -17.510027 -16.508268 6.235761 -17.466946 -11.392470 10.299469 -17.113646 -5.939809 14.587783 -16.492743 -0.807958 18.583469 -15.679126 3.384109 21.804590 -14.770928 6.130766 23.862633 -13.877693 7.100725 24.509361 -13.107157 6.176997 23.666779 -12.552258 3.470996 21.436508 -12.279924 -0.690896 18.087553 -12.323006 -5.806691 14.023847 -12.676305 -11.259350 9.735534 -13.297207 -16.391203 5.739846 -14.110825 -20.583271 2.518723 -15.019022 -23.329933 0.460680 -16.263086 -25.785679 1.681853 -16.983402 -24.888405 2.594539 -17.405392 -22.260756 4.944404 -17.478161 -18.219666 8.448021 -17.192930 -13.252550 12.682801 -16.584103 -7.958517 17.137968 -15.725114 -2.976107 21.276161 -14.719567 1.093733 24.598255 -13.688749 3.760117 26.703556 -12.756991 4.701439 27.338131 -12.036675 3.804166 26.425447 -11.614684 1.176518 24.075584 -11.541915 -2.864568 20.571968 -11.827146 -7.831682 16.337191 -12.435972 -13.125713 11.882025 -13.294962 -18.108126 7.743832 -14.300508 -22.177967 4.421736 -15.331326 -24.844353 2.316433 -16.756092 -27.274136 3.472388 -17.405151 -26.411160 4.467852 -17.643564 -23.883091 6.949082 -17.442572 -19.994846 10.616806 -16.826418 -15.215407 15.028639 -15.869419 -10.121246 19.652452 -14.687006 -5.326795 23.930544 -13.421794 -1.410332 27.346912 -12.226385 1.155759 29.489494 -11.244965 2.061967 30.099861 -10.595905 1.198994 29.104401 -10.357493 -1.329074 26.623171 -10.558485 -5.217316 22.955450 -11.174639 -9.996753 18.543619 -12.131636 -15.090913 13.919806 -13.314049 -19.885365 9.641714 -14.579261 -23.801830 6.225344 -15.774670 -26.367924 4.082758 -17.351767 -28.776361 5.212740 -17.905813 -27.960318 6.300884 -17.908495 -25.558083 8.915026 -17.359489 -21.859402 12.739865 -16.325014 -17.310392 17.314066 -14.929841 -12.459729 22.085915 -13.342252 -7.892477 26.479855 -11.753731 -4.159513 29.965910 -10.355878 -1.711084 32.123615 -9.317295 -0.842512 32.692719 -8.763248 -1.658555 31.604574 -8.760567 -4.060787 28.990433 -9.309572 -7.759466 25.165596 -10.344047 -12.308475 20.591396 -11.739218 -17.159136 15.819550 -13.326807 -21.726389 11.425610 -14.915328 -25.459354 7.939552 -16.313181 -27.907787 5.781844 -17.965210 -30.311451 6.920716 -18.398952 -29.561226 8.106459 -18.117809 -27.315966 10.842194 -17.155691 -23.846478 14.797949 -15.628644 -19.571234 19.496607 -13.720851 -15.005893 24.371435 -11.662422 -10.701101 28.834457 -9.701632 -7.176081 32.347370 -8.074983 -4.856002 34.486465 -6.978672 -4.020700 34.993732 -6.544928 -4.770922 33.807991 -6.826070 -7.016182 31.072258 -7.788187 -10.485666 27.116505 -9.315233 -14.760908 22.417849 -11.223025 -19.326248 17.543022 -13.281454 -23.631041 13.079998 -15.242245 -27.156063 9.567082 -16.868895 -29.476145 7.427987 -18.444687 -31.924046 8.585096 -18.734264 -31.264654 9.865056 -18.134838 -29.208263 12.696385 -16.718708 -26.002903 16.737583 -14.656679 -22.035191 21.501225 -12.197465 -17.783689 26.412739 -9.637683 -13.761195 30.879726 -7.286079 -10.452878 34.363403 -5.426292 -8.257769 36.443588 -4.282640 -7.440631 36.869377 -3.993063 -8.100022 35.589420 -4.592489 -10.156412 32.758095 -6.008618 -13.361770 28.716896 -8.070644 -17.329481 23.953259 -10.529858 -21.580980 19.041746 -13.089641 -25.603476 14.574757 -15.441244 -28.911795 11.091076 -17.301033 -31.106907 9.010889 -18.607834 -33.670673 10.131820 -18.731821 -33.131397 11.492248 -17.796793 -31.291931 14.381289 -15.915527 -28.374136 18.450485 -13.314934 -24.729948 23.209030 -10.308681 -20.798906 28.082975 -7.259370 -17.055153 32.484444 -4.534791 -13.950242 35.882565 -2.463568 -11.858669 37.867466 -1.295521 -11.032708 38.199741 -1.171534 -11.571982 36.839317 -2.106561 -13.411448 33.950279 -3.987824 -16.329241 29.881083 -6.588417 -19.973427 25.122538 -9.594667 -23.904467 20.248596 -12.643979 -27.648220 15.847122 -15.368559 -30.753134 12.449001 -17.439783 -32.844711 10.464098 -18.273399 -35.600266 11.411421 -18.212826 -35.209770 12.825915 -16.941042 -33.605568 15.726530 -14.611442 -30.981140 19.763409 -11.505012 -27.653042 24.449644 -7.996431 -24.022684 29.220007 -4.508891 -20.527946 33.499115 -1.463035 -17.590345 36.770859 0.773759 -15.564197 38.640602 1.931700 -14.693884 38.882835 1.871128 -15.084379 37.468346 0.599343 -16.688583 34.567730 -1.730255 -19.313007 30.530855 -4.836684 -22.641106 25.844622 -8.345262 -26.271460 21.074261 -11.832804 -29.766199 16.795147 -14.878660 -32.703800 13.523406 -17.115456 -34.729954 11.653655 -17.291914 -37.723682 12.207134 -17.031359 -37.500969 13.635231 -15.434706 -36.133614 16.496265 -12.694537 -33.786533 20.445154 -9.141356 -30.742825 25.005604 -5.203729 -27.369600 29.627556 -1.356595 -24.073725 33.753532 1.936029 -21.252728 36.885883 4.277003 -19.246862 38.646797 5.383970 -18.298065 38.823887 5.123416 -18.520775 37.395790 3.526765 -19.888132 34.534760 0.786597 -22.235210 30.585873 -2.766582 -25.278919 26.025425 -6.704207 -28.652142 21.403475 -10.551343 -31.948017 17.277496 -13.843968 -34.769016 14.145144 -16.184944 -36.774883 12.384224 -15.575989 -39.977974 12.267365 -15.107668 -39.921947 13.658223 -13.208153 -38.770897 16.427952 -10.106554 -36.663654 20.242485 -6.176969 -33.854389 24.641729 -1.893364 -30.681940 29.095074 2.227592 -27.528950 33.065372 5.688855 -24.775715 36.073761 8.072943 -22.754318 37.757374 9.092301 -21.708567 37.913143 8.623981 -21.764595 36.522285 6.724468 -22.915646 33.752556 3.622870 -25.022882 29.938028 -0.306713 -27.832146 25.538784 -4.590316 -31.004595 21.085442 -8.711273 -34.157585 17.115139 -12.172537 -36.910824 14.106750 -14.556628 -38.932220 12.423138 -13.098382 -42.218063 11.341891 -12.428619 -42.303440 12.646147 -10.259791 -41.326027 15.281545 -6.853494 -39.403706 18.930222 -2.620574 -36.768337 23.152092 1.928414 -33.737789 27.437935 6.244793 -30.677586 31.270813 9.807948 -27.956841 34.188431 12.188108 -25.903706 35.838875 13.098191 -24.765825 36.023075 12.428429 -24.680445 34.718826 10.259604 -25.657856 32.083424 6.853307 -27.580179 28.434750 2.620389 -30.215546 24.212883 -1.928597 -33.246094 19.927040 -6.244978 -36.306297 16.094160 -9.808134 -39.027042 13.176542 -12.188296 -41.080177 11.526096 -9.892659 -44.223072 9.217680 -9.043694 -44.408134 10.401724 -6.650745 -43.548756 12.879577 -3.002439 -41.748596 16.352371 1.461185 -39.224773 20.401241 6.201748 -36.281700 24.537828 10.647467 -33.274361 28.263203 14.262124 -30.565470 31.128025 16.609737 -28.481773 32.786758 17.407152 -27.274593 33.039337 16.558187 -27.089531 31.855297 14.165240 -27.948906 29.377445 10.516936 -29.749069 25.904652 6.053314 -32.272888 21.855783 1.312752 -35.215958 17.719196 -3.132967 -38.223301 13.993823 -6.747626 -40.932190 11.128998 -9.095243 -43.015884 9.470259 -6.082735 -45.709259 5.780507 -5.084556 -45.950542 6.830448 -2.515239 -45.155987 9.148154 1.315320 -43.421429 12.454082 5.945098 -40.956078 16.349483 10.815677 -38.057297 20.364519 15.339590 -35.074718 24.014912 18.971188 -32.368084 26.860371 21.272448 -30.263857 28.557697 21.965803 -29.015839 28.902164 20.967627 -28.774553 27.852224 18.398312 -29.569109 25.534519 14.567754 -31.303665 22.228592 9.937978 -33.769016 18.333191 5.067401 -36.667797 14.318159 0.543487 -39.650375 10.667765 -3.088115 -42.357010 7.822302 -5.389378 -44.461239 6.124975 -1.886203 -46.379463 1.068234 -0.768166 -46.640606 1.984067 1.934647 -45.868542 4.152754 5.896240 -44.156395 7.312716 10.638784 -41.710674 11.082819 15.590260 -38.826366 15.008331 20.153442 -35.851364 18.615776 23.777948 -33.144497 21.470045 26.026609 -31.032255 23.226871 26.628202 -29.769403 23.674355 25.510166 -29.508259 22.758522 22.807354 -30.280323 20.589836 18.845764 -31.992468 17.429876 14.103222 -34.438187 13.659775 9.151748 -37.322495 9.734263 4.588563 -40.297497 6.126818 0.964055 -43.004360 3.272547 -1.284608 -45.116604 1.515719 2.396898 -45.987907 -4.692870 3.610030 -46.241051 -3.904719 6.411066 -45.461342 -1.867383 10.462158 -43.742836 1.173408 15.274688 -41.292801 4.850887 20.268190 -38.406754 8.721498 24.840376 -35.432785 12.318384 28.439772 -32.729614 15.207712 30.632236 -30.623270 17.040985 31.153330 -29.367813 17.597082 29.940201 -29.114670 16.808933 27.139166 -29.894375 14.771597 23.088074 -31.612885 11.730808 18.275547 -34.062916 8.053330 13.282046 -36.948963 4.182722 8.709860 -39.922928 0.585834 5.110462 -42.626106 -2.303495 2.917993 -44.732449 -4.136771 6.420932 -44.405396 -11.092510 7.709474 -44.629036 -10.424231 10.580931 -43.822075 -8.498607 14.688965 -42.081841 -5.547898 19.538086 -39.618237 -1.928004 24.543419 -36.728405 1.924463 29.101242 -33.760906 5.544837 32.661823 -31.073662 8.496449 34.795696 -28.990793 10.423292 35.245487 -27.763527 11.092958 33.956947 -27.539886 10.424680 31.085493 -28.346848 8.499057 26.977461 -30.087078 5.548351 22.128342 -32.550682 1.928458 17.123011 -35.440514 -1.924007 12.565185 -38.408012 -5.544382 9.004602 -41.095257 -8.495997 6.870726 -43.178123 -10.422841 9.857864 -41.662041 -17.599777 11.206259 -41.837860 -17.044916 14.126985 -40.991943 -15.212357 18.267759 -39.226330 -12.323133 23.129143 -36.753967 -8.725725 28.124783 -33.873066 -4.854037 32.652126 -30.931108 -1.175051 36.165115 -28.282928 1.867494 38.240028 -26.247942 3.906623 38.626598 -25.071596 4.696385 37.278206 -24.895775 4.141527 34.357483 -25.741690 2.308969 30.216709 -27.507303 -0.580255 25.355328 -29.979662 -4.177660 20.359690 -32.860561 -8.049347 15.832343 -35.802521 -11.728334 12.319353 -38.450699 -14.770882 10.244438 -40.485691 -16.810013 12.467755 -37.943748 -23.676573 13.862687 -38.053284 -23.230347 16.816578 -37.161449 -21.474316 20.973145 -35.375813 -18.620285 25.831043 -32.911751 -15.012493 30.804340 -30.066465 -11.086090 35.293182 -27.183138 -7.314664 38.756149 -24.609543 -4.153099 40.775555 -22.656094 -1.982728 41.107830 -21.558401 -1.065331 39.712898 -21.448866 -1.511557 36.759010 -22.340702 -3.267585 32.602444 -24.126335 -6.121614 27.744549 -26.590397 -9.729405 22.771252 -29.435682 -13.655805 18.282410 -32.319008 -17.427235 14.819441 -34.892605 -20.588799 12.800033 -36.846058 -22.759172 14.145473 -33.531174 -28.901836 15.573307 -33.553413 -28.558689 18.546549 -32.611420 -26.862530 22.706585 -30.818817 -24.017935 27.551651 -28.391821 -20.368008 32.497360 -25.623158 -16.352980 36.947186 -22.846773 -12.457128 40.364418 -20.397541 -9.150346 42.336884 -18.570871 -6.831481 42.626678 -17.587088 -5.780224 41.198845 -17.564850 -6.123369 38.225605 -18.506842 -7.819529 34.065575 -20.299442 -10.664122 29.220509 -22.726439 -14.314048 24.274799 -25.495100 -18.329073 19.824972 -28.271482 -22.224926 16.407738 -30.720720 -25.531708 14.435268 -32.547390 -27.850574 14.917938 -28.705292 -33.045021 16.362177 -28.616806 -32.793434 19.340466 -27.625130 -31.134865 23.493576 -25.849873 -28.269350 28.320583 -23.505157 -24.542519 33.239277 -20.873793 -20.403879 37.656391 -18.273157 -16.352617 41.039158 -16.016930 -12.877370 42.979565 -14.377239 -10.397304 43.243568 -13.551861 -9.211554 41.799332 -13.640346 -9.463137 38.821045 -14.632021 -11.121709 34.667934 -16.407276 -13.987219 29.840931 -18.751991 -17.714048 24.922237 -21.383356 -21.852686 20.505123 -23.983992 -25.903950 17.122353 -26.240221 -29.379198 15.181944 -27.879913 -31.859264 14.899465 -23.714947 -36.030308 16.339754 -23.494074 -35.846653 19.307655 -22.459305 -34.195805 23.445192 -20.735445 -31.276878 28.253319 -18.530420 -27.441940 33.152103 -16.110188 -23.153542 37.550678 -13.766667 -18.928928 40.918514 -11.782516 -15.277645 42.849396 -10.397057 -12.640096 43.110435 -9.777392 -11.334405 41.670147 -9.998266 -11.518059 38.702248 -11.033035 -13.168905 34.564713 -12.756892 -16.087830 29.756588 -14.961917 -19.922764 24.857803 -17.382147 -24.211163 20.459229 -19.725670 -28.435778 17.091391 -21.709820 -32.087063 15.160504 -23.095282 -34.724613 14.254209 -18.717684 -37.918488 15.669124 -18.356123 -37.762787 18.611372 -17.302025 -36.078590 22.726078 -15.682524 -33.069031 27.516947 -13.692960 -29.097107 32.406124 -11.573303 -24.641891 36.803909 -9.579216 -20.240751 40.179859 -7.951213 -16.424526 42.126789 -6.885656 -13.653509 42.409870 -6.511068 -12.261927 40.994957 -6.872628 -12.417622 38.052708 -7.926727 -14.101819 33.938004 -9.546227 -17.111376 29.147139 -11.535789 -21.083298 24.257961 -13.655445 -25.538513 19.860176 -15.649533 -29.939655 16.484222 -17.277536 -33.755882 14.537290 -18.343094 -36.526901 13.154503 -13.796513 -38.829433 14.529137 -13.310940 -38.651802 17.436310 -12.287237 -36.889740 21.525373 -10.848880 -33.755779 26.303127 -9.169352 -29.627918 31.193300 -7.451230 -25.004042 35.606068 -5.901748 -20.441860 39.009186 -4.707792 -16.491634 40.992191 -4.013374 -13.629823 41.315895 -3.902249 -12.201602 39.941261 -4.387821 -12.379234 37.034092 -5.411522 -14.141294 32.945030 -6.849880 -17.275253 28.167278 -8.529408 -21.403112 23.277105 -10.247528 -26.026985 18.864336 -11.797010 -30.589169 15.461215 -12.990967 -34.539394 13.478210 -13.685387 -37.401207 11.759220 -9.003184 -38.886883 13.091471 -8.434890 -38.643768 15.964219 -7.512313 -36.772766 20.030970 -6.346729 -33.499550 24.801216 -5.078725 -29.218906 29.699591 -3.861242 -24.447153 34.135281 -2.841125 -19.759836 37.573273 -2.141416 -15.722307 39.598900 -1.846510 -12.821558 39.967838 -1.991977 -11.407459 38.635590 -2.560270 -11.650571 35.762844 -3.482847 -13.521572 31.696093 -4.648430 -16.794788 26.925850 -5.916434 -21.075430 22.027475 -7.133917 -25.847181 17.591785 -8.154034 -30.534500 14.153789 -8.853745 -34.572029 12.128160 -9.148651 -37.472778 10.202206 -4.372631 -38.202415 11.501224 -3.774027 -37.868980 14.347952 -3.028707 -35.882748 18.399035 -2.226567 -32.483288 23.165850 -1.464356 -28.080622 28.073450 -0.834009 -23.205778 32.529903 -0.411555 -18.446735 35.997700 -0.247948 -14.377505 38.058571 -0.362921 -11.488895 38.463943 -0.742608 -10.129313 37.164928 -1.341211 -10.462746 34.318199 -2.086531 -12.448975 30.267120 -2.888671 -15.848434 25.500307 -3.650882 -20.251097 20.592709 -4.281229 -25.125938 16.136251 -4.703683 -29.884981 12.668454 -4.867290 -33.954216 10.607581 -4.752318 -36.842827 8.585201 0.011240 -36.869484 9.864545 0.592627 -36.442608 12.695332 1.102521 -34.361473 16.736128 1.479423 -30.877087 21.499552 1.677871 -26.409719 26.411068 1.673931 -21.498205 30.878269 1.468078 -16.734943 34.362350 1.085140 -12.694455 36.443077 0.571306 -9.864078 36.869484 -0.011449 -8.585201 35.590141 -0.592835 -9.012075 32.759357 -1.102730 -11.093212 28.718563 -1.479631 -14.577595 23.955139 -1.678080 -19.044958 19.043627 -1.674140 -23.956470 14.576424 -1.468287 -28.719734 11.092340 -1.085350 -32.760223 9.011611 -0.571516 -35.590603 6.971740 4.055659 -34.991211 8.243273 4.586638 -34.483063 11.065798 4.831906 -32.343510 15.098879 4.761879 -28.830624 19.856066 4.385005 -24.368097 24.763569 3.746738 -19.494188 29.229473 2.924064 -14.796761 32.715126 2.016210 -10.842387 34.800102 1.132676 -8.108030 35.232925 0.380029 -6.923489 33.961395 -0.150950 -7.431637 31.138870 -0.396218 -9.571187 27.105793 -0.326191 -13.084072 22.348608 0.050683 -17.546595 17.441105 0.688950 -22.420502 12.975201 1.511623 -27.117931 9.489547 2.419477 -31.072304 7.404566 3.303011 -33.806667 5.388670 7.663244 -32.689156 6.660145 8.127762 -32.119488 9.479419 8.111685 -29.961731 13.506445 7.616950 -26.476141 18.255505 6.703230 -22.083134 23.153791 5.480734 -17.312571 27.610497 4.096913 -12.739854 31.088079 2.718675 -8.916516 33.167091 1.512258 -6.303712 33.596771 0.623171 -5.216582 32.325294 0.158652 -5.786251 29.506023 0.174729 -7.944007 25.478998 0.669463 -11.429593 20.729942 1.583182 -15.822598 15.831657 2.805677 -20.593161 11.374950 4.189499 -25.165878 7.897366 5.567737 -28.989216 5.818352 6.774155 -31.602024 3.837049 10.784647 -30.094490 5.112621 11.180704 -29.483749 7.932657 10.930382 -27.341503 11.957019 10.063874 -23.926138 16.700310 8.685694 -19.649601 21.590420 6.962069 -15.027704 26.037525 5.100896 -10.617918 29.505243 3.326659 -6.952127 31.575315 1.853356 -4.472478 31.998060 0.858691 -3.478053 30.722490 0.462634 -4.088796 27.902456 0.712955 -6.231040 23.878096 1.579462 -9.646402 19.134808 2.957641 -13.922937 14.244699 4.681265 -18.544832 9.797592 6.542439 -22.954620 6.329872 8.316675 -26.620411 4.259797 9.789979 -29.100063 2.306895 13.409804 -27.332752 3.588035 13.745470 -26.697962 6.412662 13.303102 -24.593140 10.440084 12.136058 -21.272158 15.184533 10.385100 -17.135578 20.073759 8.261418 -12.682329 24.518049 6.021164 -8.449544 27.981358 3.934542 -4.947755 30.045958 2.253229 -2.599331 30.462828 1.180018 -1.687526 29.181688 0.844352 -2.322315 26.357063 1.286719 -4.427136 22.329643 2.453762 -7.748116 17.585196 4.204720 -11.884695 12.695971 6.328399 -16.337942 8.251679 8.568654 -20.570728 4.788369 10.655277 -24.072517 2.723767 12.336590 -26.420946 0.789012 15.577466 -24.503971 2.075707 15.865559 -23.857157 4.908604 15.277264 -21.799709 8.946012 13.883539 -18.579788 13.700964 11.852487 -14.585765 18.599937 9.429083 -10.299374 23.052044 6.905625 -6.237622 26.520298 4.586483 -2.890412 28.586374 2.751373 -0.661470 29.001076 1.621642 0.180363 27.714380 1.333549 -0.466451 24.881485 1.921844 -2.523896 20.844078 3.315568 -5.743815 16.089130 5.346619 -9.737839 11.190158 7.770022 -14.024227 6.738049 10.293478 -18.085979 3.269794 12.612623 -21.433191 1.203714 14.447732 -23.662136 -0.720886 17.353256 -21.676247 0.570526 17.607487 -21.024654 3.414583 16.916040 -19.015245 7.468250 15.362314 -15.890385 12.242595 13.133711 -12.026976 17.161760 10.499035 -7.891004 21.632420 7.776066 -3.981328 25.115351 5.293234 -0.769512 27.190458 3.350006 1.357052 27.607452 2.180761 2.141868 26.316042 1.926530 1.490277 23.471987 2.617977 -0.519130 19.418322 4.171701 -3.643989 14.643979 6.400302 -7.507396 9.724814 9.034978 -11.643368 5.254153 11.757947 -15.553043 1.771220 14.240780 -18.764862 -0.303890 16.184010 -20.891426 -2.219485 18.795944 -18.904533 -0.925158 19.029709 -18.251064 1.930687 18.273718 -16.282028 6.003591 16.619154 -13.234914 10.802302 14.265581 -9.477251 15.748024 11.496877 -5.462270 20.244230 8.646987 -1.674238 23.748611 6.059651 1.429955 25.838490 4.046938 3.475898 26.261793 2.851613 4.216818 24.967466 2.617847 3.563351 22.111624 3.373837 1.594314 18.038721 5.028401 -1.452798 13.240012 7.381971 -5.210459 8.294291 10.150675 -9.225438 3.798084 13.000565 -13.013472 0.293700 15.587902 -16.117668 -1.796181 17.600615 -18.163612 -3.703264 19.986389 -16.206762 -2.408167 20.210070 -15.551290 0.458032 19.418400 -13.611538 4.549631 17.706867 -10.621469 9.373121 15.281907 -6.941731 14.346718 12.436007 -3.016153 18.870529 9.512423 0.681780 22.398922 6.863784 3.706045 24.506317 4.809554 5.691871 24.938532 3.597503 6.399737 23.643436 3.373822 5.744266 20.777239 4.165491 3.804515 16.685642 5.877022 0.814448 11.862154 8.301980 -2.865288 6.888559 11.147880 -6.790865 2.364745 14.071463 -10.488798 -1.163649 16.720104 -13.513065 -3.271047 18.774334 -15.498893 -5.166954 20.987476 -13.597084 -3.873645 21.208721 -12.937270 -1.001086 20.402441 -11.013004 3.104250 18.665888 -8.056379 7.947199 16.208513 -4.424009 12.943629 13.326714 -0.554010 17.490896 10.368078 3.086836 21.040535 7.689458 6.059393 23.164404 5.613938 8.005124 23.606337 4.391856 8.689346 22.313028 4.170611 8.029534 19.440472 4.976889 6.105269 15.335138 6.713442 3.148647 10.492191 9.170815 -0.483722 5.495762 12.052612 -4.353720 0.948494 15.011250 -7.994567 -2.601146 17.689869 -10.967125 -4.725020 19.765388 -12.912859 -6.598434 21.851801 -11.095069 -5.310406 22.075737 -10.425900 -2.439552 21.269125 -8.499231 1.667860 19.529253 -5.547445 6.516417 17.065975 -1.926571 11.521310 14.176401 1.926658 16.078873 11.209055 5.547486 19.639399 8.521841 8.499189 21.773438 6.438879 10.425749 22.223589 5.211403 11.094792 20.935562 4.987467 10.425624 18.064711 5.794077 8.498956 13.957300 7.533948 5.547171 9.108746 9.997224 1.926300 4.103855 12.886798 -1.926929 -0.453710 15.854144 -5.547758 -4.014240 18.541359 -8.499462 -6.148280 20.624323 -10.426023 -7.996110 22.638840 -8.694574 -6.717063 22.867233 -8.009865 -3.858331 22.065819 -6.063108 0.235282 20.331257 -3.089112 5.070026 17.872761 0.553417 10.062758 14.986864 4.425135 14.611280 12.021648 8.059054 18.166975 9.334762 11.016872 20.300974 7.250282 12.941833 20.755884 6.019628 13.601757 19.476839 5.791235 12.917048 16.618109 6.592650 10.970294 12.524497 8.327210 7.996299 7.689755 10.785705 4.353771 2.697024 13.671598 0.482054 -1.851499 16.636814 -3.151866 -5.407197 19.323702 -6.109686 -7.541198 21.408184 -8.034649 -9.351471 23.396221 -6.402538 -8.085900 23.627964 -5.694316 -5.253621 22.830027 -3.707870 -1.196244 21.098652 -0.682796 3.596848 18.642670 3.016038 8.547539 15.758307 6.942498 13.058701 12.793461 10.622993 16.586222 10.105738 13.613604 18.704630 8.019313 15.553617 19.158417 6.785842 16.209040 17.892849 6.554099 15.500818 15.060571 7.352036 13.514374 11.003196 9.083407 10.489302 6.210106 11.539389 6.790469 1.259416 14.423750 2.864010 -3.251746 17.388596 -0.816486 -6.779269 20.076321 -3.807099 -8.897682 22.162746 -5.747114 -10.657550 24.170057 -4.220764 -9.410973 24.401081 -3.479397 -6.623633 23.597391 -1.432618 -2.631727 21.855928 1.672703 2.083265 19.386736 5.462018 6.952642 16.487637 9.478279 11.389087 13.508307 13.237065 14.857499 10.808092 16.285011 16.939537 8.712682 18.254494 17.384077 7.474813 18.907959 16.137501 7.243790 18.166594 13.350163 8.047478 16.119816 9.358258 9.788940 13.014496 4.643270 12.258131 9.225183 -0.226107 15.157228 5.208922 -4.662553 18.136560 1.450136 -8.130968 20.836775 -1.597813 -10.213009 22.932186 -3.567297 -11.909538 25.001236 -2.146790 -10.688810 25.224588 -1.361367 -7.969344 24.398722 0.766291 -4.079147 22.623245 3.979558 0.512567 20.112310 7.890866 5.251967 17.168770 12.028454 9.567411 14.147663 15.893265 12.938396 11.413374 19.019150 14.958330 9.295702 21.029079 15.383578 8.050069 21.680624 14.162852 7.826715 20.895203 11.443387 8.652581 18.767546 7.553192 10.428055 15.554281 2.961480 12.938990 11.642975 -1.777919 15.882527 7.505388 -6.093365 18.903637 3.640576 -9.464352 21.637924 0.514689 -11.484287 23.755598 -1.495241 -13.087865 25.930462 -0.186337 -11.902627 26.135887 0.656256 -9.281743 25.263416 2.886558 -5.541331 23.418280 6.235559 -1.132539 20.823029 10.299324 3.412867 17.790689 14.587700 7.546643 14.687006 18.583445 10.770196 11.886330 21.804615 12.694718 9.726463 23.862690 13.088082 8.467917 24.509434 11.902846 8.262492 23.666843 9.281964 9.134962 21.436543 5.541554 10.980099 18.087542 1.132764 13.575348 14.023779 -3.412641 16.607685 9.735404 -7.546418 19.711369 5.739658 -10.769974 22.512045 2.518486 -12.694498 24.671913 0.460410 -14.198614 26.977512 1.681296 -13.061417 27.152643 2.594018 -10.574928 26.204182 4.943970 -7.039056 24.246525 8.447714 -2.880278 21.515797 12.682647 1.399795 18.341362 17.137970 5.284921 15.106106 21.276310 8.306499 12.200250 24.598518 10.100084 9.974279 26.703888 10.449339 8.696678 27.338486 9.312142 8.521548 26.425766 6.825655 9.470008 24.075813 3.289785 11.427663 20.572071 -0.868992 14.158390 16.337141 -5.149063 17.332823 11.881817 -9.034191 20.568077 7.743479 -12.055772 23.473936 4.421268 -13.849358 25.699909 2.315893 -15.245874 28.145916 3.473923 -14.173788 28.276730 4.469146 -11.864560 27.219620 6.949966 -8.596720 25.102091 10.617161 -4.764414 22.179546 15.028412 -0.829878 18.804491 19.651657 2.732325 15.384004 23.929260 5.492543 12.330647 27.345287 7.117852 10.012701 29.487709 7.412215 8.709743 30.098122 6.340130 8.578929 29.102900 4.030904 9.636038 26.622080 0.763064 11.753565 22.954887 -3.069239 14.676107 18.543640 -7.003775 18.051163 13.920397 -10.565979 21.471651 9.642790 -13.326199 24.525007 6.226763 -14.951509 26.842957 4.084337 -16.243759 29.416031 5.212296 -15.260136 29.487764 6.300545 -13.178658 28.288820 8.914824 -10.250382 25.963806 12.739815 -6.828504 22.793156 17.314165 -3.325752 19.159292 22.086140 -0.164611 15.500519 26.480167 2.273641 12.258135 29.966267 3.694914 9.823217 32.123962 3.927781 8.489457 32.693001 2.944158 8.417722 31.604752 0.862680 9.616667 28.990475 -2.065593 11.941677 25.165485 -5.487470 15.112328 20.591139 -8.990221 18.746187 15.819164 -12.151362 22.404961 11.425135 -14.589617 25.647348 7.939034 -16.010891 28.082266 5.781337 -17.267721 30.714081 6.920640 -16.401142 30.714598 8.106387 -14.597273 29.348484 10.842125 -12.073685 26.780508 14.797884 -9.134762 23.320410 19.496546 -6.134980 19.385529 24.371378 -3.436159 15.450468 28.834402 -1.363815 11.989854 32.347317 -0.167904 9.421087 34.486408 0.007330 8.054001 34.993675 -0.859248 8.053483 33.807930 -2.663117 9.419597 31.072193 -5.186703 11.987570 27.116434 -8.125626 15.447666 22.417776 -11.125406 19.382547 17.542946 -13.824227 23.317608 13.079920 -15.896573 26.778223 9.567002 -17.092485 29.346991 7.427907 -18.425446 31.935099 8.585044 -17.709539 31.856228 9.864971 -16.228207 30.309011 12.696270 -14.160117 27.480068 16.737446 -11.754711 23.710606 21.501076 -9.302118 19.455282 26.412588 -7.098157 15.227352 30.879589 -5.408658 11.536764 34.363289 -4.437397 8.828656 36.443504 -4.301526 7.429670 36.869328 -5.017430 7.508541 35.589405 -6.498762 9.055755 32.758106 -8.566852 11.884697 28.716930 -10.972256 15.654158 23.953306 -13.424848 19.909479 19.041790 -15.628810 24.137409 14.574791 -17.318312 27.828001 11.091088 -18.289572 30.536110 9.010871 -19.854231 32.950993 10.131983 -19.325340 32.788654 11.492450 -18.200113 31.058996 14.381504 -16.614269 27.970646 18.450684 -14.759086 23.896099 23.209185 -12.858325 19.326809 28.083061 -11.141247 14.813904 32.484451 -9.814956 10.901697 35.882484 -9.039422 8.062066 37.867306 -8.908187 6.637508 38.199516 -9.437078 6.799847 36.839050 -10.562305 8.529502 33.950001 -12.148148 11.617851 29.880821 -14.003330 15.692395 25.122324 -15.904091 20.261683 20.248447 -17.621170 24.774591 15.847056 -18.947460 28.686798 12.449022 -19.722996 31.526430 10.464197 -21.695261 33.624649 11.411049 -21.387285 33.377014 12.825539 -20.633663 31.473660 15.726190 -19.525293 28.144165 19.763145 -18.195864 23.790112 24.449486 -16.805721 18.936663 29.219971 -15.522538 14.169223 33.499207 -14.501086 10.062808 36.771061 -13.864566 7.112714 38.640892 -13.689752 5.674768 38.883175 -13.997728 5.922405 37.468689 -14.751350 7.825756 34.568039 -15.859718 11.155250 30.531084 -17.189148 15.509302 25.844746 -18.579290 20.362745 21.074261 -19.862473 25.130188 16.795023 -20.883926 29.236605 13.523170 -21.520447 32.186699 11.653335 -24.026447 33.835518 12.205972 -23.963617 33.498672 13.634096 -23.577234 31.432579 16.495293 -22.913900 27.886442 20.444462 -22.053625 23.287975 25.005274 -21.100168 18.191826 29.627626 -20.168533 13.212664 33.753994 -19.371088 8.951046 36.886681 -18.804016 5.920990 38.647835 -18.535715 4.487964 38.825039 -18.598543 4.824809 37.396915 -18.984926 6.890901 34.535721 -19.648260 10.437036 30.586552 -20.508535 15.035500 26.025743 -21.461990 20.131647 21.403393 -22.393625 25.110811 17.277021 -23.191071 29.372429 14.144332 -23.758144 32.402489 12.383176 -26.832588 33.478985 12.268130 -27.018400 33.045296 13.658937 -26.971630 30.824566 16.428532 -26.697916 27.084644 20.242859 -26.230274 22.276623 24.641857 -25.625111 16.980415 29.094940 -24.955414 11.834829 33.064999 -24.301962 7.460494 36.073189 -23.743568 4.385019 37.756680 -23.347584 2.979355 37.912411 -23.161772 3.413041 36.521606 -23.208542 5.633770 33.752014 -23.482256 9.373690 29.937691 -23.949896 14.181709 25.538692 -24.555061 19.477915 21.085609 -25.224756 24.623503 17.115549 -25.878210 28.997837 14.107357 -26.436604 32.073315 12.423864 -30.010406 32.454086 11.343650 -30.419472 31.916586 12.647762 -30.657906 29.549295 15.282829 -30.696951 25.637747 18.931019 -30.531897 20.653732 23.152311 -30.182652 15.198393 27.437553 -29.691338 9.929729 31.269878 -29.117220 5.483217 34.187057 -28.529539 2.395170 35.837231 -27.999184 1.038053 36.021366 -27.590118 1.575553 34.717255 -27.351685 3.942840 32.082191 -27.312639 7.854385 28.434002 -27.477694 12.838398 24.212711 -27.826939 18.293734 19.927471 -28.318251 23.562399 16.095142 -28.892370 28.008915 13.177964 -29.480049 31.096966 11.527786 -33.352669 30.678276 9.216960 -33.937302 30.035671 10.401112 -34.389343 27.533775 12.879146 -34.654270 23.474354 16.352175 -34.700127 18.347031 20.401302 -34.521389 12.770241 24.538141 -34.139606 7.416628 28.263727 -33.600834 2.931913 31.128700 -32.970051 -0.142979 32.787506 -32.323341 -1.437171 33.040062 -31.738710 -0.794567 31.855911 -31.286669 1.707328 29.377880 -31.021742 5.766747 25.904852 -30.975882 10.894067 21.855726 -31.154623 16.470856 17.718889 -31.536404 21.824471 13.993301 -32.075176 26.309187 11.128325 -32.705959 29.384081 9.469519 -36.545738 28.120682 5.778054 -37.253601 27.377062 6.828250 -37.849785 24.755064 9.146475 -38.262383 20.570940 12.453121 -38.441624 15.329357 16.349354 -38.365894 9.662528 20.365232 -38.044327 4.253957 24.016380 -37.515709 -0.244003 26.862417 -36.843796 -3.288834 28.560070 -36.109634 -4.513282 28.904575 -35.401772 -3.769663 27.854380 -34.805588 -1.147667 25.536156 -34.392990 3.036455 22.229511 -34.213749 8.278036 18.333281 -34.289478 13.944863 14.317403 -34.611042 19.353436 10.666254 -35.139664 23.851398 7.820213 -35.811573 26.896233 6.122561 -39.222378 24.823700 1.068924 -40.007587 23.985973 1.984686 -40.690434 21.259136 4.153223 -41.188560 16.972080 7.312979 -41.441887 11.641890 11.082840 -41.419853 5.911463 15.008104 -41.125122 0.471978 18.615328 -40.593239 -4.020487 21.469425 -39.888359 -7.024075 23.226152 -39.095501 -8.176507 23.673620 -38.310291 -7.338783 22.757858 -37.627445 -4.611948 20.589323 -37.129318 -0.324894 17.429569 -36.875992 5.005294 13.659710 -36.898026 10.735719 9.734447 -37.192757 16.175205 6.127223 -37.724640 20.667673 3.273123 -38.429520 23.671263 1.516395 -41.024509 20.920063 -4.690040 -41.850349 19.995888 -3.902109 -42.575745 17.179909 -1.865312 -43.113197 12.811773 1.174684 -43.397884 7.418344 4.851209 -43.395470 1.650150 8.720821 -43.106243 -3.797080 12.316786 -42.565090 -8.266330 15.205379 -41.837280 -11.218544 17.038193 -41.010601 -12.297641 17.594162 -40.184761 -11.373466 16.806232 -39.459366 -8.557488 14.769436 -38.921913 -4.189356 11.729443 -38.637226 1.204070 8.052918 -38.639641 6.972263 4.183308 -38.928867 12.419495 0.587342 -39.470020 16.888748 -2.301252 -40.197826 19.840965 -4.134069 -41.666664 16.641092 -11.093895 -42.504612 15.637047 -10.425549 -43.241493 12.746952 -8.499712 -43.788425 8.319397 -5.548672 -44.079441 2.888407 -1.928364 -44.079441 -2.890957 1.924546 -43.788425 -8.321618 5.545341 -43.241493 -12.748560 8.497301 -42.504612 -15.637829 10.424376 -41.666664 -16.640936 11.094130 -40.828716 -15.636891 10.425785 -40.091835 -12.746799 8.499950 -39.544903 -8.319245 5.548911 -39.253887 -2.888258 1.928605 -39.253887 2.891104 -1.924304 -39.544903 8.321766 -5.545100 -40.091835 12.748712 -8.497062 -40.828712 15.637983 -10.424138 -41.008617 12.291817 -17.602840 -41.835110 11.212072 -17.047848 -42.563000 8.260010 -15.214821 -43.104492 3.791691 -12.324849 -43.394272 -1.653940 -8.726503 -43.397392 -7.420060 -4.853800 -43.113476 -12.811186 -1.173844 -42.576763 -17.177073 1.869508 -41.851994 -19.991129 3.909184 -41.026585 -20.913937 4.699168 -40.200092 -19.834194 4.144178 -39.472202 -16.882135 2.311153 -38.930710 -12.413818 -0.578818 -38.640930 -6.968189 -4.177162 -38.637810 -1.202071 -8.049865 -38.921726 4.189056 -11.729820 -39.458439 8.554945 -14.773175 -40.183208 11.369003 -16.812855 -39.094440 8.174933 -23.675909 -39.886745 7.021627 -23.229719 -40.591282 4.017478 -21.473816 -41.123062 -0.475172 -18.619987 -41.417953 -5.914441 -15.012447 -41.440388 -11.644274 -11.086319 -41.187653 -16.973568 -7.315153 -40.690235 -21.259529 -4.153804 -40.008133 -23.985210 -1.983580 -39.223618 -24.821854 -1.066240 -38.431309 -23.668550 -1.512430 -37.726776 -20.664402 -3.268332 -37.194992 -16.171755 -6.122159 -36.900101 -10.732488 -9.729696 -36.877666 -5.002656 -13.655824 -37.130402 0.326637 -17.426991 -37.627819 4.612602 -20.588341 -38.309921 7.338286 -22.758568 -36.111965 4.515631 -28.901302 -36.845135 3.290203 -28.558167 -37.515903 0.244243 -26.862093 -38.043373 -4.254866 -24.017653 -38.363918 -9.664461 -20.367928 -38.438881 -15.332067 -16.353130 -38.259212 -20.574085 -12.457505 -37.846592 -24.758251 -9.150919 -37.250782 -27.379894 -6.832195 -36.543644 -28.122805 -5.781009 -35.810478 -26.897379 -6.124145 -35.139706 -23.851419 -7.820217 -34.612236 -19.352314 -10.664656 -34.291691 -13.942720 -14.314378 -34.216728 -8.275117 -18.329174 -34.396397 -3.033098 -22.224800 -34.809017 1.151071 -25.531387 -35.404827 3.772717 -27.850113 -32.318867 1.433651 -33.044613 -32.964359 0.138659 -32.793037 -33.594624 -2.936500 -31.134533 -34.133644 -7.420919 -28.269140 -34.516411 -12.773711 -24.542469 -34.696751 -18.349247 -20.404011 -34.652916 -23.475037 -16.352926 -34.390190 -27.532833 -12.877834 -33.940266 -30.033211 -10.397881 -33.357410 -30.674580 -9.212185 -32.711922 -29.379591 -9.463761 -32.081654 -26.304432 -11.122264 -31.542633 -21.820015 -13.987654 -31.159866 -16.467226 -17.714321 -30.979527 -10.891691 -21.852779 -31.023361 -5.765901 -25.903864 -31.286085 -1.708100 -29.378960 -31.736010 0.792278 -31.858915 -27.984854 -1.047542 -36.032265 -28.513762 -2.405278 -35.848530 -29.101915 -5.492719 -34.197388 -29.678370 -9.937469 -31.277985 -30.173599 -15.203433 -27.442448 -30.527870 -20.655453 -23.153399 -30.698452 -25.635933 -18.928160 -30.664772 -29.544159 -15.276357 -30.430891 -31.908737 -12.638451 -30.025019 -32.444466 -11.332613 -29.496111 -31.086731 -11.516345 -28.907959 -27.999294 -13.167487 -28.331503 -23.554543 -16.086885 -27.836275 -18.288582 -19.922422 -27.482002 -12.836564 -24.211470 -27.311420 -7.856082 -28.436710 -27.345100 -3.947855 -32.088512 -27.578979 -1.583273 -34.726421 -23.337664 -2.985279 -37.918102 -23.731993 -4.391418 -37.762428 -24.290144 -7.466586 -36.078304 -24.944796 -11.839878 -33.068855 -25.616989 -16.983809 -29.097067 -26.225649 -22.277941 -24.641993 -26.697357 -27.083725 -20.240990 -26.975224 -30.821514 -16.424873 -27.025730 -33.040478 -13.653930 -26.842787 -33.472973 -12.262372 -26.448460 -32.066837 -12.418042 -25.890308 -28.991669 -14.102167 -25.235655 -24.618382 -17.111616 -24.563461 -19.474451 -21.083403 -23.954803 -14.180321 -25.538471 -23.483093 -9.374535 -29.939478 -23.205227 -5.636743 -33.755592 -23.154720 -3.417776 -36.526543 -18.529282 -4.491625 -38.827747 -18.796032 -5.924908 -38.650280 -19.362534 -8.954745 -36.888565 -20.160454 -13.215695 -33.755089 -21.093555 -18.193823 -29.627798 -22.049292 -23.288692 -25.004505 -22.912386 -27.885788 -20.442848 -23.578737 -31.430630 -16.493027 -23.967972 -33.495663 -13.631452 -24.033146 -33.831810 -12.203267 -23.766396 -32.398525 -12.380734 -23.199896 -29.368690 -14.142449 -22.401974 -25.107742 -17.275921 -21.468874 -20.129618 -21.403210 -20.513138 -15.034748 -26.026501 -19.650043 -10.437653 -30.588158 -18.983692 -6.892808 -34.537979 -18.594456 -4.827773 -37.399559 -13.674234 -5.683416 -38.887440 -13.848251 -7.121304 -38.644230 -14.485957 -10.070299 -36.773071 -15.510435 -14.174713 -33.499653 -16.798119 -18.939491 -29.218798 -18.193693 -23.789930 -24.446840 -19.528831 -28.140995 -19.759350 -20.642496 -31.467886 -15.721706 -21.400366 -33.369328 -12.820909 -21.711027 -33.615982 -11.406835 -21.537010 -32.178093 -11.650043 -20.899305 -29.229099 -13.521200 -19.874828 -25.124687 -16.794617 -18.587145 -20.359913 -21.075468 -17.191572 -15.509474 -25.847424 -15.856433 -11.158408 -30.534914 -14.742766 -7.831516 -34.572563 -13.984897 -5.930069 -37.473358 -8.886005 -6.650025 -38.202579 -9.017183 -8.074286 -37.869076 -9.795357 -10.912148 -35.882759 -11.126665 -14.821323 -32.483200 -12.850534 -19.330307 -28.080437 -14.759039 -23.895248 -23.205513 -16.621984 -27.965549 -18.446415 -18.214674 -31.050270 -14.377157 -19.345005 -32.777351 -11.488555 -19.876642 -32.938477 -10.129014 -19.745464 -31.514217 -10.462514 -18.967291 -28.676355 -12.448833 -17.635984 -24.767183 -15.848391 -15.912116 -20.258202 -20.251148 -14.003613 -15.693258 -25.126070 -12.140666 -11.622958 -29.885170 -10.547976 -8.538235 -33.954430 -9.417645 -6.811152 -36.843037 -4.283631 -7.440068 -36.869385 -4.419693 -8.838716 -36.442509 -5.393292 -11.545271 -34.361366 -7.086998 -15.233282 -30.876980 -9.296523 -19.457922 -26.409613 -11.755367 -23.709637 -21.498098 -14.166956 -27.475605 -16.734837 -16.240417 -30.301600 -12.694350 -17.725662 -31.846760 -9.863976 -18.443546 -31.924717 -8.585104 -18.307484 -30.526070 -9.011982 -17.333885 -27.819519 -11.093121 -15.640182 -24.131508 -14.577507 -13.430657 -19.906868 -19.044870 -10.971814 -15.655154 -23.956383 -8.560225 -11.889183 -28.719645 -6.486763 -9.063189 -32.760136 -5.001517 -7.518025 -35.590508 0.027319 -8.065935 -34.990990 -0.148672 -9.432594 -34.482834 -1.347672 -11.999549 -32.343296 -3.425063 -15.457182 -28.830425 -6.130281 -19.388454 -24.367931 -9.137037 -23.319197 -19.494057 -12.082671 -26.775301 -14.796663 -14.611897 -29.339912 -10.842324 -16.419653 -30.703701 -8.107989 -17.287897 -30.702173 -6.923464 -17.111906 -29.335514 -7.431616 -15.912908 -26.768564 -9.571154 -13.835518 -23.310930 -13.084021 -11.130301 -19.379660 -17.546513 -8.123546 -15.448918 -22.420385 -5.177912 -11.992813 -27.117781 -2.648685 -9.428199 -31.072123 -0.840927 -8.064408 -33.806458 3.946368 -8.500702 -32.687912 3.712630 -9.834018 -32.118183 2.288339 -12.267187 -29.960510 -0.154713 -15.506737 -26.475134 -3.321861 -19.161928 -22.082443 -6.831097 -22.791889 -17.312263 -10.259155 -25.958794 -12.739950 -13.192563 -28.280668 -8.916988 -15.277509 -29.477459 -6.304484 -16.262514 -29.404816 -5.217546 -16.028778 -28.071503 -5.787271 -14.604487 -25.638332 -7.944943 -12.161436 -22.398785 -11.430319 -8.994291 -18.743595 -15.823006 -5.485056 -15.113634 -20.593184 -2.056997 -11.946729 -25.165501 0.876412 -9.624851 -28.988462 2.961359 -8.428060 -31.600967 7.418983 -8.713822 -30.095341 7.124358 -10.016581 -29.484627 5.497993 -12.333862 -27.342285 2.736053 -15.386168 -23.926712 -0.828333 -18.805346 -19.649876 -4.765247 -22.178993 -15.027624 -8.599836 -25.100195 -10.617474 -11.869596 -27.216614 -6.951350 -14.180145 -28.272978 -4.471443 -15.252795 -28.141876 -3.476865 -14.958171 -26.839119 -4.087576 -13.331808 -24.521839 -6.229917 -10.569869 -21.469534 -9.645489 -7.005485 -18.050356 -13.922323 -3.068573 -14.676711 -18.544573 0.766017 -11.755508 -22.954723 4.035779 -9.639088 -26.620850 6.346329 -8.582720 -29.100760 10.464165 -8.705061 -27.330196 10.114002 -9.982301 -26.695377 8.317824 -12.206946 -24.590816 5.292278 -15.110674 -21.270355 1.402288 -18.343252 -17.134491 -2.882956 -21.514782 -12.682068 -7.046587 -24.242727 -8.450118 -10.586413 -26.198063 -4.949074 -13.075478 -27.144947 -2.601213 -14.213563 -26.969168 -1.689723 -13.863402 -25.691929 -2.324542 -12.067225 -23.467285 -4.429101 -9.041680 -20.563557 -7.749560 -5.151692 -17.330982 -11.885424 -0.866450 -14.159452 -16.337845 3.297182 -11.431505 -20.569796 6.837009 -9.476166 -24.070843 9.326077 -8.529282 -26.418705 13.100987 -8.474408 -24.500341 12.706738 -9.732691 -23.853622 10.779876 -11.891544 -21.796673 7.552810 -14.690580 -18.577595 3.414769 -17.792194 -14.584654 -1.135136 -20.822287 -10.299460 -5.548117 -23.415380 -6.238872 -9.291907 -25.258713 -2.892653 -11.914949 -26.129950 -0.664407 -13.100865 -25.924007 0.177105 -12.706617 -24.665726 -0.469614 -10.779757 -22.506872 -2.526561 -7.552692 -19.707838 -5.745637 -3.414654 -16.606224 -9.738576 1.135249 -13.576134 -14.023768 5.548232 -10.983039 -18.084358 9.292023 -9.139706 -21.430580 11.915068 -8.268467 -23.658827 15.382504 -8.049675 -21.681564 14.957470 -9.295266 -21.029799 12.937848 -11.412952 -19.019569 9.567238 -14.147306 -15.893339 5.252182 -17.168528 -12.028175 0.513141 -20.112209 -7.890277 -4.078285 -22.623301 -3.978737 -7.968304 -24.398930 -0.765340 -10.687723 -25.224926 1.362328 -11.908539 -25.001663 2.147639 -11.483505 -23.756073 1.495875 -9.463885 -21.638390 -0.514354 -6.093277 -18.904036 -3.640582 -1.778223 -15.882816 -7.505743 2.960816 -12.939134 -11.643640 7.552243 -10.428041 -15.555182 11.442265 -8.652412 -18.768578 14.161685 -7.826413 -20.896248 17.385042 -7.475095 -18.906979 16.940550 -8.712900 -18.253363 14.858434 -10.808224 -16.283871 11.389826 -13.508336 -13.236055 6.953092 -16.487564 -9.477525 2.083369 -19.386570 -5.461615 -2.631981 -21.855690 -1.672704 -6.624221 -23.597111 1.432210 -9.411827 -24.400793 3.478629 -10.658571 -24.169800 4.219724 -10.214080 -22.931995 3.566109 -8.131966 -20.836674 1.596620 -4.663360 -18.136562 -1.451195 -0.226629 -15.157335 -5.209723 4.643093 -12.258329 -9.225633 9.358444 -9.789209 -13.014544 13.350685 -8.047786 -16.119459 16.138294 -7.244102 -18.165880 19.158150 -6.785837 -16.209370 18.704475 -8.019260 -15.553780 16.586195 -10.105645 -13.613583 13.058803 -12.793343 -10.622793 8.547754 -15.758177 -6.942145 3.597149 -18.642542 -3.015581 -1.195894 -21.098545 0.683299 -5.253267 -22.829956 3.708355 -8.085590 -23.627937 5.694721 -9.351242 -23.396244 6.402812 -8.897570 -22.162821 5.747222 -6.779291 -20.076439 3.807026 -3.251901 -17.388742 0.816238 1.259145 -14.423910 -2.864408 6.209748 -11.539543 -6.790971 11.002793 -9.083540 -10.489851 15.060167 -7.352129 -13.514909 17.892492 -6.554144 -15.501278 20.760061 -6.018798 -13.595757 20.304962 -7.249469 -12.935997 18.170294 -9.334066 -11.011907 14.613524 -12.021154 -8.055561 10.063656 -14.986633 -4.423537 5.069468 -17.872820 -0.553913 0.233337 -20.331598 3.086577 -3.861432 -22.066404 6.058839 -6.720948 -22.867994 8.004372 -8.000312 -22.639687 8.688518 -7.545214 -21.409016 8.028757 -5.410546 -19.324419 6.104668 -1.853780 -16.637333 3.148324 2.696087 -13.671855 -0.483698 7.690272 -10.785668 -4.353321 12.526404 -8.326888 -7.993812 16.621176 -6.592081 -10.966076 19.480694 -5.790488 -12.911611 22.226334 -5.209805 -11.090048 21.776091 -6.437333 -10.421163 19.641642 -8.520535 -8.495318 16.080431 -11.208147 -5.544800 11.521996 -14.176003 -1.925483 6.516148 -17.066135 1.926089 1.666670 -19.529947 5.545358 -2.441523 -21.270275 8.495790 -5.312920 -22.077204 10.421515 -6.601189 -21.853407 11.090267 -6.150947 -20.625879 10.421383 -4.016499 -18.542679 8.495541 -0.455292 -15.855067 5.545024 4.103142 -12.887213 1.925708 9.108988 -9.997082 -1.925862 13.958467 -7.533267 -5.545132 18.066660 -5.792938 -8.495564 20.938061 -4.986008 -10.421294 23.602608 -4.396105 -8.697319 23.160948 -5.617902 -8.012411 21.037764 -7.692657 -6.065115 17.489147 -10.370127 -3.090303 12.943110 -13.327366 0.553219 7.947975 -16.207689 4.425987 3.106229 -18.663687 8.060886 -0.998144 -20.399130 11.019499 -3.870095 -21.204697 12.944969 -5.163224 -20.983227 13.605059 -4.721563 -19.761433 12.920151 -2.598382 -17.686676 10.972857 0.950234 -15.009209 7.998046 5.496267 -12.051970 4.354526 10.491401 -9.171647 0.481759 15.333148 -6.715649 -3.153142 19.437521 -4.980204 -6.111755 22.309475 -4.174634 -8.037229 24.939240 -3.596072 -6.397799 24.507111 -4.808125 -5.689882 22.399710 -6.862528 -3.704243 18.871216 -9.511492 -0.680380 14.347218 -12.435513 3.016986 9.373377 -15.281908 6.941896 4.549615 -17.707361 10.620949 0.457746 -19.419329 13.610395 -2.408690 -20.211319 15.549665 -3.703959 -19.987808 16.204857 -3.271833 -18.775757 15.496939 -1.164433 -16.721355 13.511301 2.364059 -14.072392 10.487440 6.888055 -11.148374 6.790076 11.861893 -8.301978 2.865167 16.685656 -5.876524 -0.813886 20.777527 -4.164556 -3.803335 23.643967 -3.372562 -5.742608 26.261982 -2.850945 -4.216131 25.838774 -4.046238 -3.475104 23.748959 -6.059001 -1.429149 20.244596 -8.646465 1.674964 15.748368 -11.496546 5.462831 10.802584 -14.265477 9.477579 6.003780 -16.619289 13.234970 1.930763 -18.274075 16.281807 -0.925205 -19.030245 18.250601 -2.219647 -18.796593 18.903879 -1.796440 -17.601301 18.162853 0.293375 -15.588539 16.116899 3.797734 -13.001075 13.012790 8.293961 -10.150997 9.224924 13.239743 -7.382064 5.210177 18.038548 -5.028252 1.452785 22.111567 -3.373464 -1.594055 24.967537 -2.617293 -3.562850 27.605679 -2.193420 -2.152020 27.188690 -3.361916 -1.366087 25.113804 -5.302958 0.762688 21.631283 -7.782429 3.977545 17.161171 -10.501268 7.890723 12.242628 -13.131542 12.030237 7.468906 -15.356001 15.896797 3.415785 -16.906343 19.024042 0.572130 -17.595575 21.034781 -0.719071 -17.340565 21.686485 -0.302083 -16.172070 20.900555 1.772802 -14.231030 18.771782 5.255321 -11.751559 15.556925 9.725431 -9.032722 11.643748 14.643971 -6.402448 7.504236 19.417694 -4.177988 3.637674 23.470818 -2.627643 0.510427 26.314474 -1.938409 -1.500313 29.000404 -1.633278 -0.187688 28.585657 -2.762295 0.655080 26.519623 -4.595368 2.885736 23.051495 -6.911403 6.235228 18.599581 -9.431051 10.299561 13.700848 -11.850405 14.588514 8.946158 -13.877656 18.584776 4.908994 -15.268287 21.806339 2.076298 -15.854568 23.864635 0.789735 -15.565784 24.511406 1.204482 -14.436769 23.668640 3.270515 -12.603696 21.437986 6.738642 -10.287663 18.088495 11.190553 -7.768015 14.024164 16.089283 -5.348661 9.735212 20.843975 -3.321410 5.738950 24.881140 -1.930777 2.517384 27.713839 -1.344495 0.459084 30.462685 -1.195012 1.680232 30.045706 -2.267265 2.593114 27.981033 -3.945923 4.943372 24.517694 -6.028515 8.447531 20.073420 -8.263847 12.682938 15.184255 -10.382310 17.138737 10.439906 -12.128382 21.277496 6.412611 -13.291462 24.600018 3.588120 -13.731266 26.705561 2.307110 -13.394747 27.340160 2.724087 -12.322495 26.427280 4.788759 -10.643837 24.077023 8.252095 -8.561246 20.572868 12.696368 -6.325912 16.337463 17.585531 -4.207451 11.881663 22.329880 -2.461379 7.742904 26.357178 -1.298297 4.420379 29.181671 -0.858492 2.314836 31.998245 -0.870819 3.473730 31.575459 -1.864607 4.469012 29.505331 -3.335670 6.949944 26.037552 -5.106576 10.617290 21.590384 -6.963727 15.028714 16.700226 -8.683125 19.652132 11.956902 -10.057382 23.929890 7.932524 -10.920744 27.346031 5.112494 -11.169079 29.488514 3.836948 -10.772430 30.098928 4.259735 -9.778643 29.103647 6.329860 -8.307581 26.622717 9.797638 -6.536675 22.955372 14.244802 -4.679524 18.543951 19.134960 -2.960128 13.920534 23.878284 -1.585870 9.642776 27.902664 -0.722506 6.226633 30.722696 -0.474171 4.084146 33.597076 -0.637621 5.213198 33.167408 -1.525524 6.301297 31.088375 -2.729152 8.915372 27.610741 -4.103328 12.740124 23.153957 -5.482308 17.314234 18.255583 -6.699765 22.085993 13.506431 -7.608857 26.479855 9.479321 -8.099933 29.965862 6.659979 -8.113762 32.123547 5.388460 -7.648678 32.692657 5.818129 -6.760775 31.604561 7.897161 -5.557147 28.990488 11.374793 -4.182971 25.165737 15.831573 -2.803992 20.591631 20.729948 -1.586535 15.819873 25.479099 -0.677442 11.426009 29.506212 -0.186366 7.940001 32.325558 -0.172535 5.782312 35.233276 -0.404113 6.920709 34.800407 -1.154746 8.106510 32.715355 -2.033595 10.842320 29.229607 -2.934659 14.798162 24.763596 -3.749254 19.496901 19.855991 -4.379130 24.371799 15.098722 -4.748313 28.834873 11.065583 -4.812276 32.347809 8.243032 -4.563303 34.486897 6.971508 -4.031423 34.994129 7.404377 -3.280790 33.808327 9.489429 -2.401941 31.072519 12.975174 -1.500878 27.116680 17.441181 -0.686283 22.417942 22.348785 -0.056407 17.543045 27.106056 0.312777 13.079971 31.139196 0.376740 9.567034 33.961750 0.127767 7.427943</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="2160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="6480">0.702468 -0.051924 -0.709819 0.702703 -0.174813 -0.689673 0.528767 -0.838433 0.132044 0.457857 -0.888266 -0.036750 0.465074 -0.806655 0.364711 0.402213 -0.893235 0.200886 0.494332 -0.719774 0.487403 0.447862 -0.823879 0.347336 0.526211 -0.624117 0.577563 0.495111 -0.734847 0.463535 0.542598 -0.536859 0.646042 0.522605 -0.648555 0.553408 0.537460 -0.464725 0.703681 0.524503 -0.576743 0.626309 0.495642 -0.405822 0.767885 0.487047 -0.521240 0.700781 0.296662 -0.329655 0.896281 0.291429 -0.458824 0.839374 -0.685334 0.082828 0.723503 -0.687524 -0.008769 0.726108 -0.853297 0.387592 -0.348792 -0.844983 0.447790 -0.292385 -0.718085 0.413283 -0.559957 -0.707776 0.504482 -0.494521 -0.648732 0.456739 -0.608717 -0.634762 0.559463 -0.532990 -0.579513 0.529628 -0.619402 -0.558681 0.640132 -0.527357 -0.489018 0.629787 -0.603514 -0.457023 0.743785 -0.487765 -0.368355 0.738376 -0.564903 -0.322026 0.848224 -0.420494 -0.223134 0.817961 -0.530236 -0.164841 0.918149 -0.360319 0.007024 0.797103 -0.603803 0.063904 0.902507 -0.425907 0.719288 -0.267931 -0.640966 0.646973 -0.699042 0.304576 0.565325 -0.637502 0.523449 0.567381 -0.548489 0.614198 0.576587 -0.461000 0.674556 0.577208 -0.384133 0.720606 0.561973 -0.319772 0.762844 0.513709 -0.263310 0.816560 0.309801 -0.179607 0.933684 -0.680412 0.168376 0.713224 -0.868654 0.303995 -0.391186 -0.736533 0.296524 -0.607942 -0.672427 0.323794 -0.665582 -0.613654 0.379825 -0.692215 -0.541562 0.461701 -0.702526 -0.447227 0.555539 -0.700974 -0.327140 0.628446 -0.705716 -0.097436 0.597342 -0.796045 0.743876 -0.310727 -0.591690 0.775189 -0.469050 0.423172 0.674194 -0.390544 0.626848 0.649194 -0.316541 0.691627 0.636591 -0.249446 0.729746 0.621782 -0.190952 0.759556 0.596187 -0.140013 0.790543 0.540944 -0.090734 0.836150 0.331457 -0.006845 0.943445 -0.674076 0.244225 0.697120 -0.890942 0.191609 -0.411714 -0.762607 0.150353 -0.629146 -0.704233 0.158768 -0.691989 -0.656689 0.191653 -0.729403 -0.604170 0.243447 -0.758757 -0.538144 0.303704 -0.786235 -0.446485 0.347880 -0.824397 -0.219080 0.300351 -0.928328 0.756679 -0.323331 -0.568238 0.871435 -0.197997 0.448775 0.758549 -0.108543 0.642513 0.716307 -0.054698 0.695638 0.689394 -0.009995 0.724318 0.663898 0.029360 0.747247 0.630643 0.065987 0.773263 0.569912 0.106255 0.814807 0.355710 0.184280 0.916249 -0.668420 0.308914 0.676599 -0.914893 0.051485 -0.400399 -0.789978 -0.022179 -0.612733 -0.736157 -0.032069 -0.676050 -0.697093 -0.022619 -0.716624 -0.658512 -0.002350 -0.752566 -0.611658 0.020445 -0.790858 -0.538892 0.029591 -0.841855 -0.313476 -0.030890 -0.949094 0.756039 -0.335533 -0.561981 0.918824 0.051341 0.391313 0.801471 0.154732 0.577670 0.752326 0.195815 0.629017 0.719301 0.225438 0.657103 0.688885 0.251381 0.679886 0.651834 0.277453 0.705784 0.588189 0.310319 0.746817 0.371261 0.379698 0.847345 -0.666315 0.361664 0.652091 -0.930756 -0.104765 -0.350312 -0.807609 -0.207036 -0.552181 -0.756042 -0.231367 -0.612266 -0.720997 -0.239436 -0.650257 -0.688534 -0.241654 -0.683757 -0.649407 -0.244550 -0.720046 -0.583732 -0.258590 -0.769668 -0.358914 -0.322207 -0.875993 0.751201 -0.351270 -0.558843 0.925136 0.249068 0.286512 0.805544 0.369010 0.463605 0.754637 0.406302 0.515211 0.720109 0.429560 0.544905 0.688429 0.449222 0.569443 0.650339 0.469983 0.596804 0.585848 0.498664 0.638840 0.368316 0.559587 0.742432 -0.669227 0.401309 0.625369 -0.929514 -0.257607 -0.263898 -0.805801 -0.382666 -0.451942 -0.754479 -0.416125 -0.507545 -0.720173 -0.433801 -0.541449 -0.688880 -0.447223 -0.570471 -0.651157 -0.461945 -0.602164 -0.586676 -0.485817 -0.647914 -0.362292 -0.545919 -0.755459 0.747396 -0.365165 -0.555026 0.903671 0.395821 0.163416 0.781048 0.530727 0.329079 0.729564 0.568796 0.379746 0.694851 0.590823 0.410013 0.663105 0.608816 0.435472 0.624994 0.627955 0.463740 0.560556 0.654988 0.506722 0.344039 0.708865 0.615750 -0.676275 0.427571 0.599862 -0.907992 -0.390106 -0.152865 -0.781638 -0.531634 -0.326202 -0.729639 -0.569886 -0.377964 -0.694898 -0.591498 -0.408958 -0.663248 -0.608904 -0.435131 -0.625230 -0.627440 -0.464119 -0.560576 -0.654046 -0.507915 -0.337463 -0.708443 -0.619860 0.745236 -0.374184 -0.551914 0.863711 0.502691 0.036129 0.736827 0.648872 0.189869 0.684650 0.688692 0.238657 0.649748 0.711178 0.268427 0.617973 0.729236 0.293810 0.579922 0.748245 0.322211 0.515736 0.774726 0.365809 0.301470 0.822894 0.481624 -0.684844 0.442568 0.578897 -0.868394 -0.494944 -0.030360 -0.737988 -0.647567 -0.189816 -0.685150 -0.688139 -0.238817 -0.649937 -0.711046 -0.268321 -0.617925 -0.729461 -0.293351 -0.579636 -0.748792 -0.321454 -0.514940 -0.775614 -0.365048 -0.294213 -0.824338 -0.483638 0.743683 -0.377993 -0.551413 0.809724 0.579699 -0.091085 0.677763 0.733478 0.051445 0.624716 0.774643 0.098274 0.589491 0.797687 0.127265 0.557577 0.816042 0.152262 0.519528 0.835154 0.180576 0.455692 0.861277 0.224828 0.244883 0.904772 0.348453 -0.692487 0.449871 0.563983 -0.814126 -0.572777 0.095526 -0.678809 -0.732504 -0.051540 -0.625185 -0.774228 -0.098561 -0.589675 -0.797537 -0.127355 -0.557524 -0.816112 -0.152079 -0.519214 -0.835438 -0.180165 -0.454803 -0.861838 -0.224478 -0.237600 -0.905642 -0.351225 0.741172 -0.377615 -0.555042 0.742673 0.632949 -0.218659 0.605235 0.791368 -0.086181 0.551347 0.833272 -0.040906 0.515848 0.856590 -0.012451 0.483859 0.875059 0.012367 0.445921 0.894140 0.040831 0.382697 0.919851 0.086122 0.176792 0.959661 0.218622 -0.697588 0.453033 0.555097 -0.746826 -0.626732 0.222391 -0.606076 -0.790725 0.086171 -0.551712 -0.833043 0.040667 -0.515994 -0.856504 0.012293 -0.483813 -0.875084 -0.012383 -0.445629 -0.894290 -0.040746 -0.381788 -0.920219 -0.086230 -0.169378 -0.960122 -0.222432 0.735885 -0.374769 -0.563934 0.661071 0.664470 -0.348519 0.517989 0.825289 -0.224911 0.463441 0.867514 -0.180670 0.427864 0.890909 -0.152357 0.396018 0.909369 -0.127350 0.358463 0.928350 -0.098339 0.296307 0.953704 -0.051485 0.097164 0.991093 0.091072 -0.699164 0.455026 0.551472 -0.665559 -0.658576 0.351153 -0.519036 -0.824773 0.224390 -0.463977 -0.867353 0.180065 -0.428086 -0.890868 0.151979 -0.395916 -0.909425 0.127266 -0.357959 -0.928528 0.098495 -0.294993 -0.954111 0.051502 -0.088988 -0.991440 -0.095541 0.725740 -0.371787 -0.578857 0.561831 0.672520 -0.481729 0.412974 0.833995 -0.365930 0.357945 0.876342 -0.322336 0.322464 0.899791 -0.293925 0.290956 0.918281 -0.268521 0.254059 0.937266 -0.238718 0.193518 0.962545 -0.189891 0.003503 0.999342 -0.036112 -0.696636 0.458277 0.551979 -0.566891 -0.666966 0.483519 -0.414347 -0.833758 0.364916 -0.358775 -0.876376 0.321318 -0.322879 -0.899870 0.293227 -0.290903 -0.918385 0.268226 -0.253426 -0.937427 0.238760 -0.191836 -0.962899 0.189801 0.005571 -0.999523 0.030373 0.708463 -0.371853 -0.599838 0.441736 0.652342 -0.615889 0.286807 0.812909 -0.506873 0.231176 0.855197 -0.463892 0.195561 0.878636 -0.435609 0.164135 0.897141 -0.410120 0.127746 0.916202 -0.379809 0.069089 0.941768 -0.329089 -0.109014 0.980523 -0.163374 -0.689895 0.464662 0.555098 -0.444967 -0.646522 0.619688 -0.286320 -0.812548 0.507726 -0.230950 -0.855237 0.463931 -0.195866 -0.878886 0.434966 -0.164925 -0.897581 0.408837 -0.128784 -0.916847 0.377897 -0.069600 -0.942738 0.326191 0.116184 -0.981390 0.152889 0.682183 -0.378867 -0.625369 0.300267 0.598703 -0.742559 0.138720 0.756612 -0.638979 0.081627 0.798116 -0.596949 0.044611 0.820726 -0.569577 0.011772 0.838344 -0.545014 -0.025586 0.856640 -0.515280 -0.083273 0.882112 -0.463620 -0.246884 0.925734 -0.286469 -0.679765 0.474906 0.558914 -0.291848 -0.586840 0.755277 -0.127631 -0.751128 0.647701 -0.074725 -0.795038 0.601939 -0.043090 -0.820331 0.570264 -0.015766 -0.840691 0.541285 0.016764 -0.861525 0.507438 0.071474 -0.889203 0.451895 0.241686 -0.933782 0.263891 0.646349 -0.396137 -0.652157 0.142944 0.511317 -0.847421 -0.025622 0.664453 -0.746891 -0.085928 0.703116 -0.705864 -0.127039 0.722159 -0.679962 -0.164704 0.735535 -0.657162 -0.206840 0.749346 -0.629045 -0.266942 0.771402 -0.577651 -0.415101 0.821362 -0.391223 -0.668568 0.486905 0.562086 -0.099784 -0.472153 0.875851 0.067693 -0.635087 0.769469 0.112653 -0.684966 0.719813 0.134732 -0.717386 0.683524 0.152933 -0.744340 0.650053 0.177519 -0.770590 0.612110 0.224453 -0.803013 0.552079 0.374648 -0.858467 0.350248 0.601618 -0.424326 -0.676759 -0.018609 0.400185 -0.916245 -0.193274 0.546620 -0.814771 -0.258534 0.579043 -0.773220 -0.306901 0.589506 -0.747191 -0.353745 0.591899 -0.724237 -0.405919 0.592859 -0.695520 -0.473661 0.602534 -0.642338 -0.607527 0.655565 -0.448493 -0.658315 0.493436 0.568456 0.129886 -0.287218 0.949018 0.294960 -0.452288 0.841685 0.323346 -0.519942 0.790638 0.327007 -0.571900 0.752328 0.328777 -0.615370 0.716398 0.340192 -0.653825 0.675856 0.375739 -0.695390 0.612579 0.502020 -0.766653 0.400274 0.548271 -0.461602 -0.697368 -0.172104 0.283698 -0.943343 -0.349439 0.423117 -0.835981 -0.419745 0.446280 -0.790347 -0.476681 0.442948 -0.759324 -0.534775 0.426499 -0.729461 -0.599222 0.403836 -0.691267 -0.675840 0.388448 -0.626377 -0.794271 0.436587 -0.422522 -0.640915 0.488482 0.592126 0.369780 -0.039818 0.928266 0.524649 -0.213155 0.824202 0.532093 -0.314757 0.786006 0.512842 -0.402067 0.758509 0.494242 -0.473350 0.729153 0.489574 -0.530840 0.691756 0.511515 -0.585483 0.628937 0.611395 -0.675902 0.411525 0.485576 -0.505056 -0.713536 -0.311007 0.178629 -0.933470 -0.485324 0.313332 -0.816262 -0.558333 0.326883 -0.762503 -0.621696 0.307889 -0.720208 -0.687980 0.268905 -0.674072 -0.759178 0.217159 -0.613588 -0.835252 0.170826 -0.522659 -0.929239 0.210682 -0.303527 -0.591164 0.488598 0.641714 0.566330 0.213962 0.795921 0.708137 0.030396 0.705421 0.704914 -0.110201 0.700680 0.670717 -0.238792 0.702223 0.635831 -0.342031 0.691906 0.616707 -0.420799 0.665282 0.625152 -0.489831 0.607660 0.697608 -0.600435 0.390923 0.413799 -0.552146 -0.723813 -0.434481 0.092215 -0.895948 -0.599758 0.226452 -0.767469 -0.671621 0.233246 -0.703223 -0.736629 0.201679 -0.645526 -0.803986 0.143921 -0.576969 -0.870876 0.068551 -0.486699 -0.931456 -0.000168 -0.363853 -0.990619 0.039113 -0.130938 -0.501804 0.521028 0.690451 0.687159 0.404005 0.603815 0.820310 0.214942 0.529992 0.823893 0.049349 0.564593 0.790109 -0.109300 0.603143 0.748608 -0.237540 0.618999 0.720113 -0.333752 0.608315 0.717151 -0.415421 0.559571 0.762393 -0.545306 0.348422 0.335555 -0.599960 -0.726258 -0.543665 0.023164 -0.838982 -0.695342 0.161401 -0.700321 -0.762078 0.166132 -0.625809 -0.823296 0.128635 -0.552844 -0.884276 0.061723 -0.462867 -0.937747 -0.023699 -0.346509 -0.974919 -0.097924 -0.199860 -0.998159 -0.047302 0.037967 -0.395553 0.581823 0.710647 0.750094 0.506165 0.425623 0.877990 0.315655 0.359854 0.895928 0.144469 0.420049 0.872878 -0.024583 0.487318 0.833897 -0.164279 0.526905 0.802065 -0.270345 0.532547 0.790932 -0.360960 0.494099 0.810302 -0.508080 0.292002 0.256002 -0.645766 -0.719339 -0.639093 -0.033763 -0.768388 -0.774848 0.111891 -0.622166 -0.833226 0.119423 -0.539882 -0.886119 0.083635 -0.455850 -0.935796 0.018941 -0.352034 -0.973129 -0.061619 -0.221861 -0.989805 -0.125967 -0.066471 -0.984339 -0.055211 0.167419 -0.293106 0.647913 0.703063 0.788702 0.537328 0.298711 0.909950 0.345110 0.229977 0.937725 0.181402 0.296252 0.926619 0.019214 0.375509 0.895413 -0.118168 0.429268 0.865469 -0.225776 0.447201 0.849820 -0.321024 0.418031 0.845808 -0.482816 0.226929 0.181675 -0.687559 -0.703034 -0.720004 -0.083281 -0.688955 -0.839658 0.071733 -0.538358 -0.887764 0.085897 -0.452213 -0.929723 0.058102 -0.363648 -0.966556 0.004789 -0.256411 -0.990165 -0.059888 -0.126435 -0.994225 -0.104583 0.024048 -0.968663 -0.009083 0.248212 -0.203481 0.702891 0.681572 0.821788 0.523442 0.225108 0.933258 0.328009 0.146421 0.962605 0.178297 0.203965 0.959544 0.033525 0.279555 0.937402 -0.091707 0.335958 0.912674 -0.194123 0.359642 0.895766 -0.290079 0.336834 0.871858 -0.463804 0.157322 0.117842 -0.723954 -0.679709 -0.785506 -0.128071 -0.605457 -0.890451 0.036891 -0.453582 -0.927916 0.060027 -0.367926 -0.958522 0.044057 -0.281593 -0.983569 0.007285 -0.180385 -0.997460 -0.035935 -0.061494 -0.995590 -0.056513 0.074876 -0.956160 0.064885 0.285567 -0.129724 0.743202 0.656371 0.852753 0.485438 0.192774 0.952623 0.286747 0.101414 0.977843 0.153892 0.141918 0.978589 0.030881 0.203496 0.964365 -0.077326 0.253024 0.946024 -0.170388 0.275694 0.930063 -0.264085 0.255427 0.890266 -0.447070 0.086917 0.067498 -0.754457 -0.652869 -0.835601 -0.169481 -0.522539 -0.928229 0.005001 -0.371976 -0.956057 0.038060 -0.290701 -0.976613 0.035405 -0.212069 -0.992209 0.016713 -0.123455 -0.999748 -0.003965 -0.022107 -0.995468 -0.000022 0.095099 -0.945951 0.145476 0.289851 -0.073835 0.771197 0.632300 0.878823 0.438462 0.188205 0.967666 0.237775 0.084175 0.987000 0.122351 0.104214 0.988966 0.021259 0.146611 0.980666 -0.068888 0.183163 0.968246 -0.150795 0.199403 0.954242 -0.240318 0.177961 0.902563 -0.430138 0.019033 0.031864 -0.779357 -0.625770 -0.871151 -0.207467 -0.445032 -0.954390 -0.024573 -0.297550 -0.974588 0.018125 -0.223269 -0.987436 0.028292 -0.155465 -0.996257 0.026383 -0.082315 -0.999664 0.025906 -0.000390 -0.993992 0.051315 0.096677 -0.936808 0.216427 0.274864 -0.037127 0.790563 0.611254 0.897351 0.394618 0.197579 0.977676 0.193083 0.082877 0.992165 0.093295 0.083094 0.994340 0.011349 0.105639 0.989952 -0.062421 0.126883 0.982024 -0.133326 0.133612 0.969962 -0.217816 0.108307 0.910019 -0.412351 -0.042814 0.008587 -0.798732 -0.601626 -0.894445 -0.241603 -0.376293 -0.971133 -0.051845 -0.232837 -0.985999 -0.000582 -0.166750 -0.993632 0.020795 -0.110737 -0.998044 0.033001 -0.053098 -0.998749 0.048873 0.010614 -0.991814 0.091134 0.089445 -0.928903 0.270747 0.252657 -0.014119 0.805487 0.592446 0.908693 0.360244 0.210952 0.983370 0.158646 0.088407 0.994863 0.071400 0.071761 0.997060 0.004651 0.076486 0.995015 -0.055628 0.082773 0.990004 -0.116813 0.079038 0.979358 -0.196243 0.048432 0.914046 -0.393901 -0.096758 -0.003527 -0.813327 -0.581797 -0.908078 -0.271628 -0.318766 -0.980799 -0.076648 -0.179326 -0.992459 -0.018384 -0.121191 -0.997030 0.011993 -0.076079 -0.998872 0.035110 -0.031974 -0.997868 0.063115 0.016636 -0.989791 0.117414 0.080789 -0.923110 0.306833 0.231779 -0.003531 0.816743 0.576991 0.914529 0.337743 0.222636 0.986133 0.136189 0.094835 0.996181 0.058025 0.065246 0.998451 0.002407 0.055590 0.997664 -0.047585 0.049013 0.994261 -0.100897 0.035556 0.984425 -0.175805 -0.000554 0.916034 -0.375340 -0.141426 -0.008185 -0.823381 -0.567429 -0.914907 -0.296555 -0.273862 -0.985606 -0.098080 -0.137703 -0.995682 -0.034701 -0.086094 -0.998768 0.002138 -0.049586 -0.999339 0.032800 -0.015662 -0.997383 0.068843 0.022094 -0.988489 0.130806 0.076020 -0.919680 0.326395 0.218298 0.000075 0.824973 0.565172 0.917033 0.326891 0.228457 0.987305 0.125375 0.097522 0.996834 0.052983 0.059282 0.999208 0.004631 0.039517 0.998991 -0.038345 0.023386 0.996294 -0.085986 0.002268 0.986787 -0.157385 -0.038491 0.916907 -0.358021 -0.176362 -0.007643 -0.829337 -0.558697 -0.917505 -0.315910 -0.241630 -0.987480 -0.115569 -0.107361 -0.996989 -0.049039 -0.060064 -0.999542 -0.008264 -0.029111 -0.999638 0.026845 -0.001525 -0.997280 0.067450 0.029720 -0.987985 0.133622 0.077657 -0.918305 0.332730 0.214494 -0.001148 0.829930 0.557866 0.917756 0.325481 0.227566 0.987757 0.123979 0.094685 0.997173 0.054715 0.051506 0.999614 0.010438 0.025754 0.999589 -0.028434 0.003710 0.997111 -0.072594 -0.022364 0.987690 -0.141703 -0.066253 0.917381 -0.342897 -0.202075 -0.004478 -0.831450 -0.555581 -0.918042 -0.328476 -0.222039 -0.987902 -0.127892 -0.087707 -0.997301 -0.060353 -0.041806 -0.999752 -0.018280 -0.012726 -0.999752 0.018281 0.012735 -0.997301 0.060354 0.041814 -0.987902 0.127893 0.087712 -0.918043 0.328473 0.222040 -0.004530 0.831447 0.555586 0.917701 0.331506 0.218927 0.987888 0.130067 0.084614 0.997299 0.061758 0.039748 0.999752 0.018764 0.012012 0.999752 -0.018773 -0.012008 0.997299 -0.061766 -0.039743 0.987888 -0.130075 -0.084608 0.917702 -0.331508 -0.218918 -0.001112 -0.829937 -0.557856 -0.918312 -0.332626 -0.214622 -0.987989 -0.133528 -0.077763 -0.997282 -0.067384 -0.029783 -0.999639 -0.026815 0.001514 -0.999541 0.008258 0.029152 -0.996986 0.049001 0.060152 -0.987475 0.115506 0.107484 -0.917497 0.315834 0.241762 -0.007668 0.829332 0.558704 0.917382 0.342968 0.201949 0.987689 0.141760 0.066138 0.997110 0.072625 0.022284 0.999589 0.028432 -0.003740 0.999614 -0.010476 -0.025730 0.997173 -0.054790 -0.051429 0.987756 -0.124081 -0.094562 0.917754 -0.325588 -0.227420 0.000088 -0.824993 -0.565143 -0.919707 -0.326145 -0.218557 -0.988502 -0.130581 -0.076234 -0.997391 -0.068685 -0.022215 -0.999342 -0.032719 0.015649 -0.998763 -0.002132 0.049676 -0.995669 0.034644 0.086274 -0.985582 0.097974 0.137947 -0.914871 0.296424 0.274125 -0.008176 0.823368 0.567450 0.916909 0.358141 0.176106 0.986780 0.157484 0.038252 0.996289 0.086037 -0.002440 0.998990 0.038329 -0.023465 0.999209 -0.004724 -0.039486 0.996834 -0.053155 -0.059138 0.987299 -0.125611 -0.097279 0.917018 -0.327141 -0.228161 -0.003605 -0.816786 -0.576930 -0.923164 -0.306389 -0.232150 -0.989813 -0.117020 -0.081093 -0.997883 -0.062834 -0.016796 -0.998877 -0.034954 0.031976 -0.997018 -0.011953 0.076232 -0.992426 0.018329 0.121468 -0.980743 0.076522 0.179690 -0.907990 0.271467 0.319155 -0.003439 0.813303 0.581830 0.916035 0.375482 0.141044 0.984404 0.175922 0.000191 0.994246 0.100946 -0.035830 0.997659 0.047535 -0.049157 0.998451 -0.002578 -0.055572 0.996176 -0.058324 -0.065054 0.986111 -0.136595 -0.094484 0.914478 -0.338174 -0.222191 -0.014262 -0.805580 -0.592316 -0.928976 -0.270039 -0.253145 -0.991835 -0.090510 -0.089839 -0.998768 -0.048429 -0.010802 -0.998050 -0.032746 0.053134 -0.993608 -0.020708 0.110972 -0.985933 0.000536 0.167141 -0.971022 0.051704 0.233330 -0.894278 0.241412 0.376811 0.008750 0.798689 0.601680 0.914033 0.394056 0.096249 0.979309 0.196370 -0.048925 0.989969 0.116849 -0.079425 0.995002 0.055526 -0.082996 0.997058 -0.004929 -0.076494 0.994846 -0.071872 -0.071522 0.983309 -0.159282 -0.087931 0.908575 -0.360914 -0.210315 -0.037476 -0.790706 -0.611049 -0.936886 -0.215385 -0.275416 -0.993995 -0.050414 -0.097119 -0.999681 -0.025265 0.000208 -0.996259 -0.026004 0.082412 -0.987388 -0.028138 0.155799 -0.974471 -0.018144 0.223778 -0.954201 0.024434 0.298168 -0.870872 0.207263 0.445672 0.032165 0.779297 0.625829 0.909980 0.412502 0.042169 0.969863 0.217941 -0.108940 0.981952 0.133340 -0.134131 0.989920 0.062254 -0.127211 0.994329 -0.011763 -0.105699 0.992122 -0.093986 -0.082828 0.977543 -0.194005 -0.082286 0.897112 -0.395574 -0.196751 -0.074606 -0.771278 -0.632111 -0.946045 -0.144319 -0.290121 -0.995446 0.001024 -0.095323 -0.999745 0.004706 0.022089 -0.992191 -0.016235 0.123667 -0.976534 -0.035152 0.212473 -0.955895 -0.037977 0.291242 -0.927978 -0.005035 0.372600 -0.835221 0.169384 0.523178 0.068003 0.754407 0.652875 0.902525 0.430187 -0.019679 0.954113 0.240349 -0.178606 0.968142 0.150720 -0.199964 0.980608 0.068631 -0.183572 0.988928 -0.021770 -0.146789 0.986914 -0.123140 -0.104102 0.967454 -0.238782 -0.083765 0.878456 -0.439480 -0.187541 -0.130583 -0.743285 -0.656106 -0.956275 -0.063904 -0.285401 -0.995550 0.057402 -0.074734 -0.997421 0.036636 0.061723 -0.983509 -0.006785 0.180729 -0.958406 -0.043737 0.282037 -0.927724 -0.059847 0.368438 -0.890173 -0.036809 0.454134 -0.785080 0.128095 0.606004 0.118402 0.723880 0.679690 0.890246 0.447004 -0.087461 0.929935 0.263997 -0.255983 0.945906 0.170207 -0.276210 0.964279 0.076987 -0.253454 0.978511 -0.031435 -0.203785 0.977706 -0.154665 -0.142022 0.952358 -0.287656 -0.101327 0.852333 -0.486298 -0.192464 -0.203972 -0.703403 -0.680896 -0.968654 0.010488 -0.248193 -0.994099 0.105785 -0.024002 -0.990083 0.060763 0.126663 -0.966448 -0.004240 0.256828 -0.929527 -0.057818 0.364194 -0.887461 -0.085800 0.452826 -0.839247 -0.071758 0.538994 -0.719439 0.083180 0.689557 0.182178 0.687378 0.703081 0.871727 0.463841 -0.157936 0.895522 0.290089 -0.337475 0.912460 0.194007 -0.360247 0.937257 0.091357 -0.336456 0.959439 -0.034228 -0.279829 0.962417 -0.179386 -0.203897 0.932863 -0.329327 -0.145982 0.821254 -0.524632 -0.224286 -0.294640 -0.647549 -0.702757 -0.984329 0.056663 -0.166989 -0.989626 0.127203 0.066783 -0.972977 0.062540 0.222270 -0.935608 -0.018332 0.352563 -0.885840 -0.083282 0.456456 -0.832837 -0.119252 0.540519 -0.774340 -0.111835 0.622808 -0.638375 0.033760 0.768985 0.256796 0.645712 0.719104 0.845647 0.482791 -0.227585 0.849506 0.320986 -0.418697 0.865173 0.225617 -0.447853 0.895187 0.117771 -0.429850 0.926440 -0.019973 -0.375912 0.937470 -0.182550 -0.296354 0.909494 -0.346470 -0.229737 0.788092 -0.538589 -0.298049 -0.396638 -0.581936 -0.709950 -0.998173 0.047873 -0.036855 -0.974677 0.098487 0.200762 -0.937455 0.024202 0.347264 -0.883966 -0.061300 0.463515 -0.822961 -0.128302 0.553420 -0.761700 -0.165877 0.626337 -0.694891 -0.161203 0.700814 -0.543013 -0.022997 0.839409 0.336244 0.599863 0.726020 0.810247 0.507913 -0.292445 0.790734 0.360751 -0.494569 0.801850 0.270026 -0.533032 0.833688 0.163786 -0.527388 0.872647 0.023880 -0.487767 0.895608 -0.145317 -0.420440 0.877556 -0.316475 -0.360193 0.749612 -0.506803 -0.425714 -0.502506 -0.521384 -0.689671 -0.990482 -0.038773 0.132070 -0.931106 0.000519 0.364748 -0.870493 -0.068239 0.487427 -0.803598 -0.143661 0.577574 -0.736230 -0.201473 0.646045 -0.671195 -0.233087 0.703681 -0.599278 -0.226322 0.767883 -0.433830 -0.092088 0.896276 0.414376 0.552064 0.723545 0.762324 0.545173 -0.348781 0.716967 0.415226 -0.559952 0.719924 0.333433 -0.608713 0.748435 0.237043 -0.619400 0.789920 0.108596 -0.603517 0.823622 -0.050184 -0.564914 0.819932 -0.215724 -0.530259 0.686796 -0.404590 -0.603836 -0.591993 -0.488803 -0.640793 -0.928830 -0.210880 0.304638 -0.834722 -0.170905 0.523479 -0.758678 -0.217147 0.614210 -0.687532 -0.268830 0.674560 -0.621287 -0.307779 0.720607 -0.557943 -0.326752 0.762845 -0.484917 -0.313177 0.816563 -0.310465 -0.178431 0.933688 0.486060 0.505129 0.713155 0.697626 0.600232 -0.391202 0.625093 0.489550 -0.607947 0.616646 0.420409 -0.665585 0.635768 0.341516 -0.692218 0.670602 0.238186 -0.702538 0.704674 0.109629 -0.701011 0.707746 -0.030767 -0.705797 0.565918 -0.214163 -0.796160 -0.640808 -0.488915 -0.591885 -0.793658 -0.437095 0.423148 -0.675206 -0.388802 0.626841 -0.598675 -0.404059 0.691610 -0.534319 -0.426621 0.729725 -0.476297 -0.442996 0.759536 -0.419414 -0.446271 0.790528 -0.349134 -0.423054 0.836140 -0.171752 -0.283577 0.943443 0.548497 0.461618 0.697180 0.611496 0.675713 -0.411685 0.511603 0.585199 -0.629130 0.489690 0.530452 -0.691971 0.494367 0.472867 -0.729382 0.512909 0.401550 -0.758737 0.532009 0.314343 -0.786229 0.524367 0.212993 -0.824423 0.369469 0.039892 -0.928386 -0.658323 -0.493583 -0.568320 -0.607271 -0.655619 0.448760 -0.473344 -0.602604 0.642506 -0.405571 -0.592968 0.695630 -0.353380 -0.592032 0.724307 -0.306534 -0.589643 0.747233 -0.258175 -0.579168 0.773246 -0.192930 -0.546715 0.814789 -0.018262 -0.400227 0.916234 0.601721 0.424378 0.676635 0.502012 0.766608 -0.400371 0.375763 0.695261 -0.612711 0.340295 0.653591 -0.676031 0.328961 0.615024 -0.716610 0.327246 0.571460 -0.752558 0.323589 0.519460 -0.790855 0.295155 0.451845 -0.841855 0.130084 0.286871 -0.949096 -0.668632 -0.487013 -0.561916 -0.415030 -0.821326 0.391374 -0.266798 -0.771405 0.577713 -0.206620 -0.749407 0.629045 -0.164427 -0.735637 0.657116 -0.126731 -0.722283 0.679887 -0.085610 -0.703242 0.705777 -0.025314 -0.664564 0.746802 0.143241 -0.511388 0.847328 0.646372 0.396238 0.652073 0.374604 0.858465 -0.350299 0.224464 0.802950 -0.552166 0.177621 0.770450 -0.612257 0.153130 0.744120 -0.650258 0.135007 0.717096 -0.683774 0.112971 0.684633 -0.720080 0.068007 0.634751 -0.769718 -0.099485 0.471846 -0.876050 -0.679810 -0.474945 -0.558825 -0.246866 -0.925723 0.286519 -0.083199 -0.882126 0.463608 -0.025449 -0.856684 0.515213 0.011957 -0.838411 0.544907 0.044824 -0.820807 0.569445 0.081848 -0.798199 0.596807 0.138932 -0.756688 0.638844 0.300460 -0.598761 0.742435 0.682156 0.378928 0.625362 0.241666 0.933783 -0.263908 0.071509 0.889172 -0.451951 0.016873 0.861455 -0.507554 -0.015587 0.840583 -0.541459 -0.042857 0.820192 -0.570480 -0.074469 0.794885 -0.602173 -0.127385 0.750978 -0.647923 -0.291627 0.586704 -0.755468 -0.689939 -0.464681 -0.555028 -0.109026 -0.980518 0.163395 0.069114 -0.941776 0.329062 0.127817 -0.916223 0.379735 0.164242 -0.897171 0.410011 0.195690 -0.878672 0.435477 0.231314 -0.855235 0.463753 0.286939 -0.812945 0.506741 0.441852 -0.652373 0.615772 0.708421 0.371887 0.599866 0.116178 0.981391 -0.152886 -0.069566 0.942730 -0.326223 -0.128699 0.916825 -0.377979 -0.164794 0.897546 -0.408966 -0.195701 0.878842 -0.435130 -0.230771 0.855188 -0.464110 -0.286149 0.812502 -0.507897 -0.444819 0.646480 -0.619839 -0.696674 -0.458294 -0.551917 0.003496 -0.999341 0.036118 0.193535 -0.962547 0.189862 0.254105 -0.937270 0.238654 0.291025 -0.918287 0.268429 0.322547 -0.899797 0.293818 0.358031 -0.876348 0.322223 0.413053 -0.834001 0.365826 0.561899 -0.672526 0.481642 0.725697 0.371802 0.578902 0.005577 0.999523 -0.030377 -0.191804 0.962899 -0.189834 -0.253361 0.937426 -0.238831 -0.290810 0.918383 -0.268330 -0.322770 0.899868 -0.293354 -0.358660 0.876375 -0.321451 -0.414240 0.833757 -0.365040 -0.566802 0.666964 -0.483627 -0.699199 -0.455041 -0.551416 0.097161 -0.991093 -0.091071 0.296321 -0.953701 0.051459 0.358496 -0.928343 0.098284 0.396068 -0.909358 0.127270 0.427924 -0.890897 0.152264 0.463503 -0.867501 0.180573 0.518046 -0.825278 0.224822 0.661119 -0.664461 0.348445 0.735849 0.374765 0.563984 -0.088980 0.991441 0.095535 -0.294967 0.954117 -0.051535 -0.357910 0.928540 -0.098560 -0.395848 0.909442 -0.127359 -0.428006 0.890887 -0.152088 -0.463895 0.867373 -0.180179 -0.518960 0.824793 -0.224494 -0.665496 0.658593 -0.351241 -0.697606 -0.453074 -0.555040 0.176802 -0.959655 -0.218639 0.382716 -0.919839 -0.086163 0.445952 -0.894122 -0.040893 0.483899 -0.875036 -0.012444 0.515891 -0.856565 0.012369 0.551389 -0.833249 0.040828 0.605270 -0.791349 0.086115 0.742700 -0.632933 0.218612 0.741129 0.377620 0.555095 -0.169361 0.960132 0.222402 -0.381755 0.920237 0.086180 -0.445582 0.894317 0.040673 -0.483756 0.875116 0.012294 -0.515933 0.856539 -0.012389 -0.551655 0.833076 -0.040758 -0.606028 0.790754 -0.086247 -0.746790 0.626753 -0.222452 -0.692497 -0.449918 -0.563934 0.244914 -0.904737 -0.348524 0.455727 -0.861235 -0.224915 0.519567 -0.835110 -0.180671 0.557614 -0.815999 -0.152355 0.589522 -0.797651 -0.127344 0.624736 -0.774620 -0.098330 0.677770 -0.733470 -0.051472 0.809722 -0.579701 0.091087 0.743641 0.377987 0.551475 -0.237555 0.905687 0.351138 -0.454748 0.861893 0.224377 -0.519154 0.835499 0.180056 -0.557466 0.816171 0.151973 -0.589624 0.797588 0.127265 -0.625148 0.774266 0.098498 -0.678788 0.732525 0.051508 -0.814121 0.572783 -0.095536 -0.684861 -0.442602 -0.578851 0.301499 -0.822825 -0.481723 0.515772 -0.774648 -0.365922 0.579961 -0.748164 -0.322329 0.618010 -0.729160 -0.293920 0.649778 -0.711117 -0.268518 0.684668 -0.688653 -0.238717 0.736831 -0.648861 -0.189892 0.863704 -0.502704 -0.036116 0.745211 0.374146 0.551973 -0.294163 0.824424 0.483522 -0.514884 0.775713 0.364916 -0.579577 0.748897 0.321315 -0.617871 0.729559 0.293221 -0.649892 0.711126 0.268217 -0.685120 0.688193 0.238750 -0.737974 0.647592 0.189790 -0.868394 0.494945 0.030365 -0.676275 -0.427619 -0.599829 0.344063 -0.708771 -0.615844 0.560585 -0.654876 -0.506835 0.625025 -0.627831 -0.463865 0.663136 -0.608693 -0.435596 0.694878 -0.590715 -0.410122 0.729584 -0.568717 -0.379827 0.781057 -0.530687 -0.329121 0.903672 -0.395818 -0.163417 0.747370 0.365131 0.555083 -0.337430 0.708568 0.619736 -0.560537 0.654196 0.507766 -0.625187 0.627603 0.463957 -0.663205 0.609062 0.434974 -0.694862 0.591632 0.408827 -0.729613 0.569981 0.377871 -0.781624 0.531684 0.326155 -0.907988 0.390120 0.152852 -0.669180 -0.401371 -0.625379 0.368361 -0.559419 -0.742537 0.585885 -0.498469 -0.638958 0.650375 -0.469771 -0.596932 0.688464 -0.449011 -0.569567 0.720141 -0.429371 -0.545011 0.754666 -0.406154 -0.515284 0.805570 -0.368922 -0.463631 0.925155 -0.249032 -0.286481 0.751142 0.351260 0.558929 -0.362301 0.546142 0.755292 -0.586684 0.486072 0.647716 -0.651162 0.462220 0.601947 -0.688882 0.447483 0.570263 -0.720176 0.434012 0.541276 -0.754483 0.416267 0.507422 -0.805808 0.382731 0.451874 -0.929522 0.257612 0.263866 -0.666207 -0.361688 -0.652189 0.371356 -0.379405 -0.847435 0.588255 -0.309996 -0.746899 0.651891 -0.277113 -0.705865 0.688940 -0.251048 -0.679953 0.719358 -0.225141 -0.657142 0.752390 -0.195583 -0.629013 0.801546 -0.154590 -0.577604 0.918894 -0.051274 -0.391159 0.755901 0.335552 0.562156 -0.359043 0.322604 0.875794 -0.583875 0.259013 0.769417 -0.649545 0.244983 0.719774 -0.688656 0.242037 0.683499 -0.721096 0.239722 0.650042 -0.756119 0.231532 0.612108 -0.807665 0.207083 0.552082 -0.930784 0.104733 0.350247 -0.668312 -0.308837 -0.676741 0.355874 -0.183949 -0.916251 0.570024 -0.105903 -0.814774 0.630735 -0.065602 -0.773220 0.663983 -0.028953 -0.747187 0.689480 0.010410 -0.724230 0.716401 0.055106 -0.695509 0.758654 0.108928 -0.642323 0.871507 0.198341 -0.448483 0.756533 0.323443 0.568368 -0.313691 0.031179 0.949013 -0.539199 -0.029247 0.841671 -0.611980 -0.020008 0.790620 -0.658802 0.002789 0.752311 -0.697327 0.022976 0.716385 -0.736332 0.032302 0.675849 -0.790097 0.022289 0.612576 -0.914948 -0.051447 0.400278 -0.673804 -0.244025 -0.697453 0.331739 0.007307 -0.943343 0.541135 0.091161 -0.835980 0.596353 0.140435 -0.790343 0.621947 0.191358 -0.759318 0.636776 0.249813 -0.729459 0.649421 0.316841 -0.691277 0.674485 0.390745 -0.626409 0.775491 0.469128 -0.422532 0.743424 0.310365 0.592448 -0.219646 -0.299813 0.928368 -0.447120 -0.347363 0.824271 -0.538732 -0.303197 0.786028 -0.604645 -0.243046 0.758507 -0.657043 -0.191410 0.729148 -0.704486 -0.158680 0.691752 -0.762777 -0.150381 0.628933 -0.891026 -0.191665 0.411506 -0.680361 -0.168030 -0.713355 0.310121 0.179981 -0.933505 0.513964 0.263613 -0.816302 0.562209 0.320075 -0.762544 0.577439 0.384457 -0.720247 0.576813 0.461372 -0.674109 0.567583 0.548931 -0.613616 0.565468 0.638004 -0.522682 0.646941 0.699489 -0.303616 0.718742 0.268624 0.641288 -0.097705 -0.597450 0.795932 -0.327684 -0.628453 0.705457 -0.447860 -0.555349 0.700721 -0.542132 -0.461426 0.702267 -0.614096 -0.379592 0.691951 -0.672747 -0.323650 0.665329 -0.736751 -0.296456 0.607711 -0.868767 -0.303920 0.390994 -0.684979 -0.082292 -0.723900 0.297180 0.330027 -0.895972 0.496057 0.406042 -0.767501 0.537860 0.464907 -0.703255 0.543005 0.537038 -0.645551 0.526620 0.624325 -0.576966 0.494708 0.720035 -0.486635 0.465356 0.806951 -0.363693 0.528830 0.838604 -0.130698 0.702189 0.173511 0.690525 0.006598 -0.797452 0.603347 -0.223674 -0.818192 0.529652 -0.369012 -0.738406 0.564435 -0.489649 -0.629686 0.603108 -0.580034 -0.529509 0.619017 -0.649138 -0.456656 0.608347 -0.718394 -0.413222 0.559604 -0.853499 -0.387457 0.348448 -0.687359 0.009388 -0.726257 0.291886 0.459263 -0.838975 0.487445 0.521499 -0.700312 0.524914 0.576923 -0.625800 0.523055 0.648678 -0.552838 0.495606 0.734934 -0.462868 0.448379 0.823940 -0.346524 0.402702 0.893238 -0.199890 0.458173 0.888054 0.037930 0.701637 0.051662 0.710659 0.063244 -0.902660 0.425682 -0.165686 -0.918163 0.359897 -0.322886 -0.848108 0.420068 -0.457744 -0.743633 0.487320 -0.559223 -0.640039 0.526897 -0.635158 -0.559447 0.532535 -0.708065 -0.504503 0.494085 -0.845160 -0.447716 0.291985 -0.687220 0.101188 -0.719368 0.290281 0.570410 -0.768355 0.484295 0.615149 -0.622133 0.520012 0.661924 -0.539856 0.515478 0.725596 -0.455843 0.484322 0.800925 -0.352067 0.433282 0.873500 -0.221958 0.385973 0.920100 -0.066633 0.444588 0.879982 0.167251 0.707728 -0.070305 0.702978 0.070826 -0.951635 0.298955 -0.156237 -0.960531 0.230151 -0.311833 -0.902741 0.296342 -0.446683 -0.812065 0.375533 -0.550028 -0.716387 0.429255 -0.628238 -0.636675 0.447171 -0.702899 -0.575513 0.417992 -0.841013 -0.491142 0.226885 -0.686365 0.186377 -0.702970 0.287844 0.665172 -0.688979 0.481924 0.691301 -0.538379 0.518242 0.725887 -0.452232 0.515148 0.776125 -0.363664 0.487394 0.834681 -0.256427 0.443189 0.887464 -0.126456 0.406520 0.913326 0.024013 0.476460 0.843451 0.248146 0.710411 -0.174821 0.681728 0.042455 -0.973390 0.225190 -0.182564 -0.972219 0.146496 -0.326890 -0.922777 0.204022 -0.450727 -0.847745 0.279596 -0.548105 -0.765957 0.335992 -0.624434 -0.693338 0.359674 -0.699080 -0.630721 0.336866 -0.837575 -0.523168 0.157361 -0.685808 0.259955 -0.679773 0.281837 0.744308 -0.605453 0.477164 0.752712 -0.453585 0.515932 0.773587 -0.367937 0.517407 0.808074 -0.281615 0.498089 0.848148 -0.180421 0.467616 0.881786 -0.061547 0.448877 0.890457 0.074809 0.534324 0.795599 0.285516 0.708534 -0.259600 0.656192 -0.006006 -0.981216 0.192820 -0.227981 -0.968365 0.101460 -0.355632 -0.923784 0.141946 -0.462529 -0.862932 0.203508 -0.549126 -0.796517 0.253023 -0.620551 -0.734107 0.275686 -0.693719 -0.673437 0.255414 -0.832299 -0.547474 0.086896 -0.687234 0.318662 -0.652812 0.270972 0.808390 -0.522571 0.468403 0.801383 -0.372000 0.510948 0.808959 -0.290720 0.518927 0.828090 -0.212087 0.510540 0.850942 -0.123479 0.496409 0.867806 -0.022145 0.497698 0.862128 0.095038 0.598958 0.746520 0.289753 0.704858 -0.321266 0.632426 -0.059662 -0.980294 0.188318 -0.277912 -0.956903 0.084270 -0.387531 -0.915939 0.104285 -0.476050 -0.867102 0.146661 -0.549966 -0.814846 0.183203 -0.614688 -0.763140 0.199438 -0.685216 -0.706255 0.177997 -0.823766 -0.566609 0.019073 -0.690893 0.362048 -0.625770 0.255993 0.858057 -0.445204 0.455996 0.838710 -0.297713 0.503049 0.834888 -0.223392 0.518238 0.840978 -0.155518 0.520933 0.849624 -0.082268 0.522134 0.852863 -0.000218 0.541199 0.835284 0.096973 0.655525 0.703238 0.275215 0.703248 -0.363064 0.611250 -0.106650 -0.974551 0.197172 -0.321386 -0.943343 0.082553 -0.415146 -0.905969 0.082910 -0.487295 -0.866830 0.105593 -0.549056 -0.826088 0.126946 -0.606538 -0.783724 0.133749 -0.673695 -0.731003 0.108487 -0.812196 -0.581826 -0.042622 -0.695882 0.392087 -0.601677 0.238033 0.895414 -0.376262 0.440696 0.866938 -0.232820 0.492525 0.854176 -0.166743 0.514855 0.850095 -0.110735 0.527632 0.847812 -0.053098 0.541727 0.840488 0.010619 0.574854 0.813351 0.089464 0.698949 0.669036 0.252708 0.704490 -0.390886 0.592370 -0.142403 -0.967085 0.210875 -0.354299 -0.930949 0.088352 -0.435604 -0.897277 0.071718 -0.494512 -0.865802 0.076452 -0.545694 -0.833890 0.082741 -0.596176 -0.798957 0.079002 -0.659642 -0.750020 0.048392 -0.798167 -0.594607 -0.096809 -0.702665 0.409638 -0.581772 0.218721 0.922287 -0.318664 0.423955 0.887773 -0.179224 0.480261 0.868724 -0.121116 0.508879 0.857472 -0.076046 0.529854 0.847485 -0.031998 0.553645 0.832588 0.016546 0.596672 0.798424 0.080635 0.727390 0.645967 0.231583 0.709154 -0.405146 0.577024 -0.164874 -0.960807 0.222861 -0.375228 -0.922049 0.095018 -0.447906 -0.891689 0.065360 -0.497165 -0.865871 0.055633 -0.540029 -0.840219 0.048995 -0.584471 -0.810638 0.035492 -0.644407 -0.764682 -0.000648 -0.783007 -0.605699 -0.141524 -0.709013 0.418725 -0.567424 0.200672 0.940573 -0.273960 0.407904 0.902568 -0.137788 0.467816 0.879617 -0.086152 0.501242 0.863884 -0.049605 0.528057 0.849065 -0.015638 0.558266 0.829366 0.022163 0.607457 0.790697 0.076128 0.742422 0.633326 0.218419 0.714450 -0.412471 0.565180 -0.175338 -0.957662 0.228341 -0.385009 -0.917757 0.097421 -0.452491 -0.889800 0.059221 -0.495580 -0.867663 0.039502 -0.532716 -0.845970 0.023416 -0.572646 -0.819799 0.002337 -0.629740 -0.775857 -0.038394 -0.768557 -0.615025 -0.176253 -0.714325 0.421411 -0.558707 0.185208 0.952530 -0.241629 0.393684 0.912954 -0.107369 0.456051 0.887924 -0.060072 0.492636 0.869748 -0.029114 0.523084 0.852280 -0.001519 0.557063 0.829937 0.029737 0.609717 0.788803 0.077687 0.747307 0.628892 0.214540 0.719231 -0.414127 0.557859 -0.177015 -0.957553 0.227504 -0.386507 -0.917418 0.094635 -0.451202 -0.890936 0.051469 -0.490774 -0.870907 0.025729 -0.524430 -0.851446 0.003694 -0.561438 -0.827216 -0.022374 -0.616580 -0.784499 -0.066261 -0.755669 -0.622997 -0.202088 -0.717854 0.419552 -0.555574 0.174512 0.959308 -0.221975 0.383163 0.919513 -0.087645 0.446364 0.893876 -0.041762 0.484040 0.874954 -0.012705 0.515718 0.856664 0.012730 0.550943 0.833496 0.041783 0.604745 0.791580 0.087660 0.743524 0.630792 0.221974 0.722350 -0.411739 0.555591 -0.171797 -0.960481 0.219002 -0.381345 -0.920547 0.084678 -0.445197 -0.894548 0.039789 -0.483641 -0.875184 0.012027 -0.516134 -0.856423 -0.012020 -0.552126 -0.832811 -0.039779 -0.606566 -0.790513 -0.084663 -0.745911 -0.629020 -0.218975 -0.718193 0.415931 -0.557854 0.171117 0.961583 -0.214654 0.378378 0.922377 -0.077790 0.440300 0.897356 -0.029800 0.476605 0.879116 0.001510 0.506921 0.861499 0.029161 0.540921 0.838918 0.060173 0.593754 0.797431 0.107513 0.732251 0.636666 0.241795 0.722055 -0.408026 0.558706 -0.161657 -0.965969 0.201916 -0.371064 -0.926251 0.066108 -0.435652 -0.899840 0.022264 -0.475171 -0.879885 -0.003749 -0.508888 -0.860448 -0.025725 -0.546051 -0.836173 -0.051410 -0.601357 -0.793368 -0.094533 -0.740867 -0.631990 -0.227386 -0.714496 0.412446 -0.565141 0.177427 0.959556 -0.218570 0.381185 0.921349 -0.076247 0.439229 0.898100 -0.022222 0.471347 0.881809 0.015649 0.497541 0.866016 0.049684 0.527838 0.844951 0.086289 0.577636 0.804551 0.137967 0.714139 0.644087 0.274148 0.717134 -0.404623 0.567449 -0.148294 -0.973142 0.176081 -0.357002 -0.933321 0.038229 -0.423634 -0.905830 -0.002458 -0.466305 -0.884312 -0.023476 -0.503705 -0.862973 -0.039489 -0.544465 -0.836697 -0.059133 -0.602449 -0.792208 -0.097268 -0.741839 -0.630574 -0.228147 -0.705445 0.411654 -0.576964 0.196120 0.952756 -0.231934 0.393457 0.915775 -0.080923 0.444461 0.895643 -0.016698 0.469151 0.882538 0.032000 0.488184 0.869408 0.076191 0.512148 0.850277 0.121379 0.556729 0.811054 0.179569 0.689191 0.650564 0.319034 0.706027 -0.403770 0.581803 -0.132933 -0.981021 0.141161 -0.339927 -0.940452 0.000303 -0.409753 -0.911496 -0.035752 -0.457679 -0.887759 -0.049131 -0.501428 -0.863410 -0.055616 -0.548519 -0.833594 -0.065178 -0.611230 -0.785769 -0.094686 -0.749978 -0.622939 -0.222440 -0.690785 0.414817 -0.592236 0.230563 0.939540 -0.253191 0.417494 0.904226 -0.089853 0.457405 0.889193 -0.010806 0.470629 0.880730 0.053131 0.478838 0.870863 0.110964 0.493404 0.853594 0.167122 0.530268 0.815099 0.233301 0.656192 0.653804 0.376766 0.687387 -0.406717 0.601731 -0.115721 -0.988601 0.096312 -0.319582 -0.946297 -0.048872 -0.393780 -0.915771 -0.079379 -0.449402 -0.889470 -0.082956 -0.502786 -0.861023 -0.076455 -0.559657 -0.825636 -0.071477 -0.629590 -0.771942 -0.087875 -0.766831 -0.606440 -0.210241 -0.665947 0.427906 -0.611073 0.282147 0.918901 -0.275704 0.453514 0.885914 -0.097371 0.478069 0.878322 0.000056 0.475648 0.875771 0.082362 0.469303 0.869178 0.155832 0.471452 0.853004 0.223867 0.498158 0.814163 0.298291 0.614820 0.650581 0.445804 0.658789 -0.417559 0.625813 -0.097652 -0.994333 0.042017 -0.296084 -0.948913 -0.109079 -0.375422 -0.917082 -0.134235 -0.441015 -0.888432 -0.127257 -0.507384 -0.855218 -0.105658 -0.577558 -0.812152 -0.082679 -0.656946 -0.749462 -0.082025 -0.791319 -0.578991 -0.196427 -0.630028 0.450634 -0.632450 0.347640 0.891803 -0.289541 0.498283 0.861807 -0.094884 0.503759 0.863556 0.022322 0.481992 0.867398 0.123711 0.457905 0.863259 0.212383 0.445225 0.846788 0.291074 0.459849 0.806137 0.372399 0.564541 0.638572 0.522990 0.619314 -0.436330 0.652738 -0.078932 -0.996689 -0.019493 -0.269105 -0.946441 -0.178414 -0.353682 -0.913773 -0.199819 -0.430908 -0.883537 -0.183522 -0.513216 -0.845594 -0.146901 -0.599844 -0.793271 -0.104443 -0.690155 -0.718728 -0.084354 -0.819476 -0.541294 -0.188309 -0.579790 0.483975 -0.655448 0.422666 0.860105 -0.285608 0.547406 0.833516 -0.074813 0.530347 0.845533 0.061689 0.485779 0.855198 0.180709 0.441230 0.851931 0.282008 0.411952 0.833416 0.368393 0.413144 0.789388 0.454070 0.503423 0.615980 0.605916 0.567772 -0.464011 0.679947 -0.057913 -0.994494 -0.087332 -0.236293 -0.937385 -0.255882 -0.325516 -0.904324 -0.276113 -0.415447 -0.873623 -0.253351 -0.516485 -0.831726 -0.203654 -0.622833 -0.769390 -0.141837 -0.725336 -0.680932 -0.101088 -0.847307 -0.495110 -0.192190 -0.506179 0.528701 -0.681365 0.493960 0.833175 -0.248642 0.589066 0.807714 -0.024460 0.547928 0.826923 0.126384 0.479660 0.839055 0.256735 0.414666 0.833899 0.364231 0.369309 0.811456 0.452934 0.357310 0.762667 0.539138 0.431576 0.581414 0.689711 0.504201 -0.501695 0.702911 -0.033994 -0.986831 -0.158145 -0.196339 -0.920563 -0.337661 -0.288049 -0.887208 -0.360401 -0.389427 -0.857370 -0.336544 -0.509414 -0.813766 -0.279788 -0.636774 -0.743670 -0.203651 -0.751964 -0.642947 -0.145497 -0.865340 -0.448528 -0.223626 -0.413543 0.578936 -0.702720 0.540973 0.824346 -0.166740 0.604774 0.793574 0.066999 0.540531 0.811400 0.222388 0.451894 0.819431 0.352597 0.370829 0.808795 0.456439 0.313219 0.780882 0.540479 0.290417 0.726518 0.622760 0.348528 0.535970 0.768937 0.430805 -0.545242 0.719109 -0.004819 -0.973762 -0.227518 -0.146883 -0.896199 -0.418633 -0.237290 -0.862073 -0.447799 -0.345646 -0.834135 -0.429823 -0.480476 -0.792341 -0.375950 -0.626682 -0.720661 -0.296510 -0.754589 -0.614557 -0.230032 -0.860264 -0.413377 -0.298439 -0.306197 0.634309 -0.709856 0.540683 0.840412 -0.037013 0.572732 0.794804 0.200661 0.489736 0.799750 0.347216 0.388896 0.796194 0.463502 0.300334 0.776866 0.553424 0.237143 0.742600 0.626346 0.207776 0.682405 0.700823 0.251526 0.481787 0.839414 0.351353 -0.591037 0.726104 0.034808 -0.955649 -0.292445 -0.082889 -0.865173 -0.494575 -0.167033 -0.829441 -0.533037 -0.274991 -0.803896 -0.527381 -0.415692 -0.767674 -0.487727 -0.573774 -0.702926 -0.420331 -0.713018 -0.601672 -0.359994 -0.813861 -0.395741 -0.425463 -0.199495 0.696161 -0.689609 0.461691 0.877145 0.132131 0.466032 0.806082 0.364754 0.376185 0.787972 0.487427 0.277420 0.767751 0.577579 0.193666 0.738314 0.646054 0.133770 0.697797 0.703693 0.103668 0.632128 0.767898 0.137192 0.421707 0.896293 0.270955 -0.635017 0.723420 0.090947 -0.932767 -0.348819 0.001098 -0.828509 -0.559975 -0.071206 -0.790172 -0.608734 -0.168926 -0.766669 -0.619421 -0.300892 -0.738378 -0.603541 -0.455235 -0.688180 -0.564951 -0.596744 -0.602213 -0.530317 -0.693768 -0.392425 -0.603895 -0.127606 0.756992 -0.640843 0.281128 0.909981 0.304798 0.268869 0.808421 0.523608 0.191021 0.765638 0.614255 0.110873 0.729855 0.674550 0.044148 0.691971 0.720574 -0.003876 0.646614 0.762808 -0.028587 0.576596 0.816529 0.000894 0.358150 0.933664 0.194442 -0.673460 0.713193 0.170815 -0.904339 -0.391145 0.111220 -0.786186 -0.607900 0.055600 -0.744290 -0.665539 -0.022196 -0.721385 -0.692179 -0.128927 -0.699875 -0.702533 -0.257034 -0.665122 -0.701104 -0.379893 -0.597636 -0.706054 -0.467681 -0.383108 -0.796557 -0.103175 0.799106 -0.592270 0.018369 0.905919 0.423053 0.000939 0.779189 0.626788 -0.050574 0.720539 0.691568 -0.102317 0.676083 0.729687 -0.145529 0.634019 0.759501 -0.176820 0.586392 0.790493 -0.191860 0.513921 0.836107 -0.159759 0.290587 0.943417 0.125475 -0.705705 0.697306 0.279488 -0.867441 -0.411621 0.251040 -0.735683 -0.629087 0.214567 -0.689338 -0.691935 0.162333 -0.664604 -0.729349 0.091258 -0.645013 -0.758703 0.006133 -0.617959 -0.786186 -0.077860 -0.560681 -0.824363 -0.150299 -0.340043 -0.928321 -0.098211 0.817068 -0.568115 -0.263717 0.853798 0.448869 -0.284879 0.711297 0.642574 -0.310567 0.647754 0.695674 -0.335972 0.602055 0.724329 -0.357414 0.560263 0.747235 -0.372581 0.513124 0.773232 -0.377135 0.440378 0.814762 -0.337615 0.215856 0.916200 0.066683 -0.733336 0.676588 0.413052 -0.817990 -0.400351 0.414384 -0.672982 -0.612684 0.395995 -0.621445 -0.676013 0.368191 -0.592372 -0.716610 0.331200 -0.569143 -0.752584 0.287825 -0.540021 -0.790907 0.243305 -0.481631 -0.841923 0.182877 -0.256199 -0.949167 -0.087507 0.822617 -0.561821 -0.503749 0.770083 0.391420 -0.534634 0.616748 0.577745 -0.545682 0.553629 0.629068 -0.554862 0.510200 0.657133 -0.562152 0.470873 0.679899 -0.566228 0.425739 0.705785 -0.562883 0.354177 0.746807 -0.514507 0.131609 0.847326 0.020000 -0.757932 0.652027 0.556165 -0.753629 -0.350318 0.583155 -0.595845 -0.552177 0.578426 -0.539030 -0.612267 0.567862 -0.504658 -0.650271 0.553509 -0.475455 -0.683791 0.536402 -0.440142 -0.720103 0.515671 -0.376262 -0.769747 0.458318 -0.149753 -0.876082 -0.071409 0.826190 -0.558848 -0.678321 0.676622 0.286467 -0.722387 0.513090 0.463568 -0.729210 0.450369 0.515190 -0.732069 0.408851 0.544900 -0.733240 0.371596 0.569452 -0.732160 0.328237 0.596826 -0.724743 0.258052 0.638871 -0.668735 0.039203 0.742466 -0.012920 -0.780227 0.625363 0.687808 -0.676209 -0.263935 0.734258 -0.506541 -0.451976 0.737583 -0.445359 -0.507569 0.735754 -0.406800 -0.541461 0.731752 -0.372973 -0.570464 0.725664 -0.332928 -0.602138 0.714118 -0.265135 -0.647873 0.653982 -0.040756 -0.755412 -0.057446 0.829838 -0.555039 -0.794662 0.584659 0.163362 -0.850176 0.411017 0.329036 -0.857390 0.347410 0.379722 -0.859094 0.306348 0.410010 -0.858789 0.269872 0.435488 -0.856296 0.227310 0.463774 -0.847480 0.157999 0.506769 -0.785874 -0.056443 0.615805 -0.032153 -0.799448 0.599874 0.791801 -0.591329 -0.152910 0.851194 -0.411137 -0.326245 0.858333 -0.346967 -0.377992 0.859694 -0.306059 -0.408967 0.858960 -0.269930 -0.435116 0.856020 -0.227722 -0.464083 0.846749 -0.158413 -0.507860 0.782309 0.062013 -0.619797 -0.048535 0.832480 -0.551925 -0.867202 0.496645 0.036119 -0.930357 0.313667 0.189864 -0.938752 0.248572 0.238655 -0.940773 0.207105 0.268430 -0.940522 0.170561 0.293816 -0.937957 0.128105 0.322221 -0.928795 0.059281 0.365821 -0.863377 -0.150358 0.481636 -0.040878 -0.814367 0.578908 0.862825 -0.504590 -0.030372 0.929798 -0.315340 -0.189832 0.938516 -0.249293 -0.238832 0.940748 -0.207341 -0.268333 0.940692 -0.170407 -0.293358 0.938291 -0.127580 -0.321456 0.929173 -0.058138 -0.365046 0.861008 0.157377 -0.483630 -0.044480 0.833047 -0.551411 -0.906886 0.411421 -0.091047 -0.974085 0.220246 0.051477 -0.983214 0.153716 0.098294 -0.985561 0.111678 0.127271 -0.985503 0.074853 0.152254 -0.983033 0.032337 0.180554 -0.973740 -0.036016 0.224795 -0.906007 -0.240332 0.348414 -0.043368 -0.824649 0.563980 0.903108 -0.418645 0.095563 0.973777 -0.221596 -0.051509 0.983097 -0.154302 -0.098542 0.985525 -0.111906 -0.127351 0.985533 -0.074787 -0.152092 0.983112 -0.031956 -0.180193 0.973767 0.037017 -0.224516 0.903102 0.247019 -0.351268 -0.043595 0.830682 -0.555038 -0.919487 0.326704 -0.218651 -0.987962 0.128474 -0.086175 -0.997308 0.060854 -0.040902 -0.999752 0.018451 -0.012448 -0.999753 -0.018487 0.012369 -0.997309 -0.060884 0.040832 -0.987963 -0.128496 0.086124 -0.919487 -0.326723 0.218624 -0.043513 -0.830647 0.555097 0.916180 -0.333403 0.222391 0.987826 -0.129517 0.086174 0.997292 -0.061278 0.040672 0.999751 -0.018616 0.012297 0.999751 0.018542 -0.012380 0.997293 0.061214 -0.040744 0.987827 0.129467 -0.086231 0.916179 0.333374 -0.222437 -0.043376 0.824678 -0.563937 -0.905973 0.240248 -0.348560 -0.973709 0.035929 -0.224946 -0.983005 -0.032416 -0.180693 -0.985481 -0.074915 -0.152367 -0.985547 -0.111714 -0.127345 -0.983211 -0.153720 -0.098321 -0.974093 -0.220217 -0.051454 -0.906904 -0.411370 0.091109 -0.044491 -0.833004 0.551476 0.903130 -0.247138 0.351111 0.973800 -0.037143 0.224353 0.983144 0.031838 0.180040 0.985559 0.074688 0.151968 0.985543 0.111838 0.127272 0.983105 0.154271 0.098516 0.973775 0.221601 0.051534 0.903100 0.418675 -0.095504 -0.040867 0.814409 -0.578850 -0.863338 0.150304 -0.481723 -0.928751 -0.059351 -0.365923 -0.937909 -0.128183 -0.322330 -0.940475 -0.170637 -0.293923 -0.940732 -0.207171 -0.268521 -0.938723 -0.248619 -0.238721 -0.930343 -0.313690 -0.189896 -0.867204 -0.496642 -0.036122 -0.048595 -0.832447 0.551970 0.861050 -0.157455 0.483529 0.929227 0.058051 0.364920 0.938351 0.127486 0.321318 0.940751 0.170317 0.293223 0.940798 0.207264 0.268218 0.938552 0.249238 0.238749 0.929817 0.315311 0.189789 0.862831 0.504579 0.030365 -0.032193 0.799482 -0.599827 -0.785853 0.056426 -0.615833 -0.847438 -0.158037 -0.506826 -0.856235 -0.227368 -0.463860 -0.858713 -0.269944 -0.435594 -0.859011 -0.306426 -0.410126 -0.857309 -0.347486 -0.379836 -0.850107 -0.411081 -0.329135 -0.794613 -0.584705 -0.163433 -0.057471 -0.829807 0.555083 0.782337 -0.062045 0.619757 0.846804 0.158355 0.507786 0.856102 0.227637 0.463972 0.859058 0.269829 0.434984 0.859796 0.305954 0.408831 0.858426 0.346871 0.377870 0.851268 0.411059 0.326149 0.791854 0.591275 0.152845 -0.012992 0.780216 -0.625375 -0.668666 -0.039285 -0.742524 -0.724643 -0.258146 -0.638946 -0.732029 -0.328349 -0.596926 -0.733086 -0.371721 -0.569569 -0.731905 -0.408982 -0.545022 -0.729048 -0.450498 -0.515306 -0.722243 -0.513206 -0.463664 -0.678201 -0.676718 -0.286523 -0.071378 -0.826157 0.558901 0.654077 0.040717 0.755331 0.714253 0.265072 0.647750 0.725849 0.332829 0.601969 0.731962 0.372854 0.570273 0.735956 0.406681 0.541275 0.737752 0.445258 0.507413 0.734378 0.506470 0.451860 0.687881 0.676167 0.263852 0.019821 0.757745 -0.652250 -0.514206 -0.131957 -0.847455 -0.562549 -0.354489 -0.746912 -0.565901 -0.426032 -0.705870 -0.561871 -0.471139 -0.679948 -0.554669 -0.510423 -0.657123 -0.545620 -0.553794 -0.628977 -0.534733 -0.616846 -0.577548 -0.503953 -0.770124 -0.391075 -0.087296 -0.822308 0.562306 0.459034 0.149625 0.875728 0.516344 0.376124 0.769363 0.536984 0.440027 0.719740 0.553944 0.475388 0.683486 0.568126 0.504655 0.650043 0.578525 0.539092 0.612119 0.583114 0.595961 0.552095 0.556032 0.753761 0.350248 0.066708 0.733204 -0.676729 -0.337096 -0.216256 -0.916297 -0.376590 -0.440737 -0.814819 -0.372080 -0.513453 -0.773255 -0.357022 -0.560550 -0.747207 -0.335767 -0.602286 -0.724233 -0.310634 -0.647917 -0.695493 -0.285286 -0.711390 -0.642290 -0.264390 -0.853820 -0.448430 -0.098268 -0.816849 0.568420 0.184295 0.255934 0.948964 0.244646 0.481466 0.841629 0.288867 0.539922 0.790595 0.331857 0.569120 0.752312 0.368487 0.592429 0.716411 0.396002 0.621572 0.675892 0.414183 0.673155 0.612629 0.412753 0.818150 0.400332 0.125652 0.705726 -0.697254 -0.159674 -0.290814 -0.943362 -0.191742 -0.514121 -0.836011 -0.176637 -0.586597 -0.790382 -0.145262 -0.634244 -0.759364 -0.101938 -0.676336 -0.729505 -0.050041 -0.720821 -0.691312 0.001650 -0.779481 -0.626424 0.019215 -0.906109 -0.422607 -0.102392 -0.799568 0.591783 -0.150615 0.340061 0.928264 -0.077867 0.560884 0.824224 0.006464 0.618140 0.786041 0.091753 0.645124 0.758549 0.162818 0.664656 0.729193 0.214957 0.689357 0.691795 0.251316 0.735680 0.628979 0.279679 0.867397 0.411585 0.194590 0.673076 -0.713515 0.000592 -0.358595 -0.933493 -0.028896 -0.576916 -0.816292 -0.004078 -0.646933 -0.762536 0.044143 -0.692326 -0.720234 0.111192 -0.730250 -0.674070 0.191819 -0.766027 -0.613521 0.270245 -0.808685 -0.522491 0.282939 -0.909914 -0.303318 -0.127263 -0.756313 0.641713 -0.469357 0.383412 0.795424 -0.381148 0.597979 0.705087 -0.257465 0.665544 0.700545 -0.128692 0.700243 0.702209 -0.021634 0.721635 0.691936 0.056249 0.744436 0.665321 0.111853 0.786250 0.607700 0.171406 0.904304 0.390965 0.271240 0.634274 -0.723965 0.137383 -0.422446 -0.895916 0.103763 -0.632674 -0.767435 0.133800 -0.698299 -0.703190 0.193626 -0.738810 -0.645499 0.277298 -0.768264 -0.576954 0.375985 -0.788515 -0.486703 0.465766 -0.806637 -0.363866 0.461317 -0.877527 -0.130890 -0.201264 -0.694737 0.690531 -0.693409 0.393212 0.603794 -0.596301 0.602980 0.529944 -0.454701 0.688864 0.564547 -0.300420 0.738931 0.603099 -0.168608 0.767115 0.618956 -0.071034 0.790544 0.608271 0.001181 0.828813 0.559524 0.091059 0.932929 0.348356 0.351844 0.590694 -0.726145 0.251850 -0.482388 -0.838972 0.207968 -0.682880 -0.700303 0.237228 -0.743042 -0.625789 0.300288 -0.777309 -0.552827 0.388692 -0.796667 -0.462861 0.489356 -0.800278 -0.346534 0.572165 -0.795394 -0.199937 0.539907 -0.840875 0.037822 -0.305344 -0.633667 0.710796 -0.813244 0.396560 0.425881 -0.712181 0.602626 0.360055 -0.572941 0.703710 0.420156 -0.415090 0.768237 0.487352 -0.274684 0.804314 0.526904 -0.166950 0.829779 0.532535 -0.082928 0.865448 0.494087 0.034788 0.955785 0.292002 0.431266 0.544576 -0.719338 0.348625 -0.536607 -0.768449 0.290363 -0.726995 -0.622228 0.313061 -0.781325 -0.539929 0.370568 -0.809243 -0.455857 0.451542 -0.819901 -0.351954 0.540115 -0.811882 -0.221638 0.604309 -0.794005 -0.066086 0.540399 -0.824495 0.167858 -0.414475 -0.577759 0.703139 -0.860026 0.414140 0.298067 -0.754169 0.615276 0.229486 -0.626178 0.721315 0.295984 -0.480005 0.792875 0.375425 -0.345295 0.834556 0.429287 -0.237059 0.862414 0.447263 -0.146720 0.896470 0.418108 -0.004600 0.973881 0.227012 0.504638 0.500811 -0.703228 0.432283 -0.581990 -0.688780 0.357843 -0.763083 -0.538194 0.369573 -0.811812 -0.452080 0.414535 -0.834248 -0.363580 0.478999 -0.839518 -0.256455 0.546678 -0.827712 -0.126635 0.587294 -0.809026 0.023706 0.491677 -0.834745 0.247902 -0.508131 -0.527200 0.681075 -0.863874 0.450362 0.225601 -0.750396 0.644489 0.146763 -0.635514 0.744621 0.204112 -0.508743 0.814273 0.279535 -0.389336 0.857691 0.335832 -0.288350 0.887492 0.359460 -0.196823 0.920839 0.336625 -0.034384 0.986986 0.157086 0.568007 0.464476 -0.679434 0.503707 -0.616143 -0.605514 0.413321 -0.789559 -0.453611 0.412029 -0.833581 -0.367932 0.441172 -0.852104 -0.281577 0.485545 -0.855406 -0.180350 0.529916 -0.845821 -0.061452 0.546800 -0.833907 0.074897 0.422012 -0.860473 0.285469 -0.577352 -0.484666 0.657087 -0.846796 0.495693 0.192940 -0.724598 0.681649 0.101550 -0.622141 0.769915 0.142025 -0.516000 0.832046 0.203575 -0.415197 0.873817 0.253091 -0.325445 0.904456 0.275762 -0.236335 0.937478 0.255502 -0.058012 0.994516 0.087024 0.619688 0.435453 -0.652968 0.564206 -0.639035 -0.522787 0.459423 -0.806458 -0.372231 0.444782 -0.847083 -0.290893 0.457488 -0.863543 -0.212128 0.481659 -0.867643 -0.123289 0.503557 -0.863691 -0.021628 0.498218 -0.861731 0.095913 0.347600 -0.891391 0.290854 -0.631446 -0.449185 0.632067 -0.819661 0.541474 0.186982 -0.690247 0.718774 0.083204 -0.599774 0.793430 0.103635 -0.512970 0.845832 0.146394 -0.430539 0.883783 0.183204 -0.353252 0.913989 0.199595 -0.268642 0.946607 0.178230 -0.078390 0.996736 0.019313 0.659210 0.416690 -0.625948 0.615578 -0.650759 -0.444495 0.498763 -0.814240 -0.297069 0.471762 -0.853081 -0.222919 0.469212 -0.869320 -0.155318 0.475065 -0.876080 -0.082444 0.476953 -0.878928 -0.000843 0.451892 -0.886900 0.095927 0.280073 -0.920025 0.274068 -0.667018 -0.426439 0.610931 -0.789784 0.580397 0.198443 -0.655506 0.750551 0.083575 -0.576517 0.812812 0.083458 -0.506858 0.855528 0.105668 -0.440984 0.888536 0.126634 -0.375772 0.917095 0.133165 -0.296655 0.948888 0.107735 -0.098157 0.994222 -0.043446 0.687196 0.407471 -0.601439 0.656867 -0.653574 -0.375988 0.530856 -0.814943 -0.232507 0.493817 -0.853477 -0.166499 0.479000 -0.870815 -0.110639 0.470471 -0.880808 -0.053233 0.456886 -0.889467 0.010179 0.416634 -0.904738 0.088691 0.229589 -0.940190 0.251659 -0.689630 -0.416019 0.592739 -0.765855 0.607014 0.212132 -0.628630 0.772554 0.089354 -0.558995 0.826008 0.072359 -0.502495 0.861167 0.076749 -0.449455 0.889460 0.082772 -0.394100 0.915678 0.078859 -0.320083 0.946165 0.048152 -0.116333 0.988459 -0.097036 0.706089 0.403609 -0.581841 0.689134 -0.650609 -0.319065 0.556679 -0.811079 -0.179610 0.512109 -0.850296 -0.121411 0.488160 -0.869421 -0.076205 0.469145 -0.882542 -0.031987 0.444476 -0.895634 0.016746 0.393489 -0.915753 0.081009 0.196140 -0.952722 0.232056 -0.705613 -0.411423 0.576925 -0.750032 0.622926 0.222296 -0.611284 0.785741 0.094573 -0.548551 0.833578 0.065106 -0.501436 0.863407 0.055583 -0.457666 0.887766 0.049129 -0.409725 0.911508 0.035770 -0.339888 0.940466 -0.000274 -0.132878 0.981032 -0.141134 0.717073 0.404764 -0.567427 0.714116 -0.644092 -0.274196 0.577608 -0.804565 -0.138000 0.527819 -0.844961 -0.086302 0.497535 -0.866021 -0.049674 0.471355 -0.881805 -0.015613 0.439252 -0.898088 0.022283 0.381221 -0.921328 0.076327 0.177486 -0.959527 0.218645 -0.714366 -0.412627 0.565173 -0.741878 0.630544 0.228105 -0.602468 0.792200 0.097223 -0.544468 0.836697 0.059106 -0.503693 0.862980 0.039486 -0.466279 0.884325 0.023497 -0.423598 0.905847 0.002501 -0.356961 0.933339 -0.038170 -0.148269 0.973158 -0.176008 0.722176 0.407788 -0.558723 0.732231 -0.636710 -0.241741 0.593732 -0.797452 -0.107480 0.540893 -0.838938 -0.060153 0.506888 -0.861519 -0.029151 0.476567 -0.879137 -0.001504 0.440262 -0.897374 0.029809 0.378339 -0.922391 0.077809 0.171057 -0.961585 0.214696 -0.718355 -0.415662 0.557844 -0.740846 0.632036 0.227325 -0.601341 0.793386 0.094486 -0.546033 0.836187 0.051372 -0.508868 0.860461 0.025691 -0.475153 0.879895 0.003712 -0.435637 0.899846 -0.022310 -0.371049 0.926253 -0.066165 -0.161619 0.965961 -0.201988 0.722233 0.411978 -0.555566 0.743510 -0.630796 -0.222012 0.604720 -0.791598 -0.087671 0.550923 -0.833510 -0.041774 0.515707 -0.856671 -0.012701 0.484037 -0.874955 0.012749 0.446368 -0.893872 0.041815 0.383173 -0.919504 0.087701 0.174546 -0.959294 0.222012 -0.717710 -0.419766 0.555598 -0.745922 0.629008 0.218971 -0.606557 0.790521 0.084646 -0.552108 0.832824 0.039767 -0.516107 0.856440 0.012019 -0.483604 0.875204 -0.012012 -0.445151 0.894573 -0.039755 -0.381293 0.920573 -0.084624 -0.171769 0.960503 -0.218927 0.719453 0.413712 -0.557880 0.747317 -0.628929 -0.214394 0.609723 -0.788808 -0.077586 0.557049 -0.829949 -0.029678 0.523048 -0.852301 0.001539 0.492581 -0.869780 0.029103 0.455981 -0.887962 0.060040 0.393600 -0.912995 0.107330 0.185090 -0.952558 0.241611 -0.714540 -0.421085 0.558677 -0.755605 0.623077 0.202078 -0.616528 0.784540 0.066263 -0.561396 0.827245 0.022364 -0.524401 0.851463 -0.003727 -0.490764 0.870911 -0.025796 -0.451213 0.890925 -0.051578 -0.386531 0.917393 -0.094785 -0.177003 0.957511 -0.227688 0.714307 0.412755 -0.565153 0.742615 -0.633188 -0.218164 0.607618 -0.790596 -0.075889 0.558375 -0.829297 -0.022004 0.528108 -0.849032 0.015699 0.501238 -0.863888 0.049569 0.467766 -0.879655 0.086030 0.407822 -0.902633 0.137602 0.200594 -0.940653 0.273740 -0.708882 -0.418915 0.567447 -0.768456 0.615078 0.176509 -0.629639 0.775927 0.038620 -0.572575 0.819850 -0.002175 -0.532689 0.845989 -0.023339 -0.495609 0.867646 -0.039523 -0.452580 0.889747 -0.059341 -0.385152 0.917675 -0.097625 -0.175533 0.957572 -0.228571 0.708773 0.406160 -0.576780 0.726495 -0.646461 -0.233009 0.595906 -0.798881 -0.081760 0.553188 -0.832879 -0.017186 0.529709 -0.847581 0.031862 0.508997 -0.857375 0.076348 0.480577 -0.868460 0.121751 0.424409 -0.887385 0.180071 0.219275 -0.921857 0.319527 -0.702262 -0.410084 0.581945 -0.783480 0.605280 0.140698 -0.644813 0.764340 -0.000145 -0.584738 0.810421 -0.036052 -0.540084 0.840172 -0.049195 -0.496934 0.866021 -0.055358 -0.447342 0.892031 -0.064541 -0.374368 0.922536 -0.093678 -0.164003 0.961339 -0.221202 0.705218 0.389379 -0.592496 0.697727 -0.669931 -0.253712 0.573792 -0.813999 -0.090382 0.540984 -0.840959 -0.011135 0.527205 -0.848081 0.053044 0.514690 -0.850147 0.111104 0.492551 -0.854023 0.167450 0.440839 -0.866612 0.233764 0.238149 -0.894944 0.377307 -0.696439 -0.391281 0.601558 -0.798427 0.594440 0.095681 -0.659863 0.749758 -0.049437 -0.596277 0.798801 -0.079820 -0.545594 0.833907 -0.083219 -0.494134 0.866014 -0.076497 -0.434890 0.897658 -0.071279 -0.353256 0.931430 -0.087460 -0.141112 0.967519 -0.209748 0.703532 0.363084 -0.610911 0.655048 -0.703695 -0.275185 0.540660 -0.835642 -0.096897 0.521678 -0.853142 0.000375 0.520579 -0.849816 0.082527 0.517977 -0.841072 0.155876 0.502859 -0.834885 0.223830 0.455849 -0.838615 0.298207 0.255857 -0.857839 0.445702 -0.690924 -0.361771 0.625895 -0.812166 0.581901 0.042167 -0.673588 0.731031 -0.108957 -0.606358 0.783793 -0.134160 -0.548776 0.826226 -0.127262 -0.486885 0.867036 -0.105786 -0.414593 0.906217 -0.082964 -0.320711 0.943580 -0.082474 -0.105960 0.974671 -0.196946 0.705355 0.320019 -0.632505 0.598584 -0.746993 -0.289308 0.497226 -0.862438 -0.094696 0.495954 -0.868059 0.022450 0.510133 -0.851141 0.123788 0.518578 -0.828221 0.212429 0.510648 -0.809010 0.291104 0.468129 -0.801346 0.372424 0.270658 -0.808206 0.523018 -0.687611 -0.318054 0.652712 -0.823636 0.566783 -0.019516 -0.685023 0.706330 -0.178439 -0.614440 0.763231 -0.199853 -0.549646 0.814978 -0.183576 -0.475648 0.867267 -0.146995 -0.387053 0.916106 -0.104597 -0.277376 0.957032 -0.084574 -0.059043 0.980284 -0.188564 0.708995 0.259755 -0.655632 0.534171 -0.795903 -0.284957 0.448575 -0.890654 -0.074276 0.467280 -0.881933 0.061999 0.497761 -0.848259 0.180808 0.517106 -0.808144 0.281964 0.515662 -0.773608 0.368271 0.476911 -0.752673 0.453915 0.281577 -0.744151 0.605767 -0.685822 -0.259628 0.679884 -0.832179 0.547614 -0.087157 -0.693524 0.673525 -0.255711 -0.620296 0.734211 -0.275985 -0.548795 0.796653 -0.253316 -0.462113 0.863088 -0.203792 -0.355151 0.923925 -0.142235 -0.227494 0.968447 -0.101771 -0.005598 0.981170 -0.193063 0.711150 0.175181 -0.680865 0.474642 -0.844300 -0.248742 0.405039 -0.913972 -0.024469 0.442242 -0.887945 0.126395 0.486877 -0.834886 0.256742 0.514902 -0.776025 0.364225 0.518141 -0.725533 0.452915 0.481890 -0.690759 0.539106 0.287816 -0.664473 0.689665 -0.686339 -0.185947 0.703109 -0.837657 0.522823 -0.158070 -0.699092 0.630311 -0.337606 -0.624348 0.693064 -0.360350 -0.547812 0.765946 -0.336493 -0.450043 0.848065 -0.279728 -0.325640 0.923319 -0.203567 -0.180820 0.972710 -0.145393 0.044148 0.973698 -0.223524 0.707902 0.067796 -0.703049 0.443020 -0.880829 -0.166950 0.384588 -0.920670 0.066770 0.432276 -0.873922 0.222257 0.483643 -0.801117 0.352563 0.515015 -0.725531 0.456470 0.519668 -0.661633 0.540543 0.483997 -0.614670 0.622839 0.289910 -0.569702 0.769020 -0.687746 -0.100389 0.718976 -0.840916 0.490956 -0.227646 -0.702723 0.575182 -0.418744 -0.627969 0.636430 -0.447897 -0.549582 0.716346 -0.429893 -0.445924 0.812287 -0.375955 -0.310644 0.903132 -0.296399 -0.154681 0.960871 -0.229783 0.072466 0.951786 -0.298081</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="2160" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="6897">0 0 0 0 0.055556 0 0 0.111111 0 0 0.166667 0 0 0.222222 0 0 0.277778 0 0 0.333333 0 0 0.388889 0 0 0.444444 0 0 0.500000 0 0 0.555556 0 0 0.611111 0 0 0.666667 0 0 0.722222 0 0 0.777778 0 0 0.833333 0 0 0.888889 0 0 0.944444 0 0 1.000000 0 0.008333 0 0 0.008333 0.055556 0 0.008333 0.111111 0 0.008333 0.166667 0 0.008333 0.222222 0 0.008333 0.277778 0 0.008333 0.333333 0 0.008333 0.388889 0 0.008333 0.444444 0 0.008333 0.500000 0 0.008333 0.555556 0 0.008333 0.611111 0 0.008333 0.666667 0 0.008333 0.722222 0 0.008333 0.777778 0 0.008333 0.833333 0 0.008333 0.888889 0 0.008333 0.944444 0 0.008333 1.000000 0 0.016667 0 0 0.016667 0.055556 0 0.016667 0.111111 0 0.016667 0.166667 0 0.016667 0.222222 0 0.016667 0.277778 0 0.016667 0.333333 0 0.016667 0.388889 0 0.016667 0.444444 0 0.016667 0.500000 0 0.016667 0.555556 0 0.016667 0.611111 0 0.016667 0.666667 0 0.016667 0.722222 0 0.016667 0.777778 0 0.016667 0.833333 0 0.016667 0.888889 0 0.016667 0.944444 0 0.016667 1.000000 0 0.025000 0 0 0.025000 0.055556 0 0.025000 0.111111 0 0.025000 0.166667 0 0.025000 0.222222 0 0.025000 0.277778 0 0.025000 0.333333 0 0.025000 0.388889 0 0.025000 0.444444 0 0.025000 0.500000 0 0.025000 0.555556 0 0.025000 0.611111 0 0.025000 0.666667 0 0.025000 0.722222 0 0.025000 0.777778 0 0.025000 0.833333 0 0.025000 0.888889 0 0.025000 0.944444 0 0.025000 1.000000 0 0.033333 0 0 0.033333 0.055556 0 0.033333 0.111111 0 0.033333 0.166667 0 0.033333 0.222222 0 0.033333 0.277778 0 0.033333 0.333333 0 0.033333 0.388889 0 0.033333 0.444444 0 0.033333 0.500000 0 0.033333 0.555556 0 0.033333 0.611111 0 0.033333 0.666667 0 0.033333 0.722222 0 0.033333 0.777778 0 0.033333 0.833333 0 0.033333 0.888889 0 0.033333 0.944444 0 0.033333 1.000000 0 0.041667 0 0 0.041667 0.055556 0 0.041667 0.111111 0 0.041667 0.166667 0 0.041667 0.222222 0 0.041667 0.277778 0 0.041667 0.333333 0 0.041667 0.388889 0 0.041667 0.444444 0 0.041667 0.500000 0 0.041667 0.555556 0 0.041667 0.611111 0 0.041667 0.666667 0 0.041667 0.722222 0 0.041667 0.777778 0 0.041667 0.833333 0 0.041667 0.888889 0 0.041667 0.944444 0 0.041667 1.000000 0 0.050000 0 0 0.050000 0.055556 0 0.050000 0.111111 0 0.050000 0.166667 0 0.050000 0.222222 0 0.050000 0.277778 0 0.050000 0.333333 0 0.050000 0.388889 0 0.050000 0.444444 0 0.050000 0.500000 0 0.050000 0.555556 0 0.050000 0.611111 0 0.050000 0.666667 0 0.050000 0.722222 0 0.050000 0.777778 0 0.050000 0.833333 0 0.050000 0.888889 0 0.050000 0.944444 0 0.050000 1.000000 0 0.058333 0 0 0.058333 0.055556 0 0.058333 0.111111 0 0.058333 0.166667 0 0.058333 0.222222 0 0.058333 0.277778 0 0.058333 0.333333 0 0.058333 0.388889 0 0.058333 0.444444 0 0.058333 0.500000 0 0.058333 0.555556 0 0.058333 0.611111 0 0.058333 0.666667 0 0.058333 0.722222 0 0.058333 0.777778 0 0.058333 0.833333 0 0.058333 0.888889 0 0.058333 0.944444 0 0.058333 1.000000 0 0.066667 0 0 0.066667 0.055556 0 0.066667 0.111111 0 0.066667 0.166667 0 0.066667 0.222222 0 0.066667 0.277778 0 0.066667 0.333333 0 0.066667 0.388889 0 0.066667 0.444444 0 0.066667 0.500000 0 0.066667 0.555556 0 0.066667 0.611111 0 0.066667 0.666667 0 0.066667 0.722222 0 0.066667 0.777778 0 0.066667 0.833333 0 0.066667 0.888889 0 0.066667 0.944444 0 0.066667 1.000000 0 0.075000 0 0 0.075000 0.055556 0 0.075000 0.111111 0 0.075000 0.166667 0 0.075000 0.222222 0 0.075000 0.277778 0 0.075000 0.333333 0 0.075000 0.388889 0 0.075000 0.444444 0 0.075000 0.500000 0 0.075000 0.555556 0 0.075000 0.611111 0 0.075000 0.666667 0 0.075000 0.722222 0 0.075000 0.777778 0 0.075000 0.833333 0 0.075000 0.888889 0 0.075000 0.944444 0 0.075000 1.000000 0 0.083333 0 0 0.083333 0.055556 0 0.083333 0.111111 0 0.083333 0.166667 0 0.083333 0.222222 0 0.083333 0.277778 0 0.083333 0.333333 0 0.083333 0.388889 0 0.083333 0.444444 0 0.083333 0.500000 0 0.083333 0.555556 0 0.083333 0.611111 0 0.083333 0.666667 0 0.083333 0.722222 0 0.083333 0.777778 0 0.083333 0.833333 0 0.083333 0.888889 0 0.083333 0.944444 0 0.083333 1.000000 0 0.091667 0 0 0.091667 0.055556 0 0.091667 0.111111 0 0.091667 0.166667 0 0.091667 0.222222 0 0.091667 0.277778 0 0.091667 0.333333 0 0.091667 0.388889 0 0.091667 0.444444 0 0.091667 0.500000 0 0.091667 0.555556 0 0.091667 0.611111 0 0.091667 0.666667 0 0.091667 0.722222 0 0.091667 0.777778 0 0.091667 0.833333 0 0.091667 0.888889 0 0.091667 0.944444 0 0.091667 1.000000 0 0.100000 0 0 0.100000 0.055556 0 0.100000 0.111111 0 0.100000 0.166667 0 0.100000 0.222222 0 0.100000 0.277778 0 0.100000 0.333333 0 0.100000 0.388889 0 0.100000 0.444444 0 0.100000 0.500000 0 0.100000 0.555556 0 0.100000 0.611111 0 0.100000 0.666667 0 0.100000 0.722222 0 0.100000 0.777778 0 0.100000 0.833333 0 0.100000 0.888889 0 0.100000 0.944444 0 0.100000 1.000000 0 0.108333 0 0 0.108333 0.055556 0 0.108333 0.111111 0 0.108333 0.166667 0 0.108333 0.222222 0 0.108333 0.277778 0 0.108333 0.333333 0 0.108333 0.388889 0 0.108333 0.444444 0 0.108333 0.500000 0 0.108333 0.555556 0 0.108333 0.611111 0 0.108333 0.666667 0 0.108333 0.722222 0 0.108333 0.777778 0 0.108333 0.833333 0 0.108333 0.888889 0 0.108333 0.944444 0 0.108333 1.000000 0 0.116667 0 0 0.116667 0.055556 0 0.116667 0.111111 0 0.116667 0.166667 0 0.116667 0.222222 0 0.116667 0.277778 0 0.116667 0.333333 0 0.116667 0.388889 0 0.116667 0.444444 0 0.116667 0.500000 0 0.116667 0.555556 0 0.116667 0.611111 0 0.116667 0.666667 0 0.116667 0.722222 0 0.116667 0.777778 0 0.116667 0.833333 0 0.116667 0.888889 0 0.116667 0.944444 0 0.116667 1.000000 0 0.125000 0 0 0.125000 0.055556 0 0.125000 0.111111 0 0.125000 0.166667 0 0.125000 0.222222 0 0.125000 0.277778 0 0.125000 0.333333 0 0.125000 0.388889 0 0.125000 0.444444 0 0.125000 0.500000 0 0.125000 0.555556 0 0.125000 0.611111 0 0.125000 0.666667 0 0.125000 0.722222 0 0.125000 0.777778 0 0.125000 0.833333 0 0.125000 0.888889 0 0.125000 0.944444 0 0.125000 1.000000 0 0.133333 0 0 0.133333 0.055556 0 0.133333 0.111111 0 0.133333 0.166667 0 0.133333 0.222222 0 0.133333 0.277778 0 0.133333 0.333333 0 0.133333 0.388889 0 0.133333 0.444444 0 0.133333 0.500000 0 0.133333 0.555556 0 0.133333 0.611111 0 0.133333 0.666667 0 0.133333 0.722222 0 0.133333 0.777778 0 0.133333 0.833333 0 0.133333 0.888889 0 0.133333 0.944444 0 0.133333 1.000000 0 0.141667 0 0 0.141667 0.055556 0 0.141667 0.111111 0 0.141667 0.166667 0 0.141667 0.222222 0 0.141667 0.277778 0 0.141667 0.333333 0 0.141667 0.388889 0 0.141667 0.444444 0 0.141667 0.500000 0 0.141667 0.555556 0 0.141667 0.611111 0 0.141667 0.666667 0 0.141667 0.722222 0 0.141667 0.777778 0 0.141667 0.833333 0 0.141667 0.888889 0 0.141667 0.944444 0 0.141667 1.000000 0 0.150000 0 0 0.150000 0.055556 0 0.150000 0.111111 0 0.150000 0.166667 0 0.150000 0.222222 0 0.150000 0.277778 0 0.150000 0.333333 0 0.150000 0.388889 0 0.150000 0.444444 0 0.150000 0.500000 0 0.150000 0.555556 0 0.150000 0.611111 0 0.150000 0.666667 0 0.150000 0.722222 0 0.150000 0.777778 0 0.150000 0.833333 0 0.150000 0.888889 0 0.150000 0.944444 0 0.150000 1.000000 0 0.158333 0 0 0.158333 0.055556 0 0.158333 0.111111 0 0.158333 0.166667 0 0.158333 0.222222 0 0.158333 0.277778 0 0.158333 0.333333 0 0.158333 0.388889 0 0.158333 0.444444 0 0.158333 0.500000 0 0.158333 0.555556 0 0.158333 0.611111 0 0.158333 0.666667 0 0.158333 0.722222 0 0.158333 0.777778 0 0.158333 0.833333 0 0.158333 0.888889 0 0.158333 0.944444 0 0.158333 1.000000 0 0.166667 0 0 0.166667 0.055556 0 0.166667 0.111111 0 0.166667 0.166667 0 0.166667 0.222222 0 0.166667 0.277778 0 0.166667 0.333333 0 0.166667 0.388889 0 0.166667 0.444444 0 0.166667 0.500000 0 0.166667 0.555556 0 0.166667 0.611111 0 0.166667 0.666667 0 0.166667 0.722222 0 0.166667 0.777778 0 0.166667 0.833333 0 0.166667 0.888889 0 0.166667 0.944444 0 0.166667 1.000000 0 0.175000 0 0 0.175000 0.055556 0 0.175000 0.111111 0 0.175000 0.166667 0 0.175000 0.222222 0 0.175000 0.277778 0 0.175000 0.333333 0 0.175000 0.388889 0 0.175000 0.444444 0 0.175000 0.500000 0 0.175000 0.555556 0 0.175000 0.611111 0 0.175000 0.666667 0 0.175000 0.722222 0 0.175000 0.777778 0 0.175000 0.833333 0 0.175000 0.888889 0 0.175000 0.944444 0 0.175000 1.000000 0 0.183333 0 0 0.183333 0.055556 0 0.183333 0.111111 0 0.183333 0.166667 0 0.183333 0.222222 0 0.183333 0.277778 0 0.183333 0.333333 0 0.183333 0.388889 0 0.183333 0.444444 0 0.183333 0.500000 0 0.183333 0.555556 0 0.183333 0.611111 0 0.183333 0.666667 0 0.183333 0.722222 0 0.183333 0.777778 0 0.183333 0.833333 0 0.183333 0.888889 0 0.183333 0.944444 0 0.183333 1.000000 0 0.191667 0 0 0.191667 0.055556 0 0.191667 0.111111 0 0.191667 0.166667 0 0.191667 0.222222 0 0.191667 0.277778 0 0.191667 0.333333 0 0.191667 0.388889 0 0.191667 0.444444 0 0.191667 0.500000 0 0.191667 0.555556 0 0.191667 0.611111 0 0.191667 0.666667 0 0.191667 0.722222 0 0.191667 0.777778 0 0.191667 0.833333 0 0.191667 0.888889 0 0.191667 0.944444 0 0.191667 1.000000 0 0.200000 0 0 0.200000 0.055556 0 0.200000 0.111111 0 0.200000 0.166667 0 0.200000 0.222222 0 0.200000 0.277778 0 0.200000 0.333333 0 0.200000 0.388889 0 0.200000 0.444444 0 0.200000 0.500000 0 0.200000 0.555556 0 0.200000 0.611111 0 0.200000 0.666667 0 0.200000 0.722222 0 0.200000 0.777778 0 0.200000 0.833333 0 0.200000 0.888889 0 0.200000 0.944444 0 0.200000 1.000000 0 0.208333 0 0 0.208333 0.055556 0 0.208333 0.111111 0 0.208333 0.166667 0 0.208333 0.222222 0 0.208333 0.277778 0 0.208333 0.333333 0 0.208333 0.388889 0 0.208333 0.444444 0 0.208333 0.500000 0 0.208333 0.555556 0 0.208333 0.611111 0 0.208333 0.666667 0 0.208333 0.722222 0 0.208333 0.777778 0 0.208333 0.833333 0 0.208333 0.888889 0 0.208333 0.944444 0 0.208333 1.000000 0 0.216667 0 0 0.216667 0.055556 0 0.216667 0.111111 0 0.216667 0.166667 0 0.216667 0.222222 0 0.216667 0.277778 0 0.216667 0.333333 0 0.216667 0.388889 0 0.216667 0.444444 0 0.216667 0.500000 0 0.216667 0.555556 0 0.216667 0.611111 0 0.216667 0.666667 0 0.216667 0.722222 0 0.216667 0.777778 0 0.216667 0.833333 0 0.216667 0.888889 0 0.216667 0.944444 0 0.216667 1.000000 0 0.225000 0 0 0.225000 0.055556 0 0.225000 0.111111 0 0.225000 0.166667 0 0.225000 0.222222 0 0.225000 0.277778 0 0.225000 0.333333 0 0.225000 0.388889 0 0.225000 0.444444 0 0.225000 0.500000 0 0.225000 0.555556 0 0.225000 0.611111 0 0.225000 0.666667 0 0.225000 0.722222 0 0.225000 0.777778 0 0.225000 0.833333 0 0.225000 0.888889 0 0.225000 0.944444 0 0.225000 1.000000 0 0.233333 0 0 0.233333 0.055556 0 0.233333 0.111111 0 0.233333 0.166667 0 0.233333 0.222222 0 0.233333 0.277778 0 0.233333 0.333333 0 0.233333 0.388889 0 0.233333 0.444444 0 0.233333 0.500000 0 0.233333 0.555556 0 0.233333 0.611111 0 0.233333 0.666667 0 0.233333 0.722222 0 0.233333 0.777778 0 0.233333 0.833333 0 0.233333 0.888889 0 0.233333 0.944444 0 0.233333 1.000000 0 0.241667 0 0 0.241667 0.055556 0 0.241667 0.111111 0 0.241667 0.166667 0 0.241667 0.222222 0 0.241667 0.277778 0 0.241667 0.333333 0 0.241667 0.388889 0 0.241667 0.444444 0 0.241667 0.500000 0 0.241667 0.555556 0 0.241667 0.611111 0 0.241667 0.666667 0 0.241667 0.722222 0 0.241667 0.777778 0 0.241667 0.833333 0 0.241667 0.888889 0 0.241667 0.944444 0 0.241667 1.000000 0 0.250000 0 0 0.250000 0.055556 0 0.250000 0.111111 0 0.250000 0.166667 0 0.250000 0.222222 0 0.250000 0.277778 0 0.250000 0.333333 0 0.250000 0.388889 0 0.250000 0.444444 0 0.250000 0.500000 0 0.250000 0.555556 0 0.250000 0.611111 0 0.250000 0.666667 0 0.250000 0.722222 0 0.250000 0.777778 0 0.250000 0.833333 0 0.250000 0.888889 0 0.250000 0.944444 0 0.250000 1.000000 0 0.258333 0 0 0.258333 0.055556 0 0.258333 0.111111 0 0.258333 0.166667 0 0.258333 0.222222 0 0.258333 0.277778 0 0.258333 0.333333 0 0.258333 0.388889 0 0.258333 0.444444 0 0.258333 0.500000 0 0.258333 0.555556 0 0.258333 0.611111 0 0.258333 0.666667 0 0.258333 0.722222 0 0.258333 0.777778 0 0.258333 0.833333 0 0.258333 0.888889 0 0.258333 0.944444 0 0.258333 1.000000 0 0.266667 0 0 0.266667 0.055556 0 0.266667 0.111111 0 0.266667 0.166667 0 0.266667 0.222222 0 0.266667 0.277778 0 0.266667 0.333333 0 0.266667 0.388889 0 0.266667 0.444444 0 0.266667 0.500000 0 0.266667 0.555556 0 0.266667 0.611111 0 0.266667 0.666667 0 0.266667 0.722222 0 0.266667 0.777778 0 0.266667 0.833333 0 0.266667 0.888889 0 0.266667 0.944444 0 0.266667 1.000000 0 0.275000 0 0 0.275000 0.055556 0 0.275000 0.111111 0 0.275000 0.166667 0 0.275000 0.222222 0 0.275000 0.277778 0 0.275000 0.333333 0 0.275000 0.388889 0 0.275000 0.444444 0 0.275000 0.500000 0 0.275000 0.555556 0 0.275000 0.611111 0 0.275000 0.666667 0 0.275000 0.722222 0 0.275000 0.777778 0 0.275000 0.833333 0 0.275000 0.888889 0 0.275000 0.944444 0 0.275000 1.000000 0 0.283333 0 0 0.283333 0.055556 0 0.283333 0.111111 0 0.283333 0.166667 0 0.283333 0.222222 0 0.283333 0.277778 0 0.283333 0.333333 0 0.283333 0.388889 0 0.283333 0.444444 0 0.283333 0.500000 0 0.283333 0.555556 0 0.283333 0.611111 0 0.283333 0.666667 0 0.283333 0.722222 0 0.283333 0.777778 0 0.283333 0.833333 0 0.283333 0.888889 0 0.283333 0.944444 0 0.283333 1.000000 0 0.291667 0 0 0.291667 0.055556 0 0.291667 0.111111 0 0.291667 0.166667 0 0.291667 0.222222 0 0.291667 0.277778 0 0.291667 0.333333 0 0.291667 0.388889 0 0.291667 0.444444 0 0.291667 0.500000 0 0.291667 0.555556 0 0.291667 0.611111 0 0.291667 0.666667 0 0.291667 0.722222 0 0.291667 0.777778 0 0.291667 0.833333 0 0.291667 0.888889 0 0.291667 0.944444 0 0.291667 1.000000 0 0.300000 0 0 0.300000 0.055556 0 0.300000 0.111111 0 0.300000 0.166667 0 0.300000 0.222222 0 0.300000 0.277778 0 0.300000 0.333333 0 0.300000 0.388889 0 0.300000 0.444444 0 0.300000 0.500000 0 0.300000 0.555556 0 0.300000 0.611111 0 0.300000 0.666667 0 0.300000 0.722222 0 0.300000 0.777778 0 0.300000 0.833333 0 0.300000 0.888889 0 0.300000 0.944444 0 0.300000 1.000000 0 0.308333 0 0 0.308333 0.055556 0 0.308333 0.111111 0 0.308333 0.166667 0 0.308333 0.222222 0 0.308333 0.277778 0 0.308333 0.333333 0 0.308333 0.388889 0 0.308333 0.444444 0 0.308333 0.500000 0 0.308333 0.555556 0 0.308333 0.611111 0 0.308333 0.666667 0 0.308333 0.722222 0 0.308333 0.777778 0 0.308333 0.833333 0 0.308333 0.888889 0 0.308333 0.944444 0 0.308333 1.000000 0 0.316666 0 0 0.316666 0.055556 0 0.316666 0.111111 0 0.316666 0.166667 0 0.316666 0.222222 0 0.316666 0.277778 0 0.316666 0.333333 0 0.316666 0.388889 0 0.316666 0.444444 0 0.316666 0.500000 0 0.316666 0.555556 0 0.316666 0.611111 0 0.316666 0.666667 0 0.316666 0.722222 0 0.316666 0.777778 0 0.316666 0.833333 0 0.316666 0.888889 0 0.316666 0.944444 0 0.316666 1.000000 0 0.325000 0 0 0.325000 0.055556 0 0.325000 0.111111 0 0.325000 0.166667 0 0.325000 0.222222 0 0.325000 0.277778 0 0.325000 0.333333 0 0.325000 0.388889 0 0.325000 0.444444 0 0.325000 0.500000 0 0.325000 0.555556 0 0.325000 0.611111 0 0.325000 0.666667 0 0.325000 0.722222 0 0.325000 0.777778 0 0.325000 0.833333 0 0.325000 0.888889 0 0.325000 0.944444 0 0.325000 1.000000 0 0.333333 0 0 0.333333 0.055556 0 0.333333 0.111111 0 0.333333 0.166667 0 0.333333 0.222222 0 0.333333 0.277778 0 0.333333 0.333333 0 0.333333 0.388889 0 0.333333 0.444444 0 0.333333 0.500000 0 0.333333 0.555556 0 0.333333 0.611111 0 0.333333 0.666667 0 0.333333 0.722222 0 0.333333 0.777778 0 0.333333 0.833333 0 0.333333 0.888889 0 0.333333 0.944444 0 0.333333 1.000000 0 0.341666 0 0 0.341666 0.055556 0 0.341666 0.111111 0 0.341666 0.166667 0 0.341666 0.222222 0 0.341666 0.277778 0 0.341666 0.333333 0 0.341666 0.388889 0 0.341666 0.444444 0 0.341666 0.500000 0 0.341666 0.555556 0 0.341666 0.611111 0 0.341666 0.666667 0 0.341666 0.722222 0 0.341666 0.777778 0 0.341666 0.833333 0 0.341666 0.888889 0 0.341666 0.944444 0 0.341666 1.000000 0 0.350000 0 0 0.350000 0.055556 0 0.350000 0.111111 0 0.350000 0.166667 0 0.350000 0.222222 0 0.350000 0.277778 0 0.350000 0.333333 0 0.350000 0.388889 0 0.350000 0.444444 0 0.350000 0.500000 0 0.350000 0.555556 0 0.350000 0.611111 0 0.350000 0.666667 0 0.350000 0.722222 0 0.350000 0.777778 0 0.350000 0.833333 0 0.350000 0.888889 0 0.350000 0.944444 0 0.350000 1.000000 0 0.358333 0 0 0.358333 0.055556 0 0.358333 0.111111 0 0.358333 0.166667 0 0.358333 0.222222 0 0.358333 0.277778 0 0.358333 0.333333 0 0.358333 0.388889 0 0.358333 0.444444 0 0.358333 0.500000 0 0.358333 0.555556 0 0.358333 0.611111 0 0.358333 0.666667 0 0.358333 0.722222 0 0.358333 0.777778 0 0.358333 0.833333 0 0.358333 0.888889 0 0.358333 0.944444 0 0.358333 1.000000 0 0.366666 0 0 0.366666 0.055556 0 0.366666 0.111111 0 0.366666 0.166667 0 0.366666 0.222222 0 0.366666 0.277778 0 0.366666 0.333333 0 0.366666 0.388889 0 0.366666 0.444444 0 0.366666 0.500000 0 0.366666 0.555556 0 0.366666 0.611111 0 0.366666 0.666667 0 0.366666 0.722222 0 0.366666 0.777778 0 0.366666 0.833333 0 0.366666 0.888889 0 0.366666 0.944444 0 0.366666 1.000000 0 0.375000 0 0 0.375000 0.055556 0 0.375000 0.111111 0 0.375000 0.166667 0 0.375000 0.222222 0 0.375000 0.277778 0 0.375000 0.333333 0 0.375000 0.388889 0 0.375000 0.444444 0 0.375000 0.500000 0 0.375000 0.555556 0 0.375000 0.611111 0 0.375000 0.666667 0 0.375000 0.722222 0 0.375000 0.777778 0 0.375000 0.833333 0 0.375000 0.888889 0 0.375000 0.944444 0 0.375000 1.000000 0 0.383333 0 0 0.383333 0.055556 0 0.383333 0.111111 0 0.383333 0.166667 0 0.383333 0.222222 0 0.383333 0.277778 0 0.383333 0.333333 0 0.383333 0.388889 0 0.383333 0.444444 0 0.383333 0.500000 0 0.383333 0.555556 0 0.383333 0.611111 0 0.383333 0.666667 0 0.383333 0.722222 0 0.383333 0.777778 0 0.383333 0.833333 0 0.383333 0.888889 0 0.383333 0.944444 0 0.383333 1.000000 0 0.391666 0 0 0.391666 0.055556 0 0.391666 0.111111 0 0.391666 0.166667 0 0.391666 0.222222 0 0.391666 0.277778 0 0.391666 0.333333 0 0.391666 0.388889 0 0.391666 0.444444 0 0.391666 0.500000 0 0.391666 0.555556 0 0.391666 0.611111 0 0.391666 0.666667 0 0.391666 0.722222 0 0.391666 0.777778 0 0.391666 0.833333 0 0.391666 0.888889 0 0.391666 0.944444 0 0.391666 1.000000 0 0.400000 0 0 0.400000 0.055556 0 0.400000 0.111111 0 0.400000 0.166667 0 0.400000 0.222222 0 0.400000 0.277778 0 0.400000 0.333333 0 0.400000 0.388889 0 0.400000 0.444444 0 0.400000 0.500000 0 0.400000 0.555556 0 0.400000 0.611111 0 0.400000 0.666667 0 0.400000 0.722222 0 0.400000 0.777778 0 0.400000 0.833333 0 0.400000 0.888889 0 0.400000 0.944444 0 0.400000 1.000000 0 0.408333 0 0 0.408333 0.055556 0 0.408333 0.111111 0 0.408333 0.166667 0 0.408333 0.222222 0 0.408333 0.277778 0 0.408333 0.333333 0 0.408333 0.388889 0 0.408333 0.444444 0 0.408333 0.500000 0 0.408333 0.555556 0 0.408333 0.611111 0 0.408333 0.666667 0 0.408333 0.722222 0 0.408333 0.777778 0 0.408333 0.833333 0 0.408333 0.888889 0 0.408333 0.944444 0 0.408333 1.000000 0 0.416666 0 0 0.416666 0.055556 0 0.416666 0.111111 0 0.416666 0.166667 0 0.416666 0.222222 0 0.416666 0.277778 0 0.416666 0.333333 0 0.416666 0.388889 0 0.416666 0.444444 0 0.416666 0.500000 0 0.416666 0.555556 0 0.416666 0.611111 0 0.416666 0.666667 0 0.416666 0.722222 0 0.416666 0.777778 0 0.416666 0.833333 0 0.416666 0.888889 0 0.416666 0.944444 0 0.416666 1.000000 0 0.425000 0 0 0.425000 0.055556 0 0.425000 0.111111 0 0.425000 0.166667 0 0.425000 0.222222 0 0.425000 0.277778 0 0.425000 0.333333 0 0.425000 0.388889 0 0.425000 0.444444 0 0.425000 0.500000 0 0.425000 0.555556 0 0.425000 0.611111 0 0.425000 0.666667 0 0.425000 0.722222 0 0.425000 0.777778 0 0.425000 0.833333 0 0.425000 0.888889 0 0.425000 0.944444 0 0.425000 1.000000 0 0.433333 0 0 0.433333 0.055556 0 0.433333 0.111111 0 0.433333 0.166667 0 0.433333 0.222222 0 0.433333 0.277778 0 0.433333 0.333333 0 0.433333 0.388889 0 0.433333 0.444444 0 0.433333 0.500000 0 0.433333 0.555556 0 0.433333 0.611111 0 0.433333 0.666667 0 0.433333 0.722222 0 0.433333 0.777778 0 0.433333 0.833333 0 0.433333 0.888889 0 0.433333 0.944444 0 0.433333 1.000000 0 0.441666 0 0 0.441666 0.055556 0 0.441666 0.111111 0 0.441666 0.166667 0 0.441666 0.222222 0 0.441666 0.277778 0 0.441666 0.333333 0 0.441666 0.388889 0 0.441666 0.444444 0 0.441666 0.500000 0 0.441666 0.555556 0 0.441666 0.611111 0 0.441666 0.666667 0 0.441666 0.722222 0 0.441666 0.777778 0 0.441666 0.833333 0 0.441666 0.888889 0 0.441666 0.944444 0 0.441666 1.000000 0 0.450000 0 0 0.450000 0.055556 0 0.450000 0.111111 0 0.450000 0.166667 0 0.450000 0.222222 0 0.450000 0.277778 0 0.450000 0.333333 0 0.450000 0.388889 0 0.450000 0.444444 0 0.450000 0.500000 0 0.450000 0.555556 0 0.450000 0.611111 0 0.450000 0.666667 0 0.450000 0.722222 0 0.450000 0.777778 0 0.450000 0.833333 0 0.450000 0.888889 0 0.450000 0.944444 0 0.450000 1.000000 0 0.458333 0 0 0.458333 0.055556 0 0.458333 0.111111 0 0.458333 0.166667 0 0.458333 0.222222 0 0.458333 0.277778 0 0.458333 0.333333 0 0.458333 0.388889 0 0.458333 0.444444 0 0.458333 0.500000 0 0.458333 0.555556 0 0.458333 0.611111 0 0.458333 0.666667 0 0.458333 0.722222 0 0.458333 0.777778 0 0.458333 0.833333 0 0.458333 0.888889 0 0.458333 0.944444 0 0.458333 1.000000 0 0.466666 0 0 0.466666 0.055556 0 0.466666 0.111111 0 0.466666 0.166667 0 0.466666 0.222222 0 0.466666 0.277778 0 0.466666 0.333333 0 0.466666 0.388889 0 0.466666 0.444444 0 0.466666 0.500000 0 0.466666 0.555556 0 0.466666 0.611111 0 0.466666 0.666667 0 0.466666 0.722222 0 0.466666 0.777778 0 0.466666 0.833333 0 0.466666 0.888889 0 0.466666 0.944444 0 0.466666 1.000000 0 0.475000 0 0 0.475000 0.055556 0 0.475000 0.111111 0 0.475000 0.166667 0 0.475000 0.222222 0 0.475000 0.277778 0 0.475000 0.333333 0 0.475000 0.388889 0 0.475000 0.444444 0 0.475000 0.500000 0 0.475000 0.555556 0 0.475000 0.611111 0 0.475000 0.666667 0 0.475000 0.722222 0 0.475000 0.777778 0 0.475000 0.833333 0 0.475000 0.888889 0 0.475000 0.944444 0 0.475000 1.000000 0 0.483333 0 0 0.483333 0.055556 0 0.483333 0.111111 0 0.483333 0.166667 0 0.483333 0.222222 0 0.483333 0.277778 0 0.483333 0.333333 0 0.483333 0.388889 0 0.483333 0.444444 0 0.483333 0.500000 0 0.483333 0.555556 0 0.483333 0.611111 0 0.483333 0.666667 0 0.483333 0.722222 0 0.483333 0.777778 0 0.483333 0.833333 0 0.483333 0.888889 0 0.483333 0.944444 0 0.483333 1.000000 0 0.491666 0 0 0.491666 0.055556 0 0.491666 0.111111 0 0.491666 0.166667 0 0.491666 0.222222 0 0.491666 0.277778 0 0.491666 0.333333 0 0.491666 0.388889 0 0.491666 0.444444 0 0.491666 0.500000 0 0.491666 0.555556 0 0.491666 0.611111 0 0.491666 0.666667 0 0.491666 0.722222 0 0.491666 0.777778 0 0.491666 0.833333 0 0.491666 0.888889 0 0.491666 0.944444 0 0.491666 1.000000 0 0.500000 0 0 0.500000 0.055556 0 0.500000 0.111111 0 0.500000 0.166667 0 0.500000 0.222222 0 0.500000 0.277778 0 0.500000 0.333333 0 0.500000 0.388889 0 0.500000 0.444444 0 0.500000 0.500000 0 0.500000 0.555556 0 0.500000 0.611111 0 0.500000 0.666667 0 0.500000 0.722222 0 0.500000 0.777778 0 0.500000 0.833333 0 0.500000 0.888889 0 0.500000 0.944444 0 0.500000 1.000000 0 0.508333 0 0 0.508333 0.055556 0 0.508333 0.111111 0 0.508333 0.166667 0 0.508333 0.222222 0 0.508333 0.277778 0 0.508333 0.333333 0 0.508333 0.388889 0 0.508333 0.444444 0 0.508333 0.500000 0 0.508333 0.555556 0 0.508333 0.611111 0 0.508333 0.666667 0 0.508333 0.722222 0 0.508333 0.777778 0 0.508333 0.833333 0 0.508333 0.888889 0 0.508333 0.944444 0 0.508333 1.000000 0 0.516666 0 0 0.516666 0.055556 0 0.516666 0.111111 0 0.516666 0.166667 0 0.516666 0.222222 0 0.516666 0.277778 0 0.516666 0.333333 0 0.516666 0.388889 0 0.516666 0.444444 0 0.516666 0.500000 0 0.516666 0.555556 0 0.516666 0.611111 0 0.516666 0.666667 0 0.516666 0.722222 0 0.516666 0.777778 0 0.516666 0.833333 0 0.516666 0.888889 0 0.516666 0.944444 0 0.516666 1.000000 0 0.525000 0 0 0.525000 0.055556 0 0.525000 0.111111 0 0.525000 0.166667 0 0.525000 0.222222 0 0.525000 0.277778 0 0.525000 0.333333 0 0.525000 0.388889 0 0.525000 0.444444 0 0.525000 0.500000 0 0.525000 0.555556 0 0.525000 0.611111 0 0.525000 0.666667 0 0.525000 0.722222 0 0.525000 0.777778 0 0.525000 0.833333 0 0.525000 0.888889 0 0.525000 0.944444 0 0.525000 1.000000 0 0.533333 0 0 0.533333 0.055556 0 0.533333 0.111111 0 0.533333 0.166667 0 0.533333 0.222222 0 0.533333 0.277778 0 0.533333 0.333333 0 0.533333 0.388889 0 0.533333 0.444444 0 0.533333 0.500000 0 0.533333 0.555556 0 0.533333 0.611111 0 0.533333 0.666667 0 0.533333 0.722222 0 0.533333 0.777778 0 0.533333 0.833333 0 0.533333 0.888889 0 0.533333 0.944444 0 0.533333 1.000000 0 0.541666 0 0 0.541666 0.055556 0 0.541666 0.111111 0 0.541666 0.166667 0 0.541666 0.222222 0 0.541666 0.277778 0 0.541666 0.333333 0 0.541666 0.388889 0 0.541666 0.444444 0 0.541666 0.500000 0 0.541666 0.555556 0 0.541666 0.611111 0 0.541666 0.666667 0 0.541666 0.722222 0 0.541666 0.777778 0 0.541666 0.833333 0 0.541666 0.888889 0 0.541666 0.944444 0 0.541666 1.000000 0 0.550000 0 0 0.550000 0.055556 0 0.550000 0.111111 0 0.550000 0.166667 0 0.550000 0.222222 0 0.550000 0.277778 0 0.550000 0.333333 0 0.550000 0.388889 0 0.550000 0.444444 0 0.550000 0.500000 0 0.550000 0.555556 0 0.550000 0.611111 0 0.550000 0.666667 0 0.550000 0.722222 0 0.550000 0.777778 0 0.550000 0.833333 0 0.550000 0.888889 0 0.550000 0.944444 0 0.550000 1.000000 0 0.558333 0 0 0.558333 0.055556 0 0.558333 0.111111 0 0.558333 0.166667 0 0.558333 0.222222 0 0.558333 0.277778 0 0.558333 0.333333 0 0.558333 0.388889 0 0.558333 0.444444 0 0.558333 0.500000 0 0.558333 0.555556 0 0.558333 0.611111 0 0.558333 0.666667 0 0.558333 0.722222 0 0.558333 0.777778 0 0.558333 0.833333 0 0.558333 0.888889 0 0.558333 0.944444 0 0.558333 1.000000 0 0.566666 0 0 0.566666 0.055556 0 0.566666 0.111111 0 0.566666 0.166667 0 0.566666 0.222222 0 0.566666 0.277778 0 0.566666 0.333333 0 0.566666 0.388889 0 0.566666 0.444444 0 0.566666 0.500000 0 0.566666 0.555556 0 0.566666 0.611111 0 0.566666 0.666667 0 0.566666 0.722222 0 0.566666 0.777778 0 0.566666 0.833333 0 0.566666 0.888889 0 0.566666 0.944444 0 0.566666 1.000000 0 0.575000 0 0 0.575000 0.055556 0 0.575000 0.111111 0 0.575000 0.166667 0 0.575000 0.222222 0 0.575000 0.277778 0 0.575000 0.333333 0 0.575000 0.388889 0 0.575000 0.444444 0 0.575000 0.500000 0 0.575000 0.555556 0 0.575000 0.611111 0 0.575000 0.666667 0 0.575000 0.722222 0 0.575000 0.777778 0 0.575000 0.833333 0 0.575000 0.888889 0 0.575000 0.944444 0 0.575000 1.000000 0 0.583333 0 0 0.583333 0.055556 0 0.583333 0.111111 0 0.583333 0.166667 0 0.583333 0.222222 0 0.583333 0.277778 0 0.583333 0.333333 0 0.583333 0.388889 0 0.583333 0.444444 0 0.583333 0.500000 0 0.583333 0.555556 0 0.583333 0.611111 0 0.583333 0.666667 0 0.583333 0.722222 0 0.583333 0.777778 0 0.583333 0.833333 0 0.583333 0.888889 0 0.583333 0.944444 0 0.583333 1.000000 0 0.591666 0 0 0.591666 0.055556 0 0.591666 0.111111 0 0.591666 0.166667 0 0.591666 0.222222 0 0.591666 0.277778 0 0.591666 0.333333 0 0.591666 0.388889 0 0.591666 0.444444 0 0.591666 0.500000 0 0.591666 0.555556 0 0.591666 0.611111 0 0.591666 0.666667 0 0.591666 0.722222 0 0.591666 0.777778 0 0.591666 0.833333 0 0.591666 0.888889 0 0.591666 0.944444 0 0.591666 1.000000 0 0.599999 0 0 0.599999 0.055556 0 0.599999 0.111111 0 0.599999 0.166667 0 0.599999 0.222222 0 0.599999 0.277778 0 0.599999 0.333333 0 0.599999 0.388889 0 0.599999 0.444444 0 0.599999 0.500000 0 0.599999 0.555556 0 0.599999 0.611111 0 0.599999 0.666667 0 0.599999 0.722222 0 0.599999 0.777778 0 0.599999 0.833333 0 0.599999 0.888889 0 0.599999 0.944444 0 0.599999 1.000000 0 0.608333 0 0 0.608333 0.055556 0 0.608333 0.111111 0 0.608333 0.166667 0 0.608333 0.222222 0 0.608333 0.277778 0 0.608333 0.333333 0 0.608333 0.388889 0 0.608333 0.444444 0 0.608333 0.500000 0 0.608333 0.555556 0 0.608333 0.611111 0 0.608333 0.666667 0 0.608333 0.722222 0 0.608333 0.777778 0 0.608333 0.833333 0 0.608333 0.888889 0 0.608333 0.944444 0 0.608333 1.000000 0 0.616666 0 0 0.616666 0.055556 0 0.616666 0.111111 0 0.616666 0.166667 0 0.616666 0.222222 0 0.616666 0.277778 0 0.616666 0.333333 0 0.616666 0.388889 0 0.616666 0.444444 0 0.616666 0.500000 0 0.616666 0.555556 0 0.616666 0.611111 0 0.616666 0.666667 0 0.616666 0.722222 0 0.616666 0.777778 0 0.616666 0.833333 0 0.616666 0.888889 0 0.616666 0.944444 0 0.616666 1.000000 0 0.624999 0 0 0.624999 0.055556 0 0.624999 0.111111 0 0.624999 0.166667 0 0.624999 0.222222 0 0.624999 0.277778 0 0.624999 0.333333 0 0.624999 0.388889 0 0.624999 0.444444 0 0.624999 0.500000 0 0.624999 0.555556 0 0.624999 0.611111 0 0.624999 0.666667 0 0.624999 0.722222 0 0.624999 0.777778 0 0.624999 0.833333 0 0.624999 0.888889 0 0.624999 0.944444 0 0.624999 1.000000 0 0.633333 0 0 0.633333 0.055556 0 0.633333 0.111111 0 0.633333 0.166667 0 0.633333 0.222222 0 0.633333 0.277778 0 0.633333 0.333333 0 0.633333 0.388889 0 0.633333 0.444444 0 0.633333 0.500000 0 0.633333 0.555556 0 0.633333 0.611111 0 0.633333 0.666667 0 0.633333 0.722222 0 0.633333 0.777778 0 0.633333 0.833333 0 0.633333 0.888889 0 0.633333 0.944444 0 0.633333 1.000000 0 0.641666 0 0 0.641666 0.055556 0 0.641666 0.111111 0 0.641666 0.166667 0 0.641666 0.222222 0 0.641666 0.277778 0 0.641666 0.333333 0 0.641666 0.388889 0 0.641666 0.444444 0 0.641666 0.500000 0 0.641666 0.555556 0 0.641666 0.611111 0 0.641666 0.666667 0 0.641666 0.722222 0 0.641666 0.777778 0 0.641666 0.833333 0 0.641666 0.888889 0 0.641666 0.944444 0 0.641666 1.000000 0 0.649999 0 0 0.649999 0.055556 0 0.649999 0.111111 0 0.649999 0.166667 0 0.649999 0.222222 0 0.649999 0.277778 0 0.649999 0.333333 0 0.649999 0.388889 0 0.649999 0.444444 0 0.649999 0.500000 0 0.649999 0.555556 0 0.649999 0.611111 0 0.649999 0.666667 0 0.649999 0.722222 0 0.649999 0.777778 0 0.649999 0.833333 0 0.649999 0.888889 0 0.649999 0.944444 0 0.649999 1.000000 0 0.658333 0 0 0.658333 0.055556 0 0.658333 0.111111 0 0.658333 0.166667 0 0.658333 0.222222 0 0.658333 0.277778 0 0.658333 0.333333 0 0.658333 0.388889 0 0.658333 0.444444 0 0.658333 0.500000 0 0.658333 0.555556 0 0.658333 0.611111 0 0.658333 0.666667 0 0.658333 0.722222 0 0.658333 0.777778 0 0.658333 0.833333 0 0.658333 0.888889 0 0.658333 0.944444 0 0.658333 1.000000 0 0.666666 0 0 0.666666 0.055556 0 0.666666 0.111111 0 0.666666 0.166667 0 0.666666 0.222222 0 0.666666 0.277778 0 0.666666 0.333333 0 0.666666 0.388889 0 0.666666 0.444444 0 0.666666 0.500000 0 0.666666 0.555556 0 0.666666 0.611111 0 0.666666 0.666667 0 0.666666 0.722222 0 0.666666 0.777778 0 0.666666 0.833333 0 0.666666 0.888889 0 0.666666 0.944444 0 0.666666 1.000000 0 0.675000 0 0 0.675000 0.055556 0 0.675000 0.111111 0 0.675000 0.166667 0 0.675000 0.222222 0 0.675000 0.277778 0 0.675000 0.333333 0 0.675000 0.388889 0 0.675000 0.444444 0 0.675000 0.500000 0 0.675000 0.555556 0 0.675000 0.611111 0 0.675000 0.666667 0 0.675000 0.722222 0 0.675000 0.777778 0 0.675000 0.833333 0 0.675000 0.888889 0 0.675000 0.944444 0 0.675000 1.000000 0 0.683333 0 0 0.683333 0.055556 0 0.683333 0.111111 0 0.683333 0.166667 0 0.683333 0.222222 0 0.683333 0.277778 0 0.683333 0.333333 0 0.683333 0.388889 0 0.683333 0.444444 0 0.683333 0.500000 0 0.683333 0.555556 0 0.683333 0.611111 0 0.683333 0.666667 0 0.683333 0.722222 0 0.683333 0.777778 0 0.683333 0.833333 0 0.683333 0.888889 0 0.683333 0.944444 0 0.683333 1.000000 0 0.691666 0 0 0.691666 0.055556 0 0.691666 0.111111 0 0.691666 0.166667 0 0.691666 0.222222 0 0.691666 0.277778 0 0.691666 0.333333 0 0.691666 0.388889 0 0.691666 0.444444 0 0.691666 0.500000 0 0.691666 0.555556 0 0.691666 0.611111 0 0.691666 0.666667 0 0.691666 0.722222 0 0.691666 0.777778 0 0.691666 0.833333 0 0.691666 0.888889 0 0.691666 0.944444 0 0.691666 1.000000 0 0.700000 0 0 0.700000 0.055556 0 0.700000 0.111111 0 0.700000 0.166667 0 0.700000 0.222222 0 0.700000 0.277778 0 0.700000 0.333333 0 0.700000 0.388889 0 0.700000 0.444444 0 0.700000 0.500000 0 0.700000 0.555556 0 0.700000 0.611111 0 0.700000 0.666667 0 0.700000 0.722222 0 0.700000 0.777778 0 0.700000 0.833333 0 0.700000 0.888889 0 0.700000 0.944444 0 0.700000 1.000000 0 0.708333 0 0 0.708333 0.055556 0 0.708333 0.111111 0 0.708333 0.166667 0 0.708333 0.222222 0 0.708333 0.277778 0 0.708333 0.333333 0 0.708333 0.388889 0 0.708333 0.444444 0 0.708333 0.500000 0 0.708333 0.555556 0 0.708333 0.611111 0 0.708333 0.666667 0 0.708333 0.722222 0 0.708333 0.777778 0 0.708333 0.833333 0 0.708333 0.888889 0 0.708333 0.944444 0 0.708333 1.000000 0 0.716666 0 0 0.716666 0.055556 0 0.716666 0.111111 0 0.716666 0.166667 0 0.716666 0.222222 0 0.716666 0.277778 0 0.716666 0.333333 0 0.716666 0.388889 0 0.716666 0.444444 0 0.716666 0.500000 0 0.716666 0.555556 0 0.716666 0.611111 0 0.716666 0.666667 0 0.716666 0.722222 0 0.716666 0.777778 0 0.716666 0.833333 0 0.716666 0.888889 0 0.716666 0.944444 0 0.716666 1.000000 0 0.725000 0 0 0.725000 0.055556 0 0.725000 0.111111 0 0.725000 0.166667 0 0.725000 0.222222 0 0.725000 0.277778 0 0.725000 0.333333 0 0.725000 0.388889 0 0.725000 0.444444 0 0.725000 0.500000 0 0.725000 0.555556 0 0.725000 0.611111 0 0.725000 0.666667 0 0.725000 0.722222 0 0.725000 0.777778 0 0.725000 0.833333 0 0.725000 0.888889 0 0.725000 0.944444 0 0.725000 1.000000 0 0.733333 0 0 0.733333 0.055556 0 0.733333 0.111111 0 0.733333 0.166667 0 0.733333 0.222222 0 0.733333 0.277778 0 0.733333 0.333333 0 0.733333 0.388889 0 0.733333 0.444444 0 0.733333 0.500000 0 0.733333 0.555556 0 0.733333 0.611111 0 0.733333 0.666667 0 0.733333 0.722222 0 0.733333 0.777778 0 0.733333 0.833333 0 0.733333 0.888889 0 0.733333 0.944444 0 0.733333 1.000000 0 0.741666 0 0 0.741666 0.055556 0 0.741666 0.111111 0 0.741666 0.166667 0 0.741666 0.222222 0 0.741666 0.277778 0 0.741666 0.333333 0 0.741666 0.388889 0 0.741666 0.444444 0 0.741666 0.500000 0 0.741666 0.555556 0 0.741666 0.611111 0 0.741666 0.666667 0 0.741666 0.722222 0 0.741666 0.777778 0 0.741666 0.833333 0 0.741666 0.888889 0 0.741666 0.944444 0 0.741666 1.000000 0 0.750000 0 0 0.750000 0.055556 0 0.750000 0.111111 0 0.750000 0.166667 0 0.750000 0.222222 0 0.750000 0.277778 0 0.750000 0.333333 0 0.750000 0.388889 0 0.750000 0.444444 0 0.750000 0.500000 0 0.750000 0.555556 0 0.750000 0.611111 0 0.750000 0.666667 0 0.750000 0.722222 0 0.750000 0.777778 0 0.750000 0.833333 0 0.750000 0.888889 0 0.750000 0.944444 0 0.750000 1.000000 0 0.758333 0 0 0.758333 0.055556 0 0.758333 0.111111 0 0.758333 0.166667 0 0.758333 0.222222 0 0.758333 0.277778 0 0.758333 0.333333 0 0.758333 0.388889 0 0.758333 0.444444 0 0.758333 0.500000 0 0.758333 0.555556 0 0.758333 0.611111 0 0.758333 0.666667 0 0.758333 0.722222 0 0.758333 0.777778 0 0.758333 0.833333 0 0.758333 0.888889 0 0.758333 0.944444 0 0.758333 1.000000 0 0.766667 0 0 0.766667 0.055556 0 0.766667 0.111111 0 0.766667 0.166667 0 0.766667 0.222222 0 0.766667 0.277778 0 0.766667 0.333333 0 0.766667 0.388889 0 0.766667 0.444444 0 0.766667 0.500000 0 0.766667 0.555556 0 0.766667 0.611111 0 0.766667 0.666667 0 0.766667 0.722222 0 0.766667 0.777778 0 0.766667 0.833333 0 0.766667 0.888889 0 0.766667 0.944444 0 0.766667 1.000000 0 0.775000 0 0 0.775000 0.055556 0 0.775000 0.111111 0 0.775000 0.166667 0 0.775000 0.222222 0 0.775000 0.277778 0 0.775000 0.333333 0 0.775000 0.388889 0 0.775000 0.444444 0 0.775000 0.500000 0 0.775000 0.555556 0 0.775000 0.611111 0 0.775000 0.666667 0 0.775000 0.722222 0 0.775000 0.777778 0 0.775000 0.833333 0 0.775000 0.888889 0 0.775000 0.944444 0 0.775000 1.000000 0 0.783333 0 0 0.783333 0.055556 0 0.783333 0.111111 0 0.783333 0.166667 0 0.783333 0.222222 0 0.783333 0.277778 0 0.783333 0.333333 0 0.783333 0.388889 0 0.783333 0.444444 0 0.783333 0.500000 0 0.783333 0.555556 0 0.783333 0.611111 0 0.783333 0.666667 0 0.783333 0.722222 0 0.783333 0.777778 0 0.783333 0.833333 0 0.783333 0.888889 0 0.783333 0.944444 0 0.783333 1.000000 0 0.791667 0 0 0.791667 0.055556 0 0.791667 0.111111 0 0.791667 0.166667 0 0.791667 0.222222 0 0.791667 0.277778 0 0.791667 0.333333 0 0.791667 0.388889 0 0.791667 0.444444 0 0.791667 0.500000 0 0.791667 0.555556 0 0.791667 0.611111 0 0.791667 0.666667 0 0.791667 0.722222 0 0.791667 0.777778 0 0.791667 0.833333 0 0.791667 0.888889 0 0.791667 0.944444 0 0.791667 1.000000 0 0.800000 0 0 0.800000 0.055556 0 0.800000 0.111111 0 0.800000 0.166667 0 0.800000 0.222222 0 0.800000 0.277778 0 0.800000 0.333333 0 0.800000 0.388889 0 0.800000 0.444444 0 0.800000 0.500000 0 0.800000 0.555556 0 0.800000 0.611111 0 0.800000 0.666667 0 0.800000 0.722222 0 0.800000 0.777778 0 0.800000 0.833333 0 0.800000 0.888889 0 0.800000 0.944444 0 0.800000 1.000000 0 0.808333 0 0 0.808333 0.055556 0 0.808333 0.111111 0 0.808333 0.166667 0 0.808333 0.222222 0 0.808333 0.277778 0 0.808333 0.333333 0 0.808333 0.388889 0 0.808333 0.444444 0 0.808333 0.500000 0 0.808333 0.555556 0 0.808333 0.611111 0 0.808333 0.666667 0 0.808333 0.722222 0 0.808333 0.777778 0 0.808333 0.833333 0 0.808333 0.888889 0 0.808333 0.944444 0 0.808333 1.000000 0 0.816667 0 0 0.816667 0.055556 0 0.816667 0.111111 0 0.816667 0.166667 0 0.816667 0.222222 0 0.816667 0.277778 0 0.816667 0.333333 0 0.816667 0.388889 0 0.816667 0.444444 0 0.816667 0.500000 0 0.816667 0.555556 0 0.816667 0.611111 0 0.816667 0.666667 0 0.816667 0.722222 0 0.816667 0.777778 0 0.816667 0.833333 0 0.816667 0.888889 0 0.816667 0.944444 0 0.816667 1.000000 0 0.825000 0 0 0.825000 0.055556 0 0.825000 0.111111 0 0.825000 0.166667 0 0.825000 0.222222 0 0.825000 0.277778 0 0.825000 0.333333 0 0.825000 0.388889 0 0.825000 0.444444 0 0.825000 0.500000 0 0.825000 0.555556 0 0.825000 0.611111 0 0.825000 0.666667 0 0.825000 0.722222 0 0.825000 0.777778 0 0.825000 0.833333 0 0.825000 0.888889 0 0.825000 0.944444 0 0.825000 1.000000 0 0.833333 0 0 0.833333 0.055556 0 0.833333 0.111111 0 0.833333 0.166667 0 0.833333 0.222222 0 0.833333 0.277778 0 0.833333 0.333333 0 0.833333 0.388889 0 0.833333 0.444444 0 0.833333 0.500000 0 0.833333 0.555556 0 0.833333 0.611111 0 0.833333 0.666667 0 0.833333 0.722222 0 0.833333 0.777778 0 0.833333 0.833333 0 0.833333 0.888889 0 0.833333 0.944444 0 0.833333 1.000000 0 0.841667 0 0 0.841667 0.055556 0 0.841667 0.111111 0 0.841667 0.166667 0 0.841667 0.222222 0 0.841667 0.277778 0 0.841667 0.333333 0 0.841667 0.388889 0 0.841667 0.444444 0 0.841667 0.500000 0 0.841667 0.555556 0 0.841667 0.611111 0 0.841667 0.666667 0 0.841667 0.722222 0 0.841667 0.777778 0 0.841667 0.833333 0 0.841667 0.888889 0 0.841667 0.944444 0 0.841667 1.000000 0 0.850000 0 0 0.850000 0.055556 0 0.850000 0.111111 0 0.850000 0.166667 0 0.850000 0.222222 0 0.850000 0.277778 0 0.850000 0.333333 0 0.850000 0.388889 0 0.850000 0.444444 0 0.850000 0.500000 0 0.850000 0.555556 0 0.850000 0.611111 0 0.850000 0.666667 0 0.850000 0.722222 0 0.850000 0.777778 0 0.850000 0.833333 0 0.850000 0.888889 0 0.850000 0.944444 0 0.850000 1.000000 0 0.858334 0 0 0.858334 0.055556 0 0.858334 0.111111 0 0.858334 0.166667 0 0.858334 0.222222 0 0.858334 0.277778 0 0.858334 0.333333 0 0.858334 0.388889 0 0.858334 0.444444 0 0.858334 0.500000 0 0.858334 0.555556 0 0.858334 0.611111 0 0.858334 0.666667 0 0.858334 0.722222 0 0.858334 0.777778 0 0.858334 0.833333 0 0.858334 0.888889 0 0.858334 0.944444 0 0.858334 1.000000 0 0.866667 0 0 0.866667 0.055556 0 0.866667 0.111111 0 0.866667 0.166667 0 0.866667 0.222222 0 0.866667 0.277778 0 0.866667 0.333333 0 0.866667 0.388889 0 0.866667 0.444444 0 0.866667 0.500000 0 0.866667 0.555556 0 0.866667 0.611111 0 0.866667 0.666667 0 0.866667 0.722222 0 0.866667 0.777778 0 0.866667 0.833333 0 0.866667 0.888889 0 0.866667 0.944444 0 0.866667 1.000000 0 0.875000 0 0 0.875000 0.055556 0 0.875000 0.111111 0 0.875000 0.166667 0 0.875000 0.222222 0 0.875000 0.277778 0 0.875000 0.333333 0 0.875000 0.388889 0 0.875000 0.444444 0 0.875000 0.500000 0 0.875000 0.555556 0 0.875000 0.611111 0 0.875000 0.666667 0 0.875000 0.722222 0 0.875000 0.777778 0 0.875000 0.833333 0 0.875000 0.888889 0 0.875000 0.944444 0 0.875000 1.000000 0 0.883334 0 0 0.883334 0.055556 0 0.883334 0.111111 0 0.883334 0.166667 0 0.883334 0.222222 0 0.883334 0.277778 0 0.883334 0.333333 0 0.883334 0.388889 0 0.883334 0.444444 0 0.883334 0.500000 0 0.883334 0.555556 0 0.883334 0.611111 0 0.883334 0.666667 0 0.883334 0.722222 0 0.883334 0.777778 0 0.883334 0.833333 0 0.883334 0.888889 0 0.883334 0.944444 0 0.883334 1.000000 0 0.891667 0 0 0.891667 0.055556 0 0.891667 0.111111 0 0.891667 0.166667 0 0.891667 0.222222 0 0.891667 0.277778 0 0.891667 0.333333 0 0.891667 0.388889 0 0.891667 0.444444 0 0.891667 0.500000 0 0.891667 0.555556 0 0.891667 0.611111 0 0.891667 0.666667 0 0.891667 0.722222 0 0.891667 0.777778 0 0.891667 0.833333 0 0.891667 0.888889 0 0.891667 0.944444 0 0.891667 1.000000 0 0.900000 0 0 0.900000 0.055556 0 0.900000 0.111111 0 0.900000 0.166667 0 0.900000 0.222222 0 0.900000 0.277778 0 0.900000 0.333333 0 0.900000 0.388889 0 0.900000 0.444444 0 0.900000 0.500000 0 0.900000 0.555556 0 0.900000 0.611111 0 0.900000 0.666667 0 0.900000 0.722222 0 0.900000 0.777778 0 0.900000 0.833333 0 0.900000 0.888889 0 0.900000 0.944444 0 0.900000 1.000000 0 0.908334 0 0 0.908334 0.055556 0 0.908334 0.111111 0 0.908334 0.166667 0 0.908334 0.222222 0 0.908334 0.277778 0 0.908334 0.333333 0 0.908334 0.388889 0 0.908334 0.444444 0 0.908334 0.500000 0 0.908334 0.555556 0 0.908334 0.611111 0 0.908334 0.666667 0 0.908334 0.722222 0 0.908334 0.777778 0 0.908334 0.833333 0 0.908334 0.888889 0 0.908334 0.944444 0 0.908334 1.000000 0 0.916667 0 0 0.916667 0.055556 0 0.916667 0.111111 0 0.916667 0.166667 0 0.916667 0.222222 0 0.916667 0.277778 0 0.916667 0.333333 0 0.916667 0.388889 0 0.916667 0.444444 0 0.916667 0.500000 0 0.916667 0.555556 0 0.916667 0.611111 0 0.916667 0.666667 0 0.916667 0.722222 0 0.916667 0.777778 0 0.916667 0.833333 0 0.916667 0.888889 0 0.916667 0.944444 0 0.916667 1.000000 0 0.925000 0 0 0.925000 0.055556 0 0.925000 0.111111 0 0.925000 0.166667 0 0.925000 0.222222 0 0.925000 0.277778 0 0.925000 0.333333 0 0.925000 0.388889 0 0.925000 0.444444 0 0.925000 0.500000 0 0.925000 0.555556 0 0.925000 0.611111 0 0.925000 0.666667 0 0.925000 0.722222 0 0.925000 0.777778 0 0.925000 0.833333 0 0.925000 0.888889 0 0.925000 0.944444 0 0.925000 1.000000 0 0.933334 0 0 0.933334 0.055556 0 0.933334 0.111111 0 0.933334 0.166667 0 0.933334 0.222222 0 0.933334 0.277778 0 0.933334 0.333333 0 0.933334 0.388889 0 0.933334 0.444444 0 0.933334 0.500000 0 0.933334 0.555556 0 0.933334 0.611111 0 0.933334 0.666667 0 0.933334 0.722222 0 0.933334 0.777778 0 0.933334 0.833333 0 0.933334 0.888889 0 0.933334 0.944444 0 0.933334 1.000000 0 0.941667 0 0 0.941667 0.055556 0 0.941667 0.111111 0 0.941667 0.166667 0 0.941667 0.222222 0 0.941667 0.277778 0 0.941667 0.333333 0 0.941667 0.388889 0 0.941667 0.444444 0 0.941667 0.500000 0 0.941667 0.555556 0 0.941667 0.611111 0 0.941667 0.666667 0 0.941667 0.722222 0 0.941667 0.777778 0 0.941667 0.833333 0 0.941667 0.888889 0 0.941667 0.944444 0 0.941667 1.000000 0 0.950001 0 0 0.950001 0.055556 0 0.950001 0.111111 0 0.950001 0.166667 0 0.950001 0.222222 0 0.950001 0.277778 0 0.950001 0.333333 0 0.950001 0.388889 0 0.950001 0.444444 0 0.950001 0.500000 0 0.950001 0.555556 0 0.950001 0.611111 0 0.950001 0.666667 0 0.950001 0.722222 0 0.950001 0.777778 0 0.950001 0.833333 0 0.950001 0.888889 0 0.950001 0.944444 0 0.950001 1.000000 0 0.958334 0 0 0.958334 0.055556 0 0.958334 0.111111 0 0.958334 0.166667 0 0.958334 0.222222 0 0.958334 0.277778 0 0.958334 0.333333 0 0.958334 0.388889 0 0.958334 0.444444 0 0.958334 0.500000 0 0.958334 0.555556 0 0.958334 0.611111 0 0.958334 0.666667 0 0.958334 0.722222 0 0.958334 0.777778 0 0.958334 0.833333 0 0.958334 0.888889 0 0.958334 0.944444 0 0.958334 1.000000 0 0.966667 0 0 0.966667 0.055556 0 0.966667 0.111111 0 0.966667 0.166667 0 0.966667 0.222222 0 0.966667 0.277778 0 0.966667 0.333333 0 0.966667 0.388889 0 0.966667 0.444444 0 0.966667 0.500000 0 0.966667 0.555556 0 0.966667 0.611111 0 0.966667 0.666667 0 0.966667 0.722222 0 0.966667 0.777778 0 0.966667 0.833333 0 0.966667 0.888889 0 0.966667 0.944444 0 0.966667 1.000000 0 0.975001 0 0 0.975001 0.055556 0 0.975001 0.111111 0 0.975001 0.166667 0 0.975001 0.222222 0 0.975001 0.277778 0 0.975001 0.333333 0 0.975001 0.388889 0 0.975001 0.444444 0 0.975001 0.500000 0 0.975001 0.555556 0 0.975001 0.611111 0 0.975001 0.666667 0 0.975001 0.722222 0 0.975001 0.777778 0 0.975001 0.833333 0 0.975001 0.888889 0 0.975001 0.944444 0 0.975001 1.000000 0 0.983334 0 0 0.983334 0.055556 0 0.983334 0.111111 0 0.983334 0.166667 0 0.983334 0.222222 0 0.983334 0.277778 0 0.983334 0.333333 0 0.983334 0.388889 0 0.983334 0.444444 0 0.983334 0.500000 0 0.983334 0.555556 0 0.983334 0.611111 0 0.983334 0.666667 0 0.983334 0.722222 0 0.983334 0.777778 0 0.983334 0.833333 0 0.983334 0.888889 0 0.983334 0.944444 0 0.983334 1.000000 0 0.991667 0 0 0.991667 0.055556 0 0.991667 0.111111 0 0.991667 0.166667 0 0.991667 0.222222 0 0.991667 0.277778 0 0.991667 0.333333 0 0.991667 0.388889 0 0.991667 0.444444 0 0.991667 0.500000 0 0.991667 0.555556 0 0.991667 0.611111 0 0.991667 0.666667 0 0.991667 0.722222 0 0.991667 0.777778 0 0.991667 0.833333 0 0.991667 0.888889 0 0.991667 0.944444 0 0.991667 1.000000 0 1.000001 0 0 1.000001 0.055556 0 1.000001 0.111111 0 1.000001 0.166667 0 1.000001 0.222222 0 1.000001 0.277778 0 1.000001 0.333333 0 1.000001 0.388889 0 1.000001 0.444444 0 1.000001 0.500000 0 1.000001 0.555556 0 1.000001 0.611111 0 1.000001 0.666667 0 1.000001 0.722222 0 1.000001 0.777778 0 1.000001 0.833333 0 1.000001 0.888889 0 1.000001 0.944444 0 1.000001 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="2299" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="4320">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 18 1 19 19 2 20 0 0 0 19 2 20 1 3 1 1 3 1 19 2 20 20 4 21 1 3 1 20 4 21 2 5 2 2 5 2 20 4 21 21 6 22 2 5 2 21 6 22 3 7 3 3 7 3 21 6 22 22 8 23 3 7 3 22 8 23 4 9 4 4 9 4 22 8 23 23 10 24 4 9 4 23 10 24 5 11 5 5 11 5 23 10 24 24 12 25 5 11 5 24 12 25 6 13 6 6 13 6 24 12 25 25 14 26 6 13 6 25 14 26 7 15 7 7 15 7 25 14 26 26 16 27 7 15 7 26 16 27 8 17 8 8 17 8 26 16 27 27 18 28 8 17 8 27 18 28 9 19 9 9 19 9 27 18 28 28 20 29 9 19 9 28 20 29 10 21 10 10 21 10 28 20 29 29 22 30 10 21 10 29 22 30 11 23 11 11 23 11 29 22 30 30 24 31 11 23 11 30 24 31 12 25 12 12 25 12 30 24 31 31 26 32 12 25 12 31 26 32 13 27 13 13 27 13 31 26 32 32 28 33 13 27 13 32 28 33 14 29 14 14 29 14 32 28 33 33 30 34 14 29 14 33 30 34 15 31 15 15 31 15 33 30 34 34 32 35 15 31 15 34 32 35 16 33 16 16 33 16 34 32 35 35 34 36 16 33 16 35 34 36 17 35 17 17 35 17 35 34 36 18 1 37 17 35 17 18 1 37 0 0 18 18 1 19 36 36 38 37 37 39 18 1 19 37 37 39 19 2 20 19 2 20 37 37 39 38 38 40 19 2 20 38 38 40 20 4 21 20 4 21 38 38 40 39 39 41 20 4 21 39 39 41 21 6 22 21 6 22 39 39 41 40 40 42 21 6 22 40 40 42 22 8 23 22 8 23 40 40 42 41 41 43 22 8 23 41 41 43 23 10 24 23 10 24 41 41 43 42 42 44 23 10 24 42 42 44 24 12 25 24 12 25 42 42 44 43 43 45 24 12 25 43 43 45 25 14 26 25 14 26 43 43 45 44 44 46 25 14 26 44 44 46 26 16 27 26 16 27 44 44 46 45 45 47 26 16 27 45 45 47 27 18 28 27 18 28 45 45 47 46 46 48 27 18 28 46 46 48 28 20 29 28 20 29 46 46 48 47 47 49 28 20 29 47 47 49 29 22 30 29 22 30 47 47 49 48 48 50 29 22 30 48 48 50 30 24 31 30 24 31 48 48 50 49 49 51 30 24 31 49 49 51 31 26 32 31 26 32 49 49 51 50 50 52 31 26 32 50 50 52 32 28 33 32 28 33 50 50 52 51 51 53 32 28 33 51 51 53 33 30 34 33 30 34 51 51 53 52 52 54 33 30 34 52 52 54 34 32 35 34 32 35 52 52 54 53 53 55 34 32 35 53 53 55 35 34 36 35 34 36 53 53 55 36 36 56 35 34 36 36 36 56 18 1 37 36 36 38 54 54 57 55 55 58 36 36 38 55 55 58 37 37 39 37 37 39 55 55 58 56 56 59 37 37 39 56 56 59 38 38 40 38 38 40 56 56 59 57 57 60 38 38 40 57 57 60 39 39 41 39 39 41 57 57 60 58 58 61 39 39 41 58 58 61 40 40 42 40 40 42 58 58 61 59 59 62 40 40 42 59 59 62 41 41 43 41 41 43 59 59 62 60 60 63 41 41 43 60 60 63 42 42 44 42 42 44 60 60 63 61 61 64 42 42 44 61 61 64 43 43 45 43 43 45 61 61 64 62 62 65 43 43 45 62 62 65 44 44 46 44 44 46 62 62 65 63 63 66 44 44 46 63 63 66 45 45 47 45 45 47 63 63 66 64 64 67 45 45 47 64 64 67 46 46 48 46 46 48 64 64 67 65 65 68 46 46 48 65 65 68 47 47 49 47 47 49 65 65 68 66 66 69 47 47 49 66 66 69 48 48 50 48 48 50 66 66 69 67 67 70 48 48 50 67 67 70 49 49 51 49 49 51 67 67 70 68 68 71 49 49 51 68 68 71 50 50 52 50 50 52 68 68 71 69 69 72 50 50 52 69 69 72 51 51 53 51 51 53 69 69 72 70 70 73 51 51 53 70 70 73 52 52 54 52 52 54 70 70 73 71 71 74 52 52 54 71 71 74 53 53 55 53 53 55 71 71 74 54 54 75 53 53 55 54 54 75 36 36 56 54 54 57 72 72 76 73 73 77 54 54 57 73 73 77 55 55 58 55 55 58 73 73 77 74 74 78 55 55 58 74 74 78 56 56 59 56 56 59 74 74 78 75 75 79 56 56 59 75 75 79 57 57 60 57 57 60 75 75 79 76 76 80 57 57 60 76 76 80 58 58 61 58 58 61 76 76 80 77 77 81 58 58 61 77 77 81 59 59 62 59 59 62 77 77 81 78 78 82 59 59 62 78 78 82 60 60 63 60 60 63 78 78 82 79 79 83 60 60 63 79 79 83 61 61 64 61 61 64 79 79 83 80 80 84 61 61 64 80 80 84 62 62 65 62 62 65 80 80 84 81 81 85 62 62 65 81 81 85 63 63 66 63 63 66 81 81 85 82 82 86 63 63 66 82 82 86 64 64 67 64 64 67 82 82 86 83 83 87 64 64 67 83 83 87 65 65 68 65 65 68 83 83 87 84 84 88 65 65 68 84 84 88 66 66 69 66 66 69 84 84 88 85 85 89 66 66 69 85 85 89 67 67 70 67 67 70 85 85 89 86 86 90 67 67 70 86 86 90 68 68 71 68 68 71 86 86 90 87 87 91 68 68 71 87 87 91 69 69 72 69 69 72 87 87 91 88 88 92 69 69 72 88 88 92 70 70 73 70 70 73 88 88 92 89 89 93 70 70 73 89 89 93 71 71 74 71 71 74 89 89 93 72 72 94 71 71 74 72 72 94 54 54 75 72 72 76 90 90 95 91 91 96 72 72 76 91 91 96 73 73 77 73 73 77 91 91 96 92 92 97 73 73 77 92 92 97 74 74 78 74 74 78 92 92 97 93 93 98 74 74 78 93 93 98 75 75 79 75 75 79 93 93 98 94 94 99 75 75 79 94 94 99 76 76 80 76 76 80 94 94 99 95 95 100 76 76 80 95 95 100 77 77 81 77 77 81 95 95 100 96 96 101 77 77 81 96 96 101 78 78 82 78 78 82 96 96 101 97 97 102 78 78 82 97 97 102 79 79 83 79 79 83 97 97 102 98 98 103 79 79 83 98 98 103 80 80 84 80 80 84 98 98 103 99 99 104 80 80 84 99 99 104 81 81 85 81 81 85 99 99 104 100 100 105 81 81 85 100 100 105 82 82 86 82 82 86 100 100 105 101 101 106 82 82 86 101 101 106 83 83 87 83 83 87 101 101 106 102 102 107 83 83 87 102 102 107 84 84 88 84 84 88 102 102 107 103 103 108 84 84 88 103 103 108 85 85 89 85 85 89 103 103 108 104 104 109 85 85 89 104 104 109 86 86 90 86 86 90 104 104 109 105 105 110 86 86 90 105 105 110 87 87 91 87 87 91 105 105 110 106 106 111 87 87 91 106 106 111 88 88 92 88 88 92 106 106 111 107 107 112 88 88 92 107 107 112 89 89 93 89 89 93 107 107 112 90 90 113 89 89 93 90 90 113 72 72 94 90 90 95 108 108 114 109 109 115 90 90 95 109 109 115 91 91 96 91 91 96 109 109 115 110 110 116 91 91 96 110 110 116 92 92 97 92 92 97 110 110 116 111 111 117 92 92 97 111 111 117 93 93 98 93 93 98 111 111 117 112 112 118 93 93 98 112 112 118 94 94 99 94 94 99 112 112 118 113 113 119 94 94 99 113 113 119 95 95 100 95 95 100 113 113 119 114 114 120 95 95 100 114 114 120 96 96 101 96 96 101 114 114 120 115 115 121 96 96 101 115 115 121 97 97 102 97 97 102 115 115 121 116 116 122 97 97 102 116 116 122 98 98 103 98 98 103 116 116 122 117 117 123 98 98 103 117 117 123 99 99 104 99 99 104 117 117 123 118 118 124 99 99 104 118 118 124 100 100 105 100 100 105 118 118 124 119 119 125 100 100 105 119 119 125 101 101 106 101 101 106 119 119 125 120 120 126 101 101 106 120 120 126 102 102 107 102 102 107 120 120 126 121 121 127 102 102 107 121 121 127 103 103 108 103 103 108 121 121 127 122 122 128 103 103 108 122 122 128 104 104 109 104 104 109 122 122 128 123 123 129 104 104 109 123 123 129 105 105 110 105 105 110 123 123 129 124 124 130 105 105 110 124 124 130 106 106 111 106 106 111 124 124 130 125 125 131 106 106 111 125 125 131 107 107 112 107 107 112 125 125 131 108 108 132 107 107 112 108 108 132 90 90 113 108 108 114 126 126 133 127 127 134 108 108 114 127 127 134 109 109 115 109 109 115 127 127 134 128 128 135 109 109 115 128 128 135 110 110 116 110 110 116 128 128 135 129 129 136 110 110 116 129 129 136 111 111 117 111 111 117 129 129 136 130 130 137 111 111 117 130 130 137 112 112 118 112 112 118 130 130 137 131 131 138 112 112 118 131 131 138 113 113 119 113 113 119 131 131 138 132 132 139 113 113 119 132 132 139 114 114 120 114 114 120 132 132 139 133 133 140 114 114 120 133 133 140 115 115 121 115 115 121 133 133 140 134 134 141 115 115 121 134 134 141 116 116 122 116 116 122 134 134 141 135 135 142 116 116 122 135 135 142 117 117 123 117 117 123 135 135 142 136 136 143 117 117 123 136 136 143 118 118 124 118 118 124 136 136 143 137 137 144 118 118 124 137 137 144 119 119 125 119 119 125 137 137 144 138 138 145 119 119 125 138 138 145 120 120 126 120 120 126 138 138 145 139 139 146 120 120 126 139 139 146 121 121 127 121 121 127 139 139 146 140 140 147 121 121 127 140 140 147 122 122 128 122 122 128 140 140 147 141 141 148 122 122 128 141 141 148 123 123 129 123 123 129 141 141 148 142 142 149 123 123 129 142 142 149 124 124 130 124 124 130 142 142 149 143 143 150 124 124 130 143 143 150 125 125 131 125 125 131 143 143 150 126 126 151 125 125 131 126 126 151 108 108 132 126 126 133 144 144 152 145 145 153 126 126 133 145 145 153 127 127 134 127 127 134 145 145 153 146 146 154 127 127 134 146 146 154 128 128 135 128 128 135 146 146 154 147 147 155 128 128 135 147 147 155 129 129 136 129 129 136 147 147 155 148 148 156 129 129 136 148 148 156 130 130 137 130 130 137 148 148 156 149 149 157 130 130 137 149 149 157 131 131 138 131 131 138 149 149 157 150 150 158 131 131 138 150 150 158 132 132 139 132 132 139 150 150 158 151 151 159 132 132 139 151 151 159 133 133 140 133 133 140 151 151 159 152 152 160 133 133 140 152 152 160 134 134 141 134 134 141 152 152 160 153 153 161 134 134 141 153 153 161 135 135 142 135 135 142 153 153 161 154 154 162 135 135 142 154 154 162 136 136 143 136 136 143 154 154 162 155 155 163 136 136 143 155 155 163 137 137 144 137 137 144 155 155 163 156 156 164 137 137 144 156 156 164 138 138 145 138 138 145 156 156 164 157 157 165 138 138 145 157 157 165 139 139 146 139 139 146 157 157 165 158 158 166 139 139 146 158 158 166 140 140 147 140 140 147 158 158 166 159 159 167 140 140 147 159 159 167 141 141 148 141 141 148 159 159 167 160 160 168 141 141 148 160 160 168 142 142 149 142 142 149 160 160 168 161 161 169 142 142 149 161 161 169 143 143 150 143 143 150 161 161 169 144 144 170 143 143 150 144 144 170 126 126 151 144 144 152 162 162 171 163 163 172 144 144 152 163 163 172 145 145 153 145 145 153 163 163 172 164 164 173 145 145 153 164 164 173 146 146 154 146 146 154 164 164 173 165 165 174 146 146 154 165 165 174 147 147 155 147 147 155 165 165 174 166 166 175 147 147 155 166 166 175 148 148 156 148 148 156 166 166 175 167 167 176 148 148 156 167 167 176 149 149 157 149 149 157 167 167 176 168 168 177 149 149 157 168 168 177 150 150 158 150 150 158 168 168 177 169 169 178 150 150 158 169 169 178 151 151 159 151 151 159 169 169 178 170 170 179 151 151 159 170 170 179 152 152 160 152 152 160 170 170 179 171 171 180 152 152 160 171 171 180 153 153 161 153 153 161 171 171 180 172 172 181 153 153 161 172 172 181 154 154 162 154 154 162 172 172 181 173 173 182 154 154 162 173 173 182 155 155 163 155 155 163 173 173 182 174 174 183 155 155 163 174 174 183 156 156 164 156 156 164 174 174 183 175 175 184 156 156 164 175 175 184 157 157 165 157 157 165 175 175 184 176 176 185 157 157 165 176 176 185 158 158 166 158 158 166 176 176 185 177 177 186 158 158 166 177 177 186 159 159 167 159 159 167 177 177 186 178 178 187 159 159 167 178 178 187 160 160 168 160 160 168 178 178 187 179 179 188 160 160 168 179 179 188 161 161 169 161 161 169 179 179 188 162 162 189 161 161 169 162 162 189 144 144 170 162 162 171 180 180 190 181 181 191 162 162 171 181 181 191 163 163 172 163 163 172 181 181 191 182 182 192 163 163 172 182 182 192 164 164 173 164 164 173 182 182 192 183 183 193 164 164 173 183 183 193 165 165 174 165 165 174 183 183 193 184 184 194 165 165 174 184 184 194 166 166 175 166 166 175 184 184 194 185 185 195 166 166 175 185 185 195 167 167 176 167 167 176 185 185 195 186 186 196 167 167 176 186 186 196 168 168 177 168 168 177 186 186 196 187 187 197 168 168 177 187 187 197 169 169 178 169 169 178 187 187 197 188 188 198 169 169 178 188 188 198 170 170 179 170 170 179 188 188 198 189 189 199 170 170 179 189 189 199 171 171 180 171 171 180 189 189 199 190 190 200 171 171 180 190 190 200 172 172 181 172 172 181 190 190 200 191 191 201 172 172 181 191 191 201 173 173 182 173 173 182 191 191 201 192 192 202 173 173 182 192 192 202 174 174 183 174 174 183 192 192 202 193 193 203 174 174 183 193 193 203 175 175 184 175 175 184 193 193 203 194 194 204 175 175 184 194 194 204 176 176 185 176 176 185 194 194 204 195 195 205 176 176 185 195 195 205 177 177 186 177 177 186 195 195 205 196 196 206 177 177 186 196 196 206 178 178 187 178 178 187 196 196 206 197 197 207 178 178 187 197 197 207 179 179 188 179 179 188 197 197 207 180 180 208 179 179 188 180 180 208 162 162 189 180 180 190 198 198 209 199 199 210 180 180 190 199 199 210 181 181 191 181 181 191 199 199 210 200 200 211 181 181 191 200 200 211 182 182 192 182 182 192 200 200 211 201 201 212 182 182 192 201 201 212 183 183 193 183 183 193 201 201 212 202 202 213 183 183 193 202 202 213 184 184 194 184 184 194 202 202 213 203 203 214 184 184 194 203 203 214 185 185 195 185 185 195 203 203 214 204 204 215 185 185 195 204 204 215 186 186 196 186 186 196 204 204 215 205 205 216 186 186 196 205 205 216 187 187 197 187 187 197 205 205 216 206 206 217 187 187 197 206 206 217 188 188 198 188 188 198 206 206 217 207 207 218 188 188 198 207 207 218 189 189 199 189 189 199 207 207 218 208 208 219 189 189 199 208 208 219 190 190 200 190 190 200 208 208 219 209 209 220 190 190 200 209 209 220 191 191 201 191 191 201 209 209 220 210 210 221 191 191 201 210 210 221 192 192 202 192 192 202 210 210 221 211 211 222 192 192 202 211 211 222 193 193 203 193 193 203 211 211 222 212 212 223 193 193 203 212 212 223 194 194 204 194 194 204 212 212 223 213 213 224 194 194 204 213 213 224 195 195 205 195 195 205 213 213 224 214 214 225 195 195 205 214 214 225 196 196 206 196 196 206 214 214 225 215 215 226 196 196 206 215 215 226 197 197 207 197 197 207 215 215 226 198 198 227 197 197 207 198 198 227 180 180 208 198 198 209 216 216 228 217 217 229 198 198 209 217 217 229 199 199 210 199 199 210 217 217 229 218 218 230 199 199 210 218 218 230 200 200 211 200 200 211 218 218 230 219 219 231 200 200 211 219 219 231 201 201 212 201 201 212 219 219 231 220 220 232 201 201 212 220 220 232 202 202 213 202 202 213 220 220 232 221 221 233 202 202 213 221 221 233 203 203 214 203 203 214 221 221 233 222 222 234 203 203 214 222 222 234 204 204 215 204 204 215 222 222 234 223 223 235 204 204 215 223 223 235 205 205 216 205 205 216 223 223 235 224 224 236 205 205 216 224 224 236 206 206 217 206 206 217 224 224 236 225 225 237 206 206 217 225 225 237 207 207 218 207 207 218 225 225 237 226 226 238 207 207 218 226 226 238 208 208 219 208 208 219 226 226 238 227 227 239 208 208 219 227 227 239 209 209 220 209 209 220 227 227 239 228 228 240 209 209 220 228 228 240 210 210 221 210 210 221 228 228 240 229 229 241 210 210 221 229 229 241 211 211 222 211 211 222 229 229 241 230 230 242 211 211 222 230 230 242 212 212 223 212 212 223 230 230 242 231 231 243 212 212 223 231 231 243 213 213 224 213 213 224 231 231 243 232 232 244 213 213 224 232 232 244 214 214 225 214 214 225 232 232 244 233 233 245 214 214 225 233 233 245 215 215 226 215 215 226 233 233 245 216 216 246 215 215 226 216 216 246 198 198 227 216 216 228 234 234 247 235 235 248 216 216 228 235 235 248 217 217 229 217 217 229 235 235 248 236 236 249 217 217 229 236 236 249 218 218 230 218 218 230 236 236 249 237 237 250 218 218 230 237 237 250 219 219 231 219 219 231 237 237 250 238 238 251 219 219 231 238 238 251 220 220 232 220 220 232 238 238 251 239 239 252 220 220 232 239 239 252 221 221 233 221 221 233 239 239 252 240 240 253 221 221 233 240 240 253 222 222 234 222 222 234 240 240 253 241 241 254 222 222 234 241 241 254 223 223 235 223 223 235 241 241 254 242 242 255 223 223 235 242 242 255 224 224 236 224 224 236 242 242 255 243 243 256 224 224 236 243 243 256 225 225 237 225 225 237 243 243 256 244 244 257 225 225 237 244 244 257 226 226 238 226 226 238 244 244 257 245 245 258 226 226 238 245 245 258 227 227 239 227 227 239 245 245 258 246 246 259 227 227 239 246 246 259 228 228 240 228 228 240 246 246 259 247 247 260 228 228 240 247 247 260 229 229 241 229 229 241 247 247 260 248 248 261 229 229 241 248 248 261 230 230 242 230 230 242 248 248 261 249 249 262 230 230 242 249 249 262 231 231 243 231 231 243 249 249 262 250 250 263 231 231 243 250 250 263 232 232 244 232 232 244 250 250 263 251 251 264 232 232 244 251 251 264 233 233 245 233 233 245 251 251 264 234 234 265 233 233 245 234 234 265 216 216 246 234 234 247 252 252 266 253 253 267 234 234 247 253 253 267 235 235 248 235 235 248 253 253 267 254 254 268 235 235 248 254 254 268 236 236 249 236 236 249 254 254 268 255 255 269 236 236 249 255 255 269 237 237 250 237 237 250 255 255 269 256 256 270 237 237 250 256 256 270 238 238 251 238 238 251 256 256 270 257 257 271 238 238 251 257 257 271 239 239 252 239 239 252 257 257 271 258 258 272 239 239 252 258 258 272 240 240 253 240 240 253 258 258 272 259 259 273 240 240 253 259 259 273 241 241 254 241 241 254 259 259 273 260 260 274 241 241 254 260 260 274 242 242 255 242 242 255 260 260 274 261 261 275 242 242 255 261 261 275 243 243 256 243 243 256 261 261 275 262 262 276 243 243 256 262 262 276 244 244 257 244 244 257 262 262 276 263 263 277 244 244 257 263 263 277 245 245 258 245 245 258 263 263 277 264 264 278 245 245 258 264 264 278 246 246 259 246 246 259 264 264 278 265 265 279 246 246 259 265 265 279 247 247 260 247 247 260 265 265 279 266 266 280 247 247 260 266 266 280 248 248 261 248 248 261 266 266 280 267 267 281 248 248 261 267 267 281 249 249 262 249 249 262 267 267 281 268 268 282 249 249 262 268 268 282 250 250 263 250 250 263 268 268 282 269 269 283 250 250 263 269 269 283 251 251 264 251 251 264 269 269 283 252 252 284 251 251 264 252 252 284 234 234 265 252 252 266 270 270 285 271 271 286 252 252 266 271 271 286 253 253 267 253 253 267 271 271 286 272 272 287 253 253 267 272 272 287 254 254 268 254 254 268 272 272 287 273 273 288 254 254 268 273 273 288 255 255 269 255 255 269 273 273 288 274 274 289 255 255 269 274 274 289 256 256 270 256 256 270 274 274 289 275 275 290 256 256 270 275 275 290 257 257 271 257 257 271 275 275 290 276 276 291 257 257 271 276 276 291 258 258 272 258 258 272 276 276 291 277 277 292 258 258 272 277 277 292 259 259 273 259 259 273 277 277 292 278 278 293 259 259 273 278 278 293 260 260 274 260 260 274 278 278 293 279 279 294 260 260 274 279 279 294 261 261 275 261 261 275 279 279 294 280 280 295 261 261 275 280 280 295 262 262 276 262 262 276 280 280 295 281 281 296 262 262 276 281 281 296 263 263 277 263 263 277 281 281 296 282 282 297 263 263 277 282 282 297 264 264 278 264 264 278 282 282 297 283 283 298 264 264 278 283 283 298 265 265 279 265 265 279 283 283 298 284 284 299 265 265 279 284 284 299 266 266 280 266 266 280 284 284 299 285 285 300 266 266 280 285 285 300 267 267 281 267 267 281 285 285 300 286 286 301 267 267 281 286 286 301 268 268 282 268 268 282 286 286 301 287 287 302 268 268 282 287 287 302 269 269 283 269 269 283 287 287 302 270 270 303 269 269 283 270 270 303 252 252 284 270 270 285 288 288 304 289 289 305 270 270 285 289 289 305 271 271 286 271 271 286 289 289 305 290 290 306 271 271 286 290 290 306 272 272 287 272 272 287 290 290 306 291 291 307 272 272 287 291 291 307 273 273 288 273 273 288 291 291 307 292 292 308 273 273 288 292 292 308 274 274 289 274 274 289 292 292 308 293 293 309 274 274 289 293 293 309 275 275 290 275 275 290 293 293 309 294 294 310 275 275 290 294 294 310 276 276 291 276 276 291 294 294 310 295 295 311 276 276 291 295 295 311 277 277 292 277 277 292 295 295 311 296 296 312 277 277 292 296 296 312 278 278 293 278 278 293 296 296 312 297 297 313 278 278 293 297 297 313 279 279 294 279 279 294 297 297 313 298 298 314 279 279 294 298 298 314 280 280 295 280 280 295 298 298 314 299 299 315 280 280 295 299 299 315 281 281 296 281 281 296 299 299 315 300 300 316 281 281 296 300 300 316 282 282 297 282 282 297 300 300 316 301 301 317 282 282 297 301 301 317 283 283 298 283 283 298 301 301 317 302 302 318 283 283 298 302 302 318 284 284 299 284 284 299 302 302 318 303 303 319 284 284 299 303 303 319 285 285 300 285 285 300 303 303 319 304 304 320 285 285 300 304 304 320 286 286 301 286 286 301 304 304 320 305 305 321 286 286 301 305 305 321 287 287 302 287 287 302 305 305 321 288 288 322 287 287 302 288 288 322 270 270 303 288 288 304 306 306 323 307 307 324 288 288 304 307 307 324 289 289 305 289 289 305 307 307 324 308 308 325 289 289 305 308 308 325 290 290 306 290 290 306 308 308 325 309 309 326 290 290 306 309 309 326 291 291 307 291 291 307 309 309 326 310 310 327 291 291 307 310 310 327 292 292 308 292 292 308 310 310 327 311 311 328 292 292 308 311 311 328 293 293 309 293 293 309 311 311 328 312 312 329 293 293 309 312 312 329 294 294 310 294 294 310 312 312 329 313 313 330 294 294 310 313 313 330 295 295 311 295 295 311 313 313 330 314 314 331 295 295 311 314 314 331 296 296 312 296 296 312 314 314 331 315 315 332 296 296 312 315 315 332 297 297 313 297 297 313 315 315 332 316 316 333 297 297 313 316 316 333 298 298 314 298 298 314 316 316 333 317 317 334 298 298 314 317 317 334 299 299 315 299 299 315 317 317 334 318 318 335 299 299 315 318 318 335 300 300 316 300 300 316 318 318 335 319 319 336 300 300 316 319 319 336 301 301 317 301 301 317 319 319 336 320 320 337 301 301 317 320 320 337 302 302 318 302 302 318 320 320 337 321 321 338 302 302 318 321 321 338 303 303 319 303 303 319 321 321 338 322 322 339 303 303 319 322 322 339 304 304 320 304 304 320 322 322 339 323 323 340 304 304 320 323 323 340 305 305 321 305 305 321 323 323 340 306 306 341 305 305 321 306 306 341 288 288 322 306 306 323 324 324 342 325 325 343 306 306 323 325 325 343 307 307 324 307 307 324 325 325 343 326 326 344 307 307 324 326 326 344 308 308 325 308 308 325 326 326 344 327 327 345 308 308 325 327 327 345 309 309 326 309 309 326 327 327 345 328 328 346 309 309 326 328 328 346 310 310 327 310 310 327 328 328 346 329 329 347 310 310 327 329 329 347 311 311 328 311 311 328 329 329 347 330 330 348 311 311 328 330 330 348 312 312 329 312 312 329 330 330 348 331 331 349 312 312 329 331 331 349 313 313 330 313 313 330 331 331 349 332 332 350 313 313 330 332 332 350 314 314 331 314 314 331 332 332 350 333 333 351 314 314 331 333 333 351 315 315 332 315 315 332 333 333 351 334 334 352 315 315 332 334 334 352 316 316 333 316 316 333 334 334 352 335 335 353 316 316 333 335 335 353 317 317 334 317 317 334 335 335 353 336 336 354 317 317 334 336 336 354 318 318 335 318 318 335 336 336 354 337 337 355 318 318 335 337 337 355 319 319 336 319 319 336 337 337 355 338 338 356 319 319 336 338 338 356 320 320 337 320 320 337 338 338 356 339 339 357 320 320 337 339 339 357 321 321 338 321 321 338 339 339 357 340 340 358 321 321 338 340 340 358 322 322 339 322 322 339 340 340 358 341 341 359 322 322 339 341 341 359 323 323 340 323 323 340 341 341 359 324 324 360 323 323 340 324 324 360 306 306 341 324 324 342 342 342 361 343 343 362 324 324 342 343 343 362 325 325 343 325 325 343 343 343 362 344 344 363 325 325 343 344 344 363 326 326 344 326 326 344 344 344 363 345 345 364 326 326 344 345 345 364 327 327 345 327 327 345 345 345 364 346 346 365 327 327 345 346 346 365 328 328 346 328 328 346 346 346 365 347 347 366 328 328 346 347 347 366 329 329 347 329 329 347 347 347 366 348 348 367 329 329 347 348 348 367 330 330 348 330 330 348 348 348 367 349 349 368 330 330 348 349 349 368 331 331 349 331 331 349 349 349 368 350 350 369 331 331 349 350 350 369 332 332 350 332 332 350 350 350 369 351 351 370 332 332 350 351 351 370 333 333 351 333 333 351 351 351 370 352 352 371 333 333 351 352 352 371 334 334 352 334 334 352 352 352 371 353 353 372 334 334 352 353 353 372 335 335 353 335 335 353 353 353 372 354 354 373 335 335 353 354 354 373 336 336 354 336 336 354 354 354 373 355 355 374 336 336 354 355 355 374 337 337 355 337 337 355 355 355 374 356 356 375 337 337 355 356 356 375 338 338 356 338 338 356 356 356 375 357 357 376 338 338 356 357 357 376 339 339 357 339 339 357 357 357 376 358 358 377 339 339 357 358 358 377 340 340 358 340 340 358 358 358 377 359 359 378 340 340 358 359 359 378 341 341 359 341 341 359 359 359 378 342 342 379 341 341 359 342 342 379 324 324 360 342 342 361 360 360 380 361 361 381 342 342 361 361 361 381 343 343 362 343 343 362 361 361 381 362 362 382 343 343 362 362 362 382 344 344 363 344 344 363 362 362 382 363 363 383 344 344 363 363 363 383 345 345 364 345 345 364 363 363 383 364 364 384 345 345 364 364 364 384 346 346 365 346 346 365 364 364 384 365 365 385 346 346 365 365 365 385 347 347 366 347 347 366 365 365 385 366 366 386 347 347 366 366 366 386 348 348 367 348 348 367 366 366 386 367 367 387 348 348 367 367 367 387 349 349 368 349 349 368 367 367 387 368 368 388 349 349 368 368 368 388 350 350 369 350 350 369 368 368 388 369 369 389 350 350 369 369 369 389 351 351 370 351 351 370 369 369 389 370 370 390 351 351 370 370 370 390 352 352 371 352 352 371 370 370 390 371 371 391 352 352 371 371 371 391 353 353 372 353 353 372 371 371 391 372 372 392 353 353 372 372 372 392 354 354 373 354 354 373 372 372 392 373 373 393 354 354 373 373 373 393 355 355 374 355 355 374 373 373 393 374 374 394 355 355 374 374 374 394 356 356 375 356 356 375 374 374 394 375 375 395 356 356 375 375 375 395 357 357 376 357 357 376 375 375 395 376 376 396 357 357 376 376 376 396 358 358 377 358 358 377 376 376 396 377 377 397 358 358 377 377 377 397 359 359 378 359 359 378 377 377 397 360 360 398 359 359 378 360 360 398 342 342 379 360 360 380 378 378 399 379 379 400 360 360 380 379 379 400 361 361 381 361 361 381 379 379 400 380 380 401 361 361 381 380 380 401 362 362 382 362 362 382 380 380 401 381 381 402 362 362 382 381 381 402 363 363 383 363 363 383 381 381 402 382 382 403 363 363 383 382 382 403 364 364 384 364 364 384 382 382 403 383 383 404 364 364 384 383 383 404 365 365 385 365 365 385 383 383 404 384 384 405 365 365 385 384 384 405 366 366 386 366 366 386 384 384 405 385 385 406 366 366 386 385 385 406 367 367 387 367 367 387 385 385 406 386 386 407 367 367 387 386 386 407 368 368 388 368 368 388 386 386 407 387 387 408 368 368 388 387 387 408 369 369 389 369 369 389 387 387 408 388 388 409 369 369 389 388 388 409 370 370 390 370 370 390 388 388 409 389 389 410 370 370 390 389 389 410 371 371 391 371 371 391 389 389 410 390 390 411 371 371 391 390 390 411 372 372 392 372 372 392 390 390 411 391 391 412 372 372 392 391 391 412 373 373 393 373 373 393 391 391 412 392 392 413 373 373 393 392 392 413 374 374 394 374 374 394 392 392 413 393 393 414 374 374 394 393 393 414 375 375 395 375 375 395 393 393 414 394 394 415 375 375 395 394 394 415 376 376 396 376 376 396 394 394 415 395 395 416 376 376 396 395 395 416 377 377 397 377 377 397 395 395 416 378 378 417 377 377 397 378 378 417 360 360 398 378 378 399 396 396 418 397 397 419 378 378 399 397 397 419 379 379 400 379 379 400 397 397 419 398 398 420 379 379 400 398 398 420 380 380 401 380 380 401 398 398 420 399 399 421 380 380 401 399 399 421 381 381 402 381 381 402 399 399 421 400 400 422 381 381 402 400 400 422 382 382 403 382 382 403 400 400 422 401 401 423 382 382 403 401 401 423 383 383 404 383 383 404 401 401 423 402 402 424 383 383 404 402 402 424 384 384 405 384 384 405 402 402 424 403 403 425 384 384 405 403 403 425 385 385 406 385 385 406 403 403 425 404 404 426 385 385 406 404 404 426 386 386 407 386 386 407 404 404 426 405 405 427 386 386 407 405 405 427 387 387 408 387 387 408 405 405 427 406 406 428 387 387 408 406 406 428 388 388 409 388 388 409 406 406 428 407 407 429 388 388 409 407 407 429 389 389 410 389 389 410 407 407 429 408 408 430 389 389 410 408 408 430 390 390 411 390 390 411 408 408 430 409 409 431 390 390 411 409 409 431 391 391 412 391 391 412 409 409 431 410 410 432 391 391 412 410 410 432 392 392 413 392 392 413 410 410 432 411 411 433 392 392 413 411 411 433 393 393 414 393 393 414 411 411 433 412 412 434 393 393 414 412 412 434 394 394 415 394 394 415 412 412 434 413 413 435 394 394 415 413 413 435 395 395 416 395 395 416 413 413 435 396 396 436 395 395 416 396 396 436 378 378 417 396 396 418 414 414 437 415 415 438 396 396 418 415 415 438 397 397 419 397 397 419 415 415 438 416 416 439 397 397 419 416 416 439 398 398 420 398 398 420 416 416 439 417 417 440 398 398 420 417 417 440 399 399 421 399 399 421 417 417 440 418 418 441 399 399 421 418 418 441 400 400 422 400 400 422 418 418 441 419 419 442 400 400 422 419 419 442 401 401 423 401 401 423 419 419 442 420 420 443 401 401 423 420 420 443 402 402 424 402 402 424 420 420 443 421 421 444 402 402 424 421 421 444 403 403 425 403 403 425 421 421 444 422 422 445 403 403 425 422 422 445 404 404 426 404 404 426 422 422 445 423 423 446 404 404 426 423 423 446 405 405 427 405 405 427 423 423 446 424 424 447 405 405 427 424 424 447 406 406 428 406 406 428 424 424 447 425 425 448 406 406 428 425 425 448 407 407 429 407 407 429 425 425 448 426 426 449 407 407 429 426 426 449 408 408 430 408 408 430 426 426 449 427 427 450 408 408 430 427 427 450 409 409 431 409 409 431 427 427 450 428 428 451 409 409 431 428 428 451 410 410 432 410 410 432 428 428 451 429 429 452 410 410 432 429 429 452 411 411 433 411 411 433 429 429 452 430 430 453 411 411 433 430 430 453 412 412 434 412 412 434 430 430 453 431 431 454 412 412 434 431 431 454 413 413 435 413 413 435 431 431 454 414 414 455 413 413 435 414 414 455 396 396 436 414 414 437 432 432 456 433 433 457 414 414 437 433 433 457 415 415 438 415 415 438 433 433 457 434 434 458 415 415 438 434 434 458 416 416 439 416 416 439 434 434 458 435 435 459 416 416 439 435 435 459 417 417 440 417 417 440 435 435 459 436 436 460 417 417 440 436 436 460 418 418 441 418 418 441 436 436 460 437 437 461 418 418 441 437 437 461 419 419 442 419 419 442 437 437 461 438 438 462 419 419 442 438 438 462 420 420 443 420 420 443 438 438 462 439 439 463 420 420 443 439 439 463 421 421 444 421 421 444 439 439 463 440 440 464 421 421 444 440 440 464 422 422 445 422 422 445 440 440 464 441 441 465 422 422 445 441 441 465 423 423 446 423 423 446 441 441 465 442 442 466 423 423 446 442 442 466 424 424 447 424 424 447 442 442 466 443 443 467 424 424 447 443 443 467 425 425 448 425 425 448 443 443 467 444 444 468 425 425 448 444 444 468 426 426 449 426 426 449 444 444 468 445 445 469 426 426 449 445 445 469 427 427 450 427 427 450 445 445 469 446 446 470 427 427 450 446 446 470 428 428 451 428 428 451 446 446 470 447 447 471 428 428 451 447 447 471 429 429 452 429 429 452 447 447 471 448 448 472 429 429 452 448 448 472 430 430 453 430 430 453 448 448 472 449 449 473 430 430 453 449 449 473 431 431 454 431 431 454 449 449 473 432 432 474 431 431 454 432 432 474 414 414 455 432 432 456 450 450 475 451 451 476 432 432 456 451 451 476 433 433 457 433 433 457 451 451 476 452 452 477 433 433 457 452 452 477 434 434 458 434 434 458 452 452 477 453 453 478 434 434 458 453 453 478 435 435 459 435 435 459 453 453 478 454 454 479 435 435 459 454 454 479 436 436 460 436 436 460 454 454 479 455 455 480 436 436 460 455 455 480 437 437 461 437 437 461 455 455 480 456 456 481 437 437 461 456 456 481 438 438 462 438 438 462 456 456 481 457 457 482 438 438 462 457 457 482 439 439 463 439 439 463 457 457 482 458 458 483 439 439 463 458 458 483 440 440 464 440 440 464 458 458 483 459 459 484 440 440 464 459 459 484 441 441 465 441 441 465 459 459 484 460 460 485 441 441 465 460 460 485 442 442 466 442 442 466 460 460 485 461 461 486 442 442 466 461 461 486 443 443 467 443 443 467 461 461 486 462 462 487 443 443 467 462 462 487 444 444 468 444 444 468 462 462 487 463 463 488 444 444 468 463 463 488 445 445 469 445 445 469 463 463 488 464 464 489 445 445 469 464 464 489 446 446 470 446 446 470 464 464 489 465 465 490 446 446 470 465 465 490 447 447 471 447 447 471 465 465 490 466 466 491 447 447 471 466 466 491 448 448 472 448 448 472 466 466 491 467 467 492 448 448 472 467 467 492 449 449 473 449 449 473 467 467 492 450 450 493 449 449 473 450 450 493 432 432 474 450 450 475 468 468 494 469 469 495 450 450 475 469 469 495 451 451 476 451 451 476 469 469 495 470 470 496 451 451 476 470 470 496 452 452 477 452 452 477 470 470 496 471 471 497 452 452 477 471 471 497 453 453 478 453 453 478 471 471 497 472 472 498 453 453 478 472 472 498 454 454 479 454 454 479 472 472 498 473 473 499 454 454 479 473 473 499 455 455 480 455 455 480 473 473 499 474 474 500 455 455 480 474 474 500 456 456 481 456 456 481 474 474 500 475 475 501 456 456 481 475 475 501 457 457 482 457 457 482 475 475 501 476 476 502 457 457 482 476 476 502 458 458 483 458 458 483 476 476 502 477 477 503 458 458 483 477 477 503 459 459 484 459 459 484 477 477 503 478 478 504 459 459 484 478 478 504 460 460 485 460 460 485 478 478 504 479 479 505 460 460 485 479 479 505 461 461 486 461 461 486 479 479 505 480 480 506 461 461 486 480 480 506 462 462 487 462 462 487 480 480 506 481 481 507 462 462 487 481 481 507 463 463 488 463 463 488 481 481 507 482 482 508 463 463 488 482 482 508 464 464 489 464 464 489 482 482 508 483 483 509 464 464 489 483 483 509 465 465 490 465 465 490 483 483 509 484 484 510 465 465 490 484 484 510 466 466 491 466 466 491 484 484 510 485 485 511 466 466 491 485 485 511 467 467 492 467 467 492 485 485 511 468 468 512 467 467 492 468 468 512 450 450 493 468 468 494 486 486 513 487 487 514 468 468 494 487 487 514 469 469 495 469 469 495 487 487 514 488 488 515 469 469 495 488 488 515 470 470 496 470 470 496 488 488 515 489 489 516 470 470 496 489 489 516 471 471 497 471 471 497 489 489 516 490 490 517 471 471 497 490 490 517 472 472 498 472 472 498 490 490 517 491 491 518 472 472 498 491 491 518 473 473 499 473 473 499 491 491 518 492 492 519 473 473 499 492 492 519 474 474 500 474 474 500 492 492 519 493 493 520 474 474 500 493 493 520 475 475 501 475 475 501 493 493 520 494 494 521 475 475 501 494 494 521 476 476 502 476 476 502 494 494 521 495 495 522 476 476 502 495 495 522 477 477 503 477 477 503 495 495 522 496 496 523 477 477 503 496 496 523 478 478 504 478 478 504 496 496 523 497 497 524 478 478 504 497 497 524 479 479 505 479 479 505 497 497 524 498 498 525 479 479 505 498 498 525 480 480 506 480 480 506 498 498 525 499 499 526 480 480 506 499 499 526 481 481 507 481 481 507 499 499 526 500 500 527 481 481 507 500 500 527 482 482 508 482 482 508 500 500 527 501 501 528 482 482 508 501 501 528 483 483 509 483 483 509 501 501 528 502 502 529 483 483 509 502 502 529 484 484 510 484 484 510 502 502 529 503 503 530 484 484 510 503 503 530 485 485 511 485 485 511 503 503 530 486 486 531 485 485 511 486 486 531 468 468 512 486 486 513 504 504 532 505 505 533 486 486 513 505 505 533 487 487 514 487 487 514 505 505 533 506 506 534 487 487 514 506 506 534 488 488 515 488 488 515 506 506 534 507 507 535 488 488 515 507 507 535 489 489 516 489 489 516 507 507 535 508 508 536 489 489 516 508 508 536 490 490 517 490 490 517 508 508 536 509 509 537 490 490 517 509 509 537 491 491 518 491 491 518 509 509 537 510 510 538 491 491 518 510 510 538 492 492 519 492 492 519 510 510 538 511 511 539 492 492 519 511 511 539 493 493 520 493 493 520 511 511 539 512 512 540 493 493 520 512 512 540 494 494 521 494 494 521 512 512 540 513 513 541 494 494 521 513 513 541 495 495 522 495 495 522 513 513 541 514 514 542 495 495 522 514 514 542 496 496 523 496 496 523 514 514 542 515 515 543 496 496 523 515 515 543 497 497 524 497 497 524 515 515 543 516 516 544 497 497 524 516 516 544 498 498 525 498 498 525 516 516 544 517 517 545 498 498 525 517 517 545 499 499 526 499 499 526 517 517 545 518 518 546 499 499 526 518 518 546 500 500 527 500 500 527 518 518 546 519 519 547 500 500 527 519 519 547 501 501 528 501 501 528 519 519 547 520 520 548 501 501 528 520 520 548 502 502 529 502 502 529 520 520 548 521 521 549 502 502 529 521 521 549 503 503 530 503 503 530 521 521 549 504 504 550 503 503 530 504 504 550 486 486 531 504 504 532 522 522 551 523 523 552 504 504 532 523 523 552 505 505 533 505 505 533 523 523 552 524 524 553 505 505 533 524 524 553 506 506 534 506 506 534 524 524 553 525 525 554 506 506 534 525 525 554 507 507 535 507 507 535 525 525 554 526 526 555 507 507 535 526 526 555 508 508 536 508 508 536 526 526 555 527 527 556 508 508 536 527 527 556 509 509 537 509 509 537 527 527 556 528 528 557 509 509 537 528 528 557 510 510 538 510 510 538 528 528 557 529 529 558 510 510 538 529 529 558 511 511 539 511 511 539 529 529 558 530 530 559 511 511 539 530 530 559 512 512 540 512 512 540 530 530 559 531 531 560 512 512 540 531 531 560 513 513 541 513 513 541 531 531 560 532 532 561 513 513 541 532 532 561 514 514 542 514 514 542 532 532 561 533 533 562 514 514 542 533 533 562 515 515 543 515 515 543 533 533 562 534 534 563 515 515 543 534 534 563 516 516 544 516 516 544 534 534 563 535 535 564 516 516 544 535 535 564 517 517 545 517 517 545 535 535 564 536 536 565 517 517 545 536 536 565 518 518 546 518 518 546 536 536 565 537 537 566 518 518 546 537 537 566 519 519 547 519 519 547 537 537 566 538 538 567 519 519 547 538 538 567 520 520 548 520 520 548 538 538 567 539 539 568 520 520 548 539 539 568 521 521 549 521 521 549 539 539 568 522 522 569 521 521 549 522 522 569 504 504 550 522 522 551 540 540 570 541 541 571 522 522 551 541 541 571 523 523 552 523 523 552 541 541 571 542 542 572 523 523 552 542 542 572 524 524 553 524 524 553 542 542 572 543 543 573 524 524 553 543 543 573 525 525 554 525 525 554 543 543 573 544 544 574 525 525 554 544 544 574 526 526 555 526 526 555 544 544 574 545 545 575 526 526 555 545 545 575 527 527 556 527 527 556 545 545 575 546 546 576 527 527 556 546 546 576 528 528 557 528 528 557 546 546 576 547 547 577 528 528 557 547 547 577 529 529 558 529 529 558 547 547 577 548 548 578 529 529 558 548 548 578 530 530 559 530 530 559 548 548 578 549 549 579 530 530 559 549 549 579 531 531 560 531 531 560 549 549 579 550 550 580 531 531 560 550 550 580 532 532 561 532 532 561 550 550 580 551 551 581 532 532 561 551 551 581 533 533 562 533 533 562 551 551 581 552 552 582 533 533 562 552 552 582 534 534 563 534 534 563 552 552 582 553 553 583 534 534 563 553 553 583 535 535 564 535 535 564 553 553 583 554 554 584 535 535 564 554 554 584 536 536 565 536 536 565 554 554 584 555 555 585 536 536 565 555 555 585 537 537 566 537 537 566 555 555 585 556 556 586 537 537 566 556 556 586 538 538 567 538 538 567 556 556 586 557 557 587 538 538 567 557 557 587 539 539 568 539 539 568 557 557 587 540 540 588 539 539 568 540 540 588 522 522 569 540 540 570 558 558 589 559 559 590 540 540 570 559 559 590 541 541 571 541 541 571 559 559 590 560 560 591 541 541 571 560 560 591 542 542 572 542 542 572 560 560 591 561 561 592 542 542 572 561 561 592 543 543 573 543 543 573 561 561 592 562 562 593 543 543 573 562 562 593 544 544 574 544 544 574 562 562 593 563 563 594 544 544 574 563 563 594 545 545 575 545 545 575 563 563 594 564 564 595 545 545 575 564 564 595 546 546 576 546 546 576 564 564 595 565 565 596 546 546 576 565 565 596 547 547 577 547 547 577 565 565 596 566 566 597 547 547 577 566 566 597 548 548 578 548 548 578 566 566 597 567 567 598 548 548 578 567 567 598 549 549 579 549 549 579 567 567 598 568 568 599 549 549 579 568 568 599 550 550 580 550 550 580 568 568 599 569 569 600 550 550 580 569 569 600 551 551 581 551 551 581 569 569 600 570 570 601 551 551 581 570 570 601 552 552 582 552 552 582 570 570 601 571 571 602 552 552 582 571 571 602 553 553 583 553 553 583 571 571 602 572 572 603 553 553 583 572 572 603 554 554 584 554 554 584 572 572 603 573 573 604 554 554 584 573 573 604 555 555 585 555 555 585 573 573 604 574 574 605 555 555 585 574 574 605 556 556 586 556 556 586 574 574 605 575 575 606 556 556 586 575 575 606 557 557 587 557 557 587 575 575 606 558 558 607 557 557 587 558 558 607 540 540 588 558 558 589 576 576 608 577 577 609 558 558 589 577 577 609 559 559 590 559 559 590 577 577 609 578 578 610 559 559 590 578 578 610 560 560 591 560 560 591 578 578 610 579 579 611 560 560 591 579 579 611 561 561 592 561 561 592 579 579 611 580 580 612 561 561 592 580 580 612 562 562 593 562 562 593 580 580 612 581 581 613 562 562 593 581 581 613 563 563 594 563 563 594 581 581 613 582 582 614 563 563 594 582 582 614 564 564 595 564 564 595 582 582 614 583 583 615 564 564 595 583 583 615 565 565 596 565 565 596 583 583 615 584 584 616 565 565 596 584 584 616 566 566 597 566 566 597 584 584 616 585 585 617 566 566 597 585 585 617 567 567 598 567 567 598 585 585 617 586 586 618 567 567 598 586 586 618 568 568 599 568 568 599 586 586 618 587 587 619 568 568 599 587 587 619 569 569 600 569 569 600 587 587 619 588 588 620 569 569 600 588 588 620 570 570 601 570 570 601 588 588 620 589 589 621 570 570 601 589 589 621 571 571 602 571 571 602 589 589 621 590 590 622 571 571 602 590 590 622 572 572 603 572 572 603 590 590 622 591 591 623 572 572 603 591 591 623 573 573 604 573 573 604 591 591 623 592 592 624 573 573 604 592 592 624 574 574 605 574 574 605 592 592 624 593 593 625 574 574 605 593 593 625 575 575 606 575 575 606 593 593 625 576 576 626 575 575 606 576 576 626 558 558 607 576 576 608 594 594 627 595 595 628 576 576 608 595 595 628 577 577 609 577 577 609 595 595 628 596 596 629 577 577 609 596 596 629 578 578 610 578 578 610 596 596 629 597 597 630 578 578 610 597 597 630 579 579 611 579 579 611 597 597 630 598 598 631 579 579 611 598 598 631 580 580 612 580 580 612 598 598 631 599 599 632 580 580 612 599 599 632 581 581 613 581 581 613 599 599 632 600 600 633 581 581 613 600 600 633 582 582 614 582 582 614 600 600 633 601 601 634 582 582 614 601 601 634 583 583 615 583 583 615 601 601 634 602 602 635 583 583 615 602 602 635 584 584 616 584 584 616 602 602 635 603 603 636 584 584 616 603 603 636 585 585 617 585 585 617 603 603 636 604 604 637 585 585 617 604 604 637 586 586 618 586 586 618 604 604 637 605 605 638 586 586 618 605 605 638 587 587 619 587 587 619 605 605 638 606 606 639 587 587 619 606 606 639 588 588 620 588 588 620 606 606 639 607 607 640 588 588 620 607 607 640 589 589 621 589 589 621 607 607 640 608 608 641 589 589 621 608 608 641 590 590 622 590 590 622 608 608 641 609 609 642 590 590 622 609 609 642 591 591 623 591 591 623 609 609 642 610 610 643 591 591 623 610 610 643 592 592 624 592 592 624 610 610 643 611 611 644 592 592 624 611 611 644 593 593 625 593 593 625 611 611 644 594 594 645 593 593 625 594 594 645 576 576 626 594 594 627 612 612 646 613 613 647 594 594 627 613 613 647 595 595 628 595 595 628 613 613 647 614 614 648 595 595 628 614 614 648 596 596 629 596 596 629 614 614 648 615 615 649 596 596 629 615 615 649 597 597 630 597 597 630 615 615 649 616 616 650 597 597 630 616 616 650 598 598 631 598 598 631 616 616 650 617 617 651 598 598 631 617 617 651 599 599 632 599 599 632 617 617 651 618 618 652 599 599 632 618 618 652 600 600 633 600 600 633 618 618 652 619 619 653 600 600 633 619 619 653 601 601 634 601 601 634 619 619 653 620 620 654 601 601 634 620 620 654 602 602 635 602 602 635 620 620 654 621 621 655 602 602 635 621 621 655 603 603 636 603 603 636 621 621 655 622 622 656 603 603 636 622 622 656 604 604 637 604 604 637 622 622 656 623 623 657 604 604 637 623 623 657 605 605 638 605 605 638 623 623 657 624 624 658 605 605 638 624 624 658 606 606 639 606 606 639 624 624 658 625 625 659 606 606 639 625 625 659 607 607 640 607 607 640 625 625 659 626 626 660 607 607 640 626 626 660 608 608 641 608 608 641 626 626 660 627 627 661 608 608 641 627 627 661 609 609 642 609 609 642 627 627 661 628 628 662 609 609 642 628 628 662 610 610 643 610 610 643 628 628 662 629 629 663 610 610 643 629 629 663 611 611 644 611 611 644 629 629 663 612 612 664 611 611 644 612 612 664 594 594 645 612 612 646 630 630 665 631 631 666 612 612 646 631 631 666 613 613 647 613 613 647 631 631 666 632 632 667 613 613 647 632 632 667 614 614 648 614 614 648 632 632 667 633 633 668 614 614 648 633 633 668 615 615 649 615 615 649 633 633 668 634 634 669 615 615 649 634 634 669 616 616 650 616 616 650 634 634 669 635 635 670 616 616 650 635 635 670 617 617 651 617 617 651 635 635 670 636 636 671 617 617 651 636 636 671 618 618 652 618 618 652 636 636 671 637 637 672 618 618 652 637 637 672 619 619 653 619 619 653 637 637 672 638 638 673 619 619 653 638 638 673 620 620 654 620 620 654 638 638 673 639 639 674 620 620 654 639 639 674 621 621 655 621 621 655 639 639 674 640 640 675 621 621 655 640 640 675 622 622 656 622 622 656 640 640 675 641 641 676 622 622 656 641 641 676 623 623 657 623 623 657 641 641 676 642 642 677 623 623 657 642 642 677 624 624 658 624 624 658 642 642 677 643 643 678 624 624 658 643 643 678 625 625 659 625 625 659 643 643 678 644 644 679 625 625 659 644 644 679 626 626 660 626 626 660 644 644 679 645 645 680 626 626 660 645 645 680 627 627 661 627 627 661 645 645 680 646 646 681 627 627 661 646 646 681 628 628 662 628 628 662 646 646 681 647 647 682 628 628 662 647 647 682 629 629 663 629 629 663 647 647 682 630 630 683 629 629 663 630 630 683 612 612 664 630 630 665 648 648 684 649 649 685 630 630 665 649 649 685 631 631 666 631 631 666 649 649 685 650 650 686 631 631 666 650 650 686 632 632 667 632 632 667 650 650 686 651 651 687 632 632 667 651 651 687 633 633 668 633 633 668 651 651 687 652 652 688 633 633 668 652 652 688 634 634 669 634 634 669 652 652 688 653 653 689 634 634 669 653 653 689 635 635 670 635 635 670 653 653 689 654 654 690 635 635 670 654 654 690 636 636 671 636 636 671 654 654 690 655 655 691 636 636 671 655 655 691 637 637 672 637 637 672 655 655 691 656 656 692 637 637 672 656 656 692 638 638 673 638 638 673 656 656 692 657 657 693 638 638 673 657 657 693 639 639 674 639 639 674 657 657 693 658 658 694 639 639 674 658 658 694 640 640 675 640 640 675 658 658 694 659 659 695 640 640 675 659 659 695 641 641 676 641 641 676 659 659 695 660 660 696 641 641 676 660 660 696 642 642 677 642 642 677 660 660 696 661 661 697 642 642 677 661 661 697 643 643 678 643 643 678 661 661 697 662 662 698 643 643 678 662 662 698 644 644 679 644 644 679 662 662 698 663 663 699 644 644 679 663 663 699 645 645 680 645 645 680 663 663 699 664 664 700 645 645 680 664 664 700 646 646 681 646 646 681 664 664 700 665 665 701 646 646 681 665 665 701 647 647 682 647 647 682 665 665 701 648 648 702 647 647 682 648 648 702 630 630 683 648 648 684 666 666 703 667 667 704 648 648 684 667 667 704 649 649 685 649 649 685 667 667 704 668 668 705 649 649 685 668 668 705 650 650 686 650 650 686 668 668 705 669 669 706 650 650 686 669 669 706 651 651 687 651 651 687 669 669 706 670 670 707 651 651 687 670 670 707 652 652 688 652 652 688 670 670 707 671 671 708 652 652 688 671 671 708 653 653 689 653 653 689 671 671 708 672 672 709 653 653 689 672 672 709 654 654 690 654 654 690 672 672 709 673 673 710 654 654 690 673 673 710 655 655 691 655 655 691 673 673 710 674 674 711 655 655 691 674 674 711 656 656 692 656 656 692 674 674 711 675 675 712 656 656 692 675 675 712 657 657 693 657 657 693 675 675 712 676 676 713 657 657 693 676 676 713 658 658 694 658 658 694 676 676 713 677 677 714 658 658 694 677 677 714 659 659 695 659 659 695 677 677 714 678 678 715 659 659 695 678 678 715 660 660 696 660 660 696 678 678 715 679 679 716 660 660 696 679 679 716 661 661 697 661 661 697 679 679 716 680 680 717 661 661 697 680 680 717 662 662 698 662 662 698 680 680 717 681 681 718 662 662 698 681 681 718 663 663 699 663 663 699 681 681 718 682 682 719 663 663 699 682 682 719 664 664 700 664 664 700 682 682 719 683 683 720 664 664 700 683 683 720 665 665 701 665 665 701 683 683 720 666 666 721 665 665 701 666 666 721 648 648 702 666 666 703 684 684 722 685 685 723 666 666 703 685 685 723 667 667 704 667 667 704 685 685 723 686 686 724 667 667 704 686 686 724 668 668 705 668 668 705 686 686 724 687 687 725 668 668 705 687 687 725 669 669 706 669 669 706 687 687 725 688 688 726 669 669 706 688 688 726 670 670 707 670 670 707 688 688 726 689 689 727 670 670 707 689 689 727 671 671 708 671 671 708 689 689 727 690 690 728 671 671 708 690 690 728 672 672 709 672 672 709 690 690 728 691 691 729 672 672 709 691 691 729 673 673 710 673 673 710 691 691 729 692 692 730 673 673 710 692 692 730 674 674 711 674 674 711 692 692 730 693 693 731 674 674 711 693 693 731 675 675 712 675 675 712 693 693 731 694 694 732 675 675 712 694 694 732 676 676 713 676 676 713 694 694 732 695 695 733 676 676 713 695 695 733 677 677 714 677 677 714 695 695 733 696 696 734 677 677 714 696 696 734 678 678 715 678 678 715 696 696 734 697 697 735 678 678 715 697 697 735 679 679 716 679 679 716 697 697 735 698 698 736 679 679 716 698 698 736 680 680 717 680 680 717 698 698 736 699 699 737 680 680 717 699 699 737 681 681 718 681 681 718 699 699 737 700 700 738 681 681 718 700 700 738 682 682 719 682 682 719 700 700 738 701 701 739 682 682 719 701 701 739 683 683 720 683 683 720 701 701 739 684 684 740 683 683 720 684 684 740 666 666 721 684 684 722 702 702 741 703 703 742 684 684 722 703 703 742 685 685 723 685 685 723 703 703 742 704 704 743 685 685 723 704 704 743 686 686 724 686 686 724 704 704 743 705 705 744 686 686 724 705 705 744 687 687 725 687 687 725 705 705 744 706 706 745 687 687 725 706 706 745 688 688 726 688 688 726 706 706 745 707 707 746 688 688 726 707 707 746 689 689 727 689 689 727 707 707 746 708 708 747 689 689 727 708 708 747 690 690 728 690 690 728 708 708 747 709 709 748 690 690 728 709 709 748 691 691 729 691 691 729 709 709 748 710 710 749 691 691 729 710 710 749 692 692 730 692 692 730 710 710 749 711 711 750 692 692 730 711 711 750 693 693 731 693 693 731 711 711 750 712 712 751 693 693 731 712 712 751 694 694 732 694 694 732 712 712 751 713 713 752 694 694 732 713 713 752 695 695 733 695 695 733 713 713 752 714 714 753 695 695 733 714 714 753 696 696 734 696 696 734 714 714 753 715 715 754 696 696 734 715 715 754 697 697 735 697 697 735 715 715 754 716 716 755 697 697 735 716 716 755 698 698 736 698 698 736 716 716 755 717 717 756 698 698 736 717 717 756 699 699 737 699 699 737 717 717 756 718 718 757 699 699 737 718 718 757 700 700 738 700 700 738 718 718 757 719 719 758 700 700 738 719 719 758 701 701 739 701 701 739 719 719 758 702 702 759 701 701 739 702 702 759 684 684 740 702 702 741 720 720 760 721 721 761 702 702 741 721 721 761 703 703 742 703 703 742 721 721 761 722 722 762 703 703 742 722 722 762 704 704 743 704 704 743 722 722 762 723 723 763 704 704 743 723 723 763 705 705 744 705 705 744 723 723 763 724 724 764 705 705 744 724 724 764 706 706 745 706 706 745 724 724 764 725 725 765 706 706 745 725 725 765 707 707 746 707 707 746 725 725 765 726 726 766 707 707 746 726 726 766 708 708 747 708 708 747 726 726 766 727 727 767 708 708 747 727 727 767 709 709 748 709 709 748 727 727 767 728 728 768 709 709 748 728 728 768 710 710 749 710 710 749 728 728 768 729 729 769 710 710 749 729 729 769 711 711 750 711 711 750 729 729 769 730 730 770 711 711 750 730 730 770 712 712 751 712 712 751 730 730 770 731 731 771 712 712 751 731 731 771 713 713 752 713 713 752 731 731 771 732 732 772 713 713 752 732 732 772 714 714 753 714 714 753 732 732 772 733 733 773 714 714 753 733 733 773 715 715 754 715 715 754 733 733 773 734 734 774 715 715 754 734 734 774 716 716 755 716 716 755 734 734 774 735 735 775 716 716 755 735 735 775 717 717 756 717 717 756 735 735 775 736 736 776 717 717 756 736 736 776 718 718 757 718 718 757 736 736 776 737 737 777 718 718 757 737 737 777 719 719 758 719 719 758 737 737 777 720 720 778 719 719 758 720 720 778 702 702 759 720 720 760 738 738 779 739 739 780 720 720 760 739 739 780 721 721 761 721 721 761 739 739 780 740 740 781 721 721 761 740 740 781 722 722 762 722 722 762 740 740 781 741 741 782 722 722 762 741 741 782 723 723 763 723 723 763 741 741 782 742 742 783 723 723 763 742 742 783 724 724 764 724 724 764 742 742 783 743 743 784 724 724 764 743 743 784 725 725 765 725 725 765 743 743 784 744 744 785 725 725 765 744 744 785 726 726 766 726 726 766 744 744 785 745 745 786 726 726 766 745 745 786 727 727 767 727 727 767 745 745 786 746 746 787 727 727 767 746 746 787 728 728 768 728 728 768 746 746 787 747 747 788 728 728 768 747 747 788 729 729 769 729 729 769 747 747 788 748 748 789 729 729 769 748 748 789 730 730 770 730 730 770 748 748 789 749 749 790 730 730 770 749 749 790 731 731 771 731 731 771 749 749 790 750 750 791 731 731 771 750 750 791 732 732 772 732 732 772 750 750 791 751 751 792 732 732 772 751 751 792 733 733 773 733 733 773 751 751 792 752 752 793 733 733 773 752 752 793 734 734 774 734 734 774 752 752 793 753 753 794 734 734 774 753 753 794 735 735 775 735 735 775 753 753 794 754 754 795 735 735 775 754 754 795 736 736 776 736 736 776 754 754 795 755 755 796 736 736 776 755 755 796 737 737 777 737 737 777 755 755 796 738 738 797 737 737 777 738 738 797 720 720 778 738 738 779 756 756 798 757 757 799 738 738 779 757 757 799 739 739 780 739 739 780 757 757 799 758 758 800 739 739 780 758 758 800 740 740 781 740 740 781 758 758 800 759 759 801 740 740 781 759 759 801 741 741 782 741 741 782 759 759 801 760 760 802 741 741 782 760 760 802 742 742 783 742 742 783 760 760 802 761 761 803 742 742 783 761 761 803 743 743 784 743 743 784 761 761 803 762 762 804 743 743 784 762 762 804 744 744 785 744 744 785 762 762 804 763 763 805 744 744 785 763 763 805 745 745 786 745 745 786 763 763 805 764 764 806 745 745 786 764 764 806 746 746 787 746 746 787 764 764 806 765 765 807 746 746 787 765 765 807 747 747 788 747 747 788 765 765 807 766 766 808 747 747 788 766 766 808 748 748 789 748 748 789 766 766 808 767 767 809 748 748 789 767 767 809 749 749 790 749 749 790 767 767 809 768 768 810 749 749 790 768 768 810 750 750 791 750 750 791 768 768 810 769 769 811 750 750 791 769 769 811 751 751 792 751 751 792 769 769 811 770 770 812 751 751 792 770 770 812 752 752 793 752 752 793 770 770 812 771 771 813 752 752 793 771 771 813 753 753 794 753 753 794 771 771 813 772 772 814 753 753 794 772 772 814 754 754 795 754 754 795 772 772 814 773 773 815 754 754 795 773 773 815 755 755 796 755 755 796 773 773 815 756 756 816 755 755 796 756 756 816 738 738 797 756 756 798 774 774 817 775 775 818 756 756 798 775 775 818 757 757 799 757 757 799 775 775 818 776 776 819 757 757 799 776 776 819 758 758 800 758 758 800 776 776 819 777 777 820 758 758 800 777 777 820 759 759 801 759 759 801 777 777 820 778 778 821 759 759 801 778 778 821 760 760 802 760 760 802 778 778 821 779 779 822 760 760 802 779 779 822 761 761 803 761 761 803 779 779 822 780 780 823 761 761 803 780 780 823 762 762 804 762 762 804 780 780 823 781 781 824 762 762 804 781 781 824 763 763 805 763 763 805 781 781 824 782 782 825 763 763 805 782 782 825 764 764 806 764 764 806 782 782 825 783 783 826 764 764 806 783 783 826 765 765 807 765 765 807 783 783 826 784 784 827 765 765 807 784 784 827 766 766 808 766 766 808 784 784 827 785 785 828 766 766 808 785 785 828 767 767 809 767 767 809 785 785 828 786 786 829 767 767 809 786 786 829 768 768 810 768 768 810 786 786 829 787 787 830 768 768 810 787 787 830 769 769 811 769 769 811 787 787 830 788 788 831 769 769 811 788 788 831 770 770 812 770 770 812 788 788 831 789 789 832 770 770 812 789 789 832 771 771 813 771 771 813 789 789 832 790 790 833 771 771 813 790 790 833 772 772 814 772 772 814 790 790 833 791 791 834 772 772 814 791 791 834 773 773 815 773 773 815 791 791 834 774 774 835 773 773 815 774 774 835 756 756 816 774 774 817 792 792 836 793 793 837 774 774 817 793 793 837 775 775 818 775 775 818 793 793 837 794 794 838 775 775 818 794 794 838 776 776 819 776 776 819 794 794 838 795 795 839 776 776 819 795 795 839 777 777 820 777 777 820 795 795 839 796 796 840 777 777 820 796 796 840 778 778 821 778 778 821 796 796 840 797 797 841 778 778 821 797 797 841 779 779 822 779 779 822 797 797 841 798 798 842 779 779 822 798 798 842 780 780 823 780 780 823 798 798 842 799 799 843 780 780 823 799 799 843 781 781 824 781 781 824 799 799 843 800 800 844 781 781 824 800 800 844 782 782 825 782 782 825 800 800 844 801 801 845 782 782 825 801 801 845 783 783 826 783 783 826 801 801 845 802 802 846 783 783 826 802 802 846 784 784 827 784 784 827 802 802 846 803 803 847 784 784 827 803 803 847 785 785 828 785 785 828 803 803 847 804 804 848 785 785 828 804 804 848 786 786 829 786 786 829 804 804 848 805 805 849 786 786 829 805 805 849 787 787 830 787 787 830 805 805 849 806 806 850 787 787 830 806 806 850 788 788 831 788 788 831 806 806 850 807 807 851 788 788 831 807 807 851 789 789 832 789 789 832 807 807 851 808 808 852 789 789 832 808 808 852 790 790 833 790 790 833 808 808 852 809 809 853 790 790 833 809 809 853 791 791 834 791 791 834 809 809 853 792 792 854 791 791 834 792 792 854 774 774 835 792 792 836 810 810 855 811 811 856 792 792 836 811 811 856 793 793 837 793 793 837 811 811 856 812 812 857 793 793 837 812 812 857 794 794 838 794 794 838 812 812 857 813 813 858 794 794 838 813 813 858 795 795 839 795 795 839 813 813 858 814 814 859 795 795 839 814 814 859 796 796 840 796 796 840 814 814 859 815 815 860 796 796 840 815 815 860 797 797 841 797 797 841 815 815 860 816 816 861 797 797 841 816 816 861 798 798 842 798 798 842 816 816 861 817 817 862 798 798 842 817 817 862 799 799 843 799 799 843 817 817 862 818 818 863 799 799 843 818 818 863 800 800 844 800 800 844 818 818 863 819 819 864 800 800 844 819 819 864 801 801 845 801 801 845 819 819 864 820 820 865 801 801 845 820 820 865 802 802 846 802 802 846 820 820 865 821 821 866 802 802 846 821 821 866 803 803 847 803 803 847 821 821 866 822 822 867 803 803 847 822 822 867 804 804 848 804 804 848 822 822 867 823 823 868 804 804 848 823 823 868 805 805 849 805 805 849 823 823 868 824 824 869 805 805 849 824 824 869 806 806 850 806 806 850 824 824 869 825 825 870 806 806 850 825 825 870 807 807 851 807 807 851 825 825 870 826 826 871 807 807 851 826 826 871 808 808 852 808 808 852 826 826 871 827 827 872 808 808 852 827 827 872 809 809 853 809 809 853 827 827 872 810 810 873 809 809 853 810 810 873 792 792 854 810 810 855 828 828 874 829 829 875 810 810 855 829 829 875 811 811 856 811 811 856 829 829 875 830 830 876 811 811 856 830 830 876 812 812 857 812 812 857 830 830 876 831 831 877 812 812 857 831 831 877 813 813 858 813 813 858 831 831 877 832 832 878 813 813 858 832 832 878 814 814 859 814 814 859 832 832 878 833 833 879 814 814 859 833 833 879 815 815 860 815 815 860 833 833 879 834 834 880 815 815 860 834 834 880 816 816 861 816 816 861 834 834 880 835 835 881 816 816 861 835 835 881 817 817 862 817 817 862 835 835 881 836 836 882 817 817 862 836 836 882 818 818 863 818 818 863 836 836 882 837 837 883 818 818 863 837 837 883 819 819 864 819 819 864 837 837 883 838 838 884 819 819 864 838 838 884 820 820 865 820 820 865 838 838 884 839 839 885 820 820 865 839 839 885 821 821 866 821 821 866 839 839 885 840 840 886 821 821 866 840 840 886 822 822 867 822 822 867 840 840 886 841 841 887 822 822 867 841 841 887 823 823 868 823 823 868 841 841 887 842 842 888 823 823 868 842 842 888 824 824 869 824 824 869 842 842 888 843 843 889 824 824 869 843 843 889 825 825 870 825 825 870 843 843 889 844 844 890 825 825 870 844 844 890 826 826 871 826 826 871 844 844 890 845 845 891 826 826 871 845 845 891 827 827 872 827 827 872 845 845 891 828 828 892 827 827 872 828 828 892 810 810 873 828 828 874 846 846 893 847 847 894 828 828 874 847 847 894 829 829 875 829 829 875 847 847 894 848 848 895 829 829 875 848 848 895 830 830 876 830 830 876 848 848 895 849 849 896 830 830 876 849 849 896 831 831 877 831 831 877 849 849 896 850 850 897 831 831 877 850 850 897 832 832 878 832 832 878 850 850 897 851 851 898 832 832 878 851 851 898 833 833 879 833 833 879 851 851 898 852 852 899 833 833 879 852 852 899 834 834 880 834 834 880 852 852 899 853 853 900 834 834 880 853 853 900 835 835 881 835 835 881 853 853 900 854 854 901 835 835 881 854 854 901 836 836 882 836 836 882 854 854 901 855 855 902 836 836 882 855 855 902 837 837 883 837 837 883 855 855 902 856 856 903 837 837 883 856 856 903 838 838 884 838 838 884 856 856 903 857 857 904 838 838 884 857 857 904 839 839 885 839 839 885 857 857 904 858 858 905 839 839 885 858 858 905 840 840 886 840 840 886 858 858 905 859 859 906 840 840 886 859 859 906 841 841 887 841 841 887 859 859 906 860 860 907 841 841 887 860 860 907 842 842 888 842 842 888 860 860 907 861 861 908 842 842 888 861 861 908 843 843 889 843 843 889 861 861 908 862 862 909 843 843 889 862 862 909 844 844 890 844 844 890 862 862 909 863 863 910 844 844 890 863 863 910 845 845 891 845 845 891 863 863 910 846 846 911 845 845 891 846 846 911 828 828 892 846 846 893 864 864 912 865 865 913 846 846 893 865 865 913 847 847 894 847 847 894 865 865 913 866 866 914 847 847 894 866 866 914 848 848 895 848 848 895 866 866 914 867 867 915 848 848 895 867 867 915 849 849 896 849 849 896 867 867 915 868 868 916 849 849 896 868 868 916 850 850 897 850 850 897 868 868 916 869 869 917 850 850 897 869 869 917 851 851 898 851 851 898 869 869 917 870 870 918 851 851 898 870 870 918 852 852 899 852 852 899 870 870 918 871 871 919 852 852 899 871 871 919 853 853 900 853 853 900 871 871 919 872 872 920 853 853 900 872 872 920 854 854 901 854 854 901 872 872 920 873 873 921 854 854 901 873 873 921 855 855 902 855 855 902 873 873 921 874 874 922 855 855 902 874 874 922 856 856 903 856 856 903 874 874 922 875 875 923 856 856 903 875 875 923 857 857 904 857 857 904 875 875 923 876 876 924 857 857 904 876 876 924 858 858 905 858 858 905 876 876 924 877 877 925 858 858 905 877 877 925 859 859 906 859 859 906 877 877 925 878 878 926 859 859 906 878 878 926 860 860 907 860 860 907 878 878 926 879 879 927 860 860 907 879 879 927 861 861 908 861 861 908 879 879 927 880 880 928 861 861 908 880 880 928 862 862 909 862 862 909 880 880 928 881 881 929 862 862 909 881 881 929 863 863 910 863 863 910 881 881 929 864 864 930 863 863 910 864 864 930 846 846 911 864 864 912 882 882 931 883 883 932 864 864 912 883 883 932 865 865 913 865 865 913 883 883 932 884 884 933 865 865 913 884 884 933 866 866 914 866 866 914 884 884 933 885 885 934 866 866 914 885 885 934 867 867 915 867 867 915 885 885 934 886 886 935 867 867 915 886 886 935 868 868 916 868 868 916 886 886 935 887 887 936 868 868 916 887 887 936 869 869 917 869 869 917 887 887 936 888 888 937 869 869 917 888 888 937 870 870 918 870 870 918 888 888 937 889 889 938 870 870 918 889 889 938 871 871 919 871 871 919 889 889 938 890 890 939 871 871 919 890 890 939 872 872 920 872 872 920 890 890 939 891 891 940 872 872 920 891 891 940 873 873 921 873 873 921 891 891 940 892 892 941 873 873 921 892 892 941 874 874 922 874 874 922 892 892 941 893 893 942 874 874 922 893 893 942 875 875 923 875 875 923 893 893 942 894 894 943 875 875 923 894 894 943 876 876 924 876 876 924 894 894 943 895 895 944 876 876 924 895 895 944 877 877 925 877 877 925 895 895 944 896 896 945 877 877 925 896 896 945 878 878 926 878 878 926 896 896 945 897 897 946 878 878 926 897 897 946 879 879 927 879 879 927 897 897 946 898 898 947 879 879 927 898 898 947 880 880 928 880 880 928 898 898 947 899 899 948 880 880 928 899 899 948 881 881 929 881 881 929 899 899 948 882 882 949 881 881 929 882 882 949 864 864 930 882 882 931 900 900 950 901 901 951 882 882 931 901 901 951 883 883 932 883 883 932 901 901 951 902 902 952 883 883 932 902 902 952 884 884 933 884 884 933 902 902 952 903 903 953 884 884 933 903 903 953 885 885 934 885 885 934 903 903 953 904 904 954 885 885 934 904 904 954 886 886 935 886 886 935 904 904 954 905 905 955 886 886 935 905 905 955 887 887 936 887 887 936 905 905 955 906 906 956 887 887 936 906 906 956 888 888 937 888 888 937 906 906 956 907 907 957 888 888 937 907 907 957 889 889 938 889 889 938 907 907 957 908 908 958 889 889 938 908 908 958 890 890 939 890 890 939 908 908 958 909 909 959 890 890 939 909 909 959 891 891 940 891 891 940 909 909 959 910 910 960 891 891 940 910 910 960 892 892 941 892 892 941 910 910 960 911 911 961 892 892 941 911 911 961 893 893 942 893 893 942 911 911 961 912 912 962 893 893 942 912 912 962 894 894 943 894 894 943 912 912 962 913 913 963 894 894 943 913 913 963 895 895 944 895 895 944 913 913 963 914 914 964 895 895 944 914 914 964 896 896 945 896 896 945 914 914 964 915 915 965 896 896 945 915 915 965 897 897 946 897 897 946 915 915 965 916 916 966 897 897 946 916 916 966 898 898 947 898 898 947 916 916 966 917 917 967 898 898 947 917 917 967 899 899 948 899 899 948 917 917 967 900 900 968 899 899 948 900 900 968 882 882 949 900 900 950 918 918 969 919 919 970 900 900 950 919 919 970 901 901 951 901 901 951 919 919 970 920 920 971 901 901 951 920 920 971 902 902 952 902 902 952 920 920 971 921 921 972 902 902 952 921 921 972 903 903 953 903 903 953 921 921 972 922 922 973 903 903 953 922 922 973 904 904 954 904 904 954 922 922 973 923 923 974 904 904 954 923 923 974 905 905 955 905 905 955 923 923 974 924 924 975 905 905 955 924 924 975 906 906 956 906 906 956 924 924 975 925 925 976 906 906 956 925 925 976 907 907 957 907 907 957 925 925 976 926 926 977 907 907 957 926 926 977 908 908 958 908 908 958 926 926 977 927 927 978 908 908 958 927 927 978 909 909 959 909 909 959 927 927 978 928 928 979 909 909 959 928 928 979 910 910 960 910 910 960 928 928 979 929 929 980 910 910 960 929 929 980 911 911 961 911 911 961 929 929 980 930 930 981 911 911 961 930 930 981 912 912 962 912 912 962 930 930 981 931 931 982 912 912 962 931 931 982 913 913 963 913 913 963 931 931 982 932 932 983 913 913 963 932 932 983 914 914 964 914 914 964 932 932 983 933 933 984 914 914 964 933 933 984 915 915 965 915 915 965 933 933 984 934 934 985 915 915 965 934 934 985 916 916 966 916 916 966 934 934 985 935 935 986 916 916 966 935 935 986 917 917 967 917 917 967 935 935 986 918 918 987 917 917 967 918 918 987 900 900 968 918 918 969 936 936 988 937 937 989 918 918 969 937 937 989 919 919 970 919 919 970 937 937 989 938 938 990 919 919 970 938 938 990 920 920 971 920 920 971 938 938 990 939 939 991 920 920 971 939 939 991 921 921 972 921 921 972 939 939 991 940 940 992 921 921 972 940 940 992 922 922 973 922 922 973 940 940 992 941 941 993 922 922 973 941 941 993 923 923 974 923 923 974 941 941 993 942 942 994 923 923 974 942 942 994 924 924 975 924 924 975 942 942 994 943 943 995 924 924 975 943 943 995 925 925 976 925 925 976 943 943 995 944 944 996 925 925 976 944 944 996 926 926 977 926 926 977 944 944 996 945 945 997 926 926 977 945 945 997 927 927 978 927 927 978 945 945 997 946 946 998 927 927 978 946 946 998 928 928 979 928 928 979 946 946 998 947 947 999 928 928 979 947 947 999 929 929 980 929 929 980 947 947 999 948 948 1000 929 929 980 948 948 1000 930 930 981 930 930 981 948 948 1000 949 949 1001 930 930 981 949 949 1001 931 931 982 931 931 982 949 949 1001 950 950 1002 931 931 982 950 950 1002 932 932 983 932 932 983 950 950 1002 951 951 1003 932 932 983 951 951 1003 933 933 984 933 933 984 951 951 1003 952 952 1004 933 933 984 952 952 1004 934 934 985 934 934 985 952 952 1004 953 953 1005 934 934 985 953 953 1005 935 935 986 935 935 986 953 953 1005 936 936 1006 935 935 986 936 936 1006 918 918 987 936 936 988 954 954 1007 955 955 1008 936 936 988 955 955 1008 937 937 989 937 937 989 955 955 1008 956 956 1009 937 937 989 956 956 1009 938 938 990 938 938 990 956 956 1009 957 957 1010 938 938 990 957 957 1010 939 939 991 939 939 991 957 957 1010 958 958 1011 939 939 991 958 958 1011 940 940 992 940 940 992 958 958 1011 959 959 1012 940 940 992 959 959 1012 941 941 993 941 941 993 959 959 1012 960 960 1013 941 941 993 960 960 1013 942 942 994 942 942 994 960 960 1013 961 961 1014 942 942 994 961 961 1014 943 943 995 943 943 995 961 961 1014 962 962 1015 943 943 995 962 962 1015 944 944 996 944 944 996 962 962 1015 963 963 1016 944 944 996 963 963 1016 945 945 997 945 945 997 963 963 1016 964 964 1017 945 945 997 964 964 1017 946 946 998 946 946 998 964 964 1017 965 965 1018 946 946 998 965 965 1018 947 947 999 947 947 999 965 965 1018 966 966 1019 947 947 999 966 966 1019 948 948 1000 948 948 1000 966 966 1019 967 967 1020 948 948 1000 967 967 1020 949 949 1001 949 949 1001 967 967 1020 968 968 1021 949 949 1001 968 968 1021 950 950 1002 950 950 1002 968 968 1021 969 969 1022 950 950 1002 969 969 1022 951 951 1003 951 951 1003 969 969 1022 970 970 1023 951 951 1003 970 970 1023 952 952 1004 952 952 1004 970 970 1023 971 971 1024 952 952 1004 971 971 1024 953 953 1005 953 953 1005 971 971 1024 954 954 1025 953 953 1005 954 954 1025 936 936 1006 954 954 1007 972 972 1026 973 973 1027 954 954 1007 973 973 1027 955 955 1008 955 955 1008 973 973 1027 974 974 1028 955 955 1008 974 974 1028 956 956 1009 956 956 1009 974 974 1028 975 975 1029 956 956 1009 975 975 1029 957 957 1010 957 957 1010 975 975 1029 976 976 1030 957 957 1010 976 976 1030 958 958 1011 958 958 1011 976 976 1030 977 977 1031 958 958 1011 977 977 1031 959 959 1012 959 959 1012 977 977 1031 978 978 1032 959 959 1012 978 978 1032 960 960 1013 960 960 1013 978 978 1032 979 979 1033 960 960 1013 979 979 1033 961 961 1014 961 961 1014 979 979 1033 980 980 1034 961 961 1014 980 980 1034 962 962 1015 962 962 1015 980 980 1034 981 981 1035 962 962 1015 981 981 1035 963 963 1016 963 963 1016 981 981 1035 982 982 1036 963 963 1016 982 982 1036 964 964 1017 964 964 1017 982 982 1036 983 983 1037 964 964 1017 983 983 1037 965 965 1018 965 965 1018 983 983 1037 984 984 1038 965 965 1018 984 984 1038 966 966 1019 966 966 1019 984 984 1038 985 985 1039 966 966 1019 985 985 1039 967 967 1020 967 967 1020 985 985 1039 986 986 1040 967 967 1020 986 986 1040 968 968 1021 968 968 1021 986 986 1040 987 987 1041 968 968 1021 987 987 1041 969 969 1022 969 969 1022 987 987 1041 988 988 1042 969 969 1022 988 988 1042 970 970 1023 970 970 1023 988 988 1042 989 989 1043 970 970 1023 989 989 1043 971 971 1024 971 971 1024 989 989 1043 972 972 1044 971 971 1024 972 972 1044 954 954 1025 972 972 1026 990 990 1045 991 991 1046 972 972 1026 991 991 1046 973 973 1027 973 973 1027 991 991 1046 992 992 1047 973 973 1027 992 992 1047 974 974 1028 974 974 1028 992 992 1047 993 993 1048 974 974 1028 993 993 1048 975 975 1029 975 975 1029 993 993 1048 994 994 1049 975 975 1029 994 994 1049 976 976 1030 976 976 1030 994 994 1049 995 995 1050 976 976 1030 995 995 1050 977 977 1031 977 977 1031 995 995 1050 996 996 1051 977 977 1031 996 996 1051 978 978 1032 978 978 1032 996 996 1051 997 997 1052 978 978 1032 997 997 1052 979 979 1033 979 979 1033 997 997 1052 998 998 1053 979 979 1033 998 998 1053 980 980 1034 980 980 1034 998 998 1053 999 999 1054 980 980 1034 999 999 1054 981 981 1035 981 981 1035 999 999 1054 1000 1000 1055 981 981 1035 1000 1000 1055 982 982 1036 982 982 1036 1000 1000 1055 1001 1001 1056 982 982 1036 1001 1001 1056 983 983 1037 983 983 1037 1001 1001 1056 1002 1002 1057 983 983 1037 1002 1002 1057 984 984 1038 984 984 1038 1002 1002 1057 1003 1003 1058 984 984 1038 1003 1003 1058 985 985 1039 985 985 1039 1003 1003 1058 1004 1004 1059 985 985 1039 1004 1004 1059 986 986 1040 986 986 1040 1004 1004 1059 1005 1005 1060 986 986 1040 1005 1005 1060 987 987 1041 987 987 1041 1005 1005 1060 1006 1006 1061 987 987 1041 1006 1006 1061 988 988 1042 988 988 1042 1006 1006 1061 1007 1007 1062 988 988 1042 1007 1007 1062 989 989 1043 989 989 1043 1007 1007 1062 990 990 1063 989 989 1043 990 990 1063 972 972 1044 990 990 1045 1008 1008 1064 1009 1009 1065 990 990 1045 1009 1009 1065 991 991 1046 991 991 1046 1009 1009 1065 1010 1010 1066 991 991 1046 1010 1010 1066 992 992 1047 992 992 1047 1010 1010 1066 1011 1011 1067 992 992 1047 1011 1011 1067 993 993 1048 993 993 1048 1011 1011 1067 1012 1012 1068 993 993 1048 1012 1012 1068 994 994 1049 994 994 1049 1012 1012 1068 1013 1013 1069 994 994 1049 1013 1013 1069 995 995 1050 995 995 1050 1013 1013 1069 1014 1014 1070 995 995 1050 1014 1014 1070 996 996 1051 996 996 1051 1014 1014 1070 1015 1015 1071 996 996 1051 1015 1015 1071 997 997 1052 997 997 1052 1015 1015 1071 1016 1016 1072 997 997 1052 1016 1016 1072 998 998 1053 998 998 1053 1016 1016 1072 1017 1017 1073 998 998 1053 1017 1017 1073 999 999 1054 999 999 1054 1017 1017 1073 1018 1018 1074 999 999 1054 1018 1018 1074 1000 1000 1055 1000 1000 1055 1018 1018 1074 1019 1019 1075 1000 1000 1055 1019 1019 1075 1001 1001 1056 1001 1001 1056 1019 1019 1075 1020 1020 1076 1001 1001 1056 1020 1020 1076 1002 1002 1057 1002 1002 1057 1020 1020 1076 1021 1021 1077 1002 1002 1057 1021 1021 1077 1003 1003 1058 1003 1003 1058 1021 1021 1077 1022 1022 1078 1003 1003 1058 1022 1022 1078 1004 1004 1059 1004 1004 1059 1022 1022 1078 1023 1023 1079 1004 1004 1059 1023 1023 1079 1005 1005 1060 1005 1005 1060 1023 1023 1079 1024 1024 1080 1005 1005 1060 1024 1024 1080 1006 1006 1061 1006 1006 1061 1024 1024 1080 1025 1025 1081 1006 1006 1061 1025 1025 1081 1007 1007 1062 1007 1007 1062 1025 1025 1081 1008 1008 1082 1007 1007 1062 1008 1008 1082 990 990 1063 1008 1008 1064 1026 1026 1083 1027 1027 1084 1008 1008 1064 1027 1027 1084 1009 1009 1065 1009 1009 1065 1027 1027 1084 1028 1028 1085 1009 1009 1065 1028 1028 1085 1010 1010 1066 1010 1010 1066 1028 1028 1085 1029 1029 1086 1010 1010 1066 1029 1029 1086 1011 1011 1067 1011 1011 1067 1029 1029 1086 1030 1030 1087 1011 1011 1067 1030 1030 1087 1012 1012 1068 1012 1012 1068 1030 1030 1087 1031 1031 1088 1012 1012 1068 1031 1031 1088 1013 1013 1069 1013 1013 1069 1031 1031 1088 1032 1032 1089 1013 1013 1069 1032 1032 1089 1014 1014 1070 1014 1014 1070 1032 1032 1089 1033 1033 1090 1014 1014 1070 1033 1033 1090 1015 1015 1071 1015 1015 1071 1033 1033 1090 1034 1034 1091 1015 1015 1071 1034 1034 1091 1016 1016 1072 1016 1016 1072 1034 1034 1091 1035 1035 1092 1016 1016 1072 1035 1035 1092 1017 1017 1073 1017 1017 1073 1035 1035 1092 1036 1036 1093 1017 1017 1073 1036 1036 1093 1018 1018 1074 1018 1018 1074 1036 1036 1093 1037 1037 1094 1018 1018 1074 1037 1037 1094 1019 1019 1075 1019 1019 1075 1037 1037 1094 1038 1038 1095 1019 1019 1075 1038 1038 1095 1020 1020 1076 1020 1020 1076 1038 1038 1095 1039 1039 1096 1020 1020 1076 1039 1039 1096 1021 1021 1077 1021 1021 1077 1039 1039 1096 1040 1040 1097 1021 1021 1077 1040 1040 1097 1022 1022 1078 1022 1022 1078 1040 1040 1097 1041 1041 1098 1022 1022 1078 1041 1041 1098 1023 1023 1079 1023 1023 1079 1041 1041 1098 1042 1042 1099 1023 1023 1079 1042 1042 1099 1024 1024 1080 1024 1024 1080 1042 1042 1099 1043 1043 1100 1024 1024 1080 1043 1043 1100 1025 1025 1081 1025 1025 1081 1043 1043 1100 1026 1026 1101 1025 1025 1081 1026 1026 1101 1008 1008 1082 1026 1026 1083 1044 1044 1102 1045 1045 1103 1026 1026 1083 1045 1045 1103 1027 1027 1084 1027 1027 1084 1045 1045 1103 1046 1046 1104 1027 1027 1084 1046 1046 1104 1028 1028 1085 1028 1028 1085 1046 1046 1104 1047 1047 1105 1028 1028 1085 1047 1047 1105 1029 1029 1086 1029 1029 1086 1047 1047 1105 1048 1048 1106 1029 1029 1086 1048 1048 1106 1030 1030 1087 1030 1030 1087 1048 1048 1106 1049 1049 1107 1030 1030 1087 1049 1049 1107 1031 1031 1088 1031 1031 1088 1049 1049 1107 1050 1050 1108 1031 1031 1088 1050 1050 1108 1032 1032 1089 1032 1032 1089 1050 1050 1108 1051 1051 1109 1032 1032 1089 1051 1051 1109 1033 1033 1090 1033 1033 1090 1051 1051 1109 1052 1052 1110 1033 1033 1090 1052 1052 1110 1034 1034 1091 1034 1034 1091 1052 1052 1110 1053 1053 1111 1034 1034 1091 1053 1053 1111 1035 1035 1092 1035 1035 1092 1053 1053 1111 1054 1054 1112 1035 1035 1092 1054 1054 1112 1036 1036 1093 1036 1036 1093 1054 1054 1112 1055 1055 1113 1036 1036 1093 1055 1055 1113 1037 1037 1094 1037 1037 1094 1055 1055 1113 1056 1056 1114 1037 1037 1094 1056 1056 1114 1038 1038 1095 1038 1038 1095 1056 1056 1114 1057 1057 1115 1038 1038 1095 1057 1057 1115 1039 1039 1096 1039 1039 1096 1057 1057 1115 1058 1058 1116 1039 1039 1096 1058 1058 1116 1040 1040 1097 1040 1040 1097 1058 1058 1116 1059 1059 1117 1040 1040 1097 1059 1059 1117 1041 1041 1098 1041 1041 1098 1059 1059 1117 1060 1060 1118 1041 1041 1098 1060 1060 1118 1042 1042 1099 1042 1042 1099 1060 1060 1118 1061 1061 1119 1042 1042 1099 1061 1061 1119 1043 1043 1100 1043 1043 1100 1061 1061 1119 1044 1044 1120 1043 1043 1100 1044 1044 1120 1026 1026 1101 1044 1044 1102 1062 1062 1121 1063 1063 1122 1044 1044 1102 1063 1063 1122 1045 1045 1103 1045 1045 1103 1063 1063 1122 1064 1064 1123 1045 1045 1103 1064 1064 1123 1046 1046 1104 1046 1046 1104 1064 1064 1123 1065 1065 1124 1046 1046 1104 1065 1065 1124 1047 1047 1105 1047 1047 1105 1065 1065 1124 1066 1066 1125 1047 1047 1105 1066 1066 1125 1048 1048 1106 1048 1048 1106 1066 1066 1125 1067 1067 1126 1048 1048 1106 1067 1067 1126 1049 1049 1107 1049 1049 1107 1067 1067 1126 1068 1068 1127 1049 1049 1107 1068 1068 1127 1050 1050 1108 1050 1050 1108 1068 1068 1127 1069 1069 1128 1050 1050 1108 1069 1069 1128 1051 1051 1109 1051 1051 1109 1069 1069 1128 1070 1070 1129 1051 1051 1109 1070 1070 1129 1052 1052 1110 1052 1052 1110 1070 1070 1129 1071 1071 1130 1052 1052 1110 1071 1071 1130 1053 1053 1111 1053 1053 1111 1071 1071 1130 1072 1072 1131 1053 1053 1111 1072 1072 1131 1054 1054 1112 1054 1054 1112 1072 1072 1131 1073 1073 1132 1054 1054 1112 1073 1073 1132 1055 1055 1113 1055 1055 1113 1073 1073 1132 1074 1074 1133 1055 1055 1113 1074 1074 1133 1056 1056 1114 1056 1056 1114 1074 1074 1133 1075 1075 1134 1056 1056 1114 1075 1075 1134 1057 1057 1115 1057 1057 1115 1075 1075 1134 1076 1076 1135 1057 1057 1115 1076 1076 1135 1058 1058 1116 1058 1058 1116 1076 1076 1135 1077 1077 1136 1058 1058 1116 1077 1077 1136 1059 1059 1117 1059 1059 1117 1077 1077 1136 1078 1078 1137 1059 1059 1117 1078 1078 1137 1060 1060 1118 1060 1060 1118 1078 1078 1137 1079 1079 1138 1060 1060 1118 1079 1079 1138 1061 1061 1119 1061 1061 1119 1079 1079 1138 1062 1062 1139 1061 1061 1119 1062 1062 1139 1044 1044 1120 1062 1062 1121 1080 1080 1140 1081 1081 1141 1062 1062 1121 1081 1081 1141 1063 1063 1122 1063 1063 1122 1081 1081 1141 1082 1082 1142 1063 1063 1122 1082 1082 1142 1064 1064 1123 1064 1064 1123 1082 1082 1142 1083 1083 1143 1064 1064 1123 1083 1083 1143 1065 1065 1124 1065 1065 1124 1083 1083 1143 1084 1084 1144 1065 1065 1124 1084 1084 1144 1066 1066 1125 1066 1066 1125 1084 1084 1144 1085 1085 1145 1066 1066 1125 1085 1085 1145 1067 1067 1126 1067 1067 1126 1085 1085 1145 1086 1086 1146 1067 1067 1126 1086 1086 1146 1068 1068 1127 1068 1068 1127 1086 1086 1146 1087 1087 1147 1068 1068 1127 1087 1087 1147 1069 1069 1128 1069 1069 1128 1087 1087 1147 1088 1088 1148 1069 1069 1128 1088 1088 1148 1070 1070 1129 1070 1070 1129 1088 1088 1148 1089 1089 1149 1070 1070 1129 1089 1089 1149 1071 1071 1130 1071 1071 1130 1089 1089 1149 1090 1090 1150 1071 1071 1130 1090 1090 1150 1072 1072 1131 1072 1072 1131 1090 1090 1150 1091 1091 1151 1072 1072 1131 1091 1091 1151 1073 1073 1132 1073 1073 1132 1091 1091 1151 1092 1092 1152 1073 1073 1132 1092 1092 1152 1074 1074 1133 1074 1074 1133 1092 1092 1152 1093 1093 1153 1074 1074 1133 1093 1093 1153 1075 1075 1134 1075 1075 1134 1093 1093 1153 1094 1094 1154 1075 1075 1134 1094 1094 1154 1076 1076 1135 1076 1076 1135 1094 1094 1154 1095 1095 1155 1076 1076 1135 1095 1095 1155 1077 1077 1136 1077 1077 1136 1095 1095 1155 1096 1096 1156 1077 1077 1136 1096 1096 1156 1078 1078 1137 1078 1078 1137 1096 1096 1156 1097 1097 1157 1078 1078 1137 1097 1097 1157 1079 1079 1138 1079 1079 1138 1097 1097 1157 1080 1080 1158 1079 1079 1138 1080 1080 1158 1062 1062 1139 1080 1080 1140 1098 1098 1159 1099 1099 1160 1080 1080 1140 1099 1099 1160 1081 1081 1141 1081 1081 1141 1099 1099 1160 1100 1100 1161 1081 1081 1141 1100 1100 1161 1082 1082 1142 1082 1082 1142 1100 1100 1161 1101 1101 1162 1082 1082 1142 1101 1101 1162 1083 1083 1143 1083 1083 1143 1101 1101 1162 1102 1102 1163 1083 1083 1143 1102 1102 1163 1084 1084 1144 1084 1084 1144 1102 1102 1163 1103 1103 1164 1084 1084 1144 1103 1103 1164 1085 1085 1145 1085 1085 1145 1103 1103 1164 1104 1104 1165 1085 1085 1145 1104 1104 1165 1086 1086 1146 1086 1086 1146 1104 1104 1165 1105 1105 1166 1086 1086 1146 1105 1105 1166 1087 1087 1147 1087 1087 1147 1105 1105 1166 1106 1106 1167 1087 1087 1147 1106 1106 1167 1088 1088 1148 1088 1088 1148 1106 1106 1167 1107 1107 1168 1088 1088 1148 1107 1107 1168 1089 1089 1149 1089 1089 1149 1107 1107 1168 1108 1108 1169 1089 1089 1149 1108 1108 1169 1090 1090 1150 1090 1090 1150 1108 1108 1169 1109 1109 1170 1090 1090 1150 1109 1109 1170 1091 1091 1151 1091 1091 1151 1109 1109 1170 1110 1110 1171 1091 1091 1151 1110 1110 1171 1092 1092 1152 1092 1092 1152 1110 1110 1171 1111 1111 1172 1092 1092 1152 1111 1111 1172 1093 1093 1153 1093 1093 1153 1111 1111 1172 1112 1112 1173 1093 1093 1153 1112 1112 1173 1094 1094 1154 1094 1094 1154 1112 1112 1173 1113 1113 1174 1094 1094 1154 1113 1113 1174 1095 1095 1155 1095 1095 1155 1113 1113 1174 1114 1114 1175 1095 1095 1155 1114 1114 1175 1096 1096 1156 1096 1096 1156 1114 1114 1175 1115 1115 1176 1096 1096 1156 1115 1115 1176 1097 1097 1157 1097 1097 1157 1115 1115 1176 1098 1098 1177 1097 1097 1157 1098 1098 1177 1080 1080 1158 1098 1098 1159 1116 1116 1178 1117 1117 1179 1098 1098 1159 1117 1117 1179 1099 1099 1160 1099 1099 1160 1117 1117 1179 1118 1118 1180 1099 1099 1160 1118 1118 1180 1100 1100 1161 1100 1100 1161 1118 1118 1180 1119 1119 1181 1100 1100 1161 1119 1119 1181 1101 1101 1162 1101 1101 1162 1119 1119 1181 1120 1120 1182 1101 1101 1162 1120 1120 1182 1102 1102 1163 1102 1102 1163 1120 1120 1182 1121 1121 1183 1102 1102 1163 1121 1121 1183 1103 1103 1164 1103 1103 1164 1121 1121 1183 1122 1122 1184 1103 1103 1164 1122 1122 1184 1104 1104 1165 1104 1104 1165 1122 1122 1184 1123 1123 1185 1104 1104 1165 1123 1123 1185 1105 1105 1166 1105 1105 1166 1123 1123 1185 1124 1124 1186 1105 1105 1166 1124 1124 1186 1106 1106 1167 1106 1106 1167 1124 1124 1186 1125 1125 1187 1106 1106 1167 1125 1125 1187 1107 1107 1168 1107 1107 1168 1125 1125 1187 1126 1126 1188 1107 1107 1168 1126 1126 1188 1108 1108 1169 1108 1108 1169 1126 1126 1188 1127 1127 1189 1108 1108 1169 1127 1127 1189 1109 1109 1170 1109 1109 1170 1127 1127 1189 1128 1128 1190 1109 1109 1170 1128 1128 1190 1110 1110 1171 1110 1110 1171 1128 1128 1190 1129 1129 1191 1110 1110 1171 1129 1129 1191 1111 1111 1172 1111 1111 1172 1129 1129 1191 1130 1130 1192 1111 1111 1172 1130 1130 1192 1112 1112 1173 1112 1112 1173 1130 1130 1192 1131 1131 1193 1112 1112 1173 1131 1131 1193 1113 1113 1174 1113 1113 1174 1131 1131 1193 1132 1132 1194 1113 1113 1174 1132 1132 1194 1114 1114 1175 1114 1114 1175 1132 1132 1194 1133 1133 1195 1114 1114 1175 1133 1133 1195 1115 1115 1176 1115 1115 1176 1133 1133 1195 1116 1116 1196 1115 1115 1176 1116 1116 1196 1098 1098 1177 1116 1116 1178 1134 1134 1197 1135 1135 1198 1116 1116 1178 1135 1135 1198 1117 1117 1179 1117 1117 1179 1135 1135 1198 1136 1136 1199 1117 1117 1179 1136 1136 1199 1118 1118 1180 1118 1118 1180 1136 1136 1199 1137 1137 1200 1118 1118 1180 1137 1137 1200 1119 1119 1181 1119 1119 1181 1137 1137 1200 1138 1138 1201 1119 1119 1181 1138 1138 1201 1120 1120 1182 1120 1120 1182 1138 1138 1201 1139 1139 1202 1120 1120 1182 1139 1139 1202 1121 1121 1183 1121 1121 1183 1139 1139 1202 1140 1140 1203 1121 1121 1183 1140 1140 1203 1122 1122 1184 1122 1122 1184 1140 1140 1203 1141 1141 1204 1122 1122 1184 1141 1141 1204 1123 1123 1185 1123 1123 1185 1141 1141 1204 1142 1142 1205 1123 1123 1185 1142 1142 1205 1124 1124 1186 1124 1124 1186 1142 1142 1205 1143 1143 1206 1124 1124 1186 1143 1143 1206 1125 1125 1187 1125 1125 1187 1143 1143 1206 1144 1144 1207 1125 1125 1187 1144 1144 1207 1126 1126 1188 1126 1126 1188 1144 1144 1207 1145 1145 1208 1126 1126 1188 1145 1145 1208 1127 1127 1189 1127 1127 1189 1145 1145 1208 1146 1146 1209 1127 1127 1189 1146 1146 1209 1128 1128 1190 1128 1128 1190 1146 1146 1209 1147 1147 1210 1128 1128 1190 1147 1147 1210 1129 1129 1191 1129 1129 1191 1147 1147 1210 1148 1148 1211 1129 1129 1191 1148 1148 1211 1130 1130 1192 1130 1130 1192 1148 1148 1211 1149 1149 1212 1130 1130 1192 1149 1149 1212 1131 1131 1193 1131 1131 1193 1149 1149 1212 1150 1150 1213 1131 1131 1193 1150 1150 1213 1132 1132 1194 1132 1132 1194 1150 1150 1213 1151 1151 1214 1132 1132 1194 1151 1151 1214 1133 1133 1195 1133 1133 1195 1151 1151 1214 1134 1134 1215 1133 1133 1195 1134 1134 1215 1116 1116 1196 1134 1134 1197 1152 1152 1216 1153 1153 1217 1134 1134 1197 1153 1153 1217 1135 1135 1198 1135 1135 1198 1153 1153 1217 1154 1154 1218 1135 1135 1198 1154 1154 1218 1136 1136 1199 1136 1136 1199 1154 1154 1218 1155 1155 1219 1136 1136 1199 1155 1155 1219 1137 1137 1200 1137 1137 1200 1155 1155 1219 1156 1156 1220 1137 1137 1200 1156 1156 1220 1138 1138 1201 1138 1138 1201 1156 1156 1220 1157 1157 1221 1138 1138 1201 1157 1157 1221 1139 1139 1202 1139 1139 1202 1157 1157 1221 1158 1158 1222 1139 1139 1202 1158 1158 1222 1140 1140 1203 1140 1140 1203 1158 1158 1222 1159 1159 1223 1140 1140 1203 1159 1159 1223 1141 1141 1204 1141 1141 1204 1159 1159 1223 1160 1160 1224 1141 1141 1204 1160 1160 1224 1142 1142 1205 1142 1142 1205 1160 1160 1224 1161 1161 1225 1142 1142 1205 1161 1161 1225 1143 1143 1206 1143 1143 1206 1161 1161 1225 1162 1162 1226 1143 1143 1206 1162 1162 1226 1144 1144 1207 1144 1144 1207 1162 1162 1226 1163 1163 1227 1144 1144 1207 1163 1163 1227 1145 1145 1208 1145 1145 1208 1163 1163 1227 1164 1164 1228 1145 1145 1208 1164 1164 1228 1146 1146 1209 1146 1146 1209 1164 1164 1228 1165 1165 1229 1146 1146 1209 1165 1165 1229 1147 1147 1210 1147 1147 1210 1165 1165 1229 1166 1166 1230 1147 1147 1210 1166 1166 1230 1148 1148 1211 1148 1148 1211 1166 1166 1230 1167 1167 1231 1148 1148 1211 1167 1167 1231 1149 1149 1212 1149 1149 1212 1167 1167 1231 1168 1168 1232 1149 1149 1212 1168 1168 1232 1150 1150 1213 1150 1150 1213 1168 1168 1232 1169 1169 1233 1150 1150 1213 1169 1169 1233 1151 1151 1214 1151 1151 1214 1169 1169 1233 1152 1152 1234 1151 1151 1214 1152 1152 1234 1134 1134 1215 1152 1152 1216 1170 1170 1235 1171 1171 1236 1152 1152 1216 1171 1171 1236 1153 1153 1217 1153 1153 1217 1171 1171 1236 1172 1172 1237 1153 1153 1217 1172 1172 1237 1154 1154 1218 1154 1154 1218 1172 1172 1237 1173 1173 1238 1154 1154 1218 1173 1173 1238 1155 1155 1219 1155 1155 1219 1173 1173 1238 1174 1174 1239 1155 1155 1219 1174 1174 1239 1156 1156 1220 1156 1156 1220 1174 1174 1239 1175 1175 1240 1156 1156 1220 1175 1175 1240 1157 1157 1221 1157 1157 1221 1175 1175 1240 1176 1176 1241 1157 1157 1221 1176 1176 1241 1158 1158 1222 1158 1158 1222 1176 1176 1241 1177 1177 1242 1158 1158 1222 1177 1177 1242 1159 1159 1223 1159 1159 1223 1177 1177 1242 1178 1178 1243 1159 1159 1223 1178 1178 1243 1160 1160 1224 1160 1160 1224 1178 1178 1243 1179 1179 1244 1160 1160 1224 1179 1179 1244 1161 1161 1225 1161 1161 1225 1179 1179 1244 1180 1180 1245 1161 1161 1225 1180 1180 1245 1162 1162 1226 1162 1162 1226 1180 1180 1245 1181 1181 1246 1162 1162 1226 1181 1181 1246 1163 1163 1227 1163 1163 1227 1181 1181 1246 1182 1182 1247 1163 1163 1227 1182 1182 1247 1164 1164 1228 1164 1164 1228 1182 1182 1247 1183 1183 1248 1164 1164 1228 1183 1183 1248 1165 1165 1229 1165 1165 1229 1183 1183 1248 1184 1184 1249 1165 1165 1229 1184 1184 1249 1166 1166 1230 1166 1166 1230 1184 1184 1249 1185 1185 1250 1166 1166 1230 1185 1185 1250 1167 1167 1231 1167 1167 1231 1185 1185 1250 1186 1186 1251 1167 1167 1231 1186 1186 1251 1168 1168 1232 1168 1168 1232 1186 1186 1251 1187 1187 1252 1168 1168 1232 1187 1187 1252 1169 1169 1233 1169 1169 1233 1187 1187 1252 1170 1170 1253 1169 1169 1233 1170 1170 1253 1152 1152 1234 1170 1170 1235 1188 1188 1254 1189 1189 1255 1170 1170 1235 1189 1189 1255 1171 1171 1236 1171 1171 1236 1189 1189 1255 1190 1190 1256 1171 1171 1236 1190 1190 1256 1172 1172 1237 1172 1172 1237 1190 1190 1256 1191 1191 1257 1172 1172 1237 1191 1191 1257 1173 1173 1238 1173 1173 1238 1191 1191 1257 1192 1192 1258 1173 1173 1238 1192 1192 1258 1174 1174 1239 1174 1174 1239 1192 1192 1258 1193 1193 1259 1174 1174 1239 1193 1193 1259 1175 1175 1240 1175 1175 1240 1193 1193 1259 1194 1194 1260 1175 1175 1240 1194 1194 1260 1176 1176 1241 1176 1176 1241 1194 1194 1260 1195 1195 1261 1176 1176 1241 1195 1195 1261 1177 1177 1242 1177 1177 1242 1195 1195 1261 1196 1196 1262 1177 1177 1242 1196 1196 1262 1178 1178 1243 1178 1178 1243 1196 1196 1262 1197 1197 1263 1178 1178 1243 1197 1197 1263 1179 1179 1244 1179 1179 1244 1197 1197 1263 1198 1198 1264 1179 1179 1244 1198 1198 1264 1180 1180 1245 1180 1180 1245 1198 1198 1264 1199 1199 1265 1180 1180 1245 1199 1199 1265 1181 1181 1246 1181 1181 1246 1199 1199 1265 1200 1200 1266 1181 1181 1246 1200 1200 1266 1182 1182 1247 1182 1182 1247 1200 1200 1266 1201 1201 1267 1182 1182 1247 1201 1201 1267 1183 1183 1248 1183 1183 1248 1201 1201 1267 1202 1202 1268 1183 1183 1248 1202 1202 1268 1184 1184 1249 1184 1184 1249 1202 1202 1268 1203 1203 1269 1184 1184 1249 1203 1203 1269 1185 1185 1250 1185 1185 1250 1203 1203 1269 1204 1204 1270 1185 1185 1250 1204 1204 1270 1186 1186 1251 1186 1186 1251 1204 1204 1270 1205 1205 1271 1186 1186 1251 1205 1205 1271 1187 1187 1252 1187 1187 1252 1205 1205 1271 1188 1188 1272 1187 1187 1252 1188 1188 1272 1170 1170 1253 1188 1188 1254 1206 1206 1273 1207 1207 1274 1188 1188 1254 1207 1207 1274 1189 1189 1255 1189 1189 1255 1207 1207 1274 1208 1208 1275 1189 1189 1255 1208 1208 1275 1190 1190 1256 1190 1190 1256 1208 1208 1275 1209 1209 1276 1190 1190 1256 1209 1209 1276 1191 1191 1257 1191 1191 1257 1209 1209 1276 1210 1210 1277 1191 1191 1257 1210 1210 1277 1192 1192 1258 1192 1192 1258 1210 1210 1277 1211 1211 1278 1192 1192 1258 1211 1211 1278 1193 1193 1259 1193 1193 1259 1211 1211 1278 1212 1212 1279 1193 1193 1259 1212 1212 1279 1194 1194 1260 1194 1194 1260 1212 1212 1279 1213 1213 1280 1194 1194 1260 1213 1213 1280 1195 1195 1261 1195 1195 1261 1213 1213 1280 1214 1214 1281 1195 1195 1261 1214 1214 1281 1196 1196 1262 1196 1196 1262 1214 1214 1281 1215 1215 1282 1196 1196 1262 1215 1215 1282 1197 1197 1263 1197 1197 1263 1215 1215 1282 1216 1216 1283 1197 1197 1263 1216 1216 1283 1198 1198 1264 1198 1198 1264 1216 1216 1283 1217 1217 1284 1198 1198 1264 1217 1217 1284 1199 1199 1265 1199 1199 1265 1217 1217 1284 1218 1218 1285 1199 1199 1265 1218 1218 1285 1200 1200 1266 1200 1200 1266 1218 1218 1285 1219 1219 1286 1200 1200 1266 1219 1219 1286 1201 1201 1267 1201 1201 1267 1219 1219 1286 1220 1220 1287 1201 1201 1267 1220 1220 1287 1202 1202 1268 1202 1202 1268 1220 1220 1287 1221 1221 1288 1202 1202 1268 1221 1221 1288 1203 1203 1269 1203 1203 1269 1221 1221 1288 1222 1222 1289 1203 1203 1269 1222 1222 1289 1204 1204 1270 1204 1204 1270 1222 1222 1289 1223 1223 1290 1204 1204 1270 1223 1223 1290 1205 1205 1271 1205 1205 1271 1223 1223 1290 1206 1206 1291 1205 1205 1271 1206 1206 1291 1188 1188 1272 1206 1206 1273 1224 1224 1292 1225 1225 1293 1206 1206 1273 1225 1225 1293 1207 1207 1274 1207 1207 1274 1225 1225 1293 1226 1226 1294 1207 1207 1274 1226 1226 1294 1208 1208 1275 1208 1208 1275 1226 1226 1294 1227 1227 1295 1208 1208 1275 1227 1227 1295 1209 1209 1276 1209 1209 1276 1227 1227 1295 1228 1228 1296 1209 1209 1276 1228 1228 1296 1210 1210 1277 1210 1210 1277 1228 1228 1296 1229 1229 1297 1210 1210 1277 1229 1229 1297 1211 1211 1278 1211 1211 1278 1229 1229 1297 1230 1230 1298 1211 1211 1278 1230 1230 1298 1212 1212 1279 1212 1212 1279 1230 1230 1298 1231 1231 1299 1212 1212 1279 1231 1231 1299 1213 1213 1280 1213 1213 1280 1231 1231 1299 1232 1232 1300 1213 1213 1280 1232 1232 1300 1214 1214 1281 1214 1214 1281 1232 1232 1300 1233 1233 1301 1214 1214 1281 1233 1233 1301 1215 1215 1282 1215 1215 1282 1233 1233 1301 1234 1234 1302 1215 1215 1282 1234 1234 1302 1216 1216 1283 1216 1216 1283 1234 1234 1302 1235 1235 1303 1216 1216 1283 1235 1235 1303 1217 1217 1284 1217 1217 1284 1235 1235 1303 1236 1236 1304 1217 1217 1284 1236 1236 1304 1218 1218 1285 1218 1218 1285 1236 1236 1304 1237 1237 1305 1218 1218 1285 1237 1237 1305 1219 1219 1286 1219 1219 1286 1237 1237 1305 1238 1238 1306 1219 1219 1286 1238 1238 1306 1220 1220 1287 1220 1220 1287 1238 1238 1306 1239 1239 1307 1220 1220 1287 1239 1239 1307 1221 1221 1288 1221 1221 1288 1239 1239 1307 1240 1240 1308 1221 1221 1288 1240 1240 1308 1222 1222 1289 1222 1222 1289 1240 1240 1308 1241 1241 1309 1222 1222 1289 1241 1241 1309 1223 1223 1290 1223 1223 1290 1241 1241 1309 1224 1224 1310 1223 1223 1290 1224 1224 1310 1206 1206 1291 1224 1224 1292 1242 1242 1311 1243 1243 1312 1224 1224 1292 1243 1243 1312 1225 1225 1293 1225 1225 1293 1243 1243 1312 1244 1244 1313 1225 1225 1293 1244 1244 1313 1226 1226 1294 1226 1226 1294 1244 1244 1313 1245 1245 1314 1226 1226 1294 1245 1245 1314 1227 1227 1295 1227 1227 1295 1245 1245 1314 1246 1246 1315 1227 1227 1295 1246 1246 1315 1228 1228 1296 1228 1228 1296 1246 1246 1315 1247 1247 1316 1228 1228 1296 1247 1247 1316 1229 1229 1297 1229 1229 1297 1247 1247 1316 1248 1248 1317 1229 1229 1297 1248 1248 1317 1230 1230 1298 1230 1230 1298 1248 1248 1317 1249 1249 1318 1230 1230 1298 1249 1249 1318 1231 1231 1299 1231 1231 1299 1249 1249 1318 1250 1250 1319 1231 1231 1299 1250 1250 1319 1232 1232 1300 1232 1232 1300 1250 1250 1319 1251 1251 1320 1232 1232 1300 1251 1251 1320 1233 1233 1301 1233 1233 1301 1251 1251 1320 1252 1252 1321 1233 1233 1301 1252 1252 1321 1234 1234 1302 1234 1234 1302 1252 1252 1321 1253 1253 1322 1234 1234 1302 1253 1253 1322 1235 1235 1303 1235 1235 1303 1253 1253 1322 1254 1254 1323 1235 1235 1303 1254 1254 1323 1236 1236 1304 1236 1236 1304 1254 1254 1323 1255 1255 1324 1236 1236 1304 1255 1255 1324 1237 1237 1305 1237 1237 1305 1255 1255 1324 1256 1256 1325 1237 1237 1305 1256 1256 1325 1238 1238 1306 1238 1238 1306 1256 1256 1325 1257 1257 1326 1238 1238 1306 1257 1257 1326 1239 1239 1307 1239 1239 1307 1257 1257 1326 1258 1258 1327 1239 1239 1307 1258 1258 1327 1240 1240 1308 1240 1240 1308 1258 1258 1327 1259 1259 1328 1240 1240 1308 1259 1259 1328 1241 1241 1309 1241 1241 1309 1259 1259 1328 1242 1242 1329 1241 1241 1309 1242 1242 1329 1224 1224 1310 1242 1242 1311 1260 1260 1330 1261 1261 1331 1242 1242 1311 1261 1261 1331 1243 1243 1312 1243 1243 1312 1261 1261 1331 1262 1262 1332 1243 1243 1312 1262 1262 1332 1244 1244 1313 1244 1244 1313 1262 1262 1332 1263 1263 1333 1244 1244 1313 1263 1263 1333 1245 1245 1314 1245 1245 1314 1263 1263 1333 1264 1264 1334 1245 1245 1314 1264 1264 1334 1246 1246 1315 1246 1246 1315 1264 1264 1334 1265 1265 1335 1246 1246 1315 1265 1265 1335 1247 1247 1316 1247 1247 1316 1265 1265 1335 1266 1266 1336 1247 1247 1316 1266 1266 1336 1248 1248 1317 1248 1248 1317 1266 1266 1336 1267 1267 1337 1248 1248 1317 1267 1267 1337 1249 1249 1318 1249 1249 1318 1267 1267 1337 1268 1268 1338 1249 1249 1318 1268 1268 1338 1250 1250 1319 1250 1250 1319 1268 1268 1338 1269 1269 1339 1250 1250 1319 1269 1269 1339 1251 1251 1320 1251 1251 1320 1269 1269 1339 1270 1270 1340 1251 1251 1320 1270 1270 1340 1252 1252 1321 1252 1252 1321 1270 1270 1340 1271 1271 1341 1252 1252 1321 1271 1271 1341 1253 1253 1322 1253 1253 1322 1271 1271 1341 1272 1272 1342 1253 1253 1322 1272 1272 1342 1254 1254 1323 1254 1254 1323 1272 1272 1342 1273 1273 1343 1254 1254 1323 1273 1273 1343 1255 1255 1324 1255 1255 1324 1273 1273 1343 1274 1274 1344 1255 1255 1324 1274 1274 1344 1256 1256 1325 1256 1256 1325 1274 1274 1344 1275 1275 1345 1256 1256 1325 1275 1275 1345 1257 1257 1326 1257 1257 1326 1275 1275 1345 1276 1276 1346 1257 1257 1326 1276 1276 1346 1258 1258 1327 1258 1258 1327 1276 1276 1346 1277 1277 1347 1258 1258 1327 1277 1277 1347 1259 1259 1328 1259 1259 1328 1277 1277 1347 1260 1260 1348 1259 1259 1328 1260 1260 1348 1242 1242 1329 1260 1260 1330 1278 1278 1349 1279 1279 1350 1260 1260 1330 1279 1279 1350 1261 1261 1331 1261 1261 1331 1279 1279 1350 1280 1280 1351 1261 1261 1331 1280 1280 1351 1262 1262 1332 1262 1262 1332 1280 1280 1351 1281 1281 1352 1262 1262 1332 1281 1281 1352 1263 1263 1333 1263 1263 1333 1281 1281 1352 1282 1282 1353 1263 1263 1333 1282 1282 1353 1264 1264 1334 1264 1264 1334 1282 1282 1353 1283 1283 1354 1264 1264 1334 1283 1283 1354 1265 1265 1335 1265 1265 1335 1283 1283 1354 1284 1284 1355 1265 1265 1335 1284 1284 1355 1266 1266 1336 1266 1266 1336 1284 1284 1355 1285 1285 1356 1266 1266 1336 1285 1285 1356 1267 1267 1337 1267 1267 1337 1285 1285 1356 1286 1286 1357 1267 1267 1337 1286 1286 1357 1268 1268 1338 1268 1268 1338 1286 1286 1357 1287 1287 1358 1268 1268 1338 1287 1287 1358 1269 1269 1339 1269 1269 1339 1287 1287 1358 1288 1288 1359 1269 1269 1339 1288 1288 1359 1270 1270 1340 1270 1270 1340 1288 1288 1359 1289 1289 1360 1270 1270 1340 1289 1289 1360 1271 1271 1341 1271 1271 1341 1289 1289 1360 1290 1290 1361 1271 1271 1341 1290 1290 1361 1272 1272 1342 1272 1272 1342 1290 1290 1361 1291 1291 1362 1272 1272 1342 1291 1291 1362 1273 1273 1343 1273 1273 1343 1291 1291 1362 1292 1292 1363 1273 1273 1343 1292 1292 1363 1274 1274 1344 1274 1274 1344 1292 1292 1363 1293 1293 1364 1274 1274 1344 1293 1293 1364 1275 1275 1345 1275 1275 1345 1293 1293 1364 1294 1294 1365 1275 1275 1345 1294 1294 1365 1276 1276 1346 1276 1276 1346 1294 1294 1365 1295 1295 1366 1276 1276 1346 1295 1295 1366 1277 1277 1347 1277 1277 1347 1295 1295 1366 1278 1278 1367 1277 1277 1347 1278 1278 1367 1260 1260 1348 1278 1278 1349 1296 1296 1368 1297 1297 1369 1278 1278 1349 1297 1297 1369 1279 1279 1350 1279 1279 1350 1297 1297 1369 1298 1298 1370 1279 1279 1350 1298 1298 1370 1280 1280 1351 1280 1280 1351 1298 1298 1370 1299 1299 1371 1280 1280 1351 1299 1299 1371 1281 1281 1352 1281 1281 1352 1299 1299 1371 1300 1300 1372 1281 1281 1352 1300 1300 1372 1282 1282 1353 1282 1282 1353 1300 1300 1372 1301 1301 1373 1282 1282 1353 1301 1301 1373 1283 1283 1354 1283 1283 1354 1301 1301 1373 1302 1302 1374 1283 1283 1354 1302 1302 1374 1284 1284 1355 1284 1284 1355 1302 1302 1374 1303 1303 1375 1284 1284 1355 1303 1303 1375 1285 1285 1356 1285 1285 1356 1303 1303 1375 1304 1304 1376 1285 1285 1356 1304 1304 1376 1286 1286 1357 1286 1286 1357 1304 1304 1376 1305 1305 1377 1286 1286 1357 1305 1305 1377 1287 1287 1358 1287 1287 1358 1305 1305 1377 1306 1306 1378 1287 1287 1358 1306 1306 1378 1288 1288 1359 1288 1288 1359 1306 1306 1378 1307 1307 1379 1288 1288 1359 1307 1307 1379 1289 1289 1360 1289 1289 1360 1307 1307 1379 1308 1308 1380 1289 1289 1360 1308 1308 1380 1290 1290 1361 1290 1290 1361 1308 1308 1380 1309 1309 1381 1290 1290 1361 1309 1309 1381 1291 1291 1362 1291 1291 1362 1309 1309 1381 1310 1310 1382 1291 1291 1362 1310 1310 1382 1292 1292 1363 1292 1292 1363 1310 1310 1382 1311 1311 1383 1292 1292 1363 1311 1311 1383 1293 1293 1364 1293 1293 1364 1311 1311 1383 1312 1312 1384 1293 1293 1364 1312 1312 1384 1294 1294 1365 1294 1294 1365 1312 1312 1384 1313 1313 1385 1294 1294 1365 1313 1313 1385 1295 1295 1366 1295 1295 1366 1313 1313 1385 1296 1296 1386 1295 1295 1366 1296 1296 1386 1278 1278 1367 1296 1296 1368 1314 1314 1387 1315 1315 1388 1296 1296 1368 1315 1315 1388 1297 1297 1369 1297 1297 1369 1315 1315 1388 1316 1316 1389 1297 1297 1369 1316 1316 1389 1298 1298 1370 1298 1298 1370 1316 1316 1389 1317 1317 1390 1298 1298 1370 1317 1317 1390 1299 1299 1371 1299 1299 1371 1317 1317 1390 1318 1318 1391 1299 1299 1371 1318 1318 1391 1300 1300 1372 1300 1300 1372 1318 1318 1391 1319 1319 1392 1300 1300 1372 1319 1319 1392 1301 1301 1373 1301 1301 1373 1319 1319 1392 1320 1320 1393 1301 1301 1373 1320 1320 1393 1302 1302 1374 1302 1302 1374 1320 1320 1393 1321 1321 1394 1302 1302 1374 1321 1321 1394 1303 1303 1375 1303 1303 1375 1321 1321 1394 1322 1322 1395 1303 1303 1375 1322 1322 1395 1304 1304 1376 1304 1304 1376 1322 1322 1395 1323 1323 1396 1304 1304 1376 1323 1323 1396 1305 1305 1377 1305 1305 1377 1323 1323 1396 1324 1324 1397 1305 1305 1377 1324 1324 1397 1306 1306 1378 1306 1306 1378 1324 1324 1397 1325 1325 1398 1306 1306 1378 1325 1325 1398 1307 1307 1379 1307 1307 1379 1325 1325 1398 1326 1326 1399 1307 1307 1379 1326 1326 1399 1308 1308 1380 1308 1308 1380 1326 1326 1399 1327 1327 1400 1308 1308 1380 1327 1327 1400 1309 1309 1381 1309 1309 1381 1327 1327 1400 1328 1328 1401 1309 1309 1381 1328 1328 1401 1310 1310 1382 1310 1310 1382 1328 1328 1401 1329 1329 1402 1310 1310 1382 1329 1329 1402 1311 1311 1383 1311 1311 1383 1329 1329 1402 1330 1330 1403 1311 1311 1383 1330 1330 1403 1312 1312 1384 1312 1312 1384 1330 1330 1403 1331 1331 1404 1312 1312 1384 1331 1331 1404 1313 1313 1385 1313 1313 1385 1331 1331 1404 1314 1314 1405 1313 1313 1385 1314 1314 1405 1296 1296 1386 1314 1314 1387 1332 1332 1406 1333 1333 1407 1314 1314 1387 1333 1333 1407 1315 1315 1388 1315 1315 1388 1333 1333 1407 1334 1334 1408 1315 1315 1388 1334 1334 1408 1316 1316 1389 1316 1316 1389 1334 1334 1408 1335 1335 1409 1316 1316 1389 1335 1335 1409 1317 1317 1390 1317 1317 1390 1335 1335 1409 1336 1336 1410 1317 1317 1390 1336 1336 1410 1318 1318 1391 1318 1318 1391 1336 1336 1410 1337 1337 1411 1318 1318 1391 1337 1337 1411 1319 1319 1392 1319 1319 1392 1337 1337 1411 1338 1338 1412 1319 1319 1392 1338 1338 1412 1320 1320 1393 1320 1320 1393 1338 1338 1412 1339 1339 1413 1320 1320 1393 1339 1339 1413 1321 1321 1394 1321 1321 1394 1339 1339 1413 1340 1340 1414 1321 1321 1394 1340 1340 1414 1322 1322 1395 1322 1322 1395 1340 1340 1414 1341 1341 1415 1322 1322 1395 1341 1341 1415 1323 1323 1396 1323 1323 1396 1341 1341 1415 1342 1342 1416 1323 1323 1396 1342 1342 1416 1324 1324 1397 1324 1324 1397 1342 1342 1416 1343 1343 1417 1324 1324 1397 1343 1343 1417 1325 1325 1398 1325 1325 1398 1343 1343 1417 1344 1344 1418 1325 1325 1398 1344 1344 1418 1326 1326 1399 1326 1326 1399 1344 1344 1418 1345 1345 1419 1326 1326 1399 1345 1345 1419 1327 1327 1400 1327 1327 1400 1345 1345 1419 1346 1346 1420 1327 1327 1400 1346 1346 1420 1328 1328 1401 1328 1328 1401 1346 1346 1420 1347 1347 1421 1328 1328 1401 1347 1347 1421 1329 1329 1402 1329 1329 1402 1347 1347 1421 1348 1348 1422 1329 1329 1402 1348 1348 1422 1330 1330 1403 1330 1330 1403 1348 1348 1422 1349 1349 1423 1330 1330 1403 1349 1349 1423 1331 1331 1404 1331 1331 1404 1349 1349 1423 1332 1332 1424 1331 1331 1404 1332 1332 1424 1314 1314 1405 1332 1332 1406 1350 1350 1425 1351 1351 1426 1332 1332 1406 1351 1351 1426 1333 1333 1407 1333 1333 1407 1351 1351 1426 1352 1352 1427 1333 1333 1407 1352 1352 1427 1334 1334 1408 1334 1334 1408 1352 1352 1427 1353 1353 1428 1334 1334 1408 1353 1353 1428 1335 1335 1409 1335 1335 1409 1353 1353 1428 1354 1354 1429 1335 1335 1409 1354 1354 1429 1336 1336 1410 1336 1336 1410 1354 1354 1429 1355 1355 1430 1336 1336 1410 1355 1355 1430 1337 1337 1411 1337 1337 1411 1355 1355 1430 1356 1356 1431 1337 1337 1411 1356 1356 1431 1338 1338 1412 1338 1338 1412 1356 1356 1431 1357 1357 1432 1338 1338 1412 1357 1357 1432 1339 1339 1413 1339 1339 1413 1357 1357 1432 1358 1358 1433 1339 1339 1413 1358 1358 1433 1340 1340 1414 1340 1340 1414 1358 1358 1433 1359 1359 1434 1340 1340 1414 1359 1359 1434 1341 1341 1415 1341 1341 1415 1359 1359 1434 1360 1360 1435 1341 1341 1415 1360 1360 1435 1342 1342 1416 1342 1342 1416 1360 1360 1435 1361 1361 1436 1342 1342 1416 1361 1361 1436 1343 1343 1417 1343 1343 1417 1361 1361 1436 1362 1362 1437 1343 1343 1417 1362 1362 1437 1344 1344 1418 1344 1344 1418 1362 1362 1437 1363 1363 1438 1344 1344 1418 1363 1363 1438 1345 1345 1419 1345 1345 1419 1363 1363 1438 1364 1364 1439 1345 1345 1419 1364 1364 1439 1346 1346 1420 1346 1346 1420 1364 1364 1439 1365 1365 1440 1346 1346 1420 1365 1365 1440 1347 1347 1421 1347 1347 1421 1365 1365 1440 1366 1366 1441 1347 1347 1421 1366 1366 1441 1348 1348 1422 1348 1348 1422 1366 1366 1441 1367 1367 1442 1348 1348 1422 1367 1367 1442 1349 1349 1423 1349 1349 1423 1367 1367 1442 1350 1350 1443 1349 1349 1423 1350 1350 1443 1332 1332 1424 1350 1350 1425 1368 1368 1444 1369 1369 1445 1350 1350 1425 1369 1369 1445 1351 1351 1426 1351 1351 1426 1369 1369 1445 1370 1370 1446 1351 1351 1426 1370 1370 1446 1352 1352 1427 1352 1352 1427 1370 1370 1446 1371 1371 1447 1352 1352 1427 1371 1371 1447 1353 1353 1428 1353 1353 1428 1371 1371 1447 1372 1372 1448 1353 1353 1428 1372 1372 1448 1354 1354 1429 1354 1354 1429 1372 1372 1448 1373 1373 1449 1354 1354 1429 1373 1373 1449 1355 1355 1430 1355 1355 1430 1373 1373 1449 1374 1374 1450 1355 1355 1430 1374 1374 1450 1356 1356 1431 1356 1356 1431 1374 1374 1450 1375 1375 1451 1356 1356 1431 1375 1375 1451 1357 1357 1432 1357 1357 1432 1375 1375 1451 1376 1376 1452 1357 1357 1432 1376 1376 1452 1358 1358 1433 1358 1358 1433 1376 1376 1452 1377 1377 1453 1358 1358 1433 1377 1377 1453 1359 1359 1434 1359 1359 1434 1377 1377 1453 1378 1378 1454 1359 1359 1434 1378 1378 1454 1360 1360 1435 1360 1360 1435 1378 1378 1454 1379 1379 1455 1360 1360 1435 1379 1379 1455 1361 1361 1436 1361 1361 1436 1379 1379 1455 1380 1380 1456 1361 1361 1436 1380 1380 1456 1362 1362 1437 1362 1362 1437 1380 1380 1456 1381 1381 1457 1362 1362 1437 1381 1381 1457 1363 1363 1438 1363 1363 1438 1381 1381 1457 1382 1382 1458 1363 1363 1438 1382 1382 1458 1364 1364 1439 1364 1364 1439 1382 1382 1458 1383 1383 1459 1364 1364 1439 1383 1383 1459 1365 1365 1440 1365 1365 1440 1383 1383 1459 1384 1384 1460 1365 1365 1440 1384 1384 1460 1366 1366 1441 1366 1366 1441 1384 1384 1460 1385 1385 1461 1366 1366 1441 1385 1385 1461 1367 1367 1442 1367 1367 1442 1385 1385 1461 1368 1368 1462 1367 1367 1442 1368 1368 1462 1350 1350 1443 1368 1368 1444 1386 1386 1463 1387 1387 1464 1368 1368 1444 1387 1387 1464 1369 1369 1445 1369 1369 1445 1387 1387 1464 1388 1388 1465 1369 1369 1445 1388 1388 1465 1370 1370 1446 1370 1370 1446 1388 1388 1465 1389 1389 1466 1370 1370 1446 1389 1389 1466 1371 1371 1447 1371 1371 1447 1389 1389 1466 1390 1390 1467 1371 1371 1447 1390 1390 1467 1372 1372 1448 1372 1372 1448 1390 1390 1467 1391 1391 1468 1372 1372 1448 1391 1391 1468 1373 1373 1449 1373 1373 1449 1391 1391 1468 1392 1392 1469 1373 1373 1449 1392 1392 1469 1374 1374 1450 1374 1374 1450 1392 1392 1469 1393 1393 1470 1374 1374 1450 1393 1393 1470 1375 1375 1451 1375 1375 1451 1393 1393 1470 1394 1394 1471 1375 1375 1451 1394 1394 1471 1376 1376 1452 1376 1376 1452 1394 1394 1471 1395 1395 1472 1376 1376 1452 1395 1395 1472 1377 1377 1453 1377 1377 1453 1395 1395 1472 1396 1396 1473 1377 1377 1453 1396 1396 1473 1378 1378 1454 1378 1378 1454 1396 1396 1473 1397 1397 1474 1378 1378 1454 1397 1397 1474 1379 1379 1455 1379 1379 1455 1397 1397 1474 1398 1398 1475 1379 1379 1455 1398 1398 1475 1380 1380 1456 1380 1380 1456 1398 1398 1475 1399 1399 1476 1380 1380 1456 1399 1399 1476 1381 1381 1457 1381 1381 1457 1399 1399 1476 1400 1400 1477 1381 1381 1457 1400 1400 1477 1382 1382 1458 1382 1382 1458 1400 1400 1477 1401 1401 1478 1382 1382 1458 1401 1401 1478 1383 1383 1459 1383 1383 1459 1401 1401 1478 1402 1402 1479 1383 1383 1459 1402 1402 1479 1384 1384 1460 1384 1384 1460 1402 1402 1479 1403 1403 1480 1384 1384 1460 1403 1403 1480 1385 1385 1461 1385 1385 1461 1403 1403 1480 1386 1386 1481 1385 1385 1461 1386 1386 1481 1368 1368 1462 1386 1386 1463 1404 1404 1482 1405 1405 1483 1386 1386 1463 1405 1405 1483 1387 1387 1464 1387 1387 1464 1405 1405 1483 1406 1406 1484 1387 1387 1464 1406 1406 1484 1388 1388 1465 1388 1388 1465 1406 1406 1484 1407 1407 1485 1388 1388 1465 1407 1407 1485 1389 1389 1466 1389 1389 1466 1407 1407 1485 1408 1408 1486 1389 1389 1466 1408 1408 1486 1390 1390 1467 1390 1390 1467 1408 1408 1486 1409 1409 1487 1390 1390 1467 1409 1409 1487 1391 1391 1468 1391 1391 1468 1409 1409 1487 1410 1410 1488 1391 1391 1468 1410 1410 1488 1392 1392 1469 1392 1392 1469 1410 1410 1488 1411 1411 1489 1392 1392 1469 1411 1411 1489 1393 1393 1470 1393 1393 1470 1411 1411 1489 1412 1412 1490 1393 1393 1470 1412 1412 1490 1394 1394 1471 1394 1394 1471 1412 1412 1490 1413 1413 1491 1394 1394 1471 1413 1413 1491 1395 1395 1472 1395 1395 1472 1413 1413 1491 1414 1414 1492 1395 1395 1472 1414 1414 1492 1396 1396 1473 1396 1396 1473 1414 1414 1492 1415 1415 1493 1396 1396 1473 1415 1415 1493 1397 1397 1474 1397 1397 1474 1415 1415 1493 1416 1416 1494 1397 1397 1474 1416 1416 1494 1398 1398 1475 1398 1398 1475 1416 1416 1494 1417 1417 1495 1398 1398 1475 1417 1417 1495 1399 1399 1476 1399 1399 1476 1417 1417 1495 1418 1418 1496 1399 1399 1476 1418 1418 1496 1400 1400 1477 1400 1400 1477 1418 1418 1496 1419 1419 1497 1400 1400 1477 1419 1419 1497 1401 1401 1478 1401 1401 1478 1419 1419 1497 1420 1420 1498 1401 1401 1478 1420 1420 1498 1402 1402 1479 1402 1402 1479 1420 1420 1498 1421 1421 1499 1402 1402 1479 1421 1421 1499 1403 1403 1480 1403 1403 1480 1421 1421 1499 1404 1404 1500 1403 1403 1480 1404 1404 1500 1386 1386 1481 1404 1404 1482 1422 1422 1501 1423 1423 1502 1404 1404 1482 1423 1423 1502 1405 1405 1483 1405 1405 1483 1423 1423 1502 1424 1424 1503 1405 1405 1483 1424 1424 1503 1406 1406 1484 1406 1406 1484 1424 1424 1503 1425 1425 1504 1406 1406 1484 1425 1425 1504 1407 1407 1485 1407 1407 1485 1425 1425 1504 1426 1426 1505 1407 1407 1485 1426 1426 1505 1408 1408 1486 1408 1408 1486 1426 1426 1505 1427 1427 1506 1408 1408 1486 1427 1427 1506 1409 1409 1487 1409 1409 1487 1427 1427 1506 1428 1428 1507 1409 1409 1487 1428 1428 1507 1410 1410 1488 1410 1410 1488 1428 1428 1507 1429 1429 1508 1410 1410 1488 1429 1429 1508 1411 1411 1489 1411 1411 1489 1429 1429 1508 1430 1430 1509 1411 1411 1489 1430 1430 1509 1412 1412 1490 1412 1412 1490 1430 1430 1509 1431 1431 1510 1412 1412 1490 1431 1431 1510 1413 1413 1491 1413 1413 1491 1431 1431 1510 1432 1432 1511 1413 1413 1491 1432 1432 1511 1414 1414 1492 1414 1414 1492 1432 1432 1511 1433 1433 1512 1414 1414 1492 1433 1433 1512 1415 1415 1493 1415 1415 1493 1433 1433 1512 1434 1434 1513 1415 1415 1493 1434 1434 1513 1416 1416 1494 1416 1416 1494 1434 1434 1513 1435 1435 1514 1416 1416 1494 1435 1435 1514 1417 1417 1495 1417 1417 1495 1435 1435 1514 1436 1436 1515 1417 1417 1495 1436 1436 1515 1418 1418 1496 1418 1418 1496 1436 1436 1515 1437 1437 1516 1418 1418 1496 1437 1437 1516 1419 1419 1497 1419 1419 1497 1437 1437 1516 1438 1438 1517 1419 1419 1497 1438 1438 1517 1420 1420 1498 1420 1420 1498 1438 1438 1517 1439 1439 1518 1420 1420 1498 1439 1439 1518 1421 1421 1499 1421 1421 1499 1439 1439 1518 1422 1422 1519 1421 1421 1499 1422 1422 1519 1404 1404 1500 1422 1422 1501 1440 1440 1520 1441 1441 1521 1422 1422 1501 1441 1441 1521 1423 1423 1502 1423 1423 1502 1441 1441 1521 1442 1442 1522 1423 1423 1502 1442 1442 1522 1424 1424 1503 1424 1424 1503 1442 1442 1522 1443 1443 1523 1424 1424 1503 1443 1443 1523 1425 1425 1504 1425 1425 1504 1443 1443 1523 1444 1444 1524 1425 1425 1504 1444 1444 1524 1426 1426 1505 1426 1426 1505 1444 1444 1524 1445 1445 1525 1426 1426 1505 1445 1445 1525 1427 1427 1506 1427 1427 1506 1445 1445 1525 1446 1446 1526 1427 1427 1506 1446 1446 1526 1428 1428 1507 1428 1428 1507 1446 1446 1526 1447 1447 1527 1428 1428 1507 1447 1447 1527 1429 1429 1508 1429 1429 1508 1447 1447 1527 1448 1448 1528 1429 1429 1508 1448 1448 1528 1430 1430 1509 1430 1430 1509 1448 1448 1528 1449 1449 1529 1430 1430 1509 1449 1449 1529 1431 1431 1510 1431 1431 1510 1449 1449 1529 1450 1450 1530 1431 1431 1510 1450 1450 1530 1432 1432 1511 1432 1432 1511 1450 1450 1530 1451 1451 1531 1432 1432 1511 1451 1451 1531 1433 1433 1512 1433 1433 1512 1451 1451 1531 1452 1452 1532 1433 1433 1512 1452 1452 1532 1434 1434 1513 1434 1434 1513 1452 1452 1532 1453 1453 1533 1434 1434 1513 1453 1453 1533 1435 1435 1514 1435 1435 1514 1453 1453 1533 1454 1454 1534 1435 1435 1514 1454 1454 1534 1436 1436 1515 1436 1436 1515 1454 1454 1534 1455 1455 1535 1436 1436 1515 1455 1455 1535 1437 1437 1516 1437 1437 1516 1455 1455 1535 1456 1456 1536 1437 1437 1516 1456 1456 1536 1438 1438 1517 1438 1438 1517 1456 1456 1536 1457 1457 1537 1438 1438 1517 1457 1457 1537 1439 1439 1518 1439 1439 1518 1457 1457 1537 1440 1440 1538 1439 1439 1518 1440 1440 1538 1422 1422 1519 1440 1440 1520 1458 1458 1539 1459 1459 1540 1440 1440 1520 1459 1459 1540 1441 1441 1521 1441 1441 1521 1459 1459 1540 1460 1460 1541 1441 1441 1521 1460 1460 1541 1442 1442 1522 1442 1442 1522 1460 1460 1541 1461 1461 1542 1442 1442 1522 1461 1461 1542 1443 1443 1523 1443 1443 1523 1461 1461 1542 1462 1462 1543 1443 1443 1523 1462 1462 1543 1444 1444 1524 1444 1444 1524 1462 1462 1543 1463 1463 1544 1444 1444 1524 1463 1463 1544 1445 1445 1525 1445 1445 1525 1463 1463 1544 1464 1464 1545 1445 1445 1525 1464 1464 1545 1446 1446 1526 1446 1446 1526 1464 1464 1545 1465 1465 1546 1446 1446 1526 1465 1465 1546 1447 1447 1527 1447 1447 1527 1465 1465 1546 1466 1466 1547 1447 1447 1527 1466 1466 1547 1448 1448 1528 1448 1448 1528 1466 1466 1547 1467 1467 1548 1448 1448 1528 1467 1467 1548 1449 1449 1529 1449 1449 1529 1467 1467 1548 1468 1468 1549 1449 1449 1529 1468 1468 1549 1450 1450 1530 1450 1450 1530 1468 1468 1549 1469 1469 1550 1450 1450 1530 1469 1469 1550 1451 1451 1531 1451 1451 1531 1469 1469 1550 1470 1470 1551 1451 1451 1531 1470 1470 1551 1452 1452 1532 1452 1452 1532 1470 1470 1551 1471 1471 1552 1452 1452 1532 1471 1471 1552 1453 1453 1533 1453 1453 1533 1471 1471 1552 1472 1472 1553 1453 1453 1533 1472 1472 1553 1454 1454 1534 1454 1454 1534 1472 1472 1553 1473 1473 1554 1454 1454 1534 1473 1473 1554 1455 1455 1535 1455 1455 1535 1473 1473 1554 1474 1474 1555 1455 1455 1535 1474 1474 1555 1456 1456 1536 1456 1456 1536 1474 1474 1555 1475 1475 1556 1456 1456 1536 1475 1475 1556 1457 1457 1537 1457 1457 1537 1475 1475 1556 1458 1458 1557 1457 1457 1537 1458 1458 1557 1440 1440 1538 1458 1458 1539 1476 1476 1558 1477 1477 1559 1458 1458 1539 1477 1477 1559 1459 1459 1540 1459 1459 1540 1477 1477 1559 1478 1478 1560 1459 1459 1540 1478 1478 1560 1460 1460 1541 1460 1460 1541 1478 1478 1560 1479 1479 1561 1460 1460 1541 1479 1479 1561 1461 1461 1542 1461 1461 1542 1479 1479 1561 1480 1480 1562 1461 1461 1542 1480 1480 1562 1462 1462 1543 1462 1462 1543 1480 1480 1562 1481 1481 1563 1462 1462 1543 1481 1481 1563 1463 1463 1544 1463 1463 1544 1481 1481 1563 1482 1482 1564 1463 1463 1544 1482 1482 1564 1464 1464 1545 1464 1464 1545 1482 1482 1564 1483 1483 1565 1464 1464 1545 1483 1483 1565 1465 1465 1546 1465 1465 1546 1483 1483 1565 1484 1484 1566 1465 1465 1546 1484 1484 1566 1466 1466 1547 1466 1466 1547 1484 1484 1566 1485 1485 1567 1466 1466 1547 1485 1485 1567 1467 1467 1548 1467 1467 1548 1485 1485 1567 1486 1486 1568 1467 1467 1548 1486 1486 1568 1468 1468 1549 1468 1468 1549 1486 1486 1568 1487 1487 1569 1468 1468 1549 1487 1487 1569 1469 1469 1550 1469 1469 1550 1487 1487 1569 1488 1488 1570 1469 1469 1550 1488 1488 1570 1470 1470 1551 1470 1470 1551 1488 1488 1570 1489 1489 1571 1470 1470 1551 1489 1489 1571 1471 1471 1552 1471 1471 1552 1489 1489 1571 1490 1490 1572 1471 1471 1552 1490 1490 1572 1472 1472 1553 1472 1472 1553 1490 1490 1572 1491 1491 1573 1472 1472 1553 1491 1491 1573 1473 1473 1554 1473 1473 1554 1491 1491 1573 1492 1492 1574 1473 1473 1554 1492 1492 1574 1474 1474 1555 1474 1474 1555 1492 1492 1574 1493 1493 1575 1474 1474 1555 1493 1493 1575 1475 1475 1556 1475 1475 1556 1493 1493 1575 1476 1476 1576 1475 1475 1556 1476 1476 1576 1458 1458 1557 1476 1476 1558 1494 1494 1577 1495 1495 1578 1476 1476 1558 1495 1495 1578 1477 1477 1559 1477 1477 1559 1495 1495 1578 1496 1496 1579 1477 1477 1559 1496 1496 1579 1478 1478 1560 1478 1478 1560 1496 1496 1579 1497 1497 1580 1478 1478 1560 1497 1497 1580 1479 1479 1561 1479 1479 1561 1497 1497 1580 1498 1498 1581 1479 1479 1561 1498 1498 1581 1480 1480 1562 1480 1480 1562 1498 1498 1581 1499 1499 1582 1480 1480 1562 1499 1499 1582 1481 1481 1563 1481 1481 1563 1499 1499 1582 1500 1500 1583 1481 1481 1563 1500 1500 1583 1482 1482 1564 1482 1482 1564 1500 1500 1583 1501 1501 1584 1482 1482 1564 1501 1501 1584 1483 1483 1565 1483 1483 1565 1501 1501 1584 1502 1502 1585 1483 1483 1565 1502 1502 1585 1484 1484 1566 1484 1484 1566 1502 1502 1585 1503 1503 1586 1484 1484 1566 1503 1503 1586 1485 1485 1567 1485 1485 1567 1503 1503 1586 1504 1504 1587 1485 1485 1567 1504 1504 1587 1486 1486 1568 1486 1486 1568 1504 1504 1587 1505 1505 1588 1486 1486 1568 1505 1505 1588 1487 1487 1569 1487 1487 1569 1505 1505 1588 1506 1506 1589 1487 1487 1569 1506 1506 1589 1488 1488 1570 1488 1488 1570 1506 1506 1589 1507 1507 1590 1488 1488 1570 1507 1507 1590 1489 1489 1571 1489 1489 1571 1507 1507 1590 1508 1508 1591 1489 1489 1571 1508 1508 1591 1490 1490 1572 1490 1490 1572 1508 1508 1591 1509 1509 1592 1490 1490 1572 1509 1509 1592 1491 1491 1573 1491 1491 1573 1509 1509 1592 1510 1510 1593 1491 1491 1573 1510 1510 1593 1492 1492 1574 1492 1492 1574 1510 1510 1593 1511 1511 1594 1492 1492 1574 1511 1511 1594 1493 1493 1575 1493 1493 1575 1511 1511 1594 1494 1494 1595 1493 1493 1575 1494 1494 1595 1476 1476 1576 1494 1494 1577 1512 1512 1596 1513 1513 1597 1494 1494 1577 1513 1513 1597 1495 1495 1578 1495 1495 1578 1513 1513 1597 1514 1514 1598 1495 1495 1578 1514 1514 1598 1496 1496 1579 1496 1496 1579 1514 1514 1598 1515 1515 1599 1496 1496 1579 1515 1515 1599 1497 1497 1580 1497 1497 1580 1515 1515 1599 1516 1516 1600 1497 1497 1580 1516 1516 1600 1498 1498 1581 1498 1498 1581 1516 1516 1600 1517 1517 1601 1498 1498 1581 1517 1517 1601 1499 1499 1582 1499 1499 1582 1517 1517 1601 1518 1518 1602 1499 1499 1582 1518 1518 1602 1500 1500 1583 1500 1500 1583 1518 1518 1602 1519 1519 1603 1500 1500 1583 1519 1519 1603 1501 1501 1584 1501 1501 1584 1519 1519 1603 1520 1520 1604 1501 1501 1584 1520 1520 1604 1502 1502 1585 1502 1502 1585 1520 1520 1604 1521 1521 1605 1502 1502 1585 1521 1521 1605 1503 1503 1586 1503 1503 1586 1521 1521 1605 1522 1522 1606 1503 1503 1586 1522 1522 1606 1504 1504 1587 1504 1504 1587 1522 1522 1606 1523 1523 1607 1504 1504 1587 1523 1523 1607 1505 1505 1588 1505 1505 1588 1523 1523 1607 1524 1524 1608 1505 1505 1588 1524 1524 1608 1506 1506 1589 1506 1506 1589 1524 1524 1608 1525 1525 1609 1506 1506 1589 1525 1525 1609 1507 1507 1590 1507 1507 1590 1525 1525 1609 1526 1526 1610 1507 1507 1590 1526 1526 1610 1508 1508 1591 1508 1508 1591 1526 1526 1610 1527 1527 1611 1508 1508 1591 1527 1527 1611 1509 1509 1592 1509 1509 1592 1527 1527 1611 1528 1528 1612 1509 1509 1592 1528 1528 1612 1510 1510 1593 1510 1510 1593 1528 1528 1612 1529 1529 1613 1510 1510 1593 1529 1529 1613 1511 1511 1594 1511 1511 1594 1529 1529 1613 1512 1512 1614 1511 1511 1594 1512 1512 1614 1494 1494 1595 1512 1512 1596 1530 1530 1615 1531 1531 1616 1512 1512 1596 1531 1531 1616 1513 1513 1597 1513 1513 1597 1531 1531 1616 1532 1532 1617 1513 1513 1597 1532 1532 1617 1514 1514 1598 1514 1514 1598 1532 1532 1617 1533 1533 1618 1514 1514 1598 1533 1533 1618 1515 1515 1599 1515 1515 1599 1533 1533 1618 1534 1534 1619 1515 1515 1599 1534 1534 1619 1516 1516 1600 1516 1516 1600 1534 1534 1619 1535 1535 1620 1516 1516 1600 1535 1535 1620 1517 1517 1601 1517 1517 1601 1535 1535 1620 1536 1536 1621 1517 1517 1601 1536 1536 1621 1518 1518 1602 1518 1518 1602 1536 1536 1621 1537 1537 1622 1518 1518 1602 1537 1537 1622 1519 1519 1603 1519 1519 1603 1537 1537 1622 1538 1538 1623 1519 1519 1603 1538 1538 1623 1520 1520 1604 1520 1520 1604 1538 1538 1623 1539 1539 1624 1520 1520 1604 1539 1539 1624 1521 1521 1605 1521 1521 1605 1539 1539 1624 1540 1540 1625 1521 1521 1605 1540 1540 1625 1522 1522 1606 1522 1522 1606 1540 1540 1625 1541 1541 1626 1522 1522 1606 1541 1541 1626 1523 1523 1607 1523 1523 1607 1541 1541 1626 1542 1542 1627 1523 1523 1607 1542 1542 1627 1524 1524 1608 1524 1524 1608 1542 1542 1627 1543 1543 1628 1524 1524 1608 1543 1543 1628 1525 1525 1609 1525 1525 1609 1543 1543 1628 1544 1544 1629 1525 1525 1609 1544 1544 1629 1526 1526 1610 1526 1526 1610 1544 1544 1629 1545 1545 1630 1526 1526 1610 1545 1545 1630 1527 1527 1611 1527 1527 1611 1545 1545 1630 1546 1546 1631 1527 1527 1611 1546 1546 1631 1528 1528 1612 1528 1528 1612 1546 1546 1631 1547 1547 1632 1528 1528 1612 1547 1547 1632 1529 1529 1613 1529 1529 1613 1547 1547 1632 1530 1530 1633 1529 1529 1613 1530 1530 1633 1512 1512 1614 1530 1530 1615 1548 1548 1634 1549 1549 1635 1530 1530 1615 1549 1549 1635 1531 1531 1616 1531 1531 1616 1549 1549 1635 1550 1550 1636 1531 1531 1616 1550 1550 1636 1532 1532 1617 1532 1532 1617 1550 1550 1636 1551 1551 1637 1532 1532 1617 1551 1551 1637 1533 1533 1618 1533 1533 1618 1551 1551 1637 1552 1552 1638 1533 1533 1618 1552 1552 1638 1534 1534 1619 1534 1534 1619 1552 1552 1638 1553 1553 1639 1534 1534 1619 1553 1553 1639 1535 1535 1620 1535 1535 1620 1553 1553 1639 1554 1554 1640 1535 1535 1620 1554 1554 1640 1536 1536 1621 1536 1536 1621 1554 1554 1640 1555 1555 1641 1536 1536 1621 1555 1555 1641 1537 1537 1622 1537 1537 1622 1555 1555 1641 1556 1556 1642 1537 1537 1622 1556 1556 1642 1538 1538 1623 1538 1538 1623 1556 1556 1642 1557 1557 1643 1538 1538 1623 1557 1557 1643 1539 1539 1624 1539 1539 1624 1557 1557 1643 1558 1558 1644 1539 1539 1624 1558 1558 1644 1540 1540 1625 1540 1540 1625 1558 1558 1644 1559 1559 1645 1540 1540 1625 1559 1559 1645 1541 1541 1626 1541 1541 1626 1559 1559 1645 1560 1560 1646 1541 1541 1626 1560 1560 1646 1542 1542 1627 1542 1542 1627 1560 1560 1646 1561 1561 1647 1542 1542 1627 1561 1561 1647 1543 1543 1628 1543 1543 1628 1561 1561 1647 1562 1562 1648 1543 1543 1628 1562 1562 1648 1544 1544 1629 1544 1544 1629 1562 1562 1648 1563 1563 1649 1544 1544 1629 1563 1563 1649 1545 1545 1630 1545 1545 1630 1563 1563 1649 1564 1564 1650 1545 1545 1630 1564 1564 1650 1546 1546 1631 1546 1546 1631 1564 1564 1650 1565 1565 1651 1546 1546 1631 1565 1565 1651 1547 1547 1632 1547 1547 1632 1565 1565 1651 1548 1548 1652 1547 1547 1632 1548 1548 1652 1530 1530 1633 1548 1548 1634 1566 1566 1653 1567 1567 1654 1548 1548 1634 1567 1567 1654 1549 1549 1635 1549 1549 1635 1567 1567 1654 1568 1568 1655 1549 1549 1635 1568 1568 1655 1550 1550 1636 1550 1550 1636 1568 1568 1655 1569 1569 1656 1550 1550 1636 1569 1569 1656 1551 1551 1637 1551 1551 1637 1569 1569 1656 1570 1570 1657 1551 1551 1637 1570 1570 1657 1552 1552 1638 1552 1552 1638 1570 1570 1657 1571 1571 1658 1552 1552 1638 1571 1571 1658 1553 1553 1639 1553 1553 1639 1571 1571 1658 1572 1572 1659 1553 1553 1639 1572 1572 1659 1554 1554 1640 1554 1554 1640 1572 1572 1659 1573 1573 1660 1554 1554 1640 1573 1573 1660 1555 1555 1641 1555 1555 1641 1573 1573 1660 1574 1574 1661 1555 1555 1641 1574 1574 1661 1556 1556 1642 1556 1556 1642 1574 1574 1661 1575 1575 1662 1556 1556 1642 1575 1575 1662 1557 1557 1643 1557 1557 1643 1575 1575 1662 1576 1576 1663 1557 1557 1643 1576 1576 1663 1558 1558 1644 1558 1558 1644 1576 1576 1663 1577 1577 1664 1558 1558 1644 1577 1577 1664 1559 1559 1645 1559 1559 1645 1577 1577 1664 1578 1578 1665 1559 1559 1645 1578 1578 1665 1560 1560 1646 1560 1560 1646 1578 1578 1665 1579 1579 1666 1560 1560 1646 1579 1579 1666 1561 1561 1647 1561 1561 1647 1579 1579 1666 1580 1580 1667 1561 1561 1647 1580 1580 1667 1562 1562 1648 1562 1562 1648 1580 1580 1667 1581 1581 1668 1562 1562 1648 1581 1581 1668 1563 1563 1649 1563 1563 1649 1581 1581 1668 1582 1582 1669 1563 1563 1649 1582 1582 1669 1564 1564 1650 1564 1564 1650 1582 1582 1669 1583 1583 1670 1564 1564 1650 1583 1583 1670 1565 1565 1651 1565 1565 1651 1583 1583 1670 1566 1566 1671 1565 1565 1651 1566 1566 1671 1548 1548 1652 1566 1566 1653 1584 1584 1672 1585 1585 1673 1566 1566 1653 1585 1585 1673 1567 1567 1654 1567 1567 1654 1585 1585 1673 1586 1586 1674 1567 1567 1654 1586 1586 1674 1568 1568 1655 1568 1568 1655 1586 1586 1674 1587 1587 1675 1568 1568 1655 1587 1587 1675 1569 1569 1656 1569 1569 1656 1587 1587 1675 1588 1588 1676 1569 1569 1656 1588 1588 1676 1570 1570 1657 1570 1570 1657 1588 1588 1676 1589 1589 1677 1570 1570 1657 1589 1589 1677 1571 1571 1658 1571 1571 1658 1589 1589 1677 1590 1590 1678 1571 1571 1658 1590 1590 1678 1572 1572 1659 1572 1572 1659 1590 1590 1678 1591 1591 1679 1572 1572 1659 1591 1591 1679 1573 1573 1660 1573 1573 1660 1591 1591 1679 1592 1592 1680 1573 1573 1660 1592 1592 1680 1574 1574 1661 1574 1574 1661 1592 1592 1680 1593 1593 1681 1574 1574 1661 1593 1593 1681 1575 1575 1662 1575 1575 1662 1593 1593 1681 1594 1594 1682 1575 1575 1662 1594 1594 1682 1576 1576 1663 1576 1576 1663 1594 1594 1682 1595 1595 1683 1576 1576 1663 1595 1595 1683 1577 1577 1664 1577 1577 1664 1595 1595 1683 1596 1596 1684 1577 1577 1664 1596 1596 1684 1578 1578 1665 1578 1578 1665 1596 1596 1684 1597 1597 1685 1578 1578 1665 1597 1597 1685 1579 1579 1666 1579 1579 1666 1597 1597 1685 1598 1598 1686 1579 1579 1666 1598 1598 1686 1580 1580 1667 1580 1580 1667 1598 1598 1686 1599 1599 1687 1580 1580 1667 1599 1599 1687 1581 1581 1668 1581 1581 1668 1599 1599 1687 1600 1600 1688 1581 1581 1668 1600 1600 1688 1582 1582 1669 1582 1582 1669 1600 1600 1688 1601 1601 1689 1582 1582 1669 1601 1601 1689 1583 1583 1670 1583 1583 1670 1601 1601 1689 1584 1584 1690 1583 1583 1670 1584 1584 1690 1566 1566 1671 1584 1584 1672 1602 1602 1691 1603 1603 1692 1584 1584 1672 1603 1603 1692 1585 1585 1673 1585 1585 1673 1603 1603 1692 1604 1604 1693 1585 1585 1673 1604 1604 1693 1586 1586 1674 1586 1586 1674 1604 1604 1693 1605 1605 1694 1586 1586 1674 1605 1605 1694 1587 1587 1675 1587 1587 1675 1605 1605 1694 1606 1606 1695 1587 1587 1675 1606 1606 1695 1588 1588 1676 1588 1588 1676 1606 1606 1695 1607 1607 1696 1588 1588 1676 1607 1607 1696 1589 1589 1677 1589 1589 1677 1607 1607 1696 1608 1608 1697 1589 1589 1677 1608 1608 1697 1590 1590 1678 1590 1590 1678 1608 1608 1697 1609 1609 1698 1590 1590 1678 1609 1609 1698 1591 1591 1679 1591 1591 1679 1609 1609 1698 1610 1610 1699 1591 1591 1679 1610 1610 1699 1592 1592 1680 1592 1592 1680 1610 1610 1699 1611 1611 1700 1592 1592 1680 1611 1611 1700 1593 1593 1681 1593 1593 1681 1611 1611 1700 1612 1612 1701 1593 1593 1681 1612 1612 1701 1594 1594 1682 1594 1594 1682 1612 1612 1701 1613 1613 1702 1594 1594 1682 1613 1613 1702 1595 1595 1683 1595 1595 1683 1613 1613 1702 1614 1614 1703 1595 1595 1683 1614 1614 1703 1596 1596 1684 1596 1596 1684 1614 1614 1703 1615 1615 1704 1596 1596 1684 1615 1615 1704 1597 1597 1685 1597 1597 1685 1615 1615 1704 1616 1616 1705 1597 1597 1685 1616 1616 1705 1598 1598 1686 1598 1598 1686 1616 1616 1705 1617 1617 1706 1598 1598 1686 1617 1617 1706 1599 1599 1687 1599 1599 1687 1617 1617 1706 1618 1618 1707 1599 1599 1687 1618 1618 1707 1600 1600 1688 1600 1600 1688 1618 1618 1707 1619 1619 1708 1600 1600 1688 1619 1619 1708 1601 1601 1689 1601 1601 1689 1619 1619 1708 1602 1602 1709 1601 1601 1689 1602 1602 1709 1584 1584 1690 1602 1602 1691 1620 1620 1710 1621 1621 1711 1602 1602 1691 1621 1621 1711 1603 1603 1692 1603 1603 1692 1621 1621 1711 1622 1622 1712 1603 1603 1692 1622 1622 1712 1604 1604 1693 1604 1604 1693 1622 1622 1712 1623 1623 1713 1604 1604 1693 1623 1623 1713 1605 1605 1694 1605 1605 1694 1623 1623 1713 1624 1624 1714 1605 1605 1694 1624 1624 1714 1606 1606 1695 1606 1606 1695 1624 1624 1714 1625 1625 1715 1606 1606 1695 1625 1625 1715 1607 1607 1696 1607 1607 1696 1625 1625 1715 1626 1626 1716 1607 1607 1696 1626 1626 1716 1608 1608 1697 1608 1608 1697 1626 1626 1716 1627 1627 1717 1608 1608 1697 1627 1627 1717 1609 1609 1698 1609 1609 1698 1627 1627 1717 1628 1628 1718 1609 1609 1698 1628 1628 1718 1610 1610 1699 1610 1610 1699 1628 1628 1718 1629 1629 1719 1610 1610 1699 1629 1629 1719 1611 1611 1700 1611 1611 1700 1629 1629 1719 1630 1630 1720 1611 1611 1700 1630 1630 1720 1612 1612 1701 1612 1612 1701 1630 1630 1720 1631 1631 1721 1612 1612 1701 1631 1631 1721 1613 1613 1702 1613 1613 1702 1631 1631 1721 1632 1632 1722 1613 1613 1702 1632 1632 1722 1614 1614 1703 1614 1614 1703 1632 1632 1722 1633 1633 1723 1614 1614 1703 1633 1633 1723 1615 1615 1704 1615 1615 1704 1633 1633 1723 1634 1634 1724 1615 1615 1704 1634 1634 1724 1616 1616 1705 1616 1616 1705 1634 1634 1724 1635 1635 1725 1616 1616 1705 1635 1635 1725 1617 1617 1706 1617 1617 1706 1635 1635 1725 1636 1636 1726 1617 1617 1706 1636 1636 1726 1618 1618 1707 1618 1618 1707 1636 1636 1726 1637 1637 1727 1618 1618 1707 1637 1637 1727 1619 1619 1708 1619 1619 1708 1637 1637 1727 1620 1620 1728 1619 1619 1708 1620 1620 1728 1602 1602 1709 1620 1620 1710 1638 1638 1729 1639 1639 1730 1620 1620 1710 1639 1639 1730 1621 1621 1711 1621 1621 1711 1639 1639 1730 1640 1640 1731 1621 1621 1711 1640 1640 1731 1622 1622 1712 1622 1622 1712 1640 1640 1731 1641 1641 1732 1622 1622 1712 1641 1641 1732 1623 1623 1713 1623 1623 1713 1641 1641 1732 1642 1642 1733 1623 1623 1713 1642 1642 1733 1624 1624 1714 1624 1624 1714 1642 1642 1733 1643 1643 1734 1624 1624 1714 1643 1643 1734 1625 1625 1715 1625 1625 1715 1643 1643 1734 1644 1644 1735 1625 1625 1715 1644 1644 1735 1626 1626 1716 1626 1626 1716 1644 1644 1735 1645 1645 1736 1626 1626 1716 1645 1645 1736 1627 1627 1717 1627 1627 1717 1645 1645 1736 1646 1646 1737 1627 1627 1717 1646 1646 1737 1628 1628 1718 1628 1628 1718 1646 1646 1737 1647 1647 1738 1628 1628 1718 1647 1647 1738 1629 1629 1719 1629 1629 1719 1647 1647 1738 1648 1648 1739 1629 1629 1719 1648 1648 1739 1630 1630 1720 1630 1630 1720 1648 1648 1739 1649 1649 1740 1630 1630 1720 1649 1649 1740 1631 1631 1721 1631 1631 1721 1649 1649 1740 1650 1650 1741 1631 1631 1721 1650 1650 1741 1632 1632 1722 1632 1632 1722 1650 1650 1741 1651 1651 1742 1632 1632 1722 1651 1651 1742 1633 1633 1723 1633 1633 1723 1651 1651 1742 1652 1652 1743 1633 1633 1723 1652 1652 1743 1634 1634 1724 1634 1634 1724 1652 1652 1743 1653 1653 1744 1634 1634 1724 1653 1653 1744 1635 1635 1725 1635 1635 1725 1653 1653 1744 1654 1654 1745 1635 1635 1725 1654 1654 1745 1636 1636 1726 1636 1636 1726 1654 1654 1745 1655 1655 1746 1636 1636 1726 1655 1655 1746 1637 1637 1727 1637 1637 1727 1655 1655 1746 1638 1638 1747 1637 1637 1727 1638 1638 1747 1620 1620 1728 1638 1638 1729 1656 1656 1748 1657 1657 1749 1638 1638 1729 1657 1657 1749 1639 1639 1730 1639 1639 1730 1657 1657 1749 1658 1658 1750 1639 1639 1730 1658 1658 1750 1640 1640 1731 1640 1640 1731 1658 1658 1750 1659 1659 1751 1640 1640 1731 1659 1659 1751 1641 1641 1732 1641 1641 1732 1659 1659 1751 1660 1660 1752 1641 1641 1732 1660 1660 1752 1642 1642 1733 1642 1642 1733 1660 1660 1752 1661 1661 1753 1642 1642 1733 1661 1661 1753 1643 1643 1734 1643 1643 1734 1661 1661 1753 1662 1662 1754 1643 1643 1734 1662 1662 1754 1644 1644 1735 1644 1644 1735 1662 1662 1754 1663 1663 1755 1644 1644 1735 1663 1663 1755 1645 1645 1736 1645 1645 1736 1663 1663 1755 1664 1664 1756 1645 1645 1736 1664 1664 1756 1646 1646 1737 1646 1646 1737 1664 1664 1756 1665 1665 1757 1646 1646 1737 1665 1665 1757 1647 1647 1738 1647 1647 1738 1665 1665 1757 1666 1666 1758 1647 1647 1738 1666 1666 1758 1648 1648 1739 1648 1648 1739 1666 1666 1758 1667 1667 1759 1648 1648 1739 1667 1667 1759 1649 1649 1740 1649 1649 1740 1667 1667 1759 1668 1668 1760 1649 1649 1740 1668 1668 1760 1650 1650 1741 1650 1650 1741 1668 1668 1760 1669 1669 1761 1650 1650 1741 1669 1669 1761 1651 1651 1742 1651 1651 1742 1669 1669 1761 1670 1670 1762 1651 1651 1742 1670 1670 1762 1652 1652 1743 1652 1652 1743 1670 1670 1762 1671 1671 1763 1652 1652 1743 1671 1671 1763 1653 1653 1744 1653 1653 1744 1671 1671 1763 1672 1672 1764 1653 1653 1744 1672 1672 1764 1654 1654 1745 1654 1654 1745 1672 1672 1764 1673 1673 1765 1654 1654 1745 1673 1673 1765 1655 1655 1746 1655 1655 1746 1673 1673 1765 1656 1656 1766 1655 1655 1746 1656 1656 1766 1638 1638 1747 1656 1656 1748 1674 1674 1767 1675 1675 1768 1656 1656 1748 1675 1675 1768 1657 1657 1749 1657 1657 1749 1675 1675 1768 1676 1676 1769 1657 1657 1749 1676 1676 1769 1658 1658 1750 1658 1658 1750 1676 1676 1769 1677 1677 1770 1658 1658 1750 1677 1677 1770 1659 1659 1751 1659 1659 1751 1677 1677 1770 1678 1678 1771 1659 1659 1751 1678 1678 1771 1660 1660 1752 1660 1660 1752 1678 1678 1771 1679 1679 1772 1660 1660 1752 1679 1679 1772 1661 1661 1753 1661 1661 1753 1679 1679 1772 1680 1680 1773 1661 1661 1753 1680 1680 1773 1662 1662 1754 1662 1662 1754 1680 1680 1773 1681 1681 1774 1662 1662 1754 1681 1681 1774 1663 1663 1755 1663 1663 1755 1681 1681 1774 1682 1682 1775 1663 1663 1755 1682 1682 1775 1664 1664 1756 1664 1664 1756 1682 1682 1775 1683 1683 1776 1664 1664 1756 1683 1683 1776 1665 1665 1757 1665 1665 1757 1683 1683 1776 1684 1684 1777 1665 1665 1757 1684 1684 1777 1666 1666 1758 1666 1666 1758 1684 1684 1777 1685 1685 1778 1666 1666 1758 1685 1685 1778 1667 1667 1759 1667 1667 1759 1685 1685 1778 1686 1686 1779 1667 1667 1759 1686 1686 1779 1668 1668 1760 1668 1668 1760 1686 1686 1779 1687 1687 1780 1668 1668 1760 1687 1687 1780 1669 1669 1761 1669 1669 1761 1687 1687 1780 1688 1688 1781 1669 1669 1761 1688 1688 1781 1670 1670 1762 1670 1670 1762 1688 1688 1781 1689 1689 1782 1670 1670 1762 1689 1689 1782 1671 1671 1763 1671 1671 1763 1689 1689 1782 1690 1690 1783 1671 1671 1763 1690 1690 1783 1672 1672 1764 1672 1672 1764 1690 1690 1783 1691 1691 1784 1672 1672 1764 1691 1691 1784 1673 1673 1765 1673 1673 1765 1691 1691 1784 1674 1674 1785 1673 1673 1765 1674 1674 1785 1656 1656 1766 1674 1674 1767 1692 1692 1786 1693 1693 1787 1674 1674 1767 1693 1693 1787 1675 1675 1768 1675 1675 1768 1693 1693 1787 1694 1694 1788 1675 1675 1768 1694 1694 1788 1676 1676 1769 1676 1676 1769 1694 1694 1788 1695 1695 1789 1676 1676 1769 1695 1695 1789 1677 1677 1770 1677 1677 1770 1695 1695 1789 1696 1696 1790 1677 1677 1770 1696 1696 1790 1678 1678 1771 1678 1678 1771 1696 1696 1790 1697 1697 1791 1678 1678 1771 1697 1697 1791 1679 1679 1772 1679 1679 1772 1697 1697 1791 1698 1698 1792 1679 1679 1772 1698 1698 1792 1680 1680 1773 1680 1680 1773 1698 1698 1792 1699 1699 1793 1680 1680 1773 1699 1699 1793 1681 1681 1774 1681 1681 1774 1699 1699 1793 1700 1700 1794 1681 1681 1774 1700 1700 1794 1682 1682 1775 1682 1682 1775 1700 1700 1794 1701 1701 1795 1682 1682 1775 1701 1701 1795 1683 1683 1776 1683 1683 1776 1701 1701 1795 1702 1702 1796 1683 1683 1776 1702 1702 1796 1684 1684 1777 1684 1684 1777 1702 1702 1796 1703 1703 1797 1684 1684 1777 1703 1703 1797 1685 1685 1778 1685 1685 1778 1703 1703 1797 1704 1704 1798 1685 1685 1778 1704 1704 1798 1686 1686 1779 1686 1686 1779 1704 1704 1798 1705 1705 1799 1686 1686 1779 1705 1705 1799 1687 1687 1780 1687 1687 1780 1705 1705 1799 1706 1706 1800 1687 1687 1780 1706 1706 1800 1688 1688 1781 1688 1688 1781 1706 1706 1800 1707 1707 1801 1688 1688 1781 1707 1707 1801 1689 1689 1782 1689 1689 1782 1707 1707 1801 1708 1708 1802 1689 1689 1782 1708 1708 1802 1690 1690 1783 1690 1690 1783 1708 1708 1802 1709 1709 1803 1690 1690 1783 1709 1709 1803 1691 1691 1784 1691 1691 1784 1709 1709 1803 1692 1692 1804 1691 1691 1784 1692 1692 1804 1674 1674 1785 1692 1692 1786 1710 1710 1805 1711 1711 1806 1692 1692 1786 1711 1711 1806 1693 1693 1787 1693 1693 1787 1711 1711 1806 1712 1712 1807 1693 1693 1787 1712 1712 1807 1694 1694 1788 1694 1694 1788 1712 1712 1807 1713 1713 1808 1694 1694 1788 1713 1713 1808 1695 1695 1789 1695 1695 1789 1713 1713 1808 1714 1714 1809 1695 1695 1789 1714 1714 1809 1696 1696 1790 1696 1696 1790 1714 1714 1809 1715 1715 1810 1696 1696 1790 1715 1715 1810 1697 1697 1791 1697 1697 1791 1715 1715 1810 1716 1716 1811 1697 1697 1791 1716 1716 1811 1698 1698 1792 1698 1698 1792 1716 1716 1811 1717 1717 1812 1698 1698 1792 1717 1717 1812 1699 1699 1793 1699 1699 1793 1717 1717 1812 1718 1718 1813 1699 1699 1793 1718 1718 1813 1700 1700 1794 1700 1700 1794 1718 1718 1813 1719 1719 1814 1700 1700 1794 1719 1719 1814 1701 1701 1795 1701 1701 1795 1719 1719 1814 1720 1720 1815 1701 1701 1795 1720 1720 1815 1702 1702 1796 1702 1702 1796 1720 1720 1815 1721 1721 1816 1702 1702 1796 1721 1721 1816 1703 1703 1797 1703 1703 1797 1721 1721 1816 1722 1722 1817 1703 1703 1797 1722 1722 1817 1704 1704 1798 1704 1704 1798 1722 1722 1817 1723 1723 1818 1704 1704 1798 1723 1723 1818 1705 1705 1799 1705 1705 1799 1723 1723 1818 1724 1724 1819 1705 1705 1799 1724 1724 1819 1706 1706 1800 1706 1706 1800 1724 1724 1819 1725 1725 1820 1706 1706 1800 1725 1725 1820 1707 1707 1801 1707 1707 1801 1725 1725 1820 1726 1726 1821 1707 1707 1801 1726 1726 1821 1708 1708 1802 1708 1708 1802 1726 1726 1821 1727 1727 1822 1708 1708 1802 1727 1727 1822 1709 1709 1803 1709 1709 1803 1727 1727 1822 1710 1710 1823 1709 1709 1803 1710 1710 1823 1692 1692 1804 1710 1710 1805 1728 1728 1824 1729 1729 1825 1710 1710 1805 1729 1729 1825 1711 1711 1806 1711 1711 1806 1729 1729 1825 1730 1730 1826 1711 1711 1806 1730 1730 1826 1712 1712 1807 1712 1712 1807 1730 1730 1826 1731 1731 1827 1712 1712 1807 1731 1731 1827 1713 1713 1808 1713 1713 1808 1731 1731 1827 1732 1732 1828 1713 1713 1808 1732 1732 1828 1714 1714 1809 1714 1714 1809 1732 1732 1828 1733 1733 1829 1714 1714 1809 1733 1733 1829 1715 1715 1810 1715 1715 1810 1733 1733 1829 1734 1734 1830 1715 1715 1810 1734 1734 1830 1716 1716 1811 1716 1716 1811 1734 1734 1830 1735 1735 1831 1716 1716 1811 1735 1735 1831 1717 1717 1812 1717 1717 1812 1735 1735 1831 1736 1736 1832 1717 1717 1812 1736 1736 1832 1718 1718 1813 1718 1718 1813 1736 1736 1832 1737 1737 1833 1718 1718 1813 1737 1737 1833 1719 1719 1814 1719 1719 1814 1737 1737 1833 1738 1738 1834 1719 1719 1814 1738 1738 1834 1720 1720 1815 1720 1720 1815 1738 1738 1834 1739 1739 1835 1720 1720 1815 1739 1739 1835 1721 1721 1816 1721 1721 1816 1739 1739 1835 1740 1740 1836 1721 1721 1816 1740 1740 1836 1722 1722 1817 1722 1722 1817 1740 1740 1836 1741 1741 1837 1722 1722 1817 1741 1741 1837 1723 1723 1818 1723 1723 1818 1741 1741 1837 1742 1742 1838 1723 1723 1818 1742 1742 1838 1724 1724 1819 1724 1724 1819 1742 1742 1838 1743 1743 1839 1724 1724 1819 1743 1743 1839 1725 1725 1820 1725 1725 1820 1743 1743 1839 1744 1744 1840 1725 1725 1820 1744 1744 1840 1726 1726 1821 1726 1726 1821 1744 1744 1840 1745 1745 1841 1726 1726 1821 1745 1745 1841 1727 1727 1822 1727 1727 1822 1745 1745 1841 1728 1728 1842 1727 1727 1822 1728 1728 1842 1710 1710 1823 1728 1728 1824 1746 1746 1843 1747 1747 1844 1728 1728 1824 1747 1747 1844 1729 1729 1825 1729 1729 1825 1747 1747 1844 1748 1748 1845 1729 1729 1825 1748 1748 1845 1730 1730 1826 1730 1730 1826 1748 1748 1845 1749 1749 1846 1730 1730 1826 1749 1749 1846 1731 1731 1827 1731 1731 1827 1749 1749 1846 1750 1750 1847 1731 1731 1827 1750 1750 1847 1732 1732 1828 1732 1732 1828 1750 1750 1847 1751 1751 1848 1732 1732 1828 1751 1751 1848 1733 1733 1829 1733 1733 1829 1751 1751 1848 1752 1752 1849 1733 1733 1829 1752 1752 1849 1734 1734 1830 1734 1734 1830 1752 1752 1849 1753 1753 1850 1734 1734 1830 1753 1753 1850 1735 1735 1831 1735 1735 1831 1753 1753 1850 1754 1754 1851 1735 1735 1831 1754 1754 1851 1736 1736 1832 1736 1736 1832 1754 1754 1851 1755 1755 1852 1736 1736 1832 1755 1755 1852 1737 1737 1833 1737 1737 1833 1755 1755 1852 1756 1756 1853 1737 1737 1833 1756 1756 1853 1738 1738 1834 1738 1738 1834 1756 1756 1853 1757 1757 1854 1738 1738 1834 1757 1757 1854 1739 1739 1835 1739 1739 1835 1757 1757 1854 1758 1758 1855 1739 1739 1835 1758 1758 1855 1740 1740 1836 1740 1740 1836 1758 1758 1855 1759 1759 1856 1740 1740 1836 1759 1759 1856 1741 1741 1837 1741 1741 1837 1759 1759 1856 1760 1760 1857 1741 1741 1837 1760 1760 1857 1742 1742 1838 1742 1742 1838 1760 1760 1857 1761 1761 1858 1742 1742 1838 1761 1761 1858 1743 1743 1839 1743 1743 1839 1761 1761 1858 1762 1762 1859 1743 1743 1839 1762 1762 1859 1744 1744 1840 1744 1744 1840 1762 1762 1859 1763 1763 1860 1744 1744 1840 1763 1763 1860 1745 1745 1841 1745 1745 1841 1763 1763 1860 1746 1746 1861 1745 1745 1841 1746 1746 1861 1728 1728 1842 1746 1746 1843 1764 1764 1862 1765 1765 1863 1746 1746 1843 1765 1765 1863 1747 1747 1844 1747 1747 1844 1765 1765 1863 1766 1766 1864 1747 1747 1844 1766 1766 1864 1748 1748 1845 1748 1748 1845 1766 1766 1864 1767 1767 1865 1748 1748 1845 1767 1767 1865 1749 1749 1846 1749 1749 1846 1767 1767 1865 1768 1768 1866 1749 1749 1846 1768 1768 1866 1750 1750 1847 1750 1750 1847 1768 1768 1866 1769 1769 1867 1750 1750 1847 1769 1769 1867 1751 1751 1848 1751 1751 1848 1769 1769 1867 1770 1770 1868 1751 1751 1848 1770 1770 1868 1752 1752 1849 1752 1752 1849 1770 1770 1868 1771 1771 1869 1752 1752 1849 1771 1771 1869 1753 1753 1850 1753 1753 1850 1771 1771 1869 1772 1772 1870 1753 1753 1850 1772 1772 1870 1754 1754 1851 1754 1754 1851 1772 1772 1870 1773 1773 1871 1754 1754 1851 1773 1773 1871 1755 1755 1852 1755 1755 1852 1773 1773 1871 1774 1774 1872 1755 1755 1852 1774 1774 1872 1756 1756 1853 1756 1756 1853 1774 1774 1872 1775 1775 1873 1756 1756 1853 1775 1775 1873 1757 1757 1854 1757 1757 1854 1775 1775 1873 1776 1776 1874 1757 1757 1854 1776 1776 1874 1758 1758 1855 1758 1758 1855 1776 1776 1874 1777 1777 1875 1758 1758 1855 1777 1777 1875 1759 1759 1856 1759 1759 1856 1777 1777 1875 1778 1778 1876 1759 1759 1856 1778 1778 1876 1760 1760 1857 1760 1760 1857 1778 1778 1876 1779 1779 1877 1760 1760 1857 1779 1779 1877 1761 1761 1858 1761 1761 1858 1779 1779 1877 1780 1780 1878 1761 1761 1858 1780 1780 1878 1762 1762 1859 1762 1762 1859 1780 1780 1878 1781 1781 1879 1762 1762 1859 1781 1781 1879 1763 1763 1860 1763 1763 1860 1781 1781 1879 1764 1764 1880 1763 1763 1860 1764 1764 1880 1746 1746 1861 1764 1764 1862 1782 1782 1881 1783 1783 1882 1764 1764 1862 1783 1783 1882 1765 1765 1863 1765 1765 1863 1783 1783 1882 1784 1784 1883 1765 1765 1863 1784 1784 1883 1766 1766 1864 1766 1766 1864 1784 1784 1883 1785 1785 1884 1766 1766 1864 1785 1785 1884 1767 1767 1865 1767 1767 1865 1785 1785 1884 1786 1786 1885 1767 1767 1865 1786 1786 1885 1768 1768 1866 1768 1768 1866 1786 1786 1885 1787 1787 1886 1768 1768 1866 1787 1787 1886 1769 1769 1867 1769 1769 1867 1787 1787 1886 1788 1788 1887 1769 1769 1867 1788 1788 1887 1770 1770 1868 1770 1770 1868 1788 1788 1887 1789 1789 1888 1770 1770 1868 1789 1789 1888 1771 1771 1869 1771 1771 1869 1789 1789 1888 1790 1790 1889 1771 1771 1869 1790 1790 1889 1772 1772 1870 1772 1772 1870 1790 1790 1889 1791 1791 1890 1772 1772 1870 1791 1791 1890 1773 1773 1871 1773 1773 1871 1791 1791 1890 1792 1792 1891 1773 1773 1871 1792 1792 1891 1774 1774 1872 1774 1774 1872 1792 1792 1891 1793 1793 1892 1774 1774 1872 1793 1793 1892 1775 1775 1873 1775 1775 1873 1793 1793 1892 1794 1794 1893 1775 1775 1873 1794 1794 1893 1776 1776 1874 1776 1776 1874 1794 1794 1893 1795 1795 1894 1776 1776 1874 1795 1795 1894 1777 1777 1875 1777 1777 1875 1795 1795 1894 1796 1796 1895 1777 1777 1875 1796 1796 1895 1778 1778 1876 1778 1778 1876 1796 1796 1895 1797 1797 1896 1778 1778 1876 1797 1797 1896 1779 1779 1877 1779 1779 1877 1797 1797 1896 1798 1798 1897 1779 1779 1877 1798 1798 1897 1780 1780 1878 1780 1780 1878 1798 1798 1897 1799 1799 1898 1780 1780 1878 1799 1799 1898 1781 1781 1879 1781 1781 1879 1799 1799 1898 1782 1782 1899 1781 1781 1879 1782 1782 1899 1764 1764 1880 1782 1782 1881 1800 1800 1900 1801 1801 1901 1782 1782 1881 1801 1801 1901 1783 1783 1882 1783 1783 1882 1801 1801 1901 1802 1802 1902 1783 1783 1882 1802 1802 1902 1784 1784 1883 1784 1784 1883 1802 1802 1902 1803 1803 1903 1784 1784 1883 1803 1803 1903 1785 1785 1884 1785 1785 1884 1803 1803 1903 1804 1804 1904 1785 1785 1884 1804 1804 1904 1786 1786 1885 1786 1786 1885 1804 1804 1904 1805 1805 1905 1786 1786 1885 1805 1805 1905 1787 1787 1886 1787 1787 1886 1805 1805 1905 1806 1806 1906 1787 1787 1886 1806 1806 1906 1788 1788 1887 1788 1788 1887 1806 1806 1906 1807 1807 1907 1788 1788 1887 1807 1807 1907 1789 1789 1888 1789 1789 1888 1807 1807 1907 1808 1808 1908 1789 1789 1888 1808 1808 1908 1790 1790 1889 1790 1790 1889 1808 1808 1908 1809 1809 1909 1790 1790 1889 1809 1809 1909 1791 1791 1890 1791 1791 1890 1809 1809 1909 1810 1810 1910 1791 1791 1890 1810 1810 1910 1792 1792 1891 1792 1792 1891 1810 1810 1910 1811 1811 1911 1792 1792 1891 1811 1811 1911 1793 1793 1892 1793 1793 1892 1811 1811 1911 1812 1812 1912 1793 1793 1892 1812 1812 1912 1794 1794 1893 1794 1794 1893 1812 1812 1912 1813 1813 1913 1794 1794 1893 1813 1813 1913 1795 1795 1894 1795 1795 1894 1813 1813 1913 1814 1814 1914 1795 1795 1894 1814 1814 1914 1796 1796 1895 1796 1796 1895 1814 1814 1914 1815 1815 1915 1796 1796 1895 1815 1815 1915 1797 1797 1896 1797 1797 1896 1815 1815 1915 1816 1816 1916 1797 1797 1896 1816 1816 1916 1798 1798 1897 1798 1798 1897 1816 1816 1916 1817 1817 1917 1798 1798 1897 1817 1817 1917 1799 1799 1898 1799 1799 1898 1817 1817 1917 1800 1800 1918 1799 1799 1898 1800 1800 1918 1782 1782 1899 1800 1800 1900 1818 1818 1919 1819 1819 1920 1800 1800 1900 1819 1819 1920 1801 1801 1901 1801 1801 1901 1819 1819 1920 1820 1820 1921 1801 1801 1901 1820 1820 1921 1802 1802 1902 1802 1802 1902 1820 1820 1921 1821 1821 1922 1802 1802 1902 1821 1821 1922 1803 1803 1903 1803 1803 1903 1821 1821 1922 1822 1822 1923 1803 1803 1903 1822 1822 1923 1804 1804 1904 1804 1804 1904 1822 1822 1923 1823 1823 1924 1804 1804 1904 1823 1823 1924 1805 1805 1905 1805 1805 1905 1823 1823 1924 1824 1824 1925 1805 1805 1905 1824 1824 1925 1806 1806 1906 1806 1806 1906 1824 1824 1925 1825 1825 1926 1806 1806 1906 1825 1825 1926 1807 1807 1907 1807 1807 1907 1825 1825 1926 1826 1826 1927 1807 1807 1907 1826 1826 1927 1808 1808 1908 1808 1808 1908 1826 1826 1927 1827 1827 1928 1808 1808 1908 1827 1827 1928 1809 1809 1909 1809 1809 1909 1827 1827 1928 1828 1828 1929 1809 1809 1909 1828 1828 1929 1810 1810 1910 1810 1810 1910 1828 1828 1929 1829 1829 1930 1810 1810 1910 1829 1829 1930 1811 1811 1911 1811 1811 1911 1829 1829 1930 1830 1830 1931 1811 1811 1911 1830 1830 1931 1812 1812 1912 1812 1812 1912 1830 1830 1931 1831 1831 1932 1812 1812 1912 1831 1831 1932 1813 1813 1913 1813 1813 1913 1831 1831 1932 1832 1832 1933 1813 1813 1913 1832 1832 1933 1814 1814 1914 1814 1814 1914 1832 1832 1933 1833 1833 1934 1814 1814 1914 1833 1833 1934 1815 1815 1915 1815 1815 1915 1833 1833 1934 1834 1834 1935 1815 1815 1915 1834 1834 1935 1816 1816 1916 1816 1816 1916 1834 1834 1935 1835 1835 1936 1816 1816 1916 1835 1835 1936 1817 1817 1917 1817 1817 1917 1835 1835 1936 1818 1818 1937 1817 1817 1917 1818 1818 1937 1800 1800 1918 1818 1818 1919 1836 1836 1938 1837 1837 1939 1818 1818 1919 1837 1837 1939 1819 1819 1920 1819 1819 1920 1837 1837 1939 1838 1838 1940 1819 1819 1920 1838 1838 1940 1820 1820 1921 1820 1820 1921 1838 1838 1940 1839 1839 1941 1820 1820 1921 1839 1839 1941 1821 1821 1922 1821 1821 1922 1839 1839 1941 1840 1840 1942 1821 1821 1922 1840 1840 1942 1822 1822 1923 1822 1822 1923 1840 1840 1942 1841 1841 1943 1822 1822 1923 1841 1841 1943 1823 1823 1924 1823 1823 1924 1841 1841 1943 1842 1842 1944 1823 1823 1924 1842 1842 1944 1824 1824 1925 1824 1824 1925 1842 1842 1944 1843 1843 1945 1824 1824 1925 1843 1843 1945 1825 1825 1926 1825 1825 1926 1843 1843 1945 1844 1844 1946 1825 1825 1926 1844 1844 1946 1826 1826 1927 1826 1826 1927 1844 1844 1946 1845 1845 1947 1826 1826 1927 1845 1845 1947 1827 1827 1928 1827 1827 1928 1845 1845 1947 1846 1846 1948 1827 1827 1928 1846 1846 1948 1828 1828 1929 1828 1828 1929 1846 1846 1948 1847 1847 1949 1828 1828 1929 1847 1847 1949 1829 1829 1930 1829 1829 1930 1847 1847 1949 1848 1848 1950 1829 1829 1930 1848 1848 1950 1830 1830 1931 1830 1830 1931 1848 1848 1950 1849 1849 1951 1830 1830 1931 1849 1849 1951 1831 1831 1932 1831 1831 1932 1849 1849 1951 1850 1850 1952 1831 1831 1932 1850 1850 1952 1832 1832 1933 1832 1832 1933 1850 1850 1952 1851 1851 1953 1832 1832 1933 1851 1851 1953 1833 1833 1934 1833 1833 1934 1851 1851 1953 1852 1852 1954 1833 1833 1934 1852 1852 1954 1834 1834 1935 1834 1834 1935 1852 1852 1954 1853 1853 1955 1834 1834 1935 1853 1853 1955 1835 1835 1936 1835 1835 1936 1853 1853 1955 1836 1836 1956 1835 1835 1936 1836 1836 1956 1818 1818 1937 1836 1836 1938 1854 1854 1957 1855 1855 1958 1836 1836 1938 1855 1855 1958 1837 1837 1939 1837 1837 1939 1855 1855 1958 1856 1856 1959 1837 1837 1939 1856 1856 1959 1838 1838 1940 1838 1838 1940 1856 1856 1959 1857 1857 1960 1838 1838 1940 1857 1857 1960 1839 1839 1941 1839 1839 1941 1857 1857 1960 1858 1858 1961 1839 1839 1941 1858 1858 1961 1840 1840 1942 1840 1840 1942 1858 1858 1961 1859 1859 1962 1840 1840 1942 1859 1859 1962 1841 1841 1943 1841 1841 1943 1859 1859 1962 1860 1860 1963 1841 1841 1943 1860 1860 1963 1842 1842 1944 1842 1842 1944 1860 1860 1963 1861 1861 1964 1842 1842 1944 1861 1861 1964 1843 1843 1945 1843 1843 1945 1861 1861 1964 1862 1862 1965 1843 1843 1945 1862 1862 1965 1844 1844 1946 1844 1844 1946 1862 1862 1965 1863 1863 1966 1844 1844 1946 1863 1863 1966 1845 1845 1947 1845 1845 1947 1863 1863 1966 1864 1864 1967 1845 1845 1947 1864 1864 1967 1846 1846 1948 1846 1846 1948 1864 1864 1967 1865 1865 1968 1846 1846 1948 1865 1865 1968 1847 1847 1949 1847 1847 1949 1865 1865 1968 1866 1866 1969 1847 1847 1949 1866 1866 1969 1848 1848 1950 1848 1848 1950 1866 1866 1969 1867 1867 1970 1848 1848 1950 1867 1867 1970 1849 1849 1951 1849 1849 1951 1867 1867 1970 1868 1868 1971 1849 1849 1951 1868 1868 1971 1850 1850 1952 1850 1850 1952 1868 1868 1971 1869 1869 1972 1850 1850 1952 1869 1869 1972 1851 1851 1953 1851 1851 1953 1869 1869 1972 1870 1870 1973 1851 1851 1953 1870 1870 1973 1852 1852 1954 1852 1852 1954 1870 1870 1973 1871 1871 1974 1852 1852 1954 1871 1871 1974 1853 1853 1955 1853 1853 1955 1871 1871 1974 1854 1854 1975 1853 1853 1955 1854 1854 1975 1836 1836 1956 1854 1854 1957 1872 1872 1976 1873 1873 1977 1854 1854 1957 1873 1873 1977 1855 1855 1958 1855 1855 1958 1873 1873 1977 1874 1874 1978 1855 1855 1958 1874 1874 1978 1856 1856 1959 1856 1856 1959 1874 1874 1978 1875 1875 1979 1856 1856 1959 1875 1875 1979 1857 1857 1960 1857 1857 1960 1875 1875 1979 1876 1876 1980 1857 1857 1960 1876 1876 1980 1858 1858 1961 1858 1858 1961 1876 1876 1980 1877 1877 1981 1858 1858 1961 1877 1877 1981 1859 1859 1962 1859 1859 1962 1877 1877 1981 1878 1878 1982 1859 1859 1962 1878 1878 1982 1860 1860 1963 1860 1860 1963 1878 1878 1982 1879 1879 1983 1860 1860 1963 1879 1879 1983 1861 1861 1964 1861 1861 1964 1879 1879 1983 1880 1880 1984 1861 1861 1964 1880 1880 1984 1862 1862 1965 1862 1862 1965 1880 1880 1984 1881 1881 1985 1862 1862 1965 1881 1881 1985 1863 1863 1966 1863 1863 1966 1881 1881 1985 1882 1882 1986 1863 1863 1966 1882 1882 1986 1864 1864 1967 1864 1864 1967 1882 1882 1986 1883 1883 1987 1864 1864 1967 1883 1883 1987 1865 1865 1968 1865 1865 1968 1883 1883 1987 1884 1884 1988 1865 1865 1968 1884 1884 1988 1866 1866 1969 1866 1866 1969 1884 1884 1988 1885 1885 1989 1866 1866 1969 1885 1885 1989 1867 1867 1970 1867 1867 1970 1885 1885 1989 1886 1886 1990 1867 1867 1970 1886 1886 1990 1868 1868 1971 1868 1868 1971 1886 1886 1990 1887 1887 1991 1868 1868 1971 1887 1887 1991 1869 1869 1972 1869 1869 1972 1887 1887 1991 1888 1888 1992 1869 1869 1972 1888 1888 1992 1870 1870 1973 1870 1870 1973 1888 1888 1992 1889 1889 1993 1870 1870 1973 1889 1889 1993 1871 1871 1974 1871 1871 1974 1889 1889 1993 1872 1872 1994 1871 1871 1974 1872 1872 1994 1854 1854 1975 1872 1872 1976 1890 1890 1995 1891 1891 1996 1872 1872 1976 1891 1891 1996 1873 1873 1977 1873 1873 1977 1891 1891 1996 1892 1892 1997 1873 1873 1977 1892 1892 1997 1874 1874 1978 1874 1874 1978 1892 1892 1997 1893 1893 1998 1874 1874 1978 1893 1893 1998 1875 1875 1979 1875 1875 1979 1893 1893 1998 1894 1894 1999 1875 1875 1979 1894 1894 1999 1876 1876 1980 1876 1876 1980 1894 1894 1999 1895 1895 2000 1876 1876 1980 1895 1895 2000 1877 1877 1981 1877 1877 1981 1895 1895 2000 1896 1896 2001 1877 1877 1981 1896 1896 2001 1878 1878 1982 1878 1878 1982 1896 1896 2001 1897 1897 2002 1878 1878 1982 1897 1897 2002 1879 1879 1983 1879 1879 1983 1897 1897 2002 1898 1898 2003 1879 1879 1983 1898 1898 2003 1880 1880 1984 1880 1880 1984 1898 1898 2003 1899 1899 2004 1880 1880 1984 1899 1899 2004 1881 1881 1985 1881 1881 1985 1899 1899 2004 1900 1900 2005 1881 1881 1985 1900 1900 2005 1882 1882 1986 1882 1882 1986 1900 1900 2005 1901 1901 2006 1882 1882 1986 1901 1901 2006 1883 1883 1987 1883 1883 1987 1901 1901 2006 1902 1902 2007 1883 1883 1987 1902 1902 2007 1884 1884 1988 1884 1884 1988 1902 1902 2007 1903 1903 2008 1884 1884 1988 1903 1903 2008 1885 1885 1989 1885 1885 1989 1903 1903 2008 1904 1904 2009 1885 1885 1989 1904 1904 2009 1886 1886 1990 1886 1886 1990 1904 1904 2009 1905 1905 2010 1886 1886 1990 1905 1905 2010 1887 1887 1991 1887 1887 1991 1905 1905 2010 1906 1906 2011 1887 1887 1991 1906 1906 2011 1888 1888 1992 1888 1888 1992 1906 1906 2011 1907 1907 2012 1888 1888 1992 1907 1907 2012 1889 1889 1993 1889 1889 1993 1907 1907 2012 1890 1890 2013 1889 1889 1993 1890 1890 2013 1872 1872 1994 1890 1890 1995 1908 1908 2014 1909 1909 2015 1890 1890 1995 1909 1909 2015 1891 1891 1996 1891 1891 1996 1909 1909 2015 1910 1910 2016 1891 1891 1996 1910 1910 2016 1892 1892 1997 1892 1892 1997 1910 1910 2016 1911 1911 2017 1892 1892 1997 1911 1911 2017 1893 1893 1998 1893 1893 1998 1911 1911 2017 1912 1912 2018 1893 1893 1998 1912 1912 2018 1894 1894 1999 1894 1894 1999 1912 1912 2018 1913 1913 2019 1894 1894 1999 1913 1913 2019 1895 1895 2000 1895 1895 2000 1913 1913 2019 1914 1914 2020 1895 1895 2000 1914 1914 2020 1896 1896 2001 1896 1896 2001 1914 1914 2020 1915 1915 2021 1896 1896 2001 1915 1915 2021 1897 1897 2002 1897 1897 2002 1915 1915 2021 1916 1916 2022 1897 1897 2002 1916 1916 2022 1898 1898 2003 1898 1898 2003 1916 1916 2022 1917 1917 2023 1898 1898 2003 1917 1917 2023 1899 1899 2004 1899 1899 2004 1917 1917 2023 1918 1918 2024 1899 1899 2004 1918 1918 2024 1900 1900 2005 1900 1900 2005 1918 1918 2024 1919 1919 2025 1900 1900 2005 1919 1919 2025 1901 1901 2006 1901 1901 2006 1919 1919 2025 1920 1920 2026 1901 1901 2006 1920 1920 2026 1902 1902 2007 1902 1902 2007 1920 1920 2026 1921 1921 2027 1902 1902 2007 1921 1921 2027 1903 1903 2008 1903 1903 2008 1921 1921 2027 1922 1922 2028 1903 1903 2008 1922 1922 2028 1904 1904 2009 1904 1904 2009 1922 1922 2028 1923 1923 2029 1904 1904 2009 1923 1923 2029 1905 1905 2010 1905 1905 2010 1923 1923 2029 1924 1924 2030 1905 1905 2010 1924 1924 2030 1906 1906 2011 1906 1906 2011 1924 1924 2030 1925 1925 2031 1906 1906 2011 1925 1925 2031 1907 1907 2012 1907 1907 2012 1925 1925 2031 1908 1908 2032 1907 1907 2012 1908 1908 2032 1890 1890 2013 1908 1908 2014 1926 1926 2033 1927 1927 2034 1908 1908 2014 1927 1927 2034 1909 1909 2015 1909 1909 2015 1927 1927 2034 1928 1928 2035 1909 1909 2015 1928 1928 2035 1910 1910 2016 1910 1910 2016 1928 1928 2035 1929 1929 2036 1910 1910 2016 1929 1929 2036 1911 1911 2017 1911 1911 2017 1929 1929 2036 1930 1930 2037 1911 1911 2017 1930 1930 2037 1912 1912 2018 1912 1912 2018 1930 1930 2037 1931 1931 2038 1912 1912 2018 1931 1931 2038 1913 1913 2019 1913 1913 2019 1931 1931 2038 1932 1932 2039 1913 1913 2019 1932 1932 2039 1914 1914 2020 1914 1914 2020 1932 1932 2039 1933 1933 2040 1914 1914 2020 1933 1933 2040 1915 1915 2021 1915 1915 2021 1933 1933 2040 1934 1934 2041 1915 1915 2021 1934 1934 2041 1916 1916 2022 1916 1916 2022 1934 1934 2041 1935 1935 2042 1916 1916 2022 1935 1935 2042 1917 1917 2023 1917 1917 2023 1935 1935 2042 1936 1936 2043 1917 1917 2023 1936 1936 2043 1918 1918 2024 1918 1918 2024 1936 1936 2043 1937 1937 2044 1918 1918 2024 1937 1937 2044 1919 1919 2025 1919 1919 2025 1937 1937 2044 1938 1938 2045 1919 1919 2025 1938 1938 2045 1920 1920 2026 1920 1920 2026 1938 1938 2045 1939 1939 2046 1920 1920 2026 1939 1939 2046 1921 1921 2027 1921 1921 2027 1939 1939 2046 1940 1940 2047 1921 1921 2027 1940 1940 2047 1922 1922 2028 1922 1922 2028 1940 1940 2047 1941 1941 2048 1922 1922 2028 1941 1941 2048 1923 1923 2029 1923 1923 2029 1941 1941 2048 1942 1942 2049 1923 1923 2029 1942 1942 2049 1924 1924 2030 1924 1924 2030 1942 1942 2049 1943 1943 2050 1924 1924 2030 1943 1943 2050 1925 1925 2031 1925 1925 2031 1943 1943 2050 1926 1926 2051 1925 1925 2031 1926 1926 2051 1908 1908 2032 1926 1926 2033 1944 1944 2052 1945 1945 2053 1926 1926 2033 1945 1945 2053 1927 1927 2034 1927 1927 2034 1945 1945 2053 1946 1946 2054 1927 1927 2034 1946 1946 2054 1928 1928 2035 1928 1928 2035 1946 1946 2054 1947 1947 2055 1928 1928 2035 1947 1947 2055 1929 1929 2036 1929 1929 2036 1947 1947 2055 1948 1948 2056 1929 1929 2036 1948 1948 2056 1930 1930 2037 1930 1930 2037 1948 1948 2056 1949 1949 2057 1930 1930 2037 1949 1949 2057 1931 1931 2038 1931 1931 2038 1949 1949 2057 1950 1950 2058 1931 1931 2038 1950 1950 2058 1932 1932 2039 1932 1932 2039 1950 1950 2058 1951 1951 2059 1932 1932 2039 1951 1951 2059 1933 1933 2040 1933 1933 2040 1951 1951 2059 1952 1952 2060 1933 1933 2040 1952 1952 2060 1934 1934 2041 1934 1934 2041 1952 1952 2060 1953 1953 2061 1934 1934 2041 1953 1953 2061 1935 1935 2042 1935 1935 2042 1953 1953 2061 1954 1954 2062 1935 1935 2042 1954 1954 2062 1936 1936 2043 1936 1936 2043 1954 1954 2062 1955 1955 2063 1936 1936 2043 1955 1955 2063 1937 1937 2044 1937 1937 2044 1955 1955 2063 1956 1956 2064 1937 1937 2044 1956 1956 2064 1938 1938 2045 1938 1938 2045 1956 1956 2064 1957 1957 2065 1938 1938 2045 1957 1957 2065 1939 1939 2046 1939 1939 2046 1957 1957 2065 1958 1958 2066 1939 1939 2046 1958 1958 2066 1940 1940 2047 1940 1940 2047 1958 1958 2066 1959 1959 2067 1940 1940 2047 1959 1959 2067 1941 1941 2048 1941 1941 2048 1959 1959 2067 1960 1960 2068 1941 1941 2048 1960 1960 2068 1942 1942 2049 1942 1942 2049 1960 1960 2068 1961 1961 2069 1942 1942 2049 1961 1961 2069 1943 1943 2050 1943 1943 2050 1961 1961 2069 1944 1944 2070 1943 1943 2050 1944 1944 2070 1926 1926 2051 1944 1944 2052 1962 1962 2071 1963 1963 2072 1944 1944 2052 1963 1963 2072 1945 1945 2053 1945 1945 2053 1963 1963 2072 1964 1964 2073 1945 1945 2053 1964 1964 2073 1946 1946 2054 1946 1946 2054 1964 1964 2073 1965 1965 2074 1946 1946 2054 1965 1965 2074 1947 1947 2055 1947 1947 2055 1965 1965 2074 1966 1966 2075 1947 1947 2055 1966 1966 2075 1948 1948 2056 1948 1948 2056 1966 1966 2075 1967 1967 2076 1948 1948 2056 1967 1967 2076 1949 1949 2057 1949 1949 2057 1967 1967 2076 1968 1968 2077 1949 1949 2057 1968 1968 2077 1950 1950 2058 1950 1950 2058 1968 1968 2077 1969 1969 2078 1950 1950 2058 1969 1969 2078 1951 1951 2059 1951 1951 2059 1969 1969 2078 1970 1970 2079 1951 1951 2059 1970 1970 2079 1952 1952 2060 1952 1952 2060 1970 1970 2079 1971 1971 2080 1952 1952 2060 1971 1971 2080 1953 1953 2061 1953 1953 2061 1971 1971 2080 1972 1972 2081 1953 1953 2061 1972 1972 2081 1954 1954 2062 1954 1954 2062 1972 1972 2081 1973 1973 2082 1954 1954 2062 1973 1973 2082 1955 1955 2063 1955 1955 2063 1973 1973 2082 1974 1974 2083 1955 1955 2063 1974 1974 2083 1956 1956 2064 1956 1956 2064 1974 1974 2083 1975 1975 2084 1956 1956 2064 1975 1975 2084 1957 1957 2065 1957 1957 2065 1975 1975 2084 1976 1976 2085 1957 1957 2065 1976 1976 2085 1958 1958 2066 1958 1958 2066 1976 1976 2085 1977 1977 2086 1958 1958 2066 1977 1977 2086 1959 1959 2067 1959 1959 2067 1977 1977 2086 1978 1978 2087 1959 1959 2067 1978 1978 2087 1960 1960 2068 1960 1960 2068 1978 1978 2087 1979 1979 2088 1960 1960 2068 1979 1979 2088 1961 1961 2069 1961 1961 2069 1979 1979 2088 1962 1962 2089 1961 1961 2069 1962 1962 2089 1944 1944 2070 1962 1962 2071 1980 1980 2090 1981 1981 2091 1962 1962 2071 1981 1981 2091 1963 1963 2072 1963 1963 2072 1981 1981 2091 1982 1982 2092 1963 1963 2072 1982 1982 2092 1964 1964 2073 1964 1964 2073 1982 1982 2092 1983 1983 2093 1964 1964 2073 1983 1983 2093 1965 1965 2074 1965 1965 2074 1983 1983 2093 1984 1984 2094 1965 1965 2074 1984 1984 2094 1966 1966 2075 1966 1966 2075 1984 1984 2094 1985 1985 2095 1966 1966 2075 1985 1985 2095 1967 1967 2076 1967 1967 2076 1985 1985 2095 1986 1986 2096 1967 1967 2076 1986 1986 2096 1968 1968 2077 1968 1968 2077 1986 1986 2096 1987 1987 2097 1968 1968 2077 1987 1987 2097 1969 1969 2078 1969 1969 2078 1987 1987 2097 1988 1988 2098 1969 1969 2078 1988 1988 2098 1970 1970 2079 1970 1970 2079 1988 1988 2098 1989 1989 2099 1970 1970 2079 1989 1989 2099 1971 1971 2080 1971 1971 2080 1989 1989 2099 1990 1990 2100 1971 1971 2080 1990 1990 2100 1972 1972 2081 1972 1972 2081 1990 1990 2100 1991 1991 2101 1972 1972 2081 1991 1991 2101 1973 1973 2082 1973 1973 2082 1991 1991 2101 1992 1992 2102 1973 1973 2082 1992 1992 2102 1974 1974 2083 1974 1974 2083 1992 1992 2102 1993 1993 2103 1974 1974 2083 1993 1993 2103 1975 1975 2084 1975 1975 2084 1993 1993 2103 1994 1994 2104 1975 1975 2084 1994 1994 2104 1976 1976 2085 1976 1976 2085 1994 1994 2104 1995 1995 2105 1976 1976 2085 1995 1995 2105 1977 1977 2086 1977 1977 2086 1995 1995 2105 1996 1996 2106 1977 1977 2086 1996 1996 2106 1978 1978 2087 1978 1978 2087 1996 1996 2106 1997 1997 2107 1978 1978 2087 1997 1997 2107 1979 1979 2088 1979 1979 2088 1997 1997 2107 1980 1980 2108 1979 1979 2088 1980 1980 2108 1962 1962 2089 1980 1980 2090 1998 1998 2109 1999 1999 2110 1980 1980 2090 1999 1999 2110 1981 1981 2091 1981 1981 2091 1999 1999 2110 2000 2000 2111 1981 1981 2091 2000 2000 2111 1982 1982 2092 1982 1982 2092 2000 2000 2111 2001 2001 2112 1982 1982 2092 2001 2001 2112 1983 1983 2093 1983 1983 2093 2001 2001 2112 2002 2002 2113 1983 1983 2093 2002 2002 2113 1984 1984 2094 1984 1984 2094 2002 2002 2113 2003 2003 2114 1984 1984 2094 2003 2003 2114 1985 1985 2095 1985 1985 2095 2003 2003 2114 2004 2004 2115 1985 1985 2095 2004 2004 2115 1986 1986 2096 1986 1986 2096 2004 2004 2115 2005 2005 2116 1986 1986 2096 2005 2005 2116 1987 1987 2097 1987 1987 2097 2005 2005 2116 2006 2006 2117 1987 1987 2097 2006 2006 2117 1988 1988 2098 1988 1988 2098 2006 2006 2117 2007 2007 2118 1988 1988 2098 2007 2007 2118 1989 1989 2099 1989 1989 2099 2007 2007 2118 2008 2008 2119 1989 1989 2099 2008 2008 2119 1990 1990 2100 1990 1990 2100 2008 2008 2119 2009 2009 2120 1990 1990 2100 2009 2009 2120 1991 1991 2101 1991 1991 2101 2009 2009 2120 2010 2010 2121 1991 1991 2101 2010 2010 2121 1992 1992 2102 1992 1992 2102 2010 2010 2121 2011 2011 2122 1992 1992 2102 2011 2011 2122 1993 1993 2103 1993 1993 2103 2011 2011 2122 2012 2012 2123 1993 1993 2103 2012 2012 2123 1994 1994 2104 1994 1994 2104 2012 2012 2123 2013 2013 2124 1994 1994 2104 2013 2013 2124 1995 1995 2105 1995 1995 2105 2013 2013 2124 2014 2014 2125 1995 1995 2105 2014 2014 2125 1996 1996 2106 1996 1996 2106 2014 2014 2125 2015 2015 2126 1996 1996 2106 2015 2015 2126 1997 1997 2107 1997 1997 2107 2015 2015 2126 1998 1998 2127 1997 1997 2107 1998 1998 2127 1980 1980 2108 1998 1998 2109 2016 2016 2128 2017 2017 2129 1998 1998 2109 2017 2017 2129 1999 1999 2110 1999 1999 2110 2017 2017 2129 2018 2018 2130 1999 1999 2110 2018 2018 2130 2000 2000 2111 2000 2000 2111 2018 2018 2130 2019 2019 2131 2000 2000 2111 2019 2019 2131 2001 2001 2112 2001 2001 2112 2019 2019 2131 2020 2020 2132 2001 2001 2112 2020 2020 2132 2002 2002 2113 2002 2002 2113 2020 2020 2132 2021 2021 2133 2002 2002 2113 2021 2021 2133 2003 2003 2114 2003 2003 2114 2021 2021 2133 2022 2022 2134 2003 2003 2114 2022 2022 2134 2004 2004 2115 2004 2004 2115 2022 2022 2134 2023 2023 2135 2004 2004 2115 2023 2023 2135 2005 2005 2116 2005 2005 2116 2023 2023 2135 2024 2024 2136 2005 2005 2116 2024 2024 2136 2006 2006 2117 2006 2006 2117 2024 2024 2136 2025 2025 2137 2006 2006 2117 2025 2025 2137 2007 2007 2118 2007 2007 2118 2025 2025 2137 2026 2026 2138 2007 2007 2118 2026 2026 2138 2008 2008 2119 2008 2008 2119 2026 2026 2138 2027 2027 2139 2008 2008 2119 2027 2027 2139 2009 2009 2120 2009 2009 2120 2027 2027 2139 2028 2028 2140 2009 2009 2120 2028 2028 2140 2010 2010 2121 2010 2010 2121 2028 2028 2140 2029 2029 2141 2010 2010 2121 2029 2029 2141 2011 2011 2122 2011 2011 2122 2029 2029 2141 2030 2030 2142 2011 2011 2122 2030 2030 2142 2012 2012 2123 2012 2012 2123 2030 2030 2142 2031 2031 2143 2012 2012 2123 2031 2031 2143 2013 2013 2124 2013 2013 2124 2031 2031 2143 2032 2032 2144 2013 2013 2124 2032 2032 2144 2014 2014 2125 2014 2014 2125 2032 2032 2144 2033 2033 2145 2014 2014 2125 2033 2033 2145 2015 2015 2126 2015 2015 2126 2033 2033 2145 2016 2016 2146 2015 2015 2126 2016 2016 2146 1998 1998 2127 2016 2016 2128 2034 2034 2147 2035 2035 2148 2016 2016 2128 2035 2035 2148 2017 2017 2129 2017 2017 2129 2035 2035 2148 2036 2036 2149 2017 2017 2129 2036 2036 2149 2018 2018 2130 2018 2018 2130 2036 2036 2149 2037 2037 2150 2018 2018 2130 2037 2037 2150 2019 2019 2131 2019 2019 2131 2037 2037 2150 2038 2038 2151 2019 2019 2131 2038 2038 2151 2020 2020 2132 2020 2020 2132 2038 2038 2151 2039 2039 2152 2020 2020 2132 2039 2039 2152 2021 2021 2133 2021 2021 2133 2039 2039 2152 2040 2040 2153 2021 2021 2133 2040 2040 2153 2022 2022 2134 2022 2022 2134 2040 2040 2153 2041 2041 2154 2022 2022 2134 2041 2041 2154 2023 2023 2135 2023 2023 2135 2041 2041 2154 2042 2042 2155 2023 2023 2135 2042 2042 2155 2024 2024 2136 2024 2024 2136 2042 2042 2155 2043 2043 2156 2024 2024 2136 2043 2043 2156 2025 2025 2137 2025 2025 2137 2043 2043 2156 2044 2044 2157 2025 2025 2137 2044 2044 2157 2026 2026 2138 2026 2026 2138 2044 2044 2157 2045 2045 2158 2026 2026 2138 2045 2045 2158 2027 2027 2139 2027 2027 2139 2045 2045 2158 2046 2046 2159 2027 2027 2139 2046 2046 2159 2028 2028 2140 2028 2028 2140 2046 2046 2159 2047 2047 2160 2028 2028 2140 2047 2047 2160 2029 2029 2141 2029 2029 2141 2047 2047 2160 2048 2048 2161 2029 2029 2141 2048 2048 2161 2030 2030 2142 2030 2030 2142 2048 2048 2161 2049 2049 2162 2030 2030 2142 2049 2049 2162 2031 2031 2143 2031 2031 2143 2049 2049 2162 2050 2050 2163 2031 2031 2143 2050 2050 2163 2032 2032 2144 2032 2032 2144 2050 2050 2163 2051 2051 2164 2032 2032 2144 2051 2051 2164 2033 2033 2145 2033 2033 2145 2051 2051 2164 2034 2034 2165 2033 2033 2145 2034 2034 2165 2016 2016 2146 2034 2034 2147 2052 2052 2166 2053 2053 2167 2034 2034 2147 2053 2053 2167 2035 2035 2148 2035 2035 2148 2053 2053 2167 2054 2054 2168 2035 2035 2148 2054 2054 2168 2036 2036 2149 2036 2036 2149 2054 2054 2168 2055 2055 2169 2036 2036 2149 2055 2055 2169 2037 2037 2150 2037 2037 2150 2055 2055 2169 2056 2056 2170 2037 2037 2150 2056 2056 2170 2038 2038 2151 2038 2038 2151 2056 2056 2170 2057 2057 2171 2038 2038 2151 2057 2057 2171 2039 2039 2152 2039 2039 2152 2057 2057 2171 2058 2058 2172 2039 2039 2152 2058 2058 2172 2040 2040 2153 2040 2040 2153 2058 2058 2172 2059 2059 2173 2040 2040 2153 2059 2059 2173 2041 2041 2154 2041 2041 2154 2059 2059 2173 2060 2060 2174 2041 2041 2154 2060 2060 2174 2042 2042 2155 2042 2042 2155 2060 2060 2174 2061 2061 2175 2042 2042 2155 2061 2061 2175 2043 2043 2156 2043 2043 2156 2061 2061 2175 2062 2062 2176 2043 2043 2156 2062 2062 2176 2044 2044 2157 2044 2044 2157 2062 2062 2176 2063 2063 2177 2044 2044 2157 2063 2063 2177 2045 2045 2158 2045 2045 2158 2063 2063 2177 2064 2064 2178 2045 2045 2158 2064 2064 2178 2046 2046 2159 2046 2046 2159 2064 2064 2178 2065 2065 2179 2046 2046 2159 2065 2065 2179 2047 2047 2160 2047 2047 2160 2065 2065 2179 2066 2066 2180 2047 2047 2160 2066 2066 2180 2048 2048 2161 2048 2048 2161 2066 2066 2180 2067 2067 2181 2048 2048 2161 2067 2067 2181 2049 2049 2162 2049 2049 2162 2067 2067 2181 2068 2068 2182 2049 2049 2162 2068 2068 2182 2050 2050 2163 2050 2050 2163 2068 2068 2182 2069 2069 2183 2050 2050 2163 2069 2069 2183 2051 2051 2164 2051 2051 2164 2069 2069 2183 2052 2052 2184 2051 2051 2164 2052 2052 2184 2034 2034 2165 2052 2052 2166 2070 2070 2185 2071 2071 2186 2052 2052 2166 2071 2071 2186 2053 2053 2167 2053 2053 2167 2071 2071 2186 2072 2072 2187 2053 2053 2167 2072 2072 2187 2054 2054 2168 2054 2054 2168 2072 2072 2187 2073 2073 2188 2054 2054 2168 2073 2073 2188 2055 2055 2169 2055 2055 2169 2073 2073 2188 2074 2074 2189 2055 2055 2169 2074 2074 2189 2056 2056 2170 2056 2056 2170 2074 2074 2189 2075 2075 2190 2056 2056 2170 2075 2075 2190 2057 2057 2171 2057 2057 2171 2075 2075 2190 2076 2076 2191 2057 2057 2171 2076 2076 2191 2058 2058 2172 2058 2058 2172 2076 2076 2191 2077 2077 2192 2058 2058 2172 2077 2077 2192 2059 2059 2173 2059 2059 2173 2077 2077 2192 2078 2078 2193 2059 2059 2173 2078 2078 2193 2060 2060 2174 2060 2060 2174 2078 2078 2193 2079 2079 2194 2060 2060 2174 2079 2079 2194 2061 2061 2175 2061 2061 2175 2079 2079 2194 2080 2080 2195 2061 2061 2175 2080 2080 2195 2062 2062 2176 2062 2062 2176 2080 2080 2195 2081 2081 2196 2062 2062 2176 2081 2081 2196 2063 2063 2177 2063 2063 2177 2081 2081 2196 2082 2082 2197 2063 2063 2177 2082 2082 2197 2064 2064 2178 2064 2064 2178 2082 2082 2197 2083 2083 2198 2064 2064 2178 2083 2083 2198 2065 2065 2179 2065 2065 2179 2083 2083 2198 2084 2084 2199 2065 2065 2179 2084 2084 2199 2066 2066 2180 2066 2066 2180 2084 2084 2199 2085 2085 2200 2066 2066 2180 2085 2085 2200 2067 2067 2181 2067 2067 2181 2085 2085 2200 2086 2086 2201 2067 2067 2181 2086 2086 2201 2068 2068 2182 2068 2068 2182 2086 2086 2201 2087 2087 2202 2068 2068 2182 2087 2087 2202 2069 2069 2183 2069 2069 2183 2087 2087 2202 2070 2070 2203 2069 2069 2183 2070 2070 2203 2052 2052 2184 2070 2070 2185 2088 2088 2204 2089 2089 2205 2070 2070 2185 2089 2089 2205 2071 2071 2186 2071 2071 2186 2089 2089 2205 2090 2090 2206 2071 2071 2186 2090 2090 2206 2072 2072 2187 2072 2072 2187 2090 2090 2206 2091 2091 2207 2072 2072 2187 2091 2091 2207 2073 2073 2188 2073 2073 2188 2091 2091 2207 2092 2092 2208 2073 2073 2188 2092 2092 2208 2074 2074 2189 2074 2074 2189 2092 2092 2208 2093 2093 2209 2074 2074 2189 2093 2093 2209 2075 2075 2190 2075 2075 2190 2093 2093 2209 2094 2094 2210 2075 2075 2190 2094 2094 2210 2076 2076 2191 2076 2076 2191 2094 2094 2210 2095 2095 2211 2076 2076 2191 2095 2095 2211 2077 2077 2192 2077 2077 2192 2095 2095 2211 2096 2096 2212 2077 2077 2192 2096 2096 2212 2078 2078 2193 2078 2078 2193 2096 2096 2212 2097 2097 2213 2078 2078 2193 2097 2097 2213 2079 2079 2194 2079 2079 2194 2097 2097 2213 2098 2098 2214 2079 2079 2194 2098 2098 2214 2080 2080 2195 2080 2080 2195 2098 2098 2214 2099 2099 2215 2080 2080 2195 2099 2099 2215 2081 2081 2196 2081 2081 2196 2099 2099 2215 2100 2100 2216 2081 2081 2196 2100 2100 2216 2082 2082 2197 2082 2082 2197 2100 2100 2216 2101 2101 2217 2082 2082 2197 2101 2101 2217 2083 2083 2198 2083 2083 2198 2101 2101 2217 2102 2102 2218 2083 2083 2198 2102 2102 2218 2084 2084 2199 2084 2084 2199 2102 2102 2218 2103 2103 2219 2084 2084 2199 2103 2103 2219 2085 2085 2200 2085 2085 2200 2103 2103 2219 2104 2104 2220 2085 2085 2200 2104 2104 2220 2086 2086 2201 2086 2086 2201 2104 2104 2220 2105 2105 2221 2086 2086 2201 2105 2105 2221 2087 2087 2202 2087 2087 2202 2105 2105 2221 2088 2088 2222 2087 2087 2202 2088 2088 2222 2070 2070 2203 2088 2088 2204 2106 2106 2223 2107 2107 2224 2088 2088 2204 2107 2107 2224 2089 2089 2205 2089 2089 2205 2107 2107 2224 2108 2108 2225 2089 2089 2205 2108 2108 2225 2090 2090 2206 2090 2090 2206 2108 2108 2225 2109 2109 2226 2090 2090 2206 2109 2109 2226 2091 2091 2207 2091 2091 2207 2109 2109 2226 2110 2110 2227 2091 2091 2207 2110 2110 2227 2092 2092 2208 2092 2092 2208 2110 2110 2227 2111 2111 2228 2092 2092 2208 2111 2111 2228 2093 2093 2209 2093 2093 2209 2111 2111 2228 2112 2112 2229 2093 2093 2209 2112 2112 2229 2094 2094 2210 2094 2094 2210 2112 2112 2229 2113 2113 2230 2094 2094 2210 2113 2113 2230 2095 2095 2211 2095 2095 2211 2113 2113 2230 2114 2114 2231 2095 2095 2211 2114 2114 2231 2096 2096 2212 2096 2096 2212 2114 2114 2231 2115 2115 2232 2096 2096 2212 2115 2115 2232 2097 2097 2213 2097 2097 2213 2115 2115 2232 2116 2116 2233 2097 2097 2213 2116 2116 2233 2098 2098 2214 2098 2098 2214 2116 2116 2233 2117 2117 2234 2098 2098 2214 2117 2117 2234 2099 2099 2215 2099 2099 2215 2117 2117 2234 2118 2118 2235 2099 2099 2215 2118 2118 2235 2100 2100 2216 2100 2100 2216 2118 2118 2235 2119 2119 2236 2100 2100 2216 2119 2119 2236 2101 2101 2217 2101 2101 2217 2119 2119 2236 2120 2120 2237 2101 2101 2217 2120 2120 2237 2102 2102 2218 2102 2102 2218 2120 2120 2237 2121 2121 2238 2102 2102 2218 2121 2121 2238 2103 2103 2219 2103 2103 2219 2121 2121 2238 2122 2122 2239 2103 2103 2219 2122 2122 2239 2104 2104 2220 2104 2104 2220 2122 2122 2239 2123 2123 2240 2104 2104 2220 2123 2123 2240 2105 2105 2221 2105 2105 2221 2123 2123 2240 2106 2106 2241 2105 2105 2221 2106 2106 2241 2088 2088 2222 2106 2106 2223 2124 2124 2242 2125 2125 2243 2106 2106 2223 2125 2125 2243 2107 2107 2224 2107 2107 2224 2125 2125 2243 2126 2126 2244 2107 2107 2224 2126 2126 2244 2108 2108 2225 2108 2108 2225 2126 2126 2244 2127 2127 2245 2108 2108 2225 2127 2127 2245 2109 2109 2226 2109 2109 2226 2127 2127 2245 2128 2128 2246 2109 2109 2226 2128 2128 2246 2110 2110 2227 2110 2110 2227 2128 2128 2246 2129 2129 2247 2110 2110 2227 2129 2129 2247 2111 2111 2228 2111 2111 2228 2129 2129 2247 2130 2130 2248 2111 2111 2228 2130 2130 2248 2112 2112 2229 2112 2112 2229 2130 2130 2248 2131 2131 2249 2112 2112 2229 2131 2131 2249 2113 2113 2230 2113 2113 2230 2131 2131 2249 2132 2132 2250 2113 2113 2230 2132 2132 2250 2114 2114 2231 2114 2114 2231 2132 2132 2250 2133 2133 2251 2114 2114 2231 2133 2133 2251 2115 2115 2232 2115 2115 2232 2133 2133 2251 2134 2134 2252 2115 2115 2232 2134 2134 2252 2116 2116 2233 2116 2116 2233 2134 2134 2252 2135 2135 2253 2116 2116 2233 2135 2135 2253 2117 2117 2234 2117 2117 2234 2135 2135 2253 2136 2136 2254 2117 2117 2234 2136 2136 2254 2118 2118 2235 2118 2118 2235 2136 2136 2254 2137 2137 2255 2118 2118 2235 2137 2137 2255 2119 2119 2236 2119 2119 2236 2137 2137 2255 2138 2138 2256 2119 2119 2236 2138 2138 2256 2120 2120 2237 2120 2120 2237 2138 2138 2256 2139 2139 2257 2120 2120 2237 2139 2139 2257 2121 2121 2238 2121 2121 2238 2139 2139 2257 2140 2140 2258 2121 2121 2238 2140 2140 2258 2122 2122 2239 2122 2122 2239 2140 2140 2258 2141 2141 2259 2122 2122 2239 2141 2141 2259 2123 2123 2240 2123 2123 2240 2141 2141 2259 2124 2124 2260 2123 2123 2240 2124 2124 2260 2106 2106 2241 2124 2124 2242 2142 2142 2261 2143 2143 2262 2124 2124 2242 2143 2143 2262 2125 2125 2243 2125 2125 2243 2143 2143 2262 2144 2144 2263 2125 2125 2243 2144 2144 2263 2126 2126 2244 2126 2126 2244 2144 2144 2263 2145 2145 2264 2126 2126 2244 2145 2145 2264 2127 2127 2245 2127 2127 2245 2145 2145 2264 2146 2146 2265 2127 2127 2245 2146 2146 2265 2128 2128 2246 2128 2128 2246 2146 2146 2265 2147 2147 2266 2128 2128 2246 2147 2147 2266 2129 2129 2247 2129 2129 2247 2147 2147 2266 2148 2148 2267 2129 2129 2247 2148 2148 2267 2130 2130 2248 2130 2130 2248 2148 2148 2267 2149 2149 2268 2130 2130 2248 2149 2149 2268 2131 2131 2249 2131 2131 2249 2149 2149 2268 2150 2150 2269 2131 2131 2249 2150 2150 2269 2132 2132 2250 2132 2132 2250 2150 2150 2269 2151 2151 2270 2132 2132 2250 2151 2151 2270 2133 2133 2251 2133 2133 2251 2151 2151 2270 2152 2152 2271 2133 2133 2251 2152 2152 2271 2134 2134 2252 2134 2134 2252 2152 2152 2271 2153 2153 2272 2134 2134 2252 2153 2153 2272 2135 2135 2253 2135 2135 2253 2153 2153 2272 2154 2154 2273 2135 2135 2253 2154 2154 2273 2136 2136 2254 2136 2136 2254 2154 2154 2273 2155 2155 2274 2136 2136 2254 2155 2155 2274 2137 2137 2255 2137 2137 2255 2155 2155 2274 2156 2156 2275 2137 2137 2255 2156 2156 2275 2138 2138 2256 2138 2138 2256 2156 2156 2275 2157 2157 2276 2138 2138 2256 2157 2157 2276 2139 2139 2257 2139 2139 2257 2157 2157 2276 2158 2158 2277 2139 2139 2257 2158 2158 2277 2140 2140 2258 2140 2140 2258 2158 2158 2277 2159 2159 2278 2140 2140 2258 2159 2159 2278 2141 2141 2259 2141 2141 2259 2159 2159 2278 2142 2142 2279 2141 2141 2259 2142 2142 2279 2124 2124 2260 2142 2142 2261 0 0 2280 1 3 2281 2142 2142 2261 1 3 2281 2143 2143 2262 2143 2143 2262 1 3 2281 2 5 2282 2143 2143 2262 2 5 2282 2144 2144 2263 2144 2144 2263 2 5 2282 3 7 2283 2144 2144 2263 3 7 2283 2145 2145 2264 2145 2145 2264 3 7 2283 4 9 2284 2145 2145 2264 4 9 2284 2146 2146 2265 2146 2146 2265 4 9 2284 5 11 2285 2146 2146 2265 5 11 2285 2147 2147 2266 2147 2147 2266 5 11 2285 6 13 2286 2147 2147 2266 6 13 2286 2148 2148 2267 2148 2148 2267 6 13 2286 7 15 2287 2148 2148 2267 7 15 2287 2149 2149 2268 2149 2149 2268 7 15 2287 8 17 2288 2149 2149 2268 8 17 2288 2150 2150 2269 2150 2150 2269 8 17 2288 9 19 2289 2150 2150 2269 9 19 2289 2151 2151 2270 2151 2151 2270 9 19 2289 10 21 2290 2151 2151 2270 10 21 2290 2152 2152 2271 2152 2152 2271 10 21 2290 11 23 2291 2152 2152 2271 11 23 2291 2153 2153 2272 2153 2153 2272 11 23 2291 12 25 2292 2153 2153 2272 12 25 2292 2154 2154 2273 2154 2154 2273 12 25 2292 13 27 2293 2154 2154 2273 13 27 2293 2155 2155 2274 2155 2155 2274 13 27 2293 14 29 2294 2155 2155 2274 14 29 2294 2156 2156 2275 2156 2156 2275 14 29 2294 15 31 2295 2156 2156 2275 15 31 2295 2157 2157 2276 2157 2157 2276 15 31 2295 16 33 2296 2157 2157 2276 16 33 2296 2158 2158 2277 2158 2158 2277 16 33 2296 17 35 2297 2158 2158 2277 17 35 2297 2159 2159 2278 2159 2159 2278 17 35 2297 0 0 2298 2159 2159 2278 0 0 2298 2142 2142 2279</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-4_max" name="Torus_Knot-4_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-4_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-5.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-5.dae
new file mode 100644
index 0000000..bd181a2
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-5.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-5.max</source_data>
+ </contributor>
+ <created>2008-10-31T16:25:38Z</created>
+ <modified>2008-10-31T16:25:39Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="5400">25.402811 -0.001964 20.051733 28.341026 -4.492561 23.710152 29.775038 -7.779380 27.105207 29.320608 -8.981721 29.327200 27.099499 -7.777417 29.780748 23.706856 -4.489160 28.344322 20.051735 0.001962 25.402813 17.113520 4.492559 21.744394 15.679505 7.779379 18.349339 16.133934 8.981721 16.127346 18.355042 7.777419 15.673796 21.747684 4.489165 17.110220 26.109631 2.317777 20.773033 30.274225 -1.654639 23.782789 32.761864 -4.643335 26.826693 32.905983 -5.847491 29.089127 30.667965 -4.944455 29.963879 26.647491 -2.176195 29.216558 21.921839 1.715536 27.047407 17.757244 5.687953 24.037651 15.269605 8.676649 20.993750 15.125484 9.880806 18.731312 17.363497 8.977772 17.856560 21.383970 6.209514 18.603878 26.590143 4.695649 21.299910 31.773573 1.393926 23.400686 35.213028 -1.136284 25.881447 35.986912 -2.217014 28.077467 33.887859 -1.558683 29.400328 29.478313 0.662310 29.495569 23.939808 3.850851 28.337673 18.756378 7.152574 26.236893 15.316922 9.682784 23.756138 14.543036 10.763515 21.560116 16.642086 10.105186 20.237253 21.051628 7.884194 20.142012 26.837536 7.118128 21.629726 32.719040 4.518121 22.541035 36.917255 2.526287 24.212429 38.307274 1.676334 26.196064 36.516644 2.196007 27.960423 32.025162 3.946060 29.032749 26.036318 6.457568 29.125713 20.154816 9.057574 28.214407 15.956600 11.049410 26.543011 14.566577 11.899363 24.559378 16.357204 11.379691 22.795019 20.848682 9.629639 21.722691 26.868868 9.602695 21.766201 33.013447 7.561789 21.254898 37.675564 6.058935 21.881071 39.606007 5.496825 23.476944 38.287514 6.026074 25.614899 34.073376 7.504870 27.722075 28.092770 9.536971 29.233854 21.948191 11.577878 29.745159 17.286074 13.080730 29.118986 15.355631 13.642842 27.523117 16.674120 13.113594 25.385162 20.888254 11.634800 23.277985 26.722904 12.218230 21.688616 32.625465 10.409576 19.670908 37.377594 9.191654 19.105307 39.705967 8.890807 20.143360 38.986694 9.587646 22.506927 35.412506 11.095451 25.562687 29.941103 13.010211 28.491856 24.038544 14.818865 30.509563 19.286413 16.036785 31.075169 16.958038 16.337635 30.037115 17.677309 15.640798 27.673550 21.251493 14.132992 24.617790 26.435047 15.072664 21.311808 31.606880 13.056353 17.939981 36.056721 11.800577 16.205645 38.592239 11.641821 16.573513 38.534042 12.622623 18.945015 35.897728 14.480178 22.684708 31.389692 16.716755 26.790546 26.217859 18.733065 30.162373 21.768019 19.988842 31.896711 19.232500 20.147598 31.528847 19.290691 19.166798 29.157345 21.927006 17.309244 25.417654 26.003407 18.257013 20.476034 30.060545 15.616446 16.145950 33.869301 13.977969 13.463646 36.409122 13.780613 13.147843 36.999470 15.077258 15.283163 35.482155 17.520470 19.297443 32.263744 20.455589 24.115065 28.206608 23.096157 28.445150 24.397852 24.734634 31.127455 21.858028 24.931992 31.443260 21.267681 23.635347 29.307945 22.784994 21.192139 25.293665 25.375786 21.784838 18.986000 28.085573 18.252457 14.257160 31.014721 15.967852 11.003447 33.378368 15.543182 10.096685 34.543175 17.092236 11.779850 34.197033 20.199945 15.601929 32.432693 24.033606 20.538805 29.722908 27.565985 25.267645 26.793760 29.850590 28.521358 24.430115 30.275263 29.428120 23.265305 28.726210 27.744961 23.611444 25.618502 23.922882 24.466114 25.561783 16.678802 25.745634 21.079248 12.156382 27.667189 18.029602 8.780991 29.715900 17.229994 7.457061 31.342819 18.894682 8.539343 32.112015 22.577608 11.737837 31.817379 27.291941 16.195509 30.537861 31.774475 20.717930 28.616306 34.824123 24.093323 26.567595 35.623734 25.417252 24.940674 33.959049 24.334972 24.171480 30.276121 21.136482 23.187120 29.400393 13.479635 23.076649 24.107861 9.716724 23.960594 20.327387 6.665060 25.602104 19.071951 5.142332 27.561338 20.677940 5.556555 29.313320 24.715033 7.796739 30.388609 30.101492 11.262627 30.499081 35.394024 15.025537 29.615135 39.174496 18.077202 27.973627 40.429932 19.599930 26.014393 38.823948 19.185707 24.262411 34.786858 16.945528 21.479961 33.058830 9.426601 20.111931 27.251205 6.860952 20.006815 22.905182 4.518513 21.192778 21.185278 3.026938 23.352043 22.552338 2.785894 25.906036 26.640059 3.859969 28.170418 32.353138 5.961364 29.538448 38.160767 8.527013 29.643564 42.506790 10.869452 28.457602 44.226692 12.361028 26.298338 42.859638 12.602072 23.744345 38.771923 11.528000 19.333717 36.282551 4.669895 16.906075 30.355764 3.591790 15.920904 25.706236 2.251144 16.642185 23.579813 1.007181 18.876648 24.546257 0.193220 22.025572 28.346621 0.027361 25.245205 33.962593 0.554046 27.672848 39.889381 1.632150 28.658018 44.538906 2.972796 27.936739 46.665333 4.216760 25.702276 45.698891 5.030721 22.553354 41.898533 5.196580 16.789354 38.844505 -0.554875 13.542306 33.245373 -0.017335 11.830606 28.615986 -0.175027 12.112906 26.196791 -0.985696 14.313560 26.636009 -2.232126 17.842907 29.815950 -3.580335 21.755260 34.884548 -4.669073 25.002310 40.483685 -5.206614 26.714010 45.113068 -5.048923 26.431713 47.532265 -4.238253 24.231060 47.093052 -2.991824 20.701714 43.913113 -1.643615 13.932156 40.573097 -5.963187 10.124010 35.754292 -3.851384 7.866651 31.497627 -2.769203 7.764933 28.943674 -3.006614 9.846113 28.776764 -4.500003 13.552540 31.041620 -6.849216 17.891081 35.131374 -9.424785 21.699224 39.950184 -11.536588 23.956585 44.206848 -12.618770 24.058304 46.760799 -12.381360 21.977127 46.927711 -10.887973 18.270702 44.662857 -8.538760 10.871604 41.367943 -11.266026 6.752348 37.743828 -7.790380 4.138643 34.208302 -5.542143 3.730829 31.708702 -5.123727 5.638179 30.914799 -6.647246 9.349620 32.039314 -9.704475 13.870674 34.780933 -13.476232 17.989929 38.405048 -16.951876 20.603636 41.940575 -19.200113 21.011452 44.440178 -19.618532 19.104103 45.234085 -18.095015 15.392665 44.109570 -15.037787 7.722597 41.199650 -16.199976 3.500520 39.099487 -11.733885 0.702578 36.593494 -8.528030 0.078476 34.353146 -7.441421 1.795445 32.978745 -8.765211 5.393421 32.838558 -12.144692 9.908330 33.970150 -16.674335 14.130406 36.070313 -21.140429 16.928349 38.576305 -24.346281 17.552452 40.816650 -25.432894 15.835486 42.191055 -24.109104 12.237513 42.331242 -20.729626 4.591222 40.101845 -20.544132 0.396558 39.715946 -15.600605 -2.460694 38.464703 -11.772226 -3.214933 36.683376 -10.084806 -1.664063 34.849277 -10.990488 1.776361 33.453850 -14.246597 6.184481 32.870995 -18.980659 10.379145 33.256893 -23.924183 13.236396 34.508137 -27.752563 13.990639 36.289459 -29.439983 12.439771 38.123562 -28.534304 8.999349 39.518990 -25.278200 1.575475 38.164669 -24.120239 -2.569902 39.487297 -19.298508 -5.438187 39.583069 -15.279833 -6.260827 38.426308 -13.141012 -4.817393 36.326973 -13.455143 -1.494656 33.847580 -16.138054 2.817062 31.652479 -20.470860 6.962438 30.329845 -25.292587 9.830725 30.234081 -29.311264 10.653365 31.390839 -31.450085 9.209934 33.490173 -31.135956 5.887199 35.969566 -28.453051 -1.225904 35.536892 -26.794321 -5.414059 38.324150 -22.686632 -8.336660 39.681118 -18.944571 -9.210603 39.244186 -16.570820 -7.801711 37.130432 -16.201424 -4.487498 33.906239 -17.935360 -0.156005 30.435522 -21.308025 4.032149 27.648260 -25.415712 6.954752 26.291294 -29.157776 7.828695 26.728226 -31.531528 6.419806 28.841976 -31.900927 3.105595 32.066170 -30.166992 -3.711886 32.427948 -28.493917 -8.105902 36.207989 -25.563644 -11.196574 38.550583 -22.506523 -12.155759 38.828026 -20.141705 -10.726444 36.965984 -19.102840 -7.291615 33.463387 -19.668295 -2.771629 29.258755 -21.686552 1.622386 25.478714 -24.616823 4.713058 23.136120 -27.673944 5.672245 22.858673 -30.038765 4.242933 24.720715 -31.077629 0.808106 28.223309 -30.512177 -5.794844 29.090782 -29.234079 -10.547544 33.250481 -27.720360 -13.935078 36.159801 -25.611700 -15.049763 37.039200 -23.473120 -13.592916 35.653034 -21.877649 -9.954902 32.372734 -21.252792 -5.110521 28.077248 -21.765978 -0.357823 23.917551 -23.279699 3.029713 21.008228 -25.388355 4.144399 20.128830 -27.526936 2.687556 21.514992 -29.122406 -0.950457 24.795292 -29.747265 -7.432318 25.771303 -29.124788 -12.605531 29.696995 -29.027802 -16.367849 32.709511 -27.952780 -17.711166 34.001652 -26.187773 -16.275537 33.227192 -24.205713 -12.445641 30.593645 -22.537691 -7.247694 26.806665 -21.630653 -2.074482 22.880976 -21.727642 1.687838 19.868458 -22.802662 3.031156 18.576313 -24.567669 1.595530 19.350773 -26.549728 -2.234364 21.984320 -28.217749 -8.640265 22.653700 -28.336487 -14.175543 25.850018 -29.488377 -18.305746 28.555113 -29.389053 -19.924191 30.044159 -28.065136 -18.597216 29.918163 -25.871359 -14.680384 28.210888 -23.395552 -9.223207 25.379797 -21.301102 -3.687932 22.183479 -20.149212 0.442272 19.478384 -20.248533 2.060719 17.989340 -21.572453 0.733747 18.115334 -23.766226 -3.183082 19.822605 -26.242033 -9.479653 19.839638 -27.046637 -15.217759 21.980869 -29.208086 -19.627808 24.075396 -29.949976 -21.528131 25.561996 -29.073519 -20.409540 26.042330 -26.813560 -16.571758 25.387697 -23.775658 -11.043117 23.773506 -20.773811 -5.305011 21.632277 -18.612362 -0.894962 19.537748 -17.870472 1.005364 18.051149 -18.746927 -0.113225 17.570812 -21.006882 -3.951005 18.225445 -24.044785 -10.027859 17.364170 -25.402821 -15.749867 18.279701 -28.335911 -20.296587 19.571089 -29.766172 -22.449730 20.892300 -29.310368 -21.632360 21.889322 -27.090630 -18.063494 22.295004 -23.701736 -12.699406 22.000641 -20.051739 -6.977398 21.085110 -17.118650 -2.430678 19.793722 -15.688387 -0.277534 18.472511 -16.144190 -1.094900 17.475489 -18.363924 -4.663764 17.069809 -21.752817 -10.360723 15.224617 -23.512394 -15.819410 14.861465 -27.012888 -20.327477 15.247266 -28.991392 -22.676991 16.278648 -28.917768 -22.238400 17.679253 -26.811749 -19.129227 19.073786 -23.237635 -14.182570 20.088589 -19.153109 -8.723886 20.451742 -15.652616 -4.215818 20.065941 -13.674110 -1.866305 19.034559 -13.747730 -2.304892 17.633955 -15.853749 -5.414062 16.239422 -19.427862 -10.548304 13.401569 -21.448816 -15.487481 11.791653 -25.346930 -19.764320 11.237866 -27.752743 -22.232851 11.888598 -28.021618 -22.231627 13.569482 -26.081514 -19.760979 15.830130 -22.452280 -15.482915 18.064800 -18.106361 -10.543739 19.674717 -14.208248 -6.266898 20.228504 -11.802435 -3.798368 19.577774 -11.533556 -3.799590 17.896889 -13.473657 -6.270235 15.636243 -17.102892 -10.654281 11.870151 -19.262699 -14.819475 9.112339 -23.413387 -18.663824 7.640168 -26.140966 -21.157238 7.848103 -26.714577 -21.631609 9.680428 -24.980524 -19.959827 12.646173 -21.403448 -16.589849 15.950668 -16.941820 -12.424656 18.708479 -12.791130 -8.580307 20.180653 -10.063553 -6.086892 19.972717 -9.489939 -5.612521 18.140396 -11.223989 -7.284298 15.174651 -14.801065 -10.739265 10.600572 -16.991253 -13.889677 6.855608 -21.261232 -17.100143 4.538042 -24.212126 -19.510424 4.268860 -25.053242 -20.474684 6.120191 -23.559202 -19.734550 9.595974 -20.130335 -17.488344 13.764873 -15.685405 -14.337933 17.509836 -11.415422 -11.127466 19.827404 -8.464530 -8.717186 20.096588 -7.623414 -7.752925 18.245258 -9.117451 -8.493055 14.769478 -12.546314 -10.860299 9.556005 -14.664935 -12.785354 5.045298 -18.922901 -15.172533 2.007474 -21.998447 -17.382195 1.256515 -23.067482 -18.822262 2.993636 -21.843559 -19.106869 6.753381 -18.654625 -18.159756 11.528328 -14.355155 -16.234703 16.039034 -10.097188 -13.847525 19.076859 -7.021641 -11.637863 19.827820 -5.952606 -10.197796 18.090700 -7.176528 -9.913187 14.330957 -10.365459 -11.067928 8.690038 -12.311372 -11.608091 3.691750 -16.423300 -13.010669 0.110273 -19.520361 -14.899839 -1.094737 -20.772703 -16.769403 0.399597 -19.844759 -18.118410 4.192871 -16.985174 -18.585396 9.268681 -12.960171 -18.045233 14.266968 -8.848244 -16.642656 17.848444 -5.751182 -14.753487 19.053455 -4.498839 -12.883924 17.559124 -5.426780 -11.534915 13.765854 -8.286363 -11.401760 7.945922 -9.955572 -10.468793 2.784595 -13.786090 -10.770514 -1.117487 -16.797520 -12.226078 -2.714766 -18.182949 -14.445468 -1.579249 -17.571156 -16.834000 1.984799 -15.126066 -18.751669 7.022396 -11.502845 -19.684637 12.183722 -7.672328 -19.382915 16.085806 -4.660899 -17.927353 17.683086 -3.275468 -15.707964 16.547571 -3.887261 -13.319432 12.983526 -6.332346 -11.886127 7.259474 -7.621522 -9.480241 2.287420 -11.038095 -8.625885 -1.677503 -13.855087 -9.551985 -3.572897 -15.317690 -12.010392 -2.890892 -15.033997 -15.342379 0.185769 -13.080025 -18.655142 4.832696 -9.979340 -21.061028 9.804750 -6.562767 -21.915384 13.769673 -3.745774 -20.989286 15.665068 -2.283172 -18.530880 14.983065 -2.566863 -15.198895 11.906407 -4.520833 -12.526372 6.561398 -5.331154 -8.748269 2.130716 -8.208234 -6.756948 -1.623702 -10.723184 -7.085982 -3.695863 -12.202126 -9.647206 -3.530531 -12.248777 -13.754342 -1.172009 -10.850641 -18.306887 2.747739 -8.382343 -22.084990 7.178421 -5.505265 -24.076311 10.932838 -2.990315 -23.747278 13.005001 -1.511372 -21.186056 12.839671 -1.464718 -17.078922 10.481152 -2.862854 -13.308053 5.785397 -3.103840 -8.357424 2.220315 -5.331854 -5.326253 -1.055709 -7.445065 -5.026742 -3.164868 -8.877239 -7.539145 -3.542013 -9.244629 -12.190265 -2.086090 -8.448790 -17.733835 0.812788 -6.702968 -22.684465 4.377869 -4.474955 -25.715637 7.653893 -2.361744 -26.015150 9.763052 -0.929569 -23.502750 10.140199 -0.562179 -18.851633 8.684278 -1.358016 -14.197878 4.872149 -0.954799 -8.363507 2.439337 -2.446151 -4.464954 -0.119436 -4.070942 -3.546832 -2.118548 -5.393810 -5.855152 -3.022339 -6.060295 -10.771399 -2.588639 -5.891812 -16.978271 -0.933658 -4.933507 -22.812641 1.499154 -3.442156 -26.711197 4.057927 -1.817365 -27.629320 6.057039 -0.494496 -25.321005 6.960832 0.171989 -20.404758 6.527133 0.003507 -15.146792 3.775322 1.104918 -8.786503 2.657969 0.411492 -4.257493 1.003848 -0.655247 -2.773304 -0.743820 -1.809467 -4.731626 -2.116749 -2.741894 -9.607727 -2.747063 -3.202688 -16.095058 -2.465871 -3.068377 -22.455347 -1.348518 -2.374952 -26.984358 0.305602 -1.308213 -28.468548 2.053270 -0.153994 -26.510229 3.426199 0.778434 -21.634132 4.056515 1.239228 -16.095030 2.465796 3.068498 -9.607704 2.747619 3.201771 -4.731616 2.117795 2.740173 -2.773311 0.745084 1.807390 -4.257514 -1.002696 0.653360 -8.786533 -2.657230 -0.412695 -15.146823 -3.775186 -1.105127 -21.634148 -4.057010 -1.238400 -26.510237 -3.427186 -0.776803 -28.468544 -2.054476 0.155980 -26.984346 -0.306696 1.310009 -22.455330 1.347838 2.376065 -16.978266 0.933514 4.933714 -10.771432 2.589532 5.890478 -5.855214 3.024037 6.057761 -3.546908 2.120605 5.390742 -4.465024 0.121309 4.068148 -8.363552 -2.438142 2.444366 -14.197886 -4.871943 0.954488 -20.404718 -6.527962 -0.002275 -25.320938 -6.962468 -0.169559 -27.629246 -6.059037 0.497459 -26.711132 -4.059742 1.820053 -22.812607 -1.500292 3.443834 -17.733753 -0.813053 6.703437 -12.190145 2.086288 8.448377 -7.539022 3.542628 9.243432 -5.026650 3.165744 8.875568 -5.326217 1.056620 7.443355 -8.357452 -2.219604 5.330552 -13.308140 -5.785069 3.103283 -18.851748 -8.684409 1.358343 -23.502871 -10.140751 0.563287 -26.015244 -9.763867 0.931150 -25.715681 -7.654747 2.363362 -22.684448 -4.378523 4.476164 -18.306555 -2.748142 8.383480 -13.753493 1.171216 10.851444 -9.646070 3.529568 12.249022 -7.084864 3.694996 12.201733 -6.756148 1.623174 10.722247 -8.748003 -2.130756 8.206993 -12.526711 -6.560930 5.329931 -17.079771 -10.480288 2.861966 -21.187195 -12.838642 1.464388 -23.748404 -13.004072 1.511676 -24.077120 -10.932251 2.991160 -22.085268 -7.178324 5.506413 -18.654736 -4.833069 9.980888 -15.340923 -0.186953 13.081670 -12.008278 2.889222 15.035285 -9.549780 3.571198 15.318262 -8.624181 1.676239 13.854782 -9.479495 -2.287901 11.036979 -11.886541 -7.259034 7.619884 -15.200353 -11.905150 4.519102 -18.532997 -14.981326 2.565486 -20.991495 -15.663302 2.282507 -21.917095 -13.768347 3.745986 -21.061783 -9.804209 6.563788 -18.751245 -7.022285 11.504793 -16.831230 -1.986538 15.129347 -14.441096 1.576134 17.574875 -12.221277 2.711117 18.186100 -10.766572 1.114293 16.799246 -10.466767 -2.786469 13.785919 -11.402196 -7.945965 9.953536 -13.322208 -12.981710 6.328983 -15.712342 -16.544384 3.883454 -17.932161 -17.679369 3.272228 -19.386868 -16.082548 4.659080 -19.686674 -12.181787 7.672405 -18.585236 -9.268423 12.962265 -18.115314 -4.194484 16.989286 -16.764204 -0.402639 19.849775 -14.893933 1.091090 20.777266 -13.005638 -0.113541 19.523235 -11.605288 -3.693750 16.423704 -11.068104 -8.690224 12.309187 -11.538023 -13.764162 8.282166 -12.889133 -17.556007 5.421675 -14.759404 -19.049740 4.494184 -16.647699 -17.845112 5.748212 -18.048050 -14.264904 8.847742 -18.159994 -11.527770 14.357186 -19.103519 -6.754763 18.659599 -18.816227 -2.996579 21.850130 -17.375092 -1.260217 23.073879 -15.166269 -2.010937 22.002945 -12.781610 -5.047583 18.924284 -10.860080 -9.556488 14.662820 -9.916553 -14.329494 10.360408 -10.203846 -18.087679 7.169876 -11.644979 -19.824043 5.946124 -13.853801 -19.073324 7.017056 -16.238461 -16.036682 10.095716 -17.489130 -13.764050 15.687484 -19.730864 -9.597326 20.136715 -20.467512 -6.123348 23.568157 -19.501694 -4.272964 25.062363 -17.092196 -4.541981 24.218960 -13.884644 -6.858319 21.263933 -10.738498 -10.601315 16.989086 -8.496764 -14.768037 12.539859 -7.760114 -18.242016 9.108416 -8.725931 -20.092402 7.614209 -11.135427 -19.823387 8.457611 -14.342978 -17.507050 11.412632 -16.591137 -15.949826 16.943634 -19.956408 -12.647753 21.410606 -21.624397 -9.683994 24.991100 -21.148174 -7.852691 26.725723 -18.655338 -7.644536 26.149683 -14.813845 -9.115305 23.417334 -10.653018 -11.870909 19.260801 -7.287748 -15.172981 14.793828 -5.619756 -18.136740 11.213335 -6.095979 -19.968044 9.478711 -8.588812 -20.176201 10.054749 -12.430305 -18.705433 12.787096 -15.484949 -18.063625 18.107731 -19.757801 -15.831770 22.460217 -22.224091 -13.573486 26.093885 -22.222980 -11.893883 28.035101 -19.754765 -11.243008 27.763712 -15.480802 -11.795260 25.352440 -10.546297 -13.402666 21.447382 -6.273445 -15.634521 17.094896 -3.807153 -17.892803 13.461226 -3.808263 -19.572407 11.520012 -6.276475 -20.223284 11.791399 -10.550436 -19.671032 14.202669 -14.185494 -20.086981 19.153881 -19.126413 -19.075798 23.246241 -22.230606 -17.684332 26.825878 -22.666307 -16.285427 28.933628 -20.316772 -15.253921 29.004723 -15.811557 -14.866200 27.020113 -10.357829 -15.226156 23.511572 -5.416911 -16.237339 19.419210 -2.312716 -17.628803 15.839577 -1.877012 -19.027708 13.731824 -4.226544 -20.059216 13.660728 -8.731758 -20.446938 15.645336 -12.703307 -21.998373 20.051727 -18.061245 -22.297537 23.710360 -21.624565 -21.895971 27.105574 -22.438482 -20.901274 29.327621 -20.284904 -19.579971 29.781107 -15.740885 -18.286112 28.344522 -10.023987 -17.366377 25.402796 -4.666050 -17.067213 21.744164 -1.102728 -17.468779 18.348951 -0.288810 -18.463476 16.126902 -2.442384 -19.784775 15.673413 -6.986402 -21.078638 17.109997 -11.047631 -23.770456 20.773027 -16.570154 -25.390785 23.782824 -20.402250 -26.050716 26.826752 -21.517115 -25.573427 29.089195 -19.616018 -24.086805 29.963934 -15.208361 -21.989189 29.216581 -9.475169 -19.842634 27.047394 -3.952647 -18.222309 24.037598 -0.120549 -17.562374 20.993668 0.994317 -18.039661 18.731224 -0.906776 -19.526283 17.856483 -5.314432 -21.623898 18.603836 -9.228685 -25.375456 21.299881 -14.679664 -28.213661 23.400835 -18.590494 -29.927303 25.881729 -19.913271 -30.057209 28.077808 -18.293558 -28.568571 29.400635 -14.165359 -25.860270 29.495758 -8.634819 -22.657991 28.337694 -3.183841 -19.819786 26.236740 0.726989 -18.106146 23.755846 2.049769 -17.976240 21.559767 0.430060 -19.464874 20.236940 -3.698137 -22.173176 20.141813 -7.254162 -26.801058 21.629728 -12.446452 -30.594801 22.540899 -16.270477 -33.234798 24.212194 -17.701593 -34.013668 26.195789 -16.356335 -32.722710 27.960184 -12.595161 -29.707836 29.032608 -7.425878 -25.776880 29.125706 -2.233589 -21.983137 28.214535 1.590437 -19.343140 26.543243 3.021555 -18.564270 24.559647 1.676299 -19.855227 22.795256 -2.084871 -22.870098 21.722832 -5.118119 -28.070484 21.766214 -9.957692 -32.371593 21.254734 -13.590154 -35.657818 21.880781 -15.042190 -37.048618 23.476601 -13.924726 -36.171337 25.614597 -10.537189 -33.261032 27.721895 -5.787266 -29.097523 29.233847 -0.947694 -24.796417 29.745327 2.684768 -21.510193 29.119282 4.136805 -20.119387 27.523464 3.019345 -20.996668 25.385468 -0.368190 -23.906971 23.278168 -2.780457 -29.251665 21.688658 -7.298279 -33.458988 19.671156 -10.729159 -36.965450 19.105692 -12.153799 -38.831501 20.143784 -11.190466 -38.557133 22.507275 -8.097284 -36.215862 25.562870 -3.703070 -32.435032 28.491823 0.814752 -28.227709 30.509327 4.245634 -24.721247 31.074787 5.670275 -22.855194 30.036697 4.706944 -23.129560 27.673208 1.613764 -25.470829 24.617615 -0.164771 -30.429401 21.312035 -4.497156 -33.900047 17.940439 -7.809670 -37.125832 16.206213 -9.214731 -39.242409 16.574036 -8.335852 -39.682640 18.945354 -5.408527 -38.328571 22.684772 -1.217134 -35.543018 26.790316 3.115250 -32.072372 30.161911 6.427765 -28.846592 31.896141 7.832827 -26.730011 31.528316 6.953949 -26.289780 29.157001 4.026628 -27.643848 25.417587 2.809471 -31.648178 20.475967 -1.505638 -33.841583 16.145679 -4.828821 -36.320892 13.463242 -6.269635 -38.421768 13.147408 -5.442012 -39.581287 15.282806 -2.567717 -39.488762 19.297260 1.583087 -38.168976 24.115101 5.898195 -35.975571 28.445387 9.221378 -33.496265 31.127827 10.662193 -31.395386 31.443663 9.834574 -30.235863 29.308264 6.960280 -30.328394 25.293812 6.178480 -32.868546 18.985903 1.765152 -33.449333 14.256441 -1.677471 -34.843906 11.002291 -3.226941 -36.678593 10.095398 -2.468078 -38.461784 11.778766 0.395780 -39.715687 15.601336 4.597265 -40.104309 20.538851 9.010592 -39.523521 25.268312 12.453217 -38.128944 28.522465 14.002687 -36.294262 29.429359 13.243827 -34.511066 27.745995 10.379971 -33.257172 23.923428 9.904259 -33.969204 16.678650 5.382362 -32.835983 12.156388 1.780372 -32.975231 8.781146 0.063437 -34.349636 7.457318 0.691609 -36.590931 8.539623 3.496570 -39.098557 11.738056 7.726731 -41.200600 16.195601 12.248627 -42.333824 20.717863 15.850617 -42.194576 24.093105 17.567554 -40.820171 25.416935 16.939384 -38.578880 24.334633 14.134426 -36.071251 21.136200 13.868072 -34.780842 13.479478 9.339577 -32.038872 9.716912 5.623398 -30.914124 6.665528 3.715282 -31.707979 5.142942 4.126509 -34.207726 5.557129 6.746888 -37.743553 7.797108 10.874292 -41.368042 11.262677 15.402786 -44.110016 15.025244 19.118965 -45.234764 18.076626 21.027082 -44.440910 19.599215 20.615858 -41.941170 19.185028 17.995481 -38.405342 16.945053 17.889669 -35.131638 9.426795 13.544307 -31.043039 6.860909 9.833279 -28.778955 4.518223 7.750950 -28.946053 3.026457 7.855279 -31.499548 2.785328 10.118312 -35.755241 3.859448 13.933669 -40.572823 5.961006 18.279030 -44.661423 8.526892 21.990059 -46.925503 10.869577 24.072390 -46.758408 12.361344 23.968061 -44.204918 12.602474 21.705030 -39.949223 11.528356 21.754723 -34.884800 4.669963 17.835808 -29.818989 3.591876 14.301817 -26.641022 2.251200 12.099681 -26.202427 1.007169 11.819460 -28.620728 0.193121 13.536239 -33.247944 0.027178 16.790009 -38.844212 0.553806 20.708921 -43.910019 1.631893 24.242912 -47.087990 2.972569 26.445049 -47.526585 4.216599 26.725271 -45.108288 5.030648 25.008495 -40.481075 5.196591 25.245764 -33.962196 -0.555068 22.020399 -28.350531 -0.017660 18.867144 -24.553417 -0.175423 16.630911 -23.588291 -0.986083 15.910896 -25.713753 -2.232425 16.900030 -30.360291 -3.580492 19.333271 -36.282864 -4.669072 22.558638 -41.894531 -5.206480 25.711893 -45.691647 -5.048718 27.948126 -46.656773 -4.238059 28.668140 -44.531315 -2.991717 27.679008 -39.884781 -1.643650 28.171301 -32.352131 -5.963292 25.902061 -26.644936 -3.851166 23.344290 -22.561781 -2.768756 21.183336 -21.196737 -3.006091 19.998230 -22.915575 -4.499578 20.106518 -27.257727 -6.849040 21.479185 -33.059719 -9.424937 23.748423 -38.766911 -11.537063 26.306194 -42.850071 -12.619474 28.467148 -44.215111 -12.382140 29.652254 -42.496281 -10.888654 29.543968 -38.154133 -8.539194 30.389921 -30.099024 -11.266131 29.310841 -24.719933 -7.789992 27.555742 -20.688875 -5.541398 25.594902 -19.085968 -5.122857 23.953728 -20.340710 -6.646518 23.071968 -24.116894 -9.704117 23.185892 -29.402695 -13.476373 24.264971 -34.781784 -16.952513 26.020069 -38.812843 -19.201107 27.980909 -40.415752 -19.619652 29.622084 -39.161011 -18.095989 30.503845 -35.384834 -15.038393 31.818678 -27.287685 -16.200123 32.110825 -22.581654 -11.733522 31.339468 -18.905918 -8.527286 29.711292 -17.245386 -7.440518 27.662565 -18.045000 -8.764421 25.742243 -21.090502 -12.144254 24.464872 -25.565849 -16.674393 24.172726 -30.271879 -21.140991 24.944082 -33.947617 -24.347229 26.572256 -35.608147 -25.433998 28.620983 -34.808537 -24.110098 30.541306 -31.763039 -20.730267 32.433605 -24.027002 -20.544174 34.196716 -20.201736 -15.600350 34.541718 -17.101913 -11.771766 33.376163 -15.558125 -10.084290 31.012367 -15.984027 -10.990076 28.083702 -18.265501 -14.246421 25.374905 -21.791227 -18.980789 23.611794 -25.616489 -23.924612 23.266792 -28.716312 -27.753195 24.432344 -30.260105 -29.440674 26.796141 -29.834206 -28.534889 29.724804 -27.552732 -25.278549 32.263760 -20.447496 -24.119892 35.482075 -17.517282 -19.299217 36.999313 -15.079802 -15.281425 36.408932 -13.788176 -13.143078 33.869125 -13.988494 -13.457142 30.060434 -15.627083 -16.139465 26.003391 -18.264883 -20.471323 22.785078 -21.195095 -25.291996 21.267839 -23.632578 -29.309788 21.858217 -24.924204 -31.448139 24.398022 -24.723886 -31.134075 28.206713 -23.085300 -28.451756 31.388742 -16.706089 -26.794590 35.896683 -14.473150 -22.686666 38.533176 -12.621086 -18.944376 38.591782 -11.646156 -16.570461 36.056789 -11.809593 -16.201015 31.607454 -13.067601 -17.935032 26.435970 -15.083100 -21.307875 21.928030 -17.316038 -25.415798 19.291534 -19.168102 -29.158091 19.232927 -20.143032 -31.532001 21.767916 -19.979597 -31.901451 26.217249 -18.721590 -30.167439 29.939316 -12.998945 -28.493992 35.409966 -11.083944 -25.563576 38.984074 -9.578951 -22.506332 39.703964 -8.887223 -20.141453 37.376736 -9.194112 -19.102604 32.625973 -10.417385 -19.668140 26.724638 -12.229267 -21.686531 21.253986 -14.144267 -24.616947 17.679878 -15.649261 -27.674187 16.959990 -16.340988 -30.039066 19.287212 -16.034101 -31.077919 24.037973 -14.810829 -30.512384 28.090731 -9.527630 -29.234091 34.069523 -7.491283 -27.720837 38.282864 -6.011853 -25.612516 39.601799 -5.485751 -23.474058 37.672916 -6.053946 -21.878456 33.013062 -7.564189 -21.253252 26.870834 -9.611813 -21.765968 20.892044 -11.648159 -23.279222 16.678699 -13.127589 -25.387543 15.359763 -13.653691 -27.526001 17.288643 -13.085499 -29.121603 21.948496 -11.575256 -29.746809 26.034605 -6.448629 -29.124739 32.020847 -3.931074 -29.027668 36.510868 -2.178961 -27.952599 38.301575 -1.661767 -26.187588 36.913147 -2.518074 -24.205572 32.717613 -4.518434 -22.537630 26.839161 -7.126853 -21.630688 20.852921 -9.644407 -21.727757 16.362898 -11.396521 -22.802826 14.572188 -11.913717 -24.567837 15.960614 -11.057411 -26.549850 20.156145 -9.057052 -28.217793 23.938696 -3.843793 -28.336401 29.474363 -0.648087 -29.488121 33.882111 1.576286 -29.388689 35.980892 2.233309 -28.064747 35.208340 1.146931 -25.871048 31.771454 -1.391752 -23.395386 26.591150 -4.702503 -21.301119 21.055487 -7.898208 -20.149401 16.647736 -10.122582 -20.248833 14.548953 -10.779605 -21.572769 15.321505 -9.693229 -23.766472 18.758387 -7.154548 -26.242130 21.921354 -1.710054 -27.046553 26.644672 2.188814 -29.207958 30.663553 4.960855 -29.949825 32.901142 5.863304 -29.073372 32.757874 4.654348 -26.813442 30.272142 1.657929 -23.775583 26.109997 -2.323066 -20.773788 21.386679 -6.221934 -18.612381 17.367798 -8.993976 -17.870512 15.130210 -9.896425 -18.746964 15.273474 -8.687472 -21.006891 17.759203 -5.691055 -24.044750 20.051649 0.002206 -25.402727 23.705282 4.499954 -28.335953 27.096842 7.791968 -29.766319 29.317562 8.996155 -29.310564 29.772404 7.789854 -27.090803 28.339491 4.496292 -23.701822 25.402775 -0.002023 -20.051697 21.749142 -4.499771 -17.118469 18.357582 -7.791785 -15.688101 16.136862 -8.995974 -16.143856 15.682018 -7.789675 -18.363615 17.114927 -4.496115 -21.752596 18.365183 1.360642 -23.512337 20.779957 6.269974 -27.012325 23.368055 9.981406 -28.990452 25.436003 11.500464 -28.916685 26.429691 10.420115 -26.810787 26.082865 7.029840 -23.237032 24.488455 2.238061 -19.153006 22.073683 -2.671271 -15.653017 19.485582 -6.382704 -13.674888 17.417637 -7.901762 -13.748654 16.423946 -6.821416 -15.854549 16.770771 -3.431145 -19.428305 16.880165 2.434352 -21.448668 17.955462 7.516688 -25.346897 19.614246 11.497392 -27.752808 21.412048 13.309839 -28.021740 22.867147 12.468384 -26.081631 23.589653 9.198496 -22.452335 23.385969 4.376337 -18.106318 22.310671 -0.705998 -14.208090 20.651888 -4.686703 -11.802177 18.854086 -6.499151 -11.533245 17.398985 -5.657699 -13.473349 16.676479 -2.387813 -17.102644 15.606886 3.291848 -19.262466 15.301125 8.277704 -23.413410 15.948352 12.342949 -26.141207 17.375141 14.398301 -26.714947 19.199188 13.893033 -24.980892 20.931738 10.962529 -21.403687 22.108557 6.392017 -16.941839 22.414318 1.406162 -12.790895 21.767092 -2.659083 -10.063097 20.340302 -4.714437 -9.489359 18.516256 -4.209171 -11.223410 16.783707 -1.278671 -14.800612 14.549733 4.000581 -16.991295 12.881879 8.602078 -21.260612 12.480217 12.541622 -24.210976 13.452372 14.763613 -25.051842 15.537854 14.672670 -23.557898 18.177862 12.293163 -20.129446 20.665007 8.262678 -15.685136 22.332861 3.661181 -11.415819 22.734524 -0.278362 -8.465454 21.762371 -2.500354 -7.624588 19.676889 -2.409413 -9.118530 17.036882 -0.029909 -12.546980 13.705905 4.627270 -14.664737 10.761926 8.549539 -18.922832 9.324570 12.135666 -21.998493 9.778975 14.424753 -23.067593 12.003384 14.803440 -21.843672 15.401766 13.170259 -18.654676 19.063530 9.962818 -14.355097 22.007509 6.040551 -10.097002 23.444866 2.454423 -7.021342 22.990463 0.165335 -5.952239 20.766056 -0.213353 -7.176158 17.367674 1.419826 -10.365150 13.059866 5.240057 -12.310959 9.001230 8.206286 -16.423325 6.600764 11.211199 -19.520782 6.501670 13.449632 -20.773371 8.730501 14.321798 -19.845459 12.690042 13.594003 -16.985683 17.319338 11.461257 -12.960316 21.377974 8.495028 -8.847950 23.778440 5.490116 -5.750492 23.877537 3.251682 -4.497902 21.648708 2.379515 -5.425810 17.689169 3.107308 -8.285585 12.582497 5.901254 -9.955112 7.646270 7.672897 -13.786241 4.417812 9.884488 -16.798201 3.762185 11.943434 -18.183943 5.855063 13.298039 -17.572155 10.135661 13.585340 -15.126768 15.456996 12.728356 -11.503022 20.393221 10.956714 -7.671895 23.621679 8.745123 -4.659934 24.277309 6.686179 -3.274192 22.184435 5.331572 -3.885976 17.903839 5.044269 -6.331361 12.229935 6.664083 -7.621139 6.721097 7.066184 -11.037805 2.860199 8.308464 -13.854929 1.681766 10.058057 -15.317667 3.501559 11.846160 -15.034077 7.831964 13.193652 -13.080149 13.512653 13.739473 -9.979437 19.021492 13.337374 -6.562772 22.882389 12.095094 -3.745648 24.060823 10.345502 -2.282909 22.241034 8.557398 -2.566496 17.910631 7.209907 -4.520422 11.945438 7.567260 -5.331599 6.218821 6.511494 -8.208020 1.971385 6.664842 -10.722330 0.341226 7.986216 -12.200822 1.765147 10.121553 -12.247335 5.861607 12.498692 -10.849406 11.532963 14.480680 -8.381611 17.259581 15.536448 -5.505191 21.507017 15.383101 -2.990880 23.137177 14.061728 -1.512388 21.713259 11.926392 -1.465874 17.616802 9.549253 -2.863800 11.664304 8.632541 -3.103607 6.101654 6.127496 -5.331669 1.749015 5.140264 -7.444936 -0.227325 5.935371 -8.877159 0.702192 8.299772 -9.244575 4.288501 11.599923 -8.448735 9.570655 14.951554 -6.702885 15.133305 17.456598 -4.474823 19.485943 18.443832 -2.361556 21.462286 17.648726 -0.929333 20.532772 15.284327 -0.561916 16.946465 11.984177 -1.357755 11.318236 9.859839 -0.954442 6.294192 6.023428 -2.445586 2.128970 3.926456 -4.070277 -0.061361 4.130805 -5.393178 0.310095 6.581721 -6.059821 3.143807 10.622481 -5.891579 7.680485 15.170367 -4.933531 12.704528 19.006779 -3.442387 16.869751 21.103752 -1.817697 19.060083 20.899405 -0.494795 18.688629 18.448490 0.171848 15.854919 14.407734 0.003607 10.843217 11.229704 1.104430 6.695374 6.280223 0.411157 2.998222 3.185109 -0.655294 0.742409 2.773695 -1.809169 0.532379 5.156219 -2.741288 2.424409 9.694285 -3.201890 5.911531 15.171924 -3.067557 10.059374 20.121403 -2.374284 13.756526 23.216520 -1.307833 16.012339 23.627934 -0.153958 16.222370 21.245413 0.778161 14.330343 16.707350 1.238763 10.182849 12.705957 3.068739 7.183360 6.946803 3.202075 4.199954 3.038834 2.740507 2.032030 2.029188 1.807713 1.260483 4.188401 0.653634 2.092048 8.937910 -0.412494 4.303908 15.005091 -1.105005 7.303396 20.764246 -1.238341 10.286802 24.672216 -0.776774 12.454726 25.681864 0.156020 13.226274 23.522654 1.310098 12.394711 18.773146 2.376227 9.297220 14.237007 4.934320 7.627666 8.033859 5.891466 5.545704 3.559111 6.058918 3.609193 2.011767 5.391807 2.337022 3.806438 4.068887 2.070067 8.462241 2.444632 2.879858 14.731659 0.954260 4.549412 20.934807 -0.002886 6.631374 25.409555 -0.170338 8.567884 26.956900 0.496771 9.840056 25.162233 1.819691 10.107012 20.506433 3.443946 8.162380 15.764504 6.704077 7.901188 9.513987 8.449183 6.836711 4.757858 9.244239 5.254176 2.770519 8.876210 3.577620 4.084476 7.443709 2.256276 8.347655 5.330575 1.644197 14.417739 3.103019 1.905388 20.668255 1.357913 2.969864 25.424385 0.562857 4.552399 27.411726 0.930884 6.228955 26.097773 2.363384 7.550299 21.834597 4.476518 6.773128 17.228138 8.383730 7.890912 11.325433 10.851768 7.879649 6.589134 12.249382 6.742354 4.288327 12.202084 4.783767 5.039515 10.722545 2.528689 8.641417 8.207209 0.581366 14.128901 5.330056 -0.536418 20.031607 2.862019 -0.525155 24.767906 1.464404 0.612138 27.068714 1.511702 2.570724 26.317530 2.991238 4.825802 22.715631 5.506574 5.141623 18.572388 9.980562 7.509622 13.379736 13.080811 8.508274 8.955592 15.034172 7.869991 6.485401 15.317247 5.765802 6.631048 13.854184 2.759522 9.353509 11.037010 -0.343318 13.923300 7.620585 -2.711316 19.115950 4.520338 -3.709969 23.540096 2.566975 -3.071689 26.010286 2.283898 -0.967500 25.864643 3.746960 2.038778 23.142185 6.564132 3.294068 19.750237 11.504864 6.695037 15.569668 15.129619 8.585238 11.718484 17.575331 8.458193 9.228603 18.186670 6.347944 8.767189 16.799829 2.819931 10.457876 13.786413 -1.180519 13.847645 9.953862 -4.581488 18.028210 6.329107 -6.471690 21.879395 3.883396 -6.344646 24.369276 3.272055 -4.234400 24.830692 4.658894 -0.706387 23.140009 7.672307 1.265776 20.729544 12.962517 5.424775 17.785618 16.989750 8.032907 14.719606 19.850380 8.391321 12.353043 20.777905 6.403986 11.320047 19.523792 2.603403 11.897413 16.424082 -1.992063 13.930431 12.309340 -6.151062 16.874357 8.282107 -8.759193 19.940371 5.421477 -9.117611 22.306932 4.493952 -7.130277 23.339928 5.748063 -3.329697 22.762566 8.847770 -0.903977 21.491062 14.357032 3.702236 19.922453 18.658758 6.814059 17.795095 21.848883 7.597682 15.679014 23.072615 5.843132 14.141212 22.002054 2.020541 13.593740 18.924059 -2.845830 14.183295 14.663374 -7.452044 15.751904 10.361649 -10.563868 17.879261 7.171523 -11.347491 19.995342 5.947791 -9.592944 21.533144 7.018349 -5.770356 22.080616 10.096342 -3.175141 22.028080 15.687778 1.553559 21.885550 20.137684 4.929823 20.786114 23.569601 6.048988 19.024357 25.063950 4.611170 17.072346 24.220316 1.001634 15.453119 21.264755 -3.812447 14.600549 16.989206 -8.541146 14.743076 12.539300 -11.917412 15.842514 9.107382 -13.036577 17.604269 7.613035 -11.598763 19.556278 8.456665 -7.989229 21.175505 11.412224 -5.517528 22.343321 16.943861 -0.975492 23.606646 21.411135 2.424972 23.569248 24.991835 3.772715 22.241150 26.726521 2.706608 19.978218 26.150381 -0.487684 17.386803 23.417793 -4.954254 15.161269 19.260954 -9.496288 13.897945 14.793684 -12.896753 13.935342 11.212981 -14.244497 15.263435 9.478295 -13.178394 17.526367 10.054431 -9.984104 20.117783 12.787016 -7.901741 22.442051 18.107796 -3.832359 25.027128 22.459820 -0.643281 26.034344 26.093176 0.810983 25.193813 28.034313 0.140763 22.730762 27.763102 -2.474354 19.305157 25.352215 -6.333650 15.834890 21.447647 -10.403030 13.249812 17.095625 -13.592109 12.242596 13.462268 -15.046374 13.083122 11.521131 -14.376157 15.546173 11.792341 -11.761043 18.971777 14.203224 -10.303327 22.328459 19.153967 -6.957154 26.101942 23.246222 -4.200003 28.094622 26.825794 -2.770651 27.772554 28.933542 -3.052091 25.222042 29.004696 -4.968910 21.126493 27.020193 -8.007500 16.583305 23.511776 -11.353672 12.809821 19.419523 -14.110823 10.817143 15.839951 -15.540176 11.139207 13.732200 -15.258739 13.689715 13.661043 -13.341920 17.785263 15.645544 -12.699782 22.000496 20.051800 -10.279863 26.790319 23.710236 -8.150392 29.675587 27.105316 -6.881956 29.883190 29.327333 -6.814435 27.357502 29.780895 -7.965919 22.775280 28.344475 -10.027868 17.364325 25.402958 -12.447786 12.574500 21.744524 -14.577259 9.689232 18.349443 -15.845695 9.481627 16.127426 -15.913218 12.007313 15.673862 -14.761735 16.589533 17.110279 -15.062130 21.452772 20.773087 -13.704000 27.045567 23.782856 -12.359410 30.694214 26.826773 -11.388644 31.421061 29.089226 -11.051819 29.031349 29.963989 -11.439184 24.165403 29.216669 -12.446947 18.127045 27.047516 -13.805078 12.534251 24.037748 -15.149666 8.885602 20.993830 -16.120432 8.158752 18.731379 -16.457258 10.548460 17.856613 -16.069895 15.414406 18.603930 -17.361389 20.680130 21.299900 -17.093746 26.819849 23.401039 -16.622379 31.063461 25.882078 -16.073589 32.273891 28.078228 -15.594423 30.126804 29.401030 -15.313274 25.197514 29.496038 -15.305477 18.806818 28.337799 -15.573119 12.667097 26.236662 -16.044487 8.423487 23.755623 -16.593277 7.213055 21.559473 -17.072443 9.360137 20.236671 -17.353592 14.289426 20.141661 -19.583210 19.682846 21.629719 -20.272823 26.076334 22.540951 -20.647408 30.707993 24.212299 -20.606594 32.336773 26.195927 -20.161318 30.526245 27.960329 -19.430891 25.761541 29.032724 -18.611031 19.319357 29.125774 -17.921417 12.925870 28.214542 -17.546833 8.294210 26.543196 -17.587646 6.665427 24.559566 -18.032921 8.475950 22.795168 -18.763348 13.240652 21.722771 -21.751682 18.467169 21.766207 -23.056639 24.808901 21.254242 -24.086063 29.597927 21.879929 -24.564123 31.551035 23.475615 -24.362719 30.144888 25.613737 -23.535822 25.756264 27.721388 -22.304995 19.561090 29.233822 -21.000036 13.219358 29.745789 -19.970612 8.430329 29.120104 -19.492554 6.477221 27.524418 -19.693954 7.883365 25.386295 -20.520853 12.271986 23.278648 -23.942917 17.033522 21.688589 -25.327692 23.049650 19.670874 -26.648895 27.774105 19.105259 -27.552513 29.940975 20.143303 -27.796419 28.969646 22.506863 -27.315262 25.120386 25.562620 -26.237965 19.424603 28.491793 -24.853189 13.408474 30.509508 -23.531986 8.684018 31.075123 -22.628368 6.517148 30.037081 -22.384460 7.488473 27.673523 -22.865618 11.337729 24.617764 -26.269732 15.357694 21.312227 -27.108498 20.845367 17.941097 -28.245520 25.327168 16.207140 -29.376133 27.602207 16.574968 -30.197390 27.060886 18.946018 -30.489237 23.848251 22.684975 -30.173471 18.825127 26.789984 -29.334705 13.337456 30.161112 -28.197683 8.855652 31.895069 -27.067070 6.580613 31.527245 -26.245813 7.121931 29.156197 -25.953966 10.334563 25.417242 -28.812887 13.390993 20.475971 -28.554487 18.224890 16.145931 -29.039787 22.342630 13.463642 -30.138752 24.640873 13.147823 -31.556915 24.503803 15.283100 -32.914284 21.968147 19.297321 -33.847145 17.713335 24.114885 -34.105549 12.879438 28.444927 -33.620247 8.761698 31.127214 -32.521282 6.463455 31.443035 -31.103121 6.600522 29.307762 -29.745754 9.136175 25.293541 -31.554537 11.083297 18.985661 -29.851549 15.195050 14.255344 -29.338440 18.873268 11.000591 -30.152700 21.132378 10.093513 -32.076145 21.367046 11.777159 -34.593395 19.514402 15.600396 -37.029949 16.070856 20.538792 -38.732937 11.959105 25.269110 -39.246048 8.280886 28.523863 -38.431789 6.021776 29.430944 -36.508343 5.787104 27.747301 -33.991096 7.639746 23.924065 -34.370293 8.407306 16.678757 -31.127987 11.756630 12.156360 -29.447649 14.945526 8.780951 -29.779524 17.119530 7.456964 -32.034691 17.696121 8.539160 -35.608875 16.520802 11.737568 -39.544376 13.908498 16.195175 -42.786686 10.559175 20.717569 -44.467026 7.370280 24.092979 -44.135151 5.196275 25.416969 -41.879986 4.619682 24.334774 -38.305805 5.794999 21.136370 -37.055367 5.379981 13.479050 -32.416115 7.931258 9.717279 -29.583641 10.587599 6.666554 -29.316898 12.637236 5.144314 -31.687365 13.530973 5.558444 -36.059875 13.029333 7.797975 -41.262814 11.266731 11.262827 -45.902065 8.715455 15.024597 -48.734543 6.059115 18.075321 -49.001286 4.009477 19.597563 -46.630821 3.115738 19.183437 -42.258316 3.617377 16.943909 -39.369827 2.072712 9.426530 -33.656212 3.791776 6.860989 -29.839851 5.873733 4.518589 -28.943336 7.760722 3.026974 -31.206890 8.947126 2.785823 -36.023991 9.115051 3.859750 -42.103901 8.219501 5.960997 -47.817516 6.500437 8.526538 -51.633881 4.418481 10.868937 -52.530396 2.531492 12.360552 -50.266846 1.345086 12.601706 -45.449749 1.177160 11.527780 -41.088467 -1.397480 4.670344 -34.741901 -0.536660 3.592077 -30.222717 0.934674 2.251129 -28.741829 2.622279 1.006806 -30.696039 4.073963 0.192524 -35.561718 4.900748 0.026469 -42.035110 4.881099 0.553134 -48.381676 4.020279 1.631401 -52.900864 2.548946 2.972348 -54.381752 0.861341 4.216671 -52.427547 -0.590343 5.030953 -47.561871 -1.417129 5.197010 -42.035034 -4.882325 -0.555008 -35.562519 -4.894822 -0.017408 -30.697498 -4.062546 -0.175076 -28.743546 -2.608506 -0.985762 -30.224220 -0.922309 -2.232244 -34.742779 0.544228 -3.580529 -41.088478 1.398149 -4.669345 -47.560989 1.410647 -5.206944 -52.426014 0.578372 -5.049278 -54.379967 -0.875669 -4.238592 -52.899296 -2.561865 -2.992110 -48.380741 -4.028402 -1.643825 -42.103199 -8.221562 -5.964082 -36.025780 -9.110512 -3.852841 -31.210667 -8.937273 -2.770873 -28.948063 -7.748266 -3.008090 -29.844234 -5.862083 -4.500931 -33.659050 -3.784127 -6.849389 -39.370335 -2.071183 -9.424196 -45.447750 -1.182233 -11.535438 -50.262867 -1.355471 -12.617407 -52.525471 -2.544477 -12.380190 -51.629303 -4.430659 -10.887351 -47.814487 -6.508615 -8.538894 -41.261421 -11.269022 -11.266258 -36.063351 -13.024221 -7.790352 -31.694742 -13.519893 -5.541901 -29.326157 -12.623220 -5.123374 -29.592258 -10.574469 -6.646916 -32.421745 -7.922598 -9.704297 -37.056454 -5.378175 -13.476290 -42.254524 -3.622975 -16.952196 -46.623135 -3.127303 -19.200649 -48.991722 -4.023974 -19.619177 -48.725620 -6.072725 -18.095634 -45.896141 -8.724595 -15.038258 -39.541214 -13.911893 -16.200069 -35.612370 -16.517246 -11.732531 -32.043858 -17.686625 -8.525625 -29.791851 -17.106693 -7.438643 -29.459778 -14.932844 -8.762836 -31.136618 -11.747561 -12.143393 -34.373058 -8.404334 -16.674490 -38.301903 -5.798981 -21.142029 -41.870419 -4.629601 -24.348934 -44.122425 -5.209532 -25.435919 -44.454498 -7.383379 -24.111729 -42.777660 -10.568663 -20.731174 -37.024815 -16.074808 -20.544165 -34.593380 -19.514519 -15.600574 -32.081192 -21.363342 -11.772160 -30.161394 -21.125889 -10.084745 -29.348392 -18.865788 -10.990471 -29.860029 -15.188625 -14.246647 -31.559214 -11.079697 -18.980783 -33.990650 -7.639987 -23.924374 -36.502834 -5.791162 -27.752789 -38.422634 -6.028611 -29.440207 -39.235638 -8.288713 -28.534485 -38.724003 -11.965874 -25.278309 -33.840015 -17.717430 -24.119846 -32.911255 -21.969866 -19.299393 -31.558737 -24.502720 -15.281763 -30.144869 -24.637318 -13.143484 -29.048492 -22.337593 -13.457504 -28.563385 -18.219757 -16.139681 -28.819527 -13.387178 -20.471327 -29.748287 -9.134744 -25.291780 -31.100803 -6.601889 -29.309408 -32.514671 -6.467289 -31.447689 -33.611050 -8.767012 -31.133671 -34.096157 -12.884846 -28.451498 -30.162867 -18.830116 -26.794340 -30.482727 -23.850763 -22.686617 -30.196655 -27.060276 -18.944534 -29.381300 -27.598665 -16.570780 -28.255136 -25.321671 -16.201399 -27.119923 -20.839417 -17.935368 -26.279833 -15.352914 -21.308067 -25.959972 -10.332268 -25.415791 -26.246044 -7.122755 -29.157871 -27.061399 -6.584364 -31.531628 -28.187561 -8.861353 -31.901011 -29.322777 -13.343607 -30.167046 -26.226128 -19.429253 -28.494135 -27.303505 -25.124130 -25.563225 -27.787827 -28.971497 -22.505583 -27.549320 -29.940460 -20.140501 -26.651892 -27.771381 -19.101704 -25.336006 -23.045467 -19.667532 -23.954256 -17.029022 -21.686377 -22.876877 -11.334146 -24.617287 -22.392555 -7.486778 -27.674927 -22.631062 -6.517815 -30.040009 -23.528490 -8.686890 -31.078808 -24.844374 -13.412800 -30.512980 -22.296049 -19.563877 -29.234070 -23.522427 -25.759605 -27.720289 -24.348400 -30.147900 -25.611589 -24.552649 -31.552925 -23.473000 -24.080444 -29.598202 -21.877548 -23.058315 -24.807499 -21.252741 -21.760138 -18.464479 -21.765991 -20.533760 -12.268752 -23.279774 -19.707787 -7.880455 -25.388470 -19.503538 -6.475429 -27.527060 -19.975742 -8.430149 -29.122511 -20.997869 -13.220850 -29.747320 -18.603174 -19.321678 -29.124855 -19.415815 -25.764730 -29.028597 -20.143003 -30.529457 -27.954088 -20.589886 -32.339153 -26.189243 -20.636721 -30.708908 -24.206949 -20.270960 -26.075550 -22.538359 -19.590609 -19.680584 -21.630573 -18.777967 -13.237531 -21.726830 -18.050779 -8.472803 -22.801338 -17.603897 -6.663106 -24.566183 -17.557062 -8.293346 -26.548477 -17.922821 -12.926700 -28.217066 -15.298413 -18.809626 -28.336472 -15.299029 -25.201494 -29.488256 -15.576756 -30.130894 -29.388861 -16.057177 -32.276997 -28.064917 -16.611561 -31.064751 -25.871176 -17.091364 -26.818985 -23.395449 -17.368023 -20.677343 -21.301102 -17.367405 -14.285478 -20.149317 -17.089680 -9.356077 -20.248711 -16.609261 -7.209974 -21.572655 -16.054874 -8.422215 -23.766394 -15.575071 -12.667976 -26.242123 -12.441563 -18.129559 -27.046598 -11.426649 -24.169601 -29.207718 -11.035439 -29.036106 -29.949375 -11.372755 -31.425102 -29.072845 -12.348216 -30.696453 -26.812994 -13.700445 -27.045406 -23.775345 -15.067116 -21.450254 -20.773838 -16.082029 -15.410213 -18.612719 -16.473240 -10.543708 -17.871058 -16.135923 -8.154712 -18.747587 -15.160464 -8.883356 -21.007439 -13.808235 -12.534399 -24.045086 -10.024055 -17.366362 -25.402815 -7.955879 -22.779398 -28.336117 -6.800810 -27.362597 -29.766533 -6.868348 -29.887890 -29.310787 -8.140396 -29.678633 -27.090994 -10.276110 -26.790890 -23.701944 -12.703226 -21.998432 -20.051735 -14.771402 -16.585396 -17.118431 -15.926472 -12.002197 -15.688013 -15.858934 -9.476902 -16.143759 -14.586888 -9.686158 -18.363550 -12.451175 -12.573897 -21.752600 -8.004319 -16.585083 -23.512442 -4.960207 -21.131081 -27.012424 -3.040150 -25.228205 -28.990543 -2.758629 -27.778631 -28.916763 -4.191075 -28.098980 -26.810854 -6.953666 -26.103411 -23.237091 -10.306168 -22.326635 -19.153063 -13.350280 -17.780640 -15.653083 -15.270337 -13.683518 -13.674963 -15.551860 -11.133090 -13.748741 -14.119415 -10.812740 -15.854649 -11.356826 -12.808307 -19.428408 -6.331878 -15.835921 -21.448856 -2.467955 -19.308512 -25.346779 0.150116 -22.735535 -27.752441 0.820824 -25.198717 -28.021252 -0.635545 -26.038055 -26.081179 -3.828759 -25.028646 -22.452066 -7.903198 -22.440962 -18.106331 -11.767121 -18.968370 -14.208409 -14.385193 -15.541350 -11.802746 -15.055902 -13.078167 -11.533936 -13.599535 -12.238828 -13.474007 -10.406323 -13.248235 -17.103117 -4.952909 -15.161866 -19.262478 -0.482493 -17.389774 -23.413910 2.714293 -19.982759 -26.142094 3.780872 -22.246035 -26.716007 2.431456 -23.573154 -24.981878 -0.972381 -23.608521 -21.404362 -5.518582 -22.342655 -16.942051 -9.988997 -20.114746 -12.790619 -13.185784 -17.521763 -10.062437 -14.252365 -15.258489 -9.488520 -12.902951 -13.931368 -11.222647 -9.499117 -13.896000 -14.800163 -3.811312 -14.600764 -16.990974 1.006397 -15.455797 -21.261944 4.618319 -17.076756 -24.213638 6.056643 -19.029308 -25.055149 4.935970 -20.790270 -23.560997 1.556586 -21.887789 -20.131538 -3.176008 -22.027792 -15.685695 -7.993716 -21.172760 -11.414722 -11.605639 -19.551800 -8.463031 -13.043963 -17.599249 -7.621517 -11.923294 -15.838287 -9.115666 -8.543912 -14.740766 -12.545123 -2.845111 -14.183188 -14.665416 2.024871 -13.595866 -18.922285 5.849942 -14.144990 -21.996902 7.605178 -15.683422 -23.065430 6.820265 -17.798943 -21.841557 3.705520 -19.924696 -18.653217 -0.904464 -21.491093 -14.354727 -5.774445 -22.078417 -10.097859 -9.599516 -21.529293 -7.023241 -11.354753 -19.990864 -5.954710 -10.569843 -17.875343 -7.178583 -7.455101 -15.749587 -10.366919 -1.991471 -13.929920 -12.311728 2.608263 -11.899206 -16.422842 6.411838 -11.323657 -19.519217 8.400088 -12.357489 -20.771187 8.040265 -14.723690 -19.843287 5.428782 -17.788237 -16.984146 1.265385 -20.729986 -12.959869 -3.334348 -22.760700 -8.848757 -7.137923 -23.336252 -5.752381 -9.126174 -22.302422 -4.500409 -8.766354 -19.936222 -5.428308 -6.154873 -16.871675 -8.287447 -1.180817 -13.847584 -9.954947 2.820733 -10.458263 -13.786747 6.349655 -8.767914 -16.799288 8.460378 -9.229462 -18.185364 8.587333 -11.719236 -17.573574 6.696506 -15.570103 -15.127850 3.294540 -19.750227 -11.503521 -0.707009 -23.139547 -7.671721 -4.235931 -24.829899 -4.659179 -6.346654 -24.368353 -3.273102 -6.473612 -21.878580 -3.884889 -4.582787 -18.027716 -6.330611 -0.343823 -13.923123 -7.622125 2.760524 -9.353826 -11.037843 5.768061 -6.631764 -13.854062 7.872922 -6.486316 -15.316177 8.511111 -8.956452 -15.032418 7.511627 -13.380302 -13.078817 5.142279 -18.572498 -9.978839 2.037933 -23.141798 -6.563122 -0.969604 -25.863859 -3.746903 -3.074467 -26.009310 -2.284786 -3.712657 -23.539177 -2.568544 -2.713174 -19.115328 -4.522144 0.580524 -14.128654 -5.332025 2.529731 -8.641498 -8.208531 4.786432 -5.039898 -10.722843 6.745944 -4.288899 -12.201252 7.883219 -6.589733 -12.247620 7.893524 -11.325891 -10.849522 6.774099 -17.228325 -8.381578 4.824893 -22.715481 -5.505073 2.568193 -26.317081 -2.990762 0.608681 -27.068083 -1.512352 -0.528595 -24.767254 -1.465982 -0.538902 -20.031096 -2.864079 1.643999 -14.417905 -3.103316 2.255303 -8.348122 -5.331911 3.576148 -4.085114 -7.445702 5.252614 -2.771149 -8.878300 6.835494 -4.758304 -9.245843 7.900655 -9.514122 -8.449847 8.162689 -15.764283 -6.703599 7.551385 -21.834066 -4.475005 6.230540 -26.097073 -2.361215 4.554074 -27.411041 -0.928616 2.971195 -25.423889 -0.561072 1.906033 -20.668076 -1.357066 2.879879 -14.731735 -0.954226 2.069311 -8.462663 -2.445631 2.335706 -3.807085 -4.070628 3.607682 -2.012460 -5.393799 5.544415 -3.559658 -6.060602 7.626957 -8.034106 -5.892367 9.297295 -14.236881 -4.934174 10.107862 -20.505953 -3.442769 9.841468 -25.161533 -1.817773 8.569493 -26.956158 -0.494601 6.632761 -25.408962 0.172202 4.550219 -20.934519 0.003969 4.304193 -15.005011 1.105474 2.091412 -8.938318 0.411609 1.259107 -4.189182 -0.655612 2.030293 -2.030129 -1.810229 4.198332 -3.039675 -2.742862 7.182299 -6.947312 -3.203614 10.182642 -12.705993 -3.069027 12.395423 -18.772682 -2.375163 13.227729 -23.521820 -1.307942 12.456545 -25.680874 -0.153325 10.288507 -24.671333 0.779308 7.304541 -20.763699 1.240061 5.911581 -15.171939 3.067589 2.423793 -9.694698 3.200873 0.531273 -5.156915 2.739508 0.741117 -2.774481 1.807115 2.997100 -3.185770 0.653528 6.694731 -6.280577 -0.412149 10.843234 -11.229650 -1.104370 14.331021 -16.706888 -1.237656 16.223543 -21.244673 -0.776290 16.013700 -23.627108 0.156102 13.757719 -23.215820 1.309688 10.060090 -20.121019 2.375366 7.680416 -15.170621 4.933131 3.142843 -10.623396 5.890086 0.308502 -6.583048 6.057648 -0.063150 -4.132185 5.390919 2.127473 -3.927515 4.068548 6.293393 -6.023878 2.444865 11.318357 -9.859553 0.954933 15.855928 -14.406778 -0.002022 18.690271 -18.447128 -0.169584 19.061924 -20.897991 0.497144 16.871305 -21.102663 1.819514 12.705386 -19.006302 3.443197 9.571057 -14.950871 6.704327 4.289065 -11.598726 8.449685 0.702772 -8.298378 9.244789 -0.226878 -5.934152 8.876594 1.749215 -5.139542 7.443753 6.101557 -6.127460 5.330199 11.663941 -8.633197 3.102254 16.945932 -11.985340 1.356896 20.532227 -15.285689 0.561791 21.461880 -17.649914 0.929986 19.485788 -18.444529 2.362825 15.133450 -17.456610 4.476379 11.533261 -14.480206 8.382709 5.861832 -12.497835 10.850031 1.765243 -10.120541 12.247319 0.341172 -7.985317 12.200171 1.971197 -6.664296 10.721218 6.218555 -6.511444 8.206747 11.945168 -7.567717 5.330507 17.616596 -9.550088 2.863184 21.713188 -11.927382 1.465895 23.137260 -14.062605 1.513043 21.507238 -15.383627 2.991994 17.259884 -15.536481 5.506464 13.513113 -13.739154 9.980139 7.831993 -13.193710 13.080133 3.501153 -11.846581 15.033345 1.681035 -10.058724 15.316416 2.859342 -8.309200 13.853496 6.720344 -7.066788 11.036573 12.229490 -6.664393 7.620440 17.910608 -7.209836 4.520447 22.241451 -8.556966 2.567234 24.061569 -10.344820 2.284162 22.883266 -12.094345 3.747080 19.022266 -13.336757 6.564001 15.456736 -12.727990 11.505112 10.135856 -13.581934 15.130247 5.855661 -13.292501 17.576090 3.763027 -11.937248 18.187281 4.418673 -9.879314 16.800047 7.646917 -7.670120 13.786100 12.582756 -5.901618 9.953026 17.903635 -5.047676 6.327889 22.183830 -5.337107 3.882047 24.276466 -6.692358 3.270855 23.620823 -8.750292 4.658086 20.392582 -10.959486 7.672030 17.318907 -11.461308 12.962657 12.689813 -13.589964 16.990423 8.730534 -14.314751 19.851330 6.501955 -13.441467 20.778793 6.601224 -11.204104 19.524307 9.001740 -8.202166 16.424007 13.060287 -5.240017 12.308615 17.689381 -3.111362 8.280849 21.648659 -2.386573 5.419943 23.877239 -3.259856 4.492476 23.777971 -5.497217 5.746962 21.377459 -8.499155 8.847260 19.062946 -9.963543 14.357530 15.400995 -13.165812 18.660805 12.002627 -14.795015 21.851851 9.778434 -14.414614 23.075630 9.324385 -12.126529 22.004232 10.762143 -8.543857 18.924738 13.706461 -4.626569 14.662294 17.368412 -1.424300 10.359020 20.766781 0.204906 7.167974 22.990974 -0.175497 5.944193 23.445024 -2.463578 7.015589 22.007269 -6.046249 10.095081 20.664902 -8.263432 15.687098 18.177614 -12.289624 20.135220 15.537526 -14.665791 23.565926 13.452045 -14.755242 25.059961 12.479974 -12.534007 24.217003 12.881780 -8.597267 21.262920 14.549797 -3.999867 16.989256 17.037083 0.026324 12.541137 19.677172 2.402492 9.110430 21.762651 2.491945 7.616392 22.734724 0.270713 8.459349 22.332920 -3.666025 11.413428 22.108582 -6.393137 16.943401 20.931717 -10.959291 21.409697 19.199118 -13.886312 24.989731 17.375034 -14.389907 26.724232 15.948230 -12.335138 26.148443 15.301014 -8.272579 23.416649 15.606807 -3.290790 19.260828 16.783672 1.275364 14.794532 18.516270 4.202387 11.214499 20.340353 4.705984 9.479996 21.767159 2.651217 10.055781 22.414375 -1.411340 12.787576 23.385841 -4.379169 18.107723 23.588964 -9.195002 22.460777 22.866072 -12.459511 26.094837 21.410864 -13.297976 28.036160 19.613260 -11.485728 27.764565 17.954929 -7.508360 25.352833 16.880219 -2.431604 21.447180 16.677095 2.384228 17.094124 17.399986 5.648738 13.460064 18.855194 6.487204 11.518743 20.652798 4.674959 11.790335 22.311129 0.697593 14.202065 24.488552 -2.241341 19.153799 26.083490 -7.026037 23.245918 26.430666 -10.410261 26.825371 25.437054 -11.487216 28.933044 23.368889 -9.968329 29.004189 20.780338 -6.260586 27.019741 18.365000 -1.357475 23.511435 16.770060 3.427221 19.419315 16.422884 6.811446 15.839865 17.416496 7.888401 13.732190 19.484657 6.369517 13.661044 22.073208 2.661777 15.645488</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="1800" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="5400">0.707336 -0.007419 -0.706838 0.553723 0.072058 -0.829577 0.459931 -0.319190 -0.828602 0.569051 -0.376896 -0.730843 0.570182 -0.573700 -0.588014 0.591785 -0.646149 -0.481957 0.685840 -0.598368 0.414221 0.508123 -0.689481 0.516165 0.102232 -0.061688 0.992846 -0.092912 -0.064108 0.993608 -0.247030 0.061428 0.967059 -0.410475 0.106566 0.905623 -0.547172 -0.079764 0.833211 -0.702358 -0.000215 0.711824 -0.806760 -0.331328 0.489245 -0.923865 -0.227582 0.307701 -0.926815 -0.369725 0.065711 -0.959947 -0.249426 -0.127629 -0.689409 0.604593 -0.398976 -0.507284 0.699744 -0.503012 0.411391 0.866156 -0.283779 0.569990 0.795552 -0.205444 0.610102 0.593850 -0.524517 0.771486 0.488975 -0.407078 0.350643 0.103805 -0.930739 0.300301 -0.309857 -0.902113 0.491367 -0.536151 -0.686368 0.829811 -0.486279 0.273764 0.316994 -0.005532 0.948412 -0.044155 0.067295 0.996756 -0.343227 -0.110760 0.932699 -0.631855 -0.387262 0.671407 -0.844756 -0.446818 0.294518 -0.839136 0.479901 -0.256018 0.224329 0.896776 -0.381404 0.407586 0.651360 -0.640002 0.106505 0.080024 -0.991087 0.101424 -0.355539 -0.929142 0.359087 -0.547620 -0.755757 0.923856 -0.371816 0.090794 0.531243 0.098867 0.841431 0.184122 0.126103 0.974781 -0.099551 -0.085518 0.991351 -0.400598 -0.378509 0.834417 -0.700769 -0.457525 0.547351 -0.934949 0.349374 -0.061712 -0.006597 0.870851 -0.491503 0.163640 0.643289 -0.747931 -0.160809 0.003438 -0.986979 -0.115299 -0.447782 -0.886678 0.188187 -0.611120 -0.768842 0.950584 -0.282337 -0.129136 0.717451 0.231035 0.657181 0.415314 0.226842 0.880941 0.165703 -0.007082 0.986150 -0.125166 -0.299205 0.945944 -0.485609 -0.386762 0.783964 -0.950594 0.254414 0.177887 -0.282136 0.771919 -0.569684 -0.117056 0.557168 -0.822108 -0.424330 -0.106640 -0.899206 -0.323210 -0.557889 -0.764392 0.004666 -0.708937 -0.705257 0.897768 -0.249083 -0.363278 0.846829 0.353698 0.397213 0.621484 0.341561 0.705049 0.426069 0.105042 0.898572 0.168437 -0.163888 0.971993 -0.212507 -0.240561 0.947085 -0.876016 0.231696 0.422980 -0.561224 0.614770 -0.554153 -0.410111 0.405222 -0.817071 -0.654366 -0.215829 -0.724722 -0.502772 -0.646596 -0.573702 -0.166200 -0.805673 -0.568567 0.767310 -0.292576 -0.570644 0.901934 0.422728 0.088404 0.778014 0.430814 0.457267 0.653037 0.216584 0.725695 0.446401 -0.007681 0.894800 0.082578 -0.050702 0.995294 -0.726974 0.288740 0.623007 -0.782101 0.456242 -0.424454 -0.671309 0.234524 -0.703095 -0.827815 -0.286366 -0.482407 -0.647071 -0.683053 -0.338729 -0.315207 -0.868107 -0.383451 0.578370 -0.405937 -0.707604 0.885574 0.406775 -0.224258 0.872365 0.459036 0.168121 0.824716 0.289921 0.485582 0.679098 0.126061 0.723142 0.360871 0.137545 0.922417 -0.530608 0.406693 0.743678 -0.908798 0.355612 -0.218235 -0.862313 0.103864 -0.495609 -0.933854 -0.291513 -0.207213 -0.752758 -0.653096 -0.082589 -0.445457 -0.878641 -0.171926 0.357898 -0.556707 -0.749658 0.813901 0.300338 -0.497356 0.904458 0.408375 -0.123231 0.930715 0.297990 0.212064 0.849190 0.201982 0.487933 0.595712 0.283069 0.751665 -0.312529 0.555044 0.770877 -0.940504 0.339757 0.004161 -0.968841 0.051461 -0.242278 -0.972982 -0.222453 0.061816 -0.813412 -0.555352 0.173047 -0.554184 -0.830533 0.055633 0.130125 -0.706044 -0.696110 0.701905 0.121169 -0.701888 0.880473 0.281306 -0.381621 0.971219 0.231391 -0.056491 0.952052 0.202276 0.229523 0.774547 0.359612 0.520343 -0.093018 0.701402 0.706670 -0.894929 0.403144 0.191249 -0.996302 0.085763 0.005118 -0.952809 -0.086329 0.291037 -0.824139 -0.396514 0.404440 -0.629601 -0.721710 0.287641 -0.086439 -0.823931 -0.560059 0.558710 -0.100843 -0.823209 0.808125 0.094548 -0.581373 0.953191 0.096838 -0.286442 0.991848 0.126729 -0.013322 0.894687 0.357392 0.267967 0.112468 0.818074 0.564009 -0.794509 0.521964 0.310335 -0.959153 0.193513 0.206344 -0.884382 0.099532 0.456028 -0.785896 -0.189323 0.588663 -0.660828 -0.555349 0.504871 -0.278178 -0.889804 -0.361754 0.392076 -0.334096 -0.857121 0.696137 -0.128666 -0.706285 0.887119 -0.088442 -0.452987 0.977786 -0.011906 -0.209266 0.959500 0.280115 0.029921 0.292817 0.884800 0.362473 -0.660580 0.666361 0.345829 -0.874275 0.350676 0.335663 -0.780317 0.312748 0.541566 -0.705102 0.049088 0.707405 -0.644001 -0.340686 0.684979 -0.435960 -0.891253 -0.124927 0.211106 -0.550686 -0.807576 0.554565 -0.363578 -0.748511 0.785274 -0.301982 -0.540510 0.921861 -0.193039 -0.336017 0.976139 0.141116 -0.165044 0.440158 0.889209 0.124773 -0.512206 0.806580 0.295083 -0.758557 0.529380 0.379932 -0.654158 0.529085 0.540507 -0.591934 0.298929 0.748502 -0.582479 -0.091872 0.807637 -0.554479 -0.822761 0.124969 0.026397 -0.728185 -0.684872 0.394711 -0.586413 -0.707336 0.661003 -0.519400 -0.541571 0.837885 -0.391884 -0.379968 0.954608 -0.039833 -0.295190 0.549581 0.826022 -0.125095 -0.366281 0.915772 0.164922 -0.628384 0.701592 0.336010 -0.520158 0.724057 0.452965 -0.459191 0.538941 0.706177 -0.485198 0.173186 0.857082 -0.632045 -0.685318 0.361744 -0.151095 -0.849914 -0.504793 0.228557 -0.775484 -0.588546 0.528372 -0.716134 -0.456044 0.741051 -0.581474 -0.335755 0.907441 -0.238427 -0.345981 0.619441 0.696184 -0.362795 -0.237603 0.970897 -0.030065 -0.499523 0.840645 0.209268 -0.392755 0.873914 0.286387 -0.321818 0.747468 0.581140 -0.366327 0.434153 0.822992 -0.670768 -0.486270 0.560011 -0.310730 -0.905915 -0.287687 0.068167 -0.912065 -0.404339 0.401597 -0.868323 -0.291093 0.647460 -0.733587 -0.206510 0.849461 -0.426573 -0.310566 0.651830 0.506608 -0.564328 -0.138288 0.953398 -0.268159 -0.386532 0.922180 0.013313 -0.285302 0.956778 0.056387 -0.196265 0.903393 0.381262 -0.245513 0.669110 0.701438 -0.676828 -0.239783 0.695994 -0.442567 -0.894995 -0.055846 -0.074814 -0.982074 -0.173014 0.293734 -0.953879 -0.061932 0.572781 -0.819691 -0.005379 0.796883 -0.572942 -0.191614 0.653563 0.270274 -0.706971 -0.076313 0.850394 -0.520583 -0.301267 0.925492 -0.229572 -0.207476 0.954944 -0.212215 -0.098363 0.987552 0.122743 -0.146400 0.855540 0.496608 -0.661146 0.032125 0.749569 -0.538331 -0.825070 0.171637 -0.189747 -0.978361 0.082499 0.214256 -0.954592 0.206997 0.529394 -0.813150 0.241930 0.764923 -0.644105 -0.004698 0.636614 0.006979 -0.771151 -0.053196 0.657100 -0.751924 -0.250154 0.836213 -0.488027 -0.161603 0.859034 -0.485742 -0.038715 0.984916 -0.168644 -0.090332 0.970551 0.223317 -0.640636 0.298276 0.707543 -0.593899 -0.707322 0.383379 -0.268262 -0.901879 0.338601 0.165559 -0.860336 0.482092 0.521473 -0.694861 0.495211 0.762913 -0.608811 0.217517 0.617308 -0.256082 -0.743877 -0.061765 0.380742 -0.922616 -0.230909 0.650831 -0.723256 -0.139411 0.673623 -0.725807 -0.016334 0.888941 -0.457731 -0.085079 0.992364 -0.089307 -0.636926 0.518329 0.570666 -0.613953 -0.547272 0.568819 -0.308476 -0.758844 0.573584 0.139811 -0.675076 0.724379 0.538979 -0.464345 0.702770 0.786707 -0.449042 0.423620 0.613555 -0.485092 -0.623085 -0.085428 0.045496 -0.995305 -0.230313 0.382370 -0.894846 -0.122607 0.421282 -0.898604 -0.015675 0.708653 -0.705383 -0.117677 0.909846 -0.397910 -0.664586 0.652846 0.363480 -0.615314 -0.350975 0.705836 -0.321026 -0.559150 0.764391 0.119373 -0.421502 0.898936 0.555988 -0.153034 0.816981 0.813493 -0.178909 0.553373 0.638828 -0.642625 -0.423003 -0.101941 -0.304968 -0.946891 -0.226419 0.063560 -0.971954 -0.089569 0.139809 -0.986119 -0.012128 0.472769 -0.881103 -0.159446 0.736364 -0.657530 -0.719964 0.681803 0.129605 -0.622225 -0.143018 0.769663 -0.329268 -0.324072 0.886882 0.083134 -0.138356 0.986887 0.540756 0.176498 0.822455 0.809906 0.140841 0.569399 0.695954 -0.695712 -0.177859 -0.091534 -0.614379 -0.783683 -0.196559 -0.258242 -0.945873 -0.024884 -0.128984 -0.991334 0.016118 0.222308 -0.974843 -0.180950 0.509088 -0.841479 -0.784216 0.613916 -0.090068 -0.652700 0.036881 0.756719 -0.357552 -0.090219 0.929525 0.016114 0.131523 0.991182 0.474865 0.462770 0.748563 0.757750 0.428960 0.491741 0.770085 -0.634944 0.061773 -0.044891 -0.835863 -0.547099 -0.127316 -0.536266 -0.834392 0.075071 -0.352553 -0.932776 0.079269 -0.004683 -0.996842 -0.164320 0.271479 -0.948313 -0.836438 0.475313 -0.272853 -0.709003 0.157342 0.687429 -0.417367 0.104963 0.902656 -0.085092 0.355011 0.930981 0.359815 0.678246 0.640715 0.664575 0.642151 0.382076 0.835357 -0.486412 0.256090 0.036567 -0.955010 -0.294312 -0.019146 -0.740801 -0.671452 0.203863 -0.513650 -0.833429 0.175595 -0.183231 -0.967260 -0.105622 0.057599 -0.992737 -0.861643 0.294719 -0.413172 -0.781058 0.206927 0.589177 -0.505285 0.238654 0.829296 -0.213918 0.515230 0.829926 0.208771 0.824969 0.525206 0.544355 0.789040 0.284769 0.868330 -0.294520 0.399075 0.144567 -0.987308 -0.065757 0.116841 -0.864171 -0.489445 0.350352 -0.608323 -0.712177 0.296464 -0.302085 -0.906010 -0.010121 -0.112343 -0.993618 -0.851817 0.095394 -0.515080 -0.854767 0.189410 0.483215 -0.609938 0.304344 0.731677 -0.359462 0.608747 0.707258 0.037424 0.912414 0.407553 0.403790 0.891280 0.206334 0.859570 -0.089415 0.503134 0.265167 -0.955735 0.127500 0.265141 -0.913729 -0.307896 0.502899 -0.639983 -0.580960 0.430719 -0.359736 -0.827691 0.112610 -0.229645 -0.966738 -0.803328 -0.106169 -0.585997 -0.916967 0.115550 0.381864 -0.718196 0.305717 0.625085 -0.510484 0.639286 0.575083 -0.140482 0.947688 0.286624 0.246814 0.959489 0.135881 0.807693 0.112977 0.578679 0.382182 -0.877291 0.290339 0.411422 -0.901422 -0.134797 0.650755 -0.614452 -0.446056 0.566925 -0.359341 -0.741263 0.251491 -0.292128 -0.922721 -0.715439 -0.298449 -0.631724 -0.956644 -0.001987 0.291253 -0.817702 0.250747 0.518159 -0.656512 0.612946 0.439647 -0.313973 0.935562 0.161695 0.079160 0.994855 0.063228 0.714689 0.303335 0.630244 0.480789 -0.763891 0.430480 0.543985 -0.838625 0.028083 0.783748 -0.537990 -0.310333 0.694026 -0.306239 -0.651572 0.395235 -0.301045 -0.867849 -0.588600 -0.471936 -0.656374 -0.965145 -0.150569 0.214068 -0.897490 0.148553 0.415264 -0.787638 0.536000 0.303860 -0.474209 0.879772 0.033577 -0.092188 0.995612 -0.016079 0.583178 0.473849 0.659826 0.550603 -0.625169 0.553173 0.653588 -0.734926 0.180850 0.891756 -0.417133 -0.175415 0.801338 -0.207457 -0.561087 0.532328 -0.260207 -0.805555 -0.425280 -0.617493 -0.661694 -0.936245 -0.316988 0.151539 -0.947829 0.009256 0.318645 -0.893914 0.415031 0.169315 -0.613029 0.784196 -0.096077 -0.259522 0.960247 -0.102835 0.416625 0.616103 0.668462 0.585187 -0.469979 0.660815 0.732786 -0.598805 0.323198 0.964736 -0.259683 -0.043009 0.879026 -0.071651 -0.471360 0.651622 -0.175612 -0.737935 -0.230747 -0.725861 -0.647983 -0.866795 -0.487608 0.104425 -0.960638 -0.155913 0.229928 -0.965458 0.257823 0.037660 -0.722305 0.653891 -0.225172 -0.414476 0.888648 -0.196251 0.220643 0.721417 0.656410 0.580613 -0.307310 0.753955 0.775234 -0.438970 0.454222 0.993558 -0.075550 0.084468 0.918865 0.090944 -0.383947 0.743105 -0.055215 -0.666893 -0.013858 -0.788657 -0.614677 -0.757218 -0.649008 0.073548 -0.930178 -0.334625 0.150977 -0.993273 0.074257 -0.088855 -0.794111 0.495948 -0.351317 -0.548077 0.782762 -0.294779 0.003839 0.781717 0.623622 0.535206 -0.146752 0.831876 0.775958 -0.265113 0.572367 0.971239 0.122957 0.203901 0.915080 0.268786 -0.300638 0.798954 0.091315 -0.594420 0.213517 -0.799304 -0.561715 -0.611660 -0.788875 0.059566 -0.853834 -0.513730 0.083963 -0.970471 -0.123471 -0.207223 -0.821679 0.319829 -0.471756 -0.651196 0.647140 -0.396426 -0.222203 0.790689 0.570471 0.449551 0.001409 0.893254 0.731816 -0.088254 0.675763 0.894190 0.321415 0.311635 0.865263 0.449092 -0.222790 0.814846 0.252408 -0.521840 0.437096 -0.753969 -0.490386 -0.437980 -0.896861 0.061758 -0.732901 -0.679646 0.030597 -0.893471 -0.321235 -0.313875 -0.800460 0.137183 -0.583476 -0.715214 0.489335 -0.499019 -0.443495 0.745077 0.498169 0.326892 0.126234 0.936593 0.642282 0.079467 0.762338 0.763228 0.504503 0.403683 0.770132 0.619443 -0.152269 0.789362 0.416772 -0.450786 0.640613 -0.654668 -0.401280 -0.246572 -0.965910 0.078866 -0.572611 -0.819791 -0.007640 -0.762973 -0.503772 -0.405074 -0.729249 -0.038796 -0.683147 -0.733794 0.319725 -0.599435 -0.644767 0.646405 0.407966 0.173990 0.217400 0.960450 0.510235 0.225550 0.829933 0.583931 0.657300 0.476426 0.633400 0.768464 -0.090924 0.723760 0.574272 -0.382600 0.809088 -0.506679 -0.297747 -0.048340 -0.992809 0.109511 -0.381334 -0.923969 -0.029432 -0.584363 -0.656369 -0.477179 -0.610813 -0.194610 -0.767486 -0.703889 0.150649 -0.694150 -0.811259 0.500090 0.302935 0.001013 0.266866 0.963733 0.342262 0.338372 0.876562 0.366396 0.766974 0.526787 0.461638 0.886168 -0.039955 0.621795 0.715906 -0.317568 0.929419 -0.320224 -0.183406 0.146004 -0.977715 0.150848 -0.170063 -0.984818 -0.034813 -0.367471 -0.766225 -0.527128 -0.451959 -0.317603 -0.833583 -0.626219 -0.004294 -0.779635 -0.930176 0.316095 0.186702 -0.179404 0.269170 0.946236 0.148452 0.408241 0.900722 0.124403 0.824130 0.552570 0.263352 0.964699 -0.001082 0.487802 0.834374 -0.256651 0.992051 -0.109649 -0.061735 0.327230 -0.923418 0.200551 0.048972 -0.998505 -0.024290 -0.125874 -0.823845 -0.552662 -0.263370 -0.397879 -0.878822 -0.506274 -0.132576 -0.852121 -0.992135 0.108220 0.062901 -0.353166 0.223309 0.908519 -0.058261 0.428837 0.901501 -0.125875 0.823846 0.552660 0.048860 0.998512 0.024208 0.327069 0.923440 -0.200709 0.992045 0.109654 0.061831 0.487839 -0.834321 0.256750 0.263435 -0.964676 0.001158 0.124391 -0.824132 -0.552570 -0.058377 -0.428890 -0.901469 -0.353313 -0.223411 -0.908437 -0.992142 -0.108161 -0.062897 -0.506221 0.132661 0.852140 -0.263279 0.397937 0.878823 -0.367462 0.766224 0.527136 -0.170184 0.984796 0.034845 0.145849 0.977746 -0.150803 0.929375 0.320515 0.183119 0.621875 -0.715834 0.317575 0.461731 -0.886119 0.039969 0.366391 -0.766979 -0.526783 0.148326 -0.408246 -0.900741 -0.179559 -0.269144 -0.946214 -0.930204 -0.316189 -0.186400 -0.626141 0.004328 0.779698 -0.451866 0.317641 0.833619 -0.584320 0.656382 0.477213 -0.381447 0.923912 0.029741 -0.048476 0.992848 -0.109097 0.809064 0.506757 0.297679 0.724003 -0.574184 0.382272 0.633502 -0.768403 0.090729 0.583911 -0.657322 -0.476421 0.342136 -0.338311 -0.876635 0.000852 -0.266689 -0.963782 -0.811297 -0.500032 -0.302928 -0.703755 -0.150748 0.694265 -0.610735 0.194628 0.767543 -0.762901 0.503839 0.405127 -0.572656 0.819757 0.007996 -0.246664 0.965920 -0.078455 0.640705 0.654536 0.401348 0.789559 -0.416802 0.450414 0.770164 -0.619467 0.152013 0.763162 -0.504572 -0.403720 0.510117 -0.225547 -0.830006 0.173782 -0.217329 -0.960504 -0.644851 -0.646300 -0.407998 -0.733758 -0.319765 0.599457 -0.729241 0.038887 0.683151 -0.893375 0.321370 0.314011 -0.732931 0.679639 -0.030065 -0.438089 0.896851 -0.061129 0.437244 0.754011 0.490189 0.815155 -0.252448 0.521338 0.865327 -0.449180 0.222367 0.894105 -0.321581 -0.311708 0.642189 -0.079500 -0.762412 0.326642 -0.126132 -0.936694 -0.443624 -0.745038 -0.498112 -0.715180 -0.489399 0.499004 -0.800476 -0.137095 0.583476 -0.970398 0.123727 0.207413 -0.853812 0.513860 -0.083381 -0.611637 0.788943 -0.058899 0.214009 0.799011 0.561945 0.799393 -0.091446 0.593809 0.915207 -0.268986 0.300070 0.971171 -0.123198 -0.204083 0.731738 0.088190 -0.675857 0.449301 -0.001368 -0.893380 -0.222419 -0.790525 -0.570614 -0.651158 -0.647190 0.396407 -0.821718 -0.319720 0.471762 -0.993271 -0.073955 0.089125 -0.930178 0.334884 -0.150409 -0.757142 0.649163 -0.072966 -0.013340 0.788609 0.614750 0.743548 0.054925 0.666423 0.919040 -0.091304 0.383444 0.993562 0.075223 -0.084708 0.775915 0.265040 -0.572459 0.535010 0.146756 -0.832002 0.003609 -0.781654 -0.623702 -0.548089 -0.782801 0.294654 -0.794176 -0.495851 0.351306 -0.965561 -0.257487 -0.037318 -0.960772 0.156159 -0.229196 -0.866815 0.487745 -0.103614 -0.230169 0.725915 0.648127 0.652250 0.175496 0.737409 0.879383 0.071358 0.470737 0.964844 0.259330 0.042705 0.775207 0.438916 -0.454321 0.580362 0.307402 -0.754112 0.220420 -0.721415 -0.656487 -0.414431 -0.888685 0.196177 -0.722390 -0.653799 0.225165 -0.894151 -0.414677 -0.168930 -0.948103 -0.008958 -0.317838 -0.936325 0.317198 -0.150600 -0.424523 0.617545 0.662131 0.533122 0.260148 0.805049 0.801874 0.207180 0.560423 0.891989 0.416798 0.175027 0.732720 0.598800 -0.323358 0.584841 0.470138 -0.661008 0.416402 -0.616097 -0.668606 -0.259423 -0.960272 0.102847 -0.613117 -0.784126 0.096094 -0.788001 -0.535712 -0.303425 -0.897924 -0.148284 -0.414420 -0.965335 0.150769 -0.213066 -0.587934 0.472127 0.656833 0.396104 0.301049 0.867451 0.694715 0.306017 0.650941 0.784115 0.537691 0.309921 0.653525 0.734948 -0.180991 0.550184 0.625397 -0.553332 0.583034 -0.473843 -0.659958 -0.092019 -0.995626 0.016157 -0.474251 -0.879751 -0.033523 -0.657012 -0.612741 -0.439186 -0.818330 -0.250603 -0.517238 -0.957001 0.002076 -0.290078 -0.714760 0.298672 0.632387 0.252445 0.292340 0.922393 0.567771 0.359319 0.740625 0.651248 0.614250 0.445616 0.543904 0.838673 -0.028210 0.480167 0.764196 -0.430632 0.714647 -0.303417 -0.630252 0.079366 -0.994857 -0.062940 -0.313973 -0.935582 -0.161578 -0.511104 -0.639217 -0.574607 -0.719026 -0.305679 -0.624149 -0.917502 -0.115543 -0.380579 -0.802647 0.106380 0.586891 0.113632 0.229934 0.966550 0.431707 0.359837 0.827132 0.503511 0.639899 0.580522 0.411257 0.901523 0.134626 0.381238 0.877646 -0.290509 0.807714 -0.113026 -0.578640 0.247033 -0.959523 -0.135241 -0.140372 -0.947790 -0.286339 -0.360126 -0.608864 -0.706820 -0.610965 -0.304326 -0.730826 -0.855501 -0.189367 -0.481931 -0.851147 -0.095291 0.516206 -0.009012 0.112477 0.993613 0.297574 0.302159 0.905621 0.351025 0.608370 0.711806 0.264831 0.913905 0.307640 0.263933 0.956054 -0.127671 0.859600 0.089465 -0.503075 0.403939 -0.891425 -0.205416 0.037701 -0.912629 -0.407047 -0.214472 -0.515581 -0.829565 -0.506407 -0.238722 -0.828592 -0.781937 -0.206942 -0.588005 -0.861143 -0.294744 0.414196 -0.104530 -0.057698 0.992847 0.176734 0.183210 0.967057 0.204530 0.513747 0.833206 0.116437 0.864355 0.489217 0.143162 0.987518 0.065667 0.868333 0.294682 -0.398948 0.544407 -0.789378 -0.283729 0.209240 -0.825312 -0.524480 -0.085437 -0.355568 -0.930737 -0.418519 -0.105137 -0.902102 -0.710029 -0.157466 -0.686341 -0.836003 -0.475522 0.273821 -0.163265 -0.271757 0.948416 0.080377 0.004587 0.996754 0.075693 0.352632 0.932696 -0.019500 0.740876 0.671358 0.035324 0.955020 0.294431 0.835179 0.486750 -0.256030 0.664462 -0.642735 -0.381288 0.360326 -0.678699 -0.639948 0.016066 -0.132244 -0.991087 -0.358624 0.089952 -0.929138 -0.653796 -0.037142 -0.755758 -0.783932 -0.614176 0.090763 -0.179973 -0.509543 0.841413 0.017170 -0.222548 0.974771 -0.024296 0.128959 0.991352 -0.127562 0.536213 0.834388 -0.045928 0.835670 0.547308 0.769980 0.635078 -0.061693 0.757510 -0.429742 -0.491426 0.475332 -0.463372 -0.747895 0.083403 0.137550 -0.986977 -0.330148 0.323763 -0.886668 -0.623348 0.142615 -0.768829 -0.719796 -0.682066 -0.129147 -0.158643 -0.736854 0.657175 -0.011219 -0.473087 0.880944 -0.088985 -0.139975 0.986148 -0.196495 0.257927 0.945972 -0.092068 0.613843 0.784041 0.695526 0.696114 0.177959 0.809573 -0.141512 -0.569707 0.541048 -0.177158 -0.822120 0.119816 0.420785 -0.899213 -0.321571 0.558865 -0.764370 -0.616328 0.350431 -0.705221 -0.664621 -0.652929 -0.363267 -0.117105 -0.910226 0.397209 -0.014953 -0.708986 0.705064 -0.122045 -0.421504 0.898576 -0.226068 -0.063990 0.972008 -0.101966 0.304230 0.947126 0.638774 0.642739 0.422913 0.812943 0.178756 -0.554230 0.555937 0.152584 -0.817100 0.140272 0.674587 -0.724746 -0.308537 0.758684 -0.573763 -0.614593 0.546718 -0.568660 -0.637083 -0.518172 -0.570634 -0.084923 -0.992459 0.088389 -0.015912 -0.889196 0.457250 -0.138941 -0.673844 0.725693 -0.229866 -0.382725 0.894809 -0.085234 -0.046120 0.995293 0.613605 0.485222 0.622935 0.786161 0.449132 -0.424537 0.538754 0.464061 -0.703130 0.165912 0.860092 -0.482406 -0.267939 0.901893 -0.338817 -0.594114 0.707018 -0.383606 -0.640703 -0.297959 -0.707616 -0.090581 -0.970323 -0.224205 -0.038646 -0.985008 0.168123 -0.161282 -0.859188 0.485575 -0.230443 -0.651104 0.723160 -0.061425 -0.381222 0.922441 0.617466 0.256177 0.743713 0.762438 0.609139 -0.218262 0.521152 0.694813 -0.495616 0.214470 0.954500 -0.207203 -0.189266 0.978449 -0.082564 -0.538270 0.825062 -0.171866 -0.660981 -0.031720 -0.749732 -0.146796 -0.855040 -0.497350 -0.098540 -0.987474 -0.123226 -0.207293 -0.955018 0.212062 -0.249688 -0.836418 0.487914 -0.052734 -0.657454 0.751647 0.636871 -0.006910 0.770939 0.764508 0.644600 0.004213 0.529012 0.813303 -0.242249 0.293842 0.953852 0.061827 -0.074276 0.982102 0.173088 -0.442234 0.895166 0.055741 -0.676564 0.240387 -0.696042 -0.245900 -0.668430 -0.701950 -0.196570 -0.903163 -0.381649 -0.285214 -0.956798 -0.056490 -0.300833 -0.925648 0.229509 -0.075800 -0.850602 0.520317 0.653964 -0.270131 0.706655 0.796565 0.573486 0.191308 0.572402 0.819957 0.005157 0.401644 0.868319 0.291040 0.068695 0.911981 0.404441 -0.310177 0.906122 0.287633 -0.670348 0.486868 -0.559995 -0.366719 -0.433435 -0.823196 -0.322201 -0.747129 -0.581365 -0.392735 -0.873905 -0.286444 -0.386171 -0.922331 -0.013319 -0.137827 -0.953516 0.267977 0.652264 -0.506422 0.563993 0.849294 0.427086 0.310319 0.647166 0.733895 0.206335 0.528388 0.716133 0.456025 0.228985 0.775270 0.588661 -0.150538 0.849980 0.504849 -0.631494 0.685790 -0.361811 -0.485417 -0.172502 -0.857096 -0.459521 -0.538539 -0.706269 -0.520157 -0.724043 -0.452989 -0.499210 -0.840830 -0.209273 -0.237180 -0.971005 0.029914 0.619835 -0.696002 0.362473 0.907382 0.238899 0.345812 0.740839 0.581805 0.335649 0.661008 0.519398 0.541566 0.395068 0.586098 0.707397 0.026958 0.728070 0.684972 -0.553869 0.823183 -0.124898 -0.582452 0.092535 -0.807581 -0.592141 -0.298471 -0.748521 -0.654163 -0.529072 -0.540512 -0.628114 -0.701832 -0.336013 -0.365868 -0.915916 -0.165043 0.550003 -0.825790 0.124773 0.954620 0.040295 0.295090 0.837733 0.392236 0.379940 0.785282 0.301968 0.540506 0.554845 0.363153 0.748510 0.211661 0.550361 0.807653 -0.435294 0.891579 0.124922 -0.643814 0.341234 -0.684882 -0.705201 -0.048620 -0.707339 -0.780316 -0.312743 -0.541571 -0.758324 -0.529683 -0.379974 -0.511802 -0.806793 -0.295202 0.440547 -0.888971 -0.125098 0.976221 -0.140690 0.164922 0.921790 0.193392 0.336010 0.887133 0.088433 0.452962 0.696326 0.128172 0.706188 0.392562 0.333556 0.857109 -0.277457 0.890024 0.361767 -0.660452 0.555846 -0.504816 -0.785857 0.189830 -0.588552 -0.884377 -0.099512 -0.456042 -0.874093 -0.351030 -0.335768 -0.660195 -0.666649 -0.346007 0.293205 -0.884534 -0.362809 0.959623 -0.279680 -0.030052 0.977780 0.012276 0.209275 0.953210 -0.096828 0.286381 0.808235 -0.095066 0.581135 0.559153 0.100129 0.822996 -0.085698 0.824032 0.560024 -0.629138 0.722096 -0.287686 -0.823943 0.397032 -0.404330 -0.952790 0.086373 -0.291087 -0.959031 -0.193933 -0.206518 -0.794145 -0.522371 -0.310583 0.112836 -0.817787 -0.564351 0.894817 -0.356921 -0.268160 0.991899 -0.126332 0.013314 0.971244 -0.231314 0.056380 0.880493 -0.281754 0.381245 0.702240 -0.121963 0.701416 0.130801 0.706014 0.696014 -0.553780 0.830790 -0.055816 -0.813085 0.555850 -0.172987 -0.972950 0.222560 -0.061926 -0.996262 -0.086217 -0.005383 -0.894613 -0.403668 -0.191622 -0.092698 -0.701115 -0.706997 0.774628 -0.359073 -0.520594 0.952137 -0.201818 -0.229576 0.930745 -0.297791 -0.212214 0.904454 -0.408539 0.122712 0.814243 -0.300828 0.496500 0.358455 0.556303 0.749691 -0.445467 0.878644 0.171885 -0.752472 0.653422 0.082615 -0.933827 0.291737 0.207020 -0.968885 -0.051968 0.241995 -0.940227 -0.340517 -0.004596 -0.312202 -0.554757 -0.771216 0.595656 -0.282352 -0.751978 0.849252 -0.201404 -0.488065 0.824741 -0.289563 -0.485753 0.872333 -0.458907 -0.168640 0.885692 -0.407010 0.223367 0.578510 0.406062 0.707418 -0.315638 0.867956 0.383437 -0.646923 0.683244 0.338626 -0.827832 0.286791 0.482126 -0.862485 -0.104101 0.495260 -0.908730 -0.356160 0.217623 -0.530609 -0.406732 -0.743655 0.360577 -0.136959 -0.922619 0.679070 -0.125485 -0.723269 0.653065 -0.216091 -0.725817 0.778003 -0.430319 -0.457753 0.901919 -0.422575 -0.089292 0.767393 0.292290 0.570678 -0.166978 0.805490 0.568599 -0.502937 0.646691 0.573450 -0.654552 0.216453 0.724368 -0.671657 -0.234550 0.702754 -0.782337 -0.456681 0.423546 -0.726815 -0.288710 -0.623207 0.082158 0.051043 -0.995311 0.446321 0.008140 -0.894836 0.426142 -0.104461 -0.898605 0.621548 -0.340820 -0.705351 0.846778 -0.353056 -0.397892 0.897673 0.249118 0.363487 0.003704 0.708340 0.705862 -0.323709 0.557548 0.764430 -0.424709 0.107355 0.898942 -0.410513 -0.405035 0.816961 -0.561612 -0.615172 0.553313 -0.875957 -0.231767 -0.423063 -0.213175 0.240950 -0.946837 0.168212 0.164439 -0.971939 0.165832 0.007681 -0.986124 0.415460 -0.225851 -0.881127 0.717408 -0.230055 -0.657572 0.950478 0.282525 0.129506 0.187363 0.610341 0.769661 -0.115962 0.447172 0.886899 -0.161340 -0.002803 0.986895 -0.117438 -0.556605 0.822435 -0.282822 -0.771878 0.569400 -0.950451 -0.255044 -0.177753 -0.486331 0.386530 -0.783631 -0.125399 0.299377 -0.945859 -0.099271 0.086032 -0.991334 0.184430 -0.125017 -0.974862 0.531335 -0.097715 -0.841508 0.923745 0.372281 -0.090018 0.358311 0.546736 0.756765 0.100652 0.354707 0.929544 0.105852 -0.079731 0.991180 0.163366 -0.642642 0.748547 -0.007388 -0.870705 0.491749 -0.934891 -0.349518 0.061770 -0.701450 0.456710 -0.547160 -0.400749 0.378274 -0.834451 -0.342851 0.111275 -0.932776 -0.043669 -0.066302 -0.996844 0.317286 0.006568 -0.948307 0.829849 0.486748 -0.272813 0.490724 0.535341 0.687460 0.299559 0.308954 0.902669 0.349986 -0.103822 0.930984 0.407465 -0.650702 0.640749 0.223797 -0.896599 0.382133 -0.838944 -0.480188 0.256110 -0.845372 0.445786 -0.294316 -0.631992 0.386977 -0.671442 -0.546773 0.080272 -0.833424 -0.246449 -0.060493 -0.967266 0.102723 0.062628 -0.992736 0.686049 0.598860 -0.413163 0.569684 0.572986 0.589192 0.459295 0.318286 0.829302 0.553169 -0.072355 0.829921 0.610076 -0.593281 0.525191 0.411167 -0.865939 0.284765 -0.689236 -0.604698 0.399118 -0.927317 0.368463 -0.065707 -0.806837 0.330930 -0.489387 -0.702017 0.000757 -0.712160 -0.409912 -0.105649 -0.905986 -0.092320 0.065000 -0.993606 0.508496 0.689937 -0.515188 0.591472 0.645531 0.483166 0.568575 0.376033 0.731657 0.706922 0.006953 0.707258 0.771488 -0.488587 0.407541 0.570025 -0.795317 0.206258 -0.507180 -0.699704 0.503173 -0.960268 0.248226 0.127551 -0.923893 0.227220 -0.307885 -0.805677 -0.115541 -0.580977 -0.526876 -0.193120 -0.827712 -0.255140 0.017346 -0.966749 0.309736 0.748926 -0.585810 0.558566 0.736299 0.381926 0.623868 0.469072 0.625107 0.808888 0.122424 0.575076 0.890963 -0.352166 0.286643 0.707533 -0.693476 0.135966 -0.305930 -0.756101 0.578549 -0.950865 0.107610 0.290302 -0.986364 0.094353 -0.134843 -0.857514 -0.256348 -0.446045 -0.594593 -0.311359 -0.741293 -0.378641 -0.071834 -0.922752 0.099238 0.768764 -0.631786 0.476465 0.829526 0.291321 0.625914 0.582832 0.518207 0.859078 0.262092 0.439650 0.967208 -0.195853 0.161711 0.822012 -0.565936 0.063352 -0.094672 -0.770547 0.630313 -0.901963 -0.034579 0.430426 -0.998262 -0.051816 0.028087 -0.857800 -0.409733 -0.310320 -0.612373 -0.447861 -0.651475 -0.458537 -0.191692 -0.867755 -0.114406 0.745561 -0.656544 0.352297 0.911109 0.213932 0.577482 0.702944 0.415192 0.857998 0.414126 0.303874 0.999009 -0.029183 0.033591 0.908310 -0.417986 -0.016164 0.118726 -0.741893 0.659924 -0.816701 -0.164245 0.553194 -0.963256 -0.198597 0.180822 -0.807114 -0.563717 -0.175472 -0.580297 -0.590208 -0.561169 -0.491459 -0.330812 -0.805625 -0.322126 0.677377 -0.661359 0.193708 0.969273 0.151612 0.481999 0.816165 0.318672 0.806419 0.566589 0.169308 0.985654 0.138758 -0.096081 0.961346 -0.255422 -0.102827 0.325281 -0.668972 0.668333 -0.699627 -0.271726 0.660823 -0.884985 -0.335187 0.323188 -0.707254 -0.705651 -0.042985 -0.501356 -0.725489 -0.471495 -0.477585 -0.476615 -0.738073 -0.513247 0.562659 -0.648068 0.010860 0.994447 0.104680 0.345094 0.909926 0.230098 0.705994 0.707216 0.037664 0.927437 0.298568 -0.225206 0.976847 -0.085320 -0.196192 0.514463 -0.551766 0.656417 -0.556407 -0.349262 0.753941 -0.767765 -0.451855 0.454274 -0.562146 -0.822707 0.084525 -0.380503 -0.841301 -0.383967 -0.419158 -0.616043 -0.666931 -0.676114 0.406208 -0.614707 -0.183629 0.980234 0.073637 0.175133 0.972896 0.151003 0.560887 0.823105 -0.088900 0.826542 0.439773 -0.351323 0.951945 0.083343 -0.294712 0.675091 -0.394126 0.623632 -0.394650 -0.390187 0.831869 -0.617545 -0.539453 0.572389 -0.379071 -0.902609 0.203968 -0.224723 -0.926936 -0.300483 -0.320407 -0.737693 -0.594263 -0.798916 0.214465 -0.561906 -0.377448 0.924123 0.059422 -0.018072 0.996315 0.083842 0.378219 0.902215 -0.207266 0.687785 0.551714 -0.471767 0.886026 0.240398 -0.396443 0.795821 -0.202801 0.570562 -0.223531 -0.390003 0.893270 -0.442305 -0.589649 0.675781 -0.168721 -0.935095 0.311658 -0.043860 -0.973944 -0.222509 -0.189168 -0.832026 -0.521486 -0.871435 -0.001658 -0.490507 -0.557636 0.827822 0.061255 -0.222018 0.974573 0.030246 0.168499 0.934389 -0.313888 0.518986 0.624677 -0.583466 0.781361 0.374644 -0.499115 0.866979 0.011594 0.498210 -0.054206 -0.346054 0.936647 -0.252327 -0.595917 0.762374 0.055290 -0.913247 0.403638 0.151338 -0.976671 -0.152348 -0.033832 -0.891936 -0.450894 -0.887570 -0.227103 -0.400805 -0.713158 0.696560 0.078807 -0.423582 0.905825 -0.007684 -0.054763 0.912628 -0.405106 0.331018 0.650958 -0.683140 0.643767 0.475653 -0.599431 0.882276 0.235108 0.407816 0.101236 -0.259390 0.960452 -0.059792 -0.554663 0.829924 0.277274 -0.834340 0.476442 0.348832 -0.932757 -0.090991 0.135541 -0.913871 -0.382712 -0.843178 -0.447494 -0.297995 -0.835618 0.538220 0.109830 -0.609564 0.792200 -0.029169 -0.276257 0.834269 -0.477155 0.136897 0.626215 -0.767538 0.482403 0.534235 -0.694176 0.838675 0.452559 0.303009 0.230699 -0.134348 0.963706 0.121963 -0.465614 0.876544 0.481044 -0.700775 0.526793 0.536643 -0.842862 -0.039977 0.309098 -0.896452 -0.317540 -0.742036 -0.644791 -0.183379 -0.919751 0.362404 0.150738 -0.767846 0.639682 -0.034926 -0.479851 0.701344 -0.527124 -0.049137 0.550238 -0.833561 0.309356 0.544476 -0.779644 0.738840 0.647522 0.186629 0.322764 0.020845 0.946250 0.279287 -0.332622 0.900756 0.651517 -0.519801 0.552570 0.703776 -0.710421 -0.001104 0.478651 -0.839646 -0.256686 -0.590989 -0.804315 -0.061716 -0.963321 0.178276 0.200575 -0.889225 0.456825 -0.024290 -0.650547 0.520903 -0.552674 -0.212927 0.427022 -0.878814 0.138259 0.504738 -0.852129 0.589762 0.805121 0.062933 0.370001 0.194156 0.908517 0.400535 -0.163969 0.901491 0.776410 -0.302901 0.552665 0.840301 -0.541570 0.024403 0.636192 -0.745021 -0.200510 -0.400993 -0.913996 0.061766 -0.966471 -0.005346 0.256720 -0.967151 0.254199 0.001214 -0.775923 0.304334 -0.552561 -0.342147 0.264919 -0.901528 -0.016740 0.417580 -0.908486 0.402393 0.913304 -0.062901 0.367990 0.372084 0.852136 0.476326 0.029033 0.878789 0.847300 -0.064883 0.527137 0.937943 -0.345024 0.034959 0.773836 -0.615199 -0.150692 -0.187242 -0.965065 0.183275 -0.930910 -0.180612 0.317468 -0.998268 0.043221 0.039913 -0.847417 0.066193 -0.526785 -0.427700 0.075648 -0.900750 -0.143286 0.290071 -0.946218 0.191332 0.963636 -0.186541 0.316815 0.540144 0.779662 0.501056 0.232529 0.833591 0.860608 0.177840 0.477208 0.990851 -0.131660 0.029656 0.884051 -0.454447 -0.109230 0.034255 -0.954039 0.297720 -0.859292 -0.339772 0.382325 -0.982217 -0.164359 0.090747 -0.861209 -0.177004 -0.476433 -0.464097 -0.127131 -0.876614 -0.231448 0.132668 -0.963759 -0.027400 0.952628 -0.302902 0.221374 0.684896 0.694198 0.473929 0.431621 0.767525 0.817786 0.408808 0.405096 0.996268 0.085970 0.007647 0.959792 -0.269390 -0.078915 0.246392 -0.882098 0.401490 -0.755743 -0.475134 0.450667 -0.921556 -0.357170 0.152195 -0.818539 -0.408659 -0.403722 -0.450446 -0.328998 -0.829975 -0.275258 -0.041790 -0.960462 -0.237300 0.881594 -0.408021 0.089976 0.795364 0.599416 0.398222 0.612114 0.683180 0.724946 0.613064 0.314015 0.955012 0.295039 -0.030073 0.995752 -0.068871 -0.061105 0.434905 -0.755673 0.489710 -0.626064 -0.579769 0.521452 -0.821594 -0.524879 0.222452 -0.725539 -0.613577 -0.311635 -0.389940 -0.516447 -0.762384 -0.272505 -0.219881 -0.936693 -0.423587 0.756722 -0.497942 -0.066285 0.864061 0.499003 0.281452 0.761800 0.583477 0.592343 0.778537 0.207386 0.871866 0.482627 -0.083195 0.989063 0.135359 -0.058585 0.584771 -0.584801 0.562185 -0.478755 -0.646878 0.593585 -0.690458 -0.658284 0.299884 -0.592237 -0.779492 -0.204080 -0.289459 -0.677812 -0.675858 -0.225720 -0.388437 -0.893402 -0.573343 0.587832 -0.570730 -0.234967 0.887454 0.396505 0.133990 0.871494 0.471747 0.432581 0.897184 0.089074 0.755168 0.637998 -0.150599 0.940805 0.330946 -0.073221 0.689401 -0.382765 0.614993 -0.324351 -0.671196 0.666552 -0.538657 -0.750143 0.383581 -0.431597 -0.898080 -0.084715 -0.158383 -0.804474 -0.572483 -0.140498 -0.536726 -0.831977 -0.678692 0.387679 -0.623765 -0.403857 0.866087 0.294606 -0.032358 0.935703 0.351301 0.259702 0.964968 -0.037296 0.615479 0.754110 -0.229137 0.855677 0.507042 -0.103565 0.744267 -0.163413 0.647583 -0.173940 -0.652614 0.737455 -0.377784 -0.797279 0.470771 -0.257846 -0.965238 0.042793 -0.007524 -0.890858 -0.454219 -0.023892 -0.656352 -0.754076 -0.735122 0.169762 -0.656336 -0.562464 0.803224 0.196124 -0.205056 0.952507 0.225128 0.088021 0.981687 -0.168945 0.466256 0.825646 -0.317668 0.742833 0.652390 -0.150289 0.746709 0.058696 0.662556 -0.041084 -0.592066 0.804842 -0.221370 -0.798226 0.560205 -0.085002 -0.980898 0.174967 0.152203 -0.933956 -0.323359 0.114788 -0.741508 -0.661053 -0.741687 -0.052523 -0.668687 -0.701892 0.704800 0.102979 -0.372446 0.923068 0.096070 -0.069929 0.950285 -0.303427 0.320709 0.851656 -0.414521 0.613416 0.760434 -0.213217 0.702796 0.273066 0.656896 0.062362 -0.493418 0.867554 -0.082564 -0.754527 0.651055 0.073588 -0.947914 0.309910 0.309840 -0.933380 -0.181110 0.266550 -0.789148 -0.553350 -0.701817 -0.268011 -0.660017 -0.816231 0.577501 0.016117 -0.524808 0.850562 -0.033484 -0.202208 0.875334 -0.439207 0.192106 0.833955 -0.517314 0.480268 0.827719 -0.290213 0.616151 0.469814 0.632165 0.126898 -0.364664 0.922452 0.027258 -0.671277 0.740706 0.206336 -0.871091 0.445675 0.454372 -0.890367 -0.028154 0.421720 -0.797977 -0.430563 -0.620050 -0.467273 -0.630234 -0.901276 0.428637 -0.063028 -0.653298 0.739654 -0.161600 -0.298033 0.762208 -0.574643 0.094730 0.775532 -0.624160 0.358622 0.852382 -0.380571 0.493395 0.641922 0.586939 0.142405 -0.213382 0.966534 0.095872 -0.553788 0.827120 0.302449 -0.755975 0.580540 0.575080 -0.806931 0.134705 0.569407 -0.769032 -0.290459 -0.501775 -0.642996 -0.578600 -0.954481 0.265821 -0.135295 -0.750606 0.595454 -0.286401 -0.347238 0.616292 -0.706831 0.041903 0.681258 -0.730843 0.263725 0.835563 -0.481958 0.343059 0.784789 0.516155 0.101932 -0.048402 0.993613 0.112908 -0.408762 0.905630 0.351348 -0.608164 0.711822 0.659019 -0.686311 0.307687 0.695973 -0.706635 -0.127622 -0.352280 -0.789178 -0.503088 -0.973958 0.095881 -0.205459 -0.809200 0.423659 -0.407074 -0.339267 0.443530 -0.829565 0.046425 0.557929 -0.828589 0.211701 0.780667 -0.587997 0.175322 0.893144 0.414193 0.002360 0.119379 0.992846 0.070352 -0.244664 0.967052 0.342645 -0.434004 0.833208 0.690270 -0.533042 0.489279 0.783596 -0.617784 0.065723 -0.179015 -0.899335 -0.398937 -0.955813 -0.076764 -0.283775 -0.819337 0.231468 -0.524509 -0.265204 0.251796 -0.930734 0.118200 0.415043 -0.902091 0.218617 0.693673 -0.686312 0.006178 0.961749 0.273862 -0.153687 0.277259 0.948424 -0.036200 -0.071921 0.996753 0.267535 -0.241885 0.932693 0.651380 -0.353554 0.671344 0.809469 -0.508042 0.294368 0.003773 -0.966667 -0.256009 -0.888914 -0.254005 -0.381200 -0.767976 0.027319 -0.639895 -0.122537 0.052213 -0.991090 0.257263 0.265611 -0.929121 0.294807 0.584789 -0.755718 -0.140017 0.985976 0.090813 -0.351398 0.410603 0.841382 -0.201421 0.096395 0.974750 0.123827 -0.043425 0.991353 0.528280 -0.157594 0.834317 0.746784 -0.377987 0.547210 0.165174 -0.984331 -0.061725 -0.750987 -0.441119 -0.491359 -0.638966 -0.179968 -0.747886 0.077463 -0.141054 -0.986967 0.445496 0.123980 -0.886658 0.435248 0.468434 -0.768849 -0.230707 0.964400 -0.129258 -0.558875 0.505812 0.657125 -0.404162 0.246278 0.880908 -0.076750 0.147088 0.986141 0.321657 0.041249 0.945957 0.577662 -0.227164 0.784030 0.255173 -0.950363 0.178037 -0.527261 -0.630454 -0.569669 -0.423864 -0.380047 -0.822134 0.304533 -0.314183 -0.899194 0.644872 -0.000946 -0.764290 0.611741 0.358526 -0.705147 -0.233183 0.902029 -0.363277 -0.729704 0.556551 0.397220 -0.606462 0.367491 0.705091 -0.304022 0.316460 0.898567 0.057433 0.227750 0.972024 0.314217 -0.063870 0.947200 0.237271 -0.874510 0.423007 -0.251493 -0.793471 -0.554215 -0.145761 -0.557767 -0.817098 0.514068 -0.458761 -0.724757 0.811322 -0.112148 -0.573742 0.780781 0.258902 -0.568640 -0.130061 0.810843 -0.570629 -0.817029 0.569791 0.088335 -0.762103 0.458402 0.457238 -0.514105 0.457241 0.725690 -0.216601 0.390387 0.894809 0.002546 0.096808 0.995300 0.113296 -0.774147 0.622784 -0.003962 -0.905361 -0.424624 0.132592 -0.698552 -0.703167 0.661903 -0.573729 -0.482411 0.914959 -0.219013 -0.338944 0.909272 0.160854 -0.383862 0.062404 0.703858 -0.707594 -0.794954 0.563740 -0.224155 -0.833703 0.526002 0.168111 -0.663443 0.569277 0.485558 -0.448569 0.525148 0.723191 -0.299291 0.243846 0.922477 -0.086873 -0.662877 0.743672 0.146182 -0.964857 -0.218360 0.341092 -0.798737 -0.495657 0.719384 -0.662994 -0.207184 0.941999 -0.325302 -0.082561 0.983652 0.053645 -0.171902 0.302765 0.588248 -0.749866 -0.667083 0.554715 -0.497284 -0.805901 0.579090 -0.123203 -0.723424 0.657035 0.212044 -0.599496 0.634479 0.487894 -0.542963 0.374463 0.751644 -0.324429 -0.547951 0.771035 0.175872 -0.984404 0.004222 0.439763 -0.864827 -0.242245 0.679135 -0.731404 0.061840 0.887682 -0.426660 0.173153 0.996355 -0.064437 0.055899 0.546490 0.465736 -0.696017 -0.455966 0.547003 -0.702056 -0.683901 0.621757 -0.381703 -0.686005 0.725399 -0.056501 -0.651241 0.723346 0.229467 -0.698802 0.490934 0.520250 -0.560931 -0.431273 0.706654 0.098424 -0.976566 0.191395 0.423929 -0.905681 0.005214 0.551154 -0.781995 0.291055 0.755423 -0.515506 0.404463 0.939790 -0.184475 0.287688 0.756906 0.337076 -0.559887 -0.191996 0.534242 -0.823240 -0.485922 0.652574 -0.581401 -0.560455 0.777069 -0.286451 -0.605690 0.795589 -0.013316 -0.756880 0.596089 0.267973 -0.764708 -0.311719 0.563962 -0.054761 -0.949046 0.310342 0.312008 -0.927397 0.206361 0.355988 -0.815666 0.456028 0.556891 -0.585958 0.588664 0.811361 -0.294690 0.504828 0.909669 0.203979 -0.361793 0.093350 0.506713 -0.857046 -0.236600 0.667270 -0.706238 -0.366950 0.812495 -0.452990 -0.478576 0.852742 -0.209275 -0.722325 0.690906 0.029926 -0.912678 -0.188803 0.362452 -0.246806 -0.905279 0.345770 0.133434 -0.932499 0.335622 0.119308 -0.832151 0.541563 0.310046 -0.635182 0.707401 0.617068 -0.387369 0.684962 0.989825 0.068073 -0.124947 0.371396 0.458166 -0.807557 0.037609 0.662061 -0.748506 -0.131097 0.831061 -0.540511 -0.293736 0.894879 -0.336023 -0.610254 0.774819 -0.165061 -0.990158 -0.063403 0.124765 -0.442406 -0.846879 0.295081 -0.079179 -0.921621 0.379929 -0.131126 -0.831060 0.540504 0.037092 -0.662139 0.748462 0.370811 -0.458573 0.807595 0.989765 -0.068817 0.125019 0.617438 0.386957 -0.684861 0.310499 0.635017 -0.707350 0.119324 0.832144 -0.541570 -0.079550 0.921585 -0.379938 -0.442798 0.846647 -0.295160 -0.990147 0.062938 -0.125093 -0.609946 -0.775092 0.164920 -0.293414 -0.894985 0.336021 -0.366985 -0.812495 0.452961 -0.237155 -0.667124 0.706189 0.092587 -0.506750 0.857107 0.909580 -0.204693 0.361615 0.811557 0.294138 -0.504835 0.557290 0.585687 -0.588557 0.356002 0.815648 -0.456050 0.133057 0.932500 -0.335767 -0.247233 0.905078 -0.345992 -0.912625 0.188420 -0.362785 -0.722050 -0.691186 -0.030089 -0.478281 -0.852913 0.209253 -0.560469 -0.777086 0.286377 -0.486473 -0.652345 0.581197 -0.192908 -0.534118 0.823107 0.756523 -0.337795 0.559971 0.939904 0.183679 -0.287825 0.755810 0.515005 -0.404376 0.551193 0.781953 -0.291094 0.311595 0.927489 -0.206573 -0.055273 0.948910 -0.310669 -0.764640 0.311197 -0.564343 -0.756557 -0.596436 -0.268115 -0.605377 -0.795827 0.013326 -0.685945 -0.725466 0.056380 -0.684256 -0.621662 0.381221 -0.456759 -0.547214 0.701376 0.545797 -0.466267 0.696204 0.996380 0.064129 -0.055801 0.887937 0.426197 -0.172988 0.679218 0.731320 -0.061923 0.423426 0.905915 -0.005376 0.097663 0.976597 -0.191624 -0.560848 0.430718 -0.707058 -0.698261 -0.491352 -0.520581 -0.650837 -0.723680 -0.229561 -0.723261 -0.657160 -0.212212 -0.806016 -0.579039 0.122690 -0.667607 -0.554838 0.496443 0.302658 -0.588612 0.749623 0.983641 -0.053418 0.172036 0.942092 0.325000 0.082685 0.719566 0.662847 0.207026 0.439409 0.865069 0.242024 0.175171 0.984528 -0.004534 -0.324322 0.547810 -0.771180 -0.542282 -0.374695 -0.752020 -0.599007 -0.634790 -0.488091 -0.663147 -0.569456 -0.485753 -0.833596 -0.526008 -0.168619 -0.795315 -0.563535 0.223390 0.062410 -0.704024 0.707429 0.909485 -0.160601 0.383464 0.915151 0.218669 0.338647 0.662277 0.573531 0.482132 0.341112 0.798966 0.495273 0.145940 0.965055 0.217649 -0.086933 0.662901 -0.743643 -0.298900 -0.243773 -0.922623 -0.448209 -0.525333 -0.723279 -0.513669 -0.457535 -0.725814 -0.761642 -0.458639 -0.457768 -0.816926 -0.569792 -0.089266 -0.130492 -0.810744 0.570672 0.781105 -0.258177 0.568524 0.811567 0.112174 0.573390 0.514738 0.458624 0.724368 0.132769 0.698931 0.702757 -0.004170 0.905855 0.423568 0.113280 0.773878 -0.623122 0.002961 -0.096628 -0.995316 -0.216217 -0.390574 -0.894820 -0.303537 -0.316851 -0.898594 -0.605892 -0.367895 -0.705371 -0.729145 -0.556790 -0.397910 -0.233098 -0.901951 0.363524 0.611694 -0.357321 0.705799 0.644797 0.001574 0.764353 0.305383 0.314181 0.898906 -0.145417 0.558107 0.816927 -0.251781 0.794076 0.553218 0.237295 0.874413 -0.423194 0.315096 0.064163 -0.946888 0.058187 -0.227914 -0.971941 -0.076291 -0.147484 -0.986118 -0.403512 -0.246846 -0.881048 -0.558098 -0.506216 -0.657474 -0.230527 -0.964396 0.129603 0.434977 -0.467370 0.769650 0.445261 -0.123135 0.886893 0.078238 0.141157 0.986891 -0.423363 0.380072 0.822380 -0.527225 0.630897 0.569212 0.254772 0.950504 -0.177858 0.578180 0.227763 -0.783475 0.322215 -0.041176 -0.945771 0.124180 0.042994 -0.991328 -0.200533 -0.097135 -0.974860 -0.350359 -0.411201 -0.841524 -0.139630 -0.986085 -0.090225 0.294355 -0.583808 0.756653 0.256881 -0.264622 0.929509 -0.121952 -0.051872 0.991180 -0.638222 0.179786 0.748565 -0.750401 0.441627 0.491796 0.164251 0.984480 0.061814 0.746375 0.379046 -0.547036 0.528098 0.157907 -0.834373 0.267761 0.241300 -0.932780 -0.035444 0.070984 -0.996848 -0.152788 -0.278077 -0.948330 0.006635 -0.962044 -0.272814 0.218116 -0.692702 0.687451 0.117687 -0.413934 0.902667 -0.264932 -0.251199 0.930973 -0.767289 -0.027527 0.640711 -0.888409 0.254464 0.382069 0.003871 0.966620 0.256186 0.808650 0.509282 -0.294479 0.650949 0.353880 -0.671591 0.342895 0.433362 -0.833439 0.070827 0.243648 -0.967274 0.002871 -0.120314 -0.992732 0.175649 -0.893608 -0.413052 0.211344 -0.779834 0.589231 0.045975 -0.556882 0.829318 -0.339256 -0.442858 0.829929 -0.818856 -0.231665 0.525173 -0.955513 0.076926 0.284741 -0.179243 0.899271 0.398977 0.782804 0.618791 -0.065690 0.690026 0.533251 -0.489395 0.351673 0.607576 -0.712164 0.113432 0.407809 -0.905994 0.102401 0.047450 -0.993611 0.343210 -0.785325 -0.515240 0.263357 -0.834977 0.483174 0.041405 -0.680401 0.731669 -0.347435 -0.615677 0.707270 -0.808865 -0.423825 0.407566 -0.973767 -0.095990 0.206309 -0.352267 0.789088 0.503238 0.695079 0.707533 0.127522 0.658738 0.686493 -0.307883 0.302789 0.755495 -0.580987 0.096248 0.552855 -0.827700 0.142666 0.212297 -0.966735 0.493694 -0.642705 -0.585830 0.358308 -0.851919 0.381902 0.094247 -0.774835 0.625099 -0.298427 -0.761719 0.575088 -0.750482 -0.595498 0.286633 -0.954355 -0.265978 0.135877 -0.501790 0.643009 0.578573 0.568673 0.769624 0.290325 0.574907 0.807029 -0.134853 0.206744 0.870794 -0.446067 0.027574 0.670549 -0.741352 0.127013 0.363735 -0.922803 0.616248 -0.470409 -0.631627 0.480187 -0.827345 0.291411 0.191816 -0.833439 0.518253 -0.202585 -0.875025 0.439649 -0.653241 -0.739680 0.161710 -0.901121 -0.428903 0.063422 -0.620105 0.467273 0.630180 0.421058 0.798409 0.430410 0.454286 0.890413 0.028094 0.073982 0.947763 -0.310278 -0.082055 0.754093 -0.651622 0.062766 0.492733 -0.867914 0.702945 -0.273662 -0.656488 0.613188 -0.760354 0.214154 0.320306 -0.851425 0.415305 -0.070319 -0.950131 0.303819 -0.524807 -0.850560 0.033546 -0.816107 -0.577679 -0.015983 -0.701809 0.268115 0.659983 0.266037 0.789463 0.553147 0.309702 0.933461 0.180930 -0.084611 0.980868 -0.175325 -0.220812 0.797987 -0.560767 -0.040546 0.591552 -0.805247 0.746961 -0.059315 -0.662216 0.742572 -0.652507 0.151070 0.465829 -0.825619 0.318366 0.087629 -0.981659 0.169312 -0.372522 -0.923039 -0.096057 -0.701831 -0.704850 -0.103048 -0.741751 0.052699 0.668602 0.114530 0.741677 0.660907 0.152168 0.934010 0.323220 -0.257443 0.965331 -0.043121 -0.377141 0.797306 -0.471242 -0.173224 0.652403 -0.737810 0.744470 0.162845 -0.647492 0.855432 -0.507344 0.104110 0.615049 -0.754285 0.229716 0.259344 -0.965051 0.037661 -0.205149 -0.952487 -0.225128 -0.562446 -0.803183 -0.196345 -0.735245 -0.169566 0.656249 -0.023982 0.656470 0.753971 -0.007501 0.890916 0.454107 -0.431355 0.898227 0.084387 -0.538365 0.749897 -0.384472 -0.324010 0.670468 -0.667450 0.690450 0.382219 -0.614156 0.940702 -0.330997 0.074308 0.754974 -0.638021 0.151467 0.432242 -0.897371 -0.088838 -0.032572 -0.935683 -0.351335 -0.403809 -0.866127 -0.294556 -0.679097 -0.387530 0.623417 -0.140706 0.536954 0.831795 -0.158359 0.804569 0.572357 -0.592051 0.779647 0.204023 -0.690359 0.658136 -0.300436 -0.478708 0.646388 -0.594156 0.584308 0.584602 -0.562872 0.989051 -0.135035 0.059536 0.871893 -0.482442 0.083983 0.592255 -0.778668 -0.207145 0.133910 -0.871486 -0.471783 -0.234842 -0.887468 -0.396547 -0.573319 -0.587723 0.570864 -0.226049 0.388542 0.893273 -0.289445 0.677845 0.675831 -0.725453 0.613720 0.311555 -0.821428 0.525100 -0.222544 -0.625751 0.580035 -0.521531 0.435089 0.755533 -0.489763 0.995771 0.068730 0.060966 0.954945 -0.295259 0.030046 0.724881 -0.613190 -0.313918 0.281494 -0.761830 -0.583418 -0.066259 -0.864005 -0.499104 -0.423684 -0.756648 0.497972 -0.272455 0.220078 0.936661 -0.389885 0.516544 0.762346 -0.818521 0.408787 0.403629 -0.921485 0.357165 -0.152637 -0.755499 0.474926 -0.451295 0.247045 0.882171 -0.400927 0.959743 0.269405 0.079457 0.996272 -0.085963 -0.007194 0.817733 -0.408944 -0.405064 0.398147 -0.612179 -0.683166 0.090103 -0.795390 -0.599364 -0.237561 -0.881602 0.407851 -0.275496 0.041993 0.960385 -0.450549 0.329127 0.829868 -0.861188 0.177032 0.476460 -0.982220 0.164229 -0.090953 -0.859258 0.339446 -0.382691 0.033825 0.953898 -0.298219 0.883890 0.454582 0.109966 0.990842 0.131863 -0.029051 0.860638 -0.177885 -0.477137 0.473815 -0.431694 -0.767554 0.221420 -0.684928 -0.694152 -0.027379 -0.952572 0.303079 -0.231729 -0.132654 0.963693 -0.464246 0.127183 0.876527 -0.847414 -0.066213 0.526788 -0.998264 -0.043349 -0.039873 -0.930935 0.180462 -0.317481 -0.187312 0.965064 -0.183208 0.773746 0.615306 0.150716 0.937897 0.345153 -0.034922 0.847299 0.064903 -0.527136 0.501068 -0.232614 -0.833559 0.316866 -0.540225 -0.779585 0.191296 -0.963641 0.186551 -0.143355 -0.289996 0.946230 -0.427774 -0.075576 0.900721 -0.775913 -0.304358 0.552563 -0.967115 -0.254338 -0.001210 -0.966478 0.005173 -0.256697 -0.401178 0.913907 -0.061896 0.636102 0.745106 0.200477 0.840231 0.541676 -0.024445 0.776407 0.302909 -0.552664 0.476381 -0.029122 -0.878756 0.368033 -0.372202 -0.852067 0.402444 -0.913268 0.063099 -0.016768 -0.417497 0.908524 -0.342174 -0.264827 0.901545 -0.650537 -0.520923 0.552667 -0.889169 -0.456943 0.024128 -0.963270 -0.178416 -0.200697 -0.591020 0.804287 0.061787 0.478527 0.839735 0.256626 0.703672 0.710524 0.001010 0.651498 0.519815 -0.552579 0.400640 0.163922 -0.901453 0.370081 -0.194228 -0.908469 0.589774 -0.805119 -0.062855 0.138266 -0.504577 0.852223 -0.212882 -0.426867 0.878900 -0.479850 -0.701310 0.527170 -0.767747 -0.639781 0.035278 -0.919772 -0.362521 -0.150324 -0.742362 0.644530 0.182974 0.308876 0.896580 0.317395 0.536529 0.842936 0.039930 0.481038 0.700802 -0.526763 0.279256 0.332512 -0.900806 0.322667 -0.020957 -0.946280 0.738883 -0.647513 -0.186492 0.309302 -0.544415 0.779708 -0.049242 -0.550240 0.833553 -0.276314 -0.834256 0.477145 -0.609506 -0.792233 0.029482 -0.835612 -0.538298 -0.109490 -0.842882 0.447758 0.298433 0.135509 0.914030 0.382344 0.348825 0.932779 0.090800 0.277325 0.834298 -0.476484 0.121979 0.465451 -0.876628 0.230719 0.134111 -0.963734 0.838568 -0.452691 -0.303107 0.482414 -0.534168 0.694220 0.136785 -0.626249 0.767529 -0.054815 -0.912615 0.405128 -0.423674 -0.905784 0.007445 -0.713144 -0.696532 -0.079181 -0.887522 0.227218 0.400845 -0.033536 0.891889 0.451009 0.151471 0.976638 0.152432 0.055356 0.913229 -0.403670 -0.059666 0.554651 -0.829941 0.101470 0.259362 -0.960435 0.882279 -0.235178 -0.407770 0.643789 -0.475682 0.599386 0.331012 -0.650894 0.683204 0.168441 -0.934350 0.314033 -0.221794 -0.974642 -0.029681 -0.557380 -0.828047 -0.060548 -0.871894 0.001147 0.489693 -0.189493 0.832178 0.521125 -0.043973 0.974007 0.222207 -0.168603 0.935127 -0.311626 -0.252303 0.595863 -0.762424 -0.054284 0.345766 -0.936749 0.867117 -0.011554 -0.497971 0.781406 -0.374545 0.499119 0.518954 -0.624709 0.583460 0.377964 -0.902284 0.207429 -0.017958 -0.996394 -0.082927 -0.377307 -0.924256 -0.058232 -0.798764 -0.213730 0.562402 -0.321027 0.738207 0.593288 -0.224917 0.927168 0.299618 -0.378867 0.902652 -0.204153 -0.442228 0.589580 -0.675892 -0.223516 0.389603 -0.893448 0.795723 0.202489 -0.570809 0.886016 -0.240236 0.396563 0.687682 -0.551862 0.471743 0.560577 -0.823282 0.089219 0.174951 -0.973048 -0.150230 -0.183747 -0.980275 -0.072786 -0.676359 -0.405650 0.614806 -0.419302 0.616643 0.666287 -0.380351 0.841682 0.383281 -0.561822 0.822900 -0.084806 -0.617449 0.539469 -0.572477 -0.394570 0.389951 -0.832018 0.675154 0.393854 -0.623736 0.951979 -0.083326 0.294607 0.826473 -0.439922 0.351298 0.705699 -0.707528 -0.037324 0.344699 -0.910234 -0.229469 0.010424 -0.994521 -0.104016 -0.513552 -0.561769 0.648598 -0.477538 0.477418 0.737583 -0.501088 0.726056 0.470908 -0.706993 0.705936 0.042601 -0.767687 0.451808 -0.454451 -0.556307 0.349078 -0.754100 0.514548 0.551449 -0.656615 0.976870 0.085312 0.196078 0.927391 -0.298697 0.225225 0.806265 -0.566917 -0.168945 0.481679 -0.816565 -0.318132 0.193309 -0.969434 -0.151091 -0.322544 -0.676995 0.661546 -0.491335 0.331609 0.805373 -0.580015 0.590860 0.560774 -0.806932 0.564081 0.175140 -0.884958 0.335093 -0.323360 -0.699601 0.271490 -0.660947 0.325365 0.668826 -0.668438 0.961341 0.255507 0.102667 0.985648 -0.138778 0.096122 0.857962 -0.414510 -0.303453 0.577671 -0.703307 -0.414313 0.352518 -0.911266 -0.212898 -0.114839 -0.745388 0.656664 -0.459141 0.192177 0.867328 -0.612677 0.448393 0.650824 -0.857712 0.410171 0.309983 -0.963250 0.198642 -0.180809 -0.816719 0.163774 -0.553307 0.118824 0.741906 -0.659891 0.908220 0.418178 0.016239 0.999011 0.029137 -0.033586 0.859128 -0.262684 -0.439200 0.626206 -0.583434 -0.517176 0.476717 -0.829870 -0.289927 0.098661 -0.768042 0.632753 -0.379576 0.072464 0.922318 -0.595190 0.312025 0.740533 -0.857616 0.256849 0.445558 -0.998263 0.051680 -0.028276 -0.901856 0.033695 -0.430721 -0.094466 0.770603 -0.630276 0.821927 0.566117 -0.062824 0.967237 0.195824 -0.161570 0.809141 -0.122996 -0.574598 0.624157 -0.469891 -0.624204 0.558695 -0.736841 -0.380691 0.309220 -0.748413 0.586737 -0.255774 -0.016457 0.966596 -0.527339 0.194045 0.827200 -0.805908 0.116121 0.580541 -0.986374 -0.094685 0.134540 -0.950667 -0.108713 -0.290540 -0.306061 0.755932 -0.578700 0.707422 0.693734 -0.135228 0.890990 0.352390 -0.286283</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="1800" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="5889">0 0 0 0 0.083333 0 0 0.166667 0 0 0.250000 0 0 0.333333 0 0 0.416667 0 0 0.500000 0 0 0.583333 0 0 0.666667 0 0 0.750000 0 0 0.833333 0 0 0.916667 0 0 1.000000 0 0.006667 0 0 0.006667 0.083333 0 0.006667 0.166667 0 0.006667 0.250000 0 0.006667 0.333333 0 0.006667 0.416667 0 0.006667 0.500000 0 0.006667 0.583333 0 0.006667 0.666667 0 0.006667 0.750000 0 0.006667 0.833333 0 0.006667 0.916667 0 0.006667 1.000000 0 0.013333 0 0 0.013333 0.083333 0 0.013333 0.166667 0 0.013333 0.250000 0 0.013333 0.333333 0 0.013333 0.416667 0 0.013333 0.500000 0 0.013333 0.583333 0 0.013333 0.666667 0 0.013333 0.750000 0 0.013333 0.833333 0 0.013333 0.916667 0 0.013333 1.000000 0 0.020000 0 0 0.020000 0.083333 0 0.020000 0.166667 0 0.020000 0.250000 0 0.020000 0.333333 0 0.020000 0.416667 0 0.020000 0.500000 0 0.020000 0.583333 0 0.020000 0.666667 0 0.020000 0.750000 0 0.020000 0.833333 0 0.020000 0.916667 0 0.020000 1.000000 0 0.026667 0 0 0.026667 0.083333 0 0.026667 0.166667 0 0.026667 0.250000 0 0.026667 0.333333 0 0.026667 0.416667 0 0.026667 0.500000 0 0.026667 0.583333 0 0.026667 0.666667 0 0.026667 0.750000 0 0.026667 0.833333 0 0.026667 0.916667 0 0.026667 1.000000 0 0.033333 0 0 0.033333 0.083333 0 0.033333 0.166667 0 0.033333 0.250000 0 0.033333 0.333333 0 0.033333 0.416667 0 0.033333 0.500000 0 0.033333 0.583333 0 0.033333 0.666667 0 0.033333 0.750000 0 0.033333 0.833333 0 0.033333 0.916667 0 0.033333 1.000000 0 0.040000 0 0 0.040000 0.083333 0 0.040000 0.166667 0 0.040000 0.250000 0 0.040000 0.333333 0 0.040000 0.416667 0 0.040000 0.500000 0 0.040000 0.583333 0 0.040000 0.666667 0 0.040000 0.750000 0 0.040000 0.833333 0 0.040000 0.916667 0 0.040000 1.000000 0 0.046667 0 0 0.046667 0.083333 0 0.046667 0.166667 0 0.046667 0.250000 0 0.046667 0.333333 0 0.046667 0.416667 0 0.046667 0.500000 0 0.046667 0.583333 0 0.046667 0.666667 0 0.046667 0.750000 0 0.046667 0.833333 0 0.046667 0.916667 0 0.046667 1.000000 0 0.053333 0 0 0.053333 0.083333 0 0.053333 0.166667 0 0.053333 0.250000 0 0.053333 0.333333 0 0.053333 0.416667 0 0.053333 0.500000 0 0.053333 0.583333 0 0.053333 0.666667 0 0.053333 0.750000 0 0.053333 0.833333 0 0.053333 0.916667 0 0.053333 1.000000 0 0.060000 0 0 0.060000 0.083333 0 0.060000 0.166667 0 0.060000 0.250000 0 0.060000 0.333333 0 0.060000 0.416667 0 0.060000 0.500000 0 0.060000 0.583333 0 0.060000 0.666667 0 0.060000 0.750000 0 0.060000 0.833333 0 0.060000 0.916667 0 0.060000 1.000000 0 0.066667 0 0 0.066667 0.083333 0 0.066667 0.166667 0 0.066667 0.250000 0 0.066667 0.333333 0 0.066667 0.416667 0 0.066667 0.500000 0 0.066667 0.583333 0 0.066667 0.666667 0 0.066667 0.750000 0 0.066667 0.833333 0 0.066667 0.916667 0 0.066667 1.000000 0 0.073333 0 0 0.073333 0.083333 0 0.073333 0.166667 0 0.073333 0.250000 0 0.073333 0.333333 0 0.073333 0.416667 0 0.073333 0.500000 0 0.073333 0.583333 0 0.073333 0.666667 0 0.073333 0.750000 0 0.073333 0.833333 0 0.073333 0.916667 0 0.073333 1.000000 0 0.080000 0 0 0.080000 0.083333 0 0.080000 0.166667 0 0.080000 0.250000 0 0.080000 0.333333 0 0.080000 0.416667 0 0.080000 0.500000 0 0.080000 0.583333 0 0.080000 0.666667 0 0.080000 0.750000 0 0.080000 0.833333 0 0.080000 0.916667 0 0.080000 1.000000 0 0.086667 0 0 0.086667 0.083333 0 0.086667 0.166667 0 0.086667 0.250000 0 0.086667 0.333333 0 0.086667 0.416667 0 0.086667 0.500000 0 0.086667 0.583333 0 0.086667 0.666667 0 0.086667 0.750000 0 0.086667 0.833333 0 0.086667 0.916667 0 0.086667 1.000000 0 0.093333 0 0 0.093333 0.083333 0 0.093333 0.166667 0 0.093333 0.250000 0 0.093333 0.333333 0 0.093333 0.416667 0 0.093333 0.500000 0 0.093333 0.583333 0 0.093333 0.666667 0 0.093333 0.750000 0 0.093333 0.833333 0 0.093333 0.916667 0 0.093333 1.000000 0 0.100000 0 0 0.100000 0.083333 0 0.100000 0.166667 0 0.100000 0.250000 0 0.100000 0.333333 0 0.100000 0.416667 0 0.100000 0.500000 0 0.100000 0.583333 0 0.100000 0.666667 0 0.100000 0.750000 0 0.100000 0.833333 0 0.100000 0.916667 0 0.100000 1.000000 0 0.106667 0 0 0.106667 0.083333 0 0.106667 0.166667 0 0.106667 0.250000 0 0.106667 0.333333 0 0.106667 0.416667 0 0.106667 0.500000 0 0.106667 0.583333 0 0.106667 0.666667 0 0.106667 0.750000 0 0.106667 0.833333 0 0.106667 0.916667 0 0.106667 1.000000 0 0.113333 0 0 0.113333 0.083333 0 0.113333 0.166667 0 0.113333 0.250000 0 0.113333 0.333333 0 0.113333 0.416667 0 0.113333 0.500000 0 0.113333 0.583333 0 0.113333 0.666667 0 0.113333 0.750000 0 0.113333 0.833333 0 0.113333 0.916667 0 0.113333 1.000000 0 0.120000 0 0 0.120000 0.083333 0 0.120000 0.166667 0 0.120000 0.250000 0 0.120000 0.333333 0 0.120000 0.416667 0 0.120000 0.500000 0 0.120000 0.583333 0 0.120000 0.666667 0 0.120000 0.750000 0 0.120000 0.833333 0 0.120000 0.916667 0 0.120000 1.000000 0 0.126667 0 0 0.126667 0.083333 0 0.126667 0.166667 0 0.126667 0.250000 0 0.126667 0.333333 0 0.126667 0.416667 0 0.126667 0.500000 0 0.126667 0.583333 0 0.126667 0.666667 0 0.126667 0.750000 0 0.126667 0.833333 0 0.126667 0.916667 0 0.126667 1.000000 0 0.133333 0 0 0.133333 0.083333 0 0.133333 0.166667 0 0.133333 0.250000 0 0.133333 0.333333 0 0.133333 0.416667 0 0.133333 0.500000 0 0.133333 0.583333 0 0.133333 0.666667 0 0.133333 0.750000 0 0.133333 0.833333 0 0.133333 0.916667 0 0.133333 1.000000 0 0.140000 0 0 0.140000 0.083333 0 0.140000 0.166667 0 0.140000 0.250000 0 0.140000 0.333333 0 0.140000 0.416667 0 0.140000 0.500000 0 0.140000 0.583333 0 0.140000 0.666667 0 0.140000 0.750000 0 0.140000 0.833333 0 0.140000 0.916667 0 0.140000 1.000000 0 0.146667 0 0 0.146667 0.083333 0 0.146667 0.166667 0 0.146667 0.250000 0 0.146667 0.333333 0 0.146667 0.416667 0 0.146667 0.500000 0 0.146667 0.583333 0 0.146667 0.666667 0 0.146667 0.750000 0 0.146667 0.833333 0 0.146667 0.916667 0 0.146667 1.000000 0 0.153333 0 0 0.153333 0.083333 0 0.153333 0.166667 0 0.153333 0.250000 0 0.153333 0.333333 0 0.153333 0.416667 0 0.153333 0.500000 0 0.153333 0.583333 0 0.153333 0.666667 0 0.153333 0.750000 0 0.153333 0.833333 0 0.153333 0.916667 0 0.153333 1.000000 0 0.160000 0 0 0.160000 0.083333 0 0.160000 0.166667 0 0.160000 0.250000 0 0.160000 0.333333 0 0.160000 0.416667 0 0.160000 0.500000 0 0.160000 0.583333 0 0.160000 0.666667 0 0.160000 0.750000 0 0.160000 0.833333 0 0.160000 0.916667 0 0.160000 1.000000 0 0.166667 0 0 0.166667 0.083333 0 0.166667 0.166667 0 0.166667 0.250000 0 0.166667 0.333333 0 0.166667 0.416667 0 0.166667 0.500000 0 0.166667 0.583333 0 0.166667 0.666667 0 0.166667 0.750000 0 0.166667 0.833333 0 0.166667 0.916667 0 0.166667 1.000000 0 0.173333 0 0 0.173333 0.083333 0 0.173333 0.166667 0 0.173333 0.250000 0 0.173333 0.333333 0 0.173333 0.416667 0 0.173333 0.500000 0 0.173333 0.583333 0 0.173333 0.666667 0 0.173333 0.750000 0 0.173333 0.833333 0 0.173333 0.916667 0 0.173333 1.000000 0 0.180000 0 0 0.180000 0.083333 0 0.180000 0.166667 0 0.180000 0.250000 0 0.180000 0.333333 0 0.180000 0.416667 0 0.180000 0.500000 0 0.180000 0.583333 0 0.180000 0.666667 0 0.180000 0.750000 0 0.180000 0.833333 0 0.180000 0.916667 0 0.180000 1.000000 0 0.186667 0 0 0.186667 0.083333 0 0.186667 0.166667 0 0.186667 0.250000 0 0.186667 0.333333 0 0.186667 0.416667 0 0.186667 0.500000 0 0.186667 0.583333 0 0.186667 0.666667 0 0.186667 0.750000 0 0.186667 0.833333 0 0.186667 0.916667 0 0.186667 1.000000 0 0.193333 0 0 0.193333 0.083333 0 0.193333 0.166667 0 0.193333 0.250000 0 0.193333 0.333333 0 0.193333 0.416667 0 0.193333 0.500000 0 0.193333 0.583333 0 0.193333 0.666667 0 0.193333 0.750000 0 0.193333 0.833333 0 0.193333 0.916667 0 0.193333 1.000000 0 0.200000 0 0 0.200000 0.083333 0 0.200000 0.166667 0 0.200000 0.250000 0 0.200000 0.333333 0 0.200000 0.416667 0 0.200000 0.500000 0 0.200000 0.583333 0 0.200000 0.666667 0 0.200000 0.750000 0 0.200000 0.833333 0 0.200000 0.916667 0 0.200000 1.000000 0 0.206667 0 0 0.206667 0.083333 0 0.206667 0.166667 0 0.206667 0.250000 0 0.206667 0.333333 0 0.206667 0.416667 0 0.206667 0.500000 0 0.206667 0.583333 0 0.206667 0.666667 0 0.206667 0.750000 0 0.206667 0.833333 0 0.206667 0.916667 0 0.206667 1.000000 0 0.213333 0 0 0.213333 0.083333 0 0.213333 0.166667 0 0.213333 0.250000 0 0.213333 0.333333 0 0.213333 0.416667 0 0.213333 0.500000 0 0.213333 0.583333 0 0.213333 0.666667 0 0.213333 0.750000 0 0.213333 0.833333 0 0.213333 0.916667 0 0.213333 1.000000 0 0.220000 0 0 0.220000 0.083333 0 0.220000 0.166667 0 0.220000 0.250000 0 0.220000 0.333333 0 0.220000 0.416667 0 0.220000 0.500000 0 0.220000 0.583333 0 0.220000 0.666667 0 0.220000 0.750000 0 0.220000 0.833333 0 0.220000 0.916667 0 0.220000 1.000000 0 0.226667 0 0 0.226667 0.083333 0 0.226667 0.166667 0 0.226667 0.250000 0 0.226667 0.333333 0 0.226667 0.416667 0 0.226667 0.500000 0 0.226667 0.583333 0 0.226667 0.666667 0 0.226667 0.750000 0 0.226667 0.833333 0 0.226667 0.916667 0 0.226667 1.000000 0 0.233333 0 0 0.233333 0.083333 0 0.233333 0.166667 0 0.233333 0.250000 0 0.233333 0.333333 0 0.233333 0.416667 0 0.233333 0.500000 0 0.233333 0.583333 0 0.233333 0.666667 0 0.233333 0.750000 0 0.233333 0.833333 0 0.233333 0.916667 0 0.233333 1.000000 0 0.240000 0 0 0.240000 0.083333 0 0.240000 0.166667 0 0.240000 0.250000 0 0.240000 0.333333 0 0.240000 0.416667 0 0.240000 0.500000 0 0.240000 0.583333 0 0.240000 0.666667 0 0.240000 0.750000 0 0.240000 0.833333 0 0.240000 0.916667 0 0.240000 1.000000 0 0.246667 0 0 0.246667 0.083333 0 0.246667 0.166667 0 0.246667 0.250000 0 0.246667 0.333333 0 0.246667 0.416667 0 0.246667 0.500000 0 0.246667 0.583333 0 0.246667 0.666667 0 0.246667 0.750000 0 0.246667 0.833333 0 0.246667 0.916667 0 0.246667 1.000000 0 0.253333 0 0 0.253333 0.083333 0 0.253333 0.166667 0 0.253333 0.250000 0 0.253333 0.333333 0 0.253333 0.416667 0 0.253333 0.500000 0 0.253333 0.583333 0 0.253333 0.666667 0 0.253333 0.750000 0 0.253333 0.833333 0 0.253333 0.916667 0 0.253333 1.000000 0 0.260000 0 0 0.260000 0.083333 0 0.260000 0.166667 0 0.260000 0.250000 0 0.260000 0.333333 0 0.260000 0.416667 0 0.260000 0.500000 0 0.260000 0.583333 0 0.260000 0.666667 0 0.260000 0.750000 0 0.260000 0.833333 0 0.260000 0.916667 0 0.260000 1.000000 0 0.266667 0 0 0.266667 0.083333 0 0.266667 0.166667 0 0.266667 0.250000 0 0.266667 0.333333 0 0.266667 0.416667 0 0.266667 0.500000 0 0.266667 0.583333 0 0.266667 0.666667 0 0.266667 0.750000 0 0.266667 0.833333 0 0.266667 0.916667 0 0.266667 1.000000 0 0.273333 0 0 0.273333 0.083333 0 0.273333 0.166667 0 0.273333 0.250000 0 0.273333 0.333333 0 0.273333 0.416667 0 0.273333 0.500000 0 0.273333 0.583333 0 0.273333 0.666667 0 0.273333 0.750000 0 0.273333 0.833333 0 0.273333 0.916667 0 0.273333 1.000000 0 0.280000 0 0 0.280000 0.083333 0 0.280000 0.166667 0 0.280000 0.250000 0 0.280000 0.333333 0 0.280000 0.416667 0 0.280000 0.500000 0 0.280000 0.583333 0 0.280000 0.666667 0 0.280000 0.750000 0 0.280000 0.833333 0 0.280000 0.916667 0 0.280000 1.000000 0 0.286667 0 0 0.286667 0.083333 0 0.286667 0.166667 0 0.286667 0.250000 0 0.286667 0.333333 0 0.286667 0.416667 0 0.286667 0.500000 0 0.286667 0.583333 0 0.286667 0.666667 0 0.286667 0.750000 0 0.286667 0.833333 0 0.286667 0.916667 0 0.286667 1.000000 0 0.293333 0 0 0.293333 0.083333 0 0.293333 0.166667 0 0.293333 0.250000 0 0.293333 0.333333 0 0.293333 0.416667 0 0.293333 0.500000 0 0.293333 0.583333 0 0.293333 0.666667 0 0.293333 0.750000 0 0.293333 0.833333 0 0.293333 0.916667 0 0.293333 1.000000 0 0.300000 0 0 0.300000 0.083333 0 0.300000 0.166667 0 0.300000 0.250000 0 0.300000 0.333333 0 0.300000 0.416667 0 0.300000 0.500000 0 0.300000 0.583333 0 0.300000 0.666667 0 0.300000 0.750000 0 0.300000 0.833333 0 0.300000 0.916667 0 0.300000 1.000000 0 0.306667 0 0 0.306667 0.083333 0 0.306667 0.166667 0 0.306667 0.250000 0 0.306667 0.333333 0 0.306667 0.416667 0 0.306667 0.500000 0 0.306667 0.583333 0 0.306667 0.666667 0 0.306667 0.750000 0 0.306667 0.833333 0 0.306667 0.916667 0 0.306667 1.000000 0 0.313333 0 0 0.313333 0.083333 0 0.313333 0.166667 0 0.313333 0.250000 0 0.313333 0.333333 0 0.313333 0.416667 0 0.313333 0.500000 0 0.313333 0.583333 0 0.313333 0.666667 0 0.313333 0.750000 0 0.313333 0.833333 0 0.313333 0.916667 0 0.313333 1.000000 0 0.320000 0 0 0.320000 0.083333 0 0.320000 0.166667 0 0.320000 0.250000 0 0.320000 0.333333 0 0.320000 0.416667 0 0.320000 0.500000 0 0.320000 0.583333 0 0.320000 0.666667 0 0.320000 0.750000 0 0.320000 0.833333 0 0.320000 0.916667 0 0.320000 1.000000 0 0.326667 0 0 0.326667 0.083333 0 0.326667 0.166667 0 0.326667 0.250000 0 0.326667 0.333333 0 0.326667 0.416667 0 0.326667 0.500000 0 0.326667 0.583333 0 0.326667 0.666667 0 0.326667 0.750000 0 0.326667 0.833333 0 0.326667 0.916667 0 0.326667 1.000000 0 0.333333 0 0 0.333333 0.083333 0 0.333333 0.166667 0 0.333333 0.250000 0 0.333333 0.333333 0 0.333333 0.416667 0 0.333333 0.500000 0 0.333333 0.583333 0 0.333333 0.666667 0 0.333333 0.750000 0 0.333333 0.833333 0 0.333333 0.916667 0 0.333333 1.000000 0 0.340000 0 0 0.340000 0.083333 0 0.340000 0.166667 0 0.340000 0.250000 0 0.340000 0.333333 0 0.340000 0.416667 0 0.340000 0.500000 0 0.340000 0.583333 0 0.340000 0.666667 0 0.340000 0.750000 0 0.340000 0.833333 0 0.340000 0.916667 0 0.340000 1.000000 0 0.346667 0 0 0.346667 0.083333 0 0.346667 0.166667 0 0.346667 0.250000 0 0.346667 0.333333 0 0.346667 0.416667 0 0.346667 0.500000 0 0.346667 0.583333 0 0.346667 0.666667 0 0.346667 0.750000 0 0.346667 0.833333 0 0.346667 0.916667 0 0.346667 1.000000 0 0.353333 0 0 0.353333 0.083333 0 0.353333 0.166667 0 0.353333 0.250000 0 0.353333 0.333333 0 0.353333 0.416667 0 0.353333 0.500000 0 0.353333 0.583333 0 0.353333 0.666667 0 0.353333 0.750000 0 0.353333 0.833333 0 0.353333 0.916667 0 0.353333 1.000000 0 0.360000 0 0 0.360000 0.083333 0 0.360000 0.166667 0 0.360000 0.250000 0 0.360000 0.333333 0 0.360000 0.416667 0 0.360000 0.500000 0 0.360000 0.583333 0 0.360000 0.666667 0 0.360000 0.750000 0 0.360000 0.833333 0 0.360000 0.916667 0 0.360000 1.000000 0 0.366667 0 0 0.366667 0.083333 0 0.366667 0.166667 0 0.366667 0.250000 0 0.366667 0.333333 0 0.366667 0.416667 0 0.366667 0.500000 0 0.366667 0.583333 0 0.366667 0.666667 0 0.366667 0.750000 0 0.366667 0.833333 0 0.366667 0.916667 0 0.366667 1.000000 0 0.373333 0 0 0.373333 0.083333 0 0.373333 0.166667 0 0.373333 0.250000 0 0.373333 0.333333 0 0.373333 0.416667 0 0.373333 0.500000 0 0.373333 0.583333 0 0.373333 0.666667 0 0.373333 0.750000 0 0.373333 0.833333 0 0.373333 0.916667 0 0.373333 1.000000 0 0.380000 0 0 0.380000 0.083333 0 0.380000 0.166667 0 0.380000 0.250000 0 0.380000 0.333333 0 0.380000 0.416667 0 0.380000 0.500000 0 0.380000 0.583333 0 0.380000 0.666667 0 0.380000 0.750000 0 0.380000 0.833333 0 0.380000 0.916667 0 0.380000 1.000000 0 0.386667 0 0 0.386667 0.083333 0 0.386667 0.166667 0 0.386667 0.250000 0 0.386667 0.333333 0 0.386667 0.416667 0 0.386667 0.500000 0 0.386667 0.583333 0 0.386667 0.666667 0 0.386667 0.750000 0 0.386667 0.833333 0 0.386667 0.916667 0 0.386667 1.000000 0 0.393333 0 0 0.393333 0.083333 0 0.393333 0.166667 0 0.393333 0.250000 0 0.393333 0.333333 0 0.393333 0.416667 0 0.393333 0.500000 0 0.393333 0.583333 0 0.393333 0.666667 0 0.393333 0.750000 0 0.393333 0.833333 0 0.393333 0.916667 0 0.393333 1.000000 0 0.400000 0 0 0.400000 0.083333 0 0.400000 0.166667 0 0.400000 0.250000 0 0.400000 0.333333 0 0.400000 0.416667 0 0.400000 0.500000 0 0.400000 0.583333 0 0.400000 0.666667 0 0.400000 0.750000 0 0.400000 0.833333 0 0.400000 0.916667 0 0.400000 1.000000 0 0.406667 0 0 0.406667 0.083333 0 0.406667 0.166667 0 0.406667 0.250000 0 0.406667 0.333333 0 0.406667 0.416667 0 0.406667 0.500000 0 0.406667 0.583333 0 0.406667 0.666667 0 0.406667 0.750000 0 0.406667 0.833333 0 0.406667 0.916667 0 0.406667 1.000000 0 0.413333 0 0 0.413333 0.083333 0 0.413333 0.166667 0 0.413333 0.250000 0 0.413333 0.333333 0 0.413333 0.416667 0 0.413333 0.500000 0 0.413333 0.583333 0 0.413333 0.666667 0 0.413333 0.750000 0 0.413333 0.833333 0 0.413333 0.916667 0 0.413333 1.000000 0 0.420000 0 0 0.420000 0.083333 0 0.420000 0.166667 0 0.420000 0.250000 0 0.420000 0.333333 0 0.420000 0.416667 0 0.420000 0.500000 0 0.420000 0.583333 0 0.420000 0.666667 0 0.420000 0.750000 0 0.420000 0.833333 0 0.420000 0.916667 0 0.420000 1.000000 0 0.426667 0 0 0.426667 0.083333 0 0.426667 0.166667 0 0.426667 0.250000 0 0.426667 0.333333 0 0.426667 0.416667 0 0.426667 0.500000 0 0.426667 0.583333 0 0.426667 0.666667 0 0.426667 0.750000 0 0.426667 0.833333 0 0.426667 0.916667 0 0.426667 1.000000 0 0.433333 0 0 0.433333 0.083333 0 0.433333 0.166667 0 0.433333 0.250000 0 0.433333 0.333333 0 0.433333 0.416667 0 0.433333 0.500000 0 0.433333 0.583333 0 0.433333 0.666667 0 0.433333 0.750000 0 0.433333 0.833333 0 0.433333 0.916667 0 0.433333 1.000000 0 0.440000 0 0 0.440000 0.083333 0 0.440000 0.166667 0 0.440000 0.250000 0 0.440000 0.333333 0 0.440000 0.416667 0 0.440000 0.500000 0 0.440000 0.583333 0 0.440000 0.666667 0 0.440000 0.750000 0 0.440000 0.833333 0 0.440000 0.916667 0 0.440000 1.000000 0 0.446667 0 0 0.446667 0.083333 0 0.446667 0.166667 0 0.446667 0.250000 0 0.446667 0.333333 0 0.446667 0.416667 0 0.446667 0.500000 0 0.446667 0.583333 0 0.446667 0.666667 0 0.446667 0.750000 0 0.446667 0.833333 0 0.446667 0.916667 0 0.446667 1.000000 0 0.453334 0 0 0.453334 0.083333 0 0.453334 0.166667 0 0.453334 0.250000 0 0.453334 0.333333 0 0.453334 0.416667 0 0.453334 0.500000 0 0.453334 0.583333 0 0.453334 0.666667 0 0.453334 0.750000 0 0.453334 0.833333 0 0.453334 0.916667 0 0.453334 1.000000 0 0.460000 0 0 0.460000 0.083333 0 0.460000 0.166667 0 0.460000 0.250000 0 0.460000 0.333333 0 0.460000 0.416667 0 0.460000 0.500000 0 0.460000 0.583333 0 0.460000 0.666667 0 0.460000 0.750000 0 0.460000 0.833333 0 0.460000 0.916667 0 0.460000 1.000000 0 0.466667 0 0 0.466667 0.083333 0 0.466667 0.166667 0 0.466667 0.250000 0 0.466667 0.333333 0 0.466667 0.416667 0 0.466667 0.500000 0 0.466667 0.583333 0 0.466667 0.666667 0 0.466667 0.750000 0 0.466667 0.833333 0 0.466667 0.916667 0 0.466667 1.000000 0 0.473334 0 0 0.473334 0.083333 0 0.473334 0.166667 0 0.473334 0.250000 0 0.473334 0.333333 0 0.473334 0.416667 0 0.473334 0.500000 0 0.473334 0.583333 0 0.473334 0.666667 0 0.473334 0.750000 0 0.473334 0.833333 0 0.473334 0.916667 0 0.473334 1.000000 0 0.480000 0 0 0.480000 0.083333 0 0.480000 0.166667 0 0.480000 0.250000 0 0.480000 0.333333 0 0.480000 0.416667 0 0.480000 0.500000 0 0.480000 0.583333 0 0.480000 0.666667 0 0.480000 0.750000 0 0.480000 0.833333 0 0.480000 0.916667 0 0.480000 1.000000 0 0.486667 0 0 0.486667 0.083333 0 0.486667 0.166667 0 0.486667 0.250000 0 0.486667 0.333333 0 0.486667 0.416667 0 0.486667 0.500000 0 0.486667 0.583333 0 0.486667 0.666667 0 0.486667 0.750000 0 0.486667 0.833333 0 0.486667 0.916667 0 0.486667 1.000000 0 0.493334 0 0 0.493334 0.083333 0 0.493334 0.166667 0 0.493334 0.250000 0 0.493334 0.333333 0 0.493334 0.416667 0 0.493334 0.500000 0 0.493334 0.583333 0 0.493334 0.666667 0 0.493334 0.750000 0 0.493334 0.833333 0 0.493334 0.916667 0 0.493334 1.000000 0 0.500000 0 0 0.500000 0.083333 0 0.500000 0.166667 0 0.500000 0.250000 0 0.500000 0.333333 0 0.500000 0.416667 0 0.500000 0.500000 0 0.500000 0.583333 0 0.500000 0.666667 0 0.500000 0.750000 0 0.500000 0.833333 0 0.500000 0.916667 0 0.500000 1.000000 0 0.506667 0 0 0.506667 0.083333 0 0.506667 0.166667 0 0.506667 0.250000 0 0.506667 0.333333 0 0.506667 0.416667 0 0.506667 0.500000 0 0.506667 0.583333 0 0.506667 0.666667 0 0.506667 0.750000 0 0.506667 0.833333 0 0.506667 0.916667 0 0.506667 1.000000 0 0.513334 0 0 0.513334 0.083333 0 0.513334 0.166667 0 0.513334 0.250000 0 0.513334 0.333333 0 0.513334 0.416667 0 0.513334 0.500000 0 0.513334 0.583333 0 0.513334 0.666667 0 0.513334 0.750000 0 0.513334 0.833333 0 0.513334 0.916667 0 0.513334 1.000000 0 0.520000 0 0 0.520000 0.083333 0 0.520000 0.166667 0 0.520000 0.250000 0 0.520000 0.333333 0 0.520000 0.416667 0 0.520000 0.500000 0 0.520000 0.583333 0 0.520000 0.666667 0 0.520000 0.750000 0 0.520000 0.833333 0 0.520000 0.916667 0 0.520000 1.000000 0 0.526667 0 0 0.526667 0.083333 0 0.526667 0.166667 0 0.526667 0.250000 0 0.526667 0.333333 0 0.526667 0.416667 0 0.526667 0.500000 0 0.526667 0.583333 0 0.526667 0.666667 0 0.526667 0.750000 0 0.526667 0.833333 0 0.526667 0.916667 0 0.526667 1.000000 0 0.533334 0 0 0.533334 0.083333 0 0.533334 0.166667 0 0.533334 0.250000 0 0.533334 0.333333 0 0.533334 0.416667 0 0.533334 0.500000 0 0.533334 0.583333 0 0.533334 0.666667 0 0.533334 0.750000 0 0.533334 0.833333 0 0.533334 0.916667 0 0.533334 1.000000 0 0.540000 0 0 0.540000 0.083333 0 0.540000 0.166667 0 0.540000 0.250000 0 0.540000 0.333333 0 0.540000 0.416667 0 0.540000 0.500000 0 0.540000 0.583333 0 0.540000 0.666667 0 0.540000 0.750000 0 0.540000 0.833333 0 0.540000 0.916667 0 0.540000 1.000000 0 0.546667 0 0 0.546667 0.083333 0 0.546667 0.166667 0 0.546667 0.250000 0 0.546667 0.333333 0 0.546667 0.416667 0 0.546667 0.500000 0 0.546667 0.583333 0 0.546667 0.666667 0 0.546667 0.750000 0 0.546667 0.833333 0 0.546667 0.916667 0 0.546667 1.000000 0 0.553334 0 0 0.553334 0.083333 0 0.553334 0.166667 0 0.553334 0.250000 0 0.553334 0.333333 0 0.553334 0.416667 0 0.553334 0.500000 0 0.553334 0.583333 0 0.553334 0.666667 0 0.553334 0.750000 0 0.553334 0.833333 0 0.553334 0.916667 0 0.553334 1.000000 0 0.560000 0 0 0.560000 0.083333 0 0.560000 0.166667 0 0.560000 0.250000 0 0.560000 0.333333 0 0.560000 0.416667 0 0.560000 0.500000 0 0.560000 0.583333 0 0.560000 0.666667 0 0.560000 0.750000 0 0.560000 0.833333 0 0.560000 0.916667 0 0.560000 1.000000 0 0.566667 0 0 0.566667 0.083333 0 0.566667 0.166667 0 0.566667 0.250000 0 0.566667 0.333333 0 0.566667 0.416667 0 0.566667 0.500000 0 0.566667 0.583333 0 0.566667 0.666667 0 0.566667 0.750000 0 0.566667 0.833333 0 0.566667 0.916667 0 0.566667 1.000000 0 0.573334 0 0 0.573334 0.083333 0 0.573334 0.166667 0 0.573334 0.250000 0 0.573334 0.333333 0 0.573334 0.416667 0 0.573334 0.500000 0 0.573334 0.583333 0 0.573334 0.666667 0 0.573334 0.750000 0 0.573334 0.833333 0 0.573334 0.916667 0 0.573334 1.000000 0 0.580000 0 0 0.580000 0.083333 0 0.580000 0.166667 0 0.580000 0.250000 0 0.580000 0.333333 0 0.580000 0.416667 0 0.580000 0.500000 0 0.580000 0.583333 0 0.580000 0.666667 0 0.580000 0.750000 0 0.580000 0.833333 0 0.580000 0.916667 0 0.580000 1.000000 0 0.586667 0 0 0.586667 0.083333 0 0.586667 0.166667 0 0.586667 0.250000 0 0.586667 0.333333 0 0.586667 0.416667 0 0.586667 0.500000 0 0.586667 0.583333 0 0.586667 0.666667 0 0.586667 0.750000 0 0.586667 0.833333 0 0.586667 0.916667 0 0.586667 1.000000 0 0.593334 0 0 0.593334 0.083333 0 0.593334 0.166667 0 0.593334 0.250000 0 0.593334 0.333333 0 0.593334 0.416667 0 0.593334 0.500000 0 0.593334 0.583333 0 0.593334 0.666667 0 0.593334 0.750000 0 0.593334 0.833333 0 0.593334 0.916667 0 0.593334 1.000000 0 0.600001 0 0 0.600001 0.083333 0 0.600001 0.166667 0 0.600001 0.250000 0 0.600001 0.333333 0 0.600001 0.416667 0 0.600001 0.500000 0 0.600001 0.583333 0 0.600001 0.666667 0 0.600001 0.750000 0 0.600001 0.833333 0 0.600001 0.916667 0 0.600001 1.000000 0 0.606667 0 0 0.606667 0.083333 0 0.606667 0.166667 0 0.606667 0.250000 0 0.606667 0.333333 0 0.606667 0.416667 0 0.606667 0.500000 0 0.606667 0.583333 0 0.606667 0.666667 0 0.606667 0.750000 0 0.606667 0.833333 0 0.606667 0.916667 0 0.606667 1.000000 0 0.613334 0 0 0.613334 0.083333 0 0.613334 0.166667 0 0.613334 0.250000 0 0.613334 0.333333 0 0.613334 0.416667 0 0.613334 0.500000 0 0.613334 0.583333 0 0.613334 0.666667 0 0.613334 0.750000 0 0.613334 0.833333 0 0.613334 0.916667 0 0.613334 1.000000 0 0.620001 0 0 0.620001 0.083333 0 0.620001 0.166667 0 0.620001 0.250000 0 0.620001 0.333333 0 0.620001 0.416667 0 0.620001 0.500000 0 0.620001 0.583333 0 0.620001 0.666667 0 0.620001 0.750000 0 0.620001 0.833333 0 0.620001 0.916667 0 0.620001 1.000000 0 0.626667 0 0 0.626667 0.083333 0 0.626667 0.166667 0 0.626667 0.250000 0 0.626667 0.333333 0 0.626667 0.416667 0 0.626667 0.500000 0 0.626667 0.583333 0 0.626667 0.666667 0 0.626667 0.750000 0 0.626667 0.833333 0 0.626667 0.916667 0 0.626667 1.000000 0 0.633334 0 0 0.633334 0.083333 0 0.633334 0.166667 0 0.633334 0.250000 0 0.633334 0.333333 0 0.633334 0.416667 0 0.633334 0.500000 0 0.633334 0.583333 0 0.633334 0.666667 0 0.633334 0.750000 0 0.633334 0.833333 0 0.633334 0.916667 0 0.633334 1.000000 0 0.640001 0 0 0.640001 0.083333 0 0.640001 0.166667 0 0.640001 0.250000 0 0.640001 0.333333 0 0.640001 0.416667 0 0.640001 0.500000 0 0.640001 0.583333 0 0.640001 0.666667 0 0.640001 0.750000 0 0.640001 0.833333 0 0.640001 0.916667 0 0.640001 1.000000 0 0.646667 0 0 0.646667 0.083333 0 0.646667 0.166667 0 0.646667 0.250000 0 0.646667 0.333333 0 0.646667 0.416667 0 0.646667 0.500000 0 0.646667 0.583333 0 0.646667 0.666667 0 0.646667 0.750000 0 0.646667 0.833333 0 0.646667 0.916667 0 0.646667 1.000000 0 0.653334 0 0 0.653334 0.083333 0 0.653334 0.166667 0 0.653334 0.250000 0 0.653334 0.333333 0 0.653334 0.416667 0 0.653334 0.500000 0 0.653334 0.583333 0 0.653334 0.666667 0 0.653334 0.750000 0 0.653334 0.833333 0 0.653334 0.916667 0 0.653334 1.000000 0 0.660001 0 0 0.660001 0.083333 0 0.660001 0.166667 0 0.660001 0.250000 0 0.660001 0.333333 0 0.660001 0.416667 0 0.660001 0.500000 0 0.660001 0.583333 0 0.660001 0.666667 0 0.660001 0.750000 0 0.660001 0.833333 0 0.660001 0.916667 0 0.660001 1.000000 0 0.666667 0 0 0.666667 0.083333 0 0.666667 0.166667 0 0.666667 0.250000 0 0.666667 0.333333 0 0.666667 0.416667 0 0.666667 0.500000 0 0.666667 0.583333 0 0.666667 0.666667 0 0.666667 0.750000 0 0.666667 0.833333 0 0.666667 0.916667 0 0.666667 1.000000 0 0.673334 0 0 0.673334 0.083333 0 0.673334 0.166667 0 0.673334 0.250000 0 0.673334 0.333333 0 0.673334 0.416667 0 0.673334 0.500000 0 0.673334 0.583333 0 0.673334 0.666667 0 0.673334 0.750000 0 0.673334 0.833333 0 0.673334 0.916667 0 0.673334 1.000000 0 0.680000 0 0 0.680000 0.083333 0 0.680000 0.166667 0 0.680000 0.250000 0 0.680000 0.333333 0 0.680000 0.416667 0 0.680000 0.500000 0 0.680000 0.583333 0 0.680000 0.666667 0 0.680000 0.750000 0 0.680000 0.833333 0 0.680000 0.916667 0 0.680000 1.000000 0 0.686667 0 0 0.686667 0.083333 0 0.686667 0.166667 0 0.686667 0.250000 0 0.686667 0.333333 0 0.686667 0.416667 0 0.686667 0.500000 0 0.686667 0.583333 0 0.686667 0.666667 0 0.686667 0.750000 0 0.686667 0.833333 0 0.686667 0.916667 0 0.686667 1.000000 0 0.693334 0 0 0.693334 0.083333 0 0.693334 0.166667 0 0.693334 0.250000 0 0.693334 0.333333 0 0.693334 0.416667 0 0.693334 0.500000 0 0.693334 0.583333 0 0.693334 0.666667 0 0.693334 0.750000 0 0.693334 0.833333 0 0.693334 0.916667 0 0.693334 1.000000 0 0.700000 0 0 0.700000 0.083333 0 0.700000 0.166667 0 0.700000 0.250000 0 0.700000 0.333333 0 0.700000 0.416667 0 0.700000 0.500000 0 0.700000 0.583333 0 0.700000 0.666667 0 0.700000 0.750000 0 0.700000 0.833333 0 0.700000 0.916667 0 0.700000 1.000000 0 0.706667 0 0 0.706667 0.083333 0 0.706667 0.166667 0 0.706667 0.250000 0 0.706667 0.333333 0 0.706667 0.416667 0 0.706667 0.500000 0 0.706667 0.583333 0 0.706667 0.666667 0 0.706667 0.750000 0 0.706667 0.833333 0 0.706667 0.916667 0 0.706667 1.000000 0 0.713334 0 0 0.713334 0.083333 0 0.713334 0.166667 0 0.713334 0.250000 0 0.713334 0.333333 0 0.713334 0.416667 0 0.713334 0.500000 0 0.713334 0.583333 0 0.713334 0.666667 0 0.713334 0.750000 0 0.713334 0.833333 0 0.713334 0.916667 0 0.713334 1.000000 0 0.720000 0 0 0.720000 0.083333 0 0.720000 0.166667 0 0.720000 0.250000 0 0.720000 0.333333 0 0.720000 0.416667 0 0.720000 0.500000 0 0.720000 0.583333 0 0.720000 0.666667 0 0.720000 0.750000 0 0.720000 0.833333 0 0.720000 0.916667 0 0.720000 1.000000 0 0.726667 0 0 0.726667 0.083333 0 0.726667 0.166667 0 0.726667 0.250000 0 0.726667 0.333333 0 0.726667 0.416667 0 0.726667 0.500000 0 0.726667 0.583333 0 0.726667 0.666667 0 0.726667 0.750000 0 0.726667 0.833333 0 0.726667 0.916667 0 0.726667 1.000000 0 0.733334 0 0 0.733334 0.083333 0 0.733334 0.166667 0 0.733334 0.250000 0 0.733334 0.333333 0 0.733334 0.416667 0 0.733334 0.500000 0 0.733334 0.583333 0 0.733334 0.666667 0 0.733334 0.750000 0 0.733334 0.833333 0 0.733334 0.916667 0 0.733334 1.000000 0 0.740000 0 0 0.740000 0.083333 0 0.740000 0.166667 0 0.740000 0.250000 0 0.740000 0.333333 0 0.740000 0.416667 0 0.740000 0.500000 0 0.740000 0.583333 0 0.740000 0.666667 0 0.740000 0.750000 0 0.740000 0.833333 0 0.740000 0.916667 0 0.740000 1.000000 0 0.746667 0 0 0.746667 0.083333 0 0.746667 0.166667 0 0.746667 0.250000 0 0.746667 0.333333 0 0.746667 0.416667 0 0.746667 0.500000 0 0.746667 0.583333 0 0.746667 0.666667 0 0.746667 0.750000 0 0.746667 0.833333 0 0.746667 0.916667 0 0.746667 1.000000 0 0.753334 0 0 0.753334 0.083333 0 0.753334 0.166667 0 0.753334 0.250000 0 0.753334 0.333333 0 0.753334 0.416667 0 0.753334 0.500000 0 0.753334 0.583333 0 0.753334 0.666667 0 0.753334 0.750000 0 0.753334 0.833333 0 0.753334 0.916667 0 0.753334 1.000000 0 0.760000 0 0 0.760000 0.083333 0 0.760000 0.166667 0 0.760000 0.250000 0 0.760000 0.333333 0 0.760000 0.416667 0 0.760000 0.500000 0 0.760000 0.583333 0 0.760000 0.666667 0 0.760000 0.750000 0 0.760000 0.833333 0 0.760000 0.916667 0 0.760000 1.000000 0 0.766667 0 0 0.766667 0.083333 0 0.766667 0.166667 0 0.766667 0.250000 0 0.766667 0.333333 0 0.766667 0.416667 0 0.766667 0.500000 0 0.766667 0.583333 0 0.766667 0.666667 0 0.766667 0.750000 0 0.766667 0.833333 0 0.766667 0.916667 0 0.766667 1.000000 0 0.773333 0 0 0.773333 0.083333 0 0.773333 0.166667 0 0.773333 0.250000 0 0.773333 0.333333 0 0.773333 0.416667 0 0.773333 0.500000 0 0.773333 0.583333 0 0.773333 0.666667 0 0.773333 0.750000 0 0.773333 0.833333 0 0.773333 0.916667 0 0.773333 1.000000 0 0.780000 0 0 0.780000 0.083333 0 0.780000 0.166667 0 0.780000 0.250000 0 0.780000 0.333333 0 0.780000 0.416667 0 0.780000 0.500000 0 0.780000 0.583333 0 0.780000 0.666667 0 0.780000 0.750000 0 0.780000 0.833333 0 0.780000 0.916667 0 0.780000 1.000000 0 0.786667 0 0 0.786667 0.083333 0 0.786667 0.166667 0 0.786667 0.250000 0 0.786667 0.333333 0 0.786667 0.416667 0 0.786667 0.500000 0 0.786667 0.583333 0 0.786667 0.666667 0 0.786667 0.750000 0 0.786667 0.833333 0 0.786667 0.916667 0 0.786667 1.000000 0 0.793333 0 0 0.793333 0.083333 0 0.793333 0.166667 0 0.793333 0.250000 0 0.793333 0.333333 0 0.793333 0.416667 0 0.793333 0.500000 0 0.793333 0.583333 0 0.793333 0.666667 0 0.793333 0.750000 0 0.793333 0.833333 0 0.793333 0.916667 0 0.793333 1.000000 0 0.800000 0 0 0.800000 0.083333 0 0.800000 0.166667 0 0.800000 0.250000 0 0.800000 0.333333 0 0.800000 0.416667 0 0.800000 0.500000 0 0.800000 0.583333 0 0.800000 0.666667 0 0.800000 0.750000 0 0.800000 0.833333 0 0.800000 0.916667 0 0.800000 1.000000 0 0.806667 0 0 0.806667 0.083333 0 0.806667 0.166667 0 0.806667 0.250000 0 0.806667 0.333333 0 0.806667 0.416667 0 0.806667 0.500000 0 0.806667 0.583333 0 0.806667 0.666667 0 0.806667 0.750000 0 0.806667 0.833333 0 0.806667 0.916667 0 0.806667 1.000000 0 0.813333 0 0 0.813333 0.083333 0 0.813333 0.166667 0 0.813333 0.250000 0 0.813333 0.333333 0 0.813333 0.416667 0 0.813333 0.500000 0 0.813333 0.583333 0 0.813333 0.666667 0 0.813333 0.750000 0 0.813333 0.833333 0 0.813333 0.916667 0 0.813333 1.000000 0 0.820000 0 0 0.820000 0.083333 0 0.820000 0.166667 0 0.820000 0.250000 0 0.820000 0.333333 0 0.820000 0.416667 0 0.820000 0.500000 0 0.820000 0.583333 0 0.820000 0.666667 0 0.820000 0.750000 0 0.820000 0.833333 0 0.820000 0.916667 0 0.820000 1.000000 0 0.826667 0 0 0.826667 0.083333 0 0.826667 0.166667 0 0.826667 0.250000 0 0.826667 0.333333 0 0.826667 0.416667 0 0.826667 0.500000 0 0.826667 0.583333 0 0.826667 0.666667 0 0.826667 0.750000 0 0.826667 0.833333 0 0.826667 0.916667 0 0.826667 1.000000 0 0.833333 0 0 0.833333 0.083333 0 0.833333 0.166667 0 0.833333 0.250000 0 0.833333 0.333333 0 0.833333 0.416667 0 0.833333 0.500000 0 0.833333 0.583333 0 0.833333 0.666667 0 0.833333 0.750000 0 0.833333 0.833333 0 0.833333 0.916667 0 0.833333 1.000000 0 0.840000 0 0 0.840000 0.083333 0 0.840000 0.166667 0 0.840000 0.250000 0 0.840000 0.333333 0 0.840000 0.416667 0 0.840000 0.500000 0 0.840000 0.583333 0 0.840000 0.666667 0 0.840000 0.750000 0 0.840000 0.833333 0 0.840000 0.916667 0 0.840000 1.000000 0 0.846667 0 0 0.846667 0.083333 0 0.846667 0.166667 0 0.846667 0.250000 0 0.846667 0.333333 0 0.846667 0.416667 0 0.846667 0.500000 0 0.846667 0.583333 0 0.846667 0.666667 0 0.846667 0.750000 0 0.846667 0.833333 0 0.846667 0.916667 0 0.846667 1.000000 0 0.853333 0 0 0.853333 0.083333 0 0.853333 0.166667 0 0.853333 0.250000 0 0.853333 0.333333 0 0.853333 0.416667 0 0.853333 0.500000 0 0.853333 0.583333 0 0.853333 0.666667 0 0.853333 0.750000 0 0.853333 0.833333 0 0.853333 0.916667 0 0.853333 1.000000 0 0.860000 0 0 0.860000 0.083333 0 0.860000 0.166667 0 0.860000 0.250000 0 0.860000 0.333333 0 0.860000 0.416667 0 0.860000 0.500000 0 0.860000 0.583333 0 0.860000 0.666667 0 0.860000 0.750000 0 0.860000 0.833333 0 0.860000 0.916667 0 0.860000 1.000000 0 0.866666 0 0 0.866666 0.083333 0 0.866666 0.166667 0 0.866666 0.250000 0 0.866666 0.333333 0 0.866666 0.416667 0 0.866666 0.500000 0 0.866666 0.583333 0 0.866666 0.666667 0 0.866666 0.750000 0 0.866666 0.833333 0 0.866666 0.916667 0 0.866666 1.000000 0 0.873333 0 0 0.873333 0.083333 0 0.873333 0.166667 0 0.873333 0.250000 0 0.873333 0.333333 0 0.873333 0.416667 0 0.873333 0.500000 0 0.873333 0.583333 0 0.873333 0.666667 0 0.873333 0.750000 0 0.873333 0.833333 0 0.873333 0.916667 0 0.873333 1.000000 0 0.880000 0 0 0.880000 0.083333 0 0.880000 0.166667 0 0.880000 0.250000 0 0.880000 0.333333 0 0.880000 0.416667 0 0.880000 0.500000 0 0.880000 0.583333 0 0.880000 0.666667 0 0.880000 0.750000 0 0.880000 0.833333 0 0.880000 0.916667 0 0.880000 1.000000 0 0.886666 0 0 0.886666 0.083333 0 0.886666 0.166667 0 0.886666 0.250000 0 0.886666 0.333333 0 0.886666 0.416667 0 0.886666 0.500000 0 0.886666 0.583333 0 0.886666 0.666667 0 0.886666 0.750000 0 0.886666 0.833333 0 0.886666 0.916667 0 0.886666 1.000000 0 0.893333 0 0 0.893333 0.083333 0 0.893333 0.166667 0 0.893333 0.250000 0 0.893333 0.333333 0 0.893333 0.416667 0 0.893333 0.500000 0 0.893333 0.583333 0 0.893333 0.666667 0 0.893333 0.750000 0 0.893333 0.833333 0 0.893333 0.916667 0 0.893333 1.000000 0 0.900000 0 0 0.900000 0.083333 0 0.900000 0.166667 0 0.900000 0.250000 0 0.900000 0.333333 0 0.900000 0.416667 0 0.900000 0.500000 0 0.900000 0.583333 0 0.900000 0.666667 0 0.900000 0.750000 0 0.900000 0.833333 0 0.900000 0.916667 0 0.900000 1.000000 0 0.906666 0 0 0.906666 0.083333 0 0.906666 0.166667 0 0.906666 0.250000 0 0.906666 0.333333 0 0.906666 0.416667 0 0.906666 0.500000 0 0.906666 0.583333 0 0.906666 0.666667 0 0.906666 0.750000 0 0.906666 0.833333 0 0.906666 0.916667 0 0.906666 1.000000 0 0.913333 0 0 0.913333 0.083333 0 0.913333 0.166667 0 0.913333 0.250000 0 0.913333 0.333333 0 0.913333 0.416667 0 0.913333 0.500000 0 0.913333 0.583333 0 0.913333 0.666667 0 0.913333 0.750000 0 0.913333 0.833333 0 0.913333 0.916667 0 0.913333 1.000000 0 0.920000 0 0 0.920000 0.083333 0 0.920000 0.166667 0 0.920000 0.250000 0 0.920000 0.333333 0 0.920000 0.416667 0 0.920000 0.500000 0 0.920000 0.583333 0 0.920000 0.666667 0 0.920000 0.750000 0 0.920000 0.833333 0 0.920000 0.916667 0 0.920000 1.000000 0 0.926666 0 0 0.926666 0.083333 0 0.926666 0.166667 0 0.926666 0.250000 0 0.926666 0.333333 0 0.926666 0.416667 0 0.926666 0.500000 0 0.926666 0.583333 0 0.926666 0.666667 0 0.926666 0.750000 0 0.926666 0.833333 0 0.926666 0.916667 0 0.926666 1.000000 0 0.933333 0 0 0.933333 0.083333 0 0.933333 0.166667 0 0.933333 0.250000 0 0.933333 0.333333 0 0.933333 0.416667 0 0.933333 0.500000 0 0.933333 0.583333 0 0.933333 0.666667 0 0.933333 0.750000 0 0.933333 0.833333 0 0.933333 0.916667 0 0.933333 1.000000 0 0.940000 0 0 0.940000 0.083333 0 0.940000 0.166667 0 0.940000 0.250000 0 0.940000 0.333333 0 0.940000 0.416667 0 0.940000 0.500000 0 0.940000 0.583333 0 0.940000 0.666667 0 0.940000 0.750000 0 0.940000 0.833333 0 0.940000 0.916667 0 0.940000 1.000000 0 0.946666 0 0 0.946666 0.083333 0 0.946666 0.166667 0 0.946666 0.250000 0 0.946666 0.333333 0 0.946666 0.416667 0 0.946666 0.500000 0 0.946666 0.583333 0 0.946666 0.666667 0 0.946666 0.750000 0 0.946666 0.833333 0 0.946666 0.916667 0 0.946666 1.000000 0 0.953333 0 0 0.953333 0.083333 0 0.953333 0.166667 0 0.953333 0.250000 0 0.953333 0.333333 0 0.953333 0.416667 0 0.953333 0.500000 0 0.953333 0.583333 0 0.953333 0.666667 0 0.953333 0.750000 0 0.953333 0.833333 0 0.953333 0.916667 0 0.953333 1.000000 0 0.960000 0 0 0.960000 0.083333 0 0.960000 0.166667 0 0.960000 0.250000 0 0.960000 0.333333 0 0.960000 0.416667 0 0.960000 0.500000 0 0.960000 0.583333 0 0.960000 0.666667 0 0.960000 0.750000 0 0.960000 0.833333 0 0.960000 0.916667 0 0.960000 1.000000 0 0.966666 0 0 0.966666 0.083333 0 0.966666 0.166667 0 0.966666 0.250000 0 0.966666 0.333333 0 0.966666 0.416667 0 0.966666 0.500000 0 0.966666 0.583333 0 0.966666 0.666667 0 0.966666 0.750000 0 0.966666 0.833333 0 0.966666 0.916667 0 0.966666 1.000000 0 0.973333 0 0 0.973333 0.083333 0 0.973333 0.166667 0 0.973333 0.250000 0 0.973333 0.333333 0 0.973333 0.416667 0 0.973333 0.500000 0 0.973333 0.583333 0 0.973333 0.666667 0 0.973333 0.750000 0 0.973333 0.833333 0 0.973333 0.916667 0 0.973333 1.000000 0 0.979999 0 0 0.979999 0.083333 0 0.979999 0.166667 0 0.979999 0.250000 0 0.979999 0.333333 0 0.979999 0.416667 0 0.979999 0.500000 0 0.979999 0.583333 0 0.979999 0.666667 0 0.979999 0.750000 0 0.979999 0.833333 0 0.979999 0.916667 0 0.979999 1.000000 0 0.986666 0 0 0.986666 0.083333 0 0.986666 0.166667 0 0.986666 0.250000 0 0.986666 0.333333 0 0.986666 0.416667 0 0.986666 0.500000 0 0.986666 0.583333 0 0.986666 0.666667 0 0.986666 0.750000 0 0.986666 0.833333 0 0.986666 0.916667 0 0.986666 1.000000 0 0.993333 0 0 0.993333 0.083333 0 0.993333 0.166667 0 0.993333 0.250000 0 0.993333 0.333333 0 0.993333 0.416667 0 0.993333 0.500000 0 0.993333 0.583333 0 0.993333 0.666667 0 0.993333 0.750000 0 0.993333 0.833333 0 0.993333 0.916667 0 0.993333 1.000000 0 0.999999 0 0 0.999999 0.083333 0 0.999999 0.166667 0 0.999999 0.250000 0 0.999999 0.333333 0 0.999999 0.416667 0 0.999999 0.500000 0 0.999999 0.583333 0 0.999999 0.666667 0 0.999999 0.750000 0 0.999999 0.833333 0 0.999999 0.916667 0 0.999999 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="1963" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="3600">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 12 1 13 13 2 14 0 0 0 13 2 14 1 3 1 1 3 1 13 2 14 14 4 15 1 3 1 14 4 15 2 5 2 2 5 2 14 4 15 15 6 16 2 5 2 15 6 16 3 7 3 3 7 3 15 6 16 16 8 17 3 7 3 16 8 17 4 9 4 4 9 4 16 8 17 17 10 18 4 9 4 17 10 18 5 11 5 5 11 5 17 10 18 18 12 19 5 11 5 18 12 19 6 13 6 6 13 6 18 12 19 19 14 20 6 13 6 19 14 20 7 15 7 7 15 7 19 14 20 20 16 21 7 15 7 20 16 21 8 17 8 8 17 8 20 16 21 21 18 22 8 17 8 21 18 22 9 19 9 9 19 9 21 18 22 22 20 23 9 19 9 22 20 23 10 21 10 10 21 10 22 20 23 23 22 24 10 21 10 23 22 24 11 23 11 11 23 11 23 22 24 12 1 25 11 23 11 12 1 25 0 0 12 12 1 13 24 24 26 25 25 27 12 1 13 25 25 27 13 2 14 13 2 14 25 25 27 26 26 28 13 2 14 26 26 28 14 4 15 14 4 15 26 26 28 27 27 29 14 4 15 27 27 29 15 6 16 15 6 16 27 27 29 28 28 30 15 6 16 28 28 30 16 8 17 16 8 17 28 28 30 29 29 31 16 8 17 29 29 31 17 10 18 17 10 18 29 29 31 30 30 32 17 10 18 30 30 32 18 12 19 18 12 19 30 30 32 31 31 33 18 12 19 31 31 33 19 14 20 19 14 20 31 31 33 32 32 34 19 14 20 32 32 34 20 16 21 20 16 21 32 32 34 33 33 35 20 16 21 33 33 35 21 18 22 21 18 22 33 33 35 34 34 36 21 18 22 34 34 36 22 20 23 22 20 23 34 34 36 35 35 37 22 20 23 35 35 37 23 22 24 23 22 24 35 35 37 24 24 38 23 22 24 24 24 38 12 1 25 24 24 26 36 36 39 37 37 40 24 24 26 37 37 40 25 25 27 25 25 27 37 37 40 38 38 41 25 25 27 38 38 41 26 26 28 26 26 28 38 38 41 39 39 42 26 26 28 39 39 42 27 27 29 27 27 29 39 39 42 40 40 43 27 27 29 40 40 43 28 28 30 28 28 30 40 40 43 41 41 44 28 28 30 41 41 44 29 29 31 29 29 31 41 41 44 42 42 45 29 29 31 42 42 45 30 30 32 30 30 32 42 42 45 43 43 46 30 30 32 43 43 46 31 31 33 31 31 33 43 43 46 44 44 47 31 31 33 44 44 47 32 32 34 32 32 34 44 44 47 45 45 48 32 32 34 45 45 48 33 33 35 33 33 35 45 45 48 46 46 49 33 33 35 46 46 49 34 34 36 34 34 36 46 46 49 47 47 50 34 34 36 47 47 50 35 35 37 35 35 37 47 47 50 36 36 51 35 35 37 36 36 51 24 24 38 36 36 39 48 48 52 49 49 53 36 36 39 49 49 53 37 37 40 37 37 40 49 49 53 50 50 54 37 37 40 50 50 54 38 38 41 38 38 41 50 50 54 51 51 55 38 38 41 51 51 55 39 39 42 39 39 42 51 51 55 52 52 56 39 39 42 52 52 56 40 40 43 40 40 43 52 52 56 53 53 57 40 40 43 53 53 57 41 41 44 41 41 44 53 53 57 54 54 58 41 41 44 54 54 58 42 42 45 42 42 45 54 54 58 55 55 59 42 42 45 55 55 59 43 43 46 43 43 46 55 55 59 56 56 60 43 43 46 56 56 60 44 44 47 44 44 47 56 56 60 57 57 61 44 44 47 57 57 61 45 45 48 45 45 48 57 57 61 58 58 62 45 45 48 58 58 62 46 46 49 46 46 49 58 58 62 59 59 63 46 46 49 59 59 63 47 47 50 47 47 50 59 59 63 48 48 64 47 47 50 48 48 64 36 36 51 48 48 52 60 60 65 61 61 66 48 48 52 61 61 66 49 49 53 49 49 53 61 61 66 62 62 67 49 49 53 62 62 67 50 50 54 50 50 54 62 62 67 63 63 68 50 50 54 63 63 68 51 51 55 51 51 55 63 63 68 64 64 69 51 51 55 64 64 69 52 52 56 52 52 56 64 64 69 65 65 70 52 52 56 65 65 70 53 53 57 53 53 57 65 65 70 66 66 71 53 53 57 66 66 71 54 54 58 54 54 58 66 66 71 67 67 72 54 54 58 67 67 72 55 55 59 55 55 59 67 67 72 68 68 73 55 55 59 68 68 73 56 56 60 56 56 60 68 68 73 69 69 74 56 56 60 69 69 74 57 57 61 57 57 61 69 69 74 70 70 75 57 57 61 70 70 75 58 58 62 58 58 62 70 70 75 71 71 76 58 58 62 71 71 76 59 59 63 59 59 63 71 71 76 60 60 77 59 59 63 60 60 77 48 48 64 60 60 65 72 72 78 73 73 79 60 60 65 73 73 79 61 61 66 61 61 66 73 73 79 74 74 80 61 61 66 74 74 80 62 62 67 62 62 67 74 74 80 75 75 81 62 62 67 75 75 81 63 63 68 63 63 68 75 75 81 76 76 82 63 63 68 76 76 82 64 64 69 64 64 69 76 76 82 77 77 83 64 64 69 77 77 83 65 65 70 65 65 70 77 77 83 78 78 84 65 65 70 78 78 84 66 66 71 66 66 71 78 78 84 79 79 85 66 66 71 79 79 85 67 67 72 67 67 72 79 79 85 80 80 86 67 67 72 80 80 86 68 68 73 68 68 73 80 80 86 81 81 87 68 68 73 81 81 87 69 69 74 69 69 74 81 81 87 82 82 88 69 69 74 82 82 88 70 70 75 70 70 75 82 82 88 83 83 89 70 70 75 83 83 89 71 71 76 71 71 76 83 83 89 72 72 90 71 71 76 72 72 90 60 60 77 72 72 78 84 84 91 85 85 92 72 72 78 85 85 92 73 73 79 73 73 79 85 85 92 86 86 93 73 73 79 86 86 93 74 74 80 74 74 80 86 86 93 87 87 94 74 74 80 87 87 94 75 75 81 75 75 81 87 87 94 88 88 95 75 75 81 88 88 95 76 76 82 76 76 82 88 88 95 89 89 96 76 76 82 89 89 96 77 77 83 77 77 83 89 89 96 90 90 97 77 77 83 90 90 97 78 78 84 78 78 84 90 90 97 91 91 98 78 78 84 91 91 98 79 79 85 79 79 85 91 91 98 92 92 99 79 79 85 92 92 99 80 80 86 80 80 86 92 92 99 93 93 100 80 80 86 93 93 100 81 81 87 81 81 87 93 93 100 94 94 101 81 81 87 94 94 101 82 82 88 82 82 88 94 94 101 95 95 102 82 82 88 95 95 102 83 83 89 83 83 89 95 95 102 84 84 103 83 83 89 84 84 103 72 72 90 84 84 91 96 96 104 97 97 105 84 84 91 97 97 105 85 85 92 85 85 92 97 97 105 98 98 106 85 85 92 98 98 106 86 86 93 86 86 93 98 98 106 99 99 107 86 86 93 99 99 107 87 87 94 87 87 94 99 99 107 100 100 108 87 87 94 100 100 108 88 88 95 88 88 95 100 100 108 101 101 109 88 88 95 101 101 109 89 89 96 89 89 96 101 101 109 102 102 110 89 89 96 102 102 110 90 90 97 90 90 97 102 102 110 103 103 111 90 90 97 103 103 111 91 91 98 91 91 98 103 103 111 104 104 112 91 91 98 104 104 112 92 92 99 92 92 99 104 104 112 105 105 113 92 92 99 105 105 113 93 93 100 93 93 100 105 105 113 106 106 114 93 93 100 106 106 114 94 94 101 94 94 101 106 106 114 107 107 115 94 94 101 107 107 115 95 95 102 95 95 102 107 107 115 96 96 116 95 95 102 96 96 116 84 84 103 96 96 104 108 108 117 109 109 118 96 96 104 109 109 118 97 97 105 97 97 105 109 109 118 110 110 119 97 97 105 110 110 119 98 98 106 98 98 106 110 110 119 111 111 120 98 98 106 111 111 120 99 99 107 99 99 107 111 111 120 112 112 121 99 99 107 112 112 121 100 100 108 100 100 108 112 112 121 113 113 122 100 100 108 113 113 122 101 101 109 101 101 109 113 113 122 114 114 123 101 101 109 114 114 123 102 102 110 102 102 110 114 114 123 115 115 124 102 102 110 115 115 124 103 103 111 103 103 111 115 115 124 116 116 125 103 103 111 116 116 125 104 104 112 104 104 112 116 116 125 117 117 126 104 104 112 117 117 126 105 105 113 105 105 113 117 117 126 118 118 127 105 105 113 118 118 127 106 106 114 106 106 114 118 118 127 119 119 128 106 106 114 119 119 128 107 107 115 107 107 115 119 119 128 108 108 129 107 107 115 108 108 129 96 96 116 108 108 117 120 120 130 121 121 131 108 108 117 121 121 131 109 109 118 109 109 118 121 121 131 122 122 132 109 109 118 122 122 132 110 110 119 110 110 119 122 122 132 123 123 133 110 110 119 123 123 133 111 111 120 111 111 120 123 123 133 124 124 134 111 111 120 124 124 134 112 112 121 112 112 121 124 124 134 125 125 135 112 112 121 125 125 135 113 113 122 113 113 122 125 125 135 126 126 136 113 113 122 126 126 136 114 114 123 114 114 123 126 126 136 127 127 137 114 114 123 127 127 137 115 115 124 115 115 124 127 127 137 128 128 138 115 115 124 128 128 138 116 116 125 116 116 125 128 128 138 129 129 139 116 116 125 129 129 139 117 117 126 117 117 126 129 129 139 130 130 140 117 117 126 130 130 140 118 118 127 118 118 127 130 130 140 131 131 141 118 118 127 131 131 141 119 119 128 119 119 128 131 131 141 120 120 142 119 119 128 120 120 142 108 108 129 120 120 130 132 132 143 133 133 144 120 120 130 133 133 144 121 121 131 121 121 131 133 133 144 134 134 145 121 121 131 134 134 145 122 122 132 122 122 132 134 134 145 135 135 146 122 122 132 135 135 146 123 123 133 123 123 133 135 135 146 136 136 147 123 123 133 136 136 147 124 124 134 124 124 134 136 136 147 137 137 148 124 124 134 137 137 148 125 125 135 125 125 135 137 137 148 138 138 149 125 125 135 138 138 149 126 126 136 126 126 136 138 138 149 139 139 150 126 126 136 139 139 150 127 127 137 127 127 137 139 139 150 140 140 151 127 127 137 140 140 151 128 128 138 128 128 138 140 140 151 141 141 152 128 128 138 141 141 152 129 129 139 129 129 139 141 141 152 142 142 153 129 129 139 142 142 153 130 130 140 130 130 140 142 142 153 143 143 154 130 130 140 143 143 154 131 131 141 131 131 141 143 143 154 132 132 155 131 131 141 132 132 155 120 120 142 132 132 143 144 144 156 145 145 157 132 132 143 145 145 157 133 133 144 133 133 144 145 145 157 146 146 158 133 133 144 146 146 158 134 134 145 134 134 145 146 146 158 147 147 159 134 134 145 147 147 159 135 135 146 135 135 146 147 147 159 148 148 160 135 135 146 148 148 160 136 136 147 136 136 147 148 148 160 149 149 161 136 136 147 149 149 161 137 137 148 137 137 148 149 149 161 150 150 162 137 137 148 150 150 162 138 138 149 138 138 149 150 150 162 151 151 163 138 138 149 151 151 163 139 139 150 139 139 150 151 151 163 152 152 164 139 139 150 152 152 164 140 140 151 140 140 151 152 152 164 153 153 165 140 140 151 153 153 165 141 141 152 141 141 152 153 153 165 154 154 166 141 141 152 154 154 166 142 142 153 142 142 153 154 154 166 155 155 167 142 142 153 155 155 167 143 143 154 143 143 154 155 155 167 144 144 168 143 143 154 144 144 168 132 132 155 144 144 156 156 156 169 157 157 170 144 144 156 157 157 170 145 145 157 145 145 157 157 157 170 158 158 171 145 145 157 158 158 171 146 146 158 146 146 158 158 158 171 159 159 172 146 146 158 159 159 172 147 147 159 147 147 159 159 159 172 160 160 173 147 147 159 160 160 173 148 148 160 148 148 160 160 160 173 161 161 174 148 148 160 161 161 174 149 149 161 149 149 161 161 161 174 162 162 175 149 149 161 162 162 175 150 150 162 150 150 162 162 162 175 163 163 176 150 150 162 163 163 176 151 151 163 151 151 163 163 163 176 164 164 177 151 151 163 164 164 177 152 152 164 152 152 164 164 164 177 165 165 178 152 152 164 165 165 178 153 153 165 153 153 165 165 165 178 166 166 179 153 153 165 166 166 179 154 154 166 154 154 166 166 166 179 167 167 180 154 154 166 167 167 180 155 155 167 155 155 167 167 167 180 156 156 181 155 155 167 156 156 181 144 144 168 156 156 169 168 168 182 169 169 183 156 156 169 169 169 183 157 157 170 157 157 170 169 169 183 170 170 184 157 157 170 170 170 184 158 158 171 158 158 171 170 170 184 171 171 185 158 158 171 171 171 185 159 159 172 159 159 172 171 171 185 172 172 186 159 159 172 172 172 186 160 160 173 160 160 173 172 172 186 173 173 187 160 160 173 173 173 187 161 161 174 161 161 174 173 173 187 174 174 188 161 161 174 174 174 188 162 162 175 162 162 175 174 174 188 175 175 189 162 162 175 175 175 189 163 163 176 163 163 176 175 175 189 176 176 190 163 163 176 176 176 190 164 164 177 164 164 177 176 176 190 177 177 191 164 164 177 177 177 191 165 165 178 165 165 178 177 177 191 178 178 192 165 165 178 178 178 192 166 166 179 166 166 179 178 178 192 179 179 193 166 166 179 179 179 193 167 167 180 167 167 180 179 179 193 168 168 194 167 167 180 168 168 194 156 156 181 168 168 182 180 180 195 181 181 196 168 168 182 181 181 196 169 169 183 169 169 183 181 181 196 182 182 197 169 169 183 182 182 197 170 170 184 170 170 184 182 182 197 183 183 198 170 170 184 183 183 198 171 171 185 171 171 185 183 183 198 184 184 199 171 171 185 184 184 199 172 172 186 172 172 186 184 184 199 185 185 200 172 172 186 185 185 200 173 173 187 173 173 187 185 185 200 186 186 201 173 173 187 186 186 201 174 174 188 174 174 188 186 186 201 187 187 202 174 174 188 187 187 202 175 175 189 175 175 189 187 187 202 188 188 203 175 175 189 188 188 203 176 176 190 176 176 190 188 188 203 189 189 204 176 176 190 189 189 204 177 177 191 177 177 191 189 189 204 190 190 205 177 177 191 190 190 205 178 178 192 178 178 192 190 190 205 191 191 206 178 178 192 191 191 206 179 179 193 179 179 193 191 191 206 180 180 207 179 179 193 180 180 207 168 168 194 180 180 195 192 192 208 193 193 209 180 180 195 193 193 209 181 181 196 181 181 196 193 193 209 194 194 210 181 181 196 194 194 210 182 182 197 182 182 197 194 194 210 195 195 211 182 182 197 195 195 211 183 183 198 183 183 198 195 195 211 196 196 212 183 183 198 196 196 212 184 184 199 184 184 199 196 196 212 197 197 213 184 184 199 197 197 213 185 185 200 185 185 200 197 197 213 198 198 214 185 185 200 198 198 214 186 186 201 186 186 201 198 198 214 199 199 215 186 186 201 199 199 215 187 187 202 187 187 202 199 199 215 200 200 216 187 187 202 200 200 216 188 188 203 188 188 203 200 200 216 201 201 217 188 188 203 201 201 217 189 189 204 189 189 204 201 201 217 202 202 218 189 189 204 202 202 218 190 190 205 190 190 205 202 202 218 203 203 219 190 190 205 203 203 219 191 191 206 191 191 206 203 203 219 192 192 220 191 191 206 192 192 220 180 180 207 192 192 208 204 204 221 205 205 222 192 192 208 205 205 222 193 193 209 193 193 209 205 205 222 206 206 223 193 193 209 206 206 223 194 194 210 194 194 210 206 206 223 207 207 224 194 194 210 207 207 224 195 195 211 195 195 211 207 207 224 208 208 225 195 195 211 208 208 225 196 196 212 196 196 212 208 208 225 209 209 226 196 196 212 209 209 226 197 197 213 197 197 213 209 209 226 210 210 227 197 197 213 210 210 227 198 198 214 198 198 214 210 210 227 211 211 228 198 198 214 211 211 228 199 199 215 199 199 215 211 211 228 212 212 229 199 199 215 212 212 229 200 200 216 200 200 216 212 212 229 213 213 230 200 200 216 213 213 230 201 201 217 201 201 217 213 213 230 214 214 231 201 201 217 214 214 231 202 202 218 202 202 218 214 214 231 215 215 232 202 202 218 215 215 232 203 203 219 203 203 219 215 215 232 204 204 233 203 203 219 204 204 233 192 192 220 204 204 221 216 216 234 217 217 235 204 204 221 217 217 235 205 205 222 205 205 222 217 217 235 218 218 236 205 205 222 218 218 236 206 206 223 206 206 223 218 218 236 219 219 237 206 206 223 219 219 237 207 207 224 207 207 224 219 219 237 220 220 238 207 207 224 220 220 238 208 208 225 208 208 225 220 220 238 221 221 239 208 208 225 221 221 239 209 209 226 209 209 226 221 221 239 222 222 240 209 209 226 222 222 240 210 210 227 210 210 227 222 222 240 223 223 241 210 210 227 223 223 241 211 211 228 211 211 228 223 223 241 224 224 242 211 211 228 224 224 242 212 212 229 212 212 229 224 224 242 225 225 243 212 212 229 225 225 243 213 213 230 213 213 230 225 225 243 226 226 244 213 213 230 226 226 244 214 214 231 214 214 231 226 226 244 227 227 245 214 214 231 227 227 245 215 215 232 215 215 232 227 227 245 216 216 246 215 215 232 216 216 246 204 204 233 216 216 234 228 228 247 229 229 248 216 216 234 229 229 248 217 217 235 217 217 235 229 229 248 230 230 249 217 217 235 230 230 249 218 218 236 218 218 236 230 230 249 231 231 250 218 218 236 231 231 250 219 219 237 219 219 237 231 231 250 232 232 251 219 219 237 232 232 251 220 220 238 220 220 238 232 232 251 233 233 252 220 220 238 233 233 252 221 221 239 221 221 239 233 233 252 234 234 253 221 221 239 234 234 253 222 222 240 222 222 240 234 234 253 235 235 254 222 222 240 235 235 254 223 223 241 223 223 241 235 235 254 236 236 255 223 223 241 236 236 255 224 224 242 224 224 242 236 236 255 237 237 256 224 224 242 237 237 256 225 225 243 225 225 243 237 237 256 238 238 257 225 225 243 238 238 257 226 226 244 226 226 244 238 238 257 239 239 258 226 226 244 239 239 258 227 227 245 227 227 245 239 239 258 228 228 259 227 227 245 228 228 259 216 216 246 228 228 247 240 240 260 241 241 261 228 228 247 241 241 261 229 229 248 229 229 248 241 241 261 242 242 262 229 229 248 242 242 262 230 230 249 230 230 249 242 242 262 243 243 263 230 230 249 243 243 263 231 231 250 231 231 250 243 243 263 244 244 264 231 231 250 244 244 264 232 232 251 232 232 251 244 244 264 245 245 265 232 232 251 245 245 265 233 233 252 233 233 252 245 245 265 246 246 266 233 233 252 246 246 266 234 234 253 234 234 253 246 246 266 247 247 267 234 234 253 247 247 267 235 235 254 235 235 254 247 247 267 248 248 268 235 235 254 248 248 268 236 236 255 236 236 255 248 248 268 249 249 269 236 236 255 249 249 269 237 237 256 237 237 256 249 249 269 250 250 270 237 237 256 250 250 270 238 238 257 238 238 257 250 250 270 251 251 271 238 238 257 251 251 271 239 239 258 239 239 258 251 251 271 240 240 272 239 239 258 240 240 272 228 228 259 240 240 260 252 252 273 253 253 274 240 240 260 253 253 274 241 241 261 241 241 261 253 253 274 254 254 275 241 241 261 254 254 275 242 242 262 242 242 262 254 254 275 255 255 276 242 242 262 255 255 276 243 243 263 243 243 263 255 255 276 256 256 277 243 243 263 256 256 277 244 244 264 244 244 264 256 256 277 257 257 278 244 244 264 257 257 278 245 245 265 245 245 265 257 257 278 258 258 279 245 245 265 258 258 279 246 246 266 246 246 266 258 258 279 259 259 280 246 246 266 259 259 280 247 247 267 247 247 267 259 259 280 260 260 281 247 247 267 260 260 281 248 248 268 248 248 268 260 260 281 261 261 282 248 248 268 261 261 282 249 249 269 249 249 269 261 261 282 262 262 283 249 249 269 262 262 283 250 250 270 250 250 270 262 262 283 263 263 284 250 250 270 263 263 284 251 251 271 251 251 271 263 263 284 252 252 285 251 251 271 252 252 285 240 240 272 252 252 273 264 264 286 265 265 287 252 252 273 265 265 287 253 253 274 253 253 274 265 265 287 266 266 288 253 253 274 266 266 288 254 254 275 254 254 275 266 266 288 267 267 289 254 254 275 267 267 289 255 255 276 255 255 276 267 267 289 268 268 290 255 255 276 268 268 290 256 256 277 256 256 277 268 268 290 269 269 291 256 256 277 269 269 291 257 257 278 257 257 278 269 269 291 270 270 292 257 257 278 270 270 292 258 258 279 258 258 279 270 270 292 271 271 293 258 258 279 271 271 293 259 259 280 259 259 280 271 271 293 272 272 294 259 259 280 272 272 294 260 260 281 260 260 281 272 272 294 273 273 295 260 260 281 273 273 295 261 261 282 261 261 282 273 273 295 274 274 296 261 261 282 274 274 296 262 262 283 262 262 283 274 274 296 275 275 297 262 262 283 275 275 297 263 263 284 263 263 284 275 275 297 264 264 298 263 263 284 264 264 298 252 252 285 264 264 286 276 276 299 277 277 300 264 264 286 277 277 300 265 265 287 265 265 287 277 277 300 278 278 301 265 265 287 278 278 301 266 266 288 266 266 288 278 278 301 279 279 302 266 266 288 279 279 302 267 267 289 267 267 289 279 279 302 280 280 303 267 267 289 280 280 303 268 268 290 268 268 290 280 280 303 281 281 304 268 268 290 281 281 304 269 269 291 269 269 291 281 281 304 282 282 305 269 269 291 282 282 305 270 270 292 270 270 292 282 282 305 283 283 306 270 270 292 283 283 306 271 271 293 271 271 293 283 283 306 284 284 307 271 271 293 284 284 307 272 272 294 272 272 294 284 284 307 285 285 308 272 272 294 285 285 308 273 273 295 273 273 295 285 285 308 286 286 309 273 273 295 286 286 309 274 274 296 274 274 296 286 286 309 287 287 310 274 274 296 287 287 310 275 275 297 275 275 297 287 287 310 276 276 311 275 275 297 276 276 311 264 264 298 276 276 299 288 288 312 289 289 313 276 276 299 289 289 313 277 277 300 277 277 300 289 289 313 290 290 314 277 277 300 290 290 314 278 278 301 278 278 301 290 290 314 291 291 315 278 278 301 291 291 315 279 279 302 279 279 302 291 291 315 292 292 316 279 279 302 292 292 316 280 280 303 280 280 303 292 292 316 293 293 317 280 280 303 293 293 317 281 281 304 281 281 304 293 293 317 294 294 318 281 281 304 294 294 318 282 282 305 282 282 305 294 294 318 295 295 319 282 282 305 295 295 319 283 283 306 283 283 306 295 295 319 296 296 320 283 283 306 296 296 320 284 284 307 284 284 307 296 296 320 297 297 321 284 284 307 297 297 321 285 285 308 285 285 308 297 297 321 298 298 322 285 285 308 298 298 322 286 286 309 286 286 309 298 298 322 299 299 323 286 286 309 299 299 323 287 287 310 287 287 310 299 299 323 288 288 324 287 287 310 288 288 324 276 276 311 288 288 312 300 300 325 301 301 326 288 288 312 301 301 326 289 289 313 289 289 313 301 301 326 302 302 327 289 289 313 302 302 327 290 290 314 290 290 314 302 302 327 303 303 328 290 290 314 303 303 328 291 291 315 291 291 315 303 303 328 304 304 329 291 291 315 304 304 329 292 292 316 292 292 316 304 304 329 305 305 330 292 292 316 305 305 330 293 293 317 293 293 317 305 305 330 306 306 331 293 293 317 306 306 331 294 294 318 294 294 318 306 306 331 307 307 332 294 294 318 307 307 332 295 295 319 295 295 319 307 307 332 308 308 333 295 295 319 308 308 333 296 296 320 296 296 320 308 308 333 309 309 334 296 296 320 309 309 334 297 297 321 297 297 321 309 309 334 310 310 335 297 297 321 310 310 335 298 298 322 298 298 322 310 310 335 311 311 336 298 298 322 311 311 336 299 299 323 299 299 323 311 311 336 300 300 337 299 299 323 300 300 337 288 288 324 300 300 325 312 312 338 313 313 339 300 300 325 313 313 339 301 301 326 301 301 326 313 313 339 314 314 340 301 301 326 314 314 340 302 302 327 302 302 327 314 314 340 315 315 341 302 302 327 315 315 341 303 303 328 303 303 328 315 315 341 316 316 342 303 303 328 316 316 342 304 304 329 304 304 329 316 316 342 317 317 343 304 304 329 317 317 343 305 305 330 305 305 330 317 317 343 318 318 344 305 305 330 318 318 344 306 306 331 306 306 331 318 318 344 319 319 345 306 306 331 319 319 345 307 307 332 307 307 332 319 319 345 320 320 346 307 307 332 320 320 346 308 308 333 308 308 333 320 320 346 321 321 347 308 308 333 321 321 347 309 309 334 309 309 334 321 321 347 322 322 348 309 309 334 322 322 348 310 310 335 310 310 335 322 322 348 323 323 349 310 310 335 323 323 349 311 311 336 311 311 336 323 323 349 312 312 350 311 311 336 312 312 350 300 300 337 312 312 338 324 324 351 325 325 352 312 312 338 325 325 352 313 313 339 313 313 339 325 325 352 326 326 353 313 313 339 326 326 353 314 314 340 314 314 340 326 326 353 327 327 354 314 314 340 327 327 354 315 315 341 315 315 341 327 327 354 328 328 355 315 315 341 328 328 355 316 316 342 316 316 342 328 328 355 329 329 356 316 316 342 329 329 356 317 317 343 317 317 343 329 329 356 330 330 357 317 317 343 330 330 357 318 318 344 318 318 344 330 330 357 331 331 358 318 318 344 331 331 358 319 319 345 319 319 345 331 331 358 332 332 359 319 319 345 332 332 359 320 320 346 320 320 346 332 332 359 333 333 360 320 320 346 333 333 360 321 321 347 321 321 347 333 333 360 334 334 361 321 321 347 334 334 361 322 322 348 322 322 348 334 334 361 335 335 362 322 322 348 335 335 362 323 323 349 323 323 349 335 335 362 324 324 363 323 323 349 324 324 363 312 312 350 324 324 351 336 336 364 337 337 365 324 324 351 337 337 365 325 325 352 325 325 352 337 337 365 338 338 366 325 325 352 338 338 366 326 326 353 326 326 353 338 338 366 339 339 367 326 326 353 339 339 367 327 327 354 327 327 354 339 339 367 340 340 368 327 327 354 340 340 368 328 328 355 328 328 355 340 340 368 341 341 369 328 328 355 341 341 369 329 329 356 329 329 356 341 341 369 342 342 370 329 329 356 342 342 370 330 330 357 330 330 357 342 342 370 343 343 371 330 330 357 343 343 371 331 331 358 331 331 358 343 343 371 344 344 372 331 331 358 344 344 372 332 332 359 332 332 359 344 344 372 345 345 373 332 332 359 345 345 373 333 333 360 333 333 360 345 345 373 346 346 374 333 333 360 346 346 374 334 334 361 334 334 361 346 346 374 347 347 375 334 334 361 347 347 375 335 335 362 335 335 362 347 347 375 336 336 376 335 335 362 336 336 376 324 324 363 336 336 364 348 348 377 349 349 378 336 336 364 349 349 378 337 337 365 337 337 365 349 349 378 350 350 379 337 337 365 350 350 379 338 338 366 338 338 366 350 350 379 351 351 380 338 338 366 351 351 380 339 339 367 339 339 367 351 351 380 352 352 381 339 339 367 352 352 381 340 340 368 340 340 368 352 352 381 353 353 382 340 340 368 353 353 382 341 341 369 341 341 369 353 353 382 354 354 383 341 341 369 354 354 383 342 342 370 342 342 370 354 354 383 355 355 384 342 342 370 355 355 384 343 343 371 343 343 371 355 355 384 356 356 385 343 343 371 356 356 385 344 344 372 344 344 372 356 356 385 357 357 386 344 344 372 357 357 386 345 345 373 345 345 373 357 357 386 358 358 387 345 345 373 358 358 387 346 346 374 346 346 374 358 358 387 359 359 388 346 346 374 359 359 388 347 347 375 347 347 375 359 359 388 348 348 389 347 347 375 348 348 389 336 336 376 348 348 377 360 360 390 361 361 391 348 348 377 361 361 391 349 349 378 349 349 378 361 361 391 362 362 392 349 349 378 362 362 392 350 350 379 350 350 379 362 362 392 363 363 393 350 350 379 363 363 393 351 351 380 351 351 380 363 363 393 364 364 394 351 351 380 364 364 394 352 352 381 352 352 381 364 364 394 365 365 395 352 352 381 365 365 395 353 353 382 353 353 382 365 365 395 366 366 396 353 353 382 366 366 396 354 354 383 354 354 383 366 366 396 367 367 397 354 354 383 367 367 397 355 355 384 355 355 384 367 367 397 368 368 398 355 355 384 368 368 398 356 356 385 356 356 385 368 368 398 369 369 399 356 356 385 369 369 399 357 357 386 357 357 386 369 369 399 370 370 400 357 357 386 370 370 400 358 358 387 358 358 387 370 370 400 371 371 401 358 358 387 371 371 401 359 359 388 359 359 388 371 371 401 360 360 402 359 359 388 360 360 402 348 348 389 360 360 390 372 372 403 373 373 404 360 360 390 373 373 404 361 361 391 361 361 391 373 373 404 374 374 405 361 361 391 374 374 405 362 362 392 362 362 392 374 374 405 375 375 406 362 362 392 375 375 406 363 363 393 363 363 393 375 375 406 376 376 407 363 363 393 376 376 407 364 364 394 364 364 394 376 376 407 377 377 408 364 364 394 377 377 408 365 365 395 365 365 395 377 377 408 378 378 409 365 365 395 378 378 409 366 366 396 366 366 396 378 378 409 379 379 410 366 366 396 379 379 410 367 367 397 367 367 397 379 379 410 380 380 411 367 367 397 380 380 411 368 368 398 368 368 398 380 380 411 381 381 412 368 368 398 381 381 412 369 369 399 369 369 399 381 381 412 382 382 413 369 369 399 382 382 413 370 370 400 370 370 400 382 382 413 383 383 414 370 370 400 383 383 414 371 371 401 371 371 401 383 383 414 372 372 415 371 371 401 372 372 415 360 360 402 372 372 403 384 384 416 385 385 417 372 372 403 385 385 417 373 373 404 373 373 404 385 385 417 386 386 418 373 373 404 386 386 418 374 374 405 374 374 405 386 386 418 387 387 419 374 374 405 387 387 419 375 375 406 375 375 406 387 387 419 388 388 420 375 375 406 388 388 420 376 376 407 376 376 407 388 388 420 389 389 421 376 376 407 389 389 421 377 377 408 377 377 408 389 389 421 390 390 422 377 377 408 390 390 422 378 378 409 378 378 409 390 390 422 391 391 423 378 378 409 391 391 423 379 379 410 379 379 410 391 391 423 392 392 424 379 379 410 392 392 424 380 380 411 380 380 411 392 392 424 393 393 425 380 380 411 393 393 425 381 381 412 381 381 412 393 393 425 394 394 426 381 381 412 394 394 426 382 382 413 382 382 413 394 394 426 395 395 427 382 382 413 395 395 427 383 383 414 383 383 414 395 395 427 384 384 428 383 383 414 384 384 428 372 372 415 384 384 416 396 396 429 397 397 430 384 384 416 397 397 430 385 385 417 385 385 417 397 397 430 398 398 431 385 385 417 398 398 431 386 386 418 386 386 418 398 398 431 399 399 432 386 386 418 399 399 432 387 387 419 387 387 419 399 399 432 400 400 433 387 387 419 400 400 433 388 388 420 388 388 420 400 400 433 401 401 434 388 388 420 401 401 434 389 389 421 389 389 421 401 401 434 402 402 435 389 389 421 402 402 435 390 390 422 390 390 422 402 402 435 403 403 436 390 390 422 403 403 436 391 391 423 391 391 423 403 403 436 404 404 437 391 391 423 404 404 437 392 392 424 392 392 424 404 404 437 405 405 438 392 392 424 405 405 438 393 393 425 393 393 425 405 405 438 406 406 439 393 393 425 406 406 439 394 394 426 394 394 426 406 406 439 407 407 440 394 394 426 407 407 440 395 395 427 395 395 427 407 407 440 396 396 441 395 395 427 396 396 441 384 384 428 396 396 429 408 408 442 409 409 443 396 396 429 409 409 443 397 397 430 397 397 430 409 409 443 410 410 444 397 397 430 410 410 444 398 398 431 398 398 431 410 410 444 411 411 445 398 398 431 411 411 445 399 399 432 399 399 432 411 411 445 412 412 446 399 399 432 412 412 446 400 400 433 400 400 433 412 412 446 413 413 447 400 400 433 413 413 447 401 401 434 401 401 434 413 413 447 414 414 448 401 401 434 414 414 448 402 402 435 402 402 435 414 414 448 415 415 449 402 402 435 415 415 449 403 403 436 403 403 436 415 415 449 416 416 450 403 403 436 416 416 450 404 404 437 404 404 437 416 416 450 417 417 451 404 404 437 417 417 451 405 405 438 405 405 438 417 417 451 418 418 452 405 405 438 418 418 452 406 406 439 406 406 439 418 418 452 419 419 453 406 406 439 419 419 453 407 407 440 407 407 440 419 419 453 408 408 454 407 407 440 408 408 454 396 396 441 408 408 442 420 420 455 421 421 456 408 408 442 421 421 456 409 409 443 409 409 443 421 421 456 422 422 457 409 409 443 422 422 457 410 410 444 410 410 444 422 422 457 423 423 458 410 410 444 423 423 458 411 411 445 411 411 445 423 423 458 424 424 459 411 411 445 424 424 459 412 412 446 412 412 446 424 424 459 425 425 460 412 412 446 425 425 460 413 413 447 413 413 447 425 425 460 426 426 461 413 413 447 426 426 461 414 414 448 414 414 448 426 426 461 427 427 462 414 414 448 427 427 462 415 415 449 415 415 449 427 427 462 428 428 463 415 415 449 428 428 463 416 416 450 416 416 450 428 428 463 429 429 464 416 416 450 429 429 464 417 417 451 417 417 451 429 429 464 430 430 465 417 417 451 430 430 465 418 418 452 418 418 452 430 430 465 431 431 466 418 418 452 431 431 466 419 419 453 419 419 453 431 431 466 420 420 467 419 419 453 420 420 467 408 408 454 420 420 455 432 432 468 433 433 469 420 420 455 433 433 469 421 421 456 421 421 456 433 433 469 434 434 470 421 421 456 434 434 470 422 422 457 422 422 457 434 434 470 435 435 471 422 422 457 435 435 471 423 423 458 423 423 458 435 435 471 436 436 472 423 423 458 436 436 472 424 424 459 424 424 459 436 436 472 437 437 473 424 424 459 437 437 473 425 425 460 425 425 460 437 437 473 438 438 474 425 425 460 438 438 474 426 426 461 426 426 461 438 438 474 439 439 475 426 426 461 439 439 475 427 427 462 427 427 462 439 439 475 440 440 476 427 427 462 440 440 476 428 428 463 428 428 463 440 440 476 441 441 477 428 428 463 441 441 477 429 429 464 429 429 464 441 441 477 442 442 478 429 429 464 442 442 478 430 430 465 430 430 465 442 442 478 443 443 479 430 430 465 443 443 479 431 431 466 431 431 466 443 443 479 432 432 480 431 431 466 432 432 480 420 420 467 432 432 468 444 444 481 445 445 482 432 432 468 445 445 482 433 433 469 433 433 469 445 445 482 446 446 483 433 433 469 446 446 483 434 434 470 434 434 470 446 446 483 447 447 484 434 434 470 447 447 484 435 435 471 435 435 471 447 447 484 448 448 485 435 435 471 448 448 485 436 436 472 436 436 472 448 448 485 449 449 486 436 436 472 449 449 486 437 437 473 437 437 473 449 449 486 450 450 487 437 437 473 450 450 487 438 438 474 438 438 474 450 450 487 451 451 488 438 438 474 451 451 488 439 439 475 439 439 475 451 451 488 452 452 489 439 439 475 452 452 489 440 440 476 440 440 476 452 452 489 453 453 490 440 440 476 453 453 490 441 441 477 441 441 477 453 453 490 454 454 491 441 441 477 454 454 491 442 442 478 442 442 478 454 454 491 455 455 492 442 442 478 455 455 492 443 443 479 443 443 479 455 455 492 444 444 493 443 443 479 444 444 493 432 432 480 444 444 481 456 456 494 457 457 495 444 444 481 457 457 495 445 445 482 445 445 482 457 457 495 458 458 496 445 445 482 458 458 496 446 446 483 446 446 483 458 458 496 459 459 497 446 446 483 459 459 497 447 447 484 447 447 484 459 459 497 460 460 498 447 447 484 460 460 498 448 448 485 448 448 485 460 460 498 461 461 499 448 448 485 461 461 499 449 449 486 449 449 486 461 461 499 462 462 500 449 449 486 462 462 500 450 450 487 450 450 487 462 462 500 463 463 501 450 450 487 463 463 501 451 451 488 451 451 488 463 463 501 464 464 502 451 451 488 464 464 502 452 452 489 452 452 489 464 464 502 465 465 503 452 452 489 465 465 503 453 453 490 453 453 490 465 465 503 466 466 504 453 453 490 466 466 504 454 454 491 454 454 491 466 466 504 467 467 505 454 454 491 467 467 505 455 455 492 455 455 492 467 467 505 456 456 506 455 455 492 456 456 506 444 444 493 456 456 494 468 468 507 469 469 508 456 456 494 469 469 508 457 457 495 457 457 495 469 469 508 470 470 509 457 457 495 470 470 509 458 458 496 458 458 496 470 470 509 471 471 510 458 458 496 471 471 510 459 459 497 459 459 497 471 471 510 472 472 511 459 459 497 472 472 511 460 460 498 460 460 498 472 472 511 473 473 512 460 460 498 473 473 512 461 461 499 461 461 499 473 473 512 474 474 513 461 461 499 474 474 513 462 462 500 462 462 500 474 474 513 475 475 514 462 462 500 475 475 514 463 463 501 463 463 501 475 475 514 476 476 515 463 463 501 476 476 515 464 464 502 464 464 502 476 476 515 477 477 516 464 464 502 477 477 516 465 465 503 465 465 503 477 477 516 478 478 517 465 465 503 478 478 517 466 466 504 466 466 504 478 478 517 479 479 518 466 466 504 479 479 518 467 467 505 467 467 505 479 479 518 468 468 519 467 467 505 468 468 519 456 456 506 468 468 507 480 480 520 481 481 521 468 468 507 481 481 521 469 469 508 469 469 508 481 481 521 482 482 522 469 469 508 482 482 522 470 470 509 470 470 509 482 482 522 483 483 523 470 470 509 483 483 523 471 471 510 471 471 510 483 483 523 484 484 524 471 471 510 484 484 524 472 472 511 472 472 511 484 484 524 485 485 525 472 472 511 485 485 525 473 473 512 473 473 512 485 485 525 486 486 526 473 473 512 486 486 526 474 474 513 474 474 513 486 486 526 487 487 527 474 474 513 487 487 527 475 475 514 475 475 514 487 487 527 488 488 528 475 475 514 488 488 528 476 476 515 476 476 515 488 488 528 489 489 529 476 476 515 489 489 529 477 477 516 477 477 516 489 489 529 490 490 530 477 477 516 490 490 530 478 478 517 478 478 517 490 490 530 491 491 531 478 478 517 491 491 531 479 479 518 479 479 518 491 491 531 480 480 532 479 479 518 480 480 532 468 468 519 480 480 520 492 492 533 493 493 534 480 480 520 493 493 534 481 481 521 481 481 521 493 493 534 494 494 535 481 481 521 494 494 535 482 482 522 482 482 522 494 494 535 495 495 536 482 482 522 495 495 536 483 483 523 483 483 523 495 495 536 496 496 537 483 483 523 496 496 537 484 484 524 484 484 524 496 496 537 497 497 538 484 484 524 497 497 538 485 485 525 485 485 525 497 497 538 498 498 539 485 485 525 498 498 539 486 486 526 486 486 526 498 498 539 499 499 540 486 486 526 499 499 540 487 487 527 487 487 527 499 499 540 500 500 541 487 487 527 500 500 541 488 488 528 488 488 528 500 500 541 501 501 542 488 488 528 501 501 542 489 489 529 489 489 529 501 501 542 502 502 543 489 489 529 502 502 543 490 490 530 490 490 530 502 502 543 503 503 544 490 490 530 503 503 544 491 491 531 491 491 531 503 503 544 492 492 545 491 491 531 492 492 545 480 480 532 492 492 533 504 504 546 505 505 547 492 492 533 505 505 547 493 493 534 493 493 534 505 505 547 506 506 548 493 493 534 506 506 548 494 494 535 494 494 535 506 506 548 507 507 549 494 494 535 507 507 549 495 495 536 495 495 536 507 507 549 508 508 550 495 495 536 508 508 550 496 496 537 496 496 537 508 508 550 509 509 551 496 496 537 509 509 551 497 497 538 497 497 538 509 509 551 510 510 552 497 497 538 510 510 552 498 498 539 498 498 539 510 510 552 511 511 553 498 498 539 511 511 553 499 499 540 499 499 540 511 511 553 512 512 554 499 499 540 512 512 554 500 500 541 500 500 541 512 512 554 513 513 555 500 500 541 513 513 555 501 501 542 501 501 542 513 513 555 514 514 556 501 501 542 514 514 556 502 502 543 502 502 543 514 514 556 515 515 557 502 502 543 515 515 557 503 503 544 503 503 544 515 515 557 504 504 558 503 503 544 504 504 558 492 492 545 504 504 546 516 516 559 517 517 560 504 504 546 517 517 560 505 505 547 505 505 547 517 517 560 518 518 561 505 505 547 518 518 561 506 506 548 506 506 548 518 518 561 519 519 562 506 506 548 519 519 562 507 507 549 507 507 549 519 519 562 520 520 563 507 507 549 520 520 563 508 508 550 508 508 550 520 520 563 521 521 564 508 508 550 521 521 564 509 509 551 509 509 551 521 521 564 522 522 565 509 509 551 522 522 565 510 510 552 510 510 552 522 522 565 523 523 566 510 510 552 523 523 566 511 511 553 511 511 553 523 523 566 524 524 567 511 511 553 524 524 567 512 512 554 512 512 554 524 524 567 525 525 568 512 512 554 525 525 568 513 513 555 513 513 555 525 525 568 526 526 569 513 513 555 526 526 569 514 514 556 514 514 556 526 526 569 527 527 570 514 514 556 527 527 570 515 515 557 515 515 557 527 527 570 516 516 571 515 515 557 516 516 571 504 504 558 516 516 559 528 528 572 529 529 573 516 516 559 529 529 573 517 517 560 517 517 560 529 529 573 530 530 574 517 517 560 530 530 574 518 518 561 518 518 561 530 530 574 531 531 575 518 518 561 531 531 575 519 519 562 519 519 562 531 531 575 532 532 576 519 519 562 532 532 576 520 520 563 520 520 563 532 532 576 533 533 577 520 520 563 533 533 577 521 521 564 521 521 564 533 533 577 534 534 578 521 521 564 534 534 578 522 522 565 522 522 565 534 534 578 535 535 579 522 522 565 535 535 579 523 523 566 523 523 566 535 535 579 536 536 580 523 523 566 536 536 580 524 524 567 524 524 567 536 536 580 537 537 581 524 524 567 537 537 581 525 525 568 525 525 568 537 537 581 538 538 582 525 525 568 538 538 582 526 526 569 526 526 569 538 538 582 539 539 583 526 526 569 539 539 583 527 527 570 527 527 570 539 539 583 528 528 584 527 527 570 528 528 584 516 516 571 528 528 572 540 540 585 541 541 586 528 528 572 541 541 586 529 529 573 529 529 573 541 541 586 542 542 587 529 529 573 542 542 587 530 530 574 530 530 574 542 542 587 543 543 588 530 530 574 543 543 588 531 531 575 531 531 575 543 543 588 544 544 589 531 531 575 544 544 589 532 532 576 532 532 576 544 544 589 545 545 590 532 532 576 545 545 590 533 533 577 533 533 577 545 545 590 546 546 591 533 533 577 546 546 591 534 534 578 534 534 578 546 546 591 547 547 592 534 534 578 547 547 592 535 535 579 535 535 579 547 547 592 548 548 593 535 535 579 548 548 593 536 536 580 536 536 580 548 548 593 549 549 594 536 536 580 549 549 594 537 537 581 537 537 581 549 549 594 550 550 595 537 537 581 550 550 595 538 538 582 538 538 582 550 550 595 551 551 596 538 538 582 551 551 596 539 539 583 539 539 583 551 551 596 540 540 597 539 539 583 540 540 597 528 528 584 540 540 585 552 552 598 553 553 599 540 540 585 553 553 599 541 541 586 541 541 586 553 553 599 554 554 600 541 541 586 554 554 600 542 542 587 542 542 587 554 554 600 555 555 601 542 542 587 555 555 601 543 543 588 543 543 588 555 555 601 556 556 602 543 543 588 556 556 602 544 544 589 544 544 589 556 556 602 557 557 603 544 544 589 557 557 603 545 545 590 545 545 590 557 557 603 558 558 604 545 545 590 558 558 604 546 546 591 546 546 591 558 558 604 559 559 605 546 546 591 559 559 605 547 547 592 547 547 592 559 559 605 560 560 606 547 547 592 560 560 606 548 548 593 548 548 593 560 560 606 561 561 607 548 548 593 561 561 607 549 549 594 549 549 594 561 561 607 562 562 608 549 549 594 562 562 608 550 550 595 550 550 595 562 562 608 563 563 609 550 550 595 563 563 609 551 551 596 551 551 596 563 563 609 552 552 610 551 551 596 552 552 610 540 540 597 552 552 598 564 564 611 565 565 612 552 552 598 565 565 612 553 553 599 553 553 599 565 565 612 566 566 613 553 553 599 566 566 613 554 554 600 554 554 600 566 566 613 567 567 614 554 554 600 567 567 614 555 555 601 555 555 601 567 567 614 568 568 615 555 555 601 568 568 615 556 556 602 556 556 602 568 568 615 569 569 616 556 556 602 569 569 616 557 557 603 557 557 603 569 569 616 570 570 617 557 557 603 570 570 617 558 558 604 558 558 604 570 570 617 571 571 618 558 558 604 571 571 618 559 559 605 559 559 605 571 571 618 572 572 619 559 559 605 572 572 619 560 560 606 560 560 606 572 572 619 573 573 620 560 560 606 573 573 620 561 561 607 561 561 607 573 573 620 574 574 621 561 561 607 574 574 621 562 562 608 562 562 608 574 574 621 575 575 622 562 562 608 575 575 622 563 563 609 563 563 609 575 575 622 564 564 623 563 563 609 564 564 623 552 552 610 564 564 611 576 576 624 577 577 625 564 564 611 577 577 625 565 565 612 565 565 612 577 577 625 578 578 626 565 565 612 578 578 626 566 566 613 566 566 613 578 578 626 579 579 627 566 566 613 579 579 627 567 567 614 567 567 614 579 579 627 580 580 628 567 567 614 580 580 628 568 568 615 568 568 615 580 580 628 581 581 629 568 568 615 581 581 629 569 569 616 569 569 616 581 581 629 582 582 630 569 569 616 582 582 630 570 570 617 570 570 617 582 582 630 583 583 631 570 570 617 583 583 631 571 571 618 571 571 618 583 583 631 584 584 632 571 571 618 584 584 632 572 572 619 572 572 619 584 584 632 585 585 633 572 572 619 585 585 633 573 573 620 573 573 620 585 585 633 586 586 634 573 573 620 586 586 634 574 574 621 574 574 621 586 586 634 587 587 635 574 574 621 587 587 635 575 575 622 575 575 622 587 587 635 576 576 636 575 575 622 576 576 636 564 564 623 576 576 624 588 588 637 589 589 638 576 576 624 589 589 638 577 577 625 577 577 625 589 589 638 590 590 639 577 577 625 590 590 639 578 578 626 578 578 626 590 590 639 591 591 640 578 578 626 591 591 640 579 579 627 579 579 627 591 591 640 592 592 641 579 579 627 592 592 641 580 580 628 580 580 628 592 592 641 593 593 642 580 580 628 593 593 642 581 581 629 581 581 629 593 593 642 594 594 643 581 581 629 594 594 643 582 582 630 582 582 630 594 594 643 595 595 644 582 582 630 595 595 644 583 583 631 583 583 631 595 595 644 596 596 645 583 583 631 596 596 645 584 584 632 584 584 632 596 596 645 597 597 646 584 584 632 597 597 646 585 585 633 585 585 633 597 597 646 598 598 647 585 585 633 598 598 647 586 586 634 586 586 634 598 598 647 599 599 648 586 586 634 599 599 648 587 587 635 587 587 635 599 599 648 588 588 649 587 587 635 588 588 649 576 576 636 588 588 637 600 600 650 601 601 651 588 588 637 601 601 651 589 589 638 589 589 638 601 601 651 602 602 652 589 589 638 602 602 652 590 590 639 590 590 639 602 602 652 603 603 653 590 590 639 603 603 653 591 591 640 591 591 640 603 603 653 604 604 654 591 591 640 604 604 654 592 592 641 592 592 641 604 604 654 605 605 655 592 592 641 605 605 655 593 593 642 593 593 642 605 605 655 606 606 656 593 593 642 606 606 656 594 594 643 594 594 643 606 606 656 607 607 657 594 594 643 607 607 657 595 595 644 595 595 644 607 607 657 608 608 658 595 595 644 608 608 658 596 596 645 596 596 645 608 608 658 609 609 659 596 596 645 609 609 659 597 597 646 597 597 646 609 609 659 610 610 660 597 597 646 610 610 660 598 598 647 598 598 647 610 610 660 611 611 661 598 598 647 611 611 661 599 599 648 599 599 648 611 611 661 600 600 662 599 599 648 600 600 662 588 588 649 600 600 650 612 612 663 613 613 664 600 600 650 613 613 664 601 601 651 601 601 651 613 613 664 614 614 665 601 601 651 614 614 665 602 602 652 602 602 652 614 614 665 615 615 666 602 602 652 615 615 666 603 603 653 603 603 653 615 615 666 616 616 667 603 603 653 616 616 667 604 604 654 604 604 654 616 616 667 617 617 668 604 604 654 617 617 668 605 605 655 605 605 655 617 617 668 618 618 669 605 605 655 618 618 669 606 606 656 606 606 656 618 618 669 619 619 670 606 606 656 619 619 670 607 607 657 607 607 657 619 619 670 620 620 671 607 607 657 620 620 671 608 608 658 608 608 658 620 620 671 621 621 672 608 608 658 621 621 672 609 609 659 609 609 659 621 621 672 622 622 673 609 609 659 622 622 673 610 610 660 610 610 660 622 622 673 623 623 674 610 610 660 623 623 674 611 611 661 611 611 661 623 623 674 612 612 675 611 611 661 612 612 675 600 600 662 612 612 663 624 624 676 625 625 677 612 612 663 625 625 677 613 613 664 613 613 664 625 625 677 626 626 678 613 613 664 626 626 678 614 614 665 614 614 665 626 626 678 627 627 679 614 614 665 627 627 679 615 615 666 615 615 666 627 627 679 628 628 680 615 615 666 628 628 680 616 616 667 616 616 667 628 628 680 629 629 681 616 616 667 629 629 681 617 617 668 617 617 668 629 629 681 630 630 682 617 617 668 630 630 682 618 618 669 618 618 669 630 630 682 631 631 683 618 618 669 631 631 683 619 619 670 619 619 670 631 631 683 632 632 684 619 619 670 632 632 684 620 620 671 620 620 671 632 632 684 633 633 685 620 620 671 633 633 685 621 621 672 621 621 672 633 633 685 634 634 686 621 621 672 634 634 686 622 622 673 622 622 673 634 634 686 635 635 687 622 622 673 635 635 687 623 623 674 623 623 674 635 635 687 624 624 688 623 623 674 624 624 688 612 612 675 624 624 676 636 636 689 637 637 690 624 624 676 637 637 690 625 625 677 625 625 677 637 637 690 638 638 691 625 625 677 638 638 691 626 626 678 626 626 678 638 638 691 639 639 692 626 626 678 639 639 692 627 627 679 627 627 679 639 639 692 640 640 693 627 627 679 640 640 693 628 628 680 628 628 680 640 640 693 641 641 694 628 628 680 641 641 694 629 629 681 629 629 681 641 641 694 642 642 695 629 629 681 642 642 695 630 630 682 630 630 682 642 642 695 643 643 696 630 630 682 643 643 696 631 631 683 631 631 683 643 643 696 644 644 697 631 631 683 644 644 697 632 632 684 632 632 684 644 644 697 645 645 698 632 632 684 645 645 698 633 633 685 633 633 685 645 645 698 646 646 699 633 633 685 646 646 699 634 634 686 634 634 686 646 646 699 647 647 700 634 634 686 647 647 700 635 635 687 635 635 687 647 647 700 636 636 701 635 635 687 636 636 701 624 624 688 636 636 689 648 648 702 649 649 703 636 636 689 649 649 703 637 637 690 637 637 690 649 649 703 650 650 704 637 637 690 650 650 704 638 638 691 638 638 691 650 650 704 651 651 705 638 638 691 651 651 705 639 639 692 639 639 692 651 651 705 652 652 706 639 639 692 652 652 706 640 640 693 640 640 693 652 652 706 653 653 707 640 640 693 653 653 707 641 641 694 641 641 694 653 653 707 654 654 708 641 641 694 654 654 708 642 642 695 642 642 695 654 654 708 655 655 709 642 642 695 655 655 709 643 643 696 643 643 696 655 655 709 656 656 710 643 643 696 656 656 710 644 644 697 644 644 697 656 656 710 657 657 711 644 644 697 657 657 711 645 645 698 645 645 698 657 657 711 658 658 712 645 645 698 658 658 712 646 646 699 646 646 699 658 658 712 659 659 713 646 646 699 659 659 713 647 647 700 647 647 700 659 659 713 648 648 714 647 647 700 648 648 714 636 636 701 648 648 702 660 660 715 661 661 716 648 648 702 661 661 716 649 649 703 649 649 703 661 661 716 662 662 717 649 649 703 662 662 717 650 650 704 650 650 704 662 662 717 663 663 718 650 650 704 663 663 718 651 651 705 651 651 705 663 663 718 664 664 719 651 651 705 664 664 719 652 652 706 652 652 706 664 664 719 665 665 720 652 652 706 665 665 720 653 653 707 653 653 707 665 665 720 666 666 721 653 653 707 666 666 721 654 654 708 654 654 708 666 666 721 667 667 722 654 654 708 667 667 722 655 655 709 655 655 709 667 667 722 668 668 723 655 655 709 668 668 723 656 656 710 656 656 710 668 668 723 669 669 724 656 656 710 669 669 724 657 657 711 657 657 711 669 669 724 670 670 725 657 657 711 670 670 725 658 658 712 658 658 712 670 670 725 671 671 726 658 658 712 671 671 726 659 659 713 659 659 713 671 671 726 660 660 727 659 659 713 660 660 727 648 648 714 660 660 715 672 672 728 673 673 729 660 660 715 673 673 729 661 661 716 661 661 716 673 673 729 674 674 730 661 661 716 674 674 730 662 662 717 662 662 717 674 674 730 675 675 731 662 662 717 675 675 731 663 663 718 663 663 718 675 675 731 676 676 732 663 663 718 676 676 732 664 664 719 664 664 719 676 676 732 677 677 733 664 664 719 677 677 733 665 665 720 665 665 720 677 677 733 678 678 734 665 665 720 678 678 734 666 666 721 666 666 721 678 678 734 679 679 735 666 666 721 679 679 735 667 667 722 667 667 722 679 679 735 680 680 736 667 667 722 680 680 736 668 668 723 668 668 723 680 680 736 681 681 737 668 668 723 681 681 737 669 669 724 669 669 724 681 681 737 682 682 738 669 669 724 682 682 738 670 670 725 670 670 725 682 682 738 683 683 739 670 670 725 683 683 739 671 671 726 671 671 726 683 683 739 672 672 740 671 671 726 672 672 740 660 660 727 672 672 728 684 684 741 685 685 742 672 672 728 685 685 742 673 673 729 673 673 729 685 685 742 686 686 743 673 673 729 686 686 743 674 674 730 674 674 730 686 686 743 687 687 744 674 674 730 687 687 744 675 675 731 675 675 731 687 687 744 688 688 745 675 675 731 688 688 745 676 676 732 676 676 732 688 688 745 689 689 746 676 676 732 689 689 746 677 677 733 677 677 733 689 689 746 690 690 747 677 677 733 690 690 747 678 678 734 678 678 734 690 690 747 691 691 748 678 678 734 691 691 748 679 679 735 679 679 735 691 691 748 692 692 749 679 679 735 692 692 749 680 680 736 680 680 736 692 692 749 693 693 750 680 680 736 693 693 750 681 681 737 681 681 737 693 693 750 694 694 751 681 681 737 694 694 751 682 682 738 682 682 738 694 694 751 695 695 752 682 682 738 695 695 752 683 683 739 683 683 739 695 695 752 684 684 753 683 683 739 684 684 753 672 672 740 684 684 741 696 696 754 697 697 755 684 684 741 697 697 755 685 685 742 685 685 742 697 697 755 698 698 756 685 685 742 698 698 756 686 686 743 686 686 743 698 698 756 699 699 757 686 686 743 699 699 757 687 687 744 687 687 744 699 699 757 700 700 758 687 687 744 700 700 758 688 688 745 688 688 745 700 700 758 701 701 759 688 688 745 701 701 759 689 689 746 689 689 746 701 701 759 702 702 760 689 689 746 702 702 760 690 690 747 690 690 747 702 702 760 703 703 761 690 690 747 703 703 761 691 691 748 691 691 748 703 703 761 704 704 762 691 691 748 704 704 762 692 692 749 692 692 749 704 704 762 705 705 763 692 692 749 705 705 763 693 693 750 693 693 750 705 705 763 706 706 764 693 693 750 706 706 764 694 694 751 694 694 751 706 706 764 707 707 765 694 694 751 707 707 765 695 695 752 695 695 752 707 707 765 696 696 766 695 695 752 696 696 766 684 684 753 696 696 754 708 708 767 709 709 768 696 696 754 709 709 768 697 697 755 697 697 755 709 709 768 710 710 769 697 697 755 710 710 769 698 698 756 698 698 756 710 710 769 711 711 770 698 698 756 711 711 770 699 699 757 699 699 757 711 711 770 712 712 771 699 699 757 712 712 771 700 700 758 700 700 758 712 712 771 713 713 772 700 700 758 713 713 772 701 701 759 701 701 759 713 713 772 714 714 773 701 701 759 714 714 773 702 702 760 702 702 760 714 714 773 715 715 774 702 702 760 715 715 774 703 703 761 703 703 761 715 715 774 716 716 775 703 703 761 716 716 775 704 704 762 704 704 762 716 716 775 717 717 776 704 704 762 717 717 776 705 705 763 705 705 763 717 717 776 718 718 777 705 705 763 718 718 777 706 706 764 706 706 764 718 718 777 719 719 778 706 706 764 719 719 778 707 707 765 707 707 765 719 719 778 708 708 779 707 707 765 708 708 779 696 696 766 708 708 767 720 720 780 721 721 781 708 708 767 721 721 781 709 709 768 709 709 768 721 721 781 722 722 782 709 709 768 722 722 782 710 710 769 710 710 769 722 722 782 723 723 783 710 710 769 723 723 783 711 711 770 711 711 770 723 723 783 724 724 784 711 711 770 724 724 784 712 712 771 712 712 771 724 724 784 725 725 785 712 712 771 725 725 785 713 713 772 713 713 772 725 725 785 726 726 786 713 713 772 726 726 786 714 714 773 714 714 773 726 726 786 727 727 787 714 714 773 727 727 787 715 715 774 715 715 774 727 727 787 728 728 788 715 715 774 728 728 788 716 716 775 716 716 775 728 728 788 729 729 789 716 716 775 729 729 789 717 717 776 717 717 776 729 729 789 730 730 790 717 717 776 730 730 790 718 718 777 718 718 777 730 730 790 731 731 791 718 718 777 731 731 791 719 719 778 719 719 778 731 731 791 720 720 792 719 719 778 720 720 792 708 708 779 720 720 780 732 732 793 733 733 794 720 720 780 733 733 794 721 721 781 721 721 781 733 733 794 734 734 795 721 721 781 734 734 795 722 722 782 722 722 782 734 734 795 735 735 796 722 722 782 735 735 796 723 723 783 723 723 783 735 735 796 736 736 797 723 723 783 736 736 797 724 724 784 724 724 784 736 736 797 737 737 798 724 724 784 737 737 798 725 725 785 725 725 785 737 737 798 738 738 799 725 725 785 738 738 799 726 726 786 726 726 786 738 738 799 739 739 800 726 726 786 739 739 800 727 727 787 727 727 787 739 739 800 740 740 801 727 727 787 740 740 801 728 728 788 728 728 788 740 740 801 741 741 802 728 728 788 741 741 802 729 729 789 729 729 789 741 741 802 742 742 803 729 729 789 742 742 803 730 730 790 730 730 790 742 742 803 743 743 804 730 730 790 743 743 804 731 731 791 731 731 791 743 743 804 732 732 805 731 731 791 732 732 805 720 720 792 732 732 793 744 744 806 745 745 807 732 732 793 745 745 807 733 733 794 733 733 794 745 745 807 746 746 808 733 733 794 746 746 808 734 734 795 734 734 795 746 746 808 747 747 809 734 734 795 747 747 809 735 735 796 735 735 796 747 747 809 748 748 810 735 735 796 748 748 810 736 736 797 736 736 797 748 748 810 749 749 811 736 736 797 749 749 811 737 737 798 737 737 798 749 749 811 750 750 812 737 737 798 750 750 812 738 738 799 738 738 799 750 750 812 751 751 813 738 738 799 751 751 813 739 739 800 739 739 800 751 751 813 752 752 814 739 739 800 752 752 814 740 740 801 740 740 801 752 752 814 753 753 815 740 740 801 753 753 815 741 741 802 741 741 802 753 753 815 754 754 816 741 741 802 754 754 816 742 742 803 742 742 803 754 754 816 755 755 817 742 742 803 755 755 817 743 743 804 743 743 804 755 755 817 744 744 818 743 743 804 744 744 818 732 732 805 744 744 806 756 756 819 757 757 820 744 744 806 757 757 820 745 745 807 745 745 807 757 757 820 758 758 821 745 745 807 758 758 821 746 746 808 746 746 808 758 758 821 759 759 822 746 746 808 759 759 822 747 747 809 747 747 809 759 759 822 760 760 823 747 747 809 760 760 823 748 748 810 748 748 810 760 760 823 761 761 824 748 748 810 761 761 824 749 749 811 749 749 811 761 761 824 762 762 825 749 749 811 762 762 825 750 750 812 750 750 812 762 762 825 763 763 826 750 750 812 763 763 826 751 751 813 751 751 813 763 763 826 764 764 827 751 751 813 764 764 827 752 752 814 752 752 814 764 764 827 765 765 828 752 752 814 765 765 828 753 753 815 753 753 815 765 765 828 766 766 829 753 753 815 766 766 829 754 754 816 754 754 816 766 766 829 767 767 830 754 754 816 767 767 830 755 755 817 755 755 817 767 767 830 756 756 831 755 755 817 756 756 831 744 744 818 756 756 819 768 768 832 769 769 833 756 756 819 769 769 833 757 757 820 757 757 820 769 769 833 770 770 834 757 757 820 770 770 834 758 758 821 758 758 821 770 770 834 771 771 835 758 758 821 771 771 835 759 759 822 759 759 822 771 771 835 772 772 836 759 759 822 772 772 836 760 760 823 760 760 823 772 772 836 773 773 837 760 760 823 773 773 837 761 761 824 761 761 824 773 773 837 774 774 838 761 761 824 774 774 838 762 762 825 762 762 825 774 774 838 775 775 839 762 762 825 775 775 839 763 763 826 763 763 826 775 775 839 776 776 840 763 763 826 776 776 840 764 764 827 764 764 827 776 776 840 777 777 841 764 764 827 777 777 841 765 765 828 765 765 828 777 777 841 778 778 842 765 765 828 778 778 842 766 766 829 766 766 829 778 778 842 779 779 843 766 766 829 779 779 843 767 767 830 767 767 830 779 779 843 768 768 844 767 767 830 768 768 844 756 756 831 768 768 832 780 780 845 781 781 846 768 768 832 781 781 846 769 769 833 769 769 833 781 781 846 782 782 847 769 769 833 782 782 847 770 770 834 770 770 834 782 782 847 783 783 848 770 770 834 783 783 848 771 771 835 771 771 835 783 783 848 784 784 849 771 771 835 784 784 849 772 772 836 772 772 836 784 784 849 785 785 850 772 772 836 785 785 850 773 773 837 773 773 837 785 785 850 786 786 851 773 773 837 786 786 851 774 774 838 774 774 838 786 786 851 787 787 852 774 774 838 787 787 852 775 775 839 775 775 839 787 787 852 788 788 853 775 775 839 788 788 853 776 776 840 776 776 840 788 788 853 789 789 854 776 776 840 789 789 854 777 777 841 777 777 841 789 789 854 790 790 855 777 777 841 790 790 855 778 778 842 778 778 842 790 790 855 791 791 856 778 778 842 791 791 856 779 779 843 779 779 843 791 791 856 780 780 857 779 779 843 780 780 857 768 768 844 780 780 845 792 792 858 793 793 859 780 780 845 793 793 859 781 781 846 781 781 846 793 793 859 794 794 860 781 781 846 794 794 860 782 782 847 782 782 847 794 794 860 795 795 861 782 782 847 795 795 861 783 783 848 783 783 848 795 795 861 796 796 862 783 783 848 796 796 862 784 784 849 784 784 849 796 796 862 797 797 863 784 784 849 797 797 863 785 785 850 785 785 850 797 797 863 798 798 864 785 785 850 798 798 864 786 786 851 786 786 851 798 798 864 799 799 865 786 786 851 799 799 865 787 787 852 787 787 852 799 799 865 800 800 866 787 787 852 800 800 866 788 788 853 788 788 853 800 800 866 801 801 867 788 788 853 801 801 867 789 789 854 789 789 854 801 801 867 802 802 868 789 789 854 802 802 868 790 790 855 790 790 855 802 802 868 803 803 869 790 790 855 803 803 869 791 791 856 791 791 856 803 803 869 792 792 870 791 791 856 792 792 870 780 780 857 792 792 858 804 804 871 805 805 872 792 792 858 805 805 872 793 793 859 793 793 859 805 805 872 806 806 873 793 793 859 806 806 873 794 794 860 794 794 860 806 806 873 807 807 874 794 794 860 807 807 874 795 795 861 795 795 861 807 807 874 808 808 875 795 795 861 808 808 875 796 796 862 796 796 862 808 808 875 809 809 876 796 796 862 809 809 876 797 797 863 797 797 863 809 809 876 810 810 877 797 797 863 810 810 877 798 798 864 798 798 864 810 810 877 811 811 878 798 798 864 811 811 878 799 799 865 799 799 865 811 811 878 812 812 879 799 799 865 812 812 879 800 800 866 800 800 866 812 812 879 813 813 880 800 800 866 813 813 880 801 801 867 801 801 867 813 813 880 814 814 881 801 801 867 814 814 881 802 802 868 802 802 868 814 814 881 815 815 882 802 802 868 815 815 882 803 803 869 803 803 869 815 815 882 804 804 883 803 803 869 804 804 883 792 792 870 804 804 871 816 816 884 817 817 885 804 804 871 817 817 885 805 805 872 805 805 872 817 817 885 818 818 886 805 805 872 818 818 886 806 806 873 806 806 873 818 818 886 819 819 887 806 806 873 819 819 887 807 807 874 807 807 874 819 819 887 820 820 888 807 807 874 820 820 888 808 808 875 808 808 875 820 820 888 821 821 889 808 808 875 821 821 889 809 809 876 809 809 876 821 821 889 822 822 890 809 809 876 822 822 890 810 810 877 810 810 877 822 822 890 823 823 891 810 810 877 823 823 891 811 811 878 811 811 878 823 823 891 824 824 892 811 811 878 824 824 892 812 812 879 812 812 879 824 824 892 825 825 893 812 812 879 825 825 893 813 813 880 813 813 880 825 825 893 826 826 894 813 813 880 826 826 894 814 814 881 814 814 881 826 826 894 827 827 895 814 814 881 827 827 895 815 815 882 815 815 882 827 827 895 816 816 896 815 815 882 816 816 896 804 804 883 816 816 884 828 828 897 829 829 898 816 816 884 829 829 898 817 817 885 817 817 885 829 829 898 830 830 899 817 817 885 830 830 899 818 818 886 818 818 886 830 830 899 831 831 900 818 818 886 831 831 900 819 819 887 819 819 887 831 831 900 832 832 901 819 819 887 832 832 901 820 820 888 820 820 888 832 832 901 833 833 902 820 820 888 833 833 902 821 821 889 821 821 889 833 833 902 834 834 903 821 821 889 834 834 903 822 822 890 822 822 890 834 834 903 835 835 904 822 822 890 835 835 904 823 823 891 823 823 891 835 835 904 836 836 905 823 823 891 836 836 905 824 824 892 824 824 892 836 836 905 837 837 906 824 824 892 837 837 906 825 825 893 825 825 893 837 837 906 838 838 907 825 825 893 838 838 907 826 826 894 826 826 894 838 838 907 839 839 908 826 826 894 839 839 908 827 827 895 827 827 895 839 839 908 828 828 909 827 827 895 828 828 909 816 816 896 828 828 897 840 840 910 841 841 911 828 828 897 841 841 911 829 829 898 829 829 898 841 841 911 842 842 912 829 829 898 842 842 912 830 830 899 830 830 899 842 842 912 843 843 913 830 830 899 843 843 913 831 831 900 831 831 900 843 843 913 844 844 914 831 831 900 844 844 914 832 832 901 832 832 901 844 844 914 845 845 915 832 832 901 845 845 915 833 833 902 833 833 902 845 845 915 846 846 916 833 833 902 846 846 916 834 834 903 834 834 903 846 846 916 847 847 917 834 834 903 847 847 917 835 835 904 835 835 904 847 847 917 848 848 918 835 835 904 848 848 918 836 836 905 836 836 905 848 848 918 849 849 919 836 836 905 849 849 919 837 837 906 837 837 906 849 849 919 850 850 920 837 837 906 850 850 920 838 838 907 838 838 907 850 850 920 851 851 921 838 838 907 851 851 921 839 839 908 839 839 908 851 851 921 840 840 922 839 839 908 840 840 922 828 828 909 840 840 910 852 852 923 853 853 924 840 840 910 853 853 924 841 841 911 841 841 911 853 853 924 854 854 925 841 841 911 854 854 925 842 842 912 842 842 912 854 854 925 855 855 926 842 842 912 855 855 926 843 843 913 843 843 913 855 855 926 856 856 927 843 843 913 856 856 927 844 844 914 844 844 914 856 856 927 857 857 928 844 844 914 857 857 928 845 845 915 845 845 915 857 857 928 858 858 929 845 845 915 858 858 929 846 846 916 846 846 916 858 858 929 859 859 930 846 846 916 859 859 930 847 847 917 847 847 917 859 859 930 860 860 931 847 847 917 860 860 931 848 848 918 848 848 918 860 860 931 861 861 932 848 848 918 861 861 932 849 849 919 849 849 919 861 861 932 862 862 933 849 849 919 862 862 933 850 850 920 850 850 920 862 862 933 863 863 934 850 850 920 863 863 934 851 851 921 851 851 921 863 863 934 852 852 935 851 851 921 852 852 935 840 840 922 852 852 923 864 864 936 865 865 937 852 852 923 865 865 937 853 853 924 853 853 924 865 865 937 866 866 938 853 853 924 866 866 938 854 854 925 854 854 925 866 866 938 867 867 939 854 854 925 867 867 939 855 855 926 855 855 926 867 867 939 868 868 940 855 855 926 868 868 940 856 856 927 856 856 927 868 868 940 869 869 941 856 856 927 869 869 941 857 857 928 857 857 928 869 869 941 870 870 942 857 857 928 870 870 942 858 858 929 858 858 929 870 870 942 871 871 943 858 858 929 871 871 943 859 859 930 859 859 930 871 871 943 872 872 944 859 859 930 872 872 944 860 860 931 860 860 931 872 872 944 873 873 945 860 860 931 873 873 945 861 861 932 861 861 932 873 873 945 874 874 946 861 861 932 874 874 946 862 862 933 862 862 933 874 874 946 875 875 947 862 862 933 875 875 947 863 863 934 863 863 934 875 875 947 864 864 948 863 863 934 864 864 948 852 852 935 864 864 936 876 876 949 877 877 950 864 864 936 877 877 950 865 865 937 865 865 937 877 877 950 878 878 951 865 865 937 878 878 951 866 866 938 866 866 938 878 878 951 879 879 952 866 866 938 879 879 952 867 867 939 867 867 939 879 879 952 880 880 953 867 867 939 880 880 953 868 868 940 868 868 940 880 880 953 881 881 954 868 868 940 881 881 954 869 869 941 869 869 941 881 881 954 882 882 955 869 869 941 882 882 955 870 870 942 870 870 942 882 882 955 883 883 956 870 870 942 883 883 956 871 871 943 871 871 943 883 883 956 884 884 957 871 871 943 884 884 957 872 872 944 872 872 944 884 884 957 885 885 958 872 872 944 885 885 958 873 873 945 873 873 945 885 885 958 886 886 959 873 873 945 886 886 959 874 874 946 874 874 946 886 886 959 887 887 960 874 874 946 887 887 960 875 875 947 875 875 947 887 887 960 876 876 961 875 875 947 876 876 961 864 864 948 876 876 949 888 888 962 889 889 963 876 876 949 889 889 963 877 877 950 877 877 950 889 889 963 890 890 964 877 877 950 890 890 964 878 878 951 878 878 951 890 890 964 891 891 965 878 878 951 891 891 965 879 879 952 879 879 952 891 891 965 892 892 966 879 879 952 892 892 966 880 880 953 880 880 953 892 892 966 893 893 967 880 880 953 893 893 967 881 881 954 881 881 954 893 893 967 894 894 968 881 881 954 894 894 968 882 882 955 882 882 955 894 894 968 895 895 969 882 882 955 895 895 969 883 883 956 883 883 956 895 895 969 896 896 970 883 883 956 896 896 970 884 884 957 884 884 957 896 896 970 897 897 971 884 884 957 897 897 971 885 885 958 885 885 958 897 897 971 898 898 972 885 885 958 898 898 972 886 886 959 886 886 959 898 898 972 899 899 973 886 886 959 899 899 973 887 887 960 887 887 960 899 899 973 888 888 974 887 887 960 888 888 974 876 876 961 888 888 962 900 900 975 901 901 976 888 888 962 901 901 976 889 889 963 889 889 963 901 901 976 902 902 977 889 889 963 902 902 977 890 890 964 890 890 964 902 902 977 903 903 978 890 890 964 903 903 978 891 891 965 891 891 965 903 903 978 904 904 979 891 891 965 904 904 979 892 892 966 892 892 966 904 904 979 905 905 980 892 892 966 905 905 980 893 893 967 893 893 967 905 905 980 906 906 981 893 893 967 906 906 981 894 894 968 894 894 968 906 906 981 907 907 982 894 894 968 907 907 982 895 895 969 895 895 969 907 907 982 908 908 983 895 895 969 908 908 983 896 896 970 896 896 970 908 908 983 909 909 984 896 896 970 909 909 984 897 897 971 897 897 971 909 909 984 910 910 985 897 897 971 910 910 985 898 898 972 898 898 972 910 910 985 911 911 986 898 898 972 911 911 986 899 899 973 899 899 973 911 911 986 900 900 987 899 899 973 900 900 987 888 888 974 900 900 975 912 912 988 913 913 989 900 900 975 913 913 989 901 901 976 901 901 976 913 913 989 914 914 990 901 901 976 914 914 990 902 902 977 902 902 977 914 914 990 915 915 991 902 902 977 915 915 991 903 903 978 903 903 978 915 915 991 916 916 992 903 903 978 916 916 992 904 904 979 904 904 979 916 916 992 917 917 993 904 904 979 917 917 993 905 905 980 905 905 980 917 917 993 918 918 994 905 905 980 918 918 994 906 906 981 906 906 981 918 918 994 919 919 995 906 906 981 919 919 995 907 907 982 907 907 982 919 919 995 920 920 996 907 907 982 920 920 996 908 908 983 908 908 983 920 920 996 921 921 997 908 908 983 921 921 997 909 909 984 909 909 984 921 921 997 922 922 998 909 909 984 922 922 998 910 910 985 910 910 985 922 922 998 923 923 999 910 910 985 923 923 999 911 911 986 911 911 986 923 923 999 912 912 1000 911 911 986 912 912 1000 900 900 987 912 912 988 924 924 1001 925 925 1002 912 912 988 925 925 1002 913 913 989 913 913 989 925 925 1002 926 926 1003 913 913 989 926 926 1003 914 914 990 914 914 990 926 926 1003 927 927 1004 914 914 990 927 927 1004 915 915 991 915 915 991 927 927 1004 928 928 1005 915 915 991 928 928 1005 916 916 992 916 916 992 928 928 1005 929 929 1006 916 916 992 929 929 1006 917 917 993 917 917 993 929 929 1006 930 930 1007 917 917 993 930 930 1007 918 918 994 918 918 994 930 930 1007 931 931 1008 918 918 994 931 931 1008 919 919 995 919 919 995 931 931 1008 932 932 1009 919 919 995 932 932 1009 920 920 996 920 920 996 932 932 1009 933 933 1010 920 920 996 933 933 1010 921 921 997 921 921 997 933 933 1010 934 934 1011 921 921 997 934 934 1011 922 922 998 922 922 998 934 934 1011 935 935 1012 922 922 998 935 935 1012 923 923 999 923 923 999 935 935 1012 924 924 1013 923 923 999 924 924 1013 912 912 1000 924 924 1001 936 936 1014 937 937 1015 924 924 1001 937 937 1015 925 925 1002 925 925 1002 937 937 1015 938 938 1016 925 925 1002 938 938 1016 926 926 1003 926 926 1003 938 938 1016 939 939 1017 926 926 1003 939 939 1017 927 927 1004 927 927 1004 939 939 1017 940 940 1018 927 927 1004 940 940 1018 928 928 1005 928 928 1005 940 940 1018 941 941 1019 928 928 1005 941 941 1019 929 929 1006 929 929 1006 941 941 1019 942 942 1020 929 929 1006 942 942 1020 930 930 1007 930 930 1007 942 942 1020 943 943 1021 930 930 1007 943 943 1021 931 931 1008 931 931 1008 943 943 1021 944 944 1022 931 931 1008 944 944 1022 932 932 1009 932 932 1009 944 944 1022 945 945 1023 932 932 1009 945 945 1023 933 933 1010 933 933 1010 945 945 1023 946 946 1024 933 933 1010 946 946 1024 934 934 1011 934 934 1011 946 946 1024 947 947 1025 934 934 1011 947 947 1025 935 935 1012 935 935 1012 947 947 1025 936 936 1026 935 935 1012 936 936 1026 924 924 1013 936 936 1014 948 948 1027 949 949 1028 936 936 1014 949 949 1028 937 937 1015 937 937 1015 949 949 1028 950 950 1029 937 937 1015 950 950 1029 938 938 1016 938 938 1016 950 950 1029 951 951 1030 938 938 1016 951 951 1030 939 939 1017 939 939 1017 951 951 1030 952 952 1031 939 939 1017 952 952 1031 940 940 1018 940 940 1018 952 952 1031 953 953 1032 940 940 1018 953 953 1032 941 941 1019 941 941 1019 953 953 1032 954 954 1033 941 941 1019 954 954 1033 942 942 1020 942 942 1020 954 954 1033 955 955 1034 942 942 1020 955 955 1034 943 943 1021 943 943 1021 955 955 1034 956 956 1035 943 943 1021 956 956 1035 944 944 1022 944 944 1022 956 956 1035 957 957 1036 944 944 1022 957 957 1036 945 945 1023 945 945 1023 957 957 1036 958 958 1037 945 945 1023 958 958 1037 946 946 1024 946 946 1024 958 958 1037 959 959 1038 946 946 1024 959 959 1038 947 947 1025 947 947 1025 959 959 1038 948 948 1039 947 947 1025 948 948 1039 936 936 1026 948 948 1027 960 960 1040 961 961 1041 948 948 1027 961 961 1041 949 949 1028 949 949 1028 961 961 1041 962 962 1042 949 949 1028 962 962 1042 950 950 1029 950 950 1029 962 962 1042 963 963 1043 950 950 1029 963 963 1043 951 951 1030 951 951 1030 963 963 1043 964 964 1044 951 951 1030 964 964 1044 952 952 1031 952 952 1031 964 964 1044 965 965 1045 952 952 1031 965 965 1045 953 953 1032 953 953 1032 965 965 1045 966 966 1046 953 953 1032 966 966 1046 954 954 1033 954 954 1033 966 966 1046 967 967 1047 954 954 1033 967 967 1047 955 955 1034 955 955 1034 967 967 1047 968 968 1048 955 955 1034 968 968 1048 956 956 1035 956 956 1035 968 968 1048 969 969 1049 956 956 1035 969 969 1049 957 957 1036 957 957 1036 969 969 1049 970 970 1050 957 957 1036 970 970 1050 958 958 1037 958 958 1037 970 970 1050 971 971 1051 958 958 1037 971 971 1051 959 959 1038 959 959 1038 971 971 1051 960 960 1052 959 959 1038 960 960 1052 948 948 1039 960 960 1040 972 972 1053 973 973 1054 960 960 1040 973 973 1054 961 961 1041 961 961 1041 973 973 1054 974 974 1055 961 961 1041 974 974 1055 962 962 1042 962 962 1042 974 974 1055 975 975 1056 962 962 1042 975 975 1056 963 963 1043 963 963 1043 975 975 1056 976 976 1057 963 963 1043 976 976 1057 964 964 1044 964 964 1044 976 976 1057 977 977 1058 964 964 1044 977 977 1058 965 965 1045 965 965 1045 977 977 1058 978 978 1059 965 965 1045 978 978 1059 966 966 1046 966 966 1046 978 978 1059 979 979 1060 966 966 1046 979 979 1060 967 967 1047 967 967 1047 979 979 1060 980 980 1061 967 967 1047 980 980 1061 968 968 1048 968 968 1048 980 980 1061 981 981 1062 968 968 1048 981 981 1062 969 969 1049 969 969 1049 981 981 1062 982 982 1063 969 969 1049 982 982 1063 970 970 1050 970 970 1050 982 982 1063 983 983 1064 970 970 1050 983 983 1064 971 971 1051 971 971 1051 983 983 1064 972 972 1065 971 971 1051 972 972 1065 960 960 1052 972 972 1053 984 984 1066 985 985 1067 972 972 1053 985 985 1067 973 973 1054 973 973 1054 985 985 1067 986 986 1068 973 973 1054 986 986 1068 974 974 1055 974 974 1055 986 986 1068 987 987 1069 974 974 1055 987 987 1069 975 975 1056 975 975 1056 987 987 1069 988 988 1070 975 975 1056 988 988 1070 976 976 1057 976 976 1057 988 988 1070 989 989 1071 976 976 1057 989 989 1071 977 977 1058 977 977 1058 989 989 1071 990 990 1072 977 977 1058 990 990 1072 978 978 1059 978 978 1059 990 990 1072 991 991 1073 978 978 1059 991 991 1073 979 979 1060 979 979 1060 991 991 1073 992 992 1074 979 979 1060 992 992 1074 980 980 1061 980 980 1061 992 992 1074 993 993 1075 980 980 1061 993 993 1075 981 981 1062 981 981 1062 993 993 1075 994 994 1076 981 981 1062 994 994 1076 982 982 1063 982 982 1063 994 994 1076 995 995 1077 982 982 1063 995 995 1077 983 983 1064 983 983 1064 995 995 1077 984 984 1078 983 983 1064 984 984 1078 972 972 1065 984 984 1066 996 996 1079 997 997 1080 984 984 1066 997 997 1080 985 985 1067 985 985 1067 997 997 1080 998 998 1081 985 985 1067 998 998 1081 986 986 1068 986 986 1068 998 998 1081 999 999 1082 986 986 1068 999 999 1082 987 987 1069 987 987 1069 999 999 1082 1000 1000 1083 987 987 1069 1000 1000 1083 988 988 1070 988 988 1070 1000 1000 1083 1001 1001 1084 988 988 1070 1001 1001 1084 989 989 1071 989 989 1071 1001 1001 1084 1002 1002 1085 989 989 1071 1002 1002 1085 990 990 1072 990 990 1072 1002 1002 1085 1003 1003 1086 990 990 1072 1003 1003 1086 991 991 1073 991 991 1073 1003 1003 1086 1004 1004 1087 991 991 1073 1004 1004 1087 992 992 1074 992 992 1074 1004 1004 1087 1005 1005 1088 992 992 1074 1005 1005 1088 993 993 1075 993 993 1075 1005 1005 1088 1006 1006 1089 993 993 1075 1006 1006 1089 994 994 1076 994 994 1076 1006 1006 1089 1007 1007 1090 994 994 1076 1007 1007 1090 995 995 1077 995 995 1077 1007 1007 1090 996 996 1091 995 995 1077 996 996 1091 984 984 1078 996 996 1079 1008 1008 1092 1009 1009 1093 996 996 1079 1009 1009 1093 997 997 1080 997 997 1080 1009 1009 1093 1010 1010 1094 997 997 1080 1010 1010 1094 998 998 1081 998 998 1081 1010 1010 1094 1011 1011 1095 998 998 1081 1011 1011 1095 999 999 1082 999 999 1082 1011 1011 1095 1012 1012 1096 999 999 1082 1012 1012 1096 1000 1000 1083 1000 1000 1083 1012 1012 1096 1013 1013 1097 1000 1000 1083 1013 1013 1097 1001 1001 1084 1001 1001 1084 1013 1013 1097 1014 1014 1098 1001 1001 1084 1014 1014 1098 1002 1002 1085 1002 1002 1085 1014 1014 1098 1015 1015 1099 1002 1002 1085 1015 1015 1099 1003 1003 1086 1003 1003 1086 1015 1015 1099 1016 1016 1100 1003 1003 1086 1016 1016 1100 1004 1004 1087 1004 1004 1087 1016 1016 1100 1017 1017 1101 1004 1004 1087 1017 1017 1101 1005 1005 1088 1005 1005 1088 1017 1017 1101 1018 1018 1102 1005 1005 1088 1018 1018 1102 1006 1006 1089 1006 1006 1089 1018 1018 1102 1019 1019 1103 1006 1006 1089 1019 1019 1103 1007 1007 1090 1007 1007 1090 1019 1019 1103 1008 1008 1104 1007 1007 1090 1008 1008 1104 996 996 1091 1008 1008 1092 1020 1020 1105 1021 1021 1106 1008 1008 1092 1021 1021 1106 1009 1009 1093 1009 1009 1093 1021 1021 1106 1022 1022 1107 1009 1009 1093 1022 1022 1107 1010 1010 1094 1010 1010 1094 1022 1022 1107 1023 1023 1108 1010 1010 1094 1023 1023 1108 1011 1011 1095 1011 1011 1095 1023 1023 1108 1024 1024 1109 1011 1011 1095 1024 1024 1109 1012 1012 1096 1012 1012 1096 1024 1024 1109 1025 1025 1110 1012 1012 1096 1025 1025 1110 1013 1013 1097 1013 1013 1097 1025 1025 1110 1026 1026 1111 1013 1013 1097 1026 1026 1111 1014 1014 1098 1014 1014 1098 1026 1026 1111 1027 1027 1112 1014 1014 1098 1027 1027 1112 1015 1015 1099 1015 1015 1099 1027 1027 1112 1028 1028 1113 1015 1015 1099 1028 1028 1113 1016 1016 1100 1016 1016 1100 1028 1028 1113 1029 1029 1114 1016 1016 1100 1029 1029 1114 1017 1017 1101 1017 1017 1101 1029 1029 1114 1030 1030 1115 1017 1017 1101 1030 1030 1115 1018 1018 1102 1018 1018 1102 1030 1030 1115 1031 1031 1116 1018 1018 1102 1031 1031 1116 1019 1019 1103 1019 1019 1103 1031 1031 1116 1020 1020 1117 1019 1019 1103 1020 1020 1117 1008 1008 1104 1020 1020 1105 1032 1032 1118 1033 1033 1119 1020 1020 1105 1033 1033 1119 1021 1021 1106 1021 1021 1106 1033 1033 1119 1034 1034 1120 1021 1021 1106 1034 1034 1120 1022 1022 1107 1022 1022 1107 1034 1034 1120 1035 1035 1121 1022 1022 1107 1035 1035 1121 1023 1023 1108 1023 1023 1108 1035 1035 1121 1036 1036 1122 1023 1023 1108 1036 1036 1122 1024 1024 1109 1024 1024 1109 1036 1036 1122 1037 1037 1123 1024 1024 1109 1037 1037 1123 1025 1025 1110 1025 1025 1110 1037 1037 1123 1038 1038 1124 1025 1025 1110 1038 1038 1124 1026 1026 1111 1026 1026 1111 1038 1038 1124 1039 1039 1125 1026 1026 1111 1039 1039 1125 1027 1027 1112 1027 1027 1112 1039 1039 1125 1040 1040 1126 1027 1027 1112 1040 1040 1126 1028 1028 1113 1028 1028 1113 1040 1040 1126 1041 1041 1127 1028 1028 1113 1041 1041 1127 1029 1029 1114 1029 1029 1114 1041 1041 1127 1042 1042 1128 1029 1029 1114 1042 1042 1128 1030 1030 1115 1030 1030 1115 1042 1042 1128 1043 1043 1129 1030 1030 1115 1043 1043 1129 1031 1031 1116 1031 1031 1116 1043 1043 1129 1032 1032 1130 1031 1031 1116 1032 1032 1130 1020 1020 1117 1032 1032 1118 1044 1044 1131 1045 1045 1132 1032 1032 1118 1045 1045 1132 1033 1033 1119 1033 1033 1119 1045 1045 1132 1046 1046 1133 1033 1033 1119 1046 1046 1133 1034 1034 1120 1034 1034 1120 1046 1046 1133 1047 1047 1134 1034 1034 1120 1047 1047 1134 1035 1035 1121 1035 1035 1121 1047 1047 1134 1048 1048 1135 1035 1035 1121 1048 1048 1135 1036 1036 1122 1036 1036 1122 1048 1048 1135 1049 1049 1136 1036 1036 1122 1049 1049 1136 1037 1037 1123 1037 1037 1123 1049 1049 1136 1050 1050 1137 1037 1037 1123 1050 1050 1137 1038 1038 1124 1038 1038 1124 1050 1050 1137 1051 1051 1138 1038 1038 1124 1051 1051 1138 1039 1039 1125 1039 1039 1125 1051 1051 1138 1052 1052 1139 1039 1039 1125 1052 1052 1139 1040 1040 1126 1040 1040 1126 1052 1052 1139 1053 1053 1140 1040 1040 1126 1053 1053 1140 1041 1041 1127 1041 1041 1127 1053 1053 1140 1054 1054 1141 1041 1041 1127 1054 1054 1141 1042 1042 1128 1042 1042 1128 1054 1054 1141 1055 1055 1142 1042 1042 1128 1055 1055 1142 1043 1043 1129 1043 1043 1129 1055 1055 1142 1044 1044 1143 1043 1043 1129 1044 1044 1143 1032 1032 1130 1044 1044 1131 1056 1056 1144 1057 1057 1145 1044 1044 1131 1057 1057 1145 1045 1045 1132 1045 1045 1132 1057 1057 1145 1058 1058 1146 1045 1045 1132 1058 1058 1146 1046 1046 1133 1046 1046 1133 1058 1058 1146 1059 1059 1147 1046 1046 1133 1059 1059 1147 1047 1047 1134 1047 1047 1134 1059 1059 1147 1060 1060 1148 1047 1047 1134 1060 1060 1148 1048 1048 1135 1048 1048 1135 1060 1060 1148 1061 1061 1149 1048 1048 1135 1061 1061 1149 1049 1049 1136 1049 1049 1136 1061 1061 1149 1062 1062 1150 1049 1049 1136 1062 1062 1150 1050 1050 1137 1050 1050 1137 1062 1062 1150 1063 1063 1151 1050 1050 1137 1063 1063 1151 1051 1051 1138 1051 1051 1138 1063 1063 1151 1064 1064 1152 1051 1051 1138 1064 1064 1152 1052 1052 1139 1052 1052 1139 1064 1064 1152 1065 1065 1153 1052 1052 1139 1065 1065 1153 1053 1053 1140 1053 1053 1140 1065 1065 1153 1066 1066 1154 1053 1053 1140 1066 1066 1154 1054 1054 1141 1054 1054 1141 1066 1066 1154 1067 1067 1155 1054 1054 1141 1067 1067 1155 1055 1055 1142 1055 1055 1142 1067 1067 1155 1056 1056 1156 1055 1055 1142 1056 1056 1156 1044 1044 1143 1056 1056 1144 1068 1068 1157 1069 1069 1158 1056 1056 1144 1069 1069 1158 1057 1057 1145 1057 1057 1145 1069 1069 1158 1070 1070 1159 1057 1057 1145 1070 1070 1159 1058 1058 1146 1058 1058 1146 1070 1070 1159 1071 1071 1160 1058 1058 1146 1071 1071 1160 1059 1059 1147 1059 1059 1147 1071 1071 1160 1072 1072 1161 1059 1059 1147 1072 1072 1161 1060 1060 1148 1060 1060 1148 1072 1072 1161 1073 1073 1162 1060 1060 1148 1073 1073 1162 1061 1061 1149 1061 1061 1149 1073 1073 1162 1074 1074 1163 1061 1061 1149 1074 1074 1163 1062 1062 1150 1062 1062 1150 1074 1074 1163 1075 1075 1164 1062 1062 1150 1075 1075 1164 1063 1063 1151 1063 1063 1151 1075 1075 1164 1076 1076 1165 1063 1063 1151 1076 1076 1165 1064 1064 1152 1064 1064 1152 1076 1076 1165 1077 1077 1166 1064 1064 1152 1077 1077 1166 1065 1065 1153 1065 1065 1153 1077 1077 1166 1078 1078 1167 1065 1065 1153 1078 1078 1167 1066 1066 1154 1066 1066 1154 1078 1078 1167 1079 1079 1168 1066 1066 1154 1079 1079 1168 1067 1067 1155 1067 1067 1155 1079 1079 1168 1068 1068 1169 1067 1067 1155 1068 1068 1169 1056 1056 1156 1068 1068 1157 1080 1080 1170 1081 1081 1171 1068 1068 1157 1081 1081 1171 1069 1069 1158 1069 1069 1158 1081 1081 1171 1082 1082 1172 1069 1069 1158 1082 1082 1172 1070 1070 1159 1070 1070 1159 1082 1082 1172 1083 1083 1173 1070 1070 1159 1083 1083 1173 1071 1071 1160 1071 1071 1160 1083 1083 1173 1084 1084 1174 1071 1071 1160 1084 1084 1174 1072 1072 1161 1072 1072 1161 1084 1084 1174 1085 1085 1175 1072 1072 1161 1085 1085 1175 1073 1073 1162 1073 1073 1162 1085 1085 1175 1086 1086 1176 1073 1073 1162 1086 1086 1176 1074 1074 1163 1074 1074 1163 1086 1086 1176 1087 1087 1177 1074 1074 1163 1087 1087 1177 1075 1075 1164 1075 1075 1164 1087 1087 1177 1088 1088 1178 1075 1075 1164 1088 1088 1178 1076 1076 1165 1076 1076 1165 1088 1088 1178 1089 1089 1179 1076 1076 1165 1089 1089 1179 1077 1077 1166 1077 1077 1166 1089 1089 1179 1090 1090 1180 1077 1077 1166 1090 1090 1180 1078 1078 1167 1078 1078 1167 1090 1090 1180 1091 1091 1181 1078 1078 1167 1091 1091 1181 1079 1079 1168 1079 1079 1168 1091 1091 1181 1080 1080 1182 1079 1079 1168 1080 1080 1182 1068 1068 1169 1080 1080 1170 1092 1092 1183 1093 1093 1184 1080 1080 1170 1093 1093 1184 1081 1081 1171 1081 1081 1171 1093 1093 1184 1094 1094 1185 1081 1081 1171 1094 1094 1185 1082 1082 1172 1082 1082 1172 1094 1094 1185 1095 1095 1186 1082 1082 1172 1095 1095 1186 1083 1083 1173 1083 1083 1173 1095 1095 1186 1096 1096 1187 1083 1083 1173 1096 1096 1187 1084 1084 1174 1084 1084 1174 1096 1096 1187 1097 1097 1188 1084 1084 1174 1097 1097 1188 1085 1085 1175 1085 1085 1175 1097 1097 1188 1098 1098 1189 1085 1085 1175 1098 1098 1189 1086 1086 1176 1086 1086 1176 1098 1098 1189 1099 1099 1190 1086 1086 1176 1099 1099 1190 1087 1087 1177 1087 1087 1177 1099 1099 1190 1100 1100 1191 1087 1087 1177 1100 1100 1191 1088 1088 1178 1088 1088 1178 1100 1100 1191 1101 1101 1192 1088 1088 1178 1101 1101 1192 1089 1089 1179 1089 1089 1179 1101 1101 1192 1102 1102 1193 1089 1089 1179 1102 1102 1193 1090 1090 1180 1090 1090 1180 1102 1102 1193 1103 1103 1194 1090 1090 1180 1103 1103 1194 1091 1091 1181 1091 1091 1181 1103 1103 1194 1092 1092 1195 1091 1091 1181 1092 1092 1195 1080 1080 1182 1092 1092 1183 1104 1104 1196 1105 1105 1197 1092 1092 1183 1105 1105 1197 1093 1093 1184 1093 1093 1184 1105 1105 1197 1106 1106 1198 1093 1093 1184 1106 1106 1198 1094 1094 1185 1094 1094 1185 1106 1106 1198 1107 1107 1199 1094 1094 1185 1107 1107 1199 1095 1095 1186 1095 1095 1186 1107 1107 1199 1108 1108 1200 1095 1095 1186 1108 1108 1200 1096 1096 1187 1096 1096 1187 1108 1108 1200 1109 1109 1201 1096 1096 1187 1109 1109 1201 1097 1097 1188 1097 1097 1188 1109 1109 1201 1110 1110 1202 1097 1097 1188 1110 1110 1202 1098 1098 1189 1098 1098 1189 1110 1110 1202 1111 1111 1203 1098 1098 1189 1111 1111 1203 1099 1099 1190 1099 1099 1190 1111 1111 1203 1112 1112 1204 1099 1099 1190 1112 1112 1204 1100 1100 1191 1100 1100 1191 1112 1112 1204 1113 1113 1205 1100 1100 1191 1113 1113 1205 1101 1101 1192 1101 1101 1192 1113 1113 1205 1114 1114 1206 1101 1101 1192 1114 1114 1206 1102 1102 1193 1102 1102 1193 1114 1114 1206 1115 1115 1207 1102 1102 1193 1115 1115 1207 1103 1103 1194 1103 1103 1194 1115 1115 1207 1104 1104 1208 1103 1103 1194 1104 1104 1208 1092 1092 1195 1104 1104 1196 1116 1116 1209 1117 1117 1210 1104 1104 1196 1117 1117 1210 1105 1105 1197 1105 1105 1197 1117 1117 1210 1118 1118 1211 1105 1105 1197 1118 1118 1211 1106 1106 1198 1106 1106 1198 1118 1118 1211 1119 1119 1212 1106 1106 1198 1119 1119 1212 1107 1107 1199 1107 1107 1199 1119 1119 1212 1120 1120 1213 1107 1107 1199 1120 1120 1213 1108 1108 1200 1108 1108 1200 1120 1120 1213 1121 1121 1214 1108 1108 1200 1121 1121 1214 1109 1109 1201 1109 1109 1201 1121 1121 1214 1122 1122 1215 1109 1109 1201 1122 1122 1215 1110 1110 1202 1110 1110 1202 1122 1122 1215 1123 1123 1216 1110 1110 1202 1123 1123 1216 1111 1111 1203 1111 1111 1203 1123 1123 1216 1124 1124 1217 1111 1111 1203 1124 1124 1217 1112 1112 1204 1112 1112 1204 1124 1124 1217 1125 1125 1218 1112 1112 1204 1125 1125 1218 1113 1113 1205 1113 1113 1205 1125 1125 1218 1126 1126 1219 1113 1113 1205 1126 1126 1219 1114 1114 1206 1114 1114 1206 1126 1126 1219 1127 1127 1220 1114 1114 1206 1127 1127 1220 1115 1115 1207 1115 1115 1207 1127 1127 1220 1116 1116 1221 1115 1115 1207 1116 1116 1221 1104 1104 1208 1116 1116 1209 1128 1128 1222 1129 1129 1223 1116 1116 1209 1129 1129 1223 1117 1117 1210 1117 1117 1210 1129 1129 1223 1130 1130 1224 1117 1117 1210 1130 1130 1224 1118 1118 1211 1118 1118 1211 1130 1130 1224 1131 1131 1225 1118 1118 1211 1131 1131 1225 1119 1119 1212 1119 1119 1212 1131 1131 1225 1132 1132 1226 1119 1119 1212 1132 1132 1226 1120 1120 1213 1120 1120 1213 1132 1132 1226 1133 1133 1227 1120 1120 1213 1133 1133 1227 1121 1121 1214 1121 1121 1214 1133 1133 1227 1134 1134 1228 1121 1121 1214 1134 1134 1228 1122 1122 1215 1122 1122 1215 1134 1134 1228 1135 1135 1229 1122 1122 1215 1135 1135 1229 1123 1123 1216 1123 1123 1216 1135 1135 1229 1136 1136 1230 1123 1123 1216 1136 1136 1230 1124 1124 1217 1124 1124 1217 1136 1136 1230 1137 1137 1231 1124 1124 1217 1137 1137 1231 1125 1125 1218 1125 1125 1218 1137 1137 1231 1138 1138 1232 1125 1125 1218 1138 1138 1232 1126 1126 1219 1126 1126 1219 1138 1138 1232 1139 1139 1233 1126 1126 1219 1139 1139 1233 1127 1127 1220 1127 1127 1220 1139 1139 1233 1128 1128 1234 1127 1127 1220 1128 1128 1234 1116 1116 1221 1128 1128 1222 1140 1140 1235 1141 1141 1236 1128 1128 1222 1141 1141 1236 1129 1129 1223 1129 1129 1223 1141 1141 1236 1142 1142 1237 1129 1129 1223 1142 1142 1237 1130 1130 1224 1130 1130 1224 1142 1142 1237 1143 1143 1238 1130 1130 1224 1143 1143 1238 1131 1131 1225 1131 1131 1225 1143 1143 1238 1144 1144 1239 1131 1131 1225 1144 1144 1239 1132 1132 1226 1132 1132 1226 1144 1144 1239 1145 1145 1240 1132 1132 1226 1145 1145 1240 1133 1133 1227 1133 1133 1227 1145 1145 1240 1146 1146 1241 1133 1133 1227 1146 1146 1241 1134 1134 1228 1134 1134 1228 1146 1146 1241 1147 1147 1242 1134 1134 1228 1147 1147 1242 1135 1135 1229 1135 1135 1229 1147 1147 1242 1148 1148 1243 1135 1135 1229 1148 1148 1243 1136 1136 1230 1136 1136 1230 1148 1148 1243 1149 1149 1244 1136 1136 1230 1149 1149 1244 1137 1137 1231 1137 1137 1231 1149 1149 1244 1150 1150 1245 1137 1137 1231 1150 1150 1245 1138 1138 1232 1138 1138 1232 1150 1150 1245 1151 1151 1246 1138 1138 1232 1151 1151 1246 1139 1139 1233 1139 1139 1233 1151 1151 1246 1140 1140 1247 1139 1139 1233 1140 1140 1247 1128 1128 1234 1140 1140 1235 1152 1152 1248 1153 1153 1249 1140 1140 1235 1153 1153 1249 1141 1141 1236 1141 1141 1236 1153 1153 1249 1154 1154 1250 1141 1141 1236 1154 1154 1250 1142 1142 1237 1142 1142 1237 1154 1154 1250 1155 1155 1251 1142 1142 1237 1155 1155 1251 1143 1143 1238 1143 1143 1238 1155 1155 1251 1156 1156 1252 1143 1143 1238 1156 1156 1252 1144 1144 1239 1144 1144 1239 1156 1156 1252 1157 1157 1253 1144 1144 1239 1157 1157 1253 1145 1145 1240 1145 1145 1240 1157 1157 1253 1158 1158 1254 1145 1145 1240 1158 1158 1254 1146 1146 1241 1146 1146 1241 1158 1158 1254 1159 1159 1255 1146 1146 1241 1159 1159 1255 1147 1147 1242 1147 1147 1242 1159 1159 1255 1160 1160 1256 1147 1147 1242 1160 1160 1256 1148 1148 1243 1148 1148 1243 1160 1160 1256 1161 1161 1257 1148 1148 1243 1161 1161 1257 1149 1149 1244 1149 1149 1244 1161 1161 1257 1162 1162 1258 1149 1149 1244 1162 1162 1258 1150 1150 1245 1150 1150 1245 1162 1162 1258 1163 1163 1259 1150 1150 1245 1163 1163 1259 1151 1151 1246 1151 1151 1246 1163 1163 1259 1152 1152 1260 1151 1151 1246 1152 1152 1260 1140 1140 1247 1152 1152 1248 1164 1164 1261 1165 1165 1262 1152 1152 1248 1165 1165 1262 1153 1153 1249 1153 1153 1249 1165 1165 1262 1166 1166 1263 1153 1153 1249 1166 1166 1263 1154 1154 1250 1154 1154 1250 1166 1166 1263 1167 1167 1264 1154 1154 1250 1167 1167 1264 1155 1155 1251 1155 1155 1251 1167 1167 1264 1168 1168 1265 1155 1155 1251 1168 1168 1265 1156 1156 1252 1156 1156 1252 1168 1168 1265 1169 1169 1266 1156 1156 1252 1169 1169 1266 1157 1157 1253 1157 1157 1253 1169 1169 1266 1170 1170 1267 1157 1157 1253 1170 1170 1267 1158 1158 1254 1158 1158 1254 1170 1170 1267 1171 1171 1268 1158 1158 1254 1171 1171 1268 1159 1159 1255 1159 1159 1255 1171 1171 1268 1172 1172 1269 1159 1159 1255 1172 1172 1269 1160 1160 1256 1160 1160 1256 1172 1172 1269 1173 1173 1270 1160 1160 1256 1173 1173 1270 1161 1161 1257 1161 1161 1257 1173 1173 1270 1174 1174 1271 1161 1161 1257 1174 1174 1271 1162 1162 1258 1162 1162 1258 1174 1174 1271 1175 1175 1272 1162 1162 1258 1175 1175 1272 1163 1163 1259 1163 1163 1259 1175 1175 1272 1164 1164 1273 1163 1163 1259 1164 1164 1273 1152 1152 1260 1164 1164 1261 1176 1176 1274 1177 1177 1275 1164 1164 1261 1177 1177 1275 1165 1165 1262 1165 1165 1262 1177 1177 1275 1178 1178 1276 1165 1165 1262 1178 1178 1276 1166 1166 1263 1166 1166 1263 1178 1178 1276 1179 1179 1277 1166 1166 1263 1179 1179 1277 1167 1167 1264 1167 1167 1264 1179 1179 1277 1180 1180 1278 1167 1167 1264 1180 1180 1278 1168 1168 1265 1168 1168 1265 1180 1180 1278 1181 1181 1279 1168 1168 1265 1181 1181 1279 1169 1169 1266 1169 1169 1266 1181 1181 1279 1182 1182 1280 1169 1169 1266 1182 1182 1280 1170 1170 1267 1170 1170 1267 1182 1182 1280 1183 1183 1281 1170 1170 1267 1183 1183 1281 1171 1171 1268 1171 1171 1268 1183 1183 1281 1184 1184 1282 1171 1171 1268 1184 1184 1282 1172 1172 1269 1172 1172 1269 1184 1184 1282 1185 1185 1283 1172 1172 1269 1185 1185 1283 1173 1173 1270 1173 1173 1270 1185 1185 1283 1186 1186 1284 1173 1173 1270 1186 1186 1284 1174 1174 1271 1174 1174 1271 1186 1186 1284 1187 1187 1285 1174 1174 1271 1187 1187 1285 1175 1175 1272 1175 1175 1272 1187 1187 1285 1176 1176 1286 1175 1175 1272 1176 1176 1286 1164 1164 1273 1176 1176 1274 1188 1188 1287 1189 1189 1288 1176 1176 1274 1189 1189 1288 1177 1177 1275 1177 1177 1275 1189 1189 1288 1190 1190 1289 1177 1177 1275 1190 1190 1289 1178 1178 1276 1178 1178 1276 1190 1190 1289 1191 1191 1290 1178 1178 1276 1191 1191 1290 1179 1179 1277 1179 1179 1277 1191 1191 1290 1192 1192 1291 1179 1179 1277 1192 1192 1291 1180 1180 1278 1180 1180 1278 1192 1192 1291 1193 1193 1292 1180 1180 1278 1193 1193 1292 1181 1181 1279 1181 1181 1279 1193 1193 1292 1194 1194 1293 1181 1181 1279 1194 1194 1293 1182 1182 1280 1182 1182 1280 1194 1194 1293 1195 1195 1294 1182 1182 1280 1195 1195 1294 1183 1183 1281 1183 1183 1281 1195 1195 1294 1196 1196 1295 1183 1183 1281 1196 1196 1295 1184 1184 1282 1184 1184 1282 1196 1196 1295 1197 1197 1296 1184 1184 1282 1197 1197 1296 1185 1185 1283 1185 1185 1283 1197 1197 1296 1198 1198 1297 1185 1185 1283 1198 1198 1297 1186 1186 1284 1186 1186 1284 1198 1198 1297 1199 1199 1298 1186 1186 1284 1199 1199 1298 1187 1187 1285 1187 1187 1285 1199 1199 1298 1188 1188 1299 1187 1187 1285 1188 1188 1299 1176 1176 1286 1188 1188 1287 1200 1200 1300 1201 1201 1301 1188 1188 1287 1201 1201 1301 1189 1189 1288 1189 1189 1288 1201 1201 1301 1202 1202 1302 1189 1189 1288 1202 1202 1302 1190 1190 1289 1190 1190 1289 1202 1202 1302 1203 1203 1303 1190 1190 1289 1203 1203 1303 1191 1191 1290 1191 1191 1290 1203 1203 1303 1204 1204 1304 1191 1191 1290 1204 1204 1304 1192 1192 1291 1192 1192 1291 1204 1204 1304 1205 1205 1305 1192 1192 1291 1205 1205 1305 1193 1193 1292 1193 1193 1292 1205 1205 1305 1206 1206 1306 1193 1193 1292 1206 1206 1306 1194 1194 1293 1194 1194 1293 1206 1206 1306 1207 1207 1307 1194 1194 1293 1207 1207 1307 1195 1195 1294 1195 1195 1294 1207 1207 1307 1208 1208 1308 1195 1195 1294 1208 1208 1308 1196 1196 1295 1196 1196 1295 1208 1208 1308 1209 1209 1309 1196 1196 1295 1209 1209 1309 1197 1197 1296 1197 1197 1296 1209 1209 1309 1210 1210 1310 1197 1197 1296 1210 1210 1310 1198 1198 1297 1198 1198 1297 1210 1210 1310 1211 1211 1311 1198 1198 1297 1211 1211 1311 1199 1199 1298 1199 1199 1298 1211 1211 1311 1200 1200 1312 1199 1199 1298 1200 1200 1312 1188 1188 1299 1200 1200 1300 1212 1212 1313 1213 1213 1314 1200 1200 1300 1213 1213 1314 1201 1201 1301 1201 1201 1301 1213 1213 1314 1214 1214 1315 1201 1201 1301 1214 1214 1315 1202 1202 1302 1202 1202 1302 1214 1214 1315 1215 1215 1316 1202 1202 1302 1215 1215 1316 1203 1203 1303 1203 1203 1303 1215 1215 1316 1216 1216 1317 1203 1203 1303 1216 1216 1317 1204 1204 1304 1204 1204 1304 1216 1216 1317 1217 1217 1318 1204 1204 1304 1217 1217 1318 1205 1205 1305 1205 1205 1305 1217 1217 1318 1218 1218 1319 1205 1205 1305 1218 1218 1319 1206 1206 1306 1206 1206 1306 1218 1218 1319 1219 1219 1320 1206 1206 1306 1219 1219 1320 1207 1207 1307 1207 1207 1307 1219 1219 1320 1220 1220 1321 1207 1207 1307 1220 1220 1321 1208 1208 1308 1208 1208 1308 1220 1220 1321 1221 1221 1322 1208 1208 1308 1221 1221 1322 1209 1209 1309 1209 1209 1309 1221 1221 1322 1222 1222 1323 1209 1209 1309 1222 1222 1323 1210 1210 1310 1210 1210 1310 1222 1222 1323 1223 1223 1324 1210 1210 1310 1223 1223 1324 1211 1211 1311 1211 1211 1311 1223 1223 1324 1212 1212 1325 1211 1211 1311 1212 1212 1325 1200 1200 1312 1212 1212 1313 1224 1224 1326 1225 1225 1327 1212 1212 1313 1225 1225 1327 1213 1213 1314 1213 1213 1314 1225 1225 1327 1226 1226 1328 1213 1213 1314 1226 1226 1328 1214 1214 1315 1214 1214 1315 1226 1226 1328 1227 1227 1329 1214 1214 1315 1227 1227 1329 1215 1215 1316 1215 1215 1316 1227 1227 1329 1228 1228 1330 1215 1215 1316 1228 1228 1330 1216 1216 1317 1216 1216 1317 1228 1228 1330 1229 1229 1331 1216 1216 1317 1229 1229 1331 1217 1217 1318 1217 1217 1318 1229 1229 1331 1230 1230 1332 1217 1217 1318 1230 1230 1332 1218 1218 1319 1218 1218 1319 1230 1230 1332 1231 1231 1333 1218 1218 1319 1231 1231 1333 1219 1219 1320 1219 1219 1320 1231 1231 1333 1232 1232 1334 1219 1219 1320 1232 1232 1334 1220 1220 1321 1220 1220 1321 1232 1232 1334 1233 1233 1335 1220 1220 1321 1233 1233 1335 1221 1221 1322 1221 1221 1322 1233 1233 1335 1234 1234 1336 1221 1221 1322 1234 1234 1336 1222 1222 1323 1222 1222 1323 1234 1234 1336 1235 1235 1337 1222 1222 1323 1235 1235 1337 1223 1223 1324 1223 1223 1324 1235 1235 1337 1224 1224 1338 1223 1223 1324 1224 1224 1338 1212 1212 1325 1224 1224 1326 1236 1236 1339 1237 1237 1340 1224 1224 1326 1237 1237 1340 1225 1225 1327 1225 1225 1327 1237 1237 1340 1238 1238 1341 1225 1225 1327 1238 1238 1341 1226 1226 1328 1226 1226 1328 1238 1238 1341 1239 1239 1342 1226 1226 1328 1239 1239 1342 1227 1227 1329 1227 1227 1329 1239 1239 1342 1240 1240 1343 1227 1227 1329 1240 1240 1343 1228 1228 1330 1228 1228 1330 1240 1240 1343 1241 1241 1344 1228 1228 1330 1241 1241 1344 1229 1229 1331 1229 1229 1331 1241 1241 1344 1242 1242 1345 1229 1229 1331 1242 1242 1345 1230 1230 1332 1230 1230 1332 1242 1242 1345 1243 1243 1346 1230 1230 1332 1243 1243 1346 1231 1231 1333 1231 1231 1333 1243 1243 1346 1244 1244 1347 1231 1231 1333 1244 1244 1347 1232 1232 1334 1232 1232 1334 1244 1244 1347 1245 1245 1348 1232 1232 1334 1245 1245 1348 1233 1233 1335 1233 1233 1335 1245 1245 1348 1246 1246 1349 1233 1233 1335 1246 1246 1349 1234 1234 1336 1234 1234 1336 1246 1246 1349 1247 1247 1350 1234 1234 1336 1247 1247 1350 1235 1235 1337 1235 1235 1337 1247 1247 1350 1236 1236 1351 1235 1235 1337 1236 1236 1351 1224 1224 1338 1236 1236 1339 1248 1248 1352 1249 1249 1353 1236 1236 1339 1249 1249 1353 1237 1237 1340 1237 1237 1340 1249 1249 1353 1250 1250 1354 1237 1237 1340 1250 1250 1354 1238 1238 1341 1238 1238 1341 1250 1250 1354 1251 1251 1355 1238 1238 1341 1251 1251 1355 1239 1239 1342 1239 1239 1342 1251 1251 1355 1252 1252 1356 1239 1239 1342 1252 1252 1356 1240 1240 1343 1240 1240 1343 1252 1252 1356 1253 1253 1357 1240 1240 1343 1253 1253 1357 1241 1241 1344 1241 1241 1344 1253 1253 1357 1254 1254 1358 1241 1241 1344 1254 1254 1358 1242 1242 1345 1242 1242 1345 1254 1254 1358 1255 1255 1359 1242 1242 1345 1255 1255 1359 1243 1243 1346 1243 1243 1346 1255 1255 1359 1256 1256 1360 1243 1243 1346 1256 1256 1360 1244 1244 1347 1244 1244 1347 1256 1256 1360 1257 1257 1361 1244 1244 1347 1257 1257 1361 1245 1245 1348 1245 1245 1348 1257 1257 1361 1258 1258 1362 1245 1245 1348 1258 1258 1362 1246 1246 1349 1246 1246 1349 1258 1258 1362 1259 1259 1363 1246 1246 1349 1259 1259 1363 1247 1247 1350 1247 1247 1350 1259 1259 1363 1248 1248 1364 1247 1247 1350 1248 1248 1364 1236 1236 1351 1248 1248 1352 1260 1260 1365 1261 1261 1366 1248 1248 1352 1261 1261 1366 1249 1249 1353 1249 1249 1353 1261 1261 1366 1262 1262 1367 1249 1249 1353 1262 1262 1367 1250 1250 1354 1250 1250 1354 1262 1262 1367 1263 1263 1368 1250 1250 1354 1263 1263 1368 1251 1251 1355 1251 1251 1355 1263 1263 1368 1264 1264 1369 1251 1251 1355 1264 1264 1369 1252 1252 1356 1252 1252 1356 1264 1264 1369 1265 1265 1370 1252 1252 1356 1265 1265 1370 1253 1253 1357 1253 1253 1357 1265 1265 1370 1266 1266 1371 1253 1253 1357 1266 1266 1371 1254 1254 1358 1254 1254 1358 1266 1266 1371 1267 1267 1372 1254 1254 1358 1267 1267 1372 1255 1255 1359 1255 1255 1359 1267 1267 1372 1268 1268 1373 1255 1255 1359 1268 1268 1373 1256 1256 1360 1256 1256 1360 1268 1268 1373 1269 1269 1374 1256 1256 1360 1269 1269 1374 1257 1257 1361 1257 1257 1361 1269 1269 1374 1270 1270 1375 1257 1257 1361 1270 1270 1375 1258 1258 1362 1258 1258 1362 1270 1270 1375 1271 1271 1376 1258 1258 1362 1271 1271 1376 1259 1259 1363 1259 1259 1363 1271 1271 1376 1260 1260 1377 1259 1259 1363 1260 1260 1377 1248 1248 1364 1260 1260 1365 1272 1272 1378 1273 1273 1379 1260 1260 1365 1273 1273 1379 1261 1261 1366 1261 1261 1366 1273 1273 1379 1274 1274 1380 1261 1261 1366 1274 1274 1380 1262 1262 1367 1262 1262 1367 1274 1274 1380 1275 1275 1381 1262 1262 1367 1275 1275 1381 1263 1263 1368 1263 1263 1368 1275 1275 1381 1276 1276 1382 1263 1263 1368 1276 1276 1382 1264 1264 1369 1264 1264 1369 1276 1276 1382 1277 1277 1383 1264 1264 1369 1277 1277 1383 1265 1265 1370 1265 1265 1370 1277 1277 1383 1278 1278 1384 1265 1265 1370 1278 1278 1384 1266 1266 1371 1266 1266 1371 1278 1278 1384 1279 1279 1385 1266 1266 1371 1279 1279 1385 1267 1267 1372 1267 1267 1372 1279 1279 1385 1280 1280 1386 1267 1267 1372 1280 1280 1386 1268 1268 1373 1268 1268 1373 1280 1280 1386 1281 1281 1387 1268 1268 1373 1281 1281 1387 1269 1269 1374 1269 1269 1374 1281 1281 1387 1282 1282 1388 1269 1269 1374 1282 1282 1388 1270 1270 1375 1270 1270 1375 1282 1282 1388 1283 1283 1389 1270 1270 1375 1283 1283 1389 1271 1271 1376 1271 1271 1376 1283 1283 1389 1272 1272 1390 1271 1271 1376 1272 1272 1390 1260 1260 1377 1272 1272 1378 1284 1284 1391 1285 1285 1392 1272 1272 1378 1285 1285 1392 1273 1273 1379 1273 1273 1379 1285 1285 1392 1286 1286 1393 1273 1273 1379 1286 1286 1393 1274 1274 1380 1274 1274 1380 1286 1286 1393 1287 1287 1394 1274 1274 1380 1287 1287 1394 1275 1275 1381 1275 1275 1381 1287 1287 1394 1288 1288 1395 1275 1275 1381 1288 1288 1395 1276 1276 1382 1276 1276 1382 1288 1288 1395 1289 1289 1396 1276 1276 1382 1289 1289 1396 1277 1277 1383 1277 1277 1383 1289 1289 1396 1290 1290 1397 1277 1277 1383 1290 1290 1397 1278 1278 1384 1278 1278 1384 1290 1290 1397 1291 1291 1398 1278 1278 1384 1291 1291 1398 1279 1279 1385 1279 1279 1385 1291 1291 1398 1292 1292 1399 1279 1279 1385 1292 1292 1399 1280 1280 1386 1280 1280 1386 1292 1292 1399 1293 1293 1400 1280 1280 1386 1293 1293 1400 1281 1281 1387 1281 1281 1387 1293 1293 1400 1294 1294 1401 1281 1281 1387 1294 1294 1401 1282 1282 1388 1282 1282 1388 1294 1294 1401 1295 1295 1402 1282 1282 1388 1295 1295 1402 1283 1283 1389 1283 1283 1389 1295 1295 1402 1284 1284 1403 1283 1283 1389 1284 1284 1403 1272 1272 1390 1284 1284 1391 1296 1296 1404 1297 1297 1405 1284 1284 1391 1297 1297 1405 1285 1285 1392 1285 1285 1392 1297 1297 1405 1298 1298 1406 1285 1285 1392 1298 1298 1406 1286 1286 1393 1286 1286 1393 1298 1298 1406 1299 1299 1407 1286 1286 1393 1299 1299 1407 1287 1287 1394 1287 1287 1394 1299 1299 1407 1300 1300 1408 1287 1287 1394 1300 1300 1408 1288 1288 1395 1288 1288 1395 1300 1300 1408 1301 1301 1409 1288 1288 1395 1301 1301 1409 1289 1289 1396 1289 1289 1396 1301 1301 1409 1302 1302 1410 1289 1289 1396 1302 1302 1410 1290 1290 1397 1290 1290 1397 1302 1302 1410 1303 1303 1411 1290 1290 1397 1303 1303 1411 1291 1291 1398 1291 1291 1398 1303 1303 1411 1304 1304 1412 1291 1291 1398 1304 1304 1412 1292 1292 1399 1292 1292 1399 1304 1304 1412 1305 1305 1413 1292 1292 1399 1305 1305 1413 1293 1293 1400 1293 1293 1400 1305 1305 1413 1306 1306 1414 1293 1293 1400 1306 1306 1414 1294 1294 1401 1294 1294 1401 1306 1306 1414 1307 1307 1415 1294 1294 1401 1307 1307 1415 1295 1295 1402 1295 1295 1402 1307 1307 1415 1296 1296 1416 1295 1295 1402 1296 1296 1416 1284 1284 1403 1296 1296 1404 1308 1308 1417 1309 1309 1418 1296 1296 1404 1309 1309 1418 1297 1297 1405 1297 1297 1405 1309 1309 1418 1310 1310 1419 1297 1297 1405 1310 1310 1419 1298 1298 1406 1298 1298 1406 1310 1310 1419 1311 1311 1420 1298 1298 1406 1311 1311 1420 1299 1299 1407 1299 1299 1407 1311 1311 1420 1312 1312 1421 1299 1299 1407 1312 1312 1421 1300 1300 1408 1300 1300 1408 1312 1312 1421 1313 1313 1422 1300 1300 1408 1313 1313 1422 1301 1301 1409 1301 1301 1409 1313 1313 1422 1314 1314 1423 1301 1301 1409 1314 1314 1423 1302 1302 1410 1302 1302 1410 1314 1314 1423 1315 1315 1424 1302 1302 1410 1315 1315 1424 1303 1303 1411 1303 1303 1411 1315 1315 1424 1316 1316 1425 1303 1303 1411 1316 1316 1425 1304 1304 1412 1304 1304 1412 1316 1316 1425 1317 1317 1426 1304 1304 1412 1317 1317 1426 1305 1305 1413 1305 1305 1413 1317 1317 1426 1318 1318 1427 1305 1305 1413 1318 1318 1427 1306 1306 1414 1306 1306 1414 1318 1318 1427 1319 1319 1428 1306 1306 1414 1319 1319 1428 1307 1307 1415 1307 1307 1415 1319 1319 1428 1308 1308 1429 1307 1307 1415 1308 1308 1429 1296 1296 1416 1308 1308 1417 1320 1320 1430 1321 1321 1431 1308 1308 1417 1321 1321 1431 1309 1309 1418 1309 1309 1418 1321 1321 1431 1322 1322 1432 1309 1309 1418 1322 1322 1432 1310 1310 1419 1310 1310 1419 1322 1322 1432 1323 1323 1433 1310 1310 1419 1323 1323 1433 1311 1311 1420 1311 1311 1420 1323 1323 1433 1324 1324 1434 1311 1311 1420 1324 1324 1434 1312 1312 1421 1312 1312 1421 1324 1324 1434 1325 1325 1435 1312 1312 1421 1325 1325 1435 1313 1313 1422 1313 1313 1422 1325 1325 1435 1326 1326 1436 1313 1313 1422 1326 1326 1436 1314 1314 1423 1314 1314 1423 1326 1326 1436 1327 1327 1437 1314 1314 1423 1327 1327 1437 1315 1315 1424 1315 1315 1424 1327 1327 1437 1328 1328 1438 1315 1315 1424 1328 1328 1438 1316 1316 1425 1316 1316 1425 1328 1328 1438 1329 1329 1439 1316 1316 1425 1329 1329 1439 1317 1317 1426 1317 1317 1426 1329 1329 1439 1330 1330 1440 1317 1317 1426 1330 1330 1440 1318 1318 1427 1318 1318 1427 1330 1330 1440 1331 1331 1441 1318 1318 1427 1331 1331 1441 1319 1319 1428 1319 1319 1428 1331 1331 1441 1320 1320 1442 1319 1319 1428 1320 1320 1442 1308 1308 1429 1320 1320 1430 1332 1332 1443 1333 1333 1444 1320 1320 1430 1333 1333 1444 1321 1321 1431 1321 1321 1431 1333 1333 1444 1334 1334 1445 1321 1321 1431 1334 1334 1445 1322 1322 1432 1322 1322 1432 1334 1334 1445 1335 1335 1446 1322 1322 1432 1335 1335 1446 1323 1323 1433 1323 1323 1433 1335 1335 1446 1336 1336 1447 1323 1323 1433 1336 1336 1447 1324 1324 1434 1324 1324 1434 1336 1336 1447 1337 1337 1448 1324 1324 1434 1337 1337 1448 1325 1325 1435 1325 1325 1435 1337 1337 1448 1338 1338 1449 1325 1325 1435 1338 1338 1449 1326 1326 1436 1326 1326 1436 1338 1338 1449 1339 1339 1450 1326 1326 1436 1339 1339 1450 1327 1327 1437 1327 1327 1437 1339 1339 1450 1340 1340 1451 1327 1327 1437 1340 1340 1451 1328 1328 1438 1328 1328 1438 1340 1340 1451 1341 1341 1452 1328 1328 1438 1341 1341 1452 1329 1329 1439 1329 1329 1439 1341 1341 1452 1342 1342 1453 1329 1329 1439 1342 1342 1453 1330 1330 1440 1330 1330 1440 1342 1342 1453 1343 1343 1454 1330 1330 1440 1343 1343 1454 1331 1331 1441 1331 1331 1441 1343 1343 1454 1332 1332 1455 1331 1331 1441 1332 1332 1455 1320 1320 1442 1332 1332 1443 1344 1344 1456 1345 1345 1457 1332 1332 1443 1345 1345 1457 1333 1333 1444 1333 1333 1444 1345 1345 1457 1346 1346 1458 1333 1333 1444 1346 1346 1458 1334 1334 1445 1334 1334 1445 1346 1346 1458 1347 1347 1459 1334 1334 1445 1347 1347 1459 1335 1335 1446 1335 1335 1446 1347 1347 1459 1348 1348 1460 1335 1335 1446 1348 1348 1460 1336 1336 1447 1336 1336 1447 1348 1348 1460 1349 1349 1461 1336 1336 1447 1349 1349 1461 1337 1337 1448 1337 1337 1448 1349 1349 1461 1350 1350 1462 1337 1337 1448 1350 1350 1462 1338 1338 1449 1338 1338 1449 1350 1350 1462 1351 1351 1463 1338 1338 1449 1351 1351 1463 1339 1339 1450 1339 1339 1450 1351 1351 1463 1352 1352 1464 1339 1339 1450 1352 1352 1464 1340 1340 1451 1340 1340 1451 1352 1352 1464 1353 1353 1465 1340 1340 1451 1353 1353 1465 1341 1341 1452 1341 1341 1452 1353 1353 1465 1354 1354 1466 1341 1341 1452 1354 1354 1466 1342 1342 1453 1342 1342 1453 1354 1354 1466 1355 1355 1467 1342 1342 1453 1355 1355 1467 1343 1343 1454 1343 1343 1454 1355 1355 1467 1344 1344 1468 1343 1343 1454 1344 1344 1468 1332 1332 1455 1344 1344 1456 1356 1356 1469 1357 1357 1470 1344 1344 1456 1357 1357 1470 1345 1345 1457 1345 1345 1457 1357 1357 1470 1358 1358 1471 1345 1345 1457 1358 1358 1471 1346 1346 1458 1346 1346 1458 1358 1358 1471 1359 1359 1472 1346 1346 1458 1359 1359 1472 1347 1347 1459 1347 1347 1459 1359 1359 1472 1360 1360 1473 1347 1347 1459 1360 1360 1473 1348 1348 1460 1348 1348 1460 1360 1360 1473 1361 1361 1474 1348 1348 1460 1361 1361 1474 1349 1349 1461 1349 1349 1461 1361 1361 1474 1362 1362 1475 1349 1349 1461 1362 1362 1475 1350 1350 1462 1350 1350 1462 1362 1362 1475 1363 1363 1476 1350 1350 1462 1363 1363 1476 1351 1351 1463 1351 1351 1463 1363 1363 1476 1364 1364 1477 1351 1351 1463 1364 1364 1477 1352 1352 1464 1352 1352 1464 1364 1364 1477 1365 1365 1478 1352 1352 1464 1365 1365 1478 1353 1353 1465 1353 1353 1465 1365 1365 1478 1366 1366 1479 1353 1353 1465 1366 1366 1479 1354 1354 1466 1354 1354 1466 1366 1366 1479 1367 1367 1480 1354 1354 1466 1367 1367 1480 1355 1355 1467 1355 1355 1467 1367 1367 1480 1356 1356 1481 1355 1355 1467 1356 1356 1481 1344 1344 1468 1356 1356 1469 1368 1368 1482 1369 1369 1483 1356 1356 1469 1369 1369 1483 1357 1357 1470 1357 1357 1470 1369 1369 1483 1370 1370 1484 1357 1357 1470 1370 1370 1484 1358 1358 1471 1358 1358 1471 1370 1370 1484 1371 1371 1485 1358 1358 1471 1371 1371 1485 1359 1359 1472 1359 1359 1472 1371 1371 1485 1372 1372 1486 1359 1359 1472 1372 1372 1486 1360 1360 1473 1360 1360 1473 1372 1372 1486 1373 1373 1487 1360 1360 1473 1373 1373 1487 1361 1361 1474 1361 1361 1474 1373 1373 1487 1374 1374 1488 1361 1361 1474 1374 1374 1488 1362 1362 1475 1362 1362 1475 1374 1374 1488 1375 1375 1489 1362 1362 1475 1375 1375 1489 1363 1363 1476 1363 1363 1476 1375 1375 1489 1376 1376 1490 1363 1363 1476 1376 1376 1490 1364 1364 1477 1364 1364 1477 1376 1376 1490 1377 1377 1491 1364 1364 1477 1377 1377 1491 1365 1365 1478 1365 1365 1478 1377 1377 1491 1378 1378 1492 1365 1365 1478 1378 1378 1492 1366 1366 1479 1366 1366 1479 1378 1378 1492 1379 1379 1493 1366 1366 1479 1379 1379 1493 1367 1367 1480 1367 1367 1480 1379 1379 1493 1368 1368 1494 1367 1367 1480 1368 1368 1494 1356 1356 1481 1368 1368 1482 1380 1380 1495 1381 1381 1496 1368 1368 1482 1381 1381 1496 1369 1369 1483 1369 1369 1483 1381 1381 1496 1382 1382 1497 1369 1369 1483 1382 1382 1497 1370 1370 1484 1370 1370 1484 1382 1382 1497 1383 1383 1498 1370 1370 1484 1383 1383 1498 1371 1371 1485 1371 1371 1485 1383 1383 1498 1384 1384 1499 1371 1371 1485 1384 1384 1499 1372 1372 1486 1372 1372 1486 1384 1384 1499 1385 1385 1500 1372 1372 1486 1385 1385 1500 1373 1373 1487 1373 1373 1487 1385 1385 1500 1386 1386 1501 1373 1373 1487 1386 1386 1501 1374 1374 1488 1374 1374 1488 1386 1386 1501 1387 1387 1502 1374 1374 1488 1387 1387 1502 1375 1375 1489 1375 1375 1489 1387 1387 1502 1388 1388 1503 1375 1375 1489 1388 1388 1503 1376 1376 1490 1376 1376 1490 1388 1388 1503 1389 1389 1504 1376 1376 1490 1389 1389 1504 1377 1377 1491 1377 1377 1491 1389 1389 1504 1390 1390 1505 1377 1377 1491 1390 1390 1505 1378 1378 1492 1378 1378 1492 1390 1390 1505 1391 1391 1506 1378 1378 1492 1391 1391 1506 1379 1379 1493 1379 1379 1493 1391 1391 1506 1380 1380 1507 1379 1379 1493 1380 1380 1507 1368 1368 1494 1380 1380 1495 1392 1392 1508 1393 1393 1509 1380 1380 1495 1393 1393 1509 1381 1381 1496 1381 1381 1496 1393 1393 1509 1394 1394 1510 1381 1381 1496 1394 1394 1510 1382 1382 1497 1382 1382 1497 1394 1394 1510 1395 1395 1511 1382 1382 1497 1395 1395 1511 1383 1383 1498 1383 1383 1498 1395 1395 1511 1396 1396 1512 1383 1383 1498 1396 1396 1512 1384 1384 1499 1384 1384 1499 1396 1396 1512 1397 1397 1513 1384 1384 1499 1397 1397 1513 1385 1385 1500 1385 1385 1500 1397 1397 1513 1398 1398 1514 1385 1385 1500 1398 1398 1514 1386 1386 1501 1386 1386 1501 1398 1398 1514 1399 1399 1515 1386 1386 1501 1399 1399 1515 1387 1387 1502 1387 1387 1502 1399 1399 1515 1400 1400 1516 1387 1387 1502 1400 1400 1516 1388 1388 1503 1388 1388 1503 1400 1400 1516 1401 1401 1517 1388 1388 1503 1401 1401 1517 1389 1389 1504 1389 1389 1504 1401 1401 1517 1402 1402 1518 1389 1389 1504 1402 1402 1518 1390 1390 1505 1390 1390 1505 1402 1402 1518 1403 1403 1519 1390 1390 1505 1403 1403 1519 1391 1391 1506 1391 1391 1506 1403 1403 1519 1392 1392 1520 1391 1391 1506 1392 1392 1520 1380 1380 1507 1392 1392 1508 1404 1404 1521 1405 1405 1522 1392 1392 1508 1405 1405 1522 1393 1393 1509 1393 1393 1509 1405 1405 1522 1406 1406 1523 1393 1393 1509 1406 1406 1523 1394 1394 1510 1394 1394 1510 1406 1406 1523 1407 1407 1524 1394 1394 1510 1407 1407 1524 1395 1395 1511 1395 1395 1511 1407 1407 1524 1408 1408 1525 1395 1395 1511 1408 1408 1525 1396 1396 1512 1396 1396 1512 1408 1408 1525 1409 1409 1526 1396 1396 1512 1409 1409 1526 1397 1397 1513 1397 1397 1513 1409 1409 1526 1410 1410 1527 1397 1397 1513 1410 1410 1527 1398 1398 1514 1398 1398 1514 1410 1410 1527 1411 1411 1528 1398 1398 1514 1411 1411 1528 1399 1399 1515 1399 1399 1515 1411 1411 1528 1412 1412 1529 1399 1399 1515 1412 1412 1529 1400 1400 1516 1400 1400 1516 1412 1412 1529 1413 1413 1530 1400 1400 1516 1413 1413 1530 1401 1401 1517 1401 1401 1517 1413 1413 1530 1414 1414 1531 1401 1401 1517 1414 1414 1531 1402 1402 1518 1402 1402 1518 1414 1414 1531 1415 1415 1532 1402 1402 1518 1415 1415 1532 1403 1403 1519 1403 1403 1519 1415 1415 1532 1404 1404 1533 1403 1403 1519 1404 1404 1533 1392 1392 1520 1404 1404 1521 1416 1416 1534 1417 1417 1535 1404 1404 1521 1417 1417 1535 1405 1405 1522 1405 1405 1522 1417 1417 1535 1418 1418 1536 1405 1405 1522 1418 1418 1536 1406 1406 1523 1406 1406 1523 1418 1418 1536 1419 1419 1537 1406 1406 1523 1419 1419 1537 1407 1407 1524 1407 1407 1524 1419 1419 1537 1420 1420 1538 1407 1407 1524 1420 1420 1538 1408 1408 1525 1408 1408 1525 1420 1420 1538 1421 1421 1539 1408 1408 1525 1421 1421 1539 1409 1409 1526 1409 1409 1526 1421 1421 1539 1422 1422 1540 1409 1409 1526 1422 1422 1540 1410 1410 1527 1410 1410 1527 1422 1422 1540 1423 1423 1541 1410 1410 1527 1423 1423 1541 1411 1411 1528 1411 1411 1528 1423 1423 1541 1424 1424 1542 1411 1411 1528 1424 1424 1542 1412 1412 1529 1412 1412 1529 1424 1424 1542 1425 1425 1543 1412 1412 1529 1425 1425 1543 1413 1413 1530 1413 1413 1530 1425 1425 1543 1426 1426 1544 1413 1413 1530 1426 1426 1544 1414 1414 1531 1414 1414 1531 1426 1426 1544 1427 1427 1545 1414 1414 1531 1427 1427 1545 1415 1415 1532 1415 1415 1532 1427 1427 1545 1416 1416 1546 1415 1415 1532 1416 1416 1546 1404 1404 1533 1416 1416 1534 1428 1428 1547 1429 1429 1548 1416 1416 1534 1429 1429 1548 1417 1417 1535 1417 1417 1535 1429 1429 1548 1430 1430 1549 1417 1417 1535 1430 1430 1549 1418 1418 1536 1418 1418 1536 1430 1430 1549 1431 1431 1550 1418 1418 1536 1431 1431 1550 1419 1419 1537 1419 1419 1537 1431 1431 1550 1432 1432 1551 1419 1419 1537 1432 1432 1551 1420 1420 1538 1420 1420 1538 1432 1432 1551 1433 1433 1552 1420 1420 1538 1433 1433 1552 1421 1421 1539 1421 1421 1539 1433 1433 1552 1434 1434 1553 1421 1421 1539 1434 1434 1553 1422 1422 1540 1422 1422 1540 1434 1434 1553 1435 1435 1554 1422 1422 1540 1435 1435 1554 1423 1423 1541 1423 1423 1541 1435 1435 1554 1436 1436 1555 1423 1423 1541 1436 1436 1555 1424 1424 1542 1424 1424 1542 1436 1436 1555 1437 1437 1556 1424 1424 1542 1437 1437 1556 1425 1425 1543 1425 1425 1543 1437 1437 1556 1438 1438 1557 1425 1425 1543 1438 1438 1557 1426 1426 1544 1426 1426 1544 1438 1438 1557 1439 1439 1558 1426 1426 1544 1439 1439 1558 1427 1427 1545 1427 1427 1545 1439 1439 1558 1428 1428 1559 1427 1427 1545 1428 1428 1559 1416 1416 1546 1428 1428 1547 1440 1440 1560 1441 1441 1561 1428 1428 1547 1441 1441 1561 1429 1429 1548 1429 1429 1548 1441 1441 1561 1442 1442 1562 1429 1429 1548 1442 1442 1562 1430 1430 1549 1430 1430 1549 1442 1442 1562 1443 1443 1563 1430 1430 1549 1443 1443 1563 1431 1431 1550 1431 1431 1550 1443 1443 1563 1444 1444 1564 1431 1431 1550 1444 1444 1564 1432 1432 1551 1432 1432 1551 1444 1444 1564 1445 1445 1565 1432 1432 1551 1445 1445 1565 1433 1433 1552 1433 1433 1552 1445 1445 1565 1446 1446 1566 1433 1433 1552 1446 1446 1566 1434 1434 1553 1434 1434 1553 1446 1446 1566 1447 1447 1567 1434 1434 1553 1447 1447 1567 1435 1435 1554 1435 1435 1554 1447 1447 1567 1448 1448 1568 1435 1435 1554 1448 1448 1568 1436 1436 1555 1436 1436 1555 1448 1448 1568 1449 1449 1569 1436 1436 1555 1449 1449 1569 1437 1437 1556 1437 1437 1556 1449 1449 1569 1450 1450 1570 1437 1437 1556 1450 1450 1570 1438 1438 1557 1438 1438 1557 1450 1450 1570 1451 1451 1571 1438 1438 1557 1451 1451 1571 1439 1439 1558 1439 1439 1558 1451 1451 1571 1440 1440 1572 1439 1439 1558 1440 1440 1572 1428 1428 1559 1440 1440 1560 1452 1452 1573 1453 1453 1574 1440 1440 1560 1453 1453 1574 1441 1441 1561 1441 1441 1561 1453 1453 1574 1454 1454 1575 1441 1441 1561 1454 1454 1575 1442 1442 1562 1442 1442 1562 1454 1454 1575 1455 1455 1576 1442 1442 1562 1455 1455 1576 1443 1443 1563 1443 1443 1563 1455 1455 1576 1456 1456 1577 1443 1443 1563 1456 1456 1577 1444 1444 1564 1444 1444 1564 1456 1456 1577 1457 1457 1578 1444 1444 1564 1457 1457 1578 1445 1445 1565 1445 1445 1565 1457 1457 1578 1458 1458 1579 1445 1445 1565 1458 1458 1579 1446 1446 1566 1446 1446 1566 1458 1458 1579 1459 1459 1580 1446 1446 1566 1459 1459 1580 1447 1447 1567 1447 1447 1567 1459 1459 1580 1460 1460 1581 1447 1447 1567 1460 1460 1581 1448 1448 1568 1448 1448 1568 1460 1460 1581 1461 1461 1582 1448 1448 1568 1461 1461 1582 1449 1449 1569 1449 1449 1569 1461 1461 1582 1462 1462 1583 1449 1449 1569 1462 1462 1583 1450 1450 1570 1450 1450 1570 1462 1462 1583 1463 1463 1584 1450 1450 1570 1463 1463 1584 1451 1451 1571 1451 1451 1571 1463 1463 1584 1452 1452 1585 1451 1451 1571 1452 1452 1585 1440 1440 1572 1452 1452 1573 1464 1464 1586 1465 1465 1587 1452 1452 1573 1465 1465 1587 1453 1453 1574 1453 1453 1574 1465 1465 1587 1466 1466 1588 1453 1453 1574 1466 1466 1588 1454 1454 1575 1454 1454 1575 1466 1466 1588 1467 1467 1589 1454 1454 1575 1467 1467 1589 1455 1455 1576 1455 1455 1576 1467 1467 1589 1468 1468 1590 1455 1455 1576 1468 1468 1590 1456 1456 1577 1456 1456 1577 1468 1468 1590 1469 1469 1591 1456 1456 1577 1469 1469 1591 1457 1457 1578 1457 1457 1578 1469 1469 1591 1470 1470 1592 1457 1457 1578 1470 1470 1592 1458 1458 1579 1458 1458 1579 1470 1470 1592 1471 1471 1593 1458 1458 1579 1471 1471 1593 1459 1459 1580 1459 1459 1580 1471 1471 1593 1472 1472 1594 1459 1459 1580 1472 1472 1594 1460 1460 1581 1460 1460 1581 1472 1472 1594 1473 1473 1595 1460 1460 1581 1473 1473 1595 1461 1461 1582 1461 1461 1582 1473 1473 1595 1474 1474 1596 1461 1461 1582 1474 1474 1596 1462 1462 1583 1462 1462 1583 1474 1474 1596 1475 1475 1597 1462 1462 1583 1475 1475 1597 1463 1463 1584 1463 1463 1584 1475 1475 1597 1464 1464 1598 1463 1463 1584 1464 1464 1598 1452 1452 1585 1464 1464 1586 1476 1476 1599 1477 1477 1600 1464 1464 1586 1477 1477 1600 1465 1465 1587 1465 1465 1587 1477 1477 1600 1478 1478 1601 1465 1465 1587 1478 1478 1601 1466 1466 1588 1466 1466 1588 1478 1478 1601 1479 1479 1602 1466 1466 1588 1479 1479 1602 1467 1467 1589 1467 1467 1589 1479 1479 1602 1480 1480 1603 1467 1467 1589 1480 1480 1603 1468 1468 1590 1468 1468 1590 1480 1480 1603 1481 1481 1604 1468 1468 1590 1481 1481 1604 1469 1469 1591 1469 1469 1591 1481 1481 1604 1482 1482 1605 1469 1469 1591 1482 1482 1605 1470 1470 1592 1470 1470 1592 1482 1482 1605 1483 1483 1606 1470 1470 1592 1483 1483 1606 1471 1471 1593 1471 1471 1593 1483 1483 1606 1484 1484 1607 1471 1471 1593 1484 1484 1607 1472 1472 1594 1472 1472 1594 1484 1484 1607 1485 1485 1608 1472 1472 1594 1485 1485 1608 1473 1473 1595 1473 1473 1595 1485 1485 1608 1486 1486 1609 1473 1473 1595 1486 1486 1609 1474 1474 1596 1474 1474 1596 1486 1486 1609 1487 1487 1610 1474 1474 1596 1487 1487 1610 1475 1475 1597 1475 1475 1597 1487 1487 1610 1476 1476 1611 1475 1475 1597 1476 1476 1611 1464 1464 1598 1476 1476 1599 1488 1488 1612 1489 1489 1613 1476 1476 1599 1489 1489 1613 1477 1477 1600 1477 1477 1600 1489 1489 1613 1490 1490 1614 1477 1477 1600 1490 1490 1614 1478 1478 1601 1478 1478 1601 1490 1490 1614 1491 1491 1615 1478 1478 1601 1491 1491 1615 1479 1479 1602 1479 1479 1602 1491 1491 1615 1492 1492 1616 1479 1479 1602 1492 1492 1616 1480 1480 1603 1480 1480 1603 1492 1492 1616 1493 1493 1617 1480 1480 1603 1493 1493 1617 1481 1481 1604 1481 1481 1604 1493 1493 1617 1494 1494 1618 1481 1481 1604 1494 1494 1618 1482 1482 1605 1482 1482 1605 1494 1494 1618 1495 1495 1619 1482 1482 1605 1495 1495 1619 1483 1483 1606 1483 1483 1606 1495 1495 1619 1496 1496 1620 1483 1483 1606 1496 1496 1620 1484 1484 1607 1484 1484 1607 1496 1496 1620 1497 1497 1621 1484 1484 1607 1497 1497 1621 1485 1485 1608 1485 1485 1608 1497 1497 1621 1498 1498 1622 1485 1485 1608 1498 1498 1622 1486 1486 1609 1486 1486 1609 1498 1498 1622 1499 1499 1623 1486 1486 1609 1499 1499 1623 1487 1487 1610 1487 1487 1610 1499 1499 1623 1488 1488 1624 1487 1487 1610 1488 1488 1624 1476 1476 1611 1488 1488 1612 1500 1500 1625 1501 1501 1626 1488 1488 1612 1501 1501 1626 1489 1489 1613 1489 1489 1613 1501 1501 1626 1502 1502 1627 1489 1489 1613 1502 1502 1627 1490 1490 1614 1490 1490 1614 1502 1502 1627 1503 1503 1628 1490 1490 1614 1503 1503 1628 1491 1491 1615 1491 1491 1615 1503 1503 1628 1504 1504 1629 1491 1491 1615 1504 1504 1629 1492 1492 1616 1492 1492 1616 1504 1504 1629 1505 1505 1630 1492 1492 1616 1505 1505 1630 1493 1493 1617 1493 1493 1617 1505 1505 1630 1506 1506 1631 1493 1493 1617 1506 1506 1631 1494 1494 1618 1494 1494 1618 1506 1506 1631 1507 1507 1632 1494 1494 1618 1507 1507 1632 1495 1495 1619 1495 1495 1619 1507 1507 1632 1508 1508 1633 1495 1495 1619 1508 1508 1633 1496 1496 1620 1496 1496 1620 1508 1508 1633 1509 1509 1634 1496 1496 1620 1509 1509 1634 1497 1497 1621 1497 1497 1621 1509 1509 1634 1510 1510 1635 1497 1497 1621 1510 1510 1635 1498 1498 1622 1498 1498 1622 1510 1510 1635 1511 1511 1636 1498 1498 1622 1511 1511 1636 1499 1499 1623 1499 1499 1623 1511 1511 1636 1500 1500 1637 1499 1499 1623 1500 1500 1637 1488 1488 1624 1500 1500 1625 1512 1512 1638 1513 1513 1639 1500 1500 1625 1513 1513 1639 1501 1501 1626 1501 1501 1626 1513 1513 1639 1514 1514 1640 1501 1501 1626 1514 1514 1640 1502 1502 1627 1502 1502 1627 1514 1514 1640 1515 1515 1641 1502 1502 1627 1515 1515 1641 1503 1503 1628 1503 1503 1628 1515 1515 1641 1516 1516 1642 1503 1503 1628 1516 1516 1642 1504 1504 1629 1504 1504 1629 1516 1516 1642 1517 1517 1643 1504 1504 1629 1517 1517 1643 1505 1505 1630 1505 1505 1630 1517 1517 1643 1518 1518 1644 1505 1505 1630 1518 1518 1644 1506 1506 1631 1506 1506 1631 1518 1518 1644 1519 1519 1645 1506 1506 1631 1519 1519 1645 1507 1507 1632 1507 1507 1632 1519 1519 1645 1520 1520 1646 1507 1507 1632 1520 1520 1646 1508 1508 1633 1508 1508 1633 1520 1520 1646 1521 1521 1647 1508 1508 1633 1521 1521 1647 1509 1509 1634 1509 1509 1634 1521 1521 1647 1522 1522 1648 1509 1509 1634 1522 1522 1648 1510 1510 1635 1510 1510 1635 1522 1522 1648 1523 1523 1649 1510 1510 1635 1523 1523 1649 1511 1511 1636 1511 1511 1636 1523 1523 1649 1512 1512 1650 1511 1511 1636 1512 1512 1650 1500 1500 1637 1512 1512 1638 1524 1524 1651 1525 1525 1652 1512 1512 1638 1525 1525 1652 1513 1513 1639 1513 1513 1639 1525 1525 1652 1526 1526 1653 1513 1513 1639 1526 1526 1653 1514 1514 1640 1514 1514 1640 1526 1526 1653 1527 1527 1654 1514 1514 1640 1527 1527 1654 1515 1515 1641 1515 1515 1641 1527 1527 1654 1528 1528 1655 1515 1515 1641 1528 1528 1655 1516 1516 1642 1516 1516 1642 1528 1528 1655 1529 1529 1656 1516 1516 1642 1529 1529 1656 1517 1517 1643 1517 1517 1643 1529 1529 1656 1530 1530 1657 1517 1517 1643 1530 1530 1657 1518 1518 1644 1518 1518 1644 1530 1530 1657 1531 1531 1658 1518 1518 1644 1531 1531 1658 1519 1519 1645 1519 1519 1645 1531 1531 1658 1532 1532 1659 1519 1519 1645 1532 1532 1659 1520 1520 1646 1520 1520 1646 1532 1532 1659 1533 1533 1660 1520 1520 1646 1533 1533 1660 1521 1521 1647 1521 1521 1647 1533 1533 1660 1534 1534 1661 1521 1521 1647 1534 1534 1661 1522 1522 1648 1522 1522 1648 1534 1534 1661 1535 1535 1662 1522 1522 1648 1535 1535 1662 1523 1523 1649 1523 1523 1649 1535 1535 1662 1524 1524 1663 1523 1523 1649 1524 1524 1663 1512 1512 1650 1524 1524 1651 1536 1536 1664 1537 1537 1665 1524 1524 1651 1537 1537 1665 1525 1525 1652 1525 1525 1652 1537 1537 1665 1538 1538 1666 1525 1525 1652 1538 1538 1666 1526 1526 1653 1526 1526 1653 1538 1538 1666 1539 1539 1667 1526 1526 1653 1539 1539 1667 1527 1527 1654 1527 1527 1654 1539 1539 1667 1540 1540 1668 1527 1527 1654 1540 1540 1668 1528 1528 1655 1528 1528 1655 1540 1540 1668 1541 1541 1669 1528 1528 1655 1541 1541 1669 1529 1529 1656 1529 1529 1656 1541 1541 1669 1542 1542 1670 1529 1529 1656 1542 1542 1670 1530 1530 1657 1530 1530 1657 1542 1542 1670 1543 1543 1671 1530 1530 1657 1543 1543 1671 1531 1531 1658 1531 1531 1658 1543 1543 1671 1544 1544 1672 1531 1531 1658 1544 1544 1672 1532 1532 1659 1532 1532 1659 1544 1544 1672 1545 1545 1673 1532 1532 1659 1545 1545 1673 1533 1533 1660 1533 1533 1660 1545 1545 1673 1546 1546 1674 1533 1533 1660 1546 1546 1674 1534 1534 1661 1534 1534 1661 1546 1546 1674 1547 1547 1675 1534 1534 1661 1547 1547 1675 1535 1535 1662 1535 1535 1662 1547 1547 1675 1536 1536 1676 1535 1535 1662 1536 1536 1676 1524 1524 1663 1536 1536 1664 1548 1548 1677 1549 1549 1678 1536 1536 1664 1549 1549 1678 1537 1537 1665 1537 1537 1665 1549 1549 1678 1550 1550 1679 1537 1537 1665 1550 1550 1679 1538 1538 1666 1538 1538 1666 1550 1550 1679 1551 1551 1680 1538 1538 1666 1551 1551 1680 1539 1539 1667 1539 1539 1667 1551 1551 1680 1552 1552 1681 1539 1539 1667 1552 1552 1681 1540 1540 1668 1540 1540 1668 1552 1552 1681 1553 1553 1682 1540 1540 1668 1553 1553 1682 1541 1541 1669 1541 1541 1669 1553 1553 1682 1554 1554 1683 1541 1541 1669 1554 1554 1683 1542 1542 1670 1542 1542 1670 1554 1554 1683 1555 1555 1684 1542 1542 1670 1555 1555 1684 1543 1543 1671 1543 1543 1671 1555 1555 1684 1556 1556 1685 1543 1543 1671 1556 1556 1685 1544 1544 1672 1544 1544 1672 1556 1556 1685 1557 1557 1686 1544 1544 1672 1557 1557 1686 1545 1545 1673 1545 1545 1673 1557 1557 1686 1558 1558 1687 1545 1545 1673 1558 1558 1687 1546 1546 1674 1546 1546 1674 1558 1558 1687 1559 1559 1688 1546 1546 1674 1559 1559 1688 1547 1547 1675 1547 1547 1675 1559 1559 1688 1548 1548 1689 1547 1547 1675 1548 1548 1689 1536 1536 1676 1548 1548 1677 1560 1560 1690 1561 1561 1691 1548 1548 1677 1561 1561 1691 1549 1549 1678 1549 1549 1678 1561 1561 1691 1562 1562 1692 1549 1549 1678 1562 1562 1692 1550 1550 1679 1550 1550 1679 1562 1562 1692 1563 1563 1693 1550 1550 1679 1563 1563 1693 1551 1551 1680 1551 1551 1680 1563 1563 1693 1564 1564 1694 1551 1551 1680 1564 1564 1694 1552 1552 1681 1552 1552 1681 1564 1564 1694 1565 1565 1695 1552 1552 1681 1565 1565 1695 1553 1553 1682 1553 1553 1682 1565 1565 1695 1566 1566 1696 1553 1553 1682 1566 1566 1696 1554 1554 1683 1554 1554 1683 1566 1566 1696 1567 1567 1697 1554 1554 1683 1567 1567 1697 1555 1555 1684 1555 1555 1684 1567 1567 1697 1568 1568 1698 1555 1555 1684 1568 1568 1698 1556 1556 1685 1556 1556 1685 1568 1568 1698 1569 1569 1699 1556 1556 1685 1569 1569 1699 1557 1557 1686 1557 1557 1686 1569 1569 1699 1570 1570 1700 1557 1557 1686 1570 1570 1700 1558 1558 1687 1558 1558 1687 1570 1570 1700 1571 1571 1701 1558 1558 1687 1571 1571 1701 1559 1559 1688 1559 1559 1688 1571 1571 1701 1560 1560 1702 1559 1559 1688 1560 1560 1702 1548 1548 1689 1560 1560 1690 1572 1572 1703 1573 1573 1704 1560 1560 1690 1573 1573 1704 1561 1561 1691 1561 1561 1691 1573 1573 1704 1574 1574 1705 1561 1561 1691 1574 1574 1705 1562 1562 1692 1562 1562 1692 1574 1574 1705 1575 1575 1706 1562 1562 1692 1575 1575 1706 1563 1563 1693 1563 1563 1693 1575 1575 1706 1576 1576 1707 1563 1563 1693 1576 1576 1707 1564 1564 1694 1564 1564 1694 1576 1576 1707 1577 1577 1708 1564 1564 1694 1577 1577 1708 1565 1565 1695 1565 1565 1695 1577 1577 1708 1578 1578 1709 1565 1565 1695 1578 1578 1709 1566 1566 1696 1566 1566 1696 1578 1578 1709 1579 1579 1710 1566 1566 1696 1579 1579 1710 1567 1567 1697 1567 1567 1697 1579 1579 1710 1580 1580 1711 1567 1567 1697 1580 1580 1711 1568 1568 1698 1568 1568 1698 1580 1580 1711 1581 1581 1712 1568 1568 1698 1581 1581 1712 1569 1569 1699 1569 1569 1699 1581 1581 1712 1582 1582 1713 1569 1569 1699 1582 1582 1713 1570 1570 1700 1570 1570 1700 1582 1582 1713 1583 1583 1714 1570 1570 1700 1583 1583 1714 1571 1571 1701 1571 1571 1701 1583 1583 1714 1572 1572 1715 1571 1571 1701 1572 1572 1715 1560 1560 1702 1572 1572 1703 1584 1584 1716 1585 1585 1717 1572 1572 1703 1585 1585 1717 1573 1573 1704 1573 1573 1704 1585 1585 1717 1586 1586 1718 1573 1573 1704 1586 1586 1718 1574 1574 1705 1574 1574 1705 1586 1586 1718 1587 1587 1719 1574 1574 1705 1587 1587 1719 1575 1575 1706 1575 1575 1706 1587 1587 1719 1588 1588 1720 1575 1575 1706 1588 1588 1720 1576 1576 1707 1576 1576 1707 1588 1588 1720 1589 1589 1721 1576 1576 1707 1589 1589 1721 1577 1577 1708 1577 1577 1708 1589 1589 1721 1590 1590 1722 1577 1577 1708 1590 1590 1722 1578 1578 1709 1578 1578 1709 1590 1590 1722 1591 1591 1723 1578 1578 1709 1591 1591 1723 1579 1579 1710 1579 1579 1710 1591 1591 1723 1592 1592 1724 1579 1579 1710 1592 1592 1724 1580 1580 1711 1580 1580 1711 1592 1592 1724 1593 1593 1725 1580 1580 1711 1593 1593 1725 1581 1581 1712 1581 1581 1712 1593 1593 1725 1594 1594 1726 1581 1581 1712 1594 1594 1726 1582 1582 1713 1582 1582 1713 1594 1594 1726 1595 1595 1727 1582 1582 1713 1595 1595 1727 1583 1583 1714 1583 1583 1714 1595 1595 1727 1584 1584 1728 1583 1583 1714 1584 1584 1728 1572 1572 1715 1584 1584 1716 1596 1596 1729 1597 1597 1730 1584 1584 1716 1597 1597 1730 1585 1585 1717 1585 1585 1717 1597 1597 1730 1598 1598 1731 1585 1585 1717 1598 1598 1731 1586 1586 1718 1586 1586 1718 1598 1598 1731 1599 1599 1732 1586 1586 1718 1599 1599 1732 1587 1587 1719 1587 1587 1719 1599 1599 1732 1600 1600 1733 1587 1587 1719 1600 1600 1733 1588 1588 1720 1588 1588 1720 1600 1600 1733 1601 1601 1734 1588 1588 1720 1601 1601 1734 1589 1589 1721 1589 1589 1721 1601 1601 1734 1602 1602 1735 1589 1589 1721 1602 1602 1735 1590 1590 1722 1590 1590 1722 1602 1602 1735 1603 1603 1736 1590 1590 1722 1603 1603 1736 1591 1591 1723 1591 1591 1723 1603 1603 1736 1604 1604 1737 1591 1591 1723 1604 1604 1737 1592 1592 1724 1592 1592 1724 1604 1604 1737 1605 1605 1738 1592 1592 1724 1605 1605 1738 1593 1593 1725 1593 1593 1725 1605 1605 1738 1606 1606 1739 1593 1593 1725 1606 1606 1739 1594 1594 1726 1594 1594 1726 1606 1606 1739 1607 1607 1740 1594 1594 1726 1607 1607 1740 1595 1595 1727 1595 1595 1727 1607 1607 1740 1596 1596 1741 1595 1595 1727 1596 1596 1741 1584 1584 1728 1596 1596 1729 1608 1608 1742 1609 1609 1743 1596 1596 1729 1609 1609 1743 1597 1597 1730 1597 1597 1730 1609 1609 1743 1610 1610 1744 1597 1597 1730 1610 1610 1744 1598 1598 1731 1598 1598 1731 1610 1610 1744 1611 1611 1745 1598 1598 1731 1611 1611 1745 1599 1599 1732 1599 1599 1732 1611 1611 1745 1612 1612 1746 1599 1599 1732 1612 1612 1746 1600 1600 1733 1600 1600 1733 1612 1612 1746 1613 1613 1747 1600 1600 1733 1613 1613 1747 1601 1601 1734 1601 1601 1734 1613 1613 1747 1614 1614 1748 1601 1601 1734 1614 1614 1748 1602 1602 1735 1602 1602 1735 1614 1614 1748 1615 1615 1749 1602 1602 1735 1615 1615 1749 1603 1603 1736 1603 1603 1736 1615 1615 1749 1616 1616 1750 1603 1603 1736 1616 1616 1750 1604 1604 1737 1604 1604 1737 1616 1616 1750 1617 1617 1751 1604 1604 1737 1617 1617 1751 1605 1605 1738 1605 1605 1738 1617 1617 1751 1618 1618 1752 1605 1605 1738 1618 1618 1752 1606 1606 1739 1606 1606 1739 1618 1618 1752 1619 1619 1753 1606 1606 1739 1619 1619 1753 1607 1607 1740 1607 1607 1740 1619 1619 1753 1608 1608 1754 1607 1607 1740 1608 1608 1754 1596 1596 1741 1608 1608 1742 1620 1620 1755 1621 1621 1756 1608 1608 1742 1621 1621 1756 1609 1609 1743 1609 1609 1743 1621 1621 1756 1622 1622 1757 1609 1609 1743 1622 1622 1757 1610 1610 1744 1610 1610 1744 1622 1622 1757 1623 1623 1758 1610 1610 1744 1623 1623 1758 1611 1611 1745 1611 1611 1745 1623 1623 1758 1624 1624 1759 1611 1611 1745 1624 1624 1759 1612 1612 1746 1612 1612 1746 1624 1624 1759 1625 1625 1760 1612 1612 1746 1625 1625 1760 1613 1613 1747 1613 1613 1747 1625 1625 1760 1626 1626 1761 1613 1613 1747 1626 1626 1761 1614 1614 1748 1614 1614 1748 1626 1626 1761 1627 1627 1762 1614 1614 1748 1627 1627 1762 1615 1615 1749 1615 1615 1749 1627 1627 1762 1628 1628 1763 1615 1615 1749 1628 1628 1763 1616 1616 1750 1616 1616 1750 1628 1628 1763 1629 1629 1764 1616 1616 1750 1629 1629 1764 1617 1617 1751 1617 1617 1751 1629 1629 1764 1630 1630 1765 1617 1617 1751 1630 1630 1765 1618 1618 1752 1618 1618 1752 1630 1630 1765 1631 1631 1766 1618 1618 1752 1631 1631 1766 1619 1619 1753 1619 1619 1753 1631 1631 1766 1620 1620 1767 1619 1619 1753 1620 1620 1767 1608 1608 1754 1620 1620 1755 1632 1632 1768 1633 1633 1769 1620 1620 1755 1633 1633 1769 1621 1621 1756 1621 1621 1756 1633 1633 1769 1634 1634 1770 1621 1621 1756 1634 1634 1770 1622 1622 1757 1622 1622 1757 1634 1634 1770 1635 1635 1771 1622 1622 1757 1635 1635 1771 1623 1623 1758 1623 1623 1758 1635 1635 1771 1636 1636 1772 1623 1623 1758 1636 1636 1772 1624 1624 1759 1624 1624 1759 1636 1636 1772 1637 1637 1773 1624 1624 1759 1637 1637 1773 1625 1625 1760 1625 1625 1760 1637 1637 1773 1638 1638 1774 1625 1625 1760 1638 1638 1774 1626 1626 1761 1626 1626 1761 1638 1638 1774 1639 1639 1775 1626 1626 1761 1639 1639 1775 1627 1627 1762 1627 1627 1762 1639 1639 1775 1640 1640 1776 1627 1627 1762 1640 1640 1776 1628 1628 1763 1628 1628 1763 1640 1640 1776 1641 1641 1777 1628 1628 1763 1641 1641 1777 1629 1629 1764 1629 1629 1764 1641 1641 1777 1642 1642 1778 1629 1629 1764 1642 1642 1778 1630 1630 1765 1630 1630 1765 1642 1642 1778 1643 1643 1779 1630 1630 1765 1643 1643 1779 1631 1631 1766 1631 1631 1766 1643 1643 1779 1632 1632 1780 1631 1631 1766 1632 1632 1780 1620 1620 1767 1632 1632 1768 1644 1644 1781 1645 1645 1782 1632 1632 1768 1645 1645 1782 1633 1633 1769 1633 1633 1769 1645 1645 1782 1646 1646 1783 1633 1633 1769 1646 1646 1783 1634 1634 1770 1634 1634 1770 1646 1646 1783 1647 1647 1784 1634 1634 1770 1647 1647 1784 1635 1635 1771 1635 1635 1771 1647 1647 1784 1648 1648 1785 1635 1635 1771 1648 1648 1785 1636 1636 1772 1636 1636 1772 1648 1648 1785 1649 1649 1786 1636 1636 1772 1649 1649 1786 1637 1637 1773 1637 1637 1773 1649 1649 1786 1650 1650 1787 1637 1637 1773 1650 1650 1787 1638 1638 1774 1638 1638 1774 1650 1650 1787 1651 1651 1788 1638 1638 1774 1651 1651 1788 1639 1639 1775 1639 1639 1775 1651 1651 1788 1652 1652 1789 1639 1639 1775 1652 1652 1789 1640 1640 1776 1640 1640 1776 1652 1652 1789 1653 1653 1790 1640 1640 1776 1653 1653 1790 1641 1641 1777 1641 1641 1777 1653 1653 1790 1654 1654 1791 1641 1641 1777 1654 1654 1791 1642 1642 1778 1642 1642 1778 1654 1654 1791 1655 1655 1792 1642 1642 1778 1655 1655 1792 1643 1643 1779 1643 1643 1779 1655 1655 1792 1644 1644 1793 1643 1643 1779 1644 1644 1793 1632 1632 1780 1644 1644 1781 1656 1656 1794 1657 1657 1795 1644 1644 1781 1657 1657 1795 1645 1645 1782 1645 1645 1782 1657 1657 1795 1658 1658 1796 1645 1645 1782 1658 1658 1796 1646 1646 1783 1646 1646 1783 1658 1658 1796 1659 1659 1797 1646 1646 1783 1659 1659 1797 1647 1647 1784 1647 1647 1784 1659 1659 1797 1660 1660 1798 1647 1647 1784 1660 1660 1798 1648 1648 1785 1648 1648 1785 1660 1660 1798 1661 1661 1799 1648 1648 1785 1661 1661 1799 1649 1649 1786 1649 1649 1786 1661 1661 1799 1662 1662 1800 1649 1649 1786 1662 1662 1800 1650 1650 1787 1650 1650 1787 1662 1662 1800 1663 1663 1801 1650 1650 1787 1663 1663 1801 1651 1651 1788 1651 1651 1788 1663 1663 1801 1664 1664 1802 1651 1651 1788 1664 1664 1802 1652 1652 1789 1652 1652 1789 1664 1664 1802 1665 1665 1803 1652 1652 1789 1665 1665 1803 1653 1653 1790 1653 1653 1790 1665 1665 1803 1666 1666 1804 1653 1653 1790 1666 1666 1804 1654 1654 1791 1654 1654 1791 1666 1666 1804 1667 1667 1805 1654 1654 1791 1667 1667 1805 1655 1655 1792 1655 1655 1792 1667 1667 1805 1656 1656 1806 1655 1655 1792 1656 1656 1806 1644 1644 1793 1656 1656 1794 1668 1668 1807 1669 1669 1808 1656 1656 1794 1669 1669 1808 1657 1657 1795 1657 1657 1795 1669 1669 1808 1670 1670 1809 1657 1657 1795 1670 1670 1809 1658 1658 1796 1658 1658 1796 1670 1670 1809 1671 1671 1810 1658 1658 1796 1671 1671 1810 1659 1659 1797 1659 1659 1797 1671 1671 1810 1672 1672 1811 1659 1659 1797 1672 1672 1811 1660 1660 1798 1660 1660 1798 1672 1672 1811 1673 1673 1812 1660 1660 1798 1673 1673 1812 1661 1661 1799 1661 1661 1799 1673 1673 1812 1674 1674 1813 1661 1661 1799 1674 1674 1813 1662 1662 1800 1662 1662 1800 1674 1674 1813 1675 1675 1814 1662 1662 1800 1675 1675 1814 1663 1663 1801 1663 1663 1801 1675 1675 1814 1676 1676 1815 1663 1663 1801 1676 1676 1815 1664 1664 1802 1664 1664 1802 1676 1676 1815 1677 1677 1816 1664 1664 1802 1677 1677 1816 1665 1665 1803 1665 1665 1803 1677 1677 1816 1678 1678 1817 1665 1665 1803 1678 1678 1817 1666 1666 1804 1666 1666 1804 1678 1678 1817 1679 1679 1818 1666 1666 1804 1679 1679 1818 1667 1667 1805 1667 1667 1805 1679 1679 1818 1668 1668 1819 1667 1667 1805 1668 1668 1819 1656 1656 1806 1668 1668 1807 1680 1680 1820 1681 1681 1821 1668 1668 1807 1681 1681 1821 1669 1669 1808 1669 1669 1808 1681 1681 1821 1682 1682 1822 1669 1669 1808 1682 1682 1822 1670 1670 1809 1670 1670 1809 1682 1682 1822 1683 1683 1823 1670 1670 1809 1683 1683 1823 1671 1671 1810 1671 1671 1810 1683 1683 1823 1684 1684 1824 1671 1671 1810 1684 1684 1824 1672 1672 1811 1672 1672 1811 1684 1684 1824 1685 1685 1825 1672 1672 1811 1685 1685 1825 1673 1673 1812 1673 1673 1812 1685 1685 1825 1686 1686 1826 1673 1673 1812 1686 1686 1826 1674 1674 1813 1674 1674 1813 1686 1686 1826 1687 1687 1827 1674 1674 1813 1687 1687 1827 1675 1675 1814 1675 1675 1814 1687 1687 1827 1688 1688 1828 1675 1675 1814 1688 1688 1828 1676 1676 1815 1676 1676 1815 1688 1688 1828 1689 1689 1829 1676 1676 1815 1689 1689 1829 1677 1677 1816 1677 1677 1816 1689 1689 1829 1690 1690 1830 1677 1677 1816 1690 1690 1830 1678 1678 1817 1678 1678 1817 1690 1690 1830 1691 1691 1831 1678 1678 1817 1691 1691 1831 1679 1679 1818 1679 1679 1818 1691 1691 1831 1680 1680 1832 1679 1679 1818 1680 1680 1832 1668 1668 1819 1680 1680 1820 1692 1692 1833 1693 1693 1834 1680 1680 1820 1693 1693 1834 1681 1681 1821 1681 1681 1821 1693 1693 1834 1694 1694 1835 1681 1681 1821 1694 1694 1835 1682 1682 1822 1682 1682 1822 1694 1694 1835 1695 1695 1836 1682 1682 1822 1695 1695 1836 1683 1683 1823 1683 1683 1823 1695 1695 1836 1696 1696 1837 1683 1683 1823 1696 1696 1837 1684 1684 1824 1684 1684 1824 1696 1696 1837 1697 1697 1838 1684 1684 1824 1697 1697 1838 1685 1685 1825 1685 1685 1825 1697 1697 1838 1698 1698 1839 1685 1685 1825 1698 1698 1839 1686 1686 1826 1686 1686 1826 1698 1698 1839 1699 1699 1840 1686 1686 1826 1699 1699 1840 1687 1687 1827 1687 1687 1827 1699 1699 1840 1700 1700 1841 1687 1687 1827 1700 1700 1841 1688 1688 1828 1688 1688 1828 1700 1700 1841 1701 1701 1842 1688 1688 1828 1701 1701 1842 1689 1689 1829 1689 1689 1829 1701 1701 1842 1702 1702 1843 1689 1689 1829 1702 1702 1843 1690 1690 1830 1690 1690 1830 1702 1702 1843 1703 1703 1844 1690 1690 1830 1703 1703 1844 1691 1691 1831 1691 1691 1831 1703 1703 1844 1692 1692 1845 1691 1691 1831 1692 1692 1845 1680 1680 1832 1692 1692 1833 1704 1704 1846 1705 1705 1847 1692 1692 1833 1705 1705 1847 1693 1693 1834 1693 1693 1834 1705 1705 1847 1706 1706 1848 1693 1693 1834 1706 1706 1848 1694 1694 1835 1694 1694 1835 1706 1706 1848 1707 1707 1849 1694 1694 1835 1707 1707 1849 1695 1695 1836 1695 1695 1836 1707 1707 1849 1708 1708 1850 1695 1695 1836 1708 1708 1850 1696 1696 1837 1696 1696 1837 1708 1708 1850 1709 1709 1851 1696 1696 1837 1709 1709 1851 1697 1697 1838 1697 1697 1838 1709 1709 1851 1710 1710 1852 1697 1697 1838 1710 1710 1852 1698 1698 1839 1698 1698 1839 1710 1710 1852 1711 1711 1853 1698 1698 1839 1711 1711 1853 1699 1699 1840 1699 1699 1840 1711 1711 1853 1712 1712 1854 1699 1699 1840 1712 1712 1854 1700 1700 1841 1700 1700 1841 1712 1712 1854 1713 1713 1855 1700 1700 1841 1713 1713 1855 1701 1701 1842 1701 1701 1842 1713 1713 1855 1714 1714 1856 1701 1701 1842 1714 1714 1856 1702 1702 1843 1702 1702 1843 1714 1714 1856 1715 1715 1857 1702 1702 1843 1715 1715 1857 1703 1703 1844 1703 1703 1844 1715 1715 1857 1704 1704 1858 1703 1703 1844 1704 1704 1858 1692 1692 1845 1704 1704 1846 1716 1716 1859 1717 1717 1860 1704 1704 1846 1717 1717 1860 1705 1705 1847 1705 1705 1847 1717 1717 1860 1718 1718 1861 1705 1705 1847 1718 1718 1861 1706 1706 1848 1706 1706 1848 1718 1718 1861 1719 1719 1862 1706 1706 1848 1719 1719 1862 1707 1707 1849 1707 1707 1849 1719 1719 1862 1720 1720 1863 1707 1707 1849 1720 1720 1863 1708 1708 1850 1708 1708 1850 1720 1720 1863 1721 1721 1864 1708 1708 1850 1721 1721 1864 1709 1709 1851 1709 1709 1851 1721 1721 1864 1722 1722 1865 1709 1709 1851 1722 1722 1865 1710 1710 1852 1710 1710 1852 1722 1722 1865 1723 1723 1866 1710 1710 1852 1723 1723 1866 1711 1711 1853 1711 1711 1853 1723 1723 1866 1724 1724 1867 1711 1711 1853 1724 1724 1867 1712 1712 1854 1712 1712 1854 1724 1724 1867 1725 1725 1868 1712 1712 1854 1725 1725 1868 1713 1713 1855 1713 1713 1855 1725 1725 1868 1726 1726 1869 1713 1713 1855 1726 1726 1869 1714 1714 1856 1714 1714 1856 1726 1726 1869 1727 1727 1870 1714 1714 1856 1727 1727 1870 1715 1715 1857 1715 1715 1857 1727 1727 1870 1716 1716 1871 1715 1715 1857 1716 1716 1871 1704 1704 1858 1716 1716 1859 1728 1728 1872 1729 1729 1873 1716 1716 1859 1729 1729 1873 1717 1717 1860 1717 1717 1860 1729 1729 1873 1730 1730 1874 1717 1717 1860 1730 1730 1874 1718 1718 1861 1718 1718 1861 1730 1730 1874 1731 1731 1875 1718 1718 1861 1731 1731 1875 1719 1719 1862 1719 1719 1862 1731 1731 1875 1732 1732 1876 1719 1719 1862 1732 1732 1876 1720 1720 1863 1720 1720 1863 1732 1732 1876 1733 1733 1877 1720 1720 1863 1733 1733 1877 1721 1721 1864 1721 1721 1864 1733 1733 1877 1734 1734 1878 1721 1721 1864 1734 1734 1878 1722 1722 1865 1722 1722 1865 1734 1734 1878 1735 1735 1879 1722 1722 1865 1735 1735 1879 1723 1723 1866 1723 1723 1866 1735 1735 1879 1736 1736 1880 1723 1723 1866 1736 1736 1880 1724 1724 1867 1724 1724 1867 1736 1736 1880 1737 1737 1881 1724 1724 1867 1737 1737 1881 1725 1725 1868 1725 1725 1868 1737 1737 1881 1738 1738 1882 1725 1725 1868 1738 1738 1882 1726 1726 1869 1726 1726 1869 1738 1738 1882 1739 1739 1883 1726 1726 1869 1739 1739 1883 1727 1727 1870 1727 1727 1870 1739 1739 1883 1728 1728 1884 1727 1727 1870 1728 1728 1884 1716 1716 1871 1728 1728 1872 1740 1740 1885 1741 1741 1886 1728 1728 1872 1741 1741 1886 1729 1729 1873 1729 1729 1873 1741 1741 1886 1742 1742 1887 1729 1729 1873 1742 1742 1887 1730 1730 1874 1730 1730 1874 1742 1742 1887 1743 1743 1888 1730 1730 1874 1743 1743 1888 1731 1731 1875 1731 1731 1875 1743 1743 1888 1744 1744 1889 1731 1731 1875 1744 1744 1889 1732 1732 1876 1732 1732 1876 1744 1744 1889 1745 1745 1890 1732 1732 1876 1745 1745 1890 1733 1733 1877 1733 1733 1877 1745 1745 1890 1746 1746 1891 1733 1733 1877 1746 1746 1891 1734 1734 1878 1734 1734 1878 1746 1746 1891 1747 1747 1892 1734 1734 1878 1747 1747 1892 1735 1735 1879 1735 1735 1879 1747 1747 1892 1748 1748 1893 1735 1735 1879 1748 1748 1893 1736 1736 1880 1736 1736 1880 1748 1748 1893 1749 1749 1894 1736 1736 1880 1749 1749 1894 1737 1737 1881 1737 1737 1881 1749 1749 1894 1750 1750 1895 1737 1737 1881 1750 1750 1895 1738 1738 1882 1738 1738 1882 1750 1750 1895 1751 1751 1896 1738 1738 1882 1751 1751 1896 1739 1739 1883 1739 1739 1883 1751 1751 1896 1740 1740 1897 1739 1739 1883 1740 1740 1897 1728 1728 1884 1740 1740 1885 1752 1752 1898 1753 1753 1899 1740 1740 1885 1753 1753 1899 1741 1741 1886 1741 1741 1886 1753 1753 1899 1754 1754 1900 1741 1741 1886 1754 1754 1900 1742 1742 1887 1742 1742 1887 1754 1754 1900 1755 1755 1901 1742 1742 1887 1755 1755 1901 1743 1743 1888 1743 1743 1888 1755 1755 1901 1756 1756 1902 1743 1743 1888 1756 1756 1902 1744 1744 1889 1744 1744 1889 1756 1756 1902 1757 1757 1903 1744 1744 1889 1757 1757 1903 1745 1745 1890 1745 1745 1890 1757 1757 1903 1758 1758 1904 1745 1745 1890 1758 1758 1904 1746 1746 1891 1746 1746 1891 1758 1758 1904 1759 1759 1905 1746 1746 1891 1759 1759 1905 1747 1747 1892 1747 1747 1892 1759 1759 1905 1760 1760 1906 1747 1747 1892 1760 1760 1906 1748 1748 1893 1748 1748 1893 1760 1760 1906 1761 1761 1907 1748 1748 1893 1761 1761 1907 1749 1749 1894 1749 1749 1894 1761 1761 1907 1762 1762 1908 1749 1749 1894 1762 1762 1908 1750 1750 1895 1750 1750 1895 1762 1762 1908 1763 1763 1909 1750 1750 1895 1763 1763 1909 1751 1751 1896 1751 1751 1896 1763 1763 1909 1752 1752 1910 1751 1751 1896 1752 1752 1910 1740 1740 1897 1752 1752 1898 1764 1764 1911 1765 1765 1912 1752 1752 1898 1765 1765 1912 1753 1753 1899 1753 1753 1899 1765 1765 1912 1766 1766 1913 1753 1753 1899 1766 1766 1913 1754 1754 1900 1754 1754 1900 1766 1766 1913 1767 1767 1914 1754 1754 1900 1767 1767 1914 1755 1755 1901 1755 1755 1901 1767 1767 1914 1768 1768 1915 1755 1755 1901 1768 1768 1915 1756 1756 1902 1756 1756 1902 1768 1768 1915 1769 1769 1916 1756 1756 1902 1769 1769 1916 1757 1757 1903 1757 1757 1903 1769 1769 1916 1770 1770 1917 1757 1757 1903 1770 1770 1917 1758 1758 1904 1758 1758 1904 1770 1770 1917 1771 1771 1918 1758 1758 1904 1771 1771 1918 1759 1759 1905 1759 1759 1905 1771 1771 1918 1772 1772 1919 1759 1759 1905 1772 1772 1919 1760 1760 1906 1760 1760 1906 1772 1772 1919 1773 1773 1920 1760 1760 1906 1773 1773 1920 1761 1761 1907 1761 1761 1907 1773 1773 1920 1774 1774 1921 1761 1761 1907 1774 1774 1921 1762 1762 1908 1762 1762 1908 1774 1774 1921 1775 1775 1922 1762 1762 1908 1775 1775 1922 1763 1763 1909 1763 1763 1909 1775 1775 1922 1764 1764 1923 1763 1763 1909 1764 1764 1923 1752 1752 1910 1764 1764 1911 1776 1776 1924 1777 1777 1925 1764 1764 1911 1777 1777 1925 1765 1765 1912 1765 1765 1912 1777 1777 1925 1778 1778 1926 1765 1765 1912 1778 1778 1926 1766 1766 1913 1766 1766 1913 1778 1778 1926 1779 1779 1927 1766 1766 1913 1779 1779 1927 1767 1767 1914 1767 1767 1914 1779 1779 1927 1780 1780 1928 1767 1767 1914 1780 1780 1928 1768 1768 1915 1768 1768 1915 1780 1780 1928 1781 1781 1929 1768 1768 1915 1781 1781 1929 1769 1769 1916 1769 1769 1916 1781 1781 1929 1782 1782 1930 1769 1769 1916 1782 1782 1930 1770 1770 1917 1770 1770 1917 1782 1782 1930 1783 1783 1931 1770 1770 1917 1783 1783 1931 1771 1771 1918 1771 1771 1918 1783 1783 1931 1784 1784 1932 1771 1771 1918 1784 1784 1932 1772 1772 1919 1772 1772 1919 1784 1784 1932 1785 1785 1933 1772 1772 1919 1785 1785 1933 1773 1773 1920 1773 1773 1920 1785 1785 1933 1786 1786 1934 1773 1773 1920 1786 1786 1934 1774 1774 1921 1774 1774 1921 1786 1786 1934 1787 1787 1935 1774 1774 1921 1787 1787 1935 1775 1775 1922 1775 1775 1922 1787 1787 1935 1776 1776 1936 1775 1775 1922 1776 1776 1936 1764 1764 1923 1776 1776 1924 1788 1788 1937 1789 1789 1938 1776 1776 1924 1789 1789 1938 1777 1777 1925 1777 1777 1925 1789 1789 1938 1790 1790 1939 1777 1777 1925 1790 1790 1939 1778 1778 1926 1778 1778 1926 1790 1790 1939 1791 1791 1940 1778 1778 1926 1791 1791 1940 1779 1779 1927 1779 1779 1927 1791 1791 1940 1792 1792 1941 1779 1779 1927 1792 1792 1941 1780 1780 1928 1780 1780 1928 1792 1792 1941 1793 1793 1942 1780 1780 1928 1793 1793 1942 1781 1781 1929 1781 1781 1929 1793 1793 1942 1794 1794 1943 1781 1781 1929 1794 1794 1943 1782 1782 1930 1782 1782 1930 1794 1794 1943 1795 1795 1944 1782 1782 1930 1795 1795 1944 1783 1783 1931 1783 1783 1931 1795 1795 1944 1796 1796 1945 1783 1783 1931 1796 1796 1945 1784 1784 1932 1784 1784 1932 1796 1796 1945 1797 1797 1946 1784 1784 1932 1797 1797 1946 1785 1785 1933 1785 1785 1933 1797 1797 1946 1798 1798 1947 1785 1785 1933 1798 1798 1947 1786 1786 1934 1786 1786 1934 1798 1798 1947 1799 1799 1948 1786 1786 1934 1799 1799 1948 1787 1787 1935 1787 1787 1935 1799 1799 1948 1788 1788 1949 1787 1787 1935 1788 1788 1949 1776 1776 1936 1788 1788 1937 0 0 1950 1 3 1951 1788 1788 1937 1 3 1951 1789 1789 1938 1789 1789 1938 1 3 1951 2 5 1952 1789 1789 1938 2 5 1952 1790 1790 1939 1790 1790 1939 2 5 1952 3 7 1953 1790 1790 1939 3 7 1953 1791 1791 1940 1791 1791 1940 3 7 1953 4 9 1954 1791 1791 1940 4 9 1954 1792 1792 1941 1792 1792 1941 4 9 1954 5 11 1955 1792 1792 1941 5 11 1955 1793 1793 1942 1793 1793 1942 5 11 1955 6 13 1956 1793 1793 1942 6 13 1956 1794 1794 1943 1794 1794 1943 6 13 1956 7 15 1957 1794 1794 1943 7 15 1957 1795 1795 1944 1795 1795 1944 7 15 1957 8 17 1958 1795 1795 1944 8 17 1958 1796 1796 1945 1796 1796 1945 8 17 1958 9 19 1959 1796 1796 1945 9 19 1959 1797 1797 1946 1797 1797 1946 9 19 1959 10 21 1960 1797 1797 1946 10 21 1960 1798 1798 1947 1798 1798 1947 10 21 1960 11 23 1961 1798 1798 1947 11 23 1961 1799 1799 1948 1799 1799 1948 11 23 1961 0 0 1962 1799 1799 1948 0 0 1962 1788 1788 1949</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-5_max" name="Torus_Knot-5_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-5_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-6.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-6.dae
new file mode 100644
index 0000000..2b328c4
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-6.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-6.max</source_data>
+ </contributor>
+ <created>2008-10-31T16:29:48Z</created>
+ <modified>2008-10-31T16:29:50Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="5400">23.434380 -0.000519 22.020164 23.594213 -0.347234 22.369724 23.521751 -0.600908 22.815086 23.236410 -0.693569 23.236919 22.814646 -0.600389 23.522194 22.369469 -0.346335 23.594467 22.020166 0.000519 23.434380 21.860331 0.347234 23.084822 21.932793 0.600908 22.639458 22.218134 0.693569 22.217625 22.639898 0.600389 21.932350 23.085075 0.346336 21.860077 24.603891 2.101239 23.029009 24.889914 1.767194 23.359591 24.941700 1.499992 23.837711 24.745375 1.371230 24.335262 24.353542 1.415410 24.718922 23.871195 1.620693 24.885891 23.427576 1.932075 24.791430 23.141554 2.266120 24.460848 23.089766 2.533323 23.982727 23.286093 2.662085 23.485176 23.677925 2.617905 23.101517 24.160273 2.412621 22.934546 25.701838 4.412501 23.658733 26.159697 4.081263 23.971094 26.377813 3.801468 24.510597 26.297747 3.648087 25.132677 25.940950 3.662218 25.670652 25.403027 3.840074 25.980373 24.828112 4.134000 25.978848 24.370255 4.465238 25.666487 24.152136 4.745033 25.126987 24.232203 4.898414 24.504904 24.588999 4.884284 23.966928 25.126923 4.706427 23.657207 26.600193 6.922452 23.850243 27.285069 6.600083 24.103609 27.742685 6.328027 24.698374 27.850426 6.179178 25.475168 27.579420 6.193423 26.225849 27.002283 6.366943 26.749277 26.273659 6.653245 26.905197 25.588783 6.975613 26.651829 25.131166 7.247670 26.057066 25.023426 7.396519 25.280275 25.294432 7.382274 24.529591 25.871569 7.208754 24.006163 27.168947 9.586581 23.597143 28.113493 9.281087 23.701454 28.888514 9.052963 24.287693 29.286345 8.963334 25.198776 29.200384 9.036216 26.190580 28.653669 9.252080 26.997351 27.792688 9.553086 27.402914 26.848143 9.858580 27.298603 26.073122 10.086704 26.712364 25.675291 10.176333 25.801281 25.761251 10.103452 24.809479 26.307966 9.887588 24.002708 27.319044 12.364937 22.948851 28.500793 12.055901 22.780788 29.637316 11.896465 23.231541 30.424080 11.929353 24.180330 30.650274 12.145749 25.372927 30.255289 12.487673 26.489779 29.344961 12.863504 27.231623 28.163212 13.172541 27.399685 27.026691 13.331976 26.948933 26.239925 13.299089 26.000145 26.013731 13.082693 24.807547 26.408714 12.740769 23.690697 27.030428 15.270228 21.970167 28.356846 14.881901 21.419088 29.832117 14.764955 21.573275 31.060942 14.950727 22.391413 31.714058 15.389438 23.654284 31.616465 15.963535 25.023502 30.794312 16.519192 26.132189 29.467892 16.907518 26.683268 27.992622 17.024464 26.529081 26.763798 16.838694 25.710943 26.110680 16.399982 24.448072 26.208273 15.825885 23.078854 26.341774 18.375845 20.672722 27.663807 17.780689 19.698196 29.379662 17.607721 19.419630 31.029579 17.903280 19.911663 32.171463 18.588177 21.042458 32.499348 19.478893 22.509018 31.925377 20.336760 23.918381 30.603346 20.931913 24.892906 28.887489 21.104883 25.171473 27.237574 20.809324 24.679440 26.095688 20.124430 23.548647 25.767803 19.233715 22.082087 25.312586 21.764696 18.972094 26.459118 20.822639 17.640598 28.260820 20.439678 16.877638 30.234924 20.718430 16.887650 31.852474 21.584204 17.667948 32.680046 22.805014 19.009455 32.495895 24.053745 20.552713 31.349361 24.995804 21.884209 29.547661 25.378765 22.647169 27.573557 25.100012 22.637159 25.956007 24.234241 21.856861 25.128433 23.013432 20.515354 23.989086 25.449511 16.710165 24.805256 24.062490 15.191405 26.515434 23.309000 14.006443 28.661381 23.390938 13.472790 30.668093 24.286352 13.733436 31.997873 25.755312 14.718542 32.294407 27.404215 16.164148 31.478239 28.791235 17.682907 29.768061 29.544725 18.867868 27.622114 29.462788 19.401524 25.615402 28.567375 19.140879 24.285622 27.098417 18.155773 22.393229 29.323101 13.724038 22.770573 27.476330 12.253870 24.224350 26.239040 10.815122 26.365017 25.942760 9.793304 28.618986 26.666880 9.462214 30.382307 28.217371 9.910566 31.182501 30.178783 11.018224 30.805157 32.025555 12.488392 29.351381 33.262848 13.927139 27.210714 33.559124 14.948956 24.956745 32.835007 15.280047 23.193422 31.284515 14.831697 20.528877 33.159149 9.919203 20.422934 30.936834 8.745414 21.496571 29.188562 7.289894 23.462109 28.382782 5.942650 25.792883 28.735397 5.064674 27.864365 30.151932 4.891220 29.121502 32.252823 5.468763 29.227446 34.475136 6.642552 28.153809 36.223408 8.098070 26.188272 37.029190 9.445315 23.857498 36.676575 10.323291 21.786016 35.260044 10.496746 18.395977 36.650570 5.322793 17.830835 34.224552 4.650784 18.460379 32.039158 3.432476 20.115923 30.679964 1.994315 22.353865 30.511164 0.721654 24.574547 31.577988 -0.044498 26.182945 33.594578 -0.098852 26.748087 36.020596 0.573157 26.118544 38.205986 1.791464 24.463001 39.565182 3.229625 22.225061 39.733982 4.502286 20.004377 38.667164 5.268439 16.001612 39.472675 0.097761 15.062037 37.070335 0.047688 15.250602 34.612850 -0.715039 16.516779 32.758701 -1.986048 18.521297 32.004704 -3.424774 20.727049 32.552895 -4.645710 22.543005 34.256382 -5.321709 23.482580 36.658722 -5.271637 23.294016 39.116203 -4.508911 22.027840 40.970356 -3.237902 20.023321 41.724350 -1.799176 17.817570 41.176163 -0.578239 13.369374 41.346668 -5.471104 12.181427 39.207012 -4.889432 11.992982 36.704342 -5.059240 12.854533 34.509251 -5.935026 14.535227 33.209915 -7.282124 16.584723 33.154480 -8.739579 18.453861 34.357807 -9.916869 19.641809 36.497463 -10.498540 19.830254 39.000130 -10.328733 18.968704 41.195217 -9.452949 17.288012 42.494560 -8.105851 15.238516 42.549995 -6.648396 10.540985 42.094097 -11.022372 9.245590 40.420536 -9.910842 8.787684 38.118340 -9.458543 9.289961 35.804382 -9.786670 10.617838 34.098690 -10.807300 12.415510 33.458290 -12.246956 14.201293 34.054783 -13.719885 15.496688 35.728340 -14.831416 15.954596 38.030533 -15.283715 15.452319 40.344490 -14.955589 14.124443 42.050190 -13.934960 12.326772 42.690590 -12.495303 7.580763 41.668774 -16.169195 6.304124 40.588234 -14.720330 5.700396 38.702946 -13.731487 5.931348 36.518082 -13.467627 6.935096 34.619072 -13.999449 8.442688 33.514751 -15.184453 10.050164 33.501026 -16.705118 11.326803 34.581566 -18.153982 11.930532 36.466850 -19.142826 11.699580 38.651711 -19.406687 10.695833 40.550724 -18.874865 9.188242 41.655048 -17.689861 4.576953 40.166603 -20.558134 3.406282 39.702843 -19.012383 2.766572 38.377243 -17.667595 2.829231 36.544998 -16.884109 3.577471 34.697056 -16.871857 4.810801 33.328575 -17.634121 6.198751 32.806236 -18.966656 7.369421 33.269997 -20.512407 8.009132 34.595596 -21.857197 7.946474 36.427841 -22.640682 7.198235 38.275776 -22.652937 5.964905 39.644260 -21.890671 1.642582 37.812687 -23.922993 0.614804 37.881973 -22.512121 0.010779 37.154533 -21.043222 -0.007646 35.825291 -19.909882 0.564466 34.250420 -19.415777 1.573818 32.851894 -19.693308 2.749956 32.004459 -20.668106 3.777734 31.935175 -22.078976 4.381759 32.662613 -23.547876 4.400185 33.991852 -24.681217 3.828073 35.566727 -25.175320 2.818721 36.965248 -24.897793 -1.097338 34.923878 -26.135057 -1.988417 35.358803 -25.025688 -2.531841 35.157986 -23.655199 -2.582001 34.375248 -22.390812 -2.125456 33.220314 -21.571318 -1.284538 32.002651 -21.416298 -0.284569 31.048532 -21.967291 0.606509 30.613611 -23.076660 1.149933 30.814425 -24.447147 1.200094 31.597164 -25.711536 0.743549 32.752098 -26.531031 -0.097369 33.969761 -26.686050 -3.537713 31.840887 -27.232920 -4.317864 32.441574 -26.490749 -4.809674 32.614025 -25.373310 -4.881361 32.312019 -24.180023 -4.513718 31.616488 -23.230625 -3.805254 30.713795 -22.779509 -2.945802 29.845816 -22.947550 -2.165650 29.245127 -23.689720 -1.673841 29.072680 -24.807156 -1.602153 29.374683 -26.000446 -1.969796 30.070215 -26.949844 -2.678259 30.972906 -27.400961 -5.627059 28.842281 -27.403032 -6.318235 29.437201 -26.997166 -6.777486 29.803507 -26.190144 -6.881757 29.843052 -25.198208 -6.603108 29.545240 -24.287144 -6.016204 28.989868 -23.701069 -5.278305 28.325748 -23.597025 -4.587130 27.730829 -24.002892 -4.127879 27.364523 -24.809912 -4.023607 27.324978 -25.801849 -4.302255 27.622787 -26.712914 -4.889159 28.178160 -27.298986 -7.377626 26.078005 -26.904821 -7.990077 26.565477 -26.748459 -8.428341 26.978863 -26.224810 -8.574986 27.207396 -25.474180 -8.390718 27.189840 -24.697708 -7.924914 26.930904 -24.103443 -7.302383 26.499964 -23.850622 -6.689934 26.012493 -24.006985 -6.251669 25.599106 -24.530634 -6.105024 25.370573 -25.281261 -6.289291 25.388128 -26.057734 -6.755095 25.647064 -26.651999 -8.835648 23.567396 -25.978462 -9.377936 23.917889 -25.979445 -9.800666 24.294870 -25.669432 -9.990566 24.597328 -25.131493 -9.896754 24.744223 -24.509766 -9.544366 24.696188 -23.970842 -9.027824 24.466101 -23.659128 -8.485536 24.115608 -23.658144 -8.062806 23.738626 -23.968157 -7.872905 23.436169 -24.506094 -7.966717 23.289276 -25.127821 -8.319105 23.337309 -25.666744 -10.041802 21.254076 -24.791218 -10.533564 21.482204 -24.885067 -10.952394 21.797245 -24.717709 -11.186070 22.114786 -24.333986 -11.171977 22.349743 -23.836716 -10.913891 22.439156 -23.359142 -10.480966 22.359068 -23.029228 -9.989204 22.130939 -22.935379 -9.570374 21.815899 -23.102737 -9.336698 21.498358 -23.486460 -9.350791 21.263403 -23.983728 -9.608877 21.173988 -24.461304 -11.010606 19.069729 -23.434387 -11.485937 19.198528 -23.593826 -11.928496 19.456978 -23.521074 -12.219701 19.775833 -23.235628 -12.281522 20.069654 -22.813967 -12.097395 20.259712 -22.369080 -11.716657 20.295082 -22.020172 -11.241325 20.166286 -21.860735 -10.798766 19.907833 -21.933485 -10.507562 19.588978 -22.218931 -10.445741 19.295156 -22.640593 -10.629867 19.105099 -23.085480 -11.734884 16.973478 -21.944992 -12.233791 17.008453 -22.174229 -12.742841 17.217100 -22.177988 -13.125634 17.543510 -21.955267 -13.279603 17.900225 -21.565744 -13.163490 18.191660 -21.113791 -12.808409 18.339727 -20.720509 -12.309503 18.304752 -20.491272 -11.800452 18.096106 -20.487511 -11.417659 17.769695 -20.710232 -11.263690 17.412983 -21.099756 -11.379803 17.121546 -21.551708 -12.202222 14.964531 -20.328535 -12.755113 14.882349 -20.651768 -13.377803 15.028149 -20.740765 -13.903443 15.362862 -20.571680 -14.191189 15.796803 -20.189817 -14.163939 16.213697 -19.697498 -13.828996 16.501839 -19.226641 -13.276106 16.584021 -18.903408 -12.653416 16.438221 -18.814411 -12.127775 16.103508 -18.983496 -11.840029 15.669567 -19.365358 -11.867278 15.252672 -19.857676 -12.412560 13.078914 -18.575190 -13.023240 12.829369 -19.024597 -13.794374 12.869489 -19.226866 -14.519339 13.188522 -19.127798 -15.003879 13.700985 -18.753935 -15.118163 14.269563 -18.205458 -14.831569 14.741906 -17.629328 -14.220889 14.991450 -17.179920 -13.449756 14.951331 -16.977650 -12.724792 14.632298 -17.076719 -12.240251 14.119835 -17.450581 -12.125966 13.551258 -17.999058 -12.394026 11.376407 -16.671080 -13.026229 10.895218 -17.275354 -13.949847 10.759015 -17.628553 -14.917397 11.004294 -17.636038 -15.669625 11.565332 -17.295801 -16.004972 12.291800 -16.699011 -15.833582 12.989039 -16.005575 -15.201379 13.470228 -15.401300 -14.277761 13.606431 -15.048102 -13.310211 13.361152 -15.040617 -12.557982 12.800114 -15.380853 -12.222635 12.073647 -15.977643 -12.212457 9.921359 -14.607551 -12.784419 9.150552 -15.381495 -13.818757 8.752626 -15.921934 -15.038321 8.834207 -16.084061 -16.116329 9.373434 -15.824429 -16.763929 10.225821 -15.212609 -16.807600 11.162974 -14.412538 -16.235638 11.933782 -13.638594 -15.201300 12.331707 -13.098154 -13.981736 12.250127 -12.936029 -12.903728 11.710900 -13.195660 -12.256126 10.858513 -13.807478 -11.971277 8.759571 -12.389336 -12.361948 7.670980 -13.325399 -13.413036 6.932970 -14.076677 -14.842905 6.743287 -14.441865 -16.268421 7.152759 -14.323112 -17.307619 8.051666 -13.752236 -17.682047 9.199148 -12.882207 -17.291376 10.287738 -11.946143 -16.240290 11.025749 -11.194865 -14.810421 11.215432 -10.829677 -13.384905 10.805962 -10.948429 -12.345706 9.907055 -11.519304 -11.799022 7.896006 -10.039203 -11.866713 6.511913 -11.102864 -12.794521 5.388333 -12.066406 -14.333841 4.826329 -12.671646 -16.072214 4.976488 -12.756412 -17.543842 5.798575 -12.297990 -18.354406 7.072314 -11.419214 -18.286716 8.456406 -10.355552 -17.358910 9.579986 -9.392011 -15.819590 10.141991 -8.786770 -14.081218 9.991833 -8.702003 -12.609588 9.169745 -9.160425 -11.825509 7.281207 -7.600407 -11.436655 5.685306 -8.730352 -12.075113 4.186075 -9.879075 -13.569809 3.185233 -10.738776 -15.520240 2.950954 -11.079100 -17.403788 3.546014 -10.808854 -18.715759 4.810965 -10.000454 -19.104614 6.406865 -8.870509 -18.466156 7.906096 -7.721786 -16.971462 8.906938 -6.862085 -15.021032 9.141217 -6.521762 -13.137484 8.546159 -6.792006 -12.151274 6.808867 -5.133163 -11.213759 5.141991 -6.246344 -11.402401 3.344510 -7.523083 -12.666651 1.898059 -8.621278 -14.667756 1.190213 -9.246669 -16.869522 1.410638 -9.231683 -18.681986 2.500272 -8.580335 -19.619499 4.167147 -7.467154 -19.430861 5.964627 -6.190415 -18.166611 7.411077 -5.092220 -16.165506 8.118925 -4.466829 -13.963741 7.898500 -4.481814 -12.820156 6.333575 -2.707074 -11.310852 4.774492 -3.709871 -10.929639 2.820077 -5.032474 -11.778663 0.994013 -6.320493 -13.630428 -0.214406 -7.228804 -15.988756 -0.481385 -7.514026 -18.221735 0.264610 -7.099734 -19.731037 1.823693 -6.096938 -20.112253 3.778107 -4.774335 -19.263229 5.604171 -3.486316 -17.411465 6.812590 -2.578005 -15.053138 7.079571 -2.292781 -13.802631 5.697474 -0.389207 -11.782567 4.431003 -1.191128 -10.782187 2.504907 -2.462770 -11.069539 0.435281 -3.863399 -12.567630 -1.223320 -5.017716 -14.875047 -2.026475 -5.616425 -17.373520 -1.758981 -5.499099 -19.393583 -0.492511 -4.697179 -20.393965 1.433584 -3.425536 -20.106613 3.503210 -2.024908 -18.608522 5.161811 -0.870590 -16.301107 5.964968 -0.271882 -14.996368 4.765364 1.766928 -12.607630 3.945505 1.239387 -11.026302 2.243884 0.116700 -10.676100 0.116450 -1.300311 -11.650860 -1.866754 -2.631958 -13.689396 -3.174329 -3.521428 -16.245483 -3.455912 -3.730387 -18.634220 -2.636054 -3.202847 -20.215549 -0.934434 -2.080160 -20.565752 1.193000 -0.663150 -19.590994 3.176203 0.668497 -17.552460 4.483779 1.557967 -16.245445 3.455805 3.730561 -13.689363 3.174477 3.521181 -11.650842 1.867127 2.631346 -10.676103 -0.115944 1.299485 -11.026325 -2.243373 -0.117530 -12.607668 -3.945117 -1.240011 -14.996410 -4.765195 -1.767190 -17.552492 -4.483868 -1.557811 -19.591013 -3.176518 -0.667976 -20.565754 -1.193448 0.663885 -20.215532 0.933981 2.080900 -18.634192 2.635725 3.203381 -17.373512 1.758791 5.499383 -14.875053 2.026696 5.616098 -12.567648 1.223900 5.016853 -11.069564 -0.434489 3.862216 -10.782212 -2.504106 2.461571 -11.782588 -4.430399 1.190220 -13.802640 -5.697221 0.388819 -16.301100 -5.965127 0.272104 -18.608503 -5.162332 0.871348 -20.106588 -3.503944 2.025985 -20.393942 -1.434327 3.426630 -19.393568 0.491967 4.697981 -18.221636 -0.264935 7.100320 -15.988650 0.481261 7.514238 -13.630345 0.214523 7.228574 -11.778625 -0.993677 6.319870 -10.929658 -2.819603 5.031613 -11.310922 -4.774000 3.708991 -12.820259 -6.333187 2.706399 -15.053243 -7.079383 2.292480 -17.411549 -6.812646 2.578145 -19.263268 -5.604446 3.486848 -20.112238 -3.778521 4.775104 -19.730974 -1.824126 6.097726 -18.681616 -2.500726 8.581628 -16.869013 -1.411172 9.232741 -14.667247 -1.190675 9.247197 -12.666278 -1.898318 8.621122 -11.402265 -3.344487 7.522274 -11.213899 -5.141682 6.245086 -12.151651 -6.808348 5.131782 -13.964253 -7.897901 4.480669 -16.166019 -8.118399 4.466212 -18.166986 -7.410757 5.092286 -19.431002 -5.964589 6.191134 -19.619370 -4.167394 7.468322 -18.715357 -4.811340 10.002035 -17.403107 -3.546588 10.810312 -15.519465 -2.951565 11.080031 -13.569151 -3.185707 10.738921 -12.074748 -4.186277 9.878381 -11.436682 -5.685172 8.728994 -11.825921 -7.280764 7.598737 -13.138168 -8.545517 6.790459 -15.021810 -9.140540 6.520740 -16.972124 -8.906399 6.861849 -18.466528 -7.905829 7.722389 -19.104595 -6.406935 8.871775 -18.354040 -7.072208 11.420950 -17.542898 -5.798954 12.299908 -16.070946 -4.977241 12.757985 -14.332592 -4.827245 12.672442 -12.793626 -5.389158 12.066198 -11.866413 -6.512416 11.101700 -11.799399 -7.896042 10.037379 -12.610541 -9.169296 9.158422 -14.082493 -9.991010 8.700343 -15.820848 -10.141006 8.785886 -17.359814 -9.579094 9.392128 -18.287027 -8.455837 10.356627 -17.681938 -9.198944 12.883787 -17.306870 -8.051888 13.754115 -16.267235 -7.153338 14.324772 -14.841599 -6.744061 14.442849 -13.411964 -6.933719 14.076710 -12.361399 -7.671496 13.324459 -11.971400 -8.759705 12.387663 -12.346469 -9.906759 11.517335 -13.386105 -10.805310 10.946679 -14.811738 -11.214588 10.828600 -16.241373 -11.024931 11.194739 -17.291939 -10.287154 11.946990 -16.807762 -11.162612 14.413801 -16.763420 -10.225842 15.214293 -16.115284 -9.373823 15.826071 -15.037024 -8.834849 16.085209 -13.817558 -8.753341 15.922273 -12.783641 -9.151136 15.380919 -12.212311 -9.921647 14.606203 -12.256653 -10.858416 13.805712 -12.904788 -11.710435 13.193933 -13.983047 -12.249409 12.934795 -15.202514 -12.330918 13.097732 -16.236431 -11.933124 13.639085 -15.833997 -12.988605 16.006613 -16.004684 -12.291722 16.700590 -15.668715 -11.565623 17.297487 -14.916110 -11.004866 17.637367 -13.948531 -10.759702 17.629158 -13.025239 -10.895825 17.275063 -12.393630 -11.376761 16.669956 -12.222942 -12.073643 15.975981 -12.558912 -12.799742 15.379084 -13.311516 -13.360500 15.039204 -14.279095 -13.605664 15.047413 -15.202387 -13.469541 15.401509 -14.832108 -14.741543 17.630039 -15.118093 -14.269516 18.206738 -15.003222 -13.701257 18.755430 -14.518274 -13.189028 19.129091 -13.793192 -12.870082 19.227606 -13.022259 -12.829880 19.024570 -12.412046 -13.079193 18.574394 -12.126061 -13.551220 17.997696 -12.240932 -14.119479 17.449005 -12.725879 -14.631707 17.075340 -13.450961 -14.950654 16.976828 -14.221894 -14.990857 17.179861 -13.829679 -16.501429 19.227068 -14.164059 -16.213593 19.698517 -14.190716 -15.797021 20.191147 -13.902508 -15.363334 20.572952 -13.376659 -15.028738 20.741632 -12.754071 -14.882887 20.651989 -12.201566 -14.964862 20.328043 -11.867186 -15.252699 19.856594 -11.840528 -15.669270 19.363964 -12.128736 -16.102957 18.982159 -12.654584 -16.437553 18.813478 -13.277172 -16.583405 18.903120 -12.809241 -18.339252 20.720705 -13.163775 -18.191523 21.114611 -13.279267 -17.900454 21.566961 -13.124773 -17.544037 21.956547 -12.741687 -17.217772 22.178982 -12.232658 -17.009081 22.174662 -11.734080 -16.973885 21.944746 -11.379546 -17.121614 21.550840 -11.264053 -17.412683 21.098490 -11.418549 -17.769100 20.708904 -11.801634 -18.095366 20.486469 -12.310662 -18.304054 20.490789 -11.717700 -20.294460 22.020155 -12.097865 -20.259518 22.369730 -12.281298 -20.069931 22.815104 -12.218846 -19.776499 23.236940 -11.927245 -19.457846 23.522211 -11.484628 -19.199354 23.594473 -11.009593 -19.070290 23.434366 -10.629428 -19.105232 23.084791 -10.445995 -19.294819 22.639418 -10.508447 -19.588251 22.217581 -10.800048 -19.906904 21.932312 -11.242665 -20.165394 21.860048 -10.482245 -22.358191 23.029001 -10.914547 -22.438862 23.359587 -11.171839 -22.350105 23.837709 -11.185179 -22.115702 24.335258 -10.950993 -21.798460 24.718918 -10.532031 -21.483383 24.885883 -10.040553 -21.254900 24.791418 -9.608252 -21.174227 24.460833 -9.350960 -21.262985 23.982710 -9.337620 -21.497389 23.485161 -9.571805 -21.814631 23.101501 -9.990767 -22.129707 22.934538 -9.029640 -24.464651 23.658722 -9.545413 -24.695560 23.971102 -9.896756 -24.744576 24.510616 -9.989527 -24.598562 25.132706 -9.798867 -24.296646 25.670681 -9.375864 -23.919727 25.980391 -8.833862 -23.568796 25.978851 -8.318089 -23.337887 25.666471 -7.966747 -23.288872 25.126957 -7.873976 -23.434885 24.504868 -8.064635 -23.736801 23.966892 -8.487638 -24.113720 23.657183 -7.305028 -26.497669 23.850245 -7.926635 -26.929628 24.103596 -8.391058 -27.189926 24.698345 -8.573856 -27.208811 25.475132 -8.426049 -26.981226 26.225817 -7.987241 -26.568151 26.749256 -7.375010 -26.080269 26.905191 -6.753404 -25.648310 26.651840 -6.288980 -25.388014 26.057093 -6.106182 -25.369125 25.280304 -6.253989 -25.596710 24.529619 -6.692797 -26.009785 24.006182 -5.282182 -28.322296 23.597149 -6.018998 -28.987581 23.701435 -6.604073 -29.544724 24.287655 -6.880636 -29.844444 25.198727 -6.774582 -29.806431 26.190536 -6.314330 -29.440868 26.997322 -5.623202 -28.845711 27.402912 -4.886386 -28.180428 27.298626 -4.301311 -27.623283 26.712408 -4.024748 -27.323563 25.801334 -4.130801 -27.361576 24.809528 -4.591054 -27.727139 24.002739 -2.951361 -29.841352 22.948875 -3.809889 -30.710247 22.780849 -4.516187 -31.614805 23.231625 -4.881004 -32.312653 24.180410 -4.806588 -32.616802 25.372986 -4.312878 -32.445755 26.489799 -3.532164 -31.845345 27.231606 -2.673637 -30.976448 27.399632 -1.967338 -30.071890 26.948858 -1.602521 -29.374041 26.000072 -1.676937 -29.069895 24.807495 -2.170646 -29.240940 23.690681 -0.291229 -31.043884 21.970337 -1.290764 -31.998430 21.419292 -2.129579 -33.217648 21.573460 -2.582916 -34.374855 22.391527 -2.529302 -35.159973 23.654299 -1.983104 -35.362637 25.023411 -1.090675 -34.928535 26.132015 -0.091141 -33.973991 26.683060 0.747675 -32.754772 26.528894 1.201012 -31.597567 25.710825 1.147399 -30.812447 24.448057 0.601201 -30.609785 23.078943 2.743186 -32.000622 20.672657 1.566807 -32.847980 19.698082 0.559095 -34.247475 19.419493 -0.009935 -35.824116 19.911535 0.012188 -37.155434 21.042370 0.619537 -37.884712 22.508987 1.649373 -37.816532 23.918411 2.825751 -36.969173 24.892984 3.833464 -35.569679 25.171576 4.402494 -33.993042 24.679535 4.380371 -32.661724 23.548702 3.773023 -31.932444 22.082085 6.192642 -32.803741 18.971996 4.803723 -33.325703 17.640320 3.571326 -34.694580 16.877249 2.825672 -36.543579 16.887245 2.766558 -38.377266 17.667631 3.409822 -39.704304 19.009302 4.583104 -40.169113 20.552761 5.972023 -39.647152 21.884438 7.204419 -38.278275 22.647509 7.950074 -36.429276 22.637514 8.009189 -34.595589 21.857126 7.365925 -33.268555 20.515455 10.045561 -33.499950 16.709995 8.436216 -33.513241 15.191299 6.928499 -34.617535 14.006423 5.926402 -36.516930 13.472852 5.698435 -38.702488 13.733554 6.305681 -40.588589 14.718678 7.585430 -41.669857 16.164255 9.194775 -41.656567 17.682951 10.702491 -40.552273 18.867828 11.704589 -38.652882 19.401402 11.932556 -36.467323 19.140697 11.325311 -34.581223 18.155577 14.198108 -34.054665 13.723860 12.409976 -33.458057 12.253825 10.611450 -34.098404 10.815208 9.284443 -35.804127 9.793487 8.784525 -38.118183 9.462428 9.245649 -40.420517 9.910740 10.544257 -42.094223 11.018297 12.332388 -42.690826 12.488331 14.130914 -42.050484 13.926948 15.457921 -40.344761 14.948669 15.957840 -38.030708 15.279729 15.496716 -35.728374 14.831418 18.452036 -34.358143 9.919477 16.580515 -33.155216 8.745564 14.529777 -33.210854 7.289859 12.849316 -34.510139 5.942418 11.989410 -36.704937 5.064284 12.180471 -39.207153 4.890755 13.371304 -41.346317 5.468326 15.242825 -42.549244 6.642238 17.293562 -42.493610 8.097941 18.974022 -41.194321 9.445383 19.833929 -38.999527 10.323517 19.642868 -36.497311 10.497047 22.542276 -34.256714 5.322910 20.723871 -32.554268 4.650888 18.516535 -32.006744 3.432517 16.511723 -32.760857 1.994257 15.246623 -34.614536 0.721490 15.060218 -37.071091 -0.044747 16.002455 -39.472298 -0.099141 17.820860 -41.174740 0.572880 20.028194 -41.722267 1.791251 22.033007 -40.968159 3.229511 23.298107 -39.114475 4.502277 23.484514 -36.657921 5.268515 26.183662 -33.594070 0.097537 24.572996 -31.579182 0.047426 22.350473 -30.513729 -0.715296 20.111618 -30.683205 -1.986256 18.456329 -32.042191 -3.424903 17.828140 -34.226555 -4.645752 18.395372 -36.650993 -5.321677 20.006039 -38.665882 -5.271566 22.228561 -39.731335 -4.508846 24.467417 -39.561859 -3.237886 26.122705 -38.202873 -1.799240 26.750896 -36.018513 -0.578390 29.122616 -32.251545 -5.471204 27.863556 -30.152979 -4.889416 25.790382 -28.738476 -5.059144 23.458601 -28.387049 -5.934912 21.493010 -29.192860 -7.282056 20.420288 -30.939993 -8.739612 20.527870 -33.160309 -9.917027 21.786930 -35.258869 -10.498815 23.860102 -36.673370 -10.329086 26.191883 -37.024803 -9.453321 28.157475 -36.218994 -8.106176 29.230198 -34.471859 -6.648621 31.184088 -30.175787 -11.022477 30.382397 -28.217285 -9.910773 28.617563 -26.669701 -9.458353 26.362476 -25.947712 -9.786443 24.221382 -26.244774 -10.807129 22.767986 -27.481289 -12.246922 22.391726 -29.325932 -13.720029 23.193417 -31.284435 -14.831732 24.958248 -32.832020 -15.284152 27.213335 -33.554008 -14.956064 29.354429 -33.256947 -13.935377 30.807825 -32.020432 -12.495585 32.295860 -27.399412 -16.169346 31.998369 -25.753700 -14.720313 30.667507 -24.288338 -13.731333 28.659878 -23.395964 -13.467404 26.513422 -23.315691 -13.999245 24.803284 -24.069029 -15.184348 23.987690 -25.454123 -16.705168 24.285181 -27.099834 -18.154202 25.616041 -28.565197 -19.143181 27.623671 -29.457571 -19.407112 29.770124 -29.537844 -18.875273 31.480265 -28.784506 -17.690170 32.496811 -24.047020 -20.558172 32.680508 -22.801416 -19.012342 31.852364 -21.584669 -17.667509 30.234276 -20.722809 -16.884026 28.259809 -20.446764 -16.871820 26.458021 -20.830507 -17.634167 25.311701 -21.771208 -18.966791 25.128000 -23.016813 -20.512621 25.956146 -24.233559 -21.857452 27.574232 -25.095421 -22.640938 29.548698 -25.371466 -22.653143 31.350487 -24.987724 -21.890799 31.925381 -20.329523 -23.922682 32.499321 -19.473614 -22.512127 32.171413 -18.586241 -21.043558 31.029520 -17.905174 -19.910475 29.379610 -17.612907 -19.416485 27.663774 -17.787752 -19.693954 26.341772 -18.382856 -20.668535 25.767830 -19.238766 -22.079088 26.095736 -20.126137 -23.547657 27.237629 -20.807203 -24.680742 28.887539 -21.099472 -25.174732 30.603374 -20.924629 -24.897263 30.793575 -16.511057 -26.135262 31.615770 -15.956972 -25.025833 31.713587 -15.386172 -23.655262 31.060816 -14.951605 -22.390789 29.832367 -14.769711 -21.571234 28.357401 -14.889229 -21.416189 27.031136 -15.278133 -21.967205 26.208941 -15.832217 -23.076633 26.111124 -16.403017 -24.447205 26.763893 -16.837585 -25.711676 27.992342 -17.019480 -26.531233 29.467308 -16.899963 -26.686275 29.343821 -12.856367 -27.232960 30.254108 -12.481160 -26.490767 30.649363 -12.141576 -25.373306 30.423674 -11.928604 -24.180006 29.637518 -11.899314 -23.230608 28.501541 -12.061551 -22.779501 27.320131 -12.371844 -22.947563 26.409843 -12.747052 -23.689756 26.014589 -13.086637 -24.807217 26.240276 -13.299608 -26.000515 27.026434 -13.328898 -26.949915 28.162409 -13.166661 -27.401020 27.791630 -9.548270 -27.403019 28.652430 -9.247080 -26.997229 29.199287 -9.032342 -26.190264 29.285671 -8.961595 -25.198351 28.888437 -9.053794 -24.287273 28.114025 -9.284235 -23.701153 27.169933 -9.591172 -23.597042 26.309134 -9.892363 -24.002832 25.762278 -10.107100 -24.809795 25.675892 -10.177848 -25.801710 26.073124 -10.085649 -26.712786 26.847538 -9.855207 -27.298908 26.272938 -6.649539 -26.904779 27.001308 -6.362862 -26.748411 27.578442 -6.190031 -26.224764 27.849695 -6.177355 -25.474150 27.742388 -6.328233 -24.697695 27.285269 -6.602235 -24.103453 26.600826 -6.925944 -23.850645 25.872456 -7.212622 -24.007013 25.295322 -7.385453 -24.530659 25.024069 -7.398128 -25.281273 25.131376 -7.247251 -26.057730 25.588493 -6.973248 -26.651972 24.827715 -4.131605 -25.978399 25.402384 -3.837209 -25.979366 25.940220 -3.659623 -25.669352 26.297112 -3.646430 -25.131422 26.377430 -3.801166 -24.509714 26.159651 -4.082369 -23.970814 25.702131 -4.414691 -23.659121 25.127462 -4.709087 -23.658154 24.589626 -4.886673 -23.968168 24.232735 -4.899866 -24.506098 24.152416 -4.745131 -25.127806 24.370193 -4.463928 -25.666706 23.427401 -1.930466 -24.791149 23.870836 -1.618644 -24.884996 24.353083 -1.413443 -24.717640 24.744919 -1.369847 -24.333923 24.941357 -1.499538 -23.836660 24.889757 -1.767764 -23.359097 24.603949 -2.102655 -23.029190 24.160513 -2.414478 -22.935343 23.678267 -2.619678 -23.102699 23.286430 -2.663275 -23.486416 23.089993 -2.533584 -23.983679 23.141592 -2.265358 -24.461243 22.020098 0.000650 -23.434313 22.369287 0.347913 -23.593761 22.814381 0.601978 -23.521021 23.236118 0.694768 -23.235577 23.521494 0.601419 -22.813919 23.594042 0.346945 -22.369028 23.434324 -0.000468 -22.020109 23.085135 -0.347732 -21.860661 22.640041 -0.601797 -21.933401 22.218304 -0.694586 -22.218843 21.932928 -0.601238 -22.640503 21.860380 -0.346764 -23.085394 20.566826 1.676120 -21.944925 20.846565 2.090728 -22.174118 21.281782 2.427261 -22.177845 21.755863 2.595546 -21.955111 22.141775 2.550491 -21.565592 22.336117 2.304169 -21.113663 22.286812 1.922581 -20.720417 22.007072 1.507974 -20.491222 21.571856 1.171440 -20.487495 21.097775 1.003155 -20.710232 20.711863 1.048210 -21.099749 20.517521 1.294532 -21.551676 19.060682 3.085237 -20.328428 19.265953 3.605145 -20.651678 19.703566 4.071517 -20.740688 20.256264 4.359387 -20.571613 20.775949 4.391623 -20.189753 21.123377 4.159586 -19.697430 21.205450 3.725451 -19.226557 21.000179 3.205543 -18.903309 20.562567 2.739172 -18.814295 20.009871 2.451301 -18.983372 19.490183 2.419065 -19.365231 19.142757 2.651101 -19.857555 17.532843 4.210195 -18.575039 17.622070 4.863816 -19.024488 18.042389 5.511574 -19.226799 18.681177 5.979901 -19.127762 19.367268 6.143311 -18.753912 19.916826 5.958017 -18.205425 20.182600 5.473669 -17.629265 20.093372 4.820047 -17.179815 19.673054 4.172290 -16.977507 19.034267 3.703963 -17.076544 18.348175 3.540553 -17.450390 17.798616 3.725847 -17.998878 16.049074 5.045560 -16.671051 15.948488 5.833755 -17.275227 16.292398 6.701766 -17.628332 16.988653 7.417008 -17.635752 17.850695 7.787835 -17.295496 18.647535 7.714882 -16.698738 19.165667 7.217698 -16.005379 19.266253 6.429503 -15.401203 18.922342 5.561493 -15.048097 18.226088 4.846250 -15.040679 17.364048 4.475423 -15.380933 16.567205 4.548376 -15.977691 14.698333 5.615608 -14.607380 14.316743 6.496321 -15.381363 14.489264 7.591052 -15.921842 15.169672 8.606467 -16.083996 16.175650 9.270487 -15.824379 17.237648 9.405189 -15.212551 18.071102 8.974480 -14.412454 18.452694 8.093766 -13.638471 18.280170 6.999036 -13.097992 17.599764 5.983621 -12.935836 16.593788 5.319600 -13.195455 15.531790 5.184898 -13.807281 13.571693 5.987609 -12.388987 12.824242 6.870095 -13.325178 12.710588 8.149297 -14.076609 13.261184 9.482451 -14.441931 14.328498 10.512343 -14.323258 15.626544 10.963013 -13.752389 16.807512 10.713704 -12.882287 17.554964 9.831218 -11.946095 17.668617 8.552017 -11.194664 17.118023 7.218862 -10.829342 16.050709 6.188970 -10.948014 14.752663 5.738300 -11.518883 12.737849 6.270226 -10.038770 11.573021 7.020635 -11.102630 11.063790 8.385765 -12.066393 11.346606 9.999830 -12.671822 12.345689 11.430345 -12.756691 13.793332 12.294001 -12.298260 15.301644 12.359385 -11.419364 16.466473 11.608976 -10.355505 16.975702 10.243847 -9.391741 16.692888 8.629782 -8.786312 15.693807 7.199267 -8.701443 14.246163 6.335609 -9.159874 12.218442 6.600688 -7.600008 10.641912 7.061770 -8.730015 9.662745 8.364215 -9.878851 9.543305 10.159033 -10.738687 10.315598 11.965304 -11.079129 11.772687 13.299041 -10.808959 13.524147 13.802869 -10.000566 15.100677 13.341787 -8.870560 16.079845 12.039344 -7.721725 16.199286 10.244526 -6.861889 15.426993 8.438254 -6.521445 13.969905 7.104517 -6.791615 11.972205 7.118620 -5.133672 10.059718 7.140447 -6.246581 8.597246 8.202861 -7.522945 7.976659 10.021189 -8.620764 8.364243 12.108212 -9.245878 9.656143 13.904713 -9.230787 11.506197 14.929321 -8.579537 13.418684 14.907495 -7.466629 14.881156 13.845081 -6.190265 15.501743 12.026754 -5.092446 15.114161 9.939733 -4.467332 13.822262 8.143231 -4.482421 11.895114 7.935914 -2.706812 9.790278 7.408273 -3.709640 7.907092 8.055262 -5.032294 6.750151 9.703519 -6.320369 6.629458 11.911395 -7.228727 7.577353 14.087292 -7.513974 9.339847 15.648180 -7.099679 11.444681 16.175821 -6.096851 13.327868 15.528834 -4.774198 14.484809 13.880579 -3.486123 14.605503 11.672703 -2.577764 13.657610 9.496805 -2.292517 11.835367 9.104911 -0.388787 9.728541 7.988660 -1.190656 7.560307 8.085267 -2.462328 5.911641 9.368845 -3.863061 5.224301 11.495460 -5.017528 5.682460 13.895288 -5.616391 7.163354 15.925297 -5.499186 9.270180 17.041548 -4.697317 11.438414 16.944942 -3.425645 13.087080 15.661366 -2.024913 13.774421 13.534752 -0.870446 13.316263 11.134923 -0.271582 11.625535 10.604346 1.766236 9.721079 8.945597 1.238835 7.456579 8.427029 0.116480 5.438806 9.187593 -1.300095 4.208420 11.023498 -2.631319 4.095101 13.442811 -3.520493 5.129214 15.797281 -3.729362 7.033669 17.456032 -3.201962 9.298168 17.974602 -2.079607 11.315942 17.214037 -0.663033 12.546329 15.378134 0.668191 12.659649 12.958821 1.557366 11.115422 12.341248 3.730819 9.593789 10.268249 3.521456 7.442365 9.156458 2.631612 5.237623 9.303778 1.299720 3.570321 10.670735 -0.117340 2.887213 12.891054 -1.239868 3.371335 15.369802 -1.767085 4.892967 17.442801 -1.557722 7.044391 18.554592 -0.667879 9.249133 18.407274 0.664012 10.916434 17.040318 2.081072 11.599545 14.819999 3.203601 10.209469 14.166692 5.500098 9.192177 11.869057 5.616906 7.343267 10.272183 5.017587 5.158155 9.803954 3.862730 3.222338 10.589828 2.461778 2.054518 12.419230 1.190115 1.967610 14.801976 0.388481 2.984902 17.099611 0.271674 4.833810 18.696484 0.870991 7.018922 19.164715 2.025848 8.954739 18.378841 3.426800 10.122561 16.549440 4.698463 8.880924 15.912967 7.101046 8.410585 13.606078 7.514969 7.000470 11.697105 7.229164 5.028416 10.697557 6.320211 3.022834 10.875261 5.031665 1.521119 12.182601 3.708790 0.925653 14.269277 2.706050 1.395991 16.576166 2.292126 2.806106 18.485140 2.577931 4.778159 19.484688 3.486883 6.783741 19.306984 4.775428 8.285457 17.999647 6.098304 7.174888 17.429235 8.581871 7.212191 15.314725 9.232996 6.302309 13.297691 9.247446 4.689044 11.918600 8.621348 2.804668 11.546976 7.522467 1.154099 12.282396 6.245245 0.179606 13.927805 5.131915 0.142302 16.042316 4.480789 1.052184 18.059349 4.466339 2.665448 19.438442 5.092436 4.549823 19.810066 6.191317 6.200392 19.074646 7.468538 5.190718 18.614000 10.001685 5.630272 16.845249 10.809844 5.204051 14.916422 11.079620 4.026260 13.344351 10.738728 2.412486 12.550267 9.878509 0.795140 12.746946 8.729457 -0.392413 13.881688 7.599462 -0.831968 15.650440 6.791303 -0.405748 17.579266 6.521527 0.772043 19.151337 6.862419 2.385816 19.945421 7.722637 4.003163 19.748745 8.871688 3.052193 19.431171 11.421024 3.749248 18.092117 12.300032 3.724857 16.406561 12.758180 2.985555 14.826140 12.672707 1.729437 13.774330 12.066518 0.293081 13.532963 11.102039 -0.938645 14.166711 10.037702 -1.635700 15.505763 9.158694 -1.611309 17.191320 8.700546 -0.872008 18.771740 8.786017 0.384109 19.823551 9.392206 1.820466 20.064919 10.356685 0.874274 19.912481 12.884024 1.680059 19.014153 13.754379 1.938370 17.664555 14.325047 1.579991 16.225307 14.443116 0.700951 15.082062 14.076951 -0.463212 14.541144 13.324666 -1.600563 14.747497 12.387834 -2.406348 15.645824 11.517478 -2.664658 16.995422 10.946811 -2.306281 18.434668 10.828740 -1.427241 19.577913 11.194905 -0.263078 20.118832 11.947189 -1.263699 20.137325 14.413780 -0.474428 19.630688 15.214150 -0.060414 18.643478 15.825897 -0.132591 17.440224 16.085106 -0.671620 16.343332 15.922319 -1.533068 15.646715 15.381158 -2.486110 15.537031 14.606625 -3.275381 16.043671 13.806255 -3.689395 17.030878 13.194508 -3.617218 18.234133 12.935300 -3.078190 19.331026 13.098085 -2.216743 20.027641 13.639247 -3.331402 20.206938 16.006872 -2.642679 20.006237 16.700928 -2.182013 19.352188 17.297871 -2.072837 18.420042 17.637747 -2.344406 17.459566 17.629488 -2.923953 16.728119 17.275311 -3.656188 16.421690 16.670111 -4.344911 16.622391 15.976054 -4.805577 17.276438 15.379113 -4.914753 18.208586 15.039236 -4.643184 19.169060 15.047495 -4.063638 19.900509 15.401672 -5.350668 20.215771 17.630259 -4.798938 20.227421 18.206976 -4.364289 19.843813 18.755674 -4.163185 19.167732 19.129332 -4.249512 18.380337 19.227823 -4.600138 17.692608 19.024761 -5.121114 17.288818 18.574556 -5.672844 17.277168 17.997841 -6.107494 17.660776 17.449141 -6.308598 18.336857 17.075485 -6.222271 19.124250 16.976992 -5.871645 19.811981 17.180052 -7.376164 20.227531 19.227213 -6.959685 20.373253 19.698610 -6.585544 20.188120 20.191206 -6.353992 19.721731 20.573011 -6.327075 19.099058 20.741714 -6.512003 18.486946 20.652119 -6.859227 18.049408 20.328230 -7.275707 17.903687 19.856833 -7.649848 18.088820 19.364237 -7.881399 18.555208 18.982433 -7.908317 19.177881 18.813728 -7.723388 19.789993 18.903322 -9.477850 20.262756 20.720840 -9.172648 20.495935 21.114737 -8.862829 20.450434 21.567080 -8.631408 20.138441 21.956667 -8.540394 19.643559 22.179110 -8.614173 19.098387 22.174801 -8.832977 18.649006 21.944901 -9.138179 18.415827 21.551004 -9.447998 18.461329 21.098661 -9.679420 18.773321 20.709074 -9.770433 19.268204 20.486631 -9.696654 19.813375 20.490938 -11.716900 20.295046 22.020260 -11.496552 20.606819 22.369822 -11.240640 20.670900 22.815189 -11.017735 20.470116 23.237028 -10.887566 20.058262 23.522306 -10.885010 19.545702 23.594585 -11.010752 19.069773 23.434498 -11.231099 18.757999 23.084936 -11.487012 18.693918 22.639570 -11.709916 18.894703 22.217730 -11.840086 19.306553 21.932451 -11.842643 19.819115 21.860172 -14.121834 20.256996 23.029076 -13.975537 20.671721 23.359663 -13.770025 20.850161 23.837791 -13.560363 20.744511 24.335352 -13.402730 20.383074 24.719017 -13.339364 19.862698 24.885990 -13.387243 19.322819 24.791527 -13.533540 18.908094 24.460939 -13.739052 18.729654 23.982811 -13.948714 18.835304 23.485252 -14.106347 19.196741 23.101585 -14.169713 19.717117 22.934612 -16.672321 20.052261 23.658754 -16.614403 20.614388 23.971155 -16.481201 20.943151 24.510696 -16.308403 20.950460 25.132809 -16.142313 20.634363 25.670795 -16.027433 20.079550 25.980501 -15.994546 19.434685 25.978947 -16.052462 18.872559 25.666544 -16.185665 18.543795 25.127003 -16.358463 18.536484 24.504892 -16.524553 18.852583 23.966906 -16.639433 19.407396 23.657198 -19.295227 19.575171 23.850233 -19.358561 20.329485 24.103596 -19.351841 20.861832 24.698366 -19.276869 21.029575 25.475176 -19.153734 20.787762 26.225880 -19.015429 20.201191 26.749327 -18.899014 19.427031 26.905260 -18.835680 18.672716 26.651897 -18.842400 18.140369 26.057129 -18.917372 17.972628 25.280317 -19.040506 18.214439 24.529613 -19.178812 18.801010 24.006166 -21.887342 18.735374 23.597109 -22.095034 19.706152 23.701324 -22.284853 20.491501 24.287498 -22.405939 20.880991 25.198565 -22.425848 20.770256 26.190403 -22.339245 20.188967 26.997253 -22.169333 19.292881 27.402922 -21.961643 18.322105 27.298706 -21.771822 17.536755 26.712534 -21.650736 17.147266 25.801470 -21.630827 17.257999 24.809629 -21.717430 17.839287 24.002779 -24.368042 17.476435 22.948788 -24.691259 18.654402 22.780720 -25.121437 19.718399 23.231474 -25.543310 20.383327 24.180269 -25.843836 20.471024 25.372879 -25.942490 19.957987 26.489740 -25.812840 18.981688 27.231594 -25.489622 17.803720 27.399662 -25.059444 16.739723 26.948908 -24.637573 16.074795 26.000113 -24.337046 15.987098 24.807507 -24.238392 16.500135 23.690643 -26.738813 15.774347 21.970446 -27.065601 17.117317 21.419479 -27.702141 18.453344 21.573654 -28.477867 19.424442 22.391661 -29.184929 19.770407 23.654316 -29.633867 19.398535 25.023287 -29.704391 18.408474 26.131765 -29.377602 17.065504 26.682732 -28.741064 15.729476 26.528557 -27.965336 14.758377 25.710550 -27.258274 14.412414 24.447897 -26.809336 14.784283 23.078924 -29.084967 13.624596 20.672640 -29.230524 15.067107 19.698111 -29.938639 16.639589 19.419531 -31.019571 17.920696 19.911547 -32.183689 18.567156 21.042324 -33.119064 18.405752 22.508865 -33.575066 17.479731 23.918219 -33.429512 16.037220 24.892748 -32.721397 14.464739 25.171328 -31.640465 13.183631 24.679312 -30.476347 12.537169 23.548538 -29.540970 12.698573 22.081993 -31.505482 11.038612 18.971748 -31.263247 12.502250 17.639818 -31.832628 14.253885 16.876589 -33.061062 15.824171 16.886562 -34.619389 16.792349 17.667068 -36.090061 16.898996 19.008972 -37.079006 16.115540 20.552708 -37.321239 14.651903 21.884636 -36.751862 12.900268 22.647867 -35.523426 11.329983 22.637896 -33.965099 10.361804 21.857389 -32.494431 10.255155 20.515488 -34.034531 8.050316 16.710136 -33.241394 9.450638 15.191364 -33.443943 11.308418 14.006349 -34.587898 13.125870 13.472616 -36.366745 14.416004 13.733178 -38.303841 14.833134 14.718218 -39.880142 14.265487 16.163794 -40.673279 12.865167 17.682568 -40.470730 11.007386 18.867584 -39.326775 9.189936 19.401316 -37.547928 7.899800 19.140755 -35.610832 7.482670 18.155716 -36.591530 4.731014 13.723372 -35.180626 5.981474 12.253651 -34.835747 7.859440 10.815357 -35.649307 9.861712 9.793880 -37.403309 11.451782 9.462926 -39.627773 12.203592 9.911170 -41.726654 11.915697 11.018507 -43.137558 10.665237 12.488228 -43.482437 8.787272 13.926520 -42.668880 6.785001 14.947996 -40.914879 5.194931 15.278953 -38.690414 4.443119 14.830709 -38.981163 1.198907 9.919177 -37.003586 2.218306 8.745408 -36.026340 4.022207 7.289852 -36.311275 6.127256 5.942524 -37.782043 7.969406 5.064439 -40.044556 9.055056 4.890880 -42.492569 9.093306 5.468350 -44.470142 8.073906 6.642118 -45.447392 6.270007 8.097674 -45.162457 4.164958 9.445003 -43.691689 2.322808 10.323088 -41.429180 1.237158 10.496648 -40.938301 -2.393454 5.323459 -38.554741 -1.669995 4.651302 -36.976917 -0.032346 3.432646 -36.627605 2.080687 1.994028 -37.600407 4.102918 0.720926 -39.634655 5.492492 -0.045535 -42.185280 5.877073 -0.099981 -44.568840 5.153614 0.572176 -46.146664 3.515966 1.790831 -46.495975 1.402933 3.229449 -45.523174 -0.619297 4.502552 -43.488930 -2.008872 5.269012 -42.185184 -5.878596 0.097649 -39.634911 -5.491143 0.047591 -37.600929 -4.099134 -0.715150 -36.628250 -2.075557 -1.986198 -36.977501 0.037374 -3.424976 -38.555099 1.673499 -4.645965 -40.938328 2.394420 -5.322002 -43.488602 2.006968 -5.271944 -45.522579 0.614960 -4.509203 -46.495262 -1.408617 -3.238156 -46.146011 -3.521547 -1.799379 -44.568417 -5.157673 -0.578389 -42.491688 -9.095865 -5.472212 -40.044689 -9.054919 -4.890663 -37.783134 -7.966681 -5.060304 -36.313000 -6.122745 -5.935678 -36.028214 -4.017190 -7.282231 -37.005081 -2.214198 -8.739155 -38.981846 -1.196880 -9.916067 -41.428844 -1.237825 -10.497616 -43.690399 -2.326061 -10.327977 -45.160530 -4.169998 -9.452602 -45.445320 -6.275553 -8.106050 -44.468456 -8.078545 -6.649127 -41.724976 -11.918423 -11.022626 -39.627983 -12.203440 -9.910995 -37.405315 -11.448855 -9.458593 -35.652527 -9.856862 -9.786642 -34.839279 -7.854031 -10.807241 -35.183483 -5.977021 -12.246922 -36.592903 -4.728773 -13.719923 -38.689892 -4.443757 -14.831554 -40.912563 -5.198339 -15.283957 -42.665352 -6.790332 -14.955909 -43.478600 -8.793162 -13.935310 -43.134399 -10.670173 -12.495629 -39.876572 -14.269274 -16.169285 -38.302799 -14.834280 -14.719949 -36.368458 -14.414261 -13.730772 -34.591854 -13.121759 -13.466801 -33.449024 -11.303101 -13.998767 -33.246193 -9.445593 -15.184131 -34.037704 -8.046953 -16.705276 -35.611477 -7.481947 -18.154612 -37.545818 -7.901965 -19.143789 -39.322422 -9.194467 -19.407761 -40.465252 -11.013124 -18.875793 -40.668083 -12.870632 -17.690432 -37.073757 -16.119535 -20.558165 -36.086815 -16.901480 -19.012402 -34.618961 -16.792702 -17.667622 -33.063499 -15.822344 -16.884155 -31.837217 -14.250416 -16.871933 -31.268698 -12.498116 -17.634228 -31.510273 -11.034967 -18.966787 -32.497211 -10.253023 -20.512548 -33.965069 -10.361802 -21.857330 -35.520531 -11.332158 -22.640795 -36.746811 -12.904085 -22.653019 -37.315331 -14.656385 -21.890724 -33.568653 -17.483377 -23.922644 -33.114307 -18.408434 -22.512144 -32.181797 -18.568193 -21.043621 -31.020987 -17.919846 -19.910561 -29.942915 -16.637119 -19.416567 -29.236448 -15.063717 -19.694004 -29.090887 -13.621231 -20.668531 -29.545233 -12.696174 -22.079029 -30.477743 -12.536415 -23.547552 -31.638554 -13.184761 -24.680611 -32.716625 -14.467487 -25.174606 -33.423092 -16.040890 -24.897173 -29.696253 -18.412271 -26.135071 -29.627386 -19.401419 -25.025700 -29.181772 -19.771629 -23.655214 -28.478815 -19.423706 -22.390833 -27.706869 -18.450872 -21.571348 -27.072779 -17.113802 -21.416338 -26.746447 -15.770759 -21.967339 -26.815313 -14.781611 -23.076710 -27.260927 -14.411401 -24.447195 -27.963884 -14.759324 -25.711575 -28.735828 -15.732155 -26.531059 -29.369921 -17.069227 -26.686071 -25.805283 -18.984632 -27.233057 -25.935638 -19.960476 -26.490761 -25.839457 -20.472410 -25.373199 -25.542511 -20.383261 -24.179823 -25.124365 -19.716915 -23.230396 -24.697063 -18.651922 -22.779318 -24.375099 -17.473644 -22.947454 -24.244743 -16.497799 -23.689751 -24.340923 -15.985865 -24.807312 -24.637871 -16.075014 -26.000689 -25.056015 -16.741358 -26.950113 -25.483318 -17.806353 -27.401194 -22.164652 -19.294321 -27.403021 -22.334318 -20.190342 -26.997149 -22.421932 -20.771210 -26.190125 -22.404016 -20.881281 -25.198191 -22.285374 -20.491064 -24.287136 -22.097792 -19.705116 -23.701073 -21.891535 -18.734034 -23.597040 -21.721869 -17.838013 -24.002913 -21.634254 -17.257147 -24.809935 -21.652170 -17.147074 -25.801867 -21.770813 -17.537291 -26.712925 -21.958395 -18.323238 -27.298988 -18.895679 -19.427996 -26.904840 -19.011528 -20.202156 -26.748562 -19.150249 -20.788477 -26.224966 -19.274673 -21.029856 -25.474350 -19.351461 -20.861610 -24.697840 -19.360037 -20.328829 -24.103502 -19.298103 -19.574263 -23.850588 -19.182255 -18.800102 -24.006866 -19.043533 -18.213781 -24.530462 -18.919109 -17.972404 -25.281078 -18.842321 -18.140646 -26.057589 -18.833746 -18.673429 -26.651926 -15.992078 -19.435623 -25.978449 -16.024487 -20.080503 -25.979424 -16.139620 -20.635078 -25.669405 -16.306629 -20.950754 -25.131466 -16.480761 -20.942940 -24.509743 -16.615358 -20.613733 -23.970829 -16.674358 -20.051346 -23.659124 -16.641949 -19.406467 -23.658152 -16.526815 -18.851891 -23.968168 -16.359806 -18.536217 -24.506107 -16.185675 -18.544027 -25.127831 -16.051077 -18.873236 -25.666744 -13.385592 -19.323528 -24.791201 -13.337263 -19.863474 -24.885025 -13.400690 -20.383707 -24.717649 -13.558878 -20.744831 -24.333925 -13.769439 -20.850084 -23.836666 -13.975954 -20.671263 -23.359116 -14.123087 -20.256283 -23.029234 -14.171415 -19.716337 -22.935410 -14.107988 -19.196104 -23.102783 -13.949801 -18.834980 -23.486509 -13.739240 -18.729727 -23.983767 -13.532725 -18.908548 -24.461317 -11.009607 -19.070301 -23.434381 -10.883475 -19.546341 -23.593836 -10.886003 -20.058836 -23.521097 -11.016514 -20.470465 -23.235653 -11.240037 -20.670931 -22.813990 -11.496679 -20.606520 -22.369091 -11.717674 -20.294491 -22.020166 -11.843806 -19.818451 -21.860712 -11.841278 -19.305956 -21.933451 -11.710768 -18.894327 -22.218895 -11.487246 -18.693861 -22.640558 -11.230602 -18.758270 -23.085455 -8.831959 -18.649485 -21.945007 -8.612780 -19.099052 -22.174200 -8.538953 -19.644224 -22.177925 -8.630260 -20.138927 -21.955187 -8.862237 -20.450602 -21.565668 -9.172725 -20.495737 -21.113739 -9.478529 -20.262236 -20.720497 -9.697708 -19.812670 -20.491304 -9.771535 -19.267496 -20.487579 -9.680227 -18.772793 -20.710318 -9.448251 -18.461119 -21.099836 -9.137763 -18.415983 -21.551764 -6.858533 -18.049713 -20.328552 -6.510910 -18.487448 -20.651764 -6.325831 -19.099615 -20.740744 -6.352891 -19.722185 -20.571648 -6.584837 -20.188345 -20.189787 -6.959520 -20.373180 -19.697477 -7.376544 -20.227169 -19.226635 -7.724168 -19.789434 -18.903423 -7.909246 -19.177267 -18.814444 -7.882187 -18.554697 -18.983540 -7.650241 -18.088539 -19.365400 -7.275558 -17.903702 -19.857710 -5.120478 -17.289017 -18.575104 -4.599081 -17.693069 -19.024609 -4.248278 -18.380932 -19.226973 -4.162066 -19.168291 -19.127972 -4.363546 -19.844177 -18.754133 -4.798732 -20.227482 -18.205627 -5.351015 -20.215504 -17.629425 -5.872411 -19.811449 -17.179920 -6.223215 -19.123589 -16.977558 -6.309426 -18.336229 -17.076557 -6.107946 -17.660347 -17.450394 -5.672761 -17.277039 -17.998899 -3.655546 -16.421751 -16.670940 -2.922806 -16.728537 -17.275373 -2.343026 -17.460222 -17.628731 -2.071558 -18.420750 -17.636324 -2.181140 -19.352749 -17.296124 -2.642412 -20.006491 -16.699284 -3.331775 -20.206806 -16.005728 -4.064515 -19.900019 -15.401292 -4.644295 -19.168333 -15.047936 -4.915763 -18.207806 -15.040342 -4.806181 -17.275806 -15.380542 -4.344910 -16.622065 -15.977383 -2.485623 -15.536916 -14.607863 -1.531938 -15.647016 -15.381577 -0.670120 -16.343958 -15.921771 -0.131091 -17.440996 -16.083700 -0.059285 -18.644182 -15.823977 -0.473941 -19.631123 -15.212194 -1.263953 -20.137367 -14.412278 -2.217638 -20.027266 -13.638566 -3.079456 -19.330324 -13.098372 -3.618484 -18.233288 -12.936441 -3.690291 -17.030102 -13.196164 -3.275636 -16.043159 -13.807946 -1.600102 -14.747068 -12.389615 -0.461826 -14.541261 -13.325471 0.702918 -15.082682 -14.076530 1.582039 -16.226255 -14.441546 1.939977 -17.665565 -14.322714 1.680822 -19.014950 -13.751874 0.874015 -19.912842 -12.881983 -0.264260 -20.118649 -11.946127 -1.429004 -19.577229 -11.195067 -2.308125 -18.433653 -10.830050 -2.666064 -16.994343 -10.948883 -2.406910 -15.644960 -11.519722 -0.938920 -14.166628 -10.038648 0.293137 -13.532994 -11.102696 1.729833 -13.774457 -12.066677 2.986206 -14.826321 -12.672290 3.725613 -16.406736 -12.757261 3.749930 -18.092234 -12.298825 3.052642 -19.431185 -11.419818 1.820586 -20.064819 -10.355769 0.383890 -19.823357 -9.391789 -0.872483 -18.771494 -8.786177 -1.611891 -17.191078 -8.701204 -1.636209 -15.505581 -9.159639 -0.392946 -13.881494 -7.601024 0.795118 -12.746904 -8.730658 2.413002 -12.550381 -9.879003 4.027195 -13.344581 -10.738358 5.205176 -14.916700 -11.078462 5.631305 -16.845490 -10.808182 5.191401 -18.614130 -9.999941 4.003337 -19.748720 -8.870306 2.385454 -19.945244 -7.721962 0.771261 -19.151045 -6.862606 -0.406721 -17.578928 -6.522502 -0.832850 -15.650138 -6.792781 0.178630 -13.927521 -5.134143 1.153847 -12.282236 -6.247045 2.805225 -11.546975 -7.523332 4.690277 -11.918750 -8.621021 6.303905 -13.297945 -9.245990 7.213741 -15.315004 -9.230778 7.175992 -17.429461 -8.579460 6.200776 -19.074745 -7.466558 4.549399 -19.810005 -6.190272 2.664348 -19.438232 -5.092582 1.050718 -18.059038 -4.467613 0.140883 -16.041979 -4.482825 0.925387 -14.269482 -2.706426 1.520608 -12.182885 -3.709496 3.022230 -10.875540 -5.032486 5.027895 -10.697751 -6.320903 7.000187 -11.697154 -7.229517 8.410631 -13.605961 -7.514866 8.881301 -15.912708 -7.100490 8.286080 -17.999304 -6.097420 6.784459 -19.306648 -4.774430 4.778794 -19.484440 -3.486013 2.806503 -18.485037 -2.577399 1.396057 -16.576233 -2.292050 1.967616 -14.802081 -0.388459 2.054236 -12.419448 -1.190475 3.221857 -10.590095 -2.462400 5.157616 -9.804191 -3.863423 7.342828 -10.272323 -5.018140 9.191967 -11.869052 -5.617146 10.209558 -14.166536 -5.499940 10.122938 -16.549170 -4.697925 8.955317 -18.378523 -3.426000 7.019559 -19.164427 -2.024978 4.834348 -18.696297 -0.870260 2.985209 -17.099569 -0.271253 3.371696 -15.369703 1.767674 2.887188 -12.891149 1.239889 3.569929 -10.670993 0.116811 5.236978 -9.304124 -1.300633 7.441651 -9.156793 -2.632640 9.593208 -10.268476 -3.522299 11.115141 -12.341301 -3.731227 11.599648 -14.819853 -3.203442 10.916908 -17.040010 -2.080365 9.249860 -18.406881 -0.662921 7.045187 -18.554211 0.669086 4.893631 -17.442530 1.558745 5.129269 -15.797307 3.729389 4.094898 -13.442986 3.520118 4.208023 -11.023768 2.630655 5.438331 -9.187884 1.299332 7.456162 -8.427258 -0.117125 9.720840 -8.945695 -1.239177 11.625546 -10.604282 -1.766171 12.659917 -12.958604 -1.556900 12.546794 -15.377820 -0.667438 11.316487 -17.213705 0.663885 9.298656 -17.974333 2.080341 7.033979 -17.455896 3.202393 7.163260 -15.925622 5.498657 5.682042 -13.895830 5.615507 5.223680 -11.496070 5.016537 5.910989 -9.369355 3.862240 7.559807 -8.085535 2.461911 9.728333 -7.988612 1.190766 11.835514 -9.104553 0.389407 13.316730 -11.134345 0.272557 13.775094 -13.534104 0.871527 13.087785 -15.660819 2.025822 11.438969 -16.944639 3.426151 9.270443 -17.041565 4.697297 9.340333 -15.647345 7.101427 7.577855 -14.086352 7.515385 6.629847 -11.910600 7.229434 6.750328 -9.703077 6.320195 7.907014 -8.055289 5.031297 9.789973 -7.408759 3.708100 11.894668 -7.936723 2.705153 13.657146 -9.497715 2.291195 14.605153 -11.673468 2.577146 14.484674 -13.880989 3.486385 13.327988 -15.528778 4.775282 11.445029 -16.175310 6.098479 11.506532 -14.928782 8.580776 9.656425 -13.904098 9.231752 8.364401 -12.107684 9.246310 7.976655 -10.020887 8.620549 8.597085 -8.202865 7.522141 10.059445 -7.140752 6.245404 11.971900 -7.119143 5.132439 13.822006 -8.143826 4.481462 15.114031 -9.940239 4.466905 15.501777 -12.027035 5.092665 14.881348 -13.845057 6.191072 13.418988 -14.907170 7.467809 13.524614 -13.802540 10.001280 11.772984 -13.298856 10.809390 10.315646 -11.965311 11.079164 9.543096 -10.159228 10.738314 9.662335 -8.364546 9.878173 10.641415 -7.062146 8.729213 12.217991 -6.601007 7.599298 13.969621 -7.104691 6.791188 15.426958 -8.438234 6.521415 16.199509 -10.244317 6.862263 16.080271 -12.039001 7.722404 15.101192 -13.341400 8.871364 15.301411 -12.359058 11.421229 13.793241 -12.292912 12.300309 12.345761 -11.428785 12.758376 11.346827 -9.998218 12.672691 11.064097 -8.384531 12.066215 11.573333 -7.020110 11.101451 12.738082 -6.270550 10.036907 14.246252 -6.336696 9.157827 15.693731 -7.200822 8.699759 16.692667 -8.631389 8.785443 16.975395 -10.245076 9.391919 16.466162 -11.609498 10.356684 16.807184 -10.713747 12.884066 15.626290 -10.962145 13.754533 14.328384 -10.510799 14.325191 13.261241 -9.480645 14.443135 12.710798 -8.147714 14.076760 12.824548 -6.869162 13.324239 13.572010 -5.987577 12.387205 14.752904 -5.739179 11.516739 16.050808 -6.190525 10.946079 17.117952 -7.220678 10.828135 17.668396 -8.553610 11.194509 17.554647 -9.832161 11.947031 18.070734 -8.974944 14.413983 17.237276 -9.404660 15.214616 16.175373 -9.269111 15.826425 15.169559 -8.604614 16.085474 14.489343 -7.589222 15.922353 14.316987 -6.495009 15.380770 14.698675 -5.615167 14.605840 15.532133 -5.185451 13.805206 16.594036 -5.321000 13.193398 17.599850 -5.985496 12.934348 18.280066 -7.000887 13.097470 18.452421 -8.095100 13.639053 19.165607 -7.218096 16.006359 18.647459 -7.714607 16.700191 17.850613 -7.786966 17.297026 16.988585 -7.415784 17.636932 16.292355 -6.700519 17.628841 15.948476 -5.832826 17.274918 16.049091 -5.045202 16.669994 16.567240 -4.548691 15.976162 17.364084 -4.476332 15.379330 18.226112 -4.847514 15.039419 18.922344 -5.562778 15.047512 19.266222 -6.430471 15.401436 20.182600 -5.474146 17.629879 19.916819 -5.957935 18.206509 19.367247 -6.142701 18.755165 18.681139 -5.978934 19.128838 18.042339 -5.510517 19.227400 17.622015 -4.862961 19.024445 17.532789 -4.209778 18.574348 17.798571 -3.725989 17.997719 18.348143 -3.541224 17.449062 19.034250 -3.704990 17.075390 19.673048 -4.173408 16.976828 20.093374 -4.820963 17.179783 21.205389 -3.726415 19.226990 21.123264 -4.159856 19.698496 20.775806 -4.391138 20.191160 20.256117 -4.358288 20.572969 19.703447 -4.070109 20.741621 19.265882 -3.603818 20.651924 19.060671 -3.084358 20.327911 19.142796 -2.650917 19.856405 19.490253 -2.419635 19.363741 20.009943 -2.452484 18.981932 20.562613 -2.740663 18.813280 21.000175 -3.206954 18.902977 22.286812 -1.923544 20.720598 22.336155 -2.304466 21.114489 22.141832 -2.550058 21.566824 21.755911 -2.594514 21.956406 21.281796 -2.425922 22.178843 20.846529 -2.089455 22.174536 20.566738 -1.675271 21.944635 20.517395 -1.294349 21.550745 20.711718 -1.048757 21.098410 21.097639 -1.004301 20.708828 21.571753 -1.172893 20.486391 22.007019 -1.509359 20.490698</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="1800" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="5400">0.711155 -0.006805 -0.703003 0.535280 0.034518 -0.843969 0.802919 -0.278013 -0.527286 0.868149 -0.352365 -0.349507 0.848125 -0.524356 -0.075728 0.792584 -0.602185 0.095834 0.662339 -0.640293 0.389014 0.507386 -0.691498 0.514189 0.296988 -0.597095 0.745168 0.089106 -0.598365 0.796253 -0.151821 -0.406959 0.900741 -0.352654 -0.347642 0.868781 -0.567288 -0.119181 0.814850 -0.702204 -0.004438 0.711962 -0.839871 0.191471 0.507894 -0.866148 0.341340 0.365068 -0.894845 0.442517 0.058576 -0.798075 0.597035 -0.081399 -0.713882 0.565035 -0.413651 -0.513421 0.692002 -0.507476 -0.343589 0.523718 -0.779529 -0.088194 0.598651 -0.796140 0.114989 0.328879 -0.937345 0.361058 0.342055 -0.867546 0.314279 0.025041 -0.949000 0.681460 -0.237159 -0.692364 0.852903 -0.454480 -0.256913 0.786390 -0.569889 0.238366 0.503000 -0.554712 0.662786 0.078347 -0.414108 0.906850 -0.377287 -0.184690 0.907493 -0.745141 0.074251 0.662761 -0.926546 0.294560 0.233980 -0.869324 0.416217 -0.266531 -0.585263 0.404301 -0.702856 -0.150645 0.260707 -0.953592 0.061034 -0.037504 -0.997431 0.506688 -0.241341 -0.827661 0.800552 -0.408531 -0.438426 0.866667 -0.495017 0.062023 0.691717 -0.479435 0.540065 0.324287 -0.367031 0.871852 -0.139705 -0.187271 0.972323 -0.580241 0.013403 0.814334 -0.881223 0.182377 0.436101 -0.959576 0.273814 -0.065119 -0.789755 0.261398 -0.554940 -0.415204 0.147206 -0.897739 -0.203734 -0.142310 -0.968628 0.288418 -0.294596 -0.911059 0.688364 -0.401969 -0.603801 0.889665 -0.436475 -0.134109 0.842839 -0.390293 0.370532 0.564112 -0.276443 0.778047 0.127553 -0.124683 0.983964 -0.354106 0.025735 0.934851 -0.755586 0.135229 0.640940 -0.968911 0.173740 0.176143 -0.932581 0.129440 -0.336954 -0.652324 0.013453 -0.757821 -0.454029 -0.262117 -0.851559 0.044541 -0.386869 -0.921058 0.521015 -0.442780 -0.729719 0.845941 -0.416280 -0.333309 0.935407 -0.316080 0.158449 0.770279 -0.169351 0.614809 0.396505 -0.014169 0.917923 -0.088772 0.109527 0.990012 -0.560291 0.169079 0.810855 -0.893579 0.147301 0.424050 -0.996359 0.048194 -0.070326 -0.836161 -0.102200 -0.538878 -0.665620 -0.359960 -0.653742 -0.201983 -0.493131 -0.846182 0.312186 -0.524753 -0.791944 0.735397 -0.448163 -0.508272 0.955180 -0.286265 -0.075387 0.917328 -0.083119 0.389358 0.635643 0.108411 0.764333 0.184635 0.239319 0.953224 -0.319427 0.275418 0.906704 -0.745189 0.205576 0.634374 -0.977673 0.045978 0.205038 -0.949901 -0.161652 -0.267500 -0.822421 -0.403563 -0.400950 -0.428971 -0.581519 -0.691245 0.082001 -0.627213 -0.774519 0.569019 -0.529718 -0.628980 0.900253 -0.318219 -0.297122 0.990306 -0.051128 0.129148 0.819692 0.201175 0.536316 0.435368 0.373971 0.818902 -0.063006 0.422800 0.904030 -0.546503 0.333598 0.768145 -0.886904 0.127284 0.444071 -0.989604 -0.142940 0.015857 -0.917735 -0.375896 -0.128315 -0.619353 -0.624592 -0.475696 -0.147992 -0.722208 -0.675658 0.365624 -0.642605 -0.673334 0.780834 -0.410110 -0.471283 0.987817 -0.089928 -0.127008 0.935600 0.232194 0.265968 0.641165 0.472788 0.604466 0.181976 0.570231 0.801075 -0.323343 0.498550 0.804299 -0.742469 0.274177 0.611200 -0.961696 -0.045824 0.270261 -0.952421 -0.276141 0.128998 -0.762416 -0.605782 -0.227484 -0.358917 -0.783416 -0.507384 0.146525 -0.759893 -0.633320 0.614506 -0.543612 -0.571724 0.919096 -0.196099 -0.341772 0.982123 0.188089 -0.007516 0.790616 0.508049 0.341780 0.396406 0.681476 0.615185 -0.098210 0.663410 0.741783 -0.564642 0.456814 0.687387 -0.878553 0.113525 0.463957 -0.932766 -0.115363 0.341524 -0.853761 -0.520158 0.022958 -0.536829 -0.791728 -0.291516 -0.068750 -0.854402 -0.515044 0.420993 -0.692005 -0.586425 0.799007 -0.351526 -0.487870 0.965896 0.073023 -0.248419 0.880928 0.468548 0.066539 0.568969 0.732407 0.373972 0.111821 0.796622 0.594045 -0.371937 0.643485 0.669021 -0.754920 0.310735 0.577529 -0.868511 0.088188 0.487762 -0.894442 -0.372644 0.247205 -0.673409 -0.737245 -0.054687 -0.264738 -0.904233 -0.335078 0.218675 -0.827786 -0.516674 0.644075 -0.531011 -0.550631 0.897676 -0.097045 -0.429837 0.914880 0.356875 -0.188769 0.694181 0.711675 0.107849 0.294556 0.875766 0.382453 -0.180130 0.806219 0.563528 -0.605849 0.519254 0.602762 -0.771487 0.312557 0.554180 -0.889780 -0.175578 0.421264 -0.765538 -0.618954 0.175634 -0.430588 -0.895039 -0.116181 0.023119 -0.927237 -0.373762 0.470396 -0.708096 -0.526620 0.790050 -0.300082 -0.534576 0.898672 0.184990 -0.397702 0.770650 0.618353 -0.154068 0.441581 0.887488 0.131797 -0.002462 0.922739 0.385418 -0.445949 0.713611 0.540268 -0.654911 0.534146 0.534584 -0.848447 0.053316 0.526588 -0.814649 -0.443571 0.373620 -0.559962 -0.820362 0.115967 -0.153379 -0.972403 -0.175806 0.292779 -0.858350 -0.421326 0.656417 -0.511867 -0.554173 0.840963 -0.029410 -0.540292 0.800282 0.459254 -0.385531 0.547695 0.826205 -0.131965 0.150093 0.976615 0.153930 -0.289174 0.870777 0.397651 -0.532921 0.728856 0.429842 -0.781926 0.292226 0.550632 -0.826278 -0.224546 0.516569 -0.650847 -0.681368 0.334868 -0.301932 -0.951771 0.054484 0.124377 -0.960924 -0.247296 0.510579 -0.708100 -0.487754 0.752596 -0.265112 -0.602756 0.788224 0.247078 -0.563609 0.611055 0.692976 -0.382617 0.269115 0.957032 -0.108013 -0.148470 0.970749 0.188688 -0.419799 0.872960 0.248416 -0.703969 0.516108 0.487913 -0.809827 0.018485 0.586377 -0.705667 -0.486795 0.514843 -0.417434 -0.860763 0.291264 -0.023791 -0.999450 -0.023104 0.366356 -0.865532 -0.341524 0.646530 -0.498510 -0.577483 0.743214 -0.000459 -0.669054 0.633891 0.495095 -0.594191 0.349647 0.858925 -0.374159 -0.034837 0.997168 -0.066658 -0.328335 0.944532 0.007490 -0.629451 0.697802 0.341853 -0.778064 0.260205 0.571760 -0.731427 -0.253207 0.633168 -0.499198 -0.702608 0.507092 -0.143688 -0.963175 0.227260 0.236852 -0.962940 -0.129025 0.537512 -0.704208 -0.463866 0.677917 -0.260736 -0.687347 0.623564 0.246528 -0.741884 0.391806 0.683955 -0.615381 0.044467 0.938669 -0.341941 -0.266972 0.926261 -0.266020 -0.571939 0.810385 0.127129 -0.745621 0.470952 0.471438 -0.739351 -0.004936 0.673302 -0.551610 -0.489481 0.675377 -0.231550 -0.848762 0.475382 0.133012 -0.982786 0.128220 0.441002 -0.855887 -0.270139 0.608661 -0.506094 -0.611065 0.593396 -0.030940 -0.804316 0.402685 0.442553 -0.801244 0.088597 0.791547 -0.604652 -0.235978 0.810314 -0.536382 -0.539686 0.831924 -0.129003 -0.725788 0.620310 0.297401 -0.743225 0.227584 0.629144 -0.584223 -0.242957 0.774374 -0.289373 -0.662499 0.690911 0.061350 -0.914126 0.400762 0.370769 -0.928592 -0.015756 0.553644 -0.704607 -0.443855 0.562170 -0.306705 -0.768047 0.397537 0.156612 -0.904122 0.105889 0.563834 -0.819072 -0.224334 0.604492 -0.764372 -0.530993 0.752712 -0.389193 -0.725643 0.683889 0.075753 -0.755753 0.412470 0.508632 -0.610444 0.007538 0.792023 -0.326166 -0.421896 0.845943 0.020768 -0.756657 0.653482 0.334666 -0.903570 0.267505 0.528576 -0.823805 -0.204823 0.550678 -0.542727 -0.634193 0.398184 -0.139136 -0.906692 0.114675 0.279331 -0.953323 -0.210925 0.336113 -0.917899 -0.532218 0.582260 -0.614587 -0.741656 0.651909 -0.157989 -0.783411 0.524219 0.333857 -0.643732 0.229385 0.730063 -0.357177 -0.155391 0.921020 -0.000117 -0.524668 0.851307 0.329317 -0.775431 0.538756 0.539796 -0.838844 0.070440 0.574405 -0.700279 -0.423872 0.426588 -0.400814 -0.810784 0.139039 -0.022297 -0.990036 -0.172136 0.048019 -0.983902 -0.521915 0.350231 -0.777781 -0.759714 0.534718 -0.370016 -0.822803 0.552116 0.134771 -0.691989 0.394847 0.604356 -0.398987 0.101976 0.911268 -0.021237 -0.248110 0.968499 0.337731 -0.558533 0.757614 0.578290 -0.743029 0.336882 0.634928 -0.752231 -0.176110 0.494918 -0.586750 -0.640921 0.199178 -0.293865 -0.934864 -0.092738 -0.214570 -0.972296 -0.480488 0.097387 -0.871577 -0.761412 0.359411 -0.539515 -0.862059 0.503088 -0.061289 -0.753751 0.488903 0.439128 -0.461849 0.317757 0.828086 -0.062585 0.033575 0.997475 0.335260 -0.286442 0.897525 0.621265 -0.553503 0.554676 0.716892 -0.694157 0.064898 0.598488 -0.671916 -0.436282 0.301511 -0.495733 -0.814457 0.028250 -0.418945 -0.907572 -0.398313 -0.139027 -0.906652 -0.732289 0.158463 -0.662300 -0.886832 0.396282 -0.237675 -0.819776 0.511460 0.257636 -0.545583 0.471404 0.692905 -0.134887 0.284276 0.949206 0.301496 -0.000619 0.953467 0.642932 -0.305110 0.702529 0.795110 -0.544951 0.266137 0.718232 -0.655150 -0.234353 0.436585 -0.608095 -0.663034 0.179862 -0.550714 -0.815085 -0.277141 -0.334696 -0.900650 -0.666079 -0.041020 -0.744752 -0.885869 0.253789 -0.388364 -0.877980 0.472553 0.076452 -0.641712 0.556355 0.527897 -0.237085 0.480558 0.844307 0.227912 0.263545 0.937337 0.625712 -0.036218 0.779213 0.846370 -0.336120 0.413136 0.830487 -0.553889 -0.059144 0.585358 -0.631603 -0.508364 0.346588 -0.610270 -0.712353 -0.125471 -0.478961 -0.868823 -0.563349 -0.221625 -0.795940 -0.852846 0.094090 -0.513615 -0.917716 0.385673 -0.095151 -0.738792 0.575842 0.350131 -0.360807 0.612388 0.703420 0.116396 0.483349 0.867655 0.563083 0.222409 0.795909 0.856247 -0.099179 0.506957 0.915974 -0.393033 0.080728 0.728241 -0.579599 -0.365693 0.513773 -0.605376 -0.607912 0.046217 -0.569929 -0.820393 -0.428300 -0.373884 -0.822660 -0.785301 -0.069460 -0.615205 -0.931060 0.263527 -0.252349 -0.825825 0.537348 0.171084 -0.495112 0.678387 0.542822 -0.025496 0.647068 0.762006 0.456488 0.450221 0.767411 0.818894 0.140866 0.556390 0.962590 -0.196249 0.186831 0.849890 -0.469267 -0.239740 0.669187 -0.545789 -0.504285 0.227595 -0.609489 -0.759424 -0.266735 -0.492605 -0.828368 -0.683263 -0.226956 -0.694005 -0.912470 0.117363 -0.391949 -0.893176 0.449706 -0.001381 -0.628672 0.681580 0.374460 -0.187665 0.749780 0.634517 0.311947 0.634360 0.707302 0.734340 0.365677 0.571861 0.964132 0.016857 0.264887 0.939557 -0.316949 -0.129521 0.803004 -0.441039 -0.400836 0.409190 -0.600698 -0.686822 -0.085025 -0.574454 -0.814109 -0.548262 -0.370304 -0.749856 -0.858245 -0.042599 -0.511470 -0.932759 0.322172 -0.161761 -0.750837 0.627263 0.206846 -0.359347 0.790599 0.495805 0.137698 0.767072 0.626609 0.606087 0.561963 0.562900 0.918392 0.230581 0.321541 0.990077 -0.136908 -0.031684 0.906779 -0.300206 -0.296021 0.581689 -0.546885 -0.602126 0.109575 -0.616656 -0.779570 -0.383328 -0.491863 -0.781749 -0.766276 -0.206174 -0.608533 -0.937732 0.164663 -0.305850 -0.851499 0.522322 0.046145 -0.529346 0.771210 0.353593 -0.056510 0.843834 0.533621 0.440051 0.719684 0.537038 0.825936 0.431787 0.362478 0.996670 0.058097 0.057212 0.973090 -0.132512 -0.188512 0.735577 -0.451965 -0.504632 0.308558 -0.616988 -0.723960 -0.193310 -0.584162 -0.788281 -0.636278 -0.362812 -0.680822 -0.902622 -0.011972 -0.430268 -0.921202 0.375156 -0.103176 -0.686289 0.695360 0.213264 -0.259870 0.862555 0.434127 0.243995 0.831147 0.499661 0.689559 0.609046 0.391881 0.956505 0.256037 0.139795 0.995616 0.052037 -0.077722 0.861154 -0.321157 -0.394044 0.501950 -0.574388 -0.646625 0.014690 -0.640236 -0.768038 -0.470295 -0.501614 -0.726090 -0.823745 -0.195767 -0.532090 -0.951388 0.195823 -0.237727 -0.818740 0.568776 0.078474 -0.460651 0.823226 0.331814 0.027311 0.890530 0.454104 0.514107 0.752146 0.412274 0.868669 0.445084 0.217518 0.969487 0.242485 0.035994 0.949025 -0.161426 -0.270727 0.678685 -0.489677 -0.547361 0.231323 -0.654429 -0.719870 -0.273113 -0.611955 -0.742240 -0.699849 -0.373923 -0.608599 -0.934996 -0.003953 -0.354636 -0.915572 0.399261 -0.048154 -0.646353 0.727922 0.228816 -0.199070 0.893782 0.401901 0.306406 0.852003 0.424507 0.734258 0.613561 0.290530 0.891691 0.426726 0.150973 0.990536 0.018090 -0.136059 0.826910 -0.366254 -0.426706 0.444983 -0.623231 -0.643097 -0.052672 -0.684217 -0.727374 -0.532840 -0.533207 -0.657093 -0.867249 -0.210736 -0.451076 -0.966515 0.197067 -0.164358 -0.803850 0.581253 0.126374 -0.422461 0.838906 0.343166 0.075619 0.900725 0.427757 0.556746 0.749871 0.357389 0.762075 0.591387 0.263634 0.978591 0.205701 0.006778 0.934551 -0.210743 -0.286710 0.641979 -0.546151 -0.538128 0.179581 -0.710713 -0.680175 -0.328670 -0.660633 -0.674937 -0.746856 -0.409557 -0.523899 -0.963258 -0.024663 -0.267445 -0.919928 0.391231 0.025879 -0.628184 0.726882 0.277539 -0.165898 0.892237 0.419990 0.343066 0.842706 0.414913 0.584338 0.722882 0.368768 0.909031 0.387732 0.152727 0.990795 -0.033036 -0.131275 0.807799 -0.426394 -0.407000 0.409393 -0.686839 -0.600541 -0.097415 -0.744779 -0.660162 -0.576907 -0.584996 -0.570050 -0.900952 -0.250402 -0.354379 -0.982973 0.169565 -0.070793 -0.800883 0.562679 0.204885 -0.403127 0.823681 0.398795 0.103939 0.882422 0.458833 0.367180 0.808573 0.459769 0.782126 0.549071 0.294618 0.987566 0.153644 0.033282 0.928308 -0.271487 -0.254047 0.620428 -0.612155 -0.490240 0.146778 -0.777093 -0.612032 -0.365571 -0.722381 -0.586962 -0.779544 -0.462941 -0.421896 -0.984585 -0.068268 -0.161035 -0.925900 0.356170 0.125905 -0.618994 0.696901 0.362182 -0.145743 0.862594 0.484450 0.124491 0.838936 0.529801 0.603978 0.674962 0.423835 0.921588 0.333721 0.198259 0.991887 -0.093237 -0.086409 0.795993 -0.491211 -0.353704 0.386676 -0.753376 -0.531890 -0.126054 -0.809594 -0.573295 -0.604757 -0.645108 -0.467016 -0.921455 -0.304182 -0.241649 -0.991626 0.121949 0.042497 -0.796516 0.519410 0.309478 -0.388111 0.781889 0.487873 -0.126041 0.809594 0.573299 0.386687 0.753367 0.531893 0.796000 0.491197 0.353709 0.991888 0.093223 0.086415 0.921585 -0.333731 -0.198254 0.603975 -0.674965 -0.423835 0.124488 -0.838933 -0.529806 -0.388113 -0.781884 -0.487879 -0.796518 -0.519404 -0.309481 -0.991627 -0.121943 -0.042495 -0.921452 0.304188 0.241653 -0.604749 0.645112 0.467021 -0.365553 0.722388 0.586964 0.146798 0.777095 0.612025 0.620441 0.612152 0.490228 0.928311 0.271483 0.254040 0.987566 -0.153642 -0.033280 0.782133 -0.549065 -0.294611 0.367197 -0.808569 -0.459763 -0.145724 -0.862598 -0.484447 -0.618982 -0.696913 -0.362181 -0.925896 -0.356181 -0.125899 -0.984583 0.068265 0.161045 -0.779536 0.462946 0.421906 -0.576876 0.585024 0.570053 -0.097369 0.744801 0.660145 0.409437 0.686843 0.600506 0.807825 0.426380 0.406963 0.990799 0.033012 0.131255 0.909023 -0.387753 -0.152723 0.584335 -0.722897 -0.368745 0.103946 -0.882436 -0.458805 -0.403119 -0.823697 -0.398771 -0.800881 -0.562690 -0.204865 -0.982972 -0.169563 0.070812 -0.900941 0.250422 0.354394 -0.746787 0.409635 0.523935 -0.328547 0.660687 0.674944 0.179729 0.710711 0.680138 0.642101 0.546082 0.538053 0.934602 0.210627 0.286626 0.978565 -0.205823 -0.006834 0.762002 -0.591476 -0.263646 0.342987 -0.842749 -0.414891 -0.165960 -0.892242 -0.419955 -0.628228 -0.726858 -0.277502 -0.919951 -0.391182 -0.025840 -0.963243 0.024735 0.267489 -0.867180 0.210848 0.451155 -0.532681 0.533302 0.657145 -0.052448 0.684247 0.727362 0.445206 0.623163 0.643008 0.827051 0.366096 0.426568 0.990550 -0.018287 0.135928 0.891598 -0.426894 -0.151047 0.556611 -0.749969 -0.357396 0.075497 -0.900752 -0.427721 -0.422550 -0.838883 -0.343114 -0.803904 -0.581191 -0.126312 -0.966521 -0.196973 0.164433 -0.934934 0.004156 0.354797 -0.699633 0.374109 0.608734 -0.272761 0.612056 0.742286 0.231726 0.654381 0.719783 0.679009 0.489463 0.547149 0.949156 0.161098 0.270462 0.969395 -0.242820 -0.036214 0.734014 -0.613800 -0.290642 0.306122 -0.852104 -0.424510 -0.199313 -0.893760 -0.401831 -0.646519 -0.727811 -0.228703 -0.915639 -0.399089 0.048299 -0.951387 -0.195596 0.237918 -0.823566 0.195996 0.532282 -0.469937 0.501775 0.726211 0.015157 0.640251 0.768017 0.502389 0.574214 0.646440 0.861415 0.320821 0.393748 0.995618 -0.052433 0.077425 0.868451 -0.445412 -0.217719 0.513786 -0.752326 -0.412345 0.027001 -0.890556 -0.454073 -0.460889 -0.823132 -0.331715 -0.818877 -0.568600 -0.078323 -0.921277 -0.374908 0.103410 -0.902499 0.012253 0.430518 -0.635937 0.363052 0.681012 -0.192803 0.584274 0.788322 0.309100 0.616902 0.723802 0.735982 0.451670 0.504307 0.973221 0.132085 0.188132 0.956348 -0.256458 -0.140097 0.689216 -0.609340 -0.392029 0.243606 -0.831263 -0.499658 -0.260204 -0.862509 -0.434019 -0.686515 -0.695193 -0.213083 -0.851685 -0.522044 -0.045848 -0.937685 -0.164315 0.306182 -0.765959 0.206514 0.608818 -0.382771 0.492093 0.781876 0.110242 0.616679 0.779457 0.582268 0.546653 0.601776 0.907081 0.299763 0.295543 0.996614 -0.058617 -0.057653 0.825588 -0.432223 -0.362749 0.439570 -0.719930 -0.537103 -0.056978 -0.843866 -0.533520 -0.529705 -0.771062 -0.353377 -0.751120 -0.627029 -0.206525 -0.932810 -0.321832 0.162141 -0.858014 0.042970 0.511827 -0.547758 0.370609 0.750073 -0.084352 0.574590 0.814083 0.409849 0.600593 0.686522 0.803441 0.440689 0.400344 0.990163 0.136406 0.031169 0.918136 -0.231079 -0.321913 0.605620 -0.562317 -0.563048 0.137183 -0.767213 -0.626550 -0.359789 -0.790532 -0.495592 -0.629094 -0.681400 -0.374079 -0.893347 -0.449364 0.001850 -0.912325 -0.116946 0.392411 -0.682800 0.227347 0.694332 -0.266045 0.492862 0.828436 0.228336 0.609522 0.759174 0.669763 0.545555 0.503772 0.939796 0.316492 0.128908 0.963981 -0.017411 -0.265401 0.733885 -0.366161 -0.572136 0.311352 -0.634649 -0.707306 -0.188238 -0.749824 -0.634296 -0.495686 -0.678311 -0.542393 -0.826141 -0.537045 -0.170512 -0.931023 -0.263095 0.252938 -0.784900 0.069911 0.615666 -0.427619 0.374245 0.822850 0.047004 0.570102 0.820228 0.514452 0.605293 0.607420 0.850272 0.468919 0.239065 0.962575 0.195712 -0.187475 0.818506 -0.141442 -0.556814 0.455859 -0.450668 -0.767523 -0.026183 -0.647268 -0.761813 -0.361506 -0.612479 -0.702981 -0.739254 -0.575647 -0.349476 -0.917804 -0.385285 0.095868 -0.852534 -0.093636 0.514216 -0.562724 0.222035 0.796268 -0.124701 0.479243 0.868778 0.347297 0.610349 0.711940 0.728707 0.579427 0.365034 0.916090 0.392617 -0.081435 0.855987 0.098610 -0.507506 0.562514 -0.222970 -0.796155 0.115662 -0.483729 -0.867542 -0.237755 -0.480830 -0.843964 -0.642233 -0.556342 -0.527275 -0.878171 -0.472316 -0.075715 -0.885676 -0.253450 0.389025 -0.665585 0.041355 0.745176 -0.276513 0.334967 0.900743 0.180444 0.550879 0.814845 0.585764 0.631613 0.507883 0.830657 0.553696 0.058563 0.846274 0.335716 -0.413660 0.625339 0.035688 -0.779537 0.227312 -0.264032 -0.937345 -0.135471 -0.284708 -0.948994 -0.546131 -0.471588 -0.692347 -0.820051 -0.511394 -0.256891 -0.886731 -0.396080 0.238389 -0.731883 -0.158241 0.662803 -0.397785 0.139216 0.906855 0.028712 0.419095 0.907488 0.436886 0.608192 0.662747 0.718375 0.655132 0.233963 0.795116 0.544741 -0.266549 0.642759 0.304688 -0.702870 0.301088 0.000093 -0.953596 -0.062979 -0.034094 -0.997432 -0.462334 -0.318125 -0.827674 -0.754063 -0.489030 -0.438450 -0.862029 -0.503053 0.061996 -0.761072 -0.359341 0.540040 -0.480023 -0.097342 0.871838 -0.092354 0.214609 0.972324 0.301706 0.495792 0.814349 0.598543 0.671969 0.436124 0.716918 0.694112 -0.065096 0.621265 0.553254 -0.554923 0.335103 0.285984 -0.897730 -0.021367 0.247609 -0.968624 -0.399328 -0.102461 -0.911065 -0.692290 -0.395142 -0.603819 -0.822829 -0.552231 -0.134136 -0.759429 -0.534782 0.370506 -0.521477 -0.350333 0.778029 -0.171774 -0.048145 0.983959 0.199325 0.293776 0.934861 0.494897 0.586727 0.640959 0.634920 0.752225 0.176166 0.578397 0.742920 -0.336936 0.337822 0.558212 -0.757809 0.000002 0.524248 -0.851566 -0.357328 0.154843 -0.921054 -0.643983 -0.229840 -0.729698 -0.783486 -0.524478 -0.333276 -0.741425 -0.652052 0.158485 -0.531774 -0.582406 0.614833 -0.210489 -0.336297 0.917932 0.139269 0.022119 0.990008 0.426588 0.400690 0.810845 0.574359 0.700215 0.424040 0.539913 0.838777 -0.070335 0.329566 0.775233 -0.538887 0.021091 0.756409 -0.653759 -0.326068 0.421457 -0.846200 -0.610546 -0.008021 -0.791940 -0.755822 -0.412820 -0.508245 -0.725495 -0.684091 -0.075351 -0.530628 -0.752870 0.389385 -0.223911 -0.604684 0.764344 0.114955 -0.279553 0.953224 0.398235 0.138927 0.906702 0.550624 0.542566 0.634378 0.528654 0.823700 0.205045 0.334967 0.903460 -0.267502 0.061725 0.914016 -0.400955 -0.289112 0.662257 -0.691253 -0.584171 0.242590 -0.774528 -0.743250 -0.227924 -0.628991 -0.725710 -0.620528 -0.297136 -0.539438 -0.832064 0.129135 -0.235637 -0.810461 0.536310 0.106168 -0.564026 0.818904 0.397644 -0.156835 0.904037 0.562146 0.306490 0.768151 0.553680 0.704441 0.444073 0.371017 0.928491 0.015856 0.133325 0.982731 -0.128316 -0.231249 0.848673 -0.475687 -0.551464 0.489277 -0.675644 -0.739329 0.004678 -0.673328 -0.745587 -0.471152 -0.471291 -0.571797 -0.810502 -0.127024 -0.266728 -0.926350 0.265955 0.088848 -0.791664 0.604462 0.402835 -0.442718 0.801078 0.593425 0.030744 0.804302 0.608682 0.505910 0.611197 0.441164 0.855767 0.270255 0.237065 0.962890 0.129003 -0.143417 0.963165 -0.227474 -0.499004 0.702543 -0.507374 -0.731352 0.253060 -0.633312 -0.778039 -0.260366 -0.571721 -0.629378 -0.697908 -0.341770 -0.328173 -0.944588 -0.007515 0.044677 -0.938717 0.341781 0.391976 -0.684035 0.615184 0.623639 -0.246654 0.741779 0.677938 0.260586 0.687383 0.537596 0.704085 0.463957 0.366477 0.865477 0.341532 -0.023585 0.999458 0.022966 -0.417236 0.860776 -0.291512 -0.705555 0.486746 -0.515044 -0.809788 -0.018584 -0.586428 -0.703934 -0.516195 -0.487873 -0.419708 -0.873002 -0.248420 -0.034689 -0.997181 0.066536 0.349798 -0.858947 0.373968 0.633985 -0.495155 0.594041 0.743244 0.000361 0.669020 0.646565 0.498407 0.577532 0.510629 0.708058 0.487761 0.124502 0.960932 0.247203 -0.301769 0.951811 -0.054687 -0.650721 0.681385 -0.335077 -0.826223 0.224514 -0.516672 -0.781907 -0.292279 -0.550631 -0.532880 -0.728886 -0.429841 -0.148377 -0.970746 -0.188776 0.269237 -0.957017 0.107844 0.611155 -0.692979 0.382452 0.788270 -0.247116 0.563529 0.752611 0.265052 0.602763 0.656428 0.511846 0.554180 0.292839 0.858360 0.421265 -0.153258 0.972453 0.175636 -0.559832 0.820421 -0.116177 -0.814571 0.443599 -0.373757 -0.848428 -0.053323 -0.526617 -0.654905 -0.534159 -0.534577 -0.289132 -0.870765 -0.397707 0.150183 -0.976579 -0.154074 0.547795 -0.826166 0.131794 0.800345 -0.459240 0.385418 0.840979 0.029394 0.540268 0.790042 0.300093 0.534582 0.470400 0.708116 0.526589 0.023185 0.927291 0.373623 -0.430471 0.895123 0.115971 -0.765435 0.619034 -0.175802 -0.889743 0.175625 -0.421324 -0.771501 -0.312537 -0.554173 -0.445955 -0.713588 -0.540294 -0.002419 -0.922690 -0.385534 0.441665 -0.887421 -0.131970 0.770726 -0.618295 0.153925 0.898703 -0.184959 0.397647 0.897670 0.097092 0.429839 0.644042 0.531052 0.550630 0.218683 0.827851 0.516567 -0.264650 0.904337 0.334867 -0.673286 0.737372 0.054486 -0.894372 0.372755 -0.247291 -0.868525 -0.088118 -0.487749 -0.605897 -0.519207 -0.602755 -0.180141 -0.806157 -0.563613 0.294604 -0.875675 -0.382625 0.694255 -0.711577 -0.108021 0.914928 -0.356799 0.188682 0.965905 -0.072925 0.248413 0.798950 0.351598 0.487912 0.420929 0.692087 0.586374 -0.068733 0.854527 0.514840 -0.536715 0.791898 0.291266 -0.853649 0.520337 -0.023097 -0.932752 0.115501 -0.341515 -0.754993 -0.310647 -0.577480 -0.372010 -0.643404 -0.669059 0.111817 -0.796505 -0.594202 0.569027 -0.732260 -0.374171 0.880991 -0.468412 -0.066666 0.982156 -0.187917 0.007487 0.919039 0.196220 0.341854 0.614379 0.543720 0.571759 0.146437 0.760039 0.633164 -0.358866 0.783627 0.507093 -0.762281 0.606033 0.227270 -0.952356 0.276358 -0.129011 -0.878624 -0.113388 -0.463857 -0.564770 -0.456715 -0.687347 -0.098287 -0.663275 -0.741894 0.396419 -0.681280 -0.615393 0.790678 -0.507836 -0.341950 0.935653 -0.231920 -0.266020 0.987783 0.090120 0.127131 0.780670 0.410239 0.471442 0.365409 0.642746 0.673316 -0.148091 0.722426 0.675404 -0.619273 0.624889 0.475410 -0.917625 0.376190 0.128239 -0.961722 0.046026 -0.270133 -0.742623 -0.274058 -0.611068 -0.323495 -0.498411 -0.804324 0.181920 -0.569999 -0.801253 0.641204 -0.472491 -0.604657 0.819711 -0.200827 -0.536416 0.990305 0.051387 -0.129057 0.900126 0.318368 0.297346 0.568754 0.529840 0.629117 0.081746 0.627416 0.774381 -0.429035 0.581842 0.690934 -0.822329 0.403924 0.400776 -0.989568 0.143200 -0.015757 -0.887029 -0.127161 -0.443857 -0.546708 -0.333498 -0.768043 -0.063163 -0.422595 -0.904115 0.435314 -0.373645 -0.819079 0.635682 -0.107971 -0.764363 0.917371 0.083500 -0.389176 0.955082 0.286490 0.075772 0.735067 0.448283 0.508644 0.311727 0.524913 0.792018 -0.202303 0.493442 0.845925 -0.665668 0.360367 0.653469 -0.949845 0.161969 0.267507 -0.977726 -0.045859 -0.204813 -0.745358 -0.205552 -0.634185 -0.319586 -0.275285 -0.906688 0.184578 -0.238988 -0.953318 0.396552 0.014642 -0.917895 0.770368 0.169811 -0.614571 0.935397 0.316352 -0.157966 0.845685 0.416342 0.333879 0.520510 0.442781 0.730079 0.044009 0.386996 0.921030 -0.454320 0.262410 0.851313 -0.836202 0.102497 0.538759 -0.996357 -0.048066 0.070440 -0.893662 -0.147307 -0.423874 -0.560408 -0.169013 -0.810788 -0.088824 -0.109235 -0.990039 0.127586 0.125044 -0.983914 0.564204 0.276856 -0.777833 0.842903 0.390564 -0.370099 0.889560 0.436514 0.134679 0.687998 0.401868 0.604286 0.287885 0.294553 0.911241 -0.204180 0.142446 0.968514 -0.652523 -0.013221 0.757654 -0.932610 -0.129300 0.336928 -0.968924 -0.173747 -0.176063 -0.755634 -0.135239 -0.640881 -0.354139 -0.025573 -0.934843 -0.139449 0.187594 -0.972298 0.324590 0.367421 -0.871575 0.691971 0.479696 -0.539507 0.866719 0.495019 -0.061278 0.800272 0.408311 0.439143 0.506095 0.241090 0.828096 0.060356 0.037414 0.997476 -0.415704 -0.147119 0.897522 -0.789982 -0.261276 0.554674 -0.959603 -0.273770 0.064902 -0.881139 -0.182354 -0.436282 -0.580068 -0.013256 -0.814460 -0.376932 0.185023 -0.907573 0.078765 0.414480 -0.906644 0.503386 0.554962 -0.662283 0.786611 0.569880 -0.237653 0.852823 0.454208 0.257659 0.681029 0.236772 0.692920 0.313618 -0.025339 0.949211 -0.151298 -0.260807 0.953461 -0.585706 -0.404249 0.702518 -0.869498 -0.416115 0.266125 -0.926490 -0.294433 -0.234363 -0.744912 -0.074037 -0.663042 -0.566870 0.119590 -0.815081 -0.151294 0.407361 -0.900648 0.297509 0.597356 -0.744751 0.662718 0.640295 -0.388364 0.848233 0.524077 0.076450 0.802676 0.277559 0.527893 0.534725 -0.034961 0.844303 0.114289 -0.329154 0.937334 -0.344214 -0.523779 0.779212 -0.714268 -0.564924 0.413137 -0.894923 -0.442283 -0.059142 -0.839665 -0.191136 -0.508360 -0.701827 0.004953 -0.712331 -0.352093 0.348121 -0.868817 0.089704 0.598677 -0.795951 0.507877 0.691545 -0.513641 0.792844 0.601945 -0.095187 0.868094 0.351916 0.350097 0.710771 0.006300 0.703396 0.360430 -0.342457 0.867648 -0.088891 -0.598839 0.795921 -0.513984 -0.691945 0.506984 -0.798347 -0.596757 0.080763 -0.866071 -0.340902 -0.365659 -0.781140 -0.142219 -0.607942 -0.516649 0.244972 -0.820404 -0.109608 0.557881 -0.822651 0.332529 0.714826 -0.615181 0.693775 0.674546 -0.252318 0.878277 0.446487 0.171112 0.835046 0.089553 0.542842 0.573099 -0.301488 0.762012 0.161624 -0.620464 0.767399 -0.287487 -0.779624 0.556361 -0.651274 -0.735494 0.186790 -0.831345 -0.501369 -0.239780 -0.807262 -0.306656 -0.504272 -0.641640 0.107625 -0.759417 -0.293256 0.477291 -0.828368 0.145064 0.705197 -0.694013 0.557861 0.731544 -0.391962 0.836038 0.548669 -0.001396 0.904604 0.203667 0.374447 0.743172 -0.212355 0.634508 0.393416 -0.587326 0.707300 -0.050466 -0.818793 0.571866 -0.467451 -0.843397 0.264898 -0.744256 -0.655218 -0.129507 -0.783451 -0.474925 -0.400812 -0.724832 -0.054043 -0.686803 -0.455007 0.360845 -0.814101 -0.046594 0.659955 -0.749859 0.392204 0.764566 -0.511482 0.745373 0.646720 -0.161780 0.918642 0.336629 0.206827 0.864363 -0.084082 0.495789 0.595475 -0.502776 0.626599 0.183658 -0.805863 0.562898 -0.259480 -0.910646 0.321550 -0.613586 -0.788993 -0.031665 -0.713405 -0.635119 -0.296104 -0.764441 -0.230226 -0.602184 -0.588770 0.213512 -0.779591 -0.234227 0.577953 -0.781734 0.204660 0.766714 -0.608493 0.611524 0.729744 -0.305797 0.878120 0.476205 0.046198 0.932550 0.072749 0.353635 0.758987 -0.373055 0.533637 0.403158 -0.740996 0.537017 -0.039120 -0.931194 0.362420 -0.448093 -0.892160 0.057130 -0.601281 -0.776489 -0.188484 -0.759193 -0.411084 -0.504615 -0.688612 0.041235 -0.723956 -0.409262 0.459459 -0.788291 0.003910 0.732420 -0.680842 0.440919 0.787680 -0.430292 0.785477 0.610226 -0.103197 0.945338 0.246697 0.213252 0.876939 -0.206184 0.434128 0.597820 -0.626846 0.499676 0.182701 -0.901681 0.391907 -0.256487 -0.956380 0.139825 -0.452668 -0.888291 -0.077658 -0.708669 -0.585287 -0.393989 -0.748415 -0.147604 -0.646597 -0.561847 0.307313 -0.768041 -0.199324 0.658044 -0.726118 0.242271 0.811259 -0.532131 0.645232 0.726045 -0.237769 0.901920 0.424721 0.078441 0.943267 -0.012602 0.331796 0.757611 -0.468842 0.454107 0.394400 -0.821251 0.412304 -0.048792 -0.974824 0.217571 -0.274633 -0.960872 0.036075 -0.614244 -0.741255 -0.270639 -0.763410 -0.343036 -0.547295 -0.682462 0.126774 -0.719843 -0.393492 0.542426 -0.742252 0.026010 0.793021 -0.608639 0.464000 0.811726 -0.354690 0.803509 0.593337 -0.048211 0.953569 0.195886 0.228766 0.873618 -0.274391 0.401872 0.584747 -0.691273 0.424515 0.164352 -0.942630 0.290580 -0.076238 -0.985593 0.150975 -0.479571 -0.866895 -0.136029 -0.730643 -0.533030 -0.426661 -0.762261 -0.073783 -0.643051 -0.566270 0.387704 -0.727340 -0.195412 0.728054 -0.657078 0.251072 0.856439 -0.451081 0.653893 0.738513 -0.164383 0.905300 0.405551 0.126333 0.937764 -0.053568 0.343116 0.742282 -0.515830 0.427711 0.371089 -0.857080 0.357361 0.131043 -0.955693 0.263589 -0.311225 -0.950313 0.006718 -0.649829 -0.703908 -0.286766 -0.793977 -0.282810 -0.538163 -0.705259 0.199913 -0.680180 -0.407746 0.615005 -0.674916 0.018787 0.851595 -0.523864 0.460309 0.846528 -0.267406 0.798805 0.601032 0.025913 0.943594 0.180528 0.277562 0.855624 -0.302511 0.419995 0.558216 -0.718511 0.414893 0.333874 -0.867474 0.368806 -0.118717 -0.981107 0.152759 -0.523993 -0.841548 -0.131255 -0.773155 -0.486402 -0.406994 -0.799511 -0.011157 -0.600548 -0.596294 0.456723 -0.660180 -0.218181 0.792095 -0.570073 0.233603 0.905445 -0.354400 0.638316 0.766511 -0.070806 0.887723 0.412274 0.204886 0.914887 -0.062687 0.398813 0.712233 -0.531194 0.458866 0.516675 -0.722258 0.459772 0.084469 -0.951871 0.294630 -0.360704 -0.932086 0.033301 -0.699259 -0.668212 -0.254025 -0.840361 -0.231253 -0.490220 -0.746390 0.261409 -0.612019 -0.442844 0.677768 -0.586959 -0.011178 0.906572 -0.421903 0.433145 0.886819 -0.161049 0.771389 0.623788 0.125888 0.913031 0.187638 0.362168 0.819912 -0.305057 0.484443 0.664306 -0.527277 0.529789 0.282557 -0.860542 0.423826 -0.171774 -0.964981 0.198255 -0.576687 -0.812383 -0.086406 -0.823402 -0.443746 -0.353693 -0.845791 0.041817 -0.531873 -0.638119 0.513964 -0.573276 -0.256321 0.846292 -0.467001 0.197281 0.950100 -0.241641 0.601413 0.797807 0.042495 0.848078 0.430107 0.309470 0.871198 -0.054824 0.487861 0.764158 -0.295624 0.573297 0.459108 -0.711552 0.531896 0.027409 -0.934951 0.353716 -0.415195 -0.905618 0.086427 -0.749804 -0.631265 -0.198240 -0.886527 -0.185593 -0.423821 -0.788795 0.311641 -0.529795 -0.483095 0.727048 -0.487873 -0.051580 0.949506 -0.309480 0.390190 0.919753 -0.042498 0.724149 0.645921 0.241648 0.861057 0.201190 0.467016 0.808380 -0.044618 0.586967 0.599578 -0.515683 0.612026 0.219906 -0.843398 0.490227 -0.229061 -0.939679 0.254037 -0.626857 -0.778423 -0.033282 -0.866580 -0.402797 -0.294607 -0.883843 0.086298 -0.459755 -0.674169 0.557507 -0.484440 -0.294052 0.884512 -0.362177 0.154486 0.979941 -0.125898 0.551410 0.818542 0.161045 0.790690 0.443625 0.421907 0.795072 0.207067 0.570074 0.693676 -0.288091 0.660164 0.390068 -0.698017 0.600515 -0.034698 -0.912787 0.406958 -0.466844 -0.874548 0.131238 -0.790332 -0.593334 -0.152743 -0.918212 -0.144573 -0.368762 -0.816170 0.351216 -0.458818 -0.511765 0.760967 -0.398780 -0.086850 0.974929 -0.204868 0.344647 0.936058 0.070816 0.667339 0.655021 0.354408 0.728122 0.441939 0.523955 0.736419 -0.045790 0.674974 0.525608 -0.510982 0.680171 0.151859 -0.829100 0.538081 -0.284891 -0.914699 0.286641 -0.667519 -0.744561 -0.006837 -0.893218 -0.364197 -0.263670 -0.901321 0.124314 -0.414929 -0.689716 0.589827 -0.419995 -0.315365 0.907480 -0.277533 0.121191 0.992293 -0.025855 0.503022 0.821838 0.267492 0.616136 0.645662 0.451107 0.728188 0.194782 0.657116 0.618851 -0.296581 0.727367 0.317176 -0.697052 0.643054 -0.096347 -0.899272 0.426646 -0.510995 -0.848754 0.136016 -0.815432 -0.558818 -0.150976 -0.927795 -0.107196 -0.357360 -0.817878 0.384872 -0.427725 -0.515310 0.785306 -0.343147 -0.101476 0.986780 -0.126362 0.312589 0.935557 0.164378 0.471065 0.807603 0.354788 0.673816 0.418852 0.608715 0.666461 -0.069804 0.742265 0.450878 -0.527871 0.719765 0.084410 -0.832776 0.547137 -0.335047 -0.902550 0.270459 -0.694982 -0.718114 -0.036207 -0.898580 -0.328773 -0.290622 -0.891017 0.160946 -0.424482 -0.674378 0.619491 -0.401802 -0.307059 0.923807 -0.228682 0.112187 0.992512 0.048305 0.306307 0.921722 0.237916 0.581519 0.615229 0.532287 0.669510 0.156086 0.726219 0.546881 -0.333257 0.768024 0.246072 -0.722191 0.646443 -0.152884 -0.906416 0.393745 -0.543227 -0.836009 0.077415 -0.819964 -0.529388 -0.217735 -0.908419 -0.068781 -0.412364 -0.784731 0.421900 -0.454090 -0.482395 0.810710 -0.331728 -0.082973 0.993469 -0.078331 0.135857 0.985325 0.103328 0.461786 0.775546 0.430444 0.632354 0.369342 0.680966 0.602430 -0.125018 0.788320 0.379792 -0.576016 0.723853 0.023293 -0.863154 0.504402 -0.372096 -0.908905 0.188245 -0.700186 -0.700100 -0.139998 -0.872286 -0.292359 -0.391973 -0.841736 0.204513 -0.499655 -0.616937 0.656490 -0.434062 -0.258903 0.942090 -0.213155 -0.026190 0.998608 -0.045785 0.326603 0.894175 0.306239 0.561864 0.560003 0.608856 0.617556 0.085341 0.781883 0.478906 -0.403913 0.779425 0.182217 -0.777655 0.601705 -0.194019 -0.935451 0.295447 -0.549142 -0.833731 -0.057747 -0.787148 -0.498765 -0.362811 -0.843256 -0.020594 -0.537118 -0.702277 0.471374 -0.533491 -0.402842 0.844323 -0.353322 -0.167448 0.964006 -0.206526 0.187699 0.968751 0.162147 0.466220 0.721569 0.511837 0.594828 0.289053 0.750085 0.539769 -0.214263 0.814089 0.315183 -0.655251 0.686517 -0.020093 -0.916151 0.400329 -0.376963 -0.925704 0.031147 -0.659191 -0.679576 -0.321936 -0.789782 -0.243308 -0.563068 -0.733001 0.264815 -0.626564 -0.504709 0.706859 -0.495600 -0.275623 0.885463 -0.374150 0.057445 0.998347 0.001770 0.354827 0.848626 0.392341 0.538260 0.477739 0.694292 0.559860 -0.015925 0.828434 0.413735 -0.502413 0.759213 0.137650 -0.852757 0.503844 -0.195732 -0.972137 0.128994 -0.497004 -0.826190 -0.265325 -0.684013 -0.452585 -0.572095 -0.705301 0.047572 -0.707310 -0.555286 0.537837 -0.634341 -0.339596 0.768419 -0.542409 -0.052035 0.983977 -0.170532 0.237653 0.937844 0.252921 0.452986 0.644804 0.615655 0.537913 0.183227 0.822847 0.470228 -0.325737 0.820232 0.266989 -0.748161 0.607431 -0.019019 -0.970814 0.239078 -0.311773 -0.931480 -0.187464 -0.531726 -0.638145 -0.556811 -0.618206 -0.169476 -0.767528 -0.547455 0.346288 -0.761825 -0.349673 0.619287 -0.703002 -0.128911 0.928024 -0.349504 0.125218 0.987489 0.095839 0.345161 0.785152 0.514198 0.473641 0.376342 0.796260 0.477387 -0.131593 0.868783 0.354939 -0.605916 0.711957 0.137464 -0.920780 0.365058 -0.118003 -0.989671 -0.081409 -0.342570 -0.790633 -0.507490 -0.474336 -0.375698 -0.796151 -0.476745 0.141664 -0.867552 -0.297523 0.446320 -0.843966 -0.160683 0.834364 -0.527274 0.030049 0.996677 -0.075711 0.223341 0.893741 0.389031 0.368602 0.555731 0.745182 0.428339 0.071979 0.900747 0.386848 -0.431712 0.814845 0.254111 -0.823096 0.507878 0.064193 -0.996218 0.058557 -0.132385 -0.900752 -0.413667 -0.281748 -0.559402 -0.779543 -0.342301 -0.064840 -0.937350 -0.178818 0.259707 -0.948987 -0.135331 0.708782 -0.692324 -0.032844 0.965892 -0.256853 0.100355 0.965962 0.238427 0.228898 0.712923 0.662832 0.319448 0.274848 0.906869 0.348581 -0.234445 0.907484 0.308261 -0.682472 0.662727 0.208174 -0.949705 0.233933 0.074209 -0.960953 -0.266577 -0.057502 -0.708969 -0.702891 -0.150454 -0.260765 -0.953606 0.001965 0.071596 -0.997432 -0.044336 0.559465 -0.827667 -0.046480 0.897558 -0.438440 -0.004640 0.998065 0.062006 0.069338 0.838773 0.540048 0.155711 0.464379 0.871841 0.232035 -0.027324 0.972324 0.278519 -0.509178 0.814349 0.282676 -0.854335 0.436125 0.242666 -0.967924 -0.065093 0.168506 -0.814658 -0.554921 0.080121 -0.433196 -0.897732 0.225161 -0.105366 -0.968608 0.110965 0.396981 -0.911094 0.003960 0.797053 -0.603896 -0.066831 0.988693 -0.134236 -0.083427 0.925111 0.370417 -0.042667 0.626846 0.777974 0.044183 0.172905 0.983947 0.154744 -0.319452 0.934882 0.260661 -0.721925 0.640999 0.333983 -0.925961 0.176213 0.354204 -0.872380 -0.336887 0.314547 -0.571708 -0.757767 0.454058 -0.262137 -0.851537 0.312812 0.232009 -0.921043 0.122982 0.672602 -0.729713 -0.062452 0.940747 -0.333310 -0.193986 0.968124 0.158447 -0.238512 0.751749 0.614805 -0.186028 0.350460 0.917917 -0.050513 -0.131648 0.990009 0.133685 -0.569769 0.810858 0.319210 -0.847513 0.424059 0.456453 -0.886965 -0.070311 0.506619 -0.673028 -0.538860 0.644522 -0.396468 -0.653761 0.528017 0.071669 -0.846204 0.298310 0.532787 -0.791928 0.020379 0.860993 -0.508208 -0.229713 0.970341 -0.075302 -0.386712 0.835945 0.389423 -0.411739 0.496214 0.764357 -0.299599 0.040187 0.953218 -0.078819 -0.414363 0.906692 0.194558 -0.748139 0.634378 0.449018 -0.869675 0.205055 0.614938 -0.741821 -0.267494 0.760689 -0.510481 -0.400951 0.718073 -0.080771 -0.691265 0.502158 0.384600 -0.774545 0.174222 0.757632 -0.629000 -0.174548 0.938745 -0.297138 -0.450874 0.883197 0.129134 -0.584065 0.609298 0.536306 -0.541548 0.190069 0.818901 -0.334645 -0.265949 0.904038 -0.015644 -0.640070 0.768157 0.333223 -0.831714 0.444087 0.618583 -0.785559 0.015871 0.784412 -0.606823 -0.128309 0.850607 -0.224065 -0.475671 0.699474 0.232939 -0.675629 0.373736 0.637926 -0.673329 -0.035216 0.881263 -0.471313 -0.416004 0.900443 -0.127058 -0.668874 0.694184 0.265924 -0.730028 0.318913 0.604444 -0.584830 -0.127483 0.801075 -0.270095 -0.529282 0.804307 0.133785 -0.780086 0.611202 0.520535 -0.809941 0.270258 0.715350 -0.686754 0.129007 0.905837 -0.357378 -0.227465 0.857931 0.080883 -0.507358 0.584845 0.506844 -0.633297 0.163550 0.803986 -0.571714 -0.289708 0.894013 -0.341774 -0.653948 0.756502 -0.007527 -0.835295 0.430671 0.341766 -0.788390 0.002563 0.615170 -0.525444 -0.416754 0.741771 -0.113314 -0.717403 0.687381 0.340944 -0.817618 0.463959 0.566272 -0.750122 0.341545 0.877341 -0.479317 0.022981 0.954073 -0.069069 -0.291504 0.774320 0.367639 -0.515045 0.388811 0.710580 -0.586431 -0.095062 0.867722 -0.487875 -0.546182 0.799982 -0.248423 -0.846239 0.528633 0.066530 -0.918774 0.126537 0.373956 -0.745819 -0.301472 0.594028 -0.371323 -0.643848 0.669013 0.108335 -0.809145 0.577537 0.357874 -0.796246 0.487768 0.769934 -0.588292 0.247212 0.975175 -0.214576 -0.054680 0.915461 0.222838 -0.335074 0.607552 0.603265 -0.516674 0.137838 0.823287 -0.550635 -0.364788 0.825931 -0.429846 -0.766498 0.613874 -0.188783 -0.963420 0.245346 0.107833 -0.905720 -0.182784 0.382442 -0.608150 -0.559102 0.563523 -0.146772 -0.784305 0.602764 0.115053 -0.824408 0.554179 0.596938 -0.682791 0.421262 0.918796 -0.353505 0.175635 0.990422 0.074617 -0.116172 0.791456 0.483642 -0.373749 0.378038 0.761424 -0.526612 -0.135138 0.834244 -0.534579 -0.609535 0.685776 -0.397715 -0.920832 0.358227 -0.154084 -0.989380 -0.061318 0.131787 -0.797890 -0.463495 0.385415 -0.395039 -0.743004 0.540268 -0.135140 -0.834240 0.534584 0.378039 -0.761436 0.526594 0.791461 -0.483725 0.373630 0.990434 -0.074763 0.115977 0.918818 0.353367 -0.175799 0.596972 0.682723 -0.421323 0.115093 0.824405 -0.554175 -0.395001 0.743002 -0.540299 -0.797860 0.463441 -0.385540 -0.989361 0.061219 -0.131974 -0.920823 -0.358319 0.153922 -0.609535 -0.685817 0.397646 -0.364751 -0.825954 0.429834 0.137884 -0.823279 0.550636 0.607599 -0.603298 0.516580 0.915504 -0.222958 0.334876 0.975223 0.214409 0.054482 0.769996 0.588173 -0.247303 0.357945 0.796220 -0.487759 -0.146701 0.784324 -0.602755 -0.608084 0.559090 -0.563607 -0.905660 0.182708 -0.382620 -0.963371 -0.245453 -0.108023 -0.766461 -0.613954 0.188674 -0.546106 -0.800040 0.248403 -0.094977 -0.867716 0.487902 0.388907 -0.710583 0.586365 0.774412 -0.367743 0.514832 0.954163 0.068857 0.291260 0.877449 0.479113 -0.023098 0.566399 0.750041 -0.341512 0.108462 0.809174 -0.577472 -0.371205 0.643880 -0.669048 -0.745705 0.301426 -0.594194 -0.918670 -0.126654 -0.374170 -0.846154 -0.528752 -0.066672 -0.653814 -0.756618 0.007496 -0.289583 -0.894021 0.341861 0.163691 -0.803927 0.571757 0.584997 -0.506844 0.633157 0.858076 -0.081039 0.507088 0.905984 0.357127 0.227274 0.715517 0.686581 -0.129000 0.341122 0.817607 -0.463849 -0.113138 0.717464 -0.687346 -0.525267 0.416752 -0.741898 -0.788213 -0.002679 -0.615396 -0.835135 -0.430839 -0.341946 -0.668675 -0.694338 -0.266024 -0.415850 -0.900504 0.127130 -0.035066 -0.881197 0.471446 0.373920 -0.637822 0.673325 0.699677 -0.232956 0.675413 0.850802 0.223868 0.475415 0.784601 0.606594 0.128237 0.520723 0.809860 -0.270137 0.133977 0.780153 -0.611073 -0.269881 0.529356 -0.804330 -0.584587 0.127450 -0.801258 -0.729786 -0.319054 -0.604662 -0.583781 -0.609469 -0.536421 -0.450653 -0.883320 -0.129068 -0.174352 -0.938718 0.297338 0.174469 -0.757478 0.629117 0.502473 -0.384500 0.774391 0.718394 0.080643 0.690946 0.760963 0.510206 0.400781 0.618794 0.785395 -0.015759 0.333389 0.831770 -0.443860 -0.015465 0.640214 -0.768041 -0.334397 0.266007 -0.904112 -0.541247 -0.190159 -0.819080 -0.411362 -0.496514 -0.764366 -0.386385 -0.836203 -0.389193 -0.229442 -0.970371 0.075746 0.020689 -0.860743 0.508619 0.298730 -0.532441 0.792001 0.528495 -0.071541 0.845917 0.644931 0.396291 0.653466 0.615197 0.741603 0.267502 0.449143 0.869666 -0.204821 0.194654 0.748274 -0.634189 -0.078627 0.414416 -0.906685 -0.299275 -0.040343 -0.953314 -0.185610 -0.350808 -0.917869 -0.238129 -0.752114 -0.614507 -0.193724 -0.968270 -0.157876 -0.062251 -0.940527 0.333965 0.123259 -0.672105 0.730124 0.313211 -0.231556 0.921021 0.454471 0.262274 0.851274 0.506898 0.672927 0.538724 0.456555 0.886904 0.070416 0.319242 0.847582 -0.423897 0.133810 0.569810 -0.810809 -0.050208 0.131492 -0.990045 0.044511 -0.173102 -0.983898 -0.042329 -0.627119 -0.777772 -0.083210 -0.925295 -0.370007 -0.066747 -0.988625 0.134777 0.004029 -0.796701 0.604360 0.111150 -0.396518 0.911274 0.225454 0.105672 0.968506 0.314811 0.571762 0.757616 0.354322 0.872336 0.336876 0.333989 0.925977 -0.176118 0.260699 0.721975 -0.640928 0.154933 0.319407 -0.934866 0.232201 0.027093 -0.972291 0.155920 -0.464693 -0.871636 0.069469 -0.839032 -0.539629 -0.004637 -0.998101 -0.061429 -0.046519 -0.897279 0.439006 -0.044274 -0.558958 0.828013 0.002188 -0.071101 0.997467 0.080406 0.433476 0.897571 0.168695 0.814732 0.554755 0.242705 0.967920 0.064996 0.282654 0.854309 -0.436190 0.278567 0.509075 -0.814397 0.348683 0.233916 -0.907581 0.319546 -0.275457 -0.906650 0.228901 -0.713428 -0.662288 0.100217 -0.966166 -0.237655 -0.033054 -0.965670 0.257660 -0.135456 -0.708176 0.692921 -0.178743 -0.258933 0.949213 -0.150207 0.261432 0.953463 -0.057229 0.709363 0.702516 0.074388 0.961066 0.266118 0.208260 0.949576 -0.234376 0.308329 0.682123 -0.663055 0.387008 0.431093 -0.815098 0.428427 -0.072697 -0.900647 0.368558 -0.556362 -0.744732 0.223134 -0.894097 -0.388332 0.029729 -0.996627 0.076488 -0.160978 -0.833894 0.527928 -0.297641 -0.445566 0.844323 -0.342191 0.065640 0.937335 -0.281481 0.560020 0.779195 -0.132083 0.901053 0.413107 0.064452 0.996165 -0.059176 0.254316 0.822716 -0.508390 0.355205 0.605320 -0.712332 0.477527 0.130858 -0.868818 0.473616 -0.377028 -0.795951 0.344955 -0.785609 -0.513639 0.124876 -0.987596 -0.095183 -0.129279 -0.927748 0.350102 -0.349926 -0.618692 0.703400 -0.476786 -0.140910 0.867652 -0.474157 0.376406 0.795923 -0.342243 0.791098 0.506984 -0.117628 0.989768 0.080764 0.137810 0.920489 -0.365660 0.267413 0.747587 -0.607950 0.470480 0.324934 -0.820406 0.537942 -0.184031 -0.822649 0.452788 -0.645403 -0.615174 0.237280 -0.938104 -0.252307 -0.052478 -0.983850 0.171126 -0.339972 -0.767937 0.542855 -0.547644 -0.345561 0.762019 -0.618143 0.170276 0.767401 -0.531421 0.638795 0.556357 -0.311308 0.931772 0.186782 -0.018513 0.970648 -0.239791 0.138087 0.852415 -0.504303 0.414041 0.501826 -0.759434 0.559974 0.015279 -0.828369 0.538173 -0.478263 -0.693999 0.354582 -0.848915 -0.391938 0.057115 -0.998367 -0.001365 -0.275943 -0.885226 0.374474 -0.555503 -0.537394 0.634526 -0.705345 -0.047003 0.707304 -0.683847 0.453140 0.571855 -0.496651 0.826547 0.264873 -0.195276 0.972156 -0.129540 -0.019621 0.915967 -0.400774 0.315566 0.654783 -0.686787 0.539972 0.213674 -0.814109 0.594822 -0.289582 -0.749886 0.466040 -0.721913 -0.511515 0.187412 -0.968863 -0.161808 -0.167759 -0.963892 0.206808 -0.504965 -0.706548 0.495783 -0.733130 -0.264353 0.626608 -0.789723 0.243830 0.562926 -0.658922 0.680000 0.321594 -0.376535 0.925863 -0.031616 -0.193527 0.935411 -0.295893 0.182670 0.777301 -0.602026 0.479201 0.403373 -0.779523 0.617638 -0.085887 -0.781759 0.561749 -0.560408 -0.608589 0.326355 -0.894370 -0.305933 -0.026492 -0.998588 0.046054 -0.403125 -0.844108 0.353514 -0.702472 -0.470990 0.533575 -0.843289 0.021089 0.537046 -0.786967 0.499241 0.362549 -0.548757 0.834014 0.057330 -0.371631 0.909011 -0.188652 0.023789 0.862945 -0.504738 0.380176 0.575573 -0.724005 0.602614 0.124504 -0.788261 0.632331 -0.369771 -0.680755 0.461607 -0.775799 -0.430179 0.135594 -0.985387 -0.103089 -0.259181 -0.941974 0.213330 -0.617168 -0.656213 0.434153 -0.841849 -0.204099 0.499633 -0.872210 0.292827 0.391794 -0.699887 0.700466 0.139663 -0.542765 0.836271 -0.077823 -0.152339 0.906328 -0.394159 0.246531 0.721788 -0.646718 0.547133 0.332698 -0.768087 0.669525 -0.156615 -0.726091 0.581343 -0.615598 -0.532051 0.306023 -0.921884 -0.237657 -0.083288 -0.993424 0.078564 -0.482675 -0.810471 0.331906 -0.784908 -0.421482 0.454173 -0.908412 0.069314 0.412290 -0.819715 0.529882 0.217468 -0.694872 0.718225 0.036130 -0.334889 0.902573 -0.270576 0.084565 0.832692 -0.547241 0.450984 0.527716 -0.719812 0.666497 0.069642 -0.742247 0.673796 -0.418968 -0.608658 0.471019 -0.807658 -0.354725 0.112144 -0.992520 -0.048253 -0.307090 -0.923786 0.228727 -0.674398 -0.619439 0.401848 -0.891018 -0.160848 0.424517 -0.898536 0.328905 0.290611 -0.815350 0.558971 0.150852 -0.510816 0.848838 -0.136166 -0.096118 0.899237 -0.426771 0.317384 0.696909 -0.643106 0.618984 0.296391 -0.727331 0.728231 -0.194949 -0.657019 0.616107 -0.645766 -0.450998 0.312520 -0.935595 -0.164298 -0.101562 -0.986767 0.126400 -0.515399 -0.785248 0.343147 -0.817947 -0.384764 0.427690 -0.927806 0.107348 0.357284 -0.893150 0.364407 0.263611 -0.667351 0.744713 0.006705 -0.284660 0.914719 -0.286805 0.152080 0.828974 -0.538214 0.525751 0.510762 -0.680227 0.736458 0.045559 -0.674948 0.728074 -0.442112 -0.523875 0.502927 -0.821927 -0.267396 0.121083 -0.992303 0.025945 -0.315464 -0.907422 0.277610 -0.689790 -0.589701 0.420051 -0.901342 -0.124125 0.414941 -0.918184 0.144558 0.368837 -0.790322 0.593334 0.152796 -0.466844 0.874550 -0.131224 -0.034706 0.912777 -0.406980 0.390050 0.697993 -0.600555 0.693650 0.288065 -0.660204 0.795047 -0.207082 -0.570103 0.667331 -0.655020 -0.354426 0.344667 -0.936050 -0.070821 -0.086803 -0.974930 0.204881 -0.511706 -0.760986 0.398820 -0.816121 -0.351243 0.458885 -0.883832 -0.086333 0.459770 -0.866584 0.402770 0.294632 -0.626870 0.778412 0.033307 -0.229074 0.939680 -0.254020 0.219897 0.843403 -0.490222 0.599573 0.515688 -0.612028 0.808378 0.044622 -0.586970 0.790693 -0.443618 -0.421909 0.551422 -0.818533 -0.161048 0.154509 -0.979938 0.125893 -0.294023 -0.884524 0.362171 -0.674144 -0.557536 0.484442 -0.788780 -0.311659 0.529806 -0.886523 0.185573 0.423838 -0.749811 0.631250 0.198259 -0.415209 0.905613 -0.086413 0.027392 0.934953 -0.353711 0.459093 0.711559 -0.531900 0.764149 0.295633 -0.573305 0.861056 -0.201179 -0.467023 0.724159 -0.645909 -0.241651 0.390208 -0.919745 0.042499 -0.051556 -0.949506 0.309484 -0.483072 -0.727059 0.487880 -0.638110 -0.513965 0.573286 -0.845784 -0.041818 0.531884 -0.823398 0.443743 0.353705 -0.576689 0.812380 0.086417 -0.171784 0.964981 -0.198249 0.282542 0.860546 -0.423828 0.664292 0.527287 -0.529797 0.871191 0.054837 -0.487872 0.848082 -0.430094 -0.309478 0.601425 -0.797798 -0.042497 0.197295 -0.950096 0.241645 -0.256308 -0.846292 0.467008 -0.442843 -0.677802 0.586919 -0.746401 -0.261455 0.611986 -0.840382 0.231206 0.490207 -0.699288 0.668176 0.254042 -0.360738 0.932074 -0.033255 0.084437 0.951893 -0.294567 0.516654 0.722311 -0.459713 0.819910 0.305124 -0.484403 0.913050 -0.187578 -0.362153 0.771418 -0.623751 -0.125893 0.433171 -0.886811 0.161027 -0.011164 -0.906588 0.421869 -0.218281 -0.792049 0.570098 -0.596381 -0.456626 0.660169 -0.799547 0.011284 0.600497 -0.773122 0.486518 0.406920 -0.523902 0.841616 0.131187 -0.118606 0.981115 -0.152797 0.333967 0.867437 -0.368807 0.712290 0.531138 -0.458841 0.914907 0.062629 -0.398776 0.887709 -0.412326 -0.204843 0.638267 -0.766547 0.070853 0.233521 -0.905449 0.354444 0.018736 -0.851555 0.523930 -0.407795 -0.614912 0.674971 -0.705278 -0.199781 0.680199 -0.793947 0.282941 0.538138 -0.649757 0.703997 0.286713 -0.311143 0.950339 -0.006777 0.131102 0.955670 -0.263643 0.558239 0.718467 -0.414940 0.855621 0.302463 -0.420033 0.943580 -0.180570 -0.277582 0.798782 -0.601063 -0.025901 0.460272 -0.846533 0.267454 0.251066 -0.856440 0.451083 -0.195441 -0.728048 0.657076 -0.566307 -0.387681 0.727324 -0.762283 0.073814 0.643021 -0.730641 0.533054 0.426635 -0.479555 0.866904 0.136033 -0.076231 0.985600 -0.150936 0.371077 0.857108 -0.357305 0.742266 0.515887 -0.427669 0.937765 0.053632 -0.343103 0.905318 -0.405508 -0.126338 0.653910 -0.738500 0.164378 0.463775 -0.811788 0.354842 0.025709 -0.792948 0.608747 -0.393796 -0.542193 0.742261 -0.682661 -0.126417 0.719717 -0.763412 0.343416 0.547054 -0.614032 0.741531 0.270364 -0.274286 0.960964 -0.036280 0.164702 0.942547 -0.290651 0.584999 0.691091 -0.424464 0.873738 0.274184 -0.401752 0.953566 -0.196076 -0.228619 0.803391 -0.593484 0.048369 0.645001 -0.726178 0.237991 0.241934 -0.811218 0.532347 -0.199697 -0.657787 0.726249 -0.562139 -0.306862 0.768007 -0.748502 0.148139 0.646375 -0.708487 0.585741 0.393641 -0.452269 0.888525 0.077310 -0.048325 0.974796 -0.217803 0.394783 0.821030 -0.412378 0.757828 0.468539 -0.454056 0.943317 0.012302 -0.331666 0.901821 -0.424964 -0.078257 0.785244 -0.610475 0.103496 0.440529 -0.787725 0.430608 0.003435 -0.732200 0.681081 -0.409698 -0.458976 0.788346 -0.688853 -0.040589 0.723763 -0.759123 0.411710 0.504209 -0.600899 0.776901 0.188001 -0.255928 0.956472 -0.140223 0.183243 0.901480 -0.392116 0.598199 0.626472 -0.499692 0.877101 0.205763 -0.433999 0.945292 -0.247071 -0.213022 0.878001 -0.476447 -0.045960 0.611261 -0.729846 0.306079 0.204289 -0.766611 0.608748 -0.234619 -0.577623 0.781861 -0.589058 -0.213012 0.779511 -0.764505 0.230766 0.601896 -0.713200 0.635535 0.295703 -0.447691 0.892338 -0.057502 -0.038669 0.931122 -0.362653 0.403520 0.740751 -0.537085 0.759190 0.372735 -0.533572 0.932587 -0.073063 -0.353474 0.918598 -0.336905 -0.206573 0.745166 -0.646883 0.162082 0.391860 -0.764550 0.511770 -0.047006 -0.659724 0.750036 -0.455374 -0.360429 0.814079 -0.725025 0.054545 0.686560 -0.783384 0.475369 0.400416 -0.613272 0.789253 0.031256 -0.259033 0.910671 -0.321838 0.184087 0.805691 -0.563004 0.595774 0.502491 -0.626543 0.864492 0.083766 -0.495617 0.904668 -0.204197 -0.374005 0.835794 -0.549040 0.001934 0.557360 -0.731646 0.392484 0.144410 -0.704974 0.694375 -0.293906 -0.476772 0.828437 -0.642098 -0.106928 0.759129 -0.807364 0.307345 0.503689 -0.743947 0.655707 0.128810 -0.466822 0.843560 -0.265488 -0.049725 0.818615 -0.572186 0.394048 0.586893 -0.707307 0.743549 0.211803 -0.634251 0.835265 -0.090086 -0.542418 0.878172 -0.446909 -0.170547 0.693385 -0.674728 0.252902 0.331943 -0.714703 0.615641 -0.110256 -0.557471 0.822842 -0.517191 -0.244374 0.820241 -0.781408 0.142852 0.607450 -0.831234 0.501875 0.239108 -0.650802 0.735750 -0.187428 -0.286797 0.779579 -0.556780 0.162320 0.620147 -0.767509 0.573611 0.300996 -0.761822</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="1800" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="5889">0 0 0 0 0.083333 0 0 0.166667 0 0 0.250000 0 0 0.333333 0 0 0.416667 0 0 0.500000 0 0 0.583333 0 0 0.666667 0 0 0.750000 0 0 0.833333 0 0 0.916667 0 0 1.000000 0 0.006667 0 0 0.006667 0.083333 0 0.006667 0.166667 0 0.006667 0.250000 0 0.006667 0.333333 0 0.006667 0.416667 0 0.006667 0.500000 0 0.006667 0.583333 0 0.006667 0.666667 0 0.006667 0.750000 0 0.006667 0.833333 0 0.006667 0.916667 0 0.006667 1.000000 0 0.013333 0 0 0.013333 0.083333 0 0.013333 0.166667 0 0.013333 0.250000 0 0.013333 0.333333 0 0.013333 0.416667 0 0.013333 0.500000 0 0.013333 0.583333 0 0.013333 0.666667 0 0.013333 0.750000 0 0.013333 0.833333 0 0.013333 0.916667 0 0.013333 1.000000 0 0.020000 0 0 0.020000 0.083333 0 0.020000 0.166667 0 0.020000 0.250000 0 0.020000 0.333333 0 0.020000 0.416667 0 0.020000 0.500000 0 0.020000 0.583333 0 0.020000 0.666667 0 0.020000 0.750000 0 0.020000 0.833333 0 0.020000 0.916667 0 0.020000 1.000000 0 0.026667 0 0 0.026667 0.083333 0 0.026667 0.166667 0 0.026667 0.250000 0 0.026667 0.333333 0 0.026667 0.416667 0 0.026667 0.500000 0 0.026667 0.583333 0 0.026667 0.666667 0 0.026667 0.750000 0 0.026667 0.833333 0 0.026667 0.916667 0 0.026667 1.000000 0 0.033333 0 0 0.033333 0.083333 0 0.033333 0.166667 0 0.033333 0.250000 0 0.033333 0.333333 0 0.033333 0.416667 0 0.033333 0.500000 0 0.033333 0.583333 0 0.033333 0.666667 0 0.033333 0.750000 0 0.033333 0.833333 0 0.033333 0.916667 0 0.033333 1.000000 0 0.040000 0 0 0.040000 0.083333 0 0.040000 0.166667 0 0.040000 0.250000 0 0.040000 0.333333 0 0.040000 0.416667 0 0.040000 0.500000 0 0.040000 0.583333 0 0.040000 0.666667 0 0.040000 0.750000 0 0.040000 0.833333 0 0.040000 0.916667 0 0.040000 1.000000 0 0.046667 0 0 0.046667 0.083333 0 0.046667 0.166667 0 0.046667 0.250000 0 0.046667 0.333333 0 0.046667 0.416667 0 0.046667 0.500000 0 0.046667 0.583333 0 0.046667 0.666667 0 0.046667 0.750000 0 0.046667 0.833333 0 0.046667 0.916667 0 0.046667 1.000000 0 0.053333 0 0 0.053333 0.083333 0 0.053333 0.166667 0 0.053333 0.250000 0 0.053333 0.333333 0 0.053333 0.416667 0 0.053333 0.500000 0 0.053333 0.583333 0 0.053333 0.666667 0 0.053333 0.750000 0 0.053333 0.833333 0 0.053333 0.916667 0 0.053333 1.000000 0 0.060000 0 0 0.060000 0.083333 0 0.060000 0.166667 0 0.060000 0.250000 0 0.060000 0.333333 0 0.060000 0.416667 0 0.060000 0.500000 0 0.060000 0.583333 0 0.060000 0.666667 0 0.060000 0.750000 0 0.060000 0.833333 0 0.060000 0.916667 0 0.060000 1.000000 0 0.066667 0 0 0.066667 0.083333 0 0.066667 0.166667 0 0.066667 0.250000 0 0.066667 0.333333 0 0.066667 0.416667 0 0.066667 0.500000 0 0.066667 0.583333 0 0.066667 0.666667 0 0.066667 0.750000 0 0.066667 0.833333 0 0.066667 0.916667 0 0.066667 1.000000 0 0.073333 0 0 0.073333 0.083333 0 0.073333 0.166667 0 0.073333 0.250000 0 0.073333 0.333333 0 0.073333 0.416667 0 0.073333 0.500000 0 0.073333 0.583333 0 0.073333 0.666667 0 0.073333 0.750000 0 0.073333 0.833333 0 0.073333 0.916667 0 0.073333 1.000000 0 0.080000 0 0 0.080000 0.083333 0 0.080000 0.166667 0 0.080000 0.250000 0 0.080000 0.333333 0 0.080000 0.416667 0 0.080000 0.500000 0 0.080000 0.583333 0 0.080000 0.666667 0 0.080000 0.750000 0 0.080000 0.833333 0 0.080000 0.916667 0 0.080000 1.000000 0 0.086667 0 0 0.086667 0.083333 0 0.086667 0.166667 0 0.086667 0.250000 0 0.086667 0.333333 0 0.086667 0.416667 0 0.086667 0.500000 0 0.086667 0.583333 0 0.086667 0.666667 0 0.086667 0.750000 0 0.086667 0.833333 0 0.086667 0.916667 0 0.086667 1.000000 0 0.093333 0 0 0.093333 0.083333 0 0.093333 0.166667 0 0.093333 0.250000 0 0.093333 0.333333 0 0.093333 0.416667 0 0.093333 0.500000 0 0.093333 0.583333 0 0.093333 0.666667 0 0.093333 0.750000 0 0.093333 0.833333 0 0.093333 0.916667 0 0.093333 1.000000 0 0.100000 0 0 0.100000 0.083333 0 0.100000 0.166667 0 0.100000 0.250000 0 0.100000 0.333333 0 0.100000 0.416667 0 0.100000 0.500000 0 0.100000 0.583333 0 0.100000 0.666667 0 0.100000 0.750000 0 0.100000 0.833333 0 0.100000 0.916667 0 0.100000 1.000000 0 0.106667 0 0 0.106667 0.083333 0 0.106667 0.166667 0 0.106667 0.250000 0 0.106667 0.333333 0 0.106667 0.416667 0 0.106667 0.500000 0 0.106667 0.583333 0 0.106667 0.666667 0 0.106667 0.750000 0 0.106667 0.833333 0 0.106667 0.916667 0 0.106667 1.000000 0 0.113333 0 0 0.113333 0.083333 0 0.113333 0.166667 0 0.113333 0.250000 0 0.113333 0.333333 0 0.113333 0.416667 0 0.113333 0.500000 0 0.113333 0.583333 0 0.113333 0.666667 0 0.113333 0.750000 0 0.113333 0.833333 0 0.113333 0.916667 0 0.113333 1.000000 0 0.120000 0 0 0.120000 0.083333 0 0.120000 0.166667 0 0.120000 0.250000 0 0.120000 0.333333 0 0.120000 0.416667 0 0.120000 0.500000 0 0.120000 0.583333 0 0.120000 0.666667 0 0.120000 0.750000 0 0.120000 0.833333 0 0.120000 0.916667 0 0.120000 1.000000 0 0.126667 0 0 0.126667 0.083333 0 0.126667 0.166667 0 0.126667 0.250000 0 0.126667 0.333333 0 0.126667 0.416667 0 0.126667 0.500000 0 0.126667 0.583333 0 0.126667 0.666667 0 0.126667 0.750000 0 0.126667 0.833333 0 0.126667 0.916667 0 0.126667 1.000000 0 0.133333 0 0 0.133333 0.083333 0 0.133333 0.166667 0 0.133333 0.250000 0 0.133333 0.333333 0 0.133333 0.416667 0 0.133333 0.500000 0 0.133333 0.583333 0 0.133333 0.666667 0 0.133333 0.750000 0 0.133333 0.833333 0 0.133333 0.916667 0 0.133333 1.000000 0 0.140000 0 0 0.140000 0.083333 0 0.140000 0.166667 0 0.140000 0.250000 0 0.140000 0.333333 0 0.140000 0.416667 0 0.140000 0.500000 0 0.140000 0.583333 0 0.140000 0.666667 0 0.140000 0.750000 0 0.140000 0.833333 0 0.140000 0.916667 0 0.140000 1.000000 0 0.146667 0 0 0.146667 0.083333 0 0.146667 0.166667 0 0.146667 0.250000 0 0.146667 0.333333 0 0.146667 0.416667 0 0.146667 0.500000 0 0.146667 0.583333 0 0.146667 0.666667 0 0.146667 0.750000 0 0.146667 0.833333 0 0.146667 0.916667 0 0.146667 1.000000 0 0.153333 0 0 0.153333 0.083333 0 0.153333 0.166667 0 0.153333 0.250000 0 0.153333 0.333333 0 0.153333 0.416667 0 0.153333 0.500000 0 0.153333 0.583333 0 0.153333 0.666667 0 0.153333 0.750000 0 0.153333 0.833333 0 0.153333 0.916667 0 0.153333 1.000000 0 0.160000 0 0 0.160000 0.083333 0 0.160000 0.166667 0 0.160000 0.250000 0 0.160000 0.333333 0 0.160000 0.416667 0 0.160000 0.500000 0 0.160000 0.583333 0 0.160000 0.666667 0 0.160000 0.750000 0 0.160000 0.833333 0 0.160000 0.916667 0 0.160000 1.000000 0 0.166667 0 0 0.166667 0.083333 0 0.166667 0.166667 0 0.166667 0.250000 0 0.166667 0.333333 0 0.166667 0.416667 0 0.166667 0.500000 0 0.166667 0.583333 0 0.166667 0.666667 0 0.166667 0.750000 0 0.166667 0.833333 0 0.166667 0.916667 0 0.166667 1.000000 0 0.173333 0 0 0.173333 0.083333 0 0.173333 0.166667 0 0.173333 0.250000 0 0.173333 0.333333 0 0.173333 0.416667 0 0.173333 0.500000 0 0.173333 0.583333 0 0.173333 0.666667 0 0.173333 0.750000 0 0.173333 0.833333 0 0.173333 0.916667 0 0.173333 1.000000 0 0.180000 0 0 0.180000 0.083333 0 0.180000 0.166667 0 0.180000 0.250000 0 0.180000 0.333333 0 0.180000 0.416667 0 0.180000 0.500000 0 0.180000 0.583333 0 0.180000 0.666667 0 0.180000 0.750000 0 0.180000 0.833333 0 0.180000 0.916667 0 0.180000 1.000000 0 0.186667 0 0 0.186667 0.083333 0 0.186667 0.166667 0 0.186667 0.250000 0 0.186667 0.333333 0 0.186667 0.416667 0 0.186667 0.500000 0 0.186667 0.583333 0 0.186667 0.666667 0 0.186667 0.750000 0 0.186667 0.833333 0 0.186667 0.916667 0 0.186667 1.000000 0 0.193333 0 0 0.193333 0.083333 0 0.193333 0.166667 0 0.193333 0.250000 0 0.193333 0.333333 0 0.193333 0.416667 0 0.193333 0.500000 0 0.193333 0.583333 0 0.193333 0.666667 0 0.193333 0.750000 0 0.193333 0.833333 0 0.193333 0.916667 0 0.193333 1.000000 0 0.200000 0 0 0.200000 0.083333 0 0.200000 0.166667 0 0.200000 0.250000 0 0.200000 0.333333 0 0.200000 0.416667 0 0.200000 0.500000 0 0.200000 0.583333 0 0.200000 0.666667 0 0.200000 0.750000 0 0.200000 0.833333 0 0.200000 0.916667 0 0.200000 1.000000 0 0.206667 0 0 0.206667 0.083333 0 0.206667 0.166667 0 0.206667 0.250000 0 0.206667 0.333333 0 0.206667 0.416667 0 0.206667 0.500000 0 0.206667 0.583333 0 0.206667 0.666667 0 0.206667 0.750000 0 0.206667 0.833333 0 0.206667 0.916667 0 0.206667 1.000000 0 0.213333 0 0 0.213333 0.083333 0 0.213333 0.166667 0 0.213333 0.250000 0 0.213333 0.333333 0 0.213333 0.416667 0 0.213333 0.500000 0 0.213333 0.583333 0 0.213333 0.666667 0 0.213333 0.750000 0 0.213333 0.833333 0 0.213333 0.916667 0 0.213333 1.000000 0 0.220000 0 0 0.220000 0.083333 0 0.220000 0.166667 0 0.220000 0.250000 0 0.220000 0.333333 0 0.220000 0.416667 0 0.220000 0.500000 0 0.220000 0.583333 0 0.220000 0.666667 0 0.220000 0.750000 0 0.220000 0.833333 0 0.220000 0.916667 0 0.220000 1.000000 0 0.226667 0 0 0.226667 0.083333 0 0.226667 0.166667 0 0.226667 0.250000 0 0.226667 0.333333 0 0.226667 0.416667 0 0.226667 0.500000 0 0.226667 0.583333 0 0.226667 0.666667 0 0.226667 0.750000 0 0.226667 0.833333 0 0.226667 0.916667 0 0.226667 1.000000 0 0.233333 0 0 0.233333 0.083333 0 0.233333 0.166667 0 0.233333 0.250000 0 0.233333 0.333333 0 0.233333 0.416667 0 0.233333 0.500000 0 0.233333 0.583333 0 0.233333 0.666667 0 0.233333 0.750000 0 0.233333 0.833333 0 0.233333 0.916667 0 0.233333 1.000000 0 0.240000 0 0 0.240000 0.083333 0 0.240000 0.166667 0 0.240000 0.250000 0 0.240000 0.333333 0 0.240000 0.416667 0 0.240000 0.500000 0 0.240000 0.583333 0 0.240000 0.666667 0 0.240000 0.750000 0 0.240000 0.833333 0 0.240000 0.916667 0 0.240000 1.000000 0 0.246667 0 0 0.246667 0.083333 0 0.246667 0.166667 0 0.246667 0.250000 0 0.246667 0.333333 0 0.246667 0.416667 0 0.246667 0.500000 0 0.246667 0.583333 0 0.246667 0.666667 0 0.246667 0.750000 0 0.246667 0.833333 0 0.246667 0.916667 0 0.246667 1.000000 0 0.253333 0 0 0.253333 0.083333 0 0.253333 0.166667 0 0.253333 0.250000 0 0.253333 0.333333 0 0.253333 0.416667 0 0.253333 0.500000 0 0.253333 0.583333 0 0.253333 0.666667 0 0.253333 0.750000 0 0.253333 0.833333 0 0.253333 0.916667 0 0.253333 1.000000 0 0.260000 0 0 0.260000 0.083333 0 0.260000 0.166667 0 0.260000 0.250000 0 0.260000 0.333333 0 0.260000 0.416667 0 0.260000 0.500000 0 0.260000 0.583333 0 0.260000 0.666667 0 0.260000 0.750000 0 0.260000 0.833333 0 0.260000 0.916667 0 0.260000 1.000000 0 0.266667 0 0 0.266667 0.083333 0 0.266667 0.166667 0 0.266667 0.250000 0 0.266667 0.333333 0 0.266667 0.416667 0 0.266667 0.500000 0 0.266667 0.583333 0 0.266667 0.666667 0 0.266667 0.750000 0 0.266667 0.833333 0 0.266667 0.916667 0 0.266667 1.000000 0 0.273333 0 0 0.273333 0.083333 0 0.273333 0.166667 0 0.273333 0.250000 0 0.273333 0.333333 0 0.273333 0.416667 0 0.273333 0.500000 0 0.273333 0.583333 0 0.273333 0.666667 0 0.273333 0.750000 0 0.273333 0.833333 0 0.273333 0.916667 0 0.273333 1.000000 0 0.280000 0 0 0.280000 0.083333 0 0.280000 0.166667 0 0.280000 0.250000 0 0.280000 0.333333 0 0.280000 0.416667 0 0.280000 0.500000 0 0.280000 0.583333 0 0.280000 0.666667 0 0.280000 0.750000 0 0.280000 0.833333 0 0.280000 0.916667 0 0.280000 1.000000 0 0.286667 0 0 0.286667 0.083333 0 0.286667 0.166667 0 0.286667 0.250000 0 0.286667 0.333333 0 0.286667 0.416667 0 0.286667 0.500000 0 0.286667 0.583333 0 0.286667 0.666667 0 0.286667 0.750000 0 0.286667 0.833333 0 0.286667 0.916667 0 0.286667 1.000000 0 0.293333 0 0 0.293333 0.083333 0 0.293333 0.166667 0 0.293333 0.250000 0 0.293333 0.333333 0 0.293333 0.416667 0 0.293333 0.500000 0 0.293333 0.583333 0 0.293333 0.666667 0 0.293333 0.750000 0 0.293333 0.833333 0 0.293333 0.916667 0 0.293333 1.000000 0 0.300000 0 0 0.300000 0.083333 0 0.300000 0.166667 0 0.300000 0.250000 0 0.300000 0.333333 0 0.300000 0.416667 0 0.300000 0.500000 0 0.300000 0.583333 0 0.300000 0.666667 0 0.300000 0.750000 0 0.300000 0.833333 0 0.300000 0.916667 0 0.300000 1.000000 0 0.306667 0 0 0.306667 0.083333 0 0.306667 0.166667 0 0.306667 0.250000 0 0.306667 0.333333 0 0.306667 0.416667 0 0.306667 0.500000 0 0.306667 0.583333 0 0.306667 0.666667 0 0.306667 0.750000 0 0.306667 0.833333 0 0.306667 0.916667 0 0.306667 1.000000 0 0.313333 0 0 0.313333 0.083333 0 0.313333 0.166667 0 0.313333 0.250000 0 0.313333 0.333333 0 0.313333 0.416667 0 0.313333 0.500000 0 0.313333 0.583333 0 0.313333 0.666667 0 0.313333 0.750000 0 0.313333 0.833333 0 0.313333 0.916667 0 0.313333 1.000000 0 0.320000 0 0 0.320000 0.083333 0 0.320000 0.166667 0 0.320000 0.250000 0 0.320000 0.333333 0 0.320000 0.416667 0 0.320000 0.500000 0 0.320000 0.583333 0 0.320000 0.666667 0 0.320000 0.750000 0 0.320000 0.833333 0 0.320000 0.916667 0 0.320000 1.000000 0 0.326667 0 0 0.326667 0.083333 0 0.326667 0.166667 0 0.326667 0.250000 0 0.326667 0.333333 0 0.326667 0.416667 0 0.326667 0.500000 0 0.326667 0.583333 0 0.326667 0.666667 0 0.326667 0.750000 0 0.326667 0.833333 0 0.326667 0.916667 0 0.326667 1.000000 0 0.333333 0 0 0.333333 0.083333 0 0.333333 0.166667 0 0.333333 0.250000 0 0.333333 0.333333 0 0.333333 0.416667 0 0.333333 0.500000 0 0.333333 0.583333 0 0.333333 0.666667 0 0.333333 0.750000 0 0.333333 0.833333 0 0.333333 0.916667 0 0.333333 1.000000 0 0.340000 0 0 0.340000 0.083333 0 0.340000 0.166667 0 0.340000 0.250000 0 0.340000 0.333333 0 0.340000 0.416667 0 0.340000 0.500000 0 0.340000 0.583333 0 0.340000 0.666667 0 0.340000 0.750000 0 0.340000 0.833333 0 0.340000 0.916667 0 0.340000 1.000000 0 0.346667 0 0 0.346667 0.083333 0 0.346667 0.166667 0 0.346667 0.250000 0 0.346667 0.333333 0 0.346667 0.416667 0 0.346667 0.500000 0 0.346667 0.583333 0 0.346667 0.666667 0 0.346667 0.750000 0 0.346667 0.833333 0 0.346667 0.916667 0 0.346667 1.000000 0 0.353333 0 0 0.353333 0.083333 0 0.353333 0.166667 0 0.353333 0.250000 0 0.353333 0.333333 0 0.353333 0.416667 0 0.353333 0.500000 0 0.353333 0.583333 0 0.353333 0.666667 0 0.353333 0.750000 0 0.353333 0.833333 0 0.353333 0.916667 0 0.353333 1.000000 0 0.360000 0 0 0.360000 0.083333 0 0.360000 0.166667 0 0.360000 0.250000 0 0.360000 0.333333 0 0.360000 0.416667 0 0.360000 0.500000 0 0.360000 0.583333 0 0.360000 0.666667 0 0.360000 0.750000 0 0.360000 0.833333 0 0.360000 0.916667 0 0.360000 1.000000 0 0.366667 0 0 0.366667 0.083333 0 0.366667 0.166667 0 0.366667 0.250000 0 0.366667 0.333333 0 0.366667 0.416667 0 0.366667 0.500000 0 0.366667 0.583333 0 0.366667 0.666667 0 0.366667 0.750000 0 0.366667 0.833333 0 0.366667 0.916667 0 0.366667 1.000000 0 0.373333 0 0 0.373333 0.083333 0 0.373333 0.166667 0 0.373333 0.250000 0 0.373333 0.333333 0 0.373333 0.416667 0 0.373333 0.500000 0 0.373333 0.583333 0 0.373333 0.666667 0 0.373333 0.750000 0 0.373333 0.833333 0 0.373333 0.916667 0 0.373333 1.000000 0 0.380000 0 0 0.380000 0.083333 0 0.380000 0.166667 0 0.380000 0.250000 0 0.380000 0.333333 0 0.380000 0.416667 0 0.380000 0.500000 0 0.380000 0.583333 0 0.380000 0.666667 0 0.380000 0.750000 0 0.380000 0.833333 0 0.380000 0.916667 0 0.380000 1.000000 0 0.386667 0 0 0.386667 0.083333 0 0.386667 0.166667 0 0.386667 0.250000 0 0.386667 0.333333 0 0.386667 0.416667 0 0.386667 0.500000 0 0.386667 0.583333 0 0.386667 0.666667 0 0.386667 0.750000 0 0.386667 0.833333 0 0.386667 0.916667 0 0.386667 1.000000 0 0.393333 0 0 0.393333 0.083333 0 0.393333 0.166667 0 0.393333 0.250000 0 0.393333 0.333333 0 0.393333 0.416667 0 0.393333 0.500000 0 0.393333 0.583333 0 0.393333 0.666667 0 0.393333 0.750000 0 0.393333 0.833333 0 0.393333 0.916667 0 0.393333 1.000000 0 0.400000 0 0 0.400000 0.083333 0 0.400000 0.166667 0 0.400000 0.250000 0 0.400000 0.333333 0 0.400000 0.416667 0 0.400000 0.500000 0 0.400000 0.583333 0 0.400000 0.666667 0 0.400000 0.750000 0 0.400000 0.833333 0 0.400000 0.916667 0 0.400000 1.000000 0 0.406667 0 0 0.406667 0.083333 0 0.406667 0.166667 0 0.406667 0.250000 0 0.406667 0.333333 0 0.406667 0.416667 0 0.406667 0.500000 0 0.406667 0.583333 0 0.406667 0.666667 0 0.406667 0.750000 0 0.406667 0.833333 0 0.406667 0.916667 0 0.406667 1.000000 0 0.413333 0 0 0.413333 0.083333 0 0.413333 0.166667 0 0.413333 0.250000 0 0.413333 0.333333 0 0.413333 0.416667 0 0.413333 0.500000 0 0.413333 0.583333 0 0.413333 0.666667 0 0.413333 0.750000 0 0.413333 0.833333 0 0.413333 0.916667 0 0.413333 1.000000 0 0.420000 0 0 0.420000 0.083333 0 0.420000 0.166667 0 0.420000 0.250000 0 0.420000 0.333333 0 0.420000 0.416667 0 0.420000 0.500000 0 0.420000 0.583333 0 0.420000 0.666667 0 0.420000 0.750000 0 0.420000 0.833333 0 0.420000 0.916667 0 0.420000 1.000000 0 0.426667 0 0 0.426667 0.083333 0 0.426667 0.166667 0 0.426667 0.250000 0 0.426667 0.333333 0 0.426667 0.416667 0 0.426667 0.500000 0 0.426667 0.583333 0 0.426667 0.666667 0 0.426667 0.750000 0 0.426667 0.833333 0 0.426667 0.916667 0 0.426667 1.000000 0 0.433333 0 0 0.433333 0.083333 0 0.433333 0.166667 0 0.433333 0.250000 0 0.433333 0.333333 0 0.433333 0.416667 0 0.433333 0.500000 0 0.433333 0.583333 0 0.433333 0.666667 0 0.433333 0.750000 0 0.433333 0.833333 0 0.433333 0.916667 0 0.433333 1.000000 0 0.440000 0 0 0.440000 0.083333 0 0.440000 0.166667 0 0.440000 0.250000 0 0.440000 0.333333 0 0.440000 0.416667 0 0.440000 0.500000 0 0.440000 0.583333 0 0.440000 0.666667 0 0.440000 0.750000 0 0.440000 0.833333 0 0.440000 0.916667 0 0.440000 1.000000 0 0.446667 0 0 0.446667 0.083333 0 0.446667 0.166667 0 0.446667 0.250000 0 0.446667 0.333333 0 0.446667 0.416667 0 0.446667 0.500000 0 0.446667 0.583333 0 0.446667 0.666667 0 0.446667 0.750000 0 0.446667 0.833333 0 0.446667 0.916667 0 0.446667 1.000000 0 0.453334 0 0 0.453334 0.083333 0 0.453334 0.166667 0 0.453334 0.250000 0 0.453334 0.333333 0 0.453334 0.416667 0 0.453334 0.500000 0 0.453334 0.583333 0 0.453334 0.666667 0 0.453334 0.750000 0 0.453334 0.833333 0 0.453334 0.916667 0 0.453334 1.000000 0 0.460000 0 0 0.460000 0.083333 0 0.460000 0.166667 0 0.460000 0.250000 0 0.460000 0.333333 0 0.460000 0.416667 0 0.460000 0.500000 0 0.460000 0.583333 0 0.460000 0.666667 0 0.460000 0.750000 0 0.460000 0.833333 0 0.460000 0.916667 0 0.460000 1.000000 0 0.466667 0 0 0.466667 0.083333 0 0.466667 0.166667 0 0.466667 0.250000 0 0.466667 0.333333 0 0.466667 0.416667 0 0.466667 0.500000 0 0.466667 0.583333 0 0.466667 0.666667 0 0.466667 0.750000 0 0.466667 0.833333 0 0.466667 0.916667 0 0.466667 1.000000 0 0.473334 0 0 0.473334 0.083333 0 0.473334 0.166667 0 0.473334 0.250000 0 0.473334 0.333333 0 0.473334 0.416667 0 0.473334 0.500000 0 0.473334 0.583333 0 0.473334 0.666667 0 0.473334 0.750000 0 0.473334 0.833333 0 0.473334 0.916667 0 0.473334 1.000000 0 0.480000 0 0 0.480000 0.083333 0 0.480000 0.166667 0 0.480000 0.250000 0 0.480000 0.333333 0 0.480000 0.416667 0 0.480000 0.500000 0 0.480000 0.583333 0 0.480000 0.666667 0 0.480000 0.750000 0 0.480000 0.833333 0 0.480000 0.916667 0 0.480000 1.000000 0 0.486667 0 0 0.486667 0.083333 0 0.486667 0.166667 0 0.486667 0.250000 0 0.486667 0.333333 0 0.486667 0.416667 0 0.486667 0.500000 0 0.486667 0.583333 0 0.486667 0.666667 0 0.486667 0.750000 0 0.486667 0.833333 0 0.486667 0.916667 0 0.486667 1.000000 0 0.493334 0 0 0.493334 0.083333 0 0.493334 0.166667 0 0.493334 0.250000 0 0.493334 0.333333 0 0.493334 0.416667 0 0.493334 0.500000 0 0.493334 0.583333 0 0.493334 0.666667 0 0.493334 0.750000 0 0.493334 0.833333 0 0.493334 0.916667 0 0.493334 1.000000 0 0.500000 0 0 0.500000 0.083333 0 0.500000 0.166667 0 0.500000 0.250000 0 0.500000 0.333333 0 0.500000 0.416667 0 0.500000 0.500000 0 0.500000 0.583333 0 0.500000 0.666667 0 0.500000 0.750000 0 0.500000 0.833333 0 0.500000 0.916667 0 0.500000 1.000000 0 0.506667 0 0 0.506667 0.083333 0 0.506667 0.166667 0 0.506667 0.250000 0 0.506667 0.333333 0 0.506667 0.416667 0 0.506667 0.500000 0 0.506667 0.583333 0 0.506667 0.666667 0 0.506667 0.750000 0 0.506667 0.833333 0 0.506667 0.916667 0 0.506667 1.000000 0 0.513334 0 0 0.513334 0.083333 0 0.513334 0.166667 0 0.513334 0.250000 0 0.513334 0.333333 0 0.513334 0.416667 0 0.513334 0.500000 0 0.513334 0.583333 0 0.513334 0.666667 0 0.513334 0.750000 0 0.513334 0.833333 0 0.513334 0.916667 0 0.513334 1.000000 0 0.520000 0 0 0.520000 0.083333 0 0.520000 0.166667 0 0.520000 0.250000 0 0.520000 0.333333 0 0.520000 0.416667 0 0.520000 0.500000 0 0.520000 0.583333 0 0.520000 0.666667 0 0.520000 0.750000 0 0.520000 0.833333 0 0.520000 0.916667 0 0.520000 1.000000 0 0.526667 0 0 0.526667 0.083333 0 0.526667 0.166667 0 0.526667 0.250000 0 0.526667 0.333333 0 0.526667 0.416667 0 0.526667 0.500000 0 0.526667 0.583333 0 0.526667 0.666667 0 0.526667 0.750000 0 0.526667 0.833333 0 0.526667 0.916667 0 0.526667 1.000000 0 0.533334 0 0 0.533334 0.083333 0 0.533334 0.166667 0 0.533334 0.250000 0 0.533334 0.333333 0 0.533334 0.416667 0 0.533334 0.500000 0 0.533334 0.583333 0 0.533334 0.666667 0 0.533334 0.750000 0 0.533334 0.833333 0 0.533334 0.916667 0 0.533334 1.000000 0 0.540000 0 0 0.540000 0.083333 0 0.540000 0.166667 0 0.540000 0.250000 0 0.540000 0.333333 0 0.540000 0.416667 0 0.540000 0.500000 0 0.540000 0.583333 0 0.540000 0.666667 0 0.540000 0.750000 0 0.540000 0.833333 0 0.540000 0.916667 0 0.540000 1.000000 0 0.546667 0 0 0.546667 0.083333 0 0.546667 0.166667 0 0.546667 0.250000 0 0.546667 0.333333 0 0.546667 0.416667 0 0.546667 0.500000 0 0.546667 0.583333 0 0.546667 0.666667 0 0.546667 0.750000 0 0.546667 0.833333 0 0.546667 0.916667 0 0.546667 1.000000 0 0.553334 0 0 0.553334 0.083333 0 0.553334 0.166667 0 0.553334 0.250000 0 0.553334 0.333333 0 0.553334 0.416667 0 0.553334 0.500000 0 0.553334 0.583333 0 0.553334 0.666667 0 0.553334 0.750000 0 0.553334 0.833333 0 0.553334 0.916667 0 0.553334 1.000000 0 0.560000 0 0 0.560000 0.083333 0 0.560000 0.166667 0 0.560000 0.250000 0 0.560000 0.333333 0 0.560000 0.416667 0 0.560000 0.500000 0 0.560000 0.583333 0 0.560000 0.666667 0 0.560000 0.750000 0 0.560000 0.833333 0 0.560000 0.916667 0 0.560000 1.000000 0 0.566667 0 0 0.566667 0.083333 0 0.566667 0.166667 0 0.566667 0.250000 0 0.566667 0.333333 0 0.566667 0.416667 0 0.566667 0.500000 0 0.566667 0.583333 0 0.566667 0.666667 0 0.566667 0.750000 0 0.566667 0.833333 0 0.566667 0.916667 0 0.566667 1.000000 0 0.573334 0 0 0.573334 0.083333 0 0.573334 0.166667 0 0.573334 0.250000 0 0.573334 0.333333 0 0.573334 0.416667 0 0.573334 0.500000 0 0.573334 0.583333 0 0.573334 0.666667 0 0.573334 0.750000 0 0.573334 0.833333 0 0.573334 0.916667 0 0.573334 1.000000 0 0.580000 0 0 0.580000 0.083333 0 0.580000 0.166667 0 0.580000 0.250000 0 0.580000 0.333333 0 0.580000 0.416667 0 0.580000 0.500000 0 0.580000 0.583333 0 0.580000 0.666667 0 0.580000 0.750000 0 0.580000 0.833333 0 0.580000 0.916667 0 0.580000 1.000000 0 0.586667 0 0 0.586667 0.083333 0 0.586667 0.166667 0 0.586667 0.250000 0 0.586667 0.333333 0 0.586667 0.416667 0 0.586667 0.500000 0 0.586667 0.583333 0 0.586667 0.666667 0 0.586667 0.750000 0 0.586667 0.833333 0 0.586667 0.916667 0 0.586667 1.000000 0 0.593334 0 0 0.593334 0.083333 0 0.593334 0.166667 0 0.593334 0.250000 0 0.593334 0.333333 0 0.593334 0.416667 0 0.593334 0.500000 0 0.593334 0.583333 0 0.593334 0.666667 0 0.593334 0.750000 0 0.593334 0.833333 0 0.593334 0.916667 0 0.593334 1.000000 0 0.600001 0 0 0.600001 0.083333 0 0.600001 0.166667 0 0.600001 0.250000 0 0.600001 0.333333 0 0.600001 0.416667 0 0.600001 0.500000 0 0.600001 0.583333 0 0.600001 0.666667 0 0.600001 0.750000 0 0.600001 0.833333 0 0.600001 0.916667 0 0.600001 1.000000 0 0.606667 0 0 0.606667 0.083333 0 0.606667 0.166667 0 0.606667 0.250000 0 0.606667 0.333333 0 0.606667 0.416667 0 0.606667 0.500000 0 0.606667 0.583333 0 0.606667 0.666667 0 0.606667 0.750000 0 0.606667 0.833333 0 0.606667 0.916667 0 0.606667 1.000000 0 0.613334 0 0 0.613334 0.083333 0 0.613334 0.166667 0 0.613334 0.250000 0 0.613334 0.333333 0 0.613334 0.416667 0 0.613334 0.500000 0 0.613334 0.583333 0 0.613334 0.666667 0 0.613334 0.750000 0 0.613334 0.833333 0 0.613334 0.916667 0 0.613334 1.000000 0 0.620001 0 0 0.620001 0.083333 0 0.620001 0.166667 0 0.620001 0.250000 0 0.620001 0.333333 0 0.620001 0.416667 0 0.620001 0.500000 0 0.620001 0.583333 0 0.620001 0.666667 0 0.620001 0.750000 0 0.620001 0.833333 0 0.620001 0.916667 0 0.620001 1.000000 0 0.626667 0 0 0.626667 0.083333 0 0.626667 0.166667 0 0.626667 0.250000 0 0.626667 0.333333 0 0.626667 0.416667 0 0.626667 0.500000 0 0.626667 0.583333 0 0.626667 0.666667 0 0.626667 0.750000 0 0.626667 0.833333 0 0.626667 0.916667 0 0.626667 1.000000 0 0.633334 0 0 0.633334 0.083333 0 0.633334 0.166667 0 0.633334 0.250000 0 0.633334 0.333333 0 0.633334 0.416667 0 0.633334 0.500000 0 0.633334 0.583333 0 0.633334 0.666667 0 0.633334 0.750000 0 0.633334 0.833333 0 0.633334 0.916667 0 0.633334 1.000000 0 0.640001 0 0 0.640001 0.083333 0 0.640001 0.166667 0 0.640001 0.250000 0 0.640001 0.333333 0 0.640001 0.416667 0 0.640001 0.500000 0 0.640001 0.583333 0 0.640001 0.666667 0 0.640001 0.750000 0 0.640001 0.833333 0 0.640001 0.916667 0 0.640001 1.000000 0 0.646667 0 0 0.646667 0.083333 0 0.646667 0.166667 0 0.646667 0.250000 0 0.646667 0.333333 0 0.646667 0.416667 0 0.646667 0.500000 0 0.646667 0.583333 0 0.646667 0.666667 0 0.646667 0.750000 0 0.646667 0.833333 0 0.646667 0.916667 0 0.646667 1.000000 0 0.653334 0 0 0.653334 0.083333 0 0.653334 0.166667 0 0.653334 0.250000 0 0.653334 0.333333 0 0.653334 0.416667 0 0.653334 0.500000 0 0.653334 0.583333 0 0.653334 0.666667 0 0.653334 0.750000 0 0.653334 0.833333 0 0.653334 0.916667 0 0.653334 1.000000 0 0.660001 0 0 0.660001 0.083333 0 0.660001 0.166667 0 0.660001 0.250000 0 0.660001 0.333333 0 0.660001 0.416667 0 0.660001 0.500000 0 0.660001 0.583333 0 0.660001 0.666667 0 0.660001 0.750000 0 0.660001 0.833333 0 0.660001 0.916667 0 0.660001 1.000000 0 0.666667 0 0 0.666667 0.083333 0 0.666667 0.166667 0 0.666667 0.250000 0 0.666667 0.333333 0 0.666667 0.416667 0 0.666667 0.500000 0 0.666667 0.583333 0 0.666667 0.666667 0 0.666667 0.750000 0 0.666667 0.833333 0 0.666667 0.916667 0 0.666667 1.000000 0 0.673334 0 0 0.673334 0.083333 0 0.673334 0.166667 0 0.673334 0.250000 0 0.673334 0.333333 0 0.673334 0.416667 0 0.673334 0.500000 0 0.673334 0.583333 0 0.673334 0.666667 0 0.673334 0.750000 0 0.673334 0.833333 0 0.673334 0.916667 0 0.673334 1.000000 0 0.680000 0 0 0.680000 0.083333 0 0.680000 0.166667 0 0.680000 0.250000 0 0.680000 0.333333 0 0.680000 0.416667 0 0.680000 0.500000 0 0.680000 0.583333 0 0.680000 0.666667 0 0.680000 0.750000 0 0.680000 0.833333 0 0.680000 0.916667 0 0.680000 1.000000 0 0.686667 0 0 0.686667 0.083333 0 0.686667 0.166667 0 0.686667 0.250000 0 0.686667 0.333333 0 0.686667 0.416667 0 0.686667 0.500000 0 0.686667 0.583333 0 0.686667 0.666667 0 0.686667 0.750000 0 0.686667 0.833333 0 0.686667 0.916667 0 0.686667 1.000000 0 0.693334 0 0 0.693334 0.083333 0 0.693334 0.166667 0 0.693334 0.250000 0 0.693334 0.333333 0 0.693334 0.416667 0 0.693334 0.500000 0 0.693334 0.583333 0 0.693334 0.666667 0 0.693334 0.750000 0 0.693334 0.833333 0 0.693334 0.916667 0 0.693334 1.000000 0 0.700000 0 0 0.700000 0.083333 0 0.700000 0.166667 0 0.700000 0.250000 0 0.700000 0.333333 0 0.700000 0.416667 0 0.700000 0.500000 0 0.700000 0.583333 0 0.700000 0.666667 0 0.700000 0.750000 0 0.700000 0.833333 0 0.700000 0.916667 0 0.700000 1.000000 0 0.706667 0 0 0.706667 0.083333 0 0.706667 0.166667 0 0.706667 0.250000 0 0.706667 0.333333 0 0.706667 0.416667 0 0.706667 0.500000 0 0.706667 0.583333 0 0.706667 0.666667 0 0.706667 0.750000 0 0.706667 0.833333 0 0.706667 0.916667 0 0.706667 1.000000 0 0.713334 0 0 0.713334 0.083333 0 0.713334 0.166667 0 0.713334 0.250000 0 0.713334 0.333333 0 0.713334 0.416667 0 0.713334 0.500000 0 0.713334 0.583333 0 0.713334 0.666667 0 0.713334 0.750000 0 0.713334 0.833333 0 0.713334 0.916667 0 0.713334 1.000000 0 0.720000 0 0 0.720000 0.083333 0 0.720000 0.166667 0 0.720000 0.250000 0 0.720000 0.333333 0 0.720000 0.416667 0 0.720000 0.500000 0 0.720000 0.583333 0 0.720000 0.666667 0 0.720000 0.750000 0 0.720000 0.833333 0 0.720000 0.916667 0 0.720000 1.000000 0 0.726667 0 0 0.726667 0.083333 0 0.726667 0.166667 0 0.726667 0.250000 0 0.726667 0.333333 0 0.726667 0.416667 0 0.726667 0.500000 0 0.726667 0.583333 0 0.726667 0.666667 0 0.726667 0.750000 0 0.726667 0.833333 0 0.726667 0.916667 0 0.726667 1.000000 0 0.733334 0 0 0.733334 0.083333 0 0.733334 0.166667 0 0.733334 0.250000 0 0.733334 0.333333 0 0.733334 0.416667 0 0.733334 0.500000 0 0.733334 0.583333 0 0.733334 0.666667 0 0.733334 0.750000 0 0.733334 0.833333 0 0.733334 0.916667 0 0.733334 1.000000 0 0.740000 0 0 0.740000 0.083333 0 0.740000 0.166667 0 0.740000 0.250000 0 0.740000 0.333333 0 0.740000 0.416667 0 0.740000 0.500000 0 0.740000 0.583333 0 0.740000 0.666667 0 0.740000 0.750000 0 0.740000 0.833333 0 0.740000 0.916667 0 0.740000 1.000000 0 0.746667 0 0 0.746667 0.083333 0 0.746667 0.166667 0 0.746667 0.250000 0 0.746667 0.333333 0 0.746667 0.416667 0 0.746667 0.500000 0 0.746667 0.583333 0 0.746667 0.666667 0 0.746667 0.750000 0 0.746667 0.833333 0 0.746667 0.916667 0 0.746667 1.000000 0 0.753334 0 0 0.753334 0.083333 0 0.753334 0.166667 0 0.753334 0.250000 0 0.753334 0.333333 0 0.753334 0.416667 0 0.753334 0.500000 0 0.753334 0.583333 0 0.753334 0.666667 0 0.753334 0.750000 0 0.753334 0.833333 0 0.753334 0.916667 0 0.753334 1.000000 0 0.760000 0 0 0.760000 0.083333 0 0.760000 0.166667 0 0.760000 0.250000 0 0.760000 0.333333 0 0.760000 0.416667 0 0.760000 0.500000 0 0.760000 0.583333 0 0.760000 0.666667 0 0.760000 0.750000 0 0.760000 0.833333 0 0.760000 0.916667 0 0.760000 1.000000 0 0.766667 0 0 0.766667 0.083333 0 0.766667 0.166667 0 0.766667 0.250000 0 0.766667 0.333333 0 0.766667 0.416667 0 0.766667 0.500000 0 0.766667 0.583333 0 0.766667 0.666667 0 0.766667 0.750000 0 0.766667 0.833333 0 0.766667 0.916667 0 0.766667 1.000000 0 0.773333 0 0 0.773333 0.083333 0 0.773333 0.166667 0 0.773333 0.250000 0 0.773333 0.333333 0 0.773333 0.416667 0 0.773333 0.500000 0 0.773333 0.583333 0 0.773333 0.666667 0 0.773333 0.750000 0 0.773333 0.833333 0 0.773333 0.916667 0 0.773333 1.000000 0 0.780000 0 0 0.780000 0.083333 0 0.780000 0.166667 0 0.780000 0.250000 0 0.780000 0.333333 0 0.780000 0.416667 0 0.780000 0.500000 0 0.780000 0.583333 0 0.780000 0.666667 0 0.780000 0.750000 0 0.780000 0.833333 0 0.780000 0.916667 0 0.780000 1.000000 0 0.786667 0 0 0.786667 0.083333 0 0.786667 0.166667 0 0.786667 0.250000 0 0.786667 0.333333 0 0.786667 0.416667 0 0.786667 0.500000 0 0.786667 0.583333 0 0.786667 0.666667 0 0.786667 0.750000 0 0.786667 0.833333 0 0.786667 0.916667 0 0.786667 1.000000 0 0.793333 0 0 0.793333 0.083333 0 0.793333 0.166667 0 0.793333 0.250000 0 0.793333 0.333333 0 0.793333 0.416667 0 0.793333 0.500000 0 0.793333 0.583333 0 0.793333 0.666667 0 0.793333 0.750000 0 0.793333 0.833333 0 0.793333 0.916667 0 0.793333 1.000000 0 0.800000 0 0 0.800000 0.083333 0 0.800000 0.166667 0 0.800000 0.250000 0 0.800000 0.333333 0 0.800000 0.416667 0 0.800000 0.500000 0 0.800000 0.583333 0 0.800000 0.666667 0 0.800000 0.750000 0 0.800000 0.833333 0 0.800000 0.916667 0 0.800000 1.000000 0 0.806667 0 0 0.806667 0.083333 0 0.806667 0.166667 0 0.806667 0.250000 0 0.806667 0.333333 0 0.806667 0.416667 0 0.806667 0.500000 0 0.806667 0.583333 0 0.806667 0.666667 0 0.806667 0.750000 0 0.806667 0.833333 0 0.806667 0.916667 0 0.806667 1.000000 0 0.813333 0 0 0.813333 0.083333 0 0.813333 0.166667 0 0.813333 0.250000 0 0.813333 0.333333 0 0.813333 0.416667 0 0.813333 0.500000 0 0.813333 0.583333 0 0.813333 0.666667 0 0.813333 0.750000 0 0.813333 0.833333 0 0.813333 0.916667 0 0.813333 1.000000 0 0.820000 0 0 0.820000 0.083333 0 0.820000 0.166667 0 0.820000 0.250000 0 0.820000 0.333333 0 0.820000 0.416667 0 0.820000 0.500000 0 0.820000 0.583333 0 0.820000 0.666667 0 0.820000 0.750000 0 0.820000 0.833333 0 0.820000 0.916667 0 0.820000 1.000000 0 0.826667 0 0 0.826667 0.083333 0 0.826667 0.166667 0 0.826667 0.250000 0 0.826667 0.333333 0 0.826667 0.416667 0 0.826667 0.500000 0 0.826667 0.583333 0 0.826667 0.666667 0 0.826667 0.750000 0 0.826667 0.833333 0 0.826667 0.916667 0 0.826667 1.000000 0 0.833333 0 0 0.833333 0.083333 0 0.833333 0.166667 0 0.833333 0.250000 0 0.833333 0.333333 0 0.833333 0.416667 0 0.833333 0.500000 0 0.833333 0.583333 0 0.833333 0.666667 0 0.833333 0.750000 0 0.833333 0.833333 0 0.833333 0.916667 0 0.833333 1.000000 0 0.840000 0 0 0.840000 0.083333 0 0.840000 0.166667 0 0.840000 0.250000 0 0.840000 0.333333 0 0.840000 0.416667 0 0.840000 0.500000 0 0.840000 0.583333 0 0.840000 0.666667 0 0.840000 0.750000 0 0.840000 0.833333 0 0.840000 0.916667 0 0.840000 1.000000 0 0.846667 0 0 0.846667 0.083333 0 0.846667 0.166667 0 0.846667 0.250000 0 0.846667 0.333333 0 0.846667 0.416667 0 0.846667 0.500000 0 0.846667 0.583333 0 0.846667 0.666667 0 0.846667 0.750000 0 0.846667 0.833333 0 0.846667 0.916667 0 0.846667 1.000000 0 0.853333 0 0 0.853333 0.083333 0 0.853333 0.166667 0 0.853333 0.250000 0 0.853333 0.333333 0 0.853333 0.416667 0 0.853333 0.500000 0 0.853333 0.583333 0 0.853333 0.666667 0 0.853333 0.750000 0 0.853333 0.833333 0 0.853333 0.916667 0 0.853333 1.000000 0 0.860000 0 0 0.860000 0.083333 0 0.860000 0.166667 0 0.860000 0.250000 0 0.860000 0.333333 0 0.860000 0.416667 0 0.860000 0.500000 0 0.860000 0.583333 0 0.860000 0.666667 0 0.860000 0.750000 0 0.860000 0.833333 0 0.860000 0.916667 0 0.860000 1.000000 0 0.866666 0 0 0.866666 0.083333 0 0.866666 0.166667 0 0.866666 0.250000 0 0.866666 0.333333 0 0.866666 0.416667 0 0.866666 0.500000 0 0.866666 0.583333 0 0.866666 0.666667 0 0.866666 0.750000 0 0.866666 0.833333 0 0.866666 0.916667 0 0.866666 1.000000 0 0.873333 0 0 0.873333 0.083333 0 0.873333 0.166667 0 0.873333 0.250000 0 0.873333 0.333333 0 0.873333 0.416667 0 0.873333 0.500000 0 0.873333 0.583333 0 0.873333 0.666667 0 0.873333 0.750000 0 0.873333 0.833333 0 0.873333 0.916667 0 0.873333 1.000000 0 0.880000 0 0 0.880000 0.083333 0 0.880000 0.166667 0 0.880000 0.250000 0 0.880000 0.333333 0 0.880000 0.416667 0 0.880000 0.500000 0 0.880000 0.583333 0 0.880000 0.666667 0 0.880000 0.750000 0 0.880000 0.833333 0 0.880000 0.916667 0 0.880000 1.000000 0 0.886666 0 0 0.886666 0.083333 0 0.886666 0.166667 0 0.886666 0.250000 0 0.886666 0.333333 0 0.886666 0.416667 0 0.886666 0.500000 0 0.886666 0.583333 0 0.886666 0.666667 0 0.886666 0.750000 0 0.886666 0.833333 0 0.886666 0.916667 0 0.886666 1.000000 0 0.893333 0 0 0.893333 0.083333 0 0.893333 0.166667 0 0.893333 0.250000 0 0.893333 0.333333 0 0.893333 0.416667 0 0.893333 0.500000 0 0.893333 0.583333 0 0.893333 0.666667 0 0.893333 0.750000 0 0.893333 0.833333 0 0.893333 0.916667 0 0.893333 1.000000 0 0.900000 0 0 0.900000 0.083333 0 0.900000 0.166667 0 0.900000 0.250000 0 0.900000 0.333333 0 0.900000 0.416667 0 0.900000 0.500000 0 0.900000 0.583333 0 0.900000 0.666667 0 0.900000 0.750000 0 0.900000 0.833333 0 0.900000 0.916667 0 0.900000 1.000000 0 0.906666 0 0 0.906666 0.083333 0 0.906666 0.166667 0 0.906666 0.250000 0 0.906666 0.333333 0 0.906666 0.416667 0 0.906666 0.500000 0 0.906666 0.583333 0 0.906666 0.666667 0 0.906666 0.750000 0 0.906666 0.833333 0 0.906666 0.916667 0 0.906666 1.000000 0 0.913333 0 0 0.913333 0.083333 0 0.913333 0.166667 0 0.913333 0.250000 0 0.913333 0.333333 0 0.913333 0.416667 0 0.913333 0.500000 0 0.913333 0.583333 0 0.913333 0.666667 0 0.913333 0.750000 0 0.913333 0.833333 0 0.913333 0.916667 0 0.913333 1.000000 0 0.920000 0 0 0.920000 0.083333 0 0.920000 0.166667 0 0.920000 0.250000 0 0.920000 0.333333 0 0.920000 0.416667 0 0.920000 0.500000 0 0.920000 0.583333 0 0.920000 0.666667 0 0.920000 0.750000 0 0.920000 0.833333 0 0.920000 0.916667 0 0.920000 1.000000 0 0.926666 0 0 0.926666 0.083333 0 0.926666 0.166667 0 0.926666 0.250000 0 0.926666 0.333333 0 0.926666 0.416667 0 0.926666 0.500000 0 0.926666 0.583333 0 0.926666 0.666667 0 0.926666 0.750000 0 0.926666 0.833333 0 0.926666 0.916667 0 0.926666 1.000000 0 0.933333 0 0 0.933333 0.083333 0 0.933333 0.166667 0 0.933333 0.250000 0 0.933333 0.333333 0 0.933333 0.416667 0 0.933333 0.500000 0 0.933333 0.583333 0 0.933333 0.666667 0 0.933333 0.750000 0 0.933333 0.833333 0 0.933333 0.916667 0 0.933333 1.000000 0 0.940000 0 0 0.940000 0.083333 0 0.940000 0.166667 0 0.940000 0.250000 0 0.940000 0.333333 0 0.940000 0.416667 0 0.940000 0.500000 0 0.940000 0.583333 0 0.940000 0.666667 0 0.940000 0.750000 0 0.940000 0.833333 0 0.940000 0.916667 0 0.940000 1.000000 0 0.946666 0 0 0.946666 0.083333 0 0.946666 0.166667 0 0.946666 0.250000 0 0.946666 0.333333 0 0.946666 0.416667 0 0.946666 0.500000 0 0.946666 0.583333 0 0.946666 0.666667 0 0.946666 0.750000 0 0.946666 0.833333 0 0.946666 0.916667 0 0.946666 1.000000 0 0.953333 0 0 0.953333 0.083333 0 0.953333 0.166667 0 0.953333 0.250000 0 0.953333 0.333333 0 0.953333 0.416667 0 0.953333 0.500000 0 0.953333 0.583333 0 0.953333 0.666667 0 0.953333 0.750000 0 0.953333 0.833333 0 0.953333 0.916667 0 0.953333 1.000000 0 0.960000 0 0 0.960000 0.083333 0 0.960000 0.166667 0 0.960000 0.250000 0 0.960000 0.333333 0 0.960000 0.416667 0 0.960000 0.500000 0 0.960000 0.583333 0 0.960000 0.666667 0 0.960000 0.750000 0 0.960000 0.833333 0 0.960000 0.916667 0 0.960000 1.000000 0 0.966666 0 0 0.966666 0.083333 0 0.966666 0.166667 0 0.966666 0.250000 0 0.966666 0.333333 0 0.966666 0.416667 0 0.966666 0.500000 0 0.966666 0.583333 0 0.966666 0.666667 0 0.966666 0.750000 0 0.966666 0.833333 0 0.966666 0.916667 0 0.966666 1.000000 0 0.973333 0 0 0.973333 0.083333 0 0.973333 0.166667 0 0.973333 0.250000 0 0.973333 0.333333 0 0.973333 0.416667 0 0.973333 0.500000 0 0.973333 0.583333 0 0.973333 0.666667 0 0.973333 0.750000 0 0.973333 0.833333 0 0.973333 0.916667 0 0.973333 1.000000 0 0.979999 0 0 0.979999 0.083333 0 0.979999 0.166667 0 0.979999 0.250000 0 0.979999 0.333333 0 0.979999 0.416667 0 0.979999 0.500000 0 0.979999 0.583333 0 0.979999 0.666667 0 0.979999 0.750000 0 0.979999 0.833333 0 0.979999 0.916667 0 0.979999 1.000000 0 0.986666 0 0 0.986666 0.083333 0 0.986666 0.166667 0 0.986666 0.250000 0 0.986666 0.333333 0 0.986666 0.416667 0 0.986666 0.500000 0 0.986666 0.583333 0 0.986666 0.666667 0 0.986666 0.750000 0 0.986666 0.833333 0 0.986666 0.916667 0 0.986666 1.000000 0 0.993333 0 0 0.993333 0.083333 0 0.993333 0.166667 0 0.993333 0.250000 0 0.993333 0.333333 0 0.993333 0.416667 0 0.993333 0.500000 0 0.993333 0.583333 0 0.993333 0.666667 0 0.993333 0.750000 0 0.993333 0.833333 0 0.993333 0.916667 0 0.993333 1.000000 0 0.999999 0 0 0.999999 0.083333 0 0.999999 0.166667 0 0.999999 0.250000 0 0.999999 0.333333 0 0.999999 0.416667 0 0.999999 0.500000 0 0.999999 0.583333 0 0.999999 0.666667 0 0.999999 0.750000 0 0.999999 0.833333 0 0.999999 0.916667 0 0.999999 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="1963" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="3600">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 12 1 13 13 2 14 0 0 0 13 2 14 1 3 1 1 3 1 13 2 14 14 4 15 1 3 1 14 4 15 2 5 2 2 5 2 14 4 15 15 6 16 2 5 2 15 6 16 3 7 3 3 7 3 15 6 16 16 8 17 3 7 3 16 8 17 4 9 4 4 9 4 16 8 17 17 10 18 4 9 4 17 10 18 5 11 5 5 11 5 17 10 18 18 12 19 5 11 5 18 12 19 6 13 6 6 13 6 18 12 19 19 14 20 6 13 6 19 14 20 7 15 7 7 15 7 19 14 20 20 16 21 7 15 7 20 16 21 8 17 8 8 17 8 20 16 21 21 18 22 8 17 8 21 18 22 9 19 9 9 19 9 21 18 22 22 20 23 9 19 9 22 20 23 10 21 10 10 21 10 22 20 23 23 22 24 10 21 10 23 22 24 11 23 11 11 23 11 23 22 24 12 1 25 11 23 11 12 1 25 0 0 12 12 1 13 24 24 26 25 25 27 12 1 13 25 25 27 13 2 14 13 2 14 25 25 27 26 26 28 13 2 14 26 26 28 14 4 15 14 4 15 26 26 28 27 27 29 14 4 15 27 27 29 15 6 16 15 6 16 27 27 29 28 28 30 15 6 16 28 28 30 16 8 17 16 8 17 28 28 30 29 29 31 16 8 17 29 29 31 17 10 18 17 10 18 29 29 31 30 30 32 17 10 18 30 30 32 18 12 19 18 12 19 30 30 32 31 31 33 18 12 19 31 31 33 19 14 20 19 14 20 31 31 33 32 32 34 19 14 20 32 32 34 20 16 21 20 16 21 32 32 34 33 33 35 20 16 21 33 33 35 21 18 22 21 18 22 33 33 35 34 34 36 21 18 22 34 34 36 22 20 23 22 20 23 34 34 36 35 35 37 22 20 23 35 35 37 23 22 24 23 22 24 35 35 37 24 24 38 23 22 24 24 24 38 12 1 25 24 24 26 36 36 39 37 37 40 24 24 26 37 37 40 25 25 27 25 25 27 37 37 40 38 38 41 25 25 27 38 38 41 26 26 28 26 26 28 38 38 41 39 39 42 26 26 28 39 39 42 27 27 29 27 27 29 39 39 42 40 40 43 27 27 29 40 40 43 28 28 30 28 28 30 40 40 43 41 41 44 28 28 30 41 41 44 29 29 31 29 29 31 41 41 44 42 42 45 29 29 31 42 42 45 30 30 32 30 30 32 42 42 45 43 43 46 30 30 32 43 43 46 31 31 33 31 31 33 43 43 46 44 44 47 31 31 33 44 44 47 32 32 34 32 32 34 44 44 47 45 45 48 32 32 34 45 45 48 33 33 35 33 33 35 45 45 48 46 46 49 33 33 35 46 46 49 34 34 36 34 34 36 46 46 49 47 47 50 34 34 36 47 47 50 35 35 37 35 35 37 47 47 50 36 36 51 35 35 37 36 36 51 24 24 38 36 36 39 48 48 52 49 49 53 36 36 39 49 49 53 37 37 40 37 37 40 49 49 53 50 50 54 37 37 40 50 50 54 38 38 41 38 38 41 50 50 54 51 51 55 38 38 41 51 51 55 39 39 42 39 39 42 51 51 55 52 52 56 39 39 42 52 52 56 40 40 43 40 40 43 52 52 56 53 53 57 40 40 43 53 53 57 41 41 44 41 41 44 53 53 57 54 54 58 41 41 44 54 54 58 42 42 45 42 42 45 54 54 58 55 55 59 42 42 45 55 55 59 43 43 46 43 43 46 55 55 59 56 56 60 43 43 46 56 56 60 44 44 47 44 44 47 56 56 60 57 57 61 44 44 47 57 57 61 45 45 48 45 45 48 57 57 61 58 58 62 45 45 48 58 58 62 46 46 49 46 46 49 58 58 62 59 59 63 46 46 49 59 59 63 47 47 50 47 47 50 59 59 63 48 48 64 47 47 50 48 48 64 36 36 51 48 48 52 60 60 65 61 61 66 48 48 52 61 61 66 49 49 53 49 49 53 61 61 66 62 62 67 49 49 53 62 62 67 50 50 54 50 50 54 62 62 67 63 63 68 50 50 54 63 63 68 51 51 55 51 51 55 63 63 68 64 64 69 51 51 55 64 64 69 52 52 56 52 52 56 64 64 69 65 65 70 52 52 56 65 65 70 53 53 57 53 53 57 65 65 70 66 66 71 53 53 57 66 66 71 54 54 58 54 54 58 66 66 71 67 67 72 54 54 58 67 67 72 55 55 59 55 55 59 67 67 72 68 68 73 55 55 59 68 68 73 56 56 60 56 56 60 68 68 73 69 69 74 56 56 60 69 69 74 57 57 61 57 57 61 69 69 74 70 70 75 57 57 61 70 70 75 58 58 62 58 58 62 70 70 75 71 71 76 58 58 62 71 71 76 59 59 63 59 59 63 71 71 76 60 60 77 59 59 63 60 60 77 48 48 64 60 60 65 72 72 78 73 73 79 60 60 65 73 73 79 61 61 66 61 61 66 73 73 79 74 74 80 61 61 66 74 74 80 62 62 67 62 62 67 74 74 80 75 75 81 62 62 67 75 75 81 63 63 68 63 63 68 75 75 81 76 76 82 63 63 68 76 76 82 64 64 69 64 64 69 76 76 82 77 77 83 64 64 69 77 77 83 65 65 70 65 65 70 77 77 83 78 78 84 65 65 70 78 78 84 66 66 71 66 66 71 78 78 84 79 79 85 66 66 71 79 79 85 67 67 72 67 67 72 79 79 85 80 80 86 67 67 72 80 80 86 68 68 73 68 68 73 80 80 86 81 81 87 68 68 73 81 81 87 69 69 74 69 69 74 81 81 87 82 82 88 69 69 74 82 82 88 70 70 75 70 70 75 82 82 88 83 83 89 70 70 75 83 83 89 71 71 76 71 71 76 83 83 89 72 72 90 71 71 76 72 72 90 60 60 77 72 72 78 84 84 91 85 85 92 72 72 78 85 85 92 73 73 79 73 73 79 85 85 92 86 86 93 73 73 79 86 86 93 74 74 80 74 74 80 86 86 93 87 87 94 74 74 80 87 87 94 75 75 81 75 75 81 87 87 94 88 88 95 75 75 81 88 88 95 76 76 82 76 76 82 88 88 95 89 89 96 76 76 82 89 89 96 77 77 83 77 77 83 89 89 96 90 90 97 77 77 83 90 90 97 78 78 84 78 78 84 90 90 97 91 91 98 78 78 84 91 91 98 79 79 85 79 79 85 91 91 98 92 92 99 79 79 85 92 92 99 80 80 86 80 80 86 92 92 99 93 93 100 80 80 86 93 93 100 81 81 87 81 81 87 93 93 100 94 94 101 81 81 87 94 94 101 82 82 88 82 82 88 94 94 101 95 95 102 82 82 88 95 95 102 83 83 89 83 83 89 95 95 102 84 84 103 83 83 89 84 84 103 72 72 90 84 84 91 96 96 104 97 97 105 84 84 91 97 97 105 85 85 92 85 85 92 97 97 105 98 98 106 85 85 92 98 98 106 86 86 93 86 86 93 98 98 106 99 99 107 86 86 93 99 99 107 87 87 94 87 87 94 99 99 107 100 100 108 87 87 94 100 100 108 88 88 95 88 88 95 100 100 108 101 101 109 88 88 95 101 101 109 89 89 96 89 89 96 101 101 109 102 102 110 89 89 96 102 102 110 90 90 97 90 90 97 102 102 110 103 103 111 90 90 97 103 103 111 91 91 98 91 91 98 103 103 111 104 104 112 91 91 98 104 104 112 92 92 99 92 92 99 104 104 112 105 105 113 92 92 99 105 105 113 93 93 100 93 93 100 105 105 113 106 106 114 93 93 100 106 106 114 94 94 101 94 94 101 106 106 114 107 107 115 94 94 101 107 107 115 95 95 102 95 95 102 107 107 115 96 96 116 95 95 102 96 96 116 84 84 103 96 96 104 108 108 117 109 109 118 96 96 104 109 109 118 97 97 105 97 97 105 109 109 118 110 110 119 97 97 105 110 110 119 98 98 106 98 98 106 110 110 119 111 111 120 98 98 106 111 111 120 99 99 107 99 99 107 111 111 120 112 112 121 99 99 107 112 112 121 100 100 108 100 100 108 112 112 121 113 113 122 100 100 108 113 113 122 101 101 109 101 101 109 113 113 122 114 114 123 101 101 109 114 114 123 102 102 110 102 102 110 114 114 123 115 115 124 102 102 110 115 115 124 103 103 111 103 103 111 115 115 124 116 116 125 103 103 111 116 116 125 104 104 112 104 104 112 116 116 125 117 117 126 104 104 112 117 117 126 105 105 113 105 105 113 117 117 126 118 118 127 105 105 113 118 118 127 106 106 114 106 106 114 118 118 127 119 119 128 106 106 114 119 119 128 107 107 115 107 107 115 119 119 128 108 108 129 107 107 115 108 108 129 96 96 116 108 108 117 120 120 130 121 121 131 108 108 117 121 121 131 109 109 118 109 109 118 121 121 131 122 122 132 109 109 118 122 122 132 110 110 119 110 110 119 122 122 132 123 123 133 110 110 119 123 123 133 111 111 120 111 111 120 123 123 133 124 124 134 111 111 120 124 124 134 112 112 121 112 112 121 124 124 134 125 125 135 112 112 121 125 125 135 113 113 122 113 113 122 125 125 135 126 126 136 113 113 122 126 126 136 114 114 123 114 114 123 126 126 136 127 127 137 114 114 123 127 127 137 115 115 124 115 115 124 127 127 137 128 128 138 115 115 124 128 128 138 116 116 125 116 116 125 128 128 138 129 129 139 116 116 125 129 129 139 117 117 126 117 117 126 129 129 139 130 130 140 117 117 126 130 130 140 118 118 127 118 118 127 130 130 140 131 131 141 118 118 127 131 131 141 119 119 128 119 119 128 131 131 141 120 120 142 119 119 128 120 120 142 108 108 129 120 120 130 132 132 143 133 133 144 120 120 130 133 133 144 121 121 131 121 121 131 133 133 144 134 134 145 121 121 131 134 134 145 122 122 132 122 122 132 134 134 145 135 135 146 122 122 132 135 135 146 123 123 133 123 123 133 135 135 146 136 136 147 123 123 133 136 136 147 124 124 134 124 124 134 136 136 147 137 137 148 124 124 134 137 137 148 125 125 135 125 125 135 137 137 148 138 138 149 125 125 135 138 138 149 126 126 136 126 126 136 138 138 149 139 139 150 126 126 136 139 139 150 127 127 137 127 127 137 139 139 150 140 140 151 127 127 137 140 140 151 128 128 138 128 128 138 140 140 151 141 141 152 128 128 138 141 141 152 129 129 139 129 129 139 141 141 152 142 142 153 129 129 139 142 142 153 130 130 140 130 130 140 142 142 153 143 143 154 130 130 140 143 143 154 131 131 141 131 131 141 143 143 154 132 132 155 131 131 141 132 132 155 120 120 142 132 132 143 144 144 156 145 145 157 132 132 143 145 145 157 133 133 144 133 133 144 145 145 157 146 146 158 133 133 144 146 146 158 134 134 145 134 134 145 146 146 158 147 147 159 134 134 145 147 147 159 135 135 146 135 135 146 147 147 159 148 148 160 135 135 146 148 148 160 136 136 147 136 136 147 148 148 160 149 149 161 136 136 147 149 149 161 137 137 148 137 137 148 149 149 161 150 150 162 137 137 148 150 150 162 138 138 149 138 138 149 150 150 162 151 151 163 138 138 149 151 151 163 139 139 150 139 139 150 151 151 163 152 152 164 139 139 150 152 152 164 140 140 151 140 140 151 152 152 164 153 153 165 140 140 151 153 153 165 141 141 152 141 141 152 153 153 165 154 154 166 141 141 152 154 154 166 142 142 153 142 142 153 154 154 166 155 155 167 142 142 153 155 155 167 143 143 154 143 143 154 155 155 167 144 144 168 143 143 154 144 144 168 132 132 155 144 144 156 156 156 169 157 157 170 144 144 156 157 157 170 145 145 157 145 145 157 157 157 170 158 158 171 145 145 157 158 158 171 146 146 158 146 146 158 158 158 171 159 159 172 146 146 158 159 159 172 147 147 159 147 147 159 159 159 172 160 160 173 147 147 159 160 160 173 148 148 160 148 148 160 160 160 173 161 161 174 148 148 160 161 161 174 149 149 161 149 149 161 161 161 174 162 162 175 149 149 161 162 162 175 150 150 162 150 150 162 162 162 175 163 163 176 150 150 162 163 163 176 151 151 163 151 151 163 163 163 176 164 164 177 151 151 163 164 164 177 152 152 164 152 152 164 164 164 177 165 165 178 152 152 164 165 165 178 153 153 165 153 153 165 165 165 178 166 166 179 153 153 165 166 166 179 154 154 166 154 154 166 166 166 179 167 167 180 154 154 166 167 167 180 155 155 167 155 155 167 167 167 180 156 156 181 155 155 167 156 156 181 144 144 168 156 156 169 168 168 182 169 169 183 156 156 169 169 169 183 157 157 170 157 157 170 169 169 183 170 170 184 157 157 170 170 170 184 158 158 171 158 158 171 170 170 184 171 171 185 158 158 171 171 171 185 159 159 172 159 159 172 171 171 185 172 172 186 159 159 172 172 172 186 160 160 173 160 160 173 172 172 186 173 173 187 160 160 173 173 173 187 161 161 174 161 161 174 173 173 187 174 174 188 161 161 174 174 174 188 162 162 175 162 162 175 174 174 188 175 175 189 162 162 175 175 175 189 163 163 176 163 163 176 175 175 189 176 176 190 163 163 176 176 176 190 164 164 177 164 164 177 176 176 190 177 177 191 164 164 177 177 177 191 165 165 178 165 165 178 177 177 191 178 178 192 165 165 178 178 178 192 166 166 179 166 166 179 178 178 192 179 179 193 166 166 179 179 179 193 167 167 180 167 167 180 179 179 193 168 168 194 167 167 180 168 168 194 156 156 181 168 168 182 180 180 195 181 181 196 168 168 182 181 181 196 169 169 183 169 169 183 181 181 196 182 182 197 169 169 183 182 182 197 170 170 184 170 170 184 182 182 197 183 183 198 170 170 184 183 183 198 171 171 185 171 171 185 183 183 198 184 184 199 171 171 185 184 184 199 172 172 186 172 172 186 184 184 199 185 185 200 172 172 186 185 185 200 173 173 187 173 173 187 185 185 200 186 186 201 173 173 187 186 186 201 174 174 188 174 174 188 186 186 201 187 187 202 174 174 188 187 187 202 175 175 189 175 175 189 187 187 202 188 188 203 175 175 189 188 188 203 176 176 190 176 176 190 188 188 203 189 189 204 176 176 190 189 189 204 177 177 191 177 177 191 189 189 204 190 190 205 177 177 191 190 190 205 178 178 192 178 178 192 190 190 205 191 191 206 178 178 192 191 191 206 179 179 193 179 179 193 191 191 206 180 180 207 179 179 193 180 180 207 168 168 194 180 180 195 192 192 208 193 193 209 180 180 195 193 193 209 181 181 196 181 181 196 193 193 209 194 194 210 181 181 196 194 194 210 182 182 197 182 182 197 194 194 210 195 195 211 182 182 197 195 195 211 183 183 198 183 183 198 195 195 211 196 196 212 183 183 198 196 196 212 184 184 199 184 184 199 196 196 212 197 197 213 184 184 199 197 197 213 185 185 200 185 185 200 197 197 213 198 198 214 185 185 200 198 198 214 186 186 201 186 186 201 198 198 214 199 199 215 186 186 201 199 199 215 187 187 202 187 187 202 199 199 215 200 200 216 187 187 202 200 200 216 188 188 203 188 188 203 200 200 216 201 201 217 188 188 203 201 201 217 189 189 204 189 189 204 201 201 217 202 202 218 189 189 204 202 202 218 190 190 205 190 190 205 202 202 218 203 203 219 190 190 205 203 203 219 191 191 206 191 191 206 203 203 219 192 192 220 191 191 206 192 192 220 180 180 207 192 192 208 204 204 221 205 205 222 192 192 208 205 205 222 193 193 209 193 193 209 205 205 222 206 206 223 193 193 209 206 206 223 194 194 210 194 194 210 206 206 223 207 207 224 194 194 210 207 207 224 195 195 211 195 195 211 207 207 224 208 208 225 195 195 211 208 208 225 196 196 212 196 196 212 208 208 225 209 209 226 196 196 212 209 209 226 197 197 213 197 197 213 209 209 226 210 210 227 197 197 213 210 210 227 198 198 214 198 198 214 210 210 227 211 211 228 198 198 214 211 211 228 199 199 215 199 199 215 211 211 228 212 212 229 199 199 215 212 212 229 200 200 216 200 200 216 212 212 229 213 213 230 200 200 216 213 213 230 201 201 217 201 201 217 213 213 230 214 214 231 201 201 217 214 214 231 202 202 218 202 202 218 214 214 231 215 215 232 202 202 218 215 215 232 203 203 219 203 203 219 215 215 232 204 204 233 203 203 219 204 204 233 192 192 220 204 204 221 216 216 234 217 217 235 204 204 221 217 217 235 205 205 222 205 205 222 217 217 235 218 218 236 205 205 222 218 218 236 206 206 223 206 206 223 218 218 236 219 219 237 206 206 223 219 219 237 207 207 224 207 207 224 219 219 237 220 220 238 207 207 224 220 220 238 208 208 225 208 208 225 220 220 238 221 221 239 208 208 225 221 221 239 209 209 226 209 209 226 221 221 239 222 222 240 209 209 226 222 222 240 210 210 227 210 210 227 222 222 240 223 223 241 210 210 227 223 223 241 211 211 228 211 211 228 223 223 241 224 224 242 211 211 228 224 224 242 212 212 229 212 212 229 224 224 242 225 225 243 212 212 229 225 225 243 213 213 230 213 213 230 225 225 243 226 226 244 213 213 230 226 226 244 214 214 231 214 214 231 226 226 244 227 227 245 214 214 231 227 227 245 215 215 232 215 215 232 227 227 245 216 216 246 215 215 232 216 216 246 204 204 233 216 216 234 228 228 247 229 229 248 216 216 234 229 229 248 217 217 235 217 217 235 229 229 248 230 230 249 217 217 235 230 230 249 218 218 236 218 218 236 230 230 249 231 231 250 218 218 236 231 231 250 219 219 237 219 219 237 231 231 250 232 232 251 219 219 237 232 232 251 220 220 238 220 220 238 232 232 251 233 233 252 220 220 238 233 233 252 221 221 239 221 221 239 233 233 252 234 234 253 221 221 239 234 234 253 222 222 240 222 222 240 234 234 253 235 235 254 222 222 240 235 235 254 223 223 241 223 223 241 235 235 254 236 236 255 223 223 241 236 236 255 224 224 242 224 224 242 236 236 255 237 237 256 224 224 242 237 237 256 225 225 243 225 225 243 237 237 256 238 238 257 225 225 243 238 238 257 226 226 244 226 226 244 238 238 257 239 239 258 226 226 244 239 239 258 227 227 245 227 227 245 239 239 258 228 228 259 227 227 245 228 228 259 216 216 246 228 228 247 240 240 260 241 241 261 228 228 247 241 241 261 229 229 248 229 229 248 241 241 261 242 242 262 229 229 248 242 242 262 230 230 249 230 230 249 242 242 262 243 243 263 230 230 249 243 243 263 231 231 250 231 231 250 243 243 263 244 244 264 231 231 250 244 244 264 232 232 251 232 232 251 244 244 264 245 245 265 232 232 251 245 245 265 233 233 252 233 233 252 245 245 265 246 246 266 233 233 252 246 246 266 234 234 253 234 234 253 246 246 266 247 247 267 234 234 253 247 247 267 235 235 254 235 235 254 247 247 267 248 248 268 235 235 254 248 248 268 236 236 255 236 236 255 248 248 268 249 249 269 236 236 255 249 249 269 237 237 256 237 237 256 249 249 269 250 250 270 237 237 256 250 250 270 238 238 257 238 238 257 250 250 270 251 251 271 238 238 257 251 251 271 239 239 258 239 239 258 251 251 271 240 240 272 239 239 258 240 240 272 228 228 259 240 240 260 252 252 273 253 253 274 240 240 260 253 253 274 241 241 261 241 241 261 253 253 274 254 254 275 241 241 261 254 254 275 242 242 262 242 242 262 254 254 275 255 255 276 242 242 262 255 255 276 243 243 263 243 243 263 255 255 276 256 256 277 243 243 263 256 256 277 244 244 264 244 244 264 256 256 277 257 257 278 244 244 264 257 257 278 245 245 265 245 245 265 257 257 278 258 258 279 245 245 265 258 258 279 246 246 266 246 246 266 258 258 279 259 259 280 246 246 266 259 259 280 247 247 267 247 247 267 259 259 280 260 260 281 247 247 267 260 260 281 248 248 268 248 248 268 260 260 281 261 261 282 248 248 268 261 261 282 249 249 269 249 249 269 261 261 282 262 262 283 249 249 269 262 262 283 250 250 270 250 250 270 262 262 283 263 263 284 250 250 270 263 263 284 251 251 271 251 251 271 263 263 284 252 252 285 251 251 271 252 252 285 240 240 272 252 252 273 264 264 286 265 265 287 252 252 273 265 265 287 253 253 274 253 253 274 265 265 287 266 266 288 253 253 274 266 266 288 254 254 275 254 254 275 266 266 288 267 267 289 254 254 275 267 267 289 255 255 276 255 255 276 267 267 289 268 268 290 255 255 276 268 268 290 256 256 277 256 256 277 268 268 290 269 269 291 256 256 277 269 269 291 257 257 278 257 257 278 269 269 291 270 270 292 257 257 278 270 270 292 258 258 279 258 258 279 270 270 292 271 271 293 258 258 279 271 271 293 259 259 280 259 259 280 271 271 293 272 272 294 259 259 280 272 272 294 260 260 281 260 260 281 272 272 294 273 273 295 260 260 281 273 273 295 261 261 282 261 261 282 273 273 295 274 274 296 261 261 282 274 274 296 262 262 283 262 262 283 274 274 296 275 275 297 262 262 283 275 275 297 263 263 284 263 263 284 275 275 297 264 264 298 263 263 284 264 264 298 252 252 285 264 264 286 276 276 299 277 277 300 264 264 286 277 277 300 265 265 287 265 265 287 277 277 300 278 278 301 265 265 287 278 278 301 266 266 288 266 266 288 278 278 301 279 279 302 266 266 288 279 279 302 267 267 289 267 267 289 279 279 302 280 280 303 267 267 289 280 280 303 268 268 290 268 268 290 280 280 303 281 281 304 268 268 290 281 281 304 269 269 291 269 269 291 281 281 304 282 282 305 269 269 291 282 282 305 270 270 292 270 270 292 282 282 305 283 283 306 270 270 292 283 283 306 271 271 293 271 271 293 283 283 306 284 284 307 271 271 293 284 284 307 272 272 294 272 272 294 284 284 307 285 285 308 272 272 294 285 285 308 273 273 295 273 273 295 285 285 308 286 286 309 273 273 295 286 286 309 274 274 296 274 274 296 286 286 309 287 287 310 274 274 296 287 287 310 275 275 297 275 275 297 287 287 310 276 276 311 275 275 297 276 276 311 264 264 298 276 276 299 288 288 312 289 289 313 276 276 299 289 289 313 277 277 300 277 277 300 289 289 313 290 290 314 277 277 300 290 290 314 278 278 301 278 278 301 290 290 314 291 291 315 278 278 301 291 291 315 279 279 302 279 279 302 291 291 315 292 292 316 279 279 302 292 292 316 280 280 303 280 280 303 292 292 316 293 293 317 280 280 303 293 293 317 281 281 304 281 281 304 293 293 317 294 294 318 281 281 304 294 294 318 282 282 305 282 282 305 294 294 318 295 295 319 282 282 305 295 295 319 283 283 306 283 283 306 295 295 319 296 296 320 283 283 306 296 296 320 284 284 307 284 284 307 296 296 320 297 297 321 284 284 307 297 297 321 285 285 308 285 285 308 297 297 321 298 298 322 285 285 308 298 298 322 286 286 309 286 286 309 298 298 322 299 299 323 286 286 309 299 299 323 287 287 310 287 287 310 299 299 323 288 288 324 287 287 310 288 288 324 276 276 311 288 288 312 300 300 325 301 301 326 288 288 312 301 301 326 289 289 313 289 289 313 301 301 326 302 302 327 289 289 313 302 302 327 290 290 314 290 290 314 302 302 327 303 303 328 290 290 314 303 303 328 291 291 315 291 291 315 303 303 328 304 304 329 291 291 315 304 304 329 292 292 316 292 292 316 304 304 329 305 305 330 292 292 316 305 305 330 293 293 317 293 293 317 305 305 330 306 306 331 293 293 317 306 306 331 294 294 318 294 294 318 306 306 331 307 307 332 294 294 318 307 307 332 295 295 319 295 295 319 307 307 332 308 308 333 295 295 319 308 308 333 296 296 320 296 296 320 308 308 333 309 309 334 296 296 320 309 309 334 297 297 321 297 297 321 309 309 334 310 310 335 297 297 321 310 310 335 298 298 322 298 298 322 310 310 335 311 311 336 298 298 322 311 311 336 299 299 323 299 299 323 311 311 336 300 300 337 299 299 323 300 300 337 288 288 324 300 300 325 312 312 338 313 313 339 300 300 325 313 313 339 301 301 326 301 301 326 313 313 339 314 314 340 301 301 326 314 314 340 302 302 327 302 302 327 314 314 340 315 315 341 302 302 327 315 315 341 303 303 328 303 303 328 315 315 341 316 316 342 303 303 328 316 316 342 304 304 329 304 304 329 316 316 342 317 317 343 304 304 329 317 317 343 305 305 330 305 305 330 317 317 343 318 318 344 305 305 330 318 318 344 306 306 331 306 306 331 318 318 344 319 319 345 306 306 331 319 319 345 307 307 332 307 307 332 319 319 345 320 320 346 307 307 332 320 320 346 308 308 333 308 308 333 320 320 346 321 321 347 308 308 333 321 321 347 309 309 334 309 309 334 321 321 347 322 322 348 309 309 334 322 322 348 310 310 335 310 310 335 322 322 348 323 323 349 310 310 335 323 323 349 311 311 336 311 311 336 323 323 349 312 312 350 311 311 336 312 312 350 300 300 337 312 312 338 324 324 351 325 325 352 312 312 338 325 325 352 313 313 339 313 313 339 325 325 352 326 326 353 313 313 339 326 326 353 314 314 340 314 314 340 326 326 353 327 327 354 314 314 340 327 327 354 315 315 341 315 315 341 327 327 354 328 328 355 315 315 341 328 328 355 316 316 342 316 316 342 328 328 355 329 329 356 316 316 342 329 329 356 317 317 343 317 317 343 329 329 356 330 330 357 317 317 343 330 330 357 318 318 344 318 318 344 330 330 357 331 331 358 318 318 344 331 331 358 319 319 345 319 319 345 331 331 358 332 332 359 319 319 345 332 332 359 320 320 346 320 320 346 332 332 359 333 333 360 320 320 346 333 333 360 321 321 347 321 321 347 333 333 360 334 334 361 321 321 347 334 334 361 322 322 348 322 322 348 334 334 361 335 335 362 322 322 348 335 335 362 323 323 349 323 323 349 335 335 362 324 324 363 323 323 349 324 324 363 312 312 350 324 324 351 336 336 364 337 337 365 324 324 351 337 337 365 325 325 352 325 325 352 337 337 365 338 338 366 325 325 352 338 338 366 326 326 353 326 326 353 338 338 366 339 339 367 326 326 353 339 339 367 327 327 354 327 327 354 339 339 367 340 340 368 327 327 354 340 340 368 328 328 355 328 328 355 340 340 368 341 341 369 328 328 355 341 341 369 329 329 356 329 329 356 341 341 369 342 342 370 329 329 356 342 342 370 330 330 357 330 330 357 342 342 370 343 343 371 330 330 357 343 343 371 331 331 358 331 331 358 343 343 371 344 344 372 331 331 358 344 344 372 332 332 359 332 332 359 344 344 372 345 345 373 332 332 359 345 345 373 333 333 360 333 333 360 345 345 373 346 346 374 333 333 360 346 346 374 334 334 361 334 334 361 346 346 374 347 347 375 334 334 361 347 347 375 335 335 362 335 335 362 347 347 375 336 336 376 335 335 362 336 336 376 324 324 363 336 336 364 348 348 377 349 349 378 336 336 364 349 349 378 337 337 365 337 337 365 349 349 378 350 350 379 337 337 365 350 350 379 338 338 366 338 338 366 350 350 379 351 351 380 338 338 366 351 351 380 339 339 367 339 339 367 351 351 380 352 352 381 339 339 367 352 352 381 340 340 368 340 340 368 352 352 381 353 353 382 340 340 368 353 353 382 341 341 369 341 341 369 353 353 382 354 354 383 341 341 369 354 354 383 342 342 370 342 342 370 354 354 383 355 355 384 342 342 370 355 355 384 343 343 371 343 343 371 355 355 384 356 356 385 343 343 371 356 356 385 344 344 372 344 344 372 356 356 385 357 357 386 344 344 372 357 357 386 345 345 373 345 345 373 357 357 386 358 358 387 345 345 373 358 358 387 346 346 374 346 346 374 358 358 387 359 359 388 346 346 374 359 359 388 347 347 375 347 347 375 359 359 388 348 348 389 347 347 375 348 348 389 336 336 376 348 348 377 360 360 390 361 361 391 348 348 377 361 361 391 349 349 378 349 349 378 361 361 391 362 362 392 349 349 378 362 362 392 350 350 379 350 350 379 362 362 392 363 363 393 350 350 379 363 363 393 351 351 380 351 351 380 363 363 393 364 364 394 351 351 380 364 364 394 352 352 381 352 352 381 364 364 394 365 365 395 352 352 381 365 365 395 353 353 382 353 353 382 365 365 395 366 366 396 353 353 382 366 366 396 354 354 383 354 354 383 366 366 396 367 367 397 354 354 383 367 367 397 355 355 384 355 355 384 367 367 397 368 368 398 355 355 384 368 368 398 356 356 385 356 356 385 368 368 398 369 369 399 356 356 385 369 369 399 357 357 386 357 357 386 369 369 399 370 370 400 357 357 386 370 370 400 358 358 387 358 358 387 370 370 400 371 371 401 358 358 387 371 371 401 359 359 388 359 359 388 371 371 401 360 360 402 359 359 388 360 360 402 348 348 389 360 360 390 372 372 403 373 373 404 360 360 390 373 373 404 361 361 391 361 361 391 373 373 404 374 374 405 361 361 391 374 374 405 362 362 392 362 362 392 374 374 405 375 375 406 362 362 392 375 375 406 363 363 393 363 363 393 375 375 406 376 376 407 363 363 393 376 376 407 364 364 394 364 364 394 376 376 407 377 377 408 364 364 394 377 377 408 365 365 395 365 365 395 377 377 408 378 378 409 365 365 395 378 378 409 366 366 396 366 366 396 378 378 409 379 379 410 366 366 396 379 379 410 367 367 397 367 367 397 379 379 410 380 380 411 367 367 397 380 380 411 368 368 398 368 368 398 380 380 411 381 381 412 368 368 398 381 381 412 369 369 399 369 369 399 381 381 412 382 382 413 369 369 399 382 382 413 370 370 400 370 370 400 382 382 413 383 383 414 370 370 400 383 383 414 371 371 401 371 371 401 383 383 414 372 372 415 371 371 401 372 372 415 360 360 402 372 372 403 384 384 416 385 385 417 372 372 403 385 385 417 373 373 404 373 373 404 385 385 417 386 386 418 373 373 404 386 386 418 374 374 405 374 374 405 386 386 418 387 387 419 374 374 405 387 387 419 375 375 406 375 375 406 387 387 419 388 388 420 375 375 406 388 388 420 376 376 407 376 376 407 388 388 420 389 389 421 376 376 407 389 389 421 377 377 408 377 377 408 389 389 421 390 390 422 377 377 408 390 390 422 378 378 409 378 378 409 390 390 422 391 391 423 378 378 409 391 391 423 379 379 410 379 379 410 391 391 423 392 392 424 379 379 410 392 392 424 380 380 411 380 380 411 392 392 424 393 393 425 380 380 411 393 393 425 381 381 412 381 381 412 393 393 425 394 394 426 381 381 412 394 394 426 382 382 413 382 382 413 394 394 426 395 395 427 382 382 413 395 395 427 383 383 414 383 383 414 395 395 427 384 384 428 383 383 414 384 384 428 372 372 415 384 384 416 396 396 429 397 397 430 384 384 416 397 397 430 385 385 417 385 385 417 397 397 430 398 398 431 385 385 417 398 398 431 386 386 418 386 386 418 398 398 431 399 399 432 386 386 418 399 399 432 387 387 419 387 387 419 399 399 432 400 400 433 387 387 419 400 400 433 388 388 420 388 388 420 400 400 433 401 401 434 388 388 420 401 401 434 389 389 421 389 389 421 401 401 434 402 402 435 389 389 421 402 402 435 390 390 422 390 390 422 402 402 435 403 403 436 390 390 422 403 403 436 391 391 423 391 391 423 403 403 436 404 404 437 391 391 423 404 404 437 392 392 424 392 392 424 404 404 437 405 405 438 392 392 424 405 405 438 393 393 425 393 393 425 405 405 438 406 406 439 393 393 425 406 406 439 394 394 426 394 394 426 406 406 439 407 407 440 394 394 426 407 407 440 395 395 427 395 395 427 407 407 440 396 396 441 395 395 427 396 396 441 384 384 428 396 396 429 408 408 442 409 409 443 396 396 429 409 409 443 397 397 430 397 397 430 409 409 443 410 410 444 397 397 430 410 410 444 398 398 431 398 398 431 410 410 444 411 411 445 398 398 431 411 411 445 399 399 432 399 399 432 411 411 445 412 412 446 399 399 432 412 412 446 400 400 433 400 400 433 412 412 446 413 413 447 400 400 433 413 413 447 401 401 434 401 401 434 413 413 447 414 414 448 401 401 434 414 414 448 402 402 435 402 402 435 414 414 448 415 415 449 402 402 435 415 415 449 403 403 436 403 403 436 415 415 449 416 416 450 403 403 436 416 416 450 404 404 437 404 404 437 416 416 450 417 417 451 404 404 437 417 417 451 405 405 438 405 405 438 417 417 451 418 418 452 405 405 438 418 418 452 406 406 439 406 406 439 418 418 452 419 419 453 406 406 439 419 419 453 407 407 440 407 407 440 419 419 453 408 408 454 407 407 440 408 408 454 396 396 441 408 408 442 420 420 455 421 421 456 408 408 442 421 421 456 409 409 443 409 409 443 421 421 456 422 422 457 409 409 443 422 422 457 410 410 444 410 410 444 422 422 457 423 423 458 410 410 444 423 423 458 411 411 445 411 411 445 423 423 458 424 424 459 411 411 445 424 424 459 412 412 446 412 412 446 424 424 459 425 425 460 412 412 446 425 425 460 413 413 447 413 413 447 425 425 460 426 426 461 413 413 447 426 426 461 414 414 448 414 414 448 426 426 461 427 427 462 414 414 448 427 427 462 415 415 449 415 415 449 427 427 462 428 428 463 415 415 449 428 428 463 416 416 450 416 416 450 428 428 463 429 429 464 416 416 450 429 429 464 417 417 451 417 417 451 429 429 464 430 430 465 417 417 451 430 430 465 418 418 452 418 418 452 430 430 465 431 431 466 418 418 452 431 431 466 419 419 453 419 419 453 431 431 466 420 420 467 419 419 453 420 420 467 408 408 454 420 420 455 432 432 468 433 433 469 420 420 455 433 433 469 421 421 456 421 421 456 433 433 469 434 434 470 421 421 456 434 434 470 422 422 457 422 422 457 434 434 470 435 435 471 422 422 457 435 435 471 423 423 458 423 423 458 435 435 471 436 436 472 423 423 458 436 436 472 424 424 459 424 424 459 436 436 472 437 437 473 424 424 459 437 437 473 425 425 460 425 425 460 437 437 473 438 438 474 425 425 460 438 438 474 426 426 461 426 426 461 438 438 474 439 439 475 426 426 461 439 439 475 427 427 462 427 427 462 439 439 475 440 440 476 427 427 462 440 440 476 428 428 463 428 428 463 440 440 476 441 441 477 428 428 463 441 441 477 429 429 464 429 429 464 441 441 477 442 442 478 429 429 464 442 442 478 430 430 465 430 430 465 442 442 478 443 443 479 430 430 465 443 443 479 431 431 466 431 431 466 443 443 479 432 432 480 431 431 466 432 432 480 420 420 467 432 432 468 444 444 481 445 445 482 432 432 468 445 445 482 433 433 469 433 433 469 445 445 482 446 446 483 433 433 469 446 446 483 434 434 470 434 434 470 446 446 483 447 447 484 434 434 470 447 447 484 435 435 471 435 435 471 447 447 484 448 448 485 435 435 471 448 448 485 436 436 472 436 436 472 448 448 485 449 449 486 436 436 472 449 449 486 437 437 473 437 437 473 449 449 486 450 450 487 437 437 473 450 450 487 438 438 474 438 438 474 450 450 487 451 451 488 438 438 474 451 451 488 439 439 475 439 439 475 451 451 488 452 452 489 439 439 475 452 452 489 440 440 476 440 440 476 452 452 489 453 453 490 440 440 476 453 453 490 441 441 477 441 441 477 453 453 490 454 454 491 441 441 477 454 454 491 442 442 478 442 442 478 454 454 491 455 455 492 442 442 478 455 455 492 443 443 479 443 443 479 455 455 492 444 444 493 443 443 479 444 444 493 432 432 480 444 444 481 456 456 494 457 457 495 444 444 481 457 457 495 445 445 482 445 445 482 457 457 495 458 458 496 445 445 482 458 458 496 446 446 483 446 446 483 458 458 496 459 459 497 446 446 483 459 459 497 447 447 484 447 447 484 459 459 497 460 460 498 447 447 484 460 460 498 448 448 485 448 448 485 460 460 498 461 461 499 448 448 485 461 461 499 449 449 486 449 449 486 461 461 499 462 462 500 449 449 486 462 462 500 450 450 487 450 450 487 462 462 500 463 463 501 450 450 487 463 463 501 451 451 488 451 451 488 463 463 501 464 464 502 451 451 488 464 464 502 452 452 489 452 452 489 464 464 502 465 465 503 452 452 489 465 465 503 453 453 490 453 453 490 465 465 503 466 466 504 453 453 490 466 466 504 454 454 491 454 454 491 466 466 504 467 467 505 454 454 491 467 467 505 455 455 492 455 455 492 467 467 505 456 456 506 455 455 492 456 456 506 444 444 493 456 456 494 468 468 507 469 469 508 456 456 494 469 469 508 457 457 495 457 457 495 469 469 508 470 470 509 457 457 495 470 470 509 458 458 496 458 458 496 470 470 509 471 471 510 458 458 496 471 471 510 459 459 497 459 459 497 471 471 510 472 472 511 459 459 497 472 472 511 460 460 498 460 460 498 472 472 511 473 473 512 460 460 498 473 473 512 461 461 499 461 461 499 473 473 512 474 474 513 461 461 499 474 474 513 462 462 500 462 462 500 474 474 513 475 475 514 462 462 500 475 475 514 463 463 501 463 463 501 475 475 514 476 476 515 463 463 501 476 476 515 464 464 502 464 464 502 476 476 515 477 477 516 464 464 502 477 477 516 465 465 503 465 465 503 477 477 516 478 478 517 465 465 503 478 478 517 466 466 504 466 466 504 478 478 517 479 479 518 466 466 504 479 479 518 467 467 505 467 467 505 479 479 518 468 468 519 467 467 505 468 468 519 456 456 506 468 468 507 480 480 520 481 481 521 468 468 507 481 481 521 469 469 508 469 469 508 481 481 521 482 482 522 469 469 508 482 482 522 470 470 509 470 470 509 482 482 522 483 483 523 470 470 509 483 483 523 471 471 510 471 471 510 483 483 523 484 484 524 471 471 510 484 484 524 472 472 511 472 472 511 484 484 524 485 485 525 472 472 511 485 485 525 473 473 512 473 473 512 485 485 525 486 486 526 473 473 512 486 486 526 474 474 513 474 474 513 486 486 526 487 487 527 474 474 513 487 487 527 475 475 514 475 475 514 487 487 527 488 488 528 475 475 514 488 488 528 476 476 515 476 476 515 488 488 528 489 489 529 476 476 515 489 489 529 477 477 516 477 477 516 489 489 529 490 490 530 477 477 516 490 490 530 478 478 517 478 478 517 490 490 530 491 491 531 478 478 517 491 491 531 479 479 518 479 479 518 491 491 531 480 480 532 479 479 518 480 480 532 468 468 519 480 480 520 492 492 533 493 493 534 480 480 520 493 493 534 481 481 521 481 481 521 493 493 534 494 494 535 481 481 521 494 494 535 482 482 522 482 482 522 494 494 535 495 495 536 482 482 522 495 495 536 483 483 523 483 483 523 495 495 536 496 496 537 483 483 523 496 496 537 484 484 524 484 484 524 496 496 537 497 497 538 484 484 524 497 497 538 485 485 525 485 485 525 497 497 538 498 498 539 485 485 525 498 498 539 486 486 526 486 486 526 498 498 539 499 499 540 486 486 526 499 499 540 487 487 527 487 487 527 499 499 540 500 500 541 487 487 527 500 500 541 488 488 528 488 488 528 500 500 541 501 501 542 488 488 528 501 501 542 489 489 529 489 489 529 501 501 542 502 502 543 489 489 529 502 502 543 490 490 530 490 490 530 502 502 543 503 503 544 490 490 530 503 503 544 491 491 531 491 491 531 503 503 544 492 492 545 491 491 531 492 492 545 480 480 532 492 492 533 504 504 546 505 505 547 492 492 533 505 505 547 493 493 534 493 493 534 505 505 547 506 506 548 493 493 534 506 506 548 494 494 535 494 494 535 506 506 548 507 507 549 494 494 535 507 507 549 495 495 536 495 495 536 507 507 549 508 508 550 495 495 536 508 508 550 496 496 537 496 496 537 508 508 550 509 509 551 496 496 537 509 509 551 497 497 538 497 497 538 509 509 551 510 510 552 497 497 538 510 510 552 498 498 539 498 498 539 510 510 552 511 511 553 498 498 539 511 511 553 499 499 540 499 499 540 511 511 553 512 512 554 499 499 540 512 512 554 500 500 541 500 500 541 512 512 554 513 513 555 500 500 541 513 513 555 501 501 542 501 501 542 513 513 555 514 514 556 501 501 542 514 514 556 502 502 543 502 502 543 514 514 556 515 515 557 502 502 543 515 515 557 503 503 544 503 503 544 515 515 557 504 504 558 503 503 544 504 504 558 492 492 545 504 504 546 516 516 559 517 517 560 504 504 546 517 517 560 505 505 547 505 505 547 517 517 560 518 518 561 505 505 547 518 518 561 506 506 548 506 506 548 518 518 561 519 519 562 506 506 548 519 519 562 507 507 549 507 507 549 519 519 562 520 520 563 507 507 549 520 520 563 508 508 550 508 508 550 520 520 563 521 521 564 508 508 550 521 521 564 509 509 551 509 509 551 521 521 564 522 522 565 509 509 551 522 522 565 510 510 552 510 510 552 522 522 565 523 523 566 510 510 552 523 523 566 511 511 553 511 511 553 523 523 566 524 524 567 511 511 553 524 524 567 512 512 554 512 512 554 524 524 567 525 525 568 512 512 554 525 525 568 513 513 555 513 513 555 525 525 568 526 526 569 513 513 555 526 526 569 514 514 556 514 514 556 526 526 569 527 527 570 514 514 556 527 527 570 515 515 557 515 515 557 527 527 570 516 516 571 515 515 557 516 516 571 504 504 558 516 516 559 528 528 572 529 529 573 516 516 559 529 529 573 517 517 560 517 517 560 529 529 573 530 530 574 517 517 560 530 530 574 518 518 561 518 518 561 530 530 574 531 531 575 518 518 561 531 531 575 519 519 562 519 519 562 531 531 575 532 532 576 519 519 562 532 532 576 520 520 563 520 520 563 532 532 576 533 533 577 520 520 563 533 533 577 521 521 564 521 521 564 533 533 577 534 534 578 521 521 564 534 534 578 522 522 565 522 522 565 534 534 578 535 535 579 522 522 565 535 535 579 523 523 566 523 523 566 535 535 579 536 536 580 523 523 566 536 536 580 524 524 567 524 524 567 536 536 580 537 537 581 524 524 567 537 537 581 525 525 568 525 525 568 537 537 581 538 538 582 525 525 568 538 538 582 526 526 569 526 526 569 538 538 582 539 539 583 526 526 569 539 539 583 527 527 570 527 527 570 539 539 583 528 528 584 527 527 570 528 528 584 516 516 571 528 528 572 540 540 585 541 541 586 528 528 572 541 541 586 529 529 573 529 529 573 541 541 586 542 542 587 529 529 573 542 542 587 530 530 574 530 530 574 542 542 587 543 543 588 530 530 574 543 543 588 531 531 575 531 531 575 543 543 588 544 544 589 531 531 575 544 544 589 532 532 576 532 532 576 544 544 589 545 545 590 532 532 576 545 545 590 533 533 577 533 533 577 545 545 590 546 546 591 533 533 577 546 546 591 534 534 578 534 534 578 546 546 591 547 547 592 534 534 578 547 547 592 535 535 579 535 535 579 547 547 592 548 548 593 535 535 579 548 548 593 536 536 580 536 536 580 548 548 593 549 549 594 536 536 580 549 549 594 537 537 581 537 537 581 549 549 594 550 550 595 537 537 581 550 550 595 538 538 582 538 538 582 550 550 595 551 551 596 538 538 582 551 551 596 539 539 583 539 539 583 551 551 596 540 540 597 539 539 583 540 540 597 528 528 584 540 540 585 552 552 598 553 553 599 540 540 585 553 553 599 541 541 586 541 541 586 553 553 599 554 554 600 541 541 586 554 554 600 542 542 587 542 542 587 554 554 600 555 555 601 542 542 587 555 555 601 543 543 588 543 543 588 555 555 601 556 556 602 543 543 588 556 556 602 544 544 589 544 544 589 556 556 602 557 557 603 544 544 589 557 557 603 545 545 590 545 545 590 557 557 603 558 558 604 545 545 590 558 558 604 546 546 591 546 546 591 558 558 604 559 559 605 546 546 591 559 559 605 547 547 592 547 547 592 559 559 605 560 560 606 547 547 592 560 560 606 548 548 593 548 548 593 560 560 606 561 561 607 548 548 593 561 561 607 549 549 594 549 549 594 561 561 607 562 562 608 549 549 594 562 562 608 550 550 595 550 550 595 562 562 608 563 563 609 550 550 595 563 563 609 551 551 596 551 551 596 563 563 609 552 552 610 551 551 596 552 552 610 540 540 597 552 552 598 564 564 611 565 565 612 552 552 598 565 565 612 553 553 599 553 553 599 565 565 612 566 566 613 553 553 599 566 566 613 554 554 600 554 554 600 566 566 613 567 567 614 554 554 600 567 567 614 555 555 601 555 555 601 567 567 614 568 568 615 555 555 601 568 568 615 556 556 602 556 556 602 568 568 615 569 569 616 556 556 602 569 569 616 557 557 603 557 557 603 569 569 616 570 570 617 557 557 603 570 570 617 558 558 604 558 558 604 570 570 617 571 571 618 558 558 604 571 571 618 559 559 605 559 559 605 571 571 618 572 572 619 559 559 605 572 572 619 560 560 606 560 560 606 572 572 619 573 573 620 560 560 606 573 573 620 561 561 607 561 561 607 573 573 620 574 574 621 561 561 607 574 574 621 562 562 608 562 562 608 574 574 621 575 575 622 562 562 608 575 575 622 563 563 609 563 563 609 575 575 622 564 564 623 563 563 609 564 564 623 552 552 610 564 564 611 576 576 624 577 577 625 564 564 611 577 577 625 565 565 612 565 565 612 577 577 625 578 578 626 565 565 612 578 578 626 566 566 613 566 566 613 578 578 626 579 579 627 566 566 613 579 579 627 567 567 614 567 567 614 579 579 627 580 580 628 567 567 614 580 580 628 568 568 615 568 568 615 580 580 628 581 581 629 568 568 615 581 581 629 569 569 616 569 569 616 581 581 629 582 582 630 569 569 616 582 582 630 570 570 617 570 570 617 582 582 630 583 583 631 570 570 617 583 583 631 571 571 618 571 571 618 583 583 631 584 584 632 571 571 618 584 584 632 572 572 619 572 572 619 584 584 632 585 585 633 572 572 619 585 585 633 573 573 620 573 573 620 585 585 633 586 586 634 573 573 620 586 586 634 574 574 621 574 574 621 586 586 634 587 587 635 574 574 621 587 587 635 575 575 622 575 575 622 587 587 635 576 576 636 575 575 622 576 576 636 564 564 623 576 576 624 588 588 637 589 589 638 576 576 624 589 589 638 577 577 625 577 577 625 589 589 638 590 590 639 577 577 625 590 590 639 578 578 626 578 578 626 590 590 639 591 591 640 578 578 626 591 591 640 579 579 627 579 579 627 591 591 640 592 592 641 579 579 627 592 592 641 580 580 628 580 580 628 592 592 641 593 593 642 580 580 628 593 593 642 581 581 629 581 581 629 593 593 642 594 594 643 581 581 629 594 594 643 582 582 630 582 582 630 594 594 643 595 595 644 582 582 630 595 595 644 583 583 631 583 583 631 595 595 644 596 596 645 583 583 631 596 596 645 584 584 632 584 584 632 596 596 645 597 597 646 584 584 632 597 597 646 585 585 633 585 585 633 597 597 646 598 598 647 585 585 633 598 598 647 586 586 634 586 586 634 598 598 647 599 599 648 586 586 634 599 599 648 587 587 635 587 587 635 599 599 648 588 588 649 587 587 635 588 588 649 576 576 636 588 588 637 600 600 650 601 601 651 588 588 637 601 601 651 589 589 638 589 589 638 601 601 651 602 602 652 589 589 638 602 602 652 590 590 639 590 590 639 602 602 652 603 603 653 590 590 639 603 603 653 591 591 640 591 591 640 603 603 653 604 604 654 591 591 640 604 604 654 592 592 641 592 592 641 604 604 654 605 605 655 592 592 641 605 605 655 593 593 642 593 593 642 605 605 655 606 606 656 593 593 642 606 606 656 594 594 643 594 594 643 606 606 656 607 607 657 594 594 643 607 607 657 595 595 644 595 595 644 607 607 657 608 608 658 595 595 644 608 608 658 596 596 645 596 596 645 608 608 658 609 609 659 596 596 645 609 609 659 597 597 646 597 597 646 609 609 659 610 610 660 597 597 646 610 610 660 598 598 647 598 598 647 610 610 660 611 611 661 598 598 647 611 611 661 599 599 648 599 599 648 611 611 661 600 600 662 599 599 648 600 600 662 588 588 649 600 600 650 612 612 663 613 613 664 600 600 650 613 613 664 601 601 651 601 601 651 613 613 664 614 614 665 601 601 651 614 614 665 602 602 652 602 602 652 614 614 665 615 615 666 602 602 652 615 615 666 603 603 653 603 603 653 615 615 666 616 616 667 603 603 653 616 616 667 604 604 654 604 604 654 616 616 667 617 617 668 604 604 654 617 617 668 605 605 655 605 605 655 617 617 668 618 618 669 605 605 655 618 618 669 606 606 656 606 606 656 618 618 669 619 619 670 606 606 656 619 619 670 607 607 657 607 607 657 619 619 670 620 620 671 607 607 657 620 620 671 608 608 658 608 608 658 620 620 671 621 621 672 608 608 658 621 621 672 609 609 659 609 609 659 621 621 672 622 622 673 609 609 659 622 622 673 610 610 660 610 610 660 622 622 673 623 623 674 610 610 660 623 623 674 611 611 661 611 611 661 623 623 674 612 612 675 611 611 661 612 612 675 600 600 662 612 612 663 624 624 676 625 625 677 612 612 663 625 625 677 613 613 664 613 613 664 625 625 677 626 626 678 613 613 664 626 626 678 614 614 665 614 614 665 626 626 678 627 627 679 614 614 665 627 627 679 615 615 666 615 615 666 627 627 679 628 628 680 615 615 666 628 628 680 616 616 667 616 616 667 628 628 680 629 629 681 616 616 667 629 629 681 617 617 668 617 617 668 629 629 681 630 630 682 617 617 668 630 630 682 618 618 669 618 618 669 630 630 682 631 631 683 618 618 669 631 631 683 619 619 670 619 619 670 631 631 683 632 632 684 619 619 670 632 632 684 620 620 671 620 620 671 632 632 684 633 633 685 620 620 671 633 633 685 621 621 672 621 621 672 633 633 685 634 634 686 621 621 672 634 634 686 622 622 673 622 622 673 634 634 686 635 635 687 622 622 673 635 635 687 623 623 674 623 623 674 635 635 687 624 624 688 623 623 674 624 624 688 612 612 675 624 624 676 636 636 689 637 637 690 624 624 676 637 637 690 625 625 677 625 625 677 637 637 690 638 638 691 625 625 677 638 638 691 626 626 678 626 626 678 638 638 691 639 639 692 626 626 678 639 639 692 627 627 679 627 627 679 639 639 692 640 640 693 627 627 679 640 640 693 628 628 680 628 628 680 640 640 693 641 641 694 628 628 680 641 641 694 629 629 681 629 629 681 641 641 694 642 642 695 629 629 681 642 642 695 630 630 682 630 630 682 642 642 695 643 643 696 630 630 682 643 643 696 631 631 683 631 631 683 643 643 696 644 644 697 631 631 683 644 644 697 632 632 684 632 632 684 644 644 697 645 645 698 632 632 684 645 645 698 633 633 685 633 633 685 645 645 698 646 646 699 633 633 685 646 646 699 634 634 686 634 634 686 646 646 699 647 647 700 634 634 686 647 647 700 635 635 687 635 635 687 647 647 700 636 636 701 635 635 687 636 636 701 624 624 688 636 636 689 648 648 702 649 649 703 636 636 689 649 649 703 637 637 690 637 637 690 649 649 703 650 650 704 637 637 690 650 650 704 638 638 691 638 638 691 650 650 704 651 651 705 638 638 691 651 651 705 639 639 692 639 639 692 651 651 705 652 652 706 639 639 692 652 652 706 640 640 693 640 640 693 652 652 706 653 653 707 640 640 693 653 653 707 641 641 694 641 641 694 653 653 707 654 654 708 641 641 694 654 654 708 642 642 695 642 642 695 654 654 708 655 655 709 642 642 695 655 655 709 643 643 696 643 643 696 655 655 709 656 656 710 643 643 696 656 656 710 644 644 697 644 644 697 656 656 710 657 657 711 644 644 697 657 657 711 645 645 698 645 645 698 657 657 711 658 658 712 645 645 698 658 658 712 646 646 699 646 646 699 658 658 712 659 659 713 646 646 699 659 659 713 647 647 700 647 647 700 659 659 713 648 648 714 647 647 700 648 648 714 636 636 701 648 648 702 660 660 715 661 661 716 648 648 702 661 661 716 649 649 703 649 649 703 661 661 716 662 662 717 649 649 703 662 662 717 650 650 704 650 650 704 662 662 717 663 663 718 650 650 704 663 663 718 651 651 705 651 651 705 663 663 718 664 664 719 651 651 705 664 664 719 652 652 706 652 652 706 664 664 719 665 665 720 652 652 706 665 665 720 653 653 707 653 653 707 665 665 720 666 666 721 653 653 707 666 666 721 654 654 708 654 654 708 666 666 721 667 667 722 654 654 708 667 667 722 655 655 709 655 655 709 667 667 722 668 668 723 655 655 709 668 668 723 656 656 710 656 656 710 668 668 723 669 669 724 656 656 710 669 669 724 657 657 711 657 657 711 669 669 724 670 670 725 657 657 711 670 670 725 658 658 712 658 658 712 670 670 725 671 671 726 658 658 712 671 671 726 659 659 713 659 659 713 671 671 726 660 660 727 659 659 713 660 660 727 648 648 714 660 660 715 672 672 728 673 673 729 660 660 715 673 673 729 661 661 716 661 661 716 673 673 729 674 674 730 661 661 716 674 674 730 662 662 717 662 662 717 674 674 730 675 675 731 662 662 717 675 675 731 663 663 718 663 663 718 675 675 731 676 676 732 663 663 718 676 676 732 664 664 719 664 664 719 676 676 732 677 677 733 664 664 719 677 677 733 665 665 720 665 665 720 677 677 733 678 678 734 665 665 720 678 678 734 666 666 721 666 666 721 678 678 734 679 679 735 666 666 721 679 679 735 667 667 722 667 667 722 679 679 735 680 680 736 667 667 722 680 680 736 668 668 723 668 668 723 680 680 736 681 681 737 668 668 723 681 681 737 669 669 724 669 669 724 681 681 737 682 682 738 669 669 724 682 682 738 670 670 725 670 670 725 682 682 738 683 683 739 670 670 725 683 683 739 671 671 726 671 671 726 683 683 739 672 672 740 671 671 726 672 672 740 660 660 727 672 672 728 684 684 741 685 685 742 672 672 728 685 685 742 673 673 729 673 673 729 685 685 742 686 686 743 673 673 729 686 686 743 674 674 730 674 674 730 686 686 743 687 687 744 674 674 730 687 687 744 675 675 731 675 675 731 687 687 744 688 688 745 675 675 731 688 688 745 676 676 732 676 676 732 688 688 745 689 689 746 676 676 732 689 689 746 677 677 733 677 677 733 689 689 746 690 690 747 677 677 733 690 690 747 678 678 734 678 678 734 690 690 747 691 691 748 678 678 734 691 691 748 679 679 735 679 679 735 691 691 748 692 692 749 679 679 735 692 692 749 680 680 736 680 680 736 692 692 749 693 693 750 680 680 736 693 693 750 681 681 737 681 681 737 693 693 750 694 694 751 681 681 737 694 694 751 682 682 738 682 682 738 694 694 751 695 695 752 682 682 738 695 695 752 683 683 739 683 683 739 695 695 752 684 684 753 683 683 739 684 684 753 672 672 740 684 684 741 696 696 754 697 697 755 684 684 741 697 697 755 685 685 742 685 685 742 697 697 755 698 698 756 685 685 742 698 698 756 686 686 743 686 686 743 698 698 756 699 699 757 686 686 743 699 699 757 687 687 744 687 687 744 699 699 757 700 700 758 687 687 744 700 700 758 688 688 745 688 688 745 700 700 758 701 701 759 688 688 745 701 701 759 689 689 746 689 689 746 701 701 759 702 702 760 689 689 746 702 702 760 690 690 747 690 690 747 702 702 760 703 703 761 690 690 747 703 703 761 691 691 748 691 691 748 703 703 761 704 704 762 691 691 748 704 704 762 692 692 749 692 692 749 704 704 762 705 705 763 692 692 749 705 705 763 693 693 750 693 693 750 705 705 763 706 706 764 693 693 750 706 706 764 694 694 751 694 694 751 706 706 764 707 707 765 694 694 751 707 707 765 695 695 752 695 695 752 707 707 765 696 696 766 695 695 752 696 696 766 684 684 753 696 696 754 708 708 767 709 709 768 696 696 754 709 709 768 697 697 755 697 697 755 709 709 768 710 710 769 697 697 755 710 710 769 698 698 756 698 698 756 710 710 769 711 711 770 698 698 756 711 711 770 699 699 757 699 699 757 711 711 770 712 712 771 699 699 757 712 712 771 700 700 758 700 700 758 712 712 771 713 713 772 700 700 758 713 713 772 701 701 759 701 701 759 713 713 772 714 714 773 701 701 759 714 714 773 702 702 760 702 702 760 714 714 773 715 715 774 702 702 760 715 715 774 703 703 761 703 703 761 715 715 774 716 716 775 703 703 761 716 716 775 704 704 762 704 704 762 716 716 775 717 717 776 704 704 762 717 717 776 705 705 763 705 705 763 717 717 776 718 718 777 705 705 763 718 718 777 706 706 764 706 706 764 718 718 777 719 719 778 706 706 764 719 719 778 707 707 765 707 707 765 719 719 778 708 708 779 707 707 765 708 708 779 696 696 766 708 708 767 720 720 780 721 721 781 708 708 767 721 721 781 709 709 768 709 709 768 721 721 781 722 722 782 709 709 768 722 722 782 710 710 769 710 710 769 722 722 782 723 723 783 710 710 769 723 723 783 711 711 770 711 711 770 723 723 783 724 724 784 711 711 770 724 724 784 712 712 771 712 712 771 724 724 784 725 725 785 712 712 771 725 725 785 713 713 772 713 713 772 725 725 785 726 726 786 713 713 772 726 726 786 714 714 773 714 714 773 726 726 786 727 727 787 714 714 773 727 727 787 715 715 774 715 715 774 727 727 787 728 728 788 715 715 774 728 728 788 716 716 775 716 716 775 728 728 788 729 729 789 716 716 775 729 729 789 717 717 776 717 717 776 729 729 789 730 730 790 717 717 776 730 730 790 718 718 777 718 718 777 730 730 790 731 731 791 718 718 777 731 731 791 719 719 778 719 719 778 731 731 791 720 720 792 719 719 778 720 720 792 708 708 779 720 720 780 732 732 793 733 733 794 720 720 780 733 733 794 721 721 781 721 721 781 733 733 794 734 734 795 721 721 781 734 734 795 722 722 782 722 722 782 734 734 795 735 735 796 722 722 782 735 735 796 723 723 783 723 723 783 735 735 796 736 736 797 723 723 783 736 736 797 724 724 784 724 724 784 736 736 797 737 737 798 724 724 784 737 737 798 725 725 785 725 725 785 737 737 798 738 738 799 725 725 785 738 738 799 726 726 786 726 726 786 738 738 799 739 739 800 726 726 786 739 739 800 727 727 787 727 727 787 739 739 800 740 740 801 727 727 787 740 740 801 728 728 788 728 728 788 740 740 801 741 741 802 728 728 788 741 741 802 729 729 789 729 729 789 741 741 802 742 742 803 729 729 789 742 742 803 730 730 790 730 730 790 742 742 803 743 743 804 730 730 790 743 743 804 731 731 791 731 731 791 743 743 804 732 732 805 731 731 791 732 732 805 720 720 792 732 732 793 744 744 806 745 745 807 732 732 793 745 745 807 733 733 794 733 733 794 745 745 807 746 746 808 733 733 794 746 746 808 734 734 795 734 734 795 746 746 808 747 747 809 734 734 795 747 747 809 735 735 796 735 735 796 747 747 809 748 748 810 735 735 796 748 748 810 736 736 797 736 736 797 748 748 810 749 749 811 736 736 797 749 749 811 737 737 798 737 737 798 749 749 811 750 750 812 737 737 798 750 750 812 738 738 799 738 738 799 750 750 812 751 751 813 738 738 799 751 751 813 739 739 800 739 739 800 751 751 813 752 752 814 739 739 800 752 752 814 740 740 801 740 740 801 752 752 814 753 753 815 740 740 801 753 753 815 741 741 802 741 741 802 753 753 815 754 754 816 741 741 802 754 754 816 742 742 803 742 742 803 754 754 816 755 755 817 742 742 803 755 755 817 743 743 804 743 743 804 755 755 817 744 744 818 743 743 804 744 744 818 732 732 805 744 744 806 756 756 819 757 757 820 744 744 806 757 757 820 745 745 807 745 745 807 757 757 820 758 758 821 745 745 807 758 758 821 746 746 808 746 746 808 758 758 821 759 759 822 746 746 808 759 759 822 747 747 809 747 747 809 759 759 822 760 760 823 747 747 809 760 760 823 748 748 810 748 748 810 760 760 823 761 761 824 748 748 810 761 761 824 749 749 811 749 749 811 761 761 824 762 762 825 749 749 811 762 762 825 750 750 812 750 750 812 762 762 825 763 763 826 750 750 812 763 763 826 751 751 813 751 751 813 763 763 826 764 764 827 751 751 813 764 764 827 752 752 814 752 752 814 764 764 827 765 765 828 752 752 814 765 765 828 753 753 815 753 753 815 765 765 828 766 766 829 753 753 815 766 766 829 754 754 816 754 754 816 766 766 829 767 767 830 754 754 816 767 767 830 755 755 817 755 755 817 767 767 830 756 756 831 755 755 817 756 756 831 744 744 818 756 756 819 768 768 832 769 769 833 756 756 819 769 769 833 757 757 820 757 757 820 769 769 833 770 770 834 757 757 820 770 770 834 758 758 821 758 758 821 770 770 834 771 771 835 758 758 821 771 771 835 759 759 822 759 759 822 771 771 835 772 772 836 759 759 822 772 772 836 760 760 823 760 760 823 772 772 836 773 773 837 760 760 823 773 773 837 761 761 824 761 761 824 773 773 837 774 774 838 761 761 824 774 774 838 762 762 825 762 762 825 774 774 838 775 775 839 762 762 825 775 775 839 763 763 826 763 763 826 775 775 839 776 776 840 763 763 826 776 776 840 764 764 827 764 764 827 776 776 840 777 777 841 764 764 827 777 777 841 765 765 828 765 765 828 777 777 841 778 778 842 765 765 828 778 778 842 766 766 829 766 766 829 778 778 842 779 779 843 766 766 829 779 779 843 767 767 830 767 767 830 779 779 843 768 768 844 767 767 830 768 768 844 756 756 831 768 768 832 780 780 845 781 781 846 768 768 832 781 781 846 769 769 833 769 769 833 781 781 846 782 782 847 769 769 833 782 782 847 770 770 834 770 770 834 782 782 847 783 783 848 770 770 834 783 783 848 771 771 835 771 771 835 783 783 848 784 784 849 771 771 835 784 784 849 772 772 836 772 772 836 784 784 849 785 785 850 772 772 836 785 785 850 773 773 837 773 773 837 785 785 850 786 786 851 773 773 837 786 786 851 774 774 838 774 774 838 786 786 851 787 787 852 774 774 838 787 787 852 775 775 839 775 775 839 787 787 852 788 788 853 775 775 839 788 788 853 776 776 840 776 776 840 788 788 853 789 789 854 776 776 840 789 789 854 777 777 841 777 777 841 789 789 854 790 790 855 777 777 841 790 790 855 778 778 842 778 778 842 790 790 855 791 791 856 778 778 842 791 791 856 779 779 843 779 779 843 791 791 856 780 780 857 779 779 843 780 780 857 768 768 844 780 780 845 792 792 858 793 793 859 780 780 845 793 793 859 781 781 846 781 781 846 793 793 859 794 794 860 781 781 846 794 794 860 782 782 847 782 782 847 794 794 860 795 795 861 782 782 847 795 795 861 783 783 848 783 783 848 795 795 861 796 796 862 783 783 848 796 796 862 784 784 849 784 784 849 796 796 862 797 797 863 784 784 849 797 797 863 785 785 850 785 785 850 797 797 863 798 798 864 785 785 850 798 798 864 786 786 851 786 786 851 798 798 864 799 799 865 786 786 851 799 799 865 787 787 852 787 787 852 799 799 865 800 800 866 787 787 852 800 800 866 788 788 853 788 788 853 800 800 866 801 801 867 788 788 853 801 801 867 789 789 854 789 789 854 801 801 867 802 802 868 789 789 854 802 802 868 790 790 855 790 790 855 802 802 868 803 803 869 790 790 855 803 803 869 791 791 856 791 791 856 803 803 869 792 792 870 791 791 856 792 792 870 780 780 857 792 792 858 804 804 871 805 805 872 792 792 858 805 805 872 793 793 859 793 793 859 805 805 872 806 806 873 793 793 859 806 806 873 794 794 860 794 794 860 806 806 873 807 807 874 794 794 860 807 807 874 795 795 861 795 795 861 807 807 874 808 808 875 795 795 861 808 808 875 796 796 862 796 796 862 808 808 875 809 809 876 796 796 862 809 809 876 797 797 863 797 797 863 809 809 876 810 810 877 797 797 863 810 810 877 798 798 864 798 798 864 810 810 877 811 811 878 798 798 864 811 811 878 799 799 865 799 799 865 811 811 878 812 812 879 799 799 865 812 812 879 800 800 866 800 800 866 812 812 879 813 813 880 800 800 866 813 813 880 801 801 867 801 801 867 813 813 880 814 814 881 801 801 867 814 814 881 802 802 868 802 802 868 814 814 881 815 815 882 802 802 868 815 815 882 803 803 869 803 803 869 815 815 882 804 804 883 803 803 869 804 804 883 792 792 870 804 804 871 816 816 884 817 817 885 804 804 871 817 817 885 805 805 872 805 805 872 817 817 885 818 818 886 805 805 872 818 818 886 806 806 873 806 806 873 818 818 886 819 819 887 806 806 873 819 819 887 807 807 874 807 807 874 819 819 887 820 820 888 807 807 874 820 820 888 808 808 875 808 808 875 820 820 888 821 821 889 808 808 875 821 821 889 809 809 876 809 809 876 821 821 889 822 822 890 809 809 876 822 822 890 810 810 877 810 810 877 822 822 890 823 823 891 810 810 877 823 823 891 811 811 878 811 811 878 823 823 891 824 824 892 811 811 878 824 824 892 812 812 879 812 812 879 824 824 892 825 825 893 812 812 879 825 825 893 813 813 880 813 813 880 825 825 893 826 826 894 813 813 880 826 826 894 814 814 881 814 814 881 826 826 894 827 827 895 814 814 881 827 827 895 815 815 882 815 815 882 827 827 895 816 816 896 815 815 882 816 816 896 804 804 883 816 816 884 828 828 897 829 829 898 816 816 884 829 829 898 817 817 885 817 817 885 829 829 898 830 830 899 817 817 885 830 830 899 818 818 886 818 818 886 830 830 899 831 831 900 818 818 886 831 831 900 819 819 887 819 819 887 831 831 900 832 832 901 819 819 887 832 832 901 820 820 888 820 820 888 832 832 901 833 833 902 820 820 888 833 833 902 821 821 889 821 821 889 833 833 902 834 834 903 821 821 889 834 834 903 822 822 890 822 822 890 834 834 903 835 835 904 822 822 890 835 835 904 823 823 891 823 823 891 835 835 904 836 836 905 823 823 891 836 836 905 824 824 892 824 824 892 836 836 905 837 837 906 824 824 892 837 837 906 825 825 893 825 825 893 837 837 906 838 838 907 825 825 893 838 838 907 826 826 894 826 826 894 838 838 907 839 839 908 826 826 894 839 839 908 827 827 895 827 827 895 839 839 908 828 828 909 827 827 895 828 828 909 816 816 896 828 828 897 840 840 910 841 841 911 828 828 897 841 841 911 829 829 898 829 829 898 841 841 911 842 842 912 829 829 898 842 842 912 830 830 899 830 830 899 842 842 912 843 843 913 830 830 899 843 843 913 831 831 900 831 831 900 843 843 913 844 844 914 831 831 900 844 844 914 832 832 901 832 832 901 844 844 914 845 845 915 832 832 901 845 845 915 833 833 902 833 833 902 845 845 915 846 846 916 833 833 902 846 846 916 834 834 903 834 834 903 846 846 916 847 847 917 834 834 903 847 847 917 835 835 904 835 835 904 847 847 917 848 848 918 835 835 904 848 848 918 836 836 905 836 836 905 848 848 918 849 849 919 836 836 905 849 849 919 837 837 906 837 837 906 849 849 919 850 850 920 837 837 906 850 850 920 838 838 907 838 838 907 850 850 920 851 851 921 838 838 907 851 851 921 839 839 908 839 839 908 851 851 921 840 840 922 839 839 908 840 840 922 828 828 909 840 840 910 852 852 923 853 853 924 840 840 910 853 853 924 841 841 911 841 841 911 853 853 924 854 854 925 841 841 911 854 854 925 842 842 912 842 842 912 854 854 925 855 855 926 842 842 912 855 855 926 843 843 913 843 843 913 855 855 926 856 856 927 843 843 913 856 856 927 844 844 914 844 844 914 856 856 927 857 857 928 844 844 914 857 857 928 845 845 915 845 845 915 857 857 928 858 858 929 845 845 915 858 858 929 846 846 916 846 846 916 858 858 929 859 859 930 846 846 916 859 859 930 847 847 917 847 847 917 859 859 930 860 860 931 847 847 917 860 860 931 848 848 918 848 848 918 860 860 931 861 861 932 848 848 918 861 861 932 849 849 919 849 849 919 861 861 932 862 862 933 849 849 919 862 862 933 850 850 920 850 850 920 862 862 933 863 863 934 850 850 920 863 863 934 851 851 921 851 851 921 863 863 934 852 852 935 851 851 921 852 852 935 840 840 922 852 852 923 864 864 936 865 865 937 852 852 923 865 865 937 853 853 924 853 853 924 865 865 937 866 866 938 853 853 924 866 866 938 854 854 925 854 854 925 866 866 938 867 867 939 854 854 925 867 867 939 855 855 926 855 855 926 867 867 939 868 868 940 855 855 926 868 868 940 856 856 927 856 856 927 868 868 940 869 869 941 856 856 927 869 869 941 857 857 928 857 857 928 869 869 941 870 870 942 857 857 928 870 870 942 858 858 929 858 858 929 870 870 942 871 871 943 858 858 929 871 871 943 859 859 930 859 859 930 871 871 943 872 872 944 859 859 930 872 872 944 860 860 931 860 860 931 872 872 944 873 873 945 860 860 931 873 873 945 861 861 932 861 861 932 873 873 945 874 874 946 861 861 932 874 874 946 862 862 933 862 862 933 874 874 946 875 875 947 862 862 933 875 875 947 863 863 934 863 863 934 875 875 947 864 864 948 863 863 934 864 864 948 852 852 935 864 864 936 876 876 949 877 877 950 864 864 936 877 877 950 865 865 937 865 865 937 877 877 950 878 878 951 865 865 937 878 878 951 866 866 938 866 866 938 878 878 951 879 879 952 866 866 938 879 879 952 867 867 939 867 867 939 879 879 952 880 880 953 867 867 939 880 880 953 868 868 940 868 868 940 880 880 953 881 881 954 868 868 940 881 881 954 869 869 941 869 869 941 881 881 954 882 882 955 869 869 941 882 882 955 870 870 942 870 870 942 882 882 955 883 883 956 870 870 942 883 883 956 871 871 943 871 871 943 883 883 956 884 884 957 871 871 943 884 884 957 872 872 944 872 872 944 884 884 957 885 885 958 872 872 944 885 885 958 873 873 945 873 873 945 885 885 958 886 886 959 873 873 945 886 886 959 874 874 946 874 874 946 886 886 959 887 887 960 874 874 946 887 887 960 875 875 947 875 875 947 887 887 960 876 876 961 875 875 947 876 876 961 864 864 948 876 876 949 888 888 962 889 889 963 876 876 949 889 889 963 877 877 950 877 877 950 889 889 963 890 890 964 877 877 950 890 890 964 878 878 951 878 878 951 890 890 964 891 891 965 878 878 951 891 891 965 879 879 952 879 879 952 891 891 965 892 892 966 879 879 952 892 892 966 880 880 953 880 880 953 892 892 966 893 893 967 880 880 953 893 893 967 881 881 954 881 881 954 893 893 967 894 894 968 881 881 954 894 894 968 882 882 955 882 882 955 894 894 968 895 895 969 882 882 955 895 895 969 883 883 956 883 883 956 895 895 969 896 896 970 883 883 956 896 896 970 884 884 957 884 884 957 896 896 970 897 897 971 884 884 957 897 897 971 885 885 958 885 885 958 897 897 971 898 898 972 885 885 958 898 898 972 886 886 959 886 886 959 898 898 972 899 899 973 886 886 959 899 899 973 887 887 960 887 887 960 899 899 973 888 888 974 887 887 960 888 888 974 876 876 961 888 888 962 900 900 975 901 901 976 888 888 962 901 901 976 889 889 963 889 889 963 901 901 976 902 902 977 889 889 963 902 902 977 890 890 964 890 890 964 902 902 977 903 903 978 890 890 964 903 903 978 891 891 965 891 891 965 903 903 978 904 904 979 891 891 965 904 904 979 892 892 966 892 892 966 904 904 979 905 905 980 892 892 966 905 905 980 893 893 967 893 893 967 905 905 980 906 906 981 893 893 967 906 906 981 894 894 968 894 894 968 906 906 981 907 907 982 894 894 968 907 907 982 895 895 969 895 895 969 907 907 982 908 908 983 895 895 969 908 908 983 896 896 970 896 896 970 908 908 983 909 909 984 896 896 970 909 909 984 897 897 971 897 897 971 909 909 984 910 910 985 897 897 971 910 910 985 898 898 972 898 898 972 910 910 985 911 911 986 898 898 972 911 911 986 899 899 973 899 899 973 911 911 986 900 900 987 899 899 973 900 900 987 888 888 974 900 900 975 912 912 988 913 913 989 900 900 975 913 913 989 901 901 976 901 901 976 913 913 989 914 914 990 901 901 976 914 914 990 902 902 977 902 902 977 914 914 990 915 915 991 902 902 977 915 915 991 903 903 978 903 903 978 915 915 991 916 916 992 903 903 978 916 916 992 904 904 979 904 904 979 916 916 992 917 917 993 904 904 979 917 917 993 905 905 980 905 905 980 917 917 993 918 918 994 905 905 980 918 918 994 906 906 981 906 906 981 918 918 994 919 919 995 906 906 981 919 919 995 907 907 982 907 907 982 919 919 995 920 920 996 907 907 982 920 920 996 908 908 983 908 908 983 920 920 996 921 921 997 908 908 983 921 921 997 909 909 984 909 909 984 921 921 997 922 922 998 909 909 984 922 922 998 910 910 985 910 910 985 922 922 998 923 923 999 910 910 985 923 923 999 911 911 986 911 911 986 923 923 999 912 912 1000 911 911 986 912 912 1000 900 900 987 912 912 988 924 924 1001 925 925 1002 912 912 988 925 925 1002 913 913 989 913 913 989 925 925 1002 926 926 1003 913 913 989 926 926 1003 914 914 990 914 914 990 926 926 1003 927 927 1004 914 914 990 927 927 1004 915 915 991 915 915 991 927 927 1004 928 928 1005 915 915 991 928 928 1005 916 916 992 916 916 992 928 928 1005 929 929 1006 916 916 992 929 929 1006 917 917 993 917 917 993 929 929 1006 930 930 1007 917 917 993 930 930 1007 918 918 994 918 918 994 930 930 1007 931 931 1008 918 918 994 931 931 1008 919 919 995 919 919 995 931 931 1008 932 932 1009 919 919 995 932 932 1009 920 920 996 920 920 996 932 932 1009 933 933 1010 920 920 996 933 933 1010 921 921 997 921 921 997 933 933 1010 934 934 1011 921 921 997 934 934 1011 922 922 998 922 922 998 934 934 1011 935 935 1012 922 922 998 935 935 1012 923 923 999 923 923 999 935 935 1012 924 924 1013 923 923 999 924 924 1013 912 912 1000 924 924 1001 936 936 1014 937 937 1015 924 924 1001 937 937 1015 925 925 1002 925 925 1002 937 937 1015 938 938 1016 925 925 1002 938 938 1016 926 926 1003 926 926 1003 938 938 1016 939 939 1017 926 926 1003 939 939 1017 927 927 1004 927 927 1004 939 939 1017 940 940 1018 927 927 1004 940 940 1018 928 928 1005 928 928 1005 940 940 1018 941 941 1019 928 928 1005 941 941 1019 929 929 1006 929 929 1006 941 941 1019 942 942 1020 929 929 1006 942 942 1020 930 930 1007 930 930 1007 942 942 1020 943 943 1021 930 930 1007 943 943 1021 931 931 1008 931 931 1008 943 943 1021 944 944 1022 931 931 1008 944 944 1022 932 932 1009 932 932 1009 944 944 1022 945 945 1023 932 932 1009 945 945 1023 933 933 1010 933 933 1010 945 945 1023 946 946 1024 933 933 1010 946 946 1024 934 934 1011 934 934 1011 946 946 1024 947 947 1025 934 934 1011 947 947 1025 935 935 1012 935 935 1012 947 947 1025 936 936 1026 935 935 1012 936 936 1026 924 924 1013 936 936 1014 948 948 1027 949 949 1028 936 936 1014 949 949 1028 937 937 1015 937 937 1015 949 949 1028 950 950 1029 937 937 1015 950 950 1029 938 938 1016 938 938 1016 950 950 1029 951 951 1030 938 938 1016 951 951 1030 939 939 1017 939 939 1017 951 951 1030 952 952 1031 939 939 1017 952 952 1031 940 940 1018 940 940 1018 952 952 1031 953 953 1032 940 940 1018 953 953 1032 941 941 1019 941 941 1019 953 953 1032 954 954 1033 941 941 1019 954 954 1033 942 942 1020 942 942 1020 954 954 1033 955 955 1034 942 942 1020 955 955 1034 943 943 1021 943 943 1021 955 955 1034 956 956 1035 943 943 1021 956 956 1035 944 944 1022 944 944 1022 956 956 1035 957 957 1036 944 944 1022 957 957 1036 945 945 1023 945 945 1023 957 957 1036 958 958 1037 945 945 1023 958 958 1037 946 946 1024 946 946 1024 958 958 1037 959 959 1038 946 946 1024 959 959 1038 947 947 1025 947 947 1025 959 959 1038 948 948 1039 947 947 1025 948 948 1039 936 936 1026 948 948 1027 960 960 1040 961 961 1041 948 948 1027 961 961 1041 949 949 1028 949 949 1028 961 961 1041 962 962 1042 949 949 1028 962 962 1042 950 950 1029 950 950 1029 962 962 1042 963 963 1043 950 950 1029 963 963 1043 951 951 1030 951 951 1030 963 963 1043 964 964 1044 951 951 1030 964 964 1044 952 952 1031 952 952 1031 964 964 1044 965 965 1045 952 952 1031 965 965 1045 953 953 1032 953 953 1032 965 965 1045 966 966 1046 953 953 1032 966 966 1046 954 954 1033 954 954 1033 966 966 1046 967 967 1047 954 954 1033 967 967 1047 955 955 1034 955 955 1034 967 967 1047 968 968 1048 955 955 1034 968 968 1048 956 956 1035 956 956 1035 968 968 1048 969 969 1049 956 956 1035 969 969 1049 957 957 1036 957 957 1036 969 969 1049 970 970 1050 957 957 1036 970 970 1050 958 958 1037 958 958 1037 970 970 1050 971 971 1051 958 958 1037 971 971 1051 959 959 1038 959 959 1038 971 971 1051 960 960 1052 959 959 1038 960 960 1052 948 948 1039 960 960 1040 972 972 1053 973 973 1054 960 960 1040 973 973 1054 961 961 1041 961 961 1041 973 973 1054 974 974 1055 961 961 1041 974 974 1055 962 962 1042 962 962 1042 974 974 1055 975 975 1056 962 962 1042 975 975 1056 963 963 1043 963 963 1043 975 975 1056 976 976 1057 963 963 1043 976 976 1057 964 964 1044 964 964 1044 976 976 1057 977 977 1058 964 964 1044 977 977 1058 965 965 1045 965 965 1045 977 977 1058 978 978 1059 965 965 1045 978 978 1059 966 966 1046 966 966 1046 978 978 1059 979 979 1060 966 966 1046 979 979 1060 967 967 1047 967 967 1047 979 979 1060 980 980 1061 967 967 1047 980 980 1061 968 968 1048 968 968 1048 980 980 1061 981 981 1062 968 968 1048 981 981 1062 969 969 1049 969 969 1049 981 981 1062 982 982 1063 969 969 1049 982 982 1063 970 970 1050 970 970 1050 982 982 1063 983 983 1064 970 970 1050 983 983 1064 971 971 1051 971 971 1051 983 983 1064 972 972 1065 971 971 1051 972 972 1065 960 960 1052 972 972 1053 984 984 1066 985 985 1067 972 972 1053 985 985 1067 973 973 1054 973 973 1054 985 985 1067 986 986 1068 973 973 1054 986 986 1068 974 974 1055 974 974 1055 986 986 1068 987 987 1069 974 974 1055 987 987 1069 975 975 1056 975 975 1056 987 987 1069 988 988 1070 975 975 1056 988 988 1070 976 976 1057 976 976 1057 988 988 1070 989 989 1071 976 976 1057 989 989 1071 977 977 1058 977 977 1058 989 989 1071 990 990 1072 977 977 1058 990 990 1072 978 978 1059 978 978 1059 990 990 1072 991 991 1073 978 978 1059 991 991 1073 979 979 1060 979 979 1060 991 991 1073 992 992 1074 979 979 1060 992 992 1074 980 980 1061 980 980 1061 992 992 1074 993 993 1075 980 980 1061 993 993 1075 981 981 1062 981 981 1062 993 993 1075 994 994 1076 981 981 1062 994 994 1076 982 982 1063 982 982 1063 994 994 1076 995 995 1077 982 982 1063 995 995 1077 983 983 1064 983 983 1064 995 995 1077 984 984 1078 983 983 1064 984 984 1078 972 972 1065 984 984 1066 996 996 1079 997 997 1080 984 984 1066 997 997 1080 985 985 1067 985 985 1067 997 997 1080 998 998 1081 985 985 1067 998 998 1081 986 986 1068 986 986 1068 998 998 1081 999 999 1082 986 986 1068 999 999 1082 987 987 1069 987 987 1069 999 999 1082 1000 1000 1083 987 987 1069 1000 1000 1083 988 988 1070 988 988 1070 1000 1000 1083 1001 1001 1084 988 988 1070 1001 1001 1084 989 989 1071 989 989 1071 1001 1001 1084 1002 1002 1085 989 989 1071 1002 1002 1085 990 990 1072 990 990 1072 1002 1002 1085 1003 1003 1086 990 990 1072 1003 1003 1086 991 991 1073 991 991 1073 1003 1003 1086 1004 1004 1087 991 991 1073 1004 1004 1087 992 992 1074 992 992 1074 1004 1004 1087 1005 1005 1088 992 992 1074 1005 1005 1088 993 993 1075 993 993 1075 1005 1005 1088 1006 1006 1089 993 993 1075 1006 1006 1089 994 994 1076 994 994 1076 1006 1006 1089 1007 1007 1090 994 994 1076 1007 1007 1090 995 995 1077 995 995 1077 1007 1007 1090 996 996 1091 995 995 1077 996 996 1091 984 984 1078 996 996 1079 1008 1008 1092 1009 1009 1093 996 996 1079 1009 1009 1093 997 997 1080 997 997 1080 1009 1009 1093 1010 1010 1094 997 997 1080 1010 1010 1094 998 998 1081 998 998 1081 1010 1010 1094 1011 1011 1095 998 998 1081 1011 1011 1095 999 999 1082 999 999 1082 1011 1011 1095 1012 1012 1096 999 999 1082 1012 1012 1096 1000 1000 1083 1000 1000 1083 1012 1012 1096 1013 1013 1097 1000 1000 1083 1013 1013 1097 1001 1001 1084 1001 1001 1084 1013 1013 1097 1014 1014 1098 1001 1001 1084 1014 1014 1098 1002 1002 1085 1002 1002 1085 1014 1014 1098 1015 1015 1099 1002 1002 1085 1015 1015 1099 1003 1003 1086 1003 1003 1086 1015 1015 1099 1016 1016 1100 1003 1003 1086 1016 1016 1100 1004 1004 1087 1004 1004 1087 1016 1016 1100 1017 1017 1101 1004 1004 1087 1017 1017 1101 1005 1005 1088 1005 1005 1088 1017 1017 1101 1018 1018 1102 1005 1005 1088 1018 1018 1102 1006 1006 1089 1006 1006 1089 1018 1018 1102 1019 1019 1103 1006 1006 1089 1019 1019 1103 1007 1007 1090 1007 1007 1090 1019 1019 1103 1008 1008 1104 1007 1007 1090 1008 1008 1104 996 996 1091 1008 1008 1092 1020 1020 1105 1021 1021 1106 1008 1008 1092 1021 1021 1106 1009 1009 1093 1009 1009 1093 1021 1021 1106 1022 1022 1107 1009 1009 1093 1022 1022 1107 1010 1010 1094 1010 1010 1094 1022 1022 1107 1023 1023 1108 1010 1010 1094 1023 1023 1108 1011 1011 1095 1011 1011 1095 1023 1023 1108 1024 1024 1109 1011 1011 1095 1024 1024 1109 1012 1012 1096 1012 1012 1096 1024 1024 1109 1025 1025 1110 1012 1012 1096 1025 1025 1110 1013 1013 1097 1013 1013 1097 1025 1025 1110 1026 1026 1111 1013 1013 1097 1026 1026 1111 1014 1014 1098 1014 1014 1098 1026 1026 1111 1027 1027 1112 1014 1014 1098 1027 1027 1112 1015 1015 1099 1015 1015 1099 1027 1027 1112 1028 1028 1113 1015 1015 1099 1028 1028 1113 1016 1016 1100 1016 1016 1100 1028 1028 1113 1029 1029 1114 1016 1016 1100 1029 1029 1114 1017 1017 1101 1017 1017 1101 1029 1029 1114 1030 1030 1115 1017 1017 1101 1030 1030 1115 1018 1018 1102 1018 1018 1102 1030 1030 1115 1031 1031 1116 1018 1018 1102 1031 1031 1116 1019 1019 1103 1019 1019 1103 1031 1031 1116 1020 1020 1117 1019 1019 1103 1020 1020 1117 1008 1008 1104 1020 1020 1105 1032 1032 1118 1033 1033 1119 1020 1020 1105 1033 1033 1119 1021 1021 1106 1021 1021 1106 1033 1033 1119 1034 1034 1120 1021 1021 1106 1034 1034 1120 1022 1022 1107 1022 1022 1107 1034 1034 1120 1035 1035 1121 1022 1022 1107 1035 1035 1121 1023 1023 1108 1023 1023 1108 1035 1035 1121 1036 1036 1122 1023 1023 1108 1036 1036 1122 1024 1024 1109 1024 1024 1109 1036 1036 1122 1037 1037 1123 1024 1024 1109 1037 1037 1123 1025 1025 1110 1025 1025 1110 1037 1037 1123 1038 1038 1124 1025 1025 1110 1038 1038 1124 1026 1026 1111 1026 1026 1111 1038 1038 1124 1039 1039 1125 1026 1026 1111 1039 1039 1125 1027 1027 1112 1027 1027 1112 1039 1039 1125 1040 1040 1126 1027 1027 1112 1040 1040 1126 1028 1028 1113 1028 1028 1113 1040 1040 1126 1041 1041 1127 1028 1028 1113 1041 1041 1127 1029 1029 1114 1029 1029 1114 1041 1041 1127 1042 1042 1128 1029 1029 1114 1042 1042 1128 1030 1030 1115 1030 1030 1115 1042 1042 1128 1043 1043 1129 1030 1030 1115 1043 1043 1129 1031 1031 1116 1031 1031 1116 1043 1043 1129 1032 1032 1130 1031 1031 1116 1032 1032 1130 1020 1020 1117 1032 1032 1118 1044 1044 1131 1045 1045 1132 1032 1032 1118 1045 1045 1132 1033 1033 1119 1033 1033 1119 1045 1045 1132 1046 1046 1133 1033 1033 1119 1046 1046 1133 1034 1034 1120 1034 1034 1120 1046 1046 1133 1047 1047 1134 1034 1034 1120 1047 1047 1134 1035 1035 1121 1035 1035 1121 1047 1047 1134 1048 1048 1135 1035 1035 1121 1048 1048 1135 1036 1036 1122 1036 1036 1122 1048 1048 1135 1049 1049 1136 1036 1036 1122 1049 1049 1136 1037 1037 1123 1037 1037 1123 1049 1049 1136 1050 1050 1137 1037 1037 1123 1050 1050 1137 1038 1038 1124 1038 1038 1124 1050 1050 1137 1051 1051 1138 1038 1038 1124 1051 1051 1138 1039 1039 1125 1039 1039 1125 1051 1051 1138 1052 1052 1139 1039 1039 1125 1052 1052 1139 1040 1040 1126 1040 1040 1126 1052 1052 1139 1053 1053 1140 1040 1040 1126 1053 1053 1140 1041 1041 1127 1041 1041 1127 1053 1053 1140 1054 1054 1141 1041 1041 1127 1054 1054 1141 1042 1042 1128 1042 1042 1128 1054 1054 1141 1055 1055 1142 1042 1042 1128 1055 1055 1142 1043 1043 1129 1043 1043 1129 1055 1055 1142 1044 1044 1143 1043 1043 1129 1044 1044 1143 1032 1032 1130 1044 1044 1131 1056 1056 1144 1057 1057 1145 1044 1044 1131 1057 1057 1145 1045 1045 1132 1045 1045 1132 1057 1057 1145 1058 1058 1146 1045 1045 1132 1058 1058 1146 1046 1046 1133 1046 1046 1133 1058 1058 1146 1059 1059 1147 1046 1046 1133 1059 1059 1147 1047 1047 1134 1047 1047 1134 1059 1059 1147 1060 1060 1148 1047 1047 1134 1060 1060 1148 1048 1048 1135 1048 1048 1135 1060 1060 1148 1061 1061 1149 1048 1048 1135 1061 1061 1149 1049 1049 1136 1049 1049 1136 1061 1061 1149 1062 1062 1150 1049 1049 1136 1062 1062 1150 1050 1050 1137 1050 1050 1137 1062 1062 1150 1063 1063 1151 1050 1050 1137 1063 1063 1151 1051 1051 1138 1051 1051 1138 1063 1063 1151 1064 1064 1152 1051 1051 1138 1064 1064 1152 1052 1052 1139 1052 1052 1139 1064 1064 1152 1065 1065 1153 1052 1052 1139 1065 1065 1153 1053 1053 1140 1053 1053 1140 1065 1065 1153 1066 1066 1154 1053 1053 1140 1066 1066 1154 1054 1054 1141 1054 1054 1141 1066 1066 1154 1067 1067 1155 1054 1054 1141 1067 1067 1155 1055 1055 1142 1055 1055 1142 1067 1067 1155 1056 1056 1156 1055 1055 1142 1056 1056 1156 1044 1044 1143 1056 1056 1144 1068 1068 1157 1069 1069 1158 1056 1056 1144 1069 1069 1158 1057 1057 1145 1057 1057 1145 1069 1069 1158 1070 1070 1159 1057 1057 1145 1070 1070 1159 1058 1058 1146 1058 1058 1146 1070 1070 1159 1071 1071 1160 1058 1058 1146 1071 1071 1160 1059 1059 1147 1059 1059 1147 1071 1071 1160 1072 1072 1161 1059 1059 1147 1072 1072 1161 1060 1060 1148 1060 1060 1148 1072 1072 1161 1073 1073 1162 1060 1060 1148 1073 1073 1162 1061 1061 1149 1061 1061 1149 1073 1073 1162 1074 1074 1163 1061 1061 1149 1074 1074 1163 1062 1062 1150 1062 1062 1150 1074 1074 1163 1075 1075 1164 1062 1062 1150 1075 1075 1164 1063 1063 1151 1063 1063 1151 1075 1075 1164 1076 1076 1165 1063 1063 1151 1076 1076 1165 1064 1064 1152 1064 1064 1152 1076 1076 1165 1077 1077 1166 1064 1064 1152 1077 1077 1166 1065 1065 1153 1065 1065 1153 1077 1077 1166 1078 1078 1167 1065 1065 1153 1078 1078 1167 1066 1066 1154 1066 1066 1154 1078 1078 1167 1079 1079 1168 1066 1066 1154 1079 1079 1168 1067 1067 1155 1067 1067 1155 1079 1079 1168 1068 1068 1169 1067 1067 1155 1068 1068 1169 1056 1056 1156 1068 1068 1157 1080 1080 1170 1081 1081 1171 1068 1068 1157 1081 1081 1171 1069 1069 1158 1069 1069 1158 1081 1081 1171 1082 1082 1172 1069 1069 1158 1082 1082 1172 1070 1070 1159 1070 1070 1159 1082 1082 1172 1083 1083 1173 1070 1070 1159 1083 1083 1173 1071 1071 1160 1071 1071 1160 1083 1083 1173 1084 1084 1174 1071 1071 1160 1084 1084 1174 1072 1072 1161 1072 1072 1161 1084 1084 1174 1085 1085 1175 1072 1072 1161 1085 1085 1175 1073 1073 1162 1073 1073 1162 1085 1085 1175 1086 1086 1176 1073 1073 1162 1086 1086 1176 1074 1074 1163 1074 1074 1163 1086 1086 1176 1087 1087 1177 1074 1074 1163 1087 1087 1177 1075 1075 1164 1075 1075 1164 1087 1087 1177 1088 1088 1178 1075 1075 1164 1088 1088 1178 1076 1076 1165 1076 1076 1165 1088 1088 1178 1089 1089 1179 1076 1076 1165 1089 1089 1179 1077 1077 1166 1077 1077 1166 1089 1089 1179 1090 1090 1180 1077 1077 1166 1090 1090 1180 1078 1078 1167 1078 1078 1167 1090 1090 1180 1091 1091 1181 1078 1078 1167 1091 1091 1181 1079 1079 1168 1079 1079 1168 1091 1091 1181 1080 1080 1182 1079 1079 1168 1080 1080 1182 1068 1068 1169 1080 1080 1170 1092 1092 1183 1093 1093 1184 1080 1080 1170 1093 1093 1184 1081 1081 1171 1081 1081 1171 1093 1093 1184 1094 1094 1185 1081 1081 1171 1094 1094 1185 1082 1082 1172 1082 1082 1172 1094 1094 1185 1095 1095 1186 1082 1082 1172 1095 1095 1186 1083 1083 1173 1083 1083 1173 1095 1095 1186 1096 1096 1187 1083 1083 1173 1096 1096 1187 1084 1084 1174 1084 1084 1174 1096 1096 1187 1097 1097 1188 1084 1084 1174 1097 1097 1188 1085 1085 1175 1085 1085 1175 1097 1097 1188 1098 1098 1189 1085 1085 1175 1098 1098 1189 1086 1086 1176 1086 1086 1176 1098 1098 1189 1099 1099 1190 1086 1086 1176 1099 1099 1190 1087 1087 1177 1087 1087 1177 1099 1099 1190 1100 1100 1191 1087 1087 1177 1100 1100 1191 1088 1088 1178 1088 1088 1178 1100 1100 1191 1101 1101 1192 1088 1088 1178 1101 1101 1192 1089 1089 1179 1089 1089 1179 1101 1101 1192 1102 1102 1193 1089 1089 1179 1102 1102 1193 1090 1090 1180 1090 1090 1180 1102 1102 1193 1103 1103 1194 1090 1090 1180 1103 1103 1194 1091 1091 1181 1091 1091 1181 1103 1103 1194 1092 1092 1195 1091 1091 1181 1092 1092 1195 1080 1080 1182 1092 1092 1183 1104 1104 1196 1105 1105 1197 1092 1092 1183 1105 1105 1197 1093 1093 1184 1093 1093 1184 1105 1105 1197 1106 1106 1198 1093 1093 1184 1106 1106 1198 1094 1094 1185 1094 1094 1185 1106 1106 1198 1107 1107 1199 1094 1094 1185 1107 1107 1199 1095 1095 1186 1095 1095 1186 1107 1107 1199 1108 1108 1200 1095 1095 1186 1108 1108 1200 1096 1096 1187 1096 1096 1187 1108 1108 1200 1109 1109 1201 1096 1096 1187 1109 1109 1201 1097 1097 1188 1097 1097 1188 1109 1109 1201 1110 1110 1202 1097 1097 1188 1110 1110 1202 1098 1098 1189 1098 1098 1189 1110 1110 1202 1111 1111 1203 1098 1098 1189 1111 1111 1203 1099 1099 1190 1099 1099 1190 1111 1111 1203 1112 1112 1204 1099 1099 1190 1112 1112 1204 1100 1100 1191 1100 1100 1191 1112 1112 1204 1113 1113 1205 1100 1100 1191 1113 1113 1205 1101 1101 1192 1101 1101 1192 1113 1113 1205 1114 1114 1206 1101 1101 1192 1114 1114 1206 1102 1102 1193 1102 1102 1193 1114 1114 1206 1115 1115 1207 1102 1102 1193 1115 1115 1207 1103 1103 1194 1103 1103 1194 1115 1115 1207 1104 1104 1208 1103 1103 1194 1104 1104 1208 1092 1092 1195 1104 1104 1196 1116 1116 1209 1117 1117 1210 1104 1104 1196 1117 1117 1210 1105 1105 1197 1105 1105 1197 1117 1117 1210 1118 1118 1211 1105 1105 1197 1118 1118 1211 1106 1106 1198 1106 1106 1198 1118 1118 1211 1119 1119 1212 1106 1106 1198 1119 1119 1212 1107 1107 1199 1107 1107 1199 1119 1119 1212 1120 1120 1213 1107 1107 1199 1120 1120 1213 1108 1108 1200 1108 1108 1200 1120 1120 1213 1121 1121 1214 1108 1108 1200 1121 1121 1214 1109 1109 1201 1109 1109 1201 1121 1121 1214 1122 1122 1215 1109 1109 1201 1122 1122 1215 1110 1110 1202 1110 1110 1202 1122 1122 1215 1123 1123 1216 1110 1110 1202 1123 1123 1216 1111 1111 1203 1111 1111 1203 1123 1123 1216 1124 1124 1217 1111 1111 1203 1124 1124 1217 1112 1112 1204 1112 1112 1204 1124 1124 1217 1125 1125 1218 1112 1112 1204 1125 1125 1218 1113 1113 1205 1113 1113 1205 1125 1125 1218 1126 1126 1219 1113 1113 1205 1126 1126 1219 1114 1114 1206 1114 1114 1206 1126 1126 1219 1127 1127 1220 1114 1114 1206 1127 1127 1220 1115 1115 1207 1115 1115 1207 1127 1127 1220 1116 1116 1221 1115 1115 1207 1116 1116 1221 1104 1104 1208 1116 1116 1209 1128 1128 1222 1129 1129 1223 1116 1116 1209 1129 1129 1223 1117 1117 1210 1117 1117 1210 1129 1129 1223 1130 1130 1224 1117 1117 1210 1130 1130 1224 1118 1118 1211 1118 1118 1211 1130 1130 1224 1131 1131 1225 1118 1118 1211 1131 1131 1225 1119 1119 1212 1119 1119 1212 1131 1131 1225 1132 1132 1226 1119 1119 1212 1132 1132 1226 1120 1120 1213 1120 1120 1213 1132 1132 1226 1133 1133 1227 1120 1120 1213 1133 1133 1227 1121 1121 1214 1121 1121 1214 1133 1133 1227 1134 1134 1228 1121 1121 1214 1134 1134 1228 1122 1122 1215 1122 1122 1215 1134 1134 1228 1135 1135 1229 1122 1122 1215 1135 1135 1229 1123 1123 1216 1123 1123 1216 1135 1135 1229 1136 1136 1230 1123 1123 1216 1136 1136 1230 1124 1124 1217 1124 1124 1217 1136 1136 1230 1137 1137 1231 1124 1124 1217 1137 1137 1231 1125 1125 1218 1125 1125 1218 1137 1137 1231 1138 1138 1232 1125 1125 1218 1138 1138 1232 1126 1126 1219 1126 1126 1219 1138 1138 1232 1139 1139 1233 1126 1126 1219 1139 1139 1233 1127 1127 1220 1127 1127 1220 1139 1139 1233 1128 1128 1234 1127 1127 1220 1128 1128 1234 1116 1116 1221 1128 1128 1222 1140 1140 1235 1141 1141 1236 1128 1128 1222 1141 1141 1236 1129 1129 1223 1129 1129 1223 1141 1141 1236 1142 1142 1237 1129 1129 1223 1142 1142 1237 1130 1130 1224 1130 1130 1224 1142 1142 1237 1143 1143 1238 1130 1130 1224 1143 1143 1238 1131 1131 1225 1131 1131 1225 1143 1143 1238 1144 1144 1239 1131 1131 1225 1144 1144 1239 1132 1132 1226 1132 1132 1226 1144 1144 1239 1145 1145 1240 1132 1132 1226 1145 1145 1240 1133 1133 1227 1133 1133 1227 1145 1145 1240 1146 1146 1241 1133 1133 1227 1146 1146 1241 1134 1134 1228 1134 1134 1228 1146 1146 1241 1147 1147 1242 1134 1134 1228 1147 1147 1242 1135 1135 1229 1135 1135 1229 1147 1147 1242 1148 1148 1243 1135 1135 1229 1148 1148 1243 1136 1136 1230 1136 1136 1230 1148 1148 1243 1149 1149 1244 1136 1136 1230 1149 1149 1244 1137 1137 1231 1137 1137 1231 1149 1149 1244 1150 1150 1245 1137 1137 1231 1150 1150 1245 1138 1138 1232 1138 1138 1232 1150 1150 1245 1151 1151 1246 1138 1138 1232 1151 1151 1246 1139 1139 1233 1139 1139 1233 1151 1151 1246 1140 1140 1247 1139 1139 1233 1140 1140 1247 1128 1128 1234 1140 1140 1235 1152 1152 1248 1153 1153 1249 1140 1140 1235 1153 1153 1249 1141 1141 1236 1141 1141 1236 1153 1153 1249 1154 1154 1250 1141 1141 1236 1154 1154 1250 1142 1142 1237 1142 1142 1237 1154 1154 1250 1155 1155 1251 1142 1142 1237 1155 1155 1251 1143 1143 1238 1143 1143 1238 1155 1155 1251 1156 1156 1252 1143 1143 1238 1156 1156 1252 1144 1144 1239 1144 1144 1239 1156 1156 1252 1157 1157 1253 1144 1144 1239 1157 1157 1253 1145 1145 1240 1145 1145 1240 1157 1157 1253 1158 1158 1254 1145 1145 1240 1158 1158 1254 1146 1146 1241 1146 1146 1241 1158 1158 1254 1159 1159 1255 1146 1146 1241 1159 1159 1255 1147 1147 1242 1147 1147 1242 1159 1159 1255 1160 1160 1256 1147 1147 1242 1160 1160 1256 1148 1148 1243 1148 1148 1243 1160 1160 1256 1161 1161 1257 1148 1148 1243 1161 1161 1257 1149 1149 1244 1149 1149 1244 1161 1161 1257 1162 1162 1258 1149 1149 1244 1162 1162 1258 1150 1150 1245 1150 1150 1245 1162 1162 1258 1163 1163 1259 1150 1150 1245 1163 1163 1259 1151 1151 1246 1151 1151 1246 1163 1163 1259 1152 1152 1260 1151 1151 1246 1152 1152 1260 1140 1140 1247 1152 1152 1248 1164 1164 1261 1165 1165 1262 1152 1152 1248 1165 1165 1262 1153 1153 1249 1153 1153 1249 1165 1165 1262 1166 1166 1263 1153 1153 1249 1166 1166 1263 1154 1154 1250 1154 1154 1250 1166 1166 1263 1167 1167 1264 1154 1154 1250 1167 1167 1264 1155 1155 1251 1155 1155 1251 1167 1167 1264 1168 1168 1265 1155 1155 1251 1168 1168 1265 1156 1156 1252 1156 1156 1252 1168 1168 1265 1169 1169 1266 1156 1156 1252 1169 1169 1266 1157 1157 1253 1157 1157 1253 1169 1169 1266 1170 1170 1267 1157 1157 1253 1170 1170 1267 1158 1158 1254 1158 1158 1254 1170 1170 1267 1171 1171 1268 1158 1158 1254 1171 1171 1268 1159 1159 1255 1159 1159 1255 1171 1171 1268 1172 1172 1269 1159 1159 1255 1172 1172 1269 1160 1160 1256 1160 1160 1256 1172 1172 1269 1173 1173 1270 1160 1160 1256 1173 1173 1270 1161 1161 1257 1161 1161 1257 1173 1173 1270 1174 1174 1271 1161 1161 1257 1174 1174 1271 1162 1162 1258 1162 1162 1258 1174 1174 1271 1175 1175 1272 1162 1162 1258 1175 1175 1272 1163 1163 1259 1163 1163 1259 1175 1175 1272 1164 1164 1273 1163 1163 1259 1164 1164 1273 1152 1152 1260 1164 1164 1261 1176 1176 1274 1177 1177 1275 1164 1164 1261 1177 1177 1275 1165 1165 1262 1165 1165 1262 1177 1177 1275 1178 1178 1276 1165 1165 1262 1178 1178 1276 1166 1166 1263 1166 1166 1263 1178 1178 1276 1179 1179 1277 1166 1166 1263 1179 1179 1277 1167 1167 1264 1167 1167 1264 1179 1179 1277 1180 1180 1278 1167 1167 1264 1180 1180 1278 1168 1168 1265 1168 1168 1265 1180 1180 1278 1181 1181 1279 1168 1168 1265 1181 1181 1279 1169 1169 1266 1169 1169 1266 1181 1181 1279 1182 1182 1280 1169 1169 1266 1182 1182 1280 1170 1170 1267 1170 1170 1267 1182 1182 1280 1183 1183 1281 1170 1170 1267 1183 1183 1281 1171 1171 1268 1171 1171 1268 1183 1183 1281 1184 1184 1282 1171 1171 1268 1184 1184 1282 1172 1172 1269 1172 1172 1269 1184 1184 1282 1185 1185 1283 1172 1172 1269 1185 1185 1283 1173 1173 1270 1173 1173 1270 1185 1185 1283 1186 1186 1284 1173 1173 1270 1186 1186 1284 1174 1174 1271 1174 1174 1271 1186 1186 1284 1187 1187 1285 1174 1174 1271 1187 1187 1285 1175 1175 1272 1175 1175 1272 1187 1187 1285 1176 1176 1286 1175 1175 1272 1176 1176 1286 1164 1164 1273 1176 1176 1274 1188 1188 1287 1189 1189 1288 1176 1176 1274 1189 1189 1288 1177 1177 1275 1177 1177 1275 1189 1189 1288 1190 1190 1289 1177 1177 1275 1190 1190 1289 1178 1178 1276 1178 1178 1276 1190 1190 1289 1191 1191 1290 1178 1178 1276 1191 1191 1290 1179 1179 1277 1179 1179 1277 1191 1191 1290 1192 1192 1291 1179 1179 1277 1192 1192 1291 1180 1180 1278 1180 1180 1278 1192 1192 1291 1193 1193 1292 1180 1180 1278 1193 1193 1292 1181 1181 1279 1181 1181 1279 1193 1193 1292 1194 1194 1293 1181 1181 1279 1194 1194 1293 1182 1182 1280 1182 1182 1280 1194 1194 1293 1195 1195 1294 1182 1182 1280 1195 1195 1294 1183 1183 1281 1183 1183 1281 1195 1195 1294 1196 1196 1295 1183 1183 1281 1196 1196 1295 1184 1184 1282 1184 1184 1282 1196 1196 1295 1197 1197 1296 1184 1184 1282 1197 1197 1296 1185 1185 1283 1185 1185 1283 1197 1197 1296 1198 1198 1297 1185 1185 1283 1198 1198 1297 1186 1186 1284 1186 1186 1284 1198 1198 1297 1199 1199 1298 1186 1186 1284 1199 1199 1298 1187 1187 1285 1187 1187 1285 1199 1199 1298 1188 1188 1299 1187 1187 1285 1188 1188 1299 1176 1176 1286 1188 1188 1287 1200 1200 1300 1201 1201 1301 1188 1188 1287 1201 1201 1301 1189 1189 1288 1189 1189 1288 1201 1201 1301 1202 1202 1302 1189 1189 1288 1202 1202 1302 1190 1190 1289 1190 1190 1289 1202 1202 1302 1203 1203 1303 1190 1190 1289 1203 1203 1303 1191 1191 1290 1191 1191 1290 1203 1203 1303 1204 1204 1304 1191 1191 1290 1204 1204 1304 1192 1192 1291 1192 1192 1291 1204 1204 1304 1205 1205 1305 1192 1192 1291 1205 1205 1305 1193 1193 1292 1193 1193 1292 1205 1205 1305 1206 1206 1306 1193 1193 1292 1206 1206 1306 1194 1194 1293 1194 1194 1293 1206 1206 1306 1207 1207 1307 1194 1194 1293 1207 1207 1307 1195 1195 1294 1195 1195 1294 1207 1207 1307 1208 1208 1308 1195 1195 1294 1208 1208 1308 1196 1196 1295 1196 1196 1295 1208 1208 1308 1209 1209 1309 1196 1196 1295 1209 1209 1309 1197 1197 1296 1197 1197 1296 1209 1209 1309 1210 1210 1310 1197 1197 1296 1210 1210 1310 1198 1198 1297 1198 1198 1297 1210 1210 1310 1211 1211 1311 1198 1198 1297 1211 1211 1311 1199 1199 1298 1199 1199 1298 1211 1211 1311 1200 1200 1312 1199 1199 1298 1200 1200 1312 1188 1188 1299 1200 1200 1300 1212 1212 1313 1213 1213 1314 1200 1200 1300 1213 1213 1314 1201 1201 1301 1201 1201 1301 1213 1213 1314 1214 1214 1315 1201 1201 1301 1214 1214 1315 1202 1202 1302 1202 1202 1302 1214 1214 1315 1215 1215 1316 1202 1202 1302 1215 1215 1316 1203 1203 1303 1203 1203 1303 1215 1215 1316 1216 1216 1317 1203 1203 1303 1216 1216 1317 1204 1204 1304 1204 1204 1304 1216 1216 1317 1217 1217 1318 1204 1204 1304 1217 1217 1318 1205 1205 1305 1205 1205 1305 1217 1217 1318 1218 1218 1319 1205 1205 1305 1218 1218 1319 1206 1206 1306 1206 1206 1306 1218 1218 1319 1219 1219 1320 1206 1206 1306 1219 1219 1320 1207 1207 1307 1207 1207 1307 1219 1219 1320 1220 1220 1321 1207 1207 1307 1220 1220 1321 1208 1208 1308 1208 1208 1308 1220 1220 1321 1221 1221 1322 1208 1208 1308 1221 1221 1322 1209 1209 1309 1209 1209 1309 1221 1221 1322 1222 1222 1323 1209 1209 1309 1222 1222 1323 1210 1210 1310 1210 1210 1310 1222 1222 1323 1223 1223 1324 1210 1210 1310 1223 1223 1324 1211 1211 1311 1211 1211 1311 1223 1223 1324 1212 1212 1325 1211 1211 1311 1212 1212 1325 1200 1200 1312 1212 1212 1313 1224 1224 1326 1225 1225 1327 1212 1212 1313 1225 1225 1327 1213 1213 1314 1213 1213 1314 1225 1225 1327 1226 1226 1328 1213 1213 1314 1226 1226 1328 1214 1214 1315 1214 1214 1315 1226 1226 1328 1227 1227 1329 1214 1214 1315 1227 1227 1329 1215 1215 1316 1215 1215 1316 1227 1227 1329 1228 1228 1330 1215 1215 1316 1228 1228 1330 1216 1216 1317 1216 1216 1317 1228 1228 1330 1229 1229 1331 1216 1216 1317 1229 1229 1331 1217 1217 1318 1217 1217 1318 1229 1229 1331 1230 1230 1332 1217 1217 1318 1230 1230 1332 1218 1218 1319 1218 1218 1319 1230 1230 1332 1231 1231 1333 1218 1218 1319 1231 1231 1333 1219 1219 1320 1219 1219 1320 1231 1231 1333 1232 1232 1334 1219 1219 1320 1232 1232 1334 1220 1220 1321 1220 1220 1321 1232 1232 1334 1233 1233 1335 1220 1220 1321 1233 1233 1335 1221 1221 1322 1221 1221 1322 1233 1233 1335 1234 1234 1336 1221 1221 1322 1234 1234 1336 1222 1222 1323 1222 1222 1323 1234 1234 1336 1235 1235 1337 1222 1222 1323 1235 1235 1337 1223 1223 1324 1223 1223 1324 1235 1235 1337 1224 1224 1338 1223 1223 1324 1224 1224 1338 1212 1212 1325 1224 1224 1326 1236 1236 1339 1237 1237 1340 1224 1224 1326 1237 1237 1340 1225 1225 1327 1225 1225 1327 1237 1237 1340 1238 1238 1341 1225 1225 1327 1238 1238 1341 1226 1226 1328 1226 1226 1328 1238 1238 1341 1239 1239 1342 1226 1226 1328 1239 1239 1342 1227 1227 1329 1227 1227 1329 1239 1239 1342 1240 1240 1343 1227 1227 1329 1240 1240 1343 1228 1228 1330 1228 1228 1330 1240 1240 1343 1241 1241 1344 1228 1228 1330 1241 1241 1344 1229 1229 1331 1229 1229 1331 1241 1241 1344 1242 1242 1345 1229 1229 1331 1242 1242 1345 1230 1230 1332 1230 1230 1332 1242 1242 1345 1243 1243 1346 1230 1230 1332 1243 1243 1346 1231 1231 1333 1231 1231 1333 1243 1243 1346 1244 1244 1347 1231 1231 1333 1244 1244 1347 1232 1232 1334 1232 1232 1334 1244 1244 1347 1245 1245 1348 1232 1232 1334 1245 1245 1348 1233 1233 1335 1233 1233 1335 1245 1245 1348 1246 1246 1349 1233 1233 1335 1246 1246 1349 1234 1234 1336 1234 1234 1336 1246 1246 1349 1247 1247 1350 1234 1234 1336 1247 1247 1350 1235 1235 1337 1235 1235 1337 1247 1247 1350 1236 1236 1351 1235 1235 1337 1236 1236 1351 1224 1224 1338 1236 1236 1339 1248 1248 1352 1249 1249 1353 1236 1236 1339 1249 1249 1353 1237 1237 1340 1237 1237 1340 1249 1249 1353 1250 1250 1354 1237 1237 1340 1250 1250 1354 1238 1238 1341 1238 1238 1341 1250 1250 1354 1251 1251 1355 1238 1238 1341 1251 1251 1355 1239 1239 1342 1239 1239 1342 1251 1251 1355 1252 1252 1356 1239 1239 1342 1252 1252 1356 1240 1240 1343 1240 1240 1343 1252 1252 1356 1253 1253 1357 1240 1240 1343 1253 1253 1357 1241 1241 1344 1241 1241 1344 1253 1253 1357 1254 1254 1358 1241 1241 1344 1254 1254 1358 1242 1242 1345 1242 1242 1345 1254 1254 1358 1255 1255 1359 1242 1242 1345 1255 1255 1359 1243 1243 1346 1243 1243 1346 1255 1255 1359 1256 1256 1360 1243 1243 1346 1256 1256 1360 1244 1244 1347 1244 1244 1347 1256 1256 1360 1257 1257 1361 1244 1244 1347 1257 1257 1361 1245 1245 1348 1245 1245 1348 1257 1257 1361 1258 1258 1362 1245 1245 1348 1258 1258 1362 1246 1246 1349 1246 1246 1349 1258 1258 1362 1259 1259 1363 1246 1246 1349 1259 1259 1363 1247 1247 1350 1247 1247 1350 1259 1259 1363 1248 1248 1364 1247 1247 1350 1248 1248 1364 1236 1236 1351 1248 1248 1352 1260 1260 1365 1261 1261 1366 1248 1248 1352 1261 1261 1366 1249 1249 1353 1249 1249 1353 1261 1261 1366 1262 1262 1367 1249 1249 1353 1262 1262 1367 1250 1250 1354 1250 1250 1354 1262 1262 1367 1263 1263 1368 1250 1250 1354 1263 1263 1368 1251 1251 1355 1251 1251 1355 1263 1263 1368 1264 1264 1369 1251 1251 1355 1264 1264 1369 1252 1252 1356 1252 1252 1356 1264 1264 1369 1265 1265 1370 1252 1252 1356 1265 1265 1370 1253 1253 1357 1253 1253 1357 1265 1265 1370 1266 1266 1371 1253 1253 1357 1266 1266 1371 1254 1254 1358 1254 1254 1358 1266 1266 1371 1267 1267 1372 1254 1254 1358 1267 1267 1372 1255 1255 1359 1255 1255 1359 1267 1267 1372 1268 1268 1373 1255 1255 1359 1268 1268 1373 1256 1256 1360 1256 1256 1360 1268 1268 1373 1269 1269 1374 1256 1256 1360 1269 1269 1374 1257 1257 1361 1257 1257 1361 1269 1269 1374 1270 1270 1375 1257 1257 1361 1270 1270 1375 1258 1258 1362 1258 1258 1362 1270 1270 1375 1271 1271 1376 1258 1258 1362 1271 1271 1376 1259 1259 1363 1259 1259 1363 1271 1271 1376 1260 1260 1377 1259 1259 1363 1260 1260 1377 1248 1248 1364 1260 1260 1365 1272 1272 1378 1273 1273 1379 1260 1260 1365 1273 1273 1379 1261 1261 1366 1261 1261 1366 1273 1273 1379 1274 1274 1380 1261 1261 1366 1274 1274 1380 1262 1262 1367 1262 1262 1367 1274 1274 1380 1275 1275 1381 1262 1262 1367 1275 1275 1381 1263 1263 1368 1263 1263 1368 1275 1275 1381 1276 1276 1382 1263 1263 1368 1276 1276 1382 1264 1264 1369 1264 1264 1369 1276 1276 1382 1277 1277 1383 1264 1264 1369 1277 1277 1383 1265 1265 1370 1265 1265 1370 1277 1277 1383 1278 1278 1384 1265 1265 1370 1278 1278 1384 1266 1266 1371 1266 1266 1371 1278 1278 1384 1279 1279 1385 1266 1266 1371 1279 1279 1385 1267 1267 1372 1267 1267 1372 1279 1279 1385 1280 1280 1386 1267 1267 1372 1280 1280 1386 1268 1268 1373 1268 1268 1373 1280 1280 1386 1281 1281 1387 1268 1268 1373 1281 1281 1387 1269 1269 1374 1269 1269 1374 1281 1281 1387 1282 1282 1388 1269 1269 1374 1282 1282 1388 1270 1270 1375 1270 1270 1375 1282 1282 1388 1283 1283 1389 1270 1270 1375 1283 1283 1389 1271 1271 1376 1271 1271 1376 1283 1283 1389 1272 1272 1390 1271 1271 1376 1272 1272 1390 1260 1260 1377 1272 1272 1378 1284 1284 1391 1285 1285 1392 1272 1272 1378 1285 1285 1392 1273 1273 1379 1273 1273 1379 1285 1285 1392 1286 1286 1393 1273 1273 1379 1286 1286 1393 1274 1274 1380 1274 1274 1380 1286 1286 1393 1287 1287 1394 1274 1274 1380 1287 1287 1394 1275 1275 1381 1275 1275 1381 1287 1287 1394 1288 1288 1395 1275 1275 1381 1288 1288 1395 1276 1276 1382 1276 1276 1382 1288 1288 1395 1289 1289 1396 1276 1276 1382 1289 1289 1396 1277 1277 1383 1277 1277 1383 1289 1289 1396 1290 1290 1397 1277 1277 1383 1290 1290 1397 1278 1278 1384 1278 1278 1384 1290 1290 1397 1291 1291 1398 1278 1278 1384 1291 1291 1398 1279 1279 1385 1279 1279 1385 1291 1291 1398 1292 1292 1399 1279 1279 1385 1292 1292 1399 1280 1280 1386 1280 1280 1386 1292 1292 1399 1293 1293 1400 1280 1280 1386 1293 1293 1400 1281 1281 1387 1281 1281 1387 1293 1293 1400 1294 1294 1401 1281 1281 1387 1294 1294 1401 1282 1282 1388 1282 1282 1388 1294 1294 1401 1295 1295 1402 1282 1282 1388 1295 1295 1402 1283 1283 1389 1283 1283 1389 1295 1295 1402 1284 1284 1403 1283 1283 1389 1284 1284 1403 1272 1272 1390 1284 1284 1391 1296 1296 1404 1297 1297 1405 1284 1284 1391 1297 1297 1405 1285 1285 1392 1285 1285 1392 1297 1297 1405 1298 1298 1406 1285 1285 1392 1298 1298 1406 1286 1286 1393 1286 1286 1393 1298 1298 1406 1299 1299 1407 1286 1286 1393 1299 1299 1407 1287 1287 1394 1287 1287 1394 1299 1299 1407 1300 1300 1408 1287 1287 1394 1300 1300 1408 1288 1288 1395 1288 1288 1395 1300 1300 1408 1301 1301 1409 1288 1288 1395 1301 1301 1409 1289 1289 1396 1289 1289 1396 1301 1301 1409 1302 1302 1410 1289 1289 1396 1302 1302 1410 1290 1290 1397 1290 1290 1397 1302 1302 1410 1303 1303 1411 1290 1290 1397 1303 1303 1411 1291 1291 1398 1291 1291 1398 1303 1303 1411 1304 1304 1412 1291 1291 1398 1304 1304 1412 1292 1292 1399 1292 1292 1399 1304 1304 1412 1305 1305 1413 1292 1292 1399 1305 1305 1413 1293 1293 1400 1293 1293 1400 1305 1305 1413 1306 1306 1414 1293 1293 1400 1306 1306 1414 1294 1294 1401 1294 1294 1401 1306 1306 1414 1307 1307 1415 1294 1294 1401 1307 1307 1415 1295 1295 1402 1295 1295 1402 1307 1307 1415 1296 1296 1416 1295 1295 1402 1296 1296 1416 1284 1284 1403 1296 1296 1404 1308 1308 1417 1309 1309 1418 1296 1296 1404 1309 1309 1418 1297 1297 1405 1297 1297 1405 1309 1309 1418 1310 1310 1419 1297 1297 1405 1310 1310 1419 1298 1298 1406 1298 1298 1406 1310 1310 1419 1311 1311 1420 1298 1298 1406 1311 1311 1420 1299 1299 1407 1299 1299 1407 1311 1311 1420 1312 1312 1421 1299 1299 1407 1312 1312 1421 1300 1300 1408 1300 1300 1408 1312 1312 1421 1313 1313 1422 1300 1300 1408 1313 1313 1422 1301 1301 1409 1301 1301 1409 1313 1313 1422 1314 1314 1423 1301 1301 1409 1314 1314 1423 1302 1302 1410 1302 1302 1410 1314 1314 1423 1315 1315 1424 1302 1302 1410 1315 1315 1424 1303 1303 1411 1303 1303 1411 1315 1315 1424 1316 1316 1425 1303 1303 1411 1316 1316 1425 1304 1304 1412 1304 1304 1412 1316 1316 1425 1317 1317 1426 1304 1304 1412 1317 1317 1426 1305 1305 1413 1305 1305 1413 1317 1317 1426 1318 1318 1427 1305 1305 1413 1318 1318 1427 1306 1306 1414 1306 1306 1414 1318 1318 1427 1319 1319 1428 1306 1306 1414 1319 1319 1428 1307 1307 1415 1307 1307 1415 1319 1319 1428 1308 1308 1429 1307 1307 1415 1308 1308 1429 1296 1296 1416 1308 1308 1417 1320 1320 1430 1321 1321 1431 1308 1308 1417 1321 1321 1431 1309 1309 1418 1309 1309 1418 1321 1321 1431 1322 1322 1432 1309 1309 1418 1322 1322 1432 1310 1310 1419 1310 1310 1419 1322 1322 1432 1323 1323 1433 1310 1310 1419 1323 1323 1433 1311 1311 1420 1311 1311 1420 1323 1323 1433 1324 1324 1434 1311 1311 1420 1324 1324 1434 1312 1312 1421 1312 1312 1421 1324 1324 1434 1325 1325 1435 1312 1312 1421 1325 1325 1435 1313 1313 1422 1313 1313 1422 1325 1325 1435 1326 1326 1436 1313 1313 1422 1326 1326 1436 1314 1314 1423 1314 1314 1423 1326 1326 1436 1327 1327 1437 1314 1314 1423 1327 1327 1437 1315 1315 1424 1315 1315 1424 1327 1327 1437 1328 1328 1438 1315 1315 1424 1328 1328 1438 1316 1316 1425 1316 1316 1425 1328 1328 1438 1329 1329 1439 1316 1316 1425 1329 1329 1439 1317 1317 1426 1317 1317 1426 1329 1329 1439 1330 1330 1440 1317 1317 1426 1330 1330 1440 1318 1318 1427 1318 1318 1427 1330 1330 1440 1331 1331 1441 1318 1318 1427 1331 1331 1441 1319 1319 1428 1319 1319 1428 1331 1331 1441 1320 1320 1442 1319 1319 1428 1320 1320 1442 1308 1308 1429 1320 1320 1430 1332 1332 1443 1333 1333 1444 1320 1320 1430 1333 1333 1444 1321 1321 1431 1321 1321 1431 1333 1333 1444 1334 1334 1445 1321 1321 1431 1334 1334 1445 1322 1322 1432 1322 1322 1432 1334 1334 1445 1335 1335 1446 1322 1322 1432 1335 1335 1446 1323 1323 1433 1323 1323 1433 1335 1335 1446 1336 1336 1447 1323 1323 1433 1336 1336 1447 1324 1324 1434 1324 1324 1434 1336 1336 1447 1337 1337 1448 1324 1324 1434 1337 1337 1448 1325 1325 1435 1325 1325 1435 1337 1337 1448 1338 1338 1449 1325 1325 1435 1338 1338 1449 1326 1326 1436 1326 1326 1436 1338 1338 1449 1339 1339 1450 1326 1326 1436 1339 1339 1450 1327 1327 1437 1327 1327 1437 1339 1339 1450 1340 1340 1451 1327 1327 1437 1340 1340 1451 1328 1328 1438 1328 1328 1438 1340 1340 1451 1341 1341 1452 1328 1328 1438 1341 1341 1452 1329 1329 1439 1329 1329 1439 1341 1341 1452 1342 1342 1453 1329 1329 1439 1342 1342 1453 1330 1330 1440 1330 1330 1440 1342 1342 1453 1343 1343 1454 1330 1330 1440 1343 1343 1454 1331 1331 1441 1331 1331 1441 1343 1343 1454 1332 1332 1455 1331 1331 1441 1332 1332 1455 1320 1320 1442 1332 1332 1443 1344 1344 1456 1345 1345 1457 1332 1332 1443 1345 1345 1457 1333 1333 1444 1333 1333 1444 1345 1345 1457 1346 1346 1458 1333 1333 1444 1346 1346 1458 1334 1334 1445 1334 1334 1445 1346 1346 1458 1347 1347 1459 1334 1334 1445 1347 1347 1459 1335 1335 1446 1335 1335 1446 1347 1347 1459 1348 1348 1460 1335 1335 1446 1348 1348 1460 1336 1336 1447 1336 1336 1447 1348 1348 1460 1349 1349 1461 1336 1336 1447 1349 1349 1461 1337 1337 1448 1337 1337 1448 1349 1349 1461 1350 1350 1462 1337 1337 1448 1350 1350 1462 1338 1338 1449 1338 1338 1449 1350 1350 1462 1351 1351 1463 1338 1338 1449 1351 1351 1463 1339 1339 1450 1339 1339 1450 1351 1351 1463 1352 1352 1464 1339 1339 1450 1352 1352 1464 1340 1340 1451 1340 1340 1451 1352 1352 1464 1353 1353 1465 1340 1340 1451 1353 1353 1465 1341 1341 1452 1341 1341 1452 1353 1353 1465 1354 1354 1466 1341 1341 1452 1354 1354 1466 1342 1342 1453 1342 1342 1453 1354 1354 1466 1355 1355 1467 1342 1342 1453 1355 1355 1467 1343 1343 1454 1343 1343 1454 1355 1355 1467 1344 1344 1468 1343 1343 1454 1344 1344 1468 1332 1332 1455 1344 1344 1456 1356 1356 1469 1357 1357 1470 1344 1344 1456 1357 1357 1470 1345 1345 1457 1345 1345 1457 1357 1357 1470 1358 1358 1471 1345 1345 1457 1358 1358 1471 1346 1346 1458 1346 1346 1458 1358 1358 1471 1359 1359 1472 1346 1346 1458 1359 1359 1472 1347 1347 1459 1347 1347 1459 1359 1359 1472 1360 1360 1473 1347 1347 1459 1360 1360 1473 1348 1348 1460 1348 1348 1460 1360 1360 1473 1361 1361 1474 1348 1348 1460 1361 1361 1474 1349 1349 1461 1349 1349 1461 1361 1361 1474 1362 1362 1475 1349 1349 1461 1362 1362 1475 1350 1350 1462 1350 1350 1462 1362 1362 1475 1363 1363 1476 1350 1350 1462 1363 1363 1476 1351 1351 1463 1351 1351 1463 1363 1363 1476 1364 1364 1477 1351 1351 1463 1364 1364 1477 1352 1352 1464 1352 1352 1464 1364 1364 1477 1365 1365 1478 1352 1352 1464 1365 1365 1478 1353 1353 1465 1353 1353 1465 1365 1365 1478 1366 1366 1479 1353 1353 1465 1366 1366 1479 1354 1354 1466 1354 1354 1466 1366 1366 1479 1367 1367 1480 1354 1354 1466 1367 1367 1480 1355 1355 1467 1355 1355 1467 1367 1367 1480 1356 1356 1481 1355 1355 1467 1356 1356 1481 1344 1344 1468 1356 1356 1469 1368 1368 1482 1369 1369 1483 1356 1356 1469 1369 1369 1483 1357 1357 1470 1357 1357 1470 1369 1369 1483 1370 1370 1484 1357 1357 1470 1370 1370 1484 1358 1358 1471 1358 1358 1471 1370 1370 1484 1371 1371 1485 1358 1358 1471 1371 1371 1485 1359 1359 1472 1359 1359 1472 1371 1371 1485 1372 1372 1486 1359 1359 1472 1372 1372 1486 1360 1360 1473 1360 1360 1473 1372 1372 1486 1373 1373 1487 1360 1360 1473 1373 1373 1487 1361 1361 1474 1361 1361 1474 1373 1373 1487 1374 1374 1488 1361 1361 1474 1374 1374 1488 1362 1362 1475 1362 1362 1475 1374 1374 1488 1375 1375 1489 1362 1362 1475 1375 1375 1489 1363 1363 1476 1363 1363 1476 1375 1375 1489 1376 1376 1490 1363 1363 1476 1376 1376 1490 1364 1364 1477 1364 1364 1477 1376 1376 1490 1377 1377 1491 1364 1364 1477 1377 1377 1491 1365 1365 1478 1365 1365 1478 1377 1377 1491 1378 1378 1492 1365 1365 1478 1378 1378 1492 1366 1366 1479 1366 1366 1479 1378 1378 1492 1379 1379 1493 1366 1366 1479 1379 1379 1493 1367 1367 1480 1367 1367 1480 1379 1379 1493 1368 1368 1494 1367 1367 1480 1368 1368 1494 1356 1356 1481 1368 1368 1482 1380 1380 1495 1381 1381 1496 1368 1368 1482 1381 1381 1496 1369 1369 1483 1369 1369 1483 1381 1381 1496 1382 1382 1497 1369 1369 1483 1382 1382 1497 1370 1370 1484 1370 1370 1484 1382 1382 1497 1383 1383 1498 1370 1370 1484 1383 1383 1498 1371 1371 1485 1371 1371 1485 1383 1383 1498 1384 1384 1499 1371 1371 1485 1384 1384 1499 1372 1372 1486 1372 1372 1486 1384 1384 1499 1385 1385 1500 1372 1372 1486 1385 1385 1500 1373 1373 1487 1373 1373 1487 1385 1385 1500 1386 1386 1501 1373 1373 1487 1386 1386 1501 1374 1374 1488 1374 1374 1488 1386 1386 1501 1387 1387 1502 1374 1374 1488 1387 1387 1502 1375 1375 1489 1375 1375 1489 1387 1387 1502 1388 1388 1503 1375 1375 1489 1388 1388 1503 1376 1376 1490 1376 1376 1490 1388 1388 1503 1389 1389 1504 1376 1376 1490 1389 1389 1504 1377 1377 1491 1377 1377 1491 1389 1389 1504 1390 1390 1505 1377 1377 1491 1390 1390 1505 1378 1378 1492 1378 1378 1492 1390 1390 1505 1391 1391 1506 1378 1378 1492 1391 1391 1506 1379 1379 1493 1379 1379 1493 1391 1391 1506 1380 1380 1507 1379 1379 1493 1380 1380 1507 1368 1368 1494 1380 1380 1495 1392 1392 1508 1393 1393 1509 1380 1380 1495 1393 1393 1509 1381 1381 1496 1381 1381 1496 1393 1393 1509 1394 1394 1510 1381 1381 1496 1394 1394 1510 1382 1382 1497 1382 1382 1497 1394 1394 1510 1395 1395 1511 1382 1382 1497 1395 1395 1511 1383 1383 1498 1383 1383 1498 1395 1395 1511 1396 1396 1512 1383 1383 1498 1396 1396 1512 1384 1384 1499 1384 1384 1499 1396 1396 1512 1397 1397 1513 1384 1384 1499 1397 1397 1513 1385 1385 1500 1385 1385 1500 1397 1397 1513 1398 1398 1514 1385 1385 1500 1398 1398 1514 1386 1386 1501 1386 1386 1501 1398 1398 1514 1399 1399 1515 1386 1386 1501 1399 1399 1515 1387 1387 1502 1387 1387 1502 1399 1399 1515 1400 1400 1516 1387 1387 1502 1400 1400 1516 1388 1388 1503 1388 1388 1503 1400 1400 1516 1401 1401 1517 1388 1388 1503 1401 1401 1517 1389 1389 1504 1389 1389 1504 1401 1401 1517 1402 1402 1518 1389 1389 1504 1402 1402 1518 1390 1390 1505 1390 1390 1505 1402 1402 1518 1403 1403 1519 1390 1390 1505 1403 1403 1519 1391 1391 1506 1391 1391 1506 1403 1403 1519 1392 1392 1520 1391 1391 1506 1392 1392 1520 1380 1380 1507 1392 1392 1508 1404 1404 1521 1405 1405 1522 1392 1392 1508 1405 1405 1522 1393 1393 1509 1393 1393 1509 1405 1405 1522 1406 1406 1523 1393 1393 1509 1406 1406 1523 1394 1394 1510 1394 1394 1510 1406 1406 1523 1407 1407 1524 1394 1394 1510 1407 1407 1524 1395 1395 1511 1395 1395 1511 1407 1407 1524 1408 1408 1525 1395 1395 1511 1408 1408 1525 1396 1396 1512 1396 1396 1512 1408 1408 1525 1409 1409 1526 1396 1396 1512 1409 1409 1526 1397 1397 1513 1397 1397 1513 1409 1409 1526 1410 1410 1527 1397 1397 1513 1410 1410 1527 1398 1398 1514 1398 1398 1514 1410 1410 1527 1411 1411 1528 1398 1398 1514 1411 1411 1528 1399 1399 1515 1399 1399 1515 1411 1411 1528 1412 1412 1529 1399 1399 1515 1412 1412 1529 1400 1400 1516 1400 1400 1516 1412 1412 1529 1413 1413 1530 1400 1400 1516 1413 1413 1530 1401 1401 1517 1401 1401 1517 1413 1413 1530 1414 1414 1531 1401 1401 1517 1414 1414 1531 1402 1402 1518 1402 1402 1518 1414 1414 1531 1415 1415 1532 1402 1402 1518 1415 1415 1532 1403 1403 1519 1403 1403 1519 1415 1415 1532 1404 1404 1533 1403 1403 1519 1404 1404 1533 1392 1392 1520 1404 1404 1521 1416 1416 1534 1417 1417 1535 1404 1404 1521 1417 1417 1535 1405 1405 1522 1405 1405 1522 1417 1417 1535 1418 1418 1536 1405 1405 1522 1418 1418 1536 1406 1406 1523 1406 1406 1523 1418 1418 1536 1419 1419 1537 1406 1406 1523 1419 1419 1537 1407 1407 1524 1407 1407 1524 1419 1419 1537 1420 1420 1538 1407 1407 1524 1420 1420 1538 1408 1408 1525 1408 1408 1525 1420 1420 1538 1421 1421 1539 1408 1408 1525 1421 1421 1539 1409 1409 1526 1409 1409 1526 1421 1421 1539 1422 1422 1540 1409 1409 1526 1422 1422 1540 1410 1410 1527 1410 1410 1527 1422 1422 1540 1423 1423 1541 1410 1410 1527 1423 1423 1541 1411 1411 1528 1411 1411 1528 1423 1423 1541 1424 1424 1542 1411 1411 1528 1424 1424 1542 1412 1412 1529 1412 1412 1529 1424 1424 1542 1425 1425 1543 1412 1412 1529 1425 1425 1543 1413 1413 1530 1413 1413 1530 1425 1425 1543 1426 1426 1544 1413 1413 1530 1426 1426 1544 1414 1414 1531 1414 1414 1531 1426 1426 1544 1427 1427 1545 1414 1414 1531 1427 1427 1545 1415 1415 1532 1415 1415 1532 1427 1427 1545 1416 1416 1546 1415 1415 1532 1416 1416 1546 1404 1404 1533 1416 1416 1534 1428 1428 1547 1429 1429 1548 1416 1416 1534 1429 1429 1548 1417 1417 1535 1417 1417 1535 1429 1429 1548 1430 1430 1549 1417 1417 1535 1430 1430 1549 1418 1418 1536 1418 1418 1536 1430 1430 1549 1431 1431 1550 1418 1418 1536 1431 1431 1550 1419 1419 1537 1419 1419 1537 1431 1431 1550 1432 1432 1551 1419 1419 1537 1432 1432 1551 1420 1420 1538 1420 1420 1538 1432 1432 1551 1433 1433 1552 1420 1420 1538 1433 1433 1552 1421 1421 1539 1421 1421 1539 1433 1433 1552 1434 1434 1553 1421 1421 1539 1434 1434 1553 1422 1422 1540 1422 1422 1540 1434 1434 1553 1435 1435 1554 1422 1422 1540 1435 1435 1554 1423 1423 1541 1423 1423 1541 1435 1435 1554 1436 1436 1555 1423 1423 1541 1436 1436 1555 1424 1424 1542 1424 1424 1542 1436 1436 1555 1437 1437 1556 1424 1424 1542 1437 1437 1556 1425 1425 1543 1425 1425 1543 1437 1437 1556 1438 1438 1557 1425 1425 1543 1438 1438 1557 1426 1426 1544 1426 1426 1544 1438 1438 1557 1439 1439 1558 1426 1426 1544 1439 1439 1558 1427 1427 1545 1427 1427 1545 1439 1439 1558 1428 1428 1559 1427 1427 1545 1428 1428 1559 1416 1416 1546 1428 1428 1547 1440 1440 1560 1441 1441 1561 1428 1428 1547 1441 1441 1561 1429 1429 1548 1429 1429 1548 1441 1441 1561 1442 1442 1562 1429 1429 1548 1442 1442 1562 1430 1430 1549 1430 1430 1549 1442 1442 1562 1443 1443 1563 1430 1430 1549 1443 1443 1563 1431 1431 1550 1431 1431 1550 1443 1443 1563 1444 1444 1564 1431 1431 1550 1444 1444 1564 1432 1432 1551 1432 1432 1551 1444 1444 1564 1445 1445 1565 1432 1432 1551 1445 1445 1565 1433 1433 1552 1433 1433 1552 1445 1445 1565 1446 1446 1566 1433 1433 1552 1446 1446 1566 1434 1434 1553 1434 1434 1553 1446 1446 1566 1447 1447 1567 1434 1434 1553 1447 1447 1567 1435 1435 1554 1435 1435 1554 1447 1447 1567 1448 1448 1568 1435 1435 1554 1448 1448 1568 1436 1436 1555 1436 1436 1555 1448 1448 1568 1449 1449 1569 1436 1436 1555 1449 1449 1569 1437 1437 1556 1437 1437 1556 1449 1449 1569 1450 1450 1570 1437 1437 1556 1450 1450 1570 1438 1438 1557 1438 1438 1557 1450 1450 1570 1451 1451 1571 1438 1438 1557 1451 1451 1571 1439 1439 1558 1439 1439 1558 1451 1451 1571 1440 1440 1572 1439 1439 1558 1440 1440 1572 1428 1428 1559 1440 1440 1560 1452 1452 1573 1453 1453 1574 1440 1440 1560 1453 1453 1574 1441 1441 1561 1441 1441 1561 1453 1453 1574 1454 1454 1575 1441 1441 1561 1454 1454 1575 1442 1442 1562 1442 1442 1562 1454 1454 1575 1455 1455 1576 1442 1442 1562 1455 1455 1576 1443 1443 1563 1443 1443 1563 1455 1455 1576 1456 1456 1577 1443 1443 1563 1456 1456 1577 1444 1444 1564 1444 1444 1564 1456 1456 1577 1457 1457 1578 1444 1444 1564 1457 1457 1578 1445 1445 1565 1445 1445 1565 1457 1457 1578 1458 1458 1579 1445 1445 1565 1458 1458 1579 1446 1446 1566 1446 1446 1566 1458 1458 1579 1459 1459 1580 1446 1446 1566 1459 1459 1580 1447 1447 1567 1447 1447 1567 1459 1459 1580 1460 1460 1581 1447 1447 1567 1460 1460 1581 1448 1448 1568 1448 1448 1568 1460 1460 1581 1461 1461 1582 1448 1448 1568 1461 1461 1582 1449 1449 1569 1449 1449 1569 1461 1461 1582 1462 1462 1583 1449 1449 1569 1462 1462 1583 1450 1450 1570 1450 1450 1570 1462 1462 1583 1463 1463 1584 1450 1450 1570 1463 1463 1584 1451 1451 1571 1451 1451 1571 1463 1463 1584 1452 1452 1585 1451 1451 1571 1452 1452 1585 1440 1440 1572 1452 1452 1573 1464 1464 1586 1465 1465 1587 1452 1452 1573 1465 1465 1587 1453 1453 1574 1453 1453 1574 1465 1465 1587 1466 1466 1588 1453 1453 1574 1466 1466 1588 1454 1454 1575 1454 1454 1575 1466 1466 1588 1467 1467 1589 1454 1454 1575 1467 1467 1589 1455 1455 1576 1455 1455 1576 1467 1467 1589 1468 1468 1590 1455 1455 1576 1468 1468 1590 1456 1456 1577 1456 1456 1577 1468 1468 1590 1469 1469 1591 1456 1456 1577 1469 1469 1591 1457 1457 1578 1457 1457 1578 1469 1469 1591 1470 1470 1592 1457 1457 1578 1470 1470 1592 1458 1458 1579 1458 1458 1579 1470 1470 1592 1471 1471 1593 1458 1458 1579 1471 1471 1593 1459 1459 1580 1459 1459 1580 1471 1471 1593 1472 1472 1594 1459 1459 1580 1472 1472 1594 1460 1460 1581 1460 1460 1581 1472 1472 1594 1473 1473 1595 1460 1460 1581 1473 1473 1595 1461 1461 1582 1461 1461 1582 1473 1473 1595 1474 1474 1596 1461 1461 1582 1474 1474 1596 1462 1462 1583 1462 1462 1583 1474 1474 1596 1475 1475 1597 1462 1462 1583 1475 1475 1597 1463 1463 1584 1463 1463 1584 1475 1475 1597 1464 1464 1598 1463 1463 1584 1464 1464 1598 1452 1452 1585 1464 1464 1586 1476 1476 1599 1477 1477 1600 1464 1464 1586 1477 1477 1600 1465 1465 1587 1465 1465 1587 1477 1477 1600 1478 1478 1601 1465 1465 1587 1478 1478 1601 1466 1466 1588 1466 1466 1588 1478 1478 1601 1479 1479 1602 1466 1466 1588 1479 1479 1602 1467 1467 1589 1467 1467 1589 1479 1479 1602 1480 1480 1603 1467 1467 1589 1480 1480 1603 1468 1468 1590 1468 1468 1590 1480 1480 1603 1481 1481 1604 1468 1468 1590 1481 1481 1604 1469 1469 1591 1469 1469 1591 1481 1481 1604 1482 1482 1605 1469 1469 1591 1482 1482 1605 1470 1470 1592 1470 1470 1592 1482 1482 1605 1483 1483 1606 1470 1470 1592 1483 1483 1606 1471 1471 1593 1471 1471 1593 1483 1483 1606 1484 1484 1607 1471 1471 1593 1484 1484 1607 1472 1472 1594 1472 1472 1594 1484 1484 1607 1485 1485 1608 1472 1472 1594 1485 1485 1608 1473 1473 1595 1473 1473 1595 1485 1485 1608 1486 1486 1609 1473 1473 1595 1486 1486 1609 1474 1474 1596 1474 1474 1596 1486 1486 1609 1487 1487 1610 1474 1474 1596 1487 1487 1610 1475 1475 1597 1475 1475 1597 1487 1487 1610 1476 1476 1611 1475 1475 1597 1476 1476 1611 1464 1464 1598 1476 1476 1599 1488 1488 1612 1489 1489 1613 1476 1476 1599 1489 1489 1613 1477 1477 1600 1477 1477 1600 1489 1489 1613 1490 1490 1614 1477 1477 1600 1490 1490 1614 1478 1478 1601 1478 1478 1601 1490 1490 1614 1491 1491 1615 1478 1478 1601 1491 1491 1615 1479 1479 1602 1479 1479 1602 1491 1491 1615 1492 1492 1616 1479 1479 1602 1492 1492 1616 1480 1480 1603 1480 1480 1603 1492 1492 1616 1493 1493 1617 1480 1480 1603 1493 1493 1617 1481 1481 1604 1481 1481 1604 1493 1493 1617 1494 1494 1618 1481 1481 1604 1494 1494 1618 1482 1482 1605 1482 1482 1605 1494 1494 1618 1495 1495 1619 1482 1482 1605 1495 1495 1619 1483 1483 1606 1483 1483 1606 1495 1495 1619 1496 1496 1620 1483 1483 1606 1496 1496 1620 1484 1484 1607 1484 1484 1607 1496 1496 1620 1497 1497 1621 1484 1484 1607 1497 1497 1621 1485 1485 1608 1485 1485 1608 1497 1497 1621 1498 1498 1622 1485 1485 1608 1498 1498 1622 1486 1486 1609 1486 1486 1609 1498 1498 1622 1499 1499 1623 1486 1486 1609 1499 1499 1623 1487 1487 1610 1487 1487 1610 1499 1499 1623 1488 1488 1624 1487 1487 1610 1488 1488 1624 1476 1476 1611 1488 1488 1612 1500 1500 1625 1501 1501 1626 1488 1488 1612 1501 1501 1626 1489 1489 1613 1489 1489 1613 1501 1501 1626 1502 1502 1627 1489 1489 1613 1502 1502 1627 1490 1490 1614 1490 1490 1614 1502 1502 1627 1503 1503 1628 1490 1490 1614 1503 1503 1628 1491 1491 1615 1491 1491 1615 1503 1503 1628 1504 1504 1629 1491 1491 1615 1504 1504 1629 1492 1492 1616 1492 1492 1616 1504 1504 1629 1505 1505 1630 1492 1492 1616 1505 1505 1630 1493 1493 1617 1493 1493 1617 1505 1505 1630 1506 1506 1631 1493 1493 1617 1506 1506 1631 1494 1494 1618 1494 1494 1618 1506 1506 1631 1507 1507 1632 1494 1494 1618 1507 1507 1632 1495 1495 1619 1495 1495 1619 1507 1507 1632 1508 1508 1633 1495 1495 1619 1508 1508 1633 1496 1496 1620 1496 1496 1620 1508 1508 1633 1509 1509 1634 1496 1496 1620 1509 1509 1634 1497 1497 1621 1497 1497 1621 1509 1509 1634 1510 1510 1635 1497 1497 1621 1510 1510 1635 1498 1498 1622 1498 1498 1622 1510 1510 1635 1511 1511 1636 1498 1498 1622 1511 1511 1636 1499 1499 1623 1499 1499 1623 1511 1511 1636 1500 1500 1637 1499 1499 1623 1500 1500 1637 1488 1488 1624 1500 1500 1625 1512 1512 1638 1513 1513 1639 1500 1500 1625 1513 1513 1639 1501 1501 1626 1501 1501 1626 1513 1513 1639 1514 1514 1640 1501 1501 1626 1514 1514 1640 1502 1502 1627 1502 1502 1627 1514 1514 1640 1515 1515 1641 1502 1502 1627 1515 1515 1641 1503 1503 1628 1503 1503 1628 1515 1515 1641 1516 1516 1642 1503 1503 1628 1516 1516 1642 1504 1504 1629 1504 1504 1629 1516 1516 1642 1517 1517 1643 1504 1504 1629 1517 1517 1643 1505 1505 1630 1505 1505 1630 1517 1517 1643 1518 1518 1644 1505 1505 1630 1518 1518 1644 1506 1506 1631 1506 1506 1631 1518 1518 1644 1519 1519 1645 1506 1506 1631 1519 1519 1645 1507 1507 1632 1507 1507 1632 1519 1519 1645 1520 1520 1646 1507 1507 1632 1520 1520 1646 1508 1508 1633 1508 1508 1633 1520 1520 1646 1521 1521 1647 1508 1508 1633 1521 1521 1647 1509 1509 1634 1509 1509 1634 1521 1521 1647 1522 1522 1648 1509 1509 1634 1522 1522 1648 1510 1510 1635 1510 1510 1635 1522 1522 1648 1523 1523 1649 1510 1510 1635 1523 1523 1649 1511 1511 1636 1511 1511 1636 1523 1523 1649 1512 1512 1650 1511 1511 1636 1512 1512 1650 1500 1500 1637 1512 1512 1638 1524 1524 1651 1525 1525 1652 1512 1512 1638 1525 1525 1652 1513 1513 1639 1513 1513 1639 1525 1525 1652 1526 1526 1653 1513 1513 1639 1526 1526 1653 1514 1514 1640 1514 1514 1640 1526 1526 1653 1527 1527 1654 1514 1514 1640 1527 1527 1654 1515 1515 1641 1515 1515 1641 1527 1527 1654 1528 1528 1655 1515 1515 1641 1528 1528 1655 1516 1516 1642 1516 1516 1642 1528 1528 1655 1529 1529 1656 1516 1516 1642 1529 1529 1656 1517 1517 1643 1517 1517 1643 1529 1529 1656 1530 1530 1657 1517 1517 1643 1530 1530 1657 1518 1518 1644 1518 1518 1644 1530 1530 1657 1531 1531 1658 1518 1518 1644 1531 1531 1658 1519 1519 1645 1519 1519 1645 1531 1531 1658 1532 1532 1659 1519 1519 1645 1532 1532 1659 1520 1520 1646 1520 1520 1646 1532 1532 1659 1533 1533 1660 1520 1520 1646 1533 1533 1660 1521 1521 1647 1521 1521 1647 1533 1533 1660 1534 1534 1661 1521 1521 1647 1534 1534 1661 1522 1522 1648 1522 1522 1648 1534 1534 1661 1535 1535 1662 1522 1522 1648 1535 1535 1662 1523 1523 1649 1523 1523 1649 1535 1535 1662 1524 1524 1663 1523 1523 1649 1524 1524 1663 1512 1512 1650 1524 1524 1651 1536 1536 1664 1537 1537 1665 1524 1524 1651 1537 1537 1665 1525 1525 1652 1525 1525 1652 1537 1537 1665 1538 1538 1666 1525 1525 1652 1538 1538 1666 1526 1526 1653 1526 1526 1653 1538 1538 1666 1539 1539 1667 1526 1526 1653 1539 1539 1667 1527 1527 1654 1527 1527 1654 1539 1539 1667 1540 1540 1668 1527 1527 1654 1540 1540 1668 1528 1528 1655 1528 1528 1655 1540 1540 1668 1541 1541 1669 1528 1528 1655 1541 1541 1669 1529 1529 1656 1529 1529 1656 1541 1541 1669 1542 1542 1670 1529 1529 1656 1542 1542 1670 1530 1530 1657 1530 1530 1657 1542 1542 1670 1543 1543 1671 1530 1530 1657 1543 1543 1671 1531 1531 1658 1531 1531 1658 1543 1543 1671 1544 1544 1672 1531 1531 1658 1544 1544 1672 1532 1532 1659 1532 1532 1659 1544 1544 1672 1545 1545 1673 1532 1532 1659 1545 1545 1673 1533 1533 1660 1533 1533 1660 1545 1545 1673 1546 1546 1674 1533 1533 1660 1546 1546 1674 1534 1534 1661 1534 1534 1661 1546 1546 1674 1547 1547 1675 1534 1534 1661 1547 1547 1675 1535 1535 1662 1535 1535 1662 1547 1547 1675 1536 1536 1676 1535 1535 1662 1536 1536 1676 1524 1524 1663 1536 1536 1664 1548 1548 1677 1549 1549 1678 1536 1536 1664 1549 1549 1678 1537 1537 1665 1537 1537 1665 1549 1549 1678 1550 1550 1679 1537 1537 1665 1550 1550 1679 1538 1538 1666 1538 1538 1666 1550 1550 1679 1551 1551 1680 1538 1538 1666 1551 1551 1680 1539 1539 1667 1539 1539 1667 1551 1551 1680 1552 1552 1681 1539 1539 1667 1552 1552 1681 1540 1540 1668 1540 1540 1668 1552 1552 1681 1553 1553 1682 1540 1540 1668 1553 1553 1682 1541 1541 1669 1541 1541 1669 1553 1553 1682 1554 1554 1683 1541 1541 1669 1554 1554 1683 1542 1542 1670 1542 1542 1670 1554 1554 1683 1555 1555 1684 1542 1542 1670 1555 1555 1684 1543 1543 1671 1543 1543 1671 1555 1555 1684 1556 1556 1685 1543 1543 1671 1556 1556 1685 1544 1544 1672 1544 1544 1672 1556 1556 1685 1557 1557 1686 1544 1544 1672 1557 1557 1686 1545 1545 1673 1545 1545 1673 1557 1557 1686 1558 1558 1687 1545 1545 1673 1558 1558 1687 1546 1546 1674 1546 1546 1674 1558 1558 1687 1559 1559 1688 1546 1546 1674 1559 1559 1688 1547 1547 1675 1547 1547 1675 1559 1559 1688 1548 1548 1689 1547 1547 1675 1548 1548 1689 1536 1536 1676 1548 1548 1677 1560 1560 1690 1561 1561 1691 1548 1548 1677 1561 1561 1691 1549 1549 1678 1549 1549 1678 1561 1561 1691 1562 1562 1692 1549 1549 1678 1562 1562 1692 1550 1550 1679 1550 1550 1679 1562 1562 1692 1563 1563 1693 1550 1550 1679 1563 1563 1693 1551 1551 1680 1551 1551 1680 1563 1563 1693 1564 1564 1694 1551 1551 1680 1564 1564 1694 1552 1552 1681 1552 1552 1681 1564 1564 1694 1565 1565 1695 1552 1552 1681 1565 1565 1695 1553 1553 1682 1553 1553 1682 1565 1565 1695 1566 1566 1696 1553 1553 1682 1566 1566 1696 1554 1554 1683 1554 1554 1683 1566 1566 1696 1567 1567 1697 1554 1554 1683 1567 1567 1697 1555 1555 1684 1555 1555 1684 1567 1567 1697 1568 1568 1698 1555 1555 1684 1568 1568 1698 1556 1556 1685 1556 1556 1685 1568 1568 1698 1569 1569 1699 1556 1556 1685 1569 1569 1699 1557 1557 1686 1557 1557 1686 1569 1569 1699 1570 1570 1700 1557 1557 1686 1570 1570 1700 1558 1558 1687 1558 1558 1687 1570 1570 1700 1571 1571 1701 1558 1558 1687 1571 1571 1701 1559 1559 1688 1559 1559 1688 1571 1571 1701 1560 1560 1702 1559 1559 1688 1560 1560 1702 1548 1548 1689 1560 1560 1690 1572 1572 1703 1573 1573 1704 1560 1560 1690 1573 1573 1704 1561 1561 1691 1561 1561 1691 1573 1573 1704 1574 1574 1705 1561 1561 1691 1574 1574 1705 1562 1562 1692 1562 1562 1692 1574 1574 1705 1575 1575 1706 1562 1562 1692 1575 1575 1706 1563 1563 1693 1563 1563 1693 1575 1575 1706 1576 1576 1707 1563 1563 1693 1576 1576 1707 1564 1564 1694 1564 1564 1694 1576 1576 1707 1577 1577 1708 1564 1564 1694 1577 1577 1708 1565 1565 1695 1565 1565 1695 1577 1577 1708 1578 1578 1709 1565 1565 1695 1578 1578 1709 1566 1566 1696 1566 1566 1696 1578 1578 1709 1579 1579 1710 1566 1566 1696 1579 1579 1710 1567 1567 1697 1567 1567 1697 1579 1579 1710 1580 1580 1711 1567 1567 1697 1580 1580 1711 1568 1568 1698 1568 1568 1698 1580 1580 1711 1581 1581 1712 1568 1568 1698 1581 1581 1712 1569 1569 1699 1569 1569 1699 1581 1581 1712 1582 1582 1713 1569 1569 1699 1582 1582 1713 1570 1570 1700 1570 1570 1700 1582 1582 1713 1583 1583 1714 1570 1570 1700 1583 1583 1714 1571 1571 1701 1571 1571 1701 1583 1583 1714 1572 1572 1715 1571 1571 1701 1572 1572 1715 1560 1560 1702 1572 1572 1703 1584 1584 1716 1585 1585 1717 1572 1572 1703 1585 1585 1717 1573 1573 1704 1573 1573 1704 1585 1585 1717 1586 1586 1718 1573 1573 1704 1586 1586 1718 1574 1574 1705 1574 1574 1705 1586 1586 1718 1587 1587 1719 1574 1574 1705 1587 1587 1719 1575 1575 1706 1575 1575 1706 1587 1587 1719 1588 1588 1720 1575 1575 1706 1588 1588 1720 1576 1576 1707 1576 1576 1707 1588 1588 1720 1589 1589 1721 1576 1576 1707 1589 1589 1721 1577 1577 1708 1577 1577 1708 1589 1589 1721 1590 1590 1722 1577 1577 1708 1590 1590 1722 1578 1578 1709 1578 1578 1709 1590 1590 1722 1591 1591 1723 1578 1578 1709 1591 1591 1723 1579 1579 1710 1579 1579 1710 1591 1591 1723 1592 1592 1724 1579 1579 1710 1592 1592 1724 1580 1580 1711 1580 1580 1711 1592 1592 1724 1593 1593 1725 1580 1580 1711 1593 1593 1725 1581 1581 1712 1581 1581 1712 1593 1593 1725 1594 1594 1726 1581 1581 1712 1594 1594 1726 1582 1582 1713 1582 1582 1713 1594 1594 1726 1595 1595 1727 1582 1582 1713 1595 1595 1727 1583 1583 1714 1583 1583 1714 1595 1595 1727 1584 1584 1728 1583 1583 1714 1584 1584 1728 1572 1572 1715 1584 1584 1716 1596 1596 1729 1597 1597 1730 1584 1584 1716 1597 1597 1730 1585 1585 1717 1585 1585 1717 1597 1597 1730 1598 1598 1731 1585 1585 1717 1598 1598 1731 1586 1586 1718 1586 1586 1718 1598 1598 1731 1599 1599 1732 1586 1586 1718 1599 1599 1732 1587 1587 1719 1587 1587 1719 1599 1599 1732 1600 1600 1733 1587 1587 1719 1600 1600 1733 1588 1588 1720 1588 1588 1720 1600 1600 1733 1601 1601 1734 1588 1588 1720 1601 1601 1734 1589 1589 1721 1589 1589 1721 1601 1601 1734 1602 1602 1735 1589 1589 1721 1602 1602 1735 1590 1590 1722 1590 1590 1722 1602 1602 1735 1603 1603 1736 1590 1590 1722 1603 1603 1736 1591 1591 1723 1591 1591 1723 1603 1603 1736 1604 1604 1737 1591 1591 1723 1604 1604 1737 1592 1592 1724 1592 1592 1724 1604 1604 1737 1605 1605 1738 1592 1592 1724 1605 1605 1738 1593 1593 1725 1593 1593 1725 1605 1605 1738 1606 1606 1739 1593 1593 1725 1606 1606 1739 1594 1594 1726 1594 1594 1726 1606 1606 1739 1607 1607 1740 1594 1594 1726 1607 1607 1740 1595 1595 1727 1595 1595 1727 1607 1607 1740 1596 1596 1741 1595 1595 1727 1596 1596 1741 1584 1584 1728 1596 1596 1729 1608 1608 1742 1609 1609 1743 1596 1596 1729 1609 1609 1743 1597 1597 1730 1597 1597 1730 1609 1609 1743 1610 1610 1744 1597 1597 1730 1610 1610 1744 1598 1598 1731 1598 1598 1731 1610 1610 1744 1611 1611 1745 1598 1598 1731 1611 1611 1745 1599 1599 1732 1599 1599 1732 1611 1611 1745 1612 1612 1746 1599 1599 1732 1612 1612 1746 1600 1600 1733 1600 1600 1733 1612 1612 1746 1613 1613 1747 1600 1600 1733 1613 1613 1747 1601 1601 1734 1601 1601 1734 1613 1613 1747 1614 1614 1748 1601 1601 1734 1614 1614 1748 1602 1602 1735 1602 1602 1735 1614 1614 1748 1615 1615 1749 1602 1602 1735 1615 1615 1749 1603 1603 1736 1603 1603 1736 1615 1615 1749 1616 1616 1750 1603 1603 1736 1616 1616 1750 1604 1604 1737 1604 1604 1737 1616 1616 1750 1617 1617 1751 1604 1604 1737 1617 1617 1751 1605 1605 1738 1605 1605 1738 1617 1617 1751 1618 1618 1752 1605 1605 1738 1618 1618 1752 1606 1606 1739 1606 1606 1739 1618 1618 1752 1619 1619 1753 1606 1606 1739 1619 1619 1753 1607 1607 1740 1607 1607 1740 1619 1619 1753 1608 1608 1754 1607 1607 1740 1608 1608 1754 1596 1596 1741 1608 1608 1742 1620 1620 1755 1621 1621 1756 1608 1608 1742 1621 1621 1756 1609 1609 1743 1609 1609 1743 1621 1621 1756 1622 1622 1757 1609 1609 1743 1622 1622 1757 1610 1610 1744 1610 1610 1744 1622 1622 1757 1623 1623 1758 1610 1610 1744 1623 1623 1758 1611 1611 1745 1611 1611 1745 1623 1623 1758 1624 1624 1759 1611 1611 1745 1624 1624 1759 1612 1612 1746 1612 1612 1746 1624 1624 1759 1625 1625 1760 1612 1612 1746 1625 1625 1760 1613 1613 1747 1613 1613 1747 1625 1625 1760 1626 1626 1761 1613 1613 1747 1626 1626 1761 1614 1614 1748 1614 1614 1748 1626 1626 1761 1627 1627 1762 1614 1614 1748 1627 1627 1762 1615 1615 1749 1615 1615 1749 1627 1627 1762 1628 1628 1763 1615 1615 1749 1628 1628 1763 1616 1616 1750 1616 1616 1750 1628 1628 1763 1629 1629 1764 1616 1616 1750 1629 1629 1764 1617 1617 1751 1617 1617 1751 1629 1629 1764 1630 1630 1765 1617 1617 1751 1630 1630 1765 1618 1618 1752 1618 1618 1752 1630 1630 1765 1631 1631 1766 1618 1618 1752 1631 1631 1766 1619 1619 1753 1619 1619 1753 1631 1631 1766 1620 1620 1767 1619 1619 1753 1620 1620 1767 1608 1608 1754 1620 1620 1755 1632 1632 1768 1633 1633 1769 1620 1620 1755 1633 1633 1769 1621 1621 1756 1621 1621 1756 1633 1633 1769 1634 1634 1770 1621 1621 1756 1634 1634 1770 1622 1622 1757 1622 1622 1757 1634 1634 1770 1635 1635 1771 1622 1622 1757 1635 1635 1771 1623 1623 1758 1623 1623 1758 1635 1635 1771 1636 1636 1772 1623 1623 1758 1636 1636 1772 1624 1624 1759 1624 1624 1759 1636 1636 1772 1637 1637 1773 1624 1624 1759 1637 1637 1773 1625 1625 1760 1625 1625 1760 1637 1637 1773 1638 1638 1774 1625 1625 1760 1638 1638 1774 1626 1626 1761 1626 1626 1761 1638 1638 1774 1639 1639 1775 1626 1626 1761 1639 1639 1775 1627 1627 1762 1627 1627 1762 1639 1639 1775 1640 1640 1776 1627 1627 1762 1640 1640 1776 1628 1628 1763 1628 1628 1763 1640 1640 1776 1641 1641 1777 1628 1628 1763 1641 1641 1777 1629 1629 1764 1629 1629 1764 1641 1641 1777 1642 1642 1778 1629 1629 1764 1642 1642 1778 1630 1630 1765 1630 1630 1765 1642 1642 1778 1643 1643 1779 1630 1630 1765 1643 1643 1779 1631 1631 1766 1631 1631 1766 1643 1643 1779 1632 1632 1780 1631 1631 1766 1632 1632 1780 1620 1620 1767 1632 1632 1768 1644 1644 1781 1645 1645 1782 1632 1632 1768 1645 1645 1782 1633 1633 1769 1633 1633 1769 1645 1645 1782 1646 1646 1783 1633 1633 1769 1646 1646 1783 1634 1634 1770 1634 1634 1770 1646 1646 1783 1647 1647 1784 1634 1634 1770 1647 1647 1784 1635 1635 1771 1635 1635 1771 1647 1647 1784 1648 1648 1785 1635 1635 1771 1648 1648 1785 1636 1636 1772 1636 1636 1772 1648 1648 1785 1649 1649 1786 1636 1636 1772 1649 1649 1786 1637 1637 1773 1637 1637 1773 1649 1649 1786 1650 1650 1787 1637 1637 1773 1650 1650 1787 1638 1638 1774 1638 1638 1774 1650 1650 1787 1651 1651 1788 1638 1638 1774 1651 1651 1788 1639 1639 1775 1639 1639 1775 1651 1651 1788 1652 1652 1789 1639 1639 1775 1652 1652 1789 1640 1640 1776 1640 1640 1776 1652 1652 1789 1653 1653 1790 1640 1640 1776 1653 1653 1790 1641 1641 1777 1641 1641 1777 1653 1653 1790 1654 1654 1791 1641 1641 1777 1654 1654 1791 1642 1642 1778 1642 1642 1778 1654 1654 1791 1655 1655 1792 1642 1642 1778 1655 1655 1792 1643 1643 1779 1643 1643 1779 1655 1655 1792 1644 1644 1793 1643 1643 1779 1644 1644 1793 1632 1632 1780 1644 1644 1781 1656 1656 1794 1657 1657 1795 1644 1644 1781 1657 1657 1795 1645 1645 1782 1645 1645 1782 1657 1657 1795 1658 1658 1796 1645 1645 1782 1658 1658 1796 1646 1646 1783 1646 1646 1783 1658 1658 1796 1659 1659 1797 1646 1646 1783 1659 1659 1797 1647 1647 1784 1647 1647 1784 1659 1659 1797 1660 1660 1798 1647 1647 1784 1660 1660 1798 1648 1648 1785 1648 1648 1785 1660 1660 1798 1661 1661 1799 1648 1648 1785 1661 1661 1799 1649 1649 1786 1649 1649 1786 1661 1661 1799 1662 1662 1800 1649 1649 1786 1662 1662 1800 1650 1650 1787 1650 1650 1787 1662 1662 1800 1663 1663 1801 1650 1650 1787 1663 1663 1801 1651 1651 1788 1651 1651 1788 1663 1663 1801 1664 1664 1802 1651 1651 1788 1664 1664 1802 1652 1652 1789 1652 1652 1789 1664 1664 1802 1665 1665 1803 1652 1652 1789 1665 1665 1803 1653 1653 1790 1653 1653 1790 1665 1665 1803 1666 1666 1804 1653 1653 1790 1666 1666 1804 1654 1654 1791 1654 1654 1791 1666 1666 1804 1667 1667 1805 1654 1654 1791 1667 1667 1805 1655 1655 1792 1655 1655 1792 1667 1667 1805 1656 1656 1806 1655 1655 1792 1656 1656 1806 1644 1644 1793 1656 1656 1794 1668 1668 1807 1669 1669 1808 1656 1656 1794 1669 1669 1808 1657 1657 1795 1657 1657 1795 1669 1669 1808 1670 1670 1809 1657 1657 1795 1670 1670 1809 1658 1658 1796 1658 1658 1796 1670 1670 1809 1671 1671 1810 1658 1658 1796 1671 1671 1810 1659 1659 1797 1659 1659 1797 1671 1671 1810 1672 1672 1811 1659 1659 1797 1672 1672 1811 1660 1660 1798 1660 1660 1798 1672 1672 1811 1673 1673 1812 1660 1660 1798 1673 1673 1812 1661 1661 1799 1661 1661 1799 1673 1673 1812 1674 1674 1813 1661 1661 1799 1674 1674 1813 1662 1662 1800 1662 1662 1800 1674 1674 1813 1675 1675 1814 1662 1662 1800 1675 1675 1814 1663 1663 1801 1663 1663 1801 1675 1675 1814 1676 1676 1815 1663 1663 1801 1676 1676 1815 1664 1664 1802 1664 1664 1802 1676 1676 1815 1677 1677 1816 1664 1664 1802 1677 1677 1816 1665 1665 1803 1665 1665 1803 1677 1677 1816 1678 1678 1817 1665 1665 1803 1678 1678 1817 1666 1666 1804 1666 1666 1804 1678 1678 1817 1679 1679 1818 1666 1666 1804 1679 1679 1818 1667 1667 1805 1667 1667 1805 1679 1679 1818 1668 1668 1819 1667 1667 1805 1668 1668 1819 1656 1656 1806 1668 1668 1807 1680 1680 1820 1681 1681 1821 1668 1668 1807 1681 1681 1821 1669 1669 1808 1669 1669 1808 1681 1681 1821 1682 1682 1822 1669 1669 1808 1682 1682 1822 1670 1670 1809 1670 1670 1809 1682 1682 1822 1683 1683 1823 1670 1670 1809 1683 1683 1823 1671 1671 1810 1671 1671 1810 1683 1683 1823 1684 1684 1824 1671 1671 1810 1684 1684 1824 1672 1672 1811 1672 1672 1811 1684 1684 1824 1685 1685 1825 1672 1672 1811 1685 1685 1825 1673 1673 1812 1673 1673 1812 1685 1685 1825 1686 1686 1826 1673 1673 1812 1686 1686 1826 1674 1674 1813 1674 1674 1813 1686 1686 1826 1687 1687 1827 1674 1674 1813 1687 1687 1827 1675 1675 1814 1675 1675 1814 1687 1687 1827 1688 1688 1828 1675 1675 1814 1688 1688 1828 1676 1676 1815 1676 1676 1815 1688 1688 1828 1689 1689 1829 1676 1676 1815 1689 1689 1829 1677 1677 1816 1677 1677 1816 1689 1689 1829 1690 1690 1830 1677 1677 1816 1690 1690 1830 1678 1678 1817 1678 1678 1817 1690 1690 1830 1691 1691 1831 1678 1678 1817 1691 1691 1831 1679 1679 1818 1679 1679 1818 1691 1691 1831 1680 1680 1832 1679 1679 1818 1680 1680 1832 1668 1668 1819 1680 1680 1820 1692 1692 1833 1693 1693 1834 1680 1680 1820 1693 1693 1834 1681 1681 1821 1681 1681 1821 1693 1693 1834 1694 1694 1835 1681 1681 1821 1694 1694 1835 1682 1682 1822 1682 1682 1822 1694 1694 1835 1695 1695 1836 1682 1682 1822 1695 1695 1836 1683 1683 1823 1683 1683 1823 1695 1695 1836 1696 1696 1837 1683 1683 1823 1696 1696 1837 1684 1684 1824 1684 1684 1824 1696 1696 1837 1697 1697 1838 1684 1684 1824 1697 1697 1838 1685 1685 1825 1685 1685 1825 1697 1697 1838 1698 1698 1839 1685 1685 1825 1698 1698 1839 1686 1686 1826 1686 1686 1826 1698 1698 1839 1699 1699 1840 1686 1686 1826 1699 1699 1840 1687 1687 1827 1687 1687 1827 1699 1699 1840 1700 1700 1841 1687 1687 1827 1700 1700 1841 1688 1688 1828 1688 1688 1828 1700 1700 1841 1701 1701 1842 1688 1688 1828 1701 1701 1842 1689 1689 1829 1689 1689 1829 1701 1701 1842 1702 1702 1843 1689 1689 1829 1702 1702 1843 1690 1690 1830 1690 1690 1830 1702 1702 1843 1703 1703 1844 1690 1690 1830 1703 1703 1844 1691 1691 1831 1691 1691 1831 1703 1703 1844 1692 1692 1845 1691 1691 1831 1692 1692 1845 1680 1680 1832 1692 1692 1833 1704 1704 1846 1705 1705 1847 1692 1692 1833 1705 1705 1847 1693 1693 1834 1693 1693 1834 1705 1705 1847 1706 1706 1848 1693 1693 1834 1706 1706 1848 1694 1694 1835 1694 1694 1835 1706 1706 1848 1707 1707 1849 1694 1694 1835 1707 1707 1849 1695 1695 1836 1695 1695 1836 1707 1707 1849 1708 1708 1850 1695 1695 1836 1708 1708 1850 1696 1696 1837 1696 1696 1837 1708 1708 1850 1709 1709 1851 1696 1696 1837 1709 1709 1851 1697 1697 1838 1697 1697 1838 1709 1709 1851 1710 1710 1852 1697 1697 1838 1710 1710 1852 1698 1698 1839 1698 1698 1839 1710 1710 1852 1711 1711 1853 1698 1698 1839 1711 1711 1853 1699 1699 1840 1699 1699 1840 1711 1711 1853 1712 1712 1854 1699 1699 1840 1712 1712 1854 1700 1700 1841 1700 1700 1841 1712 1712 1854 1713 1713 1855 1700 1700 1841 1713 1713 1855 1701 1701 1842 1701 1701 1842 1713 1713 1855 1714 1714 1856 1701 1701 1842 1714 1714 1856 1702 1702 1843 1702 1702 1843 1714 1714 1856 1715 1715 1857 1702 1702 1843 1715 1715 1857 1703 1703 1844 1703 1703 1844 1715 1715 1857 1704 1704 1858 1703 1703 1844 1704 1704 1858 1692 1692 1845 1704 1704 1846 1716 1716 1859 1717 1717 1860 1704 1704 1846 1717 1717 1860 1705 1705 1847 1705 1705 1847 1717 1717 1860 1718 1718 1861 1705 1705 1847 1718 1718 1861 1706 1706 1848 1706 1706 1848 1718 1718 1861 1719 1719 1862 1706 1706 1848 1719 1719 1862 1707 1707 1849 1707 1707 1849 1719 1719 1862 1720 1720 1863 1707 1707 1849 1720 1720 1863 1708 1708 1850 1708 1708 1850 1720 1720 1863 1721 1721 1864 1708 1708 1850 1721 1721 1864 1709 1709 1851 1709 1709 1851 1721 1721 1864 1722 1722 1865 1709 1709 1851 1722 1722 1865 1710 1710 1852 1710 1710 1852 1722 1722 1865 1723 1723 1866 1710 1710 1852 1723 1723 1866 1711 1711 1853 1711 1711 1853 1723 1723 1866 1724 1724 1867 1711 1711 1853 1724 1724 1867 1712 1712 1854 1712 1712 1854 1724 1724 1867 1725 1725 1868 1712 1712 1854 1725 1725 1868 1713 1713 1855 1713 1713 1855 1725 1725 1868 1726 1726 1869 1713 1713 1855 1726 1726 1869 1714 1714 1856 1714 1714 1856 1726 1726 1869 1727 1727 1870 1714 1714 1856 1727 1727 1870 1715 1715 1857 1715 1715 1857 1727 1727 1870 1716 1716 1871 1715 1715 1857 1716 1716 1871 1704 1704 1858 1716 1716 1859 1728 1728 1872 1729 1729 1873 1716 1716 1859 1729 1729 1873 1717 1717 1860 1717 1717 1860 1729 1729 1873 1730 1730 1874 1717 1717 1860 1730 1730 1874 1718 1718 1861 1718 1718 1861 1730 1730 1874 1731 1731 1875 1718 1718 1861 1731 1731 1875 1719 1719 1862 1719 1719 1862 1731 1731 1875 1732 1732 1876 1719 1719 1862 1732 1732 1876 1720 1720 1863 1720 1720 1863 1732 1732 1876 1733 1733 1877 1720 1720 1863 1733 1733 1877 1721 1721 1864 1721 1721 1864 1733 1733 1877 1734 1734 1878 1721 1721 1864 1734 1734 1878 1722 1722 1865 1722 1722 1865 1734 1734 1878 1735 1735 1879 1722 1722 1865 1735 1735 1879 1723 1723 1866 1723 1723 1866 1735 1735 1879 1736 1736 1880 1723 1723 1866 1736 1736 1880 1724 1724 1867 1724 1724 1867 1736 1736 1880 1737 1737 1881 1724 1724 1867 1737 1737 1881 1725 1725 1868 1725 1725 1868 1737 1737 1881 1738 1738 1882 1725 1725 1868 1738 1738 1882 1726 1726 1869 1726 1726 1869 1738 1738 1882 1739 1739 1883 1726 1726 1869 1739 1739 1883 1727 1727 1870 1727 1727 1870 1739 1739 1883 1728 1728 1884 1727 1727 1870 1728 1728 1884 1716 1716 1871 1728 1728 1872 1740 1740 1885 1741 1741 1886 1728 1728 1872 1741 1741 1886 1729 1729 1873 1729 1729 1873 1741 1741 1886 1742 1742 1887 1729 1729 1873 1742 1742 1887 1730 1730 1874 1730 1730 1874 1742 1742 1887 1743 1743 1888 1730 1730 1874 1743 1743 1888 1731 1731 1875 1731 1731 1875 1743 1743 1888 1744 1744 1889 1731 1731 1875 1744 1744 1889 1732 1732 1876 1732 1732 1876 1744 1744 1889 1745 1745 1890 1732 1732 1876 1745 1745 1890 1733 1733 1877 1733 1733 1877 1745 1745 1890 1746 1746 1891 1733 1733 1877 1746 1746 1891 1734 1734 1878 1734 1734 1878 1746 1746 1891 1747 1747 1892 1734 1734 1878 1747 1747 1892 1735 1735 1879 1735 1735 1879 1747 1747 1892 1748 1748 1893 1735 1735 1879 1748 1748 1893 1736 1736 1880 1736 1736 1880 1748 1748 1893 1749 1749 1894 1736 1736 1880 1749 1749 1894 1737 1737 1881 1737 1737 1881 1749 1749 1894 1750 1750 1895 1737 1737 1881 1750 1750 1895 1738 1738 1882 1738 1738 1882 1750 1750 1895 1751 1751 1896 1738 1738 1882 1751 1751 1896 1739 1739 1883 1739 1739 1883 1751 1751 1896 1740 1740 1897 1739 1739 1883 1740 1740 1897 1728 1728 1884 1740 1740 1885 1752 1752 1898 1753 1753 1899 1740 1740 1885 1753 1753 1899 1741 1741 1886 1741 1741 1886 1753 1753 1899 1754 1754 1900 1741 1741 1886 1754 1754 1900 1742 1742 1887 1742 1742 1887 1754 1754 1900 1755 1755 1901 1742 1742 1887 1755 1755 1901 1743 1743 1888 1743 1743 1888 1755 1755 1901 1756 1756 1902 1743 1743 1888 1756 1756 1902 1744 1744 1889 1744 1744 1889 1756 1756 1902 1757 1757 1903 1744 1744 1889 1757 1757 1903 1745 1745 1890 1745 1745 1890 1757 1757 1903 1758 1758 1904 1745 1745 1890 1758 1758 1904 1746 1746 1891 1746 1746 1891 1758 1758 1904 1759 1759 1905 1746 1746 1891 1759 1759 1905 1747 1747 1892 1747 1747 1892 1759 1759 1905 1760 1760 1906 1747 1747 1892 1760 1760 1906 1748 1748 1893 1748 1748 1893 1760 1760 1906 1761 1761 1907 1748 1748 1893 1761 1761 1907 1749 1749 1894 1749 1749 1894 1761 1761 1907 1762 1762 1908 1749 1749 1894 1762 1762 1908 1750 1750 1895 1750 1750 1895 1762 1762 1908 1763 1763 1909 1750 1750 1895 1763 1763 1909 1751 1751 1896 1751 1751 1896 1763 1763 1909 1752 1752 1910 1751 1751 1896 1752 1752 1910 1740 1740 1897 1752 1752 1898 1764 1764 1911 1765 1765 1912 1752 1752 1898 1765 1765 1912 1753 1753 1899 1753 1753 1899 1765 1765 1912 1766 1766 1913 1753 1753 1899 1766 1766 1913 1754 1754 1900 1754 1754 1900 1766 1766 1913 1767 1767 1914 1754 1754 1900 1767 1767 1914 1755 1755 1901 1755 1755 1901 1767 1767 1914 1768 1768 1915 1755 1755 1901 1768 1768 1915 1756 1756 1902 1756 1756 1902 1768 1768 1915 1769 1769 1916 1756 1756 1902 1769 1769 1916 1757 1757 1903 1757 1757 1903 1769 1769 1916 1770 1770 1917 1757 1757 1903 1770 1770 1917 1758 1758 1904 1758 1758 1904 1770 1770 1917 1771 1771 1918 1758 1758 1904 1771 1771 1918 1759 1759 1905 1759 1759 1905 1771 1771 1918 1772 1772 1919 1759 1759 1905 1772 1772 1919 1760 1760 1906 1760 1760 1906 1772 1772 1919 1773 1773 1920 1760 1760 1906 1773 1773 1920 1761 1761 1907 1761 1761 1907 1773 1773 1920 1774 1774 1921 1761 1761 1907 1774 1774 1921 1762 1762 1908 1762 1762 1908 1774 1774 1921 1775 1775 1922 1762 1762 1908 1775 1775 1922 1763 1763 1909 1763 1763 1909 1775 1775 1922 1764 1764 1923 1763 1763 1909 1764 1764 1923 1752 1752 1910 1764 1764 1911 1776 1776 1924 1777 1777 1925 1764 1764 1911 1777 1777 1925 1765 1765 1912 1765 1765 1912 1777 1777 1925 1778 1778 1926 1765 1765 1912 1778 1778 1926 1766 1766 1913 1766 1766 1913 1778 1778 1926 1779 1779 1927 1766 1766 1913 1779 1779 1927 1767 1767 1914 1767 1767 1914 1779 1779 1927 1780 1780 1928 1767 1767 1914 1780 1780 1928 1768 1768 1915 1768 1768 1915 1780 1780 1928 1781 1781 1929 1768 1768 1915 1781 1781 1929 1769 1769 1916 1769 1769 1916 1781 1781 1929 1782 1782 1930 1769 1769 1916 1782 1782 1930 1770 1770 1917 1770 1770 1917 1782 1782 1930 1783 1783 1931 1770 1770 1917 1783 1783 1931 1771 1771 1918 1771 1771 1918 1783 1783 1931 1784 1784 1932 1771 1771 1918 1784 1784 1932 1772 1772 1919 1772 1772 1919 1784 1784 1932 1785 1785 1933 1772 1772 1919 1785 1785 1933 1773 1773 1920 1773 1773 1920 1785 1785 1933 1786 1786 1934 1773 1773 1920 1786 1786 1934 1774 1774 1921 1774 1774 1921 1786 1786 1934 1787 1787 1935 1774 1774 1921 1787 1787 1935 1775 1775 1922 1775 1775 1922 1787 1787 1935 1776 1776 1936 1775 1775 1922 1776 1776 1936 1764 1764 1923 1776 1776 1924 1788 1788 1937 1789 1789 1938 1776 1776 1924 1789 1789 1938 1777 1777 1925 1777 1777 1925 1789 1789 1938 1790 1790 1939 1777 1777 1925 1790 1790 1939 1778 1778 1926 1778 1778 1926 1790 1790 1939 1791 1791 1940 1778 1778 1926 1791 1791 1940 1779 1779 1927 1779 1779 1927 1791 1791 1940 1792 1792 1941 1779 1779 1927 1792 1792 1941 1780 1780 1928 1780 1780 1928 1792 1792 1941 1793 1793 1942 1780 1780 1928 1793 1793 1942 1781 1781 1929 1781 1781 1929 1793 1793 1942 1794 1794 1943 1781 1781 1929 1794 1794 1943 1782 1782 1930 1782 1782 1930 1794 1794 1943 1795 1795 1944 1782 1782 1930 1795 1795 1944 1783 1783 1931 1783 1783 1931 1795 1795 1944 1796 1796 1945 1783 1783 1931 1796 1796 1945 1784 1784 1932 1784 1784 1932 1796 1796 1945 1797 1797 1946 1784 1784 1932 1797 1797 1946 1785 1785 1933 1785 1785 1933 1797 1797 1946 1798 1798 1947 1785 1785 1933 1798 1798 1947 1786 1786 1934 1786 1786 1934 1798 1798 1947 1799 1799 1948 1786 1786 1934 1799 1799 1948 1787 1787 1935 1787 1787 1935 1799 1799 1948 1788 1788 1949 1787 1787 1935 1788 1788 1949 1776 1776 1936 1788 1788 1937 0 0 1950 1 3 1951 1788 1788 1937 1 3 1951 1789 1789 1938 1789 1789 1938 1 3 1951 2 5 1952 1789 1789 1938 2 5 1952 1790 1790 1939 1790 1790 1939 2 5 1952 3 7 1953 1790 1790 1939 3 7 1953 1791 1791 1940 1791 1791 1940 3 7 1953 4 9 1954 1791 1791 1940 4 9 1954 1792 1792 1941 1792 1792 1941 4 9 1954 5 11 1955 1792 1792 1941 5 11 1955 1793 1793 1942 1793 1793 1942 5 11 1955 6 13 1956 1793 1793 1942 6 13 1956 1794 1794 1943 1794 1794 1943 6 13 1956 7 15 1957 1794 1794 1943 7 15 1957 1795 1795 1944 1795 1795 1944 7 15 1957 8 17 1958 1795 1795 1944 8 17 1958 1796 1796 1945 1796 1796 1945 8 17 1958 9 19 1959 1796 1796 1945 9 19 1959 1797 1797 1946 1797 1797 1946 9 19 1959 10 21 1960 1797 1797 1946 10 21 1960 1798 1798 1947 1798 1798 1947 10 21 1960 11 23 1961 1798 1798 1947 11 23 1961 1799 1799 1948 1799 1799 1948 11 23 1961 0 0 1962 1799 1799 1948 0 0 1962 1788 1788 1949</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-6_max" name="Torus_Knot-6_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-6_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-7.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-7.dae
new file mode 100644
index 0000000..28641f6
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-7.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-7.max</source_data>
+ </contributor>
+ <created>2008-10-31T16:32:06Z</created>
+ <modified>2008-10-31T16:32:07Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="8640">24.084917 -0.000996 21.369627 24.291664 -0.345620 21.669147 24.391800 -0.666689 22.040779 24.378500 -0.942326 22.459192 24.252674 -1.153744 22.895876 24.022892 -1.286536 23.321068 23.704817 -1.331653 23.705795 23.320124 -1.286020 24.023838 22.895029 -1.152747 24.253519 22.458502 -0.940916 24.379190 22.040291 -0.664964 24.392288 21.668896 -0.343695 24.291916 21.369627 0.000996 24.084917 21.162880 0.345619 23.785397 21.062744 0.666689 23.413765 21.076044 0.942325 22.995354 21.201870 1.153743 22.558670 21.431652 1.286536 22.133478 21.749727 1.331653 21.748749 22.134420 1.286020 21.430708 22.559515 1.152748 21.201025 22.996042 0.940917 21.075354 23.414253 0.664964 21.062256 23.785648 0.343696 21.162626 23.208162 3.784582 22.872587 23.631956 3.692655 22.533825 24.103525 3.523370 22.306276 24.590733 3.288263 22.205456 25.060377 3.003356 22.238228 25.480452 2.688064 22.402363 25.822330 2.363875 22.686672 26.062714 2.052881 23.071785 26.185221 1.776276 23.531450 26.181501 1.552911 24.034348 26.051811 1.398006 24.546206 25.804987 1.322120 25.032137 25.457851 1.330422 25.459032 25.034058 1.422348 25.797794 24.562489 1.591633 26.025341 24.075281 1.826740 26.126163 23.605637 2.111648 26.093391 23.185560 2.426939 25.929256 22.843681 2.751129 25.644947 22.603298 3.062123 25.259836 22.480791 3.338727 24.800169 22.484510 3.562093 24.297272 22.614201 3.716997 23.785416 22.861023 3.792884 23.299482 23.992308 5.964663 26.969469 23.660940 6.239866 26.427019 23.479670 6.464475 25.797350 23.460854 6.623182 25.123371 23.605770 6.705173 24.451010 23.904545 6.704859 23.826092 24.336819 6.622262 23.291199 24.873129 6.463012 22.882788 25.476931 6.237960 22.628687 26.107075 5.962443 22.546213 26.720615 5.655238 22.640993 27.275745 5.337280 22.906561 27.734629 5.030238 23.324820 28.065996 4.755034 23.867268 28.247267 4.530426 24.496937 28.266083 4.371718 25.170918 28.121166 4.289727 25.843277 27.822392 4.290040 26.468197 27.390120 4.372637 27.003088 26.853807 4.531888 27.411501 26.250006 4.756939 27.665602 25.619864 5.032455 27.748074 25.006321 5.339661 27.653297 24.451193 5.657619 27.387730 29.433968 8.076095 28.130424 28.720762 8.327477 28.644575 27.906317 8.614415 28.945486 27.046131 8.917356 29.012648 26.198826 9.215655 28.841486 25.422146 9.488983 28.443666 24.769016 9.718713 27.846296 24.283953 9.889191 27.090088 24.000006 9.988795 26.226574 23.936527 10.010742 25.314602 24.097845 9.953534 24.416323 24.472965 9.821070 23.592949 25.036324 9.622376 22.900599 25.749527 9.370996 22.386446 26.563972 9.084057 22.085535 27.424158 8.781116 22.018372 28.271463 8.482817 22.189533 29.048145 8.209489 22.587355 29.701273 7.979758 23.184723 30.186338 7.809282 23.940933 30.470285 7.709676 24.804445 30.533764 7.687729 25.716417 30.372446 7.744936 26.614698 29.997326 7.877401 27.438070 31.551193 11.215729 22.158209 32.241497 11.276027 23.130432 32.665379 11.427520 24.236214 32.793945 11.659884 25.400192 32.618439 11.957287 26.543051 32.150818 12.299458 27.586901 31.422951 12.663078 28.460609 30.484442 13.023370 29.104631 29.399248 13.355779 29.475079 28.241322 13.637651 29.546707 27.089577 13.849779 29.314634 26.022501 13.977706 28.794676 25.112812 14.012712 28.022266 24.422508 13.952415 27.050043 23.998629 13.800921 25.944263 23.870060 13.568557 24.780281 24.045567 13.271154 23.637424 24.513187 12.928985 22.593573 25.241053 12.565364 21.719866 26.179562 12.205071 21.075844 27.264755 11.872663 20.705395 28.422682 11.590790 20.633766 29.574427 11.378662 20.865839 30.641504 11.250735 21.385796 24.950922 15.359750 19.832640 26.140528 14.886744 19.043905 27.525337 14.540442 18.571278 29.010979 14.344448 18.446968 30.496208 14.312115 18.679443 31.879810 14.445648 19.252869 33.067493 14.735946 20.128157 33.978321 15.163226 21.245663 34.550220 15.698372 22.529234 34.744217 16.304911 23.891392 34.547092 16.941511 25.239307 33.972279 17.564787 26.481125 33.058949 18.132263 27.532219 31.869343 18.605270 28.320953 30.484533 18.951572 28.793581 28.998894 19.147568 28.917894 27.513662 19.179903 28.685415 26.130060 19.046370 28.111994 24.942375 18.756069 27.236704 24.031549 18.328789 26.119198 23.459650 17.793644 24.835629 23.265652 17.187107 23.473473 23.462776 16.550507 22.125555 24.037590 15.927231 20.883736 24.161263 23.762262 25.265675 23.063019 22.877989 24.125299 22.374874 21.874481 22.780693 22.143723 20.820129 21.323484 22.385323 19.786789 19.852982 23.083202 18.844875 18.469398 24.189808 18.058582 17.267023 25.629723 17.481493 16.327793 27.304821 17.152935 15.715720 29.100946 17.095301 15.472510 30.895697 17.312515 15.614741 32.566761 17.789776 16.132721 34.000263 18.494560 16.991146 35.098507 19.378836 18.131521 35.786652 20.382343 19.476128 36.017803 21.436693 20.933334 35.776203 22.470036 22.403835 35.078323 23.411947 23.787420 33.971718 24.198240 24.989796 32.531803 24.775330 25.929026 30.856707 25.103888 26.541101 29.060583 25.161524 26.784311 27.265833 24.944311 26.642080 25.594767 24.467049 26.124102 33.826962 30.384117 20.715958 32.164089 31.046932 21.800243 30.243750 31.335752 22.580656 28.196817 31.230894 23.004005 26.162785 30.739502 23.041445 24.280268 29.895069 22.690422 22.677559 28.755136 21.974861 21.463879 27.397390 20.943521 20.721935 25.914360 19.666693 20.502295 24.407112 18.231384 20.819923 22.978357 16.735413 21.653173 21.725471 15.280725 22.945263 20.733829 13.966454 24.608137 20.071014 12.882168 26.528475 19.782192 12.101757 28.575407 19.887053 11.678406 30.609442 20.378443 11.640966 32.491959 21.222878 11.991988 34.094666 22.362808 12.707550 35.308350 23.720554 13.738887 36.050293 25.203583 15.015717 36.269936 26.710835 16.451025 35.952305 28.139585 17.946995 35.119057 29.392473 19.401686 33.136929 26.117743 7.360517 34.374249 27.897432 8.172525 35.094570 29.803440 9.270662 35.248798 31.705868 10.580090 34.826431 33.475071 12.011574 33.856251 34.990479 13.467563 32.404369 36.148823 14.848831 30.569733 36.871159 16.061249 28.477367 37.108269 17.022192 26.269867 36.843983 17.666172 24.097666 36.096325 17.949305 22.108797 34.916233 17.852295 20.438799 33.384136 17.381752 19.201479 31.604446 16.569744 18.481159 29.698441 15.471609 18.326925 27.796015 14.162181 18.749292 26.026808 12.730695 19.719473 24.511398 11.274707 21.171354 23.353058 9.893438 23.005989 22.630718 8.681021 25.098354 22.393610 7.720078 27.305855 22.657892 7.076097 29.478058 23.405554 6.792964 31.466927 24.585642 6.889973 18.848246 25.764589 5.148657 20.784189 25.013126 3.835466 22.955801 24.830946 2.700582 25.215086 25.230461 1.821344 27.408079 26.184452 1.257670 29.385332 27.627899 1.047976 31.012098 29.462437 1.206549 32.177517 31.563046 1.722585 32.802162 33.786568 2.560916 32.843472 35.981480 3.664412 32.298630 37.998196 4.957870 31.204763 39.699287 6.353143 29.636417 40.968822 7.755147 27.700474 41.720287 9.068338 25.528866 41.902470 10.203223 23.269581 41.502953 11.082461 21.076586 40.548962 11.646135 19.099331 39.105515 11.855831 17.472565 37.270981 11.697258 16.307146 35.170372 11.181223 15.682498 32.946846 10.342892 15.641187 30.751938 9.239397 16.186029 28.735218 7.945940 17.279896 27.034126 6.550665 13.915882 40.078190 5.325264 12.910463 37.789627 5.145902 12.444976 35.384857 4.615854 12.551141 33.027756 3.771243 13.221724 30.878965 2.669628 14.411025 29.084911 1.386083 16.037994 27.767862 0.008078 17.991760 27.017572 -1.370478 20.139172 26.885168 -2.655637 22.333891 27.379677 -3.759820 24.426350 28.467396 -4.607778 26.273951 30.074200 -5.141723 27.750780 32.090591 -5.325268 28.756199 34.379154 -5.145906 29.221687 36.783924 -4.615859 29.115524 39.141026 -3.771249 28.444942 41.289818 -2.669634 27.255642 43.083870 -1.386088 25.628672 44.400921 -0.008083 23.674908 45.151211 1.370472 21.527494 45.283615 2.655632 19.332775 44.789108 3.759815 17.240316 43.701393 4.607773 15.392716 42.094585 5.141719 20.651060 46.152798 -7.770945 18.767895 46.876156 -6.368272 16.748936 46.972660 -4.971298 14.731771 46.435741 -3.675226 12.853864 45.301987 -2.568379 11.243195 43.648655 -1.726189 10.009524 41.588425 -1.206049 9.236928 39.261692 -1.043406 8.978055 36.827023 -1.249341 9.250547 34.450333 -1.809824 10.035835 32.293594 -2.686656 11.280404 30.503780 -3.820085 12.899437 29.202866 -5.132867 14.782600 28.479507 -6.535540 16.801558 28.382996 -7.932513 18.818724 28.919914 -9.228586 20.696632 30.053669 -10.335434 22.307302 31.707001 -11.177624 23.540974 33.767231 -11.697765 24.313570 36.093964 -11.860409 24.572445 38.528633 -11.654473 24.299952 40.905323 -11.093991 23.514664 43.062065 -10.217159 22.270098 44.851879 -9.083732 18.691257 34.392521 -17.382778 19.179989 36.604698 -17.857155 19.204710 38.917038 -17.957666 18.763731 41.171951 -17.677467 17.887110 43.215782 -17.035650 16.634583 44.909229 -16.075954 15.091509 46.136902 -14.863781 13.363046 46.815132 -13.481739 11.566987 46.897697 -12.024012 9.825728 46.378971 -10.589939 8.257935 45.294308 -9.277252 6.970449 43.717621 -8.175409 6.051011 41.756363 -7.359498 5.562278 39.544186 -6.885122 5.537558 37.231846 -6.784608 5.978534 34.976929 -7.064807 6.855156 32.933105 -7.706624 8.107683 31.239651 -8.666320 9.650756 30.011978 -9.878492 11.379219 29.333748 -11.260534 13.175279 29.251183 -12.718263 14.916537 29.769905 -14.152334 16.484331 30.854568 -15.465021 17.771818 32.431255 -16.566864 6.496857 30.241814 -13.952846 8.000739 29.618395 -15.268080 9.500596 29.522728 -16.724594 10.894214 29.961336 -18.223129 12.086619 30.904325 -19.661562 12.996553 32.287437 -20.941868 13.562004 34.016411 -21.976793 13.744439 35.973415 -22.695812 13.531424 38.025097 -23.049923 12.937475 40.031624 -23.014996 12.003071 41.856262 -22.593407 10.791888 43.374664 -21.813894 9.386467 44.483349 -20.729570 7.882585 45.106773 -19.414337 6.382729 45.202438 -17.957825 4.989111 44.763832 -16.459290 3.796704 43.820839 -15.020854 2.886770 42.437733 -13.740548 2.321318 40.708763 -12.705624 2.138883 38.751755 -11.986604 2.351897 36.700073 -11.632492 2.945845 34.693546 -11.667419 3.880249 32.868908 -12.089006 5.091432 31.350504 -12.868521 -0.981557 38.693108 -16.989590 -0.871691 37.100960 -16.128469 -0.446363 35.416668 -15.608088 0.265441 33.755016 -15.463907 1.215214 32.229244 -15.705754 2.338229 30.943329 -16.317142 3.557956 29.984905 -17.256414 4.791272 29.419287 -18.459555 5.954128 29.285023 -19.844572 6.967278 29.591257 -21.317083 7.761677 30.317123 -22.776735 8.283189 31.413157 -24.124056 8.496273 32.804661 -25.267229 8.386408 34.396809 -26.128349 7.961080 36.081100 -26.648731 7.249277 37.742752 -26.792913 6.299503 39.268528 -26.551067 5.176488 40.554440 -25.939678 3.956761 41.512867 -25.000408 2.723446 42.078484 -23.797268 1.560589 42.212753 -22.412251 0.547439 41.906517 -20.939739 -0.246961 41.180649 -19.480087 -0.768473 40.084618 -18.132767 -0.839059 37.687576 -27.538698 -1.786172 38.195377 -26.486980 -2.611561 38.382660 -25.244137 -3.258976 38.236649 -23.894867 -3.684298 37.767296 -22.531116 -3.858540 37.006592 -21.245829 -3.769830 36.006374 -20.126591 -3.424212 34.834808 -19.249680 -2.845240 33.571732 -18.674849 -2.072370 32.303223 -18.441278 -1.158271 31.115728 -18.564880 -0.165239 30.090174 -19.037239 0.839055 29.296448 -19.826157 1.786168 28.788645 -20.877874 2.611556 28.601366 -22.120716 3.258972 28.747377 -23.469986 3.684294 29.216730 -24.833736 3.858537 29.977434 -26.119026 3.769827 30.977650 -27.238264 3.424210 32.149216 -28.115179 2.845238 33.412292 -28.690006 2.072368 34.680798 -28.923580 1.158270 35.868294 -28.799974 0.165237 36.893848 -28.327620 -0.423491 28.753309 -28.023636 -0.911200 29.521481 -28.796568 -1.557734 30.379738 -29.316919 -2.319032 31.269587 -29.549231 -3.143212 32.130386 -29.477669 -3.974109 32.903477 -29.107109 -4.755098 33.536175 -28.462807 -5.432956 33.985359 -27.588671 -5.961488 34.220421 -26.544270 -6.304676 34.225338 -25.400778 -6.439131 33.999783 -24.236124 -6.355692 33.559116 -23.129677 -6.060044 32.933376 -22.156839 -5.572335 32.165203 -21.383907 -4.925802 31.306950 -20.863554 -4.164505 30.417099 -20.631243 -3.340323 29.556297 -20.702805 -2.509426 28.783207 -21.073362 -1.728437 28.150509 -21.717665 -1.050579 27.701324 -22.591801 -0.522047 27.466263 -23.636202 -0.178859 27.461346 -24.779694 -0.044403 27.686903 -25.944345 -0.127842 28.127567 -27.050793 -4.178132 26.499691 -22.901503 -3.725233 26.110565 -23.594084 -3.424216 25.850950 -24.417606 -3.295592 25.738533 -25.315950 -3.348129 25.780979 -26.227894 -3.578246 25.975391 -27.091290 -3.970260 26.308525 -27.847300 -4.497457 26.757675 -28.444403 -5.123909 27.292233 -28.841906 -5.806924 27.875771 -29.012720 -6.499956 28.468519 -28.945206 -7.155776 29.030085 -28.643965 -7.729691 29.522198 -28.129522 -8.182590 29.911324 -27.436943 -8.483608 30.170938 -26.613420 -8.612231 30.283354 -25.715075 -8.559694 30.240910 -24.803131 -8.329578 30.046497 -23.939735 -7.937564 29.713364 -23.183727 -7.410367 29.264214 -22.586624 -6.783916 28.729656 -22.189121 -6.100901 28.146118 -22.018305 -5.407868 27.553371 -22.085819 -4.752048 26.991804 -22.387060 -9.508790 26.535343 -23.324211 -9.012400 26.292526 -22.906563 -8.458656 25.971655 -22.641609 -7.885297 25.594595 -22.547403 -7.331394 25.187042 -22.630363 -6.834696 24.776768 -22.884840 -6.429051 24.391737 -23.293488 -6.142104 24.058184 -23.828461 -5.993409 23.798843 -24.453299 -5.993100 23.631386 -25.125422 -6.141198 23.567225 -25.799025 -6.427610 23.610733 -26.428204 -6.832818 23.758945 -26.970081 -7.329207 24.001759 -27.387728 -7.882950 24.322632 -27.652683 -8.456309 24.699694 -27.746891 -9.010213 25.107246 -27.663929 -9.506911 25.517519 -27.409454 -9.912557 25.902552 -27.000805 -10.199504 26.236105 -26.465834 -10.348199 26.495445 -25.840994 -10.348508 26.662905 -25.168873 -10.200411 26.727066 -24.495268 -9.913999 26.683556 -23.866091 -11.579261 22.709946 -25.456537 -11.759428 23.006807 -25.029659 -11.816398 23.259027 -24.543909 -11.746287 23.449421 -24.032394 -11.553875 23.565004 -23.529972 -11.252273 23.597912 -23.070881 -10.862036 23.545893 -22.686407 -10.409756 23.412495 -22.402752 -9.926257 23.206810 -22.239244 -9.444489 22.942854 -22.207031 -8.997281 22.638615 -22.308304 -8.615112 22.314827 -22.536163 -8.324025 21.993557 -22.875082 -8.143858 21.696695 -23.301960 -8.086888 21.444475 -23.787708 -8.156999 21.254084 -24.299221 -8.349411 21.138498 -24.801647 -8.651012 21.105591 -25.260738 -9.041250 21.157610 -25.645212 -9.493529 21.291008 -25.928867 -9.977028 21.496693 -26.092373 -10.458797 21.760647 -26.124588 -10.906004 22.064886 -26.023315 -11.288174 22.388674 -25.795456 -10.685737 18.506105 -24.084917 -11.134242 18.592592 -24.291277 -11.598381 18.753347 -24.391052 -12.046522 18.977415 -24.377447 -12.448125 19.249527 -24.251383 -12.775823 19.551138 -24.021452 -13.007282 19.861692 -23.703327 -13.126730 20.160030 -23.318684 -13.126025 20.425816 -22.893738 -13.005218 20.640938 -22.457447 -12.772539 20.790737 -22.039545 -12.443846 20.865005 -21.668510 -12.041538 20.858683 -21.369629 -11.593033 20.772196 -21.163267 -11.128894 20.611441 -21.063490 -10.680754 20.387373 -21.077099 -10.279149 20.115261 -21.203161 -9.951452 19.813650 -21.433092 -9.719993 19.503096 -21.751217 -9.600544 19.204760 -22.135860 -9.601249 18.938972 -22.560806 -9.722056 18.723850 -22.997097 -9.954735 18.574051 -23.414999 -10.283428 18.499783 -23.786034 -10.546230 17.059784 -20.106480 -10.462528 16.704521 -20.518295 -10.515764 16.380714 -20.960026 -10.702309 16.110432 -21.401569 -11.009448 15.912093 -21.812836 -11.416253 15.799214 -22.165794 -11.895000 15.779489 -22.436394 -12.413063 15.854260 -22.606192 -12.935137 16.018433 -22.663620 -13.425644 16.260820 -22.604763 -13.851155 16.564901 -22.433630 -14.182674 16.909956 -22.161886 -14.397608 17.272467 -21.808050 -14.481310 17.627731 -21.396233 -14.428074 17.951538 -20.954502 -14.241530 18.221821 -20.512959 -13.934390 18.420158 -20.101692 -13.527585 18.533039 -19.748734 -13.048839 18.552763 -19.478134 -12.530776 18.477991 -19.308336 -12.008701 18.313820 -19.250908 -11.518195 18.071434 -19.309765 -11.092684 17.767353 -19.480896 -10.761165 17.422298 -19.752642 -13.865498 16.663549 -17.130442 -13.194565 16.578938 -16.980505 -12.533170 16.373739 -16.964975 -11.926385 16.061941 -17.084911 -11.415561 15.664789 -17.332138 -11.035512 15.209351 -17.689810 -10.812136 14.726662 -18.133549 -10.760655 14.249617 -18.633118 -10.884580 13.810725 -19.154470 -11.175462 13.439898 -19.662079 -11.613481 13.162407 -20.121347 -12.168785 12.997161 -20.500980 -12.803533 12.955421 -20.775106 -13.474465 13.040033 -20.925043 -14.135860 13.245231 -20.940573 -14.742645 13.557029 -20.820639 -15.253469 13.954181 -20.573410 -15.633519 14.409619 -20.215738 -15.856895 14.892308 -19.771999 -15.908376 15.369353 -19.272432 -15.784452 15.808245 -18.751078 -15.493569 16.179071 -18.243469 -15.055551 16.456564 -17.784201 -14.500247 16.621809 -17.404568 -17.409189 12.696468 -17.588112 -17.417339 13.358648 -16.957514 -17.192636 13.969545 -16.315239 -16.750397 14.487529 -15.705059 -16.120758 14.877297 -15.168554 -15.346627 15.112289 -14.742289 -14.480762 15.176491 -14.455309 -13.582169 15.065526 -14.327174 -12.712085 14.786959 -14.366617 -11.929806 14.359770 -14.570949 -11.288642 13.813074 -14.926242 -10.832287 13.184127 -15.408289 -10.591843 12.515790 -15.984235 -10.583694 11.853611 -16.614830 -10.808394 11.242713 -17.257105 -11.250633 10.724730 -17.867285 -11.880273 10.334961 -18.403791 -12.654403 10.099968 -18.830057 -13.520268 10.035767 -19.117037 -14.418861 10.146731 -19.245171 -15.288946 10.425299 -19.205729 -16.071226 10.852486 -19.001398 -16.712389 11.399183 -18.646103 -17.168745 12.028130 -18.164057 -14.111758 7.054919 -17.441975 -15.292324 7.204877 -17.537622 -16.419579 7.582264 -17.426947 -17.416698 8.161365 -17.117489 -18.215734 8.902711 -16.630337 -18.762234 9.755784 -15.998692 -19.018951 10.662448 -15.265596 -18.968393 11.560914 -14.481011 -18.614006 12.389955 -13.698404 -17.979939 13.093070 -12.971109 -17.109404 13.622346 -12.348690 -16.061726 13.941711 -11.873564 -14.908301 14.029405 -11.578107 -13.727736 13.879448 -11.482458 -12.600482 13.502061 -11.593134 -11.603361 12.922961 -11.902591 -10.804323 12.181614 -12.389742 -10.257825 11.328541 -13.021388 -10.001107 10.421877 -13.754482 -10.051663 9.523411 -14.539068 -10.406051 8.694370 -15.321675 -11.040117 7.991255 -16.048969 -11.910652 7.461979 -16.671389 -12.958331 7.142612 -17.146517 -9.176333 8.440373 -11.491337 -9.295950 7.275123 -12.434141 -9.797131 6.200136 -13.358377 -10.645720 5.288669 -14.201063 -11.783888 4.602839 -14.904770 -13.134071 4.189382 -15.421541 -14.604257 4.076477 -15.716160 -16.094254 4.271818 -15.768549 -17.502522 4.762090 -15.575137 -18.733088 5.513884 -15.149105 -19.702093 6.475966 -14.519487 -20.343502 7.582772 -13.729191 -20.613602 8.758874 -12.832072 -20.493986 9.924125 -11.889269 -19.992807 10.999111 -10.965033 -19.144218 11.910579 -10.122347 -18.006050 12.596410 -9.418639 -16.655867 13.009867 -8.901867 -15.185681 13.122772 -8.607248 -13.695685 12.927432 -8.554860 -12.287417 12.437160 -8.748271 -11.056849 11.685368 -9.174302 -10.087844 10.723285 -9.803920 -9.446434 9.616479 -10.594216 -15.358377 12.336329 -5.630280 -13.560745 12.097481 -5.628256 -11.873472 11.494801 -5.908285 -10.411542 10.569358 -6.451286 -9.274583 9.384221 -7.220252 -8.540078 8.020156 -8.162780 -8.258080 6.570121 -9.214639 -8.447810 5.132933 -10.304146 -9.096335 3.806534 -11.357053 -10.159461 2.681316 -12.301606 -11.564737 1.833962 -13.073436 -13.216396 1.322216 -13.619942 -15.001880 1.180954 -13.903883 -16.799511 1.419800 -13.905909 -18.486786 2.022481 -13.625880 -19.948715 2.947922 -13.082880 -21.085676 4.133060 -12.313914 -21.820181 5.497124 -11.371387 -22.102179 6.947160 -10.319527 -21.912451 8.384348 -9.230021 -21.263926 9.710747 -8.177113 -20.200800 10.835964 -7.232560 -18.795525 11.683319 -6.460731 -17.143867 12.195066 -5.914223 -23.388180 5.188914 -7.761646 -23.137827 6.875523 -6.548048 -22.359081 8.434227 -5.388677 -21.105013 9.758803 -4.362539 -19.461084 10.758984 -3.539567 -17.539326 11.366606 -2.975844 -15.470702 11.540265 -2.709786 -13.396189 11.268124 -2.759525 -11.457157 10.568729 -3.121671 -9.785750 9.489743 -3.771545 -8.495873 8.104698 -4.664859 -7.675427 6.507982 -5.740734 -7.380324 4.808407 -6.925852 -7.630675 3.121798 -8.139450 -8.409419 1.563094 -9.298821 -9.663487 0.238518 -10.324959 -11.307417 -0.761663 -11.147932 -13.229175 -1.369287 -11.711655 -15.297797 -1.542947 -11.977715 -17.372313 -1.270806 -11.927975 -19.311344 -0.571413 -11.565829 -20.982750 0.507573 -10.915956 -22.272629 1.892617 -10.022642 -23.093075 3.489334 -8.946768 -15.492864 -4.015797 -9.914247 -17.787191 -3.726165 -9.815310 -19.927078 -2.957773 -9.381636 -21.766695 -1.762987 -8.642776 -23.180674 -0.223228 -7.649086 -24.072653 1.556571 -6.468281 -24.381849 3.455119 -5.180833 -24.087191 5.343035 -3.874479 -23.208755 7.091660 -2.638244 -21.806410 8.581827 -1.556376 -19.975719 9.711986 -0.702602 -17.841444 10.405115 -0.135106 -15.549031 10.613982 0.107439 -13.254704 10.324351 0.008502 -11.114817 9.555961 -0.425171 -9.275200 8.361176 -1.164029 -7.861220 6.821416 -2.157720 -6.969239 5.041617 -3.338524 -6.660041 3.143069 -4.625972 -6.954699 1.255153 -5.932327 -7.833134 -0.493472 -7.168562 -9.235479 -1.983640 -8.250430 -11.066169 -3.113798 -9.104204 -13.200443 -3.806929 -9.671701 -6.188776 1.551826 -2.316568 -6.508505 -0.467804 -3.678886 -7.447766 -2.343818 -4.957713 -8.942550 -3.948371 -6.065900 -10.890986 -5.172113 -6.927924 -13.160295 -5.931650 -7.485041 -15.595826 -6.175220 -7.699284 -18.031603 -5.886226 -7.556053 -20.301630 -5.084359 -7.065109 -22.251209 -3.824267 -6.259908 -23.747480 -2.191824 -5.195324 -24.688475 -0.298277 -3.943907 -25.010065 1.727333 -2.590938 -24.690336 3.746962 -1.228620 -23.751076 5.622976 0.050207 -22.256296 7.227529 1.158394 -20.307858 8.451273 2.020419 -18.038549 9.210811 2.577537 -15.603018 9.454382 2.791780 -13.167242 9.165388 2.648549 -10.897215 8.363523 2.157606 -8.947635 7.103431 1.352405 -7.451363 5.470988 0.287822 -6.510367 3.577441 -0.963595 -15.624843 7.988164 5.324395 -13.140185 7.716090 5.142724 -10.824863 6.918178 4.610583 -8.836663 5.648803 3.764236 -7.311078 3.994474 2.661361 -6.352072 2.067930 1.377117 -6.025001 0.000460 -0.000977 -6.352152 -2.067039 -1.379007 -7.311234 -3.993672 -2.663062 -8.836885 -5.648142 -3.765636 -10.825134 -6.917699 -4.611590 -13.140487 -7.715826 -5.143274 -15.625154 -7.988130 -5.324454 -18.109812 -7.716057 -5.142784 -20.425133 -6.918144 -4.610643 -22.413334 -5.648772 -3.764298 -23.938921 -3.994442 -2.661422 -24.897926 -2.067898 -1.377178 -25.225000 -0.000429 0.000916 -24.897848 2.067071 1.378946 -23.938768 3.993704 2.663001 -22.413116 5.648174 3.765575 -20.424870 6.917732 4.611529 -18.109518 7.715859 5.143214 -25.010035 -1.728200 2.593021 -24.688328 0.297332 3.946082 -23.747227 2.190869 5.197440 -22.250866 3.823370 6.261817 -20.301220 5.083580 7.066677 -18.031157 5.885623 7.557170 -15.595372 6.174837 7.699870 -13.159865 5.931514 7.485053 -10.890610 5.172236 6.927358 -8.942252 3.948746 6.064789 -7.447569 2.344424 4.956132 -6.508420 0.468601 3.676938 -6.188810 -1.550889 2.314383 -6.510516 -3.576420 0.961321 -7.451615 -5.469957 -0.290037 -8.947975 -7.102458 -1.354414 -10.897621 -8.362671 -2.159274 -13.167686 -9.164714 -2.649769 -15.603469 -9.453929 -2.792469 -18.038977 -9.210607 -2.577652 -20.308231 -8.451330 -2.019957 -22.256590 -7.227840 -1.157390 -23.751274 -5.623519 -0.048733 -24.690424 -3.747696 1.230461 -15.549841 -10.613199 -0.108597 -17.842211 -10.404507 0.134549 -19.976391 -9.711589 0.702682 -21.806938 -8.581668 1.557085 -23.209108 -7.091745 2.639531 -24.087341 -5.343359 3.876252 -24.381788 -3.455656 5.182969 -24.072386 -1.557281 6.470631 -23.180216 0.222394 7.651486 -21.766079 1.762089 8.645061 -19.926348 2.956874 9.383644 -17.786396 3.725329 9.816906 -15.492059 4.015084 9.915316 -13.199690 3.806392 9.672171 -11.065510 3.113475 9.104038 -9.234961 1.983555 8.249636 -7.832791 0.493633 7.167190 -6.954557 -1.254754 5.930469 -6.660108 -3.142457 4.623752 -6.969511 -5.040832 3.336090 -7.861680 -6.820508 2.155235 -9.275815 -8.360203 1.161659 -11.115545 -9.554989 0.423074 -13.255497 -10.323443 -0.010186 -7.380451 -4.808040 6.923194 -7.675899 -6.507349 5.737770 -8.496657 -8.103840 4.661788 -9.786795 -9.488716 3.768573 -11.458390 -10.567600 3.118997 -13.397526 -11.266968 2.757328 -15.472054 -11.539158 2.708211 -17.540600 -11.365621 2.974997 -19.462193 -10.758183 3.539501 -21.105883 -9.758243 4.363255 -22.359652 -8.433942 5.390121 -23.138060 -6.875529 6.550120 -23.388060 -5.189208 7.764201 -23.092613 -3.489900 8.949625 -22.271856 -1.893409 10.025608 -20.981720 -0.508533 10.918822 -19.310123 0.570353 11.568399 -17.370989 1.269721 11.930069 -15.296460 1.541912 11.979185 -13.227915 1.368375 11.712401 -11.306321 0.760940 11.147898 -9.662631 -0.239002 10.324143 -8.408861 -1.563302 9.297277 -7.630452 -3.121715 8.137278 -15.000001 -1.182187 13.905500 -13.214636 -1.323394 13.620745 -11.563215 -1.835001 13.073365 -10.158282 -2.682144 12.300663 -9.095579 -3.807091 11.355299 -8.447530 -5.133178 10.301697 -8.258296 -6.570035 9.211657 -8.540773 -8.019743 8.159465 -9.275712 -9.383505 7.216824 -10.413027 -10.568386 6.447977 -11.875213 -11.493636 5.905317 -13.562623 -12.096201 5.625825 -15.360264 -12.335018 5.628549 -17.145630 -12.193811 5.913305 -18.797049 -11.682205 6.460684 -20.201982 -10.835064 7.233384 -21.264687 -9.710116 8.178749 -21.912737 -8.384029 9.232352 -22.101973 -6.947173 10.322392 -21.819496 -5.497465 11.374585 -21.084557 -4.133702 12.317225 -19.947243 -2.948821 13.086073 -18.485058 -2.023570 13.628734 -16.797647 -1.421004 13.908224 -20.613312 -8.758361 12.834889 -20.342598 -7.582646 13.732345 -19.700638 -6.476235 14.522759 -18.731180 -5.514527 15.152269 -17.500292 -4.763061 15.577974 -16.091854 -4.273046 15.770861 -14.601853 -4.077879 15.717787 -13.131827 -4.190857 15.422369 -11.781957 -4.604284 14.904739 -10.644233 -5.289983 14.200171 -9.796190 -6.201227 13.356683 -9.295622 -7.275913 12.431755 -9.176640 -8.440806 11.488420 -9.447352 -9.616521 10.590965 -10.089312 -10.722932 9.800550 -11.058768 -11.684640 9.171041 -12.289658 -12.436108 8.745336 -13.698094 -12.926123 8.552448 -15.188096 -13.121290 8.605522 -16.658123 -13.008311 8.900940 -18.007994 -12.594886 9.418570 -19.145716 -11.909187 10.123136 -19.993759 -10.997944 10.966625 -20.494329 -9.923258 11.891552 -14.911029 -14.027861 11.576609 -16.064219 -13.940174 11.873009 -17.111492 -13.620915 12.349114 -17.981482 -13.091842 12.972481 -18.614897 -12.389009 13.700627 -18.968575 -11.560313 14.483929 -19.018410 -10.662229 15.269008 -18.761007 -9.755960 16.002361 -18.213907 -8.903267 16.634010 -17.414394 -8.162259 17.120914 -16.416956 -7.583434 17.429886 -15.289565 -7.206239 17.539871 -14.109050 -7.056379 17.443378 -12.955861 -7.144066 17.146978 -11.908587 -7.463324 16.670872 -11.038597 -7.992397 16.047504 -10.405180 -8.695230 15.319360 -10.051503 -9.523925 14.536057 -10.001668 -10.422009 13.750978 -10.259069 -11.328278 13.017626 -10.806169 -12.180972 12.385975 -11.605680 -12.921980 11.899073 -12.603118 -13.500805 11.590099 -13.730510 -13.878000 11.480112 -10.592550 -12.515790 15.981140 -10.833612 -13.183786 15.405048 -11.290495 -13.812414 14.923076 -11.932062 -14.358831 14.568065 -12.714591 -14.785802 14.364213 -13.584755 -15.064228 14.325410 -14.483253 -15.175138 14.454300 -15.348853 -15.110970 14.742102 -16.122568 -14.876097 15.169198 -16.751669 -14.486527 15.706486 -17.193285 -13.968808 16.317348 -17.417320 -13.358222 16.960159 -17.408506 -12.696380 17.591110 -17.167444 -12.028382 18.167200 -16.710562 -11.399755 18.649174 -16.068996 -10.853337 19.004185 -15.286467 -10.426367 19.208036 -14.416304 -10.147940 19.246840 -13.517806 -10.037030 19.117950 -12.652205 -10.101198 18.830151 -11.878489 -10.336071 18.403053 -11.249388 -10.725639 17.865765 -10.807772 -11.243359 17.254902 -10.583737 -11.853945 16.612093 -12.801490 -12.956451 20.775579 -12.167031 -12.998080 20.500759 -11.612135 -13.163149 20.120445 -11.174618 -13.440411 19.660553 -10.884295 -13.810968 19.152422 -10.760952 -14.249571 18.630684 -10.812994 -14.726326 18.130892 -11.036875 -15.208746 17.687107 -11.417336 -15.663954 17.329573 -11.928452 -16.060926 17.082651 -12.535389 -16.372614 16.963175 -13.196787 -16.577772 16.979282 -13.867571 -16.662422 17.129877 -14.502029 -16.620794 17.404697 -15.056926 -16.455725 17.785011 -15.494443 -16.178463 18.244904 -15.784766 -15.807906 18.753033 -15.908110 -15.369304 19.274771 -15.856068 -14.892549 19.774565 -15.632188 -14.410129 20.218349 -15.251726 -13.954921 20.575884 -14.740611 -13.557947 20.822803 -14.133674 -13.246260 20.942282 -13.472277 -13.041101 20.926174 -14.396430 -17.273045 21.810659 -14.180988 -16.910807 22.164473 -13.849078 -16.565966 22.436014 -13.423318 -16.262022 22.606777 -12.932723 -16.019688 22.665127 -12.410727 -15.855478 22.607084 -11.892901 -15.780581 22.436609 -11.414537 -15.800106 22.165314 -11.008233 -15.912718 21.811691 -10.701678 -16.110744 21.399836 -10.515763 -16.380690 20.957821 -10.463160 -16.704157 20.515762 -10.547450 -17.059105 20.103788 -10.762891 -17.421341 19.749975 -11.094802 -17.766184 19.478436 -11.520561 -18.070126 19.307673 -12.011157 -18.312462 19.249321 -12.533154 -18.476671 19.307364 -13.050978 -18.551567 19.477839 -13.529343 -18.532043 19.749132 -13.935646 -18.419432 20.102757 -14.242202 -18.221405 20.514608 -14.428116 -17.951460 20.956627 -14.480721 -17.627993 21.398685 -12.043497 -20.857548 21.369625 -12.445304 -20.864267 21.669172 -12.773398 -20.790440 22.040827 -13.005422 -20.641096 22.459257 -13.125562 -20.426416 22.895950 -13.125631 -20.161030 23.321146 -13.005626 -19.863018 23.705866 -12.773724 -19.552696 24.023897 -12.445728 -19.251207 24.253561 -12.043992 -18.979101 24.379208 -11.595892 -18.754917 24.392279 -11.131967 -18.593937 24.291878 -10.683830 -18.507130 24.084850 -10.282024 -18.500410 23.785303 -9.953930 -18.574238 23.413649 -9.721907 -18.723579 22.995220 -9.601766 -18.938259 22.558527 -9.601696 -19.203648 22.133329 -9.721702 -19.501659 21.748610 -9.953604 -19.811981 21.430578 -10.281599 -20.113468 21.200914 -10.683335 -20.385576 21.075266 -11.131434 -20.609760 21.062197 -11.595360 -20.770741 21.162598 -8.326597 -21.991142 22.872526 -8.618114 -22.312197 22.533777 -9.000511 -22.635944 22.306246 -9.447728 -22.940321 22.205439 -9.929289 -23.204580 22.238228 -10.412374 -23.410719 22.402374 -10.864065 -23.544687 22.686695 -11.253578 -23.597353 23.071812 -11.554368 -23.565128 23.531483 -11.745938 -23.450212 24.034378 -11.815231 -23.260431 24.546228 -11.757527 -23.008722 25.032154 -11.576757 -22.712238 25.459034 -11.285241 -22.391184 25.797783 -10.902844 -22.067438 26.025314 -10.455627 -21.763062 26.126123 -9.974067 -21.498800 26.093334 -9.490980 -21.292662 25.929188 -9.039290 -21.158693 25.644867 -8.649777 -21.106028 25.259750 -8.348987 -21.138252 24.800081 -8.157417 -21.253168 24.297184 -8.088123 -21.442949 23.785334 -8.145827 -21.694656 23.299410 -6.830502 -23.760244 26.969347 -6.426513 -23.610897 26.426876 -6.141397 -23.566238 25.797194 -5.994586 -23.629309 25.123211 -5.996084 -23.795815 24.450855 -6.145788 -24.054405 23.825953 -6.433497 -24.387461 23.291084 -6.839603 -24.772282 22.882704 -7.336432 -25.182644 22.628641 -7.890125 -25.590584 22.546206 -8.462949 -25.968300 22.641020 -9.015866 -26.290049 22.906624 -9.511197 -26.533907 23.324911 -9.915187 -26.683254 23.867382 -10.200301 -26.727913 24.497063 -10.347113 -26.664843 25.171047 -10.345615 -26.498335 25.843401 -10.195911 -26.239746 26.468306 -9.908203 -25.906691 27.003172 -9.502097 -25.521870 27.411554 -9.005268 -25.111507 27.665619 -8.451575 -24.703568 27.748053 -7.878752 -24.325853 27.653238 -7.325834 -24.004103 27.387634 -7.723022 -29.528435 28.130398 -7.148769 -29.036423 28.644548 -6.493093 -28.474520 28.945459 -5.800677 -27.881021 29.012625 -5.118708 -27.296373 28.841469 -4.493660 -26.760414 28.443653 -3.968131 -26.309675 27.846289 -3.577933 -25.974867 27.090088 -3.349658 -25.778812 26.226580 -3.298863 -25.734867 25.314615 -3.429009 -25.846029 24.416342 -3.731227 -26.104719 23.592974 -4.184921 -26.493313 22.900625 -4.759173 -26.985325 22.386475 -5.414849 -27.547224 22.085564 -6.107265 -28.140724 22.018396 -6.789235 -28.725374 22.189552 -7.414282 -29.261330 22.587368 -7.939812 -29.712072 23.184731 -8.330010 -30.046879 23.940933 -8.558285 -30.242935 24.804440 -8.609080 -30.286880 25.716404 -8.478935 -30.175720 26.614677 -8.176718 -29.917028 27.438047 -6.062319 -32.932190 22.158218 -6.355375 -33.560017 23.130486 -6.436249 -34.002708 24.236307 -6.299430 -34.230083 25.400324 -5.954241 -34.226658 26.543211 -5.424207 -33.992657 27.587082 -4.745449 -33.544033 28.460794 -3.964222 -32.911354 29.104813 -3.133767 -32.137741 29.475246 -2.310677 -31.275909 29.546848 -1.551044 -30.384598 29.314741 -0.906636 -29.524542 28.794743 -0.421369 -28.754356 28.022289 -0.128313 -28.126524 27.050024 -0.047438 -27.683836 25.944201 -0.184257 -27.456457 24.780186 -0.529446 -27.459885 23.637297 -1.059479 -27.693886 22.593428 -1.738238 -28.142509 21.719715 -2.519464 -28.775188 21.075697 -3.349920 -29.548801 20.705263 -4.173009 -30.410629 20.633659 -4.932642 -31.301945 20.865765 -5.577050 -32.161999 21.385763 0.825707 -29.287771 19.832779 -0.178779 -30.081511 19.044138 -1.171089 -31.107666 18.571590 -2.083597 -32.296307 18.447342 -2.854118 -33.566425 18.679861 -3.430141 -34.831470 19.253300 -3.772413 -36.005230 20.128580 -3.857608 -37.007713 21.246054 -3.679920 -37.770599 22.529564 -3.251458 -38.241901 23.891645 -2.601421 -38.389507 25.239471 -1.774108 -38.203350 26.481192 -0.825899 -37.696114 27.532187 0.178587 -36.902374 28.320827 1.170896 -35.876221 28.793377 2.083404 -34.687580 28.917625 2.853926 -33.417461 28.685108 3.429950 -32.152416 28.111668 3.772222 -30.978659 27.236389 3.857417 -29.976179 26.118916 3.679730 -29.213289 24.835407 3.251268 -28.741985 23.473326 2.601232 -28.594379 22.125498 1.773919 -28.780539 20.883778 8.498251 -32.805225 25.265320 8.281344 -31.411953 24.125032 7.756129 -30.314230 22.780539 6.958396 -29.586868 21.323458 5.942511 -29.279436 19.853094 4.777702 -29.412882 18.469650 3.543352 -29.978111 17.267401 2.323579 -30.936604 16.328278 1.201507 -32.223045 15.716286 0.253605 -33.749760 15.473127 -0.455530 -35.412712 15.615372 -0.877572 -37.098564 16.133327 -0.983758 -38.692440 16.991697 -0.766853 -40.085709 18.131985 -0.241638 -41.183434 19.476480 0.556094 -41.910793 20.933558 1.571980 -42.218231 22.403921 2.736788 -42.084782 23.787369 3.971138 -41.519554 24.989616 5.190912 -40.561062 25.928740 6.312984 -39.274624 26.540731 7.260887 -37.747906 26.783894 7.970022 -36.084957 26.641647 8.392064 -34.399101 26.123692 9.399990 -44.486835 20.716354 10.805273 -43.378040 21.800732 12.015397 -41.859299 22.581205 12.947893 -40.034107 23.004595 13.539214 -38.026855 23.042040 13.749063 -35.974335 22.690992 13.563138 -34.016415 21.975372 12.994111 -32.286533 20.943954 12.080759 -30.902565 19.667021 10.885325 -29.958841 18.231598 9.489279 -29.519665 16.735504 7.987754 -29.614969 15.280696 6.483081 -30.238258 13.966317 5.077798 -31.347054 12.881941 3.867675 -32.865799 12.101465 2.935177 -34.690987 11.678077 2.343855 -36.698238 11.640631 2.134006 -38.750759 11.991679 2.319930 -40.708679 12.707296 2.888957 -42.438568 13.738716 3.802308 -43.822529 15.015648 4.997741 -44.766254 16.451073 6.393788 -45.205433 17.947166 7.895312 -45.110126 19.401974 6.050486 -41.756687 7.360429 6.973110 -43.718018 8.172554 8.263592 -45.294743 9.270818 9.833986 -46.379417 10.580374 11.577273 -46.898125 12.011977 13.374651 -46.815506 13.468067 15.103633 -46.137207 14.849415 16.646389 -44.909435 16.061882 17.897785 -43.215870 17.022842 18.772539 -41.171925 17.666807 19.211040 -38.916897 17.949892 19.183405 -36.604446 17.852804 18.691513 -34.392178 17.382160 17.768890 -32.430851 16.570036 16.478411 -30.854122 15.471773 14.908017 -29.769445 14.162217 13.164728 -29.250740 12.730613 11.367350 -29.333357 11.274523 9.638369 -30.011660 9.893175 8.095612 -31.239428 8.680707 6.844215 -32.932991 7.719747 5.969459 -34.976933 7.075783 5.530958 -37.231968 6.792696 5.558594 -39.544415 6.889784 12.888202 -29.205589 5.148607 11.269417 -30.506554 3.835573 10.025837 -32.296230 2.700851 9.242209 -34.452656 1.821771 8.971936 -36.828876 1.258242 9.233437 -39.262951 1.048665 10.008889 -41.589005 1.207323 11.245450 -43.648521 1.723405 12.858848 -45.301144 2.561739 14.739132 -46.434258 3.665196 16.758165 -46.970638 4.958576 18.778353 -46.873722 6.353737 20.662024 -46.150131 7.755603 22.280807 -44.849171 9.068637 23.524389 -43.059494 10.203359 24.308018 -40.903069 11.082439 24.578293 -38.526848 11.645969 24.316792 -36.092773 11.855547 23.541340 -33.766720 11.696890 22.304779 -31.707203 11.180808 20.691383 -30.054575 10.342474 18.811098 -28.921465 9.239017 16.792067 -28.385086 7.945638 14.771878 -28.481995 6.550477 27.750853 -32.089989 5.324734 26.271530 -30.075054 5.145291 24.421595 -28.469650 4.615219 22.327116 -27.383186 3.770643 20.130831 -26.889698 2.669120 17.982412 -27.022820 1.385716 16.028271 -27.773476 0.007893 14.401578 -29.090509 -1.370453 13.213190 -30.884171 -2.655389 12.544093 -33.032227 -3.759350 12.439886 -35.388283 -4.607102 12.907670 -37.791782 -5.140872 13.915566 -40.078930 -5.324285 15.394887 -42.093864 -5.144843 17.244822 -43.699268 -4.614771 19.339300 -44.785736 -3.770197 21.535585 -45.279221 -2.668673 23.684004 -45.146103 -1.385269 25.638145 -44.395451 -0.007446 27.264839 -43.078415 1.370899 28.453228 -41.284752 2.655836 29.122326 -39.136703 3.759797 29.226534 -36.780647 4.607549 28.758751 -34.377144 5.141320 29.644320 -40.960556 -7.770659 31.212206 -39.691330 -6.367849 32.305099 -37.991104 -4.970755 32.848522 -35.975739 -3.674583 32.805439 -33.782585 -2.567667 32.178787 -31.561092 -1.725442 31.011274 -29.462656 -1.205303 29.382462 -27.630283 -1.042696 27.403351 -26.188848 -1.248704 25.208815 -25.236576 -1.809287 22.948408 -24.838369 -2.686242 20.776173 -25.021360 -3.819807 18.840145 -25.773081 -5.132730 17.272259 -27.042301 -6.535539 16.179365 -28.742527 -7.932633 15.635942 -30.757891 -9.228806 15.679024 -32.951050 -10.335722 16.305674 -35.172539 -11.177948 17.473186 -37.270977 -11.698088 19.101999 -39.103348 -11.860695 21.081110 -40.544785 -11.654687 23.275644 -41.497055 -11.094105 25.536051 -41.895267 -10.217150 27.708286 -41.712276 -9.083586 20.439568 -33.383503 -17.383236 22.111095 -34.912769 -17.857563 24.101334 -36.090275 -17.957989 26.274649 -36.835777 -17.677666 28.482935 -37.098465 -17.035698 30.575699 -36.860439 -16.075836 32.410324 -36.137928 -14.863495 33.861782 -34.980160 -13.481289 34.831158 -33.466038 -12.023417 35.252396 -31.698748 -10.589228 35.096783 -29.798727 -9.276460 34.374928 -27.895462 -8.174577 33.136021 -26.118650 -7.358669 31.464493 -24.589382 -6.884340 29.474255 -23.411879 -6.783916 27.300940 -22.666378 -7.064238 25.092653 -22.403688 -7.706203 22.999887 -22.641710 -8.666064 21.165264 -23.364225 -9.878407 19.713804 -24.521990 -11.260612 18.744427 -26.036112 -12.718485 18.323189 -27.803400 -14.152674 18.478802 -29.703421 -15.465442 19.200657 -31.606688 -16.567326 22.941616 -20.746735 -13.953837 21.649759 -21.737879 -15.268728 20.816973 -22.989431 -16.724844 20.500006 -24.416107 -18.222948 20.720463 -25.920679 -19.660955 21.463320 -27.400610 -20.940861 22.677950 -28.755049 -21.975445 24.281578 -29.891689 -22.694199 26.164923 -30.733074 -23.048147 28.199635 -31.221863 -23.013163 30.247051 -31.324747 -22.591633 32.167648 -31.034714 -21.812283 33.830536 -30.371531 -20.728224 35.122391 -29.380388 -19.413334 35.955177 -28.128834 -17.957220 36.272144 -26.702158 -16.459114 36.051689 -25.197586 -15.021107 35.308834 -23.717655 -13.741202 34.094204 -22.363216 -12.706617 32.490578 -21.226576 -11.987862 30.607233 -20.385189 -11.633915 28.572521 -19.896400 -11.668898 26.525103 -19.793514 -12.090427 24.604507 -20.083548 -12.869776 33.999683 -18.496752 -16.988983 32.565826 -17.795919 -16.127901 30.894466 -17.322203 -15.607584 29.099504 -17.107882 -15.463496 27.303267 -17.167564 -15.705454 25.628160 -17.497185 -16.316967 24.188343 -18.074278 -17.256367 23.081934 -18.859516 -18.459627 22.384336 -19.799389 -19.844757 22.143087 -20.829840 -21.317352 22.374628 -21.880651 -22.777065 23.063181 -22.880211 -24.124416 24.161821 -23.760399 -25.267588 25.595678 -24.461233 -26.128674 27.267036 -24.934952 -26.648987 29.061998 -25.149271 -26.793077 30.858238 -25.089588 -26.551121 32.533344 -24.759970 -25.939606 33.973164 -24.182877 -25.000208 35.079571 -23.397638 -23.796947 35.777168 -22.457767 -22.411819 36.018417 -21.427313 -20.939220 35.786877 -20.376503 -19.479509 35.098328 -19.376944 -18.132158 33.058273 -18.116690 -27.538568 33.971527 -17.550510 -26.486691 34.546314 -16.929520 -25.243700 34.743465 -16.296036 -23.894308 34.549549 -15.693224 -22.530472 33.977779 -15.162171 -21.245132 33.067116 -14.739065 -20.125887 31.879623 -14.452738 -19.249010 30.496227 -14.322707 -18.674259 29.011204 -14.357830 -18.440798 27.525753 -14.555714 -18.564543 26.141108 -14.902874 -19.037058 24.951628 -15.375651 -19.826141 24.038376 -15.941827 -20.878021 23.463587 -16.562819 -22.121008 23.266432 -17.196304 -23.470402 23.460348 -17.799114 -24.834238 24.032120 -18.330168 -26.119577 24.942781 -18.753275 -27.238823 26.130274 -19.039600 -28.115700 27.513670 -19.169634 -28.690454 28.998693 -19.134510 -28.923912 30.484144 -18.936626 -28.800169 31.868790 -18.589466 -28.327656 25.113041 -14.010027 -28.023869 26.022194 -13.971651 -28.796766 27.088758 -13.840777 -29.317070 28.240051 -13.626328 -29.549316 29.397614 -13.342915 -29.477684 30.482557 -13.009854 -29.107050 31.420946 -12.649840 -28.462677 32.148834 -12.287412 -27.588476 32.616611 -11.947265 -26.544020 32.792400 -11.652579 -25.400492 32.664227 -11.423439 -24.235817 32.240822 -11.275459 -23.129366 31.551039 -11.218725 -22.156544 30.641886 -11.257101 -21.383646 29.575321 -11.387974 -20.863344 28.424028 -11.602425 -20.631096 27.266466 -11.885837 -20.702730 26.181522 -12.218898 -21.073360 25.243132 -12.578911 -21.717735 24.515245 -12.941340 -22.591934 24.047468 -13.281487 -23.636389 23.871675 -13.576172 -24.779919 23.999849 -13.805312 -25.944593 24.423256 -13.953292 -27.051044 25.038403 -9.632102 -22.901699 24.474995 -9.829679 -23.594343 24.099691 -9.960450 -24.417913 23.938066 -10.015504 -25.316284 24.001137 -9.991088 -26.228233 24.284601 -9.888866 -27.091610 24.769146 -9.715807 -27.847578 25.421747 -9.483701 -28.444620 26.197931 -9.208367 -28.842051 27.044804 -8.908569 -29.012785 27.904652 -8.604737 -28.945183 28.718878 -8.317578 -28.643856 29.431993 -8.066660 -28.129339 29.995401 -7.869083 -27.436693 30.370707 -7.738311 -26.613123 30.532331 -7.683258 -25.714754 30.469261 -7.707673 -24.802807 30.185797 -7.809894 -23.939430 29.701254 -7.982955 -23.183458 29.048653 -8.215060 -22.586414 28.272467 -8.490394 -22.188986 27.425594 -8.790192 -22.018253 26.565746 -9.094024 -22.085854 25.751520 -9.381183 -22.387178 27.734650 -5.032566 -23.324200 27.276114 -5.340904 -22.906500 26.721313 -5.659920 -22.641495 26.108055 -5.967873 -22.547251 25.478134 -6.243776 -22.630186 24.874475 -6.468827 -22.884647 24.338221 -6.627690 -23.293299 23.905912 -6.709537 -23.828287 23.607014 -6.708791 -24.453156 23.461891 -6.625504 -25.125320 23.480436 -6.465350 -25.798973 23.661386 -6.239244 -26.428207 23.992407 -5.962596 -26.970140 24.450943 -5.654257 -27.387842 25.005745 -5.335242 -27.652845 25.619001 -5.027288 -27.747091 26.248924 -4.751385 -27.664156 26.852581 -4.526334 -27.409695 27.388838 -4.367472 -27.001043 27.821146 -4.285625 -26.466055 28.120045 -4.286370 -25.841187 28.265167 -4.369657 -25.169024 28.246622 -4.529811 -24.495369 28.065672 -4.755916 -23.866137 25.457209 -1.327105 -25.456463 25.804361 -1.319543 -25.029560 26.051247 -1.396355 -24.543800 26.181044 -1.552304 -24.032282 26.184904 -1.776764 -23.529871 26.062565 -2.054438 -23.070797 25.822363 -2.366404 -22.686356 25.480669 -2.691400 -22.402735 25.060770 -3.007279 -22.239271 24.591278 -3.292514 -22.207100 24.104191 -3.527668 -22.308416 23.632700 -3.696715 -22.536314 23.208941 -3.788134 -22.875263 22.861788 -3.795696 -23.302164 22.614902 -3.718884 -23.787926 22.485106 -3.562935 -24.299440 22.481245 -3.338475 -24.801855 22.603584 -3.060801 -25.260927 22.843786 -2.748836 -25.645370 23.185480 -2.423840 -25.928991 23.605379 -2.107960 -26.092455 24.074871 -1.822725 -26.124624 24.561958 -1.587571 -26.023310 25.033447 -1.418524 -25.795414 21.369764 0.001077 -24.085054 21.668959 0.346224 -24.291401 22.040277 0.667770 -24.391159 22.458420 0.943802 -24.377531 22.894890 1.155507 -24.251446 23.319941 1.288460 -24.021494 23.704607 1.333599 -23.703350 24.022675 1.287849 -23.318691 24.252466 1.154327 -22.893734 24.378325 0.942132 -22.457436 24.391670 0.665725 -22.039532 24.291595 0.343943 -21.668503 24.084921 -0.001285 -21.369631 23.785728 -0.346433 -21.163286 23.414408 -0.667979 -21.063526 22.996265 -0.944010 -21.077154 22.559797 -1.155716 -21.203239 22.134747 -1.288669 -21.433191 21.750080 -1.333808 -21.751335 21.432013 -1.288058 -22.135994 21.202219 -1.154536 -22.560951 21.076361 -0.942341 -22.997248 21.063015 -0.665934 -23.415150 21.163088 -0.344153 -23.786182 20.047310 0.603327 -20.106697 19.697815 0.708503 -20.518522 19.444036 0.916538 -20.960251 19.303268 1.213254 -21.401783 19.285105 1.578433 -21.813026 19.390779 1.987185 -22.165958 19.613096 2.411657 -22.436525 19.936901 2.822921 -22.606291 20.340128 3.192950 -22.663681 20.795298 3.496527 -22.604790 21.271391 3.712964 -22.433624 21.735964 3.827511 -22.161858 22.157356 3.832362 -21.808004 22.506849 3.727186 -21.396179 22.760628 3.519151 -20.954449 22.901398 3.222435 -20.512917 22.919561 2.857257 -20.101673 22.813887 2.448504 -19.748741 22.591570 2.024032 -19.478174 22.267765 1.612768 -19.308411 21.864540 1.242739 -19.251019 21.409369 0.939162 -19.309912 20.933275 0.722725 -19.481075 20.468702 0.608178 -19.752842 21.363766 3.676059 -17.130459 20.955032 3.137316 -16.980549 20.446644 2.667123 -16.965050 19.873249 2.297523 -17.085018 19.273920 2.053703 -17.332275 18.689503 1.952279 -17.689976 18.159822 2.000164 -18.133739 17.720978 2.194093 -18.633326 17.402874 2.520850 -19.154686 17.227190 2.958169 -19.662296 17.205898 3.476247 -20.121559 17.340448 4.039776 -20.501179 17.621674 4.610354 -20.775280 18.030407 5.149097 -20.925190 18.538794 5.619290 -20.940689 19.112190 5.988891 -20.820723 19.711517 6.232711 -20.573463 20.295937 6.334135 -20.215763 20.825615 6.286251 -19.771999 21.264460 6.092322 -19.272413 21.582563 5.765564 -18.751053 21.758249 5.328246 -18.243443 21.779541 4.810169 -17.784182 21.644991 4.246639 -17.404564 19.700264 8.728407 -17.588043 20.277758 8.404333 -16.957445 20.694410 7.904255 -16.315178 20.921822 7.262252 -15.705016 20.944500 6.522076 -15.168541 20.760895 5.734168 -14.742310 20.383522 4.952224 -14.455374 19.838099 4.229530 -14.327282 19.161791 3.615338 -14.366769 18.400692 3.151504 -14.571139 17.606668 2.869637 -14.926467 16.833830 2.788946 -15.408537 16.134848 2.914930 -15.984499 15.557352 3.239003 -16.615099 15.140701 3.739081 -17.257364 14.913288 4.381083 -17.867527 14.890610 5.121260 -18.404003 15.074214 5.909168 -18.830233 15.451587 6.691113 -19.117170 15.997011 7.413806 -19.245260 16.673317 8.027998 -19.205776 17.434416 8.491833 -19.001406 18.228439 8.773701 -18.646078 19.001278 8.854392 -18.164007 13.165890 8.693470 -17.442291 13.886059 9.640856 -17.537973 14.776517 10.428371 -17.427315 15.776581 11.002345 -17.117855 16.818098 11.323664 -16.630684 17.830090 11.370429 -15.999001 18.743593 11.139456 -15.265854 19.496353 10.646482 -14.481208 20.037069 9.925105 -13.698532 20.328892 9.024485 -12.971167 20.351938 8.005997 -12.348680 20.104633 6.939050 -11.873493 19.603832 5.896353 -11.577989 18.883665 4.948967 -11.482306 17.993206 4.161452 -11.592965 16.993143 3.587478 -11.902424 15.951626 3.266158 -12.389596 14.939633 3.219392 -13.021277 14.026130 3.450365 -13.754424 13.273371 3.943338 -14.539070 12.732655 4.664715 -15.321745 12.440829 5.565335 -16.049110 12.417784 6.583824 -16.671598 12.665089 7.650771 -17.146786 11.897741 3.726751 -11.491817 10.948483 4.413013 -12.434633 10.268174 5.384580 -13.358857 9.903179 6.575243 -14.201504 9.878372 7.903859 -14.905148 10.195443 9.279885 -15.421837 10.832784 10.609549 -15.716362 11.746960 11.802234 -15.768648 12.875673 12.776662 -15.575134 14.142003 13.466426 -15.149008 15.459651 13.824523 -14.519310 16.738823 13.826545 -13.728951 17.892344 13.472358 -12.831793 18.841604 12.786097 -11.888977 19.521912 11.814530 -10.964753 19.886908 10.623867 -10.122107 19.911715 9.295251 -9.418462 19.594645 7.919224 -8.901772 18.957304 6.589561 -8.607247 18.043129 5.396876 -8.554960 16.914415 4.422448 -8.748473 15.648086 3.732682 -9.174599 14.330438 3.374586 -9.804298 13.051266 3.372562 -10.594657 18.362610 7.131623 -5.630795 17.256811 5.694372 -5.628901 15.891127 4.534665 -5.909024 14.358625 3.731533 -6.452076 12.763745 3.339709 -7.221046 11.215176 3.385895 -8.163532 9.818446 3.866942 -9.215305 8.668744 4.750070 -10.304688 7.844419 5.975093 -11.357441 7.401647 7.458530 -12.301821 7.370602 9.099285 -13.073469 7.753400 10.785544 -13.619801 8.523954 12.402392 -13.903584 9.629752 13.839643 -13.905478 10.995437 14.999351 -13.625355 12.527937 15.802484 -13.082304 14.122818 16.194309 -12.313333 15.671389 16.148125 -11.370847 17.068117 15.667076 -10.319075 18.217821 14.783949 -9.229692 19.042147 13.558926 -8.176939 19.484919 12.075490 -7.232559 19.515965 10.434735 -6.460910 19.133167 8.748476 -5.914578 16.188366 17.659906 -7.761829 17.523726 16.599730 -6.548179 18.484091 15.145932 -5.388754 19.004019 13.397587 -4.362566 19.048077 11.473840 -3.539548 18.613262 9.505793 -2.975788 17.729204 7.627565 -2.709704 16.456154 5.967154 -2.759430 14.880865 4.637713 -3.121577 13.110692 3.729842 -3.771465 11.266269 3.305412 -4.664806 9.473289 3.393345 -5.740720 7.853942 3.987649 -6.925885 6.518584 5.047824 -8.139534 5.558217 6.501622 -9.298960 5.038288 8.249966 -10.325148 4.994229 10.173714 -11.148167 5.429045 12.141760 -11.711927 6.313101 14.019988 -11.978012 7.586151 15.680400 -11.928286 9.161439 17.009842 -11.566139 10.931612 17.917713 -10.916251 12.776035 18.342144 -10.022911 14.569016 18.254213 -8.946998 4.269141 15.425410 -9.914595 5.667158 17.267502 -9.815483 7.402542 18.736443 -9.381628 9.357030 19.732128 -8.642597 11.397425 20.186703 -7.648754 13.384678 20.069189 -6.467827 15.183363 19.387594 -5.180295 16.670900 18.188372 -3.873900 17.745916 16.553240 -2.637672 18.335154 14.593635 -1.555858 18.398455 12.443100 -0.702180 17.931505 10.248190 -0.134816 16.966129 8.158484 0.107570 15.568112 6.316392 0.008459 13.832729 4.847451 -0.425395 11.878242 3.851765 -1.164426 9.837846 3.397188 -2.158269 7.850592 3.514701 -3.339196 6.051908 4.196295 -4.626728 4.564369 5.395518 -5.933123 3.489352 7.030649 -7.169351 2.900114 8.990253 -8.251165 2.836812 11.140787 -9.104844 3.303761 13.335698 -9.672209 4.437686 4.584100 -2.317225 2.848431 5.871147 -3.679135 1.693367 7.622865 -4.957545 1.051209 9.719875 -6.065333 0.965720 12.019274 -6.927007 1.442725 14.364357 -7.483843 2.449717 16.595314 -7.697895 3.918072 18.560106 -7.554574 5.747724 20.124838 -7.063650 7.813984 21.182875 -6.258576 9.976040 21.662115 -5.194219 12.086553 21.529898 -3.943111 14.001694 20.795235 -2.590513 15.590949 19.508188 -1.228604 16.746014 17.756470 0.049806 17.388172 15.659460 1.157595 17.473663 13.360063 2.019269 16.996658 11.014978 2.576106 15.989667 8.784021 2.790158 14.521313 6.819228 2.646838 12.691662 5.254495 2.155914 10.625402 4.196457 1.350842 8.463346 3.717217 0.286484 6.352833 3.849433 -0.964624 14.729445 9.537191 5.325425 13.251380 7.521543 5.143655 11.402670 5.915471 4.611344 9.309301 4.828425 3.764769 7.113933 4.334486 2.661621 4.966177 4.467317 1.377079 3.012398 5.217863 -0.001318 1.385743 6.534975 -1.379635 0.197067 8.328897 -2.663941 -0.472626 10.477373 -3.766714 -0.577696 12.833991 -4.612802 -0.110982 15.238150 -5.144543 0.895709 17.526009 -5.325702 2.373772 19.541658 -5.143933 4.222482 21.147730 -4.611623 6.315850 22.234777 -3.765048 8.511219 22.728718 -2.661901 10.658976 22.595888 -1.377358 12.612755 21.845343 0.001039 14.239410 20.528231 1.379356 15.428087 18.734310 2.663662 16.097780 16.585835 3.766435 16.202852 14.229216 4.612523 15.736139 11.825058 5.144265 11.008952 22.523100 2.593252 12.602128 21.231596 3.946350 13.771269 19.469704 5.197719 14.436699 17.357500 6.262080 14.553072 15.038923 7.066898 14.112454 12.671985 7.557328 13.144876 10.417982 7.699946 11.716275 8.430526 7.485035 9.924007 6.845057 6.927238 7.890215 5.769622 6.064570 5.753496 5.277510 4.955820 3.659465 5.402259 3.676548 1.750825 6.135365 2.313932 0.157648 7.426870 0.960835 -1.011493 9.188759 -0.290534 -1.676925 11.300963 -1.354895 -1.793298 13.619541 -2.159715 -1.352682 15.986482 -2.650145 -0.385104 18.240482 -2.792764 1.043496 20.227940 -2.577852 2.835763 21.813410 -2.020056 4.869556 22.888845 -1.157389 7.006275 23.380957 -0.048639 9.100307 23.256208 1.230633 -1.415829 18.773691 -0.108954 -0.088754 20.654490 0.134251 1.578532 22.156145 0.702455 3.472407 23.176325 1.556937 5.463807 23.645508 2.639464 7.417021 23.531713 3.876264 9.198941 22.842705 5.183052 10.688132 21.625431 6.470771 11.783109 19.962847 7.651668 12.409248 17.968260 8.645264 12.523883 15.777591 9.383846 12.119200 13.540137 9.817086 11.222777 11.408373 9.915456 9.895704 9.527576 9.672253 8.228418 8.025919 9.104048 6.334544 7.005738 8.249567 4.343143 6.536555 7.167040 2.389929 6.650348 5.930240 0.608008 7.339357 4.623452 -0.881183 8.556630 3.335732 -1.976160 10.219212 2.154836 -2.602301 12.213799 1.161240 -2.716937 14.404467 0.422655 -2.312254 16.641922 -0.010584 -0.474039 8.795867 6.922673 -1.797848 9.901520 5.737228 -2.769935 11.410673 4.661256 -3.324056 13.220481 3.768080 -3.422446 15.207607 3.118569 -3.058402 17.236633 2.756988 -2.256732 19.169285 2.707977 -1.072069 20.873852 2.974874 0.414855 22.234177 3.539494 2.102708 23.157551 4.363356 3.876465 23.581047 5.390317 5.615249 23.475809 6.550391 7.200563 22.849005 7.764521 8.524372 21.743355 8.949965 9.496461 20.234201 10.025938 10.050582 18.424393 10.919113 10.148973 16.437265 11.568624 9.784929 14.408239 11.930206 8.983260 12.475590 11.979218 7.798597 10.771021 11.712320 6.311674 9.410697 11.147702 4.623822 8.487322 10.323840 2.850064 8.063825 9.296879 1.111281 8.169062 8.136806 6.476633 13.581222 13.904907 5.461614 12.105663 13.620182 4.192770 10.931320 13.072865 2.756571 10.138221 12.300251 1.250891 9.780415 11.354996 -0.221660 9.882285 10.301517 -1.560729 10.436890 9.211604 -2.675063 11.406434 8.159536 -3.488721 12.724844 7.217009 -3.946253 14.302272 6.448252 -4.016479 16.031221 5.905657 -3.694615 17.793863 5.626201 -3.002594 19.470081 5.628928 -1.987575 20.945639 5.913651 -0.718732 22.119982 6.460968 0.717466 22.913082 7.233580 2.223147 23.270889 8.178836 3.695698 23.169020 9.232317 5.034768 22.614416 10.322228 6.149102 21.644871 11.374297 6.962759 20.326462 12.316825 7.420292 18.749035 13.085581 7.490520 17.020086 13.628177 7.168656 15.257443 13.907633 2.722141 22.230633 12.835022 3.604911 21.408230 13.732478 4.242020 20.298988 14.522878 4.590049 18.978502 15.152358 4.625281 17.536758 15.578018 4.345316 16.072008 15.770852 3.769233 14.684074 15.717718 2.936289 13.467543 15.422237 1.903250 12.505316 14.904547 0.740516 11.862968 14.199924 -0.472677 11.584276 13.356391 -1.653650 11.688229 12.431430 -2.721921 12.167747 11.488077 -3.604692 12.990149 10.590621 -4.241801 14.099388 9.800220 -4.589830 15.419875 9.170741 -4.625064 16.861620 8.745080 -4.345099 18.326370 8.552245 -3.769016 19.714304 8.605379 -2.936073 20.930836 8.900858 -1.903034 21.893063 9.418550 -0.740299 22.535410 10.123172 0.472893 22.814104 10.966705 1.653866 22.710150 11.891665 -4.692580 19.927637 11.576422 -4.039962 20.882423 11.872893 -3.239782 21.629673 12.349072 -2.346569 22.118465 12.972506 -1.421194 22.315491 13.700710 -0.526722 22.207319 14.484059 0.275893 21.801325 15.269169 0.931952 21.125175 16.002535 1.396747 20.224949 16.634178 1.638603 19.161993 17.121056 1.641037 18.008747 17.429989 1.403884 16.843807 17.539919 0.943305 15.746555 17.443359 0.290688 14.791769 17.146889 -0.509492 14.044518 16.670712 -1.402705 13.555725 16.047276 -2.328080 13.358701 15.319072 -3.222553 13.466871 14.535723 -4.025167 13.872865 13.750614 -4.681227 14.549014 13.017248 -5.146022 15.449242 12.385603 -5.387878 16.512196 11.898726 -5.390313 17.665440 11.589794 -5.153160 18.830383 11.479861 -5.542624 15.431126 15.981458 -6.000750 15.973849 15.405434 -6.316860 16.683807 14.923493 -6.469412 17.512619 14.568481 -6.448009 18.403799 14.364594 -6.254111 19.296619 14.325718 -5.900931 20.130230 14.454513 -5.412538 20.847826 14.742192 -4.822215 21.400505 15.169155 -4.170191 21.750597 15.706306 -3.500901 21.874252 16.317039 -2.859957 21.763039 16.959730 -2.291036 21.424534 17.590586 -1.832910 20.881811 18.166611 -1.516800 20.171852 18.648550 -1.364248 19.343042 19.003563 -1.385650 18.451860 19.207453 -1.579548 17.559042 19.246326 -1.932727 16.725431 19.117535 -2.421120 16.007833 18.829853 -3.011443 15.455157 18.402889 -3.663467 15.105062 17.865738 -4.332757 14.981407 17.255007 -4.973702 15.092621 16.612314 -4.820014 17.564363 20.775515 -5.173284 17.035757 20.500595 -5.593660 16.637789 20.120184 -6.052495 16.397581 19.660208 -6.518519 16.331505 19.152012 -6.959974 16.444059 18.630234 -7.346774 16.727579 18.130423 -7.652561 17.162737 17.686647 -7.856495 17.719885 17.329145 -7.944679 18.361048 17.082287 -7.911103 19.042532 16.962887 -7.758056 19.717899 16.979086 -7.495966 20.341122 17.129782 -7.142696 20.869728 17.404701 -6.722319 21.267696 17.785112 -6.263485 21.507904 18.245087 -5.797461 21.573982 18.753283 -5.356006 21.461428 19.275063 -4.969205 21.177910 19.774874 -4.663418 20.742750 20.218649 -4.459484 20.185604 20.576149 -4.371300 19.544443 20.823009 -4.404876 18.862955 20.942410 -4.557923 18.187590 20.926210 -7.760534 21.104124 21.810688 -7.554564 20.736403 22.164488 -7.421895 20.276518 22.436010 -7.371571 19.755814 22.606750 -7.407020 19.209774 22.665075 -7.525826 18.675611 22.607008 -7.719893 18.189726 22.436504 -7.975996 17.785231 22.165186 -8.276681 17.489693 21.811544 -8.601458 17.323250 21.399677 -8.928193 17.297247 20.957653 -9.234620 17.413456 20.515594 -9.499857 17.663958 20.103626 -9.705828 18.031679 19.749826 -9.838496 18.491562 19.478306 -9.888821 19.012266 19.307564 -9.853372 19.558306 19.249239 -9.734566 20.092470 19.307306 -9.540499 20.578356 19.477810 -9.284396 20.982851 19.749125 -8.983711 21.278389 20.102770 -8.658934 21.444832 20.514637 -8.332199 21.470835 20.956661 -8.025771 21.354626 21.398720 -12.041378 20.858768 21.369621 -11.846275 21.210096 21.669165 -11.618271 21.457314 22.040810 -11.372904 21.583570 22.459230 -11.126894 21.580265 22.895910 -10.897008 21.447624 23.321095 -10.698912 21.194683 23.705805 -10.546104 20.838684 24.023821 -10.449001 20.403883 24.253475 -10.414218 19.919912 24.379116 -10.444126 19.419756 24.392179 -10.536687 18.937496 24.291777 -10.685592 18.506001 24.084751 -10.880695 18.154675 23.785208 -11.108699 17.907455 23.413563 -11.354067 17.781199 22.995142 -11.600077 17.784502 22.558462 -11.829963 17.917143 22.133278 -12.028059 18.170084 21.748569 -12.180865 18.526085 21.430552 -12.277969 18.960886 21.200897 -12.312753 19.444857 21.075256 -12.282845 19.945011 21.062193 -12.190285 20.427271 21.162594 -14.881422 18.206755 22.872309 -15.013664 18.619774 22.533588 -15.102805 19.112835 22.306095 -15.142770 19.652332 22.205336 -15.130836 20.201500 22.238173 -15.067817 20.722916 22.402372 -14.958007 21.181044 22.686745 -14.808888 21.544664 23.071907 -14.630624 21.788996 23.531614 -14.435363 21.897390 24.034536 -14.236411 21.862459 24.546400 -14.047327 21.686583 25.032322 -13.880997 21.381746 25.459190 -13.748755 20.968727 25.797915 -13.659615 20.475668 26.025406 -13.619649 19.936171 26.126165 -13.631582 19.387001 26.093328 -13.694601 18.865585 25.929129 -13.804412 18.407457 25.644756 -13.953530 18.043839 25.259594 -14.131794 17.799505 24.799887 -14.327056 17.691111 24.296965 -14.526007 17.726042 23.785101 -14.715091 17.901917 23.299179 -17.161488 17.795561 26.969301 -17.234159 17.371019 26.426842 -17.338064 17.101767 25.797173 -17.466125 17.006151 25.123199 -17.609613 17.090691 24.450857 -17.758751 17.349621 23.825962 -17.903374 17.765301 23.291105 -18.033627 18.309401 22.882729 -18.140633 18.944839 22.628668 -18.217098 19.628313 22.546234 -18.257816 20.313246 22.641045 -18.260008 20.952959 22.906641 -18.223526 21.503857 23.324921 -18.150856 21.928400 23.867380 -18.046949 22.197655 24.497051 -17.918888 22.293268 25.171024 -17.775400 22.208731 25.843367 -17.626263 21.949799 26.468260 -17.481640 21.534119 27.003119 -17.351387 20.990021 27.411495 -17.244381 20.354584 27.665558 -17.167915 19.671108 27.747990 -17.127197 18.986174 27.653179 -17.125006 18.346462 27.387583 -21.710514 21.452742 28.130262 -21.571426 20.709469 28.644449 -21.412550 19.860723 28.945402 -21.244717 18.964344 29.012613 -21.079361 18.081417 28.841501 -20.927752 17.272110 28.443729 -20.800220 16.591579 27.846403 -20.705460 16.086203 27.090233 -20.649925 15.790416 26.226746 -20.637405 15.724380 25.314787 -20.668749 15.892595 24.416510 -20.741823 16.283598 23.593124 -20.851646 16.870741 22.900749 -20.990734 17.614012 22.386562 -21.149609 18.462755 22.085609 -21.317444 19.359137 22.018396 -21.482800 20.242065 22.189507 -21.634409 21.051371 22.587278 -21.761940 21.731903 23.184605 -21.856701 22.237282 23.940775 -21.912235 22.533068 24.804264 -21.924755 22.599100 25.716221 -21.893412 22.430885 26.614500 -21.820337 22.039885 27.437883 -25.488634 21.716450 22.158482 -25.885962 22.284065 23.130743 -26.229053 22.575346 24.236542 -26.494526 22.570442 25.400520 -26.664288 22.269688 26.543358 -26.726768 21.693579 27.587168 -26.677715 20.881376 28.460817 -26.520466 19.888430 29.104773 -26.265739 18.782408 29.475145 -25.930893 17.638683 29.546696 -25.538748 16.535200 29.314548 -25.116028 15.547158 28.794525 -24.691538 14.741890 28.022060 -24.294210 14.174273 27.049801 -23.951120 13.882993 25.944002 -23.685648 13.887897 24.780024 -23.515884 14.188652 23.637186 -23.453403 14.764760 22.593374 -23.502457 15.576962 21.719725 -23.659706 16.569910 21.075771 -23.914433 17.675930 20.705399 -24.249277 18.819654 20.633846 -24.641424 19.923138 20.865993 -25.064144 20.911182 21.386019 -25.776077 13.929348 19.833019 -25.961096 15.196231 19.044512 -26.353539 16.568731 18.572079 -26.926661 17.953318 18.447910 -27.641403 19.255632 18.680473 -28.449059 20.386925 19.253914 -29.294588 21.270098 20.129158 -30.120367 21.844967 21.246555 -30.870121 22.072353 22.529961 -31.492758 21.936762 23.891911 -31.945843 21.447435 25.239590 -32.198502 20.637718 26.481155 -32.233513 19.562792 27.531996 -32.048492 18.295910 28.320503 -31.656052 16.923409 28.792940 -31.082932 15.538824 28.917107 -30.368187 14.236507 28.684546 -29.560532 13.105216 28.111105 -28.715004 12.222042 27.235859 -27.889225 11.647173 26.118464 -27.139469 11.419785 24.835058 -26.516834 11.555374 23.473110 -26.063747 12.044701 22.125431 -25.811089 12.854418 20.883865 -32.658993 9.043101 25.265549 -31.344107 8.534195 24.125113 -30.131029 8.440065 22.780462 -29.102427 8.767125 21.323233 -28.328398 9.493086 19.852736 -27.861691 10.568476 18.469179 -27.734112 11.920007 17.266853 -27.954353 13.455576 16.327692 -28.507408 15.070536 15.715697 -29.355587 16.654831 15.472579 -30.441086 18.100494 15.614902 -31.689930 19.309004 16.132967 -33.017014 20.198004 16.991472 -34.331902 20.706911 18.131908 -35.544979 20.801041 19.476559 -36.573582 20.473982 20.933786 -37.347610 19.748022 22.404285 -37.814320 18.672632 23.787840 -37.941898 17.321100 24.990168 -37.721657 15.785533 25.929331 -37.168602 14.170572 26.541325 -36.320423 12.586277 26.784445 -35.234924 11.140615 26.642120 -33.986080 9.932104 26.124054 -43.225967 14.103564 20.717365 -42.968212 12.332311 21.801962 -42.257915 10.525033 22.582569 -41.143482 8.804894 23.005997 -39.700863 7.289120 23.043385 -38.028366 6.081006 22.692186 -36.239971 5.262885 21.976334 -34.457554 4.890509 20.944613 -32.802586 4.989255 19.667334 -31.387842 5.552395 18.231541 -30.309744 6.541551 16.735079 -29.641758 7.889313 15.279932 -29.429405 9.503834 13.965264 -29.687160 11.275087 12.880669 -30.397455 13.082364 12.100059 -31.511887 14.802503 11.676633 -32.954506 16.318279 11.639244 -34.627003 17.526394 11.990443 -36.415398 18.344515 12.706293 -38.197815 18.716892 13.738014 -39.852787 18.618145 15.015293 -41.267529 18.055008 16.451086 -42.345627 17.065851 17.947548 -43.013615 15.718090 19.402695 -39.187389 15.638653 7.360697 -41.347305 15.820262 8.172726 -43.358086 15.490984 9.270877 -45.082703 14.673261 10.580316 -46.403622 13.422819 12.011806 -47.230831 11.824874 13.467792 -47.507954 9.988322 14.849051 -47.216103 8.038321 16.061455 -46.375172 6.107763 17.022379 -45.042465 4.328209 17.666338 -43.308807 2.820935 17.949446 -41.292343 1.688657 17.852413 -39.130493 1.008539 17.381847 -36.970577 0.826930 16.569820 -34.959797 1.156207 15.471670 -33.235180 1.973928 14.162231 -31.914257 3.224371 12.730742 -31.087049 4.822316 11.274755 -30.809925 6.658867 9.893495 -31.101774 8.608867 8.681090 -31.942705 10.539427 7.720166 -33.275410 12.318979 7.076207 -35.009068 13.826255 6.793098 -37.025532 14.958534 6.890131 -31.736790 3.441424 5.149161 -32.053955 5.494041 3.836451 -32.981972 7.466049 2.701990 -34.457600 9.223061 1.823090 -36.380280 10.645338 1.259647 -38.618980 11.635955 1.050059 -41.021141 12.127403 1.208608 -43.423058 12.086190 1.724490 -45.661041 11.515126 2.562547 -47.582581 10.453127 3.665668 -49.056725 8.972567 4.958677 -49.983013 7.174343 6.353458 -50.298321 5.181002 7.754959 -49.981159 3.128386 9.067670 -49.053143 1.156378 10.202130 -47.577515 -0.600634 11.081030 -45.654835 -2.022913 11.644474 -43.416134 -3.013531 11.854063 -41.013973 -3.504980 11.695515 -38.612057 -3.463767 11.179634 -36.374073 -2.892704 10.341578 -34.452534 -1.830706 9.238456 -32.978390 -0.350146 7.945447 -32.052101 1.448077 6.550666 -41.666393 -7.987603 5.325241 -39.181740 -7.713979 5.145841 -36.866432 -6.914655 4.615768 -34.878250 -5.644102 3.771147 -33.352688 -3.988909 2.669536 -32.393711 -2.061872 1.386009 -32.066669 0.005682 0.008036 -32.393852 2.072855 -1.370477 -33.352959 3.998772 -2.655586 -34.878632 5.652184 -3.759713 -36.866898 6.920415 -4.607615 -39.182262 7.717037 -5.141507 -41.666931 7.987760 -5.325006 -44.151585 7.714137 -5.145606 -46.466892 6.914813 -4.615534 -48.455074 5.644262 -3.770914 -49.980637 3.989068 -2.669302 -50.939617 2.062032 -1.385776 -51.266659 -0.005522 -0.007802 -50.939480 -2.072695 1.370710 -49.980370 -3.998612 2.655820 -48.454697 -5.652025 3.759948 -46.466431 -6.920256 4.607849 -44.151070 -7.716879 5.141742 -50.294907 -5.192605 -7.771467 -49.979828 -7.184809 -6.368291 -49.053989 -8.981172 -4.970807 -47.580486 -10.459272 -3.674254 -45.659729 -11.518385 -2.566988 -43.422623 -12.086329 -1.724469 -41.021618 -12.124401 -1.204111 -38.620338 -11.630009 -1.041377 -36.382427 -10.636840 -1.247357 -34.460396 -9.212582 -1.808013 -32.985229 -7.454292 -2.685138 -32.057453 -5.481797 -3.818957 -31.740297 -3.429518 -5.132202 -32.055374 -1.437315 -6.535378 -32.981209 0.359047 -7.932861 -34.454712 1.837149 -9.229414 -36.375469 2.896262 -10.336681 -38.612576 3.464208 -11.179201 -41.013580 3.502281 -11.699560 -43.414860 3.007888 -11.862294 -45.652771 2.014721 -11.656315 -47.574802 0.590464 -11.095659 -49.049973 -1.167826 -10.218534 -49.977749 -3.140321 -9.084716 -39.130539 -1.009234 -17.382906 -41.290699 -1.692108 -17.857265 -43.305592 -2.826896 -17.957752 -45.037899 -4.336267 -17.677515 -46.369576 -6.117359 -17.035652 -47.209862 -8.048792 -16.075907 -47.501499 -9.998943 -14.863684 -47.224609 -11.834913 -13.481593 -46.398064 -13.431585 -12.023822 -45.078190 -14.680145 -10.589716 -43.354939 -15.495508 -9.277007 -41.345737 -15.822108 -8.175153 -39.187519 -15.637688 -7.359244 -37.027359 -14.954815 -6.884884 -35.012466 -13.820027 -6.784397 -33.280155 -12.310658 -7.064634 -31.948481 -10.529565 -7.706496 -31.108192 -8.598132 -8.666241 -30.816555 -6.647981 -9.878464 -31.093443 -4.812010 -11.260554 -31.919989 -3.215339 -12.718326 -33.239861 -1.966778 -14.152431 -34.963116 -1.151414 -15.465141 -36.972313 -0.824813 -16.566996 -29.437725 -9.495262 -13.954064 -29.650127 -7.880823 -15.268840 -30.317602 -6.533714 -16.724840 -31.394663 -5.545738 -18.222841 -32.807907 -4.984224 -19.660757 -34.461029 -4.887438 -20.940596 -36.241367 -5.261977 -21.975138 -38.027596 -6.082314 -22.693884 -39.697987 -7.292547 -23.047848 -41.138702 -8.810200 -23.012913 -42.251568 -10.531847 -22.591454 -42.960739 -12.340161 -21.812201 -43.217884 -14.111909 -20.728249 -43.005482 -15.726349 -19.413475 -42.338009 -17.073458 -17.957476 -41.260948 -18.061434 -16.459473 -39.847702 -18.622950 -15.021557 -38.194584 -18.719736 -13.741717 -36.414246 -18.345198 -12.707174 -34.628017 -17.524860 -11.988430 -32.957626 -16.314629 -11.634464 -31.516907 -14.796976 -11.669400 -30.404043 -13.075330 -12.090857 -29.694872 -11.267015 -12.870111 -33.018463 -20.196543 -16.989500 -31.694536 -19.305323 -16.128405 -30.448542 -18.094837 -15.608051 -29.365396 -16.647577 -15.463900 -28.518911 -15.062173 -15.705775 -27.966776 -13.446669 -16.317194 -27.746614 -11.911156 -17.256487 -27.873432 -10.560278 -18.459646 -28.338585 -9.486095 -19.844675 -29.110376 -8.761811 -21.317188 -30.136209 -8.436785 -22.776834 -31.346172 -8.533165 -24.124144 -32.657810 -9.044384 -25.267298 -33.981739 -9.935604 -26.128393 -35.227734 -11.146090 -26.648746 -36.310879 -12.593349 -26.792896 -37.157364 -14.178752 -26.551022 -37.709503 -15.794258 -25.939604 -37.929665 -17.329771 -25.000313 -37.802845 -18.680649 -23.797155 -37.337692 -19.754833 -22.412127 -36.565903 -20.479116 -20.939613 -35.540070 -20.804144 -19.479965 -34.330105 -20.707764 -18.132656 -32.217747 -19.571220 -27.539070 -32.184311 -20.645113 -26.487103 -31.934202 -21.453289 -25.244003 -31.484470 -21.940670 -23.894485 -30.865763 -22.074043 -22.530516 -30.120243 -21.844320 -21.245049 -29.298716 -21.267155 -20.125687 -28.457169 -20.381884 -19.248711 -27.652952 -19.248829 -18.673883 -26.940870 -17.945213 -18.440384 -26.369452 -16.559874 -18.564119 -25.977634 -15.187218 -19.036661 -25.792126 -13.920790 -19.825806 -25.825563 -12.846897 -20.877771 -26.075670 -12.038721 -22.120869 -26.525400 -11.551339 -23.470387 -27.144110 -11.417964 -24.834358 -27.889629 -11.647686 -26.119825 -28.711155 -12.224852 -27.239189 -29.552702 -13.110125 -28.116165 -30.356918 -14.243177 -28.690990 -31.069002 -15.546793 -28.924492 -31.640421 -16.932133 -28.800756 -32.032238 -18.304790 -28.328217 -24.689463 -14.743328 -28.023552 -25.110842 -15.549777 -28.796499 -25.530815 -16.538820 -29.316875 -25.920763 -17.643053 -29.549212 -26.254110 -18.787228 -29.477676 -26.508142 -19.893368 -29.107143 -26.665545 -20.886093 -28.462866 -26.715591 -21.697750 -27.588747 -26.654873 -22.273026 -26.544363 -26.487526 -22.572718 -25.400881 -26.224955 -22.576399 -24.236229 -25.885056 -22.283823 -23.129774 -25.490988 -21.714924 -22.156923 -25.069611 -20.908476 -21.383972 -24.649637 -19.919434 -20.863598 -24.259689 -18.815201 -20.631262 -23.926340 -17.671026 -20.702799 -23.672308 -16.564884 -21.073328 -23.514906 -15.572161 -21.717607 -23.464859 -14.760504 -22.591722 -23.525578 -14.185227 -23.636108 -23.692924 -13.885536 -24.779591 -23.955494 -13.881852 -25.944242 -24.295395 -14.174428 -27.050697 -20.859888 -16.868547 -22.901285 -20.749496 -16.281672 -23.593811 -20.675341 -15.891068 -24.417297 -20.642473 -15.723351 -25.315624 -20.653135 -15.789955 -26.227573 -20.706600 -16.086338 -27.090996 -20.799223 -16.592302 -27.847052 -20.924694 -17.273369 -28.444218 -21.074461 -18.083124 -28.841795 -21.238317 -18.966383 -29.012691 -21.405096 -19.862953 -28.945263 -21.563435 -20.711735 -28.644100 -21.702539 -21.454885 -28.129728 -21.812931 -22.041759 -27.437204 -21.887087 -22.432367 -26.613720 -21.919954 -22.600080 -25.715391 -21.909292 -22.533480 -24.803440 -21.855827 -22.237095 -23.940020 -21.763205 -21.731131 -23.183964 -21.637733 -21.050064 -22.586798 -21.487968 -20.240309 -22.189219 -21.324112 -19.357052 -22.018322 -21.157331 -18.460482 -22.085751 -20.998993 -17.611700 -22.386913 -18.225742 -21.502609 -23.324263 -18.263571 -20.951342 -22.906576 -18.262493 -20.311369 -22.641581 -18.222580 -19.626303 -22.547337 -18.146551 -18.942835 -22.630262 -18.039589 -18.307533 -22.884708 -17.908981 -17.763702 -23.293337 -17.763630 -17.348398 -23.828299 -17.613441 -17.089924 -24.453135 -17.468647 -17.005890 -25.125269 -17.339119 -17.102032 -25.798893 -17.233681 -17.371792 -26.428101 -17.159521 -17.796787 -26.970011 -17.121691 -18.348055 -27.387695 -17.122768 -18.988028 -27.652691 -17.162682 -19.673090 -27.746939 -17.238710 -20.356562 -27.664013 -17.345673 -20.991859 -27.409565 -17.476280 -21.535694 -27.000938 -17.621632 -21.950998 -26.465975 -17.771820 -22.209475 -25.841139 -17.916615 -22.293505 -25.169004 -18.046143 -22.197365 -24.495382 -18.151581 -21.927605 -23.866175 -13.877616 -21.382988 -25.456375 -14.044682 -21.687420 -25.029501 -14.234690 -21.862835 -24.543766 -14.434690 -21.897280 -24.032274 -14.631054 -21.788404 -23.529881 -14.810398 -21.543633 -23.070826 -14.960503 -21.179644 -22.686390 -15.071136 -20.721241 -22.402775 -15.134762 -20.199667 -22.239304 -15.147040 -19.650463 -22.207121 -15.107137 -19.111059 -22.308420 -15.017771 -18.618214 -22.536295 -14.885032 -18.205513 -22.875217 -14.717966 -17.901081 -23.302092 -14.527959 -17.725666 -23.787825 -14.327958 -17.691223 -24.299316 -14.131595 -17.800095 -24.801708 -13.952250 -18.044867 -25.260767 -13.802145 -18.408857 -25.645203 -13.691511 -18.867260 -25.928818 -13.627886 -19.388832 -26.092289 -13.615607 -19.938036 -26.124472 -13.655510 -20.477442 -26.023174 -13.744877 -20.970287 -25.795300 -10.683930 -18.507092 -24.084866 -10.534564 -18.938738 -24.291246 -10.441695 -19.421062 -24.391041 -10.411652 -19.921198 -24.377453 -10.446481 -20.405058 -24.251406 -10.543809 -20.839670 -24.021488 -10.697004 -21.195415 -23.703371 -10.895626 -21.448051 -23.318733 -11.126139 -21.580360 -22.893787 -11.372833 -21.583326 -22.457491 -11.618897 -21.456745 -22.039576 -11.847563 -21.209246 -21.668526 -12.043246 -20.857695 -21.369625 -12.192613 -20.426048 -21.163244 -12.285481 -19.943722 -21.063450 -12.315525 -19.443588 -21.077036 -12.280697 -18.959726 -21.203083 -12.183368 -18.525116 -21.433001 -12.030172 -18.169369 -21.751118 -11.831552 -17.916735 -22.135756 -11.601039 -17.784424 -22.560703 -11.354344 -17.781458 -22.997000 -11.108279 -17.908039 -23.414915 -10.879614 -18.155539 -23.785963 -9.501036 -17.663181 -20.106434 -9.235203 -17.413057 -20.518242 -8.928146 -17.297255 -20.959967 -8.600791 -17.323666 -21.401505 -8.275446 -17.490488 -21.812765 -7.974284 -17.786352 -22.165722 -7.717826 -18.191099 -22.436321 -7.523552 -18.677143 -22.606125 -7.404700 -19.211361 -22.663557 -7.369370 -19.757349 -22.604706 -7.419970 -20.277897 -22.433580 -7.553050 -20.737532 -22.161846 -7.759542 -21.104927 -21.808020 -8.025375 -21.355049 -21.396210 -8.332432 -21.470854 -20.954485 -8.659786 -21.444443 -20.512949 -8.985131 -21.277620 -20.101686 -9.286294 -20.981756 -19.748730 -9.542751 -20.577011 -19.478130 -9.737025 -20.090965 -19.308327 -9.855878 -19.556747 -19.250896 -9.891208 -19.010759 -19.309746 -9.840609 -18.490211 -19.480869 -9.707528 -18.030577 -19.752604 -7.498581 -20.339510 -17.130520 -7.760771 -19.716137 -16.980648 -7.913740 -19.040743 -16.965172 -7.947063 -18.359350 -17.085146 -7.858470 -17.718401 -17.332392 -7.653997 -17.161570 -17.690058 -7.347580 -16.726805 -18.133776 -6.960100 -16.443735 -18.633303 -6.517963 -16.331650 -19.154600 -6.051300 -16.398190 -19.662138 -5.591914 -16.638821 -20.121330 -5.171110 -17.037140 -20.500885 -4.817566 -17.566008 -20.774937 -4.555376 -18.189379 -20.924809 -4.402407 -18.864775 -20.940285 -4.369083 -19.546164 -20.820313 -4.457677 -20.187117 -20.573067 -4.662149 -20.743948 -20.215397 -4.968566 -21.178713 -19.771681 -5.356046 -21.461784 -19.272154 -5.798183 -21.573868 -18.750858 -6.264846 -21.507328 -18.243320 -6.724233 -21.266699 -17.784126 -7.145036 -20.868378 -17.404572 -2.290608 -21.424807 -17.588547 -2.859875 -21.763069 -16.957890 -3.501177 -21.874043 -16.315525 -4.170810 -21.750162 -15.705229 -4.823140 -21.399874 -15.168592 -5.413712 -20.847044 -14.742187 -5.902278 -20.129353 -14.455071 -6.255545 -19.295706 -14.326811 -6.449438 -18.402916 -14.366147 -6.470743 -17.511824 -14.570398 -6.318008 -16.683159 -14.925647 -6.001642 -15.973392 -15.407683 -5.543205 -15.430891 -15.983655 -4.973938 -15.092628 -16.614313 -4.332637 -14.981655 -17.256680 -3.663004 -15.105535 -17.866974 -3.010674 -15.455824 -18.403612 -2.420102 -16.008652 -18.830017 -1.931535 -16.726343 -19.117134 -1.578268 -17.559992 -19.245394 -1.384375 -18.452780 -19.206059 -1.363070 -19.343872 -19.001806 -1.515804 -20.172537 -18.646557 -1.832170 -20.882305 -18.164522 0.946731 -15.748695 -17.441532 1.407137 -16.846098 -17.537088 1.643891 -18.011036 -17.426353 1.640859 -19.164122 -17.116869 1.398248 -20.226774 -16.629728 0.932590 -21.126575 -15.998129 0.275621 -21.802204 -15.265114 -0.527889 -22.207619 -14.480637 -1.423182 -22.315193 -13.698157 -2.349245 -22.117590 -12.971001 -3.242968 -21.628284 -12.348722 -4.043447 -20.880613 -11.873728 -4.696128 -19.925533 -11.578388 -5.156535 -18.828133 -11.482830 -5.393289 -17.663195 -11.593567 -5.390258 -16.510109 -11.903050 -5.147646 -15.447455 -12.390191 -4.681989 -14.547655 -13.021791 -4.025020 -13.872025 -13.754806 -3.221511 -13.466610 -14.539283 -2.326218 -13.359036 -15.321762 -1.400155 -13.556637 -16.048920 -0.506431 -14.045945 -16.671198 0.294048 -14.793614 -17.146193 -2.721090 -12.166820 -11.491932 -1.651858 -11.687875 -12.434475 -0.470051 -11.584520 -13.358423 0.743793 -11.863795 -14.200810 1.906954 -12.506670 -14.904231 2.940162 -13.469334 -15.420747 3.773007 -14.686182 -15.715158 4.348733 -16.074287 -15.767402 4.628104 -17.539059 -15.573917 4.592082 -18.980665 -15.147890 4.243120 -20.300871 -14.518353 3.605002 -21.409702 -13.728209 2.721212 -22.231594 -12.831306 1.651981 -22.710539 -11.888763 0.470175 -22.813896 -10.964815 -0.743669 -22.534620 -10.122427 -1.906831 -21.891747 -9.419006 -2.940040 -20.929081 -8.902491 -3.772885 -19.712234 -8.608078 -4.348611 -18.324127 -8.555835 -4.627983 -16.859360 -8.749319 -4.591960 -15.417751 -9.175345 -4.243000 -14.097547 -9.804881 -3.604882 -12.988716 -10.595025 -3.002367 -19.470018 -5.628658 -3.694676 -17.793926 -5.626334 -4.016826 -16.031406 -5.906187 -3.946863 -14.302567 -6.449145 -3.489556 -12.725230 -7.218208 -2.676069 -11.406886 -8.160964 -1.561839 -10.437380 -9.213165 -0.222801 -9.882779 -10.303106 1.249793 -9.780880 -11.356511 2.755589 -10.138628 -12.301590 4.191968 -10.931643 -13.073939 5.461044 -12.105879 -13.620923 6.476332 -13.581318 -13.905266 7.168641 -15.257408 -13.907590 7.490791 -17.019930 -13.627737 7.420829 -18.748768 -13.084779 6.963522 -20.326105 -12.315718 6.150035 -21.644449 -11.372962 5.035807 -22.613956 -10.320761 3.696769 -23.168560 -9.230819 2.224174 -23.270458 -8.177414 0.718379 -22.912712 -7.232335 -0.718000 -22.119698 -6.459986 -1.987077 -20.945461 -5.913002 7.201397 -22.848654 -7.762406 5.615925 -23.475389 -6.548454 3.876937 -23.580591 -5.388691 2.102940 -23.157085 -4.362154 0.414831 -22.233738 -3.538800 -1.072350 -20.873472 -2.974739 -2.257252 -19.168987 -2.708409 -3.059129 -17.236441 -2.757962 -3.423331 -15.207533 -3.120021 -3.325040 -13.220531 -3.769911 -2.770955 -11.410845 -4.663344 -1.798835 -9.901801 -5.739433 -0.474929 -8.796243 -6.924846 1.110542 -8.169505 -8.138798 2.849530 -8.064304 -9.298561 4.623527 -8.487807 -10.325097 6.311638 -9.411156 -11.148453 7.798818 -10.771420 -11.712515 8.983722 -12.475906 -11.978845 9.785598 -14.408452 -11.929292 10.149801 -16.437361 -11.567234 10.051512 -18.424362 -10.917344 9.497427 -20.234049 -10.023911 8.525308 -21.743092 -8.947823 11.222728 -11.408538 -9.915619 12.119385 -13.540181 -9.816808 12.524288 -15.777512 -9.383148 12.409844 -17.968061 -8.644193 11.783853 -19.962547 -7.650301 10.688972 -21.625048 -6.469204 9.199820 -22.842264 -5.181392 7.417876 -23.531250 -3.874627 5.464580 -23.645050 -2.637963 3.473043 -23.175907 -1.555676 1.578987 -22.155796 -0.701523 -0.088513 -20.654232 -0.133713 -1.415819 -18.773546 0.109060 -2.312477 -16.641905 0.010249 -2.717381 -14.404573 -0.423409 -2.602939 -12.214024 -1.162364 -1.976947 -10.219538 -2.156256 -0.882068 -8.557036 -3.337353 0.607085 -7.339818 -4.625165 2.389028 -6.650832 -5.931930 4.342324 -6.537031 -7.168594 6.333861 -7.006173 -8.250881 8.227918 -8.026283 -9.105034 9.895418 -9.527847 -9.672845 1.750183 -6.135693 -2.316284 3.659370 -5.402502 -3.678086 5.753954 -5.277653 -4.956443 7.891194 -5.769655 -6.064236 9.925440 -6.844979 -6.925972 11.718062 -8.430343 -7.482924 13.146894 -10.417707 -7.697138 14.114567 -12.671636 -7.554015 14.555133 -15.038527 -7.063309 14.438568 -17.357080 -6.258460 13.772817 -19.469294 -5.194317 12.603250 -21.231220 -3.943401 11.009569 -22.522789 -2.590958 9.100383 -23.255980 -1.229156 7.005800 -23.380831 0.049200 4.868559 -22.888828 1.156994 2.834312 -21.813505 2.018730 1.041690 -20.228142 2.575684 -0.387144 -18.240780 2.789898 -1.354816 -15.986852 2.646775 -1.795383 -13.619961 2.156070 -1.678819 -11.301405 1.351221 -1.013069 -9.189192 0.287078 0.156498 -7.427265 -0.963838 0.894355 -17.526731 5.323382 -0.112502 -15.238970 5.141908 -0.579279 -12.834852 4.610030 -0.474165 -10.478219 3.763993 0.195677 -8.329668 2.661453 1.384597 -6.535621 1.377548 3.011573 -5.218339 -0.000228 4.965729 -4.467591 -1.377980 7.113893 -4.334542 -2.661818 9.309669 -4.828256 -3.764250 11.403423 -5.915090 -4.610148 13.252465 -7.520975 -5.141864 14.730787 -9.536476 -5.323163 15.737646 -11.824238 -5.141689 16.204422 -14.228354 -4.609811 16.099310 -16.584988 -3.763775 15.429469 -18.733540 -2.661235 14.240549 -20.527588 -1.377330 12.613573 -21.844872 0.000445 10.659418 -22.595621 1.378198 8.511255 -22.728670 2.662036 6.315477 -22.234957 3.764468 4.221724 -21.148125 4.610367 2.372681 -19.542238 5.142083 14.002212 -20.794889 2.592809 12.087508 -21.529051 3.946301 9.977367 -21.660822 5.198085 7.815593 -21.181225 6.262855 5.749505 -20.122940 7.068049 3.919905 -18.558092 7.558795 2.451477 -16.593321 7.701649 1.444292 -14.362521 7.486875 0.966986 -12.017719 6.929110 1.052090 -9.718710 6.066365 1.693801 -7.622166 4.957435 2.848389 -5.870963 3.677891 4.437171 -4.584444 2.314932 6.351873 -3.850282 0.961441 8.462013 -3.718509 -0.290343 10.623787 -4.198105 -1.355114 12.689877 -5.256388 -2.160309 14.519477 -6.821237 -2.651055 15.987906 -8.786008 -2.793909 16.995092 -11.016808 -2.579136 17.472399 -13.361608 -2.021372 17.387295 -15.660619 -1.158628 16.745584 -17.757162 -0.049697 15.590998 -19.508368 1.229846 16.966404 -8.157785 -0.106702 17.932142 -10.247276 0.136101 18.399410 -12.442032 0.703795 18.336361 -14.592487 1.557696 17.747295 -16.552088 2.639609 16.672356 -18.187292 3.875804 15.184795 -19.386663 5.182037 13.385993 -20.068470 6.469290 11.398532 -20.186243 7.649839 9.357853 -19.731958 8.643231 7.403028 -18.736576 9.381769 5.667272 -17.267925 9.815123 4.268877 -15.426099 9.913759 3.303138 -13.336609 9.670957 2.835870 -11.141853 9.103262 2.898917 -8.991400 8.249363 3.487983 -7.031796 7.167449 4.562922 -5.396591 5.931254 6.050481 -4.197218 4.625021 7.849284 -3.515413 3.337768 9.836744 -3.397639 2.157219 11.877422 -3.851922 1.163826 13.832249 -4.847305 0.425288 15.568005 -6.315953 -0.008066 7.852873 -3.988393 6.924562 9.472257 -3.393968 5.739511 11.265345 -3.305872 4.663795 13.109941 -3.730108 3.770723 14.880339 -4.637765 3.121154 16.455889 -5.966989 2.759358 17.729219 -7.627192 2.709988 18.613556 -9.505238 2.976410 19.048632 -11.473139 3.540467 19.004799 -13.396787 4.363720 18.485044 -15.145086 5.390065 17.524786 -16.598898 6.549560 16.189465 -17.659142 7.763186 14.570082 -18.253569 8.948236 12.776994 -18.341665 10.023952 10.932399 -17.917431 10.917025 9.161999 -17.009773 11.566593 7.586449 -15.680552 11.928391 6.313118 -14.020348 11.977761 5.428780 -12.142302 11.711340 4.993703 -10.174401 11.147284 5.037535 -8.250753 10.324030 5.557291 -6.502452 9.297686 6.517549 -5.048641 8.138190 8.524692 -12.398100 13.907171 7.754307 -10.781382 13.622216 7.371618 -9.095535 13.074552 7.402706 -7.455446 12.301497 7.845449 -5.972886 11.355737 8.669678 -4.748888 10.301723 9.819220 -3.866865 9.211285 11.215737 -3.386926 8.158733 12.764060 -3.341778 7.215798 14.358672 -3.734498 6.446740 15.890903 -4.538321 5.903967 17.256334 -5.698470 5.624470 18.361916 -7.135882 5.627295 19.132299 -8.752600 5.912248 19.514990 -10.438448 6.459914 19.483902 -12.078536 7.232967 19.041159 -13.561096 8.178727 18.216932 -14.785096 9.232741 17.067390 -15.667119 10.323179 15.670873 -16.147058 11.375731 14.122550 -16.192207 12.318666 12.527938 -15.799489 13.087726 10.995707 -14.995666 13.630498 9.630275 -13.835517 13.909996 17.891857 -13.472175 12.835108 16.738434 -13.825535 13.732706 15.459387 -13.822750 14.523254 14.141883 -13.464012 15.152877 12.875707 -12.773768 15.578667 11.747148 -11.799057 15.771606 10.833115 -10.606304 15.718549 10.195897 -9.276792 15.423107 9.878920 -7.901126 14.905418 9.903785 -6.573055 14.200760 10.268798 -5.383085 13.357155 10.949082 -4.412311 12.432092 11.898281 -3.726888 11.488612 13.051704 -3.373528 10.591015 14.330751 -3.376312 9.800467 15.648254 -3.735049 9.170844 16.914431 -4.425292 8.745053 18.042992 -5.400003 8.552113 18.957026 -6.592756 8.605170 19.594242 -7.922269 8.900611 19.911221 -9.297934 9.418300 19.886356 -10.626005 10.122957 19.521343 -11.815976 10.966563 18.841059 -12.786751 11.891626 19.603722 -5.899624 11.576354 20.104387 -6.942115 11.872782 20.351574 -8.008647 12.348945 20.328440 -9.026537 12.972394 20.036558 -9.926417 13.700642 19.495823 -10.646961 14.484058 18.743084 -11.139069 15.269258 17.829638 -11.369199 16.002728 16.817734 -11.321672 16.634485 15.776335 -10.999725 17.121473 14.776407 -10.425300 17.430510 13.886096 -9.637542 17.540531 13.166073 -8.690136 17.444040 12.665408 -7.647645 17.147614 12.418220 -6.581113 16.671450 12.441354 -5.563223 16.048000 12.733235 -4.663342 15.319753 13.273970 -3.942797 14.536336 14.026710 -3.450691 13.751137 14.940156 -3.220560 13.017667 15.952058 -3.268086 12.385910 16.993458 -3.590032 11.898920 17.993385 -4.164456 11.589885 18.883698 -4.952214 11.479863 16.134937 -2.915545 15.982181 16.833900 -2.790059 15.406096 17.606716 -2.871169 14.924074 18.400719 -3.153348 14.568962 19.161795 -3.617365 14.364958 19.838083 -4.231599 14.325967 20.383493 -4.954191 14.454645 20.760855 -5.735897 14.742226 20.944454 -6.523445 15.169107 20.921780 -7.263165 15.706200 20.694374 -7.904646 16.316900 20.277735 -8.404173 16.959593 19.700256 -8.727704 17.590479 19.001293 -8.853190 18.166561 18.228479 -8.772080 18.648584 17.434477 -8.489902 19.003696 16.673399 -8.025885 19.207701 15.997111 -7.411651 19.246691 15.451702 -6.689060 19.118013 15.074339 -5.907354 18.830433 14.890739 -5.119806 18.403551 14.913415 -4.380086 17.866459 15.140820 -3.738604 17.255758 15.557458 -3.239077 16.613066 17.621773 -4.608477 20.775824 17.340504 -4.038224 20.501104 17.205908 -3.475122 20.120876 17.227158 -2.957545 19.661058 17.402805 -2.520765 19.152981 17.720881 -2.194548 18.631271 18.159706 -2.001124 18.131481 18.689379 -1.953676 17.687672 19.273800 -2.055437 17.330088 19.873144 -2.299472 17.083097 20.446568 -2.669150 16.963531 20.954990 -3.139279 16.979542 21.363766 -3.677820 17.130033 21.645035 -4.248073 17.404753 21.779631 -4.811175 17.784979 21.758381 -5.328752 18.244799 21.582735 -5.765532 18.752874 21.264660 -6.091750 19.274586 20.825832 -6.285173 19.774376 20.296162 -6.332622 20.218185 19.711739 -6.230861 20.575769 19.112394 -5.986826 20.822760 18.538971 -5.617148 20.942326 18.030550 -5.147019 20.926315 22.157425 -3.830863 21.810719 21.736044 -3.825426 22.164572 21.271479 -3.710429 22.436155 20.795393 -3.493710 22.606968 20.340227 -3.190037 22.665367 19.937002 -2.820106 22.607372 19.613195 -2.409127 22.436935 19.390877 -1.985106 22.165672 19.285192 -1.576942 21.812067 19.303350 -1.212448 21.400221 19.444107 -0.916466 20.958197 19.697876 -0.709165 20.516121 20.047358 -0.604673 20.104118 20.468740 -0.610110 19.750265 20.933304 -0.725107 19.478680 21.409391 -0.941826 19.307869 21.864557 -1.245498 19.249470 22.267782 -1.615429 19.307465 22.591589 -2.026409 19.477901 22.813908 -2.450429 19.749165 22.919592 -2.858593 20.102768 22.901434 -3.223087 20.514616 22.760677 -3.519070 20.956640 22.506908 -3.726371 21.398716</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="2880" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="8640">0.722360 0.013843 -0.691379 -0.554065 0.544435 -0.629764 -0.346012 0.510073 -0.787465 0.830393 -0.163548 -0.532634 -0.114302 0.439245 -0.891066 0.881464 -0.329757 -0.338057 0.124625 0.336678 -0.933336 0.872477 -0.473455 -0.120927 0.353814 0.209386 -0.911577 0.804387 -0.584913 0.104106 0.557203 0.066145 -0.827738 0.682040 -0.656647 0.321926 0.720858 -0.083151 -0.688077 0.513826 -0.683902 0.517940 0.833901 -0.228196 -0.502529 0.311097 -0.664957 0.679007 0.889122 -0.358977 -0.283896 0.087440 -0.601219 0.794286 0.883287 -0.466471 -0.046985 -0.142206 -0.497092 0.855965 0.817225 -0.543284 0.192318 -0.362498 -0.359659 0.859791 0.695683 -0.584192 0.418025 -0.558671 -0.198206 0.805358 0.526983 -0.586498 0.615068 -0.717481 -0.023589 0.696178 0.322462 -0.550212 0.770250 -0.828083 0.152474 0.539472 0.095748 -0.477994 0.873129 -0.882756 0.318150 0.345719 -0.138100 -0.374924 0.916712 -0.877460 0.462257 0.127996 -0.363535 -0.248117 0.897931 -0.812176 0.574972 -0.098883 -0.565506 -0.106205 0.817878 -0.691004 0.648490 -0.319333 -0.730416 0.041258 0.681756 -0.522005 0.677575 -0.518077 -0.847008 0.184420 0.498565 -0.316719 0.660003 -0.681239 -0.907113 0.313757 0.280539 -0.089415 0.596792 -0.797399 -0.906232 0.420654 0.042363 0.143975 0.492209 -0.858488 -0.843910 0.497910 -0.199755 0.367084 0.353478 -0.860408 -0.723898 0.540197 -0.429137 0.564389 0.190246 -0.803288 -0.739546 0.089229 0.667166 -0.866466 0.186844 0.462953 -0.936077 0.269256 0.226409 -0.943143 0.331318 -0.026653 -0.886460 0.369154 -0.279130 -0.769103 0.380323 -0.513648 -0.598508 0.363946 -0.713674 -0.386260 0.320844 -0.864790 -0.147430 0.253587 -0.956012 0.100658 0.166411 -0.980905 0.340022 0.064957 -0.938171 0.553740 -0.044060 -0.831523 0.727275 -0.153265 -0.669015 0.849332 -0.255039 -0.462159 0.912336 -0.342039 -0.225061 0.912680 -0.407822 0.026387 0.850842 -0.447454 0.275414 0.731295 -0.458018 0.505398 0.562194 -0.438873 0.700948 0.354850 -0.391641 0.848940 0.123005 -0.319992 0.939401 -0.118017 -0.229263 0.966183 -0.352267 -0.125989 0.927380 -0.564176 -0.017378 0.825472 0.612945 -0.241999 0.752153 0.402906 -0.190395 0.895219 0.165303 -0.128434 0.977844 -0.084101 -0.061232 0.994574 -0.328763 0.005933 0.944394 -0.552436 0.068128 0.830766 -0.740230 0.121174 0.661345 -0.879562 0.161935 0.447379 -0.960902 0.188400 0.202913 -0.978263 0.199641 -0.056085 -0.929552 0.195620 -0.312514 -0.816906 0.177015 -0.548936 -0.647036 0.145095 -0.748526 -0.431353 0.101670 -0.896436 -0.185459 0.049036 -0.981428 0.072279 -0.010068 -0.997334 0.322819 -0.072499 -0.943680 0.548467 -0.134675 -0.825255 0.734197 -0.192550 -0.651060 0.868231 -0.241723 -0.433295 0.942317 -0.277854 -0.186644 0.952038 -0.297293 0.072394 0.897106 -0.297770 0.326395 0.781447 -0.278846 0.558199 0.730912 -0.223362 -0.644886 0.877229 -0.213400 -0.430035 0.963604 -0.192405 -0.185600 0.984461 -0.160240 0.071835 0.938452 -0.117981 0.324637 0.828750 -0.068141 0.555455 0.662872 -0.014507 0.748592 0.452116 0.038331 0.891135 0.210749 0.085585 0.973786 -0.044955 0.122898 0.991401 -0.297822 0.146896 0.943252 -0.530966 0.155593 0.832986 -0.728966 0.148601 0.668227 -0.878844 0.127083 0.459872 -0.970724 0.093482 0.221259 -0.998161 0.051108 -0.032608 -0.958351 0.003681 -0.285569 -0.852520 -0.045058 -0.520749 -0.686538 -0.091686 -0.721290 -0.471397 -0.133395 -0.871774 -0.222831 -0.168217 -0.960234 0.040323 -0.195066 -0.979961 0.298562 -0.213470 -0.930210 0.533885 -0.223094 -0.815596 -0.703797 -0.316005 -0.636247 -0.492969 -0.360292 -0.791941 -0.246886 -0.382155 -0.890508 0.015968 -0.381430 -0.924260 0.276346 -0.359593 -0.891250 0.516253 -0.319019 -0.794802 0.719993 -0.262381 -0.642469 0.874522 -0.192503 -0.445144 0.969769 -0.112615 -0.216485 0.999259 -0.026714 0.027715 0.960825 0.060252 0.270526 0.857016 0.142513 0.495191 0.694991 0.213941 0.686452 0.485978 0.268694 0.831642 0.244419 0.301896 0.921476 -0.013084 0.310271 0.950558 -0.268978 0.292616 0.917620 -0.506064 0.250012 0.825466 -0.708754 0.185753 0.680561 -0.864038 0.104944 0.492368 -0.962032 0.013905 0.272583 -0.996160 -0.080444 0.034565 -0.963270 -0.171122 -0.206947 -0.864055 -0.251540 -0.436046 -0.688242 0.234815 0.686429 -0.842820 0.103694 0.528112 -0.941086 -0.036974 0.336141 -0.976557 -0.177345 0.122006 -0.946110 -0.307658 -0.101110 -0.850417 -0.418743 -0.318505 -0.694653 -0.502681 -0.514556 -0.488974 -0.553644 -0.674079 -0.248094 -0.568633 -0.784287 0.010269 -0.547695 -0.836615 0.267502 -0.493489 -0.827594 0.505887 -0.410459 -0.758684 0.709642 -0.304135 -0.635539 0.865430 -0.180851 -0.467251 0.962858 -0.047741 -0.265753 0.995165 0.087226 -0.045138 0.959921 0.215445 0.179261 0.859435 0.328160 0.392023 0.700683 0.417173 0.578801 0.494785 0.475595 0.727322 0.256147 0.498571 0.828140 0.001362 0.483848 0.875151 -0.252065 0.432117 0.865874 -0.487062 0.347023 0.801465 0.680216 0.582642 0.444785 0.477596 0.645467 0.596050 0.243686 0.661984 0.708798 -0.005208 0.630682 0.776024 -0.251972 0.553617 0.793737 -0.480005 0.436265 0.761097 -0.674383 0.286992 0.680325 -0.822733 0.116280 0.556407 -0.915684 -0.064143 0.396747 -0.947070 -0.242040 0.210892 -0.914131 -0.405285 0.010387 -0.817951 -0.542493 -0.191462 -0.664010 -0.643859 -0.380180 -0.462441 -0.702175 -0.541386 -0.227489 -0.713696 -0.662486 0.023901 -0.678436 -0.734270 0.273894 -0.599794 -0.751817 0.505324 -0.483747 -0.714588 0.702710 -0.338129 -0.625993 0.852922 -0.172168 -0.492830 0.945799 0.003763 -0.324730 0.974845 0.178454 -0.133534 0.937868 0.340363 0.067503 0.837323 0.478370 0.264674 0.696851 -0.360504 -0.620028 0.836236 -0.162764 -0.523658 0.919423 0.045084 -0.390678 0.940562 0.249433 -0.230492 0.898026 0.436596 -0.054153 0.794675 0.593727 0.126407 0.637716 0.709794 0.299184 0.438180 0.776464 0.452882 0.210056 0.788833 0.577597 -0.030780 0.745864 0.665387 -0.267816 0.650520 0.710703 -0.485122 0.509509 0.710674 -0.668462 0.332682 0.665193 -0.806083 0.132186 0.576852 -0.889178 -0.078424 0.450790 -0.912157 -0.284984 0.294540 -0.872897 -0.473443 0.117911 -0.773145 -0.630652 -0.067265 -0.618909 -0.745373 -0.247731 -0.420488 -0.809408 -0.409937 -0.191816 -0.818512 -0.541521 0.050852 -0.772710 -0.632720 0.290513 -0.675953 -0.677266 0.510780 -0.535368 -0.672670 -0.563794 -0.816937 -0.121454 -0.368499 -0.884706 -0.285487 -0.147013 -0.891666 -0.428158 0.085081 -0.837949 -0.539076 0.311684 -0.727974 -0.610661 0.517389 -0.569717 -0.638538 0.688365 -0.373944 -0.621546 0.813076 -0.153561 -0.561539 0.882947 0.076986 -0.463118 0.893008 0.302431 -0.333275 0.842391 0.507589 -0.180917 0.734513 0.678399 -0.016274 0.576898 0.802967 0.149774 0.380604 0.872509 0.306380 0.159375 0.882051 0.443381 -0.071432 0.830850 0.551893 -0.296020 0.722461 0.624838 -0.499320 0.564431 0.657341 -0.667992 0.367647 0.647011 -0.791158 0.145473 0.594060 -0.860853 -0.087158 0.501333 -0.872315 -0.314602 0.374288 -0.824258 -0.521328 0.220942 -0.719218 -0.692862 0.051651 -0.669127 0.392195 0.631231 -0.774455 0.155083 0.613326 -0.827797 -0.092810 0.553297 -0.825453 -0.334780 0.454478 -0.767119 -0.554217 0.323067 -0.656166 -0.735677 0.168002 -0.499767 -0.866160 0.000452 -0.308605 -0.936394 -0.167119 -0.096047 -0.941768 -0.322256 0.123070 -0.882570 -0.453788 0.333692 -0.763599 -0.552780 0.521597 -0.593414 -0.613023 0.674170 -0.383568 -0.631166 0.781065 -0.147936 -0.606673 0.834844 0.097960 -0.541700 0.831577 0.337760 -0.440905 0.771279 0.555265 -0.311143 0.658031 0.735570 -0.161033 0.499732 0.866180 -0.000423 0.307503 0.937962 0.160217 0.094812 0.945862 0.310413 -0.123578 0.889297 0.440317 -0.332738 0.772191 0.541300 -0.518651 0.602631 0.606496 0.406311 0.901236 -0.150614 0.219666 0.975452 0.015478 0.017903 0.983464 0.180219 -0.184933 0.924713 0.332725 -0.374974 0.803274 0.462759 -0.539521 0.627490 0.561403 -0.667858 0.409291 0.621648 -0.751776 0.163315 0.638875 -0.785870 -0.093996 0.611207 -0.767731 -0.345279 0.539789 -0.698156 -0.573192 0.428986 -0.581368 -0.761576 0.286378 -0.425047 -0.896863 0.122361 -0.239936 -0.969460 -0.050772 -0.038949 -0.974690 -0.220140 0.164000 -0.912972 -0.373613 0.355119 -0.789339 -0.500834 0.521607 -0.612659 -0.593780 0.652302 -0.394875 -0.646974 0.738258 -0.150349 -0.657549 0.773339 0.104805 -0.625270 0.754795 0.353578 -0.552511 0.683636 0.579128 -0.444131 0.564697 0.765991 -0.307205 0.622194 -0.412814 -0.665176 0.683511 -0.165604 -0.710906 0.696832 0.093137 -0.711161 0.660753 0.346140 -0.666027 0.577443 0.576244 -0.578362 0.452609 0.767655 -0.453708 0.295101 0.907144 -0.300009 0.116171 0.985054 -0.127173 -0.071456 0.996008 0.053499 -0.254633 0.939289 0.229998 -0.420825 0.818846 0.390381 -0.559020 0.642926 0.523586 -0.660383 0.423386 0.620193 -0.718620 0.174835 0.673066 -0.730114 -0.086217 0.677865 -0.693993 -0.342175 0.633474 -0.612279 -0.575273 0.542379 -0.490054 -0.768800 0.410844 -0.335424 -0.908663 0.248640 -0.159032 -0.984919 0.068137 0.026878 -0.992754 -0.117119 0.209581 -0.932584 -0.293876 0.376829 -0.809461 -0.450304 0.517522 -0.632233 -0.576587 -0.224762 -0.896763 0.381179 -0.060118 -0.979470 0.192416 0.106642 -0.994252 -0.009521 0.264302 -0.941262 -0.210168 0.402474 -0.825243 -0.396218 0.512042 -0.654630 -0.556123 0.585501 -0.440866 -0.680313 0.617382 -0.197923 -0.761358 0.604807 0.058238 -0.794240 0.548000 0.310497 -0.776716 0.450544 0.541724 -0.709610 0.319229 0.736066 -0.596909 0.163536 0.880157 -0.445623 -0.005207 0.964117 -0.265428 -0.174812 0.982242 -0.068124 -0.333271 0.933390 0.133090 -0.469758 0.820993 0.324495 -0.575405 0.652709 0.492829 -0.643777 0.439746 0.626238 -0.670990 0.196074 0.715072 -0.655624 -0.062336 0.752510 -0.598638 -0.318161 0.735124 -0.503433 -0.553533 0.663443 -0.375989 -0.751297 0.542388 -0.617808 0.462821 0.635696 -0.607759 0.233348 0.759064 -0.560278 -0.014526 0.828177 -0.478470 -0.264365 0.837364 -0.367347 -0.498594 0.785150 -0.233914 -0.699751 0.675006 -0.086991 -0.852457 0.515509 0.063474 -0.945475 0.319450 0.207366 -0.972931 0.102008 0.335250 -0.934300 -0.121210 0.438862 -0.833567 -0.335509 0.511314 -0.678296 -0.527705 0.547331 -0.479001 -0.686285 0.543659 -0.248763 -0.801593 0.499607 -0.002757 -0.866248 0.417477 0.242559 -0.875716 0.302670 0.470567 -0.828829 0.163368 0.665757 -0.728065 0.009836 0.814890 -0.579532 -0.146516 0.907924 -0.392691 -0.294169 0.938684 -0.179825 -0.422559 0.905232 0.044713 -0.522980 0.809940 0.265497 -0.589227 0.659199 0.467192 -0.163392 0.708141 -0.686906 -0.306130 0.812819 -0.495591 -0.429040 0.861720 -0.270855 -0.523276 0.851704 -0.027961 -0.582597 0.783442 0.216334 -0.603832 0.661262 0.445106 -0.586788 0.492735 0.642567 -0.533719 0.288163 0.795051 -0.448709 0.060235 0.891646 -0.337293 -0.176123 0.924778 -0.206414 -0.404121 0.891111 -0.064421 -0.606333 0.792597 0.079304 -0.766823 0.636941 0.215163 -0.873464 0.436767 0.334271 -0.919312 0.207673 0.429064 -0.902639 -0.033883 0.493494 -0.826121 -0.272007 0.523091 -0.695953 -0.491961 0.515155 -0.521264 -0.680367 0.469165 -0.313757 -0.825494 0.387231 -0.087248 -0.917845 0.274321 0.143113 -0.950929 0.138132 0.361888 -0.921931 -0.011491 0.554476 -0.832120 0.493153 -0.557201 -0.668077 0.399894 -0.382433 -0.832965 0.275482 -0.185037 -0.943330 0.128001 0.021830 -0.991534 -0.032353 0.224541 -0.973927 -0.194039 0.409912 -0.891247 -0.345138 0.566033 -0.748657 -0.474379 0.682943 -0.555476 -0.572158 0.753160 -0.324630 -0.631475 0.772063 -0.071821 -0.648598 0.738152 0.185613 -0.623307 0.653099 0.430059 -0.558517 0.521640 0.644942 -0.459552 0.351334 0.815706 -0.333376 0.152480 0.930382 -0.188184 -0.061899 0.980181 -0.033268 -0.276344 0.960483 0.121206 -0.474184 0.872043 0.264877 -0.639649 0.721588 0.388185 -0.760114 0.521094 0.483204 -0.827491 0.285958 0.544037 -0.838412 0.033012 0.566825 -0.793672 -0.220893 0.549743 -0.697532 -0.459599 0.449936 -0.487299 0.748397 0.562456 -0.618415 0.548822 0.634809 -0.706681 0.312443 0.662530 -0.746935 0.056053 0.643959 -0.737658 -0.202925 0.580164 -0.680623 -0.447395 0.474956 -0.580521 -0.661371 0.334855 -0.444584 -0.830793 0.168901 -0.282122 -0.944394 -0.011804 -0.103930 -0.994515 -0.194831 0.078388 -0.977699 -0.367321 0.253148 -0.894981 -0.516962 0.409259 -0.751836 -0.632964 0.536818 -0.557838 -0.706972 0.627611 -0.326031 -0.733787 0.675547 -0.072070 -0.711859 0.676996 0.186902 -0.643319 0.631053 0.433489 -0.533537 0.539698 0.651202 -0.390397 0.407891 0.825358 -0.223595 0.243626 0.943744 -0.044155 0.057907 0.997345 0.135963 -0.135706 0.981376 0.304509 -0.322286 0.896329 -0.495961 0.553220 0.669306 -0.314504 0.457544 0.831710 -0.113143 0.326964 0.938240 0.094452 0.170397 0.980838 0.294003 -0.000833 0.955804 0.471633 -0.173986 0.864460 0.615019 -0.336168 0.713262 0.714410 -0.475648 0.513202 0.763312 -0.582825 0.278694 0.758760 -0.650841 0.026251 0.701328 -0.675809 -0.226763 0.594969 -0.656822 -0.463246 0.446765 -0.595821 -0.667382 0.266545 -0.497357 -0.825584 0.066347 -0.368236 -0.927362 -0.140345 -0.217072 -0.966014 -0.339485 -0.053745 -0.939075 -0.517425 0.111204 -0.848472 -0.661888 0.267168 -0.700375 -0.762840 0.404078 -0.504773 -0.813254 0.512941 -0.274790 -0.809631 0.586371 -0.025817 -0.752290 0.619021 0.225550 -0.645271 0.608006 0.462551 -0.771939 0.163174 -0.614398 -0.854100 0.310440 -0.417301 -0.879239 0.436156 -0.191590 -0.845545 0.531772 0.047666 -0.755190 0.590548 0.284501 -0.614166 0.608082 0.503027 -0.431908 0.582653 0.688456 -0.220697 0.515513 0.827973 0.005099 0.410938 0.911649 0.229940 0.276064 0.933229 0.438188 0.120427 0.890780 0.615298 -0.044796 0.787021 0.748967 -0.207736 0.629202 0.830078 -0.356863 0.428508 0.853317 -0.481878 0.199109 0.817416 -0.574441 -0.042984 0.725122 -0.628636 -0.281097 0.582889 -0.641260 -0.499026 0.400445 -0.611887 -0.682084 0.190140 -0.542820 -0.818042 -0.033849 -0.438878 -0.897909 -0.256431 -0.307054 -0.916494 -0.462594 -0.156063 -0.872726 -0.638404 0.004181 -0.769690 0.337701 -0.633106 -0.696516 0.106970 -0.582848 -0.805510 -0.130987 -0.493651 -0.859739 -0.360143 -0.371554 -0.855713 -0.565077 -0.224707 -0.793848 -0.731975 -0.062859 -0.678425 -0.849574 0.103252 -0.517265 -0.909883 0.262560 -0.321207 -0.908733 0.404369 -0.103396 -0.846061 0.519037 0.121582 -0.725936 0.598622 0.338628 -0.556318 0.637437 0.533090 -0.348567 0.632499 0.691698 -0.116743 0.583812 0.803452 0.123299 0.494477 0.860401 0.354973 0.370563 0.858299 0.562165 0.220697 0.797034 0.730442 0.055449 0.680720 0.848154 -0.113516 0.517444 0.907301 -0.274369 0.318632 0.904046 -0.416010 0.098162 0.838902 -0.528851 -0.128686 0.716582 -0.605444 -0.346335 0.545611 -0.640893 -0.539967 0.914533 -0.056957 0.400481 0.950947 -0.229956 0.206930 0.922554 -0.385864 -0.001454 0.831552 -0.514094 -0.210303 0.684376 -0.606098 -0.405308 0.491201 -0.655871 -0.573196 0.265234 -0.660287 -0.702618 0.021816 -0.619245 -0.784895 -0.222598 -0.535641 -0.814579 -0.451525 -0.415146 -0.789797 -0.649535 -0.265842 -0.712343 -0.803276 -0.097696 -0.587540 -0.902359 0.078069 -0.423855 -0.940043 0.249685 -0.232327 -0.913687 0.405596 -0.025840 -0.824940 0.535208 0.181733 -0.679648 0.629596 0.376414 -0.487498 0.682128 0.545020 -0.261423 0.688943 0.676029 -0.016779 0.649309 0.760339 0.229668 0.565732 0.791960 0.460890 0.443863 0.768483 0.660828 0.292150 0.691342 0.815599 0.121217 0.565778 -0.182250 0.737753 0.650004 0.069488 0.700412 0.710348 0.317239 0.616256 0.720824 0.543901 0.490984 0.680519 0.733768 0.333251 0.592054 0.873692 0.154070 0.461438 0.954064 -0.034050 0.297662 0.969487 -0.218046 0.112034 0.919095 -0.385273 -0.082642 0.806539 -0.524380 -0.272983 0.639665 -0.626061 -0.445956 0.429941 -0.683614 -0.589765 0.191669 -0.693344 -0.694649 -0.058972 -0.654756 -0.753537 -0.305005 -0.570556 -0.762521 -0.529794 -0.446463 -0.721103 -0.718148 -0.290824 -0.632206 -0.857339 -0.114076 -0.501952 -0.937953 0.071934 -0.339219 -0.954509 0.254711 -0.155030 -0.905826 0.421924 0.038193 -0.795099 0.562217 0.227441 -0.629701 0.665962 0.399964 -0.420718 0.725916 0.544098 -0.961981 0.071022 -0.263719 -0.960728 0.263099 -0.088202 -0.893844 0.438920 0.091614 -0.765810 0.586550 0.263617 -0.585219 0.695889 0.416242 -0.364216 0.759357 0.539187 -0.117732 0.772429 0.624094 0.137476 0.733997 0.665092 0.383938 0.646527 0.659238 0.604675 0.515942 0.606771 0.784437 0.351253 0.511156 0.910818 0.163907 0.378874 0.975166 -0.033083 0.218990 0.973176 -0.226105 0.042487 0.905130 -0.401937 -0.138513 0.775815 -0.548653 -0.311594 0.594148 -0.656396 -0.464900 0.372551 -0.718004 -0.587943 0.126123 -0.729435 -0.672323 -0.128377 -0.690025 -0.712309 -0.373657 -0.602512 -0.705237 -0.593067 -0.472844 -0.651682 -0.771722 -0.309785 -0.555409 -0.897529 -0.124332 -0.423063 0.074867 -0.762766 -0.642326 -0.181669 -0.722147 -0.667458 -0.425525 -0.631418 -0.648259 -0.640081 -0.496758 -0.586113 -0.810734 -0.327319 -0.485357 -0.925904 -0.134599 -0.352966 -0.977811 0.068338 -0.198029 -0.962987 0.267748 -0.031111 -0.882476 0.450121 0.136481 -0.741741 0.603082 0.293448 -0.550283 0.716206 0.429229 -0.321022 0.781709 0.534673 -0.069467 0.794994 0.602627 0.187290 0.755003 0.628406 0.431704 0.664345 0.610145 0.647001 0.529173 0.548968 0.818364 0.358777 0.448954 0.934016 0.164923 0.316882 0.986057 -0.039014 0.161768 0.970997 -0.239022 -0.005778 0.889948 -0.421445 -0.174286 0.748510 -0.573902 -0.332218 0.556359 -0.686097 -0.468759 0.326595 -0.750488 -0.574547 0.991997 -0.042510 0.118889 0.967939 -0.247870 -0.040669 0.878031 -0.435526 -0.198442 0.728415 -0.592722 -0.343645 0.529280 -0.708795 -0.466339 0.294178 -0.775873 -0.558105 0.039127 -0.789399 -0.612632 -0.218469 -0.748453 -0.626170 -0.461011 -0.655825 -0.597799 -0.671923 -0.517830 -0.529502 -0.836808 -0.343885 -0.426023 -0.944453 -0.145850 -0.294509 -0.987584 0.062786 -0.143996 -0.963343 0.267839 0.015236 -0.873448 0.455384 0.172378 -0.724043 0.612695 0.316807 -0.525267 0.729077 0.438795 -0.290581 0.796581 0.530114 -0.035884 0.810544 0.584578 0.221521 0.769924 0.598452 0.464089 0.677418 0.570724 0.675233 0.539304 0.503201 0.840487 0.365032 0.400417 0.948533 0.166558 0.269338 -0.014308 0.822229 0.568977 0.243406 0.782230 0.573472 0.484689 0.689351 0.538398 0.693090 0.549896 0.466091 0.854380 0.373369 0.361428 0.957540 0.171823 0.231502 0.995526 -0.040979 0.085144 0.965742 -0.250522 -0.067681 0.870213 -0.442531 -0.216553 0.715428 -0.603941 -0.351310 0.511906 -0.723762 -0.462732 0.273489 -0.793830 -0.543175 0.016424 -0.809345 -0.587103 -0.241740 -0.769227 -0.591482 -0.483347 -0.676193 -0.556003 -0.691863 -0.536589 -0.483113 -0.853031 -0.359960 -0.377845 -0.955868 -0.158381 -0.247452 -0.993411 0.054376 -0.100889 -0.963182 0.263810 0.051824 -0.867321 0.455670 0.200297 -0.712411 0.616928 0.334470 -0.509007 0.736638 0.445281 -0.270922 0.806667 0.525253 -0.996767 0.043479 -0.067562 -0.963292 0.256256 0.080009 -0.864160 0.451766 0.221665 -0.706191 0.616717 0.347785 -0.500177 0.739916 0.449831 -0.260140 0.813008 0.520908 -0.002392 0.831034 0.556216 0.255563 0.792765 0.553364 0.496191 0.700787 0.512535 0.703119 0.561345 0.436480 0.862251 0.383924 0.330341 0.962732 0.180605 0.201317 0.997701 -0.034762 0.058171 0.964757 -0.247505 -0.089361 0.866118 -0.443139 -0.231230 0.708473 -0.608337 -0.357761 0.502524 -0.731840 -0.460304 0.262275 -0.805213 -0.531831 0.004096 -0.823417 -0.567422 -0.254392 -0.785177 -0.564607 -0.495512 -0.693074 -0.523562 -0.702759 -0.553385 -0.447096 -0.861953 -0.375662 -0.340462 -0.962224 -0.172066 -0.210991 -0.000960 -0.833084 -0.553145 -0.259652 -0.797547 -0.544518 -0.500651 -0.707421 -0.498902 -0.707475 -0.568843 -0.419401 -0.865966 -0.391275 -0.311458 -0.965291 -0.186863 -0.182472 -0.998685 0.030413 -0.041282 -0.963915 0.245707 0.102452 -0.863417 0.444329 0.238919 -0.704106 0.612760 0.358830 -0.496882 0.739559 0.454050 -0.255873 0.816128 0.518135 0.002520 0.837286 0.546759 0.260736 0.801610 0.537995 0.501227 0.711527 0.492444 0.707642 0.573161 0.413194 0.865936 0.395918 0.305619 0.965326 0.191855 0.177021 0.999031 -0.025138 0.036135 0.964734 -0.240291 -0.107461 0.864746 -0.438955 -0.243992 0.705845 -0.607598 -0.364153 0.498820 -0.734722 -0.459742 0.257746 -0.811642 -0.524217 0.999765 -0.013135 0.017249 0.965306 -0.229921 -0.123774 0.865129 -0.431004 -0.256492 0.706031 -0.602689 -0.371870 0.498819 -0.733278 -0.462041 0.257583 -0.813861 -0.520847 -0.001263 -0.838921 -0.544252 -0.260078 -0.806715 -0.530633 -0.501202 -0.719405 -0.480888 -0.708155 -0.582923 -0.398394 -0.866780 -0.406571 -0.288778 -0.966222 -0.202394 -0.159534 -0.999687 0.015651 -0.019506 -0.964909 0.232664 0.121726 -0.864303 0.433825 0.254512 -0.704781 0.605421 0.369797 -0.497264 0.735776 0.459741 -0.255922 0.816043 0.518244 0.002799 0.840790 0.541354 0.261294 0.808358 0.527525 0.501989 0.720970 0.477713 0.708518 0.584578 0.395312 0.866838 0.408460 0.285924 0.966176 0.204599 0.156981 0.000768 0.841467 0.540308 0.259504 0.812676 0.521742 0.500529 0.728540 0.467654 0.707448 0.594805 0.381739 0.866193 0.420581 0.269854 0.965972 0.217730 0.139614 1.000000 0.000059 -0.000122 0.965964 -0.217616 -0.139849 0.866177 -0.420478 -0.270065 0.707426 -0.594721 -0.381912 0.500502 -0.728479 -0.467777 0.259475 -0.812643 -0.521809 0.000738 -0.841464 -0.540313 -0.258099 -0.812955 -0.522004 -0.499399 -0.729027 -0.468104 -0.706694 -0.595367 -0.382258 -0.865816 -0.421068 -0.270305 -0.965870 -0.218011 -0.139878 -1.000000 -0.000058 0.000114 -0.965864 0.217899 0.140098 -0.865802 0.420968 0.270503 -0.706675 0.595286 0.382419 -0.499375 0.728971 0.468216 -0.258072 0.812928 0.522060 -0.999680 -0.015769 0.019768 -0.966204 0.202273 0.159801 -0.866750 0.406454 0.289031 -0.708116 0.582818 0.398616 -0.501157 0.719320 0.481063 -0.260030 0.806654 0.530748 -0.001215 0.838890 0.544300 0.257627 0.813862 0.520823 0.498857 0.733311 0.461948 0.706058 0.602753 0.371713 0.865145 0.431095 0.256283 0.965311 0.230033 0.123526 0.999759 0.013261 -0.017518 0.966159 -0.204467 -0.157255 0.866812 -0.408333 -0.286183 0.708485 -0.584464 -0.395540 0.501951 -0.720877 -0.477894 0.261254 -0.808291 -0.527647 0.002758 -0.840754 -0.541410 -0.255960 -0.816041 -0.518230 -0.497296 -0.735807 -0.459657 -0.704805 -0.605481 -0.369651 -0.864318 -0.433912 -0.254312 -0.964914 -0.232770 -0.121487 0.002440 -0.837224 -0.546855 -0.255947 -0.816091 -0.518158 -0.496945 -0.739549 -0.453998 -0.704154 -0.612778 -0.358707 -0.863446 -0.444373 -0.238733 -0.963923 -0.245772 -0.102217 -0.998671 -0.030497 0.041550 -0.965255 0.186768 0.182757 -0.865911 0.391175 0.311739 -0.707402 0.568744 0.419659 -0.500567 0.707330 0.499116 -0.259560 0.797468 0.544677 -0.000870 0.833025 0.553234 0.257830 0.811606 0.524232 0.498891 0.734711 0.459681 0.705899 0.607615 0.364020 0.864780 0.438999 0.243795 0.964745 0.240359 0.107215 0.999018 0.025225 -0.036413 0.965293 -0.191754 -0.177314 0.865884 -0.395810 -0.305907 0.707576 -0.573054 -0.413456 0.501151 -0.711428 -0.492663 0.260656 -0.801526 -0.538158 0.997678 0.034827 -0.058521 0.962671 -0.180519 -0.201687 0.862157 -0.383823 -0.330705 0.702999 -0.561237 -0.436813 0.496052 -0.700679 -0.512817 0.255415 -0.792665 -0.553575 -0.002538 -0.830950 -0.556342 -0.260277 -0.812944 -0.520940 -0.500292 -0.739875 -0.449769 -0.706279 -0.616703 -0.347631 -0.864214 -0.451778 -0.221430 -0.963307 -0.256293 -0.079709 -0.996741 -0.043538 0.067907 -0.962158 0.171988 0.211357 -0.861849 0.375571 0.340826 -0.702624 0.553286 0.447430 -0.495354 0.692973 0.523844 -0.254224 0.785081 0.564817 0.004263 0.823332 0.567543 0.262430 0.805144 0.531858 0.502654 0.731795 0.460233 0.708571 0.608318 0.357598 0.866178 0.443149 0.230987 0.964775 0.247545 0.089053 0.016693 0.809220 0.587269 0.273736 0.793711 0.543223 0.512114 0.723661 0.462659 0.715584 0.603865 0.351122 0.870307 0.442487 0.216264 0.965771 0.250512 0.067309 0.995488 0.041006 -0.085572 0.957440 -0.171765 -0.231958 0.854226 -0.373281 -0.361883 0.692892 -0.549788 -0.466513 0.484460 -0.689229 -0.538759 0.243163 -0.782102 -0.573749 -0.014550 -0.822105 -0.569150 -0.271146 -0.806553 -0.525311 -0.509198 -0.736543 -0.445221 -0.712556 -0.616855 -0.334294 -0.867409 -0.455625 -0.200018 -0.963205 -0.263794 -0.051461 -0.993367 -0.054392 0.101311 -0.955757 0.158337 0.247906 -0.852861 0.359888 0.378298 -0.691643 0.536494 0.483534 -0.483092 0.676080 0.556362 -0.241469 0.769104 0.591753 -0.987522 -0.062700 0.144458 -0.944292 0.145903 0.294999 -0.836556 0.343899 0.426507 -0.671594 0.517802 0.529947 -0.460627 0.655753 0.598173 -0.218057 0.748342 0.626446 0.039538 0.789255 0.612792 0.294558 0.775706 0.558136 0.529604 0.708618 0.466241 0.728661 0.592548 0.343424 0.878184 0.435366 0.198115 0.967990 0.247737 0.040260 0.991946 0.042410 -0.119352 0.948385 -0.166618 -0.269823 0.840254 -0.365051 -0.400889 0.674933 -0.539281 -0.503629 0.463743 -0.677356 -0.571079 0.221152 -0.769830 -0.598710 -0.036249 -0.810423 -0.584723 -0.290917 -0.796443 -0.530138 -0.525553 -0.728931 -0.438696 -0.724259 -0.612551 -0.316591 -0.873580 -0.455252 -0.172057 -0.963381 -0.267726 -0.014833 -0.069962 -0.794901 -0.602692 -0.321472 -0.781588 -0.534580 -0.550658 -0.716067 -0.428980 -0.742015 -0.602936 -0.293057 -0.882628 -0.449977 -0.135970 -0.963004 -0.267616 0.031709 -0.977687 -0.068229 0.198679 -0.925641 0.134676 0.353625 -0.810348 0.327356 0.485978 -0.639593 0.496748 0.586653 -0.424971 0.631361 0.648679 -0.181088 0.722045 0.667727 0.075435 0.762625 0.642428 0.327108 0.750318 0.574477 0.556785 0.685912 0.468525 0.748822 0.573714 0.331839 0.890130 0.421267 0.173791 0.971039 0.238864 0.005204 0.985962 0.038881 -0.162380 0.933792 -0.165022 -0.317491 0.818028 -0.358840 -0.449516 0.646577 -0.529195 -0.549446 0.431223 -0.664326 -0.610507 0.186783 -0.754944 -0.628627 0.975037 0.032843 -0.219602 0.910535 -0.164113 -0.379464 0.784022 -0.351414 -0.511681 0.604159 -0.516041 -0.607201 0.383357 -0.646560 -0.659543 0.136875 -0.733963 -0.665255 -0.118313 -0.772330 -0.624106 -0.364739 -0.759206 -0.539047 -0.585649 -0.695696 -0.415960 -0.766120 -0.586329 -0.263207 -0.894010 -0.438687 -0.091098 -0.960737 -0.262870 0.088792 -0.961825 -0.070811 0.264345 -0.897212 0.124508 0.423685 -0.771261 0.309913 0.555976 -0.592490 0.472912 0.652158 -0.373007 0.602512 0.705581 -0.127700 0.689958 0.712496 0.126780 0.729303 0.672342 0.373143 0.717817 0.587795 0.594635 0.656169 0.464598 0.776167 0.548401 0.311161 0.905329 0.401673 0.137983 0.973210 0.225845 -0.043078 0.192331 0.693317 0.694493 0.430520 0.683527 0.589443 0.640124 0.625922 0.445491 0.806852 0.524197 0.272409 0.919243 0.385058 0.081998 0.969462 0.217809 -0.112703 0.953869 0.033806 -0.298313 0.873340 -0.154303 -0.462026 0.733284 -0.333453 -0.592541 0.543320 -0.491132 -0.680877 0.316601 -0.616343 -0.721030 0.068841 -0.700424 -0.710399 -0.182861 -0.737692 -0.649901 -0.421255 -0.725791 -0.543849 -0.630132 -0.665779 -0.399589 -0.795396 -0.561992 -0.226959 -0.905968 -0.421670 -0.037634 -0.954483 -0.254443 0.155632 -0.937753 -0.071670 0.339828 -0.856974 0.114321 0.502521 -0.717638 0.291034 0.632688 -0.529176 0.446623 0.721457 -0.304323 0.570657 0.762717 -0.058274 0.654792 0.753559 -0.902020 -0.077782 0.424630 -0.802736 0.097963 0.588234 -0.648826 0.266069 0.712904 -0.450698 0.415316 0.790179 -0.221714 0.535742 0.814754 0.022692 0.619272 0.784849 0.266042 0.660238 0.702358 0.491889 0.655749 0.572746 0.684901 0.605907 0.404706 0.831889 0.513840 0.209594 0.922687 0.385550 0.000692 0.950868 0.229598 -0.207691 0.914249 0.056568 -0.401183 0.815127 -0.121610 -0.566373 0.660203 -0.292521 -0.691783 0.460159 -0.444170 -0.768743 0.228885 -0.565955 -0.792027 -0.017560 -0.649438 -0.760212 -0.262146 -0.688970 -0.675721 -0.488116 -0.682058 -0.544555 -0.680120 -0.629446 -0.375812 -0.825235 -0.534991 -0.181029 -0.913781 -0.405334 0.026615 -0.939921 -0.249400 0.233129 -0.349247 -0.632519 -0.691337 -0.556881 -0.637372 -0.532580 -0.726345 -0.598484 -0.337994 -0.846283 -0.518843 -0.120858 -0.908746 -0.404139 0.104174 -0.909676 -0.262314 0.321994 -0.849156 -0.103005 0.518000 -0.731370 0.063088 0.679056 -0.564328 0.224909 0.794323 -0.359319 0.371717 0.855989 -0.130149 0.493771 0.859797 0.107762 0.582925 0.805348 0.338386 0.633138 0.696154 0.546152 0.640881 0.539434 0.716954 0.605382 0.345673 0.839089 0.528735 0.127944 0.904044 0.415831 -0.098937 0.907109 0.274129 -0.319385 0.847780 0.113223 -0.518120 0.729904 -0.055769 -0.681271 0.561497 -0.221012 -0.797417 0.354222 -0.370836 -0.858492 0.122517 -0.494683 -0.860394 -0.117498 -0.583927 -0.803258 0.748508 0.207609 -0.629789 0.614718 0.044609 -0.787485 0.437520 -0.120643 -0.891079 0.229227 -0.276277 -0.933341 0.004392 -0.411110 -0.911575 -0.221351 -0.515624 -0.827730 -0.432470 -0.582700 -0.688063 -0.614601 -0.608071 -0.502509 -0.755466 -0.590496 -0.283875 -0.845635 -0.531691 -0.046962 -0.879121 -0.436066 0.192338 -0.853769 -0.310350 0.418044 -0.771411 -0.163095 0.615081 -0.637722 -0.004116 0.770256 -0.461819 0.156114 0.873128 -0.255630 0.307096 0.916703 -0.033092 0.438922 0.897916 0.190792 0.542872 0.817856 0.400950 0.611952 0.681728 0.583225 0.641336 0.498534 0.725284 0.628713 0.280506 0.817412 0.574497 0.042329 0.853152 0.481889 -0.199789 0.829761 0.356810 -0.429166 0.447113 0.595838 0.667134 0.595106 0.656935 0.462910 0.701273 0.676001 0.226361 0.758540 0.651079 -0.026702 0.762955 0.583059 -0.279178 0.713937 0.475833 -0.513690 0.614444 0.336275 -0.713707 0.470980 0.174012 -0.864811 0.293307 0.000811 -0.956018 0.093760 -0.170437 -0.980898 -0.113789 -0.326998 -0.938150 -0.315063 -0.457558 -0.831490 -0.496403 -0.553226 -0.668973 -0.645565 -0.608031 -0.462108 -0.752404 -0.619080 -0.225008 -0.809532 -0.586481 0.026444 -0.812922 -0.513103 0.275468 -0.762281 -0.404288 0.505449 -0.661137 -0.267414 0.700991 -0.516547 -0.111466 0.848973 -0.338562 0.053489 0.939423 -0.139471 0.216851 0.966190 0.067097 0.368073 0.927373 0.267108 0.497277 0.825451 -0.516079 -0.409797 0.752149 -0.366374 -0.253696 0.895214 -0.193918 -0.078904 0.977839 -0.011020 0.103486 0.994570 0.169481 0.281786 0.944390 0.335186 0.444392 0.830763 0.475032 0.580494 0.661341 0.580005 0.680771 0.447375 0.643608 0.737969 0.202905 0.662032 0.747374 -0.056092 0.634200 0.707193 -0.312521 0.561765 0.618939 -0.548940 0.449186 0.487787 -0.748529 0.303733 0.322718 -0.896437 0.135198 0.136095 -0.981427 -0.044863 -0.057553 -0.997334 -0.224206 -0.243307 -0.943681 -0.390883 -0.407631 -0.825256 -0.533870 -0.539542 -0.651059 -0.643473 -0.631031 -0.433292 -0.711805 -0.677126 -0.186639 -0.733500 -0.675823 0.072396 -0.706450 -0.628009 0.326394 -0.632235 -0.537304 0.558197 -0.558788 -0.521417 -0.644888 -0.623337 -0.653087 -0.430033 -0.648364 -0.738363 -0.185593 -0.630970 -0.772474 0.071846 -0.571398 -0.753728 0.324650 -0.473415 -0.683615 0.555472 -0.344047 -0.566758 0.748610 -0.192926 -0.410641 0.891153 -0.031325 -0.225231 0.973802 0.128841 -0.022439 0.991411 0.276063 0.184548 0.943256 0.400176 0.382101 0.832981 0.493130 0.557059 0.668212 0.549443 0.697604 0.459850 0.566294 0.793959 0.221227 0.543322 0.838890 -0.032642 0.482353 0.828109 -0.285605 0.387241 0.760807 -0.520785 0.263883 0.640358 -0.721323 0.120212 0.474872 -0.871806 -0.034207 0.276997 -0.960262 -0.189015 0.062505 -0.979983 -0.334054 -0.151951 -0.930225 -0.460043 -0.350930 -0.815603 0.078127 0.767537 -0.636226 -0.065628 0.607085 -0.791922 -0.207587 0.404887 -0.890491 -0.338366 0.176870 -0.924243 -0.449623 -0.059552 -0.891231 -0.534417 -0.287612 -0.794782 -0.587216 -0.492381 -0.642447 -0.603944 -0.661149 -0.445122 -0.582362 -0.783580 -0.216463 -0.522697 -0.852067 0.027735 -0.428149 -0.862262 0.270543 -0.304989 -0.813484 0.495203 -0.162111 -0.708871 0.686456 -0.010189 -0.555226 0.831637 0.139335 -0.362618 0.921463 0.275322 -0.143789 0.950538 0.387952 0.086661 0.917596 0.469566 0.313295 0.825442 0.515225 0.520965 0.680543 0.522850 0.695853 0.492358 0.492975 0.826240 0.272586 0.428311 0.902969 0.034579 0.333328 0.919822 -0.206927 0.214076 0.874103 -0.436023 0.547527 0.478642 0.686379 0.511248 0.678067 0.528064 0.438547 0.833497 0.336093 0.334704 0.934398 0.121959 0.206612 0.973180 -0.101153 0.062549 0.945844 -0.318539 -0.088041 0.852913 -0.514575 -0.235032 0.700270 -0.674078 -0.368466 0.499157 -0.784267 -0.479529 0.264947 -0.836573 -0.561211 0.015080 -0.827535 -0.608502 -0.232879 -0.758613 -0.618295 -0.462497 -0.635459 -0.589408 -0.659053 -0.467169 -0.522821 -0.809985 -0.265674 -0.422063 -0.905446 -0.045068 -0.293369 -0.939031 0.179317 -0.145487 -0.908362 0.392061 0.010996 -0.815381 0.578820 0.164553 -0.666276 0.727323 0.303777 -0.471096 0.828123 0.418418 -0.243084 0.875121 0.500325 0.002255 0.865835 0.544121 0.248313 0.801419 0.164474 -0.880380 0.444837 0.320179 -0.736307 0.596102 0.451427 -0.541987 0.708847 0.548756 -0.310786 0.776067 0.605395 -0.058549 0.793769 0.617781 0.197608 0.761116 0.585703 0.440577 0.680327 0.512044 0.654401 0.556390 0.402277 0.825103 0.396709 0.263913 0.941222 0.210836 0.106075 0.994305 0.010316 -0.060836 0.979598 -0.191538 -0.225588 0.896948 -0.380255 -0.376872 0.751529 -0.541453 -0.504320 0.553806 -0.662541 -0.599475 0.318463 -0.734309 -0.656360 0.062639 -0.751843 -0.671570 -0.195806 -0.714600 -0.644149 -0.439551 -0.625993 -0.575526 -0.652611 -0.492817 -0.469602 -0.821000 -0.324706 -0.332844 -0.933484 -0.133501 -0.174146 -0.982401 0.067545 -0.004366 -0.964315 0.264722 -0.660582 -0.423286 -0.620048 -0.559012 -0.642860 -0.523675 -0.420599 -0.818815 -0.390690 -0.254199 -0.939284 -0.230497 -0.070847 -0.996016 -0.054150 0.116899 -0.985065 0.126417 0.295883 -0.907157 0.299199 0.453378 -0.767677 0.452902 0.578137 -0.576293 0.577619 0.661328 -0.346232 0.665408 0.697260 -0.093279 0.710723 0.683782 0.165420 0.710689 0.622302 0.412608 0.665203 0.517465 0.632032 0.576859 0.376611 0.809290 0.450792 0.209209 0.932458 0.294539 0.026368 0.992674 0.117907 -0.159652 0.984879 -0.067269 -0.336113 0.908655 -0.247737 -0.490768 0.768824 -0.409947 -0.612971 0.575331 -0.541536 -0.694620 0.342267 -0.632737 -0.730636 0.086332 -0.677287 -0.718999 -0.174717 -0.672692 -0.425651 0.896701 -0.121440 -0.581988 0.761446 -0.285466 -0.698752 0.573104 -0.428132 -0.768270 0.345241 -0.539046 -0.786319 0.094007 -0.610626 -0.752104 -0.163266 -0.638501 -0.668034 -0.409218 -0.621508 -0.539519 -0.627404 -0.561501 -0.374783 -0.803176 -0.463083 -0.184562 -0.924600 -0.333244 0.018431 -0.983330 -0.180893 0.220302 -0.975296 -0.016258 0.406992 -0.901068 0.149781 0.565364 -0.765830 0.306377 0.684240 -0.579000 0.443368 0.755295 -0.353507 0.551872 0.773711 -0.104810 0.624808 0.738489 0.150267 0.657308 0.652388 0.394728 0.646977 0.521547 0.612469 0.594029 0.354915 0.789129 0.501308 0.163661 0.912762 0.374273 -0.039406 0.974492 0.220937 -0.240485 0.969277 0.051656 0.674217 0.383452 0.631186 0.521532 0.593220 0.613266 0.333517 0.763355 0.553223 0.122790 0.882297 0.454394 -0.096416 0.941482 0.322979 -0.309042 0.936108 0.167912 -0.500240 0.865887 0.000370 -0.656644 0.735436 -0.167189 -0.767575 0.554027 -0.322308 -0.825866 0.334657 -0.453817 -0.828146 0.092760 -0.552784 -0.774715 -0.155067 -0.613001 -0.669272 -0.392122 -0.631122 -0.518657 -0.602510 -0.606611 -0.332591 -0.772027 -0.541625 -0.123280 -0.889087 -0.440824 0.095239 -0.945606 -0.311061 0.308016 -0.937667 -0.160957 0.500281 -0.865863 -0.000357 0.658564 -0.735260 0.160268 0.771752 -0.554998 0.310447 0.831959 -0.337571 0.440331 0.835118 -0.097871 0.541294 0.781226 0.147918 0.606470 0.577365 -0.802484 -0.150561 0.734944 -0.677949 0.015543 0.842746 -0.507222 0.180292 0.893268 -0.302184 0.332801 0.883104 -0.076887 0.462834 0.813135 0.153505 0.561470 0.688331 0.373747 0.621702 0.517267 0.569410 0.638911 0.311479 0.727592 0.611221 0.084797 0.837524 0.539780 -0.147361 0.891226 0.428954 -0.368890 0.884272 0.286326 -0.564199 0.816531 0.122294 -0.719612 0.692512 -0.050848 -0.824621 0.521061 -0.220217 -0.872632 0.314438 -0.373687 -0.861111 0.087106 -0.500900 -0.791336 -0.145418 -0.593835 -0.668071 -0.367495 -0.647015 -0.499277 -0.564195 -0.657576 -0.295845 -0.722149 -0.625281 -0.071132 -0.830469 -0.552505 0.159773 -0.881613 -0.444108 0.381062 -0.872032 -0.307167 -0.668566 -0.332470 -0.665195 -0.485112 -0.509151 -0.710937 -0.267680 -0.650032 -0.711200 -0.030528 -0.745266 -0.666068 0.210404 -0.788151 -0.578401 0.438579 -0.775736 -0.453742 0.638123 -0.709069 -0.300034 0.795046 -0.593065 -0.127189 0.898329 -0.436055 0.053493 0.940780 -0.249066 0.230000 0.919552 -0.044927 0.390391 0.836282 0.162701 0.523604 0.696820 0.360239 0.620217 0.510674 0.534932 0.673097 0.290332 0.675391 0.677904 0.050598 0.772067 0.633523 -0.192132 0.817830 0.542438 -0.420847 0.808728 0.410910 -0.619287 0.744732 0.248711 -0.773518 0.630093 0.068203 -0.873248 0.473006 -0.117063 -0.912472 0.284699 -0.293838 -0.889444 0.078306 -0.450286 -0.806279 -0.132134 -0.576589 -0.664268 0.643081 0.381045 -0.818207 0.541809 0.192302 -0.914380 0.404743 -0.009607 -0.947313 0.241675 -0.210217 -0.915921 0.063973 -0.396228 -0.822951 -0.116253 -0.556091 -0.674557 -0.286776 -0.680244 -0.480106 -0.435874 -0.761257 -0.251977 -0.553069 -0.794118 -0.005109 -0.629994 -0.776583 0.243873 -0.661185 -0.709479 0.477841 -0.644599 -0.596791 0.680482 -0.581764 -0.445528 0.837571 -0.477552 -0.265365 0.938074 -0.339677 -0.068098 0.974997 -0.177966 0.133077 0.945898 -0.003519 0.324446 0.852973 0.172152 0.492748 0.702717 0.337862 0.626130 0.505284 0.483265 0.714943 0.273799 0.599148 0.752367 0.023748 0.677680 0.734974 -0.227695 0.712881 0.663292 -0.462683 0.701353 0.542243 0.709661 0.303518 0.635813 0.505904 0.409570 0.759153 0.267499 0.492416 0.828233 0.010229 0.546526 0.837380 -0.248177 0.567442 0.785123 -0.489090 0.552495 0.674937 -0.694783 0.501630 0.515406 -0.850551 0.417844 0.319327 -0.946253 0.306963 0.101874 -0.976722 0.176894 -0.121338 -0.941277 0.036791 -0.335626 -0.843024 -0.103599 -0.527805 -0.688431 -0.234450 -0.686364 -0.487198 -0.346401 -0.801651 -0.252121 -0.431267 -0.866282 0.001394 -0.482808 -0.875725 0.256255 -0.497399 -0.828811 0.494937 -0.474370 -0.728018 0.700843 -0.415990 -0.579458 0.859572 -0.327122 -0.392590 0.960017 -0.214651 -0.179703 0.995219 -0.086758 0.044849 0.962885 0.047837 0.265637 0.865448 0.180572 0.467326 0.695022 -0.212498 -0.686870 0.857028 -0.141242 -0.495534 0.960815 -0.059270 -0.270781 0.999238 0.027317 -0.027878 0.969763 0.112795 0.216420 0.874553 0.192252 0.445191 0.720069 0.261738 0.642647 0.516358 0.318056 0.795120 0.276453 0.358394 0.891699 0.016052 0.380083 0.924813 -0.246841 0.380745 0.891124 -0.492950 0.358888 0.792590 -0.703790 0.314673 0.636915 -0.864058 0.250351 0.436724 -0.963300 0.170139 0.207619 -0.996238 0.079730 -0.033947 -0.962169 -0.014305 -0.272078 -0.864220 -0.104999 -0.492036 -0.708950 -0.185450 -0.680440 -0.506236 -0.249357 -0.825558 -0.269096 -0.291639 -0.917896 -0.013139 -0.309031 -0.950961 0.244418 -0.300475 -0.921941 0.486008 -0.267198 -0.832107 -0.729089 -0.148496 -0.668116 -0.531097 -0.155106 -0.832993 -0.297932 -0.146047 -0.943349 -0.045035 -0.121748 -0.991539 0.210694 -0.084225 -0.973917 0.452068 -0.036880 -0.891221 0.662812 0.015920 -0.748617 0.828667 0.069390 -0.555425 0.938351 0.118960 -0.324571 0.984363 0.160872 -0.071760 0.963541 0.192649 0.185673 0.877225 0.213257 0.430113 0.730971 0.222863 0.644991 0.533991 0.222295 0.815745 0.298682 0.212436 0.930409 0.040428 0.193870 0.980194 -0.222742 0.166923 0.960480 -0.471306 0.132060 0.872027 -0.686429 0.090369 0.721560 -0.852396 0.043818 0.521058 -0.958243 -0.004776 0.285917 -0.998103 -0.051989 0.032968 -0.970739 -0.094085 -0.220938 -0.878926 -0.127350 -0.459642 -0.647026 -0.146072 0.748345 -0.816819 -0.177965 0.548758 -0.929418 -0.196489 0.312370 -0.978122 -0.200358 0.055976 -0.960786 -0.188892 -0.203002 -0.879480 -0.162133 -0.447468 -0.740172 -0.121038 -0.661434 -0.552387 -0.067643 -0.830838 -0.328711 -0.005129 -0.944417 -0.084040 0.062292 -0.994513 0.165362 0.129653 -0.977673 0.402944 0.191654 -0.894933 0.612947 0.243186 -0.751769 0.781402 0.279858 -0.557755 0.897017 0.298533 -0.325943 0.951921 0.297768 -0.071979 0.942195 0.278035 0.186990 0.868123 0.241629 0.433565 0.734104 0.192213 0.651264 0.548373 0.134141 0.825405 0.322706 0.071807 0.943771 0.072150 0.009254 0.997351 -0.185577 -0.049938 0.981360 -0.431422 -0.102627 0.896294 0.727064 0.152974 0.669311 0.553476 0.043676 0.831719 0.339714 -0.065418 0.938251 0.100328 -0.166927 0.980852 -0.147728 -0.254144 0.955818 -0.386491 -0.321418 0.864474 -0.598636 -0.364520 0.713274 -0.769123 -0.380873 0.513212 -0.886389 -0.369652 0.278698 -0.943012 -0.331723 0.026251 -0.935913 -0.269525 -0.226768 -0.866284 -0.186936 -0.463257 -0.739348 -0.089114 -0.667400 -0.563962 0.017702 -0.825611 -0.352039 0.126497 -0.927398 -0.117780 0.229906 -0.966059 0.123236 0.320700 -0.939129 0.355054 0.392338 -0.848532 0.562353 0.439487 -0.700436 0.731391 0.458493 -0.504829 0.850868 0.447759 -0.274837 0.912638 0.407950 -0.025848 0.912232 0.342006 0.225532 0.849174 0.254864 0.462545 0.527331 0.586961 -0.614328 0.695937 0.584463 -0.417222 0.817367 0.543355 -0.191510 0.883310 0.466352 0.047744 0.889021 0.358697 0.284568 0.833673 0.227793 0.503091 0.720507 0.082664 0.688503 0.556741 -0.066675 0.828006 0.353264 -0.209922 0.911667 0.124027 -0.337186 0.933232 -0.114888 -0.439696 0.890768 -0.346530 -0.510446 0.786995 -0.554470 -0.544716 0.629164 -0.724163 -0.540380 0.428460 -0.844032 -0.497984 0.199055 -0.906224 -0.420603 -0.043039 -0.906991 -0.313565 -0.281150 -0.846786 -0.184073 -0.499071 -0.730108 -0.040759 -0.682115 -0.565127 0.106833 -0.818057 -0.363103 0.248841 -0.897905 -0.137642 0.375679 -0.916471 0.096200 0.478711 -0.872686 0.322878 0.550829 -0.769634 -0.717096 0.024155 -0.696556 -0.558192 0.198833 -0.805536 -0.361954 0.360303 -0.859751 -0.141630 0.497699 -0.855709 0.088011 0.601736 -0.793831 0.311622 0.665338 -0.678393 0.514270 0.684111 -0.517223 0.682377 0.656674 -0.321155 0.804595 0.584763 -0.103338 0.872546 0.473146 0.121643 0.881385 0.329318 0.338689 0.830171 0.163015 0.533144 0.721999 -0.014432 0.691743 0.563908 -0.190850 0.803483 0.366512 -0.354056 0.860415 0.143353 -0.492723 0.858297 -0.090032 -0.597212 0.797015 -0.317274 -0.660306 0.680686 -0.522451 -0.677750 0.517397 -0.691314 -0.648532 0.318576 -0.812334 -0.574882 0.098102 -0.877468 -0.462033 -0.128748 -0.882619 -0.317801 -0.346391 -0.827814 -0.152008 -0.540016 -0.506648 -0.763518 0.400435 -0.674667 -0.708537 0.206881 -0.795478 -0.605980 -0.001503 -0.861015 -0.463041 -0.210350 -0.867088 -0.289572 -0.405347 -0.813591 -0.097387 -0.573224 -0.704418 0.100514 -0.702632 -0.547154 0.290797 -0.784894 -0.352535 0.460659 -0.814563 -0.133715 0.598658 -0.789765 0.094592 0.695474 -0.712298 0.317078 0.744528 -0.587485 0.518831 0.742439 -0.423791 0.686286 0.689251 -0.232258 0.808118 0.588457 -0.025772 0.875977 0.446780 0.181799 0.885060 0.273749 0.376471 0.834464 0.081073 0.545066 0.727316 -0.118124 0.676060 0.570659 -0.310172 0.760356 0.375044 -0.481807 0.791962 0.153885 -0.621106 0.768470 -0.077466 -0.718389 0.691315 -0.302883 -0.766941 0.565742 0.730030 -0.211060 0.650008 0.571821 -0.410401 0.710346 0.375065 -0.582882 0.720816 0.153247 -0.716541 0.680504 -0.078284 -0.802103 0.592032 -0.303417 -0.833690 0.461409 -0.506515 -0.809235 0.297627 -0.673565 -0.730594 0.111993 -0.793186 -0.603340 -0.082686 -0.857372 -0.436312 -0.273030 -0.861986 -0.240957 -0.446004 -0.806962 -0.030553 -0.589813 -0.696250 0.180664 -0.694692 -0.537509 0.378429 -0.753575 -0.341573 0.549402 -0.762552 -0.121712 0.682028 -0.721126 0.107248 0.767330 -0.632221 0.329908 0.799499 -0.501959 0.531299 0.776308 -0.339216 0.697859 0.699258 -0.155020 0.818322 0.573489 0.038202 0.884449 0.407450 0.227452 0.891589 0.212338 0.399976 0.839016 0.001377 0.544105 0.542521 0.797600 -0.263639 0.708227 0.700464 -0.088122 0.827036 0.554620 0.091697 0.890855 0.369917 0.263701 0.895236 0.158846 0.416317 0.839684 -0.064284 0.539257 0.727753 -0.284280 0.624148 0.566857 -0.486078 0.665133 0.367868 -0.655778 0.659263 0.144410 -0.781642 0.606780 -0.088091 -0.854967 0.511148 -0.313524 -0.870731 0.378855 -0.516285 -0.827953 0.218960 -0.682440 -0.729708 0.042450 -0.800679 -0.582853 -0.138552 -0.863066 -0.397498 -0.311630 -0.865528 -0.186290 -0.464928 -0.808070 0.036424 -0.587959 -0.694745 0.255553 -0.672326 -0.533358 0.456249 -0.712296 -0.334924 0.624904 -0.705209 -0.112922 0.750075 -0.651641 0.117616 0.823256 -0.555352 0.341123 0.839470 -0.422996 -0.697979 0.316522 -0.642370 -0.534527 0.518371 -0.667513 -0.334020 0.684186 -0.648321 -0.110120 0.802664 -0.586178 0.121945 0.865733 -0.485423 0.346429 0.869113 -0.353029 0.548128 0.812600 -0.198086 0.713404 0.700060 -0.031159 0.831082 0.539154 0.136444 0.893174 0.340798 0.293422 0.895405 0.118435 0.429212 0.837493 -0.112857 0.534667 0.723212 -0.337346 0.602628 0.560193 -0.539703 0.628414 0.359468 -0.706038 0.610158 0.134754 -0.824899 0.548984 -0.098495 -0.888102 0.448970 -0.324203 -0.891330 0.316897 -0.526834 -0.834430 0.161779 -0.692511 -0.721384 -0.005773 -0.809961 -0.559988 -0.174288 -0.871264 -0.361278 -0.332230 -0.872344 -0.138780 -0.468782 -0.813217 0.092388 -0.574581 -0.532855 -0.837816 0.118871 -0.698662 -0.714294 -0.040692 -0.816209 -0.542599 -0.198469 -0.877523 -0.334426 -0.343676 -0.878462 -0.103933 -0.466372 -0.818986 0.133207 -0.558138 -0.703160 0.360845 -0.612664 -0.538890 0.563450 -0.626196 -0.337391 0.727174 -0.597817 -0.112424 0.840818 -0.529514 0.120661 0.896628 -0.426027 0.345983 0.890821 -0.294506 0.548225 0.823843 -0.143987 0.713674 0.700312 0.015247 0.831131 0.528680 0.172390 0.892648 0.320632 0.316820 0.894034 0.090297 0.438806 0.835136 -0.146695 0.530122 0.719865 -0.374242 0.584583 0.555974 -0.576841 0.598453 0.354568 -0.740647 0.570722 0.129381 -0.854432 0.503196 -0.104168 -0.910397 0.400407 -0.330072 -0.904719 0.269325 0.719173 -0.398820 0.568975 0.555660 -0.601996 0.573449 0.354571 -0.764495 0.538355 0.129591 -0.875225 0.466033 -0.103935 -0.926616 0.361359 -0.330056 -0.915152 0.231428 -0.533334 -0.841616 0.085072 -0.699900 -0.711021 -0.067745 -0.818404 -0.532259 -0.216602 -0.880775 -0.317486 -0.351338 -0.882760 -0.081306 -0.462735 -0.824209 0.160207 -0.543151 -0.709093 0.390585 -0.587052 -0.545251 0.594089 -0.591405 -0.343865 0.756787 -0.555905 -0.118700 0.867537 -0.483000 0.114851 0.918768 -0.377723 0.340837 0.907006 -0.247328 0.543852 0.833109 -0.100771 0.710098 0.702185 0.051929 0.828307 0.523214 0.200386 0.890486 0.308413 0.334539 0.892436 0.072395 0.445327 0.834020 -0.168810 0.525275 0.536087 0.841455 -0.067559 0.703611 0.706066 0.080015 0.823349 0.522452 0.221674 0.887203 0.303165 0.347795 0.890874 0.063150 0.449840 0.834139 -0.181274 0.520914 0.720861 -0.413500 0.556218 0.558728 -0.617751 0.553359 0.358748 -0.780141 0.512523 0.134519 -0.889611 0.436460 -0.098700 -0.938696 0.330316 -0.325016 -0.924039 0.201288 -0.529004 -0.846625 0.058139 -0.696761 -0.711711 -0.089393 -0.816850 -0.528464 -0.231261 -0.881078 -0.309336 -0.357790 -0.885045 -0.069227 -0.460330 -0.828448 0.175515 -0.531854 -0.715111 0.408199 -0.567441 -0.552741 0.612926 -0.564623 -0.352410 0.775678 -0.523575 -0.127808 0.885303 -0.447105 0.105701 0.934296 -0.340468 0.332154 0.919324 -0.210992 -0.720942 0.417402 -0.553189 -0.560802 0.623657 -0.544566 -0.362237 0.787297 -0.498947 -0.138804 0.897108 -0.419441 0.094223 0.945567 -0.311490 0.320908 0.929362 -0.182493 0.525761 0.849629 -0.041292 0.694809 0.711859 0.102453 0.816552 0.525506 0.238928 0.882738 0.303321 0.358846 0.888911 0.060463 0.454072 0.834694 -0.186533 0.518161 0.723801 -0.420875 0.546787 0.563781 -0.626642 0.538025 0.365512 -0.789855 0.492473 0.142472 -0.899416 0.413223 -0.090169 -0.947866 0.305645 -0.316580 -0.931898 0.177043 -0.521342 -0.852582 0.036149 -0.690507 -0.715299 -0.107455 -0.812545 -0.529373 -0.243997 -0.879125 -0.307440 -0.364170 -0.885685 -0.064592 -0.459771 -0.831745 0.182641 -0.524255 -0.511311 -0.859224 0.017150 -0.681837 -0.720947 -0.123828 -0.805897 -0.533610 -0.256497 -0.875030 -0.309952 -0.371822 -0.884511 -0.065185 -0.461942 -0.833668 0.184033 -0.520701 -0.725934 0.420725 -0.544069 -0.568620 0.628747 -0.530423 -0.372431 0.793884 -0.480669 -0.150745 0.904836 -0.398181 0.081304 0.953995 -0.288587 0.307858 0.937988 -0.159378 0.513433 0.857911 -0.019395 0.683991 0.719253 0.121786 0.807905 0.531518 0.254516 0.876755 0.307549 0.369749 0.885890 0.062642 0.459646 0.834732 -0.186507 0.518110 0.726797 -0.422939 0.541192 0.569453 -0.630580 0.527345 0.373411 -0.795319 0.477528 0.152008 -0.905960 0.395133 -0.079696 -0.954981 0.285762 -0.305936 -0.939043 0.156847 0.728220 -0.421428 0.540458 0.573914 -0.631102 0.521856 0.380545 -0.797761 0.467722 0.161284 -0.910082 0.381757 -0.068946 -0.960438 0.269823 -0.294477 -0.945417 0.139536 -0.499964 -0.866046 -0.000240 -0.671422 -0.727731 -0.140000 -0.797180 -0.539884 -0.270239 -0.868675 -0.315284 -0.382098 -0.881033 -0.069207 -0.467965 -0.833395 0.181606 -0.521988 -0.728983 0.420087 -0.540472 -0.574879 0.629992 -0.522134 -0.381556 0.796999 -0.468195 -0.162173 0.909694 -0.382305 0.068314 0.960348 -0.270303 0.294169 0.945470 -0.139827 0.499959 0.866049 0.000211 0.671619 0.727504 0.140234 0.797424 0.539309 0.270668 0.868797 0.314336 0.382602 0.880898 0.067961 0.468402 0.832936 -0.182996 0.522236 0.486268 0.873586 0.019765 0.658345 0.735559 0.159800 0.785425 0.547329 0.289031 0.858822 0.321761 0.398617 0.873533 0.074279 0.481064 0.828580 -0.178205 0.530752 0.727069 -0.418452 0.544306 0.575955 -0.630088 0.520831 0.385567 -0.798707 0.461958 0.168890 -0.912851 0.371724 -0.059319 -0.964777 0.256294 -0.283525 -0.950975 0.123536 -0.488472 -0.872404 -0.017510 -0.660219 -0.734427 -0.157250 -0.787081 -0.546447 -0.286181 -0.860430 -0.321258 -0.395541 -0.875277 -0.074186 -0.477898 -0.830608 0.177968 -0.527654 -0.729450 0.418054 -0.541418 -0.578668 0.629740 -0.518237 -0.388499 0.798609 -0.459665 -0.171868 0.913135 -0.369657 0.056476 0.965470 -0.254317 0.280966 0.951997 -0.121491 -0.726226 0.416562 -0.546875 -0.578713 0.629753 -0.518173 -0.391915 0.800175 -0.454007 -0.178517 0.916220 -0.358710 0.046974 0.969949 -0.238729 0.269200 0.957646 -0.102207 0.472997 0.880083 0.041567 0.644431 0.742496 0.182779 0.771760 0.554246 0.311765 0.846262 0.328182 0.419688 0.862840 0.079763 0.499145 0.820374 -0.174022 0.544703 0.721801 -0.415825 0.553257 0.573883 -0.629144 0.524249 0.386746 -0.799444 0.459691 0.173166 -0.915151 0.364023 -0.052301 -0.968417 0.243790 -0.274305 -0.955649 0.107203 -0.477741 -0.877745 -0.036431 -0.648771 -0.740032 -0.177336 -0.775764 -0.551903 -0.305932 -0.850083 -0.326176 -0.413482 -0.866683 -0.078218 -0.492689 -0.824439 0.175101 -0.538182 -0.468759 -0.881385 -0.058521 -0.637736 -0.743381 -0.201688 -0.763527 -0.554670 -0.330707 -0.837572 -0.328122 -0.436816 -0.854837 -0.079178 -0.512820 -0.814158 0.175209 -0.553578 -0.718316 0.417739 -0.556342 -0.573834 0.631931 -0.520939 -0.390533 0.803242 -0.449762 -0.180859 0.920027 -0.347620 0.040941 0.974320 -0.221413 0.259780 0.962374 -0.079687 0.460739 0.884932 0.067934 0.630084 0.747202 0.211387 0.756217 0.558527 0.340857 0.830487 0.331769 0.447461 0.847799 0.082423 0.523873 0.806978 -0.172453 0.564842 0.710839 -0.415424 0.567565 0.565988 -0.629895 0.531875 0.382340 -0.801243 0.460246 0.172440 -0.917814 0.357606 -0.049406 -0.971701 0.230992 -0.268098 -0.959267 0.089056 0.692524 -0.419098 0.587169 0.550562 -0.633946 0.543133 0.370696 -0.805358 0.462584 0.165200 -0.921663 0.351064 -0.051934 -0.974961 0.216225 -0.265937 -0.961639 0.067290 -0.462248 -0.882612 -0.085573 -0.627499 -0.743268 -0.231942 -0.750418 -0.553115 -0.361853 -0.822611 -0.325137 -0.466473 -0.839154 -0.074906 -0.538712 -0.798930 0.180501 -0.573698 -0.704709 0.423685 -0.569102 -0.562932 0.638121 -0.525271 -0.383263 0.809267 -0.445192 -0.177919 0.925527 -0.334282 0.039150 0.979008 -0.200025 0.253190 0.966045 -0.051488 0.449630 0.887456 0.101263 0.615063 0.748514 0.247838 0.738170 0.558623 0.378213 0.810511 0.330699 0.483436 0.827122 0.080294 0.556258 0.786869 -0.175468 0.591648 0.439473 0.886548 0.144556 0.598501 0.744793 0.295095 0.716088 0.552480 0.426595 0.784198 0.322657 0.530025 0.798173 0.070973 0.598233 0.757062 -0.185394 0.626487 0.663688 -0.428931 0.612811 0.524439 -0.643002 0.558132 0.348816 -0.813002 0.466214 0.148771 -0.927340 0.343378 -0.062108 -0.978222 0.198053 -0.269492 -0.962164 0.040188 -0.459277 -0.880228 -0.119428 -0.618506 -0.737974 -0.269897 -0.736275 -0.545100 -0.400955 -0.804490 -0.314803 -0.503681 -0.818461 -0.062865 -0.571113 -0.777241 0.193462 -0.598723 -0.683688 0.436672 -0.584712 -0.544243 0.650222 -0.530105 -0.368457 0.819655 -0.438641 -0.168319 0.933533 -0.316520 0.042561 0.984182 -0.171972 0.249856 0.968171 -0.014739 -0.653376 0.458124 -0.602679 -0.516071 0.669266 -0.534559 -0.344720 0.834967 -0.428951 -0.151060 0.944098 -0.293019 0.051712 0.989369 -0.135922 0.249818 0.967771 0.031770 0.429816 0.880771 0.198748 0.579490 0.734227 0.353699 0.688679 0.538025 0.486056 0.749969 0.305443 0.586728 0.759202 0.052266 0.648754 0.715764 -0.204280 0.667796 0.622621 -0.446713 0.642488 0.486105 -0.658498 0.574528 0.315473 -0.825180 0.468567 0.122283 -0.935365 0.331872 -0.080393 -0.981491 0.173815 -0.278802 -0.960334 0.005221 -0.459436 -0.873244 -0.162368 -0.609913 -0.726093 -0.317483 -0.719852 -0.528918 -0.449510 -0.781627 -0.295253 -0.549441 -0.790944 -0.041186 -0.610500 -0.747172 0.215808 -0.628618 -0.458993 -0.860879 -0.219576 -0.597342 -0.706553 -0.379427 -0.696319 -0.503351 -0.511642 -0.748984 -0.265275 -0.607167 -0.751634 -0.008798 -0.659521 -0.704097 0.248365 -0.665254 -0.609735 0.488557 -0.624127 -0.475152 0.695413 -0.539103 -0.309684 0.854986 -0.416045 -0.124717 0.956611 -0.263326 0.067114 0.993564 -0.091249 0.252771 0.963460 0.088612 0.419675 0.868390 0.264142 0.556553 0.714790 0.423467 0.654177 0.513023 0.555752 0.705980 0.276711 0.651938 0.708499 0.021835 0.705374 0.661587 -0.234334 0.712313 0.568424 -0.474401 0.672189 0.435292 -0.682026 0.587675 0.271141 -0.843036 0.464514 0.087022 -0.946380 0.311113 -0.104656 -0.984892 0.137965 -0.290901 -0.955783 -0.043071 0.504137 -0.513308 0.694522 0.376568 -0.714674 0.589438 0.221888 -0.867372 0.445457 0.050441 -0.960875 0.272351 -0.126241 -0.988611 0.081927 -0.296179 -0.948451 -0.112779 -0.447720 -0.842920 -0.298383 -0.570351 -0.679103 -0.462082 -0.655461 -0.468216 -0.592574 -0.697027 -0.224849 -0.680879 -0.692093 0.034101 -0.721002 -0.641024 0.290708 -0.710336 -0.547445 0.527314 -0.649803 -0.417940 0.727800 -0.543722 -0.261535 0.878665 -0.399434 -0.089028 0.969868 -0.226784 0.087770 0.995437 -0.037444 0.256836 0.953810 0.155827 0.406742 0.847908 0.340020 0.527409 0.684932 0.502701 0.610763 0.475889 0.632849 0.651262 0.234871 0.721590 0.646242 -0.021878 0.762819 0.596076 -0.277026 0.753625 0.383691 0.820029 0.424657 0.486239 0.646162 0.588257 0.554858 0.428811 0.712920 0.585034 0.182601 0.790185 0.574822 -0.075917 0.814749 0.524944 -0.329344 0.784835 0.438734 -0.560568 0.702336 0.321916 -0.753900 0.572716 0.182239 -0.896120 0.404671 0.029009 -0.977366 0.209556 -0.127492 -0.991839 0.000651 -0.276639 -0.938253 -0.207731 -0.408169 -0.820013 -0.401220 -0.512904 -0.645070 -0.566405 -0.583439 -0.425441 -0.691808 -0.614737 -0.176368 -0.768760 -0.604555 0.084813 -0.792035 -0.553618 0.339978 -0.760212 -0.465551 0.571556 -0.675711 -0.346571 0.763784 -0.544539 -0.205001 0.903747 -0.375788 -0.050642 0.982178 -0.181000 0.105915 0.994018 0.026646 0.254024 0.938674 0.233158 -0.373140 0.618730 -0.691331 -0.273523 0.800968 -0.532574 -0.155109 0.928280 -0.337990 -0.026165 0.992326 -0.120852 0.104409 0.989064 0.104173 0.227704 0.918953 0.321987 0.335410 0.786882 0.517992 0.420363 0.601828 0.679042 0.476983 0.376255 0.794304 0.501617 0.125304 0.855967 0.492731 -0.134192 0.859772 0.450984 -0.384802 0.805321 0.379155 -0.609634 0.696123 0.281974 -0.793432 0.539403 0.165827 -0.923598 0.345642 0.038374 -0.991043 0.127912 -0.091882 -0.990840 -0.098965 -0.216134 -0.922639 -0.319411 -0.325821 -0.790802 -0.518144 -0.413237 -0.604218 -0.681290 -0.472140 -0.375750 -0.797431 -0.498254 -0.121329 -0.858500 -0.489656 0.141254 -0.860398 -0.446935 0.393734 -0.803258 -0.194524 -0.751974 -0.629838 -0.268786 -0.554590 -0.787517 -0.323289 -0.318494 -0.891092 -0.353910 -0.060290 -0.933334 -0.358250 0.201837 -0.911547 -0.335880 0.449588 -0.827681 -0.288400 0.665946 -0.687998 -0.219301 0.836344 -0.502430 -0.133647 0.949529 -0.283783 -0.037639 0.998192 -0.046866 0.061910 0.979354 0.192438 0.158098 0.894518 0.418141 0.244436 0.749548 0.615166 0.315257 0.554262 0.770329 0.366058 0.321795 0.873184 0.393709 0.067739 0.916736 0.396598 -0.190894 0.897925 0.374673 -0.436753 0.817843 0.329413 -0.653283 0.681695 0.263723 -0.825810 0.498485 0.181765 -0.942503 0.280446 0.088747 -0.995157 0.042263 -0.009319 -0.979781 -0.199854 -0.105945 -0.896961 -0.429227 0.292464 -0.685124 0.667136 0.271366 -0.843842 0.462916 0.234783 -0.945322 0.226369 0.184552 -0.982460 -0.026694 0.123431 -0.952276 -0.279168 0.055072 -0.856212 -0.513681 -0.016042 -0.700269 -0.713698 -0.084827 -0.494896 -0.864802 -0.145981 -0.254425 -0.956011 -0.194498 0.004011 -0.980895 -0.226296 0.262033 -0.938152 -0.238718 0.501626 -0.831496 -0.230890 0.706507 -0.668983 -0.203767 0.863089 -0.462121 -0.159915 0.961142 -0.225019 -0.103115 0.994318 0.026429 -0.037876 0.960568 0.275455 0.031044 0.862306 0.505436 0.099009 0.706278 0.700977 0.161771 0.503090 0.848959 0.215635 0.266473 0.939412 0.257562 0.012374 0.966183 0.285239 -0.242129 0.927369 0.297118 -0.479951 0.825450 -0.096808 0.651887 0.752111 -0.036447 0.444202 0.895185 0.028723 0.207467 0.977820 0.095241 -0.042118 0.994563 0.159411 -0.287586 0.944395 0.217380 -0.512399 0.830779 0.265323 -0.701569 0.661366 0.299672 -0.842630 0.447406 0.317398 -0.926323 0.202941 0.316317 -0.946996 -0.056058 0.295424 -0.902816 -0.312487 0.255194 -0.795974 -0.548910 0.197885 -0.632916 -0.748504 0.127634 -0.424430 -0.896420 0.050250 -0.185173 -0.981420 -0.027457 0.067580 -0.997336 -0.098683 0.315769 -0.943690 -0.157679 0.542277 -0.825271 -0.200432 0.732065 -0.651082 -0.224857 0.872738 -0.433322 -0.230594 0.954976 -0.186673 -0.218587 0.973131 0.072357 -0.190670 0.925818 0.326352 -0.149188 0.816215 0.558154 -0.172194 0.744645 -0.644867 -0.253976 0.866364 -0.430011 -0.315331 0.930661 -0.185572 -0.353588 0.932636 0.071867 -0.367151 0.871659 0.324670 -0.355431 0.751733 0.555488 -0.318916 0.581258 0.748620 -0.259273 0.372317 0.891155 -0.179493 0.139661 0.973795 -0.083937 -0.100438 0.991396 0.021733 -0.331415 0.943235 0.130791 -0.537659 0.832957 0.235866 -0.705614 0.668189 0.329458 -0.824629 0.459831 0.404511 -0.887374 0.221217 0.454936 -0.889926 -0.032642 0.476105 -0.831721 -0.285593 0.465384 -0.715694 -0.520769 0.422747 -0.548637 -0.721306 0.351255 -0.341472 -0.871790 0.257075 -0.108809 -0.960246 0.148695 0.132496 -0.979967 0.035461 0.365319 -0.930207 -0.073895 0.573902 -0.815583 0.625670 -0.451395 -0.636223 0.558630 -0.246649 -0.791895 0.454542 -0.022588 -0.890439 0.322501 0.204698 -0.924171 0.173412 0.419275 -0.891144 0.018316 0.606746 -0.794685 -0.132626 0.754852 -0.642346 -0.270442 0.853707 -0.445022 -0.387296 0.896206 -0.216372 -0.476487 0.878741 0.027811 -0.532635 0.801920 0.270598 -0.552016 0.670836 0.495234 -0.532897 0.494762 0.686463 -0.475827 0.286348 0.831621 -0.383807 0.060535 0.921427 -0.262302 -0.166656 0.950486 -0.119045 -0.379419 0.917535 0.036421 -0.563410 0.825374 0.193447 -0.706776 0.680475 0.341106 -0.800807 0.492295 0.468978 -0.840112 0.272528 0.567781 -0.822455 0.034531 0.629892 -0.748600 -0.206962 0.649952 -0.622440 -0.436041 0.140730 -0.713530 0.686345 0.331547 -0.781856 0.527994 0.502477 -0.796635 0.335990 0.641758 -0.757169 0.121830 0.739374 -0.665631 -0.101298 0.787721 -0.527194 -0.318688 0.782535 -0.350300 -0.514712 0.723849 -0.146664 -0.674190 0.616419 0.069470 -0.784348 0.469146 0.282780 -0.836622 0.293630 0.478475 -0.827553 0.102566 0.643430 -0.758602 -0.091360 0.766740 -0.635424 -0.276005 0.840016 -0.467113 -0.439986 0.857828 -0.265602 -0.573020 0.818306 -0.044986 -0.666436 0.723655 0.179404 -0.713813 0.580251 0.392148 -0.711530 0.398243 0.578903 -0.659185 0.190702 0.727398 -0.559780 -0.027469 0.828186 -0.419657 -0.240773 0.875166 -0.248169 -0.434399 0.865858 -0.057005 -0.595385 0.801415 -0.844623 0.297806 0.444886 -0.797684 0.090950 0.596178 -0.695007 -0.119856 0.708943 -0.543437 -0.319738 0.776173 -0.353310 -0.494907 0.793876 -0.137668 -0.633718 0.761215 0.088780 -0.727435 0.680409 0.310774 -0.770573 0.556449 0.513472 -0.760882 0.396743 0.683196 -0.699134 0.210844 0.808063 -0.589006 0.010295 0.878758 -0.437126 -0.191587 0.889531 -0.253145 -0.380331 0.839210 -0.049442 -0.541555 0.731675 0.159772 -0.662664 0.575418 0.359833 -0.734448 0.382297 0.536994 -0.751989 0.166078 0.679381 -0.714744 -0.058714 0.777509 -0.626125 -0.277519 0.824623 -0.492930 -0.476281 0.817108 -0.324793 -0.642043 0.754946 -0.133555 -0.763722 0.642004 0.067527 -0.832919 0.485963 0.264738 -0.036283 0.783702 -0.620077 -0.277234 0.805514 -0.523726 -0.498830 0.773613 -0.390758 -0.686368 0.689734 -0.230577 -0.827182 0.559311 -0.054237 -0.911577 0.391239 0.126328 -0.933601 0.197280 0.299114 -0.891556 -0.008850 0.452824 -0.788188 -0.212579 0.577555 -0.630538 -0.399645 0.665362 -0.429430 -0.557223 0.710698 -0.198640 -0.674876 0.710693 0.046182 -0.745204 0.665236 0.288635 -0.764100 0.576923 0.512580 -0.730727 0.450888 0.702955 -0.647325 0.294661 0.846532 -0.519084 0.118047 0.932798 -0.354093 -0.067124 0.955024 -0.163171 -0.247599 0.911255 0.040667 -0.409830 0.804783 0.243229 -0.541446 0.643759 0.430454 -0.632679 0.440109 0.589594 -0.677261 0.208204 0.710023 -0.672695 0.989393 -0.079745 -0.121422 0.950437 0.123291 -0.285427 0.845724 0.318602 -0.428071 0.683160 0.492756 -0.538965 0.474620 0.634024 -0.610532 0.234715 0.733046 -0.638398 -0.020319 0.783228 -0.621403 -0.273534 0.781029 -0.561403 -0.508134 0.726246 -0.462998 -0.708412 0.622209 -0.333180 -0.860781 0.475760 -0.180853 -0.954772 0.296895 -0.016246 -0.983845 0.098075 0.149765 -0.945922 -0.106723 0.306335 -0.843568 -0.303109 0.443303 -0.683820 -0.477407 0.551790 -0.477654 -0.617717 0.624718 -0.239142 -0.714759 0.657215 0.015616 -0.762425 0.646888 0.269607 -0.757981 0.593951 0.505918 -0.701998 0.501245 0.708619 -0.598174 0.374227 0.863620 -0.453166 0.220911 0.959652 -0.276407 0.051652 -0.005059 -0.775585 0.631223 0.252951 -0.748264 0.613284 0.494305 -0.670531 0.553219 0.702682 -0.547530 0.454366 0.863548 -0.387303 0.322925 0.965212 -0.200491 0.167839 1.000000 0.000194 0.000283 0.965231 0.200865 -0.167280 0.863595 0.387640 -0.322395 0.702765 0.547813 -0.453897 0.494421 0.670748 -0.552852 0.253085 0.748405 -0.613056 -0.004931 0.775634 -0.631163 -0.262441 0.750410 -0.606638 -0.502283 0.674048 -0.541638 -0.708319 0.551327 -0.440821 -0.866529 0.390358 -0.311044 -0.966047 0.202130 -0.160927 -1.000000 -0.000267 -0.000314 -0.966042 -0.202635 0.160320 -0.866529 -0.390785 0.310506 -0.708342 -0.551640 0.440392 -0.502342 -0.674233 0.541353 -0.262541 -0.750470 0.606521 -0.983642 -0.098786 -0.150633 -0.954597 -0.297497 0.015496 -0.860660 -0.476199 0.180274 -0.708370 -0.622453 0.332812 -0.508189 -0.726287 0.462872 -0.273690 -0.780880 0.561534 -0.020559 -0.782915 0.621789 0.234421 -0.732603 0.639014 0.474308 -0.633483 0.611336 0.682862 -0.492146 0.539900 0.845459 -0.317952 0.429074 0.950217 -0.122637 0.286440 0.989223 0.080364 0.122395 0.959542 0.276952 -0.050767 0.863580 0.453605 -0.220164 0.708657 0.598481 -0.373666 0.506029 0.702154 -0.500914 0.269776 0.757975 -0.593881 0.015822 0.762249 -0.647090 -0.238920 0.714412 -0.657672 -0.477430 0.617211 -0.625389 -0.683598 0.476769 -0.552617 -0.843349 0.302383 -0.444214 -0.945707 0.105971 -0.307259 0.046370 0.745281 -0.665136 -0.198364 0.674744 -0.710895 -0.429084 0.556879 -0.711177 -0.630134 0.399110 -0.666065 -0.787740 0.211892 -0.578418 -0.891078 0.008068 -0.453779 -0.933116 -0.198090 -0.300091 -0.911118 -0.392006 -0.127263 -0.826787 -0.559973 0.053406 -0.686078 -0.690246 0.229906 -0.498677 -0.773944 0.390297 -0.277233 -0.805651 0.523516 -0.036432 -0.783642 0.620144 0.207923 -0.709774 0.673044 0.439728 -0.589172 0.677876 0.643313 -0.429881 0.633523 0.804304 -0.242538 0.542466 0.910777 -0.039901 0.410966 0.954579 0.163964 0.248788 0.932420 0.354864 0.068294 0.846251 0.519787 -0.116967 0.702792 0.647918 -0.293744 0.512543 0.731177 -0.450200 0.288719 0.764376 -0.576516 0.889071 0.253684 0.381048 0.878340 0.437646 0.192314 0.807726 0.589480 -0.009587 0.682973 0.699548 -0.210192 0.513382 0.761227 -0.396196 0.310817 0.770840 -0.556057 0.088941 0.727603 -0.680208 -0.137411 0.633763 -0.761224 -0.352973 0.494806 -0.794089 -0.543031 0.319480 -0.776563 -0.694541 0.119454 -0.709467 -0.797167 -0.091464 -0.596790 -0.844076 -0.298381 -0.445538 -0.832375 -0.486541 -0.265386 -0.763225 -0.642531 -0.068128 -0.641642 -0.755378 0.133040 -0.476015 -0.817418 0.324402 -0.277415 -0.824795 0.492701 -0.058773 -0.777538 0.626083 0.165871 -0.679269 0.714899 0.381974 -0.536747 0.752329 0.575015 -0.359466 0.734943 0.731225 -0.159310 0.663272 0.838741 0.049963 0.542234 -0.092021 -0.766354 0.635794 0.101714 -0.642939 0.759133 0.292684 -0.477915 0.828211 0.468196 -0.282182 0.837356 0.615535 -0.068866 0.785095 0.723067 0.147235 0.674905 0.781878 0.350798 0.515372 0.787212 0.527588 0.319292 0.739043 0.665915 0.101847 0.641635 0.757349 -0.121355 0.502575 0.796726 -0.335628 0.331857 0.781860 -0.527794 0.141226 0.713434 -0.686344 -0.056362 0.595165 -0.801624 -0.247418 0.434038 -0.866254 -0.418832 0.240274 -0.875698 -0.558916 0.026863 -0.828789 -0.658328 -0.191354 -0.728002 -0.710732 -0.398871 -0.579450 -0.713142 -0.580777 -0.392590 -0.665965 -0.724013 -0.179709 -0.572808 -0.818462 0.044839 -0.440074 -0.857776 0.265623 -0.276397 -0.839778 0.467309 -0.531442 -0.495690 -0.686921 -0.550783 -0.671597 -0.495576 -0.531735 -0.802446 -0.270811 -0.476011 -0.878997 -0.027893 -0.387297 -0.896194 0.216421 -0.270920 -0.853460 0.445207 -0.133529 -0.754414 0.642674 0.017085 -0.606159 0.795160 0.171974 -0.418575 0.891751 0.320977 -0.203916 0.924874 0.453018 0.023413 0.891194 0.557174 0.247471 0.792663 0.624334 0.452164 0.636989 0.648795 0.623117 0.436795 0.628984 0.749165 0.207681 0.567191 0.822889 -0.033901 0.468753 0.840392 -0.272050 0.341268 0.800902 -0.492029 0.193990 0.706647 -0.680454 0.037311 0.563035 -0.825590 -0.117861 0.378801 -0.917943 -0.260899 0.165833 -0.951016 -0.382276 -0.061492 -0.922000 -0.474276 -0.287341 -0.832165 0.235886 0.705739 -0.668050 0.131189 0.537580 -0.832945 0.022474 0.331126 -0.943319 -0.082911 0.099959 -0.991531 -0.178260 -0.140277 -0.973933 -0.257928 -0.372997 -0.891261 -0.317555 -0.581926 -0.748680 -0.354156 -0.752320 -0.555507 -0.366050 -0.872122 -0.324671 -0.352742 -0.932957 -0.071866 -0.314796 -0.930843 0.185568 -0.253789 -0.866416 0.430016 -0.172352 -0.744573 0.644908 -0.074382 -0.573701 0.815681 0.034695 -0.364982 0.930368 0.147693 -0.132033 0.980181 0.255889 0.109369 0.960500 0.349934 0.342086 0.872080 0.421361 0.549261 0.721642 0.464015 0.716297 0.521160 0.474854 0.832287 0.286027 0.453907 0.890435 0.033075 0.403786 0.887798 -0.220841 0.329093 0.824926 -0.459559 0.197045 0.633247 0.748446 0.254314 0.796275 0.548881 0.294559 0.903091 0.312508 0.315540 0.947251 0.056121 0.316774 0.926554 -0.202860 0.299259 0.842814 -0.447335 0.265159 0.701672 -0.661322 0.217476 0.512390 -0.830759 0.159752 0.287451 -0.944379 0.095790 0.041866 -0.994521 0.029423 -0.207804 -0.977728 -0.035662 -0.444578 -0.895030 -0.096012 -0.652247 -0.751902 -0.148448 -0.816513 -0.557915 -0.190041 -0.926032 -0.326113 -0.218114 -0.973253 -0.072151 -0.230301 -0.955017 0.186829 -0.224759 -0.872711 0.433426 -0.200527 -0.731979 0.651149 -0.157946 -0.542125 0.825320 -0.099103 -0.315545 0.943721 -0.028005 -0.067288 0.997340 0.049587 0.185511 0.981390 0.126873 0.424779 0.896362 -0.231130 -0.706150 0.669277 -0.238985 -0.501174 0.831692 -0.226562 -0.261506 0.938235 -0.194751 -0.003441 0.980847 -0.146221 0.254988 0.955824 -0.085072 0.495399 0.864490 -0.016298 0.700672 0.713297 0.054800 0.856493 0.513242 0.123162 0.952437 0.278737 0.184333 0.982512 0.026291 0.234655 0.945268 -0.226727 0.271372 0.843676 -0.463215 0.292625 0.684837 -0.667359 0.297440 0.479543 -0.825571 0.285699 0.241617 -0.927361 0.258120 -0.012960 -0.966026 0.216233 -0.267083 -0.939100 0.162349 -0.503661 -0.848510 0.099508 -0.706757 -0.700423 0.031421 -0.862650 -0.504825 -0.037647 -0.960751 -0.274846 -0.103041 -0.994341 -0.025866 -0.159977 -0.961018 0.225504 -0.203937 -0.862840 0.462511 0.244706 -0.750147 -0.614327 0.158235 -0.894920 -0.417229 0.061914 -0.979534 -0.191522 -0.037750 -0.998147 0.047730 -0.133844 -0.949271 0.284554 -0.219545 -0.835893 0.503073 -0.288654 -0.665329 0.688489 -0.336111 -0.448836 0.827995 -0.358437 -0.201000 0.911659 -0.354039 0.061159 0.933229 -0.323364 0.319322 0.890769 -0.268820 0.555306 0.787001 -0.194530 0.752526 0.629176 -0.105928 0.897321 0.428479 -0.009268 0.979940 0.199078 0.088851 0.995116 -0.043012 0.181942 0.942268 -0.281118 0.263995 0.825389 -0.499039 0.329785 0.652688 -0.682085 0.375124 0.436017 -0.818029 0.397099 0.190061 -0.897880 0.394219 -0.068615 -0.916451 0.366530 -0.322648 -0.872671 0.315645 -0.555018 -0.769625 0.379367 0.609052 -0.696517 0.451215 0.384112 -0.805520 0.492957 0.133437 -0.859760 0.501805 -0.126066 -0.855745 0.477109 -0.376968 -0.793891 0.420404 -0.602440 -0.678474 0.335356 -0.787347 -0.517320 0.227554 -0.919242 -0.321268 0.104174 -0.989164 -0.103458 -0.026466 -0.992236 0.121523 -0.155449 -0.928010 0.338575 -0.273876 -0.800536 0.533042 -0.373480 -0.618159 0.691659 -0.447236 -0.393056 0.803422 -0.489903 -0.140514 0.860378 -0.498438 0.122077 0.858287 -0.472257 0.376450 0.797031 -0.413297 0.604811 0.680727 -0.325834 0.791246 0.517457 -0.216112 0.922907 0.318650 -0.091827 0.990923 0.098184 0.038470 0.990941 -0.128668 0.165963 0.923319 -0.346321 0.282154 0.792990 -0.539959 -0.407932 0.820490 0.400484 -0.276314 0.938524 0.206937 -0.127096 0.991889 -0.001448 0.029456 0.977193 -0.210299 0.182719 0.895736 -0.405304 0.322407 0.753328 -0.573194 0.439210 0.559842 -0.702618 0.525370 0.328515 -0.784898 0.575171 0.075042 -0.814584 0.585278 -0.183462 -0.789804 0.554977 -0.429594 -0.712355 0.486224 -0.646811 -0.587556 0.383545 -0.820503 -0.423872 0.253761 -0.938945 -0.232350 0.105559 -0.994077 -0.025863 -0.051063 -0.982025 0.181711 -0.205451 -0.903393 0.376391 -0.347017 -0.763253 0.545000 -0.465955 -0.570875 0.676009 -0.553947 -0.339184 0.760327 -0.604784 -0.083965 0.791950 -0.614848 0.177213 0.768478 -0.583425 0.426220 0.691340 -0.512770 0.645724 0.565781 -0.547771 -0.526643 0.650072 -0.641302 -0.289954 0.710393 -0.692295 -0.033314 0.720846 -0.697130 0.225617 0.680520 -0.655457 0.468901 0.592037 -0.570231 0.679659 0.461410 -0.447487 0.843311 0.297628 -0.295838 0.948649 0.112003 -0.125803 0.988605 -0.082664 0.050966 0.960666 -0.272989 0.222475 0.866973 -0.445940 0.377192 0.714110 -0.589723 0.504763 0.512615 -0.694580 0.596667 0.276252 -0.753441 0.646763 0.021077 -0.762400 0.651680 -0.235639 -0.720963 0.611057 -0.476571 -0.632052 0.527568 -0.685477 -0.501790 0.406768 -0.848281 -0.339057 0.256740 -0.953992 -0.154870 0.087571 -0.995420 0.038342 -0.089305 -0.969657 0.227572 -0.261860 -0.878275 0.400079 -0.418283 -0.727253 0.544189 0.419430 -0.868564 -0.263960 0.252488 -0.963550 -0.088437 0.066804 -0.993571 0.091397 -0.125046 -0.956540 0.263428 -0.310024 -0.854845 0.416084 -0.475489 -0.695210 0.539067 -0.610059 -0.488305 0.624008 -0.704394 -0.248084 0.665044 -0.751892 0.009089 0.659224 -0.749194 0.265552 0.606787 -0.696476 0.503589 0.511194 -0.597448 0.706732 0.378928 -0.459051 0.860982 0.219049 -0.290922 0.955801 0.042539 -0.104650 0.984821 -0.138478 0.087047 0.946223 -0.311585 0.271174 0.842798 -0.464926 0.435320 0.681721 -0.588008 0.568436 0.474044 -0.672430 0.661569 0.233949 -0.712457 0.708440 -0.022223 -0.705421 0.705875 -0.277076 -0.651897 0.654022 -0.513340 -0.555641 0.556350 -0.715041 -0.423309 0.623252 0.446185 -0.642242 0.716322 0.203699 -0.667376 0.759649 -0.052856 -0.648182 0.750279 -0.305999 -0.586043 0.688836 -0.538505 -0.485302 0.579490 -0.734598 -0.352927 0.429668 -0.881009 -0.198011 0.249541 -0.967864 -0.031115 0.051330 -0.989315 0.136456 -0.151514 -0.943905 0.293406 -0.345211 -0.834650 0.429172 -0.516562 -0.668845 0.534612 -0.653830 -0.457626 0.602565 -0.747553 -0.215265 0.628351 -0.791222 0.041740 0.610103 -0.781778 0.295782 0.548941 -0.719861 0.529386 0.448944 -0.609775 0.726468 0.316890 -0.459154 0.873499 0.161792 -0.278390 0.960451 -0.005737 -0.079868 0.981461 -0.174231 0.122889 0.935186 -0.332153 0.316130 0.824861 -0.468685 0.486768 0.658061 -0.574467 -0.459209 0.880363 0.118696 -0.269283 0.962196 -0.040819 -0.061761 0.978147 -0.198531 0.149238 0.927161 -0.343658 0.349377 0.812731 -0.466266 0.525059 0.642659 -0.557945 0.664327 0.428542 -0.612391 0.757682 0.184989 -0.625857 0.798737 -0.071363 -0.597434 0.784677 -0.323003 -0.529104 0.716459 -0.552757 -0.425613 0.598749 -0.744984 -0.294108 0.439592 -0.886640 -0.143624 0.249849 -0.968160 0.015562 0.042436 -0.984070 0.172644 -0.168546 -0.933327 0.317007 -0.368765 -0.819368 0.438918 -0.544606 -0.649874 0.530159 -0.684076 -0.436283 0.584548 -0.777624 -0.193059 0.598355 -0.818808 0.063257 0.570571 -0.804771 0.315161 0.503009 -0.736460 0.545402 0.400204 -0.618574 0.738199 0.269124 -0.704696 -0.423656 0.569139 -0.798974 -0.180492 0.573641 -0.839255 0.074890 0.538556 -0.822769 0.325094 0.466225 -0.750627 0.553045 0.361525 -0.627752 0.743176 0.231553 -0.462535 0.882503 0.085143 -0.266242 0.961523 -0.067738 -0.052243 0.974846 -0.216669 0.164906 0.921557 -0.351482 0.370431 0.805266 -0.462956 0.550341 0.633873 -0.543442 0.692357 0.419046 -0.587403 0.786763 0.175439 -0.591799 0.827079 -0.080301 -0.556320 0.810531 -0.330685 -0.483413 0.738246 -0.558592 -0.378111 0.615185 -0.748470 -0.247668 0.449784 -0.887403 -0.101045 0.253359 -0.965988 0.051736 0.039315 -0.978950 0.200279 -0.177773 -0.925471 0.334516 -0.383152 -0.809215 0.445382 -0.562866 -0.638079 0.525393 0.460835 -0.884901 -0.067679 0.259862 -0.962333 0.079921 0.041004 -0.974272 0.221613 -0.180819 -0.919977 0.347774 -0.390516 -0.803195 0.449861 -0.573843 -0.631891 0.520978 -0.718349 -0.417709 0.556322 -0.814215 -0.175191 0.553500 -0.854913 0.079183 0.512693 -0.837662 0.328116 0.436649 -0.763624 0.554653 0.330512 -0.637832 0.743356 0.201477 -0.468847 0.881353 0.058311 -0.268168 0.959229 -0.089250 -0.049453 0.971659 -0.231156 0.172422 0.917770 -0.357728 0.382351 0.801199 -0.460314 0.566027 0.629852 -0.531883 0.710906 0.415386 -0.567510 0.807066 0.172421 -0.564726 0.847902 -0.082444 -0.523703 0.830598 -0.331779 -0.447247 0.756330 -0.558523 -0.340613 0.630191 -0.747184 -0.211129 0.721746 0.415797 -0.553349 0.820326 0.173991 -0.544787 0.862797 -0.079795 -0.499214 0.846226 -0.328214 -0.419735 0.771730 -0.554274 -0.311790 0.644406 -0.742517 -0.182781 0.472980 -0.880093 -0.041547 0.269190 -0.957644 0.102246 0.046971 -0.969936 0.238783 -0.178512 -0.916196 0.358774 -0.391904 -0.800143 0.454074 -0.578696 -0.629714 0.518238 -0.726205 -0.416523 0.546933 -0.824417 -0.175065 0.538228 -0.866662 0.078249 0.492722 -0.850067 0.326198 0.413499 -0.775756 0.551914 0.305931 -0.648775 0.740033 0.177318 -0.477759 0.877737 0.036396 -0.274337 0.955634 -0.107254 -0.052346 0.968398 -0.243857 0.173113 0.915129 -0.364102 0.386689 0.799421 -0.459780 0.573826 0.629118 -0.524342 -0.488470 0.872407 0.017422 -0.283466 0.950991 -0.123548 -0.059205 0.964802 -0.256228 0.169052 0.912879 -0.371581 0.385767 0.798734 -0.461745 0.576177 0.630110 -0.520559 0.727296 0.418468 -0.543990 0.828797 0.178213 -0.530411 0.873722 -0.074276 -0.480720 0.858972 -0.321763 -0.398291 0.785527 -0.547332 -0.288747 0.658394 -0.735563 -0.159576 0.486263 -0.873592 -0.019619 0.280912 -0.952005 0.121551 0.056380 -0.965484 0.254288 -0.172000 -0.913156 0.369544 -0.388656 -0.798641 0.459478 -0.578842 -0.629782 0.517993 -0.729630 -0.418104 0.541137 -0.830784 -0.178021 0.527358 -0.875439 0.074135 0.477610 -0.860566 0.321216 0.395280 -0.787180 0.546417 0.285965 -0.660271 0.734414 0.157093 -0.729139 -0.420205 0.540170 -0.833619 -0.181754 0.521579 -0.881307 0.069040 0.467473 -0.868979 0.315109 0.381551 -0.797489 0.539712 0.269670 -0.671712 0.727570 0.139445 -0.500213 0.865902 -0.000264 -0.294668 0.945295 -0.139956 -0.069066 0.960344 -0.270130 0.161240 0.910018 -0.381929 0.380576 0.797731 -0.467746 0.574015 0.631112 -0.521733 0.728382 0.421480 -0.540199 0.833150 0.183089 -0.521862 0.881150 -0.067830 -0.467947 0.869076 -0.314177 -0.382099 0.797714 -0.539136 -0.270156 0.671904 -0.727334 -0.139751 0.500221 -0.865898 0.000209 0.294389 -0.945353 0.140155 0.068474 -0.960276 0.270519 -0.162085 -0.909673 0.382393 -0.381550 -0.797030 0.468149 -0.574956 -0.630069 0.521956 0.513548 -0.857834 0.019731 0.308016 -0.937859 0.159831 0.081494 -0.953815 0.289128 -0.150535 -0.904611 0.398772 -0.372213 -0.793624 0.481268 -0.568403 -0.628466 0.530988 -0.725729 -0.420444 0.544559 -0.833485 -0.183772 0.521085 -0.884362 0.065404 0.462197 -0.874925 0.310112 0.371936 -0.805847 0.533699 0.256468 -0.681851 0.720962 0.123665 -0.511394 0.859170 -0.017433 -0.306084 0.938931 -0.157227 -0.079902 0.954828 -0.286214 0.151762 0.905785 -0.395628 0.373147 0.795138 -0.478035 0.569194 0.630406 -0.527832 0.726566 0.422783 -0.541624 0.834546 0.186376 -0.518457 0.885762 -0.062742 -0.459879 0.876691 -0.307612 -0.369849 0.807906 -0.531539 -0.254468 0.684052 -0.719228 -0.121589 0.723859 0.420944 -0.546657 0.834752 0.186596 -0.518045 0.888963 -0.060410 -0.453977 0.882778 -0.303281 -0.358781 0.816576 -0.525482 -0.238898 0.694816 -0.711851 -0.102463 0.525751 -0.849638 0.041238 0.320882 -0.929390 0.182396 0.094184 -0.945615 0.311356 -0.138852 -0.897177 0.419277 -0.362292 -0.787387 0.498764 -0.560862 -0.623768 0.544378 -0.721006 -0.417528 0.553011 -0.831813 -0.182774 0.524100 -0.885758 0.064461 0.459650 -0.879198 0.307324 0.364091 -0.812616 0.529281 0.243961 -0.690569 0.715238 0.107462 -0.521389 0.852555 -0.036104 -0.316607 0.931903 -0.176965 -0.090174 0.947899 -0.305542 0.142490 0.899469 -0.413100 0.365549 0.789921 -0.492341 0.563832 0.626713 -0.537889 -0.529279 0.846421 -0.058606 -0.325264 0.923859 -0.201713 -0.098907 0.938548 -0.330674 0.134364 0.889503 -0.436728 0.358653 0.780078 -0.512685 0.558694 0.617738 -0.553409 0.720886 0.413537 -0.556156 0.834221 0.181361 -0.520753 0.891005 -0.063019 -0.449598 0.887376 -0.303001 -0.347496 0.823553 -0.522271 -0.221345 0.703831 -0.705884 -0.079684 0.536308 -0.841290 0.067866 0.332357 -0.919191 0.211250 0.105870 -0.934207 0.340659 -0.127690 -0.885266 0.447213 -0.352353 -0.775695 0.523588 -0.552752 -0.612995 0.564537 -0.715192 -0.408316 0.567255 -0.828594 -0.175673 0.531575 -0.885247 0.069038 0.459969 -0.881324 0.309124 0.357365 -0.817124 0.528243 0.230797 -0.697046 0.711493 0.088913 -0.709005 -0.389952 0.587579 -0.824123 -0.159618 0.543454 -0.882679 0.081811 0.462801 -0.880702 0.317873 0.351169 -0.818344 0.532504 0.216221 -0.699858 0.711115 0.067186 -0.533314 0.841559 -0.085760 -0.330056 0.914959 -0.232192 -0.103951 0.926309 -0.362141 0.129566 0.874834 -0.466775 0.354544 0.764051 -0.539003 0.555640 0.601532 -0.573954 0.719166 0.398370 -0.569299 0.834029 0.168405 -0.525391 0.892464 -0.072727 -0.445218 0.890530 -0.308646 -0.334206 0.828366 -0.523328 -0.199844 0.710170 -0.702165 -0.051206 0.543934 -0.832950 0.101636 0.340924 -0.906712 0.248284 0.114942 -0.918350 0.378710 -0.118608 -0.867016 0.483957 -0.343774 -0.756191 0.556771 -0.545161 -0.593454 0.592125 0.548044 -0.823895 0.144379 0.345787 -0.890752 0.294943 0.120462 -0.896441 0.426477 -0.112612 -0.840524 0.529941 -0.337554 -0.726792 0.598189 -0.539016 -0.563009 0.626484 -0.703241 -0.360378 0.612846 -0.819017 -0.132747 0.558203 -0.878443 0.104352 0.466313 -0.877459 0.334776 0.343497 -0.816108 0.542856 0.198181 -0.698533 0.714442 0.040312 -0.532707 0.837846 -0.119319 -0.329918 0.904630 -0.269813 -0.104020 0.910195 -0.400906 0.129515 0.854131 -0.503673 0.354675 0.740266 -0.571149 0.556046 0.576409 -0.598803 0.719899 0.373785 -0.584833 0.835127 0.146245 -0.530260 0.893983 -0.090712 -0.438823 0.892557 -0.320986 -0.316716 0.831005 -0.528950 -0.172172 0.713516 -0.700480 -0.014931 0.723341 0.336837 -0.602759 0.837568 0.112363 -0.534654 0.895423 -0.118877 -0.429052 0.893137 -0.341158 -0.293118 0.830990 -0.539404 -0.136013 0.713264 -0.700179 0.031694 0.547948 -0.812572 0.198693 0.346221 -0.868935 0.353670 0.121726 -0.865410 0.486055 -0.110334 -0.802212 0.586756 -0.334209 -0.683634 0.648805 -0.534674 -0.517756 0.667871 -0.698072 -0.315887 0.642581 -0.813248 -0.091775 0.574635 -0.872311 0.139330 0.468680 -0.871170 0.361731 0.331984 -0.809812 0.560318 0.173920 -0.692316 0.721575 0.005313 -0.526605 0.834474 -0.162296 -0.323954 0.891229 -0.317435 -0.098243 0.887867 -0.449489 0.134996 0.824550 -0.549448 0.359685 0.705602 -0.610535 0.560371 0.539212 -0.628677 -0.516135 0.827923 -0.219429 -0.313339 0.870601 -0.379307 -0.087889 0.854743 -0.511556 0.144612 0.781340 -0.607120 0.368051 0.655417 -0.659521 0.567006 0.485683 -0.665294 0.727858 0.283876 -0.624210 0.839741 0.063897 -0.539215 0.895237 -0.159192 -0.416183 0.890802 -0.370203 -0.263479 0.826928 -0.554829 -0.091403 0.708067 -0.700582 0.088467 0.542315 -0.797616 0.264013 0.340879 -0.839383 0.423364 0.117349 -0.823070 0.555685 -0.113198 -0.749803 0.651906 -0.335188 -0.624567 0.705383 -0.533593 -0.455873 0.712361 -0.694937 -0.255167 0.672274 -0.808207 -0.036059 0.587793 -0.865604 0.186608 0.464658 -0.863080 0.397745 0.311274 -0.800632 0.583017 0.138132 -0.682338 0.729777 -0.042909 -0.696502 -0.180262 0.694544 -0.807162 0.030905 0.589521 -0.862124 0.241232 0.445590 -0.857439 0.436496 0.272522 -0.793180 0.603425 0.082118 -0.673487 0.730575 -0.112584 -0.506369 0.809114 -0.298202 -0.303214 0.833475 -0.461932 -0.078043 0.801805 -0.592468 0.153502 0.716177 -0.680829 0.375314 0.582477 -0.721013 0.572043 0.409981 -0.710410 0.730206 0.210655 -0.649941 0.839139 -0.001744 -0.543915 0.891652 -0.212645 -0.399674 0.884445 -0.407676 -0.227060 0.818250 -0.573622 -0.037745 0.697720 -0.699284 0.155523 0.531097 -0.776225 0.339723 0.329653 -0.799308 0.502430 0.106954 -0.767042 0.632619 -0.122026 -0.681668 0.721415 -0.341885 -0.548993 0.762706 -0.537800 -0.378007 0.753579 0.518467 -0.742237 0.424590 0.316638 -0.744140 0.588214 0.094105 -0.694920 0.712902 -0.134208 -0.597976 0.790198 -0.352998 -0.459897 0.814793 -0.547553 -0.290009 0.784908 -0.704724 -0.099752 0.702434 -0.813781 0.098077 0.572836 -0.867149 0.290151 0.404803 -0.860934 0.463487 0.209696 -0.795258 0.606270 0.000791 -0.674311 0.708666 -0.207598 -0.506175 0.763482 -0.401101 -0.302319 0.766747 -0.566306 -0.076853 0.718050 -0.691735 0.154505 0.620650 -0.768715 0.375615 0.481267 -0.792020 0.571146 0.309592 -0.760227 0.727696 0.117547 -0.675752 0.834715 -0.081602 -0.544603 0.885179 -0.274191 -0.375869 0.875962 -0.447098 -0.181088 0.807975 -0.588618 0.026557 0.686023 -0.689237 0.233078</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="2880" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="9075">0 0 0 0 0.041667 0 0 0.083333 0 0 0.125000 0 0 0.166667 0 0 0.208333 0 0 0.250000 0 0 0.291667 0 0 0.333333 0 0 0.375000 0 0 0.416667 0 0 0.458333 0 0 0.500000 0 0 0.541667 0 0 0.583333 0 0 0.625000 0 0 0.666667 0 0 0.708333 0 0 0.750000 0 0 0.791667 0 0 0.833333 0 0 0.875000 0 0 0.916667 0 0 0.958333 0 0 1.000000 0 0.008333 0 0 0.008333 0.041667 0 0.008333 0.083333 0 0.008333 0.125000 0 0.008333 0.166667 0 0.008333 0.208333 0 0.008333 0.250000 0 0.008333 0.291667 0 0.008333 0.333333 0 0.008333 0.375000 0 0.008333 0.416667 0 0.008333 0.458333 0 0.008333 0.500000 0 0.008333 0.541667 0 0.008333 0.583333 0 0.008333 0.625000 0 0.008333 0.666667 0 0.008333 0.708333 0 0.008333 0.750000 0 0.008333 0.791667 0 0.008333 0.833333 0 0.008333 0.875000 0 0.008333 0.916667 0 0.008333 0.958333 0 0.008333 1.000000 0 0.016667 0 0 0.016667 0.041667 0 0.016667 0.083333 0 0.016667 0.125000 0 0.016667 0.166667 0 0.016667 0.208333 0 0.016667 0.250000 0 0.016667 0.291667 0 0.016667 0.333333 0 0.016667 0.375000 0 0.016667 0.416667 0 0.016667 0.458333 0 0.016667 0.500000 0 0.016667 0.541667 0 0.016667 0.583333 0 0.016667 0.625000 0 0.016667 0.666667 0 0.016667 0.708333 0 0.016667 0.750000 0 0.016667 0.791667 0 0.016667 0.833333 0 0.016667 0.875000 0 0.016667 0.916667 0 0.016667 0.958333 0 0.016667 1.000000 0 0.025000 0 0 0.025000 0.041667 0 0.025000 0.083333 0 0.025000 0.125000 0 0.025000 0.166667 0 0.025000 0.208333 0 0.025000 0.250000 0 0.025000 0.291667 0 0.025000 0.333333 0 0.025000 0.375000 0 0.025000 0.416667 0 0.025000 0.458333 0 0.025000 0.500000 0 0.025000 0.541667 0 0.025000 0.583333 0 0.025000 0.625000 0 0.025000 0.666667 0 0.025000 0.708333 0 0.025000 0.750000 0 0.025000 0.791667 0 0.025000 0.833333 0 0.025000 0.875000 0 0.025000 0.916667 0 0.025000 0.958333 0 0.025000 1.000000 0 0.033333 0 0 0.033333 0.041667 0 0.033333 0.083333 0 0.033333 0.125000 0 0.033333 0.166667 0 0.033333 0.208333 0 0.033333 0.250000 0 0.033333 0.291667 0 0.033333 0.333333 0 0.033333 0.375000 0 0.033333 0.416667 0 0.033333 0.458333 0 0.033333 0.500000 0 0.033333 0.541667 0 0.033333 0.583333 0 0.033333 0.625000 0 0.033333 0.666667 0 0.033333 0.708333 0 0.033333 0.750000 0 0.033333 0.791667 0 0.033333 0.833333 0 0.033333 0.875000 0 0.033333 0.916667 0 0.033333 0.958333 0 0.033333 1.000000 0 0.041667 0 0 0.041667 0.041667 0 0.041667 0.083333 0 0.041667 0.125000 0 0.041667 0.166667 0 0.041667 0.208333 0 0.041667 0.250000 0 0.041667 0.291667 0 0.041667 0.333333 0 0.041667 0.375000 0 0.041667 0.416667 0 0.041667 0.458333 0 0.041667 0.500000 0 0.041667 0.541667 0 0.041667 0.583333 0 0.041667 0.625000 0 0.041667 0.666667 0 0.041667 0.708333 0 0.041667 0.750000 0 0.041667 0.791667 0 0.041667 0.833333 0 0.041667 0.875000 0 0.041667 0.916667 0 0.041667 0.958333 0 0.041667 1.000000 0 0.050000 0 0 0.050000 0.041667 0 0.050000 0.083333 0 0.050000 0.125000 0 0.050000 0.166667 0 0.050000 0.208333 0 0.050000 0.250000 0 0.050000 0.291667 0 0.050000 0.333333 0 0.050000 0.375000 0 0.050000 0.416667 0 0.050000 0.458333 0 0.050000 0.500000 0 0.050000 0.541667 0 0.050000 0.583333 0 0.050000 0.625000 0 0.050000 0.666667 0 0.050000 0.708333 0 0.050000 0.750000 0 0.050000 0.791667 0 0.050000 0.833333 0 0.050000 0.875000 0 0.050000 0.916667 0 0.050000 0.958333 0 0.050000 1.000000 0 0.058333 0 0 0.058333 0.041667 0 0.058333 0.083333 0 0.058333 0.125000 0 0.058333 0.166667 0 0.058333 0.208333 0 0.058333 0.250000 0 0.058333 0.291667 0 0.058333 0.333333 0 0.058333 0.375000 0 0.058333 0.416667 0 0.058333 0.458333 0 0.058333 0.500000 0 0.058333 0.541667 0 0.058333 0.583333 0 0.058333 0.625000 0 0.058333 0.666667 0 0.058333 0.708333 0 0.058333 0.750000 0 0.058333 0.791667 0 0.058333 0.833333 0 0.058333 0.875000 0 0.058333 0.916667 0 0.058333 0.958333 0 0.058333 1.000000 0 0.066667 0 0 0.066667 0.041667 0 0.066667 0.083333 0 0.066667 0.125000 0 0.066667 0.166667 0 0.066667 0.208333 0 0.066667 0.250000 0 0.066667 0.291667 0 0.066667 0.333333 0 0.066667 0.375000 0 0.066667 0.416667 0 0.066667 0.458333 0 0.066667 0.500000 0 0.066667 0.541667 0 0.066667 0.583333 0 0.066667 0.625000 0 0.066667 0.666667 0 0.066667 0.708333 0 0.066667 0.750000 0 0.066667 0.791667 0 0.066667 0.833333 0 0.066667 0.875000 0 0.066667 0.916667 0 0.066667 0.958333 0 0.066667 1.000000 0 0.075000 0 0 0.075000 0.041667 0 0.075000 0.083333 0 0.075000 0.125000 0 0.075000 0.166667 0 0.075000 0.208333 0 0.075000 0.250000 0 0.075000 0.291667 0 0.075000 0.333333 0 0.075000 0.375000 0 0.075000 0.416667 0 0.075000 0.458333 0 0.075000 0.500000 0 0.075000 0.541667 0 0.075000 0.583333 0 0.075000 0.625000 0 0.075000 0.666667 0 0.075000 0.708333 0 0.075000 0.750000 0 0.075000 0.791667 0 0.075000 0.833333 0 0.075000 0.875000 0 0.075000 0.916667 0 0.075000 0.958333 0 0.075000 1.000000 0 0.083333 0 0 0.083333 0.041667 0 0.083333 0.083333 0 0.083333 0.125000 0 0.083333 0.166667 0 0.083333 0.208333 0 0.083333 0.250000 0 0.083333 0.291667 0 0.083333 0.333333 0 0.083333 0.375000 0 0.083333 0.416667 0 0.083333 0.458333 0 0.083333 0.500000 0 0.083333 0.541667 0 0.083333 0.583333 0 0.083333 0.625000 0 0.083333 0.666667 0 0.083333 0.708333 0 0.083333 0.750000 0 0.083333 0.791667 0 0.083333 0.833333 0 0.083333 0.875000 0 0.083333 0.916667 0 0.083333 0.958333 0 0.083333 1.000000 0 0.091667 0 0 0.091667 0.041667 0 0.091667 0.083333 0 0.091667 0.125000 0 0.091667 0.166667 0 0.091667 0.208333 0 0.091667 0.250000 0 0.091667 0.291667 0 0.091667 0.333333 0 0.091667 0.375000 0 0.091667 0.416667 0 0.091667 0.458333 0 0.091667 0.500000 0 0.091667 0.541667 0 0.091667 0.583333 0 0.091667 0.625000 0 0.091667 0.666667 0 0.091667 0.708333 0 0.091667 0.750000 0 0.091667 0.791667 0 0.091667 0.833333 0 0.091667 0.875000 0 0.091667 0.916667 0 0.091667 0.958333 0 0.091667 1.000000 0 0.100000 0 0 0.100000 0.041667 0 0.100000 0.083333 0 0.100000 0.125000 0 0.100000 0.166667 0 0.100000 0.208333 0 0.100000 0.250000 0 0.100000 0.291667 0 0.100000 0.333333 0 0.100000 0.375000 0 0.100000 0.416667 0 0.100000 0.458333 0 0.100000 0.500000 0 0.100000 0.541667 0 0.100000 0.583333 0 0.100000 0.625000 0 0.100000 0.666667 0 0.100000 0.708333 0 0.100000 0.750000 0 0.100000 0.791667 0 0.100000 0.833333 0 0.100000 0.875000 0 0.100000 0.916667 0 0.100000 0.958333 0 0.100000 1.000000 0 0.108333 0 0 0.108333 0.041667 0 0.108333 0.083333 0 0.108333 0.125000 0 0.108333 0.166667 0 0.108333 0.208333 0 0.108333 0.250000 0 0.108333 0.291667 0 0.108333 0.333333 0 0.108333 0.375000 0 0.108333 0.416667 0 0.108333 0.458333 0 0.108333 0.500000 0 0.108333 0.541667 0 0.108333 0.583333 0 0.108333 0.625000 0 0.108333 0.666667 0 0.108333 0.708333 0 0.108333 0.750000 0 0.108333 0.791667 0 0.108333 0.833333 0 0.108333 0.875000 0 0.108333 0.916667 0 0.108333 0.958333 0 0.108333 1.000000 0 0.116667 0 0 0.116667 0.041667 0 0.116667 0.083333 0 0.116667 0.125000 0 0.116667 0.166667 0 0.116667 0.208333 0 0.116667 0.250000 0 0.116667 0.291667 0 0.116667 0.333333 0 0.116667 0.375000 0 0.116667 0.416667 0 0.116667 0.458333 0 0.116667 0.500000 0 0.116667 0.541667 0 0.116667 0.583333 0 0.116667 0.625000 0 0.116667 0.666667 0 0.116667 0.708333 0 0.116667 0.750000 0 0.116667 0.791667 0 0.116667 0.833333 0 0.116667 0.875000 0 0.116667 0.916667 0 0.116667 0.958333 0 0.116667 1.000000 0 0.125000 0 0 0.125000 0.041667 0 0.125000 0.083333 0 0.125000 0.125000 0 0.125000 0.166667 0 0.125000 0.208333 0 0.125000 0.250000 0 0.125000 0.291667 0 0.125000 0.333333 0 0.125000 0.375000 0 0.125000 0.416667 0 0.125000 0.458333 0 0.125000 0.500000 0 0.125000 0.541667 0 0.125000 0.583333 0 0.125000 0.625000 0 0.125000 0.666667 0 0.125000 0.708333 0 0.125000 0.750000 0 0.125000 0.791667 0 0.125000 0.833333 0 0.125000 0.875000 0 0.125000 0.916667 0 0.125000 0.958333 0 0.125000 1.000000 0 0.133333 0 0 0.133333 0.041667 0 0.133333 0.083333 0 0.133333 0.125000 0 0.133333 0.166667 0 0.133333 0.208333 0 0.133333 0.250000 0 0.133333 0.291667 0 0.133333 0.333333 0 0.133333 0.375000 0 0.133333 0.416667 0 0.133333 0.458333 0 0.133333 0.500000 0 0.133333 0.541667 0 0.133333 0.583333 0 0.133333 0.625000 0 0.133333 0.666667 0 0.133333 0.708333 0 0.133333 0.750000 0 0.133333 0.791667 0 0.133333 0.833333 0 0.133333 0.875000 0 0.133333 0.916667 0 0.133333 0.958333 0 0.133333 1.000000 0 0.141667 0 0 0.141667 0.041667 0 0.141667 0.083333 0 0.141667 0.125000 0 0.141667 0.166667 0 0.141667 0.208333 0 0.141667 0.250000 0 0.141667 0.291667 0 0.141667 0.333333 0 0.141667 0.375000 0 0.141667 0.416667 0 0.141667 0.458333 0 0.141667 0.500000 0 0.141667 0.541667 0 0.141667 0.583333 0 0.141667 0.625000 0 0.141667 0.666667 0 0.141667 0.708333 0 0.141667 0.750000 0 0.141667 0.791667 0 0.141667 0.833333 0 0.141667 0.875000 0 0.141667 0.916667 0 0.141667 0.958333 0 0.141667 1.000000 0 0.150000 0 0 0.150000 0.041667 0 0.150000 0.083333 0 0.150000 0.125000 0 0.150000 0.166667 0 0.150000 0.208333 0 0.150000 0.250000 0 0.150000 0.291667 0 0.150000 0.333333 0 0.150000 0.375000 0 0.150000 0.416667 0 0.150000 0.458333 0 0.150000 0.500000 0 0.150000 0.541667 0 0.150000 0.583333 0 0.150000 0.625000 0 0.150000 0.666667 0 0.150000 0.708333 0 0.150000 0.750000 0 0.150000 0.791667 0 0.150000 0.833333 0 0.150000 0.875000 0 0.150000 0.916667 0 0.150000 0.958333 0 0.150000 1.000000 0 0.158333 0 0 0.158333 0.041667 0 0.158333 0.083333 0 0.158333 0.125000 0 0.158333 0.166667 0 0.158333 0.208333 0 0.158333 0.250000 0 0.158333 0.291667 0 0.158333 0.333333 0 0.158333 0.375000 0 0.158333 0.416667 0 0.158333 0.458333 0 0.158333 0.500000 0 0.158333 0.541667 0 0.158333 0.583333 0 0.158333 0.625000 0 0.158333 0.666667 0 0.158333 0.708333 0 0.158333 0.750000 0 0.158333 0.791667 0 0.158333 0.833333 0 0.158333 0.875000 0 0.158333 0.916667 0 0.158333 0.958333 0 0.158333 1.000000 0 0.166667 0 0 0.166667 0.041667 0 0.166667 0.083333 0 0.166667 0.125000 0 0.166667 0.166667 0 0.166667 0.208333 0 0.166667 0.250000 0 0.166667 0.291667 0 0.166667 0.333333 0 0.166667 0.375000 0 0.166667 0.416667 0 0.166667 0.458333 0 0.166667 0.500000 0 0.166667 0.541667 0 0.166667 0.583333 0 0.166667 0.625000 0 0.166667 0.666667 0 0.166667 0.708333 0 0.166667 0.750000 0 0.166667 0.791667 0 0.166667 0.833333 0 0.166667 0.875000 0 0.166667 0.916667 0 0.166667 0.958333 0 0.166667 1.000000 0 0.175000 0 0 0.175000 0.041667 0 0.175000 0.083333 0 0.175000 0.125000 0 0.175000 0.166667 0 0.175000 0.208333 0 0.175000 0.250000 0 0.175000 0.291667 0 0.175000 0.333333 0 0.175000 0.375000 0 0.175000 0.416667 0 0.175000 0.458333 0 0.175000 0.500000 0 0.175000 0.541667 0 0.175000 0.583333 0 0.175000 0.625000 0 0.175000 0.666667 0 0.175000 0.708333 0 0.175000 0.750000 0 0.175000 0.791667 0 0.175000 0.833333 0 0.175000 0.875000 0 0.175000 0.916667 0 0.175000 0.958333 0 0.175000 1.000000 0 0.183333 0 0 0.183333 0.041667 0 0.183333 0.083333 0 0.183333 0.125000 0 0.183333 0.166667 0 0.183333 0.208333 0 0.183333 0.250000 0 0.183333 0.291667 0 0.183333 0.333333 0 0.183333 0.375000 0 0.183333 0.416667 0 0.183333 0.458333 0 0.183333 0.500000 0 0.183333 0.541667 0 0.183333 0.583333 0 0.183333 0.625000 0 0.183333 0.666667 0 0.183333 0.708333 0 0.183333 0.750000 0 0.183333 0.791667 0 0.183333 0.833333 0 0.183333 0.875000 0 0.183333 0.916667 0 0.183333 0.958333 0 0.183333 1.000000 0 0.191667 0 0 0.191667 0.041667 0 0.191667 0.083333 0 0.191667 0.125000 0 0.191667 0.166667 0 0.191667 0.208333 0 0.191667 0.250000 0 0.191667 0.291667 0 0.191667 0.333333 0 0.191667 0.375000 0 0.191667 0.416667 0 0.191667 0.458333 0 0.191667 0.500000 0 0.191667 0.541667 0 0.191667 0.583333 0 0.191667 0.625000 0 0.191667 0.666667 0 0.191667 0.708333 0 0.191667 0.750000 0 0.191667 0.791667 0 0.191667 0.833333 0 0.191667 0.875000 0 0.191667 0.916667 0 0.191667 0.958333 0 0.191667 1.000000 0 0.200000 0 0 0.200000 0.041667 0 0.200000 0.083333 0 0.200000 0.125000 0 0.200000 0.166667 0 0.200000 0.208333 0 0.200000 0.250000 0 0.200000 0.291667 0 0.200000 0.333333 0 0.200000 0.375000 0 0.200000 0.416667 0 0.200000 0.458333 0 0.200000 0.500000 0 0.200000 0.541667 0 0.200000 0.583333 0 0.200000 0.625000 0 0.200000 0.666667 0 0.200000 0.708333 0 0.200000 0.750000 0 0.200000 0.791667 0 0.200000 0.833333 0 0.200000 0.875000 0 0.200000 0.916667 0 0.200000 0.958333 0 0.200000 1.000000 0 0.208333 0 0 0.208333 0.041667 0 0.208333 0.083333 0 0.208333 0.125000 0 0.208333 0.166667 0 0.208333 0.208333 0 0.208333 0.250000 0 0.208333 0.291667 0 0.208333 0.333333 0 0.208333 0.375000 0 0.208333 0.416667 0 0.208333 0.458333 0 0.208333 0.500000 0 0.208333 0.541667 0 0.208333 0.583333 0 0.208333 0.625000 0 0.208333 0.666667 0 0.208333 0.708333 0 0.208333 0.750000 0 0.208333 0.791667 0 0.208333 0.833333 0 0.208333 0.875000 0 0.208333 0.916667 0 0.208333 0.958333 0 0.208333 1.000000 0 0.216667 0 0 0.216667 0.041667 0 0.216667 0.083333 0 0.216667 0.125000 0 0.216667 0.166667 0 0.216667 0.208333 0 0.216667 0.250000 0 0.216667 0.291667 0 0.216667 0.333333 0 0.216667 0.375000 0 0.216667 0.416667 0 0.216667 0.458333 0 0.216667 0.500000 0 0.216667 0.541667 0 0.216667 0.583333 0 0.216667 0.625000 0 0.216667 0.666667 0 0.216667 0.708333 0 0.216667 0.750000 0 0.216667 0.791667 0 0.216667 0.833333 0 0.216667 0.875000 0 0.216667 0.916667 0 0.216667 0.958333 0 0.216667 1.000000 0 0.225000 0 0 0.225000 0.041667 0 0.225000 0.083333 0 0.225000 0.125000 0 0.225000 0.166667 0 0.225000 0.208333 0 0.225000 0.250000 0 0.225000 0.291667 0 0.225000 0.333333 0 0.225000 0.375000 0 0.225000 0.416667 0 0.225000 0.458333 0 0.225000 0.500000 0 0.225000 0.541667 0 0.225000 0.583333 0 0.225000 0.625000 0 0.225000 0.666667 0 0.225000 0.708333 0 0.225000 0.750000 0 0.225000 0.791667 0 0.225000 0.833333 0 0.225000 0.875000 0 0.225000 0.916667 0 0.225000 0.958333 0 0.225000 1.000000 0 0.233333 0 0 0.233333 0.041667 0 0.233333 0.083333 0 0.233333 0.125000 0 0.233333 0.166667 0 0.233333 0.208333 0 0.233333 0.250000 0 0.233333 0.291667 0 0.233333 0.333333 0 0.233333 0.375000 0 0.233333 0.416667 0 0.233333 0.458333 0 0.233333 0.500000 0 0.233333 0.541667 0 0.233333 0.583333 0 0.233333 0.625000 0 0.233333 0.666667 0 0.233333 0.708333 0 0.233333 0.750000 0 0.233333 0.791667 0 0.233333 0.833333 0 0.233333 0.875000 0 0.233333 0.916667 0 0.233333 0.958333 0 0.233333 1.000000 0 0.241667 0 0 0.241667 0.041667 0 0.241667 0.083333 0 0.241667 0.125000 0 0.241667 0.166667 0 0.241667 0.208333 0 0.241667 0.250000 0 0.241667 0.291667 0 0.241667 0.333333 0 0.241667 0.375000 0 0.241667 0.416667 0 0.241667 0.458333 0 0.241667 0.500000 0 0.241667 0.541667 0 0.241667 0.583333 0 0.241667 0.625000 0 0.241667 0.666667 0 0.241667 0.708333 0 0.241667 0.750000 0 0.241667 0.791667 0 0.241667 0.833333 0 0.241667 0.875000 0 0.241667 0.916667 0 0.241667 0.958333 0 0.241667 1.000000 0 0.250000 0 0 0.250000 0.041667 0 0.250000 0.083333 0 0.250000 0.125000 0 0.250000 0.166667 0 0.250000 0.208333 0 0.250000 0.250000 0 0.250000 0.291667 0 0.250000 0.333333 0 0.250000 0.375000 0 0.250000 0.416667 0 0.250000 0.458333 0 0.250000 0.500000 0 0.250000 0.541667 0 0.250000 0.583333 0 0.250000 0.625000 0 0.250000 0.666667 0 0.250000 0.708333 0 0.250000 0.750000 0 0.250000 0.791667 0 0.250000 0.833333 0 0.250000 0.875000 0 0.250000 0.916667 0 0.250000 0.958333 0 0.250000 1.000000 0 0.258333 0 0 0.258333 0.041667 0 0.258333 0.083333 0 0.258333 0.125000 0 0.258333 0.166667 0 0.258333 0.208333 0 0.258333 0.250000 0 0.258333 0.291667 0 0.258333 0.333333 0 0.258333 0.375000 0 0.258333 0.416667 0 0.258333 0.458333 0 0.258333 0.500000 0 0.258333 0.541667 0 0.258333 0.583333 0 0.258333 0.625000 0 0.258333 0.666667 0 0.258333 0.708333 0 0.258333 0.750000 0 0.258333 0.791667 0 0.258333 0.833333 0 0.258333 0.875000 0 0.258333 0.916667 0 0.258333 0.958333 0 0.258333 1.000000 0 0.266667 0 0 0.266667 0.041667 0 0.266667 0.083333 0 0.266667 0.125000 0 0.266667 0.166667 0 0.266667 0.208333 0 0.266667 0.250000 0 0.266667 0.291667 0 0.266667 0.333333 0 0.266667 0.375000 0 0.266667 0.416667 0 0.266667 0.458333 0 0.266667 0.500000 0 0.266667 0.541667 0 0.266667 0.583333 0 0.266667 0.625000 0 0.266667 0.666667 0 0.266667 0.708333 0 0.266667 0.750000 0 0.266667 0.791667 0 0.266667 0.833333 0 0.266667 0.875000 0 0.266667 0.916667 0 0.266667 0.958333 0 0.266667 1.000000 0 0.275000 0 0 0.275000 0.041667 0 0.275000 0.083333 0 0.275000 0.125000 0 0.275000 0.166667 0 0.275000 0.208333 0 0.275000 0.250000 0 0.275000 0.291667 0 0.275000 0.333333 0 0.275000 0.375000 0 0.275000 0.416667 0 0.275000 0.458333 0 0.275000 0.500000 0 0.275000 0.541667 0 0.275000 0.583333 0 0.275000 0.625000 0 0.275000 0.666667 0 0.275000 0.708333 0 0.275000 0.750000 0 0.275000 0.791667 0 0.275000 0.833333 0 0.275000 0.875000 0 0.275000 0.916667 0 0.275000 0.958333 0 0.275000 1.000000 0 0.283333 0 0 0.283333 0.041667 0 0.283333 0.083333 0 0.283333 0.125000 0 0.283333 0.166667 0 0.283333 0.208333 0 0.283333 0.250000 0 0.283333 0.291667 0 0.283333 0.333333 0 0.283333 0.375000 0 0.283333 0.416667 0 0.283333 0.458333 0 0.283333 0.500000 0 0.283333 0.541667 0 0.283333 0.583333 0 0.283333 0.625000 0 0.283333 0.666667 0 0.283333 0.708333 0 0.283333 0.750000 0 0.283333 0.791667 0 0.283333 0.833333 0 0.283333 0.875000 0 0.283333 0.916667 0 0.283333 0.958333 0 0.283333 1.000000 0 0.291667 0 0 0.291667 0.041667 0 0.291667 0.083333 0 0.291667 0.125000 0 0.291667 0.166667 0 0.291667 0.208333 0 0.291667 0.250000 0 0.291667 0.291667 0 0.291667 0.333333 0 0.291667 0.375000 0 0.291667 0.416667 0 0.291667 0.458333 0 0.291667 0.500000 0 0.291667 0.541667 0 0.291667 0.583333 0 0.291667 0.625000 0 0.291667 0.666667 0 0.291667 0.708333 0 0.291667 0.750000 0 0.291667 0.791667 0 0.291667 0.833333 0 0.291667 0.875000 0 0.291667 0.916667 0 0.291667 0.958333 0 0.291667 1.000000 0 0.300000 0 0 0.300000 0.041667 0 0.300000 0.083333 0 0.300000 0.125000 0 0.300000 0.166667 0 0.300000 0.208333 0 0.300000 0.250000 0 0.300000 0.291667 0 0.300000 0.333333 0 0.300000 0.375000 0 0.300000 0.416667 0 0.300000 0.458333 0 0.300000 0.500000 0 0.300000 0.541667 0 0.300000 0.583333 0 0.300000 0.625000 0 0.300000 0.666667 0 0.300000 0.708333 0 0.300000 0.750000 0 0.300000 0.791667 0 0.300000 0.833333 0 0.300000 0.875000 0 0.300000 0.916667 0 0.300000 0.958333 0 0.300000 1.000000 0 0.308333 0 0 0.308333 0.041667 0 0.308333 0.083333 0 0.308333 0.125000 0 0.308333 0.166667 0 0.308333 0.208333 0 0.308333 0.250000 0 0.308333 0.291667 0 0.308333 0.333333 0 0.308333 0.375000 0 0.308333 0.416667 0 0.308333 0.458333 0 0.308333 0.500000 0 0.308333 0.541667 0 0.308333 0.583333 0 0.308333 0.625000 0 0.308333 0.666667 0 0.308333 0.708333 0 0.308333 0.750000 0 0.308333 0.791667 0 0.308333 0.833333 0 0.308333 0.875000 0 0.308333 0.916667 0 0.308333 0.958333 0 0.308333 1.000000 0 0.316666 0 0 0.316666 0.041667 0 0.316666 0.083333 0 0.316666 0.125000 0 0.316666 0.166667 0 0.316666 0.208333 0 0.316666 0.250000 0 0.316666 0.291667 0 0.316666 0.333333 0 0.316666 0.375000 0 0.316666 0.416667 0 0.316666 0.458333 0 0.316666 0.500000 0 0.316666 0.541667 0 0.316666 0.583333 0 0.316666 0.625000 0 0.316666 0.666667 0 0.316666 0.708333 0 0.316666 0.750000 0 0.316666 0.791667 0 0.316666 0.833333 0 0.316666 0.875000 0 0.316666 0.916667 0 0.316666 0.958333 0 0.316666 1.000000 0 0.325000 0 0 0.325000 0.041667 0 0.325000 0.083333 0 0.325000 0.125000 0 0.325000 0.166667 0 0.325000 0.208333 0 0.325000 0.250000 0 0.325000 0.291667 0 0.325000 0.333333 0 0.325000 0.375000 0 0.325000 0.416667 0 0.325000 0.458333 0 0.325000 0.500000 0 0.325000 0.541667 0 0.325000 0.583333 0 0.325000 0.625000 0 0.325000 0.666667 0 0.325000 0.708333 0 0.325000 0.750000 0 0.325000 0.791667 0 0.325000 0.833333 0 0.325000 0.875000 0 0.325000 0.916667 0 0.325000 0.958333 0 0.325000 1.000000 0 0.333333 0 0 0.333333 0.041667 0 0.333333 0.083333 0 0.333333 0.125000 0 0.333333 0.166667 0 0.333333 0.208333 0 0.333333 0.250000 0 0.333333 0.291667 0 0.333333 0.333333 0 0.333333 0.375000 0 0.333333 0.416667 0 0.333333 0.458333 0 0.333333 0.500000 0 0.333333 0.541667 0 0.333333 0.583333 0 0.333333 0.625000 0 0.333333 0.666667 0 0.333333 0.708333 0 0.333333 0.750000 0 0.333333 0.791667 0 0.333333 0.833333 0 0.333333 0.875000 0 0.333333 0.916667 0 0.333333 0.958333 0 0.333333 1.000000 0 0.341666 0 0 0.341666 0.041667 0 0.341666 0.083333 0 0.341666 0.125000 0 0.341666 0.166667 0 0.341666 0.208333 0 0.341666 0.250000 0 0.341666 0.291667 0 0.341666 0.333333 0 0.341666 0.375000 0 0.341666 0.416667 0 0.341666 0.458333 0 0.341666 0.500000 0 0.341666 0.541667 0 0.341666 0.583333 0 0.341666 0.625000 0 0.341666 0.666667 0 0.341666 0.708333 0 0.341666 0.750000 0 0.341666 0.791667 0 0.341666 0.833333 0 0.341666 0.875000 0 0.341666 0.916667 0 0.341666 0.958333 0 0.341666 1.000000 0 0.350000 0 0 0.350000 0.041667 0 0.350000 0.083333 0 0.350000 0.125000 0 0.350000 0.166667 0 0.350000 0.208333 0 0.350000 0.250000 0 0.350000 0.291667 0 0.350000 0.333333 0 0.350000 0.375000 0 0.350000 0.416667 0 0.350000 0.458333 0 0.350000 0.500000 0 0.350000 0.541667 0 0.350000 0.583333 0 0.350000 0.625000 0 0.350000 0.666667 0 0.350000 0.708333 0 0.350000 0.750000 0 0.350000 0.791667 0 0.350000 0.833333 0 0.350000 0.875000 0 0.350000 0.916667 0 0.350000 0.958333 0 0.350000 1.000000 0 0.358333 0 0 0.358333 0.041667 0 0.358333 0.083333 0 0.358333 0.125000 0 0.358333 0.166667 0 0.358333 0.208333 0 0.358333 0.250000 0 0.358333 0.291667 0 0.358333 0.333333 0 0.358333 0.375000 0 0.358333 0.416667 0 0.358333 0.458333 0 0.358333 0.500000 0 0.358333 0.541667 0 0.358333 0.583333 0 0.358333 0.625000 0 0.358333 0.666667 0 0.358333 0.708333 0 0.358333 0.750000 0 0.358333 0.791667 0 0.358333 0.833333 0 0.358333 0.875000 0 0.358333 0.916667 0 0.358333 0.958333 0 0.358333 1.000000 0 0.366666 0 0 0.366666 0.041667 0 0.366666 0.083333 0 0.366666 0.125000 0 0.366666 0.166667 0 0.366666 0.208333 0 0.366666 0.250000 0 0.366666 0.291667 0 0.366666 0.333333 0 0.366666 0.375000 0 0.366666 0.416667 0 0.366666 0.458333 0 0.366666 0.500000 0 0.366666 0.541667 0 0.366666 0.583333 0 0.366666 0.625000 0 0.366666 0.666667 0 0.366666 0.708333 0 0.366666 0.750000 0 0.366666 0.791667 0 0.366666 0.833333 0 0.366666 0.875000 0 0.366666 0.916667 0 0.366666 0.958333 0 0.366666 1.000000 0 0.375000 0 0 0.375000 0.041667 0 0.375000 0.083333 0 0.375000 0.125000 0 0.375000 0.166667 0 0.375000 0.208333 0 0.375000 0.250000 0 0.375000 0.291667 0 0.375000 0.333333 0 0.375000 0.375000 0 0.375000 0.416667 0 0.375000 0.458333 0 0.375000 0.500000 0 0.375000 0.541667 0 0.375000 0.583333 0 0.375000 0.625000 0 0.375000 0.666667 0 0.375000 0.708333 0 0.375000 0.750000 0 0.375000 0.791667 0 0.375000 0.833333 0 0.375000 0.875000 0 0.375000 0.916667 0 0.375000 0.958333 0 0.375000 1.000000 0 0.383333 0 0 0.383333 0.041667 0 0.383333 0.083333 0 0.383333 0.125000 0 0.383333 0.166667 0 0.383333 0.208333 0 0.383333 0.250000 0 0.383333 0.291667 0 0.383333 0.333333 0 0.383333 0.375000 0 0.383333 0.416667 0 0.383333 0.458333 0 0.383333 0.500000 0 0.383333 0.541667 0 0.383333 0.583333 0 0.383333 0.625000 0 0.383333 0.666667 0 0.383333 0.708333 0 0.383333 0.750000 0 0.383333 0.791667 0 0.383333 0.833333 0 0.383333 0.875000 0 0.383333 0.916667 0 0.383333 0.958333 0 0.383333 1.000000 0 0.391666 0 0 0.391666 0.041667 0 0.391666 0.083333 0 0.391666 0.125000 0 0.391666 0.166667 0 0.391666 0.208333 0 0.391666 0.250000 0 0.391666 0.291667 0 0.391666 0.333333 0 0.391666 0.375000 0 0.391666 0.416667 0 0.391666 0.458333 0 0.391666 0.500000 0 0.391666 0.541667 0 0.391666 0.583333 0 0.391666 0.625000 0 0.391666 0.666667 0 0.391666 0.708333 0 0.391666 0.750000 0 0.391666 0.791667 0 0.391666 0.833333 0 0.391666 0.875000 0 0.391666 0.916667 0 0.391666 0.958333 0 0.391666 1.000000 0 0.400000 0 0 0.400000 0.041667 0 0.400000 0.083333 0 0.400000 0.125000 0 0.400000 0.166667 0 0.400000 0.208333 0 0.400000 0.250000 0 0.400000 0.291667 0 0.400000 0.333333 0 0.400000 0.375000 0 0.400000 0.416667 0 0.400000 0.458333 0 0.400000 0.500000 0 0.400000 0.541667 0 0.400000 0.583333 0 0.400000 0.625000 0 0.400000 0.666667 0 0.400000 0.708333 0 0.400000 0.750000 0 0.400000 0.791667 0 0.400000 0.833333 0 0.400000 0.875000 0 0.400000 0.916667 0 0.400000 0.958333 0 0.400000 1.000000 0 0.408333 0 0 0.408333 0.041667 0 0.408333 0.083333 0 0.408333 0.125000 0 0.408333 0.166667 0 0.408333 0.208333 0 0.408333 0.250000 0 0.408333 0.291667 0 0.408333 0.333333 0 0.408333 0.375000 0 0.408333 0.416667 0 0.408333 0.458333 0 0.408333 0.500000 0 0.408333 0.541667 0 0.408333 0.583333 0 0.408333 0.625000 0 0.408333 0.666667 0 0.408333 0.708333 0 0.408333 0.750000 0 0.408333 0.791667 0 0.408333 0.833333 0 0.408333 0.875000 0 0.408333 0.916667 0 0.408333 0.958333 0 0.408333 1.000000 0 0.416666 0 0 0.416666 0.041667 0 0.416666 0.083333 0 0.416666 0.125000 0 0.416666 0.166667 0 0.416666 0.208333 0 0.416666 0.250000 0 0.416666 0.291667 0 0.416666 0.333333 0 0.416666 0.375000 0 0.416666 0.416667 0 0.416666 0.458333 0 0.416666 0.500000 0 0.416666 0.541667 0 0.416666 0.583333 0 0.416666 0.625000 0 0.416666 0.666667 0 0.416666 0.708333 0 0.416666 0.750000 0 0.416666 0.791667 0 0.416666 0.833333 0 0.416666 0.875000 0 0.416666 0.916667 0 0.416666 0.958333 0 0.416666 1.000000 0 0.425000 0 0 0.425000 0.041667 0 0.425000 0.083333 0 0.425000 0.125000 0 0.425000 0.166667 0 0.425000 0.208333 0 0.425000 0.250000 0 0.425000 0.291667 0 0.425000 0.333333 0 0.425000 0.375000 0 0.425000 0.416667 0 0.425000 0.458333 0 0.425000 0.500000 0 0.425000 0.541667 0 0.425000 0.583333 0 0.425000 0.625000 0 0.425000 0.666667 0 0.425000 0.708333 0 0.425000 0.750000 0 0.425000 0.791667 0 0.425000 0.833333 0 0.425000 0.875000 0 0.425000 0.916667 0 0.425000 0.958333 0 0.425000 1.000000 0 0.433333 0 0 0.433333 0.041667 0 0.433333 0.083333 0 0.433333 0.125000 0 0.433333 0.166667 0 0.433333 0.208333 0 0.433333 0.250000 0 0.433333 0.291667 0 0.433333 0.333333 0 0.433333 0.375000 0 0.433333 0.416667 0 0.433333 0.458333 0 0.433333 0.500000 0 0.433333 0.541667 0 0.433333 0.583333 0 0.433333 0.625000 0 0.433333 0.666667 0 0.433333 0.708333 0 0.433333 0.750000 0 0.433333 0.791667 0 0.433333 0.833333 0 0.433333 0.875000 0 0.433333 0.916667 0 0.433333 0.958333 0 0.433333 1.000000 0 0.441666 0 0 0.441666 0.041667 0 0.441666 0.083333 0 0.441666 0.125000 0 0.441666 0.166667 0 0.441666 0.208333 0 0.441666 0.250000 0 0.441666 0.291667 0 0.441666 0.333333 0 0.441666 0.375000 0 0.441666 0.416667 0 0.441666 0.458333 0 0.441666 0.500000 0 0.441666 0.541667 0 0.441666 0.583333 0 0.441666 0.625000 0 0.441666 0.666667 0 0.441666 0.708333 0 0.441666 0.750000 0 0.441666 0.791667 0 0.441666 0.833333 0 0.441666 0.875000 0 0.441666 0.916667 0 0.441666 0.958333 0 0.441666 1.000000 0 0.450000 0 0 0.450000 0.041667 0 0.450000 0.083333 0 0.450000 0.125000 0 0.450000 0.166667 0 0.450000 0.208333 0 0.450000 0.250000 0 0.450000 0.291667 0 0.450000 0.333333 0 0.450000 0.375000 0 0.450000 0.416667 0 0.450000 0.458333 0 0.450000 0.500000 0 0.450000 0.541667 0 0.450000 0.583333 0 0.450000 0.625000 0 0.450000 0.666667 0 0.450000 0.708333 0 0.450000 0.750000 0 0.450000 0.791667 0 0.450000 0.833333 0 0.450000 0.875000 0 0.450000 0.916667 0 0.450000 0.958333 0 0.450000 1.000000 0 0.458333 0 0 0.458333 0.041667 0 0.458333 0.083333 0 0.458333 0.125000 0 0.458333 0.166667 0 0.458333 0.208333 0 0.458333 0.250000 0 0.458333 0.291667 0 0.458333 0.333333 0 0.458333 0.375000 0 0.458333 0.416667 0 0.458333 0.458333 0 0.458333 0.500000 0 0.458333 0.541667 0 0.458333 0.583333 0 0.458333 0.625000 0 0.458333 0.666667 0 0.458333 0.708333 0 0.458333 0.750000 0 0.458333 0.791667 0 0.458333 0.833333 0 0.458333 0.875000 0 0.458333 0.916667 0 0.458333 0.958333 0 0.458333 1.000000 0 0.466666 0 0 0.466666 0.041667 0 0.466666 0.083333 0 0.466666 0.125000 0 0.466666 0.166667 0 0.466666 0.208333 0 0.466666 0.250000 0 0.466666 0.291667 0 0.466666 0.333333 0 0.466666 0.375000 0 0.466666 0.416667 0 0.466666 0.458333 0 0.466666 0.500000 0 0.466666 0.541667 0 0.466666 0.583333 0 0.466666 0.625000 0 0.466666 0.666667 0 0.466666 0.708333 0 0.466666 0.750000 0 0.466666 0.791667 0 0.466666 0.833333 0 0.466666 0.875000 0 0.466666 0.916667 0 0.466666 0.958333 0 0.466666 1.000000 0 0.475000 0 0 0.475000 0.041667 0 0.475000 0.083333 0 0.475000 0.125000 0 0.475000 0.166667 0 0.475000 0.208333 0 0.475000 0.250000 0 0.475000 0.291667 0 0.475000 0.333333 0 0.475000 0.375000 0 0.475000 0.416667 0 0.475000 0.458333 0 0.475000 0.500000 0 0.475000 0.541667 0 0.475000 0.583333 0 0.475000 0.625000 0 0.475000 0.666667 0 0.475000 0.708333 0 0.475000 0.750000 0 0.475000 0.791667 0 0.475000 0.833333 0 0.475000 0.875000 0 0.475000 0.916667 0 0.475000 0.958333 0 0.475000 1.000000 0 0.483333 0 0 0.483333 0.041667 0 0.483333 0.083333 0 0.483333 0.125000 0 0.483333 0.166667 0 0.483333 0.208333 0 0.483333 0.250000 0 0.483333 0.291667 0 0.483333 0.333333 0 0.483333 0.375000 0 0.483333 0.416667 0 0.483333 0.458333 0 0.483333 0.500000 0 0.483333 0.541667 0 0.483333 0.583333 0 0.483333 0.625000 0 0.483333 0.666667 0 0.483333 0.708333 0 0.483333 0.750000 0 0.483333 0.791667 0 0.483333 0.833333 0 0.483333 0.875000 0 0.483333 0.916667 0 0.483333 0.958333 0 0.483333 1.000000 0 0.491666 0 0 0.491666 0.041667 0 0.491666 0.083333 0 0.491666 0.125000 0 0.491666 0.166667 0 0.491666 0.208333 0 0.491666 0.250000 0 0.491666 0.291667 0 0.491666 0.333333 0 0.491666 0.375000 0 0.491666 0.416667 0 0.491666 0.458333 0 0.491666 0.500000 0 0.491666 0.541667 0 0.491666 0.583333 0 0.491666 0.625000 0 0.491666 0.666667 0 0.491666 0.708333 0 0.491666 0.750000 0 0.491666 0.791667 0 0.491666 0.833333 0 0.491666 0.875000 0 0.491666 0.916667 0 0.491666 0.958333 0 0.491666 1.000000 0 0.500000 0 0 0.500000 0.041667 0 0.500000 0.083333 0 0.500000 0.125000 0 0.500000 0.166667 0 0.500000 0.208333 0 0.500000 0.250000 0 0.500000 0.291667 0 0.500000 0.333333 0 0.500000 0.375000 0 0.500000 0.416667 0 0.500000 0.458333 0 0.500000 0.500000 0 0.500000 0.541667 0 0.500000 0.583333 0 0.500000 0.625000 0 0.500000 0.666667 0 0.500000 0.708333 0 0.500000 0.750000 0 0.500000 0.791667 0 0.500000 0.833333 0 0.500000 0.875000 0 0.500000 0.916667 0 0.500000 0.958333 0 0.500000 1.000000 0 0.508333 0 0 0.508333 0.041667 0 0.508333 0.083333 0 0.508333 0.125000 0 0.508333 0.166667 0 0.508333 0.208333 0 0.508333 0.250000 0 0.508333 0.291667 0 0.508333 0.333333 0 0.508333 0.375000 0 0.508333 0.416667 0 0.508333 0.458333 0 0.508333 0.500000 0 0.508333 0.541667 0 0.508333 0.583333 0 0.508333 0.625000 0 0.508333 0.666667 0 0.508333 0.708333 0 0.508333 0.750000 0 0.508333 0.791667 0 0.508333 0.833333 0 0.508333 0.875000 0 0.508333 0.916667 0 0.508333 0.958333 0 0.508333 1.000000 0 0.516666 0 0 0.516666 0.041667 0 0.516666 0.083333 0 0.516666 0.125000 0 0.516666 0.166667 0 0.516666 0.208333 0 0.516666 0.250000 0 0.516666 0.291667 0 0.516666 0.333333 0 0.516666 0.375000 0 0.516666 0.416667 0 0.516666 0.458333 0 0.516666 0.500000 0 0.516666 0.541667 0 0.516666 0.583333 0 0.516666 0.625000 0 0.516666 0.666667 0 0.516666 0.708333 0 0.516666 0.750000 0 0.516666 0.791667 0 0.516666 0.833333 0 0.516666 0.875000 0 0.516666 0.916667 0 0.516666 0.958333 0 0.516666 1.000000 0 0.525000 0 0 0.525000 0.041667 0 0.525000 0.083333 0 0.525000 0.125000 0 0.525000 0.166667 0 0.525000 0.208333 0 0.525000 0.250000 0 0.525000 0.291667 0 0.525000 0.333333 0 0.525000 0.375000 0 0.525000 0.416667 0 0.525000 0.458333 0 0.525000 0.500000 0 0.525000 0.541667 0 0.525000 0.583333 0 0.525000 0.625000 0 0.525000 0.666667 0 0.525000 0.708333 0 0.525000 0.750000 0 0.525000 0.791667 0 0.525000 0.833333 0 0.525000 0.875000 0 0.525000 0.916667 0 0.525000 0.958333 0 0.525000 1.000000 0 0.533333 0 0 0.533333 0.041667 0 0.533333 0.083333 0 0.533333 0.125000 0 0.533333 0.166667 0 0.533333 0.208333 0 0.533333 0.250000 0 0.533333 0.291667 0 0.533333 0.333333 0 0.533333 0.375000 0 0.533333 0.416667 0 0.533333 0.458333 0 0.533333 0.500000 0 0.533333 0.541667 0 0.533333 0.583333 0 0.533333 0.625000 0 0.533333 0.666667 0 0.533333 0.708333 0 0.533333 0.750000 0 0.533333 0.791667 0 0.533333 0.833333 0 0.533333 0.875000 0 0.533333 0.916667 0 0.533333 0.958333 0 0.533333 1.000000 0 0.541666 0 0 0.541666 0.041667 0 0.541666 0.083333 0 0.541666 0.125000 0 0.541666 0.166667 0 0.541666 0.208333 0 0.541666 0.250000 0 0.541666 0.291667 0 0.541666 0.333333 0 0.541666 0.375000 0 0.541666 0.416667 0 0.541666 0.458333 0 0.541666 0.500000 0 0.541666 0.541667 0 0.541666 0.583333 0 0.541666 0.625000 0 0.541666 0.666667 0 0.541666 0.708333 0 0.541666 0.750000 0 0.541666 0.791667 0 0.541666 0.833333 0 0.541666 0.875000 0 0.541666 0.916667 0 0.541666 0.958333 0 0.541666 1.000000 0 0.550000 0 0 0.550000 0.041667 0 0.550000 0.083333 0 0.550000 0.125000 0 0.550000 0.166667 0 0.550000 0.208333 0 0.550000 0.250000 0 0.550000 0.291667 0 0.550000 0.333333 0 0.550000 0.375000 0 0.550000 0.416667 0 0.550000 0.458333 0 0.550000 0.500000 0 0.550000 0.541667 0 0.550000 0.583333 0 0.550000 0.625000 0 0.550000 0.666667 0 0.550000 0.708333 0 0.550000 0.750000 0 0.550000 0.791667 0 0.550000 0.833333 0 0.550000 0.875000 0 0.550000 0.916667 0 0.550000 0.958333 0 0.550000 1.000000 0 0.558333 0 0 0.558333 0.041667 0 0.558333 0.083333 0 0.558333 0.125000 0 0.558333 0.166667 0 0.558333 0.208333 0 0.558333 0.250000 0 0.558333 0.291667 0 0.558333 0.333333 0 0.558333 0.375000 0 0.558333 0.416667 0 0.558333 0.458333 0 0.558333 0.500000 0 0.558333 0.541667 0 0.558333 0.583333 0 0.558333 0.625000 0 0.558333 0.666667 0 0.558333 0.708333 0 0.558333 0.750000 0 0.558333 0.791667 0 0.558333 0.833333 0 0.558333 0.875000 0 0.558333 0.916667 0 0.558333 0.958333 0 0.558333 1.000000 0 0.566666 0 0 0.566666 0.041667 0 0.566666 0.083333 0 0.566666 0.125000 0 0.566666 0.166667 0 0.566666 0.208333 0 0.566666 0.250000 0 0.566666 0.291667 0 0.566666 0.333333 0 0.566666 0.375000 0 0.566666 0.416667 0 0.566666 0.458333 0 0.566666 0.500000 0 0.566666 0.541667 0 0.566666 0.583333 0 0.566666 0.625000 0 0.566666 0.666667 0 0.566666 0.708333 0 0.566666 0.750000 0 0.566666 0.791667 0 0.566666 0.833333 0 0.566666 0.875000 0 0.566666 0.916667 0 0.566666 0.958333 0 0.566666 1.000000 0 0.575000 0 0 0.575000 0.041667 0 0.575000 0.083333 0 0.575000 0.125000 0 0.575000 0.166667 0 0.575000 0.208333 0 0.575000 0.250000 0 0.575000 0.291667 0 0.575000 0.333333 0 0.575000 0.375000 0 0.575000 0.416667 0 0.575000 0.458333 0 0.575000 0.500000 0 0.575000 0.541667 0 0.575000 0.583333 0 0.575000 0.625000 0 0.575000 0.666667 0 0.575000 0.708333 0 0.575000 0.750000 0 0.575000 0.791667 0 0.575000 0.833333 0 0.575000 0.875000 0 0.575000 0.916667 0 0.575000 0.958333 0 0.575000 1.000000 0 0.583333 0 0 0.583333 0.041667 0 0.583333 0.083333 0 0.583333 0.125000 0 0.583333 0.166667 0 0.583333 0.208333 0 0.583333 0.250000 0 0.583333 0.291667 0 0.583333 0.333333 0 0.583333 0.375000 0 0.583333 0.416667 0 0.583333 0.458333 0 0.583333 0.500000 0 0.583333 0.541667 0 0.583333 0.583333 0 0.583333 0.625000 0 0.583333 0.666667 0 0.583333 0.708333 0 0.583333 0.750000 0 0.583333 0.791667 0 0.583333 0.833333 0 0.583333 0.875000 0 0.583333 0.916667 0 0.583333 0.958333 0 0.583333 1.000000 0 0.591666 0 0 0.591666 0.041667 0 0.591666 0.083333 0 0.591666 0.125000 0 0.591666 0.166667 0 0.591666 0.208333 0 0.591666 0.250000 0 0.591666 0.291667 0 0.591666 0.333333 0 0.591666 0.375000 0 0.591666 0.416667 0 0.591666 0.458333 0 0.591666 0.500000 0 0.591666 0.541667 0 0.591666 0.583333 0 0.591666 0.625000 0 0.591666 0.666667 0 0.591666 0.708333 0 0.591666 0.750000 0 0.591666 0.791667 0 0.591666 0.833333 0 0.591666 0.875000 0 0.591666 0.916667 0 0.591666 0.958333 0 0.591666 1.000000 0 0.599999 0 0 0.599999 0.041667 0 0.599999 0.083333 0 0.599999 0.125000 0 0.599999 0.166667 0 0.599999 0.208333 0 0.599999 0.250000 0 0.599999 0.291667 0 0.599999 0.333333 0 0.599999 0.375000 0 0.599999 0.416667 0 0.599999 0.458333 0 0.599999 0.500000 0 0.599999 0.541667 0 0.599999 0.583333 0 0.599999 0.625000 0 0.599999 0.666667 0 0.599999 0.708333 0 0.599999 0.750000 0 0.599999 0.791667 0 0.599999 0.833333 0 0.599999 0.875000 0 0.599999 0.916667 0 0.599999 0.958333 0 0.599999 1.000000 0 0.608333 0 0 0.608333 0.041667 0 0.608333 0.083333 0 0.608333 0.125000 0 0.608333 0.166667 0 0.608333 0.208333 0 0.608333 0.250000 0 0.608333 0.291667 0 0.608333 0.333333 0 0.608333 0.375000 0 0.608333 0.416667 0 0.608333 0.458333 0 0.608333 0.500000 0 0.608333 0.541667 0 0.608333 0.583333 0 0.608333 0.625000 0 0.608333 0.666667 0 0.608333 0.708333 0 0.608333 0.750000 0 0.608333 0.791667 0 0.608333 0.833333 0 0.608333 0.875000 0 0.608333 0.916667 0 0.608333 0.958333 0 0.608333 1.000000 0 0.616666 0 0 0.616666 0.041667 0 0.616666 0.083333 0 0.616666 0.125000 0 0.616666 0.166667 0 0.616666 0.208333 0 0.616666 0.250000 0 0.616666 0.291667 0 0.616666 0.333333 0 0.616666 0.375000 0 0.616666 0.416667 0 0.616666 0.458333 0 0.616666 0.500000 0 0.616666 0.541667 0 0.616666 0.583333 0 0.616666 0.625000 0 0.616666 0.666667 0 0.616666 0.708333 0 0.616666 0.750000 0 0.616666 0.791667 0 0.616666 0.833333 0 0.616666 0.875000 0 0.616666 0.916667 0 0.616666 0.958333 0 0.616666 1.000000 0 0.624999 0 0 0.624999 0.041667 0 0.624999 0.083333 0 0.624999 0.125000 0 0.624999 0.166667 0 0.624999 0.208333 0 0.624999 0.250000 0 0.624999 0.291667 0 0.624999 0.333333 0 0.624999 0.375000 0 0.624999 0.416667 0 0.624999 0.458333 0 0.624999 0.500000 0 0.624999 0.541667 0 0.624999 0.583333 0 0.624999 0.625000 0 0.624999 0.666667 0 0.624999 0.708333 0 0.624999 0.750000 0 0.624999 0.791667 0 0.624999 0.833333 0 0.624999 0.875000 0 0.624999 0.916667 0 0.624999 0.958333 0 0.624999 1.000000 0 0.633333 0 0 0.633333 0.041667 0 0.633333 0.083333 0 0.633333 0.125000 0 0.633333 0.166667 0 0.633333 0.208333 0 0.633333 0.250000 0 0.633333 0.291667 0 0.633333 0.333333 0 0.633333 0.375000 0 0.633333 0.416667 0 0.633333 0.458333 0 0.633333 0.500000 0 0.633333 0.541667 0 0.633333 0.583333 0 0.633333 0.625000 0 0.633333 0.666667 0 0.633333 0.708333 0 0.633333 0.750000 0 0.633333 0.791667 0 0.633333 0.833333 0 0.633333 0.875000 0 0.633333 0.916667 0 0.633333 0.958333 0 0.633333 1.000000 0 0.641666 0 0 0.641666 0.041667 0 0.641666 0.083333 0 0.641666 0.125000 0 0.641666 0.166667 0 0.641666 0.208333 0 0.641666 0.250000 0 0.641666 0.291667 0 0.641666 0.333333 0 0.641666 0.375000 0 0.641666 0.416667 0 0.641666 0.458333 0 0.641666 0.500000 0 0.641666 0.541667 0 0.641666 0.583333 0 0.641666 0.625000 0 0.641666 0.666667 0 0.641666 0.708333 0 0.641666 0.750000 0 0.641666 0.791667 0 0.641666 0.833333 0 0.641666 0.875000 0 0.641666 0.916667 0 0.641666 0.958333 0 0.641666 1.000000 0 0.649999 0 0 0.649999 0.041667 0 0.649999 0.083333 0 0.649999 0.125000 0 0.649999 0.166667 0 0.649999 0.208333 0 0.649999 0.250000 0 0.649999 0.291667 0 0.649999 0.333333 0 0.649999 0.375000 0 0.649999 0.416667 0 0.649999 0.458333 0 0.649999 0.500000 0 0.649999 0.541667 0 0.649999 0.583333 0 0.649999 0.625000 0 0.649999 0.666667 0 0.649999 0.708333 0 0.649999 0.750000 0 0.649999 0.791667 0 0.649999 0.833333 0 0.649999 0.875000 0 0.649999 0.916667 0 0.649999 0.958333 0 0.649999 1.000000 0 0.658333 0 0 0.658333 0.041667 0 0.658333 0.083333 0 0.658333 0.125000 0 0.658333 0.166667 0 0.658333 0.208333 0 0.658333 0.250000 0 0.658333 0.291667 0 0.658333 0.333333 0 0.658333 0.375000 0 0.658333 0.416667 0 0.658333 0.458333 0 0.658333 0.500000 0 0.658333 0.541667 0 0.658333 0.583333 0 0.658333 0.625000 0 0.658333 0.666667 0 0.658333 0.708333 0 0.658333 0.750000 0 0.658333 0.791667 0 0.658333 0.833333 0 0.658333 0.875000 0 0.658333 0.916667 0 0.658333 0.958333 0 0.658333 1.000000 0 0.666666 0 0 0.666666 0.041667 0 0.666666 0.083333 0 0.666666 0.125000 0 0.666666 0.166667 0 0.666666 0.208333 0 0.666666 0.250000 0 0.666666 0.291667 0 0.666666 0.333333 0 0.666666 0.375000 0 0.666666 0.416667 0 0.666666 0.458333 0 0.666666 0.500000 0 0.666666 0.541667 0 0.666666 0.583333 0 0.666666 0.625000 0 0.666666 0.666667 0 0.666666 0.708333 0 0.666666 0.750000 0 0.666666 0.791667 0 0.666666 0.833333 0 0.666666 0.875000 0 0.666666 0.916667 0 0.666666 0.958333 0 0.666666 1.000000 0 0.675000 0 0 0.675000 0.041667 0 0.675000 0.083333 0 0.675000 0.125000 0 0.675000 0.166667 0 0.675000 0.208333 0 0.675000 0.250000 0 0.675000 0.291667 0 0.675000 0.333333 0 0.675000 0.375000 0 0.675000 0.416667 0 0.675000 0.458333 0 0.675000 0.500000 0 0.675000 0.541667 0 0.675000 0.583333 0 0.675000 0.625000 0 0.675000 0.666667 0 0.675000 0.708333 0 0.675000 0.750000 0 0.675000 0.791667 0 0.675000 0.833333 0 0.675000 0.875000 0 0.675000 0.916667 0 0.675000 0.958333 0 0.675000 1.000000 0 0.683333 0 0 0.683333 0.041667 0 0.683333 0.083333 0 0.683333 0.125000 0 0.683333 0.166667 0 0.683333 0.208333 0 0.683333 0.250000 0 0.683333 0.291667 0 0.683333 0.333333 0 0.683333 0.375000 0 0.683333 0.416667 0 0.683333 0.458333 0 0.683333 0.500000 0 0.683333 0.541667 0 0.683333 0.583333 0 0.683333 0.625000 0 0.683333 0.666667 0 0.683333 0.708333 0 0.683333 0.750000 0 0.683333 0.791667 0 0.683333 0.833333 0 0.683333 0.875000 0 0.683333 0.916667 0 0.683333 0.958333 0 0.683333 1.000000 0 0.691666 0 0 0.691666 0.041667 0 0.691666 0.083333 0 0.691666 0.125000 0 0.691666 0.166667 0 0.691666 0.208333 0 0.691666 0.250000 0 0.691666 0.291667 0 0.691666 0.333333 0 0.691666 0.375000 0 0.691666 0.416667 0 0.691666 0.458333 0 0.691666 0.500000 0 0.691666 0.541667 0 0.691666 0.583333 0 0.691666 0.625000 0 0.691666 0.666667 0 0.691666 0.708333 0 0.691666 0.750000 0 0.691666 0.791667 0 0.691666 0.833333 0 0.691666 0.875000 0 0.691666 0.916667 0 0.691666 0.958333 0 0.691666 1.000000 0 0.700000 0 0 0.700000 0.041667 0 0.700000 0.083333 0 0.700000 0.125000 0 0.700000 0.166667 0 0.700000 0.208333 0 0.700000 0.250000 0 0.700000 0.291667 0 0.700000 0.333333 0 0.700000 0.375000 0 0.700000 0.416667 0 0.700000 0.458333 0 0.700000 0.500000 0 0.700000 0.541667 0 0.700000 0.583333 0 0.700000 0.625000 0 0.700000 0.666667 0 0.700000 0.708333 0 0.700000 0.750000 0 0.700000 0.791667 0 0.700000 0.833333 0 0.700000 0.875000 0 0.700000 0.916667 0 0.700000 0.958333 0 0.700000 1.000000 0 0.708333 0 0 0.708333 0.041667 0 0.708333 0.083333 0 0.708333 0.125000 0 0.708333 0.166667 0 0.708333 0.208333 0 0.708333 0.250000 0 0.708333 0.291667 0 0.708333 0.333333 0 0.708333 0.375000 0 0.708333 0.416667 0 0.708333 0.458333 0 0.708333 0.500000 0 0.708333 0.541667 0 0.708333 0.583333 0 0.708333 0.625000 0 0.708333 0.666667 0 0.708333 0.708333 0 0.708333 0.750000 0 0.708333 0.791667 0 0.708333 0.833333 0 0.708333 0.875000 0 0.708333 0.916667 0 0.708333 0.958333 0 0.708333 1.000000 0 0.716666 0 0 0.716666 0.041667 0 0.716666 0.083333 0 0.716666 0.125000 0 0.716666 0.166667 0 0.716666 0.208333 0 0.716666 0.250000 0 0.716666 0.291667 0 0.716666 0.333333 0 0.716666 0.375000 0 0.716666 0.416667 0 0.716666 0.458333 0 0.716666 0.500000 0 0.716666 0.541667 0 0.716666 0.583333 0 0.716666 0.625000 0 0.716666 0.666667 0 0.716666 0.708333 0 0.716666 0.750000 0 0.716666 0.791667 0 0.716666 0.833333 0 0.716666 0.875000 0 0.716666 0.916667 0 0.716666 0.958333 0 0.716666 1.000000 0 0.725000 0 0 0.725000 0.041667 0 0.725000 0.083333 0 0.725000 0.125000 0 0.725000 0.166667 0 0.725000 0.208333 0 0.725000 0.250000 0 0.725000 0.291667 0 0.725000 0.333333 0 0.725000 0.375000 0 0.725000 0.416667 0 0.725000 0.458333 0 0.725000 0.500000 0 0.725000 0.541667 0 0.725000 0.583333 0 0.725000 0.625000 0 0.725000 0.666667 0 0.725000 0.708333 0 0.725000 0.750000 0 0.725000 0.791667 0 0.725000 0.833333 0 0.725000 0.875000 0 0.725000 0.916667 0 0.725000 0.958333 0 0.725000 1.000000 0 0.733333 0 0 0.733333 0.041667 0 0.733333 0.083333 0 0.733333 0.125000 0 0.733333 0.166667 0 0.733333 0.208333 0 0.733333 0.250000 0 0.733333 0.291667 0 0.733333 0.333333 0 0.733333 0.375000 0 0.733333 0.416667 0 0.733333 0.458333 0 0.733333 0.500000 0 0.733333 0.541667 0 0.733333 0.583333 0 0.733333 0.625000 0 0.733333 0.666667 0 0.733333 0.708333 0 0.733333 0.750000 0 0.733333 0.791667 0 0.733333 0.833333 0 0.733333 0.875000 0 0.733333 0.916667 0 0.733333 0.958333 0 0.733333 1.000000 0 0.741666 0 0 0.741666 0.041667 0 0.741666 0.083333 0 0.741666 0.125000 0 0.741666 0.166667 0 0.741666 0.208333 0 0.741666 0.250000 0 0.741666 0.291667 0 0.741666 0.333333 0 0.741666 0.375000 0 0.741666 0.416667 0 0.741666 0.458333 0 0.741666 0.500000 0 0.741666 0.541667 0 0.741666 0.583333 0 0.741666 0.625000 0 0.741666 0.666667 0 0.741666 0.708333 0 0.741666 0.750000 0 0.741666 0.791667 0 0.741666 0.833333 0 0.741666 0.875000 0 0.741666 0.916667 0 0.741666 0.958333 0 0.741666 1.000000 0 0.750000 0 0 0.750000 0.041667 0 0.750000 0.083333 0 0.750000 0.125000 0 0.750000 0.166667 0 0.750000 0.208333 0 0.750000 0.250000 0 0.750000 0.291667 0 0.750000 0.333333 0 0.750000 0.375000 0 0.750000 0.416667 0 0.750000 0.458333 0 0.750000 0.500000 0 0.750000 0.541667 0 0.750000 0.583333 0 0.750000 0.625000 0 0.750000 0.666667 0 0.750000 0.708333 0 0.750000 0.750000 0 0.750000 0.791667 0 0.750000 0.833333 0 0.750000 0.875000 0 0.750000 0.916667 0 0.750000 0.958333 0 0.750000 1.000000 0 0.758333 0 0 0.758333 0.041667 0 0.758333 0.083333 0 0.758333 0.125000 0 0.758333 0.166667 0 0.758333 0.208333 0 0.758333 0.250000 0 0.758333 0.291667 0 0.758333 0.333333 0 0.758333 0.375000 0 0.758333 0.416667 0 0.758333 0.458333 0 0.758333 0.500000 0 0.758333 0.541667 0 0.758333 0.583333 0 0.758333 0.625000 0 0.758333 0.666667 0 0.758333 0.708333 0 0.758333 0.750000 0 0.758333 0.791667 0 0.758333 0.833333 0 0.758333 0.875000 0 0.758333 0.916667 0 0.758333 0.958333 0 0.758333 1.000000 0 0.766667 0 0 0.766667 0.041667 0 0.766667 0.083333 0 0.766667 0.125000 0 0.766667 0.166667 0 0.766667 0.208333 0 0.766667 0.250000 0 0.766667 0.291667 0 0.766667 0.333333 0 0.766667 0.375000 0 0.766667 0.416667 0 0.766667 0.458333 0 0.766667 0.500000 0 0.766667 0.541667 0 0.766667 0.583333 0 0.766667 0.625000 0 0.766667 0.666667 0 0.766667 0.708333 0 0.766667 0.750000 0 0.766667 0.791667 0 0.766667 0.833333 0 0.766667 0.875000 0 0.766667 0.916667 0 0.766667 0.958333 0 0.766667 1.000000 0 0.775000 0 0 0.775000 0.041667 0 0.775000 0.083333 0 0.775000 0.125000 0 0.775000 0.166667 0 0.775000 0.208333 0 0.775000 0.250000 0 0.775000 0.291667 0 0.775000 0.333333 0 0.775000 0.375000 0 0.775000 0.416667 0 0.775000 0.458333 0 0.775000 0.500000 0 0.775000 0.541667 0 0.775000 0.583333 0 0.775000 0.625000 0 0.775000 0.666667 0 0.775000 0.708333 0 0.775000 0.750000 0 0.775000 0.791667 0 0.775000 0.833333 0 0.775000 0.875000 0 0.775000 0.916667 0 0.775000 0.958333 0 0.775000 1.000000 0 0.783333 0 0 0.783333 0.041667 0 0.783333 0.083333 0 0.783333 0.125000 0 0.783333 0.166667 0 0.783333 0.208333 0 0.783333 0.250000 0 0.783333 0.291667 0 0.783333 0.333333 0 0.783333 0.375000 0 0.783333 0.416667 0 0.783333 0.458333 0 0.783333 0.500000 0 0.783333 0.541667 0 0.783333 0.583333 0 0.783333 0.625000 0 0.783333 0.666667 0 0.783333 0.708333 0 0.783333 0.750000 0 0.783333 0.791667 0 0.783333 0.833333 0 0.783333 0.875000 0 0.783333 0.916667 0 0.783333 0.958333 0 0.783333 1.000000 0 0.791667 0 0 0.791667 0.041667 0 0.791667 0.083333 0 0.791667 0.125000 0 0.791667 0.166667 0 0.791667 0.208333 0 0.791667 0.250000 0 0.791667 0.291667 0 0.791667 0.333333 0 0.791667 0.375000 0 0.791667 0.416667 0 0.791667 0.458333 0 0.791667 0.500000 0 0.791667 0.541667 0 0.791667 0.583333 0 0.791667 0.625000 0 0.791667 0.666667 0 0.791667 0.708333 0 0.791667 0.750000 0 0.791667 0.791667 0 0.791667 0.833333 0 0.791667 0.875000 0 0.791667 0.916667 0 0.791667 0.958333 0 0.791667 1.000000 0 0.800000 0 0 0.800000 0.041667 0 0.800000 0.083333 0 0.800000 0.125000 0 0.800000 0.166667 0 0.800000 0.208333 0 0.800000 0.250000 0 0.800000 0.291667 0 0.800000 0.333333 0 0.800000 0.375000 0 0.800000 0.416667 0 0.800000 0.458333 0 0.800000 0.500000 0 0.800000 0.541667 0 0.800000 0.583333 0 0.800000 0.625000 0 0.800000 0.666667 0 0.800000 0.708333 0 0.800000 0.750000 0 0.800000 0.791667 0 0.800000 0.833333 0 0.800000 0.875000 0 0.800000 0.916667 0 0.800000 0.958333 0 0.800000 1.000000 0 0.808333 0 0 0.808333 0.041667 0 0.808333 0.083333 0 0.808333 0.125000 0 0.808333 0.166667 0 0.808333 0.208333 0 0.808333 0.250000 0 0.808333 0.291667 0 0.808333 0.333333 0 0.808333 0.375000 0 0.808333 0.416667 0 0.808333 0.458333 0 0.808333 0.500000 0 0.808333 0.541667 0 0.808333 0.583333 0 0.808333 0.625000 0 0.808333 0.666667 0 0.808333 0.708333 0 0.808333 0.750000 0 0.808333 0.791667 0 0.808333 0.833333 0 0.808333 0.875000 0 0.808333 0.916667 0 0.808333 0.958333 0 0.808333 1.000000 0 0.816667 0 0 0.816667 0.041667 0 0.816667 0.083333 0 0.816667 0.125000 0 0.816667 0.166667 0 0.816667 0.208333 0 0.816667 0.250000 0 0.816667 0.291667 0 0.816667 0.333333 0 0.816667 0.375000 0 0.816667 0.416667 0 0.816667 0.458333 0 0.816667 0.500000 0 0.816667 0.541667 0 0.816667 0.583333 0 0.816667 0.625000 0 0.816667 0.666667 0 0.816667 0.708333 0 0.816667 0.750000 0 0.816667 0.791667 0 0.816667 0.833333 0 0.816667 0.875000 0 0.816667 0.916667 0 0.816667 0.958333 0 0.816667 1.000000 0 0.825000 0 0 0.825000 0.041667 0 0.825000 0.083333 0 0.825000 0.125000 0 0.825000 0.166667 0 0.825000 0.208333 0 0.825000 0.250000 0 0.825000 0.291667 0 0.825000 0.333333 0 0.825000 0.375000 0 0.825000 0.416667 0 0.825000 0.458333 0 0.825000 0.500000 0 0.825000 0.541667 0 0.825000 0.583333 0 0.825000 0.625000 0 0.825000 0.666667 0 0.825000 0.708333 0 0.825000 0.750000 0 0.825000 0.791667 0 0.825000 0.833333 0 0.825000 0.875000 0 0.825000 0.916667 0 0.825000 0.958333 0 0.825000 1.000000 0 0.833333 0 0 0.833333 0.041667 0 0.833333 0.083333 0 0.833333 0.125000 0 0.833333 0.166667 0 0.833333 0.208333 0 0.833333 0.250000 0 0.833333 0.291667 0 0.833333 0.333333 0 0.833333 0.375000 0 0.833333 0.416667 0 0.833333 0.458333 0 0.833333 0.500000 0 0.833333 0.541667 0 0.833333 0.583333 0 0.833333 0.625000 0 0.833333 0.666667 0 0.833333 0.708333 0 0.833333 0.750000 0 0.833333 0.791667 0 0.833333 0.833333 0 0.833333 0.875000 0 0.833333 0.916667 0 0.833333 0.958333 0 0.833333 1.000000 0 0.841667 0 0 0.841667 0.041667 0 0.841667 0.083333 0 0.841667 0.125000 0 0.841667 0.166667 0 0.841667 0.208333 0 0.841667 0.250000 0 0.841667 0.291667 0 0.841667 0.333333 0 0.841667 0.375000 0 0.841667 0.416667 0 0.841667 0.458333 0 0.841667 0.500000 0 0.841667 0.541667 0 0.841667 0.583333 0 0.841667 0.625000 0 0.841667 0.666667 0 0.841667 0.708333 0 0.841667 0.750000 0 0.841667 0.791667 0 0.841667 0.833333 0 0.841667 0.875000 0 0.841667 0.916667 0 0.841667 0.958333 0 0.841667 1.000000 0 0.850000 0 0 0.850000 0.041667 0 0.850000 0.083333 0 0.850000 0.125000 0 0.850000 0.166667 0 0.850000 0.208333 0 0.850000 0.250000 0 0.850000 0.291667 0 0.850000 0.333333 0 0.850000 0.375000 0 0.850000 0.416667 0 0.850000 0.458333 0 0.850000 0.500000 0 0.850000 0.541667 0 0.850000 0.583333 0 0.850000 0.625000 0 0.850000 0.666667 0 0.850000 0.708333 0 0.850000 0.750000 0 0.850000 0.791667 0 0.850000 0.833333 0 0.850000 0.875000 0 0.850000 0.916667 0 0.850000 0.958333 0 0.850000 1.000000 0 0.858334 0 0 0.858334 0.041667 0 0.858334 0.083333 0 0.858334 0.125000 0 0.858334 0.166667 0 0.858334 0.208333 0 0.858334 0.250000 0 0.858334 0.291667 0 0.858334 0.333333 0 0.858334 0.375000 0 0.858334 0.416667 0 0.858334 0.458333 0 0.858334 0.500000 0 0.858334 0.541667 0 0.858334 0.583333 0 0.858334 0.625000 0 0.858334 0.666667 0 0.858334 0.708333 0 0.858334 0.750000 0 0.858334 0.791667 0 0.858334 0.833333 0 0.858334 0.875000 0 0.858334 0.916667 0 0.858334 0.958333 0 0.858334 1.000000 0 0.866667 0 0 0.866667 0.041667 0 0.866667 0.083333 0 0.866667 0.125000 0 0.866667 0.166667 0 0.866667 0.208333 0 0.866667 0.250000 0 0.866667 0.291667 0 0.866667 0.333333 0 0.866667 0.375000 0 0.866667 0.416667 0 0.866667 0.458333 0 0.866667 0.500000 0 0.866667 0.541667 0 0.866667 0.583333 0 0.866667 0.625000 0 0.866667 0.666667 0 0.866667 0.708333 0 0.866667 0.750000 0 0.866667 0.791667 0 0.866667 0.833333 0 0.866667 0.875000 0 0.866667 0.916667 0 0.866667 0.958333 0 0.866667 1.000000 0 0.875000 0 0 0.875000 0.041667 0 0.875000 0.083333 0 0.875000 0.125000 0 0.875000 0.166667 0 0.875000 0.208333 0 0.875000 0.250000 0 0.875000 0.291667 0 0.875000 0.333333 0 0.875000 0.375000 0 0.875000 0.416667 0 0.875000 0.458333 0 0.875000 0.500000 0 0.875000 0.541667 0 0.875000 0.583333 0 0.875000 0.625000 0 0.875000 0.666667 0 0.875000 0.708333 0 0.875000 0.750000 0 0.875000 0.791667 0 0.875000 0.833333 0 0.875000 0.875000 0 0.875000 0.916667 0 0.875000 0.958333 0 0.875000 1.000000 0 0.883334 0 0 0.883334 0.041667 0 0.883334 0.083333 0 0.883334 0.125000 0 0.883334 0.166667 0 0.883334 0.208333 0 0.883334 0.250000 0 0.883334 0.291667 0 0.883334 0.333333 0 0.883334 0.375000 0 0.883334 0.416667 0 0.883334 0.458333 0 0.883334 0.500000 0 0.883334 0.541667 0 0.883334 0.583333 0 0.883334 0.625000 0 0.883334 0.666667 0 0.883334 0.708333 0 0.883334 0.750000 0 0.883334 0.791667 0 0.883334 0.833333 0 0.883334 0.875000 0 0.883334 0.916667 0 0.883334 0.958333 0 0.883334 1.000000 0 0.891667 0 0 0.891667 0.041667 0 0.891667 0.083333 0 0.891667 0.125000 0 0.891667 0.166667 0 0.891667 0.208333 0 0.891667 0.250000 0 0.891667 0.291667 0 0.891667 0.333333 0 0.891667 0.375000 0 0.891667 0.416667 0 0.891667 0.458333 0 0.891667 0.500000 0 0.891667 0.541667 0 0.891667 0.583333 0 0.891667 0.625000 0 0.891667 0.666667 0 0.891667 0.708333 0 0.891667 0.750000 0 0.891667 0.791667 0 0.891667 0.833333 0 0.891667 0.875000 0 0.891667 0.916667 0 0.891667 0.958333 0 0.891667 1.000000 0 0.900000 0 0 0.900000 0.041667 0 0.900000 0.083333 0 0.900000 0.125000 0 0.900000 0.166667 0 0.900000 0.208333 0 0.900000 0.250000 0 0.900000 0.291667 0 0.900000 0.333333 0 0.900000 0.375000 0 0.900000 0.416667 0 0.900000 0.458333 0 0.900000 0.500000 0 0.900000 0.541667 0 0.900000 0.583333 0 0.900000 0.625000 0 0.900000 0.666667 0 0.900000 0.708333 0 0.900000 0.750000 0 0.900000 0.791667 0 0.900000 0.833333 0 0.900000 0.875000 0 0.900000 0.916667 0 0.900000 0.958333 0 0.900000 1.000000 0 0.908334 0 0 0.908334 0.041667 0 0.908334 0.083333 0 0.908334 0.125000 0 0.908334 0.166667 0 0.908334 0.208333 0 0.908334 0.250000 0 0.908334 0.291667 0 0.908334 0.333333 0 0.908334 0.375000 0 0.908334 0.416667 0 0.908334 0.458333 0 0.908334 0.500000 0 0.908334 0.541667 0 0.908334 0.583333 0 0.908334 0.625000 0 0.908334 0.666667 0 0.908334 0.708333 0 0.908334 0.750000 0 0.908334 0.791667 0 0.908334 0.833333 0 0.908334 0.875000 0 0.908334 0.916667 0 0.908334 0.958333 0 0.908334 1.000000 0 0.916667 0 0 0.916667 0.041667 0 0.916667 0.083333 0 0.916667 0.125000 0 0.916667 0.166667 0 0.916667 0.208333 0 0.916667 0.250000 0 0.916667 0.291667 0 0.916667 0.333333 0 0.916667 0.375000 0 0.916667 0.416667 0 0.916667 0.458333 0 0.916667 0.500000 0 0.916667 0.541667 0 0.916667 0.583333 0 0.916667 0.625000 0 0.916667 0.666667 0 0.916667 0.708333 0 0.916667 0.750000 0 0.916667 0.791667 0 0.916667 0.833333 0 0.916667 0.875000 0 0.916667 0.916667 0 0.916667 0.958333 0 0.916667 1.000000 0 0.925000 0 0 0.925000 0.041667 0 0.925000 0.083333 0 0.925000 0.125000 0 0.925000 0.166667 0 0.925000 0.208333 0 0.925000 0.250000 0 0.925000 0.291667 0 0.925000 0.333333 0 0.925000 0.375000 0 0.925000 0.416667 0 0.925000 0.458333 0 0.925000 0.500000 0 0.925000 0.541667 0 0.925000 0.583333 0 0.925000 0.625000 0 0.925000 0.666667 0 0.925000 0.708333 0 0.925000 0.750000 0 0.925000 0.791667 0 0.925000 0.833333 0 0.925000 0.875000 0 0.925000 0.916667 0 0.925000 0.958333 0 0.925000 1.000000 0 0.933334 0 0 0.933334 0.041667 0 0.933334 0.083333 0 0.933334 0.125000 0 0.933334 0.166667 0 0.933334 0.208333 0 0.933334 0.250000 0 0.933334 0.291667 0 0.933334 0.333333 0 0.933334 0.375000 0 0.933334 0.416667 0 0.933334 0.458333 0 0.933334 0.500000 0 0.933334 0.541667 0 0.933334 0.583333 0 0.933334 0.625000 0 0.933334 0.666667 0 0.933334 0.708333 0 0.933334 0.750000 0 0.933334 0.791667 0 0.933334 0.833333 0 0.933334 0.875000 0 0.933334 0.916667 0 0.933334 0.958333 0 0.933334 1.000000 0 0.941667 0 0 0.941667 0.041667 0 0.941667 0.083333 0 0.941667 0.125000 0 0.941667 0.166667 0 0.941667 0.208333 0 0.941667 0.250000 0 0.941667 0.291667 0 0.941667 0.333333 0 0.941667 0.375000 0 0.941667 0.416667 0 0.941667 0.458333 0 0.941667 0.500000 0 0.941667 0.541667 0 0.941667 0.583333 0 0.941667 0.625000 0 0.941667 0.666667 0 0.941667 0.708333 0 0.941667 0.750000 0 0.941667 0.791667 0 0.941667 0.833333 0 0.941667 0.875000 0 0.941667 0.916667 0 0.941667 0.958333 0 0.941667 1.000000 0 0.950001 0 0 0.950001 0.041667 0 0.950001 0.083333 0 0.950001 0.125000 0 0.950001 0.166667 0 0.950001 0.208333 0 0.950001 0.250000 0 0.950001 0.291667 0 0.950001 0.333333 0 0.950001 0.375000 0 0.950001 0.416667 0 0.950001 0.458333 0 0.950001 0.500000 0 0.950001 0.541667 0 0.950001 0.583333 0 0.950001 0.625000 0 0.950001 0.666667 0 0.950001 0.708333 0 0.950001 0.750000 0 0.950001 0.791667 0 0.950001 0.833333 0 0.950001 0.875000 0 0.950001 0.916667 0 0.950001 0.958333 0 0.950001 1.000000 0 0.958334 0 0 0.958334 0.041667 0 0.958334 0.083333 0 0.958334 0.125000 0 0.958334 0.166667 0 0.958334 0.208333 0 0.958334 0.250000 0 0.958334 0.291667 0 0.958334 0.333333 0 0.958334 0.375000 0 0.958334 0.416667 0 0.958334 0.458333 0 0.958334 0.500000 0 0.958334 0.541667 0 0.958334 0.583333 0 0.958334 0.625000 0 0.958334 0.666667 0 0.958334 0.708333 0 0.958334 0.750000 0 0.958334 0.791667 0 0.958334 0.833333 0 0.958334 0.875000 0 0.958334 0.916667 0 0.958334 0.958333 0 0.958334 1.000000 0 0.966667 0 0 0.966667 0.041667 0 0.966667 0.083333 0 0.966667 0.125000 0 0.966667 0.166667 0 0.966667 0.208333 0 0.966667 0.250000 0 0.966667 0.291667 0 0.966667 0.333333 0 0.966667 0.375000 0 0.966667 0.416667 0 0.966667 0.458333 0 0.966667 0.500000 0 0.966667 0.541667 0 0.966667 0.583333 0 0.966667 0.625000 0 0.966667 0.666667 0 0.966667 0.708333 0 0.966667 0.750000 0 0.966667 0.791667 0 0.966667 0.833333 0 0.966667 0.875000 0 0.966667 0.916667 0 0.966667 0.958333 0 0.966667 1.000000 0 0.975001 0 0 0.975001 0.041667 0 0.975001 0.083333 0 0.975001 0.125000 0 0.975001 0.166667 0 0.975001 0.208333 0 0.975001 0.250000 0 0.975001 0.291667 0 0.975001 0.333333 0 0.975001 0.375000 0 0.975001 0.416667 0 0.975001 0.458333 0 0.975001 0.500000 0 0.975001 0.541667 0 0.975001 0.583333 0 0.975001 0.625000 0 0.975001 0.666667 0 0.975001 0.708333 0 0.975001 0.750000 0 0.975001 0.791667 0 0.975001 0.833333 0 0.975001 0.875000 0 0.975001 0.916667 0 0.975001 0.958333 0 0.975001 1.000000 0 0.983334 0 0 0.983334 0.041667 0 0.983334 0.083333 0 0.983334 0.125000 0 0.983334 0.166667 0 0.983334 0.208333 0 0.983334 0.250000 0 0.983334 0.291667 0 0.983334 0.333333 0 0.983334 0.375000 0 0.983334 0.416667 0 0.983334 0.458333 0 0.983334 0.500000 0 0.983334 0.541667 0 0.983334 0.583333 0 0.983334 0.625000 0 0.983334 0.666667 0 0.983334 0.708333 0 0.983334 0.750000 0 0.983334 0.791667 0 0.983334 0.833333 0 0.983334 0.875000 0 0.983334 0.916667 0 0.983334 0.958333 0 0.983334 1.000000 0 0.991667 0 0 0.991667 0.041667 0 0.991667 0.083333 0 0.991667 0.125000 0 0.991667 0.166667 0 0.991667 0.208333 0 0.991667 0.250000 0 0.991667 0.291667 0 0.991667 0.333333 0 0.991667 0.375000 0 0.991667 0.416667 0 0.991667 0.458333 0 0.991667 0.500000 0 0.991667 0.541667 0 0.991667 0.583333 0 0.991667 0.625000 0 0.991667 0.666667 0 0.991667 0.708333 0 0.991667 0.750000 0 0.991667 0.791667 0 0.991667 0.833333 0 0.991667 0.875000 0 0.991667 0.916667 0 0.991667 0.958333 0 0.991667 1.000000 0 1.000001 0 0 1.000001 0.041667 0 1.000001 0.083333 0 1.000001 0.125000 0 1.000001 0.166667 0 1.000001 0.208333 0 1.000001 0.250000 0 1.000001 0.291667 0 1.000001 0.333333 0 1.000001 0.375000 0 1.000001 0.416667 0 1.000001 0.458333 0 1.000001 0.500000 0 1.000001 0.541667 0 1.000001 0.583333 0 1.000001 0.625000 0 1.000001 0.666667 0 1.000001 0.708333 0 1.000001 0.750000 0 1.000001 0.791667 0 1.000001 0.833333 0 1.000001 0.875000 0 1.000001 0.916667 0 1.000001 0.958333 0 1.000001 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="3025" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="5760">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 24 1 25 25 2 26 0 0 0 25 2 26 1 3 1 1 3 1 25 2 26 26 4 27 1 3 1 26 4 27 2 5 2 2 5 2 26 4 27 27 6 28 2 5 2 27 6 28 3 7 3 3 7 3 27 6 28 28 8 29 3 7 3 28 8 29 4 9 4 4 9 4 28 8 29 29 10 30 4 9 4 29 10 30 5 11 5 5 11 5 29 10 30 30 12 31 5 11 5 30 12 31 6 13 6 6 13 6 30 12 31 31 14 32 6 13 6 31 14 32 7 15 7 7 15 7 31 14 32 32 16 33 7 15 7 32 16 33 8 17 8 8 17 8 32 16 33 33 18 34 8 17 8 33 18 34 9 19 9 9 19 9 33 18 34 34 20 35 9 19 9 34 20 35 10 21 10 10 21 10 34 20 35 35 22 36 10 21 10 35 22 36 11 23 11 11 23 11 35 22 36 36 24 37 11 23 11 36 24 37 12 25 12 12 25 12 36 24 37 37 26 38 12 25 12 37 26 38 13 27 13 13 27 13 37 26 38 38 28 39 13 27 13 38 28 39 14 29 14 14 29 14 38 28 39 39 30 40 14 29 14 39 30 40 15 31 15 15 31 15 39 30 40 40 32 41 15 31 15 40 32 41 16 33 16 16 33 16 40 32 41 41 34 42 16 33 16 41 34 42 17 35 17 17 35 17 41 34 42 42 36 43 17 35 17 42 36 43 18 37 18 18 37 18 42 36 43 43 38 44 18 37 18 43 38 44 19 39 19 19 39 19 43 38 44 44 40 45 19 39 19 44 40 45 20 41 20 20 41 20 44 40 45 45 42 46 20 41 20 45 42 46 21 43 21 21 43 21 45 42 46 46 44 47 21 43 21 46 44 47 22 45 22 22 45 22 46 44 47 47 46 48 22 45 22 47 46 48 23 47 23 23 47 23 47 46 48 24 1 49 23 47 23 24 1 49 0 0 24 24 1 25 48 48 50 49 49 51 24 1 25 49 49 51 25 2 26 25 2 26 49 49 51 50 50 52 25 2 26 50 50 52 26 4 27 26 4 27 50 50 52 51 51 53 26 4 27 51 51 53 27 6 28 27 6 28 51 51 53 52 52 54 27 6 28 52 52 54 28 8 29 28 8 29 52 52 54 53 53 55 28 8 29 53 53 55 29 10 30 29 10 30 53 53 55 54 54 56 29 10 30 54 54 56 30 12 31 30 12 31 54 54 56 55 55 57 30 12 31 55 55 57 31 14 32 31 14 32 55 55 57 56 56 58 31 14 32 56 56 58 32 16 33 32 16 33 56 56 58 57 57 59 32 16 33 57 57 59 33 18 34 33 18 34 57 57 59 58 58 60 33 18 34 58 58 60 34 20 35 34 20 35 58 58 60 59 59 61 34 20 35 59 59 61 35 22 36 35 22 36 59 59 61 60 60 62 35 22 36 60 60 62 36 24 37 36 24 37 60 60 62 61 61 63 36 24 37 61 61 63 37 26 38 37 26 38 61 61 63 62 62 64 37 26 38 62 62 64 38 28 39 38 28 39 62 62 64 63 63 65 38 28 39 63 63 65 39 30 40 39 30 40 63 63 65 64 64 66 39 30 40 64 64 66 40 32 41 40 32 41 64 64 66 65 65 67 40 32 41 65 65 67 41 34 42 41 34 42 65 65 67 66 66 68 41 34 42 66 66 68 42 36 43 42 36 43 66 66 68 67 67 69 42 36 43 67 67 69 43 38 44 43 38 44 67 67 69 68 68 70 43 38 44 68 68 70 44 40 45 44 40 45 68 68 70 69 69 71 44 40 45 69 69 71 45 42 46 45 42 46 69 69 71 70 70 72 45 42 46 70 70 72 46 44 47 46 44 47 70 70 72 71 71 73 46 44 47 71 71 73 47 46 48 47 46 48 71 71 73 48 48 74 47 46 48 48 48 74 24 1 49 48 48 50 72 72 75 73 73 76 48 48 50 73 73 76 49 49 51 49 49 51 73 73 76 74 74 77 49 49 51 74 74 77 50 50 52 50 50 52 74 74 77 75 75 78 50 50 52 75 75 78 51 51 53 51 51 53 75 75 78 76 76 79 51 51 53 76 76 79 52 52 54 52 52 54 76 76 79 77 77 80 52 52 54 77 77 80 53 53 55 53 53 55 77 77 80 78 78 81 53 53 55 78 78 81 54 54 56 54 54 56 78 78 81 79 79 82 54 54 56 79 79 82 55 55 57 55 55 57 79 79 82 80 80 83 55 55 57 80 80 83 56 56 58 56 56 58 80 80 83 81 81 84 56 56 58 81 81 84 57 57 59 57 57 59 81 81 84 82 82 85 57 57 59 82 82 85 58 58 60 58 58 60 82 82 85 83 83 86 58 58 60 83 83 86 59 59 61 59 59 61 83 83 86 84 84 87 59 59 61 84 84 87 60 60 62 60 60 62 84 84 87 85 85 88 60 60 62 85 85 88 61 61 63 61 61 63 85 85 88 86 86 89 61 61 63 86 86 89 62 62 64 62 62 64 86 86 89 87 87 90 62 62 64 87 87 90 63 63 65 63 63 65 87 87 90 88 88 91 63 63 65 88 88 91 64 64 66 64 64 66 88 88 91 89 89 92 64 64 66 89 89 92 65 65 67 65 65 67 89 89 92 90 90 93 65 65 67 90 90 93 66 66 68 66 66 68 90 90 93 91 91 94 66 66 68 91 91 94 67 67 69 67 67 69 91 91 94 92 92 95 67 67 69 92 92 95 68 68 70 68 68 70 92 92 95 93 93 96 68 68 70 93 93 96 69 69 71 69 69 71 93 93 96 94 94 97 69 69 71 94 94 97 70 70 72 70 70 72 94 94 97 95 95 98 70 70 72 95 95 98 71 71 73 71 71 73 95 95 98 72 72 99 71 71 73 72 72 99 48 48 74 72 72 75 96 96 100 97 97 101 72 72 75 97 97 101 73 73 76 73 73 76 97 97 101 98 98 102 73 73 76 98 98 102 74 74 77 74 74 77 98 98 102 99 99 103 74 74 77 99 99 103 75 75 78 75 75 78 99 99 103 100 100 104 75 75 78 100 100 104 76 76 79 76 76 79 100 100 104 101 101 105 76 76 79 101 101 105 77 77 80 77 77 80 101 101 105 102 102 106 77 77 80 102 102 106 78 78 81 78 78 81 102 102 106 103 103 107 78 78 81 103 103 107 79 79 82 79 79 82 103 103 107 104 104 108 79 79 82 104 104 108 80 80 83 80 80 83 104 104 108 105 105 109 80 80 83 105 105 109 81 81 84 81 81 84 105 105 109 106 106 110 81 81 84 106 106 110 82 82 85 82 82 85 106 106 110 107 107 111 82 82 85 107 107 111 83 83 86 83 83 86 107 107 111 108 108 112 83 83 86 108 108 112 84 84 87 84 84 87 108 108 112 109 109 113 84 84 87 109 109 113 85 85 88 85 85 88 109 109 113 110 110 114 85 85 88 110 110 114 86 86 89 86 86 89 110 110 114 111 111 115 86 86 89 111 111 115 87 87 90 87 87 90 111 111 115 112 112 116 87 87 90 112 112 116 88 88 91 88 88 91 112 112 116 113 113 117 88 88 91 113 113 117 89 89 92 89 89 92 113 113 117 114 114 118 89 89 92 114 114 118 90 90 93 90 90 93 114 114 118 115 115 119 90 90 93 115 115 119 91 91 94 91 91 94 115 115 119 116 116 120 91 91 94 116 116 120 92 92 95 92 92 95 116 116 120 117 117 121 92 92 95 117 117 121 93 93 96 93 93 96 117 117 121 118 118 122 93 93 96 118 118 122 94 94 97 94 94 97 118 118 122 119 119 123 94 94 97 119 119 123 95 95 98 95 95 98 119 119 123 96 96 124 95 95 98 96 96 124 72 72 99 96 96 100 120 120 125 121 121 126 96 96 100 121 121 126 97 97 101 97 97 101 121 121 126 122 122 127 97 97 101 122 122 127 98 98 102 98 98 102 122 122 127 123 123 128 98 98 102 123 123 128 99 99 103 99 99 103 123 123 128 124 124 129 99 99 103 124 124 129 100 100 104 100 100 104 124 124 129 125 125 130 100 100 104 125 125 130 101 101 105 101 101 105 125 125 130 126 126 131 101 101 105 126 126 131 102 102 106 102 102 106 126 126 131 127 127 132 102 102 106 127 127 132 103 103 107 103 103 107 127 127 132 128 128 133 103 103 107 128 128 133 104 104 108 104 104 108 128 128 133 129 129 134 104 104 108 129 129 134 105 105 109 105 105 109 129 129 134 130 130 135 105 105 109 130 130 135 106 106 110 106 106 110 130 130 135 131 131 136 106 106 110 131 131 136 107 107 111 107 107 111 131 131 136 132 132 137 107 107 111 132 132 137 108 108 112 108 108 112 132 132 137 133 133 138 108 108 112 133 133 138 109 109 113 109 109 113 133 133 138 134 134 139 109 109 113 134 134 139 110 110 114 110 110 114 134 134 139 135 135 140 110 110 114 135 135 140 111 111 115 111 111 115 135 135 140 136 136 141 111 111 115 136 136 141 112 112 116 112 112 116 136 136 141 137 137 142 112 112 116 137 137 142 113 113 117 113 113 117 137 137 142 138 138 143 113 113 117 138 138 143 114 114 118 114 114 118 138 138 143 139 139 144 114 114 118 139 139 144 115 115 119 115 115 119 139 139 144 140 140 145 115 115 119 140 140 145 116 116 120 116 116 120 140 140 145 141 141 146 116 116 120 141 141 146 117 117 121 117 117 121 141 141 146 142 142 147 117 117 121 142 142 147 118 118 122 118 118 122 142 142 147 143 143 148 118 118 122 143 143 148 119 119 123 119 119 123 143 143 148 120 120 149 119 119 123 120 120 149 96 96 124 120 120 125 144 144 150 145 145 151 120 120 125 145 145 151 121 121 126 121 121 126 145 145 151 146 146 152 121 121 126 146 146 152 122 122 127 122 122 127 146 146 152 147 147 153 122 122 127 147 147 153 123 123 128 123 123 128 147 147 153 148 148 154 123 123 128 148 148 154 124 124 129 124 124 129 148 148 154 149 149 155 124 124 129 149 149 155 125 125 130 125 125 130 149 149 155 150 150 156 125 125 130 150 150 156 126 126 131 126 126 131 150 150 156 151 151 157 126 126 131 151 151 157 127 127 132 127 127 132 151 151 157 152 152 158 127 127 132 152 152 158 128 128 133 128 128 133 152 152 158 153 153 159 128 128 133 153 153 159 129 129 134 129 129 134 153 153 159 154 154 160 129 129 134 154 154 160 130 130 135 130 130 135 154 154 160 155 155 161 130 130 135 155 155 161 131 131 136 131 131 136 155 155 161 156 156 162 131 131 136 156 156 162 132 132 137 132 132 137 156 156 162 157 157 163 132 132 137 157 157 163 133 133 138 133 133 138 157 157 163 158 158 164 133 133 138 158 158 164 134 134 139 134 134 139 158 158 164 159 159 165 134 134 139 159 159 165 135 135 140 135 135 140 159 159 165 160 160 166 135 135 140 160 160 166 136 136 141 136 136 141 160 160 166 161 161 167 136 136 141 161 161 167 137 137 142 137 137 142 161 161 167 162 162 168 137 137 142 162 162 168 138 138 143 138 138 143 162 162 168 163 163 169 138 138 143 163 163 169 139 139 144 139 139 144 163 163 169 164 164 170 139 139 144 164 164 170 140 140 145 140 140 145 164 164 170 165 165 171 140 140 145 165 165 171 141 141 146 141 141 146 165 165 171 166 166 172 141 141 146 166 166 172 142 142 147 142 142 147 166 166 172 167 167 173 142 142 147 167 167 173 143 143 148 143 143 148 167 167 173 144 144 174 143 143 148 144 144 174 120 120 149 144 144 150 168 168 175 169 169 176 144 144 150 169 169 176 145 145 151 145 145 151 169 169 176 170 170 177 145 145 151 170 170 177 146 146 152 146 146 152 170 170 177 171 171 178 146 146 152 171 171 178 147 147 153 147 147 153 171 171 178 172 172 179 147 147 153 172 172 179 148 148 154 148 148 154 172 172 179 173 173 180 148 148 154 173 173 180 149 149 155 149 149 155 173 173 180 174 174 181 149 149 155 174 174 181 150 150 156 150 150 156 174 174 181 175 175 182 150 150 156 175 175 182 151 151 157 151 151 157 175 175 182 176 176 183 151 151 157 176 176 183 152 152 158 152 152 158 176 176 183 177 177 184 152 152 158 177 177 184 153 153 159 153 153 159 177 177 184 178 178 185 153 153 159 178 178 185 154 154 160 154 154 160 178 178 185 179 179 186 154 154 160 179 179 186 155 155 161 155 155 161 179 179 186 180 180 187 155 155 161 180 180 187 156 156 162 156 156 162 180 180 187 181 181 188 156 156 162 181 181 188 157 157 163 157 157 163 181 181 188 182 182 189 157 157 163 182 182 189 158 158 164 158 158 164 182 182 189 183 183 190 158 158 164 183 183 190 159 159 165 159 159 165 183 183 190 184 184 191 159 159 165 184 184 191 160 160 166 160 160 166 184 184 191 185 185 192 160 160 166 185 185 192 161 161 167 161 161 167 185 185 192 186 186 193 161 161 167 186 186 193 162 162 168 162 162 168 186 186 193 187 187 194 162 162 168 187 187 194 163 163 169 163 163 169 187 187 194 188 188 195 163 163 169 188 188 195 164 164 170 164 164 170 188 188 195 189 189 196 164 164 170 189 189 196 165 165 171 165 165 171 189 189 196 190 190 197 165 165 171 190 190 197 166 166 172 166 166 172 190 190 197 191 191 198 166 166 172 191 191 198 167 167 173 167 167 173 191 191 198 168 168 199 167 167 173 168 168 199 144 144 174 168 168 175 192 192 200 193 193 201 168 168 175 193 193 201 169 169 176 169 169 176 193 193 201 194 194 202 169 169 176 194 194 202 170 170 177 170 170 177 194 194 202 195 195 203 170 170 177 195 195 203 171 171 178 171 171 178 195 195 203 196 196 204 171 171 178 196 196 204 172 172 179 172 172 179 196 196 204 197 197 205 172 172 179 197 197 205 173 173 180 173 173 180 197 197 205 198 198 206 173 173 180 198 198 206 174 174 181 174 174 181 198 198 206 199 199 207 174 174 181 199 199 207 175 175 182 175 175 182 199 199 207 200 200 208 175 175 182 200 200 208 176 176 183 176 176 183 200 200 208 201 201 209 176 176 183 201 201 209 177 177 184 177 177 184 201 201 209 202 202 210 177 177 184 202 202 210 178 178 185 178 178 185 202 202 210 203 203 211 178 178 185 203 203 211 179 179 186 179 179 186 203 203 211 204 204 212 179 179 186 204 204 212 180 180 187 180 180 187 204 204 212 205 205 213 180 180 187 205 205 213 181 181 188 181 181 188 205 205 213 206 206 214 181 181 188 206 206 214 182 182 189 182 182 189 206 206 214 207 207 215 182 182 189 207 207 215 183 183 190 183 183 190 207 207 215 208 208 216 183 183 190 208 208 216 184 184 191 184 184 191 208 208 216 209 209 217 184 184 191 209 209 217 185 185 192 185 185 192 209 209 217 210 210 218 185 185 192 210 210 218 186 186 193 186 186 193 210 210 218 211 211 219 186 186 193 211 211 219 187 187 194 187 187 194 211 211 219 212 212 220 187 187 194 212 212 220 188 188 195 188 188 195 212 212 220 213 213 221 188 188 195 213 213 221 189 189 196 189 189 196 213 213 221 214 214 222 189 189 196 214 214 222 190 190 197 190 190 197 214 214 222 215 215 223 190 190 197 215 215 223 191 191 198 191 191 198 215 215 223 192 192 224 191 191 198 192 192 224 168 168 199 192 192 200 216 216 225 217 217 226 192 192 200 217 217 226 193 193 201 193 193 201 217 217 226 218 218 227 193 193 201 218 218 227 194 194 202 194 194 202 218 218 227 219 219 228 194 194 202 219 219 228 195 195 203 195 195 203 219 219 228 220 220 229 195 195 203 220 220 229 196 196 204 196 196 204 220 220 229 221 221 230 196 196 204 221 221 230 197 197 205 197 197 205 221 221 230 222 222 231 197 197 205 222 222 231 198 198 206 198 198 206 222 222 231 223 223 232 198 198 206 223 223 232 199 199 207 199 199 207 223 223 232 224 224 233 199 199 207 224 224 233 200 200 208 200 200 208 224 224 233 225 225 234 200 200 208 225 225 234 201 201 209 201 201 209 225 225 234 226 226 235 201 201 209 226 226 235 202 202 210 202 202 210 226 226 235 227 227 236 202 202 210 227 227 236 203 203 211 203 203 211 227 227 236 228 228 237 203 203 211 228 228 237 204 204 212 204 204 212 228 228 237 229 229 238 204 204 212 229 229 238 205 205 213 205 205 213 229 229 238 230 230 239 205 205 213 230 230 239 206 206 214 206 206 214 230 230 239 231 231 240 206 206 214 231 231 240 207 207 215 207 207 215 231 231 240 232 232 241 207 207 215 232 232 241 208 208 216 208 208 216 232 232 241 233 233 242 208 208 216 233 233 242 209 209 217 209 209 217 233 233 242 234 234 243 209 209 217 234 234 243 210 210 218 210 210 218 234 234 243 235 235 244 210 210 218 235 235 244 211 211 219 211 211 219 235 235 244 236 236 245 211 211 219 236 236 245 212 212 220 212 212 220 236 236 245 237 237 246 212 212 220 237 237 246 213 213 221 213 213 221 237 237 246 238 238 247 213 213 221 238 238 247 214 214 222 214 214 222 238 238 247 239 239 248 214 214 222 239 239 248 215 215 223 215 215 223 239 239 248 216 216 249 215 215 223 216 216 249 192 192 224 216 216 225 240 240 250 241 241 251 216 216 225 241 241 251 217 217 226 217 217 226 241 241 251 242 242 252 217 217 226 242 242 252 218 218 227 218 218 227 242 242 252 243 243 253 218 218 227 243 243 253 219 219 228 219 219 228 243 243 253 244 244 254 219 219 228 244 244 254 220 220 229 220 220 229 244 244 254 245 245 255 220 220 229 245 245 255 221 221 230 221 221 230 245 245 255 246 246 256 221 221 230 246 246 256 222 222 231 222 222 231 246 246 256 247 247 257 222 222 231 247 247 257 223 223 232 223 223 232 247 247 257 248 248 258 223 223 232 248 248 258 224 224 233 224 224 233 248 248 258 249 249 259 224 224 233 249 249 259 225 225 234 225 225 234 249 249 259 250 250 260 225 225 234 250 250 260 226 226 235 226 226 235 250 250 260 251 251 261 226 226 235 251 251 261 227 227 236 227 227 236 251 251 261 252 252 262 227 227 236 252 252 262 228 228 237 228 228 237 252 252 262 253 253 263 228 228 237 253 253 263 229 229 238 229 229 238 253 253 263 254 254 264 229 229 238 254 254 264 230 230 239 230 230 239 254 254 264 255 255 265 230 230 239 255 255 265 231 231 240 231 231 240 255 255 265 256 256 266 231 231 240 256 256 266 232 232 241 232 232 241 256 256 266 257 257 267 232 232 241 257 257 267 233 233 242 233 233 242 257 257 267 258 258 268 233 233 242 258 258 268 234 234 243 234 234 243 258 258 268 259 259 269 234 234 243 259 259 269 235 235 244 235 235 244 259 259 269 260 260 270 235 235 244 260 260 270 236 236 245 236 236 245 260 260 270 261 261 271 236 236 245 261 261 271 237 237 246 237 237 246 261 261 271 262 262 272 237 237 246 262 262 272 238 238 247 238 238 247 262 262 272 263 263 273 238 238 247 263 263 273 239 239 248 239 239 248 263 263 273 240 240 274 239 239 248 240 240 274 216 216 249 240 240 250 264 264 275 265 265 276 240 240 250 265 265 276 241 241 251 241 241 251 265 265 276 266 266 277 241 241 251 266 266 277 242 242 252 242 242 252 266 266 277 267 267 278 242 242 252 267 267 278 243 243 253 243 243 253 267 267 278 268 268 279 243 243 253 268 268 279 244 244 254 244 244 254 268 268 279 269 269 280 244 244 254 269 269 280 245 245 255 245 245 255 269 269 280 270 270 281 245 245 255 270 270 281 246 246 256 246 246 256 270 270 281 271 271 282 246 246 256 271 271 282 247 247 257 247 247 257 271 271 282 272 272 283 247 247 257 272 272 283 248 248 258 248 248 258 272 272 283 273 273 284 248 248 258 273 273 284 249 249 259 249 249 259 273 273 284 274 274 285 249 249 259 274 274 285 250 250 260 250 250 260 274 274 285 275 275 286 250 250 260 275 275 286 251 251 261 251 251 261 275 275 286 276 276 287 251 251 261 276 276 287 252 252 262 252 252 262 276 276 287 277 277 288 252 252 262 277 277 288 253 253 263 253 253 263 277 277 288 278 278 289 253 253 263 278 278 289 254 254 264 254 254 264 278 278 289 279 279 290 254 254 264 279 279 290 255 255 265 255 255 265 279 279 290 280 280 291 255 255 265 280 280 291 256 256 266 256 256 266 280 280 291 281 281 292 256 256 266 281 281 292 257 257 267 257 257 267 281 281 292 282 282 293 257 257 267 282 282 293 258 258 268 258 258 268 282 282 293 283 283 294 258 258 268 283 283 294 259 259 269 259 259 269 283 283 294 284 284 295 259 259 269 284 284 295 260 260 270 260 260 270 284 284 295 285 285 296 260 260 270 285 285 296 261 261 271 261 261 271 285 285 296 286 286 297 261 261 271 286 286 297 262 262 272 262 262 272 286 286 297 287 287 298 262 262 272 287 287 298 263 263 273 263 263 273 287 287 298 264 264 299 263 263 273 264 264 299 240 240 274 264 264 275 288 288 300 289 289 301 264 264 275 289 289 301 265 265 276 265 265 276 289 289 301 290 290 302 265 265 276 290 290 302 266 266 277 266 266 277 290 290 302 291 291 303 266 266 277 291 291 303 267 267 278 267 267 278 291 291 303 292 292 304 267 267 278 292 292 304 268 268 279 268 268 279 292 292 304 293 293 305 268 268 279 293 293 305 269 269 280 269 269 280 293 293 305 294 294 306 269 269 280 294 294 306 270 270 281 270 270 281 294 294 306 295 295 307 270 270 281 295 295 307 271 271 282 271 271 282 295 295 307 296 296 308 271 271 282 296 296 308 272 272 283 272 272 283 296 296 308 297 297 309 272 272 283 297 297 309 273 273 284 273 273 284 297 297 309 298 298 310 273 273 284 298 298 310 274 274 285 274 274 285 298 298 310 299 299 311 274 274 285 299 299 311 275 275 286 275 275 286 299 299 311 300 300 312 275 275 286 300 300 312 276 276 287 276 276 287 300 300 312 301 301 313 276 276 287 301 301 313 277 277 288 277 277 288 301 301 313 302 302 314 277 277 288 302 302 314 278 278 289 278 278 289 302 302 314 303 303 315 278 278 289 303 303 315 279 279 290 279 279 290 303 303 315 304 304 316 279 279 290 304 304 316 280 280 291 280 280 291 304 304 316 305 305 317 280 280 291 305 305 317 281 281 292 281 281 292 305 305 317 306 306 318 281 281 292 306 306 318 282 282 293 282 282 293 306 306 318 307 307 319 282 282 293 307 307 319 283 283 294 283 283 294 307 307 319 308 308 320 283 283 294 308 308 320 284 284 295 284 284 295 308 308 320 309 309 321 284 284 295 309 309 321 285 285 296 285 285 296 309 309 321 310 310 322 285 285 296 310 310 322 286 286 297 286 286 297 310 310 322 311 311 323 286 286 297 311 311 323 287 287 298 287 287 298 311 311 323 288 288 324 287 287 298 288 288 324 264 264 299 288 288 300 312 312 325 313 313 326 288 288 300 313 313 326 289 289 301 289 289 301 313 313 326 314 314 327 289 289 301 314 314 327 290 290 302 290 290 302 314 314 327 315 315 328 290 290 302 315 315 328 291 291 303 291 291 303 315 315 328 316 316 329 291 291 303 316 316 329 292 292 304 292 292 304 316 316 329 317 317 330 292 292 304 317 317 330 293 293 305 293 293 305 317 317 330 318 318 331 293 293 305 318 318 331 294 294 306 294 294 306 318 318 331 319 319 332 294 294 306 319 319 332 295 295 307 295 295 307 319 319 332 320 320 333 295 295 307 320 320 333 296 296 308 296 296 308 320 320 333 321 321 334 296 296 308 321 321 334 297 297 309 297 297 309 321 321 334 322 322 335 297 297 309 322 322 335 298 298 310 298 298 310 322 322 335 323 323 336 298 298 310 323 323 336 299 299 311 299 299 311 323 323 336 324 324 337 299 299 311 324 324 337 300 300 312 300 300 312 324 324 337 325 325 338 300 300 312 325 325 338 301 301 313 301 301 313 325 325 338 326 326 339 301 301 313 326 326 339 302 302 314 302 302 314 326 326 339 327 327 340 302 302 314 327 327 340 303 303 315 303 303 315 327 327 340 328 328 341 303 303 315 328 328 341 304 304 316 304 304 316 328 328 341 329 329 342 304 304 316 329 329 342 305 305 317 305 305 317 329 329 342 330 330 343 305 305 317 330 330 343 306 306 318 306 306 318 330 330 343 331 331 344 306 306 318 331 331 344 307 307 319 307 307 319 331 331 344 332 332 345 307 307 319 332 332 345 308 308 320 308 308 320 332 332 345 333 333 346 308 308 320 333 333 346 309 309 321 309 309 321 333 333 346 334 334 347 309 309 321 334 334 347 310 310 322 310 310 322 334 334 347 335 335 348 310 310 322 335 335 348 311 311 323 311 311 323 335 335 348 312 312 349 311 311 323 312 312 349 288 288 324 312 312 325 336 336 350 337 337 351 312 312 325 337 337 351 313 313 326 313 313 326 337 337 351 338 338 352 313 313 326 338 338 352 314 314 327 314 314 327 338 338 352 339 339 353 314 314 327 339 339 353 315 315 328 315 315 328 339 339 353 340 340 354 315 315 328 340 340 354 316 316 329 316 316 329 340 340 354 341 341 355 316 316 329 341 341 355 317 317 330 317 317 330 341 341 355 342 342 356 317 317 330 342 342 356 318 318 331 318 318 331 342 342 356 343 343 357 318 318 331 343 343 357 319 319 332 319 319 332 343 343 357 344 344 358 319 319 332 344 344 358 320 320 333 320 320 333 344 344 358 345 345 359 320 320 333 345 345 359 321 321 334 321 321 334 345 345 359 346 346 360 321 321 334 346 346 360 322 322 335 322 322 335 346 346 360 347 347 361 322 322 335 347 347 361 323 323 336 323 323 336 347 347 361 348 348 362 323 323 336 348 348 362 324 324 337 324 324 337 348 348 362 349 349 363 324 324 337 349 349 363 325 325 338 325 325 338 349 349 363 350 350 364 325 325 338 350 350 364 326 326 339 326 326 339 350 350 364 351 351 365 326 326 339 351 351 365 327 327 340 327 327 340 351 351 365 352 352 366 327 327 340 352 352 366 328 328 341 328 328 341 352 352 366 353 353 367 328 328 341 353 353 367 329 329 342 329 329 342 353 353 367 354 354 368 329 329 342 354 354 368 330 330 343 330 330 343 354 354 368 355 355 369 330 330 343 355 355 369 331 331 344 331 331 344 355 355 369 356 356 370 331 331 344 356 356 370 332 332 345 332 332 345 356 356 370 357 357 371 332 332 345 357 357 371 333 333 346 333 333 346 357 357 371 358 358 372 333 333 346 358 358 372 334 334 347 334 334 347 358 358 372 359 359 373 334 334 347 359 359 373 335 335 348 335 335 348 359 359 373 336 336 374 335 335 348 336 336 374 312 312 349 336 336 350 360 360 375 361 361 376 336 336 350 361 361 376 337 337 351 337 337 351 361 361 376 362 362 377 337 337 351 362 362 377 338 338 352 338 338 352 362 362 377 363 363 378 338 338 352 363 363 378 339 339 353 339 339 353 363 363 378 364 364 379 339 339 353 364 364 379 340 340 354 340 340 354 364 364 379 365 365 380 340 340 354 365 365 380 341 341 355 341 341 355 365 365 380 366 366 381 341 341 355 366 366 381 342 342 356 342 342 356 366 366 381 367 367 382 342 342 356 367 367 382 343 343 357 343 343 357 367 367 382 368 368 383 343 343 357 368 368 383 344 344 358 344 344 358 368 368 383 369 369 384 344 344 358 369 369 384 345 345 359 345 345 359 369 369 384 370 370 385 345 345 359 370 370 385 346 346 360 346 346 360 370 370 385 371 371 386 346 346 360 371 371 386 347 347 361 347 347 361 371 371 386 372 372 387 347 347 361 372 372 387 348 348 362 348 348 362 372 372 387 373 373 388 348 348 362 373 373 388 349 349 363 349 349 363 373 373 388 374 374 389 349 349 363 374 374 389 350 350 364 350 350 364 374 374 389 375 375 390 350 350 364 375 375 390 351 351 365 351 351 365 375 375 390 376 376 391 351 351 365 376 376 391 352 352 366 352 352 366 376 376 391 377 377 392 352 352 366 377 377 392 353 353 367 353 353 367 377 377 392 378 378 393 353 353 367 378 378 393 354 354 368 354 354 368 378 378 393 379 379 394 354 354 368 379 379 394 355 355 369 355 355 369 379 379 394 380 380 395 355 355 369 380 380 395 356 356 370 356 356 370 380 380 395 381 381 396 356 356 370 381 381 396 357 357 371 357 357 371 381 381 396 382 382 397 357 357 371 382 382 397 358 358 372 358 358 372 382 382 397 383 383 398 358 358 372 383 383 398 359 359 373 359 359 373 383 383 398 360 360 399 359 359 373 360 360 399 336 336 374 360 360 375 384 384 400 385 385 401 360 360 375 385 385 401 361 361 376 361 361 376 385 385 401 386 386 402 361 361 376 386 386 402 362 362 377 362 362 377 386 386 402 387 387 403 362 362 377 387 387 403 363 363 378 363 363 378 387 387 403 388 388 404 363 363 378 388 388 404 364 364 379 364 364 379 388 388 404 389 389 405 364 364 379 389 389 405 365 365 380 365 365 380 389 389 405 390 390 406 365 365 380 390 390 406 366 366 381 366 366 381 390 390 406 391 391 407 366 366 381 391 391 407 367 367 382 367 367 382 391 391 407 392 392 408 367 367 382 392 392 408 368 368 383 368 368 383 392 392 408 393 393 409 368 368 383 393 393 409 369 369 384 369 369 384 393 393 409 394 394 410 369 369 384 394 394 410 370 370 385 370 370 385 394 394 410 395 395 411 370 370 385 395 395 411 371 371 386 371 371 386 395 395 411 396 396 412 371 371 386 396 396 412 372 372 387 372 372 387 396 396 412 397 397 413 372 372 387 397 397 413 373 373 388 373 373 388 397 397 413 398 398 414 373 373 388 398 398 414 374 374 389 374 374 389 398 398 414 399 399 415 374 374 389 399 399 415 375 375 390 375 375 390 399 399 415 400 400 416 375 375 390 400 400 416 376 376 391 376 376 391 400 400 416 401 401 417 376 376 391 401 401 417 377 377 392 377 377 392 401 401 417 402 402 418 377 377 392 402 402 418 378 378 393 378 378 393 402 402 418 403 403 419 378 378 393 403 403 419 379 379 394 379 379 394 403 403 419 404 404 420 379 379 394 404 404 420 380 380 395 380 380 395 404 404 420 405 405 421 380 380 395 405 405 421 381 381 396 381 381 396 405 405 421 406 406 422 381 381 396 406 406 422 382 382 397 382 382 397 406 406 422 407 407 423 382 382 397 407 407 423 383 383 398 383 383 398 407 407 423 384 384 424 383 383 398 384 384 424 360 360 399 384 384 400 408 408 425 409 409 426 384 384 400 409 409 426 385 385 401 385 385 401 409 409 426 410 410 427 385 385 401 410 410 427 386 386 402 386 386 402 410 410 427 411 411 428 386 386 402 411 411 428 387 387 403 387 387 403 411 411 428 412 412 429 387 387 403 412 412 429 388 388 404 388 388 404 412 412 429 413 413 430 388 388 404 413 413 430 389 389 405 389 389 405 413 413 430 414 414 431 389 389 405 414 414 431 390 390 406 390 390 406 414 414 431 415 415 432 390 390 406 415 415 432 391 391 407 391 391 407 415 415 432 416 416 433 391 391 407 416 416 433 392 392 408 392 392 408 416 416 433 417 417 434 392 392 408 417 417 434 393 393 409 393 393 409 417 417 434 418 418 435 393 393 409 418 418 435 394 394 410 394 394 410 418 418 435 419 419 436 394 394 410 419 419 436 395 395 411 395 395 411 419 419 436 420 420 437 395 395 411 420 420 437 396 396 412 396 396 412 420 420 437 421 421 438 396 396 412 421 421 438 397 397 413 397 397 413 421 421 438 422 422 439 397 397 413 422 422 439 398 398 414 398 398 414 422 422 439 423 423 440 398 398 414 423 423 440 399 399 415 399 399 415 423 423 440 424 424 441 399 399 415 424 424 441 400 400 416 400 400 416 424 424 441 425 425 442 400 400 416 425 425 442 401 401 417 401 401 417 425 425 442 426 426 443 401 401 417 426 426 443 402 402 418 402 402 418 426 426 443 427 427 444 402 402 418 427 427 444 403 403 419 403 403 419 427 427 444 428 428 445 403 403 419 428 428 445 404 404 420 404 404 420 428 428 445 429 429 446 404 404 420 429 429 446 405 405 421 405 405 421 429 429 446 430 430 447 405 405 421 430 430 447 406 406 422 406 406 422 430 430 447 431 431 448 406 406 422 431 431 448 407 407 423 407 407 423 431 431 448 408 408 449 407 407 423 408 408 449 384 384 424 408 408 425 432 432 450 433 433 451 408 408 425 433 433 451 409 409 426 409 409 426 433 433 451 434 434 452 409 409 426 434 434 452 410 410 427 410 410 427 434 434 452 435 435 453 410 410 427 435 435 453 411 411 428 411 411 428 435 435 453 436 436 454 411 411 428 436 436 454 412 412 429 412 412 429 436 436 454 437 437 455 412 412 429 437 437 455 413 413 430 413 413 430 437 437 455 438 438 456 413 413 430 438 438 456 414 414 431 414 414 431 438 438 456 439 439 457 414 414 431 439 439 457 415 415 432 415 415 432 439 439 457 440 440 458 415 415 432 440 440 458 416 416 433 416 416 433 440 440 458 441 441 459 416 416 433 441 441 459 417 417 434 417 417 434 441 441 459 442 442 460 417 417 434 442 442 460 418 418 435 418 418 435 442 442 460 443 443 461 418 418 435 443 443 461 419 419 436 419 419 436 443 443 461 444 444 462 419 419 436 444 444 462 420 420 437 420 420 437 444 444 462 445 445 463 420 420 437 445 445 463 421 421 438 421 421 438 445 445 463 446 446 464 421 421 438 446 446 464 422 422 439 422 422 439 446 446 464 447 447 465 422 422 439 447 447 465 423 423 440 423 423 440 447 447 465 448 448 466 423 423 440 448 448 466 424 424 441 424 424 441 448 448 466 449 449 467 424 424 441 449 449 467 425 425 442 425 425 442 449 449 467 450 450 468 425 425 442 450 450 468 426 426 443 426 426 443 450 450 468 451 451 469 426 426 443 451 451 469 427 427 444 427 427 444 451 451 469 452 452 470 427 427 444 452 452 470 428 428 445 428 428 445 452 452 470 453 453 471 428 428 445 453 453 471 429 429 446 429 429 446 453 453 471 454 454 472 429 429 446 454 454 472 430 430 447 430 430 447 454 454 472 455 455 473 430 430 447 455 455 473 431 431 448 431 431 448 455 455 473 432 432 474 431 431 448 432 432 474 408 408 449 432 432 450 456 456 475 457 457 476 432 432 450 457 457 476 433 433 451 433 433 451 457 457 476 458 458 477 433 433 451 458 458 477 434 434 452 434 434 452 458 458 477 459 459 478 434 434 452 459 459 478 435 435 453 435 435 453 459 459 478 460 460 479 435 435 453 460 460 479 436 436 454 436 436 454 460 460 479 461 461 480 436 436 454 461 461 480 437 437 455 437 437 455 461 461 480 462 462 481 437 437 455 462 462 481 438 438 456 438 438 456 462 462 481 463 463 482 438 438 456 463 463 482 439 439 457 439 439 457 463 463 482 464 464 483 439 439 457 464 464 483 440 440 458 440 440 458 464 464 483 465 465 484 440 440 458 465 465 484 441 441 459 441 441 459 465 465 484 466 466 485 441 441 459 466 466 485 442 442 460 442 442 460 466 466 485 467 467 486 442 442 460 467 467 486 443 443 461 443 443 461 467 467 486 468 468 487 443 443 461 468 468 487 444 444 462 444 444 462 468 468 487 469 469 488 444 444 462 469 469 488 445 445 463 445 445 463 469 469 488 470 470 489 445 445 463 470 470 489 446 446 464 446 446 464 470 470 489 471 471 490 446 446 464 471 471 490 447 447 465 447 447 465 471 471 490 472 472 491 447 447 465 472 472 491 448 448 466 448 448 466 472 472 491 473 473 492 448 448 466 473 473 492 449 449 467 449 449 467 473 473 492 474 474 493 449 449 467 474 474 493 450 450 468 450 450 468 474 474 493 475 475 494 450 450 468 475 475 494 451 451 469 451 451 469 475 475 494 476 476 495 451 451 469 476 476 495 452 452 470 452 452 470 476 476 495 477 477 496 452 452 470 477 477 496 453 453 471 453 453 471 477 477 496 478 478 497 453 453 471 478 478 497 454 454 472 454 454 472 478 478 497 479 479 498 454 454 472 479 479 498 455 455 473 455 455 473 479 479 498 456 456 499 455 455 473 456 456 499 432 432 474 456 456 475 480 480 500 481 481 501 456 456 475 481 481 501 457 457 476 457 457 476 481 481 501 482 482 502 457 457 476 482 482 502 458 458 477 458 458 477 482 482 502 483 483 503 458 458 477 483 483 503 459 459 478 459 459 478 483 483 503 484 484 504 459 459 478 484 484 504 460 460 479 460 460 479 484 484 504 485 485 505 460 460 479 485 485 505 461 461 480 461 461 480 485 485 505 486 486 506 461 461 480 486 486 506 462 462 481 462 462 481 486 486 506 487 487 507 462 462 481 487 487 507 463 463 482 463 463 482 487 487 507 488 488 508 463 463 482 488 488 508 464 464 483 464 464 483 488 488 508 489 489 509 464 464 483 489 489 509 465 465 484 465 465 484 489 489 509 490 490 510 465 465 484 490 490 510 466 466 485 466 466 485 490 490 510 491 491 511 466 466 485 491 491 511 467 467 486 467 467 486 491 491 511 492 492 512 467 467 486 492 492 512 468 468 487 468 468 487 492 492 512 493 493 513 468 468 487 493 493 513 469 469 488 469 469 488 493 493 513 494 494 514 469 469 488 494 494 514 470 470 489 470 470 489 494 494 514 495 495 515 470 470 489 495 495 515 471 471 490 471 471 490 495 495 515 496 496 516 471 471 490 496 496 516 472 472 491 472 472 491 496 496 516 497 497 517 472 472 491 497 497 517 473 473 492 473 473 492 497 497 517 498 498 518 473 473 492 498 498 518 474 474 493 474 474 493 498 498 518 499 499 519 474 474 493 499 499 519 475 475 494 475 475 494 499 499 519 500 500 520 475 475 494 500 500 520 476 476 495 476 476 495 500 500 520 501 501 521 476 476 495 501 501 521 477 477 496 477 477 496 501 501 521 502 502 522 477 477 496 502 502 522 478 478 497 478 478 497 502 502 522 503 503 523 478 478 497 503 503 523 479 479 498 479 479 498 503 503 523 480 480 524 479 479 498 480 480 524 456 456 499 480 480 500 504 504 525 505 505 526 480 480 500 505 505 526 481 481 501 481 481 501 505 505 526 506 506 527 481 481 501 506 506 527 482 482 502 482 482 502 506 506 527 507 507 528 482 482 502 507 507 528 483 483 503 483 483 503 507 507 528 508 508 529 483 483 503 508 508 529 484 484 504 484 484 504 508 508 529 509 509 530 484 484 504 509 509 530 485 485 505 485 485 505 509 509 530 510 510 531 485 485 505 510 510 531 486 486 506 486 486 506 510 510 531 511 511 532 486 486 506 511 511 532 487 487 507 487 487 507 511 511 532 512 512 533 487 487 507 512 512 533 488 488 508 488 488 508 512 512 533 513 513 534 488 488 508 513 513 534 489 489 509 489 489 509 513 513 534 514 514 535 489 489 509 514 514 535 490 490 510 490 490 510 514 514 535 515 515 536 490 490 510 515 515 536 491 491 511 491 491 511 515 515 536 516 516 537 491 491 511 516 516 537 492 492 512 492 492 512 516 516 537 517 517 538 492 492 512 517 517 538 493 493 513 493 493 513 517 517 538 518 518 539 493 493 513 518 518 539 494 494 514 494 494 514 518 518 539 519 519 540 494 494 514 519 519 540 495 495 515 495 495 515 519 519 540 520 520 541 495 495 515 520 520 541 496 496 516 496 496 516 520 520 541 521 521 542 496 496 516 521 521 542 497 497 517 497 497 517 521 521 542 522 522 543 497 497 517 522 522 543 498 498 518 498 498 518 522 522 543 523 523 544 498 498 518 523 523 544 499 499 519 499 499 519 523 523 544 524 524 545 499 499 519 524 524 545 500 500 520 500 500 520 524 524 545 525 525 546 500 500 520 525 525 546 501 501 521 501 501 521 525 525 546 526 526 547 501 501 521 526 526 547 502 502 522 502 502 522 526 526 547 527 527 548 502 502 522 527 527 548 503 503 523 503 503 523 527 527 548 504 504 549 503 503 523 504 504 549 480 480 524 504 504 525 528 528 550 529 529 551 504 504 525 529 529 551 505 505 526 505 505 526 529 529 551 530 530 552 505 505 526 530 530 552 506 506 527 506 506 527 530 530 552 531 531 553 506 506 527 531 531 553 507 507 528 507 507 528 531 531 553 532 532 554 507 507 528 532 532 554 508 508 529 508 508 529 532 532 554 533 533 555 508 508 529 533 533 555 509 509 530 509 509 530 533 533 555 534 534 556 509 509 530 534 534 556 510 510 531 510 510 531 534 534 556 535 535 557 510 510 531 535 535 557 511 511 532 511 511 532 535 535 557 536 536 558 511 511 532 536 536 558 512 512 533 512 512 533 536 536 558 537 537 559 512 512 533 537 537 559 513 513 534 513 513 534 537 537 559 538 538 560 513 513 534 538 538 560 514 514 535 514 514 535 538 538 560 539 539 561 514 514 535 539 539 561 515 515 536 515 515 536 539 539 561 540 540 562 515 515 536 540 540 562 516 516 537 516 516 537 540 540 562 541 541 563 516 516 537 541 541 563 517 517 538 517 517 538 541 541 563 542 542 564 517 517 538 542 542 564 518 518 539 518 518 539 542 542 564 543 543 565 518 518 539 543 543 565 519 519 540 519 519 540 543 543 565 544 544 566 519 519 540 544 544 566 520 520 541 520 520 541 544 544 566 545 545 567 520 520 541 545 545 567 521 521 542 521 521 542 545 545 567 546 546 568 521 521 542 546 546 568 522 522 543 522 522 543 546 546 568 547 547 569 522 522 543 547 547 569 523 523 544 523 523 544 547 547 569 548 548 570 523 523 544 548 548 570 524 524 545 524 524 545 548 548 570 549 549 571 524 524 545 549 549 571 525 525 546 525 525 546 549 549 571 550 550 572 525 525 546 550 550 572 526 526 547 526 526 547 550 550 572 551 551 573 526 526 547 551 551 573 527 527 548 527 527 548 551 551 573 528 528 574 527 527 548 528 528 574 504 504 549 528 528 550 552 552 575 553 553 576 528 528 550 553 553 576 529 529 551 529 529 551 553 553 576 554 554 577 529 529 551 554 554 577 530 530 552 530 530 552 554 554 577 555 555 578 530 530 552 555 555 578 531 531 553 531 531 553 555 555 578 556 556 579 531 531 553 556 556 579 532 532 554 532 532 554 556 556 579 557 557 580 532 532 554 557 557 580 533 533 555 533 533 555 557 557 580 558 558 581 533 533 555 558 558 581 534 534 556 534 534 556 558 558 581 559 559 582 534 534 556 559 559 582 535 535 557 535 535 557 559 559 582 560 560 583 535 535 557 560 560 583 536 536 558 536 536 558 560 560 583 561 561 584 536 536 558 561 561 584 537 537 559 537 537 559 561 561 584 562 562 585 537 537 559 562 562 585 538 538 560 538 538 560 562 562 585 563 563 586 538 538 560 563 563 586 539 539 561 539 539 561 563 563 586 564 564 587 539 539 561 564 564 587 540 540 562 540 540 562 564 564 587 565 565 588 540 540 562 565 565 588 541 541 563 541 541 563 565 565 588 566 566 589 541 541 563 566 566 589 542 542 564 542 542 564 566 566 589 567 567 590 542 542 564 567 567 590 543 543 565 543 543 565 567 567 590 568 568 591 543 543 565 568 568 591 544 544 566 544 544 566 568 568 591 569 569 592 544 544 566 569 569 592 545 545 567 545 545 567 569 569 592 570 570 593 545 545 567 570 570 593 546 546 568 546 546 568 570 570 593 571 571 594 546 546 568 571 571 594 547 547 569 547 547 569 571 571 594 572 572 595 547 547 569 572 572 595 548 548 570 548 548 570 572 572 595 573 573 596 548 548 570 573 573 596 549 549 571 549 549 571 573 573 596 574 574 597 549 549 571 574 574 597 550 550 572 550 550 572 574 574 597 575 575 598 550 550 572 575 575 598 551 551 573 551 551 573 575 575 598 552 552 599 551 551 573 552 552 599 528 528 574 552 552 575 576 576 600 577 577 601 552 552 575 577 577 601 553 553 576 553 553 576 577 577 601 578 578 602 553 553 576 578 578 602 554 554 577 554 554 577 578 578 602 579 579 603 554 554 577 579 579 603 555 555 578 555 555 578 579 579 603 580 580 604 555 555 578 580 580 604 556 556 579 556 556 579 580 580 604 581 581 605 556 556 579 581 581 605 557 557 580 557 557 580 581 581 605 582 582 606 557 557 580 582 582 606 558 558 581 558 558 581 582 582 606 583 583 607 558 558 581 583 583 607 559 559 582 559 559 582 583 583 607 584 584 608 559 559 582 584 584 608 560 560 583 560 560 583 584 584 608 585 585 609 560 560 583 585 585 609 561 561 584 561 561 584 585 585 609 586 586 610 561 561 584 586 586 610 562 562 585 562 562 585 586 586 610 587 587 611 562 562 585 587 587 611 563 563 586 563 563 586 587 587 611 588 588 612 563 563 586 588 588 612 564 564 587 564 564 587 588 588 612 589 589 613 564 564 587 589 589 613 565 565 588 565 565 588 589 589 613 590 590 614 565 565 588 590 590 614 566 566 589 566 566 589 590 590 614 591 591 615 566 566 589 591 591 615 567 567 590 567 567 590 591 591 615 592 592 616 567 567 590 592 592 616 568 568 591 568 568 591 592 592 616 593 593 617 568 568 591 593 593 617 569 569 592 569 569 592 593 593 617 594 594 618 569 569 592 594 594 618 570 570 593 570 570 593 594 594 618 595 595 619 570 570 593 595 595 619 571 571 594 571 571 594 595 595 619 596 596 620 571 571 594 596 596 620 572 572 595 572 572 595 596 596 620 597 597 621 572 572 595 597 597 621 573 573 596 573 573 596 597 597 621 598 598 622 573 573 596 598 598 622 574 574 597 574 574 597 598 598 622 599 599 623 574 574 597 599 599 623 575 575 598 575 575 598 599 599 623 576 576 624 575 575 598 576 576 624 552 552 599 576 576 600 600 600 625 601 601 626 576 576 600 601 601 626 577 577 601 577 577 601 601 601 626 602 602 627 577 577 601 602 602 627 578 578 602 578 578 602 602 602 627 603 603 628 578 578 602 603 603 628 579 579 603 579 579 603 603 603 628 604 604 629 579 579 603 604 604 629 580 580 604 580 580 604 604 604 629 605 605 630 580 580 604 605 605 630 581 581 605 581 581 605 605 605 630 606 606 631 581 581 605 606 606 631 582 582 606 582 582 606 606 606 631 607 607 632 582 582 606 607 607 632 583 583 607 583 583 607 607 607 632 608 608 633 583 583 607 608 608 633 584 584 608 584 584 608 608 608 633 609 609 634 584 584 608 609 609 634 585 585 609 585 585 609 609 609 634 610 610 635 585 585 609 610 610 635 586 586 610 586 586 610 610 610 635 611 611 636 586 586 610 611 611 636 587 587 611 587 587 611 611 611 636 612 612 637 587 587 611 612 612 637 588 588 612 588 588 612 612 612 637 613 613 638 588 588 612 613 613 638 589 589 613 589 589 613 613 613 638 614 614 639 589 589 613 614 614 639 590 590 614 590 590 614 614 614 639 615 615 640 590 590 614 615 615 640 591 591 615 591 591 615 615 615 640 616 616 641 591 591 615 616 616 641 592 592 616 592 592 616 616 616 641 617 617 642 592 592 616 617 617 642 593 593 617 593 593 617 617 617 642 618 618 643 593 593 617 618 618 643 594 594 618 594 594 618 618 618 643 619 619 644 594 594 618 619 619 644 595 595 619 595 595 619 619 619 644 620 620 645 595 595 619 620 620 645 596 596 620 596 596 620 620 620 645 621 621 646 596 596 620 621 621 646 597 597 621 597 597 621 621 621 646 622 622 647 597 597 621 622 622 647 598 598 622 598 598 622 622 622 647 623 623 648 598 598 622 623 623 648 599 599 623 599 599 623 623 623 648 600 600 649 599 599 623 600 600 649 576 576 624 600 600 625 624 624 650 625 625 651 600 600 625 625 625 651 601 601 626 601 601 626 625 625 651 626 626 652 601 601 626 626 626 652 602 602 627 602 602 627 626 626 652 627 627 653 602 602 627 627 627 653 603 603 628 603 603 628 627 627 653 628 628 654 603 603 628 628 628 654 604 604 629 604 604 629 628 628 654 629 629 655 604 604 629 629 629 655 605 605 630 605 605 630 629 629 655 630 630 656 605 605 630 630 630 656 606 606 631 606 606 631 630 630 656 631 631 657 606 606 631 631 631 657 607 607 632 607 607 632 631 631 657 632 632 658 607 607 632 632 632 658 608 608 633 608 608 633 632 632 658 633 633 659 608 608 633 633 633 659 609 609 634 609 609 634 633 633 659 634 634 660 609 609 634 634 634 660 610 610 635 610 610 635 634 634 660 635 635 661 610 610 635 635 635 661 611 611 636 611 611 636 635 635 661 636 636 662 611 611 636 636 636 662 612 612 637 612 612 637 636 636 662 637 637 663 612 612 637 637 637 663 613 613 638 613 613 638 637 637 663 638 638 664 613 613 638 638 638 664 614 614 639 614 614 639 638 638 664 639 639 665 614 614 639 639 639 665 615 615 640 615 615 640 639 639 665 640 640 666 615 615 640 640 640 666 616 616 641 616 616 641 640 640 666 641 641 667 616 616 641 641 641 667 617 617 642 617 617 642 641 641 667 642 642 668 617 617 642 642 642 668 618 618 643 618 618 643 642 642 668 643 643 669 618 618 643 643 643 669 619 619 644 619 619 644 643 643 669 644 644 670 619 619 644 644 644 670 620 620 645 620 620 645 644 644 670 645 645 671 620 620 645 645 645 671 621 621 646 621 621 646 645 645 671 646 646 672 621 621 646 646 646 672 622 622 647 622 622 647 646 646 672 647 647 673 622 622 647 647 647 673 623 623 648 623 623 648 647 647 673 624 624 674 623 623 648 624 624 674 600 600 649 624 624 650 648 648 675 649 649 676 624 624 650 649 649 676 625 625 651 625 625 651 649 649 676 650 650 677 625 625 651 650 650 677 626 626 652 626 626 652 650 650 677 651 651 678 626 626 652 651 651 678 627 627 653 627 627 653 651 651 678 652 652 679 627 627 653 652 652 679 628 628 654 628 628 654 652 652 679 653 653 680 628 628 654 653 653 680 629 629 655 629 629 655 653 653 680 654 654 681 629 629 655 654 654 681 630 630 656 630 630 656 654 654 681 655 655 682 630 630 656 655 655 682 631 631 657 631 631 657 655 655 682 656 656 683 631 631 657 656 656 683 632 632 658 632 632 658 656 656 683 657 657 684 632 632 658 657 657 684 633 633 659 633 633 659 657 657 684 658 658 685 633 633 659 658 658 685 634 634 660 634 634 660 658 658 685 659 659 686 634 634 660 659 659 686 635 635 661 635 635 661 659 659 686 660 660 687 635 635 661 660 660 687 636 636 662 636 636 662 660 660 687 661 661 688 636 636 662 661 661 688 637 637 663 637 637 663 661 661 688 662 662 689 637 637 663 662 662 689 638 638 664 638 638 664 662 662 689 663 663 690 638 638 664 663 663 690 639 639 665 639 639 665 663 663 690 664 664 691 639 639 665 664 664 691 640 640 666 640 640 666 664 664 691 665 665 692 640 640 666 665 665 692 641 641 667 641 641 667 665 665 692 666 666 693 641 641 667 666 666 693 642 642 668 642 642 668 666 666 693 667 667 694 642 642 668 667 667 694 643 643 669 643 643 669 667 667 694 668 668 695 643 643 669 668 668 695 644 644 670 644 644 670 668 668 695 669 669 696 644 644 670 669 669 696 645 645 671 645 645 671 669 669 696 670 670 697 645 645 671 670 670 697 646 646 672 646 646 672 670 670 697 671 671 698 646 646 672 671 671 698 647 647 673 647 647 673 671 671 698 648 648 699 647 647 673 648 648 699 624 624 674 648 648 675 672 672 700 673 673 701 648 648 675 673 673 701 649 649 676 649 649 676 673 673 701 674 674 702 649 649 676 674 674 702 650 650 677 650 650 677 674 674 702 675 675 703 650 650 677 675 675 703 651 651 678 651 651 678 675 675 703 676 676 704 651 651 678 676 676 704 652 652 679 652 652 679 676 676 704 677 677 705 652 652 679 677 677 705 653 653 680 653 653 680 677 677 705 678 678 706 653 653 680 678 678 706 654 654 681 654 654 681 678 678 706 679 679 707 654 654 681 679 679 707 655 655 682 655 655 682 679 679 707 680 680 708 655 655 682 680 680 708 656 656 683 656 656 683 680 680 708 681 681 709 656 656 683 681 681 709 657 657 684 657 657 684 681 681 709 682 682 710 657 657 684 682 682 710 658 658 685 658 658 685 682 682 710 683 683 711 658 658 685 683 683 711 659 659 686 659 659 686 683 683 711 684 684 712 659 659 686 684 684 712 660 660 687 660 660 687 684 684 712 685 685 713 660 660 687 685 685 713 661 661 688 661 661 688 685 685 713 686 686 714 661 661 688 686 686 714 662 662 689 662 662 689 686 686 714 687 687 715 662 662 689 687 687 715 663 663 690 663 663 690 687 687 715 688 688 716 663 663 690 688 688 716 664 664 691 664 664 691 688 688 716 689 689 717 664 664 691 689 689 717 665 665 692 665 665 692 689 689 717 690 690 718 665 665 692 690 690 718 666 666 693 666 666 693 690 690 718 691 691 719 666 666 693 691 691 719 667 667 694 667 667 694 691 691 719 692 692 720 667 667 694 692 692 720 668 668 695 668 668 695 692 692 720 693 693 721 668 668 695 693 693 721 669 669 696 669 669 696 693 693 721 694 694 722 669 669 696 694 694 722 670 670 697 670 670 697 694 694 722 695 695 723 670 670 697 695 695 723 671 671 698 671 671 698 695 695 723 672 672 724 671 671 698 672 672 724 648 648 699 672 672 700 696 696 725 697 697 726 672 672 700 697 697 726 673 673 701 673 673 701 697 697 726 698 698 727 673 673 701 698 698 727 674 674 702 674 674 702 698 698 727 699 699 728 674 674 702 699 699 728 675 675 703 675 675 703 699 699 728 700 700 729 675 675 703 700 700 729 676 676 704 676 676 704 700 700 729 701 701 730 676 676 704 701 701 730 677 677 705 677 677 705 701 701 730 702 702 731 677 677 705 702 702 731 678 678 706 678 678 706 702 702 731 703 703 732 678 678 706 703 703 732 679 679 707 679 679 707 703 703 732 704 704 733 679 679 707 704 704 733 680 680 708 680 680 708 704 704 733 705 705 734 680 680 708 705 705 734 681 681 709 681 681 709 705 705 734 706 706 735 681 681 709 706 706 735 682 682 710 682 682 710 706 706 735 707 707 736 682 682 710 707 707 736 683 683 711 683 683 711 707 707 736 708 708 737 683 683 711 708 708 737 684 684 712 684 684 712 708 708 737 709 709 738 684 684 712 709 709 738 685 685 713 685 685 713 709 709 738 710 710 739 685 685 713 710 710 739 686 686 714 686 686 714 710 710 739 711 711 740 686 686 714 711 711 740 687 687 715 687 687 715 711 711 740 712 712 741 687 687 715 712 712 741 688 688 716 688 688 716 712 712 741 713 713 742 688 688 716 713 713 742 689 689 717 689 689 717 713 713 742 714 714 743 689 689 717 714 714 743 690 690 718 690 690 718 714 714 743 715 715 744 690 690 718 715 715 744 691 691 719 691 691 719 715 715 744 716 716 745 691 691 719 716 716 745 692 692 720 692 692 720 716 716 745 717 717 746 692 692 720 717 717 746 693 693 721 693 693 721 717 717 746 718 718 747 693 693 721 718 718 747 694 694 722 694 694 722 718 718 747 719 719 748 694 694 722 719 719 748 695 695 723 695 695 723 719 719 748 696 696 749 695 695 723 696 696 749 672 672 724 696 696 725 720 720 750 721 721 751 696 696 725 721 721 751 697 697 726 697 697 726 721 721 751 722 722 752 697 697 726 722 722 752 698 698 727 698 698 727 722 722 752 723 723 753 698 698 727 723 723 753 699 699 728 699 699 728 723 723 753 724 724 754 699 699 728 724 724 754 700 700 729 700 700 729 724 724 754 725 725 755 700 700 729 725 725 755 701 701 730 701 701 730 725 725 755 726 726 756 701 701 730 726 726 756 702 702 731 702 702 731 726 726 756 727 727 757 702 702 731 727 727 757 703 703 732 703 703 732 727 727 757 728 728 758 703 703 732 728 728 758 704 704 733 704 704 733 728 728 758 729 729 759 704 704 733 729 729 759 705 705 734 705 705 734 729 729 759 730 730 760 705 705 734 730 730 760 706 706 735 706 706 735 730 730 760 731 731 761 706 706 735 731 731 761 707 707 736 707 707 736 731 731 761 732 732 762 707 707 736 732 732 762 708 708 737 708 708 737 732 732 762 733 733 763 708 708 737 733 733 763 709 709 738 709 709 738 733 733 763 734 734 764 709 709 738 734 734 764 710 710 739 710 710 739 734 734 764 735 735 765 710 710 739 735 735 765 711 711 740 711 711 740 735 735 765 736 736 766 711 711 740 736 736 766 712 712 741 712 712 741 736 736 766 737 737 767 712 712 741 737 737 767 713 713 742 713 713 742 737 737 767 738 738 768 713 713 742 738 738 768 714 714 743 714 714 743 738 738 768 739 739 769 714 714 743 739 739 769 715 715 744 715 715 744 739 739 769 740 740 770 715 715 744 740 740 770 716 716 745 716 716 745 740 740 770 741 741 771 716 716 745 741 741 771 717 717 746 717 717 746 741 741 771 742 742 772 717 717 746 742 742 772 718 718 747 718 718 747 742 742 772 743 743 773 718 718 747 743 743 773 719 719 748 719 719 748 743 743 773 720 720 774 719 719 748 720 720 774 696 696 749 720 720 750 744 744 775 745 745 776 720 720 750 745 745 776 721 721 751 721 721 751 745 745 776 746 746 777 721 721 751 746 746 777 722 722 752 722 722 752 746 746 777 747 747 778 722 722 752 747 747 778 723 723 753 723 723 753 747 747 778 748 748 779 723 723 753 748 748 779 724 724 754 724 724 754 748 748 779 749 749 780 724 724 754 749 749 780 725 725 755 725 725 755 749 749 780 750 750 781 725 725 755 750 750 781 726 726 756 726 726 756 750 750 781 751 751 782 726 726 756 751 751 782 727 727 757 727 727 757 751 751 782 752 752 783 727 727 757 752 752 783 728 728 758 728 728 758 752 752 783 753 753 784 728 728 758 753 753 784 729 729 759 729 729 759 753 753 784 754 754 785 729 729 759 754 754 785 730 730 760 730 730 760 754 754 785 755 755 786 730 730 760 755 755 786 731 731 761 731 731 761 755 755 786 756 756 787 731 731 761 756 756 787 732 732 762 732 732 762 756 756 787 757 757 788 732 732 762 757 757 788 733 733 763 733 733 763 757 757 788 758 758 789 733 733 763 758 758 789 734 734 764 734 734 764 758 758 789 759 759 790 734 734 764 759 759 790 735 735 765 735 735 765 759 759 790 760 760 791 735 735 765 760 760 791 736 736 766 736 736 766 760 760 791 761 761 792 736 736 766 761 761 792 737 737 767 737 737 767 761 761 792 762 762 793 737 737 767 762 762 793 738 738 768 738 738 768 762 762 793 763 763 794 738 738 768 763 763 794 739 739 769 739 739 769 763 763 794 764 764 795 739 739 769 764 764 795 740 740 770 740 740 770 764 764 795 765 765 796 740 740 770 765 765 796 741 741 771 741 741 771 765 765 796 766 766 797 741 741 771 766 766 797 742 742 772 742 742 772 766 766 797 767 767 798 742 742 772 767 767 798 743 743 773 743 743 773 767 767 798 744 744 799 743 743 773 744 744 799 720 720 774 744 744 775 768 768 800 769 769 801 744 744 775 769 769 801 745 745 776 745 745 776 769 769 801 770 770 802 745 745 776 770 770 802 746 746 777 746 746 777 770 770 802 771 771 803 746 746 777 771 771 803 747 747 778 747 747 778 771 771 803 772 772 804 747 747 778 772 772 804 748 748 779 748 748 779 772 772 804 773 773 805 748 748 779 773 773 805 749 749 780 749 749 780 773 773 805 774 774 806 749 749 780 774 774 806 750 750 781 750 750 781 774 774 806 775 775 807 750 750 781 775 775 807 751 751 782 751 751 782 775 775 807 776 776 808 751 751 782 776 776 808 752 752 783 752 752 783 776 776 808 777 777 809 752 752 783 777 777 809 753 753 784 753 753 784 777 777 809 778 778 810 753 753 784 778 778 810 754 754 785 754 754 785 778 778 810 779 779 811 754 754 785 779 779 811 755 755 786 755 755 786 779 779 811 780 780 812 755 755 786 780 780 812 756 756 787 756 756 787 780 780 812 781 781 813 756 756 787 781 781 813 757 757 788 757 757 788 781 781 813 782 782 814 757 757 788 782 782 814 758 758 789 758 758 789 782 782 814 783 783 815 758 758 789 783 783 815 759 759 790 759 759 790 783 783 815 784 784 816 759 759 790 784 784 816 760 760 791 760 760 791 784 784 816 785 785 817 760 760 791 785 785 817 761 761 792 761 761 792 785 785 817 786 786 818 761 761 792 786 786 818 762 762 793 762 762 793 786 786 818 787 787 819 762 762 793 787 787 819 763 763 794 763 763 794 787 787 819 788 788 820 763 763 794 788 788 820 764 764 795 764 764 795 788 788 820 789 789 821 764 764 795 789 789 821 765 765 796 765 765 796 789 789 821 790 790 822 765 765 796 790 790 822 766 766 797 766 766 797 790 790 822 791 791 823 766 766 797 791 791 823 767 767 798 767 767 798 791 791 823 768 768 824 767 767 798 768 768 824 744 744 799 768 768 800 792 792 825 793 793 826 768 768 800 793 793 826 769 769 801 769 769 801 793 793 826 794 794 827 769 769 801 794 794 827 770 770 802 770 770 802 794 794 827 795 795 828 770 770 802 795 795 828 771 771 803 771 771 803 795 795 828 796 796 829 771 771 803 796 796 829 772 772 804 772 772 804 796 796 829 797 797 830 772 772 804 797 797 830 773 773 805 773 773 805 797 797 830 798 798 831 773 773 805 798 798 831 774 774 806 774 774 806 798 798 831 799 799 832 774 774 806 799 799 832 775 775 807 775 775 807 799 799 832 800 800 833 775 775 807 800 800 833 776 776 808 776 776 808 800 800 833 801 801 834 776 776 808 801 801 834 777 777 809 777 777 809 801 801 834 802 802 835 777 777 809 802 802 835 778 778 810 778 778 810 802 802 835 803 803 836 778 778 810 803 803 836 779 779 811 779 779 811 803 803 836 804 804 837 779 779 811 804 804 837 780 780 812 780 780 812 804 804 837 805 805 838 780 780 812 805 805 838 781 781 813 781 781 813 805 805 838 806 806 839 781 781 813 806 806 839 782 782 814 782 782 814 806 806 839 807 807 840 782 782 814 807 807 840 783 783 815 783 783 815 807 807 840 808 808 841 783 783 815 808 808 841 784 784 816 784 784 816 808 808 841 809 809 842 784 784 816 809 809 842 785 785 817 785 785 817 809 809 842 810 810 843 785 785 817 810 810 843 786 786 818 786 786 818 810 810 843 811 811 844 786 786 818 811 811 844 787 787 819 787 787 819 811 811 844 812 812 845 787 787 819 812 812 845 788 788 820 788 788 820 812 812 845 813 813 846 788 788 820 813 813 846 789 789 821 789 789 821 813 813 846 814 814 847 789 789 821 814 814 847 790 790 822 790 790 822 814 814 847 815 815 848 790 790 822 815 815 848 791 791 823 791 791 823 815 815 848 792 792 849 791 791 823 792 792 849 768 768 824 792 792 825 816 816 850 817 817 851 792 792 825 817 817 851 793 793 826 793 793 826 817 817 851 818 818 852 793 793 826 818 818 852 794 794 827 794 794 827 818 818 852 819 819 853 794 794 827 819 819 853 795 795 828 795 795 828 819 819 853 820 820 854 795 795 828 820 820 854 796 796 829 796 796 829 820 820 854 821 821 855 796 796 829 821 821 855 797 797 830 797 797 830 821 821 855 822 822 856 797 797 830 822 822 856 798 798 831 798 798 831 822 822 856 823 823 857 798 798 831 823 823 857 799 799 832 799 799 832 823 823 857 824 824 858 799 799 832 824 824 858 800 800 833 800 800 833 824 824 858 825 825 859 800 800 833 825 825 859 801 801 834 801 801 834 825 825 859 826 826 860 801 801 834 826 826 860 802 802 835 802 802 835 826 826 860 827 827 861 802 802 835 827 827 861 803 803 836 803 803 836 827 827 861 828 828 862 803 803 836 828 828 862 804 804 837 804 804 837 828 828 862 829 829 863 804 804 837 829 829 863 805 805 838 805 805 838 829 829 863 830 830 864 805 805 838 830 830 864 806 806 839 806 806 839 830 830 864 831 831 865 806 806 839 831 831 865 807 807 840 807 807 840 831 831 865 832 832 866 807 807 840 832 832 866 808 808 841 808 808 841 832 832 866 833 833 867 808 808 841 833 833 867 809 809 842 809 809 842 833 833 867 834 834 868 809 809 842 834 834 868 810 810 843 810 810 843 834 834 868 835 835 869 810 810 843 835 835 869 811 811 844 811 811 844 835 835 869 836 836 870 811 811 844 836 836 870 812 812 845 812 812 845 836 836 870 837 837 871 812 812 845 837 837 871 813 813 846 813 813 846 837 837 871 838 838 872 813 813 846 838 838 872 814 814 847 814 814 847 838 838 872 839 839 873 814 814 847 839 839 873 815 815 848 815 815 848 839 839 873 816 816 874 815 815 848 816 816 874 792 792 849 816 816 850 840 840 875 841 841 876 816 816 850 841 841 876 817 817 851 817 817 851 841 841 876 842 842 877 817 817 851 842 842 877 818 818 852 818 818 852 842 842 877 843 843 878 818 818 852 843 843 878 819 819 853 819 819 853 843 843 878 844 844 879 819 819 853 844 844 879 820 820 854 820 820 854 844 844 879 845 845 880 820 820 854 845 845 880 821 821 855 821 821 855 845 845 880 846 846 881 821 821 855 846 846 881 822 822 856 822 822 856 846 846 881 847 847 882 822 822 856 847 847 882 823 823 857 823 823 857 847 847 882 848 848 883 823 823 857 848 848 883 824 824 858 824 824 858 848 848 883 849 849 884 824 824 858 849 849 884 825 825 859 825 825 859 849 849 884 850 850 885 825 825 859 850 850 885 826 826 860 826 826 860 850 850 885 851 851 886 826 826 860 851 851 886 827 827 861 827 827 861 851 851 886 852 852 887 827 827 861 852 852 887 828 828 862 828 828 862 852 852 887 853 853 888 828 828 862 853 853 888 829 829 863 829 829 863 853 853 888 854 854 889 829 829 863 854 854 889 830 830 864 830 830 864 854 854 889 855 855 890 830 830 864 855 855 890 831 831 865 831 831 865 855 855 890 856 856 891 831 831 865 856 856 891 832 832 866 832 832 866 856 856 891 857 857 892 832 832 866 857 857 892 833 833 867 833 833 867 857 857 892 858 858 893 833 833 867 858 858 893 834 834 868 834 834 868 858 858 893 859 859 894 834 834 868 859 859 894 835 835 869 835 835 869 859 859 894 860 860 895 835 835 869 860 860 895 836 836 870 836 836 870 860 860 895 861 861 896 836 836 870 861 861 896 837 837 871 837 837 871 861 861 896 862 862 897 837 837 871 862 862 897 838 838 872 838 838 872 862 862 897 863 863 898 838 838 872 863 863 898 839 839 873 839 839 873 863 863 898 840 840 899 839 839 873 840 840 899 816 816 874 840 840 875 864 864 900 865 865 901 840 840 875 865 865 901 841 841 876 841 841 876 865 865 901 866 866 902 841 841 876 866 866 902 842 842 877 842 842 877 866 866 902 867 867 903 842 842 877 867 867 903 843 843 878 843 843 878 867 867 903 868 868 904 843 843 878 868 868 904 844 844 879 844 844 879 868 868 904 869 869 905 844 844 879 869 869 905 845 845 880 845 845 880 869 869 905 870 870 906 845 845 880 870 870 906 846 846 881 846 846 881 870 870 906 871 871 907 846 846 881 871 871 907 847 847 882 847 847 882 871 871 907 872 872 908 847 847 882 872 872 908 848 848 883 848 848 883 872 872 908 873 873 909 848 848 883 873 873 909 849 849 884 849 849 884 873 873 909 874 874 910 849 849 884 874 874 910 850 850 885 850 850 885 874 874 910 875 875 911 850 850 885 875 875 911 851 851 886 851 851 886 875 875 911 876 876 912 851 851 886 876 876 912 852 852 887 852 852 887 876 876 912 877 877 913 852 852 887 877 877 913 853 853 888 853 853 888 877 877 913 878 878 914 853 853 888 878 878 914 854 854 889 854 854 889 878 878 914 879 879 915 854 854 889 879 879 915 855 855 890 855 855 890 879 879 915 880 880 916 855 855 890 880 880 916 856 856 891 856 856 891 880 880 916 881 881 917 856 856 891 881 881 917 857 857 892 857 857 892 881 881 917 882 882 918 857 857 892 882 882 918 858 858 893 858 858 893 882 882 918 883 883 919 858 858 893 883 883 919 859 859 894 859 859 894 883 883 919 884 884 920 859 859 894 884 884 920 860 860 895 860 860 895 884 884 920 885 885 921 860 860 895 885 885 921 861 861 896 861 861 896 885 885 921 886 886 922 861 861 896 886 886 922 862 862 897 862 862 897 886 886 922 887 887 923 862 862 897 887 887 923 863 863 898 863 863 898 887 887 923 864 864 924 863 863 898 864 864 924 840 840 899 864 864 900 888 888 925 889 889 926 864 864 900 889 889 926 865 865 901 865 865 901 889 889 926 890 890 927 865 865 901 890 890 927 866 866 902 866 866 902 890 890 927 891 891 928 866 866 902 891 891 928 867 867 903 867 867 903 891 891 928 892 892 929 867 867 903 892 892 929 868 868 904 868 868 904 892 892 929 893 893 930 868 868 904 893 893 930 869 869 905 869 869 905 893 893 930 894 894 931 869 869 905 894 894 931 870 870 906 870 870 906 894 894 931 895 895 932 870 870 906 895 895 932 871 871 907 871 871 907 895 895 932 896 896 933 871 871 907 896 896 933 872 872 908 872 872 908 896 896 933 897 897 934 872 872 908 897 897 934 873 873 909 873 873 909 897 897 934 898 898 935 873 873 909 898 898 935 874 874 910 874 874 910 898 898 935 899 899 936 874 874 910 899 899 936 875 875 911 875 875 911 899 899 936 900 900 937 875 875 911 900 900 937 876 876 912 876 876 912 900 900 937 901 901 938 876 876 912 901 901 938 877 877 913 877 877 913 901 901 938 902 902 939 877 877 913 902 902 939 878 878 914 878 878 914 902 902 939 903 903 940 878 878 914 903 903 940 879 879 915 879 879 915 903 903 940 904 904 941 879 879 915 904 904 941 880 880 916 880 880 916 904 904 941 905 905 942 880 880 916 905 905 942 881 881 917 881 881 917 905 905 942 906 906 943 881 881 917 906 906 943 882 882 918 882 882 918 906 906 943 907 907 944 882 882 918 907 907 944 883 883 919 883 883 919 907 907 944 908 908 945 883 883 919 908 908 945 884 884 920 884 884 920 908 908 945 909 909 946 884 884 920 909 909 946 885 885 921 885 885 921 909 909 946 910 910 947 885 885 921 910 910 947 886 886 922 886 886 922 910 910 947 911 911 948 886 886 922 911 911 948 887 887 923 887 887 923 911 911 948 888 888 949 887 887 923 888 888 949 864 864 924 888 888 925 912 912 950 913 913 951 888 888 925 913 913 951 889 889 926 889 889 926 913 913 951 914 914 952 889 889 926 914 914 952 890 890 927 890 890 927 914 914 952 915 915 953 890 890 927 915 915 953 891 891 928 891 891 928 915 915 953 916 916 954 891 891 928 916 916 954 892 892 929 892 892 929 916 916 954 917 917 955 892 892 929 917 917 955 893 893 930 893 893 930 917 917 955 918 918 956 893 893 930 918 918 956 894 894 931 894 894 931 918 918 956 919 919 957 894 894 931 919 919 957 895 895 932 895 895 932 919 919 957 920 920 958 895 895 932 920 920 958 896 896 933 896 896 933 920 920 958 921 921 959 896 896 933 921 921 959 897 897 934 897 897 934 921 921 959 922 922 960 897 897 934 922 922 960 898 898 935 898 898 935 922 922 960 923 923 961 898 898 935 923 923 961 899 899 936 899 899 936 923 923 961 924 924 962 899 899 936 924 924 962 900 900 937 900 900 937 924 924 962 925 925 963 900 900 937 925 925 963 901 901 938 901 901 938 925 925 963 926 926 964 901 901 938 926 926 964 902 902 939 902 902 939 926 926 964 927 927 965 902 902 939 927 927 965 903 903 940 903 903 940 927 927 965 928 928 966 903 903 940 928 928 966 904 904 941 904 904 941 928 928 966 929 929 967 904 904 941 929 929 967 905 905 942 905 905 942 929 929 967 930 930 968 905 905 942 930 930 968 906 906 943 906 906 943 930 930 968 931 931 969 906 906 943 931 931 969 907 907 944 907 907 944 931 931 969 932 932 970 907 907 944 932 932 970 908 908 945 908 908 945 932 932 970 933 933 971 908 908 945 933 933 971 909 909 946 909 909 946 933 933 971 934 934 972 909 909 946 934 934 972 910 910 947 910 910 947 934 934 972 935 935 973 910 910 947 935 935 973 911 911 948 911 911 948 935 935 973 912 912 974 911 911 948 912 912 974 888 888 949 912 912 950 936 936 975 937 937 976 912 912 950 937 937 976 913 913 951 913 913 951 937 937 976 938 938 977 913 913 951 938 938 977 914 914 952 914 914 952 938 938 977 939 939 978 914 914 952 939 939 978 915 915 953 915 915 953 939 939 978 940 940 979 915 915 953 940 940 979 916 916 954 916 916 954 940 940 979 941 941 980 916 916 954 941 941 980 917 917 955 917 917 955 941 941 980 942 942 981 917 917 955 942 942 981 918 918 956 918 918 956 942 942 981 943 943 982 918 918 956 943 943 982 919 919 957 919 919 957 943 943 982 944 944 983 919 919 957 944 944 983 920 920 958 920 920 958 944 944 983 945 945 984 920 920 958 945 945 984 921 921 959 921 921 959 945 945 984 946 946 985 921 921 959 946 946 985 922 922 960 922 922 960 946 946 985 947 947 986 922 922 960 947 947 986 923 923 961 923 923 961 947 947 986 948 948 987 923 923 961 948 948 987 924 924 962 924 924 962 948 948 987 949 949 988 924 924 962 949 949 988 925 925 963 925 925 963 949 949 988 950 950 989 925 925 963 950 950 989 926 926 964 926 926 964 950 950 989 951 951 990 926 926 964 951 951 990 927 927 965 927 927 965 951 951 990 952 952 991 927 927 965 952 952 991 928 928 966 928 928 966 952 952 991 953 953 992 928 928 966 953 953 992 929 929 967 929 929 967 953 953 992 954 954 993 929 929 967 954 954 993 930 930 968 930 930 968 954 954 993 955 955 994 930 930 968 955 955 994 931 931 969 931 931 969 955 955 994 956 956 995 931 931 969 956 956 995 932 932 970 932 932 970 956 956 995 957 957 996 932 932 970 957 957 996 933 933 971 933 933 971 957 957 996 958 958 997 933 933 971 958 958 997 934 934 972 934 934 972 958 958 997 959 959 998 934 934 972 959 959 998 935 935 973 935 935 973 959 959 998 936 936 999 935 935 973 936 936 999 912 912 974 936 936 975 960 960 1000 961 961 1001 936 936 975 961 961 1001 937 937 976 937 937 976 961 961 1001 962 962 1002 937 937 976 962 962 1002 938 938 977 938 938 977 962 962 1002 963 963 1003 938 938 977 963 963 1003 939 939 978 939 939 978 963 963 1003 964 964 1004 939 939 978 964 964 1004 940 940 979 940 940 979 964 964 1004 965 965 1005 940 940 979 965 965 1005 941 941 980 941 941 980 965 965 1005 966 966 1006 941 941 980 966 966 1006 942 942 981 942 942 981 966 966 1006 967 967 1007 942 942 981 967 967 1007 943 943 982 943 943 982 967 967 1007 968 968 1008 943 943 982 968 968 1008 944 944 983 944 944 983 968 968 1008 969 969 1009 944 944 983 969 969 1009 945 945 984 945 945 984 969 969 1009 970 970 1010 945 945 984 970 970 1010 946 946 985 946 946 985 970 970 1010 971 971 1011 946 946 985 971 971 1011 947 947 986 947 947 986 971 971 1011 972 972 1012 947 947 986 972 972 1012 948 948 987 948 948 987 972 972 1012 973 973 1013 948 948 987 973 973 1013 949 949 988 949 949 988 973 973 1013 974 974 1014 949 949 988 974 974 1014 950 950 989 950 950 989 974 974 1014 975 975 1015 950 950 989 975 975 1015 951 951 990 951 951 990 975 975 1015 976 976 1016 951 951 990 976 976 1016 952 952 991 952 952 991 976 976 1016 977 977 1017 952 952 991 977 977 1017 953 953 992 953 953 992 977 977 1017 978 978 1018 953 953 992 978 978 1018 954 954 993 954 954 993 978 978 1018 979 979 1019 954 954 993 979 979 1019 955 955 994 955 955 994 979 979 1019 980 980 1020 955 955 994 980 980 1020 956 956 995 956 956 995 980 980 1020 981 981 1021 956 956 995 981 981 1021 957 957 996 957 957 996 981 981 1021 982 982 1022 957 957 996 982 982 1022 958 958 997 958 958 997 982 982 1022 983 983 1023 958 958 997 983 983 1023 959 959 998 959 959 998 983 983 1023 960 960 1024 959 959 998 960 960 1024 936 936 999 960 960 1000 984 984 1025 985 985 1026 960 960 1000 985 985 1026 961 961 1001 961 961 1001 985 985 1026 986 986 1027 961 961 1001 986 986 1027 962 962 1002 962 962 1002 986 986 1027 987 987 1028 962 962 1002 987 987 1028 963 963 1003 963 963 1003 987 987 1028 988 988 1029 963 963 1003 988 988 1029 964 964 1004 964 964 1004 988 988 1029 989 989 1030 964 964 1004 989 989 1030 965 965 1005 965 965 1005 989 989 1030 990 990 1031 965 965 1005 990 990 1031 966 966 1006 966 966 1006 990 990 1031 991 991 1032 966 966 1006 991 991 1032 967 967 1007 967 967 1007 991 991 1032 992 992 1033 967 967 1007 992 992 1033 968 968 1008 968 968 1008 992 992 1033 993 993 1034 968 968 1008 993 993 1034 969 969 1009 969 969 1009 993 993 1034 994 994 1035 969 969 1009 994 994 1035 970 970 1010 970 970 1010 994 994 1035 995 995 1036 970 970 1010 995 995 1036 971 971 1011 971 971 1011 995 995 1036 996 996 1037 971 971 1011 996 996 1037 972 972 1012 972 972 1012 996 996 1037 997 997 1038 972 972 1012 997 997 1038 973 973 1013 973 973 1013 997 997 1038 998 998 1039 973 973 1013 998 998 1039 974 974 1014 974 974 1014 998 998 1039 999 999 1040 974 974 1014 999 999 1040 975 975 1015 975 975 1015 999 999 1040 1000 1000 1041 975 975 1015 1000 1000 1041 976 976 1016 976 976 1016 1000 1000 1041 1001 1001 1042 976 976 1016 1001 1001 1042 977 977 1017 977 977 1017 1001 1001 1042 1002 1002 1043 977 977 1017 1002 1002 1043 978 978 1018 978 978 1018 1002 1002 1043 1003 1003 1044 978 978 1018 1003 1003 1044 979 979 1019 979 979 1019 1003 1003 1044 1004 1004 1045 979 979 1019 1004 1004 1045 980 980 1020 980 980 1020 1004 1004 1045 1005 1005 1046 980 980 1020 1005 1005 1046 981 981 1021 981 981 1021 1005 1005 1046 1006 1006 1047 981 981 1021 1006 1006 1047 982 982 1022 982 982 1022 1006 1006 1047 1007 1007 1048 982 982 1022 1007 1007 1048 983 983 1023 983 983 1023 1007 1007 1048 984 984 1049 983 983 1023 984 984 1049 960 960 1024 984 984 1025 1008 1008 1050 1009 1009 1051 984 984 1025 1009 1009 1051 985 985 1026 985 985 1026 1009 1009 1051 1010 1010 1052 985 985 1026 1010 1010 1052 986 986 1027 986 986 1027 1010 1010 1052 1011 1011 1053 986 986 1027 1011 1011 1053 987 987 1028 987 987 1028 1011 1011 1053 1012 1012 1054 987 987 1028 1012 1012 1054 988 988 1029 988 988 1029 1012 1012 1054 1013 1013 1055 988 988 1029 1013 1013 1055 989 989 1030 989 989 1030 1013 1013 1055 1014 1014 1056 989 989 1030 1014 1014 1056 990 990 1031 990 990 1031 1014 1014 1056 1015 1015 1057 990 990 1031 1015 1015 1057 991 991 1032 991 991 1032 1015 1015 1057 1016 1016 1058 991 991 1032 1016 1016 1058 992 992 1033 992 992 1033 1016 1016 1058 1017 1017 1059 992 992 1033 1017 1017 1059 993 993 1034 993 993 1034 1017 1017 1059 1018 1018 1060 993 993 1034 1018 1018 1060 994 994 1035 994 994 1035 1018 1018 1060 1019 1019 1061 994 994 1035 1019 1019 1061 995 995 1036 995 995 1036 1019 1019 1061 1020 1020 1062 995 995 1036 1020 1020 1062 996 996 1037 996 996 1037 1020 1020 1062 1021 1021 1063 996 996 1037 1021 1021 1063 997 997 1038 997 997 1038 1021 1021 1063 1022 1022 1064 997 997 1038 1022 1022 1064 998 998 1039 998 998 1039 1022 1022 1064 1023 1023 1065 998 998 1039 1023 1023 1065 999 999 1040 999 999 1040 1023 1023 1065 1024 1024 1066 999 999 1040 1024 1024 1066 1000 1000 1041 1000 1000 1041 1024 1024 1066 1025 1025 1067 1000 1000 1041 1025 1025 1067 1001 1001 1042 1001 1001 1042 1025 1025 1067 1026 1026 1068 1001 1001 1042 1026 1026 1068 1002 1002 1043 1002 1002 1043 1026 1026 1068 1027 1027 1069 1002 1002 1043 1027 1027 1069 1003 1003 1044 1003 1003 1044 1027 1027 1069 1028 1028 1070 1003 1003 1044 1028 1028 1070 1004 1004 1045 1004 1004 1045 1028 1028 1070 1029 1029 1071 1004 1004 1045 1029 1029 1071 1005 1005 1046 1005 1005 1046 1029 1029 1071 1030 1030 1072 1005 1005 1046 1030 1030 1072 1006 1006 1047 1006 1006 1047 1030 1030 1072 1031 1031 1073 1006 1006 1047 1031 1031 1073 1007 1007 1048 1007 1007 1048 1031 1031 1073 1008 1008 1074 1007 1007 1048 1008 1008 1074 984 984 1049 1008 1008 1050 1032 1032 1075 1033 1033 1076 1008 1008 1050 1033 1033 1076 1009 1009 1051 1009 1009 1051 1033 1033 1076 1034 1034 1077 1009 1009 1051 1034 1034 1077 1010 1010 1052 1010 1010 1052 1034 1034 1077 1035 1035 1078 1010 1010 1052 1035 1035 1078 1011 1011 1053 1011 1011 1053 1035 1035 1078 1036 1036 1079 1011 1011 1053 1036 1036 1079 1012 1012 1054 1012 1012 1054 1036 1036 1079 1037 1037 1080 1012 1012 1054 1037 1037 1080 1013 1013 1055 1013 1013 1055 1037 1037 1080 1038 1038 1081 1013 1013 1055 1038 1038 1081 1014 1014 1056 1014 1014 1056 1038 1038 1081 1039 1039 1082 1014 1014 1056 1039 1039 1082 1015 1015 1057 1015 1015 1057 1039 1039 1082 1040 1040 1083 1015 1015 1057 1040 1040 1083 1016 1016 1058 1016 1016 1058 1040 1040 1083 1041 1041 1084 1016 1016 1058 1041 1041 1084 1017 1017 1059 1017 1017 1059 1041 1041 1084 1042 1042 1085 1017 1017 1059 1042 1042 1085 1018 1018 1060 1018 1018 1060 1042 1042 1085 1043 1043 1086 1018 1018 1060 1043 1043 1086 1019 1019 1061 1019 1019 1061 1043 1043 1086 1044 1044 1087 1019 1019 1061 1044 1044 1087 1020 1020 1062 1020 1020 1062 1044 1044 1087 1045 1045 1088 1020 1020 1062 1045 1045 1088 1021 1021 1063 1021 1021 1063 1045 1045 1088 1046 1046 1089 1021 1021 1063 1046 1046 1089 1022 1022 1064 1022 1022 1064 1046 1046 1089 1047 1047 1090 1022 1022 1064 1047 1047 1090 1023 1023 1065 1023 1023 1065 1047 1047 1090 1048 1048 1091 1023 1023 1065 1048 1048 1091 1024 1024 1066 1024 1024 1066 1048 1048 1091 1049 1049 1092 1024 1024 1066 1049 1049 1092 1025 1025 1067 1025 1025 1067 1049 1049 1092 1050 1050 1093 1025 1025 1067 1050 1050 1093 1026 1026 1068 1026 1026 1068 1050 1050 1093 1051 1051 1094 1026 1026 1068 1051 1051 1094 1027 1027 1069 1027 1027 1069 1051 1051 1094 1052 1052 1095 1027 1027 1069 1052 1052 1095 1028 1028 1070 1028 1028 1070 1052 1052 1095 1053 1053 1096 1028 1028 1070 1053 1053 1096 1029 1029 1071 1029 1029 1071 1053 1053 1096 1054 1054 1097 1029 1029 1071 1054 1054 1097 1030 1030 1072 1030 1030 1072 1054 1054 1097 1055 1055 1098 1030 1030 1072 1055 1055 1098 1031 1031 1073 1031 1031 1073 1055 1055 1098 1032 1032 1099 1031 1031 1073 1032 1032 1099 1008 1008 1074 1032 1032 1075 1056 1056 1100 1057 1057 1101 1032 1032 1075 1057 1057 1101 1033 1033 1076 1033 1033 1076 1057 1057 1101 1058 1058 1102 1033 1033 1076 1058 1058 1102 1034 1034 1077 1034 1034 1077 1058 1058 1102 1059 1059 1103 1034 1034 1077 1059 1059 1103 1035 1035 1078 1035 1035 1078 1059 1059 1103 1060 1060 1104 1035 1035 1078 1060 1060 1104 1036 1036 1079 1036 1036 1079 1060 1060 1104 1061 1061 1105 1036 1036 1079 1061 1061 1105 1037 1037 1080 1037 1037 1080 1061 1061 1105 1062 1062 1106 1037 1037 1080 1062 1062 1106 1038 1038 1081 1038 1038 1081 1062 1062 1106 1063 1063 1107 1038 1038 1081 1063 1063 1107 1039 1039 1082 1039 1039 1082 1063 1063 1107 1064 1064 1108 1039 1039 1082 1064 1064 1108 1040 1040 1083 1040 1040 1083 1064 1064 1108 1065 1065 1109 1040 1040 1083 1065 1065 1109 1041 1041 1084 1041 1041 1084 1065 1065 1109 1066 1066 1110 1041 1041 1084 1066 1066 1110 1042 1042 1085 1042 1042 1085 1066 1066 1110 1067 1067 1111 1042 1042 1085 1067 1067 1111 1043 1043 1086 1043 1043 1086 1067 1067 1111 1068 1068 1112 1043 1043 1086 1068 1068 1112 1044 1044 1087 1044 1044 1087 1068 1068 1112 1069 1069 1113 1044 1044 1087 1069 1069 1113 1045 1045 1088 1045 1045 1088 1069 1069 1113 1070 1070 1114 1045 1045 1088 1070 1070 1114 1046 1046 1089 1046 1046 1089 1070 1070 1114 1071 1071 1115 1046 1046 1089 1071 1071 1115 1047 1047 1090 1047 1047 1090 1071 1071 1115 1072 1072 1116 1047 1047 1090 1072 1072 1116 1048 1048 1091 1048 1048 1091 1072 1072 1116 1073 1073 1117 1048 1048 1091 1073 1073 1117 1049 1049 1092 1049 1049 1092 1073 1073 1117 1074 1074 1118 1049 1049 1092 1074 1074 1118 1050 1050 1093 1050 1050 1093 1074 1074 1118 1075 1075 1119 1050 1050 1093 1075 1075 1119 1051 1051 1094 1051 1051 1094 1075 1075 1119 1076 1076 1120 1051 1051 1094 1076 1076 1120 1052 1052 1095 1052 1052 1095 1076 1076 1120 1077 1077 1121 1052 1052 1095 1077 1077 1121 1053 1053 1096 1053 1053 1096 1077 1077 1121 1078 1078 1122 1053 1053 1096 1078 1078 1122 1054 1054 1097 1054 1054 1097 1078 1078 1122 1079 1079 1123 1054 1054 1097 1079 1079 1123 1055 1055 1098 1055 1055 1098 1079 1079 1123 1056 1056 1124 1055 1055 1098 1056 1056 1124 1032 1032 1099 1056 1056 1100 1080 1080 1125 1081 1081 1126 1056 1056 1100 1081 1081 1126 1057 1057 1101 1057 1057 1101 1081 1081 1126 1082 1082 1127 1057 1057 1101 1082 1082 1127 1058 1058 1102 1058 1058 1102 1082 1082 1127 1083 1083 1128 1058 1058 1102 1083 1083 1128 1059 1059 1103 1059 1059 1103 1083 1083 1128 1084 1084 1129 1059 1059 1103 1084 1084 1129 1060 1060 1104 1060 1060 1104 1084 1084 1129 1085 1085 1130 1060 1060 1104 1085 1085 1130 1061 1061 1105 1061 1061 1105 1085 1085 1130 1086 1086 1131 1061 1061 1105 1086 1086 1131 1062 1062 1106 1062 1062 1106 1086 1086 1131 1087 1087 1132 1062 1062 1106 1087 1087 1132 1063 1063 1107 1063 1063 1107 1087 1087 1132 1088 1088 1133 1063 1063 1107 1088 1088 1133 1064 1064 1108 1064 1064 1108 1088 1088 1133 1089 1089 1134 1064 1064 1108 1089 1089 1134 1065 1065 1109 1065 1065 1109 1089 1089 1134 1090 1090 1135 1065 1065 1109 1090 1090 1135 1066 1066 1110 1066 1066 1110 1090 1090 1135 1091 1091 1136 1066 1066 1110 1091 1091 1136 1067 1067 1111 1067 1067 1111 1091 1091 1136 1092 1092 1137 1067 1067 1111 1092 1092 1137 1068 1068 1112 1068 1068 1112 1092 1092 1137 1093 1093 1138 1068 1068 1112 1093 1093 1138 1069 1069 1113 1069 1069 1113 1093 1093 1138 1094 1094 1139 1069 1069 1113 1094 1094 1139 1070 1070 1114 1070 1070 1114 1094 1094 1139 1095 1095 1140 1070 1070 1114 1095 1095 1140 1071 1071 1115 1071 1071 1115 1095 1095 1140 1096 1096 1141 1071 1071 1115 1096 1096 1141 1072 1072 1116 1072 1072 1116 1096 1096 1141 1097 1097 1142 1072 1072 1116 1097 1097 1142 1073 1073 1117 1073 1073 1117 1097 1097 1142 1098 1098 1143 1073 1073 1117 1098 1098 1143 1074 1074 1118 1074 1074 1118 1098 1098 1143 1099 1099 1144 1074 1074 1118 1099 1099 1144 1075 1075 1119 1075 1075 1119 1099 1099 1144 1100 1100 1145 1075 1075 1119 1100 1100 1145 1076 1076 1120 1076 1076 1120 1100 1100 1145 1101 1101 1146 1076 1076 1120 1101 1101 1146 1077 1077 1121 1077 1077 1121 1101 1101 1146 1102 1102 1147 1077 1077 1121 1102 1102 1147 1078 1078 1122 1078 1078 1122 1102 1102 1147 1103 1103 1148 1078 1078 1122 1103 1103 1148 1079 1079 1123 1079 1079 1123 1103 1103 1148 1080 1080 1149 1079 1079 1123 1080 1080 1149 1056 1056 1124 1080 1080 1125 1104 1104 1150 1105 1105 1151 1080 1080 1125 1105 1105 1151 1081 1081 1126 1081 1081 1126 1105 1105 1151 1106 1106 1152 1081 1081 1126 1106 1106 1152 1082 1082 1127 1082 1082 1127 1106 1106 1152 1107 1107 1153 1082 1082 1127 1107 1107 1153 1083 1083 1128 1083 1083 1128 1107 1107 1153 1108 1108 1154 1083 1083 1128 1108 1108 1154 1084 1084 1129 1084 1084 1129 1108 1108 1154 1109 1109 1155 1084 1084 1129 1109 1109 1155 1085 1085 1130 1085 1085 1130 1109 1109 1155 1110 1110 1156 1085 1085 1130 1110 1110 1156 1086 1086 1131 1086 1086 1131 1110 1110 1156 1111 1111 1157 1086 1086 1131 1111 1111 1157 1087 1087 1132 1087 1087 1132 1111 1111 1157 1112 1112 1158 1087 1087 1132 1112 1112 1158 1088 1088 1133 1088 1088 1133 1112 1112 1158 1113 1113 1159 1088 1088 1133 1113 1113 1159 1089 1089 1134 1089 1089 1134 1113 1113 1159 1114 1114 1160 1089 1089 1134 1114 1114 1160 1090 1090 1135 1090 1090 1135 1114 1114 1160 1115 1115 1161 1090 1090 1135 1115 1115 1161 1091 1091 1136 1091 1091 1136 1115 1115 1161 1116 1116 1162 1091 1091 1136 1116 1116 1162 1092 1092 1137 1092 1092 1137 1116 1116 1162 1117 1117 1163 1092 1092 1137 1117 1117 1163 1093 1093 1138 1093 1093 1138 1117 1117 1163 1118 1118 1164 1093 1093 1138 1118 1118 1164 1094 1094 1139 1094 1094 1139 1118 1118 1164 1119 1119 1165 1094 1094 1139 1119 1119 1165 1095 1095 1140 1095 1095 1140 1119 1119 1165 1120 1120 1166 1095 1095 1140 1120 1120 1166 1096 1096 1141 1096 1096 1141 1120 1120 1166 1121 1121 1167 1096 1096 1141 1121 1121 1167 1097 1097 1142 1097 1097 1142 1121 1121 1167 1122 1122 1168 1097 1097 1142 1122 1122 1168 1098 1098 1143 1098 1098 1143 1122 1122 1168 1123 1123 1169 1098 1098 1143 1123 1123 1169 1099 1099 1144 1099 1099 1144 1123 1123 1169 1124 1124 1170 1099 1099 1144 1124 1124 1170 1100 1100 1145 1100 1100 1145 1124 1124 1170 1125 1125 1171 1100 1100 1145 1125 1125 1171 1101 1101 1146 1101 1101 1146 1125 1125 1171 1126 1126 1172 1101 1101 1146 1126 1126 1172 1102 1102 1147 1102 1102 1147 1126 1126 1172 1127 1127 1173 1102 1102 1147 1127 1127 1173 1103 1103 1148 1103 1103 1148 1127 1127 1173 1104 1104 1174 1103 1103 1148 1104 1104 1174 1080 1080 1149 1104 1104 1150 1128 1128 1175 1129 1129 1176 1104 1104 1150 1129 1129 1176 1105 1105 1151 1105 1105 1151 1129 1129 1176 1130 1130 1177 1105 1105 1151 1130 1130 1177 1106 1106 1152 1106 1106 1152 1130 1130 1177 1131 1131 1178 1106 1106 1152 1131 1131 1178 1107 1107 1153 1107 1107 1153 1131 1131 1178 1132 1132 1179 1107 1107 1153 1132 1132 1179 1108 1108 1154 1108 1108 1154 1132 1132 1179 1133 1133 1180 1108 1108 1154 1133 1133 1180 1109 1109 1155 1109 1109 1155 1133 1133 1180 1134 1134 1181 1109 1109 1155 1134 1134 1181 1110 1110 1156 1110 1110 1156 1134 1134 1181 1135 1135 1182 1110 1110 1156 1135 1135 1182 1111 1111 1157 1111 1111 1157 1135 1135 1182 1136 1136 1183 1111 1111 1157 1136 1136 1183 1112 1112 1158 1112 1112 1158 1136 1136 1183 1137 1137 1184 1112 1112 1158 1137 1137 1184 1113 1113 1159 1113 1113 1159 1137 1137 1184 1138 1138 1185 1113 1113 1159 1138 1138 1185 1114 1114 1160 1114 1114 1160 1138 1138 1185 1139 1139 1186 1114 1114 1160 1139 1139 1186 1115 1115 1161 1115 1115 1161 1139 1139 1186 1140 1140 1187 1115 1115 1161 1140 1140 1187 1116 1116 1162 1116 1116 1162 1140 1140 1187 1141 1141 1188 1116 1116 1162 1141 1141 1188 1117 1117 1163 1117 1117 1163 1141 1141 1188 1142 1142 1189 1117 1117 1163 1142 1142 1189 1118 1118 1164 1118 1118 1164 1142 1142 1189 1143 1143 1190 1118 1118 1164 1143 1143 1190 1119 1119 1165 1119 1119 1165 1143 1143 1190 1144 1144 1191 1119 1119 1165 1144 1144 1191 1120 1120 1166 1120 1120 1166 1144 1144 1191 1145 1145 1192 1120 1120 1166 1145 1145 1192 1121 1121 1167 1121 1121 1167 1145 1145 1192 1146 1146 1193 1121 1121 1167 1146 1146 1193 1122 1122 1168 1122 1122 1168 1146 1146 1193 1147 1147 1194 1122 1122 1168 1147 1147 1194 1123 1123 1169 1123 1123 1169 1147 1147 1194 1148 1148 1195 1123 1123 1169 1148 1148 1195 1124 1124 1170 1124 1124 1170 1148 1148 1195 1149 1149 1196 1124 1124 1170 1149 1149 1196 1125 1125 1171 1125 1125 1171 1149 1149 1196 1150 1150 1197 1125 1125 1171 1150 1150 1197 1126 1126 1172 1126 1126 1172 1150 1150 1197 1151 1151 1198 1126 1126 1172 1151 1151 1198 1127 1127 1173 1127 1127 1173 1151 1151 1198 1128 1128 1199 1127 1127 1173 1128 1128 1199 1104 1104 1174 1128 1128 1175 1152 1152 1200 1153 1153 1201 1128 1128 1175 1153 1153 1201 1129 1129 1176 1129 1129 1176 1153 1153 1201 1154 1154 1202 1129 1129 1176 1154 1154 1202 1130 1130 1177 1130 1130 1177 1154 1154 1202 1155 1155 1203 1130 1130 1177 1155 1155 1203 1131 1131 1178 1131 1131 1178 1155 1155 1203 1156 1156 1204 1131 1131 1178 1156 1156 1204 1132 1132 1179 1132 1132 1179 1156 1156 1204 1157 1157 1205 1132 1132 1179 1157 1157 1205 1133 1133 1180 1133 1133 1180 1157 1157 1205 1158 1158 1206 1133 1133 1180 1158 1158 1206 1134 1134 1181 1134 1134 1181 1158 1158 1206 1159 1159 1207 1134 1134 1181 1159 1159 1207 1135 1135 1182 1135 1135 1182 1159 1159 1207 1160 1160 1208 1135 1135 1182 1160 1160 1208 1136 1136 1183 1136 1136 1183 1160 1160 1208 1161 1161 1209 1136 1136 1183 1161 1161 1209 1137 1137 1184 1137 1137 1184 1161 1161 1209 1162 1162 1210 1137 1137 1184 1162 1162 1210 1138 1138 1185 1138 1138 1185 1162 1162 1210 1163 1163 1211 1138 1138 1185 1163 1163 1211 1139 1139 1186 1139 1139 1186 1163 1163 1211 1164 1164 1212 1139 1139 1186 1164 1164 1212 1140 1140 1187 1140 1140 1187 1164 1164 1212 1165 1165 1213 1140 1140 1187 1165 1165 1213 1141 1141 1188 1141 1141 1188 1165 1165 1213 1166 1166 1214 1141 1141 1188 1166 1166 1214 1142 1142 1189 1142 1142 1189 1166 1166 1214 1167 1167 1215 1142 1142 1189 1167 1167 1215 1143 1143 1190 1143 1143 1190 1167 1167 1215 1168 1168 1216 1143 1143 1190 1168 1168 1216 1144 1144 1191 1144 1144 1191 1168 1168 1216 1169 1169 1217 1144 1144 1191 1169 1169 1217 1145 1145 1192 1145 1145 1192 1169 1169 1217 1170 1170 1218 1145 1145 1192 1170 1170 1218 1146 1146 1193 1146 1146 1193 1170 1170 1218 1171 1171 1219 1146 1146 1193 1171 1171 1219 1147 1147 1194 1147 1147 1194 1171 1171 1219 1172 1172 1220 1147 1147 1194 1172 1172 1220 1148 1148 1195 1148 1148 1195 1172 1172 1220 1173 1173 1221 1148 1148 1195 1173 1173 1221 1149 1149 1196 1149 1149 1196 1173 1173 1221 1174 1174 1222 1149 1149 1196 1174 1174 1222 1150 1150 1197 1150 1150 1197 1174 1174 1222 1175 1175 1223 1150 1150 1197 1175 1175 1223 1151 1151 1198 1151 1151 1198 1175 1175 1223 1152 1152 1224 1151 1151 1198 1152 1152 1224 1128 1128 1199 1152 1152 1200 1176 1176 1225 1177 1177 1226 1152 1152 1200 1177 1177 1226 1153 1153 1201 1153 1153 1201 1177 1177 1226 1178 1178 1227 1153 1153 1201 1178 1178 1227 1154 1154 1202 1154 1154 1202 1178 1178 1227 1179 1179 1228 1154 1154 1202 1179 1179 1228 1155 1155 1203 1155 1155 1203 1179 1179 1228 1180 1180 1229 1155 1155 1203 1180 1180 1229 1156 1156 1204 1156 1156 1204 1180 1180 1229 1181 1181 1230 1156 1156 1204 1181 1181 1230 1157 1157 1205 1157 1157 1205 1181 1181 1230 1182 1182 1231 1157 1157 1205 1182 1182 1231 1158 1158 1206 1158 1158 1206 1182 1182 1231 1183 1183 1232 1158 1158 1206 1183 1183 1232 1159 1159 1207 1159 1159 1207 1183 1183 1232 1184 1184 1233 1159 1159 1207 1184 1184 1233 1160 1160 1208 1160 1160 1208 1184 1184 1233 1185 1185 1234 1160 1160 1208 1185 1185 1234 1161 1161 1209 1161 1161 1209 1185 1185 1234 1186 1186 1235 1161 1161 1209 1186 1186 1235 1162 1162 1210 1162 1162 1210 1186 1186 1235 1187 1187 1236 1162 1162 1210 1187 1187 1236 1163 1163 1211 1163 1163 1211 1187 1187 1236 1188 1188 1237 1163 1163 1211 1188 1188 1237 1164 1164 1212 1164 1164 1212 1188 1188 1237 1189 1189 1238 1164 1164 1212 1189 1189 1238 1165 1165 1213 1165 1165 1213 1189 1189 1238 1190 1190 1239 1165 1165 1213 1190 1190 1239 1166 1166 1214 1166 1166 1214 1190 1190 1239 1191 1191 1240 1166 1166 1214 1191 1191 1240 1167 1167 1215 1167 1167 1215 1191 1191 1240 1192 1192 1241 1167 1167 1215 1192 1192 1241 1168 1168 1216 1168 1168 1216 1192 1192 1241 1193 1193 1242 1168 1168 1216 1193 1193 1242 1169 1169 1217 1169 1169 1217 1193 1193 1242 1194 1194 1243 1169 1169 1217 1194 1194 1243 1170 1170 1218 1170 1170 1218 1194 1194 1243 1195 1195 1244 1170 1170 1218 1195 1195 1244 1171 1171 1219 1171 1171 1219 1195 1195 1244 1196 1196 1245 1171 1171 1219 1196 1196 1245 1172 1172 1220 1172 1172 1220 1196 1196 1245 1197 1197 1246 1172 1172 1220 1197 1197 1246 1173 1173 1221 1173 1173 1221 1197 1197 1246 1198 1198 1247 1173 1173 1221 1198 1198 1247 1174 1174 1222 1174 1174 1222 1198 1198 1247 1199 1199 1248 1174 1174 1222 1199 1199 1248 1175 1175 1223 1175 1175 1223 1199 1199 1248 1176 1176 1249 1175 1175 1223 1176 1176 1249 1152 1152 1224 1176 1176 1225 1200 1200 1250 1201 1201 1251 1176 1176 1225 1201 1201 1251 1177 1177 1226 1177 1177 1226 1201 1201 1251 1202 1202 1252 1177 1177 1226 1202 1202 1252 1178 1178 1227 1178 1178 1227 1202 1202 1252 1203 1203 1253 1178 1178 1227 1203 1203 1253 1179 1179 1228 1179 1179 1228 1203 1203 1253 1204 1204 1254 1179 1179 1228 1204 1204 1254 1180 1180 1229 1180 1180 1229 1204 1204 1254 1205 1205 1255 1180 1180 1229 1205 1205 1255 1181 1181 1230 1181 1181 1230 1205 1205 1255 1206 1206 1256 1181 1181 1230 1206 1206 1256 1182 1182 1231 1182 1182 1231 1206 1206 1256 1207 1207 1257 1182 1182 1231 1207 1207 1257 1183 1183 1232 1183 1183 1232 1207 1207 1257 1208 1208 1258 1183 1183 1232 1208 1208 1258 1184 1184 1233 1184 1184 1233 1208 1208 1258 1209 1209 1259 1184 1184 1233 1209 1209 1259 1185 1185 1234 1185 1185 1234 1209 1209 1259 1210 1210 1260 1185 1185 1234 1210 1210 1260 1186 1186 1235 1186 1186 1235 1210 1210 1260 1211 1211 1261 1186 1186 1235 1211 1211 1261 1187 1187 1236 1187 1187 1236 1211 1211 1261 1212 1212 1262 1187 1187 1236 1212 1212 1262 1188 1188 1237 1188 1188 1237 1212 1212 1262 1213 1213 1263 1188 1188 1237 1213 1213 1263 1189 1189 1238 1189 1189 1238 1213 1213 1263 1214 1214 1264 1189 1189 1238 1214 1214 1264 1190 1190 1239 1190 1190 1239 1214 1214 1264 1215 1215 1265 1190 1190 1239 1215 1215 1265 1191 1191 1240 1191 1191 1240 1215 1215 1265 1216 1216 1266 1191 1191 1240 1216 1216 1266 1192 1192 1241 1192 1192 1241 1216 1216 1266 1217 1217 1267 1192 1192 1241 1217 1217 1267 1193 1193 1242 1193 1193 1242 1217 1217 1267 1218 1218 1268 1193 1193 1242 1218 1218 1268 1194 1194 1243 1194 1194 1243 1218 1218 1268 1219 1219 1269 1194 1194 1243 1219 1219 1269 1195 1195 1244 1195 1195 1244 1219 1219 1269 1220 1220 1270 1195 1195 1244 1220 1220 1270 1196 1196 1245 1196 1196 1245 1220 1220 1270 1221 1221 1271 1196 1196 1245 1221 1221 1271 1197 1197 1246 1197 1197 1246 1221 1221 1271 1222 1222 1272 1197 1197 1246 1222 1222 1272 1198 1198 1247 1198 1198 1247 1222 1222 1272 1223 1223 1273 1198 1198 1247 1223 1223 1273 1199 1199 1248 1199 1199 1248 1223 1223 1273 1200 1200 1274 1199 1199 1248 1200 1200 1274 1176 1176 1249 1200 1200 1250 1224 1224 1275 1225 1225 1276 1200 1200 1250 1225 1225 1276 1201 1201 1251 1201 1201 1251 1225 1225 1276 1226 1226 1277 1201 1201 1251 1226 1226 1277 1202 1202 1252 1202 1202 1252 1226 1226 1277 1227 1227 1278 1202 1202 1252 1227 1227 1278 1203 1203 1253 1203 1203 1253 1227 1227 1278 1228 1228 1279 1203 1203 1253 1228 1228 1279 1204 1204 1254 1204 1204 1254 1228 1228 1279 1229 1229 1280 1204 1204 1254 1229 1229 1280 1205 1205 1255 1205 1205 1255 1229 1229 1280 1230 1230 1281 1205 1205 1255 1230 1230 1281 1206 1206 1256 1206 1206 1256 1230 1230 1281 1231 1231 1282 1206 1206 1256 1231 1231 1282 1207 1207 1257 1207 1207 1257 1231 1231 1282 1232 1232 1283 1207 1207 1257 1232 1232 1283 1208 1208 1258 1208 1208 1258 1232 1232 1283 1233 1233 1284 1208 1208 1258 1233 1233 1284 1209 1209 1259 1209 1209 1259 1233 1233 1284 1234 1234 1285 1209 1209 1259 1234 1234 1285 1210 1210 1260 1210 1210 1260 1234 1234 1285 1235 1235 1286 1210 1210 1260 1235 1235 1286 1211 1211 1261 1211 1211 1261 1235 1235 1286 1236 1236 1287 1211 1211 1261 1236 1236 1287 1212 1212 1262 1212 1212 1262 1236 1236 1287 1237 1237 1288 1212 1212 1262 1237 1237 1288 1213 1213 1263 1213 1213 1263 1237 1237 1288 1238 1238 1289 1213 1213 1263 1238 1238 1289 1214 1214 1264 1214 1214 1264 1238 1238 1289 1239 1239 1290 1214 1214 1264 1239 1239 1290 1215 1215 1265 1215 1215 1265 1239 1239 1290 1240 1240 1291 1215 1215 1265 1240 1240 1291 1216 1216 1266 1216 1216 1266 1240 1240 1291 1241 1241 1292 1216 1216 1266 1241 1241 1292 1217 1217 1267 1217 1217 1267 1241 1241 1292 1242 1242 1293 1217 1217 1267 1242 1242 1293 1218 1218 1268 1218 1218 1268 1242 1242 1293 1243 1243 1294 1218 1218 1268 1243 1243 1294 1219 1219 1269 1219 1219 1269 1243 1243 1294 1244 1244 1295 1219 1219 1269 1244 1244 1295 1220 1220 1270 1220 1220 1270 1244 1244 1295 1245 1245 1296 1220 1220 1270 1245 1245 1296 1221 1221 1271 1221 1221 1271 1245 1245 1296 1246 1246 1297 1221 1221 1271 1246 1246 1297 1222 1222 1272 1222 1222 1272 1246 1246 1297 1247 1247 1298 1222 1222 1272 1247 1247 1298 1223 1223 1273 1223 1223 1273 1247 1247 1298 1224 1224 1299 1223 1223 1273 1224 1224 1299 1200 1200 1274 1224 1224 1275 1248 1248 1300 1249 1249 1301 1224 1224 1275 1249 1249 1301 1225 1225 1276 1225 1225 1276 1249 1249 1301 1250 1250 1302 1225 1225 1276 1250 1250 1302 1226 1226 1277 1226 1226 1277 1250 1250 1302 1251 1251 1303 1226 1226 1277 1251 1251 1303 1227 1227 1278 1227 1227 1278 1251 1251 1303 1252 1252 1304 1227 1227 1278 1252 1252 1304 1228 1228 1279 1228 1228 1279 1252 1252 1304 1253 1253 1305 1228 1228 1279 1253 1253 1305 1229 1229 1280 1229 1229 1280 1253 1253 1305 1254 1254 1306 1229 1229 1280 1254 1254 1306 1230 1230 1281 1230 1230 1281 1254 1254 1306 1255 1255 1307 1230 1230 1281 1255 1255 1307 1231 1231 1282 1231 1231 1282 1255 1255 1307 1256 1256 1308 1231 1231 1282 1256 1256 1308 1232 1232 1283 1232 1232 1283 1256 1256 1308 1257 1257 1309 1232 1232 1283 1257 1257 1309 1233 1233 1284 1233 1233 1284 1257 1257 1309 1258 1258 1310 1233 1233 1284 1258 1258 1310 1234 1234 1285 1234 1234 1285 1258 1258 1310 1259 1259 1311 1234 1234 1285 1259 1259 1311 1235 1235 1286 1235 1235 1286 1259 1259 1311 1260 1260 1312 1235 1235 1286 1260 1260 1312 1236 1236 1287 1236 1236 1287 1260 1260 1312 1261 1261 1313 1236 1236 1287 1261 1261 1313 1237 1237 1288 1237 1237 1288 1261 1261 1313 1262 1262 1314 1237 1237 1288 1262 1262 1314 1238 1238 1289 1238 1238 1289 1262 1262 1314 1263 1263 1315 1238 1238 1289 1263 1263 1315 1239 1239 1290 1239 1239 1290 1263 1263 1315 1264 1264 1316 1239 1239 1290 1264 1264 1316 1240 1240 1291 1240 1240 1291 1264 1264 1316 1265 1265 1317 1240 1240 1291 1265 1265 1317 1241 1241 1292 1241 1241 1292 1265 1265 1317 1266 1266 1318 1241 1241 1292 1266 1266 1318 1242 1242 1293 1242 1242 1293 1266 1266 1318 1267 1267 1319 1242 1242 1293 1267 1267 1319 1243 1243 1294 1243 1243 1294 1267 1267 1319 1268 1268 1320 1243 1243 1294 1268 1268 1320 1244 1244 1295 1244 1244 1295 1268 1268 1320 1269 1269 1321 1244 1244 1295 1269 1269 1321 1245 1245 1296 1245 1245 1296 1269 1269 1321 1270 1270 1322 1245 1245 1296 1270 1270 1322 1246 1246 1297 1246 1246 1297 1270 1270 1322 1271 1271 1323 1246 1246 1297 1271 1271 1323 1247 1247 1298 1247 1247 1298 1271 1271 1323 1248 1248 1324 1247 1247 1298 1248 1248 1324 1224 1224 1299 1248 1248 1300 1272 1272 1325 1273 1273 1326 1248 1248 1300 1273 1273 1326 1249 1249 1301 1249 1249 1301 1273 1273 1326 1274 1274 1327 1249 1249 1301 1274 1274 1327 1250 1250 1302 1250 1250 1302 1274 1274 1327 1275 1275 1328 1250 1250 1302 1275 1275 1328 1251 1251 1303 1251 1251 1303 1275 1275 1328 1276 1276 1329 1251 1251 1303 1276 1276 1329 1252 1252 1304 1252 1252 1304 1276 1276 1329 1277 1277 1330 1252 1252 1304 1277 1277 1330 1253 1253 1305 1253 1253 1305 1277 1277 1330 1278 1278 1331 1253 1253 1305 1278 1278 1331 1254 1254 1306 1254 1254 1306 1278 1278 1331 1279 1279 1332 1254 1254 1306 1279 1279 1332 1255 1255 1307 1255 1255 1307 1279 1279 1332 1280 1280 1333 1255 1255 1307 1280 1280 1333 1256 1256 1308 1256 1256 1308 1280 1280 1333 1281 1281 1334 1256 1256 1308 1281 1281 1334 1257 1257 1309 1257 1257 1309 1281 1281 1334 1282 1282 1335 1257 1257 1309 1282 1282 1335 1258 1258 1310 1258 1258 1310 1282 1282 1335 1283 1283 1336 1258 1258 1310 1283 1283 1336 1259 1259 1311 1259 1259 1311 1283 1283 1336 1284 1284 1337 1259 1259 1311 1284 1284 1337 1260 1260 1312 1260 1260 1312 1284 1284 1337 1285 1285 1338 1260 1260 1312 1285 1285 1338 1261 1261 1313 1261 1261 1313 1285 1285 1338 1286 1286 1339 1261 1261 1313 1286 1286 1339 1262 1262 1314 1262 1262 1314 1286 1286 1339 1287 1287 1340 1262 1262 1314 1287 1287 1340 1263 1263 1315 1263 1263 1315 1287 1287 1340 1288 1288 1341 1263 1263 1315 1288 1288 1341 1264 1264 1316 1264 1264 1316 1288 1288 1341 1289 1289 1342 1264 1264 1316 1289 1289 1342 1265 1265 1317 1265 1265 1317 1289 1289 1342 1290 1290 1343 1265 1265 1317 1290 1290 1343 1266 1266 1318 1266 1266 1318 1290 1290 1343 1291 1291 1344 1266 1266 1318 1291 1291 1344 1267 1267 1319 1267 1267 1319 1291 1291 1344 1292 1292 1345 1267 1267 1319 1292 1292 1345 1268 1268 1320 1268 1268 1320 1292 1292 1345 1293 1293 1346 1268 1268 1320 1293 1293 1346 1269 1269 1321 1269 1269 1321 1293 1293 1346 1294 1294 1347 1269 1269 1321 1294 1294 1347 1270 1270 1322 1270 1270 1322 1294 1294 1347 1295 1295 1348 1270 1270 1322 1295 1295 1348 1271 1271 1323 1271 1271 1323 1295 1295 1348 1272 1272 1349 1271 1271 1323 1272 1272 1349 1248 1248 1324 1272 1272 1325 1296 1296 1350 1297 1297 1351 1272 1272 1325 1297 1297 1351 1273 1273 1326 1273 1273 1326 1297 1297 1351 1298 1298 1352 1273 1273 1326 1298 1298 1352 1274 1274 1327 1274 1274 1327 1298 1298 1352 1299 1299 1353 1274 1274 1327 1299 1299 1353 1275 1275 1328 1275 1275 1328 1299 1299 1353 1300 1300 1354 1275 1275 1328 1300 1300 1354 1276 1276 1329 1276 1276 1329 1300 1300 1354 1301 1301 1355 1276 1276 1329 1301 1301 1355 1277 1277 1330 1277 1277 1330 1301 1301 1355 1302 1302 1356 1277 1277 1330 1302 1302 1356 1278 1278 1331 1278 1278 1331 1302 1302 1356 1303 1303 1357 1278 1278 1331 1303 1303 1357 1279 1279 1332 1279 1279 1332 1303 1303 1357 1304 1304 1358 1279 1279 1332 1304 1304 1358 1280 1280 1333 1280 1280 1333 1304 1304 1358 1305 1305 1359 1280 1280 1333 1305 1305 1359 1281 1281 1334 1281 1281 1334 1305 1305 1359 1306 1306 1360 1281 1281 1334 1306 1306 1360 1282 1282 1335 1282 1282 1335 1306 1306 1360 1307 1307 1361 1282 1282 1335 1307 1307 1361 1283 1283 1336 1283 1283 1336 1307 1307 1361 1308 1308 1362 1283 1283 1336 1308 1308 1362 1284 1284 1337 1284 1284 1337 1308 1308 1362 1309 1309 1363 1284 1284 1337 1309 1309 1363 1285 1285 1338 1285 1285 1338 1309 1309 1363 1310 1310 1364 1285 1285 1338 1310 1310 1364 1286 1286 1339 1286 1286 1339 1310 1310 1364 1311 1311 1365 1286 1286 1339 1311 1311 1365 1287 1287 1340 1287 1287 1340 1311 1311 1365 1312 1312 1366 1287 1287 1340 1312 1312 1366 1288 1288 1341 1288 1288 1341 1312 1312 1366 1313 1313 1367 1288 1288 1341 1313 1313 1367 1289 1289 1342 1289 1289 1342 1313 1313 1367 1314 1314 1368 1289 1289 1342 1314 1314 1368 1290 1290 1343 1290 1290 1343 1314 1314 1368 1315 1315 1369 1290 1290 1343 1315 1315 1369 1291 1291 1344 1291 1291 1344 1315 1315 1369 1316 1316 1370 1291 1291 1344 1316 1316 1370 1292 1292 1345 1292 1292 1345 1316 1316 1370 1317 1317 1371 1292 1292 1345 1317 1317 1371 1293 1293 1346 1293 1293 1346 1317 1317 1371 1318 1318 1372 1293 1293 1346 1318 1318 1372 1294 1294 1347 1294 1294 1347 1318 1318 1372 1319 1319 1373 1294 1294 1347 1319 1319 1373 1295 1295 1348 1295 1295 1348 1319 1319 1373 1296 1296 1374 1295 1295 1348 1296 1296 1374 1272 1272 1349 1296 1296 1350 1320 1320 1375 1321 1321 1376 1296 1296 1350 1321 1321 1376 1297 1297 1351 1297 1297 1351 1321 1321 1376 1322 1322 1377 1297 1297 1351 1322 1322 1377 1298 1298 1352 1298 1298 1352 1322 1322 1377 1323 1323 1378 1298 1298 1352 1323 1323 1378 1299 1299 1353 1299 1299 1353 1323 1323 1378 1324 1324 1379 1299 1299 1353 1324 1324 1379 1300 1300 1354 1300 1300 1354 1324 1324 1379 1325 1325 1380 1300 1300 1354 1325 1325 1380 1301 1301 1355 1301 1301 1355 1325 1325 1380 1326 1326 1381 1301 1301 1355 1326 1326 1381 1302 1302 1356 1302 1302 1356 1326 1326 1381 1327 1327 1382 1302 1302 1356 1327 1327 1382 1303 1303 1357 1303 1303 1357 1327 1327 1382 1328 1328 1383 1303 1303 1357 1328 1328 1383 1304 1304 1358 1304 1304 1358 1328 1328 1383 1329 1329 1384 1304 1304 1358 1329 1329 1384 1305 1305 1359 1305 1305 1359 1329 1329 1384 1330 1330 1385 1305 1305 1359 1330 1330 1385 1306 1306 1360 1306 1306 1360 1330 1330 1385 1331 1331 1386 1306 1306 1360 1331 1331 1386 1307 1307 1361 1307 1307 1361 1331 1331 1386 1332 1332 1387 1307 1307 1361 1332 1332 1387 1308 1308 1362 1308 1308 1362 1332 1332 1387 1333 1333 1388 1308 1308 1362 1333 1333 1388 1309 1309 1363 1309 1309 1363 1333 1333 1388 1334 1334 1389 1309 1309 1363 1334 1334 1389 1310 1310 1364 1310 1310 1364 1334 1334 1389 1335 1335 1390 1310 1310 1364 1335 1335 1390 1311 1311 1365 1311 1311 1365 1335 1335 1390 1336 1336 1391 1311 1311 1365 1336 1336 1391 1312 1312 1366 1312 1312 1366 1336 1336 1391 1337 1337 1392 1312 1312 1366 1337 1337 1392 1313 1313 1367 1313 1313 1367 1337 1337 1392 1338 1338 1393 1313 1313 1367 1338 1338 1393 1314 1314 1368 1314 1314 1368 1338 1338 1393 1339 1339 1394 1314 1314 1368 1339 1339 1394 1315 1315 1369 1315 1315 1369 1339 1339 1394 1340 1340 1395 1315 1315 1369 1340 1340 1395 1316 1316 1370 1316 1316 1370 1340 1340 1395 1341 1341 1396 1316 1316 1370 1341 1341 1396 1317 1317 1371 1317 1317 1371 1341 1341 1396 1342 1342 1397 1317 1317 1371 1342 1342 1397 1318 1318 1372 1318 1318 1372 1342 1342 1397 1343 1343 1398 1318 1318 1372 1343 1343 1398 1319 1319 1373 1319 1319 1373 1343 1343 1398 1320 1320 1399 1319 1319 1373 1320 1320 1399 1296 1296 1374 1320 1320 1375 1344 1344 1400 1345 1345 1401 1320 1320 1375 1345 1345 1401 1321 1321 1376 1321 1321 1376 1345 1345 1401 1346 1346 1402 1321 1321 1376 1346 1346 1402 1322 1322 1377 1322 1322 1377 1346 1346 1402 1347 1347 1403 1322 1322 1377 1347 1347 1403 1323 1323 1378 1323 1323 1378 1347 1347 1403 1348 1348 1404 1323 1323 1378 1348 1348 1404 1324 1324 1379 1324 1324 1379 1348 1348 1404 1349 1349 1405 1324 1324 1379 1349 1349 1405 1325 1325 1380 1325 1325 1380 1349 1349 1405 1350 1350 1406 1325 1325 1380 1350 1350 1406 1326 1326 1381 1326 1326 1381 1350 1350 1406 1351 1351 1407 1326 1326 1381 1351 1351 1407 1327 1327 1382 1327 1327 1382 1351 1351 1407 1352 1352 1408 1327 1327 1382 1352 1352 1408 1328 1328 1383 1328 1328 1383 1352 1352 1408 1353 1353 1409 1328 1328 1383 1353 1353 1409 1329 1329 1384 1329 1329 1384 1353 1353 1409 1354 1354 1410 1329 1329 1384 1354 1354 1410 1330 1330 1385 1330 1330 1385 1354 1354 1410 1355 1355 1411 1330 1330 1385 1355 1355 1411 1331 1331 1386 1331 1331 1386 1355 1355 1411 1356 1356 1412 1331 1331 1386 1356 1356 1412 1332 1332 1387 1332 1332 1387 1356 1356 1412 1357 1357 1413 1332 1332 1387 1357 1357 1413 1333 1333 1388 1333 1333 1388 1357 1357 1413 1358 1358 1414 1333 1333 1388 1358 1358 1414 1334 1334 1389 1334 1334 1389 1358 1358 1414 1359 1359 1415 1334 1334 1389 1359 1359 1415 1335 1335 1390 1335 1335 1390 1359 1359 1415 1360 1360 1416 1335 1335 1390 1360 1360 1416 1336 1336 1391 1336 1336 1391 1360 1360 1416 1361 1361 1417 1336 1336 1391 1361 1361 1417 1337 1337 1392 1337 1337 1392 1361 1361 1417 1362 1362 1418 1337 1337 1392 1362 1362 1418 1338 1338 1393 1338 1338 1393 1362 1362 1418 1363 1363 1419 1338 1338 1393 1363 1363 1419 1339 1339 1394 1339 1339 1394 1363 1363 1419 1364 1364 1420 1339 1339 1394 1364 1364 1420 1340 1340 1395 1340 1340 1395 1364 1364 1420 1365 1365 1421 1340 1340 1395 1365 1365 1421 1341 1341 1396 1341 1341 1396 1365 1365 1421 1366 1366 1422 1341 1341 1396 1366 1366 1422 1342 1342 1397 1342 1342 1397 1366 1366 1422 1367 1367 1423 1342 1342 1397 1367 1367 1423 1343 1343 1398 1343 1343 1398 1367 1367 1423 1344 1344 1424 1343 1343 1398 1344 1344 1424 1320 1320 1399 1344 1344 1400 1368 1368 1425 1369 1369 1426 1344 1344 1400 1369 1369 1426 1345 1345 1401 1345 1345 1401 1369 1369 1426 1370 1370 1427 1345 1345 1401 1370 1370 1427 1346 1346 1402 1346 1346 1402 1370 1370 1427 1371 1371 1428 1346 1346 1402 1371 1371 1428 1347 1347 1403 1347 1347 1403 1371 1371 1428 1372 1372 1429 1347 1347 1403 1372 1372 1429 1348 1348 1404 1348 1348 1404 1372 1372 1429 1373 1373 1430 1348 1348 1404 1373 1373 1430 1349 1349 1405 1349 1349 1405 1373 1373 1430 1374 1374 1431 1349 1349 1405 1374 1374 1431 1350 1350 1406 1350 1350 1406 1374 1374 1431 1375 1375 1432 1350 1350 1406 1375 1375 1432 1351 1351 1407 1351 1351 1407 1375 1375 1432 1376 1376 1433 1351 1351 1407 1376 1376 1433 1352 1352 1408 1352 1352 1408 1376 1376 1433 1377 1377 1434 1352 1352 1408 1377 1377 1434 1353 1353 1409 1353 1353 1409 1377 1377 1434 1378 1378 1435 1353 1353 1409 1378 1378 1435 1354 1354 1410 1354 1354 1410 1378 1378 1435 1379 1379 1436 1354 1354 1410 1379 1379 1436 1355 1355 1411 1355 1355 1411 1379 1379 1436 1380 1380 1437 1355 1355 1411 1380 1380 1437 1356 1356 1412 1356 1356 1412 1380 1380 1437 1381 1381 1438 1356 1356 1412 1381 1381 1438 1357 1357 1413 1357 1357 1413 1381 1381 1438 1382 1382 1439 1357 1357 1413 1382 1382 1439 1358 1358 1414 1358 1358 1414 1382 1382 1439 1383 1383 1440 1358 1358 1414 1383 1383 1440 1359 1359 1415 1359 1359 1415 1383 1383 1440 1384 1384 1441 1359 1359 1415 1384 1384 1441 1360 1360 1416 1360 1360 1416 1384 1384 1441 1385 1385 1442 1360 1360 1416 1385 1385 1442 1361 1361 1417 1361 1361 1417 1385 1385 1442 1386 1386 1443 1361 1361 1417 1386 1386 1443 1362 1362 1418 1362 1362 1418 1386 1386 1443 1387 1387 1444 1362 1362 1418 1387 1387 1444 1363 1363 1419 1363 1363 1419 1387 1387 1444 1388 1388 1445 1363 1363 1419 1388 1388 1445 1364 1364 1420 1364 1364 1420 1388 1388 1445 1389 1389 1446 1364 1364 1420 1389 1389 1446 1365 1365 1421 1365 1365 1421 1389 1389 1446 1390 1390 1447 1365 1365 1421 1390 1390 1447 1366 1366 1422 1366 1366 1422 1390 1390 1447 1391 1391 1448 1366 1366 1422 1391 1391 1448 1367 1367 1423 1367 1367 1423 1391 1391 1448 1368 1368 1449 1367 1367 1423 1368 1368 1449 1344 1344 1424 1368 1368 1425 1392 1392 1450 1393 1393 1451 1368 1368 1425 1393 1393 1451 1369 1369 1426 1369 1369 1426 1393 1393 1451 1394 1394 1452 1369 1369 1426 1394 1394 1452 1370 1370 1427 1370 1370 1427 1394 1394 1452 1395 1395 1453 1370 1370 1427 1395 1395 1453 1371 1371 1428 1371 1371 1428 1395 1395 1453 1396 1396 1454 1371 1371 1428 1396 1396 1454 1372 1372 1429 1372 1372 1429 1396 1396 1454 1397 1397 1455 1372 1372 1429 1397 1397 1455 1373 1373 1430 1373 1373 1430 1397 1397 1455 1398 1398 1456 1373 1373 1430 1398 1398 1456 1374 1374 1431 1374 1374 1431 1398 1398 1456 1399 1399 1457 1374 1374 1431 1399 1399 1457 1375 1375 1432 1375 1375 1432 1399 1399 1457 1400 1400 1458 1375 1375 1432 1400 1400 1458 1376 1376 1433 1376 1376 1433 1400 1400 1458 1401 1401 1459 1376 1376 1433 1401 1401 1459 1377 1377 1434 1377 1377 1434 1401 1401 1459 1402 1402 1460 1377 1377 1434 1402 1402 1460 1378 1378 1435 1378 1378 1435 1402 1402 1460 1403 1403 1461 1378 1378 1435 1403 1403 1461 1379 1379 1436 1379 1379 1436 1403 1403 1461 1404 1404 1462 1379 1379 1436 1404 1404 1462 1380 1380 1437 1380 1380 1437 1404 1404 1462 1405 1405 1463 1380 1380 1437 1405 1405 1463 1381 1381 1438 1381 1381 1438 1405 1405 1463 1406 1406 1464 1381 1381 1438 1406 1406 1464 1382 1382 1439 1382 1382 1439 1406 1406 1464 1407 1407 1465 1382 1382 1439 1407 1407 1465 1383 1383 1440 1383 1383 1440 1407 1407 1465 1408 1408 1466 1383 1383 1440 1408 1408 1466 1384 1384 1441 1384 1384 1441 1408 1408 1466 1409 1409 1467 1384 1384 1441 1409 1409 1467 1385 1385 1442 1385 1385 1442 1409 1409 1467 1410 1410 1468 1385 1385 1442 1410 1410 1468 1386 1386 1443 1386 1386 1443 1410 1410 1468 1411 1411 1469 1386 1386 1443 1411 1411 1469 1387 1387 1444 1387 1387 1444 1411 1411 1469 1412 1412 1470 1387 1387 1444 1412 1412 1470 1388 1388 1445 1388 1388 1445 1412 1412 1470 1413 1413 1471 1388 1388 1445 1413 1413 1471 1389 1389 1446 1389 1389 1446 1413 1413 1471 1414 1414 1472 1389 1389 1446 1414 1414 1472 1390 1390 1447 1390 1390 1447 1414 1414 1472 1415 1415 1473 1390 1390 1447 1415 1415 1473 1391 1391 1448 1391 1391 1448 1415 1415 1473 1392 1392 1474 1391 1391 1448 1392 1392 1474 1368 1368 1449 1392 1392 1450 1416 1416 1475 1417 1417 1476 1392 1392 1450 1417 1417 1476 1393 1393 1451 1393 1393 1451 1417 1417 1476 1418 1418 1477 1393 1393 1451 1418 1418 1477 1394 1394 1452 1394 1394 1452 1418 1418 1477 1419 1419 1478 1394 1394 1452 1419 1419 1478 1395 1395 1453 1395 1395 1453 1419 1419 1478 1420 1420 1479 1395 1395 1453 1420 1420 1479 1396 1396 1454 1396 1396 1454 1420 1420 1479 1421 1421 1480 1396 1396 1454 1421 1421 1480 1397 1397 1455 1397 1397 1455 1421 1421 1480 1422 1422 1481 1397 1397 1455 1422 1422 1481 1398 1398 1456 1398 1398 1456 1422 1422 1481 1423 1423 1482 1398 1398 1456 1423 1423 1482 1399 1399 1457 1399 1399 1457 1423 1423 1482 1424 1424 1483 1399 1399 1457 1424 1424 1483 1400 1400 1458 1400 1400 1458 1424 1424 1483 1425 1425 1484 1400 1400 1458 1425 1425 1484 1401 1401 1459 1401 1401 1459 1425 1425 1484 1426 1426 1485 1401 1401 1459 1426 1426 1485 1402 1402 1460 1402 1402 1460 1426 1426 1485 1427 1427 1486 1402 1402 1460 1427 1427 1486 1403 1403 1461 1403 1403 1461 1427 1427 1486 1428 1428 1487 1403 1403 1461 1428 1428 1487 1404 1404 1462 1404 1404 1462 1428 1428 1487 1429 1429 1488 1404 1404 1462 1429 1429 1488 1405 1405 1463 1405 1405 1463 1429 1429 1488 1430 1430 1489 1405 1405 1463 1430 1430 1489 1406 1406 1464 1406 1406 1464 1430 1430 1489 1431 1431 1490 1406 1406 1464 1431 1431 1490 1407 1407 1465 1407 1407 1465 1431 1431 1490 1432 1432 1491 1407 1407 1465 1432 1432 1491 1408 1408 1466 1408 1408 1466 1432 1432 1491 1433 1433 1492 1408 1408 1466 1433 1433 1492 1409 1409 1467 1409 1409 1467 1433 1433 1492 1434 1434 1493 1409 1409 1467 1434 1434 1493 1410 1410 1468 1410 1410 1468 1434 1434 1493 1435 1435 1494 1410 1410 1468 1435 1435 1494 1411 1411 1469 1411 1411 1469 1435 1435 1494 1436 1436 1495 1411 1411 1469 1436 1436 1495 1412 1412 1470 1412 1412 1470 1436 1436 1495 1437 1437 1496 1412 1412 1470 1437 1437 1496 1413 1413 1471 1413 1413 1471 1437 1437 1496 1438 1438 1497 1413 1413 1471 1438 1438 1497 1414 1414 1472 1414 1414 1472 1438 1438 1497 1439 1439 1498 1414 1414 1472 1439 1439 1498 1415 1415 1473 1415 1415 1473 1439 1439 1498 1416 1416 1499 1415 1415 1473 1416 1416 1499 1392 1392 1474 1416 1416 1475 1440 1440 1500 1441 1441 1501 1416 1416 1475 1441 1441 1501 1417 1417 1476 1417 1417 1476 1441 1441 1501 1442 1442 1502 1417 1417 1476 1442 1442 1502 1418 1418 1477 1418 1418 1477 1442 1442 1502 1443 1443 1503 1418 1418 1477 1443 1443 1503 1419 1419 1478 1419 1419 1478 1443 1443 1503 1444 1444 1504 1419 1419 1478 1444 1444 1504 1420 1420 1479 1420 1420 1479 1444 1444 1504 1445 1445 1505 1420 1420 1479 1445 1445 1505 1421 1421 1480 1421 1421 1480 1445 1445 1505 1446 1446 1506 1421 1421 1480 1446 1446 1506 1422 1422 1481 1422 1422 1481 1446 1446 1506 1447 1447 1507 1422 1422 1481 1447 1447 1507 1423 1423 1482 1423 1423 1482 1447 1447 1507 1448 1448 1508 1423 1423 1482 1448 1448 1508 1424 1424 1483 1424 1424 1483 1448 1448 1508 1449 1449 1509 1424 1424 1483 1449 1449 1509 1425 1425 1484 1425 1425 1484 1449 1449 1509 1450 1450 1510 1425 1425 1484 1450 1450 1510 1426 1426 1485 1426 1426 1485 1450 1450 1510 1451 1451 1511 1426 1426 1485 1451 1451 1511 1427 1427 1486 1427 1427 1486 1451 1451 1511 1452 1452 1512 1427 1427 1486 1452 1452 1512 1428 1428 1487 1428 1428 1487 1452 1452 1512 1453 1453 1513 1428 1428 1487 1453 1453 1513 1429 1429 1488 1429 1429 1488 1453 1453 1513 1454 1454 1514 1429 1429 1488 1454 1454 1514 1430 1430 1489 1430 1430 1489 1454 1454 1514 1455 1455 1515 1430 1430 1489 1455 1455 1515 1431 1431 1490 1431 1431 1490 1455 1455 1515 1456 1456 1516 1431 1431 1490 1456 1456 1516 1432 1432 1491 1432 1432 1491 1456 1456 1516 1457 1457 1517 1432 1432 1491 1457 1457 1517 1433 1433 1492 1433 1433 1492 1457 1457 1517 1458 1458 1518 1433 1433 1492 1458 1458 1518 1434 1434 1493 1434 1434 1493 1458 1458 1518 1459 1459 1519 1434 1434 1493 1459 1459 1519 1435 1435 1494 1435 1435 1494 1459 1459 1519 1460 1460 1520 1435 1435 1494 1460 1460 1520 1436 1436 1495 1436 1436 1495 1460 1460 1520 1461 1461 1521 1436 1436 1495 1461 1461 1521 1437 1437 1496 1437 1437 1496 1461 1461 1521 1462 1462 1522 1437 1437 1496 1462 1462 1522 1438 1438 1497 1438 1438 1497 1462 1462 1522 1463 1463 1523 1438 1438 1497 1463 1463 1523 1439 1439 1498 1439 1439 1498 1463 1463 1523 1440 1440 1524 1439 1439 1498 1440 1440 1524 1416 1416 1499 1440 1440 1500 1464 1464 1525 1465 1465 1526 1440 1440 1500 1465 1465 1526 1441 1441 1501 1441 1441 1501 1465 1465 1526 1466 1466 1527 1441 1441 1501 1466 1466 1527 1442 1442 1502 1442 1442 1502 1466 1466 1527 1467 1467 1528 1442 1442 1502 1467 1467 1528 1443 1443 1503 1443 1443 1503 1467 1467 1528 1468 1468 1529 1443 1443 1503 1468 1468 1529 1444 1444 1504 1444 1444 1504 1468 1468 1529 1469 1469 1530 1444 1444 1504 1469 1469 1530 1445 1445 1505 1445 1445 1505 1469 1469 1530 1470 1470 1531 1445 1445 1505 1470 1470 1531 1446 1446 1506 1446 1446 1506 1470 1470 1531 1471 1471 1532 1446 1446 1506 1471 1471 1532 1447 1447 1507 1447 1447 1507 1471 1471 1532 1472 1472 1533 1447 1447 1507 1472 1472 1533 1448 1448 1508 1448 1448 1508 1472 1472 1533 1473 1473 1534 1448 1448 1508 1473 1473 1534 1449 1449 1509 1449 1449 1509 1473 1473 1534 1474 1474 1535 1449 1449 1509 1474 1474 1535 1450 1450 1510 1450 1450 1510 1474 1474 1535 1475 1475 1536 1450 1450 1510 1475 1475 1536 1451 1451 1511 1451 1451 1511 1475 1475 1536 1476 1476 1537 1451 1451 1511 1476 1476 1537 1452 1452 1512 1452 1452 1512 1476 1476 1537 1477 1477 1538 1452 1452 1512 1477 1477 1538 1453 1453 1513 1453 1453 1513 1477 1477 1538 1478 1478 1539 1453 1453 1513 1478 1478 1539 1454 1454 1514 1454 1454 1514 1478 1478 1539 1479 1479 1540 1454 1454 1514 1479 1479 1540 1455 1455 1515 1455 1455 1515 1479 1479 1540 1480 1480 1541 1455 1455 1515 1480 1480 1541 1456 1456 1516 1456 1456 1516 1480 1480 1541 1481 1481 1542 1456 1456 1516 1481 1481 1542 1457 1457 1517 1457 1457 1517 1481 1481 1542 1482 1482 1543 1457 1457 1517 1482 1482 1543 1458 1458 1518 1458 1458 1518 1482 1482 1543 1483 1483 1544 1458 1458 1518 1483 1483 1544 1459 1459 1519 1459 1459 1519 1483 1483 1544 1484 1484 1545 1459 1459 1519 1484 1484 1545 1460 1460 1520 1460 1460 1520 1484 1484 1545 1485 1485 1546 1460 1460 1520 1485 1485 1546 1461 1461 1521 1461 1461 1521 1485 1485 1546 1486 1486 1547 1461 1461 1521 1486 1486 1547 1462 1462 1522 1462 1462 1522 1486 1486 1547 1487 1487 1548 1462 1462 1522 1487 1487 1548 1463 1463 1523 1463 1463 1523 1487 1487 1548 1464 1464 1549 1463 1463 1523 1464 1464 1549 1440 1440 1524 1464 1464 1525 1488 1488 1550 1489 1489 1551 1464 1464 1525 1489 1489 1551 1465 1465 1526 1465 1465 1526 1489 1489 1551 1490 1490 1552 1465 1465 1526 1490 1490 1552 1466 1466 1527 1466 1466 1527 1490 1490 1552 1491 1491 1553 1466 1466 1527 1491 1491 1553 1467 1467 1528 1467 1467 1528 1491 1491 1553 1492 1492 1554 1467 1467 1528 1492 1492 1554 1468 1468 1529 1468 1468 1529 1492 1492 1554 1493 1493 1555 1468 1468 1529 1493 1493 1555 1469 1469 1530 1469 1469 1530 1493 1493 1555 1494 1494 1556 1469 1469 1530 1494 1494 1556 1470 1470 1531 1470 1470 1531 1494 1494 1556 1495 1495 1557 1470 1470 1531 1495 1495 1557 1471 1471 1532 1471 1471 1532 1495 1495 1557 1496 1496 1558 1471 1471 1532 1496 1496 1558 1472 1472 1533 1472 1472 1533 1496 1496 1558 1497 1497 1559 1472 1472 1533 1497 1497 1559 1473 1473 1534 1473 1473 1534 1497 1497 1559 1498 1498 1560 1473 1473 1534 1498 1498 1560 1474 1474 1535 1474 1474 1535 1498 1498 1560 1499 1499 1561 1474 1474 1535 1499 1499 1561 1475 1475 1536 1475 1475 1536 1499 1499 1561 1500 1500 1562 1475 1475 1536 1500 1500 1562 1476 1476 1537 1476 1476 1537 1500 1500 1562 1501 1501 1563 1476 1476 1537 1501 1501 1563 1477 1477 1538 1477 1477 1538 1501 1501 1563 1502 1502 1564 1477 1477 1538 1502 1502 1564 1478 1478 1539 1478 1478 1539 1502 1502 1564 1503 1503 1565 1478 1478 1539 1503 1503 1565 1479 1479 1540 1479 1479 1540 1503 1503 1565 1504 1504 1566 1479 1479 1540 1504 1504 1566 1480 1480 1541 1480 1480 1541 1504 1504 1566 1505 1505 1567 1480 1480 1541 1505 1505 1567 1481 1481 1542 1481 1481 1542 1505 1505 1567 1506 1506 1568 1481 1481 1542 1506 1506 1568 1482 1482 1543 1482 1482 1543 1506 1506 1568 1507 1507 1569 1482 1482 1543 1507 1507 1569 1483 1483 1544 1483 1483 1544 1507 1507 1569 1508 1508 1570 1483 1483 1544 1508 1508 1570 1484 1484 1545 1484 1484 1545 1508 1508 1570 1509 1509 1571 1484 1484 1545 1509 1509 1571 1485 1485 1546 1485 1485 1546 1509 1509 1571 1510 1510 1572 1485 1485 1546 1510 1510 1572 1486 1486 1547 1486 1486 1547 1510 1510 1572 1511 1511 1573 1486 1486 1547 1511 1511 1573 1487 1487 1548 1487 1487 1548 1511 1511 1573 1488 1488 1574 1487 1487 1548 1488 1488 1574 1464 1464 1549 1488 1488 1550 1512 1512 1575 1513 1513 1576 1488 1488 1550 1513 1513 1576 1489 1489 1551 1489 1489 1551 1513 1513 1576 1514 1514 1577 1489 1489 1551 1514 1514 1577 1490 1490 1552 1490 1490 1552 1514 1514 1577 1515 1515 1578 1490 1490 1552 1515 1515 1578 1491 1491 1553 1491 1491 1553 1515 1515 1578 1516 1516 1579 1491 1491 1553 1516 1516 1579 1492 1492 1554 1492 1492 1554 1516 1516 1579 1517 1517 1580 1492 1492 1554 1517 1517 1580 1493 1493 1555 1493 1493 1555 1517 1517 1580 1518 1518 1581 1493 1493 1555 1518 1518 1581 1494 1494 1556 1494 1494 1556 1518 1518 1581 1519 1519 1582 1494 1494 1556 1519 1519 1582 1495 1495 1557 1495 1495 1557 1519 1519 1582 1520 1520 1583 1495 1495 1557 1520 1520 1583 1496 1496 1558 1496 1496 1558 1520 1520 1583 1521 1521 1584 1496 1496 1558 1521 1521 1584 1497 1497 1559 1497 1497 1559 1521 1521 1584 1522 1522 1585 1497 1497 1559 1522 1522 1585 1498 1498 1560 1498 1498 1560 1522 1522 1585 1523 1523 1586 1498 1498 1560 1523 1523 1586 1499 1499 1561 1499 1499 1561 1523 1523 1586 1524 1524 1587 1499 1499 1561 1524 1524 1587 1500 1500 1562 1500 1500 1562 1524 1524 1587 1525 1525 1588 1500 1500 1562 1525 1525 1588 1501 1501 1563 1501 1501 1563 1525 1525 1588 1526 1526 1589 1501 1501 1563 1526 1526 1589 1502 1502 1564 1502 1502 1564 1526 1526 1589 1527 1527 1590 1502 1502 1564 1527 1527 1590 1503 1503 1565 1503 1503 1565 1527 1527 1590 1528 1528 1591 1503 1503 1565 1528 1528 1591 1504 1504 1566 1504 1504 1566 1528 1528 1591 1529 1529 1592 1504 1504 1566 1529 1529 1592 1505 1505 1567 1505 1505 1567 1529 1529 1592 1530 1530 1593 1505 1505 1567 1530 1530 1593 1506 1506 1568 1506 1506 1568 1530 1530 1593 1531 1531 1594 1506 1506 1568 1531 1531 1594 1507 1507 1569 1507 1507 1569 1531 1531 1594 1532 1532 1595 1507 1507 1569 1532 1532 1595 1508 1508 1570 1508 1508 1570 1532 1532 1595 1533 1533 1596 1508 1508 1570 1533 1533 1596 1509 1509 1571 1509 1509 1571 1533 1533 1596 1534 1534 1597 1509 1509 1571 1534 1534 1597 1510 1510 1572 1510 1510 1572 1534 1534 1597 1535 1535 1598 1510 1510 1572 1535 1535 1598 1511 1511 1573 1511 1511 1573 1535 1535 1598 1512 1512 1599 1511 1511 1573 1512 1512 1599 1488 1488 1574 1512 1512 1575 1536 1536 1600 1537 1537 1601 1512 1512 1575 1537 1537 1601 1513 1513 1576 1513 1513 1576 1537 1537 1601 1538 1538 1602 1513 1513 1576 1538 1538 1602 1514 1514 1577 1514 1514 1577 1538 1538 1602 1539 1539 1603 1514 1514 1577 1539 1539 1603 1515 1515 1578 1515 1515 1578 1539 1539 1603 1540 1540 1604 1515 1515 1578 1540 1540 1604 1516 1516 1579 1516 1516 1579 1540 1540 1604 1541 1541 1605 1516 1516 1579 1541 1541 1605 1517 1517 1580 1517 1517 1580 1541 1541 1605 1542 1542 1606 1517 1517 1580 1542 1542 1606 1518 1518 1581 1518 1518 1581 1542 1542 1606 1543 1543 1607 1518 1518 1581 1543 1543 1607 1519 1519 1582 1519 1519 1582 1543 1543 1607 1544 1544 1608 1519 1519 1582 1544 1544 1608 1520 1520 1583 1520 1520 1583 1544 1544 1608 1545 1545 1609 1520 1520 1583 1545 1545 1609 1521 1521 1584 1521 1521 1584 1545 1545 1609 1546 1546 1610 1521 1521 1584 1546 1546 1610 1522 1522 1585 1522 1522 1585 1546 1546 1610 1547 1547 1611 1522 1522 1585 1547 1547 1611 1523 1523 1586 1523 1523 1586 1547 1547 1611 1548 1548 1612 1523 1523 1586 1548 1548 1612 1524 1524 1587 1524 1524 1587 1548 1548 1612 1549 1549 1613 1524 1524 1587 1549 1549 1613 1525 1525 1588 1525 1525 1588 1549 1549 1613 1550 1550 1614 1525 1525 1588 1550 1550 1614 1526 1526 1589 1526 1526 1589 1550 1550 1614 1551 1551 1615 1526 1526 1589 1551 1551 1615 1527 1527 1590 1527 1527 1590 1551 1551 1615 1552 1552 1616 1527 1527 1590 1552 1552 1616 1528 1528 1591 1528 1528 1591 1552 1552 1616 1553 1553 1617 1528 1528 1591 1553 1553 1617 1529 1529 1592 1529 1529 1592 1553 1553 1617 1554 1554 1618 1529 1529 1592 1554 1554 1618 1530 1530 1593 1530 1530 1593 1554 1554 1618 1555 1555 1619 1530 1530 1593 1555 1555 1619 1531 1531 1594 1531 1531 1594 1555 1555 1619 1556 1556 1620 1531 1531 1594 1556 1556 1620 1532 1532 1595 1532 1532 1595 1556 1556 1620 1557 1557 1621 1532 1532 1595 1557 1557 1621 1533 1533 1596 1533 1533 1596 1557 1557 1621 1558 1558 1622 1533 1533 1596 1558 1558 1622 1534 1534 1597 1534 1534 1597 1558 1558 1622 1559 1559 1623 1534 1534 1597 1559 1559 1623 1535 1535 1598 1535 1535 1598 1559 1559 1623 1536 1536 1624 1535 1535 1598 1536 1536 1624 1512 1512 1599 1536 1536 1600 1560 1560 1625 1561 1561 1626 1536 1536 1600 1561 1561 1626 1537 1537 1601 1537 1537 1601 1561 1561 1626 1562 1562 1627 1537 1537 1601 1562 1562 1627 1538 1538 1602 1538 1538 1602 1562 1562 1627 1563 1563 1628 1538 1538 1602 1563 1563 1628 1539 1539 1603 1539 1539 1603 1563 1563 1628 1564 1564 1629 1539 1539 1603 1564 1564 1629 1540 1540 1604 1540 1540 1604 1564 1564 1629 1565 1565 1630 1540 1540 1604 1565 1565 1630 1541 1541 1605 1541 1541 1605 1565 1565 1630 1566 1566 1631 1541 1541 1605 1566 1566 1631 1542 1542 1606 1542 1542 1606 1566 1566 1631 1567 1567 1632 1542 1542 1606 1567 1567 1632 1543 1543 1607 1543 1543 1607 1567 1567 1632 1568 1568 1633 1543 1543 1607 1568 1568 1633 1544 1544 1608 1544 1544 1608 1568 1568 1633 1569 1569 1634 1544 1544 1608 1569 1569 1634 1545 1545 1609 1545 1545 1609 1569 1569 1634 1570 1570 1635 1545 1545 1609 1570 1570 1635 1546 1546 1610 1546 1546 1610 1570 1570 1635 1571 1571 1636 1546 1546 1610 1571 1571 1636 1547 1547 1611 1547 1547 1611 1571 1571 1636 1572 1572 1637 1547 1547 1611 1572 1572 1637 1548 1548 1612 1548 1548 1612 1572 1572 1637 1573 1573 1638 1548 1548 1612 1573 1573 1638 1549 1549 1613 1549 1549 1613 1573 1573 1638 1574 1574 1639 1549 1549 1613 1574 1574 1639 1550 1550 1614 1550 1550 1614 1574 1574 1639 1575 1575 1640 1550 1550 1614 1575 1575 1640 1551 1551 1615 1551 1551 1615 1575 1575 1640 1576 1576 1641 1551 1551 1615 1576 1576 1641 1552 1552 1616 1552 1552 1616 1576 1576 1641 1577 1577 1642 1552 1552 1616 1577 1577 1642 1553 1553 1617 1553 1553 1617 1577 1577 1642 1578 1578 1643 1553 1553 1617 1578 1578 1643 1554 1554 1618 1554 1554 1618 1578 1578 1643 1579 1579 1644 1554 1554 1618 1579 1579 1644 1555 1555 1619 1555 1555 1619 1579 1579 1644 1580 1580 1645 1555 1555 1619 1580 1580 1645 1556 1556 1620 1556 1556 1620 1580 1580 1645 1581 1581 1646 1556 1556 1620 1581 1581 1646 1557 1557 1621 1557 1557 1621 1581 1581 1646 1582 1582 1647 1557 1557 1621 1582 1582 1647 1558 1558 1622 1558 1558 1622 1582 1582 1647 1583 1583 1648 1558 1558 1622 1583 1583 1648 1559 1559 1623 1559 1559 1623 1583 1583 1648 1560 1560 1649 1559 1559 1623 1560 1560 1649 1536 1536 1624 1560 1560 1625 1584 1584 1650 1585 1585 1651 1560 1560 1625 1585 1585 1651 1561 1561 1626 1561 1561 1626 1585 1585 1651 1586 1586 1652 1561 1561 1626 1586 1586 1652 1562 1562 1627 1562 1562 1627 1586 1586 1652 1587 1587 1653 1562 1562 1627 1587 1587 1653 1563 1563 1628 1563 1563 1628 1587 1587 1653 1588 1588 1654 1563 1563 1628 1588 1588 1654 1564 1564 1629 1564 1564 1629 1588 1588 1654 1589 1589 1655 1564 1564 1629 1589 1589 1655 1565 1565 1630 1565 1565 1630 1589 1589 1655 1590 1590 1656 1565 1565 1630 1590 1590 1656 1566 1566 1631 1566 1566 1631 1590 1590 1656 1591 1591 1657 1566 1566 1631 1591 1591 1657 1567 1567 1632 1567 1567 1632 1591 1591 1657 1592 1592 1658 1567 1567 1632 1592 1592 1658 1568 1568 1633 1568 1568 1633 1592 1592 1658 1593 1593 1659 1568 1568 1633 1593 1593 1659 1569 1569 1634 1569 1569 1634 1593 1593 1659 1594 1594 1660 1569 1569 1634 1594 1594 1660 1570 1570 1635 1570 1570 1635 1594 1594 1660 1595 1595 1661 1570 1570 1635 1595 1595 1661 1571 1571 1636 1571 1571 1636 1595 1595 1661 1596 1596 1662 1571 1571 1636 1596 1596 1662 1572 1572 1637 1572 1572 1637 1596 1596 1662 1597 1597 1663 1572 1572 1637 1597 1597 1663 1573 1573 1638 1573 1573 1638 1597 1597 1663 1598 1598 1664 1573 1573 1638 1598 1598 1664 1574 1574 1639 1574 1574 1639 1598 1598 1664 1599 1599 1665 1574 1574 1639 1599 1599 1665 1575 1575 1640 1575 1575 1640 1599 1599 1665 1600 1600 1666 1575 1575 1640 1600 1600 1666 1576 1576 1641 1576 1576 1641 1600 1600 1666 1601 1601 1667 1576 1576 1641 1601 1601 1667 1577 1577 1642 1577 1577 1642 1601 1601 1667 1602 1602 1668 1577 1577 1642 1602 1602 1668 1578 1578 1643 1578 1578 1643 1602 1602 1668 1603 1603 1669 1578 1578 1643 1603 1603 1669 1579 1579 1644 1579 1579 1644 1603 1603 1669 1604 1604 1670 1579 1579 1644 1604 1604 1670 1580 1580 1645 1580 1580 1645 1604 1604 1670 1605 1605 1671 1580 1580 1645 1605 1605 1671 1581 1581 1646 1581 1581 1646 1605 1605 1671 1606 1606 1672 1581 1581 1646 1606 1606 1672 1582 1582 1647 1582 1582 1647 1606 1606 1672 1607 1607 1673 1582 1582 1647 1607 1607 1673 1583 1583 1648 1583 1583 1648 1607 1607 1673 1584 1584 1674 1583 1583 1648 1584 1584 1674 1560 1560 1649 1584 1584 1650 1608 1608 1675 1609 1609 1676 1584 1584 1650 1609 1609 1676 1585 1585 1651 1585 1585 1651 1609 1609 1676 1610 1610 1677 1585 1585 1651 1610 1610 1677 1586 1586 1652 1586 1586 1652 1610 1610 1677 1611 1611 1678 1586 1586 1652 1611 1611 1678 1587 1587 1653 1587 1587 1653 1611 1611 1678 1612 1612 1679 1587 1587 1653 1612 1612 1679 1588 1588 1654 1588 1588 1654 1612 1612 1679 1613 1613 1680 1588 1588 1654 1613 1613 1680 1589 1589 1655 1589 1589 1655 1613 1613 1680 1614 1614 1681 1589 1589 1655 1614 1614 1681 1590 1590 1656 1590 1590 1656 1614 1614 1681 1615 1615 1682 1590 1590 1656 1615 1615 1682 1591 1591 1657 1591 1591 1657 1615 1615 1682 1616 1616 1683 1591 1591 1657 1616 1616 1683 1592 1592 1658 1592 1592 1658 1616 1616 1683 1617 1617 1684 1592 1592 1658 1617 1617 1684 1593 1593 1659 1593 1593 1659 1617 1617 1684 1618 1618 1685 1593 1593 1659 1618 1618 1685 1594 1594 1660 1594 1594 1660 1618 1618 1685 1619 1619 1686 1594 1594 1660 1619 1619 1686 1595 1595 1661 1595 1595 1661 1619 1619 1686 1620 1620 1687 1595 1595 1661 1620 1620 1687 1596 1596 1662 1596 1596 1662 1620 1620 1687 1621 1621 1688 1596 1596 1662 1621 1621 1688 1597 1597 1663 1597 1597 1663 1621 1621 1688 1622 1622 1689 1597 1597 1663 1622 1622 1689 1598 1598 1664 1598 1598 1664 1622 1622 1689 1623 1623 1690 1598 1598 1664 1623 1623 1690 1599 1599 1665 1599 1599 1665 1623 1623 1690 1624 1624 1691 1599 1599 1665 1624 1624 1691 1600 1600 1666 1600 1600 1666 1624 1624 1691 1625 1625 1692 1600 1600 1666 1625 1625 1692 1601 1601 1667 1601 1601 1667 1625 1625 1692 1626 1626 1693 1601 1601 1667 1626 1626 1693 1602 1602 1668 1602 1602 1668 1626 1626 1693 1627 1627 1694 1602 1602 1668 1627 1627 1694 1603 1603 1669 1603 1603 1669 1627 1627 1694 1628 1628 1695 1603 1603 1669 1628 1628 1695 1604 1604 1670 1604 1604 1670 1628 1628 1695 1629 1629 1696 1604 1604 1670 1629 1629 1696 1605 1605 1671 1605 1605 1671 1629 1629 1696 1630 1630 1697 1605 1605 1671 1630 1630 1697 1606 1606 1672 1606 1606 1672 1630 1630 1697 1631 1631 1698 1606 1606 1672 1631 1631 1698 1607 1607 1673 1607 1607 1673 1631 1631 1698 1608 1608 1699 1607 1607 1673 1608 1608 1699 1584 1584 1674 1608 1608 1675 1632 1632 1700 1633 1633 1701 1608 1608 1675 1633 1633 1701 1609 1609 1676 1609 1609 1676 1633 1633 1701 1634 1634 1702 1609 1609 1676 1634 1634 1702 1610 1610 1677 1610 1610 1677 1634 1634 1702 1635 1635 1703 1610 1610 1677 1635 1635 1703 1611 1611 1678 1611 1611 1678 1635 1635 1703 1636 1636 1704 1611 1611 1678 1636 1636 1704 1612 1612 1679 1612 1612 1679 1636 1636 1704 1637 1637 1705 1612 1612 1679 1637 1637 1705 1613 1613 1680 1613 1613 1680 1637 1637 1705 1638 1638 1706 1613 1613 1680 1638 1638 1706 1614 1614 1681 1614 1614 1681 1638 1638 1706 1639 1639 1707 1614 1614 1681 1639 1639 1707 1615 1615 1682 1615 1615 1682 1639 1639 1707 1640 1640 1708 1615 1615 1682 1640 1640 1708 1616 1616 1683 1616 1616 1683 1640 1640 1708 1641 1641 1709 1616 1616 1683 1641 1641 1709 1617 1617 1684 1617 1617 1684 1641 1641 1709 1642 1642 1710 1617 1617 1684 1642 1642 1710 1618 1618 1685 1618 1618 1685 1642 1642 1710 1643 1643 1711 1618 1618 1685 1643 1643 1711 1619 1619 1686 1619 1619 1686 1643 1643 1711 1644 1644 1712 1619 1619 1686 1644 1644 1712 1620 1620 1687 1620 1620 1687 1644 1644 1712 1645 1645 1713 1620 1620 1687 1645 1645 1713 1621 1621 1688 1621 1621 1688 1645 1645 1713 1646 1646 1714 1621 1621 1688 1646 1646 1714 1622 1622 1689 1622 1622 1689 1646 1646 1714 1647 1647 1715 1622 1622 1689 1647 1647 1715 1623 1623 1690 1623 1623 1690 1647 1647 1715 1648 1648 1716 1623 1623 1690 1648 1648 1716 1624 1624 1691 1624 1624 1691 1648 1648 1716 1649 1649 1717 1624 1624 1691 1649 1649 1717 1625 1625 1692 1625 1625 1692 1649 1649 1717 1650 1650 1718 1625 1625 1692 1650 1650 1718 1626 1626 1693 1626 1626 1693 1650 1650 1718 1651 1651 1719 1626 1626 1693 1651 1651 1719 1627 1627 1694 1627 1627 1694 1651 1651 1719 1652 1652 1720 1627 1627 1694 1652 1652 1720 1628 1628 1695 1628 1628 1695 1652 1652 1720 1653 1653 1721 1628 1628 1695 1653 1653 1721 1629 1629 1696 1629 1629 1696 1653 1653 1721 1654 1654 1722 1629 1629 1696 1654 1654 1722 1630 1630 1697 1630 1630 1697 1654 1654 1722 1655 1655 1723 1630 1630 1697 1655 1655 1723 1631 1631 1698 1631 1631 1698 1655 1655 1723 1632 1632 1724 1631 1631 1698 1632 1632 1724 1608 1608 1699 1632 1632 1700 1656 1656 1725 1657 1657 1726 1632 1632 1700 1657 1657 1726 1633 1633 1701 1633 1633 1701 1657 1657 1726 1658 1658 1727 1633 1633 1701 1658 1658 1727 1634 1634 1702 1634 1634 1702 1658 1658 1727 1659 1659 1728 1634 1634 1702 1659 1659 1728 1635 1635 1703 1635 1635 1703 1659 1659 1728 1660 1660 1729 1635 1635 1703 1660 1660 1729 1636 1636 1704 1636 1636 1704 1660 1660 1729 1661 1661 1730 1636 1636 1704 1661 1661 1730 1637 1637 1705 1637 1637 1705 1661 1661 1730 1662 1662 1731 1637 1637 1705 1662 1662 1731 1638 1638 1706 1638 1638 1706 1662 1662 1731 1663 1663 1732 1638 1638 1706 1663 1663 1732 1639 1639 1707 1639 1639 1707 1663 1663 1732 1664 1664 1733 1639 1639 1707 1664 1664 1733 1640 1640 1708 1640 1640 1708 1664 1664 1733 1665 1665 1734 1640 1640 1708 1665 1665 1734 1641 1641 1709 1641 1641 1709 1665 1665 1734 1666 1666 1735 1641 1641 1709 1666 1666 1735 1642 1642 1710 1642 1642 1710 1666 1666 1735 1667 1667 1736 1642 1642 1710 1667 1667 1736 1643 1643 1711 1643 1643 1711 1667 1667 1736 1668 1668 1737 1643 1643 1711 1668 1668 1737 1644 1644 1712 1644 1644 1712 1668 1668 1737 1669 1669 1738 1644 1644 1712 1669 1669 1738 1645 1645 1713 1645 1645 1713 1669 1669 1738 1670 1670 1739 1645 1645 1713 1670 1670 1739 1646 1646 1714 1646 1646 1714 1670 1670 1739 1671 1671 1740 1646 1646 1714 1671 1671 1740 1647 1647 1715 1647 1647 1715 1671 1671 1740 1672 1672 1741 1647 1647 1715 1672 1672 1741 1648 1648 1716 1648 1648 1716 1672 1672 1741 1673 1673 1742 1648 1648 1716 1673 1673 1742 1649 1649 1717 1649 1649 1717 1673 1673 1742 1674 1674 1743 1649 1649 1717 1674 1674 1743 1650 1650 1718 1650 1650 1718 1674 1674 1743 1675 1675 1744 1650 1650 1718 1675 1675 1744 1651 1651 1719 1651 1651 1719 1675 1675 1744 1676 1676 1745 1651 1651 1719 1676 1676 1745 1652 1652 1720 1652 1652 1720 1676 1676 1745 1677 1677 1746 1652 1652 1720 1677 1677 1746 1653 1653 1721 1653 1653 1721 1677 1677 1746 1678 1678 1747 1653 1653 1721 1678 1678 1747 1654 1654 1722 1654 1654 1722 1678 1678 1747 1679 1679 1748 1654 1654 1722 1679 1679 1748 1655 1655 1723 1655 1655 1723 1679 1679 1748 1656 1656 1749 1655 1655 1723 1656 1656 1749 1632 1632 1724 1656 1656 1725 1680 1680 1750 1681 1681 1751 1656 1656 1725 1681 1681 1751 1657 1657 1726 1657 1657 1726 1681 1681 1751 1682 1682 1752 1657 1657 1726 1682 1682 1752 1658 1658 1727 1658 1658 1727 1682 1682 1752 1683 1683 1753 1658 1658 1727 1683 1683 1753 1659 1659 1728 1659 1659 1728 1683 1683 1753 1684 1684 1754 1659 1659 1728 1684 1684 1754 1660 1660 1729 1660 1660 1729 1684 1684 1754 1685 1685 1755 1660 1660 1729 1685 1685 1755 1661 1661 1730 1661 1661 1730 1685 1685 1755 1686 1686 1756 1661 1661 1730 1686 1686 1756 1662 1662 1731 1662 1662 1731 1686 1686 1756 1687 1687 1757 1662 1662 1731 1687 1687 1757 1663 1663 1732 1663 1663 1732 1687 1687 1757 1688 1688 1758 1663 1663 1732 1688 1688 1758 1664 1664 1733 1664 1664 1733 1688 1688 1758 1689 1689 1759 1664 1664 1733 1689 1689 1759 1665 1665 1734 1665 1665 1734 1689 1689 1759 1690 1690 1760 1665 1665 1734 1690 1690 1760 1666 1666 1735 1666 1666 1735 1690 1690 1760 1691 1691 1761 1666 1666 1735 1691 1691 1761 1667 1667 1736 1667 1667 1736 1691 1691 1761 1692 1692 1762 1667 1667 1736 1692 1692 1762 1668 1668 1737 1668 1668 1737 1692 1692 1762 1693 1693 1763 1668 1668 1737 1693 1693 1763 1669 1669 1738 1669 1669 1738 1693 1693 1763 1694 1694 1764 1669 1669 1738 1694 1694 1764 1670 1670 1739 1670 1670 1739 1694 1694 1764 1695 1695 1765 1670 1670 1739 1695 1695 1765 1671 1671 1740 1671 1671 1740 1695 1695 1765 1696 1696 1766 1671 1671 1740 1696 1696 1766 1672 1672 1741 1672 1672 1741 1696 1696 1766 1697 1697 1767 1672 1672 1741 1697 1697 1767 1673 1673 1742 1673 1673 1742 1697 1697 1767 1698 1698 1768 1673 1673 1742 1698 1698 1768 1674 1674 1743 1674 1674 1743 1698 1698 1768 1699 1699 1769 1674 1674 1743 1699 1699 1769 1675 1675 1744 1675 1675 1744 1699 1699 1769 1700 1700 1770 1675 1675 1744 1700 1700 1770 1676 1676 1745 1676 1676 1745 1700 1700 1770 1701 1701 1771 1676 1676 1745 1701 1701 1771 1677 1677 1746 1677 1677 1746 1701 1701 1771 1702 1702 1772 1677 1677 1746 1702 1702 1772 1678 1678 1747 1678 1678 1747 1702 1702 1772 1703 1703 1773 1678 1678 1747 1703 1703 1773 1679 1679 1748 1679 1679 1748 1703 1703 1773 1680 1680 1774 1679 1679 1748 1680 1680 1774 1656 1656 1749 1680 1680 1750 1704 1704 1775 1705 1705 1776 1680 1680 1750 1705 1705 1776 1681 1681 1751 1681 1681 1751 1705 1705 1776 1706 1706 1777 1681 1681 1751 1706 1706 1777 1682 1682 1752 1682 1682 1752 1706 1706 1777 1707 1707 1778 1682 1682 1752 1707 1707 1778 1683 1683 1753 1683 1683 1753 1707 1707 1778 1708 1708 1779 1683 1683 1753 1708 1708 1779 1684 1684 1754 1684 1684 1754 1708 1708 1779 1709 1709 1780 1684 1684 1754 1709 1709 1780 1685 1685 1755 1685 1685 1755 1709 1709 1780 1710 1710 1781 1685 1685 1755 1710 1710 1781 1686 1686 1756 1686 1686 1756 1710 1710 1781 1711 1711 1782 1686 1686 1756 1711 1711 1782 1687 1687 1757 1687 1687 1757 1711 1711 1782 1712 1712 1783 1687 1687 1757 1712 1712 1783 1688 1688 1758 1688 1688 1758 1712 1712 1783 1713 1713 1784 1688 1688 1758 1713 1713 1784 1689 1689 1759 1689 1689 1759 1713 1713 1784 1714 1714 1785 1689 1689 1759 1714 1714 1785 1690 1690 1760 1690 1690 1760 1714 1714 1785 1715 1715 1786 1690 1690 1760 1715 1715 1786 1691 1691 1761 1691 1691 1761 1715 1715 1786 1716 1716 1787 1691 1691 1761 1716 1716 1787 1692 1692 1762 1692 1692 1762 1716 1716 1787 1717 1717 1788 1692 1692 1762 1717 1717 1788 1693 1693 1763 1693 1693 1763 1717 1717 1788 1718 1718 1789 1693 1693 1763 1718 1718 1789 1694 1694 1764 1694 1694 1764 1718 1718 1789 1719 1719 1790 1694 1694 1764 1719 1719 1790 1695 1695 1765 1695 1695 1765 1719 1719 1790 1720 1720 1791 1695 1695 1765 1720 1720 1791 1696 1696 1766 1696 1696 1766 1720 1720 1791 1721 1721 1792 1696 1696 1766 1721 1721 1792 1697 1697 1767 1697 1697 1767 1721 1721 1792 1722 1722 1793 1697 1697 1767 1722 1722 1793 1698 1698 1768 1698 1698 1768 1722 1722 1793 1723 1723 1794 1698 1698 1768 1723 1723 1794 1699 1699 1769 1699 1699 1769 1723 1723 1794 1724 1724 1795 1699 1699 1769 1724 1724 1795 1700 1700 1770 1700 1700 1770 1724 1724 1795 1725 1725 1796 1700 1700 1770 1725 1725 1796 1701 1701 1771 1701 1701 1771 1725 1725 1796 1726 1726 1797 1701 1701 1771 1726 1726 1797 1702 1702 1772 1702 1702 1772 1726 1726 1797 1727 1727 1798 1702 1702 1772 1727 1727 1798 1703 1703 1773 1703 1703 1773 1727 1727 1798 1704 1704 1799 1703 1703 1773 1704 1704 1799 1680 1680 1774 1704 1704 1775 1728 1728 1800 1729 1729 1801 1704 1704 1775 1729 1729 1801 1705 1705 1776 1705 1705 1776 1729 1729 1801 1730 1730 1802 1705 1705 1776 1730 1730 1802 1706 1706 1777 1706 1706 1777 1730 1730 1802 1731 1731 1803 1706 1706 1777 1731 1731 1803 1707 1707 1778 1707 1707 1778 1731 1731 1803 1732 1732 1804 1707 1707 1778 1732 1732 1804 1708 1708 1779 1708 1708 1779 1732 1732 1804 1733 1733 1805 1708 1708 1779 1733 1733 1805 1709 1709 1780 1709 1709 1780 1733 1733 1805 1734 1734 1806 1709 1709 1780 1734 1734 1806 1710 1710 1781 1710 1710 1781 1734 1734 1806 1735 1735 1807 1710 1710 1781 1735 1735 1807 1711 1711 1782 1711 1711 1782 1735 1735 1807 1736 1736 1808 1711 1711 1782 1736 1736 1808 1712 1712 1783 1712 1712 1783 1736 1736 1808 1737 1737 1809 1712 1712 1783 1737 1737 1809 1713 1713 1784 1713 1713 1784 1737 1737 1809 1738 1738 1810 1713 1713 1784 1738 1738 1810 1714 1714 1785 1714 1714 1785 1738 1738 1810 1739 1739 1811 1714 1714 1785 1739 1739 1811 1715 1715 1786 1715 1715 1786 1739 1739 1811 1740 1740 1812 1715 1715 1786 1740 1740 1812 1716 1716 1787 1716 1716 1787 1740 1740 1812 1741 1741 1813 1716 1716 1787 1741 1741 1813 1717 1717 1788 1717 1717 1788 1741 1741 1813 1742 1742 1814 1717 1717 1788 1742 1742 1814 1718 1718 1789 1718 1718 1789 1742 1742 1814 1743 1743 1815 1718 1718 1789 1743 1743 1815 1719 1719 1790 1719 1719 1790 1743 1743 1815 1744 1744 1816 1719 1719 1790 1744 1744 1816 1720 1720 1791 1720 1720 1791 1744 1744 1816 1745 1745 1817 1720 1720 1791 1745 1745 1817 1721 1721 1792 1721 1721 1792 1745 1745 1817 1746 1746 1818 1721 1721 1792 1746 1746 1818 1722 1722 1793 1722 1722 1793 1746 1746 1818 1747 1747 1819 1722 1722 1793 1747 1747 1819 1723 1723 1794 1723 1723 1794 1747 1747 1819 1748 1748 1820 1723 1723 1794 1748 1748 1820 1724 1724 1795 1724 1724 1795 1748 1748 1820 1749 1749 1821 1724 1724 1795 1749 1749 1821 1725 1725 1796 1725 1725 1796 1749 1749 1821 1750 1750 1822 1725 1725 1796 1750 1750 1822 1726 1726 1797 1726 1726 1797 1750 1750 1822 1751 1751 1823 1726 1726 1797 1751 1751 1823 1727 1727 1798 1727 1727 1798 1751 1751 1823 1728 1728 1824 1727 1727 1798 1728 1728 1824 1704 1704 1799 1728 1728 1800 1752 1752 1825 1753 1753 1826 1728 1728 1800 1753 1753 1826 1729 1729 1801 1729 1729 1801 1753 1753 1826 1754 1754 1827 1729 1729 1801 1754 1754 1827 1730 1730 1802 1730 1730 1802 1754 1754 1827 1755 1755 1828 1730 1730 1802 1755 1755 1828 1731 1731 1803 1731 1731 1803 1755 1755 1828 1756 1756 1829 1731 1731 1803 1756 1756 1829 1732 1732 1804 1732 1732 1804 1756 1756 1829 1757 1757 1830 1732 1732 1804 1757 1757 1830 1733 1733 1805 1733 1733 1805 1757 1757 1830 1758 1758 1831 1733 1733 1805 1758 1758 1831 1734 1734 1806 1734 1734 1806 1758 1758 1831 1759 1759 1832 1734 1734 1806 1759 1759 1832 1735 1735 1807 1735 1735 1807 1759 1759 1832 1760 1760 1833 1735 1735 1807 1760 1760 1833 1736 1736 1808 1736 1736 1808 1760 1760 1833 1761 1761 1834 1736 1736 1808 1761 1761 1834 1737 1737 1809 1737 1737 1809 1761 1761 1834 1762 1762 1835 1737 1737 1809 1762 1762 1835 1738 1738 1810 1738 1738 1810 1762 1762 1835 1763 1763 1836 1738 1738 1810 1763 1763 1836 1739 1739 1811 1739 1739 1811 1763 1763 1836 1764 1764 1837 1739 1739 1811 1764 1764 1837 1740 1740 1812 1740 1740 1812 1764 1764 1837 1765 1765 1838 1740 1740 1812 1765 1765 1838 1741 1741 1813 1741 1741 1813 1765 1765 1838 1766 1766 1839 1741 1741 1813 1766 1766 1839 1742 1742 1814 1742 1742 1814 1766 1766 1839 1767 1767 1840 1742 1742 1814 1767 1767 1840 1743 1743 1815 1743 1743 1815 1767 1767 1840 1768 1768 1841 1743 1743 1815 1768 1768 1841 1744 1744 1816 1744 1744 1816 1768 1768 1841 1769 1769 1842 1744 1744 1816 1769 1769 1842 1745 1745 1817 1745 1745 1817 1769 1769 1842 1770 1770 1843 1745 1745 1817 1770 1770 1843 1746 1746 1818 1746 1746 1818 1770 1770 1843 1771 1771 1844 1746 1746 1818 1771 1771 1844 1747 1747 1819 1747 1747 1819 1771 1771 1844 1772 1772 1845 1747 1747 1819 1772 1772 1845 1748 1748 1820 1748 1748 1820 1772 1772 1845 1773 1773 1846 1748 1748 1820 1773 1773 1846 1749 1749 1821 1749 1749 1821 1773 1773 1846 1774 1774 1847 1749 1749 1821 1774 1774 1847 1750 1750 1822 1750 1750 1822 1774 1774 1847 1775 1775 1848 1750 1750 1822 1775 1775 1848 1751 1751 1823 1751 1751 1823 1775 1775 1848 1752 1752 1849 1751 1751 1823 1752 1752 1849 1728 1728 1824 1752 1752 1825 1776 1776 1850 1777 1777 1851 1752 1752 1825 1777 1777 1851 1753 1753 1826 1753 1753 1826 1777 1777 1851 1778 1778 1852 1753 1753 1826 1778 1778 1852 1754 1754 1827 1754 1754 1827 1778 1778 1852 1779 1779 1853 1754 1754 1827 1779 1779 1853 1755 1755 1828 1755 1755 1828 1779 1779 1853 1780 1780 1854 1755 1755 1828 1780 1780 1854 1756 1756 1829 1756 1756 1829 1780 1780 1854 1781 1781 1855 1756 1756 1829 1781 1781 1855 1757 1757 1830 1757 1757 1830 1781 1781 1855 1782 1782 1856 1757 1757 1830 1782 1782 1856 1758 1758 1831 1758 1758 1831 1782 1782 1856 1783 1783 1857 1758 1758 1831 1783 1783 1857 1759 1759 1832 1759 1759 1832 1783 1783 1857 1784 1784 1858 1759 1759 1832 1784 1784 1858 1760 1760 1833 1760 1760 1833 1784 1784 1858 1785 1785 1859 1760 1760 1833 1785 1785 1859 1761 1761 1834 1761 1761 1834 1785 1785 1859 1786 1786 1860 1761 1761 1834 1786 1786 1860 1762 1762 1835 1762 1762 1835 1786 1786 1860 1787 1787 1861 1762 1762 1835 1787 1787 1861 1763 1763 1836 1763 1763 1836 1787 1787 1861 1788 1788 1862 1763 1763 1836 1788 1788 1862 1764 1764 1837 1764 1764 1837 1788 1788 1862 1789 1789 1863 1764 1764 1837 1789 1789 1863 1765 1765 1838 1765 1765 1838 1789 1789 1863 1790 1790 1864 1765 1765 1838 1790 1790 1864 1766 1766 1839 1766 1766 1839 1790 1790 1864 1791 1791 1865 1766 1766 1839 1791 1791 1865 1767 1767 1840 1767 1767 1840 1791 1791 1865 1792 1792 1866 1767 1767 1840 1792 1792 1866 1768 1768 1841 1768 1768 1841 1792 1792 1866 1793 1793 1867 1768 1768 1841 1793 1793 1867 1769 1769 1842 1769 1769 1842 1793 1793 1867 1794 1794 1868 1769 1769 1842 1794 1794 1868 1770 1770 1843 1770 1770 1843 1794 1794 1868 1795 1795 1869 1770 1770 1843 1795 1795 1869 1771 1771 1844 1771 1771 1844 1795 1795 1869 1796 1796 1870 1771 1771 1844 1796 1796 1870 1772 1772 1845 1772 1772 1845 1796 1796 1870 1797 1797 1871 1772 1772 1845 1797 1797 1871 1773 1773 1846 1773 1773 1846 1797 1797 1871 1798 1798 1872 1773 1773 1846 1798 1798 1872 1774 1774 1847 1774 1774 1847 1798 1798 1872 1799 1799 1873 1774 1774 1847 1799 1799 1873 1775 1775 1848 1775 1775 1848 1799 1799 1873 1776 1776 1874 1775 1775 1848 1776 1776 1874 1752 1752 1849 1776 1776 1850 1800 1800 1875 1801 1801 1876 1776 1776 1850 1801 1801 1876 1777 1777 1851 1777 1777 1851 1801 1801 1876 1802 1802 1877 1777 1777 1851 1802 1802 1877 1778 1778 1852 1778 1778 1852 1802 1802 1877 1803 1803 1878 1778 1778 1852 1803 1803 1878 1779 1779 1853 1779 1779 1853 1803 1803 1878 1804 1804 1879 1779 1779 1853 1804 1804 1879 1780 1780 1854 1780 1780 1854 1804 1804 1879 1805 1805 1880 1780 1780 1854 1805 1805 1880 1781 1781 1855 1781 1781 1855 1805 1805 1880 1806 1806 1881 1781 1781 1855 1806 1806 1881 1782 1782 1856 1782 1782 1856 1806 1806 1881 1807 1807 1882 1782 1782 1856 1807 1807 1882 1783 1783 1857 1783 1783 1857 1807 1807 1882 1808 1808 1883 1783 1783 1857 1808 1808 1883 1784 1784 1858 1784 1784 1858 1808 1808 1883 1809 1809 1884 1784 1784 1858 1809 1809 1884 1785 1785 1859 1785 1785 1859 1809 1809 1884 1810 1810 1885 1785 1785 1859 1810 1810 1885 1786 1786 1860 1786 1786 1860 1810 1810 1885 1811 1811 1886 1786 1786 1860 1811 1811 1886 1787 1787 1861 1787 1787 1861 1811 1811 1886 1812 1812 1887 1787 1787 1861 1812 1812 1887 1788 1788 1862 1788 1788 1862 1812 1812 1887 1813 1813 1888 1788 1788 1862 1813 1813 1888 1789 1789 1863 1789 1789 1863 1813 1813 1888 1814 1814 1889 1789 1789 1863 1814 1814 1889 1790 1790 1864 1790 1790 1864 1814 1814 1889 1815 1815 1890 1790 1790 1864 1815 1815 1890 1791 1791 1865 1791 1791 1865 1815 1815 1890 1816 1816 1891 1791 1791 1865 1816 1816 1891 1792 1792 1866 1792 1792 1866 1816 1816 1891 1817 1817 1892 1792 1792 1866 1817 1817 1892 1793 1793 1867 1793 1793 1867 1817 1817 1892 1818 1818 1893 1793 1793 1867 1818 1818 1893 1794 1794 1868 1794 1794 1868 1818 1818 1893 1819 1819 1894 1794 1794 1868 1819 1819 1894 1795 1795 1869 1795 1795 1869 1819 1819 1894 1820 1820 1895 1795 1795 1869 1820 1820 1895 1796 1796 1870 1796 1796 1870 1820 1820 1895 1821 1821 1896 1796 1796 1870 1821 1821 1896 1797 1797 1871 1797 1797 1871 1821 1821 1896 1822 1822 1897 1797 1797 1871 1822 1822 1897 1798 1798 1872 1798 1798 1872 1822 1822 1897 1823 1823 1898 1798 1798 1872 1823 1823 1898 1799 1799 1873 1799 1799 1873 1823 1823 1898 1800 1800 1899 1799 1799 1873 1800 1800 1899 1776 1776 1874 1800 1800 1875 1824 1824 1900 1825 1825 1901 1800 1800 1875 1825 1825 1901 1801 1801 1876 1801 1801 1876 1825 1825 1901 1826 1826 1902 1801 1801 1876 1826 1826 1902 1802 1802 1877 1802 1802 1877 1826 1826 1902 1827 1827 1903 1802 1802 1877 1827 1827 1903 1803 1803 1878 1803 1803 1878 1827 1827 1903 1828 1828 1904 1803 1803 1878 1828 1828 1904 1804 1804 1879 1804 1804 1879 1828 1828 1904 1829 1829 1905 1804 1804 1879 1829 1829 1905 1805 1805 1880 1805 1805 1880 1829 1829 1905 1830 1830 1906 1805 1805 1880 1830 1830 1906 1806 1806 1881 1806 1806 1881 1830 1830 1906 1831 1831 1907 1806 1806 1881 1831 1831 1907 1807 1807 1882 1807 1807 1882 1831 1831 1907 1832 1832 1908 1807 1807 1882 1832 1832 1908 1808 1808 1883 1808 1808 1883 1832 1832 1908 1833 1833 1909 1808 1808 1883 1833 1833 1909 1809 1809 1884 1809 1809 1884 1833 1833 1909 1834 1834 1910 1809 1809 1884 1834 1834 1910 1810 1810 1885 1810 1810 1885 1834 1834 1910 1835 1835 1911 1810 1810 1885 1835 1835 1911 1811 1811 1886 1811 1811 1886 1835 1835 1911 1836 1836 1912 1811 1811 1886 1836 1836 1912 1812 1812 1887 1812 1812 1887 1836 1836 1912 1837 1837 1913 1812 1812 1887 1837 1837 1913 1813 1813 1888 1813 1813 1888 1837 1837 1913 1838 1838 1914 1813 1813 1888 1838 1838 1914 1814 1814 1889 1814 1814 1889 1838 1838 1914 1839 1839 1915 1814 1814 1889 1839 1839 1915 1815 1815 1890 1815 1815 1890 1839 1839 1915 1840 1840 1916 1815 1815 1890 1840 1840 1916 1816 1816 1891 1816 1816 1891 1840 1840 1916 1841 1841 1917 1816 1816 1891 1841 1841 1917 1817 1817 1892 1817 1817 1892 1841 1841 1917 1842 1842 1918 1817 1817 1892 1842 1842 1918 1818 1818 1893 1818 1818 1893 1842 1842 1918 1843 1843 1919 1818 1818 1893 1843 1843 1919 1819 1819 1894 1819 1819 1894 1843 1843 1919 1844 1844 1920 1819 1819 1894 1844 1844 1920 1820 1820 1895 1820 1820 1895 1844 1844 1920 1845 1845 1921 1820 1820 1895 1845 1845 1921 1821 1821 1896 1821 1821 1896 1845 1845 1921 1846 1846 1922 1821 1821 1896 1846 1846 1922 1822 1822 1897 1822 1822 1897 1846 1846 1922 1847 1847 1923 1822 1822 1897 1847 1847 1923 1823 1823 1898 1823 1823 1898 1847 1847 1923 1824 1824 1924 1823 1823 1898 1824 1824 1924 1800 1800 1899 1824 1824 1900 1848 1848 1925 1849 1849 1926 1824 1824 1900 1849 1849 1926 1825 1825 1901 1825 1825 1901 1849 1849 1926 1850 1850 1927 1825 1825 1901 1850 1850 1927 1826 1826 1902 1826 1826 1902 1850 1850 1927 1851 1851 1928 1826 1826 1902 1851 1851 1928 1827 1827 1903 1827 1827 1903 1851 1851 1928 1852 1852 1929 1827 1827 1903 1852 1852 1929 1828 1828 1904 1828 1828 1904 1852 1852 1929 1853 1853 1930 1828 1828 1904 1853 1853 1930 1829 1829 1905 1829 1829 1905 1853 1853 1930 1854 1854 1931 1829 1829 1905 1854 1854 1931 1830 1830 1906 1830 1830 1906 1854 1854 1931 1855 1855 1932 1830 1830 1906 1855 1855 1932 1831 1831 1907 1831 1831 1907 1855 1855 1932 1856 1856 1933 1831 1831 1907 1856 1856 1933 1832 1832 1908 1832 1832 1908 1856 1856 1933 1857 1857 1934 1832 1832 1908 1857 1857 1934 1833 1833 1909 1833 1833 1909 1857 1857 1934 1858 1858 1935 1833 1833 1909 1858 1858 1935 1834 1834 1910 1834 1834 1910 1858 1858 1935 1859 1859 1936 1834 1834 1910 1859 1859 1936 1835 1835 1911 1835 1835 1911 1859 1859 1936 1860 1860 1937 1835 1835 1911 1860 1860 1937 1836 1836 1912 1836 1836 1912 1860 1860 1937 1861 1861 1938 1836 1836 1912 1861 1861 1938 1837 1837 1913 1837 1837 1913 1861 1861 1938 1862 1862 1939 1837 1837 1913 1862 1862 1939 1838 1838 1914 1838 1838 1914 1862 1862 1939 1863 1863 1940 1838 1838 1914 1863 1863 1940 1839 1839 1915 1839 1839 1915 1863 1863 1940 1864 1864 1941 1839 1839 1915 1864 1864 1941 1840 1840 1916 1840 1840 1916 1864 1864 1941 1865 1865 1942 1840 1840 1916 1865 1865 1942 1841 1841 1917 1841 1841 1917 1865 1865 1942 1866 1866 1943 1841 1841 1917 1866 1866 1943 1842 1842 1918 1842 1842 1918 1866 1866 1943 1867 1867 1944 1842 1842 1918 1867 1867 1944 1843 1843 1919 1843 1843 1919 1867 1867 1944 1868 1868 1945 1843 1843 1919 1868 1868 1945 1844 1844 1920 1844 1844 1920 1868 1868 1945 1869 1869 1946 1844 1844 1920 1869 1869 1946 1845 1845 1921 1845 1845 1921 1869 1869 1946 1870 1870 1947 1845 1845 1921 1870 1870 1947 1846 1846 1922 1846 1846 1922 1870 1870 1947 1871 1871 1948 1846 1846 1922 1871 1871 1948 1847 1847 1923 1847 1847 1923 1871 1871 1948 1848 1848 1949 1847 1847 1923 1848 1848 1949 1824 1824 1924 1848 1848 1925 1872 1872 1950 1873 1873 1951 1848 1848 1925 1873 1873 1951 1849 1849 1926 1849 1849 1926 1873 1873 1951 1874 1874 1952 1849 1849 1926 1874 1874 1952 1850 1850 1927 1850 1850 1927 1874 1874 1952 1875 1875 1953 1850 1850 1927 1875 1875 1953 1851 1851 1928 1851 1851 1928 1875 1875 1953 1876 1876 1954 1851 1851 1928 1876 1876 1954 1852 1852 1929 1852 1852 1929 1876 1876 1954 1877 1877 1955 1852 1852 1929 1877 1877 1955 1853 1853 1930 1853 1853 1930 1877 1877 1955 1878 1878 1956 1853 1853 1930 1878 1878 1956 1854 1854 1931 1854 1854 1931 1878 1878 1956 1879 1879 1957 1854 1854 1931 1879 1879 1957 1855 1855 1932 1855 1855 1932 1879 1879 1957 1880 1880 1958 1855 1855 1932 1880 1880 1958 1856 1856 1933 1856 1856 1933 1880 1880 1958 1881 1881 1959 1856 1856 1933 1881 1881 1959 1857 1857 1934 1857 1857 1934 1881 1881 1959 1882 1882 1960 1857 1857 1934 1882 1882 1960 1858 1858 1935 1858 1858 1935 1882 1882 1960 1883 1883 1961 1858 1858 1935 1883 1883 1961 1859 1859 1936 1859 1859 1936 1883 1883 1961 1884 1884 1962 1859 1859 1936 1884 1884 1962 1860 1860 1937 1860 1860 1937 1884 1884 1962 1885 1885 1963 1860 1860 1937 1885 1885 1963 1861 1861 1938 1861 1861 1938 1885 1885 1963 1886 1886 1964 1861 1861 1938 1886 1886 1964 1862 1862 1939 1862 1862 1939 1886 1886 1964 1887 1887 1965 1862 1862 1939 1887 1887 1965 1863 1863 1940 1863 1863 1940 1887 1887 1965 1888 1888 1966 1863 1863 1940 1888 1888 1966 1864 1864 1941 1864 1864 1941 1888 1888 1966 1889 1889 1967 1864 1864 1941 1889 1889 1967 1865 1865 1942 1865 1865 1942 1889 1889 1967 1890 1890 1968 1865 1865 1942 1890 1890 1968 1866 1866 1943 1866 1866 1943 1890 1890 1968 1891 1891 1969 1866 1866 1943 1891 1891 1969 1867 1867 1944 1867 1867 1944 1891 1891 1969 1892 1892 1970 1867 1867 1944 1892 1892 1970 1868 1868 1945 1868 1868 1945 1892 1892 1970 1893 1893 1971 1868 1868 1945 1893 1893 1971 1869 1869 1946 1869 1869 1946 1893 1893 1971 1894 1894 1972 1869 1869 1946 1894 1894 1972 1870 1870 1947 1870 1870 1947 1894 1894 1972 1895 1895 1973 1870 1870 1947 1895 1895 1973 1871 1871 1948 1871 1871 1948 1895 1895 1973 1872 1872 1974 1871 1871 1948 1872 1872 1974 1848 1848 1949 1872 1872 1950 1896 1896 1975 1897 1897 1976 1872 1872 1950 1897 1897 1976 1873 1873 1951 1873 1873 1951 1897 1897 1976 1898 1898 1977 1873 1873 1951 1898 1898 1977 1874 1874 1952 1874 1874 1952 1898 1898 1977 1899 1899 1978 1874 1874 1952 1899 1899 1978 1875 1875 1953 1875 1875 1953 1899 1899 1978 1900 1900 1979 1875 1875 1953 1900 1900 1979 1876 1876 1954 1876 1876 1954 1900 1900 1979 1901 1901 1980 1876 1876 1954 1901 1901 1980 1877 1877 1955 1877 1877 1955 1901 1901 1980 1902 1902 1981 1877 1877 1955 1902 1902 1981 1878 1878 1956 1878 1878 1956 1902 1902 1981 1903 1903 1982 1878 1878 1956 1903 1903 1982 1879 1879 1957 1879 1879 1957 1903 1903 1982 1904 1904 1983 1879 1879 1957 1904 1904 1983 1880 1880 1958 1880 1880 1958 1904 1904 1983 1905 1905 1984 1880 1880 1958 1905 1905 1984 1881 1881 1959 1881 1881 1959 1905 1905 1984 1906 1906 1985 1881 1881 1959 1906 1906 1985 1882 1882 1960 1882 1882 1960 1906 1906 1985 1907 1907 1986 1882 1882 1960 1907 1907 1986 1883 1883 1961 1883 1883 1961 1907 1907 1986 1908 1908 1987 1883 1883 1961 1908 1908 1987 1884 1884 1962 1884 1884 1962 1908 1908 1987 1909 1909 1988 1884 1884 1962 1909 1909 1988 1885 1885 1963 1885 1885 1963 1909 1909 1988 1910 1910 1989 1885 1885 1963 1910 1910 1989 1886 1886 1964 1886 1886 1964 1910 1910 1989 1911 1911 1990 1886 1886 1964 1911 1911 1990 1887 1887 1965 1887 1887 1965 1911 1911 1990 1912 1912 1991 1887 1887 1965 1912 1912 1991 1888 1888 1966 1888 1888 1966 1912 1912 1991 1913 1913 1992 1888 1888 1966 1913 1913 1992 1889 1889 1967 1889 1889 1967 1913 1913 1992 1914 1914 1993 1889 1889 1967 1914 1914 1993 1890 1890 1968 1890 1890 1968 1914 1914 1993 1915 1915 1994 1890 1890 1968 1915 1915 1994 1891 1891 1969 1891 1891 1969 1915 1915 1994 1916 1916 1995 1891 1891 1969 1916 1916 1995 1892 1892 1970 1892 1892 1970 1916 1916 1995 1917 1917 1996 1892 1892 1970 1917 1917 1996 1893 1893 1971 1893 1893 1971 1917 1917 1996 1918 1918 1997 1893 1893 1971 1918 1918 1997 1894 1894 1972 1894 1894 1972 1918 1918 1997 1919 1919 1998 1894 1894 1972 1919 1919 1998 1895 1895 1973 1895 1895 1973 1919 1919 1998 1896 1896 1999 1895 1895 1973 1896 1896 1999 1872 1872 1974 1896 1896 1975 1920 1920 2000 1921 1921 2001 1896 1896 1975 1921 1921 2001 1897 1897 1976 1897 1897 1976 1921 1921 2001 1922 1922 2002 1897 1897 1976 1922 1922 2002 1898 1898 1977 1898 1898 1977 1922 1922 2002 1923 1923 2003 1898 1898 1977 1923 1923 2003 1899 1899 1978 1899 1899 1978 1923 1923 2003 1924 1924 2004 1899 1899 1978 1924 1924 2004 1900 1900 1979 1900 1900 1979 1924 1924 2004 1925 1925 2005 1900 1900 1979 1925 1925 2005 1901 1901 1980 1901 1901 1980 1925 1925 2005 1926 1926 2006 1901 1901 1980 1926 1926 2006 1902 1902 1981 1902 1902 1981 1926 1926 2006 1927 1927 2007 1902 1902 1981 1927 1927 2007 1903 1903 1982 1903 1903 1982 1927 1927 2007 1928 1928 2008 1903 1903 1982 1928 1928 2008 1904 1904 1983 1904 1904 1983 1928 1928 2008 1929 1929 2009 1904 1904 1983 1929 1929 2009 1905 1905 1984 1905 1905 1984 1929 1929 2009 1930 1930 2010 1905 1905 1984 1930 1930 2010 1906 1906 1985 1906 1906 1985 1930 1930 2010 1931 1931 2011 1906 1906 1985 1931 1931 2011 1907 1907 1986 1907 1907 1986 1931 1931 2011 1932 1932 2012 1907 1907 1986 1932 1932 2012 1908 1908 1987 1908 1908 1987 1932 1932 2012 1933 1933 2013 1908 1908 1987 1933 1933 2013 1909 1909 1988 1909 1909 1988 1933 1933 2013 1934 1934 2014 1909 1909 1988 1934 1934 2014 1910 1910 1989 1910 1910 1989 1934 1934 2014 1935 1935 2015 1910 1910 1989 1935 1935 2015 1911 1911 1990 1911 1911 1990 1935 1935 2015 1936 1936 2016 1911 1911 1990 1936 1936 2016 1912 1912 1991 1912 1912 1991 1936 1936 2016 1937 1937 2017 1912 1912 1991 1937 1937 2017 1913 1913 1992 1913 1913 1992 1937 1937 2017 1938 1938 2018 1913 1913 1992 1938 1938 2018 1914 1914 1993 1914 1914 1993 1938 1938 2018 1939 1939 2019 1914 1914 1993 1939 1939 2019 1915 1915 1994 1915 1915 1994 1939 1939 2019 1940 1940 2020 1915 1915 1994 1940 1940 2020 1916 1916 1995 1916 1916 1995 1940 1940 2020 1941 1941 2021 1916 1916 1995 1941 1941 2021 1917 1917 1996 1917 1917 1996 1941 1941 2021 1942 1942 2022 1917 1917 1996 1942 1942 2022 1918 1918 1997 1918 1918 1997 1942 1942 2022 1943 1943 2023 1918 1918 1997 1943 1943 2023 1919 1919 1998 1919 1919 1998 1943 1943 2023 1920 1920 2024 1919 1919 1998 1920 1920 2024 1896 1896 1999 1920 1920 2000 1944 1944 2025 1945 1945 2026 1920 1920 2000 1945 1945 2026 1921 1921 2001 1921 1921 2001 1945 1945 2026 1946 1946 2027 1921 1921 2001 1946 1946 2027 1922 1922 2002 1922 1922 2002 1946 1946 2027 1947 1947 2028 1922 1922 2002 1947 1947 2028 1923 1923 2003 1923 1923 2003 1947 1947 2028 1948 1948 2029 1923 1923 2003 1948 1948 2029 1924 1924 2004 1924 1924 2004 1948 1948 2029 1949 1949 2030 1924 1924 2004 1949 1949 2030 1925 1925 2005 1925 1925 2005 1949 1949 2030 1950 1950 2031 1925 1925 2005 1950 1950 2031 1926 1926 2006 1926 1926 2006 1950 1950 2031 1951 1951 2032 1926 1926 2006 1951 1951 2032 1927 1927 2007 1927 1927 2007 1951 1951 2032 1952 1952 2033 1927 1927 2007 1952 1952 2033 1928 1928 2008 1928 1928 2008 1952 1952 2033 1953 1953 2034 1928 1928 2008 1953 1953 2034 1929 1929 2009 1929 1929 2009 1953 1953 2034 1954 1954 2035 1929 1929 2009 1954 1954 2035 1930 1930 2010 1930 1930 2010 1954 1954 2035 1955 1955 2036 1930 1930 2010 1955 1955 2036 1931 1931 2011 1931 1931 2011 1955 1955 2036 1956 1956 2037 1931 1931 2011 1956 1956 2037 1932 1932 2012 1932 1932 2012 1956 1956 2037 1957 1957 2038 1932 1932 2012 1957 1957 2038 1933 1933 2013 1933 1933 2013 1957 1957 2038 1958 1958 2039 1933 1933 2013 1958 1958 2039 1934 1934 2014 1934 1934 2014 1958 1958 2039 1959 1959 2040 1934 1934 2014 1959 1959 2040 1935 1935 2015 1935 1935 2015 1959 1959 2040 1960 1960 2041 1935 1935 2015 1960 1960 2041 1936 1936 2016 1936 1936 2016 1960 1960 2041 1961 1961 2042 1936 1936 2016 1961 1961 2042 1937 1937 2017 1937 1937 2017 1961 1961 2042 1962 1962 2043 1937 1937 2017 1962 1962 2043 1938 1938 2018 1938 1938 2018 1962 1962 2043 1963 1963 2044 1938 1938 2018 1963 1963 2044 1939 1939 2019 1939 1939 2019 1963 1963 2044 1964 1964 2045 1939 1939 2019 1964 1964 2045 1940 1940 2020 1940 1940 2020 1964 1964 2045 1965 1965 2046 1940 1940 2020 1965 1965 2046 1941 1941 2021 1941 1941 2021 1965 1965 2046 1966 1966 2047 1941 1941 2021 1966 1966 2047 1942 1942 2022 1942 1942 2022 1966 1966 2047 1967 1967 2048 1942 1942 2022 1967 1967 2048 1943 1943 2023 1943 1943 2023 1967 1967 2048 1944 1944 2049 1943 1943 2023 1944 1944 2049 1920 1920 2024 1944 1944 2025 1968 1968 2050 1969 1969 2051 1944 1944 2025 1969 1969 2051 1945 1945 2026 1945 1945 2026 1969 1969 2051 1970 1970 2052 1945 1945 2026 1970 1970 2052 1946 1946 2027 1946 1946 2027 1970 1970 2052 1971 1971 2053 1946 1946 2027 1971 1971 2053 1947 1947 2028 1947 1947 2028 1971 1971 2053 1972 1972 2054 1947 1947 2028 1972 1972 2054 1948 1948 2029 1948 1948 2029 1972 1972 2054 1973 1973 2055 1948 1948 2029 1973 1973 2055 1949 1949 2030 1949 1949 2030 1973 1973 2055 1974 1974 2056 1949 1949 2030 1974 1974 2056 1950 1950 2031 1950 1950 2031 1974 1974 2056 1975 1975 2057 1950 1950 2031 1975 1975 2057 1951 1951 2032 1951 1951 2032 1975 1975 2057 1976 1976 2058 1951 1951 2032 1976 1976 2058 1952 1952 2033 1952 1952 2033 1976 1976 2058 1977 1977 2059 1952 1952 2033 1977 1977 2059 1953 1953 2034 1953 1953 2034 1977 1977 2059 1978 1978 2060 1953 1953 2034 1978 1978 2060 1954 1954 2035 1954 1954 2035 1978 1978 2060 1979 1979 2061 1954 1954 2035 1979 1979 2061 1955 1955 2036 1955 1955 2036 1979 1979 2061 1980 1980 2062 1955 1955 2036 1980 1980 2062 1956 1956 2037 1956 1956 2037 1980 1980 2062 1981 1981 2063 1956 1956 2037 1981 1981 2063 1957 1957 2038 1957 1957 2038 1981 1981 2063 1982 1982 2064 1957 1957 2038 1982 1982 2064 1958 1958 2039 1958 1958 2039 1982 1982 2064 1983 1983 2065 1958 1958 2039 1983 1983 2065 1959 1959 2040 1959 1959 2040 1983 1983 2065 1984 1984 2066 1959 1959 2040 1984 1984 2066 1960 1960 2041 1960 1960 2041 1984 1984 2066 1985 1985 2067 1960 1960 2041 1985 1985 2067 1961 1961 2042 1961 1961 2042 1985 1985 2067 1986 1986 2068 1961 1961 2042 1986 1986 2068 1962 1962 2043 1962 1962 2043 1986 1986 2068 1987 1987 2069 1962 1962 2043 1987 1987 2069 1963 1963 2044 1963 1963 2044 1987 1987 2069 1988 1988 2070 1963 1963 2044 1988 1988 2070 1964 1964 2045 1964 1964 2045 1988 1988 2070 1989 1989 2071 1964 1964 2045 1989 1989 2071 1965 1965 2046 1965 1965 2046 1989 1989 2071 1990 1990 2072 1965 1965 2046 1990 1990 2072 1966 1966 2047 1966 1966 2047 1990 1990 2072 1991 1991 2073 1966 1966 2047 1991 1991 2073 1967 1967 2048 1967 1967 2048 1991 1991 2073 1968 1968 2074 1967 1967 2048 1968 1968 2074 1944 1944 2049 1968 1968 2050 1992 1992 2075 1993 1993 2076 1968 1968 2050 1993 1993 2076 1969 1969 2051 1969 1969 2051 1993 1993 2076 1994 1994 2077 1969 1969 2051 1994 1994 2077 1970 1970 2052 1970 1970 2052 1994 1994 2077 1995 1995 2078 1970 1970 2052 1995 1995 2078 1971 1971 2053 1971 1971 2053 1995 1995 2078 1996 1996 2079 1971 1971 2053 1996 1996 2079 1972 1972 2054 1972 1972 2054 1996 1996 2079 1997 1997 2080 1972 1972 2054 1997 1997 2080 1973 1973 2055 1973 1973 2055 1997 1997 2080 1998 1998 2081 1973 1973 2055 1998 1998 2081 1974 1974 2056 1974 1974 2056 1998 1998 2081 1999 1999 2082 1974 1974 2056 1999 1999 2082 1975 1975 2057 1975 1975 2057 1999 1999 2082 2000 2000 2083 1975 1975 2057 2000 2000 2083 1976 1976 2058 1976 1976 2058 2000 2000 2083 2001 2001 2084 1976 1976 2058 2001 2001 2084 1977 1977 2059 1977 1977 2059 2001 2001 2084 2002 2002 2085 1977 1977 2059 2002 2002 2085 1978 1978 2060 1978 1978 2060 2002 2002 2085 2003 2003 2086 1978 1978 2060 2003 2003 2086 1979 1979 2061 1979 1979 2061 2003 2003 2086 2004 2004 2087 1979 1979 2061 2004 2004 2087 1980 1980 2062 1980 1980 2062 2004 2004 2087 2005 2005 2088 1980 1980 2062 2005 2005 2088 1981 1981 2063 1981 1981 2063 2005 2005 2088 2006 2006 2089 1981 1981 2063 2006 2006 2089 1982 1982 2064 1982 1982 2064 2006 2006 2089 2007 2007 2090 1982 1982 2064 2007 2007 2090 1983 1983 2065 1983 1983 2065 2007 2007 2090 2008 2008 2091 1983 1983 2065 2008 2008 2091 1984 1984 2066 1984 1984 2066 2008 2008 2091 2009 2009 2092 1984 1984 2066 2009 2009 2092 1985 1985 2067 1985 1985 2067 2009 2009 2092 2010 2010 2093 1985 1985 2067 2010 2010 2093 1986 1986 2068 1986 1986 2068 2010 2010 2093 2011 2011 2094 1986 1986 2068 2011 2011 2094 1987 1987 2069 1987 1987 2069 2011 2011 2094 2012 2012 2095 1987 1987 2069 2012 2012 2095 1988 1988 2070 1988 1988 2070 2012 2012 2095 2013 2013 2096 1988 1988 2070 2013 2013 2096 1989 1989 2071 1989 1989 2071 2013 2013 2096 2014 2014 2097 1989 1989 2071 2014 2014 2097 1990 1990 2072 1990 1990 2072 2014 2014 2097 2015 2015 2098 1990 1990 2072 2015 2015 2098 1991 1991 2073 1991 1991 2073 2015 2015 2098 1992 1992 2099 1991 1991 2073 1992 1992 2099 1968 1968 2074 1992 1992 2075 2016 2016 2100 2017 2017 2101 1992 1992 2075 2017 2017 2101 1993 1993 2076 1993 1993 2076 2017 2017 2101 2018 2018 2102 1993 1993 2076 2018 2018 2102 1994 1994 2077 1994 1994 2077 2018 2018 2102 2019 2019 2103 1994 1994 2077 2019 2019 2103 1995 1995 2078 1995 1995 2078 2019 2019 2103 2020 2020 2104 1995 1995 2078 2020 2020 2104 1996 1996 2079 1996 1996 2079 2020 2020 2104 2021 2021 2105 1996 1996 2079 2021 2021 2105 1997 1997 2080 1997 1997 2080 2021 2021 2105 2022 2022 2106 1997 1997 2080 2022 2022 2106 1998 1998 2081 1998 1998 2081 2022 2022 2106 2023 2023 2107 1998 1998 2081 2023 2023 2107 1999 1999 2082 1999 1999 2082 2023 2023 2107 2024 2024 2108 1999 1999 2082 2024 2024 2108 2000 2000 2083 2000 2000 2083 2024 2024 2108 2025 2025 2109 2000 2000 2083 2025 2025 2109 2001 2001 2084 2001 2001 2084 2025 2025 2109 2026 2026 2110 2001 2001 2084 2026 2026 2110 2002 2002 2085 2002 2002 2085 2026 2026 2110 2027 2027 2111 2002 2002 2085 2027 2027 2111 2003 2003 2086 2003 2003 2086 2027 2027 2111 2028 2028 2112 2003 2003 2086 2028 2028 2112 2004 2004 2087 2004 2004 2087 2028 2028 2112 2029 2029 2113 2004 2004 2087 2029 2029 2113 2005 2005 2088 2005 2005 2088 2029 2029 2113 2030 2030 2114 2005 2005 2088 2030 2030 2114 2006 2006 2089 2006 2006 2089 2030 2030 2114 2031 2031 2115 2006 2006 2089 2031 2031 2115 2007 2007 2090 2007 2007 2090 2031 2031 2115 2032 2032 2116 2007 2007 2090 2032 2032 2116 2008 2008 2091 2008 2008 2091 2032 2032 2116 2033 2033 2117 2008 2008 2091 2033 2033 2117 2009 2009 2092 2009 2009 2092 2033 2033 2117 2034 2034 2118 2009 2009 2092 2034 2034 2118 2010 2010 2093 2010 2010 2093 2034 2034 2118 2035 2035 2119 2010 2010 2093 2035 2035 2119 2011 2011 2094 2011 2011 2094 2035 2035 2119 2036 2036 2120 2011 2011 2094 2036 2036 2120 2012 2012 2095 2012 2012 2095 2036 2036 2120 2037 2037 2121 2012 2012 2095 2037 2037 2121 2013 2013 2096 2013 2013 2096 2037 2037 2121 2038 2038 2122 2013 2013 2096 2038 2038 2122 2014 2014 2097 2014 2014 2097 2038 2038 2122 2039 2039 2123 2014 2014 2097 2039 2039 2123 2015 2015 2098 2015 2015 2098 2039 2039 2123 2016 2016 2124 2015 2015 2098 2016 2016 2124 1992 1992 2099 2016 2016 2100 2040 2040 2125 2041 2041 2126 2016 2016 2100 2041 2041 2126 2017 2017 2101 2017 2017 2101 2041 2041 2126 2042 2042 2127 2017 2017 2101 2042 2042 2127 2018 2018 2102 2018 2018 2102 2042 2042 2127 2043 2043 2128 2018 2018 2102 2043 2043 2128 2019 2019 2103 2019 2019 2103 2043 2043 2128 2044 2044 2129 2019 2019 2103 2044 2044 2129 2020 2020 2104 2020 2020 2104 2044 2044 2129 2045 2045 2130 2020 2020 2104 2045 2045 2130 2021 2021 2105 2021 2021 2105 2045 2045 2130 2046 2046 2131 2021 2021 2105 2046 2046 2131 2022 2022 2106 2022 2022 2106 2046 2046 2131 2047 2047 2132 2022 2022 2106 2047 2047 2132 2023 2023 2107 2023 2023 2107 2047 2047 2132 2048 2048 2133 2023 2023 2107 2048 2048 2133 2024 2024 2108 2024 2024 2108 2048 2048 2133 2049 2049 2134 2024 2024 2108 2049 2049 2134 2025 2025 2109 2025 2025 2109 2049 2049 2134 2050 2050 2135 2025 2025 2109 2050 2050 2135 2026 2026 2110 2026 2026 2110 2050 2050 2135 2051 2051 2136 2026 2026 2110 2051 2051 2136 2027 2027 2111 2027 2027 2111 2051 2051 2136 2052 2052 2137 2027 2027 2111 2052 2052 2137 2028 2028 2112 2028 2028 2112 2052 2052 2137 2053 2053 2138 2028 2028 2112 2053 2053 2138 2029 2029 2113 2029 2029 2113 2053 2053 2138 2054 2054 2139 2029 2029 2113 2054 2054 2139 2030 2030 2114 2030 2030 2114 2054 2054 2139 2055 2055 2140 2030 2030 2114 2055 2055 2140 2031 2031 2115 2031 2031 2115 2055 2055 2140 2056 2056 2141 2031 2031 2115 2056 2056 2141 2032 2032 2116 2032 2032 2116 2056 2056 2141 2057 2057 2142 2032 2032 2116 2057 2057 2142 2033 2033 2117 2033 2033 2117 2057 2057 2142 2058 2058 2143 2033 2033 2117 2058 2058 2143 2034 2034 2118 2034 2034 2118 2058 2058 2143 2059 2059 2144 2034 2034 2118 2059 2059 2144 2035 2035 2119 2035 2035 2119 2059 2059 2144 2060 2060 2145 2035 2035 2119 2060 2060 2145 2036 2036 2120 2036 2036 2120 2060 2060 2145 2061 2061 2146 2036 2036 2120 2061 2061 2146 2037 2037 2121 2037 2037 2121 2061 2061 2146 2062 2062 2147 2037 2037 2121 2062 2062 2147 2038 2038 2122 2038 2038 2122 2062 2062 2147 2063 2063 2148 2038 2038 2122 2063 2063 2148 2039 2039 2123 2039 2039 2123 2063 2063 2148 2040 2040 2149 2039 2039 2123 2040 2040 2149 2016 2016 2124 2040 2040 2125 2064 2064 2150 2065 2065 2151 2040 2040 2125 2065 2065 2151 2041 2041 2126 2041 2041 2126 2065 2065 2151 2066 2066 2152 2041 2041 2126 2066 2066 2152 2042 2042 2127 2042 2042 2127 2066 2066 2152 2067 2067 2153 2042 2042 2127 2067 2067 2153 2043 2043 2128 2043 2043 2128 2067 2067 2153 2068 2068 2154 2043 2043 2128 2068 2068 2154 2044 2044 2129 2044 2044 2129 2068 2068 2154 2069 2069 2155 2044 2044 2129 2069 2069 2155 2045 2045 2130 2045 2045 2130 2069 2069 2155 2070 2070 2156 2045 2045 2130 2070 2070 2156 2046 2046 2131 2046 2046 2131 2070 2070 2156 2071 2071 2157 2046 2046 2131 2071 2071 2157 2047 2047 2132 2047 2047 2132 2071 2071 2157 2072 2072 2158 2047 2047 2132 2072 2072 2158 2048 2048 2133 2048 2048 2133 2072 2072 2158 2073 2073 2159 2048 2048 2133 2073 2073 2159 2049 2049 2134 2049 2049 2134 2073 2073 2159 2074 2074 2160 2049 2049 2134 2074 2074 2160 2050 2050 2135 2050 2050 2135 2074 2074 2160 2075 2075 2161 2050 2050 2135 2075 2075 2161 2051 2051 2136 2051 2051 2136 2075 2075 2161 2076 2076 2162 2051 2051 2136 2076 2076 2162 2052 2052 2137 2052 2052 2137 2076 2076 2162 2077 2077 2163 2052 2052 2137 2077 2077 2163 2053 2053 2138 2053 2053 2138 2077 2077 2163 2078 2078 2164 2053 2053 2138 2078 2078 2164 2054 2054 2139 2054 2054 2139 2078 2078 2164 2079 2079 2165 2054 2054 2139 2079 2079 2165 2055 2055 2140 2055 2055 2140 2079 2079 2165 2080 2080 2166 2055 2055 2140 2080 2080 2166 2056 2056 2141 2056 2056 2141 2080 2080 2166 2081 2081 2167 2056 2056 2141 2081 2081 2167 2057 2057 2142 2057 2057 2142 2081 2081 2167 2082 2082 2168 2057 2057 2142 2082 2082 2168 2058 2058 2143 2058 2058 2143 2082 2082 2168 2083 2083 2169 2058 2058 2143 2083 2083 2169 2059 2059 2144 2059 2059 2144 2083 2083 2169 2084 2084 2170 2059 2059 2144 2084 2084 2170 2060 2060 2145 2060 2060 2145 2084 2084 2170 2085 2085 2171 2060 2060 2145 2085 2085 2171 2061 2061 2146 2061 2061 2146 2085 2085 2171 2086 2086 2172 2061 2061 2146 2086 2086 2172 2062 2062 2147 2062 2062 2147 2086 2086 2172 2087 2087 2173 2062 2062 2147 2087 2087 2173 2063 2063 2148 2063 2063 2148 2087 2087 2173 2064 2064 2174 2063 2063 2148 2064 2064 2174 2040 2040 2149 2064 2064 2150 2088 2088 2175 2089 2089 2176 2064 2064 2150 2089 2089 2176 2065 2065 2151 2065 2065 2151 2089 2089 2176 2090 2090 2177 2065 2065 2151 2090 2090 2177 2066 2066 2152 2066 2066 2152 2090 2090 2177 2091 2091 2178 2066 2066 2152 2091 2091 2178 2067 2067 2153 2067 2067 2153 2091 2091 2178 2092 2092 2179 2067 2067 2153 2092 2092 2179 2068 2068 2154 2068 2068 2154 2092 2092 2179 2093 2093 2180 2068 2068 2154 2093 2093 2180 2069 2069 2155 2069 2069 2155 2093 2093 2180 2094 2094 2181 2069 2069 2155 2094 2094 2181 2070 2070 2156 2070 2070 2156 2094 2094 2181 2095 2095 2182 2070 2070 2156 2095 2095 2182 2071 2071 2157 2071 2071 2157 2095 2095 2182 2096 2096 2183 2071 2071 2157 2096 2096 2183 2072 2072 2158 2072 2072 2158 2096 2096 2183 2097 2097 2184 2072 2072 2158 2097 2097 2184 2073 2073 2159 2073 2073 2159 2097 2097 2184 2098 2098 2185 2073 2073 2159 2098 2098 2185 2074 2074 2160 2074 2074 2160 2098 2098 2185 2099 2099 2186 2074 2074 2160 2099 2099 2186 2075 2075 2161 2075 2075 2161 2099 2099 2186 2100 2100 2187 2075 2075 2161 2100 2100 2187 2076 2076 2162 2076 2076 2162 2100 2100 2187 2101 2101 2188 2076 2076 2162 2101 2101 2188 2077 2077 2163 2077 2077 2163 2101 2101 2188 2102 2102 2189 2077 2077 2163 2102 2102 2189 2078 2078 2164 2078 2078 2164 2102 2102 2189 2103 2103 2190 2078 2078 2164 2103 2103 2190 2079 2079 2165 2079 2079 2165 2103 2103 2190 2104 2104 2191 2079 2079 2165 2104 2104 2191 2080 2080 2166 2080 2080 2166 2104 2104 2191 2105 2105 2192 2080 2080 2166 2105 2105 2192 2081 2081 2167 2081 2081 2167 2105 2105 2192 2106 2106 2193 2081 2081 2167 2106 2106 2193 2082 2082 2168 2082 2082 2168 2106 2106 2193 2107 2107 2194 2082 2082 2168 2107 2107 2194 2083 2083 2169 2083 2083 2169 2107 2107 2194 2108 2108 2195 2083 2083 2169 2108 2108 2195 2084 2084 2170 2084 2084 2170 2108 2108 2195 2109 2109 2196 2084 2084 2170 2109 2109 2196 2085 2085 2171 2085 2085 2171 2109 2109 2196 2110 2110 2197 2085 2085 2171 2110 2110 2197 2086 2086 2172 2086 2086 2172 2110 2110 2197 2111 2111 2198 2086 2086 2172 2111 2111 2198 2087 2087 2173 2087 2087 2173 2111 2111 2198 2088 2088 2199 2087 2087 2173 2088 2088 2199 2064 2064 2174 2088 2088 2175 2112 2112 2200 2113 2113 2201 2088 2088 2175 2113 2113 2201 2089 2089 2176 2089 2089 2176 2113 2113 2201 2114 2114 2202 2089 2089 2176 2114 2114 2202 2090 2090 2177 2090 2090 2177 2114 2114 2202 2115 2115 2203 2090 2090 2177 2115 2115 2203 2091 2091 2178 2091 2091 2178 2115 2115 2203 2116 2116 2204 2091 2091 2178 2116 2116 2204 2092 2092 2179 2092 2092 2179 2116 2116 2204 2117 2117 2205 2092 2092 2179 2117 2117 2205 2093 2093 2180 2093 2093 2180 2117 2117 2205 2118 2118 2206 2093 2093 2180 2118 2118 2206 2094 2094 2181 2094 2094 2181 2118 2118 2206 2119 2119 2207 2094 2094 2181 2119 2119 2207 2095 2095 2182 2095 2095 2182 2119 2119 2207 2120 2120 2208 2095 2095 2182 2120 2120 2208 2096 2096 2183 2096 2096 2183 2120 2120 2208 2121 2121 2209 2096 2096 2183 2121 2121 2209 2097 2097 2184 2097 2097 2184 2121 2121 2209 2122 2122 2210 2097 2097 2184 2122 2122 2210 2098 2098 2185 2098 2098 2185 2122 2122 2210 2123 2123 2211 2098 2098 2185 2123 2123 2211 2099 2099 2186 2099 2099 2186 2123 2123 2211 2124 2124 2212 2099 2099 2186 2124 2124 2212 2100 2100 2187 2100 2100 2187 2124 2124 2212 2125 2125 2213 2100 2100 2187 2125 2125 2213 2101 2101 2188 2101 2101 2188 2125 2125 2213 2126 2126 2214 2101 2101 2188 2126 2126 2214 2102 2102 2189 2102 2102 2189 2126 2126 2214 2127 2127 2215 2102 2102 2189 2127 2127 2215 2103 2103 2190 2103 2103 2190 2127 2127 2215 2128 2128 2216 2103 2103 2190 2128 2128 2216 2104 2104 2191 2104 2104 2191 2128 2128 2216 2129 2129 2217 2104 2104 2191 2129 2129 2217 2105 2105 2192 2105 2105 2192 2129 2129 2217 2130 2130 2218 2105 2105 2192 2130 2130 2218 2106 2106 2193 2106 2106 2193 2130 2130 2218 2131 2131 2219 2106 2106 2193 2131 2131 2219 2107 2107 2194 2107 2107 2194 2131 2131 2219 2132 2132 2220 2107 2107 2194 2132 2132 2220 2108 2108 2195 2108 2108 2195 2132 2132 2220 2133 2133 2221 2108 2108 2195 2133 2133 2221 2109 2109 2196 2109 2109 2196 2133 2133 2221 2134 2134 2222 2109 2109 2196 2134 2134 2222 2110 2110 2197 2110 2110 2197 2134 2134 2222 2135 2135 2223 2110 2110 2197 2135 2135 2223 2111 2111 2198 2111 2111 2198 2135 2135 2223 2112 2112 2224 2111 2111 2198 2112 2112 2224 2088 2088 2199 2112 2112 2200 2136 2136 2225 2137 2137 2226 2112 2112 2200 2137 2137 2226 2113 2113 2201 2113 2113 2201 2137 2137 2226 2138 2138 2227 2113 2113 2201 2138 2138 2227 2114 2114 2202 2114 2114 2202 2138 2138 2227 2139 2139 2228 2114 2114 2202 2139 2139 2228 2115 2115 2203 2115 2115 2203 2139 2139 2228 2140 2140 2229 2115 2115 2203 2140 2140 2229 2116 2116 2204 2116 2116 2204 2140 2140 2229 2141 2141 2230 2116 2116 2204 2141 2141 2230 2117 2117 2205 2117 2117 2205 2141 2141 2230 2142 2142 2231 2117 2117 2205 2142 2142 2231 2118 2118 2206 2118 2118 2206 2142 2142 2231 2143 2143 2232 2118 2118 2206 2143 2143 2232 2119 2119 2207 2119 2119 2207 2143 2143 2232 2144 2144 2233 2119 2119 2207 2144 2144 2233 2120 2120 2208 2120 2120 2208 2144 2144 2233 2145 2145 2234 2120 2120 2208 2145 2145 2234 2121 2121 2209 2121 2121 2209 2145 2145 2234 2146 2146 2235 2121 2121 2209 2146 2146 2235 2122 2122 2210 2122 2122 2210 2146 2146 2235 2147 2147 2236 2122 2122 2210 2147 2147 2236 2123 2123 2211 2123 2123 2211 2147 2147 2236 2148 2148 2237 2123 2123 2211 2148 2148 2237 2124 2124 2212 2124 2124 2212 2148 2148 2237 2149 2149 2238 2124 2124 2212 2149 2149 2238 2125 2125 2213 2125 2125 2213 2149 2149 2238 2150 2150 2239 2125 2125 2213 2150 2150 2239 2126 2126 2214 2126 2126 2214 2150 2150 2239 2151 2151 2240 2126 2126 2214 2151 2151 2240 2127 2127 2215 2127 2127 2215 2151 2151 2240 2152 2152 2241 2127 2127 2215 2152 2152 2241 2128 2128 2216 2128 2128 2216 2152 2152 2241 2153 2153 2242 2128 2128 2216 2153 2153 2242 2129 2129 2217 2129 2129 2217 2153 2153 2242 2154 2154 2243 2129 2129 2217 2154 2154 2243 2130 2130 2218 2130 2130 2218 2154 2154 2243 2155 2155 2244 2130 2130 2218 2155 2155 2244 2131 2131 2219 2131 2131 2219 2155 2155 2244 2156 2156 2245 2131 2131 2219 2156 2156 2245 2132 2132 2220 2132 2132 2220 2156 2156 2245 2157 2157 2246 2132 2132 2220 2157 2157 2246 2133 2133 2221 2133 2133 2221 2157 2157 2246 2158 2158 2247 2133 2133 2221 2158 2158 2247 2134 2134 2222 2134 2134 2222 2158 2158 2247 2159 2159 2248 2134 2134 2222 2159 2159 2248 2135 2135 2223 2135 2135 2223 2159 2159 2248 2136 2136 2249 2135 2135 2223 2136 2136 2249 2112 2112 2224 2136 2136 2225 2160 2160 2250 2161 2161 2251 2136 2136 2225 2161 2161 2251 2137 2137 2226 2137 2137 2226 2161 2161 2251 2162 2162 2252 2137 2137 2226 2162 2162 2252 2138 2138 2227 2138 2138 2227 2162 2162 2252 2163 2163 2253 2138 2138 2227 2163 2163 2253 2139 2139 2228 2139 2139 2228 2163 2163 2253 2164 2164 2254 2139 2139 2228 2164 2164 2254 2140 2140 2229 2140 2140 2229 2164 2164 2254 2165 2165 2255 2140 2140 2229 2165 2165 2255 2141 2141 2230 2141 2141 2230 2165 2165 2255 2166 2166 2256 2141 2141 2230 2166 2166 2256 2142 2142 2231 2142 2142 2231 2166 2166 2256 2167 2167 2257 2142 2142 2231 2167 2167 2257 2143 2143 2232 2143 2143 2232 2167 2167 2257 2168 2168 2258 2143 2143 2232 2168 2168 2258 2144 2144 2233 2144 2144 2233 2168 2168 2258 2169 2169 2259 2144 2144 2233 2169 2169 2259 2145 2145 2234 2145 2145 2234 2169 2169 2259 2170 2170 2260 2145 2145 2234 2170 2170 2260 2146 2146 2235 2146 2146 2235 2170 2170 2260 2171 2171 2261 2146 2146 2235 2171 2171 2261 2147 2147 2236 2147 2147 2236 2171 2171 2261 2172 2172 2262 2147 2147 2236 2172 2172 2262 2148 2148 2237 2148 2148 2237 2172 2172 2262 2173 2173 2263 2148 2148 2237 2173 2173 2263 2149 2149 2238 2149 2149 2238 2173 2173 2263 2174 2174 2264 2149 2149 2238 2174 2174 2264 2150 2150 2239 2150 2150 2239 2174 2174 2264 2175 2175 2265 2150 2150 2239 2175 2175 2265 2151 2151 2240 2151 2151 2240 2175 2175 2265 2176 2176 2266 2151 2151 2240 2176 2176 2266 2152 2152 2241 2152 2152 2241 2176 2176 2266 2177 2177 2267 2152 2152 2241 2177 2177 2267 2153 2153 2242 2153 2153 2242 2177 2177 2267 2178 2178 2268 2153 2153 2242 2178 2178 2268 2154 2154 2243 2154 2154 2243 2178 2178 2268 2179 2179 2269 2154 2154 2243 2179 2179 2269 2155 2155 2244 2155 2155 2244 2179 2179 2269 2180 2180 2270 2155 2155 2244 2180 2180 2270 2156 2156 2245 2156 2156 2245 2180 2180 2270 2181 2181 2271 2156 2156 2245 2181 2181 2271 2157 2157 2246 2157 2157 2246 2181 2181 2271 2182 2182 2272 2157 2157 2246 2182 2182 2272 2158 2158 2247 2158 2158 2247 2182 2182 2272 2183 2183 2273 2158 2158 2247 2183 2183 2273 2159 2159 2248 2159 2159 2248 2183 2183 2273 2160 2160 2274 2159 2159 2248 2160 2160 2274 2136 2136 2249 2160 2160 2250 2184 2184 2275 2185 2185 2276 2160 2160 2250 2185 2185 2276 2161 2161 2251 2161 2161 2251 2185 2185 2276 2186 2186 2277 2161 2161 2251 2186 2186 2277 2162 2162 2252 2162 2162 2252 2186 2186 2277 2187 2187 2278 2162 2162 2252 2187 2187 2278 2163 2163 2253 2163 2163 2253 2187 2187 2278 2188 2188 2279 2163 2163 2253 2188 2188 2279 2164 2164 2254 2164 2164 2254 2188 2188 2279 2189 2189 2280 2164 2164 2254 2189 2189 2280 2165 2165 2255 2165 2165 2255 2189 2189 2280 2190 2190 2281 2165 2165 2255 2190 2190 2281 2166 2166 2256 2166 2166 2256 2190 2190 2281 2191 2191 2282 2166 2166 2256 2191 2191 2282 2167 2167 2257 2167 2167 2257 2191 2191 2282 2192 2192 2283 2167 2167 2257 2192 2192 2283 2168 2168 2258 2168 2168 2258 2192 2192 2283 2193 2193 2284 2168 2168 2258 2193 2193 2284 2169 2169 2259 2169 2169 2259 2193 2193 2284 2194 2194 2285 2169 2169 2259 2194 2194 2285 2170 2170 2260 2170 2170 2260 2194 2194 2285 2195 2195 2286 2170 2170 2260 2195 2195 2286 2171 2171 2261 2171 2171 2261 2195 2195 2286 2196 2196 2287 2171 2171 2261 2196 2196 2287 2172 2172 2262 2172 2172 2262 2196 2196 2287 2197 2197 2288 2172 2172 2262 2197 2197 2288 2173 2173 2263 2173 2173 2263 2197 2197 2288 2198 2198 2289 2173 2173 2263 2198 2198 2289 2174 2174 2264 2174 2174 2264 2198 2198 2289 2199 2199 2290 2174 2174 2264 2199 2199 2290 2175 2175 2265 2175 2175 2265 2199 2199 2290 2200 2200 2291 2175 2175 2265 2200 2200 2291 2176 2176 2266 2176 2176 2266 2200 2200 2291 2201 2201 2292 2176 2176 2266 2201 2201 2292 2177 2177 2267 2177 2177 2267 2201 2201 2292 2202 2202 2293 2177 2177 2267 2202 2202 2293 2178 2178 2268 2178 2178 2268 2202 2202 2293 2203 2203 2294 2178 2178 2268 2203 2203 2294 2179 2179 2269 2179 2179 2269 2203 2203 2294 2204 2204 2295 2179 2179 2269 2204 2204 2295 2180 2180 2270 2180 2180 2270 2204 2204 2295 2205 2205 2296 2180 2180 2270 2205 2205 2296 2181 2181 2271 2181 2181 2271 2205 2205 2296 2206 2206 2297 2181 2181 2271 2206 2206 2297 2182 2182 2272 2182 2182 2272 2206 2206 2297 2207 2207 2298 2182 2182 2272 2207 2207 2298 2183 2183 2273 2183 2183 2273 2207 2207 2298 2184 2184 2299 2183 2183 2273 2184 2184 2299 2160 2160 2274 2184 2184 2275 2208 2208 2300 2209 2209 2301 2184 2184 2275 2209 2209 2301 2185 2185 2276 2185 2185 2276 2209 2209 2301 2210 2210 2302 2185 2185 2276 2210 2210 2302 2186 2186 2277 2186 2186 2277 2210 2210 2302 2211 2211 2303 2186 2186 2277 2211 2211 2303 2187 2187 2278 2187 2187 2278 2211 2211 2303 2212 2212 2304 2187 2187 2278 2212 2212 2304 2188 2188 2279 2188 2188 2279 2212 2212 2304 2213 2213 2305 2188 2188 2279 2213 2213 2305 2189 2189 2280 2189 2189 2280 2213 2213 2305 2214 2214 2306 2189 2189 2280 2214 2214 2306 2190 2190 2281 2190 2190 2281 2214 2214 2306 2215 2215 2307 2190 2190 2281 2215 2215 2307 2191 2191 2282 2191 2191 2282 2215 2215 2307 2216 2216 2308 2191 2191 2282 2216 2216 2308 2192 2192 2283 2192 2192 2283 2216 2216 2308 2217 2217 2309 2192 2192 2283 2217 2217 2309 2193 2193 2284 2193 2193 2284 2217 2217 2309 2218 2218 2310 2193 2193 2284 2218 2218 2310 2194 2194 2285 2194 2194 2285 2218 2218 2310 2219 2219 2311 2194 2194 2285 2219 2219 2311 2195 2195 2286 2195 2195 2286 2219 2219 2311 2220 2220 2312 2195 2195 2286 2220 2220 2312 2196 2196 2287 2196 2196 2287 2220 2220 2312 2221 2221 2313 2196 2196 2287 2221 2221 2313 2197 2197 2288 2197 2197 2288 2221 2221 2313 2222 2222 2314 2197 2197 2288 2222 2222 2314 2198 2198 2289 2198 2198 2289 2222 2222 2314 2223 2223 2315 2198 2198 2289 2223 2223 2315 2199 2199 2290 2199 2199 2290 2223 2223 2315 2224 2224 2316 2199 2199 2290 2224 2224 2316 2200 2200 2291 2200 2200 2291 2224 2224 2316 2225 2225 2317 2200 2200 2291 2225 2225 2317 2201 2201 2292 2201 2201 2292 2225 2225 2317 2226 2226 2318 2201 2201 2292 2226 2226 2318 2202 2202 2293 2202 2202 2293 2226 2226 2318 2227 2227 2319 2202 2202 2293 2227 2227 2319 2203 2203 2294 2203 2203 2294 2227 2227 2319 2228 2228 2320 2203 2203 2294 2228 2228 2320 2204 2204 2295 2204 2204 2295 2228 2228 2320 2229 2229 2321 2204 2204 2295 2229 2229 2321 2205 2205 2296 2205 2205 2296 2229 2229 2321 2230 2230 2322 2205 2205 2296 2230 2230 2322 2206 2206 2297 2206 2206 2297 2230 2230 2322 2231 2231 2323 2206 2206 2297 2231 2231 2323 2207 2207 2298 2207 2207 2298 2231 2231 2323 2208 2208 2324 2207 2207 2298 2208 2208 2324 2184 2184 2299 2208 2208 2300 2232 2232 2325 2233 2233 2326 2208 2208 2300 2233 2233 2326 2209 2209 2301 2209 2209 2301 2233 2233 2326 2234 2234 2327 2209 2209 2301 2234 2234 2327 2210 2210 2302 2210 2210 2302 2234 2234 2327 2235 2235 2328 2210 2210 2302 2235 2235 2328 2211 2211 2303 2211 2211 2303 2235 2235 2328 2236 2236 2329 2211 2211 2303 2236 2236 2329 2212 2212 2304 2212 2212 2304 2236 2236 2329 2237 2237 2330 2212 2212 2304 2237 2237 2330 2213 2213 2305 2213 2213 2305 2237 2237 2330 2238 2238 2331 2213 2213 2305 2238 2238 2331 2214 2214 2306 2214 2214 2306 2238 2238 2331 2239 2239 2332 2214 2214 2306 2239 2239 2332 2215 2215 2307 2215 2215 2307 2239 2239 2332 2240 2240 2333 2215 2215 2307 2240 2240 2333 2216 2216 2308 2216 2216 2308 2240 2240 2333 2241 2241 2334 2216 2216 2308 2241 2241 2334 2217 2217 2309 2217 2217 2309 2241 2241 2334 2242 2242 2335 2217 2217 2309 2242 2242 2335 2218 2218 2310 2218 2218 2310 2242 2242 2335 2243 2243 2336 2218 2218 2310 2243 2243 2336 2219 2219 2311 2219 2219 2311 2243 2243 2336 2244 2244 2337 2219 2219 2311 2244 2244 2337 2220 2220 2312 2220 2220 2312 2244 2244 2337 2245 2245 2338 2220 2220 2312 2245 2245 2338 2221 2221 2313 2221 2221 2313 2245 2245 2338 2246 2246 2339 2221 2221 2313 2246 2246 2339 2222 2222 2314 2222 2222 2314 2246 2246 2339 2247 2247 2340 2222 2222 2314 2247 2247 2340 2223 2223 2315 2223 2223 2315 2247 2247 2340 2248 2248 2341 2223 2223 2315 2248 2248 2341 2224 2224 2316 2224 2224 2316 2248 2248 2341 2249 2249 2342 2224 2224 2316 2249 2249 2342 2225 2225 2317 2225 2225 2317 2249 2249 2342 2250 2250 2343 2225 2225 2317 2250 2250 2343 2226 2226 2318 2226 2226 2318 2250 2250 2343 2251 2251 2344 2226 2226 2318 2251 2251 2344 2227 2227 2319 2227 2227 2319 2251 2251 2344 2252 2252 2345 2227 2227 2319 2252 2252 2345 2228 2228 2320 2228 2228 2320 2252 2252 2345 2253 2253 2346 2228 2228 2320 2253 2253 2346 2229 2229 2321 2229 2229 2321 2253 2253 2346 2254 2254 2347 2229 2229 2321 2254 2254 2347 2230 2230 2322 2230 2230 2322 2254 2254 2347 2255 2255 2348 2230 2230 2322 2255 2255 2348 2231 2231 2323 2231 2231 2323 2255 2255 2348 2232 2232 2349 2231 2231 2323 2232 2232 2349 2208 2208 2324 2232 2232 2325 2256 2256 2350 2257 2257 2351 2232 2232 2325 2257 2257 2351 2233 2233 2326 2233 2233 2326 2257 2257 2351 2258 2258 2352 2233 2233 2326 2258 2258 2352 2234 2234 2327 2234 2234 2327 2258 2258 2352 2259 2259 2353 2234 2234 2327 2259 2259 2353 2235 2235 2328 2235 2235 2328 2259 2259 2353 2260 2260 2354 2235 2235 2328 2260 2260 2354 2236 2236 2329 2236 2236 2329 2260 2260 2354 2261 2261 2355 2236 2236 2329 2261 2261 2355 2237 2237 2330 2237 2237 2330 2261 2261 2355 2262 2262 2356 2237 2237 2330 2262 2262 2356 2238 2238 2331 2238 2238 2331 2262 2262 2356 2263 2263 2357 2238 2238 2331 2263 2263 2357 2239 2239 2332 2239 2239 2332 2263 2263 2357 2264 2264 2358 2239 2239 2332 2264 2264 2358 2240 2240 2333 2240 2240 2333 2264 2264 2358 2265 2265 2359 2240 2240 2333 2265 2265 2359 2241 2241 2334 2241 2241 2334 2265 2265 2359 2266 2266 2360 2241 2241 2334 2266 2266 2360 2242 2242 2335 2242 2242 2335 2266 2266 2360 2267 2267 2361 2242 2242 2335 2267 2267 2361 2243 2243 2336 2243 2243 2336 2267 2267 2361 2268 2268 2362 2243 2243 2336 2268 2268 2362 2244 2244 2337 2244 2244 2337 2268 2268 2362 2269 2269 2363 2244 2244 2337 2269 2269 2363 2245 2245 2338 2245 2245 2338 2269 2269 2363 2270 2270 2364 2245 2245 2338 2270 2270 2364 2246 2246 2339 2246 2246 2339 2270 2270 2364 2271 2271 2365 2246 2246 2339 2271 2271 2365 2247 2247 2340 2247 2247 2340 2271 2271 2365 2272 2272 2366 2247 2247 2340 2272 2272 2366 2248 2248 2341 2248 2248 2341 2272 2272 2366 2273 2273 2367 2248 2248 2341 2273 2273 2367 2249 2249 2342 2249 2249 2342 2273 2273 2367 2274 2274 2368 2249 2249 2342 2274 2274 2368 2250 2250 2343 2250 2250 2343 2274 2274 2368 2275 2275 2369 2250 2250 2343 2275 2275 2369 2251 2251 2344 2251 2251 2344 2275 2275 2369 2276 2276 2370 2251 2251 2344 2276 2276 2370 2252 2252 2345 2252 2252 2345 2276 2276 2370 2277 2277 2371 2252 2252 2345 2277 2277 2371 2253 2253 2346 2253 2253 2346 2277 2277 2371 2278 2278 2372 2253 2253 2346 2278 2278 2372 2254 2254 2347 2254 2254 2347 2278 2278 2372 2279 2279 2373 2254 2254 2347 2279 2279 2373 2255 2255 2348 2255 2255 2348 2279 2279 2373 2256 2256 2374 2255 2255 2348 2256 2256 2374 2232 2232 2349 2256 2256 2350 2280 2280 2375 2281 2281 2376 2256 2256 2350 2281 2281 2376 2257 2257 2351 2257 2257 2351 2281 2281 2376 2282 2282 2377 2257 2257 2351 2282 2282 2377 2258 2258 2352 2258 2258 2352 2282 2282 2377 2283 2283 2378 2258 2258 2352 2283 2283 2378 2259 2259 2353 2259 2259 2353 2283 2283 2378 2284 2284 2379 2259 2259 2353 2284 2284 2379 2260 2260 2354 2260 2260 2354 2284 2284 2379 2285 2285 2380 2260 2260 2354 2285 2285 2380 2261 2261 2355 2261 2261 2355 2285 2285 2380 2286 2286 2381 2261 2261 2355 2286 2286 2381 2262 2262 2356 2262 2262 2356 2286 2286 2381 2287 2287 2382 2262 2262 2356 2287 2287 2382 2263 2263 2357 2263 2263 2357 2287 2287 2382 2288 2288 2383 2263 2263 2357 2288 2288 2383 2264 2264 2358 2264 2264 2358 2288 2288 2383 2289 2289 2384 2264 2264 2358 2289 2289 2384 2265 2265 2359 2265 2265 2359 2289 2289 2384 2290 2290 2385 2265 2265 2359 2290 2290 2385 2266 2266 2360 2266 2266 2360 2290 2290 2385 2291 2291 2386 2266 2266 2360 2291 2291 2386 2267 2267 2361 2267 2267 2361 2291 2291 2386 2292 2292 2387 2267 2267 2361 2292 2292 2387 2268 2268 2362 2268 2268 2362 2292 2292 2387 2293 2293 2388 2268 2268 2362 2293 2293 2388 2269 2269 2363 2269 2269 2363 2293 2293 2388 2294 2294 2389 2269 2269 2363 2294 2294 2389 2270 2270 2364 2270 2270 2364 2294 2294 2389 2295 2295 2390 2270 2270 2364 2295 2295 2390 2271 2271 2365 2271 2271 2365 2295 2295 2390 2296 2296 2391 2271 2271 2365 2296 2296 2391 2272 2272 2366 2272 2272 2366 2296 2296 2391 2297 2297 2392 2272 2272 2366 2297 2297 2392 2273 2273 2367 2273 2273 2367 2297 2297 2392 2298 2298 2393 2273 2273 2367 2298 2298 2393 2274 2274 2368 2274 2274 2368 2298 2298 2393 2299 2299 2394 2274 2274 2368 2299 2299 2394 2275 2275 2369 2275 2275 2369 2299 2299 2394 2300 2300 2395 2275 2275 2369 2300 2300 2395 2276 2276 2370 2276 2276 2370 2300 2300 2395 2301 2301 2396 2276 2276 2370 2301 2301 2396 2277 2277 2371 2277 2277 2371 2301 2301 2396 2302 2302 2397 2277 2277 2371 2302 2302 2397 2278 2278 2372 2278 2278 2372 2302 2302 2397 2303 2303 2398 2278 2278 2372 2303 2303 2398 2279 2279 2373 2279 2279 2373 2303 2303 2398 2280 2280 2399 2279 2279 2373 2280 2280 2399 2256 2256 2374 2280 2280 2375 2304 2304 2400 2305 2305 2401 2280 2280 2375 2305 2305 2401 2281 2281 2376 2281 2281 2376 2305 2305 2401 2306 2306 2402 2281 2281 2376 2306 2306 2402 2282 2282 2377 2282 2282 2377 2306 2306 2402 2307 2307 2403 2282 2282 2377 2307 2307 2403 2283 2283 2378 2283 2283 2378 2307 2307 2403 2308 2308 2404 2283 2283 2378 2308 2308 2404 2284 2284 2379 2284 2284 2379 2308 2308 2404 2309 2309 2405 2284 2284 2379 2309 2309 2405 2285 2285 2380 2285 2285 2380 2309 2309 2405 2310 2310 2406 2285 2285 2380 2310 2310 2406 2286 2286 2381 2286 2286 2381 2310 2310 2406 2311 2311 2407 2286 2286 2381 2311 2311 2407 2287 2287 2382 2287 2287 2382 2311 2311 2407 2312 2312 2408 2287 2287 2382 2312 2312 2408 2288 2288 2383 2288 2288 2383 2312 2312 2408 2313 2313 2409 2288 2288 2383 2313 2313 2409 2289 2289 2384 2289 2289 2384 2313 2313 2409 2314 2314 2410 2289 2289 2384 2314 2314 2410 2290 2290 2385 2290 2290 2385 2314 2314 2410 2315 2315 2411 2290 2290 2385 2315 2315 2411 2291 2291 2386 2291 2291 2386 2315 2315 2411 2316 2316 2412 2291 2291 2386 2316 2316 2412 2292 2292 2387 2292 2292 2387 2316 2316 2412 2317 2317 2413 2292 2292 2387 2317 2317 2413 2293 2293 2388 2293 2293 2388 2317 2317 2413 2318 2318 2414 2293 2293 2388 2318 2318 2414 2294 2294 2389 2294 2294 2389 2318 2318 2414 2319 2319 2415 2294 2294 2389 2319 2319 2415 2295 2295 2390 2295 2295 2390 2319 2319 2415 2320 2320 2416 2295 2295 2390 2320 2320 2416 2296 2296 2391 2296 2296 2391 2320 2320 2416 2321 2321 2417 2296 2296 2391 2321 2321 2417 2297 2297 2392 2297 2297 2392 2321 2321 2417 2322 2322 2418 2297 2297 2392 2322 2322 2418 2298 2298 2393 2298 2298 2393 2322 2322 2418 2323 2323 2419 2298 2298 2393 2323 2323 2419 2299 2299 2394 2299 2299 2394 2323 2323 2419 2324 2324 2420 2299 2299 2394 2324 2324 2420 2300 2300 2395 2300 2300 2395 2324 2324 2420 2325 2325 2421 2300 2300 2395 2325 2325 2421 2301 2301 2396 2301 2301 2396 2325 2325 2421 2326 2326 2422 2301 2301 2396 2326 2326 2422 2302 2302 2397 2302 2302 2397 2326 2326 2422 2327 2327 2423 2302 2302 2397 2327 2327 2423 2303 2303 2398 2303 2303 2398 2327 2327 2423 2304 2304 2424 2303 2303 2398 2304 2304 2424 2280 2280 2399 2304 2304 2400 2328 2328 2425 2329 2329 2426 2304 2304 2400 2329 2329 2426 2305 2305 2401 2305 2305 2401 2329 2329 2426 2330 2330 2427 2305 2305 2401 2330 2330 2427 2306 2306 2402 2306 2306 2402 2330 2330 2427 2331 2331 2428 2306 2306 2402 2331 2331 2428 2307 2307 2403 2307 2307 2403 2331 2331 2428 2332 2332 2429 2307 2307 2403 2332 2332 2429 2308 2308 2404 2308 2308 2404 2332 2332 2429 2333 2333 2430 2308 2308 2404 2333 2333 2430 2309 2309 2405 2309 2309 2405 2333 2333 2430 2334 2334 2431 2309 2309 2405 2334 2334 2431 2310 2310 2406 2310 2310 2406 2334 2334 2431 2335 2335 2432 2310 2310 2406 2335 2335 2432 2311 2311 2407 2311 2311 2407 2335 2335 2432 2336 2336 2433 2311 2311 2407 2336 2336 2433 2312 2312 2408 2312 2312 2408 2336 2336 2433 2337 2337 2434 2312 2312 2408 2337 2337 2434 2313 2313 2409 2313 2313 2409 2337 2337 2434 2338 2338 2435 2313 2313 2409 2338 2338 2435 2314 2314 2410 2314 2314 2410 2338 2338 2435 2339 2339 2436 2314 2314 2410 2339 2339 2436 2315 2315 2411 2315 2315 2411 2339 2339 2436 2340 2340 2437 2315 2315 2411 2340 2340 2437 2316 2316 2412 2316 2316 2412 2340 2340 2437 2341 2341 2438 2316 2316 2412 2341 2341 2438 2317 2317 2413 2317 2317 2413 2341 2341 2438 2342 2342 2439 2317 2317 2413 2342 2342 2439 2318 2318 2414 2318 2318 2414 2342 2342 2439 2343 2343 2440 2318 2318 2414 2343 2343 2440 2319 2319 2415 2319 2319 2415 2343 2343 2440 2344 2344 2441 2319 2319 2415 2344 2344 2441 2320 2320 2416 2320 2320 2416 2344 2344 2441 2345 2345 2442 2320 2320 2416 2345 2345 2442 2321 2321 2417 2321 2321 2417 2345 2345 2442 2346 2346 2443 2321 2321 2417 2346 2346 2443 2322 2322 2418 2322 2322 2418 2346 2346 2443 2347 2347 2444 2322 2322 2418 2347 2347 2444 2323 2323 2419 2323 2323 2419 2347 2347 2444 2348 2348 2445 2323 2323 2419 2348 2348 2445 2324 2324 2420 2324 2324 2420 2348 2348 2445 2349 2349 2446 2324 2324 2420 2349 2349 2446 2325 2325 2421 2325 2325 2421 2349 2349 2446 2350 2350 2447 2325 2325 2421 2350 2350 2447 2326 2326 2422 2326 2326 2422 2350 2350 2447 2351 2351 2448 2326 2326 2422 2351 2351 2448 2327 2327 2423 2327 2327 2423 2351 2351 2448 2328 2328 2449 2327 2327 2423 2328 2328 2449 2304 2304 2424 2328 2328 2425 2352 2352 2450 2353 2353 2451 2328 2328 2425 2353 2353 2451 2329 2329 2426 2329 2329 2426 2353 2353 2451 2354 2354 2452 2329 2329 2426 2354 2354 2452 2330 2330 2427 2330 2330 2427 2354 2354 2452 2355 2355 2453 2330 2330 2427 2355 2355 2453 2331 2331 2428 2331 2331 2428 2355 2355 2453 2356 2356 2454 2331 2331 2428 2356 2356 2454 2332 2332 2429 2332 2332 2429 2356 2356 2454 2357 2357 2455 2332 2332 2429 2357 2357 2455 2333 2333 2430 2333 2333 2430 2357 2357 2455 2358 2358 2456 2333 2333 2430 2358 2358 2456 2334 2334 2431 2334 2334 2431 2358 2358 2456 2359 2359 2457 2334 2334 2431 2359 2359 2457 2335 2335 2432 2335 2335 2432 2359 2359 2457 2360 2360 2458 2335 2335 2432 2360 2360 2458 2336 2336 2433 2336 2336 2433 2360 2360 2458 2361 2361 2459 2336 2336 2433 2361 2361 2459 2337 2337 2434 2337 2337 2434 2361 2361 2459 2362 2362 2460 2337 2337 2434 2362 2362 2460 2338 2338 2435 2338 2338 2435 2362 2362 2460 2363 2363 2461 2338 2338 2435 2363 2363 2461 2339 2339 2436 2339 2339 2436 2363 2363 2461 2364 2364 2462 2339 2339 2436 2364 2364 2462 2340 2340 2437 2340 2340 2437 2364 2364 2462 2365 2365 2463 2340 2340 2437 2365 2365 2463 2341 2341 2438 2341 2341 2438 2365 2365 2463 2366 2366 2464 2341 2341 2438 2366 2366 2464 2342 2342 2439 2342 2342 2439 2366 2366 2464 2367 2367 2465 2342 2342 2439 2367 2367 2465 2343 2343 2440 2343 2343 2440 2367 2367 2465 2368 2368 2466 2343 2343 2440 2368 2368 2466 2344 2344 2441 2344 2344 2441 2368 2368 2466 2369 2369 2467 2344 2344 2441 2369 2369 2467 2345 2345 2442 2345 2345 2442 2369 2369 2467 2370 2370 2468 2345 2345 2442 2370 2370 2468 2346 2346 2443 2346 2346 2443 2370 2370 2468 2371 2371 2469 2346 2346 2443 2371 2371 2469 2347 2347 2444 2347 2347 2444 2371 2371 2469 2372 2372 2470 2347 2347 2444 2372 2372 2470 2348 2348 2445 2348 2348 2445 2372 2372 2470 2373 2373 2471 2348 2348 2445 2373 2373 2471 2349 2349 2446 2349 2349 2446 2373 2373 2471 2374 2374 2472 2349 2349 2446 2374 2374 2472 2350 2350 2447 2350 2350 2447 2374 2374 2472 2375 2375 2473 2350 2350 2447 2375 2375 2473 2351 2351 2448 2351 2351 2448 2375 2375 2473 2352 2352 2474 2351 2351 2448 2352 2352 2474 2328 2328 2449 2352 2352 2450 2376 2376 2475 2377 2377 2476 2352 2352 2450 2377 2377 2476 2353 2353 2451 2353 2353 2451 2377 2377 2476 2378 2378 2477 2353 2353 2451 2378 2378 2477 2354 2354 2452 2354 2354 2452 2378 2378 2477 2379 2379 2478 2354 2354 2452 2379 2379 2478 2355 2355 2453 2355 2355 2453 2379 2379 2478 2380 2380 2479 2355 2355 2453 2380 2380 2479 2356 2356 2454 2356 2356 2454 2380 2380 2479 2381 2381 2480 2356 2356 2454 2381 2381 2480 2357 2357 2455 2357 2357 2455 2381 2381 2480 2382 2382 2481 2357 2357 2455 2382 2382 2481 2358 2358 2456 2358 2358 2456 2382 2382 2481 2383 2383 2482 2358 2358 2456 2383 2383 2482 2359 2359 2457 2359 2359 2457 2383 2383 2482 2384 2384 2483 2359 2359 2457 2384 2384 2483 2360 2360 2458 2360 2360 2458 2384 2384 2483 2385 2385 2484 2360 2360 2458 2385 2385 2484 2361 2361 2459 2361 2361 2459 2385 2385 2484 2386 2386 2485 2361 2361 2459 2386 2386 2485 2362 2362 2460 2362 2362 2460 2386 2386 2485 2387 2387 2486 2362 2362 2460 2387 2387 2486 2363 2363 2461 2363 2363 2461 2387 2387 2486 2388 2388 2487 2363 2363 2461 2388 2388 2487 2364 2364 2462 2364 2364 2462 2388 2388 2487 2389 2389 2488 2364 2364 2462 2389 2389 2488 2365 2365 2463 2365 2365 2463 2389 2389 2488 2390 2390 2489 2365 2365 2463 2390 2390 2489 2366 2366 2464 2366 2366 2464 2390 2390 2489 2391 2391 2490 2366 2366 2464 2391 2391 2490 2367 2367 2465 2367 2367 2465 2391 2391 2490 2392 2392 2491 2367 2367 2465 2392 2392 2491 2368 2368 2466 2368 2368 2466 2392 2392 2491 2393 2393 2492 2368 2368 2466 2393 2393 2492 2369 2369 2467 2369 2369 2467 2393 2393 2492 2394 2394 2493 2369 2369 2467 2394 2394 2493 2370 2370 2468 2370 2370 2468 2394 2394 2493 2395 2395 2494 2370 2370 2468 2395 2395 2494 2371 2371 2469 2371 2371 2469 2395 2395 2494 2396 2396 2495 2371 2371 2469 2396 2396 2495 2372 2372 2470 2372 2372 2470 2396 2396 2495 2397 2397 2496 2372 2372 2470 2397 2397 2496 2373 2373 2471 2373 2373 2471 2397 2397 2496 2398 2398 2497 2373 2373 2471 2398 2398 2497 2374 2374 2472 2374 2374 2472 2398 2398 2497 2399 2399 2498 2374 2374 2472 2399 2399 2498 2375 2375 2473 2375 2375 2473 2399 2399 2498 2376 2376 2499 2375 2375 2473 2376 2376 2499 2352 2352 2474 2376 2376 2475 2400 2400 2500 2401 2401 2501 2376 2376 2475 2401 2401 2501 2377 2377 2476 2377 2377 2476 2401 2401 2501 2402 2402 2502 2377 2377 2476 2402 2402 2502 2378 2378 2477 2378 2378 2477 2402 2402 2502 2403 2403 2503 2378 2378 2477 2403 2403 2503 2379 2379 2478 2379 2379 2478 2403 2403 2503 2404 2404 2504 2379 2379 2478 2404 2404 2504 2380 2380 2479 2380 2380 2479 2404 2404 2504 2405 2405 2505 2380 2380 2479 2405 2405 2505 2381 2381 2480 2381 2381 2480 2405 2405 2505 2406 2406 2506 2381 2381 2480 2406 2406 2506 2382 2382 2481 2382 2382 2481 2406 2406 2506 2407 2407 2507 2382 2382 2481 2407 2407 2507 2383 2383 2482 2383 2383 2482 2407 2407 2507 2408 2408 2508 2383 2383 2482 2408 2408 2508 2384 2384 2483 2384 2384 2483 2408 2408 2508 2409 2409 2509 2384 2384 2483 2409 2409 2509 2385 2385 2484 2385 2385 2484 2409 2409 2509 2410 2410 2510 2385 2385 2484 2410 2410 2510 2386 2386 2485 2386 2386 2485 2410 2410 2510 2411 2411 2511 2386 2386 2485 2411 2411 2511 2387 2387 2486 2387 2387 2486 2411 2411 2511 2412 2412 2512 2387 2387 2486 2412 2412 2512 2388 2388 2487 2388 2388 2487 2412 2412 2512 2413 2413 2513 2388 2388 2487 2413 2413 2513 2389 2389 2488 2389 2389 2488 2413 2413 2513 2414 2414 2514 2389 2389 2488 2414 2414 2514 2390 2390 2489 2390 2390 2489 2414 2414 2514 2415 2415 2515 2390 2390 2489 2415 2415 2515 2391 2391 2490 2391 2391 2490 2415 2415 2515 2416 2416 2516 2391 2391 2490 2416 2416 2516 2392 2392 2491 2392 2392 2491 2416 2416 2516 2417 2417 2517 2392 2392 2491 2417 2417 2517 2393 2393 2492 2393 2393 2492 2417 2417 2517 2418 2418 2518 2393 2393 2492 2418 2418 2518 2394 2394 2493 2394 2394 2493 2418 2418 2518 2419 2419 2519 2394 2394 2493 2419 2419 2519 2395 2395 2494 2395 2395 2494 2419 2419 2519 2420 2420 2520 2395 2395 2494 2420 2420 2520 2396 2396 2495 2396 2396 2495 2420 2420 2520 2421 2421 2521 2396 2396 2495 2421 2421 2521 2397 2397 2496 2397 2397 2496 2421 2421 2521 2422 2422 2522 2397 2397 2496 2422 2422 2522 2398 2398 2497 2398 2398 2497 2422 2422 2522 2423 2423 2523 2398 2398 2497 2423 2423 2523 2399 2399 2498 2399 2399 2498 2423 2423 2523 2400 2400 2524 2399 2399 2498 2400 2400 2524 2376 2376 2499 2400 2400 2500 2424 2424 2525 2425 2425 2526 2400 2400 2500 2425 2425 2526 2401 2401 2501 2401 2401 2501 2425 2425 2526 2426 2426 2527 2401 2401 2501 2426 2426 2527 2402 2402 2502 2402 2402 2502 2426 2426 2527 2427 2427 2528 2402 2402 2502 2427 2427 2528 2403 2403 2503 2403 2403 2503 2427 2427 2528 2428 2428 2529 2403 2403 2503 2428 2428 2529 2404 2404 2504 2404 2404 2504 2428 2428 2529 2429 2429 2530 2404 2404 2504 2429 2429 2530 2405 2405 2505 2405 2405 2505 2429 2429 2530 2430 2430 2531 2405 2405 2505 2430 2430 2531 2406 2406 2506 2406 2406 2506 2430 2430 2531 2431 2431 2532 2406 2406 2506 2431 2431 2532 2407 2407 2507 2407 2407 2507 2431 2431 2532 2432 2432 2533 2407 2407 2507 2432 2432 2533 2408 2408 2508 2408 2408 2508 2432 2432 2533 2433 2433 2534 2408 2408 2508 2433 2433 2534 2409 2409 2509 2409 2409 2509 2433 2433 2534 2434 2434 2535 2409 2409 2509 2434 2434 2535 2410 2410 2510 2410 2410 2510 2434 2434 2535 2435 2435 2536 2410 2410 2510 2435 2435 2536 2411 2411 2511 2411 2411 2511 2435 2435 2536 2436 2436 2537 2411 2411 2511 2436 2436 2537 2412 2412 2512 2412 2412 2512 2436 2436 2537 2437 2437 2538 2412 2412 2512 2437 2437 2538 2413 2413 2513 2413 2413 2513 2437 2437 2538 2438 2438 2539 2413 2413 2513 2438 2438 2539 2414 2414 2514 2414 2414 2514 2438 2438 2539 2439 2439 2540 2414 2414 2514 2439 2439 2540 2415 2415 2515 2415 2415 2515 2439 2439 2540 2440 2440 2541 2415 2415 2515 2440 2440 2541 2416 2416 2516 2416 2416 2516 2440 2440 2541 2441 2441 2542 2416 2416 2516 2441 2441 2542 2417 2417 2517 2417 2417 2517 2441 2441 2542 2442 2442 2543 2417 2417 2517 2442 2442 2543 2418 2418 2518 2418 2418 2518 2442 2442 2543 2443 2443 2544 2418 2418 2518 2443 2443 2544 2419 2419 2519 2419 2419 2519 2443 2443 2544 2444 2444 2545 2419 2419 2519 2444 2444 2545 2420 2420 2520 2420 2420 2520 2444 2444 2545 2445 2445 2546 2420 2420 2520 2445 2445 2546 2421 2421 2521 2421 2421 2521 2445 2445 2546 2446 2446 2547 2421 2421 2521 2446 2446 2547 2422 2422 2522 2422 2422 2522 2446 2446 2547 2447 2447 2548 2422 2422 2522 2447 2447 2548 2423 2423 2523 2423 2423 2523 2447 2447 2548 2424 2424 2549 2423 2423 2523 2424 2424 2549 2400 2400 2524 2424 2424 2525 2448 2448 2550 2449 2449 2551 2424 2424 2525 2449 2449 2551 2425 2425 2526 2425 2425 2526 2449 2449 2551 2450 2450 2552 2425 2425 2526 2450 2450 2552 2426 2426 2527 2426 2426 2527 2450 2450 2552 2451 2451 2553 2426 2426 2527 2451 2451 2553 2427 2427 2528 2427 2427 2528 2451 2451 2553 2452 2452 2554 2427 2427 2528 2452 2452 2554 2428 2428 2529 2428 2428 2529 2452 2452 2554 2453 2453 2555 2428 2428 2529 2453 2453 2555 2429 2429 2530 2429 2429 2530 2453 2453 2555 2454 2454 2556 2429 2429 2530 2454 2454 2556 2430 2430 2531 2430 2430 2531 2454 2454 2556 2455 2455 2557 2430 2430 2531 2455 2455 2557 2431 2431 2532 2431 2431 2532 2455 2455 2557 2456 2456 2558 2431 2431 2532 2456 2456 2558 2432 2432 2533 2432 2432 2533 2456 2456 2558 2457 2457 2559 2432 2432 2533 2457 2457 2559 2433 2433 2534 2433 2433 2534 2457 2457 2559 2458 2458 2560 2433 2433 2534 2458 2458 2560 2434 2434 2535 2434 2434 2535 2458 2458 2560 2459 2459 2561 2434 2434 2535 2459 2459 2561 2435 2435 2536 2435 2435 2536 2459 2459 2561 2460 2460 2562 2435 2435 2536 2460 2460 2562 2436 2436 2537 2436 2436 2537 2460 2460 2562 2461 2461 2563 2436 2436 2537 2461 2461 2563 2437 2437 2538 2437 2437 2538 2461 2461 2563 2462 2462 2564 2437 2437 2538 2462 2462 2564 2438 2438 2539 2438 2438 2539 2462 2462 2564 2463 2463 2565 2438 2438 2539 2463 2463 2565 2439 2439 2540 2439 2439 2540 2463 2463 2565 2464 2464 2566 2439 2439 2540 2464 2464 2566 2440 2440 2541 2440 2440 2541 2464 2464 2566 2465 2465 2567 2440 2440 2541 2465 2465 2567 2441 2441 2542 2441 2441 2542 2465 2465 2567 2466 2466 2568 2441 2441 2542 2466 2466 2568 2442 2442 2543 2442 2442 2543 2466 2466 2568 2467 2467 2569 2442 2442 2543 2467 2467 2569 2443 2443 2544 2443 2443 2544 2467 2467 2569 2468 2468 2570 2443 2443 2544 2468 2468 2570 2444 2444 2545 2444 2444 2545 2468 2468 2570 2469 2469 2571 2444 2444 2545 2469 2469 2571 2445 2445 2546 2445 2445 2546 2469 2469 2571 2470 2470 2572 2445 2445 2546 2470 2470 2572 2446 2446 2547 2446 2446 2547 2470 2470 2572 2471 2471 2573 2446 2446 2547 2471 2471 2573 2447 2447 2548 2447 2447 2548 2471 2471 2573 2448 2448 2574 2447 2447 2548 2448 2448 2574 2424 2424 2549 2448 2448 2550 2472 2472 2575 2473 2473 2576 2448 2448 2550 2473 2473 2576 2449 2449 2551 2449 2449 2551 2473 2473 2576 2474 2474 2577 2449 2449 2551 2474 2474 2577 2450 2450 2552 2450 2450 2552 2474 2474 2577 2475 2475 2578 2450 2450 2552 2475 2475 2578 2451 2451 2553 2451 2451 2553 2475 2475 2578 2476 2476 2579 2451 2451 2553 2476 2476 2579 2452 2452 2554 2452 2452 2554 2476 2476 2579 2477 2477 2580 2452 2452 2554 2477 2477 2580 2453 2453 2555 2453 2453 2555 2477 2477 2580 2478 2478 2581 2453 2453 2555 2478 2478 2581 2454 2454 2556 2454 2454 2556 2478 2478 2581 2479 2479 2582 2454 2454 2556 2479 2479 2582 2455 2455 2557 2455 2455 2557 2479 2479 2582 2480 2480 2583 2455 2455 2557 2480 2480 2583 2456 2456 2558 2456 2456 2558 2480 2480 2583 2481 2481 2584 2456 2456 2558 2481 2481 2584 2457 2457 2559 2457 2457 2559 2481 2481 2584 2482 2482 2585 2457 2457 2559 2482 2482 2585 2458 2458 2560 2458 2458 2560 2482 2482 2585 2483 2483 2586 2458 2458 2560 2483 2483 2586 2459 2459 2561 2459 2459 2561 2483 2483 2586 2484 2484 2587 2459 2459 2561 2484 2484 2587 2460 2460 2562 2460 2460 2562 2484 2484 2587 2485 2485 2588 2460 2460 2562 2485 2485 2588 2461 2461 2563 2461 2461 2563 2485 2485 2588 2486 2486 2589 2461 2461 2563 2486 2486 2589 2462 2462 2564 2462 2462 2564 2486 2486 2589 2487 2487 2590 2462 2462 2564 2487 2487 2590 2463 2463 2565 2463 2463 2565 2487 2487 2590 2488 2488 2591 2463 2463 2565 2488 2488 2591 2464 2464 2566 2464 2464 2566 2488 2488 2591 2489 2489 2592 2464 2464 2566 2489 2489 2592 2465 2465 2567 2465 2465 2567 2489 2489 2592 2490 2490 2593 2465 2465 2567 2490 2490 2593 2466 2466 2568 2466 2466 2568 2490 2490 2593 2491 2491 2594 2466 2466 2568 2491 2491 2594 2467 2467 2569 2467 2467 2569 2491 2491 2594 2492 2492 2595 2467 2467 2569 2492 2492 2595 2468 2468 2570 2468 2468 2570 2492 2492 2595 2493 2493 2596 2468 2468 2570 2493 2493 2596 2469 2469 2571 2469 2469 2571 2493 2493 2596 2494 2494 2597 2469 2469 2571 2494 2494 2597 2470 2470 2572 2470 2470 2572 2494 2494 2597 2495 2495 2598 2470 2470 2572 2495 2495 2598 2471 2471 2573 2471 2471 2573 2495 2495 2598 2472 2472 2599 2471 2471 2573 2472 2472 2599 2448 2448 2574 2472 2472 2575 2496 2496 2600 2497 2497 2601 2472 2472 2575 2497 2497 2601 2473 2473 2576 2473 2473 2576 2497 2497 2601 2498 2498 2602 2473 2473 2576 2498 2498 2602 2474 2474 2577 2474 2474 2577 2498 2498 2602 2499 2499 2603 2474 2474 2577 2499 2499 2603 2475 2475 2578 2475 2475 2578 2499 2499 2603 2500 2500 2604 2475 2475 2578 2500 2500 2604 2476 2476 2579 2476 2476 2579 2500 2500 2604 2501 2501 2605 2476 2476 2579 2501 2501 2605 2477 2477 2580 2477 2477 2580 2501 2501 2605 2502 2502 2606 2477 2477 2580 2502 2502 2606 2478 2478 2581 2478 2478 2581 2502 2502 2606 2503 2503 2607 2478 2478 2581 2503 2503 2607 2479 2479 2582 2479 2479 2582 2503 2503 2607 2504 2504 2608 2479 2479 2582 2504 2504 2608 2480 2480 2583 2480 2480 2583 2504 2504 2608 2505 2505 2609 2480 2480 2583 2505 2505 2609 2481 2481 2584 2481 2481 2584 2505 2505 2609 2506 2506 2610 2481 2481 2584 2506 2506 2610 2482 2482 2585 2482 2482 2585 2506 2506 2610 2507 2507 2611 2482 2482 2585 2507 2507 2611 2483 2483 2586 2483 2483 2586 2507 2507 2611 2508 2508 2612 2483 2483 2586 2508 2508 2612 2484 2484 2587 2484 2484 2587 2508 2508 2612 2509 2509 2613 2484 2484 2587 2509 2509 2613 2485 2485 2588 2485 2485 2588 2509 2509 2613 2510 2510 2614 2485 2485 2588 2510 2510 2614 2486 2486 2589 2486 2486 2589 2510 2510 2614 2511 2511 2615 2486 2486 2589 2511 2511 2615 2487 2487 2590 2487 2487 2590 2511 2511 2615 2512 2512 2616 2487 2487 2590 2512 2512 2616 2488 2488 2591 2488 2488 2591 2512 2512 2616 2513 2513 2617 2488 2488 2591 2513 2513 2617 2489 2489 2592 2489 2489 2592 2513 2513 2617 2514 2514 2618 2489 2489 2592 2514 2514 2618 2490 2490 2593 2490 2490 2593 2514 2514 2618 2515 2515 2619 2490 2490 2593 2515 2515 2619 2491 2491 2594 2491 2491 2594 2515 2515 2619 2516 2516 2620 2491 2491 2594 2516 2516 2620 2492 2492 2595 2492 2492 2595 2516 2516 2620 2517 2517 2621 2492 2492 2595 2517 2517 2621 2493 2493 2596 2493 2493 2596 2517 2517 2621 2518 2518 2622 2493 2493 2596 2518 2518 2622 2494 2494 2597 2494 2494 2597 2518 2518 2622 2519 2519 2623 2494 2494 2597 2519 2519 2623 2495 2495 2598 2495 2495 2598 2519 2519 2623 2496 2496 2624 2495 2495 2598 2496 2496 2624 2472 2472 2599 2496 2496 2600 2520 2520 2625 2521 2521 2626 2496 2496 2600 2521 2521 2626 2497 2497 2601 2497 2497 2601 2521 2521 2626 2522 2522 2627 2497 2497 2601 2522 2522 2627 2498 2498 2602 2498 2498 2602 2522 2522 2627 2523 2523 2628 2498 2498 2602 2523 2523 2628 2499 2499 2603 2499 2499 2603 2523 2523 2628 2524 2524 2629 2499 2499 2603 2524 2524 2629 2500 2500 2604 2500 2500 2604 2524 2524 2629 2525 2525 2630 2500 2500 2604 2525 2525 2630 2501 2501 2605 2501 2501 2605 2525 2525 2630 2526 2526 2631 2501 2501 2605 2526 2526 2631 2502 2502 2606 2502 2502 2606 2526 2526 2631 2527 2527 2632 2502 2502 2606 2527 2527 2632 2503 2503 2607 2503 2503 2607 2527 2527 2632 2528 2528 2633 2503 2503 2607 2528 2528 2633 2504 2504 2608 2504 2504 2608 2528 2528 2633 2529 2529 2634 2504 2504 2608 2529 2529 2634 2505 2505 2609 2505 2505 2609 2529 2529 2634 2530 2530 2635 2505 2505 2609 2530 2530 2635 2506 2506 2610 2506 2506 2610 2530 2530 2635 2531 2531 2636 2506 2506 2610 2531 2531 2636 2507 2507 2611 2507 2507 2611 2531 2531 2636 2532 2532 2637 2507 2507 2611 2532 2532 2637 2508 2508 2612 2508 2508 2612 2532 2532 2637 2533 2533 2638 2508 2508 2612 2533 2533 2638 2509 2509 2613 2509 2509 2613 2533 2533 2638 2534 2534 2639 2509 2509 2613 2534 2534 2639 2510 2510 2614 2510 2510 2614 2534 2534 2639 2535 2535 2640 2510 2510 2614 2535 2535 2640 2511 2511 2615 2511 2511 2615 2535 2535 2640 2536 2536 2641 2511 2511 2615 2536 2536 2641 2512 2512 2616 2512 2512 2616 2536 2536 2641 2537 2537 2642 2512 2512 2616 2537 2537 2642 2513 2513 2617 2513 2513 2617 2537 2537 2642 2538 2538 2643 2513 2513 2617 2538 2538 2643 2514 2514 2618 2514 2514 2618 2538 2538 2643 2539 2539 2644 2514 2514 2618 2539 2539 2644 2515 2515 2619 2515 2515 2619 2539 2539 2644 2540 2540 2645 2515 2515 2619 2540 2540 2645 2516 2516 2620 2516 2516 2620 2540 2540 2645 2541 2541 2646 2516 2516 2620 2541 2541 2646 2517 2517 2621 2517 2517 2621 2541 2541 2646 2542 2542 2647 2517 2517 2621 2542 2542 2647 2518 2518 2622 2518 2518 2622 2542 2542 2647 2543 2543 2648 2518 2518 2622 2543 2543 2648 2519 2519 2623 2519 2519 2623 2543 2543 2648 2520 2520 2649 2519 2519 2623 2520 2520 2649 2496 2496 2624 2520 2520 2625 2544 2544 2650 2545 2545 2651 2520 2520 2625 2545 2545 2651 2521 2521 2626 2521 2521 2626 2545 2545 2651 2546 2546 2652 2521 2521 2626 2546 2546 2652 2522 2522 2627 2522 2522 2627 2546 2546 2652 2547 2547 2653 2522 2522 2627 2547 2547 2653 2523 2523 2628 2523 2523 2628 2547 2547 2653 2548 2548 2654 2523 2523 2628 2548 2548 2654 2524 2524 2629 2524 2524 2629 2548 2548 2654 2549 2549 2655 2524 2524 2629 2549 2549 2655 2525 2525 2630 2525 2525 2630 2549 2549 2655 2550 2550 2656 2525 2525 2630 2550 2550 2656 2526 2526 2631 2526 2526 2631 2550 2550 2656 2551 2551 2657 2526 2526 2631 2551 2551 2657 2527 2527 2632 2527 2527 2632 2551 2551 2657 2552 2552 2658 2527 2527 2632 2552 2552 2658 2528 2528 2633 2528 2528 2633 2552 2552 2658 2553 2553 2659 2528 2528 2633 2553 2553 2659 2529 2529 2634 2529 2529 2634 2553 2553 2659 2554 2554 2660 2529 2529 2634 2554 2554 2660 2530 2530 2635 2530 2530 2635 2554 2554 2660 2555 2555 2661 2530 2530 2635 2555 2555 2661 2531 2531 2636 2531 2531 2636 2555 2555 2661 2556 2556 2662 2531 2531 2636 2556 2556 2662 2532 2532 2637 2532 2532 2637 2556 2556 2662 2557 2557 2663 2532 2532 2637 2557 2557 2663 2533 2533 2638 2533 2533 2638 2557 2557 2663 2558 2558 2664 2533 2533 2638 2558 2558 2664 2534 2534 2639 2534 2534 2639 2558 2558 2664 2559 2559 2665 2534 2534 2639 2559 2559 2665 2535 2535 2640 2535 2535 2640 2559 2559 2665 2560 2560 2666 2535 2535 2640 2560 2560 2666 2536 2536 2641 2536 2536 2641 2560 2560 2666 2561 2561 2667 2536 2536 2641 2561 2561 2667 2537 2537 2642 2537 2537 2642 2561 2561 2667 2562 2562 2668 2537 2537 2642 2562 2562 2668 2538 2538 2643 2538 2538 2643 2562 2562 2668 2563 2563 2669 2538 2538 2643 2563 2563 2669 2539 2539 2644 2539 2539 2644 2563 2563 2669 2564 2564 2670 2539 2539 2644 2564 2564 2670 2540 2540 2645 2540 2540 2645 2564 2564 2670 2565 2565 2671 2540 2540 2645 2565 2565 2671 2541 2541 2646 2541 2541 2646 2565 2565 2671 2566 2566 2672 2541 2541 2646 2566 2566 2672 2542 2542 2647 2542 2542 2647 2566 2566 2672 2567 2567 2673 2542 2542 2647 2567 2567 2673 2543 2543 2648 2543 2543 2648 2567 2567 2673 2544 2544 2674 2543 2543 2648 2544 2544 2674 2520 2520 2649 2544 2544 2650 2568 2568 2675 2569 2569 2676 2544 2544 2650 2569 2569 2676 2545 2545 2651 2545 2545 2651 2569 2569 2676 2570 2570 2677 2545 2545 2651 2570 2570 2677 2546 2546 2652 2546 2546 2652 2570 2570 2677 2571 2571 2678 2546 2546 2652 2571 2571 2678 2547 2547 2653 2547 2547 2653 2571 2571 2678 2572 2572 2679 2547 2547 2653 2572 2572 2679 2548 2548 2654 2548 2548 2654 2572 2572 2679 2573 2573 2680 2548 2548 2654 2573 2573 2680 2549 2549 2655 2549 2549 2655 2573 2573 2680 2574 2574 2681 2549 2549 2655 2574 2574 2681 2550 2550 2656 2550 2550 2656 2574 2574 2681 2575 2575 2682 2550 2550 2656 2575 2575 2682 2551 2551 2657 2551 2551 2657 2575 2575 2682 2576 2576 2683 2551 2551 2657 2576 2576 2683 2552 2552 2658 2552 2552 2658 2576 2576 2683 2577 2577 2684 2552 2552 2658 2577 2577 2684 2553 2553 2659 2553 2553 2659 2577 2577 2684 2578 2578 2685 2553 2553 2659 2578 2578 2685 2554 2554 2660 2554 2554 2660 2578 2578 2685 2579 2579 2686 2554 2554 2660 2579 2579 2686 2555 2555 2661 2555 2555 2661 2579 2579 2686 2580 2580 2687 2555 2555 2661 2580 2580 2687 2556 2556 2662 2556 2556 2662 2580 2580 2687 2581 2581 2688 2556 2556 2662 2581 2581 2688 2557 2557 2663 2557 2557 2663 2581 2581 2688 2582 2582 2689 2557 2557 2663 2582 2582 2689 2558 2558 2664 2558 2558 2664 2582 2582 2689 2583 2583 2690 2558 2558 2664 2583 2583 2690 2559 2559 2665 2559 2559 2665 2583 2583 2690 2584 2584 2691 2559 2559 2665 2584 2584 2691 2560 2560 2666 2560 2560 2666 2584 2584 2691 2585 2585 2692 2560 2560 2666 2585 2585 2692 2561 2561 2667 2561 2561 2667 2585 2585 2692 2586 2586 2693 2561 2561 2667 2586 2586 2693 2562 2562 2668 2562 2562 2668 2586 2586 2693 2587 2587 2694 2562 2562 2668 2587 2587 2694 2563 2563 2669 2563 2563 2669 2587 2587 2694 2588 2588 2695 2563 2563 2669 2588 2588 2695 2564 2564 2670 2564 2564 2670 2588 2588 2695 2589 2589 2696 2564 2564 2670 2589 2589 2696 2565 2565 2671 2565 2565 2671 2589 2589 2696 2590 2590 2697 2565 2565 2671 2590 2590 2697 2566 2566 2672 2566 2566 2672 2590 2590 2697 2591 2591 2698 2566 2566 2672 2591 2591 2698 2567 2567 2673 2567 2567 2673 2591 2591 2698 2568 2568 2699 2567 2567 2673 2568 2568 2699 2544 2544 2674 2568 2568 2675 2592 2592 2700 2593 2593 2701 2568 2568 2675 2593 2593 2701 2569 2569 2676 2569 2569 2676 2593 2593 2701 2594 2594 2702 2569 2569 2676 2594 2594 2702 2570 2570 2677 2570 2570 2677 2594 2594 2702 2595 2595 2703 2570 2570 2677 2595 2595 2703 2571 2571 2678 2571 2571 2678 2595 2595 2703 2596 2596 2704 2571 2571 2678 2596 2596 2704 2572 2572 2679 2572 2572 2679 2596 2596 2704 2597 2597 2705 2572 2572 2679 2597 2597 2705 2573 2573 2680 2573 2573 2680 2597 2597 2705 2598 2598 2706 2573 2573 2680 2598 2598 2706 2574 2574 2681 2574 2574 2681 2598 2598 2706 2599 2599 2707 2574 2574 2681 2599 2599 2707 2575 2575 2682 2575 2575 2682 2599 2599 2707 2600 2600 2708 2575 2575 2682 2600 2600 2708 2576 2576 2683 2576 2576 2683 2600 2600 2708 2601 2601 2709 2576 2576 2683 2601 2601 2709 2577 2577 2684 2577 2577 2684 2601 2601 2709 2602 2602 2710 2577 2577 2684 2602 2602 2710 2578 2578 2685 2578 2578 2685 2602 2602 2710 2603 2603 2711 2578 2578 2685 2603 2603 2711 2579 2579 2686 2579 2579 2686 2603 2603 2711 2604 2604 2712 2579 2579 2686 2604 2604 2712 2580 2580 2687 2580 2580 2687 2604 2604 2712 2605 2605 2713 2580 2580 2687 2605 2605 2713 2581 2581 2688 2581 2581 2688 2605 2605 2713 2606 2606 2714 2581 2581 2688 2606 2606 2714 2582 2582 2689 2582 2582 2689 2606 2606 2714 2607 2607 2715 2582 2582 2689 2607 2607 2715 2583 2583 2690 2583 2583 2690 2607 2607 2715 2608 2608 2716 2583 2583 2690 2608 2608 2716 2584 2584 2691 2584 2584 2691 2608 2608 2716 2609 2609 2717 2584 2584 2691 2609 2609 2717 2585 2585 2692 2585 2585 2692 2609 2609 2717 2610 2610 2718 2585 2585 2692 2610 2610 2718 2586 2586 2693 2586 2586 2693 2610 2610 2718 2611 2611 2719 2586 2586 2693 2611 2611 2719 2587 2587 2694 2587 2587 2694 2611 2611 2719 2612 2612 2720 2587 2587 2694 2612 2612 2720 2588 2588 2695 2588 2588 2695 2612 2612 2720 2613 2613 2721 2588 2588 2695 2613 2613 2721 2589 2589 2696 2589 2589 2696 2613 2613 2721 2614 2614 2722 2589 2589 2696 2614 2614 2722 2590 2590 2697 2590 2590 2697 2614 2614 2722 2615 2615 2723 2590 2590 2697 2615 2615 2723 2591 2591 2698 2591 2591 2698 2615 2615 2723 2592 2592 2724 2591 2591 2698 2592 2592 2724 2568 2568 2699 2592 2592 2700 2616 2616 2725 2617 2617 2726 2592 2592 2700 2617 2617 2726 2593 2593 2701 2593 2593 2701 2617 2617 2726 2618 2618 2727 2593 2593 2701 2618 2618 2727 2594 2594 2702 2594 2594 2702 2618 2618 2727 2619 2619 2728 2594 2594 2702 2619 2619 2728 2595 2595 2703 2595 2595 2703 2619 2619 2728 2620 2620 2729 2595 2595 2703 2620 2620 2729 2596 2596 2704 2596 2596 2704 2620 2620 2729 2621 2621 2730 2596 2596 2704 2621 2621 2730 2597 2597 2705 2597 2597 2705 2621 2621 2730 2622 2622 2731 2597 2597 2705 2622 2622 2731 2598 2598 2706 2598 2598 2706 2622 2622 2731 2623 2623 2732 2598 2598 2706 2623 2623 2732 2599 2599 2707 2599 2599 2707 2623 2623 2732 2624 2624 2733 2599 2599 2707 2624 2624 2733 2600 2600 2708 2600 2600 2708 2624 2624 2733 2625 2625 2734 2600 2600 2708 2625 2625 2734 2601 2601 2709 2601 2601 2709 2625 2625 2734 2626 2626 2735 2601 2601 2709 2626 2626 2735 2602 2602 2710 2602 2602 2710 2626 2626 2735 2627 2627 2736 2602 2602 2710 2627 2627 2736 2603 2603 2711 2603 2603 2711 2627 2627 2736 2628 2628 2737 2603 2603 2711 2628 2628 2737 2604 2604 2712 2604 2604 2712 2628 2628 2737 2629 2629 2738 2604 2604 2712 2629 2629 2738 2605 2605 2713 2605 2605 2713 2629 2629 2738 2630 2630 2739 2605 2605 2713 2630 2630 2739 2606 2606 2714 2606 2606 2714 2630 2630 2739 2631 2631 2740 2606 2606 2714 2631 2631 2740 2607 2607 2715 2607 2607 2715 2631 2631 2740 2632 2632 2741 2607 2607 2715 2632 2632 2741 2608 2608 2716 2608 2608 2716 2632 2632 2741 2633 2633 2742 2608 2608 2716 2633 2633 2742 2609 2609 2717 2609 2609 2717 2633 2633 2742 2634 2634 2743 2609 2609 2717 2634 2634 2743 2610 2610 2718 2610 2610 2718 2634 2634 2743 2635 2635 2744 2610 2610 2718 2635 2635 2744 2611 2611 2719 2611 2611 2719 2635 2635 2744 2636 2636 2745 2611 2611 2719 2636 2636 2745 2612 2612 2720 2612 2612 2720 2636 2636 2745 2637 2637 2746 2612 2612 2720 2637 2637 2746 2613 2613 2721 2613 2613 2721 2637 2637 2746 2638 2638 2747 2613 2613 2721 2638 2638 2747 2614 2614 2722 2614 2614 2722 2638 2638 2747 2639 2639 2748 2614 2614 2722 2639 2639 2748 2615 2615 2723 2615 2615 2723 2639 2639 2748 2616 2616 2749 2615 2615 2723 2616 2616 2749 2592 2592 2724 2616 2616 2725 2640 2640 2750 2641 2641 2751 2616 2616 2725 2641 2641 2751 2617 2617 2726 2617 2617 2726 2641 2641 2751 2642 2642 2752 2617 2617 2726 2642 2642 2752 2618 2618 2727 2618 2618 2727 2642 2642 2752 2643 2643 2753 2618 2618 2727 2643 2643 2753 2619 2619 2728 2619 2619 2728 2643 2643 2753 2644 2644 2754 2619 2619 2728 2644 2644 2754 2620 2620 2729 2620 2620 2729 2644 2644 2754 2645 2645 2755 2620 2620 2729 2645 2645 2755 2621 2621 2730 2621 2621 2730 2645 2645 2755 2646 2646 2756 2621 2621 2730 2646 2646 2756 2622 2622 2731 2622 2622 2731 2646 2646 2756 2647 2647 2757 2622 2622 2731 2647 2647 2757 2623 2623 2732 2623 2623 2732 2647 2647 2757 2648 2648 2758 2623 2623 2732 2648 2648 2758 2624 2624 2733 2624 2624 2733 2648 2648 2758 2649 2649 2759 2624 2624 2733 2649 2649 2759 2625 2625 2734 2625 2625 2734 2649 2649 2759 2650 2650 2760 2625 2625 2734 2650 2650 2760 2626 2626 2735 2626 2626 2735 2650 2650 2760 2651 2651 2761 2626 2626 2735 2651 2651 2761 2627 2627 2736 2627 2627 2736 2651 2651 2761 2652 2652 2762 2627 2627 2736 2652 2652 2762 2628 2628 2737 2628 2628 2737 2652 2652 2762 2653 2653 2763 2628 2628 2737 2653 2653 2763 2629 2629 2738 2629 2629 2738 2653 2653 2763 2654 2654 2764 2629 2629 2738 2654 2654 2764 2630 2630 2739 2630 2630 2739 2654 2654 2764 2655 2655 2765 2630 2630 2739 2655 2655 2765 2631 2631 2740 2631 2631 2740 2655 2655 2765 2656 2656 2766 2631 2631 2740 2656 2656 2766 2632 2632 2741 2632 2632 2741 2656 2656 2766 2657 2657 2767 2632 2632 2741 2657 2657 2767 2633 2633 2742 2633 2633 2742 2657 2657 2767 2658 2658 2768 2633 2633 2742 2658 2658 2768 2634 2634 2743 2634 2634 2743 2658 2658 2768 2659 2659 2769 2634 2634 2743 2659 2659 2769 2635 2635 2744 2635 2635 2744 2659 2659 2769 2660 2660 2770 2635 2635 2744 2660 2660 2770 2636 2636 2745 2636 2636 2745 2660 2660 2770 2661 2661 2771 2636 2636 2745 2661 2661 2771 2637 2637 2746 2637 2637 2746 2661 2661 2771 2662 2662 2772 2637 2637 2746 2662 2662 2772 2638 2638 2747 2638 2638 2747 2662 2662 2772 2663 2663 2773 2638 2638 2747 2663 2663 2773 2639 2639 2748 2639 2639 2748 2663 2663 2773 2640 2640 2774 2639 2639 2748 2640 2640 2774 2616 2616 2749 2640 2640 2750 2664 2664 2775 2665 2665 2776 2640 2640 2750 2665 2665 2776 2641 2641 2751 2641 2641 2751 2665 2665 2776 2666 2666 2777 2641 2641 2751 2666 2666 2777 2642 2642 2752 2642 2642 2752 2666 2666 2777 2667 2667 2778 2642 2642 2752 2667 2667 2778 2643 2643 2753 2643 2643 2753 2667 2667 2778 2668 2668 2779 2643 2643 2753 2668 2668 2779 2644 2644 2754 2644 2644 2754 2668 2668 2779 2669 2669 2780 2644 2644 2754 2669 2669 2780 2645 2645 2755 2645 2645 2755 2669 2669 2780 2670 2670 2781 2645 2645 2755 2670 2670 2781 2646 2646 2756 2646 2646 2756 2670 2670 2781 2671 2671 2782 2646 2646 2756 2671 2671 2782 2647 2647 2757 2647 2647 2757 2671 2671 2782 2672 2672 2783 2647 2647 2757 2672 2672 2783 2648 2648 2758 2648 2648 2758 2672 2672 2783 2673 2673 2784 2648 2648 2758 2673 2673 2784 2649 2649 2759 2649 2649 2759 2673 2673 2784 2674 2674 2785 2649 2649 2759 2674 2674 2785 2650 2650 2760 2650 2650 2760 2674 2674 2785 2675 2675 2786 2650 2650 2760 2675 2675 2786 2651 2651 2761 2651 2651 2761 2675 2675 2786 2676 2676 2787 2651 2651 2761 2676 2676 2787 2652 2652 2762 2652 2652 2762 2676 2676 2787 2677 2677 2788 2652 2652 2762 2677 2677 2788 2653 2653 2763 2653 2653 2763 2677 2677 2788 2678 2678 2789 2653 2653 2763 2678 2678 2789 2654 2654 2764 2654 2654 2764 2678 2678 2789 2679 2679 2790 2654 2654 2764 2679 2679 2790 2655 2655 2765 2655 2655 2765 2679 2679 2790 2680 2680 2791 2655 2655 2765 2680 2680 2791 2656 2656 2766 2656 2656 2766 2680 2680 2791 2681 2681 2792 2656 2656 2766 2681 2681 2792 2657 2657 2767 2657 2657 2767 2681 2681 2792 2682 2682 2793 2657 2657 2767 2682 2682 2793 2658 2658 2768 2658 2658 2768 2682 2682 2793 2683 2683 2794 2658 2658 2768 2683 2683 2794 2659 2659 2769 2659 2659 2769 2683 2683 2794 2684 2684 2795 2659 2659 2769 2684 2684 2795 2660 2660 2770 2660 2660 2770 2684 2684 2795 2685 2685 2796 2660 2660 2770 2685 2685 2796 2661 2661 2771 2661 2661 2771 2685 2685 2796 2686 2686 2797 2661 2661 2771 2686 2686 2797 2662 2662 2772 2662 2662 2772 2686 2686 2797 2687 2687 2798 2662 2662 2772 2687 2687 2798 2663 2663 2773 2663 2663 2773 2687 2687 2798 2664 2664 2799 2663 2663 2773 2664 2664 2799 2640 2640 2774 2664 2664 2775 2688 2688 2800 2689 2689 2801 2664 2664 2775 2689 2689 2801 2665 2665 2776 2665 2665 2776 2689 2689 2801 2690 2690 2802 2665 2665 2776 2690 2690 2802 2666 2666 2777 2666 2666 2777 2690 2690 2802 2691 2691 2803 2666 2666 2777 2691 2691 2803 2667 2667 2778 2667 2667 2778 2691 2691 2803 2692 2692 2804 2667 2667 2778 2692 2692 2804 2668 2668 2779 2668 2668 2779 2692 2692 2804 2693 2693 2805 2668 2668 2779 2693 2693 2805 2669 2669 2780 2669 2669 2780 2693 2693 2805 2694 2694 2806 2669 2669 2780 2694 2694 2806 2670 2670 2781 2670 2670 2781 2694 2694 2806 2695 2695 2807 2670 2670 2781 2695 2695 2807 2671 2671 2782 2671 2671 2782 2695 2695 2807 2696 2696 2808 2671 2671 2782 2696 2696 2808 2672 2672 2783 2672 2672 2783 2696 2696 2808 2697 2697 2809 2672 2672 2783 2697 2697 2809 2673 2673 2784 2673 2673 2784 2697 2697 2809 2698 2698 2810 2673 2673 2784 2698 2698 2810 2674 2674 2785 2674 2674 2785 2698 2698 2810 2699 2699 2811 2674 2674 2785 2699 2699 2811 2675 2675 2786 2675 2675 2786 2699 2699 2811 2700 2700 2812 2675 2675 2786 2700 2700 2812 2676 2676 2787 2676 2676 2787 2700 2700 2812 2701 2701 2813 2676 2676 2787 2701 2701 2813 2677 2677 2788 2677 2677 2788 2701 2701 2813 2702 2702 2814 2677 2677 2788 2702 2702 2814 2678 2678 2789 2678 2678 2789 2702 2702 2814 2703 2703 2815 2678 2678 2789 2703 2703 2815 2679 2679 2790 2679 2679 2790 2703 2703 2815 2704 2704 2816 2679 2679 2790 2704 2704 2816 2680 2680 2791 2680 2680 2791 2704 2704 2816 2705 2705 2817 2680 2680 2791 2705 2705 2817 2681 2681 2792 2681 2681 2792 2705 2705 2817 2706 2706 2818 2681 2681 2792 2706 2706 2818 2682 2682 2793 2682 2682 2793 2706 2706 2818 2707 2707 2819 2682 2682 2793 2707 2707 2819 2683 2683 2794 2683 2683 2794 2707 2707 2819 2708 2708 2820 2683 2683 2794 2708 2708 2820 2684 2684 2795 2684 2684 2795 2708 2708 2820 2709 2709 2821 2684 2684 2795 2709 2709 2821 2685 2685 2796 2685 2685 2796 2709 2709 2821 2710 2710 2822 2685 2685 2796 2710 2710 2822 2686 2686 2797 2686 2686 2797 2710 2710 2822 2711 2711 2823 2686 2686 2797 2711 2711 2823 2687 2687 2798 2687 2687 2798 2711 2711 2823 2688 2688 2824 2687 2687 2798 2688 2688 2824 2664 2664 2799 2688 2688 2800 2712 2712 2825 2713 2713 2826 2688 2688 2800 2713 2713 2826 2689 2689 2801 2689 2689 2801 2713 2713 2826 2714 2714 2827 2689 2689 2801 2714 2714 2827 2690 2690 2802 2690 2690 2802 2714 2714 2827 2715 2715 2828 2690 2690 2802 2715 2715 2828 2691 2691 2803 2691 2691 2803 2715 2715 2828 2716 2716 2829 2691 2691 2803 2716 2716 2829 2692 2692 2804 2692 2692 2804 2716 2716 2829 2717 2717 2830 2692 2692 2804 2717 2717 2830 2693 2693 2805 2693 2693 2805 2717 2717 2830 2718 2718 2831 2693 2693 2805 2718 2718 2831 2694 2694 2806 2694 2694 2806 2718 2718 2831 2719 2719 2832 2694 2694 2806 2719 2719 2832 2695 2695 2807 2695 2695 2807 2719 2719 2832 2720 2720 2833 2695 2695 2807 2720 2720 2833 2696 2696 2808 2696 2696 2808 2720 2720 2833 2721 2721 2834 2696 2696 2808 2721 2721 2834 2697 2697 2809 2697 2697 2809 2721 2721 2834 2722 2722 2835 2697 2697 2809 2722 2722 2835 2698 2698 2810 2698 2698 2810 2722 2722 2835 2723 2723 2836 2698 2698 2810 2723 2723 2836 2699 2699 2811 2699 2699 2811 2723 2723 2836 2724 2724 2837 2699 2699 2811 2724 2724 2837 2700 2700 2812 2700 2700 2812 2724 2724 2837 2725 2725 2838 2700 2700 2812 2725 2725 2838 2701 2701 2813 2701 2701 2813 2725 2725 2838 2726 2726 2839 2701 2701 2813 2726 2726 2839 2702 2702 2814 2702 2702 2814 2726 2726 2839 2727 2727 2840 2702 2702 2814 2727 2727 2840 2703 2703 2815 2703 2703 2815 2727 2727 2840 2728 2728 2841 2703 2703 2815 2728 2728 2841 2704 2704 2816 2704 2704 2816 2728 2728 2841 2729 2729 2842 2704 2704 2816 2729 2729 2842 2705 2705 2817 2705 2705 2817 2729 2729 2842 2730 2730 2843 2705 2705 2817 2730 2730 2843 2706 2706 2818 2706 2706 2818 2730 2730 2843 2731 2731 2844 2706 2706 2818 2731 2731 2844 2707 2707 2819 2707 2707 2819 2731 2731 2844 2732 2732 2845 2707 2707 2819 2732 2732 2845 2708 2708 2820 2708 2708 2820 2732 2732 2845 2733 2733 2846 2708 2708 2820 2733 2733 2846 2709 2709 2821 2709 2709 2821 2733 2733 2846 2734 2734 2847 2709 2709 2821 2734 2734 2847 2710 2710 2822 2710 2710 2822 2734 2734 2847 2735 2735 2848 2710 2710 2822 2735 2735 2848 2711 2711 2823 2711 2711 2823 2735 2735 2848 2712 2712 2849 2711 2711 2823 2712 2712 2849 2688 2688 2824 2712 2712 2825 2736 2736 2850 2737 2737 2851 2712 2712 2825 2737 2737 2851 2713 2713 2826 2713 2713 2826 2737 2737 2851 2738 2738 2852 2713 2713 2826 2738 2738 2852 2714 2714 2827 2714 2714 2827 2738 2738 2852 2739 2739 2853 2714 2714 2827 2739 2739 2853 2715 2715 2828 2715 2715 2828 2739 2739 2853 2740 2740 2854 2715 2715 2828 2740 2740 2854 2716 2716 2829 2716 2716 2829 2740 2740 2854 2741 2741 2855 2716 2716 2829 2741 2741 2855 2717 2717 2830 2717 2717 2830 2741 2741 2855 2742 2742 2856 2717 2717 2830 2742 2742 2856 2718 2718 2831 2718 2718 2831 2742 2742 2856 2743 2743 2857 2718 2718 2831 2743 2743 2857 2719 2719 2832 2719 2719 2832 2743 2743 2857 2744 2744 2858 2719 2719 2832 2744 2744 2858 2720 2720 2833 2720 2720 2833 2744 2744 2858 2745 2745 2859 2720 2720 2833 2745 2745 2859 2721 2721 2834 2721 2721 2834 2745 2745 2859 2746 2746 2860 2721 2721 2834 2746 2746 2860 2722 2722 2835 2722 2722 2835 2746 2746 2860 2747 2747 2861 2722 2722 2835 2747 2747 2861 2723 2723 2836 2723 2723 2836 2747 2747 2861 2748 2748 2862 2723 2723 2836 2748 2748 2862 2724 2724 2837 2724 2724 2837 2748 2748 2862 2749 2749 2863 2724 2724 2837 2749 2749 2863 2725 2725 2838 2725 2725 2838 2749 2749 2863 2750 2750 2864 2725 2725 2838 2750 2750 2864 2726 2726 2839 2726 2726 2839 2750 2750 2864 2751 2751 2865 2726 2726 2839 2751 2751 2865 2727 2727 2840 2727 2727 2840 2751 2751 2865 2752 2752 2866 2727 2727 2840 2752 2752 2866 2728 2728 2841 2728 2728 2841 2752 2752 2866 2753 2753 2867 2728 2728 2841 2753 2753 2867 2729 2729 2842 2729 2729 2842 2753 2753 2867 2754 2754 2868 2729 2729 2842 2754 2754 2868 2730 2730 2843 2730 2730 2843 2754 2754 2868 2755 2755 2869 2730 2730 2843 2755 2755 2869 2731 2731 2844 2731 2731 2844 2755 2755 2869 2756 2756 2870 2731 2731 2844 2756 2756 2870 2732 2732 2845 2732 2732 2845 2756 2756 2870 2757 2757 2871 2732 2732 2845 2757 2757 2871 2733 2733 2846 2733 2733 2846 2757 2757 2871 2758 2758 2872 2733 2733 2846 2758 2758 2872 2734 2734 2847 2734 2734 2847 2758 2758 2872 2759 2759 2873 2734 2734 2847 2759 2759 2873 2735 2735 2848 2735 2735 2848 2759 2759 2873 2736 2736 2874 2735 2735 2848 2736 2736 2874 2712 2712 2849 2736 2736 2850 2760 2760 2875 2761 2761 2876 2736 2736 2850 2761 2761 2876 2737 2737 2851 2737 2737 2851 2761 2761 2876 2762 2762 2877 2737 2737 2851 2762 2762 2877 2738 2738 2852 2738 2738 2852 2762 2762 2877 2763 2763 2878 2738 2738 2852 2763 2763 2878 2739 2739 2853 2739 2739 2853 2763 2763 2878 2764 2764 2879 2739 2739 2853 2764 2764 2879 2740 2740 2854 2740 2740 2854 2764 2764 2879 2765 2765 2880 2740 2740 2854 2765 2765 2880 2741 2741 2855 2741 2741 2855 2765 2765 2880 2766 2766 2881 2741 2741 2855 2766 2766 2881 2742 2742 2856 2742 2742 2856 2766 2766 2881 2767 2767 2882 2742 2742 2856 2767 2767 2882 2743 2743 2857 2743 2743 2857 2767 2767 2882 2768 2768 2883 2743 2743 2857 2768 2768 2883 2744 2744 2858 2744 2744 2858 2768 2768 2883 2769 2769 2884 2744 2744 2858 2769 2769 2884 2745 2745 2859 2745 2745 2859 2769 2769 2884 2770 2770 2885 2745 2745 2859 2770 2770 2885 2746 2746 2860 2746 2746 2860 2770 2770 2885 2771 2771 2886 2746 2746 2860 2771 2771 2886 2747 2747 2861 2747 2747 2861 2771 2771 2886 2772 2772 2887 2747 2747 2861 2772 2772 2887 2748 2748 2862 2748 2748 2862 2772 2772 2887 2773 2773 2888 2748 2748 2862 2773 2773 2888 2749 2749 2863 2749 2749 2863 2773 2773 2888 2774 2774 2889 2749 2749 2863 2774 2774 2889 2750 2750 2864 2750 2750 2864 2774 2774 2889 2775 2775 2890 2750 2750 2864 2775 2775 2890 2751 2751 2865 2751 2751 2865 2775 2775 2890 2776 2776 2891 2751 2751 2865 2776 2776 2891 2752 2752 2866 2752 2752 2866 2776 2776 2891 2777 2777 2892 2752 2752 2866 2777 2777 2892 2753 2753 2867 2753 2753 2867 2777 2777 2892 2778 2778 2893 2753 2753 2867 2778 2778 2893 2754 2754 2868 2754 2754 2868 2778 2778 2893 2779 2779 2894 2754 2754 2868 2779 2779 2894 2755 2755 2869 2755 2755 2869 2779 2779 2894 2780 2780 2895 2755 2755 2869 2780 2780 2895 2756 2756 2870 2756 2756 2870 2780 2780 2895 2781 2781 2896 2756 2756 2870 2781 2781 2896 2757 2757 2871 2757 2757 2871 2781 2781 2896 2782 2782 2897 2757 2757 2871 2782 2782 2897 2758 2758 2872 2758 2758 2872 2782 2782 2897 2783 2783 2898 2758 2758 2872 2783 2783 2898 2759 2759 2873 2759 2759 2873 2783 2783 2898 2760 2760 2899 2759 2759 2873 2760 2760 2899 2736 2736 2874 2760 2760 2875 2784 2784 2900 2785 2785 2901 2760 2760 2875 2785 2785 2901 2761 2761 2876 2761 2761 2876 2785 2785 2901 2786 2786 2902 2761 2761 2876 2786 2786 2902 2762 2762 2877 2762 2762 2877 2786 2786 2902 2787 2787 2903 2762 2762 2877 2787 2787 2903 2763 2763 2878 2763 2763 2878 2787 2787 2903 2788 2788 2904 2763 2763 2878 2788 2788 2904 2764 2764 2879 2764 2764 2879 2788 2788 2904 2789 2789 2905 2764 2764 2879 2789 2789 2905 2765 2765 2880 2765 2765 2880 2789 2789 2905 2790 2790 2906 2765 2765 2880 2790 2790 2906 2766 2766 2881 2766 2766 2881 2790 2790 2906 2791 2791 2907 2766 2766 2881 2791 2791 2907 2767 2767 2882 2767 2767 2882 2791 2791 2907 2792 2792 2908 2767 2767 2882 2792 2792 2908 2768 2768 2883 2768 2768 2883 2792 2792 2908 2793 2793 2909 2768 2768 2883 2793 2793 2909 2769 2769 2884 2769 2769 2884 2793 2793 2909 2794 2794 2910 2769 2769 2884 2794 2794 2910 2770 2770 2885 2770 2770 2885 2794 2794 2910 2795 2795 2911 2770 2770 2885 2795 2795 2911 2771 2771 2886 2771 2771 2886 2795 2795 2911 2796 2796 2912 2771 2771 2886 2796 2796 2912 2772 2772 2887 2772 2772 2887 2796 2796 2912 2797 2797 2913 2772 2772 2887 2797 2797 2913 2773 2773 2888 2773 2773 2888 2797 2797 2913 2798 2798 2914 2773 2773 2888 2798 2798 2914 2774 2774 2889 2774 2774 2889 2798 2798 2914 2799 2799 2915 2774 2774 2889 2799 2799 2915 2775 2775 2890 2775 2775 2890 2799 2799 2915 2800 2800 2916 2775 2775 2890 2800 2800 2916 2776 2776 2891 2776 2776 2891 2800 2800 2916 2801 2801 2917 2776 2776 2891 2801 2801 2917 2777 2777 2892 2777 2777 2892 2801 2801 2917 2802 2802 2918 2777 2777 2892 2802 2802 2918 2778 2778 2893 2778 2778 2893 2802 2802 2918 2803 2803 2919 2778 2778 2893 2803 2803 2919 2779 2779 2894 2779 2779 2894 2803 2803 2919 2804 2804 2920 2779 2779 2894 2804 2804 2920 2780 2780 2895 2780 2780 2895 2804 2804 2920 2805 2805 2921 2780 2780 2895 2805 2805 2921 2781 2781 2896 2781 2781 2896 2805 2805 2921 2806 2806 2922 2781 2781 2896 2806 2806 2922 2782 2782 2897 2782 2782 2897 2806 2806 2922 2807 2807 2923 2782 2782 2897 2807 2807 2923 2783 2783 2898 2783 2783 2898 2807 2807 2923 2784 2784 2924 2783 2783 2898 2784 2784 2924 2760 2760 2899 2784 2784 2900 2808 2808 2925 2809 2809 2926 2784 2784 2900 2809 2809 2926 2785 2785 2901 2785 2785 2901 2809 2809 2926 2810 2810 2927 2785 2785 2901 2810 2810 2927 2786 2786 2902 2786 2786 2902 2810 2810 2927 2811 2811 2928 2786 2786 2902 2811 2811 2928 2787 2787 2903 2787 2787 2903 2811 2811 2928 2812 2812 2929 2787 2787 2903 2812 2812 2929 2788 2788 2904 2788 2788 2904 2812 2812 2929 2813 2813 2930 2788 2788 2904 2813 2813 2930 2789 2789 2905 2789 2789 2905 2813 2813 2930 2814 2814 2931 2789 2789 2905 2814 2814 2931 2790 2790 2906 2790 2790 2906 2814 2814 2931 2815 2815 2932 2790 2790 2906 2815 2815 2932 2791 2791 2907 2791 2791 2907 2815 2815 2932 2816 2816 2933 2791 2791 2907 2816 2816 2933 2792 2792 2908 2792 2792 2908 2816 2816 2933 2817 2817 2934 2792 2792 2908 2817 2817 2934 2793 2793 2909 2793 2793 2909 2817 2817 2934 2818 2818 2935 2793 2793 2909 2818 2818 2935 2794 2794 2910 2794 2794 2910 2818 2818 2935 2819 2819 2936 2794 2794 2910 2819 2819 2936 2795 2795 2911 2795 2795 2911 2819 2819 2936 2820 2820 2937 2795 2795 2911 2820 2820 2937 2796 2796 2912 2796 2796 2912 2820 2820 2937 2821 2821 2938 2796 2796 2912 2821 2821 2938 2797 2797 2913 2797 2797 2913 2821 2821 2938 2822 2822 2939 2797 2797 2913 2822 2822 2939 2798 2798 2914 2798 2798 2914 2822 2822 2939 2823 2823 2940 2798 2798 2914 2823 2823 2940 2799 2799 2915 2799 2799 2915 2823 2823 2940 2824 2824 2941 2799 2799 2915 2824 2824 2941 2800 2800 2916 2800 2800 2916 2824 2824 2941 2825 2825 2942 2800 2800 2916 2825 2825 2942 2801 2801 2917 2801 2801 2917 2825 2825 2942 2826 2826 2943 2801 2801 2917 2826 2826 2943 2802 2802 2918 2802 2802 2918 2826 2826 2943 2827 2827 2944 2802 2802 2918 2827 2827 2944 2803 2803 2919 2803 2803 2919 2827 2827 2944 2828 2828 2945 2803 2803 2919 2828 2828 2945 2804 2804 2920 2804 2804 2920 2828 2828 2945 2829 2829 2946 2804 2804 2920 2829 2829 2946 2805 2805 2921 2805 2805 2921 2829 2829 2946 2830 2830 2947 2805 2805 2921 2830 2830 2947 2806 2806 2922 2806 2806 2922 2830 2830 2947 2831 2831 2948 2806 2806 2922 2831 2831 2948 2807 2807 2923 2807 2807 2923 2831 2831 2948 2808 2808 2949 2807 2807 2923 2808 2808 2949 2784 2784 2924 2808 2808 2925 2832 2832 2950 2833 2833 2951 2808 2808 2925 2833 2833 2951 2809 2809 2926 2809 2809 2926 2833 2833 2951 2834 2834 2952 2809 2809 2926 2834 2834 2952 2810 2810 2927 2810 2810 2927 2834 2834 2952 2835 2835 2953 2810 2810 2927 2835 2835 2953 2811 2811 2928 2811 2811 2928 2835 2835 2953 2836 2836 2954 2811 2811 2928 2836 2836 2954 2812 2812 2929 2812 2812 2929 2836 2836 2954 2837 2837 2955 2812 2812 2929 2837 2837 2955 2813 2813 2930 2813 2813 2930 2837 2837 2955 2838 2838 2956 2813 2813 2930 2838 2838 2956 2814 2814 2931 2814 2814 2931 2838 2838 2956 2839 2839 2957 2814 2814 2931 2839 2839 2957 2815 2815 2932 2815 2815 2932 2839 2839 2957 2840 2840 2958 2815 2815 2932 2840 2840 2958 2816 2816 2933 2816 2816 2933 2840 2840 2958 2841 2841 2959 2816 2816 2933 2841 2841 2959 2817 2817 2934 2817 2817 2934 2841 2841 2959 2842 2842 2960 2817 2817 2934 2842 2842 2960 2818 2818 2935 2818 2818 2935 2842 2842 2960 2843 2843 2961 2818 2818 2935 2843 2843 2961 2819 2819 2936 2819 2819 2936 2843 2843 2961 2844 2844 2962 2819 2819 2936 2844 2844 2962 2820 2820 2937 2820 2820 2937 2844 2844 2962 2845 2845 2963 2820 2820 2937 2845 2845 2963 2821 2821 2938 2821 2821 2938 2845 2845 2963 2846 2846 2964 2821 2821 2938 2846 2846 2964 2822 2822 2939 2822 2822 2939 2846 2846 2964 2847 2847 2965 2822 2822 2939 2847 2847 2965 2823 2823 2940 2823 2823 2940 2847 2847 2965 2848 2848 2966 2823 2823 2940 2848 2848 2966 2824 2824 2941 2824 2824 2941 2848 2848 2966 2849 2849 2967 2824 2824 2941 2849 2849 2967 2825 2825 2942 2825 2825 2942 2849 2849 2967 2850 2850 2968 2825 2825 2942 2850 2850 2968 2826 2826 2943 2826 2826 2943 2850 2850 2968 2851 2851 2969 2826 2826 2943 2851 2851 2969 2827 2827 2944 2827 2827 2944 2851 2851 2969 2852 2852 2970 2827 2827 2944 2852 2852 2970 2828 2828 2945 2828 2828 2945 2852 2852 2970 2853 2853 2971 2828 2828 2945 2853 2853 2971 2829 2829 2946 2829 2829 2946 2853 2853 2971 2854 2854 2972 2829 2829 2946 2854 2854 2972 2830 2830 2947 2830 2830 2947 2854 2854 2972 2855 2855 2973 2830 2830 2947 2855 2855 2973 2831 2831 2948 2831 2831 2948 2855 2855 2973 2832 2832 2974 2831 2831 2948 2832 2832 2974 2808 2808 2949 2832 2832 2950 2856 2856 2975 2857 2857 2976 2832 2832 2950 2857 2857 2976 2833 2833 2951 2833 2833 2951 2857 2857 2976 2858 2858 2977 2833 2833 2951 2858 2858 2977 2834 2834 2952 2834 2834 2952 2858 2858 2977 2859 2859 2978 2834 2834 2952 2859 2859 2978 2835 2835 2953 2835 2835 2953 2859 2859 2978 2860 2860 2979 2835 2835 2953 2860 2860 2979 2836 2836 2954 2836 2836 2954 2860 2860 2979 2861 2861 2980 2836 2836 2954 2861 2861 2980 2837 2837 2955 2837 2837 2955 2861 2861 2980 2862 2862 2981 2837 2837 2955 2862 2862 2981 2838 2838 2956 2838 2838 2956 2862 2862 2981 2863 2863 2982 2838 2838 2956 2863 2863 2982 2839 2839 2957 2839 2839 2957 2863 2863 2982 2864 2864 2983 2839 2839 2957 2864 2864 2983 2840 2840 2958 2840 2840 2958 2864 2864 2983 2865 2865 2984 2840 2840 2958 2865 2865 2984 2841 2841 2959 2841 2841 2959 2865 2865 2984 2866 2866 2985 2841 2841 2959 2866 2866 2985 2842 2842 2960 2842 2842 2960 2866 2866 2985 2867 2867 2986 2842 2842 2960 2867 2867 2986 2843 2843 2961 2843 2843 2961 2867 2867 2986 2868 2868 2987 2843 2843 2961 2868 2868 2987 2844 2844 2962 2844 2844 2962 2868 2868 2987 2869 2869 2988 2844 2844 2962 2869 2869 2988 2845 2845 2963 2845 2845 2963 2869 2869 2988 2870 2870 2989 2845 2845 2963 2870 2870 2989 2846 2846 2964 2846 2846 2964 2870 2870 2989 2871 2871 2990 2846 2846 2964 2871 2871 2990 2847 2847 2965 2847 2847 2965 2871 2871 2990 2872 2872 2991 2847 2847 2965 2872 2872 2991 2848 2848 2966 2848 2848 2966 2872 2872 2991 2873 2873 2992 2848 2848 2966 2873 2873 2992 2849 2849 2967 2849 2849 2967 2873 2873 2992 2874 2874 2993 2849 2849 2967 2874 2874 2993 2850 2850 2968 2850 2850 2968 2874 2874 2993 2875 2875 2994 2850 2850 2968 2875 2875 2994 2851 2851 2969 2851 2851 2969 2875 2875 2994 2876 2876 2995 2851 2851 2969 2876 2876 2995 2852 2852 2970 2852 2852 2970 2876 2876 2995 2877 2877 2996 2852 2852 2970 2877 2877 2996 2853 2853 2971 2853 2853 2971 2877 2877 2996 2878 2878 2997 2853 2853 2971 2878 2878 2997 2854 2854 2972 2854 2854 2972 2878 2878 2997 2879 2879 2998 2854 2854 2972 2879 2879 2998 2855 2855 2973 2855 2855 2973 2879 2879 2998 2856 2856 2999 2855 2855 2973 2856 2856 2999 2832 2832 2974 2856 2856 2975 0 0 3000 1 3 3001 2856 2856 2975 1 3 3001 2857 2857 2976 2857 2857 2976 1 3 3001 2 5 3002 2857 2857 2976 2 5 3002 2858 2858 2977 2858 2858 2977 2 5 3002 3 7 3003 2858 2858 2977 3 7 3003 2859 2859 2978 2859 2859 2978 3 7 3003 4 9 3004 2859 2859 2978 4 9 3004 2860 2860 2979 2860 2860 2979 4 9 3004 5 11 3005 2860 2860 2979 5 11 3005 2861 2861 2980 2861 2861 2980 5 11 3005 6 13 3006 2861 2861 2980 6 13 3006 2862 2862 2981 2862 2862 2981 6 13 3006 7 15 3007 2862 2862 2981 7 15 3007 2863 2863 2982 2863 2863 2982 7 15 3007 8 17 3008 2863 2863 2982 8 17 3008 2864 2864 2983 2864 2864 2983 8 17 3008 9 19 3009 2864 2864 2983 9 19 3009 2865 2865 2984 2865 2865 2984 9 19 3009 10 21 3010 2865 2865 2984 10 21 3010 2866 2866 2985 2866 2866 2985 10 21 3010 11 23 3011 2866 2866 2985 11 23 3011 2867 2867 2986 2867 2867 2986 11 23 3011 12 25 3012 2867 2867 2986 12 25 3012 2868 2868 2987 2868 2868 2987 12 25 3012 13 27 3013 2868 2868 2987 13 27 3013 2869 2869 2988 2869 2869 2988 13 27 3013 14 29 3014 2869 2869 2988 14 29 3014 2870 2870 2989 2870 2870 2989 14 29 3014 15 31 3015 2870 2870 2989 15 31 3015 2871 2871 2990 2871 2871 2990 15 31 3015 16 33 3016 2871 2871 2990 16 33 3016 2872 2872 2991 2872 2872 2991 16 33 3016 17 35 3017 2872 2872 2991 17 35 3017 2873 2873 2992 2873 2873 2992 17 35 3017 18 37 3018 2873 2873 2992 18 37 3018 2874 2874 2993 2874 2874 2993 18 37 3018 19 39 3019 2874 2874 2993 19 39 3019 2875 2875 2994 2875 2875 2994 19 39 3019 20 41 3020 2875 2875 2994 20 41 3020 2876 2876 2995 2876 2876 2995 20 41 3020 21 43 3021 2876 2876 2995 21 43 3021 2877 2877 2996 2877 2877 2996 21 43 3021 22 45 3022 2877 2877 2996 22 45 3022 2878 2878 2997 2878 2878 2997 22 45 3022 23 47 3023 2878 2878 2997 23 47 3023 2879 2879 2998 2879 2879 2998 23 47 3023 0 0 3024 2879 2879 2998 0 0 3024 2856 2856 2999</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-7_max" name="Torus_Knot-7_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-7_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-8.dae b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-8.dae
new file mode 100644
index 0000000..63350d6
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus Knots/TorusKnot-8.dae
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Feeling ColladaMax v3.00 with FCollada v3.00.</authoring_tool>
+ <comments>ColladaMax Export Options: ExportNormals=1;ExportEPolyAsTriangles=1;ExportXRefs=1;ExportSelected=1;ExportTangents=0;ExportAnimations=1;SampleAnim=0;ExportAnimClip=0;BakeMatrices=0;ExportRelativePaths=1;AnimStart=0;AnimEnd=100;</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/Torus%20Knots/Torus%20Knot-8.max</source_data>
+ </contributor>
+ <created>2008-10-31T16:32:56Z</created>
+ <modified>2008-10-31T16:32:58Z</modified>
+ <unit meter="0.025400" name="inch"/>
+ <up_axis>Z_UP</up_axis>
+ </asset>
+ <library_materials>
+ <material id="Torus-Knot" name="Torus-Knot">
+ <instance_effect url="#Torus-Knot-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="Torus-Knot-fx" name="Torus-Knot">
+ <profile_COMMON>
+ <technique sid="common">
+ <blinn>
+ <ambient>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </ambient>
+ <diffuse>
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </diffuse>
+ <specular>
+ <color>0.900000 0.900000 0.900000 1.000000</color>
+ </specular>
+ <shininess>
+ <float>9.999999</float>
+ </shininess>
+ <reflective>
+ <color>0 0 0 1.000000</color>
+ </reflective>
+ <reflectivity>
+ <float>1.000000</float>
+ </reflectivity>
+ <transparent opaque="RGB_ZERO">
+ <color>1.000000 1.000000 1.000000 1.000000</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ <index_of_refraction>
+ <float>0</float>
+ </index_of_refraction>
+ </blinn>
+ <extra>
+ <technique profile="FCOLLADA">
+ <spec_level>
+ <float>0</float>
+ </spec_level>
+ <emission_level>
+ <float>0</float>
+ </emission_level>
+ </technique>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ <extra>
+ <technique profile="MAX3D">
+ <faceted>0</faceted>
+ <double_sided>0</double_sided>
+ <wireframe>0</wireframe>
+ <face_map>0</face_map>
+ </technique>
+ </extra>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus_Knot01-mesh" name="Torus_Knot01">
+ <mesh>
+ <source id="Torus_Knot01-mesh-positions">
+ <float_array id="Torus_Knot01-mesh-positions-array" count="8640">23.481520 -0.000554 21.973024 23.911232 -0.620918 22.454594 24.260260 -1.198967 22.954746 24.504816 -1.695309 23.439394 24.628237 -2.076118 23.875515 24.622110 -2.315444 24.233383 24.486853 -2.396976 24.488613 24.231684 -2.315157 24.623810 23.873991 -2.075565 24.629761 23.438150 -1.694527 24.506062 22.953865 -1.198009 24.261139 22.454140 -0.619849 23.911688 21.973026 0.000553 23.481520 21.543312 0.620917 22.999950 21.194284 1.198966 22.499802 20.949728 1.695308 22.015150 20.826307 2.076118 21.579029 20.832434 2.315444 21.221161 20.967691 2.396976 20.965931 21.222860 2.315157 20.830734 21.580553 2.075565 20.824783 22.016392 1.694527 20.948483 22.500677 1.198010 21.193405 23.000404 0.619850 21.542856 23.728848 3.216572 23.471214 24.420227 3.106905 22.828674 25.105663 2.959797 22.277262 25.738445 2.785273 21.854548 26.275448 2.595227 21.589344 26.680077 2.402610 21.499722 26.924755 2.220549 21.591789 26.992811 2.061450 21.859272 26.879606 1.936157 22.283939 26.592855 1.853207 22.836855 26.152098 1.818254 23.480335 25.587374 1.833679 24.170532 24.937166 1.898432 24.860403 24.245785 2.008099 25.502943 23.560349 2.155207 26.054358 22.927568 2.329731 26.477070 22.390564 2.519777 26.742275 21.985937 2.712394 26.831898 21.741257 2.894455 26.739830 21.673201 3.053554 26.472349 21.786406 3.178847 26.047680 22.073156 3.261797 25.494764 22.513912 3.296750 24.851284 23.078638 3.281325 24.161091 24.930962 5.730289 26.055313 24.324734 6.192425 25.248751 23.823368 6.607200 24.435263 23.461033 6.946347 23.670290 23.262421 7.186754 23.005962 23.241064 7.312038 22.487553 23.398420 7.313661 22.150389 23.723764 7.191512 22.017450 24.194927 6.953915 22.097794 24.779797 6.617063 22.385946 25.438519 6.203911 22.862268 26.126198 5.742616 23.494303 26.795975 5.264612 24.238974 27.402201 4.802476 25.045536 27.903566 4.387701 25.859024 28.265902 4.048553 26.623995 28.464516 3.808146 27.288326 28.485872 3.682862 27.806736 28.328516 3.681239 28.143900 28.003172 3.803388 28.276838 27.532011 4.040984 28.196497 26.947140 4.377836 27.908344 26.288420 4.790988 27.432020 25.600739 5.252284 26.799988 28.251091 8.492013 26.723707 27.260960 8.841068 27.585613 26.269068 9.190681 28.306446 25.343014 9.517024 28.837082 24.545904 9.797858 29.141357 23.932064 10.014047 29.198536 23.543322 10.150854 29.004725 23.406172 10.198958 28.573128 23.529959 10.155081 27.933161 23.906250 10.022213 27.128433 24.509398 9.809408 26.213789 25.298302 9.531171 25.251558 26.219198 9.206459 24.307316 27.209330 8.857404 23.445410 28.201221 8.507792 22.724577 29.127275 8.181448 22.193941 29.924385 7.900613 21.889664 30.538227 7.684424 21.832483 30.926970 7.547617 22.026295 31.064119 7.499513 22.457893 30.940332 7.543390 23.097858 30.564043 7.676258 23.902586 29.960894 7.889062 24.817230 29.171989 8.167301 25.779461 29.733931 12.005190 23.813366 30.814947 12.043784 25.087704 31.726757 12.121253 26.362215 32.407219 12.232318 27.550041 32.809959 12.369407 28.570240 32.907539 12.523181 29.353279 32.693298 12.683159 29.845800 32.181847 12.838438 30.014235 31.408033 12.978437 29.847111 30.424593 13.093616 29.355812 29.298548 13.176126 28.573822 28.106632 13.220341 27.554430 26.930077 13.223251 26.367109 25.849058 13.184657 25.092772 24.937250 13.107188 23.818260 24.256788 12.996123 22.630434 23.854044 12.859035 21.610237 23.756468 12.705260 20.827196 23.970705 12.545283 20.334675 24.482157 12.390003 20.166239 25.255970 12.250004 20.333364 26.239410 12.134825 20.824659 27.365456 12.052316 21.606649 28.557371 12.008101 22.626041 27.312010 16.167116 22.074787 28.792330 15.482954 20.884924 30.287140 14.884866 19.885704 31.694569 14.413612 19.145227 32.918705 14.101308 18.713951 33.876122 13.969234 18.621271 34.501579 14.026394 18.873499 34.752445 14.268890 19.453449 34.611629 14.680199 20.321596 34.088726 15.232288 21.418776 33.219372 15.887533 22.670223 32.062813 16.601286 23.990650 30.697861 17.324898 25.290071 29.217541 18.009060 26.479937 27.722733 18.607149 27.479155 26.315302 19.078402 28.219633 25.091166 19.390707 28.650909 24.133747 19.522781 28.743589 23.508291 19.465622 28.491362 23.257423 19.223125 27.911415 23.398237 18.811819 27.043268 23.921139 18.259729 25.946085 24.790493 17.604483 24.694639 25.947054 16.890732 23.374212 27.084385 22.197252 22.807348 25.488012 21.116167 21.436108 24.136482 20.035917 20.043896 23.121895 19.030117 18.725592 22.513395 18.167315 17.571037 22.352451 17.506304 16.658913 22.650030 17.092134 16.051374 23.385853 16.953030 15.789829 24.509773 17.098471 15.892099 25.945200 17.518547 16.351215 27.594309 18.184629 17.135887 29.344717 19.051323 18.192646 31.077139 20.059570 19.449471 32.673512 21.140656 20.820711 34.025040 22.220905 22.212923 35.039627 23.226706 23.531225 35.648129 24.089510 24.685781 35.809074 24.750521 25.597908 35.511497 25.164690 26.205446 34.775673 25.303793 26.466991 33.651756 25.158354 26.364723 32.216328 24.738277 25.905607 30.567219 24.072197 25.120935 28.816811 23.205502 24.064177 30.552507 27.480211 18.684938 28.572622 28.481934 20.186312 26.580029 29.284462 21.493797 24.710514 29.833103 22.518290 23.091488 30.090471 23.189972 21.833282 30.039024 23.463070 21.021639 29.682270 23.318975 20.711874 29.044518 22.767506 20.925095 28.169235 21.846241 21.646772 27.116064 20.617966 22.827724 25.956783 19.166386 24.387470 24.770390 17.590424 26.219719 23.637737 15.997476 28.199602 22.636015 14.496101 30.192196 21.833487 13.188617 32.061710 21.284843 12.164124 33.680737 21.027475 11.492440 34.938946 21.078922 11.219339 35.750587 21.435677 11.363436 36.060356 22.073425 11.914906 35.847134 22.948709 12.836167 35.125458 24.001881 14.064443 33.944508 25.161163 15.516024 32.384762 26.347555 17.091986 29.285734 28.321554 10.399840 31.053587 30.481014 11.284438 32.530739 32.590717 12.243093 33.616524 34.506901 13.210474 34.236946 36.098965 14.120655 34.349724 37.258430 14.911610 33.947178 37.906269 15.529435 33.056732 37.998333 15.932027 31.739077 37.528355 16.091949 30.084002 36.528358 15.998305 28.204302 35.066486 15.657475 26.228073 33.242374 15.092687 24.289995 31.180326 14.342429 22.522141 29.020866 13.457830 21.044989 26.911161 12.499175 19.959204 24.994982 11.531795 19.338781 23.402910 10.621614 19.226000 22.243448 9.830659 19.628548 21.595610 9.212833 20.518991 21.503544 8.810242 21.836647 21.973522 8.650318 23.491720 22.973520 8.743962 25.371422 24.435387 9.084791 27.347649 26.259499 9.649580 22.134180 30.395597 5.942560 24.424715 29.217262 4.240820 26.702822 28.321707 2.689762 28.813250 27.769958 1.395087 30.612177 27.599621 0.445026 31.977011 27.822300 -0.095677 32.814735 28.422819 -0.190171 33.068268 29.360256 0.167979 32.720329 30.570726 0.954369 31.794626 31.971739 2.115406 30.354248 33.467819 3.571968 28.497353 34.957001 5.224793 26.350485 36.337814 6.961244 24.059950 37.516148 8.662984 21.781845 38.411705 10.214043 19.671415 38.963455 11.508717 17.872486 39.133793 12.458779 16.507652 38.911118 12.999483 15.669926 38.310596 13.093979 15.416392 37.373158 12.735828 15.764332 36.162689 11.949440 16.690033 34.761677 10.788403 18.130411 33.265598 9.331841 19.987305 31.776411 7.679016 18.135527 37.641972 2.076852 16.659166 34.869030 2.008728 15.467270 32.178913 1.803711 14.641061 29.754946 1.475775 14.236846 27.762323 1.047266 14.282170 26.336834 0.547389 14.773945 25.575624 0.010207 15.678657 25.530571 -0.527670 16.934650 26.204741 -1.029587 18.456333 27.552195 -1.461340 20.140005 29.481102 -1.793505 21.870926 31.860012 -2.003446 23.531136 34.526810 -2.076856 25.007494 37.299751 -2.008731 26.199392 39.989868 -1.803715 27.025600 42.413834 -1.475779 27.429817 44.406456 -1.047271 27.384495 45.831951 -0.547393 26.892721 46.593159 -0.010212 25.988008 46.638214 0.527665 24.732016 45.964043 1.029583 23.210333 44.616592 1.461336 21.526661 42.687683 1.793501 19.795742 40.308777 2.003442 18.290018 40.990070 -6.967422 16.021027 42.158855 -5.230596 13.803434 43.022263 -3.576999 11.788366 43.521461 -2.119323 10.113146 43.622417 -0.956906 8.891936 43.318268 -0.168964 8.207963 42.629726 0.190806 8.107835 41.603725 0.097886 8.598376 40.310181 -0.441391 9.646158 38.837242 -1.390274 11.179776 37.285297 -2.684100 13.094715 35.760098 -4.234695 15.260477 34.365593 -5.936390 17.529469 33.196804 -7.673216 19.747061 32.333397 -9.326812 21.762129 31.834202 -10.784489 23.437351 31.733238 -11.946907 24.658560 32.037392 -12.734850 25.342535 32.725929 -13.094621 25.442663 33.751934 -13.001701 24.952124 35.045479 -12.462425 23.904343 36.518414 -11.513541 22.370726 38.070362 -10.219717 20.455788 39.595562 -8.669122 14.857618 36.625889 -14.342834 15.670384 39.335171 -15.098009 16.258312 41.958534 -15.667353 16.581335 44.317207 -16.012064 16.617439 46.250443 -16.108654 16.364166 47.626495 -15.950536 15.838773 48.351597 -15.548490 15.077066 48.376320 -14.929911 14.130956 47.698997 -14.136957 13.064916 46.365768 -13.223665 11.951595 44.467506 -12.252275 10.866866 42.133560 -11.288985 9.884651 39.522995 -10.399443 9.071884 36.813713 -9.644267 8.483956 34.190350 -9.074924 8.160933 31.831680 -8.730211 8.124828 29.898441 -8.633622 8.378101 28.522385 -8.791739 8.903494 27.797285 -9.193786 9.665200 27.772556 -9.812364 10.611311 28.449883 -10.605317 11.677350 29.783108 -11.518608 12.790670 31.681372 -12.489999 13.875400 34.015316 -13.453288 7.366381 34.527290 -15.992057 9.262596 33.506626 -17.585835 11.068791 32.748737 -19.162941 12.661879 32.305275 -20.615898 13.933290 32.206463 -21.845692 14.796382 32.459023 -22.768513 15.192336 33.045761 -23.321470 15.094169 33.926682 -23.466883 14.508571 35.041748 -23.194841 13.475449 36.314980 -22.523886 12.065207 37.659603 -21.499739 10.373954 38.983986 -20.192194 8.516944 40.197872 -18.690361 6.620729 41.218536 -17.096584 4.814534 41.976425 -15.519478 3.221447 42.419888 -14.066519 1.950034 42.518707 -12.836725 1.086940 42.266140 -11.913903 0.690986 41.679409 -11.360947 0.789153 40.798485 -11.215532 1.374750 39.683418 -11.487572 2.407872 38.410187 -12.158527 3.818112 37.065567 -13.182674 5.509365 35.741184 -14.490219 1.834263 36.943676 -19.448839 1.831934 34.941479 -18.188425 1.960820 32.994305 -17.128366 2.212137 31.234848 -16.340904 2.568758 29.783016 -15.879703 3.006381 28.737749 -15.776193 3.495181 28.170279 -16.037426 4.001848 28.119280 -16.645603 4.491853 28.588224 -17.559273 4.931804 29.545155 -18.716175 5.291718 30.924862 -20.037468 5.547069 32.633316 -21.433105 5.680453 34.554092 -22.807980 5.682782 36.556290 -24.068394 5.553896 38.503464 -25.128450 5.302579 40.262920 -25.915915 4.945958 41.714756 -26.377117 4.508336 42.760021 -26.480629 4.019536 43.327492 -26.219395 3.512869 43.378490 -25.611219 3.022863 42.909550 -24.697548 2.582912 41.952618 -23.540648 2.222998 40.572914 -22.219355 1.967648 38.864460 -20.823717 -0.350386 35.244049 -25.292780 -1.658573 36.064835 -23.992716 -2.853732 36.710285 -22.671507 -3.854414 37.136417 -21.419193 -4.592423 37.314190 -20.321114 -5.017467 37.231483 -19.452103 -5.100579 36.893944 -18.871380 -4.836095 36.324562 -18.618523 -4.242040 35.562153 -18.710762 -3.358896 34.658661 -19.141815 -2.246850 33.675671 -19.882299 -0.981684 32.680161 -20.881758 0.350381 31.739977 -22.072077 1.658568 30.919191 -23.372139 2.853727 30.273739 -24.693346 3.854409 29.847609 -25.945662 4.592419 29.669836 -27.043741 5.017464 29.752541 -27.912754 5.100576 30.090082 -28.493477 4.836093 30.659460 -28.746332 4.242038 31.421871 -28.654093 3.358895 32.325356 -28.223043 2.246849 33.308353 -27.482557 0.981684 34.303864 -26.483099 -2.014434 29.933153 -26.367704 -2.608909 30.947565 -27.555809 -3.246513 31.954874 -28.575890 -3.883793 32.886433 -29.358425 -4.477321 33.678761 -29.850094 -4.986647 34.277859 -30.017385 -5.377062 34.642902 -29.848900 -5.621962 34.749012 -29.356119 -5.704654 34.588955 -28.572626 -5.619505 34.173641 -27.551815 -5.372317 33.531372 -26.363249 -4.979936 32.705917 -25.087931 -4.469101 31.753532 -23.812771 -3.874626 30.739122 -22.624666 -3.237023 29.731812 -21.604586 -2.599742 28.800249 -20.822046 -2.006215 28.007923 -20.330379 -1.496888 27.408823 -20.163088 -1.106472 27.043781 -20.331573 -0.861573 26.937672 -20.824352 -0.778881 27.097729 -21.607845 -0.864029 27.513044 -22.628658 -1.111217 28.155312 -23.817223 -1.503598 28.980764 -25.092541 -5.133429 27.312683 -24.307734 -4.392810 26.676865 -25.252350 -3.758578 26.131962 -26.214901 -3.273954 25.715107 -27.129791 -2.971964 25.454712 -27.934671 -2.873190 25.368519 -28.574688 -2.984362 25.462402 -29.006226 -3.297903 25.729965 -29.199881 -3.792447 26.152973 -29.142450 -4.434291 26.702597 -28.837851 -5.179695 27.341385 -28.306839 -5.977860 28.025801 -27.585602 -6.774394 28.709204 -26.723293 -7.515012 29.345022 -25.778677 -8.149245 29.889927 -24.816124 -8.633869 30.306780 -23.901236 -8.935859 30.567177 -23.096355 -9.034634 30.653370 -22.456337 -8.923462 30.559486 -22.024799 -8.609921 30.291924 -21.831144 -8.115377 29.868917 -21.888577 -7.473534 29.319292 -22.193172 -6.728130 28.680504 -22.724186 -5.929965 27.996088 -23.445421 -8.837599 25.838964 -24.238672 -8.086984 25.499699 -23.494967 -7.342080 25.136408 -22.863855 -6.653653 24.773848 -22.388346 -6.068617 24.436728 -22.100842 -5.626842 24.148022 -22.020941 -5.358433 23.927402 -22.154085 -5.281682 23.789907 -22.491201 -5.401822 23.744907 -23.009315 -5.710661 23.795465 -23.673119 -6.187156 23.938139 -24.437376 -6.798833 24.163206 -25.250002 -7.504008 24.455324 -26.055618 -8.254623 24.794590 -26.799324 -8.999527 25.157881 -27.430437 -9.687954 25.520441 -27.905949 -10.272990 25.857561 -28.193451 -10.714766 26.146267 -28.273352 -10.983175 26.366886 -28.140207 -11.059925 26.504381 -27.803091 -10.939787 26.549381 -27.284977 -10.630947 26.498823 -26.621176 -10.154452 26.356150 -25.856918 -9.542776 26.131084 -25.044292 -10.825844 22.544140 -24.859064 -11.206099 23.075428 -24.169117 -11.500864 23.557398 -23.478945 -11.690053 23.957205 -22.835577 -11.760772 24.247604 -22.282866 -11.708201 24.408804 -21.858475 -11.535925 24.429817 -21.591324 -11.255682 24.309216 -21.499619 -10.886571 24.055216 -21.589611 -10.453746 23.685127 -21.855167 -9.986704 23.224171 -22.278189 -9.517273 22.703762 -22.829849 -9.077443 22.159365 -23.472553 -8.697188 21.628075 -24.162500 -8.402422 21.146105 -24.852674 -8.213234 20.746298 -25.496038 -8.142514 20.455898 -26.048752 -8.195085 20.294699 -26.473145 -8.367361 20.273685 -26.740295 -8.647604 20.394287 -26.832001 -9.016714 20.648287 -26.742008 -9.449539 21.018375 -26.476454 -9.916581 21.479332 -26.053432 -10.386013 21.999739 -25.501770 -10.987025 19.028900 -23.481520 -11.765591 19.134697 -23.910538 -12.516763 19.277821 -24.258919 -13.189351 19.448513 -24.502920 -13.737520 19.635147 -24.625914 -14.123913 19.824999 -24.619518 -14.322198 20.005133 -24.484171 -14.318862 20.163271 -24.229092 -14.114132 20.288639 -23.871668 -13.721960 20.372694 -23.436255 -13.169073 20.409704 -22.952524 -12.493149 20.397150 -22.453445 -11.740250 20.335888 -21.973026 -10.961685 20.230091 -21.544006 -10.210513 20.086967 -21.195627 -9.537924 19.916275 -20.951626 -8.989755 19.729641 -20.828630 -8.603361 19.539789 -20.835026 -8.405076 19.359655 -20.970373 -8.408412 19.201517 -21.225452 -8.613142 19.076149 -21.582876 -9.005313 18.992094 -22.018290 -9.558200 18.955084 -22.502018 -10.234124 18.967636 -23.001099 -11.437623 17.109011 -20.500303 -11.213020 16.486412 -21.182076 -11.074210 15.910136 -21.848530 -11.030651 15.419454 -22.454243 -11.085312 15.047804 -22.957941 -11.234468 14.820515 -23.325296 -11.467955 14.753074 -23.531273 -11.769859 14.850079 -23.561836 -12.119608 15.104920 -23.414902 -12.493367 15.500227 -23.100485 -12.865664 16.009064 -22.640009 -13.211127 16.596752 -22.064857 -13.506215 17.223242 -21.414225 -13.730818 17.845840 -20.732452 -13.869628 18.422115 -20.066002 -13.913187 18.912798 -19.460287 -13.858526 19.284447 -18.956587 -13.709370 19.511738 -18.589233 -13.475883 19.579178 -18.383255 -13.173979 19.482174 -18.352692 -12.824230 19.227333 -18.499626 -12.450472 18.832026 -18.814043 -12.078176 18.323191 -19.274519 -11.732712 17.735500 -19.849670 -13.599134 15.733473 -18.044600 -12.535991 15.667376 -17.733183 -11.527266 15.542814 -17.504879 -10.641702 15.368279 -17.375248 -9.939649 15.155662 -17.353123 -9.468949 14.919454 -17.440010 -9.261683 14.675752 -17.629990 -9.331972 14.441163 -17.910114 -9.675029 14.231675 -18.261295 -10.267473 14.061563 -18.659599 -11.068932 13.942422 -19.077883 -12.024785 13.882370 -19.487640 -13.069895 13.885498 -19.860947 -14.133039 13.951595 -20.172365 -15.141764 14.076156 -20.400667 -16.027328 14.250692 -20.530300 -16.729382 14.463309 -20.552427 -17.200081 14.699516 -20.465538 -17.407349 14.943219 -20.275558 -17.337059 15.177808 -19.995434 -16.994003 15.387296 -19.644255 -16.401560 15.557406 -19.245951 -15.600101 15.676548 -18.827667 -14.644247 15.736601 -18.417908 -15.575462 12.647869 -17.156702 -15.707871 13.642347 -16.240971 -15.723927 14.566209 -15.362394 -15.622535 15.356494 -14.580846 -15.410604 15.959347 -13.949588 -15.102579 16.333683 -13.511637 -14.719450 16.453991 -13.296841 -14.287327 16.312077 -13.319839 -13.835658 15.917606 -13.579060 -13.395225 15.297465 -14.056839 -12.996039 14.493913 -14.720621 -12.665309 13.561712 -15.525164 -12.425570 12.564389 -16.415644 -12.293160 11.569912 -17.331373 -12.277105 10.646050 -18.209949 -12.378497 9.855765 -18.991499 -12.590427 9.252912 -19.622757 -12.898452 8.878575 -20.060709 -13.281581 8.758265 -20.275505 -13.713704 8.900181 -20.252508 -14.165373 9.294650 -19.993288 -14.605807 9.914791 -19.515509 -15.004992 10.718343 -18.851727 -15.335723 11.650544 -18.047184 -14.336586 9.023499 -15.786871 -15.989115 9.119175 -16.019285 -17.540846 9.311823 -16.148849 -18.886032 9.588318 -16.166729 -19.933001 9.929815 -16.071709 -20.610403 10.313043 -15.870265 -20.872074 10.711884 -15.576123 -20.700184 11.099160 -15.209329 -20.106445 11.448478 -14.794880 -19.131319 11.736031 -14.361019 -17.841259 11.942224 -13.937315 -16.324183 12.053005 -13.552640 -14.683475 12.060825 -13.233210 -13.030946 11.965149 -13.000795 -11.479215 11.772501 -12.871231 -10.134028 11.496007 -12.853351 -9.087058 11.154510 -12.948371 -8.409655 10.771281 -13.149816 -8.147983 10.372439 -13.443957 -8.319873 9.985164 -13.810751 -8.913612 9.635847 -14.225201 -9.888738 9.348293 -14.659060 -11.178796 9.142100 -15.082766 -12.695872 9.031319 -15.467441 -12.506908 8.533122 -11.881763 -12.486478 6.951463 -13.136010 -12.630181 5.482122 -14.323858 -12.928227 4.225235 -15.364361 -13.360303 3.266455 -16.186605 -13.896963 2.671122 -16.734562 -14.501636 2.479806 -16.970882 -15.133113 2.705545 -16.879469 -15.748362 3.332957 -16.466545 -16.305452 4.319283 -15.760256 -16.766422 5.597307 -14.808730 -17.099854 7.079933 -13.676814 -17.283028 8.666124 -12.441647 -17.303459 10.247784 -11.187400 -17.159756 11.717124 -9.999552 -16.861710 12.974011 -8.959051 -16.429634 13.932793 -8.136804 -15.892974 14.528127 -7.588847 -15.288301 14.719443 -7.352525 -14.656824 14.493704 -7.443938 -14.041575 13.866294 -7.856861 -13.484484 12.879969 -8.563151 -13.023515 11.601945 -9.514676 -12.690083 10.119318 -10.646592 -15.252464 9.022119 -8.088330 -12.894420 8.880838 -7.957536 -10.692142 8.594934 -7.950058 -8.795714 8.183889 -8.066408 -7.334374 7.675717 -8.298656 -6.407709 7.105047 -8.630975 -6.078869 6.510770 -9.040718 -6.370265 5.933385 -9.499961 -7.262038 5.412240 -9.977408 -8.693418 4.982850 -10.440521 -10.566854 4.674477 -10.857741 -12.754678 4.508137 -11.200635 -15.107792 4.495164 -11.445834 -17.465836 4.636443 -11.576630 -19.668114 4.922347 -11.584106 -21.564541 5.333392 -11.467756 -23.025885 5.841565 -11.235509 -23.952551 6.412235 -10.903190 -24.281391 7.006511 -10.493447 -23.989996 7.583897 -10.034204 -23.098223 8.105042 -9.556757 -21.666845 8.534432 -9.093643 -19.793409 8.842805 -8.676423 -17.605585 9.009146 -8.333530 -18.571192 5.074413 -7.510144 -18.491465 7.256051 -5.957210 -18.199986 9.283852 -4.498767 -17.716619 11.019623 -3.234204 -17.074306 12.345077 -2.249700 -16.316820 13.169883 -1.612347 -15.495780 13.437834 -1.365580 -14.667139 13.130670 -1.526215 -13.887368 12.269322 -2.083305 -13.209607 10.912492 -2.998886 -12.680045 9.152643 -4.210562 -12.334770 7.109708 -5.635759 -12.197312 4.922908 -7.177353 -12.277039 2.741271 -8.730288 -12.568517 0.713470 -10.188731 -13.051882 -1.022302 -11.453294 -13.694195 -2.347756 -12.437799 -14.451682 -3.172564 -13.075152 -15.272722 -3.440516 -13.321920 -16.101362 -3.133352 -13.161285 -16.881134 -2.272007 -12.604197 -17.558895 -0.915176 -11.688616 -18.088457 0.844672 -10.476940 -18.433733 2.887607 -9.051743 -15.509897 0.421244 -6.874786 -18.433615 0.570780 -6.899141 -21.158838 0.906246 -6.787489 -23.499849 1.404780 -6.547441 -25.297110 2.032409 -6.195353 -26.428143 2.746360 -5.755222 -26.815866 3.497979 -5.257041 -26.433863 4.236044 -4.734759 -25.308159 4.910257 -4.223971 -23.515474 5.474672 -3.759485 -21.177977 5.890826 -3.372955 -18.454962 6.130357 -3.090723 -15.531998 6.176941 -2.932021 -12.608281 6.027406 -2.907666 -9.883058 5.691940 -3.019318 -7.542046 5.193406 -3.259366 -5.744783 4.565777 -3.611454 -4.613750 3.851826 -4.051585 -4.226024 3.100208 -4.549766 -4.608028 2.362143 -5.072047 -5.733729 1.687929 -5.582836 -7.526413 1.123514 -6.047322 -9.863911 0.707361 -6.433852 -12.586926 0.467829 -6.716084 -11.921492 1.605284 -2.400137 -12.045636 -0.954746 -4.121118 -12.411965 -3.337976 -5.728470 -12.995515 -5.381994 -7.112656 -13.756516 -6.947504 -8.179346 -14.643107 -7.927818 -8.855845 -15.594871 -8.256128 -9.096053 -16.546944 -7.910065 -8.883598 -17.434444 -6.913208 -8.232962 -18.196892 -5.333493 -7.188480 -18.782326 -3.278574 -5.821336 -19.150850 -0.888492 -4.224696 -19.277349 1.673874 -2.507370 -19.153206 4.233903 -0.786389 -18.786877 6.617133 0.820963 -18.203327 8.661151 2.205149 -17.442327 10.226664 3.271840 -16.555735 11.206978 3.948340 -15.603972 11.535290 4.188549 -14.651899 11.189227 3.976095 -13.764399 10.192370 3.325458 -13.001951 8.612658 2.280979 -12.416516 6.557739 0.913834 -12.047992 4.167657 -0.682805 -15.624938 3.115395 2.076496 -12.485321 3.009386 2.005430 -9.559667 2.698292 1.797695 -7.047355 2.203317 1.467448 -5.119596 1.558190 1.037195 -3.907764 0.806876 0.536257 -3.494441 0.000576 -0.001228 -3.907795 -0.805761 -0.538631 -5.119657 -1.557187 -1.039330 -7.047441 -2.202492 -1.469202 -9.559771 -2.697699 -1.798952 -12.485435 -3.009061 -2.006109 -15.625057 -3.115360 -2.076555 -18.764673 -3.009351 -2.005490 -21.690329 -2.698259 -1.797755 -24.202639 -2.203284 -1.467509 -26.130402 -1.558157 -1.037255 -27.342236 -0.806843 -0.536317 -27.755560 -0.000543 0.001168 -27.342207 0.805795 0.538571 -26.130344 1.557220 1.039270 -24.202562 2.202525 1.469142 -21.690233 2.697733 1.798893 -18.764568 3.009096 2.006050 -19.277338 -1.674195 2.508151 -19.150690 0.888047 4.225658 -18.782026 3.278037 5.822410 -18.196476 5.332902 7.189589 -17.433939 6.912606 8.234025 -16.546383 7.909495 8.884542 -15.594294 8.255631 9.096807 -14.642553 7.927431 8.856358 -13.756022 6.947255 8.179576 -12.995117 5.381904 7.112586 -12.411690 3.338052 5.728101 -12.045501 0.954986 4.120471 -11.921506 -1.604894 2.399253 -12.048155 -4.167135 0.681746 -12.416818 -6.557125 -0.915005 -13.002368 -8.611990 -2.282185 -13.764905 -10.191696 -3.326623 -14.652461 -11.188585 -3.977140 -15.604550 -11.534724 -4.189407 -16.556290 -11.206524 -3.948957 -17.442822 -10.226350 -3.272177 -18.203728 -8.660998 -2.205187 -18.787155 -6.617148 -0.820702 -19.153343 -4.234082 0.786928 -15.532315 -6.176611 2.931539 -18.455248 -6.130225 3.090974 -21.178211 -5.890899 3.373921 -23.515642 -5.474943 3.761096 -25.308249 -4.910705 4.226115 -26.433865 -4.236635 4.737286 -26.815786 -3.498672 5.259775 -26.427982 -2.747104 5.757976 -25.296883 -2.033152 6.197935 -23.499569 -1.405469 6.549671 -21.158525 -0.906831 6.789214 -18.433292 -0.571218 6.900239 -15.509585 -0.421504 6.875180 -12.586655 -0.467890 6.715745 -9.863690 -0.707216 6.432798 -7.526258 -1.123171 6.045624 -5.733651 -1.687410 5.580605 -4.608033 -2.361479 5.069434 -4.226110 -3.099443 4.546944 -4.613914 -3.851010 4.048744 -5.745013 -4.564963 3.608785 -7.542325 -5.192646 3.257048 -9.883368 -5.691284 3.017505 -12.608602 -6.026896 2.906480 -12.197367 -4.922738 7.176266 -12.335273 -7.109185 5.634198 -12.680963 -9.151800 4.208631 -13.210877 -10.911383 2.996713 -13.888904 -12.268021 2.081035 -14.668837 -13.129261 1.523999 -15.497523 -13.436413 1.363566 -16.318491 -13.168543 1.610669 -17.075792 -12.343906 2.248467 -17.717819 -11.018702 3.233498 -18.200815 -9.283238 4.498631 -18.491869 -7.255785 5.957652 -18.571144 -5.074511 7.511129 -18.433239 -2.888065 9.053196 -18.087549 -0.845450 10.478764 -17.557634 0.914133 11.690681 -16.879608 2.270773 12.606361 -16.099676 3.132015 13.163398 -15.270989 3.439167 13.323832 -14.450021 3.171298 13.076729 -13.692719 2.346663 12.438931 -13.050694 1.021458 11.453901 -12.567696 -0.714005 10.188767 -12.276642 -2.741457 8.729747 -15.107035 -4.495643 11.446455 -12.754019 -4.508581 11.200237 -10.566338 -4.674856 10.856349 -8.693081 -4.983134 10.438224 -7.261905 -5.412407 9.974360 -6.370344 -5.933421 9.496365 -6.079154 -6.510670 9.036815 -6.408183 -7.104815 8.627028 -7.335004 -7.675366 8.294929 -8.796457 -8.183442 8.063151 -10.692948 -8.594417 7.947490 -12.895233 -8.880284 7.955827 -15.253230 -9.021563 8.087594 -17.606245 -9.008624 8.333812 -19.793926 -8.842350 8.677700 -21.667183 -8.534073 9.095824 -23.098362 -8.104799 9.559690 -23.989923 -7.583785 10.037685 -24.281113 -7.006536 10.497235 -23.952085 -6.412391 10.907022 -23.025265 -5.841839 11.239120 -21.563812 -5.333764 11.470899 -19.667322 -4.922789 11.586559 -17.465038 -4.636922 11.578222 -17.282909 -8.665888 12.442792 -17.098896 -7.080209 13.678506 -16.764688 -5.598073 14.810849 -16.303064 -4.320486 15.762653 -15.745481 -3.334510 16.469057 -15.129937 -2.707343 16.881916 -14.498381 -2.481720 16.973099 -13.893852 -2.673020 16.736389 -13.357548 -3.268206 16.187920 -12.926017 -4.226716 15.365067 -12.628668 -5.483231 14.323906 -12.485763 -6.952118 13.135391 -12.507042 -8.533279 11.880519 -12.691055 -10.118958 10.644805 -13.025262 -11.601094 9.512462 -13.486886 -12.878681 8.560657 -14.044470 -13.864658 7.854253 -14.660013 -14.491826 7.441392 -15.291570 -14.717449 7.350210 -15.896099 -14.526150 7.586918 -16.432404 -13.930964 8.135388 -16.863934 -12.972455 8.958241 -17.161283 -11.715940 9.999401 -17.304188 -10.247053 11.187916 -14.684666 -12.060126 13.232532 -16.325130 -12.052265 13.553246 -17.841902 -11.941489 13.939160 -19.131609 -11.735349 14.363976 -20.106365 -11.447891 14.798742 -20.699741 -11.098707 15.213832 -20.871300 -10.711594 15.580955 -20.609348 -10.312929 15.875094 -19.931740 -9.929884 16.076204 -18.884649 -9.588562 16.170578 -17.539438 -9.312223 16.151787 -15.987779 -9.119700 16.021111 -14.335413 -9.024114 15.787454 -12.694948 -9.031975 15.466741 -11.178179 -9.142751 15.080826 -9.888470 -9.348891 14.656010 -8.913713 -9.636348 14.221243 -8.320336 -9.985532 13.806155 -8.148777 -10.372646 13.439031 -8.410728 -10.771311 13.144892 -9.088336 -11.154355 12.943782 -10.135425 -11.495677 12.849407 -11.480637 -11.772016 12.868198 -13.032295 -11.964540 12.998875 -12.425905 -12.564364 16.414190 -12.666594 -13.561178 15.523387 -12.998187 -14.492904 14.718637 -13.398088 -15.296045 14.054784 -13.839045 -15.915871 13.577065 -14.291006 -16.310139 13.318041 -14.723171 -16.451982 13.295359 -15.106091 -16.331736 13.510568 -15.413667 -15.957590 13.949000 -15.624941 -15.355045 14.580778 -15.725513 -14.565165 15.362846 -15.708531 -13.641775 16.241909 -15.575151 -12.647805 17.158060 -15.334464 -11.650991 18.048862 -15.002871 -10.719266 18.853613 -14.602970 -9.916124 19.517466 -14.162013 -9.296297 19.995184 -13.710052 -8.902029 20.254210 -13.277885 -8.760185 20.276892 -12.894967 -8.880432 20.061684 -12.587390 -9.254578 19.623251 -12.376117 -9.857121 18.991472 -12.275543 -10.647002 18.209404 -12.292525 -11.570392 17.330341 -13.068886 -13.885989 19.861156 -12.024165 -13.882722 19.486752 -11.068744 -13.942610 19.075953 -10.267732 -14.061570 18.656754 -9.675717 -14.231496 18.257729 -9.333044 -14.440807 17.906063 -9.263066 -14.675241 17.625729 -9.470552 -14.918819 17.435827 -9.941361 -15.154943 17.349298 -10.643410 -15.367522 17.372040 -11.528852 -15.542068 17.502504 -12.537350 -15.666686 17.731800 -13.600174 -15.732884 18.044298 -14.644895 -15.736152 18.418705 -15.600316 -15.676264 18.829504 -16.401329 -15.557304 19.248701 -16.993343 -15.387378 19.647728 -17.336018 -15.178066 19.999393 -17.405996 -14.943634 20.279728 -17.198509 -14.700055 20.469629 -16.727701 -14.463931 20.556158 -16.025654 -14.251352 20.533417 -15.140210 -14.076806 20.402952 -14.131713 -13.952188 20.173656 -13.505591 -17.223528 21.415606 -13.209571 -16.597542 22.066305 -12.863281 -16.010303 22.641420 -12.490324 -15.501825 23.101761 -12.116113 -15.106766 23.415955 -11.766150 -14.852041 23.562590 -11.464288 -14.755018 23.531673 -11.231093 -14.822301 23.325314 -11.082462 -15.049312 22.957573 -11.028521 -15.420573 22.453508 -11.072946 -15.910789 21.847479 -11.212710 -16.486549 21.180777 -11.438289 -17.108620 20.498842 -11.734309 -17.734606 19.848143 -12.080598 -18.321846 19.273029 -12.453556 -18.830324 18.812689 -12.827767 -19.225384 18.498493 -13.177729 -19.480108 18.351858 -13.479592 -19.577131 18.382774 -13.712786 -19.509848 18.589134 -13.861418 -19.282839 18.956875 -13.915359 -18.911577 19.460939 -13.870934 -18.421360 20.066969 -13.731171 -17.845600 20.733671 -11.741349 -20.335234 21.973009 -12.493428 -20.397160 22.454628 -13.168515 -20.410374 22.954823 -13.720604 -20.373972 23.439510 -14.112072 -20.290438 23.875654 -14.316240 -20.165462 24.233540 -14.319196 -20.007563 24.488771 -14.120736 -19.827499 24.623957 -13.734387 -19.637545 24.629885 -13.186477 -19.450642 24.506149 -12.514345 -19.279528 24.261185 -11.763797 -19.135866 23.911686 -10.985979 -19.029444 23.481468 -10.233901 -18.967518 22.999849 -9.558814 -18.954304 22.499655 -9.006724 -18.990705 22.014969 -8.615255 -19.074240 21.578821 -8.411087 -19.199215 21.220938 -8.408132 -19.357115 20.965706 -8.606590 -19.537178 20.830519 -8.992940 -19.727133 20.824591 -9.540850 -19.914036 20.948326 -10.212981 -20.085150 21.193289 -10.963530 -20.228811 21.542789 -9.078838 -22.158037 23.471167 -9.519522 -22.701963 22.828651 -9.989655 -23.222019 22.277260 -10.457201 -23.682766 21.854567 -10.890296 -24.052799 21.589378 -11.259425 -24.306904 21.499767 -11.539434 -24.427767 21.591843 -11.711240 -24.407146 21.859327 -11.763135 -24.246452 22.283993 -11.691582 -23.956631 22.836899 -11.501457 -23.557436 23.480364 -11.205717 -23.076073 24.170542 -10.824517 -22.545343 24.860394 -10.383834 -22.001417 25.502909 -9.913700 -21.481361 26.054302 -9.446155 -21.020615 26.476994 -9.013060 -20.650583 26.742184 -8.643929 -20.396477 26.831793 -8.363921 -20.275614 26.739719 -8.192115 -20.296234 26.472235 -8.140220 -20.456928 26.047569 -8.211773 -20.746750 25.494663 -8.401897 -21.145945 24.851198 -8.697637 -21.627306 24.161022 -7.502876 -24.455938 26.055246 -6.799579 -24.162037 25.248642 -6.189732 -23.935265 24.435122 -5.714894 -23.791075 23.670122 -5.407427 -23.739296 23.005779 -5.288281 -23.783455 22.487364 -5.365579 -23.920540 22.150209 -5.634050 -24.141212 22.017288 -6.075400 -24.430433 22.097662 -6.659552 -24.768494 22.385851 -7.346696 -25.132351 22.862217 -8.090005 -25.497213 23.494295 -8.838822 -25.838213 24.239012 -9.542120 -26.132114 25.045614 -10.151967 -26.358887 25.859135 -10.626804 -26.503077 26.624134 -10.934273 -26.554855 27.288477 -11.053418 -26.510696 27.806892 -10.976121 -26.373611 28.144049 -10.707650 -26.152939 28.276970 -10.266300 -25.863718 28.196596 -9.682149 -25.525660 27.908409 -8.995005 -25.161800 27.432043 -8.251697 -24.796938 26.799965 -6.771347 -28.712049 26.723698 -5.974069 -28.029020 27.585604 -5.175422 -27.344749 28.306437 -4.429832 -26.705877 28.837072 -3.788110 -26.155939 29.141348 -3.293988 -25.732410 29.198528 -2.981139 -25.464153 29.004721 -2.870883 -25.369453 28.573126 -2.970736 -25.454762 27.933161 -3.273890 -25.714264 27.128439 -3.759688 -26.130278 26.213797 -4.395022 -26.674448 25.251568 -5.136596 -27.309698 24.307325 -5.933873 -27.992727 23.445419 -6.732520 -28.676994 22.724586 -7.478109 -29.315868 22.193951 -8.119833 -29.865808 21.889673 -8.613955 -30.289337 21.832491 -8.926805 -30.557594 22.026300 -9.037060 -30.652294 22.457895 -8.937208 -30.566986 23.097858 -8.634054 -30.307484 23.902582 -8.148257 -29.891472 24.817223 -7.512923 -29.347300 25.779453 -4.470136 -31.752975 23.813379 -4.977387 -32.708275 25.087780 -5.366364 -33.536476 26.362350 -5.610557 -34.181137 27.550228 -5.693327 -34.598331 28.570465 -5.609033 -34.759624 29.353531 -5.363418 -34.654022 29.846060 -4.973222 -34.288723 30.014490 -4.465035 -33.688625 29.847342 -3.873490 -32.894619 29.356005 -3.238899 -31.960819 28.573965 -2.604509 -30.950859 27.554516 -2.013552 -29.933567 26.367130 -1.506301 -28.978270 25.092730 -1.117325 -28.150070 23.818159 -0.873131 -27.505407 22.630281 -0.790360 -27.088213 21.610043 -0.874655 -26.926918 20.826979 -1.120269 -27.032520 20.334448 -1.510465 -27.397818 20.166018 -2.018651 -27.997915 20.333166 -2.610196 -28.791922 20.824501 -3.244787 -29.725721 21.606541 -3.879178 -30.735682 22.625990 0.344754 -31.736311 22.074875 -0.987996 -32.676243 20.885139 -2.253423 -33.671761 19.886036 -3.365289 -34.655025 19.145655 -4.247822 -35.559029 18.714453 -4.840880 -36.322163 18.621811 -5.104046 -36.892422 18.874048 -5.019388 -37.230942 19.453972 -4.592672 -37.314659 20.322060 -3.852980 -37.137863 21.419157 -2.850720 -36.712608 22.670494 -1.654196 -36.067863 23.990799 -0.344947 -35.247578 25.290091 0.987803 -34.307648 26.479826 2.253229 -33.312130 27.478931 3.365095 -32.328861 28.219311 4.247630 -31.424860 28.650517 4.840689 -30.661728 28.743156 5.103856 -30.091463 28.490921 5.019197 -29.752943 27.910999 4.592482 -29.669226 27.042910 3.852791 -29.846020 25.945812 2.850531 -30.271280 24.694475 1.654007 -30.916021 23.374170 5.681190 -34.554291 22.807264 5.542845 -32.631210 21.436125 5.282815 -30.920589 20.044018 4.918818 -29.539007 18.725819 4.475664 -28.580614 17.571358 3.983550 -28.110725 16.659313 3.476013 -28.161358 16.051836 2.987643 -28.729065 15.790325 2.551719 -29.775158 15.892603 2.197951 -31.228348 16.351698 1.950445 -32.989597 17.136326 1.826071 -34.938889 18.193014 1.833302 -36.943375 19.449753 1.971647 -38.866455 20.820892 2.231678 -40.577072 22.212999 2.595673 -41.958656 23.531197 3.038828 -42.917049 24.685658 3.530942 -43.386944 25.597706 4.038478 -43.336308 26.205181 4.526849 -42.768600 26.466694 4.962772 -41.722507 26.364418 5.316541 -40.269321 25.905323 5.564047 -38.508072 25.120695 5.688422 -36.558781 24.064007 8.522251 -40.199242 18.685175 10.379498 -38.985321 20.186674 12.070601 -37.660812 21.494267 13.480317 -36.315975 22.518847 14.512572 -35.042461 23.190584 15.097023 -33.927055 23.463709 15.193839 -33.045776 23.319603 14.796423 -32.458679 22.768089 13.931857 -32.205769 21.846748 12.659061 -32.304287 20.618372 11.064774 -32.747513 19.166672 9.257643 -33.505249 17.590578 7.360821 -34.525856 15.997499 5.503574 -35.739773 14.495999 3.812470 -37.064285 13.188406 2.402755 -38.409122 12.163826 1.370498 -39.682632 11.492085 0.786046 -40.798042 11.218962 0.689230 -41.679321 11.363068 1.086645 -42.266418 11.914581 1.951210 -42.519329 12.835920 3.224006 -42.420815 14.064297 4.818293 -41.977585 15.515995 6.625424 -41.219849 17.092089 9.884361 -39.523117 10.399902 10.870627 -42.133781 11.284644 11.959141 -44.467804 12.243439 13.075722 -46.366135 13.210948 14.144278 -47.699394 14.121235 15.091987 -48.376732 14.912267 15.854265 -48.351982 15.530135 16.379166 -47.626835 15.932734 16.630915 -46.250710 16.092627 16.592360 -44.317387 15.998917 16.266125 -41.958614 15.657990 15.674444 -39.335136 15.093081 14.857639 -36.625751 14.342688 13.871373 -34.015091 13.457946 12.782860 -31.681063 12.499151 11.666279 -29.782736 11.531643 10.597722 -28.449471 10.621355 9.650013 -27.772135 9.830323 8.887734 -27.796883 9.212454 8.362834 -28.522024 8.809855 8.111083 -29.898151 8.649961 8.149639 -31.831476 8.743670 8.475873 -34.190247 9.084597 9.067554 -36.813725 9.649506 15.256005 -34.366673 5.942664 13.090227 -35.761322 4.241115 11.175568 -37.286587 2.690240 9.642508 -38.838509 1.395730 8.595524 -40.311340 0.445805 8.105965 -41.604706 -0.094801 8.207194 -42.630459 -0.189247 8.892313 -43.318699 0.168905 10.114632 -43.622528 0.955246 11.790851 -43.521236 2.116189 13.806739 -43.021732 3.572618 16.024916 -42.158051 5.225278 18.294220 -40.989052 6.961545 20.459997 -39.594398 8.663095 22.374657 -38.069138 10.213969 23.907717 -36.517212 11.508478 24.954704 -35.044380 12.458406 25.444263 -33.751019 12.999013 25.343035 -32.725266 13.093458 24.657917 -32.037022 12.735308 23.435598 -31.733191 11.948967 21.759380 -31.834480 10.788025 19.743492 -32.333988 9.331597 17.525314 -33.197666 7.678936 23.531090 -34.526615 2.076783 21.867737 -31.861643 2.008534 20.133883 -29.484446 1.803422 18.447685 -27.557030 1.475425 16.924059 -26.210747 1.046895 15.666834 -25.537338 0.547037 14.761689 -25.582699 0.009914 14.270308 -26.343739 -0.527869 14.226178 -27.768589 -1.029663 14.632306 -29.760155 -1.461273 15.461016 -32.182709 -1.793283 16.655830 -34.871166 -2.003070 18.135326 -37.642303 -2.076335 19.798679 -40.307278 -2.008085 21.532534 -42.684471 -1.802974 23.218731 -44.611889 -1.474977 24.742359 -45.958176 -1.046447 25.999584 -46.631584 -0.546589 26.904730 -46.586224 -0.009466 27.396111 -45.825184 0.528317 27.440243 -44.400333 1.030111 27.034115 -42.408772 1.461721 26.205406 -39.986217 1.793732 25.010592 -37.297760 2.003518 26.353510 -36.334652 -6.967181 28.500034 -34.953987 -5.230181 30.356396 -33.465160 -3.576424 31.796087 -31.969631 -2.118613 32.720997 -30.569317 -0.956094 33.068089 -29.359652 -0.168092 32.813717 -28.423065 0.191694 31.975212 -27.823389 0.098743 30.609716 -27.601486 -0.440608 28.810289 -27.772482 -1.389605 26.699556 -28.324722 -2.683575 24.421360 -29.220573 -4.234337 22.130955 -30.398983 -5.936207 19.984432 -31.779646 -7.673207 18.128071 -33.268471 -9.326963 16.688379 -34.764000 -10.784775 15.763468 -36.164314 -11.947296 15.416373 -37.373985 -12.735298 15.670745 -38.310570 -13.095085 16.509249 -38.910248 -13.002135 17.874743 -39.132149 -12.462784 19.674171 -38.961151 -11.513787 21.784904 -38.408916 -10.219818 24.063101 -37.513065 -8.669057 24.290253 -31.180157 -14.342901 26.230309 -33.238575 -15.098034 28.208355 -35.059326 -15.667321 30.089594 -36.518330 -16.011965 31.745819 -37.516155 -16.108480 33.064163 -37.984802 -15.950291 33.954784 -37.892338 -15.548174 34.356987 -37.245056 -14.929535 34.243359 -36.087074 -14.136534 33.621647 -34.497307 -13.223209 32.534222 -32.584087 -12.251806 31.055185 -30.477804 -11.288523 29.285334 -28.321997 -10.399004 27.345280 -26.263578 -9.643871 25.367233 -24.442827 -9.074584 23.485994 -22.983824 -8.729939 21.829767 -21.985996 -8.633422 20.511423 -21.517347 -8.791612 19.620802 -21.609814 -9.193728 19.218599 -22.257093 -9.812367 19.332224 -23.415073 -10.605370 19.953934 -25.004845 -11.518692 21.041361 -26.918060 -12.490095 22.520395 -29.024343 -13.453380 26.218246 -23.642973 -15.992347 24.386190 -24.775368 -17.585716 22.826721 -25.961178 -19.162409 21.646112 -27.119585 -20.614979 20.924822 -28.171654 -21.844437 20.712002 -29.045681 -22.766991 21.022158 -29.682106 -23.319778 21.834152 -30.037560 -23.465122 23.092649 -30.087812 -23.193119 24.711885 -29.829445 -22.522308 26.581511 -29.280064 -21.498400 28.574114 -28.477106 -20.191174 30.553904 -27.475292 -18.689716 32.385960 -26.342897 -17.096348 33.945427 -25.157089 -15.519653 35.126038 -23.998680 -14.067085 35.847328 -22.946611 -12.837627 36.060150 -22.072584 -11.915071 35.749996 -21.436157 -11.362283 34.938000 -21.080706 -11.216938 33.679504 -21.030449 -11.488940 32.060268 -21.288816 -12.159751 30.190643 -21.838198 -13.183659 28.198042 -22.641157 -14.490885 31.076899 -20.060558 -19.448521 29.343992 -19.057571 -18.188141 27.593145 -18.195719 -17.128126 25.943676 -17.533735 -16.340717 24.507994 -17.116737 -15.879572 23.383938 -16.973137 -15.776118 22.648111 -17.112722 -16.037407 22.350658 -17.525982 -16.645628 22.511848 -18.184753 -17.559338 23.120699 -19.044138 -18.716263 24.135719 -20.045578 -20.037565 25.487732 -21.120819 -21.433197 27.084606 -22.196592 -22.808050 28.817513 -23.199579 -24.068430 30.568359 -24.061432 -25.128445 32.217827 -24.723415 -25.915855 33.653511 -25.140417 -26.376999 34.777565 -25.284016 -26.480455 35.513393 -25.144430 -26.219168 35.810848 -24.731171 -25.610945 35.649658 -24.072401 -24.697239 35.040810 -23.213015 -23.540312 34.025791 -22.211575 -22.219011 32.673775 -21.136333 -20.823378 30.697586 -17.318489 -25.292679 32.062405 -16.596134 -23.992399 33.218868 -15.884006 -22.670990 34.088158 -15.230633 -21.418503 34.611031 -14.680541 -20.320295 34.751865 -14.271218 -19.451204 34.501053 -14.030561 -18.870461 33.875690 -13.974966 -18.617640 32.918396 -14.108225 -18.709969 31.694408 -14.421254 -19.141161 30.287136 -14.892723 -19.881826 28.792488 -15.490500 -20.881491 27.312317 -16.173851 -22.072031 25.947495 -16.896204 -23.372311 24.791035 -17.608332 -24.693720 23.921745 -18.261705 -25.946205 23.398867 -18.811798 -27.044416 23.258036 -19.221121 -27.913507 23.508846 -19.461779 -28.494249 24.134207 -19.517374 -28.747072 25.091499 -19.384115 -28.654741 26.315489 -19.071087 -28.223553 27.722759 -18.599617 -27.482887 29.217409 -18.001841 -26.483223 26.930197 -13.222168 -26.367786 28.106003 -13.214410 -27.555849 29.297215 -13.165759 -28.575880 30.422649 -13.079534 -29.358370 31.405611 -12.961609 -29.849991 32.179115 -12.820020 -30.017239 32.690449 -12.664416 -29.848721 32.904762 -12.505404 -29.355915 32.807453 -12.353817 -28.572409 32.405151 -12.219987 -27.551598 31.725275 -12.113033 -26.363047 30.814154 -12.040246 -25.087755 29.733881 -12.006584 -23.812626 28.558077 -12.014342 -22.624565 27.366867 -12.062993 -21.604534 26.241432 -12.149218 -20.822044 25.258467 -12.267143 -20.330421 24.484962 -12.408732 -20.163174 23.973629 -12.564336 -20.331692 23.759315 -12.723348 -20.824495 23.856625 -12.874935 -21.608000 24.258924 -13.008765 -22.628811 24.938801 -13.115719 -23.817364 25.849922 -13.188506 -25.092657 26.220192 -9.211029 -24.307831 25.299295 -9.534406 -25.252548 24.510326 -9.811100 -26.215185 23.907053 -10.022255 -27.130144 23.530588 -10.153481 -27.935066 23.406586 -10.195833 -28.575102 23.543497 -10.146427 -29.006632 23.931992 -10.008630 -29.200249 24.545595 -9.791832 -29.142754 25.342489 -9.510807 -28.838072 26.268368 -9.184708 -28.306963 27.260136 -8.835756 -27.585623 28.250204 -8.487733 -26.723207 29.171101 -8.164355 -25.778490 29.960070 -7.887661 -24.815853 30.563343 -7.676507 -23.900896 30.939808 -7.545281 -23.095970 31.063812 -7.502928 -22.455935 30.926901 -7.552334 -22.024406 30.538406 -7.690131 -21.830790 29.924805 -7.906929 -21.888281 29.127911 -8.187953 -22.192963 28.202030 -8.514052 -22.724072 27.210264 -8.863004 -23.445412 26.796013 -5.265838 -24.238682 26.126801 -5.746016 -23.494890 25.439648 -6.209263 -22.863699 24.781380 -6.624011 -22.388121 24.196859 -6.961994 -22.100571 23.725920 -7.200181 -22.020638 23.400656 -7.322337 -22.153774 23.243231 -7.320140 -22.490906 23.264376 -7.193738 -23.009056 23.462648 -6.951746 -23.672918 23.824537 -6.610654 -24.437246 24.325380 -6.193709 -25.249954 24.931044 -5.729324 -26.055658 25.600256 -5.249146 -26.799450 26.287411 -4.785898 -27.430641 26.945677 -4.371150 -27.906219 27.530199 -4.033167 -28.193773 28.001139 -3.794981 -28.273705 28.326403 -3.672824 -28.140568 28.483828 -3.675021 -27.803438 28.462683 -3.801423 -27.285286 28.264410 -4.043416 -26.621426 27.902523 -4.384506 -25.857098 27.401680 -4.801451 -25.044390 24.936852 -1.896706 -24.859047 25.587053 -1.833102 -24.169058 26.151800 -1.818874 -23.478848 26.592604 -1.854989 -22.835459 26.879423 -1.938987 -22.282732 26.992714 -2.065145 -21.858339 26.924755 -2.224863 -21.591200 26.680176 -2.407258 -21.499519 26.275648 -2.599900 -21.589546 25.738735 -2.789661 -21.855146 25.106030 -2.963609 -22.278215 24.420649 -3.109889 -22.829926 23.729300 -3.218532 -23.472677 23.079096 -3.282136 -24.162668 22.514351 -3.296365 -24.852879 22.073547 -3.260250 -25.496267 21.786726 -3.176251 -26.048992 21.673435 -3.050094 -26.473387 21.741394 -2.890376 -26.740526 21.985971 -2.707981 -26.832207 22.390501 -2.515338 -26.742180 22.927412 -2.325578 -26.476580 23.560118 -2.151630 -26.053511 24.245499 -2.005350 -25.501801 21.973133 0.000552 -23.481628 22.454115 0.621868 -23.910622 22.953714 1.200797 -24.258978 23.437889 1.697887 -24.502956 23.873642 2.079262 -24.625929 24.231274 2.318931 -24.619516 24.486418 2.400562 -24.484156 24.621681 2.318592 -24.229071 24.627851 2.078606 -23.871643 24.504503 1.696960 -23.436235 24.260046 1.199661 -22.952518 23.911137 0.620601 -22.453457 23.481552 -0.000760 -21.973059 23.000572 -0.622075 -21.544064 22.500971 -1.201005 -21.195709 22.016796 -1.698095 -20.951729 21.581045 -2.079470 -20.828756 21.223412 -2.319140 -20.835169 20.968267 -2.400771 -20.970530 20.833004 -2.318801 -21.225615 20.826834 -2.078816 -21.583040 20.950182 -1.697169 -22.018446 21.194639 -1.199871 -22.502165 21.543549 -0.620811 -23.001228 20.535673 1.350677 -20.500458 19.884226 1.467519 -21.182253 19.315788 1.635494 -21.848719 18.869102 1.843156 -22.454441 18.574608 2.076352 -22.958139 18.452372 2.319190 -23.325485 18.510727 2.555122 -23.531448 18.745697 2.768069 -23.561989 19.141266 2.943519 -23.415028 19.670481 3.069515 -23.100584 20.297272 3.137472 -22.640079 20.978926 3.142757 -22.064899 21.668991 3.085011 -21.414242 22.320440 2.968169 -20.732449 22.888876 2.800195 -20.065981 23.335562 2.592533 -19.460260 23.630058 2.359337 -18.956562 23.752295 2.116499 -18.589214 23.693939 1.880567 -18.383251 23.458969 1.667620 -18.352711 23.063400 1.492170 -18.499670 22.534187 1.366173 -18.814116 21.907396 1.298217 -19.274620 21.225740 1.292931 -19.849800 20.425173 3.910400 -18.044655 19.836369 3.022731 -17.733276 19.224144 2.211420 -17.505013 18.630224 1.531758 -17.375418 18.095079 1.030062 -17.353325 17.655184 0.740521 -17.440237 17.340513 0.682868 -17.630234 17.172510 0.861031 -17.910364 17.162626 1.262869 -18.261539 17.311535 1.860997 -18.659830 17.609087 2.614654 -19.078089 18.035006 3.472479 -19.487816 18.560266 4.376013 -19.861084 19.149071 5.263682 -20.172462 19.761293 6.074992 -20.400724 20.355215 6.754654 -20.530321 20.890358 7.256351 -20.552414 21.330256 7.545893 -20.465502 21.644926 7.603546 -20.275507 21.812929 7.425383 -19.995375 21.822813 7.023546 -19.644199 21.673904 6.425418 -19.245911 21.376352 5.671761 -18.827650 20.950434 4.813936 -18.417925 18.741241 7.164705 -17.156725 19.668631 6.782069 -16.240980 20.476686 6.333984 -15.362396 21.110340 5.850986 -14.580848 21.526413 5.365990 -13.949593 21.696547 4.912047 -13.511657 21.609150 4.520094 -13.296877 21.270176 4.216841 -13.319895 20.702726 4.022954 -13.579142 19.945473 3.951647 -14.056947 19.050020 4.007778 -14.720753 18.077391 4.187523 -15.525320 17.093870 4.478632 -16.415817 16.166481 4.861267 -17.331562 15.358425 5.309352 -18.210146 14.724770 5.792350 -18.991695 14.308697 6.277347 -19.622948 14.138562 6.731289 -20.060886 14.225960 7.123242 -20.275667 14.564933 7.426496 -20.252649 15.132382 7.620383 -19.993402 15.889636 7.691691 -19.515598 16.785089 7.635560 -18.851791 17.757717 7.455815 -18.047226 14.983026 7.903972 -15.787067 15.892182 9.287216 -16.019537 16.834913 10.534687 -16.149145 17.746975 11.561373 -16.167057 18.566212 12.297307 -16.072054 19.236792 12.692335 -15.870608 19.713017 12.719539 -15.576447 19.962435 12.377063 -15.209621 19.968046 11.688247 -14.795126 19.729471 10.700032 -14.361209 19.262964 9.479764 -13.937443 18.600321 8.110602 -13.552703 17.786697 6.685852 -13.233212 16.877541 5.302608 -13.000741 15.934810 4.055137 -12.871134 15.022748 3.028450 -12.853221 14.203512 2.292516 -12.948225 13.532931 1.897487 -13.149672 13.056705 1.870283 -13.443831 12.807287 2.212758 -13.810658 12.801675 2.901574 -14.225152 13.040251 3.889788 -14.659068 13.506756 5.110056 -15.082836 14.169399 6.479218 -15.467575 13.643391 6.564704 -11.882022 12.263506 7.337905 -13.136300 11.062957 8.197086 -14.324167 10.123557 9.083694 -15.364675 9.509327 9.937309 -16.186909 9.262125 10.699759 -16.734842 9.398796 11.319081 -16.971128 9.910028 11.753075 -16.879667 10.760980 11.972159 -16.466694 11.893661 11.961408 -15.760346 13.230882 11.721550 -14.808765 14.681512 11.268935 -13.676799 16.146694 10.634405 -12.441588 17.526579 9.861204 -11.187310 18.727129 9.002024 -9.999443 19.666529 8.115416 -8.958937 20.280758 7.261801 -8.136700 20.527962 6.499351 -7.588768 20.391291 5.880027 -7.352480 19.880060 5.446034 -7.443940 19.029108 5.226949 -7.856915 17.896427 5.237701 -8.563261 16.559208 5.477557 -9.514841 15.108577 5.930173 -10.646808 15.439593 8.697544 -8.088600 14.138034 6.726185 -7.957990 12.789128 4.962053 -7.950674 11.484803 3.525371 -8.067150 10.313944 2.514046 -8.299480 9.356345 1.996999 -8.631834 8.677263 2.009465 -9.041559 8.322979 2.550595 -9.500735 8.317634 3.583511 -9.978069 8.661593 5.037822 -10.441032 9.331417 6.814418 -10.858074 10.281457 8.792230 -11.200774 11.446971 10.836471 -11.445777 12.748529 12.807829 -11.576387 14.097435 14.571961 -11.583704 15.401761 16.008644 -11.467229 16.572620 17.019970 -11.234897 17.530220 17.537018 -10.902544 18.209303 17.524553 -10.492819 18.563587 16.983423 -10.033644 18.568933 15.950509 -9.556309 18.224974 14.496198 -9.093346 17.555151 12.719603 -8.676304 16.605110 10.741791 -8.333604 13.680422 13.545734 -7.510282 15.529783 12.385780 -5.957283 17.140038 11.119379 -4.498776 18.401447 9.832832 -3.234157 19.228052 8.613818 -2.249607 19.563517 7.545409 -1.612223 19.384983 6.700415 -1.365438 18.704617 6.136420 -1.526074 17.568783 5.891863 -2.083182 16.054890 5.983406 -2.998796 14.266102 6.404812 -4.210519 12.324326 7.127365 -5.635773 10.361888 8.101821 -7.177431 8.512527 9.261774 -8.730431 6.902273 10.528174 -10.188937 5.640862 11.814720 -11.453556 4.814256 13.033737 -12.438107 4.478790 14.102146 -13.075493 4.657323 14.947141 -13.322277 5.337688 15.511135 -13.161642 6.473521 15.755693 -12.604534 7.987415 15.664150 -11.688921 9.776202 15.242744 -10.477199 11.717978 14.520193 -9.051945 8.119987 13.221437 -6.874990 9.711393 15.678643 -6.899128 11.364558 17.870979 -6.787269 12.966822 19.649038 -6.547034 14.408992 20.891649 -6.194796 15.592787 21.514130 -5.754559 16.437534 21.474062 -5.256324 16.885664 20.774174 -4.734047 16.906637 19.462158 -4.223318 16.499027 17.627434 -3.758943 15.690610 15.395030 -3.372569 14.536478 12.917083 -3.090526 13.115283 10.362458 -2.932034 11.523877 7.905252 -2.907897 9.870712 5.712917 -3.019756 8.268450 3.934857 -3.259990 6.826278 2.692244 -3.612229 5.642483 2.069762 -4.052465 4.797735 2.109830 -4.550700 4.349604 2.809717 -5.072978 4.328629 4.121730 -5.583706 4.736239 5.956454 -6.048081 5.544656 8.188857 -6.434456 6.698788 10.666805 -6.716499 7.350757 9.521795 -2.400465 5.195669 10.909763 -4.120945 3.314812 12.419028 -5.727817 1.836363 13.946737 -7.111574 0.861075 15.388779 -8.177917 0.455414 16.646877 -8.854176 0.647023 17.635302 -9.094263 1.422845 18.286688 -8.881819 2.730009 18.556648 -8.231322 4.479434 18.426781 -7.187099 6.551899 17.905941 -5.820316 8.806170 17.029619 -4.224115 11.088622 15.857538 -2.507275 13.243710 14.469571 -0.786795 15.124567 12.960306 0.820077 16.603018 11.432598 2.203835 17.578306 9.990557 3.270179 17.983969 8.732455 3.946437 17.792360 7.744031 4.186526 17.016539 7.092644 3.974083 15.709376 6.822684 3.323586 13.959951 6.952549 2.279365 11.887486 7.473390 0.912582 9.633215 8.349710 -0.683619 10.510156 11.973782 2.076831 8.848370 9.307906 2.005674 7.115994 6.929869 1.797824 5.431091 5.001729 1.467446 3.908483 3.654886 1.037055 2.651932 2.981125 0.535981 1.747070 3.026361 -0.001630 1.255562 3.787511 -0.539138 1.210904 5.212705 -1.039914 1.616140 7.204819 -1.469832 2.443651 9.628090 -1.799592 3.637047 12.317381 -2.006723 5.114997 15.089417 -2.077108 6.776783 17.755293 -2.005952 8.509157 20.133331 -1.798102 10.194060 22.061470 -1.467724 11.716670 23.408314 -1.037333 12.973223 24.082079 -0.536259 13.878084 24.036842 0.001351 14.369593 23.275694 0.538860 14.414251 21.850502 1.039636 14.009017 19.858389 1.469554 13.181506 17.435118 1.799315 11.988111 14.745828 2.006446 8.189048 17.531612 2.508175 10.344537 16.140633 4.225738 12.229842 14.626211 5.822532 13.716483 13.091549 7.189739 14.703147 11.641233 8.234185 15.122593 10.374100 8.884693 14.946239 9.376503 9.096932 14.186103 8.716427 8.856440 12.893987 8.438854 8.179603 11.157946 8.562700 7.112548 9.096287 9.079526 5.727993 6.849510 9.954110 4.120293 4.570730 11.126853 2.399011 2.415240 12.517832 0.681448 0.529935 14.032254 -0.915346 -0.956706 15.566916 -2.282554 -1.943371 17.017233 -3.327001 -2.362818 18.284367 -3.977510 -2.186466 19.281963 -4.189750 -1.426331 19.942039 -3.949257 -0.134215 20.219614 -3.272421 1.601826 20.095768 -2.205367 3.663485 19.578943 -0.820812 5.910261 18.704359 0.786887 2.417314 16.539875 2.931334 3.919164 19.047894 3.090835 5.488093 21.286261 3.373850 7.017182 23.102432 3.761091 8.402224 24.372639 4.226169 9.548832 25.010319 4.737388 10.378867 24.972017 5.259911 10.835764 24.260344 5.758127 10.888384 22.923796 6.198085 10.533143 21.053457 6.549803 9.794249 18.776791 6.789311 8.722057 16.248945 6.900287 7.389635 13.642191 6.875168 5.887785 11.134171 6.715667 4.318857 8.895806 6.432652 2.789768 7.079634 6.045411 1.404724 5.809425 5.580334 0.258116 5.171743 5.069114 -0.571920 5.210043 4.546591 -1.028816 5.921718 4.048375 -1.081437 7.258264 3.608416 -0.726197 9.128601 3.256699 0.012697 11.405268 3.017190 1.084888 13.933113 2.906214 1.835359 13.024656 7.175997 0.010926 14.237488 5.633892 -1.585050 15.558331 4.208301 -2.843807 16.897175 2.996374 -3.679562 18.162773 2.080704 -4.035360 19.268883 1.523692 -3.886956 20.140125 1.363295 -3.244460 20.717123 1.610446 -2.151659 20.960554 2.248303 -0.683026 20.853832 3.233396 1.061356 20.404228 4.498590 2.962608 19.642384 5.957669 4.891165 18.620216 7.511196 6.715598 17.407385 9.053300 8.311574 16.086542 10.478891 9.570332 14.747700 11.690819 10.406089 13.482100 12.606489 10.761888 12.375988 13.163503 10.613483 11.504747 13.323900 9.970988 10.927750 13.076749 8.878188 10.684317 12.438892 7.409554 10.791039 11.453800 5.665174 11.240642 10.188606 3.763921 12.002485 8.729528 3.660395 15.330776 11.446149 2.472632 13.299482 11.199958 1.234739 11.488048 10.856106 0.031074 10.019916 10.438028 -1.056332 8.995140 9.974216 -1.953376 8.483557 9.496277 -2.598926 8.520028 9.036781 -2.948989 9.102068 8.627043 -2.979707 10.190015 8.294985 -2.688989 11.709723 8.063237 -2.096646 13.557630 7.947592 -1.243045 15.607802 7.955931 -0.186357 17.720524 8.087686 1.001405 19.751818 8.333877 2.239299 21.563253 8.677727 3.442963 23.031385 9.095804 4.530371 24.056162 9.559618 5.427415 24.567745 10.037557 6.072966 24.531277 10.497053 6.423029 23.949236 10.906791 6.453748 22.861290 11.238849 6.163030 21.341583 11.470597 5.570687 19.493677 11.586243 4.717086 17.443504 11.577904 1.136807 19.300280 12.442785 2.417952 18.347939 13.678507 3.534325 17.317314 14.810850 4.409847 16.278641 15.762648 4.984852 15.302698 16.469036 5.220156 14.456001 16.881878 5.099722 13.796247 16.973036 4.631758 13.368397 16.736300 3.848155 13.201610 16.187801 2.802314 13.307251 15.364921 1.565507 13.678122 14.323736 0.222022 14.288947 13.135201 -1.136587 15.098100 11.880314 -2.417732 16.050440 10.644592 -3.534105 17.081064 9.512248 -4.409627 18.119740 8.560451 -4.984634 19.095680 7.854061 -5.219938 19.942379 7.441220 -5.099504 20.602133 7.350061 -4.631541 21.029984 7.586797 -3.847938 21.196770 8.135294 -2.802098 21.091129 8.958176 -1.565291 20.720259 9.999360 -0.221806 20.109436 11.187894 -3.101822 18.747505 13.232396 -2.274654 20.164179 13.553206 -1.420226 21.422270 13.939213 -0.596766 22.436033 14.364111 0.139610 23.136389 14.798944 0.738718 23.475605 15.214077 1.159730 23.430565 15.581222 1.373955 23.004343 15.875357 1.366794 22.225979 16.076437 1.138735 21.148521 16.170761 0.705320 19.845396 16.151899 0.096084 18.405407 16.021137 -0.647453 16.926689 15.787386 -1.474620 15.510014 15.466576 -2.329048 14.251925 15.080569 -3.152508 13.238159 14.655671 -3.888885 12.537804 14.220839 -4.487993 12.198586 13.805704 -4.909006 12.243624 13.438560 -5.123231 12.669847 13.144424 -5.116070 13.448210 12.943344 -4.888011 14.525667 12.849020 -4.454596 15.828794 12.867883 -3.845361 17.268782 12.998644 -4.668010 17.043236 16.414282 -5.411161 17.750015 15.523597 -6.052476 18.502987 14.718944 -6.548251 19.250839 14.055158 -6.864698 19.942602 13.577477 -6.980253 20.531136 13.318453 -6.887041 20.976334 13.295736 -6.591413 21.247854 13.510879 -6.113518 21.327196 13.949215 -5.485922 21.208950 14.580877 -4.751395 20.901175 15.362815 -3.959993 20.424847 16.241741 -3.165650 19.812426 17.157761 -2.422499 19.105644 18.048447 -1.781184 18.352673 18.853100 -1.285409 17.604822 19.516886 -0.968962 16.913059 19.994568 -0.853406 16.324524 20.253592 -0.946618 15.879328 20.276308 -1.242245 15.607804 20.061165 -1.720140 15.528463 19.622829 -2.347736 15.646708 18.991167 -3.082263 15.954484 18.209230 -3.873665 16.430811 17.330303 -5.491202 18.260838 19.861084 -6.010725 17.354500 19.486515 -6.540283 16.557081 19.075563 -7.043788 15.922922 18.656237 -7.486928 15.495241 18.257111 -7.839503 15.303183 17.905382 -8.077485 15.359836 17.625025 -8.184657 15.661340 17.435143 -8.153715 16.187147 17.348677 -7.986768 16.901424 17.371515 -7.695193 17.755495 17.502110 -7.298859 18.691158 17.731554 -6.824778 19.644648 18.044212 -6.305255 20.550985 18.418781 -5.775697 21.348404 18.829731 -5.272192 21.982563 19.249058 -4.829051 22.410246 19.648186 -4.476477 22.602304 19.999914 -4.238494 22.545652 20.280272 -4.131322 22.244148 20.470154 -4.162263 21.718340 20.556622 -4.329211 21.004063 20.533779 -4.620786 20.149992 20.403189 -5.017119 19.214331 20.173744 -8.163098 20.307901 21.415592 -7.769013 19.738503 22.066267 -7.433617 19.144947 22.641361 -7.179766 18.567684 23.101681 -7.024758 18.046055 23.415852 -6.979159 17.615610 23.562468 -7.046075 17.305677 23.531536 -7.220947 17.137383 23.325165 -7.491856 17.122194 22.957420 -7.840341 17.261147 22.453358 -8.242654 17.544771 21.847332 -8.671376 17.953739 21.180643 -9.097293 18.460178 20.498724 -9.491377 19.029577 19.848047 -9.826774 19.623135 19.272955 -10.080626 20.200396 18.812635 -10.235633 20.722025 18.498463 -10.281232 21.152472 18.351847 -10.214316 21.462402 18.382778 -10.039445 21.630697 18.589149 -9.768536 21.645885 18.956894 -9.420051 21.506935 19.460955 -9.017738 21.223310 20.066982 -8.589016 20.814344 20.733669 -11.740092 20.335932 21.972982 -11.417652 21.018204 22.454596 -11.091520 21.609444 22.954782 -10.783923 22.069355 23.439461 -10.515821 22.366600 23.875599 -10.305487 22.480919 24.233473 -10.167253 22.404524 24.488697 -10.110540 22.142620 24.623877 -10.139214 21.713055 24.629801 -10.251319 21.145102 24.506065 -10.439218 20.477467 24.261101 -10.690103 19.755650 23.911604 -10.986877 19.028837 23.481390 -11.309318 18.346565 22.999779 -11.635449 17.755327 22.499590 -11.943048 17.295414 22.014914 -12.211149 16.998169 21.578773 -12.421484 16.883850 21.220900 -12.559718 16.960245 20.965675 -12.616430 17.222149 20.830494 -12.587757 17.651714 20.824572 -12.475652 18.219667 20.948307 -12.287754 18.887300 21.193272 -12.036868 19.609119 21.542768 -14.649877 18.941597 23.471035 -14.900514 19.595266 22.828560 -15.115760 20.262495 22.277208 -15.280949 20.897814 21.854561 -15.384821 21.457928 21.589415 -15.420300 21.904663 21.499844 -15.384966 22.207579 21.591949 -15.281227 22.346031 21.859455 -15.116154 22.310583 22.284130 -14.900996 22.103649 22.837036 -14.650415 21.739334 23.480490 -14.381488 21.242468 24.170643 -14.112542 20.646904 24.860466 -13.861906 19.993237 25.502941 -13.646659 19.326006 26.054291 -13.481470 18.690687 26.476940 -13.377598 18.130573 26.742085 -13.342119 17.683838 26.831657 -13.377453 17.380922 26.739552 -13.481192 17.242470 26.472048 -13.646264 17.277920 26.047371 -13.861423 17.484852 25.494467 -14.112003 17.849165 24.851011 -14.380930 18.346033 24.160858 -17.427868 18.725677 26.055216 -17.525009 17.969646 25.248629 -17.633566 17.328112 24.435120 -17.746138 16.844790 23.670134 -17.855055 16.552616 23.005802 -17.952894 16.471506 22.487394 -18.032990 16.606985 22.150246 -18.089882 16.949821 22.017324 -18.119694 17.476648 22.097696 -18.120392 18.151567 22.385880 -18.091932 18.928581 22.862236 -18.036251 19.754742 23.494303 -17.957146 20.573742 24.239006 -17.860004 21.329771 25.045593 -17.751448 21.971306 25.859102 -17.638876 22.454628 26.624088 -17.529959 22.746803 27.288422 -17.432119 22.827913 27.806826 -17.352024 22.692434 28.143978 -17.295132 22.349600 28.276897 -17.265320 21.822771 28.196527 -17.264622 21.147852 27.908344 -17.293081 20.370838 27.431988 -17.348763 19.544680 26.799923 -21.479496 20.220280 26.723633 -21.286423 19.188385 27.585588 -21.092987 18.154675 28.306473 -20.912367 17.189594 28.837154 -20.756876 16.358913 29.141472 -20.637108 15.719239 29.198689 -20.561224 15.314166 29.004900 -20.534399 15.171299 28.573315 -20.558458 15.300374 27.933346 -20.631763 15.692595 27.128605 -20.749319 16.321232 26.213934 -20.903112 17.143444 25.251667 -21.082663 18.103201 24.307377 -21.275736 19.135096 23.445423 -21.469173 20.168806 22.724539 -21.649794 21.133884 22.193855 -21.805285 21.964569 21.889536 -21.925053 22.604242 21.832321 -22.000937 23.009315 22.026108 -22.027761 23.152182 22.457693 -22.003702 23.023109 23.097662 -21.930397 22.630888 23.902405 -21.812841 22.002253 24.817074 -21.659048 21.180038 25.779343 -25.263651 19.747852 23.813503 -25.837524 20.664667 25.087902 -26.360464 21.415508 26.362465 -26.796827 21.949205 27.550331 -27.116880 22.229387 28.570547 -27.298809 22.236963 29.353588 -27.330219 21.971411 29.846090 -27.208967 21.450836 30.014490 -26.943316 20.710709 29.847317 -26.551371 19.801466 29.355957 -26.059841 18.785074 28.573896 -25.502226 17.730801 27.554434 -24.916523 16.710489 26.367041 -24.342648 15.793673 25.092642 -23.819710 15.042832 23.818079 -23.383345 14.509135 22.630215 -23.063292 14.228951 21.609997 -22.881363 14.221377 20.826956 -22.849953 14.486926 20.334454 -22.971205 15.007504 20.166050 -23.236856 15.747631 20.333227 -23.628801 16.656874 20.824587 -24.120329 17.673264 21.606644 -24.677946 18.727537 22.626106 -27.656504 15.569826 22.074987 -27.803926 17.194141 20.885443 -28.033186 18.787922 19.886509 -28.328659 20.242554 19.146271 -28.670210 21.458904 18.715168 -29.034561 22.354084 18.622581 -29.396885 22.867086 18.874821 -29.732489 22.962952 19.454695 -30.018499 22.635147 20.322687 -30.235430 21.906013 21.419645 -30.368494 20.825235 22.670818 -30.408625 19.466469 23.990931 -30.353086 17.922314 25.290028 -30.205664 16.297998 26.479572 -29.976404 14.704220 27.478504 -29.680931 13.249589 28.218744 -29.339382 12.033236 28.649849 -28.975029 11.138056 28.742435 -28.612705 10.625051 28.490196 -28.277103 10.529184 27.910324 -27.991091 10.856989 27.042330 -27.774160 11.586124 25.945372 -27.641096 12.666901 24.694202 -27.600965 14.025665 23.374088 -32.765362 12.357170 22.807360 -31.030975 11.515294 21.436028 -29.419735 10.885037 20.043739 -28.041445 10.509348 18.725376 -26.990032 10.413832 17.570780 -26.337151 10.604997 16.658642 -26.127289 11.069814 16.051117 -26.374754 11.776608 15.789605 -27.062677 12.677214 15.891932 -28.144180 13.710254 16.351124 -29.545557 14.805329 17.135887 -31.171312 15.887814 18.192739 -32.910648 16.883934 19.449661 -34.645031 17.725811 20.820993 -36.256271 18.356068 22.213282 -37.634563 18.731758 23.531645 -38.685978 18.827274 24.686239 -39.338860 18.636110 25.598381 -39.548721 18.171293 26.205906 -39.301258 17.464499 26.467417 -38.613335 16.563894 26.365089 -37.531834 15.530854 25.905899 -36.130455 14.435779 25.121138 -34.504700 13.353295 24.064285 -39.074390 12.719442 18.685564 -38.951511 10.504282 20.187376 -38.649822 8.377676 21.495235 -38.189884 6.484548 22.520010 -37.603039 4.953911 23.191866 -36.929283 3.890076 23.465019 -36.214527 3.365542 23.320847 -35.507484 3.416054 22.769182 -34.856339 4.038169 21.847618 -34.305458 5.189493 20.618956 -33.892395 6.791564 19.166929 -33.645287 8.735203 17.590488 -33.580982 10.887956 15.997066 -33.703861 13.103115 14.495255 -34.005550 15.229721 13.187396 -34.465488 17.122849 12.162621 -35.052330 18.653488 11.490763 -35.726089 19.717323 11.217611 -36.440842 20.241859 11.361780 -37.147884 20.191347 11.913446 -37.799034 19.569233 12.835009 -38.349911 18.417910 14.063669 -38.762978 16.815840 15.515697 -39.010086 14.872201 17.092138 -39.170132 11.201511 10.399995 -41.924213 11.652666 11.284619 -44.489841 11.876949 12.243299 -46.692181 11.859078 13.210699 -48.381142 11.600269 14.120893 -49.441624 11.118162 14.911854 -49.801357 10.445608 15.529677 -49.435829 9.628444 15.932261 -48.369949 8.722356 16.092171 -46.676353 7.789092 15.998507 -44.470459 6.892256 15.657652 -41.902592 6.092962 15.092836 -39.147751 5.445682 14.342550 -36.393673 4.994527 13.457926 -33.828041 4.770242 12.499247 -31.625702 4.788114 11.531848 -29.936739 5.046922 10.621653 -28.876255 5.529030 9.830691 -28.516520 6.201582 9.212867 -28.882046 7.018747 8.810283 -29.947926 7.924835 8.650373 -31.641521 8.858098 8.744038 -33.847416 9.754935 9.084891 -36.415283 10.554230 9.649707 -37.390385 3.971276 5.942853 -37.515156 6.544513 4.241731 -37.878605 8.965553 2.691240 -38.455971 11.069408 1.397041 -39.207901 12.712704 0.447335 -40.083160 13.783451 -0.093159 -41.022095 14.208682 -0.187608 -41.960720 13.959414 0.170426 -42.835072 13.052641 0.956542 -43.585560 11.550152 2.117170 -44.161045 9.554342 3.573212 -44.522305 7.201221 5.225443 -44.644726 4.651151 6.961267 -44.519955 2.077915 8.662388 -44.156506 -0.343126 10.212879 -43.579144 -2.446982 11.507078 -42.827209 -4.090279 12.456786 -41.951954 -5.161027 12.997281 -41.013016 -5.586258 13.091730 -40.074390 -5.336992 12.733697 -39.200043 -4.430218 11.947580 -38.449551 -2.927732 10.786955 -37.874065 -0.931921 9.330913 -37.512806 1.421198 7.678682 -41.666557 -3.115118 2.076916 -38.526943 -3.007137 2.008740 -35.601295 -2.694219 1.803680 -33.088993 -2.197690 1.475710 -31.161243 -1.551386 1.047181 -29.949421 -0.799353 0.547297 -29.536112 0.007160 0.010123 -29.949476 0.813191 -0.527733 -31.161348 1.563809 -1.029616 -33.089142 2.207862 -1.461325 -35.601475 2.701458 -1.793439 -38.527145 3.010959 -2.003325 -41.666763 3.115274 -2.076680 -44.806381 3.007294 -2.008505 -47.732029 2.694377 -1.803445 -50.244331 2.197848 -1.475476 -52.172081 1.551544 -1.046946 -53.383907 0.799511 -0.547062 -53.797218 -0.007002 -0.009888 -53.383854 -0.813032 0.527968 -52.171982 -1.563651 1.029851 -50.244190 -2.207704 1.461560 -47.731857 -2.701300 1.793674 -44.806190 -3.010802 2.003561 -44.643417 -4.655591 -6.967583 -44.521187 -7.204571 -5.230136 -44.160191 -9.556362 -3.575947 -43.585033 -11.550695 -2.117745 -42.834911 -13.051659 -0.954905 -41.960941 -13.956964 -0.166670 -41.022686 -14.204919 0.193240 -40.084084 -13.778623 0.100300 -39.209099 -12.707129 -0.439157 -38.457359 -11.063457 -1.388368 -37.880096 -8.959620 -2.682646 -37.516647 -6.538991 -4.233788 -37.391785 -3.966533 -5.936086 -37.514015 -1.417554 -7.673532 -37.875008 0.934238 -9.327721 -38.450165 2.928571 -10.785923 -39.200287 4.429536 -11.948765 -40.074257 5.334843 -12.737000 -41.012516 5.582798 -13.096911 -41.951118 5.156503 -13.003971 -42.826103 4.085010 -12.464516 -43.577843 2.441338 -11.515305 -44.155106 0.337502 -10.221027 -44.518555 -2.083126 -8.669886 -39.147820 -5.445873 -14.342846 -41.900501 -6.096691 -15.098006 -44.466358 -6.899259 -15.667333 -46.670532 -7.798884 -16.012024 -48.362804 -8.734259 -16.108589 -49.427856 -9.641638 -15.950449 -49.793106 -10.459185 -15.548381 -49.433659 -11.131186 -14.929785 -48.374012 -11.611846 -14.136818 -46.686382 -11.868406 -13.223517 -44.485775 -11.883387 -12.252126 -41.922157 -11.655763 -11.288838 -39.170238 -11.201049 -10.399304 -36.417557 -10.550232 -9.644143 -33.851700 -9.747663 -9.074819 -31.647528 -8.848039 -8.730127 -29.955252 -7.912663 -8.633560 -28.890198 -7.005284 -8.791699 -28.524950 -6.187737 -9.193768 -28.884394 -5.515736 -9.812363 -29.944038 -5.035076 -10.605330 -31.631668 -4.778514 -11.518630 -33.832275 -4.763534 -12.490023 -36.395893 -4.991158 -13.453310 -33.584370 -10.884477 -15.992512 -33.648987 -8.731575 -17.585735 -33.896164 -6.788025 -19.162292 -34.309052 -5.186277 -20.614742 -34.859516 -4.035489 -21.844101 -35.510040 -3.414083 -22.766590 -36.216293 -3.364408 -23.319349 -36.930145 -3.889848 -23.464703 -37.602951 -4.954597 -23.192745 -38.188854 -6.486094 -22.522013 -38.647934 -8.379969 -21.498213 -38.948898 -10.507155 -20.191118 -39.071239 -12.722693 -18.689804 -39.006622 -14.875596 -17.096579 -38.759445 -16.819145 -15.520022 -38.346558 -18.420893 -14.067575 -37.796093 -19.571684 -12.838213 -37.145569 -20.193090 -11.915722 -36.439316 -20.242767 -11.362965 -35.725464 -19.717327 -11.217609 -35.052658 -18.652578 -11.489567 -34.466755 -17.121082 -12.160297 -34.007675 -15.227209 -13.184096 -33.706711 -13.100021 -14.491192 -32.911316 -16.883287 -19.448797 -31.176172 -15.884205 -18.188412 -29.554289 -14.798999 -17.128384 -28.156195 -13.701626 -16.340950 -27.077168 -12.666871 -15.879772 -26.390739 -11.765250 -15.776280 -26.143692 -11.058207 -16.037527 -26.352861 -10.593926 -16.645708 -27.003988 -10.404047 -17.559374 -28.052706 -10.501509 -18.716269 -29.427540 -10.879672 -20.037540 -31.034801 -11.512763 -21.433155 -32.764957 -12.357639 -22.807999 -34.500103 -13.356723 -24.068382 -36.121986 -14.441928 -25.128410 -37.520081 -15.539300 -25.915846 -38.599110 -16.574057 -26.377024 -39.285538 -17.475677 -26.480518 -39.532585 -18.182720 -26.219273 -39.323418 -18.647001 -25.611092 -38.672291 -18.836882 -24.697424 -37.623573 -18.739418 -23.540533 -36.248737 -18.361256 -22.219259 -34.641476 -17.728167 -20.823645 -30.346582 -17.925793 -25.292938 -30.403744 -19.468821 -23.992550 -30.365578 -20.826290 -22.671030 -30.234688 -21.905697 -21.418434 -30.019991 -22.633478 -20.320126 -29.736120 -22.960039 -19.450954 -29.402420 -22.863123 -18.870152 -29.041634 -22.349335 -18.617298 -28.678345 -21.453690 -18.709625 -28.337313 -20.237225 -19.140841 -28.041779 -18.782837 -19.881559 -27.811882 -17.189644 -20.881300 -27.663290 -15.566217 -22.071936 -27.606129 -14.023191 -23.372322 -27.644295 -12.665720 -24.693844 -27.775185 -11.586313 -25.946440 -27.989882 -10.858531 -27.044748 -28.273752 -10.531970 -27.913919 -28.607450 -10.628885 -28.494724 -28.968239 -11.142673 -28.747578 -29.331528 -12.038317 -28.655251 -29.672558 -13.254782 -28.224035 -29.968094 -14.709167 -27.483318 -30.197990 -16.302362 -26.483578 -24.915697 -16.711092 -26.367668 -25.496937 -17.733118 -27.555794 -26.050459 -18.788948 -28.575899 -26.538544 -19.806625 -29.358459 -26.927929 -20.716801 -29.850147 -27.192076 -21.457443 -30.017456 -27.312986 -21.978081 -29.848982 -27.282419 -22.243233 -29.356209 -27.102457 -22.234833 -28.572716 -26.785364 -21.953449 -27.551899 -26.352753 -21.418259 -26.363323 -25.834101 -20.665735 -25.087988 -25.264755 -19.747160 -23.812807 -24.683516 -18.725134 -22.624680 -24.129992 -17.669306 -21.604578 -23.641907 -16.651628 -20.822016 -23.252523 -15.741454 -20.330326 -22.988375 -15.000811 -20.163017 -22.867464 -14.480171 -20.331491 -22.898031 -14.215018 -20.824265 -23.077993 -14.223419 -21.607754 -23.395084 -14.504803 -22.628572 -23.827698 -15.039991 -23.817150 -24.346350 -15.792515 -25.092484 -21.086544 -18.102179 -24.307631 -20.906427 -17.142748 -25.252157 -20.751852 -16.320908 -26.214630 -20.633352 -15.692662 -27.129459 -20.559002 -15.300829 -27.934303 -20.533869 -15.172109 -28.574306 -20.559668 -15.315273 -29.005859 -20.634638 -15.720567 -29.199549 -20.753672 -16.360369 -29.142179 -20.908655 -17.191076 -28.837658 -21.089029 -18.156080 -28.306736 -21.282499 -19.189617 -27.585598 -21.475883 -20.221252 -26.723385 -21.656000 -21.180683 -25.778858 -21.810575 -22.002525 -24.816385 -21.929075 -22.630770 -23.901556 -22.003426 -23.022604 -23.096712 -22.028559 -23.151323 -22.456709 -22.002760 -23.008162 -22.025154 -21.927790 -22.602869 -21.831463 -21.808756 -21.963068 -21.888834 -21.653772 -21.132359 -22.193356 -21.473398 -20.167355 -22.724277 -21.279928 -19.133818 -23.445415 -17.958311 -20.573111 -24.238691 -18.039673 -19.753471 -23.494926 -18.097385 -18.926758 -22.863754 -18.127514 -18.149313 -22.388193 -18.128006 -17.474115 -22.100647 -18.098827 -16.947182 -22.020716 -18.041967 -16.604420 -22.153845 -17.961302 -16.469189 -22.490959 -17.862326 -16.550703 -23.009092 -17.751785 -16.843409 -23.672926 -17.637215 -17.327360 -24.437225 -17.526419 -17.969572 -25.249905 -17.426950 -18.726284 -26.055580 -17.345589 -19.545925 -26.799345 -17.287876 -20.372637 -27.430517 -17.257748 -21.150084 -27.906080 -17.257256 -21.825279 -28.193624 -17.286434 -22.352215 -28.273558 -17.343294 -22.694977 -28.140429 -17.423960 -22.830208 -27.803314 -17.522936 -22.748695 -27.285183 -17.633476 -22.455988 -26.621349 -17.748047 -21.972038 -25.857048 -17.858843 -21.329826 -25.044371 -14.110780 -20.647570 -24.858973 -14.380862 -21.242477 -24.169024 -14.650975 -21.738691 -23.478859 -14.902713 -22.102394 -22.835505 -15.118917 -22.308800 -22.282806 -15.284858 -22.343843 -21.858435 -15.389222 -22.205139 -21.591305 -15.424901 -21.902134 -21.499620 -15.389462 -21.455481 -21.589632 -15.285319 -20.895617 -21.855206 -15.119572 -20.260698 -22.278242 -14.903513 -19.593992 -22.829912 -14.651868 -18.940931 -23.472620 -14.381786 -18.346025 -24.162567 -14.111672 -17.849812 -24.852734 -13.859936 -17.486109 -25.496086 -13.643730 -17.279701 -26.048782 -13.477791 -17.244656 -26.473158 -13.373425 -17.383362 -26.740288 -13.337747 -17.686367 -26.831970 -13.373186 -18.133020 -26.741961 -13.477328 -18.692883 -26.476387 -13.643076 -19.327801 -26.053352 -13.859135 -19.994509 -25.501682 -10.986000 -19.029448 -23.481480 -10.688322 -19.756575 -23.910532 -10.436662 -20.478647 -24.258945 -10.248170 -21.146454 -24.502977 -10.135693 -21.714489 -24.625994 -10.106894 -22.144041 -24.619616 -10.163737 -22.405834 -24.484274 -10.302348 -22.482031 -24.229195 -10.513280 -22.367435 -23.871759 -10.782160 -22.069859 -23.436329 -11.090663 -21.609581 -22.952576 -11.417766 -21.017967 -22.453465 -11.741176 -20.335339 -21.973013 -12.038855 -19.608212 -21.543961 -12.290514 -18.886139 -21.195547 -12.479006 -18.218330 -20.951515 -12.591484 -17.650295 -20.828497 -12.620283 -17.220745 -20.834877 -12.563440 -16.958950 -20.970217 -12.424829 -16.882753 -21.225296 -12.213897 -16.997349 -21.582729 -11.945017 -17.294926 -22.018162 -11.636514 -17.755203 -22.501915 -11.309412 -18.346815 -23.001026 -9.097970 -18.459764 -20.500263 -8.671061 -17.953953 -21.182018 -8.241371 -17.545597 -21.848457 -7.838187 -17.262531 -22.454159 -7.488983 -17.124043 -22.957848 -7.217557 -17.139568 -23.325197 -7.042407 -17.308056 -23.531174 -6.975468 -17.618015 -23.561739 -7.021302 -18.048328 -23.414812 -7.176786 -18.569672 -23.100405 -7.431324 -19.146511 -22.639942 -7.767569 -19.739540 -22.064806 -8.162607 -20.308342 -21.414190 -8.589518 -20.814156 -20.732433 -9.019206 -21.222511 -20.065996 -9.422390 -21.505577 -19.460293 -9.771595 -21.644068 -18.956604 -10.043020 -21.628538 -18.589254 -10.218171 -21.460052 -18.383278 -10.285110 -21.150093 -18.352713 -10.239276 -20.719780 -18.499640 -10.083793 -20.198437 -18.814049 -9.829255 -19.621597 -19.274509 -9.493010 -19.028568 -19.849646 -6.826124 -19.643854 -18.044619 -7.300466 -18.690062 -17.733315 -7.696956 -17.754168 -17.505110 -7.988573 -16.899958 -17.375561 -8.155445 -16.185642 -17.353491 -8.186199 -15.659903 -17.440409 -8.078740 -15.358564 -17.630386 -7.840391 -15.302165 -17.910480 -7.487394 -15.494546 -18.261602 -7.043807 -15.922600 -18.659822 -6.539858 -16.557154 -19.078003 -6.009892 -17.354963 -19.487648 -5.490024 -18.261662 -19.860838 -5.015682 -19.215456 -20.172142 -4.619192 -20.151348 -20.400347 -4.327574 -21.005558 -20.529896 -4.160702 -21.719875 -20.551966 -4.129948 -22.245615 -20.465050 -4.237406 -22.546953 -20.275070 -4.475756 -22.603354 -19.994976 -4.828752 -22.410973 -19.643856 -5.272339 -21.982920 -19.245634 -5.776288 -21.348366 -18.827454 -6.306254 -20.550556 -18.417810 -3.165492 -19.812563 -17.156864 -3.960337 -20.424635 -16.241062 -4.752223 -20.900631 -15.362404 -5.487183 -21.208107 -14.580769 -6.115131 -21.326117 -13.949421 -6.593274 -21.246613 -13.511391 -6.889027 -20.975016 -13.296525 -6.982234 -20.529831 -13.319470 -6.866546 -19.941402 -13.578660 -6.549844 -19.249826 -14.056431 -6.053711 -18.502235 -14.720224 -5.411959 -17.749573 -15.524803 -4.668322 -17.043137 -16.415340 -3.873477 -16.431063 -17.331141 -3.081592 -15.955069 -18.209799 -2.346632 -15.647591 -18.991436 -1.718682 -15.529581 -19.622784 -1.240540 -15.609085 -20.060814 -0.944786 -15.880683 -20.275677 -0.851578 -16.325865 -20.252735 -0.967267 -16.914293 -19.993546 -1.283968 -17.605869 -19.515776 -1.780101 -18.353460 -18.851980 -2.421852 -19.106123 -18.047403 -0.645994 -16.927629 -15.786632 0.097415 -18.406633 -16.018904 0.706429 -19.846825 -16.148346 1.139542 -21.150057 -16.166134 1.367240 -22.227520 -16.071056 1.374005 -23.005783 -15.869594 1.159377 -23.431810 -15.575473 0.737981 -23.476566 -15.208739 0.138535 -23.137005 -14.794386 -0.598109 -22.436266 -14.360649 -1.421750 -21.422100 -13.937088 -2.276259 -20.163626 -13.552567 -3.103403 -18.746601 -13.233290 -3.846812 -17.267599 -13.001017 -4.455826 -15.827407 -12.871574 -4.888940 -14.524174 -12.853786 -5.116638 -13.446712 -12.948864 -5.123404 -12.668447 -13.150327 -4.908775 -12.242419 -13.444448 -4.487380 -12.197662 -13.811180 -3.887934 -12.537223 -14.225533 -3.151291 -13.237963 -14.659271 -2.327649 -14.252127 -15.082832 -1.473140 -15.510601 -15.467354 -1.136270 -15.097721 -11.881963 0.223666 -14.289313 -13.135876 1.568365 -13.679209 -14.323397 2.806186 -13.308987 -15.363595 3.852774 -13.203876 -16.185583 4.636806 -13.371042 -16.733345 5.104852 -13.799089 -16.969551 5.225015 -14.458851 -16.878105 4.989105 -15.305362 -16.465239 4.413201 -16.280935 -15.759088 3.536549 -17.319086 -14.807775 2.418891 -18.349070 -13.676131 1.136394 -19.300692 -12.441276 -0.223543 -20.109100 -11.187363 -1.568241 -20.719204 -9.999842 -2.806062 -21.089428 -8.959644 -3.852652 -21.194538 -8.137655 -4.636684 -21.027374 -7.589891 -5.104731 -20.599325 -7.353684 -5.224894 -19.939566 -7.445131 -4.988985 -19.093056 -7.857997 -4.413082 -18.117481 -8.564148 -3.536429 -17.079329 -9.515460 -2.418772 -16.049345 -10.647103 -0.186287 -17.720510 -8.087603 -1.243345 -15.607950 -7.956367 -2.097297 -13.557928 -7.948522 -2.689950 -11.710155 -8.064600 -2.980915 -10.190549 -8.296692 -2.950363 -9.102674 -8.628979 -2.600376 -8.520661 -9.038818 -1.954805 -8.484177 -9.498280 -1.057645 -8.995708 -9.976051 0.029963 -10.020391 -10.439574 1.233903 -11.488400 -10.857258 2.472126 -13.299689 -11.200642 3.660251 -15.330824 -11.446321 4.717309 -17.443384 -11.577557 5.571261 -19.493406 -11.585402 6.163915 -21.341179 -11.469324 6.454880 -22.860786 -11.237233 6.424328 -23.948664 -10.904945 6.074342 -24.530676 -10.495106 5.428772 -24.567162 -10.035645 4.531612 -24.055632 -9.557873 3.444004 -23.030949 -9.094352 2.240064 -21.562943 -8.676666 1.001841 -19.751654 -8.333283 4.891482 -18.620085 -7.510373 2.962749 -19.642153 -5.957009 1.061307 -20.403917 -4.498141 -0.683261 -20.853460 -3.233189 -2.152067 -20.960146 -2.248356 -3.245015 -20.716711 -1.610757 -3.887621 -20.139738 -1.363844 -4.036094 -19.268547 -1.524443 -3.680315 -18.162512 -2.081609 -2.844529 -16.897007 -2.997374 -1.585695 -15.558270 -4.209328 0.010400 -14.237537 -5.634879 1.834985 -13.024814 -7.176879 3.763718 -12.002744 -8.730242 5.665160 -11.240980 -10.189110 7.409728 -10.791437 -11.454062 8.878536 -10.684748 -12.438896 9.971484 -10.928185 -13.076496 10.614091 -11.505157 -13.323410 10.762565 -12.376347 -13.162811 10.406787 -13.482382 -12.605646 9.571001 -14.747888 -11.689882 8.312168 -16.086624 -10.477928 6.716073 -17.407356 -9.052377 7.389603 -13.642259 -6.875250 8.722322 -16.248865 -6.899809 9.794791 -18.776567 -6.788310 10.533924 -21.053106 -6.548347 10.889350 -22.923342 -6.196276 10.836847 -24.259819 -5.756090 10.379993 -24.971458 -5.257786 9.549922 -25.009764 -4.735323 8.403201 -24.372124 -4.224306 7.017980 -23.101995 -3.759560 5.488657 -21.285934 -3.372757 3.919452 -19.047699 -3.090255 2.417306 -16.539825 -2.931309 1.084587 -13.933221 -2.906749 0.012117 -11.405518 -3.018249 -0.727017 -9.128979 -3.258211 -1.082443 -7.258741 -3.610281 -1.029941 -5.922264 -4.050467 -0.573087 -5.210623 -4.548771 0.256984 -5.172318 -5.071235 1.403703 -5.809955 -5.582252 2.788925 -7.080084 -6.046998 4.318248 -8.896145 -6.433801 5.887452 -11.134378 -6.716302 4.570469 -11.126987 -2.399946 6.849924 -9.954147 -4.120268 9.097346 -9.079464 -5.727011 11.159577 -8.562544 -7.110678 12.896079 -8.438614 -8.176974 14.188513 -8.716122 -8.853233 14.948800 -9.376154 -9.093369 15.125130 -10.373732 -8.881017 14.705485 -11.640869 -8.230650 13.718465 -13.091215 -7.186586 12.231331 -14.625931 -5.819980 10.345430 -16.140429 -4.223961 8.189284 -17.531494 -2.507297 5.909829 -18.704334 -0.786975 3.662407 -19.579020 0.819768 1.600176 -20.095938 2.203435 -0.136328 -20.219870 3.269732 -1.428762 -19.942364 3.945992 -2.189050 -19.282330 4.186129 -2.365381 -18.284754 3.973778 -1.945737 -17.017616 3.323411 -0.958717 -15.567270 2.279348 0.528416 -14.032555 0.912742 2.414316 -12.518058 -0.683276 5.114467 -15.089705 2.076186 3.636266 -12.317812 2.005335 2.442674 -9.628637 1.797831 1.615031 -7.205442 1.467816 1.209740 -5.213366 1.037778 1.254422 -3.788164 0.537026 1.746030 -3.026961 -0.000317 2.651063 -2.981632 -0.537630 3.907844 -3.655266 -1.038298 5.430727 -5.001956 -1.468199 7.115927 -6.929927 -1.798038 8.848602 -9.307792 -2.005336 10.510674 -11.973502 -2.075966 11.988875 -14.745395 -2.005116 13.182468 -17.434570 -1.797612 14.010111 -19.857763 -1.467596 14.415403 -21.849842 -1.037559 14.370723 -23.275045 -0.536806 13.879114 -24.036249 0.000536 12.974082 -24.081581 0.537849 11.717301 -23.407946 1.038517 10.194421 -22.061256 1.468419 8.509220 -20.133286 1.798257 6.776544 -17.755424 2.005556 11.088828 -15.857403 2.508171 8.806945 -17.028835 4.226211 6.553190 -17.904562 5.823469 4.481153 -18.424902 7.191094 2.732040 -18.554394 8.235886 1.425049 -18.284216 8.886642 0.649251 -17.632776 9.099016 0.457513 -16.644474 8.858534 0.862904 -15.386658 8.181585 1.837795 -13.945047 7.114302 3.315751 -12.417883 5.729418 5.196050 -10.909241 4.121311 7.350554 -9.521931 2.399571 9.632436 -8.350498 0.681531 11.886190 -7.474771 -0.915727 13.958227 -6.954431 -2.283353 15.707342 -6.824937 -3.328146 17.014334 -7.095116 -3.978903 17.790133 -7.746553 -4.191278 17.981871 -8.734856 -3.950796 17.576483 -9.992671 -3.273848 16.601591 -11.434282 -2.206566 15.123636 -12.961447 -0.821681 13.243338 -14.470089 0.786426 13.115394 -10.362179 2.932385 14.537056 -12.916508 3.091435 15.691617 -15.394199 3.373975 16.500395 -17.626402 3.760752 16.908272 -19.460997 4.225408 16.887453 -20.772957 4.736276 16.439358 -21.472878 5.258542 15.594522 -21.513058 5.756614 14.410520 -20.890759 6.196550 12.968039 -19.648392 6.548369 11.365382 -17.870623 6.788095 9.711768 -15.678598 6.899390 8.119888 -13.221706 6.874671 6.698225 -10.667378 6.715622 5.543664 -8.189688 6.433082 4.734886 -5.957483 6.046305 4.327007 -4.122887 5.581649 4.347825 -2.810925 5.070782 4.795920 -2.111005 4.548515 5.640756 -2.070823 4.050443 6.824758 -2.693120 3.610507 8.267238 -3.935486 3.258688 9.869895 -5.713257 3.018962 11.523508 -7.905279 2.907666 10.361468 -8.102112 7.176916 12.323922 -7.127523 5.635365 14.265742 -6.404829 4.210246 16.054600 -5.983277 2.998679 17.568584 -5.891597 2.083230 18.704523 -6.136036 1.526285 19.385000 -6.699937 1.365800 19.563646 -7.544868 1.612710 19.228283 -8.613254 2.250188 18.401770 -9.832280 3.234794 17.140427 -11.118876 4.499426 15.530216 -12.385359 5.957902 13.680870 -13.545424 7.510831 11.718417 -14.520012 9.052382 9.776596 -15.242707 10.477500 7.987740 -15.664260 11.689068 6.473752 -15.755940 12.604518 5.337814 -15.511501 13.161463 4.657336 -14.947601 13.321949 4.478690 -14.102670 13.075040 4.814050 -13.034286 12.437562 5.640565 -11.815258 11.452957 6.901906 -10.528665 10.188325 8.512116 -9.262180 8.729849 11.447283 -10.834722 11.447261 10.282015 -8.790518 11.200825 9.332184 -6.812860 10.856692 8.662519 -5.036520 10.438315 8.318656 -3.582555 9.974204 8.324029 -2.550049 9.495990 8.678273 -2.009366 9.036260 9.357245 -1.997351 8.626343 10.314676 -2.514825 8.294177 11.485317 -3.526522 8.062398 12.789392 -4.963496 7.946799 14.138030 -6.727821 7.955260 15.439323 -8.699261 8.087205 16.604591 -10.743464 8.333641 17.554422 -12.721121 8.677773 18.224089 -14.497461 9.096149 18.567953 -15.951428 9.560261 18.562578 -16.983936 10.038476 18.208336 -17.524620 10.498206 17.529364 -17.536634 10.908122 16.571934 -17.019159 11.240288 15.401293 -16.007465 11.472069 14.097219 -14.570492 11.587667 12.748581 -12.806167 11.579206 16.146509 -10.634315 12.443004 14.681439 -11.267720 13.678916 13.230928 -11.719292 14.811442 11.893826 -11.958256 15.763406 10.761253 -11.968328 16.469929 9.910394 -11.748824 16.882864 9.399231 -11.314701 16.974070 9.262601 -10.695542 16.737333 9.509814 -9.933544 16.188786 10.124023 -9.080636 15.365808 11.063372 -8.194942 14.324489 12.263844 -7.336819 13.135789 13.643629 -6.564748 11.880717 15.108698 -5.931344 10.644806 16.559208 -5.479773 9.512278 17.896311 -5.240807 8.560315 19.028885 -5.230734 7.853792 19.879745 -5.450238 7.440856 20.390909 -5.884361 7.349649 20.527538 -6.503519 7.586385 20.280327 -7.265516 8.134933 19.666119 -8.118424 8.957909 18.726770 -9.004120 9.999229 17.526299 -9.862243 11.187928 17.786671 -6.687256 13.232531 18.600098 -8.111830 13.553269 19.262564 -9.480728 13.939221 19.728920 -10.700665 14.364084 19.967388 -11.688503 14.798904 19.961714 -12.376924 15.214049 19.712286 -12.719011 15.581228 19.236103 -12.691453 15.875418 18.565615 -12.296127 16.076571 17.746513 -11.559975 16.170977 16.834621 -10.533163 16.152205 15.892080 -9.285667 16.021530 14.983125 -7.902504 15.787863 14.169697 -6.477931 15.467125 13.507232 -5.109032 15.081173 13.040874 -3.889095 14.656310 12.802406 -2.901256 14.221489 12.808080 -2.212835 13.806344 13.057508 -1.870747 13.439165 13.533690 -1.898306 13.144976 14.204179 -2.293630 12.943823 15.023279 -3.029782 12.849417 15.935172 -4.056593 12.868190 16.877712 -5.304088 12.998862 17.093931 -4.478890 16.414778 18.077427 -4.188550 15.524011 19.050030 -4.009501 14.719268 19.945459 -3.953944 14.055393 20.702692 -4.025667 13.577626 21.270126 -4.219782 13.318528 21.609091 -4.523059 13.295754 21.696487 -4.914832 13.510857 21.526358 -5.368401 13.949178 21.110298 -5.852857 14.580846 20.476660 -6.335183 15.362814 19.668627 -6.782513 16.241791 18.741264 -7.164359 17.157881 17.757769 -7.454700 18.048647 16.785166 -7.633749 18.853390 15.889737 -7.689305 19.517263 15.132503 -7.617582 19.995031 14.565068 -7.423468 20.254129 14.226103 -7.120191 20.276903 14.138706 -6.728418 20.061802 14.308835 -6.274849 19.623482 14.724895 -5.790393 18.991814 15.358533 -5.308066 18.209846 16.166565 -4.860738 17.330868 18.560339 -4.375050 19.861387 18.035007 -3.471970 19.487141 17.609020 -2.614630 19.076487 17.311407 -1.861456 18.657413 17.162451 -1.263775 18.258476 17.172300 -0.862319 17.906868 17.340288 -0.684447 17.626547 17.654963 -0.742279 17.436615 18.094881 -1.031874 17.350019 18.630062 -1.533498 17.372656 19.224037 -2.212965 17.502989 19.836325 -3.023970 17.732132 20.425200 -3.911246 18.044468 20.950531 -4.814326 18.418716 21.376518 -5.671666 18.829370 21.674131 -6.424840 19.248444 21.823088 -7.022522 19.647379 21.813238 -7.423978 19.998989 21.645250 -7.601851 20.279310 21.330576 -7.544019 20.469240 20.890659 -7.254425 20.555840 20.355476 -6.752801 20.533201 19.761503 -6.073335 20.402870 19.149216 -5.262329 20.173727 21.669058 -3.084173 21.415731 20.979010 -3.140840 22.066498 20.297369 -3.134601 22.641678 19.670589 -3.065881 23.102079 19.141384 -2.939363 23.416328 18.745819 -2.763671 23.563004 18.510851 -2.550776 23.532114 18.452492 -2.315187 23.325764 18.574718 -2.072958 22.958014 18.869202 -1.840599 22.453926 19.315874 -1.633943 21.847857 19.884295 -1.467074 21.181101 20.535725 -1.351363 20.499105 21.225775 -1.294696 19.848341 21.907413 -1.300935 19.273161 22.534193 -1.369655 18.812759 23.063398 -1.496172 18.498510 23.458963 -1.671865 18.351833 23.693933 -1.884760 18.382723 23.752293 -2.120349 18.589073 23.630066 -2.362577 18.956821 23.335583 -2.594937 19.460911 22.888910 -2.801593 20.066980 22.320492 -2.968462 20.733734</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-positions-array" count="2880" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-normals">
+ <float_array id="Torus_Knot01-mesh-normals-array" count="8640">0.704886 -0.007624 -0.709279 -0.552938 0.557017 -0.619671 -0.590652 0.293027 -0.751841 0.591047 -0.261263 -0.763155 -0.568967 0.072133 -0.819191 0.484794 -0.450902 -0.749441 -0.497136 -0.067077 -0.865076 0.438288 -0.583459 -0.683724 -0.328414 -0.105248 -0.938652 0.500772 -0.686193 -0.527605 0.192150 0.038515 -0.980610 0.673907 -0.734891 -0.076053 0.748946 -0.022929 -0.662235 0.523221 -0.672393 0.523572 0.986999 -0.116886 -0.110323 0.170952 -0.356421 0.918553 0.948569 -0.050524 0.312512 -0.034391 0.042307 0.998513 0.871825 -0.067155 0.485192 -0.164381 0.184185 0.969048 0.800840 -0.182613 0.570358 -0.314586 0.192939 0.929414 0.695816 -0.378362 0.610477 -0.502995 0.124427 0.855286 0.524877 -0.602533 0.601214 -0.702944 0.004762 0.711229 0.317888 -0.772791 0.549310 -0.851886 -0.119892 0.509819 0.131229 -0.858275 0.496128 -0.928467 -0.197612 0.314480 -0.023550 -0.873057 0.487049 -0.967402 -0.198502 0.157261 -0.180125 -0.802186 0.569256 -0.997141 -0.072964 0.019665 -0.431783 -0.493589 0.754939 -0.930276 0.314549 -0.188800 -0.746566 0.032318 0.664526 -0.528675 0.662144 -0.531101 -0.786200 0.534650 0.309901 0.093423 0.748686 -0.656309 -0.509741 0.859047 0.046922 0.539919 0.693736 -0.476674 -0.389427 0.914747 -0.107633 0.689366 0.584873 -0.427432 -0.396882 0.880786 -0.258266 0.752970 0.447268 -0.482687 -0.468656 0.768620 -0.435414 0.763512 0.250603 -0.595187 -0.714402 0.133156 0.686949 -0.845957 -0.089426 0.525699 -0.900741 -0.244986 0.358674 -0.928054 -0.307061 0.210783 -0.969021 -0.242469 0.046985 -0.955601 0.103995 -0.275702 -0.576550 0.384482 -0.720947 0.009253 0.453635 -0.891140 0.460728 0.518945 -0.720017 0.625893 0.468151 -0.623773 0.702675 0.332745 -0.628911 0.727408 0.095564 -0.679518 0.673728 -0.230237 -0.702198 0.556235 -0.519385 -0.648723 0.450990 -0.698498 -0.555616 0.409889 -0.795532 -0.446228 0.491286 -0.826205 -0.275723 0.735300 -0.654914 0.174417 0.577495 -0.392935 0.715612 0.185942 -0.039082 0.981783 -0.058534 0.340458 0.938436 -0.191250 0.472651 0.860247 -0.335755 0.458099 0.823051 -0.519859 0.339549 0.783870 0.612432 -0.281107 0.738855 0.404746 -0.517469 0.753927 0.221436 -0.646634 0.729953 0.075033 -0.681093 0.728342 -0.077008 -0.601480 0.795167 -0.362920 -0.262750 0.894009 -0.758897 0.132758 0.637535 -0.902564 0.405804 0.143880 -0.661118 0.712321 -0.235628 -0.505733 0.765383 -0.398023 -0.507214 0.686205 -0.521398 -0.584101 0.490287 -0.646873 -0.660408 0.150076 -0.735757 -0.651566 -0.213400 -0.727958 -0.582152 -0.454956 -0.673880 -0.489437 -0.584360 -0.647282 -0.333813 -0.609652 -0.718953 0.216046 -0.245059 -0.945130 0.741833 -0.119087 -0.659926 0.990201 -0.002139 -0.139633 0.947089 0.224429 0.229462 0.872803 0.286204 0.395350 0.828489 0.206802 0.520422 0.763255 0.002123 0.646094 0.680004 -0.387243 -0.622606 0.594015 -0.689367 -0.414632 0.506397 -0.829140 -0.236831 0.484077 -0.869035 -0.102211 0.598664 -0.800144 0.037033 0.867869 -0.364740 0.337295 0.667391 0.031563 0.744038 0.223149 0.357953 0.906683 -0.091046 0.674050 0.733053 -0.236006 0.767279 0.596308 -0.369970 0.722514 0.584034 -0.537741 0.555024 0.634652 -0.706779 0.239930 0.665505 -0.783411 -0.111974 0.611334 -0.783345 -0.346554 0.516015 -0.788043 -0.458941 0.410318 -0.855046 -0.454043 0.250483 -0.959942 -0.200086 -0.196156 -0.665124 -0.060893 -0.744246 -0.135159 0.012510 -0.990745 0.307631 0.283164 -0.908395 0.480517 0.347663 -0.805130 0.584729 0.248351 -0.772278 0.667366 -0.004022 -0.744719 -0.715285 -0.310028 -0.626299 -0.602962 -0.661473 -0.445971 -0.465752 -0.833593 -0.296981 -0.346266 -0.907630 -0.237291 -0.203778 -0.917176 -0.342436 0.220977 -0.520084 -0.825035 0.703431 -0.230652 -0.672297 0.951001 0.127994 -0.281450 0.867413 0.496431 -0.033929 0.779549 0.619395 0.093024 0.764902 0.598113 0.239136 0.770044 0.451130 0.451125 0.701164 0.176606 0.690781 0.544331 -0.108139 0.831871 0.389868 -0.285886 0.875370 0.260391 -0.345361 0.901622 0.107092 -0.264086 0.958535 -0.245479 0.045862 0.968316 -0.738861 0.196650 0.644526 -0.974712 0.175592 0.138219 -0.823165 0.416235 -0.386197 -0.654227 0.479481 -0.584881 -0.651344 0.362332 -0.666682 -0.707726 0.100151 -0.699353 -0.695522 0.334571 0.635855 -0.674328 -0.041542 0.737262 -0.612828 -0.291153 0.734624 -0.598204 -0.426873 0.678182 -0.690346 -0.485453 0.536431 -0.899408 -0.435622 0.036030 -0.685012 -0.482893 -0.545502 -0.214867 -0.413539 -0.884770 0.146401 -0.018494 -0.989053 0.299051 0.126203 -0.945855 0.427313 0.071554 -0.901268 0.579968 -0.129695 -0.804249 0.710367 -0.432655 -0.555147 0.722698 -0.651112 -0.231862 0.685243 -0.728314 -0.000043 0.686185 -0.714085 0.138681 0.797638 -0.563965 0.213816 0.956193 -0.011668 0.292506 0.693559 0.446015 0.565726 0.198024 0.710793 0.674952 -0.202068 0.883701 0.422186 -0.370767 0.889681 0.266458 -0.488215 0.821332 0.295058 -0.609233 0.657536 0.443263 0.688540 0.567946 0.450944 0.625232 0.324144 0.709940 0.525543 0.142011 0.838831 0.417823 0.071620 0.905701 0.253042 0.142676 0.956877 -0.167045 0.363346 0.916556 -0.704456 0.279507 0.652394 -0.974151 0.036231 0.222972 -0.915767 0.112472 -0.385643 -0.788050 0.120462 -0.603711 -0.768745 -0.018961 -0.639274 -0.765985 -0.282755 -0.577336 -0.672407 -0.634047 -0.381908 -0.470583 -0.873371 -0.125601 -0.287596 -0.956872 0.041035 -0.150393 -0.984473 0.090520 -0.017656 -0.998376 -0.054159 0.268387 -0.742093 -0.614220 0.684298 -0.330901 -0.649800 0.867853 0.194061 -0.457352 0.706504 0.616506 -0.347522 0.598330 0.758282 -0.258863 0.601627 0.790410 -0.115315 0.661229 0.739591 0.125624 0.727109 -0.426944 -0.537616 0.830582 -0.523348 -0.190368 0.845426 -0.531294 0.054610 0.862483 -0.472052 0.182458 0.939843 -0.280932 0.194351 0.958515 0.259950 0.116938 0.629190 0.721159 0.289912 0.092438 0.918255 0.385048 -0.364011 0.920874 0.139595 -0.539234 0.841668 0.028653 -0.635002 0.766011 0.099999 -0.703510 0.642065 0.304675 -0.702502 0.397864 0.590081 -0.597284 0.094343 0.796461 -0.487589 -0.126449 0.863868 -0.452819 -0.269967 0.849749 -0.549828 -0.387790 0.739803 -0.790629 -0.541852 0.285134 -0.617604 -0.739621 -0.267445 -0.208630 -0.689238 -0.693848 0.044481 -0.289815 -0.956048 0.168905 -0.127688 -0.977326 0.311964 -0.142557 -0.939338 0.511762 -0.262416 -0.818069 -0.568021 -0.813465 -0.125006 -0.310942 -0.940598 0.136348 -0.101951 -0.952570 0.286732 0.043672 -0.947954 0.315398 0.164018 -0.975631 0.145749 0.353208 -0.830974 -0.429798 0.673172 -0.383268 -0.632413 0.752776 0.206042 -0.625200 0.506978 0.608457 -0.610535 0.384342 0.746344 -0.543370 0.396133 0.819040 -0.415032 0.485347 0.853983 -0.187488 0.579994 0.800482 0.151117 0.601884 0.646588 0.468679 0.560634 0.500325 0.659821 0.477195 0.436332 0.762823 0.301509 0.489697 0.818101 -0.158659 0.601059 0.783298 -0.684573 0.349663 0.639606 -0.949543 -0.043413 0.310618 -0.945645 -0.141863 -0.292626 -0.849797 -0.197350 -0.488772 -0.805189 -0.338127 -0.487176 -0.740825 -0.561595 -0.368496 -0.719558 0.420141 0.552918 -0.545591 0.210215 0.811259 -0.391801 0.036387 0.919330 -0.333543 -0.100304 0.937384 -0.423025 -0.260657 0.867818 -0.659100 -0.563545 0.498001 -0.499695 -0.866201 0.000728 -0.158368 -0.853120 -0.497098 -0.014781 -0.497465 -0.867358 0.079235 -0.339994 -0.937083 0.226811 -0.321997 -0.919171 0.454463 -0.367937 -0.811225 0.723637 -0.413111 -0.552891 0.888617 -0.399004 -0.226178 0.939853 -0.341521 0.006352 0.962658 -0.246787 0.111292 0.997063 -0.042849 0.063471 0.889852 0.441439 -0.115302 0.499556 0.866282 -0.000573 -0.063372 0.991386 0.114621 -0.536449 0.841538 -0.063523 -0.695890 0.709471 -0.111302 -0.766361 0.642379 -0.006311 -0.790211 0.569538 0.226260 0.403171 0.902528 -0.151317 0.496828 0.847449 0.187060 0.511214 0.752996 0.414316 0.454240 0.706634 0.542525 0.273574 0.743931 0.609692 -0.198021 0.755433 0.624586 -0.668337 0.391448 0.632530 -0.895869 -0.109887 0.430516 -0.926680 -0.346528 -0.145543 -0.842552 -0.436907 -0.314990 -0.773738 -0.565091 -0.286359 -0.658940 -0.739755 -0.136236 -0.420440 -0.898686 0.124873 -0.115691 -0.922390 0.368528 0.110364 -0.866196 0.487364 0.254768 -0.834293 0.488926 0.350693 -0.889609 0.292592 0.437626 -0.844007 -0.310058 0.645030 -0.418185 -0.639576 0.599267 0.162710 -0.783839 0.272765 0.505258 -0.818727 0.138695 0.630805 -0.763445 0.152507 0.735281 -0.660381 0.258789 0.844405 -0.469050 0.695801 -0.409544 -0.590029 0.907954 -0.287623 -0.304783 0.981028 -0.165902 -0.100304 0.998564 -0.045016 -0.029053 0.979324 0.146075 -0.139954 0.748330 0.539525 -0.385895 0.308754 0.905524 -0.291029 -0.254970 0.959797 -0.117391 -0.713995 0.672735 -0.194009 -0.840782 0.509859 -0.182017 -0.883372 0.465532 -0.054168 -0.868791 0.456984 0.190702 -0.733282 0.416184 0.537669 -0.482953 0.312635 0.817934 -0.279089 0.199963 0.939215 -0.194616 0.083655 0.977306 -0.272888 -0.105374 0.956258 -0.491878 -0.524842 0.694691 -0.330845 -0.904558 0.268918 -0.073689 -0.955948 -0.284135 -0.061388 -0.670892 -0.739009 -0.007943 -0.528229 -0.849065 0.133775 -0.486507 -0.863374 0.380004 -0.470786 -0.796215 -0.212899 -0.899418 0.381734 0.138424 -0.804773 0.577217 0.368660 -0.674961 0.639154 0.499222 -0.621806 0.603436 0.555994 -0.736538 0.385204 0.518929 -0.825346 -0.222522 0.594030 -0.470573 -0.652449 0.397315 0.036198 -0.916968 -0.003698 0.289384 -0.957206 -0.147653 0.396664 -0.906011 -0.140463 0.525423 -0.839167 -0.032305 0.703223 -0.710235 0.147435 0.880180 -0.451160 0.309743 0.942412 -0.126171 0.383531 0.916422 0.114342 0.357417 0.897694 0.257678 0.180609 0.920554 0.346353 -0.265985 0.848951 0.456657 -0.628274 0.427399 0.650078 -0.776047 -0.138558 0.615267 -0.855336 -0.515191 0.054576 -0.776955 -0.623122 -0.089771 -0.684497 -0.727897 -0.040382 -0.520850 -0.844323 0.125830 -0.729829 0.398764 0.555281 -0.402248 0.438121 0.803895 -0.151516 0.407088 0.900735 -0.039988 0.323544 0.945368 -0.088932 0.118796 0.988928 -0.249593 -0.391843 0.885529 -0.074250 -0.833844 0.546983 0.073031 -0.996722 -0.034808 -0.075434 -0.841450 -0.535044 -0.070828 -0.732708 -0.676848 0.054025 -0.677478 -0.733556 0.301029 -0.605603 -0.736632 0.637543 -0.435179 -0.635734 0.874035 -0.198179 -0.443607 0.955193 -0.011084 -0.295777 0.955490 0.124865 -0.267296 0.865778 0.267612 -0.422863 0.515350 0.526780 -0.675956 0.037763 0.823039 -0.566729 -0.489219 0.821598 -0.292645 -0.887912 0.407820 -0.212826 -0.961999 0.235900 -0.137510 -0.973642 0.228080 0.001126 -0.925300 0.299516 0.232617 -0.197921 0.695350 -0.690881 0.005354 0.892197 -0.451615 0.135051 0.961294 -0.240157 0.146125 0.984757 -0.094348 -0.004259 0.999460 0.032590 -0.365069 0.887664 0.280673 -0.550942 0.494300 0.672407 -0.559798 -0.068109 0.825825 -0.691588 -0.635707 0.342902 -0.612048 -0.754081 0.238241 -0.488333 -0.820297 0.297733 -0.271030 -0.852922 0.446170 0.089156 -0.774660 0.626062 0.440956 -0.562924 0.699053 0.640169 -0.382622 0.666171 0.743154 -0.326405 0.584108 0.772689 -0.504392 0.385409 0.640161 -0.755761 -0.137909 0.539540 -0.541816 -0.644462 0.161623 -0.190826 -0.968227 -0.282917 -0.040735 -0.958279 -0.430019 0.051504 -0.901350 -0.443241 0.193686 -0.875227 -0.366359 0.416827 -0.831888 0.561208 -0.492100 -0.665494 0.749176 -0.187614 -0.635245 0.809957 0.041617 -0.585011 0.781524 0.179993 -0.597346 0.628225 0.258593 -0.733800 0.196863 0.371639 -0.907265 -0.308251 0.592602 -0.744180 -0.750650 0.568490 -0.336665 -0.992445 0.117514 -0.035271 -0.994430 -0.016384 0.104118 -0.970867 0.023009 0.238513 -0.893615 0.169057 0.415779 -0.675213 0.395060 0.622909 -0.337321 0.576366 0.744323 -0.077484 0.631501 0.771494 0.060671 0.591144 0.804281 0.091477 0.409103 0.907891 0.079562 -0.109411 0.990807 0.281438 -0.604912 0.744899 0.307429 -0.930941 0.197068 0.034668 -0.967928 -0.248825 -0.003057 -0.912690 -0.408642 0.091853 -0.852457 -0.514665 0.294927 -0.734992 -0.610578 0.460351 -0.497211 0.735431 0.717095 -0.260925 0.646291 0.848471 -0.096081 0.520447 0.916263 -0.055077 0.396773 0.947854 -0.216013 0.234331 0.803192 -0.577944 -0.144441 0.494138 -0.590949 -0.637657 -0.046700 -0.446547 -0.893541 -0.482893 -0.368472 -0.794382 -0.627938 -0.276500 -0.727490 -0.671356 -0.132220 -0.729246 -0.651094 0.091504 -0.753462 -0.550038 0.389781 -0.738599 -0.380134 0.661802 -0.646155 -0.235699 0.820425 -0.520911 -0.189217 0.898481 -0.396143 -0.279874 0.932003 -0.230307 -0.497469 0.856230 0.139262 -0.473620 0.583285 0.659896 -0.319449 0.064792 0.945386 -0.359987 -0.594138 0.719312 -0.260267 -0.715894 0.647886 -0.102109 -0.731426 0.674233 0.141357 -0.670950 0.727904 -0.535828 0.468123 0.702673 -0.280925 0.677732 0.679530 -0.063328 0.775192 0.628544 0.092325 0.776573 0.623225 0.219135 0.658965 0.719545 0.389021 0.235644 0.890581 0.622340 -0.305877 0.720508 0.568380 -0.775144 0.275855 0.275003 -0.960339 -0.046072 0.198582 -0.957359 -0.209830 0.238530 -0.902743 -0.357993 0.345593 -0.777448 -0.525491 0.472210 -0.551990 -0.687258 0.553239 -0.280131 -0.784509 0.563497 -0.061418 -0.823832 0.503665 0.070935 -0.860982 0.322832 0.119628 -0.938866 -0.128226 0.140991 -0.981672 -0.630388 0.302840 -0.714772 -0.935118 0.309118 -0.173207 -0.960639 0.012227 0.277532 -0.893002 -0.043015 0.447992 -0.829436 0.041090 0.557088 -0.727087 0.221775 0.649739 -0.784601 0.153560 -0.600684 -0.675866 0.413455 -0.610131 -0.558949 0.602005 -0.570233 -0.494548 0.721070 -0.485263 -0.518520 0.795862 -0.312635 -0.594944 0.796134 0.110508 -0.393808 0.637344 0.662350 -0.061817 0.185569 0.980685 0.073984 -0.337129 0.938547 0.191283 -0.463945 0.864966 0.347536 -0.456628 0.818968 0.549447 -0.365221 0.751479 0.759158 -0.200804 0.619158 0.900346 -0.022006 0.434618 0.961560 0.096358 0.257132 0.987088 0.119867 0.106249 0.998755 -0.012085 -0.048399 0.855861 -0.413273 -0.310980 0.400620 -0.630484 -0.664826 -0.212213 -0.621056 -0.754490 -0.605131 -0.557379 -0.568458 -0.744809 -0.457100 -0.486128 -0.809429 -0.315488 -0.495270 -0.828691 -0.110888 -0.548613 0.354960 -0.606332 -0.711593 0.358297 -0.373306 -0.855726 0.323215 -0.175939 -0.929827 0.240450 -0.050289 -0.969358 0.052661 -0.008649 -0.998575 -0.395169 -0.030292 -0.918109 -0.844610 0.116772 -0.522492 -0.973238 0.216457 0.077167 -0.843846 0.090962 0.528818 -0.723377 0.088118 0.684807 -0.631806 0.194565 0.750310 -0.520841 0.381258 0.763785 -0.358397 0.606558 0.709675 -0.164380 0.786477 0.595342 0.011028 0.875783 0.482579 0.161955 0.889566 0.427134 0.331099 0.814551 0.476319 0.602256 0.455392 0.655672 0.838363 -0.126329 0.530273 0.737760 -0.648224 0.188455 0.435566 -0.899946 -0.019480 0.311937 -0.937040 -0.157008 0.293071 -0.902929 -0.314369 0.321819 -0.797731 -0.509959 0.920386 -0.024069 0.390268 0.981756 0.131850 0.137004 0.971982 0.223829 -0.071777 0.945785 0.231702 -0.227606 0.927485 0.096637 -0.361155 0.772441 -0.383623 -0.506131 0.247836 -0.699100 -0.670698 -0.353681 -0.713288 -0.605087 -0.693041 -0.640595 -0.330653 -0.813728 -0.538962 -0.217641 -0.885970 -0.402661 -0.230045 -0.927028 -0.201057 -0.316537 -0.901659 0.067992 -0.427070 -0.799666 0.331973 -0.500328 -0.679454 0.524193 -0.513385 -0.597645 0.653172 -0.464959 -0.583254 0.751513 -0.308290 -0.585031 0.796405 0.153222 -0.249463 0.689386 0.680085 0.195239 0.331610 0.922993 0.379507 -0.125491 0.916639 0.475869 -0.275150 0.835369 0.605685 -0.275700 0.746415 0.771341 -0.183293 0.609456 -0.199198 0.738028 0.644698 -0.017774 0.911982 0.409845 0.127839 0.967268 0.219203 0.251089 0.960467 0.120241 0.415649 0.897173 0.149384 0.740358 0.526596 0.417812 0.940416 -0.073482 0.331990 0.799371 -0.596391 0.072960 0.451087 -0.892473 -0.003564 0.281272 -0.956834 -0.073170 0.228463 -0.949041 -0.217083 0.226847 -0.863293 -0.450850 0.224706 -0.651710 -0.724418 0.192295 -0.376547 -0.906220 0.139180 -0.158834 -0.977446 0.055182 -0.032524 -0.997946 -0.126496 -0.009346 -0.991923 -0.592970 -0.105340 -0.798305 -0.949130 0.059828 -0.309149 -0.934536 0.250164 0.253103 -0.709791 0.165909 0.684595 -0.554080 0.149472 0.818934 -0.458223 0.258767 0.850336 -0.355795 0.474213 0.805315 -0.951937 0.072575 -0.297571 -0.796912 0.385974 -0.464711 -0.631313 0.568828 -0.527141 -0.531446 0.677292 -0.508765 -0.518972 0.772872 -0.365153 -0.527794 0.826178 0.197136 -0.109572 0.747523 0.655136 0.367922 0.455804 0.810479 0.526262 -0.043864 0.849190 0.565168 -0.247263 0.787049 0.670791 -0.266087 0.692269 0.842923 -0.164481 0.512276 0.984039 0.042950 0.172692 0.955924 0.230284 -0.182148 0.858687 0.318764 -0.401305 0.786560 0.317870 -0.529417 0.767322 0.169206 -0.618536 0.646645 -0.456339 -0.611232 0.117164 -0.763439 -0.635164 -0.444753 -0.752523 -0.485699 -0.727318 -0.679174 -0.098647 -0.805873 -0.587726 0.071740 -0.881940 -0.467153 0.062856 -0.962515 -0.260607 -0.075164 0.110934 -0.690362 -0.714908 0.063257 -0.306740 -0.949689 0.019510 -0.054132 -0.998343 -0.047028 0.062738 -0.996921 -0.219919 0.045086 -0.974476 -0.731816 -0.167668 -0.660555 -0.985297 0.055124 -0.161711 -0.890051 0.317281 0.327324 -0.597771 0.197235 0.777025 -0.409485 0.109964 0.905666 -0.321380 0.206333 0.924198 -0.239942 0.466958 0.851104 -0.084047 0.826208 0.557060 0.084548 0.984812 0.151647 0.182735 0.978288 -0.097776 0.264759 0.942841 -0.202370 0.417313 0.896029 -0.151600 0.814646 0.505373 0.284517 0.980137 -0.057455 0.189819 0.823233 -0.567313 -0.021041 0.428439 -0.901820 0.056217 0.219067 -0.971669 0.088706 0.149181 -0.988509 -0.024407 0.134121 -0.943662 -0.302513 0.998432 0.046479 0.031184 0.858620 0.282339 -0.427851 0.691272 0.368445 -0.621604 0.605615 0.360384 -0.709474 0.618471 0.193365 -0.761646 0.557884 -0.560495 -0.612055 0.041920 -0.803823 -0.593389 -0.491133 -0.763429 -0.419482 -0.713286 -0.695699 0.085005 -0.721160 -0.612729 0.323251 -0.793706 -0.513893 0.325490 -0.933784 -0.321626 0.156857 -0.974239 0.088611 -0.207378 -0.742501 0.450705 -0.495537 -0.539200 0.598823 -0.592178 -0.443466 0.677084 -0.587278 -0.463836 0.769728 -0.438606 -0.496676 0.828322 0.259222 -0.026677 0.792887 0.608784 0.461904 0.547813 0.697528 0.585422 -0.018964 0.810507 0.547540 -0.282224 0.787750 0.633544 -0.315281 0.706555 0.832131 -0.215805 0.510869 -0.022775 0.862788 0.505052 0.115746 0.991711 -0.055779 0.170326 0.933099 -0.316727 0.227132 0.886727 -0.402649 0.387596 0.866492 -0.314582 0.847408 0.478436 0.230215 0.994188 -0.043080 0.098666 0.835264 -0.542291 -0.090856 0.411843 -0.901222 0.134845 0.178773 -0.947036 0.266764 0.108330 -0.977211 0.182546 0.085259 -0.989900 -0.113267 0.035991 -0.736761 -0.675194 -0.017473 -0.239163 -0.970822 -0.044437 0.029010 -0.998591 -0.096842 0.126541 -0.987223 -0.274824 0.059396 -0.959658 -0.812814 -0.242276 -0.529751 -0.995777 0.049895 -0.077056 -0.863766 0.362695 0.349802 -0.515853 0.187004 0.836018 -0.297226 0.019106 0.954616 -0.222668 0.102425 0.969499 -0.166134 0.395092 0.903494 -0.989178 0.073002 -0.127270 -0.707288 0.470357 -0.527738 -0.490033 0.590901 -0.640862 -0.407432 0.652999 -0.638429 -0.466897 0.751278 -0.466464 -0.489031 0.815468 0.309614 0.006737 0.821870 0.569635 0.501228 0.606084 0.617602 0.590836 -0.028883 0.806275 0.489037 -0.321876 0.810702 0.565100 -0.355038 0.744721 0.787280 -0.263972 0.557234 0.999442 0.027039 -0.019625 0.770901 0.301930 -0.560847 0.568444 0.383443 -0.727903 0.487829 0.368975 -0.791126 0.542863 0.173210 -0.821765 0.518771 -0.625743 -0.582514 0.010674 -0.827404 -0.561505 -0.507882 -0.771833 -0.382530 -0.666226 -0.709413 0.229948 -0.599550 -0.621405 0.504376 -0.667758 -0.541782 0.510462 -0.859075 -0.379694 0.343254 0.003717 -0.789035 -0.614337 -0.061806 -0.216081 -0.974417 -0.081520 0.060053 -0.994861 -0.129371 0.143263 -0.981192 -0.325224 0.024440 -0.945321 -0.845400 -0.304600 -0.438767 -0.999095 0.030078 -0.030086 -0.854804 0.370791 0.363076 -0.448189 0.129350 0.884531 -0.217259 -0.069112 0.973664 -0.157100 0.008308 0.987548 -0.121500 0.307974 0.943605 -0.003381 0.861142 0.508353 0.107123 0.982448 -0.152712 0.139623 0.899345 -0.414347 0.189024 0.853524 -0.485559 0.374681 0.856642 -0.354652 0.855945 0.478173 0.196745 0.998863 -0.023607 0.041423 0.844328 -0.518170 -0.136417 0.398264 -0.889191 0.225221 0.162523 -0.898340 0.408131 0.101225 -0.935446 0.338666 0.076616 -0.995857 0.048980 0.999889 0.008077 -0.012489 0.733214 0.303503 -0.608509 0.512726 0.383333 -0.768223 0.437815 0.362856 -0.822589 0.533887 0.126328 -0.836066 0.509827 -0.647469 -0.566445 0.006371 -0.838110 -0.545464 -0.505382 -0.784926 -0.358441 -0.594303 -0.723725 0.350751 -0.491160 -0.623695 0.608085 -0.559447 -0.557976 0.612930 -0.776163 -0.425885 0.464966 -0.998671 0.027833 -0.043381 -0.719261 0.457288 -0.523021 -0.497977 0.573148 -0.650785 -0.425070 0.632373 -0.647626 -0.518021 0.736169 -0.435557 -0.495202 0.800292 0.338095 0.011161 0.836456 0.547920 0.510323 0.638689 0.575888 0.562872 -0.070340 0.823545 0.442678 -0.348260 0.826288 0.515873 -0.375251 0.770105 0.744921 -0.291833 0.599939 -0.002174 0.833921 0.551879 0.088797 0.985471 -0.144783 0.114144 0.901456 -0.417549 0.166587 0.859416 -0.483378 0.382967 0.869829 -0.311020 0.852441 0.495123 0.167922 1.000000 0.000046 -0.000129 0.852454 -0.495019 -0.168158 0.383082 -0.869785 0.311001 0.166739 -0.859373 0.483401 0.114296 -0.901424 0.417579 0.088908 -0.985456 0.144816 -0.002204 -0.833914 -0.551890 -0.091263 -0.241692 -0.966052 -0.114253 0.046821 -0.992348 -0.164952 0.123878 -0.978491 -0.383482 -0.046261 -0.922389 -0.853285 -0.348801 -0.387611 -1.000000 -0.000071 0.000109 -0.853241 0.348679 0.387818 -0.383350 0.046318 0.922441 -0.164776 -0.123814 0.978529 -0.114071 -0.046760 0.992372 -0.091106 0.241754 0.966051 -0.998670 -0.027816 0.043424 -0.776212 0.425904 -0.464866 -0.559556 0.557990 -0.612817 -0.491278 0.623701 -0.607983 -0.594359 0.723709 -0.350690 -0.505358 0.784871 0.358595 0.006429 0.838074 0.545518 0.509896 0.647482 0.566368 0.534024 -0.126422 0.835964 0.437971 -0.362922 0.822477 0.512864 -0.383386 0.768106 0.733289 -0.303549 0.608395 0.999890 -0.008098 0.012425 0.744842 0.291887 -0.600011 0.515728 0.375327 -0.770165 0.442513 0.348335 -0.826344 0.562731 0.070398 -0.823637 0.510261 -0.638594 -0.576047 0.011124 -0.836416 -0.547983 -0.495200 -0.800321 -0.338029 -0.517896 -0.736253 0.435564 -0.424923 -0.632466 0.647632 -0.497845 -0.573236 0.650808 -0.719190 -0.457356 0.523060 -0.003458 -0.861142 -0.508352 -0.121717 -0.307851 -0.943617 -0.157337 -0.008130 -0.987511 -0.217485 0.069310 -0.973600 -0.448372 -0.129169 -0.884465 -0.854870 -0.370821 -0.362889 -0.999083 -0.030184 0.030350 -0.845303 0.304444 0.439063 -0.325041 -0.024506 0.945382 -0.129151 -0.143337 0.981211 -0.081294 -0.060117 0.994875 -0.061604 0.216064 0.974434 0.003807 0.789040 0.614330 0.076535 0.995867 -0.048909 0.101083 0.935499 -0.338561 0.162367 0.898411 -0.408037 0.398123 0.889247 -0.225249 0.844325 0.518231 0.136209 0.998849 0.023679 -0.041720 0.855926 -0.478075 -0.197065 0.374738 -0.856642 0.354594 0.189160 -0.853541 0.485475 0.139756 -0.899359 0.414273 0.107201 -0.982444 0.152685 0.999440 -0.027181 0.019504 0.787190 0.264029 -0.557333 0.564918 0.355182 -0.744791 0.488819 0.322040 -0.810769 0.590641 0.028998 -0.806413 0.501070 -0.605957 -0.617855 0.006610 -0.821762 -0.569793 -0.489082 -0.815457 -0.309562 -0.466721 -0.751400 0.466444 -0.407246 -0.653159 0.638384 -0.489868 -0.591053 0.640848 -0.707197 -0.470456 0.527773 -0.989172 -0.072922 0.127365 -0.859094 0.379837 -0.343048 -0.667838 0.541917 -0.510214 -0.599626 0.621525 -0.504139 -0.666194 0.709491 -0.229798 -0.507749 0.771793 0.382787 0.010870 0.827303 0.561651 0.518955 0.625654 0.582446 0.543060 -0.173483 0.821577 0.488026 -0.369198 0.790900 0.568609 -0.383650 0.727665 0.770985 -0.302132 0.560624 0.036250 0.736758 0.675184 0.085290 0.989890 0.113333 0.108240 0.977245 -0.182417 0.178637 0.947095 -0.266647 0.411736 0.901266 -0.134881 0.835298 0.542285 0.090578 0.994140 0.043109 -0.099128 0.847305 -0.478384 -0.230699 0.387594 -0.866553 0.314414 0.227243 -0.886801 0.402423 0.170415 -0.933152 0.316521 0.115731 -0.991719 0.055671 -0.023003 -0.862796 -0.505029 -0.166535 -0.394965 -0.903476 -0.223093 -0.102185 -0.969427 -0.297636 -0.018810 -0.954494 -0.516203 -0.186701 -0.835869 -0.863921 -0.362591 -0.349525 -0.995742 -0.049931 0.077493 -0.812570 0.242107 0.530203 -0.274484 -0.059559 0.959745 -0.096464 -0.126731 0.987235 -0.044046 -0.029185 0.998603 -0.017100 0.239074 0.970851 -0.974213 -0.088391 0.207596 -0.933737 0.321942 -0.156486 -0.793705 0.514186 -0.325031 -0.721139 0.612995 -0.322794 -0.713119 0.695911 -0.084674 -0.490795 0.763453 0.419833 0.042375 0.803643 0.593601 0.558287 0.560212 0.611946 0.618817 -0.193783 0.761258 0.605914 -0.360765 0.709026 0.691495 -0.368822 0.621132 0.858709 -0.282732 0.427412 0.998408 -0.046828 -0.031449 0.832034 0.215726 -0.511059 0.633321 0.315395 -0.706704 0.547249 0.282399 -0.787889 0.585126 0.019047 -0.810719 0.461540 -0.547705 -0.697854 -0.027012 -0.792700 -0.609013 -0.496843 -0.828243 -0.259153 -0.463621 -0.769848 0.438622 -0.443225 -0.677264 0.587252 -0.538998 -0.598984 0.592199 -0.742400 -0.450751 0.495648 -0.084537 -0.826236 -0.556945 -0.240648 -0.466875 -0.850950 -0.322143 -0.206109 -0.923982 -0.410235 -0.109650 -0.905364 -0.598411 -0.196847 -0.776631 -0.890344 -0.316993 -0.326808 -0.985178 -0.055060 0.162457 -0.731301 0.167525 0.661161 -0.219305 -0.045273 0.974605 -0.046345 -0.062977 0.996938 0.020219 0.053923 0.998340 0.063949 0.306636 0.949676 0.111483 0.690333 0.714851 0.134387 0.943615 0.302540 0.149245 0.988496 0.024526 0.219037 0.971687 -0.088587 0.428441 0.901819 -0.056230 0.823314 0.567210 0.020662 0.980001 0.057441 -0.190522 0.814379 -0.505443 -0.285155 0.417178 -0.896142 0.151302 0.264745 -0.942919 0.202024 0.182670 -0.978328 0.097501 0.084319 -0.984818 -0.151736 0.983938 -0.043459 -0.173138 0.842777 0.164190 -0.512610 0.670532 0.266016 -0.692547 0.564815 0.247271 -0.787300 0.525806 0.043810 -0.849476 0.367277 -0.455674 -0.810845 -0.110149 -0.747278 -0.655318 -0.528004 -0.826091 -0.196942 -0.518792 -0.772982 0.365176 -0.531216 -0.677445 0.508801 -0.631123 -0.568912 0.527278 -0.796802 -0.385872 0.464984 -0.951839 -0.072209 0.297973 -0.962353 0.261046 0.075706 -0.881781 0.467539 -0.062205 -0.805693 0.588053 -0.071083 -0.727020 0.679410 0.099218 -0.444189 0.752525 0.486212 0.117892 0.763203 0.635313 0.647268 0.456030 0.610803 0.767783 -0.169771 0.617808 0.786867 -0.318413 0.528634 0.858848 -0.319294 0.400538 0.955918 -0.230827 0.181491 0.225352 0.651725 0.724204 0.227235 0.863244 0.450748 0.228643 0.948989 0.217122 0.281323 0.956813 0.073250 0.451099 0.892467 0.003521 0.799356 0.596355 -0.073425 0.940123 0.073551 -0.332806 0.739928 -0.526692 -0.418452 0.415384 -0.897230 -0.149784 0.250908 -0.960470 -0.120593 0.127600 -0.967254 -0.219403 -0.018163 -0.911984 -0.409823 -0.199814 -0.738034 -0.644500 -0.356615 -0.474102 -0.805018 -0.459122 -0.258505 -0.849931 -0.554958 -0.149098 -0.818408 -0.710515 -0.165444 -0.683957 -0.934835 -0.249784 -0.252371 -0.948846 -0.059723 0.310038 -0.592295 0.105323 0.798808 -0.125679 0.009268 0.992028 0.056083 0.032402 0.997900 0.140087 0.158762 0.977328 0.193132 0.376557 0.906038 -0.901407 -0.067533 0.427674 -0.926666 0.201546 0.317285 -0.885567 0.403053 0.230910 -0.813302 0.539248 0.218518 -0.692528 0.640769 0.331392 -0.352906 0.713269 0.605561 0.248769 0.698898 0.670564 0.773136 0.383397 0.505240 0.927886 -0.097275 0.359951 0.945915 -0.232343 0.226410 0.971912 -0.224471 0.070708 0.981548 -0.132517 -0.137848 0.920146 0.023446 -0.390872 0.771067 0.182876 -0.609928 0.605286 0.275515 -0.746807 0.475331 0.275072 -0.835701 0.378823 0.125325 -0.916944 0.194342 -0.331651 -0.923168 -0.250158 -0.689204 -0.680014 -0.585124 -0.796414 -0.152822 -0.583006 -0.751648 0.308430 -0.597367 -0.653309 0.465123 -0.679221 -0.524202 0.513684 -0.799474 -0.331743 0.500787 -0.359104 -0.606652 -0.709238 -0.521836 -0.381251 -0.763108 -0.632941 -0.194423 -0.749390 -0.724483 -0.087868 -0.683669 -0.844689 -0.090608 -0.527532 -0.973396 -0.216165 -0.075976 -0.843883 -0.116906 0.523637 -0.394081 0.030181 0.918580 0.053882 0.008667 0.998510 0.241751 0.050300 0.969034 0.324437 0.175998 0.929390 0.359313 0.373409 0.855254 0.355659 0.606389 0.711195 0.322174 0.797697 0.509787 0.293147 0.902877 0.314449 0.311834 0.937037 0.157229 0.435416 0.900015 0.019631 0.737571 0.648326 -0.188843 0.837749 0.126730 -0.531145 0.601615 -0.455282 -0.656337 0.330772 -0.814481 -0.476667 0.161775 -0.889464 -0.427414 0.010802 -0.875739 -0.482664 -0.164788 -0.786534 -0.595155 0.758843 0.200337 -0.619695 0.549077 0.364991 -0.751862 0.346934 0.456658 -0.819207 0.190457 0.464061 -0.865086 0.073034 0.337038 -0.938654 -0.062753 -0.185660 -0.980608 -0.394362 -0.637142 -0.662215 -0.594750 -0.796308 -0.110301 -0.518053 -0.796205 0.312535 -0.494073 -0.721426 0.485218 -0.558566 -0.602221 0.570381 -0.675575 -0.413389 0.610498 -0.784241 -0.153262 0.601230 -0.828191 0.111126 0.549319 -0.808890 0.315517 0.496131 -0.744300 0.456950 0.487046 -0.604635 0.557111 0.569249 -0.211556 0.620759 0.754918 0.401286 0.630407 0.664497 0.856128 0.413554 0.309867 0.998828 0.011936 0.046895 0.986905 -0.120117 -0.107659 0.961217 -0.096684 -0.258292 0.899960 0.021553 -0.435440 0.472567 0.552119 0.686910 0.345572 0.777344 0.525657 0.238233 0.902568 0.358631 0.198121 0.957255 0.210741 0.274549 0.960427 0.046944 0.567919 0.775521 -0.275747 0.621253 0.306999 -0.720969 0.388208 -0.234890 -0.891135 0.219029 -0.658531 -0.719975 0.092460 -0.776154 -0.623727 -0.063198 -0.774943 -0.628864 -0.280974 -0.677768 -0.679473 -0.536286 -0.468383 -0.702151 -0.727943 -0.222066 -0.648680 -0.830436 -0.041374 -0.555576 -0.893919 0.042733 -0.446187 -0.961174 -0.012425 -0.275665 -0.934818 -0.309314 0.174469 -0.629017 -0.303621 0.715648 -0.126769 -0.141461 0.981793 0.324157 -0.119516 0.938423 0.504990 -0.070678 0.860226 0.564647 0.061736 0.823021 0.554038 0.280443 0.783833 -0.549679 -0.389813 0.738849 -0.650553 -0.091765 0.753897 -0.670769 0.131577 0.729902 -0.627415 0.275598 0.728283 -0.482449 0.367461 0.795120 -0.046125 0.445699 0.893994 0.494389 0.590871 0.637536 0.802711 0.578748 0.143894 0.947456 0.216394 -0.235585 0.915728 0.055301 -0.397974 0.847901 0.096174 -0.521358 0.716666 0.260720 -0.646850 0.460173 0.496897 -0.735754 0.140972 0.670950 -0.727979 -0.102918 0.731594 -0.673927 -0.261338 0.715994 -0.647345 -0.361058 0.593869 -0.718997 -0.320296 -0.064532 -0.945117 -0.474058 -0.582922 -0.659903 -0.496980 -0.856459 -0.139605 -0.279216 -0.932396 0.229513 -0.188561 -0.898944 0.395404 -0.235158 -0.820864 0.520464 -0.379794 -0.662038 0.646114 -0.675369 -0.395275 -0.622603 -0.894020 -0.169681 -0.414653 -0.971246 -0.023883 -0.236875 -0.994637 0.015409 -0.102275 -0.992291 -0.118290 0.036964 -0.749825 -0.569214 0.337280 -0.306431 -0.593702 0.744055 0.198353 -0.372177 0.906720 0.629229 -0.258171 0.733088 0.782444 -0.179258 0.596362 0.810661 -0.040853 0.584089 0.749511 0.188195 0.634677 0.561185 0.492141 0.665484 0.294774 0.734473 0.611275 0.091600 0.851720 0.515928 -0.003383 0.911985 0.410210 0.034329 0.967541 0.250371 0.306656 0.931377 -0.196210 0.279860 0.606386 -0.744295 0.078448 0.110708 -0.990752 0.091403 -0.408064 -0.908366 0.060821 -0.590049 -0.805073 -0.077281 -0.630640 -0.772218 -0.337156 -0.575999 -0.744682 0.089117 0.774444 -0.626334 -0.271393 0.852906 -0.445980 -0.489052 0.820141 -0.296978 -0.612914 0.753678 -0.237291 -0.692428 0.635031 -0.342462 -0.560909 0.068631 -0.825028 -0.551460 -0.493893 -0.672281 -0.364583 -0.887617 -0.281453 -0.003755 -0.999417 -0.033948 0.146635 -0.984808 0.093017 0.135533 -0.961479 0.239141 0.005687 -0.892433 0.451144 -0.197590 -0.695514 0.690809 -0.365750 -0.417324 0.831906 -0.442452 -0.194680 0.875406 -0.429233 -0.052807 0.901649 -0.282215 0.039319 0.958545 0.162488 0.189691 0.968305 0.539719 0.541609 0.644487 0.639307 0.756429 0.138209 0.772000 0.504789 -0.386270 0.742324 0.326762 -0.584963 0.639428 0.382851 -0.666751 0.440559 0.562792 -0.699409 0.637506 0.435087 0.635834 0.301173 0.604753 0.737271 0.054243 0.676271 0.734653 -0.070610 0.731454 0.678226 -0.075257 0.840555 0.536474 0.072467 0.996721 0.035994 -0.075733 0.834688 -0.545491 -0.250745 0.392846 -0.884759 -0.089218 -0.117540 -0.989052 -0.040236 -0.322066 -0.945862 -0.151701 -0.405823 -0.901274 -0.402321 -0.437424 -0.804238 -0.729876 -0.398913 -0.555112 -0.925210 -0.300406 -0.231823 -0.973333 -0.229396 -0.000004 -0.961471 -0.237339 0.138725 -0.887170 -0.408884 0.213877 -0.488174 -0.822242 0.292582 0.039564 -0.823631 0.565744 0.516618 -0.526849 0.674934 0.866373 -0.266784 0.422166 0.955892 -0.123664 0.266417 0.955417 0.012221 0.295006 0.874067 0.198908 0.443218 0.147608 -0.880247 0.450974 -0.031911 -0.703526 0.709953 -0.139814 -0.526138 0.838827 -0.146915 -0.397663 0.905693 -0.002980 -0.290482 0.956876 0.398167 -0.036983 0.916567 0.594248 0.470351 0.652411 0.518450 0.825535 0.222938 0.555287 0.736844 -0.385638 0.498341 0.622283 -0.603672 0.367941 0.675265 -0.639247 0.138105 0.804740 -0.577339 -0.212922 0.899321 -0.381949 -0.521116 0.844184 -0.125663 -0.684935 0.727451 0.040973 -0.777438 0.622420 0.090469 -0.855832 0.514408 -0.054190 -0.776865 0.138551 -0.614235 -0.628671 -0.427232 -0.649805 -0.265820 -0.848646 -0.457319 0.180724 -0.920109 -0.347475 0.357610 -0.897288 -0.258822 0.383780 -0.916201 -0.115279 0.309949 -0.942412 0.125660 -0.733282 -0.416266 -0.537606 -0.868513 -0.457658 -0.190354 -0.882821 -0.466523 0.054626 -0.840046 -0.510907 0.182473 -0.713209 -0.673467 0.194358 -0.254074 -0.960092 0.116922 0.309985 -0.905458 0.289923 0.749031 -0.539143 0.385067 0.979511 -0.145149 0.139604 0.998521 0.046191 0.028664 0.980879 0.166955 0.100008 0.907787 0.288263 0.304675 0.695795 0.409500 0.590067 0.380323 0.470144 0.796441 0.134258 0.485539 0.863844 -0.007423 0.527183 0.849719 -0.060972 0.670094 0.739768 -0.074028 0.955624 0.285135 -0.331787 0.904644 -0.267462 -0.492614 0.525259 -0.693855 -0.273238 0.106349 -0.956050 -0.195024 -0.082475 -0.977325 -0.279421 -0.198938 -0.939333 -0.483118 -0.312042 -0.818063 -0.420508 0.898632 -0.125030 -0.659128 0.739569 0.136341 -0.773976 0.564573 0.286737 -0.842785 0.436157 0.315405 -0.926932 0.345763 0.145755 -0.896268 0.109557 -0.429768 -0.668520 -0.391398 -0.632367 -0.197942 -0.754976 -0.625164 0.273451 -0.743301 -0.610514 0.454178 -0.706038 -0.543354 0.511245 -0.752590 -0.415014 0.496912 -0.847311 -0.187464 0.403272 -0.902511 0.151148 0.259063 -0.844507 0.468716 0.153023 -0.735642 0.659860 0.139317 -0.631377 0.762859 0.273369 -0.505903 0.818127 0.599886 -0.163063 0.783292 0.645109 0.418086 0.639561 0.437146 0.844066 0.310575 0.349917 0.889886 -0.292678 0.253942 0.834599 -0.488833 0.109723 0.866352 -0.487232 -0.115988 0.922348 -0.368539 0.723609 0.413130 0.552914 0.454824 0.367430 0.811252 0.227391 0.321150 0.919323 0.079886 0.339031 0.937377 -0.014233 0.496704 0.867803 -0.158484 0.852626 0.497907 -0.500307 0.865848 0.000653 -0.659648 0.563664 -0.497140 -0.423404 0.261464 -0.867391 -0.334035 0.101316 -0.937100 -0.392238 -0.035480 -0.919179 -0.545852 -0.209659 -0.811227 -0.719559 -0.420180 -0.552887 -0.789828 -0.570103 -0.226172 -0.765663 -0.643210 0.006356 -0.695017 -0.710327 0.111297 -0.535595 -0.842084 0.063505 -0.062626 -0.991367 -0.115191 0.500462 -0.865759 -0.000499 0.890266 -0.440777 0.114641 0.997019 0.043818 -0.063512 0.962362 0.247936 -0.111295 0.939488 0.342524 -0.006308 0.888323 0.399612 0.226259 0.580063 -0.800400 -0.151283 0.485513 -0.853976 0.187089 0.396502 -0.819214 0.414337 0.384827 -0.746698 0.542541 0.507461 -0.608881 0.609710 0.753204 -0.206210 0.624628 0.673114 0.383083 0.632586 0.352708 0.830791 0.430562 0.163216 0.975796 -0.145543 0.042892 0.948126 -0.314988 -0.102530 0.952621 -0.286359 -0.311199 0.940527 -0.136253 -0.568097 0.813438 0.124833 -0.741010 0.561366 0.368473 -0.805378 0.337493 0.487304 -0.849948 0.196475 0.488862 -0.945798 0.141050 0.292526 -0.949728 0.042969 -0.310113 -0.684615 -0.349540 -0.639629 -0.158653 -0.600335 -0.783854 0.301245 -0.488843 -0.818708 0.477007 -0.435499 -0.763417 0.560577 -0.499693 -0.660349 0.601934 -0.646297 -0.469017 -0.702540 -0.397849 -0.590046 -0.703028 -0.642539 -0.304787 -0.634150 -0.766680 -0.100280 -0.538228 -0.842300 -0.029011 -0.363116 -0.921173 -0.139951 0.093170 -0.917787 -0.385987 0.629884 -0.720086 -0.291070 0.958711 -0.259023 -0.117389 0.939574 0.282061 -0.194016 0.861900 0.473280 -0.182031 0.844811 0.532315 -0.054181 0.830126 0.523949 0.190704 0.727034 0.426986 0.537684 0.512193 0.261965 0.817944 0.312696 0.141754 0.939216 0.169735 0.126757 0.977304 0.045137 0.289013 0.956260 -0.208682 0.688281 0.694782 -0.618036 0.738709 0.268963 -0.791082 0.541726 -0.284117 -0.550375 0.388570 -0.738986 -0.453536 0.270948 -0.849054 -0.488238 0.127348 -0.863369 -0.597701 -0.093750 -0.796219 -0.672512 0.634070 0.381684 -0.766143 0.282483 0.577260 -0.768774 0.018178 0.639262 -0.787993 -0.121461 0.603584 -0.915816 -0.113220 0.385307 -0.974234 -0.036767 -0.222520 -0.704578 -0.279319 -0.652342 -0.167338 -0.362356 -0.916895 0.252427 -0.141565 -0.957204 0.417289 -0.070538 -0.906032 0.525213 -0.141152 -0.839183 0.625144 -0.323698 -0.710221 0.688571 -0.567774 -0.451113 0.661366 -0.739386 -0.126108 0.602007 -0.790250 0.114419 0.598853 -0.758240 0.257774 0.706997 -0.616542 0.346457 0.868220 -0.193992 0.456684 0.684285 0.330615 0.649960 0.267996 0.741547 0.615050 -0.018613 0.998339 0.054530 -0.151294 0.984395 -0.089872 -0.288246 0.956699 -0.040510 -0.470867 0.873202 0.125710 0.710207 0.432693 0.555323 0.580509 0.129290 0.803924 0.428282 -0.072320 0.900747 0.300171 -0.127115 0.945378 0.147313 0.017675 0.988932 -0.214589 0.412144 0.885488 -0.685015 0.481295 0.546909 -0.899654 0.435203 -0.034941 -0.691014 0.486029 -0.535048 -0.599164 0.427646 -0.676847 -0.613744 0.291901 -0.733561 -0.674972 0.042059 -0.736643 -0.695608 -0.334568 -0.635762 -0.608589 -0.657870 -0.443651 -0.487132 -0.821704 -0.295811 -0.369543 -0.889935 -0.267309 -0.201064 -0.883620 -0.422835 0.198601 -0.709727 -0.675903 0.693952 -0.444246 -0.566636 0.956173 0.012805 -0.292521 0.797080 0.565135 -0.212804 0.685197 0.715257 -0.137522 0.684257 0.729241 0.001114 0.721974 0.651643 0.232628 0.701211 -0.176231 -0.690830 0.770016 -0.450717 -0.451586 0.764984 -0.597600 -0.240153 0.779758 -0.618930 -0.094356 0.867681 -0.496052 0.032589 0.951256 -0.127692 0.280725 0.703495 0.229893 0.672491 0.220857 0.518758 0.825901 -0.204769 0.916779 0.342908 -0.347035 0.907080 0.238271 -0.466240 0.833044 0.297756 -0.603164 0.661164 0.446157 -0.715510 0.310104 0.626004 -0.708068 -0.100439 0.698965 -0.651537 -0.363124 0.666064 -0.654339 -0.480422 0.583983 -0.823210 -0.417001 0.385274 -0.974575 -0.176515 -0.138009 -0.738938 -0.196276 -0.644551 -0.245994 -0.044464 -0.968251 0.106264 0.265456 -0.958249 0.259697 0.346732 -0.901296 0.389440 0.287092 -0.875165 0.544240 0.108926 -0.831828 -0.706733 -0.239980 -0.665535 -0.537005 -0.555004 -0.635292 -0.368875 -0.722242 -0.585062 -0.234822 -0.766795 -0.597397 -0.090097 -0.673328 -0.733833 0.223479 -0.356269 -0.907265 0.667378 -0.029278 -0.744143 0.867663 0.365882 -0.336587 0.598019 0.800710 -0.035171 0.483034 0.869377 0.104225 0.505347 0.829269 0.238614 0.593182 0.689344 0.415861 0.679694 0.387213 0.622963 0.667772 0.003934 0.744356 0.585610 -0.248682 0.771504 0.481586 -0.348164 0.804274 0.308523 -0.283822 0.907887 -0.134582 -0.014257 0.990800 -0.664620 0.058636 0.744877 -0.959951 0.199166 0.197047 -0.855577 0.453952 -0.248830 -0.788869 0.459020 -0.408639 -0.784160 0.346709 -0.514671 -0.783963 0.112093 -0.610603 -0.660845 -0.150073 0.735365 -0.584608 -0.490552 0.646214 -0.507557 -0.686734 0.520368 -0.505950 -0.765935 0.396684 -0.661058 -0.712843 0.234215 -0.902057 -0.406695 -0.144540 -0.758781 -0.132452 -0.637737 -0.363300 0.263766 -0.893555 -0.077592 0.602470 -0.794361 0.074582 0.682102 -0.727444 0.221237 0.647576 -0.729177 0.404849 0.518175 -0.753387 0.612634 0.281507 -0.738535 0.763248 -0.001674 -0.646104 0.828385 -0.206089 -0.520870 0.872730 -0.285372 -0.396112 0.947091 -0.223587 -0.230278 0.990242 0.002795 0.139333 0.741898 0.118534 0.659952 0.215761 0.244242 0.945406 -0.334623 0.608862 0.719245 -0.489894 0.583366 0.647834 -0.582418 0.454153 0.674192 -0.651789 0.213057 0.727858 0.673370 0.229963 0.702631 0.727385 -0.095589 0.679539 0.702954 -0.332771 0.628585 0.626309 -0.468269 0.623266 0.461073 -0.519275 0.719559 0.009503 -0.454635 0.890627 -0.576132 -0.385907 0.720519 -0.955498 -0.104670 0.275805 -0.969157 0.242078 -0.046189 -0.928337 0.306787 -0.209932 -0.901019 0.244860 -0.358063 -0.846063 0.089447 -0.525525 -0.714140 -0.132993 -0.687253 -0.519234 -0.339145 -0.784459 -0.334971 -0.457411 -0.823753 -0.190444 -0.471780 -0.860903 -0.057840 -0.339540 -0.938812 0.186245 0.040329 -0.981675 0.577511 0.394314 -0.714840 0.735311 0.655194 -0.173317 0.491069 0.825792 0.277343 0.409430 0.794868 0.447830 0.450465 0.697764 0.556962 0.555722 0.518773 0.649652 0.525341 0.602723 -0.600619 0.696050 0.378593 -0.610067 0.800873 0.183029 -0.570177 0.871773 0.067694 -0.485212 0.948517 0.051046 -0.312586 0.986948 0.117091 0.110561 0.748840 0.022276 0.662377 0.191567 -0.039300 0.980692 -0.329046 0.104568 0.938506 -0.497502 0.066390 0.864919 -0.569288 -0.072609 0.818926 -0.591084 -0.293199 0.751435 -0.553552 -0.557031 0.619110 -0.469313 -0.768691 0.434578 -0.397431 -0.880878 0.257106 -0.389846 -0.914733 0.106224 -0.509942 -0.858844 -0.048437 -0.785869 -0.534484 -0.311026 -0.746314 -0.031593 -0.664844 -0.431687 0.494405 -0.754460 -0.180058 0.802774 -0.568447 -0.023370 0.873584 -0.486112 0.131572 0.858737 -0.495237 0.318377 0.773123 -0.548558 -0.702538 -0.004184 -0.711634 -0.502402 -0.123604 -0.855754 -0.313941 -0.191919 -0.929843 -0.163744 -0.183077 -0.969366 -0.033782 -0.041269 -0.998577 0.171415 0.357376 -0.918095 0.523505 0.673034 -0.522463 0.674117 0.734579 0.077209 0.500712 0.685280 0.528846 0.438002 0.582374 0.684832 0.484391 0.449842 0.750338 0.590574 0.260389 0.763820 0.704450 0.007051 0.709719 0.763244 -0.250938 0.595389 0.752873 -0.447500 0.482623 0.689338 -0.585097 0.427170 0.539792 -0.694064 0.476339 0.093160 -0.749283 0.655665 -0.528668 -0.662845 0.530233 -0.930290 -0.314751 0.188394 -0.997153 0.072825 -0.019542 -0.967445 0.198448 -0.157065 -0.928462 0.197729 -0.314421 -0.851726 0.120228 -0.510007 -0.481099 -0.785028 0.390224 -0.376750 -0.916134 0.136963 -0.292203 -0.953656 -0.071815 -0.272284 -0.934901 -0.227644 -0.380102 -0.851506 -0.361193 -0.718477 -0.477068 -0.506159 -0.729335 0.134988 -0.670708 -0.440838 0.662994 -0.605063 -0.208202 0.920511 -0.330622 -0.059841 0.974201 -0.217606 0.094318 0.968609 -0.230003 0.289442 0.903360 -0.316487 0.509760 0.746862 -0.427016 0.687375 0.526538 -0.500274 0.793729 0.326317 -0.513334 0.864514 0.190976 -0.464914 0.942475 0.129336 -0.308242 0.982219 0.108411 0.153277 0.721725 -0.128715 0.680107 0.189512 -0.334941 0.922984 -0.298486 -0.265937 0.916615 -0.476274 -0.274542 0.835338 -0.541660 -0.386685 0.746378 -0.544466 -0.576345 0.609412 0.738750 -0.196523 0.644692 0.798688 -0.440606 0.409833 0.773765 -0.594344 0.219186 0.706256 -0.697675 0.120218 0.569171 -0.808541 0.149351 0.085871 -0.904477 0.417789 -0.533842 -0.777703 0.331951 -0.916169 -0.394106 0.072911 -0.998448 0.055572 -0.003600 -0.969279 0.234820 -0.073198 -0.936122 0.276657 -0.217110 -0.861044 0.235187 -0.450877 -0.676729 0.131258 -0.724437 -0.422221 0.021753 -0.906232 -0.207116 -0.041097 -0.977453 -0.055724 -0.031503 -0.997949 0.055196 0.114234 -0.991919 0.205304 0.566174 -0.798309 0.526399 0.792050 -0.309129 0.683918 0.684240 0.253125 0.498590 0.531724 0.684600 0.406494 0.405088 0.818942 0.453213 0.267423 0.850343 0.588578 0.070994 0.805317 0.538859 0.788110 -0.297513 0.732758 0.497142 -0.464666 0.808308 0.262296 -0.527104 0.852299 0.121575 -0.508729 0.928834 0.062989 -0.365103 0.979372 0.043985 0.197222 0.702115 -0.278883 0.655179 0.210700 -0.546530 0.810500 -0.301185 -0.433802 0.849178 -0.496770 -0.365802 0.787025 -0.565882 -0.447863 0.692240 -0.563960 -0.647731 0.512243 -0.454889 -0.873648 0.172672 -0.278604 -0.942974 -0.182152 -0.153358 -0.903014 -0.401306 -0.118065 -0.840104 -0.529420 -0.237200 -0.749094 -0.618541 -0.718528 -0.331789 -0.611255 -0.719704 0.280296 -0.635185 -0.429277 0.761463 -0.485691 -0.224480 0.969476 -0.098612 -0.106014 0.991770 0.071780 0.036436 0.997354 0.062906 0.255597 0.963862 -0.075102 -0.653318 0.249089 -0.714934 -0.297251 0.098546 -0.949700 -0.056616 0.010123 -0.998345 0.077861 0.009315 -0.996921 0.149028 0.167874 -0.974479 0.220760 0.717531 -0.660616 0.540426 0.825698 -0.161750 0.719810 0.612162 0.327310 0.469734 0.419088 0.776991 0.300032 0.299666 0.905638 0.339432 0.175170 0.924176 0.524407 -0.025685 0.851080 0.757549 -0.340329 0.557042 0.810586 -0.565643 0.151653 0.755839 -0.647418 -0.097762 0.684131 -0.700724 -0.202364 0.567326 -0.809414 -0.151624 0.030315 -0.958183 0.284546 -0.539854 -0.820073 0.189838 -0.902925 -0.429282 -0.021073 -0.995219 0.079895 0.056169 -0.951014 0.296156 0.088677 -0.930651 0.365090 -0.024431 -0.884282 0.355690 -0.302539 -0.458988 -0.887897 0.031140 -0.184800 -0.884740 -0.427883 -0.026556 -0.782867 -0.621622 0.009290 -0.704655 -0.709490 -0.141762 -0.632266 -0.761672 -0.764292 -0.202873 -0.612128 -0.717058 0.365644 -0.593408 -0.415559 0.807084 -0.419435 -0.245834 0.965575 0.085029 -0.170035 0.930916 0.323239 -0.048158 0.944321 0.325481 0.188400 0.969485 0.156858 0.563902 0.799386 -0.207354 0.761606 0.417648 -0.495507 0.788219 0.167519 -0.592156 0.808114 0.045473 -0.587268 0.898511 0.016769 -0.438630 0.965684 0.015916 0.259233 0.699961 -0.373393 0.608795 0.243435 -0.673971 0.697497 -0.309202 -0.497493 0.810490 -0.518242 -0.333025 0.787731 -0.589865 -0.390984 0.706535 -0.603005 -0.612719 0.510843 0.758498 -0.411760 0.505108 0.800920 -0.596173 -0.055725 0.722886 -0.614127 -0.316676 0.654319 -0.640147 -0.402589 0.556515 -0.769018 -0.314489 -0.009435 -0.973121 0.230103 -0.534484 -0.839408 0.098590 -0.887332 -0.452092 -0.090857 -0.986393 0.094030 0.134857 -0.909533 0.318747 0.266739 -0.900429 0.394855 0.182530 -0.899862 0.421214 -0.113253 -0.656015 0.337348 -0.675160 -0.198349 0.134813 -0.970816 0.047386 0.024031 -0.998587 0.158054 0.020621 -0.987215 0.188894 0.208334 -0.959644 0.196625 0.825139 -0.529608 0.541159 0.837390 -0.076968 0.746039 0.566600 0.349844 0.419810 0.353143 0.836092 0.165052 0.247780 0.954654 0.199938 0.141558 0.969529 0.425132 -0.053746 0.903534 0.557860 0.820119 -0.127265 0.761024 0.377346 -0.527685 0.756803 0.128941 -0.640799 0.769290 0.026355 -0.638357 0.884121 0.028689 -0.466376 0.950744 0.015697 0.309578 0.708350 -0.416827 0.569645 0.274195 -0.737138 0.617612 -0.320444 -0.497310 0.806225 -0.523302 -0.262632 0.810666 -0.590061 -0.311897 0.744680 -0.622289 -0.549820 0.557185 -0.476326 -0.879048 -0.019679 -0.123936 -0.818557 -0.560896 0.047912 -0.683976 -0.727929 0.075709 -0.606932 -0.791140 -0.121329 -0.556725 -0.821789 -0.801326 -0.136336 -0.582486 -0.721857 0.404492 -0.561523 -0.414416 0.825766 -0.382583 -0.281200 0.931700 0.229916 -0.238353 0.829935 0.504377 -0.135290 0.849195 0.510456 0.100762 0.933828 0.343237 -0.685138 0.391328 -0.614368 -0.156271 0.161684 -0.974391 0.092695 0.040732 -0.994861 0.188688 0.040596 -0.981198 0.183769 0.269581 -0.945281 0.159063 0.884364 -0.438861 0.525697 0.850141 -0.030048 0.748557 0.554806 0.363115 0.336150 0.323401 0.884542 0.048783 0.222641 0.973679 0.085726 0.131829 0.987559 0.327414 -0.048832 0.943618 0.747437 -0.427701 0.508340 0.797241 -0.583987 -0.152857 0.709005 -0.570516 -0.414517 0.644629 -0.590344 -0.485744 0.554551 -0.752694 -0.354860 -0.013963 -0.980332 0.196861 -0.519891 -0.853227 0.041448 -0.870925 -0.472102 -0.136418 -0.969184 0.099723 0.225251 -0.859239 0.308421 0.408147 -0.860734 0.380055 0.338666 -0.900745 0.431581 0.048941 -0.493047 -0.869913 -0.012520 -0.104034 -0.786690 -0.608520 0.075355 -0.635656 -0.768286 0.095102 -0.560512 -0.822667 -0.157723 -0.525392 -0.836114 -0.815710 -0.117633 -0.566374 -0.729036 0.413694 -0.545311 -0.427033 0.830225 -0.358285 -0.329500 0.876508 0.350946 -0.294452 0.737071 0.608297 -0.203421 0.763327 0.613149 0.019295 0.884994 0.465203 0.523495 0.850928 -0.043291 0.755617 0.394185 -0.523126 0.745248 0.144648 -0.650909 0.760086 0.051932 -0.647744 0.896518 0.080550 -0.435623 0.940706 0.028613 0.338013 0.718856 -0.428004 0.547776 0.297957 -0.761375 0.575786 -0.342303 -0.452326 0.823547 -0.522845 -0.209384 0.826312 -0.582835 -0.259295 0.770110 -0.625151 -0.499325 0.599885 0.723225 -0.415143 0.551907 0.809002 -0.569692 -0.144799 0.723572 -0.549585 -0.417612 0.660953 -0.573938 -0.483464 0.561809 -0.766536 -0.311117 0.002446 -0.985795 0.167935 -0.500024 -0.866011 -0.000251 -0.854859 -0.490756 -0.168450 -0.944760 0.103263 0.311072 -0.827478 0.285379 0.483569 -0.837711 0.351786 0.417717 -0.897848 0.415786 0.144884 -0.721028 0.418889 -0.551952 -0.163659 0.199905 -0.966051 0.097655 0.075599 -0.992345 0.189735 0.081017 -0.978487 0.151697 0.355341 -0.922345 0.124645 0.913340 -0.387652 0.499926 0.866068 0.000165 0.728451 0.564607 0.388045 0.231994 0.308825 0.922391 -0.024582 0.204573 0.978543 0.016727 0.122098 0.992377 0.255008 -0.042065 0.966023 0.475302 0.878749 0.043456 0.756998 0.459193 -0.464862 0.763035 0.205522 -0.612811 0.785794 0.113539 -0.607978 0.923945 0.152803 -0.350680 0.932386 0.045149 0.358633 0.722532 -0.424664 0.545535 0.305718 -0.765357 0.566361 -0.376554 -0.399257 0.835943 -0.533329 -0.197821 0.822452 -0.588500 -0.252455 0.768072 -0.629579 -0.483269 0.608343 -0.507016 -0.861848 0.012388 -0.119697 -0.790987 -0.600010 0.067135 -0.634304 -0.770163 0.080375 -0.557399 -0.826345 -0.220415 -0.522511 -0.823650 -0.808151 -0.122540 -0.576087 -0.729871 0.408636 -0.548001 -0.445432 0.829054 -0.338023 -0.378630 0.816651 0.435569 -0.335253 0.684230 0.647638 -0.247502 0.717755 0.650823 -0.036471 0.851494 0.523094 -0.744003 0.433641 -0.508346 -0.205704 0.259367 -0.943618 0.071667 0.140330 -0.987508 0.168804 0.153695 -0.973593 0.112378 0.452900 -0.884451 0.106387 0.925741 -0.362885 0.473476 0.880283 0.030370 0.686338 0.579773 0.439095 0.141297 0.293730 0.945388 -0.059560 0.183514 0.981211 -0.011421 0.100450 0.994877 0.217905 -0.054717 0.974435 0.681384 -0.397886 0.614331 0.824133 -0.564283 -0.048897 0.759587 -0.555348 -0.338550 0.696826 -0.589868 -0.408031 0.570994 -0.789446 -0.225255 0.026545 -0.990324 0.136209 -0.478993 -0.876826 -0.041739 -0.842023 -0.502145 -0.197099 -0.929237 0.103874 0.354584 -0.833750 0.263024 0.485468 -0.848720 0.328716 0.414270 -0.904387 0.398459 0.152691 -0.523337 -0.851903 0.019485 -0.164995 -0.813718 -0.557351 0.025096 -0.666813 -0.744802 0.034437 -0.584342 -0.810776 -0.270295 -0.525974 -0.806407 -0.775305 -0.130895 -0.617874 -0.714934 0.405215 -0.569798 -0.461612 0.831328 -0.309529 -0.417329 0.779921 0.466434 -0.361996 0.679293 0.638374 -0.266892 0.719782 0.640845 -0.053778 0.847672 0.527788 0.431481 0.893077 0.127429 0.758543 0.554057 -0.342977 0.803276 0.307383 -0.510160 0.838106 0.208500 -0.504089 0.947563 0.222161 -0.229714 0.922247 0.053760 0.382845 0.710979 -0.423131 0.561666 0.282293 -0.762301 0.582415 -0.421844 -0.383521 0.821559 -0.563800 -0.237985 0.790881 -0.616605 -0.300541 0.727649 -0.647210 -0.516561 0.560611 0.619971 -0.399790 0.675132 0.814627 -0.568815 0.113283 0.792184 -0.582376 -0.182437 0.730864 -0.628275 -0.266661 0.574636 -0.807207 -0.134946 0.052009 -0.994537 0.090509 -0.459756 -0.882496 -0.099121 -0.837983 -0.494561 -0.230637 -0.944297 0.097557 0.314302 -0.881645 0.246592 0.402361 -0.893356 0.318999 0.316472 -0.916717 0.395645 0.055623 -0.735675 0.451315 -0.505071 -0.258742 0.341676 -0.903499 0.023095 0.244241 -0.969440 0.132571 0.267086 -0.954510 0.096440 0.540335 -0.835905 0.117947 0.929483 -0.349499 0.454673 0.887283 0.077476 0.616075 0.582619 0.530101 0.085670 0.267463 0.959752 -0.061535 0.146895 0.987236 -0.003249 0.052735 0.998603 0.215624 -0.104735 0.970843 0.410598 0.887855 0.207662 0.745720 0.647638 -0.156420 0.842189 0.430236 -0.324984 0.891470 0.317977 -0.322757 0.959257 0.269554 -0.084650 0.906560 0.043236 0.419856 0.674742 -0.438582 0.593606 0.205932 -0.763618 0.611948 -0.477299 -0.438962 0.761248 -0.615434 -0.344303 0.709011 -0.665204 -0.414386 0.621119 -0.674268 -0.602239 0.427400 -0.539825 -0.841188 -0.031479 -0.229226 -0.828389 -0.511104 -0.043537 -0.706136 -0.706737 -0.029068 -0.615097 -0.787915 -0.276066 -0.516210 -0.810749 -0.705088 -0.125781 -0.697875 -0.672957 0.419805 -0.609010 -0.468821 0.844439 -0.259094 -0.434868 0.786420 0.438673 -0.364883 0.722473 0.587276 -0.249198 0.766271 0.592225 -0.019117 0.868292 0.495686 -0.673247 0.486431 -0.556888 -0.284001 0.441950 -0.850896 -0.017450 0.382149 -0.923936 0.110125 0.410221 -0.905313 0.128731 0.616764 -0.776550 0.170743 0.929552 -0.326772 0.444990 0.880669 0.162500 0.510757 0.549484 0.661207 0.070448 0.212509 0.974616 -0.031377 0.071577 0.996941 0.036549 -0.044526 0.998339 0.233502 -0.208762 0.949682 0.542013 -0.441792 0.714872 0.749928 -0.588278 0.302551 0.781380 -0.623574 0.024517 0.731924 -0.675603 -0.088592 0.566666 -0.822030 -0.056177 0.079383 -0.996629 0.020733 -0.440361 -0.877377 -0.190503 -0.844970 -0.452458 -0.285144 -0.984652 0.086888 0.151365 -0.948931 0.242263 0.202085 -0.938559 0.331044 0.097559 -0.895006 0.419472 -0.151681 -0.529472 -0.830473 -0.173131 -0.279115 -0.811990 -0.512608 -0.104848 -0.713703 -0.692557 -0.068220 -0.612766 -0.787314 -0.224904 -0.477285 -0.849480 -0.578339 -0.090278 -0.810786 -0.592183 0.469004 -0.655251 -0.451400 0.870299 -0.197020 -0.409979 0.835799 0.365181 -0.321042 0.798758 0.508839 -0.177109 0.831021 0.527291 0.064243 0.883010 0.464938 0.413397 0.860459 0.297846 0.707235 0.702933 0.075518 0.845748 0.529920 -0.062405 0.912074 0.403783 -0.071279 0.951900 0.289974 0.099000 0.873934 0.008477 0.485970 0.602200 -0.483670 0.635152 0.071554 -0.788603 0.610725 -0.530673 -0.580204 0.617858 -0.669001 -0.522409 0.528703 -0.705775 -0.584301 0.400592 -0.677705 -0.712578 0.181518 0.451631 -0.521118 0.724200 0.633901 -0.628493 0.450739 0.707493 -0.672553 0.217087 0.687947 -0.722060 0.073201 0.547331 -0.836909 0.003463 0.116748 -0.990437 -0.073519 -0.406347 -0.850905 -0.332930 -0.826117 -0.377371 -0.418476 -0.984729 0.088963 -0.149649 -0.957246 0.262986 -0.120489 -0.901467 0.373172 -0.219316 -0.780714 0.471798 -0.409747 -0.539237 0.542168 -0.644420 -0.232274 0.546020 -0.804929 0.005685 0.527017 -0.849836 0.148356 0.555315 -0.818300 0.211984 0.698182 -0.683816 0.251085 0.934532 -0.252202 0.422612 0.851562 0.310227 0.387178 0.460172 0.798959 0.070783 0.104081 0.992047 -0.000041 -0.064900 0.997892 0.067377 -0.200825 0.977307 0.229447 -0.355647 0.906018 0.392247 0.814373 0.427713 0.637903 0.701705 0.317315 0.791856 0.565359 0.230939 0.873665 0.434679 0.218550 0.901187 0.279320 0.331425 0.794139 -0.051061 0.605587 0.480838 -0.564933 0.670556 -0.054581 -0.861274 0.505200 -0.548197 -0.754952 0.359899 -0.674187 -0.703017 0.226359 -0.680371 -0.729453 0.070659 -0.605558 -0.783764 -0.137892 -0.439793 -0.808560 -0.390913 -0.227182 -0.759163 -0.609967 -0.064053 -0.661912 -0.746840 0.000547 -0.549142 -0.835729 -0.080880 -0.390683 -0.916965 -0.384360 -0.002426 -0.923180 -0.471733 0.561293 -0.680013 -0.397090 0.904968 -0.152818 -0.359412 0.880724 0.308461 -0.267079 0.843976 0.465159 -0.114345 0.850302 0.513724 0.112462 0.858208 0.500830 -0.345807 0.614328 -0.709238 -0.069233 0.642545 -0.763113 0.148121 0.645339 -0.749399 0.286174 0.671331 -0.683681 0.343908 0.776799 -0.527551 0.299527 0.951057 -0.075988 0.320741 0.789265 0.523627 0.223224 0.326184 0.918573 -0.019408 -0.051003 0.998510 -0.077291 -0.234516 0.969035 -0.009778 -0.368977 0.929387 0.143746 -0.497889 0.855245 0.347332 -0.611217 0.711178 0.529739 -0.677875 0.509767 0.635332 -0.705328 0.314428 0.655568 -0.738592 0.157206 0.561719 -0.827096 0.019597 0.192701 -0.962907 -0.188882 -0.309123 -0.788861 -0.531170 -0.695084 -0.293355 -0.656355 -0.870733 0.120803 -0.476688 -0.851171 0.304655 -0.427425 -0.763799 0.428539 -0.482665 -0.598749 0.535995 -0.595154 -0.205982 -0.757284 -0.619752 0.041508 -0.657962 -0.751907 0.221969 -0.528745 -0.819243 0.306614 -0.396934 -0.865119 0.255297 -0.231711 -0.938687 -0.129432 0.147258 -0.980593 -0.354567 0.660152 -0.662179 -0.392240 0.913234 -0.110238 -0.430497 0.846740 0.312576 -0.377723 0.788577 0.485253 -0.242243 0.784813 0.570428 -0.020211 0.791712 0.610560 0.259391 0.755742 0.601307 0.510331 0.661602 0.549405 0.677689 0.542687 0.496214 0.767874 0.416031 0.487122 0.784771 0.244994 0.569309 0.643303 -0.127261 0.754960 0.345218 -0.662798 0.664473 -0.069991 -0.948225 0.309792 -0.489178 -0.870927 0.046806 -0.597562 -0.794552 -0.107735 -0.564415 -0.784019 -0.258359 -0.431383 -0.790093 -0.435502 0.241878 -0.685306 0.686914 0.500430 -0.687938 0.525653 0.662544 -0.657594 0.358617 0.729954 -0.650202 0.210724 0.694469 -0.717991 0.046926 0.387602 -0.879616 -0.275755 -0.044827 -0.691537 -0.720949 -0.397577 -0.218771 -0.891107 -0.679826 0.139561 -0.719972 -0.718402 0.307991 -0.623731 -0.639521 0.442191 -0.628872 -0.446471 0.582207 -0.679484 -0.137484 0.698621 -0.702158 0.171645 0.741445 -0.648689 0.379364 0.739864 -0.555594 0.483941 0.752790 -0.446215 0.469800 0.838618 -0.275696 0.199545 0.964236 0.174445 0.051626 0.696564 0.715635 -0.059033 0.180531 0.981796 -0.265523 -0.220969 0.938440 -0.313674 -0.401997 0.860236 -0.228839 -0.519863 0.823028 -0.034136 -0.620025 0.783839 -0.062720 0.670990 0.738809 0.245826 0.609349 0.753833 0.449341 0.515204 0.729834 0.552388 0.405655 0.728225 0.559484 0.234179 0.795071 0.409174 -0.182799 0.893958 0.264675 -0.723507 0.637561 0.099952 -0.984523 0.143955 -0.286226 -0.928775 -0.235482 -0.409871 -0.820789 -0.397883 -0.340573 -0.782477 -0.521286 -0.132480 -0.751069 -0.646796 0.200268 -0.646995 -0.735724 0.510587 -0.457550 -0.727976 0.685051 -0.276627 -0.673931 0.750759 -0.131617 -0.647331 0.694890 0.015787 -0.718942 0.104103 0.309600 -0.945151 -0.267960 0.701927 -0.659921 -0.493300 0.858582 -0.139612 -0.667905 0.707964 0.229541 -0.684253 0.612724 0.395433 -0.593321 0.614063 0.520477 -0.383431 0.659947 0.646104 -0.004672 0.782551 -0.622569 0.300020 0.859131 -0.414587 0.464893 0.853117 -0.236782 0.510610 0.853721 -0.102163 0.393647 0.918514 0.037078 -0.118144 0.933942 0.337333 -0.361102 0.562141 0.744045 -0.421645 0.014199 0.906650 -0.538247 -0.415919 0.733009 -0.546465 -0.588055 0.596295 -0.440702 -0.681688 0.584023 -0.211767 -0.743242 0.634623 0.145611 -0.732101 0.665451 0.488675 -0.622527 0.611276 0.691800 -0.505171 0.515961 0.791485 -0.453028 0.410264 0.820759 -0.513458 0.250431 0.653363 -0.731187 -0.196172 0.385387 -0.545462 -0.744277 0.056822 -0.123208 -0.990753 -0.399065 0.124897 -0.908377 -0.541397 0.242347 -0.805082 -0.507504 0.382244 -0.772224 -0.330269 0.579992 -0.744669 0.626116 -0.464378 -0.626364 0.874333 -0.191436 -0.445976 0.954793 0.013415 -0.296969 0.959165 0.153907 -0.237309 0.896147 0.282120 -0.342534 0.340151 0.451600 -0.824836 -0.151827 0.724670 -0.672162 -0.586328 0.759623 -0.281413 -0.863597 0.503036 -0.033975 -0.926159 0.365490 0.092986 -0.900418 0.363410 0.239124 -0.775717 0.441288 0.451142 -0.503556 0.518828 0.690832 -0.178557 0.525334 0.831951 0.052615 0.480423 0.875457 0.168872 0.398037 0.901692 0.175124 0.224659 0.958572 0.082894 -0.235703 0.968283 0.199049 -0.738331 0.644396 0.335373 -0.931904 0.138131 0.051108 -0.920909 -0.386413 -0.088241 -0.806150 -0.585094 0.011788 -0.745097 -0.666852 0.267073 -0.662874 -0.699479 0.058049 -0.769641 0.635832 0.373174 -0.563225 0.737238 0.558597 -0.385154 0.734593 0.668822 -0.304623 0.678146 0.765614 -0.355155 0.536377 0.826890 -0.561219 0.035861 0.760582 -0.351875 -0.545618 0.465408 0.020631 -0.884856 -0.057264 0.136031 -0.989048 -0.258859 0.195905 -0.945840 -0.275651 0.334314 -0.901250 -0.177680 0.567153 -0.804218 0.019479 0.831551 -0.555107 0.202484 0.951444 -0.231852 0.288064 0.957611 -0.000060 0.275264 0.951317 0.138656 0.089550 0.972760 0.213820 -0.467874 0.833943 0.292630 -0.732935 0.377638 0.565858 -0.714467 -0.183890 0.675071 -0.664220 -0.616864 0.422245 -0.585071 -0.765956 0.266464 -0.467155 -0.833495 0.295046 -0.264791 -0.856401 0.443241 -0.836109 0.312306 0.450984 -0.593290 0.379456 0.709943 -0.385707 0.384231 0.838807 -0.270893 0.326144 0.905675 -0.250024 0.147894 0.956878 -0.230996 -0.326205 0.916641 0.110298 -0.749700 0.652522 0.455727 -0.861736 0.222988 0.360479 -0.849374 -0.385511 0.289763 -0.742813 -0.603545 0.400848 -0.656356 -0.639153 0.627891 -0.522013 -0.577283 0.885297 -0.265264 -0.381947 0.991636 0.029235 -0.125714 0.972451 0.229491 0.040902 0.927737 0.362118 0.090412 0.873395 0.483985 -0.054221 0.508284 0.603377 -0.614479 -0.055769 0.757930 -0.649947 -0.602104 0.654459 -0.457334 -0.887255 0.303456 -0.347409 -0.955913 0.138848 -0.258749 -0.985359 0.125663 -0.115222 -0.971130 0.202750 0.125695 0.006152 0.843169 -0.537613 0.037910 0.980982 -0.190358 0.037373 0.997807 0.054630 -0.022460 0.982952 0.182483 -0.226671 0.954383 0.194353 -0.704477 0.700042 0.116846 -0.939184 0.184227 0.289817 -0.841458 -0.379162 0.384948 -0.615461 -0.775711 0.139572 -0.459254 -0.887842 0.028665 -0.345849 -0.932945 0.100009 -0.204253 -0.930297 0.304676 0.006733 -0.807322 0.590073 0.216982 -0.564428 0.796454 0.353332 -0.359022 0.863863 0.460228 -0.257147 0.849745 0.610765 -0.282215 0.739811 0.864610 -0.413626 0.285242 0.949386 -0.164892 -0.267352 0.701284 0.164087 -0.693741 0.228767 0.183492 -0.956032 0.026115 0.210142 -0.977322 -0.032551 0.341460 -0.939332 -0.028663 0.574412 -0.818064 0.988492 -0.085164 -0.125020 0.970050 0.200989 0.136404 0.875923 0.387928 0.286827 0.799125 0.511721 0.315501 0.762934 0.629814 0.145829 0.543059 0.721459 -0.429632 -0.004638 0.774752 -0.632248 -0.554805 0.548999 -0.625133 -0.780396 0.134941 -0.610551 -0.838509 -0.040194 -0.543403 -0.907373 -0.066353 -0.415055 -0.982244 -0.006617 -0.187492 -0.983235 0.102021 0.151133 -0.860909 0.197853 0.468710 -0.713617 0.235220 0.659865 -0.616467 0.194944 0.762867 -0.574825 0.016127 0.818117 -0.441195 -0.438077 0.783221 0.039489 -0.767818 0.639450 0.512399 -0.800645 0.310508 0.595727 -0.747933 -0.292755 0.595818 -0.637149 -0.488920 0.695415 -0.528140 -0.487304 0.856763 -0.360703 -0.368580 -0.004045 -0.833227 0.552916 0.090762 -0.577609 0.811252 0.164406 -0.357516 0.919322 0.253658 -0.238719 0.937375 0.437285 -0.236065 0.867787 0.817644 -0.289133 0.497856 1.000000 0.000256 0.000599 0.817961 0.289316 -0.497229 0.438164 0.235900 -0.867389 0.254801 0.238612 -0.937092 0.165431 0.357418 -0.919176 0.091392 0.577544 -0.811227 -0.004082 0.833244 -0.552890 -0.098796 0.969062 -0.226181 -0.174192 0.984691 0.006343 -0.267636 0.957072 0.111282 -0.461439 0.884896 0.063500 -0.827217 0.549953 -0.115168 -1.000000 -0.000487 -0.000444 -0.826885 -0.550541 0.114741 -0.460562 -0.885354 -0.063493 -0.266452 -0.957400 -0.111308 -0.173108 -0.984883 -0.006316 -0.098095 -0.969115 0.226258 -0.983197 -0.102126 -0.151310 -0.982329 0.006598 0.187047 -0.907727 0.066337 0.414285 -0.839104 0.040204 0.542484 -0.781093 -0.134928 0.609663 -0.555247 -0.549115 0.624639 -0.004874 -0.774390 0.632690 0.543073 -0.720816 0.430693 0.763420 -0.629310 -0.145463 0.799638 -0.511296 -0.314889 0.876254 -0.387600 -0.286260 0.970119 -0.200815 -0.136174 0.988505 0.085246 0.124864 0.856667 0.361067 0.368446 0.694980 0.528778 0.487235 0.595137 0.637899 0.488771 0.595038 0.748597 0.292459 0.512093 0.800980 -0.310150 0.039633 0.767579 -0.639727 -0.440540 0.437487 -0.783920 -0.573963 -0.016529 -0.818714 -0.615646 -0.195428 -0.763406 -0.713019 -0.235696 -0.660342 -0.860664 -0.198174 -0.469026 0.006754 0.807349 -0.590036 -0.204902 0.930121 -0.304778 -0.346850 0.932544 -0.100286 -0.460308 0.887284 -0.029033 -0.616177 0.775068 -0.139985 -0.841385 0.378229 -0.386024 -0.938537 -0.185438 -0.291137 -0.703649 -0.700768 -0.117484 -0.225571 -0.954712 -0.194017 -0.021147 -0.983071 -0.181999 0.038534 -0.997789 -0.054155 0.038643 -0.980886 0.190709 0.006230 -0.843133 0.537668 -0.029249 -0.574568 0.817934 -0.033608 -0.341678 0.939216 0.024875 -0.210363 0.977307 0.227678 -0.183587 0.956273 0.700378 -0.163414 0.694814 0.948738 0.165903 0.269023 0.864694 0.414294 -0.284016 0.611706 0.282340 -0.738985 0.461425 0.257263 -0.849060 0.354424 0.359126 -0.863372 0.217685 0.564492 -0.796217 0.885374 0.265343 0.381715 0.627714 0.522211 0.577297 0.400146 0.656637 0.639305 0.288831 0.743103 0.603635 0.359888 0.849692 0.385362 0.455304 0.862091 -0.222479 0.110407 0.749880 -0.652296 -0.230142 0.326155 -0.916874 -0.248817 -0.147775 -0.957211 -0.269737 -0.326063 -0.906049 -0.384851 -0.384219 -0.839205 -0.592902 -0.379494 -0.710247 -0.835992 -0.312396 -0.451139 -0.971013 -0.203043 -0.126121 -0.985382 -0.126217 0.114417 -0.956081 -0.139499 0.257776 -0.887439 -0.304010 0.346452 -0.602122 -0.654916 0.456655 -0.055830 -0.757960 0.649908 0.508196 -0.602922 0.614998 0.873880 -0.483074 0.054532 0.928152 -0.361188 -0.089875 0.972645 -0.228736 -0.040508 0.991646 -0.028839 0.125728 0.019572 -0.831421 0.555298 -0.178318 -0.567396 0.803906 -0.276795 -0.334749 0.900737 -0.260193 -0.196400 0.945371 -0.058351 -0.136449 0.988927 0.464303 -0.020337 0.885443 0.759387 0.352491 0.546884 0.826769 0.561455 -0.034951 0.766432 0.355368 -0.535065 0.669946 0.305022 -0.676856 0.559690 0.385535 -0.733560 0.373945 0.563511 -0.736627 0.058097 0.769723 -0.635729 -0.265393 0.856021 -0.443616 -0.467997 0.832759 -0.295789 -0.585883 0.765044 -0.267297 -0.664676 0.615992 -0.422800 -0.713979 0.182971 -0.675837 -0.731765 -0.378775 -0.566612 -0.467065 -0.834429 -0.292539 0.090788 -0.972861 -0.212837 0.276743 -0.951049 -0.137547 0.289331 -0.957228 0.001094 0.203284 -0.951089 0.232606 -0.503187 -0.519152 -0.690857 -0.775333 -0.441450 -0.451642 -0.900046 -0.363608 -0.240223 -0.925920 -0.365722 -0.094445 -0.863477 -0.503341 0.032489 -0.586275 -0.759935 0.280679 -0.152816 -0.724121 0.672530 0.338599 -0.450592 0.826025 0.896332 -0.281129 0.342863 0.959050 -0.153096 0.238295 0.954537 -0.012836 0.297815 0.874148 0.191711 0.446220 0.626308 0.464572 0.626028 0.267096 0.663437 0.698936 0.011385 0.745867 0.665998 -0.088777 0.806966 0.583888 0.050518 0.921453 0.385192 0.334436 0.932260 -0.137998 0.199619 0.738008 -0.644590 0.084630 0.235194 -0.968257 0.176805 -0.224798 -0.958231 0.170462 -0.398329 -0.901264 0.053950 -0.480868 -0.875132 -0.177736 -0.525826 -0.831816 0.145573 0.732076 -0.665487 -0.212114 0.742622 -0.635232 -0.441013 0.680643 -0.585006 -0.546619 0.586828 -0.597362 -0.538008 0.414758 -0.733841 -0.420183 -0.015345 -0.907310 -0.358966 -0.563268 -0.744226 -0.116879 -0.934334 -0.336689 0.394347 -0.918285 -0.035256 0.511306 -0.853064 0.104158 0.465423 -0.852335 0.238552 0.300335 -0.858437 0.415795 -0.004538 -0.782291 0.622897 -0.330474 -0.580328 0.744316 -0.508161 -0.382861 0.771486 -0.542307 -0.243032 0.804263 -0.400089 -0.125326 0.907867 0.054844 0.123644 0.990810 0.382991 0.546262 0.744926 0.652339 0.731837 0.197150 0.820911 0.514006 -0.248805 0.791961 0.453681 -0.408622 0.692349 0.505759 -0.514647 0.489081 0.622902 -0.610567 0.200384 0.647223 0.735492 -0.132632 0.751396 0.646385 -0.341087 0.782731 0.520569 -0.410500 0.820941 0.396920 -0.286935 0.928807 0.234489 0.098827 0.984581 -0.144336 0.264551 0.723512 -0.637607 0.409937 0.182956 -0.893576 0.560494 -0.233846 -0.794457 0.553386 -0.405444 -0.727584 0.450152 -0.515188 -0.729345 0.246278 -0.609514 -0.753551 -0.062562 -0.671163 -0.738665 -0.383088 -0.660065 -0.646187 -0.592669 -0.614327 -0.520909 -0.683501 -0.613121 -0.396118 -0.667190 -0.708397 -0.230286 -0.492727 -0.858973 0.139230 -0.268167 -0.701909 0.659856 0.103764 -0.309139 0.945339 0.694501 -0.014709 0.719341 0.750123 0.132555 0.647878 0.684492 0.277283 0.674230 0.510368 0.457870 0.727929 -0.137495 -0.698134 0.702641 -0.446468 -0.582166 0.679521 -0.639658 -0.442437 0.628560 -0.718675 -0.308320 0.623253 -0.680219 -0.139705 0.719573 -0.398479 0.219053 0.890635 -0.046112 0.691858 0.720560 0.387219 0.879751 0.275863 0.694213 0.718291 -0.046106 0.729822 0.650626 -0.209870 0.662535 0.657928 -0.358019 0.500485 0.688022 -0.525491 0.241924 0.684968 -0.687234 -0.034031 0.619235 -0.784468 -0.228582 0.518778 -0.823784 -0.313302 0.400793 -0.860933 -0.265086 0.219845 -0.938828 -0.058120 -0.181467 -0.981678 0.052790 -0.697300 -0.714832 0.199803 -0.964390 -0.173294 0.469745 -0.838078 0.277425 0.483771 -0.751904 0.447891 0.379145 -0.738916 0.557003 0.171486 -0.740613 0.649680 0.259330 -0.756304 -0.600626 -0.020117 -0.792073 -0.610095 -0.241878 -0.785076 -0.570219 -0.377200 -0.788823 -0.485262 -0.429986 -0.846978 -0.312635 -0.392026 -0.913291 0.110523 -0.355136 -0.659684 0.662340 -0.129840 -0.146282 0.980685 0.255032 0.232648 0.938527 0.306193 0.397625 0.864951 0.221723 0.529294 0.818955 0.041602 0.658467 0.751459 -0.205632 0.757892 0.619125 -0.431051 0.790783 0.434578 -0.564147 0.784630 0.257088 -0.597252 0.794992 0.106197 -0.488792 0.871054 -0.048456 -0.069907 0.947832 -0.311010 0.345844 0.662136 -0.664807 0.644055 0.126669 -0.754419 0.785289 -0.245437 -0.568403 0.768266 -0.416543 -0.486065 0.677935 -0.543304 -0.495201 0.510384 -0.662274 -0.548544 0.347580 0.610611 -0.711578 0.144105 0.496986 -0.855709 -0.009269 0.367922 -0.929811 -0.076693 0.233420 -0.969347 -0.018860 0.049971 -0.998573 0.223794 -0.327038 -0.918130 0.321176 -0.789816 -0.522530 0.299153 -0.951085 0.077103 0.343119 -0.776328 0.528757 0.285349 -0.670578 0.684763 0.147384 -0.644495 0.750270 -0.069771 -0.641739 0.763742 -0.346099 -0.613706 0.709634 -0.598922 -0.535639 0.595300 -0.763971 -0.428382 0.482532 -0.851375 -0.304569 0.427081 -0.870992 -0.120587 0.476268 -0.695548 0.293821 0.655654 -0.309842 0.789179 0.530278 0.192413 0.963046 0.188468 0.561555 0.827211 -0.019459 0.655507 0.738693 -0.156982 0.635398 0.705306 -0.314345 0.529912 0.677609 -0.509941 -0.439354 0.809112 0.390264 -0.605070 0.784299 0.136988 -0.679837 0.729840 -0.071802 -0.673556 0.703210 -0.227636 -0.547448 0.754883 -0.361182 -0.053982 0.860762 -0.506137 0.481550 0.564179 -0.670680 0.794587 0.050343 -0.605060 0.901299 -0.279899 -0.330631 0.873618 -0.435237 -0.217625 0.791695 -0.565951 -0.230039 0.637626 -0.702308 -0.316538 0.391942 -0.814857 -0.427071 0.112343 -0.858514 -0.500332 -0.114223 -0.850519 -0.513392 -0.266827 -0.844157 -0.464975 -0.359203 -0.880863 -0.308309 -0.397227 -0.904846 0.153180 -0.472334 -0.560736 0.680055 -0.384818 0.003276 0.922987 -0.081090 0.391401 0.916641 0.000335 0.549682 0.835374 -0.064094 0.662382 0.746419 -0.226941 0.759645 0.609457 -0.539548 -0.541447 0.644766 -0.780910 -0.471330 0.409912 -0.901596 -0.372884 0.219277 -0.957333 -0.262744 0.120332 -0.984787 -0.088542 0.149514 -0.826202 0.377932 0.417801 -0.406588 0.851189 0.331910 0.116838 0.990470 0.072928 0.547367 0.836885 -0.003572 0.688017 0.721996 -0.073175 0.707693 0.672345 -0.217078 0.634275 0.628051 -0.450830 0.452138 0.520396 -0.724403 0.230041 0.354738 -0.906224 0.068040 0.199874 -0.977456 0.000642 0.063978 -0.997951 0.071439 -0.104938 -0.991910 0.387923 -0.460919 -0.798166 0.422854 -0.851889 -0.308996 0.250634 -0.934376 0.253226 0.211212 -0.697540 0.684710 0.147598 -0.554453 0.819022 0.005023 -0.526093 0.850412 -0.232773 -0.545132 0.805387 0.413138 -0.860621 -0.297737 0.064232 -0.883082 -0.464802 -0.176919 -0.831134 -0.527178 -0.320797 -0.798895 -0.508779 -0.409828 -0.835863 -0.365203 -0.451595 -0.870212 0.196961 -0.592528 -0.468744 0.655126 -0.578688 0.090619 0.810499 -0.225263 0.477617 0.849199 -0.068550 0.613048 0.787066 -0.105051 0.713926 0.692296 -0.279138 0.812166 0.512316 -0.529387 0.830612 0.172723 -0.677579 0.712542 -0.182129 -0.705579 0.584070 -0.401273 -0.668755 0.522047 -0.529371 -0.530448 0.579727 -0.618500 0.071642 0.788181 -0.611259 0.602410 0.483276 -0.635253 0.873973 -0.008784 -0.485895 0.951851 -0.290189 -0.098845 0.911974 -0.403959 0.071553 0.845593 -0.530139 0.062652 0.706984 -0.703201 -0.075379 0.542464 0.441207 -0.714891 0.234130 0.208110 -0.949670 0.037254 0.043928 -0.998340 -0.030699 -0.072125 -0.996923 0.070984 -0.213024 -0.974465 0.511064 -0.549983 -0.660555 0.444836 -0.880899 -0.161672 0.170137 -0.929468 0.327326 0.128016 -0.616220 0.777100 0.109477 -0.409491 0.905722 -0.018032 -0.381385 0.924240 -0.284453 -0.441181 0.851144 -0.673519 -0.485833 0.557080 -0.895166 -0.419160 0.151600 -0.938587 -0.330873 -0.097862 -0.948886 -0.242114 -0.202473 -0.984625 -0.086584 -0.151710 -0.844960 0.452873 0.284515 -0.440263 0.877566 0.189860 0.079829 0.996590 -0.020899 0.566837 0.821899 0.056370 0.731963 0.675534 0.088793 0.781495 0.623437 -0.024345 0.750204 0.587963 -0.302479 -0.539261 0.841559 0.031236 -0.673591 0.602700 -0.427818 -0.664498 0.414729 -0.621645 -0.614666 0.344574 -0.709545 -0.476335 0.439286 -0.761665 0.206734 0.763430 -0.611911 0.675356 0.438172 -0.593211 0.906814 -0.043704 -0.419259 0.959089 -0.269970 0.085229 0.891105 -0.318239 0.323505 0.841777 -0.430441 0.325779 0.745372 -0.647856 0.157171 0.410405 -0.888056 -0.207183 -0.019051 -0.868381 -0.495531 -0.248952 -0.766334 -0.592245 -0.364561 -0.722571 -0.587356 -0.434574 -0.786648 -0.438556 -0.468949 -0.844275 0.259397 -0.673418 -0.419534 0.608686 -0.705464 0.126152 0.697428 -0.276297 0.516474 0.810503 -0.029427 0.615269 0.787768 -0.043803 0.706294 0.706563 -0.229160 0.828563 0.510851 -0.735738 -0.451375 0.504926 -0.916646 -0.395785 -0.055808 -0.893199 -0.319185 -0.316727 -0.881446 -0.246825 -0.402654 -0.944153 -0.097846 -0.314646 -0.838104 0.494494 0.230344 -0.459959 0.882441 0.098667 0.051595 0.994501 -0.091139 0.574379 0.807455 0.134556 0.730721 0.628410 0.266736 0.792053 0.582530 0.182515 0.814511 0.568962 -0.113376 0.619793 0.399741 -0.675325 0.215598 0.104596 -0.970864 -0.003079 -0.052878 -0.998596 -0.061275 -0.147058 -0.987228 0.085905 -0.267625 -0.959686 0.616196 -0.582600 -0.529980 0.454896 -0.887192 -0.077198 0.118141 -0.929329 0.349844 0.096059 -0.540565 0.835800 0.132002 -0.267385 0.954505 0.022574 -0.244407 0.969410 -0.259103 -0.341743 0.903370 0.431483 -0.893087 -0.127347 -0.053703 -0.847704 -0.527744 -0.266765 -0.719853 -0.640819 -0.361848 -0.679379 -0.638365 -0.417185 -0.780003 -0.466425 -0.461549 -0.831315 0.309656 -0.714969 -0.405198 0.569766 -0.775402 0.130919 0.617748 -0.270293 0.526075 0.806341 0.034345 0.584450 0.810702 0.024994 0.666907 0.744722 -0.165030 0.813764 0.557274 -0.523255 0.851953 -0.019491 -0.647123 0.516589 -0.560686 -0.616496 0.300498 -0.727759 -0.563664 0.237920 -0.790997 -0.421668 0.383491 -0.821664 0.282302 0.762214 -0.582525 0.711037 0.423090 -0.561625 0.922322 -0.053745 -0.382667 0.947551 -0.222053 0.229867 0.838052 -0.208358 0.504237 0.803225 -0.307249 0.510322 0.758526 -0.553981 0.343137 0.681332 0.397860 -0.614406 0.218071 0.054638 -0.974402 -0.011105 -0.100535 -0.994872 -0.059171 -0.183625 -0.981214 0.141590 -0.293855 -0.945305 0.686215 -0.579849 -0.439186 0.473441 -0.880306 -0.030236 0.106356 -0.925695 0.363010 0.112188 -0.452926 0.884462 0.168565 -0.153682 0.973636 0.071431 -0.140276 0.987532 -0.205873 -0.259282 0.943604 -0.744016 -0.433629 0.508337 -0.904307 -0.398569 -0.152876 -0.848532 -0.328859 -0.414542 -0.833502 -0.263211 -0.485792 -0.929071 -0.104123 -0.354945 -0.841987 0.502159 0.197216 -0.479097 0.876771 0.041697 0.026428 0.990316 -0.136290 0.570896 0.789501 0.225311 0.696692 0.589940 0.408156 0.759460 0.555452 0.338664 0.824049 0.564401 0.048929 -0.506892 0.861921 -0.012368 -0.629315 0.483449 -0.608473 -0.588183 0.252583 -0.768272 -0.532973 0.197924 -0.822658 -0.376161 0.399355 -0.836073 0.305904 0.765349 -0.566271 0.722746 0.424680 -0.545238 0.932540 -0.045120 -0.358236 0.923833 -0.152801 0.350975 0.785555 -0.113498 0.608295 0.762788 -0.205459 0.613140 0.756832 -0.459154 0.465170 0.475293 -0.878758 -0.043370 -0.036302 -0.851435 -0.523202 -0.247242 -0.717703 -0.650979 -0.334963 -0.684203 -0.647816 -0.378380 -0.816699 -0.435696 -0.445477 -0.829072 0.337921 -0.730054 -0.408693 0.547715 -0.808377 0.122485 0.575781 -0.220532 0.522479 0.823639 0.080067 0.557389 0.826382 0.066815 0.634306 0.770189 -0.119897 0.790965 0.600000 -0.721091 -0.418955 0.551819 -0.897828 -0.415886 -0.144720 -0.837801 -0.351898 -0.417441 -0.827655 -0.285424 -0.483240 -0.944797 -0.103243 -0.310965 -0.855156 0.490525 0.167613 -0.500093 0.865971 -0.000279 0.002377 0.985740 -0.168256 0.561619 0.766722 0.311000 0.660798 0.574100 0.483483 0.723448 0.549712 0.417659 0.808933 0.569768 0.144882 0.723242 0.415128 -0.551896 0.254805 0.041849 -0.966087 0.016407 -0.122325 -0.992354 -0.025020 -0.204737 -0.978497 0.231669 -0.308866 -0.922459 0.728970 -0.564371 -0.387412 0.500281 -0.865863 0.000113 0.124827 -0.913243 0.387821 0.151529 -0.355233 0.922415 0.189538 -0.080905 0.978535 0.097459 -0.075527 0.992370 -0.163870 -0.199920 0.966012 0.523501 -0.850917 0.043444 0.019362 -0.885284 -0.464648 -0.203440 -0.763748 -0.612619 -0.294531 -0.737454 -0.607794 -0.329557 -0.876676 -0.350472 -0.426899 -0.830082 0.358777 -0.728860 -0.413469 0.545717 -0.815568 0.117841 0.566535 -0.157345 0.525729 0.835973 0.095551 0.560765 0.822443 0.075849 0.635819 0.768103 -0.103514 0.786782 0.608489 -0.492922 0.869983 0.012539 -0.625348 0.498965 -0.599978 -0.583068 0.258813 -0.770096 -0.523097 0.208966 -0.826259 -0.342455 0.452230 -0.823537 0.297753 0.761193 -0.576132 0.718653 0.427855 -0.548159 0.940640 -0.028653 -0.338195 0.896640 -0.080289 0.435421 0.760356 -0.051733 0.647444 0.745533 -0.144548 0.650605 0.755801 -0.394197 0.522852 0.747401 0.427732 -0.508366 0.327445 0.048688 -0.943615 0.085705 -0.132030 -0.987534 0.048718 -0.222825 -0.973640 0.336061 -0.323503 -0.884539 0.748606 -0.554825 -0.362987 0.525646 -0.850169 0.030152 0.158865 -0.884528 0.438602 0.183820 -0.269191 0.945382 0.188836 -0.040087 0.981190 0.092840 -0.040334 0.994864 -0.156197 -0.161469 0.974439 -0.685170 -0.391429 0.614268 -0.900645 -0.431789 -0.048952 -0.860673 -0.380276 -0.338573 -0.859227 -0.308619 -0.408024 -0.969196 -0.099858 -0.225139 -0.871025 0.471929 0.136375 -0.520063 0.853124 -0.041398 -0.013935 0.980393 -0.196557 0.554314 0.753115 0.354336 0.644556 0.590798 0.485289 0.708953 0.570865 0.414124 0.797148 0.584193 0.152555 -0.476489 0.878964 0.019507 -0.622330 0.549621 -0.557334 -0.590038 0.311622 -0.744814 -0.523274 0.262253 -0.810807 -0.320571 0.496817 -0.806478 0.274158 0.737085 -0.617692 0.708363 0.416873 -0.569596 0.950784 -0.015577 -0.309463 0.884065 -0.028470 0.466496 0.769197 -0.026104 0.638478 0.756739 -0.128694 0.640925 0.761044 -0.377184 0.527773 0.557863 -0.820137 0.127141 0.100739 -0.933775 -0.343390 -0.135228 -0.849157 -0.510535 -0.238257 -0.829912 -0.504460 -0.281186 -0.931624 -0.230239 -0.414459 -0.825817 0.382428 -0.721933 -0.404522 0.561404 -0.801449 0.136283 0.582329 -0.121572 0.556824 0.821686 0.075409 0.607095 0.791043 0.047598 0.684136 0.727800 -0.124227 0.818640 0.560710 -0.656110 -0.336824 0.675329 -0.899928 -0.421017 0.113461 -0.900437 -0.394899 -0.182394 -0.909503 -0.318904 -0.266654 -0.986388 -0.094103 -0.134849 -0.887250 0.452311 0.090566 -0.534410 0.839367 -0.099348 -0.009510 0.972885 -0.231093 0.556787 0.768656 0.314891 0.654357 0.640032 0.402710 0.722897 0.614075 0.316753 0.800998 0.596053 0.055888 0.758800 0.411472 -0.504890 0.425452 0.053236 -0.903414 0.200217 -0.142159 -0.969383 0.165318 -0.248439 -0.954436 0.419953 -0.353791 -0.835746 0.745999 -0.566873 -0.349486 0.541275 -0.837251 0.077667 0.196928 -0.824368 0.530694 0.188842 -0.207936 0.959740 0.157905 -0.020250 0.987247 0.047218 -0.023556 0.998607 -0.198513 -0.134258 0.970859 0.563674 -0.799497 0.207548 0.188014 -0.969617 -0.156505 -0.048497 -0.944468 -0.325005 -0.170343 -0.931030 -0.322749 -0.246135 -0.965533 -0.084634 -0.415727 -0.806747 0.419916 -0.717102 -0.365087 0.593698 -0.764265 0.203414 0.611982 -0.141631 0.632875 0.761190 0.009468 0.705202 0.708943 -0.026352 0.783338 0.621037 -0.184535 0.885071 0.427312 -0.458688 0.888040 -0.031484 -0.602901 0.612680 -0.511013 -0.589882 0.390746 -0.706652 -0.518278 0.332696 -0.787846 -0.309148 0.497167 -0.810711 0.243463 0.673504 -0.697938 0.699925 0.372909 -0.609133 0.965660 -0.016183 -0.259305 0.898574 -0.016538 0.438510 0.808205 -0.045140 0.587168 0.788303 -0.167220 0.592128 0.761628 -0.417507 0.495592 0.757835 0.339917 -0.556905 0.524712 0.025044 -0.850911 0.339656 -0.175922 -0.923951 0.300191 -0.300454 -0.905325 0.469764 -0.419831 -0.776572 0.719648 -0.612593 -0.326858 0.540267 -0.825665 0.162447 0.220616 -0.717048 0.661189 0.148923 -0.167271 0.974598 0.077770 -0.008617 0.996934 -0.056750 -0.009403 0.998344 -0.297469 -0.097877 0.949701 -0.653543 -0.248576 0.714907 -0.884369 -0.355403 0.302623 -0.930685 -0.364992 0.024614 -0.951034 -0.296150 -0.088482 -0.995233 -0.079811 -0.056045 -0.902820 0.429512 0.020863 -0.539736 0.820013 -0.190432 0.030548 0.958001 -0.285132 0.567533 0.809326 0.151318 0.684239 0.700719 0.202015 0.755929 0.647354 0.097489 0.810719 0.565431 -0.151731 -0.454590 0.873734 -0.173023 -0.563767 0.647707 -0.512486 -0.565782 0.447671 -0.692446 -0.496682 0.365508 -0.787217 -0.301016 0.433484 -0.849401 0.210824 0.546062 -0.810783 0.702138 0.278437 -0.655344 0.979372 -0.044139 -0.197187 0.928869 -0.062787 0.365048 0.852344 -0.121299 0.508720 0.808331 -0.262080 0.527176 0.732695 -0.497086 0.464827 0.538604 -0.788196 0.297748 0.255259 -0.963925 0.075443 0.036157 -0.997393 -0.062452 -0.106245 -0.991780 -0.071300 -0.224693 -0.969386 0.099019 -0.429457 -0.761136 0.486044 -0.719836 -0.279783 0.635262 -0.718677 0.332231 0.610841 -0.237170 0.749619 0.617917 -0.117958 0.840537 0.528757 -0.153189 0.903332 0.400654 -0.278347 0.943157 0.181598 -0.676991 -0.130855 0.724265 -0.861132 -0.234977 0.450818 -0.936115 -0.276623 0.217183 -0.969249 -0.234909 0.073307 -0.998440 -0.055726 0.003576 -0.916214 0.393918 -0.073352 -0.533913 0.777326 -0.332719 0.085984 0.904187 -0.418393 0.569212 0.808440 -0.149742 0.706235 0.697632 -0.120586 0.773768 0.594252 -0.219423 0.798783 0.440400 -0.409871 0.738964 0.196129 -0.644565 0.588814 -0.071621 -0.805089 0.453383 -0.268201 -0.850007 0.406572 -0.405910 -0.818496 0.498538 -0.532456 -0.684069 0.683829 -0.684563 -0.252489 0.526310 -0.791796 0.309931 0.205114 -0.565607 0.798759 0.054922 -0.113568 0.992011 -0.056023 0.032245 0.997909 -0.207457 0.041795 0.977351 -0.422584 -0.021176 0.906076 0.509271 -0.746853 0.427613 0.288868 -0.903278 0.317245 0.093796 -0.968449 0.230888 -0.060291 -0.973972 0.218504 -0.208590 -0.920147 0.331392 -0.441164 -0.662283 0.605604 -0.729561 -0.134034 0.670653 -0.718535 0.477848 0.505341 -0.379667 0.852199 0.360014 -0.271729 0.935348 0.226467 -0.291565 0.953929 0.070772 -0.376047 0.916301 -0.137775 -0.480443 0.785144 -0.390798 -0.543994 0.576319 -0.609858 -0.541339 0.386428 -0.746743 -0.475982 0.274110 -0.835647 -0.298046 0.265423 -0.916907 0.189942 0.334176 -0.923173 0.721884 0.128038 -0.680066 0.982279 -0.108425 -0.152876 0.942485 -0.128998 0.308353 0.864523 -0.190629 0.465039 0.793652 -0.326082 0.513602 0.687113 -0.526463 0.500712</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-normals-array" count="2880" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus_Knot01-mesh-map-channel1">
+ <float_array id="Torus_Knot01-mesh-map-channel1-array" count="9075">0 0 0 0 0.041667 0 0 0.083333 0 0 0.125000 0 0 0.166667 0 0 0.208333 0 0 0.250000 0 0 0.291667 0 0 0.333333 0 0 0.375000 0 0 0.416667 0 0 0.458333 0 0 0.500000 0 0 0.541667 0 0 0.583333 0 0 0.625000 0 0 0.666667 0 0 0.708333 0 0 0.750000 0 0 0.791667 0 0 0.833333 0 0 0.875000 0 0 0.916667 0 0 0.958333 0 0 1.000000 0 0.008333 0 0 0.008333 0.041667 0 0.008333 0.083333 0 0.008333 0.125000 0 0.008333 0.166667 0 0.008333 0.208333 0 0.008333 0.250000 0 0.008333 0.291667 0 0.008333 0.333333 0 0.008333 0.375000 0 0.008333 0.416667 0 0.008333 0.458333 0 0.008333 0.500000 0 0.008333 0.541667 0 0.008333 0.583333 0 0.008333 0.625000 0 0.008333 0.666667 0 0.008333 0.708333 0 0.008333 0.750000 0 0.008333 0.791667 0 0.008333 0.833333 0 0.008333 0.875000 0 0.008333 0.916667 0 0.008333 0.958333 0 0.008333 1.000000 0 0.016667 0 0 0.016667 0.041667 0 0.016667 0.083333 0 0.016667 0.125000 0 0.016667 0.166667 0 0.016667 0.208333 0 0.016667 0.250000 0 0.016667 0.291667 0 0.016667 0.333333 0 0.016667 0.375000 0 0.016667 0.416667 0 0.016667 0.458333 0 0.016667 0.500000 0 0.016667 0.541667 0 0.016667 0.583333 0 0.016667 0.625000 0 0.016667 0.666667 0 0.016667 0.708333 0 0.016667 0.750000 0 0.016667 0.791667 0 0.016667 0.833333 0 0.016667 0.875000 0 0.016667 0.916667 0 0.016667 0.958333 0 0.016667 1.000000 0 0.025000 0 0 0.025000 0.041667 0 0.025000 0.083333 0 0.025000 0.125000 0 0.025000 0.166667 0 0.025000 0.208333 0 0.025000 0.250000 0 0.025000 0.291667 0 0.025000 0.333333 0 0.025000 0.375000 0 0.025000 0.416667 0 0.025000 0.458333 0 0.025000 0.500000 0 0.025000 0.541667 0 0.025000 0.583333 0 0.025000 0.625000 0 0.025000 0.666667 0 0.025000 0.708333 0 0.025000 0.750000 0 0.025000 0.791667 0 0.025000 0.833333 0 0.025000 0.875000 0 0.025000 0.916667 0 0.025000 0.958333 0 0.025000 1.000000 0 0.033333 0 0 0.033333 0.041667 0 0.033333 0.083333 0 0.033333 0.125000 0 0.033333 0.166667 0 0.033333 0.208333 0 0.033333 0.250000 0 0.033333 0.291667 0 0.033333 0.333333 0 0.033333 0.375000 0 0.033333 0.416667 0 0.033333 0.458333 0 0.033333 0.500000 0 0.033333 0.541667 0 0.033333 0.583333 0 0.033333 0.625000 0 0.033333 0.666667 0 0.033333 0.708333 0 0.033333 0.750000 0 0.033333 0.791667 0 0.033333 0.833333 0 0.033333 0.875000 0 0.033333 0.916667 0 0.033333 0.958333 0 0.033333 1.000000 0 0.041667 0 0 0.041667 0.041667 0 0.041667 0.083333 0 0.041667 0.125000 0 0.041667 0.166667 0 0.041667 0.208333 0 0.041667 0.250000 0 0.041667 0.291667 0 0.041667 0.333333 0 0.041667 0.375000 0 0.041667 0.416667 0 0.041667 0.458333 0 0.041667 0.500000 0 0.041667 0.541667 0 0.041667 0.583333 0 0.041667 0.625000 0 0.041667 0.666667 0 0.041667 0.708333 0 0.041667 0.750000 0 0.041667 0.791667 0 0.041667 0.833333 0 0.041667 0.875000 0 0.041667 0.916667 0 0.041667 0.958333 0 0.041667 1.000000 0 0.050000 0 0 0.050000 0.041667 0 0.050000 0.083333 0 0.050000 0.125000 0 0.050000 0.166667 0 0.050000 0.208333 0 0.050000 0.250000 0 0.050000 0.291667 0 0.050000 0.333333 0 0.050000 0.375000 0 0.050000 0.416667 0 0.050000 0.458333 0 0.050000 0.500000 0 0.050000 0.541667 0 0.050000 0.583333 0 0.050000 0.625000 0 0.050000 0.666667 0 0.050000 0.708333 0 0.050000 0.750000 0 0.050000 0.791667 0 0.050000 0.833333 0 0.050000 0.875000 0 0.050000 0.916667 0 0.050000 0.958333 0 0.050000 1.000000 0 0.058333 0 0 0.058333 0.041667 0 0.058333 0.083333 0 0.058333 0.125000 0 0.058333 0.166667 0 0.058333 0.208333 0 0.058333 0.250000 0 0.058333 0.291667 0 0.058333 0.333333 0 0.058333 0.375000 0 0.058333 0.416667 0 0.058333 0.458333 0 0.058333 0.500000 0 0.058333 0.541667 0 0.058333 0.583333 0 0.058333 0.625000 0 0.058333 0.666667 0 0.058333 0.708333 0 0.058333 0.750000 0 0.058333 0.791667 0 0.058333 0.833333 0 0.058333 0.875000 0 0.058333 0.916667 0 0.058333 0.958333 0 0.058333 1.000000 0 0.066667 0 0 0.066667 0.041667 0 0.066667 0.083333 0 0.066667 0.125000 0 0.066667 0.166667 0 0.066667 0.208333 0 0.066667 0.250000 0 0.066667 0.291667 0 0.066667 0.333333 0 0.066667 0.375000 0 0.066667 0.416667 0 0.066667 0.458333 0 0.066667 0.500000 0 0.066667 0.541667 0 0.066667 0.583333 0 0.066667 0.625000 0 0.066667 0.666667 0 0.066667 0.708333 0 0.066667 0.750000 0 0.066667 0.791667 0 0.066667 0.833333 0 0.066667 0.875000 0 0.066667 0.916667 0 0.066667 0.958333 0 0.066667 1.000000 0 0.075000 0 0 0.075000 0.041667 0 0.075000 0.083333 0 0.075000 0.125000 0 0.075000 0.166667 0 0.075000 0.208333 0 0.075000 0.250000 0 0.075000 0.291667 0 0.075000 0.333333 0 0.075000 0.375000 0 0.075000 0.416667 0 0.075000 0.458333 0 0.075000 0.500000 0 0.075000 0.541667 0 0.075000 0.583333 0 0.075000 0.625000 0 0.075000 0.666667 0 0.075000 0.708333 0 0.075000 0.750000 0 0.075000 0.791667 0 0.075000 0.833333 0 0.075000 0.875000 0 0.075000 0.916667 0 0.075000 0.958333 0 0.075000 1.000000 0 0.083333 0 0 0.083333 0.041667 0 0.083333 0.083333 0 0.083333 0.125000 0 0.083333 0.166667 0 0.083333 0.208333 0 0.083333 0.250000 0 0.083333 0.291667 0 0.083333 0.333333 0 0.083333 0.375000 0 0.083333 0.416667 0 0.083333 0.458333 0 0.083333 0.500000 0 0.083333 0.541667 0 0.083333 0.583333 0 0.083333 0.625000 0 0.083333 0.666667 0 0.083333 0.708333 0 0.083333 0.750000 0 0.083333 0.791667 0 0.083333 0.833333 0 0.083333 0.875000 0 0.083333 0.916667 0 0.083333 0.958333 0 0.083333 1.000000 0 0.091667 0 0 0.091667 0.041667 0 0.091667 0.083333 0 0.091667 0.125000 0 0.091667 0.166667 0 0.091667 0.208333 0 0.091667 0.250000 0 0.091667 0.291667 0 0.091667 0.333333 0 0.091667 0.375000 0 0.091667 0.416667 0 0.091667 0.458333 0 0.091667 0.500000 0 0.091667 0.541667 0 0.091667 0.583333 0 0.091667 0.625000 0 0.091667 0.666667 0 0.091667 0.708333 0 0.091667 0.750000 0 0.091667 0.791667 0 0.091667 0.833333 0 0.091667 0.875000 0 0.091667 0.916667 0 0.091667 0.958333 0 0.091667 1.000000 0 0.100000 0 0 0.100000 0.041667 0 0.100000 0.083333 0 0.100000 0.125000 0 0.100000 0.166667 0 0.100000 0.208333 0 0.100000 0.250000 0 0.100000 0.291667 0 0.100000 0.333333 0 0.100000 0.375000 0 0.100000 0.416667 0 0.100000 0.458333 0 0.100000 0.500000 0 0.100000 0.541667 0 0.100000 0.583333 0 0.100000 0.625000 0 0.100000 0.666667 0 0.100000 0.708333 0 0.100000 0.750000 0 0.100000 0.791667 0 0.100000 0.833333 0 0.100000 0.875000 0 0.100000 0.916667 0 0.100000 0.958333 0 0.100000 1.000000 0 0.108333 0 0 0.108333 0.041667 0 0.108333 0.083333 0 0.108333 0.125000 0 0.108333 0.166667 0 0.108333 0.208333 0 0.108333 0.250000 0 0.108333 0.291667 0 0.108333 0.333333 0 0.108333 0.375000 0 0.108333 0.416667 0 0.108333 0.458333 0 0.108333 0.500000 0 0.108333 0.541667 0 0.108333 0.583333 0 0.108333 0.625000 0 0.108333 0.666667 0 0.108333 0.708333 0 0.108333 0.750000 0 0.108333 0.791667 0 0.108333 0.833333 0 0.108333 0.875000 0 0.108333 0.916667 0 0.108333 0.958333 0 0.108333 1.000000 0 0.116667 0 0 0.116667 0.041667 0 0.116667 0.083333 0 0.116667 0.125000 0 0.116667 0.166667 0 0.116667 0.208333 0 0.116667 0.250000 0 0.116667 0.291667 0 0.116667 0.333333 0 0.116667 0.375000 0 0.116667 0.416667 0 0.116667 0.458333 0 0.116667 0.500000 0 0.116667 0.541667 0 0.116667 0.583333 0 0.116667 0.625000 0 0.116667 0.666667 0 0.116667 0.708333 0 0.116667 0.750000 0 0.116667 0.791667 0 0.116667 0.833333 0 0.116667 0.875000 0 0.116667 0.916667 0 0.116667 0.958333 0 0.116667 1.000000 0 0.125000 0 0 0.125000 0.041667 0 0.125000 0.083333 0 0.125000 0.125000 0 0.125000 0.166667 0 0.125000 0.208333 0 0.125000 0.250000 0 0.125000 0.291667 0 0.125000 0.333333 0 0.125000 0.375000 0 0.125000 0.416667 0 0.125000 0.458333 0 0.125000 0.500000 0 0.125000 0.541667 0 0.125000 0.583333 0 0.125000 0.625000 0 0.125000 0.666667 0 0.125000 0.708333 0 0.125000 0.750000 0 0.125000 0.791667 0 0.125000 0.833333 0 0.125000 0.875000 0 0.125000 0.916667 0 0.125000 0.958333 0 0.125000 1.000000 0 0.133333 0 0 0.133333 0.041667 0 0.133333 0.083333 0 0.133333 0.125000 0 0.133333 0.166667 0 0.133333 0.208333 0 0.133333 0.250000 0 0.133333 0.291667 0 0.133333 0.333333 0 0.133333 0.375000 0 0.133333 0.416667 0 0.133333 0.458333 0 0.133333 0.500000 0 0.133333 0.541667 0 0.133333 0.583333 0 0.133333 0.625000 0 0.133333 0.666667 0 0.133333 0.708333 0 0.133333 0.750000 0 0.133333 0.791667 0 0.133333 0.833333 0 0.133333 0.875000 0 0.133333 0.916667 0 0.133333 0.958333 0 0.133333 1.000000 0 0.141667 0 0 0.141667 0.041667 0 0.141667 0.083333 0 0.141667 0.125000 0 0.141667 0.166667 0 0.141667 0.208333 0 0.141667 0.250000 0 0.141667 0.291667 0 0.141667 0.333333 0 0.141667 0.375000 0 0.141667 0.416667 0 0.141667 0.458333 0 0.141667 0.500000 0 0.141667 0.541667 0 0.141667 0.583333 0 0.141667 0.625000 0 0.141667 0.666667 0 0.141667 0.708333 0 0.141667 0.750000 0 0.141667 0.791667 0 0.141667 0.833333 0 0.141667 0.875000 0 0.141667 0.916667 0 0.141667 0.958333 0 0.141667 1.000000 0 0.150000 0 0 0.150000 0.041667 0 0.150000 0.083333 0 0.150000 0.125000 0 0.150000 0.166667 0 0.150000 0.208333 0 0.150000 0.250000 0 0.150000 0.291667 0 0.150000 0.333333 0 0.150000 0.375000 0 0.150000 0.416667 0 0.150000 0.458333 0 0.150000 0.500000 0 0.150000 0.541667 0 0.150000 0.583333 0 0.150000 0.625000 0 0.150000 0.666667 0 0.150000 0.708333 0 0.150000 0.750000 0 0.150000 0.791667 0 0.150000 0.833333 0 0.150000 0.875000 0 0.150000 0.916667 0 0.150000 0.958333 0 0.150000 1.000000 0 0.158333 0 0 0.158333 0.041667 0 0.158333 0.083333 0 0.158333 0.125000 0 0.158333 0.166667 0 0.158333 0.208333 0 0.158333 0.250000 0 0.158333 0.291667 0 0.158333 0.333333 0 0.158333 0.375000 0 0.158333 0.416667 0 0.158333 0.458333 0 0.158333 0.500000 0 0.158333 0.541667 0 0.158333 0.583333 0 0.158333 0.625000 0 0.158333 0.666667 0 0.158333 0.708333 0 0.158333 0.750000 0 0.158333 0.791667 0 0.158333 0.833333 0 0.158333 0.875000 0 0.158333 0.916667 0 0.158333 0.958333 0 0.158333 1.000000 0 0.166667 0 0 0.166667 0.041667 0 0.166667 0.083333 0 0.166667 0.125000 0 0.166667 0.166667 0 0.166667 0.208333 0 0.166667 0.250000 0 0.166667 0.291667 0 0.166667 0.333333 0 0.166667 0.375000 0 0.166667 0.416667 0 0.166667 0.458333 0 0.166667 0.500000 0 0.166667 0.541667 0 0.166667 0.583333 0 0.166667 0.625000 0 0.166667 0.666667 0 0.166667 0.708333 0 0.166667 0.750000 0 0.166667 0.791667 0 0.166667 0.833333 0 0.166667 0.875000 0 0.166667 0.916667 0 0.166667 0.958333 0 0.166667 1.000000 0 0.175000 0 0 0.175000 0.041667 0 0.175000 0.083333 0 0.175000 0.125000 0 0.175000 0.166667 0 0.175000 0.208333 0 0.175000 0.250000 0 0.175000 0.291667 0 0.175000 0.333333 0 0.175000 0.375000 0 0.175000 0.416667 0 0.175000 0.458333 0 0.175000 0.500000 0 0.175000 0.541667 0 0.175000 0.583333 0 0.175000 0.625000 0 0.175000 0.666667 0 0.175000 0.708333 0 0.175000 0.750000 0 0.175000 0.791667 0 0.175000 0.833333 0 0.175000 0.875000 0 0.175000 0.916667 0 0.175000 0.958333 0 0.175000 1.000000 0 0.183333 0 0 0.183333 0.041667 0 0.183333 0.083333 0 0.183333 0.125000 0 0.183333 0.166667 0 0.183333 0.208333 0 0.183333 0.250000 0 0.183333 0.291667 0 0.183333 0.333333 0 0.183333 0.375000 0 0.183333 0.416667 0 0.183333 0.458333 0 0.183333 0.500000 0 0.183333 0.541667 0 0.183333 0.583333 0 0.183333 0.625000 0 0.183333 0.666667 0 0.183333 0.708333 0 0.183333 0.750000 0 0.183333 0.791667 0 0.183333 0.833333 0 0.183333 0.875000 0 0.183333 0.916667 0 0.183333 0.958333 0 0.183333 1.000000 0 0.191667 0 0 0.191667 0.041667 0 0.191667 0.083333 0 0.191667 0.125000 0 0.191667 0.166667 0 0.191667 0.208333 0 0.191667 0.250000 0 0.191667 0.291667 0 0.191667 0.333333 0 0.191667 0.375000 0 0.191667 0.416667 0 0.191667 0.458333 0 0.191667 0.500000 0 0.191667 0.541667 0 0.191667 0.583333 0 0.191667 0.625000 0 0.191667 0.666667 0 0.191667 0.708333 0 0.191667 0.750000 0 0.191667 0.791667 0 0.191667 0.833333 0 0.191667 0.875000 0 0.191667 0.916667 0 0.191667 0.958333 0 0.191667 1.000000 0 0.200000 0 0 0.200000 0.041667 0 0.200000 0.083333 0 0.200000 0.125000 0 0.200000 0.166667 0 0.200000 0.208333 0 0.200000 0.250000 0 0.200000 0.291667 0 0.200000 0.333333 0 0.200000 0.375000 0 0.200000 0.416667 0 0.200000 0.458333 0 0.200000 0.500000 0 0.200000 0.541667 0 0.200000 0.583333 0 0.200000 0.625000 0 0.200000 0.666667 0 0.200000 0.708333 0 0.200000 0.750000 0 0.200000 0.791667 0 0.200000 0.833333 0 0.200000 0.875000 0 0.200000 0.916667 0 0.200000 0.958333 0 0.200000 1.000000 0 0.208333 0 0 0.208333 0.041667 0 0.208333 0.083333 0 0.208333 0.125000 0 0.208333 0.166667 0 0.208333 0.208333 0 0.208333 0.250000 0 0.208333 0.291667 0 0.208333 0.333333 0 0.208333 0.375000 0 0.208333 0.416667 0 0.208333 0.458333 0 0.208333 0.500000 0 0.208333 0.541667 0 0.208333 0.583333 0 0.208333 0.625000 0 0.208333 0.666667 0 0.208333 0.708333 0 0.208333 0.750000 0 0.208333 0.791667 0 0.208333 0.833333 0 0.208333 0.875000 0 0.208333 0.916667 0 0.208333 0.958333 0 0.208333 1.000000 0 0.216667 0 0 0.216667 0.041667 0 0.216667 0.083333 0 0.216667 0.125000 0 0.216667 0.166667 0 0.216667 0.208333 0 0.216667 0.250000 0 0.216667 0.291667 0 0.216667 0.333333 0 0.216667 0.375000 0 0.216667 0.416667 0 0.216667 0.458333 0 0.216667 0.500000 0 0.216667 0.541667 0 0.216667 0.583333 0 0.216667 0.625000 0 0.216667 0.666667 0 0.216667 0.708333 0 0.216667 0.750000 0 0.216667 0.791667 0 0.216667 0.833333 0 0.216667 0.875000 0 0.216667 0.916667 0 0.216667 0.958333 0 0.216667 1.000000 0 0.225000 0 0 0.225000 0.041667 0 0.225000 0.083333 0 0.225000 0.125000 0 0.225000 0.166667 0 0.225000 0.208333 0 0.225000 0.250000 0 0.225000 0.291667 0 0.225000 0.333333 0 0.225000 0.375000 0 0.225000 0.416667 0 0.225000 0.458333 0 0.225000 0.500000 0 0.225000 0.541667 0 0.225000 0.583333 0 0.225000 0.625000 0 0.225000 0.666667 0 0.225000 0.708333 0 0.225000 0.750000 0 0.225000 0.791667 0 0.225000 0.833333 0 0.225000 0.875000 0 0.225000 0.916667 0 0.225000 0.958333 0 0.225000 1.000000 0 0.233333 0 0 0.233333 0.041667 0 0.233333 0.083333 0 0.233333 0.125000 0 0.233333 0.166667 0 0.233333 0.208333 0 0.233333 0.250000 0 0.233333 0.291667 0 0.233333 0.333333 0 0.233333 0.375000 0 0.233333 0.416667 0 0.233333 0.458333 0 0.233333 0.500000 0 0.233333 0.541667 0 0.233333 0.583333 0 0.233333 0.625000 0 0.233333 0.666667 0 0.233333 0.708333 0 0.233333 0.750000 0 0.233333 0.791667 0 0.233333 0.833333 0 0.233333 0.875000 0 0.233333 0.916667 0 0.233333 0.958333 0 0.233333 1.000000 0 0.241667 0 0 0.241667 0.041667 0 0.241667 0.083333 0 0.241667 0.125000 0 0.241667 0.166667 0 0.241667 0.208333 0 0.241667 0.250000 0 0.241667 0.291667 0 0.241667 0.333333 0 0.241667 0.375000 0 0.241667 0.416667 0 0.241667 0.458333 0 0.241667 0.500000 0 0.241667 0.541667 0 0.241667 0.583333 0 0.241667 0.625000 0 0.241667 0.666667 0 0.241667 0.708333 0 0.241667 0.750000 0 0.241667 0.791667 0 0.241667 0.833333 0 0.241667 0.875000 0 0.241667 0.916667 0 0.241667 0.958333 0 0.241667 1.000000 0 0.250000 0 0 0.250000 0.041667 0 0.250000 0.083333 0 0.250000 0.125000 0 0.250000 0.166667 0 0.250000 0.208333 0 0.250000 0.250000 0 0.250000 0.291667 0 0.250000 0.333333 0 0.250000 0.375000 0 0.250000 0.416667 0 0.250000 0.458333 0 0.250000 0.500000 0 0.250000 0.541667 0 0.250000 0.583333 0 0.250000 0.625000 0 0.250000 0.666667 0 0.250000 0.708333 0 0.250000 0.750000 0 0.250000 0.791667 0 0.250000 0.833333 0 0.250000 0.875000 0 0.250000 0.916667 0 0.250000 0.958333 0 0.250000 1.000000 0 0.258333 0 0 0.258333 0.041667 0 0.258333 0.083333 0 0.258333 0.125000 0 0.258333 0.166667 0 0.258333 0.208333 0 0.258333 0.250000 0 0.258333 0.291667 0 0.258333 0.333333 0 0.258333 0.375000 0 0.258333 0.416667 0 0.258333 0.458333 0 0.258333 0.500000 0 0.258333 0.541667 0 0.258333 0.583333 0 0.258333 0.625000 0 0.258333 0.666667 0 0.258333 0.708333 0 0.258333 0.750000 0 0.258333 0.791667 0 0.258333 0.833333 0 0.258333 0.875000 0 0.258333 0.916667 0 0.258333 0.958333 0 0.258333 1.000000 0 0.266667 0 0 0.266667 0.041667 0 0.266667 0.083333 0 0.266667 0.125000 0 0.266667 0.166667 0 0.266667 0.208333 0 0.266667 0.250000 0 0.266667 0.291667 0 0.266667 0.333333 0 0.266667 0.375000 0 0.266667 0.416667 0 0.266667 0.458333 0 0.266667 0.500000 0 0.266667 0.541667 0 0.266667 0.583333 0 0.266667 0.625000 0 0.266667 0.666667 0 0.266667 0.708333 0 0.266667 0.750000 0 0.266667 0.791667 0 0.266667 0.833333 0 0.266667 0.875000 0 0.266667 0.916667 0 0.266667 0.958333 0 0.266667 1.000000 0 0.275000 0 0 0.275000 0.041667 0 0.275000 0.083333 0 0.275000 0.125000 0 0.275000 0.166667 0 0.275000 0.208333 0 0.275000 0.250000 0 0.275000 0.291667 0 0.275000 0.333333 0 0.275000 0.375000 0 0.275000 0.416667 0 0.275000 0.458333 0 0.275000 0.500000 0 0.275000 0.541667 0 0.275000 0.583333 0 0.275000 0.625000 0 0.275000 0.666667 0 0.275000 0.708333 0 0.275000 0.750000 0 0.275000 0.791667 0 0.275000 0.833333 0 0.275000 0.875000 0 0.275000 0.916667 0 0.275000 0.958333 0 0.275000 1.000000 0 0.283333 0 0 0.283333 0.041667 0 0.283333 0.083333 0 0.283333 0.125000 0 0.283333 0.166667 0 0.283333 0.208333 0 0.283333 0.250000 0 0.283333 0.291667 0 0.283333 0.333333 0 0.283333 0.375000 0 0.283333 0.416667 0 0.283333 0.458333 0 0.283333 0.500000 0 0.283333 0.541667 0 0.283333 0.583333 0 0.283333 0.625000 0 0.283333 0.666667 0 0.283333 0.708333 0 0.283333 0.750000 0 0.283333 0.791667 0 0.283333 0.833333 0 0.283333 0.875000 0 0.283333 0.916667 0 0.283333 0.958333 0 0.283333 1.000000 0 0.291667 0 0 0.291667 0.041667 0 0.291667 0.083333 0 0.291667 0.125000 0 0.291667 0.166667 0 0.291667 0.208333 0 0.291667 0.250000 0 0.291667 0.291667 0 0.291667 0.333333 0 0.291667 0.375000 0 0.291667 0.416667 0 0.291667 0.458333 0 0.291667 0.500000 0 0.291667 0.541667 0 0.291667 0.583333 0 0.291667 0.625000 0 0.291667 0.666667 0 0.291667 0.708333 0 0.291667 0.750000 0 0.291667 0.791667 0 0.291667 0.833333 0 0.291667 0.875000 0 0.291667 0.916667 0 0.291667 0.958333 0 0.291667 1.000000 0 0.300000 0 0 0.300000 0.041667 0 0.300000 0.083333 0 0.300000 0.125000 0 0.300000 0.166667 0 0.300000 0.208333 0 0.300000 0.250000 0 0.300000 0.291667 0 0.300000 0.333333 0 0.300000 0.375000 0 0.300000 0.416667 0 0.300000 0.458333 0 0.300000 0.500000 0 0.300000 0.541667 0 0.300000 0.583333 0 0.300000 0.625000 0 0.300000 0.666667 0 0.300000 0.708333 0 0.300000 0.750000 0 0.300000 0.791667 0 0.300000 0.833333 0 0.300000 0.875000 0 0.300000 0.916667 0 0.300000 0.958333 0 0.300000 1.000000 0 0.308333 0 0 0.308333 0.041667 0 0.308333 0.083333 0 0.308333 0.125000 0 0.308333 0.166667 0 0.308333 0.208333 0 0.308333 0.250000 0 0.308333 0.291667 0 0.308333 0.333333 0 0.308333 0.375000 0 0.308333 0.416667 0 0.308333 0.458333 0 0.308333 0.500000 0 0.308333 0.541667 0 0.308333 0.583333 0 0.308333 0.625000 0 0.308333 0.666667 0 0.308333 0.708333 0 0.308333 0.750000 0 0.308333 0.791667 0 0.308333 0.833333 0 0.308333 0.875000 0 0.308333 0.916667 0 0.308333 0.958333 0 0.308333 1.000000 0 0.316666 0 0 0.316666 0.041667 0 0.316666 0.083333 0 0.316666 0.125000 0 0.316666 0.166667 0 0.316666 0.208333 0 0.316666 0.250000 0 0.316666 0.291667 0 0.316666 0.333333 0 0.316666 0.375000 0 0.316666 0.416667 0 0.316666 0.458333 0 0.316666 0.500000 0 0.316666 0.541667 0 0.316666 0.583333 0 0.316666 0.625000 0 0.316666 0.666667 0 0.316666 0.708333 0 0.316666 0.750000 0 0.316666 0.791667 0 0.316666 0.833333 0 0.316666 0.875000 0 0.316666 0.916667 0 0.316666 0.958333 0 0.316666 1.000000 0 0.325000 0 0 0.325000 0.041667 0 0.325000 0.083333 0 0.325000 0.125000 0 0.325000 0.166667 0 0.325000 0.208333 0 0.325000 0.250000 0 0.325000 0.291667 0 0.325000 0.333333 0 0.325000 0.375000 0 0.325000 0.416667 0 0.325000 0.458333 0 0.325000 0.500000 0 0.325000 0.541667 0 0.325000 0.583333 0 0.325000 0.625000 0 0.325000 0.666667 0 0.325000 0.708333 0 0.325000 0.750000 0 0.325000 0.791667 0 0.325000 0.833333 0 0.325000 0.875000 0 0.325000 0.916667 0 0.325000 0.958333 0 0.325000 1.000000 0 0.333333 0 0 0.333333 0.041667 0 0.333333 0.083333 0 0.333333 0.125000 0 0.333333 0.166667 0 0.333333 0.208333 0 0.333333 0.250000 0 0.333333 0.291667 0 0.333333 0.333333 0 0.333333 0.375000 0 0.333333 0.416667 0 0.333333 0.458333 0 0.333333 0.500000 0 0.333333 0.541667 0 0.333333 0.583333 0 0.333333 0.625000 0 0.333333 0.666667 0 0.333333 0.708333 0 0.333333 0.750000 0 0.333333 0.791667 0 0.333333 0.833333 0 0.333333 0.875000 0 0.333333 0.916667 0 0.333333 0.958333 0 0.333333 1.000000 0 0.341666 0 0 0.341666 0.041667 0 0.341666 0.083333 0 0.341666 0.125000 0 0.341666 0.166667 0 0.341666 0.208333 0 0.341666 0.250000 0 0.341666 0.291667 0 0.341666 0.333333 0 0.341666 0.375000 0 0.341666 0.416667 0 0.341666 0.458333 0 0.341666 0.500000 0 0.341666 0.541667 0 0.341666 0.583333 0 0.341666 0.625000 0 0.341666 0.666667 0 0.341666 0.708333 0 0.341666 0.750000 0 0.341666 0.791667 0 0.341666 0.833333 0 0.341666 0.875000 0 0.341666 0.916667 0 0.341666 0.958333 0 0.341666 1.000000 0 0.350000 0 0 0.350000 0.041667 0 0.350000 0.083333 0 0.350000 0.125000 0 0.350000 0.166667 0 0.350000 0.208333 0 0.350000 0.250000 0 0.350000 0.291667 0 0.350000 0.333333 0 0.350000 0.375000 0 0.350000 0.416667 0 0.350000 0.458333 0 0.350000 0.500000 0 0.350000 0.541667 0 0.350000 0.583333 0 0.350000 0.625000 0 0.350000 0.666667 0 0.350000 0.708333 0 0.350000 0.750000 0 0.350000 0.791667 0 0.350000 0.833333 0 0.350000 0.875000 0 0.350000 0.916667 0 0.350000 0.958333 0 0.350000 1.000000 0 0.358333 0 0 0.358333 0.041667 0 0.358333 0.083333 0 0.358333 0.125000 0 0.358333 0.166667 0 0.358333 0.208333 0 0.358333 0.250000 0 0.358333 0.291667 0 0.358333 0.333333 0 0.358333 0.375000 0 0.358333 0.416667 0 0.358333 0.458333 0 0.358333 0.500000 0 0.358333 0.541667 0 0.358333 0.583333 0 0.358333 0.625000 0 0.358333 0.666667 0 0.358333 0.708333 0 0.358333 0.750000 0 0.358333 0.791667 0 0.358333 0.833333 0 0.358333 0.875000 0 0.358333 0.916667 0 0.358333 0.958333 0 0.358333 1.000000 0 0.366666 0 0 0.366666 0.041667 0 0.366666 0.083333 0 0.366666 0.125000 0 0.366666 0.166667 0 0.366666 0.208333 0 0.366666 0.250000 0 0.366666 0.291667 0 0.366666 0.333333 0 0.366666 0.375000 0 0.366666 0.416667 0 0.366666 0.458333 0 0.366666 0.500000 0 0.366666 0.541667 0 0.366666 0.583333 0 0.366666 0.625000 0 0.366666 0.666667 0 0.366666 0.708333 0 0.366666 0.750000 0 0.366666 0.791667 0 0.366666 0.833333 0 0.366666 0.875000 0 0.366666 0.916667 0 0.366666 0.958333 0 0.366666 1.000000 0 0.375000 0 0 0.375000 0.041667 0 0.375000 0.083333 0 0.375000 0.125000 0 0.375000 0.166667 0 0.375000 0.208333 0 0.375000 0.250000 0 0.375000 0.291667 0 0.375000 0.333333 0 0.375000 0.375000 0 0.375000 0.416667 0 0.375000 0.458333 0 0.375000 0.500000 0 0.375000 0.541667 0 0.375000 0.583333 0 0.375000 0.625000 0 0.375000 0.666667 0 0.375000 0.708333 0 0.375000 0.750000 0 0.375000 0.791667 0 0.375000 0.833333 0 0.375000 0.875000 0 0.375000 0.916667 0 0.375000 0.958333 0 0.375000 1.000000 0 0.383333 0 0 0.383333 0.041667 0 0.383333 0.083333 0 0.383333 0.125000 0 0.383333 0.166667 0 0.383333 0.208333 0 0.383333 0.250000 0 0.383333 0.291667 0 0.383333 0.333333 0 0.383333 0.375000 0 0.383333 0.416667 0 0.383333 0.458333 0 0.383333 0.500000 0 0.383333 0.541667 0 0.383333 0.583333 0 0.383333 0.625000 0 0.383333 0.666667 0 0.383333 0.708333 0 0.383333 0.750000 0 0.383333 0.791667 0 0.383333 0.833333 0 0.383333 0.875000 0 0.383333 0.916667 0 0.383333 0.958333 0 0.383333 1.000000 0 0.391666 0 0 0.391666 0.041667 0 0.391666 0.083333 0 0.391666 0.125000 0 0.391666 0.166667 0 0.391666 0.208333 0 0.391666 0.250000 0 0.391666 0.291667 0 0.391666 0.333333 0 0.391666 0.375000 0 0.391666 0.416667 0 0.391666 0.458333 0 0.391666 0.500000 0 0.391666 0.541667 0 0.391666 0.583333 0 0.391666 0.625000 0 0.391666 0.666667 0 0.391666 0.708333 0 0.391666 0.750000 0 0.391666 0.791667 0 0.391666 0.833333 0 0.391666 0.875000 0 0.391666 0.916667 0 0.391666 0.958333 0 0.391666 1.000000 0 0.400000 0 0 0.400000 0.041667 0 0.400000 0.083333 0 0.400000 0.125000 0 0.400000 0.166667 0 0.400000 0.208333 0 0.400000 0.250000 0 0.400000 0.291667 0 0.400000 0.333333 0 0.400000 0.375000 0 0.400000 0.416667 0 0.400000 0.458333 0 0.400000 0.500000 0 0.400000 0.541667 0 0.400000 0.583333 0 0.400000 0.625000 0 0.400000 0.666667 0 0.400000 0.708333 0 0.400000 0.750000 0 0.400000 0.791667 0 0.400000 0.833333 0 0.400000 0.875000 0 0.400000 0.916667 0 0.400000 0.958333 0 0.400000 1.000000 0 0.408333 0 0 0.408333 0.041667 0 0.408333 0.083333 0 0.408333 0.125000 0 0.408333 0.166667 0 0.408333 0.208333 0 0.408333 0.250000 0 0.408333 0.291667 0 0.408333 0.333333 0 0.408333 0.375000 0 0.408333 0.416667 0 0.408333 0.458333 0 0.408333 0.500000 0 0.408333 0.541667 0 0.408333 0.583333 0 0.408333 0.625000 0 0.408333 0.666667 0 0.408333 0.708333 0 0.408333 0.750000 0 0.408333 0.791667 0 0.408333 0.833333 0 0.408333 0.875000 0 0.408333 0.916667 0 0.408333 0.958333 0 0.408333 1.000000 0 0.416666 0 0 0.416666 0.041667 0 0.416666 0.083333 0 0.416666 0.125000 0 0.416666 0.166667 0 0.416666 0.208333 0 0.416666 0.250000 0 0.416666 0.291667 0 0.416666 0.333333 0 0.416666 0.375000 0 0.416666 0.416667 0 0.416666 0.458333 0 0.416666 0.500000 0 0.416666 0.541667 0 0.416666 0.583333 0 0.416666 0.625000 0 0.416666 0.666667 0 0.416666 0.708333 0 0.416666 0.750000 0 0.416666 0.791667 0 0.416666 0.833333 0 0.416666 0.875000 0 0.416666 0.916667 0 0.416666 0.958333 0 0.416666 1.000000 0 0.425000 0 0 0.425000 0.041667 0 0.425000 0.083333 0 0.425000 0.125000 0 0.425000 0.166667 0 0.425000 0.208333 0 0.425000 0.250000 0 0.425000 0.291667 0 0.425000 0.333333 0 0.425000 0.375000 0 0.425000 0.416667 0 0.425000 0.458333 0 0.425000 0.500000 0 0.425000 0.541667 0 0.425000 0.583333 0 0.425000 0.625000 0 0.425000 0.666667 0 0.425000 0.708333 0 0.425000 0.750000 0 0.425000 0.791667 0 0.425000 0.833333 0 0.425000 0.875000 0 0.425000 0.916667 0 0.425000 0.958333 0 0.425000 1.000000 0 0.433333 0 0 0.433333 0.041667 0 0.433333 0.083333 0 0.433333 0.125000 0 0.433333 0.166667 0 0.433333 0.208333 0 0.433333 0.250000 0 0.433333 0.291667 0 0.433333 0.333333 0 0.433333 0.375000 0 0.433333 0.416667 0 0.433333 0.458333 0 0.433333 0.500000 0 0.433333 0.541667 0 0.433333 0.583333 0 0.433333 0.625000 0 0.433333 0.666667 0 0.433333 0.708333 0 0.433333 0.750000 0 0.433333 0.791667 0 0.433333 0.833333 0 0.433333 0.875000 0 0.433333 0.916667 0 0.433333 0.958333 0 0.433333 1.000000 0 0.441666 0 0 0.441666 0.041667 0 0.441666 0.083333 0 0.441666 0.125000 0 0.441666 0.166667 0 0.441666 0.208333 0 0.441666 0.250000 0 0.441666 0.291667 0 0.441666 0.333333 0 0.441666 0.375000 0 0.441666 0.416667 0 0.441666 0.458333 0 0.441666 0.500000 0 0.441666 0.541667 0 0.441666 0.583333 0 0.441666 0.625000 0 0.441666 0.666667 0 0.441666 0.708333 0 0.441666 0.750000 0 0.441666 0.791667 0 0.441666 0.833333 0 0.441666 0.875000 0 0.441666 0.916667 0 0.441666 0.958333 0 0.441666 1.000000 0 0.450000 0 0 0.450000 0.041667 0 0.450000 0.083333 0 0.450000 0.125000 0 0.450000 0.166667 0 0.450000 0.208333 0 0.450000 0.250000 0 0.450000 0.291667 0 0.450000 0.333333 0 0.450000 0.375000 0 0.450000 0.416667 0 0.450000 0.458333 0 0.450000 0.500000 0 0.450000 0.541667 0 0.450000 0.583333 0 0.450000 0.625000 0 0.450000 0.666667 0 0.450000 0.708333 0 0.450000 0.750000 0 0.450000 0.791667 0 0.450000 0.833333 0 0.450000 0.875000 0 0.450000 0.916667 0 0.450000 0.958333 0 0.450000 1.000000 0 0.458333 0 0 0.458333 0.041667 0 0.458333 0.083333 0 0.458333 0.125000 0 0.458333 0.166667 0 0.458333 0.208333 0 0.458333 0.250000 0 0.458333 0.291667 0 0.458333 0.333333 0 0.458333 0.375000 0 0.458333 0.416667 0 0.458333 0.458333 0 0.458333 0.500000 0 0.458333 0.541667 0 0.458333 0.583333 0 0.458333 0.625000 0 0.458333 0.666667 0 0.458333 0.708333 0 0.458333 0.750000 0 0.458333 0.791667 0 0.458333 0.833333 0 0.458333 0.875000 0 0.458333 0.916667 0 0.458333 0.958333 0 0.458333 1.000000 0 0.466666 0 0 0.466666 0.041667 0 0.466666 0.083333 0 0.466666 0.125000 0 0.466666 0.166667 0 0.466666 0.208333 0 0.466666 0.250000 0 0.466666 0.291667 0 0.466666 0.333333 0 0.466666 0.375000 0 0.466666 0.416667 0 0.466666 0.458333 0 0.466666 0.500000 0 0.466666 0.541667 0 0.466666 0.583333 0 0.466666 0.625000 0 0.466666 0.666667 0 0.466666 0.708333 0 0.466666 0.750000 0 0.466666 0.791667 0 0.466666 0.833333 0 0.466666 0.875000 0 0.466666 0.916667 0 0.466666 0.958333 0 0.466666 1.000000 0 0.475000 0 0 0.475000 0.041667 0 0.475000 0.083333 0 0.475000 0.125000 0 0.475000 0.166667 0 0.475000 0.208333 0 0.475000 0.250000 0 0.475000 0.291667 0 0.475000 0.333333 0 0.475000 0.375000 0 0.475000 0.416667 0 0.475000 0.458333 0 0.475000 0.500000 0 0.475000 0.541667 0 0.475000 0.583333 0 0.475000 0.625000 0 0.475000 0.666667 0 0.475000 0.708333 0 0.475000 0.750000 0 0.475000 0.791667 0 0.475000 0.833333 0 0.475000 0.875000 0 0.475000 0.916667 0 0.475000 0.958333 0 0.475000 1.000000 0 0.483333 0 0 0.483333 0.041667 0 0.483333 0.083333 0 0.483333 0.125000 0 0.483333 0.166667 0 0.483333 0.208333 0 0.483333 0.250000 0 0.483333 0.291667 0 0.483333 0.333333 0 0.483333 0.375000 0 0.483333 0.416667 0 0.483333 0.458333 0 0.483333 0.500000 0 0.483333 0.541667 0 0.483333 0.583333 0 0.483333 0.625000 0 0.483333 0.666667 0 0.483333 0.708333 0 0.483333 0.750000 0 0.483333 0.791667 0 0.483333 0.833333 0 0.483333 0.875000 0 0.483333 0.916667 0 0.483333 0.958333 0 0.483333 1.000000 0 0.491666 0 0 0.491666 0.041667 0 0.491666 0.083333 0 0.491666 0.125000 0 0.491666 0.166667 0 0.491666 0.208333 0 0.491666 0.250000 0 0.491666 0.291667 0 0.491666 0.333333 0 0.491666 0.375000 0 0.491666 0.416667 0 0.491666 0.458333 0 0.491666 0.500000 0 0.491666 0.541667 0 0.491666 0.583333 0 0.491666 0.625000 0 0.491666 0.666667 0 0.491666 0.708333 0 0.491666 0.750000 0 0.491666 0.791667 0 0.491666 0.833333 0 0.491666 0.875000 0 0.491666 0.916667 0 0.491666 0.958333 0 0.491666 1.000000 0 0.500000 0 0 0.500000 0.041667 0 0.500000 0.083333 0 0.500000 0.125000 0 0.500000 0.166667 0 0.500000 0.208333 0 0.500000 0.250000 0 0.500000 0.291667 0 0.500000 0.333333 0 0.500000 0.375000 0 0.500000 0.416667 0 0.500000 0.458333 0 0.500000 0.500000 0 0.500000 0.541667 0 0.500000 0.583333 0 0.500000 0.625000 0 0.500000 0.666667 0 0.500000 0.708333 0 0.500000 0.750000 0 0.500000 0.791667 0 0.500000 0.833333 0 0.500000 0.875000 0 0.500000 0.916667 0 0.500000 0.958333 0 0.500000 1.000000 0 0.508333 0 0 0.508333 0.041667 0 0.508333 0.083333 0 0.508333 0.125000 0 0.508333 0.166667 0 0.508333 0.208333 0 0.508333 0.250000 0 0.508333 0.291667 0 0.508333 0.333333 0 0.508333 0.375000 0 0.508333 0.416667 0 0.508333 0.458333 0 0.508333 0.500000 0 0.508333 0.541667 0 0.508333 0.583333 0 0.508333 0.625000 0 0.508333 0.666667 0 0.508333 0.708333 0 0.508333 0.750000 0 0.508333 0.791667 0 0.508333 0.833333 0 0.508333 0.875000 0 0.508333 0.916667 0 0.508333 0.958333 0 0.508333 1.000000 0 0.516666 0 0 0.516666 0.041667 0 0.516666 0.083333 0 0.516666 0.125000 0 0.516666 0.166667 0 0.516666 0.208333 0 0.516666 0.250000 0 0.516666 0.291667 0 0.516666 0.333333 0 0.516666 0.375000 0 0.516666 0.416667 0 0.516666 0.458333 0 0.516666 0.500000 0 0.516666 0.541667 0 0.516666 0.583333 0 0.516666 0.625000 0 0.516666 0.666667 0 0.516666 0.708333 0 0.516666 0.750000 0 0.516666 0.791667 0 0.516666 0.833333 0 0.516666 0.875000 0 0.516666 0.916667 0 0.516666 0.958333 0 0.516666 1.000000 0 0.525000 0 0 0.525000 0.041667 0 0.525000 0.083333 0 0.525000 0.125000 0 0.525000 0.166667 0 0.525000 0.208333 0 0.525000 0.250000 0 0.525000 0.291667 0 0.525000 0.333333 0 0.525000 0.375000 0 0.525000 0.416667 0 0.525000 0.458333 0 0.525000 0.500000 0 0.525000 0.541667 0 0.525000 0.583333 0 0.525000 0.625000 0 0.525000 0.666667 0 0.525000 0.708333 0 0.525000 0.750000 0 0.525000 0.791667 0 0.525000 0.833333 0 0.525000 0.875000 0 0.525000 0.916667 0 0.525000 0.958333 0 0.525000 1.000000 0 0.533333 0 0 0.533333 0.041667 0 0.533333 0.083333 0 0.533333 0.125000 0 0.533333 0.166667 0 0.533333 0.208333 0 0.533333 0.250000 0 0.533333 0.291667 0 0.533333 0.333333 0 0.533333 0.375000 0 0.533333 0.416667 0 0.533333 0.458333 0 0.533333 0.500000 0 0.533333 0.541667 0 0.533333 0.583333 0 0.533333 0.625000 0 0.533333 0.666667 0 0.533333 0.708333 0 0.533333 0.750000 0 0.533333 0.791667 0 0.533333 0.833333 0 0.533333 0.875000 0 0.533333 0.916667 0 0.533333 0.958333 0 0.533333 1.000000 0 0.541666 0 0 0.541666 0.041667 0 0.541666 0.083333 0 0.541666 0.125000 0 0.541666 0.166667 0 0.541666 0.208333 0 0.541666 0.250000 0 0.541666 0.291667 0 0.541666 0.333333 0 0.541666 0.375000 0 0.541666 0.416667 0 0.541666 0.458333 0 0.541666 0.500000 0 0.541666 0.541667 0 0.541666 0.583333 0 0.541666 0.625000 0 0.541666 0.666667 0 0.541666 0.708333 0 0.541666 0.750000 0 0.541666 0.791667 0 0.541666 0.833333 0 0.541666 0.875000 0 0.541666 0.916667 0 0.541666 0.958333 0 0.541666 1.000000 0 0.550000 0 0 0.550000 0.041667 0 0.550000 0.083333 0 0.550000 0.125000 0 0.550000 0.166667 0 0.550000 0.208333 0 0.550000 0.250000 0 0.550000 0.291667 0 0.550000 0.333333 0 0.550000 0.375000 0 0.550000 0.416667 0 0.550000 0.458333 0 0.550000 0.500000 0 0.550000 0.541667 0 0.550000 0.583333 0 0.550000 0.625000 0 0.550000 0.666667 0 0.550000 0.708333 0 0.550000 0.750000 0 0.550000 0.791667 0 0.550000 0.833333 0 0.550000 0.875000 0 0.550000 0.916667 0 0.550000 0.958333 0 0.550000 1.000000 0 0.558333 0 0 0.558333 0.041667 0 0.558333 0.083333 0 0.558333 0.125000 0 0.558333 0.166667 0 0.558333 0.208333 0 0.558333 0.250000 0 0.558333 0.291667 0 0.558333 0.333333 0 0.558333 0.375000 0 0.558333 0.416667 0 0.558333 0.458333 0 0.558333 0.500000 0 0.558333 0.541667 0 0.558333 0.583333 0 0.558333 0.625000 0 0.558333 0.666667 0 0.558333 0.708333 0 0.558333 0.750000 0 0.558333 0.791667 0 0.558333 0.833333 0 0.558333 0.875000 0 0.558333 0.916667 0 0.558333 0.958333 0 0.558333 1.000000 0 0.566666 0 0 0.566666 0.041667 0 0.566666 0.083333 0 0.566666 0.125000 0 0.566666 0.166667 0 0.566666 0.208333 0 0.566666 0.250000 0 0.566666 0.291667 0 0.566666 0.333333 0 0.566666 0.375000 0 0.566666 0.416667 0 0.566666 0.458333 0 0.566666 0.500000 0 0.566666 0.541667 0 0.566666 0.583333 0 0.566666 0.625000 0 0.566666 0.666667 0 0.566666 0.708333 0 0.566666 0.750000 0 0.566666 0.791667 0 0.566666 0.833333 0 0.566666 0.875000 0 0.566666 0.916667 0 0.566666 0.958333 0 0.566666 1.000000 0 0.575000 0 0 0.575000 0.041667 0 0.575000 0.083333 0 0.575000 0.125000 0 0.575000 0.166667 0 0.575000 0.208333 0 0.575000 0.250000 0 0.575000 0.291667 0 0.575000 0.333333 0 0.575000 0.375000 0 0.575000 0.416667 0 0.575000 0.458333 0 0.575000 0.500000 0 0.575000 0.541667 0 0.575000 0.583333 0 0.575000 0.625000 0 0.575000 0.666667 0 0.575000 0.708333 0 0.575000 0.750000 0 0.575000 0.791667 0 0.575000 0.833333 0 0.575000 0.875000 0 0.575000 0.916667 0 0.575000 0.958333 0 0.575000 1.000000 0 0.583333 0 0 0.583333 0.041667 0 0.583333 0.083333 0 0.583333 0.125000 0 0.583333 0.166667 0 0.583333 0.208333 0 0.583333 0.250000 0 0.583333 0.291667 0 0.583333 0.333333 0 0.583333 0.375000 0 0.583333 0.416667 0 0.583333 0.458333 0 0.583333 0.500000 0 0.583333 0.541667 0 0.583333 0.583333 0 0.583333 0.625000 0 0.583333 0.666667 0 0.583333 0.708333 0 0.583333 0.750000 0 0.583333 0.791667 0 0.583333 0.833333 0 0.583333 0.875000 0 0.583333 0.916667 0 0.583333 0.958333 0 0.583333 1.000000 0 0.591666 0 0 0.591666 0.041667 0 0.591666 0.083333 0 0.591666 0.125000 0 0.591666 0.166667 0 0.591666 0.208333 0 0.591666 0.250000 0 0.591666 0.291667 0 0.591666 0.333333 0 0.591666 0.375000 0 0.591666 0.416667 0 0.591666 0.458333 0 0.591666 0.500000 0 0.591666 0.541667 0 0.591666 0.583333 0 0.591666 0.625000 0 0.591666 0.666667 0 0.591666 0.708333 0 0.591666 0.750000 0 0.591666 0.791667 0 0.591666 0.833333 0 0.591666 0.875000 0 0.591666 0.916667 0 0.591666 0.958333 0 0.591666 1.000000 0 0.599999 0 0 0.599999 0.041667 0 0.599999 0.083333 0 0.599999 0.125000 0 0.599999 0.166667 0 0.599999 0.208333 0 0.599999 0.250000 0 0.599999 0.291667 0 0.599999 0.333333 0 0.599999 0.375000 0 0.599999 0.416667 0 0.599999 0.458333 0 0.599999 0.500000 0 0.599999 0.541667 0 0.599999 0.583333 0 0.599999 0.625000 0 0.599999 0.666667 0 0.599999 0.708333 0 0.599999 0.750000 0 0.599999 0.791667 0 0.599999 0.833333 0 0.599999 0.875000 0 0.599999 0.916667 0 0.599999 0.958333 0 0.599999 1.000000 0 0.608333 0 0 0.608333 0.041667 0 0.608333 0.083333 0 0.608333 0.125000 0 0.608333 0.166667 0 0.608333 0.208333 0 0.608333 0.250000 0 0.608333 0.291667 0 0.608333 0.333333 0 0.608333 0.375000 0 0.608333 0.416667 0 0.608333 0.458333 0 0.608333 0.500000 0 0.608333 0.541667 0 0.608333 0.583333 0 0.608333 0.625000 0 0.608333 0.666667 0 0.608333 0.708333 0 0.608333 0.750000 0 0.608333 0.791667 0 0.608333 0.833333 0 0.608333 0.875000 0 0.608333 0.916667 0 0.608333 0.958333 0 0.608333 1.000000 0 0.616666 0 0 0.616666 0.041667 0 0.616666 0.083333 0 0.616666 0.125000 0 0.616666 0.166667 0 0.616666 0.208333 0 0.616666 0.250000 0 0.616666 0.291667 0 0.616666 0.333333 0 0.616666 0.375000 0 0.616666 0.416667 0 0.616666 0.458333 0 0.616666 0.500000 0 0.616666 0.541667 0 0.616666 0.583333 0 0.616666 0.625000 0 0.616666 0.666667 0 0.616666 0.708333 0 0.616666 0.750000 0 0.616666 0.791667 0 0.616666 0.833333 0 0.616666 0.875000 0 0.616666 0.916667 0 0.616666 0.958333 0 0.616666 1.000000 0 0.624999 0 0 0.624999 0.041667 0 0.624999 0.083333 0 0.624999 0.125000 0 0.624999 0.166667 0 0.624999 0.208333 0 0.624999 0.250000 0 0.624999 0.291667 0 0.624999 0.333333 0 0.624999 0.375000 0 0.624999 0.416667 0 0.624999 0.458333 0 0.624999 0.500000 0 0.624999 0.541667 0 0.624999 0.583333 0 0.624999 0.625000 0 0.624999 0.666667 0 0.624999 0.708333 0 0.624999 0.750000 0 0.624999 0.791667 0 0.624999 0.833333 0 0.624999 0.875000 0 0.624999 0.916667 0 0.624999 0.958333 0 0.624999 1.000000 0 0.633333 0 0 0.633333 0.041667 0 0.633333 0.083333 0 0.633333 0.125000 0 0.633333 0.166667 0 0.633333 0.208333 0 0.633333 0.250000 0 0.633333 0.291667 0 0.633333 0.333333 0 0.633333 0.375000 0 0.633333 0.416667 0 0.633333 0.458333 0 0.633333 0.500000 0 0.633333 0.541667 0 0.633333 0.583333 0 0.633333 0.625000 0 0.633333 0.666667 0 0.633333 0.708333 0 0.633333 0.750000 0 0.633333 0.791667 0 0.633333 0.833333 0 0.633333 0.875000 0 0.633333 0.916667 0 0.633333 0.958333 0 0.633333 1.000000 0 0.641666 0 0 0.641666 0.041667 0 0.641666 0.083333 0 0.641666 0.125000 0 0.641666 0.166667 0 0.641666 0.208333 0 0.641666 0.250000 0 0.641666 0.291667 0 0.641666 0.333333 0 0.641666 0.375000 0 0.641666 0.416667 0 0.641666 0.458333 0 0.641666 0.500000 0 0.641666 0.541667 0 0.641666 0.583333 0 0.641666 0.625000 0 0.641666 0.666667 0 0.641666 0.708333 0 0.641666 0.750000 0 0.641666 0.791667 0 0.641666 0.833333 0 0.641666 0.875000 0 0.641666 0.916667 0 0.641666 0.958333 0 0.641666 1.000000 0 0.649999 0 0 0.649999 0.041667 0 0.649999 0.083333 0 0.649999 0.125000 0 0.649999 0.166667 0 0.649999 0.208333 0 0.649999 0.250000 0 0.649999 0.291667 0 0.649999 0.333333 0 0.649999 0.375000 0 0.649999 0.416667 0 0.649999 0.458333 0 0.649999 0.500000 0 0.649999 0.541667 0 0.649999 0.583333 0 0.649999 0.625000 0 0.649999 0.666667 0 0.649999 0.708333 0 0.649999 0.750000 0 0.649999 0.791667 0 0.649999 0.833333 0 0.649999 0.875000 0 0.649999 0.916667 0 0.649999 0.958333 0 0.649999 1.000000 0 0.658333 0 0 0.658333 0.041667 0 0.658333 0.083333 0 0.658333 0.125000 0 0.658333 0.166667 0 0.658333 0.208333 0 0.658333 0.250000 0 0.658333 0.291667 0 0.658333 0.333333 0 0.658333 0.375000 0 0.658333 0.416667 0 0.658333 0.458333 0 0.658333 0.500000 0 0.658333 0.541667 0 0.658333 0.583333 0 0.658333 0.625000 0 0.658333 0.666667 0 0.658333 0.708333 0 0.658333 0.750000 0 0.658333 0.791667 0 0.658333 0.833333 0 0.658333 0.875000 0 0.658333 0.916667 0 0.658333 0.958333 0 0.658333 1.000000 0 0.666666 0 0 0.666666 0.041667 0 0.666666 0.083333 0 0.666666 0.125000 0 0.666666 0.166667 0 0.666666 0.208333 0 0.666666 0.250000 0 0.666666 0.291667 0 0.666666 0.333333 0 0.666666 0.375000 0 0.666666 0.416667 0 0.666666 0.458333 0 0.666666 0.500000 0 0.666666 0.541667 0 0.666666 0.583333 0 0.666666 0.625000 0 0.666666 0.666667 0 0.666666 0.708333 0 0.666666 0.750000 0 0.666666 0.791667 0 0.666666 0.833333 0 0.666666 0.875000 0 0.666666 0.916667 0 0.666666 0.958333 0 0.666666 1.000000 0 0.675000 0 0 0.675000 0.041667 0 0.675000 0.083333 0 0.675000 0.125000 0 0.675000 0.166667 0 0.675000 0.208333 0 0.675000 0.250000 0 0.675000 0.291667 0 0.675000 0.333333 0 0.675000 0.375000 0 0.675000 0.416667 0 0.675000 0.458333 0 0.675000 0.500000 0 0.675000 0.541667 0 0.675000 0.583333 0 0.675000 0.625000 0 0.675000 0.666667 0 0.675000 0.708333 0 0.675000 0.750000 0 0.675000 0.791667 0 0.675000 0.833333 0 0.675000 0.875000 0 0.675000 0.916667 0 0.675000 0.958333 0 0.675000 1.000000 0 0.683333 0 0 0.683333 0.041667 0 0.683333 0.083333 0 0.683333 0.125000 0 0.683333 0.166667 0 0.683333 0.208333 0 0.683333 0.250000 0 0.683333 0.291667 0 0.683333 0.333333 0 0.683333 0.375000 0 0.683333 0.416667 0 0.683333 0.458333 0 0.683333 0.500000 0 0.683333 0.541667 0 0.683333 0.583333 0 0.683333 0.625000 0 0.683333 0.666667 0 0.683333 0.708333 0 0.683333 0.750000 0 0.683333 0.791667 0 0.683333 0.833333 0 0.683333 0.875000 0 0.683333 0.916667 0 0.683333 0.958333 0 0.683333 1.000000 0 0.691666 0 0 0.691666 0.041667 0 0.691666 0.083333 0 0.691666 0.125000 0 0.691666 0.166667 0 0.691666 0.208333 0 0.691666 0.250000 0 0.691666 0.291667 0 0.691666 0.333333 0 0.691666 0.375000 0 0.691666 0.416667 0 0.691666 0.458333 0 0.691666 0.500000 0 0.691666 0.541667 0 0.691666 0.583333 0 0.691666 0.625000 0 0.691666 0.666667 0 0.691666 0.708333 0 0.691666 0.750000 0 0.691666 0.791667 0 0.691666 0.833333 0 0.691666 0.875000 0 0.691666 0.916667 0 0.691666 0.958333 0 0.691666 1.000000 0 0.700000 0 0 0.700000 0.041667 0 0.700000 0.083333 0 0.700000 0.125000 0 0.700000 0.166667 0 0.700000 0.208333 0 0.700000 0.250000 0 0.700000 0.291667 0 0.700000 0.333333 0 0.700000 0.375000 0 0.700000 0.416667 0 0.700000 0.458333 0 0.700000 0.500000 0 0.700000 0.541667 0 0.700000 0.583333 0 0.700000 0.625000 0 0.700000 0.666667 0 0.700000 0.708333 0 0.700000 0.750000 0 0.700000 0.791667 0 0.700000 0.833333 0 0.700000 0.875000 0 0.700000 0.916667 0 0.700000 0.958333 0 0.700000 1.000000 0 0.708333 0 0 0.708333 0.041667 0 0.708333 0.083333 0 0.708333 0.125000 0 0.708333 0.166667 0 0.708333 0.208333 0 0.708333 0.250000 0 0.708333 0.291667 0 0.708333 0.333333 0 0.708333 0.375000 0 0.708333 0.416667 0 0.708333 0.458333 0 0.708333 0.500000 0 0.708333 0.541667 0 0.708333 0.583333 0 0.708333 0.625000 0 0.708333 0.666667 0 0.708333 0.708333 0 0.708333 0.750000 0 0.708333 0.791667 0 0.708333 0.833333 0 0.708333 0.875000 0 0.708333 0.916667 0 0.708333 0.958333 0 0.708333 1.000000 0 0.716666 0 0 0.716666 0.041667 0 0.716666 0.083333 0 0.716666 0.125000 0 0.716666 0.166667 0 0.716666 0.208333 0 0.716666 0.250000 0 0.716666 0.291667 0 0.716666 0.333333 0 0.716666 0.375000 0 0.716666 0.416667 0 0.716666 0.458333 0 0.716666 0.500000 0 0.716666 0.541667 0 0.716666 0.583333 0 0.716666 0.625000 0 0.716666 0.666667 0 0.716666 0.708333 0 0.716666 0.750000 0 0.716666 0.791667 0 0.716666 0.833333 0 0.716666 0.875000 0 0.716666 0.916667 0 0.716666 0.958333 0 0.716666 1.000000 0 0.725000 0 0 0.725000 0.041667 0 0.725000 0.083333 0 0.725000 0.125000 0 0.725000 0.166667 0 0.725000 0.208333 0 0.725000 0.250000 0 0.725000 0.291667 0 0.725000 0.333333 0 0.725000 0.375000 0 0.725000 0.416667 0 0.725000 0.458333 0 0.725000 0.500000 0 0.725000 0.541667 0 0.725000 0.583333 0 0.725000 0.625000 0 0.725000 0.666667 0 0.725000 0.708333 0 0.725000 0.750000 0 0.725000 0.791667 0 0.725000 0.833333 0 0.725000 0.875000 0 0.725000 0.916667 0 0.725000 0.958333 0 0.725000 1.000000 0 0.733333 0 0 0.733333 0.041667 0 0.733333 0.083333 0 0.733333 0.125000 0 0.733333 0.166667 0 0.733333 0.208333 0 0.733333 0.250000 0 0.733333 0.291667 0 0.733333 0.333333 0 0.733333 0.375000 0 0.733333 0.416667 0 0.733333 0.458333 0 0.733333 0.500000 0 0.733333 0.541667 0 0.733333 0.583333 0 0.733333 0.625000 0 0.733333 0.666667 0 0.733333 0.708333 0 0.733333 0.750000 0 0.733333 0.791667 0 0.733333 0.833333 0 0.733333 0.875000 0 0.733333 0.916667 0 0.733333 0.958333 0 0.733333 1.000000 0 0.741666 0 0 0.741666 0.041667 0 0.741666 0.083333 0 0.741666 0.125000 0 0.741666 0.166667 0 0.741666 0.208333 0 0.741666 0.250000 0 0.741666 0.291667 0 0.741666 0.333333 0 0.741666 0.375000 0 0.741666 0.416667 0 0.741666 0.458333 0 0.741666 0.500000 0 0.741666 0.541667 0 0.741666 0.583333 0 0.741666 0.625000 0 0.741666 0.666667 0 0.741666 0.708333 0 0.741666 0.750000 0 0.741666 0.791667 0 0.741666 0.833333 0 0.741666 0.875000 0 0.741666 0.916667 0 0.741666 0.958333 0 0.741666 1.000000 0 0.750000 0 0 0.750000 0.041667 0 0.750000 0.083333 0 0.750000 0.125000 0 0.750000 0.166667 0 0.750000 0.208333 0 0.750000 0.250000 0 0.750000 0.291667 0 0.750000 0.333333 0 0.750000 0.375000 0 0.750000 0.416667 0 0.750000 0.458333 0 0.750000 0.500000 0 0.750000 0.541667 0 0.750000 0.583333 0 0.750000 0.625000 0 0.750000 0.666667 0 0.750000 0.708333 0 0.750000 0.750000 0 0.750000 0.791667 0 0.750000 0.833333 0 0.750000 0.875000 0 0.750000 0.916667 0 0.750000 0.958333 0 0.750000 1.000000 0 0.758333 0 0 0.758333 0.041667 0 0.758333 0.083333 0 0.758333 0.125000 0 0.758333 0.166667 0 0.758333 0.208333 0 0.758333 0.250000 0 0.758333 0.291667 0 0.758333 0.333333 0 0.758333 0.375000 0 0.758333 0.416667 0 0.758333 0.458333 0 0.758333 0.500000 0 0.758333 0.541667 0 0.758333 0.583333 0 0.758333 0.625000 0 0.758333 0.666667 0 0.758333 0.708333 0 0.758333 0.750000 0 0.758333 0.791667 0 0.758333 0.833333 0 0.758333 0.875000 0 0.758333 0.916667 0 0.758333 0.958333 0 0.758333 1.000000 0 0.766667 0 0 0.766667 0.041667 0 0.766667 0.083333 0 0.766667 0.125000 0 0.766667 0.166667 0 0.766667 0.208333 0 0.766667 0.250000 0 0.766667 0.291667 0 0.766667 0.333333 0 0.766667 0.375000 0 0.766667 0.416667 0 0.766667 0.458333 0 0.766667 0.500000 0 0.766667 0.541667 0 0.766667 0.583333 0 0.766667 0.625000 0 0.766667 0.666667 0 0.766667 0.708333 0 0.766667 0.750000 0 0.766667 0.791667 0 0.766667 0.833333 0 0.766667 0.875000 0 0.766667 0.916667 0 0.766667 0.958333 0 0.766667 1.000000 0 0.775000 0 0 0.775000 0.041667 0 0.775000 0.083333 0 0.775000 0.125000 0 0.775000 0.166667 0 0.775000 0.208333 0 0.775000 0.250000 0 0.775000 0.291667 0 0.775000 0.333333 0 0.775000 0.375000 0 0.775000 0.416667 0 0.775000 0.458333 0 0.775000 0.500000 0 0.775000 0.541667 0 0.775000 0.583333 0 0.775000 0.625000 0 0.775000 0.666667 0 0.775000 0.708333 0 0.775000 0.750000 0 0.775000 0.791667 0 0.775000 0.833333 0 0.775000 0.875000 0 0.775000 0.916667 0 0.775000 0.958333 0 0.775000 1.000000 0 0.783333 0 0 0.783333 0.041667 0 0.783333 0.083333 0 0.783333 0.125000 0 0.783333 0.166667 0 0.783333 0.208333 0 0.783333 0.250000 0 0.783333 0.291667 0 0.783333 0.333333 0 0.783333 0.375000 0 0.783333 0.416667 0 0.783333 0.458333 0 0.783333 0.500000 0 0.783333 0.541667 0 0.783333 0.583333 0 0.783333 0.625000 0 0.783333 0.666667 0 0.783333 0.708333 0 0.783333 0.750000 0 0.783333 0.791667 0 0.783333 0.833333 0 0.783333 0.875000 0 0.783333 0.916667 0 0.783333 0.958333 0 0.783333 1.000000 0 0.791667 0 0 0.791667 0.041667 0 0.791667 0.083333 0 0.791667 0.125000 0 0.791667 0.166667 0 0.791667 0.208333 0 0.791667 0.250000 0 0.791667 0.291667 0 0.791667 0.333333 0 0.791667 0.375000 0 0.791667 0.416667 0 0.791667 0.458333 0 0.791667 0.500000 0 0.791667 0.541667 0 0.791667 0.583333 0 0.791667 0.625000 0 0.791667 0.666667 0 0.791667 0.708333 0 0.791667 0.750000 0 0.791667 0.791667 0 0.791667 0.833333 0 0.791667 0.875000 0 0.791667 0.916667 0 0.791667 0.958333 0 0.791667 1.000000 0 0.800000 0 0 0.800000 0.041667 0 0.800000 0.083333 0 0.800000 0.125000 0 0.800000 0.166667 0 0.800000 0.208333 0 0.800000 0.250000 0 0.800000 0.291667 0 0.800000 0.333333 0 0.800000 0.375000 0 0.800000 0.416667 0 0.800000 0.458333 0 0.800000 0.500000 0 0.800000 0.541667 0 0.800000 0.583333 0 0.800000 0.625000 0 0.800000 0.666667 0 0.800000 0.708333 0 0.800000 0.750000 0 0.800000 0.791667 0 0.800000 0.833333 0 0.800000 0.875000 0 0.800000 0.916667 0 0.800000 0.958333 0 0.800000 1.000000 0 0.808333 0 0 0.808333 0.041667 0 0.808333 0.083333 0 0.808333 0.125000 0 0.808333 0.166667 0 0.808333 0.208333 0 0.808333 0.250000 0 0.808333 0.291667 0 0.808333 0.333333 0 0.808333 0.375000 0 0.808333 0.416667 0 0.808333 0.458333 0 0.808333 0.500000 0 0.808333 0.541667 0 0.808333 0.583333 0 0.808333 0.625000 0 0.808333 0.666667 0 0.808333 0.708333 0 0.808333 0.750000 0 0.808333 0.791667 0 0.808333 0.833333 0 0.808333 0.875000 0 0.808333 0.916667 0 0.808333 0.958333 0 0.808333 1.000000 0 0.816667 0 0 0.816667 0.041667 0 0.816667 0.083333 0 0.816667 0.125000 0 0.816667 0.166667 0 0.816667 0.208333 0 0.816667 0.250000 0 0.816667 0.291667 0 0.816667 0.333333 0 0.816667 0.375000 0 0.816667 0.416667 0 0.816667 0.458333 0 0.816667 0.500000 0 0.816667 0.541667 0 0.816667 0.583333 0 0.816667 0.625000 0 0.816667 0.666667 0 0.816667 0.708333 0 0.816667 0.750000 0 0.816667 0.791667 0 0.816667 0.833333 0 0.816667 0.875000 0 0.816667 0.916667 0 0.816667 0.958333 0 0.816667 1.000000 0 0.825000 0 0 0.825000 0.041667 0 0.825000 0.083333 0 0.825000 0.125000 0 0.825000 0.166667 0 0.825000 0.208333 0 0.825000 0.250000 0 0.825000 0.291667 0 0.825000 0.333333 0 0.825000 0.375000 0 0.825000 0.416667 0 0.825000 0.458333 0 0.825000 0.500000 0 0.825000 0.541667 0 0.825000 0.583333 0 0.825000 0.625000 0 0.825000 0.666667 0 0.825000 0.708333 0 0.825000 0.750000 0 0.825000 0.791667 0 0.825000 0.833333 0 0.825000 0.875000 0 0.825000 0.916667 0 0.825000 0.958333 0 0.825000 1.000000 0 0.833333 0 0 0.833333 0.041667 0 0.833333 0.083333 0 0.833333 0.125000 0 0.833333 0.166667 0 0.833333 0.208333 0 0.833333 0.250000 0 0.833333 0.291667 0 0.833333 0.333333 0 0.833333 0.375000 0 0.833333 0.416667 0 0.833333 0.458333 0 0.833333 0.500000 0 0.833333 0.541667 0 0.833333 0.583333 0 0.833333 0.625000 0 0.833333 0.666667 0 0.833333 0.708333 0 0.833333 0.750000 0 0.833333 0.791667 0 0.833333 0.833333 0 0.833333 0.875000 0 0.833333 0.916667 0 0.833333 0.958333 0 0.833333 1.000000 0 0.841667 0 0 0.841667 0.041667 0 0.841667 0.083333 0 0.841667 0.125000 0 0.841667 0.166667 0 0.841667 0.208333 0 0.841667 0.250000 0 0.841667 0.291667 0 0.841667 0.333333 0 0.841667 0.375000 0 0.841667 0.416667 0 0.841667 0.458333 0 0.841667 0.500000 0 0.841667 0.541667 0 0.841667 0.583333 0 0.841667 0.625000 0 0.841667 0.666667 0 0.841667 0.708333 0 0.841667 0.750000 0 0.841667 0.791667 0 0.841667 0.833333 0 0.841667 0.875000 0 0.841667 0.916667 0 0.841667 0.958333 0 0.841667 1.000000 0 0.850000 0 0 0.850000 0.041667 0 0.850000 0.083333 0 0.850000 0.125000 0 0.850000 0.166667 0 0.850000 0.208333 0 0.850000 0.250000 0 0.850000 0.291667 0 0.850000 0.333333 0 0.850000 0.375000 0 0.850000 0.416667 0 0.850000 0.458333 0 0.850000 0.500000 0 0.850000 0.541667 0 0.850000 0.583333 0 0.850000 0.625000 0 0.850000 0.666667 0 0.850000 0.708333 0 0.850000 0.750000 0 0.850000 0.791667 0 0.850000 0.833333 0 0.850000 0.875000 0 0.850000 0.916667 0 0.850000 0.958333 0 0.850000 1.000000 0 0.858334 0 0 0.858334 0.041667 0 0.858334 0.083333 0 0.858334 0.125000 0 0.858334 0.166667 0 0.858334 0.208333 0 0.858334 0.250000 0 0.858334 0.291667 0 0.858334 0.333333 0 0.858334 0.375000 0 0.858334 0.416667 0 0.858334 0.458333 0 0.858334 0.500000 0 0.858334 0.541667 0 0.858334 0.583333 0 0.858334 0.625000 0 0.858334 0.666667 0 0.858334 0.708333 0 0.858334 0.750000 0 0.858334 0.791667 0 0.858334 0.833333 0 0.858334 0.875000 0 0.858334 0.916667 0 0.858334 0.958333 0 0.858334 1.000000 0 0.866667 0 0 0.866667 0.041667 0 0.866667 0.083333 0 0.866667 0.125000 0 0.866667 0.166667 0 0.866667 0.208333 0 0.866667 0.250000 0 0.866667 0.291667 0 0.866667 0.333333 0 0.866667 0.375000 0 0.866667 0.416667 0 0.866667 0.458333 0 0.866667 0.500000 0 0.866667 0.541667 0 0.866667 0.583333 0 0.866667 0.625000 0 0.866667 0.666667 0 0.866667 0.708333 0 0.866667 0.750000 0 0.866667 0.791667 0 0.866667 0.833333 0 0.866667 0.875000 0 0.866667 0.916667 0 0.866667 0.958333 0 0.866667 1.000000 0 0.875000 0 0 0.875000 0.041667 0 0.875000 0.083333 0 0.875000 0.125000 0 0.875000 0.166667 0 0.875000 0.208333 0 0.875000 0.250000 0 0.875000 0.291667 0 0.875000 0.333333 0 0.875000 0.375000 0 0.875000 0.416667 0 0.875000 0.458333 0 0.875000 0.500000 0 0.875000 0.541667 0 0.875000 0.583333 0 0.875000 0.625000 0 0.875000 0.666667 0 0.875000 0.708333 0 0.875000 0.750000 0 0.875000 0.791667 0 0.875000 0.833333 0 0.875000 0.875000 0 0.875000 0.916667 0 0.875000 0.958333 0 0.875000 1.000000 0 0.883334 0 0 0.883334 0.041667 0 0.883334 0.083333 0 0.883334 0.125000 0 0.883334 0.166667 0 0.883334 0.208333 0 0.883334 0.250000 0 0.883334 0.291667 0 0.883334 0.333333 0 0.883334 0.375000 0 0.883334 0.416667 0 0.883334 0.458333 0 0.883334 0.500000 0 0.883334 0.541667 0 0.883334 0.583333 0 0.883334 0.625000 0 0.883334 0.666667 0 0.883334 0.708333 0 0.883334 0.750000 0 0.883334 0.791667 0 0.883334 0.833333 0 0.883334 0.875000 0 0.883334 0.916667 0 0.883334 0.958333 0 0.883334 1.000000 0 0.891667 0 0 0.891667 0.041667 0 0.891667 0.083333 0 0.891667 0.125000 0 0.891667 0.166667 0 0.891667 0.208333 0 0.891667 0.250000 0 0.891667 0.291667 0 0.891667 0.333333 0 0.891667 0.375000 0 0.891667 0.416667 0 0.891667 0.458333 0 0.891667 0.500000 0 0.891667 0.541667 0 0.891667 0.583333 0 0.891667 0.625000 0 0.891667 0.666667 0 0.891667 0.708333 0 0.891667 0.750000 0 0.891667 0.791667 0 0.891667 0.833333 0 0.891667 0.875000 0 0.891667 0.916667 0 0.891667 0.958333 0 0.891667 1.000000 0 0.900000 0 0 0.900000 0.041667 0 0.900000 0.083333 0 0.900000 0.125000 0 0.900000 0.166667 0 0.900000 0.208333 0 0.900000 0.250000 0 0.900000 0.291667 0 0.900000 0.333333 0 0.900000 0.375000 0 0.900000 0.416667 0 0.900000 0.458333 0 0.900000 0.500000 0 0.900000 0.541667 0 0.900000 0.583333 0 0.900000 0.625000 0 0.900000 0.666667 0 0.900000 0.708333 0 0.900000 0.750000 0 0.900000 0.791667 0 0.900000 0.833333 0 0.900000 0.875000 0 0.900000 0.916667 0 0.900000 0.958333 0 0.900000 1.000000 0 0.908334 0 0 0.908334 0.041667 0 0.908334 0.083333 0 0.908334 0.125000 0 0.908334 0.166667 0 0.908334 0.208333 0 0.908334 0.250000 0 0.908334 0.291667 0 0.908334 0.333333 0 0.908334 0.375000 0 0.908334 0.416667 0 0.908334 0.458333 0 0.908334 0.500000 0 0.908334 0.541667 0 0.908334 0.583333 0 0.908334 0.625000 0 0.908334 0.666667 0 0.908334 0.708333 0 0.908334 0.750000 0 0.908334 0.791667 0 0.908334 0.833333 0 0.908334 0.875000 0 0.908334 0.916667 0 0.908334 0.958333 0 0.908334 1.000000 0 0.916667 0 0 0.916667 0.041667 0 0.916667 0.083333 0 0.916667 0.125000 0 0.916667 0.166667 0 0.916667 0.208333 0 0.916667 0.250000 0 0.916667 0.291667 0 0.916667 0.333333 0 0.916667 0.375000 0 0.916667 0.416667 0 0.916667 0.458333 0 0.916667 0.500000 0 0.916667 0.541667 0 0.916667 0.583333 0 0.916667 0.625000 0 0.916667 0.666667 0 0.916667 0.708333 0 0.916667 0.750000 0 0.916667 0.791667 0 0.916667 0.833333 0 0.916667 0.875000 0 0.916667 0.916667 0 0.916667 0.958333 0 0.916667 1.000000 0 0.925000 0 0 0.925000 0.041667 0 0.925000 0.083333 0 0.925000 0.125000 0 0.925000 0.166667 0 0.925000 0.208333 0 0.925000 0.250000 0 0.925000 0.291667 0 0.925000 0.333333 0 0.925000 0.375000 0 0.925000 0.416667 0 0.925000 0.458333 0 0.925000 0.500000 0 0.925000 0.541667 0 0.925000 0.583333 0 0.925000 0.625000 0 0.925000 0.666667 0 0.925000 0.708333 0 0.925000 0.750000 0 0.925000 0.791667 0 0.925000 0.833333 0 0.925000 0.875000 0 0.925000 0.916667 0 0.925000 0.958333 0 0.925000 1.000000 0 0.933334 0 0 0.933334 0.041667 0 0.933334 0.083333 0 0.933334 0.125000 0 0.933334 0.166667 0 0.933334 0.208333 0 0.933334 0.250000 0 0.933334 0.291667 0 0.933334 0.333333 0 0.933334 0.375000 0 0.933334 0.416667 0 0.933334 0.458333 0 0.933334 0.500000 0 0.933334 0.541667 0 0.933334 0.583333 0 0.933334 0.625000 0 0.933334 0.666667 0 0.933334 0.708333 0 0.933334 0.750000 0 0.933334 0.791667 0 0.933334 0.833333 0 0.933334 0.875000 0 0.933334 0.916667 0 0.933334 0.958333 0 0.933334 1.000000 0 0.941667 0 0 0.941667 0.041667 0 0.941667 0.083333 0 0.941667 0.125000 0 0.941667 0.166667 0 0.941667 0.208333 0 0.941667 0.250000 0 0.941667 0.291667 0 0.941667 0.333333 0 0.941667 0.375000 0 0.941667 0.416667 0 0.941667 0.458333 0 0.941667 0.500000 0 0.941667 0.541667 0 0.941667 0.583333 0 0.941667 0.625000 0 0.941667 0.666667 0 0.941667 0.708333 0 0.941667 0.750000 0 0.941667 0.791667 0 0.941667 0.833333 0 0.941667 0.875000 0 0.941667 0.916667 0 0.941667 0.958333 0 0.941667 1.000000 0 0.950001 0 0 0.950001 0.041667 0 0.950001 0.083333 0 0.950001 0.125000 0 0.950001 0.166667 0 0.950001 0.208333 0 0.950001 0.250000 0 0.950001 0.291667 0 0.950001 0.333333 0 0.950001 0.375000 0 0.950001 0.416667 0 0.950001 0.458333 0 0.950001 0.500000 0 0.950001 0.541667 0 0.950001 0.583333 0 0.950001 0.625000 0 0.950001 0.666667 0 0.950001 0.708333 0 0.950001 0.750000 0 0.950001 0.791667 0 0.950001 0.833333 0 0.950001 0.875000 0 0.950001 0.916667 0 0.950001 0.958333 0 0.950001 1.000000 0 0.958334 0 0 0.958334 0.041667 0 0.958334 0.083333 0 0.958334 0.125000 0 0.958334 0.166667 0 0.958334 0.208333 0 0.958334 0.250000 0 0.958334 0.291667 0 0.958334 0.333333 0 0.958334 0.375000 0 0.958334 0.416667 0 0.958334 0.458333 0 0.958334 0.500000 0 0.958334 0.541667 0 0.958334 0.583333 0 0.958334 0.625000 0 0.958334 0.666667 0 0.958334 0.708333 0 0.958334 0.750000 0 0.958334 0.791667 0 0.958334 0.833333 0 0.958334 0.875000 0 0.958334 0.916667 0 0.958334 0.958333 0 0.958334 1.000000 0 0.966667 0 0 0.966667 0.041667 0 0.966667 0.083333 0 0.966667 0.125000 0 0.966667 0.166667 0 0.966667 0.208333 0 0.966667 0.250000 0 0.966667 0.291667 0 0.966667 0.333333 0 0.966667 0.375000 0 0.966667 0.416667 0 0.966667 0.458333 0 0.966667 0.500000 0 0.966667 0.541667 0 0.966667 0.583333 0 0.966667 0.625000 0 0.966667 0.666667 0 0.966667 0.708333 0 0.966667 0.750000 0 0.966667 0.791667 0 0.966667 0.833333 0 0.966667 0.875000 0 0.966667 0.916667 0 0.966667 0.958333 0 0.966667 1.000000 0 0.975001 0 0 0.975001 0.041667 0 0.975001 0.083333 0 0.975001 0.125000 0 0.975001 0.166667 0 0.975001 0.208333 0 0.975001 0.250000 0 0.975001 0.291667 0 0.975001 0.333333 0 0.975001 0.375000 0 0.975001 0.416667 0 0.975001 0.458333 0 0.975001 0.500000 0 0.975001 0.541667 0 0.975001 0.583333 0 0.975001 0.625000 0 0.975001 0.666667 0 0.975001 0.708333 0 0.975001 0.750000 0 0.975001 0.791667 0 0.975001 0.833333 0 0.975001 0.875000 0 0.975001 0.916667 0 0.975001 0.958333 0 0.975001 1.000000 0 0.983334 0 0 0.983334 0.041667 0 0.983334 0.083333 0 0.983334 0.125000 0 0.983334 0.166667 0 0.983334 0.208333 0 0.983334 0.250000 0 0.983334 0.291667 0 0.983334 0.333333 0 0.983334 0.375000 0 0.983334 0.416667 0 0.983334 0.458333 0 0.983334 0.500000 0 0.983334 0.541667 0 0.983334 0.583333 0 0.983334 0.625000 0 0.983334 0.666667 0 0.983334 0.708333 0 0.983334 0.750000 0 0.983334 0.791667 0 0.983334 0.833333 0 0.983334 0.875000 0 0.983334 0.916667 0 0.983334 0.958333 0 0.983334 1.000000 0 0.991667 0 0 0.991667 0.041667 0 0.991667 0.083333 0 0.991667 0.125000 0 0.991667 0.166667 0 0.991667 0.208333 0 0.991667 0.250000 0 0.991667 0.291667 0 0.991667 0.333333 0 0.991667 0.375000 0 0.991667 0.416667 0 0.991667 0.458333 0 0.991667 0.500000 0 0.991667 0.541667 0 0.991667 0.583333 0 0.991667 0.625000 0 0.991667 0.666667 0 0.991667 0.708333 0 0.991667 0.750000 0 0.991667 0.791667 0 0.991667 0.833333 0 0.991667 0.875000 0 0.991667 0.916667 0 0.991667 0.958333 0 0.991667 1.000000 0 1.000001 0 0 1.000001 0.041667 0 1.000001 0.083333 0 1.000001 0.125000 0 1.000001 0.166667 0 1.000001 0.208333 0 1.000001 0.250000 0 1.000001 0.291667 0 1.000001 0.333333 0 1.000001 0.375000 0 1.000001 0.416667 0 1.000001 0.458333 0 1.000001 0.500000 0 1.000001 0.541667 0 1.000001 0.583333 0 1.000001 0.625000 0 1.000001 0.666667 0 1.000001 0.708333 0 1.000001 0.750000 0 1.000001 0.791667 0 1.000001 0.833333 0 1.000001 0.875000 0 1.000001 0.916667 0 1.000001 0.958333 0 1.000001 1.000000 0</float_array>
+ <technique_common>
+ <accessor source="#Torus_Knot01-mesh-map-channel1-array" count="3025" stride="3">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ <param name="P" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus_Knot01-mesh-vertices">
+ <input semantic="POSITION" source="#Torus_Knot01-mesh-positions"/>
+ </vertices>
+ <triangles material="Torus-Knot" count="5760">
+ <input semantic="VERTEX" source="#Torus_Knot01-mesh-vertices" offset="0"/>
+ <input semantic="NORMAL" source="#Torus_Knot01-mesh-normals" offset="1"/>
+ <input semantic="TEXCOORD" source="#Torus_Knot01-mesh-map-channel1" offset="2" set="1"/>
+ <p>0 0 0 24 1 25 25 2 26 0 0 0 25 2 26 1 3 1 1 3 1 25 2 26 26 4 27 1 3 1 26 4 27 2 5 2 2 5 2 26 4 27 27 6 28 2 5 2 27 6 28 3 7 3 3 7 3 27 6 28 28 8 29 3 7 3 28 8 29 4 9 4 4 9 4 28 8 29 29 10 30 4 9 4 29 10 30 5 11 5 5 11 5 29 10 30 30 12 31 5 11 5 30 12 31 6 13 6 6 13 6 30 12 31 31 14 32 6 13 6 31 14 32 7 15 7 7 15 7 31 14 32 32 16 33 7 15 7 32 16 33 8 17 8 8 17 8 32 16 33 33 18 34 8 17 8 33 18 34 9 19 9 9 19 9 33 18 34 34 20 35 9 19 9 34 20 35 10 21 10 10 21 10 34 20 35 35 22 36 10 21 10 35 22 36 11 23 11 11 23 11 35 22 36 36 24 37 11 23 11 36 24 37 12 25 12 12 25 12 36 24 37 37 26 38 12 25 12 37 26 38 13 27 13 13 27 13 37 26 38 38 28 39 13 27 13 38 28 39 14 29 14 14 29 14 38 28 39 39 30 40 14 29 14 39 30 40 15 31 15 15 31 15 39 30 40 40 32 41 15 31 15 40 32 41 16 33 16 16 33 16 40 32 41 41 34 42 16 33 16 41 34 42 17 35 17 17 35 17 41 34 42 42 36 43 17 35 17 42 36 43 18 37 18 18 37 18 42 36 43 43 38 44 18 37 18 43 38 44 19 39 19 19 39 19 43 38 44 44 40 45 19 39 19 44 40 45 20 41 20 20 41 20 44 40 45 45 42 46 20 41 20 45 42 46 21 43 21 21 43 21 45 42 46 46 44 47 21 43 21 46 44 47 22 45 22 22 45 22 46 44 47 47 46 48 22 45 22 47 46 48 23 47 23 23 47 23 47 46 48 24 1 49 23 47 23 24 1 49 0 0 24 24 1 25 48 48 50 49 49 51 24 1 25 49 49 51 25 2 26 25 2 26 49 49 51 50 50 52 25 2 26 50 50 52 26 4 27 26 4 27 50 50 52 51 51 53 26 4 27 51 51 53 27 6 28 27 6 28 51 51 53 52 52 54 27 6 28 52 52 54 28 8 29 28 8 29 52 52 54 53 53 55 28 8 29 53 53 55 29 10 30 29 10 30 53 53 55 54 54 56 29 10 30 54 54 56 30 12 31 30 12 31 54 54 56 55 55 57 30 12 31 55 55 57 31 14 32 31 14 32 55 55 57 56 56 58 31 14 32 56 56 58 32 16 33 32 16 33 56 56 58 57 57 59 32 16 33 57 57 59 33 18 34 33 18 34 57 57 59 58 58 60 33 18 34 58 58 60 34 20 35 34 20 35 58 58 60 59 59 61 34 20 35 59 59 61 35 22 36 35 22 36 59 59 61 60 60 62 35 22 36 60 60 62 36 24 37 36 24 37 60 60 62 61 61 63 36 24 37 61 61 63 37 26 38 37 26 38 61 61 63 62 62 64 37 26 38 62 62 64 38 28 39 38 28 39 62 62 64 63 63 65 38 28 39 63 63 65 39 30 40 39 30 40 63 63 65 64 64 66 39 30 40 64 64 66 40 32 41 40 32 41 64 64 66 65 65 67 40 32 41 65 65 67 41 34 42 41 34 42 65 65 67 66 66 68 41 34 42 66 66 68 42 36 43 42 36 43 66 66 68 67 67 69 42 36 43 67 67 69 43 38 44 43 38 44 67 67 69 68 68 70 43 38 44 68 68 70 44 40 45 44 40 45 68 68 70 69 69 71 44 40 45 69 69 71 45 42 46 45 42 46 69 69 71 70 70 72 45 42 46 70 70 72 46 44 47 46 44 47 70 70 72 71 71 73 46 44 47 71 71 73 47 46 48 47 46 48 71 71 73 48 48 74 47 46 48 48 48 74 24 1 49 48 48 50 72 72 75 73 73 76 48 48 50 73 73 76 49 49 51 49 49 51 73 73 76 74 74 77 49 49 51 74 74 77 50 50 52 50 50 52 74 74 77 75 75 78 50 50 52 75 75 78 51 51 53 51 51 53 75 75 78 76 76 79 51 51 53 76 76 79 52 52 54 52 52 54 76 76 79 77 77 80 52 52 54 77 77 80 53 53 55 53 53 55 77 77 80 78 78 81 53 53 55 78 78 81 54 54 56 54 54 56 78 78 81 79 79 82 54 54 56 79 79 82 55 55 57 55 55 57 79 79 82 80 80 83 55 55 57 80 80 83 56 56 58 56 56 58 80 80 83 81 81 84 56 56 58 81 81 84 57 57 59 57 57 59 81 81 84 82 82 85 57 57 59 82 82 85 58 58 60 58 58 60 82 82 85 83 83 86 58 58 60 83 83 86 59 59 61 59 59 61 83 83 86 84 84 87 59 59 61 84 84 87 60 60 62 60 60 62 84 84 87 85 85 88 60 60 62 85 85 88 61 61 63 61 61 63 85 85 88 86 86 89 61 61 63 86 86 89 62 62 64 62 62 64 86 86 89 87 87 90 62 62 64 87 87 90 63 63 65 63 63 65 87 87 90 88 88 91 63 63 65 88 88 91 64 64 66 64 64 66 88 88 91 89 89 92 64 64 66 89 89 92 65 65 67 65 65 67 89 89 92 90 90 93 65 65 67 90 90 93 66 66 68 66 66 68 90 90 93 91 91 94 66 66 68 91 91 94 67 67 69 67 67 69 91 91 94 92 92 95 67 67 69 92 92 95 68 68 70 68 68 70 92 92 95 93 93 96 68 68 70 93 93 96 69 69 71 69 69 71 93 93 96 94 94 97 69 69 71 94 94 97 70 70 72 70 70 72 94 94 97 95 95 98 70 70 72 95 95 98 71 71 73 71 71 73 95 95 98 72 72 99 71 71 73 72 72 99 48 48 74 72 72 75 96 96 100 97 97 101 72 72 75 97 97 101 73 73 76 73 73 76 97 97 101 98 98 102 73 73 76 98 98 102 74 74 77 74 74 77 98 98 102 99 99 103 74 74 77 99 99 103 75 75 78 75 75 78 99 99 103 100 100 104 75 75 78 100 100 104 76 76 79 76 76 79 100 100 104 101 101 105 76 76 79 101 101 105 77 77 80 77 77 80 101 101 105 102 102 106 77 77 80 102 102 106 78 78 81 78 78 81 102 102 106 103 103 107 78 78 81 103 103 107 79 79 82 79 79 82 103 103 107 104 104 108 79 79 82 104 104 108 80 80 83 80 80 83 104 104 108 105 105 109 80 80 83 105 105 109 81 81 84 81 81 84 105 105 109 106 106 110 81 81 84 106 106 110 82 82 85 82 82 85 106 106 110 107 107 111 82 82 85 107 107 111 83 83 86 83 83 86 107 107 111 108 108 112 83 83 86 108 108 112 84 84 87 84 84 87 108 108 112 109 109 113 84 84 87 109 109 113 85 85 88 85 85 88 109 109 113 110 110 114 85 85 88 110 110 114 86 86 89 86 86 89 110 110 114 111 111 115 86 86 89 111 111 115 87 87 90 87 87 90 111 111 115 112 112 116 87 87 90 112 112 116 88 88 91 88 88 91 112 112 116 113 113 117 88 88 91 113 113 117 89 89 92 89 89 92 113 113 117 114 114 118 89 89 92 114 114 118 90 90 93 90 90 93 114 114 118 115 115 119 90 90 93 115 115 119 91 91 94 91 91 94 115 115 119 116 116 120 91 91 94 116 116 120 92 92 95 92 92 95 116 116 120 117 117 121 92 92 95 117 117 121 93 93 96 93 93 96 117 117 121 118 118 122 93 93 96 118 118 122 94 94 97 94 94 97 118 118 122 119 119 123 94 94 97 119 119 123 95 95 98 95 95 98 119 119 123 96 96 124 95 95 98 96 96 124 72 72 99 96 96 100 120 120 125 121 121 126 96 96 100 121 121 126 97 97 101 97 97 101 121 121 126 122 122 127 97 97 101 122 122 127 98 98 102 98 98 102 122 122 127 123 123 128 98 98 102 123 123 128 99 99 103 99 99 103 123 123 128 124 124 129 99 99 103 124 124 129 100 100 104 100 100 104 124 124 129 125 125 130 100 100 104 125 125 130 101 101 105 101 101 105 125 125 130 126 126 131 101 101 105 126 126 131 102 102 106 102 102 106 126 126 131 127 127 132 102 102 106 127 127 132 103 103 107 103 103 107 127 127 132 128 128 133 103 103 107 128 128 133 104 104 108 104 104 108 128 128 133 129 129 134 104 104 108 129 129 134 105 105 109 105 105 109 129 129 134 130 130 135 105 105 109 130 130 135 106 106 110 106 106 110 130 130 135 131 131 136 106 106 110 131 131 136 107 107 111 107 107 111 131 131 136 132 132 137 107 107 111 132 132 137 108 108 112 108 108 112 132 132 137 133 133 138 108 108 112 133 133 138 109 109 113 109 109 113 133 133 138 134 134 139 109 109 113 134 134 139 110 110 114 110 110 114 134 134 139 135 135 140 110 110 114 135 135 140 111 111 115 111 111 115 135 135 140 136 136 141 111 111 115 136 136 141 112 112 116 112 112 116 136 136 141 137 137 142 112 112 116 137 137 142 113 113 117 113 113 117 137 137 142 138 138 143 113 113 117 138 138 143 114 114 118 114 114 118 138 138 143 139 139 144 114 114 118 139 139 144 115 115 119 115 115 119 139 139 144 140 140 145 115 115 119 140 140 145 116 116 120 116 116 120 140 140 145 141 141 146 116 116 120 141 141 146 117 117 121 117 117 121 141 141 146 142 142 147 117 117 121 142 142 147 118 118 122 118 118 122 142 142 147 143 143 148 118 118 122 143 143 148 119 119 123 119 119 123 143 143 148 120 120 149 119 119 123 120 120 149 96 96 124 120 120 125 144 144 150 145 145 151 120 120 125 145 145 151 121 121 126 121 121 126 145 145 151 146 146 152 121 121 126 146 146 152 122 122 127 122 122 127 146 146 152 147 147 153 122 122 127 147 147 153 123 123 128 123 123 128 147 147 153 148 148 154 123 123 128 148 148 154 124 124 129 124 124 129 148 148 154 149 149 155 124 124 129 149 149 155 125 125 130 125 125 130 149 149 155 150 150 156 125 125 130 150 150 156 126 126 131 126 126 131 150 150 156 151 151 157 126 126 131 151 151 157 127 127 132 127 127 132 151 151 157 152 152 158 127 127 132 152 152 158 128 128 133 128 128 133 152 152 158 153 153 159 128 128 133 153 153 159 129 129 134 129 129 134 153 153 159 154 154 160 129 129 134 154 154 160 130 130 135 130 130 135 154 154 160 155 155 161 130 130 135 155 155 161 131 131 136 131 131 136 155 155 161 156 156 162 131 131 136 156 156 162 132 132 137 132 132 137 156 156 162 157 157 163 132 132 137 157 157 163 133 133 138 133 133 138 157 157 163 158 158 164 133 133 138 158 158 164 134 134 139 134 134 139 158 158 164 159 159 165 134 134 139 159 159 165 135 135 140 135 135 140 159 159 165 160 160 166 135 135 140 160 160 166 136 136 141 136 136 141 160 160 166 161 161 167 136 136 141 161 161 167 137 137 142 137 137 142 161 161 167 162 162 168 137 137 142 162 162 168 138 138 143 138 138 143 162 162 168 163 163 169 138 138 143 163 163 169 139 139 144 139 139 144 163 163 169 164 164 170 139 139 144 164 164 170 140 140 145 140 140 145 164 164 170 165 165 171 140 140 145 165 165 171 141 141 146 141 141 146 165 165 171 166 166 172 141 141 146 166 166 172 142 142 147 142 142 147 166 166 172 167 167 173 142 142 147 167 167 173 143 143 148 143 143 148 167 167 173 144 144 174 143 143 148 144 144 174 120 120 149 144 144 150 168 168 175 169 169 176 144 144 150 169 169 176 145 145 151 145 145 151 169 169 176 170 170 177 145 145 151 170 170 177 146 146 152 146 146 152 170 170 177 171 171 178 146 146 152 171 171 178 147 147 153 147 147 153 171 171 178 172 172 179 147 147 153 172 172 179 148 148 154 148 148 154 172 172 179 173 173 180 148 148 154 173 173 180 149 149 155 149 149 155 173 173 180 174 174 181 149 149 155 174 174 181 150 150 156 150 150 156 174 174 181 175 175 182 150 150 156 175 175 182 151 151 157 151 151 157 175 175 182 176 176 183 151 151 157 176 176 183 152 152 158 152 152 158 176 176 183 177 177 184 152 152 158 177 177 184 153 153 159 153 153 159 177 177 184 178 178 185 153 153 159 178 178 185 154 154 160 154 154 160 178 178 185 179 179 186 154 154 160 179 179 186 155 155 161 155 155 161 179 179 186 180 180 187 155 155 161 180 180 187 156 156 162 156 156 162 180 180 187 181 181 188 156 156 162 181 181 188 157 157 163 157 157 163 181 181 188 182 182 189 157 157 163 182 182 189 158 158 164 158 158 164 182 182 189 183 183 190 158 158 164 183 183 190 159 159 165 159 159 165 183 183 190 184 184 191 159 159 165 184 184 191 160 160 166 160 160 166 184 184 191 185 185 192 160 160 166 185 185 192 161 161 167 161 161 167 185 185 192 186 186 193 161 161 167 186 186 193 162 162 168 162 162 168 186 186 193 187 187 194 162 162 168 187 187 194 163 163 169 163 163 169 187 187 194 188 188 195 163 163 169 188 188 195 164 164 170 164 164 170 188 188 195 189 189 196 164 164 170 189 189 196 165 165 171 165 165 171 189 189 196 190 190 197 165 165 171 190 190 197 166 166 172 166 166 172 190 190 197 191 191 198 166 166 172 191 191 198 167 167 173 167 167 173 191 191 198 168 168 199 167 167 173 168 168 199 144 144 174 168 168 175 192 192 200 193 193 201 168 168 175 193 193 201 169 169 176 169 169 176 193 193 201 194 194 202 169 169 176 194 194 202 170 170 177 170 170 177 194 194 202 195 195 203 170 170 177 195 195 203 171 171 178 171 171 178 195 195 203 196 196 204 171 171 178 196 196 204 172 172 179 172 172 179 196 196 204 197 197 205 172 172 179 197 197 205 173 173 180 173 173 180 197 197 205 198 198 206 173 173 180 198 198 206 174 174 181 174 174 181 198 198 206 199 199 207 174 174 181 199 199 207 175 175 182 175 175 182 199 199 207 200 200 208 175 175 182 200 200 208 176 176 183 176 176 183 200 200 208 201 201 209 176 176 183 201 201 209 177 177 184 177 177 184 201 201 209 202 202 210 177 177 184 202 202 210 178 178 185 178 178 185 202 202 210 203 203 211 178 178 185 203 203 211 179 179 186 179 179 186 203 203 211 204 204 212 179 179 186 204 204 212 180 180 187 180 180 187 204 204 212 205 205 213 180 180 187 205 205 213 181 181 188 181 181 188 205 205 213 206 206 214 181 181 188 206 206 214 182 182 189 182 182 189 206 206 214 207 207 215 182 182 189 207 207 215 183 183 190 183 183 190 207 207 215 208 208 216 183 183 190 208 208 216 184 184 191 184 184 191 208 208 216 209 209 217 184 184 191 209 209 217 185 185 192 185 185 192 209 209 217 210 210 218 185 185 192 210 210 218 186 186 193 186 186 193 210 210 218 211 211 219 186 186 193 211 211 219 187 187 194 187 187 194 211 211 219 212 212 220 187 187 194 212 212 220 188 188 195 188 188 195 212 212 220 213 213 221 188 188 195 213 213 221 189 189 196 189 189 196 213 213 221 214 214 222 189 189 196 214 214 222 190 190 197 190 190 197 214 214 222 215 215 223 190 190 197 215 215 223 191 191 198 191 191 198 215 215 223 192 192 224 191 191 198 192 192 224 168 168 199 192 192 200 216 216 225 217 217 226 192 192 200 217 217 226 193 193 201 193 193 201 217 217 226 218 218 227 193 193 201 218 218 227 194 194 202 194 194 202 218 218 227 219 219 228 194 194 202 219 219 228 195 195 203 195 195 203 219 219 228 220 220 229 195 195 203 220 220 229 196 196 204 196 196 204 220 220 229 221 221 230 196 196 204 221 221 230 197 197 205 197 197 205 221 221 230 222 222 231 197 197 205 222 222 231 198 198 206 198 198 206 222 222 231 223 223 232 198 198 206 223 223 232 199 199 207 199 199 207 223 223 232 224 224 233 199 199 207 224 224 233 200 200 208 200 200 208 224 224 233 225 225 234 200 200 208 225 225 234 201 201 209 201 201 209 225 225 234 226 226 235 201 201 209 226 226 235 202 202 210 202 202 210 226 226 235 227 227 236 202 202 210 227 227 236 203 203 211 203 203 211 227 227 236 228 228 237 203 203 211 228 228 237 204 204 212 204 204 212 228 228 237 229 229 238 204 204 212 229 229 238 205 205 213 205 205 213 229 229 238 230 230 239 205 205 213 230 230 239 206 206 214 206 206 214 230 230 239 231 231 240 206 206 214 231 231 240 207 207 215 207 207 215 231 231 240 232 232 241 207 207 215 232 232 241 208 208 216 208 208 216 232 232 241 233 233 242 208 208 216 233 233 242 209 209 217 209 209 217 233 233 242 234 234 243 209 209 217 234 234 243 210 210 218 210 210 218 234 234 243 235 235 244 210 210 218 235 235 244 211 211 219 211 211 219 235 235 244 236 236 245 211 211 219 236 236 245 212 212 220 212 212 220 236 236 245 237 237 246 212 212 220 237 237 246 213 213 221 213 213 221 237 237 246 238 238 247 213 213 221 238 238 247 214 214 222 214 214 222 238 238 247 239 239 248 214 214 222 239 239 248 215 215 223 215 215 223 239 239 248 216 216 249 215 215 223 216 216 249 192 192 224 216 216 225 240 240 250 241 241 251 216 216 225 241 241 251 217 217 226 217 217 226 241 241 251 242 242 252 217 217 226 242 242 252 218 218 227 218 218 227 242 242 252 243 243 253 218 218 227 243 243 253 219 219 228 219 219 228 243 243 253 244 244 254 219 219 228 244 244 254 220 220 229 220 220 229 244 244 254 245 245 255 220 220 229 245 245 255 221 221 230 221 221 230 245 245 255 246 246 256 221 221 230 246 246 256 222 222 231 222 222 231 246 246 256 247 247 257 222 222 231 247 247 257 223 223 232 223 223 232 247 247 257 248 248 258 223 223 232 248 248 258 224 224 233 224 224 233 248 248 258 249 249 259 224 224 233 249 249 259 225 225 234 225 225 234 249 249 259 250 250 260 225 225 234 250 250 260 226 226 235 226 226 235 250 250 260 251 251 261 226 226 235 251 251 261 227 227 236 227 227 236 251 251 261 252 252 262 227 227 236 252 252 262 228 228 237 228 228 237 252 252 262 253 253 263 228 228 237 253 253 263 229 229 238 229 229 238 253 253 263 254 254 264 229 229 238 254 254 264 230 230 239 230 230 239 254 254 264 255 255 265 230 230 239 255 255 265 231 231 240 231 231 240 255 255 265 256 256 266 231 231 240 256 256 266 232 232 241 232 232 241 256 256 266 257 257 267 232 232 241 257 257 267 233 233 242 233 233 242 257 257 267 258 258 268 233 233 242 258 258 268 234 234 243 234 234 243 258 258 268 259 259 269 234 234 243 259 259 269 235 235 244 235 235 244 259 259 269 260 260 270 235 235 244 260 260 270 236 236 245 236 236 245 260 260 270 261 261 271 236 236 245 261 261 271 237 237 246 237 237 246 261 261 271 262 262 272 237 237 246 262 262 272 238 238 247 238 238 247 262 262 272 263 263 273 238 238 247 263 263 273 239 239 248 239 239 248 263 263 273 240 240 274 239 239 248 240 240 274 216 216 249 240 240 250 264 264 275 265 265 276 240 240 250 265 265 276 241 241 251 241 241 251 265 265 276 266 266 277 241 241 251 266 266 277 242 242 252 242 242 252 266 266 277 267 267 278 242 242 252 267 267 278 243 243 253 243 243 253 267 267 278 268 268 279 243 243 253 268 268 279 244 244 254 244 244 254 268 268 279 269 269 280 244 244 254 269 269 280 245 245 255 245 245 255 269 269 280 270 270 281 245 245 255 270 270 281 246 246 256 246 246 256 270 270 281 271 271 282 246 246 256 271 271 282 247 247 257 247 247 257 271 271 282 272 272 283 247 247 257 272 272 283 248 248 258 248 248 258 272 272 283 273 273 284 248 248 258 273 273 284 249 249 259 249 249 259 273 273 284 274 274 285 249 249 259 274 274 285 250 250 260 250 250 260 274 274 285 275 275 286 250 250 260 275 275 286 251 251 261 251 251 261 275 275 286 276 276 287 251 251 261 276 276 287 252 252 262 252 252 262 276 276 287 277 277 288 252 252 262 277 277 288 253 253 263 253 253 263 277 277 288 278 278 289 253 253 263 278 278 289 254 254 264 254 254 264 278 278 289 279 279 290 254 254 264 279 279 290 255 255 265 255 255 265 279 279 290 280 280 291 255 255 265 280 280 291 256 256 266 256 256 266 280 280 291 281 281 292 256 256 266 281 281 292 257 257 267 257 257 267 281 281 292 282 282 293 257 257 267 282 282 293 258 258 268 258 258 268 282 282 293 283 283 294 258 258 268 283 283 294 259 259 269 259 259 269 283 283 294 284 284 295 259 259 269 284 284 295 260 260 270 260 260 270 284 284 295 285 285 296 260 260 270 285 285 296 261 261 271 261 261 271 285 285 296 286 286 297 261 261 271 286 286 297 262 262 272 262 262 272 286 286 297 287 287 298 262 262 272 287 287 298 263 263 273 263 263 273 287 287 298 264 264 299 263 263 273 264 264 299 240 240 274 264 264 275 288 288 300 289 289 301 264 264 275 289 289 301 265 265 276 265 265 276 289 289 301 290 290 302 265 265 276 290 290 302 266 266 277 266 266 277 290 290 302 291 291 303 266 266 277 291 291 303 267 267 278 267 267 278 291 291 303 292 292 304 267 267 278 292 292 304 268 268 279 268 268 279 292 292 304 293 293 305 268 268 279 293 293 305 269 269 280 269 269 280 293 293 305 294 294 306 269 269 280 294 294 306 270 270 281 270 270 281 294 294 306 295 295 307 270 270 281 295 295 307 271 271 282 271 271 282 295 295 307 296 296 308 271 271 282 296 296 308 272 272 283 272 272 283 296 296 308 297 297 309 272 272 283 297 297 309 273 273 284 273 273 284 297 297 309 298 298 310 273 273 284 298 298 310 274 274 285 274 274 285 298 298 310 299 299 311 274 274 285 299 299 311 275 275 286 275 275 286 299 299 311 300 300 312 275 275 286 300 300 312 276 276 287 276 276 287 300 300 312 301 301 313 276 276 287 301 301 313 277 277 288 277 277 288 301 301 313 302 302 314 277 277 288 302 302 314 278 278 289 278 278 289 302 302 314 303 303 315 278 278 289 303 303 315 279 279 290 279 279 290 303 303 315 304 304 316 279 279 290 304 304 316 280 280 291 280 280 291 304 304 316 305 305 317 280 280 291 305 305 317 281 281 292 281 281 292 305 305 317 306 306 318 281 281 292 306 306 318 282 282 293 282 282 293 306 306 318 307 307 319 282 282 293 307 307 319 283 283 294 283 283 294 307 307 319 308 308 320 283 283 294 308 308 320 284 284 295 284 284 295 308 308 320 309 309 321 284 284 295 309 309 321 285 285 296 285 285 296 309 309 321 310 310 322 285 285 296 310 310 322 286 286 297 286 286 297 310 310 322 311 311 323 286 286 297 311 311 323 287 287 298 287 287 298 311 311 323 288 288 324 287 287 298 288 288 324 264 264 299 288 288 300 312 312 325 313 313 326 288 288 300 313 313 326 289 289 301 289 289 301 313 313 326 314 314 327 289 289 301 314 314 327 290 290 302 290 290 302 314 314 327 315 315 328 290 290 302 315 315 328 291 291 303 291 291 303 315 315 328 316 316 329 291 291 303 316 316 329 292 292 304 292 292 304 316 316 329 317 317 330 292 292 304 317 317 330 293 293 305 293 293 305 317 317 330 318 318 331 293 293 305 318 318 331 294 294 306 294 294 306 318 318 331 319 319 332 294 294 306 319 319 332 295 295 307 295 295 307 319 319 332 320 320 333 295 295 307 320 320 333 296 296 308 296 296 308 320 320 333 321 321 334 296 296 308 321 321 334 297 297 309 297 297 309 321 321 334 322 322 335 297 297 309 322 322 335 298 298 310 298 298 310 322 322 335 323 323 336 298 298 310 323 323 336 299 299 311 299 299 311 323 323 336 324 324 337 299 299 311 324 324 337 300 300 312 300 300 312 324 324 337 325 325 338 300 300 312 325 325 338 301 301 313 301 301 313 325 325 338 326 326 339 301 301 313 326 326 339 302 302 314 302 302 314 326 326 339 327 327 340 302 302 314 327 327 340 303 303 315 303 303 315 327 327 340 328 328 341 303 303 315 328 328 341 304 304 316 304 304 316 328 328 341 329 329 342 304 304 316 329 329 342 305 305 317 305 305 317 329 329 342 330 330 343 305 305 317 330 330 343 306 306 318 306 306 318 330 330 343 331 331 344 306 306 318 331 331 344 307 307 319 307 307 319 331 331 344 332 332 345 307 307 319 332 332 345 308 308 320 308 308 320 332 332 345 333 333 346 308 308 320 333 333 346 309 309 321 309 309 321 333 333 346 334 334 347 309 309 321 334 334 347 310 310 322 310 310 322 334 334 347 335 335 348 310 310 322 335 335 348 311 311 323 311 311 323 335 335 348 312 312 349 311 311 323 312 312 349 288 288 324 312 312 325 336 336 350 337 337 351 312 312 325 337 337 351 313 313 326 313 313 326 337 337 351 338 338 352 313 313 326 338 338 352 314 314 327 314 314 327 338 338 352 339 339 353 314 314 327 339 339 353 315 315 328 315 315 328 339 339 353 340 340 354 315 315 328 340 340 354 316 316 329 316 316 329 340 340 354 341 341 355 316 316 329 341 341 355 317 317 330 317 317 330 341 341 355 342 342 356 317 317 330 342 342 356 318 318 331 318 318 331 342 342 356 343 343 357 318 318 331 343 343 357 319 319 332 319 319 332 343 343 357 344 344 358 319 319 332 344 344 358 320 320 333 320 320 333 344 344 358 345 345 359 320 320 333 345 345 359 321 321 334 321 321 334 345 345 359 346 346 360 321 321 334 346 346 360 322 322 335 322 322 335 346 346 360 347 347 361 322 322 335 347 347 361 323 323 336 323 323 336 347 347 361 348 348 362 323 323 336 348 348 362 324 324 337 324 324 337 348 348 362 349 349 363 324 324 337 349 349 363 325 325 338 325 325 338 349 349 363 350 350 364 325 325 338 350 350 364 326 326 339 326 326 339 350 350 364 351 351 365 326 326 339 351 351 365 327 327 340 327 327 340 351 351 365 352 352 366 327 327 340 352 352 366 328 328 341 328 328 341 352 352 366 353 353 367 328 328 341 353 353 367 329 329 342 329 329 342 353 353 367 354 354 368 329 329 342 354 354 368 330 330 343 330 330 343 354 354 368 355 355 369 330 330 343 355 355 369 331 331 344 331 331 344 355 355 369 356 356 370 331 331 344 356 356 370 332 332 345 332 332 345 356 356 370 357 357 371 332 332 345 357 357 371 333 333 346 333 333 346 357 357 371 358 358 372 333 333 346 358 358 372 334 334 347 334 334 347 358 358 372 359 359 373 334 334 347 359 359 373 335 335 348 335 335 348 359 359 373 336 336 374 335 335 348 336 336 374 312 312 349 336 336 350 360 360 375 361 361 376 336 336 350 361 361 376 337 337 351 337 337 351 361 361 376 362 362 377 337 337 351 362 362 377 338 338 352 338 338 352 362 362 377 363 363 378 338 338 352 363 363 378 339 339 353 339 339 353 363 363 378 364 364 379 339 339 353 364 364 379 340 340 354 340 340 354 364 364 379 365 365 380 340 340 354 365 365 380 341 341 355 341 341 355 365 365 380 366 366 381 341 341 355 366 366 381 342 342 356 342 342 356 366 366 381 367 367 382 342 342 356 367 367 382 343 343 357 343 343 357 367 367 382 368 368 383 343 343 357 368 368 383 344 344 358 344 344 358 368 368 383 369 369 384 344 344 358 369 369 384 345 345 359 345 345 359 369 369 384 370 370 385 345 345 359 370 370 385 346 346 360 346 346 360 370 370 385 371 371 386 346 346 360 371 371 386 347 347 361 347 347 361 371 371 386 372 372 387 347 347 361 372 372 387 348 348 362 348 348 362 372 372 387 373 373 388 348 348 362 373 373 388 349 349 363 349 349 363 373 373 388 374 374 389 349 349 363 374 374 389 350 350 364 350 350 364 374 374 389 375 375 390 350 350 364 375 375 390 351 351 365 351 351 365 375 375 390 376 376 391 351 351 365 376 376 391 352 352 366 352 352 366 376 376 391 377 377 392 352 352 366 377 377 392 353 353 367 353 353 367 377 377 392 378 378 393 353 353 367 378 378 393 354 354 368 354 354 368 378 378 393 379 379 394 354 354 368 379 379 394 355 355 369 355 355 369 379 379 394 380 380 395 355 355 369 380 380 395 356 356 370 356 356 370 380 380 395 381 381 396 356 356 370 381 381 396 357 357 371 357 357 371 381 381 396 382 382 397 357 357 371 382 382 397 358 358 372 358 358 372 382 382 397 383 383 398 358 358 372 383 383 398 359 359 373 359 359 373 383 383 398 360 360 399 359 359 373 360 360 399 336 336 374 360 360 375 384 384 400 385 385 401 360 360 375 385 385 401 361 361 376 361 361 376 385 385 401 386 386 402 361 361 376 386 386 402 362 362 377 362 362 377 386 386 402 387 387 403 362 362 377 387 387 403 363 363 378 363 363 378 387 387 403 388 388 404 363 363 378 388 388 404 364 364 379 364 364 379 388 388 404 389 389 405 364 364 379 389 389 405 365 365 380 365 365 380 389 389 405 390 390 406 365 365 380 390 390 406 366 366 381 366 366 381 390 390 406 391 391 407 366 366 381 391 391 407 367 367 382 367 367 382 391 391 407 392 392 408 367 367 382 392 392 408 368 368 383 368 368 383 392 392 408 393 393 409 368 368 383 393 393 409 369 369 384 369 369 384 393 393 409 394 394 410 369 369 384 394 394 410 370 370 385 370 370 385 394 394 410 395 395 411 370 370 385 395 395 411 371 371 386 371 371 386 395 395 411 396 396 412 371 371 386 396 396 412 372 372 387 372 372 387 396 396 412 397 397 413 372 372 387 397 397 413 373 373 388 373 373 388 397 397 413 398 398 414 373 373 388 398 398 414 374 374 389 374 374 389 398 398 414 399 399 415 374 374 389 399 399 415 375 375 390 375 375 390 399 399 415 400 400 416 375 375 390 400 400 416 376 376 391 376 376 391 400 400 416 401 401 417 376 376 391 401 401 417 377 377 392 377 377 392 401 401 417 402 402 418 377 377 392 402 402 418 378 378 393 378 378 393 402 402 418 403 403 419 378 378 393 403 403 419 379 379 394 379 379 394 403 403 419 404 404 420 379 379 394 404 404 420 380 380 395 380 380 395 404 404 420 405 405 421 380 380 395 405 405 421 381 381 396 381 381 396 405 405 421 406 406 422 381 381 396 406 406 422 382 382 397 382 382 397 406 406 422 407 407 423 382 382 397 407 407 423 383 383 398 383 383 398 407 407 423 384 384 424 383 383 398 384 384 424 360 360 399 384 384 400 408 408 425 409 409 426 384 384 400 409 409 426 385 385 401 385 385 401 409 409 426 410 410 427 385 385 401 410 410 427 386 386 402 386 386 402 410 410 427 411 411 428 386 386 402 411 411 428 387 387 403 387 387 403 411 411 428 412 412 429 387 387 403 412 412 429 388 388 404 388 388 404 412 412 429 413 413 430 388 388 404 413 413 430 389 389 405 389 389 405 413 413 430 414 414 431 389 389 405 414 414 431 390 390 406 390 390 406 414 414 431 415 415 432 390 390 406 415 415 432 391 391 407 391 391 407 415 415 432 416 416 433 391 391 407 416 416 433 392 392 408 392 392 408 416 416 433 417 417 434 392 392 408 417 417 434 393 393 409 393 393 409 417 417 434 418 418 435 393 393 409 418 418 435 394 394 410 394 394 410 418 418 435 419 419 436 394 394 410 419 419 436 395 395 411 395 395 411 419 419 436 420 420 437 395 395 411 420 420 437 396 396 412 396 396 412 420 420 437 421 421 438 396 396 412 421 421 438 397 397 413 397 397 413 421 421 438 422 422 439 397 397 413 422 422 439 398 398 414 398 398 414 422 422 439 423 423 440 398 398 414 423 423 440 399 399 415 399 399 415 423 423 440 424 424 441 399 399 415 424 424 441 400 400 416 400 400 416 424 424 441 425 425 442 400 400 416 425 425 442 401 401 417 401 401 417 425 425 442 426 426 443 401 401 417 426 426 443 402 402 418 402 402 418 426 426 443 427 427 444 402 402 418 427 427 444 403 403 419 403 403 419 427 427 444 428 428 445 403 403 419 428 428 445 404 404 420 404 404 420 428 428 445 429 429 446 404 404 420 429 429 446 405 405 421 405 405 421 429 429 446 430 430 447 405 405 421 430 430 447 406 406 422 406 406 422 430 430 447 431 431 448 406 406 422 431 431 448 407 407 423 407 407 423 431 431 448 408 408 449 407 407 423 408 408 449 384 384 424 408 408 425 432 432 450 433 433 451 408 408 425 433 433 451 409 409 426 409 409 426 433 433 451 434 434 452 409 409 426 434 434 452 410 410 427 410 410 427 434 434 452 435 435 453 410 410 427 435 435 453 411 411 428 411 411 428 435 435 453 436 436 454 411 411 428 436 436 454 412 412 429 412 412 429 436 436 454 437 437 455 412 412 429 437 437 455 413 413 430 413 413 430 437 437 455 438 438 456 413 413 430 438 438 456 414 414 431 414 414 431 438 438 456 439 439 457 414 414 431 439 439 457 415 415 432 415 415 432 439 439 457 440 440 458 415 415 432 440 440 458 416 416 433 416 416 433 440 440 458 441 441 459 416 416 433 441 441 459 417 417 434 417 417 434 441 441 459 442 442 460 417 417 434 442 442 460 418 418 435 418 418 435 442 442 460 443 443 461 418 418 435 443 443 461 419 419 436 419 419 436 443 443 461 444 444 462 419 419 436 444 444 462 420 420 437 420 420 437 444 444 462 445 445 463 420 420 437 445 445 463 421 421 438 421 421 438 445 445 463 446 446 464 421 421 438 446 446 464 422 422 439 422 422 439 446 446 464 447 447 465 422 422 439 447 447 465 423 423 440 423 423 440 447 447 465 448 448 466 423 423 440 448 448 466 424 424 441 424 424 441 448 448 466 449 449 467 424 424 441 449 449 467 425 425 442 425 425 442 449 449 467 450 450 468 425 425 442 450 450 468 426 426 443 426 426 443 450 450 468 451 451 469 426 426 443 451 451 469 427 427 444 427 427 444 451 451 469 452 452 470 427 427 444 452 452 470 428 428 445 428 428 445 452 452 470 453 453 471 428 428 445 453 453 471 429 429 446 429 429 446 453 453 471 454 454 472 429 429 446 454 454 472 430 430 447 430 430 447 454 454 472 455 455 473 430 430 447 455 455 473 431 431 448 431 431 448 455 455 473 432 432 474 431 431 448 432 432 474 408 408 449 432 432 450 456 456 475 457 457 476 432 432 450 457 457 476 433 433 451 433 433 451 457 457 476 458 458 477 433 433 451 458 458 477 434 434 452 434 434 452 458 458 477 459 459 478 434 434 452 459 459 478 435 435 453 435 435 453 459 459 478 460 460 479 435 435 453 460 460 479 436 436 454 436 436 454 460 460 479 461 461 480 436 436 454 461 461 480 437 437 455 437 437 455 461 461 480 462 462 481 437 437 455 462 462 481 438 438 456 438 438 456 462 462 481 463 463 482 438 438 456 463 463 482 439 439 457 439 439 457 463 463 482 464 464 483 439 439 457 464 464 483 440 440 458 440 440 458 464 464 483 465 465 484 440 440 458 465 465 484 441 441 459 441 441 459 465 465 484 466 466 485 441 441 459 466 466 485 442 442 460 442 442 460 466 466 485 467 467 486 442 442 460 467 467 486 443 443 461 443 443 461 467 467 486 468 468 487 443 443 461 468 468 487 444 444 462 444 444 462 468 468 487 469 469 488 444 444 462 469 469 488 445 445 463 445 445 463 469 469 488 470 470 489 445 445 463 470 470 489 446 446 464 446 446 464 470 470 489 471 471 490 446 446 464 471 471 490 447 447 465 447 447 465 471 471 490 472 472 491 447 447 465 472 472 491 448 448 466 448 448 466 472 472 491 473 473 492 448 448 466 473 473 492 449 449 467 449 449 467 473 473 492 474 474 493 449 449 467 474 474 493 450 450 468 450 450 468 474 474 493 475 475 494 450 450 468 475 475 494 451 451 469 451 451 469 475 475 494 476 476 495 451 451 469 476 476 495 452 452 470 452 452 470 476 476 495 477 477 496 452 452 470 477 477 496 453 453 471 453 453 471 477 477 496 478 478 497 453 453 471 478 478 497 454 454 472 454 454 472 478 478 497 479 479 498 454 454 472 479 479 498 455 455 473 455 455 473 479 479 498 456 456 499 455 455 473 456 456 499 432 432 474 456 456 475 480 480 500 481 481 501 456 456 475 481 481 501 457 457 476 457 457 476 481 481 501 482 482 502 457 457 476 482 482 502 458 458 477 458 458 477 482 482 502 483 483 503 458 458 477 483 483 503 459 459 478 459 459 478 483 483 503 484 484 504 459 459 478 484 484 504 460 460 479 460 460 479 484 484 504 485 485 505 460 460 479 485 485 505 461 461 480 461 461 480 485 485 505 486 486 506 461 461 480 486 486 506 462 462 481 462 462 481 486 486 506 487 487 507 462 462 481 487 487 507 463 463 482 463 463 482 487 487 507 488 488 508 463 463 482 488 488 508 464 464 483 464 464 483 488 488 508 489 489 509 464 464 483 489 489 509 465 465 484 465 465 484 489 489 509 490 490 510 465 465 484 490 490 510 466 466 485 466 466 485 490 490 510 491 491 511 466 466 485 491 491 511 467 467 486 467 467 486 491 491 511 492 492 512 467 467 486 492 492 512 468 468 487 468 468 487 492 492 512 493 493 513 468 468 487 493 493 513 469 469 488 469 469 488 493 493 513 494 494 514 469 469 488 494 494 514 470 470 489 470 470 489 494 494 514 495 495 515 470 470 489 495 495 515 471 471 490 471 471 490 495 495 515 496 496 516 471 471 490 496 496 516 472 472 491 472 472 491 496 496 516 497 497 517 472 472 491 497 497 517 473 473 492 473 473 492 497 497 517 498 498 518 473 473 492 498 498 518 474 474 493 474 474 493 498 498 518 499 499 519 474 474 493 499 499 519 475 475 494 475 475 494 499 499 519 500 500 520 475 475 494 500 500 520 476 476 495 476 476 495 500 500 520 501 501 521 476 476 495 501 501 521 477 477 496 477 477 496 501 501 521 502 502 522 477 477 496 502 502 522 478 478 497 478 478 497 502 502 522 503 503 523 478 478 497 503 503 523 479 479 498 479 479 498 503 503 523 480 480 524 479 479 498 480 480 524 456 456 499 480 480 500 504 504 525 505 505 526 480 480 500 505 505 526 481 481 501 481 481 501 505 505 526 506 506 527 481 481 501 506 506 527 482 482 502 482 482 502 506 506 527 507 507 528 482 482 502 507 507 528 483 483 503 483 483 503 507 507 528 508 508 529 483 483 503 508 508 529 484 484 504 484 484 504 508 508 529 509 509 530 484 484 504 509 509 530 485 485 505 485 485 505 509 509 530 510 510 531 485 485 505 510 510 531 486 486 506 486 486 506 510 510 531 511 511 532 486 486 506 511 511 532 487 487 507 487 487 507 511 511 532 512 512 533 487 487 507 512 512 533 488 488 508 488 488 508 512 512 533 513 513 534 488 488 508 513 513 534 489 489 509 489 489 509 513 513 534 514 514 535 489 489 509 514 514 535 490 490 510 490 490 510 514 514 535 515 515 536 490 490 510 515 515 536 491 491 511 491 491 511 515 515 536 516 516 537 491 491 511 516 516 537 492 492 512 492 492 512 516 516 537 517 517 538 492 492 512 517 517 538 493 493 513 493 493 513 517 517 538 518 518 539 493 493 513 518 518 539 494 494 514 494 494 514 518 518 539 519 519 540 494 494 514 519 519 540 495 495 515 495 495 515 519 519 540 520 520 541 495 495 515 520 520 541 496 496 516 496 496 516 520 520 541 521 521 542 496 496 516 521 521 542 497 497 517 497 497 517 521 521 542 522 522 543 497 497 517 522 522 543 498 498 518 498 498 518 522 522 543 523 523 544 498 498 518 523 523 544 499 499 519 499 499 519 523 523 544 524 524 545 499 499 519 524 524 545 500 500 520 500 500 520 524 524 545 525 525 546 500 500 520 525 525 546 501 501 521 501 501 521 525 525 546 526 526 547 501 501 521 526 526 547 502 502 522 502 502 522 526 526 547 527 527 548 502 502 522 527 527 548 503 503 523 503 503 523 527 527 548 504 504 549 503 503 523 504 504 549 480 480 524 504 504 525 528 528 550 529 529 551 504 504 525 529 529 551 505 505 526 505 505 526 529 529 551 530 530 552 505 505 526 530 530 552 506 506 527 506 506 527 530 530 552 531 531 553 506 506 527 531 531 553 507 507 528 507 507 528 531 531 553 532 532 554 507 507 528 532 532 554 508 508 529 508 508 529 532 532 554 533 533 555 508 508 529 533 533 555 509 509 530 509 509 530 533 533 555 534 534 556 509 509 530 534 534 556 510 510 531 510 510 531 534 534 556 535 535 557 510 510 531 535 535 557 511 511 532 511 511 532 535 535 557 536 536 558 511 511 532 536 536 558 512 512 533 512 512 533 536 536 558 537 537 559 512 512 533 537 537 559 513 513 534 513 513 534 537 537 559 538 538 560 513 513 534 538 538 560 514 514 535 514 514 535 538 538 560 539 539 561 514 514 535 539 539 561 515 515 536 515 515 536 539 539 561 540 540 562 515 515 536 540 540 562 516 516 537 516 516 537 540 540 562 541 541 563 516 516 537 541 541 563 517 517 538 517 517 538 541 541 563 542 542 564 517 517 538 542 542 564 518 518 539 518 518 539 542 542 564 543 543 565 518 518 539 543 543 565 519 519 540 519 519 540 543 543 565 544 544 566 519 519 540 544 544 566 520 520 541 520 520 541 544 544 566 545 545 567 520 520 541 545 545 567 521 521 542 521 521 542 545 545 567 546 546 568 521 521 542 546 546 568 522 522 543 522 522 543 546 546 568 547 547 569 522 522 543 547 547 569 523 523 544 523 523 544 547 547 569 548 548 570 523 523 544 548 548 570 524 524 545 524 524 545 548 548 570 549 549 571 524 524 545 549 549 571 525 525 546 525 525 546 549 549 571 550 550 572 525 525 546 550 550 572 526 526 547 526 526 547 550 550 572 551 551 573 526 526 547 551 551 573 527 527 548 527 527 548 551 551 573 528 528 574 527 527 548 528 528 574 504 504 549 528 528 550 552 552 575 553 553 576 528 528 550 553 553 576 529 529 551 529 529 551 553 553 576 554 554 577 529 529 551 554 554 577 530 530 552 530 530 552 554 554 577 555 555 578 530 530 552 555 555 578 531 531 553 531 531 553 555 555 578 556 556 579 531 531 553 556 556 579 532 532 554 532 532 554 556 556 579 557 557 580 532 532 554 557 557 580 533 533 555 533 533 555 557 557 580 558 558 581 533 533 555 558 558 581 534 534 556 534 534 556 558 558 581 559 559 582 534 534 556 559 559 582 535 535 557 535 535 557 559 559 582 560 560 583 535 535 557 560 560 583 536 536 558 536 536 558 560 560 583 561 561 584 536 536 558 561 561 584 537 537 559 537 537 559 561 561 584 562 562 585 537 537 559 562 562 585 538 538 560 538 538 560 562 562 585 563 563 586 538 538 560 563 563 586 539 539 561 539 539 561 563 563 586 564 564 587 539 539 561 564 564 587 540 540 562 540 540 562 564 564 587 565 565 588 540 540 562 565 565 588 541 541 563 541 541 563 565 565 588 566 566 589 541 541 563 566 566 589 542 542 564 542 542 564 566 566 589 567 567 590 542 542 564 567 567 590 543 543 565 543 543 565 567 567 590 568 568 591 543 543 565 568 568 591 544 544 566 544 544 566 568 568 591 569 569 592 544 544 566 569 569 592 545 545 567 545 545 567 569 569 592 570 570 593 545 545 567 570 570 593 546 546 568 546 546 568 570 570 593 571 571 594 546 546 568 571 571 594 547 547 569 547 547 569 571 571 594 572 572 595 547 547 569 572 572 595 548 548 570 548 548 570 572 572 595 573 573 596 548 548 570 573 573 596 549 549 571 549 549 571 573 573 596 574 574 597 549 549 571 574 574 597 550 550 572 550 550 572 574 574 597 575 575 598 550 550 572 575 575 598 551 551 573 551 551 573 575 575 598 552 552 599 551 551 573 552 552 599 528 528 574 552 552 575 576 576 600 577 577 601 552 552 575 577 577 601 553 553 576 553 553 576 577 577 601 578 578 602 553 553 576 578 578 602 554 554 577 554 554 577 578 578 602 579 579 603 554 554 577 579 579 603 555 555 578 555 555 578 579 579 603 580 580 604 555 555 578 580 580 604 556 556 579 556 556 579 580 580 604 581 581 605 556 556 579 581 581 605 557 557 580 557 557 580 581 581 605 582 582 606 557 557 580 582 582 606 558 558 581 558 558 581 582 582 606 583 583 607 558 558 581 583 583 607 559 559 582 559 559 582 583 583 607 584 584 608 559 559 582 584 584 608 560 560 583 560 560 583 584 584 608 585 585 609 560 560 583 585 585 609 561 561 584 561 561 584 585 585 609 586 586 610 561 561 584 586 586 610 562 562 585 562 562 585 586 586 610 587 587 611 562 562 585 587 587 611 563 563 586 563 563 586 587 587 611 588 588 612 563 563 586 588 588 612 564 564 587 564 564 587 588 588 612 589 589 613 564 564 587 589 589 613 565 565 588 565 565 588 589 589 613 590 590 614 565 565 588 590 590 614 566 566 589 566 566 589 590 590 614 591 591 615 566 566 589 591 591 615 567 567 590 567 567 590 591 591 615 592 592 616 567 567 590 592 592 616 568 568 591 568 568 591 592 592 616 593 593 617 568 568 591 593 593 617 569 569 592 569 569 592 593 593 617 594 594 618 569 569 592 594 594 618 570 570 593 570 570 593 594 594 618 595 595 619 570 570 593 595 595 619 571 571 594 571 571 594 595 595 619 596 596 620 571 571 594 596 596 620 572 572 595 572 572 595 596 596 620 597 597 621 572 572 595 597 597 621 573 573 596 573 573 596 597 597 621 598 598 622 573 573 596 598 598 622 574 574 597 574 574 597 598 598 622 599 599 623 574 574 597 599 599 623 575 575 598 575 575 598 599 599 623 576 576 624 575 575 598 576 576 624 552 552 599 576 576 600 600 600 625 601 601 626 576 576 600 601 601 626 577 577 601 577 577 601 601 601 626 602 602 627 577 577 601 602 602 627 578 578 602 578 578 602 602 602 627 603 603 628 578 578 602 603 603 628 579 579 603 579 579 603 603 603 628 604 604 629 579 579 603 604 604 629 580 580 604 580 580 604 604 604 629 605 605 630 580 580 604 605 605 630 581 581 605 581 581 605 605 605 630 606 606 631 581 581 605 606 606 631 582 582 606 582 582 606 606 606 631 607 607 632 582 582 606 607 607 632 583 583 607 583 583 607 607 607 632 608 608 633 583 583 607 608 608 633 584 584 608 584 584 608 608 608 633 609 609 634 584 584 608 609 609 634 585 585 609 585 585 609 609 609 634 610 610 635 585 585 609 610 610 635 586 586 610 586 586 610 610 610 635 611 611 636 586 586 610 611 611 636 587 587 611 587 587 611 611 611 636 612 612 637 587 587 611 612 612 637 588 588 612 588 588 612 612 612 637 613 613 638 588 588 612 613 613 638 589 589 613 589 589 613 613 613 638 614 614 639 589 589 613 614 614 639 590 590 614 590 590 614 614 614 639 615 615 640 590 590 614 615 615 640 591 591 615 591 591 615 615 615 640 616 616 641 591 591 615 616 616 641 592 592 616 592 592 616 616 616 641 617 617 642 592 592 616 617 617 642 593 593 617 593 593 617 617 617 642 618 618 643 593 593 617 618 618 643 594 594 618 594 594 618 618 618 643 619 619 644 594 594 618 619 619 644 595 595 619 595 595 619 619 619 644 620 620 645 595 595 619 620 620 645 596 596 620 596 596 620 620 620 645 621 621 646 596 596 620 621 621 646 597 597 621 597 597 621 621 621 646 622 622 647 597 597 621 622 622 647 598 598 622 598 598 622 622 622 647 623 623 648 598 598 622 623 623 648 599 599 623 599 599 623 623 623 648 600 600 649 599 599 623 600 600 649 576 576 624 600 600 625 624 624 650 625 625 651 600 600 625 625 625 651 601 601 626 601 601 626 625 625 651 626 626 652 601 601 626 626 626 652 602 602 627 602 602 627 626 626 652 627 627 653 602 602 627 627 627 653 603 603 628 603 603 628 627 627 653 628 628 654 603 603 628 628 628 654 604 604 629 604 604 629 628 628 654 629 629 655 604 604 629 629 629 655 605 605 630 605 605 630 629 629 655 630 630 656 605 605 630 630 630 656 606 606 631 606 606 631 630 630 656 631 631 657 606 606 631 631 631 657 607 607 632 607 607 632 631 631 657 632 632 658 607 607 632 632 632 658 608 608 633 608 608 633 632 632 658 633 633 659 608 608 633 633 633 659 609 609 634 609 609 634 633 633 659 634 634 660 609 609 634 634 634 660 610 610 635 610 610 635 634 634 660 635 635 661 610 610 635 635 635 661 611 611 636 611 611 636 635 635 661 636 636 662 611 611 636 636 636 662 612 612 637 612 612 637 636 636 662 637 637 663 612 612 637 637 637 663 613 613 638 613 613 638 637 637 663 638 638 664 613 613 638 638 638 664 614 614 639 614 614 639 638 638 664 639 639 665 614 614 639 639 639 665 615 615 640 615 615 640 639 639 665 640 640 666 615 615 640 640 640 666 616 616 641 616 616 641 640 640 666 641 641 667 616 616 641 641 641 667 617 617 642 617 617 642 641 641 667 642 642 668 617 617 642 642 642 668 618 618 643 618 618 643 642 642 668 643 643 669 618 618 643 643 643 669 619 619 644 619 619 644 643 643 669 644 644 670 619 619 644 644 644 670 620 620 645 620 620 645 644 644 670 645 645 671 620 620 645 645 645 671 621 621 646 621 621 646 645 645 671 646 646 672 621 621 646 646 646 672 622 622 647 622 622 647 646 646 672 647 647 673 622 622 647 647 647 673 623 623 648 623 623 648 647 647 673 624 624 674 623 623 648 624 624 674 600 600 649 624 624 650 648 648 675 649 649 676 624 624 650 649 649 676 625 625 651 625 625 651 649 649 676 650 650 677 625 625 651 650 650 677 626 626 652 626 626 652 650 650 677 651 651 678 626 626 652 651 651 678 627 627 653 627 627 653 651 651 678 652 652 679 627 627 653 652 652 679 628 628 654 628 628 654 652 652 679 653 653 680 628 628 654 653 653 680 629 629 655 629 629 655 653 653 680 654 654 681 629 629 655 654 654 681 630 630 656 630 630 656 654 654 681 655 655 682 630 630 656 655 655 682 631 631 657 631 631 657 655 655 682 656 656 683 631 631 657 656 656 683 632 632 658 632 632 658 656 656 683 657 657 684 632 632 658 657 657 684 633 633 659 633 633 659 657 657 684 658 658 685 633 633 659 658 658 685 634 634 660 634 634 660 658 658 685 659 659 686 634 634 660 659 659 686 635 635 661 635 635 661 659 659 686 660 660 687 635 635 661 660 660 687 636 636 662 636 636 662 660 660 687 661 661 688 636 636 662 661 661 688 637 637 663 637 637 663 661 661 688 662 662 689 637 637 663 662 662 689 638 638 664 638 638 664 662 662 689 663 663 690 638 638 664 663 663 690 639 639 665 639 639 665 663 663 690 664 664 691 639 639 665 664 664 691 640 640 666 640 640 666 664 664 691 665 665 692 640 640 666 665 665 692 641 641 667 641 641 667 665 665 692 666 666 693 641 641 667 666 666 693 642 642 668 642 642 668 666 666 693 667 667 694 642 642 668 667 667 694 643 643 669 643 643 669 667 667 694 668 668 695 643 643 669 668 668 695 644 644 670 644 644 670 668 668 695 669 669 696 644 644 670 669 669 696 645 645 671 645 645 671 669 669 696 670 670 697 645 645 671 670 670 697 646 646 672 646 646 672 670 670 697 671 671 698 646 646 672 671 671 698 647 647 673 647 647 673 671 671 698 648 648 699 647 647 673 648 648 699 624 624 674 648 648 675 672 672 700 673 673 701 648 648 675 673 673 701 649 649 676 649 649 676 673 673 701 674 674 702 649 649 676 674 674 702 650 650 677 650 650 677 674 674 702 675 675 703 650 650 677 675 675 703 651 651 678 651 651 678 675 675 703 676 676 704 651 651 678 676 676 704 652 652 679 652 652 679 676 676 704 677 677 705 652 652 679 677 677 705 653 653 680 653 653 680 677 677 705 678 678 706 653 653 680 678 678 706 654 654 681 654 654 681 678 678 706 679 679 707 654 654 681 679 679 707 655 655 682 655 655 682 679 679 707 680 680 708 655 655 682 680 680 708 656 656 683 656 656 683 680 680 708 681 681 709 656 656 683 681 681 709 657 657 684 657 657 684 681 681 709 682 682 710 657 657 684 682 682 710 658 658 685 658 658 685 682 682 710 683 683 711 658 658 685 683 683 711 659 659 686 659 659 686 683 683 711 684 684 712 659 659 686 684 684 712 660 660 687 660 660 687 684 684 712 685 685 713 660 660 687 685 685 713 661 661 688 661 661 688 685 685 713 686 686 714 661 661 688 686 686 714 662 662 689 662 662 689 686 686 714 687 687 715 662 662 689 687 687 715 663 663 690 663 663 690 687 687 715 688 688 716 663 663 690 688 688 716 664 664 691 664 664 691 688 688 716 689 689 717 664 664 691 689 689 717 665 665 692 665 665 692 689 689 717 690 690 718 665 665 692 690 690 718 666 666 693 666 666 693 690 690 718 691 691 719 666 666 693 691 691 719 667 667 694 667 667 694 691 691 719 692 692 720 667 667 694 692 692 720 668 668 695 668 668 695 692 692 720 693 693 721 668 668 695 693 693 721 669 669 696 669 669 696 693 693 721 694 694 722 669 669 696 694 694 722 670 670 697 670 670 697 694 694 722 695 695 723 670 670 697 695 695 723 671 671 698 671 671 698 695 695 723 672 672 724 671 671 698 672 672 724 648 648 699 672 672 700 696 696 725 697 697 726 672 672 700 697 697 726 673 673 701 673 673 701 697 697 726 698 698 727 673 673 701 698 698 727 674 674 702 674 674 702 698 698 727 699 699 728 674 674 702 699 699 728 675 675 703 675 675 703 699 699 728 700 700 729 675 675 703 700 700 729 676 676 704 676 676 704 700 700 729 701 701 730 676 676 704 701 701 730 677 677 705 677 677 705 701 701 730 702 702 731 677 677 705 702 702 731 678 678 706 678 678 706 702 702 731 703 703 732 678 678 706 703 703 732 679 679 707 679 679 707 703 703 732 704 704 733 679 679 707 704 704 733 680 680 708 680 680 708 704 704 733 705 705 734 680 680 708 705 705 734 681 681 709 681 681 709 705 705 734 706 706 735 681 681 709 706 706 735 682 682 710 682 682 710 706 706 735 707 707 736 682 682 710 707 707 736 683 683 711 683 683 711 707 707 736 708 708 737 683 683 711 708 708 737 684 684 712 684 684 712 708 708 737 709 709 738 684 684 712 709 709 738 685 685 713 685 685 713 709 709 738 710 710 739 685 685 713 710 710 739 686 686 714 686 686 714 710 710 739 711 711 740 686 686 714 711 711 740 687 687 715 687 687 715 711 711 740 712 712 741 687 687 715 712 712 741 688 688 716 688 688 716 712 712 741 713 713 742 688 688 716 713 713 742 689 689 717 689 689 717 713 713 742 714 714 743 689 689 717 714 714 743 690 690 718 690 690 718 714 714 743 715 715 744 690 690 718 715 715 744 691 691 719 691 691 719 715 715 744 716 716 745 691 691 719 716 716 745 692 692 720 692 692 720 716 716 745 717 717 746 692 692 720 717 717 746 693 693 721 693 693 721 717 717 746 718 718 747 693 693 721 718 718 747 694 694 722 694 694 722 718 718 747 719 719 748 694 694 722 719 719 748 695 695 723 695 695 723 719 719 748 696 696 749 695 695 723 696 696 749 672 672 724 696 696 725 720 720 750 721 721 751 696 696 725 721 721 751 697 697 726 697 697 726 721 721 751 722 722 752 697 697 726 722 722 752 698 698 727 698 698 727 722 722 752 723 723 753 698 698 727 723 723 753 699 699 728 699 699 728 723 723 753 724 724 754 699 699 728 724 724 754 700 700 729 700 700 729 724 724 754 725 725 755 700 700 729 725 725 755 701 701 730 701 701 730 725 725 755 726 726 756 701 701 730 726 726 756 702 702 731 702 702 731 726 726 756 727 727 757 702 702 731 727 727 757 703 703 732 703 703 732 727 727 757 728 728 758 703 703 732 728 728 758 704 704 733 704 704 733 728 728 758 729 729 759 704 704 733 729 729 759 705 705 734 705 705 734 729 729 759 730 730 760 705 705 734 730 730 760 706 706 735 706 706 735 730 730 760 731 731 761 706 706 735 731 731 761 707 707 736 707 707 736 731 731 761 732 732 762 707 707 736 732 732 762 708 708 737 708 708 737 732 732 762 733 733 763 708 708 737 733 733 763 709 709 738 709 709 738 733 733 763 734 734 764 709 709 738 734 734 764 710 710 739 710 710 739 734 734 764 735 735 765 710 710 739 735 735 765 711 711 740 711 711 740 735 735 765 736 736 766 711 711 740 736 736 766 712 712 741 712 712 741 736 736 766 737 737 767 712 712 741 737 737 767 713 713 742 713 713 742 737 737 767 738 738 768 713 713 742 738 738 768 714 714 743 714 714 743 738 738 768 739 739 769 714 714 743 739 739 769 715 715 744 715 715 744 739 739 769 740 740 770 715 715 744 740 740 770 716 716 745 716 716 745 740 740 770 741 741 771 716 716 745 741 741 771 717 717 746 717 717 746 741 741 771 742 742 772 717 717 746 742 742 772 718 718 747 718 718 747 742 742 772 743 743 773 718 718 747 743 743 773 719 719 748 719 719 748 743 743 773 720 720 774 719 719 748 720 720 774 696 696 749 720 720 750 744 744 775 745 745 776 720 720 750 745 745 776 721 721 751 721 721 751 745 745 776 746 746 777 721 721 751 746 746 777 722 722 752 722 722 752 746 746 777 747 747 778 722 722 752 747 747 778 723 723 753 723 723 753 747 747 778 748 748 779 723 723 753 748 748 779 724 724 754 724 724 754 748 748 779 749 749 780 724 724 754 749 749 780 725 725 755 725 725 755 749 749 780 750 750 781 725 725 755 750 750 781 726 726 756 726 726 756 750 750 781 751 751 782 726 726 756 751 751 782 727 727 757 727 727 757 751 751 782 752 752 783 727 727 757 752 752 783 728 728 758 728 728 758 752 752 783 753 753 784 728 728 758 753 753 784 729 729 759 729 729 759 753 753 784 754 754 785 729 729 759 754 754 785 730 730 760 730 730 760 754 754 785 755 755 786 730 730 760 755 755 786 731 731 761 731 731 761 755 755 786 756 756 787 731 731 761 756 756 787 732 732 762 732 732 762 756 756 787 757 757 788 732 732 762 757 757 788 733 733 763 733 733 763 757 757 788 758 758 789 733 733 763 758 758 789 734 734 764 734 734 764 758 758 789 759 759 790 734 734 764 759 759 790 735 735 765 735 735 765 759 759 790 760 760 791 735 735 765 760 760 791 736 736 766 736 736 766 760 760 791 761 761 792 736 736 766 761 761 792 737 737 767 737 737 767 761 761 792 762 762 793 737 737 767 762 762 793 738 738 768 738 738 768 762 762 793 763 763 794 738 738 768 763 763 794 739 739 769 739 739 769 763 763 794 764 764 795 739 739 769 764 764 795 740 740 770 740 740 770 764 764 795 765 765 796 740 740 770 765 765 796 741 741 771 741 741 771 765 765 796 766 766 797 741 741 771 766 766 797 742 742 772 742 742 772 766 766 797 767 767 798 742 742 772 767 767 798 743 743 773 743 743 773 767 767 798 744 744 799 743 743 773 744 744 799 720 720 774 744 744 775 768 768 800 769 769 801 744 744 775 769 769 801 745 745 776 745 745 776 769 769 801 770 770 802 745 745 776 770 770 802 746 746 777 746 746 777 770 770 802 771 771 803 746 746 777 771 771 803 747 747 778 747 747 778 771 771 803 772 772 804 747 747 778 772 772 804 748 748 779 748 748 779 772 772 804 773 773 805 748 748 779 773 773 805 749 749 780 749 749 780 773 773 805 774 774 806 749 749 780 774 774 806 750 750 781 750 750 781 774 774 806 775 775 807 750 750 781 775 775 807 751 751 782 751 751 782 775 775 807 776 776 808 751 751 782 776 776 808 752 752 783 752 752 783 776 776 808 777 777 809 752 752 783 777 777 809 753 753 784 753 753 784 777 777 809 778 778 810 753 753 784 778 778 810 754 754 785 754 754 785 778 778 810 779 779 811 754 754 785 779 779 811 755 755 786 755 755 786 779 779 811 780 780 812 755 755 786 780 780 812 756 756 787 756 756 787 780 780 812 781 781 813 756 756 787 781 781 813 757 757 788 757 757 788 781 781 813 782 782 814 757 757 788 782 782 814 758 758 789 758 758 789 782 782 814 783 783 815 758 758 789 783 783 815 759 759 790 759 759 790 783 783 815 784 784 816 759 759 790 784 784 816 760 760 791 760 760 791 784 784 816 785 785 817 760 760 791 785 785 817 761 761 792 761 761 792 785 785 817 786 786 818 761 761 792 786 786 818 762 762 793 762 762 793 786 786 818 787 787 819 762 762 793 787 787 819 763 763 794 763 763 794 787 787 819 788 788 820 763 763 794 788 788 820 764 764 795 764 764 795 788 788 820 789 789 821 764 764 795 789 789 821 765 765 796 765 765 796 789 789 821 790 790 822 765 765 796 790 790 822 766 766 797 766 766 797 790 790 822 791 791 823 766 766 797 791 791 823 767 767 798 767 767 798 791 791 823 768 768 824 767 767 798 768 768 824 744 744 799 768 768 800 792 792 825 793 793 826 768 768 800 793 793 826 769 769 801 769 769 801 793 793 826 794 794 827 769 769 801 794 794 827 770 770 802 770 770 802 794 794 827 795 795 828 770 770 802 795 795 828 771 771 803 771 771 803 795 795 828 796 796 829 771 771 803 796 796 829 772 772 804 772 772 804 796 796 829 797 797 830 772 772 804 797 797 830 773 773 805 773 773 805 797 797 830 798 798 831 773 773 805 798 798 831 774 774 806 774 774 806 798 798 831 799 799 832 774 774 806 799 799 832 775 775 807 775 775 807 799 799 832 800 800 833 775 775 807 800 800 833 776 776 808 776 776 808 800 800 833 801 801 834 776 776 808 801 801 834 777 777 809 777 777 809 801 801 834 802 802 835 777 777 809 802 802 835 778 778 810 778 778 810 802 802 835 803 803 836 778 778 810 803 803 836 779 779 811 779 779 811 803 803 836 804 804 837 779 779 811 804 804 837 780 780 812 780 780 812 804 804 837 805 805 838 780 780 812 805 805 838 781 781 813 781 781 813 805 805 838 806 806 839 781 781 813 806 806 839 782 782 814 782 782 814 806 806 839 807 807 840 782 782 814 807 807 840 783 783 815 783 783 815 807 807 840 808 808 841 783 783 815 808 808 841 784 784 816 784 784 816 808 808 841 809 809 842 784 784 816 809 809 842 785 785 817 785 785 817 809 809 842 810 810 843 785 785 817 810 810 843 786 786 818 786 786 818 810 810 843 811 811 844 786 786 818 811 811 844 787 787 819 787 787 819 811 811 844 812 812 845 787 787 819 812 812 845 788 788 820 788 788 820 812 812 845 813 813 846 788 788 820 813 813 846 789 789 821 789 789 821 813 813 846 814 814 847 789 789 821 814 814 847 790 790 822 790 790 822 814 814 847 815 815 848 790 790 822 815 815 848 791 791 823 791 791 823 815 815 848 792 792 849 791 791 823 792 792 849 768 768 824 792 792 825 816 816 850 817 817 851 792 792 825 817 817 851 793 793 826 793 793 826 817 817 851 818 818 852 793 793 826 818 818 852 794 794 827 794 794 827 818 818 852 819 819 853 794 794 827 819 819 853 795 795 828 795 795 828 819 819 853 820 820 854 795 795 828 820 820 854 796 796 829 796 796 829 820 820 854 821 821 855 796 796 829 821 821 855 797 797 830 797 797 830 821 821 855 822 822 856 797 797 830 822 822 856 798 798 831 798 798 831 822 822 856 823 823 857 798 798 831 823 823 857 799 799 832 799 799 832 823 823 857 824 824 858 799 799 832 824 824 858 800 800 833 800 800 833 824 824 858 825 825 859 800 800 833 825 825 859 801 801 834 801 801 834 825 825 859 826 826 860 801 801 834 826 826 860 802 802 835 802 802 835 826 826 860 827 827 861 802 802 835 827 827 861 803 803 836 803 803 836 827 827 861 828 828 862 803 803 836 828 828 862 804 804 837 804 804 837 828 828 862 829 829 863 804 804 837 829 829 863 805 805 838 805 805 838 829 829 863 830 830 864 805 805 838 830 830 864 806 806 839 806 806 839 830 830 864 831 831 865 806 806 839 831 831 865 807 807 840 807 807 840 831 831 865 832 832 866 807 807 840 832 832 866 808 808 841 808 808 841 832 832 866 833 833 867 808 808 841 833 833 867 809 809 842 809 809 842 833 833 867 834 834 868 809 809 842 834 834 868 810 810 843 810 810 843 834 834 868 835 835 869 810 810 843 835 835 869 811 811 844 811 811 844 835 835 869 836 836 870 811 811 844 836 836 870 812 812 845 812 812 845 836 836 870 837 837 871 812 812 845 837 837 871 813 813 846 813 813 846 837 837 871 838 838 872 813 813 846 838 838 872 814 814 847 814 814 847 838 838 872 839 839 873 814 814 847 839 839 873 815 815 848 815 815 848 839 839 873 816 816 874 815 815 848 816 816 874 792 792 849 816 816 850 840 840 875 841 841 876 816 816 850 841 841 876 817 817 851 817 817 851 841 841 876 842 842 877 817 817 851 842 842 877 818 818 852 818 818 852 842 842 877 843 843 878 818 818 852 843 843 878 819 819 853 819 819 853 843 843 878 844 844 879 819 819 853 844 844 879 820 820 854 820 820 854 844 844 879 845 845 880 820 820 854 845 845 880 821 821 855 821 821 855 845 845 880 846 846 881 821 821 855 846 846 881 822 822 856 822 822 856 846 846 881 847 847 882 822 822 856 847 847 882 823 823 857 823 823 857 847 847 882 848 848 883 823 823 857 848 848 883 824 824 858 824 824 858 848 848 883 849 849 884 824 824 858 849 849 884 825 825 859 825 825 859 849 849 884 850 850 885 825 825 859 850 850 885 826 826 860 826 826 860 850 850 885 851 851 886 826 826 860 851 851 886 827 827 861 827 827 861 851 851 886 852 852 887 827 827 861 852 852 887 828 828 862 828 828 862 852 852 887 853 853 888 828 828 862 853 853 888 829 829 863 829 829 863 853 853 888 854 854 889 829 829 863 854 854 889 830 830 864 830 830 864 854 854 889 855 855 890 830 830 864 855 855 890 831 831 865 831 831 865 855 855 890 856 856 891 831 831 865 856 856 891 832 832 866 832 832 866 856 856 891 857 857 892 832 832 866 857 857 892 833 833 867 833 833 867 857 857 892 858 858 893 833 833 867 858 858 893 834 834 868 834 834 868 858 858 893 859 859 894 834 834 868 859 859 894 835 835 869 835 835 869 859 859 894 860 860 895 835 835 869 860 860 895 836 836 870 836 836 870 860 860 895 861 861 896 836 836 870 861 861 896 837 837 871 837 837 871 861 861 896 862 862 897 837 837 871 862 862 897 838 838 872 838 838 872 862 862 897 863 863 898 838 838 872 863 863 898 839 839 873 839 839 873 863 863 898 840 840 899 839 839 873 840 840 899 816 816 874 840 840 875 864 864 900 865 865 901 840 840 875 865 865 901 841 841 876 841 841 876 865 865 901 866 866 902 841 841 876 866 866 902 842 842 877 842 842 877 866 866 902 867 867 903 842 842 877 867 867 903 843 843 878 843 843 878 867 867 903 868 868 904 843 843 878 868 868 904 844 844 879 844 844 879 868 868 904 869 869 905 844 844 879 869 869 905 845 845 880 845 845 880 869 869 905 870 870 906 845 845 880 870 870 906 846 846 881 846 846 881 870 870 906 871 871 907 846 846 881 871 871 907 847 847 882 847 847 882 871 871 907 872 872 908 847 847 882 872 872 908 848 848 883 848 848 883 872 872 908 873 873 909 848 848 883 873 873 909 849 849 884 849 849 884 873 873 909 874 874 910 849 849 884 874 874 910 850 850 885 850 850 885 874 874 910 875 875 911 850 850 885 875 875 911 851 851 886 851 851 886 875 875 911 876 876 912 851 851 886 876 876 912 852 852 887 852 852 887 876 876 912 877 877 913 852 852 887 877 877 913 853 853 888 853 853 888 877 877 913 878 878 914 853 853 888 878 878 914 854 854 889 854 854 889 878 878 914 879 879 915 854 854 889 879 879 915 855 855 890 855 855 890 879 879 915 880 880 916 855 855 890 880 880 916 856 856 891 856 856 891 880 880 916 881 881 917 856 856 891 881 881 917 857 857 892 857 857 892 881 881 917 882 882 918 857 857 892 882 882 918 858 858 893 858 858 893 882 882 918 883 883 919 858 858 893 883 883 919 859 859 894 859 859 894 883 883 919 884 884 920 859 859 894 884 884 920 860 860 895 860 860 895 884 884 920 885 885 921 860 860 895 885 885 921 861 861 896 861 861 896 885 885 921 886 886 922 861 861 896 886 886 922 862 862 897 862 862 897 886 886 922 887 887 923 862 862 897 887 887 923 863 863 898 863 863 898 887 887 923 864 864 924 863 863 898 864 864 924 840 840 899 864 864 900 888 888 925 889 889 926 864 864 900 889 889 926 865 865 901 865 865 901 889 889 926 890 890 927 865 865 901 890 890 927 866 866 902 866 866 902 890 890 927 891 891 928 866 866 902 891 891 928 867 867 903 867 867 903 891 891 928 892 892 929 867 867 903 892 892 929 868 868 904 868 868 904 892 892 929 893 893 930 868 868 904 893 893 930 869 869 905 869 869 905 893 893 930 894 894 931 869 869 905 894 894 931 870 870 906 870 870 906 894 894 931 895 895 932 870 870 906 895 895 932 871 871 907 871 871 907 895 895 932 896 896 933 871 871 907 896 896 933 872 872 908 872 872 908 896 896 933 897 897 934 872 872 908 897 897 934 873 873 909 873 873 909 897 897 934 898 898 935 873 873 909 898 898 935 874 874 910 874 874 910 898 898 935 899 899 936 874 874 910 899 899 936 875 875 911 875 875 911 899 899 936 900 900 937 875 875 911 900 900 937 876 876 912 876 876 912 900 900 937 901 901 938 876 876 912 901 901 938 877 877 913 877 877 913 901 901 938 902 902 939 877 877 913 902 902 939 878 878 914 878 878 914 902 902 939 903 903 940 878 878 914 903 903 940 879 879 915 879 879 915 903 903 940 904 904 941 879 879 915 904 904 941 880 880 916 880 880 916 904 904 941 905 905 942 880 880 916 905 905 942 881 881 917 881 881 917 905 905 942 906 906 943 881 881 917 906 906 943 882 882 918 882 882 918 906 906 943 907 907 944 882 882 918 907 907 944 883 883 919 883 883 919 907 907 944 908 908 945 883 883 919 908 908 945 884 884 920 884 884 920 908 908 945 909 909 946 884 884 920 909 909 946 885 885 921 885 885 921 909 909 946 910 910 947 885 885 921 910 910 947 886 886 922 886 886 922 910 910 947 911 911 948 886 886 922 911 911 948 887 887 923 887 887 923 911 911 948 888 888 949 887 887 923 888 888 949 864 864 924 888 888 925 912 912 950 913 913 951 888 888 925 913 913 951 889 889 926 889 889 926 913 913 951 914 914 952 889 889 926 914 914 952 890 890 927 890 890 927 914 914 952 915 915 953 890 890 927 915 915 953 891 891 928 891 891 928 915 915 953 916 916 954 891 891 928 916 916 954 892 892 929 892 892 929 916 916 954 917 917 955 892 892 929 917 917 955 893 893 930 893 893 930 917 917 955 918 918 956 893 893 930 918 918 956 894 894 931 894 894 931 918 918 956 919 919 957 894 894 931 919 919 957 895 895 932 895 895 932 919 919 957 920 920 958 895 895 932 920 920 958 896 896 933 896 896 933 920 920 958 921 921 959 896 896 933 921 921 959 897 897 934 897 897 934 921 921 959 922 922 960 897 897 934 922 922 960 898 898 935 898 898 935 922 922 960 923 923 961 898 898 935 923 923 961 899 899 936 899 899 936 923 923 961 924 924 962 899 899 936 924 924 962 900 900 937 900 900 937 924 924 962 925 925 963 900 900 937 925 925 963 901 901 938 901 901 938 925 925 963 926 926 964 901 901 938 926 926 964 902 902 939 902 902 939 926 926 964 927 927 965 902 902 939 927 927 965 903 903 940 903 903 940 927 927 965 928 928 966 903 903 940 928 928 966 904 904 941 904 904 941 928 928 966 929 929 967 904 904 941 929 929 967 905 905 942 905 905 942 929 929 967 930 930 968 905 905 942 930 930 968 906 906 943 906 906 943 930 930 968 931 931 969 906 906 943 931 931 969 907 907 944 907 907 944 931 931 969 932 932 970 907 907 944 932 932 970 908 908 945 908 908 945 932 932 970 933 933 971 908 908 945 933 933 971 909 909 946 909 909 946 933 933 971 934 934 972 909 909 946 934 934 972 910 910 947 910 910 947 934 934 972 935 935 973 910 910 947 935 935 973 911 911 948 911 911 948 935 935 973 912 912 974 911 911 948 912 912 974 888 888 949 912 912 950 936 936 975 937 937 976 912 912 950 937 937 976 913 913 951 913 913 951 937 937 976 938 938 977 913 913 951 938 938 977 914 914 952 914 914 952 938 938 977 939 939 978 914 914 952 939 939 978 915 915 953 915 915 953 939 939 978 940 940 979 915 915 953 940 940 979 916 916 954 916 916 954 940 940 979 941 941 980 916 916 954 941 941 980 917 917 955 917 917 955 941 941 980 942 942 981 917 917 955 942 942 981 918 918 956 918 918 956 942 942 981 943 943 982 918 918 956 943 943 982 919 919 957 919 919 957 943 943 982 944 944 983 919 919 957 944 944 983 920 920 958 920 920 958 944 944 983 945 945 984 920 920 958 945 945 984 921 921 959 921 921 959 945 945 984 946 946 985 921 921 959 946 946 985 922 922 960 922 922 960 946 946 985 947 947 986 922 922 960 947 947 986 923 923 961 923 923 961 947 947 986 948 948 987 923 923 961 948 948 987 924 924 962 924 924 962 948 948 987 949 949 988 924 924 962 949 949 988 925 925 963 925 925 963 949 949 988 950 950 989 925 925 963 950 950 989 926 926 964 926 926 964 950 950 989 951 951 990 926 926 964 951 951 990 927 927 965 927 927 965 951 951 990 952 952 991 927 927 965 952 952 991 928 928 966 928 928 966 952 952 991 953 953 992 928 928 966 953 953 992 929 929 967 929 929 967 953 953 992 954 954 993 929 929 967 954 954 993 930 930 968 930 930 968 954 954 993 955 955 994 930 930 968 955 955 994 931 931 969 931 931 969 955 955 994 956 956 995 931 931 969 956 956 995 932 932 970 932 932 970 956 956 995 957 957 996 932 932 970 957 957 996 933 933 971 933 933 971 957 957 996 958 958 997 933 933 971 958 958 997 934 934 972 934 934 972 958 958 997 959 959 998 934 934 972 959 959 998 935 935 973 935 935 973 959 959 998 936 936 999 935 935 973 936 936 999 912 912 974 936 936 975 960 960 1000 961 961 1001 936 936 975 961 961 1001 937 937 976 937 937 976 961 961 1001 962 962 1002 937 937 976 962 962 1002 938 938 977 938 938 977 962 962 1002 963 963 1003 938 938 977 963 963 1003 939 939 978 939 939 978 963 963 1003 964 964 1004 939 939 978 964 964 1004 940 940 979 940 940 979 964 964 1004 965 965 1005 940 940 979 965 965 1005 941 941 980 941 941 980 965 965 1005 966 966 1006 941 941 980 966 966 1006 942 942 981 942 942 981 966 966 1006 967 967 1007 942 942 981 967 967 1007 943 943 982 943 943 982 967 967 1007 968 968 1008 943 943 982 968 968 1008 944 944 983 944 944 983 968 968 1008 969 969 1009 944 944 983 969 969 1009 945 945 984 945 945 984 969 969 1009 970 970 1010 945 945 984 970 970 1010 946 946 985 946 946 985 970 970 1010 971 971 1011 946 946 985 971 971 1011 947 947 986 947 947 986 971 971 1011 972 972 1012 947 947 986 972 972 1012 948 948 987 948 948 987 972 972 1012 973 973 1013 948 948 987 973 973 1013 949 949 988 949 949 988 973 973 1013 974 974 1014 949 949 988 974 974 1014 950 950 989 950 950 989 974 974 1014 975 975 1015 950 950 989 975 975 1015 951 951 990 951 951 990 975 975 1015 976 976 1016 951 951 990 976 976 1016 952 952 991 952 952 991 976 976 1016 977 977 1017 952 952 991 977 977 1017 953 953 992 953 953 992 977 977 1017 978 978 1018 953 953 992 978 978 1018 954 954 993 954 954 993 978 978 1018 979 979 1019 954 954 993 979 979 1019 955 955 994 955 955 994 979 979 1019 980 980 1020 955 955 994 980 980 1020 956 956 995 956 956 995 980 980 1020 981 981 1021 956 956 995 981 981 1021 957 957 996 957 957 996 981 981 1021 982 982 1022 957 957 996 982 982 1022 958 958 997 958 958 997 982 982 1022 983 983 1023 958 958 997 983 983 1023 959 959 998 959 959 998 983 983 1023 960 960 1024 959 959 998 960 960 1024 936 936 999 960 960 1000 984 984 1025 985 985 1026 960 960 1000 985 985 1026 961 961 1001 961 961 1001 985 985 1026 986 986 1027 961 961 1001 986 986 1027 962 962 1002 962 962 1002 986 986 1027 987 987 1028 962 962 1002 987 987 1028 963 963 1003 963 963 1003 987 987 1028 988 988 1029 963 963 1003 988 988 1029 964 964 1004 964 964 1004 988 988 1029 989 989 1030 964 964 1004 989 989 1030 965 965 1005 965 965 1005 989 989 1030 990 990 1031 965 965 1005 990 990 1031 966 966 1006 966 966 1006 990 990 1031 991 991 1032 966 966 1006 991 991 1032 967 967 1007 967 967 1007 991 991 1032 992 992 1033 967 967 1007 992 992 1033 968 968 1008 968 968 1008 992 992 1033 993 993 1034 968 968 1008 993 993 1034 969 969 1009 969 969 1009 993 993 1034 994 994 1035 969 969 1009 994 994 1035 970 970 1010 970 970 1010 994 994 1035 995 995 1036 970 970 1010 995 995 1036 971 971 1011 971 971 1011 995 995 1036 996 996 1037 971 971 1011 996 996 1037 972 972 1012 972 972 1012 996 996 1037 997 997 1038 972 972 1012 997 997 1038 973 973 1013 973 973 1013 997 997 1038 998 998 1039 973 973 1013 998 998 1039 974 974 1014 974 974 1014 998 998 1039 999 999 1040 974 974 1014 999 999 1040 975 975 1015 975 975 1015 999 999 1040 1000 1000 1041 975 975 1015 1000 1000 1041 976 976 1016 976 976 1016 1000 1000 1041 1001 1001 1042 976 976 1016 1001 1001 1042 977 977 1017 977 977 1017 1001 1001 1042 1002 1002 1043 977 977 1017 1002 1002 1043 978 978 1018 978 978 1018 1002 1002 1043 1003 1003 1044 978 978 1018 1003 1003 1044 979 979 1019 979 979 1019 1003 1003 1044 1004 1004 1045 979 979 1019 1004 1004 1045 980 980 1020 980 980 1020 1004 1004 1045 1005 1005 1046 980 980 1020 1005 1005 1046 981 981 1021 981 981 1021 1005 1005 1046 1006 1006 1047 981 981 1021 1006 1006 1047 982 982 1022 982 982 1022 1006 1006 1047 1007 1007 1048 982 982 1022 1007 1007 1048 983 983 1023 983 983 1023 1007 1007 1048 984 984 1049 983 983 1023 984 984 1049 960 960 1024 984 984 1025 1008 1008 1050 1009 1009 1051 984 984 1025 1009 1009 1051 985 985 1026 985 985 1026 1009 1009 1051 1010 1010 1052 985 985 1026 1010 1010 1052 986 986 1027 986 986 1027 1010 1010 1052 1011 1011 1053 986 986 1027 1011 1011 1053 987 987 1028 987 987 1028 1011 1011 1053 1012 1012 1054 987 987 1028 1012 1012 1054 988 988 1029 988 988 1029 1012 1012 1054 1013 1013 1055 988 988 1029 1013 1013 1055 989 989 1030 989 989 1030 1013 1013 1055 1014 1014 1056 989 989 1030 1014 1014 1056 990 990 1031 990 990 1031 1014 1014 1056 1015 1015 1057 990 990 1031 1015 1015 1057 991 991 1032 991 991 1032 1015 1015 1057 1016 1016 1058 991 991 1032 1016 1016 1058 992 992 1033 992 992 1033 1016 1016 1058 1017 1017 1059 992 992 1033 1017 1017 1059 993 993 1034 993 993 1034 1017 1017 1059 1018 1018 1060 993 993 1034 1018 1018 1060 994 994 1035 994 994 1035 1018 1018 1060 1019 1019 1061 994 994 1035 1019 1019 1061 995 995 1036 995 995 1036 1019 1019 1061 1020 1020 1062 995 995 1036 1020 1020 1062 996 996 1037 996 996 1037 1020 1020 1062 1021 1021 1063 996 996 1037 1021 1021 1063 997 997 1038 997 997 1038 1021 1021 1063 1022 1022 1064 997 997 1038 1022 1022 1064 998 998 1039 998 998 1039 1022 1022 1064 1023 1023 1065 998 998 1039 1023 1023 1065 999 999 1040 999 999 1040 1023 1023 1065 1024 1024 1066 999 999 1040 1024 1024 1066 1000 1000 1041 1000 1000 1041 1024 1024 1066 1025 1025 1067 1000 1000 1041 1025 1025 1067 1001 1001 1042 1001 1001 1042 1025 1025 1067 1026 1026 1068 1001 1001 1042 1026 1026 1068 1002 1002 1043 1002 1002 1043 1026 1026 1068 1027 1027 1069 1002 1002 1043 1027 1027 1069 1003 1003 1044 1003 1003 1044 1027 1027 1069 1028 1028 1070 1003 1003 1044 1028 1028 1070 1004 1004 1045 1004 1004 1045 1028 1028 1070 1029 1029 1071 1004 1004 1045 1029 1029 1071 1005 1005 1046 1005 1005 1046 1029 1029 1071 1030 1030 1072 1005 1005 1046 1030 1030 1072 1006 1006 1047 1006 1006 1047 1030 1030 1072 1031 1031 1073 1006 1006 1047 1031 1031 1073 1007 1007 1048 1007 1007 1048 1031 1031 1073 1008 1008 1074 1007 1007 1048 1008 1008 1074 984 984 1049 1008 1008 1050 1032 1032 1075 1033 1033 1076 1008 1008 1050 1033 1033 1076 1009 1009 1051 1009 1009 1051 1033 1033 1076 1034 1034 1077 1009 1009 1051 1034 1034 1077 1010 1010 1052 1010 1010 1052 1034 1034 1077 1035 1035 1078 1010 1010 1052 1035 1035 1078 1011 1011 1053 1011 1011 1053 1035 1035 1078 1036 1036 1079 1011 1011 1053 1036 1036 1079 1012 1012 1054 1012 1012 1054 1036 1036 1079 1037 1037 1080 1012 1012 1054 1037 1037 1080 1013 1013 1055 1013 1013 1055 1037 1037 1080 1038 1038 1081 1013 1013 1055 1038 1038 1081 1014 1014 1056 1014 1014 1056 1038 1038 1081 1039 1039 1082 1014 1014 1056 1039 1039 1082 1015 1015 1057 1015 1015 1057 1039 1039 1082 1040 1040 1083 1015 1015 1057 1040 1040 1083 1016 1016 1058 1016 1016 1058 1040 1040 1083 1041 1041 1084 1016 1016 1058 1041 1041 1084 1017 1017 1059 1017 1017 1059 1041 1041 1084 1042 1042 1085 1017 1017 1059 1042 1042 1085 1018 1018 1060 1018 1018 1060 1042 1042 1085 1043 1043 1086 1018 1018 1060 1043 1043 1086 1019 1019 1061 1019 1019 1061 1043 1043 1086 1044 1044 1087 1019 1019 1061 1044 1044 1087 1020 1020 1062 1020 1020 1062 1044 1044 1087 1045 1045 1088 1020 1020 1062 1045 1045 1088 1021 1021 1063 1021 1021 1063 1045 1045 1088 1046 1046 1089 1021 1021 1063 1046 1046 1089 1022 1022 1064 1022 1022 1064 1046 1046 1089 1047 1047 1090 1022 1022 1064 1047 1047 1090 1023 1023 1065 1023 1023 1065 1047 1047 1090 1048 1048 1091 1023 1023 1065 1048 1048 1091 1024 1024 1066 1024 1024 1066 1048 1048 1091 1049 1049 1092 1024 1024 1066 1049 1049 1092 1025 1025 1067 1025 1025 1067 1049 1049 1092 1050 1050 1093 1025 1025 1067 1050 1050 1093 1026 1026 1068 1026 1026 1068 1050 1050 1093 1051 1051 1094 1026 1026 1068 1051 1051 1094 1027 1027 1069 1027 1027 1069 1051 1051 1094 1052 1052 1095 1027 1027 1069 1052 1052 1095 1028 1028 1070 1028 1028 1070 1052 1052 1095 1053 1053 1096 1028 1028 1070 1053 1053 1096 1029 1029 1071 1029 1029 1071 1053 1053 1096 1054 1054 1097 1029 1029 1071 1054 1054 1097 1030 1030 1072 1030 1030 1072 1054 1054 1097 1055 1055 1098 1030 1030 1072 1055 1055 1098 1031 1031 1073 1031 1031 1073 1055 1055 1098 1032 1032 1099 1031 1031 1073 1032 1032 1099 1008 1008 1074 1032 1032 1075 1056 1056 1100 1057 1057 1101 1032 1032 1075 1057 1057 1101 1033 1033 1076 1033 1033 1076 1057 1057 1101 1058 1058 1102 1033 1033 1076 1058 1058 1102 1034 1034 1077 1034 1034 1077 1058 1058 1102 1059 1059 1103 1034 1034 1077 1059 1059 1103 1035 1035 1078 1035 1035 1078 1059 1059 1103 1060 1060 1104 1035 1035 1078 1060 1060 1104 1036 1036 1079 1036 1036 1079 1060 1060 1104 1061 1061 1105 1036 1036 1079 1061 1061 1105 1037 1037 1080 1037 1037 1080 1061 1061 1105 1062 1062 1106 1037 1037 1080 1062 1062 1106 1038 1038 1081 1038 1038 1081 1062 1062 1106 1063 1063 1107 1038 1038 1081 1063 1063 1107 1039 1039 1082 1039 1039 1082 1063 1063 1107 1064 1064 1108 1039 1039 1082 1064 1064 1108 1040 1040 1083 1040 1040 1083 1064 1064 1108 1065 1065 1109 1040 1040 1083 1065 1065 1109 1041 1041 1084 1041 1041 1084 1065 1065 1109 1066 1066 1110 1041 1041 1084 1066 1066 1110 1042 1042 1085 1042 1042 1085 1066 1066 1110 1067 1067 1111 1042 1042 1085 1067 1067 1111 1043 1043 1086 1043 1043 1086 1067 1067 1111 1068 1068 1112 1043 1043 1086 1068 1068 1112 1044 1044 1087 1044 1044 1087 1068 1068 1112 1069 1069 1113 1044 1044 1087 1069 1069 1113 1045 1045 1088 1045 1045 1088 1069 1069 1113 1070 1070 1114 1045 1045 1088 1070 1070 1114 1046 1046 1089 1046 1046 1089 1070 1070 1114 1071 1071 1115 1046 1046 1089 1071 1071 1115 1047 1047 1090 1047 1047 1090 1071 1071 1115 1072 1072 1116 1047 1047 1090 1072 1072 1116 1048 1048 1091 1048 1048 1091 1072 1072 1116 1073 1073 1117 1048 1048 1091 1073 1073 1117 1049 1049 1092 1049 1049 1092 1073 1073 1117 1074 1074 1118 1049 1049 1092 1074 1074 1118 1050 1050 1093 1050 1050 1093 1074 1074 1118 1075 1075 1119 1050 1050 1093 1075 1075 1119 1051 1051 1094 1051 1051 1094 1075 1075 1119 1076 1076 1120 1051 1051 1094 1076 1076 1120 1052 1052 1095 1052 1052 1095 1076 1076 1120 1077 1077 1121 1052 1052 1095 1077 1077 1121 1053 1053 1096 1053 1053 1096 1077 1077 1121 1078 1078 1122 1053 1053 1096 1078 1078 1122 1054 1054 1097 1054 1054 1097 1078 1078 1122 1079 1079 1123 1054 1054 1097 1079 1079 1123 1055 1055 1098 1055 1055 1098 1079 1079 1123 1056 1056 1124 1055 1055 1098 1056 1056 1124 1032 1032 1099 1056 1056 1100 1080 1080 1125 1081 1081 1126 1056 1056 1100 1081 1081 1126 1057 1057 1101 1057 1057 1101 1081 1081 1126 1082 1082 1127 1057 1057 1101 1082 1082 1127 1058 1058 1102 1058 1058 1102 1082 1082 1127 1083 1083 1128 1058 1058 1102 1083 1083 1128 1059 1059 1103 1059 1059 1103 1083 1083 1128 1084 1084 1129 1059 1059 1103 1084 1084 1129 1060 1060 1104 1060 1060 1104 1084 1084 1129 1085 1085 1130 1060 1060 1104 1085 1085 1130 1061 1061 1105 1061 1061 1105 1085 1085 1130 1086 1086 1131 1061 1061 1105 1086 1086 1131 1062 1062 1106 1062 1062 1106 1086 1086 1131 1087 1087 1132 1062 1062 1106 1087 1087 1132 1063 1063 1107 1063 1063 1107 1087 1087 1132 1088 1088 1133 1063 1063 1107 1088 1088 1133 1064 1064 1108 1064 1064 1108 1088 1088 1133 1089 1089 1134 1064 1064 1108 1089 1089 1134 1065 1065 1109 1065 1065 1109 1089 1089 1134 1090 1090 1135 1065 1065 1109 1090 1090 1135 1066 1066 1110 1066 1066 1110 1090 1090 1135 1091 1091 1136 1066 1066 1110 1091 1091 1136 1067 1067 1111 1067 1067 1111 1091 1091 1136 1092 1092 1137 1067 1067 1111 1092 1092 1137 1068 1068 1112 1068 1068 1112 1092 1092 1137 1093 1093 1138 1068 1068 1112 1093 1093 1138 1069 1069 1113 1069 1069 1113 1093 1093 1138 1094 1094 1139 1069 1069 1113 1094 1094 1139 1070 1070 1114 1070 1070 1114 1094 1094 1139 1095 1095 1140 1070 1070 1114 1095 1095 1140 1071 1071 1115 1071 1071 1115 1095 1095 1140 1096 1096 1141 1071 1071 1115 1096 1096 1141 1072 1072 1116 1072 1072 1116 1096 1096 1141 1097 1097 1142 1072 1072 1116 1097 1097 1142 1073 1073 1117 1073 1073 1117 1097 1097 1142 1098 1098 1143 1073 1073 1117 1098 1098 1143 1074 1074 1118 1074 1074 1118 1098 1098 1143 1099 1099 1144 1074 1074 1118 1099 1099 1144 1075 1075 1119 1075 1075 1119 1099 1099 1144 1100 1100 1145 1075 1075 1119 1100 1100 1145 1076 1076 1120 1076 1076 1120 1100 1100 1145 1101 1101 1146 1076 1076 1120 1101 1101 1146 1077 1077 1121 1077 1077 1121 1101 1101 1146 1102 1102 1147 1077 1077 1121 1102 1102 1147 1078 1078 1122 1078 1078 1122 1102 1102 1147 1103 1103 1148 1078 1078 1122 1103 1103 1148 1079 1079 1123 1079 1079 1123 1103 1103 1148 1080 1080 1149 1079 1079 1123 1080 1080 1149 1056 1056 1124 1080 1080 1125 1104 1104 1150 1105 1105 1151 1080 1080 1125 1105 1105 1151 1081 1081 1126 1081 1081 1126 1105 1105 1151 1106 1106 1152 1081 1081 1126 1106 1106 1152 1082 1082 1127 1082 1082 1127 1106 1106 1152 1107 1107 1153 1082 1082 1127 1107 1107 1153 1083 1083 1128 1083 1083 1128 1107 1107 1153 1108 1108 1154 1083 1083 1128 1108 1108 1154 1084 1084 1129 1084 1084 1129 1108 1108 1154 1109 1109 1155 1084 1084 1129 1109 1109 1155 1085 1085 1130 1085 1085 1130 1109 1109 1155 1110 1110 1156 1085 1085 1130 1110 1110 1156 1086 1086 1131 1086 1086 1131 1110 1110 1156 1111 1111 1157 1086 1086 1131 1111 1111 1157 1087 1087 1132 1087 1087 1132 1111 1111 1157 1112 1112 1158 1087 1087 1132 1112 1112 1158 1088 1088 1133 1088 1088 1133 1112 1112 1158 1113 1113 1159 1088 1088 1133 1113 1113 1159 1089 1089 1134 1089 1089 1134 1113 1113 1159 1114 1114 1160 1089 1089 1134 1114 1114 1160 1090 1090 1135 1090 1090 1135 1114 1114 1160 1115 1115 1161 1090 1090 1135 1115 1115 1161 1091 1091 1136 1091 1091 1136 1115 1115 1161 1116 1116 1162 1091 1091 1136 1116 1116 1162 1092 1092 1137 1092 1092 1137 1116 1116 1162 1117 1117 1163 1092 1092 1137 1117 1117 1163 1093 1093 1138 1093 1093 1138 1117 1117 1163 1118 1118 1164 1093 1093 1138 1118 1118 1164 1094 1094 1139 1094 1094 1139 1118 1118 1164 1119 1119 1165 1094 1094 1139 1119 1119 1165 1095 1095 1140 1095 1095 1140 1119 1119 1165 1120 1120 1166 1095 1095 1140 1120 1120 1166 1096 1096 1141 1096 1096 1141 1120 1120 1166 1121 1121 1167 1096 1096 1141 1121 1121 1167 1097 1097 1142 1097 1097 1142 1121 1121 1167 1122 1122 1168 1097 1097 1142 1122 1122 1168 1098 1098 1143 1098 1098 1143 1122 1122 1168 1123 1123 1169 1098 1098 1143 1123 1123 1169 1099 1099 1144 1099 1099 1144 1123 1123 1169 1124 1124 1170 1099 1099 1144 1124 1124 1170 1100 1100 1145 1100 1100 1145 1124 1124 1170 1125 1125 1171 1100 1100 1145 1125 1125 1171 1101 1101 1146 1101 1101 1146 1125 1125 1171 1126 1126 1172 1101 1101 1146 1126 1126 1172 1102 1102 1147 1102 1102 1147 1126 1126 1172 1127 1127 1173 1102 1102 1147 1127 1127 1173 1103 1103 1148 1103 1103 1148 1127 1127 1173 1104 1104 1174 1103 1103 1148 1104 1104 1174 1080 1080 1149 1104 1104 1150 1128 1128 1175 1129 1129 1176 1104 1104 1150 1129 1129 1176 1105 1105 1151 1105 1105 1151 1129 1129 1176 1130 1130 1177 1105 1105 1151 1130 1130 1177 1106 1106 1152 1106 1106 1152 1130 1130 1177 1131 1131 1178 1106 1106 1152 1131 1131 1178 1107 1107 1153 1107 1107 1153 1131 1131 1178 1132 1132 1179 1107 1107 1153 1132 1132 1179 1108 1108 1154 1108 1108 1154 1132 1132 1179 1133 1133 1180 1108 1108 1154 1133 1133 1180 1109 1109 1155 1109 1109 1155 1133 1133 1180 1134 1134 1181 1109 1109 1155 1134 1134 1181 1110 1110 1156 1110 1110 1156 1134 1134 1181 1135 1135 1182 1110 1110 1156 1135 1135 1182 1111 1111 1157 1111 1111 1157 1135 1135 1182 1136 1136 1183 1111 1111 1157 1136 1136 1183 1112 1112 1158 1112 1112 1158 1136 1136 1183 1137 1137 1184 1112 1112 1158 1137 1137 1184 1113 1113 1159 1113 1113 1159 1137 1137 1184 1138 1138 1185 1113 1113 1159 1138 1138 1185 1114 1114 1160 1114 1114 1160 1138 1138 1185 1139 1139 1186 1114 1114 1160 1139 1139 1186 1115 1115 1161 1115 1115 1161 1139 1139 1186 1140 1140 1187 1115 1115 1161 1140 1140 1187 1116 1116 1162 1116 1116 1162 1140 1140 1187 1141 1141 1188 1116 1116 1162 1141 1141 1188 1117 1117 1163 1117 1117 1163 1141 1141 1188 1142 1142 1189 1117 1117 1163 1142 1142 1189 1118 1118 1164 1118 1118 1164 1142 1142 1189 1143 1143 1190 1118 1118 1164 1143 1143 1190 1119 1119 1165 1119 1119 1165 1143 1143 1190 1144 1144 1191 1119 1119 1165 1144 1144 1191 1120 1120 1166 1120 1120 1166 1144 1144 1191 1145 1145 1192 1120 1120 1166 1145 1145 1192 1121 1121 1167 1121 1121 1167 1145 1145 1192 1146 1146 1193 1121 1121 1167 1146 1146 1193 1122 1122 1168 1122 1122 1168 1146 1146 1193 1147 1147 1194 1122 1122 1168 1147 1147 1194 1123 1123 1169 1123 1123 1169 1147 1147 1194 1148 1148 1195 1123 1123 1169 1148 1148 1195 1124 1124 1170 1124 1124 1170 1148 1148 1195 1149 1149 1196 1124 1124 1170 1149 1149 1196 1125 1125 1171 1125 1125 1171 1149 1149 1196 1150 1150 1197 1125 1125 1171 1150 1150 1197 1126 1126 1172 1126 1126 1172 1150 1150 1197 1151 1151 1198 1126 1126 1172 1151 1151 1198 1127 1127 1173 1127 1127 1173 1151 1151 1198 1128 1128 1199 1127 1127 1173 1128 1128 1199 1104 1104 1174 1128 1128 1175 1152 1152 1200 1153 1153 1201 1128 1128 1175 1153 1153 1201 1129 1129 1176 1129 1129 1176 1153 1153 1201 1154 1154 1202 1129 1129 1176 1154 1154 1202 1130 1130 1177 1130 1130 1177 1154 1154 1202 1155 1155 1203 1130 1130 1177 1155 1155 1203 1131 1131 1178 1131 1131 1178 1155 1155 1203 1156 1156 1204 1131 1131 1178 1156 1156 1204 1132 1132 1179 1132 1132 1179 1156 1156 1204 1157 1157 1205 1132 1132 1179 1157 1157 1205 1133 1133 1180 1133 1133 1180 1157 1157 1205 1158 1158 1206 1133 1133 1180 1158 1158 1206 1134 1134 1181 1134 1134 1181 1158 1158 1206 1159 1159 1207 1134 1134 1181 1159 1159 1207 1135 1135 1182 1135 1135 1182 1159 1159 1207 1160 1160 1208 1135 1135 1182 1160 1160 1208 1136 1136 1183 1136 1136 1183 1160 1160 1208 1161 1161 1209 1136 1136 1183 1161 1161 1209 1137 1137 1184 1137 1137 1184 1161 1161 1209 1162 1162 1210 1137 1137 1184 1162 1162 1210 1138 1138 1185 1138 1138 1185 1162 1162 1210 1163 1163 1211 1138 1138 1185 1163 1163 1211 1139 1139 1186 1139 1139 1186 1163 1163 1211 1164 1164 1212 1139 1139 1186 1164 1164 1212 1140 1140 1187 1140 1140 1187 1164 1164 1212 1165 1165 1213 1140 1140 1187 1165 1165 1213 1141 1141 1188 1141 1141 1188 1165 1165 1213 1166 1166 1214 1141 1141 1188 1166 1166 1214 1142 1142 1189 1142 1142 1189 1166 1166 1214 1167 1167 1215 1142 1142 1189 1167 1167 1215 1143 1143 1190 1143 1143 1190 1167 1167 1215 1168 1168 1216 1143 1143 1190 1168 1168 1216 1144 1144 1191 1144 1144 1191 1168 1168 1216 1169 1169 1217 1144 1144 1191 1169 1169 1217 1145 1145 1192 1145 1145 1192 1169 1169 1217 1170 1170 1218 1145 1145 1192 1170 1170 1218 1146 1146 1193 1146 1146 1193 1170 1170 1218 1171 1171 1219 1146 1146 1193 1171 1171 1219 1147 1147 1194 1147 1147 1194 1171 1171 1219 1172 1172 1220 1147 1147 1194 1172 1172 1220 1148 1148 1195 1148 1148 1195 1172 1172 1220 1173 1173 1221 1148 1148 1195 1173 1173 1221 1149 1149 1196 1149 1149 1196 1173 1173 1221 1174 1174 1222 1149 1149 1196 1174 1174 1222 1150 1150 1197 1150 1150 1197 1174 1174 1222 1175 1175 1223 1150 1150 1197 1175 1175 1223 1151 1151 1198 1151 1151 1198 1175 1175 1223 1152 1152 1224 1151 1151 1198 1152 1152 1224 1128 1128 1199 1152 1152 1200 1176 1176 1225 1177 1177 1226 1152 1152 1200 1177 1177 1226 1153 1153 1201 1153 1153 1201 1177 1177 1226 1178 1178 1227 1153 1153 1201 1178 1178 1227 1154 1154 1202 1154 1154 1202 1178 1178 1227 1179 1179 1228 1154 1154 1202 1179 1179 1228 1155 1155 1203 1155 1155 1203 1179 1179 1228 1180 1180 1229 1155 1155 1203 1180 1180 1229 1156 1156 1204 1156 1156 1204 1180 1180 1229 1181 1181 1230 1156 1156 1204 1181 1181 1230 1157 1157 1205 1157 1157 1205 1181 1181 1230 1182 1182 1231 1157 1157 1205 1182 1182 1231 1158 1158 1206 1158 1158 1206 1182 1182 1231 1183 1183 1232 1158 1158 1206 1183 1183 1232 1159 1159 1207 1159 1159 1207 1183 1183 1232 1184 1184 1233 1159 1159 1207 1184 1184 1233 1160 1160 1208 1160 1160 1208 1184 1184 1233 1185 1185 1234 1160 1160 1208 1185 1185 1234 1161 1161 1209 1161 1161 1209 1185 1185 1234 1186 1186 1235 1161 1161 1209 1186 1186 1235 1162 1162 1210 1162 1162 1210 1186 1186 1235 1187 1187 1236 1162 1162 1210 1187 1187 1236 1163 1163 1211 1163 1163 1211 1187 1187 1236 1188 1188 1237 1163 1163 1211 1188 1188 1237 1164 1164 1212 1164 1164 1212 1188 1188 1237 1189 1189 1238 1164 1164 1212 1189 1189 1238 1165 1165 1213 1165 1165 1213 1189 1189 1238 1190 1190 1239 1165 1165 1213 1190 1190 1239 1166 1166 1214 1166 1166 1214 1190 1190 1239 1191 1191 1240 1166 1166 1214 1191 1191 1240 1167 1167 1215 1167 1167 1215 1191 1191 1240 1192 1192 1241 1167 1167 1215 1192 1192 1241 1168 1168 1216 1168 1168 1216 1192 1192 1241 1193 1193 1242 1168 1168 1216 1193 1193 1242 1169 1169 1217 1169 1169 1217 1193 1193 1242 1194 1194 1243 1169 1169 1217 1194 1194 1243 1170 1170 1218 1170 1170 1218 1194 1194 1243 1195 1195 1244 1170 1170 1218 1195 1195 1244 1171 1171 1219 1171 1171 1219 1195 1195 1244 1196 1196 1245 1171 1171 1219 1196 1196 1245 1172 1172 1220 1172 1172 1220 1196 1196 1245 1197 1197 1246 1172 1172 1220 1197 1197 1246 1173 1173 1221 1173 1173 1221 1197 1197 1246 1198 1198 1247 1173 1173 1221 1198 1198 1247 1174 1174 1222 1174 1174 1222 1198 1198 1247 1199 1199 1248 1174 1174 1222 1199 1199 1248 1175 1175 1223 1175 1175 1223 1199 1199 1248 1176 1176 1249 1175 1175 1223 1176 1176 1249 1152 1152 1224 1176 1176 1225 1200 1200 1250 1201 1201 1251 1176 1176 1225 1201 1201 1251 1177 1177 1226 1177 1177 1226 1201 1201 1251 1202 1202 1252 1177 1177 1226 1202 1202 1252 1178 1178 1227 1178 1178 1227 1202 1202 1252 1203 1203 1253 1178 1178 1227 1203 1203 1253 1179 1179 1228 1179 1179 1228 1203 1203 1253 1204 1204 1254 1179 1179 1228 1204 1204 1254 1180 1180 1229 1180 1180 1229 1204 1204 1254 1205 1205 1255 1180 1180 1229 1205 1205 1255 1181 1181 1230 1181 1181 1230 1205 1205 1255 1206 1206 1256 1181 1181 1230 1206 1206 1256 1182 1182 1231 1182 1182 1231 1206 1206 1256 1207 1207 1257 1182 1182 1231 1207 1207 1257 1183 1183 1232 1183 1183 1232 1207 1207 1257 1208 1208 1258 1183 1183 1232 1208 1208 1258 1184 1184 1233 1184 1184 1233 1208 1208 1258 1209 1209 1259 1184 1184 1233 1209 1209 1259 1185 1185 1234 1185 1185 1234 1209 1209 1259 1210 1210 1260 1185 1185 1234 1210 1210 1260 1186 1186 1235 1186 1186 1235 1210 1210 1260 1211 1211 1261 1186 1186 1235 1211 1211 1261 1187 1187 1236 1187 1187 1236 1211 1211 1261 1212 1212 1262 1187 1187 1236 1212 1212 1262 1188 1188 1237 1188 1188 1237 1212 1212 1262 1213 1213 1263 1188 1188 1237 1213 1213 1263 1189 1189 1238 1189 1189 1238 1213 1213 1263 1214 1214 1264 1189 1189 1238 1214 1214 1264 1190 1190 1239 1190 1190 1239 1214 1214 1264 1215 1215 1265 1190 1190 1239 1215 1215 1265 1191 1191 1240 1191 1191 1240 1215 1215 1265 1216 1216 1266 1191 1191 1240 1216 1216 1266 1192 1192 1241 1192 1192 1241 1216 1216 1266 1217 1217 1267 1192 1192 1241 1217 1217 1267 1193 1193 1242 1193 1193 1242 1217 1217 1267 1218 1218 1268 1193 1193 1242 1218 1218 1268 1194 1194 1243 1194 1194 1243 1218 1218 1268 1219 1219 1269 1194 1194 1243 1219 1219 1269 1195 1195 1244 1195 1195 1244 1219 1219 1269 1220 1220 1270 1195 1195 1244 1220 1220 1270 1196 1196 1245 1196 1196 1245 1220 1220 1270 1221 1221 1271 1196 1196 1245 1221 1221 1271 1197 1197 1246 1197 1197 1246 1221 1221 1271 1222 1222 1272 1197 1197 1246 1222 1222 1272 1198 1198 1247 1198 1198 1247 1222 1222 1272 1223 1223 1273 1198 1198 1247 1223 1223 1273 1199 1199 1248 1199 1199 1248 1223 1223 1273 1200 1200 1274 1199 1199 1248 1200 1200 1274 1176 1176 1249 1200 1200 1250 1224 1224 1275 1225 1225 1276 1200 1200 1250 1225 1225 1276 1201 1201 1251 1201 1201 1251 1225 1225 1276 1226 1226 1277 1201 1201 1251 1226 1226 1277 1202 1202 1252 1202 1202 1252 1226 1226 1277 1227 1227 1278 1202 1202 1252 1227 1227 1278 1203 1203 1253 1203 1203 1253 1227 1227 1278 1228 1228 1279 1203 1203 1253 1228 1228 1279 1204 1204 1254 1204 1204 1254 1228 1228 1279 1229 1229 1280 1204 1204 1254 1229 1229 1280 1205 1205 1255 1205 1205 1255 1229 1229 1280 1230 1230 1281 1205 1205 1255 1230 1230 1281 1206 1206 1256 1206 1206 1256 1230 1230 1281 1231 1231 1282 1206 1206 1256 1231 1231 1282 1207 1207 1257 1207 1207 1257 1231 1231 1282 1232 1232 1283 1207 1207 1257 1232 1232 1283 1208 1208 1258 1208 1208 1258 1232 1232 1283 1233 1233 1284 1208 1208 1258 1233 1233 1284 1209 1209 1259 1209 1209 1259 1233 1233 1284 1234 1234 1285 1209 1209 1259 1234 1234 1285 1210 1210 1260 1210 1210 1260 1234 1234 1285 1235 1235 1286 1210 1210 1260 1235 1235 1286 1211 1211 1261 1211 1211 1261 1235 1235 1286 1236 1236 1287 1211 1211 1261 1236 1236 1287 1212 1212 1262 1212 1212 1262 1236 1236 1287 1237 1237 1288 1212 1212 1262 1237 1237 1288 1213 1213 1263 1213 1213 1263 1237 1237 1288 1238 1238 1289 1213 1213 1263 1238 1238 1289 1214 1214 1264 1214 1214 1264 1238 1238 1289 1239 1239 1290 1214 1214 1264 1239 1239 1290 1215 1215 1265 1215 1215 1265 1239 1239 1290 1240 1240 1291 1215 1215 1265 1240 1240 1291 1216 1216 1266 1216 1216 1266 1240 1240 1291 1241 1241 1292 1216 1216 1266 1241 1241 1292 1217 1217 1267 1217 1217 1267 1241 1241 1292 1242 1242 1293 1217 1217 1267 1242 1242 1293 1218 1218 1268 1218 1218 1268 1242 1242 1293 1243 1243 1294 1218 1218 1268 1243 1243 1294 1219 1219 1269 1219 1219 1269 1243 1243 1294 1244 1244 1295 1219 1219 1269 1244 1244 1295 1220 1220 1270 1220 1220 1270 1244 1244 1295 1245 1245 1296 1220 1220 1270 1245 1245 1296 1221 1221 1271 1221 1221 1271 1245 1245 1296 1246 1246 1297 1221 1221 1271 1246 1246 1297 1222 1222 1272 1222 1222 1272 1246 1246 1297 1247 1247 1298 1222 1222 1272 1247 1247 1298 1223 1223 1273 1223 1223 1273 1247 1247 1298 1224 1224 1299 1223 1223 1273 1224 1224 1299 1200 1200 1274 1224 1224 1275 1248 1248 1300 1249 1249 1301 1224 1224 1275 1249 1249 1301 1225 1225 1276 1225 1225 1276 1249 1249 1301 1250 1250 1302 1225 1225 1276 1250 1250 1302 1226 1226 1277 1226 1226 1277 1250 1250 1302 1251 1251 1303 1226 1226 1277 1251 1251 1303 1227 1227 1278 1227 1227 1278 1251 1251 1303 1252 1252 1304 1227 1227 1278 1252 1252 1304 1228 1228 1279 1228 1228 1279 1252 1252 1304 1253 1253 1305 1228 1228 1279 1253 1253 1305 1229 1229 1280 1229 1229 1280 1253 1253 1305 1254 1254 1306 1229 1229 1280 1254 1254 1306 1230 1230 1281 1230 1230 1281 1254 1254 1306 1255 1255 1307 1230 1230 1281 1255 1255 1307 1231 1231 1282 1231 1231 1282 1255 1255 1307 1256 1256 1308 1231 1231 1282 1256 1256 1308 1232 1232 1283 1232 1232 1283 1256 1256 1308 1257 1257 1309 1232 1232 1283 1257 1257 1309 1233 1233 1284 1233 1233 1284 1257 1257 1309 1258 1258 1310 1233 1233 1284 1258 1258 1310 1234 1234 1285 1234 1234 1285 1258 1258 1310 1259 1259 1311 1234 1234 1285 1259 1259 1311 1235 1235 1286 1235 1235 1286 1259 1259 1311 1260 1260 1312 1235 1235 1286 1260 1260 1312 1236 1236 1287 1236 1236 1287 1260 1260 1312 1261 1261 1313 1236 1236 1287 1261 1261 1313 1237 1237 1288 1237 1237 1288 1261 1261 1313 1262 1262 1314 1237 1237 1288 1262 1262 1314 1238 1238 1289 1238 1238 1289 1262 1262 1314 1263 1263 1315 1238 1238 1289 1263 1263 1315 1239 1239 1290 1239 1239 1290 1263 1263 1315 1264 1264 1316 1239 1239 1290 1264 1264 1316 1240 1240 1291 1240 1240 1291 1264 1264 1316 1265 1265 1317 1240 1240 1291 1265 1265 1317 1241 1241 1292 1241 1241 1292 1265 1265 1317 1266 1266 1318 1241 1241 1292 1266 1266 1318 1242 1242 1293 1242 1242 1293 1266 1266 1318 1267 1267 1319 1242 1242 1293 1267 1267 1319 1243 1243 1294 1243 1243 1294 1267 1267 1319 1268 1268 1320 1243 1243 1294 1268 1268 1320 1244 1244 1295 1244 1244 1295 1268 1268 1320 1269 1269 1321 1244 1244 1295 1269 1269 1321 1245 1245 1296 1245 1245 1296 1269 1269 1321 1270 1270 1322 1245 1245 1296 1270 1270 1322 1246 1246 1297 1246 1246 1297 1270 1270 1322 1271 1271 1323 1246 1246 1297 1271 1271 1323 1247 1247 1298 1247 1247 1298 1271 1271 1323 1248 1248 1324 1247 1247 1298 1248 1248 1324 1224 1224 1299 1248 1248 1300 1272 1272 1325 1273 1273 1326 1248 1248 1300 1273 1273 1326 1249 1249 1301 1249 1249 1301 1273 1273 1326 1274 1274 1327 1249 1249 1301 1274 1274 1327 1250 1250 1302 1250 1250 1302 1274 1274 1327 1275 1275 1328 1250 1250 1302 1275 1275 1328 1251 1251 1303 1251 1251 1303 1275 1275 1328 1276 1276 1329 1251 1251 1303 1276 1276 1329 1252 1252 1304 1252 1252 1304 1276 1276 1329 1277 1277 1330 1252 1252 1304 1277 1277 1330 1253 1253 1305 1253 1253 1305 1277 1277 1330 1278 1278 1331 1253 1253 1305 1278 1278 1331 1254 1254 1306 1254 1254 1306 1278 1278 1331 1279 1279 1332 1254 1254 1306 1279 1279 1332 1255 1255 1307 1255 1255 1307 1279 1279 1332 1280 1280 1333 1255 1255 1307 1280 1280 1333 1256 1256 1308 1256 1256 1308 1280 1280 1333 1281 1281 1334 1256 1256 1308 1281 1281 1334 1257 1257 1309 1257 1257 1309 1281 1281 1334 1282 1282 1335 1257 1257 1309 1282 1282 1335 1258 1258 1310 1258 1258 1310 1282 1282 1335 1283 1283 1336 1258 1258 1310 1283 1283 1336 1259 1259 1311 1259 1259 1311 1283 1283 1336 1284 1284 1337 1259 1259 1311 1284 1284 1337 1260 1260 1312 1260 1260 1312 1284 1284 1337 1285 1285 1338 1260 1260 1312 1285 1285 1338 1261 1261 1313 1261 1261 1313 1285 1285 1338 1286 1286 1339 1261 1261 1313 1286 1286 1339 1262 1262 1314 1262 1262 1314 1286 1286 1339 1287 1287 1340 1262 1262 1314 1287 1287 1340 1263 1263 1315 1263 1263 1315 1287 1287 1340 1288 1288 1341 1263 1263 1315 1288 1288 1341 1264 1264 1316 1264 1264 1316 1288 1288 1341 1289 1289 1342 1264 1264 1316 1289 1289 1342 1265 1265 1317 1265 1265 1317 1289 1289 1342 1290 1290 1343 1265 1265 1317 1290 1290 1343 1266 1266 1318 1266 1266 1318 1290 1290 1343 1291 1291 1344 1266 1266 1318 1291 1291 1344 1267 1267 1319 1267 1267 1319 1291 1291 1344 1292 1292 1345 1267 1267 1319 1292 1292 1345 1268 1268 1320 1268 1268 1320 1292 1292 1345 1293 1293 1346 1268 1268 1320 1293 1293 1346 1269 1269 1321 1269 1269 1321 1293 1293 1346 1294 1294 1347 1269 1269 1321 1294 1294 1347 1270 1270 1322 1270 1270 1322 1294 1294 1347 1295 1295 1348 1270 1270 1322 1295 1295 1348 1271 1271 1323 1271 1271 1323 1295 1295 1348 1272 1272 1349 1271 1271 1323 1272 1272 1349 1248 1248 1324 1272 1272 1325 1296 1296 1350 1297 1297 1351 1272 1272 1325 1297 1297 1351 1273 1273 1326 1273 1273 1326 1297 1297 1351 1298 1298 1352 1273 1273 1326 1298 1298 1352 1274 1274 1327 1274 1274 1327 1298 1298 1352 1299 1299 1353 1274 1274 1327 1299 1299 1353 1275 1275 1328 1275 1275 1328 1299 1299 1353 1300 1300 1354 1275 1275 1328 1300 1300 1354 1276 1276 1329 1276 1276 1329 1300 1300 1354 1301 1301 1355 1276 1276 1329 1301 1301 1355 1277 1277 1330 1277 1277 1330 1301 1301 1355 1302 1302 1356 1277 1277 1330 1302 1302 1356 1278 1278 1331 1278 1278 1331 1302 1302 1356 1303 1303 1357 1278 1278 1331 1303 1303 1357 1279 1279 1332 1279 1279 1332 1303 1303 1357 1304 1304 1358 1279 1279 1332 1304 1304 1358 1280 1280 1333 1280 1280 1333 1304 1304 1358 1305 1305 1359 1280 1280 1333 1305 1305 1359 1281 1281 1334 1281 1281 1334 1305 1305 1359 1306 1306 1360 1281 1281 1334 1306 1306 1360 1282 1282 1335 1282 1282 1335 1306 1306 1360 1307 1307 1361 1282 1282 1335 1307 1307 1361 1283 1283 1336 1283 1283 1336 1307 1307 1361 1308 1308 1362 1283 1283 1336 1308 1308 1362 1284 1284 1337 1284 1284 1337 1308 1308 1362 1309 1309 1363 1284 1284 1337 1309 1309 1363 1285 1285 1338 1285 1285 1338 1309 1309 1363 1310 1310 1364 1285 1285 1338 1310 1310 1364 1286 1286 1339 1286 1286 1339 1310 1310 1364 1311 1311 1365 1286 1286 1339 1311 1311 1365 1287 1287 1340 1287 1287 1340 1311 1311 1365 1312 1312 1366 1287 1287 1340 1312 1312 1366 1288 1288 1341 1288 1288 1341 1312 1312 1366 1313 1313 1367 1288 1288 1341 1313 1313 1367 1289 1289 1342 1289 1289 1342 1313 1313 1367 1314 1314 1368 1289 1289 1342 1314 1314 1368 1290 1290 1343 1290 1290 1343 1314 1314 1368 1315 1315 1369 1290 1290 1343 1315 1315 1369 1291 1291 1344 1291 1291 1344 1315 1315 1369 1316 1316 1370 1291 1291 1344 1316 1316 1370 1292 1292 1345 1292 1292 1345 1316 1316 1370 1317 1317 1371 1292 1292 1345 1317 1317 1371 1293 1293 1346 1293 1293 1346 1317 1317 1371 1318 1318 1372 1293 1293 1346 1318 1318 1372 1294 1294 1347 1294 1294 1347 1318 1318 1372 1319 1319 1373 1294 1294 1347 1319 1319 1373 1295 1295 1348 1295 1295 1348 1319 1319 1373 1296 1296 1374 1295 1295 1348 1296 1296 1374 1272 1272 1349 1296 1296 1350 1320 1320 1375 1321 1321 1376 1296 1296 1350 1321 1321 1376 1297 1297 1351 1297 1297 1351 1321 1321 1376 1322 1322 1377 1297 1297 1351 1322 1322 1377 1298 1298 1352 1298 1298 1352 1322 1322 1377 1323 1323 1378 1298 1298 1352 1323 1323 1378 1299 1299 1353 1299 1299 1353 1323 1323 1378 1324 1324 1379 1299 1299 1353 1324 1324 1379 1300 1300 1354 1300 1300 1354 1324 1324 1379 1325 1325 1380 1300 1300 1354 1325 1325 1380 1301 1301 1355 1301 1301 1355 1325 1325 1380 1326 1326 1381 1301 1301 1355 1326 1326 1381 1302 1302 1356 1302 1302 1356 1326 1326 1381 1327 1327 1382 1302 1302 1356 1327 1327 1382 1303 1303 1357 1303 1303 1357 1327 1327 1382 1328 1328 1383 1303 1303 1357 1328 1328 1383 1304 1304 1358 1304 1304 1358 1328 1328 1383 1329 1329 1384 1304 1304 1358 1329 1329 1384 1305 1305 1359 1305 1305 1359 1329 1329 1384 1330 1330 1385 1305 1305 1359 1330 1330 1385 1306 1306 1360 1306 1306 1360 1330 1330 1385 1331 1331 1386 1306 1306 1360 1331 1331 1386 1307 1307 1361 1307 1307 1361 1331 1331 1386 1332 1332 1387 1307 1307 1361 1332 1332 1387 1308 1308 1362 1308 1308 1362 1332 1332 1387 1333 1333 1388 1308 1308 1362 1333 1333 1388 1309 1309 1363 1309 1309 1363 1333 1333 1388 1334 1334 1389 1309 1309 1363 1334 1334 1389 1310 1310 1364 1310 1310 1364 1334 1334 1389 1335 1335 1390 1310 1310 1364 1335 1335 1390 1311 1311 1365 1311 1311 1365 1335 1335 1390 1336 1336 1391 1311 1311 1365 1336 1336 1391 1312 1312 1366 1312 1312 1366 1336 1336 1391 1337 1337 1392 1312 1312 1366 1337 1337 1392 1313 1313 1367 1313 1313 1367 1337 1337 1392 1338 1338 1393 1313 1313 1367 1338 1338 1393 1314 1314 1368 1314 1314 1368 1338 1338 1393 1339 1339 1394 1314 1314 1368 1339 1339 1394 1315 1315 1369 1315 1315 1369 1339 1339 1394 1340 1340 1395 1315 1315 1369 1340 1340 1395 1316 1316 1370 1316 1316 1370 1340 1340 1395 1341 1341 1396 1316 1316 1370 1341 1341 1396 1317 1317 1371 1317 1317 1371 1341 1341 1396 1342 1342 1397 1317 1317 1371 1342 1342 1397 1318 1318 1372 1318 1318 1372 1342 1342 1397 1343 1343 1398 1318 1318 1372 1343 1343 1398 1319 1319 1373 1319 1319 1373 1343 1343 1398 1320 1320 1399 1319 1319 1373 1320 1320 1399 1296 1296 1374 1320 1320 1375 1344 1344 1400 1345 1345 1401 1320 1320 1375 1345 1345 1401 1321 1321 1376 1321 1321 1376 1345 1345 1401 1346 1346 1402 1321 1321 1376 1346 1346 1402 1322 1322 1377 1322 1322 1377 1346 1346 1402 1347 1347 1403 1322 1322 1377 1347 1347 1403 1323 1323 1378 1323 1323 1378 1347 1347 1403 1348 1348 1404 1323 1323 1378 1348 1348 1404 1324 1324 1379 1324 1324 1379 1348 1348 1404 1349 1349 1405 1324 1324 1379 1349 1349 1405 1325 1325 1380 1325 1325 1380 1349 1349 1405 1350 1350 1406 1325 1325 1380 1350 1350 1406 1326 1326 1381 1326 1326 1381 1350 1350 1406 1351 1351 1407 1326 1326 1381 1351 1351 1407 1327 1327 1382 1327 1327 1382 1351 1351 1407 1352 1352 1408 1327 1327 1382 1352 1352 1408 1328 1328 1383 1328 1328 1383 1352 1352 1408 1353 1353 1409 1328 1328 1383 1353 1353 1409 1329 1329 1384 1329 1329 1384 1353 1353 1409 1354 1354 1410 1329 1329 1384 1354 1354 1410 1330 1330 1385 1330 1330 1385 1354 1354 1410 1355 1355 1411 1330 1330 1385 1355 1355 1411 1331 1331 1386 1331 1331 1386 1355 1355 1411 1356 1356 1412 1331 1331 1386 1356 1356 1412 1332 1332 1387 1332 1332 1387 1356 1356 1412 1357 1357 1413 1332 1332 1387 1357 1357 1413 1333 1333 1388 1333 1333 1388 1357 1357 1413 1358 1358 1414 1333 1333 1388 1358 1358 1414 1334 1334 1389 1334 1334 1389 1358 1358 1414 1359 1359 1415 1334 1334 1389 1359 1359 1415 1335 1335 1390 1335 1335 1390 1359 1359 1415 1360 1360 1416 1335 1335 1390 1360 1360 1416 1336 1336 1391 1336 1336 1391 1360 1360 1416 1361 1361 1417 1336 1336 1391 1361 1361 1417 1337 1337 1392 1337 1337 1392 1361 1361 1417 1362 1362 1418 1337 1337 1392 1362 1362 1418 1338 1338 1393 1338 1338 1393 1362 1362 1418 1363 1363 1419 1338 1338 1393 1363 1363 1419 1339 1339 1394 1339 1339 1394 1363 1363 1419 1364 1364 1420 1339 1339 1394 1364 1364 1420 1340 1340 1395 1340 1340 1395 1364 1364 1420 1365 1365 1421 1340 1340 1395 1365 1365 1421 1341 1341 1396 1341 1341 1396 1365 1365 1421 1366 1366 1422 1341 1341 1396 1366 1366 1422 1342 1342 1397 1342 1342 1397 1366 1366 1422 1367 1367 1423 1342 1342 1397 1367 1367 1423 1343 1343 1398 1343 1343 1398 1367 1367 1423 1344 1344 1424 1343 1343 1398 1344 1344 1424 1320 1320 1399 1344 1344 1400 1368 1368 1425 1369 1369 1426 1344 1344 1400 1369 1369 1426 1345 1345 1401 1345 1345 1401 1369 1369 1426 1370 1370 1427 1345 1345 1401 1370 1370 1427 1346 1346 1402 1346 1346 1402 1370 1370 1427 1371 1371 1428 1346 1346 1402 1371 1371 1428 1347 1347 1403 1347 1347 1403 1371 1371 1428 1372 1372 1429 1347 1347 1403 1372 1372 1429 1348 1348 1404 1348 1348 1404 1372 1372 1429 1373 1373 1430 1348 1348 1404 1373 1373 1430 1349 1349 1405 1349 1349 1405 1373 1373 1430 1374 1374 1431 1349 1349 1405 1374 1374 1431 1350 1350 1406 1350 1350 1406 1374 1374 1431 1375 1375 1432 1350 1350 1406 1375 1375 1432 1351 1351 1407 1351 1351 1407 1375 1375 1432 1376 1376 1433 1351 1351 1407 1376 1376 1433 1352 1352 1408 1352 1352 1408 1376 1376 1433 1377 1377 1434 1352 1352 1408 1377 1377 1434 1353 1353 1409 1353 1353 1409 1377 1377 1434 1378 1378 1435 1353 1353 1409 1378 1378 1435 1354 1354 1410 1354 1354 1410 1378 1378 1435 1379 1379 1436 1354 1354 1410 1379 1379 1436 1355 1355 1411 1355 1355 1411 1379 1379 1436 1380 1380 1437 1355 1355 1411 1380 1380 1437 1356 1356 1412 1356 1356 1412 1380 1380 1437 1381 1381 1438 1356 1356 1412 1381 1381 1438 1357 1357 1413 1357 1357 1413 1381 1381 1438 1382 1382 1439 1357 1357 1413 1382 1382 1439 1358 1358 1414 1358 1358 1414 1382 1382 1439 1383 1383 1440 1358 1358 1414 1383 1383 1440 1359 1359 1415 1359 1359 1415 1383 1383 1440 1384 1384 1441 1359 1359 1415 1384 1384 1441 1360 1360 1416 1360 1360 1416 1384 1384 1441 1385 1385 1442 1360 1360 1416 1385 1385 1442 1361 1361 1417 1361 1361 1417 1385 1385 1442 1386 1386 1443 1361 1361 1417 1386 1386 1443 1362 1362 1418 1362 1362 1418 1386 1386 1443 1387 1387 1444 1362 1362 1418 1387 1387 1444 1363 1363 1419 1363 1363 1419 1387 1387 1444 1388 1388 1445 1363 1363 1419 1388 1388 1445 1364 1364 1420 1364 1364 1420 1388 1388 1445 1389 1389 1446 1364 1364 1420 1389 1389 1446 1365 1365 1421 1365 1365 1421 1389 1389 1446 1390 1390 1447 1365 1365 1421 1390 1390 1447 1366 1366 1422 1366 1366 1422 1390 1390 1447 1391 1391 1448 1366 1366 1422 1391 1391 1448 1367 1367 1423 1367 1367 1423 1391 1391 1448 1368 1368 1449 1367 1367 1423 1368 1368 1449 1344 1344 1424 1368 1368 1425 1392 1392 1450 1393 1393 1451 1368 1368 1425 1393 1393 1451 1369 1369 1426 1369 1369 1426 1393 1393 1451 1394 1394 1452 1369 1369 1426 1394 1394 1452 1370 1370 1427 1370 1370 1427 1394 1394 1452 1395 1395 1453 1370 1370 1427 1395 1395 1453 1371 1371 1428 1371 1371 1428 1395 1395 1453 1396 1396 1454 1371 1371 1428 1396 1396 1454 1372 1372 1429 1372 1372 1429 1396 1396 1454 1397 1397 1455 1372 1372 1429 1397 1397 1455 1373 1373 1430 1373 1373 1430 1397 1397 1455 1398 1398 1456 1373 1373 1430 1398 1398 1456 1374 1374 1431 1374 1374 1431 1398 1398 1456 1399 1399 1457 1374 1374 1431 1399 1399 1457 1375 1375 1432 1375 1375 1432 1399 1399 1457 1400 1400 1458 1375 1375 1432 1400 1400 1458 1376 1376 1433 1376 1376 1433 1400 1400 1458 1401 1401 1459 1376 1376 1433 1401 1401 1459 1377 1377 1434 1377 1377 1434 1401 1401 1459 1402 1402 1460 1377 1377 1434 1402 1402 1460 1378 1378 1435 1378 1378 1435 1402 1402 1460 1403 1403 1461 1378 1378 1435 1403 1403 1461 1379 1379 1436 1379 1379 1436 1403 1403 1461 1404 1404 1462 1379 1379 1436 1404 1404 1462 1380 1380 1437 1380 1380 1437 1404 1404 1462 1405 1405 1463 1380 1380 1437 1405 1405 1463 1381 1381 1438 1381 1381 1438 1405 1405 1463 1406 1406 1464 1381 1381 1438 1406 1406 1464 1382 1382 1439 1382 1382 1439 1406 1406 1464 1407 1407 1465 1382 1382 1439 1407 1407 1465 1383 1383 1440 1383 1383 1440 1407 1407 1465 1408 1408 1466 1383 1383 1440 1408 1408 1466 1384 1384 1441 1384 1384 1441 1408 1408 1466 1409 1409 1467 1384 1384 1441 1409 1409 1467 1385 1385 1442 1385 1385 1442 1409 1409 1467 1410 1410 1468 1385 1385 1442 1410 1410 1468 1386 1386 1443 1386 1386 1443 1410 1410 1468 1411 1411 1469 1386 1386 1443 1411 1411 1469 1387 1387 1444 1387 1387 1444 1411 1411 1469 1412 1412 1470 1387 1387 1444 1412 1412 1470 1388 1388 1445 1388 1388 1445 1412 1412 1470 1413 1413 1471 1388 1388 1445 1413 1413 1471 1389 1389 1446 1389 1389 1446 1413 1413 1471 1414 1414 1472 1389 1389 1446 1414 1414 1472 1390 1390 1447 1390 1390 1447 1414 1414 1472 1415 1415 1473 1390 1390 1447 1415 1415 1473 1391 1391 1448 1391 1391 1448 1415 1415 1473 1392 1392 1474 1391 1391 1448 1392 1392 1474 1368 1368 1449 1392 1392 1450 1416 1416 1475 1417 1417 1476 1392 1392 1450 1417 1417 1476 1393 1393 1451 1393 1393 1451 1417 1417 1476 1418 1418 1477 1393 1393 1451 1418 1418 1477 1394 1394 1452 1394 1394 1452 1418 1418 1477 1419 1419 1478 1394 1394 1452 1419 1419 1478 1395 1395 1453 1395 1395 1453 1419 1419 1478 1420 1420 1479 1395 1395 1453 1420 1420 1479 1396 1396 1454 1396 1396 1454 1420 1420 1479 1421 1421 1480 1396 1396 1454 1421 1421 1480 1397 1397 1455 1397 1397 1455 1421 1421 1480 1422 1422 1481 1397 1397 1455 1422 1422 1481 1398 1398 1456 1398 1398 1456 1422 1422 1481 1423 1423 1482 1398 1398 1456 1423 1423 1482 1399 1399 1457 1399 1399 1457 1423 1423 1482 1424 1424 1483 1399 1399 1457 1424 1424 1483 1400 1400 1458 1400 1400 1458 1424 1424 1483 1425 1425 1484 1400 1400 1458 1425 1425 1484 1401 1401 1459 1401 1401 1459 1425 1425 1484 1426 1426 1485 1401 1401 1459 1426 1426 1485 1402 1402 1460 1402 1402 1460 1426 1426 1485 1427 1427 1486 1402 1402 1460 1427 1427 1486 1403 1403 1461 1403 1403 1461 1427 1427 1486 1428 1428 1487 1403 1403 1461 1428 1428 1487 1404 1404 1462 1404 1404 1462 1428 1428 1487 1429 1429 1488 1404 1404 1462 1429 1429 1488 1405 1405 1463 1405 1405 1463 1429 1429 1488 1430 1430 1489 1405 1405 1463 1430 1430 1489 1406 1406 1464 1406 1406 1464 1430 1430 1489 1431 1431 1490 1406 1406 1464 1431 1431 1490 1407 1407 1465 1407 1407 1465 1431 1431 1490 1432 1432 1491 1407 1407 1465 1432 1432 1491 1408 1408 1466 1408 1408 1466 1432 1432 1491 1433 1433 1492 1408 1408 1466 1433 1433 1492 1409 1409 1467 1409 1409 1467 1433 1433 1492 1434 1434 1493 1409 1409 1467 1434 1434 1493 1410 1410 1468 1410 1410 1468 1434 1434 1493 1435 1435 1494 1410 1410 1468 1435 1435 1494 1411 1411 1469 1411 1411 1469 1435 1435 1494 1436 1436 1495 1411 1411 1469 1436 1436 1495 1412 1412 1470 1412 1412 1470 1436 1436 1495 1437 1437 1496 1412 1412 1470 1437 1437 1496 1413 1413 1471 1413 1413 1471 1437 1437 1496 1438 1438 1497 1413 1413 1471 1438 1438 1497 1414 1414 1472 1414 1414 1472 1438 1438 1497 1439 1439 1498 1414 1414 1472 1439 1439 1498 1415 1415 1473 1415 1415 1473 1439 1439 1498 1416 1416 1499 1415 1415 1473 1416 1416 1499 1392 1392 1474 1416 1416 1475 1440 1440 1500 1441 1441 1501 1416 1416 1475 1441 1441 1501 1417 1417 1476 1417 1417 1476 1441 1441 1501 1442 1442 1502 1417 1417 1476 1442 1442 1502 1418 1418 1477 1418 1418 1477 1442 1442 1502 1443 1443 1503 1418 1418 1477 1443 1443 1503 1419 1419 1478 1419 1419 1478 1443 1443 1503 1444 1444 1504 1419 1419 1478 1444 1444 1504 1420 1420 1479 1420 1420 1479 1444 1444 1504 1445 1445 1505 1420 1420 1479 1445 1445 1505 1421 1421 1480 1421 1421 1480 1445 1445 1505 1446 1446 1506 1421 1421 1480 1446 1446 1506 1422 1422 1481 1422 1422 1481 1446 1446 1506 1447 1447 1507 1422 1422 1481 1447 1447 1507 1423 1423 1482 1423 1423 1482 1447 1447 1507 1448 1448 1508 1423 1423 1482 1448 1448 1508 1424 1424 1483 1424 1424 1483 1448 1448 1508 1449 1449 1509 1424 1424 1483 1449 1449 1509 1425 1425 1484 1425 1425 1484 1449 1449 1509 1450 1450 1510 1425 1425 1484 1450 1450 1510 1426 1426 1485 1426 1426 1485 1450 1450 1510 1451 1451 1511 1426 1426 1485 1451 1451 1511 1427 1427 1486 1427 1427 1486 1451 1451 1511 1452 1452 1512 1427 1427 1486 1452 1452 1512 1428 1428 1487 1428 1428 1487 1452 1452 1512 1453 1453 1513 1428 1428 1487 1453 1453 1513 1429 1429 1488 1429 1429 1488 1453 1453 1513 1454 1454 1514 1429 1429 1488 1454 1454 1514 1430 1430 1489 1430 1430 1489 1454 1454 1514 1455 1455 1515 1430 1430 1489 1455 1455 1515 1431 1431 1490 1431 1431 1490 1455 1455 1515 1456 1456 1516 1431 1431 1490 1456 1456 1516 1432 1432 1491 1432 1432 1491 1456 1456 1516 1457 1457 1517 1432 1432 1491 1457 1457 1517 1433 1433 1492 1433 1433 1492 1457 1457 1517 1458 1458 1518 1433 1433 1492 1458 1458 1518 1434 1434 1493 1434 1434 1493 1458 1458 1518 1459 1459 1519 1434 1434 1493 1459 1459 1519 1435 1435 1494 1435 1435 1494 1459 1459 1519 1460 1460 1520 1435 1435 1494 1460 1460 1520 1436 1436 1495 1436 1436 1495 1460 1460 1520 1461 1461 1521 1436 1436 1495 1461 1461 1521 1437 1437 1496 1437 1437 1496 1461 1461 1521 1462 1462 1522 1437 1437 1496 1462 1462 1522 1438 1438 1497 1438 1438 1497 1462 1462 1522 1463 1463 1523 1438 1438 1497 1463 1463 1523 1439 1439 1498 1439 1439 1498 1463 1463 1523 1440 1440 1524 1439 1439 1498 1440 1440 1524 1416 1416 1499 1440 1440 1500 1464 1464 1525 1465 1465 1526 1440 1440 1500 1465 1465 1526 1441 1441 1501 1441 1441 1501 1465 1465 1526 1466 1466 1527 1441 1441 1501 1466 1466 1527 1442 1442 1502 1442 1442 1502 1466 1466 1527 1467 1467 1528 1442 1442 1502 1467 1467 1528 1443 1443 1503 1443 1443 1503 1467 1467 1528 1468 1468 1529 1443 1443 1503 1468 1468 1529 1444 1444 1504 1444 1444 1504 1468 1468 1529 1469 1469 1530 1444 1444 1504 1469 1469 1530 1445 1445 1505 1445 1445 1505 1469 1469 1530 1470 1470 1531 1445 1445 1505 1470 1470 1531 1446 1446 1506 1446 1446 1506 1470 1470 1531 1471 1471 1532 1446 1446 1506 1471 1471 1532 1447 1447 1507 1447 1447 1507 1471 1471 1532 1472 1472 1533 1447 1447 1507 1472 1472 1533 1448 1448 1508 1448 1448 1508 1472 1472 1533 1473 1473 1534 1448 1448 1508 1473 1473 1534 1449 1449 1509 1449 1449 1509 1473 1473 1534 1474 1474 1535 1449 1449 1509 1474 1474 1535 1450 1450 1510 1450 1450 1510 1474 1474 1535 1475 1475 1536 1450 1450 1510 1475 1475 1536 1451 1451 1511 1451 1451 1511 1475 1475 1536 1476 1476 1537 1451 1451 1511 1476 1476 1537 1452 1452 1512 1452 1452 1512 1476 1476 1537 1477 1477 1538 1452 1452 1512 1477 1477 1538 1453 1453 1513 1453 1453 1513 1477 1477 1538 1478 1478 1539 1453 1453 1513 1478 1478 1539 1454 1454 1514 1454 1454 1514 1478 1478 1539 1479 1479 1540 1454 1454 1514 1479 1479 1540 1455 1455 1515 1455 1455 1515 1479 1479 1540 1480 1480 1541 1455 1455 1515 1480 1480 1541 1456 1456 1516 1456 1456 1516 1480 1480 1541 1481 1481 1542 1456 1456 1516 1481 1481 1542 1457 1457 1517 1457 1457 1517 1481 1481 1542 1482 1482 1543 1457 1457 1517 1482 1482 1543 1458 1458 1518 1458 1458 1518 1482 1482 1543 1483 1483 1544 1458 1458 1518 1483 1483 1544 1459 1459 1519 1459 1459 1519 1483 1483 1544 1484 1484 1545 1459 1459 1519 1484 1484 1545 1460 1460 1520 1460 1460 1520 1484 1484 1545 1485 1485 1546 1460 1460 1520 1485 1485 1546 1461 1461 1521 1461 1461 1521 1485 1485 1546 1486 1486 1547 1461 1461 1521 1486 1486 1547 1462 1462 1522 1462 1462 1522 1486 1486 1547 1487 1487 1548 1462 1462 1522 1487 1487 1548 1463 1463 1523 1463 1463 1523 1487 1487 1548 1464 1464 1549 1463 1463 1523 1464 1464 1549 1440 1440 1524 1464 1464 1525 1488 1488 1550 1489 1489 1551 1464 1464 1525 1489 1489 1551 1465 1465 1526 1465 1465 1526 1489 1489 1551 1490 1490 1552 1465 1465 1526 1490 1490 1552 1466 1466 1527 1466 1466 1527 1490 1490 1552 1491 1491 1553 1466 1466 1527 1491 1491 1553 1467 1467 1528 1467 1467 1528 1491 1491 1553 1492 1492 1554 1467 1467 1528 1492 1492 1554 1468 1468 1529 1468 1468 1529 1492 1492 1554 1493 1493 1555 1468 1468 1529 1493 1493 1555 1469 1469 1530 1469 1469 1530 1493 1493 1555 1494 1494 1556 1469 1469 1530 1494 1494 1556 1470 1470 1531 1470 1470 1531 1494 1494 1556 1495 1495 1557 1470 1470 1531 1495 1495 1557 1471 1471 1532 1471 1471 1532 1495 1495 1557 1496 1496 1558 1471 1471 1532 1496 1496 1558 1472 1472 1533 1472 1472 1533 1496 1496 1558 1497 1497 1559 1472 1472 1533 1497 1497 1559 1473 1473 1534 1473 1473 1534 1497 1497 1559 1498 1498 1560 1473 1473 1534 1498 1498 1560 1474 1474 1535 1474 1474 1535 1498 1498 1560 1499 1499 1561 1474 1474 1535 1499 1499 1561 1475 1475 1536 1475 1475 1536 1499 1499 1561 1500 1500 1562 1475 1475 1536 1500 1500 1562 1476 1476 1537 1476 1476 1537 1500 1500 1562 1501 1501 1563 1476 1476 1537 1501 1501 1563 1477 1477 1538 1477 1477 1538 1501 1501 1563 1502 1502 1564 1477 1477 1538 1502 1502 1564 1478 1478 1539 1478 1478 1539 1502 1502 1564 1503 1503 1565 1478 1478 1539 1503 1503 1565 1479 1479 1540 1479 1479 1540 1503 1503 1565 1504 1504 1566 1479 1479 1540 1504 1504 1566 1480 1480 1541 1480 1480 1541 1504 1504 1566 1505 1505 1567 1480 1480 1541 1505 1505 1567 1481 1481 1542 1481 1481 1542 1505 1505 1567 1506 1506 1568 1481 1481 1542 1506 1506 1568 1482 1482 1543 1482 1482 1543 1506 1506 1568 1507 1507 1569 1482 1482 1543 1507 1507 1569 1483 1483 1544 1483 1483 1544 1507 1507 1569 1508 1508 1570 1483 1483 1544 1508 1508 1570 1484 1484 1545 1484 1484 1545 1508 1508 1570 1509 1509 1571 1484 1484 1545 1509 1509 1571 1485 1485 1546 1485 1485 1546 1509 1509 1571 1510 1510 1572 1485 1485 1546 1510 1510 1572 1486 1486 1547 1486 1486 1547 1510 1510 1572 1511 1511 1573 1486 1486 1547 1511 1511 1573 1487 1487 1548 1487 1487 1548 1511 1511 1573 1488 1488 1574 1487 1487 1548 1488 1488 1574 1464 1464 1549 1488 1488 1550 1512 1512 1575 1513 1513 1576 1488 1488 1550 1513 1513 1576 1489 1489 1551 1489 1489 1551 1513 1513 1576 1514 1514 1577 1489 1489 1551 1514 1514 1577 1490 1490 1552 1490 1490 1552 1514 1514 1577 1515 1515 1578 1490 1490 1552 1515 1515 1578 1491 1491 1553 1491 1491 1553 1515 1515 1578 1516 1516 1579 1491 1491 1553 1516 1516 1579 1492 1492 1554 1492 1492 1554 1516 1516 1579 1517 1517 1580 1492 1492 1554 1517 1517 1580 1493 1493 1555 1493 1493 1555 1517 1517 1580 1518 1518 1581 1493 1493 1555 1518 1518 1581 1494 1494 1556 1494 1494 1556 1518 1518 1581 1519 1519 1582 1494 1494 1556 1519 1519 1582 1495 1495 1557 1495 1495 1557 1519 1519 1582 1520 1520 1583 1495 1495 1557 1520 1520 1583 1496 1496 1558 1496 1496 1558 1520 1520 1583 1521 1521 1584 1496 1496 1558 1521 1521 1584 1497 1497 1559 1497 1497 1559 1521 1521 1584 1522 1522 1585 1497 1497 1559 1522 1522 1585 1498 1498 1560 1498 1498 1560 1522 1522 1585 1523 1523 1586 1498 1498 1560 1523 1523 1586 1499 1499 1561 1499 1499 1561 1523 1523 1586 1524 1524 1587 1499 1499 1561 1524 1524 1587 1500 1500 1562 1500 1500 1562 1524 1524 1587 1525 1525 1588 1500 1500 1562 1525 1525 1588 1501 1501 1563 1501 1501 1563 1525 1525 1588 1526 1526 1589 1501 1501 1563 1526 1526 1589 1502 1502 1564 1502 1502 1564 1526 1526 1589 1527 1527 1590 1502 1502 1564 1527 1527 1590 1503 1503 1565 1503 1503 1565 1527 1527 1590 1528 1528 1591 1503 1503 1565 1528 1528 1591 1504 1504 1566 1504 1504 1566 1528 1528 1591 1529 1529 1592 1504 1504 1566 1529 1529 1592 1505 1505 1567 1505 1505 1567 1529 1529 1592 1530 1530 1593 1505 1505 1567 1530 1530 1593 1506 1506 1568 1506 1506 1568 1530 1530 1593 1531 1531 1594 1506 1506 1568 1531 1531 1594 1507 1507 1569 1507 1507 1569 1531 1531 1594 1532 1532 1595 1507 1507 1569 1532 1532 1595 1508 1508 1570 1508 1508 1570 1532 1532 1595 1533 1533 1596 1508 1508 1570 1533 1533 1596 1509 1509 1571 1509 1509 1571 1533 1533 1596 1534 1534 1597 1509 1509 1571 1534 1534 1597 1510 1510 1572 1510 1510 1572 1534 1534 1597 1535 1535 1598 1510 1510 1572 1535 1535 1598 1511 1511 1573 1511 1511 1573 1535 1535 1598 1512 1512 1599 1511 1511 1573 1512 1512 1599 1488 1488 1574 1512 1512 1575 1536 1536 1600 1537 1537 1601 1512 1512 1575 1537 1537 1601 1513 1513 1576 1513 1513 1576 1537 1537 1601 1538 1538 1602 1513 1513 1576 1538 1538 1602 1514 1514 1577 1514 1514 1577 1538 1538 1602 1539 1539 1603 1514 1514 1577 1539 1539 1603 1515 1515 1578 1515 1515 1578 1539 1539 1603 1540 1540 1604 1515 1515 1578 1540 1540 1604 1516 1516 1579 1516 1516 1579 1540 1540 1604 1541 1541 1605 1516 1516 1579 1541 1541 1605 1517 1517 1580 1517 1517 1580 1541 1541 1605 1542 1542 1606 1517 1517 1580 1542 1542 1606 1518 1518 1581 1518 1518 1581 1542 1542 1606 1543 1543 1607 1518 1518 1581 1543 1543 1607 1519 1519 1582 1519 1519 1582 1543 1543 1607 1544 1544 1608 1519 1519 1582 1544 1544 1608 1520 1520 1583 1520 1520 1583 1544 1544 1608 1545 1545 1609 1520 1520 1583 1545 1545 1609 1521 1521 1584 1521 1521 1584 1545 1545 1609 1546 1546 1610 1521 1521 1584 1546 1546 1610 1522 1522 1585 1522 1522 1585 1546 1546 1610 1547 1547 1611 1522 1522 1585 1547 1547 1611 1523 1523 1586 1523 1523 1586 1547 1547 1611 1548 1548 1612 1523 1523 1586 1548 1548 1612 1524 1524 1587 1524 1524 1587 1548 1548 1612 1549 1549 1613 1524 1524 1587 1549 1549 1613 1525 1525 1588 1525 1525 1588 1549 1549 1613 1550 1550 1614 1525 1525 1588 1550 1550 1614 1526 1526 1589 1526 1526 1589 1550 1550 1614 1551 1551 1615 1526 1526 1589 1551 1551 1615 1527 1527 1590 1527 1527 1590 1551 1551 1615 1552 1552 1616 1527 1527 1590 1552 1552 1616 1528 1528 1591 1528 1528 1591 1552 1552 1616 1553 1553 1617 1528 1528 1591 1553 1553 1617 1529 1529 1592 1529 1529 1592 1553 1553 1617 1554 1554 1618 1529 1529 1592 1554 1554 1618 1530 1530 1593 1530 1530 1593 1554 1554 1618 1555 1555 1619 1530 1530 1593 1555 1555 1619 1531 1531 1594 1531 1531 1594 1555 1555 1619 1556 1556 1620 1531 1531 1594 1556 1556 1620 1532 1532 1595 1532 1532 1595 1556 1556 1620 1557 1557 1621 1532 1532 1595 1557 1557 1621 1533 1533 1596 1533 1533 1596 1557 1557 1621 1558 1558 1622 1533 1533 1596 1558 1558 1622 1534 1534 1597 1534 1534 1597 1558 1558 1622 1559 1559 1623 1534 1534 1597 1559 1559 1623 1535 1535 1598 1535 1535 1598 1559 1559 1623 1536 1536 1624 1535 1535 1598 1536 1536 1624 1512 1512 1599 1536 1536 1600 1560 1560 1625 1561 1561 1626 1536 1536 1600 1561 1561 1626 1537 1537 1601 1537 1537 1601 1561 1561 1626 1562 1562 1627 1537 1537 1601 1562 1562 1627 1538 1538 1602 1538 1538 1602 1562 1562 1627 1563 1563 1628 1538 1538 1602 1563 1563 1628 1539 1539 1603 1539 1539 1603 1563 1563 1628 1564 1564 1629 1539 1539 1603 1564 1564 1629 1540 1540 1604 1540 1540 1604 1564 1564 1629 1565 1565 1630 1540 1540 1604 1565 1565 1630 1541 1541 1605 1541 1541 1605 1565 1565 1630 1566 1566 1631 1541 1541 1605 1566 1566 1631 1542 1542 1606 1542 1542 1606 1566 1566 1631 1567 1567 1632 1542 1542 1606 1567 1567 1632 1543 1543 1607 1543 1543 1607 1567 1567 1632 1568 1568 1633 1543 1543 1607 1568 1568 1633 1544 1544 1608 1544 1544 1608 1568 1568 1633 1569 1569 1634 1544 1544 1608 1569 1569 1634 1545 1545 1609 1545 1545 1609 1569 1569 1634 1570 1570 1635 1545 1545 1609 1570 1570 1635 1546 1546 1610 1546 1546 1610 1570 1570 1635 1571 1571 1636 1546 1546 1610 1571 1571 1636 1547 1547 1611 1547 1547 1611 1571 1571 1636 1572 1572 1637 1547 1547 1611 1572 1572 1637 1548 1548 1612 1548 1548 1612 1572 1572 1637 1573 1573 1638 1548 1548 1612 1573 1573 1638 1549 1549 1613 1549 1549 1613 1573 1573 1638 1574 1574 1639 1549 1549 1613 1574 1574 1639 1550 1550 1614 1550 1550 1614 1574 1574 1639 1575 1575 1640 1550 1550 1614 1575 1575 1640 1551 1551 1615 1551 1551 1615 1575 1575 1640 1576 1576 1641 1551 1551 1615 1576 1576 1641 1552 1552 1616 1552 1552 1616 1576 1576 1641 1577 1577 1642 1552 1552 1616 1577 1577 1642 1553 1553 1617 1553 1553 1617 1577 1577 1642 1578 1578 1643 1553 1553 1617 1578 1578 1643 1554 1554 1618 1554 1554 1618 1578 1578 1643 1579 1579 1644 1554 1554 1618 1579 1579 1644 1555 1555 1619 1555 1555 1619 1579 1579 1644 1580 1580 1645 1555 1555 1619 1580 1580 1645 1556 1556 1620 1556 1556 1620 1580 1580 1645 1581 1581 1646 1556 1556 1620 1581 1581 1646 1557 1557 1621 1557 1557 1621 1581 1581 1646 1582 1582 1647 1557 1557 1621 1582 1582 1647 1558 1558 1622 1558 1558 1622 1582 1582 1647 1583 1583 1648 1558 1558 1622 1583 1583 1648 1559 1559 1623 1559 1559 1623 1583 1583 1648 1560 1560 1649 1559 1559 1623 1560 1560 1649 1536 1536 1624 1560 1560 1625 1584 1584 1650 1585 1585 1651 1560 1560 1625 1585 1585 1651 1561 1561 1626 1561 1561 1626 1585 1585 1651 1586 1586 1652 1561 1561 1626 1586 1586 1652 1562 1562 1627 1562 1562 1627 1586 1586 1652 1587 1587 1653 1562 1562 1627 1587 1587 1653 1563 1563 1628 1563 1563 1628 1587 1587 1653 1588 1588 1654 1563 1563 1628 1588 1588 1654 1564 1564 1629 1564 1564 1629 1588 1588 1654 1589 1589 1655 1564 1564 1629 1589 1589 1655 1565 1565 1630 1565 1565 1630 1589 1589 1655 1590 1590 1656 1565 1565 1630 1590 1590 1656 1566 1566 1631 1566 1566 1631 1590 1590 1656 1591 1591 1657 1566 1566 1631 1591 1591 1657 1567 1567 1632 1567 1567 1632 1591 1591 1657 1592 1592 1658 1567 1567 1632 1592 1592 1658 1568 1568 1633 1568 1568 1633 1592 1592 1658 1593 1593 1659 1568 1568 1633 1593 1593 1659 1569 1569 1634 1569 1569 1634 1593 1593 1659 1594 1594 1660 1569 1569 1634 1594 1594 1660 1570 1570 1635 1570 1570 1635 1594 1594 1660 1595 1595 1661 1570 1570 1635 1595 1595 1661 1571 1571 1636 1571 1571 1636 1595 1595 1661 1596 1596 1662 1571 1571 1636 1596 1596 1662 1572 1572 1637 1572 1572 1637 1596 1596 1662 1597 1597 1663 1572 1572 1637 1597 1597 1663 1573 1573 1638 1573 1573 1638 1597 1597 1663 1598 1598 1664 1573 1573 1638 1598 1598 1664 1574 1574 1639 1574 1574 1639 1598 1598 1664 1599 1599 1665 1574 1574 1639 1599 1599 1665 1575 1575 1640 1575 1575 1640 1599 1599 1665 1600 1600 1666 1575 1575 1640 1600 1600 1666 1576 1576 1641 1576 1576 1641 1600 1600 1666 1601 1601 1667 1576 1576 1641 1601 1601 1667 1577 1577 1642 1577 1577 1642 1601 1601 1667 1602 1602 1668 1577 1577 1642 1602 1602 1668 1578 1578 1643 1578 1578 1643 1602 1602 1668 1603 1603 1669 1578 1578 1643 1603 1603 1669 1579 1579 1644 1579 1579 1644 1603 1603 1669 1604 1604 1670 1579 1579 1644 1604 1604 1670 1580 1580 1645 1580 1580 1645 1604 1604 1670 1605 1605 1671 1580 1580 1645 1605 1605 1671 1581 1581 1646 1581 1581 1646 1605 1605 1671 1606 1606 1672 1581 1581 1646 1606 1606 1672 1582 1582 1647 1582 1582 1647 1606 1606 1672 1607 1607 1673 1582 1582 1647 1607 1607 1673 1583 1583 1648 1583 1583 1648 1607 1607 1673 1584 1584 1674 1583 1583 1648 1584 1584 1674 1560 1560 1649 1584 1584 1650 1608 1608 1675 1609 1609 1676 1584 1584 1650 1609 1609 1676 1585 1585 1651 1585 1585 1651 1609 1609 1676 1610 1610 1677 1585 1585 1651 1610 1610 1677 1586 1586 1652 1586 1586 1652 1610 1610 1677 1611 1611 1678 1586 1586 1652 1611 1611 1678 1587 1587 1653 1587 1587 1653 1611 1611 1678 1612 1612 1679 1587 1587 1653 1612 1612 1679 1588 1588 1654 1588 1588 1654 1612 1612 1679 1613 1613 1680 1588 1588 1654 1613 1613 1680 1589 1589 1655 1589 1589 1655 1613 1613 1680 1614 1614 1681 1589 1589 1655 1614 1614 1681 1590 1590 1656 1590 1590 1656 1614 1614 1681 1615 1615 1682 1590 1590 1656 1615 1615 1682 1591 1591 1657 1591 1591 1657 1615 1615 1682 1616 1616 1683 1591 1591 1657 1616 1616 1683 1592 1592 1658 1592 1592 1658 1616 1616 1683 1617 1617 1684 1592 1592 1658 1617 1617 1684 1593 1593 1659 1593 1593 1659 1617 1617 1684 1618 1618 1685 1593 1593 1659 1618 1618 1685 1594 1594 1660 1594 1594 1660 1618 1618 1685 1619 1619 1686 1594 1594 1660 1619 1619 1686 1595 1595 1661 1595 1595 1661 1619 1619 1686 1620 1620 1687 1595 1595 1661 1620 1620 1687 1596 1596 1662 1596 1596 1662 1620 1620 1687 1621 1621 1688 1596 1596 1662 1621 1621 1688 1597 1597 1663 1597 1597 1663 1621 1621 1688 1622 1622 1689 1597 1597 1663 1622 1622 1689 1598 1598 1664 1598 1598 1664 1622 1622 1689 1623 1623 1690 1598 1598 1664 1623 1623 1690 1599 1599 1665 1599 1599 1665 1623 1623 1690 1624 1624 1691 1599 1599 1665 1624 1624 1691 1600 1600 1666 1600 1600 1666 1624 1624 1691 1625 1625 1692 1600 1600 1666 1625 1625 1692 1601 1601 1667 1601 1601 1667 1625 1625 1692 1626 1626 1693 1601 1601 1667 1626 1626 1693 1602 1602 1668 1602 1602 1668 1626 1626 1693 1627 1627 1694 1602 1602 1668 1627 1627 1694 1603 1603 1669 1603 1603 1669 1627 1627 1694 1628 1628 1695 1603 1603 1669 1628 1628 1695 1604 1604 1670 1604 1604 1670 1628 1628 1695 1629 1629 1696 1604 1604 1670 1629 1629 1696 1605 1605 1671 1605 1605 1671 1629 1629 1696 1630 1630 1697 1605 1605 1671 1630 1630 1697 1606 1606 1672 1606 1606 1672 1630 1630 1697 1631 1631 1698 1606 1606 1672 1631 1631 1698 1607 1607 1673 1607 1607 1673 1631 1631 1698 1608 1608 1699 1607 1607 1673 1608 1608 1699 1584 1584 1674 1608 1608 1675 1632 1632 1700 1633 1633 1701 1608 1608 1675 1633 1633 1701 1609 1609 1676 1609 1609 1676 1633 1633 1701 1634 1634 1702 1609 1609 1676 1634 1634 1702 1610 1610 1677 1610 1610 1677 1634 1634 1702 1635 1635 1703 1610 1610 1677 1635 1635 1703 1611 1611 1678 1611 1611 1678 1635 1635 1703 1636 1636 1704 1611 1611 1678 1636 1636 1704 1612 1612 1679 1612 1612 1679 1636 1636 1704 1637 1637 1705 1612 1612 1679 1637 1637 1705 1613 1613 1680 1613 1613 1680 1637 1637 1705 1638 1638 1706 1613 1613 1680 1638 1638 1706 1614 1614 1681 1614 1614 1681 1638 1638 1706 1639 1639 1707 1614 1614 1681 1639 1639 1707 1615 1615 1682 1615 1615 1682 1639 1639 1707 1640 1640 1708 1615 1615 1682 1640 1640 1708 1616 1616 1683 1616 1616 1683 1640 1640 1708 1641 1641 1709 1616 1616 1683 1641 1641 1709 1617 1617 1684 1617 1617 1684 1641 1641 1709 1642 1642 1710 1617 1617 1684 1642 1642 1710 1618 1618 1685 1618 1618 1685 1642 1642 1710 1643 1643 1711 1618 1618 1685 1643 1643 1711 1619 1619 1686 1619 1619 1686 1643 1643 1711 1644 1644 1712 1619 1619 1686 1644 1644 1712 1620 1620 1687 1620 1620 1687 1644 1644 1712 1645 1645 1713 1620 1620 1687 1645 1645 1713 1621 1621 1688 1621 1621 1688 1645 1645 1713 1646 1646 1714 1621 1621 1688 1646 1646 1714 1622 1622 1689 1622 1622 1689 1646 1646 1714 1647 1647 1715 1622 1622 1689 1647 1647 1715 1623 1623 1690 1623 1623 1690 1647 1647 1715 1648 1648 1716 1623 1623 1690 1648 1648 1716 1624 1624 1691 1624 1624 1691 1648 1648 1716 1649 1649 1717 1624 1624 1691 1649 1649 1717 1625 1625 1692 1625 1625 1692 1649 1649 1717 1650 1650 1718 1625 1625 1692 1650 1650 1718 1626 1626 1693 1626 1626 1693 1650 1650 1718 1651 1651 1719 1626 1626 1693 1651 1651 1719 1627 1627 1694 1627 1627 1694 1651 1651 1719 1652 1652 1720 1627 1627 1694 1652 1652 1720 1628 1628 1695 1628 1628 1695 1652 1652 1720 1653 1653 1721 1628 1628 1695 1653 1653 1721 1629 1629 1696 1629 1629 1696 1653 1653 1721 1654 1654 1722 1629 1629 1696 1654 1654 1722 1630 1630 1697 1630 1630 1697 1654 1654 1722 1655 1655 1723 1630 1630 1697 1655 1655 1723 1631 1631 1698 1631 1631 1698 1655 1655 1723 1632 1632 1724 1631 1631 1698 1632 1632 1724 1608 1608 1699 1632 1632 1700 1656 1656 1725 1657 1657 1726 1632 1632 1700 1657 1657 1726 1633 1633 1701 1633 1633 1701 1657 1657 1726 1658 1658 1727 1633 1633 1701 1658 1658 1727 1634 1634 1702 1634 1634 1702 1658 1658 1727 1659 1659 1728 1634 1634 1702 1659 1659 1728 1635 1635 1703 1635 1635 1703 1659 1659 1728 1660 1660 1729 1635 1635 1703 1660 1660 1729 1636 1636 1704 1636 1636 1704 1660 1660 1729 1661 1661 1730 1636 1636 1704 1661 1661 1730 1637 1637 1705 1637 1637 1705 1661 1661 1730 1662 1662 1731 1637 1637 1705 1662 1662 1731 1638 1638 1706 1638 1638 1706 1662 1662 1731 1663 1663 1732 1638 1638 1706 1663 1663 1732 1639 1639 1707 1639 1639 1707 1663 1663 1732 1664 1664 1733 1639 1639 1707 1664 1664 1733 1640 1640 1708 1640 1640 1708 1664 1664 1733 1665 1665 1734 1640 1640 1708 1665 1665 1734 1641 1641 1709 1641 1641 1709 1665 1665 1734 1666 1666 1735 1641 1641 1709 1666 1666 1735 1642 1642 1710 1642 1642 1710 1666 1666 1735 1667 1667 1736 1642 1642 1710 1667 1667 1736 1643 1643 1711 1643 1643 1711 1667 1667 1736 1668 1668 1737 1643 1643 1711 1668 1668 1737 1644 1644 1712 1644 1644 1712 1668 1668 1737 1669 1669 1738 1644 1644 1712 1669 1669 1738 1645 1645 1713 1645 1645 1713 1669 1669 1738 1670 1670 1739 1645 1645 1713 1670 1670 1739 1646 1646 1714 1646 1646 1714 1670 1670 1739 1671 1671 1740 1646 1646 1714 1671 1671 1740 1647 1647 1715 1647 1647 1715 1671 1671 1740 1672 1672 1741 1647 1647 1715 1672 1672 1741 1648 1648 1716 1648 1648 1716 1672 1672 1741 1673 1673 1742 1648 1648 1716 1673 1673 1742 1649 1649 1717 1649 1649 1717 1673 1673 1742 1674 1674 1743 1649 1649 1717 1674 1674 1743 1650 1650 1718 1650 1650 1718 1674 1674 1743 1675 1675 1744 1650 1650 1718 1675 1675 1744 1651 1651 1719 1651 1651 1719 1675 1675 1744 1676 1676 1745 1651 1651 1719 1676 1676 1745 1652 1652 1720 1652 1652 1720 1676 1676 1745 1677 1677 1746 1652 1652 1720 1677 1677 1746 1653 1653 1721 1653 1653 1721 1677 1677 1746 1678 1678 1747 1653 1653 1721 1678 1678 1747 1654 1654 1722 1654 1654 1722 1678 1678 1747 1679 1679 1748 1654 1654 1722 1679 1679 1748 1655 1655 1723 1655 1655 1723 1679 1679 1748 1656 1656 1749 1655 1655 1723 1656 1656 1749 1632 1632 1724 1656 1656 1725 1680 1680 1750 1681 1681 1751 1656 1656 1725 1681 1681 1751 1657 1657 1726 1657 1657 1726 1681 1681 1751 1682 1682 1752 1657 1657 1726 1682 1682 1752 1658 1658 1727 1658 1658 1727 1682 1682 1752 1683 1683 1753 1658 1658 1727 1683 1683 1753 1659 1659 1728 1659 1659 1728 1683 1683 1753 1684 1684 1754 1659 1659 1728 1684 1684 1754 1660 1660 1729 1660 1660 1729 1684 1684 1754 1685 1685 1755 1660 1660 1729 1685 1685 1755 1661 1661 1730 1661 1661 1730 1685 1685 1755 1686 1686 1756 1661 1661 1730 1686 1686 1756 1662 1662 1731 1662 1662 1731 1686 1686 1756 1687 1687 1757 1662 1662 1731 1687 1687 1757 1663 1663 1732 1663 1663 1732 1687 1687 1757 1688 1688 1758 1663 1663 1732 1688 1688 1758 1664 1664 1733 1664 1664 1733 1688 1688 1758 1689 1689 1759 1664 1664 1733 1689 1689 1759 1665 1665 1734 1665 1665 1734 1689 1689 1759 1690 1690 1760 1665 1665 1734 1690 1690 1760 1666 1666 1735 1666 1666 1735 1690 1690 1760 1691 1691 1761 1666 1666 1735 1691 1691 1761 1667 1667 1736 1667 1667 1736 1691 1691 1761 1692 1692 1762 1667 1667 1736 1692 1692 1762 1668 1668 1737 1668 1668 1737 1692 1692 1762 1693 1693 1763 1668 1668 1737 1693 1693 1763 1669 1669 1738 1669 1669 1738 1693 1693 1763 1694 1694 1764 1669 1669 1738 1694 1694 1764 1670 1670 1739 1670 1670 1739 1694 1694 1764 1695 1695 1765 1670 1670 1739 1695 1695 1765 1671 1671 1740 1671 1671 1740 1695 1695 1765 1696 1696 1766 1671 1671 1740 1696 1696 1766 1672 1672 1741 1672 1672 1741 1696 1696 1766 1697 1697 1767 1672 1672 1741 1697 1697 1767 1673 1673 1742 1673 1673 1742 1697 1697 1767 1698 1698 1768 1673 1673 1742 1698 1698 1768 1674 1674 1743 1674 1674 1743 1698 1698 1768 1699 1699 1769 1674 1674 1743 1699 1699 1769 1675 1675 1744 1675 1675 1744 1699 1699 1769 1700 1700 1770 1675 1675 1744 1700 1700 1770 1676 1676 1745 1676 1676 1745 1700 1700 1770 1701 1701 1771 1676 1676 1745 1701 1701 1771 1677 1677 1746 1677 1677 1746 1701 1701 1771 1702 1702 1772 1677 1677 1746 1702 1702 1772 1678 1678 1747 1678 1678 1747 1702 1702 1772 1703 1703 1773 1678 1678 1747 1703 1703 1773 1679 1679 1748 1679 1679 1748 1703 1703 1773 1680 1680 1774 1679 1679 1748 1680 1680 1774 1656 1656 1749 1680 1680 1750 1704 1704 1775 1705 1705 1776 1680 1680 1750 1705 1705 1776 1681 1681 1751 1681 1681 1751 1705 1705 1776 1706 1706 1777 1681 1681 1751 1706 1706 1777 1682 1682 1752 1682 1682 1752 1706 1706 1777 1707 1707 1778 1682 1682 1752 1707 1707 1778 1683 1683 1753 1683 1683 1753 1707 1707 1778 1708 1708 1779 1683 1683 1753 1708 1708 1779 1684 1684 1754 1684 1684 1754 1708 1708 1779 1709 1709 1780 1684 1684 1754 1709 1709 1780 1685 1685 1755 1685 1685 1755 1709 1709 1780 1710 1710 1781 1685 1685 1755 1710 1710 1781 1686 1686 1756 1686 1686 1756 1710 1710 1781 1711 1711 1782 1686 1686 1756 1711 1711 1782 1687 1687 1757 1687 1687 1757 1711 1711 1782 1712 1712 1783 1687 1687 1757 1712 1712 1783 1688 1688 1758 1688 1688 1758 1712 1712 1783 1713 1713 1784 1688 1688 1758 1713 1713 1784 1689 1689 1759 1689 1689 1759 1713 1713 1784 1714 1714 1785 1689 1689 1759 1714 1714 1785 1690 1690 1760 1690 1690 1760 1714 1714 1785 1715 1715 1786 1690 1690 1760 1715 1715 1786 1691 1691 1761 1691 1691 1761 1715 1715 1786 1716 1716 1787 1691 1691 1761 1716 1716 1787 1692 1692 1762 1692 1692 1762 1716 1716 1787 1717 1717 1788 1692 1692 1762 1717 1717 1788 1693 1693 1763 1693 1693 1763 1717 1717 1788 1718 1718 1789 1693 1693 1763 1718 1718 1789 1694 1694 1764 1694 1694 1764 1718 1718 1789 1719 1719 1790 1694 1694 1764 1719 1719 1790 1695 1695 1765 1695 1695 1765 1719 1719 1790 1720 1720 1791 1695 1695 1765 1720 1720 1791 1696 1696 1766 1696 1696 1766 1720 1720 1791 1721 1721 1792 1696 1696 1766 1721 1721 1792 1697 1697 1767 1697 1697 1767 1721 1721 1792 1722 1722 1793 1697 1697 1767 1722 1722 1793 1698 1698 1768 1698 1698 1768 1722 1722 1793 1723 1723 1794 1698 1698 1768 1723 1723 1794 1699 1699 1769 1699 1699 1769 1723 1723 1794 1724 1724 1795 1699 1699 1769 1724 1724 1795 1700 1700 1770 1700 1700 1770 1724 1724 1795 1725 1725 1796 1700 1700 1770 1725 1725 1796 1701 1701 1771 1701 1701 1771 1725 1725 1796 1726 1726 1797 1701 1701 1771 1726 1726 1797 1702 1702 1772 1702 1702 1772 1726 1726 1797 1727 1727 1798 1702 1702 1772 1727 1727 1798 1703 1703 1773 1703 1703 1773 1727 1727 1798 1704 1704 1799 1703 1703 1773 1704 1704 1799 1680 1680 1774 1704 1704 1775 1728 1728 1800 1729 1729 1801 1704 1704 1775 1729 1729 1801 1705 1705 1776 1705 1705 1776 1729 1729 1801 1730 1730 1802 1705 1705 1776 1730 1730 1802 1706 1706 1777 1706 1706 1777 1730 1730 1802 1731 1731 1803 1706 1706 1777 1731 1731 1803 1707 1707 1778 1707 1707 1778 1731 1731 1803 1732 1732 1804 1707 1707 1778 1732 1732 1804 1708 1708 1779 1708 1708 1779 1732 1732 1804 1733 1733 1805 1708 1708 1779 1733 1733 1805 1709 1709 1780 1709 1709 1780 1733 1733 1805 1734 1734 1806 1709 1709 1780 1734 1734 1806 1710 1710 1781 1710 1710 1781 1734 1734 1806 1735 1735 1807 1710 1710 1781 1735 1735 1807 1711 1711 1782 1711 1711 1782 1735 1735 1807 1736 1736 1808 1711 1711 1782 1736 1736 1808 1712 1712 1783 1712 1712 1783 1736 1736 1808 1737 1737 1809 1712 1712 1783 1737 1737 1809 1713 1713 1784 1713 1713 1784 1737 1737 1809 1738 1738 1810 1713 1713 1784 1738 1738 1810 1714 1714 1785 1714 1714 1785 1738 1738 1810 1739 1739 1811 1714 1714 1785 1739 1739 1811 1715 1715 1786 1715 1715 1786 1739 1739 1811 1740 1740 1812 1715 1715 1786 1740 1740 1812 1716 1716 1787 1716 1716 1787 1740 1740 1812 1741 1741 1813 1716 1716 1787 1741 1741 1813 1717 1717 1788 1717 1717 1788 1741 1741 1813 1742 1742 1814 1717 1717 1788 1742 1742 1814 1718 1718 1789 1718 1718 1789 1742 1742 1814 1743 1743 1815 1718 1718 1789 1743 1743 1815 1719 1719 1790 1719 1719 1790 1743 1743 1815 1744 1744 1816 1719 1719 1790 1744 1744 1816 1720 1720 1791 1720 1720 1791 1744 1744 1816 1745 1745 1817 1720 1720 1791 1745 1745 1817 1721 1721 1792 1721 1721 1792 1745 1745 1817 1746 1746 1818 1721 1721 1792 1746 1746 1818 1722 1722 1793 1722 1722 1793 1746 1746 1818 1747 1747 1819 1722 1722 1793 1747 1747 1819 1723 1723 1794 1723 1723 1794 1747 1747 1819 1748 1748 1820 1723 1723 1794 1748 1748 1820 1724 1724 1795 1724 1724 1795 1748 1748 1820 1749 1749 1821 1724 1724 1795 1749 1749 1821 1725 1725 1796 1725 1725 1796 1749 1749 1821 1750 1750 1822 1725 1725 1796 1750 1750 1822 1726 1726 1797 1726 1726 1797 1750 1750 1822 1751 1751 1823 1726 1726 1797 1751 1751 1823 1727 1727 1798 1727 1727 1798 1751 1751 1823 1728 1728 1824 1727 1727 1798 1728 1728 1824 1704 1704 1799 1728 1728 1800 1752 1752 1825 1753 1753 1826 1728 1728 1800 1753 1753 1826 1729 1729 1801 1729 1729 1801 1753 1753 1826 1754 1754 1827 1729 1729 1801 1754 1754 1827 1730 1730 1802 1730 1730 1802 1754 1754 1827 1755 1755 1828 1730 1730 1802 1755 1755 1828 1731 1731 1803 1731 1731 1803 1755 1755 1828 1756 1756 1829 1731 1731 1803 1756 1756 1829 1732 1732 1804 1732 1732 1804 1756 1756 1829 1757 1757 1830 1732 1732 1804 1757 1757 1830 1733 1733 1805 1733 1733 1805 1757 1757 1830 1758 1758 1831 1733 1733 1805 1758 1758 1831 1734 1734 1806 1734 1734 1806 1758 1758 1831 1759 1759 1832 1734 1734 1806 1759 1759 1832 1735 1735 1807 1735 1735 1807 1759 1759 1832 1760 1760 1833 1735 1735 1807 1760 1760 1833 1736 1736 1808 1736 1736 1808 1760 1760 1833 1761 1761 1834 1736 1736 1808 1761 1761 1834 1737 1737 1809 1737 1737 1809 1761 1761 1834 1762 1762 1835 1737 1737 1809 1762 1762 1835 1738 1738 1810 1738 1738 1810 1762 1762 1835 1763 1763 1836 1738 1738 1810 1763 1763 1836 1739 1739 1811 1739 1739 1811 1763 1763 1836 1764 1764 1837 1739 1739 1811 1764 1764 1837 1740 1740 1812 1740 1740 1812 1764 1764 1837 1765 1765 1838 1740 1740 1812 1765 1765 1838 1741 1741 1813 1741 1741 1813 1765 1765 1838 1766 1766 1839 1741 1741 1813 1766 1766 1839 1742 1742 1814 1742 1742 1814 1766 1766 1839 1767 1767 1840 1742 1742 1814 1767 1767 1840 1743 1743 1815 1743 1743 1815 1767 1767 1840 1768 1768 1841 1743 1743 1815 1768 1768 1841 1744 1744 1816 1744 1744 1816 1768 1768 1841 1769 1769 1842 1744 1744 1816 1769 1769 1842 1745 1745 1817 1745 1745 1817 1769 1769 1842 1770 1770 1843 1745 1745 1817 1770 1770 1843 1746 1746 1818 1746 1746 1818 1770 1770 1843 1771 1771 1844 1746 1746 1818 1771 1771 1844 1747 1747 1819 1747 1747 1819 1771 1771 1844 1772 1772 1845 1747 1747 1819 1772 1772 1845 1748 1748 1820 1748 1748 1820 1772 1772 1845 1773 1773 1846 1748 1748 1820 1773 1773 1846 1749 1749 1821 1749 1749 1821 1773 1773 1846 1774 1774 1847 1749 1749 1821 1774 1774 1847 1750 1750 1822 1750 1750 1822 1774 1774 1847 1775 1775 1848 1750 1750 1822 1775 1775 1848 1751 1751 1823 1751 1751 1823 1775 1775 1848 1752 1752 1849 1751 1751 1823 1752 1752 1849 1728 1728 1824 1752 1752 1825 1776 1776 1850 1777 1777 1851 1752 1752 1825 1777 1777 1851 1753 1753 1826 1753 1753 1826 1777 1777 1851 1778 1778 1852 1753 1753 1826 1778 1778 1852 1754 1754 1827 1754 1754 1827 1778 1778 1852 1779 1779 1853 1754 1754 1827 1779 1779 1853 1755 1755 1828 1755 1755 1828 1779 1779 1853 1780 1780 1854 1755 1755 1828 1780 1780 1854 1756 1756 1829 1756 1756 1829 1780 1780 1854 1781 1781 1855 1756 1756 1829 1781 1781 1855 1757 1757 1830 1757 1757 1830 1781 1781 1855 1782 1782 1856 1757 1757 1830 1782 1782 1856 1758 1758 1831 1758 1758 1831 1782 1782 1856 1783 1783 1857 1758 1758 1831 1783 1783 1857 1759 1759 1832 1759 1759 1832 1783 1783 1857 1784 1784 1858 1759 1759 1832 1784 1784 1858 1760 1760 1833 1760 1760 1833 1784 1784 1858 1785 1785 1859 1760 1760 1833 1785 1785 1859 1761 1761 1834 1761 1761 1834 1785 1785 1859 1786 1786 1860 1761 1761 1834 1786 1786 1860 1762 1762 1835 1762 1762 1835 1786 1786 1860 1787 1787 1861 1762 1762 1835 1787 1787 1861 1763 1763 1836 1763 1763 1836 1787 1787 1861 1788 1788 1862 1763 1763 1836 1788 1788 1862 1764 1764 1837 1764 1764 1837 1788 1788 1862 1789 1789 1863 1764 1764 1837 1789 1789 1863 1765 1765 1838 1765 1765 1838 1789 1789 1863 1790 1790 1864 1765 1765 1838 1790 1790 1864 1766 1766 1839 1766 1766 1839 1790 1790 1864 1791 1791 1865 1766 1766 1839 1791 1791 1865 1767 1767 1840 1767 1767 1840 1791 1791 1865 1792 1792 1866 1767 1767 1840 1792 1792 1866 1768 1768 1841 1768 1768 1841 1792 1792 1866 1793 1793 1867 1768 1768 1841 1793 1793 1867 1769 1769 1842 1769 1769 1842 1793 1793 1867 1794 1794 1868 1769 1769 1842 1794 1794 1868 1770 1770 1843 1770 1770 1843 1794 1794 1868 1795 1795 1869 1770 1770 1843 1795 1795 1869 1771 1771 1844 1771 1771 1844 1795 1795 1869 1796 1796 1870 1771 1771 1844 1796 1796 1870 1772 1772 1845 1772 1772 1845 1796 1796 1870 1797 1797 1871 1772 1772 1845 1797 1797 1871 1773 1773 1846 1773 1773 1846 1797 1797 1871 1798 1798 1872 1773 1773 1846 1798 1798 1872 1774 1774 1847 1774 1774 1847 1798 1798 1872 1799 1799 1873 1774 1774 1847 1799 1799 1873 1775 1775 1848 1775 1775 1848 1799 1799 1873 1776 1776 1874 1775 1775 1848 1776 1776 1874 1752 1752 1849 1776 1776 1850 1800 1800 1875 1801 1801 1876 1776 1776 1850 1801 1801 1876 1777 1777 1851 1777 1777 1851 1801 1801 1876 1802 1802 1877 1777 1777 1851 1802 1802 1877 1778 1778 1852 1778 1778 1852 1802 1802 1877 1803 1803 1878 1778 1778 1852 1803 1803 1878 1779 1779 1853 1779 1779 1853 1803 1803 1878 1804 1804 1879 1779 1779 1853 1804 1804 1879 1780 1780 1854 1780 1780 1854 1804 1804 1879 1805 1805 1880 1780 1780 1854 1805 1805 1880 1781 1781 1855 1781 1781 1855 1805 1805 1880 1806 1806 1881 1781 1781 1855 1806 1806 1881 1782 1782 1856 1782 1782 1856 1806 1806 1881 1807 1807 1882 1782 1782 1856 1807 1807 1882 1783 1783 1857 1783 1783 1857 1807 1807 1882 1808 1808 1883 1783 1783 1857 1808 1808 1883 1784 1784 1858 1784 1784 1858 1808 1808 1883 1809 1809 1884 1784 1784 1858 1809 1809 1884 1785 1785 1859 1785 1785 1859 1809 1809 1884 1810 1810 1885 1785 1785 1859 1810 1810 1885 1786 1786 1860 1786 1786 1860 1810 1810 1885 1811 1811 1886 1786 1786 1860 1811 1811 1886 1787 1787 1861 1787 1787 1861 1811 1811 1886 1812 1812 1887 1787 1787 1861 1812 1812 1887 1788 1788 1862 1788 1788 1862 1812 1812 1887 1813 1813 1888 1788 1788 1862 1813 1813 1888 1789 1789 1863 1789 1789 1863 1813 1813 1888 1814 1814 1889 1789 1789 1863 1814 1814 1889 1790 1790 1864 1790 1790 1864 1814 1814 1889 1815 1815 1890 1790 1790 1864 1815 1815 1890 1791 1791 1865 1791 1791 1865 1815 1815 1890 1816 1816 1891 1791 1791 1865 1816 1816 1891 1792 1792 1866 1792 1792 1866 1816 1816 1891 1817 1817 1892 1792 1792 1866 1817 1817 1892 1793 1793 1867 1793 1793 1867 1817 1817 1892 1818 1818 1893 1793 1793 1867 1818 1818 1893 1794 1794 1868 1794 1794 1868 1818 1818 1893 1819 1819 1894 1794 1794 1868 1819 1819 1894 1795 1795 1869 1795 1795 1869 1819 1819 1894 1820 1820 1895 1795 1795 1869 1820 1820 1895 1796 1796 1870 1796 1796 1870 1820 1820 1895 1821 1821 1896 1796 1796 1870 1821 1821 1896 1797 1797 1871 1797 1797 1871 1821 1821 1896 1822 1822 1897 1797 1797 1871 1822 1822 1897 1798 1798 1872 1798 1798 1872 1822 1822 1897 1823 1823 1898 1798 1798 1872 1823 1823 1898 1799 1799 1873 1799 1799 1873 1823 1823 1898 1800 1800 1899 1799 1799 1873 1800 1800 1899 1776 1776 1874 1800 1800 1875 1824 1824 1900 1825 1825 1901 1800 1800 1875 1825 1825 1901 1801 1801 1876 1801 1801 1876 1825 1825 1901 1826 1826 1902 1801 1801 1876 1826 1826 1902 1802 1802 1877 1802 1802 1877 1826 1826 1902 1827 1827 1903 1802 1802 1877 1827 1827 1903 1803 1803 1878 1803 1803 1878 1827 1827 1903 1828 1828 1904 1803 1803 1878 1828 1828 1904 1804 1804 1879 1804 1804 1879 1828 1828 1904 1829 1829 1905 1804 1804 1879 1829 1829 1905 1805 1805 1880 1805 1805 1880 1829 1829 1905 1830 1830 1906 1805 1805 1880 1830 1830 1906 1806 1806 1881 1806 1806 1881 1830 1830 1906 1831 1831 1907 1806 1806 1881 1831 1831 1907 1807 1807 1882 1807 1807 1882 1831 1831 1907 1832 1832 1908 1807 1807 1882 1832 1832 1908 1808 1808 1883 1808 1808 1883 1832 1832 1908 1833 1833 1909 1808 1808 1883 1833 1833 1909 1809 1809 1884 1809 1809 1884 1833 1833 1909 1834 1834 1910 1809 1809 1884 1834 1834 1910 1810 1810 1885 1810 1810 1885 1834 1834 1910 1835 1835 1911 1810 1810 1885 1835 1835 1911 1811 1811 1886 1811 1811 1886 1835 1835 1911 1836 1836 1912 1811 1811 1886 1836 1836 1912 1812 1812 1887 1812 1812 1887 1836 1836 1912 1837 1837 1913 1812 1812 1887 1837 1837 1913 1813 1813 1888 1813 1813 1888 1837 1837 1913 1838 1838 1914 1813 1813 1888 1838 1838 1914 1814 1814 1889 1814 1814 1889 1838 1838 1914 1839 1839 1915 1814 1814 1889 1839 1839 1915 1815 1815 1890 1815 1815 1890 1839 1839 1915 1840 1840 1916 1815 1815 1890 1840 1840 1916 1816 1816 1891 1816 1816 1891 1840 1840 1916 1841 1841 1917 1816 1816 1891 1841 1841 1917 1817 1817 1892 1817 1817 1892 1841 1841 1917 1842 1842 1918 1817 1817 1892 1842 1842 1918 1818 1818 1893 1818 1818 1893 1842 1842 1918 1843 1843 1919 1818 1818 1893 1843 1843 1919 1819 1819 1894 1819 1819 1894 1843 1843 1919 1844 1844 1920 1819 1819 1894 1844 1844 1920 1820 1820 1895 1820 1820 1895 1844 1844 1920 1845 1845 1921 1820 1820 1895 1845 1845 1921 1821 1821 1896 1821 1821 1896 1845 1845 1921 1846 1846 1922 1821 1821 1896 1846 1846 1922 1822 1822 1897 1822 1822 1897 1846 1846 1922 1847 1847 1923 1822 1822 1897 1847 1847 1923 1823 1823 1898 1823 1823 1898 1847 1847 1923 1824 1824 1924 1823 1823 1898 1824 1824 1924 1800 1800 1899 1824 1824 1900 1848 1848 1925 1849 1849 1926 1824 1824 1900 1849 1849 1926 1825 1825 1901 1825 1825 1901 1849 1849 1926 1850 1850 1927 1825 1825 1901 1850 1850 1927 1826 1826 1902 1826 1826 1902 1850 1850 1927 1851 1851 1928 1826 1826 1902 1851 1851 1928 1827 1827 1903 1827 1827 1903 1851 1851 1928 1852 1852 1929 1827 1827 1903 1852 1852 1929 1828 1828 1904 1828 1828 1904 1852 1852 1929 1853 1853 1930 1828 1828 1904 1853 1853 1930 1829 1829 1905 1829 1829 1905 1853 1853 1930 1854 1854 1931 1829 1829 1905 1854 1854 1931 1830 1830 1906 1830 1830 1906 1854 1854 1931 1855 1855 1932 1830 1830 1906 1855 1855 1932 1831 1831 1907 1831 1831 1907 1855 1855 1932 1856 1856 1933 1831 1831 1907 1856 1856 1933 1832 1832 1908 1832 1832 1908 1856 1856 1933 1857 1857 1934 1832 1832 1908 1857 1857 1934 1833 1833 1909 1833 1833 1909 1857 1857 1934 1858 1858 1935 1833 1833 1909 1858 1858 1935 1834 1834 1910 1834 1834 1910 1858 1858 1935 1859 1859 1936 1834 1834 1910 1859 1859 1936 1835 1835 1911 1835 1835 1911 1859 1859 1936 1860 1860 1937 1835 1835 1911 1860 1860 1937 1836 1836 1912 1836 1836 1912 1860 1860 1937 1861 1861 1938 1836 1836 1912 1861 1861 1938 1837 1837 1913 1837 1837 1913 1861 1861 1938 1862 1862 1939 1837 1837 1913 1862 1862 1939 1838 1838 1914 1838 1838 1914 1862 1862 1939 1863 1863 1940 1838 1838 1914 1863 1863 1940 1839 1839 1915 1839 1839 1915 1863 1863 1940 1864 1864 1941 1839 1839 1915 1864 1864 1941 1840 1840 1916 1840 1840 1916 1864 1864 1941 1865 1865 1942 1840 1840 1916 1865 1865 1942 1841 1841 1917 1841 1841 1917 1865 1865 1942 1866 1866 1943 1841 1841 1917 1866 1866 1943 1842 1842 1918 1842 1842 1918 1866 1866 1943 1867 1867 1944 1842 1842 1918 1867 1867 1944 1843 1843 1919 1843 1843 1919 1867 1867 1944 1868 1868 1945 1843 1843 1919 1868 1868 1945 1844 1844 1920 1844 1844 1920 1868 1868 1945 1869 1869 1946 1844 1844 1920 1869 1869 1946 1845 1845 1921 1845 1845 1921 1869 1869 1946 1870 1870 1947 1845 1845 1921 1870 1870 1947 1846 1846 1922 1846 1846 1922 1870 1870 1947 1871 1871 1948 1846 1846 1922 1871 1871 1948 1847 1847 1923 1847 1847 1923 1871 1871 1948 1848 1848 1949 1847 1847 1923 1848 1848 1949 1824 1824 1924 1848 1848 1925 1872 1872 1950 1873 1873 1951 1848 1848 1925 1873 1873 1951 1849 1849 1926 1849 1849 1926 1873 1873 1951 1874 1874 1952 1849 1849 1926 1874 1874 1952 1850 1850 1927 1850 1850 1927 1874 1874 1952 1875 1875 1953 1850 1850 1927 1875 1875 1953 1851 1851 1928 1851 1851 1928 1875 1875 1953 1876 1876 1954 1851 1851 1928 1876 1876 1954 1852 1852 1929 1852 1852 1929 1876 1876 1954 1877 1877 1955 1852 1852 1929 1877 1877 1955 1853 1853 1930 1853 1853 1930 1877 1877 1955 1878 1878 1956 1853 1853 1930 1878 1878 1956 1854 1854 1931 1854 1854 1931 1878 1878 1956 1879 1879 1957 1854 1854 1931 1879 1879 1957 1855 1855 1932 1855 1855 1932 1879 1879 1957 1880 1880 1958 1855 1855 1932 1880 1880 1958 1856 1856 1933 1856 1856 1933 1880 1880 1958 1881 1881 1959 1856 1856 1933 1881 1881 1959 1857 1857 1934 1857 1857 1934 1881 1881 1959 1882 1882 1960 1857 1857 1934 1882 1882 1960 1858 1858 1935 1858 1858 1935 1882 1882 1960 1883 1883 1961 1858 1858 1935 1883 1883 1961 1859 1859 1936 1859 1859 1936 1883 1883 1961 1884 1884 1962 1859 1859 1936 1884 1884 1962 1860 1860 1937 1860 1860 1937 1884 1884 1962 1885 1885 1963 1860 1860 1937 1885 1885 1963 1861 1861 1938 1861 1861 1938 1885 1885 1963 1886 1886 1964 1861 1861 1938 1886 1886 1964 1862 1862 1939 1862 1862 1939 1886 1886 1964 1887 1887 1965 1862 1862 1939 1887 1887 1965 1863 1863 1940 1863 1863 1940 1887 1887 1965 1888 1888 1966 1863 1863 1940 1888 1888 1966 1864 1864 1941 1864 1864 1941 1888 1888 1966 1889 1889 1967 1864 1864 1941 1889 1889 1967 1865 1865 1942 1865 1865 1942 1889 1889 1967 1890 1890 1968 1865 1865 1942 1890 1890 1968 1866 1866 1943 1866 1866 1943 1890 1890 1968 1891 1891 1969 1866 1866 1943 1891 1891 1969 1867 1867 1944 1867 1867 1944 1891 1891 1969 1892 1892 1970 1867 1867 1944 1892 1892 1970 1868 1868 1945 1868 1868 1945 1892 1892 1970 1893 1893 1971 1868 1868 1945 1893 1893 1971 1869 1869 1946 1869 1869 1946 1893 1893 1971 1894 1894 1972 1869 1869 1946 1894 1894 1972 1870 1870 1947 1870 1870 1947 1894 1894 1972 1895 1895 1973 1870 1870 1947 1895 1895 1973 1871 1871 1948 1871 1871 1948 1895 1895 1973 1872 1872 1974 1871 1871 1948 1872 1872 1974 1848 1848 1949 1872 1872 1950 1896 1896 1975 1897 1897 1976 1872 1872 1950 1897 1897 1976 1873 1873 1951 1873 1873 1951 1897 1897 1976 1898 1898 1977 1873 1873 1951 1898 1898 1977 1874 1874 1952 1874 1874 1952 1898 1898 1977 1899 1899 1978 1874 1874 1952 1899 1899 1978 1875 1875 1953 1875 1875 1953 1899 1899 1978 1900 1900 1979 1875 1875 1953 1900 1900 1979 1876 1876 1954 1876 1876 1954 1900 1900 1979 1901 1901 1980 1876 1876 1954 1901 1901 1980 1877 1877 1955 1877 1877 1955 1901 1901 1980 1902 1902 1981 1877 1877 1955 1902 1902 1981 1878 1878 1956 1878 1878 1956 1902 1902 1981 1903 1903 1982 1878 1878 1956 1903 1903 1982 1879 1879 1957 1879 1879 1957 1903 1903 1982 1904 1904 1983 1879 1879 1957 1904 1904 1983 1880 1880 1958 1880 1880 1958 1904 1904 1983 1905 1905 1984 1880 1880 1958 1905 1905 1984 1881 1881 1959 1881 1881 1959 1905 1905 1984 1906 1906 1985 1881 1881 1959 1906 1906 1985 1882 1882 1960 1882 1882 1960 1906 1906 1985 1907 1907 1986 1882 1882 1960 1907 1907 1986 1883 1883 1961 1883 1883 1961 1907 1907 1986 1908 1908 1987 1883 1883 1961 1908 1908 1987 1884 1884 1962 1884 1884 1962 1908 1908 1987 1909 1909 1988 1884 1884 1962 1909 1909 1988 1885 1885 1963 1885 1885 1963 1909 1909 1988 1910 1910 1989 1885 1885 1963 1910 1910 1989 1886 1886 1964 1886 1886 1964 1910 1910 1989 1911 1911 1990 1886 1886 1964 1911 1911 1990 1887 1887 1965 1887 1887 1965 1911 1911 1990 1912 1912 1991 1887 1887 1965 1912 1912 1991 1888 1888 1966 1888 1888 1966 1912 1912 1991 1913 1913 1992 1888 1888 1966 1913 1913 1992 1889 1889 1967 1889 1889 1967 1913 1913 1992 1914 1914 1993 1889 1889 1967 1914 1914 1993 1890 1890 1968 1890 1890 1968 1914 1914 1993 1915 1915 1994 1890 1890 1968 1915 1915 1994 1891 1891 1969 1891 1891 1969 1915 1915 1994 1916 1916 1995 1891 1891 1969 1916 1916 1995 1892 1892 1970 1892 1892 1970 1916 1916 1995 1917 1917 1996 1892 1892 1970 1917 1917 1996 1893 1893 1971 1893 1893 1971 1917 1917 1996 1918 1918 1997 1893 1893 1971 1918 1918 1997 1894 1894 1972 1894 1894 1972 1918 1918 1997 1919 1919 1998 1894 1894 1972 1919 1919 1998 1895 1895 1973 1895 1895 1973 1919 1919 1998 1896 1896 1999 1895 1895 1973 1896 1896 1999 1872 1872 1974 1896 1896 1975 1920 1920 2000 1921 1921 2001 1896 1896 1975 1921 1921 2001 1897 1897 1976 1897 1897 1976 1921 1921 2001 1922 1922 2002 1897 1897 1976 1922 1922 2002 1898 1898 1977 1898 1898 1977 1922 1922 2002 1923 1923 2003 1898 1898 1977 1923 1923 2003 1899 1899 1978 1899 1899 1978 1923 1923 2003 1924 1924 2004 1899 1899 1978 1924 1924 2004 1900 1900 1979 1900 1900 1979 1924 1924 2004 1925 1925 2005 1900 1900 1979 1925 1925 2005 1901 1901 1980 1901 1901 1980 1925 1925 2005 1926 1926 2006 1901 1901 1980 1926 1926 2006 1902 1902 1981 1902 1902 1981 1926 1926 2006 1927 1927 2007 1902 1902 1981 1927 1927 2007 1903 1903 1982 1903 1903 1982 1927 1927 2007 1928 1928 2008 1903 1903 1982 1928 1928 2008 1904 1904 1983 1904 1904 1983 1928 1928 2008 1929 1929 2009 1904 1904 1983 1929 1929 2009 1905 1905 1984 1905 1905 1984 1929 1929 2009 1930 1930 2010 1905 1905 1984 1930 1930 2010 1906 1906 1985 1906 1906 1985 1930 1930 2010 1931 1931 2011 1906 1906 1985 1931 1931 2011 1907 1907 1986 1907 1907 1986 1931 1931 2011 1932 1932 2012 1907 1907 1986 1932 1932 2012 1908 1908 1987 1908 1908 1987 1932 1932 2012 1933 1933 2013 1908 1908 1987 1933 1933 2013 1909 1909 1988 1909 1909 1988 1933 1933 2013 1934 1934 2014 1909 1909 1988 1934 1934 2014 1910 1910 1989 1910 1910 1989 1934 1934 2014 1935 1935 2015 1910 1910 1989 1935 1935 2015 1911 1911 1990 1911 1911 1990 1935 1935 2015 1936 1936 2016 1911 1911 1990 1936 1936 2016 1912 1912 1991 1912 1912 1991 1936 1936 2016 1937 1937 2017 1912 1912 1991 1937 1937 2017 1913 1913 1992 1913 1913 1992 1937 1937 2017 1938 1938 2018 1913 1913 1992 1938 1938 2018 1914 1914 1993 1914 1914 1993 1938 1938 2018 1939 1939 2019 1914 1914 1993 1939 1939 2019 1915 1915 1994 1915 1915 1994 1939 1939 2019 1940 1940 2020 1915 1915 1994 1940 1940 2020 1916 1916 1995 1916 1916 1995 1940 1940 2020 1941 1941 2021 1916 1916 1995 1941 1941 2021 1917 1917 1996 1917 1917 1996 1941 1941 2021 1942 1942 2022 1917 1917 1996 1942 1942 2022 1918 1918 1997 1918 1918 1997 1942 1942 2022 1943 1943 2023 1918 1918 1997 1943 1943 2023 1919 1919 1998 1919 1919 1998 1943 1943 2023 1920 1920 2024 1919 1919 1998 1920 1920 2024 1896 1896 1999 1920 1920 2000 1944 1944 2025 1945 1945 2026 1920 1920 2000 1945 1945 2026 1921 1921 2001 1921 1921 2001 1945 1945 2026 1946 1946 2027 1921 1921 2001 1946 1946 2027 1922 1922 2002 1922 1922 2002 1946 1946 2027 1947 1947 2028 1922 1922 2002 1947 1947 2028 1923 1923 2003 1923 1923 2003 1947 1947 2028 1948 1948 2029 1923 1923 2003 1948 1948 2029 1924 1924 2004 1924 1924 2004 1948 1948 2029 1949 1949 2030 1924 1924 2004 1949 1949 2030 1925 1925 2005 1925 1925 2005 1949 1949 2030 1950 1950 2031 1925 1925 2005 1950 1950 2031 1926 1926 2006 1926 1926 2006 1950 1950 2031 1951 1951 2032 1926 1926 2006 1951 1951 2032 1927 1927 2007 1927 1927 2007 1951 1951 2032 1952 1952 2033 1927 1927 2007 1952 1952 2033 1928 1928 2008 1928 1928 2008 1952 1952 2033 1953 1953 2034 1928 1928 2008 1953 1953 2034 1929 1929 2009 1929 1929 2009 1953 1953 2034 1954 1954 2035 1929 1929 2009 1954 1954 2035 1930 1930 2010 1930 1930 2010 1954 1954 2035 1955 1955 2036 1930 1930 2010 1955 1955 2036 1931 1931 2011 1931 1931 2011 1955 1955 2036 1956 1956 2037 1931 1931 2011 1956 1956 2037 1932 1932 2012 1932 1932 2012 1956 1956 2037 1957 1957 2038 1932 1932 2012 1957 1957 2038 1933 1933 2013 1933 1933 2013 1957 1957 2038 1958 1958 2039 1933 1933 2013 1958 1958 2039 1934 1934 2014 1934 1934 2014 1958 1958 2039 1959 1959 2040 1934 1934 2014 1959 1959 2040 1935 1935 2015 1935 1935 2015 1959 1959 2040 1960 1960 2041 1935 1935 2015 1960 1960 2041 1936 1936 2016 1936 1936 2016 1960 1960 2041 1961 1961 2042 1936 1936 2016 1961 1961 2042 1937 1937 2017 1937 1937 2017 1961 1961 2042 1962 1962 2043 1937 1937 2017 1962 1962 2043 1938 1938 2018 1938 1938 2018 1962 1962 2043 1963 1963 2044 1938 1938 2018 1963 1963 2044 1939 1939 2019 1939 1939 2019 1963 1963 2044 1964 1964 2045 1939 1939 2019 1964 1964 2045 1940 1940 2020 1940 1940 2020 1964 1964 2045 1965 1965 2046 1940 1940 2020 1965 1965 2046 1941 1941 2021 1941 1941 2021 1965 1965 2046 1966 1966 2047 1941 1941 2021 1966 1966 2047 1942 1942 2022 1942 1942 2022 1966 1966 2047 1967 1967 2048 1942 1942 2022 1967 1967 2048 1943 1943 2023 1943 1943 2023 1967 1967 2048 1944 1944 2049 1943 1943 2023 1944 1944 2049 1920 1920 2024 1944 1944 2025 1968 1968 2050 1969 1969 2051 1944 1944 2025 1969 1969 2051 1945 1945 2026 1945 1945 2026 1969 1969 2051 1970 1970 2052 1945 1945 2026 1970 1970 2052 1946 1946 2027 1946 1946 2027 1970 1970 2052 1971 1971 2053 1946 1946 2027 1971 1971 2053 1947 1947 2028 1947 1947 2028 1971 1971 2053 1972 1972 2054 1947 1947 2028 1972 1972 2054 1948 1948 2029 1948 1948 2029 1972 1972 2054 1973 1973 2055 1948 1948 2029 1973 1973 2055 1949 1949 2030 1949 1949 2030 1973 1973 2055 1974 1974 2056 1949 1949 2030 1974 1974 2056 1950 1950 2031 1950 1950 2031 1974 1974 2056 1975 1975 2057 1950 1950 2031 1975 1975 2057 1951 1951 2032 1951 1951 2032 1975 1975 2057 1976 1976 2058 1951 1951 2032 1976 1976 2058 1952 1952 2033 1952 1952 2033 1976 1976 2058 1977 1977 2059 1952 1952 2033 1977 1977 2059 1953 1953 2034 1953 1953 2034 1977 1977 2059 1978 1978 2060 1953 1953 2034 1978 1978 2060 1954 1954 2035 1954 1954 2035 1978 1978 2060 1979 1979 2061 1954 1954 2035 1979 1979 2061 1955 1955 2036 1955 1955 2036 1979 1979 2061 1980 1980 2062 1955 1955 2036 1980 1980 2062 1956 1956 2037 1956 1956 2037 1980 1980 2062 1981 1981 2063 1956 1956 2037 1981 1981 2063 1957 1957 2038 1957 1957 2038 1981 1981 2063 1982 1982 2064 1957 1957 2038 1982 1982 2064 1958 1958 2039 1958 1958 2039 1982 1982 2064 1983 1983 2065 1958 1958 2039 1983 1983 2065 1959 1959 2040 1959 1959 2040 1983 1983 2065 1984 1984 2066 1959 1959 2040 1984 1984 2066 1960 1960 2041 1960 1960 2041 1984 1984 2066 1985 1985 2067 1960 1960 2041 1985 1985 2067 1961 1961 2042 1961 1961 2042 1985 1985 2067 1986 1986 2068 1961 1961 2042 1986 1986 2068 1962 1962 2043 1962 1962 2043 1986 1986 2068 1987 1987 2069 1962 1962 2043 1987 1987 2069 1963 1963 2044 1963 1963 2044 1987 1987 2069 1988 1988 2070 1963 1963 2044 1988 1988 2070 1964 1964 2045 1964 1964 2045 1988 1988 2070 1989 1989 2071 1964 1964 2045 1989 1989 2071 1965 1965 2046 1965 1965 2046 1989 1989 2071 1990 1990 2072 1965 1965 2046 1990 1990 2072 1966 1966 2047 1966 1966 2047 1990 1990 2072 1991 1991 2073 1966 1966 2047 1991 1991 2073 1967 1967 2048 1967 1967 2048 1991 1991 2073 1968 1968 2074 1967 1967 2048 1968 1968 2074 1944 1944 2049 1968 1968 2050 1992 1992 2075 1993 1993 2076 1968 1968 2050 1993 1993 2076 1969 1969 2051 1969 1969 2051 1993 1993 2076 1994 1994 2077 1969 1969 2051 1994 1994 2077 1970 1970 2052 1970 1970 2052 1994 1994 2077 1995 1995 2078 1970 1970 2052 1995 1995 2078 1971 1971 2053 1971 1971 2053 1995 1995 2078 1996 1996 2079 1971 1971 2053 1996 1996 2079 1972 1972 2054 1972 1972 2054 1996 1996 2079 1997 1997 2080 1972 1972 2054 1997 1997 2080 1973 1973 2055 1973 1973 2055 1997 1997 2080 1998 1998 2081 1973 1973 2055 1998 1998 2081 1974 1974 2056 1974 1974 2056 1998 1998 2081 1999 1999 2082 1974 1974 2056 1999 1999 2082 1975 1975 2057 1975 1975 2057 1999 1999 2082 2000 2000 2083 1975 1975 2057 2000 2000 2083 1976 1976 2058 1976 1976 2058 2000 2000 2083 2001 2001 2084 1976 1976 2058 2001 2001 2084 1977 1977 2059 1977 1977 2059 2001 2001 2084 2002 2002 2085 1977 1977 2059 2002 2002 2085 1978 1978 2060 1978 1978 2060 2002 2002 2085 2003 2003 2086 1978 1978 2060 2003 2003 2086 1979 1979 2061 1979 1979 2061 2003 2003 2086 2004 2004 2087 1979 1979 2061 2004 2004 2087 1980 1980 2062 1980 1980 2062 2004 2004 2087 2005 2005 2088 1980 1980 2062 2005 2005 2088 1981 1981 2063 1981 1981 2063 2005 2005 2088 2006 2006 2089 1981 1981 2063 2006 2006 2089 1982 1982 2064 1982 1982 2064 2006 2006 2089 2007 2007 2090 1982 1982 2064 2007 2007 2090 1983 1983 2065 1983 1983 2065 2007 2007 2090 2008 2008 2091 1983 1983 2065 2008 2008 2091 1984 1984 2066 1984 1984 2066 2008 2008 2091 2009 2009 2092 1984 1984 2066 2009 2009 2092 1985 1985 2067 1985 1985 2067 2009 2009 2092 2010 2010 2093 1985 1985 2067 2010 2010 2093 1986 1986 2068 1986 1986 2068 2010 2010 2093 2011 2011 2094 1986 1986 2068 2011 2011 2094 1987 1987 2069 1987 1987 2069 2011 2011 2094 2012 2012 2095 1987 1987 2069 2012 2012 2095 1988 1988 2070 1988 1988 2070 2012 2012 2095 2013 2013 2096 1988 1988 2070 2013 2013 2096 1989 1989 2071 1989 1989 2071 2013 2013 2096 2014 2014 2097 1989 1989 2071 2014 2014 2097 1990 1990 2072 1990 1990 2072 2014 2014 2097 2015 2015 2098 1990 1990 2072 2015 2015 2098 1991 1991 2073 1991 1991 2073 2015 2015 2098 1992 1992 2099 1991 1991 2073 1992 1992 2099 1968 1968 2074 1992 1992 2075 2016 2016 2100 2017 2017 2101 1992 1992 2075 2017 2017 2101 1993 1993 2076 1993 1993 2076 2017 2017 2101 2018 2018 2102 1993 1993 2076 2018 2018 2102 1994 1994 2077 1994 1994 2077 2018 2018 2102 2019 2019 2103 1994 1994 2077 2019 2019 2103 1995 1995 2078 1995 1995 2078 2019 2019 2103 2020 2020 2104 1995 1995 2078 2020 2020 2104 1996 1996 2079 1996 1996 2079 2020 2020 2104 2021 2021 2105 1996 1996 2079 2021 2021 2105 1997 1997 2080 1997 1997 2080 2021 2021 2105 2022 2022 2106 1997 1997 2080 2022 2022 2106 1998 1998 2081 1998 1998 2081 2022 2022 2106 2023 2023 2107 1998 1998 2081 2023 2023 2107 1999 1999 2082 1999 1999 2082 2023 2023 2107 2024 2024 2108 1999 1999 2082 2024 2024 2108 2000 2000 2083 2000 2000 2083 2024 2024 2108 2025 2025 2109 2000 2000 2083 2025 2025 2109 2001 2001 2084 2001 2001 2084 2025 2025 2109 2026 2026 2110 2001 2001 2084 2026 2026 2110 2002 2002 2085 2002 2002 2085 2026 2026 2110 2027 2027 2111 2002 2002 2085 2027 2027 2111 2003 2003 2086 2003 2003 2086 2027 2027 2111 2028 2028 2112 2003 2003 2086 2028 2028 2112 2004 2004 2087 2004 2004 2087 2028 2028 2112 2029 2029 2113 2004 2004 2087 2029 2029 2113 2005 2005 2088 2005 2005 2088 2029 2029 2113 2030 2030 2114 2005 2005 2088 2030 2030 2114 2006 2006 2089 2006 2006 2089 2030 2030 2114 2031 2031 2115 2006 2006 2089 2031 2031 2115 2007 2007 2090 2007 2007 2090 2031 2031 2115 2032 2032 2116 2007 2007 2090 2032 2032 2116 2008 2008 2091 2008 2008 2091 2032 2032 2116 2033 2033 2117 2008 2008 2091 2033 2033 2117 2009 2009 2092 2009 2009 2092 2033 2033 2117 2034 2034 2118 2009 2009 2092 2034 2034 2118 2010 2010 2093 2010 2010 2093 2034 2034 2118 2035 2035 2119 2010 2010 2093 2035 2035 2119 2011 2011 2094 2011 2011 2094 2035 2035 2119 2036 2036 2120 2011 2011 2094 2036 2036 2120 2012 2012 2095 2012 2012 2095 2036 2036 2120 2037 2037 2121 2012 2012 2095 2037 2037 2121 2013 2013 2096 2013 2013 2096 2037 2037 2121 2038 2038 2122 2013 2013 2096 2038 2038 2122 2014 2014 2097 2014 2014 2097 2038 2038 2122 2039 2039 2123 2014 2014 2097 2039 2039 2123 2015 2015 2098 2015 2015 2098 2039 2039 2123 2016 2016 2124 2015 2015 2098 2016 2016 2124 1992 1992 2099 2016 2016 2100 2040 2040 2125 2041 2041 2126 2016 2016 2100 2041 2041 2126 2017 2017 2101 2017 2017 2101 2041 2041 2126 2042 2042 2127 2017 2017 2101 2042 2042 2127 2018 2018 2102 2018 2018 2102 2042 2042 2127 2043 2043 2128 2018 2018 2102 2043 2043 2128 2019 2019 2103 2019 2019 2103 2043 2043 2128 2044 2044 2129 2019 2019 2103 2044 2044 2129 2020 2020 2104 2020 2020 2104 2044 2044 2129 2045 2045 2130 2020 2020 2104 2045 2045 2130 2021 2021 2105 2021 2021 2105 2045 2045 2130 2046 2046 2131 2021 2021 2105 2046 2046 2131 2022 2022 2106 2022 2022 2106 2046 2046 2131 2047 2047 2132 2022 2022 2106 2047 2047 2132 2023 2023 2107 2023 2023 2107 2047 2047 2132 2048 2048 2133 2023 2023 2107 2048 2048 2133 2024 2024 2108 2024 2024 2108 2048 2048 2133 2049 2049 2134 2024 2024 2108 2049 2049 2134 2025 2025 2109 2025 2025 2109 2049 2049 2134 2050 2050 2135 2025 2025 2109 2050 2050 2135 2026 2026 2110 2026 2026 2110 2050 2050 2135 2051 2051 2136 2026 2026 2110 2051 2051 2136 2027 2027 2111 2027 2027 2111 2051 2051 2136 2052 2052 2137 2027 2027 2111 2052 2052 2137 2028 2028 2112 2028 2028 2112 2052 2052 2137 2053 2053 2138 2028 2028 2112 2053 2053 2138 2029 2029 2113 2029 2029 2113 2053 2053 2138 2054 2054 2139 2029 2029 2113 2054 2054 2139 2030 2030 2114 2030 2030 2114 2054 2054 2139 2055 2055 2140 2030 2030 2114 2055 2055 2140 2031 2031 2115 2031 2031 2115 2055 2055 2140 2056 2056 2141 2031 2031 2115 2056 2056 2141 2032 2032 2116 2032 2032 2116 2056 2056 2141 2057 2057 2142 2032 2032 2116 2057 2057 2142 2033 2033 2117 2033 2033 2117 2057 2057 2142 2058 2058 2143 2033 2033 2117 2058 2058 2143 2034 2034 2118 2034 2034 2118 2058 2058 2143 2059 2059 2144 2034 2034 2118 2059 2059 2144 2035 2035 2119 2035 2035 2119 2059 2059 2144 2060 2060 2145 2035 2035 2119 2060 2060 2145 2036 2036 2120 2036 2036 2120 2060 2060 2145 2061 2061 2146 2036 2036 2120 2061 2061 2146 2037 2037 2121 2037 2037 2121 2061 2061 2146 2062 2062 2147 2037 2037 2121 2062 2062 2147 2038 2038 2122 2038 2038 2122 2062 2062 2147 2063 2063 2148 2038 2038 2122 2063 2063 2148 2039 2039 2123 2039 2039 2123 2063 2063 2148 2040 2040 2149 2039 2039 2123 2040 2040 2149 2016 2016 2124 2040 2040 2125 2064 2064 2150 2065 2065 2151 2040 2040 2125 2065 2065 2151 2041 2041 2126 2041 2041 2126 2065 2065 2151 2066 2066 2152 2041 2041 2126 2066 2066 2152 2042 2042 2127 2042 2042 2127 2066 2066 2152 2067 2067 2153 2042 2042 2127 2067 2067 2153 2043 2043 2128 2043 2043 2128 2067 2067 2153 2068 2068 2154 2043 2043 2128 2068 2068 2154 2044 2044 2129 2044 2044 2129 2068 2068 2154 2069 2069 2155 2044 2044 2129 2069 2069 2155 2045 2045 2130 2045 2045 2130 2069 2069 2155 2070 2070 2156 2045 2045 2130 2070 2070 2156 2046 2046 2131 2046 2046 2131 2070 2070 2156 2071 2071 2157 2046 2046 2131 2071 2071 2157 2047 2047 2132 2047 2047 2132 2071 2071 2157 2072 2072 2158 2047 2047 2132 2072 2072 2158 2048 2048 2133 2048 2048 2133 2072 2072 2158 2073 2073 2159 2048 2048 2133 2073 2073 2159 2049 2049 2134 2049 2049 2134 2073 2073 2159 2074 2074 2160 2049 2049 2134 2074 2074 2160 2050 2050 2135 2050 2050 2135 2074 2074 2160 2075 2075 2161 2050 2050 2135 2075 2075 2161 2051 2051 2136 2051 2051 2136 2075 2075 2161 2076 2076 2162 2051 2051 2136 2076 2076 2162 2052 2052 2137 2052 2052 2137 2076 2076 2162 2077 2077 2163 2052 2052 2137 2077 2077 2163 2053 2053 2138 2053 2053 2138 2077 2077 2163 2078 2078 2164 2053 2053 2138 2078 2078 2164 2054 2054 2139 2054 2054 2139 2078 2078 2164 2079 2079 2165 2054 2054 2139 2079 2079 2165 2055 2055 2140 2055 2055 2140 2079 2079 2165 2080 2080 2166 2055 2055 2140 2080 2080 2166 2056 2056 2141 2056 2056 2141 2080 2080 2166 2081 2081 2167 2056 2056 2141 2081 2081 2167 2057 2057 2142 2057 2057 2142 2081 2081 2167 2082 2082 2168 2057 2057 2142 2082 2082 2168 2058 2058 2143 2058 2058 2143 2082 2082 2168 2083 2083 2169 2058 2058 2143 2083 2083 2169 2059 2059 2144 2059 2059 2144 2083 2083 2169 2084 2084 2170 2059 2059 2144 2084 2084 2170 2060 2060 2145 2060 2060 2145 2084 2084 2170 2085 2085 2171 2060 2060 2145 2085 2085 2171 2061 2061 2146 2061 2061 2146 2085 2085 2171 2086 2086 2172 2061 2061 2146 2086 2086 2172 2062 2062 2147 2062 2062 2147 2086 2086 2172 2087 2087 2173 2062 2062 2147 2087 2087 2173 2063 2063 2148 2063 2063 2148 2087 2087 2173 2064 2064 2174 2063 2063 2148 2064 2064 2174 2040 2040 2149 2064 2064 2150 2088 2088 2175 2089 2089 2176 2064 2064 2150 2089 2089 2176 2065 2065 2151 2065 2065 2151 2089 2089 2176 2090 2090 2177 2065 2065 2151 2090 2090 2177 2066 2066 2152 2066 2066 2152 2090 2090 2177 2091 2091 2178 2066 2066 2152 2091 2091 2178 2067 2067 2153 2067 2067 2153 2091 2091 2178 2092 2092 2179 2067 2067 2153 2092 2092 2179 2068 2068 2154 2068 2068 2154 2092 2092 2179 2093 2093 2180 2068 2068 2154 2093 2093 2180 2069 2069 2155 2069 2069 2155 2093 2093 2180 2094 2094 2181 2069 2069 2155 2094 2094 2181 2070 2070 2156 2070 2070 2156 2094 2094 2181 2095 2095 2182 2070 2070 2156 2095 2095 2182 2071 2071 2157 2071 2071 2157 2095 2095 2182 2096 2096 2183 2071 2071 2157 2096 2096 2183 2072 2072 2158 2072 2072 2158 2096 2096 2183 2097 2097 2184 2072 2072 2158 2097 2097 2184 2073 2073 2159 2073 2073 2159 2097 2097 2184 2098 2098 2185 2073 2073 2159 2098 2098 2185 2074 2074 2160 2074 2074 2160 2098 2098 2185 2099 2099 2186 2074 2074 2160 2099 2099 2186 2075 2075 2161 2075 2075 2161 2099 2099 2186 2100 2100 2187 2075 2075 2161 2100 2100 2187 2076 2076 2162 2076 2076 2162 2100 2100 2187 2101 2101 2188 2076 2076 2162 2101 2101 2188 2077 2077 2163 2077 2077 2163 2101 2101 2188 2102 2102 2189 2077 2077 2163 2102 2102 2189 2078 2078 2164 2078 2078 2164 2102 2102 2189 2103 2103 2190 2078 2078 2164 2103 2103 2190 2079 2079 2165 2079 2079 2165 2103 2103 2190 2104 2104 2191 2079 2079 2165 2104 2104 2191 2080 2080 2166 2080 2080 2166 2104 2104 2191 2105 2105 2192 2080 2080 2166 2105 2105 2192 2081 2081 2167 2081 2081 2167 2105 2105 2192 2106 2106 2193 2081 2081 2167 2106 2106 2193 2082 2082 2168 2082 2082 2168 2106 2106 2193 2107 2107 2194 2082 2082 2168 2107 2107 2194 2083 2083 2169 2083 2083 2169 2107 2107 2194 2108 2108 2195 2083 2083 2169 2108 2108 2195 2084 2084 2170 2084 2084 2170 2108 2108 2195 2109 2109 2196 2084 2084 2170 2109 2109 2196 2085 2085 2171 2085 2085 2171 2109 2109 2196 2110 2110 2197 2085 2085 2171 2110 2110 2197 2086 2086 2172 2086 2086 2172 2110 2110 2197 2111 2111 2198 2086 2086 2172 2111 2111 2198 2087 2087 2173 2087 2087 2173 2111 2111 2198 2088 2088 2199 2087 2087 2173 2088 2088 2199 2064 2064 2174 2088 2088 2175 2112 2112 2200 2113 2113 2201 2088 2088 2175 2113 2113 2201 2089 2089 2176 2089 2089 2176 2113 2113 2201 2114 2114 2202 2089 2089 2176 2114 2114 2202 2090 2090 2177 2090 2090 2177 2114 2114 2202 2115 2115 2203 2090 2090 2177 2115 2115 2203 2091 2091 2178 2091 2091 2178 2115 2115 2203 2116 2116 2204 2091 2091 2178 2116 2116 2204 2092 2092 2179 2092 2092 2179 2116 2116 2204 2117 2117 2205 2092 2092 2179 2117 2117 2205 2093 2093 2180 2093 2093 2180 2117 2117 2205 2118 2118 2206 2093 2093 2180 2118 2118 2206 2094 2094 2181 2094 2094 2181 2118 2118 2206 2119 2119 2207 2094 2094 2181 2119 2119 2207 2095 2095 2182 2095 2095 2182 2119 2119 2207 2120 2120 2208 2095 2095 2182 2120 2120 2208 2096 2096 2183 2096 2096 2183 2120 2120 2208 2121 2121 2209 2096 2096 2183 2121 2121 2209 2097 2097 2184 2097 2097 2184 2121 2121 2209 2122 2122 2210 2097 2097 2184 2122 2122 2210 2098 2098 2185 2098 2098 2185 2122 2122 2210 2123 2123 2211 2098 2098 2185 2123 2123 2211 2099 2099 2186 2099 2099 2186 2123 2123 2211 2124 2124 2212 2099 2099 2186 2124 2124 2212 2100 2100 2187 2100 2100 2187 2124 2124 2212 2125 2125 2213 2100 2100 2187 2125 2125 2213 2101 2101 2188 2101 2101 2188 2125 2125 2213 2126 2126 2214 2101 2101 2188 2126 2126 2214 2102 2102 2189 2102 2102 2189 2126 2126 2214 2127 2127 2215 2102 2102 2189 2127 2127 2215 2103 2103 2190 2103 2103 2190 2127 2127 2215 2128 2128 2216 2103 2103 2190 2128 2128 2216 2104 2104 2191 2104 2104 2191 2128 2128 2216 2129 2129 2217 2104 2104 2191 2129 2129 2217 2105 2105 2192 2105 2105 2192 2129 2129 2217 2130 2130 2218 2105 2105 2192 2130 2130 2218 2106 2106 2193 2106 2106 2193 2130 2130 2218 2131 2131 2219 2106 2106 2193 2131 2131 2219 2107 2107 2194 2107 2107 2194 2131 2131 2219 2132 2132 2220 2107 2107 2194 2132 2132 2220 2108 2108 2195 2108 2108 2195 2132 2132 2220 2133 2133 2221 2108 2108 2195 2133 2133 2221 2109 2109 2196 2109 2109 2196 2133 2133 2221 2134 2134 2222 2109 2109 2196 2134 2134 2222 2110 2110 2197 2110 2110 2197 2134 2134 2222 2135 2135 2223 2110 2110 2197 2135 2135 2223 2111 2111 2198 2111 2111 2198 2135 2135 2223 2112 2112 2224 2111 2111 2198 2112 2112 2224 2088 2088 2199 2112 2112 2200 2136 2136 2225 2137 2137 2226 2112 2112 2200 2137 2137 2226 2113 2113 2201 2113 2113 2201 2137 2137 2226 2138 2138 2227 2113 2113 2201 2138 2138 2227 2114 2114 2202 2114 2114 2202 2138 2138 2227 2139 2139 2228 2114 2114 2202 2139 2139 2228 2115 2115 2203 2115 2115 2203 2139 2139 2228 2140 2140 2229 2115 2115 2203 2140 2140 2229 2116 2116 2204 2116 2116 2204 2140 2140 2229 2141 2141 2230 2116 2116 2204 2141 2141 2230 2117 2117 2205 2117 2117 2205 2141 2141 2230 2142 2142 2231 2117 2117 2205 2142 2142 2231 2118 2118 2206 2118 2118 2206 2142 2142 2231 2143 2143 2232 2118 2118 2206 2143 2143 2232 2119 2119 2207 2119 2119 2207 2143 2143 2232 2144 2144 2233 2119 2119 2207 2144 2144 2233 2120 2120 2208 2120 2120 2208 2144 2144 2233 2145 2145 2234 2120 2120 2208 2145 2145 2234 2121 2121 2209 2121 2121 2209 2145 2145 2234 2146 2146 2235 2121 2121 2209 2146 2146 2235 2122 2122 2210 2122 2122 2210 2146 2146 2235 2147 2147 2236 2122 2122 2210 2147 2147 2236 2123 2123 2211 2123 2123 2211 2147 2147 2236 2148 2148 2237 2123 2123 2211 2148 2148 2237 2124 2124 2212 2124 2124 2212 2148 2148 2237 2149 2149 2238 2124 2124 2212 2149 2149 2238 2125 2125 2213 2125 2125 2213 2149 2149 2238 2150 2150 2239 2125 2125 2213 2150 2150 2239 2126 2126 2214 2126 2126 2214 2150 2150 2239 2151 2151 2240 2126 2126 2214 2151 2151 2240 2127 2127 2215 2127 2127 2215 2151 2151 2240 2152 2152 2241 2127 2127 2215 2152 2152 2241 2128 2128 2216 2128 2128 2216 2152 2152 2241 2153 2153 2242 2128 2128 2216 2153 2153 2242 2129 2129 2217 2129 2129 2217 2153 2153 2242 2154 2154 2243 2129 2129 2217 2154 2154 2243 2130 2130 2218 2130 2130 2218 2154 2154 2243 2155 2155 2244 2130 2130 2218 2155 2155 2244 2131 2131 2219 2131 2131 2219 2155 2155 2244 2156 2156 2245 2131 2131 2219 2156 2156 2245 2132 2132 2220 2132 2132 2220 2156 2156 2245 2157 2157 2246 2132 2132 2220 2157 2157 2246 2133 2133 2221 2133 2133 2221 2157 2157 2246 2158 2158 2247 2133 2133 2221 2158 2158 2247 2134 2134 2222 2134 2134 2222 2158 2158 2247 2159 2159 2248 2134 2134 2222 2159 2159 2248 2135 2135 2223 2135 2135 2223 2159 2159 2248 2136 2136 2249 2135 2135 2223 2136 2136 2249 2112 2112 2224 2136 2136 2225 2160 2160 2250 2161 2161 2251 2136 2136 2225 2161 2161 2251 2137 2137 2226 2137 2137 2226 2161 2161 2251 2162 2162 2252 2137 2137 2226 2162 2162 2252 2138 2138 2227 2138 2138 2227 2162 2162 2252 2163 2163 2253 2138 2138 2227 2163 2163 2253 2139 2139 2228 2139 2139 2228 2163 2163 2253 2164 2164 2254 2139 2139 2228 2164 2164 2254 2140 2140 2229 2140 2140 2229 2164 2164 2254 2165 2165 2255 2140 2140 2229 2165 2165 2255 2141 2141 2230 2141 2141 2230 2165 2165 2255 2166 2166 2256 2141 2141 2230 2166 2166 2256 2142 2142 2231 2142 2142 2231 2166 2166 2256 2167 2167 2257 2142 2142 2231 2167 2167 2257 2143 2143 2232 2143 2143 2232 2167 2167 2257 2168 2168 2258 2143 2143 2232 2168 2168 2258 2144 2144 2233 2144 2144 2233 2168 2168 2258 2169 2169 2259 2144 2144 2233 2169 2169 2259 2145 2145 2234 2145 2145 2234 2169 2169 2259 2170 2170 2260 2145 2145 2234 2170 2170 2260 2146 2146 2235 2146 2146 2235 2170 2170 2260 2171 2171 2261 2146 2146 2235 2171 2171 2261 2147 2147 2236 2147 2147 2236 2171 2171 2261 2172 2172 2262 2147 2147 2236 2172 2172 2262 2148 2148 2237 2148 2148 2237 2172 2172 2262 2173 2173 2263 2148 2148 2237 2173 2173 2263 2149 2149 2238 2149 2149 2238 2173 2173 2263 2174 2174 2264 2149 2149 2238 2174 2174 2264 2150 2150 2239 2150 2150 2239 2174 2174 2264 2175 2175 2265 2150 2150 2239 2175 2175 2265 2151 2151 2240 2151 2151 2240 2175 2175 2265 2176 2176 2266 2151 2151 2240 2176 2176 2266 2152 2152 2241 2152 2152 2241 2176 2176 2266 2177 2177 2267 2152 2152 2241 2177 2177 2267 2153 2153 2242 2153 2153 2242 2177 2177 2267 2178 2178 2268 2153 2153 2242 2178 2178 2268 2154 2154 2243 2154 2154 2243 2178 2178 2268 2179 2179 2269 2154 2154 2243 2179 2179 2269 2155 2155 2244 2155 2155 2244 2179 2179 2269 2180 2180 2270 2155 2155 2244 2180 2180 2270 2156 2156 2245 2156 2156 2245 2180 2180 2270 2181 2181 2271 2156 2156 2245 2181 2181 2271 2157 2157 2246 2157 2157 2246 2181 2181 2271 2182 2182 2272 2157 2157 2246 2182 2182 2272 2158 2158 2247 2158 2158 2247 2182 2182 2272 2183 2183 2273 2158 2158 2247 2183 2183 2273 2159 2159 2248 2159 2159 2248 2183 2183 2273 2160 2160 2274 2159 2159 2248 2160 2160 2274 2136 2136 2249 2160 2160 2250 2184 2184 2275 2185 2185 2276 2160 2160 2250 2185 2185 2276 2161 2161 2251 2161 2161 2251 2185 2185 2276 2186 2186 2277 2161 2161 2251 2186 2186 2277 2162 2162 2252 2162 2162 2252 2186 2186 2277 2187 2187 2278 2162 2162 2252 2187 2187 2278 2163 2163 2253 2163 2163 2253 2187 2187 2278 2188 2188 2279 2163 2163 2253 2188 2188 2279 2164 2164 2254 2164 2164 2254 2188 2188 2279 2189 2189 2280 2164 2164 2254 2189 2189 2280 2165 2165 2255 2165 2165 2255 2189 2189 2280 2190 2190 2281 2165 2165 2255 2190 2190 2281 2166 2166 2256 2166 2166 2256 2190 2190 2281 2191 2191 2282 2166 2166 2256 2191 2191 2282 2167 2167 2257 2167 2167 2257 2191 2191 2282 2192 2192 2283 2167 2167 2257 2192 2192 2283 2168 2168 2258 2168 2168 2258 2192 2192 2283 2193 2193 2284 2168 2168 2258 2193 2193 2284 2169 2169 2259 2169 2169 2259 2193 2193 2284 2194 2194 2285 2169 2169 2259 2194 2194 2285 2170 2170 2260 2170 2170 2260 2194 2194 2285 2195 2195 2286 2170 2170 2260 2195 2195 2286 2171 2171 2261 2171 2171 2261 2195 2195 2286 2196 2196 2287 2171 2171 2261 2196 2196 2287 2172 2172 2262 2172 2172 2262 2196 2196 2287 2197 2197 2288 2172 2172 2262 2197 2197 2288 2173 2173 2263 2173 2173 2263 2197 2197 2288 2198 2198 2289 2173 2173 2263 2198 2198 2289 2174 2174 2264 2174 2174 2264 2198 2198 2289 2199 2199 2290 2174 2174 2264 2199 2199 2290 2175 2175 2265 2175 2175 2265 2199 2199 2290 2200 2200 2291 2175 2175 2265 2200 2200 2291 2176 2176 2266 2176 2176 2266 2200 2200 2291 2201 2201 2292 2176 2176 2266 2201 2201 2292 2177 2177 2267 2177 2177 2267 2201 2201 2292 2202 2202 2293 2177 2177 2267 2202 2202 2293 2178 2178 2268 2178 2178 2268 2202 2202 2293 2203 2203 2294 2178 2178 2268 2203 2203 2294 2179 2179 2269 2179 2179 2269 2203 2203 2294 2204 2204 2295 2179 2179 2269 2204 2204 2295 2180 2180 2270 2180 2180 2270 2204 2204 2295 2205 2205 2296 2180 2180 2270 2205 2205 2296 2181 2181 2271 2181 2181 2271 2205 2205 2296 2206 2206 2297 2181 2181 2271 2206 2206 2297 2182 2182 2272 2182 2182 2272 2206 2206 2297 2207 2207 2298 2182 2182 2272 2207 2207 2298 2183 2183 2273 2183 2183 2273 2207 2207 2298 2184 2184 2299 2183 2183 2273 2184 2184 2299 2160 2160 2274 2184 2184 2275 2208 2208 2300 2209 2209 2301 2184 2184 2275 2209 2209 2301 2185 2185 2276 2185 2185 2276 2209 2209 2301 2210 2210 2302 2185 2185 2276 2210 2210 2302 2186 2186 2277 2186 2186 2277 2210 2210 2302 2211 2211 2303 2186 2186 2277 2211 2211 2303 2187 2187 2278 2187 2187 2278 2211 2211 2303 2212 2212 2304 2187 2187 2278 2212 2212 2304 2188 2188 2279 2188 2188 2279 2212 2212 2304 2213 2213 2305 2188 2188 2279 2213 2213 2305 2189 2189 2280 2189 2189 2280 2213 2213 2305 2214 2214 2306 2189 2189 2280 2214 2214 2306 2190 2190 2281 2190 2190 2281 2214 2214 2306 2215 2215 2307 2190 2190 2281 2215 2215 2307 2191 2191 2282 2191 2191 2282 2215 2215 2307 2216 2216 2308 2191 2191 2282 2216 2216 2308 2192 2192 2283 2192 2192 2283 2216 2216 2308 2217 2217 2309 2192 2192 2283 2217 2217 2309 2193 2193 2284 2193 2193 2284 2217 2217 2309 2218 2218 2310 2193 2193 2284 2218 2218 2310 2194 2194 2285 2194 2194 2285 2218 2218 2310 2219 2219 2311 2194 2194 2285 2219 2219 2311 2195 2195 2286 2195 2195 2286 2219 2219 2311 2220 2220 2312 2195 2195 2286 2220 2220 2312 2196 2196 2287 2196 2196 2287 2220 2220 2312 2221 2221 2313 2196 2196 2287 2221 2221 2313 2197 2197 2288 2197 2197 2288 2221 2221 2313 2222 2222 2314 2197 2197 2288 2222 2222 2314 2198 2198 2289 2198 2198 2289 2222 2222 2314 2223 2223 2315 2198 2198 2289 2223 2223 2315 2199 2199 2290 2199 2199 2290 2223 2223 2315 2224 2224 2316 2199 2199 2290 2224 2224 2316 2200 2200 2291 2200 2200 2291 2224 2224 2316 2225 2225 2317 2200 2200 2291 2225 2225 2317 2201 2201 2292 2201 2201 2292 2225 2225 2317 2226 2226 2318 2201 2201 2292 2226 2226 2318 2202 2202 2293 2202 2202 2293 2226 2226 2318 2227 2227 2319 2202 2202 2293 2227 2227 2319 2203 2203 2294 2203 2203 2294 2227 2227 2319 2228 2228 2320 2203 2203 2294 2228 2228 2320 2204 2204 2295 2204 2204 2295 2228 2228 2320 2229 2229 2321 2204 2204 2295 2229 2229 2321 2205 2205 2296 2205 2205 2296 2229 2229 2321 2230 2230 2322 2205 2205 2296 2230 2230 2322 2206 2206 2297 2206 2206 2297 2230 2230 2322 2231 2231 2323 2206 2206 2297 2231 2231 2323 2207 2207 2298 2207 2207 2298 2231 2231 2323 2208 2208 2324 2207 2207 2298 2208 2208 2324 2184 2184 2299 2208 2208 2300 2232 2232 2325 2233 2233 2326 2208 2208 2300 2233 2233 2326 2209 2209 2301 2209 2209 2301 2233 2233 2326 2234 2234 2327 2209 2209 2301 2234 2234 2327 2210 2210 2302 2210 2210 2302 2234 2234 2327 2235 2235 2328 2210 2210 2302 2235 2235 2328 2211 2211 2303 2211 2211 2303 2235 2235 2328 2236 2236 2329 2211 2211 2303 2236 2236 2329 2212 2212 2304 2212 2212 2304 2236 2236 2329 2237 2237 2330 2212 2212 2304 2237 2237 2330 2213 2213 2305 2213 2213 2305 2237 2237 2330 2238 2238 2331 2213 2213 2305 2238 2238 2331 2214 2214 2306 2214 2214 2306 2238 2238 2331 2239 2239 2332 2214 2214 2306 2239 2239 2332 2215 2215 2307 2215 2215 2307 2239 2239 2332 2240 2240 2333 2215 2215 2307 2240 2240 2333 2216 2216 2308 2216 2216 2308 2240 2240 2333 2241 2241 2334 2216 2216 2308 2241 2241 2334 2217 2217 2309 2217 2217 2309 2241 2241 2334 2242 2242 2335 2217 2217 2309 2242 2242 2335 2218 2218 2310 2218 2218 2310 2242 2242 2335 2243 2243 2336 2218 2218 2310 2243 2243 2336 2219 2219 2311 2219 2219 2311 2243 2243 2336 2244 2244 2337 2219 2219 2311 2244 2244 2337 2220 2220 2312 2220 2220 2312 2244 2244 2337 2245 2245 2338 2220 2220 2312 2245 2245 2338 2221 2221 2313 2221 2221 2313 2245 2245 2338 2246 2246 2339 2221 2221 2313 2246 2246 2339 2222 2222 2314 2222 2222 2314 2246 2246 2339 2247 2247 2340 2222 2222 2314 2247 2247 2340 2223 2223 2315 2223 2223 2315 2247 2247 2340 2248 2248 2341 2223 2223 2315 2248 2248 2341 2224 2224 2316 2224 2224 2316 2248 2248 2341 2249 2249 2342 2224 2224 2316 2249 2249 2342 2225 2225 2317 2225 2225 2317 2249 2249 2342 2250 2250 2343 2225 2225 2317 2250 2250 2343 2226 2226 2318 2226 2226 2318 2250 2250 2343 2251 2251 2344 2226 2226 2318 2251 2251 2344 2227 2227 2319 2227 2227 2319 2251 2251 2344 2252 2252 2345 2227 2227 2319 2252 2252 2345 2228 2228 2320 2228 2228 2320 2252 2252 2345 2253 2253 2346 2228 2228 2320 2253 2253 2346 2229 2229 2321 2229 2229 2321 2253 2253 2346 2254 2254 2347 2229 2229 2321 2254 2254 2347 2230 2230 2322 2230 2230 2322 2254 2254 2347 2255 2255 2348 2230 2230 2322 2255 2255 2348 2231 2231 2323 2231 2231 2323 2255 2255 2348 2232 2232 2349 2231 2231 2323 2232 2232 2349 2208 2208 2324 2232 2232 2325 2256 2256 2350 2257 2257 2351 2232 2232 2325 2257 2257 2351 2233 2233 2326 2233 2233 2326 2257 2257 2351 2258 2258 2352 2233 2233 2326 2258 2258 2352 2234 2234 2327 2234 2234 2327 2258 2258 2352 2259 2259 2353 2234 2234 2327 2259 2259 2353 2235 2235 2328 2235 2235 2328 2259 2259 2353 2260 2260 2354 2235 2235 2328 2260 2260 2354 2236 2236 2329 2236 2236 2329 2260 2260 2354 2261 2261 2355 2236 2236 2329 2261 2261 2355 2237 2237 2330 2237 2237 2330 2261 2261 2355 2262 2262 2356 2237 2237 2330 2262 2262 2356 2238 2238 2331 2238 2238 2331 2262 2262 2356 2263 2263 2357 2238 2238 2331 2263 2263 2357 2239 2239 2332 2239 2239 2332 2263 2263 2357 2264 2264 2358 2239 2239 2332 2264 2264 2358 2240 2240 2333 2240 2240 2333 2264 2264 2358 2265 2265 2359 2240 2240 2333 2265 2265 2359 2241 2241 2334 2241 2241 2334 2265 2265 2359 2266 2266 2360 2241 2241 2334 2266 2266 2360 2242 2242 2335 2242 2242 2335 2266 2266 2360 2267 2267 2361 2242 2242 2335 2267 2267 2361 2243 2243 2336 2243 2243 2336 2267 2267 2361 2268 2268 2362 2243 2243 2336 2268 2268 2362 2244 2244 2337 2244 2244 2337 2268 2268 2362 2269 2269 2363 2244 2244 2337 2269 2269 2363 2245 2245 2338 2245 2245 2338 2269 2269 2363 2270 2270 2364 2245 2245 2338 2270 2270 2364 2246 2246 2339 2246 2246 2339 2270 2270 2364 2271 2271 2365 2246 2246 2339 2271 2271 2365 2247 2247 2340 2247 2247 2340 2271 2271 2365 2272 2272 2366 2247 2247 2340 2272 2272 2366 2248 2248 2341 2248 2248 2341 2272 2272 2366 2273 2273 2367 2248 2248 2341 2273 2273 2367 2249 2249 2342 2249 2249 2342 2273 2273 2367 2274 2274 2368 2249 2249 2342 2274 2274 2368 2250 2250 2343 2250 2250 2343 2274 2274 2368 2275 2275 2369 2250 2250 2343 2275 2275 2369 2251 2251 2344 2251 2251 2344 2275 2275 2369 2276 2276 2370 2251 2251 2344 2276 2276 2370 2252 2252 2345 2252 2252 2345 2276 2276 2370 2277 2277 2371 2252 2252 2345 2277 2277 2371 2253 2253 2346 2253 2253 2346 2277 2277 2371 2278 2278 2372 2253 2253 2346 2278 2278 2372 2254 2254 2347 2254 2254 2347 2278 2278 2372 2279 2279 2373 2254 2254 2347 2279 2279 2373 2255 2255 2348 2255 2255 2348 2279 2279 2373 2256 2256 2374 2255 2255 2348 2256 2256 2374 2232 2232 2349 2256 2256 2350 2280 2280 2375 2281 2281 2376 2256 2256 2350 2281 2281 2376 2257 2257 2351 2257 2257 2351 2281 2281 2376 2282 2282 2377 2257 2257 2351 2282 2282 2377 2258 2258 2352 2258 2258 2352 2282 2282 2377 2283 2283 2378 2258 2258 2352 2283 2283 2378 2259 2259 2353 2259 2259 2353 2283 2283 2378 2284 2284 2379 2259 2259 2353 2284 2284 2379 2260 2260 2354 2260 2260 2354 2284 2284 2379 2285 2285 2380 2260 2260 2354 2285 2285 2380 2261 2261 2355 2261 2261 2355 2285 2285 2380 2286 2286 2381 2261 2261 2355 2286 2286 2381 2262 2262 2356 2262 2262 2356 2286 2286 2381 2287 2287 2382 2262 2262 2356 2287 2287 2382 2263 2263 2357 2263 2263 2357 2287 2287 2382 2288 2288 2383 2263 2263 2357 2288 2288 2383 2264 2264 2358 2264 2264 2358 2288 2288 2383 2289 2289 2384 2264 2264 2358 2289 2289 2384 2265 2265 2359 2265 2265 2359 2289 2289 2384 2290 2290 2385 2265 2265 2359 2290 2290 2385 2266 2266 2360 2266 2266 2360 2290 2290 2385 2291 2291 2386 2266 2266 2360 2291 2291 2386 2267 2267 2361 2267 2267 2361 2291 2291 2386 2292 2292 2387 2267 2267 2361 2292 2292 2387 2268 2268 2362 2268 2268 2362 2292 2292 2387 2293 2293 2388 2268 2268 2362 2293 2293 2388 2269 2269 2363 2269 2269 2363 2293 2293 2388 2294 2294 2389 2269 2269 2363 2294 2294 2389 2270 2270 2364 2270 2270 2364 2294 2294 2389 2295 2295 2390 2270 2270 2364 2295 2295 2390 2271 2271 2365 2271 2271 2365 2295 2295 2390 2296 2296 2391 2271 2271 2365 2296 2296 2391 2272 2272 2366 2272 2272 2366 2296 2296 2391 2297 2297 2392 2272 2272 2366 2297 2297 2392 2273 2273 2367 2273 2273 2367 2297 2297 2392 2298 2298 2393 2273 2273 2367 2298 2298 2393 2274 2274 2368 2274 2274 2368 2298 2298 2393 2299 2299 2394 2274 2274 2368 2299 2299 2394 2275 2275 2369 2275 2275 2369 2299 2299 2394 2300 2300 2395 2275 2275 2369 2300 2300 2395 2276 2276 2370 2276 2276 2370 2300 2300 2395 2301 2301 2396 2276 2276 2370 2301 2301 2396 2277 2277 2371 2277 2277 2371 2301 2301 2396 2302 2302 2397 2277 2277 2371 2302 2302 2397 2278 2278 2372 2278 2278 2372 2302 2302 2397 2303 2303 2398 2278 2278 2372 2303 2303 2398 2279 2279 2373 2279 2279 2373 2303 2303 2398 2280 2280 2399 2279 2279 2373 2280 2280 2399 2256 2256 2374 2280 2280 2375 2304 2304 2400 2305 2305 2401 2280 2280 2375 2305 2305 2401 2281 2281 2376 2281 2281 2376 2305 2305 2401 2306 2306 2402 2281 2281 2376 2306 2306 2402 2282 2282 2377 2282 2282 2377 2306 2306 2402 2307 2307 2403 2282 2282 2377 2307 2307 2403 2283 2283 2378 2283 2283 2378 2307 2307 2403 2308 2308 2404 2283 2283 2378 2308 2308 2404 2284 2284 2379 2284 2284 2379 2308 2308 2404 2309 2309 2405 2284 2284 2379 2309 2309 2405 2285 2285 2380 2285 2285 2380 2309 2309 2405 2310 2310 2406 2285 2285 2380 2310 2310 2406 2286 2286 2381 2286 2286 2381 2310 2310 2406 2311 2311 2407 2286 2286 2381 2311 2311 2407 2287 2287 2382 2287 2287 2382 2311 2311 2407 2312 2312 2408 2287 2287 2382 2312 2312 2408 2288 2288 2383 2288 2288 2383 2312 2312 2408 2313 2313 2409 2288 2288 2383 2313 2313 2409 2289 2289 2384 2289 2289 2384 2313 2313 2409 2314 2314 2410 2289 2289 2384 2314 2314 2410 2290 2290 2385 2290 2290 2385 2314 2314 2410 2315 2315 2411 2290 2290 2385 2315 2315 2411 2291 2291 2386 2291 2291 2386 2315 2315 2411 2316 2316 2412 2291 2291 2386 2316 2316 2412 2292 2292 2387 2292 2292 2387 2316 2316 2412 2317 2317 2413 2292 2292 2387 2317 2317 2413 2293 2293 2388 2293 2293 2388 2317 2317 2413 2318 2318 2414 2293 2293 2388 2318 2318 2414 2294 2294 2389 2294 2294 2389 2318 2318 2414 2319 2319 2415 2294 2294 2389 2319 2319 2415 2295 2295 2390 2295 2295 2390 2319 2319 2415 2320 2320 2416 2295 2295 2390 2320 2320 2416 2296 2296 2391 2296 2296 2391 2320 2320 2416 2321 2321 2417 2296 2296 2391 2321 2321 2417 2297 2297 2392 2297 2297 2392 2321 2321 2417 2322 2322 2418 2297 2297 2392 2322 2322 2418 2298 2298 2393 2298 2298 2393 2322 2322 2418 2323 2323 2419 2298 2298 2393 2323 2323 2419 2299 2299 2394 2299 2299 2394 2323 2323 2419 2324 2324 2420 2299 2299 2394 2324 2324 2420 2300 2300 2395 2300 2300 2395 2324 2324 2420 2325 2325 2421 2300 2300 2395 2325 2325 2421 2301 2301 2396 2301 2301 2396 2325 2325 2421 2326 2326 2422 2301 2301 2396 2326 2326 2422 2302 2302 2397 2302 2302 2397 2326 2326 2422 2327 2327 2423 2302 2302 2397 2327 2327 2423 2303 2303 2398 2303 2303 2398 2327 2327 2423 2304 2304 2424 2303 2303 2398 2304 2304 2424 2280 2280 2399 2304 2304 2400 2328 2328 2425 2329 2329 2426 2304 2304 2400 2329 2329 2426 2305 2305 2401 2305 2305 2401 2329 2329 2426 2330 2330 2427 2305 2305 2401 2330 2330 2427 2306 2306 2402 2306 2306 2402 2330 2330 2427 2331 2331 2428 2306 2306 2402 2331 2331 2428 2307 2307 2403 2307 2307 2403 2331 2331 2428 2332 2332 2429 2307 2307 2403 2332 2332 2429 2308 2308 2404 2308 2308 2404 2332 2332 2429 2333 2333 2430 2308 2308 2404 2333 2333 2430 2309 2309 2405 2309 2309 2405 2333 2333 2430 2334 2334 2431 2309 2309 2405 2334 2334 2431 2310 2310 2406 2310 2310 2406 2334 2334 2431 2335 2335 2432 2310 2310 2406 2335 2335 2432 2311 2311 2407 2311 2311 2407 2335 2335 2432 2336 2336 2433 2311 2311 2407 2336 2336 2433 2312 2312 2408 2312 2312 2408 2336 2336 2433 2337 2337 2434 2312 2312 2408 2337 2337 2434 2313 2313 2409 2313 2313 2409 2337 2337 2434 2338 2338 2435 2313 2313 2409 2338 2338 2435 2314 2314 2410 2314 2314 2410 2338 2338 2435 2339 2339 2436 2314 2314 2410 2339 2339 2436 2315 2315 2411 2315 2315 2411 2339 2339 2436 2340 2340 2437 2315 2315 2411 2340 2340 2437 2316 2316 2412 2316 2316 2412 2340 2340 2437 2341 2341 2438 2316 2316 2412 2341 2341 2438 2317 2317 2413 2317 2317 2413 2341 2341 2438 2342 2342 2439 2317 2317 2413 2342 2342 2439 2318 2318 2414 2318 2318 2414 2342 2342 2439 2343 2343 2440 2318 2318 2414 2343 2343 2440 2319 2319 2415 2319 2319 2415 2343 2343 2440 2344 2344 2441 2319 2319 2415 2344 2344 2441 2320 2320 2416 2320 2320 2416 2344 2344 2441 2345 2345 2442 2320 2320 2416 2345 2345 2442 2321 2321 2417 2321 2321 2417 2345 2345 2442 2346 2346 2443 2321 2321 2417 2346 2346 2443 2322 2322 2418 2322 2322 2418 2346 2346 2443 2347 2347 2444 2322 2322 2418 2347 2347 2444 2323 2323 2419 2323 2323 2419 2347 2347 2444 2348 2348 2445 2323 2323 2419 2348 2348 2445 2324 2324 2420 2324 2324 2420 2348 2348 2445 2349 2349 2446 2324 2324 2420 2349 2349 2446 2325 2325 2421 2325 2325 2421 2349 2349 2446 2350 2350 2447 2325 2325 2421 2350 2350 2447 2326 2326 2422 2326 2326 2422 2350 2350 2447 2351 2351 2448 2326 2326 2422 2351 2351 2448 2327 2327 2423 2327 2327 2423 2351 2351 2448 2328 2328 2449 2327 2327 2423 2328 2328 2449 2304 2304 2424 2328 2328 2425 2352 2352 2450 2353 2353 2451 2328 2328 2425 2353 2353 2451 2329 2329 2426 2329 2329 2426 2353 2353 2451 2354 2354 2452 2329 2329 2426 2354 2354 2452 2330 2330 2427 2330 2330 2427 2354 2354 2452 2355 2355 2453 2330 2330 2427 2355 2355 2453 2331 2331 2428 2331 2331 2428 2355 2355 2453 2356 2356 2454 2331 2331 2428 2356 2356 2454 2332 2332 2429 2332 2332 2429 2356 2356 2454 2357 2357 2455 2332 2332 2429 2357 2357 2455 2333 2333 2430 2333 2333 2430 2357 2357 2455 2358 2358 2456 2333 2333 2430 2358 2358 2456 2334 2334 2431 2334 2334 2431 2358 2358 2456 2359 2359 2457 2334 2334 2431 2359 2359 2457 2335 2335 2432 2335 2335 2432 2359 2359 2457 2360 2360 2458 2335 2335 2432 2360 2360 2458 2336 2336 2433 2336 2336 2433 2360 2360 2458 2361 2361 2459 2336 2336 2433 2361 2361 2459 2337 2337 2434 2337 2337 2434 2361 2361 2459 2362 2362 2460 2337 2337 2434 2362 2362 2460 2338 2338 2435 2338 2338 2435 2362 2362 2460 2363 2363 2461 2338 2338 2435 2363 2363 2461 2339 2339 2436 2339 2339 2436 2363 2363 2461 2364 2364 2462 2339 2339 2436 2364 2364 2462 2340 2340 2437 2340 2340 2437 2364 2364 2462 2365 2365 2463 2340 2340 2437 2365 2365 2463 2341 2341 2438 2341 2341 2438 2365 2365 2463 2366 2366 2464 2341 2341 2438 2366 2366 2464 2342 2342 2439 2342 2342 2439 2366 2366 2464 2367 2367 2465 2342 2342 2439 2367 2367 2465 2343 2343 2440 2343 2343 2440 2367 2367 2465 2368 2368 2466 2343 2343 2440 2368 2368 2466 2344 2344 2441 2344 2344 2441 2368 2368 2466 2369 2369 2467 2344 2344 2441 2369 2369 2467 2345 2345 2442 2345 2345 2442 2369 2369 2467 2370 2370 2468 2345 2345 2442 2370 2370 2468 2346 2346 2443 2346 2346 2443 2370 2370 2468 2371 2371 2469 2346 2346 2443 2371 2371 2469 2347 2347 2444 2347 2347 2444 2371 2371 2469 2372 2372 2470 2347 2347 2444 2372 2372 2470 2348 2348 2445 2348 2348 2445 2372 2372 2470 2373 2373 2471 2348 2348 2445 2373 2373 2471 2349 2349 2446 2349 2349 2446 2373 2373 2471 2374 2374 2472 2349 2349 2446 2374 2374 2472 2350 2350 2447 2350 2350 2447 2374 2374 2472 2375 2375 2473 2350 2350 2447 2375 2375 2473 2351 2351 2448 2351 2351 2448 2375 2375 2473 2352 2352 2474 2351 2351 2448 2352 2352 2474 2328 2328 2449 2352 2352 2450 2376 2376 2475 2377 2377 2476 2352 2352 2450 2377 2377 2476 2353 2353 2451 2353 2353 2451 2377 2377 2476 2378 2378 2477 2353 2353 2451 2378 2378 2477 2354 2354 2452 2354 2354 2452 2378 2378 2477 2379 2379 2478 2354 2354 2452 2379 2379 2478 2355 2355 2453 2355 2355 2453 2379 2379 2478 2380 2380 2479 2355 2355 2453 2380 2380 2479 2356 2356 2454 2356 2356 2454 2380 2380 2479 2381 2381 2480 2356 2356 2454 2381 2381 2480 2357 2357 2455 2357 2357 2455 2381 2381 2480 2382 2382 2481 2357 2357 2455 2382 2382 2481 2358 2358 2456 2358 2358 2456 2382 2382 2481 2383 2383 2482 2358 2358 2456 2383 2383 2482 2359 2359 2457 2359 2359 2457 2383 2383 2482 2384 2384 2483 2359 2359 2457 2384 2384 2483 2360 2360 2458 2360 2360 2458 2384 2384 2483 2385 2385 2484 2360 2360 2458 2385 2385 2484 2361 2361 2459 2361 2361 2459 2385 2385 2484 2386 2386 2485 2361 2361 2459 2386 2386 2485 2362 2362 2460 2362 2362 2460 2386 2386 2485 2387 2387 2486 2362 2362 2460 2387 2387 2486 2363 2363 2461 2363 2363 2461 2387 2387 2486 2388 2388 2487 2363 2363 2461 2388 2388 2487 2364 2364 2462 2364 2364 2462 2388 2388 2487 2389 2389 2488 2364 2364 2462 2389 2389 2488 2365 2365 2463 2365 2365 2463 2389 2389 2488 2390 2390 2489 2365 2365 2463 2390 2390 2489 2366 2366 2464 2366 2366 2464 2390 2390 2489 2391 2391 2490 2366 2366 2464 2391 2391 2490 2367 2367 2465 2367 2367 2465 2391 2391 2490 2392 2392 2491 2367 2367 2465 2392 2392 2491 2368 2368 2466 2368 2368 2466 2392 2392 2491 2393 2393 2492 2368 2368 2466 2393 2393 2492 2369 2369 2467 2369 2369 2467 2393 2393 2492 2394 2394 2493 2369 2369 2467 2394 2394 2493 2370 2370 2468 2370 2370 2468 2394 2394 2493 2395 2395 2494 2370 2370 2468 2395 2395 2494 2371 2371 2469 2371 2371 2469 2395 2395 2494 2396 2396 2495 2371 2371 2469 2396 2396 2495 2372 2372 2470 2372 2372 2470 2396 2396 2495 2397 2397 2496 2372 2372 2470 2397 2397 2496 2373 2373 2471 2373 2373 2471 2397 2397 2496 2398 2398 2497 2373 2373 2471 2398 2398 2497 2374 2374 2472 2374 2374 2472 2398 2398 2497 2399 2399 2498 2374 2374 2472 2399 2399 2498 2375 2375 2473 2375 2375 2473 2399 2399 2498 2376 2376 2499 2375 2375 2473 2376 2376 2499 2352 2352 2474 2376 2376 2475 2400 2400 2500 2401 2401 2501 2376 2376 2475 2401 2401 2501 2377 2377 2476 2377 2377 2476 2401 2401 2501 2402 2402 2502 2377 2377 2476 2402 2402 2502 2378 2378 2477 2378 2378 2477 2402 2402 2502 2403 2403 2503 2378 2378 2477 2403 2403 2503 2379 2379 2478 2379 2379 2478 2403 2403 2503 2404 2404 2504 2379 2379 2478 2404 2404 2504 2380 2380 2479 2380 2380 2479 2404 2404 2504 2405 2405 2505 2380 2380 2479 2405 2405 2505 2381 2381 2480 2381 2381 2480 2405 2405 2505 2406 2406 2506 2381 2381 2480 2406 2406 2506 2382 2382 2481 2382 2382 2481 2406 2406 2506 2407 2407 2507 2382 2382 2481 2407 2407 2507 2383 2383 2482 2383 2383 2482 2407 2407 2507 2408 2408 2508 2383 2383 2482 2408 2408 2508 2384 2384 2483 2384 2384 2483 2408 2408 2508 2409 2409 2509 2384 2384 2483 2409 2409 2509 2385 2385 2484 2385 2385 2484 2409 2409 2509 2410 2410 2510 2385 2385 2484 2410 2410 2510 2386 2386 2485 2386 2386 2485 2410 2410 2510 2411 2411 2511 2386 2386 2485 2411 2411 2511 2387 2387 2486 2387 2387 2486 2411 2411 2511 2412 2412 2512 2387 2387 2486 2412 2412 2512 2388 2388 2487 2388 2388 2487 2412 2412 2512 2413 2413 2513 2388 2388 2487 2413 2413 2513 2389 2389 2488 2389 2389 2488 2413 2413 2513 2414 2414 2514 2389 2389 2488 2414 2414 2514 2390 2390 2489 2390 2390 2489 2414 2414 2514 2415 2415 2515 2390 2390 2489 2415 2415 2515 2391 2391 2490 2391 2391 2490 2415 2415 2515 2416 2416 2516 2391 2391 2490 2416 2416 2516 2392 2392 2491 2392 2392 2491 2416 2416 2516 2417 2417 2517 2392 2392 2491 2417 2417 2517 2393 2393 2492 2393 2393 2492 2417 2417 2517 2418 2418 2518 2393 2393 2492 2418 2418 2518 2394 2394 2493 2394 2394 2493 2418 2418 2518 2419 2419 2519 2394 2394 2493 2419 2419 2519 2395 2395 2494 2395 2395 2494 2419 2419 2519 2420 2420 2520 2395 2395 2494 2420 2420 2520 2396 2396 2495 2396 2396 2495 2420 2420 2520 2421 2421 2521 2396 2396 2495 2421 2421 2521 2397 2397 2496 2397 2397 2496 2421 2421 2521 2422 2422 2522 2397 2397 2496 2422 2422 2522 2398 2398 2497 2398 2398 2497 2422 2422 2522 2423 2423 2523 2398 2398 2497 2423 2423 2523 2399 2399 2498 2399 2399 2498 2423 2423 2523 2400 2400 2524 2399 2399 2498 2400 2400 2524 2376 2376 2499 2400 2400 2500 2424 2424 2525 2425 2425 2526 2400 2400 2500 2425 2425 2526 2401 2401 2501 2401 2401 2501 2425 2425 2526 2426 2426 2527 2401 2401 2501 2426 2426 2527 2402 2402 2502 2402 2402 2502 2426 2426 2527 2427 2427 2528 2402 2402 2502 2427 2427 2528 2403 2403 2503 2403 2403 2503 2427 2427 2528 2428 2428 2529 2403 2403 2503 2428 2428 2529 2404 2404 2504 2404 2404 2504 2428 2428 2529 2429 2429 2530 2404 2404 2504 2429 2429 2530 2405 2405 2505 2405 2405 2505 2429 2429 2530 2430 2430 2531 2405 2405 2505 2430 2430 2531 2406 2406 2506 2406 2406 2506 2430 2430 2531 2431 2431 2532 2406 2406 2506 2431 2431 2532 2407 2407 2507 2407 2407 2507 2431 2431 2532 2432 2432 2533 2407 2407 2507 2432 2432 2533 2408 2408 2508 2408 2408 2508 2432 2432 2533 2433 2433 2534 2408 2408 2508 2433 2433 2534 2409 2409 2509 2409 2409 2509 2433 2433 2534 2434 2434 2535 2409 2409 2509 2434 2434 2535 2410 2410 2510 2410 2410 2510 2434 2434 2535 2435 2435 2536 2410 2410 2510 2435 2435 2536 2411 2411 2511 2411 2411 2511 2435 2435 2536 2436 2436 2537 2411 2411 2511 2436 2436 2537 2412 2412 2512 2412 2412 2512 2436 2436 2537 2437 2437 2538 2412 2412 2512 2437 2437 2538 2413 2413 2513 2413 2413 2513 2437 2437 2538 2438 2438 2539 2413 2413 2513 2438 2438 2539 2414 2414 2514 2414 2414 2514 2438 2438 2539 2439 2439 2540 2414 2414 2514 2439 2439 2540 2415 2415 2515 2415 2415 2515 2439 2439 2540 2440 2440 2541 2415 2415 2515 2440 2440 2541 2416 2416 2516 2416 2416 2516 2440 2440 2541 2441 2441 2542 2416 2416 2516 2441 2441 2542 2417 2417 2517 2417 2417 2517 2441 2441 2542 2442 2442 2543 2417 2417 2517 2442 2442 2543 2418 2418 2518 2418 2418 2518 2442 2442 2543 2443 2443 2544 2418 2418 2518 2443 2443 2544 2419 2419 2519 2419 2419 2519 2443 2443 2544 2444 2444 2545 2419 2419 2519 2444 2444 2545 2420 2420 2520 2420 2420 2520 2444 2444 2545 2445 2445 2546 2420 2420 2520 2445 2445 2546 2421 2421 2521 2421 2421 2521 2445 2445 2546 2446 2446 2547 2421 2421 2521 2446 2446 2547 2422 2422 2522 2422 2422 2522 2446 2446 2547 2447 2447 2548 2422 2422 2522 2447 2447 2548 2423 2423 2523 2423 2423 2523 2447 2447 2548 2424 2424 2549 2423 2423 2523 2424 2424 2549 2400 2400 2524 2424 2424 2525 2448 2448 2550 2449 2449 2551 2424 2424 2525 2449 2449 2551 2425 2425 2526 2425 2425 2526 2449 2449 2551 2450 2450 2552 2425 2425 2526 2450 2450 2552 2426 2426 2527 2426 2426 2527 2450 2450 2552 2451 2451 2553 2426 2426 2527 2451 2451 2553 2427 2427 2528 2427 2427 2528 2451 2451 2553 2452 2452 2554 2427 2427 2528 2452 2452 2554 2428 2428 2529 2428 2428 2529 2452 2452 2554 2453 2453 2555 2428 2428 2529 2453 2453 2555 2429 2429 2530 2429 2429 2530 2453 2453 2555 2454 2454 2556 2429 2429 2530 2454 2454 2556 2430 2430 2531 2430 2430 2531 2454 2454 2556 2455 2455 2557 2430 2430 2531 2455 2455 2557 2431 2431 2532 2431 2431 2532 2455 2455 2557 2456 2456 2558 2431 2431 2532 2456 2456 2558 2432 2432 2533 2432 2432 2533 2456 2456 2558 2457 2457 2559 2432 2432 2533 2457 2457 2559 2433 2433 2534 2433 2433 2534 2457 2457 2559 2458 2458 2560 2433 2433 2534 2458 2458 2560 2434 2434 2535 2434 2434 2535 2458 2458 2560 2459 2459 2561 2434 2434 2535 2459 2459 2561 2435 2435 2536 2435 2435 2536 2459 2459 2561 2460 2460 2562 2435 2435 2536 2460 2460 2562 2436 2436 2537 2436 2436 2537 2460 2460 2562 2461 2461 2563 2436 2436 2537 2461 2461 2563 2437 2437 2538 2437 2437 2538 2461 2461 2563 2462 2462 2564 2437 2437 2538 2462 2462 2564 2438 2438 2539 2438 2438 2539 2462 2462 2564 2463 2463 2565 2438 2438 2539 2463 2463 2565 2439 2439 2540 2439 2439 2540 2463 2463 2565 2464 2464 2566 2439 2439 2540 2464 2464 2566 2440 2440 2541 2440 2440 2541 2464 2464 2566 2465 2465 2567 2440 2440 2541 2465 2465 2567 2441 2441 2542 2441 2441 2542 2465 2465 2567 2466 2466 2568 2441 2441 2542 2466 2466 2568 2442 2442 2543 2442 2442 2543 2466 2466 2568 2467 2467 2569 2442 2442 2543 2467 2467 2569 2443 2443 2544 2443 2443 2544 2467 2467 2569 2468 2468 2570 2443 2443 2544 2468 2468 2570 2444 2444 2545 2444 2444 2545 2468 2468 2570 2469 2469 2571 2444 2444 2545 2469 2469 2571 2445 2445 2546 2445 2445 2546 2469 2469 2571 2470 2470 2572 2445 2445 2546 2470 2470 2572 2446 2446 2547 2446 2446 2547 2470 2470 2572 2471 2471 2573 2446 2446 2547 2471 2471 2573 2447 2447 2548 2447 2447 2548 2471 2471 2573 2448 2448 2574 2447 2447 2548 2448 2448 2574 2424 2424 2549 2448 2448 2550 2472 2472 2575 2473 2473 2576 2448 2448 2550 2473 2473 2576 2449 2449 2551 2449 2449 2551 2473 2473 2576 2474 2474 2577 2449 2449 2551 2474 2474 2577 2450 2450 2552 2450 2450 2552 2474 2474 2577 2475 2475 2578 2450 2450 2552 2475 2475 2578 2451 2451 2553 2451 2451 2553 2475 2475 2578 2476 2476 2579 2451 2451 2553 2476 2476 2579 2452 2452 2554 2452 2452 2554 2476 2476 2579 2477 2477 2580 2452 2452 2554 2477 2477 2580 2453 2453 2555 2453 2453 2555 2477 2477 2580 2478 2478 2581 2453 2453 2555 2478 2478 2581 2454 2454 2556 2454 2454 2556 2478 2478 2581 2479 2479 2582 2454 2454 2556 2479 2479 2582 2455 2455 2557 2455 2455 2557 2479 2479 2582 2480 2480 2583 2455 2455 2557 2480 2480 2583 2456 2456 2558 2456 2456 2558 2480 2480 2583 2481 2481 2584 2456 2456 2558 2481 2481 2584 2457 2457 2559 2457 2457 2559 2481 2481 2584 2482 2482 2585 2457 2457 2559 2482 2482 2585 2458 2458 2560 2458 2458 2560 2482 2482 2585 2483 2483 2586 2458 2458 2560 2483 2483 2586 2459 2459 2561 2459 2459 2561 2483 2483 2586 2484 2484 2587 2459 2459 2561 2484 2484 2587 2460 2460 2562 2460 2460 2562 2484 2484 2587 2485 2485 2588 2460 2460 2562 2485 2485 2588 2461 2461 2563 2461 2461 2563 2485 2485 2588 2486 2486 2589 2461 2461 2563 2486 2486 2589 2462 2462 2564 2462 2462 2564 2486 2486 2589 2487 2487 2590 2462 2462 2564 2487 2487 2590 2463 2463 2565 2463 2463 2565 2487 2487 2590 2488 2488 2591 2463 2463 2565 2488 2488 2591 2464 2464 2566 2464 2464 2566 2488 2488 2591 2489 2489 2592 2464 2464 2566 2489 2489 2592 2465 2465 2567 2465 2465 2567 2489 2489 2592 2490 2490 2593 2465 2465 2567 2490 2490 2593 2466 2466 2568 2466 2466 2568 2490 2490 2593 2491 2491 2594 2466 2466 2568 2491 2491 2594 2467 2467 2569 2467 2467 2569 2491 2491 2594 2492 2492 2595 2467 2467 2569 2492 2492 2595 2468 2468 2570 2468 2468 2570 2492 2492 2595 2493 2493 2596 2468 2468 2570 2493 2493 2596 2469 2469 2571 2469 2469 2571 2493 2493 2596 2494 2494 2597 2469 2469 2571 2494 2494 2597 2470 2470 2572 2470 2470 2572 2494 2494 2597 2495 2495 2598 2470 2470 2572 2495 2495 2598 2471 2471 2573 2471 2471 2573 2495 2495 2598 2472 2472 2599 2471 2471 2573 2472 2472 2599 2448 2448 2574 2472 2472 2575 2496 2496 2600 2497 2497 2601 2472 2472 2575 2497 2497 2601 2473 2473 2576 2473 2473 2576 2497 2497 2601 2498 2498 2602 2473 2473 2576 2498 2498 2602 2474 2474 2577 2474 2474 2577 2498 2498 2602 2499 2499 2603 2474 2474 2577 2499 2499 2603 2475 2475 2578 2475 2475 2578 2499 2499 2603 2500 2500 2604 2475 2475 2578 2500 2500 2604 2476 2476 2579 2476 2476 2579 2500 2500 2604 2501 2501 2605 2476 2476 2579 2501 2501 2605 2477 2477 2580 2477 2477 2580 2501 2501 2605 2502 2502 2606 2477 2477 2580 2502 2502 2606 2478 2478 2581 2478 2478 2581 2502 2502 2606 2503 2503 2607 2478 2478 2581 2503 2503 2607 2479 2479 2582 2479 2479 2582 2503 2503 2607 2504 2504 2608 2479 2479 2582 2504 2504 2608 2480 2480 2583 2480 2480 2583 2504 2504 2608 2505 2505 2609 2480 2480 2583 2505 2505 2609 2481 2481 2584 2481 2481 2584 2505 2505 2609 2506 2506 2610 2481 2481 2584 2506 2506 2610 2482 2482 2585 2482 2482 2585 2506 2506 2610 2507 2507 2611 2482 2482 2585 2507 2507 2611 2483 2483 2586 2483 2483 2586 2507 2507 2611 2508 2508 2612 2483 2483 2586 2508 2508 2612 2484 2484 2587 2484 2484 2587 2508 2508 2612 2509 2509 2613 2484 2484 2587 2509 2509 2613 2485 2485 2588 2485 2485 2588 2509 2509 2613 2510 2510 2614 2485 2485 2588 2510 2510 2614 2486 2486 2589 2486 2486 2589 2510 2510 2614 2511 2511 2615 2486 2486 2589 2511 2511 2615 2487 2487 2590 2487 2487 2590 2511 2511 2615 2512 2512 2616 2487 2487 2590 2512 2512 2616 2488 2488 2591 2488 2488 2591 2512 2512 2616 2513 2513 2617 2488 2488 2591 2513 2513 2617 2489 2489 2592 2489 2489 2592 2513 2513 2617 2514 2514 2618 2489 2489 2592 2514 2514 2618 2490 2490 2593 2490 2490 2593 2514 2514 2618 2515 2515 2619 2490 2490 2593 2515 2515 2619 2491 2491 2594 2491 2491 2594 2515 2515 2619 2516 2516 2620 2491 2491 2594 2516 2516 2620 2492 2492 2595 2492 2492 2595 2516 2516 2620 2517 2517 2621 2492 2492 2595 2517 2517 2621 2493 2493 2596 2493 2493 2596 2517 2517 2621 2518 2518 2622 2493 2493 2596 2518 2518 2622 2494 2494 2597 2494 2494 2597 2518 2518 2622 2519 2519 2623 2494 2494 2597 2519 2519 2623 2495 2495 2598 2495 2495 2598 2519 2519 2623 2496 2496 2624 2495 2495 2598 2496 2496 2624 2472 2472 2599 2496 2496 2600 2520 2520 2625 2521 2521 2626 2496 2496 2600 2521 2521 2626 2497 2497 2601 2497 2497 2601 2521 2521 2626 2522 2522 2627 2497 2497 2601 2522 2522 2627 2498 2498 2602 2498 2498 2602 2522 2522 2627 2523 2523 2628 2498 2498 2602 2523 2523 2628 2499 2499 2603 2499 2499 2603 2523 2523 2628 2524 2524 2629 2499 2499 2603 2524 2524 2629 2500 2500 2604 2500 2500 2604 2524 2524 2629 2525 2525 2630 2500 2500 2604 2525 2525 2630 2501 2501 2605 2501 2501 2605 2525 2525 2630 2526 2526 2631 2501 2501 2605 2526 2526 2631 2502 2502 2606 2502 2502 2606 2526 2526 2631 2527 2527 2632 2502 2502 2606 2527 2527 2632 2503 2503 2607 2503 2503 2607 2527 2527 2632 2528 2528 2633 2503 2503 2607 2528 2528 2633 2504 2504 2608 2504 2504 2608 2528 2528 2633 2529 2529 2634 2504 2504 2608 2529 2529 2634 2505 2505 2609 2505 2505 2609 2529 2529 2634 2530 2530 2635 2505 2505 2609 2530 2530 2635 2506 2506 2610 2506 2506 2610 2530 2530 2635 2531 2531 2636 2506 2506 2610 2531 2531 2636 2507 2507 2611 2507 2507 2611 2531 2531 2636 2532 2532 2637 2507 2507 2611 2532 2532 2637 2508 2508 2612 2508 2508 2612 2532 2532 2637 2533 2533 2638 2508 2508 2612 2533 2533 2638 2509 2509 2613 2509 2509 2613 2533 2533 2638 2534 2534 2639 2509 2509 2613 2534 2534 2639 2510 2510 2614 2510 2510 2614 2534 2534 2639 2535 2535 2640 2510 2510 2614 2535 2535 2640 2511 2511 2615 2511 2511 2615 2535 2535 2640 2536 2536 2641 2511 2511 2615 2536 2536 2641 2512 2512 2616 2512 2512 2616 2536 2536 2641 2537 2537 2642 2512 2512 2616 2537 2537 2642 2513 2513 2617 2513 2513 2617 2537 2537 2642 2538 2538 2643 2513 2513 2617 2538 2538 2643 2514 2514 2618 2514 2514 2618 2538 2538 2643 2539 2539 2644 2514 2514 2618 2539 2539 2644 2515 2515 2619 2515 2515 2619 2539 2539 2644 2540 2540 2645 2515 2515 2619 2540 2540 2645 2516 2516 2620 2516 2516 2620 2540 2540 2645 2541 2541 2646 2516 2516 2620 2541 2541 2646 2517 2517 2621 2517 2517 2621 2541 2541 2646 2542 2542 2647 2517 2517 2621 2542 2542 2647 2518 2518 2622 2518 2518 2622 2542 2542 2647 2543 2543 2648 2518 2518 2622 2543 2543 2648 2519 2519 2623 2519 2519 2623 2543 2543 2648 2520 2520 2649 2519 2519 2623 2520 2520 2649 2496 2496 2624 2520 2520 2625 2544 2544 2650 2545 2545 2651 2520 2520 2625 2545 2545 2651 2521 2521 2626 2521 2521 2626 2545 2545 2651 2546 2546 2652 2521 2521 2626 2546 2546 2652 2522 2522 2627 2522 2522 2627 2546 2546 2652 2547 2547 2653 2522 2522 2627 2547 2547 2653 2523 2523 2628 2523 2523 2628 2547 2547 2653 2548 2548 2654 2523 2523 2628 2548 2548 2654 2524 2524 2629 2524 2524 2629 2548 2548 2654 2549 2549 2655 2524 2524 2629 2549 2549 2655 2525 2525 2630 2525 2525 2630 2549 2549 2655 2550 2550 2656 2525 2525 2630 2550 2550 2656 2526 2526 2631 2526 2526 2631 2550 2550 2656 2551 2551 2657 2526 2526 2631 2551 2551 2657 2527 2527 2632 2527 2527 2632 2551 2551 2657 2552 2552 2658 2527 2527 2632 2552 2552 2658 2528 2528 2633 2528 2528 2633 2552 2552 2658 2553 2553 2659 2528 2528 2633 2553 2553 2659 2529 2529 2634 2529 2529 2634 2553 2553 2659 2554 2554 2660 2529 2529 2634 2554 2554 2660 2530 2530 2635 2530 2530 2635 2554 2554 2660 2555 2555 2661 2530 2530 2635 2555 2555 2661 2531 2531 2636 2531 2531 2636 2555 2555 2661 2556 2556 2662 2531 2531 2636 2556 2556 2662 2532 2532 2637 2532 2532 2637 2556 2556 2662 2557 2557 2663 2532 2532 2637 2557 2557 2663 2533 2533 2638 2533 2533 2638 2557 2557 2663 2558 2558 2664 2533 2533 2638 2558 2558 2664 2534 2534 2639 2534 2534 2639 2558 2558 2664 2559 2559 2665 2534 2534 2639 2559 2559 2665 2535 2535 2640 2535 2535 2640 2559 2559 2665 2560 2560 2666 2535 2535 2640 2560 2560 2666 2536 2536 2641 2536 2536 2641 2560 2560 2666 2561 2561 2667 2536 2536 2641 2561 2561 2667 2537 2537 2642 2537 2537 2642 2561 2561 2667 2562 2562 2668 2537 2537 2642 2562 2562 2668 2538 2538 2643 2538 2538 2643 2562 2562 2668 2563 2563 2669 2538 2538 2643 2563 2563 2669 2539 2539 2644 2539 2539 2644 2563 2563 2669 2564 2564 2670 2539 2539 2644 2564 2564 2670 2540 2540 2645 2540 2540 2645 2564 2564 2670 2565 2565 2671 2540 2540 2645 2565 2565 2671 2541 2541 2646 2541 2541 2646 2565 2565 2671 2566 2566 2672 2541 2541 2646 2566 2566 2672 2542 2542 2647 2542 2542 2647 2566 2566 2672 2567 2567 2673 2542 2542 2647 2567 2567 2673 2543 2543 2648 2543 2543 2648 2567 2567 2673 2544 2544 2674 2543 2543 2648 2544 2544 2674 2520 2520 2649 2544 2544 2650 2568 2568 2675 2569 2569 2676 2544 2544 2650 2569 2569 2676 2545 2545 2651 2545 2545 2651 2569 2569 2676 2570 2570 2677 2545 2545 2651 2570 2570 2677 2546 2546 2652 2546 2546 2652 2570 2570 2677 2571 2571 2678 2546 2546 2652 2571 2571 2678 2547 2547 2653 2547 2547 2653 2571 2571 2678 2572 2572 2679 2547 2547 2653 2572 2572 2679 2548 2548 2654 2548 2548 2654 2572 2572 2679 2573 2573 2680 2548 2548 2654 2573 2573 2680 2549 2549 2655 2549 2549 2655 2573 2573 2680 2574 2574 2681 2549 2549 2655 2574 2574 2681 2550 2550 2656 2550 2550 2656 2574 2574 2681 2575 2575 2682 2550 2550 2656 2575 2575 2682 2551 2551 2657 2551 2551 2657 2575 2575 2682 2576 2576 2683 2551 2551 2657 2576 2576 2683 2552 2552 2658 2552 2552 2658 2576 2576 2683 2577 2577 2684 2552 2552 2658 2577 2577 2684 2553 2553 2659 2553 2553 2659 2577 2577 2684 2578 2578 2685 2553 2553 2659 2578 2578 2685 2554 2554 2660 2554 2554 2660 2578 2578 2685 2579 2579 2686 2554 2554 2660 2579 2579 2686 2555 2555 2661 2555 2555 2661 2579 2579 2686 2580 2580 2687 2555 2555 2661 2580 2580 2687 2556 2556 2662 2556 2556 2662 2580 2580 2687 2581 2581 2688 2556 2556 2662 2581 2581 2688 2557 2557 2663 2557 2557 2663 2581 2581 2688 2582 2582 2689 2557 2557 2663 2582 2582 2689 2558 2558 2664 2558 2558 2664 2582 2582 2689 2583 2583 2690 2558 2558 2664 2583 2583 2690 2559 2559 2665 2559 2559 2665 2583 2583 2690 2584 2584 2691 2559 2559 2665 2584 2584 2691 2560 2560 2666 2560 2560 2666 2584 2584 2691 2585 2585 2692 2560 2560 2666 2585 2585 2692 2561 2561 2667 2561 2561 2667 2585 2585 2692 2586 2586 2693 2561 2561 2667 2586 2586 2693 2562 2562 2668 2562 2562 2668 2586 2586 2693 2587 2587 2694 2562 2562 2668 2587 2587 2694 2563 2563 2669 2563 2563 2669 2587 2587 2694 2588 2588 2695 2563 2563 2669 2588 2588 2695 2564 2564 2670 2564 2564 2670 2588 2588 2695 2589 2589 2696 2564 2564 2670 2589 2589 2696 2565 2565 2671 2565 2565 2671 2589 2589 2696 2590 2590 2697 2565 2565 2671 2590 2590 2697 2566 2566 2672 2566 2566 2672 2590 2590 2697 2591 2591 2698 2566 2566 2672 2591 2591 2698 2567 2567 2673 2567 2567 2673 2591 2591 2698 2568 2568 2699 2567 2567 2673 2568 2568 2699 2544 2544 2674 2568 2568 2675 2592 2592 2700 2593 2593 2701 2568 2568 2675 2593 2593 2701 2569 2569 2676 2569 2569 2676 2593 2593 2701 2594 2594 2702 2569 2569 2676 2594 2594 2702 2570 2570 2677 2570 2570 2677 2594 2594 2702 2595 2595 2703 2570 2570 2677 2595 2595 2703 2571 2571 2678 2571 2571 2678 2595 2595 2703 2596 2596 2704 2571 2571 2678 2596 2596 2704 2572 2572 2679 2572 2572 2679 2596 2596 2704 2597 2597 2705 2572 2572 2679 2597 2597 2705 2573 2573 2680 2573 2573 2680 2597 2597 2705 2598 2598 2706 2573 2573 2680 2598 2598 2706 2574 2574 2681 2574 2574 2681 2598 2598 2706 2599 2599 2707 2574 2574 2681 2599 2599 2707 2575 2575 2682 2575 2575 2682 2599 2599 2707 2600 2600 2708 2575 2575 2682 2600 2600 2708 2576 2576 2683 2576 2576 2683 2600 2600 2708 2601 2601 2709 2576 2576 2683 2601 2601 2709 2577 2577 2684 2577 2577 2684 2601 2601 2709 2602 2602 2710 2577 2577 2684 2602 2602 2710 2578 2578 2685 2578 2578 2685 2602 2602 2710 2603 2603 2711 2578 2578 2685 2603 2603 2711 2579 2579 2686 2579 2579 2686 2603 2603 2711 2604 2604 2712 2579 2579 2686 2604 2604 2712 2580 2580 2687 2580 2580 2687 2604 2604 2712 2605 2605 2713 2580 2580 2687 2605 2605 2713 2581 2581 2688 2581 2581 2688 2605 2605 2713 2606 2606 2714 2581 2581 2688 2606 2606 2714 2582 2582 2689 2582 2582 2689 2606 2606 2714 2607 2607 2715 2582 2582 2689 2607 2607 2715 2583 2583 2690 2583 2583 2690 2607 2607 2715 2608 2608 2716 2583 2583 2690 2608 2608 2716 2584 2584 2691 2584 2584 2691 2608 2608 2716 2609 2609 2717 2584 2584 2691 2609 2609 2717 2585 2585 2692 2585 2585 2692 2609 2609 2717 2610 2610 2718 2585 2585 2692 2610 2610 2718 2586 2586 2693 2586 2586 2693 2610 2610 2718 2611 2611 2719 2586 2586 2693 2611 2611 2719 2587 2587 2694 2587 2587 2694 2611 2611 2719 2612 2612 2720 2587 2587 2694 2612 2612 2720 2588 2588 2695 2588 2588 2695 2612 2612 2720 2613 2613 2721 2588 2588 2695 2613 2613 2721 2589 2589 2696 2589 2589 2696 2613 2613 2721 2614 2614 2722 2589 2589 2696 2614 2614 2722 2590 2590 2697 2590 2590 2697 2614 2614 2722 2615 2615 2723 2590 2590 2697 2615 2615 2723 2591 2591 2698 2591 2591 2698 2615 2615 2723 2592 2592 2724 2591 2591 2698 2592 2592 2724 2568 2568 2699 2592 2592 2700 2616 2616 2725 2617 2617 2726 2592 2592 2700 2617 2617 2726 2593 2593 2701 2593 2593 2701 2617 2617 2726 2618 2618 2727 2593 2593 2701 2618 2618 2727 2594 2594 2702 2594 2594 2702 2618 2618 2727 2619 2619 2728 2594 2594 2702 2619 2619 2728 2595 2595 2703 2595 2595 2703 2619 2619 2728 2620 2620 2729 2595 2595 2703 2620 2620 2729 2596 2596 2704 2596 2596 2704 2620 2620 2729 2621 2621 2730 2596 2596 2704 2621 2621 2730 2597 2597 2705 2597 2597 2705 2621 2621 2730 2622 2622 2731 2597 2597 2705 2622 2622 2731 2598 2598 2706 2598 2598 2706 2622 2622 2731 2623 2623 2732 2598 2598 2706 2623 2623 2732 2599 2599 2707 2599 2599 2707 2623 2623 2732 2624 2624 2733 2599 2599 2707 2624 2624 2733 2600 2600 2708 2600 2600 2708 2624 2624 2733 2625 2625 2734 2600 2600 2708 2625 2625 2734 2601 2601 2709 2601 2601 2709 2625 2625 2734 2626 2626 2735 2601 2601 2709 2626 2626 2735 2602 2602 2710 2602 2602 2710 2626 2626 2735 2627 2627 2736 2602 2602 2710 2627 2627 2736 2603 2603 2711 2603 2603 2711 2627 2627 2736 2628 2628 2737 2603 2603 2711 2628 2628 2737 2604 2604 2712 2604 2604 2712 2628 2628 2737 2629 2629 2738 2604 2604 2712 2629 2629 2738 2605 2605 2713 2605 2605 2713 2629 2629 2738 2630 2630 2739 2605 2605 2713 2630 2630 2739 2606 2606 2714 2606 2606 2714 2630 2630 2739 2631 2631 2740 2606 2606 2714 2631 2631 2740 2607 2607 2715 2607 2607 2715 2631 2631 2740 2632 2632 2741 2607 2607 2715 2632 2632 2741 2608 2608 2716 2608 2608 2716 2632 2632 2741 2633 2633 2742 2608 2608 2716 2633 2633 2742 2609 2609 2717 2609 2609 2717 2633 2633 2742 2634 2634 2743 2609 2609 2717 2634 2634 2743 2610 2610 2718 2610 2610 2718 2634 2634 2743 2635 2635 2744 2610 2610 2718 2635 2635 2744 2611 2611 2719 2611 2611 2719 2635 2635 2744 2636 2636 2745 2611 2611 2719 2636 2636 2745 2612 2612 2720 2612 2612 2720 2636 2636 2745 2637 2637 2746 2612 2612 2720 2637 2637 2746 2613 2613 2721 2613 2613 2721 2637 2637 2746 2638 2638 2747 2613 2613 2721 2638 2638 2747 2614 2614 2722 2614 2614 2722 2638 2638 2747 2639 2639 2748 2614 2614 2722 2639 2639 2748 2615 2615 2723 2615 2615 2723 2639 2639 2748 2616 2616 2749 2615 2615 2723 2616 2616 2749 2592 2592 2724 2616 2616 2725 2640 2640 2750 2641 2641 2751 2616 2616 2725 2641 2641 2751 2617 2617 2726 2617 2617 2726 2641 2641 2751 2642 2642 2752 2617 2617 2726 2642 2642 2752 2618 2618 2727 2618 2618 2727 2642 2642 2752 2643 2643 2753 2618 2618 2727 2643 2643 2753 2619 2619 2728 2619 2619 2728 2643 2643 2753 2644 2644 2754 2619 2619 2728 2644 2644 2754 2620 2620 2729 2620 2620 2729 2644 2644 2754 2645 2645 2755 2620 2620 2729 2645 2645 2755 2621 2621 2730 2621 2621 2730 2645 2645 2755 2646 2646 2756 2621 2621 2730 2646 2646 2756 2622 2622 2731 2622 2622 2731 2646 2646 2756 2647 2647 2757 2622 2622 2731 2647 2647 2757 2623 2623 2732 2623 2623 2732 2647 2647 2757 2648 2648 2758 2623 2623 2732 2648 2648 2758 2624 2624 2733 2624 2624 2733 2648 2648 2758 2649 2649 2759 2624 2624 2733 2649 2649 2759 2625 2625 2734 2625 2625 2734 2649 2649 2759 2650 2650 2760 2625 2625 2734 2650 2650 2760 2626 2626 2735 2626 2626 2735 2650 2650 2760 2651 2651 2761 2626 2626 2735 2651 2651 2761 2627 2627 2736 2627 2627 2736 2651 2651 2761 2652 2652 2762 2627 2627 2736 2652 2652 2762 2628 2628 2737 2628 2628 2737 2652 2652 2762 2653 2653 2763 2628 2628 2737 2653 2653 2763 2629 2629 2738 2629 2629 2738 2653 2653 2763 2654 2654 2764 2629 2629 2738 2654 2654 2764 2630 2630 2739 2630 2630 2739 2654 2654 2764 2655 2655 2765 2630 2630 2739 2655 2655 2765 2631 2631 2740 2631 2631 2740 2655 2655 2765 2656 2656 2766 2631 2631 2740 2656 2656 2766 2632 2632 2741 2632 2632 2741 2656 2656 2766 2657 2657 2767 2632 2632 2741 2657 2657 2767 2633 2633 2742 2633 2633 2742 2657 2657 2767 2658 2658 2768 2633 2633 2742 2658 2658 2768 2634 2634 2743 2634 2634 2743 2658 2658 2768 2659 2659 2769 2634 2634 2743 2659 2659 2769 2635 2635 2744 2635 2635 2744 2659 2659 2769 2660 2660 2770 2635 2635 2744 2660 2660 2770 2636 2636 2745 2636 2636 2745 2660 2660 2770 2661 2661 2771 2636 2636 2745 2661 2661 2771 2637 2637 2746 2637 2637 2746 2661 2661 2771 2662 2662 2772 2637 2637 2746 2662 2662 2772 2638 2638 2747 2638 2638 2747 2662 2662 2772 2663 2663 2773 2638 2638 2747 2663 2663 2773 2639 2639 2748 2639 2639 2748 2663 2663 2773 2640 2640 2774 2639 2639 2748 2640 2640 2774 2616 2616 2749 2640 2640 2750 2664 2664 2775 2665 2665 2776 2640 2640 2750 2665 2665 2776 2641 2641 2751 2641 2641 2751 2665 2665 2776 2666 2666 2777 2641 2641 2751 2666 2666 2777 2642 2642 2752 2642 2642 2752 2666 2666 2777 2667 2667 2778 2642 2642 2752 2667 2667 2778 2643 2643 2753 2643 2643 2753 2667 2667 2778 2668 2668 2779 2643 2643 2753 2668 2668 2779 2644 2644 2754 2644 2644 2754 2668 2668 2779 2669 2669 2780 2644 2644 2754 2669 2669 2780 2645 2645 2755 2645 2645 2755 2669 2669 2780 2670 2670 2781 2645 2645 2755 2670 2670 2781 2646 2646 2756 2646 2646 2756 2670 2670 2781 2671 2671 2782 2646 2646 2756 2671 2671 2782 2647 2647 2757 2647 2647 2757 2671 2671 2782 2672 2672 2783 2647 2647 2757 2672 2672 2783 2648 2648 2758 2648 2648 2758 2672 2672 2783 2673 2673 2784 2648 2648 2758 2673 2673 2784 2649 2649 2759 2649 2649 2759 2673 2673 2784 2674 2674 2785 2649 2649 2759 2674 2674 2785 2650 2650 2760 2650 2650 2760 2674 2674 2785 2675 2675 2786 2650 2650 2760 2675 2675 2786 2651 2651 2761 2651 2651 2761 2675 2675 2786 2676 2676 2787 2651 2651 2761 2676 2676 2787 2652 2652 2762 2652 2652 2762 2676 2676 2787 2677 2677 2788 2652 2652 2762 2677 2677 2788 2653 2653 2763 2653 2653 2763 2677 2677 2788 2678 2678 2789 2653 2653 2763 2678 2678 2789 2654 2654 2764 2654 2654 2764 2678 2678 2789 2679 2679 2790 2654 2654 2764 2679 2679 2790 2655 2655 2765 2655 2655 2765 2679 2679 2790 2680 2680 2791 2655 2655 2765 2680 2680 2791 2656 2656 2766 2656 2656 2766 2680 2680 2791 2681 2681 2792 2656 2656 2766 2681 2681 2792 2657 2657 2767 2657 2657 2767 2681 2681 2792 2682 2682 2793 2657 2657 2767 2682 2682 2793 2658 2658 2768 2658 2658 2768 2682 2682 2793 2683 2683 2794 2658 2658 2768 2683 2683 2794 2659 2659 2769 2659 2659 2769 2683 2683 2794 2684 2684 2795 2659 2659 2769 2684 2684 2795 2660 2660 2770 2660 2660 2770 2684 2684 2795 2685 2685 2796 2660 2660 2770 2685 2685 2796 2661 2661 2771 2661 2661 2771 2685 2685 2796 2686 2686 2797 2661 2661 2771 2686 2686 2797 2662 2662 2772 2662 2662 2772 2686 2686 2797 2687 2687 2798 2662 2662 2772 2687 2687 2798 2663 2663 2773 2663 2663 2773 2687 2687 2798 2664 2664 2799 2663 2663 2773 2664 2664 2799 2640 2640 2774 2664 2664 2775 2688 2688 2800 2689 2689 2801 2664 2664 2775 2689 2689 2801 2665 2665 2776 2665 2665 2776 2689 2689 2801 2690 2690 2802 2665 2665 2776 2690 2690 2802 2666 2666 2777 2666 2666 2777 2690 2690 2802 2691 2691 2803 2666 2666 2777 2691 2691 2803 2667 2667 2778 2667 2667 2778 2691 2691 2803 2692 2692 2804 2667 2667 2778 2692 2692 2804 2668 2668 2779 2668 2668 2779 2692 2692 2804 2693 2693 2805 2668 2668 2779 2693 2693 2805 2669 2669 2780 2669 2669 2780 2693 2693 2805 2694 2694 2806 2669 2669 2780 2694 2694 2806 2670 2670 2781 2670 2670 2781 2694 2694 2806 2695 2695 2807 2670 2670 2781 2695 2695 2807 2671 2671 2782 2671 2671 2782 2695 2695 2807 2696 2696 2808 2671 2671 2782 2696 2696 2808 2672 2672 2783 2672 2672 2783 2696 2696 2808 2697 2697 2809 2672 2672 2783 2697 2697 2809 2673 2673 2784 2673 2673 2784 2697 2697 2809 2698 2698 2810 2673 2673 2784 2698 2698 2810 2674 2674 2785 2674 2674 2785 2698 2698 2810 2699 2699 2811 2674 2674 2785 2699 2699 2811 2675 2675 2786 2675 2675 2786 2699 2699 2811 2700 2700 2812 2675 2675 2786 2700 2700 2812 2676 2676 2787 2676 2676 2787 2700 2700 2812 2701 2701 2813 2676 2676 2787 2701 2701 2813 2677 2677 2788 2677 2677 2788 2701 2701 2813 2702 2702 2814 2677 2677 2788 2702 2702 2814 2678 2678 2789 2678 2678 2789 2702 2702 2814 2703 2703 2815 2678 2678 2789 2703 2703 2815 2679 2679 2790 2679 2679 2790 2703 2703 2815 2704 2704 2816 2679 2679 2790 2704 2704 2816 2680 2680 2791 2680 2680 2791 2704 2704 2816 2705 2705 2817 2680 2680 2791 2705 2705 2817 2681 2681 2792 2681 2681 2792 2705 2705 2817 2706 2706 2818 2681 2681 2792 2706 2706 2818 2682 2682 2793 2682 2682 2793 2706 2706 2818 2707 2707 2819 2682 2682 2793 2707 2707 2819 2683 2683 2794 2683 2683 2794 2707 2707 2819 2708 2708 2820 2683 2683 2794 2708 2708 2820 2684 2684 2795 2684 2684 2795 2708 2708 2820 2709 2709 2821 2684 2684 2795 2709 2709 2821 2685 2685 2796 2685 2685 2796 2709 2709 2821 2710 2710 2822 2685 2685 2796 2710 2710 2822 2686 2686 2797 2686 2686 2797 2710 2710 2822 2711 2711 2823 2686 2686 2797 2711 2711 2823 2687 2687 2798 2687 2687 2798 2711 2711 2823 2688 2688 2824 2687 2687 2798 2688 2688 2824 2664 2664 2799 2688 2688 2800 2712 2712 2825 2713 2713 2826 2688 2688 2800 2713 2713 2826 2689 2689 2801 2689 2689 2801 2713 2713 2826 2714 2714 2827 2689 2689 2801 2714 2714 2827 2690 2690 2802 2690 2690 2802 2714 2714 2827 2715 2715 2828 2690 2690 2802 2715 2715 2828 2691 2691 2803 2691 2691 2803 2715 2715 2828 2716 2716 2829 2691 2691 2803 2716 2716 2829 2692 2692 2804 2692 2692 2804 2716 2716 2829 2717 2717 2830 2692 2692 2804 2717 2717 2830 2693 2693 2805 2693 2693 2805 2717 2717 2830 2718 2718 2831 2693 2693 2805 2718 2718 2831 2694 2694 2806 2694 2694 2806 2718 2718 2831 2719 2719 2832 2694 2694 2806 2719 2719 2832 2695 2695 2807 2695 2695 2807 2719 2719 2832 2720 2720 2833 2695 2695 2807 2720 2720 2833 2696 2696 2808 2696 2696 2808 2720 2720 2833 2721 2721 2834 2696 2696 2808 2721 2721 2834 2697 2697 2809 2697 2697 2809 2721 2721 2834 2722 2722 2835 2697 2697 2809 2722 2722 2835 2698 2698 2810 2698 2698 2810 2722 2722 2835 2723 2723 2836 2698 2698 2810 2723 2723 2836 2699 2699 2811 2699 2699 2811 2723 2723 2836 2724 2724 2837 2699 2699 2811 2724 2724 2837 2700 2700 2812 2700 2700 2812 2724 2724 2837 2725 2725 2838 2700 2700 2812 2725 2725 2838 2701 2701 2813 2701 2701 2813 2725 2725 2838 2726 2726 2839 2701 2701 2813 2726 2726 2839 2702 2702 2814 2702 2702 2814 2726 2726 2839 2727 2727 2840 2702 2702 2814 2727 2727 2840 2703 2703 2815 2703 2703 2815 2727 2727 2840 2728 2728 2841 2703 2703 2815 2728 2728 2841 2704 2704 2816 2704 2704 2816 2728 2728 2841 2729 2729 2842 2704 2704 2816 2729 2729 2842 2705 2705 2817 2705 2705 2817 2729 2729 2842 2730 2730 2843 2705 2705 2817 2730 2730 2843 2706 2706 2818 2706 2706 2818 2730 2730 2843 2731 2731 2844 2706 2706 2818 2731 2731 2844 2707 2707 2819 2707 2707 2819 2731 2731 2844 2732 2732 2845 2707 2707 2819 2732 2732 2845 2708 2708 2820 2708 2708 2820 2732 2732 2845 2733 2733 2846 2708 2708 2820 2733 2733 2846 2709 2709 2821 2709 2709 2821 2733 2733 2846 2734 2734 2847 2709 2709 2821 2734 2734 2847 2710 2710 2822 2710 2710 2822 2734 2734 2847 2735 2735 2848 2710 2710 2822 2735 2735 2848 2711 2711 2823 2711 2711 2823 2735 2735 2848 2712 2712 2849 2711 2711 2823 2712 2712 2849 2688 2688 2824 2712 2712 2825 2736 2736 2850 2737 2737 2851 2712 2712 2825 2737 2737 2851 2713 2713 2826 2713 2713 2826 2737 2737 2851 2738 2738 2852 2713 2713 2826 2738 2738 2852 2714 2714 2827 2714 2714 2827 2738 2738 2852 2739 2739 2853 2714 2714 2827 2739 2739 2853 2715 2715 2828 2715 2715 2828 2739 2739 2853 2740 2740 2854 2715 2715 2828 2740 2740 2854 2716 2716 2829 2716 2716 2829 2740 2740 2854 2741 2741 2855 2716 2716 2829 2741 2741 2855 2717 2717 2830 2717 2717 2830 2741 2741 2855 2742 2742 2856 2717 2717 2830 2742 2742 2856 2718 2718 2831 2718 2718 2831 2742 2742 2856 2743 2743 2857 2718 2718 2831 2743 2743 2857 2719 2719 2832 2719 2719 2832 2743 2743 2857 2744 2744 2858 2719 2719 2832 2744 2744 2858 2720 2720 2833 2720 2720 2833 2744 2744 2858 2745 2745 2859 2720 2720 2833 2745 2745 2859 2721 2721 2834 2721 2721 2834 2745 2745 2859 2746 2746 2860 2721 2721 2834 2746 2746 2860 2722 2722 2835 2722 2722 2835 2746 2746 2860 2747 2747 2861 2722 2722 2835 2747 2747 2861 2723 2723 2836 2723 2723 2836 2747 2747 2861 2748 2748 2862 2723 2723 2836 2748 2748 2862 2724 2724 2837 2724 2724 2837 2748 2748 2862 2749 2749 2863 2724 2724 2837 2749 2749 2863 2725 2725 2838 2725 2725 2838 2749 2749 2863 2750 2750 2864 2725 2725 2838 2750 2750 2864 2726 2726 2839 2726 2726 2839 2750 2750 2864 2751 2751 2865 2726 2726 2839 2751 2751 2865 2727 2727 2840 2727 2727 2840 2751 2751 2865 2752 2752 2866 2727 2727 2840 2752 2752 2866 2728 2728 2841 2728 2728 2841 2752 2752 2866 2753 2753 2867 2728 2728 2841 2753 2753 2867 2729 2729 2842 2729 2729 2842 2753 2753 2867 2754 2754 2868 2729 2729 2842 2754 2754 2868 2730 2730 2843 2730 2730 2843 2754 2754 2868 2755 2755 2869 2730 2730 2843 2755 2755 2869 2731 2731 2844 2731 2731 2844 2755 2755 2869 2756 2756 2870 2731 2731 2844 2756 2756 2870 2732 2732 2845 2732 2732 2845 2756 2756 2870 2757 2757 2871 2732 2732 2845 2757 2757 2871 2733 2733 2846 2733 2733 2846 2757 2757 2871 2758 2758 2872 2733 2733 2846 2758 2758 2872 2734 2734 2847 2734 2734 2847 2758 2758 2872 2759 2759 2873 2734 2734 2847 2759 2759 2873 2735 2735 2848 2735 2735 2848 2759 2759 2873 2736 2736 2874 2735 2735 2848 2736 2736 2874 2712 2712 2849 2736 2736 2850 2760 2760 2875 2761 2761 2876 2736 2736 2850 2761 2761 2876 2737 2737 2851 2737 2737 2851 2761 2761 2876 2762 2762 2877 2737 2737 2851 2762 2762 2877 2738 2738 2852 2738 2738 2852 2762 2762 2877 2763 2763 2878 2738 2738 2852 2763 2763 2878 2739 2739 2853 2739 2739 2853 2763 2763 2878 2764 2764 2879 2739 2739 2853 2764 2764 2879 2740 2740 2854 2740 2740 2854 2764 2764 2879 2765 2765 2880 2740 2740 2854 2765 2765 2880 2741 2741 2855 2741 2741 2855 2765 2765 2880 2766 2766 2881 2741 2741 2855 2766 2766 2881 2742 2742 2856 2742 2742 2856 2766 2766 2881 2767 2767 2882 2742 2742 2856 2767 2767 2882 2743 2743 2857 2743 2743 2857 2767 2767 2882 2768 2768 2883 2743 2743 2857 2768 2768 2883 2744 2744 2858 2744 2744 2858 2768 2768 2883 2769 2769 2884 2744 2744 2858 2769 2769 2884 2745 2745 2859 2745 2745 2859 2769 2769 2884 2770 2770 2885 2745 2745 2859 2770 2770 2885 2746 2746 2860 2746 2746 2860 2770 2770 2885 2771 2771 2886 2746 2746 2860 2771 2771 2886 2747 2747 2861 2747 2747 2861 2771 2771 2886 2772 2772 2887 2747 2747 2861 2772 2772 2887 2748 2748 2862 2748 2748 2862 2772 2772 2887 2773 2773 2888 2748 2748 2862 2773 2773 2888 2749 2749 2863 2749 2749 2863 2773 2773 2888 2774 2774 2889 2749 2749 2863 2774 2774 2889 2750 2750 2864 2750 2750 2864 2774 2774 2889 2775 2775 2890 2750 2750 2864 2775 2775 2890 2751 2751 2865 2751 2751 2865 2775 2775 2890 2776 2776 2891 2751 2751 2865 2776 2776 2891 2752 2752 2866 2752 2752 2866 2776 2776 2891 2777 2777 2892 2752 2752 2866 2777 2777 2892 2753 2753 2867 2753 2753 2867 2777 2777 2892 2778 2778 2893 2753 2753 2867 2778 2778 2893 2754 2754 2868 2754 2754 2868 2778 2778 2893 2779 2779 2894 2754 2754 2868 2779 2779 2894 2755 2755 2869 2755 2755 2869 2779 2779 2894 2780 2780 2895 2755 2755 2869 2780 2780 2895 2756 2756 2870 2756 2756 2870 2780 2780 2895 2781 2781 2896 2756 2756 2870 2781 2781 2896 2757 2757 2871 2757 2757 2871 2781 2781 2896 2782 2782 2897 2757 2757 2871 2782 2782 2897 2758 2758 2872 2758 2758 2872 2782 2782 2897 2783 2783 2898 2758 2758 2872 2783 2783 2898 2759 2759 2873 2759 2759 2873 2783 2783 2898 2760 2760 2899 2759 2759 2873 2760 2760 2899 2736 2736 2874 2760 2760 2875 2784 2784 2900 2785 2785 2901 2760 2760 2875 2785 2785 2901 2761 2761 2876 2761 2761 2876 2785 2785 2901 2786 2786 2902 2761 2761 2876 2786 2786 2902 2762 2762 2877 2762 2762 2877 2786 2786 2902 2787 2787 2903 2762 2762 2877 2787 2787 2903 2763 2763 2878 2763 2763 2878 2787 2787 2903 2788 2788 2904 2763 2763 2878 2788 2788 2904 2764 2764 2879 2764 2764 2879 2788 2788 2904 2789 2789 2905 2764 2764 2879 2789 2789 2905 2765 2765 2880 2765 2765 2880 2789 2789 2905 2790 2790 2906 2765 2765 2880 2790 2790 2906 2766 2766 2881 2766 2766 2881 2790 2790 2906 2791 2791 2907 2766 2766 2881 2791 2791 2907 2767 2767 2882 2767 2767 2882 2791 2791 2907 2792 2792 2908 2767 2767 2882 2792 2792 2908 2768 2768 2883 2768 2768 2883 2792 2792 2908 2793 2793 2909 2768 2768 2883 2793 2793 2909 2769 2769 2884 2769 2769 2884 2793 2793 2909 2794 2794 2910 2769 2769 2884 2794 2794 2910 2770 2770 2885 2770 2770 2885 2794 2794 2910 2795 2795 2911 2770 2770 2885 2795 2795 2911 2771 2771 2886 2771 2771 2886 2795 2795 2911 2796 2796 2912 2771 2771 2886 2796 2796 2912 2772 2772 2887 2772 2772 2887 2796 2796 2912 2797 2797 2913 2772 2772 2887 2797 2797 2913 2773 2773 2888 2773 2773 2888 2797 2797 2913 2798 2798 2914 2773 2773 2888 2798 2798 2914 2774 2774 2889 2774 2774 2889 2798 2798 2914 2799 2799 2915 2774 2774 2889 2799 2799 2915 2775 2775 2890 2775 2775 2890 2799 2799 2915 2800 2800 2916 2775 2775 2890 2800 2800 2916 2776 2776 2891 2776 2776 2891 2800 2800 2916 2801 2801 2917 2776 2776 2891 2801 2801 2917 2777 2777 2892 2777 2777 2892 2801 2801 2917 2802 2802 2918 2777 2777 2892 2802 2802 2918 2778 2778 2893 2778 2778 2893 2802 2802 2918 2803 2803 2919 2778 2778 2893 2803 2803 2919 2779 2779 2894 2779 2779 2894 2803 2803 2919 2804 2804 2920 2779 2779 2894 2804 2804 2920 2780 2780 2895 2780 2780 2895 2804 2804 2920 2805 2805 2921 2780 2780 2895 2805 2805 2921 2781 2781 2896 2781 2781 2896 2805 2805 2921 2806 2806 2922 2781 2781 2896 2806 2806 2922 2782 2782 2897 2782 2782 2897 2806 2806 2922 2807 2807 2923 2782 2782 2897 2807 2807 2923 2783 2783 2898 2783 2783 2898 2807 2807 2923 2784 2784 2924 2783 2783 2898 2784 2784 2924 2760 2760 2899 2784 2784 2900 2808 2808 2925 2809 2809 2926 2784 2784 2900 2809 2809 2926 2785 2785 2901 2785 2785 2901 2809 2809 2926 2810 2810 2927 2785 2785 2901 2810 2810 2927 2786 2786 2902 2786 2786 2902 2810 2810 2927 2811 2811 2928 2786 2786 2902 2811 2811 2928 2787 2787 2903 2787 2787 2903 2811 2811 2928 2812 2812 2929 2787 2787 2903 2812 2812 2929 2788 2788 2904 2788 2788 2904 2812 2812 2929 2813 2813 2930 2788 2788 2904 2813 2813 2930 2789 2789 2905 2789 2789 2905 2813 2813 2930 2814 2814 2931 2789 2789 2905 2814 2814 2931 2790 2790 2906 2790 2790 2906 2814 2814 2931 2815 2815 2932 2790 2790 2906 2815 2815 2932 2791 2791 2907 2791 2791 2907 2815 2815 2932 2816 2816 2933 2791 2791 2907 2816 2816 2933 2792 2792 2908 2792 2792 2908 2816 2816 2933 2817 2817 2934 2792 2792 2908 2817 2817 2934 2793 2793 2909 2793 2793 2909 2817 2817 2934 2818 2818 2935 2793 2793 2909 2818 2818 2935 2794 2794 2910 2794 2794 2910 2818 2818 2935 2819 2819 2936 2794 2794 2910 2819 2819 2936 2795 2795 2911 2795 2795 2911 2819 2819 2936 2820 2820 2937 2795 2795 2911 2820 2820 2937 2796 2796 2912 2796 2796 2912 2820 2820 2937 2821 2821 2938 2796 2796 2912 2821 2821 2938 2797 2797 2913 2797 2797 2913 2821 2821 2938 2822 2822 2939 2797 2797 2913 2822 2822 2939 2798 2798 2914 2798 2798 2914 2822 2822 2939 2823 2823 2940 2798 2798 2914 2823 2823 2940 2799 2799 2915 2799 2799 2915 2823 2823 2940 2824 2824 2941 2799 2799 2915 2824 2824 2941 2800 2800 2916 2800 2800 2916 2824 2824 2941 2825 2825 2942 2800 2800 2916 2825 2825 2942 2801 2801 2917 2801 2801 2917 2825 2825 2942 2826 2826 2943 2801 2801 2917 2826 2826 2943 2802 2802 2918 2802 2802 2918 2826 2826 2943 2827 2827 2944 2802 2802 2918 2827 2827 2944 2803 2803 2919 2803 2803 2919 2827 2827 2944 2828 2828 2945 2803 2803 2919 2828 2828 2945 2804 2804 2920 2804 2804 2920 2828 2828 2945 2829 2829 2946 2804 2804 2920 2829 2829 2946 2805 2805 2921 2805 2805 2921 2829 2829 2946 2830 2830 2947 2805 2805 2921 2830 2830 2947 2806 2806 2922 2806 2806 2922 2830 2830 2947 2831 2831 2948 2806 2806 2922 2831 2831 2948 2807 2807 2923 2807 2807 2923 2831 2831 2948 2808 2808 2949 2807 2807 2923 2808 2808 2949 2784 2784 2924 2808 2808 2925 2832 2832 2950 2833 2833 2951 2808 2808 2925 2833 2833 2951 2809 2809 2926 2809 2809 2926 2833 2833 2951 2834 2834 2952 2809 2809 2926 2834 2834 2952 2810 2810 2927 2810 2810 2927 2834 2834 2952 2835 2835 2953 2810 2810 2927 2835 2835 2953 2811 2811 2928 2811 2811 2928 2835 2835 2953 2836 2836 2954 2811 2811 2928 2836 2836 2954 2812 2812 2929 2812 2812 2929 2836 2836 2954 2837 2837 2955 2812 2812 2929 2837 2837 2955 2813 2813 2930 2813 2813 2930 2837 2837 2955 2838 2838 2956 2813 2813 2930 2838 2838 2956 2814 2814 2931 2814 2814 2931 2838 2838 2956 2839 2839 2957 2814 2814 2931 2839 2839 2957 2815 2815 2932 2815 2815 2932 2839 2839 2957 2840 2840 2958 2815 2815 2932 2840 2840 2958 2816 2816 2933 2816 2816 2933 2840 2840 2958 2841 2841 2959 2816 2816 2933 2841 2841 2959 2817 2817 2934 2817 2817 2934 2841 2841 2959 2842 2842 2960 2817 2817 2934 2842 2842 2960 2818 2818 2935 2818 2818 2935 2842 2842 2960 2843 2843 2961 2818 2818 2935 2843 2843 2961 2819 2819 2936 2819 2819 2936 2843 2843 2961 2844 2844 2962 2819 2819 2936 2844 2844 2962 2820 2820 2937 2820 2820 2937 2844 2844 2962 2845 2845 2963 2820 2820 2937 2845 2845 2963 2821 2821 2938 2821 2821 2938 2845 2845 2963 2846 2846 2964 2821 2821 2938 2846 2846 2964 2822 2822 2939 2822 2822 2939 2846 2846 2964 2847 2847 2965 2822 2822 2939 2847 2847 2965 2823 2823 2940 2823 2823 2940 2847 2847 2965 2848 2848 2966 2823 2823 2940 2848 2848 2966 2824 2824 2941 2824 2824 2941 2848 2848 2966 2849 2849 2967 2824 2824 2941 2849 2849 2967 2825 2825 2942 2825 2825 2942 2849 2849 2967 2850 2850 2968 2825 2825 2942 2850 2850 2968 2826 2826 2943 2826 2826 2943 2850 2850 2968 2851 2851 2969 2826 2826 2943 2851 2851 2969 2827 2827 2944 2827 2827 2944 2851 2851 2969 2852 2852 2970 2827 2827 2944 2852 2852 2970 2828 2828 2945 2828 2828 2945 2852 2852 2970 2853 2853 2971 2828 2828 2945 2853 2853 2971 2829 2829 2946 2829 2829 2946 2853 2853 2971 2854 2854 2972 2829 2829 2946 2854 2854 2972 2830 2830 2947 2830 2830 2947 2854 2854 2972 2855 2855 2973 2830 2830 2947 2855 2855 2973 2831 2831 2948 2831 2831 2948 2855 2855 2973 2832 2832 2974 2831 2831 2948 2832 2832 2974 2808 2808 2949 2832 2832 2950 2856 2856 2975 2857 2857 2976 2832 2832 2950 2857 2857 2976 2833 2833 2951 2833 2833 2951 2857 2857 2976 2858 2858 2977 2833 2833 2951 2858 2858 2977 2834 2834 2952 2834 2834 2952 2858 2858 2977 2859 2859 2978 2834 2834 2952 2859 2859 2978 2835 2835 2953 2835 2835 2953 2859 2859 2978 2860 2860 2979 2835 2835 2953 2860 2860 2979 2836 2836 2954 2836 2836 2954 2860 2860 2979 2861 2861 2980 2836 2836 2954 2861 2861 2980 2837 2837 2955 2837 2837 2955 2861 2861 2980 2862 2862 2981 2837 2837 2955 2862 2862 2981 2838 2838 2956 2838 2838 2956 2862 2862 2981 2863 2863 2982 2838 2838 2956 2863 2863 2982 2839 2839 2957 2839 2839 2957 2863 2863 2982 2864 2864 2983 2839 2839 2957 2864 2864 2983 2840 2840 2958 2840 2840 2958 2864 2864 2983 2865 2865 2984 2840 2840 2958 2865 2865 2984 2841 2841 2959 2841 2841 2959 2865 2865 2984 2866 2866 2985 2841 2841 2959 2866 2866 2985 2842 2842 2960 2842 2842 2960 2866 2866 2985 2867 2867 2986 2842 2842 2960 2867 2867 2986 2843 2843 2961 2843 2843 2961 2867 2867 2986 2868 2868 2987 2843 2843 2961 2868 2868 2987 2844 2844 2962 2844 2844 2962 2868 2868 2987 2869 2869 2988 2844 2844 2962 2869 2869 2988 2845 2845 2963 2845 2845 2963 2869 2869 2988 2870 2870 2989 2845 2845 2963 2870 2870 2989 2846 2846 2964 2846 2846 2964 2870 2870 2989 2871 2871 2990 2846 2846 2964 2871 2871 2990 2847 2847 2965 2847 2847 2965 2871 2871 2990 2872 2872 2991 2847 2847 2965 2872 2872 2991 2848 2848 2966 2848 2848 2966 2872 2872 2991 2873 2873 2992 2848 2848 2966 2873 2873 2992 2849 2849 2967 2849 2849 2967 2873 2873 2992 2874 2874 2993 2849 2849 2967 2874 2874 2993 2850 2850 2968 2850 2850 2968 2874 2874 2993 2875 2875 2994 2850 2850 2968 2875 2875 2994 2851 2851 2969 2851 2851 2969 2875 2875 2994 2876 2876 2995 2851 2851 2969 2876 2876 2995 2852 2852 2970 2852 2852 2970 2876 2876 2995 2877 2877 2996 2852 2852 2970 2877 2877 2996 2853 2853 2971 2853 2853 2971 2877 2877 2996 2878 2878 2997 2853 2853 2971 2878 2878 2997 2854 2854 2972 2854 2854 2972 2878 2878 2997 2879 2879 2998 2854 2854 2972 2879 2879 2998 2855 2855 2973 2855 2855 2973 2879 2879 2998 2856 2856 2999 2855 2855 2973 2856 2856 2999 2832 2832 2974 2856 2856 2975 0 0 3000 1 3 3001 2856 2856 2975 1 3 3001 2857 2857 2976 2857 2857 2976 1 3 3001 2 5 3002 2857 2857 2976 2 5 3002 2858 2858 2977 2858 2858 2977 2 5 3002 3 7 3003 2858 2858 2977 3 7 3003 2859 2859 2978 2859 2859 2978 3 7 3003 4 9 3004 2859 2859 2978 4 9 3004 2860 2860 2979 2860 2860 2979 4 9 3004 5 11 3005 2860 2860 2979 5 11 3005 2861 2861 2980 2861 2861 2980 5 11 3005 6 13 3006 2861 2861 2980 6 13 3006 2862 2862 2981 2862 2862 2981 6 13 3006 7 15 3007 2862 2862 2981 7 15 3007 2863 2863 2982 2863 2863 2982 7 15 3007 8 17 3008 2863 2863 2982 8 17 3008 2864 2864 2983 2864 2864 2983 8 17 3008 9 19 3009 2864 2864 2983 9 19 3009 2865 2865 2984 2865 2865 2984 9 19 3009 10 21 3010 2865 2865 2984 10 21 3010 2866 2866 2985 2866 2866 2985 10 21 3010 11 23 3011 2866 2866 2985 11 23 3011 2867 2867 2986 2867 2867 2986 11 23 3011 12 25 3012 2867 2867 2986 12 25 3012 2868 2868 2987 2868 2868 2987 12 25 3012 13 27 3013 2868 2868 2987 13 27 3013 2869 2869 2988 2869 2869 2988 13 27 3013 14 29 3014 2869 2869 2988 14 29 3014 2870 2870 2989 2870 2870 2989 14 29 3014 15 31 3015 2870 2870 2989 15 31 3015 2871 2871 2990 2871 2871 2990 15 31 3015 16 33 3016 2871 2871 2990 16 33 3016 2872 2872 2991 2872 2872 2991 16 33 3016 17 35 3017 2872 2872 2991 17 35 3017 2873 2873 2992 2873 2873 2992 17 35 3017 18 37 3018 2873 2873 2992 18 37 3018 2874 2874 2993 2874 2874 2993 18 37 3018 19 39 3019 2874 2874 2993 19 39 3019 2875 2875 2994 2875 2875 2994 19 39 3019 20 41 3020 2875 2875 2994 20 41 3020 2876 2876 2995 2876 2876 2995 20 41 3020 21 43 3021 2876 2876 2995 21 43 3021 2877 2877 2996 2877 2877 2996 21 43 3021 22 45 3022 2877 2877 2996 22 45 3022 2878 2878 2997 2878 2878 2997 22 45 3022 23 47 3023 2878 2878 2997 23 47 3023 2879 2879 2998 2879 2879 2998 23 47 3023 0 0 3024 2879 2879 2998 0 0 3024 2856 2856 2999</p>
+ </triangles>
+ </mesh>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="Torus_Knot-8_max" name="Torus_Knot-8_max">
+ <node id="Torus_Knot01-node" name="Torus_Knot01" type="NODE">
+ <translate>0 0 0</translate>
+ <rotate>-1.000000 0 0 -90.000000</rotate>
+ <instance_geometry url="#Torus_Knot01-mesh">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="Torus-Knot" target="#Torus-Knot"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="MAX3D">
+ <frame_rate>30</frame_rate>
+ </technique>
+ <technique profile="FCOLLADA">
+ <start_time>0</start_time>
+ <end_time>3.333333</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_visual_scene url="#Torus_Knot-8_max"/>
+ </scene>
+</COLLADA>
diff --git a/Studio/Content/Models Library/Primitives/Torus/Torus.dae b/Studio/Content/Models Library/Primitives/Torus/Torus.dae
new file mode 100644
index 0000000..880f8b1
--- /dev/null
+++ b/Studio/Content/Models Library/Primitives/Torus/Torus.dae
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
+ <asset>
+ <contributor>
+ <author>jgiles</author>
+ <authoring_tool>Maya8.5 | ColladaMaya v3.04E</authoring_tool>
+ <comments>SSKK Patch3
+ColladaMaya export options: bakeTransforms=0;exportPolygonMeshes=1;bakeLighting=0;isSampling=0;
+curveConstrainSampling=0;removeStaticCurves=1;exportCameraAsLookat=0;
+exportLights=1;exportCameras=1;exportJointsAndSkin=1;
+exportAnimations=1;exportTriangles=1;exportInvisibleNodes=0;
+exportNormals=1;exportTexCoords=1;
+exportVertexColors=1;exportVertexColorsAnimation=0;exportTangents=0;
+exportTexTangents=0;exportConstraints=1;exportPhysics=1;exportXRefs=1;
+dereferenceXRefs=0;cameraXFov=0;cameraYFov=1</comments>
+ <source_data>file:///C:/Jason/RESOURCES/UI%20Composer%20RAW%20sample%20assets/models/primitives/torus/Torus.mb</source_data>
+ </contributor>
+ <created>2008-09-19T19:11:39Z</created>
+ <modified>2008-09-19T19:11:39Z</modified>
+ <unit meter="0.01" name="centimeter"/>
+ <up_axis>Y_UP</up_axis>
+ </asset>
+ <library_physics_scenes>
+ <physics_scene id="MayaNativePhysicsScene">
+ <technique_common>
+ <gravity>0 -980 0</gravity>
+ <time_step>0.083</time_step>
+ </technique_common>
+ </physics_scene>
+ </library_physics_scenes>
+ <library_materials>
+ <material id="lambert2" name="lambert2">
+ <instance_effect url="#lambert2-fx"/>
+ </material>
+ </library_materials>
+ <library_effects>
+ <effect id="lambert2-fx">
+ <profile_COMMON>
+ <technique sid="common">
+ <lambert>
+ <emission>
+ <color>0 0 0 1</color>
+ </emission>
+ <ambient>
+ <color>0 0 0 1</color>
+ </ambient>
+ <diffuse>
+ <color>1 1 1 1</color>
+ </diffuse>
+ <transparent opaque="RGB_ZERO">
+ <color>0 0 0 1</color>
+ </transparent>
+ <transparency>
+ <float>1</float>
+ </transparency>
+ </lambert>
+ <extra>
+ <technique profile="FCOLLADA"/>
+ </extra>
+ </technique>
+ </profile_COMMON>
+ </effect>
+ </library_effects>
+ <library_geometries>
+ <geometry id="Torus" name="Torus">
+ <mesh>
+ <source id="Torus-positions" name="position">
+ <float_array id="Torus-positions-array" count="3456">-25 0 0 -24.1481 -6.47048 0 -21.6506 -12.5 0 -17.6777 -17.6777 0 -12.5 -21.6506 0 -6.47048 -24.1481 0 0 -25 0 6.47047 -24.1481 0 12.5 -21.6506 0 17.6777 -17.6777 0 21.6506 -12.5 0 24.1481 -6.47047 0 25 0 0 24.1481 6.47048 0 21.6506 12.5 0 17.6777 17.6777 0 12.5 21.6506 0 6.47048 24.1481 0 0 25 0 -6.47048 24.1481 0 -12.5 21.6506 0 -17.6777 17.6777 0 -21.6506 12.5 0 -24.1481 6.47048 0 -28.3494 0 -12.5 -27.3834 -7.33736 -12.5 -24.5513 -14.1747 -12.5 -20.046 -20.046 -12.5 -14.1747 -24.5513 -12.5 -7.33736 -27.3834 -12.5 0 -28.3494 -12.5 7.33735 -27.3834 -12.5 14.1747 -24.5513 -12.5 20.046 -20.046 -12.5 24.5513 -14.1747 -12.5 27.3834 -7.33735 -12.5 28.3494 0 -12.5 27.3834 7.33736 -12.5 24.5513 14.1747 -12.5 20.046 20.046 -12.5 14.1747 24.5513 -12.5 7.33736 27.3834 -12.5 0 28.3494 -12.5 -7.33736 27.3834 -12.5 -14.1747 24.5513 -12.5 -20.046 20.046 -12.5 -24.5513 14.1747 -12.5 -27.3834 7.33736 -12.5 -37.5 0 -21.6506 -36.2222 -9.70572 -21.6506 -32.476 -18.75 -21.6506 -26.5165 -26.5165 -21.6506 -18.75 -32.476 -21.6506 -9.70572 -36.2222 -21.6506 0 -37.5 -21.6506 9.70571 -36.2222 -21.6506 18.75 -32.476 -21.6506 26.5165 -26.5165 -21.6506 32.476 -18.75 -21.6506 36.2222 -9.70571 -21.6506 37.5 0 -21.6506 36.2222 9.70572 -21.6506 32.476 18.75 -21.6506 26.5165 26.5165 -21.6506 18.75 32.476 -21.6506 9.70572 36.2222 -21.6506 0 37.5 -21.6506 -9.70572 36.2222 -21.6506 -18.75 32.476 -21.6506 -26.5165 26.5165 -21.6506 -32.476 18.75 -21.6506 -36.2222 9.70572 -21.6506 -50 0 -25 -48.2963 -12.941 -25 -43.3013 -25 -25 -35.3553 -35.3553 -25 -25 -43.3013 -25 -12.941 -48.2963 -25 0 -50 -25 12.9409 -48.2963 -25 25 -43.3013 -25 35.3553 -35.3553 -25 43.3013 -25 -25 48.2963 -12.9409 -25 50 0 -25 48.2963 12.941 -25 43.3013 25 -25 35.3553 35.3553 -25 25 43.3013 -25 12.941 48.2963 -25 0 50 -25 -12.941 48.2963 -25 -25 43.3013 -25 -35.3553 35.3553 -25 -43.3013 25 -25 -48.2963 12.941 -25 -62.5 0 -21.6506 -60.3704 -16.1762 -21.6506 -54.1266 -31.25 -21.6506 -44.1942 -44.1942 -21.6506 -31.25 -54.1266 -21.6506 -16.1762 -60.3704 -21.6506 0 -62.5 -21.6506 16.1762 -60.3704 -21.6506 31.25 -54.1266 -21.6506 44.1942 -44.1942 -21.6506 54.1266 -31.25 -21.6506 60.3704 -16.1762 -21.6506 62.5 0 -21.6506 60.3704 16.1762 -21.6506 54.1266 31.25 -21.6506 44.1942 44.1942 -21.6506 31.25 54.1266 -21.6506 16.1762 60.3704 -21.6506 0 62.5 -21.6506 -16.1762 60.3704 -21.6506 -31.25 54.1266 -21.6506 -44.1942 44.1942 -21.6506 -54.1266 31.25 -21.6506 -60.3704 16.1762 -21.6506 -71.6506 0 -12.5 -69.2092 -18.5445 -12.5 -62.0513 -35.8253 -12.5 -50.6646 -50.6646 -12.5 -35.8253 -62.0513 -12.5 -18.5445 -69.2092 -12.5 0 -71.6506 -12.5 18.5445 -69.2092 -12.5 35.8253 -62.0513 -12.5 50.6646 -50.6646 -12.5 62.0513 -35.8253 -12.5 69.2092 -18.5445 -12.5 71.6506 0 -12.5 69.2092 18.5446 -12.5 62.0513 35.8253 -12.5 50.6646 50.6646 -12.5 35.8253 62.0513 -12.5 18.5446 69.2092 -12.5 0 71.6506 -12.5 -18.5446 69.2092 -12.5 -35.8253 62.0513 -12.5 -50.6646 50.6646 -12.5 -62.0513 35.8253 -12.5 -69.2092 18.5446 -12.5 -75 0 0 -72.4444 -19.4114 0 -64.9519 -37.5 0 -53.033 -53.033 0 -37.5 -64.9519 0 -19.4114 -72.4444 0 0 -75 0 19.4114 -72.4444 0 37.5 -64.9519 0 53.033 -53.033 0 64.9519 -37.5 0 72.4444 -19.4114 0 75 0 0 72.4444 19.4114 0 64.9519 37.5 0 53.033 53.033 0 37.5 64.9519 0 19.4114 72.4444 0 0 75 0 -19.4114 72.4444 0 -37.5 64.9519 0 -53.033 53.033 0 -64.9519 37.5 0 -72.4444 19.4114 0 -71.6506 0 12.5 -69.2092 -18.5445 12.5 -62.0513 -35.8253 12.5 -50.6646 -50.6646 12.5 -35.8253 -62.0513 12.5 -18.5446 -69.2092 12.5 0 -71.6506 12.5 18.5445 -69.2092 12.5 35.8253 -62.0513 12.5 50.6646 -50.6646 12.5 62.0513 -35.8253 12.5 69.2092 -18.5445 12.5 71.6506 0 12.5 69.2092 18.5446 12.5 62.0513 35.8253 12.5 50.6646 50.6646 12.5 35.8253 62.0513 12.5 18.5446 69.2092 12.5 0 71.6506 12.5 -18.5446 69.2092 12.5 -35.8253 62.0513 12.5 -50.6646 50.6646 12.5 -62.0513 35.8253 12.5 -69.2092 18.5446 12.5 -62.5 0 21.6506 -60.3704 -16.1762 21.6506 -54.1266 -31.25 21.6506 -44.1942 -44.1942 21.6506 -31.25 -54.1266 21.6506 -16.1762 -60.3704 21.6506 0 -62.5 21.6506 16.1762 -60.3704 21.6506 31.25 -54.1266 21.6506 44.1942 -44.1942 21.6506 54.1266 -31.25 21.6506 60.3704 -16.1762 21.6506 62.5 0 21.6506 60.3704 16.1762 21.6506 54.1266 31.25 21.6506 44.1942 44.1942 21.6506 31.25 54.1266 21.6506 16.1762 60.3704 21.6506 0 62.5 21.6506 -16.1762 60.3704 21.6506 -31.25 54.1266 21.6506 -44.1942 44.1942 21.6506 -54.1266 31.25 21.6506 -60.3704 16.1762 21.6506 -50 0 25 -48.2963 -12.941 25 -43.3013 -25 25 -35.3553 -35.3553 25 -25 -43.3013 25 -12.941 -48.2963 25 0 -50 25 12.9409 -48.2963 25 25 -43.3013 25 35.3553 -35.3553 25 43.3013 -25 25 48.2963 -12.9409 25 50 0 25 48.2963 12.941 25 43.3013 25 25 35.3553 35.3553 25 25 43.3013 25 12.941 48.2963 25 0 50 25 -12.941 48.2963 25 -25 43.3013 25 -35.3553 35.3553 25 -43.3013 25 25 -48.2963 12.941 25 -37.5 0 21.6506 -36.2222 -9.70572 21.6506 -32.476 -18.75 21.6506 -26.5165 -26.5165 21.6506 -18.75 -32.476 21.6506 -9.70572 -36.2222 21.6506 0 -37.5 21.6506 9.70571 -36.2222 21.6506 18.75 -32.476 21.6506 26.5165 -26.5165 21.6506 32.476 -18.75 21.6506 36.2222 -9.70571 21.6506 37.5 0 21.6506 36.2222 9.70572 21.6506 32.476 18.75 21.6506 26.5165 26.5165 21.6506 18.75 32.476 21.6506 9.70572 36.2222 21.6506 0 37.5 21.6506 -9.70572 36.2222 21.6506 -18.75 32.476 21.6506 -26.5165 26.5165 21.6506 -32.476 18.75 21.6506 -36.2222 9.70572 21.6506 -28.3494 0 12.5 -27.3834 -7.33736 12.5 -24.5513 -14.1747 12.5 -20.046 -20.046 12.5 -14.1747 -24.5513 12.5 -7.33736 -27.3834 12.5 0 -28.3494 12.5 7.33735 -27.3834 12.5 14.1747 -24.5513 12.5 20.046 -20.046 12.5 24.5513 -14.1747 12.5 27.3834 -7.33735 12.5 28.3494 0 12.5 27.3834 7.33736 12.5 24.5513 14.1747 12.5 20.046 20.046 12.5 14.1747 24.5513 12.5 7.33736 27.3834 12.5 0 28.3494 12.5 -7.33736 27.3834 12.5 -14.1747 24.5513 12.5 -20.046 20.046 12.5 -24.5513 14.1747 12.5 -27.3834 7.33736 12.5 -24.7852 -3.26304 0 -24.9838 -6.6944 -6.46712 -28.0455 -3.69225 -12.3947 -25.8652 0 -6.46712 -25.6392 -3.37547 -6.41199 -23.0961 -9.56674 0 -22.3999 -12.9326 -6.46712 -26.1342 -10.8251 -12.3947 -23.892 -9.89638 -6.41199 -19.8331 -15.2185 0 -18.2894 -18.2894 -6.46712 -22.4419 -17.2203 -12.3947 -20.5165 -15.7429 -6.41199 -15.2185 -19.8331 0 -12.9326 -22.3999 -6.46712 -17.2203 -22.4419 -12.3947 -15.7429 -20.5165 -6.41199 -9.56674 -23.0961 0 -6.6944 -24.9838 -6.46712 -10.8251 -26.1342 -12.3947 -9.89638 -23.892 -6.41199 -3.26304 -24.7852 0 0 -25.8652 -6.46712 -3.69225 -28.0455 -12.3947 -3.37547 -25.6392 -6.41199 3.26303 -24.7852 0 6.6944 -24.9838 -6.46712 3.69225 -28.0455 -12.3947 3.37547 -25.6392 -6.41199 9.56674 -23.0961 0 12.9326 -22.3999 -6.46712 10.8251 -26.1342 -12.3947 9.89638 -23.892 -6.41199 15.2185 -19.8331 0 18.2894 -18.2894 -6.46712 17.2203 -22.4419 -12.3947 15.7429 -20.5165 -6.41199 19.8331 -15.2185 0 22.3999 -12.9326 -6.46712 22.4419 -17.2203 -12.3947 20.5165 -15.7429 -6.41199 23.0961 -9.56674 0 24.9838 -6.6944 -6.46712 26.1342 -10.8251 -12.3947 23.892 -9.89638 -6.41199 24.7852 -3.26303 0 25.8652 0 -6.46712 28.0455 -3.69225 -12.3947 25.6392 -3.37547 -6.41199 24.7852 3.26304 0 24.9838 6.6944 -6.46712 28.0455 3.69226 -12.3947 25.6392 3.37547 -6.41199 23.0961 9.56674 0 22.3999 12.9326 -6.46712 26.1342 10.8251 -12.3947 23.892 9.89638 -6.41199 19.8331 15.2185 0 18.2894 18.2894 -6.46712 22.4419 17.2203 -12.3947 20.5165 15.7429 -6.41199 15.2185 19.8331 0 12.9326 22.3999 -6.46712 17.2203 22.4419 -12.3947 15.7429 20.5165 -6.41199 9.56674 23.0961 0 6.6944 24.9838 -6.46712 10.8251 26.1342 -12.3947 9.89638 23.892 -6.41199 3.26304 24.7852 0 0 25.8652 -6.46712 3.69226 28.0455 -12.3947 3.37547 25.6392 -6.41199 -3.26304 24.7852 0 -6.6944 24.9838 -6.46712 -3.69226 28.0455 -12.3947 -3.37547 25.6392 -6.41199 -9.56674 23.0961 0 -12.9326 22.3999 -6.46712 -10.8251 26.1342 -12.3947 -9.89638 23.892 -6.41199 -15.2185 19.8331 0 -18.2894 18.2894 -6.46712 -17.2203 22.4419 -12.3947 -15.7429 20.5165 -6.41199 -19.8331 15.2185 0 -22.3999 12.9326 -6.46712 -22.4419 17.2203 -12.3947 -20.5165 15.7429 -6.41199 -23.0961 9.56674 0 -24.9838 6.6944 -6.46712 -26.1342 10.8251 -12.3947 -23.892 9.89638 -6.41199 -24.7852 3.26304 0 -28.0455 3.69226 -12.3947 -25.6392 3.37547 -6.41199 -31.2312 -8.36837 -17.6677 -36.9396 -4.8632 -21.5121 -32.3329 0 -17.6677 -31.9359 -4.20443 -17.5252 -28.0011 -16.1664 -17.6677 -34.4223 -14.2582 -21.5121 -29.7595 -12.3268 -17.5252 -22.8628 -22.8628 -17.6677 -29.5591 -22.6815 -21.5121 -25.555 -19.6091 -17.5252 -16.1664 -28.0011 -17.6677 -22.6815 -29.5591 -21.5121 -19.6091 -25.555 -17.5252 -8.36837 -31.2312 -17.6677 -14.2582 -34.4223 -21.5121 -12.3268 -29.7595 -17.5252 0 -32.3329 -17.6677 -4.8632 -36.9396 -21.5121 -4.20444 -31.9359 -17.5252 8.36836 -31.2312 -17.6677 4.86319 -36.9396 -21.5121 4.20443 -31.9359 -17.5252 16.1664 -28.0011 -17.6677 14.2582 -34.4223 -21.5121 12.3268 -29.7595 -17.5252 22.8628 -22.8628 -17.6677 22.6815 -29.5591 -21.5121 19.6091 -25.555 -17.5252 28.0011 -16.1664 -17.6677 29.5591 -22.6815 -21.5121 25.555 -19.6091 -17.5252 31.2312 -8.36836 -17.6677 34.4223 -14.2582 -21.5121 29.7595 -12.3268 -17.5252 32.3329 0 -17.6677 36.9396 -4.86319 -21.5121 31.9359 -4.20443 -17.5252 31.2312 8.36837 -17.6677 36.9396 4.8632 -21.5121 31.9359 4.20444 -17.5252 28.0011 16.1664 -17.6677 34.4223 14.2582 -21.5121 29.7595 12.3268 -17.5252 22.8628 22.8628 -17.6677 29.5591 22.6815 -21.5121 25.555 19.6091 -17.5252 16.1664 28.0011 -17.6677 22.6815 29.5591 -21.5121 19.6091 25.555 -17.5252 8.36837 31.2312 -17.6677 14.2582 34.4223 -21.5121 12.3268 29.7595 -17.5252 0 32.3329 -17.6677 4.8632 36.9396 -21.5121 4.20444 31.9359 -17.5252 -8.36837 31.2312 -17.6677 -4.8632 36.9396 -21.5121 -4.20444 31.9359 -17.5252 -16.1664 28.0011 -17.6677 -14.2582 34.4223 -21.5121 -12.3268 29.7595 -17.5252 -22.8628 22.8628 -17.6677 -22.6815 29.5591 -21.5121 -19.6091 25.555 -17.5252 -28.0011 16.1664 -17.6677 -29.5591 22.6815 -21.5121 -25.555 19.6091 -17.5252 -31.2312 8.36837 -17.6677 -34.4223 14.2582 -21.5121 -29.7595 12.3268 -17.5252 -36.9396 4.8632 -21.5121 -31.9359 4.20444 -17.5252 -42.0503 -11.2673 -24.1334 -49.1481 -6.47048 -25 -43.5337 0 -24.1334 -42.8364 -5.63952 -24.0212 -37.7013 -21.7668 -24.1334 -45.7988 -18.9705 -25 -39.9172 -16.5342 -24.0212 -30.783 -30.783 -24.1334 -39.3283 -30.1777 -25 -34.2777 -26.3022 -24.0212 -21.7668 -37.7013 -24.1334 -30.1777 -39.3283 -25 -26.3022 -34.2777 -24.0212 -11.2673 -42.0503 -24.1334 -18.9705 -45.7988 -25 -16.5342 -39.9172 -24.0212 0 -43.5337 -24.1334 -6.47048 -49.1481 -25 -5.63952 -42.8364 -24.0212 11.2673 -42.0503 -24.1334 6.47047 -49.1481 -25 5.63952 -42.8364 -24.0212 21.7668 -37.7013 -24.1334 18.9705 -45.7988 -25 16.5342 -39.9172 -24.0212 30.783 -30.783 -24.1334 30.1777 -39.3283 -25 26.3022 -34.2777 -24.0212 37.7013 -21.7668 -24.1334 39.3283 -30.1777 -25 34.2777 -26.3022 -24.0212 42.0503 -11.2673 -24.1334 45.7988 -18.9705 -25 39.9172 -16.5342 -24.0212 43.5337 0 -24.1334 49.1481 -6.47047 -25 42.8364 -5.63952 -24.0212 42.0503 11.2674 -24.1334 49.1481 6.47048 -25 42.8364 5.63952 -24.0212 37.7013 21.7668 -24.1334 45.7988 18.9705 -25 39.9172 16.5342 -24.0212 30.783 30.783 -24.1334 39.3283 30.1777 -25 34.2777 26.3022 -24.0212 21.7668 37.7013 -24.1334 30.1777 39.3283 -25 26.3022 34.2777 -24.0212 11.2674 42.0503 -24.1334 18.9705 45.7988 -25 16.5342 39.9172 -24.0212 0 43.5337 -24.1334 6.47048 49.1481 -25 5.63952 42.8364 -24.0212 -11.2674 42.0503 -24.1334 -6.47048 49.1481 -25 -5.63952 42.8364 -24.0212 -21.7668 37.7013 -24.1334 -18.9705 45.7988 -25 -16.5342 39.9172 -24.0212 -30.783 30.783 -24.1334 -30.1777 39.3283 -25 -26.3022 34.2777 -24.0212 -37.7013 21.7668 -24.1334 -39.3283 30.1777 -25 -34.2777 26.3022 -24.0212 -42.0503 11.2674 -24.1334 -45.7988 18.9705 -25 -39.9172 16.5342 -24.0212 -49.1481 6.47048 -25 -42.8364 5.63952 -24.0212 -54.5423 -14.6146 -24.1334 -61.5661 -8.10533 -21.8815 -56.4663 0 -24.1334 -55.5416 -7.3122 -24.2191 -48.9013 -28.2332 -24.1334 -57.3704 -23.7636 -21.8815 -51.7566 -21.4383 -24.2191 -39.9277 -39.9277 -24.1334 -49.2651 -37.8025 -21.8815 -44.4444 -34.1034 -24.2191 -28.2332 -48.9013 -24.1334 -37.8025 -49.2651 -21.8815 -34.1034 -44.4444 -24.2191 -14.6146 -54.5423 -24.1334 -23.7636 -57.3704 -21.8815 -21.4383 -51.7566 -24.2191 0 -56.4663 -24.1334 -8.10533 -61.5661 -21.8815 -7.3122 -55.5416 -24.2191 14.6146 -54.5423 -24.1334 8.10532 -61.5661 -21.8815 7.31219 -55.5416 -24.2191 28.2332 -48.9013 -24.1334 23.7636 -57.3704 -21.8815 21.4383 -51.7566 -24.2191 39.9277 -39.9277 -24.1334 37.8025 -49.2651 -21.8815 34.1034 -44.4444 -24.2191 48.9013 -28.2332 -24.1334 49.2651 -37.8025 -21.8815 44.4444 -34.1034 -24.2191 54.5423 -14.6146 -24.1334 57.3704 -23.7636 -21.8815 51.7566 -21.4383 -24.2191 56.4663 0 -24.1334 61.5661 -8.10532 -21.8815 55.5416 -7.31219 -24.2191 54.5423 14.6146 -24.1334 61.5661 8.10533 -21.8815 55.5416 7.3122 -24.2191 48.9013 28.2332 -24.1334 57.3704 23.7636 -21.8815 51.7566 21.4383 -24.2191 39.9277 39.9277 -24.1334 49.2651 37.8024 -21.8815 44.4444 34.1034 -24.2191 28.2332 48.9013 -24.1334 37.8024 49.2651 -21.8815 34.1034 44.4444 -24.2191 14.6146 54.5423 -24.1334 23.7636 57.3704 -21.8815 21.4383 51.7566 -24.2191 0 56.4663 -24.1334 8.10533 61.5661 -21.8815 7.3122 55.5416 -24.2191 -14.6146 54.5423 -24.1334 -8.10533 61.5661 -21.8815 -7.3122 55.5416 -24.2191 -28.2332 48.9013 -24.1334 -23.7636 57.3704 -21.8815 -21.4383 51.7566 -24.2191 -39.9277 39.9277 -24.1334 -37.8024 49.2651 -21.8815 -34.1034 44.4444 -24.2191 -48.9013 28.2332 -24.1334 -49.2651 37.8024 -21.8815 -44.4444 34.1034 -24.2191 -54.5423 14.6146 -24.1334 -57.3704 23.7636 -21.8815 -51.7566 21.4383 -24.2191 -61.5661 8.10533 -21.8815 -55.5416 7.3122 -24.2191 -65.3614 -17.5135 -17.6677 -70.8825 -9.33186 -12.7662 -67.6671 0 -17.6677 -66.7803 -8.7918 -17.924 -58.6014 -33.8336 -17.6677 -66.052 -27.3596 -12.7662 -62.2294 -25.7762 -17.924 -47.8479 -47.8479 -17.6677 -56.7201 -43.5229 -12.7662 -53.4376 -41.0041 -17.924 -33.8336 -58.6014 -17.6677 -43.5229 -56.7201 -12.7662 -41.0041 -53.4376 -17.924 -17.5135 -65.3614 -17.6677 -27.3596 -66.052 -12.7662 -25.7762 -62.2294 -17.924 0 -67.6671 -17.6677 -9.33186 -70.8825 -12.7662 -8.7918 -66.7803 -17.924 17.5135 -65.3614 -17.6677 9.33186 -70.8825 -12.7662 8.7918 -66.7803 -17.924 33.8336 -58.6014 -17.6677 27.3596 -66.052 -12.7662 25.7762 -62.2294 -17.924 47.8479 -47.8479 -17.6677 43.5229 -56.7201 -12.7662 41.0041 -53.4376 -17.924 58.6014 -33.8336 -17.6677 56.7201 -43.5229 -12.7662 53.4376 -41.0041 -17.924 65.3614 -17.5135 -17.6677 66.052 -27.3596 -12.7662 62.2294 -25.7762 -17.924 67.6671 0 -17.6677 70.8825 -9.33186 -12.7662 66.7803 -8.7918 -17.924 65.3614 17.5135 -17.6677 70.8825 9.33187 -12.7662 66.7803 8.7918 -17.924 58.6014 33.8335 -17.6677 66.052 27.3596 -12.7662 62.2294 25.7762 -17.924 47.8479 47.8479 -17.6677 56.7201 43.5229 -12.7662 53.4376 41.0041 -17.924 33.8335 58.6014 -17.6677 43.5229 56.7201 -12.7662 41.0041 53.4376 -17.924 17.5135 65.3614 -17.6677 27.3596 66.052 -12.7662 25.7762 62.2294 -17.924 0 67.6671 -17.6677 9.33187 70.8825 -12.7662 8.7918 66.7803 -17.924 -17.5135 65.3614 -17.6677 -9.33187 70.8825 -12.7662 -8.7918 66.7803 -17.924 -33.8335 58.6014 -17.6677 -27.3596 66.052 -12.7662 -25.7762 62.2294 -17.924 -47.8479 47.8479 -17.6677 -43.5229 56.7201 -12.7662 -41.0041 53.4376 -17.924 -58.6014 33.8335 -17.6677 -56.7201 43.5229 -12.7662 -53.4376 41.0041 -17.924 -65.3614 17.5135 -17.6677 -66.052 27.3596 -12.7662 -62.2294 25.7762 -17.924 -70.8825 9.33187 -12.7662 -66.7803 8.7918 -17.924 -71.6087 -19.1875 -6.46712 -74.3556 -9.78911 0 -74.1348 0 -6.46712 -73.4203 -9.66597 -6.61295 -64.2026 -37.0674 -6.46712 -69.2884 -28.7002 0 -68.4168 -28.3392 -6.61295 -52.4212 -52.4212 -6.46712 -59.4993 -45.6554 0 -58.7509 -45.0811 -6.61295 -37.0674 -64.2026 -6.46712 -45.6554 -59.4993 0 -45.0811 -58.7509 -6.61295 -19.1875 -71.6087 -6.46712 -28.7002 -69.2884 0 -28.3392 -68.4168 -6.61295 0 -74.1348 -6.46712 -9.78911 -74.3556 0 -9.66597 -73.4203 -6.61295 19.1875 -71.6087 -6.46712 9.7891 -74.3556 0 9.66596 -73.4203 -6.61295 37.0674 -64.2026 -6.46712 28.7002 -69.2884 0 28.3392 -68.4168 -6.61295 52.4212 -52.4212 -6.46712 45.6554 -59.4993 0 45.0811 -58.7509 -6.61295 64.2026 -37.0674 -6.46712 59.4993 -45.6554 0 58.7509 -45.0811 -6.61295 71.6087 -19.1875 -6.46712 69.2884 -28.7002 0 68.4168 -28.3392 -6.61295 74.1348 0 -6.46712 74.3556 -9.7891 0 73.4203 -9.66596 -6.61295 71.6087 19.1875 -6.46712 74.3556 9.78911 0 73.4203 9.66597 -6.61295 64.2026 37.0674 -6.46712 69.2884 28.7002 0 68.4168 28.3392 -6.61295 52.4212 52.4212 -6.46712 59.4993 45.6554 0 58.7509 45.0811 -6.61295 37.0674 64.2026 -6.46712 45.6554 59.4993 0 45.0811 58.7509 -6.61295 19.1875 71.6087 -6.46712 28.7002 69.2884 0 28.3392 68.4168 -6.61295 0 74.1348 -6.46712 9.78911 74.3556 0 9.66597 73.4203 -6.61295 -19.1875 71.6087 -6.46712 -9.78911 74.3556 0 -9.66597 73.4203 -6.61295 -37.0674 64.2026 -6.46712 -28.7002 69.2884 0 -28.3392 68.4168 -6.61295 -52.4212 52.4212 -6.46712 -45.6554 59.4993 0 -45.0811 58.7509 -6.61295 -64.2026 37.0674 -6.46712 -59.4993 45.6554 0 -58.7509 45.0811 -6.61295 -71.6087 19.1875 -6.46712 -69.2884 28.7002 0 -68.4168 28.3392 -6.61295 -74.3556 9.78911 0 -73.4203 9.66597 -6.61295 -71.6087 -19.1875 6.46712 -70.8825 -9.33186 12.7661 -74.1348 0 6.46712 -73.4203 -9.66597 6.61295 -64.2026 -37.0674 6.46712 -66.052 -27.3596 12.7661 -68.4168 -28.3392 6.61295 -52.4212 -52.4212 6.46712 -56.7201 -43.5229 12.7661 -58.7509 -45.0811 6.61295 -37.0674 -64.2026 6.46712 -43.5229 -56.7201 12.7661 -45.0811 -58.7509 6.61295 -19.1875 -71.6087 6.46712 -27.3596 -66.052 12.7661 -28.3392 -68.4168 6.61295 0 -74.1348 6.46712 -9.33186 -70.8825 12.7661 -9.66597 -73.4203 6.61295 19.1875 -71.6087 6.46712 9.33186 -70.8825 12.7661 9.66596 -73.4203 6.61295 37.0674 -64.2026 6.46712 27.3596 -66.052 12.7661 28.3392 -68.4168 6.61295 52.4212 -52.4212 6.46712 43.5229 -56.7201 12.7661 45.0811 -58.7509 6.61295 64.2026 -37.0674 6.46712 56.7201 -43.5229 12.7661 58.7509 -45.0811 6.61295 71.6087 -19.1875 6.46712 66.052 -27.3596 12.7661 68.4168 -28.3392 6.61295 74.1348 0 6.46712 70.8825 -9.33186 12.7661 73.4203 -9.66596 6.61295 71.6087 19.1875 6.46712 70.8825 9.33187 12.7661 73.4203 9.66597 6.61295 64.2026 37.0674 6.46712 66.052 27.3596 12.7661 68.4168 28.3392 6.61295 52.4212 52.4212 6.46712 56.7201 43.5229 12.7661 58.7509 45.0811 6.61295 37.0674 64.2026 6.46712 43.5229 56.7201 12.7661 45.0811 58.7509 6.61295 19.1875 71.6087 6.46712 27.3596 66.052 12.7661 28.3392 68.4168 6.61295 0 74.1348 6.46712 9.33187 70.8825 12.7661 9.66597 73.4203 6.61295 -19.1875 71.6087 6.46712 -9.33187 70.8825 12.7661 -9.66597 73.4203 6.61295 -37.0674 64.2026 6.46712 -27.3596 66.052 12.7661 -28.3392 68.4168 6.61295 -52.4212 52.4212 6.46712 -43.5229 56.7201 12.7661 -45.0811 58.7509 6.61295 -64.2026 37.0674 6.46712 -56.7201 43.5229 12.7661 -58.7509 45.0811 6.61295 -71.6087 19.1875 6.46712 -66.052 27.3596 12.7661 -68.4168 28.3392 6.61295 -70.8825 9.33187 12.7661 -73.4203 9.66597 6.61295 -65.3614 -17.5135 17.6677 -61.5661 -8.10533 21.8815 -67.6671 0 17.6677 -66.7803 -8.7918 17.924 -58.6014 -33.8336 17.6677 -57.3704 -23.7636 21.8815 -62.2294 -25.7762 17.924 -47.8479 -47.8479 17.6677 -49.2651 -37.8025 21.8815 -53.4376 -41.0041 17.924 -33.8336 -58.6014 17.6677 -37.8024 -49.2651 21.8815 -41.0041 -53.4376 17.924 -17.5135 -65.3614 17.6677 -23.7636 -57.3704 21.8815 -25.7762 -62.2294 17.924 0 -67.6671 17.6677 -8.10533 -61.5661 21.8815 -8.7918 -66.7803 17.924 17.5135 -65.3614 17.6677 8.10532 -61.5661 21.8815 8.7918 -66.7803 17.924 33.8336 -58.6014 17.6677 23.7636 -57.3704 21.8815 25.7762 -62.2294 17.924 47.8479 -47.8479 17.6677 37.8025 -49.2651 21.8815 41.0041 -53.4376 17.924 58.6014 -33.8336 17.6677 49.2651 -37.8025 21.8815 53.4376 -41.0041 17.924 65.3614 -17.5135 17.6677 57.3704 -23.7636 21.8815 62.2294 -25.7762 17.924 67.6671 0 17.6677 61.5661 -8.10532 21.8815 66.7803 -8.7918 17.924 65.3614 17.5135 17.6677 61.5661 8.10533 21.8815 66.7803 8.7918 17.924 58.6014 33.8335 17.6677 57.3704 23.7636 21.8815 62.2294 25.7762 17.924 47.8479 47.8479 17.6677 49.2651 37.8024 21.8815 53.4376 41.0041 17.924 33.8335 58.6014 17.6677 37.8024 49.2651 21.8815 41.0041 53.4376 17.924 17.5135 65.3614 17.6677 23.7636 57.3704 21.8815 25.7762 62.2294 17.924 0 67.6671 17.6677 8.10533 61.5661 21.8815 8.7918 66.7803 17.924 -17.5135 65.3614 17.6677 -8.10533 61.5661 21.8815 -8.7918 66.7803 17.924 -33.8335 58.6014 17.6677 -23.7636 57.3704 21.8815 -25.7762 62.2294 17.924 -47.8479 47.8479 17.6677 -37.8024 49.2651 21.8815 -41.0041 53.4376 17.924 -58.6014 33.8335 17.6677 -49.2651 37.8024 21.8815 -53.4376 41.0041 17.924 -65.3614 17.5135 17.6677 -57.3704 23.7636 21.8815 -62.2294 25.7762 17.924 -61.5661 8.10533 21.8815 -66.7803 8.7918 17.924 -54.5423 -14.6146 24.1334 -49.1481 -6.47048 25 -56.4663 0 24.1334 -55.5416 -7.3122 24.2191 -48.9013 -28.2332 24.1334 -45.7988 -18.9705 25 -51.7566 -21.4383 24.2191 -39.9277 -39.9277 24.1334 -39.3283 -30.1777 25 -44.4444 -34.1034 24.2191 -28.2332 -48.9013 24.1334 -30.1777 -39.3283 25 -34.1034 -44.4444 24.2191 -14.6146 -54.5423 24.1334 -18.9705 -45.7988 25 -21.4383 -51.7566 24.2191 0 -56.4663 24.1334 -6.47048 -49.1481 25 -7.3122 -55.5416 24.2191 14.6146 -54.5423 24.1334 6.47047 -49.1481 25 7.31219 -55.5416 24.2191 28.2332 -48.9013 24.1334 18.9705 -45.7988 25 21.4383 -51.7566 24.2191 39.9277 -39.9277 24.1334 30.1777 -39.3283 25 34.1034 -44.4444 24.2191 48.9013 -28.2332 24.1334 39.3283 -30.1777 25 44.4444 -34.1034 24.2191 54.5423 -14.6146 24.1334 45.7988 -18.9705 25 51.7566 -21.4383 24.2191 56.4663 0 24.1334 49.1481 -6.47047 25 55.5416 -7.31219 24.2191 54.5423 14.6146 24.1334 49.1481 6.47048 25 55.5416 7.3122 24.2191 48.9013 28.2332 24.1334 45.7988 18.9705 25 51.7566 21.4383 24.2191 39.9277 39.9277 24.1334 39.3283 30.1777 25 44.4444 34.1034 24.2191 28.2332 48.9013 24.1334 30.1777 39.3283 25 34.1034 44.4444 24.2191 14.6146 54.5423 24.1334 18.9705 45.7988 25 21.4383 51.7566 24.2191 0 56.4663 24.1334 6.47048 49.1481 25 7.3122 55.5416 24.2191 -14.6146 54.5423 24.1334 -6.47048 49.1481 25 -7.3122 55.5416 24.2191 -28.2332 48.9013 24.1334 -18.9705 45.7988 25 -21.4383 51.7566 24.2191 -39.9277 39.9277 24.1334 -30.1777 39.3283 25 -34.1034 44.4444 24.2191 -48.9013 28.2332 24.1334 -39.3283 30.1777 25 -44.4444 34.1034 24.2191 -54.5423 14.6146 24.1334 -45.7988 18.9705 25 -51.7566 21.4383 24.2191 -49.1481 6.47048 25 -55.5416 7.3122 24.2191 -42.0503 -11.2673 24.1334 -36.9396 -4.8632 21.5121 -43.5337 0 24.1334 -42.8364 -5.63952 24.0212 -37.7013 -21.7668 24.1334 -34.4223 -14.2582 21.5121 -39.9172 -16.5342 24.0212 -30.783 -30.783 24.1334 -29.5591 -22.6815 21.5121 -34.2777 -26.3022 24.0212 -21.7668 -37.7013 24.1334 -22.6815 -29.5591 21.5121 -26.3022 -34.2777 24.0212 -11.2673 -42.0503 24.1334 -14.2582 -34.4223 21.5121 -16.5342 -39.9172 24.0212 0 -43.5337 24.1334 -4.8632 -36.9396 21.5121 -5.63952 -42.8364 24.0212 11.2673 -42.0503 24.1334 4.86319 -36.9396 21.5121 5.63952 -42.8364 24.0212 21.7668 -37.7013 24.1334 14.2582 -34.4223 21.5121 16.5342 -39.9172 24.0212 30.783 -30.783 24.1334 22.6815 -29.5591 21.5121 26.3022 -34.2777 24.0212 37.7013 -21.7668 24.1334 29.5591 -22.6815 21.5121 34.2777 -26.3022 24.0212 42.0503 -11.2673 24.1334 34.4223 -14.2582 21.5121 39.9172 -16.5342 24.0212 43.5337 0 24.1334 36.9396 -4.86319 21.5121 42.8364 -5.63952 24.0212 42.0503 11.2674 24.1334 36.9396 4.8632 21.5121 42.8364 5.63952 24.0212 37.7013 21.7668 24.1334 34.4223 14.2582 21.5121 39.9172 16.5342 24.0212 30.783 30.783 24.1334 29.5591 22.6815 21.5121 34.2777 26.3022 24.0212 21.7668 37.7013 24.1334 22.6815 29.5591 21.5121 26.3022 34.2777 24.0212 11.2674 42.0503 24.1334 14.2582 34.4223 21.5121 16.5342 39.9172 24.0212 0 43.5337 24.1334 4.8632 36.9396 21.5121 5.63952 42.8364 24.0212 -11.2674 42.0503 24.1334 -4.8632 36.9396 21.5121 -5.63952 42.8364 24.0212 -21.7668 37.7013 24.1334 -14.2582 34.4223 21.5121 -16.5342 39.9172 24.0212 -30.783 30.783 24.1334 -22.6815 29.5591 21.5121 -26.3022 34.2777 24.0212 -37.7013 21.7668 24.1334 -29.5591 22.6815 21.5121 -34.2777 26.3022 24.0212 -42.0503 11.2674 24.1334 -34.4223 14.2582 21.5121 -39.9172 16.5342 24.0212 -36.9396 4.8632 21.5121 -42.8364 5.63952 24.0212 -31.2312 -8.36837 17.6677 -28.0455 -3.69225 12.3947 -32.3329 0 17.6677 -31.9359 -4.20443 17.5252 -28.0011 -16.1664 17.6677 -26.1342 -10.8251 12.3947 -29.7595 -12.3268 17.5252 -22.8628 -22.8628 17.6677 -22.4419 -17.2203 12.3947 -25.555 -19.6091 17.5252 -16.1664 -28.0011 17.6677 -17.2203 -22.4419 12.3947 -19.6091 -25.555 17.5252 -8.36837 -31.2312 17.6677 -10.8251 -26.1342 12.3947 -12.3268 -29.7595 17.5252 0 -32.3329 17.6677 -3.69225 -28.0455 12.3947 -4.20444 -31.9359 17.5252 8.36836 -31.2312 17.6677 3.69225 -28.0455 12.3947 4.20443 -31.9359 17.5252 16.1664 -28.0011 17.6677 10.8251 -26.1342 12.3947 12.3268 -29.7595 17.5252 22.8628 -22.8628 17.6677 17.2203 -22.4419 12.3947 19.6091 -25.555 17.5252 28.0011 -16.1664 17.6677 22.4419 -17.2203 12.3947 25.555 -19.6091 17.5252 31.2312 -8.36836 17.6677 26.1342 -10.8251 12.3947 29.7595 -12.3268 17.5252 32.3329 0 17.6677 28.0455 -3.69225 12.3947 31.9359 -4.20443 17.5252 31.2312 8.36837 17.6677 28.0455 3.69226 12.3947 31.9359 4.20444 17.5252 28.0011 16.1664 17.6677 26.1342 10.8251 12.3947 29.7595 12.3268 17.5252 22.8628 22.8628 17.6677 22.4419 17.2203 12.3947 25.555 19.6091 17.5252 16.1664 28.0011 17.6677 17.2203 22.4419 12.3947 19.6091 25.555 17.5252 8.36837 31.2312 17.6677 10.8251 26.1342 12.3947 12.3268 29.7595 17.5252 0 32.3329 17.6677 3.69226 28.0455 12.3947 4.20444 31.9359 17.5252 -8.36837 31.2312 17.6677 -3.69226 28.0455 12.3947 -4.20444 31.9359 17.5252 -16.1664 28.0011 17.6677 -10.8251 26.1342 12.3947 -12.3268 29.7595 17.5252 -22.8628 22.8628 17.6677 -17.2203 22.4419 12.3947 -19.6091 25.555 17.5252 -28.0011 16.1664 17.6677 -22.4419 17.2203 12.3947 -25.555 19.6091 17.5252 -31.2312 8.36837 17.6677 -26.1342 10.8251 12.3947 -29.7595 12.3268 17.5252 -28.0455 3.69226 12.3947 -31.9359 4.20444 17.5252 -24.9838 -6.6944 6.46712 -25.8652 0 6.46712 -25.6392 -3.37547 6.41199 -22.3999 -12.9326 6.46712 -23.892 -9.89638 6.41199 -18.2894 -18.2894 6.46712 -20.5165 -15.7429 6.41199 -12.9326 -22.3999 6.46712 -15.7429 -20.5165 6.41199 -6.6944 -24.9838 6.46712 -9.89638 -23.892 6.41199 0 -25.8652 6.46712 -3.37547 -25.6392 6.41199 6.6944 -24.9838 6.46712 3.37547 -25.6392 6.41199 12.9326 -22.3999 6.46712 9.89638 -23.892 6.41199 18.2894 -18.2894 6.46712 15.7429 -20.5165 6.41199 22.3999 -12.9326 6.46712 20.5165 -15.7429 6.41199 24.9838 -6.6944 6.46712 23.892 -9.89638 6.41199 25.8652 0 6.46712 25.6392 -3.37547 6.41199 24.9838 6.6944 6.46712 25.6392 3.37547 6.41199 22.3999 12.9326 6.46712 23.892 9.89638 6.41199 18.2894 18.2894 6.46712 20.5165 15.7429 6.41199 12.9326 22.3999 6.46712 15.7429 20.5165 6.41199 6.6944 24.9838 6.46712 9.89638 23.892 6.41199 0 25.8652 6.46712 3.37547 25.6392 6.41199 -6.6944 24.9838 6.46712 -3.37547 25.6392 6.41199 -12.9326 22.3999 6.46712 -9.89638 23.892 6.41199 -18.2894 18.2894 6.46712 -15.7429 20.5165 6.41199 -22.3999 12.9326 6.46712 -20.5165 15.7429 6.41199 -24.9838 6.6944 6.46712 -23.892 9.89638 6.41199 -25.6392 3.37547 6.41199</float_array>
+ <technique_common>
+ <accessor source="#Torus-positions-array" count="1152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus-normals" name="normal">
+ <float_array id="Torus-normals-array" count="3456">1 0 0 0.965926 0.25882 0 0.866025 0.5 0 0.707107 0.707107 0 0.5 0.866025 0 0.258819 0.965926 0 0 1 0 -0.258819 0.965926 0 -0.5 0.866025 0 -0.707107 0.707107 0 -0.866025 0.5 0 -0.965926 0.25882 0 -1 0 0 -0.965926 -0.25882 0 -0.866025 -0.5 0 -0.707107 -0.707107 0 -0.5 -0.866025 0 -0.258819 -0.965926 0 0 -1 0 0.258819 -0.965926 0 0.5 -0.866025 0.000000 0.707107 -0.707107 0 0.866025 -0.5 0 0.965926 -0.25882 0 0.867101 0 -0.498132 0.837556 0.224422 -0.498132 0.750932 0.433551 -0.498132 0.613133 0.613133 -0.498132 0.433551 0.750932 -0.498132 0.224422 0.837556 -0.498132 0 0.867101 -0.498132 -0.224422 0.837556 -0.498132 -0.433551 0.750932 -0.498132 -0.613133 0.613133 -0.498132 -0.750932 0.433551 -0.498132 -0.837556 0.224422 -0.498132 -0.867101 0.000000 -0.498132 -0.837556 -0.224422 -0.498132 -0.750932 -0.433551 -0.498132 -0.613133 -0.613133 -0.498132 -0.433551 -0.750932 -0.498132 -0.224422 -0.837556 -0.498132 0 -0.867101 -0.498132 0.224422 -0.837556 -0.498132 0.433551 -0.750932 -0.498132 0.613133 -0.613133 -0.498132 0.750932 -0.433551 -0.498132 0.837556 -0.224422 -0.498132 0.504391 0 -0.863475 0.487205 0.130546 -0.863475 0.436815 0.252196 -0.863475 0.356659 0.356658 -0.863475 0.252196 0.436816 -0.863475 0.130546 0.487205 -0.863475 0 0.504391 -0.863475 -0.130546 0.487204 -0.863475 -0.252196 0.436815 -0.863475 -0.356658 0.356658 -0.863475 -0.436816 0.252196 -0.863475 -0.487204 0.130546 -0.863475 -0.504391 0 -0.863475 -0.487205 -0.130546 -0.863475 -0.436816 -0.252196 -0.863475 -0.356658 -0.356658 -0.863475 -0.252196 -0.436816 -0.863475 -0.130546 -0.487205 -0.863475 0 -0.504391 -0.863475 0.130546 -0.487204 -0.863475 0.252196 -0.436816 -0.863475 0.356658 -0.356658 -0.863475 0.436816 -0.252196 -0.863475 0.487205 -0.130546 -0.863475 0.008042 0 -0.999968 0.007768 0.002081 -0.999968 0.006965 0.004021 -0.999968 0.005687 0.005686 -0.999968 0.004021 0.006965 -0.999968 0.002081 0.007768 -0.999968 0 0.008042 -0.999968 -0.002081 0.007768 -0.999968 -0.004021 0.006965 -0.999968 -0.005686 0.005686 -0.999968 -0.006964 0.004021 -0.999968 -0.007768 0.002081 -0.999968 -0.008042 0 -0.999968 -0.007768 -0.002081 -0.999968 -0.006965 -0.004021 -0.999968 -0.005686 -0.005686 -0.999968 -0.004021 -0.006965 -0.999968 -0.002081 -0.007768 -0.999968 0 -0.008042 -0.999968 0.002081 -0.007768 -0.999968 0.004021 -0.006965 -0.999968 0.005686 -0.005686 -0.999968 0.006965 -0.004021 -0.999968 0.007768 -0.002081 -0.999968 -0.49227 0 -0.870443 -0.475496 -0.127409 -0.870443 -0.426318 -0.246135 -0.870443 -0.348087 -0.348088 -0.870443 -0.246135 -0.426318 -0.870443 -0.127409 -0.475496 -0.870443 0 -0.49227 -0.870443 0.127409 -0.475496 -0.870442 0.246135 -0.426318 -0.870443 0.348087 -0.348087 -0.870443 0.426318 -0.246135 -0.870442 0.475496 -0.127409 -0.870443 0.49227 0.000000 -0.870443 0.475496 0.127409 -0.870443 0.426318 0.246135 -0.870443 0.348088 0.348088 -0.870443 0.246135 0.426318 -0.870443 0.127409 0.475497 -0.870442 0 0.49227 -0.870443 -0.127409 0.475497 -0.870442 -0.246135 0.426319 -0.870443 -0.348088 0.348088 -0.870443 -0.426318 0.246135 -0.870442 -0.475496 0.127409 -0.870442 -0.863021 0.000000 -0.505168 -0.833614 -0.223366 -0.505168 -0.747398 -0.43151 -0.505168 -0.610248 -0.610248 -0.505168 -0.43151 -0.747398 -0.505168 -0.223366 -0.833614 -0.505168 0 -0.863021 -0.505168 0.223366 -0.833614 -0.505169 0.43151 -0.747398 -0.505168 0.610248 -0.610248 -0.505168 0.747398 -0.43151 -0.505168 0.833614 -0.223366 -0.505168 0.863021 0 -0.505168 0.833614 0.223366 -0.505168 0.747398 0.43151 -0.505168 0.610248 0.610248 -0.505168 0.43151 0.747398 -0.505168 0.223366 0.833614 -0.505168 0 0.863021 -0.505168 -0.223366 0.833614 -0.505168 -0.43151 0.747398 -0.505169 -0.610248 0.610248 -0.505168 -0.747398 0.43151 -0.505168 -0.833614 0.223367 -0.505168 -1 0 0 -0.965926 -0.258819 0 -0.866025 -0.5 0 -0.707107 -0.707107 0 -0.5 -0.866025 0 -0.258819 -0.965926 0.000000 0 -1 -0.000000 0.258819 -0.965926 0 0.5 -0.866025 0 0.707107 -0.707107 0 0.866025 -0.5 0 0.965926 -0.258819 0 1 0 0 0.965926 0.258819 -0.000000 0.866025 0.5 0 0.707107 0.707107 -0.000000 0.5 0.866025 0 0.258819 0.965926 -0.000000 0 1 0 -0.258819 0.965926 -0.000000 -0.5 0.866026 -0.000000 -0.707107 0.707107 -0.000000 -0.866025 0.5 -0.000000 -0.965926 0.258819 -0.000000 -0.863021 -0.000000 0.505168 -0.833614 -0.223366 0.505168 -0.747398 -0.43151 0.505168 -0.610248 -0.610248 0.505168 -0.43151 -0.747398 0.505169 -0.223366 -0.833614 0.505169 0 -0.863021 0.505168 0.223366 -0.833614 0.505168 0.43151 -0.747398 0.505168 0.610248 -0.610248 0.505168 0.747398 -0.431511 0.505168 0.833614 -0.223366 0.505168 0.863021 0 0.505168 0.833614 0.223366 0.505168 0.747398 0.43151 0.505168 0.610248 0.610248 0.505168 0.43151 0.747398 0.505168 0.223366 0.833614 0.505168 0 0.863021 0.505168 -0.223366 0.833614 0.505168 -0.43151 0.747398 0.505168 -0.610248 0.610248 0.505168 -0.747398 0.43151 0.505168 -0.833614 0.223366 0.505168 -0.49227 0 0.870443 -0.475496 -0.127409 0.870443 -0.426318 -0.246135 0.870443 -0.348087 -0.348087 0.870443 -0.246135 -0.426318 0.870443 -0.127409 -0.475496 0.870443 0 -0.49227 0.870443 0.127409 -0.475496 0.870442 0.246135 -0.426318 0.870443 0.348087 -0.348087 0.870443 0.426318 -0.246135 0.870442 0.475496 -0.127409 0.870443 0.49227 0 0.870443 0.475496 0.127409 0.870443 0.426318 0.246135 0.870443 0.348087 0.348087 0.870443 0.246135 0.426318 0.870443 0.127409 0.475496 0.870443 0 0.49227 0.870442 -0.127409 0.475496 0.870443 -0.246135 0.426318 0.870443 -0.348087 0.348087 0.870443 -0.426318 0.246135 0.870443 -0.475496 0.127409 0.870443 0.008042 0 0.999968 0.007768 0.002081 0.999968 0.006964 0.004021 0.999968 0.005686 0.005686 0.999968 0.004021 0.006965 0.999968 0.002081 0.007768 0.999968 0 0.008042 0.999968 -0.002081 0.007768 0.999968 -0.004021 0.006965 0.999968 -0.005686 0.005686 0.999968 -0.006964 0.004021 0.999968 -0.007768 0.002081 0.999968 -0.008042 0 0.999968 -0.007768 -0.002081 0.999968 -0.006965 -0.004021 0.999968 -0.005686 -0.005686 0.999968 -0.004021 -0.006965 0.999968 -0.002081 -0.007768 0.999968 0 -0.008042 0.999968 0.002081 -0.007768 0.999968 0.004021 -0.006965 0.999968 0.005686 -0.005686 0.999968 0.006965 -0.004021 0.999968 0.007768 -0.002081 0.999968 0.504391 -0.000000 0.863475 0.487204 0.130546 0.863475 0.436816 0.252196 0.863475 0.356658 0.356658 0.863475 0.252196 0.436815 0.863475 0.130546 0.487204 0.863475 0.000000 0.504391 0.863475 -0.130546 0.487205 0.863475 -0.252196 0.436816 0.863475 -0.356658 0.356658 0.863475 -0.436816 0.252196 0.863475 -0.487205 0.130546 0.863475 -0.504391 -0.000000 0.863475 -0.487204 -0.130546 0.863475 -0.436816 -0.252196 0.863475 -0.356658 -0.356658 0.863475 -0.252196 -0.436816 0.863475 -0.130546 -0.487204 0.863475 0 -0.504391 0.863475 0.130546 -0.487205 0.863475 0.252196 -0.436816 0.863475 0.356658 -0.356658 0.863475 0.436816 -0.252196 0.863475 0.487204 -0.130546 0.863475 0.867101 0.000000 0.498132 0.837556 0.224422 0.498132 0.750932 0.433551 0.498132 0.613133 0.613133 0.498132 0.433551 0.750932 0.498132 0.224422 0.837556 0.498132 0.000000 0.867101 0.498132 -0.224422 0.837556 0.498132 -0.433551 0.750932 0.498132 -0.613133 0.613133 0.498132 -0.750932 0.433551 0.498132 -0.837556 0.224422 0.498132 -0.867101 0 0.498132 -0.837556 -0.224422 0.498132 -0.750932 -0.433551 0.498132 -0.613133 -0.613133 0.498132 -0.433551 -0.750932 0.498132 -0.224422 -0.837556 0.498132 0 -0.867101 0.498132 0.224423 -0.837556 0.498132 0.433551 -0.750932 0.498132 0.613133 -0.613133 0.498132 0.750932 -0.433551 0.498132 0.837556 -0.224422 0.498132 0.991445 0.130526 0 0.933298 0.250077 -0.257713 0.859674 0.113178 -0.498148 0.966221 0 -0.257713 0.957955 0.126117 -0.257715 0.923879 0.382683 0 0.836772 0.483111 -0.257713 0.801089 0.331822 -0.498148 0.892672 0.369757 -0.257716 0.793353 0.608761 0 0.683222 0.683222 -0.257713 0.687911 0.527852 -0.498148 0.766554 0.588198 -0.257715 0.608762 0.793353 0 0.483111 0.836772 -0.257713 0.527852 0.687911 -0.498148 0.588198 0.766554 -0.257715 0.382683 0.92388 -0.000000 0.250076 0.933298 -0.257713 0.331822 0.801089 -0.498148 0.369757 0.892672 -0.257716 0.130526 0.991445 0 0 0.966222 -0.257713 0.113178 0.859674 -0.498148 0.126117 0.957955 -0.257715 -0.130526 0.991445 0 -0.250076 0.933298 -0.257713 -0.113178 0.859674 -0.498148 -0.126117 0.957955 -0.257715 -0.382683 0.92388 0 -0.483111 0.836772 -0.257713 -0.331822 0.801089 -0.498148 -0.369757 0.892672 -0.257715 -0.608761 0.793353 0 -0.683222 0.683222 -0.257713 -0.527852 0.687911 -0.498148 -0.588198 0.766554 -0.257715 -0.793353 0.608762 0 -0.836772 0.483111 -0.257713 -0.68791 0.527852 -0.498148 -0.766554 0.588198 -0.257715 -0.92388 0.382683 0 -0.933298 0.250077 -0.257713 -0.801089 0.331822 -0.498148 -0.892672 0.369756 -0.257716 -0.991445 0.130526 0 -0.966221 0 -0.257713 -0.859674 0.113178 -0.498148 -0.957955 0.126117 -0.257715 -0.991445 -0.130526 0 -0.933298 -0.250077 -0.257713 -0.859674 -0.113178 -0.498147 -0.957955 -0.126117 -0.257715 -0.923879 -0.382684 0 -0.836772 -0.483111 -0.257713 -0.801089 -0.331822 -0.498148 -0.892672 -0.369757 -0.257716 -0.793353 -0.608761 0 -0.683222 -0.683222 -0.257713 -0.687911 -0.527852 -0.498148 -0.766555 -0.588198 -0.257715 -0.608762 -0.793353 0 -0.483111 -0.836772 -0.257713 -0.527852 -0.687911 -0.498148 -0.588198 -0.766555 -0.257715 -0.382683 -0.923879 0 -0.250077 -0.933298 -0.257714 -0.331822 -0.801089 -0.498148 -0.369757 -0.892672 -0.257716 -0.130526 -0.991445 0 0 -0.966221 -0.257713 -0.113178 -0.859674 -0.498148 -0.126117 -0.957955 -0.257715 0.130526 -0.991445 0 0.250077 -0.933298 -0.257713 0.113178 -0.859674 -0.498148 0.126117 -0.957955 -0.257715 0.382684 -0.92388 0 0.483111 -0.836772 -0.257713 0.331822 -0.801089 -0.498148 0.369757 -0.892672 -0.257716 0.608762 -0.793353 0.000000 0.683222 -0.683222 -0.257713 0.527852 -0.687911 -0.498148 0.588198 -0.766555 -0.257715 0.793353 -0.608761 0 0.836772 -0.483111 -0.257713 0.687911 -0.527852 -0.498148 0.766555 -0.588198 -0.257715 0.923879 -0.382684 0 0.933298 -0.250077 -0.257713 0.801089 -0.331822 -0.498148 0.892672 -0.369757 -0.257716 0.991445 -0.130526 0 0.859674 -0.113178 -0.498147 0.957955 -0.126117 -0.257715 0.685646 0.183718 -0.70437 0.500028 0.065829 -0.863504 0.709833 0 -0.70437 0.703744 0.092649 -0.704386 0.614733 0.354916 -0.70437 0.465952 0.193004 -0.863504 0.655785 0.271635 -0.704387 0.501927 0.501927 -0.70437 0.400122 0.307024 -0.863504 0.563135 0.432109 -0.704387 0.354916 0.614733 -0.70437 0.307024 0.400122 -0.863504 0.432109 0.563135 -0.704387 0.183718 0.685646 -0.70437 0.193003 0.465952 -0.863504 0.271635 0.655785 -0.704386 0 0.709833 -0.70437 0.065829 0.500028 -0.863504 0.092649 0.703744 -0.704386 -0.183718 0.685646 -0.70437 -0.065829 0.500028 -0.863504 -0.092649 0.703744 -0.704386 -0.354916 0.614733 -0.70437 -0.193003 0.465952 -0.863504 -0.271635 0.655785 -0.704387 -0.501927 0.501927 -0.70437 -0.307024 0.400122 -0.863504 -0.432109 0.563135 -0.704387 -0.614733 0.354916 -0.70437 -0.400122 0.307024 -0.863504 -0.563135 0.432109 -0.704387 -0.685646 0.183718 -0.70437 -0.465952 0.193004 -0.863504 -0.655785 0.271635 -0.704387 -0.709833 0 -0.70437 -0.500028 0.065829 -0.863504 -0.703744 0.092649 -0.704386 -0.685646 -0.183718 -0.70437 -0.500028 -0.06583 -0.863504 -0.703744 -0.092649 -0.704386 -0.614733 -0.354916 -0.70437 -0.465952 -0.193003 -0.863504 -0.655785 -0.271635 -0.704386 -0.501927 -0.501927 -0.70437 -0.400122 -0.307024 -0.863504 -0.563136 -0.432109 -0.704386 -0.354917 -0.614733 -0.70437 -0.307024 -0.400122 -0.863504 -0.432109 -0.563135 -0.704386 -0.183718 -0.685646 -0.70437 -0.193004 -0.465952 -0.863504 -0.271635 -0.655785 -0.704386 0 -0.709833 -0.70437 -0.06583 -0.500028 -0.863504 -0.092649 -0.703744 -0.704386 0.183718 -0.685646 -0.70437 0.065829 -0.500028 -0.863504 0.092649 -0.703744 -0.704386 0.354916 -0.614733 -0.70437 0.193004 -0.465952 -0.863504 0.271635 -0.655785 -0.704386 0.501927 -0.501927 -0.70437 0.307024 -0.400122 -0.863504 0.432109 -0.563135 -0.704387 0.614733 -0.354916 -0.70437 0.400122 -0.307024 -0.863504 0.563135 -0.432109 -0.704386 0.685646 -0.183718 -0.70437 0.465952 -0.193003 -0.863504 0.655785 -0.271635 -0.704386 0.500028 -0.06583 -0.863504 0.703744 -0.092649 -0.704386 0.25655 0.068742 -0.964083 0.007834 0.001031 -0.999969 0.2656 0 -0.964083 0.263237 0.034655 -0.964109 0.230016 0.1328 -0.964083 0.0073 0.003023 -0.999969 0.245298 0.101606 -0.964108 0.187808 0.187807 -0.964083 0.006268 0.00481 -0.999969 0.210642 0.161632 -0.964108 0.1328 0.230016 -0.964083 0.00481 0.006268 -0.999969 0.161632 0.210642 -0.964108 0.068742 0.25655 -0.964083 0.003023 0.0073 -0.999969 0.101606 0.245298 -0.964108 0 0.2656 -0.964083 0.001031 0.007834 -0.999969 0.034655 0.263238 -0.964109 -0.068742 0.25655 -0.964083 -0.001031 0.007834 -0.999969 -0.034655 0.263237 -0.964108 -0.1328 0.230016 -0.964083 -0.003024 0.0073 -0.999969 -0.101606 0.245298 -0.964108 -0.187808 0.187807 -0.964083 -0.00481 0.006268 -0.999969 -0.161632 0.210642 -0.964108 -0.230016 0.1328 -0.964083 -0.006268 0.00481 -0.999969 -0.210643 0.161632 -0.964108 -0.25655 0.068742 -0.964083 -0.0073 0.003023 -0.999969 -0.245298 0.101606 -0.964109 -0.2656 0 -0.964083 -0.007834 0.001031 -0.999969 -0.263237 0.034655 -0.964108 -0.25655 -0.068742 -0.964083 -0.007833 -0.001031 -0.999969 -0.263237 -0.034656 -0.964108 -0.230016 -0.1328 -0.964083 -0.0073 -0.003023 -0.999969 -0.245298 -0.101606 -0.964108 -0.187807 -0.187807 -0.964083 -0.006268 -0.00481 -0.999969 -0.210642 -0.161632 -0.964108 -0.1328 -0.230016 -0.964083 -0.00481 -0.006268 -0.999969 -0.161631 -0.210642 -0.964109 -0.068742 -0.25655 -0.964083 -0.003023 -0.0073 -0.999969 -0.101606 -0.245298 -0.964108 0 -0.2656 -0.964083 -0.001031 -0.007834 -0.999969 -0.034655 -0.263237 -0.964108 0.068742 -0.25655 -0.964083 0.001031 -0.007834 -0.999969 0.034655 -0.263237 -0.964109 0.1328 -0.230016 -0.964083 0.003023 -0.0073 -0.999969 0.101606 -0.245298 -0.964109 0.187807 -0.187807 -0.964083 0.00481 -0.006268 -0.999969 0.161631 -0.210642 -0.964109 0.230016 -0.1328 -0.964083 0.006268 -0.00481 -0.999969 0.210642 -0.161632 -0.964109 0.256549 -0.068742 -0.964084 0.0073 -0.003023 -0.999969 0.245298 -0.101606 -0.964109 0.007834 -0.001031 -0.999969 0.263237 -0.034656 -0.964109 -0.241531 -0.064717 -0.968233 -0.488251 -0.064279 -0.870333 -0.250051 0 -0.968233 -0.248102 -0.032663 -0.968183 -0.216551 -0.125026 -0.968233 -0.454977 -0.188458 -0.870333 -0.231194 -0.095763 -0.968183 -0.176813 -0.176813 -0.968233 -0.390698 -0.299793 -0.870333 -0.198531 -0.152338 -0.968183 -0.125026 -0.216551 -0.968233 -0.299793 -0.390698 -0.870333 -0.152338 -0.198531 -0.968183 -0.064718 -0.241531 -0.968233 -0.188458 -0.454977 -0.870333 -0.095764 -0.231194 -0.968183 0 -0.250052 -0.968233 -0.064279 -0.488251 -0.870333 -0.032663 -0.248102 -0.968183 0.064718 -0.241531 -0.968233 0.064279 -0.488251 -0.870333 0.032663 -0.248102 -0.968183 0.125026 -0.216551 -0.968233 0.188458 -0.454978 -0.870333 0.095763 -0.231194 -0.968183 0.176813 -0.176813 -0.968233 0.299793 -0.390698 -0.870333 0.152338 -0.198531 -0.968183 0.216551 -0.125026 -0.968233 0.390698 -0.299793 -0.870333 0.198531 -0.152338 -0.968183 0.241531 -0.064718 -0.968233 0.454978 -0.188458 -0.870333 0.231195 -0.095763 -0.968183 0.250052 0 -0.968233 0.488251 -0.064279 -0.870333 0.248102 -0.032663 -0.968183 0.241531 0.064718 -0.968233 0.488251 0.064279 -0.870333 0.248103 0.032663 -0.968183 0.216551 0.125026 -0.968233 0.454978 0.188458 -0.870333 0.231195 0.095764 -0.968183 0.176813 0.176813 -0.968233 0.390698 0.299793 -0.870333 0.198531 0.152338 -0.968183 0.125026 0.216551 -0.968233 0.299793 0.390698 -0.870333 0.152338 0.198531 -0.968183 0.064718 0.241531 -0.968233 0.188458 0.454978 -0.870333 0.095764 0.231195 -0.968183 0 0.250051 -0.968233 0.064279 0.488251 -0.870333 0.032663 0.248102 -0.968183 -0.064718 0.241531 -0.968233 -0.064279 0.488251 -0.870333 -0.032663 0.248102 -0.968183 -0.125026 0.216551 -0.968233 -0.188458 0.454978 -0.870333 -0.095764 0.231195 -0.968183 -0.176813 0.176813 -0.968233 -0.299793 0.390698 -0.870333 -0.152338 0.198531 -0.968183 -0.216551 0.125026 -0.968233 -0.390698 0.299793 -0.870333 -0.198531 0.152338 -0.968183 -0.241531 0.064718 -0.968233 -0.454978 0.188458 -0.870333 -0.231195 0.095764 -0.968183 -0.488251 0.064279 -0.870333 -0.248102 0.032663 -0.968183 -0.677561 -0.181552 -0.712706 -0.855732 -0.112659 -0.505005 -0.701463 0.000000 -0.712706 -0.695629 -0.091581 -0.712539 -0.607485 -0.350732 -0.712706 -0.797416 -0.3303 -0.505005 -0.648224 -0.268503 -0.712539 -0.496009 -0.496009 -0.712706 -0.684756 -0.525432 -0.505005 -0.556642 -0.427126 -0.712539 -0.350732 -0.607485 -0.712706 -0.525432 -0.684756 -0.505005 -0.427126 -0.556642 -0.71254 -0.181552 -0.677562 -0.712706 -0.3303 -0.797415 -0.505005 -0.268503 -0.648224 -0.712539 0 -0.701463 -0.712706 -0.112659 -0.855732 -0.505005 -0.091581 -0.695629 -0.712539 0.181552 -0.677561 -0.712706 0.112659 -0.855732 -0.505005 0.091581 -0.695629 -0.71254 0.350731 -0.607485 -0.712706 0.3303 -0.797415 -0.505005 0.268503 -0.648223 -0.71254 0.496009 -0.496009 -0.712706 0.525432 -0.684756 -0.505005 0.427126 -0.556642 -0.71254 0.607485 -0.350731 -0.712706 0.684756 -0.525432 -0.505005 0.556642 -0.427126 -0.71254 0.677561 -0.181552 -0.712706 0.797416 -0.3303 -0.505005 0.648223 -0.268503 -0.712539 0.701463 0.000000 -0.712706 0.855732 -0.112659 -0.505005 0.695629 -0.091581 -0.712539 0.677561 0.181552 -0.712706 0.855732 0.112659 -0.505005 0.695629 0.091581 -0.71254 0.607485 0.350731 -0.712706 0.797415 0.3303 -0.505005 0.648223 0.268503 -0.71254 0.496009 0.496009 -0.712706 0.684756 0.525432 -0.505005 0.556642 0.427126 -0.71254 0.350731 0.607485 -0.712706 0.525432 0.684756 -0.505005 0.427126 0.556642 -0.71254 0.181552 0.677561 -0.712706 0.3303 0.797416 -0.505005 0.268503 0.648223 -0.71254 0 0.701463 -0.712706 0.112659 0.855732 -0.505005 0.091581 0.695629 -0.71254 -0.181552 0.677561 -0.712706 -0.112659 0.855732 -0.505005 -0.091581 0.695629 -0.71254 -0.350731 0.607485 -0.712706 -0.3303 0.797415 -0.505005 -0.268503 0.648223 -0.71254 -0.496009 0.496009 -0.712706 -0.525432 0.684756 -0.505005 -0.427126 0.556642 -0.712539 -0.607485 0.350731 -0.712706 -0.684756 0.525432 -0.505005 -0.556642 0.427126 -0.71254 -0.677561 0.181552 -0.712706 -0.797415 0.3303 -0.505005 -0.648223 0.268503 -0.71254 -0.855732 0.112659 -0.505005 -0.695629 0.091581 -0.71254 -0.93221 -0.249785 -0.261901 -0.991445 -0.130526 0 -0.965095 0 -0.261901 -0.956867 -0.125974 -0.261793 -0.835797 -0.482547 -0.261901 -0.923879 -0.382684 0 -0.891658 -0.369337 -0.261793 -0.682425 -0.682425 -0.261901 -0.793353 -0.608761 0 -0.765684 -0.58753 -0.261793 -0.482547 -0.835797 -0.261901 -0.608762 -0.793353 -0.000000 -0.58753 -0.765684 -0.261793 -0.249785 -0.93221 -0.261901 -0.382684 -0.923879 0.000000 -0.369337 -0.891658 -0.261793 0 -0.965095 -0.261901 -0.130526 -0.991445 0 -0.125974 -0.956867 -0.261793 0.249785 -0.93221 -0.261901 0.130526 -0.991445 0 0.125974 -0.956867 -0.261793 0.482547 -0.835797 -0.261901 0.382684 -0.92388 0 0.369337 -0.891658 -0.261793 0.682425 -0.682425 -0.2619 0.608761 -0.793353 0 0.58753 -0.765684 -0.261793 0.835797 -0.482547 -0.261901 0.793353 -0.608761 0 0.765684 -0.58753 -0.261793 0.93221 -0.249785 -0.261901 0.923879 -0.382684 0 0.891658 -0.369337 -0.261793 0.965095 0 -0.261901 0.991445 -0.130526 0 0.956867 -0.125974 -0.261793 0.93221 0.249785 -0.261901 0.991445 0.130526 0 0.956867 0.125974 -0.261793 0.835797 0.482547 -0.261901 0.92388 0.382683 -0.000000 0.891658 0.369337 -0.261793 0.682425 0.682425 -0.261901 0.793353 0.608761 -0.000000 0.765684 0.58753 -0.261793 0.482547 0.835797 -0.261901 0.608762 0.793353 -0.000000 0.58753 0.765684 -0.261793 0.249785 0.93221 -0.261901 0.382683 0.92388 -0.000000 0.369337 0.891658 -0.261793 0 0.965095 -0.261901 0.130526 0.991445 -0.000000 0.125974 0.956867 -0.261793 -0.249785 0.93221 -0.261901 -0.130526 0.991445 -0.000000 -0.125974 0.956867 -0.261793 -0.482547 0.835797 -0.261901 -0.382683 0.92388 -0.000000 -0.369337 0.891658 -0.261793 -0.682425 0.682425 -0.261901 -0.608762 0.793353 -0.000000 -0.58753 0.765684 -0.261793 -0.835797 0.482547 -0.261901 -0.793353 0.608762 -0.000000 -0.765684 0.58753 -0.261793 -0.93221 0.249785 -0.261901 -0.92388 0.382683 0 -0.891658 0.369337 -0.261793 -0.991445 0.130526 0 -0.956867 0.125974 -0.261793 -0.93221 -0.249785 0.261901 -0.855732 -0.11266 0.505005 -0.965095 0 0.261901 -0.956867 -0.125974 0.261793 -0.835797 -0.482547 0.261901 -0.797416 -0.3303 0.505005 -0.891658 -0.369337 0.261793 -0.682425 -0.682425 0.261901 -0.684756 -0.525432 0.505005 -0.765684 -0.58753 0.261793 -0.482547 -0.835797 0.261901 -0.525432 -0.684756 0.505005 -0.58753 -0.765684 0.261793 -0.249785 -0.93221 0.261901 -0.3303 -0.797415 0.505006 -0.369337 -0.891658 0.261794 0 -0.965095 0.261901 -0.112659 -0.855732 0.505005 -0.125974 -0.956867 0.261793 0.249785 -0.93221 0.261901 0.112659 -0.855732 0.505005 0.125974 -0.956867 0.261793 0.482547 -0.835797 0.261901 0.3303 -0.797415 0.505005 0.369337 -0.891658 0.261793 0.682425 -0.682425 0.261901 0.525432 -0.684756 0.505005 0.58753 -0.765684 0.261793 0.835797 -0.482547 0.261901 0.684756 -0.525432 0.505005 0.765684 -0.58753 0.261793 0.93221 -0.249785 0.261901 0.797416 -0.3303 0.505005 0.891658 -0.369337 0.261793 0.965095 0 0.261901 0.855732 -0.112659 0.505005 0.956867 -0.125974 0.261793 0.93221 0.249785 0.261901 0.855732 0.11266 0.505005 0.956867 0.125974 0.261793 0.835797 0.482547 0.261901 0.797416 0.3303 0.505005 0.891658 0.369337 0.261793 0.682425 0.682425 0.261901 0.684756 0.525432 0.505005 0.765684 0.58753 0.261793 0.482547 0.835797 0.261901 0.525432 0.684756 0.505005 0.58753 0.765684 0.261793 0.249785 0.93221 0.261901 0.3303 0.797415 0.505005 0.369337 0.891658 0.261793 0 0.965095 0.261901 0.112659 0.855732 0.505005 0.125974 0.956867 0.261793 -0.249785 0.93221 0.261901 -0.112659 0.855732 0.505005 -0.125974 0.956867 0.261793 -0.482547 0.835797 0.261901 -0.3303 0.797415 0.505005 -0.369337 0.891658 0.261793 -0.682425 0.682425 0.261901 -0.525432 0.684756 0.505005 -0.58753 0.765684 0.261793 -0.835797 0.482547 0.261901 -0.684756 0.525432 0.505005 -0.765684 0.58753 0.261793 -0.93221 0.249785 0.261901 -0.797416 0.3303 0.505005 -0.891658 0.369337 0.261793 -0.855732 0.112659 0.505005 -0.956867 0.125974 0.261793 -0.677562 -0.181552 0.712705 -0.488251 -0.064279 0.870333 -0.701463 -0.000000 0.712706 -0.69563 -0.091581 0.712539 -0.607485 -0.350732 0.712706 -0.454977 -0.188458 0.870333 -0.648224 -0.268503 0.712539 -0.496009 -0.496009 0.712706 -0.390698 -0.299793 0.870333 -0.556642 -0.427126 0.712539 -0.350731 -0.607485 0.712706 -0.299793 -0.390698 0.870333 -0.427126 -0.556642 0.712539 -0.181552 -0.677561 0.712706 -0.188458 -0.454978 0.870333 -0.268503 -0.648223 0.712539 0 -0.701463 0.712706 -0.064279 -0.488251 0.870333 -0.091581 -0.69563 0.712539 0.181552 -0.677561 0.712706 0.064279 -0.488251 0.870333 0.091581 -0.695629 0.712539 0.350732 -0.607485 0.712706 0.188458 -0.454978 0.870333 0.268503 -0.648223 0.712539 0.496009 -0.496009 0.712706 0.299793 -0.390698 0.870333 0.427127 -0.556642 0.712539 0.607485 -0.350732 0.712705 0.390698 -0.299793 0.870333 0.556642 -0.427127 0.712539 0.677561 -0.181552 0.712705 0.454978 -0.188458 0.870333 0.648224 -0.268503 0.712539 0.701463 -0.000000 0.712706 0.488251 -0.064279 0.870333 0.69563 -0.091581 0.712539 0.677562 0.181552 0.712705 0.488251 0.064279 0.870333 0.69563 0.091581 0.712539 0.607485 0.350731 0.712706 0.454977 0.188458 0.870333 0.648223 0.268503 0.712539 0.496009 0.496009 0.712706 0.390698 0.299793 0.870333 0.556642 0.427126 0.71254 0.350732 0.607485 0.712706 0.299793 0.390698 0.870333 0.427126 0.556642 0.712539 0.181552 0.677561 0.712706 0.188458 0.454978 0.870333 0.268503 0.648223 0.712539 0 0.701463 0.712705 0.064279 0.488251 0.870333 0.091581 0.695629 0.712539 -0.181552 0.677561 0.712706 -0.064279 0.488251 0.870333 -0.091581 0.695629 0.712539 -0.350732 0.607485 0.712706 -0.188458 0.454978 0.870333 -0.268503 0.648224 0.712539 -0.496009 0.496009 0.712706 -0.299793 0.390698 0.870333 -0.427126 0.556642 0.712539 -0.607485 0.350731 0.712706 -0.390698 0.299793 0.870333 -0.556642 0.427126 0.712539 -0.677562 0.181552 0.712706 -0.454977 0.188458 0.870333 -0.648223 0.268503 0.712539 -0.488251 0.064279 0.870333 -0.69563 0.091581 0.712539 -0.241531 -0.064718 0.968233 0.007834 0.001031 0.999969 -0.250051 0 0.968233 -0.248102 -0.032663 0.968183 -0.216551 -0.125026 0.968233 0.0073 0.003023 0.999969 -0.231194 -0.095763 0.968183 -0.176813 -0.176813 0.968233 0.006268 0.00481 0.999969 -0.198531 -0.152338 0.968183 -0.125026 -0.216551 0.968233 0.00481 0.006268 0.999969 -0.152338 -0.198531 0.968183 -0.064718 -0.241531 0.968233 0.003023 0.0073 0.999969 -0.095763 -0.231194 0.968183 0 -0.250051 0.968233 0.001031 0.007834 0.999969 -0.032663 -0.248102 0.968183 0.064718 -0.241531 0.968233 -0.001031 0.007834 0.999969 0.032663 -0.248102 0.968183 0.125026 -0.216551 0.968233 -0.003023 0.0073 0.999969 0.095763 -0.231194 0.968183 0.176813 -0.176813 0.968233 -0.00481 0.006268 0.999969 0.152338 -0.198531 0.968183 0.216551 -0.125026 0.968233 -0.006268 0.00481 0.999969 0.198531 -0.152338 0.968183 0.241531 -0.064718 0.968233 -0.0073 0.003023 0.999969 0.231195 -0.095763 0.968183 0.250051 0 0.968233 -0.007834 0.001031 0.999969 0.248102 -0.032663 0.968183 0.241531 0.064718 0.968233 -0.007834 -0.001031 0.999969 0.248102 0.032663 0.968183 0.216551 0.125026 0.968233 -0.0073 -0.003023 0.999969 0.231194 0.095763 0.968183 0.176813 0.176813 0.968233 -0.006268 -0.00481 0.999969 0.198531 0.152338 0.968183 0.125026 0.216551 0.968233 -0.00481 -0.006268 0.999969 0.152338 0.198531 0.968183 0.064718 0.241531 0.968233 -0.003023 -0.0073 0.999969 0.095764 0.231194 0.968183 0 0.250051 0.968233 -0.001031 -0.007834 0.999969 0.032663 0.248102 0.968183 -0.064718 0.241531 0.968233 0.001031 -0.007834 0.999969 -0.032663 0.248102 0.968183 -0.125026 0.216551 0.968233 0.003023 -0.0073 0.999969 -0.095764 0.231194 0.968183 -0.176813 0.176813 0.968233 0.00481 -0.006268 0.999969 -0.152338 0.198531 0.968183 -0.216551 0.125026 0.968233 0.006268 -0.00481 0.999969 -0.198531 0.152338 0.968183 -0.241531 0.064718 0.968233 0.0073 -0.003023 0.999969 -0.231194 0.095764 0.968183 0.007834 -0.001031 0.999969 -0.248102 0.032663 0.968183 0.25655 0.068742 0.964083 0.500028 0.06583 0.863504 0.2656 0 0.964083 0.263237 0.034655 0.964108 0.230016 0.1328 0.964083 0.465952 0.193004 0.863504 0.245298 0.101606 0.964108 0.187807 0.187807 0.964083 0.400122 0.307024 0.863504 0.210642 0.161632 0.964108 0.1328 0.230016 0.964083 0.307024 0.400122 0.863504 0.161632 0.210642 0.964109 0.068742 0.25655 0.964083 0.193003 0.465952 0.863504 0.101606 0.245298 0.964108 0 0.2656 0.964083 0.06583 0.500028 0.863504 0.034655 0.263238 0.964108 -0.068742 0.25655 0.964083 -0.06583 0.500028 0.863504 -0.034655 0.263238 0.964108 -0.1328 0.230016 0.964083 -0.193003 0.465952 0.863504 -0.101606 0.245298 0.964108 -0.187808 0.187807 0.964083 -0.307024 0.400122 0.863504 -0.161632 0.210642 0.964109 -0.230016 0.1328 0.964083 -0.400122 0.307024 0.863504 -0.210643 0.161632 0.964108 -0.25655 0.068742 0.964083 -0.465952 0.193004 0.863504 -0.245298 0.101606 0.964108 -0.2656 0 0.964083 -0.500028 0.06583 0.863504 -0.263238 0.034655 0.964108 -0.256549 -0.068742 0.964083 -0.500028 -0.06583 0.863504 -0.263237 -0.034655 0.964108 -0.230016 -0.1328 0.964083 -0.465951 -0.193004 0.863504 -0.245298 -0.101606 0.964108 -0.187807 -0.187807 0.964083 -0.400122 -0.307024 0.863504 -0.210642 -0.161632 0.964109 -0.1328 -0.230016 0.964083 -0.307024 -0.400122 0.863504 -0.161631 -0.210642 0.964108 -0.068742 -0.25655 0.964083 -0.193004 -0.465952 0.863504 -0.101606 -0.245298 0.964108 0 -0.2656 0.964083 -0.06583 -0.500028 0.863504 -0.034655 -0.263238 0.964108 0.068742 -0.25655 0.964083 0.065829 -0.500028 0.863504 0.034655 -0.263238 0.964108 0.1328 -0.230016 0.964083 0.193004 -0.465952 0.863504 0.101606 -0.245298 0.964108 0.187807 -0.187807 0.964083 0.307024 -0.400122 0.863504 0.161631 -0.210642 0.964109 0.230016 -0.1328 0.964083 0.400122 -0.307024 0.863504 0.210642 -0.161632 0.964109 0.25655 -0.068742 0.964083 0.465951 -0.193004 0.863504 0.245298 -0.101606 0.964109 0.500028 -0.06583 0.863504 0.263237 -0.034655 0.964108 0.685646 0.183718 0.70437 0.859674 0.113178 0.498148 0.709833 0 0.70437 0.703744 0.092649 0.704387 0.614733 0.354916 0.70437 0.801089 0.331822 0.498148 0.655785 0.271635 0.704386 0.501927 0.501927 0.70437 0.687911 0.527852 0.498148 0.563135 0.432109 0.704386 0.354916 0.614733 0.70437 0.527852 0.687911 0.498147 0.432109 0.563135 0.704387 0.183718 0.685646 0.70437 0.331822 0.801089 0.498148 0.271635 0.655785 0.704387 0.000000 0.709833 0.70437 0.113178 0.859674 0.498147 0.092649 0.703744 0.704387 -0.183718 0.685646 0.70437 -0.113178 0.859674 0.498148 -0.092649 0.703744 0.704387 -0.354917 0.614733 0.70437 -0.331822 0.801089 0.498147 -0.271635 0.655785 0.704386 -0.501927 0.501927 0.70437 -0.527852 0.687911 0.498147 -0.432109 0.563135 0.704387 -0.614733 0.354916 0.70437 -0.68791 0.527852 0.498148 -0.563135 0.432109 0.704387 -0.685646 0.183718 0.70437 -0.801089 0.331822 0.498148 -0.655785 0.271635 0.704387 -0.709833 -0.000000 0.70437 -0.859674 0.113178 0.498148 -0.703744 0.092649 0.704386 -0.685646 -0.183718 0.70437 -0.859674 -0.113178 0.498147 -0.703744 -0.092649 0.704386 -0.614733 -0.354916 0.70437 -0.801089 -0.331822 0.498148 -0.655785 -0.271635 0.704387 -0.501928 -0.501927 0.70437 -0.687911 -0.527852 0.498147 -0.563135 -0.432109 0.704386 -0.354916 -0.614733 0.70437 -0.527852 -0.687911 0.498147 -0.432109 -0.563135 0.704386 -0.183718 -0.685646 0.70437 -0.331822 -0.801089 0.498147 -0.271635 -0.655785 0.704386 0 -0.709833 0.70437 -0.113178 -0.859674 0.498148 -0.092649 -0.703744 0.704387 0.183718 -0.685646 0.70437 0.113178 -0.859674 0.498147 0.092649 -0.703744 0.704386 0.354916 -0.614733 0.70437 0.331822 -0.801089 0.498148 0.271635 -0.655785 0.704386 0.501928 -0.501927 0.70437 0.527852 -0.687911 0.498148 0.432109 -0.563135 0.704387 0.614733 -0.354916 0.70437 0.687911 -0.527852 0.498147 0.563136 -0.432109 0.704386 0.685646 -0.183718 0.70437 0.801089 -0.331822 0.498148 0.655785 -0.271635 0.704387 0.859674 -0.113178 0.498148 0.703744 -0.092649 0.704387 0.933298 0.250077 0.257713 0.966221 0 0.257713 0.957955 0.126117 0.257715 0.836772 0.483111 0.257713 0.892672 0.369757 0.257715 0.683222 0.683222 0.257713 0.766555 0.588198 0.257715 0.483111 0.836772 0.257713 0.588198 0.766554 0.257715 0.250077 0.933298 0.257713 0.369757 0.892672 0.257715 0 0.966222 0.257713 0.126117 0.957955 0.257715 -0.250076 0.933298 0.257713 -0.126117 0.957955 0.257715 -0.483111 0.836772 0.257713 -0.369757 0.892672 0.257715 -0.683222 0.683222 0.257713 -0.588198 0.766555 0.257715 -0.836772 0.483111 0.257713 -0.766555 0.588198 0.257715 -0.933298 0.250077 0.257713 -0.892672 0.369757 0.257715 -0.966221 0 0.257713 -0.957955 0.126117 0.257715 -0.933298 -0.250077 0.257713 -0.957955 -0.126117 0.257715 -0.836772 -0.483111 0.257713 -0.892672 -0.369757 0.257715 -0.683222 -0.683222 0.257713 -0.766555 -0.588198 0.257715 -0.483111 -0.836772 0.257713 -0.588198 -0.766555 0.257715 -0.250077 -0.933298 0.257713 -0.369757 -0.892672 0.257715 0 -0.966221 0.257713 -0.126117 -0.957955 0.257715 0.250077 -0.933298 0.257713 0.126117 -0.957955 0.257715 0.483111 -0.836772 0.257713 0.369757 -0.892672 0.257715 0.683222 -0.683222 0.257713 0.588198 -0.766555 0.257715 0.836772 -0.483111 0.257713 0.766555 -0.588198 0.257715 0.933298 -0.250077 0.257713 0.892672 -0.369757 0.257715 0.957955 -0.126117 0.257715</float_array>
+ <technique_common>
+ <accessor source="#Torus-normals-array" count="1152" stride="3">
+ <param name="X" type="float"/>
+ <param name="Y" type="float"/>
+ <param name="Z" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <source id="Torus-Texture" name="Texture">
+ <float_array id="Torus-Texture-array" count="2798">0 0 0.020833 0 0.020833 0.041666 0 0.041666 0.041666 0 0.041666 0.041666 0.041666 0.083333 0.020833 0.083333 0 0.083333 0.0625 0 0.0625 0.041666 0.083333 0 0.083333 0.041666 0.083333 0.083333 0.0625 0.083333 0.104167 0 0.104167 0.041666 0.125 0 0.125 0.041666 0.125 0.083333 0.104167 0.083333 0.145833 0 0.145833 0.041666 0.166667 0 0.166667 0.041666 0.166667 0.083333 0.145833 0.083333 0.1875 0 0.1875 0.041666 0.208333 0 0.208333 0.041666 0.208333 0.083333 0.1875 0.083333 0.229167 0 0.229167 0.041666 0.25 0 0.25 0.041666 0.25 0.083333 0.229167 0.083333 0.270833 0 0.270833 0.041666 0.291667 0 0.291667 0.041666 0.291667 0.083333 0.270833 0.083333 0.3125 0 0.3125 0.041666 0.333333 0 0.333333 0.041666 0.333333 0.083333 0.3125 0.083333 0.354167 0 0.354167 0.041666 0.375 0 0.375 0.041666 0.375 0.083333 0.354167 0.083333 0.395833 0 0.395833 0.041666 0.416667 0 0.416667 0.041666 0.416667 0.083333 0.395833 0.083333 0.4375 0 0.4375 0.041666 0.458333 0 0.458333 0.041666 0.458333 0.083333 0.4375 0.083333 0.479167 0 0.479167 0.041666 0.5 0 0.5 0.041666 0.5 0.083333 0.479167 0.083333 0.520833 0 0.520833 0.041666 0.541667 0 0.541667 0.041666 0.541667 0.083333 0.520833 0.083333 0.5625 0 0.5625 0.041666 0.583333 0 0.583333 0.041666 0.583333 0.083333 0.5625 0.083333 0.604167 0 0.604167 0.041666 0.625 0 0.625 0.041666 0.625 0.083333 0.604167 0.083333 0.645833 0 0.645833 0.041666 0.666667 0 0.666667 0.041666 0.666667 0.083333 0.645833 0.083333 0.6875 0 0.6875 0.041666 0.708333 0 0.708333 0.041666 0.708333 0.083333 0.6875 0.083333 0.729167 0 0.729167 0.041666 0.75 0 0.75 0.041666 0.75 0.083333 0.729167 0.083333 0.770833 0 0.770833 0.041666 0.791667 0 0.791667 0.041666 0.791667 0.083333 0.770833 0.083333 0.8125 0 0.8125 0.041666 0.833333 0 0.833333 0.041666 0.833333 0.083333 0.8125 0.083333 0.854167 0 0.854167 0.041666 0.875 0 0.875 0.041666 0.875 0.083333 0.854167 0.083333 0.895833 0 0.895833 0.041666 0.916667 0 0.916667 0.041666 0.916667 0.083333 0.895833 0.083333 0.9375 0 0.9375 0.041666 0.958333 0 0.958333 0.041666 0.958333 0.083333 0.9375 0.083333 0.979167 0 0.979167 0.041666 1 0 1 0.041666 0.979167 0 1 0.083333 0.979167 0.083333 1 0.041666 0.979167 0.083333 0.020833 0.125 0 0.125 0.041666 0.125 0.041666 0.166667 0.020833 0.166667 0 0.166667 0.0625 0.125 0.083333 0.125 0.083333 0.166667 0.0625 0.166667 0.104167 0.125 0.125 0.125 0.125 0.166667 0.104167 0.166667 0.145833 0.125 0.166667 0.125 0.166667 0.166667 0.145833 0.166667 0.1875 0.125 0.208333 0.125 0.208333 0.166667 0.1875 0.166667 0.229167 0.125 0.25 0.125 0.25 0.166667 0.229167 0.166667 0.270833 0.125 0.291667 0.125 0.291667 0.166667 0.270833 0.166667 0.3125 0.125 0.333333 0.125 0.333333 0.166667 0.3125 0.166667 0.354167 0.125 0.375 0.125 0.375 0.166667 0.354167 0.166667 0.395833 0.125 0.416667 0.125 0.416667 0.166667 0.395833 0.166667 0.4375 0.125 0.458333 0.125 0.458333 0.166667 0.4375 0.166667 0.479167 0.125 0.5 0.125 0.5 0.166667 0.479167 0.166667 0.520833 0.125 0.541667 0.125 0.541667 0.166667 0.520833 0.166667 0.5625 0.125 0.583333 0.125 0.583333 0.166667 0.5625 0.166667 0.604167 0.125 0.625 0.125 0.625 0.166667 0.604167 0.166667 0.645833 0.125 0.666667 0.125 0.666667 0.166667 0.645833 0.166667 0.6875 0.125 0.708333 0.125 0.708333 0.166667 0.6875 0.166667 0.729167 0.125 0.75 0.125 0.75 0.166667 0.729167 0.166667 0.770833 0.125 0.791667 0.125 0.791667 0.166667 0.770833 0.166667 0.8125 0.125 0.833333 0.125 0.833333 0.166667 0.8125 0.166667 0.854167 0.125 0.875 0.125 0.875 0.166667 0.854167 0.166667 0.895833 0.125 0.916667 0.125 0.916667 0.166667 0.895833 0.166667 0.9375 0.125 0.958333 0.125 0.958333 0.166667 0.9375 0.166667 0.979167 0.083333 0.979167 0.125 1 0.083333 1 0.125 0.979167 0.083333 1 0.166667 0.979167 0.166667 1 0.125 0.979167 0.166667 0.020833 0.208333 0 0.208333 0.041666 0.208333 0.041666 0.25 0.020833 0.25 0 0.25 0.0625 0.208333 0.083333 0.208333 0.083333 0.25 0.0625 0.25 0.104167 0.208333 0.125 0.208333 0.125 0.25 0.104167 0.25 0.145833 0.208333 0.166667 0.208333 0.166667 0.25 0.145833 0.25 0.1875 0.208333 0.208333 0.208333 0.208333 0.25 0.1875 0.25 0.229167 0.208333 0.25 0.208333 0.25 0.25 0.229167 0.25 0.270833 0.208333 0.291667 0.208333 0.291667 0.25 0.270833 0.25 0.3125 0.208333 0.333333 0.208333 0.333333 0.25 0.3125 0.25 0.354167 0.208333 0.375 0.208333 0.375 0.25 0.354167 0.25 0.395833 0.208333 0.416667 0.208333 0.416667 0.25 0.395833 0.25 0.4375 0.208333 0.458333 0.208333 0.458333 0.25 0.4375 0.25 0.479167 0.208333 0.5 0.208333 0.5 0.25 0.479167 0.25 0.520833 0.208333 0.541667 0.208333 0.541667 0.25 0.520833 0.25 0.5625 0.208333 0.583333 0.208333 0.583333 0.25 0.5625 0.25 0.604167 0.208333 0.625 0.208333 0.625 0.25 0.604167 0.25 0.645833 0.208333 0.666667 0.208333 0.666667 0.25 0.645833 0.25 0.6875 0.208333 0.708333 0.208333 0.708333 0.25 0.6875 0.25 0.729167 0.208333 0.75 0.208333 0.75 0.25 0.729167 0.25 0.770833 0.208333 0.791667 0.208333 0.791667 0.25 0.770833 0.25 0.8125 0.208333 0.833333 0.208333 0.833333 0.25 0.8125 0.25 0.854167 0.208333 0.875 0.208333 0.875 0.25 0.854167 0.25 0.895833 0.208333 0.916667 0.208333 0.916667 0.25 0.895833 0.25 0.9375 0.208333 0.958333 0.208333 0.958333 0.25 0.9375 0.25 0.979167 0.166667 0.979167 0.208333 1 0.166667 1 0.208333 0.979167 0.166667 1 0.25 0.979167 0.25 1 0.208333 0.979167 0.25 0.020833 0.291667 0 0.291667 0.041666 0.291667 0.041666 0.333333 0.020833 0.333333 0 0.333333 0.0625 0.291667 0.083333 0.291667 0.083333 0.333333 0.0625 0.333333 0.104167 0.291667 0.125 0.291667 0.125 0.333333 0.104167 0.333333 0.145833 0.291667 0.166667 0.291667 0.166667 0.333333 0.145833 0.333333 0.1875 0.291667 0.208333 0.291667 0.208333 0.333333 0.1875 0.333333 0.229167 0.291667 0.25 0.291667 0.25 0.333333 0.229167 0.333333 0.270833 0.291667 0.291667 0.291667 0.291667 0.333333 0.270833 0.333333 0.3125 0.291667 0.333333 0.291667 0.333333 0.333333 0.3125 0.333333 0.354167 0.291667 0.375 0.291667 0.375 0.333333 0.354167 0.333333 0.395833 0.291667 0.416667 0.291667 0.416667 0.333333 0.395833 0.333333 0.4375 0.291667 0.458333 0.291667 0.458333 0.333333 0.4375 0.333333 0.479167 0.291667 0.5 0.291667 0.5 0.333333 0.479167 0.333333 0.520833 0.291667 0.541667 0.291667 0.541667 0.333333 0.520833 0.333333 0.5625 0.291667 0.583333 0.291667 0.583333 0.333333 0.5625 0.333333 0.604167 0.291667 0.625 0.291667 0.625 0.333333 0.604167 0.333333 0.645833 0.291667 0.666667 0.291667 0.666667 0.333333 0.645833 0.333333 0.6875 0.291667 0.708333 0.291667 0.708333 0.333333 0.6875 0.333333 0.729167 0.291667 0.75 0.291667 0.75 0.333333 0.729167 0.333333 0.770833 0.291667 0.791667 0.291667 0.791667 0.333333 0.770833 0.333333 0.8125 0.291667 0.833333 0.291667 0.833333 0.333333 0.8125 0.333333 0.854167 0.291667 0.875 0.291667 0.875 0.333333 0.854167 0.333333 0.895833 0.291667 0.916667 0.291667 0.916667 0.333333 0.895833 0.333333 0.9375 0.291667 0.958333 0.291667 0.958333 0.333333 0.9375 0.333333 0.979167 0.25 0.979167 0.291667 1 0.25 1 0.291667 0.979167 0.25 1 0.333333 0.979167 0.333333 1 0.291667 0.979167 0.333333 0.020833 0.375 0 0.375 0.041666 0.375 0.041666 0.416667 0.020833 0.416667 0 0.416667 0.0625 0.375 0.083333 0.375 0.083333 0.416667 0.0625 0.416667 0.104167 0.375 0.125 0.375 0.125 0.416667 0.104167 0.416667 0.145833 0.375 0.166667 0.375 0.166667 0.416667 0.145833 0.416667 0.1875 0.375 0.208333 0.375 0.208333 0.416667 0.1875 0.416667 0.229167 0.375 0.25 0.375 0.25 0.416667 0.229167 0.416667 0.270833 0.375 0.291667 0.375 0.291667 0.416667 0.270833 0.416667 0.3125 0.375 0.333333 0.375 0.333333 0.416667 0.3125 0.416667 0.354167 0.375 0.375 0.375 0.375 0.416667 0.354167 0.416667 0.395833 0.375 0.416667 0.375 0.416667 0.416667 0.395833 0.416667 0.4375 0.375 0.458333 0.375 0.458333 0.416667 0.4375 0.416667 0.479167 0.375 0.5 0.375 0.5 0.416667 0.479167 0.416667 0.520833 0.375 0.541667 0.375 0.541667 0.416667 0.520833 0.416667 0.5625 0.375 0.583333 0.375 0.583333 0.416667 0.5625 0.416667 0.604167 0.375 0.625 0.375 0.625 0.416667 0.604167 0.416667 0.645833 0.375 0.666667 0.375 0.666667 0.416667 0.645833 0.416667 0.6875 0.375 0.708333 0.375 0.708333 0.416667 0.6875 0.416667 0.729167 0.375 0.75 0.375 0.75 0.416667 0.729167 0.416667 0.770833 0.375 0.791667 0.375 0.791667 0.416667 0.770833 0.416667 0.8125 0.375 0.833333 0.375 0.833333 0.416667 0.8125 0.416667 0.854167 0.375 0.875 0.375 0.875 0.416667 0.854167 0.416667 0.895833 0.375 0.916667 0.375 0.916667 0.416667 0.895833 0.416667 0.9375 0.375 0.958333 0.375 0.958333 0.416667 0.9375 0.416667 0.979167 0.333333 0.979167 0.375 1 0.333333 1 0.375 0.979167 0.333333 1 0.416667 0.979167 0.416667 1 0.375 0.979167 0.416667 0.020833 0.458333 0 0.458333 0.041666 0.458333 0.041666 0.5 0.020833 0.5 0 0.5 0.0625 0.458333 0.083333 0.458333 0.083333 0.5 0.0625 0.5 0.104167 0.458333 0.125 0.458333 0.125 0.5 0.104167 0.5 0.145833 0.458333 0.166667 0.458333 0.166667 0.5 0.145833 0.5 0.1875 0.458333 0.208333 0.458333 0.208333 0.5 0.1875 0.5 0.229167 0.458333 0.25 0.458333 0.25 0.5 0.229167 0.5 0.270833 0.458333 0.291667 0.458333 0.291667 0.5 0.270833 0.5 0.3125 0.458333 0.333333 0.458333 0.333333 0.5 0.3125 0.5 0.354167 0.458333 0.375 0.458333 0.375 0.5 0.354167 0.5 0.395833 0.458333 0.416667 0.458333 0.416667 0.5 0.395833 0.5 0.4375 0.458333 0.458333 0.458333 0.458333 0.5 0.4375 0.5 0.479167 0.458333 0.5 0.458333 0.5 0.5 0.479167 0.5 0.520833 0.458333 0.541667 0.458333 0.541667 0.5 0.520833 0.5 0.5625 0.458333 0.583333 0.458333 0.583333 0.5 0.5625 0.5 0.604167 0.458333 0.625 0.458333 0.625 0.5 0.604167 0.5 0.645833 0.458333 0.666667 0.458333 0.666667 0.5 0.645833 0.5 0.6875 0.458333 0.708333 0.458333 0.708333 0.5 0.6875 0.5 0.729167 0.458333 0.75 0.458333 0.75 0.5 0.729167 0.5 0.770833 0.458333 0.791667 0.458333 0.791667 0.5 0.770833 0.5 0.8125 0.458333 0.833333 0.458333 0.833333 0.5 0.8125 0.5 0.854167 0.458333 0.875 0.458333 0.875 0.5 0.854167 0.5 0.895833 0.458333 0.916667 0.458333 0.916667 0.5 0.895833 0.5 0.9375 0.458333 0.958333 0.458333 0.958333 0.5 0.9375 0.5 0.979167 0.416667 0.979167 0.458333 1 0.416667 1 0.458333 0.979167 0.416667 1 0.5 0.979167 0.5 1 0.458333 0.979167 0.5 0.020833 0.541667 0 0.541667 0.041666 0.541667 0.041666 0.583333 0.020833 0.583333 0 0.583333 0.0625 0.541667 0.083333 0.541667 0.083333 0.583333 0.0625 0.583333 0.104167 0.541667 0.125 0.541667 0.125 0.583333 0.104167 0.583333 0.145833 0.541667 0.166667 0.541667 0.166667 0.583333 0.145833 0.583333 0.1875 0.541667 0.208333 0.541667 0.208333 0.583333 0.1875 0.583333 0.229167 0.541667 0.25 0.541667 0.25 0.583333 0.229167 0.583333 0.270833 0.541667 0.291667 0.541667 0.291667 0.583333 0.270833 0.583333 0.3125 0.541667 0.333333 0.541667 0.333333 0.583333 0.3125 0.583333 0.354167 0.541667 0.375 0.541667 0.375 0.583333 0.354167 0.583333 0.395833 0.541667 0.416667 0.541667 0.416667 0.583333 0.395833 0.583333 0.4375 0.541667 0.458333 0.541667 0.458333 0.583333 0.4375 0.583333 0.479167 0.541667 0.5 0.541667 0.5 0.583333 0.479167 0.583333 0.520833 0.541667 0.541667 0.541667 0.541667 0.583333 0.520833 0.583333 0.5625 0.541667 0.583333 0.541667 0.583333 0.583333 0.5625 0.583333 0.604167 0.541667 0.625 0.541667 0.625 0.583333 0.604167 0.583333 0.645833 0.541667 0.666667 0.541667 0.666667 0.583333 0.645833 0.583333 0.6875 0.541667 0.708333 0.541667 0.708333 0.583333 0.6875 0.583333 0.729167 0.541667 0.75 0.541667 0.75 0.583333 0.729167 0.583333 0.770833 0.541667 0.791667 0.541667 0.791667 0.583333 0.770833 0.583333 0.8125 0.541667 0.833333 0.541667 0.833333 0.583333 0.8125 0.583333 0.854167 0.541667 0.875 0.541667 0.875 0.583333 0.854167 0.583333 0.895833 0.541667 0.916667 0.541667 0.916667 0.583333 0.895833 0.583333 0.9375 0.541667 0.958333 0.541667 0.958333 0.583333 0.9375 0.583333 0.979167 0.5 0.979167 0.541667 1 0.5 1 0.541667 0.979167 0.5 1 0.583333 0.979167 0.583333 1 0.541667 0.979167 0.583333 0.020833 0.625 0 0.625 0.041666 0.625 0.041666 0.666667 0.020833 0.666667 0 0.666667 0.0625 0.625 0.083333 0.625 0.083333 0.666667 0.0625 0.666667 0.104167 0.625 0.125 0.625 0.125 0.666667 0.104167 0.666667 0.145833 0.625 0.166667 0.625 0.166667 0.666667 0.145833 0.666667 0.1875 0.625 0.208333 0.625 0.208333 0.666667 0.1875 0.666667 0.229167 0.625 0.25 0.625 0.25 0.666667 0.229167 0.666667 0.270833 0.625 0.291667 0.625 0.291667 0.666667 0.270833 0.666667 0.3125 0.625 0.333333 0.625 0.333333 0.666667 0.3125 0.666667 0.354167 0.625 0.375 0.625 0.375 0.666667 0.354167 0.666667 0.395833 0.625 0.416667 0.625 0.416667 0.666667 0.395833 0.666667 0.4375 0.625 0.458333 0.625 0.458333 0.666667 0.4375 0.666667 0.479167 0.625 0.5 0.625 0.5 0.666667 0.479167 0.666667 0.520833 0.625 0.541667 0.625 0.541667 0.666667 0.520833 0.666667 0.5625 0.625 0.583333 0.625 0.583333 0.666667 0.5625 0.666667 0.604167 0.625 0.625 0.625 0.625 0.666667 0.604167 0.666667 0.645833 0.625 0.666667 0.625 0.666667 0.666667 0.645833 0.666667 0.6875 0.625 0.708333 0.625 0.708333 0.666667 0.6875 0.666667 0.729167 0.625 0.75 0.625 0.75 0.666667 0.729167 0.666667 0.770833 0.625 0.791667 0.625 0.791667 0.666667 0.770833 0.666667 0.8125 0.625 0.833333 0.625 0.833333 0.666667 0.8125 0.666667 0.854167 0.625 0.875 0.625 0.875 0.666667 0.854167 0.666667 0.895833 0.625 0.916667 0.625 0.916667 0.666667 0.895833 0.666667 0.9375 0.625 0.958333 0.625 0.958333 0.666667 0.9375 0.666667 0.979167 0.583333 0.979167 0.625 1 0.583333 1 0.625 0.979167 0.583333 1 0.666667 0.979167 0.666667 1 0.625 0.979167 0.666667 0.020833 0.708333 0 0.708333 0.041666 0.708333 0.041666 0.75 0.020833 0.75 0 0.75 0.0625 0.708333 0.083333 0.708333 0.083333 0.75 0.0625 0.75 0.104167 0.708333 0.125 0.708333 0.125 0.75 0.104167 0.75 0.145833 0.708333 0.166667 0.708333 0.166667 0.75 0.145833 0.75 0.1875 0.708333 0.208333 0.708333 0.208333 0.75 0.1875 0.75 0.229167 0.708333 0.25 0.708333 0.25 0.75 0.229167 0.75 0.270833 0.708333 0.291667 0.708333 0.291667 0.75 0.270833 0.75 0.3125 0.708333 0.333333 0.708333 0.333333 0.75 0.3125 0.75 0.354167 0.708333 0.375 0.708333 0.375 0.75 0.354167 0.75 0.395833 0.708333 0.416667 0.708333 0.416667 0.75 0.395833 0.75 0.4375 0.708333 0.458333 0.708333 0.458333 0.75 0.4375 0.75 0.479167 0.708333 0.5 0.708333 0.5 0.75 0.479167 0.75 0.520833 0.708333 0.541667 0.708333 0.541667 0.75 0.520833 0.75 0.5625 0.708333 0.583333 0.708333 0.583333 0.75 0.5625 0.75 0.604167 0.708333 0.625 0.708333 0.625 0.75 0.604167 0.75 0.645833 0.708333 0.666667 0.708333 0.666667 0.75 0.645833 0.75 0.6875 0.708333 0.708333 0.708333 0.708333 0.75 0.6875 0.75 0.729167 0.708333 0.75 0.708333 0.75 0.75 0.729167 0.75 0.770833 0.708333 0.791667 0.708333 0.791667 0.75 0.770833 0.75 0.8125 0.708333 0.833333 0.708333 0.833333 0.75 0.8125 0.75 0.854167 0.708333 0.875 0.708333 0.875 0.75 0.854167 0.75 0.895833 0.708333 0.916667 0.708333 0.916667 0.75 0.895833 0.75 0.9375 0.708333 0.958333 0.708333 0.958333 0.75 0.9375 0.75 0.979167 0.666667 0.979167 0.708333 1 0.666667 1 0.708333 0.979167 0.666667 1 0.75 0.979167 0.75 1 0.708333 0.979167 0.75 0.020833 0.791667 0 0.791667 0.041666 0.791667 0.041666 0.833333 0.020833 0.833333 0 0.833333 0.0625 0.791667 0.083333 0.791667 0.083333 0.833333 0.0625 0.833333 0.104167 0.791667 0.125 0.791667 0.125 0.833333 0.104167 0.833333 0.145833 0.791667 0.166667 0.791667 0.166667 0.833333 0.145833 0.833333 0.1875 0.791667 0.208333 0.791667 0.208333 0.833333 0.1875 0.833333 0.229167 0.791667 0.25 0.791667 0.25 0.833333 0.229167 0.833333 0.270833 0.791667 0.291667 0.791667 0.291667 0.833333 0.270833 0.833333 0.3125 0.791667 0.333333 0.791667 0.333333 0.833333 0.3125 0.833333 0.354167 0.791667 0.375 0.791667 0.375 0.833333 0.354167 0.833333 0.395833 0.791667 0.416667 0.791667 0.416667 0.833333 0.395833 0.833333 0.4375 0.791667 0.458333 0.791667 0.458333 0.833333 0.4375 0.833333 0.479167 0.791667 0.5 0.791667 0.5 0.833333 0.479167 0.833333 0.520833 0.791667 0.541667 0.791667 0.541667 0.833333 0.520833 0.833333 0.5625 0.791667 0.583333 0.791667 0.583333 0.833333 0.5625 0.833333 0.604167 0.791667 0.625 0.791667 0.625 0.833333 0.604167 0.833333 0.645833 0.791667 0.666667 0.791667 0.666667 0.833333 0.645833 0.833333 0.6875 0.791667 0.708333 0.791667 0.708333 0.833333 0.6875 0.833333 0.729167 0.791667 0.75 0.791667 0.75 0.833333 0.729167 0.833333 0.770833 0.791667 0.791667 0.791667 0.791667 0.833333 0.770833 0.833333 0.8125 0.791667 0.833333 0.791667 0.833333 0.833333 0.8125 0.833333 0.854167 0.791667 0.875 0.791667 0.875 0.833333 0.854167 0.833333 0.895833 0.791667 0.916667 0.791667 0.916667 0.833333 0.895833 0.833333 0.9375 0.791667 0.958333 0.791667 0.958333 0.833333 0.9375 0.833333 0.979167 0.75 0.979167 0.791667 1 0.75 1 0.791667 0.979167 0.75 1 0.833333 0.979167 0.833333 1 0.791667 0.979167 0.833333 0.020833 0.875 0 0.875 0.041666 0.875 0.041666 0.916667 0.020833 0.916667 0 0.916667 0.0625 0.875 0.083333 0.875 0.083333 0.916667 0.0625 0.916667 0.104167 0.875 0.125 0.875 0.125 0.916667 0.104167 0.916667 0.145833 0.875 0.166667 0.875 0.166667 0.916667 0.145833 0.916667 0.1875 0.875 0.208333 0.875 0.208333 0.916667 0.1875 0.916667 0.229167 0.875 0.25 0.875 0.25 0.916667 0.229167 0.916667 0.270833 0.875 0.291667 0.875 0.291667 0.916667 0.270833 0.916667 0.3125 0.875 0.333333 0.875 0.333333 0.916667 0.3125 0.916667 0.354167 0.875 0.375 0.875 0.375 0.916667 0.354167 0.916667 0.395833 0.875 0.416667 0.875 0.416667 0.916667 0.395833 0.916667 0.4375 0.875 0.458333 0.875 0.458333 0.916667 0.4375 0.916667 0.479167 0.875 0.5 0.875 0.5 0.916667 0.479167 0.916667 0.520833 0.875 0.541667 0.875 0.541667 0.916667 0.520833 0.916667 0.5625 0.875 0.583333 0.875 0.583333 0.916667 0.5625 0.916667 0.604167 0.875 0.625 0.875 0.625 0.916667 0.604167 0.916667 0.645833 0.875 0.666667 0.875 0.666667 0.916667 0.645833 0.916667 0.6875 0.875 0.708333 0.875 0.708333 0.916667 0.6875 0.916667 0.729167 0.875 0.75 0.875 0.75 0.916667 0.729167 0.916667 0.770833 0.875 0.791667 0.875 0.791667 0.916667 0.770833 0.916667 0.8125 0.875 0.833333 0.875 0.833333 0.916667 0.8125 0.916667 0.854167 0.875 0.875 0.875 0.875 0.916667 0.854167 0.916667 0.895833 0.875 0.916667 0.875 0.916667 0.916667 0.895833 0.916667 0.9375 0.875 0.958333 0.875 0.958333 0.916667 0.9375 0.916667 0.979167 0.833333 0.979167 0.875 1 0.833333 1 0.875 0.979167 0.833333 1 0.916667 0.979167 0.916667 1 0.875 0.979167 0.916667 0.020833 0.958333 0 0.958333 0.041666 0.958333 0.041666 1 0.020833 1 0.041666 0.958333 0 1 0 0.958333 0.020833 1 0.0625 0.958333 0.041666 0.958333 0.083333 0.958333 0.083333 1 0.0625 1 0.083333 0.958333 0.041666 1 0.041666 0.958333 0.0625 1 0.104167 0.958333 0.083333 0.958333 0.125 0.958333 0.125 1 0.104167 1 0.125 0.958333 0.083333 1 0.083333 0.958333 0.104167 1 0.145833 0.958333 0.125 0.958333 0.166667 0.958333 0.166667 1 0.145833 1 0.166667 0.958333 0.125 1 0.125 0.958333 0.145833 1 0.1875 0.958333 0.166667 0.958333 0.208333 0.958333 0.208333 1 0.1875 1 0.208333 0.958333 0.166667 1 0.166667 0.958333 0.1875 1 0.229167 0.958333 0.208333 0.958333 0.25 0.958333 0.25 1 0.229167 1 0.25 0.958333 0.208333 1 0.208333 0.958333 0.229167 1 0.270833 0.958333 0.25 0.958333 0.291667 0.958333 0.291667 1 0.270833 1 0.291667 0.958333 0.25 1 0.25 0.958333 0.270833 1 0.3125 0.958333 0.291667 0.958333 0.333333 0.958333 0.333333 1 0.3125 1 0.333333 0.958333 0.291667 1 0.291667 0.958333 0.3125 1 0.354167 0.958333 0.333333 0.958333 0.375 0.958333 0.375 1 0.354167 1 0.375 0.958333 0.333333 1 0.333333 0.958333 0.354167 1 0.395833 0.958333 0.375 0.958333 0.416667 0.958333 0.416667 1 0.395833 1 0.416667 0.958333 0.375 1 0.375 0.958333 0.395833 1 0.4375 0.958333 0.416667 0.958333 0.458333 0.958333 0.458333 1 0.4375 1 0.458333 0.958333 0.416667 1 0.416667 0.958333 0.4375 1 0.479167 0.958333 0.458333 0.958333 0.5 0.958333 0.5 1 0.479167 1 0.5 0.958333 0.458333 1 0.458333 0.958333 0.479167 1 0.520833 0.958333 0.5 0.958333 0.541667 0.958333 0.541667 1 0.520833 1 0.541667 0.958333 0.5 1 0.5 0.958333 0.520833 1 0.5625 0.958333 0.541667 0.958333 0.583333 0.958333 0.583333 1 0.5625 1 0.583333 0.958333 0.541667 1 0.541667 0.958333 0.5625 1 0.604167 0.958333 0.583333 0.958333 0.625 0.958333 0.625 1 0.604167 1 0.625 0.958333 0.583333 1 0.583333 0.958333 0.604167 1 0.645833 0.958333 0.625 0.958333 0.666667 0.958333 0.666667 1 0.645833 1 0.666667 0.958333 0.625 1 0.625 0.958333 0.645833 1 0.6875 0.958333 0.666667 0.958333 0.708333 0.958333 0.708333 1 0.6875 1 0.708333 0.958333 0.666667 1 0.666667 0.958333 0.6875 1 0.729167 0.958333 0.708333 0.958333 0.75 0.958333 0.75 1 0.729167 1 0.75 0.958333 0.708333 1 0.708333 0.958333 0.729167 1 0.770833 0.958333 0.75 0.958333 0.791667 0.958333 0.791667 1 0.770833 1 0.791667 0.958333 0.75 1 0.75 0.958333 0.770833 1 0.8125 0.958333 0.791667 0.958333 0.833333 0.958333 0.833333 1 0.8125 1 0.833333 0.958333 0.791667 1 0.791667 0.958333 0.8125 1 0.854167 0.958333 0.833333 0.958333 0.875 0.958333 0.875 1 0.854167 1 0.875 0.958333 0.833333 1 0.833333 0.958333 0.854167 1 0.895833 0.958333 0.875 0.958333 0.916667 0.958333 0.916667 1 0.895833 1 0.916667 0.958333 0.875 1 0.875 0.958333 0.895833 1 0.9375 0.958333 0.916667 0.958333 0.958333 0.958333 0.958333 1 0.9375 1 0.958333 0.958333 0.916667 1 0.916667 0.958333 0.9375 1 0.979167 0.916667 0.979167 0.958333 0.958333 0.958333 1 0.916667 1 0.958333 0.979167 0.916667 1 1 0.979167 1 1 0.958333 0.958333 1 0.958333 0.958333 0.979167 1</float_array>
+ <technique_common>
+ <accessor source="#Torus-Texture-array" count="1399" stride="2">
+ <param name="S" type="float"/>
+ <param name="T" type="float"/>
+ </accessor>
+ </technique_common>
+ </source>
+ <vertices id="Torus-vertices">
+ <input semantic="POSITION" source="#Torus-positions"/>
+ <input semantic="NORMAL" source="#Torus-normals"/>
+ </vertices>
+ <triangles material="lambert2SG" count="2304">
+ <input semantic="VERTEX" source="#Torus-vertices" offset="0"/>
+ <input semantic="TEXCOORD" source="#Torus-Texture" offset="1" set="1"/>
+ <p>288 1 292 2 0 0 0 0 292 2 291 3 289 5 292 2 1 4 1 4 292 2 288 1 25 6 290 7 289 5 289 5 290 7 292 2 24 8 291 3 290 7 290 7 291 3 292 2 293 9 296 10 1 4 1 4 296 10 289 5 294 12 296 10 2 11 2 11 296 10 293 9 26 13 295 14 294 12 294 12 295 14 296 10 25 6 289 5 295 14 295 14 289 5 296 10 297 15 300 16 2 11 2 11 300 16 294 12 298 18 300 16 3 17 3 17 300 16 297 15 27 19 299 20 298 18 298 18 299 20 300 16 26 13 294 12 299 20 299 20 294 12 300 16 301 21 304 22 3 17 3 17 304 22 298 18 302 24 304 22 4 23 4 23 304 22 301 21 28 25 303 26 302 24 302 24 303 26 304 22 27 19 298 18 303 26 303 26 298 18 304 22 305 27 308 28 4 23 4 23 308 28 302 24 306 30 308 28 5 29 5 29 308 28 305 27 29 31 307 32 306 30 306 30 307 32 308 28 28 25 302 24 307 32 307 32 302 24 308 28 309 33 312 34 5 29 5 29 312 34 306 30 310 36 312 34 6 35 6 35 312 34 309 33 30 37 311 38 310 36 310 36 311 38 312 34 29 31 306 30 311 38 311 38 306 30 312 34 313 39 316 40 6 35 6 35 316 40 310 36 314 42 316 40 7 41 7 41 316 40 313 39 31 43 315 44 314 42 314 42 315 44 316 40 30 37 310 36 315 44 315 44 310 36 316 40 317 45 320 46 7 41 7 41 320 46 314 42 318 48 320 46 8 47 8 47 320 46 317 45 32 49 319 50 318 48 318 48 319 50 320 46 31 43 314 42 319 50 319 50 314 42 320 46 321 51 324 52 8 47 8 47 324 52 318 48 322 54 324 52 9 53 9 53 324 52 321 51 33 55 323 56 322 54 322 54 323 56 324 52 32 49 318 48 323 56 323 56 318 48 324 52 325 57 328 58 9 53 9 53 328 58 322 54 326 60 328 58 10 59 10 59 328 58 325 57 34 61 327 62 326 60 326 60 327 62 328 58 33 55 322 54 327 62 327 62 322 54 328 58 329 63 332 64 10 59 10 59 332 64 326 60 330 66 332 64 11 65 11 65 332 64 329 63 35 67 331 68 330 66 330 66 331 68 332 64 34 61 326 60 331 68 331 68 326 60 332 64 333 69 336 70 11 65 11 65 336 70 330 66 334 72 336 70 12 71 12 71 336 70 333 69 36 73 335 74 334 72 334 72 335 74 336 70 35 67 330 66 335 74 335 74 330 66 336 70 337 75 340 76 12 71 12 71 340 76 334 72 338 78 340 76 13 77 13 77 340 76 337 75 37 79 339 80 338 78 338 78 339 80 340 76 36 73 334 72 339 80 339 80 334 72 340 76 341 81 344 82 13 77 13 77 344 82 338 78 342 84 344 82 14 83 14 83 344 82 341 81 38 85 343 86 342 84 342 84 343 86 344 82 37 79 338 78 343 86 343 86 338 78 344 82 345 87 348 88 14 83 14 83 348 88 342 84 346 90 348 88 15 89 15 89 348 88 345 87 39 91 347 92 346 90 346 90 347 92 348 88 38 85 342 84 347 92 347 92 342 84 348 88 349 93 352 94 15 89 15 89 352 94 346 90 350 96 352 94 16 95 16 95 352 94 349 93 40 97 351 98 350 96 350 96 351 98 352 94 39 91 346 90 351 98 351 98 346 90 352 94 353 99 356 100 16 95 16 95 356 100 350 96 354 102 356 100 17 101 17 101 356 100 353 99 41 103 355 104 354 102 354 102 355 104 356 100 40 97 350 96 355 104 355 104 350 96 356 100 357 105 360 106 17 101 17 101 360 106 354 102 358 108 360 106 18 107 18 107 360 106 357 105 42 109 359 110 358 108 358 108 359 110 360 106 41 103 354 102 359 110 359 110 354 102 360 106 361 111 364 112 18 107 18 107 364 112 358 108 362 114 364 112 19 113 19 113 364 112 361 111 43 115 363 116 362 114 362 114 363 116 364 112 42 109 358 108 363 116 363 116 358 108 364 112 365 117 368 118 19 113 19 113 368 118 362 114 366 120 368 118 20 119 20 119 368 118 365 117 44 121 367 122 366 120 366 120 367 122 368 118 43 115 362 114 367 122 367 122 362 114 368 118 369 123 372 124 20 119 20 119 372 124 366 120 370 126 372 124 21 125 21 125 372 124 369 123 45 127 371 128 370 126 370 126 371 128 372 124 44 121 366 120 371 128 371 128 366 120 372 124 373 129 376 130 21 125 21 125 376 130 370 126 374 132 376 130 22 131 22 131 376 130 373 129 46 133 375 134 374 132 374 132 375 134 376 130 45 127 370 126 375 134 375 134 370 126 376 130 377 135 380 136 22 131 22 131 380 136 374 132 378 138 380 136 23 137 23 137 380 136 377 135 47 139 379 140 378 138 378 138 379 140 380 136 46 133 374 132 379 140 379 140 374 132 380 136 381 141 383 142 23 137 23 137 383 142 378 138 291 144 383 142 0 143 0 143 383 142 381 145 24 146 382 147 291 148 291 148 382 147 383 142 47 139 378 138 382 149 382 149 378 138 383 142 290 7 387 150 24 8 24 8 387 150 386 151 384 152 387 150 25 6 25 6 387 150 290 7 49 153 385 154 384 152 384 152 385 154 387 150 48 155 386 151 385 154 385 154 386 151 387 150 295 14 390 156 25 6 25 6 390 156 384 152 388 157 390 156 26 13 26 13 390 156 295 14 50 158 389 159 388 157 388 157 389 159 390 156 49 153 384 152 389 159 389 159 384 152 390 156 299 20 393 160 26 13 26 13 393 160 388 157 391 161 393 160 27 19 27 19 393 160 299 20 51 162 392 163 391 161 391 161 392 163 393 160 50 158 388 157 392 163 392 163 388 157 393 160 303 26 396 164 27 19 27 19 396 164 391 161 394 165 396 164 28 25 28 25 396 164 303 26 52 166 395 167 394 165 394 165 395 167 396 164 51 162 391 161 395 167 395 167 391 161 396 164 307 32 399 168 28 25 28 25 399 168 394 165 397 169 399 168 29 31 29 31 399 168 307 32 53 170 398 171 397 169 397 169 398 171 399 168 52 166 394 165 398 171 398 171 394 165 399 168 311 38 402 172 29 31 29 31 402 172 397 169 400 173 402 172 30 37 30 37 402 172 311 38 54 174 401 175 400 173 400 173 401 175 402 172 53 170 397 169 401 175 401 175 397 169 402 172 315 44 405 176 30 37 30 37 405 176 400 173 403 177 405 176 31 43 31 43 405 176 315 44 55 178 404 179 403 177 403 177 404 179 405 176 54 174 400 173 404 179 404 179 400 173 405 176 319 50 408 180 31 43 31 43 408 180 403 177 406 181 408 180 32 49 32 49 408 180 319 50 56 182 407 183 406 181 406 181 407 183 408 180 55 178 403 177 407 183 407 183 403 177 408 180 323 56 411 184 32 49 32 49 411 184 406 181 409 185 411 184 33 55 33 55 411 184 323 56 57 186 410 187 409 185 409 185 410 187 411 184 56 182 406 181 410 187 410 187 406 181 411 184 327 62 414 188 33 55 33 55 414 188 409 185 412 189 414 188 34 61 34 61 414 188 327 62 58 190 413 191 412 189 412 189 413 191 414 188 57 186 409 185 413 191 413 191 409 185 414 188 331 68 417 192 34 61 34 61 417 192 412 189 415 193 417 192 35 67 35 67 417 192 331 68 59 194 416 195 415 193 415 193 416 195 417 192 58 190 412 189 416 195 416 195 412 189 417 192 335 74 420 196 35 67 35 67 420 196 415 193 418 197 420 196 36 73 36 73 420 196 335 74 60 198 419 199 418 197 418 197 419 199 420 196 59 194 415 193 419 199 419 199 415 193 420 196 339 80 423 200 36 73 36 73 423 200 418 197 421 201 423 200 37 79 37 79 423 200 339 80 61 202 422 203 421 201 421 201 422 203 423 200 60 198 418 197 422 203 422 203 418 197 423 200 343 86 426 204 37 79 37 79 426 204 421 201 424 205 426 204 38 85 38 85 426 204 343 86 62 206 425 207 424 205 424 205 425 207 426 204 61 202 421 201 425 207 425 207 421 201 426 204 347 92 429 208 38 85 38 85 429 208 424 205 427 209 429 208 39 91 39 91 429 208 347 92 63 210 428 211 427 209 427 209 428 211 429 208 62 206 424 205 428 211 428 211 424 205 429 208 351 98 432 212 39 91 39 91 432 212 427 209 430 213 432 212 40 97 40 97 432 212 351 98 64 214 431 215 430 213 430 213 431 215 432 212 63 210 427 209 431 215 431 215 427 209 432 212 355 104 435 216 40 97 40 97 435 216 430 213 433 217 435 216 41 103 41 103 435 216 355 104 65 218 434 219 433 217 433 217 434 219 435 216 64 214 430 213 434 219 434 219 430 213 435 216 359 110 438 220 41 103 41 103 438 220 433 217 436 221 438 220 42 109 42 109 438 220 359 110 66 222 437 223 436 221 436 221 437 223 438 220 65 218 433 217 437 223 437 223 433 217 438 220 363 116 441 224 42 109 42 109 441 224 436 221 439 225 441 224 43 115 43 115 441 224 363 116 67 226 440 227 439 225 439 225 440 227 441 224 66 222 436 221 440 227 440 227 436 221 441 224 367 122 444 228 43 115 43 115 444 228 439 225 442 229 444 228 44 121 44 121 444 228 367 122 68 230 443 231 442 229 442 229 443 231 444 228 67 226 439 225 443 231 443 231 439 225 444 228 371 128 447 232 44 121 44 121 447 232 442 229 445 233 447 232 45 127 45 127 447 232 371 128 69 234 446 235 445 233 445 233 446 235 447 232 68 230 442 229 446 235 446 235 442 229 447 232 375 134 450 236 45 127 45 127 450 236 445 233 448 237 450 236 46 133 46 133 450 236 375 134 70 238 449 239 448 237 448 237 449 239 450 236 69 234 445 233 449 239 449 239 445 233 450 236 379 140 453 240 46 133 46 133 453 240 448 237 451 241 453 240 47 139 47 139 453 240 379 140 71 242 452 243 451 241 451 241 452 243 453 240 70 238 448 237 452 243 452 243 448 237 453 240 382 244 455 245 47 139 47 139 455 245 451 241 386 247 455 245 24 246 24 246 455 245 382 248 48 249 454 250 386 251 386 251 454 250 455 245 71 242 451 241 454 252 454 252 451 241 455 245 385 154 459 253 48 155 48 155 459 253 458 254 456 255 459 253 49 153 49 153 459 253 385 154 73 256 457 257 456 255 456 255 457 257 459 253 72 258 458 254 457 257 457 257 458 254 459 253 389 159 462 259 49 153 49 153 462 259 456 255 460 260 462 259 50 158 50 158 462 259 389 159 74 261 461 262 460 260 460 260 461 262 462 259 73 256 456 255 461 262 461 262 456 255 462 259 392 163 465 263 50 158 50 158 465 263 460 260 463 264 465 263 51 162 51 162 465 263 392 163 75 265 464 266 463 264 463 264 464 266 465 263 74 261 460 260 464 266 464 266 460 260 465 263 395 167 468 267 51 162 51 162 468 267 463 264 466 268 468 267 52 166 52 166 468 267 395 167 76 269 467 270 466 268 466 268 467 270 468 267 75 265 463 264 467 270 467 270 463 264 468 267 398 171 471 271 52 166 52 166 471 271 466 268 469 272 471 271 53 170 53 170 471 271 398 171 77 273 470 274 469 272 469 272 470 274 471 271 76 269 466 268 470 274 470 274 466 268 471 271 401 175 474 275 53 170 53 170 474 275 469 272 472 276 474 275 54 174 54 174 474 275 401 175 78 277 473 278 472 276 472 276 473 278 474 275 77 273 469 272 473 278 473 278 469 272 474 275 404 179 477 279 54 174 54 174 477 279 472 276 475 280 477 279 55 178 55 178 477 279 404 179 79 281 476 282 475 280 475 280 476 282 477 279 78 277 472 276 476 282 476 282 472 276 477 279 407 183 480 283 55 178 55 178 480 283 475 280 478 284 480 283 56 182 56 182 480 283 407 183 80 285 479 286 478 284 478 284 479 286 480 283 79 281 475 280 479 286 479 286 475 280 480 283 410 187 483 287 56 182 56 182 483 287 478 284 481 288 483 287 57 186 57 186 483 287 410 187 81 289 482 290 481 288 481 288 482 290 483 287 80 285 478 284 482 290 482 290 478 284 483 287 413 191 486 291 57 186 57 186 486 291 481 288 484 292 486 291 58 190 58 190 486 291 413 191 82 293 485 294 484 292 484 292 485 294 486 291 81 289 481 288 485 294 485 294 481 288 486 291 416 195 489 295 58 190 58 190 489 295 484 292 487 296 489 295 59 194 59 194 489 295 416 195 83 297 488 298 487 296 487 296 488 298 489 295 82 293 484 292 488 298 488 298 484 292 489 295 419 199 492 299 59 194 59 194 492 299 487 296 490 300 492 299 60 198 60 198 492 299 419 199 84 301 491 302 490 300 490 300 491 302 492 299 83 297 487 296 491 302 491 302 487 296 492 299 422 203 495 303 60 198 60 198 495 303 490 300 493 304 495 303 61 202 61 202 495 303 422 203 85 305 494 306 493 304 493 304 494 306 495 303 84 301 490 300 494 306 494 306 490 300 495 303 425 207 498 307 61 202 61 202 498 307 493 304 496 308 498 307 62 206 62 206 498 307 425 207 86 309 497 310 496 308 496 308 497 310 498 307 85 305 493 304 497 310 497 310 493 304 498 307 428 211 501 311 62 206 62 206 501 311 496 308 499 312 501 311 63 210 63 210 501 311 428 211 87 313 500 314 499 312 499 312 500 314 501 311 86 309 496 308 500 314 500 314 496 308 501 311 431 215 504 315 63 210 63 210 504 315 499 312 502 316 504 315 64 214 64 214 504 315 431 215 88 317 503 318 502 316 502 316 503 318 504 315 87 313 499 312 503 318 503 318 499 312 504 315 434 219 507 319 64 214 64 214 507 319 502 316 505 320 507 319 65 218 65 218 507 319 434 219 89 321 506 322 505 320 505 320 506 322 507 319 88 317 502 316 506 322 506 322 502 316 507 319 437 223 510 323 65 218 65 218 510 323 505 320 508 324 510 323 66 222 66 222 510 323 437 223 90 325 509 326 508 324 508 324 509 326 510 323 89 321 505 320 509 326 509 326 505 320 510 323 440 227 513 327 66 222 66 222 513 327 508 324 511 328 513 327 67 226 67 226 513 327 440 227 91 329 512 330 511 328 511 328 512 330 513 327 90 325 508 324 512 330 512 330 508 324 513 327 443 231 516 331 67 226 67 226 516 331 511 328 514 332 516 331 68 230 68 230 516 331 443 231 92 333 515 334 514 332 514 332 515 334 516 331 91 329 511 328 515 334 515 334 511 328 516 331 446 235 519 335 68 230 68 230 519 335 514 332 517 336 519 335 69 234 69 234 519 335 446 235 93 337 518 338 517 336 517 336 518 338 519 335 92 333 514 332 518 338 518 338 514 332 519 335 449 239 522 339 69 234 69 234 522 339 517 336 520 340 522 339 70 238 70 238 522 339 449 239 94 341 521 342 520 340 520 340 521 342 522 339 93 337 517 336 521 342 521 342 517 336 522 339 452 243 525 343 70 238 70 238 525 343 520 340 523 344 525 343 71 242 71 242 525 343 452 243 95 345 524 346 523 344 523 344 524 346 525 343 94 341 520 340 524 346 524 346 520 340 525 343 454 347 527 348 71 242 71 242 527 348 523 344 458 350 527 348 48 349 48 349 527 348 454 351 72 352 526 353 458 354 458 354 526 353 527 348 95 345 523 344 526 355 526 355 523 344 527 348 457 257 531 356 72 258 72 258 531 356 530 357 528 358 531 356 73 256 73 256 531 356 457 257 97 359 529 360 528 358 528 358 529 360 531 356 96 361 530 357 529 360 529 360 530 357 531 356 461 262 534 362 73 256 73 256 534 362 528 358 532 363 534 362 74 261 74 261 534 362 461 262 98 364 533 365 532 363 532 363 533 365 534 362 97 359 528 358 533 365 533 365 528 358 534 362 464 266 537 366 74 261 74 261 537 366 532 363 535 367 537 366 75 265 75 265 537 366 464 266 99 368 536 369 535 367 535 367 536 369 537 366 98 364 532 363 536 369 536 369 532 363 537 366 467 270 540 370 75 265 75 265 540 370 535 367 538 371 540 370 76 269 76 269 540 370 467 270 100 372 539 373 538 371 538 371 539 373 540 370 99 368 535 367 539 373 539 373 535 367 540 370 470 274 543 374 76 269 76 269 543 374 538 371 541 375 543 374 77 273 77 273 543 374 470 274 101 376 542 377 541 375 541 375 542 377 543 374 100 372 538 371 542 377 542 377 538 371 543 374 473 278 546 378 77 273 77 273 546 378 541 375 544 379 546 378 78 277 78 277 546 378 473 278 102 380 545 381 544 379 544 379 545 381 546 378 101 376 541 375 545 381 545 381 541 375 546 378 476 282 549 382 78 277 78 277 549 382 544 379 547 383 549 382 79 281 79 281 549 382 476 282 103 384 548 385 547 383 547 383 548 385 549 382 102 380 544 379 548 385 548 385 544 379 549 382 479 286 552 386 79 281 79 281 552 386 547 383 550 387 552 386 80 285 80 285 552 386 479 286 104 388 551 389 550 387 550 387 551 389 552 386 103 384 547 383 551 389 551 389 547 383 552 386 482 290 555 390 80 285 80 285 555 390 550 387 553 391 555 390 81 289 81 289 555 390 482 290 105 392 554 393 553 391 553 391 554 393 555 390 104 388 550 387 554 393 554 393 550 387 555 390 485 294 558 394 81 289 81 289 558 394 553 391 556 395 558 394 82 293 82 293 558 394 485 294 106 396 557 397 556 395 556 395 557 397 558 394 105 392 553 391 557 397 557 397 553 391 558 394 488 298 561 398 82 293 82 293 561 398 556 395 559 399 561 398 83 297 83 297 561 398 488 298 107 400 560 401 559 399 559 399 560 401 561 398 106 396 556 395 560 401 560 401 556 395 561 398 491 302 564 402 83 297 83 297 564 402 559 399 562 403 564 402 84 301 84 301 564 402 491 302 108 404 563 405 562 403 562 403 563 405 564 402 107 400 559 399 563 405 563 405 559 399 564 402 494 306 567 406 84 301 84 301 567 406 562 403 565 407 567 406 85 305 85 305 567 406 494 306 109 408 566 409 565 407 565 407 566 409 567 406 108 404 562 403 566 409 566 409 562 403 567 406 497 310 570 410 85 305 85 305 570 410 565 407 568 411 570 410 86 309 86 309 570 410 497 310 110 412 569 413 568 411 568 411 569 413 570 410 109 408 565 407 569 413 569 413 565 407 570 410 500 314 573 414 86 309 86 309 573 414 568 411 571 415 573 414 87 313 87 313 573 414 500 314 111 416 572 417 571 415 571 415 572 417 573 414 110 412 568 411 572 417 572 417 568 411 573 414 503 318 576 418 87 313 87 313 576 418 571 415 574 419 576 418 88 317 88 317 576 418 503 318 112 420 575 421 574 419 574 419 575 421 576 418 111 416 571 415 575 421 575 421 571 415 576 418 506 322 579 422 88 317 88 317 579 422 574 419 577 423 579 422 89 321 89 321 579 422 506 322 113 424 578 425 577 423 577 423 578 425 579 422 112 420 574 419 578 425 578 425 574 419 579 422 509 326 582 426 89 321 89 321 582 426 577 423 580 427 582 426 90 325 90 325 582 426 509 326 114 428 581 429 580 427 580 427 581 429 582 426 113 424 577 423 581 429 581 429 577 423 582 426 512 330 585 430 90 325 90 325 585 430 580 427 583 431 585 430 91 329 91 329 585 430 512 330 115 432 584 433 583 431 583 431 584 433 585 430 114 428 580 427 584 433 584 433 580 427 585 430 515 334 588 434 91 329 91 329 588 434 583 431 586 435 588 434 92 333 92 333 588 434 515 334 116 436 587 437 586 435 586 435 587 437 588 434 115 432 583 431 587 437 587 437 583 431 588 434 518 338 591 438 92 333 92 333 591 438 586 435 589 439 591 438 93 337 93 337 591 438 518 338 117 440 590 441 589 439 589 439 590 441 591 438 116 436 586 435 590 441 590 441 586 435 591 438 521 342 594 442 93 337 93 337 594 442 589 439 592 443 594 442 94 341 94 341 594 442 521 342 118 444 593 445 592 443 592 443 593 445 594 442 117 440 589 439 593 445 593 445 589 439 594 442 524 346 597 446 94 341 94 341 597 446 592 443 595 447 597 446 95 345 95 345 597 446 524 346 119 448 596 449 595 447 595 447 596 449 597 446 118 444 592 443 596 449 596 449 592 443 597 446 526 450 599 451 95 345 95 345 599 451 595 447 530 453 599 451 72 452 72 452 599 451 526 454 96 455 598 456 530 457 530 457 598 456 599 451 119 448 595 447 598 458 598 458 595 447 599 451 529 360 603 459 96 361 96 361 603 459 602 460 600 461 603 459 97 359 97 359 603 459 529 360 121 462 601 463 600 461 600 461 601 463 603 459 120 464 602 460 601 463 601 463 602 460 603 459 533 365 606 465 97 359 97 359 606 465 600 461 604 466 606 465 98 364 98 364 606 465 533 365 122 467 605 468 604 466 604 466 605 468 606 465 121 462 600 461 605 468 605 468 600 461 606 465 536 369 609 469 98 364 98 364 609 469 604 466 607 470 609 469 99 368 99 368 609 469 536 369 123 471 608 472 607 470 607 470 608 472 609 469 122 467 604 466 608 472 608 472 604 466 609 469 539 373 612 473 99 368 99 368 612 473 607 470 610 474 612 473 100 372 100 372 612 473 539 373 124 475 611 476 610 474 610 474 611 476 612 473 123 471 607 470 611 476 611 476 607 470 612 473 542 377 615 477 100 372 100 372 615 477 610 474 613 478 615 477 101 376 101 376 615 477 542 377 125 479 614 480 613 478 613 478 614 480 615 477 124 475 610 474 614 480 614 480 610 474 615 477 545 381 618 481 101 376 101 376 618 481 613 478 616 482 618 481 102 380 102 380 618 481 545 381 126 483 617 484 616 482 616 482 617 484 618 481 125 479 613 478 617 484 617 484 613 478 618 481 548 385 621 485 102 380 102 380 621 485 616 482 619 486 621 485 103 384 103 384 621 485 548 385 127 487 620 488 619 486 619 486 620 488 621 485 126 483 616 482 620 488 620 488 616 482 621 485 551 389 624 489 103 384 103 384 624 489 619 486 622 490 624 489 104 388 104 388 624 489 551 389 128 491 623 492 622 490 622 490 623 492 624 489 127 487 619 486 623 492 623 492 619 486 624 489 554 393 627 493 104 388 104 388 627 493 622 490 625 494 627 493 105 392 105 392 627 493 554 393 129 495 626 496 625 494 625 494 626 496 627 493 128 491 622 490 626 496 626 496 622 490 627 493 557 397 630 497 105 392 105 392 630 497 625 494 628 498 630 497 106 396 106 396 630 497 557 397 130 499 629 500 628 498 628 498 629 500 630 497 129 495 625 494 629 500 629 500 625 494 630 497 560 401 633 501 106 396 106 396 633 501 628 498 631 502 633 501 107 400 107 400 633 501 560 401 131 503 632 504 631 502 631 502 632 504 633 501 130 499 628 498 632 504 632 504 628 498 633 501 563 405 636 505 107 400 107 400 636 505 631 502 634 506 636 505 108 404 108 404 636 505 563 405 132 507 635 508 634 506 634 506 635 508 636 505 131 503 631 502 635 508 635 508 631 502 636 505 566 409 639 509 108 404 108 404 639 509 634 506 637 510 639 509 109 408 109 408 639 509 566 409 133 511 638 512 637 510 637 510 638 512 639 509 132 507 634 506 638 512 638 512 634 506 639 509 569 413 642 513 109 408 109 408 642 513 637 510 640 514 642 513 110 412 110 412 642 513 569 413 134 515 641 516 640 514 640 514 641 516 642 513 133 511 637 510 641 516 641 516 637 510 642 513 572 417 645 517 110 412 110 412 645 517 640 514 643 518 645 517 111 416 111 416 645 517 572 417 135 519 644 520 643 518 643 518 644 520 645 517 134 515 640 514 644 520 644 520 640 514 645 517 575 421 648 521 111 416 111 416 648 521 643 518 646 522 648 521 112 420 112 420 648 521 575 421 136 523 647 524 646 522 646 522 647 524 648 521 135 519 643 518 647 524 647 524 643 518 648 521 578 425 651 525 112 420 112 420 651 525 646 522 649 526 651 525 113 424 113 424 651 525 578 425 137 527 650 528 649 526 649 526 650 528 651 525 136 523 646 522 650 528 650 528 646 522 651 525 581 429 654 529 113 424 113 424 654 529 649 526 652 530 654 529 114 428 114 428 654 529 581 429 138 531 653 532 652 530 652 530 653 532 654 529 137 527 649 526 653 532 653 532 649 526 654 529 584 433 657 533 114 428 114 428 657 533 652 530 655 534 657 533 115 432 115 432 657 533 584 433 139 535 656 536 655 534 655 534 656 536 657 533 138 531 652 530 656 536 656 536 652 530 657 533 587 437 660 537 115 432 115 432 660 537 655 534 658 538 660 537 116 436 116 436 660 537 587 437 140 539 659 540 658 538 658 538 659 540 660 537 139 535 655 534 659 540 659 540 655 534 660 537 590 441 663 541 116 436 116 436 663 541 658 538 661 542 663 541 117 440 117 440 663 541 590 441 141 543 662 544 661 542 661 542 662 544 663 541 140 539 658 538 662 544 662 544 658 538 663 541 593 445 666 545 117 440 117 440 666 545 661 542 664 546 666 545 118 444 118 444 666 545 593 445 142 547 665 548 664 546 664 546 665 548 666 545 141 543 661 542 665 548 665 548 661 542 666 545 596 449 669 549 118 444 118 444 669 549 664 546 667 550 669 549 119 448 119 448 669 549 596 449 143 551 668 552 667 550 667 550 668 552 669 549 142 547 664 546 668 552 668 552 664 546 669 549 598 553 671 554 119 448 119 448 671 554 667 550 602 556 671 554 96 555 96 555 671 554 598 557 120 558 670 559 602 560 602 560 670 559 671 554 143 551 667 550 670 561 670 561 667 550 671 554 601 463 675 562 120 464 120 464 675 562 674 563 672 564 675 562 121 462 121 462 675 562 601 463 145 565 673 566 672 564 672 564 673 566 675 562 144 567 674 563 673 566 673 566 674 563 675 562 605 468 678 568 121 462 121 462 678 568 672 564 676 569 678 568 122 467 122 467 678 568 605 468 146 570 677 571 676 569 676 569 677 571 678 568 145 565 672 564 677 571 677 571 672 564 678 568 608 472 681 572 122 467 122 467 681 572 676 569 679 573 681 572 123 471 123 471 681 572 608 472 147 574 680 575 679 573 679 573 680 575 681 572 146 570 676 569 680 575 680 575 676 569 681 572 611 476 684 576 123 471 123 471 684 576 679 573 682 577 684 576 124 475 124 475 684 576 611 476 148 578 683 579 682 577 682 577 683 579 684 576 147 574 679 573 683 579 683 579 679 573 684 576 614 480 687 580 124 475 124 475 687 580 682 577 685 581 687 580 125 479 125 479 687 580 614 480 149 582 686 583 685 581 685 581 686 583 687 580 148 578 682 577 686 583 686 583 682 577 687 580 617 484 690 584 125 479 125 479 690 584 685 581 688 585 690 584 126 483 126 483 690 584 617 484 150 586 689 587 688 585 688 585 689 587 690 584 149 582 685 581 689 587 689 587 685 581 690 584 620 488 693 588 126 483 126 483 693 588 688 585 691 589 693 588 127 487 127 487 693 588 620 488 151 590 692 591 691 589 691 589 692 591 693 588 150 586 688 585 692 591 692 591 688 585 693 588 623 492 696 592 127 487 127 487 696 592 691 589 694 593 696 592 128 491 128 491 696 592 623 492 152 594 695 595 694 593 694 593 695 595 696 592 151 590 691 589 695 595 695 595 691 589 696 592 626 496 699 596 128 491 128 491 699 596 694 593 697 597 699 596 129 495 129 495 699 596 626 496 153 598 698 599 697 597 697 597 698 599 699 596 152 594 694 593 698 599 698 599 694 593 699 596 629 500 702 600 129 495 129 495 702 600 697 597 700 601 702 600 130 499 130 499 702 600 629 500 154 602 701 603 700 601 700 601 701 603 702 600 153 598 697 597 701 603 701 603 697 597 702 600 632 504 705 604 130 499 130 499 705 604 700 601 703 605 705 604 131 503 131 503 705 604 632 504 155 606 704 607 703 605 703 605 704 607 705 604 154 602 700 601 704 607 704 607 700 601 705 604 635 508 708 608 131 503 131 503 708 608 703 605 706 609 708 608 132 507 132 507 708 608 635 508 156 610 707 611 706 609 706 609 707 611 708 608 155 606 703 605 707 611 707 611 703 605 708 608 638 512 711 612 132 507 132 507 711 612 706 609 709 613 711 612 133 511 133 511 711 612 638 512 157 614 710 615 709 613 709 613 710 615 711 612 156 610 706 609 710 615 710 615 706 609 711 612 641 516 714 616 133 511 133 511 714 616 709 613 712 617 714 616 134 515 134 515 714 616 641 516 158 618 713 619 712 617 712 617 713 619 714 616 157 614 709 613 713 619 713 619 709 613 714 616 644 520 717 620 134 515 134 515 717 620 712 617 715 621 717 620 135 519 135 519 717 620 644 520 159 622 716 623 715 621 715 621 716 623 717 620 158 618 712 617 716 623 716 623 712 617 717 620 647 524 720 624 135 519 135 519 720 624 715 621 718 625 720 624 136 523 136 523 720 624 647 524 160 626 719 627 718 625 718 625 719 627 720 624 159 622 715 621 719 627 719 627 715 621 720 624 650 528 723 628 136 523 136 523 723 628 718 625 721 629 723 628 137 527 137 527 723 628 650 528 161 630 722 631 721 629 721 629 722 631 723 628 160 626 718 625 722 631 722 631 718 625 723 628 653 532 726 632 137 527 137 527 726 632 721 629 724 633 726 632 138 531 138 531 726 632 653 532 162 634 725 635 724 633 724 633 725 635 726 632 161 630 721 629 725 635 725 635 721 629 726 632 656 536 729 636 138 531 138 531 729 636 724 633 727 637 729 636 139 535 139 535 729 636 656 536 163 638 728 639 727 637 727 637 728 639 729 636 162 634 724 633 728 639 728 639 724 633 729 636 659 540 732 640 139 535 139 535 732 640 727 637 730 641 732 640 140 539 140 539 732 640 659 540 164 642 731 643 730 641 730 641 731 643 732 640 163 638 727 637 731 643 731 643 727 637 732 640 662 544 735 644 140 539 140 539 735 644 730 641 733 645 735 644 141 543 141 543 735 644 662 544 165 646 734 647 733 645 733 645 734 647 735 644 164 642 730 641 734 647 734 647 730 641 735 644 665 548 738 648 141 543 141 543 738 648 733 645 736 649 738 648 142 547 142 547 738 648 665 548 166 650 737 651 736 649 736 649 737 651 738 648 165 646 733 645 737 651 737 651 733 645 738 648 668 552 741 652 142 547 142 547 741 652 736 649 739 653 741 652 143 551 143 551 741 652 668 552 167 654 740 655 739 653 739 653 740 655 741 652 166 650 736 649 740 655 740 655 736 649 741 652 670 656 743 657 143 551 143 551 743 657 739 653 674 659 743 657 120 658 120 658 743 657 670 660 144 661 742 662 674 663 674 663 742 662 743 657 167 654 739 653 742 664 742 664 739 653 743 657 144 567 673 566 746 666 746 666 673 566 747 665 145 565 744 667 673 566 673 566 744 667 747 665 745 669 747 665 169 668 169 668 747 665 744 667 746 666 747 665 168 670 168 670 747 665 745 669 145 565 677 571 744 667 744 667 677 571 750 671 146 570 748 672 677 571 677 571 748 672 750 671 749 674 750 671 170 673 170 673 750 671 748 672 744 667 750 671 169 668 169 668 750 671 749 674 146 570 680 575 748 672 748 672 680 575 753 675 147 574 751 676 680 575 680 575 751 676 753 675 752 678 753 675 171 677 171 677 753 675 751 676 748 672 753 675 170 673 170 673 753 675 752 678 147 574 683 579 751 676 751 676 683 579 756 679 148 578 754 680 683 579 683 579 754 680 756 679 755 682 756 679 172 681 172 681 756 679 754 680 751 676 756 679 171 677 171 677 756 679 755 682 148 578 686 583 754 680 754 680 686 583 759 683 149 582 757 684 686 583 686 583 757 684 759 683 758 686 759 683 173 685 173 685 759 683 757 684 754 680 759 683 172 681 172 681 759 683 758 686 149 582 689 587 757 684 757 684 689 587 762 687 150 586 760 688 689 587 689 587 760 688 762 687 761 690 762 687 174 689 174 689 762 687 760 688 757 684 762 687 173 685 173 685 762 687 761 690 150 586 692 591 760 688 760 688 692 591 765 691 151 590 763 692 692 591 692 591 763 692 765 691 764 694 765 691 175 693 175 693 765 691 763 692 760 688 765 691 174 689 174 689 765 691 764 694 151 590 695 595 763 692 763 692 695 595 768 695 152 594 766 696 695 595 695 595 766 696 768 695 767 698 768 695 176 697 176 697 768 695 766 696 763 692 768 695 175 693 175 693 768 695 767 698 152 594 698 599 766 696 766 696 698 599 771 699 153 598 769 700 698 599 698 599 769 700 771 699 770 702 771 699 177 701 177 701 771 699 769 700 766 696 771 699 176 697 176 697 771 699 770 702 153 598 701 603 769 700 769 700 701 603 774 703 154 602 772 704 701 603 701 603 772 704 774 703 773 706 774 703 178 705 178 705 774 703 772 704 769 700 774 703 177 701 177 701 774 703 773 706 154 602 704 607 772 704 772 704 704 607 777 707 155 606 775 708 704 607 704 607 775 708 777 707 776 710 777 707 179 709 179 709 777 707 775 708 772 704 777 707 178 705 178 705 777 707 776 710 155 606 707 611 775 708 775 708 707 611 780 711 156 610 778 712 707 611 707 611 778 712 780 711 779 714 780 711 180 713 180 713 780 711 778 712 775 708 780 711 179 709 179 709 780 711 779 714 156 610 710 615 778 712 778 712 710 615 783 715 157 614 781 716 710 615 710 615 781 716 783 715 782 718 783 715 181 717 181 717 783 715 781 716 778 712 783 715 180 713 180 713 783 715 782 718 157 614 713 619 781 716 781 716 713 619 786 719 158 618 784 720 713 619 713 619 784 720 786 719 785 722 786 719 182 721 182 721 786 719 784 720 781 716 786 719 181 717 181 717 786 719 785 722 158 618 716 623 784 720 784 720 716 623 789 723 159 622 787 724 716 623 716 623 787 724 789 723 788 726 789 723 183 725 183 725 789 723 787 724 784 720 789 723 182 721 182 721 789 723 788 726 159 622 719 627 787 724 787 724 719 627 792 727 160 626 790 728 719 627 719 627 790 728 792 727 791 730 792 727 184 729 184 729 792 727 790 728 787 724 792 727 183 725 183 725 792 727 791 730 160 626 722 631 790 728 790 728 722 631 795 731 161 630 793 732 722 631 722 631 793 732 795 731 794 734 795 731 185 733 185 733 795 731 793 732 790 728 795 731 184 729 184 729 795 731 794 734 161 630 725 635 793 732 793 732 725 635 798 735 162 634 796 736 725 635 725 635 796 736 798 735 797 738 798 735 186 737 186 737 798 735 796 736 793 732 798 735 185 733 185 733 798 735 797 738 162 634 728 639 796 736 796 736 728 639 801 739 163 638 799 740 728 639 728 639 799 740 801 739 800 742 801 739 187 741 187 741 801 739 799 740 796 736 801 739 186 737 186 737 801 739 800 742 163 638 731 643 799 740 799 740 731 643 804 743 164 642 802 744 731 643 731 643 802 744 804 743 803 746 804 743 188 745 188 745 804 743 802 744 799 740 804 743 187 741 187 741 804 743 803 746 164 642 734 647 802 744 802 744 734 647 807 747 165 646 805 748 734 647 734 647 805 748 807 747 806 750 807 747 189 749 189 749 807 747 805 748 802 744 807 747 188 745 188 745 807 747 806 750 165 646 737 651 805 748 805 748 737 651 810 751 166 650 808 752 737 651 737 651 808 752 810 751 809 754 810 751 190 753 190 753 810 751 808 752 805 748 810 751 189 749 189 749 810 751 809 754 166 650 740 655 808 752 808 752 740 655 813 755 167 654 811 756 740 655 740 655 811 756 813 755 812 758 813 755 191 757 191 757 813 755 811 756 808 752 813 755 190 753 190 753 813 755 812 758 167 654 742 759 811 756 811 756 742 759 815 760 144 761 746 762 742 763 742 763 746 762 815 760 814 765 815 760 168 764 168 764 815 760 746 766 811 756 815 760 191 757 191 757 815 760 814 767 168 670 745 669 818 769 818 769 745 669 819 768 169 668 816 770 745 669 745 669 816 770 819 768 817 772 819 768 193 771 193 771 819 768 816 770 818 769 819 768 192 773 192 773 819 768 817 772 169 668 749 674 816 770 816 770 749 674 822 774 170 673 820 775 749 674 749 674 820 775 822 774 821 777 822 774 194 776 194 776 822 774 820 775 816 770 822 774 193 771 193 771 822 774 821 777 170 673 752 678 820 775 820 775 752 678 825 778 171 677 823 779 752 678 752 678 823 779 825 778 824 781 825 778 195 780 195 780 825 778 823 779 820 775 825 778 194 776 194 776 825 778 824 781 171 677 755 682 823 779 823 779 755 682 828 782 172 681 826 783 755 682 755 682 826 783 828 782 827 785 828 782 196 784 196 784 828 782 826 783 823 779 828 782 195 780 195 780 828 782 827 785 172 681 758 686 826 783 826 783 758 686 831 786 173 685 829 787 758 686 758 686 829 787 831 786 830 789 831 786 197 788 197 788 831 786 829 787 826 783 831 786 196 784 196 784 831 786 830 789 173 685 761 690 829 787 829 787 761 690 834 790 174 689 832 791 761 690 761 690 832 791 834 790 833 793 834 790 198 792 198 792 834 790 832 791 829 787 834 790 197 788 197 788 834 790 833 793 174 689 764 694 832 791 832 791 764 694 837 794 175 693 835 795 764 694 764 694 835 795 837 794 836 797 837 794 199 796 199 796 837 794 835 795 832 791 837 794 198 792 198 792 837 794 836 797 175 693 767 698 835 795 835 795 767 698 840 798 176 697 838 799 767 698 767 698 838 799 840 798 839 801 840 798 200 800 200 800 840 798 838 799 835 795 840 798 199 796 199 796 840 798 839 801 176 697 770 702 838 799 838 799 770 702 843 802 177 701 841 803 770 702 770 702 841 803 843 802 842 805 843 802 201 804 201 804 843 802 841 803 838 799 843 802 200 800 200 800 843 802 842 805 177 701 773 706 841 803 841 803 773 706 846 806 178 705 844 807 773 706 773 706 844 807 846 806 845 809 846 806 202 808 202 808 846 806 844 807 841 803 846 806 201 804 201 804 846 806 845 809 178 705 776 710 844 807 844 807 776 710 849 810 179 709 847 811 776 710 776 710 847 811 849 810 848 813 849 810 203 812 203 812 849 810 847 811 844 807 849 810 202 808 202 808 849 810 848 813 179 709 779 714 847 811 847 811 779 714 852 814 180 713 850 815 779 714 779 714 850 815 852 814 851 817 852 814 204 816 204 816 852 814 850 815 847 811 852 814 203 812 203 812 852 814 851 817 180 713 782 718 850 815 850 815 782 718 855 818 181 717 853 819 782 718 782 718 853 819 855 818 854 821 855 818 205 820 205 820 855 818 853 819 850 815 855 818 204 816 204 816 855 818 854 821 181 717 785 722 853 819 853 819 785 722 858 822 182 721 856 823 785 722 785 722 856 823 858 822 857 825 858 822 206 824 206 824 858 822 856 823 853 819 858 822 205 820 205 820 858 822 857 825 182 721 788 726 856 823 856 823 788 726 861 826 183 725 859 827 788 726 788 726 859 827 861 826 860 829 861 826 207 828 207 828 861 826 859 827 856 823 861 826 206 824 206 824 861 826 860 829 183 725 791 730 859 827 859 827 791 730 864 830 184 729 862 831 791 730 791 730 862 831 864 830 863 833 864 830 208 832 208 832 864 830 862 831 859 827 864 830 207 828 207 828 864 830 863 833 184 729 794 734 862 831 862 831 794 734 867 834 185 733 865 835 794 734 794 734 865 835 867 834 866 837 867 834 209 836 209 836 867 834 865 835 862 831 867 834 208 832 208 832 867 834 866 837 185 733 797 738 865 835 865 835 797 738 870 838 186 737 868 839 797 738 797 738 868 839 870 838 869 841 870 838 210 840 210 840 870 838 868 839 865 835 870 838 209 836 209 836 870 838 869 841 186 737 800 742 868 839 868 839 800 742 873 842 187 741 871 843 800 742 800 742 871 843 873 842 872 845 873 842 211 844 211 844 873 842 871 843 868 839 873 842 210 840 210 840 873 842 872 845 187 741 803 746 871 843 871 843 803 746 876 846 188 745 874 847 803 746 803 746 874 847 876 846 875 849 876 846 212 848 212 848 876 846 874 847 871 843 876 846 211 844 211 844 876 846 875 849 188 745 806 750 874 847 874 847 806 750 879 850 189 749 877 851 806 750 806 750 877 851 879 850 878 853 879 850 213 852 213 852 879 850 877 851 874 847 879 850 212 848 212 848 879 850 878 853 189 749 809 754 877 851 877 851 809 754 882 854 190 753 880 855 809 754 809 754 880 855 882 854 881 857 882 854 214 856 214 856 882 854 880 855 877 851 882 854 213 852 213 852 882 854 881 857 190 753 812 758 880 855 880 855 812 758 885 858 191 757 883 859 812 758 812 758 883 859 885 858 884 861 885 858 215 860 215 860 885 858 883 859 880 855 885 858 214 856 214 856 885 858 884 861 191 757 814 862 883 859 883 859 814 862 887 863 168 864 818 865 814 866 814 866 818 865 887 863 886 868 887 863 192 867 192 867 887 863 818 869 883 859 887 863 215 860 215 860 887 863 886 870 192 773 817 772 890 872 890 872 817 772 891 871 193 771 888 873 817 772 817 772 888 873 891 871 889 875 891 871 217 874 217 874 891 871 888 873 890 872 891 871 216 876 216 876 891 871 889 875 193 771 821 777 888 873 888 873 821 777 894 877 194 776 892 878 821 777 821 777 892 878 894 877 893 880 894 877 218 879 218 879 894 877 892 878 888 873 894 877 217 874 217 874 894 877 893 880 194 776 824 781 892 878 892 878 824 781 897 881 195 780 895 882 824 781 824 781 895 882 897 881 896 884 897 881 219 883 219 883 897 881 895 882 892 878 897 881 218 879 218 879 897 881 896 884 195 780 827 785 895 882 895 882 827 785 900 885 196 784 898 886 827 785 827 785 898 886 900 885 899 888 900 885 220 887 220 887 900 885 898 886 895 882 900 885 219 883 219 883 900 885 899 888 196 784 830 789 898 886 898 886 830 789 903 889 197 788 901 890 830 789 830 789 901 890 903 889 902 892 903 889 221 891 221 891 903 889 901 890 898 886 903 889 220 887 220 887 903 889 902 892 197 788 833 793 901 890 901 890 833 793 906 893 198 792 904 894 833 793 833 793 904 894 906 893 905 896 906 893 222 895 222 895 906 893 904 894 901 890 906 893 221 891 221 891 906 893 905 896 198 792 836 797 904 894 904 894 836 797 909 897 199 796 907 898 836 797 836 797 907 898 909 897 908 900 909 897 223 899 223 899 909 897 907 898 904 894 909 897 222 895 222 895 909 897 908 900 199 796 839 801 907 898 907 898 839 801 912 901 200 800 910 902 839 801 839 801 910 902 912 901 911 904 912 901 224 903 224 903 912 901 910 902 907 898 912 901 223 899 223 899 912 901 911 904 200 800 842 805 910 902 910 902 842 805 915 905 201 804 913 906 842 805 842 805 913 906 915 905 914 908 915 905 225 907 225 907 915 905 913 906 910 902 915 905 224 903 224 903 915 905 914 908 201 804 845 809 913 906 913 906 845 809 918 909 202 808 916 910 845 809 845 809 916 910 918 909 917 912 918 909 226 911 226 911 918 909 916 910 913 906 918 909 225 907 225 907 918 909 917 912 202 808 848 813 916 910 916 910 848 813 921 913 203 812 919 914 848 813 848 813 919 914 921 913 920 916 921 913 227 915 227 915 921 913 919 914 916 910 921 913 226 911 226 911 921 913 920 916 203 812 851 817 919 914 919 914 851 817 924 917 204 816 922 918 851 817 851 817 922 918 924 917 923 920 924 917 228 919 228 919 924 917 922 918 919 914 924 917 227 915 227 915 924 917 923 920 204 816 854 821 922 918 922 918 854 821 927 921 205 820 925 922 854 821 854 821 925 922 927 921 926 924 927 921 229 923 229 923 927 921 925 922 922 918 927 921 228 919 228 919 927 921 926 924 205 820 857 825 925 922 925 922 857 825 930 925 206 824 928 926 857 825 857 825 928 926 930 925 929 928 930 925 230 927 230 927 930 925 928 926 925 922 930 925 229 923 229 923 930 925 929 928 206 824 860 829 928 926 928 926 860 829 933 929 207 828 931 930 860 829 860 829 931 930 933 929 932 932 933 929 231 931 231 931 933 929 931 930 928 926 933 929 230 927 230 927 933 929 932 932 207 828 863 833 931 930 931 930 863 833 936 933 208 832 934 934 863 833 863 833 934 934 936 933 935 936 936 933 232 935 232 935 936 933 934 934 931 930 936 933 231 931 231 931 936 933 935 936 208 832 866 837 934 934 934 934 866 837 939 937 209 836 937 938 866 837 866 837 937 938 939 937 938 940 939 937 233 939 233 939 939 937 937 938 934 934 939 937 232 935 232 935 939 937 938 940 209 836 869 841 937 938 937 938 869 841 942 941 210 840 940 942 869 841 869 841 940 942 942 941 941 944 942 941 234 943 234 943 942 941 940 942 937 938 942 941 233 939 233 939 942 941 941 944 210 840 872 845 940 942 940 942 872 845 945 945 211 844 943 946 872 845 872 845 943 946 945 945 944 948 945 945 235 947 235 947 945 945 943 946 940 942 945 945 234 943 234 943 945 945 944 948 211 844 875 849 943 946 943 946 875 849 948 949 212 848 946 950 875 849 875 849 946 950 948 949 947 952 948 949 236 951 236 951 948 949 946 950 943 946 948 949 235 947 235 947 948 949 947 952 212 848 878 853 946 950 946 950 878 853 951 953 213 852 949 954 878 853 878 853 949 954 951 953 950 956 951 953 237 955 237 955 951 953 949 954 946 950 951 953 236 951 236 951 951 953 950 956 213 852 881 857 949 954 949 954 881 857 954 957 214 856 952 958 881 857 881 857 952 958 954 957 953 960 954 957 238 959 238 959 954 957 952 958 949 954 954 957 237 955 237 955 954 957 953 960 214 856 884 861 952 958 952 958 884 861 957 961 215 860 955 962 884 861 884 861 955 962 957 961 956 964 957 961 239 963 239 963 957 961 955 962 952 958 957 961 238 959 238 959 957 961 956 964 215 860 886 965 955 962 955 962 886 965 959 966 192 967 890 968 886 969 886 969 890 968 959 966 958 971 959 966 216 970 216 970 959 966 890 972 955 962 959 966 239 963 239 963 959 966 958 973 216 876 889 875 962 975 962 975 889 875 963 974 217 874 960 976 889 875 889 875 960 976 963 974 961 978 963 974 241 977 241 977 963 974 960 976 962 975 963 974 240 979 240 979 963 974 961 978 217 874 893 880 960 976 960 976 893 880 966 980 218 879 964 981 893 880 893 880 964 981 966 980 965 983 966 980 242 982 242 982 966 980 964 981 960 976 966 980 241 977 241 977 966 980 965 983 218 879 896 884 964 981 964 981 896 884 969 984 219 883 967 985 896 884 896 884 967 985 969 984 968 987 969 984 243 986 243 986 969 984 967 985 964 981 969 984 242 982 242 982 969 984 968 987 219 883 899 888 967 985 967 985 899 888 972 988 220 887 970 989 899 888 899 888 970 989 972 988 971 991 972 988 244 990 244 990 972 988 970 989 967 985 972 988 243 986 243 986 972 988 971 991 220 887 902 892 970 989 970 989 902 892 975 992 221 891 973 993 902 892 902 892 973 993 975 992 974 995 975 992 245 994 245 994 975 992 973 993 970 989 975 992 244 990 244 990 975 992 974 995 221 891 905 896 973 993 973 993 905 896 978 996 222 895 976 997 905 896 905 896 976 997 978 996 977 999 978 996 246 998 246 998 978 996 976 997 973 993 978 996 245 994 245 994 978 996 977 999 222 895 908 900 976 997 976 997 908 900 981 1000 223 899 979 1001 908 900 908 900 979 1001 981 1000 980 1003 981 1000 247 1002 247 1002 981 1000 979 1001 976 997 981 1000 246 998 246 998 981 1000 980 1003 223 899 911 904 979 1001 979 1001 911 904 984 1004 224 903 982 1005 911 904 911 904 982 1005 984 1004 983 1007 984 1004 248 1006 248 1006 984 1004 982 1005 979 1001 984 1004 247 1002 247 1002 984 1004 983 1007 224 903 914 908 982 1005 982 1005 914 908 987 1008 225 907 985 1009 914 908 914 908 985 1009 987 1008 986 1011 987 1008 249 1010 249 1010 987 1008 985 1009 982 1005 987 1008 248 1006 248 1006 987 1008 986 1011 225 907 917 912 985 1009 985 1009 917 912 990 1012 226 911 988 1013 917 912 917 912 988 1013 990 1012 989 1015 990 1012 250 1014 250 1014 990 1012 988 1013 985 1009 990 1012 249 1010 249 1010 990 1012 989 1015 226 911 920 916 988 1013 988 1013 920 916 993 1016 227 915 991 1017 920 916 920 916 991 1017 993 1016 992 1019 993 1016 251 1018 251 1018 993 1016 991 1017 988 1013 993 1016 250 1014 250 1014 993 1016 992 1019 227 915 923 920 991 1017 991 1017 923 920 996 1020 228 919 994 1021 923 920 923 920 994 1021 996 1020 995 1023 996 1020 252 1022 252 1022 996 1020 994 1021 991 1017 996 1020 251 1018 251 1018 996 1020 995 1023 228 919 926 924 994 1021 994 1021 926 924 999 1024 229 923 997 1025 926 924 926 924 997 1025 999 1024 998 1027 999 1024 253 1026 253 1026 999 1024 997 1025 994 1021 999 1024 252 1022 252 1022 999 1024 998 1027 229 923 929 928 997 1025 997 1025 929 928 1002 1028 230 927 1000 1029 929 928 929 928 1000 1029 1002 1028 1001 1031 1002 1028 254 1030 254 1030 1002 1028 1000 1029 997 1025 1002 1028 253 1026 253 1026 1002 1028 1001 1031 230 927 932 932 1000 1029 1000 1029 932 932 1005 1032 231 931 1003 1033 932 932 932 932 1003 1033 1005 1032 1004 1035 1005 1032 255 1034 255 1034 1005 1032 1003 1033 1000 1029 1005 1032 254 1030 254 1030 1005 1032 1004 1035 231 931 935 936 1003 1033 1003 1033 935 936 1008 1036 232 935 1006 1037 935 936 935 936 1006 1037 1008 1036 1007 1039 1008 1036 256 1038 256 1038 1008 1036 1006 1037 1003 1033 1008 1036 255 1034 255 1034 1008 1036 1007 1039 232 935 938 940 1006 1037 1006 1037 938 940 1011 1040 233 939 1009 1041 938 940 938 940 1009 1041 1011 1040 1010 1043 1011 1040 257 1042 257 1042 1011 1040 1009 1041 1006 1037 1011 1040 256 1038 256 1038 1011 1040 1010 1043 233 939 941 944 1009 1041 1009 1041 941 944 1014 1044 234 943 1012 1045 941 944 941 944 1012 1045 1014 1044 1013 1047 1014 1044 258 1046 258 1046 1014 1044 1012 1045 1009 1041 1014 1044 257 1042 257 1042 1014 1044 1013 1047 234 943 944 948 1012 1045 1012 1045 944 948 1017 1048 235 947 1015 1049 944 948 944 948 1015 1049 1017 1048 1016 1051 1017 1048 259 1050 259 1050 1017 1048 1015 1049 1012 1045 1017 1048 258 1046 258 1046 1017 1048 1016 1051 235 947 947 952 1015 1049 1015 1049 947 952 1020 1052 236 951 1018 1053 947 952 947 952 1018 1053 1020 1052 1019 1055 1020 1052 260 1054 260 1054 1020 1052 1018 1053 1015 1049 1020 1052 259 1050 259 1050 1020 1052 1019 1055 236 951 950 956 1018 1053 1018 1053 950 956 1023 1056 237 955 1021 1057 950 956 950 956 1021 1057 1023 1056 1022 1059 1023 1056 261 1058 261 1058 1023 1056 1021 1057 1018 1053 1023 1056 260 1054 260 1054 1023 1056 1022 1059 237 955 953 960 1021 1057 1021 1057 953 960 1026 1060 238 959 1024 1061 953 960 953 960 1024 1061 1026 1060 1025 1063 1026 1060 262 1062 262 1062 1026 1060 1024 1061 1021 1057 1026 1060 261 1058 261 1058 1026 1060 1025 1063 238 959 956 964 1024 1061 1024 1061 956 964 1029 1064 239 963 1027 1065 956 964 956 964 1027 1065 1029 1064 1028 1067 1029 1064 263 1066 263 1066 1029 1064 1027 1065 1024 1061 1029 1064 262 1062 262 1062 1029 1064 1028 1067 239 963 958 1068 1027 1065 1027 1065 958 1068 1031 1069 216 1070 962 1071 958 1072 958 1072 962 1071 1031 1069 1030 1074 1031 1069 240 1073 240 1073 1031 1069 962 1075 1027 1065 1031 1069 263 1066 263 1066 1031 1069 1030 1076 240 979 961 978 1034 1078 1034 1078 961 978 1035 1077 241 977 1032 1079 961 978 961 978 1032 1079 1035 1077 1033 1081 1035 1077 265 1080 265 1080 1035 1077 1032 1079 1034 1078 1035 1077 264 1082 264 1082 1035 1077 1033 1081 241 977 965 983 1032 1079 1032 1079 965 983 1038 1083 242 982 1036 1084 965 983 965 983 1036 1084 1038 1083 1037 1086 1038 1083 266 1085 266 1085 1038 1083 1036 1084 1032 1079 1038 1083 265 1080 265 1080 1038 1083 1037 1086 242 982 968 987 1036 1084 1036 1084 968 987 1041 1087 243 986 1039 1088 968 987 968 987 1039 1088 1041 1087 1040 1090 1041 1087 267 1089 267 1089 1041 1087 1039 1088 1036 1084 1041 1087 266 1085 266 1085 1041 1087 1040 1090 243 986 971 991 1039 1088 1039 1088 971 991 1044 1091 244 990 1042 1092 971 991 971 991 1042 1092 1044 1091 1043 1094 1044 1091 268 1093 268 1093 1044 1091 1042 1092 1039 1088 1044 1091 267 1089 267 1089 1044 1091 1043 1094 244 990 974 995 1042 1092 1042 1092 974 995 1047 1095 245 994 1045 1096 974 995 974 995 1045 1096 1047 1095 1046 1098 1047 1095 269 1097 269 1097 1047 1095 1045 1096 1042 1092 1047 1095 268 1093 268 1093 1047 1095 1046 1098 245 994 977 999 1045 1096 1045 1096 977 999 1050 1099 246 998 1048 1100 977 999 977 999 1048 1100 1050 1099 1049 1102 1050 1099 270 1101 270 1101 1050 1099 1048 1100 1045 1096 1050 1099 269 1097 269 1097 1050 1099 1049 1102 246 998 980 1003 1048 1100 1048 1100 980 1003 1053 1103 247 1002 1051 1104 980 1003 980 1003 1051 1104 1053 1103 1052 1106 1053 1103 271 1105 271 1105 1053 1103 1051 1104 1048 1100 1053 1103 270 1101 270 1101 1053 1103 1052 1106 247 1002 983 1007 1051 1104 1051 1104 983 1007 1056 1107 248 1006 1054 1108 983 1007 983 1007 1054 1108 1056 1107 1055 1110 1056 1107 272 1109 272 1109 1056 1107 1054 1108 1051 1104 1056 1107 271 1105 271 1105 1056 1107 1055 1110 248 1006 986 1011 1054 1108 1054 1108 986 1011 1059 1111 249 1010 1057 1112 986 1011 986 1011 1057 1112 1059 1111 1058 1114 1059 1111 273 1113 273 1113 1059 1111 1057 1112 1054 1108 1059 1111 272 1109 272 1109 1059 1111 1058 1114 249 1010 989 1015 1057 1112 1057 1112 989 1015 1062 1115 250 1014 1060 1116 989 1015 989 1015 1060 1116 1062 1115 1061 1118 1062 1115 274 1117 274 1117 1062 1115 1060 1116 1057 1112 1062 1115 273 1113 273 1113 1062 1115 1061 1118 250 1014 992 1019 1060 1116 1060 1116 992 1019 1065 1119 251 1018 1063 1120 992 1019 992 1019 1063 1120 1065 1119 1064 1122 1065 1119 275 1121 275 1121 1065 1119 1063 1120 1060 1116 1065 1119 274 1117 274 1117 1065 1119 1064 1122 251 1018 995 1023 1063 1120 1063 1120 995 1023 1068 1123 252 1022 1066 1124 995 1023 995 1023 1066 1124 1068 1123 1067 1126 1068 1123 276 1125 276 1125 1068 1123 1066 1124 1063 1120 1068 1123 275 1121 275 1121 1068 1123 1067 1126 252 1022 998 1027 1066 1124 1066 1124 998 1027 1071 1127 253 1026 1069 1128 998 1027 998 1027 1069 1128 1071 1127 1070 1130 1071 1127 277 1129 277 1129 1071 1127 1069 1128 1066 1124 1071 1127 276 1125 276 1125 1071 1127 1070 1130 253 1026 1001 1031 1069 1128 1069 1128 1001 1031 1074 1131 254 1030 1072 1132 1001 1031 1001 1031 1072 1132 1074 1131 1073 1134 1074 1131 278 1133 278 1133 1074 1131 1072 1132 1069 1128 1074 1131 277 1129 277 1129 1074 1131 1073 1134 254 1030 1004 1035 1072 1132 1072 1132 1004 1035 1077 1135 255 1034 1075 1136 1004 1035 1004 1035 1075 1136 1077 1135 1076 1138 1077 1135 279 1137 279 1137 1077 1135 1075 1136 1072 1132 1077 1135 278 1133 278 1133 1077 1135 1076 1138 255 1034 1007 1039 1075 1136 1075 1136 1007 1039 1080 1139 256 1038 1078 1140 1007 1039 1007 1039 1078 1140 1080 1139 1079 1142 1080 1139 280 1141 280 1141 1080 1139 1078 1140 1075 1136 1080 1139 279 1137 279 1137 1080 1139 1079 1142 256 1038 1010 1043 1078 1140 1078 1140 1010 1043 1083 1143 257 1042 1081 1144 1010 1043 1010 1043 1081 1144 1083 1143 1082 1146 1083 1143 281 1145 281 1145 1083 1143 1081 1144 1078 1140 1083 1143 280 1141 280 1141 1083 1143 1082 1146 257 1042 1013 1047 1081 1144 1081 1144 1013 1047 1086 1147 258 1046 1084 1148 1013 1047 1013 1047 1084 1148 1086 1147 1085 1150 1086 1147 282 1149 282 1149 1086 1147 1084 1148 1081 1144 1086 1147 281 1145 281 1145 1086 1147 1085 1150 258 1046 1016 1051 1084 1148 1084 1148 1016 1051 1089 1151 259 1050 1087 1152 1016 1051 1016 1051 1087 1152 1089 1151 1088 1154 1089 1151 283 1153 283 1153 1089 1151 1087 1152 1084 1148 1089 1151 282 1149 282 1149 1089 1151 1088 1154 259 1050 1019 1055 1087 1152 1087 1152 1019 1055 1092 1155 260 1054 1090 1156 1019 1055 1019 1055 1090 1156 1092 1155 1091 1158 1092 1155 284 1157 284 1157 1092 1155 1090 1156 1087 1152 1092 1155 283 1153 283 1153 1092 1155 1091 1158 260 1054 1022 1059 1090 1156 1090 1156 1022 1059 1095 1159 261 1058 1093 1160 1022 1059 1022 1059 1093 1160 1095 1159 1094 1162 1095 1159 285 1161 285 1161 1095 1159 1093 1160 1090 1156 1095 1159 284 1157 284 1157 1095 1159 1094 1162 261 1058 1025 1063 1093 1160 1093 1160 1025 1063 1098 1163 262 1062 1096 1164 1025 1063 1025 1063 1096 1164 1098 1163 1097 1166 1098 1163 286 1165 286 1165 1098 1163 1096 1164 1093 1160 1098 1163 285 1161 285 1161 1098 1163 1097 1166 262 1062 1028 1067 1096 1164 1096 1164 1028 1067 1101 1167 263 1066 1099 1168 1028 1067 1028 1067 1099 1168 1101 1167 1100 1170 1101 1167 287 1169 287 1169 1101 1167 1099 1168 1096 1164 1101 1167 286 1165 286 1165 1101 1167 1100 1170 263 1066 1030 1171 1099 1168 1099 1168 1030 1171 1103 1172 240 1173 1034 1174 1030 1175 1030 1175 1034 1174 1103 1172 1102 1177 1103 1172 264 1176 264 1176 1103 1172 1034 1178 1099 1168 1103 1172 287 1169 287 1169 1103 1172 1102 1179 264 1082 1033 1081 1105 1181 1105 1181 1033 1081 1106 1180 265 1080 1104 1182 1033 1081 1033 1081 1104 1182 1106 1180 288 1184 1106 1180 1 1183 1 1183 1106 1180 1104 1185 1105 1187 1106 1180 0 1186 0 1186 1106 1180 288 1188 265 1080 1037 1086 1104 1190 1104 1190 1037 1086 1108 1189 266 1085 1107 1191 1037 1086 1037 1086 1107 1191 1108 1189 293 1193 1108 1189 2 1192 2 1192 1108 1189 1107 1194 1104 1196 1108 1189 1 1195 1 1195 1108 1189 293 1197 266 1085 1040 1090 1107 1199 1107 1199 1040 1090 1110 1198 267 1089 1109 1200 1040 1090 1040 1090 1109 1200 1110 1198 297 1202 1110 1198 3 1201 3 1201 1110 1198 1109 1203 1107 1205 1110 1198 2 1204 2 1204 1110 1198 297 1206 267 1089 1043 1094 1109 1208 1109 1208 1043 1094 1112 1207 268 1093 1111 1209 1043 1094 1043 1094 1111 1209 1112 1207 301 1211 1112 1207 4 1210 4 1210 1112 1207 1111 1212 1109 1214 1112 1207 3 1213 3 1213 1112 1207 301 1215 268 1093 1046 1098 1111 1217 1111 1217 1046 1098 1114 1216 269 1097 1113 1218 1046 1098 1046 1098 1113 1218 1114 1216 305 1220 1114 1216 5 1219 5 1219 1114 1216 1113 1221 1111 1223 1114 1216 4 1222 4 1222 1114 1216 305 1224 269 1097 1049 1102 1113 1226 1113 1226 1049 1102 1116 1225 270 1101 1115 1227 1049 1102 1049 1102 1115 1227 1116 1225 309 1229 1116 1225 6 1228 6 1228 1116 1225 1115 1230 1113 1232 1116 1225 5 1231 5 1231 1116 1225 309 1233 270 1101 1052 1106 1115 1235 1115 1235 1052 1106 1118 1234 271 1105 1117 1236 1052 1106 1052 1106 1117 1236 1118 1234 313 1238 1118 1234 7 1237 7 1237 1118 1234 1117 1239 1115 1241 1118 1234 6 1240 6 1240 1118 1234 313 1242 271 1105 1055 1110 1117 1244 1117 1244 1055 1110 1120 1243 272 1109 1119 1245 1055 1110 1055 1110 1119 1245 1120 1243 317 1247 1120 1243 8 1246 8 1246 1120 1243 1119 1248 1117 1250 1120 1243 7 1249 7 1249 1120 1243 317 1251 272 1109 1058 1114 1119 1253 1119 1253 1058 1114 1122 1252 273 1113 1121 1254 1058 1114 1058 1114 1121 1254 1122 1252 321 1256 1122 1252 9 1255 9 1255 1122 1252 1121 1257 1119 1259 1122 1252 8 1258 8 1258 1122 1252 321 1260 273 1113 1061 1118 1121 1262 1121 1262 1061 1118 1124 1261 274 1117 1123 1263 1061 1118 1061 1118 1123 1263 1124 1261 325 1265 1124 1261 10 1264 10 1264 1124 1261 1123 1266 1121 1268 1124 1261 9 1267 9 1267 1124 1261 325 1269 274 1117 1064 1122 1123 1271 1123 1271 1064 1122 1126 1270 275 1121 1125 1272 1064 1122 1064 1122 1125 1272 1126 1270 329 1274 1126 1270 11 1273 11 1273 1126 1270 1125 1275 1123 1277 1126 1270 10 1276 10 1276 1126 1270 329 1278 275 1121 1067 1126 1125 1280 1125 1280 1067 1126 1128 1279 276 1125 1127 1281 1067 1126 1067 1126 1127 1281 1128 1279 333 1283 1128 1279 12 1282 12 1282 1128 1279 1127 1284 1125 1286 1128 1279 11 1285 11 1285 1128 1279 333 1287 276 1125 1070 1130 1127 1289 1127 1289 1070 1130 1130 1288 277 1129 1129 1290 1070 1130 1070 1130 1129 1290 1130 1288 337 1292 1130 1288 13 1291 13 1291 1130 1288 1129 1293 1127 1295 1130 1288 12 1294 12 1294 1130 1288 337 1296 277 1129 1073 1134 1129 1298 1129 1298 1073 1134 1132 1297 278 1133 1131 1299 1073 1134 1073 1134 1131 1299 1132 1297 341 1301 1132 1297 14 1300 14 1300 1132 1297 1131 1302 1129 1304 1132 1297 13 1303 13 1303 1132 1297 341 1305 278 1133 1076 1138 1131 1307 1131 1307 1076 1138 1134 1306 279 1137 1133 1308 1076 1138 1076 1138 1133 1308 1134 1306 345 1310 1134 1306 15 1309 15 1309 1134 1306 1133 1311 1131 1313 1134 1306 14 1312 14 1312 1134 1306 345 1314 279 1137 1079 1142 1133 1316 1133 1316 1079 1142 1136 1315 280 1141 1135 1317 1079 1142 1079 1142 1135 1317 1136 1315 349 1319 1136 1315 16 1318 16 1318 1136 1315 1135 1320 1133 1322 1136 1315 15 1321 15 1321 1136 1315 349 1323 280 1141 1082 1146 1135 1325 1135 1325 1082 1146 1138 1324 281 1145 1137 1326 1082 1146 1082 1146 1137 1326 1138 1324 353 1328 1138 1324 17 1327 17 1327 1138 1324 1137 1329 1135 1331 1138 1324 16 1330 16 1330 1138 1324 353 1332 281 1145 1085 1150 1137 1334 1137 1334 1085 1150 1140 1333 282 1149 1139 1335 1085 1150 1085 1150 1139 1335 1140 1333 357 1337 1140 1333 18 1336 18 1336 1140 1333 1139 1338 1137 1340 1140 1333 17 1339 17 1339 1140 1333 357 1341 282 1149 1088 1154 1139 1343 1139 1343 1088 1154 1142 1342 283 1153 1141 1344 1088 1154 1088 1154 1141 1344 1142 1342 361 1346 1142 1342 19 1345 19 1345 1142 1342 1141 1347 1139 1349 1142 1342 18 1348 18 1348 1142 1342 361 1350 283 1153 1091 1158 1141 1352 1141 1352 1091 1158 1144 1351 284 1157 1143 1353 1091 1158 1091 1158 1143 1353 1144 1351 365 1355 1144 1351 20 1354 20 1354 1144 1351 1143 1356 1141 1358 1144 1351 19 1357 19 1357 1144 1351 365 1359 284 1157 1094 1162 1143 1361 1143 1361 1094 1162 1146 1360 285 1161 1145 1362 1094 1162 1094 1162 1145 1362 1146 1360 369 1364 1146 1360 21 1363 21 1363 1146 1360 1145 1365 1143 1367 1146 1360 20 1366 20 1366 1146 1360 369 1368 285 1161 1097 1166 1145 1370 1145 1370 1097 1166 1148 1369 286 1165 1147 1371 1097 1166 1097 1166 1147 1371 1148 1369 373 1373 1148 1369 22 1372 22 1372 1148 1369 1147 1374 1145 1376 1148 1369 21 1375 21 1375 1148 1369 373 1377 286 1165 1100 1170 1147 1379 1147 1379 1100 1170 1150 1378 287 1169 1149 1380 1100 1170 1100 1170 1149 1380 1150 1378 377 1382 1150 1378 23 1381 23 1381 1150 1378 1149 1383 1147 1385 1150 1378 22 1384 22 1384 1150 1378 377 1386 287 1169 1102 1387 1149 1389 1149 1389 1102 1387 1151 1388 264 1390 1105 1391 1102 1392 1102 1392 1105 1391 1151 1388 381 1394 1151 1388 0 1393 0 1393 1151 1388 1105 1395 1149 1397 1151 1388 23 1396 23 1396 1151 1388 381 1398</p>
+ </triangles>
+ </mesh>
+ <extra>
+ <technique profile="MAYA">
+ <double_sided>1</double_sided>
+ </technique>
+ </extra>
+ </geometry>
+ </library_geometries>
+ <library_visual_scenes>
+ <visual_scene id="VisualSceneNode" name="Torus">
+ <node id="_Torus" name="Torus" type="NODE">
+ <rotate sid="rotateY">0 1 0 0</rotate>
+ <rotate sid="rotateX">1 0 0 0</rotate>
+ <rotate sid="rotateZ">0 0 1 0</rotate>
+ <instance_geometry url="#Torus">
+ <bind_material>
+ <technique_common>
+ <instance_material symbol="lambert2SG" target="#lambert2"/>
+ </technique_common>
+ </bind_material>
+ </instance_geometry>
+ </node>
+ <extra>
+ <technique profile="FCOLLADA">
+ <start_time>0.041666</start_time>
+ <end_time>2</end_time>
+ </technique>
+ </extra>
+ </visual_scene>
+ </library_visual_scenes>
+ <scene>
+ <instance_physics_scene url="#MayaNativePhysicsScene"/>
+ <instance_visual_scene url="#VisualSceneNode"/>
+ </scene>
+</COLLADA>
diff --git a/commoninclude.pri b/commoninclude.pri
new file mode 100644
index 0000000..9dd3e6a
--- /dev/null
+++ b/commoninclude.pri
@@ -0,0 +1,87 @@
+exists($$PWD/../../commonplatform.pri) {
+#If building as part of Qt 3D Studio, use it's commonplatform.pri
+include($$PWD/../../commonplatform.pri)
+} else {
+include($$PWD/commonplatform.pri)
+}
+
+contains(TEMPLATE, lib) {
+ load(qt_helper_lib)
+ # qt_helper_lib assumes non-qt lib, so it clears qt from config - reset that
+ CONFIG += qt exceptions
+}
+QT += core gui openglextensions
+
+DEFINES += COMPILED_FROM_DSP \
+ QT3DSDM_USE_NVLOG QT3DSDM_META_DATA_NO_SIGNALS \
+ QT3DS_AUTOTESTS_ENABLED
+
+INCLUDEPATH += \
+ $$PWD/src \
+ $$PWD/src/datamodel \
+ $$PWD/src/runtime \
+ $$PWD/src/system \
+ $$PWD/src/engine \
+ $$PWD/src/foundation \
+ $$PWD/src/render \
+ $$PWD/src/render/gl2 \
+ $$PWD/src/render/gl3 \
+ $$PWD/src/render/glg \
+ $$PWD/src/uipparser \
+ $$PWD/src/state \
+ $$PWD/src/event \
+ $$PWD/src/viewer \
+ $$PWD/src/viewer/perflog \
+ $$PWD/src/importlib \
+ $$PWD/src/dm \
+ $$PWD/src/dm/systems \
+ $$PWD/src/dm/systems/cores \
+ $$PWD/src/3rdparty/EASTL/UnknownVersion/include \
+ $$PWD/src/3rdparty/platformspecific/$$PlatformSpecificDir/PlatformLibs \
+ $$PWD/src/qmlstreamer \
+ $$PWD/src/runtimerender \
+ $$PWD/src/runtimerender/graphobjects \
+ $$PWD/src/runtimerender/resourcemanager \
+
+# TODO: Investigate whether these can be moved to commonplatform
+win32-msvc {
+ CONFIG += nostrictstrings
+ QMAKE_CXXFLAGS += /EHsc /GA
+ QMAKE_CFLAGS += /EHsc /GA
+}
+
+win32 {
+INCLUDEPATH += \
+ $$PWD/src/platformspecific/windows/libs \
+ $$PWD/src/3rdparty/platformspecific/Windows/Qt3DSLibs
+}
+
+linux|qnx {
+QMAKE_CXXFLAGS += -fpermissive
+QMAKE_CFLAGS += -fpermissive
+INCLUDEPATH += \
+ $$PWD/src/foundation/linux \
+ $$PWD/src/platformspecific/linux/libs \
+ $$PWD/src/3rdparty/platformspecific/Linux/Qt3DSLibs
+}
+
+integrity {
+INCLUDEPATH += \
+ $$PWD/src/foundation/linux \
+ $$PWD/src/platformspecific/linux/libs \
+ $$PWD/src/3rdparty/platformspecific/Linux/Qt3DSLibs
+}
+
+macos {
+INCLUDEPATH += \
+ $$PWD/src/3rdparty/platformspecific/Macos/Qt3DSLibs \
+ $$PWD/src/platformspecific/macos/libs
+
+}
+
+android {
+INCLUDEPATH += \
+ $$PWD/src/platformspecific/android/jni/libs/nv_thread \
+ $$PWD/src/3rdparty/platformspecific/Android/jni/Qt3DSLibs \
+ $$PWD/src/3rdparty/platformspecific/Android/jni
+}
diff --git a/commonplatform.pri b/commonplatform.pri
new file mode 100644
index 0000000..aadadb2
--- /dev/null
+++ b/commonplatform.pri
@@ -0,0 +1,308 @@
+load(qt_build_config)
+load(qt_build_paths)
+
+# Common defines across platforms that should be checked if/where they are used
+# as we remove dependencies to see where we can reduce
+DEFINES += \
+ QT3DS_FOUNDATION_NO_EXPORTS \
+ _CRT_SECURE_NO_DEPRECATE \
+ _CRT_NONSTDC_NO_DEPRECATE \
+ QT3DS_GRAPHICS_API_GL \
+ QT3DS_NO_SEARCH_PATH \
+ QT3DS_RENDER_ENABLE_LOAD_UIP \
+ FONT_NO_RES_DIR \
+ _TEGRA_NO_LOG_FILE \
+ EA_COMPILER_HAS_INTTYPES \
+ EASTL_ALLOCATOR_COPY_ENABLED \
+ UNICODE \
+ _UNICODE \
+ NO_BOOST
+
+win32: PlatformSpecificDir = windows
+macos: PlatformSpecificDir = macos
+linux|integrity|qnx: PlatformSpecificDir = linux
+android: PlatformSpecificDir = android/jni
+
+integrity: {
+ DEFINES += _LINUX
+ DEFINES += _INTEGRITYPLATFORM
+}
+
+INCLUDEPATH += $$PWD/src/platformspecific/$$PlatformSpecificDir
+
+THIRDPARTY_DIR = $$(QT3DSTUDIO_3RDPARTY_DIR)
+isEmpty(THIRDPARTY_DIR) {
+ THIRDPARTY_DIR = $$PWD/src/3rdparty
+}
+
+contains(QT_ARCH, x86_64) {
+ DEFINES += QT3DS_PROCESSOR_X64
+}
+
+CONFIG(debug, debug|release) {
+ DEFINES += _DEBUG
+} else {
+ DEFINES += NDEBUG
+}
+
+linux|qnx {
+ CONFIG += egl
+ DEFINES+=_LINUX QT3DS_OS_LINUX _LINUXPLATFORM QT3DS_NO_X11 \
+ QT3DS_VIEWER_EXPORTS WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T
+ QMAKE_CXXFLAGS_WARN_ON = -Wall -Wno-unused-local-typedefs
+}
+
+linux-clang {
+ DEFINES += __STRICT_ANSI__
+}
+
+macos {
+ DEFINES += _MACOSX _LINUXPLATFORM WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T
+ INCLUDEPATH += /usr/local/include
+
+# macOS builds treat most warnings as errors to prevent slipping more warnings
+# in to the code
+
+# Suppress large number of warnings from the Qt 3D Studio Code.
+# Suppressions have been reported in JIRA with these bugs:
+# QT3DS-2214 -Wno-unused-local-typedefs
+# QT3DS-2216 -Wno-inconsistent-missing-override
+# QT3DS-2222 -Wno-reorder
+# QT3DS-2223 -Wno-format
+# QT3DS-2224 -Wno-unused-function
+# QT3DS-2227 -Wno-unused-value
+# QT3DS-2229 -Wno-delete-non-virtual-dtor
+# QT3DS-2234 -Wno-unused-variable
+# QT3DS-2235 -Wno-overloaded-virtual
+# QT3DS-2237 -Wno-unused-private-field
+# QT3DS-2238 -Wno-comment
+# QT3DS-2240 -Wno-enum-compare
+# QT3DS-2241 -Wno-int-to-pointer-cast
+# QT3DS-2242 -Wno-int-to-void-pointer-cast
+# QT3DS-2246 -Wno-deprecated-declarations
+# QT3DS-2247 -Wno-pointer-bool-conversion
+# QT3DS-2248 -Wno-self-assign
+# QT3DS-2249 -Wno-tautological-compare
+# QT3DS-2251 -Wno-tautological-constant-out-of-range-compare
+ QMAKE_CXXFLAGS_WARN_ON = -Wall \
+ -Werror \
+ -Wno-unknown-pragmas \
+ -Wno-unused-local-typedefs \
+ -Wno-inconsistent-missing-override \
+ -Wno-reorder \
+ -Wno-format \
+ -Wno-unused-function \
+ -Wno-unused-value \
+ -Wno-delete-non-virtual-dtor \
+ -Wno-unused-variable \
+ -Wno-overloaded-virtual \
+ -Wno-unused-private-field \
+ -Wno-comment \
+ -Wno-enum-compare \
+ -Wno-int-to-pointer-cast \
+ -Wno-int-to-void-pointer-cast \
+ -Wno-deprecated-declarations \
+ -Wno-pointer-bool-conversion \
+ -Wno-self-assign \
+ -Wno-tautological-compare \
+ -Wno-tautological-constant-out-of-range-compare \
+ -Wno-mismatched-tags \
+ -Wno-error=unused-local-typedefs \
+ -Wno-error=inconsistent-missing-override \
+ -Wno-error=reorder \
+ -Wno-error=format \
+ -Wno-error=unused-function \
+ -Wno-error=unused-value \
+ -Wno-error=delete-non-virtual-dtor \
+ -Wno-error=unused-variable \
+ -Wno-error=overloaded-virtual \
+ -Wno-error=unused-private-field \
+ -Wno-error=comment \
+ -Wno-error=enum-compare \
+ -Wno-error=int-to-pointer-cast \
+ -Wno-error=int-to-void-pointer-cast \
+ -Wno-error=unused-lambda-capture \
+ -Wno-error=deprecated-declarations \
+ -Wno-error=pointer-bool-conversion \
+ -Wno-error=self-assign \
+ -Wno-error=tautological-compare \
+ -Wno-error=tautological-constant-out-of-range-compare \
+ -Wno-error=switch \
+ -Wno-error=mismatched-tags \
+ -Wno-error=logical-op-parentheses \
+ -Wno-error=pragmas \
+ -Wno-error=pragma-pack \
+ -Wno-error=mismatched-tags
+
+ QMAKE_CFLAGS_WARN_ON = -Wall \
+ -Werror \
+ -Wno-unknown-pragmas \
+ -Wno-unused-local-typedefs \
+ -Wno-inconsistent-missing-override \
+ -Wno-reorder \
+ -Wno-format \
+ -Wno-unused-function \
+ -Wno-unused-value \
+ -Wno-delete-non-virtual-dtor \
+ -Wno-unused-variable \
+ -Wno-overloaded-virtual \
+ -Wno-unused-private-field \
+ -Wno-comment \
+ -Wno-enum-compare \
+ -Wno-int-to-pointer-cast \
+ -Wno-int-to-void-pointer-cast \
+ -Wno-unused-lambda-capture \
+ -Wno-deprecated-declarations \
+ -Wno-pointer-bool-conversion \
+ -Wno-self-assign \
+ -Wno-tautological-compare \
+ -Wno-tautological-constant-out-of-range-compare \
+ -Wno-mismatched-tags \
+ -Wno-error=unused-local-typedefs \
+ -Wno-error=inconsistent-missing-override \
+ -Wno-error=reorder \
+ -Wno-error=format \
+ -Wno-error=unused-function \
+ -Wno-error=unused-value \
+ -Wno-error=delete-non-virtual-dtor \
+ -Wno-error=unused-variable \
+ -Wno-error=overloaded-virtual \
+ -Wno-error=unused-private-field \
+ -Wno-error=comment \
+ -Wno-error=enum-compare \
+ -Wno-error=int-to-pointer-cast \
+ -Wno-error=int-to-void-pointer-cast \
+ -Wno-error=unused-lambda-capture \
+ -Wno-error=deprecated-declarations \
+ -Wno-error=pointer-bool-conversion \
+ -Wno-error=self-assign \
+ -Wno-error=tautological-compare \
+ -Wno-error=tautological-constant-out-of-range-compare \
+ -Wno-error=switch \
+ -Wno-error=mismatched-tags \
+ -Wno-error=logical-op-parentheses \
+ -Wno-error=pragmas \
+ -Wno-error=pragma-pack \
+ -Wno-error=mismatched-tags
+
+# Suppress the huge pile of Qt related warnings on "direct access in function
+# from file to global weak symbol". These arise when not using devbuilds of Qt.
+ QMAKE_CXXFLAGS += -fvisibility=hidden
+ QMAKE_CFLAGS += -fvisibility=hidden
+}
+
+*-icc*: {
+QMAKE_CFLAGS += -fasm-blocks
+QMAKE_CFLAGS += -wd1418,2259,383,981,2259,11074,11076
+QMAKE_CXXFLAGS += -fasm-blocks
+QMAKE_CXXFLAGS += -wd1418,2259,383,981,2259,11074,11076
+QMAKE_CXXFLAGS_WARN_ON = -wd1418,2259,383,981,2259,11074,11076
+QMAKE_CFLAGS_WARN_ON = -wd1418,2259,383,981,2259,11074,11076
+}
+
+clang {
+# Suppress large number of warnings from the Qt 3D Studio Code.
+# Suppressions have been reported in JIRA with bugs
+ QMAKE_CXXFLAGS_WARN_ON = -Wall \
+ -Wno-unknown-pragmas \
+ -Wno-unused-local-typedefs \
+ -Wno-inconsistent-missing-override \
+ -Wno-reorder \
+ -Wno-format \
+ -Wno-unused-function \
+ -Wno-unused-value \
+ -Wno-delete-non-virtual-dtor \
+ -Wno-unused-variable \
+ -Wno-overloaded-virtual \
+ -Wno-unused-private-field \
+ -Wno-comment \
+ -Wno-enum-compare \
+ -Wno-int-to-pointer-cast \
+ -Wno-int-to-void-pointer-cast \
+ -Wno-deprecated-declarations \
+ -Wno-pointer-bool-conversion \
+ -Wno-self-assign \
+ -Wno-tautological-compare \
+ -Wno-tautological-constant-out-of-range-compare \
+ -Wno-mismatched-tags
+
+ QMAKE_CFLAGS_WARN_ON = -Wall \
+ -Wno-unknown-pragmas \
+ -Wno-unused-local-typedefs \
+ -Wno-inconsistent-missing-override \
+ -Wno-reorder \
+ -Wno-format \
+ -Wno-unused-function \
+ -Wno-unused-value \
+ -Wno-delete-non-virtual-dtor \
+ -Wno-unused-variable \
+ -Wno-overloaded-virtual \
+ -Wno-unused-private-field \
+ -Wno-comment \
+ -Wno-enum-compare \
+ -Wno-int-to-pointer-cast \
+ -Wno-int-to-void-pointer-cast \
+ -Wno-deprecated-declarations \
+ -Wno-pointer-bool-conversion \
+ -Wno-self-assign \
+ -Wno-tautological-compare \
+ -Wno-tautological-constant-out-of-range-compare \
+ -Wno-mismatched-tags
+
+# Suppress the huge pile of Qt related warnings on "direct access in function
+# from file to global weak symbol". These arise when not using devbuilds of Qt.
+ QMAKE_CXXFLAGS += -fvisibility=hidden
+ QMAKE_CFLAGS += -fvisibility=hidden
+}
+
+android {
+ QMAKE_CXXFLAGS -= -fstack-protector-strong
+ QMAKE_CFLAGS -= -fstack-protector-strong
+ # TODO: Should be done using this instead of copying the GLES headers, but including this
+ # causes lots of conflicting definitions in signal.h for some reason. Feel free to fix it if
+ # you know how. After this works, GLES3 and GLES2 folders can be deleted from
+ # 3rdparty/RuntimePlatformSpecific/Android/jni
+# INCLUDEPATH += $$(ANDROID_NDK_ROOT)/sysroot/usr/include
+# DEFINES += __BITS_PER_LONG=32
+}
+
+win32 {
+ DEFINES += QT3DS_OS_WINDOWS _WIN32 _PCPLATFORM \
+ WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T KDWIN NOMINMAX
+
+ win32-msvc {
+ QMAKE_CXXFLAGS += /MP /d2Zi+
+ QMAKE_CFLAGS += /MP /d2Zi+
+ # Warning C4251 = needs to have dll-interface to be used by clients of class,
+ # it comes from a lot of Qt headers, so disabling it.
+ QMAKE_CXXFLAGS_WARN_ON += -wd4251 #needs to have dll-interface to be used by clients
+ }
+
+ CONFIG(debug, debug|release) {
+ win32-msvc {
+ QMAKE_CXXFLAGS += /Od
+ QMAKE_CFLAGS += /Od
+ }
+ } else {
+ win32-msvc {
+ QMAKE_CXXFLAGS += /Ox
+ QMAKE_CFLAGS += /Ox
+ }
+ }
+
+ contains(QT_ARCH, x86_64) {
+ DEFINES += _WIN64
+ }
+}
+
+BINDIR = $$MODULE_BASE_OUTDIR/bin
+LIBDIR = $$MODULE_BASE_OUTDIR/lib
+LIBS += -L"$$LIBDIR"
+!testcase {
+ contains(TEMPLATE, app) {
+ DESTDIR = $$BINDIR
+ } else {
+ DESTDIR = $$LIBDIR
+ win32: DLLDESTDIR = $$BINDIR
+ }
+}
diff --git a/configure.json b/configure.json
new file mode 100644
index 0000000..82d1392
--- /dev/null
+++ b/configure.json
@@ -0,0 +1,9 @@
+{
+ "module": "3dstudioruntimeopengl",
+ "condition": "!config.wasm && !config.ios && !config.integrity && !config.tvos && !config.watchos && !config.winrt && !config.qnx",
+ "summary": [
+ {
+ "section": "Qt 3D Studio OpenGL Runtime"
+ }
+ ]
+}
diff --git a/examples/examples.pro b/examples/examples.pro
new file mode 100644
index 0000000..cf3793d
--- /dev/null
+++ b/examples/examples.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+SUBDIRS += \
+ studio3d
diff --git a/examples/studio3d/cppdatainput/cppdatainput.pro b/examples/studio3d/cppdatainput/cppdatainput.pro
new file mode 100644
index 0000000..20b5c68
--- /dev/null
+++ b/examples/studio3d/cppdatainput/cppdatainput.pro
@@ -0,0 +1,11 @@
+CONFIG += c++11
+QT += widgets qml quick studio3d
+
+target.path = $$[QT_INSTALL_EXAMPLES]/studio3d/$$TARGET
+INSTALLS += target
+
+SOURCES += \
+ main.cpp
+
+RESOURCES += \
+ res.qrc
diff --git a/examples/studio3d/cppdatainput/main.cpp b/examples/studio3d/cppdatainput/main.cpp
new file mode 100644
index 0000000..d966a3a
--- /dev/null
+++ b/examples/studio3d/cppdatainput/main.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qstudio3dglobal.h>
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+#include <Q3DSSurfaceViewer>
+#include <QWindow>
+#include <QSurface>
+#include <Q3DSPresentation>
+#include <QOpenGLContext>
+#include <Q3DSDataInput>
+#include <QVector3D>
+#include <QTimer>
+#include <QDebug>
+// Required for Ubuntu build
+#include <cmath>
+
+int main(int argc, char *argv[])
+{
+ float colorRed = 0.0f;
+ int range = 0;
+
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+
+ QGuiApplication app(argc, argv);
+
+ // Use the ideal format (i.e. OpenGL version and profile) recommended by
+ // the Qt 3D Studio runtime. Without this the format set on the QQuickView
+ // would be used instead.
+ QSurfaceFormat::setDefaultFormat(Q3DS::surfaceFormat());
+
+ QOpenGLContext context;
+ if (!context.create())
+ qFatal("Failed to create OpenGL context");
+
+ QWindow window;
+ window.setSurfaceType(QSurface::OpenGLSurface);
+ window.setFormat(context.format());
+ window.create();
+
+ Q3DSSurfaceViewer viewer;
+ QObject::connect(&viewer, &Q3DSSurfaceViewer::presentationLoaded, &viewer, [&] {
+ qDebug() << "Presentation loaded";
+ });
+
+ QObject::connect(&viewer, &Q3DSSurfaceViewer::presentationReady, &viewer, [&] {
+ qDebug() << "Presentation ready";
+ const auto diList = viewer.presentation()->dataInputs();
+ for (const auto &it : diList) {
+ Q3DSDataInput *dynDi = it;
+ qDebug() << "Processing data input " << dynDi->name();
+ if (dynDi->name().contains(QLatin1String("color"))) {
+ if (dynDi->isValid()) {
+ // Access metadata.
+ qDebug() << "Metadata: " << dynDi->metadata("metadata1");
+
+ QObject::connect(&viewer, &Q3DSSurfaceViewer::frameUpdate,
+ [&colorRed, dynDi] {
+ dynDi->setValue(QVector3D(colorRed, 0.5, 0.5));
+ colorRed = std::fmod(colorRed + 0.001f, 1.0f);
+ });
+ }
+ } else if (dynDi->name().contains(QLatin1String("range"))) {
+ qDebug() << "Found dynamic data input for range " << dynDi;
+ if (dynDi->isValid()) {
+ QObject::connect(&viewer, &Q3DSSurfaceViewer::frameUpdate, [&range, dynDi] {
+ dynDi->setValue((float)range);
+ range = (range + 1) % 360;
+ });
+ }
+ }
+ }
+ auto diWithMetadata = viewer.presentation()->dataInputs("metadata1");
+ qDebug() << "Datainputs with metadatakey metadata1: ";
+ for (auto &it : diWithMetadata)
+ qDebug() << it->name();
+ });
+
+ viewer.presentation()->setSource(QUrl(QStringLiteral("qrc:presentation/datainput.uia")));
+ viewer.setUpdateInterval(0); // enable automatic updates
+
+ viewer.create(&window, &context);
+
+ window.setTitle(QStringLiteral("Qt 3D Studio Example"));
+ window.resize(800, 480);
+ window.show();
+
+ return app.exec();
+}
diff --git a/examples/studio3d/cppdatainput/presentation/datainput.uia b/examples/studio3d/cppdatainput/presentation/datainput.uia
new file mode 100644
index 0000000..0c89121
--- /dev/null
+++ b/examples/studio3d/cppdatainput/presentation/datainput.uia
@@ -0,0 +1,17 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<application>
+ <assets initial="datainput">
+ <presentation id="datainput" src="datainput.uip"/>
+ <dataInput name="colorInput" type="Vector3"/>
+ <dataInput metadata="metadata1$Controls rotation" max="360" name="rangeInput" min="0" type="Ranged Number"/>
+ </assets>
+ <statemachine ref="#logic">
+ <visual-states>
+ <state ref="Initial">
+ <enter>
+ <goto-slide element="main:Scene" rel="next"/>
+ </enter>
+ </state>
+ </visual-states>
+ </statemachine>
+</application>
diff --git a/examples/studio3d/cppdatainput/presentation/datainput.uip b/examples/studio3d/cppdatainput/presentation/datainput.uip
new file mode 100644
index 0000000..2dc8545
--- /dev/null
+++ b/examples/studio3d/cppdatainput/presentation/datainput.uip
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<UIP version="6" >
+ <Project >
+ <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" preferKtx="False" >
+ <CustomColors count="16" >#ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
+ </ProjectSettings>
+ <Graph >
+ <Scene id="Scene" controlledproperty="$rangeInput @timeline" >
+ <Layer id="Layer" >
+ <Camera id="Camera" />
+ <Light id="Light" />
+ <Text id="Text" />
+ <Text id="Text2" />
+ <Model id="Cylinder" >
+ <Material id="Default_002" name="Default" />
+ </Model>
+ <Text id="Text4" />
+ <Model id="Rectangle" >
+ <Material id="Default_001" name="Default" />
+ </Model>
+ </Layer>
+ </Scene>
+ </Graph>
+ <Logic >
+ <State name="Master Slide" component="#Scene" >
+ <Add ref="#Layer" multisampleaa="SSAA" progressiveaa="8x" />
+ <Add ref="#Camera" controlledproperty="" pivot="0 0 0" position="0 0 -800" rotation="0 0 0" />
+ <Add ref="#Light" castshadow="True" controlledproperty="$colorInput lightdiffuse" lightdiffuse="1 0 0" lighttype="Point" position="-300.444 70.829 -30" shdwfactor="11.89" shdwfilter="6.94" shdwmapres="11" />
+ <State id="Scene-Slide1" name="Slide1" initialplaystate="Pause" >
+ <Add ref="#Text" name="Text" controlledproperty="$rangeInput textstring" font="TitilliumWeb-Regular" position="216.513 76.6172 -113.498" scale="1 1 1" size="24" textstring="0" >
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 0 0 0 10 0 0 0</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 0 0 10 0 0 0</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 0 0 10 -360 0 0</AnimationTrack>
+ </Add>
+ <Add ref="#Text2" name="Text2" controlledproperty="" font="TitilliumWeb-Regular" position="259.808 217.95 0" scale="1 1 1" size="16" textstring="Text control&#10;Rotation animation control via datainput timeline control" />
+ <Add ref="#Cylinder" name="Cylinder" controlledproperty="" position="15.877 -141.932 0" sourcepath="#Cylinder" />
+ <Add ref="#Default_002" diffuse="0.666667 1 0.498039" />
+ <Add ref="#Text4" name="Text4" font="TitilliumWeb-Regular" position="-373.353 201.004 0" size="18" textstring="Directional light color control" />
+ <Add ref="#Rectangle" name="Rectangle" position="0 -400 20" rotation="90.5 0 0" scale="11.0468 7.99191 9.12813" sourcepath="#Rectangle" />
+ <Add ref="#Default_001" diffuse="0.623529 0.623529 0.623529" />
+ </State>
+ </State>
+ </Logic>
+ </Project>
+</UIP>
diff --git a/examples/studio3d/cppdatainput/res.qrc b/examples/studio3d/cppdatainput/res.qrc
new file mode 100644
index 0000000..9beb456
--- /dev/null
+++ b/examples/studio3d/cppdatainput/res.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>presentation/datainput.uia</file>
+ <file>presentation/datainput.uip</file>
+ </qresource>
+</RCC>
diff --git a/examples/studio3d/qmldatainput/doc/images/qmldatainput.png b/examples/studio3d/qmldatainput/doc/images/qmldatainput.png
new file mode 100644
index 0000000..e0567ee
--- /dev/null
+++ b/examples/studio3d/qmldatainput/doc/images/qmldatainput.png
Binary files differ
diff --git a/examples/studio3d/qmldatainput/doc/src/qmldatainput.qdoc b/examples/studio3d/qmldatainput/doc/src/qmldatainput.qdoc
new file mode 100644
index 0000000..21eae9e
--- /dev/null
+++ b/examples/studio3d/qmldatainput/doc/src/qmldatainput.qdoc
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qmldatainput
+ \title Qt 3D Studio Runtime: QML DataInput Example
+ \ingroup OpenGLRuntime-examples-qml
+ \brief Demonstrates using DataInput elements in QML.
+
+ \image qmldatainput.png
+
+ \e {This example demonstrates using DataInput elements with QML in Studio}
+
+ \include examples-run.qdocinc
+
+ \section1 Description
+
+ The presentation consists of a static text element serving as a label and a rotating text
+ element for showing the input data as text. There is also a data input of type \e{Ranged Number}
+ in the presentation. This data input is used to control both the rotation animation time and
+ the text shown on the second text element.
+ The range is specified as [0 .. 360] in the presentation, where zero maps
+ to the beginning of the animation and 360 maps to the end of the animation.
+
+ The \l {qmldatainput/qml/qmldatainput/main.qml}{qml main} loads the presentation and animates
+ a number property. The value of the animated property is bound to the
+ \l{DataInput::value}{value} property of the DataInput element, making the value show up in the
+ linked text element in the presentation. The same value is used to control the animation time:
+
+ \snippet qmldatainput/qml/qmldatainput/main.qml 1
+*/
diff --git a/examples/studio3d/qmldatainput/main.cpp b/examples/studio3d/qmldatainput/main.cpp
new file mode 100644
index 0000000..165cd89
--- /dev/null
+++ b/examples/studio3d/qmldatainput/main.cpp
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtWidgets/QApplication>
+#include <QtQuick/QQuickView>
+#include <qstudio3dglobal.h>
+#ifdef USE_EMBEDDED_FONTS
+#include <QtGui/QFontDatabase>
+#include <QtCore/QDebug>
+#endif
+
+int main(int argc, char *argv[])
+{
+ qputenv("QSG_INFO", "1");
+
+ QApplication app(argc, argv);
+
+ // Use the ideal format (i.e. OpenGL version and profile) recommended by
+ // the Qt 3D Studio runtime. Without this the format set on the QQuickView
+ // would be used instead.
+ QSurfaceFormat::setDefaultFormat(Q3DS::surfaceFormat());
+
+ QQuickView viewer;
+ viewer.setSource(QUrl("qrc:/qml/qmldatainput/main.qml"));
+
+ viewer.setTitle(QStringLiteral("Qt 3D Studio Example"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.resize(1280, 720);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/studio3d/qmldatainput/presentation/Paper05.png b/examples/studio3d/qmldatainput/presentation/Paper05.png
new file mode 100644
index 0000000..e70749d
--- /dev/null
+++ b/examples/studio3d/qmldatainput/presentation/Paper05.png
Binary files differ
diff --git a/examples/studio3d/qmldatainput/presentation/datainput.uia b/examples/studio3d/qmldatainput/presentation/datainput.uia
new file mode 100644
index 0000000..30d0084
--- /dev/null
+++ b/examples/studio3d/qmldatainput/presentation/datainput.uia
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<application>
+ <assets initial="datainput">
+ <presentation id="datainput" src="datainput.uip"/>
+ <dataInput name="cameraRotInput" type="Vector3"/>
+ <dataInput name="colorInput" type="Vector3"/>
+ <dataInput name="queriedInput" type="String"/>
+ <dataInput name="rangeInput" type="Ranged Number" min="0" max="360"/>
+ <dataInput name="scaleInput" type="Vector3"/>
+ <dataInput name="stringInput" type="String"/>
+ <dataInput name="variantInput" type="Variant" metadata="usage$opacity$datasource$speedgauge_visibility"/>
+ </assets>
+ <statemachine ref="#logic">
+ <visual-states>
+ <state ref="Initial">
+ <enter>
+ <goto-slide rel="next" element="main:Scene"/>
+ </enter>
+ </state>
+ </visual-states>
+ </statemachine>
+</application>
diff --git a/examples/studio3d/qmldatainput/presentation/datainput.uip b/examples/studio3d/qmldatainput/presentation/datainput.uip
new file mode 100644
index 0000000..008f456
--- /dev/null
+++ b/examples/studio3d/qmldatainput/presentation/datainput.uip
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<UIP version="6" >
+ <Project >
+ <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" preferKtx="False" >
+ <CustomColors count="16" >#ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
+ </ProjectSettings>
+ <Graph >
+ <Scene id="Scene" controlledproperty="$rangeInput @timeline" >
+ <Layer id="Layer" >
+ <Camera id="Camera" />
+ <Light id="Light" />
+ <Text id="Text" />
+ <Text id="Text2" />
+ <Model id="Cone" >
+ <Material id="Default" name="Default" />
+ </Model>
+ <Model id="Cylinder" >
+ <Material id="Default_002" name="Default" />
+ </Model>
+ <Text id="Text6" />
+ <Text id="Text8" />
+ <Model id="Cube2" >
+ <Material id="Default_003" name="Default" />
+ </Model>
+ <Text id="Text3" />
+ <Text id="Text4" />
+ <Model id="Rectangle" >
+ <Material id="Default_001" name="Default" >
+ <Image id="Default_001_diffusemap" />
+ </Material>
+ </Model>
+ <Text id="Text5" />
+ </Layer>
+ </Scene>
+ </Graph>
+ <Logic >
+ <State name="Master Slide" component="#Scene" >
+ <Add ref="#Layer" multisampleaa="SSAA" progressiveaa="8x" />
+ <Add ref="#Camera" controlledproperty="$cameraRotInput rotation" pivot="0 0 0" position="0 0 -800" rotation="0 0 0" />
+ <Add ref="#Light" castshadow="True" controlledproperty="$colorInput lightdiffuse" lightdiffuse="1 0 0" lighttype="Point" position="-300.444 70.829 -30" shdwfactor="11.89" shdwfilter="6.94" shdwmapres="11" />
+ <State id="Scene-Slide1" name="Slide1" initialplaystate="Pause" >
+ <Add ref="#Text" name="Text" controlledproperty="$stringInput textstring" font="TitilliumWeb-Regular" position="216.513 76.6172 -113.498" scale="1 1 1" size="24" textstring="0" >
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 0 0 0 10 0 0 0</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 0 0 10 0 0 0</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 0 0 10 -360 0 0</AnimationTrack>
+ </Add>
+ <Add ref="#Text2" name="Text2" controlledproperty="" font="TitilliumWeb-Regular" position="259.808 217.95 0" scale="1 1 1" size="16" textstring="Text control&#10;Rotation animation control via datainput timeline control" />
+ <Add ref="#Cone" name="Cone" controlledproperty="$scaleInput scale" position="-417.135 -225.166 0" sourcepath="#Cone" />
+ <Add ref="#Default" />
+ <Add ref="#Cylinder" name="Cylinder" controlledproperty="$variantInput opacity" position="131.347 -180.422 0" sourcepath="#Cylinder" />
+ <Add ref="#Default_002" diffuse="0.666667 1 0.498039" />
+ <Add ref="#Text6" name="Text6" font="TitilliumWeb-Regular" position="135.678 -300.019 -8.28656" size="16" textstring="Opacity control&#10;(Variant type)" />
+ <Add ref="#Text8" name="Text8" font="TitilliumWeb-Regular" position="-428.683 -290.118 0" size="16" textstring="Scale control" />
+ <Add ref="#Cube2" name="Cube2" controlledproperty="$cameraRotInput rotation" position="409.919 -177.535 0" sourcepath="#Cube" />
+ <Add ref="#Default_003" controlledproperty="" />
+ <Add ref="#Text3" name="Text3" font="TitilliumWeb-Regular" position="434.456 -304.552 0" size="16" textstring="Rotation control&#10;Diffuse color control" />
+ <Add ref="#Text4" name="Text4" font="TitilliumWeb-Regular" position="-381.051 290.118 0" size="18" textstring="Directional light color control&#10;Camera xy rotation control" />
+ <Add ref="#Rectangle" name="Rectangle" position="0 -400 20" rotation="90.5 0 0" scale="11.0468 7.99191 9.12813" sourcepath="#Rectangle" />
+ <Add ref="#Default_001" diffuse="0.623529 0.623529 0.623529" diffusemap="#Default_001_diffusemap" />
+ <Add ref="#Default_001_diffusemap" sourcepath="Paper05.png" />
+ <Add ref="#Text5" name="Text5" controlledproperty="$queriedInput textstring" font="TitilliumWeb-Regular" position="-57.7348 3.84888 0" textstring="Text from queried QML Datainput" />
+ </State>
+ </State>
+ </Logic>
+ </Project>
+</UIP>
diff --git a/examples/studio3d/qmldatainput/presentation/fonts/TitilliumWeb-Regular.ttf b/examples/studio3d/qmldatainput/presentation/fonts/TitilliumWeb-Regular.ttf
new file mode 100644
index 0000000..6da8219
--- /dev/null
+++ b/examples/studio3d/qmldatainput/presentation/fonts/TitilliumWeb-Regular.ttf
Binary files differ
diff --git a/examples/studio3d/qmldatainput/qml/qmldatainput/main.qml b/examples/studio3d/qmldatainput/qml/qmldatainput/main.qml
new file mode 100644
index 0000000..ab50796
--- /dev/null
+++ b/examples/studio3d/qmldatainput/qml/qmldatainput/main.qml
@@ -0,0 +1,211 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.7
+import QtStudio3D.OpenGL 2.4
+
+Item {
+ id: mainview
+ width: 1280
+ height: 768
+ visible: true
+
+ // Show the list of datainputs queried by Q3DSPresentation queried from Presentation
+ Column {
+ id : diColumn
+ opacity: 50
+ z: 1
+
+ Text { text: "Datainputs"; color: "red"; bottomPadding: 5; }
+
+ Repeater {
+ id: diList
+ height: childrenRect.height
+
+ property var diObjList
+
+ model: diObjList
+
+ function updateModel() {
+ diObjList = studio3D.presentation.getDataInputs();
+
+ for (var i = 0; i < count; ++i) {
+ // Use dynamically queried datainput to set value.
+ if (diObjList[i].name === "queriedInput") {
+ console.log("Updating " + diObjList[i].name);
+ diObjList[i].value = "This text is controlled by " + diObjList[i].name;
+ }
+ }
+ }
+
+ Text {
+ id: diItem
+ color: "white"
+ // Show the metadata keys available for this datainput and
+ // min-max range for datainput type Ranged Number
+ text: "name: " + modelData.name
+ + (modelData.max !== 0 ? "\n range min: " + modelData.min
+ + "\n range max: " + modelData.max
+ : "")
+ + " \n metadata keys: [" + modelData.metadataKeys() + "]"
+ font.pointSize: 6
+ }
+ }
+ }
+
+ Studio3D {
+ id: studio3D
+ anchors.fill: parent
+ height: 900
+ width: 1280
+
+ property real inputNumber: 0
+ property vector3d inputColorVec3: Qt.vector3d(0, 0, 0)
+ property vector3d inputCamRotVec3: Qt.vector3d(0, 0, 0)
+ property vector3d inputScaleVec3: Qt.vector3d(0, 0, 0)
+ property string inputString: ""
+ property variant inputVariant: 0
+
+ onPresentationLoaded: {
+ diList.updateModel();
+ }
+
+ // A changing property to demonstrate DataInput
+ NumberAnimation {
+ target: studio3D
+ property: "inputNumber"
+ duration: 20000
+ from: 0
+ to: 360
+ loops: Animation.Infinite
+ running: true
+ }
+ Vector3dAnimation {
+ target: studio3D
+ property: "inputScaleVec3"
+ duration: 12000
+ from: Qt.vector3d(0.3, 0.5, 0.5)
+ to: Qt.vector3d(4.0, 4.0, 1.0)
+ loops: Animation.Infinite
+ running: true
+ }
+ Vector3dAnimation {
+ target: studio3D
+ property: "inputColorVec3"
+ duration: 6000
+ from: Qt.vector3d(0.1, 0.1, 0.3)
+ to: Qt.vector3d(1.0, 0.5, 1.0)
+ loops: Animation.Infinite
+ running: true
+ }
+ Vector3dAnimation {
+ target: studio3D
+ property: "inputCamRotVec3"
+ duration: 20000
+ from: Qt.vector3d(-5, -5, 0.0)
+ to: Qt.vector3d(10.0, 10.1, 10.0)
+ loops: Animation.Infinite
+ running: true
+ }
+ NumberAnimation {
+ target: studio3D
+ property: "inputString"
+ duration: 20000
+ from: 0
+ to: 1
+ loops: Animation.Infinite
+ running: true
+ }
+ NumberAnimation {
+ target: studio3D
+ property: "inputVariant"
+ duration: 5000
+ from: 20
+ to: 100
+ loops: Animation.Infinite
+ running: true
+ }
+
+ // Presentation item is used to control the presentation.
+ //![1]
+ Presentation {
+ id: presentation
+
+ source: "qrc:/presentation/datainput.uia"
+ DataInput {
+ // Name must match the data input name specified in the presentation
+ name: "rangeInput"
+ value: studio3D.inputNumber
+ }
+ DataInput {
+ name: "scaleInput"
+ value: studio3D.inputScaleVec3
+ }
+ DataInput {
+ name: "colorInput"
+ value: studio3D.inputColorVec3
+ }
+ DataInput {
+ name: "cameraRotInput"
+ value: studio3D.inputCamRotVec3
+ }
+ DataInput {
+ name: "stringInput"
+ value: studio3D.inputString
+ }
+ DataInput {
+ name: "variantInput"
+ value: studio3D.inputVariant
+ }
+ }
+ //![1]
+ }
+
+}
diff --git a/examples/studio3d/qmldatainput/qmldatainput.pro b/examples/studio3d/qmldatainput/qmldatainput.pro
new file mode 100644
index 0000000..9bafed5
--- /dev/null
+++ b/examples/studio3d/qmldatainput/qmldatainput.pro
@@ -0,0 +1,20 @@
+TEMPLATE = app
+
+QT += widgets qml quick studio3d
+
+integrity: DEFINES += USE_EMBEDDED_FONTS
+
+target.path = $$[QT_INSTALL_EXAMPLES]/studio3d/$$TARGET
+INSTALLS += target
+
+SOURCES += main.cpp
+
+RESOURCES += \
+ qmldatainput.qrc
+
+OTHER_FILES += qml/qmldatainput/* \
+ doc/src/* \
+ doc/images/*
+
+# Icon in case example is included in installer
+exists(example.ico): RC_ICONS = example.ico
diff --git a/examples/studio3d/qmldatainput/qmldatainput.qrc b/examples/studio3d/qmldatainput/qmldatainput.qrc
new file mode 100644
index 0000000..97aaeaa
--- /dev/null
+++ b/examples/studio3d/qmldatainput/qmldatainput.qrc
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmldatainput/main.qml</file>
+ <file>presentation/datainput.uia</file>
+ <file>presentation/datainput.uip</file>
+ <file>presentation/Paper05.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/studio3d/simpleqml/doc/images/simpleqml.png b/examples/studio3d/simpleqml/doc/images/simpleqml.png
new file mode 100644
index 0000000..73d9207
--- /dev/null
+++ b/examples/studio3d/simpleqml/doc/images/simpleqml.png
Binary files differ
diff --git a/examples/studio3d/simpleqml/doc/src/simpleqml.qdoc b/examples/studio3d/simpleqml/doc/src/simpleqml.qdoc
new file mode 100644
index 0000000..a7dcec7
--- /dev/null
+++ b/examples/studio3d/simpleqml/doc/src/simpleqml.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example simpleqml
+ \title Qt 3D Studio Runtime: Simple QML Example
+ \ingroup OpenGLRuntime-examples-qml
+ \brief Demonstrates using the Studio3D element in a Qt Quick application.
+
+ \image simpleqml.png
+
+ \e {This example demonstrates basic usage of the Studio3D element in Qt Quick applications}
+
+ \include examples-run.qdocinc
+
+ \section1 Description
+
+ This example consists of a simple C++ main() function that sets up
+ a QQuickView and a QML scene demonstrating the usage of the \l
+ Studio3D, \l Presentation, \l DataInput, \l SceneElement, and \l
+ Element QML types.
+
+ Besides displaying the presentation designed in the Qt 3D Studio
+ application, a few simple cases of interacting with the scene
+ (such as, changing 3D object properties via data input, changing
+ slides, controlling the timeline) are also demonstrated.
+*/
diff --git a/examples/studio3d/simpleqml/main.cpp b/examples/studio3d/simpleqml/main.cpp
new file mode 100644
index 0000000..f2640b5
--- /dev/null
+++ b/examples/studio3d/simpleqml/main.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtWidgets/QApplication> // for MessageDialog
+#include <QtQuick/QQuickView>
+#include <qstudio3dglobal.h>
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ qputenv("QSG_INFO", "1");
+ QApplication app(argc, argv);
+
+ // Use the ideal format (i.e. OpenGL version and profile) recommended by
+ // the Qt 3D Studio runtime. Without this the format set on the QQuickView
+ // would be used instead.
+ QSurfaceFormat::setDefaultFormat(Q3DS::surfaceFormat());
+
+ QQuickView viewer;
+ viewer.setSource(QUrl("qrc:/main.qml"));
+
+ viewer.setTitle(QStringLiteral("Qt 3D Studio Example"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.resize(1280, 720);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/studio3d/simpleqml/main.qml b/examples/studio3d/simpleqml/main.qml
new file mode 100644
index 0000000..06321a7
--- /dev/null
+++ b/examples/studio3d/simpleqml/main.qml
@@ -0,0 +1,284 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtStudio3D.OpenGL 2.4
+import QtQuick.Window 2.3
+import QtQuick.Controls 2.2
+import QtQuick.Layouts 1.3
+import Qt.labs.platform 1.0
+
+Rectangle {
+ id: root
+ color: "lightGray"
+
+ MessageDialog {
+ id: errorDialog
+ }
+
+ Studio3D {
+ id: s3d
+ focus: true
+ anchors.margins: 60
+ anchors.fill: parent
+ property string textValue: "hello world"
+
+ Presentation {
+ id: s3dpres
+ source: "qrc:/presentation/barrel.uip"
+ onCustomSignalEmitted: customSignalName.text = Date.now() + ": " + name
+ onSlideEntered: slideEnter.text = "Entered slide " + name + "(index " + index + ") on " + elementPath
+ onSlideExited: slideExit.text = "Exited slide " + name + "(index " + index + ") on " + elementPath
+
+ DataInput {
+ name: "di_text"
+ value: s3d.textValue
+ }
+
+ SceneElement {
+ id: sceneElementForScene
+ elementPath: "Scene" // could also refer to a Component node instead
+ onCurrentSlideIndexChanged: console.log("Current slide index for 'Scene': " + currentSlideIndex)
+ onCurrentSlideNameChanged: console.log("Current slide name for 'Scene': " + currentSlideName)
+ }
+
+ // Exercise Element a bit. This is no different from using the
+ // functions on Presentations, just avoids the need to specify the
+ // name/path repeatedly.
+ Element {
+ id: barrelRef
+ elementPath: "Barrel" // or Scene.Layer.Barrel but as long as it's unique the name's good enough
+ }
+ }
+ ignoredEvents: mouseEvCb.checked ? Studio3D.EnableAllEvents : (Studio3D.IgnoreMouseEvents | Studio3D.IgnoreWheelEvents)
+ onRunningChanged: console.log("running: " + s3d.running)
+ onPresentationReady: console.log("presentationReady")
+ onErrorChanged: {
+ if (s3d.error !== "") {
+ errorDialog.text = s3d.error;
+ errorDialog.open();
+ }
+ }
+
+ property int frameCount: 0
+ onFrameUpdate: frameCount += 1
+
+ Timer {
+ running: true
+ repeat: true
+ interval: 1000
+ onTriggered: {
+ fpsCount.text = "~" + s3d.frameCount + " FPS";
+ s3d.frameCount = 0;
+ }
+ }
+
+ Timer {
+ interval: 2000
+ running: true
+ repeat: true
+ }
+
+ NumberAnimation on opacity {
+ id: opacityAnimation
+ from: 1
+ to: 0
+ duration: 5000
+ running: false
+ onStopped: s3d.opacity = 1
+ }
+ }
+
+ Window {
+ id: w
+ visible: false
+ width: 500
+ height: 500
+ Item {
+ id: wroot
+ anchors.fill: parent
+ }
+ title: "Second window"
+ }
+
+ RowLayout {
+ Button {
+ text: "Move to other window"
+ onClicked: {
+ w.visible = true;
+ if (s3d.parent === wroot) s3d.parent = root; else s3d.parent = wroot;
+ }
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ text: "Open barrel without background"
+ onClicked: s3dpres.source = "qrc:/presentation/barrel_no_background.uip"
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ text: "Animate opacity"
+ onClicked: opacityAnimation.running = true
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ text: "Reload"
+ onClicked: s3dpres.reload()
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ text: "Open"
+ onClicked: openDialog.open()
+ focusPolicy: Qt.NoFocus
+ }
+ CheckBox {
+ id: mouseEvCb
+ text: "Let mouse events through"
+ checked: true
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ text: "Toggle camera"
+ onClicked: {
+ var v = s3dpres.getAttribute("Scene.Layer.Camera", "eyeball")
+ s3dpres.setAttribute("Scene.Layer.Camera", "eyeball", !v)
+ }
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ text: "Send new data input value"
+ property int invocationCount: 0
+ onClicked: s3d.textValue = "Data input value " + (++invocationCount)
+ focusPolicy: Qt.NoFocus
+ }
+ }
+
+ Text {
+ id: fpsCount
+ text: "0 FPS"
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ }
+ Text {
+ id: customSignalName
+ anchors.bottom: parent.bottom
+ anchors.left: fpsCount.right
+ anchors.leftMargin: 8
+ }
+ Text {
+ id: slideEnter
+ anchors.bottom: parent.bottom
+ anchors.left: customSignalName.right
+ anchors.leftMargin: 8
+ }
+ Text {
+ id: slideExit
+ anchors.bottom: parent.bottom
+ anchors.left: slideEnter.right
+ anchors.leftMargin: 8
+ }
+ Button {
+ id: nextSlideByIndex
+ text: "Next slide (via pres., wrap)"
+ anchors.left: parent.left
+ anchors.bottom: fpsCount.top
+ onClicked: s3dpres.goToSlide("Scene", true, true)
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ id: seekBtn
+ text: "Seek to 5 seconds (via pres.)"
+ anchors.left: nextSlideByIndex.right
+ anchors.bottom: fpsCount.top
+ onClicked: s3dpres.goToTime("Scene", 5)
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ id: nextSlideViaSceneElement
+ text: "Next slide (via SceneElement, no wrap)"
+ anchors.left: seekBtn.right
+ anchors.bottom: fpsCount.top
+ onClicked: sceneElementForScene.currentSlideIndex += 1
+ focusPolicy: Qt.NoFocus
+ }
+ Button {
+ id: seekBtn2
+ text: "Seek to 5 seconds (via SceneElement)"
+ anchors.left: nextSlideViaSceneElement.right
+ anchors.bottom: fpsCount.top
+ onClicked: sceneElementForScene.goToTime(5)
+ focusPolicy: Qt.NoFocus
+ }
+
+ Button {
+ id: profTogBtn
+ text: "Toggle profile UI"
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ focusPolicy: Qt.NoFocus
+ onClicked: s3dpres.profileUiVisible = !s3dpres.profileUiVisible
+ }
+ Slider {
+ id: profUiScale
+ width: profTogBtn.width
+ anchors.right: profTogBtn.left
+ anchors.bottom: parent.bottom
+ from: 50
+ to: 400
+ value: 100
+ focusPolicy: Qt.NoFocus
+ }
+
+ FileDialog {
+ id: openDialog
+ fileMode: FileDialog.OpenFile
+ nameFilters: ["UIP files (*.uip)", "UIA files (*.uia)", "All files (*)"]
+ onAccepted: s3dpres.source = file
+ }
+}
diff --git a/examples/studio3d/simpleqml/presentation/barrel.uia b/examples/studio3d/simpleqml/presentation/barrel.uia
new file mode 100644
index 0000000..d936e42
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/barrel.uia
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<application>
+ <assets initial="barrel">
+ <dataInput name="di_text" type="String"/>
+ <presentation id="barrel" src="barrel.uip"/>
+ </assets>
+ <statemachine ref="#logic">
+ <visual-states>
+ <state ref="Initial">
+ <enter>
+ <goto-slide element="main:Scene" rel="next"/>
+ </enter>
+ </state>
+ </visual-states>
+ </statemachine>
+</application>
diff --git a/examples/studio3d/simpleqml/presentation/barrel.uip b/examples/studio3d/simpleqml/presentation/barrel.uip
new file mode 100644
index 0000000..48b4edc
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/barrel.uip
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<UIP version="6" >
+ <Project >
+ <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" >
+ <CustomColors count="16" >#ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
+ </ProjectSettings>
+ <Graph >
+ <Scene id="Scene" >
+ <Layer id="Layer" >
+ <Camera id="Camera" />
+ <Light id="Light" />
+ <Model id="Barrel" >
+ <Material id="Material" >
+ <Image id="Material_diffusemap" />
+ <Image id="Material_normalmap" />
+ <Image id="Material_emissivemap" />
+ <Image id="Material_specularmap" />
+ </Material>
+ </Model>
+ <Text id="Text" />
+ <Text id="Text2" />
+ </Layer>
+ </Scene>
+ </Graph>
+ <Logic >
+ <State name="Master Slide" component="#Scene" >
+ <Add ref="#Layer" />
+ <Add ref="#Camera" />
+ <Add ref="#Light" />
+ <State id="Scene-Slide1" name="Slide1" playmode="Looping" >
+ <Add ref="#Barrel" name="Barrel" position="0 -42 -483" rotation="90 0 0" scale="100 100 100" sourcepath=".\barrel\meshes\Barrel.mesh#1" >
+ <AnimationTrack property="opacity" type="EaseInOut" />
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 90 100 100 5 64 100 100 10 90 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 5 -302 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 100 100 5 0 100 100 10 0 100 100</AnimationTrack>
+ </Add>
+ <Add ref="#Material" bumpamount="0" diffuse="1 1 1" diffusemap="#Material_diffusemap" emissivemap="#Material_emissivemap" fresnelPower="25" normalmap="#Material_normalmap" specularamount="4" specularmap="#Material_specularmap" specularmodel="Default" specularroughness="0.001" >
+ <AnimationTrack property="bumpamount" type="EaseInOut" >0 0 100 100 5 1 100 100</AnimationTrack>
+ </Add>
+ <Add ref="#Material_diffusemap" sourcepath=".\maps\barrel_barrel_Diffuse.png" />
+ <Add ref="#Material_normalmap" sourcepath=".\maps\barrel_barrel_Normal.png" />
+ <Add ref="#Material_emissivemap" sourcepath=".\maps\barrel_barrel_Emissive.png" />
+ <Add ref="#Material_specularmap" sourcepath=".\maps\barrel_barrel_Specular.png" />
+ <Add ref="#Text" name="Text" font="Arimo-Regular" position="-486.418 297.128 50.5569" textcolor="0 1 0" textstring="Barrel!" tracking="0" >
+ <AnimationTrack property="opacity" type="EaseInOut" >0 100 100 100 5.009 43.75 100 100 10 100 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 360 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.x" type="EaseInOut" >0 0 100 100 5.009 0.501961 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.y" type="EaseInOut" >0 1 100 100 5.009 0.235294 100 100 10 1 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.z" type="EaseInOut" >0 0 100 100 5.009 0.333333 100 100 10 0 100 100</AnimationTrack>
+ </Add>
+ <Add ref="#Text2" name="Text2" controlledproperty="di_text textstring" font="Arimo-Regular" position="435.899 267.025 0" />
+ </State>
+ </State>
+ </Logic>
+ </Project>
+</UIP>
diff --git a/examples/studio3d/simpleqml/presentation/barrel/barrel.import b/examples/studio3d/simpleqml/presentation/barrel/barrel.import
new file mode 100644
index 0000000..cf56bb4
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/barrel/barrel.import
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<UIP Version="1" >
+ <Project Revision="1" >
+ <Graph >
+ <Group id="__import__root__" >
+ <Model id="Barrel" name="Barrel" orientation="Right Handed" position="0 0 -0" rotation="-90 -0 0" rotationorder="XYZr" scale="100 100 100" sourcepath=".\meshes\Barrel.mesh#1" >
+ <Material id="Barrel_0001" name="Barrel" blendmode="Normal" diffuse="0.64 0.64 0.64" emissivepower="0" opacity="100" specularamount="0" specularroughness="9.60784" />
+ </Model>
+ </Group>
+ </Graph>
+ <Import SrcFile="..\..\..\barrel.fbx" ImageDir="Images" MeshDir="Meshes" >
+ <Mesh >
+ <Source >Barrel</Source>
+ <Dest >.\meshes\Barrel.mesh</Dest>
+ </Mesh>
+ </Import>
+ </Project>
+</UIP>
diff --git a/examples/studio3d/simpleqml/presentation/barrel/meshes/Barrel.mesh b/examples/studio3d/simpleqml/presentation/barrel/meshes/Barrel.mesh
new file mode 100644
index 0000000..1d935a4
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/barrel/meshes/Barrel.mesh
Binary files differ
diff --git a/examples/studio3d/simpleqml/presentation/barrel_no_background.uip b/examples/studio3d/simpleqml/presentation/barrel_no_background.uip
new file mode 100644
index 0000000..aef5ddb
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/barrel_no_background.uip
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<UIP version="4" >
+ <Project >
+ <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" >
+ <CustomColors count="16" >#ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
+ </ProjectSettings>
+ <Graph >
+ <Scene id="Scene" bgcolorenable="False" >
+ <Layer id="Layer" >
+ <Camera id="Camera" />
+ <Light id="Light" />
+ <Model id="Barrel" >
+ <Material id="Material" >
+ <Image id="Material_diffusemap" />
+ <Image id="Material_normalmap" />
+ <Image id="Material_emissivemap" />
+ <Image id="Material_specularmap" />
+ </Material>
+ </Model>
+ <Text id="Text" />
+ </Layer>
+ </Scene>
+ </Graph>
+ <Logic >
+ <State name="Master Slide" component="#Scene" >
+ <Add ref="#Layer" />
+ <Add ref="#Camera" />
+ <Add ref="#Light" />
+ <State id="Scene-Slide1" name="Slide1" playmode="Looping" >
+ <Add ref="#Barrel" name="Barrel" position="0 -42 -483" rotation="90 0 0" scale="100 100 100" sourcepath=".\barrel\meshes\Barrel.mesh#1" >
+ <AnimationTrack property="opacity" type="EaseInOut" />
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 90 100 100 5 64 100 100 10 90 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 5 -302 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 100 100 5 0 100 100 10 0 100 100</AnimationTrack>
+ </Add>
+ <Add ref="#Material" bumpamount="0" diffusemap="#Material_diffusemap" emissivemap="#Material_emissivemap" fresnelPower="25" normalmap="#Material_normalmap" specularamount="4" specularmap="#Material_specularmap" specularmodel="Default" specularroughness="0.001" >
+ <AnimationTrack property="bumpamount" type="EaseInOut" >0 0 100 100 5 1 100 100</AnimationTrack>
+ </Add>
+ <Add ref="#Material_diffusemap" sourcepath=".\maps\barrel_barrel_Diffuse.png" />
+ <Add ref="#Material_normalmap" sourcepath=".\maps\barrel_barrel_Normal.png" />
+ <Add ref="#Material_emissivemap" sourcepath=".\maps\barrel_barrel_Emissive.png" />
+ <Add ref="#Material_specularmap" sourcepath=".\maps\barrel_barrel_Specular.png" />
+ <Add ref="#Text" name="Text" font="Arimo-Regular" position="-486.418 297.128 50.5569" textcolor="0 1 0" textstring="Barrel!" tracking="0" >
+ <AnimationTrack property="opacity" type="EaseInOut" >0 100 100 100 5.009 43.75 100 100 10 100 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 360 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.x" type="EaseInOut" >0 0 100 100 5.009 0.501961 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.y" type="EaseInOut" >0 1 100 100 5.009 0.235294 100 100 10 1 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.z" type="EaseInOut" >0 0 100 100 5.009 0.333333 100 100 10 0 100 100</AnimationTrack>
+ </Add>
+ </State>
+ </State>
+ </Logic>
+ </Project>
+</UIP>
diff --git a/examples/studio3d/simpleqml/presentation/fonts/Arimo-Regular.ttf b/examples/studio3d/simpleqml/presentation/fonts/Arimo-Regular.ttf
new file mode 100644
index 0000000..720d419
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/fonts/Arimo-Regular.ttf
Binary files differ
diff --git a/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Diffuse.png b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Diffuse.png
new file mode 100644
index 0000000..426f129
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Diffuse.png
Binary files differ
diff --git a/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Emissive.png b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Emissive.png
new file mode 100644
index 0000000..b6be9f3
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Emissive.png
Binary files differ
diff --git a/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Normal.png b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Normal.png
new file mode 100644
index 0000000..4e16c47
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Normal.png
Binary files differ
diff --git a/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Specular.png b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Specular.png
new file mode 100644
index 0000000..1882559
--- /dev/null
+++ b/examples/studio3d/simpleqml/presentation/maps/barrel_barrel_Specular.png
Binary files differ
diff --git a/examples/studio3d/simpleqml/simpleqml.pro b/examples/studio3d/simpleqml/simpleqml.pro
new file mode 100644
index 0000000..62afa78
--- /dev/null
+++ b/examples/studio3d/simpleqml/simpleqml.pro
@@ -0,0 +1,16 @@
+TEMPLATE = app
+
+QT += widgets qml quick studio3d
+
+SOURCES += \
+ main.cpp
+
+RESOURCES += simpleqml.qrc
+
+OTHER_FILES += \
+ main.qml \
+ doc/src/* \
+ doc/images/*
+
+target.path = $$[QT_INSTALL_EXAMPLES]/studio3d/$$TARGET
+INSTALLS += target
diff --git a/examples/studio3d/simpleqml/simpleqml.qrc b/examples/studio3d/simpleqml/simpleqml.qrc
new file mode 100644
index 0000000..bc843a9
--- /dev/null
+++ b/examples/studio3d/simpleqml/simpleqml.qrc
@@ -0,0 +1,14 @@
+<RCC>
+ <qresource prefix="/">
+ <file>main.qml</file>
+ <file>presentation/barrel.uip</file>
+ <file>presentation/barrel.uia</file>
+ <file>presentation/barrel_no_background.uip</file>
+ <file>presentation/barrel/meshes/Barrel.mesh</file>
+ <file>presentation/fonts/Arimo-Regular.ttf</file>
+ <file>presentation/maps/barrel_barrel_Diffuse.png</file>
+ <file>presentation/maps/barrel_barrel_Emissive.png</file>
+ <file>presentation/maps/barrel_barrel_Normal.png</file>
+ <file>presentation/maps/barrel_barrel_Specular.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/studio3d/studio3d.pro b/examples/studio3d/studio3d.pro
new file mode 100644
index 0000000..f51add1
--- /dev/null
+++ b/examples/studio3d/studio3d.pro
@@ -0,0 +1,9 @@
+TEMPLATE = subdirs
+
+SUBDIRS += \
+ cppdatainput
+
+qtHaveModule(quick) {
+ SUBDIRS += simpleqml \
+ qmldatainput
+}
diff --git a/ogl-runtime.pro b/ogl-runtime.pro
new file mode 100644
index 0000000..e4bac15
--- /dev/null
+++ b/ogl-runtime.pro
@@ -0,0 +1,32 @@
+requires(!ios)
+requires(!integrity)
+requires(!qnx)
+requires(!tvos)
+requires(!watchos)
+requires(!winrt)
+requires(!wasm)
+
+ios|integrity|qnx|tvos|watchos|winrt|wasm|*-icc*: {
+ message("WARNING, target excluded from ogl-runtime")
+ #Exclude non-working cross-compile targets, see:
+ # QT3DS-3645 ogl-runtime doesn't compile on INTEGRITY_11_04 in CI
+ # QT3DS-3647 ogl-runtime doesn't compile on TvOS_ANY in CI
+ # QT3DS-3648 ogl-runtime doesn't compile on WatchOS_ANY in CI
+ # QT3DS-3646 ogl-runtime doesn't compile on IOS_ANY in CI
+ # QT3DS-3649 ogl-runtime doesn't compile on WinRT in CI
+ # QT3DS-3650 ogl-runtime doesn't compile on WebAssembly in CI
+ # QT3DS-3652 ogl-runtime doesn't compile on QNX in CI
+ TEMPLATE = subdirs
+ CONFIG += ordered
+ SUBDIRS += src_dummy
+} else {
+ contains(QMAKE_TARGET.os, WinRT)|contains(QMAKE_TARGET.os, TvOS)|contains(QMAKE_TARGET.os, IOS)|contains(QMAKE_TARGET.os, WatchOS)|contains(QMAKE_TARGET.os, INTEGRITY)|contains(QMAKE_TARGET.os, QNX) {
+ message("WARNING, target OS excluded from ogl-runtime")
+ TEMPLATE = subdirs
+ CONFIG += ordered
+ SUBDIRS += src_dummy
+ } else {
+ load(qt_parts)
+ requires(qtHaveModule(opengl))
+ }
+}
diff --git a/platformres.qrc b/platformres.qrc
new file mode 100644
index 0000000..af8a564
--- /dev/null
+++ b/platformres.qrc
@@ -0,0 +1,4 @@
+<RCC>
+ <qresource prefix="/">
+ </qresource>
+</RCC>
diff --git a/res.qrc b/res.qrc
new file mode 100644
index 0000000..c5c59b2
--- /dev/null
+++ b/res.qrc
@@ -0,0 +1,117 @@
+<RCC>
+ <qresource prefix="/">
+ <file>res/DataModelMetadata/en-us/MetaData.xml</file>
+ <file>res/effectlib/abbeNumberIOR.glsllib</file>
+ <file>res/effectlib/anisotropyConversion.glsllib</file>
+ <file>res/effectlib/average.glsllib</file>
+ <file>res/effectlib/blendColorLayers.glsllib</file>
+ <file>res/effectlib/blur.glsllib</file>
+ <file>res/effectlib/calculateRoughness.glsllib</file>
+ <file>res/effectlib/coordinateSource.glsllib</file>
+ <file>res/effectlib/cube.glsllib</file>
+ <file>res/effectlib/customCurveLayer.glsllib</file>
+ <file>res/effectlib/customMaterial.glsllib</file>
+ <file>res/effectlib/customMaterialFragBody.glsllib</file>
+ <file>res/effectlib/customMaterialFragBodyAO.glsllib</file>
+ <file>res/effectlib/defaultMaterialFresnel.glsllib</file>
+ <file>res/effectlib/funcdiffuseReflectionWrapBSDF.glsllib</file>
+ <file>res/effectlib/funcsampleAreaGlossyDefault.glsllib</file>
+ <file>res/effectlib/funccomputeMicroHit.glsllib</file>
+ <file>res/effectlib/funcgetTransformedUVCoords.glsllib</file>
+ <file>res/effectlib/funcareaLightVars.glsllib</file>
+ <file>res/effectlib/funcspecularBSDF.glsllib</file>
+ <file>res/effectlib/funccalculateDiffuseAreaOld.glsllib</file>
+ <file>res/effectlib/funccalculatePointLightAttenuation.glsllib</file>
+ <file>res/effectlib/defaultMaterialLighting.glsllib</file>
+ <file>res/effectlib/defaultMaterialPhysGlossyBSDF.glsllib</file>
+ <file>res/effectlib/depthpass.glsllib</file>
+ <file>res/effectlib/dfTint.glsllib</file>
+ <file>res/effectlib/funcdiffuseReflectionBSDF.glsllib</file>
+ <file>res/effectlib/diffuseReflectionBSDF.glsllib</file>
+ <file>res/effectlib/diffuseTransmissionBSDF.glsllib</file>
+ <file>res/effectlib/directionalFactor.glsllib</file>
+ <file>res/effectlib/effect.glsllib</file>
+ <file>res/effectlib/evalBakedShadowMap.glsllib</file>
+ <file>res/effectlib/evalEnvironmentMap.glsllib</file>
+ <file>res/effectlib/evalLightmaps.glsllib</file>
+ <file>res/effectlib/fileBumpTexture.glsllib</file>
+ <file>res/effectlib/fileDisplacementTexture.glsllib</file>
+ <file>res/effectlib/fileTexture.glsllib</file>
+ <file>res/effectlib/flakeNoiseBumpTexture.glsllib</file>
+ <file>res/effectlib/flakeNoiseTexture.glsllib</file>
+ <file>res/effectlib/fresnelLayer.glsllib</file>
+ <file>res/effectlib/Fxaa3_11.glsllib</file>
+ <file>res/effectlib/Fxaa3_8.glsllib</file>
+ <file>res/effectlib/gradient3Recolor.glsllib</file>
+ <file>res/effectlib/gradient3Texture.glsllib</file>
+ <file>res/effectlib/gradientGetPosition.glsllib</file>
+ <file>res/effectlib/luminance.glsllib</file>
+ <file>res/effectlib/microfacetBSDF.glsllib</file>
+ <file>res/effectlib/miNoise.glsllib</file>
+ <file>res/effectlib/monoChannel.glsllib</file>
+ <file>res/effectlib/normalizedMix.glsllib</file>
+ <file>res/effectlib/perlinNoise.glsllib</file>
+ <file>res/effectlib/perlinNoiseBumpTexture.glsllib</file>
+ <file>res/effectlib/perlinNoiseTexture.glsllib</file>
+ <file>res/effectlib/physGlossyBSDF.glsllib</file>
+ <file>res/effectlib/random255.glsllib</file>
+ <file>res/effectlib/refraction.glsllib</file>
+ <file>res/effectlib/rotationTranslationScale.glsllib</file>
+ <file>res/effectlib/sampleArea.glsllib</file>
+ <file>res/effectlib/funcsampleLightVars.glsllib</file>
+ <file>res/effectlib/sampleLight.glsllib</file>
+ <file>res/effectlib/sampleProbe.glsllib</file>
+ <file>res/effectlib/screenSpaceAO.glsllib</file>
+ <file>res/effectlib/screenSpaceDO.glsllib</file>
+ <file>res/effectlib/shadowMapping.glsllib</file>
+ <file>res/effectlib/shadowMappingFragment.glsllib</file>
+ <file>res/effectlib/simpleGlossyBSDF.glsllib</file>
+ <file>res/effectlib/SMAA.glsllib</file>
+ <file>res/effectlib/specularBSDF.glsllib</file>
+ <file>res/effectlib/spotEdf.glsllib</file>
+ <file>res/effectlib/square.glsllib</file>
+ <file>res/effectlib/SSAOCustomMaterial.glsllib</file>
+ <file>res/effectlib/tangentSpaceNormalTexture.glsllib</file>
+ <file>res/effectlib/tessellationLinear.glsllib</file>
+ <file>res/effectlib/tessellationLinearCM.glsllib</file>
+ <file>res/effectlib/tessellationNPatch.glsllib</file>
+ <file>res/effectlib/tessellationNPatchCM.glsllib</file>
+ <file>res/effectlib/tessellationPath.glsllib</file>
+ <file>res/effectlib/tessellationPhong.glsllib</file>
+ <file>res/effectlib/tessellationPhongCM.glsllib</file>
+ <file>res/effectlib/textureCoordinateInfo.glsllib</file>
+ <file>res/effectlib/transformCoordinate.glsllib</file>
+ <file>res/effectlib/defaultMaterialFileBumpTexture.glsllib</file>
+ <file>res/effectlib/defaultMaterialBumpNoLod.glsllib</file>
+ <file>res/effectlib/defaultMaterialFileDisplacementTexture.glsllib</file>
+ <file>res/effectlib/defaultMaterialFileNormalTexture.glsllib</file>
+ <file>res/effectlib/vertexFragmentBase.glsllib</file>
+ <file>res/effectlib/viewProperties.glsllib</file>
+ <file>res/effectlib/weightedLayer.glsllib</file>
+ <file>res/effectlib/wireframeCM.glsllib</file>
+ <file>res/effectlib/gles2/funcsampleLightVars.glsllib</file>
+ <file>res/effectlib/gles2/sampleProbe.glsllib</file>
+ <file>res/effectlib/gles2/SSAOCustomMaterial.glsllib</file>
+ <file>res/effectlib/gles2/funcareaLightVars.glsllib</file>
+ <file>res/effectlib/gles2/monoChannel.glsllib</file>
+ <file>res/effectlib/gles2/shadowMapping.glsllib</file>
+ <file>res/effectlib/gles2/tangentSpaceNormalTexture.glsllib</file>
+ <file>res/effectlib/gles2/defaultMaterialBumpNoLod.glsllib</file>
+ <file>res/effectlib/gles2/evalEnvironmentMap.glsllib</file>
+ <file>res/effectlib/gles2/microfacetBSDF.glsllib</file>
+ <file>res/primitives/Cone.mesh</file>
+ <file>res/primitives/Cube.mesh</file>
+ <file>res/primitives/Cylinder.mesh</file>
+ <file>res/primitives/Rectangle.mesh</file>
+ <file>res/primitives/Sphere.mesh</file>
+ <file>res/Font/TitilliumWeb-Regular.ttf</file>
+ <file>res/effectlib/distancefieldtext.frag</file>
+ <file>res/effectlib/distancefieldtext.vert</file>
+ <file>res/effectlib/distancefieldtext_core.frag</file>
+ <file>res/effectlib/distancefieldtext_core.vert</file>
+ <file>res/effectlib/distancefieldtext_dropshadow.frag</file>
+ <file>res/effectlib/distancefieldtext_dropshadow.vert</file>
+ <file>res/effectlib/distancefieldtext_dropshadow_core.frag</file>
+ <file>res/effectlib/distancefieldtext_dropshadow_core.vert</file>
+ </qresource>
+</RCC>
diff --git a/res/DataModelMetadata/en-us/MetaData.xml b/res/DataModelMetadata/en-us/MetaData.xml
new file mode 100644
index 0000000..951a2fb
--- /dev/null
+++ b/res/DataModelMetadata/en-us/MetaData.xml
@@ -0,0 +1,567 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<MetaData>
+ <Category name="Custom Events" description="Custom events exposed on the behavior." icon="Objects-Behavior-Normal.png" highlightIcon="Objects-Behavior-Normal.png" />
+ <Category name="Default" description="Default events on all objects" icon="Objects-Folder-Normal.png" highlightIcon="Objects-Folder-Normal.png" />
+ <Category name="Gesture" description="Input from the touch screen or the mouse" icon="Objects-Folder-Normal.png" highlightIcon="Objects-Folder-Normal.png" />
+ <Category name="Slide" description="Events generated when a slide is changing." icon="Objects-Folder-Normal.png" highlightIcon="Objects-Folder-Normal.png" />
+ <Category name="Asset" description="Handlers exposed on the asset." icon="Objects-Folder-Normal.png" highlightIcon="Objects-Folder-Normal.png" />
+ <Category name="Custom Handlers" description="Custom Handlers exposed on the behavior." icon="Objects-Behavior-Normal.png" highlightIcon="Objects-Behavior-Normal.png" />
+ <Category name="Time" description="Handlers exposed on the asset's time." icon="Objects-Folder-Normal.png" highlightIcon="Objects-Folder-Normal.png" />
+
+ <Asset>
+ <!-- Basic properties -->
+ <Property name="name" formalName="Name" type="String" category="Basic Properties" description="Object name" />
+ <Property name="eyeball" formalName="Visible" type="Boolean" default="True" category="Basic Properties" controllable="True" description="Item visibility" />
+
+ <!-- Hidden properties -->
+ <Property name="starttime" formalName="Start Time" type="Long" category="Basic Properties" hidden="True" />
+ <Property name="endtime" formalName="End Time" type="Long" default="10000" category="Basic Properties" hidden="True" />
+ <Property name="shy" formalName="Shy" type="Boolean" category="Basic Properties" hidden="True" />
+ <Property name="sourcepath" type="String" category="Basic Properties" hidden="True" />
+ <Property name="importfile" type="String" category="Basic Properties" hidden="True" />
+
+ <Handler name="Set Property" category="Asset" description="Set a property to a new value.">
+ <Argument name="Property Name" formalName="Property" description="Property to change" type="Slide" argumentType="Property" />
+ <Argument name="Property Value" formalName="New Value" description="New value for the property" type="None" argumentType="Dependent" />
+ </Handler>
+ <Handler name="Fire Event" category="Asset" description="Fire an event on the target.">
+ <Argument name="Event" description="The event to fire" type="None" argumentType="Event" />
+ </Handler>
+ <Handler name="Emit Signal" category="Asset" description="Emit a Signal.">
+ <Argument name="Signal Name" description="The signal to emit" type="String" argumentType="Signal" />
+ </Handler>
+ </Asset>
+
+ <Node> <!-- Derived from <Asset> -->
+ <!-- Basic Properties -->
+ <Property name="position" formalName="Position" category="Basic Properties" type="Vector" description="Location in local space" />
+ <Property name="rotation" formalName="Rotation" category="Basic Properties" type="Rotation" description="Rotation around local axes" />
+ <Property name="scale" formalName="Scale" category="Basic Properties" type="Vector" default="1 1 1" description="Size adjustments along local axes" />
+ <Property name="pivot" formalName="Pivot" category="Basic Properties" type="Vector" description="Offset of the contents away from the\nlocal center" />
+ <Property name="opacity" formalName="Opacity" category="Basic Properties" min="0" max="100" default="100" description="How much the element (and its children)\nocclude items behind them" />
+
+ <!-- Hidden props -->
+ <Property name="rotationorder" formalName="Rotation Order" default="YXZ" hidden="True" list="XYZ:YZX:ZXY:XZY:YXZ:ZYX:XYZr:YZXr:ZXYr:XZYr:YXZr:ZYXr" description="Rotation Order" />
+ <Property name="boneid" default="-1" type="Long" hidden="True" />
+ <Property name="orientation" formalName="Orientation" default="Left Handed" hidden="True" list="Left Handed:Right Handed" description="Orientation" />
+ <Property name="ignoresparent" default="False" type="Boolean" hidden="True" />
+
+ <Event name="onPressureDown" category="Gesture" />
+ <Event name="onPressureUp" category="Gesture" />
+ <Event name="onTap" category="Gesture" />
+ <!--
+ <Event name="onDoubleTap" category="Gesture" />
+ <Event name="onSingleTap" category="Gesture" />
+ <Event name="onOnePointDragStart" category="Gesture" />
+ <Event name="onOnePointDrag" category="Gesture" />
+ <Event name="onOnePointDragRelease" category="Gesture" />
+ <Event name="onTwoPointDragStart" category="Gesture" />
+ <Event name="onTwoPointDrag" category="Gesture" />
+ <Event name="onTwoPointDragRelease" category="Gesture" />
+ <Event name="onSwipeLeft" category="Gesture" />
+ <Event name="onSwipeRight" category="Gesture" />
+ <Event name="onSwipeUp" category="Gesture" />
+ <Event name="onSwipeDown" category="Gesture" />
+ <Event name="onTwoPointSwipeLeft" category="Gesture" />
+ <Event name="onTwoPointSwipeRight" category="Gesture" />
+ <Event name="onTwoPointSwipeUp" category="Gesture" />
+ <Event name="onTwoPointSwipeDown" category="Gesture" />
+ -->
+ </Node>
+
+ <!-- Objects below are derived from <Asset> -->
+ <Scene>
+ <!-- Background -->
+ <Property name="bgcolorenable" formalName="Use Background" category="Background" type="Boolean" default="True" description="Clear the contents to a solid color\nbefore each frame?" />
+ <Property name="backgroundcolor" formalName="Background Color" category="Background" type="Color" animatable="False" description="Color to use for the background" />
+
+ <Event name="onPressureDown" category="Gesture" />
+ <Event name="onPressureUp" category="Gesture" />
+ <Event name="onTap" category="Gesture" />
+
+ <!-- Hidden and commented out props -->
+ <Property name="name" formalName="Name" category="Basic Properties" type="String" default="Scene" hidden="True" />
+ <Property name="eyeball" formalName="Visible" category="Basic Properties" type="Boolean" default="True" hidden="True" description="Item visibility" />
+ <!--
+ <Event name="onDoubleTap" category="Gesture" />
+ <Event name="onSingleTap" category="Gesture" />
+ <Event name="onOnePointDragStart" category="Gesture" />
+ <Event name="onOnePointDrag" category="Gesture" />
+ <Event name="onOnePointDragRelease" category="Gesture" />
+ <Event name="onTwoPointDragStart" category="Gesture" />
+ <Event name="onTwoPointDrag" category="Gesture" />
+ <Event name="onTwoPointDragRelease" category="Gesture" />
+ <Event name="onSwipeLeft" category="Gesture" />
+ <Event name="onSwipeRight" category="Gesture" />
+ <Event name="onSwipeUp" category="Gesture" />
+ <Event name="onSwipeDown" category="Gesture" />
+ <Event name="onTwoPointSwipeLeft" category="Gesture" />
+ <Event name="onTwoPointSwipeRight" category="Gesture" />
+ <Event name="onTwoPointSwipeUp" category="Gesture" />
+ <Event name="onTwoPointSwipeDown" category="Gesture" />
+ -->
+ </Scene>
+
+ <RenderPlugin>
+ <Property name="name" formalName="Name" description="Object name" type="String" default="RenderPlugin" hidden="True" />
+ </RenderPlugin>
+
+ <Behavior>
+ <!--<Property name="name" formalName="Name" description="Object name" type="String" default="Behavior" hidden="False" />-->
+ </Behavior>
+
+ <Effect>
+ <Property name="name" formalName="Name" type="String" default="Effect" hidden="False" />
+ <Property name="eyeball" formalName="Visible" description="Item visibility" type="Boolean" default="True" hidden="False" controllable="True" />
+ </Effect>
+
+ <Image>
+ <Property name="scaleu" formalName="U Repeat" default="1" description="Number of times the image is tiled on\nthe U direction of the material" />
+ <Property name="scalev" formalName="V Repeat" default="1" description="Number of times the image is tiled on\nthe V direction of the material" />
+ <Property name="mappingmode" formalName="Texture Mapping" default="UV Mapping" description="How the image is applied to the\nmaterial" list="UV Mapping:Environmental Mapping:Light Probe" />
+ <Property name="tilingmodehorz" formalName="U Tiling" default="No Tiling" description="How the image is tiled in the\nU direction" list="Tiled:Mirrored:No Tiling" />
+ <Property name="tilingmodevert" formalName="V Tiling" default="No Tiling" description="How the image is tiled in the\nV direction" list="Tiled:Mirrored:No Tiling" />
+ <Property name="rotationuv" formalName="UV Rotation" description="Rotate the image's coordinates" />
+ <Property name="positionu" formalName="U Position" description="Offset of the image along the U\ndirection of the material" />
+ <Property name="positionv" formalName="V Position" description="Offset of the image along the V\ndirection of the material" />
+ <Property name="pivotu" formalName="U Pivot" description="Offset the image in the U direction\nwithout affecting rotation center" />
+ <Property name="pivotv" formalName="V Pivot" description="Offset the image in the V direction\nwithout affecting rotation center" />
+ <!-- Texture subpresentation is not set to controllable as it does not currently work in runtime -->
+ <Property name="subpresentation" formalName="Sub-Presentation" description="Presentation or QML stream\nto use instead of the image" type="Renderable" />
+
+ <!-- Hidden props -->
+ <Property name="name" formalName="Name" category="Basic Properties" type="String" default="Image" hidden="True" />
+ <Property name="eyeball" formalName="Visible" category="Basic Properties" type="Boolean" default="True" hidden="True" description="Item visibility" />
+ </Image>
+
+ <MaterialBase>
+ <Property name="name" formalName="Name" type="String" default="Material" category="Basic Properties" description="Material name" />
+ <Property name="iblprobe" formalName="IBL Override" type="Image" category="Basic Properties" description="IBL probe to use in place of the\nlayer probe for this material" />
+
+ <!-- Hidden properties -->
+ <Property name="eyeball" formalName="Visible" type="Boolean" default="True" category="Basic Properties" hidden="True" description="Item visibility" />
+ </MaterialBase>
+
+ <!-- Objects below are derived from <MaterialBase> -->
+ <Lightmaps>
+ <Property name="lightmapindirect" formalName="Indirect Lightmap" description="Image providing indirect light values\nfor GI" type="Image" category="Lighting" />
+ <Property name="lightmapradiosity" formalName="Radiosity Lightmap" description="Image providing directional light values" type="Image" category="Lighting" />
+ <Property name="lightmapshadow" formalName="Shadow Lightmap" description="Baked Shadow map" type="Image" category="Lighting" />
+ </Lightmaps>
+
+ <!-- Objects below are derived from <Lightmaps> -->
+ <Material>
+ <Property name="shaderlighting" formalName="Lighting" default="Pixel" category="Material" description="Light model" list="Pixel:None" />
+ <Property name="blendmode" formalName="Blending Mode" default="Normal" category="Material" description="How this material blends with content\nbehind it. Modes marked with * are\navailable only with HW supporting\nadvanced blending modes." list="Normal:Screen:Multiply:*Overlay:*ColorBurn:*ColorDodge" />
+ <Property name="vertexcolors" formalName="Enable Vertex Colors" type="Boolean" default="False" category="Material" description="Use vertex colors from the mesh" animatable="False" />
+ <Property name="diffuse" formalName="Diffuse Color" type="Color" default="1 1 1 1" category="Material" description="Color when lit from any direction" />
+ <Property name="diffusemap" formalName="Diffuse Map" type="Image" category="Material" description="Image to multiply with diffuse color" />
+ <Property name="diffusemap2" formalName="Diffuse Map 2" type="Image" category="Material" description="Image to multiply with diffuse color" />
+ <Property name="diffusemap3" formalName="Diffuse Map 3" type="Image" category="Material" description="Image to multiply with diffuse color" />
+ <Property name="specularreflection" formalName="Specular Reflection" type="Image" category="Material" description="Image to use as a faked reflection" />
+ <Property name="speculartint" formalName="Specular Tint" type="Color" default="1 1 1 1" category="Material" description="Coloration applied to specular reflections" />
+ <Property name="specularamount" formalName="Specular Amount" category="Material" description="Amount of shine/gloss" />
+ <Property name="specularmap" formalName="Specular Map" type="Image" category="Material" description="Image to vary the specular amount across\nthe material" />
+ <Property name="specularmodel" formalName="Specular Model" default="Default" category="Material" description="Equation to use when calculating specular\nhighlights for CG lights" list="Default:KGGX:KWard" />
+ <Property name="specularroughness" formalName="Specular Roughness" min='0.001' max='1' category="Material" description="Softening applied to reflections and\nhighlights" />
+ <Property name="roughnessmap" formalName="Roughness Map" type="Image" category="Material" description="Image to vary the specular roughness across\nthe material" />
+ <Property name="fresnelPower" formalName="Fresnel Power" category="Material" description="Damping of head-on reflections" />
+ <Property name="ior" formalName="Index of Refraction" min="1" default="1.5" category="Material" description="Index of refraction of the material" />
+ <Property name="bumpmap" formalName="Bump Map" type="Image" category="Material" description="Grayscale image simulating roughness in the\nlighting" />
+ <Property name="normalmap" formalName="Normal Map" type="Image" category="Material" description="Special RGB image describing surface\nroughness" />
+ <Property name="bumpamount" formalName="Bump Amount" type="float" default=".5" category="Material" description="Strength of bump/normal map effect" />
+ <Property name="displacementmap" formalName="Displacement Map" type="Image" category="Material" description="Grayscale image used to offset vertices\nof the geometry" />
+ <Property name="displaceamount" formalName="Displacement Amount" type="float" default="20" category="Material" description="Distance to offset vertices" />
+ <Property name="opacity" formalName="Opacity" min="0" max="100" default="100" category="Material" description="Visibility of the geometry for this material." />
+ <Property name="opacitymap" formalName="Opacity Map" type="Image" category="Material" description="Image to vary the opacity across the material" />
+ <Property name="emissivecolor" formalName="Emissive Color" type="Color" default="1 1 1 1" category="Material" description="Color of self-illumination for this material" />
+ <Property name="emissivepower" formalName="Emissive Power" category="Material" description="Amount of self-illumination for this material\n(will not light other objects)" />
+ <Property name="emissivemap" formalName="Emissive Map" type="Image" category="Material" description="Image to vary the emissive power across\nthe material" />
+ <Property name="emissivemap2" formalName="Emissive Map 2" type="Image" category="Material" description="Second image to modulate the emissive power\nacross the material" />
+ <Property name="translucencymap" formalName="Translucency Map" type="Image" category="Material" description="Grayscale image controlling how much light can\npass through the material from behind" />
+ <Property name="translucentfalloff" formalName="Translucent Falloff" type="float" default="1" category="Material" description="Translucent Falloff" />
+ <Property name="diffuselightwrap" formalName="Diffuse Light Wrap" type="float" min='0.0' max='1.0' category="Material" description="Diffuse Light Wrap" />
+ </Material>
+
+ <ReferencedMaterial>
+ <Property name="referencedmaterial" formalName="Referenced Material" type="ObjectRef" category="Material" description="Material to use all settings from" />
+ </ReferencedMaterial>
+
+ <!-- Objects below are derived from <Node> -->
+ <Alias> <!-- (no longer in use) -->
+ <Property name="referencednode" formalName="Reference" description="Original element (e.g. group, component, model)\nto clone" type="ObjectRef" />
+ </Alias>
+
+ <Camera>
+ <!-- Basic Properties -->
+ <Property name="name" formalName="Name" type="String" default="Camera" category="Basic Properties" description="Camera name" />
+ <Property name="eyeball" formalName="Visible" type="Boolean" default="True" category="Basic Properties" description="Item visibility" controllable="True" />
+ <Property name="opacity" formalName="Opacity" min="0" max="100" default="100" category="Basic Properties" hidden="True" />
+ <Property name="position" formalName="Position" type="Vector" default="0 0 -600" category="Basic Properties" description="Location in local space" />
+ <Property name="rotation" formalName="Rotation" type="Rotation" category="Basic Properties" description="Rotation around local axes" />
+ <Property name="scale" formalName="Scale" type="Vector" default="1 1 1" category="Basic Properties" description="Size adjustments along local axes" />
+ <Property name="pivot" formalName="Pivot" type="Vector" category="Basic Properties" description="Offset of the contents away from the local center" />
+
+ <!-- Camera Propertiess -->
+ <Property name="orthographic" formalName="Orthographic" type="Boolean" category="Camera Properties" description="Remove all perspective from the camera?" />
+ <Property name="fov" formalName="Field of View" min="1" max="180" default="60" category="Camera Properties" description="Viewing angle of the camera\n(how much it can see)" >
+ <ShowIfEqual property="orthographic" value="False" />
+ </Property>
+ <Property name="fovhorizontal" formalName="FOV Horizontal" type="Boolean" default="False" category="Camera Properties" description="Field of view angle orientation">
+ <ShowIfEqual property="orthographic" value="False" />
+ </Property>
+ <Property name="clipnear" formalName="Clipping Start" default="10" category="Camera Properties" min="1" max="1000" description="Near distance at which objects disappear" />
+ <Property name="clipfar" formalName="Clipping End" default="5000" category="Camera Properties" description="Far distance at which objects disappear" />
+ <Property name="scalemode" formalName="Scale Mode" default="Fit" category="Camera Properties" list="Same Size:Fit:Fit Horizontal:Fit Vertical" description="Render more content as the layer expands\n(same size) or scale up the content (fit)" />
+ <Property name="scaleanchor" formalName="Scale Anchor" default="Center" category="Camera Properties" list="Center:N:NE:E:SE:S:SW:W:NW" description="Corner of the content to pin as the\nlayer size changes" />
+
+ <!-- Hidden props -->
+ <Property name="opacity" formalName="Opacity" min="0" max="100" default="100" category="Basic Properties" hidden="True" />
+ </Camera>
+
+ <Component>
+ <!-- Variant Tags -->
+ <Property name="variants" type="String" animatable="False" category="Variant Tags" />
+ </Component>
+
+ <Group>
+ <!-- Variant Tags -->
+ <Property name="variants" type="String" animatable="False" category="Variant Tags" />
+
+ <!-- Import -->
+ <Property name="sourcepath" formalName="Import" type="Import" category="Import" description="Path to the source of this group" />
+ </Group>
+
+ <Layer>
+ <!-- Basic Properties -->
+ <Property name="name" formalName="Name" type="String" default="Layer" category="Basic Properties" description="Layer name" />
+ <Property name="eyeball" formalName="Visible" type="Boolean" default="True" category="Basic Properties" description="Item visibility" controllable="True" />
+ <Property name="background" formalName="Layer Background" default="Transparent" category="Basic Properties" description="The color to use for the layer\neach frame" list="Transparent:SolidColor:Unspecified" />
+ <Property name="backgroundcolor" formalName="Background Color" type="Color" animatable="False" category="Basic Properties" description="The background color for the layer">
+ <ShowIfEqual property="background" value="SolidColor"/>
+ </Property>
+ <Property name="blendtype" formalName="Blend Mode" default="Normal" category="Basic Properties" description="Mode of blending between this layer\nand layers below. Modes marked with\n* are available only with HW supporting\nadvanced blending modes." list="Normal:Screen:Multiply:Add:Subtract:*Overlay:*ColorBurn:*ColorDodge" />
+ <Property name="sourcepath" formalName="Sub-Presentation" type="Renderable" category="Basic Properties" description="Presentation or QML stream to\nrender for this layer" controllable="True" />
+
+ <!-- Variant Tags -->
+ <Property name="variants" type="String" animatable="False" category="Variant Tags" />
+
+ <!-- Antialiasing -->
+ <Property name="progressiveaa" formalName="Progressive AA" list="None:2x:4x:8x" default="None" category="Antialiasing" description="Improves the visual quality when no\nitems are moving" />
+ <Property name="multisampleaa" formalName="Multisample AA" list="None:2x:4x:SSAA" default="None" category="Antialiasing" description="Improves geometry quality, e.g.\nsilhouettes." />
+ <Property name="temporalaa" formalName="Temporal AA" type="Boolean" default="False" category="Antialiasing" description="Improve overall quality using camera\njittering and frame blending?" />
+
+ <!-- Size -->
+ <Property name="horzfields" formalName="Horizontal Fields" default="Left/Width" category="Size" description="Properties to use to control the\nhorizontal size and placement" list="Left/Width:Left/Right:Width/Right" />
+ <Property name="left" formalName="Left" category="Size" description="Distance between presentation and\nlayer left edges">
+ <ShowIfEqual property="horzfields" value="Left/Width"/>
+ <ShowIfEqual property="horzfields" value="Left/Right"/>
+ </Property>
+ <Property name="leftunits" formalName="Left Units" description="Left distance is percent of overall\nwidth or absolute pixels" list="percent:pixels" default="percent" category="Size">
+ <ShowIfEqual property="horzfields" value="Left/Width"/>
+ <ShowIfEqual property="horzfields" value="Left/Right"/>
+ </Property>
+ <Property name="width" formalName="Width" description="Overall layer width" default="100" category="Size">
+ <ShowIfEqual property="horzfields" value="Left/Width"/>
+ <ShowIfEqual property="horzfields" value="Width/Right"/>
+ </Property>
+ <Property name="widthunits" formalName="Width Units" description="Width is percent of overall width\nor absolute pixels" list="percent:pixels" default="percent" category="Size">
+ <ShowIfEqual property="horzfields" value="Left/Width"/>
+ <ShowIfEqual property="horzfields" value="Width/Right"/>
+ </Property>
+ <Property name="right" formalName="Right" description="Distance between presentation and layer\nright edges" category="Size">
+ <ShowIfEqual property="horzfields" value="Left/Right"/>
+ <ShowIfEqual property="horzfields" value="Width/Right"/>
+ </Property>
+ <Property name="rightunits" formalName="Right Units" description="Right distance is percent of overall\nwidth or absolute pixels" list="percent:pixels" default="percent" category="Size">
+ <ShowIfEqual property="horzfields" value="Left/Right"/>
+ <ShowIfEqual property="horzfields" value="Width/Right"/>
+ </Property>
+ <Property name="vertfields" formalName="Vertical Fields" description="Properties to use to control the\nvertical size and placement" list="Top/Height:Top/Bottom:Height/Bottom" default="Top/Height" category="Size" />
+ <Property name="top" formalName="Top" description="Distance between presentation and layer\ntop edges." category="Size">
+ <ShowIfEqual property="vertfields" value="Top/Height"/>
+ <ShowIfEqual property="vertfields" value="Top/Bottom"/>
+ </Property>
+ <Property name="topunits" formalName="Top Units" description="Top distance is percent of overall\nheight or absolute pixels" list="percent:pixels" default="percent" category="Size">
+ <ShowIfEqual property="vertfields" value="Top/Height"/>
+ <ShowIfEqual property="vertfields" value="Top/Bottom"/>
+ </Property>
+ <Property name="height" formalName="Height" description="Overall layer height." default="100" category="Size">
+ <ShowIfEqual property="vertfields" value="Top/Height"/>
+ <ShowIfEqual property="vertfields" value="Height/Bottom"/>
+ </Property>
+ <Property name="heightunits" formalName="Height Units" description="Height is percent of overall height\nor absolute pixels" list="percent:pixels" default="percent" category="Size">
+ <ShowIfEqual property="vertfields" value="Top/Height"/>
+ <ShowIfEqual property="vertfields" value="Height/Bottom"/>
+ </Property>
+ <Property name="bottom" formalName="Bottom" description="Distance between presentation and layer\nbottom edges" category="Size">
+ <ShowIfEqual property="vertfields" value="Top/Bottom"/>
+ <ShowIfEqual property="vertfields" value="Height/Bottom"/>
+ </Property>
+ <Property name="bottomunits" formalName="Bottom Units" description="Bottom distance is percent of overall\nheight or absolute pixels" list="percent:pixels" default="percent" category="Size">
+ <ShowIfEqual property="vertfields" value="Top/Bottom"/>
+ <ShowIfEqual property="vertfields" value="Height/Bottom"/>
+ </Property>
+
+ <!-- Ambient Occlusion -->
+ <Property name="aostrength" formalName="Ambient Occlusion" description="Amount of ambient occlusion shading\nto apply" min="0" max="100" default="0" category="Ambient Occlusion" >
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="aodistance" formalName="AO Distance" description="Size of the ambient occlusion shading" default="5" category="Ambient Occlusion">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="aosoftness" formalName="AO Softness" description="Magnitude of the blurring used to\nsoften shading" min="0" max="50" default="50" category="Ambient Occlusion">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="aobias" formalName="AO Threshold" description="Remove AO from flat surfaces to\nprevent artifacts" default="0" category="Ambient Occlusion">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="aosamplerate" formalName="AO Sampling Rate" description="Quality of AO sampling" type="Long" default="2" min="2" max="4" category="Ambient Occlusion">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="aodither" formalName="AO Detail" description="Use close-range detail AO" type="Boolean" default="True" category="Ambient Occlusion">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+
+ <!-- Shadow -->
+ <Property name="shadowstrength" formalName="Shadow Strength" description="Amount of shadowing to apply" min="0" max="100" default="0" hidden="True" category="Shadow">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="shadowdist" formalName="Shadow Distance" description="Maximum distance to ray march for\nshadows test" default="10" hidden="True" category="Shadow">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="shadowsoftness" formalName="Shadow Softness" description="Amount of softening of the shadow\nedges" min="0" max="100" default="100" hidden="True" category="Shadow">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+ <Property name="shadowbias" formalName="Shadow Threshold" description="Remove self-shadowing from flat\nsurfaces" default="0" hidden="True" category="Shadow">
+ <ShowIfEqual property="sourcepath" value=""/>
+ </Property>
+
+ <!-- Light Probe -->
+ <Property name="lightprobe" formalName="Light Probe" type="Image" category="Light Probe" description="Image used for image-based lighting\nand reflections" />
+ <Property name="probebright" formalName="IBL Brightness" default="100" category="Light Probe" description="Amount of light emitted by the light\nprobe." />
+ <Property name="probehorizon" formalName="IBL Horizon Cutoff" min="-1" max="-0.001" default="-1" category="Light Probe" description="Upper limit for horizon darkening\nof the light probe" />
+ <Property name="probefov" formalName="IBL FOV Angle" min="1.0" max="180" default="180" category="Light Probe" description="Image source FOV for the case of using\na camera-source as the IBL probe" />
+ <Property name="lightprobe2" formalName="Secondary Light Probe" type="Image" category="Light Probe" description="Image to blend over the primary light\nprobe" />
+ <Property name="probe2fade" formalName="Probe Crossfade" min="0.0" max="1.0" default="1.0" category="Light Probe" description="Blend amount between the primary and\nseconary probes" />
+
+ <!-- Advanced -->
+ <Property name="disabledepthtest" formalName="Disable Depth Test" type="Boolean" animatable="False" category="Advanced" description="Optimize render speed for layers with\nmostly transparent objects?" />
+ <Property name="disabledepthprepass" formalName="Disable Depth Prepass" type="Boolean" animatable="False" category="Advanced" description="Optimize render speed for layers\nwith low depth complexity" />
+
+ <!-- Hidden props -->
+ <Property name="position" formalName="Position" type="Vector" category="Basic Properties" hidden="True" description="Location in local space" />
+ <Property name="rotation" formalName="Rotation" type="Rotation" category="Basic Properties" hidden="True" description="Rotation around local axes" />
+ <Property name="scale" formalName="Scale" type="Vector" default="1 1 1" category="Basic Properties" hidden="True" description="Size adjustments along local axes" />
+ <Property name="pivot" formalName="Pivot" type="Vector" category="Basic Properties" hidden="True" description="Offset of the contents away from the local center" />
+ <Property name="opacity" formalName="Opacity" min="0" max="100" default="100" category="Basic Properties" hidden="True" />
+ <Property name="fastibl" formalName="Fast IBL" type="Boolean" default="True" category="Light Probe" hidden="True" description="Use a faster approximation to\nimage-based lighting" />
+ <Property name="probe2window" formalName="Secondary Probe Window" min="0.01" max="1.0" default="1.0" category="Light Probe" hidden="True" description="Texture-U window size used for the\nmoving window (for scrolling textures)" />
+ <Property name="probe2pos" formalName="Secondary Probe Offset" default="0.5" category="Light Probe" hidden="True" description="Texture-U window offset used for the\nmoving window" />
+ </Layer>
+
+ <Light>
+ <!-- Basic Properties -->
+ <Property name="name" formalName="Name" type="String" default="Light" category="Basic Properties" description="Light name" />
+ <Property name="eyeball" formalName="Visible" type="Boolean" default="True" category="Basic Properties" description="Item visibility" controllable="True" />
+ <Property name="position" formalName="Position" type="Vector" category="Basic Properties" description="Location in local space" />
+ <Property name="rotation" formalName="Rotation" type="Rotation" category="Basic Properties" description="Rotation around local axes" />
+ <Property name="scale" formalName="Scale" type="Vector" default="1 1 1" category="Basic Properties" description="Size adjustments along local axes" />
+ <Property name="pivot" formalName="Pivot" type="Vector" category="Basic Properties" description="Offset of the contents away from the local center" />
+
+ <!-- Light Properties -->
+ <Property name='scope' formalName="Scope" description="Portion of the scene graph lit by this\nlight; no value results in entire layer\nbeing affected." type='ObjectRef' category="Light Properties" />
+ <Property name="lighttype" formalName="Light Type" description="Type of illumination to use" list="Directional:Point:Area" default="Directional" category="Light Properties" />
+ <Property name="lightdiffuse" formalName="Light Color" description="Color of diffuse lighting effect" type="Color" default="1 1 1 1" category="Light Properties" />
+ <Property name="lightspecular" formalName="Specular Color" description="Color of specular lighting highlights" type="Color" default="1 1 1 1" category="Light Properties" />
+ <Property name="lightambient" formalName="Ambient Color" description="Color of unlit areas (black for none)" type="Color" category="Light Properties" />
+ <Property name="brightness" formalName="Brightness" description="Strength of the light" default="100" category="Light Properties" />
+ <Property name="linearfade" formalName="Linear Fade" description="Falloff of the point light" min="0" max="1000" category="Light Properties">
+ <ShowIfEqual property="lighttype" value="Point"/>
+ </Property>
+ <Property name="expfade" formalName="Exponential Fade" description="Additional falloff" min="0" max="1000" category="Light Properties">
+ <ShowIfEqual property="lighttype" value="Point"/>
+ </Property>
+ <Property name="areawidth" formalName="Width" description="Width of the surface of the area light" min="0" default="100" hidden="True" category="Light Properties">
+ <ShowIfEqual property="lighttype" value="Area"/>
+ </Property>
+ <Property name="areaheight" formalName="Height" description="Height of the surface of the area light" min="0" default="100" hidden="True" category="Light Properties">
+ <ShowIfEqual property="lighttype" value="Area"/>
+ </Property>
+
+ <!-- Shadow -->
+ <Property name="castshadow" formalName="Cast Shadows" description="Enable shadow casting for this light" type="Boolean" default="False" category="Shadow" />
+ <Property name="shdwfactor" formalName="Shadow Darkness" description="Factor used to darken shadows" default="10.0" min="1.0" max="100.0" category="Shadow" />
+ <Property name="shdwfilter" formalName="Shadow Softness" description="Width of the blur filter on the shadow map" min="1" max="100" default="35" category="Shadow" />
+ <Property name="shdwmapres" formalName="Shadow Resolution" description="Resolution of shadow map\n(powers of two)" type="ShadowMapResolution" default="9" animatable="False" category="Shadow" />
+ <Property name="shdwbias" formalName="Shadow Depth Bias" description="Slight offset to avoid self-shadowing\nartifacts" default="0" min="-1.0" max="1.0" category="Shadow" />
+ <Property name="shdwmapfar" formalName="Shadow Far Clip" description="Affects the maximum distance for the shadow\ndepth map" default="5000" category="Shadow" />
+ <Property name="shdwmapfov" formalName="Shadow Field of View" description="Affects the field of view of the shadow\ncamera" default="90" min="1" max="179" hidden="True" category="Shadow" />
+
+ <!-- Hidden props -->
+ <Property name="opacity" formalName="Opacity" min="0" max="100" default="100" category="Basic Properties" hidden="True" />
+ </Light>
+
+ <Model>
+ <!-- Basic Properties -->
+ <Property name="name" formalName="Name" type="String" default="Model" category="Basic Properties" description="Object name" />
+ <Property name="eyeball" formalName="Visible" type="Boolean" default="True" category="Basic Properties" description="Item visibility" />
+ <Property name="position" formalName="Position" type="Vector" category="Basic Properties" description="Location in local space" />
+ <Property name="rotation" formalName="Rotation" type="Rotation" category="Basic Properties" description="Rotation around local axes" />
+ <Property name="scale" formalName="Scale" type="Vector" default="1 1 1" category="Basic Properties" description="Size adjustments along local axes" />
+ <Property name="pivot" formalName="Pivot" type="Vector" category="Basic Properties" description="Offset of the contents away from the local center" />
+ <Property name="opacity" formalName="Opacity" min="0" max="100" default="100" category="Basic Properties" />
+
+ <!-- Variant Tags -->
+ <Property name="variants" type="String" animatable="False" category="Variant Tags" />
+
+ <!-- Model -->
+ <Property name="sourcepath" formalName="Mesh" type="Mesh" category="Model" description="Geometry to use for this model" />
+ <Property name="shadowcaster" formalName="Cast Shadows" type="Boolean" default="True" category="Model" description="Whether the model is a shadow caster or not" />
+
+ <!-- Hidden and commented out props -->
+ <Property name="poseroot" hidden="True" type="Long" default="-1" category="Model" />
+ <!--<Property name="tessellation" formalName="Tessellation Mode" description="Type of tessellation to subdivide\nthe geometry" list="None:Linear:Phong:NPatch" default="None" />
+ <Property name="edgetess" formalName="Edge Tessellation" description="Max Tessellation amount" min="1" max="64" default="4" />
+ <Property name="innertess" formalName="Inner Tessellation" description="Min Tessellation amount" min="1" max="64" default="4" />-->
+ </Model>
+
+ <Text>
+ <!-- Basic Properties -->
+ <Property name="name" formalName="Name" type="String" default="Light" category="Basic Properties" description="Object name" />
+ <Property name="eyeball" formalName="Visible" type="Boolean" default="True" category="Basic Properties" description="Item visibility" controllable="True" />
+ <Property name="position" formalName="Position" type="Vector" category="Basic Properties" description="Location in local space" />
+ <Property name="rotation" formalName="Rotation" type="Rotation" category="Basic Properties" description="Rotation around local axes" />
+ <Property name="scale" formalName="Scale" type="Vector" default="1 1 1" category="Basic Properties" description="Size adjustments along local axes" />
+ <Property name="pivot" formalName="Pivot" type="Vector" category="Basic Properties" description="Offset of the contents away from the local center" />
+
+ <Property name="opacity" formalName="Opacity" min="0" max="100" default="100" hidden="True" category="Basic Properties" />
+
+ <!-- Variant Tags -->
+ <Property name="variants" type="String" animatable="False" category="Variant Tags" />
+
+ <!-- Format -->
+ <Property name="textstring" formalName="Text String" type="MultiLineString" default="Text" category="Format" description="Text String" controllable="True" />
+ <Property name="textcolor" formalName="Text Color" type="Color" default="1 1 1 1" category="Format" description="Text Color" controllable="True" />
+ <Property name="font" formalName="Font" type="Font" default="TitilliumWeb-Regular" category="Format" description="Font" />
+ <!-- HW accelerated fonts not supported
+ <Property name="enableacceleratedfont" formalName="Hardware accelerated font" description="Enabled hardware acclerated font" type="Boolean" default="false" category="Format" />
+ -->
+ <Property name="size" formalName="Font Size" description="Font Size" type="FontSize" default="36" animatable="False" category="Format" />
+ <Property name="horzalign" formalName="Horizontal Alignment" description="Horizontal Alignment" list="Left:Center:Right" default="Center" category="Format" />
+ <Property name="vertalign" formalName="Vertical Alignment" description="Vertical Alignment" list="Top:Middle:Bottom" default="Middle" category="Format" />
+ <Property name="leading" formalName="Leading" description="Leading" category="Format" />
+ <Property name="tracking" formalName="Tracking" description="Tracking" category="Format" />
+ <Property name="boundingbox" formalName="Text Area" description="Fixed size text area. If not set,\ntext area grows with text." type="Float2" default="0 0" category="Format" />
+ <Property name="wordwrap" formalName="Word Wrapping" description="Word wrapping. Has effect only if fixed size\ntext area is used.\nClip: Cut text if it does not fit.\nWrapWord: Wrap between words, if possible.\nWrapAnywhere: Wrap even in the middle\nof words." list="Clip:WrapWord:WrapAnywhere" default="WrapWord" category="Format" />
+ <Property name="elide" formalName="Eliding" description="Elide text that does not fit the\ntext area. Has effect only if\nfixed text area is defined." list="ElideNone:ElideLeft:ElideMiddle:ElideRight" default="ElideNone" category="Format" />
+
+ <!-- Shadow -->
+ <Property name="dropshadow" formalName="Drop-Shadow" category="Shadow" type="Boolean" default="False" description="Add a drop-shadow to the text.\nThe shadow is a darker shade of the given color." />
+ <Property name="dropshadowstrength" formalName="Shadow Darkness" category="Shadow" type="Float" min="0" max="100" default="80" description="Darkness of the shadow in percents.\n100 is black, 0 is the same color as the text." />
+ <Property name="dropshadowoffsetx" formalName="Horizontal Offset" category="Shadow" type="Float" min="-100" max="100" default="0" description="Horizontal offset of the shadow.\nIt is relative to the font size." />
+ <Property name="dropshadowoffsety" formalName="Vertical Offset" category="Shadow" type="Float" min="-100" max="100" default="0" description="Vertical offset of the shadow.\nIt is relative to the font size." />
+ </Text>
+
+ <Path> <!-- (doesn't seem to be in use) -->
+ <Property name="name" formalName="Name" description="Object name" type="String" default="Path" hidden="False" />
+ <Property name="opacity" formalName="Opacity" description="How much the element (and its children)\nocclude items behind them" min="0" max="100" default="100" />
+ <Property name="sourcepath" formalName="Path" description="Path data to use for this path" type="PathBuffer" />
+ <Property name='width' formalName="Stroke Width" description="The size of the stroke in local units" default='5'/>
+ <Property name='pathtype' formalName='Path Type' description="The type of this path" list='Painted:Geometry' default='Painted' />
+ <Property name='linearerror' formalName="CPU Limit" description="Amount of tessellation work done on the\nCPU before GPU tessellation is involved" default='1000'>
+ <ShowIfEqual property='pathtype' value='Geometry'/>
+ </Property>
+ <Property name='edgetessamount' formalName="Edge Detail" description="Amount of GPU tessellation along the\nlength of the path." default='8' min='1' max='64' >
+ <ShowIfEqual property='pathtype' value='Geometry'/>
+ </Property>
+ <Property name='innertessamount' formalName="Width Detail" description="Amount of GPU tessellation across the\nstroke of the path." default='1' min='1' max='64' >
+ <ShowIfEqual property='pathtype' value='Geometry'/>
+ </Property>
+ <Property name='begincap' formalName="Begin Cap Style" description='Set this to &quot;Taper&quot; to finely\ntaper the beginning of your stroke over\na specified distance' list="None:Taper" default="None">
+ <ShowIfEqual property='pathtype' value='Geometry'/>
+ </Property>
+ <Property name='begincapoffset' formalName='Taper Length' description="Control the length of the taper" default='10'>
+ <HideIfEqual property='pathtype' value='Painted'/>
+ <ShowIfEqual property='begincap' value='Taper'/>
+ </Property>
+ <Property name='begincapopacity' formalName='Tip Opacity' description="Control the opacity of the taper" min='0' max='1'>
+ <HideIfEqual property='pathtype' value='Painted'/>
+ <ShowIfEqual property='begincap' value='Taper'/>
+ </Property>
+ <Property name='begincapwidth' formalName='Tip Width' description="Control the size of the taper" default='0'>
+ <HideIfEqual property='pathtype' value='Painted'/>
+ <ShowIfEqual property='begincap' value='Taper'/>
+ </Property>
+ <Property name='endcap' formalName="End Cap Style" description='Set this to &quot;Taper&quot; to finely\ntaper the end of your stroke over a\nspecified distance' list="None:Taper" default="None">
+ <ShowIfEqual property='pathtype' value='Geometry'/>
+ </Property>
+ <Property name='endcapoffset' formalName='Taper Length' description="Control the length of the taper" default='10'>
+ <HideIfEqual property='pathtype' value='Painted'/>
+ <ShowIfEqual property='endcap' value='Taper'/>
+ </Property>
+ <Property name='endcapopacity' formalName='Tip Opacity' description="Control the opacity of the taper" min='0' max='1'>
+ <HideIfEqual property='pathtype' value='Painted'/>
+ <ShowIfEqual property='endcap' value='Taper'/>
+ </Property>
+ <Property name='endcapwidth' formalName='Tip Width' description="Control the size of the taper" default='0'>
+ <HideIfEqual property='pathtype' value='Painted'/>
+ <ShowIfEqual property='endcap' value='Taper'/>
+ </Property>
+ <!--Painted paths have a dropdown called “Paint Style” with values “Filled and Stroked”, “Filled”, “Stroked”. Default is “Filled and Stroked”, but derived on import.-->
+ <Property name='paintstyle' formalName='Paint Style' description="The style of this path" list='Filled and Stroked:Filled:Stroked' default='Stroked'>
+ <ShowIfEqual property='pathtype' value='Painted'/>
+ </Property>
+ </Path>
+
+ <SubPath> <!-- (doesn't seem to be in use) -->
+ <Property name="name" formalName="Name" description="Object name" type="String" default="SubPath" hidden="False" />
+ <Property name='closed' formalName='Closed Path?' type='Boolean' default='False'/>
+ </SubPath>
+
+ <PathAnchorPoint> <!-- (doesn't seem to be in use) -->
+ <Property name="name" formalName="Name" description="Object name" type="String" default="Anchor Point" hidden="False" />
+ <Property name='position' formalName='Position' type='Float2'/>
+ <Property name="incomingangle" formalName='Handle Angle' />
+ <Property name="incomingdistance" formalName="Incoming Distance" />
+ <Property name="outgoingdistance" formalName="Outgoing Distance" />
+ </PathAnchorPoint>
+
+ <Particle> <!-- (doesn't seem to be in use) -->
+ <Property name="name" formalName="Name" description="Object name" type="String" default="Particle" hidden="False" />
+ <Property name="particletype" formalName="Particle Type" description="Type of particle System" list="Simple:Smoke:Cloud:Fluid:User" default="Cloud" />
+ <Property name="opacity" formalName="Opacity" description="How much the element (and its children)\nocclude items behind them" min="0" max="100" default="100" />
+ <Property name="maxparticles" formalName="MaxParticle" description="Max count of particles" type="Long" min="0" max="1000000" default="100" />
+ <Property name="particlesize" formalName="ParticleSize" description="Render size of particle" min="0" default="1" />
+ <Property name="lifetime" formalName="Lifetime" description="Particle lifetime before it dies" min="-1" default="5">
+ <HideIfEqual property='particletype' value='Cloud'/>
+ </Property>
+ </Particle>
+
+ <Slide>
+ <!-- Play Mode -->
+ <Property name="playmode" formalName="Play Mode" category="Play Mode" default="Stop at end" animatable="False" list="Stop at end:Looping:PingPong:Ping:Play Through To..." description="Action to take when reaching the end of\nall timebars on this slide" />
+ <Property name="playthroughto" formalName="Play Through To" category="Play Mode" default="Next" animatable="False" type="StringListOrInt" list="Next:Previous" description="Slide to go to after this one">
+ <ShowIfEqual property="playmode" value="Play Through To..."/>
+ </Property>
+ <Property name="initialplaystate" formalName="Initial Play State" category="Play Mode" default="Play" animatable="False" list="Play:Pause" description="Do animations start when coming to\nthis slide?" />
+ </Slide>
+
+ <SlideOwner>
+ <Event name="onSlideEnter" category="Slide" description="Fired when the slide is changing" />
+ <Event name="onSlideExit" category="Slide" description="Fired when the slide is changing" />
+ <Handler name="Go to Time" category="Time" description="Set the current time on the component.">
+ <Argument name="Time" description="Time to go do" />
+ <Argument name="Pause" description="Pause playback at the new time?" type="Boolean" />
+ </Handler>
+ <Handler name="Play" category="Time" description="Start the component's time playing." />
+ <Handler name="Pause" category="Time" description="Pause the component's time." />
+ <Handler name="Go to Slide" category="Slide" description="Go to a specified slide of the component.">
+ <Argument name="Slide" description="Target slide to go to" type="Slide" argumentType="Slide" />
+ </Handler>
+ <Handler name="Next Slide" category="Slide" description="Activate the next slide of the component." />
+ <Handler name="Previous Slide" category="Slide" description="Activate the previous slide of the component." />
+ <Handler name="Preceding Slide" category="Slide" description="Activate the slide that was previously active." />
+ </SlideOwner>
+
+</MetaData>
diff --git a/res/Font/TitilliumWeb-Regular.ttf b/res/Font/TitilliumWeb-Regular.ttf
new file mode 100644
index 0000000..6da8219
--- /dev/null
+++ b/res/Font/TitilliumWeb-Regular.ttf
Binary files differ
diff --git a/res/effectlib/Fxaa3_11.glsllib b/res/effectlib/Fxaa3_11.glsllib
new file mode 100644
index 0000000..f5de208
--- /dev/null
+++ b/res/effectlib/Fxaa3_11.glsllib
@@ -0,0 +1,2073 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*============================================================================
+
+
+ NVIDIA FXAA 3.11 by TIMOTHY LOTTES
+
+------------------------------------------------------------------------------
+ INTEGRATION CHECKLIST
+------------------------------------------------------------------------------
+(1.)
+In the shader source, setup defines for the desired configuration.
+When providing multiple shaders (for different presets),
+simply setup the defines differently in multiple files.
+Example,
+
+ #define FXAA_PC 1
+ #define FXAA_HLSL_5 1
+ #define FXAA_QUALITY__PRESET 12
+
+Or,
+
+ #define FXAA_360 1
+
+Or,
+
+ #define FXAA_PS3 1
+
+Etc.
+
+(2.)
+Then include this file,
+
+(3.)
+Then call the FXAA pixel shader from within your desired shader.
+Look at the FXAA Quality FxaaPixelShader() for docs on inputs.
+As for FXAA 3.11 all inputs for all shaders are the same
+to enable easy porting between platforms.
+
+ return FxaaPixelShader(...);
+
+(4.)
+Insure pass prior to FXAA outputs RGBL (see next section).
+Or use,
+
+ #define FXAA_GREEN_AS_LUMA 1
+
+(5.)
+Setup engine to provide the following constants
+which are used in the FxaaPixelShader() inputs,
+
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+
+Look at the FXAA Quality FxaaPixelShader() for docs on inputs.
+
+(6.)
+Have FXAA vertex shader run as a full screen triangle,
+and output "pos" and "fxaaConsolePosPos"
+such that inputs in the pixel shader provide,
+
+ // {xy} = center of pixel
+ FxaaFloat2 pos,
+
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ FxaaFloat4 fxaaConsolePosPos,
+
+(7.)
+Insure the texture sampler(s) used by FXAA are set to bilinear filtering.
+
+
+------------------------------------------------------------------------------
+ INTEGRATION - RGBL AND COLORSPACE
+------------------------------------------------------------------------------
+FXAA3 requires RGBL as input unless the following is set,
+
+ #define FXAA_GREEN_AS_LUMA 1
+
+In which case the engine uses green in place of luma,
+and requires RGB input is in a non-linear colorspace.
+
+RGB should be LDR (low dynamic range).
+Specifically do FXAA after tonemapping.
+
+RGB data as returned by a texture fetch can be non-linear,
+or linear when FXAA_GREEN_AS_LUMA is not set.
+Note an "sRGB format" texture counts as linear,
+because the result of a texture fetch is linear data.
+Regular "RGBA8" textures in the sRGB colorspace are non-linear.
+
+If FXAA_GREEN_AS_LUMA is not set,
+luma must be stored in the alpha channel prior to running FXAA.
+This luma should be in a perceptual space (could be gamma 2.0).
+Example pass before FXAA where output is gamma 2.0 encoded,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ color.a = dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114)); // compute luma
+ return color;
+
+Another example where output is linear encoded,
+say for instance writing to an sRGB formated render target,
+where the render target does the conversion back to sRGB after blending,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.a = sqrt(dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114))); // compute luma
+ return color;
+
+Getting luma correct is required for the algorithm to work correctly.
+
+
+------------------------------------------------------------------------------
+ BEING LINEARLY CORRECT?
+------------------------------------------------------------------------------
+Applying FXAA to a framebuffer with linear RGB color will look worse.
+This is very counter intuitive, but happends to be true in this case.
+The reason is because dithering artifacts will be more visiable
+in a linear colorspace.
+
+
+------------------------------------------------------------------------------
+ COMPLEX INTEGRATION
+------------------------------------------------------------------------------
+Q. What if the engine is blending into RGB before wanting to run FXAA?
+
+A. In the last opaque pass prior to FXAA,
+ have the pass write out luma into alpha.
+ Then blend into RGB only.
+ FXAA should be able to run ok
+ assuming the blending pass did not any add aliasing.
+ This should be the common case for particles and common blending passes.
+
+A. Or use FXAA_GREEN_AS_LUMA.
+
+============================================================================*/
+
+/*============================================================================
+
+ INTEGRATION KNOBS
+
+============================================================================*/
+//
+// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).
+// FXAA_360_OPT is a prototype for the new optimized 360 version.
+//
+// 1 = Use API.
+// 0 = Don't use API.
+//
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PS3
+ #define FXAA_PS3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360
+ #define FXAA_360 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360_OPT
+ #define FXAA_360_OPT 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_PC
+ //
+ // FXAA Quality
+ // The high quality PC algorithm.
+ //
+ #define FXAA_PC 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PC_CONSOLE
+ //
+ // The console algorithm for PC is included
+ // for developers targeting really low spec machines.
+ // Likely better to just run FXAA_PC, and use a really low preset.
+ //
+ #define FXAA_PC_CONSOLE 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_120
+ #define FXAA_GLSL_120 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_130
+ #define FXAA_GLSL_130 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_3
+ #define FXAA_HLSL_3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_4
+ #define FXAA_HLSL_4 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_5
+ #define FXAA_HLSL_5 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_GREEN_AS_LUMA
+ //
+ // For those using non-linear color,
+ // and either not able to get luma in alpha, or not wanting to,
+ // this enables FXAA to run using green as a proxy for luma.
+ // So with this enabled, no need to pack luma in alpha.
+ //
+ // This will turn off AA on anything which lacks some amount of green.
+ // Pure red and blue or combination of only R and B, will get no AA.
+ //
+ // Might want to lower the settings for both,
+ // fxaaConsoleEdgeThresholdMin
+ // fxaaQualityEdgeThresholdMin
+ // In order to insure AA does not get turned off on colors
+ // which contain a minor amount of green.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_GREEN_AS_LUMA 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_EARLY_EXIT
+ //
+ // Controls algorithm's early exit path.
+ // On PS3 turning this ON adds 2 cycles to the shader.
+ // On 360 turning this OFF adds 10ths of a millisecond to the shader.
+ // Turning this off on console will result in a more blurry image.
+ // So this defaults to on.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_EARLY_EXIT 1
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_DISCARD
+ //
+ // Only valid for PC OpenGL currently.
+ // Probably will not work when FXAA_GREEN_AS_LUMA = 1.
+ //
+ // 1 = Use discard on pixels which don't need AA.
+ // For APIs which enable concurrent TEX+ROP from same surface.
+ // 0 = Return unchanged color on pixels which don't need AA.
+ //
+ #define FXAA_DISCARD 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_FAST_PIXEL_OFFSET
+ //
+ // Used for GLSL 120 only.
+ //
+ // 1 = GL API supports fast pixel offsets
+ // 0 = do not use fast pixel offsets
+ //
+ #ifdef GL_EXT_gpu_shader4
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifndef FXAA_FAST_PIXEL_OFFSET
+ #define FXAA_FAST_PIXEL_OFFSET 0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GATHER4_ALPHA
+
+ //
+ // 1 = API supports gather4 on alpha channel.
+ // 0 = API does not support gather4 on alpha channel.
+ //
+
+#ifdef GL_ES
+ #if __VERSION__ >= 310
+ #ifdef GL_EXT_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+#else
+ #if (FXAA_HLSL_5 == 1)
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+ #endif
+#endif
+
+/*============================================================================
+ FXAA CONSOLE PS3 - TUNING KNOBS
+============================================================================*/
+#ifndef FXAA_CONSOLE__PS3_EDGE_SHARPNESS
+ //
+ // Consoles the sharpness of edges on PS3 only.
+ // Non-PS3 tuning is done with shader input.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 4 and 8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ //
+ // 8.0 is sharper
+ // 4.0 is softer
+ // 2.0 is really soft (good for vector graphics inputs)
+ //
+ #if 1
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 8.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 4.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 2.0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_CONSOLE__PS3_EDGE_THRESHOLD
+ //
+ // Only effects PS3.
+ // Non-PS3 tuning is done with shader input.
+ //
+ // The minimum amount of local contrast required to apply algorithm.
+ // The console setting has a different mapping than the quality setting.
+ //
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 0.25 and 0.125.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ //
+ // 0.125 leaves less aliasing, but is softer
+ // 0.25 leaves more aliasing, and is sharper
+ //
+ #if 1
+ #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.125
+ #else
+ #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.25
+ #endif
+#endif
+
+/*============================================================================
+ FXAA QUALITY - TUNING KNOBS
+------------------------------------------------------------------------------
+NOTE the other tuning knobs are now in the shader function inputs!
+============================================================================*/
+#ifndef FXAA_QUALITY__PRESET
+ //
+ // Choose the quality preset.
+ // This needs to be compiled into the shader as it effects code.
+ // Best option to include multiple presets is to
+ // in each shader define the preset, then include this file.
+ //
+ // OPTIONS
+ // -----------------------------------------------------------------------
+ // 10 to 15 - default medium dither (10=fastest, 15=highest quality)
+ // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)
+ // 39 - no dither, very expensive
+ //
+ // NOTES
+ // -----------------------------------------------------------------------
+ // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)
+ // 13 = about same speed as FXAA 3.9 and better than 12
+ // 23 = closest to FXAA 3.9 visually and performance wise
+ // _ = the lowest digit is directly related to performance
+ // _ = the highest digit is directly related to style
+ //
+ #define FXAA_QUALITY__PRESET 12
+#endif
+
+
+/*============================================================================
+
+ FXAA QUALITY - PRESETS
+
+============================================================================*/
+
+/*============================================================================
+ FXAA QUALITY - MEDIUM DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 10)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 3.0
+ #define FXAA_QUALITY__P2 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 11)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 3.0
+ #define FXAA_QUALITY__P3 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 12)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 4.0
+ #define FXAA_QUALITY__P4 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 13)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 4.0
+ #define FXAA_QUALITY__P5 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 14)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 4.0
+ #define FXAA_QUALITY__P6 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 15)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 12.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - LOW DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 20)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 2.0
+ #define FXAA_QUALITY__P2 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 21)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 22)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 23)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 24)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 3.0
+ #define FXAA_QUALITY__P6 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 25)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 26)
+ #define FXAA_QUALITY__PS 9
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 4.0
+ #define FXAA_QUALITY__P8 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 27)
+ #define FXAA_QUALITY__PS 10
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 4.0
+ #define FXAA_QUALITY__P9 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 28)
+ #define FXAA_QUALITY__PS 11
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 4.0
+ #define FXAA_QUALITY__P10 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 29)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - EXTREME QUALITY
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 39)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.0
+ #define FXAA_QUALITY__P2 1.0
+ #define FXAA_QUALITY__P3 1.0
+ #define FXAA_QUALITY__P4 1.0
+ #define FXAA_QUALITY__P5 1.5
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+
+
+/*============================================================================
+
+ API PORTING
+
+============================================================================*/
+#if (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)
+ #define FxaaBool bool
+ #define FxaaDiscard discard
+ #define FxaaFloat float
+ #define FxaaFloat2 vec2
+ #define FxaaFloat3 vec3
+ #define FxaaFloat4 vec4
+ #define FxaaHalf float
+ #define FxaaHalf2 vec2
+ #define FxaaHalf3 vec3
+ #define FxaaHalf4 vec4
+ #define FxaaInt2 ivec2
+ #define FxaaSat(x) clamp(x, 0.0, 1.0)
+ #define FxaaTex sampler2D
+#else
+ #define FxaaBool bool
+ #define FxaaDiscard clip(-1)
+ #define FxaaFloat float
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaHalf half
+ #define FxaaHalf2 half2
+ #define FxaaHalf3 half3
+ #define FxaaHalf4 half4
+ #define FxaaSat(x) saturate(x)
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_GLSL_120 == 1)
+ // Requires,
+ // #version 120
+ // And at least,
+ // #extension GL_EXT_gpu_shader4 : enable
+ // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)
+ #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)
+ #if (FXAA_FAST_PIXEL_OFFSET == 1)
+ #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
+ #else
+ #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)
+ #endif
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
+ #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
+ #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_GLSL_130 == 1)
+ // Requires "#version 130" or better
+ #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
+ #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
+ #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1) || (FXAA_PS3 == 1)
+ #define FxaaInt2 float2
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))
+ #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_4 == 1)
+ #define FxaaInt2 int2
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_5 == 1)
+ #define FxaaInt2 int2
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+ #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p)
+ #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o)
+ #define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p)
+ #define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o)
+#endif
+
+
+/*============================================================================
+ GREEN AS LUMA OPTION SUPPORT FUNCTION
+============================================================================*/
+#if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }
+#else
+ FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }
+#endif
+
+
+
+
+/*============================================================================
+
+ FXAA3 QUALITY - PC
+
+============================================================================*/
+#if (FXAA_PC == 1)
+/*--------------------------------------------------------------------------*/
+FxaaFloat4 FxaaPixelShader(
+ //
+ // Use noperspective interpolation here (turn off perspective interpolation).
+ // {xy} = center of pixel
+ FxaaFloat2 pos,
+ //
+ // Used only for FXAA Console, and not used on the 360 version.
+ // Use noperspective interpolation here (turn off perspective interpolation).
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ FxaaFloat4 fxaaConsolePosPos,
+ //
+ // Input color texture.
+ // {rgb_} = color in linear or perceptual color space
+ // if (FXAA_GREEN_AS_LUMA == 0)
+ // {___a} = luma in perceptual color space (not linear)
+ FxaaTex tex,
+ //
+ // Only used on the optimized 360 version of FXAA Console.
+ // For everything but 360, just use the same input here as for "tex".
+ // For 360, same texture, just alias with a 2nd sampler.
+ // This sampler needs to have an exponent bias of -1.
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ //
+ // Only used on the optimized 360 version of FXAA Console.
+ // For everything but 360, just use the same input here as for "tex".
+ // For 360, same texture, just alias with a 3nd sampler.
+ // This sampler needs to have an exponent bias of -2.
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ //
+ // Only used on FXAA Quality.
+ // This must be from a constant/uniform.
+ // {x_} = 1.0/screenWidthInPixels
+ // {_y} = 1.0/screenHeightInPixels
+ FxaaFloat2 fxaaQualityRcpFrame,
+ //
+ // Only used on FXAA Console.
+ // This must be from a constant/uniform.
+ // This effects sub-pixel AA quality and inversely sharpness.
+ // Where N ranges between,
+ // N = 0.50 (default)
+ // N = 0.33 (sharper)
+ // {x___} = -N/screenWidthInPixels
+ // {_y__} = -N/screenHeightInPixels
+ // {__z_} = N/screenWidthInPixels
+ // {___w} = N/screenHeightInPixels
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ //
+ // Only used on FXAA Console.
+ // Not used on 360, but used on PS3 and PC.
+ // This must be from a constant/uniform.
+ // {x___} = -2.0/screenWidthInPixels
+ // {_y__} = -2.0/screenHeightInPixels
+ // {__z_} = 2.0/screenWidthInPixels
+ // {___w} = 2.0/screenHeightInPixels
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ //
+ // Only used on FXAA Console.
+ // Only used on 360 in place of fxaaConsoleRcpFrameOpt2.
+ // This must be from a constant/uniform.
+ // {x___} = 8.0/screenWidthInPixels
+ // {_y__} = 8.0/screenHeightInPixels
+ // {__z_} = -4.0/screenWidthInPixels
+ // {___w} = -4.0/screenHeightInPixels
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__SUBPIX define.
+ // It is here now to allow easier tuning.
+ // Choose the amount of sub-pixel aliasing removal.
+ // This can effect sharpness.
+ // 1.00 - upper limit (softer)
+ // 0.75 - default amount of filtering
+ // 0.50 - lower limit (sharper, less sub-pixel aliasing removal)
+ // 0.25 - almost off
+ // 0.00 - completely off
+ FxaaFloat fxaaQualitySubpix,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__EDGE_THRESHOLD define.
+ // It is here now to allow easier tuning.
+ // The minimum amount of local contrast required to apply algorithm.
+ // 0.333 - too little (faster)
+ // 0.250 - low quality
+ // 0.166 - default
+ // 0.125 - high quality
+ // 0.063 - overkill (slower)
+ FxaaFloat fxaaQualityEdgeThreshold,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__EDGE_THRESHOLD_MIN define.
+ // It is here now to allow easier tuning.
+ // Trims the algorithm from processing darks.
+ // 0.0833 - upper limit (default, the start of visible unfiltered edges)
+ // 0.0625 - high quality (faster)
+ // 0.0312 - visible limit (slower)
+ // Special notes when using FXAA_GREEN_AS_LUMA,
+ // Likely want to set this to zero.
+ // As colors that are mostly not-green
+ // will appear very dark in the green channel!
+ // Tune by looking at mostly non-green content,
+ // then start at zero and increase until aliasing is a problem.
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define.
+ // It is here now to allow easier tuning.
+ // This does not effect PS3, as this needs to be compiled in.
+ // Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3.
+ // Due to the PS3 being ALU bound,
+ // there are only three safe values here: 2 and 4 and 8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ // For all other platforms can be a non-power of two.
+ // 8.0 is sharper (default!!!)
+ // 4.0 is softer
+ // 2.0 is really soft (good only for vector graphics inputs)
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define.
+ // It is here now to allow easier tuning.
+ // This does not effect PS3, as this needs to be compiled in.
+ // Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3.
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 1/4 and 1/8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ // The console setting has a different mapping than the quality setting.
+ // Other platforms can use other values.
+ // 0.125 leaves less aliasing, but is softer (default!!!)
+ // 0.25 leaves more aliasing, and is sharper
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define.
+ // It is here now to allow easier tuning.
+ // Trims the algorithm from processing darks.
+ // The console setting has a different mapping than the quality setting.
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ // This does not apply to PS3,
+ // PS3 was simplified to avoid more shader instructions.
+ // 0.06 - faster but more aliasing in darks
+ // 0.05 - default
+ // 0.04 - slower and less aliasing in darks
+ // Special notes when using FXAA_GREEN_AS_LUMA,
+ // Likely want to set this to zero.
+ // As colors that are mostly not-green
+ // will appear very dark in the green channel!
+ // Tune by looking at mostly non-green content,
+ // then start at zero and increase until aliasing is a problem.
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ //
+ // Extra constants for 360 FXAA Console only.
+ // Use zeros or anything else for other platforms.
+ // These must be in physical constant registers and NOT immedates.
+ // Immedates will result in compiler un-optimizing.
+ // {xyzw} = float4(1.0, -1.0, 0.25, -0.25)
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posM;
+ posM.x = pos.x;
+ posM.y = pos.y;
+ #if (FXAA_GATHER4_ALPHA == 1)
+ #if (FXAA_DISCARD == 0)
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ #define lumaM rgbyM.w
+ #else
+ #define lumaM rgbyM.y
+ #endif
+ #endif
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);
+ FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));
+ #else
+ FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);
+ FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));
+ #endif
+ #if (FXAA_DISCARD == 1)
+ #define lumaM luma4A.w
+ #endif
+ #define lumaE luma4A.z
+ #define lumaS luma4A.x
+ #define lumaSE luma4A.y
+ #define lumaNW luma4B.w
+ #define lumaN luma4B.z
+ #define lumaW luma4B.x
+ #else
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ #define lumaM rgbyM.w
+ #else
+ #define lumaM rgbyM.y
+ #endif
+ FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat maxSM = max(lumaS, lumaM);
+ FxaaFloat minSM = min(lumaS, lumaM);
+ FxaaFloat maxESM = max(lumaE, maxSM);
+ FxaaFloat minESM = min(lumaE, minSM);
+ FxaaFloat maxWN = max(lumaN, lumaW);
+ FxaaFloat minWN = min(lumaN, lumaW);
+ FxaaFloat rangeMax = max(maxWN, maxESM);
+ FxaaFloat rangeMin = min(minWN, minESM);
+ FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;
+ FxaaFloat range = rangeMax - rangeMin;
+ FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);
+ FxaaBool earlyExit = range < rangeMaxClamped;
+/*--------------------------------------------------------------------------*/
+ if(earlyExit)
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GATHER4_ALPHA == 0)
+ FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));
+ #else
+ FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNS = lumaN + lumaS;
+ FxaaFloat lumaWE = lumaW + lumaE;
+ FxaaFloat subpixRcpRange = 1.0/range;
+ FxaaFloat subpixNSWE = lumaNS + lumaWE;
+ FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;
+ FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNESE = lumaNE + lumaSE;
+ FxaaFloat lumaNWNE = lumaNW + lumaNE;
+ FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
+ FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNWSW = lumaNW + lumaSW;
+ FxaaFloat lumaSWSE = lumaSW + lumaSE;
+ FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
+ FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
+ FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
+ FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
+ FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;
+ FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;
+ FxaaFloat lengthSign = fxaaQualityRcpFrame.x;
+ FxaaBool horzSpan = edgeHorz >= edgeVert;
+ FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
+/*--------------------------------------------------------------------------*/
+ if(!horzSpan) lumaN = lumaW;
+ if(!horzSpan) lumaS = lumaE;
+ if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;
+ FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat gradientN = lumaN - lumaM;
+ FxaaFloat gradientS = lumaS - lumaM;
+ FxaaFloat lumaNN = lumaN + lumaM;
+ FxaaFloat lumaSS = lumaS + lumaM;
+ FxaaBool pairN = abs(gradientN) >= abs(gradientS);
+ FxaaFloat gradient = max(abs(gradientN), abs(gradientS));
+ if(pairN) lengthSign = -lengthSign;
+ FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posB;
+ posB.x = posM.x;
+ posB.y = posM.y;
+ FxaaFloat2 offNP;
+ offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
+ offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
+ if(!horzSpan) posB.x += lengthSign * 0.5;
+ if( horzSpan) posB.y += lengthSign * 0.5;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posN;
+ posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;
+ posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;
+ FxaaFloat2 posP;
+ posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;
+ posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;
+ FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;
+ FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));
+ FxaaFloat subpixE = subpixC * subpixC;
+ FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));
+/*--------------------------------------------------------------------------*/
+ if(!pairN) lumaNN = lumaSS;
+ FxaaFloat gradientScaled = gradient * 1.0/4.0;
+ FxaaFloat lumaMM = lumaM - lumaNN * 0.5;
+ FxaaFloat subpixF = subpixD * subpixE;
+ FxaaBool lumaMLTZero = lumaMM < 0.0;
+/*--------------------------------------------------------------------------*/
+ lumaEndN -= lumaNN * 0.5;
+ lumaEndP -= lumaNN * 0.5;
+ FxaaBool doneN = abs(lumaEndN) >= gradientScaled;
+ FxaaBool doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;
+ FxaaBool doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;
+/*--------------------------------------------------------------------------*/
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 3)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 4)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 5)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 6)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 7)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 8)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 9)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 10)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 11)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 12)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+/*--------------------------------------------------------------------------*/
+ FxaaFloat dstN = posM.x - posN.x;
+ FxaaFloat dstP = posP.x - posM.x;
+ if(!horzSpan) dstN = posM.y - posN.y;
+ if(!horzSpan) dstP = posP.y - posM.y;
+/*--------------------------------------------------------------------------*/
+ FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
+ FxaaFloat spanLength = (dstP + dstN);
+ FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
+ FxaaFloat spanLengthRcp = 1.0/spanLength;
+/*--------------------------------------------------------------------------*/
+ FxaaBool directionN = dstN < dstP;
+ FxaaFloat dst = min(dstN, dstP);
+ FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;
+ FxaaFloat subpixG = subpixF * subpixF;
+ FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
+ FxaaFloat subpixH = subpixG * fxaaQualitySubpix;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
+ FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
+ if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
+ if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
+ #if (FXAA_DISCARD == 1)
+ return FxaaTexTop(tex, posM);
+ #else
+ return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);
+ #endif
+}
+/*==========================================================================*/
+#endif
+
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - PC VERSION
+
+------------------------------------------------------------------------------
+Instead of using this on PC, I'd suggest just using FXAA Quality with
+ #define FXAA_QUALITY__PRESET 10
+Or
+ #define FXAA_QUALITY__PRESET 20
+Either are higher qualilty and almost as fast as this on modern PC GPUs.
+============================================================================*/
+#if (FXAA_PC_CONSOLE == 1)
+/*--------------------------------------------------------------------------*/
+FxaaFloat4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy));
+ FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw));
+ FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy));
+ FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw));
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat lumaM = rgbyM.w;
+ #else
+ FxaaFloat lumaM = rgbyM.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw);
+ lumaNe += 1.0/384.0;
+ FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe);
+ FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw);
+ FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMinM = min(lumaMin, lumaM);
+ FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled);
+ FxaaFloat lumaMaxM = max(lumaMax, lumaM);
+ FxaaFloat dirSwMinusNe = lumaSw - lumaNe;
+ FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM;
+ FxaaFloat dirSeMinusNw = lumaSe - lumaNw;
+ if(lumaMaxSubMinM < lumaMaxScaledClamped) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 dir;
+ dir.x = dirSwMinusNe + dirSeMinusNw;
+ dir.y = dirSwMinusNe - dirSeMinusNw;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 dir1 = normalize(dir.xy);
+ FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw);
+ FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness;
+ FxaaFloat2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * fxaaConsoleRcpFrameOpt2.zw);
+ FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * fxaaConsoleRcpFrameOpt2.zw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyA = rgbyN1 + rgbyP1;
+ FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25);
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaBool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);
+ #else
+ FxaaBool twoTap = (rgbyB.y < lumaMin) || (rgbyB.y > lumaMax);
+ #endif
+ if(twoTap) rgbyB.xyz = rgbyA.xyz * 0.5;
+ return rgbyB; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - 360 PIXEL SHADER
+
+------------------------------------------------------------------------------
+This optimized version thanks to suggestions from Andy Luedke.
+Should be fully tex bound in all cases.
+As of the FXAA 3.11 release, I have still not tested this code,
+however I fixed a bug which was in both FXAA 3.9 and FXAA 3.10.
+And note this is replacing the old unoptimized version.
+If it does not work, please let me know so I can fix it.
+============================================================================*/
+#if (FXAA_360 == 1)
+/*--------------------------------------------------------------------------*/
+[reduceTempRegUsage(4)]
+float4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ float4 lumaNwNeSwSe;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ asm {
+ tfetch2D lumaNwNeSwSe.w___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe._w__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.__w_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.___w, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
+ };
+ #else
+ asm {
+ tfetch2D lumaNwNeSwSe.y___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe._y__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.__y_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.___y, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
+ };
+ #endif
+/*--------------------------------------------------------------------------*/
+ lumaNwNeSwSe.y += 1.0/384.0;
+ float2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
+ float lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
+/*--------------------------------------------------------------------------*/
+ float4 rgbyM = tex2Dlod(tex, float4(pos.xy, 0.0, 0.0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ float lumaMinM = min(lumaMin, rgbyM.w);
+ float lumaMaxM = max(lumaMax, rgbyM.w);
+ #else
+ float lumaMinM = min(lumaMin, rgbyM.y);
+ float lumaMaxM = max(lumaMax, rgbyM.y);
+ #endif
+ if((lumaMaxM - lumaMinM) < max(fxaaConsoleEdgeThresholdMin, lumaMax * fxaaConsoleEdgeThreshold)) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ float2 dir;
+ dir.x = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.yyxx);
+ dir.y = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.xyxy);
+ dir = normalize(dir);
+/*--------------------------------------------------------------------------*/
+ float4 dir1 = dir.xyxy * fxaaConsoleRcpFrameOpt.xyzw;
+/*--------------------------------------------------------------------------*/
+ float4 dir2;
+ float dirAbsMinTimesC = min(abs(dir.x), abs(dir.y)) * fxaaConsoleEdgeSharpness;
+ dir2 = saturate(fxaaConsole360ConstDir.zzww * dir.xyxy / dirAbsMinTimesC + 0.5);
+ dir2 = dir2 * fxaaConsole360RcpFrameOpt2.xyxy + fxaaConsole360RcpFrameOpt2.zwzw;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyN1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.xy, 0.0, 0.0));
+ float4 rgbyP1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.zw, 0.0, 0.0));
+ float4 rgbyN2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.xy, 0.0, 0.0));
+ float4 rgbyP2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.zw, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+ float4 rgbyA = rgbyN1 + rgbyP1;
+ float4 rgbyB = rgbyN2 + rgbyP2 + rgbyA * 0.5;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyR = ((FxaaLuma(rgbyB) - lumaMax) > 0.0) ? rgbyA : rgbyB;
+ rgbyR = ((FxaaLuma(rgbyB) - lumaMin) > 0.0) ? rgbyR : rgbyA;
+ return rgbyR; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT)
+
+==============================================================================
+The code below does not exactly match the assembly.
+I have a feeling that 12 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h0.w(TRUE), v5.xwxx, #0
+ 6: addh h0.z(TRUE), -h2, h0.w
+ 7: texpkb h1.w(TRUE), v5, #0
+ 9: addh h0.x(TRUE), h0.z, -h1.w
+ 10: addh h3.w(TRUE), h0.z, h1
+ 11: texpkb h2.w(TRUE), v5.zwzz, #0
+ 13: addh h0.z(TRUE), h3.w, -h2.w
+ 14: addh h0.x(TRUE), h2.w, h0
+ 15: nrmh h1.xz(TRUE), h0_n
+ 16: minh_m8 h0.x(TRUE), |h1|, |h1.z|
+ 17: maxh h4.w(TRUE), h0, h1
+ 18: divx h2.xy(TRUE), h1_n.xzzw, h0_n
+ 19: movr r1.zw(TRUE), v4.xxxy
+ 20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww
+ 22: minh h5.w(TRUE), h0, h1
+ 23: texpkb h0(TRUE), r2.xzxx, #0
+ 25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1
+ 27: maxh h4.x(TRUE), h2.z, h2.w
+ 28: texpkb h1(TRUE), r0.zwzz, #0
+ 30: addh_d2 h1(TRUE), h0, h1
+ 31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 33: texpkb h0(TRUE), r0, #0
+ 35: minh h4.z(TRUE), h2, h2.w
+ 36: fenct TRUE
+ 37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 39: texpkb h2(TRUE), r1, #0
+ 41: addh_d2 h0(TRUE), h0, h2
+ 42: maxh h2.w(TRUE), h4, h4.x
+ 43: minh h2.x(TRUE), h5.w, h4.z
+ 44: addh_d2 h0(TRUE), h0, h1
+ 45: slth h2.x(TRUE), h0.w, h2
+ 46: sgth h2.w(TRUE), h0, h2
+ 47: movh h0(TRUE), h0
+ 48: addx.c0 rc(TRUE), h2, h2.w
+ 49: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB1 | add | 2: ADDh h2.z, h0.--w-, const.--x-;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB1 | add | 6: ADDh h0.z,-h2, h0.--w-;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 9: ADDh h0.x, h0.z---,-h1.w---;
+ | SCB1 | add | 10: ADDh h3.w, h0.---z, h1;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h2.w---, h0;
+ | SCB1 | add | 13: ADDh h0.z, h3.--w-,-h2.--w-;
+ | | |
+ 5 | SCT1 | mov | 15: NRMh h1.xz, h0;
+ | SRB | nrm | 15: NRMh h1.xz, h0;
+ | SCB0 | min | 16: MINh*8 h0.x, |h1|, |h1.z---|;
+ | SCB1 | max | 17: MAXh h4.w, h0, h1;
+ | | |
+ 6 | SCT0 | div | 18: DIVx h2.xy, h1.xz--, h0;
+ | SCT1 | mov | 19: MOVr r1.zw, g[TEX0].--xy;
+ | SCB0 | mad | 20: MADr r2.xz,-h1, const.z-w-, r1.z-w-;
+ | SCB1 | min | 22: MINh h5.w, h0, h1;
+ | | |
+ 7 | SCT0/1 | mov | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | TEX | txl | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | SCB0 | max | 27: MAXh h4.x, h2.z---, h2.w---;
+ | SCB1 | mad | 25: MADr r0.zw, h1.--xz, const, r1;
+ | | |
+ 8 | SCT0/1 | mov | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | TEX | txl | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | SCB0/1 | add | 30: ADDh/2 h1, h0, h1;
+ | | |
+ 9 | SCT0 | mad | 31: MADr r0.xy,-h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB1 | min | 35: MINh h4.z, h2, h2.--w-;
+ | | |
+ 10 | SCT0 | mad | 37: MADr r1.xy, h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | TEX | txl | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | SCB0/1 | add | 41: ADDh/2 h0, h0, h2;
+ | | |
+ 11 | SCT0 | min | 43: MINh h2.x, h5.w---, h4.z---;
+ | SCT1 | max | 42: MAXh h2.w, h4, h4.---x;
+ | SCB0/1 | add | 44: ADDh/2 h0, h0, h1;
+ | | |
+ 12 | SCT0 | set | 45: SLTh h2.x, h0.w---, h2;
+ | SCT1 | set | 46: SGTh h2.w, h0, h2;
+ | SCB0/1 | mul | 47: MOVh h0, h0;
+ | | |
+ 13 | SCT0 | mad | 48: ADDxc0_s rc, h2, h2.w---;
+ | SCB0/1 | mul | 49: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 0% 0% 50%
+ 6: 100% 0% 75%
+ 7: 0% 100% 75%
+ 8: 0% 100% 100%
+ 9: 0% 100% 25%
+ 10: 0% 100% 100%
+ 11: 50% 0% 100%
+ 12: 50% 0% 100%
+ 13: 25% 0% 100%
+
+MEAN: 17% 61% 67%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 0% 100%
+ 2: 0% 0% 100% 0% 100%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 0% 0% 0% 100% 100%
+ 6: 100% 100% 0% 100% 100%
+ 7: 0% 0% 100% 100% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 0% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 100% 100% 0% 100% 100%
+ 12: 100% 100% 0% 100% 100%
+ 13: 100% 0% 0% 100% 100%
+
+MEAN: 30% 23% 61% 76% 100%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 13 cycles, 3 r regs, 923,076,923 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0)
+/*--------------------------------------------------------------------------*/
+#pragma regcount 7
+#pragma disablepc all
+#pragma option O3
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 dir;
+ half4 lumaNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ lumaNe.w += half(1.0/512.0);
+ dir.x = -lumaNe.w;
+ dir.z = -lumaNe.w;
+ #else
+ lumaNe.y += half(1.0/512.0);
+ dir.x = -lumaNe.y;
+ dir.z = -lumaNe.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x += lumaSw.w;
+ dir.z += lumaSw.w;
+ #else
+ dir.x += lumaSw.y;
+ dir.z += lumaSw.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x -= lumaNw.w;
+ dir.z += lumaNw.w;
+ #else
+ dir.x -= lumaNw.y;
+ dir.z += lumaNw.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x += lumaSe.w;
+ dir.z -= lumaSe.w;
+ #else
+ dir.x += lumaSe.y;
+ dir.z -= lumaSe.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (5)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir.xyz).xz;
+ half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (7)
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (8)
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (11)
+ // compilier moves these scalar ops up to other cycles
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+ #else
+ half lumaMin = min(min(lumaNw.y, lumaSw.y), min(lumaNe.y, lumaSe.y));
+ half lumaMax = max(max(lumaNw.y, lumaSw.y), max(lumaNe.y, lumaSe.y));
+ #endif
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (12)
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ #else
+ bool twoTapLt = rgby2.y < lumaMin;
+ bool twoTapGt = rgby2.y > lumaMax;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (13)
+ if(twoTapLt || twoTapGt) rgby2 = rgby1;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT)
+
+==============================================================================
+The code mostly matches the assembly.
+I have a feeling that 14 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+Use of FXAA_GREEN_AS_LUMA currently adds a cycle (16 clks).
+Will look at fixing this for FXAA 3.12.
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h1.w(TRUE), v5.xwxx, #0
+ 6: addh h0.x(TRUE), h1.w, -h2.y
+ 7: texpkb h2.w(TRUE), v5.zwzz, #0
+ 9: minh h4.w(TRUE), h2.y, h2
+ 10: maxh h5.x(TRUE), h2.y, h2.w
+ 11: texpkb h0.w(TRUE), v5, #0
+ 13: addh h3.w(TRUE), -h0, h0.x
+ 14: addh h0.x(TRUE), h0.w, h0
+ 15: addh h0.z(TRUE), -h2.w, h0.x
+ 16: addh h0.x(TRUE), h2.w, h3.w
+ 17: minh h5.y(TRUE), h0.w, h1.w
+ 18: nrmh h2.xz(TRUE), h0_n
+ 19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z|
+ 20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w
+ 21: movr r1.zw(TRUE), v4.xxxy
+ 22: maxh h2.w(TRUE), h0, h1
+ 23: fenct TRUE
+ 24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 26: texpkb h0(TRUE), r0, #0
+ 28: maxh h5.x(TRUE), h2.w, h5
+ 29: minh h5.w(TRUE), h5.y, h4
+ 30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 32: texpkb h2(TRUE), r1, #0
+ 34: addh_d2 h2(TRUE), h0, h2
+ 35: texpkb h1(TRUE), v4, #0
+ 37: maxh h5.y(TRUE), h5.x, h1.w
+ 38: minh h4.w(TRUE), h1, h5
+ 39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 41: texpkb h0(TRUE), r0, #0
+ 43: addh_m8 h5.z(TRUE), h5.y, -h4.w
+ 44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 46: texpkb h3(TRUE), r2, #0
+ 48: addh_d2 h0(TRUE), h0, h3
+ 49: addh_d2 h3(TRUE), h0, h2
+ 50: movh h0(TRUE), h3
+ 51: slth h3.x(TRUE), h3.w, h5.w
+ 52: sgth h3.w(TRUE), h3, h5.x
+ 53: addx.c0 rc(TRUE), h3.x, h3
+ 54: slth.c0 rc(TRUE), h5.z, h5
+ 55: movh h0(c0.NE.w), h2
+ 56: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB0 | add | 2: ADDh h2.y, h0.-w--, const.-x--;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB0 | add | 6: ADDh h0.x, h1.w---,-h2.y---;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | max | 10: MAXh h5.x, h2.y---, h2.w---;
+ | SCB1 | min | 9: MINh h4.w, h2.---y, h2;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h0.w---, h0;
+ | SCB1 | add | 13: ADDh h3.w,-h0, h0.---x;
+ | | |
+ 5 | SCT0 | mad | 16: ADDh h0.x, h2.w---, h3.w---;
+ | SCT1 | mad | 15: ADDh h0.z,-h2.--w-, h0.--x-;
+ | SCB0 | min | 17: MINh h5.y, h0.-w--, h1.-w--;
+ | | |
+ 6 | SCT1 | mov | 18: NRMh h2.xz, h0;
+ | SRB | nrm | 18: NRMh h2.xz, h0;
+ | SCB1 | min | 19: MINh*8 h2.w, |h2.---x|, |h2.---z|;
+ | | |
+ 7 | SCT0 | div | 20: DIVx h4.xy, h2.xz--, h2.ww--;
+ | SCT1 | mov | 21: MOVr r1.zw, g[TEX0].--xy;
+ | SCB1 | max | 22: MAXh h2.w, h0, h1;
+ | | |
+ 8 | SCT0 | mad | 24: MADr r0.xy,-h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | TEX | txl | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | SCB0 | max | 28: MAXh h5.x, h2.w---, h5;
+ | SCB1 | min | 29: MINh h5.w, h5.---y, h4;
+ | | |
+ 9 | SCT0 | mad | 30: MADr r1.xy, h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | TEX | txl | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | SCB0/1 | add | 34: ADDh/2 h2, h0, h2;
+ | | |
+ 10 | SCT0/1 | mov | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | TEX | txl | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | SCB0 | max | 37: MAXh h5.y, h5.-x--, h1.-w--;
+ | SCB1 | min | 38: MINh h4.w, h1, h5;
+ | | |
+ 11 | SCT0 | mad | 39: MADr r0.xy,-h4, const.xy--, r1.zw--;
+ | SCT1 | mov | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB0 | mad | 44: MADr r2.xy, h4, const.xy--, r1.zw--;
+ | SCB1 | add | 43: ADDh*8 h5.z, h5.--y-,-h4.--w-;
+ | | |
+ 12 | SCT0/1 | mov | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | TEX | txl | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | SCB0/1 | add | 48: ADDh/2 h0, h0, h3;
+ | | |
+ 13 | SCT0/1 | mad | 49: ADDh/2 h3, h0, h2;
+ | SCB0/1 | mul | 50: MOVh h0, h3;
+ | | |
+ 14 | SCT0 | set | 51: SLTh h3.x, h3.w---, h5.w---;
+ | SCT1 | set | 52: SGTh h3.w, h3, h5.---x;
+ | SCB0 | set | 54: SLThc0 rc, h5.z---, h5;
+ | SCB1 | add | 53: ADDxc0_s rc, h3.---x, h3;
+ | | |
+ 15 | SCT0/1 | mul | 55: MOVh h0(NE0.wwww), h2;
+ | SCB0/1 | mul | 56: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 50% 0% 25%
+ 6: 0% 0% 25%
+ 7: 100% 0% 25%
+ 8: 0% 100% 50%
+ 9: 0% 100% 100%
+ 10: 0% 100% 50%
+ 11: 0% 100% 75%
+ 12: 0% 100% 100%
+ 13: 100% 0% 100%
+ 14: 50% 0% 50%
+ 15: 100% 0% 100%
+
+MEAN: 26% 60% 56%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 100% 0%
+ 2: 0% 0% 100% 100% 0%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 100% 100% 0% 100% 0%
+ 6: 0% 0% 0% 0% 100%
+ 7: 100% 100% 0% 0% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 100% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 0% 0% 100% 100% 100%
+ 12: 0% 0% 100% 100% 100%
+ 13: 100% 100% 0% 100% 100%
+ 14: 100% 100% 0% 100% 100%
+ 15: 100% 100% 0% 100% 100%
+
+MEAN: 33% 33% 60% 86% 80%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 15 cycles, 3 r regs, 800,000,000 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1)
+/*--------------------------------------------------------------------------*/
+#pragma regcount 7
+#pragma disablepc all
+#pragma option O2
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 rgbyNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaNe = rgbyNe.w + half(1.0/512.0);
+ #else
+ half lumaNe = rgbyNe.y + half(1.0/512.0);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaSwNegNe = lumaSw.w - lumaNe;
+ #else
+ half lumaSwNegNe = lumaSw.y - lumaNe;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxNwSw = max(lumaNw.w, lumaSw.w);
+ half lumaMinNwSw = min(lumaNw.w, lumaSw.w);
+ #else
+ half lumaMaxNwSw = max(lumaNw.y, lumaSw.y);
+ half lumaMinNwSw = min(lumaNw.y, lumaSw.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half dirZ = lumaNw.w + lumaSwNegNe;
+ half dirX = -lumaNw.w + lumaSwNegNe;
+ #else
+ half dirZ = lumaNw.y + lumaSwNegNe;
+ half dirX = -lumaNw.y + lumaSwNegNe;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (5)
+ half3 dir;
+ dir.y = 0.0;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x = lumaSe.w + dirX;
+ dir.z = -lumaSe.w + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.w);
+ #else
+ dir.x = lumaSe.y + dirX;
+ dir.z = -lumaSe.y + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir).xz;
+ half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (7)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxNeSe = max(lumaNe, lumaSe.w);
+ #else
+ half lumaMaxNeSe = max(lumaNe, lumaSe.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (8)
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe);
+ half lumaMin = min(lumaMinNwSw, lumaMinNeSe);
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+ half lumaMinM = min(lumaMin, rgbyM.w);
+ #else
+ half lumaMaxM = max(lumaMax, rgbyM.y);
+ half lumaMinM = min(lumaMin, rgbyM.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (11)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__PS3_EDGE_THRESHOLD;
+/*--------------------------------------------------------------------------*/
+// (12)
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (13)
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (14)
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ #else
+ bool twoTapLt = rgby2.y < lumaMin;
+ bool twoTapGt = rgby2.y > lumaMax;
+ #endif
+ bool earlyExit = lumaRangeM < lumaMax;
+ bool twoTap = twoTapLt || twoTapGt;
+/*--------------------------------------------------------------------------*/
+// (15)
+ if(twoTap) rgby2 = rgby1;
+ if(earlyExit) rgby2 = rgbyM;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
diff --git a/res/effectlib/Fxaa3_8.glsllib b/res/effectlib/Fxaa3_8.glsllib
new file mode 100644
index 0000000..620f565
--- /dev/null
+++ b/res/effectlib/Fxaa3_8.glsllib
@@ -0,0 +1,1423 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 - 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+/*============================================================================
+
+
+ NVIDIA FXAA III.8 by TIMOTHY LOTTES
+
+
+------------------------------------------------------------------------------
+ INTEGRATION CHECKLIST
+------------------------------------------------------------------------------
+(1.)
+In the shader source,
+setup defines for the desired configuration.
+Example,
+
+ #define FXAA_PC 1
+ #define FXAA_HLSL_3 1
+ #define FXAA_LINEAR 1
+
+(2.)
+Then include this file,
+
+
+
+(3.)
+Then call the FXAA pixel shader from within your desired shader,
+
+ return FxaaPixelShader(pos, posPos, tex, rcpFrame, rcpFrameOpt);
+
+(4.)
+Insure pass prior to FXAA outputs RGBL.
+See next section.
+
+(5.)
+Setup engine to provide "rcpFrame" and "rcpFrameOpt" constants.
+Not using constants will result in a performance loss.
+
+ // {x_} = 1.0/screenWidthInPixels
+ // {_y} = 1.0/screenHeightInPixels
+ float2 rcpFrame
+
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+
+(6.)
+Have FXAA vertex shader run as a full screen triangle,
+and output "pos" and "posPos" such that inputs in the pixel shader provide,
+
+ // {xy} = center of pixel
+ float2 pos,
+
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+
+(7.)
+Insure the texture sampler used by FXAA is set to bilinear filtering.
+
+
+------------------------------------------------------------------------------
+ INTEGRATION - RGBL AND COLORSPACE
+------------------------------------------------------------------------------
+FXAA3 requires RGBL as input.
+
+RGB should be LDR (low dynamic range).
+Specifically do FXAA after tonemapping.
+
+RGB data as returned by a texture fetch can be linear or non-linear.
+Note an "sRGB format" texture counts as linear,
+because the result of a texture fetch is linear data.
+Regular "RGBA8" textures in the sRGB colorspace are non-linear.
+If a texture fetch results linear data the following is required,
+
+ #define FXAA_LINEAR 1
+
+Otherwise,
+
+ #define FXAA_LINEAR 0
+
+Luma must be stored in the alpha channel prior to running FXAA.
+This luma value must be gamma 2.0 encoded if using FXAA_LINEAR 1.
+If using FXAA_LINEAR 0, luma should match the perceptual space used for RGB.
+
+Example pass before FXAA where output is gamma 2.0 encoded,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ color.a = dot(color.rgb, float3(0.299, 0.587, 0.114)); // compute luma
+ return color;
+
+Another example where output is linear encoded,
+say for instance writing to an sRGB formated render target,
+where the render target does the conversion back to sRGB after blending,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.a = sqrt(dot(color.rgb, float3(0.299, 0.587, 0.114))); // compute luma
+ return color;
+
+Getting luma correct is required for the algorithm to work correctly.
+
+
+------------------------------------------------------------------------------
+ COMPLEX INTEGRATION
+------------------------------------------------------------------------------
+Q. What if the engine is blending into RGB before wanting to run FXAA?
+
+A. In the last opaque pass prior to FXAA,
+ have the pass write out luma into alpha.
+ Then blend into RGB only.
+ FXAA should be able to run ok
+ assuming the blending pass did not any add aliasing.
+ This should be the common case for particles and common blending passes.
+
+============================================================================*/
+
+/*============================================================================
+
+ INTEGRATION KNOBS
+
+============================================================================*/
+//
+// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).
+//
+// 1 = Use API.
+// 0 = Don't use API.
+//
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PS3
+ #define FXAA_PS3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360
+ #define FXAA_360 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_PC
+ //
+ // FXAA Quality
+ // The high quality PC algorithm.
+ //
+ #define FXAA_PC 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PC_CONSOLE
+ //
+ // The console algorithm for PC is included
+ // for developers targeting really low spec machines.
+ //
+ #define FXAA_PC_CONSOLE 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_120
+ #define FXAA_GLSL_120 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_130
+ #define FXAA_GLSL_130 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_3
+ #define FXAA_HLSL_3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_4
+ #define FXAA_HLSL_4 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_5
+ #define FXAA_HLSL_5 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_EARLY_EXIT
+ //
+ // Controls algorithm's early exit path.
+ // On PS3 turning this on adds 2 cycles to the shader.
+ // On 360 turning this off adds 10ths of a millisecond to the shader.
+ // Turning this off on console will result in a more blurry image.
+ // So this defaults to on.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_EARLY_EXIT 1
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_DISCARD
+ //
+ // Only valid for PC OpenGL currently.
+ //
+ // 1 = Use discard on pixels which don't need AA.
+ // For APIs which enable concurrent TEX+ROP from same surface.
+ // 0 = Return unchanged color on pixels which don't need AA.
+ //
+ #define FXAA_DISCARD 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_LINEAR
+ //
+ // 0 = Work in non-linear color space.
+ // Use this for standard 32-bit RGBA formats.
+ //
+ // 1 = Work in RGB=linear, A=non-linear luma.
+ // Use this for sRGB and FP16 formats.
+ // Works with either FXAA_ALGORITHM = 1 or 0.
+ //
+ #define FXAA_LINEAR 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_FAST_PIXEL_OFFSET
+ //
+ // Used for GLSL 120 only.
+ //
+ // 1 = GL API supports fast pixel offsets
+ // 0 = do not use fast pixel offsets
+ //
+ #ifdef GL_EXT_gpu_shader4
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifndef FXAA_FAST_PIXEL_OFFSET
+ #define FXAA_FAST_PIXEL_OFFSET 0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GATHER4_ALPHA
+ //
+ // 1 = API supports gather4 on alpha channel.
+ // 0 = API does not support gather4 on alpha channel.
+ //
+#ifdef GL_ES
+ #if __VERSION__ >= 310
+ #ifdef GL_EXT_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+#else
+ #if (FXAA_HLSL_5 == 1)
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_EXT_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+#endif
+#endif
+
+/*============================================================================
+ FXAA CONSOLE - TUNING KNOBS
+============================================================================*/
+#ifndef FXAA_CONSOLE__EDGE_SHARPNESS
+ //
+ // Consoles the sharpness of edges.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 4 and 8.
+ // These options use the shaders ability to a free *|/ by 4|8.
+ //
+ // 8.0 is sharper
+ // 4.0 is softer
+ //
+ #if 1
+ #define FXAA_CONSOLE__EDGE_SHARPNESS 8.0
+ #else
+ #define FXAA_CONSOLE__EDGE_SHARPNESS 4.0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_CONSOLE__EDGE_THRESHOLD
+ //
+ // The minimum amount of local contrast required to apply algorithm.
+ // The console setting has a different mapping than the quality setting.
+ //
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 0.25 and 0.125.
+ // These options use the shaders ability to a free *|/ by 4|8.
+ //
+ // 0.125 leaves less aliasing, but is softer
+ // 0.25 leaves more aliasing, and is sharper
+ //
+ #if 1
+ #define FXAA_CONSOLE__EDGE_THRESHOLD 0.125
+ #else
+ #define FXAA_CONSOLE__EDGE_THRESHOLD 0.25
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_CONSOLE__EDGE_THRESHOLD_MIN
+ //
+ // Trims the algorithm from processing darks.
+ // The console setting has a different mapping than the quality setting.
+ //
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ //
+ // This does not apply to PS3.
+ // PS3 was simplified to avoid more shader instructions.
+ //
+ #define FXAA_CONSOLE__EDGE_THRESHOLD_MIN 0.05
+#endif
+
+/*============================================================================
+ FXAA QUALITY - TUNING KNOBS
+============================================================================*/
+#ifndef FXAA_QUALITY__EDGE_THRESHOLD
+ //
+ // The minimum amount of local contrast required to apply algorithm.
+ //
+ // 1/3 - too little
+ // 1/4 - low quality
+ // 1/6 - default
+ // 1/8 - high quality
+ // 1/16 - overkill
+ //
+ #define FXAA_QUALITY__EDGE_THRESHOLD (1.0/6.0)
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_QUALITY__EDGE_THRESHOLD_MIN
+ //
+ // Trims the algorithm from processing darks.
+ //
+ // 1/32 - visible limit
+ // 1/16 - high quality
+ // 1/12 - upper limit (default, the start of visible unfiltered edges)
+ //
+ #define FXAA_QUALITY__EDGE_THRESHOLD_MIN (1.0/12.0)
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_QUALITY__SUBPIX_CAP
+ //
+ // Insures fine detail is not completely removed.
+ // This partly overrides FXAA_SUBPIX_TRIM.
+ //
+ // 3/4 - default amount of filtering
+ // 7/8 - high amount of filtering
+ // 1 - no capping of filtering
+ //
+ #define FXAA_QUALITY__SUBPIX_CAP (3.0/4.0)
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_QUALITY__SUBPIX_TRIM
+ //
+ // Controls removal of sub-pixel aliasing,
+ //
+ // 1/2 - low removal (sharper but more sub-pixel aliasing)
+ // 1/3 - medium removal
+ // 1/4 - default removal
+ // 1/8 - high removal
+ // 0 - complete removal (softer but less sub-pixel aliasing)
+ //
+ #define FXAA_QUALITY__SUBPIX_TRIM (1.0/4.0)
+#endif
+
+
+/*============================================================================
+
+ API PORTING
+
+============================================================================*/
+#if FXAA_GLSL_120
+ // Requires,
+ // #version 120
+ // And at least,
+ // #extension GL_EXT_gpu_shader4 : enable
+ // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)
+ #define half float
+ #define half2 vec2
+ #define half3 vec3
+ #define half4 vec4
+ #define int2 ivec2
+ #define float2 vec2
+ #define float3 vec3
+ #define float4 vec4
+ #define FxaaInt2 ivec2
+ #define FxaaFloat2 vec2
+ #define FxaaFloat3 vec3
+ #define FxaaFloat4 vec4
+ #define FxaaDiscard discard
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) clamp(x, 0.0, 1.0)
+ #define FxaaLerp(x,y,s) mix(x,y,s)
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)
+ #if (FXAA_FAST_PIXEL_OFFSET == 1)
+ #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
+ #else
+ #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)
+ #endif
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p, r) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o, r) textureGatherOffset(t, p, o, 3)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if FXAA_GLSL_130
+ // Requires "#version 130" or better
+ #define half float
+ #define half2 vec2
+ #define half3 vec3
+ #define half4 vec4
+ #define int2 ivec2
+ #define float2 vec2
+ #define float3 vec3
+ #define float4 vec4
+ #define FxaaInt2 ivec2
+ #define FxaaFloat2 vec2
+ #define FxaaFloat3 vec3
+ #define FxaaFloat4 vec4
+ #define FxaaDiscard discard
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) clamp(x, 0.0, 1.0)
+ #define FxaaLerp(x,y,s) mix(x,y,s)
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p, r) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o, r) textureGatherOffset(t, p, o, 3)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1)
+ #define int2 float2
+ #define FxaaInt2 float2
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaDiscard clip(-1)
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) saturate(x)
+ #define FxaaLerp(x,y,s) lerp(x,y,s)
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))
+ #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))
+#endif
+/*--------------------------------------------------------------------------*/
+#if FXAA_HLSL_4
+ #define FxaaInt2 int2
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaDiscard clip(-1)
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) saturate(x)
+ #define FxaaLerp(x,y,s) lerp(x,y,s)
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+#endif
+/*--------------------------------------------------------------------------*/
+#if FXAA_HLSL_5
+ #define FxaaInt2 int2
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaDiscard clip(-1)
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) saturate(x)
+ #define FxaaLerp(x,y,s) lerp(x,y,s)
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+ #define FxaaTexAlpha4(t, p, r) t.tex.GatherAlpha(t.smpl, p)
+ #define FxaaTexOffAlpha4(t, p, o, r) t.tex.GatherAlpha(t.smpl, p, o)
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - 360 PIXEL SHADER
+
+------------------------------------------------------------------------------
+Might be some optimizations left here,
+as of this latest change didn't have a PIX dump to verify if TEX bound.
+============================================================================*/
+#if (FXAA_360 == 1)
+/*--------------------------------------------------------------------------*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = alpha output is junk value
+ FxaaTex tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PC version of FXAA Console
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+ half4 lumaNwNeSwSe;
+ lumaNwNeSwSe.x = FxaaTexTop(tex, posPos.xy).w;
+ lumaNwNeSwSe.y = FxaaTexTop(tex, posPos.zy).w;
+ lumaNwNeSwSe.z = FxaaTexTop(tex, posPos.xw).w;
+ lumaNwNeSwSe.w = FxaaTexTop(tex, posPos.zw).w;
+/*--------------------------------------------------------------------------*/
+ half4 rgbyM = FxaaTexTop(tex, pos.xy);
+/*--------------------------------------------------------------------------*/
+ lumaNwNeSwSe.y += 1.0/384.0;
+/*--------------------------------------------------------------------------*/
+ half2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ half2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+/*--------------------------------------------------------------------------*/
+ half lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
+ half lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
+/*--------------------------------------------------------------------------*/
+ half lumaMinM = min(lumaMin, rgbyM.w);
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+ if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD))
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+/*--------------------------------------------------------------------------*/
+ half2 dir;
+ dir.x = dot(lumaNwNeSwSe, float4(-1.0, -1.0, 1.0, 1.0));
+ dir.y = dot(lumaNwNeSwSe, float4( 1.0, -1.0, 1.0,-1.0));
+/*--------------------------------------------------------------------------*/
+ half2 dir1;
+ dir1 = normalize(dir.xy);
+/*--------------------------------------------------------------------------*/
+ half dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * FXAA_CONSOLE__EDGE_SHARPNESS;
+ half2 dir2;
+ dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
+/*--------------------------------------------------------------------------*/
+ half4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * rcpFrameOpt.zw);
+ half4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * rcpFrameOpt.zw);
+ half4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * rcpFrameOpt.xy);
+ half4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * rcpFrameOpt.xy);
+/*--------------------------------------------------------------------------*/
+ half4 rgbyA = rgbyN1 * 0.5 + rgbyP1 * 0.5;
+ half4 rgbyB = rgbyN2 * 0.25 + rgbyP2 * 0.25 + rgbyA * 0.5;
+/*--------------------------------------------------------------------------*/
+ bool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);
+ if(twoTap) rgbyB.xyz = rgbyA.xyz;
+ return rgbyB;
+}
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT)
+
+==============================================================================
+The code below does not exactly match the assembly.
+I have a feeling that 12 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h0.w(TRUE), v5.xwxx, #0
+ 6: addh h0.z(TRUE), -h2, h0.w
+ 7: texpkb h1.w(TRUE), v5, #0
+ 9: addh h0.x(TRUE), h0.z, -h1.w
+ 10: addh h3.w(TRUE), h0.z, h1
+ 11: texpkb h2.w(TRUE), v5.zwzz, #0
+ 13: addh h0.z(TRUE), h3.w, -h2.w
+ 14: addh h0.x(TRUE), h2.w, h0
+ 15: nrmh h1.xz(TRUE), h0_n
+ 16: minh_m8 h0.x(TRUE), |h1|, |h1.z|
+ 17: maxh h4.w(TRUE), h0, h1
+ 18: divx h2.xy(TRUE), h1_n.xzzw, h0_n
+ 19: movr r1.zw(TRUE), v4.xxxy
+ 20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww
+ 22: minh h5.w(TRUE), h0, h1
+ 23: texpkb h0(TRUE), r2.xzxx, #0
+ 25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1
+ 27: maxh h4.x(TRUE), h2.z, h2.w
+ 28: texpkb h1(TRUE), r0.zwzz, #0
+ 30: addh_d2 h1(TRUE), h0, h1
+ 31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 33: texpkb h0(TRUE), r0, #0
+ 35: minh h4.z(TRUE), h2, h2.w
+ 36: fenct TRUE
+ 37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 39: texpkb h2(TRUE), r1, #0
+ 41: addh_d2 h0(TRUE), h0, h2
+ 42: maxh h2.w(TRUE), h4, h4.x
+ 43: minh h2.x(TRUE), h5.w, h4.z
+ 44: addh_d2 h0(TRUE), h0, h1
+ 45: slth h2.x(TRUE), h0.w, h2
+ 46: sgth h2.w(TRUE), h0, h2
+ 47: movh h0(TRUE), h0
+ 48: addx.c0 rc(TRUE), h2, h2.w
+ 49: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB1 | add | 2: ADDh h2.z, h0.--w-, const.--x-;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB1 | add | 6: ADDh h0.z,-h2, h0.--w-;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 9: ADDh h0.x, h0.z---,-h1.w---;
+ | SCB1 | add | 10: ADDh h3.w, h0.---z, h1;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h2.w---, h0;
+ | SCB1 | add | 13: ADDh h0.z, h3.--w-,-h2.--w-;
+ | | |
+ 5 | SCT1 | mov | 15: NRMh h1.xz, h0;
+ | SRB | nrm | 15: NRMh h1.xz, h0;
+ | SCB0 | min | 16: MINh*8 h0.x, |h1|, |h1.z---|;
+ | SCB1 | max | 17: MAXh h4.w, h0, h1;
+ | | |
+ 6 | SCT0 | div | 18: DIVx h2.xy, h1.xz--, h0;
+ | SCT1 | mov | 19: MOVr r1.zw, g[TEX0].--xy;
+ | SCB0 | mad | 20: MADr r2.xz,-h1, const.z-w-, r1.z-w-;
+ | SCB1 | min | 22: MINh h5.w, h0, h1;
+ | | |
+ 7 | SCT0/1 | mov | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | TEX | txl | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | SCB0 | max | 27: MAXh h4.x, h2.z---, h2.w---;
+ | SCB1 | mad | 25: MADr r0.zw, h1.--xz, const, r1;
+ | | |
+ 8 | SCT0/1 | mov | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | TEX | txl | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | SCB0/1 | add | 30: ADDh/2 h1, h0, h1;
+ | | |
+ 9 | SCT0 | mad | 31: MADr r0.xy,-h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB1 | min | 35: MINh h4.z, h2, h2.--w-;
+ | | |
+ 10 | SCT0 | mad | 37: MADr r1.xy, h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | TEX | txl | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | SCB0/1 | add | 41: ADDh/2 h0, h0, h2;
+ | | |
+ 11 | SCT0 | min | 43: MINh h2.x, h5.w---, h4.z---;
+ | SCT1 | max | 42: MAXh h2.w, h4, h4.---x;
+ | SCB0/1 | add | 44: ADDh/2 h0, h0, h1;
+ | | |
+ 12 | SCT0 | set | 45: SLTh h2.x, h0.w---, h2;
+ | SCT1 | set | 46: SGTh h2.w, h0, h2;
+ | SCB0/1 | mul | 47: MOVh h0, h0;
+ | | |
+ 13 | SCT0 | mad | 48: ADDxc0_s rc, h2, h2.w---;
+ | SCB0/1 | mul | 49: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 0% 0% 50%
+ 6: 100% 0% 75%
+ 7: 0% 100% 75%
+ 8: 0% 100% 100%
+ 9: 0% 100% 25%
+ 10: 0% 100% 100%
+ 11: 50% 0% 100%
+ 12: 50% 0% 100%
+ 13: 25% 0% 100%
+
+MEAN: 17% 61% 67%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 0% 100%
+ 2: 0% 0% 100% 0% 100%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 0% 0% 0% 100% 100%
+ 6: 100% 100% 0% 100% 100%
+ 7: 0% 0% 100% 100% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 0% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 100% 100% 0% 100% 100%
+ 12: 100% 100% 0% 100% 100%
+ 13: 100% 0% 0% 100% 100%
+
+MEAN: 30% 23% 61% 76% 100%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 13 cycles, 3 r regs, 923,076,923 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0)
+/*--------------------------------------------------------------------------*/
+#pragma disablepc all
+#pragma option O3
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = luma in perceptual color space (not linear)
+ sampler2D tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PS3
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 dir;
+ half4 lumaNe = h4tex2Dlod(tex, half4(posPos.zy, 0, 0));
+ lumaNe.w += half(1.0/512.0);
+ dir.x = -lumaNe.w;
+ dir.z = -lumaNe.w;
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(posPos.xw, 0, 0));
+ dir.x += lumaSw.w;
+ dir.z += lumaSw.w;
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(posPos.xy, 0, 0));
+ dir.x -= lumaNw.w;
+ dir.z += lumaNw.w;
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(posPos.zw, 0, 0));
+ dir.x += lumaSe.w;
+ dir.z -= lumaSe.w;
+/*--------------------------------------------------------------------------*/
+// (5)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir.xyz).xz;
+ half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (7)
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (8)
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (11)
+ // compilier moves these scalar ops up to other cycles
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (12)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+/*--------------------------------------------------------------------------*/
+// (13)
+ if(twoTapLt || twoTapGt) rgby2 = rgby1;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT)
+
+==============================================================================
+The code mostly matches the assembly.
+I have a feeling that 14 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h1.w(TRUE), v5.xwxx, #0
+ 6: addh h0.x(TRUE), h1.w, -h2.y
+ 7: texpkb h2.w(TRUE), v5.zwzz, #0
+ 9: minh h4.w(TRUE), h2.y, h2
+ 10: maxh h5.x(TRUE), h2.y, h2.w
+ 11: texpkb h0.w(TRUE), v5, #0
+ 13: addh h3.w(TRUE), -h0, h0.x
+ 14: addh h0.x(TRUE), h0.w, h0
+ 15: addh h0.z(TRUE), -h2.w, h0.x
+ 16: addh h0.x(TRUE), h2.w, h3.w
+ 17: minh h5.y(TRUE), h0.w, h1.w
+ 18: nrmh h2.xz(TRUE), h0_n
+ 19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z|
+ 20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w
+ 21: movr r1.zw(TRUE), v4.xxxy
+ 22: maxh h2.w(TRUE), h0, h1
+ 23: fenct TRUE
+ 24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 26: texpkb h0(TRUE), r0, #0
+ 28: maxh h5.x(TRUE), h2.w, h5
+ 29: minh h5.w(TRUE), h5.y, h4
+ 30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 32: texpkb h2(TRUE), r1, #0
+ 34: addh_d2 h2(TRUE), h0, h2
+ 35: texpkb h1(TRUE), v4, #0
+ 37: maxh h5.y(TRUE), h5.x, h1.w
+ 38: minh h4.w(TRUE), h1, h5
+ 39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 41: texpkb h0(TRUE), r0, #0
+ 43: addh_m8 h5.z(TRUE), h5.y, -h4.w
+ 44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 46: texpkb h3(TRUE), r2, #0
+ 48: addh_d2 h0(TRUE), h0, h3
+ 49: addh_d2 h3(TRUE), h0, h2
+ 50: movh h0(TRUE), h3
+ 51: slth h3.x(TRUE), h3.w, h5.w
+ 52: sgth h3.w(TRUE), h3, h5.x
+ 53: addx.c0 rc(TRUE), h3.x, h3
+ 54: slth.c0 rc(TRUE), h5.z, h5
+ 55: movh h0(c0.NE.w), h2
+ 56: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB0 | add | 2: ADDh h2.y, h0.-w--, const.-x--;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB0 | add | 6: ADDh h0.x, h1.w---,-h2.y---;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | max | 10: MAXh h5.x, h2.y---, h2.w---;
+ | SCB1 | min | 9: MINh h4.w, h2.---y, h2;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h0.w---, h0;
+ | SCB1 | add | 13: ADDh h3.w,-h0, h0.---x;
+ | | |
+ 5 | SCT0 | mad | 16: ADDh h0.x, h2.w---, h3.w---;
+ | SCT1 | mad | 15: ADDh h0.z,-h2.--w-, h0.--x-;
+ | SCB0 | min | 17: MINh h5.y, h0.-w--, h1.-w--;
+ | | |
+ 6 | SCT1 | mov | 18: NRMh h2.xz, h0;
+ | SRB | nrm | 18: NRMh h2.xz, h0;
+ | SCB1 | min | 19: MINh*8 h2.w, |h2.---x|, |h2.---z|;
+ | | |
+ 7 | SCT0 | div | 20: DIVx h4.xy, h2.xz--, h2.ww--;
+ | SCT1 | mov | 21: MOVr r1.zw, g[TEX0].--xy;
+ | SCB1 | max | 22: MAXh h2.w, h0, h1;
+ | | |
+ 8 | SCT0 | mad | 24: MADr r0.xy,-h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | TEX | txl | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | SCB0 | max | 28: MAXh h5.x, h2.w---, h5;
+ | SCB1 | min | 29: MINh h5.w, h5.---y, h4;
+ | | |
+ 9 | SCT0 | mad | 30: MADr r1.xy, h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | TEX | txl | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | SCB0/1 | add | 34: ADDh/2 h2, h0, h2;
+ | | |
+ 10 | SCT0/1 | mov | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | TEX | txl | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | SCB0 | max | 37: MAXh h5.y, h5.-x--, h1.-w--;
+ | SCB1 | min | 38: MINh h4.w, h1, h5;
+ | | |
+ 11 | SCT0 | mad | 39: MADr r0.xy,-h4, const.xy--, r1.zw--;
+ | SCT1 | mov | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB0 | mad | 44: MADr r2.xy, h4, const.xy--, r1.zw--;
+ | SCB1 | add | 43: ADDh*8 h5.z, h5.--y-,-h4.--w-;
+ | | |
+ 12 | SCT0/1 | mov | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | TEX | txl | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | SCB0/1 | add | 48: ADDh/2 h0, h0, h3;
+ | | |
+ 13 | SCT0/1 | mad | 49: ADDh/2 h3, h0, h2;
+ | SCB0/1 | mul | 50: MOVh h0, h3;
+ | | |
+ 14 | SCT0 | set | 51: SLTh h3.x, h3.w---, h5.w---;
+ | SCT1 | set | 52: SGTh h3.w, h3, h5.---x;
+ | SCB0 | set | 54: SLThc0 rc, h5.z---, h5;
+ | SCB1 | add | 53: ADDxc0_s rc, h3.---x, h3;
+ | | |
+ 15 | SCT0/1 | mul | 55: MOVh h0(NE0.wwww), h2;
+ | SCB0/1 | mul | 56: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 50% 0% 25%
+ 6: 0% 0% 25%
+ 7: 100% 0% 25%
+ 8: 0% 100% 50%
+ 9: 0% 100% 100%
+ 10: 0% 100% 50%
+ 11: 0% 100% 75%
+ 12: 0% 100% 100%
+ 13: 100% 0% 100%
+ 14: 50% 0% 50%
+ 15: 100% 0% 100%
+
+MEAN: 26% 60% 56%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 100% 0%
+ 2: 0% 0% 100% 100% 0%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 100% 100% 0% 100% 0%
+ 6: 0% 0% 0% 0% 100%
+ 7: 100% 100% 0% 0% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 100% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 0% 0% 100% 100% 100%
+ 12: 0% 0% 100% 100% 100%
+ 13: 100% 100% 0% 100% 100%
+ 14: 100% 100% 0% 100% 100%
+ 15: 100% 100% 0% 100% 100%
+
+MEAN: 33% 33% 60% 86% 80%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 15 cycles, 3 r regs, 800,000,000 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1)
+/*--------------------------------------------------------------------------*/
+#pragma disablepc all
+#pragma option O2
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = luma in perceptual color space (not linear)
+ sampler2D tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PS3
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 rgbyNe = h4tex2Dlod(tex, half4(posPos.zy, 0, 0));
+ half lumaNe = rgbyNe.w + half(1.0/512.0);
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(posPos.xw, 0, 0));
+ half lumaSwNegNe = lumaSw.w - lumaNe;
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(posPos.xy, 0, 0));
+ half lumaMaxNwSw = max(lumaNw.w, lumaSw.w);
+ half lumaMinNwSw = min(lumaNw.w, lumaSw.w);
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(posPos.zw, 0, 0));
+ half dirZ = lumaNw.w + lumaSwNegNe;
+ half dirX = -lumaNw.w + lumaSwNegNe;
+/*--------------------------------------------------------------------------*/
+// (5)
+ half3 dir;
+ dir.y = 0.0;
+ dir.x = lumaSe.w + dirX;
+ dir.z = -lumaSe.w + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.w);
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir).xz;
+ half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (7)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half lumaMaxNeSe = max(lumaNe, lumaSe.w);
+/*--------------------------------------------------------------------------*/
+// (8)
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe);
+ half lumaMin = min(lumaMinNwSw, lumaMinNeSe);
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0));
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+ half lumaMinM = min(lumaMin, rgbyM.w);
+/*--------------------------------------------------------------------------*/
+// (11)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
+ half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__EDGE_THRESHOLD;
+/*--------------------------------------------------------------------------*/
+// (12)
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (13)
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (14)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ bool earlyExit = lumaRangeM < lumaMax;
+ bool twoTap = twoTapLt || twoTapGt;
+/*--------------------------------------------------------------------------*/
+// (15)
+ if(twoTap) rgby2 = rgby1;
+ if(earlyExit) rgby2 = rgbyM;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - PC PIXEL SHADER
+
+------------------------------------------------------------------------------
+Using a modified version of the PS3 version here to best target old hardware.
+============================================================================*/
+#if (FXAA_PC_CONSOLE == 1)
+/*--------------------------------------------------------------------------*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = alpha output is junk value
+ FxaaTex tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PC version of FXAA Console
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+ half4 dir;
+ dir.y = 0.0;
+ half4 lumaNe = FxaaTexTop(tex, posPos.zy);
+ lumaNe.w += half(1.0/384.0);
+ dir.x = -lumaNe.w;
+ dir.z = -lumaNe.w;
+/*--------------------------------------------------------------------------*/
+ half4 lumaSw = FxaaTexTop(tex, posPos.xw);
+ dir.x += lumaSw.w;
+ dir.z += lumaSw.w;
+/*--------------------------------------------------------------------------*/
+ half4 lumaNw = FxaaTexTop(tex, posPos.xy);
+ dir.x -= lumaNw.w;
+ dir.z += lumaNw.w;
+/*--------------------------------------------------------------------------*/
+ half4 lumaSe = FxaaTexTop(tex, posPos.zw);
+ dir.x += lumaSe.w;
+ dir.z -= lumaSe.w;
+/*==========================================================================*/
+ #if (FXAA_EARLY_EXIT == 1)
+ half4 rgbyM = FxaaTexTop(tex, pos.xy);
+/*--------------------------------------------------------------------------*/
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+/*--------------------------------------------------------------------------*/
+ half lumaMinM = min(lumaMin, rgbyM.w);
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+/*--------------------------------------------------------------------------*/
+ if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD))
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+ #endif
+/*==========================================================================*/
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir.xyz).xz;
+ half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+ temp1N = FxaaTexTop(tex, temp1N.xy);
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+ rgby1 = FxaaTexTop(tex, rgby1.xy);
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
+ temp2N = FxaaTexTop(tex, temp2N.xy);
+/*--------------------------------------------------------------------------*/
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
+ rgby2 = FxaaTexTop(tex, rgby2.xy);
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_EARLY_EXIT == 0)
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+ #endif
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+/*--------------------------------------------------------------------------*/
+ if(twoTapLt || twoTapGt) rgby2 = rgby1;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 QUALITY - PC
+
+============================================================================*/
+#if (FXAA_PC == 1)
+/*--------------------------------------------------------------------------*/
+float4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xyzw} = not used on FXAA3 Quality
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = luma in perceptual color space (not linear)
+ FxaaTex tex,
+ // This must be from a constant/uniform.
+ // {x_} = 1.0/screenWidthInPixels
+ // {_y} = 1.0/screenHeightInPixels
+ float2 rcpFrame,
+ // {xyzw} = not used on FXAA3 Quality
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GATHER4_ALPHA == 1)
+ float4 luma4A = FxaaTexOffAlpha4(tex, pos.xy, FxaaInt2(-1, -1), rcpFrame.xy);
+ #if (FXAA_DISCARD == 0)
+ float4 rgbyM = FxaaTexTop(tex, pos.xy);
+ #endif
+ float4 luma4B = FxaaTexAlpha4(tex, pos.xy, rcpFrame.xy);
+ float lumaNE = FxaaTexOff(tex, pos.xy, FxaaInt2(1, -1), rcpFrame.xy).w;
+ float lumaSW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1, 1), rcpFrame.xy).w;
+ float lumaNW = luma4A.w;
+ float lumaN = luma4A.z;
+ float lumaW = luma4A.x;
+ float lumaM = luma4A.y;
+ float lumaE = luma4B.z;
+ float lumaS = luma4B.x;
+ float lumaSE = luma4B.y;
+ #else
+ float lumaN = FxaaTexOff(tex, pos.xy, FxaaInt2(0, -1), rcpFrame.xy).w;
+ float lumaW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1, 0), rcpFrame.xy).w;
+ float4 rgbyM = FxaaTexTop(tex, pos.xy);
+ float lumaE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1, 0), rcpFrame.xy).w;
+ float lumaS = FxaaTexOff(tex, pos.xy, FxaaInt2( 0, 1), rcpFrame.xy).w;
+ float lumaM = rgbyM.w;
+ #endif
+/*--------------------------------------------------------------------------*/
+ float rangeMin = min(lumaM, min(min(lumaN, lumaW), min(lumaS, lumaE)));
+ float rangeMax = max(lumaM, max(max(lumaN, lumaW), max(lumaS, lumaE)));
+ float range = rangeMax - rangeMin;
+/*--------------------------------------------------------------------------*/
+ if(range < max(FXAA_QUALITY__EDGE_THRESHOLD_MIN, rangeMax * FXAA_QUALITY__EDGE_THRESHOLD))
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GATHER4_ALPHA == 0)
+ float lumaNW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1,-1), rcpFrame.xy).w;
+ float lumaNE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1,-1), rcpFrame.xy).w;
+ float lumaSW = FxaaTexOff(tex, pos.xy, FxaaInt2(-1, 1), rcpFrame.xy).w;
+ float lumaSE = FxaaTexOff(tex, pos.xy, FxaaInt2( 1, 1), rcpFrame.xy).w;
+ #endif
+/*--------------------------------------------------------------------------*/
+ #define FXAA_QUALITY__SUBPIX_TRIM_SCALE (1.0/(1.0 - FXAA_QUALITY__SUBPIX_TRIM))
+/*--------------------------------------------------------------------------*/
+ float lumaL = (lumaN + lumaW + lumaE + lumaS) * 0.25;
+ float rangeL = abs(lumaL - lumaM);
+ float blendL = FxaaSat((rangeL / range) - FXAA_QUALITY__SUBPIX_TRIM) * FXAA_QUALITY__SUBPIX_TRIM_SCALE;
+ blendL = min(FXAA_QUALITY__SUBPIX_CAP, blendL);
+/*--------------------------------------------------------------------------*/
+ float edgeVert =
+ abs(lumaNW + (-2.0 * lumaN) + lumaNE) +
+ 2.0 * abs(lumaW + (-2.0 * lumaM) + lumaE ) +
+ abs(lumaSW + (-2.0 * lumaS) + lumaSE);
+ float edgeHorz =
+ abs(lumaNW + (-2.0 * lumaW) + lumaSW) +
+ 2.0 * abs(lumaN + (-2.0 * lumaM) + lumaS ) +
+ abs(lumaNE + (-2.0 * lumaE) + lumaSE);
+ bool horzSpan = edgeHorz >= edgeVert;
+/*--------------------------------------------------------------------------*/
+ float lengthSign = horzSpan ? -rcpFrame.y : -rcpFrame.x;
+ if(!horzSpan) lumaN = lumaW;
+ if(!horzSpan) lumaS = lumaE;
+ float gradientN = abs(lumaN - lumaM);
+ float gradientS = abs(lumaS - lumaM);
+ lumaN = (lumaN + lumaM) * 0.5;
+ lumaS = (lumaS + lumaM) * 0.5;
+/*--------------------------------------------------------------------------*/
+ bool pairN = gradientN >= gradientS;
+ if(!pairN) lumaN = lumaS;
+ if(!pairN) gradientN = gradientS;
+ if(!pairN) lengthSign *= -1.0;
+ float2 posN;
+ posN.x = pos.x + (horzSpan ? 0.0 : lengthSign * 0.5);
+ posN.y = pos.y + (horzSpan ? lengthSign * 0.5 : 0.0);
+/*--------------------------------------------------------------------------*/
+ #define FXAA_SEARCH_STEPS 6
+ #define FXAA_SEARCH_THRESHOLD (1.0/4.0)
+/*--------------------------------------------------------------------------*/
+ gradientN *= FXAA_SEARCH_THRESHOLD;
+/*--------------------------------------------------------------------------*/
+ float2 posP = posN;
+ float2 offNP = horzSpan ?
+ FxaaFloat2(rcpFrame.x, 0.0) :
+ FxaaFloat2(0.0, rcpFrame.y);
+ float lumaEndN;
+ float lumaEndP;
+ bool doneN = false;
+ bool doneP = false;
+ posN += offNP * (-1.5);
+ posP += offNP * ( 1.5);
+ for(int i = 0; i < FXAA_SEARCH_STEPS; i++) {
+ lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ bool doneN2 = abs(lumaEndN - lumaN) >= gradientN;
+ bool doneP2 = abs(lumaEndP - lumaN) >= gradientN;
+ if(doneN2 && !doneN) posN += offNP;
+ if(doneP2 && !doneP) posP -= offNP;
+ if(doneN2 && doneP2) break;
+ doneN = doneN2;
+ doneP = doneP2;
+ if(!doneN) posN -= offNP * 2.0;
+ if(!doneP) posP += offNP * 2.0; }
+/*--------------------------------------------------------------------------*/
+ float dstN = horzSpan ? pos.x - posN.x : pos.y - posN.y;
+ float dstP = horzSpan ? posP.x - pos.x : posP.y - pos.y;
+/*--------------------------------------------------------------------------*/
+ bool directionN = dstN < dstP;
+ lumaEndN = directionN ? lumaEndN : lumaEndP;
+/*--------------------------------------------------------------------------*/
+ if(((lumaM - lumaN) < 0.0) == ((lumaEndN - lumaN) < 0.0))
+ lengthSign = 0.0;
+/*--------------------------------------------------------------------------*/
+ float spanLength = (dstP + dstN);
+ dstN = directionN ? dstN : dstP;
+ float subPixelOffset = 0.5 + (dstN * (-1.0/spanLength));
+ subPixelOffset += blendL * (1.0/8.0);
+ subPixelOffset *= lengthSign;
+ float3 rgbF = FxaaTexTop(tex, FxaaFloat2(
+ pos.x + (horzSpan ? 0.0 : subPixelOffset),
+ pos.y + (horzSpan ? subPixelOffset : 0.0))).xyz;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_LINEAR == 1)
+ lumaL *= lumaL;
+ #endif
+ float lumaF = dot(rgbF, float3(0.299, 0.587, 0.114)) + (1.0/(65536.0*256.0));
+ float lumaB = FxaaLerp(lumaF, lumaL, blendL);
+ float scale = min(4.0, lumaB/lumaF);
+ rgbF *= scale;
+ return float4(rgbF, lumaM); }
+/*==========================================================================*/
+#endif
+
+
+
diff --git a/res/effectlib/SMAA.glsllib b/res/effectlib/SMAA.glsllib
new file mode 100644
index 0000000..97e0153
--- /dev/null
+++ b/res/effectlib/SMAA.glsllib
@@ -0,0 +1,1444 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/**
+ * Copyright (C) 2011 Jorge Jimenez (jorge@iryoku.com)
+ * Copyright (C) 2011 Jose I. Echevarria (joseignacioechevarria@gmail.com)
+ * Copyright (C) 2011 Belen Masia (bmasia@unizar.es)
+ * Copyright (C) 2011 Fernando Navarro (fernandn@microsoft.com)
+ * Copyright (C) 2011 Diego Gutierrez (diegog@unizar.es)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution:
+ *
+ * "Uses SMAA. Copyright (C) 2011 by Jorge Jimenez, Jose I. Echevarria,
+ * Tiago Sousa, Belen Masia, Fernando Navarro and Diego Gutierrez."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
+ * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are
+ * those of the authors and should not be interpreted as representing official
+ * policies, either expressed or implied, of the copyright holders.
+ */
+
+
+/**
+ * _______ ___ ___ ___ ___
+ * / || \/ | / \ / \
+ * | (---- | \ / | / ^ \ / ^ \
+ * \ \ | |\/| | / /_\ \ / /_\ \
+ * ----) | | | | | / _____ \ / _____ \
+ * |_______/ |__| |__| /__/ \__\ /__/ \__\
+ *
+ * E N H A N C E D
+ * S U B P I X E L M O R P H O L O G I C A L A N T I A L I A S I N G
+ *
+ * http://www.iryoku.com/smaa/
+ *
+ * Hi, welcome aboard!
+ *
+ * Here you'll find instructions to get the shader up and running as fast as
+ * possible.
+ *
+ * IMPORTANTE NOTICE: when updating, remember to update both this file and the
+ * precomputed textures! They may change from version to version.
+ *
+ * The shader has three passes, chained together as follows:
+ *
+ * |input|------------------
+ * v |
+ * [ SMAA*EdgeDetection ] |
+ * v |
+ * |edgesTex| |
+ * v |
+ * [ SMAABlendingWeightCalculation ] |
+ * v |
+ * |blendTex| |
+ * v |
+ * [ SMAANeighborhoodBlending ] <------
+ * v
+ * |output|
+ *
+ * Note that each [pass] has its own vertex and pixel shader.
+ *
+ * You've three edge detection methods to choose from: luma, color or depth.
+ * They represent different quality/performance and anti-aliasing/sharpness
+ * tradeoffs, so our recommendation is for you to choose the one that best
+ * suits your particular scenario:
+ *
+ * - Depth edge detection is usually the fastest but it may miss some edges.
+ *
+ * - Luma edge detection is usually more expensive than depth edge detection,
+ * but catches visible edges that depth edge detection can miss.
+ *
+ * - Color edge detection is usually the most expensive one but catches
+ * chroma-only edges.
+ *
+ * For quickstarters: just use luma edge detection.
+ *
+ * The general advice is to not rush the integration process and ensure each
+ * step is done correctly (don't try to integrate SMAA T2x with predicated edge
+ * detection from the start!). Ok then, let's go!
+ *
+ * 1. The first step is to create two RGBA temporal framebuffers for holding
+ * |edgesTex| and |blendTex|.
+ *
+ * In DX10, you can use a RG framebuffer for the edges texture, but in our
+ * experience it yields worse performance.
+ *
+ * On the Xbox 360, you can use the same framebuffer for resolving both
+ * |edgesTex| and |blendTex|, as they aren't needed simultaneously.
+ *
+ * 2. Both temporal framebuffers |edgesTex| and |blendTex| must be cleared
+ * each frame. Do not forget to clear the alpha channel!
+ *
+ * 3. The next step is loading the two supporting precalculated textures,
+ * 'areaTex' and 'searchTex'. You'll find them in the 'Textures' folder as
+ * C++ headers, and also as regular DDS files. They'll be needed for the
+ * 'SMAABlendingWeightCalculation' pass.
+ *
+ * If you use the C++ headers, be sure to load them in the format specified
+ * inside of them.
+ *
+ * 4. In DX9, all samplers must be set to linear filtering and clamp, with the
+ * exception of 'searchTex', which must be set to point filtering.
+ *
+ * 5. All texture reads and buffer writes must be non-sRGB, with the exception
+ * of the input read and the output write of input in
+ * 'SMAANeighborhoodBlending' (and only in this pass!). If sRGB reads in
+ * this last pass are not possible, the technique will work anyway, but
+ * will perform antialiasing in gamma space.
+ *
+ * IMPORTANT: for best results the input read for the color/luma edge
+ * detection should *NOT* be sRGB.
+ *
+ * 6. Before including SMAA.h you'll have to setup the framebuffer pixel size,
+ * the target and any optional configuration defines. Optionally you can
+ * use a preset.
+ *
+ * You have three targets available:
+ * SMAA_HLSL_3
+ * SMAA_HLSL_4
+ * SMAA_HLSL_4_1
+ * SMAA_GLSL_3 *
+ * SMAA_GLSL_4 *
+ *
+ * * (See SMAA_ONLY_COMPILE_VS below).
+ *
+ * And four presets:
+ * SMAA_PRESET_LOW (%60 of the quality)
+ * SMAA_PRESET_MEDIUM (%80 of the quality)
+ * SMAA_PRESET_HIGH (%95 of the quality)
+ * SMAA_PRESET_ULTRA (%99 of the quality)
+ *
+ * For example:
+ * #define SMAA_PIXEL_SIZE float2(1.0 / 1280.0, 1.0 / 720.0)
+ * #define SMAA_HLSL_4 1
+ * #define SMAA_PRESET_HIGH 1
+ * include "SMAA.h"
+ *
+ * 7. Then, you'll have to setup the passes as indicated in the scheme above.
+ * You can take a look into SMAA.fx, to see how we did it for our demo.
+ * Checkout the function wrappers, you may want to copy-paste them!
+ *
+ * 8. It's recommended to validate the produced |edgesTex| and |blendTex|.
+ * It's advised to not continue with the implementation until both buffers
+ * are verified to produce identical results to our reference demo.
+ *
+ * 9. After you get the last pass to work, it's time to optimize. You'll have
+ * to initialize a stencil buffer in the first pass (discard is already in
+ * the code), then mask execution by using it the second pass. The last
+ * pass should be executed in all pixels.
+ *
+ *
+ * After this point you can choose to enable predicated thresholding,
+ * temporal supersampling and motion blur integration:
+ *
+ * a) If you want to use predicated thresholding, take a look into
+ * SMAA_PREDICATION; you'll need to pass an extra texture in the edge
+ * detection pass.
+ *
+ * b) If you want to enable temporal supersampling (SMAA T2x):
+ *
+ * 1. The first step is to render using subpixel jitters. I won't go into
+ * detail, but it's as simple as moving each vertex position in the
+ * vertex shader, you can check how we do it in our DX10 demo.
+ *
+ * 2. Then, you must setup the temporal resolve. You may want to take a look
+ * into SMAAResolve for resolving 2x modes. After you get it working, you'll
+ * probably see ghosting everywhere. But fear not, you can enable the
+ * CryENGINE temporal reprojection by setting the SMAA_REPROJECTION macro.
+ *
+ * 3. The next step is to apply SMAA to each subpixel jittered frame, just as
+ * done for 1x.
+ *
+ * 4. At this point you should already have something usable, but for best
+ * results the proper area textures must be set depending on current jitter.
+ * For this, the parameter 'subsampleIndices' of
+ * 'SMAABlendingWeightCalculationPS' must be set as follows, for our T2x
+ * mode:
+ *
+ * @SUBSAMPLE_INDICES
+ *
+ * | S# | Camera Jitter | subsampleIndices |
+ * +----+------------------+--------------------+
+ * | 0 | ( 0.25, -0.25) | int4(1, 1, 1, 0) |
+ * | 1 | (-0.25, 0.25) | int4(2, 2, 2, 0) |
+ *
+ * These jitter positions assume a bottom-to-top y axis. S# stands for the
+ * sample number.
+ *
+ * More information about temporal supersampling here:
+ * http://iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf
+ *
+ * c) If you want to enable spatial multisampling (SMAA S2x):
+ *
+ * 1. The scene must be rendered using MSAA 2x. The MSAA 2x buffer must be
+ * created with:
+ * - DX10: see below (*)
+ * - DX10.1: D3D10_STANDARD_MULTISAMPLE_PATTERN or
+ * - DX11: D3D11_STANDARD_MULTISAMPLE_PATTERN
+ *
+ * This allows to ensure that the subsample order matches the table in
+ * @SUBSAMPLE_INDICES.
+ *
+ * (*) In the case of DX10, we refer the reader to:
+ * - SMAA::detectMSAAOrder and
+ * - SMAA::msaaReorder
+ *
+ * These functions allow to match the standard multisample patterns by
+ * detecting the subsample order for a specific GPU, and reordering
+ * them appropriately.
+ *
+ * 2. A shader must be run to output each subsample into a separate buffer
+ * (DX10 is required). You can use SMAASeparate for this purpose, or just do
+ * it in an existing pass (for example, in the tone mapping pass).
+ *
+ * 3. The full SMAA 1x pipeline must be run for each separated buffer, storing
+ * the results in the final buffer. The second run should alpha blend with
+ * the existing final buffer using a blending factor of 0.5.
+ * 'subsampleIndices' must be adjusted as in the SMAA T2x case (see point
+ * b).
+ *
+ * d) If you want to enable temporal supersampling on top of SMAA S2x
+ * (which actually is SMAA 4x):
+ *
+ * 1. SMAA 4x consists on temporally jittering SMAA S2x, so the first step is
+ * to calculate SMAA S2x for current frame. In this case, 'subsampleIndices'
+ * must be set as follows:
+ *
+ * | F# | S# | Camera Jitter | Net Jitter | subsampleIndices |
+ * +----+----+--------------------+-------------------+--------------------+
+ * | 0 | 0 | ( 0.125, 0.125) | ( 0.375, -0.125) | int4(5, 3, 1, 3) |
+ * | 0 | 1 | ( 0.125, 0.125) | (-0.125, 0.375) | int4(4, 6, 2, 3) |
+ * +----+----+--------------------+-------------------+--------------------+
+ * | 1 | 2 | (-0.125, -0.125) | ( 0.125, -0.375) | int4(3, 5, 1, 4) |
+ * | 1 | 3 | (-0.125, -0.125) | (-0.375, 0.125) | int4(6, 4, 2, 4) |
+ *
+ * These jitter positions assume a bottom-to-top y axis. F# stands for the
+ * frame number. S# stands for the sample number.
+ *
+ * 2. After calculating SMAA S2x for current frame (with the new subsample
+ * indices), previous frame must be reprojected as in SMAA T2x mode (see
+ * point b).
+ *
+ * e) If motion blur is used, you may want to do the edge detection pass
+ * together with motion blur. This has two advantages:
+ *
+ * 1. Pixels under heavy motion can be omitted from the edge detection process.
+ * For these pixels we can just store "no edge", as motion blur will take
+ * care of them.
+ * 2. The center pixel tap is reused.
+ *
+ * Note that in this case depth testing should be used instead of stenciling,
+ * as we have to write all the pixels in the motion blur pass.
+ *
+ * That's it!
+ */
+
+//-----------------------------------------------------------------------------
+// SMAA Presets
+
+/**
+ * Note that if you use one of these presets, the corresponding macros below
+ * won't be used.
+ */
+
+#if SMAA_PRESET_LOW == 1
+#define SMAA_THRESHOLD 0.15
+#define SMAA_MAX_SEARCH_STEPS 4
+#define SMAA_MAX_SEARCH_STEPS_DIAG 0
+#define SMAA_CORNER_ROUNDING 100
+#elif SMAA_PRESET_MEDIUM == 1
+#define SMAA_THRESHOLD 0.1
+#define SMAA_MAX_SEARCH_STEPS 8
+#define SMAA_MAX_SEARCH_STEPS_DIAG 0
+#define SMAA_CORNER_ROUNDING 100
+#elif SMAA_PRESET_HIGH == 1
+#define SMAA_THRESHOLD 0.1
+#define SMAA_MAX_SEARCH_STEPS 16
+#define SMAA_MAX_SEARCH_STEPS_DIAG 8
+#define SMAA_CORNER_ROUNDING 25
+#elif SMAA_PRESET_ULTRA == 1
+#define SMAA_THRESHOLD 0.05
+#define SMAA_MAX_SEARCH_STEPS 32
+#define SMAA_MAX_SEARCH_STEPS_DIAG 16
+#define SMAA_CORNER_ROUNDING 25
+#endif
+
+//-----------------------------------------------------------------------------
+// Configurable Defines
+
+/**
+ * SMAA_THRESHOLD specifies the threshold or sensitivity to edges.
+ * Lowering this value you will be able to detect more edges at the expense of
+ * performance.
+ *
+ * Range: [0, 0.5]
+ * 0.1 is a reasonable value, and allows to catch most visible edges.
+ * 0.05 is a rather overkill value, that allows to catch 'em all.
+ *
+ * If temporal supersampling is used, 0.2 could be a reasonable value, as low
+ * contrast edges are properly filtered by just 2x.
+ */
+#ifndef SMAA_THRESHOLD
+#define SMAA_THRESHOLD 0.1
+#endif
+
+/**
+ * SMAA_DEPTH_THRESHOLD specifies the threshold for depth edge detection.
+ *
+ * Range: depends on the depth range of the scene.
+ */
+#ifndef SMAA_DEPTH_THRESHOLD
+#define SMAA_DEPTH_THRESHOLD (0.1 * SMAA_THRESHOLD)
+#endif
+
+/**
+ * SMAA_MAX_SEARCH_STEPS specifies the maximum steps performed in the
+ * horizontal/vertical pattern searches, at each side of the pixel.
+ *
+ * In number of pixels, it's actually the double. So the maximum line length
+ * perfectly handled by, for example 16, is 64 (by perfectly, we meant that
+ * longer lines won't look as good, but still antialiased).
+ *
+ * Range: [0, 98]
+ */
+#ifndef SMAA_MAX_SEARCH_STEPS
+#define SMAA_MAX_SEARCH_STEPS 16
+#endif
+
+/**
+ * SMAA_MAX_SEARCH_STEPS_DIAG specifies the maximum steps performed in the
+ * diagonal pattern searches, at each side of the pixel. In this case we jump
+ * one pixel at time, instead of two.
+ *
+ * Range: [0, 20]; set it to 0 to disable diagonal processing.
+ *
+ * On high-end machines it is cheap (between a 0.8x and 0.9x slower for 16
+ * steps), but it can have a significant impact on older machines.
+ */
+#ifndef SMAA_MAX_SEARCH_STEPS_DIAG
+#define SMAA_MAX_SEARCH_STEPS_DIAG 8
+#endif
+
+/**
+ * SMAA_CORNER_ROUNDING specifies how much sharp corners will be rounded.
+ *
+ * Range: [0, 100]; set it to 100 to disable corner detection.
+ */
+#ifndef SMAA_CORNER_ROUNDING
+#define SMAA_CORNER_ROUNDING 25
+#endif
+
+/**
+ * Predicated thresholding allows to better preserve texture details and to
+ * improve performance, by decreasing the number of detected edges using an
+ * additional buffer like the light accumulation buffer, object ids or even the
+ * depth buffer (the depth buffer usage may be limited to indoor or short range
+ * scenes).
+ *
+ * It locally decreases the luma or color threshold if an edge is found in an
+ * additional buffer (so the global threshold can be higher).
+ *
+ * This method was developed by Playstation EDGE MLAA team, and used in
+ * Killzone 3, by using the light accumulation buffer. More information here:
+ * http://iryoku.com/aacourse/downloads/06-MLAA-on-PS3.pptx
+ */
+#ifndef SMAA_PREDICATION
+#define SMAA_PREDICATION 0
+#endif
+
+/**
+ * Threshold to be used in the additional predication buffer.
+ *
+ * Range: depends on the input, so you'll have to find the magic number that
+ * works for you.
+ */
+#ifndef SMAA_PREDICATION_THRESHOLD
+#define SMAA_PREDICATION_THRESHOLD 0.01
+#endif
+
+/**
+ * How much to scale the global threshold used for luma or color edge
+ * detection when using predication.
+ *
+ * Range: [1, 5]
+ */
+#ifndef SMAA_PREDICATION_SCALE
+#define SMAA_PREDICATION_SCALE 2.0
+#endif
+
+/**
+ * How much to locally decrease the threshold.
+ *
+ * Range: [0, 1]
+ */
+#ifndef SMAA_PREDICATION_STRENGTH
+#define SMAA_PREDICATION_STRENGTH 0.4
+#endif
+
+/**
+ * Temporal reprojection allows to remove ghosting artifacts when using
+ * temporal supersampling. We use the CryEngine 3 method which also introduces
+ * velocity weighting. This feature is of extreme importance for totally
+ * removing ghosting. More information here:
+ * http://iryoku.com/aacourse/downloads/13-Anti-Aliasing-Methods-in-CryENGINE-3.pdf
+ *
+ * Note that you'll need to setup a velocity buffer for enabling reprojection.
+ * For static geometry, saving the previous depth buffer is a viable
+ * alternative.
+ */
+#ifndef SMAA_REPROJECTION
+#define SMAA_REPROJECTION 0
+#endif
+
+/**
+ * SMAA_REPROJECTION_WEIGHT_SCALE controls the velocity weighting. It allows to
+ * remove ghosting trails behind the moving object, which are not removed by
+ * just using reprojection. Using low values will exhibit ghosting, while using
+ * high values will disable temporal supersampling under motion.
+ *
+ * Behind the scenes, velocity weighting removes temporal supersampling when
+ * the velocity of the subsamples differs (meaning they are different objects).
+ *
+ * Range: [0, 80]
+ */
+#define SMAA_REPROJECTION_WEIGHT_SCALE 30.0
+
+/**
+ * In the last pass we leverage bilinear filtering to avoid some lerps.
+ * However, bilinear filtering is done in gamma space in DX9, under DX9
+ * hardware (but not in DX9 code running on DX10 hardware), which gives
+ * inaccurate results.
+ *
+ * So, if you are in DX9, under DX9 hardware, and do you want accurate linear
+ * blending, you must set this flag to 1.
+ *
+ * It's ignored when using SMAA_HLSL_4, and of course, only has sense when
+ * using sRGB read and writes on the last pass.
+ */
+#ifndef SMAA_DIRECTX9_LINEAR_BLEND
+#define SMAA_DIRECTX9_LINEAR_BLEND 0
+#endif
+
+/**
+ * On ATI compilers, discard cannot be used in vertex shaders. Thus, they need
+ * to be compiled separately. These macros allow to easily accomplish it.
+ */
+#ifndef SMAA_ONLY_COMPILE_VS
+#define SMAA_ONLY_COMPILE_VS 0
+#endif
+#ifndef SMAA_ONLY_COMPILE_PS
+#define SMAA_ONLY_COMPILE_PS 0
+#endif
+
+//-----------------------------------------------------------------------------
+// Non-Configurable Defines
+
+#ifndef SMAA_AREATEX_MAX_DISTANCE
+#define SMAA_AREATEX_MAX_DISTANCE 16
+#endif
+#ifndef SMAA_AREATEX_MAX_DISTANCE_DIAG
+#define SMAA_AREATEX_MAX_DISTANCE_DIAG 20
+#endif
+#define SMAA_AREATEX_PIXEL_SIZE (1.0 / float2(160.0, 560.0))
+#define SMAA_AREATEX_SUBTEX_SIZE (1.0 / 7.0)
+
+//-----------------------------------------------------------------------------
+// Porting Functions
+
+#if SMAA_HLSL_3 == 1
+#define SMAATexture2D sampler2D
+#define SMAASampleLevelZero(tex, coord) tex2Dlod(tex, float4(coord, 0.0, 0.0))
+#define SMAASampleLevelZeroPoint(tex, coord) tex2Dlod(tex, float4(coord, 0.0, 0.0))
+#define SMAASample(tex, coord) tex2D(tex, coord)
+#define SMAASamplePoint(tex, coord) tex2D(tex, coord)
+#define SMAASampleLevelZeroOffset(tex, coord, offset) tex2Dlod(tex, float4(coord + offset * SMAA_PIXEL_SIZE, 0.0, 0.0))
+#define SMAASampleOffset(tex, coord, offset) tex2D(tex, coord + offset * SMAA_PIXEL_SIZE)
+#define SMAALerp(a, b, t) lerp(a, b, t)
+#define SMAASaturate(a) saturate(a)
+#define SMAAMad(a, b, c) mad(a, b, c)
+#define SMAA_FLATTEN [flatten]
+#define SMAA_BRANCH [branch]
+#endif
+#if SMAA_HLSL_4 == 1 || SMAA_HLSL_4_1 == 1
+SamplerState LinearSampler { Filter = MIN_MAG_LINEAR_MIP_POINT; AddressU = Clamp; AddressV = Clamp; };
+SamplerState PointSampler { Filter = MIN_MAG_MIP_POINT; AddressU = Clamp; AddressV = Clamp; };
+#define SMAATexture2D Texture2D
+#define SMAASampleLevelZero(tex, coord) tex.SampleLevel(LinearSampler, coord, 0)
+#define SMAASampleLevelZeroPoint(tex, coord) tex.SampleLevel(PointSampler, coord, 0)
+#define SMAASample(tex, coord) SMAASampleLevelZero(tex, coord)
+#define SMAASamplePoint(tex, coord) SMAASampleLevelZeroPoint(tex, coord)
+#define SMAASampleLevelZeroOffset(tex, coord, offset) tex.SampleLevel(LinearSampler, coord, 0, offset)
+#define SMAASampleOffset(tex, coord, offset) SMAASampleLevelZeroOffset(tex, coord, offset)
+#define SMAALerp(a, b, t) lerp(a, b, t)
+#define SMAASaturate(a) saturate(a)
+#define SMAAMad(a, b, c) mad(a, b, c)
+#define SMAA_FLATTEN [flatten]
+#define SMAA_BRANCH [branch]
+#define SMAATexture2DMS2 Texture2DMS<float4, 2>
+#define SMAALoad(tex, pos, sample) tex.Load(pos, sample)
+#endif
+#if SMAA_HLSL_4_1 == 1
+#define SMAAGather(tex, coord) tex.Gather(LinearSampler, coord, 0)
+#endif
+#if SMAA_GLSL_3 == 1 || SMAA_GLSL_4 == 1
+#define SMAATexture2D sampler2D
+#define SMAASampleLevelZero(tex, coord) textureLod(tex, coord, 0.0)
+#define SMAASampleLevelZeroPoint(tex, coord) textureLod(tex, coord, 0.0)
+#define SMAASample(tex, coord) texture(tex, coord)
+#define SMAASamplePoint(tex, coord) texture(tex, coord)
+#define SMAASampleLevelZeroOffset(tex, coord, offset) textureLodOffset(tex, coord, 0.0, offset)
+#define SMAASampleOffset(tex, coord, offset) texture(tex, coord, offset)
+#define SMAALerp(a, b, t) mix(a, b, t)
+#define SMAASaturate(a) clamp(a, 0.0, 1.0)
+#define SMAA_FLATTEN
+#define SMAA_BRANCH
+#define float2 vec2
+#define float3 vec3
+#define float4 vec4
+#define int2 ivec2
+#define int3 ivec3
+#define int4 ivec4
+#endif
+#if SMAA_GLSL_3 == 1
+#define SMAAMad(a, b, c) (a * b + c)
+#endif
+#if SMAA_GLSL_4 == 1
+#define SMAAMad(a, b, c) fma(a, b, c)
+#define SMAAGather(tex, coord) textureGather(tex, coord)
+#endif
+
+//-----------------------------------------------------------------------------
+// Misc functions
+
+/**
+ * Gathers current pixel, and the top-left neighbors.
+ */
+float3 SMAAGatherNeighbors(float2 texcoord,
+ float4 offset[3],
+ SMAATexture2D tex) {
+ #if SMAA_HLSL_4_1 == 1 || SMAA_GLSL_4 == 1
+ return SMAAGather(tex, texcoord + SMAA_PIXEL_SIZE * float2(-0.5, -0.5)).grb;
+ #else
+ float P = SMAASample(tex, texcoord).r;
+ float Pleft = SMAASample(tex, offset[0].xy).r;
+ float Ptop = SMAASample(tex, offset[0].zw).r;
+ return float3(P, Pleft, Ptop);
+ #endif
+}
+
+/**
+ * Adjusts the threshold by means of predication.
+ */
+float2 SMAACalculatePredicatedThreshold(float2 texcoord,
+ float4 offset[3],
+ SMAATexture2D colorTex,
+ SMAATexture2D predicationTex) {
+ float3 neighbors = SMAAGatherNeighbors(texcoord, offset, predicationTex);
+ float2 delta = abs(neighbors.xx - neighbors.yz);
+ float2 edges = step(SMAA_PREDICATION_THRESHOLD, delta);
+ return SMAA_PREDICATION_SCALE * SMAA_THRESHOLD * (1.0 - SMAA_PREDICATION_STRENGTH * edges);
+}
+
+#if SMAA_ONLY_COMPILE_PS == 0
+//-----------------------------------------------------------------------------
+// Vertex Shaders
+
+/**
+ * Edge Detection Vertex Shader
+ */
+void SMAAEdgeDetectionVS(float4 position,
+ out float4 svPosition,
+ in float2 texcoord,
+ out float4 offset[3]) {
+ svPosition = position;
+
+ offset[0] = texcoord.xyxy + SMAA_PIXEL_SIZE.xyxy * float4(-1.0, 0.0, 0.0, -1.0);
+ offset[1] = texcoord.xyxy + SMAA_PIXEL_SIZE.xyxy * float4( 1.0, 0.0, 0.0, 1.0);
+ offset[2] = texcoord.xyxy + SMAA_PIXEL_SIZE.xyxy * float4(-2.0, 0.0, 0.0, -2.0);
+}
+
+/**
+ * Blend Weight Calculation Vertex Shader
+ */
+void SMAABlendingWeightCalculationVS(float4 position,
+ out float4 svPosition,
+ inout float2 texcoord,
+ out float2 pixcoord,
+ out float4 offset[3]) {
+ svPosition = position;
+
+ pixcoord = texcoord / SMAA_PIXEL_SIZE;
+
+ // We will use these offsets for the searches later on (see @PSEUDO_GATHER4):
+ offset[0] = texcoord.xyxy + SMAA_PIXEL_SIZE.xyxy * float4(-0.25, -0.125, 1.25, -0.125);
+ offset[1] = texcoord.xyxy + SMAA_PIXEL_SIZE.xyxy * float4(-0.125, -0.25, -0.125, 1.25);
+
+ // And these for the searches, they indicate the ends of the loops:
+ offset[2] = float4(offset[0].xz, offset[1].yw) +
+ float4(-2.0, 2.0, -2.0, 2.0) *
+ SMAA_PIXEL_SIZE.xxyy * float(SMAA_MAX_SEARCH_STEPS);
+}
+
+/**
+ * Neighborhood Blending Vertex Shader
+ */
+void SMAANeighborhoodBlendingVS(float4 position,
+ out float4 svPosition,
+ inout float2 texcoord,
+ out float4 offset[2]) {
+ svPosition = position;
+
+ offset[0] = texcoord.xyxy + SMAA_PIXEL_SIZE.xyxy * float4(-1.0, 0.0, 0.0, -1.0);
+ offset[1] = texcoord.xyxy + SMAA_PIXEL_SIZE.xyxy * float4( 1.0, 0.0, 0.0, 1.0);
+}
+
+/**
+ * Resolve Vertex Shader
+ */
+void SMAAResolveVS(float4 position,
+ out float4 svPosition,
+ inout float2 texcoord) {
+ svPosition = position;
+}
+
+/**
+ * Separate Vertex Shader
+ */
+void SMAASeparateVS(float4 position,
+ out float4 svPosition,
+ inout float2 texcoord) {
+ svPosition = position;
+}
+#endif // SMAA_ONLY_COMPILE_PS == 0
+
+#if SMAA_ONLY_COMPILE_VS == 0
+//-----------------------------------------------------------------------------
+// Edge Detection Pixel Shaders (First Pass)
+
+/**
+ * Luma Edge Detection
+ *
+ * IMPORTANT NOTICE: luma edge detection requires gamma-corrected colors, and
+ * thus 'colorTex' should be a non-sRGB texture.
+ */
+float4 SMAALumaEdgeDetectionPS(float2 texcoord,
+ float4 offset[3],
+ SMAATexture2D colorTex
+ #if SMAA_PREDICATION == 1
+ , SMAATexture2D predicationTex
+ #endif
+ ) {
+ // Calculate the threshold:
+ #if SMAA_PREDICATION == 1
+ float2 threshold = SMAACalculatePredicatedThreshold(texcoord, offset, colorTex, predicationTex);
+ #else
+ float2 threshold = float2(SMAA_THRESHOLD, SMAA_THRESHOLD);
+ #endif
+
+ // Calculate lumas:
+ float3 weights = float3(0.2126, 0.7152, 0.0722);
+ float L = dot(SMAASample(colorTex, texcoord).rgb, weights);
+ float Lleft = dot(SMAASample(colorTex, offset[0].xy).rgb, weights);
+ float Ltop = dot(SMAASample(colorTex, offset[0].zw).rgb, weights);
+
+ // We do the usual threshold:
+ float4 delta;
+ delta.xy = abs(L - float2(Lleft, Ltop));
+ float2 edges = step(threshold, delta.xy);
+
+ // Then discard if there is no edge:
+ if (dot(edges, float2(1.0, 1.0)) == 0.0)
+ discard;
+
+ // Calculate right and bottom deltas:
+ float Lright = dot(SMAASample(colorTex, offset[1].xy).rgb, weights);
+ float Lbottom = dot(SMAASample(colorTex, offset[1].zw).rgb, weights);
+ delta.zw = abs(L - float2(Lright, Lbottom));
+
+ // Calculate the maximum delta in the direct neighborhood:
+ float2 maxDelta = max(delta.xy, delta.zw);
+ maxDelta = max(maxDelta.xx, maxDelta.yy);
+
+ // Calculate left-left and top-top deltas:
+ float Lleftleft = dot(SMAASample(colorTex, offset[2].xy).rgb, weights);
+ float Ltoptop = dot(SMAASample(colorTex, offset[2].zw).rgb, weights);
+ delta.zw = abs(float2(Lleft, Ltop) - float2(Lleftleft, Ltoptop));
+
+ // Calculate the final maximum delta:
+ maxDelta = max(maxDelta.xy, delta.zw);
+
+ /**
+ * Each edge with a delta in luma of less than 50% of the maximum luma
+ * surrounding this pixel is discarded. This allows to eliminate spurious
+ * crossing edges, and is based on the fact that, if there is too much
+ * contrast in a direction, that will hide contrast in the other
+ * neighbors.
+ * This is done after the discard intentionally as this situation doesn't
+ * happen too frequently (but it's important to do as it prevents some
+ * edges from going undetected).
+ */
+ edges.xy *= step(0.5 * maxDelta, delta.xy);
+
+ return float4(edges, 0.0, 0.0);
+}
+
+/**
+ * Color Edge Detection
+ *
+ * IMPORTANT NOTICE: color edge detection requires gamma-corrected colors, and
+ * thus 'colorTex' should be a non-sRGB texture.
+ */
+float4 SMAAColorEdgeDetectionPS(float2 texcoord,
+ float4 offset[3],
+ SMAATexture2D colorTex
+ #if SMAA_PREDICATION == 1
+ , SMAATexture2D predicationTex
+ #endif
+ ) {
+ // Calculate the threshold:
+ #if SMAA_PREDICATION == 1
+ float2 threshold = SMAACalculatePredicatedThreshold(texcoord, offset, colorTex, predicationTex);
+ #else
+ float2 threshold = float2(SMAA_THRESHOLD, SMAA_THRESHOLD);
+ #endif
+
+ // Calculate color deltas:
+ float4 delta;
+ float3 C = SMAASample(colorTex, texcoord).rgb;
+
+ float3 Cleft = SMAASample(colorTex, offset[0].xy).rgb;
+ float3 t = abs(C - Cleft);
+ delta.x = max(max(t.r, t.g), t.b);
+
+ float3 Ctop = SMAASample(colorTex, offset[0].zw).rgb;
+ t = abs(C - Ctop);
+ delta.y = max(max(t.r, t.g), t.b);
+
+ // We do the usual threshold:
+ float2 edges = step(threshold, delta.xy);
+
+ // Then discard if there is no edge:
+ if (dot(edges, float2(1.0, 1.0)) == 0.0)
+ discard;
+
+ // Calculate right and bottom deltas:
+ float3 Cright = SMAASample(colorTex, offset[1].xy).rgb;
+ t = abs(C - Cright);
+ delta.z = max(max(t.r, t.g), t.b);
+
+ float3 Cbottom = SMAASample(colorTex, offset[1].zw).rgb;
+ t = abs(C - Cbottom);
+ delta.w = max(max(t.r, t.g), t.b);
+
+ // Calculate the maximum delta in the direct neighborhood:
+ float maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);
+
+ // Calculate left-left and top-top deltas:
+ float3 Cleftleft = SMAASample(colorTex, offset[2].xy).rgb;
+ t = abs(C - Cleftleft);
+ delta.z = max(max(t.r, t.g), t.b);
+
+ float3 Ctoptop = SMAASample(colorTex, offset[2].zw).rgb;
+ t = abs(C - Ctoptop);
+ delta.w = max(max(t.r, t.g), t.b);
+
+ // Calculate the final maximum delta:
+ maxDelta = max(max(maxDelta, delta.z), delta.w);
+
+ // Local contrast adaptation in action:
+ edges.xy *= step(0.5 * maxDelta, delta.xy);
+
+ return float4(edges, 0.0, 0.0);
+}
+
+float4 SMAASingleChannelEdgeDetectionPS(float2 texcoord,
+ float4 offset[3],
+ SMAATexture2D colorTex
+ #if SMAA_PREDICATION == 1
+ , SMAATexture2D predicationTex
+ #endif
+ ) {
+ // Calculate the threshold:
+ #if SMAA_PREDICATION == 1
+ float2 threshold = SMAACalculatePredicatedThreshold(texcoord, offset, colorTex, predicationTex);
+ #else
+ float2 threshold = float2(SMAA_THRESHOLD, SMAA_THRESHOLD);
+ #endif
+
+ // Calculate lumas:
+ float L = SMAASample(colorTex, texcoord).r;
+ float Lleft = SMAASample(colorTex, offset[0].xy).r;
+ float Ltop = SMAASample(colorTex, offset[0].zw).r;
+
+ // We do the usual threshold:
+ float4 delta;
+ delta.xy = abs(L - float2(Lleft, Ltop));
+ float2 edges = step(threshold, delta.xy);
+
+ // Then discard if there is no edge:
+ if (dot(edges, float2(1.0, 1.0)) == 0.0)
+ discard;
+
+ // Calculate right and bottom deltas:
+ float Lright = SMAASample(colorTex, offset[1].xy).r;
+ float Lbottom = SMAASample(colorTex, offset[1].zw).r;
+ delta.zw = abs(L - float2(Lright, Lbottom));
+
+ // Calculate the maximum delta in the direct neighborhood:
+ float2 maxDelta = max(delta.xy, delta.zw);
+ maxDelta = max(maxDelta.xx, maxDelta.yy);
+
+ // Calculate left-left and top-top deltas:
+ float Lleftleft = SMAASample(colorTex, offset[2].xy).r;
+ float Ltoptop = SMAASample(colorTex, offset[2].zw).r;
+ delta.zw = abs(float2(Lleft, Ltop) - float2(Lleftleft, Ltoptop));
+
+ // Calculate the final maximum delta:
+ maxDelta = max(maxDelta.xy, delta.zw);
+
+ /**
+ * Each edge with a delta in luma of less than 50% of the maximum luma
+ * surrounding this pixel is discarded. This allows to eliminate spurious
+ * crossing edges, and is based on the fact that, if there is too much
+ * contrast in a direction, that will hide contrast in the other
+ * neighbors.
+ * This is done after the discard intentionally as this situation doesn't
+ * happen too frequently (but it's important to do as it prevents some
+ * edges from going undetected).
+ */
+ edges.xy *= step(0.5 * maxDelta, delta.xy);
+
+ return float4(edges, 0.0, 0.0);
+}
+
+/**
+ * Depth Edge Detection
+ */
+float4 SMAADepthEdgeDetectionPS(float2 texcoord,
+ float4 offset[3],
+ SMAATexture2D depthTex) {
+ float3 neighbors = SMAAGatherNeighbors(texcoord, offset, depthTex);
+ float2 delta = abs(neighbors.xx - float2(neighbors.y, neighbors.z));
+ float2 edges = step(SMAA_DEPTH_THRESHOLD, delta);
+
+ if (dot(edges, float2(1.0, 1.0)) == 0.0)
+ discard;
+
+ return float4(edges, 0.0, 0.0);
+}
+
+//-----------------------------------------------------------------------------
+// Diagonal Search Functions
+
+#if SMAA_MAX_SEARCH_STEPS_DIAG > 0 || SMAA_FORCE_DIAGONAL_DETECTION == 1
+
+/**
+ * These functions allows to perform diagonal pattern searches.
+ */
+float SMAASearchDiag1(SMAATexture2D edgesTex, float2 texcoord, float2 dir, float c) {
+ texcoord += dir * SMAA_PIXEL_SIZE;
+ float2 e = float2(0.0, 0.0);
+ float i;
+ for (i = 0.0; i < float(SMAA_MAX_SEARCH_STEPS_DIAG); i++) {
+ e.rg = SMAASampleLevelZero(edgesTex, texcoord).rg;
+ SMAA_FLATTEN if (dot(e, float2(1.0, 1.0)) < 1.9) break;
+ texcoord += dir * SMAA_PIXEL_SIZE;
+ }
+ return i + float(e.g > 0.9) * c;
+}
+
+float SMAASearchDiag2(SMAATexture2D edgesTex, float2 texcoord, float2 dir, float c) {
+ texcoord += dir * SMAA_PIXEL_SIZE;
+ float2 e = float2(0.0, 0.0);
+ float i;
+ for (i = 0.0; i < float(SMAA_MAX_SEARCH_STEPS_DIAG); i++) {
+ e.g = SMAASampleLevelZero(edgesTex, texcoord).g;
+ e.r = SMAASampleLevelZeroOffset(edgesTex, texcoord, int2(1, 0)).r;
+ SMAA_FLATTEN if (dot(e, float2(1.0, 1.0)) < 1.9) break;
+ texcoord += dir * SMAA_PIXEL_SIZE;
+ }
+ return i + float(e.g > 0.9) * c;
+}
+
+/**
+ * Similar to SMAAArea, this calculates the area corresponding to a certain
+ * diagonal distance and crossing edges 'e'.
+ */
+float2 SMAAAreaDiag(SMAATexture2D areaTex, float2 dist, float2 e, float offset) {
+ float2 texcoord = float(SMAA_AREATEX_MAX_DISTANCE_DIAG) * e + dist;
+
+ // We do a scale and bias for mapping to texel space:
+ texcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + (0.5 * SMAA_AREATEX_PIXEL_SIZE);
+
+ // Diagonal areas are on the second half of the texture:
+ texcoord.x += 0.5;
+
+ // Move to proper place, according to the subpixel offset:
+ texcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;
+
+ // Do it!
+ return SMAASampleLevelZero(areaTex, texcoord).ra;
+}
+
+/**
+ * This searches for diagonal patterns and returns the corresponding weights.
+ */
+float2 SMAACalculateDiagWeights(SMAATexture2D edgesTex, SMAATexture2D areaTex, float2 texcoord, float2 e, int4 subsampleIndices) {
+ float2 weights = float2(0.0, 0.0);
+
+ float2 d;
+ d.x = e.r > 0.0? SMAASearchDiag1(edgesTex, texcoord, float2(-1.0, 1.0), 1.0) : 0.0;
+ d.y = SMAASearchDiag1(edgesTex, texcoord, float2(1.0, -1.0), 0.0);
+
+ SMAA_BRANCH
+ if (d.r + d.g > 2.0) { // d.r + d.g + 1 > 3
+ float4 coords = SMAAMad(float4(-d.r, d.r, d.g, -d.g), SMAA_PIXEL_SIZE.xyxy, texcoord.xyxy);
+
+ float4 c;
+ c.x = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(-1, 0)).g;
+ c.y = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2( 0, 0)).r;
+ c.z = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1, 0)).g;
+ c.w = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1, -1)).r;
+ float2 e = 2.0 * c.xz + c.yw;
+ float t = float(SMAA_MAX_SEARCH_STEPS_DIAG) - 1.0;
+ e *= step(d.rg, float2(t, t));
+
+ weights += SMAAAreaDiag(areaTex, d, e, float(subsampleIndices.z));
+ }
+
+ d.x = SMAASearchDiag2(edgesTex, texcoord, float2(-1.0, -1.0), 0.0);
+ float right = SMAASampleLevelZeroOffset(edgesTex, texcoord, int2(1, 0)).r;
+ d.y = right > 0.0? SMAASearchDiag2(edgesTex, texcoord, float2(1.0, 1.0), 1.0) : 0.0;
+
+ SMAA_BRANCH
+ if (d.r + d.g > 2.0) { // d.r + d.g + 1 > 3
+ float4 coords = SMAAMad(float4(-d.r, -d.r, d.g, d.g), SMAA_PIXEL_SIZE.xyxy, texcoord.xyxy);
+
+ float4 c;
+ c.x = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(-1, 0)).g;
+ c.y = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2( 0, -1)).r;
+ c.zw = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1, 0)).gr;
+ float2 e = 2.0 * c.xz + c.yw;
+ float t = float(SMAA_MAX_SEARCH_STEPS_DIAG) - 1.0;
+ e *= step(d.rg, float2(t, t));
+
+ weights += SMAAAreaDiag(areaTex, d, e, float(subsampleIndices.w)).gr;
+ }
+
+ return weights;
+}
+#endif
+
+//-----------------------------------------------------------------------------
+// Horizontal/Vertical Search Functions
+
+/**
+ * This allows to determine how much length should we add in the last step
+ * of the searches. It takes the bilinearly interpolated edge (see
+ * @PSEUDO_GATHER4), and adds 0, 1 or 2, depending on which edges and
+ * crossing edges are active.
+ */
+float SMAASearchLength(SMAATexture2D searchTex, float2 e, float bias, float scale) {
+ // Not required if searchTex accesses are set to point:
+ // float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);
+ // e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +
+ // e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;
+ e.r = bias + e.r * scale;
+ return 255.0 * SMAASampleLevelZeroPoint(searchTex, e).r;
+}
+
+/**
+ * Horizontal/vertical search functions for the 2nd pass.
+ */
+float SMAASearchXLeft(SMAATexture2D edgesTex, SMAATexture2D searchTex, float2 texcoord, float end) {
+ /**
+ * @PSEUDO_GATHER4
+ * This texcoord has been offset by (-0.25, -0.125) in the vertex shader to
+ * sample between edge, thus fetching four edges in a row.
+ * Sampling with different offsets in each direction allows to disambiguate
+ * which edges are active from the four fetched ones.
+ */
+ float2 e = float2(0.0, 1.0);
+ while (texcoord.x > end &&
+ e.g > 0.8281 && // Is there some edge not activated?
+ e.r == 0.0) { // Or is there a crossing edge that breaks the line?
+ e = SMAASampleLevelZero(edgesTex, texcoord).rg;
+ texcoord -= float2(2.0, 0.0) * SMAA_PIXEL_SIZE;
+ }
+
+ // We correct the previous (-0.25, -0.125) offset we applied:
+ texcoord.x += 0.25 * SMAA_PIXEL_SIZE.x;
+
+ // The searches are bias by 1, so adjust the coords accordingly:
+ texcoord.x += SMAA_PIXEL_SIZE.x;
+
+ // Disambiguate the length added by the last step:
+ texcoord.x += 2.0 * SMAA_PIXEL_SIZE.x; // Undo last step
+ texcoord.x -= SMAA_PIXEL_SIZE.x * SMAASearchLength(searchTex, e, 0.0, 0.5);
+
+ return texcoord.x;
+}
+
+float SMAASearchXRight(SMAATexture2D edgesTex, SMAATexture2D searchTex, float2 texcoord, float end) {
+ float2 e = float2(0.0, 1.0);
+ while (texcoord.x < end &&
+ e.g > 0.8281 && // Is there some edge not activated?
+ e.r == 0.0) { // Or is there a crossing edge that breaks the line?
+ e = SMAASampleLevelZero(edgesTex, texcoord).rg;
+ texcoord += float2(2.0, 0.0) * SMAA_PIXEL_SIZE;
+ }
+
+ texcoord.x -= 0.25 * SMAA_PIXEL_SIZE.x;
+ texcoord.x -= SMAA_PIXEL_SIZE.x;
+ texcoord.x -= 2.0 * SMAA_PIXEL_SIZE.x;
+ texcoord.x += SMAA_PIXEL_SIZE.x * SMAASearchLength(searchTex, e, 0.5, 0.5);
+ return texcoord.x;
+}
+
+float SMAASearchYUp(SMAATexture2D edgesTex, SMAATexture2D searchTex, float2 texcoord, float end) {
+ float2 e = float2(1.0, 0.0);
+ while (texcoord.y > end &&
+ e.r > 0.8281 && // Is there some edge not activated?
+ e.g == 0.0) { // Or is there a crossing edge that breaks the line?
+ e = SMAASampleLevelZero(edgesTex, texcoord).rg;
+ texcoord -= float2(0.0, 2.0) * SMAA_PIXEL_SIZE;
+ }
+
+ texcoord.y += 0.25 * SMAA_PIXEL_SIZE.y;
+ texcoord.y += SMAA_PIXEL_SIZE.y;
+ texcoord.y += 2.0 * SMAA_PIXEL_SIZE.y;
+ texcoord.y -= SMAA_PIXEL_SIZE.y * SMAASearchLength(searchTex, e.gr, 0.0, 0.5);
+ return texcoord.y;
+}
+
+float SMAASearchYDown(SMAATexture2D edgesTex, SMAATexture2D searchTex, float2 texcoord, float end) {
+ float2 e = float2(1.0, 0.0);
+ while (texcoord.y < end &&
+ e.r > 0.8281 && // Is there some edge not activated?
+ e.g == 0.0) { // Or is there a crossing edge that breaks the line?
+ e = SMAASampleLevelZero(edgesTex, texcoord).rg;
+ texcoord += float2(0.0, 2.0) * SMAA_PIXEL_SIZE;
+ }
+
+ texcoord.y -= 0.25 * SMAA_PIXEL_SIZE.y;
+ texcoord.y -= SMAA_PIXEL_SIZE.y;
+ texcoord.y -= 2.0 * SMAA_PIXEL_SIZE.y;
+ texcoord.y += SMAA_PIXEL_SIZE.y * SMAASearchLength(searchTex, e.gr, 0.5, 0.5);
+ return texcoord.y;
+}
+
+/**
+ * Ok, we have the distance and both crossing edges. So, what are the areas
+ * at each side of current edge?
+ */
+float2 SMAAArea(SMAATexture2D areaTex, float2 dist, float e1, float e2, float offset) {
+ // Rounding prevents precision errors of bilinear filtering:
+ float2 texcoord = float(SMAA_AREATEX_MAX_DISTANCE) * round(4.0 * float2(e1, e2)) + dist;
+
+ // We do a scale and bias for mapping to texel space:
+ texcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + (0.5 * SMAA_AREATEX_PIXEL_SIZE);
+
+ // Move to proper place, according to the subpixel offset:
+ texcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;
+
+ // Do it!
+ return SMAASampleLevelZero(areaTex, texcoord).ra;
+}
+
+//-----------------------------------------------------------------------------
+// Corner Detection Functions
+
+void SMAADetectHorizontalCornerPattern(SMAATexture2D edgesTex, inout float2 weights, float2 texcoord, float2 d) {
+ #if SMAA_CORNER_ROUNDING < 100 || SMAA_FORCE_CORNER_DETECTION == 1
+ float4 coords = SMAAMad(float4(d.x, 0.0, d.y, 0.0),
+ SMAA_PIXEL_SIZE.xyxy, texcoord.xyxy);
+ float2 e;
+ e.r = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(0.0, 1.0)).r;
+ bool left = abs(d.x) < abs(d.y);
+ e.g = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(0.0, -2.0)).r;
+ if (left) weights *= SMAASaturate(float(SMAA_CORNER_ROUNDING) / 100.0 + 1.0 - e);
+
+ e.r = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2(1.0, 1.0)).r;
+ e.g = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2(1.0, -2.0)).r;
+ if (!left) weights *= SMAASaturate(float(SMAA_CORNER_ROUNDING) / 100.0 + 1.0 - e);
+ #endif
+}
+
+void SMAADetectVerticalCornerPattern(SMAATexture2D edgesTex, inout float2 weights, float2 texcoord, float2 d) {
+ #if SMAA_CORNER_ROUNDING < 100 || SMAA_FORCE_CORNER_DETECTION == 1
+ float4 coords = SMAAMad(float4(0.0, d.x, 0.0, d.y),
+ SMAA_PIXEL_SIZE.xyxy, texcoord.xyxy);
+ float2 e;
+ e.r = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2( 1.0, 0.0)).g;
+ bool left = abs(d.x) < abs(d.y);
+ e.g = SMAASampleLevelZeroOffset(edgesTex, coords.xy, int2(-2.0, 0.0)).g;
+ if (left) weights *= SMAASaturate(float(SMAA_CORNER_ROUNDING) / 100.0 + 1.0 - e);
+
+ e.r = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2( 1.0, 1.0)).g;
+ e.g = SMAASampleLevelZeroOffset(edgesTex, coords.zw, int2(-2.0, 1.0)).g;
+ if (!left) weights *= SMAASaturate(float(SMAA_CORNER_ROUNDING) / 100.0 + 1.0 - e);
+ #endif
+}
+
+//-----------------------------------------------------------------------------
+// Blending Weight Calculation Pixel Shader (Second Pass)
+
+float4 SMAABlendingWeightCalculationPS(float2 texcoord,
+ float2 pixcoord,
+ float4 offset[3],
+ SMAATexture2D edgesTex,
+ SMAATexture2D areaTex,
+ SMAATexture2D searchTex,
+ int4 subsampleIndices) { // Just pass zero for SMAA 1x, see @SUBSAMPLE_INDICES.
+ float4 weights = float4(0.0, 0.0, 0.0, 0.0);
+
+ float2 e = SMAASample(edgesTex, texcoord).rg;
+
+ SMAA_BRANCH
+ if (e.g > 0.0) { // Edge at north
+ #if SMAA_MAX_SEARCH_STEPS_DIAG > 0 || SMAA_FORCE_DIAGONAL_DETECTION == 1
+ // Diagonals have both north and west edges, so searching for them in
+ // one of the boundaries is enough.
+ weights.rg = SMAACalculateDiagWeights(edgesTex, areaTex, texcoord, e, subsampleIndices);
+
+ // We give priority to diagonals, so if we find a diagonal we skip
+ // horizontal/vertical processing.
+ SMAA_BRANCH
+ if (dot(weights.rg, float2(1.0, 1.0)) == 0.0) {
+ #endif
+
+ float2 d;
+
+ // Find the distance to the left:
+ float2 coords;
+ coords.x = SMAASearchXLeft(edgesTex, searchTex, offset[0].xy, offset[2].x);
+ coords.y = offset[1].y; // offset[1].y = texcoord.y - 0.25 * SMAA_PIXEL_SIZE.y (@CROSSING_OFFSET)
+ d.x = coords.x;
+
+ // Now fetch the left crossing edges, two at a time using bilinear
+ // filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to
+ // discern what value each edge has:
+ float e1 = SMAASampleLevelZero(edgesTex, coords).r;
+
+ // Find the distance to the right:
+ coords.x = SMAASearchXRight(edgesTex, searchTex, offset[0].zw, offset[2].y);
+ d.y = coords.x;
+
+ // We want the distances to be in pixel units (doing this here allow to
+ // better interleave arithmetic and memory accesses):
+ d = d / SMAA_PIXEL_SIZE.x - pixcoord.x;
+
+ // SMAAArea below needs a sqrt, as the areas texture is compressed
+ // quadratically:
+ float2 sqrt_d = sqrt(abs(d));
+
+ // Fetch the right crossing edges:
+ float e2 = SMAASampleLevelZeroOffset(edgesTex, coords, int2(1, 0)).r;
+
+ // Ok, we know how this pattern looks like, now it is time for getting
+ // the actual area:
+ weights.rg = SMAAArea(areaTex, sqrt_d, e1, e2, float(subsampleIndices.y));
+
+ // Fix corners:
+ SMAADetectHorizontalCornerPattern(edgesTex, weights.rg, texcoord, d);
+
+ #if SMAA_MAX_SEARCH_STEPS_DIAG > 0 || SMAA_FORCE_DIAGONAL_DETECTION == 1
+ } else
+ e.r = 0.0; // Skip vertical processing.
+ #endif
+ }
+
+ SMAA_BRANCH
+ if (e.r > 0.0) { // Edge at west
+ float2 d;
+
+ // Find the distance to the top:
+ float2 coords;
+ coords.y = SMAASearchYUp(edgesTex, searchTex, offset[1].xy, offset[2].z);
+ coords.x = offset[0].x; // offset[1].x = texcoord.x - 0.25 * SMAA_PIXEL_SIZE.x;
+ d.x = coords.y;
+
+ // Fetch the top crossing edges:
+ float e1 = SMAASampleLevelZero(edgesTex, coords).g;
+
+ // Find the distance to the bottom:
+ coords.y = SMAASearchYDown(edgesTex, searchTex, offset[1].zw, offset[2].w);
+ d.y = coords.y;
+
+ // We want the distances to be in pixel units:
+ d = d / SMAA_PIXEL_SIZE.y - pixcoord.y;
+
+ // SMAAArea below needs a sqrt, as the areas texture is compressed
+ // quadratically:
+ float2 sqrt_d = sqrt(abs(d));
+
+ // Fetch the bottom crossing edges:
+ float e2 = SMAASampleLevelZeroOffset(edgesTex, coords, int2(0, 1)).g;
+
+ // Get the area for this direction:
+ weights.ba = SMAAArea(areaTex, sqrt_d, e1, e2, float(subsampleIndices.x));
+
+ // Fix corners:
+ SMAADetectVerticalCornerPattern(edgesTex, weights.ba, texcoord, d);
+ }
+
+ return weights;
+}
+
+//-----------------------------------------------------------------------------
+// Neighborhood Blending Pixel Shader (Third Pass)
+
+float4 SMAANeighborhoodBlendingPS(float2 texcoord,
+ float4 offset[2],
+ SMAATexture2D colorTex,
+ SMAATexture2D blendTex) {
+ // Fetch the blending weights for current pixel:
+ float4 a;
+ a.xz = SMAASample(blendTex, texcoord).xz;
+ a.y = SMAASample(blendTex, offset[1].zw).g;
+ a.w = SMAASample(blendTex, offset[1].xy).a;
+
+ // Is there any blending weight with a value greater than 0.0?
+ SMAA_BRANCH
+ if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5)
+ return SMAASampleLevelZero(colorTex, texcoord);
+ else {
+ float4 color = float4(0.0, 0.0, 0.0, 0.0);
+
+ // Up to 4 lines can be crossing a pixel (one through each edge). We
+ // favor blending by choosing the line with the maximum weight for each
+ // direction:
+ float2 offset;
+ offset.x = a.a > a.b? a.a : -a.b; // left vs. right
+ offset.y = a.g > a.r? a.g : -a.r; // top vs. bottom
+
+ // Then we go in the direction that has the maximum weight:
+ if (abs(offset.x) > abs(offset.y)) // horizontal vs. vertical
+ offset.y = 0.0;
+ else
+ offset.x = 0.0;
+
+ #if SMAA_REPROJECTION == 1
+ // Fetch the opposite color and lerp by hand:
+ float4 C = SMAASampleLevelZero(colorTex, texcoord);
+ texcoord += sign(offset) * SMAA_PIXEL_SIZE;
+ float4 Cop = SMAASampleLevelZero(colorTex, texcoord);
+ float s = abs(offset.x) > abs(offset.y)? abs(offset.x) : abs(offset.y);
+
+ // Unpack the velocity values:
+ C.a *= C.a;
+ Cop.a *= Cop.a;
+
+ // Lerp the colors:
+ float4 Caa = SMAALerp(C, Cop, s);
+
+ // Unpack velocity and return the resulting value:
+ Caa.a = sqrt(Caa.a);
+ return Caa;
+ #elif SMAA_HLSL_4 == 1 || SMAA_DIRECTX9_LINEAR_BLEND == 0
+ // We exploit bilinear filtering to mix current pixel with the chosen
+ // neighbor:
+ texcoord += offset * SMAA_PIXEL_SIZE;
+ return SMAASampleLevelZero(colorTex, texcoord);
+ #else
+ // Fetch the opposite color and lerp by hand:
+ float4 C = SMAASampleLevelZero(colorTex, texcoord);
+ texcoord += sign(offset) * SMAA_PIXEL_SIZE;
+ float4 Cop = SMAASampleLevelZero(colorTex, texcoord);
+ float s = abs(offset.x) > abs(offset.y)? abs(offset.x) : abs(offset.y);
+ return SMAALerp(C, Cop, s);
+ #endif
+ }
+}
+
+float4 SMAASampleLevelZeroResolve( SMAATexture2D currentTex,
+ SMAATexture2D previousTex,
+ float2 texcoord )
+{
+ return SMAALerp( SMAASampleLevelZero( currentTex, texcoord ), SMAASampleLevelZero( previousTex, texcoord ), .5 );
+}
+
+float4 SMAANeighborhoodBlendingTemporalPS(float2 texcoord,
+ float4 offset[2],
+ SMAATexture2D colorTex,
+ SMAATexture2D previousTex,
+ SMAATexture2D blendTex) {
+ // Fetch the blending weights for current pixel:
+ float4 a;
+ a.xz = SMAASample(blendTex, texcoord).xz;
+ a.y = SMAASample(blendTex, offset[1].zw).g;
+ a.w = SMAASample(blendTex, offset[1].xy).a;
+
+ // Is there any blending weight with a value greater than 0.0?
+ SMAA_BRANCH
+ if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5)
+ return SMAASampleLevelZero(colorTex, texcoord);
+ else {
+ float4 color = float4(0.0, 0.0, 0.0, 0.0);
+
+ // Up to 4 lines can be crossing a pixel (one through each edge). We
+ // favor blending by choosing the line with the maximum weight for each
+ // direction:
+ float2 offset;
+ offset.x = a.a > a.b? a.a : -a.b; // left vs. right
+ offset.y = a.g > a.r? a.g : -a.r; // top vs. bottom
+
+ // Then we go in the direction that has the maximum weight:
+ if (abs(offset.x) > abs(offset.y)) // horizontal vs. vertical
+ offset.y = 0.0;
+ else
+ offset.x = 0.0;
+
+ #if SMAA_REPROJECTION == 1
+ // Fetch the opposite color and lerp by hand:
+ return SMAASampleLevelZeroResolve(colorTex, previousTex, texcoord);
+ texcoord += sign(offset) * SMAA_PIXEL_SIZE;
+ return SMAASampleLevelZeroResolve(colorTex, previousTex, texcoord);
+ float s = abs(offset.x) > abs(offset.y)? abs(offset.x) : abs(offset.y);
+
+ // Unpack the velocity values:
+ C.a *= C.a;
+ Cop.a *= Cop.a;
+
+ // Lerp the colors:
+ float4 Caa = SMAALerp(C, Cop, s);
+
+ // Unpack velocity and return the resulting value:
+ Caa.a = sqrt(Caa.a);
+ return Caa;
+ #elif SMAA_HLSL_4 == 1 || SMAA_DIRECTX9_LINEAR_BLEND == 0
+ // We exploit bilinear filtering to mix current pixel with the chosen
+ // neighbor:
+ texcoord += offset * SMAA_PIXEL_SIZE;
+ return SMAASampleLevelZeroResolve(colorTex, previousTex, texcoord);
+ #else
+ // Fetch the opposite color and lerp by hand:
+ float4 C = SMAASampleLevelZeroResolve(colorTex, previousTex, texcoord);
+ texcoord += sign(offset) * SMAA_PIXEL_SIZE;
+ float4 Cop = SMAASampleLevelZeroResolve(colorTex, previousTex, texcoord);
+ float s = abs(offset.x) > abs(offset.y)? abs(offset.x) : abs(offset.y);
+ return SMAALerp(C, Cop, s);
+ #endif
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Temporal Resolve Pixel Shader (Optional Pass)
+
+float4 SMAAResolvePS(float2 texcoord,
+ SMAATexture2D colorTexCurr,
+ SMAATexture2D colorTexPrev
+ #if SMAA_REPROJECTION == 1
+ , SMAATexture2D velocityTex
+ #endif
+ ) {
+ #if SMAA_REPROJECTION == 1
+ // Velocity is calculated from previous to current position, so we need to
+ // inverse it:
+ float2 velocity = -SMAASample(velocityTex, texcoord).rg;
+
+ // Fetch current pixel:
+ float4 current = SMAASample(colorTexCurr, texcoord);
+
+ // Reproject current coordinates and fetch previous pixel:
+ float4 previous = SMAASample(colorTexPrev, texcoord + velocity);
+
+ // Attenuate the previous pixel if the velocity is different:
+ float delta = abs(current.a * current.a - previous.a * previous.a) / 5.0;
+ float weight = 0.5 * SMAASaturate(1.0 - (sqrt(delta) * SMAA_REPROJECTION_WEIGHT_SCALE));
+
+ // Blend the pixels according to the calculated weight:
+ return SMAALerp(current, previous, weight);
+ #else
+ // Just blend the pixels:
+ float4 current = SMAASample(colorTexCurr, texcoord);
+ float4 previous = SMAASample(colorTexPrev, texcoord);
+ return SMAALerp(current, previous, 0.5);
+ #endif
+}
+
+//-----------------------------------------------------------------------------
+// Separate Multisamples Pixel Shader (Optional Pass)
+
+#if SMAA_HLSL_4 == 1 || SMAA_HLSL_4_1 == 1
+void SMAASeparatePS(float4 position : SV_POSITION,
+ float2 texcoord : TEXCOORD0,
+ out float4 target0,
+ out float4 target1,
+ uniform SMAATexture2DMS2 colorTexMS) {
+ int2 pos = int2(position.xy);
+ target0 = SMAALoad(colorTexMS, pos, 0);
+ target1 = SMAALoad(colorTexMS, pos, 1);
+}
+#endif
+
+//-----------------------------------------------------------------------------
+#endif // SMAA_ONLY_COMPILE_VS == 0
diff --git a/res/effectlib/SSAOCustomMaterial.glsllib b/res/effectlib/SSAOCustomMaterial.glsllib
new file mode 100644
index 0000000..1d8a1c3
--- /dev/null
+++ b/res/effectlib/SSAOCustomMaterial.glsllib
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SSAO_CUSTOM_MATERIAL_GLSLLIB
+#define SSAO_CUSTOM_MATERIAL_GLSLLIB
+#if QT3DS_ENABLE_SSAO || QT3DS_ENABLE_SSDO
+
+#include "viewProperties.glsllib"
+#if QT3DS_ENABLE_SSDO
+#include "screenSpaceDO.glsllib"
+
+layout (std140) uniform cbAoShadow {
+ vec4 ao_properties;
+ vec4 ao_properties2;
+ vec4 shadow_properties;
+ vec4 aoScreenConst;
+ vec4 UvToEyeConst;
+ };
+
+uniform sampler2D depth_sampler;
+#endif
+uniform sampler2D ao_sampler;
+
+#endif // QT3DS_ENABLE_SSAO || QT3DS_ENABLE_SSDO
+
+#if QT3DS_ENABLE_SSAO
+
+float customMaterialAO()
+{
+#if QT3DS_ENABLE_SSDO
+ vec2 smpUV = (gl_FragCoord.xy) * aoScreenConst.zw;
+#else
+ ivec2 iSize = textureSize(ao_sampler, 0);
+ vec2 smpUV = (gl_FragCoord.xy) / vec2(iSize);
+#endif
+ return texture(ao_sampler, smpUV).x;
+}
+
+#else
+
+float customMaterialAO()
+{
+ return 1.0;
+}
+
+#endif
+
+#if QT3DS_ENABLE_SSDO
+
+float customMaterialShadow( vec3 lightDir, vec3 varWorldPos )
+{
+ return shadowOcclusion( depth_sampler, lightDir, varWorldPos, view_matrix, view_projection_matrix, shadow_properties, camera_properties, aoScreenConst, UvToEyeConst );
+}
+
+#else
+
+float customMaterialShadow( vec3 lightDir, vec3 varWorldPos )
+{
+ return 1.0;
+}
+
+#endif
+
+#endif // #ifndef SSAO_CUSTOM_MATERIAL_GLSLLIB
diff --git a/res/effectlib/abbeNumberIOR.glsllib b/res/effectlib/abbeNumberIOR.glsllib
new file mode 100644
index 0000000..43ed79d
--- /dev/null
+++ b/res/effectlib/abbeNumberIOR.glsllib
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// TODO: compute spectral ior based on float ior and abbe number
+vec3 abbeNumberIOR( in float ior, in float abbeNumber )
+{
+ return( vec3( ior, ior, ior ) );
+}
+
diff --git a/res/effectlib/anisotropyConversion.glsllib b/res/effectlib/anisotropyConversion.glsllib
new file mode 100644
index 0000000..b8aae1e
--- /dev/null
+++ b/res/effectlib/anisotropyConversion.glsllib
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2014-2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+// TODO: real implementation
+anisotropy_return anisotropyConversion( in float roughness, in float anisotropy, in float anisotropyRotation, in vec3 tangentU, bool miaAnisotropySemantic )
+{
+ anisotropy_return aniso;
+ float angle = 2.0 * PI * anisotropyRotation;
+ float cos_angle = cos(angle);
+ float sin_angle = sin(angle);
+ aniso.tangent_u = normalize( cos_angle * tangentU + sin_angle * binormal );
+ // roughness
+ float anisoFac = 1.0 - clamp(anisotropy, 0.0, 0.999);
+ aniso.roughness_v = clamp( roughness / anisoFac, 0.0001, 1.0);
+ aniso.roughness_u = clamp( aniso.roughness_v * anisoFac, 0.0001, 1.0);
+ return( aniso );
+}
+
diff --git a/res/effectlib/average.glsllib b/res/effectlib/average.glsllib
new file mode 100644
index 0000000..082eec0
--- /dev/null
+++ b/res/effectlib/average.glsllib
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float average( in vec3 v )
+{
+ return( ( v.x + v.y + v.z ) / 3.0 );
+}
+
diff --git a/res/effectlib/blendColorLayers.glsllib b/res/effectlib/blendColorLayers.glsllib
new file mode 100644
index 0000000..e07fe61
--- /dev/null
+++ b/res/effectlib/blendColorLayers.glsllib
@@ -0,0 +1,45 @@
+#ifndef BLEND_COLOR_LAYERS_GLSLLIB
+#define BLEND_COLOR_LAYERS_GLSLLIB
+
+float maxValue( in vec3 t )
+{
+ return max( max( t.x, t.y ), t.z );
+}
+
+vec3 blendColor( in vec3 t, in vec3 b, in float weight, in int blendMode)
+{
+ vec3 blendResult = t;
+ switch( blendMode )
+ {
+ case color_layer_add :
+ blendResult += b;
+ break;
+ case color_layer_multiply :
+ blendResult *= b;
+ break;
+ case color_layer_screen :
+ blendResult += t - t * b;
+ break;
+ case color_layer_overlay:
+ blendResult = (maxValue(t) >= 0.5) ? 2.0 * (t+b - t*b - 0.5) : 2.0 * t*b;
+ break;
+ case color_layer_blend:
+ default:
+ // nothing to be done
+ break;
+ }
+
+ return mix( b, blendResult, weight );
+}
+
+texture_return blendColorLayers( in color_layer colorLayer[1], in vec3 base, in int monoSource )
+{
+ vec3 result = blendColor( colorLayer[0].layer_color, base, colorLayer[0].weight, colorLayer[0].mode );
+
+ texture_return tr;
+ tr.tint = result;
+ tr.mono = monoChannel( vec4( result, 1.0 ), monoSource );
+ return( tr );
+}
+
+#endif
diff --git a/res/effectlib/blur.glsllib b/res/effectlib/blur.glsllib
new file mode 100644
index 0000000..1f3abc8
--- /dev/null
+++ b/res/effectlib/blur.glsllib
@@ -0,0 +1,295 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef BLUR_GLSLLIB
+#define BLUR_GLSLLIB 1
+#include "depthpass.glsllib"
+varying float xIncrement;
+varying float yIncrement;
+varying vec2 TexCoord0;
+varying vec2 TexCoord1;
+varying vec2 TexCoord2;
+varying vec2 TexCoord3;
+varying vec2 TexCoord4;
+varying vec2 TexCoord5;
+varying vec2 TexCoord6;
+varying vec2 TexCoord7;
+
+
+const vec3 poisson0 = vec3( 0.000000, 0.000000, 0.000000 );
+const vec3 poisson1 = vec3( 0.527837, -0.085868, 0.534776 );
+const vec3 poisson2 = vec3( -0.040088, 0.537087, 0.538581 );
+const vec3 poisson3 = vec3( -0.670445, -0.017995, 0.670686 );
+const vec3 poisson4 = vec3( -0.419418, -0.616039, 0.745262 );
+const vec3 poisson5 = vec3( 0.440453, -0.639399, 0.776421 );
+const vec3 poisson6 = vec3( -0.757088, 0.349334, 0.833796 );
+const vec3 poisson7 = vec3( 0.574619, 0.685879, 0.894772 );
+
+//7 textel gaussian
+#define WT7_0 20.0
+#define WT7_1 15.0
+#define WT7_2 6.0
+#define WT7_3 1.0
+#define WT7_NORMALIZE (WT7_0+2.0*(WT7_1+WT7_2+WT7_3))
+
+//3 textel gaussian
+#define WT3_0 1.0
+#define WT3_1 0.6
+#define WT3_NORMALIZE (WT3_0+2.0*(WT3_1))
+
+uniform vec2 CameraClipRange;
+
+float GetDepthMultiplier(vec2 inTexCoord, sampler2D inDepthSampler, float inFocusDistance, float inFocusWidth, float inFocusPenumbra)
+{
+ float depthTap = getDepthValue( texture2D(inDepthSampler, inTexCoord), CameraClipRange );
+ float linearDepth = depthValueToLinearDistance( depthTap, CameraClipRange );
+ float depthDiff = max( 0.0, abs( linearDepth - inFocusDistance ) - (inFocusWidth/2.0) ) / inFocusPenumbra;
+ return clamp( depthDiff, 0.0, 1.0 );
+}
+
+float GetTiltShiftMultiplier(vec2 inTexCoord, float inFocusBarHeight, float inFocusWidth )
+{
+ //For now, you can't rotate the focus blur but in time you will be able to.
+ float texPos = inTexCoord.y;
+ float focusDiff = max( 0.0, abs( texPos - inFocusBarHeight ) - (inFocusWidth/2.0) ) / inFocusWidth;
+ return clamp( focusDiff, 0.0, 1.0 );
+}
+
+#ifdef VERTEX_SHADER
+
+void SetupBoxBlurCoords(vec2 inTexInfo)
+{
+ xIncrement = .5 / inTexInfo.x;
+ yIncrement = .5 / inTexInfo.y;
+ TexCoord0 = vec2( TexCoord.x + xIncrement, TexCoord.y + yIncrement );
+ TexCoord1 = vec2( TexCoord.x - xIncrement, TexCoord.y - yIncrement );
+ TexCoord2 = vec2( TexCoord.x - xIncrement, TexCoord.y + yIncrement );
+ TexCoord3 = vec2( TexCoord.x + xIncrement, TexCoord.y - yIncrement );
+}
+
+void SetupPoissonBlurCoords(float inBlurAmount, vec2 inTexInfo )
+{
+ float incX = inBlurAmount / inTexInfo.x;
+ float incY = inBlurAmount / inTexInfo.y;
+ TexCoord0 = vec2( TexCoord.x + poisson0.x * incX, TexCoord.y + poisson0.y * incY );
+ TexCoord1 = vec2( TexCoord.x + poisson1.x * incX, TexCoord.y + poisson1.y * incY );
+ TexCoord2 = vec2( TexCoord.x + poisson2.x * incX, TexCoord.y + poisson2.y * incY );
+ TexCoord3 = vec2( TexCoord.x + poisson3.x * incX, TexCoord.y + poisson3.y * incY );
+ TexCoord4 = vec2( TexCoord.x + poisson4.x * incX, TexCoord.y + poisson4.y * incY );
+ TexCoord5 = vec2( TexCoord.x + poisson5.x * incX, TexCoord.y + poisson5.y * incY );
+ TexCoord6 = vec2( TexCoord.x + poisson6.x * incX, TexCoord.y + poisson6.y * incY );
+ TexCoord7 = vec2( TexCoord.x + poisson7.x * incX, TexCoord.y + poisson7.y * incY );
+}
+
+void SetupHorizontalGaussianBlur( float inDestWidth, float inBlurAmount, vec2 inTexCoord )
+{
+ float increment = inBlurAmount/inDestWidth;
+ TexCoord0 = vec2(inTexCoord.x + increment , inTexCoord.y );
+ TexCoord1 = vec2(inTexCoord.x + increment * 2.0 , inTexCoord.y);
+ TexCoord2 = vec2(inTexCoord.x + increment * 3.0 , inTexCoord.y);
+ TexCoord3 = vec2(inTexCoord.x , inTexCoord.y);
+ TexCoord4 = vec2(inTexCoord.x - increment , inTexCoord.y);
+ TexCoord5 = vec2(inTexCoord.x - increment * 2.0 , inTexCoord.y);
+ TexCoord6 = vec2(inTexCoord.x - increment * 3.0 , inTexCoord.y);
+}
+
+void SetupVerticalGaussianBlur( float inDestHeight, float inBlurAmount, vec2 inTexCoord )
+{
+ float increment = inBlurAmount/inDestHeight;
+ TexCoord0 = vec2(inTexCoord.x, inTexCoord.y + increment );
+ TexCoord1 = vec2(inTexCoord.x, inTexCoord.y + increment * 2.0 );
+ TexCoord2 = vec2(inTexCoord.x, inTexCoord.y + increment * 3.0);
+ TexCoord3 = vec2(inTexCoord.x, inTexCoord.y);
+ TexCoord4 = vec2(inTexCoord.x, inTexCoord.y - increment);
+ TexCoord5 = vec2(inTexCoord.x, inTexCoord.y - increment * 2.0);
+ TexCoord6 = vec2(inTexCoord.x, inTexCoord.y - increment * 3.0);
+}
+
+void SetupHorizontalGaussianBlur3Tap( float inDestWidth, float inBlurAmount, vec2 inTexCoord )
+{
+ float increment = inBlurAmount/inDestWidth;
+ TexCoord0 = vec2(inTexCoord.x + increment , inTexCoord.y );
+ TexCoord1 = vec2(inTexCoord.x , inTexCoord.y);
+ TexCoord2 = vec2(inTexCoord.x - increment , inTexCoord.y);
+}
+
+void SetupVerticalGaussianBlur3Tap( float inDestHeight, float inBlurAmount, vec2 inTexCoord )
+{
+ float increment = inBlurAmount/inDestHeight;
+ TexCoord0 = vec2(inTexCoord.x, inTexCoord.y + increment );
+ TexCoord1 = vec2(inTexCoord.x, inTexCoord.y);
+ TexCoord2 = vec2(inTexCoord.x, inTexCoord.y - increment);
+}
+
+#endif
+
+#ifdef FRAGMENT_SHADER
+
+vec4 BoxDepthBlur(sampler2D inDepthSampler, sampler2D inBlurSampler, float inBlurSamplerAlphaFlag
+ , float inFocusDistance, float inFocusWidth, float inFocusPenumbra )
+{
+ float mult0 = .25 * GetDepthMultiplier( TexCoord0, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra );
+ float mult1 = .25 * GetDepthMultiplier( TexCoord1, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra );
+ float mult2 = .25 * GetDepthMultiplier( TexCoord2, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra );
+ float mult3 = .25 * GetDepthMultiplier( TexCoord3, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra );
+ float multTotal = mult0 + mult1 + mult2 + mult3;
+ float totalDivisor = multTotal != 0.0 ? 1.0 / multTotal : 0.0;
+ vec4 OutCol = GetTextureValue(inBlurSampler, TexCoord0, inBlurSamplerAlphaFlag) * mult0;
+ OutCol += GetTextureValue(inBlurSampler, TexCoord1, inBlurSamplerAlphaFlag) * mult1;
+ OutCol += GetTextureValue(inBlurSampler, TexCoord2, inBlurSamplerAlphaFlag) * mult2;
+ OutCol += GetTextureValue(inBlurSampler, TexCoord3, inBlurSamplerAlphaFlag) * mult3;
+ return OutCol * totalDivisor;
+}
+
+vec4 BoxTiltShiftBlur( sampler2D inBlurSampler, float inBlurSamplerAlphaFlag
+ , float inFocusBarHeight, float inFocusWidth )
+{
+ float mult0 = .25 * GetTiltShiftMultiplier( TexCoord0, inFocusBarHeight, inFocusWidth );
+ float mult1 = .25 * GetTiltShiftMultiplier( TexCoord1, inFocusBarHeight, inFocusWidth );
+ float mult2 = .25 * GetTiltShiftMultiplier( TexCoord2, inFocusBarHeight, inFocusWidth );
+ float mult3 = .25 * GetTiltShiftMultiplier( TexCoord3, inFocusBarHeight, inFocusWidth );
+ float multTotal = mult0 + mult1 + mult2 + mult3;
+ float totalDivisor = multTotal != 0.0 ? 1.0 / multTotal : 0.0;
+ vec4 OutCol = GetTextureValuePreMult(inBlurSampler, TexCoord0) * mult0;
+ OutCol += GetTextureValuePreMult(inBlurSampler, TexCoord1) * mult1;
+ OutCol += GetTextureValuePreMult(inBlurSampler, TexCoord2) * mult2;
+ OutCol += GetTextureValuePreMult(inBlurSampler, TexCoord3) * mult3;
+ return OutCol * totalDivisor;
+}
+
+vec4 PoissonDepthBlur(sampler2D inSampler, float inAlphaFlag, sampler2D inDepthSampler
+ , float inFocusDistance, float inFocusWidth, float inFocusPenumbra )
+{
+ float mult0 = (1.0 - poisson0.z) * GetDepthMultiplier(TexCoord0,inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra);
+ float mult1 = (1.0 - poisson1.z) * GetDepthMultiplier(TexCoord1,inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra);
+ float mult2 = (1.0 - poisson2.z) * GetDepthMultiplier(TexCoord2,inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra);
+
+ float multTotal = mult0 + mult1 + mult2;
+ float multMultiplier = multTotal > 0.0 ? 1.0 / multTotal : 0.0;
+
+ vec4 outColor = GetTextureValue( inSampler, TexCoord0, inAlphaFlag ) * (mult0 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord1, inAlphaFlag ) * (mult1 * multMultiplier);
+ outColor += GetTextureValue( inSampler, TexCoord2, inAlphaFlag ) * (mult2 * multMultiplier);
+ return outColor;
+}
+
+vec4 PoissonTiltShiftBlur(sampler2D inSampler, float inAlphaFlag, float inBarHeight, float inFocusWidth )
+{
+ float mult0 = (1.0 - poisson0.z) * GetTiltShiftMultiplier(TexCoord0, inBarHeight, inFocusWidth );
+ float mult1 = (1.0 - poisson1.z) * GetTiltShiftMultiplier(TexCoord1, inBarHeight, inFocusWidth );
+ float mult2 = (1.0 - poisson2.z) * GetTiltShiftMultiplier(TexCoord2, inBarHeight, inFocusWidth );
+ float mult3 = (1.0 - poisson3.z) * GetTiltShiftMultiplier(TexCoord3, inBarHeight, inFocusWidth );
+ float mult4 = (1.0 - poisson4.z) * GetTiltShiftMultiplier(TexCoord4, inBarHeight, inFocusWidth );
+
+ float multTotal = mult0 + mult1 + mult2 + mult3 + mult4;
+ float multMultiplier = multTotal > 0.0 ? 1.0 / multTotal : 0.0;
+
+ vec4 outColor = GetTextureValuePreMult( inSampler, TexCoord0 ) * (mult0 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord1 ) * (mult1 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord2 ) * (mult2 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord3 ) * (mult3 * multMultiplier);
+ outColor += GetTextureValuePreMult( inSampler, TexCoord4 ) * (mult4 * multMultiplier);
+ return outColor;
+}
+
+float GaussianAlphaBlur( sampler2D inSampler, float inAlphaFlag )
+{
+ float OutCol = 0.0;
+ OutCol += GetTextureValue(inSampler, TexCoord0, inAlphaFlag).a * ( WT7_1/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord1, inAlphaFlag).a * ( WT7_2/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord2, inAlphaFlag).a * ( WT7_3/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord3, inAlphaFlag).a * ( WT7_0/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord4, inAlphaFlag).a * ( WT7_1/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord5, inAlphaFlag).a * ( WT7_2/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord6, inAlphaFlag).a * ( WT7_3/WT7_NORMALIZE );
+ return OutCol;
+}
+
+vec4 GaussianBlur( sampler2D inSampler, float inAlphaFlag )
+{
+ vec4 OutCol = vec4(0.0);
+ OutCol += GetTextureValue(inSampler, TexCoord0, inAlphaFlag) * ( WT7_1/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord1, inAlphaFlag) * ( WT7_2/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord2, inAlphaFlag) * ( WT7_3/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord3, inAlphaFlag) * ( WT7_0/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord4, inAlphaFlag) * ( WT7_1/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord5, inAlphaFlag) * ( WT7_2/WT7_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord6, inAlphaFlag) * ( WT7_3/WT7_NORMALIZE );
+ return OutCol;
+}
+
+vec4 GaussianBlur3Tap( sampler2D inSampler, float inAlphaFlag )
+{
+ vec4 OutCol = vec4(0.0);
+ OutCol += GetTextureValue(inSampler, TexCoord0, inAlphaFlag) * ( WT3_1/WT3_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord1, inAlphaFlag) * ( WT3_0/WT3_NORMALIZE );
+ OutCol += GetTextureValue(inSampler, TexCoord2, inAlphaFlag) * ( WT3_1/WT3_NORMALIZE );
+ return OutCol;
+}
+
+//Get texture data for a texture we know is premultiplied.
+vec4 GaussianBlur3TapPremultiplied( sampler2D inSampler )
+{
+ vec4 OutCol = vec4(0.0);
+ OutCol += texture2D(inSampler, TexCoord0) * ( WT3_1/WT3_NORMALIZE );
+ OutCol += texture2D(inSampler, TexCoord1) * ( WT3_0/WT3_NORMALIZE );
+ OutCol += texture2D(inSampler, TexCoord2) * ( WT3_1/WT3_NORMALIZE );
+ return OutCol;
+}
+
+vec4 GaussianDepthBlur( sampler2D inSampler, float inTextureAlphaInfo, sampler2D inDepthSampler
+ , float inFocusDistance, float inFocusWidth, float inFocusPenumbra )
+{
+ //We modulate each sample weight by the depth value so that we minimize bleeding of the focused
+ //area into the non-focused area.
+ float mult0 = GetDepthMultiplier(TexCoord0, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra) * WT7_1;
+ float mult1 = GetDepthMultiplier(TexCoord1, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra) * WT7_2;
+ float mult2 = GetDepthMultiplier(TexCoord2, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra) * WT7_3;
+ float mult3 = GetDepthMultiplier(TexCoord3, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra) * WT7_0;
+ float mult4 = GetDepthMultiplier(TexCoord4, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra) * WT7_1;
+ float mult5 = GetDepthMultiplier(TexCoord5, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra) * WT7_2;
+ float mult6 = GetDepthMultiplier(TexCoord6, inDepthSampler, inFocusDistance, inFocusWidth, inFocusPenumbra) * WT7_3;
+ float multTotal = mult0 + mult1 + mult2 + mult3 + mult4 + mult5 + mult6;
+ float multMultiplier = multTotal > 0.0 ? 1.0 / multTotal : 0.0;
+ vec4 OutCol = vec4(0.0);
+ OutCol += GetTextureValue(inSampler, TexCoord0, inTextureAlphaInfo) * (mult0 * multMultiplier);
+ OutCol += GetTextureValue(inSampler, TexCoord1, inTextureAlphaInfo) * (mult1 * multMultiplier);
+ OutCol += GetTextureValue(inSampler, TexCoord2, inTextureAlphaInfo) * (mult2 * multMultiplier);
+ OutCol += GetTextureValue(inSampler, TexCoord3, inTextureAlphaInfo) * (mult3 * multMultiplier);
+ OutCol += GetTextureValue(inSampler, TexCoord4, inTextureAlphaInfo) * (mult4 * multMultiplier);
+ OutCol += GetTextureValue(inSampler, TexCoord5, inTextureAlphaInfo) * (mult5 * multMultiplier);
+ OutCol += GetTextureValue(inSampler, TexCoord6, inTextureAlphaInfo) * (mult6 * multMultiplier);
+ return OutCol;
+}
+
+#endif
+
+
+#endif // BLUR_GLSLLIB
diff --git a/res/effectlib/calculateRoughness.glsllib b/res/effectlib/calculateRoughness.glsllib
new file mode 100644
index 0000000..a14083d
--- /dev/null
+++ b/res/effectlib/calculateRoughness.glsllib
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float calculateRoughness( in vec3 N, in float roughnessU, in float roughnessV, in vec3 tangentU )
+{
+ float roughness = roughnessU;
+ if ( abs(roughnessU - roughnessV) > 0.00001)
+ {
+ // determine major and minor radii a and b, and the vector along the major axis
+ float a = roughnessU;
+ float b = roughnessV;
+
+ // we need the angle between the major axis and the projection of viewDir on the tangential plane
+ // the major axis is the orthonormalization of tangentU with respect to N
+ // the projection of viewDir is the orthonormalization of viewDir with respect to N
+ // as both vectors would be calculated by orthonormalize, we can as well leave the second cross
+ // product in those calculations away, as they don't change the angular relation.
+ vec3 minorAxis = normalize( cross( tangentU, N ) ); // crossing this with N would give the major axis
+ // which is equivalent to orthonormalizing tangentU with respect to N
+ if ( roughnessU < roughnessV )
+ {
+ a = roughnessV;
+ b = roughnessU;
+ minorAxis = cross( N, minorAxis );
+ }
+
+ vec3 po = normalize( cross( viewDir, N ) );
+ float cosPhi = dot( po, minorAxis );
+
+ // determine the polar coordinate of viewDir, take that radius as the roughness
+ float excentricitySquare = 1.0 - square( b / a );
+ roughness = b / sqrt( 1.0 - excentricitySquare * square( cosPhi ) );
+ }
+ return( roughness );
+}
+
diff --git a/res/effectlib/coordinateSource.glsllib b/res/effectlib/coordinateSource.glsllib
new file mode 100644
index 0000000..bc435d5
--- /dev/null
+++ b/res/effectlib/coordinateSource.glsllib
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+texture_coordinate_info coordinateSource( in int coordinateSystem, in int textureSpace )
+{
+ texture_coordinate_info tci;
+ switch( coordinateSystem )
+ {
+ case texture_coordinate_object :
+ tci.position = varObjPos;
+ tci.tangent_u = normalize( varObjTangent );
+ tci.tangent_v = normalize( varObjBinormal );
+ break;
+ case texture_coordinate_world :
+ tci.position = varWorldPos;
+ tci.tangent_u = normalize( varTangent );
+ tci.tangent_v = normalize( varBinormal );
+ break;
+ case texture_coordinate_uvw :
+ default :
+ tci.position = varTexCoord0;
+ tci.tangent_u = normalize( varTangent );
+ tci.tangent_v = normalize( varBinormal );
+ break;
+ }
+ return( tci );
+}
+
diff --git a/res/effectlib/cube.glsllib b/res/effectlib/cube.glsllib
new file mode 100644
index 0000000..74da833
--- /dev/null
+++ b/res/effectlib/cube.glsllib
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float cube( in float x )
+{
+ return( x * x * x );
+}
+
+vec2 cube( in vec2 x )
+{
+ return( x * x * x );
+}
+
+vec3 cube( in vec3 x )
+{
+ return( x * x * x );
+}
+
+vec4 cube( in vec4 x )
+{
+ return( x * x * x );
+}
+
diff --git a/res/effectlib/customCurveLayer.glsllib b/res/effectlib/customCurveLayer.glsllib
new file mode 100644
index 0000000..2bc1780
--- /dev/null
+++ b/res/effectlib/customCurveLayer.glsllib
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 customCurveLayer( in vec3 L, in float normal_reflectivity, in float grazing_reflectivity, in float exponent, float weight, in vec3 layercolor, vec4 layer, vec4 base, in float alpha )
+{
+ vec3 H = normalize( viewDir + L );
+ vec3 refl = reflect( -viewDir, H );
+ float reflWt = clamp( dot( surfNormal, refl ) + 1.0, 0.0, 1.0 );
+
+ float curveFactor = mix( normal_reflectivity, grazing_reflectivity, pow(1.0 - abs(dot( viewDir, H )), exponent) );
+ curveFactor *= weight * reflWt;
+
+ return( vec4( mix( base.rgb, layercolor * layer.rgb, curveFactor ), mix(alpha, 1.0, curveFactor) ) );
+}
+
diff --git a/res/effectlib/customMaterial.glsllib b/res/effectlib/customMaterial.glsllib
new file mode 100644
index 0000000..0a4d88b
--- /dev/null
+++ b/res/effectlib/customMaterial.glsllib
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CUSTOM_MATERIAL_GLSLLIB
+#define CUSTOM_MATERIAL_GLSLLIB 1
+
+#define SNAPPER_SAMPLER2D(samplerName, samplerNiceName, texFilter, texWrap, showUI )\
+uniform sampler2D samplerName;
+
+// some useful defines
+#ifndef PI
+#define PI 3.14159265358979
+#define PI_HALF ( 0.5 * PI )
+#define PI_TWO ( 2.0 * PI )
+#define ONE_OVER_PI ( 1.0 / PI )
+#define TWO_OVER_PI ( 2.0 / PI )
+#define PI_SQUARE ( PI * PI )
+#endif
+
+#endif // CUSTOM_MATERIAL_GLSLLIB
diff --git a/res/effectlib/customMaterialFragBody.glsllib b/res/effectlib/customMaterialFragBody.glsllib
new file mode 100644
index 0000000..fccb8e0
--- /dev/null
+++ b/res/effectlib/customMaterialFragBody.glsllib
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CUSTOM_MATERIAL_FRAG_BODY_GLSLLIB
+#define CUSTOM_MATERIAL_FRAG_BODY_GLSLLIB
+
+ bool twoSided = false;
+ vec3 materialEmissive = vec3( 0.0, 0.0, 0.0 );
+
+ float materialIOR = computeIOR();
+
+ if ( gl_FrontFacing )
+ {
+ materialEmissive = computeFrontMaterialEmissive() * computeMaterialEmissiveMask();
+ }
+ else
+ {
+ materialIOR = 1.0 / materialIOR;
+ twoSided = evalTwoSided();
+ if ( twoSided )
+ {
+ normal = -normal;
+ materialEmissive = computeBackMaterialEmissive() * computeMaterialEmissiveMask();
+ }
+ }
+
+ vec4 rgba = vec4( materialEmissive, 0.0 );
+
+ vec3 lightAmbient, lightDiffuse, lightSpecular, L;
+ for ( int i=0 ; i<uNumLights ; i++ )
+ {
+ sampleLight( lights[i], varWorldPos, L, lightAmbient, lightDiffuse, lightSpecular);
+ //evalTemporariesPerLightSource( normal, L, lightDiffuse, lightSpecular, materialIOR );
+ if (gl_FrontFacing)
+ computeFrontLayerColor( normal, L, viewDir, lightDiffuse, lightSpecular, materialIOR, 1.0 );
+ else
+ computeBackLayerColor( normal, L, viewDir, lightDiffuse, lightSpecular, materialIOR, 1.0 );
+ }
+ for ( int i=0 ; i < uNumAreaLights; ++i )
+ {
+ if (gl_FrontFacing)
+ computeFrontAreaColor( i, arealights[i].diffuse, arealights[i].specular );
+ else
+ computeBackAreaColor( i, arealights[i].diffuse, arealights[i].specular );
+ }
+
+ if ( 0.0 < alpha )
+ {
+ if (gl_FrontFacing)
+ computeFrontLayerEnvironment( normal, viewDir, 1.0 );
+ else
+ computeBackLayerEnvironment( normal, viewDir, 1.0 );
+ }
+
+ rgba += computeLayerWeights( alpha );
+
+#endif
diff --git a/res/effectlib/customMaterialFragBodyAO.glsllib b/res/effectlib/customMaterialFragBodyAO.glsllib
new file mode 100644
index 0000000..d194569
--- /dev/null
+++ b/res/effectlib/customMaterialFragBodyAO.glsllib
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CUSTOM_MATERIAL_FRAG_BODY_AO_GLSLLIB
+#define CUSTOM_MATERIAL_FRAG_BODY_AO_GLSLLIB
+
+ bool twoSided = false;
+ vec3 materialEmissive = vec3( 0.0, 0.0, 0.0 );
+
+ float materialIOR = computeIOR();
+
+ if ( gl_FrontFacing )
+ {
+ materialEmissive = computeFrontMaterialEmissive() * computeMaterialEmissiveMask();
+ }
+ else
+ {
+ materialIOR = 1.0 / materialIOR;
+ twoSided = evalTwoSided();
+ if ( twoSided )
+ {
+ normal = -normal;
+ materialEmissive = computeBackMaterialEmissive() * computeMaterialEmissiveMask();
+ }
+ }
+
+ vec4 rgba = vec4( materialEmissive, 0.0 );
+
+ // compute ambient occlusion
+ float aoFactor = customMaterialAO( );
+
+ vec3 lightAmbient, lightDiffuse, lightSpecular, L;
+ for ( int i=0 ; i<uNumLights ; i++ )
+ {
+ sampleLight( lights[i], varWorldPos, L, lightAmbient, lightDiffuse, lightSpecular);
+ lightAmbient *= aoFactor;
+ lightDiffuse *= aoFactor;
+
+ //evalTemporariesPerLightSource( normal, L, lightDiffuse, lightSpecular, materialIOR );
+ if (gl_FrontFacing)
+ computeFrontLayerColor( normal, L, viewDir, lightDiffuse, lightSpecular, materialIOR, aoFactor );
+ else
+ computeBackLayerColor( normal, L, viewDir, lightDiffuse, lightSpecular, materialIOR, aoFactor );
+ }
+ for ( int i=0 ; i < uNumAreaLights; ++i )
+ {
+ if (gl_FrontFacing)
+ computeFrontAreaColor( i, arealights[i].diffuse, arealights[i].specular );
+ else
+ computeBackAreaColor( i, arealights[i].diffuse, arealights[i].specular );
+ }
+
+ if ( 0.0 < alpha )
+ {
+ if (gl_FrontFacing)
+ computeFrontLayerEnvironment( normal, viewDir, aoFactor );
+ else
+ computeBackLayerEnvironment( normal, viewDir, aoFactor );
+ }
+
+ rgba += computeLayerWeights( alpha );
+
+#endif
diff --git a/res/effectlib/defaultMaterialBumpNoLod.glsllib b/res/effectlib/defaultMaterialBumpNoLod.glsllib
new file mode 100644
index 0000000..4144ae2
--- /dev/null
+++ b/res/effectlib/defaultMaterialBumpNoLod.glsllib
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float calcRGBAvg(in vec4 rgba)
+{
+ return (rgba.r + rgba.g + rgba.b) / 3.0;
+}
+
+vec3 defaultMaterialBumpNoLod(in sampler2D sampler, in float factor,
+ in vec2 texCoord, in vec3 tangent, in vec3 binormal,
+ in vec3 normal, in vec2 bumpSize)
+{
+ // invert factor
+ float invFactor = -factor;
+
+ vec2 unitStep = 1.0 / bumpSize;
+
+ float du = calcRGBAvg(texture2D(sampler, vec2(texCoord.x + unitStep.x, texCoord.y)))
+ - calcRGBAvg(texture2D(sampler, vec2(texCoord.x, texCoord.y)));
+ float dv = calcRGBAvg(texture2D(sampler, vec2(texCoord.x, texCoord.y + unitStep.y)))
+ - calcRGBAvg(texture2D(sampler, vec2(texCoord.x, texCoord.y)));
+
+ vec3 n = normalize(vec3(invFactor * du, invFactor * dv, 1.0));
+ n = n.x * normalize(tangent) + n.y * normalize(binormal) + n.z * normal;
+ return normalize(normal + n);
+}
diff --git a/res/effectlib/defaultMaterialFileBumpTexture.glsllib b/res/effectlib/defaultMaterialFileBumpTexture.glsllib
new file mode 100644
index 0000000..6901ace
--- /dev/null
+++ b/res/effectlib/defaultMaterialFileBumpTexture.glsllib
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_DEFAULT_MATERIAL_FILE_BUMP_TEXTURE_GLSLLIB
+#define QT3DS_DEFAULT_MATERIAL_FILE_BUMP_TEXTURE_GLSLLIB
+
+#ifndef QT3DS_DEFINE_API
+#define QT3DS_DEFINE_API
+#endif
+
+#include "fileBumpTexture.glsllib"
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/defaultMaterialFileDisplacementTexture.glsllib b/res/effectlib/defaultMaterialFileDisplacementTexture.glsllib
new file mode 100644
index 0000000..4c9af3f
--- /dev/null
+++ b/res/effectlib/defaultMaterialFileDisplacementTexture.glsllib
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_DEFAULT_MATERIAL_FILE_DISPLACEMENT_TEXTURE_GLSLLIB
+#define QT3DS_DEFAULT_MATERIAL_FILE_DISPLACEMENT_TEXTURE_GLSLLIB
+
+#ifndef QT3DS_DEFINE_API
+#define QT3DS_DEFINE_API
+#endif
+
+#include "fileDisplacementTexture.glsllib"
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/defaultMaterialFileNormalTexture.glsllib b/res/effectlib/defaultMaterialFileNormalTexture.glsllib
new file mode 100644
index 0000000..70ab52b
--- /dev/null
+++ b/res/effectlib/defaultMaterialFileNormalTexture.glsllib
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_DEFAULT_MATERIAL_FILE_NORMAL_TEXTURE_GLSLLIB
+#define QT3DS_DEFAULT_MATERIAL_FILE_NORMAL_TEXTURE_GLSLLIB
+
+#ifndef QT3DS_DEFINE_API
+#define QT3DS_DEFINE_API
+#endif
+
+#include "tangentSpaceNormalTexture.glsllib"
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/defaultMaterialFresnel.glsllib b/res/effectlib/defaultMaterialFresnel.glsllib
new file mode 100644
index 0000000..e0eff4f
--- /dev/null
+++ b/res/effectlib/defaultMaterialFresnel.glsllib
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DEFAULT_MATERIAL_FRESNEL_GLSLLIB
+#define DEFAULT_MATERIAL_FRESNEL_GLSLLIB
+
+float defaultMaterialSimpleFresnel( in vec3 N, in vec3 viewDir, in float ior, float fresnelPower )
+{
+ float F = ((1.0-ior) * (1.0-ior)) / ((1.0+ior) * (1.0+ior));
+ float VdotN = dot(viewDir, N);
+ VdotN = clamp( VdotN, 0.0, 1.0 );
+ float ratio = F + (1.0 - F) * pow(1.0 - VdotN, fresnelPower);
+
+ return ratio;
+}
+
+#endif
diff --git a/res/effectlib/defaultMaterialLighting.glsllib b/res/effectlib/defaultMaterialLighting.glsllib
new file mode 100644
index 0000000..e96a450
--- /dev/null
+++ b/res/effectlib/defaultMaterialLighting.glsllib
@@ -0,0 +1,80 @@
+/**
+ * UICViewer lighting equation implementations
+ */
+
+#ifndef DEFAULT_MATERIAL_LIGHTING
+#define DEFAULT_MATERIAL_LIGHTING
+
+#include "diffuseReflectionBSDF.glsllib"
+#include "luminance.glsllib"
+#include "specularBSDF.glsllib"
+
+#include "funccalculatePointLightAttenuation.glsllib"
+#include "funcgetTransformedUVCoords.glsllib"
+
+vec2 calculateLightParameters( vec3 lightDir, vec3 normalDir )
+{
+ vec2 retval;
+ retval.x = max( 0.0, -1.0 * dot( lightDir, normalDir ) ); //diffuseIntensity
+ retval.y = clamp( retval.x * 4.0, 0.0, 1.0 ); //selfShadowTerm
+ return retval;
+}
+vec2 calculateWrapLightParameters( vec3 lightDir, vec3 normalDir, float wrap )
+{
+ vec2 retval;
+ retval.x = max( 0.0, -1.0 * ((dot(lightDir, normalDir) + wrap)/ (1.0 + wrap)) ); //diffuseIntensity
+ retval.y = clamp( retval.x, 0.0, 1.0 ); //selfShadowTerm
+ return retval;
+}
+
+vec3 calculateDirectionalAddition( vec3 lightColor, vec2 lightParameters ) {
+ return ( lightColor * lightParameters.x * lightParameters.y );
+}
+
+vec3 calculateSpecularAddition( vec3 lightDir, vec3 normalDir, vec3 viewVec, vec3 lightSpecularColor, float specularAmount
+ , float specularRoughness, vec2 lightParameters )
+{
+ vec3 reflection = normalize( 2.0 * lightParameters.x * normalDir + lightDir );
+ return ( lightParameters.y * specularAmount * lightSpecularColor * pow( clamp( dot( reflection, viewVec ), 0.0, 1.0 ), specularRoughness ) );
+}
+
+float calculateDiffuseAreaFactors( in vec3 lightDir, in vec3 lightPos, in vec4 lightUp, in vec4 lightRt, in vec3 worldPos, out vec3 outDir )
+{
+ vec3 v0 = lightPos - (lightRt.xyz * lightRt.w * 0.5) - (lightUp.xyz * lightUp.w * 0.5);
+ vec3 v1 = lightPos - (lightRt.xyz * lightRt.w * 0.5) + (lightUp.xyz * lightUp.w * 0.5);
+ vec3 v2 = lightPos + (lightRt.xyz * lightRt.w * 0.5) + (lightUp.xyz * lightUp.w * 0.5);
+ vec3 v3 = lightPos + (lightRt.xyz * lightRt.w * 0.5) - (lightUp.xyz * lightUp.w * 0.5);
+ v0 = normalize( v0 - worldPos ); v1 = normalize( v1 - worldPos );
+ v2 = normalize( v2 - worldPos ); v3 = normalize( v3 - worldPos );
+ float a01 = acos( clamp( dot(v0, v1), -1.0, 1.0 ) );
+ float a12 = acos( clamp( dot(v1, v2), -1.0, 1.0 ) );
+ float a23 = acos( clamp( dot(v2, v3), -1.0, 1.0 ) );
+ float a30 = acos( clamp( dot(v3, v0), -1.0, 1.0 ) );
+ outDir = vec3( 0.0 );
+ outDir -= normalize(cross( v0, v1 )) * a01;
+ outDir -= normalize(cross( v1, v2 )) * a12;
+ outDir -= normalize(cross( v2, v3 )) * a23;
+ outDir -= normalize(cross( v3, v0 )) * a30;
+ float retVal = length(outDir) * 0.15915494309; // solid angle / 2*pi
+ outDir = -normalize(outDir);
+ retVal *= clamp( dot( worldPos-lightPos, lightDir), 0.0, 1.0 );
+ return retVal;
+}
+
+vec3 calculateSpecDirection( in vec3 lightDir, in vec3 lightPos, in vec4 lightUp, in vec4 lightRt, in vec3 worldPos, in vec3 worldNorm, in vec3 viewDir )
+{
+ vec3 reflDir = reflect(viewDir, worldNorm);
+ vec3 ldir = normalize( lightPos - worldPos );
+ if ( dot( ldir, lightDir ) > 0.0 ) { return vec3(0.0001); }
+ float t = (dot(lightDir, worldPos) - dot(lightDir, lightPos)) / dot(lightDir, reflDir);
+ if ( t < 0.0 ) { return vec3(0.0001); }
+ vec3 xsectPos = worldPos - t * reflDir;
+ float tx = dot( xsectPos - lightPos, lightRt.xyz );
+ float ty = dot( xsectPos - lightPos, lightUp.xyz );
+ tx = clamp(tx, -lightRt.w*0.5, lightRt.w*0.5);
+ ty = clamp(ty, -lightUp.w*0.5, lightUp.w*0.5);
+ xsectPos = lightPos + lightUp.xyz * ty + lightRt.xyz * tx;
+ return normalize( worldPos - xsectPos );
+}
+
+#endif
diff --git a/res/effectlib/defaultMaterialPhysGlossyBSDF.glsllib b/res/effectlib/defaultMaterialPhysGlossyBSDF.glsllib
new file mode 100644
index 0000000..1035e43
--- /dev/null
+++ b/res/effectlib/defaultMaterialPhysGlossyBSDF.glsllib
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DEFAULT_MATERIAL_PHYS_GLOSSY_BSDF_GLSLLIB
+#define DEFAULT_MATERIAL_PHYS_GLOSSY_BSDF_GLSLLIB
+#ifndef QT3DS_DEFINE_API
+#define QT3DS_DEFINE_API
+#endif
+
+#include "luminance.glsllib"
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#include "physGlossyBSDF.glsllib"
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/depthpass.glsllib b/res/effectlib/depthpass.glsllib
new file mode 100644
index 0000000..cbd45c2
--- /dev/null
+++ b/res/effectlib/depthpass.glsllib
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DEPTHPASS_GLSLIB
+#define DEPTHPASS_GLSLIB 1
+
+float calculateVertexDepth( vec2 camera_properties, vec4 position )
+{
+ float camera_range = camera_properties.y - camera_properties.x;
+ return 1.0 - ((position.w - camera_properties.x) / (camera_range));
+}
+
+#if __VERSION__ <= 120
+float modf(in float val, out float integer)
+{
+ integer = floor(val);
+ return val - integer;
+}
+#endif
+
+vec4 outputDepth( float vert_depth )
+{
+ float integer_portion = 0.0;
+ float fraction = modf((vert_depth * 255.0), integer_portion);
+ return vec4( integer_portion / 255.0, fraction, 0, 1.0 );
+}
+
+float getDepthValue( vec4 depth_texture_sample, vec2 camera_properties )
+{
+
+#if __VERSION__ >= 300
+ float zNear = camera_properties.x;
+ float zFar = camera_properties.y;
+ float zRange = zFar - zNear;
+ float z_b = depth_texture_sample.x;
+ float z_n = 2.0 * z_b - 1.0;
+ float z_e = 2.0 * zNear * zFar / (zFar + zNear - z_n * (zRange));
+ return 1.0 - ((z_e - camera_properties.x) / (zRange));
+#else
+ return depth_texture_sample.x + (depth_texture_sample.y / 255.0);
+#endif
+}
+
+float depthValueToLinearDistance( float depth_value, vec2 camera_properties )
+{
+ float FarClipDistance = camera_properties.y;
+ float NearClipDistance = camera_properties.x;
+ float DepthRange = FarClipDistance - NearClipDistance;
+ float linearDepth = NearClipDistance + (DepthRange * (1.0 - depth_value));
+ return linearDepth;
+}
+
+#endif
diff --git a/res/effectlib/dfTint.glsllib b/res/effectlib/dfTint.glsllib
new file mode 100644
index 0000000..f1f4b7a
--- /dev/null
+++ b/res/effectlib/dfTint.glsllib
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 dfTint( in vec3 tint, in vec4 base )
+{
+ return( vec4( tint * base.rgb, base.a ) );
+}
+
diff --git a/res/effectlib/diffuseReflectionBSDF.glsllib b/res/effectlib/diffuseReflectionBSDF.glsllib
new file mode 100644
index 0000000..a98509d
--- /dev/null
+++ b/res/effectlib/diffuseReflectionBSDF.glsllib
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "funcdiffuseReflectionBSDF.glsllib"
+#include "funcdiffuseReflectionWrapBSDF.glsllib"
+
+vec4 lambertReflectionBSDF( in vec3 N, in vec3 L, in vec3 lightDiffuse )
+{
+ // If we're not going to use the roughness on the diffuse, there's no point
+ // in wasting the cycles for the branching.
+ float cosThetaI = max( 0.0, dot( N, L ) );
+ return vec4( cosThetaI * lightDiffuse, 1.0 );
+}
+
+
+vec4 diffuseReflectionBSDFEnvironment( in vec3 N, in float roughness )
+{
+ return( vec4( 0.0, 0.0, 0.0, 1.0 ) );
+}
+
+// RNM radiosity normal maps
+vec4 diffuseRNM( in vec3 N, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+ // we use a fixed basis like Half Life
+ vec3 B0 = vec3( -0.40825, 0.70711, 0.57735);
+ vec3 B1 = vec3( -0.40825, -0.70711, 0.57735);
+ vec3 B2 = vec3( 0.8165, 0.0, 0.57735);
+
+ vec3 dp;
+ dp.x = clamp( dot ( N , B0 ), 0.0, 1.0);
+ dp.y = clamp( dot ( N , B1 ), 0.0, 1.0);
+ dp.z = clamp( dot ( N , B2 ), 0.0, 1.0);
+
+ float sum = 1.0 / dot( dp, vec3(1.0, 1.0, 1.0) );
+ vec3 diffuseLight = dp.x * rnmX + dp.y * rnmY + dp.z * rnmZ;
+ //vec3 diffuseLight = N.x * rnmX + N.y * rnmY + N.z * rnmZ;
+
+ return (vec4(diffuseLight, 1.0) * sum);
+}
diff --git a/res/effectlib/diffuseTransmissionBSDF.glsllib b/res/effectlib/diffuseTransmissionBSDF.glsllib
new file mode 100644
index 0000000..f6e5f52
--- /dev/null
+++ b/res/effectlib/diffuseTransmissionBSDF.glsllib
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 diffuseTransmissionBSDF( in vec3 N, in vec3 L, in vec3 viewDir, in vec3 lightDiffuse, in vec4 transmissiveColor, in float translucentFalloff, float lightWrap )
+{
+ float cosThetaI = max( 0.0, (dot( N, L ) + lightWrap) / (1.0 + lightWrap) );
+ float factor = cosThetaI;
+
+ float l = 0.2126 * transmissiveColor.r + 0.7152 * transmissiveColor.g + 0.0722 * transmissiveColor.b;
+
+ float translucent_thickness = l * l;
+ float translucent_thickness_exp = exp( translucent_thickness * translucentFalloff);
+
+ return( translucent_thickness_exp * vec4( factor * lightDiffuse, 1.0 ) );
+}
diff --git a/res/effectlib/directionalFactor.glsllib b/res/effectlib/directionalFactor.glsllib
new file mode 100644
index 0000000..78af883
--- /dev/null
+++ b/res/effectlib/directionalFactor.glsllib
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 directionalFactor( in vec3 normal, in vec3 viewDir, in vec3 normal_col, in vec3 grazing_col, in float exponent, in vec4 base )
+{
+ float f;
+
+ f = clamp(dot(viewDir, normal),0.0, 1.0 );
+ f = 1.0 - pow(f, 1.0/exponent);
+ vec3 directionalColor = mix( normal_col, grazing_col, f );
+
+ vec4 color = base * vec4(directionalColor, 1.0);
+
+ return color;
+}
diff --git a/res/effectlib/distancefieldtext.frag b/res/effectlib/distancefieldtext.frag
new file mode 100644
index 0000000..1d83490
--- /dev/null
+++ b/res/effectlib/distancefieldtext.frag
@@ -0,0 +1,28 @@
+#ifdef GL_OES_standard_derivatives
+# extension GL_OES_standard_derivatives : enable
+#else
+# define use_fallback
+#endif
+
+varying highp vec2 sampleCoord;
+
+uniform sampler2D _qt_texture;
+uniform highp vec4 color;
+
+#ifdef use_fallback
+varying highp vec2 alphas;
+#endif
+
+void main()
+{
+ highp float distance = texture2D(_qt_texture, sampleCoord).a;
+
+#ifdef use_fallback
+ highp float alpha = smoothstep(alphas.x, alphas.y, distance);
+#else
+ highp float f = fwidth(distance);
+ highp float alpha = smoothstep(0.5 - f, 0.5, distance);
+#endif
+
+ gl_FragColor = color * alpha;
+}
diff --git a/res/effectlib/distancefieldtext.vert b/res/effectlib/distancefieldtext.vert
new file mode 100644
index 0000000..f6b2de4
--- /dev/null
+++ b/res/effectlib/distancefieldtext.vert
@@ -0,0 +1,77 @@
+#ifdef GL_OES_standard_derivatives
+# extension GL_OES_standard_derivatives : enable
+#else
+# define use_fallback
+#endif
+
+uniform highp mat4 mvp;
+uniform highp float fontScale;
+uniform int textureWidth;
+uniform int textureHeight;
+
+attribute highp vec3 vCoord;
+attribute highp vec2 tCoord;
+
+varying highp vec2 sampleCoord;
+
+#ifdef use_fallback
+varying highp vec2 alphas;
+
+highp float thresholdFunc(highp float scale)
+{
+ highp float base = 0.5;
+ highp float baseDev = 0.065;
+ highp float devScaleMin = 0.15;
+ highp float devScaleMax = 0.3;
+ return base - ((clamp(scale, devScaleMin, devScaleMax) - devScaleMin)
+ / (devScaleMax - devScaleMin) * -baseDev + baseDev);
+}
+
+highp float spreadFunc(highp float scale)
+{
+ return 0.06 / scale;
+}
+
+highp vec2 alphaRange(highp float scale)
+{
+ highp float base = thresholdFunc(scale);
+ highp float range = spreadFunc(scale);
+ highp float alphaMin = max(0.0, base - range);
+ highp float alphaMax = min(base + range, 1.0);
+ return vec2(alphaMin, alphaMax);
+}
+
+highp float determinantOfSubmatrix(highp mat4 m, int col0, int col1, int row0, int row1)
+{
+ return m[col0][row0] * m[col1][row1] - m[col0][row1] * m[col1][row0];
+}
+
+highp float determinantOfSubmatrix(highp mat4 m, int col0, int col1, int col2,
+ int row0, int row1, int row2)
+{
+ highp float det = m[col0][row0] * determinantOfSubmatrix(m, col1, col2, row1, row2);
+ det -= m[col1][row0] * determinantOfSubmatrix(m, col0, col2, row1, row2);
+ det += m[col2][row0] * determinantOfSubmatrix(m, col0, col1, row1, row2);
+ return det;
+}
+
+highp float determinant(highp mat4 m)
+{
+ highp float det = m[0][0] * determinantOfSubmatrix(m, 1, 2, 3, 1, 2, 3);
+ det -= m[1][0] * determinantOfSubmatrix(m, 0, 2, 3, 1, 2, 3);
+ det += m[2][0] * determinantOfSubmatrix(m, 0, 1, 3, 1, 2, 3);
+ det -= m[3][0] * determinantOfSubmatrix(m, 0, 1, 2, 1, 2, 3);
+ return det;
+}
+#endif
+
+void main()
+{
+#ifdef use_fallback
+ highp float scale = fontScale * pow(abs(determinant(mvp)), 1.0 / 3.0);
+ alphas = alphaRange(scale);
+#endif
+
+ sampleCoord = tCoord * vec2(1.0 / float(textureWidth), 1.0 / float(textureHeight));
+ gl_Position = mvp * vec4(vCoord, 1.0);
+}
diff --git a/res/effectlib/distancefieldtext_core.frag b/res/effectlib/distancefieldtext_core.frag
new file mode 100644
index 0000000..f11dcc1
--- /dev/null
+++ b/res/effectlib/distancefieldtext_core.frag
@@ -0,0 +1,11 @@
+in vec2 sampleCoord;
+
+uniform sampler2D _qt_texture;
+uniform vec4 color;
+
+void main()
+{
+ float distance = texture(_qt_texture, sampleCoord).r;
+ float f = fwidth(distance);
+ fragOutput = color * smoothstep(0.5 - f, 0.5, distance);
+}
diff --git a/res/effectlib/distancefieldtext_core.vert b/res/effectlib/distancefieldtext_core.vert
new file mode 100644
index 0000000..2dc198f
--- /dev/null
+++ b/res/effectlib/distancefieldtext_core.vert
@@ -0,0 +1,15 @@
+in vec3 vCoord;
+in vec2 tCoord;
+
+out vec2 sampleCoord;
+
+uniform mat4 mvp;
+uniform int textureWidth;
+uniform int textureHeight;
+uniform float fontScale;
+
+void main()
+{
+ sampleCoord = tCoord * vec2(1.0 / float(textureWidth), 1.0 / float(textureHeight));
+ gl_Position = mvp * vec4(vCoord, 1.0);
+}
diff --git a/res/effectlib/distancefieldtext_dropshadow.frag b/res/effectlib/distancefieldtext_dropshadow.frag
new file mode 100644
index 0000000..fdb68ba
--- /dev/null
+++ b/res/effectlib/distancefieldtext_dropshadow.frag
@@ -0,0 +1,47 @@
+#ifdef GL_OES_standard_derivatives
+# extension GL_OES_standard_derivatives : enable
+#else
+# define use_fallback
+#endif
+
+varying highp vec2 sampleCoord;
+varying highp vec2 shadowSampleCoord;
+varying highp vec4 normalizedTextureBounds;
+
+#ifdef use_fallback
+varying highp vec2 alphas;
+#endif
+
+uniform sampler2D _qt_texture;
+uniform highp vec4 color;
+uniform highp vec4 shadowColor;
+
+void main()
+{
+ highp float shadowDistance = texture2D(_qt_texture,
+ clamp(shadowSampleCoord,
+ normalizedTextureBounds.xy,
+ normalizedTextureBounds.zw)).a;
+#ifdef use_fallback
+ highp float shadowAlpha = smoothstep(alphas.x, alphas.y, shadowDistance);
+#else
+ highp float shadowDistanceD = fwidth(shadowDistance);
+ highp float shadowAlpha = smoothstep(0.5 - shadowDistanceD, 0.5, shadowDistance);
+#endif
+
+ highp vec4 shadowPixel = color * shadowColor * shadowAlpha;
+
+ highp float textDistance = texture2D(_qt_texture,
+ clamp(sampleCoord,
+ normalizedTextureBounds.xy,
+ normalizedTextureBounds.zw)).a;
+#ifdef use_fallback
+ highp float textAlpha = smoothstep(alphas.x, alphas.y, textDistance);
+#else
+ highp float textDistanceD = fwidth(textDistance);
+ highp float textAlpha = smoothstep(0.5 - textDistanceD, 0.5, textDistance);
+#endif
+
+ highp vec4 textPixel = color * textAlpha;
+ gl_FragColor = mix(shadowPixel, textPixel, textPixel.a);
+}
diff --git a/res/effectlib/distancefieldtext_dropshadow.vert b/res/effectlib/distancefieldtext_dropshadow.vert
new file mode 100644
index 0000000..5939a8c
--- /dev/null
+++ b/res/effectlib/distancefieldtext_dropshadow.vert
@@ -0,0 +1,88 @@
+#ifdef GL_OES_standard_derivatives
+# extension GL_OES_standard_derivatives : enable
+#else
+# define use_fallback
+#endif
+
+uniform highp mat4 mvp;
+uniform highp float fontScale;
+uniform int textureWidth;
+uniform int textureHeight;
+uniform highp vec2 shadowOffset;
+
+attribute highp vec3 vCoord;
+attribute highp vec2 tCoord;
+attribute highp vec4 textureBounds;
+
+varying highp vec2 sampleCoord;
+varying highp vec2 shadowSampleCoord;
+varying highp vec4 normalizedTextureBounds;
+
+#ifdef use_fallback
+varying highp vec2 alphas;
+
+highp float thresholdFunc(highp float scale)
+{
+ highp float base = 0.5;
+ highp float baseDev = 0.065;
+ highp float devScaleMin = 0.15;
+ highp float devScaleMax = 0.3;
+ return base - ((clamp(scale, devScaleMin, devScaleMax) - devScaleMin)
+ / (devScaleMax - devScaleMin) * -baseDev + baseDev);
+}
+
+highp float spreadFunc(highp float scale)
+{
+ return 0.06 / scale;
+}
+
+highp vec2 alphaRange(highp float scale)
+{
+ highp float base = thresholdFunc(scale);
+ highp float range = spreadFunc(scale);
+ highp float alphaMin = max(0.0, base - range);
+ highp float alphaMax = min(base + range, 1.0);
+ return vec2(alphaMin, alphaMax);
+}
+
+highp float determinantOfSubmatrix(highp mat4 m, int col0, int col1, int row0, int row1)
+{
+ return m[col0][row0] * m[col1][row1] - m[col0][row1] * m[col1][row0];
+}
+
+highp float determinantOfSubmatrix(highp mat4 m, int col0, int col1, int col2,
+ int row0, int row1, int row2)
+{
+ highp float det = m[col0][row0] * determinantOfSubmatrix(m, col1, col2, row1, row2);
+ det -= m[col1][row0] * determinantOfSubmatrix(m, col0, col2, row1, row2);
+ det += m[col2][row0] * determinantOfSubmatrix(m, col0, col1, row1, row2);
+ return det;
+}
+
+highp float determinant(highp mat4 m)
+{
+ highp float det = m[0][0] * determinantOfSubmatrix(m, 1, 2, 3, 1, 2, 3);
+ det -= m[1][0] * determinantOfSubmatrix(m, 0, 2, 3, 1, 2, 3);
+ det += m[2][0] * determinantOfSubmatrix(m, 0, 1, 3, 1, 2, 3);
+ det -= m[3][0] * determinantOfSubmatrix(m, 0, 1, 2, 1, 2, 3);
+ return det;
+}
+#endif
+
+void main()
+{
+#ifdef use_fallback
+ highp float scale = fontScale * pow(abs(determinant(mvp)), 1.0 / 3.0);
+ alphas = alphaRange(scale);
+#endif
+
+ highp vec2 textureSizeMultiplier = vec2(1.0 / float(textureWidth),
+ 1.0 / float(textureHeight));
+
+ sampleCoord = tCoord * textureSizeMultiplier;
+ shadowSampleCoord = (tCoord - shadowOffset) * textureSizeMultiplier;
+ normalizedTextureBounds = vec4(textureBounds.xy * textureSizeMultiplier,
+ textureBounds.zw * textureSizeMultiplier);
+
+ gl_Position = mvp * vec4(vCoord, 1.0);
+}
diff --git a/res/effectlib/distancefieldtext_dropshadow_core.frag b/res/effectlib/distancefieldtext_dropshadow_core.frag
new file mode 100644
index 0000000..e13182e
--- /dev/null
+++ b/res/effectlib/distancefieldtext_dropshadow_core.frag
@@ -0,0 +1,28 @@
+in vec2 sampleCoord;
+in vec2 shadowSampleCoord;
+in vec4 normalizedTextureBounds;
+
+uniform sampler2D _qt_texture;
+uniform vec4 color;
+uniform vec4 shadowColor;
+
+void main()
+{
+ float shadowDistance = texture(_qt_texture,
+ clamp(shadowSampleCoord,
+ normalizedTextureBounds.xy,
+ normalizedTextureBounds.zw)).r;
+ float shadowDistanceD = fwidth(shadowDistance);
+ float shadowAlpha = smoothstep(0.5 - shadowDistanceD, 0.5, shadowDistance);
+ vec4 shadowPixel = color * shadowColor * shadowAlpha;
+
+ float textDistance = texture(_qt_texture,
+ clamp(sampleCoord,
+ normalizedTextureBounds.xy,
+ normalizedTextureBounds.zw)).r;
+ float textDistanceD = fwidth(textDistance);
+ float textAlpha = smoothstep(0.5 - textDistanceD, 0.5, textDistance);
+ vec4 textPixel = color * textAlpha;
+
+ fragOutput = mix(shadowPixel, textPixel, textPixel.a);
+}
diff --git a/res/effectlib/distancefieldtext_dropshadow_core.vert b/res/effectlib/distancefieldtext_dropshadow_core.vert
new file mode 100644
index 0000000..7d9736e
--- /dev/null
+++ b/res/effectlib/distancefieldtext_dropshadow_core.vert
@@ -0,0 +1,25 @@
+in vec3 vCoord;
+in vec2 tCoord;
+in vec4 textureBounds;
+
+out vec2 sampleCoord;
+out vec2 shadowSampleCoord;
+
+out vec4 normalizedTextureBounds;
+
+uniform mat4 mvp;
+uniform int textureWidth;
+uniform int textureHeight;
+uniform float fontScale;
+uniform vec2 shadowOffset;
+
+void main()
+{
+ vec2 textureSizeMultiplier = vec2(1.0 / float(textureWidth), 1.0 / float(textureHeight));
+
+ sampleCoord = tCoord * textureSizeMultiplier;
+ shadowSampleCoord = (tCoord - shadowOffset) * textureSizeMultiplier;
+ normalizedTextureBounds = vec4(textureBounds.xy * textureSizeMultiplier,
+ textureBounds.zw * textureSizeMultiplier);
+ gl_Position = mvp * vec4(vCoord, 1.0);
+}
diff --git a/res/effectlib/effect.glsllib b/res/effectlib/effect.glsllib
new file mode 100644
index 0000000..802a846
--- /dev/null
+++ b/res/effectlib/effect.glsllib
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EFFECT_GLSLLIB
+#define EFFECT_GLSLLIB 1
+
+//Defines used in the effect files.
+
+vec4 GetTextureValue( sampler2D sampler, vec2 inUVCoords, float inTextureAlphaInfo )
+{
+ vec4 c = texture2D(sampler, inUVCoords);
+ c.rgb = mix( c.rgb*c.a, c.rgb, inTextureAlphaInfo );
+ return c;
+}
+
+vec4 GetTextureValuePreMult( sampler2D sampler, vec2 inUVCoords )
+{
+ return texture2D(sampler, inUVCoords);
+}
+
+#define SNAPPER_TITLE( title )
+
+#define SNAPPER_PARAMETER(propName, datatype, rangeMin, rangeMax, propNiceName, defaultValue) datatype propName
+
+#define SNAPPER_ANGLE( propName, propNiceName, defaultValueAsFloat ) uniform float propName;
+#define SNAPPER_CHECKBOX(propName, propNiceName, defaultValue) uniform float propName;
+
+#define SNAPPER_ENUM_BEGIN(propName, propNiceName, defaultValueAsIndex) uniform int propName;
+#define SNAPPER_ENUM_VALUE(valueNiceName)
+#define SNAPPER_ENUM_END()
+
+#define SNAPPER_POINT2(propName, propNiceName, defaultValue) uniform vec2 propName;
+#define SNAPPER_COLOR(propName, propNiceName, defaultValue) uniform vec3 propName;
+
+
+#define TEXTURE_LOOKUP_FUNC(name) \
+
+
+//texType = one of: ubyte, ushort, float
+//texFormat = one of: rgb, rgba, lum, lum_alpha
+//texFilter = one of: nearest, linear
+//texWrap = one of: repeat, clamp
+#define SNAPPER_EXTERNAL_PARAMETER(propName, datatype, rangeMin, rangeMax, propNiceName, defaultValue)
+#define SNAPPER_EXTERNAL_ANGLE(propName, propNiceName, defaultValueAsFloat)
+
+// Provide the ability to render outside a effect boundary.
+// Total size = The original effect size * Overrendering value
+// Overrendering value needs to be >= 1.0
+#define SNAPPER_OVERRENDERING(value) const float OverrenderingValue = value;
+
+
+
+#ifdef VERTEX_SHADER
+// Attributes and uniforms used throughout the system.
+attribute vec3 attr_pos;
+attribute vec2 attr_uv;
+#endif
+
+uniform mat4 ModelViewProjectionMatrix;
+//x holds the texture width, y holds the texture height
+//z holds 0,1 value if it should be premultiplied
+uniform vec4 Texture0Info;
+uniform vec2 DestSize; //size of the destination in pixels including overrendering if specified.
+uniform sampler2D Texture0;
+varying vec2 TexCoord;
+uniform vec2 FragColorAlphaSettings; //x > 0.0 premultiply result, y is an alpha multiplier (opacity setting)
+
+vec4 Transform( mat4 ModelViewProjectionMatrix, vec2 inDestSize, vec4 inVertex )
+{
+ vec4 temp = ModelViewProjectionMatrix * vec4( inDestSize.x * .5 * inVertex.x, inDestSize.y * .5 * inVertex.y, inVertex.z, inVertex.w );
+ return temp;
+}
+////////////////////////////////////////////////////////////
+// provide the texture lookup functions for the default
+// texture (Texture0).
+vec4 texture2D_0(vec2 uv)
+{
+ return GetTextureValue( Texture0, uv, Texture0Info.z );
+}
+
+#ifdef FRAGMENT_SHADER
+////////////////////////////////////////////////////////////
+// the functions to set the final frag result.
+void colorOutput(vec4 c)
+{
+ c *= FragColorAlphaSettings.x;
+ gl_FragColor = clamp(c, 0.0, c.a );
+}
+
+#endif
+
+
+
+////////////////////////////////////////////////////////////
+// define the main functions.
+
+#ifdef VERTEX_SHADER
+#ifndef NO_VERT_MAIN
+
+void vert();
+void main()
+{
+ gl_Position = Transform( ModelViewProjectionMatrix, DestSize, vec4(attr_pos, 1.0) );
+ TexCoord = attr_uv;
+ vert();
+}
+
+#endif
+#endif
+
+#ifdef FRAGMENT_SHADER
+#ifndef NO_FRAG_MAIN
+void frag();
+void main()
+{
+ frag();
+}
+#endif // NO_FRAG_MAIN
+#endif // FRAGMENT_SHADER
+
+#endif // EFFECT_GLSLLIB
diff --git a/res/effectlib/evalBakedShadowMap.glsllib b/res/effectlib/evalBakedShadowMap.glsllib
new file mode 100644
index 0000000..a283d8a
--- /dev/null
+++ b/res/effectlib/evalBakedShadowMap.glsllib
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 evalBakedShadowMap( in vec3 inCoords )
+{
+ vec4 shadowCol = (uShadowMappingEnabled) ? texture( uBakedShadowTexture, inCoords.xy ) : vec4( 1.0, 1.0, 1.0, 1.0 );
+
+ return shadowCol;
+}
diff --git a/res/effectlib/evalEnvironmentMap.glsllib b/res/effectlib/evalEnvironmentMap.glsllib
new file mode 100644
index 0000000..18431c7
--- /dev/null
+++ b/res/effectlib/evalEnvironmentMap.glsllib
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec3 evalEnvironmentMap( in vec3 R, float roughness )
+{
+ // convert R to spherical texture coordinates
+ vec2 tc = vec2( ( atan( R.x, -R.z ) + PI ) / ( PI_TWO ), acos( -R.y ) / PI );
+
+ vec2 envMapSize = vec2( textureSize( uEnvironmentTexture, 0 ) );
+ float envMapLevels = log2( max( envMapSize.x, envMapSize.y ) );
+
+ // simulate textureQueryLod
+ vec2 dx = dFdx( tc * envMapSize.x );
+ vec2 dy = dFdy( tc * envMapSize.y );
+
+ float px = dot( dx, dx );
+ float py = dot( dy, dy );
+
+ float maxlod = 0.5 * log2( max( px, py ) ); // log2(sqrt()) = 0.5*log2()
+ float minlod = 0.5 * log2( min( px, py ) );
+
+ //float lod = max(0.0, maxlod - min( maxlod - minlod, envMapLevels ));
+ float lod = max(0.0, min( minlod, envMapLevels ));
+
+ float roughLevel = mix( lod , envMapLevels, roughness );
+
+ return( textureLod( uEnvironmentTexture, tc, roughLevel ).rgb );
+}
diff --git a/res/effectlib/evalLightmaps.glsllib b/res/effectlib/evalLightmaps.glsllib
new file mode 100644
index 0000000..1a9bc99
--- /dev/null
+++ b/res/effectlib/evalLightmaps.glsllib
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 evalLightmap( in sampler2D sampler, in vec3 inCoords, in vec4 rotScale, in vec3 offset )
+{
+ vec3 uTransform = vec3(rotScale.x, rotScale.y, offset.x);
+ vec3 vTransform = vec3(rotScale.z, rotScale.w, offset.y);
+
+ vec2 transfCoord = vec2( dot( uTransform, inCoords ), dot( vTransform, inCoords ) );
+
+ vec4 value = texture( sampler, transfCoord.xy);
+
+ return value;
+}
+
+vec4 evalIndirectLightmap( in sampler2D sampler, in vec3 inCoords, in vec4 rotScale, in vec3 offset )
+{
+ return evalLightmap( sampler, inCoords, rotScale, offset );
+}
+
+vec4 evalRadiosityLightmap( in sampler2D sampler, in vec3 inCoords, in vec4 rotScale, in vec3 offset )
+{
+ return evalLightmap( sampler, inCoords, rotScale, offset );
+}
+
+vec4 evalShadowLightmap( in sampler2D sampler, in vec3 inCoords, in vec4 rotScale, in vec3 offset )
+{
+ return evalLightmap( sampler, inCoords, rotScale, offset );
+} \ No newline at end of file
diff --git a/res/effectlib/fileBumpTexture.glsllib b/res/effectlib/fileBumpTexture.glsllib
new file mode 100644
index 0000000..d0129a8
--- /dev/null
+++ b/res/effectlib/fileBumpTexture.glsllib
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FILE_BUMP_TEXTURE_GLSLLIB
+#define FILE_BUMP_TEXTURE_GLSLLIB
+
+#ifdef QT3DS_DEFINE_API
+
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#include "rotationTranslationScale.glsllib"
+#include "transformCoordinate.glsllib"
+
+#endif
+
+// compute a normal based on a heightfield style bump texture
+// example call:
+// fileBumpTexture(bump_texture, bump_amount, mono_average
+// , transformCoordinate(
+// rotationTranslationScale(
+// vec3( 0.000000, 0.000000, 0.000000 )
+// , vec3( 0.000000, 0.000000, 0.000000 )
+// , vec3( texture_tiling[0], texture_tiling[1], 1.000000 ) )
+// , textureCoordinateInfo( texCoord0, tangent, binormal ) )
+// , vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 )
+// , wrap_repeat, wrap_repeat, normal );
+
+
+
+vec3 fileBumpTexture( in sampler2D sampler, in float factor, in int bumpSource
+ , in texture_coordinate_info uvw
+ , in vec2 cropU, in vec2 cropV
+ , in int wrapU, in int wrapV, in vec3 normal )
+{
+ vec2 bumpMapSize = vec2( textureSize( sampler, 0 ) );
+ float bumpMapLevels = log2( max( bumpMapSize.x, bumpMapSize.y ) );
+ // simulate textureQueryLod
+ vec2 dx = dFdx( uvw.position.xy * bumpMapSize.x );
+ vec2 dy = dFdy( uvw.position.xy * bumpMapSize.y );
+
+ float px = dot( dx, dx );
+ float py = dot( dy, dy );
+
+ float maxlod = 0.5 * log2( max( px, py ) ); // log2(sqrt()) = 0.5*log2()
+ float minlod = 0.5 * log2( min( px, py ) );
+
+ float lod = max(0.0, min( maxlod, bumpMapLevels ));
+
+ // invert factor
+ float invFactor = -factor;
+
+ // currently no lod supported we use 3.3 GL
+ //float lod = textureQueryLod( sampler, uvw.position.xy ).x;
+ vec2 size = mix( vec2( textureSize( sampler, int( floor( lod ) ) ) ), vec2( textureSize( sampler, int( ceil( lod ) ) ) ), fract( lod ) );
+ vec2 unitStep = 1.0 / size;
+
+ // Add an inveres scale to keep the original gradient values
+ // this makes the bumps a lot smoother.
+ // Or we could do it like in iRay and sample always at original size.
+ // But this makes me feel better.
+ vec2 scale = size / bumpMapSize;
+
+ float du = monoChannel( textureLod( sampler, vec2( uvw.position.x + unitStep.x, uvw.position.y ), lod ), bumpSource )
+ - monoChannel( textureLod( sampler, vec2( uvw.position.x, uvw.position.y ), lod ), bumpSource );
+ float dv = monoChannel( textureLod( sampler, vec2( uvw.position.x, uvw.position.y + unitStep.y ), lod ), bumpSource )
+ - monoChannel( textureLod( sampler, vec2( uvw.position.x, uvw.position.y ), lod ), bumpSource );
+
+
+ vec3 n = normalize(vec3(invFactor * scale.x * du, invFactor * scale.x * dv, 1.0));
+ n = n.x*uvw.tangent_u + n.y*uvw.tangent_v + n.z*normal;
+ return normalize(normal + n);
+}
+
+#include "textureCoordinateInfo.glsllib"
+
+//Simpler version built to run from UIC image data
+//In our case, we have already generated the texture coordinate x,y position
+//TODO - figure out if we need to manipulate tangent_u, tangent_v.
+vec3 simplerFileBumpTexture( in sampler2D sampler, in float factor, vec2 texCoord, vec3 tangent, vec3 binormal, vec3 normal )
+{
+ return fileBumpTexture( sampler, factor, mono_average
+ , textureCoordinateInfo( vec3( texCoord.x, texCoord.y, 0.0 ), tangent, binormal )
+ , vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 )
+ , wrap_repeat, wrap_repeat, normal );
+}
+
+
+#endif
diff --git a/res/effectlib/fileDisplacementTexture.glsllib b/res/effectlib/fileDisplacementTexture.glsllib
new file mode 100644
index 0000000..a38d701
--- /dev/null
+++ b/res/effectlib/fileDisplacementTexture.glsllib
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FILE_DISPLACEMENT_TEXTURE_GLSLLIB
+#define FILE_DISPLACEMENT_TEXTURE_GLSLLIB
+
+#ifdef QT3DS_DEFINE_API
+
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#include "rotationTranslationScale.glsllib"
+#include "transformCoordinate.glsllib"
+
+#endif
+
+
+vec3 fileDisplacementTexture( in sampler2D sampler, in float factor, in int displaceSource
+ , in texture_coordinate_info uvw, in vec3 normal, in vec3 pos )
+{
+ // compute displace factor
+ float df = monoChannel( texture( sampler, uvw.position.xy ), displaceSource );
+
+ return( normal * df * factor + pos );
+}
+
+
+//default material path version
+vec3 defaultMaterialFileDisplacementTexture( in sampler2D sampler, in float factor, vec2 texCoord, in vec3 normal, vec3 pos )
+{
+ return fileDisplacementTexture( sampler, factor, mono_luminance
+ , textureCoordinateInfo( vec3( texCoord.x, texCoord.y, 0.0 ), vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0) )
+ , normal, pos );
+}
+
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/fileTexture.glsllib b/res/effectlib/fileTexture.glsllib
new file mode 100644
index 0000000..6b9f6ab
--- /dev/null
+++ b/res/effectlib/fileTexture.glsllib
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+texture_return fileTexture( in sampler2D sampler, in vec3 colorOffset, in vec3 colorScale, in int monoSource, in texture_coordinate_info uvw
+ , in vec2 cropU, in vec2 cropV, in int wrapU, in int wrapV, in int gammaMode )
+{
+ vec4 t4 = texture( sampler, uvw.position.xy );
+ vec3 t3 = colorOffset + colorScale * t4.xyz;
+
+ // When we want to operate in linear color space uncomment the lines
+ if ( gammaMode == gamma_srgb )
+ {
+ t3 = pow( t3, vec3( 2.2 ) );
+ }
+
+ texture_return tr;
+ tr.tint = t3;
+ tr.mono = monoChannel( vec4( t3, t4.w ), monoSource );
+ return( tr );
+}
+
diff --git a/res/effectlib/flakeNoiseBumpTexture.glsllib b/res/effectlib/flakeNoiseBumpTexture.glsllib
new file mode 100644
index 0000000..e8e427c
--- /dev/null
+++ b/res/effectlib/flakeNoiseBumpTexture.glsllib
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec3 flakeNoiseBumpTexture( in texture_coordinate_info uvw, in float scale, in float strength, in vec3 normal )
+{
+ vec3 tex = uvw.position / scale;
+ vec3 grad = miNoise( tex ).xyz;
+
+ // displace coordinate according to noise value
+ tex += 2.0 * grad;
+
+ // then use only integer coordinates, to make flakes transients harder and not wobbly
+ grad = miNoise( round( tex ) ).xyz;
+
+ vec3 n = normalize(vec3(strength * grad.x, strength * grad.y, 1.0));
+ n = n.x*uvw.tangent_u + n.y*uvw.tangent_v + n.z*normal;
+ return normalize(normal + n);
+}
+
diff --git a/res/effectlib/flakeNoiseTexture.glsllib b/res/effectlib/flakeNoiseTexture.glsllib
new file mode 100644
index 0000000..92f15d3
--- /dev/null
+++ b/res/effectlib/flakeNoiseTexture.glsllib
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+texture_return flakeNoiseTexture( in texture_coordinate_info uvw, in float intensity, in float scale, in float density )
+{
+ vec3 tex = uvw.position / scale;
+ vec3 grad = miNoise( tex ).xyz;
+
+ // displace coordinate according to noise value
+ tex += 2.0 * grad;
+
+ // then use only integer coordinates, to make flakes transients harder and not wobbly
+ vec4 noise = miNoise( floor( tex ) );
+ float s = pow( noise.w, 1.0 / density ) * intensity;
+
+ texture_return tr;
+ tr.tint = vec3( noise.x, noise.y, noise.z );
+ tr.mono = clamp(s, 0.0, 1.0);
+ return( tr );
+}
+
+
+texture_return flakeNoiseAndBumpTexture( in texture_coordinate_info uvw, in float scale, in float intensity, in float density, float strength, in vec3 normal )
+{
+ vec3 tex = uvw.position / scale;
+ vec3 grad = miNoise( tex ).xyz;
+
+ // displace coordinate according to noise value
+ tex += 2.0 * grad;
+
+ // then use only integer coordinates, to make flakes transients harder and not wobbly
+ vec4 noise = miNoise( round( tex ) );
+ float s = pow( noise.w, 1.0 / density ) * intensity;
+
+ texture_return tr;
+ tr.tint = normalize( normal/strength + ( uvw.tangent_u * grad.x + uvw.tangent_v * grad.y + normal * abs( grad.z ) ) );
+ tr.mono = s;
+ return( tr );
+}
diff --git a/res/effectlib/fresnelLayer.glsllib b/res/effectlib/fresnelLayer.glsllib
new file mode 100644
index 0000000..60d7176
--- /dev/null
+++ b/res/effectlib/fresnelLayer.glsllib
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+float simpleFresnel( in vec3 N, in float ior, float fresnelPower )
+{
+ float F = ((1.0-ior) * (1.0-ior)) / ((1.0+ior) * (1.0+ior));
+ float fresnelGlancingAngle = clamp( 1.0 - dot(viewDir, N), 0.0, 1.0 );
+ float ratio = F + (1.0 - F) * pow(fresnelGlancingAngle, fresnelPower);
+
+ return ratio;
+}
+
+// PKC : A variation on the simple Schlick approach that also handles the characteristic
+// "dip" that metals exhibit. The dip is very mild or virtually nonexisting in dielectrics,
+// but shows up in metals because of their strong incident reflectivity, and also allows for
+// colored metals like gold or copper to show their Fresnel hue shift as well because certain
+// components will have different baseline responses.
+vec3 pseudoFresnel( in vec3 N, in vec3 ior, float fresnelPower )
+{
+ vec3 F0 = ((vec3(1.0)-ior) * (vec3(1.0)-ior)) / ((vec3(1.0)+ior) * (vec3(1.0)+ior));
+
+ float fresnelGlancingAngle = clamp( 1.0 - dot(viewDir, N), 0.0, 1.0 );
+
+ float fresCurve = pow(fresnelGlancingAngle, fresnelPower);
+ vec3 dipCurve = F0 * sin( 3.1415926535 * fresCurve ) * 0.31830988618;
+
+ vec3 retCol = (vec3(1.0) - F0) * fresCurve;
+ retCol += F0 - dipCurve;
+ return clamp(retCol, 0.0, 1.0);
+}
+
+// look here: http://en.wikipedia.org/wiki/Fresnel_equations
+float fresnel( in float eta1, in float eta2, in float cosTheta1 )
+{
+ float etaInv = eta1 / eta2;
+ float cosTheta2 = 1.0 - ( 1.0 - cosTheta1 * cosTheta1 ) * ( etaInv * etaInv );
+ if ( 0.0 <= cosTheta2 )
+ {
+ cosTheta2 = sqrt( cosTheta2 );
+ float n1t1 = eta1 * cosTheta1;
+ float n1t2 = eta1 * cosTheta2;
+ float n2t1 = eta2 * cosTheta1;
+ float n2t2 = eta2 * cosTheta2;
+ float rs = ( n1t1 - n2t2 ) / ( n1t1 + n2t2 );
+ float rp = ( n1t2 - n2t1 ) / ( n1t2 + n2t1 );
+ float f = 0.5 * ( rs * rs + rp * rp );
+ return( clamp( f, 0.0, 1.0 ) );
+ }
+ else
+ {
+ return( 1.0 );
+ }
+}
+
+// we assume, light rays run through air with ior == 1.0
+// with eta = eta2 / eta1, we have
+// - when hitting a front face: eta2 == ior, eta1 == 1.0 => eta = ior
+// - when hitting a back face : eta2 == 1.0, eta1 == ior => eta = 1.0 / ior
+vec3 fresnel( in vec3 N, in vec3 ior )
+{
+ float cosTheta1 = dot( N, viewDir );
+ if ( gl_FrontFacing )
+ {
+ return( vec3( fresnel( 1.0, ior[0], cosTheta1 ), fresnel( 1.0, ior[1], cosTheta1 ), fresnel( 1.0, ior[2], cosTheta1 ) ) );
+ }
+ else
+ {
+ return( vec3( fresnel( ior[0], 1.0, cosTheta1 ), fresnel( ior[1], 1.0, cosTheta1 ), fresnel( ior[2], 1.0, cosTheta1 ) ) );
+ }
+}
+
+vec4 fresnelLayer( in vec3 N, in vec3 ior, in float weight, in vec3 layercolor, in vec4 layer, in vec4 base, in float alpha )
+{
+ vec3 refl = reflect( -viewDir, N );
+ float reflWt = clamp( dot( surfNormal, refl ) + 1.0, 0.0, 1.0 );
+
+ vec3 fresColor = reflWt * weight * layercolor * pseudoFresnel( N, ior, 5.0 );
+
+ return( vec4( mix( base.rgb, layer.rgb, fresColor ), mix(alpha, 1.0, luminance(fresColor)) ) );
+}
+
diff --git a/res/effectlib/funcareaLightVars.glsllib b/res/effectlib/funcareaLightVars.glsllib
new file mode 100644
index 0000000..7505b34
--- /dev/null
+++ b/res/effectlib/funcareaLightVars.glsllib
@@ -0,0 +1,32 @@
+#define MAX_AREA_LIGHTS 16
+
+// note this struct must exactly match the memory layout of the
+// struct SLightSourceShader in the source code. If you make changes here you need
+// to adjust the struct SLightSourceShader as well
+struct AreaLight
+{
+ vec4 position;
+ vec4 direction; // Specifies the light direction in world coordinates.
+ vec4 up;
+ vec4 right;
+ vec4 diffuse;
+ vec4 ambient;
+ vec4 specular;
+ float spotExponent; // Specifies the intensity distribution of the light.
+ float spotCutoff; // Specifies the maximum spread angle of the light.
+ float constantAttenuation; // Specifies the constant light attenuation factor.
+ float linearAttenuation; // Specifies the linear light attenuation factor.
+ float quadraticAttenuation; // Specifies the quadratic light attenuation factor.
+ float range; // Specifies the maximum distance of the light influence
+ float width; // Specifies the width of the area light surface.
+ float height; // Specifies the height of the area light surface;
+ vec4 shadowControls;
+ mat4 shadowView;
+ int shadowIdx;
+};
+
+layout (std140) uniform cbBufferAreaLights
+{
+ int uNumAreaLights;
+ AreaLight arealights[MAX_AREA_LIGHTS];
+};
diff --git a/res/effectlib/funccalculateDiffuseAreaOld.glsllib b/res/effectlib/funccalculateDiffuseAreaOld.glsllib
new file mode 100644
index 0000000..fc37390
--- /dev/null
+++ b/res/effectlib/funccalculateDiffuseAreaOld.glsllib
@@ -0,0 +1,29 @@
+float calculateDiffuseAreaOld(in vec3 lightDir, in vec3 lightPos, in vec4 lightUp,
+ in vec4 lightRt, in vec3 worldPos, out vec3 outDir)
+{
+ if ( dot( worldPos-lightPos, lightDir) < 0.0 )
+ return 0.0;
+
+ vec3 v0 = lightPos - (lightRt.xyz * lightRt.w * 0.5) - (lightUp.xyz * lightUp.w * 0.5);
+ vec3 v1 = lightPos - (lightRt.xyz * lightRt.w * 0.5) + (lightUp.xyz * lightUp.w * 0.5);
+ vec3 v2 = lightPos + (lightRt.xyz * lightRt.w * 0.5) + (lightUp.xyz * lightUp.w * 0.5);
+ vec3 v3 = lightPos + (lightRt.xyz * lightRt.w * 0.5) - (lightUp.xyz * lightUp.w * 0.5);
+ v0 = normalize( v0 - worldPos ); v1 = normalize( v1 - worldPos );
+ v2 = normalize( v2 - worldPos ); v3 = normalize( v3 - worldPos );
+
+ float a01 = acos( clamp( dot(v0, v1), -1.0, 1.0 ) );
+ float a12 = acos( clamp( dot(v1, v2), -1.0, 1.0 ) );
+ float a23 = acos( clamp( dot(v2, v3), -1.0, 1.0 ) );
+ float a30 = acos( clamp( dot(v3, v0), -1.0, 1.0 ) );
+
+ outDir = vec3( 0.0 );
+ outDir -= normalize(cross( v0, v1 )) * a01;
+ outDir -= normalize(cross( v1, v2 )) * a12;
+ outDir -= normalize(cross( v2, v3 )) * a23;
+ outDir -= normalize(cross( v3, v0 )) * a30;
+
+ float retVal = length(outDir) * 0.15915494309; // solid angle / 2*pi
+ outDir = normalize(outDir);
+ retVal *= clamp( dot( worldPos-lightPos, lightDir), 0.0, 1.0 );
+ return retVal;
+}
diff --git a/res/effectlib/funccalculatePointLightAttenuation.glsllib b/res/effectlib/funccalculatePointLightAttenuation.glsllib
new file mode 100644
index 0000000..5f42162
--- /dev/null
+++ b/res/effectlib/funccalculatePointLightAttenuation.glsllib
@@ -0,0 +1,4 @@
+float calculatePointLightAttenuation(vec3 attenuationConstants, float lightDistance ) {
+ return 1.0 / (attenuationConstants.x + attenuationConstants.y * lightDistance
+ + attenuationConstants.z * lightDistance * lightDistance);
+}
diff --git a/res/effectlib/funccomputeMicroHit.glsllib b/res/effectlib/funccomputeMicroHit.glsllib
new file mode 100644
index 0000000..7c52691
--- /dev/null
+++ b/res/effectlib/funccomputeMicroHit.glsllib
@@ -0,0 +1,50 @@
+bool rayToLightUV( in vec3 pos, in mat3 lightFrame, in vec3 lightPos, in float width, in float height, in vec3 rayDir, out vec2 uv )
+{
+ float d0 = dot( lightPos, lightFrame[2] );
+ float d1 = dot( pos, lightFrame[2] );
+ float fac = dot( rayDir, lightFrame[2] );
+
+ if ((d0 < d1) || ( fac < 0.001 ))
+ {
+ uv = vec2(-1.0);
+ return false;
+ }
+
+ float t = (d0 - d1) / fac;
+ vec3 hitPos = pos + t * rayDir;
+ width *= dot(lightFrame[0], lightFrame[0]);
+ height *= dot(lightFrame[1], lightFrame[1]);
+
+ hitPos -= lightPos;
+ uv.x = ( dot(hitPos, lightFrame[0]) / width ) + 0.5;
+ uv.y = ( dot(hitPos, lightFrame[1]) / height ) + 0.5;
+ return true;
+}
+
+float computeMicroHit( in vec3 pos, in mat3 tanFrame, in vec3 lightPos, in mat3 lightFrame, in float width, in float height, in vec3 viewDir, out vec2 UV[5] )
+{
+ vec3 rayDir = reflect( -viewDir, tanFrame[2] );
+ vec2 ctrUV;
+ bool isHit = rayToLightUV( pos, lightFrame, lightPos, width, height, rayDir, ctrUV );
+ if ((!isHit) || ( dot(rayDir, tanFrame[2]) < 0.001 )) { return 0.0; }
+
+ vec3 H0 = 0.99749686716 * tanFrame[2] + 0.005 * tanFrame[0];
+ vec3 H1 = 0.99749686716 * tanFrame[2] - 0.005 * tanFrame[0];
+ vec3 H2 = 0.99749686716 * tanFrame[2] + 0.005 * tanFrame[1];
+ vec3 H3 = 0.99749686716 * tanFrame[2] - 0.005 * tanFrame[1];
+
+ vec3 R[4];
+ R[0] = reflect( -viewDir, H0 );
+ R[1] = reflect( -viewDir, H1 );
+ R[2] = reflect( -viewDir, H2 );
+ R[3] = reflect( -viewDir, H3 );
+
+ rayToLightUV( pos, lightFrame, lightPos, width, height, R[0], UV[0] );
+ rayToLightUV( pos, lightFrame, lightPos, width, height, R[1], UV[1] );
+ rayToLightUV( pos, lightFrame, lightPos, width, height, R[2], UV[2] );
+ rayToLightUV( pos, lightFrame, lightPos, width, height, R[3], UV[3] );
+
+ UV[4] = ctrUV;
+
+ return clamp( dot(rayDir, tanFrame[2]), 0.0, 1.0 );
+}
diff --git a/res/effectlib/funcdiffuseReflectionBSDF.glsllib b/res/effectlib/funcdiffuseReflectionBSDF.glsllib
new file mode 100644
index 0000000..bda0ea6
--- /dev/null
+++ b/res/effectlib/funcdiffuseReflectionBSDF.glsllib
@@ -0,0 +1,43 @@
+#ifndef PI
+#define PI 3.14159265358979
+#define PI_SQUARE ( PI * PI )
+#endif
+
+vec4 diffuseReflectionBSDF(in vec3 N, in vec3 L, in vec3 viewDir,
+ in vec3 lightDiffuse, in float roughness)
+{
+ float cosThetaI = max( 0.0, dot( N, L ) );
+ float factor = cosThetaI;
+ if ( ( 0.0 < factor ) && ( 0.0 < roughness ) )
+ {
+ // see http://en.wikipedia.org/wiki/Oren%E2%80%93Nayar_reflectance_model
+ float sigmaSquare = 0.25 * PI_SQUARE * roughness * roughness;
+ float A = 1.0 - 0.5 * sigmaSquare / ( sigmaSquare + 0.33 );
+ float B = 0.45 * sigmaSquare / ( sigmaSquare + 0.09 );
+
+ // project L and viewDir on surface to get the azimuthal angle between them
+ // as we don't really need the projections, but the angle between them,
+ // it's enough to just use the cross instead
+ vec3 pl = normalize( cross( L, N ) );
+ vec3 pv = normalize( cross( viewDir, N ) );
+ float cosPhi = max( 0.0, dot( pl, pv ) );
+
+ float sinAlpha, tanBeta;
+ float cosThetaO = max( 0.0, dot( N, viewDir ) );
+ float sinThetaI = sqrt( max( 0.0, 1.0 - cosThetaI * cosThetaI ) );
+ float sinThetaO = sqrt( max( 0.0, 1.0 - cosThetaO * cosThetaO ) );
+ if ( cosThetaI < cosThetaO )
+ { // -> thetaO < thetaI
+ sinAlpha = sinThetaI;
+ tanBeta = sinThetaO / cosThetaO;
+ }
+ else
+ {
+ sinAlpha = sinThetaO;
+ tanBeta = sinThetaI / cosThetaI;
+ }
+
+ factor *= A + B * cosPhi * sinAlpha * tanBeta;
+ }
+ return( vec4( factor * lightDiffuse, 1.0 ) );
+}
diff --git a/res/effectlib/funcdiffuseReflectionWrapBSDF.glsllib b/res/effectlib/funcdiffuseReflectionWrapBSDF.glsllib
new file mode 100644
index 0000000..9afc58b
--- /dev/null
+++ b/res/effectlib/funcdiffuseReflectionWrapBSDF.glsllib
@@ -0,0 +1,5 @@
+vec4 diffuseReflectionWrapBSDF(vec3 normalDir, in vec3 L, in vec3 lightDiffuse, float wrap)
+{
+ float I = max( 0.0, ((dot(L, normalDir) + wrap)/ (1.0 + wrap)) ); //diffuseIntensity
+ return vec4( I * lightDiffuse, 1.0 );
+}
diff --git a/res/effectlib/funcgetTransformedUVCoords.glsllib b/res/effectlib/funcgetTransformedUVCoords.glsllib
new file mode 100644
index 0000000..9b14a28
--- /dev/null
+++ b/res/effectlib/funcgetTransformedUVCoords.glsllib
@@ -0,0 +1,4 @@
+vec2 getTransformedUVCoords( vec3 inCoords, vec3 inUTransform, vec3 inVTransform )
+{
+ return vec2( dot( inUTransform, inCoords ), dot( inVTransform, inCoords ) );
+}
diff --git a/res/effectlib/funcsampleAreaGlossyDefault.glsllib b/res/effectlib/funcsampleAreaGlossyDefault.glsllib
new file mode 100644
index 0000000..cb9cba1
--- /dev/null
+++ b/res/effectlib/funcsampleAreaGlossyDefault.glsllib
@@ -0,0 +1,42 @@
+#include "funccomputeMicroHit.glsllib"
+
+vec3 sampleAreaGlossyDefault( in mat3 tanFrame, in vec3 pos, in mat3 lightFrame, in vec3 lightPos, in float width, in float height, in vec3 viewDir, in float roughU, in float roughV )
+{
+ float sigmaU = clamp( 0.5 * roughU, 0.005, 0.5 );
+ float sigmaV = clamp( 0.5 * roughV, 0.005, 0.5 );
+ vec2 UVset[5];
+
+ float thetaI = acos( dot(viewDir, lightFrame[2]) );
+ vec2 minMaxThetaH = vec2( (thetaI - 1.5707) * 0.5,
+ (thetaI + 1.5707) * 0.5 );
+ vec4 sinCosThetaH = vec4( abs(sin(minMaxThetaH)), abs(cos(minMaxThetaH)) );
+
+ // First thing we do is compute a small-scale version of the ray hit for a very tiny roughness
+ // then we scale that up based on the _actual_ roughness.
+ float wt = computeMicroHit( pos, tanFrame, lightPos, lightFrame, width, height, viewDir, UVset );
+
+ UVset[0] -= UVset[4]; UVset[1] -= UVset[4];
+ UVset[2] -= UVset[4]; UVset[3] -= UVset[4];
+
+ UVset[0] *= mix(1.0, sinCosThetaH.y / 0.005, sigmaU); UVset[1] *= mix(1.0, sinCosThetaH.x / 0.005, sigmaU);
+ UVset[2] *= mix(1.0, sinCosThetaH.y / 0.005, sigmaV); UVset[3] *= mix(1.0, sinCosThetaH.x / 0.005, sigmaV);
+
+ UVset[0] += UVset[4]; UVset[1] += UVset[4];
+ UVset[2] += UVset[4]; UVset[3] += UVset[4];
+
+ vec2 UVmin = UVset[4], UVmax = UVset[4];
+ vec2 cminUV, cmaxUV;
+ UVmin = min(UVmin, UVset[0]); UVmax = max(UVmax, UVset[0]);
+ UVmin = min(UVmin, UVset[1]); UVmax = max(UVmax, UVset[1]);
+ UVmin = min(UVmin, UVset[2]); UVmax = max(UVmax, UVset[2]);
+ UVmin = min(UVmin, UVset[3]); UVmax = max(UVmax, UVset[3]);
+
+ cminUV = clamp( UVmin, vec2(0.0), vec2(1.0) );
+ cmaxUV = clamp( UVmax, vec2(0.0), vec2(1.0) );
+
+ vec2 hitScale = (cmaxUV - cminUV);
+ vec2 fullScale = (UVmax - UVmin);
+ float intensity = ( hitScale.x * hitScale.y ) / max( fullScale.x * fullScale.y, 0.0001 );
+
+ return vec3( wt * intensity );
+}
diff --git a/res/effectlib/funcsampleLightVars.glsllib b/res/effectlib/funcsampleLightVars.glsllib
new file mode 100644
index 0000000..85ca144
--- /dev/null
+++ b/res/effectlib/funcsampleLightVars.glsllib
@@ -0,0 +1,29 @@
+#define MAX_NUM_LIGHTS 16
+
+struct LightSource
+{
+ vec4 position;
+ vec4 direction; // Specifies the light direction in world coordinates.
+ vec4 up;
+ vec4 right;
+ vec4 diffuse;
+ vec4 ambient;
+ vec4 specular;
+ float spotExponent; // Specifies the intensity distribution of the light.
+ float spotCutoff; // Specifies the maximum spread angle of the light.
+ float constantAttenuation; // Specifies the constant light attenuation factor.
+ float linearAttenuation; // Specifies the linear light attenuation factor.
+ float quadraticAttenuation; // Specifies the quadratic light attenuation factor.
+ float range; // Specifies the maximum distance of the light influence
+ float width; // Specifies the width of the area light surface.
+ float height; // Specifies the height of the area light surface;
+ vec4 shadowControls;
+ mat4 shadowView;
+ int shadowIdx;
+};
+
+layout (std140) uniform cbBufferLights
+{
+ int uNumLights;
+ LightSource lights[MAX_NUM_LIGHTS];
+};
diff --git a/res/effectlib/funcspecularBSDF.glsllib b/res/effectlib/funcspecularBSDF.glsllib
new file mode 100644
index 0000000..e9450bf
--- /dev/null
+++ b/res/effectlib/funcspecularBSDF.glsllib
@@ -0,0 +1,42 @@
+#include "luminance.glsllib"
+
+#ifndef scatter_reflect
+#define scatter_reflect 0
+#define scatter_transmit 1
+#define scatter_reflect_transmit 2
+#endif
+
+vec4 specularBSDF(in vec3 N, in vec3 L, in vec3 viewDir, in vec3 lightSpecular,
+ in float ior, in float shininess, in vec3 tint, int mode)
+{
+ vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 );
+ float cosTheta = dot( N, L );
+ if ( 0.0 < cosTheta )
+ {
+ if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) )
+ {
+ vec3 R = reflect( -L, N );
+ float cosAlpha = max( 0.0, dot( R, viewDir ) );
+ float shine = pow( cosAlpha, shininess );
+ rgba.rgb = shine * lightSpecular;
+ }
+ }
+ if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) )
+ {
+ // check against total reflection
+ vec3 R = refract( -viewDir, N, ior );
+ if ( R == vec3( 0.0, 0.0, 0.0 ) )
+ {
+ rgba.a = 1.0;
+ }
+ else if ( mode == scatter_transmit )
+ {
+ rgba.a = 0.0;
+ }
+ else
+ {
+ rgba.a = 1.0 - luminance( tint );
+ }
+ }
+ return( rgba );
+}
diff --git a/res/effectlib/gles2/SSAOCustomMaterial.glsllib b/res/effectlib/gles2/SSAOCustomMaterial.glsllib
new file mode 100644
index 0000000..ea8d164
--- /dev/null
+++ b/res/effectlib/gles2/SSAOCustomMaterial.glsllib
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SSAO_CUSTOM_MATERIAL_GLSLLIB
+#define SSAO_CUSTOM_MATERIAL_GLSLLIB
+
+#ifndef QT3DS_ENABLE_SSAO
+#define QT3DS_ENABLE_SSAO 0
+#endif
+
+#ifndef QT3DS_ENABLE_SSDO
+#define QT3DS_ENABLE_SSDO 0
+#endif
+
+#if QT3DS_ENABLE_SSAO || QT3DS_ENABLE_SSDO
+
+#include "viewProperties.glsllib"
+#if QT3DS_ENABLE_SSDO
+#include "screenSpaceDO.glsllib"
+
+
+uniform vec4 ao_properties;
+uniform vec4 ao_properties2;
+uniform vec4 shadow_properties;
+uniform vec4 aoScreenConst;
+uniform vec4 UvToEyeConst;
+
+
+uniform sampler2D depth_sampler;
+#endif
+uniform sampler2D ao_sampler;
+uniform vec2 ao_sampler_size;
+
+#endif // QT3DS_ENABLE_SSAO || QT3DS_ENABLE_SSDO
+
+#if QT3DS_ENABLE_SSAO
+
+float customMaterialAO()
+{
+#if QT3DS_ENABLE_SSDO
+ vec2 smpUV = (gl_FragCoord.xy) * aoScreenConst.zw;
+#else
+ vec2 smpUV = gl_FragCoord.xy / ao_sampler_size;
+#endif
+ return texture(ao_sampler, smpUV).x;
+}
+
+#else
+
+float customMaterialAO()
+{
+ return 1.0;
+}
+
+#endif
+
+#if QT3DS_ENABLE_SSDO
+
+float customMaterialShadow( vec3 lightDir, vec3 varWorldPos )
+{
+ return shadowOcclusion( depth_sampler, lightDir, varWorldPos, view_matrix, view_projection_matrix, shadow_properties, camera_properties, aoScreenConst, UvToEyeConst );
+}
+
+#else
+
+float customMaterialShadow( vec3 lightDir, vec3 varWorldPos )
+{
+ return 1.0;
+}
+
+#endif
+
+#endif // #ifndef SSAO_CUSTOM_MATERIAL_GLSLLIB
diff --git a/res/effectlib/gles2/defaultMaterialBumpNoLod.glsllib b/res/effectlib/gles2/defaultMaterialBumpNoLod.glsllib
new file mode 100644
index 0000000..2f3bd15
--- /dev/null
+++ b/res/effectlib/gles2/defaultMaterialBumpNoLod.glsllib
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float calcRGBAvg(in vec4 rgba)
+{
+ return (rgba.r + rgba.g + rgba.b) / 3.0;
+}
+
+vec3 defaultMaterialBumpNoLod(in sampler2D sampler, in float factor,
+ in vec2 texCoord, in vec3 tangent, in vec3 binormal,
+ in vec3 normal, in vec2 bumpSize )
+{
+ // invert factor
+ float invFactor = -factor;
+
+ vec2 unitStep = 1.0 / bumpSize;
+
+ float du = calcRGBAvg(texture2D( sampler, vec2( texCoord.x + unitStep.x, texCoord.y )))
+ - calcRGBAvg(texture2D( sampler, vec2( texCoord.x, texCoord.y )));
+ float dv = calcRGBAvg(texture2D( sampler, vec2( texCoord.x, texCoord.y + unitStep.y )))
+ - calcRGBAvg(texture2D( sampler, vec2( texCoord.x, texCoord.y )));
+
+ vec3 n = normalize(vec3(invFactor * du, invFactor * dv, 1.0));
+ n = n.x * normalize(tangent) + n.y * normalize(binormal) + n.z * normal;
+ return normalize(normal + n);
+}
diff --git a/res/effectlib/gles2/evalEnvironmentMap.glsllib b/res/effectlib/gles2/evalEnvironmentMap.glsllib
new file mode 100644
index 0000000..ac9851e
--- /dev/null
+++ b/res/effectlib/gles2/evalEnvironmentMap.glsllib
@@ -0,0 +1,37 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec3 evalEnvironmentMap( in vec3 R, float roughness )
+{
+ // convert R to spherical texture coordinates
+ vec2 tc = vec2( ( atan( R.x, -R.z ) + PI ) / ( PI_TWO ), acos( -R.y ) / PI );
+
+ return( textureLod( uEnvironmentTexture, tc, 0.0 ).rgb );
+}
diff --git a/res/effectlib/gles2/funcareaLightVars.glsllib b/res/effectlib/gles2/funcareaLightVars.glsllib
new file mode 100644
index 0000000..cdb8c92
--- /dev/null
+++ b/res/effectlib/gles2/funcareaLightVars.glsllib
@@ -0,0 +1,29 @@
+#define MAX_AREA_LIGHTS 16
+
+// note this struct must exactly match the memory layout of the
+// struct SLightSourceShader in the source code. If you make changes here you need
+// to adjust the struct SLightSourceShader as well
+struct AreaLight
+{
+ vec4 position;
+ vec4 direction; // Specifies the light direction in world coordinates.
+ vec4 up;
+ vec4 right;
+ vec4 diffuse;
+ vec4 ambient;
+ vec4 specular;
+ float spotExponent; // Specifies the intensity distribution of the light.
+ float spotCutoff; // Specifies the maximum spread angle of the light.
+ float constantAttenuation; // Specifies the constant light attenuation factor.
+ float linearAttenuation; // Specifies the linear light attenuation factor.
+ float quadraticAttenuation; // Specifies the quadratic light attenuation factor.
+ float range; // Specifies the maximum distance of the light influence
+ float width; // Specifies the width of the area light surface.
+ float height; // Specifies the height of the area light surface;
+ vec4 shadowControls;
+ mat4 shadowView;
+ int shadowIdx;
+};
+
+uniform int uNumAreaLights;
+uniform AreaLight arealights[MAX_AREA_LIGHTS];
diff --git a/res/effectlib/gles2/funcsampleLightVars.glsllib b/res/effectlib/gles2/funcsampleLightVars.glsllib
new file mode 100644
index 0000000..6cb0d83
--- /dev/null
+++ b/res/effectlib/gles2/funcsampleLightVars.glsllib
@@ -0,0 +1,27 @@
+
+#define MAX_NUM_LIGHTS 16
+
+struct LightSource
+{
+ vec4 position;
+ vec4 direction; // Specifies the light direction in world coordinates.
+ vec4 up;
+ vec4 right;
+ vec4 diffuse;
+ vec4 ambient;
+ vec4 specular;
+ float spotExponent; // Specifies the intensity distribution of the light.
+ float spotCutoff; // Specifies the maximum spread angle of the light.
+ float constantAttenuation; // Specifies the constant light attenuation factor.
+ float linearAttenuation; // Specifies the linear light attenuation factor.
+ float quadraticAttenuation; // Specifies the quadratic light attenuation factor.
+ float range; // Specifies the maximum distance of the light influence
+ float width; // Specifies the width of the area light surface.
+ float height; // Specifies the height of the area light surface;
+ vec4 shadowControls;
+ mat4 shadowView;
+ int shadowIdx;
+};
+
+uniform int uNumLights;
+uniform LightSource lights[MAX_NUM_LIGHTS];
diff --git a/res/effectlib/gles2/microfacetBSDF.glsllib b/res/effectlib/gles2/microfacetBSDF.glsllib
new file mode 100644
index 0000000..7173a74
--- /dev/null
+++ b/res/effectlib/gles2/microfacetBSDF.glsllib
@@ -0,0 +1,233 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MICROFACET_BSDF_GLSLLIB
+#define MICROFACET_BSDF_GLSLLIB 1
+
+
+float GtermSchlick( in mat3 tanFrame, in vec3 l, in vec3 v, in float roughness )
+{
+ float NdotV = clamp(dot(tanFrame[2], v), 0.0, 1.0);
+ float NdotL = clamp(dot(tanFrame[2], l), 0.0, 1.0);
+ float k = roughness*roughness*0.79788;
+
+ float G_V = NdotV / (NdotV * (1.0 + k) + k);
+ float G_L = NdotL / (NdotL * (1.0 + k) + k);
+
+ return clamp(( G_V * G_L ), 0.0, 1.0);
+}
+
+float GtermGGX( in mat3 tanFrame, in vec3 l, in vec3 v, in float roughness )
+{
+ float NdotV = clamp(dot(tanFrame[2], v), 0.0, 1.0);
+ float NdotL = clamp(dot(tanFrame[2], l), 0.0, 1.0);
+ float k = clamp(roughness*roughness, 0.00, 1.0);
+
+ float G_V = NdotV + sqrt( (NdotV - NdotV * k) * NdotV + k );
+ float G_L = NdotL + sqrt( (NdotL - NdotL * k) * NdotL + k );
+
+ return clamp( 2.0 / ( G_V * G_L ), 0.0, 1.0);
+}
+
+float DtermGGX( in mat3 tanFrame, in vec3 L, in vec3 V, in float roughness )
+{
+ float m = clamp(roughness, 0.04, 1.0);
+ float m2 = m*m;
+
+ vec3 H = normalize(L + V);
+ float NdotH = clamp(dot( tanFrame[2], H ), 0.0001, 1.0);
+ float NdotH2 = NdotH * NdotH;
+
+ float denom = NdotH2 * (m2 - 1.0) + 1.0;
+ float D = m2 / (PI * denom * denom);
+
+ return max( 0.0, D);
+}
+
+float DtermGGXAniso( in mat3 tanFrame, in vec3 L, in vec3 V, in float roughnessU, float roughnessV )
+{
+ float roughU = clamp(roughnessU, 0.04, 1.0);
+ float roughV = clamp(roughnessV, 0.04, 1.0);
+ vec3 H = normalize(L + V);
+ float NdotH = clamp( dot(tanFrame[2], H), 0.0001, 1.0 );
+ float m = PI * roughU * roughV;
+ float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 );
+ float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 );
+
+ float x2 = roughU*roughU;
+ float y2 = roughV*roughV;
+
+ float D = (HdotX*HdotX/x2) + (HdotY*HdotY/y2) + (NdotH*NdotH);
+ D = 1.0 / ( m * D * D );
+
+ return max( 0.0, D);
+}
+
+vec4 microfacetBSDF( in mat3 tanFrame, in vec3 L, in vec3 V, in vec3 lightSpecular, float ior,
+ in float roughnessU, in float roughnessV, int mode )
+{
+ vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 );
+ vec3 H = normalize(L + V);
+ float HdotL = clamp(dot(H, L), 0.0, 1.0);
+ float NdotL = dot(tanFrame[2], L);
+
+ if ( NdotL > 0.0 )
+ {
+ if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) )
+ {
+ float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] );
+ // G term
+ //float G = GtermSchlick( tanFrame, L, V, roughness );
+ float G = GtermGGX( tanFrame, L, V, roughness );
+
+ //float D = DtermGGX( tanFrame, L, V, roughness );
+ float D = DtermGGXAniso( tanFrame, L, V, roughnessU, roughnessV );
+ rgba.rgb = G * D * NdotL * lightSpecular;
+ }
+
+ if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) )
+ {
+ rgba.a = pow(1.0 - clamp(HdotL, 0.0, 1.0), 5.0);
+ }
+ }
+
+ return rgba;
+}
+
+vec4 microfacetBSDFEnvironment( in mat3 tanFrame, in vec3 viewDir, in float roughnessU,
+ in float roughnessV, int mode )
+{
+ vec3 rgb = vec3( 0.0, 0.0, 0.0 );
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ if ( uEnvironmentMappingEnabled )
+ {
+ float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] );
+ vec3 R = reflect( -viewDir, tanFrame[2] );
+ rgb = 0.01 * evalEnvironmentMap( R, roughness );
+ rgb = microfacetBSDF( tanFrame, R, viewDir, rgb, 1.0, roughnessU, roughnessV,
+ scatter_reflect ).rgb;
+ }
+#endif
+ return( vec4( rgb, 1.0 ) );
+}
+
+vec3 ImportanceGGX( in mat3 tanFrame, vec2 Xi, float roughness , vec3 N )
+{
+ float a = roughness * roughness;
+ float Phi = 2.0 * PI * Xi.y;
+ float CosTheta = (1.0 - Xi.x);
+ float SinTheta = sqrt( 1.0 - CosTheta * CosTheta );
+
+ vec3 H;
+ H.x = SinTheta * cos( Phi );
+ H.y = SinTheta * sin( Phi );
+ H.z = CosTheta;
+
+ // Tangent to world space
+ return tanFrame[0] * H.x + tanFrame[1] * H.y + tanFrame[2] * H.z;
+}
+
+float DtermGGXAnisoSampled( in mat3 tanFrame, in vec3 H, in float roughnessU, float roughnessV )
+{
+#if (MATERIAL_IS_NON_DIELECTRIC == 1)
+ float roughU = clamp(roughnessU*roughnessU, 0.01, 1.0);
+ float roughV = clamp(roughnessV*roughnessV, 0.01, 1.0);
+#else
+ float roughU = clamp(roughnessU, 0.02, 1.0);
+ float roughV = clamp(roughnessV, 0.02, 1.0);
+#endif
+
+ float NdotH = clamp( dot(tanFrame[2], H), 0.0001, 1.0 );
+ float m = PI * roughU * roughV;
+ float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 );
+ float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 );
+
+ float x2 = roughU*roughU;
+ float y2 = roughV*roughV;
+
+ float pdf = (HdotX*HdotX/x2) + (HdotY*HdotY/y2) + (NdotH*NdotH);
+ float D = 1.0 / ( m * pdf * pdf );
+
+ return max( 0.0, D);
+}
+
+vec3 sampleEnv(in vec3 L, float pdf, int sampleCount, float roughness )
+{
+ // convert coord to 2D
+ vec2 tc = vec2( ( atan( L.x, -L.z ) + PI ) / ( 2.0 * PI ), acos( -L.y ) / PI );
+ return( textureLod( uEnvironmentTexture, tc, 0.0 ).rgb );
+}
+
+vec4 microfacetSampledBSDF( in mat3 tanFrame, in vec3 viewDir, in float roughnessU,
+ in float roughnessV, int mode )
+{
+ vec2 hammersly[4];
+ hammersly[0] = vec2(0.0, 0.0);
+ hammersly[1] = vec2(0.25, 0.5);
+ hammersly[2] = vec2(0.5, 0.25);
+ hammersly[3] = vec2(0.75, 0.75);
+
+ vec3 rgb = vec3( 0.0, 0.0, 0.0 );
+
+ float roughness = clamp( calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] ),
+ 0.0, 1.0 );
+
+ vec3 R = reflect( -viewDir, tanFrame[2] );
+
+ const int NumSamples = 4;
+ for( int i = 0; i < NumSamples; i++ )
+ {
+ vec2 Xi = hammersly[i]; // pre computed values
+ //vec2 Xi = hammersley2d(i, NumSamples);
+ vec3 Half = ImportanceGGX( tanFrame, Xi, roughness , tanFrame[2] );
+ vec3 H = normalize( Half );
+
+ vec3 L = 2.0 * dot( viewDir, Half ) * Half - viewDir;
+ float NdotV = clamp( dot( tanFrame[2], viewDir ), 0.0001, 1.0 );
+ float NdotR = clamp( dot( tanFrame[2], R ), 0.0, 1.0 );
+ float NdotH = clamp( dot( tanFrame[2], H ), 0.0001, 1.0 );
+
+ if( NdotV > 0.0001 )
+ {
+ float G = GtermGGX( tanFrame, L, viewDir, roughness );
+ float D = DtermGGXAnisoSampled( tanFrame, H, roughnessU, roughnessV);
+
+ vec3 envColor = 0.01 * sampleEnv( L, D, NumSamples, roughness );
+
+ rgb += (envColor * G * D * NdotR) / ( 4.0 * NdotV * NdotH);
+ }
+ }
+
+ rgb /= float(NumSamples);
+
+ return( vec4( rgb, 1.0 ) );
+}
+
+#endif
diff --git a/res/effectlib/gles2/monoChannel.glsllib b/res/effectlib/gles2/monoChannel.glsllib
new file mode 100644
index 0000000..ca682d6
--- /dev/null
+++ b/res/effectlib/gles2/monoChannel.glsllib
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MONO_CHANNEL_GLSLLIB
+#define MONO_CHANNEL_GLSLLIB
+
+#ifdef QT3DS_DEFINE_API
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#endif
+
+float monoChannel( in vec4 t, const in int monoSource )
+{
+ if ( monoSource == mono_alpha )
+ return( t.w );
+
+ if ( monoSource == mono_average )
+ return( ( t.x + t.y + t.z ) / 3.0 );
+
+ if ( monoSource == mono_luminance )
+ return( luminance( t.xyz ) );
+
+ if ( monoSource == mono_maximum )
+ return( max( t.x, max( t.y, t.z ) ) );
+
+ return( 1.0 );
+}
+
+#endif
diff --git a/res/effectlib/gles2/refraction.glsllib b/res/effectlib/gles2/refraction.glsllib
new file mode 100644
index 0000000..837d7f5
--- /dev/null
+++ b/res/effectlib/gles2/refraction.glsllib
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// this is entirly phiysical incorrect
+// We just use this to fake distortion when we have no environment available
+// The displacement is calculated on ior
+vec3 refraction( in sampler2D sampler, in float materialIOR )
+{
+ vec3 displace = fresnel( viewDir, vec3( materialIOR ));
+
+ float xdir = abs( viewDir.x );
+ float ydir = abs( viewDir.y );
+
+ vec2 texSize = vec2( textureSize( sampler, 0 ) );
+ vec2 newUV = vec2(gl_FragCoord.xy/texSize);
+ if ( xdir > ydir)
+ {
+ newUV = ( viewDir.x > 0.0) ? newUV + displace.xy : newUV - displace.xy;
+ }
+ else
+ {
+ newUV = ( viewDir.y > 0.0) ? newUV - displace.xy : newUV + displace.xy;
+ }
+
+ vec3 refractColor = texture( sampler, newUV ).rgb;
+
+ return refractColor;
+}
+
+// This should really not be used, but it's there for the sake of testing.
+vec3 refractBlur( in sampler2D sampler, in vec3 viewDir, in float materialIOR, in float blurWidth )
+{
+ // This is really terrible, but at least is a little better than
+ vec3 displace = viewDir * materialIOR;
+
+ vec2 texSize = vec2( textureSize( sampler, 0 ) );
+ texSize = vec2(1.0) / texSize;
+ vec2 newUV = vec2(gl_FragCoord.xy * texSize);
+ newUV += displace.xy * 0.005;
+
+ //vec3 refractColor = texture( sampler, newUV ).rgb;
+ vec3 refractColor = vec3(0);
+ int sz = int(ceil(blurWidth));
+ float wtsum = 0.0;
+
+ for (int y = -sz; y <= sz; ++y)
+ {
+ for (int x = -sz; x <= sz; ++x)
+ {
+ float wt = float(x*x + y*y) / (blurWidth * 0.5);
+ wt = exp2(-wt);
+ //refractColor += wt * textureOffset( sampler, newUV, ivec2(x, y) ).rgb;
+ vec2 uvOfs = vec2(x, y) * texSize;
+ refractColor += wt * texture( sampler, newUV+uvOfs).rgb;
+ wtsum += wt;
+ }
+ }
+
+ return refractColor / wtsum;
+}
diff --git a/res/effectlib/gles2/sampleProbe.glsllib b/res/effectlib/gles2/sampleProbe.glsllib
new file mode 100644
index 0000000..f785918
--- /dev/null
+++ b/res/effectlib/gles2/sampleProbe.glsllib
@@ -0,0 +1,482 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SAMPLE_PROBE_GLSLLIB
+#define SAMPLE_PROBE_GLSLLIB 1
+
+#ifndef QT3DS_ENABLE_LIGHT_PROBE_2
+#define QT3DS_ENABLE_LIGHT_PROBE_2 0
+#endif
+
+#ifndef QT3DS_ENABLE_IBL_FOV
+#define QT3DS_ENABLE_IBL_FOV 0
+#endif
+
+uniform sampler2D light_probe;
+uniform vec4 light_probe_props;
+uniform vec4 light_probe_rotation;
+uniform vec4 light_probe_offset; // light_probe_offset.w = number of mipmaps
+uniform vec2 light_probe_size;
+
+#if QT3DS_ENABLE_LIGHT_PROBE_2
+uniform sampler2D light_probe2;
+uniform vec4 light_probe2_props;
+uniform vec2 light_probe2_size;
+#endif
+
+#if QT3DS_ENABLE_IBL_FOV
+uniform vec4 light_probe_opts;
+#endif
+
+float noise1d(vec2 n)
+{
+ return 0.5 + 0.5 * fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);
+}
+
+mat3 orthoNormalize( in mat3 tanFrame )
+{
+ mat3 outMat;
+ outMat[0] = normalize( cross( tanFrame[1], tanFrame[2] ) );
+ outMat[1] = normalize( cross( tanFrame[2], outMat[0] ) );
+ outMat[2] = tanFrame[2];
+
+ return outMat;
+}
+
+mat3 tangentFrame( vec3 N, vec3 p )
+{
+ // get edge vectors of the pixel triangle
+ vec3 dp1 = dFdx( p );
+ vec3 dp2 = dFdy( p );
+ // Using dPdu and dPdv would be nicer, but the nature of our materials
+ // are not ones with intrinsic UVs, so we can't really go there.
+// vec2 duv1 = dFdx( uv );
+// vec2 duv2 = dFdy( uv );
+
+ // solve the linear system
+ vec3 dp2perp = cross( dp2, N );
+ vec3 dp1perp = cross( N, dp1 );
+// vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
+// vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
+
+ vec3 T = normalize(dp1perp);
+ vec3 B = normalize(dp2perp);
+ return mat3( T , B , N );
+}
+
+vec2 transformSample( vec2 origUV, vec4 probeRot, vec2 probeOfs )
+{
+ vec2 retUV;
+ retUV.x = dot( vec3(origUV, 1.0), vec3(probeRot.xy, probeOfs.x) );
+ retUV.y = dot( vec3(origUV, 1.0), vec3(probeRot.zw, probeOfs.y) );
+ return retUV;
+}
+
+// This is broken out into its own routine so that if we get some other
+// format image than a lat-long, then we can account for that by changing
+// the code here alone.
+vec2 getProbeSampleUV( vec3 smpDir, vec4 probeRot, vec2 probeOfs )
+{
+ vec2 smpUV;
+
+#if QT3DS_ENABLE_IBL_FOV
+ smpUV.x = (2.0 * atan(-smpDir.z, smpDir.x) + 3.14159265358 ) / light_probe_opts.x;
+ smpUV.y = (2.0 * atan(-smpDir.z, smpDir.y) + 3.14159265358 ) / light_probe_opts.x;
+#else
+ smpUV.x = atan( smpDir.x, -smpDir.z) / 3.14159265359;
+ smpUV.y = 1.0 - (acos(smpDir.y) / 1.57079632679);
+#endif
+ smpUV = transformSample( smpUV.xy * 0.5, probeRot, probeOfs ) + vec2(0.5, 0.5);
+
+ return smpUV;
+}
+
+vec4 getTopLayerSample( vec3 inDir, float lodShift, vec3 lodOffsets )
+{
+#if QT3DS_ENABLE_LIGHT_PROBE_2
+ if ( light_probe2_props.w < 0.5 )
+ return vec4(0.0, 0.0, 0.0, 0.0);
+
+ vec2 smpUV = getProbeSampleUV( inDir, vec4(1.0, 0.0, 0.0, 1.0), light_probe_props.xy );
+ smpUV.x -= 0.5;
+ smpUV.x *= light_probe2_props.x;
+ smpUV.x += light_probe2_props.y;
+
+ vec4 retVal = 0.4 * textureLod( light_probe2, smpUV , lodShift );
+ retVal += 0.2 * textureLod( light_probe2, smpUV , lodShift+lodOffsets.x );
+ retVal += 0.3 * textureLod( light_probe2, smpUV , lodShift+lodOffsets.y );
+ retVal += 0.1 * textureLod( light_probe2, smpUV , lodShift+lodOffsets.z );
+ return retVal;
+#else
+ return vec4(0.0, 0.0, 0.0, 0.0);
+#endif
+}
+
+vec3 getProbeSample( vec3 smpDir, float lodShift, vec3 normal )
+{
+ vec2 smpUV = getProbeSampleUV( smpDir, light_probe_rotation, light_probe_offset.xy );
+ return textureLod( light_probe, smpUV , lodShift ).xyz;
+}
+
+vec3 getProbeWeightedSample( vec3 smpDir, float lodShift, float roughness, vec3 normal )
+{
+ // This gives us a weighted sum that approximates the total filter support
+ // of the full-blown convolution.
+ vec2 smpUV = getProbeSampleUV( smpDir, light_probe_rotation, light_probe_offset.xy );
+ float wt = 1.0;
+
+#if QT3DS_ENABLE_IBL_FOV
+ wt = min(wt, smoothstep(roughness * -0.25, roughness * 0.25, smpUV.x));
+ wt = min(wt, smoothstep(roughness * -0.25, roughness * 0.25, smpUV.y));
+ wt = min(wt, 1.0 - smoothstep(1.0 - roughness*0.25, 1.0 + roughness*0.25, smpUV.x));
+ wt = min(wt, 1.0 - smoothstep(1.0 - roughness*0.25, 1.0 + roughness*0.25, smpUV.y));
+#endif
+
+ vec3 lodOffsets;
+ lodOffsets.x = mix(-2.0, -0.70710678, roughness);
+ lodOffsets.y = min( 2.0 * smoothstep(0.0, 0.1, roughness), 2.0 - 1.29289 * smoothstep(0.1, 1.0, roughness) );
+ lodOffsets.z = min( 6.0 * smoothstep(0.0, 0.1, roughness), 6.0 - 4.585786 * smoothstep(0.1, 1.0, roughness) );
+
+ ivec2 iSize = ivec2(light_probe_size);
+ vec3 ddx = dFdx( smpDir ) * float(iSize.x);
+ vec3 ddy = dFdy( smpDir ) * float(iSize.y);
+// vec2 ddxUV = dFdx( smpUV ) * float(iSize.x);
+// vec2 ddyUV = dFdy( smpUV ) * float(iSize.y);
+
+ vec2 deriv;
+ deriv.x = max( dot(ddx, ddx), dot(ddy, ddy) );
+// deriv.y = max( dot(ddxUV, ddxUV), dot(ddyUV, ddyUV) );
+ deriv = clamp( deriv, vec2(1.0), vec2(iSize.x * iSize.y) );
+ vec2 lodBound = 0.5 * log2( deriv ) - vec2(1.0);
+
+// float minLod = 0.5 * (lodBound.x + lodBound.y);
+ float minLod = lodBound.x;
+ float maxLod = log2( max(float(iSize.x), float(iSize.y)) );
+ minLod = clamp( minLod / maxLod, 0.0, 1.0 );
+ minLod *= minLod * maxLod;
+
+ lodShift = max( lodShift, minLod );
+
+ vec3 retVal = 0.4 * textureLod( light_probe, smpUV , lodShift ).xyz;
+ retVal += 0.2 * textureLod( light_probe, smpUV , max(minLod, lodShift+lodOffsets.x) ).xyz;
+ retVal += 0.3 * textureLod( light_probe, smpUV , lodShift+lodOffsets.y ).xyz;
+ retVal += 0.1 * textureLod( light_probe, smpUV , lodShift+lodOffsets.z ).xyz;
+
+#if QT3DS_ENABLE_LIGHT_PROBE_2
+ vec4 topSmp = getTopLayerSample( smpDir, lodShift, lodOffsets );
+ vec3 tempVal = mix( retVal, topSmp.xyz, topSmp.w );
+ retVal = mix( retVal, tempVal, light_probe2_props.z );
+#endif
+
+ if (light_probe_props.z > -1.0) {
+ float ctr = 0.5 + 0.5 * light_probe_props.z;
+ float vertWt = smoothstep(ctr-roughness*0.25, ctr+roughness*0.25, smpUV.y);
+ float wtScaled = mix(1.0, vertWt, light_probe_props.z + 1.0);
+ retVal *= wtScaled;
+ }
+
+ return retVal * wt;
+}
+
+vec2 textureSizeLod( vec2 size, int level )
+{
+ return size / pow(2.0, float(level));
+}
+
+vec3 getProbeAnisoSample( vec3 smpDir, float roughU, float roughV, mat3 tanFrame )
+{
+ float minRough = min(roughU, roughV);
+ float maxRough = max(roughU, roughV);
+
+ float lodMin = log2( (minRough*3.0 + maxRough)*0.25 ) + (light_probe_offset.w - 2.0);
+
+ float ratio = clamp( maxRough / minRough, 1.01, 27.0);
+ vec2 texSize = textureSizeLod( light_probe_size, int(floor( lodMin )) );
+ texSize = mix( texSize, texSize * 0.5, fract(lodMin) );
+
+ // Boundary of 1.0..9.0 is just to keep the number of samples to within a
+ // reasonable number of samples in the filter. Similarly, with the clamping
+ // of the ratio to a max of 27.0 is just to prevent the step size in the filter
+ // to be no bigger than 3 texels (beyond which, there are some artifacts at high
+ // roughness, aka low texture res).
+ float stepFig = clamp(floor( ratio ), 1.0, 9.0);
+
+ // numSteps is half the number of samples we need to take, which makes it
+ // the number of steps to take on each side.
+ int numSteps = int( floor(stepFig * 0.5) );
+
+ vec2 smpUV = getProbeSampleUV( smpDir, light_probe_rotation, light_probe_offset.xy );
+ vec4 result = vec4(0.0);
+
+ vec3 smpDirOfs = (maxRough == roughU) ? 0.01 * tanFrame[0] : 0.01 * tanFrame[1];
+ vec2 stepPos = getProbeSampleUV(normalize(smpDir + smpDirOfs), light_probe_rotation, light_probe_offset.xy);
+ vec2 stepNeg = getProbeSampleUV(normalize(smpDir - smpDirOfs), light_probe_rotation, light_probe_offset.xy);
+ stepPos -= smpUV; stepNeg -= smpUV;
+ stepPos *= texSize; stepNeg *= texSize;
+
+ // This ensures that we step along a size that makes sense even if one of the two
+ // sammpling directions wraps around the edges of the IBL texture.
+ smpDirOfs /= min( length(stepPos), length(stepNeg) );
+ smpDirOfs *= ratio / stepFig;
+
+ float sigma = mix(0.0, 2.0, ratio / 27.0);
+ sigma *= sigma;
+
+ float wt = (1.0 / (ratio - 1.0)) + 1.0;
+ result.xyz += wt * getProbeWeightedSample( smpDir, lodMin, minRough, tanFrame[2] );
+ result.w += wt;
+ for (int i = 0; i < numSteps; ++i)
+ {
+ wt = sigma / (sigma + float(i * i));
+ vec2 uv0 = getProbeSampleUV(normalize(smpDir + smpDirOfs * float(i)), light_probe_rotation, light_probe_offset.xy);
+ vec2 uv1 = getProbeSampleUV(normalize(smpDir - smpDirOfs * float(i)), light_probe_rotation, light_probe_offset.xy);
+ result.xyz += wt * textureLod( light_probe, uv0 , lodMin ).xyz;
+ result.w += wt;
+ result.xyz += wt * textureLod( light_probe, uv1 , lodMin ).xyz;
+ result.w += wt;
+ }
+
+ result /= result.w;
+ return result.xyz;
+}
+
+vec4 sampleDiffuse( mat3 tanFrame )
+{
+ if ( light_probe_props.w < 0.005 )
+ return vec4( 0.0 );
+
+// if ( light_probe_offset.w > 0.5 )
+// {
+ // The LOD offset comes from the assumption that a full diffuse convolution
+ // has a support of pi/2, which translates into x pixels, and the base 2 log
+ // gives us this LOD... Technically, "x" pixels depends on what the original
+ // texture resolution was, which is why we use light_probe_offset.w, which holds
+ // the number of mip levels the texture has.
+
+ return vec4( light_probe_props.w * getProbeWeightedSample( tanFrame[2], light_probe_offset.w - 2.65149613, 1.0, tanFrame[2] ), 1.0 );
+// }
+
+ /*
+ // PKC -- the code below is for full-blown IBL, which we'll skip for now
+
+ // Hand-calculated Hammersley points for t = 2, n = 33
+ // I exclude the 0,0 first point, hence why n=33 and not 32
+ // Nice thing about 2d Hammersley points is that any subset is
+ // also stratified, so even if I have 1000 points and truncate
+ // anywhere, I'm fine. Each of these represent the y of an xy
+ // while x for the kth point is always (k+1)/n.
+ float kernel[32];
+ kernel[0] = 0.5; kernel[1] = 0.25;
+ kernel[2] = 0.75; kernel[3] = 0.125;
+ kernel[4] = 0.625; kernel[5] = 0.375;
+ kernel[6] = 0.875; kernel[7] = 0.0625;
+ kernel[8] = 0.5625; kernel[9] = 0.3125;
+ kernel[10] = 0.8125; kernel[11] = 0.1875;
+ kernel[12] = 0.6875; kernel[13] = 0.4375;
+ kernel[14] = 0.9375; kernel[15] = 0.03125;
+ kernel[16] = 0.53125; kernel[17] = 0.28125;
+ kernel[18] = 0.78125; kernel[19] = 0.15625;
+ kernel[20] = 0.65625; kernel[21] = 0.40625;
+ kernel[22] = 0.90625; kernel[23] = 0.09375;
+ kernel[24] = 0.59375; kernel[25] = 0.34375;
+ kernel[26] = 0.84375; kernel[27] = 0.28175;
+ kernel[28] = 0.71875; kernel[29] = 0.46875;
+ kernel[30] = 0.96875; kernel[31] = 0.015625;
+
+ float phiShift = noise1d(gl_FragCoord.xy) - 0.5;
+
+ vec3 ret = vec3(0, 0, 0);
+
+ int ct = 24;
+ float step = 25.0;
+
+ // Importance sampling a cosine-weighted distribution. Since this
+ // matches the BSDF exactly, we are just going to assume that the PDF
+ // and the BSDF cancel out in sampling, so we just need to accumulate
+ // texture colors. The noise function puts randomized "twist" into
+ // the sampled directions.
+ for( int i = 0; i < ct; ++i )
+ {
+ vec3 localDir;
+ float phi = 6.28318530718 * (kernel[i] + phiShift);
+ float cosTheta = sqrt( float(i+1) / step);
+ localDir.z = sqrt(1.0 - cosTheta*cosTheta);
+ localDir.x = cos(phi) * cosTheta;
+ localDir.y = sin(phi) * cosTheta;
+ vec3 smpDir = tanFrame[0]*localDir.x + tanFrame[1]*localDir.y + tanFrame[2]*localDir.z;
+
+
+ float lodShift = light_probe_offset.w - 2 + log2( 3.1415926535 / (localDir.z * step) );
+ vec3 smpColor = getProbeSample( smpDir, lodShift, tanFrame[2] );
+
+ // The assumption here is that the BSDF and the sampling PDF are identical
+ // so they cancel out and therefore, we don't need to include it here.
+ ret += smpColor;
+ }
+
+ ret *= aoFactor / 24.0;
+ return ret;
+ */
+}
+
+vec4 sampleDiffuseCustomMaterial( vec3 normal, vec3 worldPos, float aoFactor )
+{
+
+ mat3 tanFrame = tangentFrame( normal, worldPos );
+ return sampleDiffuse( tanFrame );
+}
+
+vec4 sampleGlossyAniso( mat3 tanFrame, vec3 viewDir, float roughU, float roughV )
+{
+ if ( light_probe_props.w < 0.005 )
+ return vec4( 0.0 );
+
+ // PKC : If we do the full IBL sampling, it's useful to square the roughnesses because
+ // it makes the effect of roughness feel more linear in the low end. This isn't necessary
+ // for fast IBL.
+// float sigmaU = clamp(roughU*roughU, 0.0001, 1.0);
+// float sigmaV = clamp(roughV*roughV, 0.0001, 1.0);
+ float sigmaU = smoothstep( 0.0, 1.0, clamp(roughU, 0.0001, 1.0) );
+ float sigmaV = smoothstep( 0.0, 1.0, clamp(roughV, 0.0001, 1.0) );
+ vec3 ret = vec3(0, 0, 0);
+
+// if ( light_probe_offset.w > 0.5 )
+// {
+ vec3 smpDir = reflect( -viewDir, tanFrame[2] );
+ float sigma = sqrt(sigmaU * sigmaV);
+
+ // Compute the Geometric occlusion/self-shadowing term
+ float NdotL = clamp( dot( smpDir, tanFrame[2] ), 0.0, 0.999995);
+ float k = sigma * 0.31830988618; // roughness / pi
+ float Gl = clamp( (NdotL / (NdotL*(1.0-k) + k) + (1.0 - k*k)) * 0.5, 0.0, 1.0 );
+
+ vec3 outColor;
+
+ outColor = getProbeAnisoSample( smpDir, sigmaU, sigmaV, tanFrame );
+
+ return vec4( light_probe_props.w * Gl * outColor, 1.0 );
+// }
+
+ // PKC -- the code below is for full-blown IBL, which we'll skip for now
+
+/*
+ float step = clamp( ceil(32.0 * sqrt(max(sigmaU, sigmaV))), 4.0, 32.0 );
+ int actualCt = int(step);
+ float phiShift = noise1d(gl_FragCoord.xy) - 0.5;
+
+ // Hand-calculated Hammersley points for t = 2, n = 33
+ // I exclude the 0,0 first point, hence why n=33 and not 32
+ // Nice thing about 2d Hammersley points is that any subset is
+ // also stratified, so even if I have 1000 points and truncate
+ // anywhere, I'm fine. Each of these represent the y of an xy
+ // while x for the kth point is always (k+1)/n.
+ float kernel[32];
+ kernel[0] = 0.5; kernel[1] = 0.25;
+ kernel[2] = 0.75; kernel[3] = 0.125;
+ kernel[4] = 0.625; kernel[5] = 0.375;
+ kernel[6] = 0.875; kernel[7] = 0.0625;
+ kernel[8] = 0.5625; kernel[9] = 0.3125;
+ kernel[10] = 0.8125; kernel[11] = 0.1875;
+ kernel[12] = 0.6875; kernel[13] = 0.4375;
+ kernel[14] = 0.9375; kernel[15] = 0.03125;
+ kernel[16] = 0.53125; kernel[17] = 0.28125;
+ kernel[18] = 0.78125; kernel[19] = 0.15625;
+ kernel[20] = 0.65625; kernel[21] = 0.40625;
+ kernel[22] = 0.90625; kernel[23] = 0.09375;
+ kernel[24] = 0.59375; kernel[25] = 0.34375;
+ kernel[26] = 0.84375; kernel[27] = 0.28175;
+ kernel[28] = 0.71875; kernel[29] = 0.46875;
+ kernel[30] = 0.96875; kernel[31] = 0.015625;
+
+ float thetaI = acos( dot(viewDir, tanFrame[2]) );
+
+ // NOTE : The model I'm using here is actually based on the KGGX model used in
+ // physGlossyBSDF. This is my own variation on the original GGX which uses something
+ // closer to a pure Cauchy distribution in tangent space, but also supports anisotropy.
+ for (int i = 0; i < actualCt; ++i)
+ {
+ vec3 localDir;
+
+ float phi = 6.28318530718 * (kernel[i] + phiShift);
+ float u = float(i + 1) / (step + 1.0);
+ float rU = cos(phi) * sigmaU;
+ float rV = sin(phi) * sigmaV;
+ float sigma = sqrt(rU * rU + rV * rV);
+
+ float boundA = atan( ((thetaI - 1.57079632679) * 0.5) / sigma );
+ float boundB = atan( ((thetaI + 1.57079632679) * 0.5) / sigma );
+ float t = (1.0 - u) * boundA + u * boundB;
+ float thetaH = tan( t ) * sigma;
+
+ float cosThetaH = cos( thetaH );
+ float sinThetaH = sin( thetaH );
+ localDir.z = cosThetaH;
+ localDir.y = sin(phi) * sinThetaH;
+ localDir.x = cos(phi) * sinThetaH;
+
+ vec3 halfDir = tanFrame[0]*localDir.x + tanFrame[1]*localDir.y + tanFrame[2]*localDir.z;
+ halfDir = normalize(halfDir);
+ vec3 smpDir = reflect( -viewDir, halfDir );
+
+ vec2 scaledXY = localDir.xy / vec2(sigmaU, sigmaV);
+ float PDF = (sigmaU*sigmaV) / (sigmaU*sigmaV + dot(scaledXY, scaledXY));
+ vec3 Haf = smpDir + viewDir; // We need the unnormalized half vecter as well as the normalized one
+ float HdotL = dot(halfDir, smpDir);
+ // normalize the PDF to compute the filter support
+ // This gives us the ideal miplevel at which to sample the texture map.
+ PDF *= dot(Haf, Haf) / (4.0 * dot(Haf, smpDir) * HdotL * sigmaU*sigmaV * (boundB-boundA)*(boundB-boundA));
+
+ // Again assuming that the pdf and BSDF are equivalent -- that's not generally valid,
+ // but it saves a lot of ALU cycles.
+ float lodShift = log2( 512.0 * sigma / PDF );
+
+ float k = sigma * 0.31830988618; // roughness / pi
+ float Gl = clamp( (HdotL / (HdotL*(1.0-k) + k) + (1.0 - k*k)) * 0.5, 0.0, 1.0 );
+
+ vec3 smpColor = Gl * getProbeSample( smpDir, lodShift, tanFrame[2] );
+ ret += smpColor;
+ }
+ ret /= float(actualCt);
+ return vec4(ret, 1.0);
+*/
+}
+
+vec4 sampleGlossy( mat3 tanFrame, vec3 viewDir, float roughness )
+{
+ return sampleGlossyAniso( tanFrame, viewDir, roughness, roughness );
+}
+
+vec4 sampleGlossyCustomMaterial( vec3 normal, vec3 worldPos, vec3 viewDir, float roughness )
+{
+ mat3 tanFrame = tangentFrame( normal, worldPos );
+ return sampleGlossy( tanFrame, viewDir, roughness );
+}
+
+#endif
diff --git a/res/effectlib/gles2/shadowMapping.glsllib b/res/effectlib/gles2/shadowMapping.glsllib
new file mode 100644
index 0000000..183ef97
--- /dev/null
+++ b/res/effectlib/gles2/shadowMapping.glsllib
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SHADOW_MAPPING_GLSLLIB
+#define SHADOW_MAPPING_GLSLLIB
+
+#include "depthpass.glsllib"
+
+float sampleParaboloid( in sampler2D shadowMap, in vec4 shadowControls, in mat4 shadowMatrix, in vec3 worldPos, in vec2 cameraProps, out vec2 smpUV )
+{
+ vec4 projCoord = shadowMatrix * vec4( worldPos, 1.0 );
+ vec3 smpCoord = projCoord.xyz / projCoord.w;
+
+ float ptDepth = depthValueToLinearDistance( 1.0 - smpCoord.z, cameraProps );
+ ptDepth = (ptDepth - cameraProps.x) / (cameraProps.y - cameraProps.x);
+ smpCoord = normalize( smpCoord.xyz );
+ smpCoord.xy /= -( smpCoord.z + 1.0 );
+ smpCoord.xy = vec2(1.0) - smpCoord.xy;
+ smpCoord.xy *= 0.5;
+
+ smpUV = smpCoord.xy; // This is just for debug purposes to ensure what the sampled UV cooord is.
+
+ float sampleDepth = texture( shadowMap, smpCoord.xy ).x + shadowControls.x;
+ sampleDepth *= sampleDepth;
+ ptDepth *= ptDepth;
+ float shadowFac = min(1.0, exp(shadowControls.y * sampleDepth * sampleDepth) / exp(shadowControls.y * ptDepth * ptDepth));
+
+ smpUV.xy *= shadowFac;
+ return shadowFac;
+}
+
+float sampleCubemap( in samplerCube shadowCube, in vec4 shadowControls, in mat4 shadowViewMat, in vec3 lightPos, in vec3 worldPos, in vec2 cameraProps )
+{
+ vec3 viewDir = worldPos - vec3(lightPos.x, lightPos.y, lightPos.z);
+ float ptDepth = length(viewDir.xyz);
+ vec4 viewCoord = shadowViewMat * vec4( viewDir.xyz, 0.0 );
+ viewCoord.xyz /= ptDepth;
+ ptDepth = clamp((ptDepth - 1.0) / (cameraProps.y - 1.0), 0.0, 1.0);
+
+ float smpDepth = textureCube( shadowCube, viewDir.xyz ).x + shadowControls.x;
+
+ float shadowFac = min(1.0, exp(shadowControls.y * smpDepth) / exp(shadowControls.y * ptDepth));
+ return shadowFac;
+}
+
+float sampleOrthographic( in sampler2D shadowMap, in vec4 shadowControls, in mat4 shadowMatrix, in vec3 worldPos, in vec2 cameraProps )
+{
+ vec4 projCoord = shadowMatrix * vec4( worldPos, 1.0 );
+ vec3 smpCoord = projCoord.xyz / projCoord.w;
+
+ float sampleDepth = texture( shadowMap, smpCoord.xy ).x + shadowControls.x;
+
+ return min(1.0, exp(shadowControls.y * sampleDepth) / exp(shadowControls.y * smpCoord.z));
+}
+
+
+struct ParaboloidMapResult
+{
+ vec4 m_Position;
+ vec4 m_WorldPos;
+};
+
+ParaboloidMapResult VertexParaboloidDepth(vec3 pos, mat4 inMVP)
+{
+ vec4 glPos = inMVP * vec4( pos, 1.0 );
+ glPos /= glPos.w;
+ glPos.xyz = normalize( glPos.xyz );
+ vec4 world_pos;
+ world_pos.w = glPos.z;
+ glPos.xy /= glPos.z + 1.0;
+ world_pos.xyz = pos.xyz;
+
+ ParaboloidMapResult retval;
+ retval.m_Position = glPos;
+ retval.m_WorldPos = world_pos;
+ return retval;
+}
+
+#endif
diff --git a/res/effectlib/gles2/tangentSpaceNormalTexture.glsllib b/res/effectlib/gles2/tangentSpaceNormalTexture.glsllib
new file mode 100644
index 0000000..daae401
--- /dev/null
+++ b/res/effectlib/gles2/tangentSpaceNormalTexture.glsllib
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FILE_NORMAL_TEXTURE_GLSLLIB
+#define FILE_NORMAL_TEXTURE_GLSLLIB
+
+#ifdef QT3DS_DEFINE_API
+
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#include "rotationTranslationScale.glsllib"
+#include "transformCoordinate.glsllib"
+
+#endif
+
+int modulo(int a, int b)
+{
+ int k = (a / b);
+ return a - k*b;
+}
+
+//interpreting the color values of a bitmap as a vector in tangent space
+vec3 tangentSpaceNormalTexture( in sampler2D tex, in float factor, in bool flipTangentU, in bool flipTangentV
+ , in texture_coordinate_info uvw, in vec2 cropU, in vec2 cropV, in int wrapU, in int wrapV )
+{
+ // if we mirror repeat a tangent space texture, tangent space needs to be flipped for every other tile
+ bool flipU = flipTangentU;
+ bool flipV = flipTangentV;
+ if ( wrapU == wrap_mirrored_repeat )
+ {
+ if ( ( ( 0.0 < uvw.position.x ) && ( modulo(int( uvw.position.x ), 2) == 1 ) )
+ || ( ( uvw.position.x < 0.0 ) && ( modulo(int( uvw.position.x ), 2) == 0 ) ) )
+ {
+ flipU = !flipU;
+ }
+ if ( ( ( 0.0 < uvw.position.y ) && ( modulo(int( uvw.position.y ), 2) == 1 ) )
+ || ( ( uvw.position.y < 0.0 ) && ( modulo(int( uvw.position.y ), 2) == 0 ) ) )
+ {
+ flipV = !flipV;
+ }
+ }
+
+ vec3 tangent = 2.0 * texture( tex, uvw.position.xy ).xyz - 1.0;
+
+ vec3 tangentU = normalize( flipU ? -uvw.tangent_u : uvw.tangent_u );
+ vec3 tangentV = normalize( flipV ? -uvw.tangent_v : uvw.tangent_v );
+ vec3 normal = normalize( cross( tangentU, tangentV ) );
+
+ return( mix( normal, normalize( tangent.x * tangentU - tangent.y * tangentV + tangent.z * normal ), factor ) );
+}
+
+#include "textureCoordinateInfo.glsllib"
+
+//Simpler version built to run from UIC image data
+//In our case, we have already generated the texture coordinate x,y position
+//TODO - figure out if we need to manipulate tangent_u, tangent_v.
+vec3 defaultMaterialFileNormalTexture( in sampler2D sampler, in float factor, vec2 texCoord, vec3 tangent, vec3 binormal )
+{
+ // factor should be in [0,1] range
+ return tangentSpaceNormalTexture( sampler, clamp(factor, 0.0, 1.0), false, false
+ , textureCoordinateInfo( vec3( texCoord.x, texCoord.y, 0.0 ), tangent, binormal )
+ , vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 )
+ , wrap_repeat, wrap_repeat);
+}
+
+#endif
diff --git a/res/effectlib/gradient3Recolor.glsllib b/res/effectlib/gradient3Recolor.glsllib
new file mode 100644
index 0000000..ba7d593
--- /dev/null
+++ b/res/effectlib/gradient3Recolor.glsllib
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float gradientInterpolate( in int interpolationMode, in float value )
+{
+ switch( interpolationMode )
+ {
+ case gradient_interpolation_linear :
+ return( value );
+ case gradient_interpolation_off :
+ return( 0.0 );
+ case gradient_interpolation_ease_in :
+ return( 1.0 - pow( 1.0 - value, 2.0/3.0 ) );
+ case gradient_interpolation_ease_out :
+ return( pow( value, 2.0/3.0 ) );
+ case gradient_interpolation_ease_in_out :
+ return( ( value <= 0.5 )
+ ? 0.5 * pow( 2.0 * value, 2.0/3.0 )
+ : 0.5 + 0.5 * ( 1.0 - pow( 2.0 * ( 1.0 - value ), 2.0/3.0 ) ) );
+ default:
+ return( value ); // default is linear
+ }
+}
+
+texture_return gradient3Recolor( in float gradientPositions[3], in vec3 gradientColors[3], in int interpolationModes[3], in int monoSource, in float distortion, in float position )
+{
+ texture_return tr;
+ float pos = position + distortion;
+ if ( pos <= gradientPositions[0] )
+ {
+ tr.tint = gradientColors[0];
+ }
+ else if ( pos >= gradientPositions[2] )
+ {
+ tr.tint = gradientColors[2];
+ }
+ else
+ {
+ int index = ( position < gradientPositions[1] ) ? 0 : 1;
+ float relPos = gradientInterpolate( interpolationModes[index], ( pos - gradientPositions[index] ) / ( gradientPositions[index+1] - gradientPositions[index] ) );
+ tr.tint = mix( gradientColors[index], gradientColors[index+1], relPos );
+ }
+ tr.mono = 0.0;
+ return( tr );
+}
+
diff --git a/res/effectlib/gradient3Texture.glsllib b/res/effectlib/gradient3Texture.glsllib
new file mode 100644
index 0000000..7bd6cec
--- /dev/null
+++ b/res/effectlib/gradient3Texture.glsllib
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+texture_return gradient3Texture( in int gradientMode, in float gradientPositions[3], in vec3 gradientColors[3], in int interpolationModes[3], in texture_coordinate_info uvw, in float distortion )
+{
+ float position = gradientGetPosition( gradientMode, uvw.position.xy );
+ return( gradient3Recolor( gradientPositions, gradientColors, interpolationModes, 0, distortion, position ) );
+}
+
diff --git a/res/effectlib/gradientGetPosition.glsllib b/res/effectlib/gradientGetPosition.glsllib
new file mode 100644
index 0000000..4ceece0
--- /dev/null
+++ b/res/effectlib/gradientGetPosition.glsllib
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+// calculate the length of the hypotenuse of a right-angle triangle
+float hypot( in float x, in float y )
+{
+ // (sqrt( x * x + y * y )) might over- or underflow
+ // see http://en.wikipedia.org/wiki/Hypot for details
+ x = abs( x );
+ y = abs( y );
+ float t = min( x, y );
+ x = max( x, y );
+ t = t/x;
+ return( x * sqrt( 1.0 + ( t * t ) ) );
+}
+
+float gradientGetPosition( in int gradientMode, in vec2 xy )
+{
+ // clamp to [0,1]
+ vec2 tex = xy - floor( xy );
+
+ switch( gradientMode )
+ {
+ case gradient_linear :
+ return( tex.x );
+ case gradient_squared :
+ return( tex.x * tex.x );
+ case gradient_box :
+ // gradient is based on the distance from the center
+ return( max( abs( tex.x - 0.5 ), abs( tex.y - 0.5 ) ) );
+ case gradient_diagonal :
+ // gradient is based on the distance from the diagonal
+ return( sqrt(2.0) * abs( tex.x - tex.y ) );
+ case gradient_90_degree :
+ // Need to check
+ return( 0.0 );
+ case gradient_symmetric_90_degree :
+ // Need to check
+ return( 0.0 );
+ case gradient_radial :
+ // Distance from center
+ return( 2.0 * hypot( tex.x - 0.5, tex.y - 0.5 ) );
+ case gradient_360_degree :
+ // fall through need to check
+ default :
+ return( 0.0 );
+ }
+}
diff --git a/res/effectlib/luminance.glsllib b/res/effectlib/luminance.glsllib
new file mode 100644
index 0000000..067dc18
--- /dev/null
+++ b/res/effectlib/luminance.glsllib
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LUMINANCE_GLSLLIB
+#define LUMINANCE_GLSLLIB
+
+// Luma coefficients according to ITU-R Recommendation BT.709 (http://en.wikipedia.org/wiki/Rec._709)
+const vec3 yCoeff_709 = vec3( 0.2126, 0.7152, 0.0722 );
+
+float luminance( in vec3 v )
+{
+ return dot( v, yCoeff_709 );
+}
+
+vec3 RGBToYPbPr( in vec3 v )
+{
+ vec3 ypp;
+ ypp.x = luminance( v );
+ ypp.y = 0.5 * (v.b - ypp.x) / (1.0 - yCoeff_709.b);
+ ypp.z = 0.5 * (v.r - ypp.x) / (1.0 - yCoeff_709.r);
+
+ return ypp;
+}
+
+vec3 YPbPrToRGB( in vec3 v )
+{
+ vec3 outRGB;
+ outRGB.x = dot(vec3(1.0, 0.0, 1.575), v);
+ outRGB.y = dot(vec3(1.0, -0.187, -0.468), v);
+ outRGB.z = dot(vec3(1.0, 1.856, 0.0), v);
+
+ return outRGB;
+}
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/miNoise.glsllib b/res/effectlib/miNoise.glsllib
new file mode 100644
index 0000000..5fbff37
--- /dev/null
+++ b/res/effectlib/miNoise.glsllib
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 miNoise( in vec3 xyz )
+{
+ const float div = 1.0 / 256.0;
+
+ ivec3 itmp = ivec3( xyz );
+ ivec3 ixyz[3] = ivec3[]( itmp & 0xFF, itmp+1 & 0xFF, itmp+2 & 0xFF );
+ vec3 fxyz = xyz - floor( xyz );
+
+ vec3 dux, ux;
+ dux.z = fxyz.x * div;
+ dux.y = div - 2.0 * dux.z;
+ dux.x = dux.z - div;
+ ux.z = 0.5 * fxyz.x * dux.z;
+ ux.y = dux.z + 0.5 * ( div - fxyz.x * dux.z );
+ ux.x = ux.z - dux.z + 0.5 * div;
+
+ vec3 duy, uy;
+ duy.z = fxyz.y;
+ duy.y = 1.0 - 2.0 * duy.z;
+ duy.x = duy.z - 1.0;
+ uy.z = 0.5 * square( duy.z );
+ uy.y = duy.z + 0.5 - square( duy.z );
+ uy.x = uy.z - duy.z + 0.5;
+
+ float duz[3] = float[]( fxyz.z - 1.0, 1.0 - 2.0 * fxyz.z, fxyz.z );
+ float uz[3] = float[]( 0.5 * square( fxyz.z ) - fxyz.z + 0.5, fxyz.z + 0.5 - square( fxyz.z ), 0.5 * square( fxyz.z ) );
+
+ int xx = random255X( ixyz[0].x );
+ int yx = random255Y( ixyz[0].y );
+ int zx = random255Z( ixyz[0].z );
+ int xy = random255X( ixyz[1].x );
+ int yy = random255Y( ixyz[1].y );
+ int zy = random255Z( ixyz[1].z );
+
+ int xxxy = xx ^ xy;
+ int yxxy = yx ^ xy;
+ int zxxy = zx ^ xy;
+ int xxyy = xx ^ yy;
+ int yxyy = yx ^ yy;
+ int zxyy = zx ^ yy;
+ int xxzy = xx ^ zy;
+ int yxzy = yx ^ zy;
+ int zxzy = zx ^ zy;
+
+ int ixyzxx = ixyz[0].x ^ ixyz[1].x;
+ int ixyzyx = ixyz[0].y ^ ixyz[1].x;
+ int ixyzzx = ixyz[0].z ^ ixyz[1].x;
+ int ixyzxy = ixyz[0].x ^ ixyz[1].y;
+ int ixyzyy = ixyz[0].y ^ ixyz[1].y;
+ int ixyzzy = ixyz[0].z ^ ixyz[1].y;
+ int ixyzxz = ixyz[0].x ^ ixyz[1].z;
+ int ixyzyz = ixyz[0].y ^ ixyz[1].z;
+ int ixyzzz = ixyz[0].z ^ ixyz[1].z;
+
+
+ vec4 ret = vec4( 0.0, 0.0, 0.0, 0.0 );
+
+ for ( int i=0 ; i<3 ; i++ )
+ {
+ int iz = random255Z( ixyz[2][i] );
+
+ mat3x3 nf = mat3x3( vec3( float( random255W( xxxy ^ iz ^ random255W( ixyzxx ^ ixyz[2][i] ) ) )
+ , float( random255W( yxxy ^ iz ^ random255W( ixyzyx ^ ixyz[2][i] ) ) )
+ , float( random255W( zxxy ^ iz ^ random255W( ixyzzx ^ ixyz[2][i] ) ) ) )
+ , vec3( float( random255W( xxyy ^ iz ^ random255W( ixyzxy ^ ixyz[2][i] ) ) )
+ , float( random255W( yxyy ^ iz ^ random255W( ixyzyy ^ ixyz[2][i] ) ) )
+ , float( random255W( zxyy ^ iz ^ random255W( ixyzzy ^ ixyz[2][i] ) ) ) )
+ , vec3( float( random255W( xxzy ^ iz ^ random255W( ixyzxz ^ ixyz[2][i] ) ) )
+ , float( random255W( yxzy ^ iz ^ random255W( ixyzyz ^ ixyz[2][i] ) ) )
+ , float( random255W( zxzy ^ iz ^ random255W( ixyzzz ^ ixyz[2][i] ) ) ) ) );
+
+ float fxdz = dot( uy, dux * nf );
+ vec3 dy = ux * nf;
+ float dz = dot( uy, dy );
+
+ ret.x += uz[i] * fxdz;
+ ret.y += uz[i] * dot( duy, dy );
+ ret.z += duz[i] * dz;
+ ret.w += uz[i] * dz;
+ }
+ return( ret );
+}
+
diff --git a/res/effectlib/microfacetBSDF.glsllib b/res/effectlib/microfacetBSDF.glsllib
new file mode 100644
index 0000000..8e48910
--- /dev/null
+++ b/res/effectlib/microfacetBSDF.glsllib
@@ -0,0 +1,259 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MICROFACET_BSDF_GLSLLIB
+#define MICROFACET_BSDF_GLSLLIB 1
+
+
+float GtermSchlick( in mat3 tanFrame, in vec3 l, in vec3 v, in float roughness )
+{
+ float NdotV = clamp(dot(tanFrame[2], v), 0.0, 1.0);
+ float NdotL = clamp(dot(tanFrame[2], l), 0.0, 1.0);
+ float k = roughness*roughness*0.79788;
+
+ float G_V = NdotV / (NdotV * (1.0 + k) + k);
+ float G_L = NdotL / (NdotL * (1.0 + k) + k);
+
+ return clamp(( G_V * G_L ), 0.0, 1.0);
+}
+
+float GtermGGX( in mat3 tanFrame, in vec3 l, in vec3 v, in float roughness )
+{
+ float NdotV = clamp(dot(tanFrame[2], v), 0.0, 1.0);
+ float NdotL = clamp(dot(tanFrame[2], l), 0.0, 1.0);
+ float k = clamp(roughness*roughness, 0.00, 1.0);
+
+ float G_V = NdotV + sqrt( (NdotV - NdotV * k) * NdotV + k );
+ float G_L = NdotL + sqrt( (NdotL - NdotL * k) * NdotL + k );
+
+ return clamp( 2.0 / ( G_V * G_L ), 0.0, 1.0);
+}
+
+float DtermGGX( in mat3 tanFrame, in vec3 L, in vec3 V, in float roughness )
+{
+ float m = clamp(roughness, 0.04, 1.0);
+ float m2 = m*m;
+
+ vec3 H = normalize(L + V);
+ float NdotH = clamp(dot( tanFrame[2], H ), 0.0001, 1.0);
+ float NdotH2 = NdotH * NdotH;
+
+ float denom = NdotH2 * (m2 - 1.0) + 1.0;
+ float D = m2 / (PI * denom * denom);
+
+ return max( 0.0, D);
+}
+
+float DtermGGXAniso( in mat3 tanFrame, in vec3 L, in vec3 V, in float roughnessU, float roughnessV )
+{
+ float roughU = clamp(roughnessU, 0.04, 1.0);
+ float roughV = clamp(roughnessV, 0.04, 1.0);
+ vec3 H = normalize(L + V);
+ float NdotH = clamp( dot(tanFrame[2], H), 0.0001, 1.0 );
+ float m = PI * roughU * roughV;
+ float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 );
+ float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 );
+
+ float x2 = roughU*roughU;
+ float y2 = roughV*roughV;
+
+ float D = (HdotX*HdotX/x2) + (HdotY*HdotY/y2) + (NdotH*NdotH);
+ D = 1.0 / ( m * D * D );
+
+ return max( 0.0, D);
+}
+
+vec4 microfacetBSDF( in mat3 tanFrame, in vec3 L, in vec3 V, in vec3 lightSpecular, float ior,
+ in float roughnessU, in float roughnessV, int mode )
+{
+ vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 );
+ vec3 H = normalize(L + V);
+ float HdotL = clamp(dot(H, L), 0.0, 1.0);
+ float NdotL = dot(tanFrame[2], L);
+
+ if ( NdotL > 0.0 )
+ {
+ if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) )
+ {
+ float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] );
+ // G term
+ //float G = GtermSchlick( tanFrame, L, V, roughness );
+ float G = GtermGGX( tanFrame, L, V, roughness );
+
+ //float D = DtermGGX( tanFrame, L, V, roughness );
+ float D = DtermGGXAniso( tanFrame, L, V, roughnessU, roughnessV );
+ rgba.rgb = G * D * NdotL * lightSpecular;
+ }
+
+ if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) )
+ {
+ rgba.a = pow(1.0 - clamp(HdotL, 0.0, 1.0), 5.0);
+ }
+ }
+
+ return rgba;
+}
+
+vec4 microfacetBSDFEnvironment( in mat3 tanFrame, in vec3 viewDir, in float roughnessU, in float roughnessV, int mode )
+{
+ vec3 rgb = vec3( 0.0, 0.0, 0.0 );
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ if ( uEnvironmentMappingEnabled )
+ {
+ float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] );
+ vec3 R = reflect( -viewDir, tanFrame[2] );
+ rgb = 0.01 * evalEnvironmentMap( R, roughness );
+ rgb = microfacetBSDF( tanFrame, R, viewDir, rgb, 1.0, roughnessU, roughnessV, scatter_reflect ).rgb;
+ }
+#endif
+ return( vec4( rgb, 1.0 ) );
+}
+
+
+// see http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html
+
+float radicalInverse_VdC( uint bits)
+{
+ bits = (bits << 16u) | (bits >> 16u);
+ bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
+ bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
+ bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
+ bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
+ return float(bits) * 2.3283064365386963e-10; // / 0x100000000
+ }
+
+vec2 hammersley2d(uint i, uint N)
+{
+ return vec2(float(i)/float(N), radicalInverse_VdC(i));
+}
+
+vec2 hammersly[4] = vec2[4] (
+ vec2(0.0, 0.0),
+ vec2(0.25, 0.5),
+ vec2(0.5, 0.25),
+ vec2(0.75, 0.75)
+ );
+
+vec3 ImportanceGGX( in mat3 tanFrame, vec2 Xi, float roughness , vec3 N )
+{
+ float a = roughness * roughness;
+ float Phi = 2.0 * PI * Xi.y;
+ float CosTheta = (1.0 - Xi.x);
+ float SinTheta = sqrt( 1.0 - CosTheta * CosTheta );
+
+ vec3 H;
+ H.x = SinTheta * cos( Phi );
+ H.y = SinTheta * sin( Phi );
+ H.z = CosTheta;
+
+ // Tangent to world space
+ return tanFrame[0] * H.x + tanFrame[1] * H.y + tanFrame[2] * H.z;
+}
+
+float DtermGGXAnisoSampled( in mat3 tanFrame, in vec3 H, in float roughnessU, float roughnessV )
+{
+#if (MATERIAL_IS_NON_DIELECTRIC == 1)
+ float roughU = clamp(roughnessU*roughnessU, 0.01, 1.0);
+ float roughV = clamp(roughnessV*roughnessV, 0.01, 1.0);
+#else
+ float roughU = clamp(roughnessU, 0.02, 1.0);
+ float roughV = clamp(roughnessV, 0.02, 1.0);
+#endif
+
+ float NdotH = clamp( dot(tanFrame[2], H), 0.0001, 1.0 );
+ float m = PI * roughU * roughV;
+ float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 );
+ float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 );
+
+ float x2 = roughU*roughU;
+ float y2 = roughV*roughV;
+
+ float pdf = (HdotX*HdotX/x2) + (HdotY*HdotY/y2) + (NdotH*NdotH);
+ float D = 1.0 / ( m * pdf * pdf );
+
+ return max( 0.0, D);
+}
+
+vec3 sampleEnv(in vec3 L, float pdf, uint sampleCount, float roughness )
+{
+ vec2 envMapSize = vec2( textureSize( uEnvironmentTexture, 0 ) );
+ float envMapLevels = log2( max( envMapSize.x, envMapSize.y ) );
+
+ float a = 0.5*log2( float(envMapSize.x*envMapSize.y) / float(sampleCount) );
+ float d = 4.0 * (abs(L.z) + 1.0) * (abs(L.z) + 1.0);
+ float b = 0.5*log2( pdf * d );
+
+ // convert coord to 2D
+ vec2 tc = vec2( ( atan( L.x, -L.z ) + PI ) / ( 2.0 * PI ), acos( -L.y ) / PI );
+ float weight = step( 0.0001, roughness );
+
+ float lod = max( 0.0, min( (a - b)*weight, envMapLevels ));
+
+ return( textureLod( uEnvironmentTexture, tc, lod ).rgb );
+}
+
+vec4 microfacetSampledBSDF( in mat3 tanFrame, in vec3 viewDir, in float roughnessU, in float roughnessV, int mode )
+{
+ vec3 rgb = vec3( 0.0, 0.0, 0.0 );
+
+ float roughness = clamp( calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] ), 0.0, 1.0 );
+
+ vec3 R = reflect( -viewDir, tanFrame[2] );
+
+ const uint NumSamples = 4u;
+ for( uint i = 0u; i < NumSamples; i++ )
+ {
+ vec2 Xi = hammersly[i]; // pre computed values
+ //vec2 Xi = hammersley2d(i, NumSamples);
+ vec3 Half = ImportanceGGX( tanFrame, Xi, roughness , tanFrame[2] );
+ vec3 H = normalize( Half );
+
+ vec3 L = 2.0 * dot( viewDir, Half ) * Half - viewDir;
+ float NdotV = clamp( dot( tanFrame[2], viewDir ), 0.0001, 1.0 );
+ float NdotR = clamp( dot( tanFrame[2], R ), 0.0, 1.0 );
+ float NdotH = clamp( dot( tanFrame[2], H ), 0.0001, 1.0 );
+
+ if( NdotV > 0.0001 )
+ {
+ float G = GtermGGX( tanFrame, L, viewDir, roughness );
+ float D = DtermGGXAnisoSampled( tanFrame, H, roughnessU, roughnessV);
+
+ vec3 envColor = 0.01 * sampleEnv( L, D, NumSamples, roughness );
+
+ rgb += (envColor * G * D * NdotR) / ( 4.0 * NdotV * NdotH);
+ }
+ }
+
+ rgb /= float(NumSamples);
+
+ return( vec4( rgb, 1.0 ) );
+}
+
+#endif
diff --git a/res/effectlib/monoChannel.glsllib b/res/effectlib/monoChannel.glsllib
new file mode 100644
index 0000000..5c03a97
--- /dev/null
+++ b/res/effectlib/monoChannel.glsllib
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MONO_CHANNEL_GLSLLIB
+#define MONO_CHANNEL_GLSLLIB
+
+#ifdef QT3DS_DEFINE_API
+#define mono_alpha 0
+#define mono_average 1
+#define mono_luminance 2
+#define mono_maximum 3
+#endif
+
+float monoChannel( in vec4 t, in int monoSource )
+{
+ switch( monoSource )
+ {
+ case mono_alpha :
+ return( t.w );
+ case mono_average :
+ return( ( t.x + t.y + t.z ) / 3.0 );
+ case mono_luminance :
+ return( luminance( t.xyz ) );
+ case mono_maximum :
+ return( max( t.x, max( t.y, t.z ) ) );
+ default :
+ return( 1.0 );
+ }
+}
+
+#endif
diff --git a/res/effectlib/normalizedMix.glsllib b/res/effectlib/normalizedMix.glsllib
new file mode 100644
index 0000000..fc90b46
--- /dev/null
+++ b/res/effectlib/normalizedMix.glsllib
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 normalizedMix( in bsdf_component components[1] )
+{
+ return( components[0].component );
+}
+
+vec4 normalizedMix( in bsdf_component components[2] )
+{
+ float sum = components[0].weight + components[1].weight;
+ float invSum = ( sum <= 1.0 ) ? 1.0 : 1.0 / sum;
+ return( invSum * ( components[0].weight * components[0].component + components[1].weight * components[1].component ) );
+}
+
diff --git a/res/effectlib/perlinNoise.glsllib b/res/effectlib/perlinNoise.glsllib
new file mode 100644
index 0000000..347386c
--- /dev/null
+++ b/res/effectlib/perlinNoise.glsllib
@@ -0,0 +1,234 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// check out implementation from GPU Gems 1 and 2
+
+float fade( in float x )
+{
+ return( x * x * x * ( x * ( x * 6.0 - 15.0 ) + 10.0 ));
+ //return( x * x * ( 3.0 - 2.0 * x ) );
+}
+
+vec2 fade( in vec2 x )
+{
+ return( x * x * x * ( x * ( x * 6.0 - 15.0 ) + 10.0 ));
+ //return( x * x * ( 3.0 - 2.0 * x ) );
+}
+
+vec3 fade( in vec3 x )
+{
+ return( x * x * x * ( x * ( x * 6.0 - 15.0 ) + 10.0 ));
+ //return( x * x * ( 3.0 - 2.0 * x ) );
+}
+
+vec4 fade( in vec4 x )
+{
+ return( x * x * x * ( x * ( x * 6.0 - 15.0 ) + 10.0 ));
+ //return( x * x * ( 3.0 - 2.0 * x ) );
+}
+
+float influence( in int hash, in float x )
+{
+ return( x * texelFetch( randomGradient1D, ivec2(hash, 0), 0 ).x );
+}
+
+float influence( in int hash, in float x, in float y )
+{
+ return( dot( vec2( x, y ), texelFetch( randomGradient2D, ivec2(hash, 0), 0 ).xy ) );
+}
+
+float influence( in int hash, in float x, in float y, in float z )
+{
+ return( dot( vec3( x, y, z ), texelFetch( randomGradient3D, ivec2(hash, 0), 0 ).xyz ) );
+}
+
+float influence( in int hash, in float x, in float y, in float z, in float w )
+{
+ return( dot( vec4( x, y, z, w ), texelFetch( randomGradient4D, ivec2(hash, 0), 0 ) ) );
+}
+
+float perlinNoise( in float pos )
+{
+ float floorPos = floor( pos );
+ int intPos = int( floorPos );
+ float fracPos = pos - floorPos;
+
+ return( mix( influence( random255X( intPos ), fracPos ), influence( random255X( intPos+1 ), fracPos - 1.0 ), fade( fracPos ) ) );
+}
+
+float perlinNoise( in vec2 pos )
+{
+ vec2 floorPos = floor( pos );
+ vec2 fracPos = pos - floorPos;
+ vec2 fadedPos = fade( fracPos );
+
+ int ax = random255X( int(floorPos.x) );
+ int bx = random255X( int(floorPos.x) + 1 );
+ int ay = random255Y( int(floorPos.y) );
+ int by = random255Y( int(floorPos.y) + 1 );
+
+ return( mix( mix( influence( ax^ay, fracPos.x, fracPos.y )
+ , influence( bx^ay, fracPos.x - 1.0, fracPos.y ), fadedPos.x )
+ , mix( influence( ax^by, fracPos.x, fracPos.y - 1.0 )
+ , influence( bx^by, fracPos.x - 1.0, fracPos.y - 1.0 ), fadedPos.x ), fadedPos.y ) );
+}
+
+float perlinNoise( in vec3 pos )
+{
+ vec3 floorPos = floor( pos );
+ vec3 fracPos = pos - floorPos;
+ vec3 fadedPos = fade( fracPos );
+
+ int ax = random255X( int(floorPos.x) );
+ int bx = random255X( int(floorPos.x) + 1 );
+ int ay = random255Y( int(floorPos.y) );
+ int by = random255Y( int(floorPos.y) + 1 );
+ int az = random255Z( int(floorPos.z) );
+ int bz = random255Z( int(floorPos.z) + 1 );
+
+ int axay = ax ^ ay;
+ int bxay = bx ^ ay;
+ int axby = ax ^ by;
+ int bxby = bx ^ by;
+
+ return( mix( mix( mix( influence( axay^az, fracPos.x, fracPos.y, fracPos.z )
+ , influence( bxay^az, fracPos.x - 1.0, fracPos.y, fracPos.z ), fadedPos.x )
+ , mix( influence( axby^az, fracPos.x, fracPos.y - 1.0, fracPos.z )
+ , influence( bxby^az, fracPos.x - 1.0, fracPos.y - 1.0, fracPos.z ), fadedPos.x ), fadedPos.y )
+ , mix( mix( influence( axay^bz, fracPos.x, fracPos.y , fracPos.z - 1.0 )
+ , influence( bxay^bz, fracPos.x - 1.0, fracPos.y , fracPos.z - 1.0 ), fadedPos.x )
+ , mix( influence( axby^bz, fracPos.x, fracPos.y - 1.0, fracPos.z - 1.0 )
+ , influence( bxby^bz, fracPos.x - 1.0, fracPos.y - 1.0, fracPos.z - 1.0 ), fadedPos.x ), fadedPos.y ), fadedPos.z ) );
+}
+
+float perlinNoise( in vec4 pos )
+{
+ vec4 floorPos = floor( pos );
+ vec4 fracPos = pos - floorPos;
+ vec4 fadedPos = fade( fracPos );
+
+ int ax = random255X( int(floorPos.x) );
+ int bx = random255X( int(floorPos.x) + 1 );
+ int ay = random255Y( int(floorPos.y) );
+ int by = random255Y( int(floorPos.y) + 1 );
+ int az = random255Z( int(floorPos.z) );
+ int bz = random255Z( int(floorPos.z) + 1 );
+ int aw = random255W( int(floorPos.w) );
+
+ int axay = ax ^ ay;
+ int bxay = bx ^ ay;
+ int axby = ax ^ by;
+ int bxby = bx ^ by;
+
+ float result[2];
+ for ( int i=0 ; i<2 ; i++ )
+ {
+ int azaw = az ^ aw;
+ int bzaw = bz ^ aw;
+
+ result[i] = mix( mix( mix( influence( axay^azaw, fracPos.x, fracPos.y, fracPos.z, fracPos.w )
+ , influence( bxay^azaw, fracPos.x - 1.0, fracPos.y, fracPos.z, fracPos.w ), fadedPos.x )
+ , mix( influence( axby^azaw, fracPos.x, fracPos.y - 1.0, fracPos.z, fracPos.w )
+ , influence( bxby^azaw, fracPos.x - 1.0, fracPos.y - 1.0, fracPos.z, fracPos.w ), fadedPos.x ), fadedPos.y )
+ , mix( mix( influence( axay^bzaw, fracPos.x, fracPos.y, fracPos.z - 1.0, fracPos.w )
+ , influence( bxay^bzaw, fracPos.x - 1.0, fracPos.y, fracPos.z - 1.0, fracPos.w ), fadedPos.x )
+ , mix( influence( axby^bzaw, fracPos.x, fracPos.y - 1.0, fracPos.z - 1.0, fracPos.w )
+ , influence( bxby^bzaw, fracPos.x - 1.0, fracPos.y - 1.0, fracPos.z - 1.0, fracPos.w ), fadedPos.x ), fadedPos.y ), fadedPos.z );
+ aw = random255W( int(floorPos.w) + 1 );
+ fracPos.w -= 1.0;
+ }
+ return( mix( result[0], result[1], fadedPos.w ) );
+}
+
+float summedPerlinNoise( in vec3 pos, in int terms, in bool absNoise )
+{
+ float sum = 0.0;
+ float weight = 1.0;
+ vec3 p = pos;
+ while ( terms-- != 0 )
+ {
+ float noise = perlinNoise( p );
+ sum += weight * ( absNoise ? abs(noise) : noise );
+ p += p;
+ weight *= 0.5;
+ }
+ return( sum );
+}
+
+float summedPerlinNoise( in vec4 pos, in int terms, in bool absNoise )
+{
+ float sum = 0.0;
+ float weight = 1.0;
+ vec4 p = pos;
+ while ( terms-- != 0 )
+ {
+ float noise = perlinNoise( p );
+ sum += weight * ( absNoise ? abs(noise) : noise );
+ p += p;
+ weight *= 0.5;
+ }
+ return( sum );
+}
+
+float perlinNoise( in vec3 pos, in float time, in int terms, in vec3 turbulenceWeight, in bool absoluteNoise, in bool applyMarble
+ , in bool applyDent, in float noiseBands, in float noiseThresholdHigh, in float noiseThresholdLow )
+{
+ float noise = ( time == 0.0 ) ? summedPerlinNoise( pos, terms, absoluteNoise ) : summedPerlinNoise( vec4( pos, time ), terms, absoluteNoise );
+ if ( turbulenceWeight != vec3( 0.0, 0.0, 0.0 ) )
+ {
+ noise = sin( dot( pos, turbulenceWeight ) + noise );
+ }
+ if ( ! absoluteNoise )
+ {
+ noise = 0.5 * noise + 0.5; // scale [-1,1] to [0,1]
+ }
+ if ( applyMarble )
+ {
+ noise = cos( pos.x + 5.0 * noise ); // classic Perlin marble function, with magic 5.0
+ }
+ if ( applyDent )
+ {
+ noise = cube( noise );
+ }
+ if ( noiseBands != 1.0 )
+ {
+ // Create banding/stripes by using the fraction component only
+ noise *= noiseBands;
+ noise -= floor( noise );
+ noise += pow( 1.0 - noise, 20.0 );
+ }
+ if ( noiseThresholdLow < noiseThresholdHigh )
+ {
+ // clamp the noise
+ noise = clamp( ( noise - noiseThresholdLow ) / ( noiseThresholdHigh - noiseThresholdLow ), 0.0, 1.0 );
+ }
+ return( noise );
+}
+
diff --git a/res/effectlib/perlinNoiseBumpTexture.glsllib b/res/effectlib/perlinNoiseBumpTexture.glsllib
new file mode 100644
index 0000000..6e0982f
--- /dev/null
+++ b/res/effectlib/perlinNoiseBumpTexture.glsllib
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec3 perlinNoiseBumpTexture( in texture_coordinate_info uvw, in float factor, in float size, in bool applyMarble
+ , in bool applyDent, in float noisePhase, in int noiseLevels, in bool absoluteNoise, in vec3 noiseDistortion
+ , in float noiseThresholdHigh, in float noiseThresholdLow, in float noiseBands, in vec3 normal )
+{
+ float delta = 0.1 / noiseBands;
+ vec3 pos = uvw.position / size;
+
+ float r0 = perlinNoise( pos, noisePhase, noiseLevels, noiseDistortion, absoluteNoise
+ , applyMarble, applyDent, noiseBands, noiseThresholdLow, noiseThresholdHigh );
+ float r1 = perlinNoise( pos + delta * uvw.tangent_u, noisePhase, noiseLevels, noiseDistortion, absoluteNoise
+ , applyMarble, applyDent, noiseBands, noiseThresholdLow, noiseThresholdHigh );
+ float r2 = perlinNoise( pos + delta * uvw.tangent_v, noisePhase, noiseLevels, noiseDistortion, absoluteNoise
+ , applyMarble, applyDent, noiseBands, noiseThresholdLow, noiseThresholdHigh );
+ float r3 = perlinNoise( pos + delta * normal, noisePhase, noiseLevels, noiseDistortion, absoluteNoise
+ , applyMarble, applyDent, noiseBands, noiseThresholdLow, noiseThresholdHigh );
+
+ return( normalize( normal - factor * ( ( r1 - r0 ) * uvw.tangent_u + ( r2 - r0 ) * uvw.tangent_v + ( r3 - r0 ) * normal ) ) );
+}
+
diff --git a/res/effectlib/perlinNoiseTexture.glsllib b/res/effectlib/perlinNoiseTexture.glsllib
new file mode 100644
index 0000000..d968403
--- /dev/null
+++ b/res/effectlib/perlinNoiseTexture.glsllib
@@ -0,0 +1,11 @@
+texture_return perlinNoiseTexture( in texture_coordinate_info uvw, in vec3 color1, in vec3 color2, in float size, in bool applyMarble, in bool applyDent
+ , in float noisePhase, in int noiseLevels, in bool absoluteNoise, in vec3 noiseDistortion
+ , in float noiseThresholdHigh, in float noiseThresholdLow, in float noiseBands )
+{
+ float noise = perlinNoise( uvw.position / size, noisePhase, noiseLevels, noiseDistortion, absoluteNoise
+ , applyMarble, applyDent, noiseBands, noiseThresholdLow, noiseThresholdHigh );
+ texture_return tr;
+ tr.tint = mix( color1, color2, noise );
+ tr.mono = average( tr.tint );
+ return( tr );
+}
diff --git a/res/effectlib/physGlossyBSDF.glsllib b/res/effectlib/physGlossyBSDF.glsllib
new file mode 100644
index 0000000..ece836b
--- /dev/null
+++ b/res/effectlib/physGlossyBSDF.glsllib
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef PHYS_GLOSSY_BSDF_GLSLLIB
+#define PHYS_GLOSSY_BSDF_GLSLLIB 1
+
+float sqr(float v)
+{
+ return v*v;
+}
+
+float Gterm( float cosTheta, float roughness )
+{
+ float k = roughness * 0.31830988618; // roughness / pi
+ return clamp( ( cosTheta / (cosTheta*(1.0-k) + k) + (1.0 - k*k) ) * 0.5, 0.0, 1.0 );
+}
+
+
+// PKC -- I came up with an anisotropic microfacet BSDF that has some superficial similarity to GGX in
+// its appearance, but is far simpler and more compact in its implementation. It uses a Cauchy-like lobe
+// shape and because it has an analytic solution to its antiderivative, we can compute the integral given
+// the support boundaries. It's also possible to importance sample at perfect efficiency.
+// This is generally a good choice for any material which has a polish coating to it.
+// TODO : The way roughness scales with this BSDF is roughly equivalent to roughness^2 would affect Ward.
+// It's debatable whether we want that to be done as a sqrt here or as square in Ward.
+vec4 kggxGlossyBSDF( in mat3 tanFrame, in vec3 L, in vec3 V, in vec3 lightSpecular, float ior,
+ in float roughnessU, in float roughnessV, int mode )
+{
+ vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 );
+ vec3 H = normalize(L + V);
+
+ // NOTE : This BSDF allows roughness up to 2.0 which allows it
+ // to trend partially into Oren-Nayar diffuse territory, but we should
+ // assume that anything that falls under "glossy" should still be
+ // in the range of 0..1
+ float ax = clamp(roughnessU, 0.0001, 2.0);
+ float ay = clamp(roughnessV, 0.0001, 2.0);
+
+ float NdotL = dot(tanFrame[2], L);
+ float HdotL = clamp(dot(H, L), 0.0, 1.0);
+
+ // if (0.0 < NdotL)
+ // {
+ vec3 Haf = L + V;
+
+ float HdotN = clamp( dot(H, tanFrame[2]), 0.0001, 1.0 );
+ float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 );
+ float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 );
+
+ float sigma = sqrt(ax * ay);
+ float sigma2 = ax * ay * HdotN;
+
+ float thetaI = acos( dot(V, tanFrame[2]) );
+ float maxThetaI = (thetaI + 1.57079632679) * 0.5;
+ float minThetaI = (thetaI - 1.57079632679) * 0.5;
+ float range = atan(maxThetaI / sigma) - atan(minThetaI / sigma);
+ range = max( range, ax*ay );
+
+ if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) )
+ {
+ float PDF = sigma2 / (sigma2 + sqr(HdotX / ax) + sqr(HdotY / ay));
+ PDF *= dot(Haf, Haf) / (4.71238898038 * sqr(dot(Haf, L)) * ax*ay * sigma * sqr(range));
+
+ rgba.rgb = Gterm(HdotL, sigma) * lightSpecular * PDF * max(NdotL, 0.0);
+ }
+ if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) )
+ {
+ rgba.a = pow(1.0 - clamp(HdotL, 0.0, 1.0), 5.0);
+ }
+// }
+ return rgba;
+}
+
+vec4 kggxGlossyDefaultMtl( in vec3 normal, in vec3 tangent, in vec3 L, in vec3 V, in vec3 lightSpecular,
+ in vec3 materialSpecular, in float roughU, in float roughV )
+{
+ vec3 bitan = normalize(cross(normal, tangent));
+ mat3 tanFrame = mat3( normalize(cross( bitan, normal) ), bitan, normal );
+ return vec4(materialSpecular, 1.0) * kggxGlossyBSDF( tanFrame, L, V, lightSpecular, 1.5, roughU, roughV, scatter_reflect );
+}
+
+// To be exact, this is not the Ward lobe as Ward originally described (there are a few flaws in
+// the original paper, which had spawned half a dozen corrective measures as papers of their own).
+// This is a Ward-Duer variant with Geisler-Moroder's modified normalization factor which serves
+// to bound the albedo.
+vec4 wardGlossyBSDF( in mat3 tanFrame, in vec3 L, in vec3 V, in vec3 lightSpecular, in float ior,
+ in float roughnessU, in float roughnessV, int mode )
+{
+ vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 );
+ vec3 H = normalize(L + V);
+
+ // specular
+ float ax = clamp(roughnessU, 0.0001, 1.0);
+ float ay = clamp(roughnessV, 0.0001, 1.0);
+
+ float NdotL = dot(tanFrame[2], L);
+ float HdotL = clamp(dot(H, L), 0.0, 1.0);
+
+// if (0.0 < NdotL)
+// {
+ vec3 Haf = L + V;
+
+ float HdotN = clamp( dot(H, tanFrame[2]), 0.0001, 1.0 );
+ float HdotX = clamp( abs(dot(H, tanFrame[0])), 0.0001, 1.0 );
+ float HdotY = clamp( abs(dot(H, tanFrame[1])), 0.0001, 1.0 );
+
+ if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) )
+ {
+ float exponent = -(sqr(HdotX/ax) + sqr(HdotY/ay));
+ exponent /= sqr(HdotN);
+ float PDF = exp(exponent) / (4.0 * 3.1415926535 * ax * ay);
+ PDF *= 4.0 * dot(Haf, Haf) / sqr(sqr(dot(Haf,tanFrame[2])));
+
+ rgba.rgb = Gterm(HdotL, sqrt(ax * ay)) * lightSpecular * PDF * max(NdotL, 0.0);
+ }
+ if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) )
+ {
+ rgba.a = pow(1.0 - clamp(HdotL, 0.0, 1.0), 5.0);
+ }
+// }
+ return rgba;
+}
+
+vec4 wardGlossyDefaultMtl( in vec3 normal, in vec3 tangent, in vec3 L, in vec3 V, in vec3 lightSpecular,
+ in vec3 materialSpecular, in float roughU, in float roughV )
+{
+ vec3 bitan = normalize(cross(normal, tangent));
+ mat3 tanFrame = mat3( normalize(cross( bitan, normal) ), bitan, normal );
+ return vec4(materialSpecular, 1.0) * wardGlossyBSDF( tanFrame, L, V, lightSpecular, 1.5, roughU, roughV, scatter_reflect );
+}
+
+#endif
diff --git a/res/effectlib/random255.glsllib b/res/effectlib/random255.glsllib
new file mode 100644
index 0000000..ef586a7
--- /dev/null
+++ b/res/effectlib/random255.glsllib
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// random [0..255] calculated by some simple Linear Congruential Generator (LCG)
+// Verfied, that each function is just a permutation of {0,...,255}, that is, with 0<=x<=255, each value in [0,255] is returned once
+int random255X( in int x )
+{
+ return( ( ( 8365 * ( x & 0xFF ) + 32285 ) >> 0 ) & 0xFF );
+}
+
+int random255Y( in int x )
+{
+ return( ( ( 3152 * ( x & 0xFF ) + 11819 ) >> 4 ) & 0xFF );
+}
+
+int random255Z( in int x )
+{
+ return( ( ( 119 * ( x & 0xFF ) + 18747 ) >> 0 ) & 0xFF );
+}
+
+int random255W( in int x )
+{
+ return( ( ( 26814 * ( x & 0xFF ) + 9642 ) >> 1 ) & 0xFF );
+}
+
+ivec3 random255XYZ( in ivec3 xyz )
+{
+ return( ivec3( random255X( xyz.x ), random255Y( xyz.y ), random255Z( xyz.z ) ) );
+}
diff --git a/res/effectlib/refraction.glsllib b/res/effectlib/refraction.glsllib
new file mode 100644
index 0000000..f961c50
--- /dev/null
+++ b/res/effectlib/refraction.glsllib
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// this is entirly phiysical incorrect
+// We just use this to fake distortion when we have no environment available
+// The displacement is calculated on ior
+vec3 refraction( in sampler2D sampler, in float materialIOR )
+{
+ vec3 displace = fresnel( viewDir, vec3( materialIOR ));
+
+ float xdir = abs( viewDir.x );
+ float ydir = abs( viewDir.y );
+
+ vec2 texSize = vec2( textureSize( sampler, 0 ) );
+ vec2 newUV = vec2(gl_FragCoord.xy/texSize);
+ if ( xdir > ydir)
+ {
+ newUV = ( viewDir.x > 0.0) ? newUV + displace.xy : newUV - displace.xy;
+ }
+ else
+ {
+ newUV = ( viewDir.y > 0.0) ? newUV - displace.xy : newUV + displace.xy;
+ }
+
+ vec3 refractColor = texture( sampler, newUV ).rgb;
+
+ return refractColor;
+}
+
+// This should really not be used, but it's there for the sake of testing.
+vec3 refractBlur( in sampler2D sampler, in vec3 viewDir, in float materialIOR, in float blurWidth )
+{
+ // This is really terrible, but at least is a little better than
+ vec3 displace = viewDir * materialIOR;
+
+ vec2 texSize = vec2( textureSize( sampler, 0 ) );
+ texSize = vec2(1.0) / texSize;
+ vec2 newUV = vec2(gl_FragCoord.xy * texSize);
+ newUV += displace.xy * 0.005;
+
+ //vec3 refractColor = texture( sampler, newUV ).rgb;
+ vec3 refractColor = vec3(0);
+ int sz = int(ceil(blurWidth));
+ float wtsum = 0.0;
+
+ for (int y = -sz; y <= sz; ++y)
+ {
+ for (int x = -sz; x <= sz; ++x)
+ {
+ float wt = float(x*x + y*y) / (blurWidth * 0.5);
+ wt = exp2(-wt);
+ //refractColor += wt * textureOffset( sampler, newUV, ivec2(x, y) ).rgb;
+ vec2 uvOfs = vec2(x, y) * texSize;
+ refractColor += wt * texture( sampler, newUV+uvOfs).rgb;
+ wtsum += wt;
+ }
+ }
+
+ return refractColor / wtsum;
+}
diff --git a/res/effectlib/rotationTranslationScale.glsllib b/res/effectlib/rotationTranslationScale.glsllib
new file mode 100644
index 0000000..78bb8dd
--- /dev/null
+++ b/res/effectlib/rotationTranslationScale.glsllib
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef ROTATION_TRANSLATION_SCALE_GLSLLIB
+#define ROTATION_TRANSLATION_SCALE_GLSLLIB
+
+mat4 rotationTranslationScale( in vec3 rotation, in vec3 translation, in vec3 scaling )
+{
+ mat4 st = mat4( scaling.x, 0.0, 0.0, 0.0
+ , 0.0, scaling.y, 0.0, 0.0
+ , 0.0, 0.0, scaling.z, 0.0
+ , translation.x - 0.5, translation.y - 0.5, translation.z - 0.5, 1.0 );
+ vec3 s = sin( rotation );
+ vec3 c = cos( rotation );
+ mat4 r = mat4( c.y * c.z, -c.x * s.z + s.x * s.y * c.z, s.x * s.z + c.x * s.y * c.z, 0.0
+ , c.y * s.z, c.x * c.z + s.x * s.y * s.z, -s.x * c.z + c.x * s.y * s.z, 0.0
+ , -s.y , s.x * c.y , c.x * c.y , 0.0
+ , 0.5 , 0.5 , 0.5 , 1.0 );
+ return( st * r );
+}
+
+
+#endif
diff --git a/res/effectlib/sampleArea.glsllib b/res/effectlib/sampleArea.glsllib
new file mode 100644
index 0000000..01f3a74
--- /dev/null
+++ b/res/effectlib/sampleArea.glsllib
@@ -0,0 +1,180 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SAMPLE_AREA_GLSLLIB
+#define SAMPLE_AREA_GLSLLIB 1
+
+#include "funcareaLightVars.glsllib"
+#include "funccalculateDiffuseAreaOld.glsllib"
+#include "funcsampleAreaGlossyDefault.glsllib"
+
+float rand1d(vec2 n)
+{
+ return 0.5 + 0.5 * fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);
+}
+
+vec3 quatRotate( vec4 q, vec3 v )
+{
+ return v + 2.0 * cross( cross( v, q.xyz ) + q.w * v, q.xyz );
+}
+
+vec3 lightUVToRay( in vec3 pos, in vec3 lightPos, in mat3 lightFrame, in float width, in float height, in vec2 uv )
+{
+ width *= dot(lightFrame[0], lightFrame[0]);
+ height *= dot(lightFrame[1], lightFrame[1]);
+
+ vec3 hitPos = lightPos + (uv.x - 0.5) * width * lightFrame[0] + (uv.y - 0.5) * height * lightFrame[1];
+ return normalize(hitPos - pos);
+}
+
+// This is usable only for planar rectangular lights. Will need to break this down into different paths for different shapes.
+float getUVHitBounds( in vec3 pos, in mat3 lightFrame, in vec3 lightPos, in float width, in float height, in vec3 V0, in vec3 V1, in vec3 V2, in vec3 V3, out vec2 UVmin, out vec2 UVmax )
+{
+ float d0 = dot( lightPos, lightFrame[2] );
+ float d1 = dot( pos, lightFrame[2] );
+
+ // If the point is behind the light, it can't be illuminated.
+ if (d0 < d1)
+ {
+ UVmin = vec2( -1.0, -1.0 );
+ UVmax = vec2( -1.0, -1.0 );
+ return 0.0;
+ }
+
+ // Compute where all the rays of the light beam hit the light plane
+ float t[4];
+ vec3 v[4];
+
+ v[0] = V0; v[1] = V1; v[2] = V2; v[3] = V3;
+ t[0] = (d0 - d1) / dot(V0, lightFrame[2]);
+ t[1] = (d0 - d1) / dot(V1, lightFrame[2]);
+ t[2] = (d0 - d1) / dot(V2, lightFrame[2]);
+ t[3] = (d0 - d1) / dot(V3, lightFrame[2]);
+
+ UVmin = vec2(1e6, 1e6);
+ UVmax = vec2(-1e6, -1e6);
+
+ // If any of them are "negative" relative to the ray direction
+ // We don't want to consider them.
+ bool weight[4];
+ float wtsum = 0.0;
+ weight[0] = (t[0] > 0.0);
+ weight[1] = (t[1] > 0.0);
+ weight[2] = (t[2] > 0.0);
+ weight[3] = (t[3] > 0.0);
+
+ width *= dot(lightFrame[0], lightFrame[0]);
+ height *= dot(lightFrame[1], lightFrame[1]);
+
+ for (int i = 0; i < 4; ++i)
+ {
+ vec3 curPos = pos + v[i] * t[i];
+ curPos -= lightPos;
+ vec2 curUV = vec2( dot(curPos, lightFrame[0]) / width, dot(curPos, lightFrame[1]) / height ) + vec2(0.5);
+
+ UVmin = min(UVmin, curUV); UVmax = max(UVmax, curUV);
+ wtsum += weight[i] ? 0.25 : 0.0;
+ }
+
+ return wtsum;
+}
+
+// Shooting a narrow beam, and then scaling up that beam based on the actual roughness
+vec4 sampleAreaGlossy( in mat3 tanFrame, in vec3 pos, in int lightIdx, in vec3 viewDir, in float roughU, in float roughV )
+{
+ float sigmaU = clamp( 0.5 * roughU, 0.005, 0.5 );
+ float sigmaV = clamp( 0.5 * roughV, 0.005, 0.5 );
+ vec2 UVset[5];
+
+ mat3 lightFrame = mat3( arealights[lightIdx].right.xyz, arealights[lightIdx].up.xyz, -arealights[lightIdx].direction.xyz );
+
+ float thetaI = acos( dot(viewDir, lightFrame[2]) );
+ vec2 minMaxThetaH = vec2( (thetaI - 1.5707) * 0.5,
+ (thetaI + 1.5707) * 0.5 );
+ vec4 sinCosThetaH = vec4( abs(sin(minMaxThetaH)), abs(cos(minMaxThetaH)) );
+
+ // First thing we do is compute a small-scale version of the ray hit for a very tiny roughness
+ // then we scale that up based on the _actual_ roughness.
+ float wt = computeMicroHit( pos, tanFrame, arealights[lightIdx].position.xyz, lightFrame,
+ arealights[lightIdx].right.w, arealights[lightIdx].up.w, viewDir, UVset );
+ UVset[0] -= UVset[4]; UVset[1] -= UVset[4];
+ UVset[2] -= UVset[4]; UVset[3] -= UVset[4];
+
+ UVset[0] *= mix(1.0, sinCosThetaH.y / 0.005, sigmaU); UVset[1] *= mix(1.0, sinCosThetaH.x / 0.005, sigmaU);
+ UVset[2] *= mix(1.0, sinCosThetaH.y / 0.005, sigmaV); UVset[3] *= mix(1.0, sinCosThetaH.x / 0.005, sigmaV);
+
+ UVset[0] += UVset[4]; UVset[1] += UVset[4];
+ UVset[2] += UVset[4]; UVset[3] += UVset[4];
+
+ vec2 UVmin = UVset[4], UVmax = UVset[4];
+ vec2 cminUV, cmaxUV;
+ UVmin = min(UVmin, UVset[0]); UVmax = max(UVmax, UVset[0]);
+ UVmin = min(UVmin, UVset[1]); UVmax = max(UVmax, UVset[1]);
+ UVmin = min(UVmin, UVset[2]); UVmax = max(UVmax, UVset[2]);
+ UVmin = min(UVmin, UVset[3]); UVmax = max(UVmax, UVset[3]);
+
+ cminUV = clamp( UVmin, vec2(0.0), vec2(1.0) );
+ cmaxUV = clamp( UVmax, vec2(0.0), vec2(1.0) );
+
+ vec2 hitScale = (cmaxUV - cminUV);
+ vec2 fullScale = (UVmax - UVmin);
+ float intensity = ( hitScale.x * hitScale.y ) / max( fullScale.x * fullScale.y, 0.0001 );
+
+ return vec4( wt * intensity );
+}
+
+vec4 sampleAreaDiffuse( in mat3 tanFrame, in vec3 pos, in int lightIdx )
+{
+ float intensity = 0.0;
+ vec3 finalDir;
+ intensity = calculateDiffuseAreaOld( arealights[lightIdx].direction.xyz, arealights[lightIdx].position.xyz,
+ arealights[lightIdx].up, arealights[lightIdx].right, pos, finalDir );
+ intensity *= clamp( dot(finalDir, tanFrame[2]), 0.0, 1.0 );
+ return vec4( intensity );
+}
+
+vec4 sampleAreaDiffuseTransmissive( in mat3 tanFrame, in vec3 pos, in int lightIdx, in vec4 transmissiveColor, in float translucentFalloff, float lightWrap )
+{
+ float intensity = 0.0;
+ vec3 finalDir;
+ intensity = calculateDiffuseAreaOld( arealights[lightIdx].direction.xyz, arealights[lightIdx].position.xyz,
+ arealights[lightIdx].up, arealights[lightIdx].right, pos, finalDir );
+ intensity *= clamp( dot(finalDir, -tanFrame[2]), 0.0, 1.0 );
+
+ float l = 0.2126 * transmissiveColor.r + 0.7152 * transmissiveColor.g + 0.0722 * transmissiveColor.b;
+
+ float I = max( 0.0, ((dot(finalDir, -tanFrame[2]) + lightWrap)/ (1.0 + lightWrap)) );
+ float translucent_thickness = l * l;
+ float translucent_thickness_exp = exp( translucent_thickness * translucentFalloff) * I;
+
+ return vec4( translucent_thickness_exp * intensity );
+}
+
+#endif
diff --git a/res/effectlib/sampleLight.glsllib b/res/effectlib/sampleLight.glsllib
new file mode 100644
index 0000000..05ad5b4
--- /dev/null
+++ b/res/effectlib/sampleLight.glsllib
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SAMPLE_LIGHT_GLSLLIB
+#define SAMPLE_LIGHT_GLSLLIB
+
+#define MAX_NUM_SHADOWS 8
+
+#ifndef QT3DS_ENABLE_SSM
+#define QT3DS_ENABLE_SSM 0
+#endif
+
+#include "SSAOCustomMaterial.glsllib"
+#if QT3DS_ENABLE_SSM
+#include "shadowMapping.glsllib"
+#endif
+
+#include "funcsampleLightVars.glsllib"
+
+#if QT3DS_ENABLE_SSM
+uniform sampler2D shadowMaps[MAX_NUM_SHADOWS];
+uniform samplerCube shadowCubes[MAX_NUM_SHADOWS];
+uniform int uNumShadowMaps;
+uniform int uNumShadowCubes;
+#endif
+
+void sampleLight(in LightSource light,
+ in vec3 pos,
+ out vec3 wi,
+ out vec3 opAmbient,
+ out vec3 opDiffuse,
+ out vec3 opSpecular)
+{
+ float att = 1.0;
+ if (light.position.w == 0.0) // directional light
+ {
+ wi = normalize(light.position.xyz);
+#if QT3DS_ENABLE_SSM
+ if ( light.shadowIdx >= 0 )
+ att *= sampleOrthographic( shadowMaps[light.shadowIdx], light.shadowControls, light.shadowView, pos, vec2(1.0, light.shadowControls.z) );
+#endif
+ }
+ else if (light.width > 0.01 && light.height > 0.01) // area light
+ {
+ // This approach is based on the 1994 Tech Report by James Arvo --
+ // The Irradiance Jacobian for Partially Occluded Polyhedral Sources
+ // The nice thing about this approach is that it extends to arbitrary geometry (if we choose to support it),
+ // and accounts for distance & geometric attenuation automatically.
+ // Downsides -- only really works for diffuse reflection, does not account properly for an area light that
+ // intersects its receiver, in which case it illuminates as if the light source is two-sided Lambertian emitter.
+ vec3 v0 = light.position.xyz - (light.right.xyz * light.width * 0.5) - (light.up.xyz * light.height * 0.5);
+ vec3 v1 = light.position.xyz - (light.right.xyz * light.width * 0.5) + (light.up.xyz * light.height * 0.5);
+ vec3 v2 = light.position.xyz + (light.right.xyz * light.width * 0.5) + (light.up.xyz * light.height * 0.5);
+ vec3 v3 = light.position.xyz + (light.right.xyz * light.width * 0.5) - (light.up.xyz * light.height * 0.5);
+
+ v0 = normalize( v0 - pos ); v1 = normalize( v1 - pos ); v2 = normalize( v2 - pos ); v3 = normalize( v3 - pos );
+
+ float a01 = acos( clamp( dot(v0, v1), -1.0, 1.0 ) );
+ float a12 = acos( clamp( dot(v1, v2), -1.0, 1.0 ) );
+ float a23 = acos( clamp( dot(v2, v3), -1.0, 1.0 ) );
+ float a30 = acos( clamp( dot(v3, v0), -1.0, 1.0 ) );
+
+ wi = vec3( 0.0 );
+ wi -= normalize(cross( v0, v1 )) * a01;
+ wi -= normalize(cross( v1, v2 )) * a12;
+ wi -= normalize(cross( v2, v3 )) * a23;
+ wi -= normalize(cross( v3, v0 )) * a30;
+
+ att = length(wi) * 0.15915494309; // solid angle / 2*pi
+ wi = normalize(wi);
+ att *= clamp( dot( pos - light.position.xyz, light.direction.xyz ), 0.0, 1.0 );
+#if QT3DS_ENABLE_SSM
+ if ( light.shadowIdx >= 0 )
+ att *= sampleCubemap( shadowCubes[light.shadowIdx], light.shadowControls, light.shadowView, light.position.xyz, pos, vec2(1.0, light.shadowControls.z) );
+#endif
+ }
+ else // point or spot light
+ {
+ wi = light.position.xyz - pos;
+ float dist = length(wi);
+ wi = wi / dist; // == normalize(wi);
+ att = 1.0 / (light.constantAttenuation + (light.linearAttenuation + light.quadraticAttenuation * dist) * dist);
+ /*
+ if (light.spotCutoff < 180.0) // spot light
+ {
+ float spot = max(0.0, dot(wi, -light.direction.xyz));
+ att *= (spot >= cos(light.spotCutoff * PI / 180.0)) ? pow(spot, light.spotExponent) : 0.0;
+ }
+ */
+#if QT3DS_ENABLE_SSM
+ if ( light.shadowIdx >= 0 )
+ att *= sampleCubemap( shadowCubes[light.shadowIdx], light.shadowControls, light.shadowView, light.position.xyz, pos, vec2(1.0, light.shadowControls.z) );
+#endif
+ }
+ float shadow = customMaterialShadow( -light.direction.xyz, pos );
+ opAmbient = att * light.ambient.xyz;
+ opDiffuse = att * shadow * light.diffuse.xyz;
+ opSpecular = att * shadow * light.specular.xyz;
+}
+
+#include "sampleArea.glsllib"
+
+#endif
diff --git a/res/effectlib/sampleProbe.glsllib b/res/effectlib/sampleProbe.glsllib
new file mode 100644
index 0000000..6556e51
--- /dev/null
+++ b/res/effectlib/sampleProbe.glsllib
@@ -0,0 +1,473 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SAMPLE_PROBE_GLSLLIB
+#define SAMPLE_PROBE_GLSLLIB 1
+
+uniform sampler2D light_probe;
+uniform vec4 light_probe_props;
+uniform vec4 light_probe_rotation;
+uniform vec4 light_probe_offset; // light_probe_offset.w = number of mipmaps
+
+#if QT3DS_ENABLE_LIGHT_PROBE_2
+uniform sampler2D light_probe2;
+uniform vec4 light_probe2_props;
+#endif
+
+#if QT3DS_ENABLE_IBL_FOV
+uniform vec4 light_probe_opts;
+#endif
+
+float noise1d(vec2 n)
+{
+ return 0.5 + 0.5 * fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);
+}
+
+mat3 orthoNormalize( in mat3 tanFrame )
+{
+ mat3 outMat;
+ outMat[0] = normalize( cross( tanFrame[1], tanFrame[2] ) );
+ outMat[1] = normalize( cross( tanFrame[2], outMat[0] ) );
+ outMat[2] = tanFrame[2];
+
+ return outMat;
+}
+
+mat3 tangentFrame( vec3 N, vec3 p )
+{
+ // get edge vectors of the pixel triangle
+ vec3 dp1 = dFdx( p );
+ vec3 dp2 = dFdy( p );
+ // Using dPdu and dPdv would be nicer, but the nature of our materials
+ // are not ones with intrinsic UVs, so we can't really go there.
+// vec2 duv1 = dFdx( uv );
+// vec2 duv2 = dFdy( uv );
+
+ // solve the linear system
+ vec3 dp2perp = cross( dp2, N );
+ vec3 dp1perp = cross( N, dp1 );
+// vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
+// vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
+
+ vec3 T = normalize(dp1perp);
+ vec3 B = normalize(dp2perp);
+ return mat3( T , B , N );
+}
+
+vec2 transformSample( vec2 origUV, vec4 probeRot, vec2 probeOfs )
+{
+ vec2 retUV;
+ retUV.x = dot( vec3(origUV, 1.0), vec3(probeRot.xy, probeOfs.x) );
+ retUV.y = dot( vec3(origUV, 1.0), vec3(probeRot.zw, probeOfs.y) );
+ return retUV;
+}
+
+// This is broken out into its own routine so that if we get some other
+// format image than a lat-long, then we can account for that by changing
+// the code here alone.
+vec2 getProbeSampleUV( vec3 smpDir, vec4 probeRot, vec2 probeOfs )
+{
+ vec2 smpUV;
+
+#if QT3DS_ENABLE_IBL_FOV
+ smpUV = vec2(atan(smpDir.x, smpDir.z), asin(smpDir.y));
+ // assume equirectangular HDR spherical map (instead of cube map) and warp sample
+ // UV coordinates accordingly
+ smpUV *= 2.0 * vec2(0.1591596371160, 0.318319274232054);
+ // Default FOV is 180 deg = pi rad. Narrow the FOV
+ // by scaling texture coordinates by the ratio of
+ // incoming FOV to 180 degrees default
+ smpUV *= 3.14159265358 / light_probe_opts.x;
+#else
+ smpUV.x = atan( smpDir.x, smpDir.z) / 3.14159265359;
+ smpUV.y = 1.0 - (acos(smpDir.y) / 1.57079632679);
+#endif
+ smpUV = transformSample( smpUV.xy * 0.5, probeRot, probeOfs ) + vec2(0.5, 0.5);
+
+ return smpUV;
+}
+
+vec4 getTopLayerSample( vec3 inDir, float lodShift, vec3 lodOffsets )
+{
+#if QT3DS_ENABLE_LIGHT_PROBE_2
+ if ( light_probe2_props.w < 0.5 )
+ return vec4(0.0, 0.0, 0.0, 0.0);
+
+ vec2 smpUV = getProbeSampleUV( inDir, vec4(1.0, 0.0, 0.0, 1.0), light_probe_props.xy );
+ smpUV.x -= 0.5;
+ smpUV.x *= light_probe2_props.x;
+ smpUV.x += light_probe2_props.y;
+
+ vec4 retVal = 0.4 * textureLod( light_probe2, smpUV , lodShift );
+ retVal += 0.2 * textureLod( light_probe2, smpUV , lodShift+lodOffsets.x );
+ retVal += 0.3 * textureLod( light_probe2, smpUV , lodShift+lodOffsets.y );
+ retVal += 0.1 * textureLod( light_probe2, smpUV , lodShift+lodOffsets.z );
+ return retVal;
+#else
+ return vec4(0.0, 0.0, 0.0, 0.0);
+#endif
+}
+
+vec3 getProbeSample( vec3 smpDir, float lodShift, vec3 normal )
+{
+ vec2 smpUV = getProbeSampleUV( smpDir, light_probe_rotation, light_probe_offset.xy );
+ return textureLod( light_probe, smpUV , lodShift ).xyz;
+}
+
+vec3 getProbeWeightedSample( vec3 smpDir, float lodShift, float roughness, vec3 normal )
+{
+ // This gives us a weighted sum that approximates the total filter support
+ // of the full-blown convolution.
+ vec2 smpUV = getProbeSampleUV( smpDir, light_probe_rotation, light_probe_offset.xy );
+ float wt = 1.0;
+
+#if QT3DS_ENABLE_IBL_FOV
+ wt = min(wt, smoothstep(roughness * -0.25, roughness * 0.25, smpUV.x));
+ wt = min(wt, smoothstep(roughness * -0.25, roughness * 0.25, smpUV.y));
+ wt = min(wt, 1.0 - smoothstep(1.0 - roughness*0.25, 1.0 + roughness*0.25, smpUV.x));
+ wt = min(wt, 1.0 - smoothstep(1.0 - roughness*0.25, 1.0 + roughness*0.25, smpUV.y));
+#endif
+
+ vec3 lodOffsets;
+ lodOffsets.x = mix(-2.0, -0.70710678, roughness);
+ lodOffsets.y = min( 2.0 * smoothstep(0.0, 0.1, roughness), 2.0 - 1.29289 * smoothstep(0.1, 1.0, roughness) );
+ lodOffsets.z = min( 6.0 * smoothstep(0.0, 0.1, roughness), 6.0 - 4.585786 * smoothstep(0.1, 1.0, roughness) );
+
+ ivec2 iSize = textureSize(light_probe, 0);
+ vec3 ddx = dFdx( smpDir ) * float(iSize.x);
+ vec3 ddy = dFdy( smpDir ) * float(iSize.y);
+// vec2 ddxUV = dFdx( smpUV ) * float(iSize.x);
+// vec2 ddyUV = dFdy( smpUV ) * float(iSize.y);
+
+ vec2 deriv;
+ deriv.x = max( dot(ddx, ddx), dot(ddy, ddy) );
+// deriv.y = max( dot(ddxUV, ddxUV), dot(ddyUV, ddyUV) );
+ deriv = clamp( deriv, vec2(1.0), vec2(iSize.x * iSize.y) );
+ vec2 lodBound = 0.5 * log2( deriv ) - vec2(1.0);
+
+// float minLod = 0.5 * (lodBound.x + lodBound.y);
+ float minLod = lodBound.x;
+ float maxLod = log2( max(float(iSize.x), float(iSize.y)) );
+ minLod = clamp( minLod / maxLod, 0.0, 1.0 );
+ minLod *= minLod * maxLod;
+
+ lodShift = max( lodShift, minLod );
+
+ vec3 retVal = 0.4 * textureLod( light_probe, smpUV , lodShift ).xyz;
+ retVal += 0.2 * textureLod( light_probe, smpUV , max(minLod, lodShift+lodOffsets.x) ).xyz;
+ retVal += 0.3 * textureLod( light_probe, smpUV , lodShift+lodOffsets.y ).xyz;
+ retVal += 0.1 * textureLod( light_probe, smpUV , lodShift+lodOffsets.z ).xyz;
+
+#if QT3DS_ENABLE_LIGHT_PROBE_2
+ vec4 topSmp = getTopLayerSample( smpDir, lodShift, lodOffsets );
+ vec3 tempVal = mix( retVal, topSmp.xyz, topSmp.w );
+ retVal = mix( retVal, tempVal, light_probe2_props.z );
+#endif
+
+ if (light_probe_props.z > -1.0) {
+ float ctr = 0.5 + 0.5 * light_probe_props.z;
+ float vertWt = smoothstep(ctr-roughness*0.25, ctr+roughness*0.25, smpUV.y);
+ float wtScaled = mix(1.0, vertWt, light_probe_props.z + 1.0);
+ retVal *= wtScaled;
+ }
+
+ return retVal * wt;
+}
+
+vec3 getProbeAnisoSample( vec3 smpDir, float roughU, float roughV, mat3 tanFrame )
+{
+ float minRough = min(roughU, roughV);
+ float maxRough = max(roughU, roughV);
+
+ float lodMin = log2( (minRough*3.0 + maxRough)*0.25 ) + (light_probe_offset.w - 2.0);
+
+ float ratio = clamp( maxRough / minRough, 1.01, 27.0);
+ vec2 texSize = vec2( textureSize( light_probe, int(floor( lodMin )) ) );
+ texSize = mix( texSize, texSize * 0.5, fract(lodMin) );
+
+ // Boundary of 1.0..9.0 is just to keep the number of samples to within a
+ // reasonable number of samples in the filter. Similarly, with the clamping
+ // of the ratio to a max of 27.0 is just to prevent the step size in the filter
+ // to be no bigger than 3 texels (beyond which, there are some artifacts at high
+ // roughness, aka low texture res).
+ float stepFig = clamp(floor( ratio ), 1.0, 9.0);
+
+ // numSteps is half the number of samples we need to take, which makes it
+ // the number of steps to take on each side.
+ int numSteps = int( floor(stepFig * 0.5) );
+
+ vec2 smpUV = getProbeSampleUV( smpDir, light_probe_rotation, light_probe_offset.xy );
+ vec4 result = vec4(0.0);
+
+ vec3 smpDirOfs = (maxRough == roughU) ? 0.01 * tanFrame[0] : 0.01 * tanFrame[1];
+ vec2 stepPos = getProbeSampleUV(normalize(smpDir + smpDirOfs), light_probe_rotation, light_probe_offset.xy);
+ vec2 stepNeg = getProbeSampleUV(normalize(smpDir - smpDirOfs), light_probe_rotation, light_probe_offset.xy);
+ stepPos -= smpUV; stepNeg -= smpUV;
+ stepPos *= texSize; stepNeg *= texSize;
+
+ // This ensures that we step along a size that makes sense even if one of the two
+ // sammpling directions wraps around the edges of the IBL texture.
+ smpDirOfs /= min( length(stepPos), length(stepNeg) );
+ smpDirOfs *= ratio / stepFig;
+
+ float sigma = mix(0.0, 2.0, ratio / 27.0);
+ sigma *= sigma;
+
+ float wt = (1.0 / (ratio - 1.0)) + 1.0;
+ result.xyz += wt * getProbeWeightedSample( smpDir, lodMin, minRough, tanFrame[2] );
+ result.w += wt;
+ for (int i = 0; i < numSteps; ++i)
+ {
+ wt = sigma / (sigma + float(i * i));
+ vec2 uv0 = getProbeSampleUV(normalize(smpDir + smpDirOfs * float(i)), light_probe_rotation, light_probe_offset.xy);
+ vec2 uv1 = getProbeSampleUV(normalize(smpDir - smpDirOfs * float(i)), light_probe_rotation, light_probe_offset.xy);
+ result.xyz += wt * textureLod( light_probe, uv0 , lodMin ).xyz;
+ result.w += wt;
+ result.xyz += wt * textureLod( light_probe, uv1 , lodMin ).xyz;
+ result.w += wt;
+ }
+
+ result /= result.w;
+ return result.xyz;
+}
+
+vec4 sampleDiffuse( mat3 tanFrame )
+{
+ if ( light_probe_props.w < 0.005 )
+ return vec4( 0.0 );
+
+// if ( light_probe_offset.w > 0.5 )
+// {
+ // The LOD offset comes from the assumption that a full diffuse convolution
+ // has a support of pi/2, which translates into x pixels, and the base 2 log
+ // gives us this LOD... Technically, "x" pixels depends on what the original
+ // texture resolution was, which is why we use light_probe_offset.w, which holds
+ // the number of mip levels the texture has.
+
+ return vec4( light_probe_props.w * getProbeWeightedSample( tanFrame[2], light_probe_offset.w - 2.65149613, 1.0, tanFrame[2] ), 1.0 );
+// }
+
+ /*
+ // PKC -- the code below is for full-blown IBL, which we'll skip for now
+
+ // Hand-calculated Hammersley points for t = 2, n = 33
+ // I exclude the 0,0 first point, hence why n=33 and not 32
+ // Nice thing about 2d Hammersley points is that any subset is
+ // also stratified, so even if I have 1000 points and truncate
+ // anywhere, I'm fine. Each of these represent the y of an xy
+ // while x for the kth point is always (k+1)/n.
+ float kernel[32];
+ kernel[0] = 0.5; kernel[1] = 0.25;
+ kernel[2] = 0.75; kernel[3] = 0.125;
+ kernel[4] = 0.625; kernel[5] = 0.375;
+ kernel[6] = 0.875; kernel[7] = 0.0625;
+ kernel[8] = 0.5625; kernel[9] = 0.3125;
+ kernel[10] = 0.8125; kernel[11] = 0.1875;
+ kernel[12] = 0.6875; kernel[13] = 0.4375;
+ kernel[14] = 0.9375; kernel[15] = 0.03125;
+ kernel[16] = 0.53125; kernel[17] = 0.28125;
+ kernel[18] = 0.78125; kernel[19] = 0.15625;
+ kernel[20] = 0.65625; kernel[21] = 0.40625;
+ kernel[22] = 0.90625; kernel[23] = 0.09375;
+ kernel[24] = 0.59375; kernel[25] = 0.34375;
+ kernel[26] = 0.84375; kernel[27] = 0.28175;
+ kernel[28] = 0.71875; kernel[29] = 0.46875;
+ kernel[30] = 0.96875; kernel[31] = 0.015625;
+
+ float phiShift = noise1d(gl_FragCoord.xy) - 0.5;
+
+ vec3 ret = vec3(0, 0, 0);
+
+ int ct = 24;
+ float step = 25.0;
+
+ // Importance sampling a cosine-weighted distribution. Since this
+ // matches the BSDF exactly, we are just going to assume that the PDF
+ // and the BSDF cancel out in sampling, so we just need to accumulate
+ // texture colors. The noise function puts randomized "twist" into
+ // the sampled directions.
+ for( int i = 0; i < ct; ++i )
+ {
+ vec3 localDir;
+ float phi = 6.28318530718 * (kernel[i] + phiShift);
+ float cosTheta = sqrt( float(i+1) / step);
+ localDir.z = sqrt(1.0 - cosTheta*cosTheta);
+ localDir.x = cos(phi) * cosTheta;
+ localDir.y = sin(phi) * cosTheta;
+ vec3 smpDir = tanFrame[0]*localDir.x + tanFrame[1]*localDir.y + tanFrame[2]*localDir.z;
+
+
+ float lodShift = light_probe_offset.w - 2 + log2( 3.1415926535 / (localDir.z * step) );
+ vec3 smpColor = getProbeSample( smpDir, lodShift, tanFrame[2] );
+
+ // The assumption here is that the BSDF and the sampling PDF are identical
+ // so they cancel out and therefore, we don't need to include it here.
+ ret += smpColor;
+ }
+
+ ret *= aoFactor / 24.0;
+ return ret;
+ */
+}
+
+vec4 sampleDiffuseCustomMaterial( vec3 normal, vec3 worldPos, float aoFactor )
+{
+
+ mat3 tanFrame = tangentFrame( normal, worldPos );
+ return sampleDiffuse( tanFrame );
+}
+
+vec4 sampleGlossyAniso( mat3 tanFrame, vec3 viewDir, float roughU, float roughV )
+{
+ if ( light_probe_props.w < 0.005 )
+ return vec4( 0.0 );
+
+ // PKC : If we do the full IBL sampling, it's useful to square the roughnesses because
+ // it makes the effect of roughness feel more linear in the low end. This isn't necessary
+ // for fast IBL.
+// float sigmaU = clamp(roughU*roughU, 0.0001, 1.0);
+// float sigmaV = clamp(roughV*roughV, 0.0001, 1.0);
+ float sigmaU = smoothstep( 0.0, 1.0, clamp(roughU, 0.0001, 1.0) );
+ float sigmaV = smoothstep( 0.0, 1.0, clamp(roughV, 0.0001, 1.0) );
+ vec3 ret = vec3(0, 0, 0);
+
+// if ( light_probe_offset.w > 0.5 )
+// {
+ vec3 smpDir = reflect( -viewDir, tanFrame[2] );
+ float sigma = sqrt(sigmaU * sigmaV);
+
+ // Compute the Geometric occlusion/self-shadowing term
+ float NdotL = clamp( dot( smpDir, tanFrame[2] ), 0.0, 0.999995);
+ float k = sigma * 0.31830988618; // roughness / pi
+ float Gl = clamp( (NdotL / (NdotL*(1.0-k) + k) + (1.0 - k*k)) * 0.5, 0.0, 1.0 );
+
+ vec3 outColor;
+
+ outColor = getProbeAnisoSample( smpDir, sigmaU, sigmaV, tanFrame );
+
+ return vec4( light_probe_props.w * Gl * outColor, 1.0 );
+// }
+
+ // PKC -- the code below is for full-blown IBL, which we'll skip for now
+
+/*
+ float step = clamp( ceil(32.0 * sqrt(max(sigmaU, sigmaV))), 4.0, 32.0 );
+ int actualCt = int(step);
+ float phiShift = noise1d(gl_FragCoord.xy) - 0.5;
+
+ // Hand-calculated Hammersley points for t = 2, n = 33
+ // I exclude the 0,0 first point, hence why n=33 and not 32
+ // Nice thing about 2d Hammersley points is that any subset is
+ // also stratified, so even if I have 1000 points and truncate
+ // anywhere, I'm fine. Each of these represent the y of an xy
+ // while x for the kth point is always (k+1)/n.
+ float kernel[32];
+ kernel[0] = 0.5; kernel[1] = 0.25;
+ kernel[2] = 0.75; kernel[3] = 0.125;
+ kernel[4] = 0.625; kernel[5] = 0.375;
+ kernel[6] = 0.875; kernel[7] = 0.0625;
+ kernel[8] = 0.5625; kernel[9] = 0.3125;
+ kernel[10] = 0.8125; kernel[11] = 0.1875;
+ kernel[12] = 0.6875; kernel[13] = 0.4375;
+ kernel[14] = 0.9375; kernel[15] = 0.03125;
+ kernel[16] = 0.53125; kernel[17] = 0.28125;
+ kernel[18] = 0.78125; kernel[19] = 0.15625;
+ kernel[20] = 0.65625; kernel[21] = 0.40625;
+ kernel[22] = 0.90625; kernel[23] = 0.09375;
+ kernel[24] = 0.59375; kernel[25] = 0.34375;
+ kernel[26] = 0.84375; kernel[27] = 0.28175;
+ kernel[28] = 0.71875; kernel[29] = 0.46875;
+ kernel[30] = 0.96875; kernel[31] = 0.015625;
+
+ float thetaI = acos( dot(viewDir, tanFrame[2]) );
+
+ // NOTE : The model I'm using here is actually based on the KGGX model used in
+ // physGlossyBSDF. This is my own variation on the original GGX which uses something
+ // closer to a pure Cauchy distribution in tangent space, but also supports anisotropy.
+ for (int i = 0; i < actualCt; ++i)
+ {
+ vec3 localDir;
+
+ float phi = 6.28318530718 * (kernel[i] + phiShift);
+ float u = float(i + 1) / (step + 1.0);
+ float rU = cos(phi) * sigmaU;
+ float rV = sin(phi) * sigmaV;
+ float sigma = sqrt(rU * rU + rV * rV);
+
+ float boundA = atan( ((thetaI - 1.57079632679) * 0.5) / sigma );
+ float boundB = atan( ((thetaI + 1.57079632679) * 0.5) / sigma );
+ float t = (1.0 - u) * boundA + u * boundB;
+ float thetaH = tan( t ) * sigma;
+
+ float cosThetaH = cos( thetaH );
+ float sinThetaH = sin( thetaH );
+ localDir.z = cosThetaH;
+ localDir.y = sin(phi) * sinThetaH;
+ localDir.x = cos(phi) * sinThetaH;
+
+ vec3 halfDir = tanFrame[0]*localDir.x + tanFrame[1]*localDir.y + tanFrame[2]*localDir.z;
+ halfDir = normalize(halfDir);
+ vec3 smpDir = reflect( -viewDir, halfDir );
+
+ vec2 scaledXY = localDir.xy / vec2(sigmaU, sigmaV);
+ float PDF = (sigmaU*sigmaV) / (sigmaU*sigmaV + dot(scaledXY, scaledXY));
+ vec3 Haf = smpDir + viewDir; // We need the unnormalized half vecter as well as the normalized one
+ float HdotL = dot(halfDir, smpDir);
+ // normalize the PDF to compute the filter support
+ // This gives us the ideal miplevel at which to sample the texture map.
+ PDF *= dot(Haf, Haf) / (4.0 * dot(Haf, smpDir) * HdotL * sigmaU*sigmaV * (boundB-boundA)*(boundB-boundA));
+
+ // Again assuming that the pdf and BSDF are equivalent -- that's not generally valid,
+ // but it saves a lot of ALU cycles.
+ float lodShift = log2( 512.0 * sigma / PDF );
+
+ float k = sigma * 0.31830988618; // roughness / pi
+ float Gl = clamp( (HdotL / (HdotL*(1.0-k) + k) + (1.0 - k*k)) * 0.5, 0.0, 1.0 );
+
+ vec3 smpColor = Gl * getProbeSample( smpDir, lodShift, tanFrame[2] );
+ ret += smpColor;
+ }
+ ret /= float(actualCt);
+ return vec4(ret, 1.0);
+*/
+}
+
+vec4 sampleGlossy( mat3 tanFrame, vec3 viewDir, float roughness )
+{
+ return sampleGlossyAniso( tanFrame, viewDir, roughness, roughness );
+}
+
+vec4 sampleGlossyCustomMaterial( vec3 normal, vec3 worldPos, vec3 viewDir, float roughness )
+{
+ mat3 tanFrame = tangentFrame( normal, worldPos );
+ return sampleGlossy( tanFrame, viewDir, roughness );
+}
+
+#endif
diff --git a/res/effectlib/screenSpaceAO.glsllib b/res/effectlib/screenSpaceAO.glsllib
new file mode 100644
index 0000000..54204a1
--- /dev/null
+++ b/res/effectlib/screenSpaceAO.glsllib
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SCREEN_SPACE_AO_GLSLLIB
+#define SCREEN_SPACE_AO_GLSLLIB 1
+
+#include "depthpass.glsllib"
+
+
+float hashRot(vec2 pos)
+{
+ // Basically an odd-even hash.
+ float px = 2.0 * fract(floor(pos.x) * 0.5);
+ float py = fract(floor(pos.y) * 0.5);
+
+ return px + py;
+}
+
+vec3 quatRotate( vec4 q, vec3 v )
+{
+ return v + 2.0 * cross( cross( v, q.xyz ) + q.w * v, q.xyz );
+}
+
+vec3 getViewSpacePos( sampler2D depthSampler, vec2 camProps, vec2 UV, vec4 UvToEye )
+{
+ float sampleDepth = getDepthValue( texture(depthSampler, UV), camProps );
+ sampleDepth = depthValueToLinearDistance( sampleDepth, camProps );
+
+ vec2 scaledUV = (UV * UvToEye.xy) + UvToEye.zw;
+ return vec3(scaledUV * sampleDepth, sampleDepth);
+}
+
+vec2 computeDir( vec2 baseDir, int v )
+{
+ float ang = 3.1415926535 * hashRot( gl_FragCoord.xy ) + float(v - 1);
+ vec2 vX = vec2(cos(ang), sin(ang));
+ vec2 vY = vec2(-sin(ang), cos(ang));
+
+ return vec2( dot(baseDir, vX), dot(baseDir, vY) );
+}
+
+vec2 offsetDir( vec2 baseDir, int v )
+{
+ float ang = float(v - 1);
+ vec2 vX = vec2(cos(ang), sin(ang));
+ vec2 vY = vec2(-sin(ang), cos(ang));
+
+ return vec2( dot(baseDir, vX), dot(baseDir, vY) );
+}
+
+float SSambientOcclusion(sampler2D depthSampler, vec3 viewNorm, vec4 aoParams, vec4 aoParams2, vec2 camProps, vec4 aoScreen, vec4 UvToEye)
+{
+ float ret = 0.0;
+
+ vec2 centerUV = gl_FragCoord.xy * aoScreen.zw;
+ vec3 viewPos = getViewSpacePos( depthSampler, camProps, centerUV, UvToEye );
+ viewPos += viewNorm * aoParams.w;
+
+ float screenRadius = aoParams.y * aoScreen.y / viewPos.z;
+ if (screenRadius < 1.0) { return 1.0; }
+
+ vec3 kernel[9];
+
+ // The X and Y are the 2d direction, while the Z is the height of the sphere at that point.
+ // In essence, it normalizes the 3d vector, but we're really interested in the 2D offset.
+ kernel[0] = vec3(-0.1376476, 0.2842022, 0.948832);
+ kernel[1] = vec3(-0.626618, 0.4594115, 0.629516);
+ kernel[2] = vec3(-0.8903138, -0.05865424, 0.451554);
+ kernel[3] = vec3(0.2871419, 0.8511679, 0.439389);
+ kernel[4] = vec3(-0.1525251, -0.3870117, 0.909372);
+ kernel[5] = vec3(0.6978705, -0.2176773, 0.682344);
+ kernel[6] = vec3(0.7343006, 0.3774331, 0.5642);
+ kernel[7] = vec3(0.1408805, -0.88915, 0.4353);
+ kernel[8] = vec3(-0.6642616, -0.543601, 0.5130);
+
+ int radLevels = int(floor(aoParams2.x));
+ float radStep = 1.0 / aoParams2.x;
+
+ for (int j = 1; j <= radLevels; ++j)
+ {
+ for (int i = 0; i < 9; ++i)
+ {
+ float curRange = aoParams.y * radStep * float(j);
+ float curRadius = curRange * kernel[i].z;
+
+ vec3 smpDir;
+ smpDir.xy = computeDir(kernel[i].xy, j) * aoParams2.y + (1.0 - aoParams2.y) * offsetDir(kernel[i].xy, j);
+ smpDir.z = kernel[i].z;
+ smpDir *= curRange;
+
+ vec2 smpUV = centerUV.xy + smpDir.xy * aoScreen.zw;
+
+ // First method is based on Horizon-Based AO
+ vec3 samplePos = getViewSpacePos( depthSampler, camProps, smpUV, UvToEye );
+ vec3 smpVec = samplePos - viewPos;
+
+ float lenRad = dot(smpVec, smpVec);
+ smpVec = normalize(smpVec);
+ float lenDot = dot(smpVec, viewNorm);
+
+ lenRad /= aoParams.y*aoParams.y;
+ float falloff = smoothstep(8.0, 0.0, (lenRad - 1.0) * 0.125);
+ float occl = 1.0 - clamp(lenDot * falloff, 0.0, 1.0);
+
+ ret += occl * occl;
+ }
+ }
+
+ ret = (ret) / (9.0 * float(radLevels));
+
+ // Blend between soft and hard based on softness param
+ // NOTE : the 0.72974 is actually an gamma-inverted 0.5 (assuming gamma 2.2)
+ // Would not need this if we linearized color instead.
+ float hardCut = (1.0 - aoParams.z) * 0.72974;
+ ret = smoothstep(0.0, 1.0, (ret - hardCut) / (1.0 - hardCut));
+
+ // Blend between full and no occlusion based on strength param
+ ret = aoParams.x * ret + (1.0 - aoParams.x);
+
+ return ret;
+}
+
+#endif
diff --git a/res/effectlib/screenSpaceDO.glsllib b/res/effectlib/screenSpaceDO.glsllib
new file mode 100644
index 0000000..2ccc69f
--- /dev/null
+++ b/res/effectlib/screenSpaceDO.glsllib
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SCREEN_SPACE_DO_GLSLLIB
+#define SCREEN_SPACE_DO_GLSLLIB 1
+
+#include "depthpass.glsllib"
+
+vec3 getViewSpacePos( sampler2D depthSampler, vec2 camProps, vec2 UV, vec4 UvToEye )
+{
+ float sampleDepth = getDepthValue( texture(depthSampler, UV), camProps );
+ sampleDepth = depthValueToLinearDistance( sampleDepth, camProps );
+
+ vec2 scaledUV = (UV * UvToEye.xy) + UvToEye.zw;
+ return vec3(scaledUV * sampleDepth, sampleDepth);
+}
+
+float shadowOcclusion(sampler2D depthSampler, vec3 lightDir, vec3 worldPos, mat4 viewMat, mat4 viewProj, vec4 shadowParams, vec2 camProps, vec4 aoScreen, vec4 UvToEye)
+{
+ vec3 viewPos = getViewSpacePos( depthSampler, camProps, ( gl_FragCoord.xy * aoScreen.zw ), UvToEye );
+ float depth = viewPos.z;
+
+ // Get the screen-space UV
+ vec2 centerUV = gl_FragCoord.xy * aoScreen.zw;
+
+ float screenDist = shadowParams.y * 3.1415926535 * aoScreen.y / viewPos.z;
+ if (screenDist < 1.0) { return 1.0; }
+
+ vec3 viewL = normalize( (viewMat * vec4(lightDir, 0)).xyz );
+
+ float steps = min( screenDist, 20.0 );
+ int maxCt = int(steps);
+ float step = 3.1415926535 * shadowParams.y / float(maxCt);
+ float ret = float(maxCt);
+
+ for( int i = 0; i < maxCt; ++i )
+ {
+ vec3 ray = lightDir * step * float(i);
+ vec3 samplePos = worldPos - ray;
+
+ vec4 smpUV = viewProj * vec4(samplePos, 1.0);
+ smpUV /= smpUV.w;
+ smpUV.xy = (smpUV.xy + 1.0) * 0.5;
+
+ vec3 testPos = getViewSpacePos( depthSampler, camProps, smpUV.xy, UvToEye );
+ testPos.z += shadowParams.w;
+ vec3 testVec = normalize(viewPos - testPos);
+ testVec -= viewL;
+ float isBehind = clamp( testVec.z, 0.0, 1.0 );
+ float diff = (testPos.z - depth) / shadowParams.y;
+ ret -= isBehind * (1.0 / (1.0 + diff * diff));
+ }
+
+ ret /= float(maxCt); // divide by number of samples;
+ // Blend between soft and hard based on softness param
+ // NOTE : the 0.72974 is actually an gamma-inverted 0.5 (assuming gamma 2.2)
+ // Would not need this if we linearized color instead.
+ float hardCut = (ret <= 0.72974) ? 0.0 : 1.0;
+ ret = shadowParams.z * ret + (1.0 - shadowParams.z) * hardCut;
+
+ // Blend between full and no occlusion based on strength param
+ ret = shadowParams.x * ret + (1.0 - shadowParams.x);
+
+ return ret;
+}
+
+// For reference
+/*
+float glossyOcclusionBasis(sampler2D depthSampler, mat3 tanFrame, vec3 worldPos, mat4 viewProj, vec3 viewDir, vec4 shadowParams, vec2 camProps, float roughness)
+{
+ float ret = 16.0;
+
+ float kernel[16];
+ kernel[0] = 0.5; kernel[1] = 0.25;
+ kernel[2] = 0.75; kernel[3] = 0.125;
+ kernel[4] = 0.625; kernel[5] = 0.375;
+ kernel[6] = 0.875; kernel[7] = 0.0625;
+ kernel[8] = 0.5625; kernel[9] = 0.3125;
+ kernel[10] = 0.8125; kernel[11] = 0.1875;
+ kernel[12] = 0.6875; kernel[13] = 0.4375;
+ kernel[14] = 0.9375; kernel[15] = 0.03125;
+
+ float rough = clamp(roughness, 0.0001, 1.0);
+ float normFac = 1.0 / (rough);
+
+ float phiShift = hashRot( gl_FragCoord.xy );
+ ivec2 iCoords = ivec2( gl_FragCoord.xy );
+ float depth = getDepthValue( texelFetch(depthSampler, iCoords, 0) );
+ depth = depthValueToLinearDistance( depth, camProps );
+
+ for( int i = 0; i < 16; ++i )
+ {
+ vec3 localDir;
+ float phi = 6.28318530718 * (kernel[i] + phiShift);
+ float cosTheta = sqrt( float(i+1) / 33.0);
+ localDir.z = sqrt(1.0 - cosTheta*cosTheta) * normFac;
+ localDir.x = cos(phi) * cosTheta;
+ localDir.y = sin(phi) * cosTheta;
+
+ localDir = normalize(localDir);
+
+ vec3 halfDir = tanFrame[0]*localDir.x + tanFrame[1]*localDir.y + tanFrame[2]*localDir.z;
+ vec3 ray = reflect( -viewDir, halfDir ) * shadowParams.x;
+
+ vec4 samplePos = vec4( worldPos + ray, 1.0 );
+
+ vec4 sampleProj = viewProj * samplePos;
+ sampleProj /= sampleProj.w;
+ sampleProj.xy = (sampleProj.xy + 1.0) * 0.5;
+ float sampleDepth = getDepthValue( texture(depthSampler, sampleProj.xy) );
+
+ sampleDepth = depthValueToLinearDistance( sampleDepth, camProps );
+
+ // Occlusion is applied based on a Cauchy distribution filter
+ // But with a "dead zone" for the very close samples. By subtracting it from 16,
+ // which represents no occlusion (16/16 = 1), we let nearby occluders have a
+ // lot of effect, but far away occluders do not. Furthermore, the "dead zone"
+ // in the filter means that the extremely near (which we assume to be part of the
+ // same surface) are also excluded to try and limit self-occlusion.
+ float occlDist = 4.0 * max(depth - sampleDepth - shadowParams.y, 0.0) / shadowParams.x;
+ float occlFactor = 1.0 / ( 1.0 + occlDist*occlDist*0.04 );
+ occlFactor -= 1.0 / ( 1.0 + occlDist*occlDist*4.0 );
+ ret -= min(2.0 * occlFactor, 1.0);
+ }
+
+ ret /= 16.0; // divide by number of samples;
+ return ret;
+}
+*/
+
+#endif
diff --git a/res/effectlib/shadowMapping.glsllib b/res/effectlib/shadowMapping.glsllib
new file mode 100644
index 0000000..df351f9
--- /dev/null
+++ b/res/effectlib/shadowMapping.glsllib
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SHADOW_MAPPING_GLSLLIB
+#define SHADOW_MAPPING_GLSLLIB
+
+#include "depthpass.glsllib"
+
+float sampleParaboloid( in sampler2D shadowMap, in vec4 shadowControls, in mat4 shadowMatrix, in vec3 worldPos, in vec2 cameraProps, out vec2 smpUV )
+{
+ vec4 projCoord = shadowMatrix * vec4( worldPos, 1.0 );
+ vec3 smpCoord = projCoord.xyz / projCoord.w;
+
+ float ptDepth = depthValueToLinearDistance( 1.0 - smpCoord.z, cameraProps );
+ ptDepth = (ptDepth - cameraProps.x) / (cameraProps.y - cameraProps.x);
+ smpCoord = normalize( smpCoord.xyz );
+ smpCoord.xy /= -( smpCoord.z + 1.0 );
+ smpCoord.xy = vec2(1.0) - smpCoord.xy;
+ smpCoord.xy *= 0.5;
+
+ smpUV = smpCoord.xy; // This is just for debug purposes to ensure what the sampled UV cooord is.
+
+ float sampleDepth = texture( shadowMap, smpCoord.xy ).x + shadowControls.x;
+ sampleDepth *= sampleDepth;
+ ptDepth *= ptDepth;
+ float shadowFac = min(1.0, exp(shadowControls.y * sampleDepth * sampleDepth) / exp(shadowControls.y * ptDepth * ptDepth));
+
+ smpUV.xy *= shadowFac;
+ return shadowFac;
+}
+
+float sampleCubemap( in samplerCube shadowCube, in vec4 shadowControls, in mat4 shadowViewMat, in vec3 lightPos, in vec3 worldPos, in vec2 cameraProps )
+{
+ vec3 viewDir = worldPos - vec3(lightPos.x, lightPos.y, lightPos.z);
+ float ptDepth = length(viewDir.xyz);
+ vec4 viewCoord = shadowViewMat * vec4( viewDir.xyz, 0.0 );
+ viewCoord.xyz /= ptDepth;
+ ptDepth = clamp((ptDepth - 1.0) / (cameraProps.y - 1.0), 0.0, 1.0);
+
+ float smpDepth = texture( shadowCube, viewDir.xyz ).x + shadowControls.x;
+
+ float shadowFac = min(1.0, exp(shadowControls.y * smpDepth) / exp(shadowControls.y * ptDepth));
+ return shadowFac;
+}
+
+float sampleOrthographic( in sampler2D shadowMap, in vec4 shadowControls, in mat4 shadowMatrix, in vec3 worldPos, in vec2 cameraProps )
+{
+ vec4 projCoord = shadowMatrix * vec4( worldPos, 1.0 );
+ vec3 smpCoord = projCoord.xyz / projCoord.w;
+
+ float sampleDepth = texture( shadowMap, smpCoord.xy ).x + shadowControls.x;
+
+ return min(1.0, exp(shadowControls.y * sampleDepth) / exp(shadowControls.y * smpCoord.z));
+}
+
+
+struct ParaboloidMapResult
+{
+ vec4 m_Position;
+ vec4 m_WorldPos;
+};
+
+ParaboloidMapResult VertexParaboloidDepth(vec3 pos, mat4 inMVP)
+{
+ vec4 glPos = inMVP * vec4( pos, 1.0 );
+ glPos /= glPos.w;
+ glPos.xyz = normalize( glPos.xyz );
+ vec4 world_pos;
+ world_pos.w = glPos.z;
+ glPos.xy /= glPos.z + 1.0;
+ world_pos.xyz = pos.xyz;
+
+ ParaboloidMapResult retval;
+ retval.m_Position = glPos;
+ retval.m_WorldPos = world_pos;
+ return retval;
+}
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/shadowMappingFragment.glsllib b/res/effectlib/shadowMappingFragment.glsllib
new file mode 100644
index 0000000..660d736
--- /dev/null
+++ b/res/effectlib/shadowMappingFragment.glsllib
@@ -0,0 +1,10 @@
+#include "depthpass.glsllib"
+float FragmentParaboloidDepth( vec4 inWorldPos, mat4 inMVP, vec2 inCameraProperties )
+{
+ if (inWorldPos.w < 0.0)
+ discard;
+ vec4 projVec = inMVP * vec4( inWorldPos.xyz, 1.0 );
+ projVec /= projVec.w;
+ projVec.z = depthValueToLinearDistance( 1.0 - projVec.z, inCameraProperties );
+ return (projVec.z - inCameraProperties.x) / (inCameraProperties.y - inCameraProperties.x);
+}
diff --git a/res/effectlib/simpleGlossyBSDF.glsllib b/res/effectlib/simpleGlossyBSDF.glsllib
new file mode 100644
index 0000000..be6024c
--- /dev/null
+++ b/res/effectlib/simpleGlossyBSDF.glsllib
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 simpleGlossyBSDF( in mat3 tanFrame, in vec3 L, vec3 V, in vec3 lightSpecular, in float ior
+ , in float roughnessU, in float roughnessV, int mode )
+{
+ vec4 rgba = vec4( 0.0, 0.0, 0.0, 1.0 );
+
+ float cosTheta = dot( tanFrame[2], L );
+ if ( 0.0 < cosTheta )
+ {
+ float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] );
+
+ if ( ( mode == scatter_reflect ) || ( mode == scatter_reflect_transmit ) )
+ {
+ vec3 R = reflect( -L, tanFrame[2] );
+ float cosine = dot( R, V );
+ float shine = ( 0.0 < cosine ) ? ( ( 0.0 < roughness ) ? pow( cosine, 1.0 / roughness ) : ( 0.9999 <= cosine ) ? 1.0 : 0.0 ) : 0.0;
+ rgba.rgb = shine * lightSpecular;
+ }
+ }
+ if ( ( mode == scatter_transmit ) || ( mode == scatter_reflect_transmit ) )
+ {
+ // check against total reflection
+ vec3 R = refract( -V, tanFrame[2], ior );
+ if ( R == vec3( 0.0, 0.0, 0.0 ) )
+ {
+ rgba.a = 1.0;
+ }
+ else
+ {
+ rgba.a = 0.0;
+ }
+ }
+
+ return( rgba );
+}
+
+vec4 simpleGlossyBSDFEnvironment( in mat3 tanFrame, in vec3 viewDir, in float roughnessU, in float roughnessV, int mode )
+{
+ vec3 rgb = vec3( 0.0, 0.0, 0.0 );
+#if !QT3DS_ENABLE_LIGHT_PROBE
+ if ( uEnvironmentMappingEnabled )
+ {
+ float roughness = calculateRoughness( tanFrame[2], roughnessU, roughnessV, tanFrame[0] );
+ vec3 R = reflect( -viewDir, tanFrame[2] );
+ rgb = evalEnvironmentMap( R, roughness );
+ rgb = simpleGlossyBSDF( tanFrame, R, viewDir, rgb, 1.0, roughnessU, roughnessV, scatter_reflect ).rgb;
+ }
+#endif
+ return( vec4( rgb, 1.0 ) );
+}
+
+// RNM radiosity normal maps
+vec4 glossyRNM( in vec3 N, in vec3 rnmX, in vec3 rnmY, in vec3 rnmZ )
+{
+ // we use a fixed basis like Half Life
+ vec3 B0 = vec3( -0.40825, 0.70711, 0.57735);
+ vec3 B1 = vec3( -0.40825, -0.70711, 0.57735);
+ vec3 B2 = vec3( 0.8165, 0.0, 0.57735);
+
+ vec3 dp;
+ dp.x = clamp( dot ( N , B0 ), 0.0, 1.0);
+ dp.y = clamp( dot ( N , B1 ), 0.0, 1.0);
+ dp.z = clamp( dot ( N , B2 ), 0.0, 1.0);
+
+ float sum = 1.0 / dot( dp, vec3(1.0, 1.0, 1.0) );
+ vec3 diffuseLight = dp.x * rnmX + dp.y * rnmY + dp.z * rnmZ;
+ //vec3 diffuseLight = N.x * rnmX + N.y * rnmY + N.z * rnmZ;
+
+ return (vec4(diffuseLight, 1.0) * sum);
+}
diff --git a/res/effectlib/specularBSDF.glsllib b/res/effectlib/specularBSDF.glsllib
new file mode 100644
index 0000000..78e541a
--- /dev/null
+++ b/res/effectlib/specularBSDF.glsllib
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "funcspecularBSDF.glsllib"
+
+#ifndef DEFAULT_MATERIAL_LIGHTING
+
+vec4 specularBSDFEnvironment( in vec3 N, in vec3 viewDir, in vec3 tint, int mode )
+{
+ vec3 rgb = vec3( 0.0, 0.0, 0.0 );
+ if ( uEnvironmentMappingEnabled )
+ {
+ vec3 R = reflect( -viewDir, N );
+ rgb = evalEnvironmentMap( R, 0.0 );
+ rgb = specularBSDF( N, R, viewDir, rgb, 1.0, 256.0, tint, scatter_reflect ).rgb;
+ }
+ return( vec4( rgb, 1.0 ) );
+}
+
+#endif
diff --git a/res/effectlib/spotEdf.glsllib b/res/effectlib/spotEdf.glsllib
new file mode 100644
index 0000000..2abe194
--- /dev/null
+++ b/res/effectlib/spotEdf.glsllib
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float spotEdf( float exponent )
+{
+ float att = 1.0;
+
+ float dist = length(viewDir);
+ vec3 spotDir = viewDir / dist;
+
+ float spot = max(0.0, dot(spotDir, normal));
+ att = pow(spot, exponent);
+
+ return att;
+}
diff --git a/res/effectlib/square.glsllib b/res/effectlib/square.glsllib
new file mode 100644
index 0000000..9685722
--- /dev/null
+++ b/res/effectlib/square.glsllib
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+float square( in float x )
+{
+ return( x * x );
+}
+
diff --git a/res/effectlib/tangentSpaceNormalTexture.glsllib b/res/effectlib/tangentSpaceNormalTexture.glsllib
new file mode 100644
index 0000000..1fcc429
--- /dev/null
+++ b/res/effectlib/tangentSpaceNormalTexture.glsllib
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef FILE_NORMAL_TEXTURE_GLSLLIB
+#define FILE_NORMAL_TEXTURE_GLSLLIB
+
+#ifdef QT3DS_DEFINE_API
+
+#include "luminance.glsllib"
+#include "monoChannel.glsllib"
+#include "textureCoordinateInfo.glsllib"
+#define wrap_clamp 0
+#define wrap_repeat 1
+#define wrap_mirrored_repeat 2
+#include "rotationTranslationScale.glsllib"
+#include "transformCoordinate.glsllib"
+
+#endif
+
+//interpreting the color values of a bitmap as a vector in tangent space
+vec3 tangentSpaceNormalTexture( in sampler2D tex, in float factor, in bool flipTangentU, in bool flipTangentV
+ , in texture_coordinate_info uvw, in vec2 cropU, in vec2 cropV, in int wrapU, in int wrapV )
+{
+ // if we mirror repeat a tangent space texture, tangent space needs to be flipped for every other tile
+ bool flipU = flipTangentU;
+ bool flipV = flipTangentV;
+ if ( wrapU == wrap_mirrored_repeat )
+ {
+ if ( ( ( 0.0 < uvw.position.x ) && ( int( uvw.position.x ) % 2 == 1 ) )
+ || ( ( uvw.position.x < 0.0 ) && ( int( uvw.position.x ) % 2 == 0 ) ) )
+ {
+ flipU = !flipU;
+ }
+ if ( ( ( 0.0 < uvw.position.y ) && ( int( uvw.position.y ) % 2 == 1 ) )
+ || ( ( uvw.position.y < 0.0 ) && ( int( uvw.position.y ) % 2 == 0 ) ) )
+ {
+ flipV = !flipV;
+ }
+ }
+
+ vec3 tangent = 2.0 * texture( tex, uvw.position.xy ).xyz - 1.0;
+
+ vec3 tangentU = normalize( flipU ? -uvw.tangent_u : uvw.tangent_u );
+ vec3 tangentV = normalize( flipV ? -uvw.tangent_v : uvw.tangent_v );
+ vec3 normal = normalize( cross( tangentU, tangentV ) );
+
+ return( mix( normal, normalize( tangent.x * tangentU - tangent.y * tangentV + tangent.z * normal ), factor ) );
+}
+
+#include "textureCoordinateInfo.glsllib"
+
+//Simpler version built to run from UIC image data
+//In our case, we have already generated the texture coordinate x,y position
+//TODO - figure out if we need to manipulate tangent_u, tangent_v.
+vec3 defaultMaterialFileNormalTexture( in sampler2D sampler, in float factor, vec2 texCoord, vec3 tangent, vec3 binormal )
+{
+ // factor should be in [0,1] range
+ return tangentSpaceNormalTexture( sampler, clamp(factor, 0.0, 1.0), false, false
+ , textureCoordinateInfo( vec3( texCoord.x, texCoord.y, 0.0 ), tangent, binormal )
+ , vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 )
+ , wrap_repeat, wrap_repeat);
+}
+
+#endif
diff --git a/res/effectlib/tessellationLinear.glsllib b/res/effectlib/tessellationLinear.glsllib
new file mode 100644
index 0000000..f854cc1
--- /dev/null
+++ b/res/effectlib/tessellationLinear.glsllib
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TESSELLATION_LINEAR_GLSLLIB
+#define TESSELLATION_LINEAR_GLSLLIB
+
+
+#if TESSELLATION_CONTROL_SHADER
+layout (vertices = 3) out;
+
+// global setup in main
+vec3 ctWorldPos[3];
+
+uniform vec3 camera_position;
+uniform vec2 distanceRange;
+uniform float disableCulling;
+
+float isBackFace()
+{
+ vec3 faceNormal = normalize( cross( ctWorldPos[2] - ctWorldPos[0], ctWorldPos[1] - ctWorldPos[0] ) );
+
+ vec3 ncd = normalize( ctWorldPos[0] - camera_position );
+
+ return sign( dot(faceNormal, ncd) );
+}
+
+float adaptiveCameraFactor( in float minTess, in float maxTess )
+{
+ float distanceValue0 = distance( camera_position, ctWorldPos[0] );
+ float distanceValue1 = distance( camera_position, ctWorldPos[1] );
+ float distanceValue2 = distance( camera_position, ctWorldPos[2] );
+
+ float range = distanceRange[1] - distanceRange[0];
+
+ vec3 edgeDistance;
+ edgeDistance[0] = ((distanceValue1 + distanceValue2) / 2.0) / range;
+ edgeDistance[1] = ((distanceValue2 + distanceValue0) / 2.0) / range;
+ edgeDistance[2] = ((distanceValue0 + distanceValue1) / 2.0) / range;
+
+ edgeDistance = clamp( edgeDistance, vec3(0.0), vec3(1.0) );
+
+ //float af = mix( minTess, maxTess, 1.0 - edgeDistance[gl_InvocationID] );
+ float af = 1.0 - edgeDistance[gl_InvocationID];
+ af = clamp( af*af*maxTess , minTess, maxTess );
+
+ return af;
+}
+
+void tessShader ( in float tessEdge, in float tessInner )
+{
+ float bf = isBackFace();
+ bf = max(disableCulling, bf);
+
+ // adapative tessellation factor
+ float af = adaptiveCameraFactor( tessInner, tessEdge );
+
+ // Calculate the tessellation levels
+ gl_TessLevelInner[0] = af * bf;
+ gl_TessLevelOuter[gl_InvocationID] = af * bf;
+}
+#endif
+
+#if TESSELLATION_EVALUATION_SHADER
+layout (triangles, equal_spacing, ccw) in;
+
+vec4 tessShader ( )
+{
+ vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
+ vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
+ vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
+ vec4 pos = p0 + p1 + p2;
+ return pos;
+}
+#endif
+
+#endif
+
diff --git a/res/effectlib/tessellationLinearCM.glsllib b/res/effectlib/tessellationLinearCM.glsllib
new file mode 100644
index 0000000..d2bb90a
--- /dev/null
+++ b/res/effectlib/tessellationLinearCM.glsllib
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TESSELLATION_LINEAR_CM_GLSLLIB
+#define TESSELLATION_LINEAR_CM_ GLSLLIB
+
+#include "tessellationLinear.glsllib"
+
+#if TESSELLATION_CONTROL_SHADER
+
+uniform float tessLevelOuter;
+uniform float tessLevelInner;
+
+attribute vec3 varNormal[];
+attribute vec3 varObjPos[];
+
+varying vec3 varNormalTC[];
+varying vec3 varObjPosTC[];
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 varTexCoord0[];
+varying vec3 varTexCoord0TC[];
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 varTangent[];
+attribute vec3 varObjTangent[];
+varying vec3 varTangentTC[];
+varying vec3 varObjTangentTC[];
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 varBinormal[];
+attribute vec3 varObjBinormal[];
+varying vec3 varBinormalTC[];
+varying vec3 varObjBinormalTC[];
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 varWorldPos[];
+varying vec3 varWorldPosTC[];
+#endif
+
+void main() {
+
+#if QT3DS_ENABLE_WORLD_POSITION
+ ctWorldPos[0] = varWorldPos[0];
+ ctWorldPos[1] = varWorldPos[1];
+ ctWorldPos[2] = varWorldPos[2];
+#endif
+
+ gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+ tessShader( tessLevelOuter, tessLevelInner);
+
+ varObjPosTC[gl_InvocationID] = varObjPos[gl_InvocationID];
+ varNormalTC[gl_InvocationID] = varNormal[gl_InvocationID];
+
+#if QT3DS_ENABLE_UV0
+ varTexCoord0TC[gl_InvocationID] = varTexCoord0[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangentTC[gl_InvocationID] = varTangent[gl_InvocationID];
+ varObjTangentTC[gl_InvocationID] = varObjTangent[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormalTC[gl_InvocationID] = varBinormal[gl_InvocationID];
+ varObjBinormalTC[gl_InvocationID] = varObjBinormal[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPosTC[gl_InvocationID] = varWorldPos[gl_InvocationID];
+#endif
+}
+
+#endif
+
+
+#if TESSELLATION_EVALUATION_SHADER
+
+#if (GEOMETRY_SHADER == 1)
+#define VARYING_NAME(varyingName) varyingName##TE
+#else
+#define VARYING_NAME(varyingName) varyingName
+#endif
+
+uniform mat3 normal_matrix;
+uniform mat4 model_view_projection_matrix;
+
+attribute vec3 varNormalTC[];
+attribute vec3 varObjPosTC[];
+
+varying vec3 VARYING_NAME(varNormal);
+varying vec3 VARYING_NAME(varObjPos);
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 varTexCoord0TC[];
+varying vec3 VARYING_NAME(varTexCoord0);
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 varTangentTC[];
+attribute vec3 varObjTangentTC[];
+varying vec3 VARYING_NAME(varTangent);
+varying vec3 VARYING_NAME(varObjTangent);
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 varBinormalTC[];
+attribute vec3 varObjBinormalTC[];
+varying vec3 VARYING_NAME(varBinormal);
+varying vec3 VARYING_NAME(varObjBinormal);
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 varWorldPosTC[];
+varying vec3 VARYING_NAME(varWorldPos);
+#endif
+
+void main() {
+ vec4 pos = tessShader( );
+
+ gl_Position = model_view_projection_matrix * pos;
+
+ VARYING_NAME(varObjPos) = gl_TessCoord.x * varObjPosTC[0] + gl_TessCoord.y * varObjPosTC[1] + gl_TessCoord.z * varObjPosTC[2];
+ VARYING_NAME(varNormal) = gl_TessCoord.x * varNormalTC[0] + gl_TessCoord.y * varNormalTC[1] + gl_TessCoord.z * varNormalTC[2];
+
+#if QT3DS_ENABLE_UV0
+ VARYING_NAME(varTexCoord0) = gl_TessCoord.x * varTexCoord0TC[0] + gl_TessCoord.y * varTexCoord0TC[1] + gl_TessCoord.z * varTexCoord0TC[2];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ VARYING_NAME(varTangent) = gl_TessCoord.x * varTangentTC[0] + gl_TessCoord.y * varTangentTC[1] + gl_TessCoord.z * varTangentTC[2];
+ VARYING_NAME(varObjTangent) = gl_TessCoord.x * varObjTangentTC[0] + gl_TessCoord.y * varObjTangentTC[1] + gl_TessCoord.z * varObjTangentTC[2];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ VARYING_NAME(varBinormal) = gl_TessCoord.x * varBinormalTC[0] + gl_TessCoord.y * varBinormalTC[1] + gl_TessCoord.z * varBinormalTC[2];
+ VARYING_NAME(varObjBinormal) = gl_TessCoord.x * varObjBinormalTC[0] + gl_TessCoord.y * varObjBinormalTC[1] + gl_TessCoord.z * varObjBinormalTC[2];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ VARYING_NAME(varWorldPos) = gl_TessCoord.x * varWorldPosTC[0] + gl_TessCoord.y * varWorldPosTC[1] + gl_TessCoord.z * varWorldPosTC[2];
+#endif
+
+ VARYING_NAME(varNormal) = normalize(normal_matrix * VARYING_NAME(varNormal));
+}
+
+#endif
+
+#endif
+
diff --git a/res/effectlib/tessellationNPatch.glsllib b/res/effectlib/tessellationNPatch.glsllib
new file mode 100644
index 0000000..62ec263
--- /dev/null
+++ b/res/effectlib/tessellationNPatch.glsllib
@@ -0,0 +1,290 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TESSELLATION_NPATCH_GLSLLIB
+#define TESSELLATION_NPATCH_GLSLLIB
+
+struct NPatchTessPatch
+{
+ float b210;
+ float b120;
+ float b021;
+ float b012;
+ float b102;
+ float b201;
+ float b111;
+ float n110;
+ float n011;
+ float n101;
+ float t110;
+ float t011;
+ float t101;
+};
+
+#if TESSELLATION_CONTROL_SHADER
+layout (vertices = 3) out;
+
+layout(location=15) out NPatchTessPatch tcTessPatch[];
+
+// global setup in main
+vec3 ctWorldPos[3];
+vec3 ctNorm[3];
+vec3 ctTangent[3];
+
+uniform vec3 camera_position;
+uniform vec2 distanceRange;
+uniform float disableCulling;
+
+float isBackFace()
+{
+ vec3 faceNormal = normalize( cross( ctWorldPos[2] - ctWorldPos[0], ctWorldPos[1] - ctWorldPos[0] ) );
+
+ vec3 ncd = normalize( ctWorldPos[0] - camera_position );
+
+ return sign( 0.2 + dot(faceNormal, ncd) ); // 0.2 is a conservative offset to account for curved surfaces
+}
+
+float adaptiveCameraFactor( in float minTess, in float maxTess )
+{
+ float distanceValue0 = distance( camera_position, ctWorldPos[0] );
+ float distanceValue1 = distance( camera_position, ctWorldPos[1] );
+ float distanceValue2 = distance( camera_position, ctWorldPos[2] );
+
+ float range = distanceRange[1] - distanceRange[0];
+
+ vec3 edgeDistance;
+ edgeDistance[0] = ((distanceValue1 + distanceValue2) / 2.0) / range;
+ edgeDistance[1] = ((distanceValue2 + distanceValue0) / 2.0) / range;
+ edgeDistance[2] = ((distanceValue0 + distanceValue1) / 2.0) / range;
+
+ edgeDistance = clamp( edgeDistance, vec3(0.0), vec3(1.0) );
+
+ //float af = mix( minTess, maxTess, 1.0 - edgeDistance[gl_InvocationID] );
+ float af = 1.0 - edgeDistance[gl_InvocationID];
+ af = clamp( af*af*maxTess , minTess, maxTess );
+
+ return af;
+}
+
+float adaptiveFeatureFactor( in float minTess, in float maxTess )
+{
+ vec3 adaptValue;
+ adaptValue[0] = clamp( dot(ctNorm[1], ctNorm[2]), -1.0, 1.0 );
+ adaptValue[1] = clamp( dot(ctNorm[2], ctNorm[0]), -1.0, 1.0 );
+ adaptValue[2] = clamp( dot(ctNorm[0], ctNorm[1]), -1.0, 1.0 );
+
+ //float af = min( adaptValue[0], min(adaptValue[1], adaptValue[2]) );
+ // map [-1, +1] range to [0, 1] range
+ float af = (adaptValue[gl_InvocationID] + 1.0) / 2.0;
+
+ af = mix( minTess, maxTess, 1.0 - af );
+
+ return af;
+}
+
+float getwij(int i, int j)
+{
+ return dot(gl_in[j].gl_Position.xyz - gl_in[i].gl_Position.xyz, ctNorm[i]);
+}
+
+float getvij(int i, int j)
+{
+ vec3 pji = gl_in[j].gl_Position.xyz - gl_in[i].gl_Position.xyz;
+ vec3 nij = ctNorm[i] + ctNorm[j];
+
+ return 2.0*dot(pji, nij)/dot(pji, pji);
+}
+
+void tessShader ( in float tessEdge, in float tessInner )
+{
+ // setup control points
+ // notations and formulas see http://alex.vlachos.com/graphics/CurvedPNTriangles.pdf
+ // note we compute separate x,y,z component for each invocation
+ float b300 = gl_in[0].gl_Position[gl_InvocationID];
+ float b030 = gl_in[1].gl_Position[gl_InvocationID];
+ float b003 = gl_in[2].gl_Position[gl_InvocationID];
+ float n200 = ctNorm[0][gl_InvocationID];
+ float n020 = ctNorm[1][gl_InvocationID];
+ float n002 = ctNorm[2][gl_InvocationID];
+ float t200 = ctTangent[0][gl_InvocationID];
+ float t020 = ctTangent[1][gl_InvocationID];
+ float t002 = ctTangent[2][gl_InvocationID];
+
+ // compute tangent control points
+ tcTessPatch[gl_InvocationID].b210 = (2.0*b300 + b030 - getwij(0,1)*n200)/3.0;
+ tcTessPatch[gl_InvocationID].b120 = (2.0*b030 + b300 - getwij(1,0)*n020)/3.0;
+ tcTessPatch[gl_InvocationID].b021 = (2.0*b030 + b003 - getwij(1,2)*n020)/3.0;
+ tcTessPatch[gl_InvocationID].b012 = (2.0*b003 + b030 - getwij(2,1)*n002)/3.0;
+ tcTessPatch[gl_InvocationID].b102 = (2.0*b003 + b300 - getwij(2,0)*n002)/3.0;
+ tcTessPatch[gl_InvocationID].b201 = (2.0*b300 + b003 - getwij(0,2)*n200)/3.0;
+ // compute center control point
+ float E = ( tcTessPatch[gl_InvocationID].b210
+ + tcTessPatch[gl_InvocationID].b120
+ + tcTessPatch[gl_InvocationID].b021
+ + tcTessPatch[gl_InvocationID].b012
+ + tcTessPatch[gl_InvocationID].b102
+ + tcTessPatch[gl_InvocationID].b201 ) / 6.0;
+
+ float V = ( b300 + b030 + b003 ) / 3.0;
+ tcTessPatch[gl_InvocationID].b111 = E + (E-V)*0.5;
+
+ // compute normals
+ tcTessPatch[gl_InvocationID].n110 = n200 + n020 - getvij(0,1) * (b030 - b300);
+ tcTessPatch[gl_InvocationID].n011 = n020 + n002 - getvij(1,2) * (b003 - b030);
+ tcTessPatch[gl_InvocationID].n101 = n002 + n200 - getvij(2,0) * (b300 - b003);
+ // compute tangents
+ tcTessPatch[gl_InvocationID].t110 = t200 + t020 - getvij(0,1) * (b030 - b300);
+ tcTessPatch[gl_InvocationID].t011 = t020 + t002 - getvij(1,2) * (b003 - b030);
+ tcTessPatch[gl_InvocationID].t101 = t002 + t200 - getvij(2,0) * (b300 - b003);
+
+ // compute backface
+ float bf = isBackFace();
+ bf = max(disableCulling, bf);
+
+ // adapative tessellation factor regarding features
+ float af = adaptiveFeatureFactor( tessInner, tessEdge );
+
+ //float cf = adaptiveCameraFactor( tessInner, tessEdge );
+
+ // Calculate the tessellation levels
+ gl_TessLevelInner[0] = af * bf;
+ gl_TessLevelOuter[gl_InvocationID] = af * bf;
+}
+
+#endif
+
+#if TESSELLATION_EVALUATION_SHADER
+layout (triangles, fractional_odd_spacing, ccw) in;
+
+layout(location=15) in NPatchTessPatch tcTessPatch[];
+
+// global setup in main
+vec3 ctNorm[3];
+vec3 teNorm;
+vec3 ctTangent[3];
+vec3 teTangent;
+vec3 teBinormal;
+
+bool doLinear(int i, int j)
+{
+ /*
+ vec3 edgeji = gl_in[j].gl_Position.xyz - gl_in[i].gl_Position.xyz;
+
+ float di = sign( dot( ctNorm[i], edgeji ) );
+ float dj = sign( dot( ctNorm[j], -edgeji ) );
+
+ if ( di != dj )
+ return false;
+ else
+ return true;*/
+
+ // Always do linear normal interpolation for now
+ // Seems to produce always good results unless we would produce
+ // a s-shaped triangle.
+ return true;
+}
+
+vec4 tessShader ( )
+{
+ // pre compute square tesselation coord
+ vec3 tessSquared = gl_TessCoord * gl_TessCoord;
+ vec3 tessCubed = tessSquared * gl_TessCoord;
+
+ // combine control points
+ vec3 b210 = vec3(tcTessPatch[0].b210, tcTessPatch[1].b210, tcTessPatch[2].b210);
+ vec3 b120 = vec3(tcTessPatch[0].b120, tcTessPatch[1].b120, tcTessPatch[2].b120);
+ vec3 b021 = vec3(tcTessPatch[0].b021, tcTessPatch[1].b021, tcTessPatch[2].b021);
+ vec3 b012 = vec3(tcTessPatch[0].b012, tcTessPatch[1].b012, tcTessPatch[2].b012);
+ vec3 b102 = vec3(tcTessPatch[0].b102, tcTessPatch[1].b102, tcTessPatch[2].b102);
+ vec3 b201 = vec3(tcTessPatch[0].b201, tcTessPatch[1].b201, tcTessPatch[2].b201);
+ vec3 b111 = vec3(tcTessPatch[0].b111, tcTessPatch[1].b111, tcTessPatch[2].b111);
+
+ // combine control normals
+ vec3 n110 = vec3(tcTessPatch[0].n110, tcTessPatch[1].n110, tcTessPatch[2].n110);
+ vec3 n011 = vec3(tcTessPatch[0].n011, tcTessPatch[1].n011, tcTessPatch[2].n011);
+ vec3 n101 = vec3(tcTessPatch[0].n101, tcTessPatch[1].n101, tcTessPatch[2].n101);
+
+ // combine control tangents
+ vec3 t110 = vec3(tcTessPatch[0].t110, tcTessPatch[1].t110, tcTessPatch[2].t110);
+ vec3 t011 = vec3(tcTessPatch[0].t011, tcTessPatch[1].t011, tcTessPatch[2].t011);
+ vec3 t101 = vec3(tcTessPatch[0].t101, tcTessPatch[1].t101, tcTessPatch[2].t101);
+
+ // NPatch normal
+ if ( doLinear( 0, 1 ) == true )
+ {
+ // linear normal
+ teNorm = ctNorm[0] * gl_TessCoord[2]
+ + ctNorm[1] * gl_TessCoord[0]
+ + ctNorm[2] * gl_TessCoord[1];
+ // NPatch tangent
+ teTangent = ctTangent[0] * gl_TessCoord[2]
+ + ctTangent[1] * gl_TessCoord[0]
+ + ctTangent[2] * gl_TessCoord[1];
+ }
+ else
+ {
+ // quadratic normal
+ teNorm = ctNorm[0] * tessSquared[2]
+ + ctNorm[1] * tessSquared[0]
+ + ctNorm[2] * tessSquared[1]
+ + n110*gl_TessCoord[2] * gl_TessCoord[0]
+ + n011*gl_TessCoord[0] * gl_TessCoord[1]
+ + n101*gl_TessCoord[2] * gl_TessCoord[1];
+
+ // NPatch tangent
+ teTangent = ctTangent[0] * tessSquared[2]
+ + ctTangent[1] * tessSquared[0]
+ + ctTangent[2] * tessSquared[1]
+ + t110*gl_TessCoord[2] * gl_TessCoord[0]
+ + t011*gl_TessCoord[0] * gl_TessCoord[1]
+ + t101*gl_TessCoord[2] * gl_TessCoord[1];
+ }
+
+ // NPatch binormal
+ teBinormal = cross( teNorm, teTangent );
+
+ // npatch interpolated position
+ vec3 finalPos = gl_in[0].gl_Position.xyz * tessCubed[2]
+ + gl_in[1].gl_Position.xyz * tessCubed[0]
+ + gl_in[2].gl_Position.xyz * tessCubed[1]
+ + b210 * 3.0 * tessSquared[2] * gl_TessCoord[0]
+ + b120 * 3.0 * tessSquared[0] * gl_TessCoord[2]
+ + b201 * 3.0 * tessSquared[2] * gl_TessCoord[1]
+ + b021 * 3.0 * tessSquared[0] * gl_TessCoord[1]
+ + b102 * 3.0 * tessSquared[1] * gl_TessCoord[2]
+ + b012 * 3.0 * tessSquared[1] * gl_TessCoord[0]
+ + b111 * 6.0 * gl_TessCoord[0] * gl_TessCoord[1] * gl_TessCoord[2];
+
+ return vec4( finalPos, 1.0 );
+}
+#endif
+
+#endif
+
diff --git a/res/effectlib/tessellationNPatchCM.glsllib b/res/effectlib/tessellationNPatchCM.glsllib
new file mode 100644
index 0000000..4616b58
--- /dev/null
+++ b/res/effectlib/tessellationNPatchCM.glsllib
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TESSELLATION_NPATCH_CM_GLSLLIB
+#define TESSELLATION_NPATCH_CM_GLSLLIB GLSLLIB
+
+
+#include "tessellationNPatch.glsllib"
+
+
+#if TESSELLATION_CONTROL_SHADER
+
+uniform float tessLevelOuter;
+uniform float tessLevelInner;
+
+attribute vec3 varNormal[];
+attribute vec3 varObjPos[];
+
+varying vec3 varNormalTC[];
+varying vec3 varObjPosTC[];
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 varTexCoord0[];
+varying vec3 varTexCoord0TC[];
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 varTangent[];
+attribute vec3 varObjTangent[];
+varying vec3 varTangentTC[];
+varying vec3 varObjTangentTC[];
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 varBinormal[];
+attribute vec3 varObjBinormal[];
+varying vec3 varBinormalTC[];
+varying vec3 varObjBinormalTC[];
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 varWorldPos[];
+varying vec3 varWorldPosTC[];
+#endif
+
+void main() {
+
+ ctNorm[0] = varNormal[0];
+ ctNorm[1] = varNormal[1];
+ ctNorm[2] = varNormal[2];
+#if QT3DS_ENABLE_TEXTAN
+ ctTangent[0] = varObjTangent[0];
+ ctTangent[1] = varObjTangent[1];
+ ctTangent[2] = varObjTangent[2];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ ctWorldPos[0] = varWorldPos[0];
+ ctWorldPos[1] = varWorldPos[1];
+ ctWorldPos[2] = varWorldPos[2];
+#endif
+
+ gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+ tessShader( tessLevelOuter, tessLevelInner);
+
+ varObjPosTC[gl_InvocationID] = varObjPos[gl_InvocationID];
+ varNormalTC[gl_InvocationID] = varNormal[gl_InvocationID];
+
+#if QT3DS_ENABLE_UV0
+ varTexCoord0TC[gl_InvocationID] = varTexCoord0[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangentTC[gl_InvocationID] = varTangent[gl_InvocationID];
+ varObjTangentTC[gl_InvocationID] = varObjTangent[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormalTC[gl_InvocationID] = varBinormal[gl_InvocationID];
+ varObjBinormalTC[gl_InvocationID] = varObjBinormal[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPosTC[gl_InvocationID] = varWorldPos[gl_InvocationID];
+#endif
+}
+
+#endif
+
+
+#if TESSELLATION_EVALUATION_SHADER
+
+#if (GEOMETRY_SHADER == 1)
+#define VARYING_NAME(varyingName) varyingName##TE
+#else
+#define VARYING_NAME(varyingName) varyingName
+#endif
+
+uniform mat3 normal_matrix;
+uniform mat4 model_view_projection_matrix;
+
+attribute vec3 varNormalTC[];
+attribute vec3 varObjPosTC[];
+
+varying vec3 VARYING_NAME(varNormal);
+varying vec3 VARYING_NAME(varObjPos);
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 varTexCoord0TC[];
+varying vec3 VARYING_NAME(varTexCoord0);
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 varTangentTC[];
+attribute vec3 varObjTangentTC[];
+varying vec3 VARYING_NAME(varTangent);
+varying vec3 VARYING_NAME(varObjTangent);
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 varBinormalTC[];
+attribute vec3 varObjBinormalTC[];
+varying vec3 VARYING_NAME(varBinormal);
+varying vec3 VARYING_NAME(varObjBinormal);
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 varWorldPosTC[];
+varying vec3 VARYING_NAME(varWorldPos);
+#endif
+
+void main() {
+
+ ctNorm[0] = varNormalTC[0];
+ ctNorm[1] = varNormalTC[1];
+ ctNorm[2] = varNormalTC[2];
+#if QT3DS_ENABLE_TEXTAN
+ ctTangent[0] = varObjTangentTC[0];
+ ctTangent[1] = varObjTangentTC[1];
+ ctTangent[2] = varObjTangentTC[2];
+#endif
+
+ vec4 pos = tessShader( );
+
+ gl_Position = model_view_projection_matrix * pos;
+
+ VARYING_NAME(varObjPos) = gl_TessCoord.z * varObjPosTC[0] + gl_TessCoord.x * varObjPosTC[1] + gl_TessCoord.y * varObjPosTC[2];
+
+#if QT3DS_ENABLE_UV0
+ VARYING_NAME(varTexCoord0) = gl_TessCoord.z * varTexCoord0TC[0] + gl_TessCoord.x * varTexCoord0TC[1] + gl_TessCoord.y * varTexCoord0TC[2];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ VARYING_NAME(varWorldPos) = gl_TessCoord.z * varWorldPosTC[0] + gl_TessCoord.x * varWorldPosTC[1] + gl_TessCoord.y * varWorldPosTC[2];
+#endif
+
+ VARYING_NAME(varNormal) = normalize(normal_matrix * teNorm);
+
+#if QT3DS_ENABLE_TEXTAN
+ VARYING_NAME(varTangent) = normalize(normal_matrix * teTangent);
+ VARYING_NAME(varObjTangent) = gl_TessCoord.z * varObjTangentTC[0] + gl_TessCoord.x * varObjTangentTC[1] + gl_TessCoord.y * varObjTangentTC[2];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ VARYING_NAME(varBinormal) = normalize(normal_matrix * teBinormal);
+ VARYING_NAME(varObjBinormal) = gl_TessCoord.z * varObjBinormalTC[0] + gl_TessCoord.x * varObjBinormalTC[1] + gl_TessCoord.y * varObjBinormalTC[2];
+#endif
+}
+
+#endif
+
+#endif
+
diff --git a/res/effectlib/tessellationPath.glsllib b/res/effectlib/tessellationPath.glsllib
new file mode 100644
index 0000000..17b87b0
--- /dev/null
+++ b/res/effectlib/tessellationPath.glsllib
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TESSELLATION_PATH_GLSLLIB
+#define TESSELLATION_PATH_GLSLLIB
+
+
+#if TESSELLATION_CONTROL_SHADER
+layout (vertices = 5) out;
+
+void tessShader ( in float edgeTessAmount, float innerTessAmount )
+{
+ gl_TessLevelOuter[0] = innerTessAmount;
+ gl_TessLevelOuter[1] = edgeTessAmount;
+ gl_TessLevelOuter[2] = innerTessAmount;
+ gl_TessLevelOuter[3] = edgeTessAmount;
+
+ gl_TessLevelInner[0] = edgeTessAmount / 2.0;
+ gl_TessLevelInner[1] = innerTessAmount;
+}
+
+#endif
+
+#if TESSELLATION_EVALUATION_SHADER
+layout (quads, equal_spacing, cw) in;
+
+vec2 getTangent(vec2 p0, vec2 p1, vec2 p2, vec2 p3, float t)
+{
+ // derivative
+ float dbt0 = -3.0 * (1.0 - t) * (1.0 - t);
+ float dbt1 = 3.0 * (1.0 - t) * (1.0 - 3.0 * t);
+ float dbt2 = 3.0 * t * (2.0 - 3.0 * t);
+ float dbt3 = 3.0 * t * t;
+
+ // tangent on curve
+ return normalize( dbt0 * p0 + dbt1 * p1 + dbt2 * p2 + dbt3 * p3 );
+}
+//An exact cross product would involve normalizing dx,dy. Since
+//this algorithm needs merely the sign, normalization is not necessary.
+float roughCrossProd( vec2 prev, vec2 point, vec2 next )
+{
+ vec2 inDxDy = point - prev;
+ vec2 outDxDy = next - point;
+ return inDxDy.x * outDxDy.y - inDxDy.y * outDxDy.x;
+}
+
+//The incoming corss product tells us both if we should do a seam merge
+//and if the merge is above or below point in gl_TessCoord.y space; we know the
+//anchor point is at .5 gl_TessCoord.y space.
+vec3 computeAdjoiningFactors( float cross, vec2 adjoining, vec2 point, float tessY )
+{
+ vec3 retval = vec3( 0.0, 0.0, 0.0 );
+ float multiplier = cross < 0.0 ? 1.0 : -1.0;
+ float weight = abs(cross) > 0.001 ? multiplier * ( ( tessY - .5 )/ .5 ) : 0.0;
+ retval.z = weight > 0.0 ? 1.0 : 0.0;
+ retval.xy = mix( point, adjoining, weight );
+ return retval;
+}
+
+#define NO_TAPER 0
+#define BEGIN_TAPER 1
+#define END_TAPER 2
+
+//Tapering is done by interpolating the path width somewhat cleverly.
+float getTaperResult( float inIncomingValue, float inBeginValue, float inEndValue, vec2 taperData, uint inMode )
+{
+ float mixInfo = mix( taperData.x, taperData.y, gl_TessCoord.x );
+ float theValueMixer = inMode == BEGIN_TAPER ? inBeginValue : inEndValue;
+ return mix( theValueMixer, inIncomingValue, mixInfo );
+}
+
+uniform vec2 beginTaperInfo;
+uniform vec2 endTaperInfo;
+
+struct STessShaderResult
+{
+ vec3 m_Position;
+ vec2 m_TexCoord;
+ vec2 m_Tangent;
+ vec2 m_Binormal;
+ float m_Opacity;
+};
+
+STessShaderResult tessShader ( float inPathWidth )
+{
+ vec2 p1 = gl_in[0].gl_Position.xy;
+ vec2 c1 = gl_in[0].gl_Position.zw; //c1
+ vec2 c2 = gl_in[1].gl_Position.xy; //c2
+ vec2 p2 = gl_in[1].gl_Position.zw;
+ vec4 taperData = gl_in[3].gl_Position;
+ vec2 udata = gl_in[4].gl_Position.xy;
+
+ //Adjust width for taper if necessary.
+ inPathWidth = taperData.z > 0.0 ? getTaperResult( inPathWidth, beginTaperInfo.x, endTaperInfo.x, taperData.xy, uint(taperData.z) ) : inPathWidth;
+
+ float adjoiningWeight = 0.0;
+ vec2 adjoining = vec2( 0.0, 0.0 );
+ if ( gl_TessCoord.x == floor(gl_TessCoord.x) ) // gl_TessCord.x either 0.0 or 1.0
+ {
+ vec2 point, cross1, cross2;
+ if ( gl_TessCoord.x == 0.0 )
+ {
+ adjoining = gl_in[2].gl_Position.xy;
+ point = p1;
+ cross1 = adjoining;
+ cross2 = c1;
+ }
+ else // gl_TessCoord.x == 1.0
+ {
+ adjoining = gl_in[2].gl_Position.zw;
+ point = p2;
+ cross1 = c2;
+ cross2 = adjoining;
+ }
+ float cross = roughCrossProd( cross1, point, cross2 );
+ vec3 adjoiningFactors = computeAdjoiningFactors( cross, adjoining, point, gl_TessCoord.y );
+ adjoining = adjoiningFactors.xy;
+ adjoiningWeight = adjoiningFactors.z;
+ }
+
+ float v = gl_TessCoord.x;
+ // cubic basis function calculated from v.
+ float bv0 = (1.0 - v) * (1.0 - v) * (1.0 - v);
+ float bv1 = 3.0 * v * (1.0 - v) * (1.0 - v);
+ float bv2 = 3.0 * v * v * (1.0 - v);
+ float bv3 = v * v * v;
+
+ //u ranges from 0 - 1. What we want is to
+ //have u range from -1,1.
+ float u = 2.0 * ( gl_TessCoord.y - .5 );
+
+ vec2 tangent = getTangent( p1, c1, c2, p2, v );
+ vec2 normal = vec2( tangent.y, -tangent.x );
+
+ vec2 offset = normal * inPathWidth * u;
+
+ vec2 pointOnPath = bv0*p1 + bv1*c1 + bv2*c2 + bv3*p2;
+
+ vec2 finalPosXY = offset + pointOnPath;
+
+ STessShaderResult retval;
+ retval.m_Position = vec3( mix( finalPosXY, adjoining, adjoiningWeight), 0.0 );
+ retval.m_Opacity = taperData.z > 0.0 ? getTaperResult( 1.0, beginTaperInfo.y, endTaperInfo.y, taperData.xy, uint(taperData.z) ) : 1.0;
+
+ // cubic interpolation of the texture coords
+ retval.m_TexCoord.x = mix( udata.x, udata.y, v );
+ retval.m_TexCoord.y = gl_TessCoord.y;
+ retval.m_Tangent = tangent;
+ retval.m_Binormal = normal;
+
+ return retval;
+}
+#endif
+
+#endif
+
diff --git a/res/effectlib/tessellationPhong.glsllib b/res/effectlib/tessellationPhong.glsllib
new file mode 100644
index 0000000..98a683d
--- /dev/null
+++ b/res/effectlib/tessellationPhong.glsllib
@@ -0,0 +1,170 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TESSELLATION_PHONG_GLSLLIB
+#define TESSELLATION_PHONG_GLSLLIB
+
+struct PhongTessPatch
+{
+ float projIJ;
+ float projJK;
+ float projIK;
+};
+
+#if TESSELLATION_CONTROL_SHADER
+layout (vertices = 3) out;
+
+layout(location = 15) out PhongTessPatch tcTessPatch[];
+
+// global setup in main
+vec3 ctWorldPos[3];
+vec3 ctNorm[3];
+
+uniform vec3 camera_position;
+uniform vec2 distanceRange;
+uniform float disableCulling;
+
+float isBackFace()
+{
+ vec3 faceNormal = normalize( cross( ctWorldPos[2] - ctWorldPos[0], ctWorldPos[1] - ctWorldPos[0] ) );
+
+ vec3 ncd = normalize( ctWorldPos[0] - camera_position );
+
+ return sign( 0.2 + dot(faceNormal, ncd) ); // 0.2 is a conservative offset to account for curved surfaces
+}
+
+float adaptiveCameraFactor( in float minTess, in float maxTess )
+{
+ float distanceValue0 = distance( camera_position, ctWorldPos[0] );
+ float distanceValue1 = distance( camera_position, ctWorldPos[1] );
+ float distanceValue2 = distance( camera_position, ctWorldPos[2] );
+
+ float range = distanceRange[1] - distanceRange[0];
+
+ vec3 edgeDistance;
+ edgeDistance[0] = ((distanceValue1 + distanceValue2) / 2.0) / range;
+ edgeDistance[1] = ((distanceValue2 + distanceValue0) / 2.0) / range;
+ edgeDistance[2] = ((distanceValue0 + distanceValue1) / 2.0) / range;
+
+ edgeDistance = clamp( edgeDistance, vec3(0.0), vec3(1.0) );
+
+ //float af = mix( minTess, maxTess, 1.0 - edgeDistance[gl_InvocationID] );
+ float af = 1.0 - edgeDistance[gl_InvocationID];
+ af = clamp( af*af*maxTess , minTess, maxTess );
+
+ return af;
+}
+
+float adaptiveFeatureFactor( in float minTess, in float maxTess )
+{
+ vec3 adaptValue;
+ adaptValue[0] = clamp( dot(ctNorm[1], ctNorm[2]), -1.0, 1.0 );
+ adaptValue[1] = clamp( dot(ctNorm[2], ctNorm[0]), -1.0, 1.0 );
+ adaptValue[2] = clamp( dot(ctNorm[0], ctNorm[1]), -1.0, 1.0 );
+
+ //float af = min( adaptValue[0], min(adaptValue[1], adaptValue[2]) );
+ // map [-1, +1] range to [0, 1] range
+ float af = (adaptValue[gl_InvocationID] + 1.0) / 2.0;
+
+ af = mix( minTess, maxTess, 1.0 - af );
+
+ return af;
+}
+
+float mapToTangentPlane(int i, vec3 q)
+{
+ vec3 q_minus_p = q - gl_in[i].gl_Position.xyz;
+ return q[gl_InvocationID] - dot(q_minus_p, ctNorm[i]) * ctNorm[i][gl_InvocationID];
+}
+
+void tessShader ( in float tessEdge, in float tessInner )
+{
+ // compute projections separate for each xyz component
+ tcTessPatch[gl_InvocationID].projIJ = mapToTangentPlane(0, gl_in[1].gl_Position.xyz) + mapToTangentPlane(1, gl_in[0].gl_Position.xyz);
+ tcTessPatch[gl_InvocationID].projJK = mapToTangentPlane(1, gl_in[2].gl_Position.xyz) + mapToTangentPlane(2, gl_in[1].gl_Position.xyz);
+ tcTessPatch[gl_InvocationID].projIK = mapToTangentPlane(2, gl_in[0].gl_Position.xyz) + mapToTangentPlane(0, gl_in[2].gl_Position.xyz);
+
+ // compute backface
+ float bf = isBackFace();
+ bf = max(disableCulling, bf);
+ // adapative tessellation factor regarding features
+ float af = adaptiveFeatureFactor( tessInner, tessEdge );
+ // adapative tessellation factor regarding camera
+ //float cf = adaptiveFeatureFactor( tessInner, tessEdge );
+
+ // the camera tess factor is the limit
+ //af = min(af, cf);
+
+ // Calculate the tessellation levels
+ gl_TessLevelInner[0] = af * bf;
+ gl_TessLevelOuter[gl_InvocationID] = af * bf;
+}
+
+#endif
+
+#if TESSELLATION_EVALUATION_SHADER
+layout (triangles, equal_spacing, ccw) in;
+
+layout(location = 15) in PhongTessPatch tcTessPatch[];
+
+uniform float phongBlend;
+
+vec4 tessShader ( )
+{
+ // pre compute square tesselation coord
+ vec3 tessSquared = gl_TessCoord * gl_TessCoord;
+
+ // barycentric linear position
+ vec3 linearPos = gl_TessCoord.x * gl_in[0].gl_Position.xyz
+ + gl_TessCoord.y * gl_in[1].gl_Position.xyz
+ + gl_TessCoord.z * gl_in[2].gl_Position.xyz;
+
+ // projective terms
+ vec3 projJI = vec3(tcTessPatch[0].projIJ, tcTessPatch[1].projIJ, tcTessPatch[2].projIJ);
+ vec3 projKJ = vec3(tcTessPatch[0].projJK, tcTessPatch[1].projJK, tcTessPatch[2].projJK);
+ vec3 projIK = vec3(tcTessPatch[0].projIK, tcTessPatch[1].projIK, tcTessPatch[2].projIK);
+
+ // phong interpolated position
+ vec3 phongPos = tessSquared.x * gl_in[0].gl_Position.xyz
+ + tessSquared.y * gl_in[1].gl_Position.xyz
+ + tessSquared.z * gl_in[2].gl_Position.xyz
+ + gl_TessCoord.x * gl_TessCoord.y * projJI
+ + gl_TessCoord.y * gl_TessCoord.z * projKJ
+ + gl_TessCoord.z * gl_TessCoord.x * projIK;
+
+ // final blend between linear and phong interpolation
+ vec3 finalPos = (1.0-phongBlend)*linearPos + phongBlend*phongPos;
+
+ return vec4( finalPos, 1.0 );
+}
+#endif
+
+#endif
+
diff --git a/res/effectlib/tessellationPhongCM.glsllib b/res/effectlib/tessellationPhongCM.glsllib
new file mode 100644
index 0000000..1374a63
--- /dev/null
+++ b/res/effectlib/tessellationPhongCM.glsllib
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TESSELLATION_PHONG_CM_GLSLLIB
+#define TESSELLATION_PHONG_CM_ GLSLLIB
+
+
+#include "tessellationPhong.glsllib"
+
+
+#if TESSELLATION_CONTROL_SHADER
+
+uniform float tessLevelOuter;
+uniform float tessLevelInner;
+
+attribute vec3 varNormal[];
+attribute vec3 varObjPos[];
+
+varying vec3 varNormalTC[];
+varying vec3 varObjPosTC[];
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 varTexCoord0[];
+varying vec3 varTexCoord0TC[];
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 varTangent[];
+attribute vec3 varObjTangent[];
+varying vec3 varTangentTC[];
+varying vec3 varObjTangentTC[];
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 varBinormal[];
+attribute vec3 varObjBinormal[];
+varying vec3 varBinormalTC[];
+varying vec3 varObjBinormalTC[];
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 varWorldPos[];
+varying vec3 varWorldPosTC[];
+#endif
+
+void main() {
+
+#if QT3DS_ENABLE_WORLD_POSITION
+ ctWorldPos[0] = varWorldPos[0];
+ ctWorldPos[1] = varWorldPos[1];
+ ctWorldPos[2] = varWorldPos[2];
+#endif
+ ctNorm[0] = varNormal[0];
+ ctNorm[1] = varNormal[1];
+ ctNorm[2] = varNormal[2];
+
+ gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
+ tessShader( tessLevelOuter, tessLevelInner);
+
+ varObjPosTC[gl_InvocationID] = varObjPos[gl_InvocationID];
+ varNormalTC[gl_InvocationID] = varNormal[gl_InvocationID];
+
+#if QT3DS_ENABLE_UV0
+ varTexCoord0TC[gl_InvocationID] = varTexCoord0[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangentTC[gl_InvocationID] = varTangent[gl_InvocationID];
+ varObjTangentTC[gl_InvocationID] = varObjTangent[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormalTC[gl_InvocationID] = varBinormal[gl_InvocationID];
+ varObjBinormalTC[gl_InvocationID] = varObjBinormal[gl_InvocationID];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPosTC[gl_InvocationID] = varWorldPos[gl_InvocationID];
+#endif
+}
+
+#endif
+
+
+#if TESSELLATION_EVALUATION_SHADER
+
+#if (GEOMETRY_SHADER == 1)
+#define VARYING_NAME(varyingName) varyingName##TE
+#else
+#define VARYING_NAME(varyingName) varyingName
+#endif
+
+uniform mat3 normal_matrix;
+uniform mat4 model_view_projection_matrix;
+
+attribute vec3 varNormalTC[];
+attribute vec3 varObjPosTC[];
+
+varying vec3 VARYING_NAME(varNormal);
+varying vec3 VARYING_NAME(varObjPos);
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 varTexCoord0TC[];
+varying vec3 VARYING_NAME(varTexCoord0);
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 varTangentTC[];
+attribute vec3 varObjTangentTC[];
+varying vec3 VARYING_NAME(varTangent);
+varying vec3 VARYING_NAME(varObjTangent);
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 varBinormalTC[];
+attribute vec3 varObjBinormalTC[];
+varying vec3 VARYING_NAME(varBinormal);
+varying vec3 VARYING_NAME(varObjBinormal);
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 varWorldPosTC[];
+varying vec3 VARYING_NAME(varWorldPos);
+#endif
+
+void main() {
+ vec4 pos = tessShader( );
+
+ gl_Position = model_view_projection_matrix * pos;
+
+ VARYING_NAME(varObjPos) = gl_TessCoord.x * varObjPosTC[0] + gl_TessCoord.y * varObjPosTC[1] + gl_TessCoord.z * varObjPosTC[2];
+ VARYING_NAME(varNormal) = gl_TessCoord.x * varNormalTC[0] + gl_TessCoord.y * varNormalTC[1] + gl_TessCoord.z * varNormalTC[2];
+
+#if QT3DS_ENABLE_UV0
+ VARYING_NAME(varTexCoord0) = gl_TessCoord.x * varTexCoord0TC[0] + gl_TessCoord.y * varTexCoord0TC[1] + gl_TessCoord.z * varTexCoord0TC[2];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ VARYING_NAME(varTangent) = gl_TessCoord.x * varTangentTC[0] + gl_TessCoord.y * varTangentTC[1] + gl_TessCoord.z * varTangentTC[2];
+ VARYING_NAME(varObjTangent) = gl_TessCoord.x * varObjTangentTC[0] + gl_TessCoord.y * varObjTangentTC[1] + gl_TessCoord.z * varObjTangentTC[2];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ VARYING_NAME(varBinormal) = gl_TessCoord.x * varBinormalTC[0] + gl_TessCoord.y * varBinormalTC[1] + gl_TessCoord.z * varBinormalTC[2];
+ VARYING_NAME(varObjBinormal) = gl_TessCoord.x * varObjBinormalTC[0] + gl_TessCoord.y * varObjBinormalTC[1] + gl_TessCoord.z * varObjBinormalTC[2];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ VARYING_NAME(varWorldPos) = gl_TessCoord.x * varWorldPosTC[0] + gl_TessCoord.y * varWorldPosTC[1] + gl_TessCoord.z * varWorldPosTC[2];
+#endif
+
+ VARYING_NAME(varNormal) = normalize(normal_matrix * VARYING_NAME(varNormal));
+}
+
+#endif
+
+#endif
+
diff --git a/res/effectlib/textureCoordinateInfo.glsllib b/res/effectlib/textureCoordinateInfo.glsllib
new file mode 100644
index 0000000..a90ffbe
--- /dev/null
+++ b/res/effectlib/textureCoordinateInfo.glsllib
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TEXTURE_COORDINATE_INFO_GLSLLIB
+#define TEXTURE_COORDINATE_INFO_GLSLLIB
+
+#ifdef QT3DS_DEFINE_API
+
+struct texture_coordinate_info
+{
+ vec3 position;
+ vec3 tangent_u;
+ vec3 tangent_v;
+};
+
+#endif
+
+texture_coordinate_info textureCoordinateInfo( in vec3 pos, in vec3 tangentU, in vec3 tangentV )
+{
+ texture_coordinate_info tci;
+ tci.position = pos;
+ tci.tangent_u = normalize( tangentU );
+ tci.tangent_v = normalize( tangentV );
+ return( tci );
+}
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/transformCoordinate.glsllib b/res/effectlib/transformCoordinate.glsllib
new file mode 100644
index 0000000..ccdf7d0
--- /dev/null
+++ b/res/effectlib/transformCoordinate.glsllib
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef TRANSFORM_COORDINATE_GLSLLIB
+#define TRANSFORM_COORDINATE_GLSLLIB
+
+texture_coordinate_info transformCoordinate( in mat4 transform, in texture_coordinate_info coordinate )
+{
+ texture_coordinate_info tci;
+ tci.position = ( transform * vec4( coordinate.position, 1.0 ) ).xyz;
+ tci.tangent_u = ( transform * vec4( coordinate.tangent_u, 0.0 ) ).xyz;
+ tci.tangent_v = ( transform * vec4( coordinate.tangent_v, 0.0 ) ).xyz;
+ return( tci );
+}
+
+#endif
diff --git a/res/effectlib/vertexFragmentBase.glsllib b/res/effectlib/vertexFragmentBase.glsllib
new file mode 100644
index 0000000..add11bb
--- /dev/null
+++ b/res/effectlib/vertexFragmentBase.glsllib
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef VERTEX_FRAGMENT_BASE_GLSLLIB
+#define VERTEX_FRAGMENT_BASE_GLSLLIB
+
+ //FRAGMENT_SHADER
+ uniform vec3 camera_position; //position in world space of the camera
+
+// add global variables
+vec3 normal;
+vec3 surfNormal;
+vec3 texCoord0;
+vec3 tangent;
+vec3 binormal;
+vec3 viewDir;
+
+
+// add shader input
+
+void initializeBaseFragmentVariables()
+{
+ normal = normalize( varNormal );
+ surfNormal = normalize( varNormal );
+
+ texCoord0 = vec3( varTexCoord0.xy, 1.0 );
+ tangent = normalize( varTangent );
+
+ binormal = normalize( varBinormal );
+
+ viewDir = normalize( camera_position - varWorldPos );
+}
+
+#endif
diff --git a/res/effectlib/viewProperties.glsllib b/res/effectlib/viewProperties.glsllib
new file mode 100644
index 0000000..ef6b01f
--- /dev/null
+++ b/res/effectlib/viewProperties.glsllib
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef VIEW_PROPERTIES_GLSLLIB
+#define VIEW_PROPERTIES_GLSLLIB
+
+uniform mat4 view_projection_matrix;
+uniform mat4 view_matrix;
+uniform vec2 camera_properties; //near clip x, far clip y
+#ifndef SSAO_CUSTOM_MATERIAL_GLSLLIB
+uniform vec3 camera_position; //position in world space of the camera
+#endif
+
+#endif \ No newline at end of file
diff --git a/res/effectlib/weightedLayer.glsllib b/res/effectlib/weightedLayer.glsllib
new file mode 100644
index 0000000..781ffac
--- /dev/null
+++ b/res/effectlib/weightedLayer.glsllib
@@ -0,0 +1,35 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+vec4 weightedLayer( in float weight, in vec3 layercolor, in vec4 layer, in vec4 base, in float alpha )
+{
+ return vec4( mix( base.rgb, layer.rgb * layercolor, weight ), alpha );
+}
+
diff --git a/res/effectlib/wireframeCM.glsllib b/res/effectlib/wireframeCM.glsllib
new file mode 100644
index 0000000..fcbf7e9
--- /dev/null
+++ b/res/effectlib/wireframeCM.glsllib
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WIREFRAME_CM_GLSLLIB
+#define WIREFRAME_CM_GLSLLIB
+
+#ifdef GL_ES
+precision highp float;
+precision highp int;
+#endif
+
+#if (TESSELLATION_EVALUATION_SHADER == 1)
+#define VARYING_NAME(varyingName) varyingName##TE
+#else
+#define VARYING_NAME(varyingName) varyingName##VX
+#endif
+
+attribute vec3 VARYING_NAME(varNormal)[];
+attribute vec3 VARYING_NAME(varObjPos)[];
+
+varying vec3 varNormal;
+varying vec3 varObjPos;
+
+#if QT3DS_ENABLE_UV0
+attribute vec3 VARYING_NAME(varTexCoord0)[];
+varying vec3 varTexCoord0;
+#endif
+
+#if QT3DS_ENABLE_TEXTAN
+attribute vec3 VARYING_NAME(varTangent)[];
+attribute vec3 VARYING_NAME(varObjTangent)[];
+varying vec3 varTangent;
+varying vec3 varObjTangent;
+#endif
+
+#if QT3DS_ENABLE_BINORMAL
+attribute vec3 VARYING_NAME(varBinormal)[];
+attribute vec3 VARYING_NAME(varObjBinormal)[];
+varying vec3 varBinormal;
+varying vec3 varObjBinormal;
+#endif
+
+#if QT3DS_ENABLE_WORLD_POSITION
+attribute vec3 VARYING_NAME(varWorldPos)[];
+varying vec3 varWorldPos;
+#endif
+
+varying vec3 varEdgeDistance;
+
+uniform mat4 viewport_matrix;
+
+layout (triangles) in;
+layout (triangle_strip, max_vertices = 3) out;
+
+void main()
+{
+ // how this all work see http://developer.download.nvidia.com/SDK/10.5/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf
+ // project points to screen space
+ vec3 p0 = vec3(viewport_matrix * (gl_in[0].gl_Position / gl_in[0].gl_Position.w));
+ vec3 p1 = vec3(viewport_matrix * (gl_in[1].gl_Position / gl_in[1].gl_Position.w));
+ vec3 p2 = vec3(viewport_matrix * (gl_in[2].gl_Position / gl_in[2].gl_Position.w));
+ // compute triangle heights
+ float e1 = length(p1 - p2);
+ float e2 = length(p2 - p0);
+ float e3 = length(p1 - p0);
+ float alpha = acos( (e2*e2 + e3*e3 - e1*e1) / (2.0*e2*e3) );
+ float beta = acos( (e1*e1 + e3*e3 - e2*e2) / (2.0*e1*e3) );
+ float ha = abs( e3 * sin( beta ) );
+ float hb = abs( e3 * sin( alpha ) );
+ float hc = abs( e2 * sin( alpha ) );
+
+
+ // vertex 0
+ varEdgeDistance = vec3(ha*gl_in[0].gl_Position.w, 0.0, 0.0);
+ varNormal = VARYING_NAME(varNormal)[0];
+ varObjPos = VARYING_NAME(varObjPos)[0];
+#if QT3DS_ENABLE_UV0
+ varTexCoord0 = VARYING_NAME(varTexCoord0)[0];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangent = VARYING_NAME(varTangent)[0];
+ varObjTangent = VARYING_NAME(varObjTangent)[0];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormal = VARYING_NAME(varBinormal)[0];
+ varObjBinormal = VARYING_NAME(varObjBinormal)[0];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPos = VARYING_NAME(varWorldPos)[0];
+#endif
+
+ gl_Position = gl_in[0].gl_Position;
+ EmitVertex();
+
+ // vertex 1
+ varEdgeDistance = vec3(0.0, hb*gl_in[1].gl_Position.w, 0.0);
+ varNormal = VARYING_NAME(varNormal)[1];
+ varObjPos = VARYING_NAME(varObjPos)[1];
+#if QT3DS_ENABLE_UV0
+ varTexCoord0 = VARYING_NAME(varTexCoord0)[1];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangent = VARYING_NAME(varTangent)[1];
+ varObjTangent = VARYING_NAME(varObjTangent)[1];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormal = VARYING_NAME(varBinormal)[1];
+ varObjBinormal = VARYING_NAME(varObjBinormal)[1];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPos = VARYING_NAME(varWorldPos)[1];
+#endif
+
+ gl_Position = gl_in[1].gl_Position;
+ EmitVertex();
+
+ // vertex 2
+ varEdgeDistance = vec3(0.0, 0.0, hc*gl_in[2].gl_Position.w);
+ varNormal = VARYING_NAME(varNormal)[2];
+ varObjPos = VARYING_NAME(varObjPos)[2];
+#if QT3DS_ENABLE_UV0
+ varTexCoord0 = VARYING_NAME(varTexCoord0)[2];
+#endif
+#if QT3DS_ENABLE_TEXTAN
+ varTangent = VARYING_NAME(varTangent)[2];
+ varObjTangent = VARYING_NAME(varObjTangent)[2];
+#endif
+#if QT3DS_ENABLE_BINORMAL
+ varBinormal = VARYING_NAME(varBinormal)[2];
+ varObjBinormal = VARYING_NAME(varObjBinormal)[2];
+#endif
+#if QT3DS_ENABLE_WORLD_POSITION
+ varWorldPos = VARYING_NAME(varWorldPos)[2];
+#endif
+
+ gl_Position = gl_in[2].gl_Position;
+ EmitVertex();
+
+ EndPrimitive();
+}
+
+#endif
diff --git a/res/primitives/Cone.mesh b/res/primitives/Cone.mesh
new file mode 100644
index 0000000..7ef00f3
--- /dev/null
+++ b/res/primitives/Cone.mesh
Binary files differ
diff --git a/res/primitives/Cube.mesh b/res/primitives/Cube.mesh
new file mode 100644
index 0000000..af594b2
--- /dev/null
+++ b/res/primitives/Cube.mesh
Binary files differ
diff --git a/res/primitives/Cylinder.mesh b/res/primitives/Cylinder.mesh
new file mode 100644
index 0000000..0e9fbfc
--- /dev/null
+++ b/res/primitives/Cylinder.mesh
Binary files differ
diff --git a/res/primitives/Rectangle.mesh b/res/primitives/Rectangle.mesh
new file mode 100644
index 0000000..b137cb9
--- /dev/null
+++ b/res/primitives/Rectangle.mesh
Binary files differ
diff --git a/res/primitives/Sphere.mesh b/res/primitives/Sphere.mesh
new file mode 100644
index 0000000..4f61d4c
--- /dev/null
+++ b/res/primitives/Sphere.mesh
Binary files differ
diff --git a/src/3rdparty/3rdparty.pro b/src/3rdparty/3rdparty.pro
new file mode 100644
index 0000000..deb754e
--- /dev/null
+++ b/src/3rdparty/3rdparty.pro
@@ -0,0 +1,5 @@
+TEMPLATE = subdirs
+CONFIG += ordered
+
+SUBDIRS += \
+ EASTL
diff --git a/src/3rdparty/EASTL b/src/3rdparty/EASTL
new file mode 160000
+Subproject e4b2f453fd3cb3176922af9ab6bc79ddafc12c4
diff --git a/src/3rdparty/color/CColor.cpp b/src/3rdparty/color/CColor.cpp
new file mode 100644
index 0000000..d21cc94
--- /dev/null
+++ b/src/3rdparty/color/CColor.cpp
@@ -0,0 +1,719 @@
+/****************************************************************************\
+Datei : Color.cpp
+Projekt: Farbverwaltung
+Inhalt : CColor Implementierung
+Datum : 10.01.1999
+Autor : Christian Rodemeyer
+Hinweis: (c) 1999 by Christian Rodemeyer
+ Info �ber HLS Konvertierungsfunktion
+ - Foley and Van Dam: "Fundamentals of Interactive Computer Graphics"
+ - MSDN: 'HLS Color Spaces'
+ - MSDN: 'Converting Colors Between RGB and HLS'
+\****************************************************************************/
+#include "Qt3DSCommonPrecompile.h"
+#include "CColor.h"
+
+float GetMin( float in1, float in2 );
+float GetMin( float in1, float in2 )
+{
+ return ( in1 < in2 ) ? in1 : in2;
+}
+
+float GetMax( float in1, float in2 );
+float GetMax( float in1, float in2 )
+{
+ return ( in1 > in2 ) ? in1 : in2;
+}
+
+/****************************************************************************\
+ CColor: Implementierung
+\****************************************************************************/
+const CColor::DNamedColor CColor::m_namedColor[CColor::numNamedColors] =
+{
+ {aliceblue , "aliceblue"},
+ {antiquewhite , "antiquewhite"},
+ {aqua , "aqua"},
+ {aquamarine , "aquamarine"},
+ {azure , "azure"},
+ {beige , "beige"},
+ {bisque , "bisque"},
+ {black , "black"},
+ {blanchedalmond , "blanchedalmond"},
+ {blue , "blue"},
+ {blueviolet , "blueviolet"},
+ {brown , "brown"},
+ {burlywood , "burlywood"},
+ {cadetblue , "cadetblue"},
+ {chartreuse , "chartreuse"},
+ {chocolate , "chocolate"},
+ {coral , "coral"},
+ {cornflower , "cornflower"},
+ {cornsilk , "cornsilk"},
+ {crimson , "crimson"},
+ {cyan , "cyan"},
+ {darkblue , "darkblue"},
+ {darkcyan , "darkcyan"},
+ {darkgoldenrod , "darkgoldenrod"},
+ {darkgray , "darkgray"},
+ {darkgreen , "darkgreen"},
+ {darkkhaki , "darkkhaki"},
+ {darkmagenta , "darkmagenta"},
+ {darkolivegreen , "darkolivegreen"},
+ {darkorange , "darkorange"},
+ {darkorchid , "darkorchid"},
+ {darkred , "darkred"},
+ {darksalmon , "darksalmon"},
+ {darkseagreen , "darkseagreen"},
+ {darkslateblue , "darkslateblue"},
+ {darkslategray , "darkslategray"},
+ {darkturquoise , "darkturquoise"},
+ {darkviolet , "darkviolet"},
+ {deeppink , "deeppink"},
+ {deepskyblue , "deepskyblue"},
+ {dimgray , "dimgray"},
+ {dodgerblue , "dodgerblue"},
+ {firebrick , "firebrick"},
+ {floralwhite , "floralwhite"},
+ {forestgreen , "forestgreen"},
+ {fuchsia , "fuchsia"},
+ {gainsboro , "gainsboro"},
+ {ghostwhite , "ghostwhite"},
+ {gold , "gold"},
+ {goldenrod , "goldenrod"},
+ {gray , "gray"},
+ {green , "green"},
+ {greenyellow , "greenyellow"},
+ {honeydew , "honeydew"},
+ {hotpink , "hotpink"},
+ {indianred , "indianred"},
+ {indigo , "indigo"},
+ {ivory , "ivory"},
+ {khaki , "khaki"},
+ {lavender , "lavender"},
+ {lavenderblush , "lavenderblush"},
+ {lawngreen , "lawngreen"},
+ {lemonchiffon , "lemonchiffon"},
+ {lightblue , "lightblue"},
+ {lightcoral , "lightcoral"},
+ {lightcyan , "lightcyan"},
+ {lightgoldenrodyellow , "lightgoldenrodyellow"},
+ {lightgreen , "lightgreen"},
+ {lightgrey , "lightgrey"},
+ {lightpink , "lightpink"},
+ {lightsalmon , "lightsalmon"},
+ {lightseagreen , "lightseagreen"},
+ {lightskyblue , "lightskyblue"},
+ {lightslategray , "lightslategray"},
+ {lightsteelblue , "lightsteelblue"},
+ {lightyellow , "lightyellow"},
+ {lime , "lime"},
+ {limegreen , "limegreen"},
+ {linen , "linen"},
+ {magenta , "magenta"},
+ {maroon , "maroon"},
+ {mediumaquamarine , "mediumaquamarine"},
+ {mediumblue , "mediumblue"},
+ {mediumorchid , "mediumorchid"},
+ {mediumpurple , "mediumpurple"},
+ {mediumseagreen , "mediumseagreen"},
+ {mediumslateblue , "mediumslateblue"},
+ {mediumspringgreen , "mediumspringgreen"},
+ {mediumturquoise , "mediumturquoise"},
+ {mediumvioletred , "mediumvioletred"},
+ {midnightblue , "midnightblue"},
+ {mintcream , "mintcream"},
+ {mistyrose , "mistyrose"},
+ {moccasin , "moccasin"},
+ {navajowhite , "navajowhite"},
+ {navy , "navy"},
+ {oldlace , "oldlace"},
+ {olive , "olive"},
+ {olivedrab , "olivedrab"},
+ {orange , "orange"},
+ {orangered , "orangered"},
+ {orchid , "orchid"},
+ {palegoldenrod , "palegoldenrod"},
+ {palegreen , "palegreen"},
+ {paleturquoise , "paleturquoise"},
+ {palevioletred , "palevioletred"},
+ {papayawhip , "papayawhip"},
+ {peachpuff , "peachpuff"},
+ {peru , "peru"},
+ {pink , "pink"},
+ {plum , "plum"},
+ {powderblue , "powderblue"},
+ {purple , "purple"},
+ {red , "red"},
+ {rosybrown , "rosybrown"},
+ {royalblue , "royalblue"},
+ {saddlebrown , "saddlebrown"},
+ {salmon , "salmon"},
+ {sandybrown , "sandybrown"},
+ {seagreen , "seagreen"},
+ {seashell , "seashell"},
+ {sienna , "sienna"},
+ {silver , "silver"},
+ {skyblue , "skyblue"},
+ {slateblue , "slateblue"},
+ {slategray , "slategray"},
+ {snow , "snow"},
+ {springgreen , "springgreen"},
+ {steelblue , "steelblue"},
+ {tan , "tan"},
+ {teal , "teal"},
+ {thistle , "thistle"},
+ {tomato , "tomato"},
+ {turquoise , "turquoise"},
+ {violet , "violet"},
+ {wheat , "wheat"},
+ {white , "white"},
+ {whitesmoke , "whitesmoke"},
+ {yellow , "yellow"},
+ {yellowgreen , "yellowgreen"}
+};
+
+const char* CColor::GetNameFromIndex(int i)
+{
+ assert(0 <= i && i < numNamedColors);
+
+ return m_namedColor[i].name;
+}
+
+CColor CColor::GetColorFromIndex(int i)
+{
+ if ( i < 0 ) i = 0;
+ else if ( i >= numNamedColors ) i = numNamedColors - 1;
+
+ return m_namedColor[i].color;
+}
+
+CColor CColor::FromString(const char* pcColor)
+{
+ CColor t( 0, 0, 0) ;
+ t.SetString(pcColor);
+
+ return t;
+}
+
+CColor::CColor(COLORTYPE cr) :
+ m_colorref(cr),
+ m_hue( 0.0 ),
+ m_saturation( 0.0 ),
+ m_luminance( 0.0 ),
+ m_bIsRGB(true),
+ m_bIsHLS(false)
+{
+}
+
+CColor::CColor(const QColor &c) :
+ CColor(c.red(), c.green(), c.blue())
+{
+}
+
+CColor::operator COLORTYPE() const
+{
+ return RGB( GetRed( ), GetGreen( ), GetBlue( ) );
+}
+
+CColor::operator QColor() const
+{
+ return QColor( GetRed( ), GetGreen( ), GetBlue( ) );
+}
+
+// RGB
+
+void CColor::SetColor(COLORTYPE color)
+{
+ this->SetRGB(GetRValue(color), GetGValue(color), GetBValue(color));
+}
+
+CColor::CColor( int red, int green, int blue ):
+ m_hue( 0.0 ),
+ m_saturation( 0.0 ),
+ m_luminance( 0.0 ),
+ m_bIsRGB( true ),
+ m_bIsHLS( false )
+{
+ this->SetRGB( red, green, blue );
+}
+
+void CColor::SetRed(int red)
+{
+ red &= 0xFF;
+
+ ToRGB();
+ m_color[c_red] = static_cast<unsigned char>(red);
+ m_bIsHLS = false;
+}
+
+void CColor::SetGreen(int green)
+{
+ green &= 0xFF;
+
+ ToRGB();
+ m_color[c_green] = static_cast<unsigned char>(green);
+ m_bIsHLS = false;
+}
+
+void CColor::SetBlue(int blue)
+{
+ blue &= 0xFF;
+
+ ToRGB();
+ m_color[c_blue] = static_cast<unsigned char>(blue);
+ m_bIsHLS = false;
+}
+
+void CColor::SetRGB(int red, int green, int blue)
+{
+ red &= 0xFF;
+ blue &= 0xFF;
+ green &= 0xFF;
+
+ m_color[c_red] = static_cast<unsigned char>(red);
+ m_color[c_green] = static_cast<unsigned char>(green);
+ m_color[c_blue] = static_cast<unsigned char>(blue);
+ m_bIsHLS = false;
+ m_bIsRGB = true;
+}
+
+unsigned int CColor::GetRed() const
+{
+ const_cast<CColor*>(this)->ToRGB();
+
+ return m_color[c_red];
+}
+
+unsigned int CColor::GetGreen() const
+{
+ const_cast<CColor*>(this)->ToRGB();
+
+ return m_color[c_green];
+}
+
+unsigned int CColor::GetBlue() const
+{
+ const_cast<CColor*>(this)->ToRGB();
+
+ return m_color[c_blue];
+}
+
+COLORTYPE CColor::GetRGBColor()
+{
+ const_cast<CColor*>(this)->ToRGB();
+
+ return (RGB(m_color[c_red], m_color[c_green], m_color[c_blue])) ;
+}
+
+// HSL
+
+void CColor::SetHue(float hue)
+{
+ if ( hue < 0 ) hue = 0;
+ else if ( hue > 360 ) hue = 360;
+
+ ToHLS();
+ m_hue = hue;
+ m_bIsRGB = false;
+}
+
+void CColor::SetSaturation(float saturation)
+{
+ if ( saturation < 0 ) saturation = 0;
+ else if ( saturation > 1 ) saturation = 1;
+
+ ToHLS();
+ m_saturation = saturation;
+ m_bIsRGB = false;
+}
+
+void CColor::SetLuminance(float luminance)
+{
+ if ( luminance < 0 ) luminance = 0;
+ else if ( luminance > 1 ) luminance = 1;
+
+ ToHLS();
+ m_luminance = luminance;
+ m_bIsRGB = false;
+}
+
+void CColor::SetHLS(float hue, float luminance, float saturation)
+{
+ if ( hue < 0 ) hue = 0;
+ else if ( hue > 360 ) hue = 360;
+ if ( saturation < 0 ) saturation = 0;
+ else if ( saturation > 1 ) saturation = 1;
+ if ( luminance < 0 ) luminance = 0;
+ else if ( luminance > 1 ) luminance = 1;
+
+ m_hue = hue;
+ m_luminance = luminance;
+ m_saturation = saturation;
+ m_bIsRGB = false;
+ m_bIsHLS = true;
+}
+
+float CColor::GetHue() const
+{
+ const_cast<CColor*>(this)->ToHLS();
+
+ return m_hue;
+}
+
+float CColor::GetSaturation() const
+{
+ const_cast<CColor*>(this)->ToHLS();
+
+ return m_saturation;
+}
+
+float CColor::GetLuminance() const
+{
+ const_cast<CColor*>(this)->ToHLS();
+
+ return m_luminance;
+}
+
+// Konvertierung
+
+void CColor::ToHLS()
+{
+ if (!m_bIsHLS)
+ {
+ // Konvertierung
+ unsigned char minval = static_cast<unsigned char>( GetMin(m_color[c_red], GetMin(m_color[c_green], m_color[c_blue])) );
+ unsigned char maxval = static_cast<unsigned char>( GetMax(m_color[c_red], GetMax(m_color[c_green], m_color[c_blue])) );
+ float mdiff = float(maxval) - float(minval);
+ float msum = float(maxval) + float(minval);
+
+ m_luminance = msum / 510.0f;
+
+ if (maxval == minval)
+ {
+ m_saturation = 0.0f;
+ m_hue = 0.0f;
+ }
+ else
+ {
+ float rnorm = (maxval - m_color[c_red] ) / mdiff;
+ float gnorm = (maxval - m_color[c_green]) / mdiff;
+ float bnorm = (maxval - m_color[c_blue] ) / mdiff;
+
+ m_saturation = (m_luminance <= 0.5f) ? (mdiff / msum) : (mdiff / (510.0f - msum));
+
+ if (m_color[c_red] == maxval)
+ m_hue = 60.0f * (6.0f + bnorm - gnorm);
+
+ if (m_color[c_green] == maxval)
+ m_hue = 60.0f * (2.0f + rnorm - bnorm);
+
+ if (m_color[c_blue] == maxval)
+ m_hue = 60.0f * (4.0f + gnorm - rnorm);
+
+ if (m_hue > 360.0f)
+ m_hue = m_hue - 360.0f;
+ }
+
+ m_bIsHLS = true;
+ }
+}
+
+void CColor::ToRGB()
+{
+ if (!m_bIsRGB)
+ {
+ if (m_saturation == 0.0) // Grauton, einfacher Fall
+ {
+ m_color[c_red] = m_color[c_green] = m_color[c_blue] = (unsigned char)(m_luminance * 255.0);
+ }
+ else
+ {
+ float rm1, rm2;
+
+ if (m_luminance <= 0.5f)
+ rm2 = m_luminance + m_luminance * m_saturation;
+ else
+ rm2 = m_luminance + m_saturation - m_luminance * m_saturation;
+
+ rm1 = 2.0f * m_luminance - rm2;
+ m_color[c_red] = ToRGB1(rm1, rm2, m_hue + 120.0f);
+ m_color[c_green] = ToRGB1(rm1, rm2, m_hue);
+ m_color[c_blue] = ToRGB1(rm1, rm2, m_hue - 120.0f);
+ }
+
+ m_bIsRGB = true;
+ }
+}
+
+unsigned char CColor::ToRGB1(float rm1, float rm2, float rh)
+{
+ if (rh > 360.0f)
+ rh -= 360.0f;
+ else
+ if (rh < 0.0f)
+ rh += 360.0f;
+
+ if (rh < 60.0f)
+ rm1 = rm1 + (rm2 - rm1) * rh / 60.0f;
+ else
+ if (rh < 180.0f)
+ rm1 = rm2;
+ else
+ if (rh < 240.0f)
+ rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f;
+
+ return static_cast<unsigned char>(rm1 * 255);
+}
+
+// Stringkonvertierung im Format RRGGBB
+
+Q3DStudio::CString CColor::GetString() const
+{
+ Q3DStudio::CString color;
+ color.Format( _LSTR( "%02X%02X%02X" ), GetRed(), GetGreen(), GetBlue());
+
+ return color;
+}
+
+bool CColor::SetString( const char* pcColor)
+{
+ int r, g, b;
+ bool bRet = false;
+
+ if (sscanf(pcColor, "%2x%2x%2x", &r, &g, &b) != 3)
+ {
+ m_color[c_red] = m_color[c_green] = m_color[c_blue] = 0;
+ }
+ else
+ {
+ m_color[c_red] = static_cast<unsigned char>(r);
+ m_color[c_green] = static_cast<unsigned char>(g);
+ m_color[c_blue] = static_cast<unsigned char>(b);
+ m_bIsRGB = true;
+ m_bIsHLS = false;
+ bRet = true;
+ }
+
+ return (bRet) ;
+}
+
+Q3DStudio::CString CColor::GetName() const
+{
+ Q3DStudio::CString theRetStr;
+
+ const_cast<CColor*>(this)->ToRGB();
+ int i = numNamedColors;
+ while (i-- && m_colorref != m_namedColor[i].color) { }
+ if (i < 0)
+ {
+ theRetStr = L"#" + GetString();
+ }
+ else
+ theRetStr = m_namedColor[i].name;
+
+ return (theRetStr);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// global functions
+/////////////////////////////////////////////////////////////////////////////
+
+COLORTYPE GetHueColor(int iHue)
+{
+ COLORTYPE theHueColor ;
+ unsigned char r, g, b;
+
+ HSVToRGB( r, g, b, (float) iHue, 1.0f, 1.0f );
+
+ theHueColor = RGB( r, g, b );
+
+ return (theHueColor) ;
+}
+
+// r,g,b values are from 0 to 1
+// h = [0,360], s = [0,1], v = [0,1]
+// if s == 0, then h = -1 (undefined)
+
+void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
+{
+ float min, max, delta;
+
+ min = GetMin( GetMin( r, g ), b );
+ max = GetMax( GetMax( r, g ), b );
+ *v = max; // v
+ delta = max - min;
+ if ( max != 0 )
+ *s = delta / max; // s
+ else
+ {
+ // r = g = b = 0 // s = 0, v is undefined
+ *s = 0;
+ *h = -1;
+ return;
+ }
+ if ( r == max )
+ *h = ( g - b ) / delta; // between yellow & magenta
+ else
+ if( g == max )
+ *h = 2 + ( b - r ) / delta; // between cyan & yellow
+ else
+ *h = 4 + ( r - g ) / delta; // between magenta & cyan
+ *h *= 60; // degrees
+ if ( *h < 0 )
+ *h += 360;
+}
+
+void RGBToHSV( unsigned char r, unsigned char g, unsigned char b, float* h, float* s, float* v )
+{
+ // Convert an RGB to HSV
+
+ float fRed, fGreen, fBlue;
+
+ // convert 0-255 values to 0-1 range
+ fRed = ( ( float ) r ) / 255.0f;
+ fGreen = ( ( float ) g ) / 255.0f;
+ fBlue = ( ( float ) b ) / 255.0f;
+
+ RGBtoHSV( fRed, fGreen, fBlue, h, s, v );
+}
+
+void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
+{
+ int i;
+ float f, p, q, t;
+
+ if ( s == 0 )
+ {
+ // achromatic (grey)
+ *r = *g = *b = v;
+ return;
+ }
+
+ h /= 60; // sector 0 to 5
+ i = ( int ) floor( h );
+ f = h - i; // factorial part of h
+ p = v * ( 1 - s );
+ q = v * ( 1 - s * f );
+ t = v * ( 1 - s * ( 1 - f ) );
+
+ switch( i )
+ {
+ case 0:
+ *r = v;
+ *g = t;
+ *b = p;
+ break;
+
+ case 1:
+ *r = q;
+ *g = v;
+ *b = p;
+ break;
+
+ case 2:
+ *r = p;
+ *g = v;
+ *b = t;
+ break;
+
+ case 3:
+ *r = p;
+ *g = q;
+ *b = v;
+ break;
+
+ case 4:
+ *r = t;
+ *g = p;
+ *b = v;
+ break;
+
+ default: // case 5:
+ *r = v;
+ *g = p;
+ *b = q;
+ break;
+ }
+}
+
+void HSVToRGB( unsigned char& r, unsigned char& g, unsigned char& b, float h, float s, float v )
+{
+ // Convert an HSV to RGB
+
+ float fRed, fGreen, fBlue;
+
+ HSVtoRGB( &fRed, &fGreen, &fBlue, h, s, v );
+
+ r = ( unsigned char ) ( fRed * 255.0f );
+ g = ( unsigned char ) ( fGreen * 255.0f );
+ b = ( unsigned char ) ( fBlue * 255.0f );
+}
+
+short GetHueValue( COLORTYPE inColor )
+{
+ float theHue, theSaturation, theBright;
+ short theHueValue;
+
+ RGBToHSV( GetRValue( inColor ), GetGValue( inColor ), GetBValue( inColor ), &theHue, &theSaturation, &theBright );
+
+ theHueValue = ( short ) theHue;
+
+ return theHueValue;
+}
+
+short GetSaturationValue( COLORTYPE inColor )
+{
+ float theHue, theSaturation, theBright;
+ short theSaturationValue;
+
+ RGBToHSV( GetRValue( inColor ), GetGValue( inColor ), GetBValue( inColor ), &theHue, &theSaturation, &theBright );
+
+ theSaturationValue = ( short ) ( theSaturation * 255.0f );
+
+ return theSaturationValue;
+}
+
+short GetBrightnessValue( COLORTYPE inColor )
+{
+ float theHue, theSaturation, theBright;
+ short theBrightnessValue;
+
+ RGBToHSV( GetRValue( inColor ), GetGValue( inColor ), GetBValue( inColor ), &theHue, &theSaturation, &theBright );
+
+ theBrightnessValue = ( short ) ( theBright * 255.0f );
+
+ return theBrightnessValue;
+}
+
+CColor CColor::GetFractionalColor( long inIndex, long inCount )
+{
+ double theE = .2;
+ double theRCenter = 1.0 / 6;
+ double theGCenter = 3.0 / 6;
+ double theBCenter = 5.0 / 6;
+ double theRCenter2 = 7.0 / 6;
+ double theBCenter2 = -1.0 / 6;
+
+ double theInv2eSquare = -1.0 / ( 2 * theE * theE );
+ double theMag = 60 / theE;
+
+ double thePos = (double)inIndex / inCount;
+ double theR = theMag * exp( ( thePos - theRCenter ) * ( thePos - theRCenter ) * theInv2eSquare );
+ double theG = theMag * exp( ( thePos - theGCenter ) * ( thePos - theGCenter ) * theInv2eSquare );
+ double theB = theMag * exp( ( thePos - theBCenter ) * ( thePos - theBCenter ) * theInv2eSquare );
+
+ double theR2 = theMag * exp( ( thePos - theRCenter2 ) * ( thePos - theRCenter2 ) * theInv2eSquare );
+ double theB2 = theMag * exp( ( thePos - theBCenter2 ) * ( thePos - theBCenter2 ) * theInv2eSquare );
+
+ theR += theR2;
+ theB += theB2;
+
+ return CColor( (char)( theR + .5 ), (char)( theG + .5 ), (char)( theB + .5 ) );
+}
+
+QColor CColor::getQColor() const
+{
+ const_cast<CColor *>(this)->ToRGB();
+
+ return QColor(m_color[c_red], m_color[c_green], m_color[c_blue]);
+}
diff --git a/src/3rdparty/color/CColor.h b/src/3rdparty/color/CColor.h
new file mode 100644
index 0000000..e6f487b
--- /dev/null
+++ b/src/3rdparty/color/CColor.h
@@ -0,0 +1,298 @@
+/****************************************************************************\
+Datei : Color.h
+Projekt: Farbverwaltung
+Inhalt : CColor Deklaration
+Datum : 10.01.1999
+Autor : Christian Rodemeyer
+Hinweis: (c) 1999 by Christian Rodemeyer
+\****************************************************************************/
+#pragma once
+
+#ifndef INCLUDED_COLOR_H
+#define INCLUDED_COLOR_H
+
+/****************************************************************************\
+ CColor: Repr�sentiert einen Farbwert
+\****************************************************************************/
+
+typedef unsigned long COLORTYPE;
+
+#include "Qt3DSString.h"
+#include <QColor>
+
+class CColor
+{
+public:
+
+ // COLORREF Konvertierung
+ // ----------------------
+ CColor( COLORTYPE cr = 0 );
+ CColor( int red, int green, int blue );
+ CColor( const QColor& c );
+ operator COLORTYPE() const;
+
+ operator QColor() const;
+
+ // RGB - Routinen
+ // --------------
+ void SetRed(int red); // 0..255
+ void SetGreen(int green); // 0..255
+ void SetBlue(int blue); // 0..255
+ void SetRGB(int red, int green, int blue);
+ void SetColor(COLORTYPE color);
+
+ unsigned int GetRed() const; // 0..255
+ unsigned int GetGreen() const; // 0..255
+ unsigned int GetBlue() const; // 0..255
+ COLORTYPE GetRGBColor();
+
+ // HLS - Routinen
+ // --------------
+ void SetHue(float hue); // 0.0 .. 360.0
+ void SetLuminance(float luminance); // 0.0 .. 1.0
+ void SetSaturation(float saturation); // 0.0 .. 1.0
+ void SetHLS(float hue, float luminance, float saturation);
+
+ float GetHue() const; // 0.0 .. 360.0
+ float GetLuminance() const; // 0.0 .. 1.0
+ float GetSaturation() const; // 0.0 .. 1.0
+
+ // String Konvertierung
+ // ---------------------
+ Q3DStudio::CString GetString() const; // Liefert String im Format RRGGBB
+ bool SetString( const char* pcColor); // Erwartet String im Format RRGGBB
+ QColor getQColor() const;
+
+ // Benannte Web Farben
+ // -------------------
+ Q3DStudio::CString GetName() const; // Liefert String mit benannter Farbe oder #RRGGBB falls kein Name bekannt
+
+ static CColor FromString( const char* pcColor);
+ static const char* GetNameFromIndex(int i);
+ static CColor GetColorFromIndex(int i);
+ static int GetNumNames() {return numNamedColors;}
+ static CColor GetFractionalColor( long inIndex, long inCount );
+
+ enum ENamedColor // Named Colors, could be used as COLORREF
+ {
+ none = 0x7FFFFFFF, // keine Farbe
+ aliceblue = 0x00FFF8F0, // RGB(0xF0, 0xF8, 0xFF)
+ antiquewhite = 0x00D7EBFA, // RGB(0xFA, 0xEB, 0xD7)
+ aqua = 0x00FFFF00, // RGB(0x00, 0xFF, 0xFF)
+ aquamarine = 0x00D4FF7F, // RGB(0x7F, 0xFF, 0xD4)
+ azure = 0x00FFFFF0, // RGB(0xF0, 0xFF, 0xFF)
+ beige = 0x00DCF5F5, // RGB(0xF5, 0xF5, 0xDC)
+ bisque = 0x00C4E4FF, // RGB(0xFF, 0xE4, 0xC4)
+ black = 0x00000000, // RGB(0x00, 0x00, 0x00)
+ blanchedalmond = 0x00CDEBFF, // RGB(0xFF, 0xEB, 0xCD)
+ blue = 0x00FF0000, // RGB(0x00, 0x00, 0xFF)
+ blueviolet = 0x00E22B8A, // RGB(0x8A, 0x2B, 0xE2)
+ brown = 0x002A2AA5, // RGB(0xA5, 0x2A, 0x2A)
+ burlywood = 0x0087B8DE, // RGB(0xDE, 0xB8, 0x87)
+ cadetblue = 0x00A09E5F, // RGB(0x5F, 0x9E, 0xA0)
+ chartreuse = 0x0000FF7F, // RGB(0x7F, 0xFF, 0x00)
+ chocolate = 0x001E69D2, // RGB(0xD2, 0x69, 0x1E)
+ coral = 0x00507FFF, // RGB(0xFF, 0x7F, 0x50)
+ cornflower = 0x00ED9564, // RGB(0x64, 0x95, 0xED)
+ cornsilk = 0x00DCF8FF, // RGB(0xFF, 0xF8, 0xDC)
+ crimson = 0x003C14DC, // RGB(0xDC, 0x14, 0x3C)
+ cyan = 0x00FFFF00, // RGB(0x00, 0xFF, 0xFF)
+ darkblue = 0x008B0000, // RGB(0x00, 0x00, 0x8B)
+ darkcyan = 0x008B8B00, // RGB(0x00, 0x8B, 0x8B)
+ darkgoldenrod = 0x000B86B8, // RGB(0xB8, 0x86, 0x0B)
+ darkgray = 0x00A9A9A9, // RGB(0xA9, 0xA9, 0xA9)
+ darkgreen = 0x00006400, // RGB(0x00, 0x64, 0x00)
+ darkkhaki = 0x006BB7BD, // RGB(0xBD, 0xB7, 0x6B)
+ darkmagenta = 0x008B008B, // RGB(0x8B, 0x00, 0x8B)
+ darkolivegreen = 0x002F6B55, // RGB(0x55, 0x6B, 0x2F)
+ darkorange = 0x00008CFF, // RGB(0xFF, 0x8C, 0x00)
+ darkorchid = 0x00CC3299, // RGB(0x99, 0x32, 0xCC)
+ darkred = 0x0000008B, // RGB(0x8B, 0x00, 0x00)
+ darksalmon = 0x007A96E9, // RGB(0xE9, 0x96, 0x7A)
+ darkseagreen = 0x008BBC8F, // RGB(0x8F, 0xBC, 0x8B)
+ darkslateblue = 0x008B3D48, // RGB(0x48, 0x3D, 0x8B)
+ darkslategray = 0x004F4F2F, // RGB(0x2F, 0x4F, 0x4F)
+ darkturquoise = 0x00D1CE00, // RGB(0x00, 0xCE, 0xD1)
+ darkviolet = 0x00D30094, // RGB(0x94, 0x00, 0xD3)
+ deeppink = 0x009314FF, // RGB(0xFF, 0x14, 0x93)
+ deepskyblue = 0x00FFBF00, // RGB(0x00, 0xBF, 0xFF)
+ dimgray = 0x00696969, // RGB(0x69, 0x69, 0x69)
+ dodgerblue = 0x00FF901E, // RGB(0x1E, 0x90, 0xFF)
+ firebrick = 0x002222B2, // RGB(0xB2, 0x22, 0x22)
+ floralwhite = 0x00F0FAFF, // RGB(0xFF, 0xFA, 0xF0)
+ forestgreen = 0x00228B22, // RGB(0x22, 0x8B, 0x22)
+ fuchsia = 0x00FF00FF, // RGB(0xFF, 0x00, 0xFF)
+ gainsboro = 0x00DCDCDC, // RGB(0xDC, 0xDC, 0xDC)
+ ghostwhite = 0x00FFF8F8, // RGB(0xF8, 0xF8, 0xFF)
+ gold = 0x0000D7FF, // RGB(0xFF, 0xD7, 0x00)
+ goldenrod = 0x0020A5DA, // RGB(0xDA, 0xA5, 0x20)
+ gray = 0x00808080, // RGB(0x80, 0x80, 0x80)
+ green = 0x00008000, // RGB(0x00, 0x80, 0x00)
+ greenyellow = 0x002FFFAD, // RGB(0xAD, 0xFF, 0x2F)
+ honeydew = 0x00F0FFF0, // RGB(0xF0, 0xFF, 0xF0)
+ hotpink = 0x00B469FF, // RGB(0xFF, 0x69, 0xB4)
+ indianred = 0x005C5CCD, // RGB(0xCD, 0x5C, 0x5C)
+ indigo = 0x0082004B, // RGB(0x4B, 0x00, 0x82)
+ ivory = 0x00F0FFFF, // RGB(0xFF, 0xFF, 0xF0)
+ khaki = 0x008CE6F0, // RGB(0xF0, 0xE6, 0x8C)
+ lavender = 0x00FAE6E6, // RGB(0xE6, 0xE6, 0xFA)
+ lavenderblush = 0x00F5F0FF, // RGB(0xFF, 0xF0, 0xF5)
+ lawngreen = 0x0000FC7C, // RGB(0x7C, 0xFC, 0x00)
+ lemonchiffon = 0x00CDFAFF, // RGB(0xFF, 0xFA, 0xCD)
+ lightblue = 0x00E6D8AD, // RGB(0xAD, 0xD8, 0xE6)
+ lightcoral = 0x008080F0, // RGB(0xF0, 0x80, 0x80)
+ lightcyan = 0x00FFFFE0, // RGB(0xE0, 0xFF, 0xFF)
+ lightgoldenrodyellow = 0x00D2FAFA, // RGB(0xFA, 0xFA, 0xD2)
+ lightgreen = 0x0090EE90, // RGB(0x90, 0xEE, 0x90)
+ lightgrey = 0x00D3D3D3, // RGB(0xD3, 0xD3, 0xD3)
+ lightpink = 0x00C1B6FF, // RGB(0xFF, 0xB6, 0xC1)
+ lightsalmon = 0x007AA0FF, // RGB(0xFF, 0xA0, 0x7A)
+ lightseagreen = 0x00AAB220, // RGB(0x20, 0xB2, 0xAA)
+ lightskyblue = 0x00FACE87, // RGB(0x87, 0xCE, 0xFA)
+ lightslategray = 0x00998877, // RGB(0x77, 0x88, 0x99)
+ lightsteelblue = 0x00DEC4B0, // RGB(0xB0, 0xC4, 0xDE)
+ lightyellow = 0x00E0FFFF, // RGB(0xFF, 0xFF, 0xE0)
+ lime = 0x0000FF00, // RGB(0x00, 0xFF, 0x00)
+ limegreen = 0x0032CD32, // RGB(0x32, 0xCD, 0x32)
+ linen = 0x00E6F0FA, // RGB(0xFA, 0xF0, 0xE6)
+ magenta = 0x00FF00FF, // RGB(0xFF, 0x00, 0xFF)
+ maroon = 0x00000080, // RGB(0x80, 0x00, 0x00)
+ mediumaquamarine = 0x00AACD66, // RGB(0x66, 0xCD, 0xAA)
+ mediumblue = 0x00CD0000, // RGB(0x00, 0x00, 0xCD)
+ mediumorchid = 0x00D355BA, // RGB(0xBA, 0x55, 0xD3)
+ mediumpurple = 0x00DB7093, // RGB(0x93, 0x70, 0xDB)
+ mediumseagreen = 0x0071B33C, // RGB(0x3C, 0xB3, 0x71)
+ mediumslateblue = 0x00EE687B, // RGB(0x7B, 0x68, 0xEE)
+ mediumspringgreen = 0x009AFA00, // RGB(0x00, 0xFA, 0x9A)
+ mediumturquoise = 0x00CCD148, // RGB(0x48, 0xD1, 0xCC)
+ mediumvioletred = 0x008515C7, // RGB(0xC7, 0x15, 0x85)
+ midnightblue = 0x00701919, // RGB(0x19, 0x19, 0x70)
+ mintcream = 0x00FAFFF5, // RGB(0xF5, 0xFF, 0xFA)
+ mistyrose = 0x00E1E4FF, // RGB(0xFF, 0xE4, 0xE1)
+ moccasin = 0x00B5E4FF, // RGB(0xFF, 0xE4, 0xB5)
+ navajowhite = 0x00ADDEFF, // RGB(0xFF, 0xDE, 0xAD)
+ navy = 0x00800000, // RGB(0x00, 0x00, 0x80)
+ oldlace = 0x00E6F5FD, // RGB(0xFD, 0xF5, 0xE6)
+ olive = 0x00008080, // RGB(0x80, 0x80, 0x00)
+ olivedrab = 0x00238E6B, // RGB(0x6B, 0x8E, 0x23)
+ orange = 0x0000A5FF, // RGB(0xFF, 0xA5, 0x00)
+ orangered = 0x000045FF, // RGB(0xFF, 0x45, 0x00)
+ orchid = 0x00D670DA, // RGB(0xDA, 0x70, 0xD6)
+ palegoldenrod = 0x00AAE8EE, // RGB(0xEE, 0xE8, 0xAA)
+ palegreen = 0x0098FB98, // RGB(0x98, 0xFB, 0x98)
+ paleturquoise = 0x00EEEEAF, // RGB(0xAF, 0xEE, 0xEE)
+ palevioletred = 0x009370DB, // RGB(0xDB, 0x70, 0x93)
+ papayawhip = 0x00D5EFFF, // RGB(0xFF, 0xEF, 0xD5)
+ peachpuff = 0x00B9DAFF, // RGB(0xFF, 0xDA, 0xB9)
+ peru = 0x003F85CD, // RGB(0xCD, 0x85, 0x3F)
+ pink = 0x00CBC0FF, // RGB(0xFF, 0xC0, 0xCB)
+ plum = 0x00DDA0DD, // RGB(0xDD, 0xA0, 0xDD)
+ powderblue = 0x00E6E0B0, // RGB(0xB0, 0xE0, 0xE6)
+ purple = 0x00800080, // RGB(0x80, 0x00, 0x80)
+ red = 0x000000FF, // RGB(0xFF, 0x00, 0x00)
+ rosybrown = 0x008F8FBC, // RGB(0xBC, 0x8F, 0x8F)
+ royalblue = 0x00E16941, // RGB(0x41, 0x69, 0xE1)
+ saddlebrown = 0x0013458B, // RGB(0x8B, 0x45, 0x13)
+ salmon = 0x007280FA, // RGB(0xFA, 0x80, 0x72)
+ sandybrown = 0x0060A4F4, // RGB(0xF4, 0xA4, 0x60)
+ seagreen = 0x00578B2E, // RGB(0x2E, 0x8B, 0x57)
+ seashell = 0x00EEF5FF, // RGB(0xFF, 0xF5, 0xEE)
+ sienna = 0x002D52A0, // RGB(0xA0, 0x52, 0x2D)
+ silver = 0x00C0C0C0, // RGB(0xC0, 0xC0, 0xC0)
+ skyblue = 0x00EBCE87, // RGB(0x87, 0xCE, 0xEB)
+ slateblue = 0x00CD5A6A, // RGB(0x6A, 0x5A, 0xCD)
+ slategray = 0x00908070, // RGB(0x70, 0x80, 0x90)
+ snow = 0x00FAFAFF, // RGB(0xFF, 0xFA, 0xFA)
+ springgreen = 0x007FFF00, // RGB(0x00, 0xFF, 0x7F)
+ steelblue = 0x00B48246, // RGB(0x46, 0x82, 0xB4)
+ tan = 0x008CB4D2, // RGB(0xD2, 0xB4, 0x8C)
+ teal = 0x00808000, // RGB(0x00, 0x80, 0x80)
+ thistle = 0x00D8BFD8, // RGB(0xD8, 0xBF, 0xD8)
+ tomato = 0x004763FF, // RGB(0xFF, 0x63, 0x47)
+ turquoise = 0x00D0E040, // RGB(0x40, 0xE0, 0xD0)
+ violet = 0x00EE82EE, // RGB(0xEE, 0x82, 0xEE)
+ wheat = 0x00B3DEF5, // RGB(0xF5, 0xDE, 0xB3)
+ white = 0x00FFFFFF, // RGB(0xFF, 0xFF, 0xFF)
+ whitesmoke = 0x00F5F5F5, // RGB(0xF5, 0xF5, 0xF5)
+ yellow = 0x0000FFFF, // RGB(0xFF, 0xFF, 0x00)
+ yellowgreen = 0x0032CD9A, // RGB(0x9A, 0xCD, 0x32)
+ };
+
+ enum ENamedColorIndex
+ {
+ i_aliceblue, i_antiquewhite, i_aqua, i_aquamarine, i_azure, i_beige, i_bisque, i_black,
+ i_blanchedalmond, i_blue, i_blueviolet, i_brown, i_burlywood, i_cadetblue, i_chartreuse,
+ i_chocolate, i_coral, i_cornflower, i_cornsilk, i_crimson, i_cyan, i_darkblue, i_darkcyan,
+ i_darkgoldenrod, i_darkgray, i_darkgreen, i_darkkhaki, i_darkmagenta, i_darkolivegreen,
+ i_darkorange, i_darkorchid, i_darkred, i_darksalmon, i_darkseagreen, i_darkslateblue,
+ i_darkslategray, i_darkturquoise, i_darkviolet, i_deeppink, i_deepskyblue, i_dimgray,
+ i_dodgerblue, i_firebrick, i_floralwhite, i_forestgreen, i_fuchsia, i_gainsboro,
+ i_ghostwhite, i_gold, i_goldenrod, i_gray, i_green, i_greenyellow, i_honeydew, i_hotpink,
+ i_indianred, i_indigo, i_ivory, i_khaki, i_lavender, i_lavenderblush, i_lawngreen,
+ i_lemonchiffon, i_lightblue, i_lightcoral, i_lightcyan, i_lightgoldenrodyellow,
+ i_lightgreen, i_lightgrey, i_lightpink, i_lightsalmon, i_lightseagreen, i_lightskyblue,
+ i_lightslategray, i_lightsteelblue, i_lightyellow, i_lime, i_limegreen, i_linen,
+ i_magenta, i_maroon, i_mediumaquamarine, i_mediumblue, i_mediumorchid, i_mediumpurple,
+ i_mediumseagreen, i_mediumslateblue, i_mediumspringgreen, i_mediumturquoise,
+ i_mediumvioletred, i_midnightblue, i_mintcream, i_mistyrose, i_moccasin, i_navajowhite,
+ i_navy, i_oldlace, i_olive, i_olivedrab, i_orange, i_orangered, i_orchid, i_palegoldenrod,
+ i_palegreen, i_paleturquoise, i_palevioletred, i_papayawhip, i_peachpuff, i_peru, i_pink,
+ i_plum, i_powderblue, i_purple, i_red, i_rosybrown, i_royalblue, i_saddlebrown, i_salmon,
+ i_sandybrown, i_seagreen, i_seashell, i_sienna, i_silver, i_skyblue, i_slateblue,
+ i_slategray, i_snow, i_springgreen, i_steelblue, i_tan, i_teal, i_thistle, i_tomato,
+ i_turquoise, i_violet, i_wheat, i_white, i_whitesmoke, i_yellow, i_yellowgreen,
+ numNamedColors
+ };
+
+private:
+
+ // Konvertierung
+ // -------------
+ void ToRGB(); // logisch konstant, nicht physikalisch
+ void ToHLS(); // logisch konstant, nicht physikalisch
+ static unsigned char ToRGB1(float rm1, float rm2, float rh);
+
+ // Daten
+ // -----
+ union // Byteweiser Zugriff auf die COLORREF Struktur
+ {
+ COLORTYPE m_colorref;
+ unsigned char m_color[4];
+ };
+ enum {c_red = 0, c_green = 1, c_blue = 2, c_null = 3}; // enum Hack f�r colorbyte-Index
+
+ float m_hue; // 0.0 .. 360.0 // Winkel
+ float m_saturation; // 0.0 .. 1.0 // Prozent
+ float m_luminance; // 0.0 .. 1.0 // Prozent
+
+ // Flag f�r Lazy Evaluation
+ bool m_bIsRGB;
+ bool m_bIsHLS;
+
+ // statische Konstanten f�r benannte Farben
+ struct DNamedColor
+ {
+ COLORTYPE color;
+ const char* name;
+ };
+ static const DNamedColor m_namedColor[numNamedColors];
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// global functions
+/////////////////////////////////////////////////////////////////////////////
+
+COLORTYPE GetHueColor(int iHue) ;
+
+void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v );
+void RGBToHSV( unsigned char r, unsigned char g, unsigned char b, float* h, float *s, float* v );
+
+void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v );
+void HSVToRGB( unsigned char& r, unsigned char& g, unsigned char& b, float h, float s, float v );
+
+short GetHueValue( COLORTYPE inColor );
+short GetSaturationValue( COLORTYPE inColor );
+short GetBrightnessValue( COLORTYPE inColor );
+
+
+#endif
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES2/gl2.h b/src/3rdparty/platformspecific/Android/jni/GLES2/gl2.h
new file mode 100644
index 0000000..f64ec00
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES2/gl2.h
@@ -0,0 +1,677 @@
+#ifndef __gl2_h_
+#define __gl2_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision: 32120 $ on $Date: 2015-10-15 04:27:13 -0700 (Thu, 15 Oct 2015) $
+*/
+
+#include <GLES2/gl2platform.h>
+
+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+#if !defined(GL_GLES_PROTOTYPES)
+#define GL_GLES_PROTOTYPES 1
+#endif
+
+/* Generated on date 20151015 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include <KHR/khrplatform.h>
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_FALSE 0
+#define GL_TRUE 1
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_FUNC_ADD 0x8006
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STATIC_DRAW 0x88E4
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_CULL_FACE 0x0B44
+#define GL_BLEND 0x0BE2
+#define GL_DITHER 0x0BD0
+#define GL_STENCIL_TEST 0x0B90
+#define GL_DEPTH_TEST 0x0B71
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_LINE_WIDTH 0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_FIXED 0x140C
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_DELETE_STATUS 0x8B80
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_INVERT 0x150A
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_REPEAT 0x2901
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGB565 0x8D62
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_NONE 0
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES2/gl2ext.h b/src/3rdparty/platformspecific/Android/jni/GLES2/gl2ext.h
new file mode 100644
index 0000000..2d05596
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES2/gl2ext.h
@@ -0,0 +1,2946 @@
+#ifndef __gl2ext_h_
+#define __gl2ext_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision: 32120 $ on $Date: 2015-10-15 04:27:13 -0700 (Thu, 15 Oct 2015) $
+*/
+
+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+/* Generated on date 20151015 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]
+ * Versions emitted: _nomatch_^
+ * Default extensions included: gles2
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_KHR_blend_equation_advanced
+#define GL_KHR_blend_equation_advanced 1
+#define GL_MULTIPLY_KHR 0x9294
+#define GL_SCREEN_KHR 0x9295
+#define GL_OVERLAY_KHR 0x9296
+#define GL_DARKEN_KHR 0x9297
+#define GL_LIGHTEN_KHR 0x9298
+#define GL_COLORDODGE_KHR 0x9299
+#define GL_COLORBURN_KHR 0x929A
+#define GL_HARDLIGHT_KHR 0x929B
+#define GL_SOFTLIGHT_KHR 0x929C
+#define GL_DIFFERENCE_KHR 0x929E
+#define GL_EXCLUSION_KHR 0x92A0
+#define GL_HSL_HUE_KHR 0x92AD
+#define GL_HSL_SATURATION_KHR 0x92AE
+#define GL_HSL_COLOR_KHR 0x92AF
+#define GL_HSL_LUMINOSITY_KHR 0x92B0
+typedef void (GL_APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlendBarrierKHR (void);
+#endif
+#endif /* GL_KHR_blend_equation_advanced */
+
+#ifndef GL_KHR_blend_equation_advanced_coherent
+#define GL_KHR_blend_equation_advanced_coherent 1
+#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285
+#endif /* GL_KHR_blend_equation_advanced_coherent */
+
+#ifndef GL_KHR_context_flush_control
+#define GL_KHR_context_flush_control 1
+#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB
+#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC
+#endif /* GL_KHR_context_flush_control */
+
+#ifndef GL_KHR_debug
+#define GL_KHR_debug 1
+typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+#define GL_SAMPLER 0x82E6
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245
+#define GL_DEBUG_SOURCE_API_KHR 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A
+#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B
+#define GL_DEBUG_TYPE_ERROR_KHR 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250
+#define GL_DEBUG_TYPE_OTHER_KHR 0x8251
+#define GL_DEBUG_TYPE_MARKER_KHR 0x8268
+#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269
+#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A
+#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C
+#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D
+#define GL_BUFFER_KHR 0x82E0
+#define GL_SHADER_KHR 0x82E1
+#define GL_PROGRAM_KHR 0x82E2
+#define GL_VERTEX_ARRAY_KHR 0x8074
+#define GL_QUERY_KHR 0x82E3
+#define GL_PROGRAM_PIPELINE_KHR 0x82E4
+#define GL_SAMPLER_KHR 0x82E6
+#define GL_MAX_LABEL_LENGTH_KHR 0x82E8
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147
+#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148
+#define GL_DEBUG_OUTPUT_KHR 0x92E0
+#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002
+#define GL_STACK_OVERFLOW_KHR 0x0503
+#define GL_STACK_UNDERFLOW_KHR 0x0504
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam);
+typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void);
+typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, void **params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam);
+GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void);
+GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params);
+#endif
+#endif /* GL_KHR_debug */
+
+#ifndef GL_KHR_no_error
+#define GL_KHR_no_error 1
+#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
+#endif /* GL_KHR_no_error */
+
+#ifndef GL_KHR_robust_buffer_access_behavior
+#define GL_KHR_robust_buffer_access_behavior 1
+#endif /* GL_KHR_robust_buffer_access_behavior */
+
+#ifndef GL_KHR_robustness
+#define GL_KHR_robustness 1
+#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3
+#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252
+#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253
+#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256
+#define GL_NO_RESET_NOTIFICATION_KHR 0x8261
+#define GL_CONTEXT_LOST_KHR 0x0507
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusKHR (void);
+GL_APICALL void GL_APIENTRY glReadnPixelsKHR (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GL_APICALL void GL_APIENTRY glGetnUniformfvKHR (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetnUniformivKHR (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GL_APICALL void GL_APIENTRY glGetnUniformuivKHR (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+#endif
+#endif /* GL_KHR_robustness */
+
+#ifndef GL_KHR_texture_compression_astc_hdr
+#define GL_KHR_texture_compression_astc_hdr 1
+#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
+#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1
+#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2
+#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3
+#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4
+#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5
+#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6
+#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7
+#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8
+#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9
+#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA
+#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB
+#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC
+#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
+#endif /* GL_KHR_texture_compression_astc_hdr */
+
+#ifndef GL_KHR_texture_compression_astc_ldr
+#define GL_KHR_texture_compression_astc_ldr 1
+#endif /* GL_KHR_texture_compression_astc_ldr */
+
+#ifndef GL_KHR_texture_compression_astc_sliced_3d
+#define GL_KHR_texture_compression_astc_sliced_3d 1
+#endif /* GL_KHR_texture_compression_astc_sliced_3d */
+
+#ifndef GL_OES_EGL_image
+#define GL_OES_EGL_image 1
+typedef void *GLeglImageOES;
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
+typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
+GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);
+#endif
+#endif /* GL_OES_EGL_image */
+
+#ifndef GL_OES_EGL_image_external
+#define GL_OES_EGL_image_external 1
+#define GL_TEXTURE_EXTERNAL_OES 0x8D65
+#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67
+#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68
+#define GL_SAMPLER_EXTERNAL_OES 0x8D66
+#endif /* GL_OES_EGL_image_external */
+
+#ifndef GL_OES_EGL_image_external_essl3
+#define GL_OES_EGL_image_external_essl3 1
+#endif /* GL_OES_EGL_image_external_essl3 */
+
+#ifndef GL_OES_compressed_ETC1_RGB8_sub_texture
+#define GL_OES_compressed_ETC1_RGB8_sub_texture 1
+#endif /* GL_OES_compressed_ETC1_RGB8_sub_texture */
+
+#ifndef GL_OES_compressed_ETC1_RGB8_texture
+#define GL_OES_compressed_ETC1_RGB8_texture 1
+#define GL_ETC1_RGB8_OES 0x8D64
+#endif /* GL_OES_compressed_ETC1_RGB8_texture */
+
+#ifndef GL_OES_compressed_paletted_texture
+#define GL_OES_compressed_paletted_texture 1
+#define GL_PALETTE4_RGB8_OES 0x8B90
+#define GL_PALETTE4_RGBA8_OES 0x8B91
+#define GL_PALETTE4_R5_G6_B5_OES 0x8B92
+#define GL_PALETTE4_RGBA4_OES 0x8B93
+#define GL_PALETTE4_RGB5_A1_OES 0x8B94
+#define GL_PALETTE8_RGB8_OES 0x8B95
+#define GL_PALETTE8_RGBA8_OES 0x8B96
+#define GL_PALETTE8_R5_G6_B5_OES 0x8B97
+#define GL_PALETTE8_RGBA4_OES 0x8B98
+#define GL_PALETTE8_RGB5_A1_OES 0x8B99
+#endif /* GL_OES_compressed_paletted_texture */
+
+#ifndef GL_OES_copy_image
+#define GL_OES_copy_image 1
+typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAOESPROC) (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);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCopyImageSubDataOES (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);
+#endif
+#endif /* GL_OES_copy_image */
+
+#ifndef GL_OES_depth24
+#define GL_OES_depth24 1
+#define GL_DEPTH_COMPONENT24_OES 0x81A6
+#endif /* GL_OES_depth24 */
+
+#ifndef GL_OES_depth32
+#define GL_OES_depth32 1
+#define GL_DEPTH_COMPONENT32_OES 0x81A7
+#endif /* GL_OES_depth32 */
+
+#ifndef GL_OES_depth_texture
+#define GL_OES_depth_texture 1
+#endif /* GL_OES_depth_texture */
+
+#ifndef GL_OES_draw_buffers_indexed
+#define GL_OES_draw_buffers_indexed 1
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+typedef void (GL_APIENTRYP PFNGLENABLEIOESPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEIOESPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIOESPROC) (GLenum target, GLuint index);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glEnableiOES (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisableiOES (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glBlendEquationiOES (GLuint buf, GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparateiOES (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunciOES (GLuint buf, GLenum src, GLenum dst);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparateiOES (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GL_APICALL void GL_APIENTRY glColorMaskiOES (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GL_APICALL GLboolean GL_APIENTRY glIsEnablediOES (GLenum target, GLuint index);
+#endif
+#endif /* GL_OES_draw_buffers_indexed */
+
+#ifndef GL_OES_draw_elements_base_vertex
+#define GL_OES_draw_elements_base_vertex 1
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexOES (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexOES (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
+#endif
+#endif /* GL_OES_draw_elements_base_vertex */
+
+#ifndef GL_OES_element_index_uint
+#define GL_OES_element_index_uint 1
+#endif /* GL_OES_element_index_uint */
+
+#ifndef GL_OES_fbo_render_mipmap
+#define GL_OES_fbo_render_mipmap 1
+#endif /* GL_OES_fbo_render_mipmap */
+
+#ifndef GL_OES_fragment_precision_high
+#define GL_OES_fragment_precision_high 1
+#endif /* GL_OES_fragment_precision_high */
+
+#ifndef GL_OES_geometry_point_size
+#define GL_OES_geometry_point_size 1
+#endif /* GL_OES_geometry_point_size */
+
+#ifndef GL_OES_geometry_shader
+#define GL_OES_geometry_shader 1
+#define GL_GEOMETRY_SHADER_OES 0x8DD9
+#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004
+#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916
+#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917
+#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918
+#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F
+#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E
+#define GL_LINES_ADJACENCY_OES 0x000A
+#define GL_LINE_STRIP_ADJACENCY_OES 0x000B
+#define GL_TRIANGLES_ADJACENCY_OES 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0x000D
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7
+#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E
+#define GL_UNDEFINED_VERTEX_OES 0x8260
+#define GL_PRIMITIVES_GENERATED_OES 0x8C87
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312
+#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7
+#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferTextureOES (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#endif
+#endif /* GL_OES_geometry_shader */
+
+#ifndef GL_OES_get_program_binary
+#define GL_OES_get_program_binary 1
+#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length);
+#endif
+#endif /* GL_OES_get_program_binary */
+
+#ifndef GL_OES_gpu_shader5
+#define GL_OES_gpu_shader5 1
+#endif /* GL_OES_gpu_shader5 */
+
+#ifndef GL_OES_mapbuffer
+#define GL_OES_mapbuffer 1
+#define GL_WRITE_ONLY_OES 0x88B9
+#define GL_BUFFER_ACCESS_OES 0x88BB
+#define GL_BUFFER_MAPPED_OES 0x88BC
+#define GL_BUFFER_MAP_POINTER_OES 0x88BD
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params);
+#endif
+#endif /* GL_OES_mapbuffer */
+
+#ifndef GL_OES_packed_depth_stencil
+#define GL_OES_packed_depth_stencil 1
+#define GL_DEPTH_STENCIL_OES 0x84F9
+#define GL_UNSIGNED_INT_24_8_OES 0x84FA
+#define GL_DEPTH24_STENCIL8_OES 0x88F0
+#endif /* GL_OES_packed_depth_stencil */
+
+#ifndef GL_OES_primitive_bounding_box
+#define GL_OES_primitive_bounding_box 1
+#define GL_PRIMITIVE_BOUNDING_BOX_OES 0x92BE
+typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxOES (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+#endif
+#endif /* GL_OES_primitive_bounding_box */
+
+#ifndef GL_OES_required_internalformat
+#define GL_OES_required_internalformat 1
+#define GL_ALPHA8_OES 0x803C
+#define GL_DEPTH_COMPONENT16_OES 0x81A5
+#define GL_LUMINANCE4_ALPHA4_OES 0x8043
+#define GL_LUMINANCE8_ALPHA8_OES 0x8045
+#define GL_LUMINANCE8_OES 0x8040
+#define GL_RGBA4_OES 0x8056
+#define GL_RGB5_A1_OES 0x8057
+#define GL_RGB565_OES 0x8D62
+#define GL_RGB8_OES 0x8051
+#define GL_RGBA8_OES 0x8058
+#define GL_RGB10_EXT 0x8052
+#define GL_RGB10_A2_EXT 0x8059
+#endif /* GL_OES_required_internalformat */
+
+#ifndef GL_OES_rgb8_rgba8
+#define GL_OES_rgb8_rgba8 1
+#endif /* GL_OES_rgb8_rgba8 */
+
+#ifndef GL_OES_sample_shading
+#define GL_OES_sample_shading 1
+#define GL_SAMPLE_SHADING_OES 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37
+typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGOESPROC) (GLfloat value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glMinSampleShadingOES (GLfloat value);
+#endif
+#endif /* GL_OES_sample_shading */
+
+#ifndef GL_OES_sample_variables
+#define GL_OES_sample_variables 1
+#endif /* GL_OES_sample_variables */
+
+#ifndef GL_OES_shader_image_atomic
+#define GL_OES_shader_image_atomic 1
+#endif /* GL_OES_shader_image_atomic */
+
+#ifndef GL_OES_shader_io_blocks
+#define GL_OES_shader_io_blocks 1
+#endif /* GL_OES_shader_io_blocks */
+
+#ifndef GL_OES_shader_multisample_interpolation
+#define GL_OES_shader_multisample_interpolation 1
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D
+#endif /* GL_OES_shader_multisample_interpolation */
+
+#ifndef GL_OES_standard_derivatives
+#define GL_OES_standard_derivatives 1
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B
+#endif /* GL_OES_standard_derivatives */
+
+#ifndef GL_OES_stencil1
+#define GL_OES_stencil1 1
+#define GL_STENCIL_INDEX1_OES 0x8D46
+#endif /* GL_OES_stencil1 */
+
+#ifndef GL_OES_stencil4
+#define GL_OES_stencil4 1
+#define GL_STENCIL_INDEX4_OES 0x8D47
+#endif /* GL_OES_stencil4 */
+
+#ifndef GL_OES_surfaceless_context
+#define GL_OES_surfaceless_context 1
+#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219
+#endif /* GL_OES_surfaceless_context */
+
+#ifndef GL_OES_tessellation_point_size
+#define GL_OES_tessellation_point_size 1
+#endif /* GL_OES_tessellation_point_size */
+
+#ifndef GL_OES_tessellation_shader
+#define GL_OES_tessellation_shader 1
+#define GL_PATCHES_OES 0x000E
+#define GL_PATCH_VERTICES_OES 0x8E72
+#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75
+#define GL_TESS_GEN_MODE_OES 0x8E76
+#define GL_TESS_GEN_SPACING_OES 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78
+#define GL_TESS_GEN_POINT_MODE_OES 0x8E79
+#define GL_ISOLINES_OES 0x8E7A
+#define GL_QUADS_OES 0x0007
+#define GL_FRACTIONAL_ODD_OES 0x8E7B
+#define GL_FRACTIONAL_EVEN_OES 0x8E7C
+#define GL_MAX_PATCH_VERTICES_OES 0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221
+#define GL_IS_PER_PATCH_OES 0x92E7
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308
+#define GL_TESS_CONTROL_SHADER_OES 0x8E88
+#define GL_TESS_EVALUATION_SHADER_OES 0x8E87
+#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010
+typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPatchParameteriOES (GLenum pname, GLint value);
+#endif
+#endif /* GL_OES_tessellation_shader */
+
+#ifndef GL_OES_texture_3D
+#define GL_OES_texture_3D 1
+#define GL_TEXTURE_WRAP_R_OES 0x8072
+#define GL_TEXTURE_3D_OES 0x806F
+#define GL_TEXTURE_BINDING_3D_OES 0x806A
+#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073
+#define GL_SAMPLER_3D_OES 0x8B5F
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+#endif
+#endif /* GL_OES_texture_3D */
+
+#ifndef GL_OES_texture_border_clamp
+#define GL_OES_texture_border_clamp 1
+#define GL_TEXTURE_BORDER_COLOR_OES 0x1004
+#define GL_CLAMP_TO_BORDER_OES 0x812D
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexParameterIivOES (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexParameterIuivOES (GLenum target, GLenum pname, const GLuint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIivOES (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIuivOES (GLenum target, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glSamplerParameterIivOES (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterIuivOES (GLuint sampler, GLenum pname, const GLuint *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIivOES (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivOES (GLuint sampler, GLenum pname, GLuint *params);
+#endif
+#endif /* GL_OES_texture_border_clamp */
+
+#ifndef GL_OES_texture_buffer
+#define GL_OES_texture_buffer 1
+#define GL_TEXTURE_BUFFER_OES 0x8C2A
+#define GL_TEXTURE_BUFFER_BINDING_OES 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_OES 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_OES 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F
+#define GL_SAMPLER_BUFFER_OES 0x8DC2
+#define GL_INT_SAMPLER_BUFFER_OES 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8
+#define GL_IMAGE_BUFFER_OES 0x9051
+#define GL_INT_IMAGE_BUFFER_OES 0x905C
+#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES 0x9067
+#define GL_TEXTURE_BUFFER_OFFSET_OES 0x919D
+#define GL_TEXTURE_BUFFER_SIZE_OES 0x919E
+typedef void (GL_APIENTRYP PFNGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexBufferOES (GLenum target, GLenum internalformat, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTexBufferRangeOES (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#endif
+#endif /* GL_OES_texture_buffer */
+
+#ifndef GL_OES_texture_compression_astc
+#define GL_OES_texture_compression_astc 1
+#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0
+#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1
+#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2
+#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3
+#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4
+#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5
+#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6
+#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7
+#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8
+#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9
+#endif /* GL_OES_texture_compression_astc */
+
+#ifndef GL_OES_texture_cube_map_array
+#define GL_OES_texture_cube_map_array 1
+#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A
+#define GL_SAMPLER_CUBE_MAP_ARRAY_OES 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F
+#define GL_IMAGE_CUBE_MAP_ARRAY_OES 0x9054
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x905F
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A
+#endif /* GL_OES_texture_cube_map_array */
+
+#ifndef GL_OES_texture_float
+#define GL_OES_texture_float 1
+#endif /* GL_OES_texture_float */
+
+#ifndef GL_OES_texture_float_linear
+#define GL_OES_texture_float_linear 1
+#endif /* GL_OES_texture_float_linear */
+
+#ifndef GL_OES_texture_half_float
+#define GL_OES_texture_half_float 1
+#define GL_HALF_FLOAT_OES 0x8D61
+#endif /* GL_OES_texture_half_float */
+
+#ifndef GL_OES_texture_half_float_linear
+#define GL_OES_texture_half_float_linear 1
+#endif /* GL_OES_texture_half_float_linear */
+
+#ifndef GL_OES_texture_npot
+#define GL_OES_texture_npot 1
+#endif /* GL_OES_texture_npot */
+
+#ifndef GL_OES_texture_stencil8
+#define GL_OES_texture_stencil8 1
+#define GL_STENCIL_INDEX_OES 0x1901
+#define GL_STENCIL_INDEX8_OES 0x8D48
+#endif /* GL_OES_texture_stencil8 */
+
+#ifndef GL_OES_texture_storage_multisample_2d_array
+#define GL_OES_texture_storage_multisample_2d_array 1
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexStorage3DMultisampleOES (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#endif
+#endif /* GL_OES_texture_storage_multisample_2d_array */
+
+#ifndef GL_OES_texture_view
+#define GL_OES_texture_view 1
+#define GL_TEXTURE_VIEW_MIN_LEVEL_OES 0x82DB
+#define GL_TEXTURE_VIEW_NUM_LEVELS_OES 0x82DC
+#define GL_TEXTURE_VIEW_MIN_LAYER_OES 0x82DD
+#define GL_TEXTURE_VIEW_NUM_LAYERS_OES 0x82DE
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTextureViewOES (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#endif
+#endif /* GL_OES_texture_view */
+
+#ifndef GL_OES_vertex_array_object
+#define GL_OES_vertex_array_object 1
+#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array);
+#endif
+#endif /* GL_OES_vertex_array_object */
+
+#ifndef GL_OES_vertex_half_float
+#define GL_OES_vertex_half_float 1
+#endif /* GL_OES_vertex_half_float */
+
+#ifndef GL_OES_vertex_type_10_10_10_2
+#define GL_OES_vertex_type_10_10_10_2 1
+#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6
+#define GL_INT_10_10_10_2_OES 0x8DF7
+#endif /* GL_OES_vertex_type_10_10_10_2 */
+
+#ifndef GL_AMD_compressed_3DC_texture
+#define GL_AMD_compressed_3DC_texture 1
+#define GL_3DC_X_AMD 0x87F9
+#define GL_3DC_XY_AMD 0x87FA
+#endif /* GL_AMD_compressed_3DC_texture */
+
+#ifndef GL_AMD_compressed_ATC_texture
+#define GL_AMD_compressed_ATC_texture 1
+#define GL_ATC_RGB_AMD 0x8C92
+#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93
+#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE
+#endif /* GL_AMD_compressed_ATC_texture */
+
+#ifndef GL_AMD_performance_monitor
+#define GL_AMD_performance_monitor 1
+#define GL_COUNTER_TYPE_AMD 0x8BC0
+#define GL_COUNTER_RANGE_AMD 0x8BC1
+#define GL_UNSIGNED_INT64_AMD 0x8BC2
+#define GL_PERCENTAGE_AMD 0x8BC3
+#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4
+#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5
+#define GL_PERFMON_RESULT_AMD 0x8BC6
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data);
+typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
+typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
+typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);
+typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
+GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
+GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);
+GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);
+GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data);
+GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors);
+GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors);
+GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);
+GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor);
+GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor);
+GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
+#endif
+#endif /* GL_AMD_performance_monitor */
+
+#ifndef GL_AMD_program_binary_Z400
+#define GL_AMD_program_binary_Z400 1
+#define GL_Z400_BINARY_AMD 0x8740
+#endif /* GL_AMD_program_binary_Z400 */
+
+#ifndef GL_ANDROID_extension_pack_es31a
+#define GL_ANDROID_extension_pack_es31a 1
+#endif /* GL_ANDROID_extension_pack_es31a */
+
+#ifndef GL_ANGLE_depth_texture
+#define GL_ANGLE_depth_texture 1
+#endif /* GL_ANGLE_depth_texture */
+
+#ifndef GL_ANGLE_framebuffer_blit
+#define GL_ANGLE_framebuffer_blit 1
+#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8
+#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#endif
+#endif /* GL_ANGLE_framebuffer_blit */
+
+#ifndef GL_ANGLE_framebuffer_multisample
+#define GL_ANGLE_framebuffer_multisample 1
+#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56
+#define GL_MAX_SAMPLES_ANGLE 0x8D57
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ANGLE_framebuffer_multisample */
+
+#ifndef GL_ANGLE_instanced_arrays
+#define GL_ANGLE_instanced_arrays 1
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor);
+#endif
+#endif /* GL_ANGLE_instanced_arrays */
+
+#ifndef GL_ANGLE_pack_reverse_row_order
+#define GL_ANGLE_pack_reverse_row_order 1
+#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4
+#endif /* GL_ANGLE_pack_reverse_row_order */
+
+#ifndef GL_ANGLE_program_binary
+#define GL_ANGLE_program_binary 1
+#define GL_PROGRAM_BINARY_ANGLE 0x93A6
+#endif /* GL_ANGLE_program_binary */
+
+#ifndef GL_ANGLE_texture_compression_dxt3
+#define GL_ANGLE_texture_compression_dxt3 1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2
+#endif /* GL_ANGLE_texture_compression_dxt3 */
+
+#ifndef GL_ANGLE_texture_compression_dxt5
+#define GL_ANGLE_texture_compression_dxt5 1
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3
+#endif /* GL_ANGLE_texture_compression_dxt5 */
+
+#ifndef GL_ANGLE_texture_usage
+#define GL_ANGLE_texture_usage 1
+#define GL_TEXTURE_USAGE_ANGLE 0x93A2
+#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3
+#endif /* GL_ANGLE_texture_usage */
+
+#ifndef GL_ANGLE_translated_shader_source
+#define GL_ANGLE_translated_shader_source 1
+#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
+typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
+#endif
+#endif /* GL_ANGLE_translated_shader_source */
+
+#ifndef GL_APPLE_clip_distance
+#define GL_APPLE_clip_distance 1
+#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32
+#define GL_CLIP_DISTANCE0_APPLE 0x3000
+#define GL_CLIP_DISTANCE1_APPLE 0x3001
+#define GL_CLIP_DISTANCE2_APPLE 0x3002
+#define GL_CLIP_DISTANCE3_APPLE 0x3003
+#define GL_CLIP_DISTANCE4_APPLE 0x3004
+#define GL_CLIP_DISTANCE5_APPLE 0x3005
+#define GL_CLIP_DISTANCE6_APPLE 0x3006
+#define GL_CLIP_DISTANCE7_APPLE 0x3007
+#endif /* GL_APPLE_clip_distance */
+
+#ifndef GL_APPLE_color_buffer_packed_float
+#define GL_APPLE_color_buffer_packed_float 1
+#endif /* GL_APPLE_color_buffer_packed_float */
+
+#ifndef GL_APPLE_copy_texture_levels
+#define GL_APPLE_copy_texture_levels 1
+typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount);
+#endif
+#endif /* GL_APPLE_copy_texture_levels */
+
+#ifndef GL_APPLE_framebuffer_multisample
+#define GL_APPLE_framebuffer_multisample 1
+#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56
+#define GL_MAX_SAMPLES_APPLE 0x8D57
+#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8
+#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void);
+#endif
+#endif /* GL_APPLE_framebuffer_multisample */
+
+#ifndef GL_APPLE_rgb_422
+#define GL_APPLE_rgb_422 1
+#define GL_RGB_422_APPLE 0x8A1F
+#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
+#define GL_RGB_RAW_422_APPLE 0x8A51
+#endif /* GL_APPLE_rgb_422 */
+
+#ifndef GL_APPLE_sync
+#define GL_APPLE_sync 1
+#define GL_SYNC_OBJECT_APPLE 0x8A53
+#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111
+#define GL_OBJECT_TYPE_APPLE 0x9112
+#define GL_SYNC_CONDITION_APPLE 0x9113
+#define GL_SYNC_STATUS_APPLE 0x9114
+#define GL_SYNC_FLAGS_APPLE 0x9115
+#define GL_SYNC_FENCE_APPLE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117
+#define GL_UNSIGNALED_APPLE 0x9118
+#define GL_SIGNALED_APPLE 0x9119
+#define GL_ALREADY_SIGNALED_APPLE 0x911A
+#define GL_TIMEOUT_EXPIRED_APPLE 0x911B
+#define GL_CONDITION_SATISFIED_APPLE 0x911C
+#define GL_WAIT_FAILED_APPLE 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001
+#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+#endif
+#endif /* GL_APPLE_sync */
+
+#ifndef GL_APPLE_texture_format_BGRA8888
+#define GL_APPLE_texture_format_BGRA8888 1
+#define GL_BGRA_EXT 0x80E1
+#define GL_BGRA8_EXT 0x93A1
+#endif /* GL_APPLE_texture_format_BGRA8888 */
+
+#ifndef GL_APPLE_texture_max_level
+#define GL_APPLE_texture_max_level 1
+#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D
+#endif /* GL_APPLE_texture_max_level */
+
+#ifndef GL_APPLE_texture_packed_float
+#define GL_APPLE_texture_packed_float 1
+#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B
+#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E
+#define GL_R11F_G11F_B10F_APPLE 0x8C3A
+#define GL_RGB9_E5_APPLE 0x8C3D
+#endif /* GL_APPLE_texture_packed_float */
+
+#ifndef GL_ARM_mali_program_binary
+#define GL_ARM_mali_program_binary 1
+#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61
+#endif /* GL_ARM_mali_program_binary */
+
+#ifndef GL_ARM_mali_shader_binary
+#define GL_ARM_mali_shader_binary 1
+#define GL_MALI_SHADER_BINARY_ARM 0x8F60
+#endif /* GL_ARM_mali_shader_binary */
+
+#ifndef GL_ARM_rgba8
+#define GL_ARM_rgba8 1
+#endif /* GL_ARM_rgba8 */
+
+#ifndef GL_ARM_shader_framebuffer_fetch
+#define GL_ARM_shader_framebuffer_fetch 1
+#define GL_FETCH_PER_SAMPLE_ARM 0x8F65
+#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66
+#endif /* GL_ARM_shader_framebuffer_fetch */
+
+#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil
+#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1
+#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */
+
+#ifndef GL_DMP_program_binary
+#define GL_DMP_program_binary 1
+#define GL_SMAPHS30_PROGRAM_BINARY_DMP 0x9251
+#define GL_SMAPHS_PROGRAM_BINARY_DMP 0x9252
+#define GL_DMP_PROGRAM_BINARY_DMP 0x9253
+#endif /* GL_DMP_program_binary */
+
+#ifndef GL_DMP_shader_binary
+#define GL_DMP_shader_binary 1
+#define GL_SHADER_BINARY_DMP 0x9250
+#endif /* GL_DMP_shader_binary */
+
+#ifndef GL_EXT_YUV_target
+#define GL_EXT_YUV_target 1
+#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7
+#endif /* GL_EXT_YUV_target */
+
+#ifndef GL_EXT_base_instance
+#define GL_EXT_base_instance 1
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawArraysInstancedBaseInstanceEXT (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+#endif
+#endif /* GL_EXT_base_instance */
+
+#ifndef GL_EXT_blend_func_extended
+#define GL_EXT_blend_func_extended 1
+#define GL_SRC1_COLOR_EXT 0x88F9
+#define GL_SRC1_ALPHA_EXT 0x8589
+#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA
+#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB
+#define GL_SRC_ALPHA_SATURATE_EXT 0x0308
+#define GL_LOCATION_INDEX_EXT 0x930F
+#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC
+typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name);
+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBindFragDataLocationIndexedEXT (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationIndexEXT (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL GLint GL_APIENTRY glGetFragDataIndexEXT (GLuint program, const GLchar *name);
+#endif
+#endif /* GL_EXT_blend_func_extended */
+
+#ifndef GL_EXT_blend_minmax
+#define GL_EXT_blend_minmax 1
+#define GL_MIN_EXT 0x8007
+#define GL_MAX_EXT 0x8008
+#endif /* GL_EXT_blend_minmax */
+
+#ifndef GL_EXT_buffer_storage
+#define GL_EXT_buffer_storage 1
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_PERSISTENT_BIT_EXT 0x0040
+#define GL_MAP_COHERENT_BIT_EXT 0x0080
+#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100
+#define GL_CLIENT_STORAGE_BIT_EXT 0x0200
+#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000
+#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F
+#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220
+typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBufferStorageEXT (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+#endif
+#endif /* GL_EXT_buffer_storage */
+
+#ifndef GL_EXT_color_buffer_float
+#define GL_EXT_color_buffer_float 1
+#endif /* GL_EXT_color_buffer_float */
+
+#ifndef GL_EXT_color_buffer_half_float
+#define GL_EXT_color_buffer_half_float 1
+#define GL_RGBA16F_EXT 0x881A
+#define GL_RGB16F_EXT 0x881B
+#define GL_RG16F_EXT 0x822F
+#define GL_R16F_EXT 0x822D
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211
+#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17
+#endif /* GL_EXT_color_buffer_half_float */
+
+#ifndef GL_EXT_copy_image
+#define GL_EXT_copy_image 1
+typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAEXTPROC) (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);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCopyImageSubDataEXT (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);
+#endif
+#endif /* GL_EXT_copy_image */
+
+#ifndef GL_EXT_debug_label
+#define GL_EXT_debug_label 1
+#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F
+#define GL_PROGRAM_OBJECT_EXT 0x8B40
+#define GL_SHADER_OBJECT_EXT 0x8B48
+#define GL_BUFFER_OBJECT_EXT 0x9151
+#define GL_QUERY_OBJECT_EXT 0x9153
+#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
+#endif
+#endif /* GL_EXT_debug_label */
+
+#ifndef GL_EXT_debug_marker
+#define GL_EXT_debug_marker 1
+typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker);
+GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker);
+GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void);
+#endif
+#endif /* GL_EXT_debug_marker */
+
+#ifndef GL_EXT_discard_framebuffer
+#define GL_EXT_discard_framebuffer 1
+#define GL_COLOR_EXT 0x1800
+#define GL_DEPTH_EXT 0x1801
+#define GL_STENCIL_EXT 0x1802
+typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+#endif
+#endif /* GL_EXT_discard_framebuffer */
+
+#ifndef GL_EXT_disjoint_timer_query
+#define GL_EXT_disjoint_timer_query 1
+#define GL_QUERY_COUNTER_BITS_EXT 0x8864
+#define GL_CURRENT_QUERY_EXT 0x8865
+#define GL_QUERY_RESULT_EXT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867
+#define GL_TIME_ELAPSED_EXT 0x88BF
+#define GL_TIMESTAMP_EXT 0x8E28
+#define GL_GPU_DISJOINT_EXT 0x8FBB
+typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target);
+GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params);
+#endif
+#endif /* GL_EXT_disjoint_timer_query */
+
+#ifndef GL_EXT_draw_buffers
+#define GL_EXT_draw_buffers 1
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
+#define GL_MAX_DRAW_BUFFERS_EXT 0x8824
+#define GL_DRAW_BUFFER0_EXT 0x8825
+#define GL_DRAW_BUFFER1_EXT 0x8826
+#define GL_DRAW_BUFFER2_EXT 0x8827
+#define GL_DRAW_BUFFER3_EXT 0x8828
+#define GL_DRAW_BUFFER4_EXT 0x8829
+#define GL_DRAW_BUFFER5_EXT 0x882A
+#define GL_DRAW_BUFFER6_EXT 0x882B
+#define GL_DRAW_BUFFER7_EXT 0x882C
+#define GL_DRAW_BUFFER8_EXT 0x882D
+#define GL_DRAW_BUFFER9_EXT 0x882E
+#define GL_DRAW_BUFFER10_EXT 0x882F
+#define GL_DRAW_BUFFER11_EXT 0x8830
+#define GL_DRAW_BUFFER12_EXT 0x8831
+#define GL_DRAW_BUFFER13_EXT 0x8832
+#define GL_DRAW_BUFFER14_EXT 0x8833
+#define GL_DRAW_BUFFER15_EXT 0x8834
+#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
+#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
+#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
+#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
+#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
+#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
+#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
+#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
+#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
+#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
+#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
+#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
+#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
+#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
+#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
+#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs);
+#endif
+#endif /* GL_EXT_draw_buffers */
+
+#ifndef GL_EXT_draw_buffers_indexed
+#define GL_EXT_draw_buffers_indexed 1
+typedef void (GL_APIENTRYP PFNGLENABLEIEXTPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glEnableiEXT (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisableiEXT (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glBlendEquationiEXT (GLuint buf, GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparateiEXT (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunciEXT (GLuint buf, GLenum src, GLenum dst);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparateiEXT (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GL_APICALL void GL_APIENTRY glColorMaskiEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GL_APICALL GLboolean GL_APIENTRY glIsEnablediEXT (GLenum target, GLuint index);
+#endif
+#endif /* GL_EXT_draw_buffers_indexed */
+
+#ifndef GL_EXT_draw_elements_base_vertex
+#define GL_EXT_draw_elements_base_vertex 1
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex);
+#endif
+#endif /* GL_EXT_draw_elements_base_vertex */
+
+#ifndef GL_EXT_draw_instanced
+#define GL_EXT_draw_instanced 1
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#endif
+#endif /* GL_EXT_draw_instanced */
+
+#ifndef GL_EXT_float_blend
+#define GL_EXT_float_blend 1
+#endif /* GL_EXT_float_blend */
+
+#ifndef GL_EXT_geometry_point_size
+#define GL_EXT_geometry_point_size 1
+#endif /* GL_EXT_geometry_point_size */
+
+#ifndef GL_EXT_geometry_shader
+#define GL_EXT_geometry_shader 1
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004
+#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916
+#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917
+#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918
+#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F
+#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E
+#define GL_LINES_ADJACENCY_EXT 0x000A
+#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B
+#define GL_TRIANGLES_ADJACENCY_EXT 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7
+#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E
+#define GL_UNDEFINED_VERTEX_EXT 0x8260
+#define GL_PRIMITIVES_GENERATED_EXT 0x8C87
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312
+#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#endif
+#endif /* GL_EXT_geometry_shader */
+
+#ifndef GL_EXT_gpu_shader5
+#define GL_EXT_gpu_shader5 1
+#endif /* GL_EXT_gpu_shader5 */
+
+#ifndef GL_EXT_instanced_arrays
+#define GL_EXT_instanced_arrays 1
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT (GLuint index, GLuint divisor);
+#endif
+#endif /* GL_EXT_instanced_arrays */
+
+#ifndef GL_EXT_map_buffer_range
+#define GL_EXT_map_buffer_range 1
+#define GL_MAP_READ_BIT_EXT 0x0001
+#define GL_MAP_WRITE_BIT_EXT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length);
+#endif
+#endif /* GL_EXT_map_buffer_range */
+
+#ifndef GL_EXT_multi_draw_arrays
+#define GL_EXT_multi_draw_arrays 1
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
+#endif
+#endif /* GL_EXT_multi_draw_arrays */
+
+#ifndef GL_EXT_multi_draw_indirect
+#define GL_EXT_multi_draw_indirect 1
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glMultiDrawArraysIndirectEXT (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+GL_APICALL void GL_APIENTRY glMultiDrawElementsIndirectEXT (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+#endif
+#endif /* GL_EXT_multi_draw_indirect */
+
+#ifndef GL_EXT_multisampled_compatibility
+#define GL_EXT_multisampled_compatibility 1
+#define GL_MULTISAMPLE_EXT 0x809D
+#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F
+#endif /* GL_EXT_multisampled_compatibility */
+
+#ifndef GL_EXT_multisampled_render_to_texture
+#define GL_EXT_multisampled_render_to_texture 1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_MAX_SAMPLES_EXT 0x8D57
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#endif
+#endif /* GL_EXT_multisampled_render_to_texture */
+
+#ifndef GL_EXT_multiview_draw_buffers
+#define GL_EXT_multiview_draw_buffers 1
+#define GL_COLOR_ATTACHMENT_EXT 0x90F0
+#define GL_MULTIVIEW_EXT 0x90F1
+#define GL_DRAW_BUFFER_EXT 0x0C01
+#define GL_READ_BUFFER_EXT 0x0C02
+#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2
+typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index);
+GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices);
+GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data);
+#endif
+#endif /* GL_EXT_multiview_draw_buffers */
+
+#ifndef GL_EXT_occlusion_query_boolean
+#define GL_EXT_occlusion_query_boolean 1
+#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A
+#endif /* GL_EXT_occlusion_query_boolean */
+
+#ifndef GL_EXT_post_depth_coverage
+#define GL_EXT_post_depth_coverage 1
+#endif /* GL_EXT_post_depth_coverage */
+
+#ifndef GL_EXT_primitive_bounding_box
+#define GL_EXT_primitive_bounding_box 1
+#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE
+typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxEXT (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+#endif
+#endif /* GL_EXT_primitive_bounding_box */
+
+#ifndef GL_EXT_pvrtc_sRGB
+#define GL_EXT_pvrtc_sRGB 1
+#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54
+#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0
+#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1
+#endif /* GL_EXT_pvrtc_sRGB */
+
+#ifndef GL_EXT_raster_multisample
+#define GL_EXT_raster_multisample 1
+#define GL_RASTER_MULTISAMPLE_EXT 0x9327
+#define GL_RASTER_SAMPLES_EXT 0x9328
+#define GL_MAX_RASTER_SAMPLES_EXT 0x9329
+#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A
+#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B
+#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C
+typedef void (GL_APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations);
+#endif
+#endif /* GL_EXT_raster_multisample */
+
+#ifndef GL_EXT_read_format_bgra
+#define GL_EXT_read_format_bgra 1
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366
+#endif /* GL_EXT_read_format_bgra */
+
+#ifndef GL_EXT_render_snorm
+#define GL_EXT_render_snorm 1
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_R16_SNORM_EXT 0x8F98
+#define GL_RG16_SNORM_EXT 0x8F99
+#define GL_RGBA16_SNORM_EXT 0x8F9B
+#endif /* GL_EXT_render_snorm */
+
+#ifndef GL_EXT_robustness
+#define GL_EXT_robustness 1
+#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253
+#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255
+#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3
+#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256
+#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252
+#define GL_NO_RESET_NOTIFICATION_EXT 0x8261
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void);
+GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_EXT_robustness */
+
+#ifndef GL_EXT_sRGB
+#define GL_EXT_sRGB 1
+#define GL_SRGB_EXT 0x8C40
+#define GL_SRGB_ALPHA_EXT 0x8C42
+#define GL_SRGB8_ALPHA8_EXT 0x8C43
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210
+#endif /* GL_EXT_sRGB */
+
+#ifndef GL_EXT_sRGB_write_control
+#define GL_EXT_sRGB_write_control 1
+#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
+#endif /* GL_EXT_sRGB_write_control */
+
+#ifndef GL_EXT_separate_shader_objects
+#define GL_EXT_separate_shader_objects 1
+#define GL_ACTIVE_PROGRAM_EXT 0x8259
+#define GL_VERTEX_SHADER_BIT_EXT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002
+#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE_EXT 0x8258
+#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A
+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program);
+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program);
+GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#endif
+#endif /* GL_EXT_separate_shader_objects */
+
+#ifndef GL_EXT_shader_framebuffer_fetch
+#define GL_EXT_shader_framebuffer_fetch 1
+#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52
+#endif /* GL_EXT_shader_framebuffer_fetch */
+
+#ifndef GL_EXT_shader_implicit_conversions
+#define GL_EXT_shader_implicit_conversions 1
+#endif /* GL_EXT_shader_implicit_conversions */
+
+#ifndef GL_EXT_shader_integer_mix
+#define GL_EXT_shader_integer_mix 1
+#endif /* GL_EXT_shader_integer_mix */
+
+#ifndef GL_EXT_shader_io_blocks
+#define GL_EXT_shader_io_blocks 1
+#endif /* GL_EXT_shader_io_blocks */
+
+#ifndef GL_EXT_shader_pixel_local_storage
+#define GL_EXT_shader_pixel_local_storage 1
+#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63
+#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67
+#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64
+#endif /* GL_EXT_shader_pixel_local_storage */
+
+#ifndef GL_EXT_shader_texture_lod
+#define GL_EXT_shader_texture_lod 1
+#endif /* GL_EXT_shader_texture_lod */
+
+#ifndef GL_EXT_shadow_samplers
+#define GL_EXT_shadow_samplers 1
+#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C
+#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D
+#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E
+#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62
+#endif /* GL_EXT_shadow_samplers */
+
+#ifndef GL_EXT_sparse_texture
+#define GL_EXT_sparse_texture 1
+#define GL_TEXTURE_SPARSE_EXT 0x91A6
+#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7
+#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA
+#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8
+#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195
+#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196
+#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_3D 0x806F
+#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198
+#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199
+#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A
+#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9
+typedef void (GL_APIENTRYP PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexPageCommitmentEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit);
+#endif
+#endif /* GL_EXT_sparse_texture */
+
+#ifndef GL_EXT_tessellation_point_size
+#define GL_EXT_tessellation_point_size 1
+#endif /* GL_EXT_tessellation_point_size */
+
+#ifndef GL_EXT_tessellation_shader
+#define GL_EXT_tessellation_shader 1
+#define GL_PATCHES_EXT 0x000E
+#define GL_PATCH_VERTICES_EXT 0x8E72
+#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75
+#define GL_TESS_GEN_MODE_EXT 0x8E76
+#define GL_TESS_GEN_SPACING_EXT 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78
+#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79
+#define GL_ISOLINES_EXT 0x8E7A
+#define GL_QUADS_EXT 0x0007
+#define GL_FRACTIONAL_ODD_EXT 0x8E7B
+#define GL_FRACTIONAL_EVEN_EXT 0x8E7C
+#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221
+#define GL_IS_PER_PATCH_EXT 0x92E7
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308
+#define GL_TESS_CONTROL_SHADER_EXT 0x8E88
+#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87
+#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010
+typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPatchParameteriEXT (GLenum pname, GLint value);
+#endif
+#endif /* GL_EXT_tessellation_shader */
+
+#ifndef GL_EXT_texture_border_clamp
+#define GL_EXT_texture_border_clamp 1
+#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004
+#define GL_CLAMP_TO_BORDER_EXT 0x812D
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glSamplerParameterIivEXT (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterIuivEXT (GLuint sampler, GLenum pname, const GLuint *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIivEXT (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivEXT (GLuint sampler, GLenum pname, GLuint *params);
+#endif
+#endif /* GL_EXT_texture_border_clamp */
+
+#ifndef GL_EXT_texture_buffer
+#define GL_EXT_texture_buffer 1
+#define GL_TEXTURE_BUFFER_EXT 0x8C2A
+#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F
+#define GL_SAMPLER_BUFFER_EXT 0x8DC2
+#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8
+#define GL_IMAGE_BUFFER_EXT 0x9051
+#define GL_INT_IMAGE_BUFFER_EXT 0x905C
+#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067
+#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D
+#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E
+typedef void (GL_APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#endif
+#endif /* GL_EXT_texture_buffer */
+
+#ifndef GL_EXT_texture_compression_dxt1
+#define GL_EXT_texture_compression_dxt1 1
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+#endif /* GL_EXT_texture_compression_dxt1 */
+
+#ifndef GL_EXT_texture_compression_s3tc
+#define GL_EXT_texture_compression_s3tc 1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+#endif /* GL_EXT_texture_compression_s3tc */
+
+#ifndef GL_EXT_texture_cube_map_array
+#define GL_EXT_texture_cube_map_array 1
+#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A
+#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F
+#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A
+#endif /* GL_EXT_texture_cube_map_array */
+
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_EXT_texture_filter_anisotropic 1
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+#endif /* GL_EXT_texture_filter_anisotropic */
+
+#ifndef GL_EXT_texture_filter_minmax
+#define GL_EXT_texture_filter_minmax 1
+#endif /* GL_EXT_texture_filter_minmax */
+
+#ifndef GL_EXT_texture_format_BGRA8888
+#define GL_EXT_texture_format_BGRA8888 1
+#endif /* GL_EXT_texture_format_BGRA8888 */
+
+#ifndef GL_EXT_texture_norm16
+#define GL_EXT_texture_norm16 1
+#define GL_R16_EXT 0x822A
+#define GL_RG16_EXT 0x822C
+#define GL_RGBA16_EXT 0x805B
+#define GL_RGB16_EXT 0x8054
+#define GL_RGB16_SNORM_EXT 0x8F9A
+#endif /* GL_EXT_texture_norm16 */
+
+#ifndef GL_EXT_texture_rg
+#define GL_EXT_texture_rg 1
+#define GL_RED_EXT 0x1903
+#define GL_RG_EXT 0x8227
+#define GL_R8_EXT 0x8229
+#define GL_RG8_EXT 0x822B
+#endif /* GL_EXT_texture_rg */
+
+#ifndef GL_EXT_texture_sRGB_R8
+#define GL_EXT_texture_sRGB_R8 1
+#define GL_SR8_EXT 0x8FBD
+#endif /* GL_EXT_texture_sRGB_R8 */
+
+#ifndef GL_EXT_texture_sRGB_RG8
+#define GL_EXT_texture_sRGB_RG8 1
+#define GL_SRG8_EXT 0x8FBE
+#endif /* GL_EXT_texture_sRGB_RG8 */
+
+#ifndef GL_EXT_texture_sRGB_decode
+#define GL_EXT_texture_sRGB_decode 1
+#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48
+#define GL_DECODE_EXT 0x8A49
+#define GL_SKIP_DECODE_EXT 0x8A4A
+#endif /* GL_EXT_texture_sRGB_decode */
+
+#ifndef GL_EXT_texture_storage
+#define GL_EXT_texture_storage 1
+#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F
+#define GL_ALPHA8_EXT 0x803C
+#define GL_LUMINANCE8_EXT 0x8040
+#define GL_LUMINANCE8_ALPHA8_EXT 0x8045
+#define GL_RGBA32F_EXT 0x8814
+#define GL_RGB32F_EXT 0x8815
+#define GL_ALPHA32F_EXT 0x8816
+#define GL_LUMINANCE32F_EXT 0x8818
+#define GL_LUMINANCE_ALPHA32F_EXT 0x8819
+#define GL_ALPHA16F_EXT 0x881C
+#define GL_LUMINANCE16F_EXT 0x881E
+#define GL_LUMINANCE_ALPHA16F_EXT 0x881F
+#define GL_R32F_EXT 0x822E
+#define GL_RG32F_EXT 0x8230
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#endif
+#endif /* GL_EXT_texture_storage */
+
+#ifndef GL_EXT_texture_type_2_10_10_10_REV
+#define GL_EXT_texture_type_2_10_10_10_REV 1
+#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
+#endif /* GL_EXT_texture_type_2_10_10_10_REV */
+
+#ifndef GL_EXT_texture_view
+#define GL_EXT_texture_view 1
+#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB
+#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC
+#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD
+#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE
+typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTextureViewEXT (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#endif
+#endif /* GL_EXT_texture_view */
+
+#ifndef GL_EXT_unpack_subimage
+#define GL_EXT_unpack_subimage 1
+#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2
+#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4
+#endif /* GL_EXT_unpack_subimage */
+
+#ifndef GL_FJ_shader_binary_GCCSO
+#define GL_FJ_shader_binary_GCCSO 1
+#define GL_GCCSO_SHADER_BINARY_FJ 0x9260
+#endif /* GL_FJ_shader_binary_GCCSO */
+
+#ifndef GL_IMG_multisampled_render_to_texture
+#define GL_IMG_multisampled_render_to_texture 1
+#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134
+#define GL_MAX_SAMPLES_IMG 0x9135
+#define GL_TEXTURE_SAMPLES_IMG 0x9136
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#endif
+#endif /* GL_IMG_multisampled_render_to_texture */
+
+#ifndef GL_IMG_program_binary
+#define GL_IMG_program_binary 1
+#define GL_SGX_PROGRAM_BINARY_IMG 0x9130
+#endif /* GL_IMG_program_binary */
+
+#ifndef GL_IMG_read_format
+#define GL_IMG_read_format 1
+#define GL_BGRA_IMG 0x80E1
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365
+#endif /* GL_IMG_read_format */
+
+#ifndef GL_IMG_shader_binary
+#define GL_IMG_shader_binary 1
+#define GL_SGX_BINARY_IMG 0x8C0A
+#endif /* GL_IMG_shader_binary */
+
+#ifndef GL_IMG_texture_compression_pvrtc
+#define GL_IMG_texture_compression_pvrtc 1
+#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
+#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
+#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
+#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
+#endif /* GL_IMG_texture_compression_pvrtc */
+
+#ifndef GL_IMG_texture_compression_pvrtc2
+#define GL_IMG_texture_compression_pvrtc2 1
+#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137
+#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138
+#endif /* GL_IMG_texture_compression_pvrtc2 */
+
+#ifndef GL_IMG_texture_filter_cubic
+#define GL_IMG_texture_filter_cubic 1
+#define GL_CUBIC_IMG 0x9139
+#define GL_CUBIC_MIPMAP_NEAREST_IMG 0x913A
+#define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B
+#endif /* GL_IMG_texture_filter_cubic */
+
+#ifndef GL_INTEL_framebuffer_CMAA
+#define GL_INTEL_framebuffer_CMAA 1
+typedef void (GL_APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void);
+#endif
+#endif /* GL_INTEL_framebuffer_CMAA */
+
+#ifndef GL_INTEL_performance_query
+#define GL_INTEL_performance_query 1
+#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000
+#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001
+#define GL_PERFQUERY_WAIT_INTEL 0x83FB
+#define GL_PERFQUERY_FLUSH_INTEL 0x83FA
+#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9
+#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0
+#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1
+#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2
+#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3
+#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4
+#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5
+#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8
+#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9
+#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA
+#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB
+#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC
+#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD
+#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE
+#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF
+#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500
+typedef void (GL_APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (GL_APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle);
+typedef void (GL_APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId);
+typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId);
+typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
+typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);
+typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId);
+typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle);
+GL_APICALL void GL_APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle);
+GL_APICALL void GL_APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle);
+GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle);
+GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId);
+GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId);
+GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
+GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);
+GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId);
+GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);
+#endif
+#endif /* GL_INTEL_performance_query */
+
+#ifndef GL_NV_bindless_texture
+#define GL_NV_bindless_texture 1
+typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture);
+typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
+typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle);
+typedef GLuint64 (GL_APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access);
+typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle);
+typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
+typedef GLboolean (GL_APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleNV (GLuint texture);
+GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler);
+GL_APICALL void GL_APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle);
+GL_APICALL void GL_APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle);
+GL_APICALL GLuint64 GL_APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+GL_APICALL void GL_APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access);
+GL_APICALL void GL_APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle);
+GL_APICALL void GL_APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value);
+GL_APICALL void GL_APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value);
+GL_APICALL void GL_APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value);
+GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+GL_APICALL GLboolean GL_APIENTRY glIsTextureHandleResidentNV (GLuint64 handle);
+GL_APICALL GLboolean GL_APIENTRY glIsImageHandleResidentNV (GLuint64 handle);
+#endif
+#endif /* GL_NV_bindless_texture */
+
+#ifndef GL_NV_blend_equation_advanced
+#define GL_NV_blend_equation_advanced 1
+#define GL_BLEND_OVERLAP_NV 0x9281
+#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280
+#define GL_BLUE_NV 0x1905
+#define GL_COLORBURN_NV 0x929A
+#define GL_COLORDODGE_NV 0x9299
+#define GL_CONJOINT_NV 0x9284
+#define GL_CONTRAST_NV 0x92A1
+#define GL_DARKEN_NV 0x9297
+#define GL_DIFFERENCE_NV 0x929E
+#define GL_DISJOINT_NV 0x9283
+#define GL_DST_ATOP_NV 0x928F
+#define GL_DST_IN_NV 0x928B
+#define GL_DST_NV 0x9287
+#define GL_DST_OUT_NV 0x928D
+#define GL_DST_OVER_NV 0x9289
+#define GL_EXCLUSION_NV 0x92A0
+#define GL_GREEN_NV 0x1904
+#define GL_HARDLIGHT_NV 0x929B
+#define GL_HARDMIX_NV 0x92A9
+#define GL_HSL_COLOR_NV 0x92AF
+#define GL_HSL_HUE_NV 0x92AD
+#define GL_HSL_LUMINOSITY_NV 0x92B0
+#define GL_HSL_SATURATION_NV 0x92AE
+#define GL_INVERT_OVG_NV 0x92B4
+#define GL_INVERT_RGB_NV 0x92A3
+#define GL_LIGHTEN_NV 0x9298
+#define GL_LINEARBURN_NV 0x92A5
+#define GL_LINEARDODGE_NV 0x92A4
+#define GL_LINEARLIGHT_NV 0x92A7
+#define GL_MINUS_CLAMPED_NV 0x92B3
+#define GL_MINUS_NV 0x929F
+#define GL_MULTIPLY_NV 0x9294
+#define GL_OVERLAY_NV 0x9296
+#define GL_PINLIGHT_NV 0x92A8
+#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2
+#define GL_PLUS_CLAMPED_NV 0x92B1
+#define GL_PLUS_DARKER_NV 0x9292
+#define GL_PLUS_NV 0x9291
+#define GL_RED_NV 0x1903
+#define GL_SCREEN_NV 0x9295
+#define GL_SOFTLIGHT_NV 0x929C
+#define GL_SRC_ATOP_NV 0x928E
+#define GL_SRC_IN_NV 0x928A
+#define GL_SRC_NV 0x9286
+#define GL_SRC_OUT_NV 0x928C
+#define GL_SRC_OVER_NV 0x9288
+#define GL_UNCORRELATED_NV 0x9282
+#define GL_VIVIDLIGHT_NV 0x92A6
+#define GL_XOR_NV 0x1506
+typedef void (GL_APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLBLENDBARRIERNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlendParameteriNV (GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glBlendBarrierNV (void);
+#endif
+#endif /* GL_NV_blend_equation_advanced */
+
+#ifndef GL_NV_blend_equation_advanced_coherent
+#define GL_NV_blend_equation_advanced_coherent 1
+#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285
+#endif /* GL_NV_blend_equation_advanced_coherent */
+
+#ifndef GL_NV_conditional_render
+#define GL_NV_conditional_render 1
+#define GL_QUERY_WAIT_NV 0x8E13
+#define GL_QUERY_NO_WAIT_NV 0x8E14
+#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15
+#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16
+typedef void (GL_APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode);
+GL_APICALL void GL_APIENTRY glEndConditionalRenderNV (void);
+#endif
+#endif /* GL_NV_conditional_render */
+
+#ifndef GL_NV_conservative_raster
+#define GL_NV_conservative_raster 1
+#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346
+#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347
+#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348
+#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349
+typedef void (GL_APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits);
+#endif
+#endif /* GL_NV_conservative_raster */
+
+#ifndef GL_NV_copy_buffer
+#define GL_NV_copy_buffer 1
+#define GL_COPY_READ_BUFFER_NV 0x8F36
+#define GL_COPY_WRITE_BUFFER_NV 0x8F37
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCopyBufferSubDataNV (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+#endif
+#endif /* GL_NV_copy_buffer */
+
+#ifndef GL_NV_coverage_sample
+#define GL_NV_coverage_sample 1
+#define GL_COVERAGE_COMPONENT_NV 0x8ED0
+#define GL_COVERAGE_COMPONENT4_NV 0x8ED1
+#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2
+#define GL_COVERAGE_BUFFERS_NV 0x8ED3
+#define GL_COVERAGE_SAMPLES_NV 0x8ED4
+#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5
+#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6
+#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7
+#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000
+typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask);
+typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask);
+GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation);
+#endif
+#endif /* GL_NV_coverage_sample */
+
+#ifndef GL_NV_depth_nonlinear
+#define GL_NV_depth_nonlinear 1
+#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C
+#endif /* GL_NV_depth_nonlinear */
+
+#ifndef GL_NV_draw_buffers
+#define GL_NV_draw_buffers 1
+#define GL_MAX_DRAW_BUFFERS_NV 0x8824
+#define GL_DRAW_BUFFER0_NV 0x8825
+#define GL_DRAW_BUFFER1_NV 0x8826
+#define GL_DRAW_BUFFER2_NV 0x8827
+#define GL_DRAW_BUFFER3_NV 0x8828
+#define GL_DRAW_BUFFER4_NV 0x8829
+#define GL_DRAW_BUFFER5_NV 0x882A
+#define GL_DRAW_BUFFER6_NV 0x882B
+#define GL_DRAW_BUFFER7_NV 0x882C
+#define GL_DRAW_BUFFER8_NV 0x882D
+#define GL_DRAW_BUFFER9_NV 0x882E
+#define GL_DRAW_BUFFER10_NV 0x882F
+#define GL_DRAW_BUFFER11_NV 0x8830
+#define GL_DRAW_BUFFER12_NV 0x8831
+#define GL_DRAW_BUFFER13_NV 0x8832
+#define GL_DRAW_BUFFER14_NV 0x8833
+#define GL_DRAW_BUFFER15_NV 0x8834
+#define GL_COLOR_ATTACHMENT0_NV 0x8CE0
+#define GL_COLOR_ATTACHMENT1_NV 0x8CE1
+#define GL_COLOR_ATTACHMENT2_NV 0x8CE2
+#define GL_COLOR_ATTACHMENT3_NV 0x8CE3
+#define GL_COLOR_ATTACHMENT4_NV 0x8CE4
+#define GL_COLOR_ATTACHMENT5_NV 0x8CE5
+#define GL_COLOR_ATTACHMENT6_NV 0x8CE6
+#define GL_COLOR_ATTACHMENT7_NV 0x8CE7
+#define GL_COLOR_ATTACHMENT8_NV 0x8CE8
+#define GL_COLOR_ATTACHMENT9_NV 0x8CE9
+#define GL_COLOR_ATTACHMENT10_NV 0x8CEA
+#define GL_COLOR_ATTACHMENT11_NV 0x8CEB
+#define GL_COLOR_ATTACHMENT12_NV 0x8CEC
+#define GL_COLOR_ATTACHMENT13_NV 0x8CED
+#define GL_COLOR_ATTACHMENT14_NV 0x8CEE
+#define GL_COLOR_ATTACHMENT15_NV 0x8CEF
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs);
+#endif
+#endif /* GL_NV_draw_buffers */
+
+#ifndef GL_NV_draw_instanced
+#define GL_NV_draw_instanced 1
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#endif
+#endif /* GL_NV_draw_instanced */
+
+#ifndef GL_NV_explicit_attrib_location
+#define GL_NV_explicit_attrib_location 1
+#endif /* GL_NV_explicit_attrib_location */
+
+#ifndef GL_NV_fbo_color_attachments
+#define GL_NV_fbo_color_attachments 1
+#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF
+#endif /* GL_NV_fbo_color_attachments */
+
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+#define GL_ALL_COMPLETED_NV 0x84F2
+#define GL_FENCE_STATUS_NV 0x84F3
+#define GL_FENCE_CONDITION_NV 0x84F4
+typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);
+typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);
+typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence);
+typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence);
+typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence);
+typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences);
+GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences);
+GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence);
+GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence);
+GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence);
+GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition);
+#endif
+#endif /* GL_NV_fence */
+
+#ifndef GL_NV_fill_rectangle
+#define GL_NV_fill_rectangle 1
+#define GL_FILL_RECTANGLE_NV 0x933C
+#endif /* GL_NV_fill_rectangle */
+
+#ifndef GL_NV_fragment_coverage_to_color
+#define GL_NV_fragment_coverage_to_color 1
+#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD
+#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE
+typedef void (GL_APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFragmentCoverageColorNV (GLuint color);
+#endif
+#endif /* GL_NV_fragment_coverage_to_color */
+
+#ifndef GL_NV_fragment_shader_interlock
+#define GL_NV_fragment_shader_interlock 1
+#endif /* GL_NV_fragment_shader_interlock */
+
+#ifndef GL_NV_framebuffer_blit
+#define GL_NV_framebuffer_blit 1
+#define GL_READ_FRAMEBUFFER_NV 0x8CA8
+#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#endif
+#endif /* GL_NV_framebuffer_blit */
+
+#ifndef GL_NV_framebuffer_mixed_samples
+#define GL_NV_framebuffer_mixed_samples 1
+#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331
+#define GL_COLOR_SAMPLES_NV 0x8E20
+#define GL_DEPTH_SAMPLES_NV 0x932D
+#define GL_STENCIL_SAMPLES_NV 0x932E
+#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F
+#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330
+#define GL_COVERAGE_MODULATION_NV 0x9332
+#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333
+typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v);
+GL_APICALL void GL_APIENTRY glCoverageModulationNV (GLenum components);
+#endif
+#endif /* GL_NV_framebuffer_mixed_samples */
+
+#ifndef GL_NV_framebuffer_multisample
+#define GL_NV_framebuffer_multisample 1
+#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56
+#define GL_MAX_SAMPLES_NV 0x8D57
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_NV_framebuffer_multisample */
+
+#ifndef GL_NV_generate_mipmap_sRGB
+#define GL_NV_generate_mipmap_sRGB 1
+#endif /* GL_NV_generate_mipmap_sRGB */
+
+#ifndef GL_NV_geometry_shader_passthrough
+#define GL_NV_geometry_shader_passthrough 1
+#endif /* GL_NV_geometry_shader_passthrough */
+
+#ifndef GL_NV_image_formats
+#define GL_NV_image_formats 1
+#endif /* GL_NV_image_formats */
+
+#ifndef GL_NV_instanced_arrays
+#define GL_NV_instanced_arrays 1
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor);
+#endif
+#endif /* GL_NV_instanced_arrays */
+
+#ifndef GL_NV_internalformat_sample_query
+#define GL_NV_internalformat_sample_query 1
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_MULTISAMPLES_NV 0x9371
+#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372
+#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373
+#define GL_CONFORMANT_NV 0x9374
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_NV_internalformat_sample_query */
+
+#ifndef GL_NV_non_square_matrices
+#define GL_NV_non_square_matrices 1
+#define GL_FLOAT_MAT2x3_NV 0x8B65
+#define GL_FLOAT_MAT2x4_NV 0x8B66
+#define GL_FLOAT_MAT3x2_NV 0x8B67
+#define GL_FLOAT_MAT3x4_NV 0x8B68
+#define GL_FLOAT_MAT4x2_NV 0x8B69
+#define GL_FLOAT_MAT4x3_NV 0x8B6A
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#endif
+#endif /* GL_NV_non_square_matrices */
+
+#ifndef GL_NV_path_rendering
+#define GL_NV_path_rendering 1
+#define GL_PATH_FORMAT_SVG_NV 0x9070
+#define GL_PATH_FORMAT_PS_NV 0x9071
+#define GL_STANDARD_FONT_NAME_NV 0x9072
+#define GL_SYSTEM_FONT_NAME_NV 0x9073
+#define GL_FILE_NAME_NV 0x9074
+#define GL_PATH_STROKE_WIDTH_NV 0x9075
+#define GL_PATH_END_CAPS_NV 0x9076
+#define GL_PATH_INITIAL_END_CAP_NV 0x9077
+#define GL_PATH_TERMINAL_END_CAP_NV 0x9078
+#define GL_PATH_JOIN_STYLE_NV 0x9079
+#define GL_PATH_MITER_LIMIT_NV 0x907A
+#define GL_PATH_DASH_CAPS_NV 0x907B
+#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C
+#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D
+#define GL_PATH_DASH_OFFSET_NV 0x907E
+#define GL_PATH_CLIENT_LENGTH_NV 0x907F
+#define GL_PATH_FILL_MODE_NV 0x9080
+#define GL_PATH_FILL_MASK_NV 0x9081
+#define GL_PATH_FILL_COVER_MODE_NV 0x9082
+#define GL_PATH_STROKE_COVER_MODE_NV 0x9083
+#define GL_PATH_STROKE_MASK_NV 0x9084
+#define GL_COUNT_UP_NV 0x9088
+#define GL_COUNT_DOWN_NV 0x9089
+#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A
+#define GL_CONVEX_HULL_NV 0x908B
+#define GL_BOUNDING_BOX_NV 0x908D
+#define GL_TRANSLATE_X_NV 0x908E
+#define GL_TRANSLATE_Y_NV 0x908F
+#define GL_TRANSLATE_2D_NV 0x9090
+#define GL_TRANSLATE_3D_NV 0x9091
+#define GL_AFFINE_2D_NV 0x9092
+#define GL_AFFINE_3D_NV 0x9094
+#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096
+#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098
+#define GL_UTF8_NV 0x909A
+#define GL_UTF16_NV 0x909B
+#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C
+#define GL_PATH_COMMAND_COUNT_NV 0x909D
+#define GL_PATH_COORD_COUNT_NV 0x909E
+#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F
+#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0
+#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1
+#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2
+#define GL_SQUARE_NV 0x90A3
+#define GL_ROUND_NV 0x90A4
+#define GL_TRIANGULAR_NV 0x90A5
+#define GL_BEVEL_NV 0x90A6
+#define GL_MITER_REVERT_NV 0x90A7
+#define GL_MITER_TRUNCATE_NV 0x90A8
+#define GL_SKIP_MISSING_GLYPH_NV 0x90A9
+#define GL_USE_MISSING_GLYPH_NV 0x90AA
+#define GL_PATH_ERROR_POSITION_NV 0x90AB
+#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD
+#define GL_ADJACENT_PAIRS_NV 0x90AE
+#define GL_FIRST_TO_REST_NV 0x90AF
+#define GL_PATH_GEN_MODE_NV 0x90B0
+#define GL_PATH_GEN_COEFF_NV 0x90B1
+#define GL_PATH_GEN_COMPONENTS_NV 0x90B3
+#define GL_PATH_STENCIL_FUNC_NV 0x90B7
+#define GL_PATH_STENCIL_REF_NV 0x90B8
+#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9
+#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD
+#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE
+#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF
+#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4
+#define GL_MOVE_TO_RESETS_NV 0x90B5
+#define GL_MOVE_TO_CONTINUES_NV 0x90B6
+#define GL_CLOSE_PATH_NV 0x00
+#define GL_MOVE_TO_NV 0x02
+#define GL_RELATIVE_MOVE_TO_NV 0x03
+#define GL_LINE_TO_NV 0x04
+#define GL_RELATIVE_LINE_TO_NV 0x05
+#define GL_HORIZONTAL_LINE_TO_NV 0x06
+#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07
+#define GL_VERTICAL_LINE_TO_NV 0x08
+#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09
+#define GL_QUADRATIC_CURVE_TO_NV 0x0A
+#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B
+#define GL_CUBIC_CURVE_TO_NV 0x0C
+#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D
+#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E
+#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F
+#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10
+#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11
+#define GL_SMALL_CCW_ARC_TO_NV 0x12
+#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13
+#define GL_SMALL_CW_ARC_TO_NV 0x14
+#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15
+#define GL_LARGE_CCW_ARC_TO_NV 0x16
+#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17
+#define GL_LARGE_CW_ARC_TO_NV 0x18
+#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19
+#define GL_RESTART_PATH_NV 0xF0
+#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2
+#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4
+#define GL_RECT_NV 0xF6
+#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8
+#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA
+#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC
+#define GL_ARC_TO_NV 0xFE
+#define GL_RELATIVE_ARC_TO_NV 0xFF
+#define GL_BOLD_BIT_NV 0x01
+#define GL_ITALIC_BIT_NV 0x02
+#define GL_GLYPH_WIDTH_BIT_NV 0x01
+#define GL_GLYPH_HEIGHT_BIT_NV 0x02
+#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04
+#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08
+#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10
+#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20
+#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40
+#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80
+#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100
+#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000
+#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000
+#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000
+#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000
+#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000
+#define GL_FONT_ASCENDER_BIT_NV 0x00200000
+#define GL_FONT_DESCENDER_BIT_NV 0x00400000
+#define GL_FONT_HEIGHT_BIT_NV 0x00800000
+#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000
+#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000
+#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000
+#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000
+#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000
+#define GL_ROUNDED_RECT_NV 0xE8
+#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9
+#define GL_ROUNDED_RECT2_NV 0xEA
+#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB
+#define GL_ROUNDED_RECT4_NV 0xEC
+#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED
+#define GL_ROUNDED_RECT8_NV 0xEE
+#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF
+#define GL_RELATIVE_RECT_NV 0xF7
+#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368
+#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369
+#define GL_FONT_UNAVAILABLE_NV 0x936A
+#define GL_FONT_UNINTELLIGIBLE_NV 0x936B
+#define GL_CONIC_CURVE_TO_NV 0x1A
+#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B
+#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000
+#define GL_STANDARD_FONT_FORMAT_NV 0x936C
+#define GL_PATH_PROJECTION_NV 0x1701
+#define GL_PATH_MODELVIEW_NV 0x1700
+#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3
+#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6
+#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36
+#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3
+#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4
+#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7
+#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38
+#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4
+#define GL_FRAGMENT_INPUT_NV 0x936D
+typedef GLuint (GL_APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range);
+typedef void (GL_APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range);
+typedef GLboolean (GL_APIENTRYP PFNGLISPATHNVPROC) (GLuint path);
+typedef void (GL_APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (GL_APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString);
+typedef void (GL_APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GL_APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GL_APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);
+typedef void (GL_APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath);
+typedef void (GL_APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value);
+typedef void (GL_APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray);
+typedef void (GL_APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value);
+typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands);
+typedef void (GL_APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords);
+typedef void (GL_APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray);
+typedef void (GL_APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+typedef void (GL_APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);
+typedef void (GL_APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y);
+typedef GLfloat (GL_APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments);
+typedef GLboolean (GL_APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
+typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef GLenum (GL_APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range);
+GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range);
+GL_APICALL GLboolean GL_APIENTRY glIsPathNV (GLuint path);
+GL_APICALL void GL_APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString);
+GL_APICALL void GL_APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);
+GL_APICALL void GL_APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath);
+GL_APICALL void GL_APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+GL_APICALL void GL_APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value);
+GL_APICALL void GL_APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value);
+GL_APICALL void GL_APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray);
+GL_APICALL void GL_APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glPathCoverDepthFuncNV (GLenum func);
+GL_APICALL void GL_APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value);
+GL_APICALL void GL_APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value);
+GL_APICALL void GL_APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands);
+GL_APICALL void GL_APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords);
+GL_APICALL void GL_APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray);
+GL_APICALL void GL_APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+GL_APICALL void GL_APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);
+GL_APICALL void GL_APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+GL_APICALL GLboolean GL_APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+GL_APICALL GLboolean GL_APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y);
+GL_APICALL GLfloat GL_APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments);
+GL_APICALL GLboolean GL_APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+GL_APICALL void GL_APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
+GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs);
+GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params);
+#endif
+#endif /* GL_NV_path_rendering */
+
+#ifndef GL_NV_path_rendering_shared_edge
+#define GL_NV_path_rendering_shared_edge 1
+#define GL_SHARED_EDGE_NV 0xC0
+#endif /* GL_NV_path_rendering_shared_edge */
+
+#ifndef GL_NV_polygon_mode
+#define GL_NV_polygon_mode 1
+#define GL_POLYGON_MODE_NV 0x0B40
+#define GL_POLYGON_OFFSET_POINT_NV 0x2A01
+#define GL_POLYGON_OFFSET_LINE_NV 0x2A02
+#define GL_POINT_NV 0x1B00
+#define GL_LINE_NV 0x1B01
+#define GL_FILL_NV 0x1B02
+typedef void (GL_APIENTRYP PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glPolygonModeNV (GLenum face, GLenum mode);
+#endif
+#endif /* GL_NV_polygon_mode */
+
+#ifndef GL_NV_read_buffer
+#define GL_NV_read_buffer 1
+#define GL_READ_BUFFER_NV 0x0C02
+typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode);
+#endif
+#endif /* GL_NV_read_buffer */
+
+#ifndef GL_NV_read_buffer_front
+#define GL_NV_read_buffer_front 1
+#endif /* GL_NV_read_buffer_front */
+
+#ifndef GL_NV_read_depth
+#define GL_NV_read_depth 1
+#endif /* GL_NV_read_depth */
+
+#ifndef GL_NV_read_depth_stencil
+#define GL_NV_read_depth_stencil 1
+#endif /* GL_NV_read_depth_stencil */
+
+#ifndef GL_NV_read_stencil
+#define GL_NV_read_stencil 1
+#endif /* GL_NV_read_stencil */
+
+#ifndef GL_NV_sRGB_formats
+#define GL_NV_sRGB_formats 1
+#define GL_SLUMINANCE_NV 0x8C46
+#define GL_SLUMINANCE_ALPHA_NV 0x8C44
+#define GL_SRGB8_NV 0x8C41
+#define GL_SLUMINANCE8_NV 0x8C47
+#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F
+#define GL_ETC1_SRGB8_NV 0x88EE
+#endif /* GL_NV_sRGB_formats */
+
+#ifndef GL_NV_sample_locations
+#define GL_NV_sample_locations 1
+#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D
+#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E
+#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F
+#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340
+#define GL_SAMPLE_LOCATION_NV 0x8E50
+#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341
+#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342
+#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void);
+#endif
+#endif /* GL_NV_sample_locations */
+
+#ifndef GL_NV_sample_mask_override_coverage
+#define GL_NV_sample_mask_override_coverage 1
+#endif /* GL_NV_sample_mask_override_coverage */
+
+#ifndef GL_NV_shader_noperspective_interpolation
+#define GL_NV_shader_noperspective_interpolation 1
+#endif /* GL_NV_shader_noperspective_interpolation */
+
+#ifndef GL_NV_shadow_samplers_array
+#define GL_NV_shadow_samplers_array 1
+#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4
+#endif /* GL_NV_shadow_samplers_array */
+
+#ifndef GL_NV_shadow_samplers_cube
+#define GL_NV_shadow_samplers_cube 1
+#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5
+#endif /* GL_NV_shadow_samplers_cube */
+
+#ifndef GL_NV_texture_border_clamp
+#define GL_NV_texture_border_clamp 1
+#define GL_TEXTURE_BORDER_COLOR_NV 0x1004
+#define GL_CLAMP_TO_BORDER_NV 0x812D
+#endif /* GL_NV_texture_border_clamp */
+
+#ifndef GL_NV_texture_compression_s3tc_update
+#define GL_NV_texture_compression_s3tc_update 1
+#endif /* GL_NV_texture_compression_s3tc_update */
+
+#ifndef GL_NV_texture_npot_2D_mipmap
+#define GL_NV_texture_npot_2D_mipmap 1
+#endif /* GL_NV_texture_npot_2D_mipmap */
+
+#ifndef GL_NV_viewport_array
+#define GL_NV_viewport_array 1
+#define GL_MAX_VIEWPORTS_NV 0x825B
+#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C
+#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D
+#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F
+typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLENABLEINVPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEINVPROC) (GLenum target, GLuint index);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDINVPROC) (GLenum target, GLuint index);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glViewportArrayvNV (GLuint first, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glViewportIndexedfNV (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+GL_APICALL void GL_APIENTRY glViewportIndexedfvNV (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glScissorArrayvNV (GLuint first, GLsizei count, const GLint *v);
+GL_APICALL void GL_APIENTRY glScissorIndexedNV (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glScissorIndexedvNV (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glDepthRangeArrayfvNV (GLuint first, GLsizei count, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glDepthRangeIndexedfNV (GLuint index, GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glGetFloati_vNV (GLenum target, GLuint index, GLfloat *data);
+GL_APICALL void GL_APIENTRY glEnableiNV (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisableiNV (GLenum target, GLuint index);
+GL_APICALL GLboolean GL_APIENTRY glIsEnablediNV (GLenum target, GLuint index);
+#endif
+#endif /* GL_NV_viewport_array */
+
+#ifndef GL_NV_viewport_array2
+#define GL_NV_viewport_array2 1
+#endif /* GL_NV_viewport_array2 */
+
+#ifndef GL_OVR_multiview
+#define GL_OVR_multiview 1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632
+#define GL_MAX_VIEWS_OVR 0x9631
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
+#endif
+#endif /* GL_OVR_multiview */
+
+#ifndef GL_OVR_multiview2
+#define GL_OVR_multiview2 1
+#endif /* GL_OVR_multiview2 */
+
+#ifndef GL_OVR_multiview_multisampled_render_to_texture
+#define GL_OVR_multiview_multisampled_render_to_texture 1
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glFramebufferTextureMultisampleMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews);
+#endif
+#endif /* GL_OVR_multiview_multisampled_render_to_texture */
+
+#ifndef GL_QCOM_alpha_test
+#define GL_QCOM_alpha_test 1
+#define GL_ALPHA_TEST_QCOM 0x0BC0
+#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1
+#define GL_ALPHA_TEST_REF_QCOM 0x0BC2
+typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref);
+#endif
+#endif /* GL_QCOM_alpha_test */
+
+#ifndef GL_QCOM_binning_control
+#define GL_QCOM_binning_control 1
+#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0
+#define GL_CPU_OPTIMIZED_QCOM 0x8FB1
+#define GL_GPU_OPTIMIZED_QCOM 0x8FB2
+#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3
+#endif /* GL_QCOM_binning_control */
+
+#ifndef GL_QCOM_driver_control
+#define GL_QCOM_driver_control 1
+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls);
+typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);
+typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
+typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls);
+GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString);
+GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl);
+GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl);
+#endif
+#endif /* GL_QCOM_driver_control */
+
+#ifndef GL_QCOM_extended_get
+#define GL_QCOM_extended_get 1
+#define GL_TEXTURE_WIDTH_QCOM 0x8BD2
+#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3
+#define GL_TEXTURE_DEPTH_QCOM 0x8BD4
+#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5
+#define GL_TEXTURE_FORMAT_QCOM 0x8BD6
+#define GL_TEXTURE_TYPE_QCOM 0x8BD7
+#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8
+#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9
+#define GL_TEXTURE_TARGET_QCOM 0x8BDA
+#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB
+#define GL_STATE_RESTORE 0x8BDC
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures);
+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels);
+typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures);
+GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
+GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
+GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
+GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels);
+GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params);
+#endif
+#endif /* GL_QCOM_extended_get */
+
+#ifndef GL_QCOM_extended_get2
+#define GL_QCOM_extended_get2 1
+typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders);
+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
+typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders);
+GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
+GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program);
+GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length);
+#endif
+#endif /* GL_QCOM_extended_get2 */
+
+#ifndef GL_QCOM_perfmon_global_mode
+#define GL_QCOM_perfmon_global_mode 1
+#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0
+#endif /* GL_QCOM_perfmon_global_mode */
+
+#ifndef GL_QCOM_tiled_rendering
+#define GL_QCOM_tiled_rendering 1
+#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001
+#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002
+#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004
+#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008
+#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010
+#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020
+#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040
+#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080
+#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100
+#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200
+#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400
+#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800
+#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000
+#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000
+#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000
+#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000
+#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000
+#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000
+#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000
+#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000
+#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000
+#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000
+#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000
+#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000
+#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000
+#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000
+#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000
+#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000
+#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000
+#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000
+#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000
+#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000
+typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask);
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask);
+GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask);
+#endif
+#endif /* GL_QCOM_tiled_rendering */
+
+#ifndef GL_QCOM_writeonly_rendering
+#define GL_QCOM_writeonly_rendering 1
+#define GL_WRITEONLY_RENDERING_QCOM 0x8823
+#endif /* GL_QCOM_writeonly_rendering */
+
+#ifndef GL_VIV_shader_binary
+#define GL_VIV_shader_binary 1
+#define GL_SHADER_BINARY_VIV 0x8FC4
+#endif /* GL_VIV_shader_binary */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES2/gl2platform.h b/src/3rdparty/platformspecific/Android/jni/GLES2/gl2platform.h
new file mode 100644
index 0000000..89d4d44
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES2/gl2platform.h
@@ -0,0 +1,30 @@
+#ifndef __gl2platform_h_
+#define __gl2platform_h_
+
+/* $Revision: 23328 $ on $Date:: 2013-10-02 02:28:28 -0700 #$ */
+
+/*
+ * This document is licensed under the SGI Free Software B License Version
+ * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+ */
+
+/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file. Please submit changes
+ * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
+ * by filing a bug against product "OpenGL-ES" component "Registry".
+ */
+
+#include <KHR/khrplatform.h>
+
+#ifndef GL_APICALL
+#define GL_APICALL KHRONOS_APICALL
+#endif
+
+#ifndef GL_APIENTRY
+#define GL_APIENTRY KHRONOS_APIENTRY
+#endif
+
+#endif /* __gl2platform_h_ */
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES3/gl3.h b/src/3rdparty/platformspecific/Android/jni/GLES3/gl3.h
new file mode 100644
index 0000000..d51d2e6
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES3/gl3.h
@@ -0,0 +1,1213 @@
+#ifndef __gl3_h_
+#define __gl3_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision: 32120 $ on $Date: 2015-10-15 04:27:13 -0700 (Thu, 15 Oct 2015) $
+*/
+
+#include <GLES3/gl3platform.h>
+
+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+#if !defined(GL_GLES_PROTOTYPES)
+#define GL_GLES_PROTOTYPES 1
+#endif
+
+/* Generated on date 20151015 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]|3\.0
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include <KHR/khrplatform.h>
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_FALSE 0
+#define GL_TRUE 1
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_FUNC_ADD 0x8006
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STATIC_DRAW 0x88E4
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_CULL_FACE 0x0B44
+#define GL_BLEND 0x0BE2
+#define GL_DITHER 0x0BD0
+#define GL_STENCIL_TEST 0x0B90
+#define GL_DEPTH_TEST 0x0B71
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_LINE_WIDTH 0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_FIXED 0x140C
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_DELETE_STATUS 0x8B80
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_INVERT 0x150A
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_REPEAT 0x2901
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGB565 0x8D62
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_NONE 0
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER 0x0C02
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_RED 0x1903
+#define GL_RGB8 0x8051
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_COLOR_ATTACHMENT16 0x8CF0
+#define GL_COLOR_ATTACHMENT17 0x8CF1
+#define GL_COLOR_ATTACHMENT18 0x8CF2
+#define GL_COLOR_ATTACHMENT19 0x8CF3
+#define GL_COLOR_ATTACHMENT20 0x8CF4
+#define GL_COLOR_ATTACHMENT21 0x8CF5
+#define GL_COLOR_ATTACHMENT22 0x8CF6
+#define GL_COLOR_ATTACHMENT23 0x8CF7
+#define GL_COLOR_ATTACHMENT24 0x8CF8
+#define GL_COLOR_ATTACHMENT25 0x8CF9
+#define GL_COLOR_ATTACHMENT26 0x8CFA
+#define GL_COLOR_ATTACHMENT27 0x8CFB
+#define GL_COLOR_ATTACHMENT28 0x8CFC
+#define GL_COLOR_ATTACHMENT29 0x8CFD
+#define GL_COLOR_ATTACHMENT30 0x8CFE
+#define GL_COLOR_ATTACHMENT31 0x8CFF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_HALF_FLOAT 0x140B
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_RG8 0x822B
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_RGB10_A2UI 0x906F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_ES_VERSION_3_0 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES3/gl31.h b/src/3rdparty/platformspecific/Android/jni/GLES3/gl31.h
new file mode 100644
index 0000000..9b89a0a
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES3/gl31.h
@@ -0,0 +1,1528 @@
+#ifndef __gl31_h_
+#define __gl31_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision$ on $Date$
+*/
+
+#include <GLES3/gl3platform.h>
+
+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+#if !defined(GL_GLES_PROTOTYPES)
+#define GL_GLES_PROTOTYPES 1
+#endif
+
+/* Generated on date 20151015 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]|3\.[01]
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include <KHR/khrplatform.h>
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_FALSE 0
+#define GL_TRUE 1
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_FUNC_ADD 0x8006
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STATIC_DRAW 0x88E4
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_CULL_FACE 0x0B44
+#define GL_BLEND 0x0BE2
+#define GL_DITHER 0x0BD0
+#define GL_STENCIL_TEST 0x0B90
+#define GL_DEPTH_TEST 0x0B71
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_LINE_WIDTH 0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_FIXED 0x140C
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_DELETE_STATUS 0x8B80
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_INVERT 0x150A
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_REPEAT 0x2901
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGB565 0x8D62
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_NONE 0
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER 0x0C02
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_RED 0x1903
+#define GL_RGB8 0x8051
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_COLOR_ATTACHMENT16 0x8CF0
+#define GL_COLOR_ATTACHMENT17 0x8CF1
+#define GL_COLOR_ATTACHMENT18 0x8CF2
+#define GL_COLOR_ATTACHMENT19 0x8CF3
+#define GL_COLOR_ATTACHMENT20 0x8CF4
+#define GL_COLOR_ATTACHMENT21 0x8CF5
+#define GL_COLOR_ATTACHMENT22 0x8CF6
+#define GL_COLOR_ATTACHMENT23 0x8CF7
+#define GL_COLOR_ATTACHMENT24 0x8CF8
+#define GL_COLOR_ATTACHMENT25 0x8CF9
+#define GL_COLOR_ATTACHMENT26 0x8CFA
+#define GL_COLOR_ATTACHMENT27 0x8CFB
+#define GL_COLOR_ATTACHMENT28 0x8CFC
+#define GL_COLOR_ATTACHMENT29 0x8CFD
+#define GL_COLOR_ATTACHMENT30 0x8CFE
+#define GL_COLOR_ATTACHMENT31 0x8CFF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_HALF_FLOAT 0x140B
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_RG8 0x822B
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_RGB10_A2UI 0x906F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_ES_VERSION_3_0 */
+
+#ifndef GL_ES_VERSION_3_1
+#define GL_ES_VERSION_3_1 1
+#define GL_COMPUTE_SHADER 0x91B9
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF
+#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267
+#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_COMPUTE_SHADER_BIT 0x00000020
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+#define GL_MAX_UNIFORM_LOCATIONS 0x826E
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315
+#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316
+#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318
+#define GL_UNIFORM 0x92E1
+#define GL_UNIFORM_BLOCK 0x92E2
+#define GL_PROGRAM_INPUT 0x92E3
+#define GL_PROGRAM_OUTPUT 0x92E4
+#define GL_BUFFER_VARIABLE 0x92E5
+#define GL_SHADER_STORAGE_BLOCK 0x92E6
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4
+#define GL_ACTIVE_RESOURCES 0x92F5
+#define GL_MAX_NAME_LENGTH 0x92F6
+#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7
+#define GL_NAME_LENGTH 0x92F9
+#define GL_TYPE 0x92FA
+#define GL_ARRAY_SIZE 0x92FB
+#define GL_OFFSET 0x92FC
+#define GL_BLOCK_INDEX 0x92FD
+#define GL_ARRAY_STRIDE 0x92FE
+#define GL_MATRIX_STRIDE 0x92FF
+#define GL_IS_ROW_MAJOR 0x9300
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
+#define GL_BUFFER_BINDING 0x9302
+#define GL_BUFFER_DATA_SIZE 0x9303
+#define GL_NUM_ACTIVE_VARIABLES 0x9304
+#define GL_ACTIVE_VARIABLES 0x9305
+#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306
+#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A
+#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B
+#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D
+#define GL_LOCATION 0x930E
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#define GL_MAX_IMAGE_UNITS 0x8F38
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
+#define GL_IMAGE_BINDING_NAME 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED 0x8F3C
+#define GL_IMAGE_BINDING_LAYER 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS 0x8F3E
+#define GL_IMAGE_BINDING_FORMAT 0x906E
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+#define GL_IMAGE_2D 0x904D
+#define GL_IMAGE_3D 0x904E
+#define GL_IMAGE_CUBE 0x9050
+#define GL_IMAGE_2D_ARRAY 0x9053
+#define GL_INT_IMAGE_2D 0x9058
+#define GL_INT_IMAGE_3D 0x9059
+#define GL_INT_IMAGE_CUBE 0x905B
+#define GL_INT_IMAGE_2D_ARRAY 0x905E
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D 0x9064
+#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3
+#define GL_SHADER_STORAGE_BUFFER_START 0x90D4
+#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
+#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
+#define GL_STENCIL_INDEX 0x1901
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_SHARED_SIZE 0x8C3F
+#define GL_TEXTURE_RED_TYPE 0x8C10
+#define GL_TEXTURE_GREEN_TYPE 0x8C11
+#define GL_TEXTURE_BLUE_TYPE 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE 0x8C13
+#define GL_TEXTURE_DEPTH_TYPE 0x8C16
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_VERTEX_ATTRIB_BINDING 0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
+#define GL_VERTEX_BINDING_DIVISOR 0x82D6
+#define GL_VERTEX_BINDING_OFFSET 0x82D7
+#define GL_VERTEX_BINDING_STRIDE 0x82D8
+#define GL_VERTEX_BINDING_BUFFER 0x8F4F
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA
+#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings);
+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);
+typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);
+GL_APICALL void GL_APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);
+GL_APICALL void GL_APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);
+GL_APICALL void GL_APIENTRY glBindProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glValidateProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GL_APICALL void GL_APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);
+GL_APICALL void GL_APIENTRY glMemoryBarrier (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glMemoryBarrierByRegion (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GL_APICALL void GL_APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);
+GL_APICALL void GL_APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GL_APICALL void GL_APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
+GL_APICALL void GL_APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
+#endif
+#endif /* GL_ES_VERSION_3_1 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES3/gl32.h b/src/3rdparty/platformspecific/Android/jni/GLES3/gl32.h
new file mode 100644
index 0000000..a2c3611
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES3/gl32.h
@@ -0,0 +1,1829 @@
+#ifndef __gl32_h_
+#define __gl32_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2015 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision$ on $Date$
+*/
+
+#include <GLES3/gl3platform.h>
+
+#ifndef GL_APIENTRYP
+#define GL_APIENTRYP GL_APIENTRY*
+#endif
+
+#if !defined(GL_GLES_PROTOTYPES)
+#define GL_GLES_PROTOTYPES 1
+#endif
+
+/* Generated on date 20151015 */
+
+/* Generated C header for:
+ * API: gles2
+ * Profile: common
+ * Versions considered: 2\.[0-9]|3\.[012]
+ * Versions emitted: .*
+ * Default extensions included: None
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_ES_VERSION_2_0
+#define GL_ES_VERSION_2_0 1
+#include <KHR/khrplatform.h>
+typedef khronos_int8_t GLbyte;
+typedef khronos_float_t GLclampf;
+typedef khronos_int32_t GLfixed;
+typedef short GLshort;
+typedef unsigned short GLushort;
+typedef void GLvoid;
+typedef struct __GLsync *GLsync;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef unsigned int GLenum;
+typedef unsigned int GLuint;
+typedef char GLchar;
+typedef khronos_float_t GLfloat;
+typedef khronos_ssize_t GLsizeiptr;
+typedef khronos_intptr_t GLintptr;
+typedef unsigned int GLbitfield;
+typedef int GLint;
+typedef unsigned char GLboolean;
+typedef int GLsizei;
+typedef khronos_uint8_t GLubyte;
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_FALSE 0
+#define GL_TRUE 1
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_FUNC_ADD 0x8006
+#define GL_BLEND_EQUATION 0x8009
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STATIC_DRAW 0x88E4
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_CULL_FACE 0x0B44
+#define GL_BLEND 0x0BE2
+#define GL_DITHER 0x0BD0
+#define GL_STENCIL_TEST 0x0B90
+#define GL_DEPTH_TEST 0x0B71
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_LINE_WIDTH 0x0B21
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_FIXED 0x140C
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_DELETE_STATUS 0x8B80
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_INVERT 0x150A
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_TEXTURE 0x1702
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_REPEAT 0x2901
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGB565 0x8D62
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_NONE 0
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
+GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
+GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d);
+GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
+GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
+GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFinish (void);
+GL_APICALL void GL_APIENTRY glFlush (void);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL GLenum GL_APIENTRY glGetError (void);
+GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name);
+GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
+GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_ES_VERSION_2_0 */
+
+#ifndef GL_ES_VERSION_3_0
+#define GL_ES_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_READ_BUFFER 0x0C02
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_RED 0x1903
+#define GL_RGB8 0x8051
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_COLOR_ATTACHMENT16 0x8CF0
+#define GL_COLOR_ATTACHMENT17 0x8CF1
+#define GL_COLOR_ATTACHMENT18 0x8CF2
+#define GL_COLOR_ATTACHMENT19 0x8CF3
+#define GL_COLOR_ATTACHMENT20 0x8CF4
+#define GL_COLOR_ATTACHMENT21 0x8CF5
+#define GL_COLOR_ATTACHMENT22 0x8CF6
+#define GL_COLOR_ATTACHMENT23 0x8CF7
+#define GL_COLOR_ATTACHMENT24 0x8CF8
+#define GL_COLOR_ATTACHMENT25 0x8CF9
+#define GL_COLOR_ATTACHMENT26 0x8CFA
+#define GL_COLOR_ATTACHMENT27 0x8CFB
+#define GL_COLOR_ATTACHMENT28 0x8CFC
+#define GL_COLOR_ATTACHMENT29 0x8CFD
+#define GL_COLOR_ATTACHMENT30 0x8CFE
+#define GL_COLOR_ATTACHMENT31 0x8CFF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_HALF_FLOAT 0x140B
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_RG8 0x822B
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_RGB10_A2UI 0x906F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src);
+GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GL_APICALL void GL_APIENTRY glEndTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler);
+GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id);
+GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void);
+GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+#endif /* GL_ES_VERSION_3_0 */
+
+#ifndef GL_ES_VERSION_3_1
+#define GL_ES_VERSION_3_1 1
+#define GL_COMPUTE_SHADER 0x91B9
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF
+#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267
+#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_COMPUTE_SHADER_BIT 0x00000020
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+#define GL_MAX_UNIFORM_LOCATIONS 0x826E
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315
+#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316
+#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318
+#define GL_UNIFORM 0x92E1
+#define GL_UNIFORM_BLOCK 0x92E2
+#define GL_PROGRAM_INPUT 0x92E3
+#define GL_PROGRAM_OUTPUT 0x92E4
+#define GL_BUFFER_VARIABLE 0x92E5
+#define GL_SHADER_STORAGE_BLOCK 0x92E6
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4
+#define GL_ACTIVE_RESOURCES 0x92F5
+#define GL_MAX_NAME_LENGTH 0x92F6
+#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7
+#define GL_NAME_LENGTH 0x92F9
+#define GL_TYPE 0x92FA
+#define GL_ARRAY_SIZE 0x92FB
+#define GL_OFFSET 0x92FC
+#define GL_BLOCK_INDEX 0x92FD
+#define GL_ARRAY_STRIDE 0x92FE
+#define GL_MATRIX_STRIDE 0x92FF
+#define GL_IS_ROW_MAJOR 0x9300
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
+#define GL_BUFFER_BINDING 0x9302
+#define GL_BUFFER_DATA_SIZE 0x9303
+#define GL_NUM_ACTIVE_VARIABLES 0x9304
+#define GL_ACTIVE_VARIABLES 0x9305
+#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306
+#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A
+#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B
+#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D
+#define GL_LOCATION 0x930E
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#define GL_MAX_IMAGE_UNITS 0x8F38
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
+#define GL_IMAGE_BINDING_NAME 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED 0x8F3C
+#define GL_IMAGE_BINDING_LAYER 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS 0x8F3E
+#define GL_IMAGE_BINDING_FORMAT 0x906E
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+#define GL_IMAGE_2D 0x904D
+#define GL_IMAGE_3D 0x904E
+#define GL_IMAGE_CUBE 0x9050
+#define GL_IMAGE_2D_ARRAY 0x9053
+#define GL_INT_IMAGE_2D 0x9058
+#define GL_INT_IMAGE_3D 0x9059
+#define GL_INT_IMAGE_CUBE 0x905B
+#define GL_INT_IMAGE_2D_ARRAY 0x905E
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D 0x9064
+#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3
+#define GL_SHADER_STORAGE_BUFFER_START 0x90D4
+#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
+#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
+#define GL_STENCIL_INDEX 0x1901
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_SHARED_SIZE 0x8C3F
+#define GL_TEXTURE_RED_TYPE 0x8C10
+#define GL_TEXTURE_GREEN_TYPE 0x8C11
+#define GL_TEXTURE_BLUE_TYPE 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE 0x8C13
+#define GL_TEXTURE_DEPTH_TYPE 0x8C16
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_VERTEX_ATTRIB_BINDING 0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
+#define GL_VERTEX_BINDING_DIVISOR 0x82D6
+#define GL_VERTEX_BINDING_OFFSET 0x82D7
+#define GL_VERTEX_BINDING_STRIDE 0x82D8
+#define GL_VERTEX_BINDING_BUFFER 0x8F4F
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA
+#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings);
+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);
+typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);
+GL_APICALL void GL_APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);
+GL_APICALL void GL_APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);
+GL_APICALL void GL_APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);
+GL_APICALL void GL_APIENTRY glBindProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glValidateProgramPipeline (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GL_APICALL void GL_APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);
+GL_APICALL void GL_APIENTRY glMemoryBarrier (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glMemoryBarrierByRegion (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GL_APICALL void GL_APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);
+GL_APICALL void GL_APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GL_APICALL void GL_APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GL_APICALL void GL_APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GL_APICALL void GL_APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
+GL_APICALL void GL_APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
+#endif
+#endif /* GL_ES_VERSION_3_1 */
+
+#ifndef GL_ES_VERSION_3_2
+#define GL_ES_VERSION_3_2 1
+typedef void (GL_APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+#define GL_MULTISAMPLE_LINE_WIDTH_RANGE 0x9381
+#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY 0x9382
+#define GL_MULTIPLY 0x9294
+#define GL_SCREEN 0x9295
+#define GL_OVERLAY 0x9296
+#define GL_DARKEN 0x9297
+#define GL_LIGHTEN 0x9298
+#define GL_COLORDODGE 0x9299
+#define GL_COLORBURN 0x929A
+#define GL_HARDLIGHT 0x929B
+#define GL_SOFTLIGHT 0x929C
+#define GL_DIFFERENCE 0x929E
+#define GL_EXCLUSION 0x92A0
+#define GL_HSL_HUE 0x92AD
+#define GL_HSL_SATURATION 0x92AE
+#define GL_HSL_COLOR 0x92AF
+#define GL_HSL_LUMINOSITY 0x92B0
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#define GL_DEBUG_SOURCE_API 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#define GL_BUFFER 0x82E0
+#define GL_SHADER 0x82E1
+#define GL_PROGRAM 0x82E2
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_QUERY 0x82E3
+#define GL_PROGRAM_PIPELINE 0x82E4
+#define GL_SAMPLER 0x82E6
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#define GL_DEBUG_OUTPUT 0x92E0
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_GEOMETRY_SHADER 0x8DD9
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_GEOMETRY_VERTICES_OUT 0x8916
+#define GL_GEOMETRY_INPUT_TYPE 0x8917
+#define GL_GEOMETRY_OUTPUT_TYPE 0x8918
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_LAYER_PROVOKING_VERTEX 0x825E
+#define GL_LINES_ADJACENCY 0x000A
+#define GL_LINE_STRIP_ADJACENCY 0x000B
+#define GL_TRIANGLES_ADJACENCY 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_UNDEFINED_VERTEX 0x8260
+#define GL_PRIMITIVES_GENERATED 0x8C87
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312
+#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309
+#define GL_PRIMITIVE_BOUNDING_BOX 0x92BE
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004
+#define GL_CONTEXT_FLAGS 0x821E
+#define GL_LOSE_CONTEXT_ON_RESET 0x8252
+#define GL_GUILTY_CONTEXT_RESET 0x8253
+#define GL_INNOCENT_CONTEXT_RESET 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET 0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY 0x8256
+#define GL_NO_RESET_NOTIFICATION 0x8261
+#define GL_CONTEXT_LOST 0x0507
+#define GL_SAMPLE_SHADING 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_PATCHES 0x000E
+#define GL_PATCH_VERTICES 0x8E72
+#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75
+#define GL_TESS_GEN_MODE 0x8E76
+#define GL_TESS_GEN_SPACING 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER 0x8E78
+#define GL_TESS_GEN_POINT_MODE 0x8E79
+#define GL_ISOLINES 0x8E7A
+#define GL_QUADS 0x0007
+#define GL_FRACTIONAL_ODD 0x8E7B
+#define GL_FRACTIONAL_EVEN 0x8E7C
+#define GL_MAX_PATCH_VERTICES 0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL 0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221
+#define GL_IS_PER_PATCH 0x92E7
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_CLAMP_TO_BORDER 0x812D
+#define GL_TEXTURE_BUFFER 0x8C2A
+#define GL_TEXTURE_BUFFER_BINDING 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F
+#define GL_SAMPLER_BUFFER 0x8DC2
+#define GL_INT_SAMPLER_BUFFER 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8
+#define GL_IMAGE_BUFFER 0x9051
+#define GL_INT_IMAGE_BUFFER 0x905C
+#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067
+#define GL_TEXTURE_BUFFER_OFFSET 0x919D
+#define GL_TEXTURE_BUFFER_SIZE 0x919E
+#define GL_COMPRESSED_RGBA_ASTC_4x4 0x93B0
+#define GL_COMPRESSED_RGBA_ASTC_5x4 0x93B1
+#define GL_COMPRESSED_RGBA_ASTC_5x5 0x93B2
+#define GL_COMPRESSED_RGBA_ASTC_6x5 0x93B3
+#define GL_COMPRESSED_RGBA_ASTC_6x6 0x93B4
+#define GL_COMPRESSED_RGBA_ASTC_8x5 0x93B5
+#define GL_COMPRESSED_RGBA_ASTC_8x6 0x93B6
+#define GL_COMPRESSED_RGBA_ASTC_8x8 0x93B7
+#define GL_COMPRESSED_RGBA_ASTC_10x5 0x93B8
+#define GL_COMPRESSED_RGBA_ASTC_10x6 0x93B9
+#define GL_COMPRESSED_RGBA_ASTC_10x8 0x93BA
+#define GL_COMPRESSED_RGBA_ASTC_10x10 0x93BB
+#define GL_COMPRESSED_RGBA_ASTC_12x10 0x93BC
+#define GL_COMPRESSED_RGBA_ASTC_12x12 0x93BD
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4 0x93D0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4 0x93D1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5 0x93D2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5 0x93D3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6 0x93D4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5 0x93D5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6 0x93D6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8 0x93D7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5 0x93D8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6 0x93D9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8 0x93DA
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10 0x93DB
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10 0x93DC
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 0x93DD
+#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+typedef void (GL_APIENTRYP PFNGLBLENDBARRIERPROC) (void);
+typedef void (GL_APIENTRYP 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);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);
+typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void);
+typedef void (GL_APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params);
+typedef void (GL_APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GL_APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value);
+typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#if GL_GLES_PROTOTYPES
+GL_APICALL void GL_APIENTRY glBlendBarrier (void);
+GL_APICALL void GL_APIENTRY glCopyImageSubData (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);
+GL_APICALL void GL_APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GL_APICALL void GL_APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GL_APICALL void GL_APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam);
+GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+GL_APICALL void GL_APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+GL_APICALL void GL_APIENTRY glPopDebugGroup (void);
+GL_APICALL void GL_APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+GL_APICALL void GL_APIENTRY glGetPointerv (GLenum pname, void **params);
+GL_APICALL void GL_APIENTRY glEnablei (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDisablei (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glBlendEquationi (GLuint buf, GLenum mode);
+GL_APICALL void GL_APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GL_APICALL void GL_APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GL_APICALL GLboolean GL_APIENTRY glIsEnabledi (GLenum target, GLuint index);
+GL_APICALL void GL_APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+GL_APICALL void GL_APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glPrimitiveBoundingBox (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW);
+GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatus (void);
+GL_APICALL void GL_APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GL_APICALL void GL_APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GL_APICALL void GL_APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GL_APICALL void GL_APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+GL_APICALL void GL_APIENTRY glMinSampleShading (GLfloat value);
+GL_APICALL void GL_APIENTRY glPatchParameteri (GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params);
+GL_APICALL void GL_APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param);
+GL_APICALL void GL_APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer);
+GL_APICALL void GL_APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GL_APICALL void GL_APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#endif
+#endif /* GL_ES_VERSION_3_2 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES3/gl3ext.h b/src/3rdparty/platformspecific/Android/jni/GLES3/gl3ext.h
new file mode 100644
index 0000000..4d4ea96
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES3/gl3ext.h
@@ -0,0 +1,24 @@
+#ifndef __gl3ext_h_
+#define __gl3ext_h_
+
+/* $Revision: 17809 $ on $Date:: 2012-05-14 08:03:36 -0700 #$ */
+
+/*
+ * This document is licensed under the SGI Free Software B License Version
+ * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+ */
+
+/* OpenGL ES 3 Extensions
+ *
+ * After an OES extension's interactions with OpenGl ES 3.0 have been documented,
+ * its tokens and function definitions should be added to this file in a manner
+ * that does not conflict with gl2ext.h or gl3.h.
+ *
+ * Tokens and function definitions for extensions that have become standard
+ * features in OpenGL ES 3.0 will not be added to this file.
+ *
+ * Applications using OpenGL-ES-2-only extensions should include gl2ext.h
+ */
+
+#endif /* __gl3ext_h_ */
+
diff --git a/src/3rdparty/platformspecific/Android/jni/GLES3/gl3platform.h b/src/3rdparty/platformspecific/Android/jni/GLES3/gl3platform.h
new file mode 100644
index 0000000..b1e869d
--- /dev/null
+++ b/src/3rdparty/platformspecific/Android/jni/GLES3/gl3platform.h
@@ -0,0 +1,30 @@
+#ifndef __gl3platform_h_
+#define __gl3platform_h_
+
+/* $Revision: 23328 $ on $Date:: 2013-10-02 02:28:28 -0700 #$ */
+
+/*
+ * This document is licensed under the SGI Free Software B License Version
+ * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+ */
+
+/* Platform-specific types and definitions for OpenGL ES 3.X gl3.h
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file. Please submit changes
+ * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
+ * by filing a bug against product "OpenGL-ES" component "Registry".
+ */
+
+#include <KHR/khrplatform.h>
+
+#ifndef GL_APICALL
+#define GL_APICALL KHRONOS_APICALL
+#endif
+
+#ifndef GL_APIENTRY
+#define GL_APIENTRY KHRONOS_APIENTRY
+#endif
+
+#endif /* __gl3platform_h_ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/gl.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/gl.h
new file mode 100644
index 0000000..1d2cd0a
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/gl.h
@@ -0,0 +1,1543 @@
+/*
+** NOTE: This is a version of gl.h extracted from Visual C++ 7.1 checked in
+** to the source tree so Linux and Windows builds can use the same headers.
+** The only modification to the file is to define "WINGDIAPI" and "APIENTRY"
+** for non-Win32 builds.
+*/
+
+/*++ BUILD Version: 0004 // Increment this if a change has global effects
+
+Copyright (c) 1985-96, Microsoft Corporation
+
+Module Name:
+
+ gl.h
+
+Abstract:
+
+ Procedure declarations, constant definitions and macros for the OpenGL
+ component.
+
+--*/
+
+#ifndef __gl_h_
+#ifndef __GL_H__
+
+#define __gl_h_
+#define __GL_H__
+
+#if !defined (_WIN32)
+#define WINGDIAPI
+#define APIENTRY
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright 1996 Silicon Graphics, Inc.
+** All Rights Reserved.
+**
+** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
+** the contents of this file may not be disclosed to third parties, copied or
+** duplicated in any form, in whole or in part, without the prior written
+** permission of Silicon Graphics, Inc.
+**
+** RESTRICTED RIGHTS LEGEND:
+** Use, duplication or disclosure by the Government is subject to restrictions
+** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
+** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
+** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
+** rights reserved under the Copyright Laws of the United States.
+*/
+
+typedef unsigned int GLenum;
+typedef unsigned char GLboolean;
+typedef unsigned int GLbitfield;
+typedef signed char GLbyte;
+typedef short GLshort;
+typedef int GLint;
+typedef int GLsizei;
+typedef unsigned char GLubyte;
+typedef unsigned short GLushort;
+typedef unsigned int GLuint;
+typedef float GLfloat;
+typedef float GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void GLvoid;
+
+/*************************************************************/
+
+/* Version */
+#define GL_VERSION_1_1 1
+
+/* AccumOp */
+#define GL_ACCUM 0x0100
+#define GL_LOAD 0x0101
+#define GL_RETURN 0x0102
+#define GL_MULT 0x0103
+#define GL_ADD 0x0104
+
+/* AlphaFunction */
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+
+/* AttribMask */
+#define GL_CURRENT_BIT 0x00000001
+#define GL_POINT_BIT 0x00000002
+#define GL_LINE_BIT 0x00000004
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_FOG_BIT 0x00000080
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_ACCUM_BUFFER_BIT 0x00000200
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_VIEWPORT_BIT 0x00000800
+#define GL_TRANSFORM_BIT 0x00001000
+#define GL_ENABLE_BIT 0x00002000
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_HINT_BIT 0x00008000
+#define GL_EVAL_BIT 0x00010000
+#define GL_LIST_BIT 0x00020000
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_ALL_ATTRIB_BITS 0x000fffff
+
+/* BeginMode */
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_QUADS 0x0007
+#define GL_QUAD_STRIP 0x0008
+#define GL_POLYGON 0x0009
+
+/* BlendingFactorDest */
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+
+/* BlendingFactorSrc */
+/* GL_ZERO */
+/* GL_ONE */
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+/* GL_SRC_ALPHA */
+/* GL_ONE_MINUS_SRC_ALPHA */
+/* GL_DST_ALPHA */
+/* GL_ONE_MINUS_DST_ALPHA */
+
+/* Boolean */
+#define GL_TRUE 1
+#define GL_FALSE 0
+
+/* ClearBufferMask */
+/* GL_COLOR_BUFFER_BIT */
+/* GL_ACCUM_BUFFER_BIT */
+/* GL_STENCIL_BUFFER_BIT */
+/* GL_DEPTH_BUFFER_BIT */
+
+/* ClientArrayType */
+/* GL_VERTEX_ARRAY */
+/* GL_NORMAL_ARRAY */
+/* GL_COLOR_ARRAY */
+/* GL_INDEX_ARRAY */
+/* GL_TEXTURE_COORD_ARRAY */
+/* GL_EDGE_FLAG_ARRAY */
+
+/* ClipPlaneName */
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+
+/* ColorMaterialFace */
+/* GL_FRONT */
+/* GL_BACK */
+/* GL_FRONT_AND_BACK */
+
+/* ColorMaterialParameter */
+/* GL_AMBIENT */
+/* GL_DIFFUSE */
+/* GL_SPECULAR */
+/* GL_EMISSION */
+/* GL_AMBIENT_AND_DIFFUSE */
+
+/* ColorPointerType */
+/* GL_BYTE */
+/* GL_UNSIGNED_BYTE */
+/* GL_SHORT */
+/* GL_UNSIGNED_SHORT */
+/* GL_INT */
+/* GL_UNSIGNED_INT */
+/* GL_FLOAT */
+/* GL_DOUBLE */
+
+/* CullFaceMode */
+/* GL_FRONT */
+/* GL_BACK */
+/* GL_FRONT_AND_BACK */
+
+/* DataType */
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_2_BYTES 0x1407
+#define GL_3_BYTES 0x1408
+#define GL_4_BYTES 0x1409
+#define GL_DOUBLE 0x140A
+
+/* DepthFunction */
+/* GL_NEVER */
+/* GL_LESS */
+/* GL_EQUAL */
+/* GL_LEQUAL */
+/* GL_GREATER */
+/* GL_NOTEQUAL */
+/* GL_GEQUAL */
+/* GL_ALWAYS */
+
+/* DrawBufferMode */
+#define GL_NONE 0
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_LEFT 0x0406
+#define GL_RIGHT 0x0407
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_AUX0 0x0409
+#define GL_AUX1 0x040A
+#define GL_AUX2 0x040B
+#define GL_AUX3 0x040C
+
+/* Enable */
+/* GL_FOG */
+/* GL_LIGHTING */
+/* GL_TEXTURE_1D */
+/* GL_TEXTURE_2D */
+/* GL_LINE_STIPPLE */
+/* GL_POLYGON_STIPPLE */
+/* GL_CULL_FACE */
+/* GL_ALPHA_TEST */
+/* GL_BLEND */
+/* GL_INDEX_LOGIC_OP */
+/* GL_COLOR_LOGIC_OP */
+/* GL_DITHER */
+/* GL_STENCIL_TEST */
+/* GL_DEPTH_TEST */
+/* GL_CLIP_PLANE0 */
+/* GL_CLIP_PLANE1 */
+/* GL_CLIP_PLANE2 */
+/* GL_CLIP_PLANE3 */
+/* GL_CLIP_PLANE4 */
+/* GL_CLIP_PLANE5 */
+/* GL_LIGHT0 */
+/* GL_LIGHT1 */
+/* GL_LIGHT2 */
+/* GL_LIGHT3 */
+/* GL_LIGHT4 */
+/* GL_LIGHT5 */
+/* GL_LIGHT6 */
+/* GL_LIGHT7 */
+/* GL_TEXTURE_GEN_S */
+/* GL_TEXTURE_GEN_T */
+/* GL_TEXTURE_GEN_R */
+/* GL_TEXTURE_GEN_Q */
+/* GL_MAP1_VERTEX_3 */
+/* GL_MAP1_VERTEX_4 */
+/* GL_MAP1_COLOR_4 */
+/* GL_MAP1_INDEX */
+/* GL_MAP1_NORMAL */
+/* GL_MAP1_TEXTURE_COORD_1 */
+/* GL_MAP1_TEXTURE_COORD_2 */
+/* GL_MAP1_TEXTURE_COORD_3 */
+/* GL_MAP1_TEXTURE_COORD_4 */
+/* GL_MAP2_VERTEX_3 */
+/* GL_MAP2_VERTEX_4 */
+/* GL_MAP2_COLOR_4 */
+/* GL_MAP2_INDEX */
+/* GL_MAP2_NORMAL */
+/* GL_MAP2_TEXTURE_COORD_1 */
+/* GL_MAP2_TEXTURE_COORD_2 */
+/* GL_MAP2_TEXTURE_COORD_3 */
+/* GL_MAP2_TEXTURE_COORD_4 */
+/* GL_POINT_SMOOTH */
+/* GL_LINE_SMOOTH */
+/* GL_POLYGON_SMOOTH */
+/* GL_SCISSOR_TEST */
+/* GL_COLOR_MATERIAL */
+/* GL_NORMALIZE */
+/* GL_AUTO_NORMAL */
+/* GL_VERTEX_ARRAY */
+/* GL_NORMAL_ARRAY */
+/* GL_COLOR_ARRAY */
+/* GL_INDEX_ARRAY */
+/* GL_TEXTURE_COORD_ARRAY */
+/* GL_EDGE_FLAG_ARRAY */
+/* GL_POLYGON_OFFSET_POINT */
+/* GL_POLYGON_OFFSET_LINE */
+/* GL_POLYGON_OFFSET_FILL */
+
+/* ErrorCode */
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_OUT_OF_MEMORY 0x0505
+
+/* FeedBackMode */
+#define GL_2D 0x0600
+#define GL_3D 0x0601
+#define GL_3D_COLOR 0x0602
+#define GL_3D_COLOR_TEXTURE 0x0603
+#define GL_4D_COLOR_TEXTURE 0x0604
+
+/* FeedBackToken */
+#define GL_PASS_THROUGH_TOKEN 0x0700
+#define GL_POINT_TOKEN 0x0701
+#define GL_LINE_TOKEN 0x0702
+#define GL_POLYGON_TOKEN 0x0703
+#define GL_BITMAP_TOKEN 0x0704
+#define GL_DRAW_PIXEL_TOKEN 0x0705
+#define GL_COPY_PIXEL_TOKEN 0x0706
+#define GL_LINE_RESET_TOKEN 0x0707
+
+/* FogMode */
+/* GL_LINEAR */
+#define GL_EXP 0x0800
+#define GL_EXP2 0x0801
+
+
+/* FogParameter */
+/* GL_FOG_COLOR */
+/* GL_FOG_DENSITY */
+/* GL_FOG_END */
+/* GL_FOG_INDEX */
+/* GL_FOG_MODE */
+/* GL_FOG_START */
+
+/* FrontFaceDirection */
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+
+/* GetMapTarget */
+#define GL_COEFF 0x0A00
+#define GL_ORDER 0x0A01
+#define GL_DOMAIN 0x0A02
+
+/* GetPixelMap */
+/* GL_PIXEL_MAP_I_TO_I */
+/* GL_PIXEL_MAP_S_TO_S */
+/* GL_PIXEL_MAP_I_TO_R */
+/* GL_PIXEL_MAP_I_TO_G */
+/* GL_PIXEL_MAP_I_TO_B */
+/* GL_PIXEL_MAP_I_TO_A */
+/* GL_PIXEL_MAP_R_TO_R */
+/* GL_PIXEL_MAP_G_TO_G */
+/* GL_PIXEL_MAP_B_TO_B */
+/* GL_PIXEL_MAP_A_TO_A */
+
+/* GetPointerTarget */
+/* GL_VERTEX_ARRAY_POINTER */
+/* GL_NORMAL_ARRAY_POINTER */
+/* GL_COLOR_ARRAY_POINTER */
+/* GL_INDEX_ARRAY_POINTER */
+/* GL_TEXTURE_COORD_ARRAY_POINTER */
+/* GL_EDGE_FLAG_ARRAY_POINTER */
+
+/* GetTarget */
+#define GL_CURRENT_COLOR 0x0B00
+#define GL_CURRENT_INDEX 0x0B01
+#define GL_CURRENT_NORMAL 0x0B02
+#define GL_CURRENT_TEXTURE_COORDS 0x0B03
+#define GL_CURRENT_RASTER_COLOR 0x0B04
+#define GL_CURRENT_RASTER_INDEX 0x0B05
+#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
+#define GL_CURRENT_RASTER_POSITION 0x0B07
+#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
+#define GL_CURRENT_RASTER_DISTANCE 0x0B09
+#define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_LINE_STIPPLE 0x0B24
+#define GL_LINE_STIPPLE_PATTERN 0x0B25
+#define GL_LINE_STIPPLE_REPEAT 0x0B26
+#define GL_LIST_MODE 0x0B30
+#define GL_MAX_LIST_NESTING 0x0B31
+#define GL_LIST_BASE 0x0B32
+#define GL_LIST_INDEX 0x0B33
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_POLYGON_STIPPLE 0x0B42
+#define GL_EDGE_FLAG 0x0B43
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_LIGHTING 0x0B50
+#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+#define GL_SHADE_MODEL 0x0B54
+#define GL_COLOR_MATERIAL_FACE 0x0B55
+#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
+#define GL_COLOR_MATERIAL 0x0B57
+#define GL_FOG 0x0B60
+#define GL_FOG_INDEX 0x0B61
+#define GL_FOG_DENSITY 0x0B62
+#define GL_FOG_START 0x0B63
+#define GL_FOG_END 0x0B64
+#define GL_FOG_MODE 0x0B65
+#define GL_FOG_COLOR 0x0B66
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_ACCUM_CLEAR_VALUE 0x0B80
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_MATRIX_MODE 0x0BA0
+#define GL_NORMALIZE 0x0BA1
+#define GL_VIEWPORT 0x0BA2
+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
+#define GL_PROJECTION_STACK_DEPTH 0x0BA4
+#define GL_TEXTURE_STACK_DEPTH 0x0BA5
+#define GL_MODELVIEW_MATRIX 0x0BA6
+#define GL_PROJECTION_MATRIX 0x0BA7
+#define GL_TEXTURE_MATRIX 0x0BA8
+#define GL_ATTRIB_STACK_DEPTH 0x0BB0
+#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
+#define GL_ALPHA_TEST 0x0BC0
+#define GL_ALPHA_TEST_FUNC 0x0BC1
+#define GL_ALPHA_TEST_REF 0x0BC2
+#define GL_DITHER 0x0BD0
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND 0x0BE2
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_INDEX_LOGIC_OP 0x0BF1
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_AUX_BUFFERS 0x0C00
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_READ_BUFFER 0x0C02
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_INDEX_CLEAR_VALUE 0x0C20
+#define GL_INDEX_WRITEMASK 0x0C21
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_INDEX_MODE 0x0C30
+#define GL_RGBA_MODE 0x0C31
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_STEREO 0x0C33
+#define GL_RENDER_MODE 0x0C40
+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
+#define GL_POINT_SMOOTH_HINT 0x0C51
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_FOG_HINT 0x0C54
+#define GL_TEXTURE_GEN_S 0x0C60
+#define GL_TEXTURE_GEN_T 0x0C61
+#define GL_TEXTURE_GEN_R 0x0C62
+#define GL_TEXTURE_GEN_Q 0x0C63
+#define GL_PIXEL_MAP_I_TO_I 0x0C70
+#define GL_PIXEL_MAP_S_TO_S 0x0C71
+#define GL_PIXEL_MAP_I_TO_R 0x0C72
+#define GL_PIXEL_MAP_I_TO_G 0x0C73
+#define GL_PIXEL_MAP_I_TO_B 0x0C74
+#define GL_PIXEL_MAP_I_TO_A 0x0C75
+#define GL_PIXEL_MAP_R_TO_R 0x0C76
+#define GL_PIXEL_MAP_G_TO_G 0x0C77
+#define GL_PIXEL_MAP_B_TO_B 0x0C78
+#define GL_PIXEL_MAP_A_TO_A 0x0C79
+#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
+#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
+#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
+#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
+#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
+#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
+#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
+#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
+#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
+#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAP_COLOR 0x0D10
+#define GL_MAP_STENCIL 0x0D11
+#define GL_INDEX_SHIFT 0x0D12
+#define GL_INDEX_OFFSET 0x0D13
+#define GL_RED_SCALE 0x0D14
+#define GL_RED_BIAS 0x0D15
+#define GL_ZOOM_X 0x0D16
+#define GL_ZOOM_Y 0x0D17
+#define GL_GREEN_SCALE 0x0D18
+#define GL_GREEN_BIAS 0x0D19
+#define GL_BLUE_SCALE 0x0D1A
+#define GL_BLUE_BIAS 0x0D1B
+#define GL_ALPHA_SCALE 0x0D1C
+#define GL_ALPHA_BIAS 0x0D1D
+#define GL_DEPTH_SCALE 0x0D1E
+#define GL_DEPTH_BIAS 0x0D1F
+#define GL_MAX_EVAL_ORDER 0x0D30
+#define GL_MAX_LIGHTS 0x0D31
+#define GL_MAX_CLIP_PLANES 0x0D32
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
+#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
+#define GL_MAX_NAME_STACK_DEPTH 0x0D37
+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_INDEX_BITS 0x0D51
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_ACCUM_RED_BITS 0x0D58
+#define GL_ACCUM_GREEN_BITS 0x0D59
+#define GL_ACCUM_BLUE_BITS 0x0D5A
+#define GL_ACCUM_ALPHA_BITS 0x0D5B
+#define GL_NAME_STACK_DEPTH 0x0D70
+#define GL_AUTO_NORMAL 0x0D80
+#define GL_MAP1_COLOR_4 0x0D90
+#define GL_MAP1_INDEX 0x0D91
+#define GL_MAP1_NORMAL 0x0D92
+#define GL_MAP1_TEXTURE_COORD_1 0x0D93
+#define GL_MAP1_TEXTURE_COORD_2 0x0D94
+#define GL_MAP1_TEXTURE_COORD_3 0x0D95
+#define GL_MAP1_TEXTURE_COORD_4 0x0D96
+#define GL_MAP1_VERTEX_3 0x0D97
+#define GL_MAP1_VERTEX_4 0x0D98
+#define GL_MAP2_COLOR_4 0x0DB0
+#define GL_MAP2_INDEX 0x0DB1
+#define GL_MAP2_NORMAL 0x0DB2
+#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
+#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
+#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
+#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
+#define GL_MAP2_VERTEX_3 0x0DB7
+#define GL_MAP2_VERTEX_4 0x0DB8
+#define GL_MAP1_GRID_DOMAIN 0x0DD0
+#define GL_MAP1_GRID_SEGMENTS 0x0DD1
+#define GL_MAP2_GRID_DOMAIN 0x0DD2
+#define GL_MAP2_GRID_SEGMENTS 0x0DD3
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
+#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
+#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
+#define GL_SELECTION_BUFFER_POINTER 0x0DF3
+#define GL_SELECTION_BUFFER_SIZE 0x0DF4
+/* GL_TEXTURE_BINDING_1D */
+/* GL_TEXTURE_BINDING_2D */
+/* GL_VERTEX_ARRAY */
+/* GL_NORMAL_ARRAY */
+/* GL_COLOR_ARRAY */
+/* GL_INDEX_ARRAY */
+/* GL_TEXTURE_COORD_ARRAY */
+/* GL_EDGE_FLAG_ARRAY */
+/* GL_VERTEX_ARRAY_SIZE */
+/* GL_VERTEX_ARRAY_TYPE */
+/* GL_VERTEX_ARRAY_STRIDE */
+/* GL_NORMAL_ARRAY_TYPE */
+/* GL_NORMAL_ARRAY_STRIDE */
+/* GL_COLOR_ARRAY_SIZE */
+/* GL_COLOR_ARRAY_TYPE */
+/* GL_COLOR_ARRAY_STRIDE */
+/* GL_INDEX_ARRAY_TYPE */
+/* GL_INDEX_ARRAY_STRIDE */
+/* GL_TEXTURE_COORD_ARRAY_SIZE */
+/* GL_TEXTURE_COORD_ARRAY_TYPE */
+/* GL_TEXTURE_COORD_ARRAY_STRIDE */
+/* GL_EDGE_FLAG_ARRAY_STRIDE */
+/* GL_POLYGON_OFFSET_FACTOR */
+/* GL_POLYGON_OFFSET_UNITS */
+
+/* GetTextureParameter */
+/* GL_TEXTURE_MAG_FILTER */
+/* GL_TEXTURE_MIN_FILTER */
+/* GL_TEXTURE_WRAP_S */
+/* GL_TEXTURE_WRAP_T */
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_BORDER 0x1005
+/* GL_TEXTURE_RED_SIZE */
+/* GL_TEXTURE_GREEN_SIZE */
+/* GL_TEXTURE_BLUE_SIZE */
+/* GL_TEXTURE_ALPHA_SIZE */
+/* GL_TEXTURE_LUMINANCE_SIZE */
+/* GL_TEXTURE_INTENSITY_SIZE */
+/* GL_TEXTURE_PRIORITY */
+/* GL_TEXTURE_RESIDENT */
+
+/* HintMode */
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+
+/* HintTarget */
+/* GL_PERSPECTIVE_CORRECTION_HINT */
+/* GL_POINT_SMOOTH_HINT */
+/* GL_LINE_SMOOTH_HINT */
+/* GL_POLYGON_SMOOTH_HINT */
+/* GL_FOG_HINT */
+/* GL_PHONG_HINT */
+
+/* IndexPointerType */
+/* GL_SHORT */
+/* GL_INT */
+/* GL_FLOAT */
+/* GL_DOUBLE */
+
+/* LightModelParameter */
+/* GL_LIGHT_MODEL_AMBIENT */
+/* GL_LIGHT_MODEL_LOCAL_VIEWER */
+/* GL_LIGHT_MODEL_TWO_SIDE */
+
+/* LightName */
+#define GL_LIGHT0 0x4000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+
+/* LightParameter */
+#define GL_AMBIENT 0x1200
+#define GL_DIFFUSE 0x1201
+#define GL_SPECULAR 0x1202
+#define GL_POSITION 0x1203
+#define GL_SPOT_DIRECTION 0x1204
+#define GL_SPOT_EXPONENT 0x1205
+#define GL_SPOT_CUTOFF 0x1206
+#define GL_CONSTANT_ATTENUATION 0x1207
+#define GL_LINEAR_ATTENUATION 0x1208
+#define GL_QUADRATIC_ATTENUATION 0x1209
+
+/* InterleavedArrays */
+/* GL_V2F */
+/* GL_V3F */
+/* GL_C4UB_V2F */
+/* GL_C4UB_V3F */
+/* GL_C3F_V3F */
+/* GL_N3F_V3F */
+/* GL_C4F_N3F_V3F */
+/* GL_T2F_V3F */
+/* GL_T4F_V4F */
+/* GL_T2F_C4UB_V3F */
+/* GL_T2F_C3F_V3F */
+/* GL_T2F_N3F_V3F */
+/* GL_T2F_C4F_N3F_V3F */
+/* GL_T4F_C4F_N3F_V4F */
+
+/* ListMode */
+#define GL_COMPILE 0x1300
+#define GL_COMPILE_AND_EXECUTE 0x1301
+
+/* ListNameType */
+/* GL_BYTE */
+/* GL_UNSIGNED_BYTE */
+/* GL_SHORT */
+/* GL_UNSIGNED_SHORT */
+/* GL_INT */
+/* GL_UNSIGNED_INT */
+/* GL_FLOAT */
+/* GL_2_BYTES */
+/* GL_3_BYTES */
+/* GL_4_BYTES */
+
+/* LogicOp */
+#define GL_CLEAR 0x1500
+#define GL_AND 0x1501
+#define GL_AND_REVERSE 0x1502
+#define GL_COPY 0x1503
+#define GL_AND_INVERTED 0x1504
+#define GL_NOOP 0x1505
+#define GL_XOR 0x1506
+#define GL_OR 0x1507
+#define GL_NOR 0x1508
+#define GL_EQUIV 0x1509
+#define GL_INVERT 0x150A
+#define GL_OR_REVERSE 0x150B
+#define GL_COPY_INVERTED 0x150C
+#define GL_OR_INVERTED 0x150D
+#define GL_NAND 0x150E
+#define GL_SET 0x150F
+
+/* MapTarget */
+/* GL_MAP1_COLOR_4 */
+/* GL_MAP1_INDEX */
+/* GL_MAP1_NORMAL */
+/* GL_MAP1_TEXTURE_COORD_1 */
+/* GL_MAP1_TEXTURE_COORD_2 */
+/* GL_MAP1_TEXTURE_COORD_3 */
+/* GL_MAP1_TEXTURE_COORD_4 */
+/* GL_MAP1_VERTEX_3 */
+/* GL_MAP1_VERTEX_4 */
+/* GL_MAP2_COLOR_4 */
+/* GL_MAP2_INDEX */
+/* GL_MAP2_NORMAL */
+/* GL_MAP2_TEXTURE_COORD_1 */
+/* GL_MAP2_TEXTURE_COORD_2 */
+/* GL_MAP2_TEXTURE_COORD_3 */
+/* GL_MAP2_TEXTURE_COORD_4 */
+/* GL_MAP2_VERTEX_3 */
+/* GL_MAP2_VERTEX_4 */
+
+/* MaterialFace */
+/* GL_FRONT */
+/* GL_BACK */
+/* GL_FRONT_AND_BACK */
+
+/* MaterialParameter */
+#define GL_EMISSION 0x1600
+#define GL_SHININESS 0x1601
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_COLOR_INDEXES 0x1603
+/* GL_AMBIENT */
+/* GL_DIFFUSE */
+/* GL_SPECULAR */
+
+/* MatrixMode */
+#define GL_MODELVIEW 0x1700
+#define GL_PROJECTION 0x1701
+#define GL_TEXTURE 0x1702
+
+/* MeshMode1 */
+/* GL_POINT */
+/* GL_LINE */
+
+/* MeshMode2 */
+/* GL_POINT */
+/* GL_LINE */
+/* GL_FILL */
+
+/* NormalPointerType */
+/* GL_BYTE */
+/* GL_SHORT */
+/* GL_INT */
+/* GL_FLOAT */
+/* GL_DOUBLE */
+
+/* PixelCopyType */
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+
+/* PixelFormat */
+#define GL_COLOR_INDEX 0x1900
+#define GL_STENCIL_INDEX 0x1901
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_RED 0x1903
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+
+/* PixelMap */
+/* GL_PIXEL_MAP_I_TO_I */
+/* GL_PIXEL_MAP_S_TO_S */
+/* GL_PIXEL_MAP_I_TO_R */
+/* GL_PIXEL_MAP_I_TO_G */
+/* GL_PIXEL_MAP_I_TO_B */
+/* GL_PIXEL_MAP_I_TO_A */
+/* GL_PIXEL_MAP_R_TO_R */
+/* GL_PIXEL_MAP_G_TO_G */
+/* GL_PIXEL_MAP_B_TO_B */
+/* GL_PIXEL_MAP_A_TO_A */
+
+/* PixelStore */
+/* GL_UNPACK_SWAP_BYTES */
+/* GL_UNPACK_LSB_FIRST */
+/* GL_UNPACK_ROW_LENGTH */
+/* GL_UNPACK_SKIP_ROWS */
+/* GL_UNPACK_SKIP_PIXELS */
+/* GL_UNPACK_ALIGNMENT */
+/* GL_PACK_SWAP_BYTES */
+/* GL_PACK_LSB_FIRST */
+/* GL_PACK_ROW_LENGTH */
+/* GL_PACK_SKIP_ROWS */
+/* GL_PACK_SKIP_PIXELS */
+/* GL_PACK_ALIGNMENT */
+
+/* PixelTransfer */
+/* GL_MAP_COLOR */
+/* GL_MAP_STENCIL */
+/* GL_INDEX_SHIFT */
+/* GL_INDEX_OFFSET */
+/* GL_RED_SCALE */
+/* GL_RED_BIAS */
+/* GL_GREEN_SCALE */
+/* GL_GREEN_BIAS */
+/* GL_BLUE_SCALE */
+/* GL_BLUE_BIAS */
+/* GL_ALPHA_SCALE */
+/* GL_ALPHA_BIAS */
+/* GL_DEPTH_SCALE */
+/* GL_DEPTH_BIAS */
+
+/* PixelType */
+#define GL_BITMAP 0x1A00
+/* GL_BYTE */
+/* GL_UNSIGNED_BYTE */
+/* GL_SHORT */
+/* GL_UNSIGNED_SHORT */
+/* GL_INT */
+/* GL_UNSIGNED_INT */
+/* GL_FLOAT */
+
+/* PolygonMode */
+#define GL_POINT 0x1B00
+#define GL_LINE 0x1B01
+#define GL_FILL 0x1B02
+
+/* ReadBufferMode */
+/* GL_FRONT_LEFT */
+/* GL_FRONT_RIGHT */
+/* GL_BACK_LEFT */
+/* GL_BACK_RIGHT */
+/* GL_FRONT */
+/* GL_BACK */
+/* GL_LEFT */
+/* GL_RIGHT */
+/* GL_AUX0 */
+/* GL_AUX1 */
+/* GL_AUX2 */
+/* GL_AUX3 */
+
+/* RenderingMode */
+#define GL_RENDER 0x1C00
+#define GL_FEEDBACK 0x1C01
+#define GL_SELECT 0x1C02
+
+/* ShadingModel */
+#define GL_FLAT 0x1D00
+#define GL_SMOOTH 0x1D01
+
+
+/* StencilFunction */
+/* GL_NEVER */
+/* GL_LESS */
+/* GL_EQUAL */
+/* GL_LEQUAL */
+/* GL_GREATER */
+/* GL_NOTEQUAL */
+/* GL_GEQUAL */
+/* GL_ALWAYS */
+
+/* StencilOp */
+/* GL_ZERO */
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+/* GL_INVERT */
+
+/* StringName */
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+
+/* TextureCoordName */
+#define GL_S 0x2000
+#define GL_T 0x2001
+#define GL_R 0x2002
+#define GL_Q 0x2003
+
+/* TexCoordPointerType */
+/* GL_SHORT */
+/* GL_INT */
+/* GL_FLOAT */
+/* GL_DOUBLE */
+
+/* TextureEnvMode */
+#define GL_MODULATE 0x2100
+#define GL_DECAL 0x2101
+/* GL_BLEND */
+/* GL_REPLACE */
+
+/* TextureEnvParameter */
+#define GL_TEXTURE_ENV_MODE 0x2200
+#define GL_TEXTURE_ENV_COLOR 0x2201
+
+/* TextureEnvTarget */
+#define GL_TEXTURE_ENV 0x2300
+
+/* TextureGenMode */
+#define GL_EYE_LINEAR 0x2400
+#define GL_OBJECT_LINEAR 0x2401
+#define GL_SPHERE_MAP 0x2402
+
+/* TextureGenParameter */
+#define GL_TEXTURE_GEN_MODE 0x2500
+#define GL_OBJECT_PLANE 0x2501
+#define GL_EYE_PLANE 0x2502
+
+/* TextureMagFilter */
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+
+/* TextureMinFilter */
+/* GL_NEAREST */
+/* GL_LINEAR */
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+
+/* TextureParameterName */
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+/* GL_TEXTURE_BORDER_COLOR */
+/* GL_TEXTURE_PRIORITY */
+
+/* TextureTarget */
+/* GL_TEXTURE_1D */
+/* GL_TEXTURE_2D */
+/* GL_PROXY_TEXTURE_1D */
+/* GL_PROXY_TEXTURE_2D */
+
+/* TextureWrapMode */
+#define GL_CLAMP 0x2900
+#define GL_REPEAT 0x2901
+
+/* VertexPointerType */
+/* GL_SHORT */
+/* GL_INT */
+/* GL_FLOAT */
+/* GL_DOUBLE */
+
+/* ClientAttribMask */
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff
+
+/* polygon_offset */
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_POLYGON_OFFSET_FILL 0x8037
+
+/* texture */
+#define GL_ALPHA4 0x803B
+#define GL_ALPHA8 0x803C
+#define GL_ALPHA12 0x803D
+#define GL_ALPHA16 0x803E
+#define GL_LUMINANCE4 0x803F
+#define GL_LUMINANCE8 0x8040
+#define GL_LUMINANCE12 0x8041
+#define GL_LUMINANCE16 0x8042
+#define GL_LUMINANCE4_ALPHA4 0x8043
+#define GL_LUMINANCE6_ALPHA2 0x8044
+#define GL_LUMINANCE8_ALPHA8 0x8045
+#define GL_LUMINANCE12_ALPHA4 0x8046
+#define GL_LUMINANCE12_ALPHA12 0x8047
+#define GL_LUMINANCE16_ALPHA16 0x8048
+#define GL_INTENSITY 0x8049
+#define GL_INTENSITY4 0x804A
+#define GL_INTENSITY8 0x804B
+#define GL_INTENSITY12 0x804C
+#define GL_INTENSITY16 0x804D
+#define GL_R3_G3_B2 0x2A10
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB8 0x8051
+#define GL_RGB10 0x8052
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGBA2 0x8055
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
+#define GL_TEXTURE_INTENSITY_SIZE 0x8061
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_2D 0x8064
+
+/* texture_object */
+#define GL_TEXTURE_PRIORITY 0x8066
+#define GL_TEXTURE_RESIDENT 0x8067
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_2D 0x8069
+
+/* vertex_array */
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_NORMAL_ARRAY 0x8075
+#define GL_COLOR_ARRAY 0x8076
+#define GL_INDEX_ARRAY 0x8077
+#define GL_TEXTURE_COORD_ARRAY 0x8078
+#define GL_EDGE_FLAG_ARRAY 0x8079
+#define GL_VERTEX_ARRAY_SIZE 0x807A
+#define GL_VERTEX_ARRAY_TYPE 0x807B
+#define GL_VERTEX_ARRAY_STRIDE 0x807C
+#define GL_NORMAL_ARRAY_TYPE 0x807E
+#define GL_NORMAL_ARRAY_STRIDE 0x807F
+#define GL_COLOR_ARRAY_SIZE 0x8081
+#define GL_COLOR_ARRAY_TYPE 0x8082
+#define GL_COLOR_ARRAY_STRIDE 0x8083
+#define GL_INDEX_ARRAY_TYPE 0x8085
+#define GL_INDEX_ARRAY_STRIDE 0x8086
+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
+#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
+#define GL_VERTEX_ARRAY_POINTER 0x808E
+#define GL_NORMAL_ARRAY_POINTER 0x808F
+#define GL_COLOR_ARRAY_POINTER 0x8090
+#define GL_INDEX_ARRAY_POINTER 0x8091
+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
+#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_C3F_V3F 0x2A24
+#define GL_N3F_V3F 0x2A25
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_V4F 0x2A28
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+
+/* Extensions */
+#define GL_EXT_vertex_array 1
+#define GL_EXT_bgra 1
+#define GL_EXT_paletted_texture 1
+#define GL_WIN_swap_hint 1
+#define GL_WIN_draw_range_elements 1
+// #define GL_WIN_phong_shading 1
+// #define GL_WIN_specular_fog 1
+
+/* EXT_vertex_array */
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+#define GL_DOUBLE_EXT GL_DOUBLE
+
+/* EXT_bgra */
+#define GL_BGR_EXT 0x80E0
+#define GL_BGRA_EXT 0x80E1
+
+/* EXT_paletted_texture */
+
+/* These must match the GL_COLOR_TABLE_*_SGI enumerants */
+#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8
+#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF
+
+#define GL_COLOR_INDEX1_EXT 0x80E2
+#define GL_COLOR_INDEX2_EXT 0x80E3
+#define GL_COLOR_INDEX4_EXT 0x80E4
+#define GL_COLOR_INDEX8_EXT 0x80E5
+#define GL_COLOR_INDEX12_EXT 0x80E6
+#define GL_COLOR_INDEX16_EXT 0x80E7
+
+/* WIN_draw_range_elements */
+#define GL_MAX_ELEMENTS_VERTICES_WIN 0x80E8
+#define GL_MAX_ELEMENTS_INDICES_WIN 0x80E9
+
+/* WIN_phong_shading */
+#define GL_PHONG_WIN 0x80EA
+#define GL_PHONG_HINT_WIN 0x80EB
+
+/* WIN_specular_fog */
+#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC
+
+/* For compatibility with OpenGL v1.0 */
+#define GL_LOGIC_OP GL_INDEX_LOGIC_OP
+#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT
+
+/*************************************************************/
+
+WINGDIAPI void APIENTRY glAccum (GLenum op, GLfloat value);
+WINGDIAPI void APIENTRY glAlphaFunc (GLenum func, GLclampf ref);
+WINGDIAPI GLboolean APIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);
+WINGDIAPI void APIENTRY glArrayElement (GLint i);
+WINGDIAPI void APIENTRY glBegin (GLenum mode);
+WINGDIAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
+WINGDIAPI void APIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+WINGDIAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+WINGDIAPI void APIENTRY glCallList (GLuint list);
+WINGDIAPI void APIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists);
+WINGDIAPI void APIENTRY glClear (GLbitfield mask);
+WINGDIAPI void APIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+WINGDIAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+WINGDIAPI void APIENTRY glClearDepth (GLclampd depth);
+WINGDIAPI void APIENTRY glClearIndex (GLfloat c);
+WINGDIAPI void APIENTRY glClearStencil (GLint s);
+WINGDIAPI void APIENTRY glClipPlane (GLenum plane, const GLdouble *equation);
+WINGDIAPI void APIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);
+WINGDIAPI void APIENTRY glColor3bv (const GLbyte *v);
+WINGDIAPI void APIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);
+WINGDIAPI void APIENTRY glColor3dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);
+WINGDIAPI void APIENTRY glColor3fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glColor3i (GLint red, GLint green, GLint blue);
+WINGDIAPI void APIENTRY glColor3iv (const GLint *v);
+WINGDIAPI void APIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);
+WINGDIAPI void APIENTRY glColor3sv (const GLshort *v);
+WINGDIAPI void APIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);
+WINGDIAPI void APIENTRY glColor3ubv (const GLubyte *v);
+WINGDIAPI void APIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);
+WINGDIAPI void APIENTRY glColor3uiv (const GLuint *v);
+WINGDIAPI void APIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);
+WINGDIAPI void APIENTRY glColor3usv (const GLushort *v);
+WINGDIAPI void APIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+WINGDIAPI void APIENTRY glColor4bv (const GLbyte *v);
+WINGDIAPI void APIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+WINGDIAPI void APIENTRY glColor4dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+WINGDIAPI void APIENTRY glColor4fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);
+WINGDIAPI void APIENTRY glColor4iv (const GLint *v);
+WINGDIAPI void APIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);
+WINGDIAPI void APIENTRY glColor4sv (const GLshort *v);
+WINGDIAPI void APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+WINGDIAPI void APIENTRY glColor4ubv (const GLubyte *v);
+WINGDIAPI void APIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);
+WINGDIAPI void APIENTRY glColor4uiv (const GLuint *v);
+WINGDIAPI void APIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);
+WINGDIAPI void APIENTRY glColor4usv (const GLushort *v);
+WINGDIAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+WINGDIAPI void APIENTRY glColorMaterial (GLenum face, GLenum mode);
+WINGDIAPI void APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+WINGDIAPI void APIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+WINGDIAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);
+WINGDIAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+WINGDIAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+WINGDIAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+WINGDIAPI void APIENTRY glCullFace (GLenum mode);
+WINGDIAPI void APIENTRY glDeleteLists (GLuint list, GLsizei range);
+WINGDIAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+WINGDIAPI void APIENTRY glDepthFunc (GLenum func);
+WINGDIAPI void APIENTRY glDepthMask (GLboolean flag);
+WINGDIAPI void APIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);
+WINGDIAPI void APIENTRY glDisable (GLenum cap);
+WINGDIAPI void APIENTRY glDisableClientState (GLenum array);
+WINGDIAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+WINGDIAPI void APIENTRY glDrawBuffer (GLenum mode);
+WINGDIAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+WINGDIAPI void APIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+WINGDIAPI void APIENTRY glEdgeFlag (GLboolean flag);
+WINGDIAPI void APIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer);
+WINGDIAPI void APIENTRY glEdgeFlagv (const GLboolean *flag);
+WINGDIAPI void APIENTRY glEnable (GLenum cap);
+WINGDIAPI void APIENTRY glEnableClientState (GLenum array);
+WINGDIAPI void APIENTRY glEnd (void);
+WINGDIAPI void APIENTRY glEndList (void);
+WINGDIAPI void APIENTRY glEvalCoord1d (GLdouble u);
+WINGDIAPI void APIENTRY glEvalCoord1dv (const GLdouble *u);
+WINGDIAPI void APIENTRY glEvalCoord1f (GLfloat u);
+WINGDIAPI void APIENTRY glEvalCoord1fv (const GLfloat *u);
+WINGDIAPI void APIENTRY glEvalCoord2d (GLdouble u, GLdouble v);
+WINGDIAPI void APIENTRY glEvalCoord2dv (const GLdouble *u);
+WINGDIAPI void APIENTRY glEvalCoord2f (GLfloat u, GLfloat v);
+WINGDIAPI void APIENTRY glEvalCoord2fv (const GLfloat *u);
+WINGDIAPI void APIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);
+WINGDIAPI void APIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+WINGDIAPI void APIENTRY glEvalPoint1 (GLint i);
+WINGDIAPI void APIENTRY glEvalPoint2 (GLint i, GLint j);
+WINGDIAPI void APIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);
+WINGDIAPI void APIENTRY glFinish (void);
+WINGDIAPI void APIENTRY glFlush (void);
+WINGDIAPI void APIENTRY glFogf (GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glFogfv (GLenum pname, const GLfloat *params);
+WINGDIAPI void APIENTRY glFogi (GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glFogiv (GLenum pname, const GLint *params);
+WINGDIAPI void APIENTRY glFrontFace (GLenum mode);
+WINGDIAPI void APIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+WINGDIAPI GLuint APIENTRY glGenLists (GLsizei range);
+WINGDIAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+WINGDIAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params);
+WINGDIAPI void APIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);
+WINGDIAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params);
+WINGDIAPI GLenum APIENTRY glGetError (void);
+WINGDIAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params);
+WINGDIAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params);
+WINGDIAPI void APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);
+WINGDIAPI void APIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);
+WINGDIAPI void APIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);
+WINGDIAPI void APIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);
+WINGDIAPI void APIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);
+WINGDIAPI void APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);
+WINGDIAPI void APIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);
+WINGDIAPI void APIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);
+WINGDIAPI void APIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);
+WINGDIAPI void APIENTRY glGetPixelMapusv (GLenum map, GLushort *values);
+WINGDIAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params);
+WINGDIAPI void APIENTRY glGetPolygonStipple (GLubyte *mask);
+WINGDIAPI const GLubyte * APIENTRY glGetString (GLenum name);
+WINGDIAPI void APIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);
+WINGDIAPI void APIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);
+WINGDIAPI void APIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);
+WINGDIAPI void APIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);
+WINGDIAPI void APIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);
+WINGDIAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+WINGDIAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+WINGDIAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+WINGDIAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+WINGDIAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+WINGDIAPI void APIENTRY glHint (GLenum target, GLenum mode);
+WINGDIAPI void APIENTRY glIndexMask (GLuint mask);
+WINGDIAPI void APIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
+WINGDIAPI void APIENTRY glIndexd (GLdouble c);
+WINGDIAPI void APIENTRY glIndexdv (const GLdouble *c);
+WINGDIAPI void APIENTRY glIndexf (GLfloat c);
+WINGDIAPI void APIENTRY glIndexfv (const GLfloat *c);
+WINGDIAPI void APIENTRY glIndexi (GLint c);
+WINGDIAPI void APIENTRY glIndexiv (const GLint *c);
+WINGDIAPI void APIENTRY glIndexs (GLshort c);
+WINGDIAPI void APIENTRY glIndexsv (const GLshort *c);
+WINGDIAPI void APIENTRY glIndexub (GLubyte c);
+WINGDIAPI void APIENTRY glIndexubv (const GLubyte *c);
+WINGDIAPI void APIENTRY glInitNames (void);
+WINGDIAPI void APIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer);
+WINGDIAPI GLboolean APIENTRY glIsEnabled (GLenum cap);
+WINGDIAPI GLboolean APIENTRY glIsList (GLuint list);
+WINGDIAPI GLboolean APIENTRY glIsTexture (GLuint texture);
+WINGDIAPI void APIENTRY glLightModelf (GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glLightModelfv (GLenum pname, const GLfloat *params);
+WINGDIAPI void APIENTRY glLightModeli (GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glLightModeliv (GLenum pname, const GLint *params);
+WINGDIAPI void APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);
+WINGDIAPI void APIENTRY glLighti (GLenum light, GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);
+WINGDIAPI void APIENTRY glLineStipple (GLint factor, GLushort pattern);
+WINGDIAPI void APIENTRY glLineWidth (GLfloat width);
+WINGDIAPI void APIENTRY glListBase (GLuint base);
+WINGDIAPI void APIENTRY glLoadIdentity (void);
+WINGDIAPI void APIENTRY glLoadMatrixd (const GLdouble *m);
+WINGDIAPI void APIENTRY glLoadMatrixf (const GLfloat *m);
+WINGDIAPI void APIENTRY glLoadName (GLuint name);
+WINGDIAPI void APIENTRY glLogicOp (GLenum opcode);
+WINGDIAPI void APIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+WINGDIAPI void APIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+WINGDIAPI void APIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+WINGDIAPI void APIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+WINGDIAPI void APIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);
+WINGDIAPI void APIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);
+WINGDIAPI void APIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+WINGDIAPI void APIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+WINGDIAPI void APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
+WINGDIAPI void APIENTRY glMateriali (GLenum face, GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);
+WINGDIAPI void APIENTRY glMatrixMode (GLenum mode);
+WINGDIAPI void APIENTRY glMultMatrixd (const GLdouble *m);
+WINGDIAPI void APIENTRY glMultMatrixf (const GLfloat *m);
+WINGDIAPI void APIENTRY glNewList (GLuint list, GLenum mode);
+WINGDIAPI void APIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);
+WINGDIAPI void APIENTRY glNormal3bv (const GLbyte *v);
+WINGDIAPI void APIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);
+WINGDIAPI void APIENTRY glNormal3dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
+WINGDIAPI void APIENTRY glNormal3fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);
+WINGDIAPI void APIENTRY glNormal3iv (const GLint *v);
+WINGDIAPI void APIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);
+WINGDIAPI void APIENTRY glNormal3sv (const GLshort *v);
+WINGDIAPI void APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
+WINGDIAPI void APIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+WINGDIAPI void APIENTRY glPassThrough (GLfloat token);
+WINGDIAPI void APIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);
+WINGDIAPI void APIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);
+WINGDIAPI void APIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);
+WINGDIAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glPixelStorei (GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glPixelTransferf (GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glPixelTransferi (GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);
+WINGDIAPI void APIENTRY glPointSize (GLfloat size);
+WINGDIAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode);
+WINGDIAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+WINGDIAPI void APIENTRY glPolygonStipple (const GLubyte *mask);
+WINGDIAPI void APIENTRY glPopAttrib (void);
+WINGDIAPI void APIENTRY glPopClientAttrib (void);
+WINGDIAPI void APIENTRY glPopMatrix (void);
+WINGDIAPI void APIENTRY glPopName (void);
+WINGDIAPI void APIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);
+WINGDIAPI void APIENTRY glPushAttrib (GLbitfield mask);
+WINGDIAPI void APIENTRY glPushClientAttrib (GLbitfield mask);
+WINGDIAPI void APIENTRY glPushMatrix (void);
+WINGDIAPI void APIENTRY glPushName (GLuint name);
+WINGDIAPI void APIENTRY glRasterPos2d (GLdouble x, GLdouble y);
+WINGDIAPI void APIENTRY glRasterPos2dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glRasterPos2f (GLfloat x, GLfloat y);
+WINGDIAPI void APIENTRY glRasterPos2fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glRasterPos2i (GLint x, GLint y);
+WINGDIAPI void APIENTRY glRasterPos2iv (const GLint *v);
+WINGDIAPI void APIENTRY glRasterPos2s (GLshort x, GLshort y);
+WINGDIAPI void APIENTRY glRasterPos2sv (const GLshort *v);
+WINGDIAPI void APIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);
+WINGDIAPI void APIENTRY glRasterPos3dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);
+WINGDIAPI void APIENTRY glRasterPos3fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glRasterPos3i (GLint x, GLint y, GLint z);
+WINGDIAPI void APIENTRY glRasterPos3iv (const GLint *v);
+WINGDIAPI void APIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);
+WINGDIAPI void APIENTRY glRasterPos3sv (const GLshort *v);
+WINGDIAPI void APIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+WINGDIAPI void APIENTRY glRasterPos4dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+WINGDIAPI void APIENTRY glRasterPos4fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);
+WINGDIAPI void APIENTRY glRasterPos4iv (const GLint *v);
+WINGDIAPI void APIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);
+WINGDIAPI void APIENTRY glRasterPos4sv (const GLshort *v);
+WINGDIAPI void APIENTRY glReadBuffer (GLenum mode);
+WINGDIAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+WINGDIAPI void APIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+WINGDIAPI void APIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);
+WINGDIAPI void APIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+WINGDIAPI void APIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);
+WINGDIAPI void APIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);
+WINGDIAPI void APIENTRY glRectiv (const GLint *v1, const GLint *v2);
+WINGDIAPI void APIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+WINGDIAPI void APIENTRY glRectsv (const GLshort *v1, const GLshort *v2);
+WINGDIAPI GLint APIENTRY glRenderMode (GLenum mode);
+WINGDIAPI void APIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+WINGDIAPI void APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+WINGDIAPI void APIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);
+WINGDIAPI void APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);
+WINGDIAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+WINGDIAPI void APIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);
+WINGDIAPI void APIENTRY glShadeModel (GLenum mode);
+WINGDIAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+WINGDIAPI void APIENTRY glStencilMask (GLuint mask);
+WINGDIAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+WINGDIAPI void APIENTRY glTexCoord1d (GLdouble s);
+WINGDIAPI void APIENTRY glTexCoord1dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glTexCoord1f (GLfloat s);
+WINGDIAPI void APIENTRY glTexCoord1fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glTexCoord1i (GLint s);
+WINGDIAPI void APIENTRY glTexCoord1iv (const GLint *v);
+WINGDIAPI void APIENTRY glTexCoord1s (GLshort s);
+WINGDIAPI void APIENTRY glTexCoord1sv (const GLshort *v);
+WINGDIAPI void APIENTRY glTexCoord2d (GLdouble s, GLdouble t);
+WINGDIAPI void APIENTRY glTexCoord2dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glTexCoord2f (GLfloat s, GLfloat t);
+WINGDIAPI void APIENTRY glTexCoord2fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glTexCoord2i (GLint s, GLint t);
+WINGDIAPI void APIENTRY glTexCoord2iv (const GLint *v);
+WINGDIAPI void APIENTRY glTexCoord2s (GLshort s, GLshort t);
+WINGDIAPI void APIENTRY glTexCoord2sv (const GLshort *v);
+WINGDIAPI void APIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);
+WINGDIAPI void APIENTRY glTexCoord3dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);
+WINGDIAPI void APIENTRY glTexCoord3fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glTexCoord3i (GLint s, GLint t, GLint r);
+WINGDIAPI void APIENTRY glTexCoord3iv (const GLint *v);
+WINGDIAPI void APIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);
+WINGDIAPI void APIENTRY glTexCoord3sv (const GLshort *v);
+WINGDIAPI void APIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+WINGDIAPI void APIENTRY glTexCoord4dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+WINGDIAPI void APIENTRY glTexCoord4fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);
+WINGDIAPI void APIENTRY glTexCoord4iv (const GLint *v);
+WINGDIAPI void APIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);
+WINGDIAPI void APIENTRY glTexCoord4sv (const GLshort *v);
+WINGDIAPI void APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+WINGDIAPI void APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);
+WINGDIAPI void APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);
+WINGDIAPI void APIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);
+WINGDIAPI void APIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);
+WINGDIAPI void APIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);
+WINGDIAPI void APIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);
+WINGDIAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+WINGDIAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+WINGDIAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+WINGDIAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+WINGDIAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+WINGDIAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+WINGDIAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+WINGDIAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+WINGDIAPI void APIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);
+WINGDIAPI void APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);
+WINGDIAPI void APIENTRY glVertex2d (GLdouble x, GLdouble y);
+WINGDIAPI void APIENTRY glVertex2dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glVertex2f (GLfloat x, GLfloat y);
+WINGDIAPI void APIENTRY glVertex2fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glVertex2i (GLint x, GLint y);
+WINGDIAPI void APIENTRY glVertex2iv (const GLint *v);
+WINGDIAPI void APIENTRY glVertex2s (GLshort x, GLshort y);
+WINGDIAPI void APIENTRY glVertex2sv (const GLshort *v);
+WINGDIAPI void APIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);
+WINGDIAPI void APIENTRY glVertex3dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);
+WINGDIAPI void APIENTRY glVertex3fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glVertex3i (GLint x, GLint y, GLint z);
+WINGDIAPI void APIENTRY glVertex3iv (const GLint *v);
+WINGDIAPI void APIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);
+WINGDIAPI void APIENTRY glVertex3sv (const GLshort *v);
+WINGDIAPI void APIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+WINGDIAPI void APIENTRY glVertex4dv (const GLdouble *v);
+WINGDIAPI void APIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+WINGDIAPI void APIENTRY glVertex4fv (const GLfloat *v);
+WINGDIAPI void APIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);
+WINGDIAPI void APIENTRY glVertex4iv (const GLint *v);
+WINGDIAPI void APIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);
+WINGDIAPI void APIENTRY glVertex4sv (const GLshort *v);
+WINGDIAPI void APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+WINGDIAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+
+/* EXT_vertex_array */
+typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);
+typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
+typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
+typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
+typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
+typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
+typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer);
+typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params);
+typedef void (APIENTRY * PFNGLARRAYELEMENTARRAYEXTPROC)(GLenum mode, GLsizei count, const GLvoid* pi);
+
+/* WIN_draw_range_elements */
+typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSWINPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+
+/* WIN_swap_hint */
+typedef void (APIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+
+/* EXT_paletted_texture */
+typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC)
+ (GLenum target, GLenum internalFormat, GLsizei width, GLenum format,
+ GLenum type, const GLvoid *data);
+typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC)
+ (GLenum target, GLsizei start, GLsizei count, GLenum format,
+ GLenum type, const GLvoid *data);
+typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC)
+ (GLenum target, GLenum format, GLenum type, GLvoid *data);
+typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)
+ (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)
+ (GLenum target, GLenum pname, GLfloat *params);
+
+#ifdef __cplusplus
+}
+#endif
+
+#if !defined (_WIN32)
+#undef WINGDIAPI
+#undef APIENTRY
+#endif
+
+#endif /* __GL_H__ */
+#endif /* __gl_h_ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glcorearb.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glcorearb.h
new file mode 100644
index 0000000..07cb03e
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glcorearb.h
@@ -0,0 +1,4533 @@
+#ifndef __glcorearb_h_
+#define __glcorearb_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2007-2012 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* glcorearb.h replaces gl3.h. It is for use with OpenGL core
+ * profile implementations.
+ *
+ * glcorearb.h last updated on $Date: 2012-09-19 19:02:24 -0700 (Wed, 19 Sep 2012) $
+ *
+ * RELEASE NOTES - 2012/09/19
+ *
+ * glcorearb.h should be placed in the same directory as gl.h and
+ * included as
+ * '<GL/glcorearb.h>'.
+ *
+ * glcorearb.h includes only APIs in the latest OpenGL core profile
+ * implementation together with APIs in newer ARB extensions which can be
+ * can be supported by the core profile. It does not, and never will
+ * include functionality removed from the core profile, such as
+ * fixed-function vertex and fragment processing.
+ *
+ * It is not possible to #include both <GL/glcorearb.h> and either of
+ * <GL/gl.h> or <GL/glext.h> in the same source file.
+ *
+ * Feedback can be given by registering for the Khronos Bugzilla
+ * (www.khronos.org/bugzilla) and filing issues there under product
+ * "OpenGL", category "Registry".
+ */
+
+/* Function declaration macros - to move into glplatform.h */
+
+#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+#endif
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+#ifndef GLAPI
+#define GLAPI extern
+#endif
+
+/* Base GL types */
+
+typedef unsigned int GLenum;
+typedef unsigned char GLboolean;
+typedef unsigned int GLbitfield;
+typedef signed char GLbyte;
+typedef short GLshort;
+typedef int GLint;
+typedef int GLsizei;
+typedef unsigned char GLubyte;
+typedef unsigned short GLushort;
+typedef unsigned int GLuint;
+typedef unsigned short GLhalf;
+typedef float GLfloat;
+typedef float GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void GLvoid;
+
+/*************************************************************/
+
+#ifndef GL_VERSION_1_1
+/* AttribMask */
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_COLOR_BUFFER_BIT 0x00004000
+/* Boolean */
+#define GL_FALSE 0
+#define GL_TRUE 1
+/* BeginMode */
+#define GL_POINTS 0x0000
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_LINE_STRIP 0x0003
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_QUADS 0x0007
+/* AlphaFunction */
+#define GL_NEVER 0x0200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+/* BlendingFactorDest */
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+/* BlendingFactorSrc */
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+/* DrawBufferMode */
+#define GL_NONE 0
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_LEFT 0x0406
+#define GL_RIGHT 0x0407
+#define GL_FRONT_AND_BACK 0x0408
+/* ErrorCode */
+#define GL_NO_ERROR 0
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_OUT_OF_MEMORY 0x0505
+/* FrontFaceDirection */
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+/* GetPName */
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_VIEWPORT 0x0BA2
+#define GL_DITHER 0x0BD0
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND 0x0BE2
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_READ_BUFFER 0x0C02
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_STEREO 0x0C33
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_2D 0x8069
+/* GetTextureParameter */
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+/* HintMode */
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+/* DataType */
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_DOUBLE 0x140A
+/* ErrorCode */
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+/* LogicOp */
+#define GL_CLEAR 0x1500
+#define GL_AND 0x1501
+#define GL_AND_REVERSE 0x1502
+#define GL_COPY 0x1503
+#define GL_AND_INVERTED 0x1504
+#define GL_NOOP 0x1505
+#define GL_XOR 0x1506
+#define GL_OR 0x1507
+#define GL_NOR 0x1508
+#define GL_EQUIV 0x1509
+#define GL_INVERT 0x150A
+#define GL_OR_REVERSE 0x150B
+#define GL_COPY_INVERTED 0x150C
+#define GL_OR_INVERTED 0x150D
+#define GL_NAND 0x150E
+#define GL_SET 0x150F
+/* MatrixMode (for gl3.h, FBO attachment type) */
+#define GL_TEXTURE 0x1702
+/* PixelCopyType */
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+/* PixelFormat */
+#define GL_STENCIL_INDEX 0x1901
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_RED 0x1903
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+/* PolygonMode */
+#define GL_POINT 0x1B00
+#define GL_LINE 0x1B01
+#define GL_FILL 0x1B02
+/* StencilOp */
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+/* StringName */
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+/* TextureMagFilter */
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+/* TextureMinFilter */
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+/* TextureParameterName */
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+/* TextureTarget */
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_2D 0x8064
+/* TextureWrapMode */
+#define GL_REPEAT 0x2901
+/* PixelInternalFormat */
+#define GL_R3_G3_B2 0x2A10
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB8 0x8051
+#define GL_RGB10 0x8052
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGBA2 0x8055
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#endif
+
+#ifndef GL_VERSION_1_2
+#define GL_UNSIGNED_BYTE_3_3_2 0x8032
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_INT_8_8_8_8 0x8035
+#define GL_UNSIGNED_INT_10_10_10_2 0x8036
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_PACK_SKIP_IMAGES 0x806B
+#define GL_PACK_IMAGE_HEIGHT 0x806C
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_PROXY_TEXTURE_3D 0x8070
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
+#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_BGR 0x80E0
+#define GL_BGRA 0x80E1
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#endif
+
+#ifndef GL_ARB_imaging
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_FUNC_ADD 0x8006
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_BLEND_EQUATION 0x8009
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#endif
+
+#ifndef GL_VERSION_1_3
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_MULTISAMPLE 0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_COMPRESSED_RGB 0x84ED
+#define GL_COMPRESSED_RGBA 0x84EE
+#define GL_TEXTURE_COMPRESSION_HINT 0x84EF
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_CLAMP_TO_BORDER 0x812D
+#endif
+
+#ifndef GL_VERSION_1_4
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_DEPTH_COMPONENT32 0x81A7
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_LOD_BIAS 0x8501
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#endif
+
+#ifndef GL_VERSION_1_5
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_QUERY_COUNTER_BITS 0x8864
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#define GL_BUFFER_ACCESS 0x88BB
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_SAMPLES_PASSED 0x8914
+#define GL_SRC1_ALPHA 0x8589
+#endif
+
+#ifndef GL_VERSION_2_0
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_MAX_VARYING_FLOATS 0x8B4B
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_1D 0x8B5D
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_SAMPLER_1D_SHADOW 0x8B61
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_DELETE_STATUS 0x8B80
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0
+#define GL_LOWER_LEFT 0x8CA1
+#define GL_UPPER_LEFT 0x8CA2
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#endif
+
+#ifndef GL_VERSION_2_1
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB_ALPHA 0x8C42
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPRESSED_SRGB 0x8C48
+#define GL_COMPRESSED_SRGB_ALPHA 0x8C49
+#endif
+
+#ifndef GL_VERSION_3_0
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_CLIP_DISTANCE0 0x3000
+#define GL_CLIP_DISTANCE1 0x3001
+#define GL_CLIP_DISTANCE2 0x3002
+#define GL_CLIP_DISTANCE3 0x3003
+#define GL_CLIP_DISTANCE4 0x3004
+#define GL_CLIP_DISTANCE5 0x3005
+#define GL_CLIP_DISTANCE6 0x3006
+#define GL_CLIP_DISTANCE7 0x3007
+#define GL_MAX_CLIP_DISTANCES 0x0D32
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_CONTEXT_FLAGS 0x821E
+#define GL_COMPRESSED_RED 0x8225
+#define GL_COMPRESSED_RG 0x8226
+#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_CLAMP_READ_COLOR 0x891C
+#define GL_FIXED_ONLY 0x891D
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_1D_ARRAY 0x8C18
+#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B
+#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TEXTURE_SHARED_SIZE 0x8C3F
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_PRIMITIVES_GENERATED 0x8C87
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_GREEN_INTEGER 0x8D95
+#define GL_BLUE_INTEGER 0x8D96
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_BGR_INTEGER 0x8D9A
+#define GL_BGRA_INTEGER 0x8D9B
+#define GL_SAMPLER_1D_ARRAY 0x8DC0
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_1D 0x8DC9
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_QUERY_WAIT 0x8E13
+#define GL_QUERY_NO_WAIT 0x8E14
+#define GL_QUERY_BY_REGION_WAIT 0x8E15
+#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+/* Reuse tokens from ARB_depth_buffer_float */
+/* reuse GL_DEPTH_COMPONENT32F */
+/* reuse GL_DEPTH32F_STENCIL8 */
+/* reuse GL_FLOAT_32_UNSIGNED_INT_24_8_REV */
+/* Reuse tokens from ARB_framebuffer_object */
+/* reuse GL_INVALID_FRAMEBUFFER_OPERATION */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
+/* reuse GL_FRAMEBUFFER_DEFAULT */
+/* reuse GL_FRAMEBUFFER_UNDEFINED */
+/* reuse GL_DEPTH_STENCIL_ATTACHMENT */
+/* reuse GL_INDEX */
+/* reuse GL_MAX_RENDERBUFFER_SIZE */
+/* reuse GL_DEPTH_STENCIL */
+/* reuse GL_UNSIGNED_INT_24_8 */
+/* reuse GL_DEPTH24_STENCIL8 */
+/* reuse GL_TEXTURE_STENCIL_SIZE */
+/* reuse GL_TEXTURE_RED_TYPE */
+/* reuse GL_TEXTURE_GREEN_TYPE */
+/* reuse GL_TEXTURE_BLUE_TYPE */
+/* reuse GL_TEXTURE_ALPHA_TYPE */
+/* reuse GL_TEXTURE_DEPTH_TYPE */
+/* reuse GL_UNSIGNED_NORMALIZED */
+/* reuse GL_FRAMEBUFFER_BINDING */
+/* reuse GL_DRAW_FRAMEBUFFER_BINDING */
+/* reuse GL_RENDERBUFFER_BINDING */
+/* reuse GL_READ_FRAMEBUFFER */
+/* reuse GL_DRAW_FRAMEBUFFER */
+/* reuse GL_READ_FRAMEBUFFER_BINDING */
+/* reuse GL_RENDERBUFFER_SAMPLES */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
+/* reuse GL_FRAMEBUFFER_COMPLETE */
+/* reuse GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
+/* reuse GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
+/* reuse GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */
+/* reuse GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */
+/* reuse GL_FRAMEBUFFER_UNSUPPORTED */
+/* reuse GL_MAX_COLOR_ATTACHMENTS */
+/* reuse GL_COLOR_ATTACHMENT0 */
+/* reuse GL_COLOR_ATTACHMENT1 */
+/* reuse GL_COLOR_ATTACHMENT2 */
+/* reuse GL_COLOR_ATTACHMENT3 */
+/* reuse GL_COLOR_ATTACHMENT4 */
+/* reuse GL_COLOR_ATTACHMENT5 */
+/* reuse GL_COLOR_ATTACHMENT6 */
+/* reuse GL_COLOR_ATTACHMENT7 */
+/* reuse GL_COLOR_ATTACHMENT8 */
+/* reuse GL_COLOR_ATTACHMENT9 */
+/* reuse GL_COLOR_ATTACHMENT10 */
+/* reuse GL_COLOR_ATTACHMENT11 */
+/* reuse GL_COLOR_ATTACHMENT12 */
+/* reuse GL_COLOR_ATTACHMENT13 */
+/* reuse GL_COLOR_ATTACHMENT14 */
+/* reuse GL_COLOR_ATTACHMENT15 */
+/* reuse GL_DEPTH_ATTACHMENT */
+/* reuse GL_STENCIL_ATTACHMENT */
+/* reuse GL_FRAMEBUFFER */
+/* reuse GL_RENDERBUFFER */
+/* reuse GL_RENDERBUFFER_WIDTH */
+/* reuse GL_RENDERBUFFER_HEIGHT */
+/* reuse GL_RENDERBUFFER_INTERNAL_FORMAT */
+/* reuse GL_STENCIL_INDEX1 */
+/* reuse GL_STENCIL_INDEX4 */
+/* reuse GL_STENCIL_INDEX8 */
+/* reuse GL_STENCIL_INDEX16 */
+/* reuse GL_RENDERBUFFER_RED_SIZE */
+/* reuse GL_RENDERBUFFER_GREEN_SIZE */
+/* reuse GL_RENDERBUFFER_BLUE_SIZE */
+/* reuse GL_RENDERBUFFER_ALPHA_SIZE */
+/* reuse GL_RENDERBUFFER_DEPTH_SIZE */
+/* reuse GL_RENDERBUFFER_STENCIL_SIZE */
+/* reuse GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
+/* reuse GL_MAX_SAMPLES */
+/* Reuse tokens from ARB_framebuffer_sRGB */
+/* reuse GL_FRAMEBUFFER_SRGB */
+/* Reuse tokens from ARB_half_float_vertex */
+/* reuse GL_HALF_FLOAT */
+/* Reuse tokens from ARB_map_buffer_range */
+/* reuse GL_MAP_READ_BIT */
+/* reuse GL_MAP_WRITE_BIT */
+/* reuse GL_MAP_INVALIDATE_RANGE_BIT */
+/* reuse GL_MAP_INVALIDATE_BUFFER_BIT */
+/* reuse GL_MAP_FLUSH_EXPLICIT_BIT */
+/* reuse GL_MAP_UNSYNCHRONIZED_BIT */
+/* Reuse tokens from ARB_texture_compression_rgtc */
+/* reuse GL_COMPRESSED_RED_RGTC1 */
+/* reuse GL_COMPRESSED_SIGNED_RED_RGTC1 */
+/* reuse GL_COMPRESSED_RG_RGTC2 */
+/* reuse GL_COMPRESSED_SIGNED_RG_RGTC2 */
+/* Reuse tokens from ARB_texture_rg */
+/* reuse GL_RG */
+/* reuse GL_RG_INTEGER */
+/* reuse GL_R8 */
+/* reuse GL_R16 */
+/* reuse GL_RG8 */
+/* reuse GL_RG16 */
+/* reuse GL_R16F */
+/* reuse GL_R32F */
+/* reuse GL_RG16F */
+/* reuse GL_RG32F */
+/* reuse GL_R8I */
+/* reuse GL_R8UI */
+/* reuse GL_R16I */
+/* reuse GL_R16UI */
+/* reuse GL_R32I */
+/* reuse GL_R32UI */
+/* reuse GL_RG8I */
+/* reuse GL_RG8UI */
+/* reuse GL_RG16I */
+/* reuse GL_RG16UI */
+/* reuse GL_RG32I */
+/* reuse GL_RG32UI */
+/* Reuse tokens from ARB_vertex_array_object */
+/* reuse GL_VERTEX_ARRAY_BINDING */
+#endif
+
+#ifndef GL_VERSION_3_1
+#define GL_SAMPLER_2D_RECT 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64
+#define GL_SAMPLER_BUFFER 0x8DC2
+#define GL_INT_SAMPLER_2D_RECT 0x8DCD
+#define GL_INT_SAMPLER_BUFFER 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8
+#define GL_TEXTURE_BUFFER 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8
+#define GL_RED_SNORM 0x8F90
+#define GL_RG_SNORM 0x8F91
+#define GL_RGB_SNORM 0x8F92
+#define GL_RGBA_SNORM 0x8F93
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_R16_SNORM 0x8F98
+#define GL_RG16_SNORM 0x8F99
+#define GL_RGB16_SNORM 0x8F9A
+#define GL_RGBA16_SNORM 0x8F9B
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART 0x8F9D
+#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E
+/* Reuse tokens from ARB_copy_buffer */
+/* reuse GL_COPY_READ_BUFFER */
+/* reuse GL_COPY_WRITE_BUFFER */
+/* Reuse tokens from ARB_draw_instanced (none) */
+/* Reuse tokens from ARB_uniform_buffer_object */
+/* reuse GL_UNIFORM_BUFFER */
+/* reuse GL_UNIFORM_BUFFER_BINDING */
+/* reuse GL_UNIFORM_BUFFER_START */
+/* reuse GL_UNIFORM_BUFFER_SIZE */
+/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */
+/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */
+/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */
+/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */
+/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */
+/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */
+/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */
+/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */
+/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */
+/* reuse GL_ACTIVE_UNIFORM_BLOCKS */
+/* reuse GL_UNIFORM_TYPE */
+/* reuse GL_UNIFORM_SIZE */
+/* reuse GL_UNIFORM_NAME_LENGTH */
+/* reuse GL_UNIFORM_BLOCK_INDEX */
+/* reuse GL_UNIFORM_OFFSET */
+/* reuse GL_UNIFORM_ARRAY_STRIDE */
+/* reuse GL_UNIFORM_MATRIX_STRIDE */
+/* reuse GL_UNIFORM_IS_ROW_MAJOR */
+/* reuse GL_UNIFORM_BLOCK_BINDING */
+/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */
+/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */
+/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */
+/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */
+/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */
+/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */
+/* reuse GL_INVALID_INDEX */
+#endif
+
+#ifndef GL_VERSION_3_2
+#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define GL_LINES_ADJACENCY 0x000A
+#define GL_LINE_STRIP_ADJACENCY 0x000B
+#define GL_TRIANGLES_ADJACENCY 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D
+#define GL_PROGRAM_POINT_SIZE 0x8642
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_GEOMETRY_SHADER 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT 0x8916
+#define GL_GEOMETRY_INPUT_TYPE 0x8917
+#define GL_GEOMETRY_OUTPUT_TYPE 0x8918
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_CONTEXT_PROFILE_MASK 0x9126
+/* reuse GL_MAX_VARYING_COMPONENTS */
+/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
+/* Reuse tokens from ARB_depth_clamp */
+/* reuse GL_DEPTH_CLAMP */
+/* Reuse tokens from ARB_draw_elements_base_vertex (none) */
+/* Reuse tokens from ARB_fragment_coord_conventions (none) */
+/* Reuse tokens from ARB_provoking_vertex */
+/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */
+/* reuse GL_FIRST_VERTEX_CONVENTION */
+/* reuse GL_LAST_VERTEX_CONVENTION */
+/* reuse GL_PROVOKING_VERTEX */
+/* Reuse tokens from ARB_seamless_cube_map */
+/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */
+/* Reuse tokens from ARB_sync */
+/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */
+/* reuse GL_OBJECT_TYPE */
+/* reuse GL_SYNC_CONDITION */
+/* reuse GL_SYNC_STATUS */
+/* reuse GL_SYNC_FLAGS */
+/* reuse GL_SYNC_FENCE */
+/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */
+/* reuse GL_UNSIGNALED */
+/* reuse GL_SIGNALED */
+/* reuse GL_ALREADY_SIGNALED */
+/* reuse GL_TIMEOUT_EXPIRED */
+/* reuse GL_CONDITION_SATISFIED */
+/* reuse GL_WAIT_FAILED */
+/* reuse GL_TIMEOUT_IGNORED */
+/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */
+/* reuse GL_TIMEOUT_IGNORED */
+/* Reuse tokens from ARB_texture_multisample */
+/* reuse GL_SAMPLE_POSITION */
+/* reuse GL_SAMPLE_MASK */
+/* reuse GL_SAMPLE_MASK_VALUE */
+/* reuse GL_MAX_SAMPLE_MASK_WORDS */
+/* reuse GL_TEXTURE_2D_MULTISAMPLE */
+/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */
+/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */
+/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_TEXTURE_SAMPLES */
+/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */
+/* reuse GL_SAMPLER_2D_MULTISAMPLE */
+/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */
+/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */
+/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */
+/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */
+/* reuse GL_MAX_INTEGER_SAMPLES */
+/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */
+#endif
+
+#ifndef GL_VERSION_3_3
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+/* Reuse tokens from ARB_blend_func_extended */
+/* reuse GL_SRC1_COLOR */
+/* reuse GL_ONE_MINUS_SRC1_COLOR */
+/* reuse GL_ONE_MINUS_SRC1_ALPHA */
+/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */
+/* Reuse tokens from ARB_explicit_attrib_location (none) */
+/* Reuse tokens from ARB_occlusion_query2 */
+/* reuse GL_ANY_SAMPLES_PASSED */
+/* Reuse tokens from ARB_sampler_objects */
+/* reuse GL_SAMPLER_BINDING */
+/* Reuse tokens from ARB_shader_bit_encoding (none) */
+/* Reuse tokens from ARB_texture_rgb10_a2ui */
+/* reuse GL_RGB10_A2UI */
+/* Reuse tokens from ARB_texture_swizzle */
+/* reuse GL_TEXTURE_SWIZZLE_R */
+/* reuse GL_TEXTURE_SWIZZLE_G */
+/* reuse GL_TEXTURE_SWIZZLE_B */
+/* reuse GL_TEXTURE_SWIZZLE_A */
+/* reuse GL_TEXTURE_SWIZZLE_RGBA */
+/* Reuse tokens from ARB_timer_query */
+/* reuse GL_TIME_ELAPSED */
+/* reuse GL_TIMESTAMP */
+/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */
+/* reuse GL_INT_2_10_10_10_REV */
+#endif
+
+#ifndef GL_VERSION_4_0
+#define GL_SAMPLE_SHADING 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+/* Reuse tokens from ARB_texture_query_lod (none) */
+/* Reuse tokens from ARB_draw_buffers_blend (none) */
+/* Reuse tokens from ARB_draw_indirect */
+/* reuse GL_DRAW_INDIRECT_BUFFER */
+/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */
+/* Reuse tokens from ARB_gpu_shader5 */
+/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */
+/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */
+/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */
+/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */
+/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */
+/* reuse GL_MAX_VERTEX_STREAMS */
+/* Reuse tokens from ARB_gpu_shader_fp64 */
+/* reuse GL_DOUBLE_VEC2 */
+/* reuse GL_DOUBLE_VEC3 */
+/* reuse GL_DOUBLE_VEC4 */
+/* reuse GL_DOUBLE_MAT2 */
+/* reuse GL_DOUBLE_MAT3 */
+/* reuse GL_DOUBLE_MAT4 */
+/* reuse GL_DOUBLE_MAT2x3 */
+/* reuse GL_DOUBLE_MAT2x4 */
+/* reuse GL_DOUBLE_MAT3x2 */
+/* reuse GL_DOUBLE_MAT3x4 */
+/* reuse GL_DOUBLE_MAT4x2 */
+/* reuse GL_DOUBLE_MAT4x3 */
+/* Reuse tokens from ARB_shader_subroutine */
+/* reuse GL_ACTIVE_SUBROUTINES */
+/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */
+/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */
+/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */
+/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */
+/* reuse GL_MAX_SUBROUTINES */
+/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */
+/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */
+/* reuse GL_COMPATIBLE_SUBROUTINES */
+/* Reuse tokens from ARB_tessellation_shader */
+/* reuse GL_PATCHES */
+/* reuse GL_PATCH_VERTICES */
+/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */
+/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */
+/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */
+/* reuse GL_TESS_GEN_MODE */
+/* reuse GL_TESS_GEN_SPACING */
+/* reuse GL_TESS_GEN_VERTEX_ORDER */
+/* reuse GL_TESS_GEN_POINT_MODE */
+/* reuse GL_ISOLINES */
+/* reuse GL_FRACTIONAL_ODD */
+/* reuse GL_FRACTIONAL_EVEN */
+/* reuse GL_MAX_PATCH_VERTICES */
+/* reuse GL_MAX_TESS_GEN_LEVEL */
+/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */
+/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */
+/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */
+/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */
+/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */
+/* reuse GL_MAX_TESS_PATCH_COMPONENTS */
+/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */
+/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */
+/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */
+/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */
+/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */
+/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */
+/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */
+/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */
+/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */
+/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */
+/* reuse GL_TESS_EVALUATION_SHADER */
+/* reuse GL_TESS_CONTROL_SHADER */
+/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */
+/* Reuse tokens from ARB_transform_feedback2 */
+/* reuse GL_TRANSFORM_FEEDBACK */
+/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */
+/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */
+/* reuse GL_TRANSFORM_FEEDBACK_BINDING */
+/* Reuse tokens from ARB_transform_feedback3 */
+/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */
+/* reuse GL_MAX_VERTEX_STREAMS */
+#endif
+
+#ifndef GL_VERSION_4_1
+/* Reuse tokens from ARB_ES2_compatibility */
+/* reuse GL_FIXED */
+/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */
+/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */
+/* reuse GL_LOW_FLOAT */
+/* reuse GL_MEDIUM_FLOAT */
+/* reuse GL_HIGH_FLOAT */
+/* reuse GL_LOW_INT */
+/* reuse GL_MEDIUM_INT */
+/* reuse GL_HIGH_INT */
+/* reuse GL_SHADER_COMPILER */
+/* reuse GL_SHADER_BINARY_FORMATS */
+/* reuse GL_NUM_SHADER_BINARY_FORMATS */
+/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */
+/* reuse GL_MAX_VARYING_VECTORS */
+/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */
+/* reuse GL_RGB565 */
+/* Reuse tokens from ARB_get_program_binary */
+/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */
+/* reuse GL_PROGRAM_BINARY_LENGTH */
+/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */
+/* reuse GL_PROGRAM_BINARY_FORMATS */
+/* Reuse tokens from ARB_separate_shader_objects */
+/* reuse GL_VERTEX_SHADER_BIT */
+/* reuse GL_FRAGMENT_SHADER_BIT */
+/* reuse GL_GEOMETRY_SHADER_BIT */
+/* reuse GL_TESS_CONTROL_SHADER_BIT */
+/* reuse GL_TESS_EVALUATION_SHADER_BIT */
+/* reuse GL_ALL_SHADER_BITS */
+/* reuse GL_PROGRAM_SEPARABLE */
+/* reuse GL_ACTIVE_PROGRAM */
+/* reuse GL_PROGRAM_PIPELINE_BINDING */
+/* Reuse tokens from ARB_shader_precision (none) */
+/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */
+/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */
+/* reuse GL_MAX_VIEWPORTS */
+/* reuse GL_VIEWPORT_SUBPIXEL_BITS */
+/* reuse GL_VIEWPORT_BOUNDS_RANGE */
+/* reuse GL_LAYER_PROVOKING_VERTEX */
+/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */
+/* reuse GL_UNDEFINED_VERTEX */
+#endif
+
+#ifndef GL_VERSION_4_2
+/* Reuse tokens from ARB_base_instance (none) */
+/* Reuse tokens from ARB_shading_language_420pack (none) */
+/* Reuse tokens from ARB_transform_feedback_instanced (none) */
+/* Reuse tokens from ARB_compressed_texture_pixel_storage */
+/* reuse GL_UNPACK_COMPRESSED_BLOCK_WIDTH */
+/* reuse GL_UNPACK_COMPRESSED_BLOCK_HEIGHT */
+/* reuse GL_UNPACK_COMPRESSED_BLOCK_DEPTH */
+/* reuse GL_UNPACK_COMPRESSED_BLOCK_SIZE */
+/* reuse GL_PACK_COMPRESSED_BLOCK_WIDTH */
+/* reuse GL_PACK_COMPRESSED_BLOCK_HEIGHT */
+/* reuse GL_PACK_COMPRESSED_BLOCK_DEPTH */
+/* reuse GL_PACK_COMPRESSED_BLOCK_SIZE */
+/* Reuse tokens from ARB_conservative_depth (none) */
+/* Reuse tokens from ARB_internalformat_query */
+/* reuse GL_NUM_SAMPLE_COUNTS */
+/* Reuse tokens from ARB_map_buffer_alignment */
+/* reuse GL_MIN_MAP_BUFFER_ALIGNMENT */
+/* Reuse tokens from ARB_shader_atomic_counters */
+/* reuse GL_ATOMIC_COUNTER_BUFFER */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_BINDING */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_START */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_SIZE */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER */
+/* reuse GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_MAX_VERTEX_ATOMIC_COUNTERS */
+/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS */
+/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS */
+/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTERS */
+/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTERS */
+/* reuse GL_MAX_COMBINED_ATOMIC_COUNTERS */
+/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE */
+/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS */
+/* reuse GL_ACTIVE_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX */
+/* reuse GL_UNSIGNED_INT_ATOMIC_COUNTER */
+/* Reuse tokens from ARB_shader_image_load_store */
+/* reuse GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT */
+/* reuse GL_ELEMENT_ARRAY_BARRIER_BIT */
+/* reuse GL_UNIFORM_BARRIER_BIT */
+/* reuse GL_TEXTURE_FETCH_BARRIER_BIT */
+/* reuse GL_SHADER_IMAGE_ACCESS_BARRIER_BIT */
+/* reuse GL_COMMAND_BARRIER_BIT */
+/* reuse GL_PIXEL_BUFFER_BARRIER_BIT */
+/* reuse GL_TEXTURE_UPDATE_BARRIER_BIT */
+/* reuse GL_BUFFER_UPDATE_BARRIER_BIT */
+/* reuse GL_FRAMEBUFFER_BARRIER_BIT */
+/* reuse GL_TRANSFORM_FEEDBACK_BARRIER_BIT */
+/* reuse GL_ATOMIC_COUNTER_BARRIER_BIT */
+/* reuse GL_ALL_BARRIER_BITS */
+/* reuse GL_MAX_IMAGE_UNITS */
+/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */
+/* reuse GL_IMAGE_BINDING_NAME */
+/* reuse GL_IMAGE_BINDING_LEVEL */
+/* reuse GL_IMAGE_BINDING_LAYERED */
+/* reuse GL_IMAGE_BINDING_LAYER */
+/* reuse GL_IMAGE_BINDING_ACCESS */
+/* reuse GL_IMAGE_1D */
+/* reuse GL_IMAGE_2D */
+/* reuse GL_IMAGE_3D */
+/* reuse GL_IMAGE_2D_RECT */
+/* reuse GL_IMAGE_CUBE */
+/* reuse GL_IMAGE_BUFFER */
+/* reuse GL_IMAGE_1D_ARRAY */
+/* reuse GL_IMAGE_2D_ARRAY */
+/* reuse GL_IMAGE_CUBE_MAP_ARRAY */
+/* reuse GL_IMAGE_2D_MULTISAMPLE */
+/* reuse GL_IMAGE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_INT_IMAGE_1D */
+/* reuse GL_INT_IMAGE_2D */
+/* reuse GL_INT_IMAGE_3D */
+/* reuse GL_INT_IMAGE_2D_RECT */
+/* reuse GL_INT_IMAGE_CUBE */
+/* reuse GL_INT_IMAGE_BUFFER */
+/* reuse GL_INT_IMAGE_1D_ARRAY */
+/* reuse GL_INT_IMAGE_2D_ARRAY */
+/* reuse GL_INT_IMAGE_CUBE_MAP_ARRAY */
+/* reuse GL_INT_IMAGE_2D_MULTISAMPLE */
+/* reuse GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_UNSIGNED_INT_IMAGE_1D */
+/* reuse GL_UNSIGNED_INT_IMAGE_2D */
+/* reuse GL_UNSIGNED_INT_IMAGE_3D */
+/* reuse GL_UNSIGNED_INT_IMAGE_2D_RECT */
+/* reuse GL_UNSIGNED_INT_IMAGE_CUBE */
+/* reuse GL_UNSIGNED_INT_IMAGE_BUFFER */
+/* reuse GL_UNSIGNED_INT_IMAGE_1D_ARRAY */
+/* reuse GL_UNSIGNED_INT_IMAGE_2D_ARRAY */
+/* reuse GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY */
+/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE */
+/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_MAX_IMAGE_SAMPLES */
+/* reuse GL_IMAGE_BINDING_FORMAT */
+/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */
+/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE */
+/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS */
+/* reuse GL_MAX_VERTEX_IMAGE_UNIFORMS */
+/* reuse GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS */
+/* reuse GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS */
+/* reuse GL_MAX_GEOMETRY_IMAGE_UNIFORMS */
+/* reuse GL_MAX_FRAGMENT_IMAGE_UNIFORMS */
+/* reuse GL_MAX_COMBINED_IMAGE_UNIFORMS */
+/* Reuse tokens from ARB_shading_language_packing (none) */
+/* Reuse tokens from ARB_texture_storage */
+/* reuse GL_TEXTURE_IMMUTABLE_FORMAT */
+#endif
+
+#ifndef GL_VERSION_4_3
+#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9
+#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E
+/* Reuse tokens from ARB_arrays_of_arrays (none, GLSL only) */
+/* Reuse tokens from ARB_fragment_layer_viewport (none, GLSL only) */
+/* Reuse tokens from ARB_shader_image_size (none, GLSL only) */
+/* Reuse tokens from ARB_ES3_compatibility */
+/* reuse GL_COMPRESSED_RGB8_ETC2 */
+/* reuse GL_COMPRESSED_SRGB8_ETC2 */
+/* reuse GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 */
+/* reuse GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 */
+/* reuse GL_COMPRESSED_RGBA8_ETC2_EAC */
+/* reuse GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC */
+/* reuse GL_COMPRESSED_R11_EAC */
+/* reuse GL_COMPRESSED_SIGNED_R11_EAC */
+/* reuse GL_COMPRESSED_RG11_EAC */
+/* reuse GL_COMPRESSED_SIGNED_RG11_EAC */
+/* reuse GL_PRIMITIVE_RESTART_FIXED_INDEX */
+/* reuse GL_ANY_SAMPLES_PASSED_CONSERVATIVE */
+/* reuse GL_MAX_ELEMENT_INDEX */
+/* Reuse tokens from ARB_clear_buffer_object (none) */
+/* Reuse tokens from ARB_compute_shader */
+/* reuse GL_COMPUTE_SHADER */
+/* reuse GL_MAX_COMPUTE_UNIFORM_BLOCKS */
+/* reuse GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS */
+/* reuse GL_MAX_COMPUTE_IMAGE_UNIFORMS */
+/* reuse GL_MAX_COMPUTE_SHARED_MEMORY_SIZE */
+/* reuse GL_MAX_COMPUTE_UNIFORM_COMPONENTS */
+/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS */
+/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTERS */
+/* reuse GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS */
+/* reuse GL_MAX_COMPUTE_LOCAL_INVOCATIONS */
+/* reuse GL_MAX_COMPUTE_WORK_GROUP_COUNT */
+/* reuse GL_MAX_COMPUTE_WORK_GROUP_SIZE */
+/* reuse GL_COMPUTE_LOCAL_WORK_SIZE */
+/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER */
+/* reuse GL_DISPATCH_INDIRECT_BUFFER */
+/* reuse GL_DISPATCH_INDIRECT_BUFFER_BINDING */
+/* Reuse tokens from ARB_copy_image (none) */
+/* Reuse tokens from KHR_debug */
+/* reuse GL_DEBUG_OUTPUT_SYNCHRONOUS */
+/* reuse GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH */
+/* reuse GL_DEBUG_CALLBACK_FUNCTION */
+/* reuse GL_DEBUG_CALLBACK_USER_PARAM */
+/* reuse GL_DEBUG_SOURCE_API */
+/* reuse GL_DEBUG_SOURCE_WINDOW_SYSTEM */
+/* reuse GL_DEBUG_SOURCE_SHADER_COMPILER */
+/* reuse GL_DEBUG_SOURCE_THIRD_PARTY */
+/* reuse GL_DEBUG_SOURCE_APPLICATION */
+/* reuse GL_DEBUG_SOURCE_OTHER */
+/* reuse GL_DEBUG_TYPE_ERROR */
+/* reuse GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR */
+/* reuse GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR */
+/* reuse GL_DEBUG_TYPE_PORTABILITY */
+/* reuse GL_DEBUG_TYPE_PERFORMANCE */
+/* reuse GL_DEBUG_TYPE_OTHER */
+/* reuse GL_MAX_DEBUG_MESSAGE_LENGTH */
+/* reuse GL_MAX_DEBUG_LOGGED_MESSAGES */
+/* reuse GL_DEBUG_LOGGED_MESSAGES */
+/* reuse GL_DEBUG_SEVERITY_HIGH */
+/* reuse GL_DEBUG_SEVERITY_MEDIUM */
+/* reuse GL_DEBUG_SEVERITY_LOW */
+/* reuse GL_DEBUG_TYPE_MARKER */
+/* reuse GL_DEBUG_TYPE_PUSH_GROUP */
+/* reuse GL_DEBUG_TYPE_POP_GROUP */
+/* reuse GL_DEBUG_SEVERITY_NOTIFICATION */
+/* reuse GL_MAX_DEBUG_GROUP_STACK_DEPTH */
+/* reuse GL_DEBUG_GROUP_STACK_DEPTH */
+/* reuse GL_BUFFER */
+/* reuse GL_SHADER */
+/* reuse GL_PROGRAM */
+/* reuse GL_QUERY */
+/* reuse GL_PROGRAM_PIPELINE */
+/* reuse GL_SAMPLER */
+/* reuse GL_DISPLAY_LIST */
+/* reuse GL_MAX_LABEL_LENGTH */
+/* reuse GL_DEBUG_OUTPUT */
+/* reuse GL_CONTEXT_FLAG_DEBUG_BIT */
+/* reuse GL_STACK_UNDERFLOW */
+/* reuse GL_STACK_OVERFLOW */
+/* Reuse tokens from ARB_explicit_uniform_location */
+/* reuse GL_MAX_UNIFORM_LOCATIONS */
+/* Reuse tokens from ARB_framebuffer_no_attachments */
+/* reuse GL_FRAMEBUFFER_DEFAULT_WIDTH */
+/* reuse GL_FRAMEBUFFER_DEFAULT_HEIGHT */
+/* reuse GL_FRAMEBUFFER_DEFAULT_LAYERS */
+/* reuse GL_FRAMEBUFFER_DEFAULT_SAMPLES */
+/* reuse GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS */
+/* reuse GL_MAX_FRAMEBUFFER_WIDTH */
+/* reuse GL_MAX_FRAMEBUFFER_HEIGHT */
+/* reuse GL_MAX_FRAMEBUFFER_LAYERS */
+/* reuse GL_MAX_FRAMEBUFFER_SAMPLES */
+/* Reuse tokens from ARB_internalformat_query2 */
+/* reuse GL_INTERNALFORMAT_SUPPORTED */
+/* reuse GL_INTERNALFORMAT_PREFERRED */
+/* reuse GL_INTERNALFORMAT_RED_SIZE */
+/* reuse GL_INTERNALFORMAT_GREEN_SIZE */
+/* reuse GL_INTERNALFORMAT_BLUE_SIZE */
+/* reuse GL_INTERNALFORMAT_ALPHA_SIZE */
+/* reuse GL_INTERNALFORMAT_DEPTH_SIZE */
+/* reuse GL_INTERNALFORMAT_STENCIL_SIZE */
+/* reuse GL_INTERNALFORMAT_SHARED_SIZE */
+/* reuse GL_INTERNALFORMAT_RED_TYPE */
+/* reuse GL_INTERNALFORMAT_GREEN_TYPE */
+/* reuse GL_INTERNALFORMAT_BLUE_TYPE */
+/* reuse GL_INTERNALFORMAT_ALPHA_TYPE */
+/* reuse GL_INTERNALFORMAT_DEPTH_TYPE */
+/* reuse GL_INTERNALFORMAT_STENCIL_TYPE */
+/* reuse GL_MAX_WIDTH */
+/* reuse GL_MAX_HEIGHT */
+/* reuse GL_MAX_DEPTH */
+/* reuse GL_MAX_LAYERS */
+/* reuse GL_MAX_COMBINED_DIMENSIONS */
+/* reuse GL_COLOR_COMPONENTS */
+/* reuse GL_DEPTH_COMPONENTS */
+/* reuse GL_STENCIL_COMPONENTS */
+/* reuse GL_COLOR_RENDERABLE */
+/* reuse GL_DEPTH_RENDERABLE */
+/* reuse GL_STENCIL_RENDERABLE */
+/* reuse GL_FRAMEBUFFER_RENDERABLE */
+/* reuse GL_FRAMEBUFFER_RENDERABLE_LAYERED */
+/* reuse GL_FRAMEBUFFER_BLEND */
+/* reuse GL_READ_PIXELS */
+/* reuse GL_READ_PIXELS_FORMAT */
+/* reuse GL_READ_PIXELS_TYPE */
+/* reuse GL_TEXTURE_IMAGE_FORMAT */
+/* reuse GL_TEXTURE_IMAGE_TYPE */
+/* reuse GL_GET_TEXTURE_IMAGE_FORMAT */
+/* reuse GL_GET_TEXTURE_IMAGE_TYPE */
+/* reuse GL_MIPMAP */
+/* reuse GL_MANUAL_GENERATE_MIPMAP */
+/* reuse GL_AUTO_GENERATE_MIPMAP */
+/* reuse GL_COLOR_ENCODING */
+/* reuse GL_SRGB_READ */
+/* reuse GL_SRGB_WRITE */
+/* reuse GL_FILTER */
+/* reuse GL_VERTEX_TEXTURE */
+/* reuse GL_TESS_CONTROL_TEXTURE */
+/* reuse GL_TESS_EVALUATION_TEXTURE */
+/* reuse GL_GEOMETRY_TEXTURE */
+/* reuse GL_FRAGMENT_TEXTURE */
+/* reuse GL_COMPUTE_TEXTURE */
+/* reuse GL_TEXTURE_SHADOW */
+/* reuse GL_TEXTURE_GATHER */
+/* reuse GL_TEXTURE_GATHER_SHADOW */
+/* reuse GL_SHADER_IMAGE_LOAD */
+/* reuse GL_SHADER_IMAGE_STORE */
+/* reuse GL_SHADER_IMAGE_ATOMIC */
+/* reuse GL_IMAGE_TEXEL_SIZE */
+/* reuse GL_IMAGE_COMPATIBILITY_CLASS */
+/* reuse GL_IMAGE_PIXEL_FORMAT */
+/* reuse GL_IMAGE_PIXEL_TYPE */
+/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST */
+/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST */
+/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE */
+/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE */
+/* reuse GL_TEXTURE_COMPRESSED_BLOCK_WIDTH */
+/* reuse GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT */
+/* reuse GL_TEXTURE_COMPRESSED_BLOCK_SIZE */
+/* reuse GL_CLEAR_BUFFER */
+/* reuse GL_TEXTURE_VIEW */
+/* reuse GL_VIEW_COMPATIBILITY_CLASS */
+/* reuse GL_FULL_SUPPORT */
+/* reuse GL_CAVEAT_SUPPORT */
+/* reuse GL_IMAGE_CLASS_4_X_32 */
+/* reuse GL_IMAGE_CLASS_2_X_32 */
+/* reuse GL_IMAGE_CLASS_1_X_32 */
+/* reuse GL_IMAGE_CLASS_4_X_16 */
+/* reuse GL_IMAGE_CLASS_2_X_16 */
+/* reuse GL_IMAGE_CLASS_1_X_16 */
+/* reuse GL_IMAGE_CLASS_4_X_8 */
+/* reuse GL_IMAGE_CLASS_2_X_8 */
+/* reuse GL_IMAGE_CLASS_1_X_8 */
+/* reuse GL_IMAGE_CLASS_11_11_10 */
+/* reuse GL_IMAGE_CLASS_10_10_10_2 */
+/* reuse GL_VIEW_CLASS_128_BITS */
+/* reuse GL_VIEW_CLASS_96_BITS */
+/* reuse GL_VIEW_CLASS_64_BITS */
+/* reuse GL_VIEW_CLASS_48_BITS */
+/* reuse GL_VIEW_CLASS_32_BITS */
+/* reuse GL_VIEW_CLASS_24_BITS */
+/* reuse GL_VIEW_CLASS_16_BITS */
+/* reuse GL_VIEW_CLASS_8_BITS */
+/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGB */
+/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGBA */
+/* reuse GL_VIEW_CLASS_S3TC_DXT3_RGBA */
+/* reuse GL_VIEW_CLASS_S3TC_DXT5_RGBA */
+/* reuse GL_VIEW_CLASS_RGTC1_RED */
+/* reuse GL_VIEW_CLASS_RGTC2_RG */
+/* reuse GL_VIEW_CLASS_BPTC_UNORM */
+/* reuse GL_VIEW_CLASS_BPTC_FLOAT */
+/* Reuse tokens from ARB_invalidate_subdata (none) */
+/* Reuse tokens from ARB_multi_draw_indirect (none) */
+/* Reuse tokens from ARB_program_interface_query */
+/* reuse GL_UNIFORM */
+/* reuse GL_UNIFORM_BLOCK */
+/* reuse GL_PROGRAM_INPUT */
+/* reuse GL_PROGRAM_OUTPUT */
+/* reuse GL_BUFFER_VARIABLE */
+/* reuse GL_SHADER_STORAGE_BLOCK */
+/* reuse GL_VERTEX_SUBROUTINE */
+/* reuse GL_TESS_CONTROL_SUBROUTINE */
+/* reuse GL_TESS_EVALUATION_SUBROUTINE */
+/* reuse GL_GEOMETRY_SUBROUTINE */
+/* reuse GL_FRAGMENT_SUBROUTINE */
+/* reuse GL_COMPUTE_SUBROUTINE */
+/* reuse GL_VERTEX_SUBROUTINE_UNIFORM */
+/* reuse GL_TESS_CONTROL_SUBROUTINE_UNIFORM */
+/* reuse GL_TESS_EVALUATION_SUBROUTINE_UNIFORM */
+/* reuse GL_GEOMETRY_SUBROUTINE_UNIFORM */
+/* reuse GL_FRAGMENT_SUBROUTINE_UNIFORM */
+/* reuse GL_COMPUTE_SUBROUTINE_UNIFORM */
+/* reuse GL_TRANSFORM_FEEDBACK_VARYING */
+/* reuse GL_ACTIVE_RESOURCES */
+/* reuse GL_MAX_NAME_LENGTH */
+/* reuse GL_MAX_NUM_ACTIVE_VARIABLES */
+/* reuse GL_MAX_NUM_COMPATIBLE_SUBROUTINES */
+/* reuse GL_NAME_LENGTH */
+/* reuse GL_TYPE */
+/* reuse GL_ARRAY_SIZE */
+/* reuse GL_OFFSET */
+/* reuse GL_BLOCK_INDEX */
+/* reuse GL_ARRAY_STRIDE */
+/* reuse GL_MATRIX_STRIDE */
+/* reuse GL_IS_ROW_MAJOR */
+/* reuse GL_ATOMIC_COUNTER_BUFFER_INDEX */
+/* reuse GL_BUFFER_BINDING */
+/* reuse GL_BUFFER_DATA_SIZE */
+/* reuse GL_NUM_ACTIVE_VARIABLES */
+/* reuse GL_ACTIVE_VARIABLES */
+/* reuse GL_REFERENCED_BY_VERTEX_SHADER */
+/* reuse GL_REFERENCED_BY_TESS_CONTROL_SHADER */
+/* reuse GL_REFERENCED_BY_TESS_EVALUATION_SHADER */
+/* reuse GL_REFERENCED_BY_GEOMETRY_SHADER */
+/* reuse GL_REFERENCED_BY_FRAGMENT_SHADER */
+/* reuse GL_REFERENCED_BY_COMPUTE_SHADER */
+/* reuse GL_TOP_LEVEL_ARRAY_SIZE */
+/* reuse GL_TOP_LEVEL_ARRAY_STRIDE */
+/* reuse GL_LOCATION */
+/* reuse GL_LOCATION_INDEX */
+/* reuse GL_IS_PER_PATCH */
+/* Reuse tokens from ARB_robust_buffer_access_behavior (none) */
+/* Reuse tokens from ARB_shader_storage_buffer_object */
+/* reuse GL_SHADER_STORAGE_BUFFER */
+/* reuse GL_SHADER_STORAGE_BUFFER_BINDING */
+/* reuse GL_SHADER_STORAGE_BUFFER_START */
+/* reuse GL_SHADER_STORAGE_BUFFER_SIZE */
+/* reuse GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS */
+/* reuse GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS */
+/* reuse GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS */
+/* reuse GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS */
+/* reuse GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS */
+/* reuse GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS */
+/* reuse GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS */
+/* reuse GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS */
+/* reuse GL_MAX_SHADER_STORAGE_BLOCK_SIZE */
+/* reuse GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT */
+/* reuse GL_SHADER_STORAGE_BARRIER_BIT */
+/* reuse GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES */
+/* Reuse tokens from ARB_stencil_texturing */
+/* reuse GL_DEPTH_STENCIL_TEXTURE_MODE */
+/* Reuse tokens from ARB_texture_buffer_range */
+/* reuse GL_TEXTURE_BUFFER_OFFSET */
+/* reuse GL_TEXTURE_BUFFER_SIZE */
+/* reuse GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT */
+/* Reuse tokens from ARB_texture_query_levels (none) */
+/* Reuse tokens from ARB_texture_storage_multisample (none) */
+/* Reuse tokens from ARB_texture_view */
+/* reuse GL_TEXTURE_VIEW_MIN_LEVEL */
+/* reuse GL_TEXTURE_VIEW_NUM_LEVELS */
+/* reuse GL_TEXTURE_VIEW_MIN_LAYER */
+/* reuse GL_TEXTURE_VIEW_NUM_LAYERS */
+/* reuse GL_TEXTURE_IMMUTABLE_LEVELS */
+/* Reuse tokens from ARB_vertex_attrib_binding */
+/* reuse GL_VERTEX_ATTRIB_BINDING */
+/* reuse GL_VERTEX_ATTRIB_RELATIVE_OFFSET */
+/* reuse GL_VERTEX_BINDING_DIVISOR */
+/* reuse GL_VERTEX_BINDING_OFFSET */
+/* reuse GL_VERTEX_BINDING_STRIDE */
+/* reuse GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET */
+/* reuse GL_MAX_VERTEX_ATTRIB_BINDINGS */
+#endif
+
+#ifndef GL_ARB_depth_buffer_float
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#endif
+
+#ifndef GL_ARB_framebuffer_object
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_RED_TYPE 0x8C10
+#define GL_TEXTURE_GREEN_TYPE 0x8C11
+#define GL_TEXTURE_BLUE_TYPE 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE 0x8C13
+#define GL_TEXTURE_DEPTH_TYPE 0x8C16
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#endif
+
+#ifndef GL_ARB_framebuffer_sRGB
+#define GL_FRAMEBUFFER_SRGB 0x8DB9
+#endif
+
+#ifndef GL_ARB_half_float_vertex
+#define GL_HALF_FLOAT 0x140B
+#endif
+
+#ifndef GL_ARB_map_buffer_range
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#endif
+
+#ifndef GL_ARB_texture_compression_rgtc
+#define GL_COMPRESSED_RED_RGTC1 0x8DBB
+#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC
+#define GL_COMPRESSED_RG_RGTC2 0x8DBD
+#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE
+#endif
+
+#ifndef GL_ARB_texture_rg
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_R16 0x822A
+#define GL_RG8 0x822B
+#define GL_RG16 0x822C
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#endif
+
+#ifndef GL_ARB_vertex_array_object
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#endif
+
+#ifndef GL_ARB_uniform_buffer_object
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+#endif
+
+#ifndef GL_ARB_copy_buffer
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_READ_BUFFER GL_COPY_READ_BUFFER_BINDING
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_COPY_WRITE_BUFFER GL_COPY_WRITE_BUFFER_BINDING
+#endif
+
+#ifndef GL_ARB_depth_clamp
+#define GL_DEPTH_CLAMP 0x864F
+#endif
+
+#ifndef GL_ARB_draw_elements_base_vertex
+#endif
+
+#ifndef GL_ARB_fragment_coord_conventions
+#endif
+
+#ifndef GL_ARB_provoking_vertex
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_PROVOKING_VERTEX 0x8E4F
+#endif
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
+#endif
+
+#ifndef GL_ARB_sync
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#endif
+
+#ifndef GL_ARB_texture_multisample
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+#endif
+
+#ifndef GL_ARB_vertex_array_bgra
+/* reuse GL_BGRA */
+#endif
+
+#ifndef GL_ARB_draw_buffers_blend
+#endif
+
+#ifndef GL_ARB_sample_shading
+#define GL_SAMPLE_SHADING_ARB 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37
+#endif
+
+#ifndef GL_ARB_texture_cube_map_array
+#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F
+#endif
+
+#ifndef GL_ARB_texture_gather
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F
+#endif
+
+#ifndef GL_ARB_texture_query_lod
+#endif
+
+#ifndef GL_ARB_shading_language_include
+#define GL_SHADER_INCLUDE_ARB 0x8DAE
+#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9
+#define GL_NAMED_STRING_TYPE_ARB 0x8DEA
+#endif
+
+#ifndef GL_ARB_texture_compression_bptc
+#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
+#endif
+
+#ifndef GL_ARB_blend_func_extended
+#define GL_SRC1_COLOR 0x88F9
+/* reuse GL_SRC1_ALPHA */
+#define GL_ONE_MINUS_SRC1_COLOR 0x88FA
+#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB
+#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC
+#endif
+
+#ifndef GL_ARB_explicit_attrib_location
+#endif
+
+#ifndef GL_ARB_occlusion_query2
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#endif
+
+#ifndef GL_ARB_sampler_objects
+#define GL_SAMPLER_BINDING 0x8919
+#endif
+
+#ifndef GL_ARB_shader_bit_encoding
+#endif
+
+#ifndef GL_ARB_texture_rgb10_a2ui
+#define GL_RGB10_A2UI 0x906F
+#endif
+
+#ifndef GL_ARB_texture_swizzle
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
+#endif
+
+#ifndef GL_ARB_timer_query
+#define GL_TIME_ELAPSED 0x88BF
+#define GL_TIMESTAMP 0x8E28
+#endif
+
+#ifndef GL_ARB_vertex_type_2_10_10_10_rev
+/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */
+#define GL_INT_2_10_10_10_REV 0x8D9F
+#endif
+
+#ifndef GL_ARB_draw_indirect
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+#endif
+
+#ifndef GL_ARB_gpu_shader5
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+/* reuse GL_MAX_VERTEX_STREAMS */
+#endif
+
+#ifndef GL_ARB_gpu_shader_fp64
+/* reuse GL_DOUBLE */
+#define GL_DOUBLE_VEC2 0x8FFC
+#define GL_DOUBLE_VEC3 0x8FFD
+#define GL_DOUBLE_VEC4 0x8FFE
+#define GL_DOUBLE_MAT2 0x8F46
+#define GL_DOUBLE_MAT3 0x8F47
+#define GL_DOUBLE_MAT4 0x8F48
+#define GL_DOUBLE_MAT2x3 0x8F49
+#define GL_DOUBLE_MAT2x4 0x8F4A
+#define GL_DOUBLE_MAT3x2 0x8F4B
+#define GL_DOUBLE_MAT3x4 0x8F4C
+#define GL_DOUBLE_MAT4x2 0x8F4D
+#define GL_DOUBLE_MAT4x3 0x8F4E
+#endif
+
+#ifndef GL_ARB_shader_subroutine
+#define GL_ACTIVE_SUBROUTINES 0x8DE5
+#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47
+#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49
+#define GL_MAX_SUBROUTINES 0x8DE7
+#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8
+#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A
+#define GL_COMPATIBLE_SUBROUTINES 0x8E4B
+/* reuse GL_UNIFORM_SIZE */
+/* reuse GL_UNIFORM_NAME_LENGTH */
+#endif
+
+#ifndef GL_ARB_tessellation_shader
+#define GL_PATCHES 0x000E
+#define GL_PATCH_VERTICES 0x8E72
+#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
+#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
+#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75
+#define GL_TESS_GEN_MODE 0x8E76
+#define GL_TESS_GEN_SPACING 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER 0x8E78
+#define GL_TESS_GEN_POINT_MODE 0x8E79
+/* reuse GL_TRIANGLES */
+/* reuse GL_QUADS */
+#define GL_ISOLINES 0x8E7A
+/* reuse GL_EQUAL */
+#define GL_FRACTIONAL_ODD 0x8E7B
+#define GL_FRACTIONAL_EVEN 0x8E7C
+/* reuse GL_CCW */
+/* reuse GL_CW */
+#define GL_MAX_PATCH_VERTICES 0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL 0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#endif
+
+#ifndef GL_ARB_texture_buffer_object_rgb32
+/* reuse GL_RGB32F */
+/* reuse GL_RGB32UI */
+/* reuse GL_RGB32I */
+#endif
+
+#ifndef GL_ARB_transform_feedback2
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED GL_TRANSFORM_FEEDBACK_PAUSED
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE GL_TRANSFORM_FEEDBACK_ACTIVE
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#endif
+
+#ifndef GL_ARB_transform_feedback3
+#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70
+#define GL_MAX_VERTEX_STREAMS 0x8E71
+#endif
+
+#ifndef GL_ARB_ES2_compatibility
+#define GL_FIXED 0x140C
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_RGB565 0x8D62
+#endif
+
+#ifndef GL_ARB_get_program_binary
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#endif
+
+#ifndef GL_ARB_separate_shader_objects
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#endif
+
+#ifndef GL_ARB_shader_precision
+#endif
+
+#ifndef GL_ARB_vertex_attrib_64bit
+/* reuse GL_RGB32I */
+/* reuse GL_DOUBLE_VEC2 */
+/* reuse GL_DOUBLE_VEC3 */
+/* reuse GL_DOUBLE_VEC4 */
+/* reuse GL_DOUBLE_MAT2 */
+/* reuse GL_DOUBLE_MAT3 */
+/* reuse GL_DOUBLE_MAT4 */
+/* reuse GL_DOUBLE_MAT2x3 */
+/* reuse GL_DOUBLE_MAT2x4 */
+/* reuse GL_DOUBLE_MAT3x2 */
+/* reuse GL_DOUBLE_MAT3x4 */
+/* reuse GL_DOUBLE_MAT4x2 */
+/* reuse GL_DOUBLE_MAT4x3 */
+#endif
+
+#ifndef GL_ARB_viewport_array
+/* reuse GL_SCISSOR_BOX */
+/* reuse GL_VIEWPORT */
+/* reuse GL_DEPTH_RANGE */
+/* reuse GL_SCISSOR_TEST */
+#define GL_MAX_VIEWPORTS 0x825B
+#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C
+#define GL_VIEWPORT_BOUNDS_RANGE 0x825D
+#define GL_LAYER_PROVOKING_VERTEX 0x825E
+#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F
+#define GL_UNDEFINED_VERTEX 0x8260
+/* reuse GL_FIRST_VERTEX_CONVENTION */
+/* reuse GL_LAST_VERTEX_CONVENTION */
+/* reuse GL_PROVOKING_VERTEX */
+#endif
+
+#ifndef GL_ARB_cl_event
+#define GL_SYNC_CL_EVENT_ARB 0x8240
+#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241
+#endif
+
+#ifndef GL_ARB_debug_output
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245
+#define GL_DEBUG_SOURCE_API_ARB 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A
+#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B
+#define GL_DEBUG_TYPE_ERROR_ARB 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250
+#define GL_DEBUG_TYPE_OTHER_ARB 0x8251
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147
+#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148
+#endif
+
+#ifndef GL_ARB_robustness
+/* reuse GL_NO_ERROR */
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253
+#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define GL_NO_RESET_NOTIFICATION_ARB 0x8261
+#endif
+
+#ifndef GL_ARB_shader_stencil_export
+#endif
+
+#ifndef GL_ARB_base_instance
+#endif
+
+#ifndef GL_ARB_shading_language_420pack
+#endif
+
+#ifndef GL_ARB_transform_feedback_instanced
+#endif
+
+#ifndef GL_ARB_compressed_texture_pixel_storage
+#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127
+#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128
+#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129
+#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A
+#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B
+#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C
+#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D
+#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E
+#endif
+
+#ifndef GL_ARB_conservative_depth
+#endif
+
+#ifndef GL_ARB_internalformat_query
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#endif
+
+#ifndef GL_ARB_map_buffer_alignment
+#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC
+#endif
+
+#ifndef GL_ARB_shader_atomic_counters
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
+#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
+#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#endif
+
+#ifndef GL_ARB_shader_image_load_store
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+#define GL_MAX_IMAGE_UNITS 0x8F38
+#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39
+#define GL_IMAGE_BINDING_NAME 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED 0x8F3C
+#define GL_IMAGE_BINDING_LAYER 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS 0x8F3E
+#define GL_IMAGE_1D 0x904C
+#define GL_IMAGE_2D 0x904D
+#define GL_IMAGE_3D 0x904E
+#define GL_IMAGE_2D_RECT 0x904F
+#define GL_IMAGE_CUBE 0x9050
+#define GL_IMAGE_BUFFER 0x9051
+#define GL_IMAGE_1D_ARRAY 0x9052
+#define GL_IMAGE_2D_ARRAY 0x9053
+#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054
+#define GL_IMAGE_2D_MULTISAMPLE 0x9055
+#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056
+#define GL_INT_IMAGE_1D 0x9057
+#define GL_INT_IMAGE_2D 0x9058
+#define GL_INT_IMAGE_3D 0x9059
+#define GL_INT_IMAGE_2D_RECT 0x905A
+#define GL_INT_IMAGE_CUBE 0x905B
+#define GL_INT_IMAGE_BUFFER 0x905C
+#define GL_INT_IMAGE_1D_ARRAY 0x905D
+#define GL_INT_IMAGE_2D_ARRAY 0x905E
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F
+#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060
+#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061
+#define GL_UNSIGNED_INT_IMAGE_1D 0x9062
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D 0x9064
+#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065
+#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
+#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067
+#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C
+#define GL_MAX_IMAGE_SAMPLES 0x906D
+#define GL_IMAGE_BINDING_FORMAT 0x906E
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
+#endif
+
+#ifndef GL_ARB_shading_language_packing
+#endif
+
+#ifndef GL_ARB_texture_storage
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+#endif
+
+#ifndef GL_KHR_texture_compression_astc_ldr
+#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
+#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1
+#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2
+#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3
+#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4
+#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5
+#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6
+#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7
+#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8
+#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9
+#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA
+#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB
+#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC
+#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
+#endif
+
+#ifndef GL_KHR_debug
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#define GL_DEBUG_SOURCE_API 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#define GL_BUFFER 0x82E0
+#define GL_SHADER 0x82E1
+#define GL_PROGRAM 0x82E2
+#define GL_QUERY 0x82E3
+#define GL_PROGRAM_PIPELINE 0x82E4
+#define GL_SAMPLER 0x82E6
+#define GL_DISPLAY_LIST 0x82E7
+/* DISPLAY_LIST used in compatibility profile only */
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#define GL_DEBUG_OUTPUT 0x92E0
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+/* reuse GL_STACK_UNDERFLOW */
+/* reuse GL_STACK_OVERFLOW */
+#endif
+
+#ifndef GL_ARB_arrays_of_arrays
+#endif
+
+#ifndef GL_ARB_clear_buffer_object
+#endif
+
+#ifndef GL_ARB_compute_shader
+#define GL_COMPUTE_SHADER 0x91B9
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMPUTE_LOCAL_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF
+#define GL_COMPUTE_LOCAL_WORK_SIZE 0x8267
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED
+#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_COMPUTE_SHADER_BIT 0x00000020
+#endif
+
+#ifndef GL_ARB_copy_image
+#endif
+
+#ifndef GL_ARB_texture_view
+#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB
+#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC
+#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD
+#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+#endif
+
+#ifndef GL_ARB_vertex_attrib_binding
+#define GL_VERTEX_ATTRIB_BINDING 0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
+#define GL_VERTEX_BINDING_DIVISOR 0x82D6
+#define GL_VERTEX_BINDING_OFFSET 0x82D7
+#define GL_VERTEX_BINDING_STRIDE 0x82D8
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA
+#endif
+
+#ifndef GL_ARB_robustness_isolation
+#endif
+
+#ifndef GL_ARB_ES3_compatibility
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#endif
+
+#ifndef GL_ARB_explicit_uniform_location
+#define GL_MAX_UNIFORM_LOCATIONS 0x826E
+#endif
+
+#ifndef GL_ARB_fragment_layer_viewport
+#endif
+
+#ifndef GL_ARB_framebuffer_no_attachments
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315
+#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316
+#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317
+#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318
+#endif
+
+#ifndef GL_ARB_internalformat_query2
+/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */
+/* reuse GL_NUM_SAMPLE_COUNTS */
+/* reuse GL_RENDERBUFFER */
+/* reuse GL_SAMPLES */
+/* reuse GL_TEXTURE_1D */
+/* reuse GL_TEXTURE_1D_ARRAY */
+/* reuse GL_TEXTURE_2D */
+/* reuse GL_TEXTURE_2D_ARRAY */
+/* reuse GL_TEXTURE_3D */
+/* reuse GL_TEXTURE_CUBE_MAP */
+/* reuse GL_TEXTURE_CUBE_MAP_ARRAY */
+/* reuse GL_TEXTURE_RECTANGLE */
+/* reuse GL_TEXTURE_BUFFER */
+/* reuse GL_TEXTURE_2D_MULTISAMPLE */
+/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */
+/* reuse GL_TEXTURE_COMPRESSED */
+#define GL_INTERNALFORMAT_SUPPORTED 0x826F
+#define GL_INTERNALFORMAT_PREFERRED 0x8270
+#define GL_INTERNALFORMAT_RED_SIZE 0x8271
+#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272
+#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273
+#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274
+#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275
+#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276
+#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277
+#define GL_INTERNALFORMAT_RED_TYPE 0x8278
+#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279
+#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A
+#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B
+#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C
+#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D
+#define GL_MAX_WIDTH 0x827E
+#define GL_MAX_HEIGHT 0x827F
+#define GL_MAX_DEPTH 0x8280
+#define GL_MAX_LAYERS 0x8281
+#define GL_MAX_COMBINED_DIMENSIONS 0x8282
+#define GL_COLOR_COMPONENTS 0x8283
+#define GL_DEPTH_COMPONENTS 0x8284
+#define GL_STENCIL_COMPONENTS 0x8285
+#define GL_COLOR_RENDERABLE 0x8286
+#define GL_DEPTH_RENDERABLE 0x8287
+#define GL_STENCIL_RENDERABLE 0x8288
+#define GL_FRAMEBUFFER_RENDERABLE 0x8289
+#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A
+#define GL_FRAMEBUFFER_BLEND 0x828B
+#define GL_READ_PIXELS 0x828C
+#define GL_READ_PIXELS_FORMAT 0x828D
+#define GL_READ_PIXELS_TYPE 0x828E
+#define GL_TEXTURE_IMAGE_FORMAT 0x828F
+#define GL_TEXTURE_IMAGE_TYPE 0x8290
+#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291
+#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292
+#define GL_MIPMAP 0x8293
+#define GL_MANUAL_GENERATE_MIPMAP 0x8294
+#define GL_AUTO_GENERATE_MIPMAP 0x8295
+#define GL_COLOR_ENCODING 0x8296
+#define GL_SRGB_READ 0x8297
+#define GL_SRGB_WRITE 0x8298
+#define GL_SRGB_DECODE_ARB 0x8299
+#define GL_FILTER 0x829A
+#define GL_VERTEX_TEXTURE 0x829B
+#define GL_TESS_CONTROL_TEXTURE 0x829C
+#define GL_TESS_EVALUATION_TEXTURE 0x829D
+#define GL_GEOMETRY_TEXTURE 0x829E
+#define GL_FRAGMENT_TEXTURE 0x829F
+#define GL_COMPUTE_TEXTURE 0x82A0
+#define GL_TEXTURE_SHADOW 0x82A1
+#define GL_TEXTURE_GATHER 0x82A2
+#define GL_TEXTURE_GATHER_SHADOW 0x82A3
+#define GL_SHADER_IMAGE_LOAD 0x82A4
+#define GL_SHADER_IMAGE_STORE 0x82A5
+#define GL_SHADER_IMAGE_ATOMIC 0x82A6
+#define GL_IMAGE_TEXEL_SIZE 0x82A7
+#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8
+#define GL_IMAGE_PIXEL_FORMAT 0x82A9
+#define GL_IMAGE_PIXEL_TYPE 0x82AA
+#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC
+#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD
+#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE
+#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF
+#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1
+#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2
+#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3
+#define GL_CLEAR_BUFFER 0x82B4
+#define GL_TEXTURE_VIEW 0x82B5
+#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6
+#define GL_FULL_SUPPORT 0x82B7
+#define GL_CAVEAT_SUPPORT 0x82B8
+#define GL_IMAGE_CLASS_4_X_32 0x82B9
+#define GL_IMAGE_CLASS_2_X_32 0x82BA
+#define GL_IMAGE_CLASS_1_X_32 0x82BB
+#define GL_IMAGE_CLASS_4_X_16 0x82BC
+#define GL_IMAGE_CLASS_2_X_16 0x82BD
+#define GL_IMAGE_CLASS_1_X_16 0x82BE
+#define GL_IMAGE_CLASS_4_X_8 0x82BF
+#define GL_IMAGE_CLASS_2_X_8 0x82C0
+#define GL_IMAGE_CLASS_1_X_8 0x82C1
+#define GL_IMAGE_CLASS_11_11_10 0x82C2
+#define GL_IMAGE_CLASS_10_10_10_2 0x82C3
+#define GL_VIEW_CLASS_128_BITS 0x82C4
+#define GL_VIEW_CLASS_96_BITS 0x82C5
+#define GL_VIEW_CLASS_64_BITS 0x82C6
+#define GL_VIEW_CLASS_48_BITS 0x82C7
+#define GL_VIEW_CLASS_32_BITS 0x82C8
+#define GL_VIEW_CLASS_24_BITS 0x82C9
+#define GL_VIEW_CLASS_16_BITS 0x82CA
+#define GL_VIEW_CLASS_8_BITS 0x82CB
+#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC
+#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD
+#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE
+#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF
+#define GL_VIEW_CLASS_RGTC1_RED 0x82D0
+#define GL_VIEW_CLASS_RGTC2_RG 0x82D1
+#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2
+#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3
+#endif
+
+#ifndef GL_ARB_invalidate_subdata
+#endif
+
+#ifndef GL_ARB_multi_draw_indirect
+#endif
+
+#ifndef GL_ARB_program_interface_query
+#define GL_UNIFORM 0x92E1
+#define GL_UNIFORM_BLOCK 0x92E2
+#define GL_PROGRAM_INPUT 0x92E3
+#define GL_PROGRAM_OUTPUT 0x92E4
+#define GL_BUFFER_VARIABLE 0x92E5
+#define GL_SHADER_STORAGE_BLOCK 0x92E6
+/* reuse GL_ATOMIC_COUNTER_BUFFER */
+#define GL_VERTEX_SUBROUTINE 0x92E8
+#define GL_TESS_CONTROL_SUBROUTINE 0x92E9
+#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA
+#define GL_GEOMETRY_SUBROUTINE 0x92EB
+#define GL_FRAGMENT_SUBROUTINE 0x92EC
+#define GL_COMPUTE_SUBROUTINE 0x92ED
+#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE
+#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF
+#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0
+#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1
+#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2
+#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3
+#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4
+#define GL_ACTIVE_RESOURCES 0x92F5
+#define GL_MAX_NAME_LENGTH 0x92F6
+#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7
+#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8
+#define GL_NAME_LENGTH 0x92F9
+#define GL_TYPE 0x92FA
+#define GL_ARRAY_SIZE 0x92FB
+#define GL_OFFSET 0x92FC
+#define GL_BLOCK_INDEX 0x92FD
+#define GL_ARRAY_STRIDE 0x92FE
+#define GL_MATRIX_STRIDE 0x92FF
+#define GL_IS_ROW_MAJOR 0x9300
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
+#define GL_BUFFER_BINDING 0x9302
+#define GL_BUFFER_DATA_SIZE 0x9303
+#define GL_NUM_ACTIVE_VARIABLES 0x9304
+#define GL_ACTIVE_VARIABLES 0x9305
+#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308
+#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309
+#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A
+#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B
+#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D
+#define GL_LOCATION 0x930E
+#define GL_LOCATION_INDEX 0x930F
+#define GL_IS_PER_PATCH 0x92E7
+/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */
+/* reuse GL_COMPATIBLE_SUBROUTINES */
+#endif
+
+#ifndef GL_ARB_robust_buffer_access_behavior
+#endif
+
+#ifndef GL_ARB_shader_image_size
+#endif
+
+#ifndef GL_ARB_shader_storage_buffer_object
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3
+#define GL_SHADER_STORAGE_BUFFER_START 0x90D4
+#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS
+/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */
+#endif
+
+#ifndef GL_ARB_stencil_texturing
+#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
+#endif
+
+#ifndef GL_ARB_texture_buffer_range
+#define GL_TEXTURE_BUFFER_OFFSET 0x919D
+#define GL_TEXTURE_BUFFER_SIZE 0x919E
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F
+#endif
+
+#ifndef GL_ARB_texture_query_levels
+#endif
+
+#ifndef GL_ARB_texture_storage_multisample
+#endif
+
+
+/*************************************************************/
+
+#include <stddef.h>
+#ifndef GL_VERSION_2_0
+/* GL type for program/shader text */
+typedef char GLchar;
+#endif
+
+#ifndef GL_VERSION_1_5
+/* GL types for handling large vertex buffer objects */
+typedef ptrdiff_t GLintptr;
+typedef ptrdiff_t GLsizeiptr;
+#endif
+
+#ifndef GL_ARB_vertex_buffer_object
+/* GL types for handling large vertex buffer objects */
+typedef ptrdiff_t GLintptrARB;
+typedef ptrdiff_t GLsizeiptrARB;
+#endif
+
+#ifndef GL_ARB_shader_objects
+/* GL types for program/shader text and shader object handles */
+typedef char GLcharARB;
+typedef unsigned int GLhandleARB;
+#endif
+
+/* GL type for "half" precision (s10e5) float data in host memory */
+#ifndef GL_ARB_half_float_pixel
+typedef unsigned short GLhalfARB;
+#endif
+
+#ifndef GL_NV_half_float
+typedef unsigned short GLhalfNV;
+#endif
+
+#ifndef GLEXT_64_TYPES_DEFINED
+/* This code block is duplicated in glxext.h, so must be protected */
+#define GLEXT_64_TYPES_DEFINED
+/* Define int32_t, int64_t, and uint64_t types for UST/MSC */
+/* (as used in the GL_EXT_timer_query extension). */
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+#elif defined(__sun__) || defined(__digital__)
+#include <inttypes.h>
+#if defined(__STDC__)
+#if defined(__arch64__) || defined(_LP64)
+typedef long int int64_t;
+typedef unsigned long int uint64_t;
+#else
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#endif /* __arch64__ */
+#endif /* __STDC__ */
+#elif defined( __VMS ) || defined(__sgi)
+#include <inttypes.h>
+#elif defined(__SCO__) || defined(__USLC__)
+#include <stdint.h>
+#elif defined(__UNIXOS2__) || defined(__SOL64__)
+typedef long int int32_t;
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#elif defined(_WIN32) && defined(__GNUC__)
+#include <stdint.h>
+#elif defined(_WIN32)
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+/* Fallback if nothing above works */
+#include <inttypes.h>
+#endif
+#endif
+
+#ifndef GL_EXT_timer_query
+typedef int64_t GLint64EXT;
+typedef uint64_t GLuint64EXT;
+#endif
+
+#ifndef GL_ARB_sync
+typedef int64_t GLint64;
+typedef uint64_t GLuint64;
+typedef struct __GLsync *GLsync;
+#endif
+
+#ifndef GL_ARB_cl_event
+/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */
+struct _cl_context;
+struct _cl_event;
+#endif
+
+#ifndef GL_ARB_debug_output
+typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);
+#endif
+
+#ifndef GL_AMD_debug_output
+typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);
+#endif
+
+#ifndef GL_KHR_debug
+typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam);
+#endif
+
+#ifndef GL_NV_vdpau_interop
+typedef GLintptr GLvdpauSurfaceNV;
+#endif
+
+#ifndef GL_VERSION_1_0
+#define GL_VERSION_1_0 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glCullFace (GLenum mode);
+GLAPI void APIENTRY glFrontFace (GLenum mode);
+GLAPI void APIENTRY glHint (GLenum target, GLenum mode);
+GLAPI void APIENTRY glLineWidth (GLfloat width);
+GLAPI void APIENTRY glPointSize (GLfloat size);
+GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode);
+GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GLAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void APIENTRY glDrawBuffer (GLenum mode);
+GLAPI void APIENTRY glClear (GLbitfield mask);
+GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GLAPI void APIENTRY glClearStencil (GLint s);
+GLAPI void APIENTRY glClearDepth (GLdouble depth);
+GLAPI void APIENTRY glStencilMask (GLuint mask);
+GLAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GLAPI void APIENTRY glDepthMask (GLboolean flag);
+GLAPI void APIENTRY glDisable (GLenum cap);
+GLAPI void APIENTRY glEnable (GLenum cap);
+GLAPI void APIENTRY glFinish (void);
+GLAPI void APIENTRY glFlush (void);
+GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GLAPI void APIENTRY glLogicOp (GLenum opcode);
+GLAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GLAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GLAPI void APIENTRY glDepthFunc (GLenum func);
+GLAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param);
+GLAPI void APIENTRY glReadBuffer (GLenum mode);
+GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+GLAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params);
+GLAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params);
+GLAPI GLenum APIENTRY glGetError (void);
+GLAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params);
+GLAPI const GLubyte * APIENTRY glGetString (GLenum name);
+GLAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+GLAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap);
+GLAPI void APIENTRY glDepthRange (GLdouble near, GLdouble far);
+GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode);
+typedef void (APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width);
+typedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size);
+typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode);
+typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (APIENTRYP PFNGLDRAWBUFFERPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
+typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
+typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth);
+typedef void (APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
+typedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
+typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
+typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);
+typedef void (APIENTRYP PFNGLFINISHPROC) (void);
+typedef void (APIENTRYP PFNGLFLUSHPROC) (void);
+typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
+typedef void (APIENTRYP PFNGLLOGICOPPROC) (GLenum opcode);
+typedef void (APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
+typedef void (APIENTRYP PFNGLPIXELSTOREFPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLREADBUFFERPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+typedef void (APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *params);
+typedef void (APIENTRYP PFNGLGETDOUBLEVPROC) (GLenum pname, GLdouble *params);
+typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void);
+typedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params);
+typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
+typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params);
+typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
+typedef void (APIENTRYP PFNGLDEPTHRANGEPROC) (GLdouble near, GLdouble far);
+typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+
+#ifndef GL_VERSION_1_1
+#define GL_VERSION_1_1 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+GLAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params);
+GLAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GLAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+GLAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GLAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
+GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GLAPI GLboolean APIENTRY glIsTexture (GLuint texture);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+typedef void (APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, GLvoid* *params);
+typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units);
+typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
+typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
+typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
+typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture);
+#endif
+
+#ifndef GL_VERSION_1_2
+#define GL_VERSION_1_2 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GLAPI void APIENTRY glBlendEquation (GLenum mode);
+GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+
+#ifndef GL_VERSION_1_3
+#define GL_VERSION_1_3 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glActiveTexture (GLenum texture);
+GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img);
+#endif
+
+#ifndef GL_VERSION_1_4
+#define GL_VERSION_1_4 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param);
+GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);
+#endif
+
+#ifndef GL_VERSION_1_5
+#define GL_VERSION_1_5 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GLAPI GLboolean APIENTRY glIsQuery (GLuint id);
+GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id);
+GLAPI void APIENTRY glEndQuery (GLenum target);
+GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer);
+GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+GLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access);
+GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target);
+GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);
+typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);
+typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params);
+#endif
+
+#ifndef GL_VERSION_2_0
+#define GL_VERSION_2_0 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader);
+GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GLAPI void APIENTRY glCompileShader (GLuint shader);
+GLAPI GLuint APIENTRY glCreateProgram (void);
+GLAPI GLuint APIENTRY glCreateShader (GLenum type);
+GLAPI void APIENTRY glDeleteProgram (GLuint program);
+GLAPI void APIENTRY glDeleteShader (GLuint shader);
+GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader);
+GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index);
+GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index);
+GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params);
+GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer);
+GLAPI GLboolean APIENTRY glIsProgram (GLuint program);
+GLAPI GLboolean APIENTRY glIsShader (GLuint shader);
+GLAPI void APIENTRY glLinkProgram (GLuint program);
+GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+GLAPI void APIENTRY glUseProgram (GLuint program);
+GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0);
+GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GLAPI void APIENTRY glUniform1i (GLint location, GLint v0);
+GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glValidateProgram (GLuint program);
+GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x);
+GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x);
+GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y);
+GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);
+typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer);
+typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length);
+typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);
+#endif
+
+#ifndef GL_VERSION_2_1
+#define GL_VERSION_2_1 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#endif
+
+#ifndef GL_VERSION_3_0
+#define GL_VERSION_3_0 1
+/* OpenGL 3.0 also reuses entry points from these extensions: */
+/* ARB_framebuffer_object */
+/* ARB_map_buffer_range */
+/* ARB_vertex_array_object */
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);
+GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GLAPI void APIENTRY glEnablei (GLenum target, GLuint index);
+GLAPI void APIENTRY glDisablei (GLenum target, GLuint index);
+GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index);
+GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GLAPI void APIENTRY glEndTransformFeedback (void);
+GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp);
+GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode);
+GLAPI void APIENTRY glEndConditionalRender (void);
+GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x);
+GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y);
+GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z);
+GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x);
+GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y);
+GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z);
+GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name);
+GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0);
+GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params);
+GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
+typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index);
+typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index);
+typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index);
+typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode);
+typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp);
+typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode);
+typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+#endif
+
+#ifndef GL_VERSION_3_1
+#define GL_VERSION_3_1 1
+/* OpenGL 3.1 also reuses entry points from these extensions: */
+/* ARB_copy_buffer */
+/* ARB_uniform_buffer_object */
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer);
+GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount);
+typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index);
+#endif
+
+#ifndef GL_VERSION_3_2
+#define GL_VERSION_3_2 1
+/* OpenGL 3.2 also reuses entry points from these extensions: */
+/* ARB_draw_elements_base_vertex */
+/* ARB_provoking_vertex */
+/* ARB_sync */
+/* ARB_texture_multisample */
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+#endif
+
+#ifndef GL_VERSION_3_3
+#define GL_VERSION_3_3 1
+/* OpenGL 3.3 also reuses entry points from these extensions: */
+/* ARB_blend_func_extended */
+/* ARB_sampler_objects */
+/* ARB_explicit_attrib_location, but it has none */
+/* ARB_occlusion_query2 (no entry points) */
+/* ARB_shader_bit_encoding (no entry points) */
+/* ARB_texture_rgb10_a2ui (no entry points) */
+/* ARB_texture_swizzle (no entry points) */
+/* ARB_timer_query */
+/* ARB_vertex_type_2_10_10_10_rev */
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+#endif
+
+#ifndef GL_VERSION_4_0
+#define GL_VERSION_4_0 1
+/* OpenGL 4.0 also reuses entry points from these extensions: */
+/* ARB_texture_query_lod (no entry points) */
+/* ARB_draw_indirect */
+/* ARB_gpu_shader5 (no entry points) */
+/* ARB_gpu_shader_fp64 */
+/* ARB_shader_subroutine */
+/* ARB_tessellation_shader */
+/* ARB_texture_buffer_object_rgb32 (no entry points) */
+/* ARB_texture_cube_map_array (no entry points) */
+/* ARB_texture_gather (no entry points) */
+/* ARB_transform_feedback2 */
+/* ARB_transform_feedback3 */
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glMinSampleShading (GLfloat value);
+GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode);
+GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst);
+GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif
+
+#ifndef GL_VERSION_4_1
+#define GL_VERSION_4_1 1
+/* OpenGL 4.1 reuses entry points from these extensions: */
+/* ARB_ES2_compatibility */
+/* ARB_get_program_binary */
+/* ARB_separate_shader_objects */
+/* ARB_shader_precision (no entry points) */
+/* ARB_vertex_attrib_64bit */
+/* ARB_viewport_array */
+#endif
+
+#ifndef GL_VERSION_4_2
+#define GL_VERSION_4_2 1
+/* OpenGL 4.2 reuses entry points from these extensions: */
+/* ARB_base_instance */
+/* ARB_shading_language_420pack (no entry points) */
+/* ARB_transform_feedback_instanced */
+/* ARB_compressed_texture_pixel_storage (no entry points) */
+/* ARB_conservative_depth (no entry points) */
+/* ARB_internalformat_query */
+/* ARB_map_buffer_alignment (no entry points) */
+/* ARB_shader_atomic_counters */
+/* ARB_shader_image_load_store */
+/* ARB_shading_language_packing (no entry points) */
+/* ARB_texture_storage */
+#endif
+
+#ifndef GL_VERSION_4_3
+#define GL_VERSION_4_3 1
+/* OpenGL 4.3 reuses entry points from these extensions: */
+/* ARB_arrays_of_arrays (no entry points, GLSL only) */
+/* ARB_fragment_layer_viewport (no entry points, GLSL only) */
+/* ARB_shader_image_size (no entry points, GLSL only) */
+/* ARB_ES3_compatibility (no entry points) */
+/* ARB_clear_buffer_object */
+/* ARB_compute_shader */
+/* ARB_copy_image */
+/* KHR_debug (includes ARB_debug_output commands promoted to KHR without suffixes) */
+/* ARB_explicit_uniform_location (no entry points) */
+/* ARB_framebuffer_no_attachments */
+/* ARB_internalformat_query2 */
+/* ARB_invalidate_subdata */
+/* ARB_multi_draw_indirect */
+/* ARB_program_interface_query */
+/* ARB_robust_buffer_access_behavior (no entry points) */
+/* ARB_shader_storage_buffer_object */
+/* ARB_stencil_texturing (no entry points) */
+/* ARB_texture_buffer_range */
+/* ARB_texture_query_levels (no entry points) */
+/* ARB_texture_storage_multisample */
+/* ARB_texture_view */
+/* ARB_vertex_attrib_binding */
+#endif
+
+#ifndef GL_ARB_depth_buffer_float
+#define GL_ARB_depth_buffer_float 1
+#endif
+
+#ifndef GL_ARB_framebuffer_object
+#define GL_ARB_framebuffer_object 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer);
+GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target);
+GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGenerateMipmap (GLenum target);
+GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+#endif
+
+#ifndef GL_ARB_framebuffer_sRGB
+#define GL_ARB_framebuffer_sRGB 1
+#endif
+
+#ifndef GL_ARB_half_float_vertex
+#define GL_ARB_half_float_vertex 1
+#endif
+
+#ifndef GL_ARB_map_buffer_range
+#define GL_ARB_map_buffer_range 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+#endif
+
+#ifndef GL_ARB_texture_compression_rgtc
+#define GL_ARB_texture_compression_rgtc 1
+#endif
+
+#ifndef GL_ARB_texture_rg
+#define GL_ARB_texture_rg 1
+#endif
+
+#ifndef GL_ARB_vertex_array_object
+#define GL_ARB_vertex_array_object 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBindVertexArray (GLuint array);
+GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+#endif
+
+#ifndef GL_ARB_uniform_buffer_object
+#define GL_ARB_uniform_buffer_object 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+#endif
+
+#ifndef GL_ARB_copy_buffer
+#define GL_ARB_copy_buffer 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+#endif
+
+#ifndef GL_ARB_depth_clamp
+#define GL_ARB_depth_clamp 1
+#endif
+
+#ifndef GL_ARB_draw_elements_base_vertex
+#define GL_ARB_draw_elements_base_vertex 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex);
+#endif
+
+#ifndef GL_ARB_fragment_coord_conventions
+#define GL_ARB_fragment_coord_conventions 1
+#endif
+
+#ifndef GL_ARB_provoking_vertex
+#define GL_ARB_provoking_vertex 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glProvokingVertex (GLenum mode);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
+#endif
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_ARB_seamless_cube_map 1
+#endif
+
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GLAPI GLboolean APIENTRY glIsSync (GLsync sync);
+GLAPI void APIENTRY glDeleteSync (GLsync sync);
+GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params);
+GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+#endif
+
+#ifndef GL_ARB_texture_multisample
+#define GL_ARB_texture_multisample 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);
+GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);
+#endif
+
+#ifndef GL_ARB_vertex_array_bgra
+#define GL_ARB_vertex_array_bgra 1
+#endif
+
+#ifndef GL_ARB_draw_buffers_blend
+#define GL_ARB_draw_buffers_blend 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode);
+GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst);
+GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif
+
+#ifndef GL_ARB_sample_shading
+#define GL_ARB_sample_shading 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value);
+#endif
+
+#ifndef GL_ARB_texture_cube_map_array
+#define GL_ARB_texture_cube_map_array 1
+#endif
+
+#ifndef GL_ARB_texture_gather
+#define GL_ARB_texture_gather 1
+#endif
+
+#ifndef GL_ARB_texture_query_lod
+#define GL_ARB_texture_query_lod 1
+#endif
+
+#ifndef GL_ARB_shading_language_include
+#define GL_ARB_shading_language_include 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);
+GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name);
+GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length);
+GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name);
+GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);
+GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);
+typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);
+typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length);
+typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);
+typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params);
+#endif
+
+#ifndef GL_ARB_texture_compression_bptc
+#define GL_ARB_texture_compression_bptc 1
+#endif
+
+#ifndef GL_ARB_blend_func_extended
+#define GL_ARB_blend_func_extended 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name);
+#endif
+
+#ifndef GL_ARB_explicit_attrib_location
+#define GL_ARB_explicit_attrib_location 1
+#endif
+
+#ifndef GL_ARB_occlusion_query2
+#define GL_ARB_occlusion_query2 1
+#endif
+
+#ifndef GL_ARB_sampler_objects
+#define GL_ARB_sampler_objects 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler);
+GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param);
+GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param);
+GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params);
+#endif
+
+#ifndef GL_ARB_shader_bit_encoding
+#define GL_ARB_shader_bit_encoding 1
+#endif
+
+#ifndef GL_ARB_texture_rgb10_a2ui
+#define GL_ARB_texture_rgb10_a2ui 1
+#endif
+
+#ifndef GL_ARB_texture_swizzle
+#define GL_ARB_texture_swizzle 1
+#endif
+
+#ifndef GL_ARB_timer_query
+#define GL_ARB_timer_query 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target);
+GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params);
+GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params);
+#endif
+
+#ifndef GL_ARB_vertex_type_2_10_10_10_rev
+#define GL_ARB_vertex_type_2_10_10_10_rev 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value);
+GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value);
+GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value);
+GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value);
+GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value);
+GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value);
+GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color);
+GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color);
+GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color);
+GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color);
+GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color);
+GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color);
+GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value);
+typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color);
+typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color);
+typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+#endif
+
+#ifndef GL_ARB_draw_indirect
+#define GL_ARB_draw_indirect 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect);
+GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect);
+#endif
+
+#ifndef GL_ARB_gpu_shader5
+#define GL_ARB_gpu_shader5 1
+#endif
+
+#ifndef GL_ARB_gpu_shader_fp64
+#define GL_ARB_gpu_shader_fp64 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x);
+GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x);
+typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params);
+#endif
+
+#ifndef GL_ARB_shader_subroutine
+#define GL_ARB_shader_subroutine 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name);
+GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name);
+GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices);
+GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params);
+GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name);
+typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices);
+typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+#endif
+
+#ifndef GL_ARB_tessellation_shader
+#define GL_ARB_tessellation_shader 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value);
+GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);
+typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values);
+#endif
+
+#ifndef GL_ARB_texture_buffer_object_rgb32
+#define GL_ARB_texture_buffer_object_rgb32 1
+#endif
+
+#ifndef GL_ARB_transform_feedback2
+#define GL_ARB_transform_feedback2 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id);
+GLAPI void APIENTRY glPauseTransformFeedback (void);
+GLAPI void APIENTRY glResumeTransformFeedback (void);
+GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id);
+#endif
+
+#ifndef GL_ARB_transform_feedback3
+#define GL_ARB_transform_feedback3 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream);
+GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id);
+GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index);
+GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream);
+typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id);
+typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index);
+typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params);
+#endif
+
+#ifndef GL_ARB_ES2_compatibility
+#define GL_ARB_ES2_compatibility 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glReleaseShaderCompiler (void);
+GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GLAPI void APIENTRY glClearDepthf (GLfloat d);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);
+typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+#endif
+
+#ifndef GL_ARB_get_program_binary
+#define GL_ARB_get_program_binary 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
+typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+#endif
+
+#ifndef GL_ARB_separate_shader_objects
+#define GL_ARB_separate_shader_objects 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* const *strings);
+GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline);
+GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline);
+GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0);
+GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1);
+GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline);
+GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* const *strings);
+typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);
+typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+#endif
+
+#ifndef GL_ARB_vertex_attrib_64bit
+#define GL_ARB_vertex_attrib_64bit 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x);
+GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params);
+#endif
+
+#ifndef GL_ARB_viewport_array
+#define GL_ARB_viewport_array 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v);
+GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v);
+GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f);
+GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data);
+GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v);
+typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f);
+typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data);
+typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data);
+#endif
+
+#ifndef GL_ARB_cl_event
+#define GL_ARB_cl_event 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags);
+#endif
+
+#ifndef GL_ARB_debug_output
+#define GL_ARB_debug_output 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam);
+GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam);
+typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+#endif
+
+#ifndef GL_ARB_robustness
+#define GL_ARB_robustness 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void);
+GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img);
+GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);
+GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img);
+GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);
+typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img);
+typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);
+typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img);
+typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+#endif
+
+#ifndef GL_ARB_shader_stencil_export
+#define GL_ARB_shader_stencil_export 1
+#endif
+
+#ifndef GL_ARB_base_instance
+#define GL_ARB_base_instance 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+#endif
+
+#ifndef GL_ARB_shading_language_420pack
+#define GL_ARB_shading_language_420pack 1
+#endif
+
+#ifndef GL_ARB_transform_feedback_instanced
+#define GL_ARB_transform_feedback_instanced 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount);
+GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount);
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+#endif
+
+#ifndef GL_ARB_compressed_texture_pixel_storage
+#define GL_ARB_compressed_texture_pixel_storage 1
+#endif
+
+#ifndef GL_ARB_conservative_depth
+#define GL_ARB_conservative_depth 1
+#endif
+
+#ifndef GL_ARB_internalformat_query
+#define GL_ARB_internalformat_query 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+#endif
+
+#ifndef GL_ARB_map_buffer_alignment
+#define GL_ARB_map_buffer_alignment 1
+#endif
+
+#ifndef GL_ARB_shader_atomic_counters
+#define GL_ARB_shader_atomic_counters 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+#endif
+
+#ifndef GL_ARB_shader_image_load_store
+#define GL_ARB_shader_image_load_store 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
+#endif
+
+#ifndef GL_ARB_shading_language_packing
+#define GL_ARB_shading_language_packing 1
+#endif
+
+#ifndef GL_ARB_texture_storage
+#define GL_ARB_texture_storage 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#endif
+
+#ifndef GL_KHR_texture_compression_astc_ldr
+#define GL_KHR_texture_compression_astc_ldr 1
+#endif
+
+#ifndef GL_KHR_debug
+#define GL_KHR_debug 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam);
+GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+GLAPI void APIENTRY glPopDebugGroup (void);
+GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label);
+GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);
+typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void);
+typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label);
+typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+#endif
+
+#ifndef GL_ARB_arrays_of_arrays
+#define GL_ARB_arrays_of_arrays 1
+#endif
+
+#ifndef GL_ARB_clear_buffer_object
+#define GL_ARB_clear_buffer_object 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data);
+#endif
+
+#ifndef GL_ARB_compute_shader
+#define GL_ARB_compute_shader 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);
+#endif
+
+#ifndef GL_ARB_copy_image
+#define GL_ARB_copy_image 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glCopyImageSubData (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);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP 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);
+#endif
+
+#ifndef GL_ARB_texture_view
+#define GL_ARB_texture_view 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+#endif
+
+#ifndef GL_ARB_vertex_attrib_binding
+#define GL_ARB_vertex_attrib_binding 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
+GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
+GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex);
+GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);
+typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);
+typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);
+typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);
+#endif
+
+#ifndef GL_ARB_robustness_isolation
+#define GL_ARB_robustness_isolation 1
+#endif
+
+#ifndef GL_ARB_ES3_compatibility
+#define GL_ARB_ES3_compatibility 1
+#endif
+
+#ifndef GL_ARB_explicit_uniform_location
+#define GL_ARB_explicit_uniform_location 1
+#endif
+
+#ifndef GL_ARB_fragment_layer_viewport
+#define GL_ARB_fragment_layer_viewport 1
+#endif
+
+#ifndef GL_ARB_framebuffer_no_attachments
+#define GL_ARB_framebuffer_no_attachments 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);
+GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param);
+GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params);
+#endif
+
+#ifndef GL_ARB_internalformat_query2
+#define GL_ARB_internalformat_query2 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+#endif
+
+#ifndef GL_ARB_invalidate_subdata
+#define GL_ARB_invalidate_subdata 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level);
+GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length);
+GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer);
+GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);
+typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+
+#ifndef GL_ARB_multi_draw_indirect
+#define GL_ARB_multi_draw_indirect 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+#endif
+
+#ifndef GL_ARB_program_interface_query
+#define GL_ARB_program_interface_query 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+#endif
+
+#ifndef GL_ARB_robust_buffer_access_behavior
+#define GL_ARB_robust_buffer_access_behavior 1
+#endif
+
+#ifndef GL_ARB_shader_image_size
+#define GL_ARB_shader_image_size 1
+#endif
+
+#ifndef GL_ARB_shader_storage_buffer_object
+#define GL_ARB_shader_storage_buffer_object 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+#endif
+
+#ifndef GL_ARB_stencil_texturing
+#define GL_ARB_stencil_texturing 1
+#endif
+
+#ifndef GL_ARB_texture_buffer_range
+#define GL_ARB_texture_buffer_range 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+#endif
+
+#ifndef GL_ARB_texture_query_levels
+#define GL_ARB_texture_query_levels 1
+#endif
+
+#ifndef GL_ARB_texture_storage_multisample
+#define GL_ARB_texture_storage_multisample 1
+#ifdef GLCOREARB_PROTOTYPES
+GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#endif /* GLCOREARB_PROTOTYPES */
+typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glew.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glew.h
new file mode 100644
index 0000000..0cd6ae3
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glew.h
@@ -0,0 +1,16126 @@
+/*
+** The OpenGL Extension Wrangler Library
+** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
+** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
+** Copyright (C) 2002, Lev Povalahev
+** All rights reserved.
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+**
+** * Redistributions of source code must retain the above copyright notice,
+** this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright notice,
+** this list of conditions and the following disclaimer in the documentation
+** and/or other materials provided with the distribution.
+** * The name of the author may be used to endorse or promote products
+** derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+** THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * Mesa 3-D graphics library
+ * Version: 7.0
+ *
+ * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+** Copyright (c) 2007 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+#ifndef __glew_h__
+#define __glew_h__
+#define __GLEW_H__
+
+#if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H)
+#error gl.h included before glew.h
+#endif
+#if defined(__glext_h_) || defined(__GLEXT_H_)
+#error glext.h included before glew.h
+#endif
+#if defined(__gl_ATI_h_)
+#error glATI.h included before glew.h
+#endif
+
+#define __gl_h_
+#define __GL_H__
+#define __X_GL_H
+#define __glext_h_
+#define __GLEXT_H_
+#define __gl_ATI_h_
+
+#if defined(_WIN32)
+
+/*
+ * GLEW does not include <windows.h> to avoid name space pollution.
+ * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t
+ * defined properly.
+ */
+/* <windef.h> */
+#ifndef APIENTRY
+#define GLEW_APIENTRY_DEFINED
+# if defined(__MINGW32__) || defined(__CYGWIN__)
+# define APIENTRY __stdcall
+# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)
+# define APIENTRY __stdcall
+# else
+# define APIENTRY
+# endif
+#endif
+#ifndef GLAPI
+# if defined(__MINGW32__) || defined(__CYGWIN__)
+# define GLAPI extern
+# endif
+#endif
+/* <winnt.h> */
+#ifndef CALLBACK
+#define GLEW_CALLBACK_DEFINED
+# if defined(__MINGW32__) || defined(__CYGWIN__)
+# define CALLBACK __attribute__ ((__stdcall__))
+# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
+# define CALLBACK __stdcall
+# else
+# define CALLBACK
+# endif
+#endif
+/* <wingdi.h> and <winnt.h> */
+#ifndef WINGDIAPI
+#define GLEW_WINGDIAPI_DEFINED
+#define WINGDIAPI __declspec(dllimport)
+#endif
+/* <ctype.h> */
+#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED)
+typedef unsigned short wchar_t;
+# define _WCHAR_T_DEFINED
+#endif
+/* <stddef.h> */
+#if !defined(_W64)
+# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300
+# define _W64 __w64
+# else
+# define _W64
+# endif
+#endif
+#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__)
+# ifdef _WIN64
+typedef __int64 ptrdiff_t;
+# else
+typedef _W64 int ptrdiff_t;
+# endif
+# define _PTRDIFF_T_DEFINED
+# define _PTRDIFF_T_
+#endif
+
+#ifndef GLAPI
+# if defined(__MINGW32__) || defined(__CYGWIN__)
+# define GLAPI extern
+# else
+# define GLAPI WINGDIAPI
+# endif
+#endif
+
+#ifndef GLAPIENTRY
+#define GLAPIENTRY APIENTRY
+#endif
+
+/*
+ * GLEW_STATIC is defined for static library.
+ * GLEW_BUILD is defined for building the DLL library.
+ */
+
+#ifdef GLEW_STATIC
+# define GLEWAPI extern
+#else
+# ifdef GLEW_BUILD
+# define GLEWAPI extern __declspec(dllexport)
+# else
+# define GLEWAPI extern __declspec(dllimport)
+# endif
+#endif
+
+#else /* _UNIX */
+
+/*
+ * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO
+ * C. On my system, this amounts to _3 lines_ of included code, all of
+ * them pretty much harmless. If you know of a way of detecting 32 vs
+ * 64 _targets_ at compile time you are free to replace this with
+ * something that's portable. For now, _this_ is the portable solution.
+ * (mem, 2004-01-04)
+ */
+
+#include <stddef.h>
+
+/* SGI MIPSPro doesn't like stdint.h in C++ mode */
+/* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */
+
+#if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__)
+#include <inttypes.h>
+#else
+#include <stdint.h>
+#endif
+
+#define GLEW_APIENTRY_DEFINED
+#define APIENTRY
+
+/*
+ * GLEW_STATIC is defined for static library.
+ */
+
+#ifdef GLEW_STATIC
+# define GLEWAPI extern
+#else
+# if defined(__GNUC__) && __GNUC__>=4
+# define GLEWAPI extern __attribute__ ((visibility("default")))
+# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+# define GLEWAPI extern __global
+# else
+# define GLEWAPI extern
+# endif
+#endif
+
+/* <glu.h> */
+#ifndef GLAPI
+#define GLAPI extern
+#endif
+#ifndef GLAPIENTRY
+#define GLAPIENTRY
+#endif
+
+#endif /* _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ----------------------------- GL_VERSION_1_1 ---------------------------- */
+
+#ifndef GL_VERSION_1_1
+#define GL_VERSION_1_1 1
+
+typedef unsigned int GLenum;
+typedef unsigned int GLbitfield;
+typedef unsigned int GLuint;
+typedef int GLint;
+typedef int GLsizei;
+typedef unsigned char GLboolean;
+typedef signed char GLbyte;
+typedef short GLshort;
+typedef unsigned char GLubyte;
+typedef unsigned short GLushort;
+typedef unsigned long GLulong;
+typedef float GLfloat;
+typedef float GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void GLvoid;
+#if defined(_MSC_VER) && _MSC_VER < 1400
+typedef __int64 GLint64EXT;
+typedef unsigned __int64 GLuint64EXT;
+#elif defined(_MSC_VER) || defined(__BORLANDC__)
+typedef signed long long GLint64EXT;
+typedef unsigned long long GLuint64EXT;
+#else
+# if defined(__MINGW32__) || defined(__CYGWIN__)
+#include <inttypes.h>
+# endif
+typedef int64_t GLint64EXT;
+typedef uint64_t GLuint64EXT;
+#endif
+typedef GLint64EXT GLint64;
+typedef GLuint64EXT GLuint64;
+typedef struct __GLsync *GLsync;
+
+typedef char GLchar;
+
+#define GL_ZERO 0
+#define GL_FALSE 0
+#define GL_LOGIC_OP 0x0BF1
+#define GL_NONE 0
+#define GL_TEXTURE_COMPONENTS 0x1003
+#define GL_NO_ERROR 0
+#define GL_POINTS 0x0000
+#define GL_CURRENT_BIT 0x00000001
+#define GL_TRUE 1
+#define GL_ONE 1
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_POINT_BIT 0x00000002
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_LINE_STRIP 0x0003
+#define GL_LINE_BIT 0x00000004
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_QUADS 0x0007
+#define GL_QUAD_STRIP 0x0008
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON 0x0009
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_FOG_BIT 0x00000080
+#define GL_DEPTH_BUFFER_BIT 0x00000100
+#define GL_ACCUM 0x0100
+#define GL_LOAD 0x0101
+#define GL_RETURN 0x0102
+#define GL_MULT 0x0103
+#define GL_ADD 0x0104
+#define GL_NEVER 0x0200
+#define GL_ACCUM_BUFFER_BIT 0x00000200
+#define GL_LESS 0x0201
+#define GL_EQUAL 0x0202
+#define GL_LEQUAL 0x0203
+#define GL_GREATER 0x0204
+#define GL_NOTEQUAL 0x0205
+#define GL_GEQUAL 0x0206
+#define GL_ALWAYS 0x0207
+#define GL_SRC_COLOR 0x0300
+#define GL_ONE_MINUS_SRC_COLOR 0x0301
+#define GL_SRC_ALPHA 0x0302
+#define GL_ONE_MINUS_SRC_ALPHA 0x0303
+#define GL_DST_ALPHA 0x0304
+#define GL_ONE_MINUS_DST_ALPHA 0x0305
+#define GL_DST_COLOR 0x0306
+#define GL_ONE_MINUS_DST_COLOR 0x0307
+#define GL_SRC_ALPHA_SATURATE 0x0308
+#define GL_STENCIL_BUFFER_BIT 0x00000400
+#define GL_FRONT_LEFT 0x0400
+#define GL_FRONT_RIGHT 0x0401
+#define GL_BACK_LEFT 0x0402
+#define GL_BACK_RIGHT 0x0403
+#define GL_FRONT 0x0404
+#define GL_BACK 0x0405
+#define GL_LEFT 0x0406
+#define GL_RIGHT 0x0407
+#define GL_FRONT_AND_BACK 0x0408
+#define GL_AUX0 0x0409
+#define GL_AUX1 0x040A
+#define GL_AUX2 0x040B
+#define GL_AUX3 0x040C
+#define GL_INVALID_ENUM 0x0500
+#define GL_INVALID_VALUE 0x0501
+#define GL_INVALID_OPERATION 0x0502
+#define GL_STACK_OVERFLOW 0x0503
+#define GL_STACK_UNDERFLOW 0x0504
+#define GL_OUT_OF_MEMORY 0x0505
+#define GL_2D 0x0600
+#define GL_3D 0x0601
+#define GL_3D_COLOR 0x0602
+#define GL_3D_COLOR_TEXTURE 0x0603
+#define GL_4D_COLOR_TEXTURE 0x0604
+#define GL_PASS_THROUGH_TOKEN 0x0700
+#define GL_POINT_TOKEN 0x0701
+#define GL_LINE_TOKEN 0x0702
+#define GL_POLYGON_TOKEN 0x0703
+#define GL_BITMAP_TOKEN 0x0704
+#define GL_DRAW_PIXEL_TOKEN 0x0705
+#define GL_COPY_PIXEL_TOKEN 0x0706
+#define GL_LINE_RESET_TOKEN 0x0707
+#define GL_EXP 0x0800
+#define GL_VIEWPORT_BIT 0x00000800
+#define GL_EXP2 0x0801
+#define GL_CW 0x0900
+#define GL_CCW 0x0901
+#define GL_COEFF 0x0A00
+#define GL_ORDER 0x0A01
+#define GL_DOMAIN 0x0A02
+#define GL_CURRENT_COLOR 0x0B00
+#define GL_CURRENT_INDEX 0x0B01
+#define GL_CURRENT_NORMAL 0x0B02
+#define GL_CURRENT_TEXTURE_COORDS 0x0B03
+#define GL_CURRENT_RASTER_COLOR 0x0B04
+#define GL_CURRENT_RASTER_INDEX 0x0B05
+#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06
+#define GL_CURRENT_RASTER_POSITION 0x0B07
+#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08
+#define GL_CURRENT_RASTER_DISTANCE 0x0B09
+#define GL_POINT_SMOOTH 0x0B10
+#define GL_POINT_SIZE 0x0B11
+#define GL_POINT_SIZE_RANGE 0x0B12
+#define GL_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_LINE_SMOOTH 0x0B20
+#define GL_LINE_WIDTH 0x0B21
+#define GL_LINE_WIDTH_RANGE 0x0B22
+#define GL_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_LINE_STIPPLE 0x0B24
+#define GL_LINE_STIPPLE_PATTERN 0x0B25
+#define GL_LINE_STIPPLE_REPEAT 0x0B26
+#define GL_LIST_MODE 0x0B30
+#define GL_MAX_LIST_NESTING 0x0B31
+#define GL_LIST_BASE 0x0B32
+#define GL_LIST_INDEX 0x0B33
+#define GL_POLYGON_MODE 0x0B40
+#define GL_POLYGON_SMOOTH 0x0B41
+#define GL_POLYGON_STIPPLE 0x0B42
+#define GL_EDGE_FLAG 0x0B43
+#define GL_CULL_FACE 0x0B44
+#define GL_CULL_FACE_MODE 0x0B45
+#define GL_FRONT_FACE 0x0B46
+#define GL_LIGHTING 0x0B50
+#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51
+#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52
+#define GL_LIGHT_MODEL_AMBIENT 0x0B53
+#define GL_SHADE_MODEL 0x0B54
+#define GL_COLOR_MATERIAL_FACE 0x0B55
+#define GL_COLOR_MATERIAL_PARAMETER 0x0B56
+#define GL_COLOR_MATERIAL 0x0B57
+#define GL_FOG 0x0B60
+#define GL_FOG_INDEX 0x0B61
+#define GL_FOG_DENSITY 0x0B62
+#define GL_FOG_START 0x0B63
+#define GL_FOG_END 0x0B64
+#define GL_FOG_MODE 0x0B65
+#define GL_FOG_COLOR 0x0B66
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_DEPTH_TEST 0x0B71
+#define GL_DEPTH_WRITEMASK 0x0B72
+#define GL_DEPTH_CLEAR_VALUE 0x0B73
+#define GL_DEPTH_FUNC 0x0B74
+#define GL_ACCUM_CLEAR_VALUE 0x0B80
+#define GL_STENCIL_TEST 0x0B90
+#define GL_STENCIL_CLEAR_VALUE 0x0B91
+#define GL_STENCIL_FUNC 0x0B92
+#define GL_STENCIL_VALUE_MASK 0x0B93
+#define GL_STENCIL_FAIL 0x0B94
+#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
+#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
+#define GL_STENCIL_REF 0x0B97
+#define GL_STENCIL_WRITEMASK 0x0B98
+#define GL_MATRIX_MODE 0x0BA0
+#define GL_NORMALIZE 0x0BA1
+#define GL_VIEWPORT 0x0BA2
+#define GL_MODELVIEW_STACK_DEPTH 0x0BA3
+#define GL_PROJECTION_STACK_DEPTH 0x0BA4
+#define GL_TEXTURE_STACK_DEPTH 0x0BA5
+#define GL_MODELVIEW_MATRIX 0x0BA6
+#define GL_PROJECTION_MATRIX 0x0BA7
+#define GL_TEXTURE_MATRIX 0x0BA8
+#define GL_ATTRIB_STACK_DEPTH 0x0BB0
+#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1
+#define GL_ALPHA_TEST 0x0BC0
+#define GL_ALPHA_TEST_FUNC 0x0BC1
+#define GL_ALPHA_TEST_REF 0x0BC2
+#define GL_DITHER 0x0BD0
+#define GL_BLEND_DST 0x0BE0
+#define GL_BLEND_SRC 0x0BE1
+#define GL_BLEND 0x0BE2
+#define GL_LOGIC_OP_MODE 0x0BF0
+#define GL_INDEX_LOGIC_OP 0x0BF1
+#define GL_COLOR_LOGIC_OP 0x0BF2
+#define GL_AUX_BUFFERS 0x0C00
+#define GL_DRAW_BUFFER 0x0C01
+#define GL_READ_BUFFER 0x0C02
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_INDEX_CLEAR_VALUE 0x0C20
+#define GL_INDEX_WRITEMASK 0x0C21
+#define GL_COLOR_CLEAR_VALUE 0x0C22
+#define GL_COLOR_WRITEMASK 0x0C23
+#define GL_INDEX_MODE 0x0C30
+#define GL_RGBA_MODE 0x0C31
+#define GL_DOUBLEBUFFER 0x0C32
+#define GL_STEREO 0x0C33
+#define GL_RENDER_MODE 0x0C40
+#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50
+#define GL_POINT_SMOOTH_HINT 0x0C51
+#define GL_LINE_SMOOTH_HINT 0x0C52
+#define GL_POLYGON_SMOOTH_HINT 0x0C53
+#define GL_FOG_HINT 0x0C54
+#define GL_TEXTURE_GEN_S 0x0C60
+#define GL_TEXTURE_GEN_T 0x0C61
+#define GL_TEXTURE_GEN_R 0x0C62
+#define GL_TEXTURE_GEN_Q 0x0C63
+#define GL_PIXEL_MAP_I_TO_I 0x0C70
+#define GL_PIXEL_MAP_S_TO_S 0x0C71
+#define GL_PIXEL_MAP_I_TO_R 0x0C72
+#define GL_PIXEL_MAP_I_TO_G 0x0C73
+#define GL_PIXEL_MAP_I_TO_B 0x0C74
+#define GL_PIXEL_MAP_I_TO_A 0x0C75
+#define GL_PIXEL_MAP_R_TO_R 0x0C76
+#define GL_PIXEL_MAP_G_TO_G 0x0C77
+#define GL_PIXEL_MAP_B_TO_B 0x0C78
+#define GL_PIXEL_MAP_A_TO_A 0x0C79
+#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0
+#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1
+#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2
+#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3
+#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4
+#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5
+#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6
+#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7
+#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8
+#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9
+#define GL_UNPACK_SWAP_BYTES 0x0CF0
+#define GL_UNPACK_LSB_FIRST 0x0CF1
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#define GL_UNPACK_SKIP_ROWS 0x0CF3
+#define GL_UNPACK_SKIP_PIXELS 0x0CF4
+#define GL_UNPACK_ALIGNMENT 0x0CF5
+#define GL_PACK_SWAP_BYTES 0x0D00
+#define GL_PACK_LSB_FIRST 0x0D01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_PACK_SKIP_ROWS 0x0D03
+#define GL_PACK_SKIP_PIXELS 0x0D04
+#define GL_PACK_ALIGNMENT 0x0D05
+#define GL_MAP_COLOR 0x0D10
+#define GL_MAP_STENCIL 0x0D11
+#define GL_INDEX_SHIFT 0x0D12
+#define GL_INDEX_OFFSET 0x0D13
+#define GL_RED_SCALE 0x0D14
+#define GL_RED_BIAS 0x0D15
+#define GL_ZOOM_X 0x0D16
+#define GL_ZOOM_Y 0x0D17
+#define GL_GREEN_SCALE 0x0D18
+#define GL_GREEN_BIAS 0x0D19
+#define GL_BLUE_SCALE 0x0D1A
+#define GL_BLUE_BIAS 0x0D1B
+#define GL_ALPHA_SCALE 0x0D1C
+#define GL_ALPHA_BIAS 0x0D1D
+#define GL_DEPTH_SCALE 0x0D1E
+#define GL_DEPTH_BIAS 0x0D1F
+#define GL_MAX_EVAL_ORDER 0x0D30
+#define GL_MAX_LIGHTS 0x0D31
+#define GL_MAX_CLIP_PLANES 0x0D32
+#define GL_MAX_TEXTURE_SIZE 0x0D33
+#define GL_MAX_PIXEL_MAP_TABLE 0x0D34
+#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35
+#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36
+#define GL_MAX_NAME_STACK_DEPTH 0x0D37
+#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38
+#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39
+#define GL_MAX_VIEWPORT_DIMS 0x0D3A
+#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B
+#define GL_SUBPIXEL_BITS 0x0D50
+#define GL_INDEX_BITS 0x0D51
+#define GL_RED_BITS 0x0D52
+#define GL_GREEN_BITS 0x0D53
+#define GL_BLUE_BITS 0x0D54
+#define GL_ALPHA_BITS 0x0D55
+#define GL_DEPTH_BITS 0x0D56
+#define GL_STENCIL_BITS 0x0D57
+#define GL_ACCUM_RED_BITS 0x0D58
+#define GL_ACCUM_GREEN_BITS 0x0D59
+#define GL_ACCUM_BLUE_BITS 0x0D5A
+#define GL_ACCUM_ALPHA_BITS 0x0D5B
+#define GL_NAME_STACK_DEPTH 0x0D70
+#define GL_AUTO_NORMAL 0x0D80
+#define GL_MAP1_COLOR_4 0x0D90
+#define GL_MAP1_INDEX 0x0D91
+#define GL_MAP1_NORMAL 0x0D92
+#define GL_MAP1_TEXTURE_COORD_1 0x0D93
+#define GL_MAP1_TEXTURE_COORD_2 0x0D94
+#define GL_MAP1_TEXTURE_COORD_3 0x0D95
+#define GL_MAP1_TEXTURE_COORD_4 0x0D96
+#define GL_MAP1_VERTEX_3 0x0D97
+#define GL_MAP1_VERTEX_4 0x0D98
+#define GL_MAP2_COLOR_4 0x0DB0
+#define GL_MAP2_INDEX 0x0DB1
+#define GL_MAP2_NORMAL 0x0DB2
+#define GL_MAP2_TEXTURE_COORD_1 0x0DB3
+#define GL_MAP2_TEXTURE_COORD_2 0x0DB4
+#define GL_MAP2_TEXTURE_COORD_3 0x0DB5
+#define GL_MAP2_TEXTURE_COORD_4 0x0DB6
+#define GL_MAP2_VERTEX_3 0x0DB7
+#define GL_MAP2_VERTEX_4 0x0DB8
+#define GL_MAP1_GRID_DOMAIN 0x0DD0
+#define GL_MAP1_GRID_SEGMENTS 0x0DD1
+#define GL_MAP2_GRID_DOMAIN 0x0DD2
+#define GL_MAP2_GRID_SEGMENTS 0x0DD3
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0
+#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1
+#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2
+#define GL_SELECTION_BUFFER_POINTER 0x0DF3
+#define GL_SELECTION_BUFFER_SIZE 0x0DF4
+#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TRANSFORM_BIT 0x00001000
+#define GL_TEXTURE_HEIGHT 0x1001
+#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
+#define GL_TEXTURE_BORDER_COLOR 0x1004
+#define GL_TEXTURE_BORDER 0x1005
+#define GL_DONT_CARE 0x1100
+#define GL_FASTEST 0x1101
+#define GL_NICEST 0x1102
+#define GL_AMBIENT 0x1200
+#define GL_DIFFUSE 0x1201
+#define GL_SPECULAR 0x1202
+#define GL_POSITION 0x1203
+#define GL_SPOT_DIRECTION 0x1204
+#define GL_SPOT_EXPONENT 0x1205
+#define GL_SPOT_CUTOFF 0x1206
+#define GL_CONSTANT_ATTENUATION 0x1207
+#define GL_LINEAR_ATTENUATION 0x1208
+#define GL_QUADRATIC_ATTENUATION 0x1209
+#define GL_COMPILE 0x1300
+#define GL_COMPILE_AND_EXECUTE 0x1301
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_2_BYTES 0x1407
+#define GL_3_BYTES 0x1408
+#define GL_4_BYTES 0x1409
+#define GL_DOUBLE 0x140A
+#define GL_CLEAR 0x1500
+#define GL_AND 0x1501
+#define GL_AND_REVERSE 0x1502
+#define GL_COPY 0x1503
+#define GL_AND_INVERTED 0x1504
+#define GL_NOOP 0x1505
+#define GL_XOR 0x1506
+#define GL_OR 0x1507
+#define GL_NOR 0x1508
+#define GL_EQUIV 0x1509
+#define GL_INVERT 0x150A
+#define GL_OR_REVERSE 0x150B
+#define GL_COPY_INVERTED 0x150C
+#define GL_OR_INVERTED 0x150D
+#define GL_NAND 0x150E
+#define GL_SET 0x150F
+#define GL_EMISSION 0x1600
+#define GL_SHININESS 0x1601
+#define GL_AMBIENT_AND_DIFFUSE 0x1602
+#define GL_COLOR_INDEXES 0x1603
+#define GL_MODELVIEW 0x1700
+#define GL_PROJECTION 0x1701
+#define GL_TEXTURE 0x1702
+#define GL_COLOR 0x1800
+#define GL_DEPTH 0x1801
+#define GL_STENCIL 0x1802
+#define GL_COLOR_INDEX 0x1900
+#define GL_STENCIL_INDEX 0x1901
+#define GL_DEPTH_COMPONENT 0x1902
+#define GL_RED 0x1903
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#define GL_ALPHA 0x1906
+#define GL_RGB 0x1907
+#define GL_RGBA 0x1908
+#define GL_LUMINANCE 0x1909
+#define GL_LUMINANCE_ALPHA 0x190A
+#define GL_BITMAP 0x1A00
+#define GL_POINT 0x1B00
+#define GL_LINE 0x1B01
+#define GL_FILL 0x1B02
+#define GL_RENDER 0x1C00
+#define GL_FEEDBACK 0x1C01
+#define GL_SELECT 0x1C02
+#define GL_FLAT 0x1D00
+#define GL_SMOOTH 0x1D01
+#define GL_KEEP 0x1E00
+#define GL_REPLACE 0x1E01
+#define GL_INCR 0x1E02
+#define GL_DECR 0x1E03
+#define GL_VENDOR 0x1F00
+#define GL_RENDERER 0x1F01
+#define GL_VERSION 0x1F02
+#define GL_EXTENSIONS 0x1F03
+#define GL_S 0x2000
+#define GL_ENABLE_BIT 0x00002000
+#define GL_T 0x2001
+#define GL_R 0x2002
+#define GL_Q 0x2003
+#define GL_MODULATE 0x2100
+#define GL_DECAL 0x2101
+#define GL_TEXTURE_ENV_MODE 0x2200
+#define GL_TEXTURE_ENV_COLOR 0x2201
+#define GL_TEXTURE_ENV 0x2300
+#define GL_EYE_LINEAR 0x2400
+#define GL_OBJECT_LINEAR 0x2401
+#define GL_SPHERE_MAP 0x2402
+#define GL_TEXTURE_GEN_MODE 0x2500
+#define GL_OBJECT_PLANE 0x2501
+#define GL_EYE_PLANE 0x2502
+#define GL_NEAREST 0x2600
+#define GL_LINEAR 0x2601
+#define GL_NEAREST_MIPMAP_NEAREST 0x2700
+#define GL_LINEAR_MIPMAP_NEAREST 0x2701
+#define GL_NEAREST_MIPMAP_LINEAR 0x2702
+#define GL_LINEAR_MIPMAP_LINEAR 0x2703
+#define GL_TEXTURE_MAG_FILTER 0x2800
+#define GL_TEXTURE_MIN_FILTER 0x2801
+#define GL_TEXTURE_WRAP_S 0x2802
+#define GL_TEXTURE_WRAP_T 0x2803
+#define GL_CLAMP 0x2900
+#define GL_REPEAT 0x2901
+#define GL_POLYGON_OFFSET_UNITS 0x2A00
+#define GL_POLYGON_OFFSET_POINT 0x2A01
+#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_R3_G3_B2 0x2A10
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_C3F_V3F 0x2A24
+#define GL_N3F_V3F 0x2A25
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_V4F 0x2A28
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+#define GL_LIGHT0 0x4000
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+#define GL_HINT_BIT 0x00008000
+#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
+#define GL_ALPHA4 0x803B
+#define GL_ALPHA8 0x803C
+#define GL_ALPHA12 0x803D
+#define GL_ALPHA16 0x803E
+#define GL_LUMINANCE4 0x803F
+#define GL_LUMINANCE8 0x8040
+#define GL_LUMINANCE12 0x8041
+#define GL_LUMINANCE16 0x8042
+#define GL_LUMINANCE4_ALPHA4 0x8043
+#define GL_LUMINANCE6_ALPHA2 0x8044
+#define GL_LUMINANCE8_ALPHA8 0x8045
+#define GL_LUMINANCE12_ALPHA4 0x8046
+#define GL_LUMINANCE12_ALPHA12 0x8047
+#define GL_LUMINANCE16_ALPHA16 0x8048
+#define GL_INTENSITY 0x8049
+#define GL_INTENSITY4 0x804A
+#define GL_INTENSITY8 0x804B
+#define GL_INTENSITY12 0x804C
+#define GL_INTENSITY16 0x804D
+#define GL_RGB4 0x804F
+#define GL_RGB5 0x8050
+#define GL_RGB8 0x8051
+#define GL_RGB10 0x8052
+#define GL_RGB12 0x8053
+#define GL_RGB16 0x8054
+#define GL_RGBA2 0x8055
+#define GL_RGBA4 0x8056
+#define GL_RGB5_A1 0x8057
+#define GL_RGBA8 0x8058
+#define GL_RGB10_A2 0x8059
+#define GL_RGBA12 0x805A
+#define GL_RGBA16 0x805B
+#define GL_TEXTURE_RED_SIZE 0x805C
+#define GL_TEXTURE_GREEN_SIZE 0x805D
+#define GL_TEXTURE_BLUE_SIZE 0x805E
+#define GL_TEXTURE_ALPHA_SIZE 0x805F
+#define GL_TEXTURE_LUMINANCE_SIZE 0x8060
+#define GL_TEXTURE_INTENSITY_SIZE 0x8061
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_TEXTURE_PRIORITY 0x8066
+#define GL_TEXTURE_RESIDENT 0x8067
+#define GL_TEXTURE_BINDING_1D 0x8068
+#define GL_TEXTURE_BINDING_2D 0x8069
+#define GL_VERTEX_ARRAY 0x8074
+#define GL_NORMAL_ARRAY 0x8075
+#define GL_COLOR_ARRAY 0x8076
+#define GL_INDEX_ARRAY 0x8077
+#define GL_TEXTURE_COORD_ARRAY 0x8078
+#define GL_EDGE_FLAG_ARRAY 0x8079
+#define GL_VERTEX_ARRAY_SIZE 0x807A
+#define GL_VERTEX_ARRAY_TYPE 0x807B
+#define GL_VERTEX_ARRAY_STRIDE 0x807C
+#define GL_NORMAL_ARRAY_TYPE 0x807E
+#define GL_NORMAL_ARRAY_STRIDE 0x807F
+#define GL_COLOR_ARRAY_SIZE 0x8081
+#define GL_COLOR_ARRAY_TYPE 0x8082
+#define GL_COLOR_ARRAY_STRIDE 0x8083
+#define GL_INDEX_ARRAY_TYPE 0x8085
+#define GL_INDEX_ARRAY_STRIDE 0x8086
+#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A
+#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C
+#define GL_VERTEX_ARRAY_POINTER 0x808E
+#define GL_NORMAL_ARRAY_POINTER 0x808F
+#define GL_COLOR_ARRAY_POINTER 0x8090
+#define GL_INDEX_ARRAY_POINTER 0x8091
+#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
+#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
+#define GL_COLOR_INDEX1_EXT 0x80E2
+#define GL_COLOR_INDEX2_EXT 0x80E3
+#define GL_COLOR_INDEX4_EXT 0x80E4
+#define GL_COLOR_INDEX8_EXT 0x80E5
+#define GL_COLOR_INDEX12_EXT 0x80E6
+#define GL_COLOR_INDEX16_EXT 0x80E7
+#define GL_EVAL_BIT 0x00010000
+#define GL_LIST_BIT 0x00020000
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_ALL_ATTRIB_BITS 0x000fffff
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff
+
+GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value);
+GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref);
+GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);
+GLAPI void GLAPIENTRY glArrayElement (GLint i);
+GLAPI void GLAPIENTRY glBegin (GLenum mode);
+GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture);
+GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
+GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
+GLAPI void GLAPIENTRY glCallList (GLuint list);
+GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists);
+GLAPI void GLAPIENTRY glClear (GLbitfield mask);
+GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+GLAPI void GLAPIENTRY glClearDepth (GLclampd depth);
+GLAPI void GLAPIENTRY glClearIndex (GLfloat c);
+GLAPI void GLAPIENTRY glClearStencil (GLint s);
+GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation);
+GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);
+GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v);
+GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);
+GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);
+GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue);
+GLAPI void GLAPIENTRY glColor3iv (const GLint *v);
+GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);
+GLAPI void GLAPIENTRY glColor3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);
+GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v);
+GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);
+GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v);
+GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);
+GLAPI void GLAPIENTRY glColor3usv (const GLushort *v);
+GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
+GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v);
+GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);
+GLAPI void GLAPIENTRY glColor4iv (const GLint *v);
+GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);
+GLAPI void GLAPIENTRY glColor4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v);
+GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);
+GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v);
+GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);
+GLAPI void GLAPIENTRY glColor4usv (const GLushort *v);
+GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode);
+GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
+GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);
+GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void GLAPIENTRY glCullFace (GLenum mode);
+GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range);
+GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
+GLAPI void GLAPIENTRY glDepthFunc (GLenum func);
+GLAPI void GLAPIENTRY glDepthMask (GLboolean flag);
+GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);
+GLAPI void GLAPIENTRY glDisable (GLenum cap);
+GLAPI void GLAPIENTRY glDisableClientState (GLenum array);
+GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
+GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode);
+GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag);
+GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag);
+GLAPI void GLAPIENTRY glEnable (GLenum cap);
+GLAPI void GLAPIENTRY glEnableClientState (GLenum array);
+GLAPI void GLAPIENTRY glEnd (void);
+GLAPI void GLAPIENTRY glEndList (void);
+GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u);
+GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u);
+GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u);
+GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u);
+GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v);
+GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u);
+GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v);
+GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u);
+GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);
+GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
+GLAPI void GLAPIENTRY glEvalPoint1 (GLint i);
+GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j);
+GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);
+GLAPI void GLAPIENTRY glFinish (void);
+GLAPI void GLAPIENTRY glFlush (void);
+GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glFrontFace (GLenum mode);
+GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range);
+GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures);
+GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params);
+GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);
+GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params);
+GLAPI GLenum GLAPIENTRY glGetError (void);
+GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);
+GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);
+GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);
+GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);
+GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);
+GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values);
+GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params);
+GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask);
+GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name);
+GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);
+GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
+GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode);
+GLAPI void GLAPIENTRY glIndexMask (GLuint mask);
+GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glIndexd (GLdouble c);
+GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c);
+GLAPI void GLAPIENTRY glIndexf (GLfloat c);
+GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c);
+GLAPI void GLAPIENTRY glIndexi (GLint c);
+GLAPI void GLAPIENTRY glIndexiv (const GLint *c);
+GLAPI void GLAPIENTRY glIndexs (GLshort c);
+GLAPI void GLAPIENTRY glIndexsv (const GLshort *c);
+GLAPI void GLAPIENTRY glIndexub (GLubyte c);
+GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c);
+GLAPI void GLAPIENTRY glInitNames (void);
+GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer);
+GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap);
+GLAPI GLboolean GLAPIENTRY glIsList (GLuint list);
+GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture);
+GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern);
+GLAPI void GLAPIENTRY glLineWidth (GLfloat width);
+GLAPI void GLAPIENTRY glListBase (GLuint base);
+GLAPI void GLAPIENTRY glLoadIdentity (void);
+GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m);
+GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m);
+GLAPI void GLAPIENTRY glLoadName (GLuint name);
+GLAPI void GLAPIENTRY glLogicOp (GLenum opcode);
+GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+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);
+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);
+GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);
+GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);
+GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
+GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
+GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glMatrixMode (GLenum mode);
+GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m);
+GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m);
+GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode);
+GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);
+GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v);
+GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);
+GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
+GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);
+GLAPI void GLAPIENTRY glNormal3iv (const GLint *v);
+GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);
+GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+GLAPI void GLAPIENTRY glPassThrough (GLfloat token);
+GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);
+GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);
+GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);
+GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);
+GLAPI void GLAPIENTRY glPointSize (GLfloat size);
+GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode);
+GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
+GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask);
+GLAPI void GLAPIENTRY glPopAttrib (void);
+GLAPI void GLAPIENTRY glPopClientAttrib (void);
+GLAPI void GLAPIENTRY glPopMatrix (void);
+GLAPI void GLAPIENTRY glPopName (void);
+GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);
+GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask);
+GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask);
+GLAPI void GLAPIENTRY glPushMatrix (void);
+GLAPI void GLAPIENTRY glPushName (GLuint name);
+GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y);
+GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y);
+GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y);
+GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v);
+GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y);
+GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v);
+GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z);
+GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v);
+GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);
+GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);
+GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v);
+GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glReadBuffer (GLenum mode);
+GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
+GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);
+GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
+GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);
+GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);
+GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2);
+GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);
+GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2);
+GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode);
+GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);
+GLAPI void GLAPIENTRY glShadeModel (GLenum mode);
+GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
+GLAPI void GLAPIENTRY glStencilMask (GLuint mask);
+GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
+GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s);
+GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s);
+GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord1i (GLint s);
+GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord1s (GLshort s);
+GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t);
+GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t);
+GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t);
+GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t);
+GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);
+GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);
+GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r);
+GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);
+GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);
+GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v);
+GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);
+GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);
+GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);
+GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
+GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
+GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y);
+GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y);
+GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y);
+GLAPI void GLAPIENTRY glVertex2iv (const GLint *v);
+GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y);
+GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v);
+GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z);
+GLAPI void GLAPIENTRY glVertex3iv (const GLint *v);
+GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);
+GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v);
+GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v);
+GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v);
+GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);
+GLAPI void GLAPIENTRY glVertex4iv (const GLint *v);
+GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v);
+GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1)
+
+#endif /* GL_VERSION_1_1 */
+
+/* ---------------------------------- GLU ---------------------------------- */
+
+#ifndef GLEW_NO_GLU
+/* this is where we can safely include GLU */
+# if defined(__APPLE__) && defined(__MACH__)
+# include <OpenGL/glu.h>
+# else
+# include <GL/glu.h>
+# endif
+#endif
+
+/* ----------------------------- GL_VERSION_1_2 ---------------------------- */
+
+#ifndef GL_VERSION_1_2
+#define GL_VERSION_1_2 1
+
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_UNSIGNED_BYTE_3_3_2 0x8032
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_INT_8_8_8_8 0x8035
+#define GL_UNSIGNED_INT_10_10_10_2 0x8036
+#define GL_RESCALE_NORMAL 0x803A
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_PACK_SKIP_IMAGES 0x806B
+#define GL_PACK_IMAGE_HEIGHT 0x806C
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_PROXY_TEXTURE_3D 0x8070
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_BGR 0x80E0
+#define GL_BGRA 0x80E1
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
+#define GL_SINGLE_COLOR 0x81F9
+#define GL_SEPARATE_SPECULAR_COLOR 0x81FA
+#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
+#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+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 GLvoid *pixels);
+
+#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D)
+#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)
+#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D)
+#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D)
+
+#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2)
+
+#endif /* GL_VERSION_1_2 */
+
+/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */
+
+#ifndef GL_VERSION_1_2_1
+#define GL_VERSION_1_2_1 1
+
+#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1)
+
+#endif /* GL_VERSION_1_2_1 */
+
+/* ----------------------------- GL_VERSION_1_3 ---------------------------- */
+
+#ifndef GL_VERSION_1_3
+#define GL_VERSION_1_3 1
+
+#define GL_MULTISAMPLE 0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_CLAMP_TO_BORDER 0x812D
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
+#define GL_MAX_TEXTURE_UNITS 0x84E2
+#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3
+#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
+#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
+#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
+#define GL_SUBTRACT 0x84E7
+#define GL_COMPRESSED_ALPHA 0x84E9
+#define GL_COMPRESSED_LUMINANCE 0x84EA
+#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB
+#define GL_COMPRESSED_INTENSITY 0x84EC
+#define GL_COMPRESSED_RGB 0x84ED
+#define GL_COMPRESSED_RGBA 0x84EE
+#define GL_TEXTURE_COMPRESSION_HINT 0x84EF
+#define GL_NORMAL_MAP 0x8511
+#define GL_REFLECTION_MAP 0x8512
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_COMBINE 0x8570
+#define GL_COMBINE_RGB 0x8571
+#define GL_COMBINE_ALPHA 0x8572
+#define GL_RGB_SCALE 0x8573
+#define GL_ADD_SIGNED 0x8574
+#define GL_INTERPOLATE 0x8575
+#define GL_CONSTANT 0x8576
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_PREVIOUS 0x8578
+#define GL_SOURCE0_RGB 0x8580
+#define GL_SOURCE1_RGB 0x8581
+#define GL_SOURCE2_RGB 0x8582
+#define GL_SOURCE0_ALPHA 0x8588
+#define GL_SOURCE1_ALPHA 0x8589
+#define GL_SOURCE2_ALPHA 0x858A
+#define GL_OPERAND0_RGB 0x8590
+#define GL_OPERAND1_RGB 0x8591
+#define GL_OPERAND2_RGB 0x8592
+#define GL_OPERAND0_ALPHA 0x8598
+#define GL_OPERAND1_ALPHA 0x8599
+#define GL_OPERAND2_ALPHA 0x859A
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_DOT3_RGB 0x86AE
+#define GL_DOT3_RGBA 0x86AF
+#define GL_MULTISAMPLE_BIT 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
+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 GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img);
+typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);
+typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);
+
+#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture)
+#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture)
+#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D)
+#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D)
+#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D)
+#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D)
+#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D)
+#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D)
+#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage)
+#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd)
+#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf)
+#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd)
+#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf)
+#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d)
+#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv)
+#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f)
+#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv)
+#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i)
+#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv)
+#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s)
+#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv)
+#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d)
+#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv)
+#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f)
+#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv)
+#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i)
+#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv)
+#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s)
+#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv)
+#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d)
+#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv)
+#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f)
+#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv)
+#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i)
+#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv)
+#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s)
+#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv)
+#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d)
+#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv)
+#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f)
+#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv)
+#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i)
+#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv)
+#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s)
+#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv)
+#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage)
+
+#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3)
+
+#endif /* GL_VERSION_1_3 */
+
+/* ----------------------------- GL_VERSION_1_4 ---------------------------- */
+
+#ifndef GL_VERSION_1_4
+#define GL_VERSION_1_4 1
+
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_POINT_SIZE_MIN 0x8126
+#define GL_POINT_SIZE_MAX 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#define GL_GENERATE_MIPMAP 0x8191
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_DEPTH_COMPONENT32 0x81A7
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_FOG_COORDINATE_SOURCE 0x8450
+#define GL_FOG_COORDINATE 0x8451
+#define GL_FRAGMENT_DEPTH 0x8452
+#define GL_CURRENT_FOG_COORDINATE 0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456
+#define GL_FOG_COORDINATE_ARRAY 0x8457
+#define GL_COLOR_SUM 0x8458
+#define GL_CURRENT_SECONDARY_COLOR 0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A
+#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C
+#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D
+#define GL_SECONDARY_COLOR_ARRAY 0x845E
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_FILTER_CONTROL 0x8500
+#define GL_TEXTURE_LOD_BIAS 0x8501
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_DEPTH_TEXTURE_MODE 0x884B
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_COMPARE_R_TO_TEXTURE 0x884E
+
+typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p);
+
+#define glBlendColor GLEW_GET_FUN(__glewBlendColor)
+#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation)
+#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate)
+#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer)
+#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd)
+#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv)
+#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf)
+#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv)
+#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays)
+#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements)
+#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf)
+#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv)
+#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri)
+#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv)
+#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b)
+#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv)
+#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d)
+#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv)
+#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f)
+#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv)
+#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i)
+#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv)
+#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s)
+#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv)
+#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub)
+#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv)
+#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui)
+#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv)
+#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us)
+#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv)
+#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer)
+#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d)
+#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv)
+#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f)
+#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv)
+#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i)
+#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv)
+#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s)
+#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv)
+#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d)
+#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv)
+#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f)
+#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv)
+#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i)
+#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv)
+#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s)
+#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv)
+
+#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4)
+
+#endif /* GL_VERSION_1_4 */
+
+/* ----------------------------- GL_VERSION_1_5 ---------------------------- */
+
+#ifndef GL_VERSION_1_5
+#define GL_VERSION_1_5 1
+
+#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE
+#define GL_FOG_COORD GL_FOG_COORDINATE
+#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY
+#define GL_SRC0_RGB GL_SOURCE0_RGB
+#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER
+#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE
+#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA
+#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE
+#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE
+#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA
+#define GL_SRC1_RGB GL_SOURCE1_RGB
+#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING
+#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA
+#define GL_SRC2_RGB GL_SOURCE2_RGB
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_QUERY_COUNTER_BITS 0x8864
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#define GL_BUFFER_ACCESS 0x88BB
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_SAMPLES_PASSED 0x8914
+
+typedef ptrdiff_t GLintptr;
+typedef ptrdiff_t GLsizeiptr;
+
+typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
+typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
+typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer);
+typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id);
+typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);
+typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target);
+
+#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery)
+#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer)
+#define glBufferData GLEW_GET_FUN(__glewBufferData)
+#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData)
+#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers)
+#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries)
+#define glEndQuery GLEW_GET_FUN(__glewEndQuery)
+#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers)
+#define glGenQueries GLEW_GET_FUN(__glewGenQueries)
+#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv)
+#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv)
+#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData)
+#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv)
+#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv)
+#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv)
+#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer)
+#define glIsQuery GLEW_GET_FUN(__glewIsQuery)
+#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer)
+#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer)
+
+#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5)
+
+#endif /* GL_VERSION_1_5 */
+
+/* ----------------------------- GL_VERSION_2_0 ---------------------------- */
+
+#ifndef GL_VERSION_2_0
+#define GL_VERSION_2_0 1
+
+#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_POINT_SPRITE 0x8861
+#define GL_COORD_REPLACE 0x8862
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_MAX_TEXTURE_COORDS 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_MAX_VARYING_FLOATS 0x8B4B
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_1D 0x8B5D
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_SAMPLER_1D_SHADOW 0x8B61
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_DELETE_STATUS 0x8B80
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0
+#define GL_LOWER_LEFT 0x8CA1
+#define GL_UPPER_LEFT 0x8CA2
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+
+typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum);
+typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint);
+typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);
+typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param);
+typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
+typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source);
+typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param);
+typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid**);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*);
+typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader);
+typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths);
+typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint);
+typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer);
+
+#define glAttachShader GLEW_GET_FUN(__glewAttachShader)
+#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation)
+#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate)
+#define glCompileShader GLEW_GET_FUN(__glewCompileShader)
+#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram)
+#define glCreateShader GLEW_GET_FUN(__glewCreateShader)
+#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram)
+#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader)
+#define glDetachShader GLEW_GET_FUN(__glewDetachShader)
+#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray)
+#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers)
+#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray)
+#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib)
+#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform)
+#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders)
+#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation)
+#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog)
+#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv)
+#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog)
+#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource)
+#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv)
+#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation)
+#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv)
+#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv)
+#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv)
+#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv)
+#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv)
+#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv)
+#define glIsProgram GLEW_GET_FUN(__glewIsProgram)
+#define glIsShader GLEW_GET_FUN(__glewIsShader)
+#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram)
+#define glShaderSource GLEW_GET_FUN(__glewShaderSource)
+#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate)
+#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate)
+#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate)
+#define glUniform1f GLEW_GET_FUN(__glewUniform1f)
+#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv)
+#define glUniform1i GLEW_GET_FUN(__glewUniform1i)
+#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv)
+#define glUniform2f GLEW_GET_FUN(__glewUniform2f)
+#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv)
+#define glUniform2i GLEW_GET_FUN(__glewUniform2i)
+#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv)
+#define glUniform3f GLEW_GET_FUN(__glewUniform3f)
+#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv)
+#define glUniform3i GLEW_GET_FUN(__glewUniform3i)
+#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv)
+#define glUniform4f GLEW_GET_FUN(__glewUniform4f)
+#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv)
+#define glUniform4i GLEW_GET_FUN(__glewUniform4i)
+#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv)
+#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv)
+#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv)
+#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv)
+#define glUseProgram GLEW_GET_FUN(__glewUseProgram)
+#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram)
+#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d)
+#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv)
+#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f)
+#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv)
+#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s)
+#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv)
+#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d)
+#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv)
+#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f)
+#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv)
+#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s)
+#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv)
+#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d)
+#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv)
+#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f)
+#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv)
+#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s)
+#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv)
+#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv)
+#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv)
+#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv)
+#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub)
+#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv)
+#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv)
+#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv)
+#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv)
+#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d)
+#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv)
+#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f)
+#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv)
+#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv)
+#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s)
+#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv)
+#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv)
+#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv)
+#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv)
+#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer)
+
+#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0)
+
+#endif /* GL_VERSION_2_0 */
+
+/* ----------------------------- GL_VERSION_2_1 ---------------------------- */
+
+#ifndef GL_VERSION_2_1
+#define GL_VERSION_2_1 1
+
+#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB_ALPHA 0x8C42
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_SLUMINANCE_ALPHA 0x8C44
+#define GL_SLUMINANCE8_ALPHA8 0x8C45
+#define GL_SLUMINANCE 0x8C46
+#define GL_SLUMINANCE8 0x8C47
+#define GL_COMPRESSED_SRGB 0x8C48
+#define GL_COMPRESSED_SRGB_ALPHA 0x8C49
+#define GL_COMPRESSED_SLUMINANCE 0x8C4A
+#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B
+
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+
+#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv)
+#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv)
+#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv)
+#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv)
+#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv)
+#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv)
+
+#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1)
+
+#endif /* GL_VERSION_2_1 */
+
+/* ----------------------------- GL_VERSION_3_0 ---------------------------- */
+
+#ifndef GL_VERSION_3_0
+#define GL_VERSION_3_0 1
+
+#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES
+#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5
+#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1
+#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3
+#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB
+#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0
+#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4
+#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2
+#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS
+#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_CONTEXT_FLAGS 0x821E
+#define GL_DEPTH_BUFFER 0x8223
+#define GL_STENCIL_BUFFER 0x8224
+#define GL_COMPRESSED_RED 0x8225
+#define GL_COMPRESSED_RG 0x8226
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_CLAMP_VERTEX_COLOR 0x891A
+#define GL_CLAMP_FRAGMENT_COLOR 0x891B
+#define GL_CLAMP_READ_COLOR 0x891C
+#define GL_FIXED_ONLY 0x891D
+#define GL_TEXTURE_RED_TYPE 0x8C10
+#define GL_TEXTURE_GREEN_TYPE 0x8C11
+#define GL_TEXTURE_BLUE_TYPE 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE 0x8C13
+#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14
+#define GL_TEXTURE_INTENSITY_TYPE 0x8C15
+#define GL_TEXTURE_DEPTH_TYPE 0x8C16
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_TEXTURE_1D_ARRAY 0x8C18
+#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B
+#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TEXTURE_SHARED_SIZE 0x8C3F
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_PRIMITIVES_GENERATED 0x8C87
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_GREEN_INTEGER 0x8D95
+#define GL_BLUE_INTEGER 0x8D96
+#define GL_ALPHA_INTEGER 0x8D97
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_BGR_INTEGER 0x8D9A
+#define GL_BGRA_INTEGER 0x8D9B
+#define GL_SAMPLER_1D_ARRAY 0x8DC0
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_1D 0x8DC9
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_QUERY_WAIT 0x8E13
+#define GL_QUERY_NO_WAIT 0x8E14
+#define GL_QUERY_BY_REGION_WAIT 0x8E15
+#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16
+
+typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint, GLenum);
+typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum);
+typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint, GLuint, const GLchar*);
+typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum, GLenum);
+typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum, GLint, GLfloat, GLint);
+typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum, GLint, const GLfloat*);
+typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum, GLint, const GLint*);
+typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum, GLint, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean);
+typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum, GLuint);
+typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum, GLuint);
+typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void);
+typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum, GLuint, GLboolean*);
+typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint, const GLchar*);
+typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum, GLuint);
+typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum, GLenum, GLint*);
+typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum, GLenum, GLuint*);
+typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint, GLint, GLuint*);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint, GLenum, GLint*);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint, GLenum, GLuint*);
+typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum, GLuint);
+typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum, GLenum, const GLint*);
+typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum, GLenum, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint, GLsizei, const GLchar **, GLenum);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint, GLuint);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint, GLsizei, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint, GLuint, GLuint);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint, GLsizei, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint, GLuint, GLuint, GLuint);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint, GLsizei, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint, GLuint, GLuint, GLuint, GLuint);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint, GLsizei, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint, GLint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint, const GLint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint, GLuint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint, GLint, GLint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint, const GLint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint, GLuint, GLuint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint, GLint, GLint, GLint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint, const GLint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint, GLuint, GLuint, GLuint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint, const GLbyte*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint, GLint, GLint, GLint, GLint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint, const GLint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint, const GLshort*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint, const GLubyte*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint, GLuint, GLuint, GLuint, GLuint);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint, const GLuint*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint, const GLushort*);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint, GLint, GLenum, GLsizei, const GLvoid*);
+
+#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender)
+#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback)
+#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation)
+#define glClampColor GLEW_GET_FUN(__glewClampColor)
+#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi)
+#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv)
+#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv)
+#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv)
+#define glColorMaski GLEW_GET_FUN(__glewColorMaski)
+#define glDisablei GLEW_GET_FUN(__glewDisablei)
+#define glEnablei GLEW_GET_FUN(__glewEnablei)
+#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender)
+#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback)
+#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v)
+#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation)
+#define glGetStringi GLEW_GET_FUN(__glewGetStringi)
+#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv)
+#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv)
+#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying)
+#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv)
+#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv)
+#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv)
+#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi)
+#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv)
+#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv)
+#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings)
+#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui)
+#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv)
+#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui)
+#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv)
+#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui)
+#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv)
+#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui)
+#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv)
+#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i)
+#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv)
+#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui)
+#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv)
+#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i)
+#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv)
+#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui)
+#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv)
+#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i)
+#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv)
+#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui)
+#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv)
+#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv)
+#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i)
+#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv)
+#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv)
+#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv)
+#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui)
+#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv)
+#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv)
+#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer)
+
+#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0)
+
+#endif /* GL_VERSION_3_0 */
+
+/* ----------------------------- GL_VERSION_3_1 ---------------------------- */
+
+#ifndef GL_VERSION_3_1
+#define GL_VERSION_3_1 1
+
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8
+#define GL_SAMPLER_2D_RECT 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64
+#define GL_TEXTURE_BUFFER 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
+#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E
+#define GL_SAMPLER_BUFFER 0x8DC2
+#define GL_INT_SAMPLER_2D_RECT 0x8DCD
+#define GL_INT_SAMPLER_BUFFER 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8
+#define GL_RED_SNORM 0x8F90
+#define GL_RG_SNORM 0x8F91
+#define GL_RGB_SNORM 0x8F92
+#define GL_RGBA_SNORM 0x8F93
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_R16_SNORM 0x8F98
+#define GL_RG16_SNORM 0x8F99
+#define GL_RGB16_SNORM 0x8F9A
+#define GL_RGBA16_SNORM 0x8F9B
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART 0x8F9D
+#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum, GLint, GLsizei, GLsizei);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum, GLsizei, GLenum, const GLvoid*, GLsizei);
+typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint);
+typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum, GLenum, GLuint);
+
+#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced)
+#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced)
+#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex)
+#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer)
+
+#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1)
+
+#endif /* GL_VERSION_3_1 */
+
+/* ----------------------------- GL_VERSION_3_2 ---------------------------- */
+
+#ifndef GL_VERSION_3_2
+#define GL_VERSION_3_2 1
+
+#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define GL_LINES_ADJACENCY 0x000A
+#define GL_LINE_STRIP_ADJACENCY 0x000B
+#define GL_TRIANGLES_ADJACENCY 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D
+#define GL_PROGRAM_POINT_SIZE 0x8642
+#define GL_GEOMETRY_VERTICES_OUT 0x8916
+#define GL_GEOMETRY_INPUT_TYPE 0x8917
+#define GL_GEOMETRY_OUTPUT_TYPE 0x8918
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_GEOMETRY_SHADER 0x8DD9
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_CONTEXT_PROFILE_MASK 0x9126
+
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum, GLenum, GLuint, GLint);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum, GLenum, GLint64 *);
+typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum, GLuint, GLint64 *);
+
+#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture)
+#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v)
+#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v)
+
+#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2)
+
+#endif /* GL_VERSION_3_2 */
+
+/* ----------------------------- GL_VERSION_3_3 ---------------------------- */
+
+#ifndef GL_VERSION_3_3
+#define GL_VERSION_3_3 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
+#define GL_RGB10_A2UI 0x906F
+
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+
+#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor)
+
+#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3)
+
+#endif /* GL_VERSION_3_3 */
+
+/* ----------------------------- GL_VERSION_4_0 ---------------------------- */
+
+#ifndef GL_VERSION_4_0
+#define GL_VERSION_4_0 1
+
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_SAMPLE_SHADING 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F
+#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value);
+
+#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei)
+#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi)
+#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei)
+#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci)
+#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading)
+
+#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0)
+
+#endif /* GL_VERSION_4_0 */
+
+/* ----------------------------- GL_VERSION_4_1 ---------------------------- */
+
+#ifndef GL_VERSION_4_1
+#define GL_VERSION_4_1 1
+
+#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1)
+
+#endif /* GL_VERSION_4_1 */
+
+/* ----------------------------- GL_VERSION_4_2 ---------------------------- */
+
+#ifndef GL_VERSION_4_2
+#define GL_VERSION_4_2 1
+
+#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2)
+
+#endif /* GL_VERSION_4_2 */
+
+/* -------------------------- GL_3DFX_multisample -------------------------- */
+
+#ifndef GL_3DFX_multisample
+#define GL_3DFX_multisample 1
+
+#define GL_MULTISAMPLE_3DFX 0x86B2
+#define GL_SAMPLE_BUFFERS_3DFX 0x86B3
+#define GL_SAMPLES_3DFX 0x86B4
+#define GL_MULTISAMPLE_BIT_3DFX 0x20000000
+
+#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample)
+
+#endif /* GL_3DFX_multisample */
+
+/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */
+
+#ifndef GL_3DFX_tbuffer
+#define GL_3DFX_tbuffer 1
+
+typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);
+
+#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX)
+
+#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer)
+
+#endif /* GL_3DFX_tbuffer */
+
+/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */
+
+#ifndef GL_3DFX_texture_compression_FXT1
+#define GL_3DFX_texture_compression_FXT1 1
+
+#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0
+#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1
+
+#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1)
+
+#endif /* GL_3DFX_texture_compression_FXT1 */
+
+/* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */
+
+#ifndef GL_AMD_blend_minmax_factor
+#define GL_AMD_blend_minmax_factor 1
+
+#define GL_FACTOR_MIN_AMD 0x901C
+#define GL_FACTOR_MAX_AMD 0x901D
+
+#define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor)
+
+#endif /* GL_AMD_blend_minmax_factor */
+
+/* ----------------------- GL_AMD_conservative_depth ----------------------- */
+
+#ifndef GL_AMD_conservative_depth
+#define GL_AMD_conservative_depth 1
+
+#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth)
+
+#endif /* GL_AMD_conservative_depth */
+
+/* -------------------------- GL_AMD_debug_output -------------------------- */
+
+#ifndef GL_AMD_debug_output
+#define GL_AMD_debug_output 1
+
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147
+#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148
+#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149
+#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A
+#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B
+#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C
+#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D
+#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E
+#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F
+#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150
+
+typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam);
+
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void* userParam);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const char* buf);
+typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, char* message);
+
+#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD)
+#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD)
+#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD)
+#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD)
+
+#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output)
+
+#endif /* GL_AMD_debug_output */
+
+/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */
+
+#ifndef GL_AMD_depth_clamp_separate
+#define GL_AMD_depth_clamp_separate 1
+
+#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E
+#define GL_DEPTH_CLAMP_FAR_AMD 0x901F
+
+#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate)
+
+#endif /* GL_AMD_depth_clamp_separate */
+
+/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */
+
+#ifndef GL_AMD_draw_buffers_blend
+#define GL_AMD_draw_buffers_blend 1
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+
+#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD)
+#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD)
+#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD)
+#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD)
+
+#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend)
+
+#endif /* GL_AMD_draw_buffers_blend */
+
+/* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */
+
+#ifndef GL_AMD_multi_draw_indirect
+#define GL_AMD_multi_draw_indirect 1
+
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride);
+
+#define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD)
+#define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD)
+
+#define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect)
+
+#endif /* GL_AMD_multi_draw_indirect */
+
+/* ------------------------- GL_AMD_name_gen_delete ------------------------ */
+
+#ifndef GL_AMD_name_gen_delete
+#define GL_AMD_name_gen_delete 1
+
+#define GL_DATA_BUFFER_AMD 0x9151
+#define GL_PERFORMANCE_MONITOR_AMD 0x9152
+#define GL_QUERY_OBJECT_AMD 0x9153
+#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154
+#define GL_SAMPLER_OBJECT_AMD 0x9155
+
+typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names);
+typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names);
+typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name);
+
+#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD)
+#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD)
+#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD)
+
+#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete)
+
+#endif /* GL_AMD_name_gen_delete */
+
+/* ----------------------- GL_AMD_performance_monitor ---------------------- */
+
+#ifndef GL_AMD_performance_monitor
+#define GL_AMD_performance_monitor 1
+
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_COUNTER_TYPE_AMD 0x8BC0
+#define GL_COUNTER_RANGE_AMD 0x8BC1
+#define GL_UNSIGNED_INT64_AMD 0x8BC2
+#define GL_PERCENTAGE_AMD 0x8BC3
+#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4
+#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5
+#define GL_PERFMON_RESULT_AMD 0x8BC6
+
+typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);
+typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void* data);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char *counterString);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, char *groupString);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups);
+typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList);
+
+#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD)
+#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD)
+#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD)
+#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD)
+#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD)
+#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD)
+#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD)
+#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD)
+#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD)
+#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD)
+#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD)
+
+#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor)
+
+#endif /* GL_AMD_performance_monitor */
+
+/* ------------------------ GL_AMD_sample_positions ------------------------ */
+
+#ifndef GL_AMD_sample_positions
+#define GL_AMD_sample_positions 1
+
+#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F
+
+typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val);
+
+#define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD)
+
+#define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions)
+
+#endif /* GL_AMD_sample_positions */
+
+/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */
+
+#ifndef GL_AMD_seamless_cubemap_per_texture
+#define GL_AMD_seamless_cubemap_per_texture 1
+
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F
+
+#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture)
+
+#endif /* GL_AMD_seamless_cubemap_per_texture */
+
+/* ---------------------- GL_AMD_shader_stencil_export --------------------- */
+
+#ifndef GL_AMD_shader_stencil_export
+#define GL_AMD_shader_stencil_export 1
+
+#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export)
+
+#endif /* GL_AMD_shader_stencil_export */
+
+/* ------------------------ GL_AMD_texture_texture4 ------------------------ */
+
+#ifndef GL_AMD_texture_texture4
+#define GL_AMD_texture_texture4 1
+
+#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4)
+
+#endif /* GL_AMD_texture_texture4 */
+
+/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */
+
+#ifndef GL_AMD_transform_feedback3_lines_triangles
+#define GL_AMD_transform_feedback3_lines_triangles 1
+
+#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles)
+
+#endif /* GL_AMD_transform_feedback3_lines_triangles */
+
+/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */
+
+#ifndef GL_AMD_vertex_shader_tessellator
+#define GL_AMD_vertex_shader_tessellator 1
+
+#define GL_SAMPLER_BUFFER_AMD 0x9001
+#define GL_INT_SAMPLER_BUFFER_AMD 0x9002
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003
+#define GL_TESSELLATION_MODE_AMD 0x9004
+#define GL_TESSELLATION_FACTOR_AMD 0x9005
+#define GL_DISCRETE_AMD 0x9006
+#define GL_CONTINUOUS_AMD 0x9007
+
+typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor);
+typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode);
+
+#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD)
+#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD)
+
+#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator)
+
+#endif /* GL_AMD_vertex_shader_tessellator */
+
+/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */
+
+#ifndef GL_APPLE_aux_depth_stencil
+#define GL_APPLE_aux_depth_stencil 1
+
+#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14
+
+#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil)
+
+#endif /* GL_APPLE_aux_depth_stencil */
+
+/* ------------------------ GL_APPLE_client_storage ------------------------ */
+
+#ifndef GL_APPLE_client_storage
+#define GL_APPLE_client_storage 1
+
+#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
+
+#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage)
+
+#endif /* GL_APPLE_client_storage */
+
+/* ------------------------- GL_APPLE_element_array ------------------------ */
+
+#ifndef GL_APPLE_element_array
+#define GL_APPLE_element_array 1
+
+#define GL_ELEMENT_ARRAY_APPLE 0x8A0C
+#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D
+#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E
+
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount);
+
+#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE)
+#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE)
+#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE)
+#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE)
+#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE)
+
+#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array)
+
+#endif /* GL_APPLE_element_array */
+
+/* ----------------------------- GL_APPLE_fence ---------------------------- */
+
+#ifndef GL_APPLE_fence
+#define GL_APPLE_fence 1
+
+#define GL_DRAW_PIXELS_APPLE 0x8A0A
+#define GL_FENCE_APPLE 0x8A0B
+
+typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences);
+typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);
+typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences);
+typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence);
+typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence);
+typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);
+
+#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE)
+#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE)
+#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE)
+#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE)
+#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE)
+#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE)
+#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE)
+#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE)
+
+#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence)
+
+#endif /* GL_APPLE_fence */
+
+/* ------------------------- GL_APPLE_float_pixels ------------------------- */
+
+#ifndef GL_APPLE_float_pixels
+#define GL_APPLE_float_pixels 1
+
+#define GL_HALF_APPLE 0x140B
+#define GL_RGBA_FLOAT32_APPLE 0x8814
+#define GL_RGB_FLOAT32_APPLE 0x8815
+#define GL_ALPHA_FLOAT32_APPLE 0x8816
+#define GL_INTENSITY_FLOAT32_APPLE 0x8817
+#define GL_LUMINANCE_FLOAT32_APPLE 0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819
+#define GL_RGBA_FLOAT16_APPLE 0x881A
+#define GL_RGB_FLOAT16_APPLE 0x881B
+#define GL_ALPHA_FLOAT16_APPLE 0x881C
+#define GL_INTENSITY_FLOAT16_APPLE 0x881D
+#define GL_LUMINANCE_FLOAT16_APPLE 0x881E
+#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F
+#define GL_COLOR_FLOAT_APPLE 0x8A0F
+
+#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels)
+
+#endif /* GL_APPLE_float_pixels */
+
+/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */
+
+#ifndef GL_APPLE_flush_buffer_range
+#define GL_APPLE_flush_buffer_range 1
+
+#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12
+#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13
+
+typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size);
+
+#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE)
+#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE)
+
+#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range)
+
+#endif /* GL_APPLE_flush_buffer_range */
+
+/* ----------------------- GL_APPLE_object_purgeable ----------------------- */
+
+#ifndef GL_APPLE_object_purgeable
+#define GL_APPLE_object_purgeable 1
+
+#define GL_BUFFER_OBJECT_APPLE 0x85B3
+#define GL_RELEASED_APPLE 0x8A19
+#define GL_VOLATILE_APPLE 0x8A1A
+#define GL_RETAINED_APPLE 0x8A1B
+#define GL_UNDEFINED_APPLE 0x8A1C
+#define GL_PURGEABLE_APPLE 0x8A1D
+
+typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params);
+typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+
+#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE)
+#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE)
+#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE)
+
+#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable)
+
+#endif /* GL_APPLE_object_purgeable */
+
+/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */
+
+#ifndef GL_APPLE_pixel_buffer
+#define GL_APPLE_pixel_buffer 1
+
+#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10
+
+#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer)
+
+#endif /* GL_APPLE_pixel_buffer */
+
+/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */
+
+#ifndef GL_APPLE_rgb_422
+#define GL_APPLE_rgb_422 1
+
+#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
+#define GL_RGB_422_APPLE 0x8A1F
+
+#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422)
+
+#endif /* GL_APPLE_rgb_422 */
+
+/* --------------------------- GL_APPLE_row_bytes -------------------------- */
+
+#ifndef GL_APPLE_row_bytes
+#define GL_APPLE_row_bytes 1
+
+#define GL_PACK_ROW_BYTES_APPLE 0x8A15
+#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16
+
+#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes)
+
+#endif /* GL_APPLE_row_bytes */
+
+/* ------------------------ GL_APPLE_specular_vector ----------------------- */
+
+#ifndef GL_APPLE_specular_vector
+#define GL_APPLE_specular_vector 1
+
+#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0
+
+#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector)
+
+#endif /* GL_APPLE_specular_vector */
+
+/* ------------------------- GL_APPLE_texture_range ------------------------ */
+
+#ifndef GL_APPLE_texture_range
+#define GL_APPLE_texture_range 1
+
+#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7
+#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8
+#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
+#define GL_STORAGE_PRIVATE_APPLE 0x85BD
+#define GL_STORAGE_CACHED_APPLE 0x85BE
+#define GL_STORAGE_SHARED_APPLE 0x85BF
+
+typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params);
+typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer);
+
+#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE)
+#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE)
+
+#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range)
+
+#endif /* GL_APPLE_texture_range */
+
+/* ------------------------ GL_APPLE_transform_hint ------------------------ */
+
+#ifndef GL_APPLE_transform_hint
+#define GL_APPLE_transform_hint 1
+
+#define GL_TRANSFORM_HINT_APPLE 0x85B1
+
+#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint)
+
+#endif /* GL_APPLE_transform_hint */
+
+/* ---------------------- GL_APPLE_vertex_array_object --------------------- */
+
+#ifndef GL_APPLE_vertex_array_object
+#define GL_APPLE_vertex_array_object 1
+
+#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5
+
+typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
+typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);
+typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);
+typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
+
+#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE)
+#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE)
+#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE)
+#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE)
+
+#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object)
+
+#endif /* GL_APPLE_vertex_array_object */
+
+/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */
+
+#ifndef GL_APPLE_vertex_array_range
+#define GL_APPLE_vertex_array_range 1
+
+#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E
+#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F
+#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520
+#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521
+#define GL_STORAGE_CLIENT_APPLE 0x85B4
+#define GL_STORAGE_CACHED_APPLE 0x85BE
+#define GL_STORAGE_SHARED_APPLE 0x85BF
+
+typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer);
+
+#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE)
+#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE)
+#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE)
+
+#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range)
+
+#endif /* GL_APPLE_vertex_array_range */
+
+/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */
+
+#ifndef GL_APPLE_vertex_program_evaluators
+#define GL_APPLE_vertex_program_evaluators 1
+
+#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00
+#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01
+#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02
+#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03
+#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04
+#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05
+#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06
+#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07
+#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08
+#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09
+
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points);
+typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points);
+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);
+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);
+
+#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE)
+#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE)
+#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE)
+#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE)
+#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE)
+#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE)
+#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE)
+
+#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators)
+
+#endif /* GL_APPLE_vertex_program_evaluators */
+
+/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */
+
+#ifndef GL_APPLE_ycbcr_422
+#define GL_APPLE_ycbcr_422 1
+
+#define GL_YCBCR_422_APPLE 0x85B9
+#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
+
+#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422)
+
+#endif /* GL_APPLE_ycbcr_422 */
+
+/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */
+
+#ifndef GL_ARB_ES2_compatibility
+#define GL_ARB_ES2_compatibility 1
+
+#define GL_FIXED 0x140C
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+
+typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d);
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f);
+typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision);
+typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const GLvoid*binary, GLsizei length);
+
+#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf)
+#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef)
+#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat)
+#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler)
+#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary)
+
+#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility)
+
+#endif /* GL_ARB_ES2_compatibility */
+
+/* -------------------------- GL_ARB_base_instance ------------------------- */
+
+#ifndef GL_ARB_base_instance
+#define GL_ARB_base_instance 1
+
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLuint baseinstance);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex, GLuint baseinstance);
+
+#define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance)
+#define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance)
+#define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance)
+
+#define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance)
+
+#endif /* GL_ARB_base_instance */
+
+/* ----------------------- GL_ARB_blend_func_extended ---------------------- */
+
+#ifndef GL_ARB_blend_func_extended
+#define GL_ARB_blend_func_extended 1
+
+#define GL_SRC1_COLOR 0x88F9
+#define GL_ONE_MINUS_SRC1_COLOR 0x88FA
+#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB
+#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC
+
+typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const char * name);
+typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const char * name);
+
+#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed)
+#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex)
+
+#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended)
+
+#endif /* GL_ARB_blend_func_extended */
+
+/* ---------------------------- GL_ARB_cl_event ---------------------------- */
+
+#ifndef GL_ARB_cl_event
+#define GL_ARB_cl_event 1
+
+#define GL_SYNC_CL_EVENT_ARB 0x8240
+#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241
+
+typedef struct _cl_context *cl_context;
+typedef struct _cl_event *cl_event;
+
+typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags);
+
+#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB)
+
+#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event)
+
+#endif /* GL_ARB_cl_event */
+
+/* ----------------------- GL_ARB_color_buffer_float ----------------------- */
+
+#ifndef GL_ARB_color_buffer_float
+#define GL_ARB_color_buffer_float 1
+
+#define GL_RGBA_FLOAT_MODE_ARB 0x8820
+#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A
+#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B
+#define GL_CLAMP_READ_COLOR_ARB 0x891C
+#define GL_FIXED_ONLY_ARB 0x891D
+
+typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
+
+#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB)
+
+#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float)
+
+#endif /* GL_ARB_color_buffer_float */
+
+/* -------------------------- GL_ARB_compatibility ------------------------- */
+
+#ifndef GL_ARB_compatibility
+#define GL_ARB_compatibility 1
+
+#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility)
+
+#endif /* GL_ARB_compatibility */
+
+/* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */
+
+#ifndef GL_ARB_compressed_texture_pixel_storage
+#define GL_ARB_compressed_texture_pixel_storage 1
+
+#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127
+#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128
+#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129
+#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A
+#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B
+#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C
+#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D
+#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E
+
+#define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage)
+
+#endif /* GL_ARB_compressed_texture_pixel_storage */
+
+/* ----------------------- GL_ARB_conservative_depth ----------------------- */
+
+#ifndef GL_ARB_conservative_depth
+#define GL_ARB_conservative_depth 1
+
+#define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth)
+
+#endif /* GL_ARB_conservative_depth */
+
+/* --------------------------- GL_ARB_copy_buffer -------------------------- */
+
+#ifndef GL_ARB_copy_buffer
+#define GL_ARB_copy_buffer 1
+
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+
+typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+
+#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData)
+
+#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer)
+
+#endif /* GL_ARB_copy_buffer */
+
+/* -------------------------- GL_ARB_debug_output -------------------------- */
+
+#ifndef GL_ARB_debug_output
+#define GL_ARB_debug_output 1
+
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245
+#define GL_DEBUG_SOURCE_API_ARB 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A
+#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B
+#define GL_DEBUG_TYPE_ERROR_ARB 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250
+#define GL_DEBUG_TYPE_OTHER_ARB 0x8251
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147
+#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148
+
+typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam);
+
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, void* userParam);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* buf);
+typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, char* messageLog);
+
+#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB)
+#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB)
+#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB)
+#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB)
+
+#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output)
+
+#endif /* GL_ARB_debug_output */
+
+/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */
+
+#ifndef GL_ARB_depth_buffer_float
+#define GL_ARB_depth_buffer_float 1
+
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+
+#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float)
+
+#endif /* GL_ARB_depth_buffer_float */
+
+/* --------------------------- GL_ARB_depth_clamp -------------------------- */
+
+#ifndef GL_ARB_depth_clamp
+#define GL_ARB_depth_clamp 1
+
+#define GL_DEPTH_CLAMP 0x864F
+
+#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp)
+
+#endif /* GL_ARB_depth_clamp */
+
+/* -------------------------- GL_ARB_depth_texture ------------------------- */
+
+#ifndef GL_ARB_depth_texture
+#define GL_ARB_depth_texture 1
+
+#define GL_DEPTH_COMPONENT16_ARB 0x81A5
+#define GL_DEPTH_COMPONENT24_ARB 0x81A6
+#define GL_DEPTH_COMPONENT32_ARB 0x81A7
+#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A
+#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B
+
+#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture)
+
+#endif /* GL_ARB_depth_texture */
+
+/* -------------------------- GL_ARB_draw_buffers -------------------------- */
+
+#ifndef GL_ARB_draw_buffers
+#define GL_ARB_draw_buffers 1
+
+#define GL_MAX_DRAW_BUFFERS_ARB 0x8824
+#define GL_DRAW_BUFFER0_ARB 0x8825
+#define GL_DRAW_BUFFER1_ARB 0x8826
+#define GL_DRAW_BUFFER2_ARB 0x8827
+#define GL_DRAW_BUFFER3_ARB 0x8828
+#define GL_DRAW_BUFFER4_ARB 0x8829
+#define GL_DRAW_BUFFER5_ARB 0x882A
+#define GL_DRAW_BUFFER6_ARB 0x882B
+#define GL_DRAW_BUFFER7_ARB 0x882C
+#define GL_DRAW_BUFFER8_ARB 0x882D
+#define GL_DRAW_BUFFER9_ARB 0x882E
+#define GL_DRAW_BUFFER10_ARB 0x882F
+#define GL_DRAW_BUFFER11_ARB 0x8830
+#define GL_DRAW_BUFFER12_ARB 0x8831
+#define GL_DRAW_BUFFER13_ARB 0x8832
+#define GL_DRAW_BUFFER14_ARB 0x8833
+#define GL_DRAW_BUFFER15_ARB 0x8834
+
+typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs);
+
+#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB)
+
+#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers)
+
+#endif /* GL_ARB_draw_buffers */
+
+/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */
+
+#ifndef GL_ARB_draw_buffers_blend
+#define GL_ARB_draw_buffers_blend 1
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);
+
+#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB)
+#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB)
+#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB)
+#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB)
+
+#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend)
+
+#endif /* GL_ARB_draw_buffers_blend */
+
+/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */
+
+#ifndef GL_ARB_draw_elements_base_vertex
+#define GL_ARB_draw_elements_base_vertex 1
+
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex);
+
+#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex)
+#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex)
+#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex)
+#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex)
+
+#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex)
+
+#endif /* GL_ARB_draw_elements_base_vertex */
+
+/* -------------------------- GL_ARB_draw_indirect ------------------------- */
+
+#ifndef GL_ARB_draw_indirect
+#define GL_ARB_draw_indirect 1
+
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect);
+
+#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect)
+#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect)
+
+#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect)
+
+#endif /* GL_ARB_draw_indirect */
+
+/* ------------------------- GL_ARB_draw_instanced ------------------------- */
+
+#ifndef GL_ARB_draw_instanced
+#define GL_ARB_draw_instanced 1
+
+#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced)
+
+#endif /* GL_ARB_draw_instanced */
+
+/* -------------------- GL_ARB_explicit_attrib_location -------------------- */
+
+#ifndef GL_ARB_explicit_attrib_location
+#define GL_ARB_explicit_attrib_location 1
+
+#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location)
+
+#endif /* GL_ARB_explicit_attrib_location */
+
+/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */
+
+#ifndef GL_ARB_fragment_coord_conventions
+#define GL_ARB_fragment_coord_conventions 1
+
+#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions)
+
+#endif /* GL_ARB_fragment_coord_conventions */
+
+/* ------------------------ GL_ARB_fragment_program ------------------------ */
+
+#ifndef GL_ARB_fragment_program
+#define GL_ARB_fragment_program 1
+
+#define GL_FRAGMENT_PROGRAM_ARB 0x8804
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+
+#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program)
+
+#endif /* GL_ARB_fragment_program */
+
+/* --------------------- GL_ARB_fragment_program_shadow -------------------- */
+
+#ifndef GL_ARB_fragment_program_shadow
+#define GL_ARB_fragment_program_shadow 1
+
+#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow)
+
+#endif /* GL_ARB_fragment_program_shadow */
+
+/* ------------------------- GL_ARB_fragment_shader ------------------------ */
+
+#ifndef GL_ARB_fragment_shader
+#define GL_ARB_fragment_shader 1
+
+#define GL_FRAGMENT_SHADER_ARB 0x8B30
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
+
+#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader)
+
+#endif /* GL_ARB_fragment_shader */
+
+/* ----------------------- GL_ARB_framebuffer_object ----------------------- */
+
+#ifndef GL_ARB_framebuffer_object
+#define GL_ARB_framebuffer_object 1
+
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_INDEX 0x8222
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_SRGB 0x8C40
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+
+typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers);
+typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);
+typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);
+typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);
+typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+
+#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer)
+#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer)
+#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer)
+#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus)
+#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers)
+#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers)
+#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer)
+#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D)
+#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D)
+#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D)
+#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer)
+#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers)
+#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers)
+#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap)
+#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv)
+#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv)
+#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer)
+#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer)
+#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage)
+#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample)
+
+#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object)
+
+#endif /* GL_ARB_framebuffer_object */
+
+/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */
+
+#ifndef GL_ARB_framebuffer_sRGB
+#define GL_ARB_framebuffer_sRGB 1
+
+#define GL_FRAMEBUFFER_SRGB 0x8DB9
+
+#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB)
+
+#endif /* GL_ARB_framebuffer_sRGB */
+
+/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */
+
+#ifndef GL_ARB_geometry_shader4
+#define GL_ARB_geometry_shader4 1
+
+#define GL_LINES_ADJACENCY_ARB 0xA
+#define GL_LINE_STRIP_ADJACENCY_ARB 0xB
+#define GL_TRIANGLES_ADJACENCY_ARB 0xC
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD
+#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
+#define GL_GEOMETRY_SHADER_ARB 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
+#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
+
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value);
+
+#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB)
+#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB)
+#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB)
+#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB)
+
+#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4)
+
+#endif /* GL_ARB_geometry_shader4 */
+
+/* ----------------------- GL_ARB_get_program_binary ----------------------- */
+
+#ifndef GL_ARB_get_program_binary
+#define GL_ARB_get_program_binary 1
+
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, GLvoid*binary);
+typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+
+#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary)
+#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary)
+#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri)
+
+#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary)
+
+#endif /* GL_ARB_get_program_binary */
+
+/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */
+
+#ifndef GL_ARB_gpu_shader5
+#define GL_ARB_gpu_shader5 1
+
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_MAX_VERTEX_STREAMS 0x8E71
+
+#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5)
+
+#endif /* GL_ARB_gpu_shader5 */
+
+/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */
+
+#ifndef GL_ARB_gpu_shader_fp64
+#define GL_ARB_gpu_shader_fp64 1
+
+#define GL_DOUBLE_MAT2 0x8F46
+#define GL_DOUBLE_MAT3 0x8F47
+#define GL_DOUBLE_MAT4 0x8F48
+#define GL_DOUBLE_MAT2x3 0x8F49
+#define GL_DOUBLE_MAT2x4 0x8F4A
+#define GL_DOUBLE_MAT3x2 0x8F4B
+#define GL_DOUBLE_MAT3x4 0x8F4C
+#define GL_DOUBLE_MAT4x2 0x8F4D
+#define GL_DOUBLE_MAT4x3 0x8F4E
+#define GL_DOUBLE_VEC2 0x8FFC
+#define GL_DOUBLE_VEC3 0x8FFD
+#define GL_DOUBLE_VEC4 0x8FFE
+
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+
+#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv)
+#define glProgramUniform1dEXT GLEW_GET_FUN(__glewProgramUniform1dEXT)
+#define glProgramUniform1dvEXT GLEW_GET_FUN(__glewProgramUniform1dvEXT)
+#define glProgramUniform2dEXT GLEW_GET_FUN(__glewProgramUniform2dEXT)
+#define glProgramUniform2dvEXT GLEW_GET_FUN(__glewProgramUniform2dvEXT)
+#define glProgramUniform3dEXT GLEW_GET_FUN(__glewProgramUniform3dEXT)
+#define glProgramUniform3dvEXT GLEW_GET_FUN(__glewProgramUniform3dvEXT)
+#define glProgramUniform4dEXT GLEW_GET_FUN(__glewProgramUniform4dEXT)
+#define glProgramUniform4dvEXT GLEW_GET_FUN(__glewProgramUniform4dvEXT)
+#define glProgramUniformMatrix2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2dvEXT)
+#define glProgramUniformMatrix2x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3dvEXT)
+#define glProgramUniformMatrix2x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4dvEXT)
+#define glProgramUniformMatrix3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3dvEXT)
+#define glProgramUniformMatrix3x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2dvEXT)
+#define glProgramUniformMatrix3x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4dvEXT)
+#define glProgramUniformMatrix4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4dvEXT)
+#define glProgramUniformMatrix4x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2dvEXT)
+#define glProgramUniformMatrix4x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3dvEXT)
+#define glUniform1d GLEW_GET_FUN(__glewUniform1d)
+#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv)
+#define glUniform2d GLEW_GET_FUN(__glewUniform2d)
+#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv)
+#define glUniform3d GLEW_GET_FUN(__glewUniform3d)
+#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv)
+#define glUniform4d GLEW_GET_FUN(__glewUniform4d)
+#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv)
+#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv)
+#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv)
+#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv)
+#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv)
+#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv)
+#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv)
+#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv)
+#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv)
+#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv)
+
+#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64)
+
+#endif /* GL_ARB_gpu_shader_fp64 */
+
+/* ------------------------ GL_ARB_half_float_pixel ------------------------ */
+
+#ifndef GL_ARB_half_float_pixel
+#define GL_ARB_half_float_pixel 1
+
+#define GL_HALF_FLOAT_ARB 0x140B
+
+#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel)
+
+#endif /* GL_ARB_half_float_pixel */
+
+/* ------------------------ GL_ARB_half_float_vertex ----------------------- */
+
+#ifndef GL_ARB_half_float_vertex
+#define GL_ARB_half_float_vertex 1
+
+#define GL_HALF_FLOAT 0x140B
+
+#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex)
+
+#endif /* GL_ARB_half_float_vertex */
+
+/* ----------------------------- GL_ARB_imaging ---------------------------- */
+
+#ifndef GL_ARB_imaging
+#define GL_ARB_imaging 1
+
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+#define GL_BLEND_COLOR 0x8005
+#define GL_FUNC_ADD 0x8006
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_BLEND_EQUATION 0x8009
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_SEPARABLE_2D 0x8012
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_REDUCE 0x8016
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_MAX_CONVOLUTION_WIDTH 0x801A
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_HISTOGRAM 0x8024
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_BLUE_SIZE 0x802A
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
+#define GL_HISTOGRAM_SINK 0x802D
+#define GL_MINMAX 0x802E
+#define GL_MINMAX_FORMAT 0x802F
+#define GL_MINMAX_SINK 0x8030
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_COLOR_MATRIX 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
+#define GL_COLOR_TABLE 0x80D0
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
+#define GL_PROXY_COLOR_TABLE 0x80D3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
+#define GL_COLOR_TABLE_SCALE 0x80D6
+#define GL_COLOR_TABLE_BIAS 0x80D7
+#define GL_COLOR_TABLE_FORMAT 0x80D8
+#define GL_COLOR_TABLE_WIDTH 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
+#define GL_IGNORE_BORDER 0x8150
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_WRAP_BORDER 0x8152
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+
+typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);
+typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
+
+#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable)
+#define glColorTable GLEW_GET_FUN(__glewColorTable)
+#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv)
+#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv)
+#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D)
+#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D)
+#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf)
+#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv)
+#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri)
+#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv)
+#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable)
+#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable)
+#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D)
+#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D)
+#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable)
+#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv)
+#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv)
+#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter)
+#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv)
+#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv)
+#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram)
+#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv)
+#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv)
+#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax)
+#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv)
+#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv)
+#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter)
+#define glHistogram GLEW_GET_FUN(__glewHistogram)
+#define glMinmax GLEW_GET_FUN(__glewMinmax)
+#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram)
+#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax)
+#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D)
+
+#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging)
+
+#endif /* GL_ARB_imaging */
+
+/* ------------------------ GL_ARB_instanced_arrays ------------------------ */
+
+#ifndef GL_ARB_instanced_arrays
+#define GL_ARB_instanced_arrays 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE
+
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor);
+
+#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB)
+#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB)
+#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB)
+
+#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays)
+
+#endif /* GL_ARB_instanced_arrays */
+
+/* ---------------------- GL_ARB_internalformat_query ---------------------- */
+
+#ifndef GL_ARB_internalformat_query
+#define GL_ARB_internalformat_query 1
+
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+
+typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
+
+#define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ)
+
+#define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query)
+
+#endif /* GL_ARB_internalformat_query */
+
+/* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */
+
+#ifndef GL_ARB_map_buffer_alignment
+#define GL_ARB_map_buffer_alignment 1
+
+#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC
+
+#define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment)
+
+#endif /* GL_ARB_map_buffer_alignment */
+
+/* ------------------------ GL_ARB_map_buffer_range ------------------------ */
+
+#ifndef GL_ARB_map_buffer_range
+#define GL_ARB_map_buffer_range 1
+
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+
+typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+
+#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange)
+#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange)
+
+#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range)
+
+#endif /* GL_ARB_map_buffer_range */
+
+/* ------------------------- GL_ARB_matrix_palette ------------------------- */
+
+#ifndef GL_ARB_matrix_palette
+#define GL_ARB_matrix_palette 1
+
+#define GL_MATRIX_PALETTE_ARB 0x8840
+#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841
+#define GL_MAX_PALETTE_MATRICES_ARB 0x8842
+#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843
+#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844
+#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845
+#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846
+#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847
+#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848
+#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849
+
+typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices);
+typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices);
+
+#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB)
+#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB)
+#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB)
+#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB)
+#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB)
+
+#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette)
+
+#endif /* GL_ARB_matrix_palette */
+
+/* --------------------------- GL_ARB_multisample -------------------------- */
+
+#ifndef GL_ARB_multisample
+#define GL_ARB_multisample 1
+
+#define GL_MULTISAMPLE_ARB 0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F
+#define GL_SAMPLE_COVERAGE_ARB 0x80A0
+#define GL_SAMPLE_BUFFERS_ARB 0x80A8
+#define GL_SAMPLES_ARB 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB
+#define GL_MULTISAMPLE_BIT_ARB 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);
+
+#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB)
+
+#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample)
+
+#endif /* GL_ARB_multisample */
+
+/* -------------------------- GL_ARB_multitexture -------------------------- */
+
+#ifndef GL_ARB_multitexture
+#define GL_ARB_multitexture 1
+
+#define GL_TEXTURE0_ARB 0x84C0
+#define GL_TEXTURE1_ARB 0x84C1
+#define GL_TEXTURE2_ARB 0x84C2
+#define GL_TEXTURE3_ARB 0x84C3
+#define GL_TEXTURE4_ARB 0x84C4
+#define GL_TEXTURE5_ARB 0x84C5
+#define GL_TEXTURE6_ARB 0x84C6
+#define GL_TEXTURE7_ARB 0x84C7
+#define GL_TEXTURE8_ARB 0x84C8
+#define GL_TEXTURE9_ARB 0x84C9
+#define GL_TEXTURE10_ARB 0x84CA
+#define GL_TEXTURE11_ARB 0x84CB
+#define GL_TEXTURE12_ARB 0x84CC
+#define GL_TEXTURE13_ARB 0x84CD
+#define GL_TEXTURE14_ARB 0x84CE
+#define GL_TEXTURE15_ARB 0x84CF
+#define GL_TEXTURE16_ARB 0x84D0
+#define GL_TEXTURE17_ARB 0x84D1
+#define GL_TEXTURE18_ARB 0x84D2
+#define GL_TEXTURE19_ARB 0x84D3
+#define GL_TEXTURE20_ARB 0x84D4
+#define GL_TEXTURE21_ARB 0x84D5
+#define GL_TEXTURE22_ARB 0x84D6
+#define GL_TEXTURE23_ARB 0x84D7
+#define GL_TEXTURE24_ARB 0x84D8
+#define GL_TEXTURE25_ARB 0x84D9
+#define GL_TEXTURE26_ARB 0x84DA
+#define GL_TEXTURE27_ARB 0x84DB
+#define GL_TEXTURE28_ARB 0x84DC
+#define GL_TEXTURE29_ARB 0x84DD
+#define GL_TEXTURE30_ARB 0x84DE
+#define GL_TEXTURE31_ARB 0x84DF
+#define GL_ACTIVE_TEXTURE_ARB 0x84E0
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+
+typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
+
+#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB)
+#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB)
+#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB)
+#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB)
+#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB)
+#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB)
+#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB)
+#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB)
+#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB)
+#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB)
+#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB)
+#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB)
+#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB)
+#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB)
+#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB)
+#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB)
+#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB)
+#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB)
+#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB)
+#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB)
+#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB)
+#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB)
+#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB)
+#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB)
+#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB)
+#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB)
+#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB)
+#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB)
+#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB)
+#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB)
+#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB)
+#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB)
+#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB)
+#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB)
+
+#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture)
+
+#endif /* GL_ARB_multitexture */
+
+/* ------------------------- GL_ARB_occlusion_query ------------------------ */
+
+#ifndef GL_ARB_occlusion_query
+#define GL_ARB_occlusion_query 1
+
+#define GL_QUERY_COUNTER_BITS_ARB 0x8864
+#define GL_CURRENT_QUERY_ARB 0x8865
+#define GL_QUERY_RESULT_ARB 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867
+#define GL_SAMPLES_PASSED_ARB 0x8914
+
+typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id);
+
+#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB)
+#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB)
+#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB)
+#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB)
+#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB)
+#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB)
+#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB)
+#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB)
+
+#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query)
+
+#endif /* GL_ARB_occlusion_query */
+
+/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */
+
+#ifndef GL_ARB_occlusion_query2
+#define GL_ARB_occlusion_query2 1
+
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+
+#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2)
+
+#endif /* GL_ARB_occlusion_query2 */
+
+/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */
+
+#ifndef GL_ARB_pixel_buffer_object
+#define GL_ARB_pixel_buffer_object 1
+
+#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF
+
+#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object)
+
+#endif /* GL_ARB_pixel_buffer_object */
+
+/* ------------------------ GL_ARB_point_parameters ------------------------ */
+
+#ifndef GL_ARB_point_parameters
+#define GL_ARB_point_parameters 1
+
+#define GL_POINT_SIZE_MIN_ARB 0x8126
+#define GL_POINT_SIZE_MAX_ARB 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
+#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
+
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params);
+
+#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB)
+#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB)
+
+#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters)
+
+#endif /* GL_ARB_point_parameters */
+
+/* -------------------------- GL_ARB_point_sprite -------------------------- */
+
+#ifndef GL_ARB_point_sprite
+#define GL_ARB_point_sprite 1
+
+#define GL_POINT_SPRITE_ARB 0x8861
+#define GL_COORD_REPLACE_ARB 0x8862
+
+#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite)
+
+#endif /* GL_ARB_point_sprite */
+
+/* ------------------------ GL_ARB_provoking_vertex ------------------------ */
+
+#ifndef GL_ARB_provoking_vertex
+#define GL_ARB_provoking_vertex 1
+
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_PROVOKING_VERTEX 0x8E4F
+
+typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
+
+#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex)
+
+#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex)
+
+#endif /* GL_ARB_provoking_vertex */
+
+/* --------------------------- GL_ARB_robustness --------------------------- */
+
+#ifndef GL_ARB_robustness
+#define GL_ARB_robustness 1
+
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253
+#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define GL_NO_RESET_NOTIFICATION_ARB 0x8261
+
+typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);
+typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table);
+typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img);
+typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image);
+typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
+typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v);
+typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
+typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values);
+typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values);
+typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values);
+typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern);
+typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, GLvoid*column, GLvoid*span);
+typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data);
+
+#define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB)
+#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB)
+#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB)
+#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB)
+#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB)
+#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB)
+#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB)
+#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB)
+#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB)
+#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB)
+#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB)
+#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB)
+#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB)
+#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB)
+#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB)
+#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB)
+#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB)
+#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB)
+#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB)
+#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB)
+
+#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness)
+
+#endif /* GL_ARB_robustness */
+
+/* ------------------------- GL_ARB_sample_shading ------------------------- */
+
+#ifndef GL_ARB_sample_shading
+#define GL_ARB_sample_shading 1
+
+#define GL_SAMPLE_SHADING_ARB 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37
+
+typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value);
+
+#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB)
+
+#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading)
+
+#endif /* GL_ARB_sample_shading */
+
+/* ------------------------- GL_ARB_sampler_objects ------------------------ */
+
+#ifndef GL_ARB_sampler_objects
+#define GL_ARB_sampler_objects 1
+
+#define GL_SAMPLER_BINDING 0x8919
+
+typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers);
+typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params);
+
+#define glBindSampler GLEW_GET_FUN(__glewBindSampler)
+#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers)
+#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers)
+#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv)
+#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv)
+#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv)
+#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv)
+#define glIsSampler GLEW_GET_FUN(__glewIsSampler)
+#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv)
+#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv)
+#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf)
+#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv)
+#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri)
+#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv)
+
+#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects)
+
+#endif /* GL_ARB_sampler_objects */
+
+/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_ARB_seamless_cube_map 1
+
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
+
+#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map)
+
+#endif /* GL_ARB_seamless_cube_map */
+
+/* --------------------- GL_ARB_separate_shader_objects -------------------- */
+
+#ifndef GL_ARB_separate_shader_objects
+#define GL_ARB_separate_shader_objects 1
+
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+
+typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const char ** strings);
+typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines);
+typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, char *infoLog);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+
+#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram)
+#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline)
+#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv)
+#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines)
+#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines)
+#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog)
+#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv)
+#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline)
+#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d)
+#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv)
+#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f)
+#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv)
+#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i)
+#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv)
+#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui)
+#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv)
+#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d)
+#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv)
+#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f)
+#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv)
+#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i)
+#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv)
+#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui)
+#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv)
+#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d)
+#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv)
+#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f)
+#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv)
+#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i)
+#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv)
+#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui)
+#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv)
+#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d)
+#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv)
+#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f)
+#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv)
+#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i)
+#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv)
+#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui)
+#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv)
+#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv)
+#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv)
+#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv)
+#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv)
+#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv)
+#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv)
+#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv)
+#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv)
+#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv)
+#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv)
+#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv)
+#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv)
+#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv)
+#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv)
+#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv)
+#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv)
+#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv)
+#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv)
+#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages)
+#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline)
+
+#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects)
+
+#endif /* GL_ARB_separate_shader_objects */
+
+/* --------------------- GL_ARB_shader_atomic_counters --------------------- */
+
+#ifndef GL_ARB_shader_atomic_counters
+#define GL_ARB_shader_atomic_counters 1
+
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
+#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
+#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+
+typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params);
+
+#define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv)
+
+#define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters)
+
+#endif /* GL_ARB_shader_atomic_counters */
+
+/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */
+
+#ifndef GL_ARB_shader_bit_encoding
+#define GL_ARB_shader_bit_encoding 1
+
+#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding)
+
+#endif /* GL_ARB_shader_bit_encoding */
+
+/* --------------------- GL_ARB_shader_image_load_store -------------------- */
+
+#ifndef GL_ARB_shader_image_load_store
+#define GL_ARB_shader_image_load_store 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_MAX_IMAGE_UNITS 0x8F38
+#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39
+#define GL_IMAGE_BINDING_NAME 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED 0x8F3C
+#define GL_IMAGE_BINDING_LAYER 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS 0x8F3E
+#define GL_IMAGE_1D 0x904C
+#define GL_IMAGE_2D 0x904D
+#define GL_IMAGE_3D 0x904E
+#define GL_IMAGE_2D_RECT 0x904F
+#define GL_IMAGE_CUBE 0x9050
+#define GL_IMAGE_BUFFER 0x9051
+#define GL_IMAGE_1D_ARRAY 0x9052
+#define GL_IMAGE_2D_ARRAY 0x9053
+#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054
+#define GL_IMAGE_2D_MULTISAMPLE 0x9055
+#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056
+#define GL_INT_IMAGE_1D 0x9057
+#define GL_INT_IMAGE_2D 0x9058
+#define GL_INT_IMAGE_3D 0x9059
+#define GL_INT_IMAGE_2D_RECT 0x905A
+#define GL_INT_IMAGE_CUBE 0x905B
+#define GL_INT_IMAGE_BUFFER 0x905C
+#define GL_INT_IMAGE_1D_ARRAY 0x905D
+#define GL_INT_IMAGE_2D_ARRAY 0x905E
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F
+#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060
+#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061
+#define GL_UNSIGNED_INT_IMAGE_1D 0x9062
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D 0x9064
+#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065
+#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
+#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067
+#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C
+#define GL_MAX_IMAGE_SAMPLES 0x906D
+#define GL_IMAGE_BINDING_FORMAT 0x906E
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+
+typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
+
+#define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture)
+#define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier)
+
+#define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store)
+
+#endif /* GL_ARB_shader_image_load_store */
+
+/* ------------------------- GL_ARB_shader_objects ------------------------- */
+
+#ifndef GL_ARB_shader_objects
+#define GL_ARB_shader_objects 1
+
+#define GL_PROGRAM_OBJECT_ARB 0x8B40
+#define GL_SHADER_OBJECT_ARB 0x8B48
+#define GL_OBJECT_TYPE_ARB 0x8B4E
+#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
+#define GL_FLOAT_VEC2_ARB 0x8B50
+#define GL_FLOAT_VEC3_ARB 0x8B51
+#define GL_FLOAT_VEC4_ARB 0x8B52
+#define GL_INT_VEC2_ARB 0x8B53
+#define GL_INT_VEC3_ARB 0x8B54
+#define GL_INT_VEC4_ARB 0x8B55
+#define GL_BOOL_ARB 0x8B56
+#define GL_BOOL_VEC2_ARB 0x8B57
+#define GL_BOOL_VEC3_ARB 0x8B58
+#define GL_BOOL_VEC4_ARB 0x8B59
+#define GL_FLOAT_MAT2_ARB 0x8B5A
+#define GL_FLOAT_MAT3_ARB 0x8B5B
+#define GL_FLOAT_MAT4_ARB 0x8B5C
+#define GL_SAMPLER_1D_ARB 0x8B5D
+#define GL_SAMPLER_2D_ARB 0x8B5E
+#define GL_SAMPLER_3D_ARB 0x8B5F
+#define GL_SAMPLER_CUBE_ARB 0x8B60
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
+#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
+
+typedef char GLcharARB;
+typedef unsigned int GLhandleARB;
+
+typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
+typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
+typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
+typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
+typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
+typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);
+typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj);
+typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname);
+typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source);
+typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params);
+typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
+typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
+typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
+
+#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB)
+#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB)
+#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB)
+#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB)
+#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB)
+#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB)
+#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB)
+#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB)
+#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB)
+#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB)
+#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB)
+#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB)
+#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB)
+#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB)
+#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB)
+#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB)
+#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB)
+#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB)
+#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB)
+#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB)
+#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB)
+#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB)
+#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB)
+#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB)
+#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB)
+#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB)
+#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB)
+#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB)
+#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB)
+#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB)
+#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB)
+#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB)
+#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB)
+#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB)
+#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB)
+#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB)
+#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB)
+#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB)
+#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB)
+
+#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects)
+
+#endif /* GL_ARB_shader_objects */
+
+/* ------------------------ GL_ARB_shader_precision ------------------------ */
+
+#ifndef GL_ARB_shader_precision
+#define GL_ARB_shader_precision 1
+
+#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision)
+
+#endif /* GL_ARB_shader_precision */
+
+/* ---------------------- GL_ARB_shader_stencil_export --------------------- */
+
+#ifndef GL_ARB_shader_stencil_export
+#define GL_ARB_shader_stencil_export 1
+
+#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export)
+
+#endif /* GL_ARB_shader_stencil_export */
+
+/* ------------------------ GL_ARB_shader_subroutine ----------------------- */
+
+#ifndef GL_ARB_shader_subroutine
+#define GL_ARB_shader_subroutine 1
+
+#define GL_ACTIVE_SUBROUTINES 0x8DE5
+#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6
+#define GL_MAX_SUBROUTINES 0x8DE7
+#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47
+#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49
+#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A
+#define GL_COMPATIBLE_SUBROUTINES 0x8E4B
+
+typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, char *name);
+typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, char *name);
+typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values);
+typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const char* name);
+typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const char* name);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices);
+
+#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName)
+#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName)
+#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv)
+#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv)
+#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex)
+#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation)
+#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv)
+#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv)
+
+#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine)
+
+#endif /* GL_ARB_shader_subroutine */
+
+/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */
+
+#ifndef GL_ARB_shader_texture_lod
+#define GL_ARB_shader_texture_lod 1
+
+#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod)
+
+#endif /* GL_ARB_shader_texture_lod */
+
+/* ---------------------- GL_ARB_shading_language_100 ---------------------- */
+
+#ifndef GL_ARB_shading_language_100
+#define GL_ARB_shading_language_100 1
+
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+
+#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100)
+
+#endif /* GL_ARB_shading_language_100 */
+
+/* -------------------- GL_ARB_shading_language_420pack -------------------- */
+
+#ifndef GL_ARB_shading_language_420pack
+#define GL_ARB_shading_language_420pack 1
+
+#define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack)
+
+#endif /* GL_ARB_shading_language_420pack */
+
+/* -------------------- GL_ARB_shading_language_include -------------------- */
+
+#ifndef GL_ARB_shading_language_include
+#define GL_ARB_shading_language_include 1
+
+#define GL_SHADER_INCLUDE_ARB 0x8DAE
+#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9
+#define GL_NAMED_STRING_TYPE_ARB 0x8DEA
+
+typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const char ** path, const GLint *length);
+typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const char* name);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const char* name, GLsizei bufSize, GLint *stringlen, char *string);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const char* name, GLenum pname, GLint *params);
+typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const char* name);
+typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const char* name, GLint stringlen, const char *string);
+
+#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB)
+#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB)
+#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB)
+#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB)
+#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB)
+#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB)
+
+#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include)
+
+#endif /* GL_ARB_shading_language_include */
+
+/* -------------------- GL_ARB_shading_language_packing -------------------- */
+
+#ifndef GL_ARB_shading_language_packing
+#define GL_ARB_shading_language_packing 1
+
+#define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing)
+
+#endif /* GL_ARB_shading_language_packing */
+
+/* ----------------------------- GL_ARB_shadow ----------------------------- */
+
+#ifndef GL_ARB_shadow
+#define GL_ARB_shadow 1
+
+#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C
+#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D
+#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E
+
+#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow)
+
+#endif /* GL_ARB_shadow */
+
+/* ------------------------- GL_ARB_shadow_ambient ------------------------- */
+
+#ifndef GL_ARB_shadow_ambient
+#define GL_ARB_shadow_ambient 1
+
+#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF
+
+#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient)
+
+#endif /* GL_ARB_shadow_ambient */
+
+/* ------------------------------ GL_ARB_sync ------------------------------ */
+
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF
+
+typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);
+typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync);
+typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags);
+typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params);
+typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values);
+typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync);
+typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);
+
+#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync)
+#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync)
+#define glFenceSync GLEW_GET_FUN(__glewFenceSync)
+#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v)
+#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv)
+#define glIsSync GLEW_GET_FUN(__glewIsSync)
+#define glWaitSync GLEW_GET_FUN(__glewWaitSync)
+
+#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync)
+
+#endif /* GL_ARB_sync */
+
+/* ----------------------- GL_ARB_tessellation_shader ---------------------- */
+
+#ifndef GL_ARB_tessellation_shader
+#define GL_ARB_tessellation_shader 1
+
+#define GL_PATCHES 0xE
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
+#define GL_PATCH_VERTICES 0x8E72
+#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
+#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
+#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75
+#define GL_TESS_GEN_MODE 0x8E76
+#define GL_TESS_GEN_SPACING 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER 0x8E78
+#define GL_TESS_GEN_POINT_MODE 0x8E79
+#define GL_ISOLINES 0x8E7A
+#define GL_FRACTIONAL_ODD 0x8E7B
+#define GL_FRACTIONAL_EVEN 0x8E7C
+#define GL_MAX_PATCH_VERTICES 0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL 0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
+
+typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values);
+typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);
+
+#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv)
+#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri)
+
+#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader)
+
+#endif /* GL_ARB_tessellation_shader */
+
+/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */
+
+#ifndef GL_ARB_texture_border_clamp
+#define GL_ARB_texture_border_clamp 1
+
+#define GL_CLAMP_TO_BORDER_ARB 0x812D
+
+#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp)
+
+#endif /* GL_ARB_texture_border_clamp */
+
+/* ---------------------- GL_ARB_texture_buffer_object --------------------- */
+
+#ifndef GL_ARB_texture_buffer_object
+#define GL_ARB_texture_buffer_object 1
+
+#define GL_TEXTURE_BUFFER_ARB 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D
+#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E
+
+typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+
+#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB)
+
+#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object)
+
+#endif /* GL_ARB_texture_buffer_object */
+
+/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */
+
+#ifndef GL_ARB_texture_buffer_object_rgb32
+#define GL_ARB_texture_buffer_object_rgb32 1
+
+#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32)
+
+#endif /* GL_ARB_texture_buffer_object_rgb32 */
+
+/* ----------------------- GL_ARB_texture_compression ---------------------- */
+
+#ifndef GL_ARB_texture_compression
+#define GL_ARB_texture_compression 1
+
+#define GL_COMPRESSED_ALPHA_ARB 0x84E9
+#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA
+#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB
+#define GL_COMPRESSED_INTENSITY_ARB 0x84EC
+#define GL_COMPRESSED_RGB_ARB 0x84ED
+#define GL_COMPRESSED_RGBA_ARB 0x84EE
+#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
+#define GL_TEXTURE_COMPRESSED_ARB 0x86A1
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
+
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+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);
+typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img);
+
+#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB)
+#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB)
+#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB)
+#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB)
+#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB)
+#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB)
+#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB)
+
+#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression)
+
+#endif /* GL_ARB_texture_compression */
+
+/* -------------------- GL_ARB_texture_compression_bptc -------------------- */
+
+#ifndef GL_ARB_texture_compression_bptc
+#define GL_ARB_texture_compression_bptc 1
+
+#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
+
+#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc)
+
+#endif /* GL_ARB_texture_compression_bptc */
+
+/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */
+
+#ifndef GL_ARB_texture_compression_rgtc
+#define GL_ARB_texture_compression_rgtc 1
+
+#define GL_COMPRESSED_RED_RGTC1 0x8DBB
+#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC
+#define GL_COMPRESSED_RG_RGTC2 0x8DBD
+#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE
+
+#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc)
+
+#endif /* GL_ARB_texture_compression_rgtc */
+
+/* ------------------------ GL_ARB_texture_cube_map ------------------------ */
+
+#ifndef GL_ARB_texture_cube_map
+#define GL_ARB_texture_cube_map 1
+
+#define GL_NORMAL_MAP_ARB 0x8511
+#define GL_REFLECTION_MAP_ARB 0x8512
+#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C
+
+#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map)
+
+#endif /* GL_ARB_texture_cube_map */
+
+/* --------------------- GL_ARB_texture_cube_map_array --------------------- */
+
+#ifndef GL_ARB_texture_cube_map_array
+#define GL_ARB_texture_cube_map_array 1
+
+#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F
+
+#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array)
+
+#endif /* GL_ARB_texture_cube_map_array */
+
+/* ------------------------- GL_ARB_texture_env_add ------------------------ */
+
+#ifndef GL_ARB_texture_env_add
+#define GL_ARB_texture_env_add 1
+
+#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add)
+
+#endif /* GL_ARB_texture_env_add */
+
+/* ----------------------- GL_ARB_texture_env_combine ---------------------- */
+
+#ifndef GL_ARB_texture_env_combine
+#define GL_ARB_texture_env_combine 1
+
+#define GL_SUBTRACT_ARB 0x84E7
+#define GL_COMBINE_ARB 0x8570
+#define GL_COMBINE_RGB_ARB 0x8571
+#define GL_COMBINE_ALPHA_ARB 0x8572
+#define GL_RGB_SCALE_ARB 0x8573
+#define GL_ADD_SIGNED_ARB 0x8574
+#define GL_INTERPOLATE_ARB 0x8575
+#define GL_CONSTANT_ARB 0x8576
+#define GL_PRIMARY_COLOR_ARB 0x8577
+#define GL_PREVIOUS_ARB 0x8578
+#define GL_SOURCE0_RGB_ARB 0x8580
+#define GL_SOURCE1_RGB_ARB 0x8581
+#define GL_SOURCE2_RGB_ARB 0x8582
+#define GL_SOURCE0_ALPHA_ARB 0x8588
+#define GL_SOURCE1_ALPHA_ARB 0x8589
+#define GL_SOURCE2_ALPHA_ARB 0x858A
+#define GL_OPERAND0_RGB_ARB 0x8590
+#define GL_OPERAND1_RGB_ARB 0x8591
+#define GL_OPERAND2_RGB_ARB 0x8592
+#define GL_OPERAND0_ALPHA_ARB 0x8598
+#define GL_OPERAND1_ALPHA_ARB 0x8599
+#define GL_OPERAND2_ALPHA_ARB 0x859A
+
+#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine)
+
+#endif /* GL_ARB_texture_env_combine */
+
+/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */
+
+#ifndef GL_ARB_texture_env_crossbar
+#define GL_ARB_texture_env_crossbar 1
+
+#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar)
+
+#endif /* GL_ARB_texture_env_crossbar */
+
+/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */
+
+#ifndef GL_ARB_texture_env_dot3
+#define GL_ARB_texture_env_dot3 1
+
+#define GL_DOT3_RGB_ARB 0x86AE
+#define GL_DOT3_RGBA_ARB 0x86AF
+
+#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3)
+
+#endif /* GL_ARB_texture_env_dot3 */
+
+/* -------------------------- GL_ARB_texture_float ------------------------- */
+
+#ifndef GL_ARB_texture_float
+#define GL_ARB_texture_float 1
+
+#define GL_RGBA32F_ARB 0x8814
+#define GL_RGB32F_ARB 0x8815
+#define GL_ALPHA32F_ARB 0x8816
+#define GL_INTENSITY32F_ARB 0x8817
+#define GL_LUMINANCE32F_ARB 0x8818
+#define GL_LUMINANCE_ALPHA32F_ARB 0x8819
+#define GL_RGBA16F_ARB 0x881A
+#define GL_RGB16F_ARB 0x881B
+#define GL_ALPHA16F_ARB 0x881C
+#define GL_INTENSITY16F_ARB 0x881D
+#define GL_LUMINANCE16F_ARB 0x881E
+#define GL_LUMINANCE_ALPHA16F_ARB 0x881F
+#define GL_TEXTURE_RED_TYPE_ARB 0x8C10
+#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11
+#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13
+#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14
+#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15
+#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16
+#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17
+
+#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float)
+
+#endif /* GL_ARB_texture_float */
+
+/* ------------------------- GL_ARB_texture_gather ------------------------- */
+
+#ifndef GL_ARB_texture_gather
+#define GL_ARB_texture_gather 1
+
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F
+
+#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather)
+
+#endif /* GL_ARB_texture_gather */
+
+/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */
+
+#ifndef GL_ARB_texture_mirrored_repeat
+#define GL_ARB_texture_mirrored_repeat 1
+
+#define GL_MIRRORED_REPEAT_ARB 0x8370
+
+#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat)
+
+#endif /* GL_ARB_texture_mirrored_repeat */
+
+/* ----------------------- GL_ARB_texture_multisample ---------------------- */
+
+#ifndef GL_ARB_texture_multisample
+#define GL_ARB_texture_multisample 1
+
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+
+typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val);
+typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+
+#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv)
+#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski)
+#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample)
+#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample)
+
+#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample)
+
+#endif /* GL_ARB_texture_multisample */
+
+/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */
+
+#ifndef GL_ARB_texture_non_power_of_two
+#define GL_ARB_texture_non_power_of_two 1
+
+#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two)
+
+#endif /* GL_ARB_texture_non_power_of_two */
+
+/* ------------------------ GL_ARB_texture_query_lod ----------------------- */
+
+#ifndef GL_ARB_texture_query_lod
+#define GL_ARB_texture_query_lod 1
+
+#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod)
+
+#endif /* GL_ARB_texture_query_lod */
+
+/* ------------------------ GL_ARB_texture_rectangle ----------------------- */
+
+#ifndef GL_ARB_texture_rectangle
+#define GL_ARB_texture_rectangle 1
+
+#define GL_TEXTURE_RECTANGLE_ARB 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+
+#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle)
+
+#endif /* GL_ARB_texture_rectangle */
+
+/* --------------------------- GL_ARB_texture_rg --------------------------- */
+
+#ifndef GL_ARB_texture_rg
+#define GL_ARB_texture_rg 1
+
+#define GL_RED 0x1903
+#define GL_COMPRESSED_RED 0x8225
+#define GL_COMPRESSED_RG 0x8226
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_R16 0x822A
+#define GL_RG8 0x822B
+#define GL_RG16 0x822C
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+
+#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg)
+
+#endif /* GL_ARB_texture_rg */
+
+/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */
+
+#ifndef GL_ARB_texture_rgb10_a2ui
+#define GL_ARB_texture_rgb10_a2ui 1
+
+#define GL_RGB10_A2UI 0x906F
+
+#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui)
+
+#endif /* GL_ARB_texture_rgb10_a2ui */
+
+/* ------------------------- GL_ARB_texture_storage ------------------------ */
+
+#ifndef GL_ARB_texture_storage
+#define GL_ARB_texture_storage 1
+
+#define GL_ALPHA8_EXT 0x803C
+#define GL_LUMINANCE8_EXT 0x8040
+#define GL_LUMINANCE8_ALPHA8_EXT 0x8045
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+
+typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+
+#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D)
+#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D)
+#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D)
+#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT)
+#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT)
+#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT)
+
+#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage)
+
+#endif /* GL_ARB_texture_storage */
+
+/* ------------------------- GL_ARB_texture_swizzle ------------------------ */
+
+#ifndef GL_ARB_texture_swizzle
+#define GL_ARB_texture_swizzle 1
+
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
+
+#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle)
+
+#endif /* GL_ARB_texture_swizzle */
+
+/* --------------------------- GL_ARB_timer_query -------------------------- */
+
+#ifndef GL_ARB_timer_query
+#define GL_ARB_timer_query 1
+
+#define GL_TIME_ELAPSED 0x88BF
+#define GL_TIMESTAMP 0x8E28
+
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params);
+typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
+
+#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v)
+#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v)
+#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter)
+
+#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query)
+
+#endif /* GL_ARB_timer_query */
+
+/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */
+
+#ifndef GL_ARB_transform_feedback2
+#define GL_ARB_transform_feedback2 1
+
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+
+typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id);
+typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids);
+typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+
+#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback)
+#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks)
+#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback)
+#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks)
+#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback)
+#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback)
+#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback)
+
+#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2)
+
+#endif /* GL_ARB_transform_feedback2 */
+
+/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */
+
+#ifndef GL_ARB_transform_feedback3
+#define GL_ARB_transform_feedback3 1
+
+#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70
+#define GL_MAX_VERTEX_STREAMS 0x8E71
+
+typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream);
+typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index);
+typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params);
+
+#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed)
+#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream)
+#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed)
+#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv)
+
+#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3)
+
+#endif /* GL_ARB_transform_feedback3 */
+
+/* ------------------ GL_ARB_transform_feedback_instanced ------------------ */
+
+#ifndef GL_ARB_transform_feedback_instanced
+#define GL_ARB_transform_feedback_instanced 1
+
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount);
+
+#define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced)
+#define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced)
+
+#define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced)
+
+#endif /* GL_ARB_transform_feedback_instanced */
+
+/* ------------------------ GL_ARB_transpose_matrix ------------------------ */
+
+#ifndef GL_ARB_transpose_matrix
+#define GL_ARB_transpose_matrix 1
+
+#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3
+#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4
+#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5
+#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6
+
+typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]);
+typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]);
+typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]);
+
+#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB)
+#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB)
+#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB)
+#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB)
+
+#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix)
+
+#endif /* GL_ARB_transpose_matrix */
+
+/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */
+
+#ifndef GL_ARB_uniform_buffer_object
+#define GL_ARB_uniform_buffer_object 1
+
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFF
+
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, char* uniformBlockName);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, char* uniformName);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data);
+typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const char* uniformBlockName);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const char** uniformNames, GLuint* uniformIndices);
+typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+
+#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase)
+#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange)
+#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName)
+#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv)
+#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName)
+#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv)
+#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v)
+#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex)
+#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices)
+#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding)
+
+#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object)
+
+#endif /* GL_ARB_uniform_buffer_object */
+
+/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */
+
+#ifndef GL_ARB_vertex_array_bgra
+#define GL_ARB_vertex_array_bgra 1
+
+#define GL_BGRA 0x80E1
+
+#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra)
+
+#endif /* GL_ARB_vertex_array_bgra */
+
+/* ----------------------- GL_ARB_vertex_array_object ---------------------- */
+
+#ifndef GL_ARB_vertex_array_object
+#define GL_ARB_vertex_array_object 1
+
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+
+typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays);
+typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays);
+typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array);
+
+#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray)
+#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays)
+#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays)
+#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray)
+
+#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object)
+
+#endif /* GL_ARB_vertex_array_object */
+
+/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */
+
+#ifndef GL_ARB_vertex_attrib_64bit
+#define GL_ARB_vertex_attrib_64bit 1
+
+#define GL_DOUBLE_MAT2 0x8F46
+#define GL_DOUBLE_MAT3 0x8F47
+#define GL_DOUBLE_MAT4 0x8F48
+#define GL_DOUBLE_VEC2 0x8FFC
+#define GL_DOUBLE_VEC3 0x8FFD
+#define GL_DOUBLE_VEC4 0x8FFE
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
+
+#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv)
+#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d)
+#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv)
+#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d)
+#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv)
+#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d)
+#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv)
+#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d)
+#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv)
+#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer)
+
+#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit)
+
+#endif /* GL_ARB_vertex_attrib_64bit */
+
+/* -------------------------- GL_ARB_vertex_blend -------------------------- */
+
+#ifndef GL_ARB_vertex_blend
+#define GL_ARB_vertex_blend 1
+
+#define GL_MODELVIEW0_ARB 0x1700
+#define GL_MODELVIEW1_ARB 0x850A
+#define GL_MAX_VERTEX_UNITS_ARB 0x86A4
+#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5
+#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6
+#define GL_VERTEX_BLEND_ARB 0x86A7
+#define GL_CURRENT_WEIGHT_ARB 0x86A8
+#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9
+#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA
+#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB
+#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC
+#define GL_WEIGHT_ARRAY_ARB 0x86AD
+#define GL_MODELVIEW2_ARB 0x8722
+#define GL_MODELVIEW3_ARB 0x8723
+#define GL_MODELVIEW4_ARB 0x8724
+#define GL_MODELVIEW5_ARB 0x8725
+#define GL_MODELVIEW6_ARB 0x8726
+#define GL_MODELVIEW7_ARB 0x8727
+#define GL_MODELVIEW8_ARB 0x8728
+#define GL_MODELVIEW9_ARB 0x8729
+#define GL_MODELVIEW10_ARB 0x872A
+#define GL_MODELVIEW11_ARB 0x872B
+#define GL_MODELVIEW12_ARB 0x872C
+#define GL_MODELVIEW13_ARB 0x872D
+#define GL_MODELVIEW14_ARB 0x872E
+#define GL_MODELVIEW15_ARB 0x872F
+#define GL_MODELVIEW16_ARB 0x8730
+#define GL_MODELVIEW17_ARB 0x8731
+#define GL_MODELVIEW18_ARB 0x8732
+#define GL_MODELVIEW19_ARB 0x8733
+#define GL_MODELVIEW20_ARB 0x8734
+#define GL_MODELVIEW21_ARB 0x8735
+#define GL_MODELVIEW22_ARB 0x8736
+#define GL_MODELVIEW23_ARB 0x8737
+#define GL_MODELVIEW24_ARB 0x8738
+#define GL_MODELVIEW25_ARB 0x8739
+#define GL_MODELVIEW26_ARB 0x873A
+#define GL_MODELVIEW27_ARB 0x873B
+#define GL_MODELVIEW28_ARB 0x873C
+#define GL_MODELVIEW29_ARB 0x873D
+#define GL_MODELVIEW30_ARB 0x873E
+#define GL_MODELVIEW31_ARB 0x873F
+
+typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count);
+typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights);
+typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights);
+
+#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB)
+#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB)
+#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB)
+#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB)
+#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB)
+#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB)
+#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB)
+#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB)
+#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB)
+#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB)
+
+#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend)
+
+#endif /* GL_ARB_vertex_blend */
+
+/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */
+
+#ifndef GL_ARB_vertex_buffer_object
+#define GL_ARB_vertex_buffer_object 1
+
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
+#define GL_READ_ONLY_ARB 0x88B8
+#define GL_WRITE_ONLY_ARB 0x88B9
+#define GL_READ_WRITE_ARB 0x88BA
+#define GL_BUFFER_ACCESS_ARB 0x88BB
+#define GL_BUFFER_MAPPED_ARB 0x88BC
+#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
+#define GL_STREAM_DRAW_ARB 0x88E0
+#define GL_STREAM_READ_ARB 0x88E1
+#define GL_STREAM_COPY_ARB 0x88E2
+#define GL_STATIC_DRAW_ARB 0x88E4
+#define GL_STATIC_READ_ARB 0x88E5
+#define GL_STATIC_COPY_ARB 0x88E6
+#define GL_DYNAMIC_DRAW_ARB 0x88E8
+#define GL_DYNAMIC_READ_ARB 0x88E9
+#define GL_DYNAMIC_COPY_ARB 0x88EA
+
+typedef ptrdiff_t GLintptrARB;
+typedef ptrdiff_t GLsizeiptrARB;
+
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage);
+typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data);
+typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data);
+typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer);
+typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access);
+typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target);
+
+#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB)
+#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB)
+#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB)
+#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB)
+#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB)
+#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB)
+#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB)
+#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB)
+#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB)
+#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB)
+#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB)
+
+#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object)
+
+#endif /* GL_ARB_vertex_buffer_object */
+
+/* ------------------------- GL_ARB_vertex_program ------------------------- */
+
+#ifndef GL_ARB_vertex_program
+#define GL_ARB_vertex_program 1
+
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
+#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
+#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
+#define GL_MATRIX0_ARB 0x88C0
+#define GL_MATRIX1_ARB 0x88C1
+#define GL_MATRIX2_ARB 0x88C2
+#define GL_MATRIX3_ARB 0x88C3
+#define GL_MATRIX4_ARB 0x88C4
+#define GL_MATRIX5_ARB 0x88C5
+#define GL_MATRIX6_ARB 0x88C6
+#define GL_MATRIX7_ARB 0x88C7
+#define GL_MATRIX8_ARB 0x88C8
+#define GL_MATRIX9_ARB 0x88C9
+#define GL_MATRIX10_ARB 0x88CA
+#define GL_MATRIX11_ARB 0x88CB
+#define GL_MATRIX12_ARB 0x88CC
+#define GL_MATRIX13_ARB 0x88CD
+#define GL_MATRIX14_ARB 0x88CE
+#define GL_MATRIX15_ARB 0x88CF
+#define GL_MATRIX16_ARB 0x88D0
+#define GL_MATRIX17_ARB 0x88D1
+#define GL_MATRIX18_ARB 0x88D2
+#define GL_MATRIX19_ARB 0x88D3
+#define GL_MATRIX20_ARB 0x88D4
+#define GL_MATRIX21_ARB 0x88D5
+#define GL_MATRIX22_ARB 0x88D6
+#define GL_MATRIX23_ARB 0x88D7
+#define GL_MATRIX24_ARB 0x88D8
+#define GL_MATRIX25_ARB 0x88D9
+#define GL_MATRIX26_ARB 0x88DA
+#define GL_MATRIX27_ARB 0x88DB
+#define GL_MATRIX28_ARB 0x88DC
+#define GL_MATRIX29_ARB 0x88DD
+#define GL_MATRIX30_ARB 0x88DE
+#define GL_MATRIX31_ARB 0x88DF
+
+typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);
+typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs);
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
+typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);
+
+#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB)
+#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB)
+#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB)
+#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB)
+#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB)
+#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB)
+#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB)
+#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB)
+#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB)
+#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB)
+#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB)
+#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB)
+#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB)
+#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB)
+#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB)
+#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB)
+#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB)
+#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB)
+#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB)
+#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB)
+#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB)
+#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB)
+#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB)
+#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB)
+#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB)
+#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB)
+#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB)
+#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB)
+#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB)
+#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB)
+#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB)
+#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB)
+#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB)
+#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB)
+#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB)
+#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB)
+#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB)
+#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB)
+#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB)
+#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB)
+#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB)
+#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB)
+#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB)
+#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB)
+#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB)
+#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB)
+#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB)
+#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB)
+#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB)
+#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB)
+#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB)
+#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB)
+#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB)
+#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB)
+#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB)
+#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB)
+#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB)
+#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB)
+#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB)
+#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB)
+#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB)
+#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB)
+
+#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program)
+
+#endif /* GL_ARB_vertex_program */
+
+/* -------------------------- GL_ARB_vertex_shader ------------------------- */
+
+#ifndef GL_ARB_vertex_shader
+#define GL_ARB_vertex_shader 1
+
+#define GL_VERTEX_SHADER_ARB 0x8B31
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
+#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
+
+typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name);
+typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name);
+
+#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB)
+#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB)
+#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB)
+
+#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader)
+
+#endif /* GL_ARB_vertex_shader */
+
+/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */
+
+#ifndef GL_ARB_vertex_type_2_10_10_10_rev
+#define GL_ARB_vertex_type_2_10_10_10_rev 1
+
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_INT_2_10_10_10_REV 0x8D9F
+
+typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color);
+typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color);
+typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value);
+
+#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui)
+#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv)
+#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui)
+#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv)
+#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui)
+#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv)
+#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui)
+#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv)
+#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui)
+#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv)
+#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui)
+#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv)
+#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui)
+#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv)
+#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui)
+#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv)
+#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui)
+#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv)
+#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui)
+#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv)
+#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui)
+#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv)
+#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui)
+#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv)
+#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui)
+#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv)
+#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui)
+#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv)
+#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui)
+#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv)
+#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui)
+#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv)
+#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui)
+#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv)
+#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui)
+#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv)
+#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui)
+#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv)
+
+#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev)
+
+#endif /* GL_ARB_vertex_type_2_10_10_10_rev */
+
+/* ------------------------- GL_ARB_viewport_array ------------------------- */
+
+#ifndef GL_ARB_viewport_array
+#define GL_ARB_viewport_array 1
+
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_MAX_VIEWPORTS 0x825B
+#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C
+#define GL_VIEWPORT_BOUNDS_RANGE 0x825D
+#define GL_LAYER_PROVOKING_VERTEX 0x825E
+#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F
+#define GL_UNDEFINED_VERTEX 0x8260
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_PROVOKING_VERTEX 0x8E4F
+
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v);
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f);
+typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data);
+typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data);
+typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v);
+typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v);
+typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v);
+typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v);
+
+#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv)
+#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed)
+#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v)
+#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v)
+#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv)
+#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed)
+#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv)
+#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv)
+#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf)
+#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv)
+
+#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array)
+
+#endif /* GL_ARB_viewport_array */
+
+/* --------------------------- GL_ARB_window_pos --------------------------- */
+
+#ifndef GL_ARB_window_pos
+#define GL_ARB_window_pos 1
+
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p);
+
+#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB)
+#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB)
+#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB)
+#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB)
+#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB)
+#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB)
+#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB)
+#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB)
+#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB)
+#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB)
+#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB)
+#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB)
+#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB)
+#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB)
+#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB)
+#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB)
+
+#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos)
+
+#endif /* GL_ARB_window_pos */
+
+/* ------------------------- GL_ATIX_point_sprites ------------------------- */
+
+#ifndef GL_ATIX_point_sprites
+#define GL_ATIX_point_sprites 1
+
+#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0
+#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1
+#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2
+#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3
+#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4
+#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5
+
+#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites)
+
+#endif /* GL_ATIX_point_sprites */
+
+/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */
+
+#ifndef GL_ATIX_texture_env_combine3
+#define GL_ATIX_texture_env_combine3 1
+
+#define GL_MODULATE_ADD_ATIX 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745
+#define GL_MODULATE_SUBTRACT_ATIX 0x8746
+
+#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3)
+
+#endif /* GL_ATIX_texture_env_combine3 */
+
+/* ----------------------- GL_ATIX_texture_env_route ----------------------- */
+
+#ifndef GL_ATIX_texture_env_route
+#define GL_ATIX_texture_env_route 1
+
+#define GL_SECONDARY_COLOR_ATIX 0x8747
+#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748
+#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749
+
+#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route)
+
+#endif /* GL_ATIX_texture_env_route */
+
+/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */
+
+#ifndef GL_ATIX_vertex_shader_output_point_size
+#define GL_ATIX_vertex_shader_output_point_size 1
+
+#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E
+
+#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size)
+
+#endif /* GL_ATIX_vertex_shader_output_point_size */
+
+/* -------------------------- GL_ATI_draw_buffers -------------------------- */
+
+#ifndef GL_ATI_draw_buffers
+#define GL_ATI_draw_buffers 1
+
+#define GL_MAX_DRAW_BUFFERS_ATI 0x8824
+#define GL_DRAW_BUFFER0_ATI 0x8825
+#define GL_DRAW_BUFFER1_ATI 0x8826
+#define GL_DRAW_BUFFER2_ATI 0x8827
+#define GL_DRAW_BUFFER3_ATI 0x8828
+#define GL_DRAW_BUFFER4_ATI 0x8829
+#define GL_DRAW_BUFFER5_ATI 0x882A
+#define GL_DRAW_BUFFER6_ATI 0x882B
+#define GL_DRAW_BUFFER7_ATI 0x882C
+#define GL_DRAW_BUFFER8_ATI 0x882D
+#define GL_DRAW_BUFFER9_ATI 0x882E
+#define GL_DRAW_BUFFER10_ATI 0x882F
+#define GL_DRAW_BUFFER11_ATI 0x8830
+#define GL_DRAW_BUFFER12_ATI 0x8831
+#define GL_DRAW_BUFFER13_ATI 0x8832
+#define GL_DRAW_BUFFER14_ATI 0x8833
+#define GL_DRAW_BUFFER15_ATI 0x8834
+
+typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs);
+
+#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI)
+
+#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers)
+
+#endif /* GL_ATI_draw_buffers */
+
+/* -------------------------- GL_ATI_element_array ------------------------- */
+
+#ifndef GL_ATI_element_array
+#define GL_ATI_element_array 1
+
+#define GL_ELEMENT_ARRAY_ATI 0x8768
+#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769
+#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A
+
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer);
+
+#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI)
+#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI)
+#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI)
+
+#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array)
+
+#endif /* GL_ATI_element_array */
+
+/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */
+
+#ifndef GL_ATI_envmap_bumpmap
+#define GL_ATI_envmap_bumpmap 1
+
+#define GL_BUMP_ROT_MATRIX_ATI 0x8775
+#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776
+#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777
+#define GL_BUMP_TEX_UNITS_ATI 0x8778
+#define GL_DUDV_ATI 0x8779
+#define GL_DU8DV8_ATI 0x877A
+#define GL_BUMP_ENVMAP_ATI 0x877B
+#define GL_BUMP_TARGET_ATI 0x877C
+
+typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
+typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
+typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
+typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
+
+#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI)
+#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI)
+#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI)
+#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI)
+
+#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap)
+
+#endif /* GL_ATI_envmap_bumpmap */
+
+/* ------------------------- GL_ATI_fragment_shader ------------------------ */
+
+#ifndef GL_ATI_fragment_shader
+#define GL_ATI_fragment_shader 1
+
+#define GL_RED_BIT_ATI 0x00000001
+#define GL_2X_BIT_ATI 0x00000001
+#define GL_4X_BIT_ATI 0x00000002
+#define GL_GREEN_BIT_ATI 0x00000002
+#define GL_COMP_BIT_ATI 0x00000002
+#define GL_BLUE_BIT_ATI 0x00000004
+#define GL_8X_BIT_ATI 0x00000004
+#define GL_NEGATE_BIT_ATI 0x00000004
+#define GL_BIAS_BIT_ATI 0x00000008
+#define GL_HALF_BIT_ATI 0x00000008
+#define GL_QUARTER_BIT_ATI 0x00000010
+#define GL_EIGHTH_BIT_ATI 0x00000020
+#define GL_SATURATE_BIT_ATI 0x00000040
+#define GL_FRAGMENT_SHADER_ATI 0x8920
+#define GL_REG_0_ATI 0x8921
+#define GL_REG_1_ATI 0x8922
+#define GL_REG_2_ATI 0x8923
+#define GL_REG_3_ATI 0x8924
+#define GL_REG_4_ATI 0x8925
+#define GL_REG_5_ATI 0x8926
+#define GL_CON_0_ATI 0x8941
+#define GL_CON_1_ATI 0x8942
+#define GL_CON_2_ATI 0x8943
+#define GL_CON_3_ATI 0x8944
+#define GL_CON_4_ATI 0x8945
+#define GL_CON_5_ATI 0x8946
+#define GL_CON_6_ATI 0x8947
+#define GL_CON_7_ATI 0x8948
+#define GL_MOV_ATI 0x8961
+#define GL_ADD_ATI 0x8963
+#define GL_MUL_ATI 0x8964
+#define GL_SUB_ATI 0x8965
+#define GL_DOT3_ATI 0x8966
+#define GL_DOT4_ATI 0x8967
+#define GL_MAD_ATI 0x8968
+#define GL_LERP_ATI 0x8969
+#define GL_CND_ATI 0x896A
+#define GL_CND0_ATI 0x896B
+#define GL_DOT2_ADD_ATI 0x896C
+#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D
+#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E
+#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F
+#define GL_NUM_PASSES_ATI 0x8970
+#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971
+#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972
+#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973
+#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974
+#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975
+#define GL_SWIZZLE_STR_ATI 0x8976
+#define GL_SWIZZLE_STQ_ATI 0x8977
+#define GL_SWIZZLE_STR_DR_ATI 0x8978
+#define GL_SWIZZLE_STQ_DQ_ATI 0x8979
+#define GL_SWIZZLE_STRQ_ATI 0x897A
+#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B
+
+typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+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);
+typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void);
+typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+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);
+typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void);
+typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);
+typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);
+typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);
+typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value);
+
+#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI)
+#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI)
+#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI)
+#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI)
+#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI)
+#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI)
+#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI)
+#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI)
+#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI)
+#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI)
+#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI)
+#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI)
+#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI)
+#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI)
+
+#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader)
+
+#endif /* GL_ATI_fragment_shader */
+
+/* ------------------------ GL_ATI_map_object_buffer ----------------------- */
+
+#ifndef GL_ATI_map_object_buffer
+#define GL_ATI_map_object_buffer 1
+
+typedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);
+
+#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI)
+#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI)
+
+#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer)
+
+#endif /* GL_ATI_map_object_buffer */
+
+/* ----------------------------- GL_ATI_meminfo ---------------------------- */
+
+#ifndef GL_ATI_meminfo
+#define GL_ATI_meminfo 1
+
+#define GL_VBO_FREE_MEMORY_ATI 0x87FB
+#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
+#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
+
+#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo)
+
+#endif /* GL_ATI_meminfo */
+
+/* -------------------------- GL_ATI_pn_triangles -------------------------- */
+
+#ifndef GL_ATI_pn_triangles
+#define GL_ATI_pn_triangles 1
+
+#define GL_PN_TRIANGLES_ATI 0x87F0
+#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1
+#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2
+#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3
+#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4
+#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5
+#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6
+#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7
+#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8
+
+typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);
+
+#define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI)
+#define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI)
+
+#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles)
+
+#endif /* GL_ATI_pn_triangles */
+
+/* ------------------------ GL_ATI_separate_stencil ------------------------ */
+
+#ifndef GL_ATI_separate_stencil
+#define GL_ATI_separate_stencil 1
+
+#define GL_STENCIL_BACK_FUNC_ATI 0x8800
+#define GL_STENCIL_BACK_FAIL_ATI 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
+
+typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+
+#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI)
+#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI)
+
+#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil)
+
+#endif /* GL_ATI_separate_stencil */
+
+/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */
+
+#ifndef GL_ATI_shader_texture_lod
+#define GL_ATI_shader_texture_lod 1
+
+#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod)
+
+#endif /* GL_ATI_shader_texture_lod */
+
+/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */
+
+#ifndef GL_ATI_text_fragment_shader
+#define GL_ATI_text_fragment_shader 1
+
+#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200
+
+#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader)
+
+#endif /* GL_ATI_text_fragment_shader */
+
+/* --------------------- GL_ATI_texture_compression_3dc -------------------- */
+
+#ifndef GL_ATI_texture_compression_3dc
+#define GL_ATI_texture_compression_3dc 1
+
+#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837
+
+#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc)
+
+#endif /* GL_ATI_texture_compression_3dc */
+
+/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */
+
+#ifndef GL_ATI_texture_env_combine3
+#define GL_ATI_texture_env_combine3 1
+
+#define GL_MODULATE_ADD_ATI 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATI 0x8745
+#define GL_MODULATE_SUBTRACT_ATI 0x8746
+
+#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3)
+
+#endif /* GL_ATI_texture_env_combine3 */
+
+/* -------------------------- GL_ATI_texture_float ------------------------- */
+
+#ifndef GL_ATI_texture_float
+#define GL_ATI_texture_float 1
+
+#define GL_RGBA_FLOAT32_ATI 0x8814
+#define GL_RGB_FLOAT32_ATI 0x8815
+#define GL_ALPHA_FLOAT32_ATI 0x8816
+#define GL_INTENSITY_FLOAT32_ATI 0x8817
+#define GL_LUMINANCE_FLOAT32_ATI 0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819
+#define GL_RGBA_FLOAT16_ATI 0x881A
+#define GL_RGB_FLOAT16_ATI 0x881B
+#define GL_ALPHA_FLOAT16_ATI 0x881C
+#define GL_INTENSITY_FLOAT16_ATI 0x881D
+#define GL_LUMINANCE_FLOAT16_ATI 0x881E
+#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F
+
+#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float)
+
+#endif /* GL_ATI_texture_float */
+
+/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */
+
+#ifndef GL_ATI_texture_mirror_once
+#define GL_ATI_texture_mirror_once 1
+
+#define GL_MIRROR_CLAMP_ATI 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
+
+#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once)
+
+#endif /* GL_ATI_texture_mirror_once */
+
+/* ----------------------- GL_ATI_vertex_array_object ---------------------- */
+
+#ifndef GL_ATI_vertex_array_object
+#define GL_ATI_vertex_array_object 1
+
+#define GL_STATIC_ATI 0x8760
+#define GL_DYNAMIC_ATI 0x8761
+#define GL_PRESERVE_ATI 0x8762
+#define GL_DISCARD_ATI 0x8763
+#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764
+#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765
+#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766
+#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767
+
+typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage);
+typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve);
+typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+
+#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI)
+#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI)
+#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI)
+#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI)
+#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI)
+#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI)
+#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI)
+#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI)
+#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI)
+#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI)
+#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI)
+#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI)
+
+#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object)
+
+#endif /* GL_ATI_vertex_array_object */
+
+/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */
+
+#ifndef GL_ATI_vertex_attrib_array_object
+#define GL_ATI_vertex_attrib_array_object 1
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);
+
+#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI)
+#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI)
+#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI)
+
+#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object)
+
+#endif /* GL_ATI_vertex_attrib_array_object */
+
+/* ------------------------- GL_ATI_vertex_streams ------------------------- */
+
+#ifndef GL_ATI_vertex_streams
+#define GL_ATI_vertex_streams 1
+
+#define GL_MAX_VERTEX_STREAMS_ATI 0x876B
+#define GL_VERTEX_SOURCE_ATI 0x876C
+#define GL_VERTEX_STREAM0_ATI 0x876D
+#define GL_VERTEX_STREAM1_ATI 0x876E
+#define GL_VERTEX_STREAM2_ATI 0x876F
+#define GL_VERTEX_STREAM3_ATI 0x8770
+#define GL_VERTEX_STREAM4_ATI 0x8771
+#define GL_VERTEX_STREAM5_ATI 0x8772
+#define GL_VERTEX_STREAM6_ATI 0x8773
+#define GL_VERTEX_STREAM7_ATI 0x8774
+
+typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v);
+
+#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI)
+#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI)
+#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI)
+#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI)
+#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI)
+#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI)
+#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI)
+#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI)
+#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI)
+#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI)
+#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI)
+#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI)
+#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI)
+#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI)
+#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI)
+#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI)
+#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI)
+#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI)
+#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI)
+#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI)
+#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI)
+#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI)
+#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI)
+#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI)
+#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI)
+#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI)
+#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI)
+#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI)
+#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI)
+#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI)
+#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI)
+#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI)
+#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI)
+#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI)
+#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI)
+#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI)
+#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI)
+
+#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams)
+
+#endif /* GL_ATI_vertex_streams */
+
+/* --------------------------- GL_EXT_422_pixels --------------------------- */
+
+#ifndef GL_EXT_422_pixels
+#define GL_EXT_422_pixels 1
+
+#define GL_422_EXT 0x80CC
+#define GL_422_REV_EXT 0x80CD
+#define GL_422_AVERAGE_EXT 0x80CE
+#define GL_422_REV_AVERAGE_EXT 0x80CF
+
+#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels)
+
+#endif /* GL_EXT_422_pixels */
+
+/* ---------------------------- GL_EXT_Cg_shader --------------------------- */
+
+#ifndef GL_EXT_Cg_shader
+#define GL_EXT_Cg_shader 1
+
+#define GL_CG_VERTEX_SHADER_EXT 0x890E
+#define GL_CG_FRAGMENT_SHADER_EXT 0x890F
+
+#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader)
+
+#endif /* GL_EXT_Cg_shader */
+
+/* ------------------------------ GL_EXT_abgr ------------------------------ */
+
+#ifndef GL_EXT_abgr
+#define GL_EXT_abgr 1
+
+#define GL_ABGR_EXT 0x8000
+
+#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr)
+
+#endif /* GL_EXT_abgr */
+
+/* ------------------------------ GL_EXT_bgra ------------------------------ */
+
+#ifndef GL_EXT_bgra
+#define GL_EXT_bgra 1
+
+#define GL_BGR_EXT 0x80E0
+#define GL_BGRA_EXT 0x80E1
+
+#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra)
+
+#endif /* GL_EXT_bgra */
+
+/* ------------------------ GL_EXT_bindable_uniform ------------------------ */
+
+#ifndef GL_EXT_bindable_uniform
+#define GL_EXT_bindable_uniform 1
+
+#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2
+#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3
+#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4
+#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED
+#define GL_UNIFORM_BUFFER_EXT 0x8DEE
+#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF
+
+typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location);
+typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location);
+typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer);
+
+#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT)
+#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT)
+#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT)
+
+#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform)
+
+#endif /* GL_EXT_bindable_uniform */
+
+/* --------------------------- GL_EXT_blend_color -------------------------- */
+
+#ifndef GL_EXT_blend_color
+#define GL_EXT_blend_color 1
+
+#define GL_CONSTANT_COLOR_EXT 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002
+#define GL_CONSTANT_ALPHA_EXT 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004
+#define GL_BLEND_COLOR_EXT 0x8005
+
+typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+
+#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT)
+
+#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color)
+
+#endif /* GL_EXT_blend_color */
+
+/* --------------------- GL_EXT_blend_equation_separate -------------------- */
+
+#ifndef GL_EXT_blend_equation_separate
+#define GL_EXT_blend_equation_separate 1
+
+#define GL_BLEND_EQUATION_RGB_EXT 0x8009
+#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);
+
+#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT)
+
+#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate)
+
+#endif /* GL_EXT_blend_equation_separate */
+
+/* ----------------------- GL_EXT_blend_func_separate ---------------------- */
+
+#ifndef GL_EXT_blend_func_separate
+#define GL_EXT_blend_func_separate 1
+
+#define GL_BLEND_DST_RGB_EXT 0x80C8
+#define GL_BLEND_SRC_RGB_EXT 0x80C9
+#define GL_BLEND_DST_ALPHA_EXT 0x80CA
+#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
+
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+
+#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT)
+
+#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate)
+
+#endif /* GL_EXT_blend_func_separate */
+
+/* ------------------------- GL_EXT_blend_logic_op ------------------------- */
+
+#ifndef GL_EXT_blend_logic_op
+#define GL_EXT_blend_logic_op 1
+
+#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op)
+
+#endif /* GL_EXT_blend_logic_op */
+
+/* -------------------------- GL_EXT_blend_minmax -------------------------- */
+
+#ifndef GL_EXT_blend_minmax
+#define GL_EXT_blend_minmax 1
+
+#define GL_FUNC_ADD_EXT 0x8006
+#define GL_MIN_EXT 0x8007
+#define GL_MAX_EXT 0x8008
+#define GL_BLEND_EQUATION_EXT 0x8009
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);
+
+#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT)
+
+#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax)
+
+#endif /* GL_EXT_blend_minmax */
+
+/* ------------------------- GL_EXT_blend_subtract ------------------------- */
+
+#ifndef GL_EXT_blend_subtract
+#define GL_EXT_blend_subtract 1
+
+#define GL_FUNC_SUBTRACT_EXT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
+
+#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract)
+
+#endif /* GL_EXT_blend_subtract */
+
+/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */
+
+#ifndef GL_EXT_clip_volume_hint
+#define GL_EXT_clip_volume_hint 1
+
+#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0
+
+#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint)
+
+#endif /* GL_EXT_clip_volume_hint */
+
+/* ------------------------------ GL_EXT_cmyka ----------------------------- */
+
+#ifndef GL_EXT_cmyka
+#define GL_EXT_cmyka 1
+
+#define GL_CMYK_EXT 0x800C
+#define GL_CMYKA_EXT 0x800D
+#define GL_PACK_CMYK_HINT_EXT 0x800E
+#define GL_UNPACK_CMYK_HINT_EXT 0x800F
+
+#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka)
+
+#endif /* GL_EXT_cmyka */
+
+/* ------------------------- GL_EXT_color_subtable ------------------------- */
+
+#ifndef GL_EXT_color_subtable
+#define GL_EXT_color_subtable 1
+
+typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+
+#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT)
+#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT)
+
+#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable)
+
+#endif /* GL_EXT_color_subtable */
+
+/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */
+
+#ifndef GL_EXT_compiled_vertex_array
+#define GL_EXT_compiled_vertex_array 1
+
+#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8
+#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9
+
+typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);
+
+#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT)
+#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT)
+
+#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array)
+
+#endif /* GL_EXT_compiled_vertex_array */
+
+/* --------------------------- GL_EXT_convolution -------------------------- */
+
+#ifndef GL_EXT_convolution
+#define GL_EXT_convolution 1
+
+#define GL_CONVOLUTION_1D_EXT 0x8010
+#define GL_CONVOLUTION_2D_EXT 0x8011
+#define GL_SEPARABLE_2D_EXT 0x8012
+#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013
+#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014
+#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015
+#define GL_REDUCE_EXT 0x8016
+#define GL_CONVOLUTION_FORMAT_EXT 0x8017
+#define GL_CONVOLUTION_WIDTH_EXT 0x8018
+#define GL_CONVOLUTION_HEIGHT_EXT 0x8019
+#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A
+#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B
+#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C
+#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D
+#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E
+#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F
+#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023
+
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span);
+typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column);
+
+#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT)
+#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT)
+#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT)
+#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT)
+#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT)
+#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT)
+#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT)
+#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT)
+#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT)
+#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT)
+#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT)
+#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT)
+#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT)
+
+#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution)
+
+#endif /* GL_EXT_convolution */
+
+/* ------------------------ GL_EXT_coordinate_frame ------------------------ */
+
+#ifndef GL_EXT_coordinate_frame
+#define GL_EXT_coordinate_frame 1
+
+#define GL_TANGENT_ARRAY_EXT 0x8439
+#define GL_BINORMAL_ARRAY_EXT 0x843A
+#define GL_CURRENT_TANGENT_EXT 0x843B
+#define GL_CURRENT_BINORMAL_EXT 0x843C
+#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E
+#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F
+#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440
+#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441
+#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442
+#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443
+#define GL_MAP1_TANGENT_EXT 0x8444
+#define GL_MAP2_TANGENT_EXT 0x8445
+#define GL_MAP1_BINORMAL_EXT 0x8446
+#define GL_MAP2_BINORMAL_EXT 0x8447
+
+typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer);
+typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer);
+
+#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT)
+#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT)
+
+#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame)
+
+#endif /* GL_EXT_coordinate_frame */
+
+/* -------------------------- GL_EXT_copy_texture -------------------------- */
+
+#ifndef GL_EXT_copy_texture
+#define GL_EXT_copy_texture 1
+
+typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT)
+#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT)
+#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT)
+#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT)
+#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT)
+
+#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture)
+
+#endif /* GL_EXT_copy_texture */
+
+/* --------------------------- GL_EXT_cull_vertex -------------------------- */
+
+#ifndef GL_EXT_cull_vertex
+#define GL_EXT_cull_vertex 1
+
+#define GL_CULL_VERTEX_EXT 0x81AA
+#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB
+#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC
+
+typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);
+
+#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT)
+#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT)
+
+#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex)
+
+#endif /* GL_EXT_cull_vertex */
+
+/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */
+
+#ifndef GL_EXT_depth_bounds_test
+#define GL_EXT_depth_bounds_test 1
+
+#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890
+#define GL_DEPTH_BOUNDS_EXT 0x8891
+
+typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax);
+
+#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT)
+
+#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test)
+
+#endif /* GL_EXT_depth_bounds_test */
+
+/* ----------------------- GL_EXT_direct_state_access ---------------------- */
+
+#ifndef GL_EXT_direct_state_access
+#define GL_EXT_direct_state_access 1
+
+#define GL_PROGRAM_MATRIX_EXT 0x8E2D
+#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E
+#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F
+
+typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture);
+typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target);
+typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+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);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);
+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);
+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);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+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);
+typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data);
+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);
+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);
+typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);
+typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);
+typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target);
+typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target);
+typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void* img);
+typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void* img);
+typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void* string);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);
+typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLvoid** param);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, GLvoid** param);
+typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access);
+typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f);
+typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode);
+typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m);
+typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f);
+typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode);
+typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode);
+typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels);
+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);
+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);
+typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params);
+typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param);
+typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);
+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);
+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);
+typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);
+typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);
+typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params);
+typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void* string);
+typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);
+typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels);
+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);
+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);
+typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params);
+typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param);
+typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param);
+typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);
+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);
+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);
+typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+
+#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT)
+#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT)
+#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT)
+#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT)
+#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT)
+#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT)
+#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT)
+#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT)
+#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT)
+#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT)
+#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT)
+#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT)
+#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT)
+#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT)
+#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT)
+#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT)
+#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT)
+#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT)
+#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT)
+#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT)
+#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT)
+#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT)
+#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT)
+#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT)
+#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT)
+#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT)
+#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT)
+#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT)
+#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT)
+#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT)
+#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT)
+#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT)
+#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT)
+#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT)
+#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT)
+#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT)
+#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT)
+#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT)
+#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT)
+#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT)
+#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT)
+#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT)
+#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT)
+#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT)
+#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT)
+#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT)
+#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT)
+#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT)
+#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT)
+#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT)
+#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT)
+#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT)
+#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT)
+#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT)
+#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT)
+#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT)
+#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT)
+#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT)
+#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT)
+#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT)
+#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT)
+#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT)
+#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT)
+#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT)
+#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT)
+#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT)
+#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT)
+#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT)
+#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT)
+#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT)
+#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT)
+#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT)
+#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT)
+#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT)
+#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT)
+#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT)
+#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT)
+#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT)
+#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT)
+#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT)
+#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT)
+#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT)
+#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT)
+#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT)
+#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT)
+#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT)
+#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT)
+#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT)
+#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT)
+#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT)
+#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT)
+#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT)
+#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT)
+#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT)
+#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT)
+#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT)
+#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT)
+#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT)
+#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT)
+#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT)
+#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT)
+#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT)
+#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT)
+#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT)
+#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT)
+#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT)
+#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT)
+#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT)
+#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT)
+#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT)
+#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT)
+#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT)
+#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT)
+#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT)
+#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT)
+#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT)
+#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT)
+#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT)
+#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT)
+#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT)
+#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT)
+#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT)
+#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT)
+#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT)
+#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT)
+#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT)
+#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT)
+#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT)
+#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT)
+#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT)
+#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT)
+#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT)
+#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT)
+#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT)
+#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT)
+#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT)
+#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT)
+#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT)
+#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT)
+#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT)
+#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT)
+#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT)
+#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT)
+#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT)
+#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT)
+#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT)
+#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT)
+#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT)
+#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT)
+#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT)
+#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT)
+#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT)
+#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT)
+#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT)
+#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT)
+#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT)
+#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT)
+#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT)
+#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT)
+#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT)
+#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT)
+#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT)
+#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT)
+#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT)
+#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT)
+#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT)
+#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT)
+#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT)
+#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT)
+#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT)
+#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT)
+#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT)
+#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT)
+#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT)
+#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT)
+#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT)
+#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT)
+#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT)
+#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT)
+#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT)
+#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT)
+#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT)
+#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT)
+#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT)
+#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT)
+#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT)
+#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT)
+#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT)
+#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT)
+#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT)
+#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT)
+#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT)
+#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT)
+#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT)
+#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT)
+#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT)
+#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT)
+#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT)
+#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT)
+#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT)
+#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT)
+#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT)
+#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT)
+#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT)
+#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT)
+#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT)
+#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT)
+#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT)
+#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT)
+#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT)
+#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT)
+#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT)
+#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT)
+
+#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access)
+
+#endif /* GL_EXT_direct_state_access */
+
+/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */
+
+#ifndef GL_EXT_draw_buffers2
+#define GL_EXT_draw_buffers2 1
+
+typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index);
+typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data);
+typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data);
+typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index);
+
+#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT)
+#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT)
+#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT)
+#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT)
+#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT)
+#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT)
+
+#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2)
+
+#endif /* GL_EXT_draw_buffers2 */
+
+/* ------------------------- GL_EXT_draw_instanced ------------------------- */
+
+#ifndef GL_EXT_draw_instanced
+#define GL_EXT_draw_instanced 1
+
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
+
+#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT)
+#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT)
+
+#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced)
+
+#endif /* GL_EXT_draw_instanced */
+
+/* ----------------------- GL_EXT_draw_range_elements ---------------------- */
+
+#ifndef GL_EXT_draw_range_elements
+#define GL_EXT_draw_range_elements 1
+
+#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8
+#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9
+
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
+
+#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT)
+
+#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements)
+
+#endif /* GL_EXT_draw_range_elements */
+
+/* ---------------------------- GL_EXT_fog_coord --------------------------- */
+
+#ifndef GL_EXT_fog_coord
+#define GL_EXT_fog_coord 1
+
+#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
+#define GL_FOG_COORDINATE_EXT 0x8451
+#define GL_FRAGMENT_DEPTH_EXT 0x8452
+#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
+#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457
+
+typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
+
+#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT)
+#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT)
+#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT)
+#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT)
+#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT)
+
+#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord)
+
+#endif /* GL_EXT_fog_coord */
+
+/* ------------------------ GL_EXT_fragment_lighting ----------------------- */
+
+#ifndef GL_EXT_fragment_lighting
+#define GL_EXT_fragment_lighting 1
+
+#define GL_FRAGMENT_LIGHTING_EXT 0x8400
+#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401
+#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402
+#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403
+#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404
+#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405
+#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406
+#define GL_LIGHT_ENV_MODE_EXT 0x8407
+#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408
+#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409
+#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A
+#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B
+#define GL_FRAGMENT_LIGHT0_EXT 0x840C
+#define GL_FRAGMENT_LIGHT7_EXT 0x8413
+
+typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param);
+
+#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT)
+#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT)
+#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT)
+#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT)
+#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT)
+#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT)
+#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT)
+#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT)
+#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT)
+#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT)
+#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT)
+#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT)
+#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT)
+#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT)
+#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT)
+#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT)
+#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT)
+#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT)
+
+#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting)
+
+#endif /* GL_EXT_fragment_lighting */
+
+/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */
+
+#ifndef GL_EXT_framebuffer_blit
+#define GL_EXT_framebuffer_blit 1
+
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
+#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
+
+typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+
+#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT)
+
+#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit)
+
+#endif /* GL_EXT_framebuffer_blit */
+
+/* --------------------- GL_EXT_framebuffer_multisample -------------------- */
+
+#ifndef GL_EXT_framebuffer_multisample
+#define GL_EXT_framebuffer_multisample 1
+
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_MAX_SAMPLES_EXT 0x8D57
+
+typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+
+#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT)
+
+#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample)
+
+#endif /* GL_EXT_framebuffer_multisample */
+
+/* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */
+
+#ifndef GL_EXT_framebuffer_multisample_blit_scaled
+#define GL_EXT_framebuffer_multisample_blit_scaled 1
+
+#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA
+#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB
+
+#define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled)
+
+#endif /* GL_EXT_framebuffer_multisample_blit_scaled */
+
+/* ----------------------- GL_EXT_framebuffer_object ----------------------- */
+
+#ifndef GL_EXT_framebuffer_object
+#define GL_EXT_framebuffer_object 1
+
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
+#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
+#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
+#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
+#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
+#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
+#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
+#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
+#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
+#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
+#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
+#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
+#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
+#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
+#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
+#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
+#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
+#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
+#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
+#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
+#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
+#define GL_FRAMEBUFFER_EXT 0x8D40
+#define GL_RENDERBUFFER_EXT 0x8D41
+#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
+#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
+#define GL_STENCIL_INDEX1_EXT 0x8D46
+#define GL_STENCIL_INDEX4_EXT 0x8D47
+#define GL_STENCIL_INDEX8_EXT 0x8D48
+#define GL_STENCIL_INDEX16_EXT 0x8D49
+#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
+
+typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer);
+typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer);
+typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers);
+typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers);
+typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers);
+typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer);
+typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer);
+typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+
+#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT)
+#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT)
+#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT)
+#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT)
+#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT)
+#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT)
+#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT)
+#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT)
+#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT)
+#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT)
+#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT)
+#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT)
+#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT)
+#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT)
+#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT)
+#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT)
+#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT)
+
+#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object)
+
+#endif /* GL_EXT_framebuffer_object */
+
+/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */
+
+#ifndef GL_EXT_framebuffer_sRGB
+#define GL_EXT_framebuffer_sRGB 1
+
+#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
+#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA
+
+#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB)
+
+#endif /* GL_EXT_framebuffer_sRGB */
+
+/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */
+
+#ifndef GL_EXT_geometry_shader4
+#define GL_EXT_geometry_shader4 1
+
+#define GL_LINES_ADJACENCY_EXT 0xA
+#define GL_LINE_STRIP_ADJACENCY_EXT 0xB
+#define GL_TRIANGLES_ADJACENCY_EXT 0xC
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD
+#define GL_PROGRAM_POINT_SIZE_EXT 0x8642
+#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
+#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
+
+#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT)
+#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT)
+#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT)
+
+#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4)
+
+#endif /* GL_EXT_geometry_shader4 */
+
+/* --------------------- GL_EXT_gpu_program_parameters --------------------- */
+
+#ifndef GL_EXT_gpu_program_parameters
+#define GL_EXT_gpu_program_parameters 1
+
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params);
+
+#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT)
+#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT)
+
+#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters)
+
+#endif /* GL_EXT_gpu_program_parameters */
+
+/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */
+
+#ifndef GL_EXT_gpu_shader4
+#define GL_EXT_gpu_shader4 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD
+#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0
+#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1
+#define GL_SAMPLER_BUFFER_EXT 0x8DC2
+#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3
+#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5
+#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6
+#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7
+#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8
+#define GL_INT_SAMPLER_1D_EXT 0x8DC9
+#define GL_INT_SAMPLER_2D_EXT 0x8DCA
+#define GL_INT_SAMPLER_3D_EXT 0x8DCB
+#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC
+#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD
+#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE
+#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF
+#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1
+#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8
+
+typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name);
+typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT)
+#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT)
+#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT)
+#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT)
+#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT)
+#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT)
+#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT)
+#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT)
+#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT)
+#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT)
+#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT)
+#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT)
+#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT)
+#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT)
+#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT)
+#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT)
+#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT)
+#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT)
+#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT)
+#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT)
+#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT)
+#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT)
+#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT)
+#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT)
+#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT)
+#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT)
+#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT)
+#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT)
+#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT)
+#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT)
+#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT)
+#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT)
+#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT)
+#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT)
+
+#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4)
+
+#endif /* GL_EXT_gpu_shader4 */
+
+/* ---------------------------- GL_EXT_histogram --------------------------- */
+
+#ifndef GL_EXT_histogram
+#define GL_EXT_histogram 1
+
+#define GL_HISTOGRAM_EXT 0x8024
+#define GL_PROXY_HISTOGRAM_EXT 0x8025
+#define GL_HISTOGRAM_WIDTH_EXT 0x8026
+#define GL_HISTOGRAM_FORMAT_EXT 0x8027
+#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028
+#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029
+#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A
+#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B
+#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C
+#define GL_HISTOGRAM_SINK_EXT 0x802D
+#define GL_MINMAX_EXT 0x802E
+#define GL_MINMAX_FORMAT_EXT 0x802F
+#define GL_MINMAX_SINK_EXT 0x8030
+
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target);
+
+#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT)
+#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT)
+#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT)
+#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT)
+#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT)
+#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT)
+#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT)
+#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT)
+#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT)
+#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT)
+
+#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram)
+
+#endif /* GL_EXT_histogram */
+
+/* ----------------------- GL_EXT_index_array_formats ---------------------- */
+
+#ifndef GL_EXT_index_array_formats
+#define GL_EXT_index_array_formats 1
+
+#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats)
+
+#endif /* GL_EXT_index_array_formats */
+
+/* --------------------------- GL_EXT_index_func --------------------------- */
+
+#ifndef GL_EXT_index_func
+#define GL_EXT_index_func 1
+
+typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref);
+
+#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT)
+
+#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func)
+
+#endif /* GL_EXT_index_func */
+
+/* ------------------------- GL_EXT_index_material ------------------------- */
+
+#ifndef GL_EXT_index_material
+#define GL_EXT_index_material 1
+
+typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);
+
+#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT)
+
+#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material)
+
+#endif /* GL_EXT_index_material */
+
+/* -------------------------- GL_EXT_index_texture ------------------------- */
+
+#ifndef GL_EXT_index_texture
+#define GL_EXT_index_texture 1
+
+#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture)
+
+#endif /* GL_EXT_index_texture */
+
+/* -------------------------- GL_EXT_light_texture ------------------------- */
+
+#ifndef GL_EXT_light_texture
+#define GL_EXT_light_texture 1
+
+#define GL_FRAGMENT_MATERIAL_EXT 0x8349
+#define GL_FRAGMENT_NORMAL_EXT 0x834A
+#define GL_FRAGMENT_COLOR_EXT 0x834C
+#define GL_ATTENUATION_EXT 0x834D
+#define GL_SHADOW_ATTENUATION_EXT 0x834E
+#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F
+#define GL_TEXTURE_LIGHT_EXT 0x8350
+#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351
+#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352
+#define GL_FRAGMENT_DEPTH_EXT 0x8452
+
+typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);
+typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname);
+typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);
+
+#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT)
+#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT)
+#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT)
+
+#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture)
+
+#endif /* GL_EXT_light_texture */
+
+/* ------------------------- GL_EXT_misc_attribute ------------------------- */
+
+#ifndef GL_EXT_misc_attribute
+#define GL_EXT_misc_attribute 1
+
+#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute)
+
+#endif /* GL_EXT_misc_attribute */
+
+/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */
+
+#ifndef GL_EXT_multi_draw_arrays
+#define GL_EXT_multi_draw_arrays 1
+
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount);
+
+#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT)
+#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT)
+
+#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays)
+
+#endif /* GL_EXT_multi_draw_arrays */
+
+/* --------------------------- GL_EXT_multisample -------------------------- */
+
+#ifndef GL_EXT_multisample
+#define GL_EXT_multisample 1
+
+#define GL_MULTISAMPLE_EXT 0x809D
+#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F
+#define GL_SAMPLE_MASK_EXT 0x80A0
+#define GL_1PASS_EXT 0x80A1
+#define GL_2PASS_0_EXT 0x80A2
+#define GL_2PASS_1_EXT 0x80A3
+#define GL_4PASS_0_EXT 0x80A4
+#define GL_4PASS_1_EXT 0x80A5
+#define GL_4PASS_2_EXT 0x80A6
+#define GL_4PASS_3_EXT 0x80A7
+#define GL_SAMPLE_BUFFERS_EXT 0x80A8
+#define GL_SAMPLES_EXT 0x80A9
+#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA
+#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB
+#define GL_SAMPLE_PATTERN_EXT 0x80AC
+#define GL_MULTISAMPLE_BIT_EXT 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);
+typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);
+
+#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT)
+#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT)
+
+#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample)
+
+#endif /* GL_EXT_multisample */
+
+/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */
+
+#ifndef GL_EXT_packed_depth_stencil
+#define GL_EXT_packed_depth_stencil 1
+
+#define GL_DEPTH_STENCIL_EXT 0x84F9
+#define GL_UNSIGNED_INT_24_8_EXT 0x84FA
+#define GL_DEPTH24_STENCIL8_EXT 0x88F0
+#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
+
+#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil)
+
+#endif /* GL_EXT_packed_depth_stencil */
+
+/* -------------------------- GL_EXT_packed_float -------------------------- */
+
+#ifndef GL_EXT_packed_float
+#define GL_EXT_packed_float 1
+
+#define GL_R11F_G11F_B10F_EXT 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B
+#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C
+
+#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float)
+
+#endif /* GL_EXT_packed_float */
+
+/* -------------------------- GL_EXT_packed_pixels ------------------------- */
+
+#ifndef GL_EXT_packed_pixels
+#define GL_EXT_packed_pixels 1
+
+#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032
+#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034
+#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035
+#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036
+
+#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels)
+
+#endif /* GL_EXT_packed_pixels */
+
+/* ------------------------ GL_EXT_paletted_texture ------------------------ */
+
+#ifndef GL_EXT_paletted_texture
+#define GL_EXT_paletted_texture 1
+
+#define GL_TEXTURE_1D 0x0DE0
+#define GL_TEXTURE_2D 0x0DE1
+#define GL_PROXY_TEXTURE_1D 0x8063
+#define GL_PROXY_TEXTURE_2D 0x8064
+#define GL_TEXTURE_3D_EXT 0x806F
+#define GL_PROXY_TEXTURE_3D_EXT 0x8070
+#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8
+#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF
+#define GL_COLOR_INDEX1_EXT 0x80E2
+#define GL_COLOR_INDEX2_EXT 0x80E3
+#define GL_COLOR_INDEX4_EXT 0x80E4
+#define GL_COLOR_INDEX8_EXT 0x80E5
+#define GL_COLOR_INDEX12_EXT 0x80E6
+#define GL_COLOR_INDEX16_EXT 0x80E7
+#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
+#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
+
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params);
+
+#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT)
+#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT)
+#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT)
+#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT)
+
+#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture)
+
+#endif /* GL_EXT_paletted_texture */
+
+/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */
+
+#ifndef GL_EXT_pixel_buffer_object
+#define GL_EXT_pixel_buffer_object 1
+
+#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF
+
+#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object)
+
+#endif /* GL_EXT_pixel_buffer_object */
+
+/* ------------------------- GL_EXT_pixel_transform ------------------------ */
+
+#ifndef GL_EXT_pixel_transform
+#define GL_EXT_pixel_transform 1
+
+#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330
+#define GL_PIXEL_MAG_FILTER_EXT 0x8331
+#define GL_PIXEL_MIN_FILTER_EXT 0x8332
+#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333
+#define GL_CUBIC_EXT 0x8334
+#define GL_AVERAGE_EXT 0x8335
+#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336
+#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337
+#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338
+
+typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params);
+
+#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT)
+#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT)
+#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT)
+#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT)
+#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT)
+#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT)
+
+#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform)
+
+#endif /* GL_EXT_pixel_transform */
+
+/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */
+
+#ifndef GL_EXT_pixel_transform_color_table
+#define GL_EXT_pixel_transform_color_table 1
+
+#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table)
+
+#endif /* GL_EXT_pixel_transform_color_table */
+
+/* ------------------------ GL_EXT_point_parameters ------------------------ */
+
+#ifndef GL_EXT_point_parameters
+#define GL_EXT_point_parameters 1
+
+#define GL_POINT_SIZE_MIN_EXT 0x8126
+#define GL_POINT_SIZE_MAX_EXT 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
+#define GL_DISTANCE_ATTENUATION_EXT 0x8129
+
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params);
+
+#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT)
+#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT)
+
+#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters)
+
+#endif /* GL_EXT_point_parameters */
+
+/* ------------------------- GL_EXT_polygon_offset ------------------------- */
+
+#ifndef GL_EXT_polygon_offset
+#define GL_EXT_polygon_offset 1
+
+#define GL_POLYGON_OFFSET_EXT 0x8037
+#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038
+#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039
+
+typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);
+
+#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT)
+
+#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset)
+
+#endif /* GL_EXT_polygon_offset */
+
+/* ------------------------ GL_EXT_provoking_vertex ------------------------ */
+
+#ifndef GL_EXT_provoking_vertex
+#define GL_EXT_provoking_vertex 1
+
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E
+#define GL_PROVOKING_VERTEX_EXT 0x8E4F
+
+typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode);
+
+#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT)
+
+#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex)
+
+#endif /* GL_EXT_provoking_vertex */
+
+/* ------------------------- GL_EXT_rescale_normal ------------------------- */
+
+#ifndef GL_EXT_rescale_normal
+#define GL_EXT_rescale_normal 1
+
+#define GL_RESCALE_NORMAL_EXT 0x803A
+
+#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal)
+
+#endif /* GL_EXT_rescale_normal */
+
+/* -------------------------- GL_EXT_scene_marker -------------------------- */
+
+#ifndef GL_EXT_scene_marker
+#define GL_EXT_scene_marker 1
+
+typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void);
+typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void);
+
+#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT)
+#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT)
+
+#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker)
+
+#endif /* GL_EXT_scene_marker */
+
+/* ------------------------- GL_EXT_secondary_color ------------------------ */
+
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 1
+
+#define GL_COLOR_SUM_EXT 0x8458
+#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A
+#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C
+#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
+#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E
+
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+
+#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT)
+#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT)
+#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT)
+#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT)
+#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT)
+#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT)
+#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT)
+#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT)
+#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT)
+#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT)
+#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT)
+#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT)
+#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT)
+#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT)
+#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT)
+#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT)
+#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT)
+
+#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color)
+
+#endif /* GL_EXT_secondary_color */
+
+/* --------------------- GL_EXT_separate_shader_objects -------------------- */
+
+#ifndef GL_EXT_separate_shader_objects
+#define GL_EXT_separate_shader_objects 1
+
+#define GL_ACTIVE_PROGRAM_EXT 0x8B8D
+
+typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program);
+typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const char* string);
+typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program);
+
+#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT)
+#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT)
+#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT)
+
+#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects)
+
+#endif /* GL_EXT_separate_shader_objects */
+
+/* --------------------- GL_EXT_separate_specular_color -------------------- */
+
+#ifndef GL_EXT_separate_specular_color
+#define GL_EXT_separate_specular_color 1
+
+#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8
+#define GL_SINGLE_COLOR_EXT 0x81F9
+#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA
+
+#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color)
+
+#endif /* GL_EXT_separate_specular_color */
+
+/* --------------------- GL_EXT_shader_image_load_store -------------------- */
+
+#ifndef GL_EXT_shader_image_load_store
+#define GL_EXT_shader_image_load_store 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020
+#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000
+#define GL_MAX_IMAGE_UNITS_EXT 0x8F38
+#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39
+#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C
+#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E
+#define GL_IMAGE_1D_EXT 0x904C
+#define GL_IMAGE_2D_EXT 0x904D
+#define GL_IMAGE_3D_EXT 0x904E
+#define GL_IMAGE_2D_RECT_EXT 0x904F
+#define GL_IMAGE_CUBE_EXT 0x9050
+#define GL_IMAGE_BUFFER_EXT 0x9051
+#define GL_IMAGE_1D_ARRAY_EXT 0x9052
+#define GL_IMAGE_2D_ARRAY_EXT 0x9053
+#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054
+#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055
+#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056
+#define GL_INT_IMAGE_1D_EXT 0x9057
+#define GL_INT_IMAGE_2D_EXT 0x9058
+#define GL_INT_IMAGE_3D_EXT 0x9059
+#define GL_INT_IMAGE_2D_RECT_EXT 0x905A
+#define GL_INT_IMAGE_CUBE_EXT 0x905B
+#define GL_INT_IMAGE_BUFFER_EXT 0x905C
+#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D
+#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F
+#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060
+#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061
+#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062
+#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064
+#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065
+#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066
+#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067
+#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C
+#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D
+#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E
+#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF
+
+typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format);
+typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers);
+
+#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT)
+#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT)
+
+#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store)
+
+#endif /* GL_EXT_shader_image_load_store */
+
+/* -------------------------- GL_EXT_shadow_funcs -------------------------- */
+
+#ifndef GL_EXT_shadow_funcs
+#define GL_EXT_shadow_funcs 1
+
+#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs)
+
+#endif /* GL_EXT_shadow_funcs */
+
+/* --------------------- GL_EXT_shared_texture_palette --------------------- */
+
+#ifndef GL_EXT_shared_texture_palette
+#define GL_EXT_shared_texture_palette 1
+
+#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
+
+#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette)
+
+#endif /* GL_EXT_shared_texture_palette */
+
+/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */
+
+#ifndef GL_EXT_stencil_clear_tag
+#define GL_EXT_stencil_clear_tag 1
+
+#define GL_STENCIL_TAG_BITS_EXT 0x88F2
+#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3
+
+#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag)
+
+#endif /* GL_EXT_stencil_clear_tag */
+
+/* ------------------------ GL_EXT_stencil_two_side ------------------------ */
+
+#ifndef GL_EXT_stencil_two_side
+#define GL_EXT_stencil_two_side 1
+
+#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910
+#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
+
+typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);
+
+#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT)
+
+#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side)
+
+#endif /* GL_EXT_stencil_two_side */
+
+/* -------------------------- GL_EXT_stencil_wrap -------------------------- */
+
+#ifndef GL_EXT_stencil_wrap
+#define GL_EXT_stencil_wrap 1
+
+#define GL_INCR_WRAP_EXT 0x8507
+#define GL_DECR_WRAP_EXT 0x8508
+
+#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap)
+
+#endif /* GL_EXT_stencil_wrap */
+
+/* --------------------------- GL_EXT_subtexture --------------------------- */
+
+#ifndef GL_EXT_subtexture
+#define GL_EXT_subtexture 1
+
+typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels);
+typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
+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);
+
+#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT)
+#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT)
+#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT)
+
+#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture)
+
+#endif /* GL_EXT_subtexture */
+
+/* ----------------------------- GL_EXT_texture ---------------------------- */
+
+#ifndef GL_EXT_texture
+#define GL_EXT_texture 1
+
+#define GL_ALPHA4_EXT 0x803B
+#define GL_ALPHA8_EXT 0x803C
+#define GL_ALPHA12_EXT 0x803D
+#define GL_ALPHA16_EXT 0x803E
+#define GL_LUMINANCE4_EXT 0x803F
+#define GL_LUMINANCE8_EXT 0x8040
+#define GL_LUMINANCE12_EXT 0x8041
+#define GL_LUMINANCE16_EXT 0x8042
+#define GL_LUMINANCE4_ALPHA4_EXT 0x8043
+#define GL_LUMINANCE6_ALPHA2_EXT 0x8044
+#define GL_LUMINANCE8_ALPHA8_EXT 0x8045
+#define GL_LUMINANCE12_ALPHA4_EXT 0x8046
+#define GL_LUMINANCE12_ALPHA12_EXT 0x8047
+#define GL_LUMINANCE16_ALPHA16_EXT 0x8048
+#define GL_INTENSITY_EXT 0x8049
+#define GL_INTENSITY4_EXT 0x804A
+#define GL_INTENSITY8_EXT 0x804B
+#define GL_INTENSITY12_EXT 0x804C
+#define GL_INTENSITY16_EXT 0x804D
+#define GL_RGB2_EXT 0x804E
+#define GL_RGB4_EXT 0x804F
+#define GL_RGB5_EXT 0x8050
+#define GL_RGB8_EXT 0x8051
+#define GL_RGB10_EXT 0x8052
+#define GL_RGB12_EXT 0x8053
+#define GL_RGB16_EXT 0x8054
+#define GL_RGBA2_EXT 0x8055
+#define GL_RGBA4_EXT 0x8056
+#define GL_RGB5_A1_EXT 0x8057
+#define GL_RGBA8_EXT 0x8058
+#define GL_RGB10_A2_EXT 0x8059
+#define GL_RGBA12_EXT 0x805A
+#define GL_RGBA16_EXT 0x805B
+#define GL_TEXTURE_RED_SIZE_EXT 0x805C
+#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D
+#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E
+#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F
+#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060
+#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061
+#define GL_REPLACE_EXT 0x8062
+#define GL_PROXY_TEXTURE_1D_EXT 0x8063
+#define GL_PROXY_TEXTURE_2D_EXT 0x8064
+
+#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture)
+
+#endif /* GL_EXT_texture */
+
+/* ---------------------------- GL_EXT_texture3D --------------------------- */
+
+#ifndef GL_EXT_texture3D
+#define GL_EXT_texture3D 1
+
+#define GL_PACK_SKIP_IMAGES_EXT 0x806B
+#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C
+#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E
+#define GL_TEXTURE_3D_EXT 0x806F
+#define GL_PROXY_TEXTURE_3D_EXT 0x8070
+#define GL_TEXTURE_DEPTH_EXT 0x8071
+#define GL_TEXTURE_WRAP_R_EXT 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
+
+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);
+
+#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT)
+
+#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D)
+
+#endif /* GL_EXT_texture3D */
+
+/* -------------------------- GL_EXT_texture_array ------------------------- */
+
+#ifndef GL_EXT_texture_array
+#define GL_EXT_texture_array 1
+
+#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
+#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
+#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18
+#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19
+#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
+#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
+#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C
+#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
+
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+
+#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT)
+
+#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array)
+
+#endif /* GL_EXT_texture_array */
+
+/* ---------------------- GL_EXT_texture_buffer_object --------------------- */
+
+#ifndef GL_EXT_texture_buffer_object
+#define GL_EXT_texture_buffer_object 1
+
+#define GL_TEXTURE_BUFFER_EXT 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D
+#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E
+
+typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+
+#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT)
+
+#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object)
+
+#endif /* GL_EXT_texture_buffer_object */
+
+/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */
+
+#ifndef GL_EXT_texture_compression_dxt1
+#define GL_EXT_texture_compression_dxt1 1
+
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+
+#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1)
+
+#endif /* GL_EXT_texture_compression_dxt1 */
+
+/* -------------------- GL_EXT_texture_compression_latc -------------------- */
+
+#ifndef GL_EXT_texture_compression_latc
+#define GL_EXT_texture_compression_latc 1
+
+#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
+#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71
+#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
+#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73
+
+#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc)
+
+#endif /* GL_EXT_texture_compression_latc */
+
+/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */
+
+#ifndef GL_EXT_texture_compression_rgtc
+#define GL_EXT_texture_compression_rgtc 1
+
+#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB
+#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC
+#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD
+#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
+
+#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc)
+
+#endif /* GL_EXT_texture_compression_rgtc */
+
+/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */
+
+#ifndef GL_EXT_texture_compression_s3tc
+#define GL_EXT_texture_compression_s3tc 1
+
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+
+#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc)
+
+#endif /* GL_EXT_texture_compression_s3tc */
+
+/* ------------------------ GL_EXT_texture_cube_map ------------------------ */
+
+#ifndef GL_EXT_texture_cube_map
+#define GL_EXT_texture_cube_map 1
+
+#define GL_NORMAL_MAP_EXT 0x8511
+#define GL_REFLECTION_MAP_EXT 0x8512
+#define GL_TEXTURE_CUBE_MAP_EXT 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C
+
+#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map)
+
+#endif /* GL_EXT_texture_cube_map */
+
+/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */
+
+#ifndef GL_EXT_texture_edge_clamp
+#define GL_EXT_texture_edge_clamp 1
+
+#define GL_CLAMP_TO_EDGE_EXT 0x812F
+
+#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp)
+
+#endif /* GL_EXT_texture_edge_clamp */
+
+/* --------------------------- GL_EXT_texture_env -------------------------- */
+
+#ifndef GL_EXT_texture_env
+#define GL_EXT_texture_env 1
+
+#define GL_TEXTURE_ENV0_EXT 0
+#define GL_ENV_BLEND_EXT 0
+#define GL_TEXTURE_ENV_SHIFT_EXT 0
+#define GL_ENV_REPLACE_EXT 0
+#define GL_ENV_ADD_EXT 0
+#define GL_ENV_SUBTRACT_EXT 0
+#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0
+#define GL_ENV_REVERSE_SUBTRACT_EXT 0
+#define GL_ENV_REVERSE_BLEND_EXT 0
+#define GL_ENV_COPY_EXT 0
+#define GL_ENV_MODULATE_EXT 0
+
+#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env)
+
+#endif /* GL_EXT_texture_env */
+
+/* ------------------------- GL_EXT_texture_env_add ------------------------ */
+
+#ifndef GL_EXT_texture_env_add
+#define GL_EXT_texture_env_add 1
+
+#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add)
+
+#endif /* GL_EXT_texture_env_add */
+
+/* ----------------------- GL_EXT_texture_env_combine ---------------------- */
+
+#ifndef GL_EXT_texture_env_combine
+#define GL_EXT_texture_env_combine 1
+
+#define GL_COMBINE_EXT 0x8570
+#define GL_COMBINE_RGB_EXT 0x8571
+#define GL_COMBINE_ALPHA_EXT 0x8572
+#define GL_RGB_SCALE_EXT 0x8573
+#define GL_ADD_SIGNED_EXT 0x8574
+#define GL_INTERPOLATE_EXT 0x8575
+#define GL_CONSTANT_EXT 0x8576
+#define GL_PRIMARY_COLOR_EXT 0x8577
+#define GL_PREVIOUS_EXT 0x8578
+#define GL_SOURCE0_RGB_EXT 0x8580
+#define GL_SOURCE1_RGB_EXT 0x8581
+#define GL_SOURCE2_RGB_EXT 0x8582
+#define GL_SOURCE0_ALPHA_EXT 0x8588
+#define GL_SOURCE1_ALPHA_EXT 0x8589
+#define GL_SOURCE2_ALPHA_EXT 0x858A
+#define GL_OPERAND0_RGB_EXT 0x8590
+#define GL_OPERAND1_RGB_EXT 0x8591
+#define GL_OPERAND2_RGB_EXT 0x8592
+#define GL_OPERAND0_ALPHA_EXT 0x8598
+#define GL_OPERAND1_ALPHA_EXT 0x8599
+#define GL_OPERAND2_ALPHA_EXT 0x859A
+
+#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine)
+
+#endif /* GL_EXT_texture_env_combine */
+
+/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */
+
+#ifndef GL_EXT_texture_env_dot3
+#define GL_EXT_texture_env_dot3 1
+
+#define GL_DOT3_RGB_EXT 0x8740
+#define GL_DOT3_RGBA_EXT 0x8741
+
+#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3)
+
+#endif /* GL_EXT_texture_env_dot3 */
+
+/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */
+
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_EXT_texture_filter_anisotropic 1
+
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+
+#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic)
+
+#endif /* GL_EXT_texture_filter_anisotropic */
+
+/* ------------------------- GL_EXT_texture_integer ------------------------ */
+
+#ifndef GL_EXT_texture_integer
+#define GL_EXT_texture_integer 1
+
+#define GL_RGBA32UI_EXT 0x8D70
+#define GL_RGB32UI_EXT 0x8D71
+#define GL_ALPHA32UI_EXT 0x8D72
+#define GL_INTENSITY32UI_EXT 0x8D73
+#define GL_LUMINANCE32UI_EXT 0x8D74
+#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75
+#define GL_RGBA16UI_EXT 0x8D76
+#define GL_RGB16UI_EXT 0x8D77
+#define GL_ALPHA16UI_EXT 0x8D78
+#define GL_INTENSITY16UI_EXT 0x8D79
+#define GL_LUMINANCE16UI_EXT 0x8D7A
+#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B
+#define GL_RGBA8UI_EXT 0x8D7C
+#define GL_RGB8UI_EXT 0x8D7D
+#define GL_ALPHA8UI_EXT 0x8D7E
+#define GL_INTENSITY8UI_EXT 0x8D7F
+#define GL_LUMINANCE8UI_EXT 0x8D80
+#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81
+#define GL_RGBA32I_EXT 0x8D82
+#define GL_RGB32I_EXT 0x8D83
+#define GL_ALPHA32I_EXT 0x8D84
+#define GL_INTENSITY32I_EXT 0x8D85
+#define GL_LUMINANCE32I_EXT 0x8D86
+#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87
+#define GL_RGBA16I_EXT 0x8D88
+#define GL_RGB16I_EXT 0x8D89
+#define GL_ALPHA16I_EXT 0x8D8A
+#define GL_INTENSITY16I_EXT 0x8D8B
+#define GL_LUMINANCE16I_EXT 0x8D8C
+#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D
+#define GL_RGBA8I_EXT 0x8D8E
+#define GL_RGB8I_EXT 0x8D8F
+#define GL_ALPHA8I_EXT 0x8D90
+#define GL_INTENSITY8I_EXT 0x8D91
+#define GL_LUMINANCE8I_EXT 0x8D92
+#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93
+#define GL_RED_INTEGER_EXT 0x8D94
+#define GL_GREEN_INTEGER_EXT 0x8D95
+#define GL_BLUE_INTEGER_EXT 0x8D96
+#define GL_ALPHA_INTEGER_EXT 0x8D97
+#define GL_RGB_INTEGER_EXT 0x8D98
+#define GL_RGBA_INTEGER_EXT 0x8D99
+#define GL_BGR_INTEGER_EXT 0x8D9A
+#define GL_BGRA_INTEGER_EXT 0x8D9B
+#define GL_LUMINANCE_INTEGER_EXT 0x8D9C
+#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D
+#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E
+
+typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha);
+typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);
+typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params);
+
+#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT)
+#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT)
+#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT)
+#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT)
+#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT)
+#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT)
+
+#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer)
+
+#endif /* GL_EXT_texture_integer */
+
+/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */
+
+#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
+
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
+#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
+#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
+
+#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias)
+
+#endif /* GL_EXT_texture_lod_bias */
+
+/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */
+
+#ifndef GL_EXT_texture_mirror_clamp
+#define GL_EXT_texture_mirror_clamp 1
+
+#define GL_MIRROR_CLAMP_EXT 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743
+#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912
+
+#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp)
+
+#endif /* GL_EXT_texture_mirror_clamp */
+
+/* ------------------------- GL_EXT_texture_object ------------------------- */
+
+#ifndef GL_EXT_texture_object
+#define GL_EXT_texture_object 1
+
+#define GL_TEXTURE_PRIORITY_EXT 0x8066
+#define GL_TEXTURE_RESIDENT_EXT 0x8067
+#define GL_TEXTURE_1D_BINDING_EXT 0x8068
+#define GL_TEXTURE_2D_BINDING_EXT 0x8069
+#define GL_TEXTURE_3D_BINDING_EXT 0x806A
+
+typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences);
+typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);
+typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures);
+typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures);
+typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture);
+typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities);
+
+#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT)
+#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT)
+#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT)
+#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT)
+#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT)
+#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT)
+
+#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object)
+
+#endif /* GL_EXT_texture_object */
+
+/* --------------------- GL_EXT_texture_perturb_normal --------------------- */
+
+#ifndef GL_EXT_texture_perturb_normal
+#define GL_EXT_texture_perturb_normal 1
+
+#define GL_PERTURB_EXT 0x85AE
+#define GL_TEXTURE_NORMAL_EXT 0x85AF
+
+typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode);
+
+#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT)
+
+#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal)
+
+#endif /* GL_EXT_texture_perturb_normal */
+
+/* ------------------------ GL_EXT_texture_rectangle ----------------------- */
+
+#ifndef GL_EXT_texture_rectangle
+#define GL_EXT_texture_rectangle 1
+
+#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
+
+#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle)
+
+#endif /* GL_EXT_texture_rectangle */
+
+/* -------------------------- GL_EXT_texture_sRGB -------------------------- */
+
+#ifndef GL_EXT_texture_sRGB
+#define GL_EXT_texture_sRGB 1
+
+#define GL_SRGB_EXT 0x8C40
+#define GL_SRGB8_EXT 0x8C41
+#define GL_SRGB_ALPHA_EXT 0x8C42
+#define GL_SRGB8_ALPHA8_EXT 0x8C43
+#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
+#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
+#define GL_SLUMINANCE_EXT 0x8C46
+#define GL_SLUMINANCE8_EXT 0x8C47
+#define GL_COMPRESSED_SRGB_EXT 0x8C48
+#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
+#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
+
+#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB)
+
+#endif /* GL_EXT_texture_sRGB */
+
+/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */
+
+#ifndef GL_EXT_texture_sRGB_decode
+#define GL_EXT_texture_sRGB_decode 1
+
+#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48
+#define GL_DECODE_EXT 0x8A49
+#define GL_SKIP_DECODE_EXT 0x8A4A
+
+#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode)
+
+#endif /* GL_EXT_texture_sRGB_decode */
+
+/* --------------------- GL_EXT_texture_shared_exponent -------------------- */
+
+#ifndef GL_EXT_texture_shared_exponent
+#define GL_EXT_texture_shared_exponent 1
+
+#define GL_RGB9_E5_EXT 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E
+#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F
+
+#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent)
+
+#endif /* GL_EXT_texture_shared_exponent */
+
+/* -------------------------- GL_EXT_texture_snorm ------------------------- */
+
+#ifndef GL_EXT_texture_snorm
+#define GL_EXT_texture_snorm 1
+
+#define GL_RED_SNORM 0x8F90
+#define GL_RG_SNORM 0x8F91
+#define GL_RGB_SNORM 0x8F92
+#define GL_RGBA_SNORM 0x8F93
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_R16_SNORM 0x8F98
+#define GL_RG16_SNORM 0x8F99
+#define GL_RGB16_SNORM 0x8F9A
+#define GL_RGBA16_SNORM 0x8F9B
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_ALPHA_SNORM 0x9010
+#define GL_LUMINANCE_SNORM 0x9011
+#define GL_LUMINANCE_ALPHA_SNORM 0x9012
+#define GL_INTENSITY_SNORM 0x9013
+#define GL_ALPHA8_SNORM 0x9014
+#define GL_LUMINANCE8_SNORM 0x9015
+#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016
+#define GL_INTENSITY8_SNORM 0x9017
+#define GL_ALPHA16_SNORM 0x9018
+#define GL_LUMINANCE16_SNORM 0x9019
+#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A
+#define GL_INTENSITY16_SNORM 0x901B
+
+#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm)
+
+#endif /* GL_EXT_texture_snorm */
+
+/* ------------------------- GL_EXT_texture_swizzle ------------------------ */
+
+#ifndef GL_EXT_texture_swizzle
+#define GL_EXT_texture_swizzle 1
+
+#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42
+#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43
+#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44
+#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46
+
+#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle)
+
+#endif /* GL_EXT_texture_swizzle */
+
+/* --------------------------- GL_EXT_timer_query -------------------------- */
+
+#ifndef GL_EXT_timer_query
+#define GL_EXT_timer_query 1
+
+#define GL_TIME_ELAPSED_EXT 0x88BF
+
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params);
+
+#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT)
+#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT)
+
+#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query)
+
+#endif /* GL_EXT_timer_query */
+
+/* ----------------------- GL_EXT_transform_feedback ----------------------- */
+
+#ifndef GL_EXT_transform_feedback
+#define GL_EXT_transform_feedback 1
+
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85
+#define GL_PRIMITIVES_GENERATED_EXT 0x8C87
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88
+#define GL_RASTERIZER_DISCARD_EXT 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C
+#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F
+
+typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void);
+typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, char *name);
+typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const char ** varyings, GLenum bufferMode);
+
+#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT)
+#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT)
+#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT)
+#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT)
+#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT)
+#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT)
+#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT)
+
+#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback)
+
+#endif /* GL_EXT_transform_feedback */
+
+/* -------------------------- GL_EXT_vertex_array -------------------------- */
+
+#ifndef GL_EXT_vertex_array
+#define GL_EXT_vertex_array 1
+
+#define GL_DOUBLE_EXT 0x140A
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+
+typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);
+typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer);
+typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
+
+#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT)
+#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT)
+#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT)
+#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT)
+#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT)
+#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT)
+#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT)
+#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT)
+
+#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array)
+
+#endif /* GL_EXT_vertex_array */
+
+/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */
+
+#ifndef GL_EXT_vertex_array_bgra
+#define GL_EXT_vertex_array_bgra 1
+
+#define GL_BGRA 0x80E1
+
+#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra)
+
+#endif /* GL_EXT_vertex_array_bgra */
+
+/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */
+
+#ifndef GL_EXT_vertex_attrib_64bit
+#define GL_EXT_vertex_attrib_64bit 1
+
+#define GL_DOUBLE_MAT2_EXT 0x8F46
+#define GL_DOUBLE_MAT3_EXT 0x8F47
+#define GL_DOUBLE_MAT4_EXT 0x8F48
+#define GL_DOUBLE_MAT2x3_EXT 0x8F49
+#define GL_DOUBLE_MAT2x4_EXT 0x8F4A
+#define GL_DOUBLE_MAT3x2_EXT 0x8F4B
+#define GL_DOUBLE_MAT3x4_EXT 0x8F4C
+#define GL_DOUBLE_MAT4x2_EXT 0x8F4D
+#define GL_DOUBLE_MAT4x3_EXT 0x8F4E
+#define GL_DOUBLE_VEC2_EXT 0x8FFC
+#define GL_DOUBLE_VEC3_EXT 0x8FFD
+#define GL_DOUBLE_VEC4_EXT 0x8FFE
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
+
+#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT)
+#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT)
+#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT)
+#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT)
+#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT)
+#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT)
+#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT)
+#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT)
+#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT)
+#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT)
+#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT)
+
+#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit)
+
+#endif /* GL_EXT_vertex_attrib_64bit */
+
+/* -------------------------- GL_EXT_vertex_shader ------------------------- */
+
+#ifndef GL_EXT_vertex_shader
+#define GL_EXT_vertex_shader 1
+
+#define GL_VERTEX_SHADER_EXT 0x8780
+#define GL_VERTEX_SHADER_BINDING_EXT 0x8781
+#define GL_OP_INDEX_EXT 0x8782
+#define GL_OP_NEGATE_EXT 0x8783
+#define GL_OP_DOT3_EXT 0x8784
+#define GL_OP_DOT4_EXT 0x8785
+#define GL_OP_MUL_EXT 0x8786
+#define GL_OP_ADD_EXT 0x8787
+#define GL_OP_MADD_EXT 0x8788
+#define GL_OP_FRAC_EXT 0x8789
+#define GL_OP_MAX_EXT 0x878A
+#define GL_OP_MIN_EXT 0x878B
+#define GL_OP_SET_GE_EXT 0x878C
+#define GL_OP_SET_LT_EXT 0x878D
+#define GL_OP_CLAMP_EXT 0x878E
+#define GL_OP_FLOOR_EXT 0x878F
+#define GL_OP_ROUND_EXT 0x8790
+#define GL_OP_EXP_BASE_2_EXT 0x8791
+#define GL_OP_LOG_BASE_2_EXT 0x8792
+#define GL_OP_POWER_EXT 0x8793
+#define GL_OP_RECIP_EXT 0x8794
+#define GL_OP_RECIP_SQRT_EXT 0x8795
+#define GL_OP_SUB_EXT 0x8796
+#define GL_OP_CROSS_PRODUCT_EXT 0x8797
+#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798
+#define GL_OP_MOV_EXT 0x8799
+#define GL_OUTPUT_VERTEX_EXT 0x879A
+#define GL_OUTPUT_COLOR0_EXT 0x879B
+#define GL_OUTPUT_COLOR1_EXT 0x879C
+#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D
+#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E
+#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F
+#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0
+#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1
+#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2
+#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3
+#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4
+#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5
+#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6
+#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7
+#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8
+#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9
+#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA
+#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB
+#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC
+#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD
+#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE
+#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF
+#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0
+#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1
+#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2
+#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3
+#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4
+#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5
+#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6
+#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7
+#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8
+#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9
+#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA
+#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB
+#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC
+#define GL_OUTPUT_FOG_EXT 0x87BD
+#define GL_SCALAR_EXT 0x87BE
+#define GL_VECTOR_EXT 0x87BF
+#define GL_MATRIX_EXT 0x87C0
+#define GL_VARIANT_EXT 0x87C1
+#define GL_INVARIANT_EXT 0x87C2
+#define GL_LOCAL_CONSTANT_EXT 0x87C3
+#define GL_LOCAL_EXT 0x87C4
+#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5
+#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6
+#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7
+#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8
+#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE
+#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF
+#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0
+#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1
+#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2
+#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3
+#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4
+#define GL_X_EXT 0x87D5
+#define GL_Y_EXT 0x87D6
+#define GL_Z_EXT 0x87D7
+#define GL_W_EXT 0x87D8
+#define GL_NEGATIVE_X_EXT 0x87D9
+#define GL_NEGATIVE_Y_EXT 0x87DA
+#define GL_NEGATIVE_Z_EXT 0x87DB
+#define GL_NEGATIVE_W_EXT 0x87DC
+#define GL_ZERO_EXT 0x87DD
+#define GL_ONE_EXT 0x87DE
+#define GL_NEGATIVE_ONE_EXT 0x87DF
+#define GL_NORMALIZED_RANGE_EXT 0x87E0
+#define GL_FULL_RANGE_EXT 0x87E1
+#define GL_CURRENT_VERTEX_EXT 0x87E2
+#define GL_MVP_MATRIX_EXT 0x87E3
+#define GL_VARIANT_VALUE_EXT 0x87E4
+#define GL_VARIANT_DATATYPE_EXT 0x87E5
+#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6
+#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7
+#define GL_VARIANT_ARRAY_EXT 0x87E8
+#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9
+#define GL_INVARIANT_VALUE_EXT 0x87EA
+#define GL_INVARIANT_DATATYPE_EXT 0x87EB
+#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC
+#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED
+
+typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void);
+typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);
+typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);
+typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void);
+typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
+typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components);
+typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);
+typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data);
+typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
+typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);
+typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr);
+typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr);
+typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);
+typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);
+typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);
+typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr);
+typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr);
+typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+
+#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT)
+#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT)
+#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT)
+#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT)
+#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT)
+#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT)
+#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT)
+#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT)
+#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT)
+#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT)
+#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT)
+#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT)
+#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT)
+#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT)
+#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT)
+#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT)
+#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT)
+#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT)
+#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT)
+#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT)
+#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT)
+#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT)
+#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT)
+#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT)
+#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT)
+#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT)
+#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT)
+#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT)
+#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT)
+#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT)
+#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT)
+#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT)
+#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT)
+#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT)
+#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT)
+#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT)
+#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT)
+#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT)
+#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT)
+#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT)
+#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT)
+#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT)
+
+#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader)
+
+#endif /* GL_EXT_vertex_shader */
+
+/* ------------------------ GL_EXT_vertex_weighting ------------------------ */
+
+#ifndef GL_EXT_vertex_weighting
+#define GL_EXT_vertex_weighting 1
+
+#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3
+#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6
+#define GL_MODELVIEW0_EXT 0x1700
+#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502
+#define GL_MODELVIEW1_MATRIX_EXT 0x8506
+#define GL_VERTEX_WEIGHTING_EXT 0x8509
+#define GL_MODELVIEW1_EXT 0x850A
+#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B
+#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C
+#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D
+#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E
+#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F
+#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510
+
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight);
+
+#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT)
+#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT)
+#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT)
+
+#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting)
+
+#endif /* GL_EXT_vertex_weighting */
+
+/* ------------------------- GL_EXT_x11_sync_object ------------------------ */
+
+#ifndef GL_EXT_x11_sync_object
+#define GL_EXT_x11_sync_object 1
+
+#define GL_SYNC_X11_FENCE_EXT 0x90E1
+
+typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags);
+
+#define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT)
+
+#define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object)
+
+#endif /* GL_EXT_x11_sync_object */
+
+/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */
+
+#ifndef GL_GREMEDY_frame_terminator
+#define GL_GREMEDY_frame_terminator 1
+
+typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void);
+
+#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY)
+
+#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator)
+
+#endif /* GL_GREMEDY_frame_terminator */
+
+/* ------------------------ GL_GREMEDY_string_marker ----------------------- */
+
+#ifndef GL_GREMEDY_string_marker
+#define GL_GREMEDY_string_marker 1
+
+typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string);
+
+#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY)
+
+#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker)
+
+#endif /* GL_GREMEDY_string_marker */
+
+/* --------------------- GL_HP_convolution_border_modes -------------------- */
+
+#ifndef GL_HP_convolution_border_modes
+#define GL_HP_convolution_border_modes 1
+
+#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes)
+
+#endif /* GL_HP_convolution_border_modes */
+
+/* ------------------------- GL_HP_image_transform ------------------------- */
+
+#ifndef GL_HP_image_transform
+#define GL_HP_image_transform 1
+
+typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params);
+
+#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP)
+#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP)
+#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP)
+#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP)
+#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP)
+#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP)
+
+#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform)
+
+#endif /* GL_HP_image_transform */
+
+/* -------------------------- GL_HP_occlusion_test ------------------------- */
+
+#ifndef GL_HP_occlusion_test
+#define GL_HP_occlusion_test 1
+
+#define GL_OCCLUSION_TEST_HP 0x8165
+#define GL_OCCLUSION_TEST_RESULT_HP 0x8166
+
+#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test)
+
+#endif /* GL_HP_occlusion_test */
+
+/* ------------------------- GL_HP_texture_lighting ------------------------ */
+
+#ifndef GL_HP_texture_lighting
+#define GL_HP_texture_lighting 1
+
+#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting)
+
+#endif /* GL_HP_texture_lighting */
+
+/* --------------------------- GL_IBM_cull_vertex -------------------------- */
+
+#ifndef GL_IBM_cull_vertex
+#define GL_IBM_cull_vertex 1
+
+#define GL_CULL_VERTEX_IBM 103050
+
+#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex)
+
+#endif /* GL_IBM_cull_vertex */
+
+/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */
+
+#ifndef GL_IBM_multimode_draw_arrays
+#define GL_IBM_multimode_draw_arrays 1
+
+typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);
+typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride);
+
+#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM)
+#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM)
+
+#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays)
+
+#endif /* GL_IBM_multimode_draw_arrays */
+
+/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */
+
+#ifndef GL_IBM_rasterpos_clip
+#define GL_IBM_rasterpos_clip 1
+
+#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010
+
+#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip)
+
+#endif /* GL_IBM_rasterpos_clip */
+
+/* --------------------------- GL_IBM_static_data -------------------------- */
+
+#ifndef GL_IBM_static_data
+#define GL_IBM_static_data 1
+
+#define GL_ALL_STATIC_DATA_IBM 103060
+#define GL_STATIC_VERTEX_ARRAY_IBM 103061
+
+#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data)
+
+#endif /* GL_IBM_static_data */
+
+/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */
+
+#ifndef GL_IBM_texture_mirrored_repeat
+#define GL_IBM_texture_mirrored_repeat 1
+
+#define GL_MIRRORED_REPEAT_IBM 0x8370
+
+#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat)
+
+#endif /* GL_IBM_texture_mirrored_repeat */
+
+/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */
+
+#ifndef GL_IBM_vertex_array_lists
+#define GL_IBM_vertex_array_lists 1
+
+#define GL_VERTEX_ARRAY_LIST_IBM 103070
+#define GL_NORMAL_ARRAY_LIST_IBM 103071
+#define GL_COLOR_ARRAY_LIST_IBM 103072
+#define GL_INDEX_ARRAY_LIST_IBM 103073
+#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074
+#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075
+#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076
+#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077
+#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080
+#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081
+#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082
+#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083
+#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084
+#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085
+#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086
+#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087
+
+typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride);
+
+#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM)
+#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM)
+#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM)
+#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM)
+#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM)
+#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM)
+#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM)
+#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM)
+
+#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists)
+
+#endif /* GL_IBM_vertex_array_lists */
+
+/* -------------------------- GL_INGR_color_clamp -------------------------- */
+
+#ifndef GL_INGR_color_clamp
+#define GL_INGR_color_clamp 1
+
+#define GL_RED_MIN_CLAMP_INGR 0x8560
+#define GL_GREEN_MIN_CLAMP_INGR 0x8561
+#define GL_BLUE_MIN_CLAMP_INGR 0x8562
+#define GL_ALPHA_MIN_CLAMP_INGR 0x8563
+#define GL_RED_MAX_CLAMP_INGR 0x8564
+#define GL_GREEN_MAX_CLAMP_INGR 0x8565
+#define GL_BLUE_MAX_CLAMP_INGR 0x8566
+#define GL_ALPHA_MAX_CLAMP_INGR 0x8567
+
+#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp)
+
+#endif /* GL_INGR_color_clamp */
+
+/* ------------------------- GL_INGR_interlace_read ------------------------ */
+
+#ifndef GL_INGR_interlace_read
+#define GL_INGR_interlace_read 1
+
+#define GL_INTERLACE_READ_INGR 0x8568
+
+#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read)
+
+#endif /* GL_INGR_interlace_read */
+
+/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */
+
+#ifndef GL_INTEL_parallel_arrays
+#define GL_INTEL_parallel_arrays 1
+
+#define GL_PARALLEL_ARRAYS_INTEL 0x83F4
+#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5
+#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6
+#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7
+#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8
+
+typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
+typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer);
+
+#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL)
+#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL)
+#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL)
+#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL)
+
+#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays)
+
+#endif /* GL_INTEL_parallel_arrays */
+
+/* ------------------------ GL_INTEL_texture_scissor ----------------------- */
+
+#ifndef GL_INTEL_texture_scissor
+#define GL_INTEL_texture_scissor 1
+
+typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc);
+typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh);
+
+#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL)
+#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL)
+
+#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor)
+
+#endif /* GL_INTEL_texture_scissor */
+
+/* -------------------------- GL_KTX_buffer_region ------------------------- */
+
+#ifndef GL_KTX_buffer_region
+#define GL_KTX_buffer_region 1
+
+#define GL_KTX_FRONT_REGION 0x0
+#define GL_KTX_BACK_REGION 0x1
+#define GL_KTX_Z_REGION 0x2
+#define GL_KTX_STENCIL_REGION 0x3
+
+typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void);
+typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region);
+typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest);
+typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region);
+typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled)
+#define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion)
+#define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion)
+#define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion)
+#define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion)
+
+#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region)
+
+#endif /* GL_KTX_buffer_region */
+
+/* ------------------------- GL_MESAX_texture_stack ------------------------ */
+
+#ifndef GL_MESAX_texture_stack
+#define GL_MESAX_texture_stack 1
+
+#define GL_TEXTURE_1D_STACK_MESAX 0x8759
+#define GL_TEXTURE_2D_STACK_MESAX 0x875A
+#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B
+#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C
+#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D
+#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E
+
+#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack)
+
+#endif /* GL_MESAX_texture_stack */
+
+/* -------------------------- GL_MESA_pack_invert -------------------------- */
+
+#ifndef GL_MESA_pack_invert
+#define GL_MESA_pack_invert 1
+
+#define GL_PACK_INVERT_MESA 0x8758
+
+#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert)
+
+#endif /* GL_MESA_pack_invert */
+
+/* ------------------------- GL_MESA_resize_buffers ------------------------ */
+
+#ifndef GL_MESA_resize_buffers
+#define GL_MESA_resize_buffers 1
+
+typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void);
+
+#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA)
+
+#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers)
+
+#endif /* GL_MESA_resize_buffers */
+
+/* --------------------------- GL_MESA_window_pos -------------------------- */
+
+#ifndef GL_MESA_window_pos
+#define GL_MESA_window_pos 1
+
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p);
+
+#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA)
+#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA)
+#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA)
+#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA)
+#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA)
+#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA)
+#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA)
+#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA)
+#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA)
+#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA)
+#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA)
+#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA)
+#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA)
+#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA)
+#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA)
+#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA)
+#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA)
+#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA)
+#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA)
+#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA)
+#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA)
+#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA)
+#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA)
+#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA)
+
+#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos)
+
+#endif /* GL_MESA_window_pos */
+
+/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */
+
+#ifndef GL_MESA_ycbcr_texture
+#define GL_MESA_ycbcr_texture 1
+
+#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB
+#define GL_YCBCR_MESA 0x8757
+
+#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture)
+
+#endif /* GL_MESA_ycbcr_texture */
+
+/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */
+
+#ifndef GL_NVX_gpu_memory_info
+#define GL_NVX_gpu_memory_info 1
+
+#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
+#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
+#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
+#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
+#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
+
+#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info)
+
+#endif /* GL_NVX_gpu_memory_info */
+
+/* --------------------------- GL_NV_blend_square -------------------------- */
+
+#ifndef GL_NV_blend_square
+#define GL_NV_blend_square 1
+
+#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square)
+
+#endif /* GL_NV_blend_square */
+
+/* ------------------------ GL_NV_conditional_render ----------------------- */
+
+#ifndef GL_NV_conditional_render
+#define GL_NV_conditional_render 1
+
+#define GL_QUERY_WAIT_NV 0x8E13
+#define GL_QUERY_NO_WAIT_NV 0x8E14
+#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15
+#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16
+
+typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void);
+
+#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV)
+#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV)
+
+#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render)
+
+#endif /* GL_NV_conditional_render */
+
+/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */
+
+#ifndef GL_NV_copy_depth_to_color
+#define GL_NV_copy_depth_to_color 1
+
+#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E
+#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F
+
+#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color)
+
+#endif /* GL_NV_copy_depth_to_color */
+
+/* ---------------------------- GL_NV_copy_image --------------------------- */
+
+#ifndef GL_NV_copy_image
+#define GL_NV_copy_image 1
+
+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);
+
+#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV)
+
+#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image)
+
+#endif /* GL_NV_copy_image */
+
+/* ------------------------ GL_NV_depth_buffer_float ----------------------- */
+
+#ifndef GL_NV_depth_buffer_float
+#define GL_NV_depth_buffer_float 1
+
+#define GL_DEPTH_COMPONENT32F_NV 0x8DAB
+#define GL_DEPTH32F_STENCIL8_NV 0x8DAC
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD
+#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF
+
+typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth);
+typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax);
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar);
+
+#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV)
+#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV)
+#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV)
+
+#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float)
+
+#endif /* GL_NV_depth_buffer_float */
+
+/* --------------------------- GL_NV_depth_clamp --------------------------- */
+
+#ifndef GL_NV_depth_clamp
+#define GL_NV_depth_clamp 1
+
+#define GL_DEPTH_CLAMP_NV 0x864F
+
+#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp)
+
+#endif /* GL_NV_depth_clamp */
+
+/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */
+
+#ifndef GL_NV_depth_range_unclamped
+#define GL_NV_depth_range_unclamped 1
+
+#define GL_SAMPLE_COUNT_BITS_NV 0x8864
+#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865
+#define GL_QUERY_RESULT_NV 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867
+#define GL_SAMPLE_COUNT_NV 0x8914
+
+#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped)
+
+#endif /* GL_NV_depth_range_unclamped */
+
+/* ---------------------------- GL_NV_evaluators --------------------------- */
+
+#ifndef GL_NV_evaluators
+#define GL_NV_evaluators 1
+
+#define GL_EVAL_2D_NV 0x86C0
+#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1
+#define GL_MAP_TESSELLATION_NV 0x86C2
+#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3
+#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4
+#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5
+#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6
+#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7
+#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8
+#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9
+#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA
+#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB
+#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC
+#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD
+#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE
+#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF
+#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0
+#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1
+#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2
+#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3
+#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4
+#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5
+#define GL_MAX_MAP_TESSELLATION_NV 0x86D6
+#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7
+
+typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points);
+typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points);
+typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params);
+
+#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV)
+#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV)
+#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV)
+#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV)
+#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV)
+#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV)
+#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV)
+#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV)
+#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV)
+
+#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators)
+
+#endif /* GL_NV_evaluators */
+
+/* ----------------------- GL_NV_explicit_multisample ---------------------- */
+
+#ifndef GL_NV_explicit_multisample
+#define GL_NV_explicit_multisample 1
+
+#define GL_SAMPLE_POSITION_NV 0x8E50
+#define GL_SAMPLE_MASK_NV 0x8E51
+#define GL_SAMPLE_MASK_VALUE_NV 0x8E52
+#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53
+#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54
+#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55
+#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56
+#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57
+#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58
+#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59
+
+typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val);
+typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask);
+typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer);
+
+#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV)
+#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV)
+#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV)
+
+#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample)
+
+#endif /* GL_NV_explicit_multisample */
+
+/* ------------------------------ GL_NV_fence ------------------------------ */
+
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+
+#define GL_ALL_COMPLETED_NV 0x84F2
+#define GL_FENCE_STATUS_NV 0x84F3
+#define GL_FENCE_CONDITION_NV 0x84F4
+
+typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences);
+typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences);
+typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence);
+typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
+typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence);
+
+#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV)
+#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV)
+#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV)
+#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV)
+#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV)
+#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV)
+#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV)
+
+#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence)
+
+#endif /* GL_NV_fence */
+
+/* --------------------------- GL_NV_float_buffer -------------------------- */
+
+#ifndef GL_NV_float_buffer
+#define GL_NV_float_buffer 1
+
+#define GL_FLOAT_R_NV 0x8880
+#define GL_FLOAT_RG_NV 0x8881
+#define GL_FLOAT_RGB_NV 0x8882
+#define GL_FLOAT_RGBA_NV 0x8883
+#define GL_FLOAT_R16_NV 0x8884
+#define GL_FLOAT_R32_NV 0x8885
+#define GL_FLOAT_RG16_NV 0x8886
+#define GL_FLOAT_RG32_NV 0x8887
+#define GL_FLOAT_RGB16_NV 0x8888
+#define GL_FLOAT_RGB32_NV 0x8889
+#define GL_FLOAT_RGBA16_NV 0x888A
+#define GL_FLOAT_RGBA32_NV 0x888B
+#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C
+#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D
+#define GL_FLOAT_RGBA_MODE_NV 0x888E
+
+#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer)
+
+#endif /* GL_NV_float_buffer */
+
+/* --------------------------- GL_NV_fog_distance -------------------------- */
+
+#ifndef GL_NV_fog_distance
+#define GL_NV_fog_distance 1
+
+#define GL_FOG_DISTANCE_MODE_NV 0x855A
+#define GL_EYE_RADIAL_NV 0x855B
+#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C
+
+#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance)
+
+#endif /* GL_NV_fog_distance */
+
+/* ------------------------- GL_NV_fragment_program ------------------------ */
+
+#ifndef GL_NV_fragment_program
+#define GL_NV_fragment_program 1
+
+#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868
+#define GL_FRAGMENT_PROGRAM_NV 0x8870
+#define GL_MAX_TEXTURE_COORDS_NV 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872
+#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873
+#define GL_PROGRAM_ERROR_STRING_NV 0x8874
+
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]);
+
+#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV)
+#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV)
+#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV)
+#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV)
+#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV)
+#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV)
+
+#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program)
+
+#endif /* GL_NV_fragment_program */
+
+/* ------------------------ GL_NV_fragment_program2 ------------------------ */
+
+#ifndef GL_NV_fragment_program2
+#define GL_NV_fragment_program2 1
+
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
+#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6
+#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7
+#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8
+
+#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2)
+
+#endif /* GL_NV_fragment_program2 */
+
+/* ------------------------ GL_NV_fragment_program4 ------------------------ */
+
+#ifndef GL_NV_fragment_program4
+#define GL_NV_fragment_program4 1
+
+#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4)
+
+#endif /* GL_NV_fragment_program4 */
+
+/* --------------------- GL_NV_fragment_program_option --------------------- */
+
+#ifndef GL_NV_fragment_program_option
+#define GL_NV_fragment_program_option 1
+
+#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option)
+
+#endif /* GL_NV_fragment_program_option */
+
+/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */
+
+#ifndef GL_NV_framebuffer_multisample_coverage
+#define GL_NV_framebuffer_multisample_coverage 1
+
+#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB
+#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10
+#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11
+#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12
+
+typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);
+
+#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV)
+
+#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage)
+
+#endif /* GL_NV_framebuffer_multisample_coverage */
+
+/* ------------------------ GL_NV_geometry_program4 ------------------------ */
+
+#ifndef GL_NV_geometry_program4
+#define GL_NV_geometry_program4 1
+
+#define GL_GEOMETRY_PROGRAM_NV 0x8C26
+#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27
+#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28
+
+typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit);
+
+#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV)
+
+#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4)
+
+#endif /* GL_NV_geometry_program4 */
+
+/* ------------------------- GL_NV_geometry_shader4 ------------------------ */
+
+#ifndef GL_NV_geometry_shader4
+#define GL_NV_geometry_shader4 1
+
+#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4)
+
+#endif /* GL_NV_geometry_shader4 */
+
+/* --------------------------- GL_NV_gpu_program4 -------------------------- */
+
+#ifndef GL_NV_gpu_program4
+#define GL_NV_gpu_program4 1
+
+#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905
+#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906
+#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907
+#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908
+#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909
+#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5
+#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6
+
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);
+
+#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV)
+#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV)
+#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV)
+#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV)
+#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV)
+#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV)
+#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV)
+#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV)
+#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV)
+#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV)
+#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV)
+#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV)
+
+#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4)
+
+#endif /* GL_NV_gpu_program4 */
+
+/* --------------------------- GL_NV_gpu_program5 -------------------------- */
+
+#ifndef GL_NV_gpu_program5
+#define GL_NV_gpu_program5 1
+
+#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C
+#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F
+
+#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5)
+
+#endif /* GL_NV_gpu_program5 */
+
+/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */
+
+#ifndef GL_NV_gpu_program_fp64
+#define GL_NV_gpu_program_fp64 1
+
+#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64)
+
+#endif /* GL_NV_gpu_program_fp64 */
+
+/* --------------------------- GL_NV_gpu_shader5 --------------------------- */
+
+#ifndef GL_NV_gpu_shader5
+#define GL_NV_gpu_shader5 1
+
+#define GL_INT64_NV 0x140E
+#define GL_UNSIGNED_INT64_NV 0x140F
+#define GL_INT8_NV 0x8FE0
+#define GL_INT8_VEC2_NV 0x8FE1
+#define GL_INT8_VEC3_NV 0x8FE2
+#define GL_INT8_VEC4_NV 0x8FE3
+#define GL_INT16_NV 0x8FE4
+#define GL_INT16_VEC2_NV 0x8FE5
+#define GL_INT16_VEC3_NV 0x8FE6
+#define GL_INT16_VEC4_NV 0x8FE7
+#define GL_INT64_VEC2_NV 0x8FE9
+#define GL_INT64_VEC3_NV 0x8FEA
+#define GL_INT64_VEC4_NV 0x8FEB
+#define GL_UNSIGNED_INT8_NV 0x8FEC
+#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED
+#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE
+#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF
+#define GL_UNSIGNED_INT16_NV 0x8FF0
+#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1
+#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2
+#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3
+#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5
+#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6
+#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7
+#define GL_FLOAT16_NV 0x8FF8
+#define GL_FLOAT16_VEC2_NV 0x8FF9
+#define GL_FLOAT16_VEC3_NV 0x8FFA
+#define GL_FLOAT16_VEC4_NV 0x8FFB
+
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+
+#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV)
+#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV)
+#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV)
+#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV)
+#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV)
+#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV)
+#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV)
+#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV)
+#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV)
+#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV)
+#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV)
+#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV)
+#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV)
+#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV)
+#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV)
+#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV)
+#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV)
+#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV)
+#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV)
+#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV)
+#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV)
+#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV)
+#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV)
+#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV)
+#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV)
+#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV)
+#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV)
+#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV)
+#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV)
+#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV)
+#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV)
+#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV)
+#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV)
+#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV)
+
+#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5)
+
+#endif /* GL_NV_gpu_shader5 */
+
+/* ---------------------------- GL_NV_half_float --------------------------- */
+
+#ifndef GL_NV_half_float
+#define GL_NV_half_float 1
+
+#define GL_HALF_FLOAT_NV 0x140B
+
+typedef unsigned short GLhalf;
+
+typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue);
+typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha);
+typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz);
+typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y);
+typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z);
+typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w);
+typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight);
+typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight);
+
+#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV)
+#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV)
+#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV)
+#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV)
+#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV)
+#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV)
+#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV)
+#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV)
+#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV)
+#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV)
+#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV)
+#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV)
+#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV)
+#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV)
+#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV)
+#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV)
+#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV)
+#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV)
+#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV)
+#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV)
+#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV)
+#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV)
+#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV)
+#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV)
+#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV)
+#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV)
+#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV)
+#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV)
+#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV)
+#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV)
+#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV)
+#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV)
+#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV)
+#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV)
+#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV)
+#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV)
+#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV)
+#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV)
+#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV)
+#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV)
+#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV)
+#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV)
+#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV)
+#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV)
+#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV)
+#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV)
+
+#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float)
+
+#endif /* GL_NV_half_float */
+
+/* ------------------------ GL_NV_light_max_exponent ----------------------- */
+
+#ifndef GL_NV_light_max_exponent
+#define GL_NV_light_max_exponent 1
+
+#define GL_MAX_SHININESS_NV 0x8504
+#define GL_MAX_SPOT_EXPONENT_NV 0x8505
+
+#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent)
+
+#endif /* GL_NV_light_max_exponent */
+
+/* ----------------------- GL_NV_multisample_coverage ---------------------- */
+
+#ifndef GL_NV_multisample_coverage
+#define GL_NV_multisample_coverage 1
+
+#define GL_COVERAGE_SAMPLES_NV 0x80A9
+#define GL_COLOR_SAMPLES_NV 0x8E20
+
+#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage)
+
+#endif /* GL_NV_multisample_coverage */
+
+/* --------------------- GL_NV_multisample_filter_hint --------------------- */
+
+#ifndef GL_NV_multisample_filter_hint
+#define GL_NV_multisample_filter_hint 1
+
+#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534
+
+#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint)
+
+#endif /* GL_NV_multisample_filter_hint */
+
+/* ------------------------- GL_NV_occlusion_query ------------------------- */
+
+#ifndef GL_NV_occlusion_query
+#define GL_NV_occlusion_query 1
+
+#define GL_PIXEL_COUNTER_BITS_NV 0x8864
+#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865
+#define GL_PIXEL_COUNT_NV 0x8866
+#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867
+
+typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);
+
+#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV)
+#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV)
+#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV)
+#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV)
+#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV)
+#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV)
+#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV)
+
+#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query)
+
+#endif /* GL_NV_occlusion_query */
+
+/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */
+
+#ifndef GL_NV_packed_depth_stencil
+#define GL_NV_packed_depth_stencil 1
+
+#define GL_DEPTH_STENCIL_NV 0x84F9
+#define GL_UNSIGNED_INT_24_8_NV 0x84FA
+
+#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil)
+
+#endif /* GL_NV_packed_depth_stencil */
+
+/* --------------------- GL_NV_parameter_buffer_object --------------------- */
+
+#ifndef GL_NV_parameter_buffer_object
+#define GL_NV_parameter_buffer_object 1
+
+#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0
+#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1
+#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2
+#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3
+#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4
+
+typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params);
+
+#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV)
+#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV)
+#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV)
+
+#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object)
+
+#endif /* GL_NV_parameter_buffer_object */
+
+/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */
+
+#ifndef GL_NV_parameter_buffer_object2
+#define GL_NV_parameter_buffer_object2 1
+
+#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2)
+
+#endif /* GL_NV_parameter_buffer_object2 */
+
+/* -------------------------- GL_NV_path_rendering ------------------------- */
+
+#ifndef GL_NV_path_rendering
+#define GL_NV_path_rendering 1
+
+#define GL_CLOSE_PATH_NV 0x00
+#define GL_BOLD_BIT_NV 0x01
+#define GL_GLYPH_WIDTH_BIT_NV 0x01
+#define GL_MOVE_TO_NV 0x02
+#define GL_GLYPH_HEIGHT_BIT_NV 0x02
+#define GL_ITALIC_BIT_NV 0x02
+#define GL_RELATIVE_MOVE_TO_NV 0x03
+#define GL_LINE_TO_NV 0x04
+#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04
+#define GL_RELATIVE_LINE_TO_NV 0x05
+#define GL_HORIZONTAL_LINE_TO_NV 0x06
+#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07
+#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08
+#define GL_VERTICAL_LINE_TO_NV 0x08
+#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09
+#define GL_QUADRATIC_CURVE_TO_NV 0x0A
+#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B
+#define GL_CUBIC_CURVE_TO_NV 0x0C
+#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D
+#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E
+#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F
+#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10
+#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10
+#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11
+#define GL_SMALL_CCW_ARC_TO_NV 0x12
+#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13
+#define GL_SMALL_CW_ARC_TO_NV 0x14
+#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15
+#define GL_LARGE_CCW_ARC_TO_NV 0x16
+#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17
+#define GL_LARGE_CW_ARC_TO_NV 0x18
+#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19
+#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20
+#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40
+#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80
+#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8
+#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA
+#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC
+#define GL_ARC_TO_NV 0xFE
+#define GL_RELATIVE_ARC_TO_NV 0xFF
+#define GL_GLYPH_HAS_KERNING_NV 0x100
+#define GL_PRIMARY_COLOR_NV 0x852C
+#define GL_SECONDARY_COLOR_NV 0x852D
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_PATH_FORMAT_SVG_NV 0x9070
+#define GL_PATH_FORMAT_PS_NV 0x9071
+#define GL_STANDARD_FONT_NAME_NV 0x9072
+#define GL_SYSTEM_FONT_NAME_NV 0x9073
+#define GL_FILE_NAME_NV 0x9074
+#define GL_PATH_STROKE_WIDTH_NV 0x9075
+#define GL_PATH_END_CAPS_NV 0x9076
+#define GL_PATH_INITIAL_END_CAP_NV 0x9077
+#define GL_PATH_TERMINAL_END_CAP_NV 0x9078
+#define GL_PATH_JOIN_STYLE_NV 0x9079
+#define GL_PATH_MITER_LIMIT_NV 0x907A
+#define GL_PATH_DASH_CAPS_NV 0x907B
+#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C
+#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D
+#define GL_PATH_DASH_OFFSET_NV 0x907E
+#define GL_PATH_CLIENT_LENGTH_NV 0x907F
+#define GL_PATH_FILL_MODE_NV 0x9080
+#define GL_PATH_FILL_MASK_NV 0x9081
+#define GL_PATH_FILL_COVER_MODE_NV 0x9082
+#define GL_PATH_STROKE_COVER_MODE_NV 0x9083
+#define GL_PATH_STROKE_MASK_NV 0x9084
+#define GL_COUNT_UP_NV 0x9088
+#define GL_COUNT_DOWN_NV 0x9089
+#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A
+#define GL_CONVEX_HULL_NV 0x908B
+#define GL_BOUNDING_BOX_NV 0x908D
+#define GL_TRANSLATE_X_NV 0x908E
+#define GL_TRANSLATE_Y_NV 0x908F
+#define GL_TRANSLATE_2D_NV 0x9090
+#define GL_TRANSLATE_3D_NV 0x9091
+#define GL_AFFINE_2D_NV 0x9092
+#define GL_AFFINE_3D_NV 0x9094
+#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096
+#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098
+#define GL_UTF8_NV 0x909A
+#define GL_UTF16_NV 0x909B
+#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C
+#define GL_PATH_COMMAND_COUNT_NV 0x909D
+#define GL_PATH_COORD_COUNT_NV 0x909E
+#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F
+#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0
+#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1
+#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2
+#define GL_SQUARE_NV 0x90A3
+#define GL_ROUND_NV 0x90A4
+#define GL_TRIANGULAR_NV 0x90A5
+#define GL_BEVEL_NV 0x90A6
+#define GL_MITER_REVERT_NV 0x90A7
+#define GL_MITER_TRUNCATE_NV 0x90A8
+#define GL_SKIP_MISSING_GLYPH_NV 0x90A9
+#define GL_USE_MISSING_GLYPH_NV 0x90AA
+#define GL_PATH_ERROR_POSITION_NV 0x90AB
+#define GL_PATH_FOG_GEN_MODE_NV 0x90AC
+#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD
+#define GL_ADJACENT_PAIRS_NV 0x90AE
+#define GL_FIRST_TO_REST_NV 0x90AF
+#define GL_PATH_GEN_MODE_NV 0x90B0
+#define GL_PATH_GEN_COEFF_NV 0x90B1
+#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2
+#define GL_PATH_GEN_COMPONENTS_NV 0x90B3
+#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4
+#define GL_MOVE_TO_RESETS_NV 0x90B5
+#define GL_MOVE_TO_CONTINUES_NV 0x90B6
+#define GL_PATH_STENCIL_FUNC_NV 0x90B7
+#define GL_PATH_STENCIL_REF_NV 0x90B8
+#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9
+#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD
+#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE
+#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF
+#define GL_FONT_X_MIN_BOUNDS_NV 0x00010000
+#define GL_FONT_Y_MIN_BOUNDS_NV 0x00020000
+#define GL_FONT_X_MAX_BOUNDS_NV 0x00040000
+#define GL_FONT_Y_MAX_BOUNDS_NV 0x00080000
+#define GL_FONT_UNITS_PER_EM_NV 0x00100000
+#define GL_FONT_ASCENDER_NV 0x00200000
+#define GL_FONT_DESCENDER_NV 0x00400000
+#define GL_FONT_HEIGHT_NV 0x00800000
+#define GL_FONT_MAX_ADVANCE_WIDTH_NV 0x01000000
+#define GL_FONT_MAX_ADVANCE_HEIGHT_NV 0x02000000
+#define GL_FONT_UNDERLINE_POSITION_NV 0x04000000
+#define GL_FONT_UNDERLINE_THICKNESS_NV 0x08000000
+#define GL_FONT_HAS_KERNING_NV 0x10000000
+
+typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath);
+typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode);
+typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint name, GLenum coverMode);
+typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range);
+typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range);
+typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value);
+typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint name, GLubyte* commands);
+typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint name, GLfloat* coords);
+typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint name, GLfloat* dashArray);
+typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments);
+typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint fistPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics);
+typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint name, GLenum param, GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint name, GLenum param, GLint* value);
+typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value);
+typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path);
+typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs);
+typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const GLvoid*coords);
+typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void* coords);
+typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc);
+typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray);
+typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode);
+typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const GLvoid*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value);
+typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value);
+typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLint units);
+typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void* pathString);
+typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const GLvoid*coords);
+typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void* coords);
+typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs);
+typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask);
+typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask);
+typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues);
+typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]);
+
+#define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV)
+#define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV)
+#define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV)
+#define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV)
+#define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV)
+#define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV)
+#define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV)
+#define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV)
+#define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV)
+#define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV)
+#define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV)
+#define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV)
+#define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV)
+#define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV)
+#define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV)
+#define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV)
+#define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV)
+#define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV)
+#define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV)
+#define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV)
+#define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV)
+#define glIsPathNV GLEW_GET_FUN(__glewIsPathNV)
+#define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV)
+#define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV)
+#define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV)
+#define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV)
+#define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV)
+#define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV)
+#define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV)
+#define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV)
+#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV)
+#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV)
+#define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV)
+#define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV)
+#define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV)
+#define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV)
+#define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV)
+#define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV)
+#define glPathStringNV GLEW_GET_FUN(__glewPathStringNV)
+#define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV)
+#define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV)
+#define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV)
+#define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV)
+#define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV)
+#define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV)
+#define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV)
+#define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV)
+#define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV)
+#define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV)
+
+#define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering)
+
+#endif /* GL_NV_path_rendering */
+
+/* ------------------------- GL_NV_pixel_data_range ------------------------ */
+
+#ifndef GL_NV_pixel_data_range
+#define GL_NV_pixel_data_range 1
+
+#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878
+#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879
+#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A
+#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B
+#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C
+#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D
+
+typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer);
+
+#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV)
+#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV)
+
+#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range)
+
+#endif /* GL_NV_pixel_data_range */
+
+/* --------------------------- GL_NV_point_sprite -------------------------- */
+
+#ifndef GL_NV_point_sprite
+#define GL_NV_point_sprite 1
+
+#define GL_POINT_SPRITE_NV 0x8861
+#define GL_COORD_REPLACE_NV 0x8862
+#define GL_POINT_SPRITE_R_MODE_NV 0x8863
+
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params);
+
+#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV)
+#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV)
+
+#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite)
+
+#endif /* GL_NV_point_sprite */
+
+/* -------------------------- GL_NV_present_video -------------------------- */
+
+#ifndef GL_NV_present_video
+#define GL_NV_present_video 1
+
+#define GL_FRAME_NV 0x8E26
+#define GL_FIELDS_NV 0x8E27
+#define GL_CURRENT_TIME_NV 0x8E28
+#define GL_NUM_FILL_STREAMS_NV 0x8E29
+#define GL_PRESENT_TIME_NV 0x8E2A
+#define GL_PRESENT_DURATION_NV 0x8E2B
+
+typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params);
+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);
+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);
+
+#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV)
+#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV)
+#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV)
+#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV)
+#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV)
+#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV)
+
+#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video)
+
+#endif /* GL_NV_present_video */
+
+/* ------------------------ GL_NV_primitive_restart ------------------------ */
+
+#ifndef GL_NV_primitive_restart
+#define GL_NV_primitive_restart 1
+
+#define GL_PRIMITIVE_RESTART_NV 0x8558
+#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559
+
+typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index);
+typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void);
+
+#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV)
+#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV)
+
+#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart)
+
+#endif /* GL_NV_primitive_restart */
+
+/* ------------------------ GL_NV_register_combiners ----------------------- */
+
+#ifndef GL_NV_register_combiners
+#define GL_NV_register_combiners 1
+
+#define GL_REGISTER_COMBINERS_NV 0x8522
+#define GL_VARIABLE_A_NV 0x8523
+#define GL_VARIABLE_B_NV 0x8524
+#define GL_VARIABLE_C_NV 0x8525
+#define GL_VARIABLE_D_NV 0x8526
+#define GL_VARIABLE_E_NV 0x8527
+#define GL_VARIABLE_F_NV 0x8528
+#define GL_VARIABLE_G_NV 0x8529
+#define GL_CONSTANT_COLOR0_NV 0x852A
+#define GL_CONSTANT_COLOR1_NV 0x852B
+#define GL_PRIMARY_COLOR_NV 0x852C
+#define GL_SECONDARY_COLOR_NV 0x852D
+#define GL_SPARE0_NV 0x852E
+#define GL_SPARE1_NV 0x852F
+#define GL_DISCARD_NV 0x8530
+#define GL_E_TIMES_F_NV 0x8531
+#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
+#define GL_UNSIGNED_IDENTITY_NV 0x8536
+#define GL_UNSIGNED_INVERT_NV 0x8537
+#define GL_EXPAND_NORMAL_NV 0x8538
+#define GL_EXPAND_NEGATE_NV 0x8539
+#define GL_HALF_BIAS_NORMAL_NV 0x853A
+#define GL_HALF_BIAS_NEGATE_NV 0x853B
+#define GL_SIGNED_IDENTITY_NV 0x853C
+#define GL_SIGNED_NEGATE_NV 0x853D
+#define GL_SCALE_BY_TWO_NV 0x853E
+#define GL_SCALE_BY_FOUR_NV 0x853F
+#define GL_SCALE_BY_ONE_HALF_NV 0x8540
+#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541
+#define GL_COMBINER_INPUT_NV 0x8542
+#define GL_COMBINER_MAPPING_NV 0x8543
+#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544
+#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545
+#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546
+#define GL_COMBINER_MUX_SUM_NV 0x8547
+#define GL_COMBINER_SCALE_NV 0x8548
+#define GL_COMBINER_BIAS_NV 0x8549
+#define GL_COMBINER_AB_OUTPUT_NV 0x854A
+#define GL_COMBINER_CD_OUTPUT_NV 0x854B
+#define GL_COMBINER_SUM_OUTPUT_NV 0x854C
+#define GL_MAX_GENERAL_COMBINERS_NV 0x854D
+#define GL_NUM_GENERAL_COMBINERS_NV 0x854E
+#define GL_COLOR_SUM_CLAMP_NV 0x854F
+#define GL_COMBINER0_NV 0x8550
+#define GL_COMBINER1_NV 0x8551
+#define GL_COMBINER2_NV 0x8552
+#define GL_COMBINER3_NV 0x8553
+#define GL_COMBINER4_NV 0x8554
+#define GL_COMBINER5_NV 0x8555
+#define GL_COMBINER6_NV 0x8556
+#define GL_COMBINER7_NV 0x8557
+
+typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params);
+
+#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV)
+#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV)
+#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV)
+#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV)
+#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV)
+#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV)
+#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV)
+#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV)
+#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV)
+#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV)
+#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV)
+#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV)
+#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV)
+
+#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners)
+
+#endif /* GL_NV_register_combiners */
+
+/* ----------------------- GL_NV_register_combiners2 ----------------------- */
+
+#ifndef GL_NV_register_combiners2
+#define GL_NV_register_combiners2 1
+
+#define GL_PER_STAGE_CONSTANTS_NV 0x8535
+
+typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params);
+
+#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV)
+#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV)
+
+#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2)
+
+#endif /* GL_NV_register_combiners2 */
+
+/* ------------------------ GL_NV_shader_buffer_load ----------------------- */
+
+#ifndef GL_NV_shader_buffer_load
+#define GL_NV_shader_buffer_load 1
+
+#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D
+#define GL_GPU_ADDRESS_NV 0x8F34
+#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35
+
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target);
+typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access);
+typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+
+#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV)
+#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV)
+#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV)
+#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV)
+#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV)
+#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV)
+#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV)
+#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV)
+#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV)
+#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV)
+#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV)
+#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV)
+#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV)
+
+#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load)
+
+#endif /* GL_NV_shader_buffer_load */
+
+/* ---------------------- GL_NV_tessellation_program5 ---------------------- */
+
+#ifndef GL_NV_tessellation_program5
+#define GL_NV_tessellation_program5 1
+
+#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8
+#define GL_TESS_CONTROL_PROGRAM_NV 0x891E
+#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F
+#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74
+#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75
+
+#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5)
+
+#endif /* GL_NV_tessellation_program5 */
+
+/* -------------------------- GL_NV_texgen_emboss -------------------------- */
+
+#ifndef GL_NV_texgen_emboss
+#define GL_NV_texgen_emboss 1
+
+#define GL_EMBOSS_LIGHT_NV 0x855D
+#define GL_EMBOSS_CONSTANT_NV 0x855E
+#define GL_EMBOSS_MAP_NV 0x855F
+
+#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss)
+
+#endif /* GL_NV_texgen_emboss */
+
+/* ------------------------ GL_NV_texgen_reflection ------------------------ */
+
+#ifndef GL_NV_texgen_reflection
+#define GL_NV_texgen_reflection 1
+
+#define GL_NORMAL_MAP_NV 0x8511
+#define GL_REFLECTION_MAP_NV 0x8512
+
+#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection)
+
+#endif /* GL_NV_texgen_reflection */
+
+/* ------------------------- GL_NV_texture_barrier ------------------------- */
+
+#ifndef GL_NV_texture_barrier
+#define GL_NV_texture_barrier 1
+
+typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void);
+
+#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV)
+
+#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier)
+
+#endif /* GL_NV_texture_barrier */
+
+/* --------------------- GL_NV_texture_compression_vtc --------------------- */
+
+#ifndef GL_NV_texture_compression_vtc
+#define GL_NV_texture_compression_vtc 1
+
+#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc)
+
+#endif /* GL_NV_texture_compression_vtc */
+
+/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */
+
+#ifndef GL_NV_texture_env_combine4
+#define GL_NV_texture_env_combine4 1
+
+#define GL_COMBINE4_NV 0x8503
+#define GL_SOURCE3_RGB_NV 0x8583
+#define GL_SOURCE3_ALPHA_NV 0x858B
+#define GL_OPERAND3_RGB_NV 0x8593
+#define GL_OPERAND3_ALPHA_NV 0x859B
+
+#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4)
+
+#endif /* GL_NV_texture_env_combine4 */
+
+/* ---------------------- GL_NV_texture_expand_normal ---------------------- */
+
+#ifndef GL_NV_texture_expand_normal
+#define GL_NV_texture_expand_normal 1
+
+#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F
+
+#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal)
+
+#endif /* GL_NV_texture_expand_normal */
+
+/* ----------------------- GL_NV_texture_multisample ----------------------- */
+
+#ifndef GL_NV_texture_multisample
+#define GL_NV_texture_multisample 1
+
+#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045
+#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046
+
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+
+#define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV)
+#define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV)
+#define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV)
+#define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV)
+#define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV)
+#define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV)
+
+#define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample)
+
+#endif /* GL_NV_texture_multisample */
+
+/* ------------------------ GL_NV_texture_rectangle ------------------------ */
+
+#ifndef GL_NV_texture_rectangle
+#define GL_NV_texture_rectangle 1
+
+#define GL_TEXTURE_RECTANGLE_NV 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8
+
+#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle)
+
+#endif /* GL_NV_texture_rectangle */
+
+/* -------------------------- GL_NV_texture_shader ------------------------- */
+
+#ifndef GL_NV_texture_shader
+#define GL_NV_texture_shader 1
+
+#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C
+#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
+#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
+#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
+#define GL_DSDT_MAG_INTENSITY_NV 0x86DC
+#define GL_SHADER_CONSISTENT_NV 0x86DD
+#define GL_TEXTURE_SHADER_NV 0x86DE
+#define GL_SHADER_OPERATION_NV 0x86DF
+#define GL_CULL_MODES_NV 0x86E0
+#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1
+#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1
+#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2
+#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2
+#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3
+#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3
+#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4
+#define GL_CONST_EYE_NV 0x86E5
+#define GL_PASS_THROUGH_NV 0x86E6
+#define GL_CULL_FRAGMENT_NV 0x86E7
+#define GL_OFFSET_TEXTURE_2D_NV 0x86E8
+#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9
+#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA
+#define GL_DOT_PRODUCT_NV 0x86EC
+#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED
+#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE
+#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
+#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
+#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
+#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
+#define GL_HILO_NV 0x86F4
+#define GL_DSDT_NV 0x86F5
+#define GL_DSDT_MAG_NV 0x86F6
+#define GL_DSDT_MAG_VIB_NV 0x86F7
+#define GL_HILO16_NV 0x86F8
+#define GL_SIGNED_HILO_NV 0x86F9
+#define GL_SIGNED_HILO16_NV 0x86FA
+#define GL_SIGNED_RGBA_NV 0x86FB
+#define GL_SIGNED_RGBA8_NV 0x86FC
+#define GL_SIGNED_RGB_NV 0x86FE
+#define GL_SIGNED_RGB8_NV 0x86FF
+#define GL_SIGNED_LUMINANCE_NV 0x8701
+#define GL_SIGNED_LUMINANCE8_NV 0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
+#define GL_SIGNED_ALPHA_NV 0x8705
+#define GL_SIGNED_ALPHA8_NV 0x8706
+#define GL_SIGNED_INTENSITY_NV 0x8707
+#define GL_SIGNED_INTENSITY8_NV 0x8708
+#define GL_DSDT8_NV 0x8709
+#define GL_DSDT8_MAG8_NV 0x870A
+#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
+#define GL_HI_SCALE_NV 0x870E
+#define GL_LO_SCALE_NV 0x870F
+#define GL_DS_SCALE_NV 0x8710
+#define GL_DT_SCALE_NV 0x8711
+#define GL_MAGNITUDE_SCALE_NV 0x8712
+#define GL_VIBRANCE_SCALE_NV 0x8713
+#define GL_HI_BIAS_NV 0x8714
+#define GL_LO_BIAS_NV 0x8715
+#define GL_DS_BIAS_NV 0x8716
+#define GL_DT_BIAS_NV 0x8717
+#define GL_MAGNITUDE_BIAS_NV 0x8718
+#define GL_VIBRANCE_BIAS_NV 0x8719
+#define GL_TEXTURE_BORDER_VALUES_NV 0x871A
+#define GL_TEXTURE_HI_SIZE_NV 0x871B
+#define GL_TEXTURE_LO_SIZE_NV 0x871C
+#define GL_TEXTURE_DS_SIZE_NV 0x871D
+#define GL_TEXTURE_DT_SIZE_NV 0x871E
+#define GL_TEXTURE_MAG_SIZE_NV 0x871F
+
+#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader)
+
+#endif /* GL_NV_texture_shader */
+
+/* ------------------------- GL_NV_texture_shader2 ------------------------- */
+
+#ifndef GL_NV_texture_shader2
+#define GL_NV_texture_shader2 1
+
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
+#define GL_DSDT_MAG_INTENSITY_NV 0x86DC
+#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF
+#define GL_HILO_NV 0x86F4
+#define GL_DSDT_NV 0x86F5
+#define GL_DSDT_MAG_NV 0x86F6
+#define GL_DSDT_MAG_VIB_NV 0x86F7
+#define GL_HILO16_NV 0x86F8
+#define GL_SIGNED_HILO_NV 0x86F9
+#define GL_SIGNED_HILO16_NV 0x86FA
+#define GL_SIGNED_RGBA_NV 0x86FB
+#define GL_SIGNED_RGBA8_NV 0x86FC
+#define GL_SIGNED_RGB_NV 0x86FE
+#define GL_SIGNED_RGB8_NV 0x86FF
+#define GL_SIGNED_LUMINANCE_NV 0x8701
+#define GL_SIGNED_LUMINANCE8_NV 0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
+#define GL_SIGNED_ALPHA_NV 0x8705
+#define GL_SIGNED_ALPHA8_NV 0x8706
+#define GL_SIGNED_INTENSITY_NV 0x8707
+#define GL_SIGNED_INTENSITY8_NV 0x8708
+#define GL_DSDT8_NV 0x8709
+#define GL_DSDT8_MAG8_NV 0x870A
+#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
+
+#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2)
+
+#endif /* GL_NV_texture_shader2 */
+
+/* ------------------------- GL_NV_texture_shader3 ------------------------- */
+
+#ifndef GL_NV_texture_shader3
+#define GL_NV_texture_shader3 1
+
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
+#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854
+#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
+#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858
+#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859
+#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
+#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B
+#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C
+#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
+#define GL_HILO8_NV 0x885E
+#define GL_SIGNED_HILO8_NV 0x885F
+#define GL_FORCE_BLUE_TO_ONE_NV 0x8860
+
+#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3)
+
+#endif /* GL_NV_texture_shader3 */
+
+/* ------------------------ GL_NV_transform_feedback ----------------------- */
+
+#ifndef GL_NV_transform_feedback
+#define GL_NV_transform_feedback 1
+
+#define GL_BACK_PRIMARY_COLOR_NV 0x8C77
+#define GL_BACK_SECONDARY_COLOR_NV 0x8C78
+#define GL_TEXTURE_COORD_NV 0x8C79
+#define GL_CLIP_DISTANCE_NV 0x8C7A
+#define GL_VERTEX_ID_NV 0x8C7B
+#define GL_PRIMITIVE_ID_NV 0x8C7C
+#define GL_GENERIC_ATTRIB_NV 0x8C7D
+#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80
+#define GL_ACTIVE_VARYINGS_NV 0x8C81
+#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82
+#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85
+#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86
+#define GL_PRIMITIVES_GENERATED_NV 0x8C87
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88
+#define GL_RASTERIZER_DISCARD_NV 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C
+#define GL_SEPARATE_ATTRIBS_NV 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F
+
+typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name);
+typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location);
+typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name);
+typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode);
+typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);
+
+#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV)
+#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV)
+#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV)
+#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV)
+#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV)
+#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV)
+#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV)
+#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV)
+#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV)
+#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV)
+#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV)
+
+#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback)
+
+#endif /* GL_NV_transform_feedback */
+
+/* ----------------------- GL_NV_transform_feedback2 ----------------------- */
+
+#ifndef GL_NV_transform_feedback2
+#define GL_NV_transform_feedback2 1
+
+#define GL_TRANSFORM_FEEDBACK_NV 0x8E22
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25
+
+typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id);
+typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids);
+typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void);
+
+#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV)
+#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV)
+#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV)
+#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV)
+#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV)
+#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV)
+#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV)
+
+#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2)
+
+#endif /* GL_NV_transform_feedback2 */
+
+/* -------------------------- GL_NV_vdpau_interop -------------------------- */
+
+#ifndef GL_NV_vdpau_interop
+#define GL_NV_vdpau_interop 1
+
+#define GL_SURFACE_STATE_NV 0x86EB
+#define GL_SURFACE_REGISTERED_NV 0x86FD
+#define GL_SURFACE_MAPPED_NV 0x8700
+#define GL_WRITE_DISCARD_NV 0x88BE
+
+typedef GLintptr GLvdpauSurfaceNV;
+
+typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values);
+typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const GLvoid*getProcAddress);
+typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface);
+typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces);
+typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access);
+typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces);
+typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface);
+
+#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV)
+#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV)
+#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV)
+#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV)
+#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV)
+#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV)
+#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV)
+#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV)
+#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV)
+#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV)
+
+#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop)
+
+#endif /* GL_NV_vdpau_interop */
+
+/* ------------------------ GL_NV_vertex_array_range ----------------------- */
+
+#ifndef GL_NV_vertex_array_range
+#define GL_NV_vertex_array_range 1
+
+#define GL_VERTEX_ARRAY_RANGE_NV 0x851D
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E
+#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F
+#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520
+#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521
+
+typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer);
+
+#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV)
+#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV)
+
+#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range)
+
+#endif /* GL_NV_vertex_array_range */
+
+/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */
+
+#ifndef GL_NV_vertex_array_range2
+#define GL_NV_vertex_array_range2 1
+
+#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533
+
+#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2)
+
+#endif /* GL_NV_vertex_array_range2 */
+
+/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */
+
+#ifndef GL_NV_vertex_attrib_integer_64bit
+#define GL_NV_vertex_attrib_integer_64bit 1
+
+#define GL_INT64_NV 0x140E
+#define GL_UNSIGNED_INT64_NV 0x140F
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
+
+#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV)
+#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV)
+#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV)
+#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV)
+#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV)
+#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV)
+#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV)
+#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV)
+#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV)
+#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV)
+#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV)
+#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV)
+#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV)
+#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV)
+#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV)
+#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV)
+#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV)
+#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV)
+#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV)
+
+#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit)
+
+#endif /* GL_NV_vertex_attrib_integer_64bit */
+
+/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */
+
+#ifndef GL_NV_vertex_buffer_unified_memory
+#define GL_NV_vertex_buffer_unified_memory 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E
+#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F
+#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20
+#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21
+#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22
+#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23
+#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24
+#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25
+#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26
+#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27
+#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28
+#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29
+#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A
+#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B
+#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C
+#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D
+#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E
+#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F
+#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30
+#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31
+#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32
+#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33
+#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40
+#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41
+#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42
+
+typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);
+typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]);
+typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+
+#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV)
+#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV)
+#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV)
+#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV)
+#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV)
+#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV)
+#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV)
+#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV)
+#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV)
+#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV)
+#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV)
+#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV)
+
+#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory)
+
+#endif /* GL_NV_vertex_buffer_unified_memory */
+
+/* -------------------------- GL_NV_vertex_program ------------------------- */
+
+#ifndef GL_NV_vertex_program
+#define GL_NV_vertex_program 1
+
+#define GL_VERTEX_PROGRAM_NV 0x8620
+#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
+#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
+#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
+#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
+#define GL_CURRENT_ATTRIB_NV 0x8626
+#define GL_PROGRAM_LENGTH_NV 0x8627
+#define GL_PROGRAM_STRING_NV 0x8628
+#define GL_MODELVIEW_PROJECTION_NV 0x8629
+#define GL_IDENTITY_NV 0x862A
+#define GL_INVERSE_NV 0x862B
+#define GL_TRANSPOSE_NV 0x862C
+#define GL_INVERSE_TRANSPOSE_NV 0x862D
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
+#define GL_MAX_TRACK_MATRICES_NV 0x862F
+#define GL_MATRIX0_NV 0x8630
+#define GL_MATRIX1_NV 0x8631
+#define GL_MATRIX2_NV 0x8632
+#define GL_MATRIX3_NV 0x8633
+#define GL_MATRIX4_NV 0x8634
+#define GL_MATRIX5_NV 0x8635
+#define GL_MATRIX6_NV 0x8636
+#define GL_MATRIX7_NV 0x8637
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
+#define GL_CURRENT_MATRIX_NV 0x8641
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
+#define GL_PROGRAM_PARAMETER_NV 0x8644
+#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
+#define GL_PROGRAM_TARGET_NV 0x8646
+#define GL_PROGRAM_RESIDENT_NV 0x8647
+#define GL_TRACK_MATRIX_NV 0x8648
+#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
+#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
+#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
+#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
+#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
+#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
+#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
+#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
+#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
+#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
+#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
+#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
+#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
+#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
+#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
+#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
+#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
+#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
+#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
+
+typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences);
+typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v);
+
+#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV)
+#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV)
+#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV)
+#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV)
+#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV)
+#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV)
+#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV)
+#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV)
+#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV)
+#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV)
+#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV)
+#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV)
+#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV)
+#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV)
+#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV)
+#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV)
+#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV)
+#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV)
+#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV)
+#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV)
+#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV)
+#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV)
+#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV)
+#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV)
+#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV)
+#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV)
+#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV)
+#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV)
+#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV)
+#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV)
+#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV)
+#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV)
+#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV)
+#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV)
+#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV)
+#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV)
+#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV)
+#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV)
+#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV)
+#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV)
+#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV)
+#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV)
+#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV)
+#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV)
+#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV)
+#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV)
+#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV)
+#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV)
+#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV)
+#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV)
+#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV)
+#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV)
+#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV)
+#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV)
+#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV)
+#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV)
+#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV)
+#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV)
+#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV)
+#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV)
+#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV)
+#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV)
+#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV)
+#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV)
+
+#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program)
+
+#endif /* GL_NV_vertex_program */
+
+/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */
+
+#ifndef GL_NV_vertex_program1_1
+#define GL_NV_vertex_program1_1 1
+
+#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1)
+
+#endif /* GL_NV_vertex_program1_1 */
+
+/* ------------------------- GL_NV_vertex_program2 ------------------------- */
+
+#ifndef GL_NV_vertex_program2
+#define GL_NV_vertex_program2 1
+
+#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2)
+
+#endif /* GL_NV_vertex_program2 */
+
+/* ---------------------- GL_NV_vertex_program2_option --------------------- */
+
+#ifndef GL_NV_vertex_program2_option
+#define GL_NV_vertex_program2_option 1
+
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
+
+#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option)
+
+#endif /* GL_NV_vertex_program2_option */
+
+/* ------------------------- GL_NV_vertex_program3 ------------------------- */
+
+#ifndef GL_NV_vertex_program3
+#define GL_NV_vertex_program3 1
+
+#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+
+#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3)
+
+#endif /* GL_NV_vertex_program3 */
+
+/* ------------------------- GL_NV_vertex_program4 ------------------------- */
+
+#ifndef GL_NV_vertex_program4
+#define GL_NV_vertex_program4 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD
+
+#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4)
+
+#endif /* GL_NV_vertex_program4 */
+
+/* -------------------------- GL_NV_video_capture -------------------------- */
+
+#ifndef GL_NV_video_capture
+#define GL_NV_video_capture 1
+
+#define GL_VIDEO_BUFFER_NV 0x9020
+#define GL_VIDEO_BUFFER_BINDING_NV 0x9021
+#define GL_FIELD_UPPER_NV 0x9022
+#define GL_FIELD_LOWER_NV 0x9023
+#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024
+#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025
+#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026
+#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027
+#define GL_VIDEO_BUFFER_PITCH_NV 0x9028
+#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029
+#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A
+#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B
+#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C
+#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D
+#define GL_PARTIAL_SUCCESS_NV 0x902E
+#define GL_SUCCESS_NV 0x902F
+#define GL_FAILURE_NV 0x9030
+#define GL_YCBYCR8_422_NV 0x9031
+#define GL_YCBAYCR8A_4224_NV 0x9032
+#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033
+#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034
+#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035
+#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036
+#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037
+#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038
+#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039
+#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A
+#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B
+#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C
+
+typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot);
+typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset);
+typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture);
+typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot);
+typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params);
+typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time);
+typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params);
+
+#define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV)
+#define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV)
+#define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV)
+#define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV)
+#define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV)
+#define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV)
+#define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV)
+#define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV)
+#define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV)
+#define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV)
+#define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV)
+#define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV)
+
+#define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture)
+
+#endif /* GL_NV_video_capture */
+
+/* ------------------------ GL_OES_byte_coordinates ------------------------ */
+
+#ifndef GL_OES_byte_coordinates
+#define GL_OES_byte_coordinates 1
+
+#define GL_BYTE 0x1400
+
+#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates)
+
+#endif /* GL_OES_byte_coordinates */
+
+/* ------------------- GL_OES_compressed_paletted_texture ------------------ */
+
+#ifndef GL_OES_compressed_paletted_texture
+#define GL_OES_compressed_paletted_texture 1
+
+#define GL_PALETTE4_RGB8_OES 0x8B90
+#define GL_PALETTE4_RGBA8_OES 0x8B91
+#define GL_PALETTE4_R5_G6_B5_OES 0x8B92
+#define GL_PALETTE4_RGBA4_OES 0x8B93
+#define GL_PALETTE4_RGB5_A1_OES 0x8B94
+#define GL_PALETTE8_RGB8_OES 0x8B95
+#define GL_PALETTE8_RGBA8_OES 0x8B96
+#define GL_PALETTE8_R5_G6_B5_OES 0x8B97
+#define GL_PALETTE8_RGBA4_OES 0x8B98
+#define GL_PALETTE8_RGB5_A1_OES 0x8B99
+
+#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture)
+
+#endif /* GL_OES_compressed_paletted_texture */
+
+/* --------------------------- GL_OES_read_format -------------------------- */
+
+#ifndef GL_OES_read_format
+#define GL_OES_read_format 1
+
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B
+
+#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format)
+
+#endif /* GL_OES_read_format */
+
+/* ------------------------ GL_OES_single_precision ------------------------ */
+
+#ifndef GL_OES_single_precision
+#define GL_OES_single_precision 1
+
+typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth);
+typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation);
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f);
+typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation);
+typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+
+#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES)
+#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES)
+#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES)
+#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES)
+#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES)
+#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES)
+
+#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision)
+
+#endif /* GL_OES_single_precision */
+
+/* ---------------------------- GL_OML_interlace --------------------------- */
+
+#ifndef GL_OML_interlace
+#define GL_OML_interlace 1
+
+#define GL_INTERLACE_OML 0x8980
+#define GL_INTERLACE_READ_OML 0x8981
+
+#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace)
+
+#endif /* GL_OML_interlace */
+
+/* ---------------------------- GL_OML_resample ---------------------------- */
+
+#ifndef GL_OML_resample
+#define GL_OML_resample 1
+
+#define GL_PACK_RESAMPLE_OML 0x8984
+#define GL_UNPACK_RESAMPLE_OML 0x8985
+#define GL_RESAMPLE_REPLICATE_OML 0x8986
+#define GL_RESAMPLE_ZERO_FILL_OML 0x8987
+#define GL_RESAMPLE_AVERAGE_OML 0x8988
+#define GL_RESAMPLE_DECIMATE_OML 0x8989
+
+#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample)
+
+#endif /* GL_OML_resample */
+
+/* ---------------------------- GL_OML_subsample --------------------------- */
+
+#ifndef GL_OML_subsample
+#define GL_OML_subsample 1
+
+#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982
+#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983
+
+#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample)
+
+#endif /* GL_OML_subsample */
+
+/* --------------------------- GL_PGI_misc_hints --------------------------- */
+
+#ifndef GL_PGI_misc_hints
+#define GL_PGI_misc_hints 1
+
+#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000
+#define GL_CONSERVE_MEMORY_HINT_PGI 107005
+#define GL_RECLAIM_MEMORY_HINT_PGI 107006
+#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010
+#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011
+#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012
+#define GL_ALWAYS_FAST_HINT_PGI 107020
+#define GL_ALWAYS_SOFT_HINT_PGI 107021
+#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022
+#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023
+#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024
+#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025
+#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030
+#define GL_STRICT_LIGHTING_HINT_PGI 107031
+#define GL_STRICT_SCISSOR_HINT_PGI 107032
+#define GL_FULL_STIPPLE_HINT_PGI 107033
+#define GL_CLIP_NEAR_HINT_PGI 107040
+#define GL_CLIP_FAR_HINT_PGI 107041
+#define GL_WIDE_LINE_HINT_PGI 107042
+#define GL_BACK_NORMALS_HINT_PGI 107043
+
+#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints)
+
+#endif /* GL_PGI_misc_hints */
+
+/* -------------------------- GL_PGI_vertex_hints -------------------------- */
+
+#ifndef GL_PGI_vertex_hints
+#define GL_PGI_vertex_hints 1
+
+#define GL_VERTEX23_BIT_PGI 0x00000004
+#define GL_VERTEX4_BIT_PGI 0x00000008
+#define GL_COLOR3_BIT_PGI 0x00010000
+#define GL_COLOR4_BIT_PGI 0x00020000
+#define GL_EDGEFLAG_BIT_PGI 0x00040000
+#define GL_INDEX_BIT_PGI 0x00080000
+#define GL_MAT_AMBIENT_BIT_PGI 0x00100000
+#define GL_VERTEX_DATA_HINT_PGI 107050
+#define GL_VERTEX_CONSISTENT_HINT_PGI 107051
+#define GL_MATERIAL_SIDE_HINT_PGI 107052
+#define GL_MAX_VERTEX_HINT_PGI 107053
+#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000
+#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000
+#define GL_MAT_EMISSION_BIT_PGI 0x00800000
+#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000
+#define GL_MAT_SHININESS_BIT_PGI 0x02000000
+#define GL_MAT_SPECULAR_BIT_PGI 0x04000000
+#define GL_NORMAL_BIT_PGI 0x08000000
+#define GL_TEXCOORD1_BIT_PGI 0x10000000
+#define GL_TEXCOORD2_BIT_PGI 0x20000000
+#define GL_TEXCOORD3_BIT_PGI 0x40000000
+#define GL_TEXCOORD4_BIT_PGI 0x80000000
+
+#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints)
+
+#endif /* GL_PGI_vertex_hints */
+
+/* ----------------------- GL_REND_screen_coordinates ---------------------- */
+
+#ifndef GL_REND_screen_coordinates
+#define GL_REND_screen_coordinates 1
+
+#define GL_SCREEN_COORDINATES_REND 0x8490
+#define GL_INVERTED_SCREEN_W_REND 0x8491
+
+#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates)
+
+#endif /* GL_REND_screen_coordinates */
+
+/* ------------------------------- GL_S3_s3tc ------------------------------ */
+
+#ifndef GL_S3_s3tc
+#define GL_S3_s3tc 1
+
+#define GL_RGB_S3TC 0x83A0
+#define GL_RGB4_S3TC 0x83A1
+#define GL_RGBA_S3TC 0x83A2
+#define GL_RGBA4_S3TC 0x83A3
+#define GL_RGBA_DXT5_S3TC 0x83A4
+#define GL_RGBA4_DXT5_S3TC 0x83A5
+
+#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc)
+
+#endif /* GL_S3_s3tc */
+
+/* -------------------------- GL_SGIS_color_range -------------------------- */
+
+#ifndef GL_SGIS_color_range
+#define GL_SGIS_color_range 1
+
+#define GL_EXTENDED_RANGE_SGIS 0x85A5
+#define GL_MIN_RED_SGIS 0x85A6
+#define GL_MAX_RED_SGIS 0x85A7
+#define GL_MIN_GREEN_SGIS 0x85A8
+#define GL_MAX_GREEN_SGIS 0x85A9
+#define GL_MIN_BLUE_SGIS 0x85AA
+#define GL_MAX_BLUE_SGIS 0x85AB
+#define GL_MIN_ALPHA_SGIS 0x85AC
+#define GL_MAX_ALPHA_SGIS 0x85AD
+
+#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range)
+
+#endif /* GL_SGIS_color_range */
+
+/* ------------------------- GL_SGIS_detail_texture ------------------------ */
+
+#ifndef GL_SGIS_detail_texture
+#define GL_SGIS_detail_texture 1
+
+typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);
+typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points);
+
+#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS)
+#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS)
+
+#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture)
+
+#endif /* GL_SGIS_detail_texture */
+
+/* -------------------------- GL_SGIS_fog_function ------------------------- */
+
+#ifndef GL_SGIS_fog_function
+#define GL_SGIS_fog_function 1
+
+typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points);
+typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points);
+
+#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS)
+#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS)
+
+#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function)
+
+#endif /* GL_SGIS_fog_function */
+
+/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */
+
+#ifndef GL_SGIS_generate_mipmap
+#define GL_SGIS_generate_mipmap 1
+
+#define GL_GENERATE_MIPMAP_SGIS 0x8191
+#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
+
+#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap)
+
+#endif /* GL_SGIS_generate_mipmap */
+
+/* -------------------------- GL_SGIS_multisample -------------------------- */
+
+#ifndef GL_SGIS_multisample
+#define GL_SGIS_multisample 1
+
+#define GL_MULTISAMPLE_SGIS 0x809D
+#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F
+#define GL_SAMPLE_MASK_SGIS 0x80A0
+#define GL_1PASS_SGIS 0x80A1
+#define GL_2PASS_0_SGIS 0x80A2
+#define GL_2PASS_1_SGIS 0x80A3
+#define GL_4PASS_0_SGIS 0x80A4
+#define GL_4PASS_1_SGIS 0x80A5
+#define GL_4PASS_2_SGIS 0x80A6
+#define GL_4PASS_3_SGIS 0x80A7
+#define GL_SAMPLE_BUFFERS_SGIS 0x80A8
+#define GL_SAMPLES_SGIS 0x80A9
+#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA
+#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB
+#define GL_SAMPLE_PATTERN_SGIS 0x80AC
+#define GL_MULTISAMPLE_BIT_EXT 0x20000000
+
+typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);
+typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);
+
+#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS)
+#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS)
+
+#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample)
+
+#endif /* GL_SGIS_multisample */
+
+/* ------------------------- GL_SGIS_pixel_texture ------------------------- */
+
+#ifndef GL_SGIS_pixel_texture
+#define GL_SGIS_pixel_texture 1
+
+#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture)
+
+#endif /* GL_SGIS_pixel_texture */
+
+/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */
+
+#ifndef GL_SGIS_point_line_texgen
+#define GL_SGIS_point_line_texgen 1
+
+#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0
+#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1
+#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2
+#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3
+#define GL_EYE_POINT_SGIS 0x81F4
+#define GL_OBJECT_POINT_SGIS 0x81F5
+#define GL_EYE_LINE_SGIS 0x81F6
+#define GL_OBJECT_LINE_SGIS 0x81F7
+
+#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen)
+
+#endif /* GL_SGIS_point_line_texgen */
+
+/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */
+
+#ifndef GL_SGIS_sharpen_texture
+#define GL_SGIS_sharpen_texture 1
+
+typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points);
+typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points);
+
+#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS)
+#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS)
+
+#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture)
+
+#endif /* GL_SGIS_sharpen_texture */
+
+/* --------------------------- GL_SGIS_texture4D --------------------------- */
+
+#ifndef GL_SGIS_texture4D
+#define GL_SGIS_texture4D 1
+
+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);
+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);
+
+#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS)
+#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS)
+
+#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D)
+
+#endif /* GL_SGIS_texture4D */
+
+/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */
+
+#ifndef GL_SGIS_texture_border_clamp
+#define GL_SGIS_texture_border_clamp 1
+
+#define GL_CLAMP_TO_BORDER_SGIS 0x812D
+
+#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp)
+
+#endif /* GL_SGIS_texture_border_clamp */
+
+/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */
+
+#ifndef GL_SGIS_texture_edge_clamp
+#define GL_SGIS_texture_edge_clamp 1
+
+#define GL_CLAMP_TO_EDGE_SGIS 0x812F
+
+#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp)
+
+#endif /* GL_SGIS_texture_edge_clamp */
+
+/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */
+
+#ifndef GL_SGIS_texture_filter4
+#define GL_SGIS_texture_filter4 1
+
+typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights);
+typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights);
+
+#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS)
+#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS)
+
+#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4)
+
+#endif /* GL_SGIS_texture_filter4 */
+
+/* -------------------------- GL_SGIS_texture_lod -------------------------- */
+
+#ifndef GL_SGIS_texture_lod
+#define GL_SGIS_texture_lod 1
+
+#define GL_TEXTURE_MIN_LOD_SGIS 0x813A
+#define GL_TEXTURE_MAX_LOD_SGIS 0x813B
+#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C
+#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D
+
+#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod)
+
+#endif /* GL_SGIS_texture_lod */
+
+/* ------------------------- GL_SGIS_texture_select ------------------------ */
+
+#ifndef GL_SGIS_texture_select
+#define GL_SGIS_texture_select 1
+
+#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select)
+
+#endif /* GL_SGIS_texture_select */
+
+/* ----------------------------- GL_SGIX_async ----------------------------- */
+
+#ifndef GL_SGIX_async
+#define GL_SGIX_async 1
+
+#define GL_ASYNC_MARKER_SGIX 0x8329
+
+typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker);
+typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);
+typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp);
+typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);
+typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker);
+typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp);
+
+#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX)
+#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX)
+#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX)
+#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX)
+#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX)
+#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX)
+
+#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async)
+
+#endif /* GL_SGIX_async */
+
+/* ------------------------ GL_SGIX_async_histogram ------------------------ */
+
+#ifndef GL_SGIX_async_histogram
+#define GL_SGIX_async_histogram 1
+
+#define GL_ASYNC_HISTOGRAM_SGIX 0x832C
+#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D
+
+#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram)
+
+#endif /* GL_SGIX_async_histogram */
+
+/* -------------------------- GL_SGIX_async_pixel -------------------------- */
+
+#ifndef GL_SGIX_async_pixel
+#define GL_SGIX_async_pixel 1
+
+#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C
+#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D
+#define GL_ASYNC_READ_PIXELS_SGIX 0x835E
+#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F
+#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360
+#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361
+
+#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel)
+
+#endif /* GL_SGIX_async_pixel */
+
+/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */
+
+#ifndef GL_SGIX_blend_alpha_minmax
+#define GL_SGIX_blend_alpha_minmax 1
+
+#define GL_ALPHA_MIN_SGIX 0x8320
+#define GL_ALPHA_MAX_SGIX 0x8321
+
+#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax)
+
+#endif /* GL_SGIX_blend_alpha_minmax */
+
+/* ---------------------------- GL_SGIX_clipmap ---------------------------- */
+
+#ifndef GL_SGIX_clipmap
+#define GL_SGIX_clipmap 1
+
+#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap)
+
+#endif /* GL_SGIX_clipmap */
+
+/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */
+
+#ifndef GL_SGIX_convolution_accuracy
+#define GL_SGIX_convolution_accuracy 1
+
+#define GL_CONVOLUTION_HINT_SGIX 0x8316
+
+#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy)
+
+#endif /* GL_SGIX_convolution_accuracy */
+
+/* ------------------------- GL_SGIX_depth_texture ------------------------- */
+
+#ifndef GL_SGIX_depth_texture
+#define GL_SGIX_depth_texture 1
+
+#define GL_DEPTH_COMPONENT16_SGIX 0x81A5
+#define GL_DEPTH_COMPONENT24_SGIX 0x81A6
+#define GL_DEPTH_COMPONENT32_SGIX 0x81A7
+
+#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture)
+
+#endif /* GL_SGIX_depth_texture */
+
+/* -------------------------- GL_SGIX_flush_raster ------------------------- */
+
+#ifndef GL_SGIX_flush_raster
+#define GL_SGIX_flush_raster 1
+
+typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void);
+
+#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX)
+
+#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster)
+
+#endif /* GL_SGIX_flush_raster */
+
+/* --------------------------- GL_SGIX_fog_offset -------------------------- */
+
+#ifndef GL_SGIX_fog_offset
+#define GL_SGIX_fog_offset 1
+
+#define GL_FOG_OFFSET_SGIX 0x8198
+#define GL_FOG_OFFSET_VALUE_SGIX 0x8199
+
+#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset)
+
+#endif /* GL_SGIX_fog_offset */
+
+/* -------------------------- GL_SGIX_fog_texture -------------------------- */
+
+#ifndef GL_SGIX_fog_texture
+#define GL_SGIX_fog_texture 1
+
+#define GL_TEXTURE_FOG_SGIX 0
+#define GL_FOG_PATCHY_FACTOR_SGIX 0
+#define GL_FRAGMENT_FOG_SGIX 0
+
+typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname);
+
+#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX)
+
+#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture)
+
+#endif /* GL_SGIX_fog_texture */
+
+/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */
+
+#ifndef GL_SGIX_fragment_specular_lighting
+#define GL_SGIX_fragment_specular_lighting 1
+
+typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param);
+typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data);
+typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data);
+
+#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX)
+#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX)
+#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX)
+#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX)
+#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX)
+#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX)
+#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX)
+#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX)
+#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX)
+#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX)
+#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX)
+#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX)
+#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX)
+#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX)
+#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX)
+#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX)
+#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX)
+
+#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting)
+
+#endif /* GL_SGIX_fragment_specular_lighting */
+
+/* --------------------------- GL_SGIX_framezoom --------------------------- */
+
+#ifndef GL_SGIX_framezoom
+#define GL_SGIX_framezoom 1
+
+typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor);
+
+#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX)
+
+#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom)
+
+#endif /* GL_SGIX_framezoom */
+
+/* --------------------------- GL_SGIX_interlace --------------------------- */
+
+#ifndef GL_SGIX_interlace
+#define GL_SGIX_interlace 1
+
+#define GL_INTERLACE_SGIX 0x8094
+
+#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace)
+
+#endif /* GL_SGIX_interlace */
+
+/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */
+
+#ifndef GL_SGIX_ir_instrument1
+#define GL_SGIX_ir_instrument1 1
+
+#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1)
+
+#endif /* GL_SGIX_ir_instrument1 */
+
+/* ------------------------- GL_SGIX_list_priority ------------------------- */
+
+#ifndef GL_SGIX_list_priority
+#define GL_SGIX_list_priority 1
+
+#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority)
+
+#endif /* GL_SGIX_list_priority */
+
+/* ------------------------- GL_SGIX_pixel_texture ------------------------- */
+
+#ifndef GL_SGIX_pixel_texture
+#define GL_SGIX_pixel_texture 1
+
+typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode);
+
+#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX)
+
+#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture)
+
+#endif /* GL_SGIX_pixel_texture */
+
+/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */
+
+#ifndef GL_SGIX_pixel_texture_bits
+#define GL_SGIX_pixel_texture_bits 1
+
+#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits)
+
+#endif /* GL_SGIX_pixel_texture_bits */
+
+/* ------------------------ GL_SGIX_reference_plane ------------------------ */
+
+#ifndef GL_SGIX_reference_plane
+#define GL_SGIX_reference_plane 1
+
+typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation);
+
+#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX)
+
+#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane)
+
+#endif /* GL_SGIX_reference_plane */
+
+/* ---------------------------- GL_SGIX_resample --------------------------- */
+
+#ifndef GL_SGIX_resample
+#define GL_SGIX_resample 1
+
+#define GL_PACK_RESAMPLE_SGIX 0x842E
+#define GL_UNPACK_RESAMPLE_SGIX 0x842F
+#define GL_RESAMPLE_DECIMATE_SGIX 0x8430
+#define GL_RESAMPLE_REPLICATE_SGIX 0x8433
+#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434
+
+#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample)
+
+#endif /* GL_SGIX_resample */
+
+/* ----------------------------- GL_SGIX_shadow ---------------------------- */
+
+#ifndef GL_SGIX_shadow
+#define GL_SGIX_shadow 1
+
+#define GL_TEXTURE_COMPARE_SGIX 0x819A
+#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B
+#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C
+#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D
+
+#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow)
+
+#endif /* GL_SGIX_shadow */
+
+/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */
+
+#ifndef GL_SGIX_shadow_ambient
+#define GL_SGIX_shadow_ambient 1
+
+#define GL_SHADOW_AMBIENT_SGIX 0x80BF
+
+#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient)
+
+#endif /* GL_SGIX_shadow_ambient */
+
+/* ----------------------------- GL_SGIX_sprite ---------------------------- */
+
+#ifndef GL_SGIX_sprite
+#define GL_SGIX_sprite 1
+
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params);
+
+#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX)
+#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX)
+#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX)
+#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX)
+
+#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite)
+
+#endif /* GL_SGIX_sprite */
+
+/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */
+
+#ifndef GL_SGIX_tag_sample_buffer
+#define GL_SGIX_tag_sample_buffer 1
+
+typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void);
+
+#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX)
+
+#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer)
+
+#endif /* GL_SGIX_tag_sample_buffer */
+
+/* ------------------------ GL_SGIX_texture_add_env ------------------------ */
+
+#ifndef GL_SGIX_texture_add_env
+#define GL_SGIX_texture_add_env 1
+
+#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env)
+
+#endif /* GL_SGIX_texture_add_env */
+
+/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */
+
+#ifndef GL_SGIX_texture_coordinate_clamp
+#define GL_SGIX_texture_coordinate_clamp 1
+
+#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369
+#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A
+#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B
+
+#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp)
+
+#endif /* GL_SGIX_texture_coordinate_clamp */
+
+/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */
+
+#ifndef GL_SGIX_texture_lod_bias
+#define GL_SGIX_texture_lod_bias 1
+
+#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias)
+
+#endif /* GL_SGIX_texture_lod_bias */
+
+/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */
+
+#ifndef GL_SGIX_texture_multi_buffer
+#define GL_SGIX_texture_multi_buffer 1
+
+#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E
+
+#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer)
+
+#endif /* GL_SGIX_texture_multi_buffer */
+
+/* ------------------------- GL_SGIX_texture_range ------------------------- */
+
+#ifndef GL_SGIX_texture_range
+#define GL_SGIX_texture_range 1
+
+#define GL_RGB_SIGNED_SGIX 0x85E0
+#define GL_RGBA_SIGNED_SGIX 0x85E1
+#define GL_ALPHA_SIGNED_SGIX 0x85E2
+#define GL_LUMINANCE_SIGNED_SGIX 0x85E3
+#define GL_INTENSITY_SIGNED_SGIX 0x85E4
+#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5
+#define GL_RGB16_SIGNED_SGIX 0x85E6
+#define GL_RGBA16_SIGNED_SGIX 0x85E7
+#define GL_ALPHA16_SIGNED_SGIX 0x85E8
+#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9
+#define GL_INTENSITY16_SIGNED_SGIX 0x85EA
+#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB
+#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC
+#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED
+#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE
+#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF
+#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0
+#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1
+#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2
+#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3
+#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4
+#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5
+#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6
+#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7
+#define GL_MIN_LUMINANCE_SGIS 0x85F8
+#define GL_MAX_LUMINANCE_SGIS 0x85F9
+#define GL_MIN_INTENSITY_SGIS 0x85FA
+#define GL_MAX_INTENSITY_SGIS 0x85FB
+
+#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range)
+
+#endif /* GL_SGIX_texture_range */
+
+/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */
+
+#ifndef GL_SGIX_texture_scale_bias
+#define GL_SGIX_texture_scale_bias 1
+
+#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179
+#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A
+#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B
+#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C
+
+#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias)
+
+#endif /* GL_SGIX_texture_scale_bias */
+
+/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */
+
+#ifndef GL_SGIX_vertex_preclip
+#define GL_SGIX_vertex_preclip 1
+
+#define GL_VERTEX_PRECLIP_SGIX 0x83EE
+#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
+
+#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip)
+
+#endif /* GL_SGIX_vertex_preclip */
+
+/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */
+
+#ifndef GL_SGIX_vertex_preclip_hint
+#define GL_SGIX_vertex_preclip_hint 1
+
+#define GL_VERTEX_PRECLIP_SGIX 0x83EE
+#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
+
+#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint)
+
+#endif /* GL_SGIX_vertex_preclip_hint */
+
+/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */
+
+#ifndef GL_SGIX_ycrcb
+#define GL_SGIX_ycrcb 1
+
+#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb)
+
+#endif /* GL_SGIX_ycrcb */
+
+/* -------------------------- GL_SGI_color_matrix -------------------------- */
+
+#ifndef GL_SGI_color_matrix
+#define GL_SGI_color_matrix 1
+
+#define GL_COLOR_MATRIX_SGI 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3
+#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7
+#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB
+
+#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix)
+
+#endif /* GL_SGI_color_matrix */
+
+/* --------------------------- GL_SGI_color_table -------------------------- */
+
+#ifndef GL_SGI_color_table
+#define GL_SGI_color_table 1
+
+#define GL_COLOR_TABLE_SGI 0x80D0
+#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2
+#define GL_PROXY_COLOR_TABLE_SGI 0x80D3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5
+#define GL_COLOR_TABLE_SCALE_SGI 0x80D6
+#define GL_COLOR_TABLE_BIAS_SGI 0x80D7
+#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8
+#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF
+
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table);
+typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table);
+
+#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI)
+#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI)
+#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI)
+#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI)
+#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI)
+#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI)
+#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI)
+
+#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table)
+
+#endif /* GL_SGI_color_table */
+
+/* ----------------------- GL_SGI_texture_color_table ---------------------- */
+
+#ifndef GL_SGI_texture_color_table
+#define GL_SGI_texture_color_table 1
+
+#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC
+#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD
+
+#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table)
+
+#endif /* GL_SGI_texture_color_table */
+
+/* ------------------------- GL_SUNX_constant_data ------------------------- */
+
+#ifndef GL_SUNX_constant_data
+#define GL_SUNX_constant_data 1
+
+#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5
+#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6
+
+typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void);
+
+#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX)
+
+#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data)
+
+#endif /* GL_SUNX_constant_data */
+
+/* -------------------- GL_SUN_convolution_border_modes -------------------- */
+
+#ifndef GL_SUN_convolution_border_modes
+#define GL_SUN_convolution_border_modes 1
+
+#define GL_WRAP_BORDER_SUN 0x81D4
+
+#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes)
+
+#endif /* GL_SUN_convolution_border_modes */
+
+/* -------------------------- GL_SUN_global_alpha -------------------------- */
+
+#ifndef GL_SUN_global_alpha
+#define GL_SUN_global_alpha 1
+
+#define GL_GLOBAL_ALPHA_SUN 0x81D9
+#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA
+
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);
+typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);
+
+#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN)
+#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN)
+#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN)
+#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN)
+#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN)
+#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN)
+#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN)
+#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN)
+
+#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha)
+
+#endif /* GL_SUN_global_alpha */
+
+/* --------------------------- GL_SUN_mesh_array --------------------------- */
+
+#ifndef GL_SUN_mesh_array
+#define GL_SUN_mesh_array 1
+
+#define GL_QUAD_MESH_SUN 0x8614
+#define GL_TRIANGLE_MESH_SUN 0x8615
+
+#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array)
+
+#endif /* GL_SUN_mesh_array */
+
+/* ------------------------ GL_SUN_read_video_pixels ----------------------- */
+
+#ifndef GL_SUN_read_video_pixels
+#define GL_SUN_read_video_pixels 1
+
+typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
+
+#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN)
+
+#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels)
+
+#endif /* GL_SUN_read_video_pixels */
+
+/* --------------------------- GL_SUN_slice_accum -------------------------- */
+
+#ifndef GL_SUN_slice_accum
+#define GL_SUN_slice_accum 1
+
+#define GL_SLICE_ACCUM_SUN 0x85CC
+
+#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum)
+
+#endif /* GL_SUN_slice_accum */
+
+/* -------------------------- GL_SUN_triangle_list ------------------------- */
+
+#ifndef GL_SUN_triangle_list
+#define GL_SUN_triangle_list 1
+
+#define GL_RESTART_SUN 0x01
+#define GL_REPLACE_MIDDLE_SUN 0x02
+#define GL_REPLACE_OLDEST_SUN 0x03
+#define GL_TRIANGLE_LIST_SUN 0x81D7
+#define GL_REPLACEMENT_CODE_SUN 0x81D8
+#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0
+#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1
+#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2
+#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3
+#define GL_R1UI_V3F_SUN 0x85C4
+#define GL_R1UI_C4UB_V3F_SUN 0x85C5
+#define GL_R1UI_C3F_V3F_SUN 0x85C6
+#define GL_R1UI_N3F_V3F_SUN 0x85C7
+#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8
+#define GL_R1UI_T2F_V3F_SUN 0x85C9
+#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA
+#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB
+
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code);
+
+#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN)
+#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN)
+#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN)
+#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN)
+#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN)
+#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN)
+#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN)
+
+#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list)
+
+#endif /* GL_SUN_triangle_list */
+
+/* ----------------------------- GL_SUN_vertex ----------------------------- */
+
+#ifndef GL_SUN_vertex
+#define GL_SUN_vertex 1
+
+typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v);
+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);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v);
+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);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v);
+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);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v);
+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);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v);
+
+#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN)
+#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN)
+#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN)
+#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN)
+#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN)
+#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN)
+#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN)
+#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN)
+#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN)
+#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN)
+#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN)
+#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN)
+#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN)
+#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN)
+#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN)
+#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN)
+#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN)
+#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN)
+#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN)
+#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN)
+#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN)
+#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN)
+#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN)
+#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN)
+#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN)
+#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN)
+#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN)
+#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN)
+#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN)
+#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN)
+#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN)
+#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN)
+#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN)
+#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN)
+#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN)
+#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN)
+#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN)
+#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN)
+#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN)
+#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN)
+
+#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex)
+
+#endif /* GL_SUN_vertex */
+
+/* -------------------------- GL_WIN_phong_shading ------------------------- */
+
+#ifndef GL_WIN_phong_shading
+#define GL_WIN_phong_shading 1
+
+#define GL_PHONG_WIN 0x80EA
+#define GL_PHONG_HINT_WIN 0x80EB
+
+#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading)
+
+#endif /* GL_WIN_phong_shading */
+
+/* -------------------------- GL_WIN_specular_fog -------------------------- */
+
+#ifndef GL_WIN_specular_fog
+#define GL_WIN_specular_fog 1
+
+#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC
+
+#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog)
+
+#endif /* GL_WIN_specular_fog */
+
+/* ---------------------------- GL_WIN_swap_hint --------------------------- */
+
+#ifndef GL_WIN_swap_hint
+#define GL_WIN_swap_hint 1
+
+typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
+
+#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN)
+
+#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint)
+
+#endif /* GL_WIN_swap_hint */
+
+/* ------------------------------------------------------------------------- */
+
+#if defined(GLEW_MX) && defined(_WIN32)
+#define GLEW_FUN_EXPORT
+#else
+#define GLEW_FUN_EXPORT GLEWAPI
+#endif /* GLEW_MX */
+
+#if defined(GLEW_MX)
+#define GLEW_VAR_EXPORT
+#else
+#define GLEW_VAR_EXPORT GLEWAPI
+#endif /* GLEW_MX */
+
+#if defined(GLEW_MX) && defined(_WIN32)
+struct GLEWContextStruct
+{
+#endif /* GLEW_MX */
+
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;
+GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D;
+
+GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture;
+GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D;
+GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage;
+GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd;
+GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf;
+GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd;
+GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv;
+GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage;
+
+GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate;
+GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv;
+
+GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer;
+GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData;
+GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData;
+GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers;
+GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries;
+GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery;
+GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers;
+GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv;
+GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv;
+GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv;
+GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer;
+GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery;
+GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer;
+GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer;
+
+GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader;
+GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate;
+GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader;
+GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram;
+GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader;
+GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram;
+GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader;
+GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray;
+GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray;
+GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform;
+GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders;
+GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv;
+GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog;
+GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource;
+GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv;
+GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram;
+GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader;
+GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram;
+GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource;
+GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate;
+GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate;
+GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate;
+GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f;
+GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv;
+GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i;
+GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv;
+GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f;
+GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv;
+GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i;
+GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv;
+GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f;
+GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv;
+GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i;
+GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv;
+GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f;
+GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv;
+GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i;
+GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv;
+GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram;
+GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer;
+
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv;
+
+GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender;
+GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback;
+GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation;
+GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor;
+GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi;
+GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv;
+GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv;
+GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv;
+GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski;
+GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei;
+GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei;
+GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender;
+GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback;
+GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v;
+GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation;
+GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi;
+GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv;
+GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv;
+GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv;
+GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi;
+GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv;
+GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv;
+GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer;
+
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced;
+GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex;
+GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer;
+
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v;
+GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v;
+
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci;
+GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading;
+
+GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX;
+
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD;
+GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD;
+
+GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD;
+
+GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD;
+GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD;
+GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD;
+
+GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD;
+GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD;
+GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD;
+GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD;
+GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD;
+
+GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD;
+
+GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD;
+GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD;
+
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE;
+
+GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE;
+GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE;
+GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE;
+GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE;
+GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE;
+
+GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE;
+GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE;
+
+GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE;
+GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE;
+GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE;
+
+GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE;
+GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE;
+
+GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE;
+GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE;
+GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE;
+GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE;
+
+GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE;
+
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE;
+GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE;
+
+GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf;
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef;
+GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat;
+GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler;
+GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary;
+
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance;
+
+GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed;
+GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex;
+
+GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB;
+
+GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB;
+
+GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData;
+
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB;
+GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB;
+
+GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB;
+
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex;
+
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect;
+
+GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer;
+GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer;
+GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer;
+GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus;
+GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers;
+GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer;
+GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers;
+GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers;
+GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap;
+GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv;
+GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv;
+GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer;
+GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer;
+GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage;
+GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample;
+
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB;
+
+GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary;
+GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri;
+
+GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d;
+GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv;
+GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d;
+GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d;
+GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv;
+GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d;
+GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv;
+
+GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv;
+GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter;
+GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram;
+GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax;
+GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram;
+GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax;
+GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D;
+
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB;
+
+GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ;
+
+GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange;
+GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange;
+
+GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB;
+GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB;
+
+GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB;
+
+GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB;
+GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB;
+
+GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB;
+GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB;
+GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB;
+GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB;
+GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB;
+GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB;
+
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB;
+
+GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex;
+
+GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB;
+GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB;
+GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB;
+GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB;
+GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB;
+GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB;
+GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB;
+GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB;
+GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB;
+GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB;
+GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB;
+GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB;
+GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB;
+GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB;
+GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB;
+GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB;
+
+GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB;
+
+GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler;
+GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers;
+GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv;
+GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv;
+
+GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram;
+GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline;
+GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv;
+GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines;
+GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv;
+GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv;
+GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages;
+GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline;
+
+GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv;
+
+GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture;
+GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier;
+
+GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB;
+GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB;
+GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB;
+GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB;
+GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB;
+GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB;
+GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB;
+GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB;
+GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB;
+GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB;
+GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB;
+GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB;
+GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB;
+GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB;
+GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB;
+GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB;
+GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB;
+
+GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName;
+GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName;
+GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv;
+GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex;
+GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv;
+GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv;
+
+GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB;
+GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB;
+GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB;
+GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB;
+GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB;
+GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB;
+
+GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync;
+GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync;
+GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync;
+GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v;
+GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv;
+GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync;
+GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync;
+
+GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv;
+GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri;
+
+GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB;
+
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB;
+GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB;
+
+GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv;
+GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski;
+GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample;
+GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample;
+
+GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D;
+GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D;
+GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D;
+GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT;
+
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v;
+GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter;
+
+GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback;
+GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks;
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback;
+GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks;
+GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback;
+GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback;
+GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback;
+
+GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed;
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream;
+GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed;
+GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv;
+
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced;
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced;
+
+GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB;
+GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB;
+GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB;
+GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB;
+
+GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv;
+GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices;
+GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding;
+
+GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray;
+GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays;
+GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays;
+GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray;
+
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer;
+
+GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB;
+GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB;
+
+GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB;
+GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB;
+GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB;
+GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB;
+GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB;
+GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB;
+GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB;
+GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB;
+GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB;
+
+GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB;
+GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB;
+GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB;
+GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB;
+GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB;
+
+GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB;
+GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB;
+GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB;
+
+GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui;
+GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv;
+GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui;
+GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv;
+GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui;
+GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui;
+GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui;
+GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui;
+GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv;
+
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv;
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed;
+GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v;
+GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v;
+GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv;
+GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed;
+GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv;
+GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv;
+GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf;
+GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv;
+
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB;
+
+GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI;
+
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI;
+GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI;
+
+GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI;
+GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI;
+GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI;
+GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI;
+
+GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI;
+GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI;
+GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI;
+GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI;
+GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI;
+GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI;
+GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI;
+GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI;
+GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI;
+GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI;
+GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI;
+
+GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI;
+
+GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI;
+GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI;
+
+GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI;
+GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI;
+
+GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI;
+GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI;
+GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI;
+GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI;
+GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI;
+GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI;
+GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI;
+GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI;
+GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI;
+
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI;
+
+GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI;
+GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI;
+GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI;
+GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI;
+GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI;
+
+GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT;
+
+GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT;
+
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT;
+
+GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT;
+
+GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT;
+GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT;
+
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT;
+GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT;
+GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT;
+
+GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT;
+GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT;
+
+GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT;
+GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT;
+
+GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT;
+
+GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT;
+GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT;
+GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT;
+GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT;
+GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT;
+GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT;
+GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT;
+GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT;
+GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT;
+GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT;
+GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT;
+GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT;
+GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT;
+GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT;
+GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT;
+GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT;
+GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT;
+GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT;
+GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT;
+GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT;
+
+GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT;
+GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT;
+GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT;
+GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT;
+
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT;
+
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT;
+
+GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT;
+
+GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT;
+GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT;
+
+GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT;
+
+GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT;
+
+GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT;
+GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT;
+GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT;
+GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT;
+GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT;
+GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT;
+GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT;
+GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT;
+GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT;
+GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT;
+GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT;
+
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT;
+
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT;
+
+GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT;
+GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT;
+GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT;
+GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT;
+GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT;
+GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT;
+
+GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT;
+
+GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT;
+
+GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT;
+GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT;
+GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT;
+
+GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT;
+
+GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT;
+GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT;
+
+GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT;
+
+GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT;
+GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT;
+
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT;
+
+GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT;
+
+GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT;
+
+GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT;
+GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT;
+
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT;
+GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT;
+GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT;
+
+GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT;
+GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT;
+
+GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT;
+
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT;
+
+GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT;
+
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT;
+
+GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT;
+
+GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT;
+GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT;
+GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT;
+GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT;
+GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT;
+
+GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT;
+GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT;
+GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT;
+GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT;
+GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT;
+GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT;
+
+GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT;
+
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT;
+
+GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT;
+GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT;
+GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT;
+GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT;
+GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT;
+
+GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT;
+GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT;
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT;
+GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT;
+GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT;
+GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT;
+GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT;
+
+GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT;
+GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT;
+GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT;
+GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT;
+GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT;
+GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT;
+GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT;
+GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT;
+GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT;
+GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT;
+GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT;
+GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT;
+GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT;
+GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT;
+GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT;
+GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT;
+GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT;
+GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT;
+GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT;
+GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT;
+GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT;
+GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT;
+
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT;
+
+GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT;
+
+GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY;
+
+GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY;
+
+GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP;
+GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP;
+GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP;
+
+GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM;
+GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM;
+
+GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM;
+GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM;
+GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM;
+GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM;
+GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM;
+GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM;
+GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM;
+
+GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL;
+GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL;
+GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL;
+GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL;
+
+GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL;
+GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL;
+
+GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled;
+GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion;
+GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion;
+GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion;
+GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion;
+
+GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA;
+
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA;
+GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA;
+
+GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV;
+GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV;
+
+GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV;
+
+GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV;
+GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV;
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV;
+
+GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV;
+GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV;
+GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV;
+GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV;
+GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV;
+GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV;
+GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV;
+
+GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV;
+GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV;
+GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV;
+
+GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV;
+GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV;
+GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV;
+GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV;
+GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV;
+GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV;
+GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV;
+
+GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV;
+
+GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV;
+
+GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV;
+
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV;
+
+GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV;
+
+GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV;
+GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV;
+GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV;
+GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV;
+GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV;
+GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV;
+GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV;
+GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV;
+GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV;
+GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV;
+GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV;
+GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV;
+
+GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV;
+GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV;
+GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV;
+GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV;
+GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV;
+GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV;
+GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV;
+
+GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV;
+
+GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV;
+GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV;
+GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV;
+GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV;
+GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV;
+GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV;
+GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV;
+GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV;
+GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV;
+GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV;
+GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV;
+GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV;
+GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV;
+GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV;
+GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV;
+GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV;
+GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV;
+GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV;
+GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV;
+GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV;
+GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV;
+GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV;
+GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV;
+GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV;
+GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV;
+GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV;
+GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV;
+GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV;
+GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV;
+GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV;
+GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV;
+GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV;
+GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV;
+GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV;
+GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV;
+GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV;
+GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV;
+GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV;
+GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV;
+GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV;
+GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV;
+GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV;
+GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV;
+GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV;
+GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV;
+GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV;
+GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV;
+GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV;
+
+GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV;
+GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV;
+
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV;
+GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV;
+
+GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV;
+GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV;
+GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV;
+GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV;
+GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV;
+GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV;
+
+GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV;
+GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV;
+
+GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV;
+GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV;
+GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV;
+GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV;
+GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV;
+
+GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV;
+
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV;
+GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV;
+GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV;
+GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV;
+
+GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV;
+
+GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV;
+GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV;
+GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV;
+GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV;
+GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV;
+GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV;
+
+GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV;
+GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV;
+GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV;
+GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV;
+GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV;
+GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV;
+GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV;
+GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV;
+
+GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV;
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV;
+GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV;
+
+GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV;
+GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV;
+GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV;
+GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV;
+GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV;
+GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV;
+GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV;
+GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV;
+GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV;
+GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV;
+
+GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV;
+
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV;
+
+GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV;
+GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV;
+GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV;
+GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV;
+GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV;
+GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV;
+GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV;
+
+GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV;
+GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV;
+GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV;
+GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV;
+GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV;
+GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV;
+GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV;
+GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV;
+GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV;
+GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV;
+
+GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV;
+GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV;
+GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV;
+GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV;
+GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV;
+GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV;
+GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV;
+GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV;
+GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV;
+GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV;
+GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV;
+GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV;
+
+GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES;
+GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES;
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES;
+GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES;
+GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES;
+GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES;
+
+GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS;
+GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS;
+GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS;
+GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS;
+
+GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS;
+GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS;
+GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS;
+
+GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS;
+GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS;
+
+GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX;
+GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX;
+GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX;
+GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX;
+GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX;
+GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX;
+
+GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX;
+
+GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX;
+
+GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX;
+GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX;
+GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX;
+
+GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX;
+
+GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX;
+
+GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX;
+
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX;
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX;
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX;
+GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX;
+
+GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX;
+
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI;
+GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI;
+GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI;
+GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI;
+GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI;
+
+GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX;
+
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN;
+GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN;
+
+GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN;
+
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN;
+
+GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN;
+GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN;
+
+GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN;
+
+#if defined(GLEW_MX) && !defined(_WIN32)
+struct GLEWContextStruct
+{
+#endif /* GLEW_MX */
+
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2;
+GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator;
+GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test;
+GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat;
+GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists;
+GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read;
+GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays;
+GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor;
+GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos;
+GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture;
+GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates;
+GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format;
+GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision;
+GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace;
+GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample;
+GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample;
+GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints;
+GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints;
+GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates;
+GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table;
+GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list;
+GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading;
+GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog;
+GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint;
+
+#ifdef GLEW_MX
+}; /* GLEWContextStruct */
+#endif /* GLEW_MX */
+
+/* ------------------------------------------------------------------------- */
+
+/* error codes */
+#define GLEW_OK 0
+#define GLEW_NO_ERROR 0
+#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */
+#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */
+#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */
+
+/* string codes */
+#define GLEW_VERSION 1
+#define GLEW_VERSION_MAJOR 2
+#define GLEW_VERSION_MINOR 3
+#define GLEW_VERSION_MICRO 4
+
+/* API */
+#ifdef GLEW_MX
+
+typedef struct GLEWContextStruct GLEWContext;
+GLEWAPI GLenum glewContextInit (GLEWContext* ctx);
+GLEWAPI GLboolean glewContextIsSupported (const GLEWContext* ctx, const char* name);
+
+#define glewInit() glewContextInit(glewGetContext())
+#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x)
+#define glewIsExtensionSupported(x) glewIsSupported(x)
+
+#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x))
+#ifdef _WIN32
+# define GLEW_GET_FUN(x) glewGetContext()->x
+#else
+# define GLEW_GET_FUN(x) x
+#endif
+
+#else /* GLEW_MX */
+
+GLEWAPI GLenum glewInit ();
+GLEWAPI GLboolean glewIsSupported (const char* name);
+#define glewIsExtensionSupported(x) glewIsSupported(x)
+
+#define GLEW_GET_VAR(x) (*(const GLboolean*)&x)
+#define GLEW_GET_FUN(x) x
+
+#endif /* GLEW_MX */
+
+GLEWAPI GLboolean glewExperimental;
+GLEWAPI GLboolean glewGetExtension (const char* name);
+GLEWAPI const GLubyte* glewGetErrorString (GLenum error);
+GLEWAPI const GLubyte* glewGetString (GLenum name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef GLEW_APIENTRY_DEFINED
+#undef GLEW_APIENTRY_DEFINED
+#undef APIENTRY
+#undef GLAPIENTRY
+#define GLAPIENTRY
+#endif
+
+#ifdef GLEW_CALLBACK_DEFINED
+#undef GLEW_CALLBACK_DEFINED
+#undef CALLBACK
+#endif
+
+#ifdef GLEW_WINGDIAPI_DEFINED
+#undef GLEW_WINGDIAPI_DEFINED
+#undef WINGDIAPI
+#endif
+
+#undef GLAPI
+/* #undef GLEWAPI */
+
+#endif /* __glew_h__ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glext.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glext.h
new file mode 100644
index 0000000..5a6dbc4
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glext.h
@@ -0,0 +1,11163 @@
+#ifndef __glext_h_
+#define __glext_h_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2014 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+**
+** Khronos $Revision: 28221 $ on $Date: 2014-09-18 20:11:05 -0700 (Thu, 18 Sep 2014) $
+*/
+
+#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <windows.h>
+#endif
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+#ifndef GLAPI
+#define GLAPI extern
+#endif
+
+#define GL_GLEXT_VERSION 20140918
+
+/* Generated C header for:
+ * API: gl
+ * Profile: compatibility
+ * Versions considered: .*
+ * Versions emitted: 1\.[2-9]|[234]\.[0-9]
+ * Default extensions included: gl
+ * Additional extensions included: _nomatch_^
+ * Extensions removed: _nomatch_^
+ */
+
+#ifndef GL_VERSION_1_2
+#define GL_VERSION_1_2 1
+#define GL_UNSIGNED_BYTE_3_3_2 0x8032
+#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
+#define GL_UNSIGNED_INT_8_8_8_8 0x8035
+#define GL_UNSIGNED_INT_10_10_10_2 0x8036
+#define GL_TEXTURE_BINDING_3D 0x806A
+#define GL_PACK_SKIP_IMAGES 0x806B
+#define GL_PACK_IMAGE_HEIGHT 0x806C
+#define GL_UNPACK_SKIP_IMAGES 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT 0x806E
+#define GL_TEXTURE_3D 0x806F
+#define GL_PROXY_TEXTURE_3D 0x8070
+#define GL_TEXTURE_DEPTH 0x8071
+#define GL_TEXTURE_WRAP_R 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE 0x8073
+#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
+#define GL_UNSIGNED_SHORT_5_6_5 0x8363
+#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
+#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_BGR 0x80E0
+#define GL_BGRA 0x80E1
+#define GL_MAX_ELEMENTS_VERTICES 0x80E8
+#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_CLAMP_TO_EDGE 0x812F
+#define GL_TEXTURE_MIN_LOD 0x813A
+#define GL_TEXTURE_MAX_LOD 0x813B
+#define GL_TEXTURE_BASE_LEVEL 0x813C
+#define GL_TEXTURE_MAX_LEVEL 0x813D
+#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12
+#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13
+#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22
+#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23
+#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
+#define GL_RESCALE_NORMAL 0x803A
+#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8
+#define GL_SINGLE_COLOR 0x81F9
+#define GL_SEPARATE_SPECULAR_COLOR 0x81FA
+#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_VERSION_1_2 */
+
+#ifndef GL_VERSION_1_3
+#define GL_VERSION_1_3 1
+#define GL_TEXTURE0 0x84C0
+#define GL_TEXTURE1 0x84C1
+#define GL_TEXTURE2 0x84C2
+#define GL_TEXTURE3 0x84C3
+#define GL_TEXTURE4 0x84C4
+#define GL_TEXTURE5 0x84C5
+#define GL_TEXTURE6 0x84C6
+#define GL_TEXTURE7 0x84C7
+#define GL_TEXTURE8 0x84C8
+#define GL_TEXTURE9 0x84C9
+#define GL_TEXTURE10 0x84CA
+#define GL_TEXTURE11 0x84CB
+#define GL_TEXTURE12 0x84CC
+#define GL_TEXTURE13 0x84CD
+#define GL_TEXTURE14 0x84CE
+#define GL_TEXTURE15 0x84CF
+#define GL_TEXTURE16 0x84D0
+#define GL_TEXTURE17 0x84D1
+#define GL_TEXTURE18 0x84D2
+#define GL_TEXTURE19 0x84D3
+#define GL_TEXTURE20 0x84D4
+#define GL_TEXTURE21 0x84D5
+#define GL_TEXTURE22 0x84D6
+#define GL_TEXTURE23 0x84D7
+#define GL_TEXTURE24 0x84D8
+#define GL_TEXTURE25 0x84D9
+#define GL_TEXTURE26 0x84DA
+#define GL_TEXTURE27 0x84DB
+#define GL_TEXTURE28 0x84DC
+#define GL_TEXTURE29 0x84DD
+#define GL_TEXTURE30 0x84DE
+#define GL_TEXTURE31 0x84DF
+#define GL_ACTIVE_TEXTURE 0x84E0
+#define GL_MULTISAMPLE 0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE 0x809F
+#define GL_SAMPLE_COVERAGE 0x80A0
+#define GL_SAMPLE_BUFFERS 0x80A8
+#define GL_SAMPLES 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
+#define GL_TEXTURE_CUBE_MAP 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
+#define GL_COMPRESSED_RGB 0x84ED
+#define GL_COMPRESSED_RGBA 0x84EE
+#define GL_TEXTURE_COMPRESSION_HINT 0x84EF
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0
+#define GL_TEXTURE_COMPRESSED 0x86A1
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
+#define GL_CLAMP_TO_BORDER 0x812D
+#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1
+#define GL_MAX_TEXTURE_UNITS 0x84E2
+#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3
+#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4
+#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5
+#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6
+#define GL_MULTISAMPLE_BIT 0x20000000
+#define GL_NORMAL_MAP 0x8511
+#define GL_REFLECTION_MAP 0x8512
+#define GL_COMPRESSED_ALPHA 0x84E9
+#define GL_COMPRESSED_LUMINANCE 0x84EA
+#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB
+#define GL_COMPRESSED_INTENSITY 0x84EC
+#define GL_COMBINE 0x8570
+#define GL_COMBINE_RGB 0x8571
+#define GL_COMBINE_ALPHA 0x8572
+#define GL_SOURCE0_RGB 0x8580
+#define GL_SOURCE1_RGB 0x8581
+#define GL_SOURCE2_RGB 0x8582
+#define GL_SOURCE0_ALPHA 0x8588
+#define GL_SOURCE1_ALPHA 0x8589
+#define GL_SOURCE2_ALPHA 0x858A
+#define GL_OPERAND0_RGB 0x8590
+#define GL_OPERAND1_RGB 0x8591
+#define GL_OPERAND2_RGB 0x8592
+#define GL_OPERAND0_ALPHA 0x8598
+#define GL_OPERAND1_ALPHA 0x8599
+#define GL_OPERAND2_ALPHA 0x859A
+#define GL_RGB_SCALE 0x8573
+#define GL_ADD_SIGNED 0x8574
+#define GL_INTERPOLATE 0x8575
+#define GL_SUBTRACT 0x84E7
+#define GL_CONSTANT 0x8576
+#define GL_PRIMARY_COLOR 0x8577
+#define GL_PREVIOUS 0x8578
+#define GL_DOT3_RGB 0x86AE
+#define GL_DOT3_RGBA 0x86AF
+typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
+typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img);
+typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);
+typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m);
+typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m);
+typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m);
+typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glActiveTexture (GLenum texture);
+GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert);
+GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img);
+GLAPI void APIENTRY glClientActiveTexture (GLenum texture);
+GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s);
+GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s);
+GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s);
+GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s);
+GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v);
+GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t);
+GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t);
+GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t);
+GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t);
+GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v);
+GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r);
+GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r);
+GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v);
+GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q);
+GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v);
+GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m);
+GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m);
+GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m);
+GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m);
+#endif
+#endif /* GL_VERSION_1_3 */
+
+#ifndef GL_VERSION_1_4
+#define GL_VERSION_1_4 1
+#define GL_BLEND_DST_RGB 0x80C8
+#define GL_BLEND_SRC_RGB 0x80C9
+#define GL_BLEND_DST_ALPHA 0x80CA
+#define GL_BLEND_SRC_ALPHA 0x80CB
+#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128
+#define GL_DEPTH_COMPONENT16 0x81A5
+#define GL_DEPTH_COMPONENT24 0x81A6
+#define GL_DEPTH_COMPONENT32 0x81A7
+#define GL_MIRRORED_REPEAT 0x8370
+#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD
+#define GL_TEXTURE_LOD_BIAS 0x8501
+#define GL_INCR_WRAP 0x8507
+#define GL_DECR_WRAP 0x8508
+#define GL_TEXTURE_DEPTH_SIZE 0x884A
+#define GL_TEXTURE_COMPARE_MODE 0x884C
+#define GL_TEXTURE_COMPARE_FUNC 0x884D
+#define GL_POINT_SIZE_MIN 0x8126
+#define GL_POINT_SIZE_MAX 0x8127
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#define GL_GENERATE_MIPMAP 0x8191
+#define GL_GENERATE_MIPMAP_HINT 0x8192
+#define GL_FOG_COORDINATE_SOURCE 0x8450
+#define GL_FOG_COORDINATE 0x8451
+#define GL_FRAGMENT_DEPTH 0x8452
+#define GL_CURRENT_FOG_COORDINATE 0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456
+#define GL_FOG_COORDINATE_ARRAY 0x8457
+#define GL_COLOR_SUM 0x8458
+#define GL_CURRENT_SECONDARY_COLOR 0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A
+#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C
+#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D
+#define GL_SECONDARY_COLOR_ARRAY 0x845E
+#define GL_TEXTURE_FILTER_CONTROL 0x8500
+#define GL_DEPTH_TEXTURE_MODE 0x884B
+#define GL_COMPARE_R_TO_TEXTURE 0x884E
+#define GL_FUNC_ADD 0x8006
+#define GL_FUNC_SUBTRACT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT 0x800B
+#define GL_MIN 0x8007
+#define GL_MAX 0x8008
+#define GL_CONSTANT_COLOR 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
+#define GL_CONSTANT_ALPHA 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord);
+typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord);
+typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord);
+typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord);
+typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);
+GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount);
+GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param);
+GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params);
+GLAPI void APIENTRY glFogCoordf (GLfloat coord);
+GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord);
+GLAPI void APIENTRY glFogCoordd (GLdouble coord);
+GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord);
+GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue);
+GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v);
+GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue);
+GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v);
+GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue);
+GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v);
+GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue);
+GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v);
+GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue);
+GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v);
+GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue);
+GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v);
+GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue);
+GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v);
+GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue);
+GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v);
+GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y);
+GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v);
+GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y);
+GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v);
+GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y);
+GLAPI void APIENTRY glWindowPos2iv (const GLint *v);
+GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y);
+GLAPI void APIENTRY glWindowPos2sv (const GLshort *v);
+GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v);
+GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v);
+GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z);
+GLAPI void APIENTRY glWindowPos3iv (const GLint *v);
+GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glWindowPos3sv (const GLshort *v);
+GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+GLAPI void APIENTRY glBlendEquation (GLenum mode);
+#endif
+#endif /* GL_VERSION_1_4 */
+
+#ifndef GL_VERSION_1_5
+#define GL_VERSION_1_5 1
+#include <stddef.h>
+typedef ptrdiff_t GLsizeiptr;
+typedef ptrdiff_t GLintptr;
+#define GL_BUFFER_SIZE 0x8764
+#define GL_BUFFER_USAGE 0x8765
+#define GL_QUERY_COUNTER_BITS 0x8864
+#define GL_CURRENT_QUERY 0x8865
+#define GL_QUERY_RESULT 0x8866
+#define GL_QUERY_RESULT_AVAILABLE 0x8867
+#define GL_ARRAY_BUFFER 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER 0x8893
+#define GL_ARRAY_BUFFER_BINDING 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#define GL_BUFFER_ACCESS 0x88BB
+#define GL_BUFFER_MAPPED 0x88BC
+#define GL_BUFFER_MAP_POINTER 0x88BD
+#define GL_STREAM_DRAW 0x88E0
+#define GL_STREAM_READ 0x88E1
+#define GL_STREAM_COPY 0x88E2
+#define GL_STATIC_DRAW 0x88E4
+#define GL_STATIC_READ 0x88E5
+#define GL_STATIC_COPY 0x88E6
+#define GL_DYNAMIC_DRAW 0x88E8
+#define GL_DYNAMIC_READ 0x88E9
+#define GL_DYNAMIC_COPY 0x88EA
+#define GL_SAMPLES_PASSED 0x8914
+#define GL_SRC1_ALPHA 0x8589
+#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E
+#define GL_FOG_COORD_SRC 0x8450
+#define GL_FOG_COORD 0x8451
+#define GL_CURRENT_FOG_COORD 0x8453
+#define GL_FOG_COORD_ARRAY_TYPE 0x8454
+#define GL_FOG_COORD_ARRAY_STRIDE 0x8455
+#define GL_FOG_COORD_ARRAY_POINTER 0x8456
+#define GL_FOG_COORD_ARRAY 0x8457
+#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D
+#define GL_SRC0_RGB 0x8580
+#define GL_SRC1_RGB 0x8581
+#define GL_SRC2_RGB 0x8582
+#define GL_SRC0_ALPHA 0x8588
+#define GL_SRC2_ALPHA 0x858A
+typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids);
+typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
+typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
+typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
+typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data);
+typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);
+typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GLAPI GLboolean APIENTRY glIsQuery (GLuint id);
+GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id);
+GLAPI void APIENTRY glEndQuery (GLenum target);
+GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
+GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
+GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer);
+GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
+GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
+GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data);
+GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access);
+GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target);
+GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params);
+#endif
+#endif /* GL_VERSION_1_5 */
+
+#ifndef GL_VERSION_2_0
+#define GL_VERSION_2_0 1
+typedef char GLchar;
+#define GL_BLEND_EQUATION_RGB 0x8009
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
+#define GL_CURRENT_VERTEX_ATTRIB 0x8626
+#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
+#define GL_STENCIL_BACK_FUNC 0x8800
+#define GL_STENCIL_BACK_FAIL 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
+#define GL_MAX_DRAW_BUFFERS 0x8824
+#define GL_DRAW_BUFFER0 0x8825
+#define GL_DRAW_BUFFER1 0x8826
+#define GL_DRAW_BUFFER2 0x8827
+#define GL_DRAW_BUFFER3 0x8828
+#define GL_DRAW_BUFFER4 0x8829
+#define GL_DRAW_BUFFER5 0x882A
+#define GL_DRAW_BUFFER6 0x882B
+#define GL_DRAW_BUFFER7 0x882C
+#define GL_DRAW_BUFFER8 0x882D
+#define GL_DRAW_BUFFER9 0x882E
+#define GL_DRAW_BUFFER10 0x882F
+#define GL_DRAW_BUFFER11 0x8830
+#define GL_DRAW_BUFFER12 0x8831
+#define GL_DRAW_BUFFER13 0x8832
+#define GL_DRAW_BUFFER14 0x8833
+#define GL_DRAW_BUFFER15 0x8834
+#define GL_BLEND_EQUATION_ALPHA 0x883D
+#define GL_MAX_VERTEX_ATTRIBS 0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
+#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
+#define GL_FRAGMENT_SHADER 0x8B30
+#define GL_VERTEX_SHADER 0x8B31
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A
+#define GL_MAX_VARYING_FLOATS 0x8B4B
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
+#define GL_SHADER_TYPE 0x8B4F
+#define GL_FLOAT_VEC2 0x8B50
+#define GL_FLOAT_VEC3 0x8B51
+#define GL_FLOAT_VEC4 0x8B52
+#define GL_INT_VEC2 0x8B53
+#define GL_INT_VEC3 0x8B54
+#define GL_INT_VEC4 0x8B55
+#define GL_BOOL 0x8B56
+#define GL_BOOL_VEC2 0x8B57
+#define GL_BOOL_VEC3 0x8B58
+#define GL_BOOL_VEC4 0x8B59
+#define GL_FLOAT_MAT2 0x8B5A
+#define GL_FLOAT_MAT3 0x8B5B
+#define GL_FLOAT_MAT4 0x8B5C
+#define GL_SAMPLER_1D 0x8B5D
+#define GL_SAMPLER_2D 0x8B5E
+#define GL_SAMPLER_3D 0x8B5F
+#define GL_SAMPLER_CUBE 0x8B60
+#define GL_SAMPLER_1D_SHADOW 0x8B61
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#define GL_DELETE_STATUS 0x8B80
+#define GL_COMPILE_STATUS 0x8B81
+#define GL_LINK_STATUS 0x8B82
+#define GL_VALIDATE_STATUS 0x8B83
+#define GL_INFO_LOG_LENGTH 0x8B84
+#define GL_ATTACHED_SHADERS 0x8B85
+#define GL_ACTIVE_UNIFORMS 0x8B86
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
+#define GL_SHADER_SOURCE_LENGTH 0x8B88
+#define GL_ACTIVE_ATTRIBUTES 0x8B89
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
+#define GL_CURRENT_PROGRAM 0x8B8D
+#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0
+#define GL_LOWER_LEFT 0x8CA1
+#define GL_UPPER_LEFT 0x8CA2
+#define GL_STENCIL_BACK_REF 0x8CA3
+#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
+#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
+#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643
+#define GL_POINT_SPRITE 0x8861
+#define GL_COORD_REPLACE 0x8862
+#define GL_MAX_TEXTURE_COORDS 0x8871
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
+typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs);
+typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);
+typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
+typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
+typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
+typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
+typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
+typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
+typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
+typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
+typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader);
+typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);
+typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
+typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);
+typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs);
+GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader);
+GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
+GLAPI void APIENTRY glCompileShader (GLuint shader);
+GLAPI GLuint APIENTRY glCreateProgram (void);
+GLAPI GLuint APIENTRY glCreateShader (GLenum type);
+GLAPI void APIENTRY glDeleteProgram (GLuint program);
+GLAPI void APIENTRY glDeleteShader (GLuint shader);
+GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader);
+GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index);
+GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index);
+GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
+GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders);
+GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
+GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params);
+GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params);
+GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
+GLAPI GLboolean APIENTRY glIsProgram (GLuint program);
+GLAPI GLboolean APIENTRY glIsShader (GLuint shader);
+GLAPI void APIENTRY glLinkProgram (GLuint program);
+GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
+GLAPI void APIENTRY glUseProgram (GLuint program);
+GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0);
+GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1);
+GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GLAPI void APIENTRY glUniform1i (GLint location, GLint v0);
+GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1);
+GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2);
+GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glValidateProgram (GLuint program);
+GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x);
+GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x);
+GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x);
+GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y);
+GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y);
+GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+#endif
+#endif /* GL_VERSION_2_0 */
+
+#ifndef GL_VERSION_2_1
+#define GL_VERSION_2_1 1
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
+#define GL_FLOAT_MAT2x3 0x8B65
+#define GL_FLOAT_MAT2x4 0x8B66
+#define GL_FLOAT_MAT3x2 0x8B67
+#define GL_FLOAT_MAT3x4 0x8B68
+#define GL_FLOAT_MAT4x2 0x8B69
+#define GL_FLOAT_MAT4x3 0x8B6A
+#define GL_SRGB 0x8C40
+#define GL_SRGB8 0x8C41
+#define GL_SRGB_ALPHA 0x8C42
+#define GL_SRGB8_ALPHA8 0x8C43
+#define GL_COMPRESSED_SRGB 0x8C48
+#define GL_COMPRESSED_SRGB_ALPHA 0x8C49
+#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F
+#define GL_SLUMINANCE_ALPHA 0x8C44
+#define GL_SLUMINANCE8_ALPHA8 0x8C45
+#define GL_SLUMINANCE 0x8C46
+#define GL_SLUMINANCE8 0x8C47
+#define GL_COMPRESSED_SLUMINANCE 0x8C4A
+#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+#endif
+#endif /* GL_VERSION_2_1 */
+
+#ifndef GL_VERSION_3_0
+#define GL_VERSION_3_0 1
+typedef unsigned short GLhalf;
+#define GL_COMPARE_REF_TO_TEXTURE 0x884E
+#define GL_CLIP_DISTANCE0 0x3000
+#define GL_CLIP_DISTANCE1 0x3001
+#define GL_CLIP_DISTANCE2 0x3002
+#define GL_CLIP_DISTANCE3 0x3003
+#define GL_CLIP_DISTANCE4 0x3004
+#define GL_CLIP_DISTANCE5 0x3005
+#define GL_CLIP_DISTANCE6 0x3006
+#define GL_CLIP_DISTANCE7 0x3007
+#define GL_MAX_CLIP_DISTANCES 0x0D32
+#define GL_MAJOR_VERSION 0x821B
+#define GL_MINOR_VERSION 0x821C
+#define GL_NUM_EXTENSIONS 0x821D
+#define GL_CONTEXT_FLAGS 0x821E
+#define GL_COMPRESSED_RED 0x8225
+#define GL_COMPRESSED_RG 0x8226
+#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001
+#define GL_RGBA32F 0x8814
+#define GL_RGB32F 0x8815
+#define GL_RGBA16F 0x881A
+#define GL_RGB16F 0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905
+#define GL_CLAMP_READ_COLOR 0x891C
+#define GL_FIXED_ONLY 0x891D
+#define GL_MAX_VARYING_COMPONENTS 0x8B4B
+#define GL_TEXTURE_1D_ARRAY 0x8C18
+#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19
+#define GL_TEXTURE_2D_ARRAY 0x8C1A
+#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B
+#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C
+#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D
+#define GL_R11F_G11F_B10F 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
+#define GL_RGB9_E5 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
+#define GL_TEXTURE_SHARED_SIZE 0x8C3F
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_PRIMITIVES_GENERATED 0x8C87
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS 0x8C8C
+#define GL_SEPARATE_ATTRIBS 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI 0x8D70
+#define GL_RGB32UI 0x8D71
+#define GL_RGBA16UI 0x8D76
+#define GL_RGB16UI 0x8D77
+#define GL_RGBA8UI 0x8D7C
+#define GL_RGB8UI 0x8D7D
+#define GL_RGBA32I 0x8D82
+#define GL_RGB32I 0x8D83
+#define GL_RGBA16I 0x8D88
+#define GL_RGB16I 0x8D89
+#define GL_RGBA8I 0x8D8E
+#define GL_RGB8I 0x8D8F
+#define GL_RED_INTEGER 0x8D94
+#define GL_GREEN_INTEGER 0x8D95
+#define GL_BLUE_INTEGER 0x8D96
+#define GL_RGB_INTEGER 0x8D98
+#define GL_RGBA_INTEGER 0x8D99
+#define GL_BGR_INTEGER 0x8D9A
+#define GL_BGRA_INTEGER 0x8D9B
+#define GL_SAMPLER_1D_ARRAY 0x8DC0
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#define GL_UNSIGNED_INT_VEC2 0x8DC6
+#define GL_UNSIGNED_INT_VEC3 0x8DC7
+#define GL_UNSIGNED_INT_VEC4 0x8DC8
+#define GL_INT_SAMPLER_1D 0x8DC9
+#define GL_INT_SAMPLER_2D 0x8DCA
+#define GL_INT_SAMPLER_3D 0x8DCB
+#define GL_INT_SAMPLER_CUBE 0x8DCC
+#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE
+#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1
+#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7
+#define GL_QUERY_WAIT 0x8E13
+#define GL_QUERY_NO_WAIT 0x8E14
+#define GL_QUERY_BY_REGION_WAIT 0x8E15
+#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+#define GL_DEPTH_COMPONENT32F 0x8CAC
+#define GL_DEPTH32F_STENCIL8 0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT 0x8218
+#define GL_FRAMEBUFFER_UNDEFINED 0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_DEPTH_STENCIL 0x84F9
+#define GL_UNSIGNED_INT_24_8 0x84FA
+#define GL_DEPTH24_STENCIL8 0x88F0
+#define GL_TEXTURE_STENCIL_SIZE 0x88F1
+#define GL_TEXTURE_RED_TYPE 0x8C10
+#define GL_TEXTURE_GREEN_TYPE 0x8C11
+#define GL_TEXTURE_BLUE_TYPE 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE 0x8C13
+#define GL_TEXTURE_DEPTH_TYPE 0x8C16
+#define GL_UNSIGNED_NORMALIZED 0x8C17
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_READ_FRAMEBUFFER 0x8CA8
+#define GL_DRAW_FRAMEBUFFER 0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA
+#define GL_RENDERBUFFER_SAMPLES 0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES 0x8D57
+#define GL_INDEX 0x8222
+#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14
+#define GL_TEXTURE_INTENSITY_TYPE 0x8C15
+#define GL_FRAMEBUFFER_SRGB 0x8DB9
+#define GL_HALF_FLOAT 0x140B
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#define GL_COMPRESSED_RED_RGTC1 0x8DBB
+#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC
+#define GL_COMPRESSED_RG_RGTC2 0x8DBD
+#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_R16 0x822A
+#define GL_RG8 0x822B
+#define GL_RG16 0x822C
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#define GL_VERTEX_ARRAY_BINDING 0x85B5
+#define GL_CLAMP_VERTEX_COLOR 0x891A
+#define GL_CLAMP_FRAGMENT_COLOR 0x891B
+#define GL_ALPHA_INTEGER 0x8D97
+typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
+typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
+typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index);
+typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index);
+typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index);
+typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);
+typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void);
+typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp);
+typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode);
+typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params);
+typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);
+typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
+typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);
+typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);
+typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);
+typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
+typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
+typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data);
+GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data);
+GLAPI void APIENTRY glEnablei (GLenum target, GLuint index);
+GLAPI void APIENTRY glDisablei (GLenum target, GLuint index);
+GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index);
+GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode);
+GLAPI void APIENTRY glEndTransformFeedback (void);
+GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer);
+GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp);
+GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode);
+GLAPI void APIENTRY glEndConditionalRender (void);
+GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x);
+GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y);
+GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z);
+GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x);
+GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y);
+GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z);
+GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params);
+GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name);
+GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0);
+GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1);
+GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params);
+GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value);
+GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value);
+GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index);
+GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers);
+GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer);
+GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers);
+GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers);
+GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target);
+GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGenerateMipmap (GLenum target);
+GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length);
+GLAPI void APIENTRY glBindVertexArray (GLuint array);
+GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array);
+#endif
+#endif /* GL_VERSION_3_0 */
+
+#ifndef GL_VERSION_3_1
+#define GL_VERSION_3_1 1
+#define GL_SAMPLER_2D_RECT 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64
+#define GL_SAMPLER_BUFFER 0x8DC2
+#define GL_INT_SAMPLER_2D_RECT 0x8DCD
+#define GL_INT_SAMPLER_BUFFER 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8
+#define GL_TEXTURE_BUFFER 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_R16_SNORM 0x8F98
+#define GL_RG16_SNORM 0x8F99
+#define GL_RGB16_SNORM 0x8F9A
+#define GL_RGBA16_SNORM 0x8F9B
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART 0x8F9D
+#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFFu
+typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index);
+typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount);
+GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount);
+GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer);
+GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index);
+GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName);
+GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName);
+GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+#endif
+#endif /* GL_VERSION_3_1 */
+
+#ifndef GL_VERSION_3_2
+#define GL_VERSION_3_2 1
+typedef struct __GLsync *GLsync;
+#ifndef GLEXT_64_TYPES_DEFINED
+/* This code block is duplicated in glxext.h, so must be protected */
+#define GLEXT_64_TYPES_DEFINED
+/* Define int32_t, int64_t, and uint64_t types for UST/MSC */
+/* (as used in the GL_EXT_timer_query extension). */
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+#elif defined(__sun__) || defined(__digital__)
+#include <inttypes.h>
+#if defined(__STDC__)
+#if defined(__arch64__) || defined(_LP64)
+typedef long int int64_t;
+typedef unsigned long int uint64_t;
+#else
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#endif /* __arch64__ */
+#endif /* __STDC__ */
+#elif defined( __VMS ) || defined(__sgi)
+#include <inttypes.h>
+#elif defined(__SCO__) || defined(__USLC__)
+#include <stdint.h>
+#elif defined(__UNIXOS2__) || defined(__SOL64__)
+typedef long int int32_t;
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#elif defined(_WIN32) && defined(__GNUC__)
+#include <stdint.h>
+#elif defined(_WIN32)
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+/* Fallback if nothing above works */
+#include <inttypes.h>
+#endif
+#endif
+typedef uint64_t GLuint64;
+typedef int64_t GLint64;
+#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define GL_LINES_ADJACENCY 0x000A
+#define GL_LINE_STRIP_ADJACENCY 0x000B
+#define GL_TRIANGLES_ADJACENCY 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D
+#define GL_PROGRAM_POINT_SIZE 0x8642
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_GEOMETRY_SHADER 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT 0x8916
+#define GL_GEOMETRY_INPUT_TYPE 0x8917
+#define GL_GEOMETRY_OUTPUT_TYPE 0x8918
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_CONTEXT_PROFILE_MASK 0x9126
+#define GL_DEPTH_CLAMP 0x864F
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_PROVOKING_VERTEX 0x8E4F
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex);
+typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
+typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
+typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync);
+typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync);
+typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data);
+typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
+typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex);
+GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex);
+GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex);
+GLAPI void APIENTRY glProvokingVertex (GLenum mode);
+GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GLAPI GLboolean APIENTRY glIsSync (GLsync sync);
+GLAPI void APIENTRY glDeleteSync (GLsync sync);
+GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data);
+GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data);
+GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params);
+GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level);
+GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val);
+GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask);
+#endif
+#endif /* GL_VERSION_3_2 */
+
+#ifndef GL_VERSION_3_3
+#define GL_VERSION_3_3 1
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_SRC1_COLOR 0x88F9
+#define GL_ONE_MINUS_SRC1_COLOR 0x88FA
+#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB
+#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_SAMPLER_BINDING 0x8919
+#define GL_RGB10_A2UI 0x906F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
+#define GL_TIME_ELAPSED 0x88BF
+#define GL_TIMESTAMP 0x8E28
+#define GL_INT_2_10_10_10_REV 0x8D9F
+typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers);
+typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers);
+typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param);
+typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value);
+typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value);
+typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value);
+typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords);
+typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords);
+typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color);
+typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color);
+typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
+GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers);
+GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers);
+GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler);
+GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler);
+GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param);
+GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param);
+GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param);
+GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param);
+GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param);
+GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target);
+GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params);
+GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params);
+GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor);
+GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value);
+GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value);
+GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value);
+GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value);
+GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value);
+GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value);
+GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value);
+GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords);
+GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords);
+GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords);
+GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color);
+GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color);
+GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color);
+GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color);
+GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color);
+GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color);
+#endif
+#endif /* GL_VERSION_3_3 */
+
+#ifndef GL_VERSION_4_0
+#define GL_VERSION_4_0 1
+#define GL_SAMPLE_SHADING 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_MAX_VERTEX_STREAMS 0x8E71
+#define GL_DOUBLE_VEC2 0x8FFC
+#define GL_DOUBLE_VEC3 0x8FFD
+#define GL_DOUBLE_VEC4 0x8FFE
+#define GL_DOUBLE_MAT2 0x8F46
+#define GL_DOUBLE_MAT3 0x8F47
+#define GL_DOUBLE_MAT4 0x8F48
+#define GL_DOUBLE_MAT2x3 0x8F49
+#define GL_DOUBLE_MAT2x4 0x8F4A
+#define GL_DOUBLE_MAT3x2 0x8F4B
+#define GL_DOUBLE_MAT3x4 0x8F4C
+#define GL_DOUBLE_MAT4x2 0x8F4D
+#define GL_DOUBLE_MAT4x3 0x8F4E
+#define GL_ACTIVE_SUBROUTINES 0x8DE5
+#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47
+#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49
+#define GL_MAX_SUBROUTINES 0x8DE7
+#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8
+#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A
+#define GL_COMPATIBLE_SUBROUTINES 0x8E4B
+#define GL_PATCHES 0x000E
+#define GL_PATCH_VERTICES 0x8E72
+#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
+#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
+#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75
+#define GL_TESS_GEN_MODE 0x8E76
+#define GL_TESS_GEN_SPACING 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER 0x8E78
+#define GL_TESS_GEN_POINT_MODE 0x8E79
+#define GL_ISOLINES 0x8E7A
+#define GL_FRACTIONAL_ODD 0x8E7B
+#define GL_FRACTIONAL_EVEN 0x8E7C
+#define GL_MAX_PATCH_VERTICES 0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL 0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70
+typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect);
+typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x);
+typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params);
+typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name);
+typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices);
+typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);
+typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values);
+typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids);
+typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id);
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream);
+typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id);
+typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index);
+typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMinSampleShading (GLfloat value);
+GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode);
+GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst);
+GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);
+GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);
+GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x);
+GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params);
+GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name);
+GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name);
+GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values);
+GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name);
+GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices);
+GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params);
+GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values);
+GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value);
+GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values);
+GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id);
+GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids);
+GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids);
+GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id);
+GLAPI void APIENTRY glPauseTransformFeedback (void);
+GLAPI void APIENTRY glResumeTransformFeedback (void);
+GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id);
+GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream);
+GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id);
+GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index);
+GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params);
+#endif
+#endif /* GL_VERSION_4_0 */
+
+#ifndef GL_VERSION_4_1
+#define GL_VERSION_4_1 1
+#define GL_FIXED 0x140C
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+#define GL_RGB565 0x8D62
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_MAX_VIEWPORTS 0x825B
+#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C
+#define GL_VIEWPORT_BOUNDS_RANGE 0x825D
+#define GL_LAYER_PROVOKING_VERTEX 0x825E
+#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F
+#define GL_UNDEFINED_VERTEX 0x8260
+typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f);
+typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d);
+typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings);
+typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);
+typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params);
+typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v);
+typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f);
+typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data);
+typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glReleaseShaderCompiler (void);
+GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length);
+GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f);
+GLAPI void APIENTRY glClearDepthf (GLfloat d);
+GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
+GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);
+GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline);
+GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline);
+GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0);
+GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1);
+GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2);
+GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3);
+GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value);
+GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline);
+GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x);
+GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params);
+GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v);
+GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v);
+GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v);
+GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f);
+GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data);
+GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data);
+#endif
+#endif /* GL_VERSION_4_1 */
+
+#ifndef GL_VERSION_4_2
+#define GL_VERSION_4_2 1
+#define GL_COPY_READ_BUFFER_BINDING 0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37
+#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23
+#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127
+#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128
+#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129
+#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A
+#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B
+#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C
+#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D
+#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E
+#define GL_NUM_SAMPLE_COUNTS 0x9380
+#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1
+#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2
+#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3
+#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5
+#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB
+#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0
+#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1
+#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2
+#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3
+#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4
+#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5
+#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6
+#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8
+#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC
+#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9
+#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+#define GL_MAX_IMAGE_UNITS 0x8F38
+#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39
+#define GL_IMAGE_BINDING_NAME 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED 0x8F3C
+#define GL_IMAGE_BINDING_LAYER 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS 0x8F3E
+#define GL_IMAGE_1D 0x904C
+#define GL_IMAGE_2D 0x904D
+#define GL_IMAGE_3D 0x904E
+#define GL_IMAGE_2D_RECT 0x904F
+#define GL_IMAGE_CUBE 0x9050
+#define GL_IMAGE_BUFFER 0x9051
+#define GL_IMAGE_1D_ARRAY 0x9052
+#define GL_IMAGE_2D_ARRAY 0x9053
+#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054
+#define GL_IMAGE_2D_MULTISAMPLE 0x9055
+#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056
+#define GL_INT_IMAGE_1D 0x9057
+#define GL_INT_IMAGE_2D 0x9058
+#define GL_INT_IMAGE_3D 0x9059
+#define GL_INT_IMAGE_2D_RECT 0x905A
+#define GL_INT_IMAGE_CUBE 0x905B
+#define GL_INT_IMAGE_BUFFER 0x905C
+#define GL_INT_IMAGE_1D_ARRAY 0x905D
+#define GL_INT_IMAGE_2D_ARRAY 0x905E
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F
+#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060
+#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061
+#define GL_UNSIGNED_INT_IMAGE_1D 0x9062
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D 0x9064
+#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065
+#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
+#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067
+#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C
+#define GL_MAX_IMAGE_SAMPLES 0x906D
+#define GL_IMAGE_BINDING_FORMAT 0x906E
+#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8
+#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9
+#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA
+#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB
+#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC
+#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD
+#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE
+#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF
+#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F
+#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F
+typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers);
+typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount);
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance);
+GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance);
+GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance);
+GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params);
+GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers);
+GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount);
+GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount);
+#endif
+#endif /* GL_VERSION_4_2 */
+
+#ifndef GL_VERSION_4_3
+#define GL_VERSION_4_3 1
+typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9
+#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_COMPRESSED_R11_EAC 0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_MAX_ELEMENT_INDEX 0x8D6B
+#define GL_COMPUTE_SHADER 0x91B9
+#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB
+#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC
+#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD
+#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262
+#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263
+#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264
+#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265
+#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266
+#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB
+#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE
+#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF
+#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC
+#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED
+#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
+#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF
+#define GL_COMPUTE_SHADER_BIT 0x00000020
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
+#define GL_DEBUG_SOURCE_API 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES 0x9145
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
+#define GL_DEBUG_TYPE_POP_GROUP 0x826A
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
+#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
+#define GL_BUFFER 0x82E0
+#define GL_SHADER 0x82E1
+#define GL_PROGRAM 0x82E2
+#define GL_QUERY 0x82E3
+#define GL_PROGRAM_PIPELINE 0x82E4
+#define GL_SAMPLER 0x82E6
+#define GL_MAX_LABEL_LENGTH 0x82E8
+#define GL_DEBUG_OUTPUT 0x92E0
+#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
+#define GL_MAX_UNIFORM_LOCATIONS 0x826E
+#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310
+#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311
+#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312
+#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313
+#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314
+#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315
+#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316
+#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317
+#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318
+#define GL_INTERNALFORMAT_SUPPORTED 0x826F
+#define GL_INTERNALFORMAT_PREFERRED 0x8270
+#define GL_INTERNALFORMAT_RED_SIZE 0x8271
+#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272
+#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273
+#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274
+#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275
+#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276
+#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277
+#define GL_INTERNALFORMAT_RED_TYPE 0x8278
+#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279
+#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A
+#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B
+#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C
+#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D
+#define GL_MAX_WIDTH 0x827E
+#define GL_MAX_HEIGHT 0x827F
+#define GL_MAX_DEPTH 0x8280
+#define GL_MAX_LAYERS 0x8281
+#define GL_MAX_COMBINED_DIMENSIONS 0x8282
+#define GL_COLOR_COMPONENTS 0x8283
+#define GL_DEPTH_COMPONENTS 0x8284
+#define GL_STENCIL_COMPONENTS 0x8285
+#define GL_COLOR_RENDERABLE 0x8286
+#define GL_DEPTH_RENDERABLE 0x8287
+#define GL_STENCIL_RENDERABLE 0x8288
+#define GL_FRAMEBUFFER_RENDERABLE 0x8289
+#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A
+#define GL_FRAMEBUFFER_BLEND 0x828B
+#define GL_READ_PIXELS 0x828C
+#define GL_READ_PIXELS_FORMAT 0x828D
+#define GL_READ_PIXELS_TYPE 0x828E
+#define GL_TEXTURE_IMAGE_FORMAT 0x828F
+#define GL_TEXTURE_IMAGE_TYPE 0x8290
+#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291
+#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292
+#define GL_MIPMAP 0x8293
+#define GL_MANUAL_GENERATE_MIPMAP 0x8294
+#define GL_AUTO_GENERATE_MIPMAP 0x8295
+#define GL_COLOR_ENCODING 0x8296
+#define GL_SRGB_READ 0x8297
+#define GL_SRGB_WRITE 0x8298
+#define GL_FILTER 0x829A
+#define GL_VERTEX_TEXTURE 0x829B
+#define GL_TESS_CONTROL_TEXTURE 0x829C
+#define GL_TESS_EVALUATION_TEXTURE 0x829D
+#define GL_GEOMETRY_TEXTURE 0x829E
+#define GL_FRAGMENT_TEXTURE 0x829F
+#define GL_COMPUTE_TEXTURE 0x82A0
+#define GL_TEXTURE_SHADOW 0x82A1
+#define GL_TEXTURE_GATHER 0x82A2
+#define GL_TEXTURE_GATHER_SHADOW 0x82A3
+#define GL_SHADER_IMAGE_LOAD 0x82A4
+#define GL_SHADER_IMAGE_STORE 0x82A5
+#define GL_SHADER_IMAGE_ATOMIC 0x82A6
+#define GL_IMAGE_TEXEL_SIZE 0x82A7
+#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8
+#define GL_IMAGE_PIXEL_FORMAT 0x82A9
+#define GL_IMAGE_PIXEL_TYPE 0x82AA
+#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC
+#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD
+#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE
+#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF
+#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1
+#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2
+#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3
+#define GL_CLEAR_BUFFER 0x82B4
+#define GL_TEXTURE_VIEW 0x82B5
+#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6
+#define GL_FULL_SUPPORT 0x82B7
+#define GL_CAVEAT_SUPPORT 0x82B8
+#define GL_IMAGE_CLASS_4_X_32 0x82B9
+#define GL_IMAGE_CLASS_2_X_32 0x82BA
+#define GL_IMAGE_CLASS_1_X_32 0x82BB
+#define GL_IMAGE_CLASS_4_X_16 0x82BC
+#define GL_IMAGE_CLASS_2_X_16 0x82BD
+#define GL_IMAGE_CLASS_1_X_16 0x82BE
+#define GL_IMAGE_CLASS_4_X_8 0x82BF
+#define GL_IMAGE_CLASS_2_X_8 0x82C0
+#define GL_IMAGE_CLASS_1_X_8 0x82C1
+#define GL_IMAGE_CLASS_11_11_10 0x82C2
+#define GL_IMAGE_CLASS_10_10_10_2 0x82C3
+#define GL_VIEW_CLASS_128_BITS 0x82C4
+#define GL_VIEW_CLASS_96_BITS 0x82C5
+#define GL_VIEW_CLASS_64_BITS 0x82C6
+#define GL_VIEW_CLASS_48_BITS 0x82C7
+#define GL_VIEW_CLASS_32_BITS 0x82C8
+#define GL_VIEW_CLASS_24_BITS 0x82C9
+#define GL_VIEW_CLASS_16_BITS 0x82CA
+#define GL_VIEW_CLASS_8_BITS 0x82CB
+#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC
+#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD
+#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE
+#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF
+#define GL_VIEW_CLASS_RGTC1_RED 0x82D0
+#define GL_VIEW_CLASS_RGTC2_RG 0x82D1
+#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2
+#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3
+#define GL_UNIFORM 0x92E1
+#define GL_UNIFORM_BLOCK 0x92E2
+#define GL_PROGRAM_INPUT 0x92E3
+#define GL_PROGRAM_OUTPUT 0x92E4
+#define GL_BUFFER_VARIABLE 0x92E5
+#define GL_SHADER_STORAGE_BLOCK 0x92E6
+#define GL_VERTEX_SUBROUTINE 0x92E8
+#define GL_TESS_CONTROL_SUBROUTINE 0x92E9
+#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA
+#define GL_GEOMETRY_SUBROUTINE 0x92EB
+#define GL_FRAGMENT_SUBROUTINE 0x92EC
+#define GL_COMPUTE_SUBROUTINE 0x92ED
+#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE
+#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF
+#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0
+#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1
+#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2
+#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3
+#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4
+#define GL_ACTIVE_RESOURCES 0x92F5
+#define GL_MAX_NAME_LENGTH 0x92F6
+#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7
+#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8
+#define GL_NAME_LENGTH 0x92F9
+#define GL_TYPE 0x92FA
+#define GL_ARRAY_SIZE 0x92FB
+#define GL_OFFSET 0x92FC
+#define GL_BLOCK_INDEX 0x92FD
+#define GL_ARRAY_STRIDE 0x92FE
+#define GL_MATRIX_STRIDE 0x92FF
+#define GL_IS_ROW_MAJOR 0x9300
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
+#define GL_BUFFER_BINDING 0x9302
+#define GL_BUFFER_DATA_SIZE 0x9303
+#define GL_NUM_ACTIVE_VARIABLES 0x9304
+#define GL_ACTIVE_VARIABLES 0x9305
+#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306
+#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307
+#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308
+#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309
+#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A
+#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B
+#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C
+#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D
+#define GL_LOCATION 0x930E
+#define GL_LOCATION_INDEX 0x930F
+#define GL_IS_PER_PATCH 0x92E7
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3
+#define GL_SHADER_STORAGE_BUFFER_START 0x90D4
+#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5
+#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6
+#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7
+#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8
+#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9
+#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA
+#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB
+#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC
+#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD
+#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE
+#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF
+#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
+#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39
+#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA
+#define GL_TEXTURE_BUFFER_OFFSET 0x919D
+#define GL_TEXTURE_BUFFER_SIZE 0x919E
+#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F
+#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB
+#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC
+#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD
+#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE
+#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF
+#define GL_VERTEX_ATTRIB_BINDING 0x82D4
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
+#define GL_VERTEX_BINDING_DIVISOR 0x82D6
+#define GL_VERTEX_BINDING_OFFSET 0x82D7
+#define GL_VERTEX_BINDING_STRIDE 0x82D8
+#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9
+#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA
+#define GL_VERTEX_BINDING_BUFFER 0x8F4F
+#define GL_DISPLAY_LIST 0x82E7
+typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);
+typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name);
+typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);
+typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);
+typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void);
+typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label);
+typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+GLAPI void APIENTRY glCopyImageSubData (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);
+GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param);
+GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params);
+GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth);
+GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level);
+GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length);
+GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer);
+GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
+GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride);
+GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding);
+GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers);
+GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
+GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
+GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam);
+GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message);
+GLAPI void APIENTRY glPopDebugGroup (void);
+GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
+GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
+GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label);
+GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
+#endif
+#endif /* GL_VERSION_4_3 */
+
+#ifndef GL_VERSION_4_4
+#define GL_VERSION_4_4 1
+#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5
+#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221
+#define GL_TEXTURE_BUFFER_BINDING 0x8C2A
+#define GL_MAP_PERSISTENT_BIT 0x0040
+#define GL_MAP_COHERENT_BIT 0x0080
+#define GL_DYNAMIC_STORAGE_BIT 0x0100
+#define GL_CLIENT_STORAGE_BIT 0x0200
+#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000
+#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F
+#define GL_BUFFER_STORAGE_FLAGS 0x8220
+#define GL_CLEAR_TEXTURE 0x9365
+#define GL_LOCATION_COMPONENT 0x934A
+#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B
+#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C
+#define GL_QUERY_BUFFER 0x9192
+#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000
+#define GL_QUERY_BUFFER_BINDING 0x9193
+#define GL_QUERY_RESULT_NO_WAIT 0x9194
+#define GL_MIRROR_CLAMP_TO_EDGE 0x8743
+typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
+typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
+typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures);
+typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers);
+typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures);
+typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
+GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers);
+GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes);
+GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures);
+GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers);
+GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures);
+GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+#endif
+#endif /* GL_VERSION_4_4 */
+
+#ifndef GL_VERSION_4_5
+#define GL_VERSION_4_5 1
+#define GL_CONTEXT_LOST 0x0507
+#define GL_NEGATIVE_ONE_TO_ONE 0x935E
+#define GL_ZERO_TO_ONE 0x935F
+#define GL_CLIP_ORIGIN 0x935C
+#define GL_CLIP_DEPTH_MODE 0x935D
+#define GL_QUERY_WAIT_INVERTED 0x8E17
+#define GL_QUERY_NO_WAIT_INVERTED 0x8E18
+#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19
+#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A
+#define GL_MAX_CULL_DISTANCES 0x82F9
+#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA
+#define GL_TEXTURE_TARGET 0x1006
+#define GL_QUERY_TARGET 0x82EA
+#define GL_TEXTURE_BINDING 0x82EB
+#define GL_GUILTY_CONTEXT_RESET 0x8253
+#define GL_INNOCENT_CONTEXT_RESET 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET 0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY 0x8256
+#define GL_LOSE_CONTEXT_ON_RESET 0x8252
+#define GL_NO_RESET_NOTIFICATION 0x8261
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004
+#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB
+#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC
+typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth);
+typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size);
+typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param);
+typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param);
+typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
+typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers);
+typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizei size, const void *data, GLbitfield flags);
+typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizei size, const void *data, GLenum usage);
+typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, const void *data);
+typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size);
+typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data);
+typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access);
+typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access);
+typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length);
+typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params);
+typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, void *data);
+typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs);
+typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src);
+typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments);
+typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value);
+typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value);
+typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value);
+typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil);
+typedef void (APIENTRYP 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);
+typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target);
+typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param);
+typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures);
+typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer);
+typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param);
+typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params);
+typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param);
+typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture);
+typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture);
+typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels);
+typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
+typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index);
+typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index);
+typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer);
+typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);
+typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);
+typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param);
+typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param);
+typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param);
+typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers);
+typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines);
+typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids);
+typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels);
+typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void);
+typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels);
+typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
+typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
+typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v);
+typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values);
+typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values);
+typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values);
+typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern);
+typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
+typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
+typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);
+typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth);
+GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids);
+GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer);
+GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size);
+GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param);
+GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param);
+GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
+GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers);
+GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizei size, const void *data, GLbitfield flags);
+GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizei size, const void *data, GLenum usage);
+GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, const void *data);
+GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size);
+GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data);
+GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access);
+GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access);
+GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer);
+GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length);
+GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params);
+GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params);
+GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, void *data);
+GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers);
+GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param);
+GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);
+GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf);
+GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs);
+GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src);
+GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments);
+GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value);
+GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value);
+GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value);
+GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil);
+GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target);
+GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param);
+GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params);
+GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers);
+GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params);
+GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures);
+GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer);
+GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size);
+GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);
+GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param);
+GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param);
+GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params);
+GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param);
+GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture);
+GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture);
+GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels);
+GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params);
+GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays);
+GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index);
+GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index);
+GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer);
+GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);
+GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides);
+GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex);
+GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
+GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor);
+GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param);
+GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param);
+GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param);
+GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers);
+GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines);
+GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids);
+GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers);
+GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels);
+GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void);
+GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels);
+GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);
+GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
+GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
+GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v);
+GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values);
+GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values);
+GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values);
+GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern);
+GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
+GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
+GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);
+GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+GLAPI void APIENTRY glTextureBarrier (void);
+#endif
+#endif /* GL_VERSION_4_5 */
+
+#ifndef GL_ARB_ES2_compatibility
+#define GL_ARB_ES2_compatibility 1
+#endif /* GL_ARB_ES2_compatibility */
+
+#ifndef GL_ARB_ES3_1_compatibility
+#define GL_ARB_ES3_1_compatibility 1
+#endif /* GL_ARB_ES3_1_compatibility */
+
+#ifndef GL_ARB_ES3_compatibility
+#define GL_ARB_ES3_compatibility 1
+#endif /* GL_ARB_ES3_compatibility */
+
+#ifndef GL_ARB_arrays_of_arrays
+#define GL_ARB_arrays_of_arrays 1
+#endif /* GL_ARB_arrays_of_arrays */
+
+#ifndef GL_ARB_base_instance
+#define GL_ARB_base_instance 1
+#endif /* GL_ARB_base_instance */
+
+#ifndef GL_ARB_bindless_texture
+#define GL_ARB_bindless_texture 1
+typedef uint64_t GLuint64EXT;
+#define GL_UNSIGNED_INT64_ARB 0x140F
+typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture);
+typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler);
+typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle);
+typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle);
+typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access);
+typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle);
+typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value);
+typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle);
+typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture);
+GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler);
+GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle);
+GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle);
+GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access);
+GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle);
+GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value);
+GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value);
+GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value);
+GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle);
+GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle);
+GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x);
+GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v);
+GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params);
+#endif
+#endif /* GL_ARB_bindless_texture */
+
+#ifndef GL_ARB_blend_func_extended
+#define GL_ARB_blend_func_extended 1
+#endif /* GL_ARB_blend_func_extended */
+
+#ifndef GL_ARB_buffer_storage
+#define GL_ARB_buffer_storage 1
+#endif /* GL_ARB_buffer_storage */
+
+#ifndef GL_ARB_cl_event
+#define GL_ARB_cl_event 1
+struct _cl_context;
+struct _cl_event;
+#define GL_SYNC_CL_EVENT_ARB 0x8240
+#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241
+typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags);
+#endif
+#endif /* GL_ARB_cl_event */
+
+#ifndef GL_ARB_clear_buffer_object
+#define GL_ARB_clear_buffer_object 1
+#endif /* GL_ARB_clear_buffer_object */
+
+#ifndef GL_ARB_clear_texture
+#define GL_ARB_clear_texture 1
+#endif /* GL_ARB_clear_texture */
+
+#ifndef GL_ARB_clip_control
+#define GL_ARB_clip_control 1
+#endif /* GL_ARB_clip_control */
+
+#ifndef GL_ARB_color_buffer_float
+#define GL_ARB_color_buffer_float 1
+#define GL_RGBA_FLOAT_MODE_ARB 0x8820
+#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A
+#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B
+#define GL_CLAMP_READ_COLOR_ARB 0x891C
+#define GL_FIXED_ONLY_ARB 0x891D
+typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp);
+#endif
+#endif /* GL_ARB_color_buffer_float */
+
+#ifndef GL_ARB_compatibility
+#define GL_ARB_compatibility 1
+#endif /* GL_ARB_compatibility */
+
+#ifndef GL_ARB_compressed_texture_pixel_storage
+#define GL_ARB_compressed_texture_pixel_storage 1
+#endif /* GL_ARB_compressed_texture_pixel_storage */
+
+#ifndef GL_ARB_compute_shader
+#define GL_ARB_compute_shader 1
+#endif /* GL_ARB_compute_shader */
+
+#ifndef GL_ARB_compute_variable_group_size
+#define GL_ARB_compute_variable_group_size 1
+#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344
+#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB
+#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345
+#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF
+typedef void (APIENTRYP 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);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z);
+#endif
+#endif /* GL_ARB_compute_variable_group_size */
+
+#ifndef GL_ARB_conditional_render_inverted
+#define GL_ARB_conditional_render_inverted 1
+#endif /* GL_ARB_conditional_render_inverted */
+
+#ifndef GL_ARB_conservative_depth
+#define GL_ARB_conservative_depth 1
+#endif /* GL_ARB_conservative_depth */
+
+#ifndef GL_ARB_copy_buffer
+#define GL_ARB_copy_buffer 1
+#endif /* GL_ARB_copy_buffer */
+
+#ifndef GL_ARB_copy_image
+#define GL_ARB_copy_image 1
+#endif /* GL_ARB_copy_image */
+
+#ifndef GL_ARB_cull_distance
+#define GL_ARB_cull_distance 1
+#endif /* GL_ARB_cull_distance */
+
+#ifndef GL_ARB_debug_output
+#define GL_ARB_debug_output 1
+typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245
+#define GL_DEBUG_SOURCE_API_ARB 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A
+#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B
+#define GL_DEBUG_TYPE_ERROR_ARB 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250
+#define GL_DEBUG_TYPE_OTHER_ARB 0x8251
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147
+#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam);
+typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
+GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam);
+GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
+#endif
+#endif /* GL_ARB_debug_output */
+
+#ifndef GL_ARB_depth_buffer_float
+#define GL_ARB_depth_buffer_float 1
+#endif /* GL_ARB_depth_buffer_float */
+
+#ifndef GL_ARB_depth_clamp
+#define GL_ARB_depth_clamp 1
+#endif /* GL_ARB_depth_clamp */
+
+#ifndef GL_ARB_depth_texture
+#define GL_ARB_depth_texture 1
+#define GL_DEPTH_COMPONENT16_ARB 0x81A5
+#define GL_DEPTH_COMPONENT24_ARB 0x81A6
+#define GL_DEPTH_COMPONENT32_ARB 0x81A7
+#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A
+#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B
+#endif /* GL_ARB_depth_texture */
+
+#ifndef GL_ARB_derivative_control
+#define GL_ARB_derivative_control 1
+#endif /* GL_ARB_derivative_control */
+
+#ifndef GL_ARB_direct_state_access
+#define GL_ARB_direct_state_access 1
+#endif /* GL_ARB_direct_state_access */
+
+#ifndef GL_ARB_draw_buffers
+#define GL_ARB_draw_buffers 1
+#define GL_MAX_DRAW_BUFFERS_ARB 0x8824
+#define GL_DRAW_BUFFER0_ARB 0x8825
+#define GL_DRAW_BUFFER1_ARB 0x8826
+#define GL_DRAW_BUFFER2_ARB 0x8827
+#define GL_DRAW_BUFFER3_ARB 0x8828
+#define GL_DRAW_BUFFER4_ARB 0x8829
+#define GL_DRAW_BUFFER5_ARB 0x882A
+#define GL_DRAW_BUFFER6_ARB 0x882B
+#define GL_DRAW_BUFFER7_ARB 0x882C
+#define GL_DRAW_BUFFER8_ARB 0x882D
+#define GL_DRAW_BUFFER9_ARB 0x882E
+#define GL_DRAW_BUFFER10_ARB 0x882F
+#define GL_DRAW_BUFFER11_ARB 0x8830
+#define GL_DRAW_BUFFER12_ARB 0x8831
+#define GL_DRAW_BUFFER13_ARB 0x8832
+#define GL_DRAW_BUFFER14_ARB 0x8833
+#define GL_DRAW_BUFFER15_ARB 0x8834
+typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs);
+#endif
+#endif /* GL_ARB_draw_buffers */
+
+#ifndef GL_ARB_draw_buffers_blend
+#define GL_ARB_draw_buffers_blend 1
+typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode);
+GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst);
+GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+#endif
+#endif /* GL_ARB_draw_buffers_blend */
+
+#ifndef GL_ARB_draw_elements_base_vertex
+#define GL_ARB_draw_elements_base_vertex 1
+#endif /* GL_ARB_draw_elements_base_vertex */
+
+#ifndef GL_ARB_draw_indirect
+#define GL_ARB_draw_indirect 1
+#endif /* GL_ARB_draw_indirect */
+
+#ifndef GL_ARB_draw_instanced
+#define GL_ARB_draw_instanced 1
+typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#endif
+#endif /* GL_ARB_draw_instanced */
+
+#ifndef GL_ARB_enhanced_layouts
+#define GL_ARB_enhanced_layouts 1
+#endif /* GL_ARB_enhanced_layouts */
+
+#ifndef GL_ARB_explicit_attrib_location
+#define GL_ARB_explicit_attrib_location 1
+#endif /* GL_ARB_explicit_attrib_location */
+
+#ifndef GL_ARB_explicit_uniform_location
+#define GL_ARB_explicit_uniform_location 1
+#endif /* GL_ARB_explicit_uniform_location */
+
+#ifndef GL_ARB_fragment_coord_conventions
+#define GL_ARB_fragment_coord_conventions 1
+#endif /* GL_ARB_fragment_coord_conventions */
+
+#ifndef GL_ARB_fragment_layer_viewport
+#define GL_ARB_fragment_layer_viewport 1
+#endif /* GL_ARB_fragment_layer_viewport */
+
+#ifndef GL_ARB_fragment_program
+#define GL_ARB_fragment_program 1
+#define GL_FRAGMENT_PROGRAM_ARB 0x8804
+#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875
+#define GL_PROGRAM_LENGTH_ARB 0x8627
+#define GL_PROGRAM_FORMAT_ARB 0x8876
+#define GL_PROGRAM_BINDING_ARB 0x8677
+#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3
+#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7
+#define GL_PROGRAM_PARAMETERS_ARB 0x88A8
+#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB
+#define GL_PROGRAM_ATTRIBS_ARB 0x88AC
+#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810
+#define GL_PROGRAM_STRING_ARB 0x8628
+#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B
+#define GL_CURRENT_MATRIX_ARB 0x8641
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640
+#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E
+#define GL_MAX_TEXTURE_COORDS_ARB 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872
+#define GL_PROGRAM_ERROR_STRING_ARB 0x8874
+#define GL_MATRIX0_ARB 0x88C0
+#define GL_MATRIX1_ARB 0x88C1
+#define GL_MATRIX2_ARB 0x88C2
+#define GL_MATRIX3_ARB 0x88C3
+#define GL_MATRIX4_ARB 0x88C4
+#define GL_MATRIX5_ARB 0x88C5
+#define GL_MATRIX6_ARB 0x88C6
+#define GL_MATRIX7_ARB 0x88C7
+#define GL_MATRIX8_ARB 0x88C8
+#define GL_MATRIX9_ARB 0x88C9
+#define GL_MATRIX10_ARB 0x88CA
+#define GL_MATRIX11_ARB 0x88CB
+#define GL_MATRIX12_ARB 0x88CC
+#define GL_MATRIX13_ARB 0x88CD
+#define GL_MATRIX14_ARB 0x88CE
+#define GL_MATRIX15_ARB 0x88CF
+#define GL_MATRIX16_ARB 0x88D0
+#define GL_MATRIX17_ARB 0x88D1
+#define GL_MATRIX18_ARB 0x88D2
+#define GL_MATRIX19_ARB 0x88D3
+#define GL_MATRIX20_ARB 0x88D4
+#define GL_MATRIX21_ARB 0x88D5
+#define GL_MATRIX22_ARB 0x88D6
+#define GL_MATRIX23_ARB 0x88D7
+#define GL_MATRIX24_ARB 0x88D8
+#define GL_MATRIX25_ARB 0x88D9
+#define GL_MATRIX26_ARB 0x88DA
+#define GL_MATRIX27_ARB 0x88DB
+#define GL_MATRIX28_ARB 0x88DC
+#define GL_MATRIX29_ARB 0x88DD
+#define GL_MATRIX30_ARB 0x88DE
+#define GL_MATRIX31_ARB 0x88DF
+typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string);
+typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);
+typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs);
+typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string);
+typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string);
+GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program);
+GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs);
+GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs);
+GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params);
+GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params);
+GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params);
+GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params);
+GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params);
+GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params);
+GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params);
+GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params);
+GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string);
+GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program);
+#endif
+#endif /* GL_ARB_fragment_program */
+
+#ifndef GL_ARB_fragment_program_shadow
+#define GL_ARB_fragment_program_shadow 1
+#endif /* GL_ARB_fragment_program_shadow */
+
+#ifndef GL_ARB_fragment_shader
+#define GL_ARB_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ARB 0x8B30
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B
+#endif /* GL_ARB_fragment_shader */
+
+#ifndef GL_ARB_framebuffer_no_attachments
+#define GL_ARB_framebuffer_no_attachments 1
+#endif /* GL_ARB_framebuffer_no_attachments */
+
+#ifndef GL_ARB_framebuffer_object
+#define GL_ARB_framebuffer_object 1
+#endif /* GL_ARB_framebuffer_object */
+
+#ifndef GL_ARB_framebuffer_sRGB
+#define GL_ARB_framebuffer_sRGB 1
+#endif /* GL_ARB_framebuffer_sRGB */
+
+#ifndef GL_ARB_geometry_shader4
+#define GL_ARB_geometry_shader4 1
+#define GL_LINES_ADJACENCY_ARB 0x000A
+#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B
+#define GL_TRIANGLES_ADJACENCY_ARB 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D
+#define GL_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9
+#define GL_GEOMETRY_SHADER_ARB 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA
+#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value);
+GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+#endif
+#endif /* GL_ARB_geometry_shader4 */
+
+#ifndef GL_ARB_get_program_binary
+#define GL_ARB_get_program_binary 1
+#endif /* GL_ARB_get_program_binary */
+
+#ifndef GL_ARB_get_texture_sub_image
+#define GL_ARB_get_texture_sub_image 1
+#endif /* GL_ARB_get_texture_sub_image */
+
+#ifndef GL_ARB_gpu_shader5
+#define GL_ARB_gpu_shader5 1
+#endif /* GL_ARB_gpu_shader5 */
+
+#ifndef GL_ARB_gpu_shader_fp64
+#define GL_ARB_gpu_shader_fp64 1
+#endif /* GL_ARB_gpu_shader_fp64 */
+
+#ifndef GL_ARB_half_float_pixel
+#define GL_ARB_half_float_pixel 1
+typedef unsigned short GLhalfARB;
+#define GL_HALF_FLOAT_ARB 0x140B
+#endif /* GL_ARB_half_float_pixel */
+
+#ifndef GL_ARB_half_float_vertex
+#define GL_ARB_half_float_vertex 1
+#endif /* GL_ARB_half_float_vertex */
+
+#ifndef GL_ARB_imaging
+#define GL_ARB_imaging 1
+#define GL_BLEND_COLOR 0x8005
+#define GL_BLEND_EQUATION 0x8009
+#define GL_CONVOLUTION_1D 0x8010
+#define GL_CONVOLUTION_2D 0x8011
+#define GL_SEPARABLE_2D 0x8012
+#define GL_CONVOLUTION_BORDER_MODE 0x8013
+#define GL_CONVOLUTION_FILTER_SCALE 0x8014
+#define GL_CONVOLUTION_FILTER_BIAS 0x8015
+#define GL_REDUCE 0x8016
+#define GL_CONVOLUTION_FORMAT 0x8017
+#define GL_CONVOLUTION_WIDTH 0x8018
+#define GL_CONVOLUTION_HEIGHT 0x8019
+#define GL_MAX_CONVOLUTION_WIDTH 0x801A
+#define GL_MAX_CONVOLUTION_HEIGHT 0x801B
+#define GL_POST_CONVOLUTION_RED_SCALE 0x801C
+#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D
+#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E
+#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F
+#define GL_POST_CONVOLUTION_RED_BIAS 0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023
+#define GL_HISTOGRAM 0x8024
+#define GL_PROXY_HISTOGRAM 0x8025
+#define GL_HISTOGRAM_WIDTH 0x8026
+#define GL_HISTOGRAM_FORMAT 0x8027
+#define GL_HISTOGRAM_RED_SIZE 0x8028
+#define GL_HISTOGRAM_GREEN_SIZE 0x8029
+#define GL_HISTOGRAM_BLUE_SIZE 0x802A
+#define GL_HISTOGRAM_ALPHA_SIZE 0x802B
+#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C
+#define GL_HISTOGRAM_SINK 0x802D
+#define GL_MINMAX 0x802E
+#define GL_MINMAX_FORMAT 0x802F
+#define GL_MINMAX_SINK 0x8030
+#define GL_TABLE_TOO_LARGE 0x8031
+#define GL_COLOR_MATRIX 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3
+#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7
+#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB
+#define GL_COLOR_TABLE 0x80D0
+#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2
+#define GL_PROXY_COLOR_TABLE 0x80D3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5
+#define GL_COLOR_TABLE_SCALE 0x80D6
+#define GL_COLOR_TABLE_BIAS 0x80D7
+#define GL_COLOR_TABLE_FORMAT 0x80D8
+#define GL_COLOR_TABLE_WIDTH 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF
+#define GL_CONSTANT_BORDER 0x8151
+#define GL_REPLICATE_BORDER 0x8153
+#define GL_CONVOLUTION_BORDER_COLOR 0x8154
+typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
+typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
+typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image);
+typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
+typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
+typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
+GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table);
+GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
+GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
+GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params);
+GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params);
+GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image);
+GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
+GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
+GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink);
+GLAPI void APIENTRY glResetHistogram (GLenum target);
+GLAPI void APIENTRY glResetMinmax (GLenum target);
+#endif
+#endif /* GL_ARB_imaging */
+
+#ifndef GL_ARB_indirect_parameters
+#define GL_ARB_indirect_parameters 1
+#define GL_PARAMETER_BUFFER_ARB 0x80EE
+#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
+GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride);
+#endif
+#endif /* GL_ARB_indirect_parameters */
+
+#ifndef GL_ARB_instanced_arrays
+#define GL_ARB_instanced_arrays 1
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE
+typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor);
+#endif
+#endif /* GL_ARB_instanced_arrays */
+
+#ifndef GL_ARB_internalformat_query
+#define GL_ARB_internalformat_query 1
+#endif /* GL_ARB_internalformat_query */
+
+#ifndef GL_ARB_internalformat_query2
+#define GL_ARB_internalformat_query2 1
+#define GL_SRGB_DECODE_ARB 0x8299
+#endif /* GL_ARB_internalformat_query2 */
+
+#ifndef GL_ARB_invalidate_subdata
+#define GL_ARB_invalidate_subdata 1
+#endif /* GL_ARB_invalidate_subdata */
+
+#ifndef GL_ARB_map_buffer_alignment
+#define GL_ARB_map_buffer_alignment 1
+#endif /* GL_ARB_map_buffer_alignment */
+
+#ifndef GL_ARB_map_buffer_range
+#define GL_ARB_map_buffer_range 1
+#endif /* GL_ARB_map_buffer_range */
+
+#ifndef GL_ARB_matrix_palette
+#define GL_ARB_matrix_palette 1
+#define GL_MATRIX_PALETTE_ARB 0x8840
+#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841
+#define GL_MAX_PALETTE_MATRICES_ARB 0x8842
+#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843
+#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844
+#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845
+#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846
+#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847
+#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848
+#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849
+typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);
+typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices);
+typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices);
+typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices);
+typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index);
+GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices);
+GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices);
+GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices);
+GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer);
+#endif
+#endif /* GL_ARB_matrix_palette */
+
+#ifndef GL_ARB_multi_bind
+#define GL_ARB_multi_bind 1
+#endif /* GL_ARB_multi_bind */
+
+#ifndef GL_ARB_multi_draw_indirect
+#define GL_ARB_multi_draw_indirect 1
+#endif /* GL_ARB_multi_draw_indirect */
+
+#ifndef GL_ARB_multisample
+#define GL_ARB_multisample 1
+#define GL_MULTISAMPLE_ARB 0x809D
+#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F
+#define GL_SAMPLE_COVERAGE_ARB 0x80A0
+#define GL_SAMPLE_BUFFERS_ARB 0x80A8
+#define GL_SAMPLES_ARB 0x80A9
+#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA
+#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB
+#define GL_MULTISAMPLE_BIT_ARB 0x20000000
+typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert);
+#endif
+#endif /* GL_ARB_multisample */
+
+#ifndef GL_ARB_multitexture
+#define GL_ARB_multitexture 1
+#define GL_TEXTURE0_ARB 0x84C0
+#define GL_TEXTURE1_ARB 0x84C1
+#define GL_TEXTURE2_ARB 0x84C2
+#define GL_TEXTURE3_ARB 0x84C3
+#define GL_TEXTURE4_ARB 0x84C4
+#define GL_TEXTURE5_ARB 0x84C5
+#define GL_TEXTURE6_ARB 0x84C6
+#define GL_TEXTURE7_ARB 0x84C7
+#define GL_TEXTURE8_ARB 0x84C8
+#define GL_TEXTURE9_ARB 0x84C9
+#define GL_TEXTURE10_ARB 0x84CA
+#define GL_TEXTURE11_ARB 0x84CB
+#define GL_TEXTURE12_ARB 0x84CC
+#define GL_TEXTURE13_ARB 0x84CD
+#define GL_TEXTURE14_ARB 0x84CE
+#define GL_TEXTURE15_ARB 0x84CF
+#define GL_TEXTURE16_ARB 0x84D0
+#define GL_TEXTURE17_ARB 0x84D1
+#define GL_TEXTURE18_ARB 0x84D2
+#define GL_TEXTURE19_ARB 0x84D3
+#define GL_TEXTURE20_ARB 0x84D4
+#define GL_TEXTURE21_ARB 0x84D5
+#define GL_TEXTURE22_ARB 0x84D6
+#define GL_TEXTURE23_ARB 0x84D7
+#define GL_TEXTURE24_ARB 0x84D8
+#define GL_TEXTURE25_ARB 0x84D9
+#define GL_TEXTURE26_ARB 0x84DA
+#define GL_TEXTURE27_ARB 0x84DB
+#define GL_TEXTURE28_ARB 0x84DC
+#define GL_TEXTURE29_ARB 0x84DD
+#define GL_TEXTURE30_ARB 0x84DE
+#define GL_TEXTURE31_ARB 0x84DF
+#define GL_ACTIVE_TEXTURE_ARB 0x84E0
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1
+#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2
+typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture);
+typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glActiveTextureARB (GLenum texture);
+GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture);
+GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s);
+GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s);
+GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s);
+GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s);
+GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v);
+GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t);
+GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t);
+GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t);
+GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t);
+GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v);
+GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r);
+GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r);
+GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r);
+GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r);
+GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v);
+GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
+GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v);
+GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
+GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v);
+GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q);
+GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v);
+GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
+GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v);
+#endif
+#endif /* GL_ARB_multitexture */
+
+#ifndef GL_ARB_occlusion_query
+#define GL_ARB_occlusion_query 1
+#define GL_QUERY_COUNTER_BITS_ARB 0x8864
+#define GL_CURRENT_QUERY_ARB 0x8865
+#define GL_QUERY_RESULT_ARB 0x8866
+#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867
+#define GL_SAMPLES_PASSED_ARB 0x8914
+typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids);
+typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id);
+typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids);
+GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids);
+GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id);
+GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id);
+GLAPI void APIENTRY glEndQueryARB (GLenum target);
+GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params);
+#endif
+#endif /* GL_ARB_occlusion_query */
+
+#ifndef GL_ARB_occlusion_query2
+#define GL_ARB_occlusion_query2 1
+#endif /* GL_ARB_occlusion_query2 */
+
+#ifndef GL_ARB_pipeline_statistics_query
+#define GL_ARB_pipeline_statistics_query 1
+#define GL_VERTICES_SUBMITTED_ARB 0x82EE
+#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF
+#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0
+#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1
+#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2
+#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3
+#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4
+#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5
+#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6
+#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7
+#endif /* GL_ARB_pipeline_statistics_query */
+
+#ifndef GL_ARB_pixel_buffer_object
+#define GL_ARB_pixel_buffer_object 1
+#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF
+#endif /* GL_ARB_pixel_buffer_object */
+
+#ifndef GL_ARB_point_parameters
+#define GL_ARB_point_parameters 1
+#define GL_POINT_SIZE_MIN_ARB 0x8126
+#define GL_POINT_SIZE_MAX_ARB 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128
+#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params);
+#endif
+#endif /* GL_ARB_point_parameters */
+
+#ifndef GL_ARB_point_sprite
+#define GL_ARB_point_sprite 1
+#define GL_POINT_SPRITE_ARB 0x8861
+#define GL_COORD_REPLACE_ARB 0x8862
+#endif /* GL_ARB_point_sprite */
+
+#ifndef GL_ARB_program_interface_query
+#define GL_ARB_program_interface_query 1
+#endif /* GL_ARB_program_interface_query */
+
+#ifndef GL_ARB_provoking_vertex
+#define GL_ARB_provoking_vertex 1
+#endif /* GL_ARB_provoking_vertex */
+
+#ifndef GL_ARB_query_buffer_object
+#define GL_ARB_query_buffer_object 1
+#endif /* GL_ARB_query_buffer_object */
+
+#ifndef GL_ARB_robust_buffer_access_behavior
+#define GL_ARB_robust_buffer_access_behavior 1
+#endif /* GL_ARB_robust_buffer_access_behavior */
+
+#ifndef GL_ARB_robustness
+#define GL_ARB_robustness 1
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253
+#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define GL_NO_RESET_NOTIFICATION_ARB 0x8261
+typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void);
+typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img);
+typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img);
+typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
+typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
+typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v);
+typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values);
+typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values);
+typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values);
+typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern);
+typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
+typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
+typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);
+typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void);
+GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img);
+GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img);
+GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
+GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params);
+GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params);
+GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v);
+GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v);
+GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v);
+GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values);
+GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values);
+GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values);
+GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern);
+GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table);
+GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image);
+GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span);
+GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values);
+#endif
+#endif /* GL_ARB_robustness */
+
+#ifndef GL_ARB_robustness_isolation
+#define GL_ARB_robustness_isolation 1
+#endif /* GL_ARB_robustness_isolation */
+
+#ifndef GL_ARB_sample_shading
+#define GL_ARB_sample_shading 1
+#define GL_SAMPLE_SHADING_ARB 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37
+typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value);
+#endif
+#endif /* GL_ARB_sample_shading */
+
+#ifndef GL_ARB_sampler_objects
+#define GL_ARB_sampler_objects 1
+#endif /* GL_ARB_sampler_objects */
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_ARB_seamless_cube_map 1
+#endif /* GL_ARB_seamless_cube_map */
+
+#ifndef GL_ARB_seamless_cubemap_per_texture
+#define GL_ARB_seamless_cubemap_per_texture 1
+#endif /* GL_ARB_seamless_cubemap_per_texture */
+
+#ifndef GL_ARB_separate_shader_objects
+#define GL_ARB_separate_shader_objects 1
+#endif /* GL_ARB_separate_shader_objects */
+
+#ifndef GL_ARB_shader_atomic_counters
+#define GL_ARB_shader_atomic_counters 1
+#endif /* GL_ARB_shader_atomic_counters */
+
+#ifndef GL_ARB_shader_bit_encoding
+#define GL_ARB_shader_bit_encoding 1
+#endif /* GL_ARB_shader_bit_encoding */
+
+#ifndef GL_ARB_shader_draw_parameters
+#define GL_ARB_shader_draw_parameters 1
+#endif /* GL_ARB_shader_draw_parameters */
+
+#ifndef GL_ARB_shader_group_vote
+#define GL_ARB_shader_group_vote 1
+#endif /* GL_ARB_shader_group_vote */
+
+#ifndef GL_ARB_shader_image_load_store
+#define GL_ARB_shader_image_load_store 1
+#endif /* GL_ARB_shader_image_load_store */
+
+#ifndef GL_ARB_shader_image_size
+#define GL_ARB_shader_image_size 1
+#endif /* GL_ARB_shader_image_size */
+
+#ifndef GL_ARB_shader_objects
+#define GL_ARB_shader_objects 1
+#ifdef __APPLE__
+typedef void *GLhandleARB;
+#else
+typedef unsigned int GLhandleARB;
+#endif
+typedef char GLcharARB;
+#define GL_PROGRAM_OBJECT_ARB 0x8B40
+#define GL_SHADER_OBJECT_ARB 0x8B48
+#define GL_OBJECT_TYPE_ARB 0x8B4E
+#define GL_OBJECT_SUBTYPE_ARB 0x8B4F
+#define GL_FLOAT_VEC2_ARB 0x8B50
+#define GL_FLOAT_VEC3_ARB 0x8B51
+#define GL_FLOAT_VEC4_ARB 0x8B52
+#define GL_INT_VEC2_ARB 0x8B53
+#define GL_INT_VEC3_ARB 0x8B54
+#define GL_INT_VEC4_ARB 0x8B55
+#define GL_BOOL_ARB 0x8B56
+#define GL_BOOL_VEC2_ARB 0x8B57
+#define GL_BOOL_VEC3_ARB 0x8B58
+#define GL_BOOL_VEC4_ARB 0x8B59
+#define GL_FLOAT_MAT2_ARB 0x8B5A
+#define GL_FLOAT_MAT3_ARB 0x8B5B
+#define GL_FLOAT_MAT4_ARB 0x8B5C
+#define GL_SAMPLER_1D_ARB 0x8B5D
+#define GL_SAMPLER_2D_ARB 0x8B5E
+#define GL_SAMPLER_3D_ARB 0x8B5F
+#define GL_SAMPLER_CUBE_ARB 0x8B60
+#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61
+#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62
+#define GL_SAMPLER_2D_RECT_ARB 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64
+#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80
+#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81
+#define GL_OBJECT_LINK_STATUS_ARB 0x8B82
+#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88
+typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
+typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname);
+typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);
+typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
+typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length);
+typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
+typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
+typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
+typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
+typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
+typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
+typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
+typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);
+typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
+typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);
+typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);
+typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
+typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
+typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
+typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params);
+typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj);
+GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname);
+GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj);
+GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType);
+GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length);
+GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj);
+GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void);
+GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj);
+GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj);
+GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj);
+GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj);
+GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0);
+GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1);
+GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0);
+GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1);
+GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2);
+GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value);
+GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value);
+GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
+GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj);
+GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name);
+GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params);
+GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params);
+GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);
+#endif
+#endif /* GL_ARB_shader_objects */
+
+#ifndef GL_ARB_shader_precision
+#define GL_ARB_shader_precision 1
+#endif /* GL_ARB_shader_precision */
+
+#ifndef GL_ARB_shader_stencil_export
+#define GL_ARB_shader_stencil_export 1
+#endif /* GL_ARB_shader_stencil_export */
+
+#ifndef GL_ARB_shader_storage_buffer_object
+#define GL_ARB_shader_storage_buffer_object 1
+#endif /* GL_ARB_shader_storage_buffer_object */
+
+#ifndef GL_ARB_shader_subroutine
+#define GL_ARB_shader_subroutine 1
+#endif /* GL_ARB_shader_subroutine */
+
+#ifndef GL_ARB_shader_texture_image_samples
+#define GL_ARB_shader_texture_image_samples 1
+#endif /* GL_ARB_shader_texture_image_samples */
+
+#ifndef GL_ARB_shader_texture_lod
+#define GL_ARB_shader_texture_lod 1
+#endif /* GL_ARB_shader_texture_lod */
+
+#ifndef GL_ARB_shading_language_100
+#define GL_ARB_shading_language_100 1
+#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C
+#endif /* GL_ARB_shading_language_100 */
+
+#ifndef GL_ARB_shading_language_420pack
+#define GL_ARB_shading_language_420pack 1
+#endif /* GL_ARB_shading_language_420pack */
+
+#ifndef GL_ARB_shading_language_include
+#define GL_ARB_shading_language_include 1
+#define GL_SHADER_INCLUDE_ARB 0x8DAE
+#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9
+#define GL_NAMED_STRING_TYPE_ARB 0x8DEA
+typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);
+typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);
+typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length);
+typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);
+typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string);
+GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name);
+GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length);
+GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name);
+GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string);
+GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params);
+#endif
+#endif /* GL_ARB_shading_language_include */
+
+#ifndef GL_ARB_shading_language_packing
+#define GL_ARB_shading_language_packing 1
+#endif /* GL_ARB_shading_language_packing */
+
+#ifndef GL_ARB_shadow
+#define GL_ARB_shadow 1
+#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C
+#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D
+#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E
+#endif /* GL_ARB_shadow */
+
+#ifndef GL_ARB_shadow_ambient
+#define GL_ARB_shadow_ambient 1
+#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF
+#endif /* GL_ARB_shadow_ambient */
+
+#ifndef GL_ARB_sparse_buffer
+#define GL_ARB_sparse_buffer 1
+#define GL_SPARSE_STORAGE_BIT_ARB 0x0400
+#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8
+typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit);
+typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);
+typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit);
+GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);
+GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit);
+#endif
+#endif /* GL_ARB_sparse_buffer */
+
+#ifndef GL_ARB_sparse_texture
+#define GL_ARB_sparse_texture 1
+#define GL_TEXTURE_SPARSE_ARB 0x91A6
+#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7
+#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA
+#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8
+#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195
+#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196
+#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197
+#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198
+#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199
+#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A
+#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9
+typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident);
+#endif
+#endif /* GL_ARB_sparse_texture */
+
+#ifndef GL_ARB_stencil_texturing
+#define GL_ARB_stencil_texturing 1
+#endif /* GL_ARB_stencil_texturing */
+
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+#endif /* GL_ARB_sync */
+
+#ifndef GL_ARB_tessellation_shader
+#define GL_ARB_tessellation_shader 1
+#endif /* GL_ARB_tessellation_shader */
+
+#ifndef GL_ARB_texture_barrier
+#define GL_ARB_texture_barrier 1
+#endif /* GL_ARB_texture_barrier */
+
+#ifndef GL_ARB_texture_border_clamp
+#define GL_ARB_texture_border_clamp 1
+#define GL_CLAMP_TO_BORDER_ARB 0x812D
+#endif /* GL_ARB_texture_border_clamp */
+
+#ifndef GL_ARB_texture_buffer_object
+#define GL_ARB_texture_buffer_object 1
+#define GL_TEXTURE_BUFFER_ARB 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D
+#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E
+typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer);
+#endif
+#endif /* GL_ARB_texture_buffer_object */
+
+#ifndef GL_ARB_texture_buffer_object_rgb32
+#define GL_ARB_texture_buffer_object_rgb32 1
+#endif /* GL_ARB_texture_buffer_object_rgb32 */
+
+#ifndef GL_ARB_texture_buffer_range
+#define GL_ARB_texture_buffer_range 1
+#endif /* GL_ARB_texture_buffer_range */
+
+#ifndef GL_ARB_texture_compression
+#define GL_ARB_texture_compression 1
+#define GL_COMPRESSED_ALPHA_ARB 0x84E9
+#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA
+#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB
+#define GL_COMPRESSED_INTENSITY_ARB 0x84EC
+#define GL_COMPRESSED_RGB_ARB 0x84ED
+#define GL_COMPRESSED_RGBA_ARB 0x84EE
+#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
+#define GL_TEXTURE_COMPRESSED_ARB 0x86A1
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
+#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);
+GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img);
+#endif
+#endif /* GL_ARB_texture_compression */
+
+#ifndef GL_ARB_texture_compression_bptc
+#define GL_ARB_texture_compression_bptc 1
+#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
+#endif /* GL_ARB_texture_compression_bptc */
+
+#ifndef GL_ARB_texture_compression_rgtc
+#define GL_ARB_texture_compression_rgtc 1
+#endif /* GL_ARB_texture_compression_rgtc */
+
+#ifndef GL_ARB_texture_cube_map
+#define GL_ARB_texture_cube_map 1
+#define GL_NORMAL_MAP_ARB 0x8511
+#define GL_REFLECTION_MAP_ARB 0x8512
+#define GL_TEXTURE_CUBE_MAP_ARB 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C
+#endif /* GL_ARB_texture_cube_map */
+
+#ifndef GL_ARB_texture_cube_map_array
+#define GL_ARB_texture_cube_map_array 1
+#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F
+#endif /* GL_ARB_texture_cube_map_array */
+
+#ifndef GL_ARB_texture_env_add
+#define GL_ARB_texture_env_add 1
+#endif /* GL_ARB_texture_env_add */
+
+#ifndef GL_ARB_texture_env_combine
+#define GL_ARB_texture_env_combine 1
+#define GL_COMBINE_ARB 0x8570
+#define GL_COMBINE_RGB_ARB 0x8571
+#define GL_COMBINE_ALPHA_ARB 0x8572
+#define GL_SOURCE0_RGB_ARB 0x8580
+#define GL_SOURCE1_RGB_ARB 0x8581
+#define GL_SOURCE2_RGB_ARB 0x8582
+#define GL_SOURCE0_ALPHA_ARB 0x8588
+#define GL_SOURCE1_ALPHA_ARB 0x8589
+#define GL_SOURCE2_ALPHA_ARB 0x858A
+#define GL_OPERAND0_RGB_ARB 0x8590
+#define GL_OPERAND1_RGB_ARB 0x8591
+#define GL_OPERAND2_RGB_ARB 0x8592
+#define GL_OPERAND0_ALPHA_ARB 0x8598
+#define GL_OPERAND1_ALPHA_ARB 0x8599
+#define GL_OPERAND2_ALPHA_ARB 0x859A
+#define GL_RGB_SCALE_ARB 0x8573
+#define GL_ADD_SIGNED_ARB 0x8574
+#define GL_INTERPOLATE_ARB 0x8575
+#define GL_SUBTRACT_ARB 0x84E7
+#define GL_CONSTANT_ARB 0x8576
+#define GL_PRIMARY_COLOR_ARB 0x8577
+#define GL_PREVIOUS_ARB 0x8578
+#endif /* GL_ARB_texture_env_combine */
+
+#ifndef GL_ARB_texture_env_crossbar
+#define GL_ARB_texture_env_crossbar 1
+#endif /* GL_ARB_texture_env_crossbar */
+
+#ifndef GL_ARB_texture_env_dot3
+#define GL_ARB_texture_env_dot3 1
+#define GL_DOT3_RGB_ARB 0x86AE
+#define GL_DOT3_RGBA_ARB 0x86AF
+#endif /* GL_ARB_texture_env_dot3 */
+
+#ifndef GL_ARB_texture_float
+#define GL_ARB_texture_float 1
+#define GL_TEXTURE_RED_TYPE_ARB 0x8C10
+#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11
+#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12
+#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13
+#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14
+#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15
+#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16
+#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17
+#define GL_RGBA32F_ARB 0x8814
+#define GL_RGB32F_ARB 0x8815
+#define GL_ALPHA32F_ARB 0x8816
+#define GL_INTENSITY32F_ARB 0x8817
+#define GL_LUMINANCE32F_ARB 0x8818
+#define GL_LUMINANCE_ALPHA32F_ARB 0x8819
+#define GL_RGBA16F_ARB 0x881A
+#define GL_RGB16F_ARB 0x881B
+#define GL_ALPHA16F_ARB 0x881C
+#define GL_INTENSITY16F_ARB 0x881D
+#define GL_LUMINANCE16F_ARB 0x881E
+#define GL_LUMINANCE_ALPHA16F_ARB 0x881F
+#endif /* GL_ARB_texture_float */
+
+#ifndef GL_ARB_texture_gather
+#define GL_ARB_texture_gather 1
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F
+#endif /* GL_ARB_texture_gather */
+
+#ifndef GL_ARB_texture_mirror_clamp_to_edge
+#define GL_ARB_texture_mirror_clamp_to_edge 1
+#endif /* GL_ARB_texture_mirror_clamp_to_edge */
+
+#ifndef GL_ARB_texture_mirrored_repeat
+#define GL_ARB_texture_mirrored_repeat 1
+#define GL_MIRRORED_REPEAT_ARB 0x8370
+#endif /* GL_ARB_texture_mirrored_repeat */
+
+#ifndef GL_ARB_texture_multisample
+#define GL_ARB_texture_multisample 1
+#endif /* GL_ARB_texture_multisample */
+
+#ifndef GL_ARB_texture_non_power_of_two
+#define GL_ARB_texture_non_power_of_two 1
+#endif /* GL_ARB_texture_non_power_of_two */
+
+#ifndef GL_ARB_texture_query_levels
+#define GL_ARB_texture_query_levels 1
+#endif /* GL_ARB_texture_query_levels */
+
+#ifndef GL_ARB_texture_query_lod
+#define GL_ARB_texture_query_lod 1
+#endif /* GL_ARB_texture_query_lod */
+
+#ifndef GL_ARB_texture_rectangle
+#define GL_ARB_texture_rectangle 1
+#define GL_TEXTURE_RECTANGLE_ARB 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8
+#endif /* GL_ARB_texture_rectangle */
+
+#ifndef GL_ARB_texture_rg
+#define GL_ARB_texture_rg 1
+#endif /* GL_ARB_texture_rg */
+
+#ifndef GL_ARB_texture_rgb10_a2ui
+#define GL_ARB_texture_rgb10_a2ui 1
+#endif /* GL_ARB_texture_rgb10_a2ui */
+
+#ifndef GL_ARB_texture_stencil8
+#define GL_ARB_texture_stencil8 1
+#endif /* GL_ARB_texture_stencil8 */
+
+#ifndef GL_ARB_texture_storage
+#define GL_ARB_texture_storage 1
+#endif /* GL_ARB_texture_storage */
+
+#ifndef GL_ARB_texture_storage_multisample
+#define GL_ARB_texture_storage_multisample 1
+#endif /* GL_ARB_texture_storage_multisample */
+
+#ifndef GL_ARB_texture_swizzle
+#define GL_ARB_texture_swizzle 1
+#endif /* GL_ARB_texture_swizzle */
+
+#ifndef GL_ARB_texture_view
+#define GL_ARB_texture_view 1
+#endif /* GL_ARB_texture_view */
+
+#ifndef GL_ARB_timer_query
+#define GL_ARB_timer_query 1
+#endif /* GL_ARB_timer_query */
+
+#ifndef GL_ARB_transform_feedback2
+#define GL_ARB_transform_feedback2 1
+#endif /* GL_ARB_transform_feedback2 */
+
+#ifndef GL_ARB_transform_feedback3
+#define GL_ARB_transform_feedback3 1
+#endif /* GL_ARB_transform_feedback3 */
+
+#ifndef GL_ARB_transform_feedback_instanced
+#define GL_ARB_transform_feedback_instanced 1
+#endif /* GL_ARB_transform_feedback_instanced */
+
+#ifndef GL_ARB_transform_feedback_overflow_query
+#define GL_ARB_transform_feedback_overflow_query 1
+#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC
+#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED
+#endif /* GL_ARB_transform_feedback_overflow_query */
+
+#ifndef GL_ARB_transpose_matrix
+#define GL_ARB_transpose_matrix 1
+#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3
+#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4
+#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5
+#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6
+typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m);
+typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m);
+typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m);
+typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m);
+GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m);
+GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m);
+GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m);
+#endif
+#endif /* GL_ARB_transpose_matrix */
+
+#ifndef GL_ARB_uniform_buffer_object
+#define GL_ARB_uniform_buffer_object 1
+#endif /* GL_ARB_uniform_buffer_object */
+
+#ifndef GL_ARB_vertex_array_bgra
+#define GL_ARB_vertex_array_bgra 1
+#endif /* GL_ARB_vertex_array_bgra */
+
+#ifndef GL_ARB_vertex_array_object
+#define GL_ARB_vertex_array_object 1
+#endif /* GL_ARB_vertex_array_object */
+
+#ifndef GL_ARB_vertex_attrib_64bit
+#define GL_ARB_vertex_attrib_64bit 1
+#endif /* GL_ARB_vertex_attrib_64bit */
+
+#ifndef GL_ARB_vertex_attrib_binding
+#define GL_ARB_vertex_attrib_binding 1
+#endif /* GL_ARB_vertex_attrib_binding */
+
+#ifndef GL_ARB_vertex_blend
+#define GL_ARB_vertex_blend 1
+#define GL_MAX_VERTEX_UNITS_ARB 0x86A4
+#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5
+#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6
+#define GL_VERTEX_BLEND_ARB 0x86A7
+#define GL_CURRENT_WEIGHT_ARB 0x86A8
+#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9
+#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA
+#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB
+#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC
+#define GL_WEIGHT_ARRAY_ARB 0x86AD
+#define GL_MODELVIEW0_ARB 0x1700
+#define GL_MODELVIEW1_ARB 0x850A
+#define GL_MODELVIEW2_ARB 0x8722
+#define GL_MODELVIEW3_ARB 0x8723
+#define GL_MODELVIEW4_ARB 0x8724
+#define GL_MODELVIEW5_ARB 0x8725
+#define GL_MODELVIEW6_ARB 0x8726
+#define GL_MODELVIEW7_ARB 0x8727
+#define GL_MODELVIEW8_ARB 0x8728
+#define GL_MODELVIEW9_ARB 0x8729
+#define GL_MODELVIEW10_ARB 0x872A
+#define GL_MODELVIEW11_ARB 0x872B
+#define GL_MODELVIEW12_ARB 0x872C
+#define GL_MODELVIEW13_ARB 0x872D
+#define GL_MODELVIEW14_ARB 0x872E
+#define GL_MODELVIEW15_ARB 0x872F
+#define GL_MODELVIEW16_ARB 0x8730
+#define GL_MODELVIEW17_ARB 0x8731
+#define GL_MODELVIEW18_ARB 0x8732
+#define GL_MODELVIEW19_ARB 0x8733
+#define GL_MODELVIEW20_ARB 0x8734
+#define GL_MODELVIEW21_ARB 0x8735
+#define GL_MODELVIEW22_ARB 0x8736
+#define GL_MODELVIEW23_ARB 0x8737
+#define GL_MODELVIEW24_ARB 0x8738
+#define GL_MODELVIEW25_ARB 0x8739
+#define GL_MODELVIEW26_ARB 0x873A
+#define GL_MODELVIEW27_ARB 0x873B
+#define GL_MODELVIEW28_ARB 0x873C
+#define GL_MODELVIEW29_ARB 0x873D
+#define GL_MODELVIEW30_ARB 0x873E
+#define GL_MODELVIEW31_ARB 0x873F
+typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights);
+typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights);
+typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights);
+typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights);
+typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights);
+typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights);
+typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights);
+typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights);
+typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights);
+GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights);
+GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights);
+GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights);
+GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights);
+GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights);
+GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights);
+GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights);
+GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glVertexBlendARB (GLint count);
+#endif
+#endif /* GL_ARB_vertex_blend */
+
+#ifndef GL_ARB_vertex_buffer_object
+#define GL_ARB_vertex_buffer_object 1
+typedef ptrdiff_t GLsizeiptrARB;
+typedef ptrdiff_t GLintptrARB;
+#define GL_BUFFER_SIZE_ARB 0x8764
+#define GL_BUFFER_USAGE_ARB 0x8765
+#define GL_ARRAY_BUFFER_ARB 0x8892
+#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893
+#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
+#define GL_READ_ONLY_ARB 0x88B8
+#define GL_WRITE_ONLY_ARB 0x88B9
+#define GL_READ_WRITE_ARB 0x88BA
+#define GL_BUFFER_ACCESS_ARB 0x88BB
+#define GL_BUFFER_MAPPED_ARB 0x88BC
+#define GL_BUFFER_MAP_POINTER_ARB 0x88BD
+#define GL_STREAM_DRAW_ARB 0x88E0
+#define GL_STREAM_READ_ARB 0x88E1
+#define GL_STREAM_COPY_ARB 0x88E2
+#define GL_STATIC_DRAW_ARB 0x88E4
+#define GL_STATIC_READ_ARB 0x88E5
+#define GL_STATIC_COPY_ARB 0x88E6
+#define GL_DYNAMIC_DRAW_ARB 0x88E8
+#define GL_DYNAMIC_READ_ARB 0x88E9
+#define GL_DYNAMIC_COPY_ARB 0x88EA
+typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
+typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
+typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
+typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage);
+typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data);
+typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data);
+typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access);
+typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer);
+GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers);
+GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers);
+GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer);
+GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage);
+GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data);
+GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data);
+GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access);
+GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target);
+GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params);
+#endif
+#endif /* GL_ARB_vertex_buffer_object */
+
+#ifndef GL_ARB_vertex_program
+#define GL_ARB_vertex_program 1
+#define GL_COLOR_SUM_ARB 0x8458
+#define GL_VERTEX_PROGRAM_ARB 0x8620
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625
+#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645
+#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
+typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x);
+GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x);
+GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x);
+GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y);
+GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y);
+GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index);
+GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index);
+GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params);
+GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer);
+#endif
+#endif /* GL_ARB_vertex_program */
+
+#ifndef GL_ARB_vertex_shader
+#define GL_ARB_vertex_shader 1
+#define GL_VERTEX_SHADER_ARB 0x8B31
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A
+#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A
+typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name);
+typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name);
+GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name);
+GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name);
+#endif
+#endif /* GL_ARB_vertex_shader */
+
+#ifndef GL_ARB_vertex_type_10f_11f_11f_rev
+#define GL_ARB_vertex_type_10f_11f_11f_rev 1
+#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */
+
+#ifndef GL_ARB_vertex_type_2_10_10_10_rev
+#define GL_ARB_vertex_type_2_10_10_10_rev 1
+#endif /* GL_ARB_vertex_type_2_10_10_10_rev */
+
+#ifndef GL_ARB_viewport_array
+#define GL_ARB_viewport_array 1
+#endif /* GL_ARB_viewport_array */
+
+#ifndef GL_ARB_window_pos
+#define GL_ARB_window_pos 1
+typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y);
+GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v);
+GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y);
+GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v);
+GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y);
+GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v);
+GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y);
+GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v);
+GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v);
+GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v);
+GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z);
+GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v);
+GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v);
+#endif
+#endif /* GL_ARB_window_pos */
+
+#ifndef GL_KHR_blend_equation_advanced
+#define GL_KHR_blend_equation_advanced 1
+#define GL_MULTIPLY_KHR 0x9294
+#define GL_SCREEN_KHR 0x9295
+#define GL_OVERLAY_KHR 0x9296
+#define GL_DARKEN_KHR 0x9297
+#define GL_LIGHTEN_KHR 0x9298
+#define GL_COLORDODGE_KHR 0x9299
+#define GL_COLORBURN_KHR 0x929A
+#define GL_HARDLIGHT_KHR 0x929B
+#define GL_SOFTLIGHT_KHR 0x929C
+#define GL_DIFFERENCE_KHR 0x929E
+#define GL_EXCLUSION_KHR 0x92A0
+#define GL_HSL_HUE_KHR 0x92AD
+#define GL_HSL_SATURATION_KHR 0x92AE
+#define GL_HSL_COLOR_KHR 0x92AF
+#define GL_HSL_LUMINOSITY_KHR 0x92B0
+typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendBarrierKHR (void);
+#endif
+#endif /* GL_KHR_blend_equation_advanced */
+
+#ifndef GL_KHR_blend_equation_advanced_coherent
+#define GL_KHR_blend_equation_advanced_coherent 1
+#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285
+#endif /* GL_KHR_blend_equation_advanced_coherent */
+
+#ifndef GL_KHR_context_flush_control
+#define GL_KHR_context_flush_control 1
+#endif /* GL_KHR_context_flush_control */
+
+#ifndef GL_KHR_debug
+#define GL_KHR_debug 1
+#endif /* GL_KHR_debug */
+
+#ifndef GL_KHR_robust_buffer_access_behavior
+#define GL_KHR_robust_buffer_access_behavior 1
+#endif /* GL_KHR_robust_buffer_access_behavior */
+
+#ifndef GL_KHR_robustness
+#define GL_KHR_robustness 1
+#define GL_CONTEXT_ROBUST_ACCESS 0x90F3
+#endif /* GL_KHR_robustness */
+
+#ifndef GL_KHR_texture_compression_astc_hdr
+#define GL_KHR_texture_compression_astc_hdr 1
+#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0
+#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1
+#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2
+#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3
+#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4
+#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5
+#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6
+#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7
+#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8
+#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9
+#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA
+#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB
+#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC
+#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC
+#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD
+#endif /* GL_KHR_texture_compression_astc_hdr */
+
+#ifndef GL_KHR_texture_compression_astc_ldr
+#define GL_KHR_texture_compression_astc_ldr 1
+#endif /* GL_KHR_texture_compression_astc_ldr */
+
+#ifndef GL_OES_byte_coordinates
+#define GL_OES_byte_coordinates 1
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords);
+typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s);
+typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords);
+typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t);
+typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords);
+typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r);
+typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords);
+typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q);
+typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords);
+typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y);
+typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords);
+typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z);
+typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords);
+typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w);
+typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s);
+GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords);
+GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t);
+GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords);
+GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r);
+GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords);
+GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q);
+GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords);
+GLAPI void APIENTRY glTexCoord1bOES (GLbyte s);
+GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords);
+GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t);
+GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords);
+GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r);
+GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords);
+GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q);
+GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords);
+GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y);
+GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords);
+GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z);
+GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords);
+GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w);
+GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords);
+#endif
+#endif /* GL_OES_byte_coordinates */
+
+#ifndef GL_OES_compressed_paletted_texture
+#define GL_OES_compressed_paletted_texture 1
+#define GL_PALETTE4_RGB8_OES 0x8B90
+#define GL_PALETTE4_RGBA8_OES 0x8B91
+#define GL_PALETTE4_R5_G6_B5_OES 0x8B92
+#define GL_PALETTE4_RGBA4_OES 0x8B93
+#define GL_PALETTE4_RGB5_A1_OES 0x8B94
+#define GL_PALETTE8_RGB8_OES 0x8B95
+#define GL_PALETTE8_RGBA8_OES 0x8B96
+#define GL_PALETTE8_R5_G6_B5_OES 0x8B97
+#define GL_PALETTE8_RGBA4_OES 0x8B98
+#define GL_PALETTE8_RGB5_A1_OES 0x8B99
+#endif /* GL_OES_compressed_paletted_texture */
+
+#ifndef GL_OES_fixed_point
+#define GL_OES_fixed_point 1
+typedef GLint GLfixed;
+#define GL_FIXED_OES 0x140C
+typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref);
+typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth);
+typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation);
+typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f);
+typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param);
+typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation);
+typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param);
+typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params);
+typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width);
+typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m);
+typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param);
+typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz);
+typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params);
+typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size);
+typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units);
+typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+typedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert);
+typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z);
+typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);
+typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);
+typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z);
+typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value);
+typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap);
+typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue);
+typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components);
+typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params);
+typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u);
+typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v);
+typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer);
+typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v);
+typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values);
+typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params);
+typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component);
+typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component);
+typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m);
+typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points);
+typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points);
+typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2);
+typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2);
+typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords);
+typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token);
+typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values);
+typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor);
+typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities);
+typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y);
+typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z);
+typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w);
+typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2);
+typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2);
+typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s);
+typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t);
+typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r);
+typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param);
+typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params);
+typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x);
+typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y);
+typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords);
+typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z);
+typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref);
+GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+GLAPI void APIENTRY glClearDepthxOES (GLfixed depth);
+GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation);
+GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f);
+GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param);
+GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param);
+GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation);
+GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param);
+GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param);
+GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param);
+GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params);
+GLAPI void APIENTRY glLineWidthxOES (GLfixed width);
+GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m);
+GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param);
+GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param);
+GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m);
+GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz);
+GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f);
+GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params);
+GLAPI void APIENTRY glPointSizexOES (GLfixed size);
+GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units);
+GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z);
+GLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert);
+GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z);
+GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param);
+GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params);
+GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param);
+GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params);
+GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z);
+GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value);
+GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap);
+GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha);
+GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue);
+GLAPI void APIENTRY glColor3xvOES (const GLfixed *components);
+GLAPI void APIENTRY glColor4xvOES (const GLfixed *components);
+GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param);
+GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params);
+GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u);
+GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v);
+GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer);
+GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v);
+GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param);
+GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values);
+GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params);
+GLAPI void APIENTRY glIndexxOES (GLfixed component);
+GLAPI void APIENTRY glIndexxvOES (const GLfixed *component);
+GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m);
+GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points);
+GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points);
+GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2);
+GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2);
+GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m);
+GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s);
+GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords);
+GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t);
+GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords);
+GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r);
+GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords);
+GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords);
+GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glPassThroughxOES (GLfixed token);
+GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values);
+GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param);
+GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param);
+GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor);
+GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities);
+GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y);
+GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z);
+GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w);
+GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2);
+GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2);
+GLAPI void APIENTRY glTexCoord1xOES (GLfixed s);
+GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t);
+GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r);
+GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q);
+GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param);
+GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params);
+GLAPI void APIENTRY glVertex2xOES (GLfixed x);
+GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y);
+GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords);
+GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z);
+GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords);
+#endif
+#endif /* GL_OES_fixed_point */
+
+#ifndef GL_OES_query_matrix
+#define GL_OES_query_matrix 1
+typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent);
+#endif
+#endif /* GL_OES_query_matrix */
+
+#ifndef GL_OES_read_format
+#define GL_OES_read_format 1
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B
+#endif /* GL_OES_read_format */
+
+#ifndef GL_OES_single_precision
+#define GL_OES_single_precision 1
+typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth);
+typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation);
+typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f);
+typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation);
+typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glClearDepthfOES (GLclampf depth);
+GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation);
+GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f);
+GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation);
+GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);
+#endif
+#endif /* GL_OES_single_precision */
+
+#ifndef GL_3DFX_multisample
+#define GL_3DFX_multisample 1
+#define GL_MULTISAMPLE_3DFX 0x86B2
+#define GL_SAMPLE_BUFFERS_3DFX 0x86B3
+#define GL_SAMPLES_3DFX 0x86B4
+#define GL_MULTISAMPLE_BIT_3DFX 0x20000000
+#endif /* GL_3DFX_multisample */
+
+#ifndef GL_3DFX_tbuffer
+#define GL_3DFX_tbuffer 1
+typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask);
+#endif
+#endif /* GL_3DFX_tbuffer */
+
+#ifndef GL_3DFX_texture_compression_FXT1
+#define GL_3DFX_texture_compression_FXT1 1
+#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0
+#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1
+#endif /* GL_3DFX_texture_compression_FXT1 */
+
+#ifndef GL_AMD_blend_minmax_factor
+#define GL_AMD_blend_minmax_factor 1
+#define GL_FACTOR_MIN_AMD 0x901C
+#define GL_FACTOR_MAX_AMD 0x901D
+#endif /* GL_AMD_blend_minmax_factor */
+
+#ifndef GL_AMD_conservative_depth
+#define GL_AMD_conservative_depth 1
+#endif /* GL_AMD_conservative_depth */
+
+#ifndef GL_AMD_debug_output
+#define GL_AMD_debug_output 1
+typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam);
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147
+#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148
+#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149
+#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A
+#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B
+#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C
+#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D
+#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E
+#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F
+#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150
+typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf);
+typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam);
+typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
+GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf);
+GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam);
+GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message);
+#endif
+#endif /* GL_AMD_debug_output */
+
+#ifndef GL_AMD_depth_clamp_separate
+#define GL_AMD_depth_clamp_separate 1
+#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E
+#define GL_DEPTH_CLAMP_FAR_AMD 0x901F
+#endif /* GL_AMD_depth_clamp_separate */
+
+#ifndef GL_AMD_draw_buffers_blend
+#define GL_AMD_draw_buffers_blend 1
+typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode);
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst);
+GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode);
+GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+#endif
+#endif /* GL_AMD_draw_buffers_blend */
+
+#ifndef GL_AMD_gcn_shader
+#define GL_AMD_gcn_shader 1
+#endif /* GL_AMD_gcn_shader */
+
+#ifndef GL_AMD_gpu_shader_int64
+#define GL_AMD_gpu_shader_int64 1
+typedef int64_t GLint64EXT;
+#define GL_INT64_NV 0x140E
+#define GL_UNSIGNED_INT64_NV 0x140F
+#define GL_INT8_NV 0x8FE0
+#define GL_INT8_VEC2_NV 0x8FE1
+#define GL_INT8_VEC3_NV 0x8FE2
+#define GL_INT8_VEC4_NV 0x8FE3
+#define GL_INT16_NV 0x8FE4
+#define GL_INT16_VEC2_NV 0x8FE5
+#define GL_INT16_VEC3_NV 0x8FE6
+#define GL_INT16_VEC4_NV 0x8FE7
+#define GL_INT64_VEC2_NV 0x8FE9
+#define GL_INT64_VEC3_NV 0x8FEA
+#define GL_INT64_VEC4_NV 0x8FEB
+#define GL_UNSIGNED_INT8_NV 0x8FEC
+#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED
+#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE
+#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF
+#define GL_UNSIGNED_INT16_NV 0x8FF0
+#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1
+#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2
+#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3
+#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5
+#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6
+#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7
+#define GL_FLOAT16_NV 0x8FF8
+#define GL_FLOAT16_VEC2_NV 0x8FF9
+#define GL_FLOAT16_VEC3_NV 0x8FFA
+#define GL_FLOAT16_VEC4_NV 0x8FFB
+typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x);
+typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y);
+typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x);
+typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y);
+typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params);
+typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x);
+GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y);
+GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x);
+GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y);
+GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params);
+GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params);
+GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x);
+GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y);
+GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value);
+GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x);
+GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);
+GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+#endif
+#endif /* GL_AMD_gpu_shader_int64 */
+
+#ifndef GL_AMD_interleaved_elements
+#define GL_AMD_interleaved_elements 1
+#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4
+#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5
+typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param);
+#endif
+#endif /* GL_AMD_interleaved_elements */
+
+#ifndef GL_AMD_multi_draw_indirect
+#define GL_AMD_multi_draw_indirect 1
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride);
+GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride);
+#endif
+#endif /* GL_AMD_multi_draw_indirect */
+
+#ifndef GL_AMD_name_gen_delete
+#define GL_AMD_name_gen_delete 1
+#define GL_DATA_BUFFER_AMD 0x9151
+#define GL_PERFORMANCE_MONITOR_AMD 0x9152
+#define GL_QUERY_OBJECT_AMD 0x9153
+#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154
+#define GL_SAMPLER_OBJECT_AMD 0x9155
+typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names);
+typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names);
+typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names);
+GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names);
+GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name);
+#endif
+#endif /* GL_AMD_name_gen_delete */
+
+#ifndef GL_AMD_occlusion_query_event
+#define GL_AMD_occlusion_query_event 1
+#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F
+#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001
+#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002
+#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004
+#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008
+#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF
+typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param);
+#endif
+#endif /* GL_AMD_occlusion_query_event */
+
+#ifndef GL_AMD_performance_monitor
+#define GL_AMD_performance_monitor 1
+#define GL_COUNTER_TYPE_AMD 0x8BC0
+#define GL_COUNTER_RANGE_AMD 0x8BC1
+#define GL_UNSIGNED_INT64_AMD 0x8BC2
+#define GL_PERCENTAGE_AMD 0x8BC3
+#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4
+#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5
+#define GL_PERFMON_RESULT_AMD 0x8BC6
+typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
+typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
+typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);
+typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);
+typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data);
+typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
+typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
+typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);
+typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
+GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
+GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString);
+GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString);
+GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data);
+GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors);
+GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors);
+GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList);
+GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor);
+GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor);
+GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
+#endif
+#endif /* GL_AMD_performance_monitor */
+
+#ifndef GL_AMD_pinned_memory
+#define GL_AMD_pinned_memory 1
+#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160
+#endif /* GL_AMD_pinned_memory */
+
+#ifndef GL_AMD_query_buffer_object
+#define GL_AMD_query_buffer_object 1
+#define GL_QUERY_BUFFER_AMD 0x9192
+#define GL_QUERY_BUFFER_BINDING_AMD 0x9193
+#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194
+#endif /* GL_AMD_query_buffer_object */
+
+#ifndef GL_AMD_sample_positions
+#define GL_AMD_sample_positions 1
+#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F
+typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val);
+#endif
+#endif /* GL_AMD_sample_positions */
+
+#ifndef GL_AMD_seamless_cubemap_per_texture
+#define GL_AMD_seamless_cubemap_per_texture 1
+#endif /* GL_AMD_seamless_cubemap_per_texture */
+
+#ifndef GL_AMD_shader_atomic_counter_ops
+#define GL_AMD_shader_atomic_counter_ops 1
+#endif /* GL_AMD_shader_atomic_counter_ops */
+
+#ifndef GL_AMD_shader_stencil_export
+#define GL_AMD_shader_stencil_export 1
+#endif /* GL_AMD_shader_stencil_export */
+
+#ifndef GL_AMD_shader_trinary_minmax
+#define GL_AMD_shader_trinary_minmax 1
+#endif /* GL_AMD_shader_trinary_minmax */
+
+#ifndef GL_AMD_sparse_texture
+#define GL_AMD_sparse_texture 1
+#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195
+#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196
+#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197
+#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198
+#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199
+#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A
+#define GL_MIN_SPARSE_LEVEL_AMD 0x919B
+#define GL_MIN_LOD_WARNING_AMD 0x919C
+#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001
+typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);
+typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);
+GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags);
+#endif
+#endif /* GL_AMD_sparse_texture */
+
+#ifndef GL_AMD_stencil_operation_extended
+#define GL_AMD_stencil_operation_extended 1
+#define GL_SET_AMD 0x874A
+#define GL_REPLACE_VALUE_AMD 0x874B
+#define GL_STENCIL_OP_VALUE_AMD 0x874C
+#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D
+typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value);
+#endif
+#endif /* GL_AMD_stencil_operation_extended */
+
+#ifndef GL_AMD_texture_texture4
+#define GL_AMD_texture_texture4 1
+#endif /* GL_AMD_texture_texture4 */
+
+#ifndef GL_AMD_transform_feedback3_lines_triangles
+#define GL_AMD_transform_feedback3_lines_triangles 1
+#endif /* GL_AMD_transform_feedback3_lines_triangles */
+
+#ifndef GL_AMD_transform_feedback4
+#define GL_AMD_transform_feedback4 1
+#define GL_STREAM_RASTERIZATION_AMD 0x91A0
+#endif /* GL_AMD_transform_feedback4 */
+
+#ifndef GL_AMD_vertex_shader_layer
+#define GL_AMD_vertex_shader_layer 1
+#endif /* GL_AMD_vertex_shader_layer */
+
+#ifndef GL_AMD_vertex_shader_tessellator
+#define GL_AMD_vertex_shader_tessellator 1
+#define GL_SAMPLER_BUFFER_AMD 0x9001
+#define GL_INT_SAMPLER_BUFFER_AMD 0x9002
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003
+#define GL_TESSELLATION_MODE_AMD 0x9004
+#define GL_TESSELLATION_FACTOR_AMD 0x9005
+#define GL_DISCRETE_AMD 0x9006
+#define GL_CONTINUOUS_AMD 0x9007
+typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor);
+typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor);
+GLAPI void APIENTRY glTessellationModeAMD (GLenum mode);
+#endif
+#endif /* GL_AMD_vertex_shader_tessellator */
+
+#ifndef GL_AMD_vertex_shader_viewport_index
+#define GL_AMD_vertex_shader_viewport_index 1
+#endif /* GL_AMD_vertex_shader_viewport_index */
+
+#ifndef GL_APPLE_aux_depth_stencil
+#define GL_APPLE_aux_depth_stencil 1
+#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14
+#endif /* GL_APPLE_aux_depth_stencil */
+
+#ifndef GL_APPLE_client_storage
+#define GL_APPLE_client_storage 1
+#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
+#endif /* GL_APPLE_client_storage */
+
+#ifndef GL_APPLE_element_array
+#define GL_APPLE_element_array 1
+#define GL_ELEMENT_ARRAY_APPLE 0x8A0C
+#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D
+#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E
+typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer);
+typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer);
+GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count);
+GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);
+GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount);
+#endif
+#endif /* GL_APPLE_element_array */
+
+#ifndef GL_APPLE_fence
+#define GL_APPLE_fence 1
+#define GL_DRAW_PIXELS_APPLE 0x8A0A
+#define GL_FENCE_APPLE 0x8A0B
+typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences);
+typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences);
+typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence);
+typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence);
+typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence);
+typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence);
+typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);
+typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences);
+GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences);
+GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence);
+GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence);
+GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence);
+GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence);
+GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name);
+GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name);
+#endif
+#endif /* GL_APPLE_fence */
+
+#ifndef GL_APPLE_float_pixels
+#define GL_APPLE_float_pixels 1
+#define GL_HALF_APPLE 0x140B
+#define GL_RGBA_FLOAT32_APPLE 0x8814
+#define GL_RGB_FLOAT32_APPLE 0x8815
+#define GL_ALPHA_FLOAT32_APPLE 0x8816
+#define GL_INTENSITY_FLOAT32_APPLE 0x8817
+#define GL_LUMINANCE_FLOAT32_APPLE 0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819
+#define GL_RGBA_FLOAT16_APPLE 0x881A
+#define GL_RGB_FLOAT16_APPLE 0x881B
+#define GL_ALPHA_FLOAT16_APPLE 0x881C
+#define GL_INTENSITY_FLOAT16_APPLE 0x881D
+#define GL_LUMINANCE_FLOAT16_APPLE 0x881E
+#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F
+#define GL_COLOR_FLOAT_APPLE 0x8A0F
+#endif /* GL_APPLE_float_pixels */
+
+#ifndef GL_APPLE_flush_buffer_range
+#define GL_APPLE_flush_buffer_range 1
+#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12
+#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13
+typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param);
+GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size);
+#endif
+#endif /* GL_APPLE_flush_buffer_range */
+
+#ifndef GL_APPLE_object_purgeable
+#define GL_APPLE_object_purgeable 1
+#define GL_BUFFER_OBJECT_APPLE 0x85B3
+#define GL_RELEASED_APPLE 0x8A19
+#define GL_VOLATILE_APPLE 0x8A1A
+#define GL_RETAINED_APPLE 0x8A1B
+#define GL_UNDEFINED_APPLE 0x8A1C
+#define GL_PURGEABLE_APPLE 0x8A1D
+typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option);
+GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option);
+GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params);
+#endif
+#endif /* GL_APPLE_object_purgeable */
+
+#ifndef GL_APPLE_rgb_422
+#define GL_APPLE_rgb_422 1
+#define GL_RGB_422_APPLE 0x8A1F
+#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
+#define GL_RGB_RAW_422_APPLE 0x8A51
+#endif /* GL_APPLE_rgb_422 */
+
+#ifndef GL_APPLE_row_bytes
+#define GL_APPLE_row_bytes 1
+#define GL_PACK_ROW_BYTES_APPLE 0x8A15
+#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16
+#endif /* GL_APPLE_row_bytes */
+
+#ifndef GL_APPLE_specular_vector
+#define GL_APPLE_specular_vector 1
+#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0
+#endif /* GL_APPLE_specular_vector */
+
+#ifndef GL_APPLE_texture_range
+#define GL_APPLE_texture_range 1
+#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7
+#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8
+#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
+#define GL_STORAGE_PRIVATE_APPLE 0x85BD
+#define GL_STORAGE_CACHED_APPLE 0x85BE
+#define GL_STORAGE_SHARED_APPLE 0x85BF
+typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer);
+GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params);
+#endif
+#endif /* GL_APPLE_texture_range */
+
+#ifndef GL_APPLE_transform_hint
+#define GL_APPLE_transform_hint 1
+#define GL_TRANSFORM_HINT_APPLE 0x85B1
+#endif /* GL_APPLE_transform_hint */
+
+#ifndef GL_APPLE_vertex_array_object
+#define GL_APPLE_vertex_array_object 1
+#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5
+typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
+typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
+typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays);
+typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array);
+GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays);
+GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays);
+GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array);
+#endif
+#endif /* GL_APPLE_vertex_array_object */
+
+#ifndef GL_APPLE_vertex_array_range
+#define GL_APPLE_vertex_array_range 1
+#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E
+#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F
+#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521
+#define GL_STORAGE_CLIENT_APPLE 0x85B4
+typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);
+typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);
+typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer);
+GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer);
+GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param);
+#endif
+#endif /* GL_APPLE_vertex_array_range */
+
+#ifndef GL_APPLE_vertex_program_evaluators
+#define GL_APPLE_vertex_program_evaluators 1
+#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00
+#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01
+#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02
+#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03
+#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04
+#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05
+#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06
+#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07
+#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08
+#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09
+typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname);
+GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname);
+GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname);
+GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
+GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
+GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
+GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
+#endif
+#endif /* GL_APPLE_vertex_program_evaluators */
+
+#ifndef GL_APPLE_ycbcr_422
+#define GL_APPLE_ycbcr_422 1
+#define GL_YCBCR_422_APPLE 0x85B9
+#endif /* GL_APPLE_ycbcr_422 */
+
+#ifndef GL_ATI_draw_buffers
+#define GL_ATI_draw_buffers 1
+#define GL_MAX_DRAW_BUFFERS_ATI 0x8824
+#define GL_DRAW_BUFFER0_ATI 0x8825
+#define GL_DRAW_BUFFER1_ATI 0x8826
+#define GL_DRAW_BUFFER2_ATI 0x8827
+#define GL_DRAW_BUFFER3_ATI 0x8828
+#define GL_DRAW_BUFFER4_ATI 0x8829
+#define GL_DRAW_BUFFER5_ATI 0x882A
+#define GL_DRAW_BUFFER6_ATI 0x882B
+#define GL_DRAW_BUFFER7_ATI 0x882C
+#define GL_DRAW_BUFFER8_ATI 0x882D
+#define GL_DRAW_BUFFER9_ATI 0x882E
+#define GL_DRAW_BUFFER10_ATI 0x882F
+#define GL_DRAW_BUFFER11_ATI 0x8830
+#define GL_DRAW_BUFFER12_ATI 0x8831
+#define GL_DRAW_BUFFER13_ATI 0x8832
+#define GL_DRAW_BUFFER14_ATI 0x8833
+#define GL_DRAW_BUFFER15_ATI 0x8834
+typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs);
+#endif
+#endif /* GL_ATI_draw_buffers */
+
+#ifndef GL_ATI_element_array
+#define GL_ATI_element_array 1
+#define GL_ELEMENT_ARRAY_ATI 0x8768
+#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769
+#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A
+typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer);
+typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer);
+GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count);
+GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count);
+#endif
+#endif /* GL_ATI_element_array */
+
+#ifndef GL_ATI_envmap_bumpmap
+#define GL_ATI_envmap_bumpmap 1
+#define GL_BUMP_ROT_MATRIX_ATI 0x8775
+#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776
+#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777
+#define GL_BUMP_TEX_UNITS_ATI 0x8778
+#define GL_DUDV_ATI 0x8779
+#define GL_DU8DV8_ATI 0x877A
+#define GL_BUMP_ENVMAP_ATI 0x877B
+#define GL_BUMP_TARGET_ATI 0x877C
+typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param);
+typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param);
+typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param);
+typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param);
+GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param);
+GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param);
+GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param);
+#endif
+#endif /* GL_ATI_envmap_bumpmap */
+
+#ifndef GL_ATI_fragment_shader
+#define GL_ATI_fragment_shader 1
+#define GL_FRAGMENT_SHADER_ATI 0x8920
+#define GL_REG_0_ATI 0x8921
+#define GL_REG_1_ATI 0x8922
+#define GL_REG_2_ATI 0x8923
+#define GL_REG_3_ATI 0x8924
+#define GL_REG_4_ATI 0x8925
+#define GL_REG_5_ATI 0x8926
+#define GL_REG_6_ATI 0x8927
+#define GL_REG_7_ATI 0x8928
+#define GL_REG_8_ATI 0x8929
+#define GL_REG_9_ATI 0x892A
+#define GL_REG_10_ATI 0x892B
+#define GL_REG_11_ATI 0x892C
+#define GL_REG_12_ATI 0x892D
+#define GL_REG_13_ATI 0x892E
+#define GL_REG_14_ATI 0x892F
+#define GL_REG_15_ATI 0x8930
+#define GL_REG_16_ATI 0x8931
+#define GL_REG_17_ATI 0x8932
+#define GL_REG_18_ATI 0x8933
+#define GL_REG_19_ATI 0x8934
+#define GL_REG_20_ATI 0x8935
+#define GL_REG_21_ATI 0x8936
+#define GL_REG_22_ATI 0x8937
+#define GL_REG_23_ATI 0x8938
+#define GL_REG_24_ATI 0x8939
+#define GL_REG_25_ATI 0x893A
+#define GL_REG_26_ATI 0x893B
+#define GL_REG_27_ATI 0x893C
+#define GL_REG_28_ATI 0x893D
+#define GL_REG_29_ATI 0x893E
+#define GL_REG_30_ATI 0x893F
+#define GL_REG_31_ATI 0x8940
+#define GL_CON_0_ATI 0x8941
+#define GL_CON_1_ATI 0x8942
+#define GL_CON_2_ATI 0x8943
+#define GL_CON_3_ATI 0x8944
+#define GL_CON_4_ATI 0x8945
+#define GL_CON_5_ATI 0x8946
+#define GL_CON_6_ATI 0x8947
+#define GL_CON_7_ATI 0x8948
+#define GL_CON_8_ATI 0x8949
+#define GL_CON_9_ATI 0x894A
+#define GL_CON_10_ATI 0x894B
+#define GL_CON_11_ATI 0x894C
+#define GL_CON_12_ATI 0x894D
+#define GL_CON_13_ATI 0x894E
+#define GL_CON_14_ATI 0x894F
+#define GL_CON_15_ATI 0x8950
+#define GL_CON_16_ATI 0x8951
+#define GL_CON_17_ATI 0x8952
+#define GL_CON_18_ATI 0x8953
+#define GL_CON_19_ATI 0x8954
+#define GL_CON_20_ATI 0x8955
+#define GL_CON_21_ATI 0x8956
+#define GL_CON_22_ATI 0x8957
+#define GL_CON_23_ATI 0x8958
+#define GL_CON_24_ATI 0x8959
+#define GL_CON_25_ATI 0x895A
+#define GL_CON_26_ATI 0x895B
+#define GL_CON_27_ATI 0x895C
+#define GL_CON_28_ATI 0x895D
+#define GL_CON_29_ATI 0x895E
+#define GL_CON_30_ATI 0x895F
+#define GL_CON_31_ATI 0x8960
+#define GL_MOV_ATI 0x8961
+#define GL_ADD_ATI 0x8963
+#define GL_MUL_ATI 0x8964
+#define GL_SUB_ATI 0x8965
+#define GL_DOT3_ATI 0x8966
+#define GL_DOT4_ATI 0x8967
+#define GL_MAD_ATI 0x8968
+#define GL_LERP_ATI 0x8969
+#define GL_CND_ATI 0x896A
+#define GL_CND0_ATI 0x896B
+#define GL_DOT2_ADD_ATI 0x896C
+#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D
+#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E
+#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F
+#define GL_NUM_PASSES_ATI 0x8970
+#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971
+#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972
+#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973
+#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974
+#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975
+#define GL_SWIZZLE_STR_ATI 0x8976
+#define GL_SWIZZLE_STQ_ATI 0x8977
+#define GL_SWIZZLE_STR_DR_ATI 0x8978
+#define GL_SWIZZLE_STQ_DQ_ATI 0x8979
+#define GL_SWIZZLE_STRQ_ATI 0x897A
+#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B
+#define GL_RED_BIT_ATI 0x00000001
+#define GL_GREEN_BIT_ATI 0x00000002
+#define GL_BLUE_BIT_ATI 0x00000004
+#define GL_2X_BIT_ATI 0x00000001
+#define GL_4X_BIT_ATI 0x00000002
+#define GL_8X_BIT_ATI 0x00000004
+#define GL_HALF_BIT_ATI 0x00000008
+#define GL_QUARTER_BIT_ATI 0x00000010
+#define GL_EIGHTH_BIT_ATI 0x00000020
+#define GL_SATURATE_BIT_ATI 0x00000040
+#define GL_COMP_BIT_ATI 0x00000002
+#define GL_NEGATE_BIT_ATI 0x00000004
+#define GL_BIAS_BIT_ATI 0x00000008
+typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);
+typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void);
+typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void);
+typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);
+typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);
+typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range);
+GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id);
+GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id);
+GLAPI void APIENTRY glBeginFragmentShaderATI (void);
+GLAPI void APIENTRY glEndFragmentShaderATI (void);
+GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle);
+GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle);
+GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+GLAPI void APIENTRY glColorFragmentOp3ATI (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);
+GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);
+GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);
+GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);
+GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value);
+#endif
+#endif /* GL_ATI_fragment_shader */
+
+#ifndef GL_ATI_map_object_buffer
+#define GL_ATI_map_object_buffer 1
+typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer);
+GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer);
+#endif
+#endif /* GL_ATI_map_object_buffer */
+
+#ifndef GL_ATI_meminfo
+#define GL_ATI_meminfo 1
+#define GL_VBO_FREE_MEMORY_ATI 0x87FB
+#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
+#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
+#endif /* GL_ATI_meminfo */
+
+#ifndef GL_ATI_pixel_format_float
+#define GL_ATI_pixel_format_float 1
+#define GL_RGBA_FLOAT_MODE_ATI 0x8820
+#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835
+#endif /* GL_ATI_pixel_format_float */
+
+#ifndef GL_ATI_pn_triangles
+#define GL_ATI_pn_triangles 1
+#define GL_PN_TRIANGLES_ATI 0x87F0
+#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1
+#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2
+#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3
+#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4
+#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5
+#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6
+#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7
+#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8
+typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param);
+GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param);
+#endif
+#endif /* GL_ATI_pn_triangles */
+
+#ifndef GL_ATI_separate_stencil
+#define GL_ATI_separate_stencil 1
+#define GL_STENCIL_BACK_FUNC_ATI 0x8800
+#define GL_STENCIL_BACK_FAIL_ATI 0x8801
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803
+typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
+GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);
+#endif
+#endif /* GL_ATI_separate_stencil */
+
+#ifndef GL_ATI_text_fragment_shader
+#define GL_ATI_text_fragment_shader 1
+#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200
+#endif /* GL_ATI_text_fragment_shader */
+
+#ifndef GL_ATI_texture_env_combine3
+#define GL_ATI_texture_env_combine3 1
+#define GL_MODULATE_ADD_ATI 0x8744
+#define GL_MODULATE_SIGNED_ADD_ATI 0x8745
+#define GL_MODULATE_SUBTRACT_ATI 0x8746
+#endif /* GL_ATI_texture_env_combine3 */
+
+#ifndef GL_ATI_texture_float
+#define GL_ATI_texture_float 1
+#define GL_RGBA_FLOAT32_ATI 0x8814
+#define GL_RGB_FLOAT32_ATI 0x8815
+#define GL_ALPHA_FLOAT32_ATI 0x8816
+#define GL_INTENSITY_FLOAT32_ATI 0x8817
+#define GL_LUMINANCE_FLOAT32_ATI 0x8818
+#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819
+#define GL_RGBA_FLOAT16_ATI 0x881A
+#define GL_RGB_FLOAT16_ATI 0x881B
+#define GL_ALPHA_FLOAT16_ATI 0x881C
+#define GL_INTENSITY_FLOAT16_ATI 0x881D
+#define GL_LUMINANCE_FLOAT16_ATI 0x881E
+#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F
+#endif /* GL_ATI_texture_float */
+
+#ifndef GL_ATI_texture_mirror_once
+#define GL_ATI_texture_mirror_once 1
+#define GL_MIRROR_CLAMP_ATI 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
+#endif /* GL_ATI_texture_mirror_once */
+
+#ifndef GL_ATI_vertex_array_object
+#define GL_ATI_vertex_array_object 1
+#define GL_STATIC_ATI 0x8760
+#define GL_DYNAMIC_ATI 0x8761
+#define GL_PRESERVE_ATI 0x8762
+#define GL_DISCARD_ATI 0x8763
+#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764
+#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765
+#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766
+#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767
+typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage);
+typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve);
+typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage);
+GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer);
+GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve);
+GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params);
+GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer);
+GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params);
+GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);
+GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params);
+#endif
+#endif /* GL_ATI_vertex_array_object */
+
+#ifndef GL_ATI_vertex_attrib_array_object
+#define GL_ATI_vertex_attrib_array_object 1
+typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);
+GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params);
+#endif
+#endif /* GL_ATI_vertex_attrib_array_object */
+
+#ifndef GL_ATI_vertex_streams
+#define GL_ATI_vertex_streams 1
+#define GL_MAX_VERTEX_STREAMS_ATI 0x876B
+#define GL_VERTEX_STREAM0_ATI 0x876C
+#define GL_VERTEX_STREAM1_ATI 0x876D
+#define GL_VERTEX_STREAM2_ATI 0x876E
+#define GL_VERTEX_STREAM3_ATI 0x876F
+#define GL_VERTEX_STREAM4_ATI 0x8770
+#define GL_VERTEX_STREAM5_ATI 0x8771
+#define GL_VERTEX_STREAM6_ATI 0x8772
+#define GL_VERTEX_STREAM7_ATI 0x8773
+#define GL_VERTEX_SOURCE_ATI 0x8774
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz);
+typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords);
+typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);
+typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x);
+GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords);
+GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x);
+GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords);
+GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x);
+GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords);
+GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x);
+GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords);
+GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y);
+GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords);
+GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y);
+GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords);
+GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y);
+GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords);
+GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords);
+GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords);
+GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z);
+GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords);
+GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords);
+GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords);
+GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords);
+GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w);
+GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords);
+GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords);
+GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords);
+GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz);
+GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords);
+GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz);
+GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords);
+GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz);
+GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords);
+GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz);
+GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords);
+GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz);
+GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords);
+GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream);
+GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param);
+GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param);
+#endif
+#endif /* GL_ATI_vertex_streams */
+
+#ifndef GL_EXT_422_pixels
+#define GL_EXT_422_pixels 1
+#define GL_422_EXT 0x80CC
+#define GL_422_REV_EXT 0x80CD
+#define GL_422_AVERAGE_EXT 0x80CE
+#define GL_422_REV_AVERAGE_EXT 0x80CF
+#endif /* GL_EXT_422_pixels */
+
+#ifndef GL_EXT_abgr
+#define GL_EXT_abgr 1
+#define GL_ABGR_EXT 0x8000
+#endif /* GL_EXT_abgr */
+
+#ifndef GL_EXT_bgra
+#define GL_EXT_bgra 1
+#define GL_BGR_EXT 0x80E0
+#define GL_BGRA_EXT 0x80E1
+#endif /* GL_EXT_bgra */
+
+#ifndef GL_EXT_bindable_uniform
+#define GL_EXT_bindable_uniform 1
+#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2
+#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3
+#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4
+#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED
+#define GL_UNIFORM_BUFFER_EXT 0x8DEE
+#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF
+typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer);
+typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location);
+typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer);
+GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location);
+GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location);
+#endif
+#endif /* GL_EXT_bindable_uniform */
+
+#ifndef GL_EXT_blend_color
+#define GL_EXT_blend_color 1
+#define GL_CONSTANT_COLOR_EXT 0x8001
+#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002
+#define GL_CONSTANT_ALPHA_EXT 0x8003
+#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004
+#define GL_BLEND_COLOR_EXT 0x8005
+typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+#endif
+#endif /* GL_EXT_blend_color */
+
+#ifndef GL_EXT_blend_equation_separate
+#define GL_EXT_blend_equation_separate 1
+#define GL_BLEND_EQUATION_RGB_EXT 0x8009
+#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D
+typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha);
+#endif
+#endif /* GL_EXT_blend_equation_separate */
+
+#ifndef GL_EXT_blend_func_separate
+#define GL_EXT_blend_func_separate 1
+#define GL_BLEND_DST_RGB_EXT 0x80C8
+#define GL_BLEND_SRC_RGB_EXT 0x80C9
+#define GL_BLEND_DST_ALPHA_EXT 0x80CA
+#define GL_BLEND_SRC_ALPHA_EXT 0x80CB
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+#endif
+#endif /* GL_EXT_blend_func_separate */
+
+#ifndef GL_EXT_blend_logic_op
+#define GL_EXT_blend_logic_op 1
+#endif /* GL_EXT_blend_logic_op */
+
+#ifndef GL_EXT_blend_minmax
+#define GL_EXT_blend_minmax 1
+#define GL_MIN_EXT 0x8007
+#define GL_MAX_EXT 0x8008
+#define GL_FUNC_ADD_EXT 0x8006
+#define GL_BLEND_EQUATION_EXT 0x8009
+typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendEquationEXT (GLenum mode);
+#endif
+#endif /* GL_EXT_blend_minmax */
+
+#ifndef GL_EXT_blend_subtract
+#define GL_EXT_blend_subtract 1
+#define GL_FUNC_SUBTRACT_EXT 0x800A
+#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B
+#endif /* GL_EXT_blend_subtract */
+
+#ifndef GL_EXT_clip_volume_hint
+#define GL_EXT_clip_volume_hint 1
+#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0
+#endif /* GL_EXT_clip_volume_hint */
+
+#ifndef GL_EXT_cmyka
+#define GL_EXT_cmyka 1
+#define GL_CMYK_EXT 0x800C
+#define GL_CMYKA_EXT 0x800D
+#define GL_PACK_CMYK_HINT_EXT 0x800E
+#define GL_UNPACK_CMYK_HINT_EXT 0x800F
+#endif /* GL_EXT_cmyka */
+
+#ifndef GL_EXT_color_subtable
+#define GL_EXT_color_subtable 1
+typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
+typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data);
+GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
+#endif
+#endif /* GL_EXT_color_subtable */
+
+#ifndef GL_EXT_compiled_vertex_array
+#define GL_EXT_compiled_vertex_array 1
+#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8
+#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9
+typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);
+typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count);
+GLAPI void APIENTRY glUnlockArraysEXT (void);
+#endif
+#endif /* GL_EXT_compiled_vertex_array */
+
+#ifndef GL_EXT_convolution
+#define GL_EXT_convolution 1
+#define GL_CONVOLUTION_1D_EXT 0x8010
+#define GL_CONVOLUTION_2D_EXT 0x8011
+#define GL_SEPARABLE_2D_EXT 0x8012
+#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013
+#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014
+#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015
+#define GL_REDUCE_EXT 0x8016
+#define GL_CONVOLUTION_FORMAT_EXT 0x8017
+#define GL_CONVOLUTION_WIDTH_EXT 0x8018
+#define GL_CONVOLUTION_HEIGHT_EXT 0x8019
+#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A
+#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B
+#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C
+#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D
+#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E
+#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F
+#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020
+#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021
+#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022
+#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023
+typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
+typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params);
+typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image);
+typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
+typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image);
+GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image);
+GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params);
+GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params);
+GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image);
+GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span);
+GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column);
+#endif
+#endif /* GL_EXT_convolution */
+
+#ifndef GL_EXT_coordinate_frame
+#define GL_EXT_coordinate_frame 1
+#define GL_TANGENT_ARRAY_EXT 0x8439
+#define GL_BINORMAL_ARRAY_EXT 0x843A
+#define GL_CURRENT_TANGENT_EXT 0x843B
+#define GL_CURRENT_BINORMAL_EXT 0x843C
+#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E
+#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F
+#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440
+#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441
+#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442
+#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443
+#define GL_MAP1_TANGENT_EXT 0x8444
+#define GL_MAP2_TANGENT_EXT 0x8445
+#define GL_MAP1_BINORMAL_EXT 0x8446
+#define GL_MAP2_BINORMAL_EXT 0x8447
+typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz);
+typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v);
+typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz);
+typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz);
+typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz);
+typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz);
+typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz);
+typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v);
+typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz);
+typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz);
+typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz);
+typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz);
+typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz);
+GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v);
+GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz);
+GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v);
+GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz);
+GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v);
+GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz);
+GLAPI void APIENTRY glTangent3ivEXT (const GLint *v);
+GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz);
+GLAPI void APIENTRY glTangent3svEXT (const GLshort *v);
+GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz);
+GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v);
+GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz);
+GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v);
+GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz);
+GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v);
+GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz);
+GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v);
+GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz);
+GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v);
+GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer);
+#endif
+#endif /* GL_EXT_coordinate_frame */
+
+#ifndef GL_EXT_copy_texture
+#define GL_EXT_copy_texture 1
+typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);
+GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_EXT_copy_texture */
+
+#ifndef GL_EXT_cull_vertex
+#define GL_EXT_cull_vertex 1
+#define GL_CULL_VERTEX_EXT 0x81AA
+#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB
+#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC
+typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params);
+typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params);
+GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params);
+#endif
+#endif /* GL_EXT_cull_vertex */
+
+#ifndef GL_EXT_debug_label
+#define GL_EXT_debug_label 1
+#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F
+#define GL_PROGRAM_OBJECT_EXT 0x8B40
+#define GL_SHADER_OBJECT_EXT 0x8B48
+#define GL_BUFFER_OBJECT_EXT 0x9151
+#define GL_QUERY_OBJECT_EXT 0x9153
+#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154
+typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label);
+typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label);
+GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
+#endif
+#endif /* GL_EXT_debug_label */
+
+#ifndef GL_EXT_debug_marker
+#define GL_EXT_debug_marker 1
+typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker);
+GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker);
+GLAPI void APIENTRY glPopGroupMarkerEXT (void);
+#endif
+#endif /* GL_EXT_debug_marker */
+
+#ifndef GL_EXT_depth_bounds_test
+#define GL_EXT_depth_bounds_test 1
+#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890
+#define GL_DEPTH_BOUNDS_EXT 0x8891
+typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax);
+#endif
+#endif /* GL_EXT_depth_bounds_test */
+
+/* GL_EXT_direct_state_access */
+#ifndef GL_EXT_direct_state_access
+#define GL_EXT_direct_state_access 1
+#define GL_PROGRAM_MATRIX 0x8E2D
+#define GL_TRANSPOSE_PROGRAM_MATRIX 0x8E2E
+#define GL_PROGRAM_MATRIX_STACK_DEPTH 0x8E2F
+typedef void (APIENTRYP PFNGLMATRIXLOADFPROC) (GLenum mode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXLOADDPROC) (GLenum mode, const GLdouble *m);
+typedef void (APIENTRYP PFNGLMATRIXMULTFPROC) (GLenum mode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m);
+typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLMATRIXROTATEFPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLMATRIXROTATEDPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLMATRIXSCALEFPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLMATRIXSCALEDPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLMATRIXFRUSTUMPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (APIENTRYP PFNGLMATRIXORTHOPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+typedef void (APIENTRYP PFNGLMATRIXPOPPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLMATRIXPUSHPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFPROC) (GLenum mode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDPROC) (GLenum mode, const GLdouble *m);
+typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFPROC) (GLenum mode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDPROC) (GLenum mode, const GLdouble *m);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMatrixLoadf (GLenum mode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixLoadd (GLenum mode, const GLdouble *m);
+GLAPI void APIENTRY glMatrixMultf (GLenum mode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixMultd (GLenum mode, const GLdouble *m);
+GLAPI void APIENTRY glMatrixLoadIdentity (GLenum mode);
+GLAPI void APIENTRY glMatrixRotatef (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glMatrixRotated (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glMatrixScalef (GLenum mode, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glMatrixScaled (GLenum mode, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glMatrixTranslatef (GLenum mode, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glMatrixTranslated (GLenum mode, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glMatrixFrustum (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+GLAPI void APIENTRY glMatrixOrtho (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+GLAPI void APIENTRY glMatrixPop (GLenum mode);
+GLAPI void APIENTRY glMatrixPush (GLenum mode);
+GLAPI void APIENTRY glMatrixLoadTransposef (GLenum mode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixLoadTransposed (GLenum mode, const GLdouble *m);
+GLAPI void APIENTRY glMatrixMultTransposef (GLenum mode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixMultTransposed (GLenum mode, const GLdouble *m);
+#endif
+#endif /* GL_EXT_direct_state_access */
+
+#ifndef GL_EXT_draw_buffers2
+#define GL_EXT_draw_buffers2 1
+typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
+#endif
+#endif /* GL_EXT_draw_buffers2 */
+
+#ifndef GL_EXT_draw_instanced
+#define GL_EXT_draw_instanced 1
+typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
+typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount);
+GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
+#endif
+#endif /* GL_EXT_draw_instanced */
+
+#ifndef GL_EXT_draw_range_elements
+#define GL_EXT_draw_range_elements 1
+#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8
+#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9
+typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);
+#endif
+#endif /* GL_EXT_draw_range_elements */
+
+#ifndef GL_EXT_fog_coord
+#define GL_EXT_fog_coord 1
+#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450
+#define GL_FOG_COORDINATE_EXT 0x8451
+#define GL_FRAGMENT_DEPTH_EXT 0x8452
+#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453
+#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454
+#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455
+#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
+#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457
+typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord);
+typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord);
+typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord);
+typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord);
+typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord);
+GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord);
+GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord);
+GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord);
+GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer);
+#endif
+#endif /* GL_EXT_fog_coord */
+
+#ifndef GL_EXT_framebuffer_blit
+#define GL_EXT_framebuffer_blit 1
+#define GL_READ_FRAMEBUFFER_EXT 0x8CA8
+#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
+typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+#endif
+#endif /* GL_EXT_framebuffer_blit */
+
+#ifndef GL_EXT_framebuffer_multisample
+#define GL_EXT_framebuffer_multisample 1
+#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
+#define GL_MAX_SAMPLES_EXT 0x8D57
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_EXT_framebuffer_multisample */
+
+#ifndef GL_EXT_framebuffer_multisample_blit_scaled
+#define GL_EXT_framebuffer_multisample_blit_scaled 1
+#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA
+#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB
+#endif /* GL_EXT_framebuffer_multisample_blit_scaled */
+
+#ifndef GL_EXT_framebuffer_object
+#define GL_EXT_framebuffer_object 1
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
+#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
+#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
+#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
+#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
+#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
+#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
+#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
+#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
+#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
+#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
+#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
+#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
+#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
+#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
+#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
+#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
+#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
+#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
+#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
+#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
+#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
+#define GL_DEPTH_ATTACHMENT_EXT 0x8D00
+#define GL_STENCIL_ATTACHMENT_EXT 0x8D20
+#define GL_FRAMEBUFFER_EXT 0x8D40
+#define GL_RENDERBUFFER_EXT 0x8D41
+#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
+#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
+#define GL_STENCIL_INDEX1_EXT 0x8D46
+#define GL_STENCIL_INDEX4_EXT 0x8D47
+#define GL_STENCIL_INDEX8_EXT 0x8D48
+#define GL_STENCIL_INDEX16_EXT 0x8D49
+#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55
+typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers);
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer);
+typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer);
+typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers);
+typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers);
+typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer);
+GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer);
+GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers);
+GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers);
+GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params);
+GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer);
+GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer);
+GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers);
+GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers);
+GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target);
+GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target);
+#endif
+#endif /* GL_EXT_framebuffer_object */
+
+#ifndef GL_EXT_framebuffer_sRGB
+#define GL_EXT_framebuffer_sRGB 1
+#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
+#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA
+#endif /* GL_EXT_framebuffer_sRGB */
+
+#ifndef GL_EXT_geometry_shader4
+#define GL_EXT_geometry_shader4 1
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA
+#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE
+#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1
+#define GL_LINES_ADJACENCY_EXT 0x000A
+#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B
+#define GL_TRIANGLES_ADJACENCY_EXT 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4
+#define GL_PROGRAM_POINT_SIZE_EXT 0x8642
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value);
+#endif
+#endif /* GL_EXT_geometry_shader4 */
+
+#ifndef GL_EXT_gpu_program_parameters
+#define GL_EXT_gpu_program_parameters 1
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params);
+GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params);
+#endif
+#endif /* GL_EXT_gpu_program_parameters */
+
+#ifndef GL_EXT_gpu_shader4
+#define GL_EXT_gpu_shader4 1
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD
+#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0
+#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1
+#define GL_SAMPLER_BUFFER_EXT 0x8DC2
+#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3
+#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5
+#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6
+#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7
+#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8
+#define GL_INT_SAMPLER_1D_EXT 0x8DC9
+#define GL_INT_SAMPLER_2D_EXT 0x8DCA
+#define GL_INT_SAMPLER_3D_EXT 0x8DCB
+#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC
+#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD
+#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE
+#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF
+#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1
+#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8
+#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905
+typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params);
+typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0);
+typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1);
+typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params);
+GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name);
+GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0);
+GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1);
+GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2);
+GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value);
+GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value);
+#endif
+#endif /* GL_EXT_gpu_shader4 */
+
+#ifndef GL_EXT_histogram
+#define GL_EXT_histogram 1
+#define GL_HISTOGRAM_EXT 0x8024
+#define GL_PROXY_HISTOGRAM_EXT 0x8025
+#define GL_HISTOGRAM_WIDTH_EXT 0x8026
+#define GL_HISTOGRAM_FORMAT_EXT 0x8027
+#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028
+#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029
+#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A
+#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B
+#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C
+#define GL_HISTOGRAM_SINK_EXT 0x802D
+#define GL_MINMAX_EXT 0x802E
+#define GL_MINMAX_FORMAT_EXT 0x802F
+#define GL_MINMAX_SINK_EXT 0x8030
+#define GL_TABLE_TOO_LARGE_EXT 0x8031
+typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);
+typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values);
+GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
+GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink);
+GLAPI void APIENTRY glResetHistogramEXT (GLenum target);
+GLAPI void APIENTRY glResetMinmaxEXT (GLenum target);
+#endif
+#endif /* GL_EXT_histogram */
+
+#ifndef GL_EXT_index_array_formats
+#define GL_EXT_index_array_formats 1
+#define GL_IUI_V2F_EXT 0x81AD
+#define GL_IUI_V3F_EXT 0x81AE
+#define GL_IUI_N3F_V2F_EXT 0x81AF
+#define GL_IUI_N3F_V3F_EXT 0x81B0
+#define GL_T2F_IUI_V2F_EXT 0x81B1
+#define GL_T2F_IUI_V3F_EXT 0x81B2
+#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3
+#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4
+#endif /* GL_EXT_index_array_formats */
+
+#ifndef GL_EXT_index_func
+#define GL_EXT_index_func 1
+#define GL_INDEX_TEST_EXT 0x81B5
+#define GL_INDEX_TEST_FUNC_EXT 0x81B6
+#define GL_INDEX_TEST_REF_EXT 0x81B7
+typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref);
+#endif
+#endif /* GL_EXT_index_func */
+
+#ifndef GL_EXT_index_material
+#define GL_EXT_index_material 1
+#define GL_INDEX_MATERIAL_EXT 0x81B8
+#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9
+#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA
+typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode);
+#endif
+#endif /* GL_EXT_index_material */
+
+#ifndef GL_EXT_index_texture
+#define GL_EXT_index_texture 1
+#endif /* GL_EXT_index_texture */
+
+#ifndef GL_EXT_light_texture
+#define GL_EXT_light_texture 1
+#define GL_FRAGMENT_MATERIAL_EXT 0x8349
+#define GL_FRAGMENT_NORMAL_EXT 0x834A
+#define GL_FRAGMENT_COLOR_EXT 0x834C
+#define GL_ATTENUATION_EXT 0x834D
+#define GL_SHADOW_ATTENUATION_EXT 0x834E
+#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F
+#define GL_TEXTURE_LIGHT_EXT 0x8350
+#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351
+#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352
+typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);
+typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname);
+typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glApplyTextureEXT (GLenum mode);
+GLAPI void APIENTRY glTextureLightEXT (GLenum pname);
+GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode);
+#endif
+#endif /* GL_EXT_light_texture */
+
+#ifndef GL_EXT_misc_attribute
+#define GL_EXT_misc_attribute 1
+#endif /* GL_EXT_misc_attribute */
+
+#ifndef GL_EXT_multi_draw_arrays
+#define GL_EXT_multi_draw_arrays 1
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);
+GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount);
+#endif
+#endif /* GL_EXT_multi_draw_arrays */
+
+#ifndef GL_EXT_multisample
+#define GL_EXT_multisample 1
+#define GL_MULTISAMPLE_EXT 0x809D
+#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F
+#define GL_SAMPLE_MASK_EXT 0x80A0
+#define GL_1PASS_EXT 0x80A1
+#define GL_2PASS_0_EXT 0x80A2
+#define GL_2PASS_1_EXT 0x80A3
+#define GL_4PASS_0_EXT 0x80A4
+#define GL_4PASS_1_EXT 0x80A5
+#define GL_4PASS_2_EXT 0x80A6
+#define GL_4PASS_3_EXT 0x80A7
+#define GL_SAMPLE_BUFFERS_EXT 0x80A8
+#define GL_SAMPLES_EXT 0x80A9
+#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA
+#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB
+#define GL_SAMPLE_PATTERN_EXT 0x80AC
+#define GL_MULTISAMPLE_BIT_EXT 0x20000000
+typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);
+typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert);
+GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern);
+#endif
+#endif /* GL_EXT_multisample */
+
+#ifndef GL_EXT_packed_depth_stencil
+#define GL_EXT_packed_depth_stencil 1
+#define GL_DEPTH_STENCIL_EXT 0x84F9
+#define GL_UNSIGNED_INT_24_8_EXT 0x84FA
+#define GL_DEPTH24_STENCIL8_EXT 0x88F0
+#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
+#endif /* GL_EXT_packed_depth_stencil */
+
+#ifndef GL_EXT_packed_float
+#define GL_EXT_packed_float 1
+#define GL_R11F_G11F_B10F_EXT 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B
+#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C
+#endif /* GL_EXT_packed_float */
+
+#ifndef GL_EXT_packed_pixels
+#define GL_EXT_packed_pixels 1
+#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032
+#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033
+#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034
+#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035
+#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036
+#endif /* GL_EXT_packed_pixels */
+
+#ifndef GL_EXT_paletted_texture
+#define GL_EXT_paletted_texture 1
+#define GL_COLOR_INDEX1_EXT 0x80E2
+#define GL_COLOR_INDEX2_EXT 0x80E3
+#define GL_COLOR_INDEX4_EXT 0x80E4
+#define GL_COLOR_INDEX8_EXT 0x80E5
+#define GL_COLOR_INDEX12_EXT 0x80E6
+#define GL_COLOR_INDEX16_EXT 0x80E7
+#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED
+typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table);
+GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data);
+GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);
+#endif
+#endif /* GL_EXT_paletted_texture */
+
+#ifndef GL_EXT_pixel_buffer_object
+#define GL_EXT_pixel_buffer_object 1
+#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB
+#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF
+#endif /* GL_EXT_pixel_buffer_object */
+
+#ifndef GL_EXT_pixel_transform
+#define GL_EXT_pixel_transform 1
+#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330
+#define GL_PIXEL_MAG_FILTER_EXT 0x8331
+#define GL_PIXEL_MIN_FILTER_EXT 0x8332
+#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333
+#define GL_CUBIC_EXT 0x8334
+#define GL_AVERAGE_EXT 0x8335
+#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336
+#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337
+#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338
+typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param);
+GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params);
+#endif
+#endif /* GL_EXT_pixel_transform */
+
+#ifndef GL_EXT_pixel_transform_color_table
+#define GL_EXT_pixel_transform_color_table 1
+#endif /* GL_EXT_pixel_transform_color_table */
+
+#ifndef GL_EXT_point_parameters
+#define GL_EXT_point_parameters 1
+#define GL_POINT_SIZE_MIN_EXT 0x8126
+#define GL_POINT_SIZE_MAX_EXT 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128
+#define GL_DISTANCE_ATTENUATION_EXT 0x8129
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params);
+#endif
+#endif /* GL_EXT_point_parameters */
+
+#ifndef GL_EXT_polygon_offset
+#define GL_EXT_polygon_offset 1
+#define GL_POLYGON_OFFSET_EXT 0x8037
+#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038
+#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039
+typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias);
+#endif
+#endif /* GL_EXT_polygon_offset */
+
+#ifndef GL_EXT_polygon_offset_clamp
+#define GL_EXT_polygon_offset_clamp 1
+#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B
+typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp);
+#endif
+#endif /* GL_EXT_polygon_offset_clamp */
+
+#ifndef GL_EXT_provoking_vertex
+#define GL_EXT_provoking_vertex 1
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E
+#define GL_PROVOKING_VERTEX_EXT 0x8E4F
+typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode);
+#endif
+#endif /* GL_EXT_provoking_vertex */
+
+#ifndef GL_EXT_rescale_normal
+#define GL_EXT_rescale_normal 1
+#define GL_RESCALE_NORMAL_EXT 0x803A
+#endif /* GL_EXT_rescale_normal */
+
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 1
+#define GL_COLOR_SUM_EXT 0x8458
+#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459
+#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A
+#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C
+#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
+#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue);
+GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v);
+GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue);
+GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v);
+GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue);
+GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v);
+GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue);
+GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v);
+GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue);
+GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v);
+GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue);
+GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v);
+GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue);
+GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v);
+GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue);
+GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v);
+GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer);
+#endif
+#endif /* GL_EXT_secondary_color */
+
+#ifndef GL_EXT_separate_shader_objects
+#define GL_EXT_separate_shader_objects 1
+#define GL_ACTIVE_PROGRAM_EXT 0x8B8D
+typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program);
+typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program);
+typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program);
+GLAPI void APIENTRY glActiveProgramEXT (GLuint program);
+GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string);
+#endif
+#endif /* GL_EXT_separate_shader_objects */
+
+#ifndef GL_EXT_separate_specular_color
+#define GL_EXT_separate_specular_color 1
+#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8
+#define GL_SINGLE_COLOR_EXT 0x81F9
+#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA
+#endif /* GL_EXT_separate_specular_color */
+
+#ifndef GL_EXT_shader_image_load_formatted
+#define GL_EXT_shader_image_load_formatted 1
+#endif /* GL_EXT_shader_image_load_formatted */
+
+#ifndef GL_EXT_shader_image_load_store
+#define GL_EXT_shader_image_load_store 1
+#define GL_MAX_IMAGE_UNITS_EXT 0x8F38
+#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39
+#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C
+#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E
+#define GL_IMAGE_1D_EXT 0x904C
+#define GL_IMAGE_2D_EXT 0x904D
+#define GL_IMAGE_3D_EXT 0x904E
+#define GL_IMAGE_2D_RECT_EXT 0x904F
+#define GL_IMAGE_CUBE_EXT 0x9050
+#define GL_IMAGE_BUFFER_EXT 0x9051
+#define GL_IMAGE_1D_ARRAY_EXT 0x9052
+#define GL_IMAGE_2D_ARRAY_EXT 0x9053
+#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054
+#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055
+#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056
+#define GL_INT_IMAGE_1D_EXT 0x9057
+#define GL_INT_IMAGE_2D_EXT 0x9058
+#define GL_INT_IMAGE_3D_EXT 0x9059
+#define GL_INT_IMAGE_2D_RECT_EXT 0x905A
+#define GL_INT_IMAGE_CUBE_EXT 0x905B
+#define GL_INT_IMAGE_BUFFER_EXT 0x905C
+#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D
+#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F
+#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060
+#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061
+#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062
+#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064
+#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065
+#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066
+#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067
+#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C
+#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D
+#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020
+#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000
+#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF
+typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format);
+typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format);
+GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers);
+#endif
+#endif /* GL_EXT_shader_image_load_store */
+
+#ifndef GL_EXT_shader_integer_mix
+#define GL_EXT_shader_integer_mix 1
+#endif /* GL_EXT_shader_integer_mix */
+
+#ifndef GL_EXT_shadow_funcs
+#define GL_EXT_shadow_funcs 1
+#endif /* GL_EXT_shadow_funcs */
+
+#ifndef GL_EXT_shared_texture_palette
+#define GL_EXT_shared_texture_palette 1
+#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB
+#endif /* GL_EXT_shared_texture_palette */
+
+#ifndef GL_EXT_stencil_clear_tag
+#define GL_EXT_stencil_clear_tag 1
+#define GL_STENCIL_TAG_BITS_EXT 0x88F2
+#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3
+typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag);
+#endif
+#endif /* GL_EXT_stencil_clear_tag */
+
+#ifndef GL_EXT_stencil_two_side
+#define GL_EXT_stencil_two_side 1
+#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910
+#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911
+typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face);
+#endif
+#endif /* GL_EXT_stencil_two_side */
+
+#ifndef GL_EXT_stencil_wrap
+#define GL_EXT_stencil_wrap 1
+#define GL_INCR_WRAP_EXT 0x8507
+#define GL_DECR_WRAP_EXT 0x8508
+#endif /* GL_EXT_stencil_wrap */
+
+#ifndef GL_EXT_subtexture
+#define GL_EXT_subtexture 1
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
+#endif
+#endif /* GL_EXT_subtexture */
+
+#ifndef GL_EXT_texture
+#define GL_EXT_texture 1
+#define GL_ALPHA4_EXT 0x803B
+#define GL_ALPHA8_EXT 0x803C
+#define GL_ALPHA12_EXT 0x803D
+#define GL_ALPHA16_EXT 0x803E
+#define GL_LUMINANCE4_EXT 0x803F
+#define GL_LUMINANCE8_EXT 0x8040
+#define GL_LUMINANCE12_EXT 0x8041
+#define GL_LUMINANCE16_EXT 0x8042
+#define GL_LUMINANCE4_ALPHA4_EXT 0x8043
+#define GL_LUMINANCE6_ALPHA2_EXT 0x8044
+#define GL_LUMINANCE8_ALPHA8_EXT 0x8045
+#define GL_LUMINANCE12_ALPHA4_EXT 0x8046
+#define GL_LUMINANCE12_ALPHA12_EXT 0x8047
+#define GL_LUMINANCE16_ALPHA16_EXT 0x8048
+#define GL_INTENSITY_EXT 0x8049
+#define GL_INTENSITY4_EXT 0x804A
+#define GL_INTENSITY8_EXT 0x804B
+#define GL_INTENSITY12_EXT 0x804C
+#define GL_INTENSITY16_EXT 0x804D
+#define GL_RGB2_EXT 0x804E
+#define GL_RGB4_EXT 0x804F
+#define GL_RGB5_EXT 0x8050
+#define GL_RGB8_EXT 0x8051
+#define GL_RGB10_EXT 0x8052
+#define GL_RGB12_EXT 0x8053
+#define GL_RGB16_EXT 0x8054
+#define GL_RGBA2_EXT 0x8055
+#define GL_RGBA4_EXT 0x8056
+#define GL_RGB5_A1_EXT 0x8057
+#define GL_RGBA8_EXT 0x8058
+#define GL_RGB10_A2_EXT 0x8059
+#define GL_RGBA12_EXT 0x805A
+#define GL_RGBA16_EXT 0x805B
+#define GL_TEXTURE_RED_SIZE_EXT 0x805C
+#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D
+#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E
+#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F
+#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060
+#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061
+#define GL_REPLACE_EXT 0x8062
+#define GL_PROXY_TEXTURE_1D_EXT 0x8063
+#define GL_PROXY_TEXTURE_2D_EXT 0x8064
+#define GL_TEXTURE_TOO_LARGE_EXT 0x8065
+#endif /* GL_EXT_texture */
+
+#ifndef GL_EXT_texture3D
+#define GL_EXT_texture3D 1
+#define GL_PACK_SKIP_IMAGES_EXT 0x806B
+#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C
+#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D
+#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E
+#define GL_TEXTURE_3D_EXT 0x806F
+#define GL_PROXY_TEXTURE_3D_EXT 0x8070
+#define GL_TEXTURE_DEPTH_EXT 0x8071
+#define GL_TEXTURE_WRAP_R_EXT 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073
+typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+#endif
+#endif /* GL_EXT_texture3D */
+
+#ifndef GL_EXT_texture_array
+#define GL_EXT_texture_array 1
+#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18
+#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19
+#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A
+#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B
+#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C
+#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D
+#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF
+#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+#endif
+#endif /* GL_EXT_texture_array */
+
+#ifndef GL_EXT_texture_buffer_object
+#define GL_EXT_texture_buffer_object 1
+#define GL_TEXTURE_BUFFER_EXT 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D
+#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E
+typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer);
+#endif
+#endif /* GL_EXT_texture_buffer_object */
+
+#ifndef GL_EXT_texture_compression_latc
+#define GL_EXT_texture_compression_latc 1
+#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
+#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71
+#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
+#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73
+#endif /* GL_EXT_texture_compression_latc */
+
+#ifndef GL_EXT_texture_compression_rgtc
+#define GL_EXT_texture_compression_rgtc 1
+#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB
+#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC
+#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD
+#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
+#endif /* GL_EXT_texture_compression_rgtc */
+
+#ifndef GL_EXT_texture_compression_s3tc
+#define GL_EXT_texture_compression_s3tc 1
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+#endif /* GL_EXT_texture_compression_s3tc */
+
+#ifndef GL_EXT_texture_cube_map
+#define GL_EXT_texture_cube_map 1
+#define GL_NORMAL_MAP_EXT 0x8511
+#define GL_REFLECTION_MAP_EXT 0x8512
+#define GL_TEXTURE_CUBE_MAP_EXT 0x8513
+#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A
+#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C
+#endif /* GL_EXT_texture_cube_map */
+
+#ifndef GL_EXT_texture_env_add
+#define GL_EXT_texture_env_add 1
+#endif /* GL_EXT_texture_env_add */
+
+#ifndef GL_EXT_texture_env_combine
+#define GL_EXT_texture_env_combine 1
+#define GL_COMBINE_EXT 0x8570
+#define GL_COMBINE_RGB_EXT 0x8571
+#define GL_COMBINE_ALPHA_EXT 0x8572
+#define GL_RGB_SCALE_EXT 0x8573
+#define GL_ADD_SIGNED_EXT 0x8574
+#define GL_INTERPOLATE_EXT 0x8575
+#define GL_CONSTANT_EXT 0x8576
+#define GL_PRIMARY_COLOR_EXT 0x8577
+#define GL_PREVIOUS_EXT 0x8578
+#define GL_SOURCE0_RGB_EXT 0x8580
+#define GL_SOURCE1_RGB_EXT 0x8581
+#define GL_SOURCE2_RGB_EXT 0x8582
+#define GL_SOURCE0_ALPHA_EXT 0x8588
+#define GL_SOURCE1_ALPHA_EXT 0x8589
+#define GL_SOURCE2_ALPHA_EXT 0x858A
+#define GL_OPERAND0_RGB_EXT 0x8590
+#define GL_OPERAND1_RGB_EXT 0x8591
+#define GL_OPERAND2_RGB_EXT 0x8592
+#define GL_OPERAND0_ALPHA_EXT 0x8598
+#define GL_OPERAND1_ALPHA_EXT 0x8599
+#define GL_OPERAND2_ALPHA_EXT 0x859A
+#endif /* GL_EXT_texture_env_combine */
+
+#ifndef GL_EXT_texture_env_dot3
+#define GL_EXT_texture_env_dot3 1
+#define GL_DOT3_RGB_EXT 0x8740
+#define GL_DOT3_RGBA_EXT 0x8741
+#endif /* GL_EXT_texture_env_dot3 */
+
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_EXT_texture_filter_anisotropic 1
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+#endif /* GL_EXT_texture_filter_anisotropic */
+
+#ifndef GL_EXT_texture_integer
+#define GL_EXT_texture_integer 1
+#define GL_RGBA32UI_EXT 0x8D70
+#define GL_RGB32UI_EXT 0x8D71
+#define GL_ALPHA32UI_EXT 0x8D72
+#define GL_INTENSITY32UI_EXT 0x8D73
+#define GL_LUMINANCE32UI_EXT 0x8D74
+#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75
+#define GL_RGBA16UI_EXT 0x8D76
+#define GL_RGB16UI_EXT 0x8D77
+#define GL_ALPHA16UI_EXT 0x8D78
+#define GL_INTENSITY16UI_EXT 0x8D79
+#define GL_LUMINANCE16UI_EXT 0x8D7A
+#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B
+#define GL_RGBA8UI_EXT 0x8D7C
+#define GL_RGB8UI_EXT 0x8D7D
+#define GL_ALPHA8UI_EXT 0x8D7E
+#define GL_INTENSITY8UI_EXT 0x8D7F
+#define GL_LUMINANCE8UI_EXT 0x8D80
+#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81
+#define GL_RGBA32I_EXT 0x8D82
+#define GL_RGB32I_EXT 0x8D83
+#define GL_ALPHA32I_EXT 0x8D84
+#define GL_INTENSITY32I_EXT 0x8D85
+#define GL_LUMINANCE32I_EXT 0x8D86
+#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87
+#define GL_RGBA16I_EXT 0x8D88
+#define GL_RGB16I_EXT 0x8D89
+#define GL_ALPHA16I_EXT 0x8D8A
+#define GL_INTENSITY16I_EXT 0x8D8B
+#define GL_LUMINANCE16I_EXT 0x8D8C
+#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D
+#define GL_RGBA8I_EXT 0x8D8E
+#define GL_RGB8I_EXT 0x8D8F
+#define GL_ALPHA8I_EXT 0x8D90
+#define GL_INTENSITY8I_EXT 0x8D91
+#define GL_LUMINANCE8I_EXT 0x8D92
+#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93
+#define GL_RED_INTEGER_EXT 0x8D94
+#define GL_GREEN_INTEGER_EXT 0x8D95
+#define GL_BLUE_INTEGER_EXT 0x8D96
+#define GL_ALPHA_INTEGER_EXT 0x8D97
+#define GL_RGB_INTEGER_EXT 0x8D98
+#define GL_RGBA_INTEGER_EXT 0x8D99
+#define GL_BGR_INTEGER_EXT 0x8D9A
+#define GL_BGRA_INTEGER_EXT 0x8D9B
+#define GL_LUMINANCE_INTEGER_EXT 0x8D9C
+#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D
+#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E
+typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha);
+typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params);
+GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha);
+GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha);
+#endif
+#endif /* GL_EXT_texture_integer */
+
+#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
+#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
+#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
+#endif /* GL_EXT_texture_lod_bias */
+
+#ifndef GL_EXT_texture_mirror_clamp
+#define GL_EXT_texture_mirror_clamp 1
+#define GL_MIRROR_CLAMP_EXT 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743
+#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912
+#endif /* GL_EXT_texture_mirror_clamp */
+
+#ifndef GL_EXT_texture_object
+#define GL_EXT_texture_object 1
+#define GL_TEXTURE_PRIORITY_EXT 0x8066
+#define GL_TEXTURE_RESIDENT_EXT 0x8067
+#define GL_TEXTURE_1D_BINDING_EXT 0x8068
+#define GL_TEXTURE_2D_BINDING_EXT 0x8069
+#define GL_TEXTURE_3D_BINDING_EXT 0x806A
+typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences);
+typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);
+typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures);
+typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures);
+typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture);
+typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences);
+GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture);
+GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures);
+GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures);
+GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture);
+GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities);
+#endif
+#endif /* GL_EXT_texture_object */
+
+#ifndef GL_EXT_texture_perturb_normal
+#define GL_EXT_texture_perturb_normal 1
+#define GL_PERTURB_EXT 0x85AE
+#define GL_TEXTURE_NORMAL_EXT 0x85AF
+typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTextureNormalEXT (GLenum mode);
+#endif
+#endif /* GL_EXT_texture_perturb_normal */
+
+#ifndef GL_EXT_texture_sRGB
+#define GL_EXT_texture_sRGB 1
+#define GL_SRGB_EXT 0x8C40
+#define GL_SRGB8_EXT 0x8C41
+#define GL_SRGB_ALPHA_EXT 0x8C42
+#define GL_SRGB8_ALPHA8_EXT 0x8C43
+#define GL_SLUMINANCE_ALPHA_EXT 0x8C44
+#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45
+#define GL_SLUMINANCE_EXT 0x8C46
+#define GL_SLUMINANCE8_EXT 0x8C47
+#define GL_COMPRESSED_SRGB_EXT 0x8C48
+#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49
+#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
+#endif /* GL_EXT_texture_sRGB */
+
+#ifndef GL_EXT_texture_sRGB_decode
+#define GL_EXT_texture_sRGB_decode 1
+#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48
+#define GL_DECODE_EXT 0x8A49
+#define GL_SKIP_DECODE_EXT 0x8A4A
+#endif /* GL_EXT_texture_sRGB_decode */
+
+#ifndef GL_EXT_texture_shared_exponent
+#define GL_EXT_texture_shared_exponent 1
+#define GL_RGB9_E5_EXT 0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E
+#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F
+#endif /* GL_EXT_texture_shared_exponent */
+
+#ifndef GL_EXT_texture_snorm
+#define GL_EXT_texture_snorm 1
+#define GL_ALPHA_SNORM 0x9010
+#define GL_LUMINANCE_SNORM 0x9011
+#define GL_LUMINANCE_ALPHA_SNORM 0x9012
+#define GL_INTENSITY_SNORM 0x9013
+#define GL_ALPHA8_SNORM 0x9014
+#define GL_LUMINANCE8_SNORM 0x9015
+#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016
+#define GL_INTENSITY8_SNORM 0x9017
+#define GL_ALPHA16_SNORM 0x9018
+#define GL_LUMINANCE16_SNORM 0x9019
+#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A
+#define GL_INTENSITY16_SNORM 0x901B
+#define GL_RED_SNORM 0x8F90
+#define GL_RG_SNORM 0x8F91
+#define GL_RGB_SNORM 0x8F92
+#define GL_RGBA_SNORM 0x8F93
+#endif /* GL_EXT_texture_snorm */
+
+#ifndef GL_EXT_texture_swizzle
+#define GL_EXT_texture_swizzle 1
+#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42
+#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43
+#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44
+#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46
+#endif /* GL_EXT_texture_swizzle */
+
+#ifndef GL_EXT_timer_query
+#define GL_EXT_timer_query 1
+#define GL_TIME_ELAPSED_EXT 0x88BF
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params);
+typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params);
+GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params);
+#endif
+#endif /* GL_EXT_timer_query */
+
+#ifndef GL_EXT_transform_feedback
+#define GL_EXT_transform_feedback 1
+#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F
+#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C
+#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D
+#define GL_PRIMITIVES_GENERATED_EXT 0x8C87
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88
+#define GL_RASTERIZER_DISCARD_EXT 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76
+typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode);
+typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void);
+typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
+typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode);
+GLAPI void APIENTRY glEndTransformFeedbackEXT (void);
+GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
+GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer);
+GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode);
+GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+#endif
+#endif /* GL_EXT_transform_feedback */
+
+#ifndef GL_EXT_vertex_array
+#define GL_EXT_vertex_array 1
+#define GL_VERTEX_ARRAY_EXT 0x8074
+#define GL_NORMAL_ARRAY_EXT 0x8075
+#define GL_COLOR_ARRAY_EXT 0x8076
+#define GL_INDEX_ARRAY_EXT 0x8077
+#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078
+#define GL_EDGE_FLAG_ARRAY_EXT 0x8079
+#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A
+#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B
+#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C
+#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D
+#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E
+#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F
+#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080
+#define GL_COLOR_ARRAY_SIZE_EXT 0x8081
+#define GL_COLOR_ARRAY_TYPE_EXT 0x8082
+#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083
+#define GL_COLOR_ARRAY_COUNT_EXT 0x8084
+#define GL_INDEX_ARRAY_TYPE_EXT 0x8085
+#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086
+#define GL_INDEX_ARRAY_COUNT_EXT 0x8087
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D
+#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E
+#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F
+#define GL_COLOR_ARRAY_POINTER_EXT 0x8090
+#define GL_INDEX_ARRAY_POINTER_EXT 0x8091
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093
+typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i);
+typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
+typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer);
+typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params);
+typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glArrayElementEXT (GLint i);
+GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count);
+GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer);
+GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params);
+GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer);
+#endif
+#endif /* GL_EXT_vertex_array */
+
+#ifndef GL_EXT_vertex_array_bgra
+#define GL_EXT_vertex_array_bgra 1
+#endif /* GL_EXT_vertex_array_bgra */
+
+#ifndef GL_EXT_vertex_attrib_64bit
+#define GL_EXT_vertex_attrib_64bit 1
+#define GL_DOUBLE_VEC2_EXT 0x8FFC
+#define GL_DOUBLE_VEC3_EXT 0x8FFD
+#define GL_DOUBLE_VEC4_EXT 0x8FFE
+#define GL_DOUBLE_MAT2_EXT 0x8F46
+#define GL_DOUBLE_MAT3_EXT 0x8F47
+#define GL_DOUBLE_MAT4_EXT 0x8F48
+#define GL_DOUBLE_MAT2x3_EXT 0x8F49
+#define GL_DOUBLE_MAT2x4_EXT 0x8F4A
+#define GL_DOUBLE_MAT3x2_EXT 0x8F4B
+#define GL_DOUBLE_MAT3x4_EXT 0x8F4C
+#define GL_DOUBLE_MAT4x2_EXT 0x8F4D
+#define GL_DOUBLE_MAT4x3_EXT 0x8F4E
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x);
+GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params);
+#endif
+#endif /* GL_EXT_vertex_attrib_64bit */
+
+#ifndef GL_EXT_vertex_shader
+#define GL_EXT_vertex_shader 1
+#define GL_VERTEX_SHADER_EXT 0x8780
+#define GL_VERTEX_SHADER_BINDING_EXT 0x8781
+#define GL_OP_INDEX_EXT 0x8782
+#define GL_OP_NEGATE_EXT 0x8783
+#define GL_OP_DOT3_EXT 0x8784
+#define GL_OP_DOT4_EXT 0x8785
+#define GL_OP_MUL_EXT 0x8786
+#define GL_OP_ADD_EXT 0x8787
+#define GL_OP_MADD_EXT 0x8788
+#define GL_OP_FRAC_EXT 0x8789
+#define GL_OP_MAX_EXT 0x878A
+#define GL_OP_MIN_EXT 0x878B
+#define GL_OP_SET_GE_EXT 0x878C
+#define GL_OP_SET_LT_EXT 0x878D
+#define GL_OP_CLAMP_EXT 0x878E
+#define GL_OP_FLOOR_EXT 0x878F
+#define GL_OP_ROUND_EXT 0x8790
+#define GL_OP_EXP_BASE_2_EXT 0x8791
+#define GL_OP_LOG_BASE_2_EXT 0x8792
+#define GL_OP_POWER_EXT 0x8793
+#define GL_OP_RECIP_EXT 0x8794
+#define GL_OP_RECIP_SQRT_EXT 0x8795
+#define GL_OP_SUB_EXT 0x8796
+#define GL_OP_CROSS_PRODUCT_EXT 0x8797
+#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798
+#define GL_OP_MOV_EXT 0x8799
+#define GL_OUTPUT_VERTEX_EXT 0x879A
+#define GL_OUTPUT_COLOR0_EXT 0x879B
+#define GL_OUTPUT_COLOR1_EXT 0x879C
+#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D
+#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E
+#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F
+#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0
+#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1
+#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2
+#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3
+#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4
+#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5
+#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6
+#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7
+#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8
+#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9
+#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA
+#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB
+#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC
+#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD
+#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE
+#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF
+#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0
+#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1
+#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2
+#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3
+#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4
+#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5
+#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6
+#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7
+#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8
+#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9
+#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA
+#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB
+#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC
+#define GL_OUTPUT_FOG_EXT 0x87BD
+#define GL_SCALAR_EXT 0x87BE
+#define GL_VECTOR_EXT 0x87BF
+#define GL_MATRIX_EXT 0x87C0
+#define GL_VARIANT_EXT 0x87C1
+#define GL_INVARIANT_EXT 0x87C2
+#define GL_LOCAL_CONSTANT_EXT 0x87C3
+#define GL_LOCAL_EXT 0x87C4
+#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5
+#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6
+#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7
+#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8
+#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE
+#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF
+#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0
+#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1
+#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2
+#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3
+#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4
+#define GL_X_EXT 0x87D5
+#define GL_Y_EXT 0x87D6
+#define GL_Z_EXT 0x87D7
+#define GL_W_EXT 0x87D8
+#define GL_NEGATIVE_X_EXT 0x87D9
+#define GL_NEGATIVE_Y_EXT 0x87DA
+#define GL_NEGATIVE_Z_EXT 0x87DB
+#define GL_NEGATIVE_W_EXT 0x87DC
+#define GL_ZERO_EXT 0x87DD
+#define GL_ONE_EXT 0x87DE
+#define GL_NEGATIVE_ONE_EXT 0x87DF
+#define GL_NORMALIZED_RANGE_EXT 0x87E0
+#define GL_FULL_RANGE_EXT 0x87E1
+#define GL_CURRENT_VERTEX_EXT 0x87E2
+#define GL_MVP_MATRIX_EXT 0x87E3
+#define GL_VARIANT_VALUE_EXT 0x87E4
+#define GL_VARIANT_DATATYPE_EXT 0x87E5
+#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6
+#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7
+#define GL_VARIANT_ARRAY_EXT 0x87E8
+#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9
+#define GL_INVARIANT_VALUE_EXT 0x87EA
+#define GL_INVARIANT_DATATYPE_EXT 0x87EB
+#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC
+#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED
+typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void);
+typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void);
+typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);
+typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);
+typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);
+typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);
+typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);
+typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
+typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);
+typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components);
+typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr);
+typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr);
+typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr);
+typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr);
+typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr);
+typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr);
+typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr);
+typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr);
+typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr);
+typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr);
+typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr);
+typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);
+typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);
+typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);
+typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);
+typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);
+typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value);
+typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);
+typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data);
+typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data);
+typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data);
+typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBeginVertexShaderEXT (void);
+GLAPI void APIENTRY glEndVertexShaderEXT (void);
+GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id);
+GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range);
+GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id);
+GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1);
+GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2);
+GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);
+GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);
+GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num);
+GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num);
+GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components);
+GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr);
+GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr);
+GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr);
+GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr);
+GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr);
+GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr);
+GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr);
+GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr);
+GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr);
+GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr);
+GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr);
+GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id);
+GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id);
+GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value);
+GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value);
+GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value);
+GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value);
+GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value);
+GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap);
+GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data);
+GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data);
+GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data);
+GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data);
+GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data);
+GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data);
+GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data);
+GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data);
+GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data);
+GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data);
+#endif
+#endif /* GL_EXT_vertex_shader */
+
+#ifndef GL_EXT_vertex_weighting
+#define GL_EXT_vertex_weighting 1
+#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3
+#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502
+#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6
+#define GL_MODELVIEW1_MATRIX_EXT 0x8506
+#define GL_VERTEX_WEIGHTING_EXT 0x8509
+#define GL_MODELVIEW0_EXT 0x1700
+#define GL_MODELVIEW1_EXT 0x850A
+#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B
+#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C
+#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D
+#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E
+#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F
+#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510
+typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);
+typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight);
+typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight);
+GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight);
+GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer);
+#endif
+#endif /* GL_EXT_vertex_weighting */
+
+#ifndef GL_EXT_x11_sync_object
+#define GL_EXT_x11_sync_object 1
+#define GL_SYNC_X11_FENCE_EXT 0x90E1
+typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags);
+#endif
+#endif /* GL_EXT_x11_sync_object */
+
+#ifndef GL_GREMEDY_frame_terminator
+#define GL_GREMEDY_frame_terminator 1
+typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFrameTerminatorGREMEDY (void);
+#endif
+#endif /* GL_GREMEDY_frame_terminator */
+
+#ifndef GL_GREMEDY_string_marker
+#define GL_GREMEDY_string_marker 1
+typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string);
+#endif
+#endif /* GL_GREMEDY_string_marker */
+
+#ifndef GL_HP_convolution_border_modes
+#define GL_HP_convolution_border_modes 1
+#define GL_IGNORE_BORDER_HP 0x8150
+#define GL_CONSTANT_BORDER_HP 0x8151
+#define GL_REPLICATE_BORDER_HP 0x8153
+#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154
+#endif /* GL_HP_convolution_border_modes */
+
+#ifndef GL_HP_image_transform
+#define GL_HP_image_transform 1
+#define GL_IMAGE_SCALE_X_HP 0x8155
+#define GL_IMAGE_SCALE_Y_HP 0x8156
+#define GL_IMAGE_TRANSLATE_X_HP 0x8157
+#define GL_IMAGE_TRANSLATE_Y_HP 0x8158
+#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159
+#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A
+#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B
+#define GL_IMAGE_MAG_FILTER_HP 0x815C
+#define GL_IMAGE_MIN_FILTER_HP 0x815D
+#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E
+#define GL_CUBIC_HP 0x815F
+#define GL_AVERAGE_HP 0x8160
+#define GL_IMAGE_TRANSFORM_2D_HP 0x8161
+#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162
+#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163
+typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param);
+GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params);
+#endif
+#endif /* GL_HP_image_transform */
+
+#ifndef GL_HP_occlusion_test
+#define GL_HP_occlusion_test 1
+#define GL_OCCLUSION_TEST_HP 0x8165
+#define GL_OCCLUSION_TEST_RESULT_HP 0x8166
+#endif /* GL_HP_occlusion_test */
+
+#ifndef GL_HP_texture_lighting
+#define GL_HP_texture_lighting 1
+#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167
+#define GL_TEXTURE_POST_SPECULAR_HP 0x8168
+#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169
+#endif /* GL_HP_texture_lighting */
+
+#ifndef GL_IBM_cull_vertex
+#define GL_IBM_cull_vertex 1
+#define GL_CULL_VERTEX_IBM 103050
+#endif /* GL_IBM_cull_vertex */
+
+#ifndef GL_IBM_multimode_draw_arrays
+#define GL_IBM_multimode_draw_arrays 1
+typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);
+typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride);
+GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride);
+#endif
+#endif /* GL_IBM_multimode_draw_arrays */
+
+#ifndef GL_IBM_rasterpos_clip
+#define GL_IBM_rasterpos_clip 1
+#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262
+#endif /* GL_IBM_rasterpos_clip */
+
+#ifndef GL_IBM_static_data
+#define GL_IBM_static_data 1
+#define GL_ALL_STATIC_DATA_IBM 103060
+#define GL_STATIC_VERTEX_ARRAY_IBM 103061
+typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target);
+#endif
+#endif /* GL_IBM_static_data */
+
+#ifndef GL_IBM_texture_mirrored_repeat
+#define GL_IBM_texture_mirrored_repeat 1
+#define GL_MIRRORED_REPEAT_IBM 0x8370
+#endif /* GL_IBM_texture_mirrored_repeat */
+
+#ifndef GL_IBM_vertex_array_lists
+#define GL_IBM_vertex_array_lists 1
+#define GL_VERTEX_ARRAY_LIST_IBM 103070
+#define GL_NORMAL_ARRAY_LIST_IBM 103071
+#define GL_COLOR_ARRAY_LIST_IBM 103072
+#define GL_INDEX_ARRAY_LIST_IBM 103073
+#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074
+#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075
+#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076
+#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077
+#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080
+#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081
+#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082
+#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083
+#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084
+#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085
+#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086
+#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087
+typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride);
+typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride);
+GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride);
+#endif
+#endif /* GL_IBM_vertex_array_lists */
+
+#ifndef GL_INGR_blend_func_separate
+#define GL_INGR_blend_func_separate 1
+typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
+#endif
+#endif /* GL_INGR_blend_func_separate */
+
+#ifndef GL_INGR_color_clamp
+#define GL_INGR_color_clamp 1
+#define GL_RED_MIN_CLAMP_INGR 0x8560
+#define GL_GREEN_MIN_CLAMP_INGR 0x8561
+#define GL_BLUE_MIN_CLAMP_INGR 0x8562
+#define GL_ALPHA_MIN_CLAMP_INGR 0x8563
+#define GL_RED_MAX_CLAMP_INGR 0x8564
+#define GL_GREEN_MAX_CLAMP_INGR 0x8565
+#define GL_BLUE_MAX_CLAMP_INGR 0x8566
+#define GL_ALPHA_MAX_CLAMP_INGR 0x8567
+#endif /* GL_INGR_color_clamp */
+
+#ifndef GL_INGR_interlace_read
+#define GL_INGR_interlace_read 1
+#define GL_INTERLACE_READ_INGR 0x8568
+#endif /* GL_INGR_interlace_read */
+
+#ifndef GL_INTEL_fragment_shader_ordering
+#define GL_INTEL_fragment_shader_ordering 1
+#endif /* GL_INTEL_fragment_shader_ordering */
+
+#ifndef GL_INTEL_map_texture
+#define GL_INTEL_map_texture 1
+#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF
+#define GL_LAYOUT_DEFAULT_INTEL 0
+#define GL_LAYOUT_LINEAR_INTEL 1
+#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2
+typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture);
+typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level);
+typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture);
+GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level);
+GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout);
+#endif
+#endif /* GL_INTEL_map_texture */
+
+#ifndef GL_INTEL_parallel_arrays
+#define GL_INTEL_parallel_arrays 1
+#define GL_PARALLEL_ARRAYS_INTEL 0x83F4
+#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5
+#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6
+#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7
+#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8
+typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer);
+typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer);
+typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer);
+typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer);
+GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer);
+GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer);
+GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer);
+#endif
+#endif /* GL_INTEL_parallel_arrays */
+
+#ifndef GL_INTEL_performance_query
+#define GL_INTEL_performance_query 1
+#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000
+#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001
+#define GL_PERFQUERY_WAIT_INTEL 0x83FB
+#define GL_PERFQUERY_FLUSH_INTEL 0x83FA
+#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9
+#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0
+#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1
+#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2
+#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3
+#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4
+#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5
+#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8
+#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9
+#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA
+#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB
+#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC
+#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD
+#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE
+#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF
+#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500
+typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle);
+typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle);
+typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId);
+typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId);
+typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
+typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);
+typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId);
+typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle);
+GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle);
+GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle);
+GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle);
+GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId);
+GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId);
+GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue);
+GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten);
+GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId);
+GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask);
+#endif
+#endif /* GL_INTEL_performance_query */
+
+#ifndef GL_MESAX_texture_stack
+#define GL_MESAX_texture_stack 1
+#define GL_TEXTURE_1D_STACK_MESAX 0x8759
+#define GL_TEXTURE_2D_STACK_MESAX 0x875A
+#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B
+#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C
+#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D
+#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E
+#endif /* GL_MESAX_texture_stack */
+
+#ifndef GL_MESA_pack_invert
+#define GL_MESA_pack_invert 1
+#define GL_PACK_INVERT_MESA 0x8758
+#endif /* GL_MESA_pack_invert */
+
+#ifndef GL_MESA_resize_buffers
+#define GL_MESA_resize_buffers 1
+typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glResizeBuffersMESA (void);
+#endif
+#endif /* GL_MESA_resize_buffers */
+
+#ifndef GL_MESA_window_pos
+#define GL_MESA_window_pos 1
+typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);
+typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v);
+typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y);
+GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v);
+GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y);
+GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v);
+GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y);
+GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v);
+GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y);
+GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v);
+GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v);
+GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v);
+GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z);
+GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v);
+GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v);
+GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v);
+GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v);
+GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w);
+GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v);
+GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v);
+#endif
+#endif /* GL_MESA_window_pos */
+
+#ifndef GL_MESA_ycbcr_texture
+#define GL_MESA_ycbcr_texture 1
+#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB
+#define GL_YCBCR_MESA 0x8757
+#endif /* GL_MESA_ycbcr_texture */
+
+#ifndef GL_NVX_conditional_render
+#define GL_NVX_conditional_render 1
+typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id);
+GLAPI void APIENTRY glEndConditionalRenderNVX (void);
+#endif
+#endif /* GL_NVX_conditional_render */
+
+#ifndef GL_NVX_gpu_memory_info
+#define GL_NVX_gpu_memory_info 1
+#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
+#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
+#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
+#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
+#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
+#endif /* GL_NVX_gpu_memory_info */
+
+#ifndef GL_NV_bindless_multi_draw_indirect
+#define GL_NV_bindless_multi_draw_indirect 1
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);
+GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount);
+#endif
+#endif /* GL_NV_bindless_multi_draw_indirect */
+
+#ifndef GL_NV_bindless_multi_draw_indirect_count
+#define GL_NV_bindless_multi_draw_indirect_count 1
+typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);
+typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);
+GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount);
+#endif
+#endif /* GL_NV_bindless_multi_draw_indirect_count */
+
+#ifndef GL_NV_bindless_texture
+#define GL_NV_bindless_texture 1
+typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture);
+typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler);
+typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
+typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle);
+typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access);
+typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle);
+typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value);
+typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle);
+typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture);
+GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler);
+GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle);
+GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle);
+GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format);
+GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access);
+GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle);
+GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value);
+GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value);
+GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value);
+GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values);
+GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle);
+GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle);
+#endif
+#endif /* GL_NV_bindless_texture */
+
+#ifndef GL_NV_blend_equation_advanced
+#define GL_NV_blend_equation_advanced 1
+#define GL_BLEND_OVERLAP_NV 0x9281
+#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280
+#define GL_BLUE_NV 0x1905
+#define GL_COLORBURN_NV 0x929A
+#define GL_COLORDODGE_NV 0x9299
+#define GL_CONJOINT_NV 0x9284
+#define GL_CONTRAST_NV 0x92A1
+#define GL_DARKEN_NV 0x9297
+#define GL_DIFFERENCE_NV 0x929E
+#define GL_DISJOINT_NV 0x9283
+#define GL_DST_ATOP_NV 0x928F
+#define GL_DST_IN_NV 0x928B
+#define GL_DST_NV 0x9287
+#define GL_DST_OUT_NV 0x928D
+#define GL_DST_OVER_NV 0x9289
+#define GL_EXCLUSION_NV 0x92A0
+#define GL_GREEN_NV 0x1904
+#define GL_HARDLIGHT_NV 0x929B
+#define GL_HARDMIX_NV 0x92A9
+#define GL_HSL_COLOR_NV 0x92AF
+#define GL_HSL_HUE_NV 0x92AD
+#define GL_HSL_LUMINOSITY_NV 0x92B0
+#define GL_HSL_SATURATION_NV 0x92AE
+#define GL_INVERT_OVG_NV 0x92B4
+#define GL_INVERT_RGB_NV 0x92A3
+#define GL_LIGHTEN_NV 0x9298
+#define GL_LINEARBURN_NV 0x92A5
+#define GL_LINEARDODGE_NV 0x92A4
+#define GL_LINEARLIGHT_NV 0x92A7
+#define GL_MINUS_CLAMPED_NV 0x92B3
+#define GL_MINUS_NV 0x929F
+#define GL_MULTIPLY_NV 0x9294
+#define GL_OVERLAY_NV 0x9296
+#define GL_PINLIGHT_NV 0x92A8
+#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2
+#define GL_PLUS_CLAMPED_NV 0x92B1
+#define GL_PLUS_DARKER_NV 0x9292
+#define GL_PLUS_NV 0x9291
+#define GL_RED_NV 0x1903
+#define GL_SCREEN_NV 0x9295
+#define GL_SOFTLIGHT_NV 0x929C
+#define GL_SRC_ATOP_NV 0x928E
+#define GL_SRC_IN_NV 0x928A
+#define GL_SRC_NV 0x9286
+#define GL_SRC_OUT_NV 0x928C
+#define GL_SRC_OVER_NV 0x9288
+#define GL_UNCORRELATED_NV 0x9282
+#define GL_VIVIDLIGHT_NV 0x92A6
+#define GL_XOR_NV 0x1506
+typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value);
+typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value);
+GLAPI void APIENTRY glBlendBarrierNV (void);
+#endif
+#endif /* GL_NV_blend_equation_advanced */
+
+#ifndef GL_NV_blend_equation_advanced_coherent
+#define GL_NV_blend_equation_advanced_coherent 1
+#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285
+#endif /* GL_NV_blend_equation_advanced_coherent */
+
+#ifndef GL_NV_blend_square
+#define GL_NV_blend_square 1
+#endif /* GL_NV_blend_square */
+
+#ifndef GL_NV_compute_program5
+#define GL_NV_compute_program5 1
+#define GL_COMPUTE_PROGRAM_NV 0x90FB
+#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC
+#endif /* GL_NV_compute_program5 */
+
+#ifndef GL_NV_conditional_render
+#define GL_NV_conditional_render 1
+#define GL_QUERY_WAIT_NV 0x8E13
+#define GL_QUERY_NO_WAIT_NV 0x8E14
+#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15
+#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16
+typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);
+typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode);
+GLAPI void APIENTRY glEndConditionalRenderNV (void);
+#endif
+#endif /* GL_NV_conditional_render */
+
+#ifndef GL_NV_copy_depth_to_color
+#define GL_NV_copy_depth_to_color 1
+#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E
+#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F
+#endif /* GL_NV_copy_depth_to_color */
+
+#ifndef GL_NV_copy_image
+#define GL_NV_copy_image 1
+typedef void (APIENTRYP 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);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glCopyImageSubDataNV (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);
+#endif
+#endif /* GL_NV_copy_image */
+
+#ifndef GL_NV_deep_texture3D
+#define GL_NV_deep_texture3D 1
+#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0
+#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1
+#endif /* GL_NV_deep_texture3D */
+
+#ifndef GL_NV_depth_buffer_float
+#define GL_NV_depth_buffer_float 1
+#define GL_DEPTH_COMPONENT32F_NV 0x8DAB
+#define GL_DEPTH32F_STENCIL8_NV 0x8DAC
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD
+#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF
+typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar);
+typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth);
+typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar);
+GLAPI void APIENTRY glClearDepthdNV (GLdouble depth);
+GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax);
+#endif
+#endif /* GL_NV_depth_buffer_float */
+
+#ifndef GL_NV_depth_clamp
+#define GL_NV_depth_clamp 1
+#define GL_DEPTH_CLAMP_NV 0x864F
+#endif /* GL_NV_depth_clamp */
+
+#ifndef GL_NV_draw_texture
+#define GL_NV_draw_texture 1
+typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1);
+#endif
+#endif /* GL_NV_draw_texture */
+
+#ifndef GL_NV_evaluators
+#define GL_NV_evaluators 1
+#define GL_EVAL_2D_NV 0x86C0
+#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1
+#define GL_MAP_TESSELLATION_NV 0x86C2
+#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3
+#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4
+#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5
+#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6
+#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7
+#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8
+#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9
+#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA
+#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB
+#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC
+#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD
+#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE
+#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF
+#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0
+#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1
+#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2
+#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3
+#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4
+#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5
+#define GL_MAX_MAP_TESSELLATION_NV 0x86D6
+#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7
+typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points);
+typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points);
+typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points);
+GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points);
+GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode);
+#endif
+#endif /* GL_NV_evaluators */
+
+#ifndef GL_NV_explicit_multisample
+#define GL_NV_explicit_multisample 1
+#define GL_SAMPLE_POSITION_NV 0x8E50
+#define GL_SAMPLE_MASK_NV 0x8E51
+#define GL_SAMPLE_MASK_VALUE_NV 0x8E52
+#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53
+#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54
+#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55
+#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56
+#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57
+#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58
+#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59
+typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val);
+typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask);
+typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val);
+GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask);
+GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer);
+#endif
+#endif /* GL_NV_explicit_multisample */
+
+#ifndef GL_NV_fence
+#define GL_NV_fence 1
+#define GL_ALL_COMPLETED_NV 0x84F2
+#define GL_FENCE_STATUS_NV 0x84F3
+#define GL_FENCE_CONDITION_NV 0x84F4
+typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);
+typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);
+typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence);
+typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence);
+typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence);
+typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences);
+GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences);
+GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence);
+GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence);
+GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params);
+GLAPI void APIENTRY glFinishFenceNV (GLuint fence);
+GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition);
+#endif
+#endif /* GL_NV_fence */
+
+#ifndef GL_NV_float_buffer
+#define GL_NV_float_buffer 1
+#define GL_FLOAT_R_NV 0x8880
+#define GL_FLOAT_RG_NV 0x8881
+#define GL_FLOAT_RGB_NV 0x8882
+#define GL_FLOAT_RGBA_NV 0x8883
+#define GL_FLOAT_R16_NV 0x8884
+#define GL_FLOAT_R32_NV 0x8885
+#define GL_FLOAT_RG16_NV 0x8886
+#define GL_FLOAT_RG32_NV 0x8887
+#define GL_FLOAT_RGB16_NV 0x8888
+#define GL_FLOAT_RGB32_NV 0x8889
+#define GL_FLOAT_RGBA16_NV 0x888A
+#define GL_FLOAT_RGBA32_NV 0x888B
+#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C
+#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D
+#define GL_FLOAT_RGBA_MODE_NV 0x888E
+#endif /* GL_NV_float_buffer */
+
+#ifndef GL_NV_fog_distance
+#define GL_NV_fog_distance 1
+#define GL_FOG_DISTANCE_MODE_NV 0x855A
+#define GL_EYE_RADIAL_NV 0x855B
+#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C
+#endif /* GL_NV_fog_distance */
+
+#ifndef GL_NV_fragment_program
+#define GL_NV_fragment_program 1
+#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868
+#define GL_FRAGMENT_PROGRAM_NV 0x8870
+#define GL_MAX_TEXTURE_COORDS_NV 0x8871
+#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872
+#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873
+#define GL_PROGRAM_ERROR_STRING_NV 0x8874
+typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v);
+typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v);
+typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v);
+GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v);
+GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params);
+GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params);
+#endif
+#endif /* GL_NV_fragment_program */
+
+#ifndef GL_NV_fragment_program2
+#define GL_NV_fragment_program2 1
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
+#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6
+#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7
+#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8
+#endif /* GL_NV_fragment_program2 */
+
+#ifndef GL_NV_fragment_program4
+#define GL_NV_fragment_program4 1
+#endif /* GL_NV_fragment_program4 */
+
+#ifndef GL_NV_fragment_program_option
+#define GL_NV_fragment_program_option 1
+#endif /* GL_NV_fragment_program_option */
+
+#ifndef GL_NV_framebuffer_multisample_coverage
+#define GL_NV_framebuffer_multisample_coverage 1
+#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB
+#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10
+#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11
+#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12
+typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);
+#endif
+#endif /* GL_NV_framebuffer_multisample_coverage */
+
+#ifndef GL_NV_geometry_program4
+#define GL_NV_geometry_program4 1
+#define GL_GEOMETRY_PROGRAM_NV 0x8C26
+#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27
+#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28
+typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit);
+GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level);
+GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);
+#endif
+#endif /* GL_NV_geometry_program4 */
+
+#ifndef GL_NV_geometry_shader4
+#define GL_NV_geometry_shader4 1
+#endif /* GL_NV_geometry_shader4 */
+
+#ifndef GL_NV_gpu_program4
+#define GL_NV_gpu_program4 1
+#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905
+#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906
+#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907
+#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908
+#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909
+#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5
+#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);
+typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params);
+typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
+GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params);
+GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params);
+GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params);
+GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params);
+GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);
+GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params);
+GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params);
+GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params);
+GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params);
+GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params);
+GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params);
+GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params);
+GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params);
+#endif
+#endif /* GL_NV_gpu_program4 */
+
+#ifndef GL_NV_gpu_program5
+#define GL_NV_gpu_program5 1
+#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C
+#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F
+#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44
+#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45
+typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params);
+GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param);
+#endif
+#endif /* GL_NV_gpu_program5 */
+
+#ifndef GL_NV_gpu_program5_mem_extended
+#define GL_NV_gpu_program5_mem_extended 1
+#endif /* GL_NV_gpu_program5_mem_extended */
+
+#ifndef GL_NV_gpu_shader5
+#define GL_NV_gpu_shader5 1
+#endif /* GL_NV_gpu_shader5 */
+
+#ifndef GL_NV_half_float
+#define GL_NV_half_float 1
+typedef unsigned short GLhalfNV;
+#define GL_HALF_FLOAT_NV 0x140B
+typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y);
+typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
+typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
+typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s);
+typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t);
+typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog);
+typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight);
+typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y);
+GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z);
+GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);
+GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);
+GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s);
+GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t);
+GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r);
+GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s);
+GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v);
+GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t);
+GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v);
+GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);
+GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v);
+GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);
+GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v);
+GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog);
+GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog);
+GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue);
+GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v);
+GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight);
+GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight);
+GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x);
+GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v);
+GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y);
+GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v);
+GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);
+GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v);
+GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);
+GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v);
+GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v);
+GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v);
+GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v);
+GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v);
+#endif
+#endif /* GL_NV_half_float */
+
+#ifndef GL_NV_light_max_exponent
+#define GL_NV_light_max_exponent 1
+#define GL_MAX_SHININESS_NV 0x8504
+#define GL_MAX_SPOT_EXPONENT_NV 0x8505
+#endif /* GL_NV_light_max_exponent */
+
+#ifndef GL_NV_multisample_coverage
+#define GL_NV_multisample_coverage 1
+#define GL_COLOR_SAMPLES_NV 0x8E20
+#endif /* GL_NV_multisample_coverage */
+
+#ifndef GL_NV_multisample_filter_hint
+#define GL_NV_multisample_filter_hint 1
+#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534
+#endif /* GL_NV_multisample_filter_hint */
+
+#ifndef GL_NV_occlusion_query
+#define GL_NV_occlusion_query 1
+#define GL_PIXEL_COUNTER_BITS_NV 0x8864
+#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865
+#define GL_PIXEL_COUNT_NV 0x8866
+#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867
+typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids);
+typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void);
+typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids);
+GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids);
+GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id);
+GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id);
+GLAPI void APIENTRY glEndOcclusionQueryNV (void);
+GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params);
+#endif
+#endif /* GL_NV_occlusion_query */
+
+#ifndef GL_NV_packed_depth_stencil
+#define GL_NV_packed_depth_stencil 1
+#define GL_DEPTH_STENCIL_NV 0x84F9
+#define GL_UNSIGNED_INT_24_8_NV 0x84FA
+#endif /* GL_NV_packed_depth_stencil */
+
+#ifndef GL_NV_parameter_buffer_object
+#define GL_NV_parameter_buffer_object 1
+#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0
+#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1
+#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2
+#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3
+#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4
+typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params);
+typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params);
+typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params);
+GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params);
+GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params);
+#endif
+#endif /* GL_NV_parameter_buffer_object */
+
+#ifndef GL_NV_parameter_buffer_object2
+#define GL_NV_parameter_buffer_object2 1
+#endif /* GL_NV_parameter_buffer_object2 */
+
+#ifndef GL_NV_path_rendering
+#define GL_NV_path_rendering 1
+#define GL_PATH_FORMAT_SVG_NV 0x9070
+#define GL_PATH_FORMAT_PS_NV 0x9071
+#define GL_STANDARD_FONT_NAME_NV 0x9072
+#define GL_SYSTEM_FONT_NAME_NV 0x9073
+#define GL_FILE_NAME_NV 0x9074
+#define GL_PATH_STROKE_WIDTH_NV 0x9075
+#define GL_PATH_END_CAPS_NV 0x9076
+#define GL_PATH_INITIAL_END_CAP_NV 0x9077
+#define GL_PATH_TERMINAL_END_CAP_NV 0x9078
+#define GL_PATH_JOIN_STYLE_NV 0x9079
+#define GL_PATH_MITER_LIMIT_NV 0x907A
+#define GL_PATH_DASH_CAPS_NV 0x907B
+#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C
+#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D
+#define GL_PATH_DASH_OFFSET_NV 0x907E
+#define GL_PATH_CLIENT_LENGTH_NV 0x907F
+#define GL_PATH_FILL_MODE_NV 0x9080
+#define GL_PATH_FILL_MASK_NV 0x9081
+#define GL_PATH_FILL_COVER_MODE_NV 0x9082
+#define GL_PATH_STROKE_COVER_MODE_NV 0x9083
+#define GL_PATH_STROKE_MASK_NV 0x9084
+#define GL_COUNT_UP_NV 0x9088
+#define GL_COUNT_DOWN_NV 0x9089
+#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A
+#define GL_CONVEX_HULL_NV 0x908B
+#define GL_BOUNDING_BOX_NV 0x908D
+#define GL_TRANSLATE_X_NV 0x908E
+#define GL_TRANSLATE_Y_NV 0x908F
+#define GL_TRANSLATE_2D_NV 0x9090
+#define GL_TRANSLATE_3D_NV 0x9091
+#define GL_AFFINE_2D_NV 0x9092
+#define GL_AFFINE_3D_NV 0x9094
+#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096
+#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098
+#define GL_UTF8_NV 0x909A
+#define GL_UTF16_NV 0x909B
+#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C
+#define GL_PATH_COMMAND_COUNT_NV 0x909D
+#define GL_PATH_COORD_COUNT_NV 0x909E
+#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F
+#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0
+#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1
+#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2
+#define GL_SQUARE_NV 0x90A3
+#define GL_ROUND_NV 0x90A4
+#define GL_TRIANGULAR_NV 0x90A5
+#define GL_BEVEL_NV 0x90A6
+#define GL_MITER_REVERT_NV 0x90A7
+#define GL_MITER_TRUNCATE_NV 0x90A8
+#define GL_SKIP_MISSING_GLYPH_NV 0x90A9
+#define GL_USE_MISSING_GLYPH_NV 0x90AA
+#define GL_PATH_ERROR_POSITION_NV 0x90AB
+#define GL_PATH_FOG_GEN_MODE_NV 0x90AC
+#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD
+#define GL_ADJACENT_PAIRS_NV 0x90AE
+#define GL_FIRST_TO_REST_NV 0x90AF
+#define GL_PATH_GEN_MODE_NV 0x90B0
+#define GL_PATH_GEN_COEFF_NV 0x90B1
+#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2
+#define GL_PATH_GEN_COMPONENTS_NV 0x90B3
+#define GL_PATH_STENCIL_FUNC_NV 0x90B7
+#define GL_PATH_STENCIL_REF_NV 0x90B8
+#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9
+#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD
+#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE
+#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF
+#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4
+#define GL_MOVE_TO_RESETS_NV 0x90B5
+#define GL_MOVE_TO_CONTINUES_NV 0x90B6
+#define GL_CLOSE_PATH_NV 0x00
+#define GL_MOVE_TO_NV 0x02
+#define GL_RELATIVE_MOVE_TO_NV 0x03
+#define GL_LINE_TO_NV 0x04
+#define GL_RELATIVE_LINE_TO_NV 0x05
+#define GL_HORIZONTAL_LINE_TO_NV 0x06
+#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07
+#define GL_VERTICAL_LINE_TO_NV 0x08
+#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09
+#define GL_QUADRATIC_CURVE_TO_NV 0x0A
+#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B
+#define GL_CUBIC_CURVE_TO_NV 0x0C
+#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D
+#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E
+#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F
+#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10
+#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11
+#define GL_SMALL_CCW_ARC_TO_NV 0x12
+#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13
+#define GL_SMALL_CW_ARC_TO_NV 0x14
+#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15
+#define GL_LARGE_CCW_ARC_TO_NV 0x16
+#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17
+#define GL_LARGE_CW_ARC_TO_NV 0x18
+#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19
+#define GL_RESTART_PATH_NV 0xF0
+#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2
+#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4
+#define GL_RECT_NV 0xF6
+#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8
+#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA
+#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC
+#define GL_ARC_TO_NV 0xFE
+#define GL_RELATIVE_ARC_TO_NV 0xFF
+#define GL_BOLD_BIT_NV 0x01
+#define GL_ITALIC_BIT_NV 0x02
+#define GL_GLYPH_WIDTH_BIT_NV 0x01
+#define GL_GLYPH_HEIGHT_BIT_NV 0x02
+#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04
+#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08
+#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10
+#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20
+#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40
+#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80
+#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100
+#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000
+#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000
+#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000
+#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000
+#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000
+#define GL_FONT_ASCENDER_BIT_NV 0x00200000
+#define GL_FONT_DESCENDER_BIT_NV 0x00400000
+#define GL_FONT_HEIGHT_BIT_NV 0x00800000
+#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000
+#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000
+#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000
+#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000
+#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000
+#define GL_PRIMARY_COLOR_NV 0x852C
+#define GL_SECONDARY_COLOR_NV 0x852D
+#define GL_ROUNDED_RECT_NV 0xE8
+#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9
+#define GL_ROUNDED_RECT2_NV 0xEA
+#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB
+#define GL_ROUNDED_RECT4_NV 0xEC
+#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED
+#define GL_ROUNDED_RECT8_NV 0xEE
+#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF
+#define GL_RELATIVE_RECT_NV 0xF7
+#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368
+#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369
+#define GL_FONT_UNAVAILABLE_NV 0x936A
+#define GL_FONT_UNINTELLIGIBLE_NV 0x936B
+#define GL_CONIC_CURVE_TO_NV 0x1A
+#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B
+#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000
+#define GL_STANDARD_FONT_FORMAT_NV 0x936C
+#define GL_2_BYTES_NV 0x1407
+#define GL_3_BYTES_NV 0x1408
+#define GL_4_BYTES_NV 0x1409
+#define GL_EYE_LINEAR_NV 0x2400
+#define GL_OBJECT_LINEAR_NV 0x2401
+#define GL_CONSTANT_NV 0x8576
+#define GL_PATH_PROJECTION_NV 0x1701
+#define GL_PATH_MODELVIEW_NV 0x1700
+#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3
+#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6
+#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36
+#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3
+#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4
+#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7
+#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38
+#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4
+#define GL_FRAGMENT_INPUT_NV 0x936D
+typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range);
+typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range);
+typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path);
+typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
+typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString);
+typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);
+typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath);
+typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);
+typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value);
+typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value);
+typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value);
+typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value);
+typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray);
+typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask);
+typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units);
+typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask);
+typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask);
+typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func);
+typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs);
+typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs);
+typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode);
+typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode);
+typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode);
+typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value);
+typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value);
+typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands);
+typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords);
+typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray);
+typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);
+typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value);
+typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value);
+typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value);
+typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value);
+typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y);
+typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments);
+typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m);
+typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
+typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
+typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
+typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs);
+typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range);
+GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range);
+GLAPI GLboolean APIENTRY glIsPathNV (GLuint path);
+GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
+GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
+GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString);
+GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);
+GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath);
+GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);
+GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value);
+GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value);
+GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value);
+GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value);
+GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray);
+GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask);
+GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units);
+GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask);
+GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask);
+GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func);
+GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs);
+GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs);
+GLAPI void APIENTRY glPathFogGenNV (GLenum genMode);
+GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode);
+GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode);
+GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value);
+GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value);
+GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands);
+GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords);
+GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray);
+GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);
+GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value);
+GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value);
+GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value);
+GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value);
+GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y);
+GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments);
+GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m);
+GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
+GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
+GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
+GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs);
+GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params);
+#endif
+#endif /* GL_NV_path_rendering */
+
+#ifndef GL_NV_pixel_data_range
+#define GL_NV_pixel_data_range 1
+#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878
+#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879
+#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A
+#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B
+#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C
+#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D
+typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer);
+typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer);
+GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target);
+#endif
+#endif /* GL_NV_pixel_data_range */
+
+#ifndef GL_NV_point_sprite
+#define GL_NV_point_sprite 1
+#define GL_POINT_SPRITE_NV 0x8861
+#define GL_COORD_REPLACE_NV 0x8862
+#define GL_POINT_SPRITE_R_MODE_NV 0x8863
+typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param);
+GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params);
+#endif
+#endif /* GL_NV_point_sprite */
+
+#ifndef GL_NV_present_video
+#define GL_NV_present_video 1
+#define GL_FRAME_NV 0x8E26
+#define GL_FIELDS_NV 0x8E27
+#define GL_CURRENT_TIME_NV 0x8E28
+#define GL_NUM_FILL_STREAMS_NV 0x8E29
+#define GL_PRESENT_TIME_NV 0x8E2A
+#define GL_PRESENT_DURATION_NV 0x8E2B
+typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params);
+typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params);
+typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1);
+GLAPI void APIENTRY glPresentFrameDualFillNV (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);
+GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params);
+GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params);
+GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params);
+#endif
+#endif /* GL_NV_present_video */
+
+#ifndef GL_NV_primitive_restart
+#define GL_NV_primitive_restart 1
+#define GL_PRIMITIVE_RESTART_NV 0x8558
+#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559
+typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void);
+typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPrimitiveRestartNV (void);
+GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index);
+#endif
+#endif /* GL_NV_primitive_restart */
+
+#ifndef GL_NV_register_combiners
+#define GL_NV_register_combiners 1
+#define GL_REGISTER_COMBINERS_NV 0x8522
+#define GL_VARIABLE_A_NV 0x8523
+#define GL_VARIABLE_B_NV 0x8524
+#define GL_VARIABLE_C_NV 0x8525
+#define GL_VARIABLE_D_NV 0x8526
+#define GL_VARIABLE_E_NV 0x8527
+#define GL_VARIABLE_F_NV 0x8528
+#define GL_VARIABLE_G_NV 0x8529
+#define GL_CONSTANT_COLOR0_NV 0x852A
+#define GL_CONSTANT_COLOR1_NV 0x852B
+#define GL_SPARE0_NV 0x852E
+#define GL_SPARE1_NV 0x852F
+#define GL_DISCARD_NV 0x8530
+#define GL_E_TIMES_F_NV 0x8531
+#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532
+#define GL_UNSIGNED_IDENTITY_NV 0x8536
+#define GL_UNSIGNED_INVERT_NV 0x8537
+#define GL_EXPAND_NORMAL_NV 0x8538
+#define GL_EXPAND_NEGATE_NV 0x8539
+#define GL_HALF_BIAS_NORMAL_NV 0x853A
+#define GL_HALF_BIAS_NEGATE_NV 0x853B
+#define GL_SIGNED_IDENTITY_NV 0x853C
+#define GL_SIGNED_NEGATE_NV 0x853D
+#define GL_SCALE_BY_TWO_NV 0x853E
+#define GL_SCALE_BY_FOUR_NV 0x853F
+#define GL_SCALE_BY_ONE_HALF_NV 0x8540
+#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541
+#define GL_COMBINER_INPUT_NV 0x8542
+#define GL_COMBINER_MAPPING_NV 0x8543
+#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544
+#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545
+#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546
+#define GL_COMBINER_MUX_SUM_NV 0x8547
+#define GL_COMBINER_SCALE_NV 0x8548
+#define GL_COMBINER_BIAS_NV 0x8549
+#define GL_COMBINER_AB_OUTPUT_NV 0x854A
+#define GL_COMBINER_CD_OUTPUT_NV 0x854B
+#define GL_COMBINER_SUM_OUTPUT_NV 0x854C
+#define GL_MAX_GENERAL_COMBINERS_NV 0x854D
+#define GL_NUM_GENERAL_COMBINERS_NV 0x854E
+#define GL_COLOR_SUM_CLAMP_NV 0x854F
+#define GL_COMBINER0_NV 0x8550
+#define GL_COMBINER1_NV 0x8551
+#define GL_COMBINER2_NV 0x8552
+#define GL_COMBINER3_NV 0x8553
+#define GL_COMBINER4_NV 0x8554
+#define GL_COMBINER5_NV 0x8555
+#define GL_COMBINER6_NV 0x8556
+#define GL_COMBINER7_NV 0x8557
+typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
+typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params);
+GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param);
+GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);
+GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);
+GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params);
+#endif
+#endif /* GL_NV_register_combiners */
+
+#ifndef GL_NV_register_combiners2
+#define GL_NV_register_combiners2 1
+#define GL_PER_STAGE_CONSTANTS_NV 0x8535
+typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params);
+#endif
+#endif /* GL_NV_register_combiners2 */
+
+#ifndef GL_NV_shader_atomic_counters
+#define GL_NV_shader_atomic_counters 1
+#endif /* GL_NV_shader_atomic_counters */
+
+#ifndef GL_NV_shader_atomic_float
+#define GL_NV_shader_atomic_float 1
+#endif /* GL_NV_shader_atomic_float */
+
+#ifndef GL_NV_shader_atomic_int64
+#define GL_NV_shader_atomic_int64 1
+#endif /* GL_NV_shader_atomic_int64 */
+
+#ifndef GL_NV_shader_buffer_load
+#define GL_NV_shader_buffer_load 1
+#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D
+#define GL_GPU_ADDRESS_NV 0x8F34
+#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35
+typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access);
+typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target);
+typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target);
+typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access);
+typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer);
+typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer);
+typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params);
+typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params);
+typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result);
+typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value);
+typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value);
+typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access);
+GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target);
+GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target);
+GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access);
+GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer);
+GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer);
+GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params);
+GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params);
+GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result);
+GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value);
+GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value);
+GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value);
+GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value);
+#endif
+#endif /* GL_NV_shader_buffer_load */
+
+#ifndef GL_NV_shader_buffer_store
+#define GL_NV_shader_buffer_store 1
+#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010
+#endif /* GL_NV_shader_buffer_store */
+
+#ifndef GL_NV_shader_storage_buffer_object
+#define GL_NV_shader_storage_buffer_object 1
+#endif /* GL_NV_shader_storage_buffer_object */
+
+#ifndef GL_NV_shader_thread_group
+#define GL_NV_shader_thread_group 1
+#define GL_WARP_SIZE_NV 0x9339
+#define GL_WARPS_PER_SM_NV 0x933A
+#define GL_SM_COUNT_NV 0x933B
+#endif /* GL_NV_shader_thread_group */
+
+#ifndef GL_NV_shader_thread_shuffle
+#define GL_NV_shader_thread_shuffle 1
+#endif /* GL_NV_shader_thread_shuffle */
+
+#ifndef GL_NV_tessellation_program5
+#define GL_NV_tessellation_program5 1
+#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8
+#define GL_TESS_CONTROL_PROGRAM_NV 0x891E
+#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F
+#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74
+#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75
+#endif /* GL_NV_tessellation_program5 */
+
+#ifndef GL_NV_texgen_emboss
+#define GL_NV_texgen_emboss 1
+#define GL_EMBOSS_LIGHT_NV 0x855D
+#define GL_EMBOSS_CONSTANT_NV 0x855E
+#define GL_EMBOSS_MAP_NV 0x855F
+#endif /* GL_NV_texgen_emboss */
+
+#ifndef GL_NV_texgen_reflection
+#define GL_NV_texgen_reflection 1
+#define GL_NORMAL_MAP_NV 0x8511
+#define GL_REFLECTION_MAP_NV 0x8512
+#endif /* GL_NV_texgen_reflection */
+
+#ifndef GL_NV_texture_barrier
+#define GL_NV_texture_barrier 1
+typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTextureBarrierNV (void);
+#endif
+#endif /* GL_NV_texture_barrier */
+
+#ifndef GL_NV_texture_compression_vtc
+#define GL_NV_texture_compression_vtc 1
+#endif /* GL_NV_texture_compression_vtc */
+
+#ifndef GL_NV_texture_env_combine4
+#define GL_NV_texture_env_combine4 1
+#define GL_COMBINE4_NV 0x8503
+#define GL_SOURCE3_RGB_NV 0x8583
+#define GL_SOURCE3_ALPHA_NV 0x858B
+#define GL_OPERAND3_RGB_NV 0x8593
+#define GL_OPERAND3_ALPHA_NV 0x859B
+#endif /* GL_NV_texture_env_combine4 */
+
+#ifndef GL_NV_texture_expand_normal
+#define GL_NV_texture_expand_normal 1
+#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F
+#endif /* GL_NV_texture_expand_normal */
+
+#ifndef GL_NV_texture_multisample
+#define GL_NV_texture_multisample 1
+#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045
+#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046
+typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations);
+#endif
+#endif /* GL_NV_texture_multisample */
+
+#ifndef GL_NV_texture_rectangle
+#define GL_NV_texture_rectangle 1
+#define GL_TEXTURE_RECTANGLE_NV 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8
+#endif /* GL_NV_texture_rectangle */
+
+#ifndef GL_NV_texture_shader
+#define GL_NV_texture_shader 1
+#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C
+#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D
+#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E
+#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB
+#define GL_DSDT_MAG_INTENSITY_NV 0x86DC
+#define GL_SHADER_CONSISTENT_NV 0x86DD
+#define GL_TEXTURE_SHADER_NV 0x86DE
+#define GL_SHADER_OPERATION_NV 0x86DF
+#define GL_CULL_MODES_NV 0x86E0
+#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1
+#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2
+#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3
+#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1
+#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2
+#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3
+#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4
+#define GL_CONST_EYE_NV 0x86E5
+#define GL_PASS_THROUGH_NV 0x86E6
+#define GL_CULL_FRAGMENT_NV 0x86E7
+#define GL_OFFSET_TEXTURE_2D_NV 0x86E8
+#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9
+#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA
+#define GL_DOT_PRODUCT_NV 0x86EC
+#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED
+#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE
+#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0
+#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1
+#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2
+#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3
+#define GL_HILO_NV 0x86F4
+#define GL_DSDT_NV 0x86F5
+#define GL_DSDT_MAG_NV 0x86F6
+#define GL_DSDT_MAG_VIB_NV 0x86F7
+#define GL_HILO16_NV 0x86F8
+#define GL_SIGNED_HILO_NV 0x86F9
+#define GL_SIGNED_HILO16_NV 0x86FA
+#define GL_SIGNED_RGBA_NV 0x86FB
+#define GL_SIGNED_RGBA8_NV 0x86FC
+#define GL_SIGNED_RGB_NV 0x86FE
+#define GL_SIGNED_RGB8_NV 0x86FF
+#define GL_SIGNED_LUMINANCE_NV 0x8701
+#define GL_SIGNED_LUMINANCE8_NV 0x8702
+#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704
+#define GL_SIGNED_ALPHA_NV 0x8705
+#define GL_SIGNED_ALPHA8_NV 0x8706
+#define GL_SIGNED_INTENSITY_NV 0x8707
+#define GL_SIGNED_INTENSITY8_NV 0x8708
+#define GL_DSDT8_NV 0x8709
+#define GL_DSDT8_MAG8_NV 0x870A
+#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D
+#define GL_HI_SCALE_NV 0x870E
+#define GL_LO_SCALE_NV 0x870F
+#define GL_DS_SCALE_NV 0x8710
+#define GL_DT_SCALE_NV 0x8711
+#define GL_MAGNITUDE_SCALE_NV 0x8712
+#define GL_VIBRANCE_SCALE_NV 0x8713
+#define GL_HI_BIAS_NV 0x8714
+#define GL_LO_BIAS_NV 0x8715
+#define GL_DS_BIAS_NV 0x8716
+#define GL_DT_BIAS_NV 0x8717
+#define GL_MAGNITUDE_BIAS_NV 0x8718
+#define GL_VIBRANCE_BIAS_NV 0x8719
+#define GL_TEXTURE_BORDER_VALUES_NV 0x871A
+#define GL_TEXTURE_HI_SIZE_NV 0x871B
+#define GL_TEXTURE_LO_SIZE_NV 0x871C
+#define GL_TEXTURE_DS_SIZE_NV 0x871D
+#define GL_TEXTURE_DT_SIZE_NV 0x871E
+#define GL_TEXTURE_MAG_SIZE_NV 0x871F
+#endif /* GL_NV_texture_shader */
+
+#ifndef GL_NV_texture_shader2
+#define GL_NV_texture_shader2 1
+#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF
+#endif /* GL_NV_texture_shader2 */
+
+#ifndef GL_NV_texture_shader3
+#define GL_NV_texture_shader3 1
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853
+#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854
+#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857
+#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858
+#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859
+#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A
+#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B
+#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C
+#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D
+#define GL_HILO8_NV 0x885E
+#define GL_SIGNED_HILO8_NV 0x885F
+#define GL_FORCE_BLUE_TO_ONE_NV 0x8860
+#endif /* GL_NV_texture_shader3 */
+
+#ifndef GL_NV_transform_feedback
+#define GL_NV_transform_feedback 1
+#define GL_BACK_PRIMARY_COLOR_NV 0x8C77
+#define GL_BACK_SECONDARY_COLOR_NV 0x8C78
+#define GL_TEXTURE_COORD_NV 0x8C79
+#define GL_CLIP_DISTANCE_NV 0x8C7A
+#define GL_VERTEX_ID_NV 0x8C7B
+#define GL_PRIMITIVE_ID_NV 0x8C7C
+#define GL_GENERIC_ATTRIB_NV 0x8C7D
+#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80
+#define GL_ACTIVE_VARYINGS_NV 0x8C81
+#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82
+#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85
+#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86
+#define GL_PRIMITIVES_GENERATED_NV 0x8C87
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88
+#define GL_RASTERIZER_DISCARD_NV 0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C
+#define GL_SEPARATE_ATTRIBS_NV 0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F
+#define GL_LAYER_NV 0x8DAA
+#define GL_NEXT_BUFFER_NV -2
+#define GL_SKIP_COMPONENTS4_NV -3
+#define GL_SKIP_COMPONENTS3_NV -4
+#define GL_SKIP_COMPONENTS2_NV -5
+#define GL_SKIP_COMPONENTS1_NV -6
+typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode);
+typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode);
+typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
+typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);
+typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name);
+typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name);
+typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location);
+typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode);
+GLAPI void APIENTRY glEndTransformFeedbackNV (void);
+GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode);
+GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset);
+GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer);
+GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode);
+GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name);
+GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name);
+GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);
+GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location);
+GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode);
+#endif
+#endif /* GL_NV_transform_feedback */
+
+#ifndef GL_NV_transform_feedback2
+#define GL_NV_transform_feedback2 1
+#define GL_TRANSFORM_FEEDBACK_NV 0x8E22
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25
+typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id);
+typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids);
+typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids);
+typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void);
+typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void);
+typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id);
+GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids);
+GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids);
+GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id);
+GLAPI void APIENTRY glPauseTransformFeedbackNV (void);
+GLAPI void APIENTRY glResumeTransformFeedbackNV (void);
+GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id);
+#endif
+#endif /* GL_NV_transform_feedback2 */
+
+#ifndef GL_NV_uniform_buffer_unified_memory
+#define GL_NV_uniform_buffer_unified_memory 1
+#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E
+#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F
+#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370
+#endif /* GL_NV_uniform_buffer_unified_memory */
+
+#ifndef GL_NV_vdpau_interop
+#define GL_NV_vdpau_interop 1
+typedef GLintptr GLvdpauSurfaceNV;
+#define GL_SURFACE_STATE_NV 0x86EB
+#define GL_SURFACE_REGISTERED_NV 0x86FD
+#define GL_SURFACE_MAPPED_NV 0x8700
+#define GL_WRITE_DISCARD_NV 0x88BE
+typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress);
+typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void);
+typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface);
+typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface);
+typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access);
+typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces);
+typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress);
+GLAPI void APIENTRY glVDPAUFiniNV (void);
+GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface);
+GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface);
+GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access);
+GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces);
+GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces);
+#endif
+#endif /* GL_NV_vdpau_interop */
+
+#ifndef GL_NV_vertex_array_range
+#define GL_NV_vertex_array_range 1
+#define GL_VERTEX_ARRAY_RANGE_NV 0x851D
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E
+#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F
+#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520
+#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521
+typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void);
+typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFlushVertexArrayRangeNV (void);
+GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer);
+#endif
+#endif /* GL_NV_vertex_array_range */
+
+#ifndef GL_NV_vertex_array_range2
+#define GL_NV_vertex_array_range2 1
+#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533
+#endif /* GL_NV_vertex_array_range2 */
+
+#ifndef GL_NV_vertex_attrib_integer_64bit
+#define GL_NV_vertex_attrib_integer_64bit 1
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x);
+GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y);
+GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v);
+GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v);
+GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v);
+GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v);
+GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x);
+GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y);
+GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v);
+GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v);
+GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v);
+GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v);
+GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params);
+GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params);
+GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride);
+#endif
+#endif /* GL_NV_vertex_attrib_integer_64bit */
+
+#ifndef GL_NV_vertex_buffer_unified_memory
+#define GL_NV_vertex_buffer_unified_memory 1
+#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E
+#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F
+#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20
+#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21
+#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22
+#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23
+#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24
+#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25
+#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26
+#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27
+#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28
+#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29
+#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A
+#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B
+#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C
+#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D
+#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E
+#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F
+#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30
+#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31
+#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32
+#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33
+#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40
+#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41
+#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42
+typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);
+typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride);
+typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
+typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);
+GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride);
+GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride);
+GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride);
+GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride);
+GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride);
+GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride);
+GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride);
+GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride);
+GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);
+GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride);
+GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result);
+#endif
+#endif /* GL_NV_vertex_buffer_unified_memory */
+
+#ifndef GL_NV_vertex_program
+#define GL_NV_vertex_program 1
+#define GL_VERTEX_PROGRAM_NV 0x8620
+#define GL_VERTEX_STATE_PROGRAM_NV 0x8621
+#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623
+#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624
+#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625
+#define GL_CURRENT_ATTRIB_NV 0x8626
+#define GL_PROGRAM_LENGTH_NV 0x8627
+#define GL_PROGRAM_STRING_NV 0x8628
+#define GL_MODELVIEW_PROJECTION_NV 0x8629
+#define GL_IDENTITY_NV 0x862A
+#define GL_INVERSE_NV 0x862B
+#define GL_TRANSPOSE_NV 0x862C
+#define GL_INVERSE_TRANSPOSE_NV 0x862D
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E
+#define GL_MAX_TRACK_MATRICES_NV 0x862F
+#define GL_MATRIX0_NV 0x8630
+#define GL_MATRIX1_NV 0x8631
+#define GL_MATRIX2_NV 0x8632
+#define GL_MATRIX3_NV 0x8633
+#define GL_MATRIX4_NV 0x8634
+#define GL_MATRIX5_NV 0x8635
+#define GL_MATRIX6_NV 0x8636
+#define GL_MATRIX7_NV 0x8637
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640
+#define GL_CURRENT_MATRIX_NV 0x8641
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643
+#define GL_PROGRAM_PARAMETER_NV 0x8644
+#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645
+#define GL_PROGRAM_TARGET_NV 0x8646
+#define GL_PROGRAM_RESIDENT_NV 0x8647
+#define GL_TRACK_MATRIX_NV 0x8648
+#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649
+#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A
+#define GL_PROGRAM_ERROR_POSITION_NV 0x864B
+#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650
+#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651
+#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652
+#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653
+#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654
+#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655
+#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656
+#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657
+#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658
+#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659
+#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A
+#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B
+#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C
+#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D
+#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E
+#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F
+typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences);
+typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);
+typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);
+typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params);
+typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs);
+typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program);
+typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer);
+typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id);
+typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs);
+typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences);
+GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id);
+GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs);
+GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params);
+GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs);
+GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params);
+GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program);
+GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params);
+GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer);
+GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id);
+GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program);
+GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v);
+GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs);
+GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform);
+GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x);
+GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x);
+GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x);
+GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y);
+GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y);
+GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y);
+GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z);
+GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
+GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
+GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v);
+GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v);
+GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v);
+GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v);
+GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v);
+GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v);
+GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v);
+#endif
+#endif /* GL_NV_vertex_program */
+
+#ifndef GL_NV_vertex_program1_1
+#define GL_NV_vertex_program1_1 1
+#endif /* GL_NV_vertex_program1_1 */
+
+#ifndef GL_NV_vertex_program2
+#define GL_NV_vertex_program2 1
+#endif /* GL_NV_vertex_program2 */
+
+#ifndef GL_NV_vertex_program2_option
+#define GL_NV_vertex_program2_option 1
+#endif /* GL_NV_vertex_program2_option */
+
+#ifndef GL_NV_vertex_program3
+#define GL_NV_vertex_program3 1
+#endif /* GL_NV_vertex_program3 */
+
+#ifndef GL_NV_vertex_program4
+#define GL_NV_vertex_program4 1
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v);
+typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x);
+GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y);
+GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z);
+GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w);
+GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x);
+GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y);
+GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z);
+GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v);
+GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v);
+GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v);
+GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v);
+GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v);
+GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v);
+GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer);
+GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params);
+#endif
+#endif /* GL_NV_vertex_program4 */
+
+#ifndef GL_NV_video_capture
+#define GL_NV_video_capture 1
+#define GL_VIDEO_BUFFER_NV 0x9020
+#define GL_VIDEO_BUFFER_BINDING_NV 0x9021
+#define GL_FIELD_UPPER_NV 0x9022
+#define GL_FIELD_LOWER_NV 0x9023
+#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024
+#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025
+#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026
+#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027
+#define GL_VIDEO_BUFFER_PITCH_NV 0x9028
+#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029
+#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A
+#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B
+#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C
+#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D
+#define GL_PARTIAL_SUCCESS_NV 0x902E
+#define GL_SUCCESS_NV 0x902F
+#define GL_FAILURE_NV 0x9030
+#define GL_YCBYCR8_422_NV 0x9031
+#define GL_YCBAYCR8A_4224_NV 0x9032
+#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033
+#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034
+#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035
+#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036
+#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037
+#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038
+#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039
+#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A
+#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B
+#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C
+typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot);
+typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset);
+typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture);
+typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot);
+typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params);
+typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time);
+typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot);
+GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset);
+GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture);
+GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot);
+GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params);
+GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time);
+GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params);
+#endif
+#endif /* GL_NV_video_capture */
+
+#ifndef GL_OML_interlace
+#define GL_OML_interlace 1
+#define GL_INTERLACE_OML 0x8980
+#define GL_INTERLACE_READ_OML 0x8981
+#endif /* GL_OML_interlace */
+
+#ifndef GL_OML_resample
+#define GL_OML_resample 1
+#define GL_PACK_RESAMPLE_OML 0x8984
+#define GL_UNPACK_RESAMPLE_OML 0x8985
+#define GL_RESAMPLE_REPLICATE_OML 0x8986
+#define GL_RESAMPLE_ZERO_FILL_OML 0x8987
+#define GL_RESAMPLE_AVERAGE_OML 0x8988
+#define GL_RESAMPLE_DECIMATE_OML 0x8989
+#endif /* GL_OML_resample */
+
+#ifndef GL_OML_subsample
+#define GL_OML_subsample 1
+#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982
+#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983
+#endif /* GL_OML_subsample */
+
+#ifndef GL_PGI_misc_hints
+#define GL_PGI_misc_hints 1
+#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8
+#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD
+#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE
+#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202
+#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203
+#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204
+#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C
+#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D
+#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E
+#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F
+#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210
+#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211
+#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216
+#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217
+#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218
+#define GL_FULL_STIPPLE_HINT_PGI 0x1A219
+#define GL_CLIP_NEAR_HINT_PGI 0x1A220
+#define GL_CLIP_FAR_HINT_PGI 0x1A221
+#define GL_WIDE_LINE_HINT_PGI 0x1A222
+#define GL_BACK_NORMALS_HINT_PGI 0x1A223
+typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode);
+#endif
+#endif /* GL_PGI_misc_hints */
+
+#ifndef GL_PGI_vertex_hints
+#define GL_PGI_vertex_hints 1
+#define GL_VERTEX_DATA_HINT_PGI 0x1A22A
+#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B
+#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C
+#define GL_MAX_VERTEX_HINT_PGI 0x1A22D
+#define GL_COLOR3_BIT_PGI 0x00010000
+#define GL_COLOR4_BIT_PGI 0x00020000
+#define GL_EDGEFLAG_BIT_PGI 0x00040000
+#define GL_INDEX_BIT_PGI 0x00080000
+#define GL_MAT_AMBIENT_BIT_PGI 0x00100000
+#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000
+#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000
+#define GL_MAT_EMISSION_BIT_PGI 0x00800000
+#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000
+#define GL_MAT_SHININESS_BIT_PGI 0x02000000
+#define GL_MAT_SPECULAR_BIT_PGI 0x04000000
+#define GL_NORMAL_BIT_PGI 0x08000000
+#define GL_TEXCOORD1_BIT_PGI 0x10000000
+#define GL_TEXCOORD2_BIT_PGI 0x20000000
+#define GL_TEXCOORD3_BIT_PGI 0x40000000
+#define GL_TEXCOORD4_BIT_PGI 0x80000000
+#define GL_VERTEX23_BIT_PGI 0x00000004
+#define GL_VERTEX4_BIT_PGI 0x00000008
+#endif /* GL_PGI_vertex_hints */
+
+#ifndef GL_REND_screen_coordinates
+#define GL_REND_screen_coordinates 1
+#define GL_SCREEN_COORDINATES_REND 0x8490
+#define GL_INVERTED_SCREEN_W_REND 0x8491
+#endif /* GL_REND_screen_coordinates */
+
+#ifndef GL_S3_s3tc
+#define GL_S3_s3tc 1
+#define GL_RGB_S3TC 0x83A0
+#define GL_RGB4_S3TC 0x83A1
+#define GL_RGBA_S3TC 0x83A2
+#define GL_RGBA4_S3TC 0x83A3
+#define GL_RGBA_DXT5_S3TC 0x83A4
+#define GL_RGBA4_DXT5_S3TC 0x83A5
+#endif /* GL_S3_s3tc */
+
+#ifndef GL_SGIS_detail_texture
+#define GL_SGIS_detail_texture 1
+#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095
+#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096
+#define GL_LINEAR_DETAIL_SGIS 0x8097
+#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098
+#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099
+#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A
+#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B
+#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C
+typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points);
+typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points);
+GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points);
+#endif
+#endif /* GL_SGIS_detail_texture */
+
+#ifndef GL_SGIS_fog_function
+#define GL_SGIS_fog_function 1
+#define GL_FOG_FUNC_SGIS 0x812A
+#define GL_FOG_FUNC_POINTS_SGIS 0x812B
+#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C
+typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points);
+typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points);
+GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points);
+#endif
+#endif /* GL_SGIS_fog_function */
+
+#ifndef GL_SGIS_generate_mipmap
+#define GL_SGIS_generate_mipmap 1
+#define GL_GENERATE_MIPMAP_SGIS 0x8191
+#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192
+#endif /* GL_SGIS_generate_mipmap */
+
+#ifndef GL_SGIS_multisample
+#define GL_SGIS_multisample 1
+#define GL_MULTISAMPLE_SGIS 0x809D
+#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E
+#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F
+#define GL_SAMPLE_MASK_SGIS 0x80A0
+#define GL_1PASS_SGIS 0x80A1
+#define GL_2PASS_0_SGIS 0x80A2
+#define GL_2PASS_1_SGIS 0x80A3
+#define GL_4PASS_0_SGIS 0x80A4
+#define GL_4PASS_1_SGIS 0x80A5
+#define GL_4PASS_2_SGIS 0x80A6
+#define GL_4PASS_3_SGIS 0x80A7
+#define GL_SAMPLE_BUFFERS_SGIS 0x80A8
+#define GL_SAMPLES_SGIS 0x80A9
+#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA
+#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB
+#define GL_SAMPLE_PATTERN_SGIS 0x80AC
+typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);
+typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert);
+GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern);
+#endif
+#endif /* GL_SGIS_multisample */
+
+#ifndef GL_SGIS_pixel_texture
+#define GL_SGIS_pixel_texture 1
+#define GL_PIXEL_TEXTURE_SGIS 0x8353
+#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354
+#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355
+#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356
+typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param);
+GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params);
+GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params);
+#endif
+#endif /* GL_SGIS_pixel_texture */
+
+#ifndef GL_SGIS_point_line_texgen
+#define GL_SGIS_point_line_texgen 1
+#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0
+#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1
+#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2
+#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3
+#define GL_EYE_POINT_SGIS 0x81F4
+#define GL_OBJECT_POINT_SGIS 0x81F5
+#define GL_EYE_LINE_SGIS 0x81F6
+#define GL_OBJECT_LINE_SGIS 0x81F7
+#endif /* GL_SGIS_point_line_texgen */
+
+#ifndef GL_SGIS_point_parameters
+#define GL_SGIS_point_parameters 1
+#define GL_POINT_SIZE_MIN_SGIS 0x8126
+#define GL_POINT_SIZE_MAX_SGIS 0x8127
+#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128
+#define GL_DISTANCE_ATTENUATION_SGIS 0x8129
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params);
+#endif
+#endif /* GL_SGIS_point_parameters */
+
+#ifndef GL_SGIS_sharpen_texture
+#define GL_SGIS_sharpen_texture 1
+#define GL_LINEAR_SHARPEN_SGIS 0x80AD
+#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE
+#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF
+#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0
+typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points);
+typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points);
+GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points);
+#endif
+#endif /* GL_SGIS_sharpen_texture */
+
+#ifndef GL_SGIS_texture4D
+#define GL_SGIS_texture4D 1
+#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130
+#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131
+#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132
+#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133
+#define GL_TEXTURE_4D_SGIS 0x8134
+#define GL_PROXY_TEXTURE_4D_SGIS 0x8135
+#define GL_TEXTURE_4DSIZE_SGIS 0x8136
+#define GL_TEXTURE_WRAP_Q_SGIS 0x8137
+#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138
+#define GL_TEXTURE_4D_BINDING_SGIS 0x814F
+typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels);
+typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels);
+GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels);
+#endif
+#endif /* GL_SGIS_texture4D */
+
+#ifndef GL_SGIS_texture_border_clamp
+#define GL_SGIS_texture_border_clamp 1
+#define GL_CLAMP_TO_BORDER_SGIS 0x812D
+#endif /* GL_SGIS_texture_border_clamp */
+
+#ifndef GL_SGIS_texture_color_mask
+#define GL_SGIS_texture_color_mask 1
+#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF
+typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+#endif
+#endif /* GL_SGIS_texture_color_mask */
+
+#ifndef GL_SGIS_texture_edge_clamp
+#define GL_SGIS_texture_edge_clamp 1
+#define GL_CLAMP_TO_EDGE_SGIS 0x812F
+#endif /* GL_SGIS_texture_edge_clamp */
+
+#ifndef GL_SGIS_texture_filter4
+#define GL_SGIS_texture_filter4 1
+#define GL_FILTER4_SGIS 0x8146
+#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147
+typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights);
+typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights);
+GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights);
+#endif
+#endif /* GL_SGIS_texture_filter4 */
+
+#ifndef GL_SGIS_texture_lod
+#define GL_SGIS_texture_lod 1
+#define GL_TEXTURE_MIN_LOD_SGIS 0x813A
+#define GL_TEXTURE_MAX_LOD_SGIS 0x813B
+#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C
+#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D
+#endif /* GL_SGIS_texture_lod */
+
+#ifndef GL_SGIS_texture_select
+#define GL_SGIS_texture_select 1
+#define GL_DUAL_ALPHA4_SGIS 0x8110
+#define GL_DUAL_ALPHA8_SGIS 0x8111
+#define GL_DUAL_ALPHA12_SGIS 0x8112
+#define GL_DUAL_ALPHA16_SGIS 0x8113
+#define GL_DUAL_LUMINANCE4_SGIS 0x8114
+#define GL_DUAL_LUMINANCE8_SGIS 0x8115
+#define GL_DUAL_LUMINANCE12_SGIS 0x8116
+#define GL_DUAL_LUMINANCE16_SGIS 0x8117
+#define GL_DUAL_INTENSITY4_SGIS 0x8118
+#define GL_DUAL_INTENSITY8_SGIS 0x8119
+#define GL_DUAL_INTENSITY12_SGIS 0x811A
+#define GL_DUAL_INTENSITY16_SGIS 0x811B
+#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C
+#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D
+#define GL_QUAD_ALPHA4_SGIS 0x811E
+#define GL_QUAD_ALPHA8_SGIS 0x811F
+#define GL_QUAD_LUMINANCE4_SGIS 0x8120
+#define GL_QUAD_LUMINANCE8_SGIS 0x8121
+#define GL_QUAD_INTENSITY4_SGIS 0x8122
+#define GL_QUAD_INTENSITY8_SGIS 0x8123
+#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124
+#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125
+#endif /* GL_SGIS_texture_select */
+
+#ifndef GL_SGIX_async
+#define GL_SGIX_async 1
+#define GL_ASYNC_MARKER_SGIX 0x8329
+typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker);
+typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp);
+typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp);
+typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);
+typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);
+typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker);
+GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp);
+GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp);
+GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range);
+GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range);
+GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker);
+#endif
+#endif /* GL_SGIX_async */
+
+#ifndef GL_SGIX_async_histogram
+#define GL_SGIX_async_histogram 1
+#define GL_ASYNC_HISTOGRAM_SGIX 0x832C
+#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D
+#endif /* GL_SGIX_async_histogram */
+
+#ifndef GL_SGIX_async_pixel
+#define GL_SGIX_async_pixel 1
+#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C
+#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D
+#define GL_ASYNC_READ_PIXELS_SGIX 0x835E
+#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F
+#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360
+#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361
+#endif /* GL_SGIX_async_pixel */
+
+#ifndef GL_SGIX_blend_alpha_minmax
+#define GL_SGIX_blend_alpha_minmax 1
+#define GL_ALPHA_MIN_SGIX 0x8320
+#define GL_ALPHA_MAX_SGIX 0x8321
+#endif /* GL_SGIX_blend_alpha_minmax */
+
+#ifndef GL_SGIX_calligraphic_fragment
+#define GL_SGIX_calligraphic_fragment 1
+#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183
+#endif /* GL_SGIX_calligraphic_fragment */
+
+#ifndef GL_SGIX_clipmap
+#define GL_SGIX_clipmap 1
+#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170
+#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171
+#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172
+#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173
+#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174
+#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175
+#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176
+#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177
+#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178
+#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D
+#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E
+#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F
+#endif /* GL_SGIX_clipmap */
+
+#ifndef GL_SGIX_convolution_accuracy
+#define GL_SGIX_convolution_accuracy 1
+#define GL_CONVOLUTION_HINT_SGIX 0x8316
+#endif /* GL_SGIX_convolution_accuracy */
+
+#ifndef GL_SGIX_depth_pass_instrument
+#define GL_SGIX_depth_pass_instrument 1
+#endif /* GL_SGIX_depth_pass_instrument */
+
+#ifndef GL_SGIX_depth_texture
+#define GL_SGIX_depth_texture 1
+#define GL_DEPTH_COMPONENT16_SGIX 0x81A5
+#define GL_DEPTH_COMPONENT24_SGIX 0x81A6
+#define GL_DEPTH_COMPONENT32_SGIX 0x81A7
+#endif /* GL_SGIX_depth_texture */
+
+#ifndef GL_SGIX_flush_raster
+#define GL_SGIX_flush_raster 1
+typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFlushRasterSGIX (void);
+#endif
+#endif /* GL_SGIX_flush_raster */
+
+#ifndef GL_SGIX_fog_offset
+#define GL_SGIX_fog_offset 1
+#define GL_FOG_OFFSET_SGIX 0x8198
+#define GL_FOG_OFFSET_VALUE_SGIX 0x8199
+#endif /* GL_SGIX_fog_offset */
+
+#ifndef GL_SGIX_fragment_lighting
+#define GL_SGIX_fragment_lighting 1
+#define GL_FRAGMENT_LIGHTING_SGIX 0x8400
+#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401
+#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402
+#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403
+#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404
+#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405
+#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406
+#define GL_LIGHT_ENV_MODE_SGIX 0x8407
+#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408
+#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409
+#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A
+#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B
+#define GL_FRAGMENT_LIGHT0_SGIX 0x840C
+#define GL_FRAGMENT_LIGHT1_SGIX 0x840D
+#define GL_FRAGMENT_LIGHT2_SGIX 0x840E
+#define GL_FRAGMENT_LIGHT3_SGIX 0x840F
+#define GL_FRAGMENT_LIGHT4_SGIX 0x8410
+#define GL_FRAGMENT_LIGHT5_SGIX 0x8411
+#define GL_FRAGMENT_LIGHT6_SGIX 0x8412
+#define GL_FRAGMENT_LIGHT7_SGIX 0x8413
+typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode);
+GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param);
+GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param);
+GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params);
+GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param);
+GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params);
+GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params);
+GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param);
+#endif
+#endif /* GL_SGIX_fragment_lighting */
+
+#ifndef GL_SGIX_framezoom
+#define GL_SGIX_framezoom 1
+#define GL_FRAMEZOOM_SGIX 0x818B
+#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C
+#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D
+typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFrameZoomSGIX (GLint factor);
+#endif
+#endif /* GL_SGIX_framezoom */
+
+#ifndef GL_SGIX_igloo_interface
+#define GL_SGIX_igloo_interface 1
+typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params);
+#endif
+#endif /* GL_SGIX_igloo_interface */
+
+#ifndef GL_SGIX_instruments
+#define GL_SGIX_instruments 1
+#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180
+#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181
+typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void);
+typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer);
+typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p);
+typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker);
+typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void);
+typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI GLint APIENTRY glGetInstrumentsSGIX (void);
+GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer);
+GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p);
+GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker);
+GLAPI void APIENTRY glStartInstrumentsSGIX (void);
+GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker);
+#endif
+#endif /* GL_SGIX_instruments */
+
+#ifndef GL_SGIX_interlace
+#define GL_SGIX_interlace 1
+#define GL_INTERLACE_SGIX 0x8094
+#endif /* GL_SGIX_interlace */
+
+#ifndef GL_SGIX_ir_instrument1
+#define GL_SGIX_ir_instrument1 1
+#define GL_IR_INSTRUMENT1_SGIX 0x817F
+#endif /* GL_SGIX_ir_instrument1 */
+
+#ifndef GL_SGIX_list_priority
+#define GL_SGIX_list_priority 1
+#define GL_LIST_PRIORITY_SGIX 0x8182
+typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params);
+GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param);
+GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param);
+GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params);
+#endif
+#endif /* GL_SGIX_list_priority */
+
+#ifndef GL_SGIX_pixel_texture
+#define GL_SGIX_pixel_texture 1
+#define GL_PIXEL_TEX_GEN_SGIX 0x8139
+#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B
+typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode);
+#endif
+#endif /* GL_SGIX_pixel_texture */
+
+#ifndef GL_SGIX_pixel_tiles
+#define GL_SGIX_pixel_tiles 1
+#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E
+#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F
+#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140
+#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141
+#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142
+#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143
+#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144
+#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145
+#endif /* GL_SGIX_pixel_tiles */
+
+#ifndef GL_SGIX_polynomial_ffd
+#define GL_SGIX_polynomial_ffd 1
+#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001
+#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002
+#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194
+#define GL_TEXTURE_DEFORMATION_SGIX 0x8195
+#define GL_DEFORMATIONS_MASK_SGIX 0x8196
+#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197
+typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points);
+typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points);
+typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask);
+typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points);
+GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points);
+GLAPI void APIENTRY glDeformSGIX (GLbitfield mask);
+GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask);
+#endif
+#endif /* GL_SGIX_polynomial_ffd */
+
+#ifndef GL_SGIX_reference_plane
+#define GL_SGIX_reference_plane 1
+#define GL_REFERENCE_PLANE_SGIX 0x817D
+#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E
+typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation);
+#endif
+#endif /* GL_SGIX_reference_plane */
+
+#ifndef GL_SGIX_resample
+#define GL_SGIX_resample 1
+#define GL_PACK_RESAMPLE_SGIX 0x842C
+#define GL_UNPACK_RESAMPLE_SGIX 0x842D
+#define GL_RESAMPLE_REPLICATE_SGIX 0x842E
+#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F
+#define GL_RESAMPLE_DECIMATE_SGIX 0x8430
+#endif /* GL_SGIX_resample */
+
+#ifndef GL_SGIX_scalebias_hint
+#define GL_SGIX_scalebias_hint 1
+#define GL_SCALEBIAS_HINT_SGIX 0x8322
+#endif /* GL_SGIX_scalebias_hint */
+
+#ifndef GL_SGIX_shadow
+#define GL_SGIX_shadow 1
+#define GL_TEXTURE_COMPARE_SGIX 0x819A
+#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B
+#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C
+#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D
+#endif /* GL_SGIX_shadow */
+
+#ifndef GL_SGIX_shadow_ambient
+#define GL_SGIX_shadow_ambient 1
+#define GL_SHADOW_AMBIENT_SGIX 0x80BF
+#endif /* GL_SGIX_shadow_ambient */
+
+#ifndef GL_SGIX_sprite
+#define GL_SGIX_sprite 1
+#define GL_SPRITE_SGIX 0x8148
+#define GL_SPRITE_MODE_SGIX 0x8149
+#define GL_SPRITE_AXIS_SGIX 0x814A
+#define GL_SPRITE_TRANSLATION_SGIX 0x814B
+#define GL_SPRITE_AXIAL_SGIX 0x814C
+#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D
+#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E
+typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);
+typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param);
+GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param);
+GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params);
+#endif
+#endif /* GL_SGIX_sprite */
+
+#ifndef GL_SGIX_subsample
+#define GL_SGIX_subsample 1
+#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0
+#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1
+#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2
+#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3
+#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4
+#endif /* GL_SGIX_subsample */
+
+#ifndef GL_SGIX_tag_sample_buffer
+#define GL_SGIX_tag_sample_buffer 1
+typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glTagSampleBufferSGIX (void);
+#endif
+#endif /* GL_SGIX_tag_sample_buffer */
+
+#ifndef GL_SGIX_texture_add_env
+#define GL_SGIX_texture_add_env 1
+#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE
+#endif /* GL_SGIX_texture_add_env */
+
+#ifndef GL_SGIX_texture_coordinate_clamp
+#define GL_SGIX_texture_coordinate_clamp 1
+#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369
+#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A
+#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B
+#endif /* GL_SGIX_texture_coordinate_clamp */
+
+#ifndef GL_SGIX_texture_lod_bias
+#define GL_SGIX_texture_lod_bias 1
+#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E
+#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F
+#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190
+#endif /* GL_SGIX_texture_lod_bias */
+
+#ifndef GL_SGIX_texture_multi_buffer
+#define GL_SGIX_texture_multi_buffer 1
+#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E
+#endif /* GL_SGIX_texture_multi_buffer */
+
+#ifndef GL_SGIX_texture_scale_bias
+#define GL_SGIX_texture_scale_bias 1
+#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179
+#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A
+#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B
+#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C
+#endif /* GL_SGIX_texture_scale_bias */
+
+#ifndef GL_SGIX_vertex_preclip
+#define GL_SGIX_vertex_preclip 1
+#define GL_VERTEX_PRECLIP_SGIX 0x83EE
+#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF
+#endif /* GL_SGIX_vertex_preclip */
+
+#ifndef GL_SGIX_ycrcb
+#define GL_SGIX_ycrcb 1
+#define GL_YCRCB_422_SGIX 0x81BB
+#define GL_YCRCB_444_SGIX 0x81BC
+#endif /* GL_SGIX_ycrcb */
+
+#ifndef GL_SGIX_ycrcb_subsample
+#define GL_SGIX_ycrcb_subsample 1
+#endif /* GL_SGIX_ycrcb_subsample */
+
+#ifndef GL_SGIX_ycrcba
+#define GL_SGIX_ycrcba 1
+#define GL_YCRCB_SGIX 0x8318
+#define GL_YCRCBA_SGIX 0x8319
+#endif /* GL_SGIX_ycrcba */
+
+#ifndef GL_SGI_color_matrix
+#define GL_SGI_color_matrix 1
+#define GL_COLOR_MATRIX_SGI 0x80B1
+#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3
+#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7
+#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB
+#endif /* GL_SGI_color_matrix */
+
+#ifndef GL_SGI_color_table
+#define GL_SGI_color_table 1
+#define GL_COLOR_TABLE_SGI 0x80D0
+#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2
+#define GL_PROXY_COLOR_TABLE_SGI 0x80D3
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5
+#define GL_COLOR_TABLE_SCALE_SGI 0x80D6
+#define GL_COLOR_TABLE_BIAS_SGI 0x80D7
+#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8
+#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9
+#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA
+#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB
+#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC
+#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD
+#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE
+#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF
+typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
+typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params);
+typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params);
+typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params);
+typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table);
+GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params);
+GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params);
+GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
+GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table);
+GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params);
+GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params);
+#endif
+#endif /* GL_SGI_color_table */
+
+#ifndef GL_SGI_texture_color_table
+#define GL_SGI_texture_color_table 1
+#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC
+#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD
+#endif /* GL_SGI_texture_color_table */
+
+#ifndef GL_SUNX_constant_data
+#define GL_SUNX_constant_data 1
+#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5
+#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6
+typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glFinishTextureSUNX (void);
+#endif
+#endif /* GL_SUNX_constant_data */
+
+#ifndef GL_SUN_convolution_border_modes
+#define GL_SUN_convolution_border_modes 1
+#define GL_WRAP_BORDER_SUN 0x81D4
+#endif /* GL_SUN_convolution_border_modes */
+
+#ifndef GL_SUN_global_alpha
+#define GL_SUN_global_alpha 1
+#define GL_GLOBAL_ALPHA_SUN 0x81D9
+#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);
+typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor);
+GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor);
+GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor);
+GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor);
+GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor);
+GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor);
+GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor);
+GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor);
+#endif
+#endif /* GL_SUN_global_alpha */
+
+#ifndef GL_SUN_mesh_array
+#define GL_SUN_mesh_array 1
+#define GL_QUAD_MESH_SUN 0x8614
+#define GL_TRIANGLE_MESH_SUN 0x8615
+typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width);
+#endif
+#endif /* GL_SUN_mesh_array */
+
+#ifndef GL_SUN_slice_accum
+#define GL_SUN_slice_accum 1
+#define GL_SLICE_ACCUM_SUN 0x85CC
+#endif /* GL_SUN_slice_accum */
+
+#ifndef GL_SUN_triangle_list
+#define GL_SUN_triangle_list 1
+#define GL_RESTART_SUN 0x0001
+#define GL_REPLACE_MIDDLE_SUN 0x0002
+#define GL_REPLACE_OLDEST_SUN 0x0003
+#define GL_TRIANGLE_LIST_SUN 0x81D7
+#define GL_REPLACEMENT_CODE_SUN 0x81D8
+#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0
+#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1
+#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2
+#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3
+#define GL_R1UI_V3F_SUN 0x85C4
+#define GL_R1UI_C4UB_V3F_SUN 0x85C5
+#define GL_R1UI_C3F_V3F_SUN 0x85C6
+#define GL_R1UI_N3F_V3F_SUN 0x85C7
+#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8
+#define GL_R1UI_T2F_V3F_SUN 0x85C9
+#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA
+#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code);
+GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code);
+GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code);
+GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code);
+GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code);
+GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code);
+GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer);
+#endif
+#endif /* GL_SUN_triangle_list */
+
+#ifndef GL_SUN_vertex
+#define GL_SUN_vertex 1
+typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);
+typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v);
+typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v);
+typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v);
+typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v);
+typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v);
+typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v);
+typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v);
+typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);
+typedef void (APIENTRYP 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);
+typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+#ifdef GL_GLEXT_PROTOTYPES
+GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);
+GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v);
+GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v);
+GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v);
+GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v);
+GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v);
+GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v);
+GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v);
+GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (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);
+GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);
+GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v);
+GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (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);
+GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v);
+#endif
+#endif /* GL_SUN_vertex */
+
+#ifndef GL_WIN_phong_shading
+#define GL_WIN_phong_shading 1
+#define GL_PHONG_WIN 0x80EA
+#define GL_PHONG_HINT_WIN 0x80EB
+#endif /* GL_WIN_phong_shading */
+
+#ifndef GL_WIN_specular_fog
+#define GL_WIN_specular_fog 1
+#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC
+#endif /* GL_WIN_specular_fog */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glfuncdef.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glfuncdef.h
new file mode 100644
index 0000000..cd50a3a
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glfuncdef.h
@@ -0,0 +1,343 @@
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and related documentation and
+// any modifications thereto. Any use, reproduction, disclosure, or
+// distribution of this software and related documentation without an express
+// license agreement from NVIDIA Corporation is strictly prohibited.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise Under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2012 NVIDIA Corporation. All rights reserved.
+
+/*
+** Copyright (c) 2013-2016 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+*/
+
+
+/// @file glfuncdef.h
+/// this is our internal OpenGL function header define
+
+#ifndef __gl_func_def_h_
+#define __gl_func_def_h_
+
+#include <GLES2/gl2platform.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-------------------------------------------------------------------------
+ * GL2 core functions.
+ *-----------------------------------------------------------------------*/
+
+GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
+GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const char* name);
+GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
+GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+GL_APICALL void GL_APIENTRY glBlendEquation ( GLenum mode );
+GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
+GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void* data, GLenum usage);
+GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
+GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
+GL_APICALL void GL_APIENTRY glClearDepthf (GLclampf depth);
+GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
+GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
+GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
+GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
+GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers);
+GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers);
+GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers);
+GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar);
+GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
+GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glDrawBuffers( GLsizei n, const GLenum *bufs);
+GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
+GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers);
+GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
+GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers);
+GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers);
+GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
+GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+GL_APICALL int GL_APIENTRY glGetAttribLocation (GLuint program, const char* name);
+GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params);
+GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params);
+GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params);
+GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
+GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params);
+GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params);
+GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
+GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
+GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params);
+GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params);
+GL_APICALL int GL_APIENTRY glGetUniformLocation (GLuint program, const char* name);
+GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params);
+GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void** pointer);
+GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
+GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
+GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
+GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
+GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
+GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert);
+GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
+GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const char** string, const GLint* length);
+GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat x);
+GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v);
+GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint x);
+GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v);
+GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y);
+GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v);
+GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z);
+GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v);
+GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v);
+GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
+GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x);
+GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values);
+GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values);
+GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values);
+GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values);
+GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
+
+/*-------------------------------------------------------------------------
+ * GL3 core functions.
+ *-----------------------------------------------------------------------*/
+
+GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glBindBufferBase(GLenum target, GLuint index, GLuint buffer);
+GL_APICALL void GL_APIENTRY glBindFragDataLocation (GLuint program, GLuint colorNumber, const GLchar * name);
+GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array);
+GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync);
+GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
+GL_APICALL void GL_APIENTRY glEndQuery (GLenum target);
+GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags);
+GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
+GL_APICALL void GL_APIENTRY glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params);
+GL_APICALL const GLubyte* GL_APIENTRY glGetStringi (GLenum name, GLuint index);
+GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex( GLuint program, const GLchar *uniformBlockName);
+GL_APICALL GLvoid* GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+GL_APICALL void GL_APIENTRY glQueryCounter (GLuint id, GLenum target);
+GL_APICALL void GL_APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
+GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target);
+GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout);
+
+/*-------------------------------------------------------------------------
+ * GL4 core functions.
+ *-----------------------------------------------------------------------*/
+
+GL_APICALL void GL_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program);
+GL_APICALL void GL_APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
+GL_APICALL void GL_APIENTRY glBindProgramPipeline (GLuint pipeline);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z);
+GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect);
+GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect);
+GL_APICALL void GL_APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect);
+GL_APICALL void GL_APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val );
+GL_APICALL void GL_APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name);
+GL_APICALL void GL_APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name);
+GL_APICALL void GL_APIENTRY glMemoryBarrier (GLbitfield barriers);
+GL_APICALL void GL_APIENTRY glMinSampleShading (GLfloat value );
+GL_APICALL void GL_APIENTRY glPatchParameteri (GLenum pname, GLint value );
+GL_APICALL void GL_APIENTRY glPatchParameterfv (GLenum pname, GLint value );
+GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage2DMultisample (GLint target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations);
+GL_APICALL void GL_APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0);
+GL_APICALL void GL_APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1);
+GL_APICALL void GL_APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
+GL_APICALL void GL_APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
+GL_APICALL void GL_APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glValidateProgramPipeline (GLuint pipeline);
+
+
+/*-------------------------------------------------------------------------
+ * GL4 NV extensions
+ *-----------------------------------------------------------------------*/
+
+GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range);
+GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range);
+GL_APICALL GLboolean GL_APIENTRY glIsPathNV (GLuint path);
+GL_APICALL void GL_APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords);
+GL_APICALL void GL_APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString);
+GL_APICALL void GL_APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights);
+GL_APICALL void GL_APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath);
+GL_APICALL void GL_APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight);
+GL_APICALL void GL_APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value);
+GL_APICALL void GL_APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value);
+GL_APICALL void GL_APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray);
+GL_APICALL void GL_APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask);
+GL_APICALL void GL_APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units);
+GL_APICALL void GL_APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask);
+GL_APICALL void GL_APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glPathCoverDepthFuncNV (GLenum func);
+GL_APICALL void GL_APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs);
+GL_APICALL void GL_APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs);
+GL_APICALL void GL_APIENTRY glPathFogGenNV (GLenum genMode);
+GL_APICALL void GL_APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value);
+GL_APICALL void GL_APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value);
+GL_APICALL void GL_APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands);
+GL_APICALL void GL_APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords);
+GL_APICALL void GL_APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray);
+GL_APICALL void GL_APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics);
+GL_APICALL void GL_APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics);
+GL_APICALL void GL_APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing);
+GL_APICALL void GL_APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value);
+GL_APICALL void GL_APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value);
+GL_APICALL void GL_APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value);
+GL_APICALL void GL_APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value);
+GL_APICALL GLboolean GL_APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y);
+GL_APICALL GLboolean GL_APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y);
+GL_APICALL GLfloat GL_APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments);
+GL_APICALL GLboolean GL_APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY);
+GL_APICALL void GL_APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode);
+GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues);
+GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]);
+GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs);
+GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params);
+GL_APICALL void GL_APIENTRY glMatrixLoadf (GLenum mode, const GLfloat *m);
+GL_APICALL void GL_APIENTRY glBlendBarrierNV( void );
+GL_APICALL void GL_APIENTRY glBlendParameteriNV( GLenum pname, GLint value );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gl_func_def_h_ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glu.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glu.h
new file mode 100644
index 0000000..54bc52b
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glu.h
@@ -0,0 +1,607 @@
+/*++ BUILD Version: 0004 // Increment this if a change has global effects
+
+Copyright (c) 1985-95, Microsoft Corporation
+
+Module Name:
+
+ glu.h
+
+Abstract:
+
+ Procedure declarations, constant definitions and macros for the OpenGL
+ Utility Library.
+
+--*/
+
+#ifndef __glu_h__
+#ifndef __GLU_H__
+
+#define __glu_h__
+#define __GLU_H__
+
+#include <GL/gl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright 1991-1993, Silicon Graphics, Inc.
+** All Rights Reserved.
+**
+** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
+** the contents of this file may not be disclosed to third parties, copied or
+** duplicated in any form, in whole or in part, without the prior written
+** permission of Silicon Graphics, Inc.
+**
+** RESTRICTED RIGHTS LEGEND:
+** Use, duplication or disclosure by the Government is subject to restrictions
+** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
+** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
+** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
+** rights reserved under the Copyright Laws of the United States.
+*/
+
+/*
+** Return the error string associated with a particular error code.
+** This will return 0 for an invalid error code.
+**
+** The generic function prototype that can be compiled for ANSI or Unicode
+** is defined as follows:
+**
+** LPCTSTR APIENTRY gluErrorStringWIN (GLenum errCode);
+*/
+#ifdef UNICODE
+#define gluErrorStringWIN(errCode) ((LPCSTR) gluErrorUnicodeStringEXT(errCode))
+#else
+#define gluErrorStringWIN(errCode) ((LPCWSTR) gluErrorString(errCode))
+#endif
+
+/* XXX APIENTRY and CALLBACK defined added by aritger */
+#ifndef APIENTRY
+# define APIENTRY
+#endif
+
+#ifndef CALLBACK
+# define CALLBACK
+#endif
+
+const GLubyte* APIENTRY gluErrorString (
+ GLenum errCode);
+
+/* XXX aritger: gluErrorUnicodeStringEXT() appears to be a MicroSoft addition */
+#if defined(_WIN32)
+const wchar_t* APIENTRY gluErrorUnicodeStringEXT (
+ GLenum errCode);
+#endif
+
+const GLubyte* APIENTRY gluGetString (
+ GLenum name);
+
+void APIENTRY gluOrtho2D (
+ GLdouble left,
+ GLdouble right,
+ GLdouble bottom,
+ GLdouble top);
+
+void APIENTRY gluPerspective (
+ GLdouble fovy,
+ GLdouble aspect,
+ GLdouble zNear,
+ GLdouble zFar);
+
+void APIENTRY gluPickMatrix (
+ GLdouble x,
+ GLdouble y,
+ GLdouble width,
+ GLdouble height,
+ GLint viewport[4]);
+
+void APIENTRY gluLookAt (
+ GLdouble eyex,
+ GLdouble eyey,
+ GLdouble eyez,
+ GLdouble centerx,
+ GLdouble centery,
+ GLdouble centerz,
+ GLdouble upx,
+ GLdouble upy,
+ GLdouble upz);
+
+int APIENTRY gluProject (
+ GLdouble objx,
+ GLdouble objy,
+ GLdouble objz,
+ const GLdouble modelMatrix[16],
+ const GLdouble projMatrix[16],
+ const GLint viewport[4],
+ GLdouble *winx,
+ GLdouble *winy,
+ GLdouble *winz);
+
+int APIENTRY gluUnProject (
+ GLdouble winx,
+ GLdouble winy,
+ GLdouble winz,
+ const GLdouble modelMatrix[16],
+ const GLdouble projMatrix[16],
+ const GLint viewport[4],
+ GLdouble *objx,
+ GLdouble *objy,
+ GLdouble *objz);
+
+
+int APIENTRY gluScaleImage (
+ GLenum format,
+ GLint widthin,
+ GLint heightin,
+ GLenum typein,
+ const void *datain,
+ GLint widthout,
+ GLint heightout,
+ GLenum typeout,
+ void *dataout);
+
+
+int APIENTRY gluBuild1DMipmaps (
+ GLenum target,
+ GLint components,
+ GLint width,
+ GLenum format,
+ GLenum type,
+ const void *data);
+
+int APIENTRY gluBuild2DMipmaps (
+ GLenum target,
+ GLint components,
+ GLint width,
+ GLint height,
+ GLenum format,
+ GLenum type,
+ const void *data);
+
+#ifdef __cplusplus
+
+class GLUnurbs;
+class GLUquadric;
+class GLUtesselator;
+
+/* backwards compatibility: */
+typedef class GLUnurbs GLUnurbsObj;
+typedef class GLUquadric GLUquadricObj;
+typedef class GLUtesselator GLUtesselatorObj;
+typedef class GLUtesselator GLUtriangulatorObj;
+
+#else
+
+typedef struct GLUnurbs GLUnurbs;
+typedef struct GLUquadric GLUquadric;
+typedef struct GLUtesselator GLUtesselator;
+
+/* backwards compatibility: */
+typedef struct GLUnurbs GLUnurbsObj;
+typedef struct GLUquadric GLUquadricObj;
+typedef struct GLUtesselator GLUtesselatorObj;
+typedef struct GLUtesselator GLUtriangulatorObj;
+
+#endif
+
+// (NVIDIA change: pbrown) GLUcallbackFuncPtr is a general-purpose function
+// pointer type for GLU callbacks. We declare a "void" argument list in the
+// prototype as a least-common-denominator to avoid "function declaration
+// isn't a prototype" warnings from GCC (which until late 2010 didn't have a
+// good way to temporarily change warning state via #pragma). Most, but not
+// all, GLU callbacks do take one or more arguments, so will likely need
+// manual casts. The fundamental problem is that the actual argument list is
+// typically a function of the <which> argument in the
+// glu{Tess,Nurbs}Callback, so there is no good way to check for correctness
+// at compile time.
+typedef void (CALLBACK* GLUcallbackFuncPtr)(void);
+
+GLUquadric* APIENTRY gluNewQuadric (void);
+void APIENTRY gluDeleteQuadric (
+ GLUquadric *state);
+
+void APIENTRY gluQuadricNormals (
+ GLUquadric *quadObject,
+ GLenum normals);
+
+void APIENTRY gluQuadricTexture (
+ GLUquadric *quadObject,
+ GLboolean textureCoords);
+
+void APIENTRY gluQuadricOrientation (
+ GLUquadric *quadObject,
+ GLenum orientation);
+
+void APIENTRY gluQuadricDrawStyle (
+ GLUquadric *quadObject,
+ GLenum drawStyle);
+
+void APIENTRY gluCylinder (
+ GLUquadric *qobj,
+ GLdouble baseRadius,
+ GLdouble topRadius,
+ GLdouble height,
+ GLint slices,
+ GLint stacks);
+
+void APIENTRY gluDisk (
+ GLUquadric *qobj,
+ GLdouble innerRadius,
+ GLdouble outerRadius,
+ GLint slices,
+ GLint loops);
+
+void APIENTRY gluPartialDisk (
+ GLUquadric *qobj,
+ GLdouble innerRadius,
+ GLdouble outerRadius,
+ GLint slices,
+ GLint loops,
+ GLdouble startAngle,
+ GLdouble sweepAngle);
+
+void APIENTRY gluSphere (
+ GLUquadric *qobj,
+ GLdouble radius,
+ GLint slices,
+ GLint stacks);
+
+void APIENTRY gluQuadricCallback (
+ GLUquadric *qobj,
+ GLenum which,
+ GLUcallbackFuncPtr fn );
+
+GLUtesselator* APIENTRY gluNewTess(
+ void );
+
+void APIENTRY gluDeleteTess(
+ GLUtesselator *tess );
+
+void APIENTRY gluTessBeginPolygon(
+ GLUtesselator *tess,
+ void *polygon_data );
+
+void APIENTRY gluTessBeginContour(
+ GLUtesselator *tess );
+
+void APIENTRY gluTessVertex(
+ GLUtesselator *tess,
+ GLdouble coords[3],
+ void *data );
+
+void APIENTRY gluTessEndContour(
+ GLUtesselator *tess );
+
+void APIENTRY gluTessEndPolygon(
+ GLUtesselator *tess );
+
+void APIENTRY gluTessProperty(
+ GLUtesselator *tess,
+ GLenum which,
+ GLdouble value );
+
+void APIENTRY gluTessNormal(
+ GLUtesselator *tess,
+ GLdouble x,
+ GLdouble y,
+ GLdouble z );
+
+void APIENTRY gluTessCallback(
+ GLUtesselator *tess,
+ GLenum which,
+ GLUcallbackFuncPtr fn );
+
+void APIENTRY gluGetTessProperty(
+ GLUtesselator *tess,
+ GLenum which,
+ GLdouble *value );
+
+GLUnurbs* APIENTRY gluNewNurbsRenderer (void);
+
+void APIENTRY gluDeleteNurbsRenderer (
+ GLUnurbs *nobj);
+
+void APIENTRY gluBeginSurface (
+ GLUnurbs *nobj);
+
+void APIENTRY gluBeginCurve (
+ GLUnurbs *nobj);
+
+void APIENTRY gluEndCurve (
+ GLUnurbs *nobj);
+
+void APIENTRY gluEndSurface (
+ GLUnurbs *nobj);
+
+void APIENTRY gluBeginTrim (
+ GLUnurbs *nobj);
+
+void APIENTRY gluEndTrim (
+ GLUnurbs *nobj);
+
+void APIENTRY gluPwlCurve (
+ GLUnurbs *nobj,
+ GLint count,
+ GLfloat *array,
+ GLint stride,
+ GLenum type);
+
+void APIENTRY gluNurbsCurve (
+ GLUnurbs *nobj,
+ GLint nknots,
+ GLfloat *knot,
+ GLint stride,
+ GLfloat *ctlarray,
+ GLint order,
+ GLenum type);
+
+void APIENTRY
+gluNurbsSurface(
+ GLUnurbs *nobj,
+ GLint sknot_count,
+ float *sknot,
+ GLint tknot_count,
+ GLfloat *tknot,
+ GLint s_stride,
+ GLint t_stride,
+ GLfloat *ctlarray,
+ GLint sorder,
+ GLint torder,
+ GLenum type);
+
+void APIENTRY
+gluLoadSamplingMatrices (
+ GLUnurbs *nobj,
+ const GLfloat modelMatrix[16],
+ const GLfloat projMatrix[16],
+ const GLint viewport[4] );
+
+void APIENTRY
+gluNurbsProperty (
+ GLUnurbs *nobj,
+ GLenum property,
+ GLfloat value );
+
+void APIENTRY
+gluGetNurbsProperty (
+ GLUnurbs *nobj,
+ GLenum property,
+ GLfloat *value );
+
+void APIENTRY
+gluNurbsCallback (
+ GLUnurbs *nobj,
+ GLenum which,
+ GLUcallbackFuncPtr fn );
+
+
+/**** Callback function prototypes ****/
+
+/* gluQuadricCallback */
+typedef void (CALLBACK* GLUquadricErrorProc) (GLenum);
+
+/* gluTessCallback */
+typedef void (CALLBACK* GLUtessBeginProc) (GLenum);
+typedef void (CALLBACK* GLUtessEdgeFlagProc) (GLboolean);
+typedef void (CALLBACK* GLUtessVertexProc) (void *);
+typedef void (CALLBACK* GLUtessEndProc) (void);
+typedef void (CALLBACK* GLUtessErrorProc) (GLenum);
+typedef void (CALLBACK* GLUtessCombineProc) (GLdouble[3],
+ void*[4],
+ GLfloat[4],
+ void** );
+typedef void (CALLBACK* GLUtessBeginDataProc) (GLenum, void *);
+typedef void (CALLBACK* GLUtessEdgeFlagDataProc) (GLboolean, void *);
+typedef void (CALLBACK* GLUtessVertexDataProc) (void *, void *);
+typedef void (CALLBACK* GLUtessEndDataProc) (void *);
+typedef void (CALLBACK* GLUtessErrorDataProc) (GLenum, void *);
+typedef void (CALLBACK* GLUtessCombineDataProc) (GLdouble[3],
+ void*[4],
+ GLfloat[4],
+ void**,
+ void* );
+
+/* gluNurbsCallback */
+typedef void (CALLBACK* GLUnurbsErrorProc) (GLenum);
+
+
+/**** Generic constants ****/
+
+/* Version */
+#define GLU_VERSION_1_1 1
+#define GLU_VERSION_1_2 1
+
+/* Errors: (return value 0 = no error) */
+#define GLU_INVALID_ENUM 100900
+#define GLU_INVALID_VALUE 100901
+#define GLU_OUT_OF_MEMORY 100902
+#define GLU_INCOMPATIBLE_GL_VERSION 100903
+
+/* StringName */
+#define GLU_VERSION 100800
+#define GLU_EXTENSIONS 100801
+
+/* Boolean */
+#define GLU_TRUE GL_TRUE
+#define GLU_FALSE GL_FALSE
+
+
+/**** Quadric constants ****/
+
+/* QuadricNormal */
+#define GLU_SMOOTH 100000
+#define GLU_FLAT 100001
+#define GLU_NONE 100002
+
+/* QuadricDrawStyle */
+#define GLU_POINT 100010
+#define GLU_LINE 100011
+#define GLU_FILL 100012
+#define GLU_SILHOUETTE 100013
+
+/* QuadricOrientation */
+#define GLU_OUTSIDE 100020
+#define GLU_INSIDE 100021
+
+/* Callback types: */
+/* GLU_ERROR 100103 */
+
+
+/**** Tesselation constants ****/
+
+#define GLU_TESS_MAX_COORD 1.0e150
+
+/* TessProperty */
+#define GLU_TESS_WINDING_RULE 100140
+#define GLU_TESS_BOUNDARY_ONLY 100141
+#define GLU_TESS_TOLERANCE 100142
+
+/* TessWinding */
+#define GLU_TESS_WINDING_ODD 100130
+#define GLU_TESS_WINDING_NONZERO 100131
+#define GLU_TESS_WINDING_POSITIVE 100132
+#define GLU_TESS_WINDING_NEGATIVE 100133
+#define GLU_TESS_WINDING_ABS_GEQ_TWO 100134
+
+/* TessCallback */
+#define GLU_TESS_BEGIN 100100 /* void (CALLBACK*)(GLenum type) */
+#define GLU_TESS_VERTEX 100101 /* void (CALLBACK*)(void *data) */
+#define GLU_TESS_END 100102 /* void (CALLBACK*)(void) */
+#define GLU_TESS_ERROR 100103 /* void (CALLBACK*)(GLenum errno) */
+#define GLU_TESS_EDGE_FLAG 100104 /* void (CALLBACK*)(GLboolean boundaryEdge) */
+#define GLU_TESS_COMBINE 100105 /* void (CALLBACK*)(GLdouble coords[3],
+ void *data[4],
+ GLfloat weight[4],
+ void **dataOut) */
+#define GLU_TESS_BEGIN_DATA 100106 /* void (CALLBACK*)(GLenum type,
+ void *polygon_data) */
+#define GLU_TESS_VERTEX_DATA 100107 /* void (CALLBACK*)(void *data,
+ void *polygon_data) */
+#define GLU_TESS_END_DATA 100108 /* void (CALLBACK*)(void *polygon_data) */
+#define GLU_TESS_ERROR_DATA 100109 /* void (CALLBACK*)(GLenum errno,
+ void *polygon_data) */
+#define GLU_TESS_EDGE_FLAG_DATA 100110 /* void (CALLBACK*)(GLboolean boundaryEdge,
+ void *polygon_data) */
+#define GLU_TESS_COMBINE_DATA 100111 /* void (CALLBACK*)(GLdouble coords[3],
+ void *data[4],
+ GLfloat weight[4],
+ void **dataOut,
+ void *polygon_data) */
+
+/* TessError */
+#define GLU_TESS_ERROR1 100151
+#define GLU_TESS_ERROR2 100152
+#define GLU_TESS_ERROR3 100153
+#define GLU_TESS_ERROR4 100154
+#define GLU_TESS_ERROR5 100155
+#define GLU_TESS_ERROR6 100156
+#define GLU_TESS_ERROR7 100157
+#define GLU_TESS_ERROR8 100158
+
+#define GLU_TESS_MISSING_BEGIN_POLYGON GLU_TESS_ERROR1
+#define GLU_TESS_MISSING_BEGIN_CONTOUR GLU_TESS_ERROR2
+#define GLU_TESS_MISSING_END_POLYGON GLU_TESS_ERROR3
+#define GLU_TESS_MISSING_END_CONTOUR GLU_TESS_ERROR4
+#define GLU_TESS_COORD_TOO_LARGE GLU_TESS_ERROR5
+#define GLU_TESS_NEED_COMBINE_CALLBACK GLU_TESS_ERROR6
+
+/**** NURBS constants ****/
+
+/* NurbsProperty */
+#define GLU_AUTO_LOAD_MATRIX 100200
+#define GLU_CULLING 100201
+#define GLU_SAMPLING_TOLERANCE 100203
+#define GLU_DISPLAY_MODE 100204
+#define GLU_PARAMETRIC_TOLERANCE 100202
+#define GLU_SAMPLING_METHOD 100205
+#define GLU_U_STEP 100206
+#define GLU_V_STEP 100207
+
+/* NurbsSampling */
+#define GLU_PATH_LENGTH 100215
+#define GLU_PARAMETRIC_ERROR 100216
+#define GLU_DOMAIN_DISTANCE 100217
+
+
+/* NurbsTrim */
+#define GLU_MAP1_TRIM_2 100210
+#define GLU_MAP1_TRIM_3 100211
+
+/* NurbsDisplay */
+/* GLU_FILL 100012 */
+#define GLU_OUTLINE_POLYGON 100240
+#define GLU_OUTLINE_PATCH 100241
+
+/* NurbsCallback */
+/* GLU_ERROR 100103 */
+
+/* NurbsErrors */
+#define GLU_NURBS_ERROR1 100251
+#define GLU_NURBS_ERROR2 100252
+#define GLU_NURBS_ERROR3 100253
+#define GLU_NURBS_ERROR4 100254
+#define GLU_NURBS_ERROR5 100255
+#define GLU_NURBS_ERROR6 100256
+#define GLU_NURBS_ERROR7 100257
+#define GLU_NURBS_ERROR8 100258
+#define GLU_NURBS_ERROR9 100259
+#define GLU_NURBS_ERROR10 100260
+#define GLU_NURBS_ERROR11 100261
+#define GLU_NURBS_ERROR12 100262
+#define GLU_NURBS_ERROR13 100263
+#define GLU_NURBS_ERROR14 100264
+#define GLU_NURBS_ERROR15 100265
+#define GLU_NURBS_ERROR16 100266
+#define GLU_NURBS_ERROR17 100267
+#define GLU_NURBS_ERROR18 100268
+#define GLU_NURBS_ERROR19 100269
+#define GLU_NURBS_ERROR20 100270
+#define GLU_NURBS_ERROR21 100271
+#define GLU_NURBS_ERROR22 100272
+#define GLU_NURBS_ERROR23 100273
+#define GLU_NURBS_ERROR24 100274
+#define GLU_NURBS_ERROR25 100275
+#define GLU_NURBS_ERROR26 100276
+#define GLU_NURBS_ERROR27 100277
+#define GLU_NURBS_ERROR28 100278
+#define GLU_NURBS_ERROR29 100279
+#define GLU_NURBS_ERROR30 100280
+#define GLU_NURBS_ERROR31 100281
+#define GLU_NURBS_ERROR32 100282
+#define GLU_NURBS_ERROR33 100283
+#define GLU_NURBS_ERROR34 100284
+#define GLU_NURBS_ERROR35 100285
+#define GLU_NURBS_ERROR36 100286
+#define GLU_NURBS_ERROR37 100287
+
+/**** Backwards compatibility for old tesselator ****/
+
+void APIENTRY gluBeginPolygon( GLUtesselator *tess );
+
+void APIENTRY gluNextContour( GLUtesselator *tess,
+ GLenum type );
+
+void APIENTRY gluEndPolygon( GLUtesselator *tess );
+
+/* Contours types -- obsolete! */
+#define GLU_CW 100120
+#define GLU_CCW 100121
+#define GLU_INTERIOR 100122
+#define GLU_EXTERIOR 100123
+#define GLU_UNKNOWN 100124
+
+/* Names without "TESS_" prefix */
+#define GLU_BEGIN GLU_TESS_BEGIN
+#define GLU_VERTEX GLU_TESS_VERTEX
+#define GLU_END GLU_TESS_END
+#define GLU_ERROR GLU_TESS_ERROR
+#define GLU_EDGE_FLAG GLU_TESS_EDGE_FLAG
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GLU_H__ */
+#endif /* __glu_h__ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glut.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glut.h
new file mode 100644
index 0000000..65fd748
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glut.h
@@ -0,0 +1,771 @@
+#ifndef __glut_h__
+#define __glut_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998, 2000. */
+
+/* This program is freely distributable without licensing fees and is
+ provided without guarantee or warrantee expressed or implied. This
+ program is -not- in the public domain. */
+
+#ifdef _WIN32
+
+/* GLUT 3.7 now tries to avoid including <windows.h>
+ to avoid name space pollution, but Win32's <GL/gl.h>
+ needs APIENTRY and WINGDIAPI defined properly. */
+# if 0
+ /* This would put tons of macros and crap in our clean name space. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# else
+ /* XXX This is from Win32's <windef.h> */
+# ifndef APIENTRY
+# define GLUT_APIENTRY_DEFINED
+ /* Cygwin and MingW32 are two free GNU-based Open Source compilation
+ environments for Win32. Note that __CYGWIN32__ is deprecated
+ in favor of simply __CYGWIN__. */
+# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+# ifdef i386
+# define APIENTRY __attribute__ ((stdcall))
+# else
+# define APIENTRY
+# endif
+# else
+# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
+# define APIENTRY __stdcall
+# else
+# define APIENTRY
+# endif
+# endif
+# endif
+ /* XXX This is from Win32's <winnt.h> */
+# ifndef CALLBACK
+# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+# define CALLBACK __attribute__ ((stdcall))
+# else
+# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64)) && !defined(MIDL_PASS)
+# define CALLBACK __stdcall
+# else
+# define CALLBACK
+# endif
+# endif
+# endif
+ /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
+# ifndef WINGDIAPI
+# define GLUT_WINGDIAPI_DEFINED
+# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+# define WINGDIAPI
+# else
+# define WINGDIAPI __declspec(dllimport)
+# endif
+# endif
+# if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__)
+ /* Rely on Cygwin32/MingW32 <stddef.h> to set wchar_t. */
+ /* XXX Warning. The Cygwin32/MingW32 definition for wchar_t
+ is an "int" instead of the "short" used by Windows. */
+# include <stddef.h>
+# else
+ /* XXX This is from Win32's <ctype.h> */
+# ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+# define _WCHAR_T_DEFINED
+# endif
+# endif
+# endif
+
+/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA
+ in your compile preprocessor options. */
+# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA)
+# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */
+# pragma comment (lib, "user32.lib") /* link with Windows User lib */
+# pragma comment (lib, "gdi32.lib") /* link with Windows GDI lib */
+/* To enable automatic SGI OpenGL for Windows library usage for GLUT,
+ define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */
+# ifdef GLUT_USE_SGI_OPENGL
+# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */
+# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */
+# if defined(GLUT_STATIC_LIB)
+# pragma comment (lib, "glutstatic.lib") /* link with static Win32 GLUT lib */
+# else
+# pragma comment (lib, "glut.lib") /* link with Win32 GLUT lib */
+# endif
+# else
+# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */
+# pragma comment (lib, "glustatic.lib") /* link with Microsoft OpenGL Utility lib */
+# if defined(GLUT_STATIC_LIB)
+# pragma comment (lib, "glutstatic.lib") /* link with static Win32 GLUT lib */
+# else
+# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */
+# endif
+# endif
+# endif
+
+/* To disable supression of annoying warnings about floats being promoted
+ to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor
+ options. */
+# if defined(_MSC_VER) && !defined(GLUT_NO_WARNING_DISABLE)
+# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */
+# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
+# endif
+
+/* Win32 has an annoying issue where there are multiple C run-time
+ libraries (CRTs). If the executable is linked with a different CRT
+ from the GLUT DLL, the GLUT DLL will not share the same CRT static
+ data seen by the executable. In particular, atexit callbacks registered
+ in the executable will not be called if GLUT calls its (different)
+ exit routine). GLUT is typically built with the
+ "/MD" option (the CRT with multithreading DLL support), but the Visual
+ C++ linker default is "/ML" (the single threaded CRT).
+
+ One workaround to this issue is requiring users to always link with
+ the same CRT as GLUT is compiled with. That requires users supply a
+ non-standard option. GLUT 3.7 has its own built-in workaround where
+ the executable's "exit" function pointer is covertly passed to GLUT.
+ GLUT then calls the executable's exit function pointer to ensure that
+ any "atexit" calls registered by the application are called if GLUT
+ needs to exit.
+
+ Note that the __glut*WithExit routines should NEVER be called directly.
+ To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
+
+/* XXX This is from Win32's <process.h> */
+# if !defined(_MSC_VER) && !defined(__cdecl)
+ /* Define __cdecl for non-Microsoft compilers. */
+# define __cdecl
+# define GLUT_DEFINED___CDECL
+# endif
+# ifndef _CRTIMP
+# ifdef _NTSDK
+ /* Definition compatible with NT SDK */
+# define _CRTIMP
+# else
+ /* Current definition */
+# ifdef _DLL
+# define _CRTIMP __declspec(dllimport)
+# else
+# define _CRTIMP
+# endif
+# endif
+# define GLUT_DEFINED__CRTIMP
+# endif
+
+/* GLUT API entry point declarations for Win32. */
+# ifdef GLUT_BUILDING_LIB
+# define GLUTAPI __declspec(dllexport)
+# else
+# ifdef _DLL
+# define GLUTAPI __declspec(dllimport)
+# else
+# define GLUTAPI extern
+# endif
+# endif
+
+/* GLUT callback calling convention for Win32. */
+# define GLUTCALLBACK __cdecl
+
+#endif /* _WIN32 */
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WIN32
+# ifndef GLUT_BUILDING_LIB
+# if __BORLANDC__
+# if defined(_BUILDRTLDLL)
+void __cdecl __export exit(int __status);
+# else
+void __cdecl exit(int __status);
+# endif
+# else
+# if _MSC_VER >= 1200
+ extern _CRTIMP __declspec(noreturn) void __cdecl exit(int);
+# else
+ extern _CRTIMP void __cdecl exit(int);
+# endif
+# endif
+# endif
+#else
+/* non-Win32 case. */
+/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */
+# define APIENTRY
+# define GLUT_APIENTRY_DEFINED
+# define CALLBACK
+/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */
+# define GLUTAPI extern
+# define GLUTCALLBACK
+/* Prototype exit for the non-Win32 case (see above). */
+# ifdef __GNUC__
+extern void exit(int __status) __attribute__((__noreturn__));
+# else
+extern void exit(int);
+# endif
+#endif
+
+/**
+ GLUT API revision history:
+
+ GLUT_API_VERSION is updated to reflect incompatible GLUT
+ API changes (interface changes, semantic changes, deletions,
+ or additions).
+
+ GLUT_API_VERSION=1 First public release of GLUT. 11/29/94
+
+ GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling,
+ extension. Supports new input devices like tablet, dial and button
+ box, and Spaceball. Easy to query OpenGL extensions.
+
+ GLUT_API_VERSION=3 glutMenuStatus added.
+
+ GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer,
+ glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
+ video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
+ glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
+ glutJoystickFunc, glutForceJoystickFunc, glutStrokeWidthf,
+ glutStrokeLengthf (NOT FINALIZED!).
+**/
+#ifndef GLUT_API_VERSION /* allow this to be overriden */
+#define GLUT_API_VERSION 3
+#endif
+
+/**
+ GLUT implementation revision history:
+
+ GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
+ API revisions and implementation revisions (ie, bug fixes).
+
+ GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of
+ GLUT Xlib-based implementation. 11/29/94
+
+ GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of
+ GLUT Xlib-based implementation providing GLUT version 2
+ interfaces.
+
+ GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95
+
+ GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95
+
+ GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96
+
+ GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner
+ and video resize. 1/3/97
+
+ GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
+
+ GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
+
+ GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
+
+ GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
+
+ GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
+
+ GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
+
+ GLUT_XLIB_IMPLEMENTATION=16 mjk's early GLUT 3.8
+
+ GLUT_XLIB_IMPLEMENTATION=17 mjk's GLUT 3.8 with glutStrokeWidthf and glutStrokeLengthf
+**/
+#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */
+#define GLUT_XLIB_IMPLEMENTATION 17
+#endif
+
+/* Display mode bit masks. */
+#define GLUT_RGB 0
+#define GLUT_RGBA GLUT_RGB
+#define GLUT_INDEX 1
+#define GLUT_SINGLE 0
+#define GLUT_DOUBLE 2
+#define GLUT_ACCUM 4
+#define GLUT_ALPHA 8
+#define GLUT_DEPTH 16
+#define GLUT_STENCIL 32
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_MULTISAMPLE 128
+#define GLUT_STEREO 256
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_LUMINANCE 512
+#endif
+
+/* Mouse buttons. */
+#define GLUT_LEFT_BUTTON 0
+#define GLUT_MIDDLE_BUTTON 1
+#define GLUT_RIGHT_BUTTON 2
+
+/* Mouse button state. */
+#define GLUT_DOWN 0
+#define GLUT_UP 1
+
+#if (GLUT_API_VERSION >= 2)
+/* function keys */
+#define GLUT_KEY_F1 1
+#define GLUT_KEY_F2 2
+#define GLUT_KEY_F3 3
+#define GLUT_KEY_F4 4
+#define GLUT_KEY_F5 5
+#define GLUT_KEY_F6 6
+#define GLUT_KEY_F7 7
+#define GLUT_KEY_F8 8
+#define GLUT_KEY_F9 9
+#define GLUT_KEY_F10 10
+#define GLUT_KEY_F11 11
+#define GLUT_KEY_F12 12
+/* directional keys */
+#define GLUT_KEY_LEFT 100
+#define GLUT_KEY_UP 101
+#define GLUT_KEY_RIGHT 102
+#define GLUT_KEY_DOWN 103
+#define GLUT_KEY_PAGE_UP 104
+#define GLUT_KEY_PAGE_DOWN 105
+#define GLUT_KEY_HOME 106
+#define GLUT_KEY_END 107
+#define GLUT_KEY_INSERT 108
+#endif
+
+/* Entry/exit state. */
+#define GLUT_LEFT 0
+#define GLUT_ENTERED 1
+
+/* Menu usage state. */
+#define GLUT_MENU_NOT_IN_USE 0
+#define GLUT_MENU_IN_USE 1
+
+/* Visibility state. */
+#define GLUT_NOT_VISIBLE 0
+#define GLUT_VISIBLE 1
+
+/* Window status state. */
+#define GLUT_HIDDEN 0
+#define GLUT_FULLY_RETAINED 1
+#define GLUT_PARTIALLY_RETAINED 2
+#define GLUT_FULLY_COVERED 3
+
+/* Color index component selection values. */
+#define GLUT_RED 0
+#define GLUT_GREEN 1
+#define GLUT_BLUE 2
+
+#ifdef _WIN32
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN ((void*)0)
+#define GLUT_STROKE_MONO_ROMAN ((void*)1)
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15 ((void*)2)
+#define GLUT_BITMAP_8_BY_13 ((void*)3)
+#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4)
+#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10 ((void*)6)
+#define GLUT_BITMAP_HELVETICA_12 ((void*)7)
+#define GLUT_BITMAP_HELVETICA_18 ((void*)8)
+#endif
+#else
+/* Stroke font opaque addresses (use constants instead in source code). */
+GLUTAPI void *glutStrokeRoman;
+GLUTAPI void *glutStrokeMonoRoman;
+
+/* Stroke font constants (use these in GLUT program). */
+#define GLUT_STROKE_ROMAN (&glutStrokeRoman)
+#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman)
+
+/* Bitmap font opaque addresses (use constants instead in source code). */
+GLUTAPI void *glutBitmap9By15;
+GLUTAPI void *glutBitmap8By13;
+GLUTAPI void *glutBitmapTimesRoman10;
+GLUTAPI void *glutBitmapTimesRoman24;
+GLUTAPI void *glutBitmapHelvetica10;
+GLUTAPI void *glutBitmapHelvetica12;
+GLUTAPI void *glutBitmapHelvetica18;
+
+/* Bitmap font constants (use these in GLUT program). */
+#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15)
+#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13)
+#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10)
+#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24)
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10)
+#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12)
+#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18)
+#endif
+#endif
+
+/* glutGet parameters. */
+#define GLUT_WINDOW_X ((GLenum) 100)
+#define GLUT_WINDOW_Y ((GLenum) 101)
+#define GLUT_WINDOW_WIDTH ((GLenum) 102)
+#define GLUT_WINDOW_HEIGHT ((GLenum) 103)
+#define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104)
+#define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105)
+#define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106)
+#define GLUT_WINDOW_RED_SIZE ((GLenum) 107)
+#define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108)
+#define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109)
+#define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110)
+#define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111)
+#define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112)
+#define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113)
+#define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114)
+#define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115)
+#define GLUT_WINDOW_RGBA ((GLenum) 116)
+#define GLUT_WINDOW_PARENT ((GLenum) 117)
+#define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118)
+#define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119)
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120)
+#define GLUT_WINDOW_STEREO ((GLenum) 121)
+#endif
+#if (GLUT_API_VERSION >= 3)
+#define GLUT_WINDOW_CURSOR ((GLenum) 122)
+#endif
+#define GLUT_SCREEN_WIDTH ((GLenum) 200)
+#define GLUT_SCREEN_HEIGHT ((GLenum) 201)
+#define GLUT_SCREEN_WIDTH_MM ((GLenum) 202)
+#define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203)
+#define GLUT_MENU_NUM_ITEMS ((GLenum) 300)
+#define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400)
+#define GLUT_INIT_WINDOW_X ((GLenum) 500)
+#define GLUT_INIT_WINDOW_Y ((GLenum) 501)
+#define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502)
+#define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503)
+#define GLUT_INIT_DISPLAY_MODE ((GLenum) 504)
+#if (GLUT_API_VERSION >= 2)
+#define GLUT_ELAPSED_TIME ((GLenum) 700)
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_WINDOW_FORMAT_ID ((GLenum) 123)
+#endif
+
+#if (GLUT_API_VERSION >= 2)
+/* glutDeviceGet parameters. */
+#define GLUT_HAS_KEYBOARD ((GLenum) 600)
+#define GLUT_HAS_MOUSE ((GLenum) 601)
+#define GLUT_HAS_SPACEBALL ((GLenum) 602)
+#define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603)
+#define GLUT_HAS_TABLET ((GLenum) 604)
+#define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605)
+#define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606)
+#define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607)
+#define GLUT_NUM_DIALS ((GLenum) 608)
+#define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609)
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+#define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610)
+#define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611)
+#define GLUT_HAS_JOYSTICK ((GLenum) 612)
+#define GLUT_OWNS_JOYSTICK ((GLenum) 613)
+#define GLUT_JOYSTICK_BUTTONS ((GLenum) 614)
+#define GLUT_JOYSTICK_AXES ((GLenum) 615)
+#define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616)
+#endif
+
+#if (GLUT_API_VERSION >= 3)
+/* glutLayerGet parameters. */
+#define GLUT_OVERLAY_POSSIBLE ((GLenum) 800)
+#define GLUT_LAYER_IN_USE ((GLenum) 801)
+#define GLUT_HAS_OVERLAY ((GLenum) 802)
+#define GLUT_TRANSPARENT_INDEX ((GLenum) 803)
+#define GLUT_NORMAL_DAMAGED ((GLenum) 804)
+#define GLUT_OVERLAY_DAMAGED ((GLenum) 805)
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* glutVideoResizeGet parameters. */
+#define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900)
+#define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901)
+#define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902)
+#define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903)
+#define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904)
+#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905)
+#define GLUT_VIDEO_RESIZE_X ((GLenum) 906)
+#define GLUT_VIDEO_RESIZE_Y ((GLenum) 907)
+#define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908)
+#define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909)
+#endif
+
+/* glutUseLayer parameters. */
+#define GLUT_NORMAL ((GLenum) 0)
+#define GLUT_OVERLAY ((GLenum) 1)
+
+/* glutGetModifiers return mask. */
+#define GLUT_ACTIVE_SHIFT 1
+#define GLUT_ACTIVE_CTRL 2
+#define GLUT_ACTIVE_ALT 4
+
+/* glutSetCursor parameters. */
+/* Basic arrows. */
+#define GLUT_CURSOR_RIGHT_ARROW 0
+#define GLUT_CURSOR_LEFT_ARROW 1
+/* Symbolic cursor shapes. */
+#define GLUT_CURSOR_INFO 2
+#define GLUT_CURSOR_DESTROY 3
+#define GLUT_CURSOR_HELP 4
+#define GLUT_CURSOR_CYCLE 5
+#define GLUT_CURSOR_SPRAY 6
+#define GLUT_CURSOR_WAIT 7
+#define GLUT_CURSOR_TEXT 8
+#define GLUT_CURSOR_CROSSHAIR 9
+/* Directional cursors. */
+#define GLUT_CURSOR_UP_DOWN 10
+#define GLUT_CURSOR_LEFT_RIGHT 11
+/* Sizing cursors. */
+#define GLUT_CURSOR_TOP_SIDE 12
+#define GLUT_CURSOR_BOTTOM_SIDE 13
+#define GLUT_CURSOR_LEFT_SIDE 14
+#define GLUT_CURSOR_RIGHT_SIDE 15
+#define GLUT_CURSOR_TOP_LEFT_CORNER 16
+#define GLUT_CURSOR_TOP_RIGHT_CORNER 17
+#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18
+#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19
+/* Inherit from parent window. */
+#define GLUT_CURSOR_INHERIT 100
+/* Blank cursor. */
+#define GLUT_CURSOR_NONE 101
+/* Fullscreen crosshair (if available). */
+#define GLUT_CURSOR_FULL_CROSSHAIR 102
+#endif
+
+/* GLUT initialization sub-API. */
+GLUTAPI void APIENTRY glutInit(int *argcp, char **argv);
+#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
+GLUTAPI void APIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
+#ifndef GLUT_BUILDING_LIB
+static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
+#define glutInit glutInit_ATEXIT_HACK
+#endif
+#endif
+GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI void APIENTRY glutInitDisplayString(const char *string);
+#endif
+GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y);
+GLUTAPI void APIENTRY glutInitWindowSize(int width, int height);
+GLUTAPI void APIENTRY glutMainLoop(void);
+
+/* GLUT window sub-API. */
+GLUTAPI int APIENTRY glutCreateWindow(const char *title);
+#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
+GLUTAPI int APIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
+#ifndef GLUT_BUILDING_LIB
+static int APIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }
+#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
+#endif
+#endif
+GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
+GLUTAPI void APIENTRY glutDestroyWindow(int win);
+GLUTAPI void APIENTRY glutPostRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+GLUTAPI void APIENTRY glutPostWindowRedisplay(int win);
+#endif
+GLUTAPI void APIENTRY glutSwapBuffers(void);
+GLUTAPI int APIENTRY glutGetWindow(void);
+GLUTAPI void APIENTRY glutSetWindow(int win);
+GLUTAPI void APIENTRY glutSetWindowTitle(const char *title);
+GLUTAPI void APIENTRY glutSetIconTitle(const char *title);
+GLUTAPI void APIENTRY glutPositionWindow(int x, int y);
+GLUTAPI void APIENTRY glutReshapeWindow(int width, int height);
+GLUTAPI void APIENTRY glutPopWindow(void);
+GLUTAPI void APIENTRY glutPushWindow(void);
+GLUTAPI void APIENTRY glutIconifyWindow(void);
+GLUTAPI void APIENTRY glutShowWindow(void);
+GLUTAPI void APIENTRY glutHideWindow(void);
+#if (GLUT_API_VERSION >= 3)
+GLUTAPI void APIENTRY glutFullScreen(void);
+GLUTAPI void APIENTRY glutSetCursor(int cursor);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI void APIENTRY glutWarpPointer(int x, int y);
+#endif
+
+/* GLUT overlay sub-API. */
+GLUTAPI void APIENTRY glutEstablishOverlay(void);
+GLUTAPI void APIENTRY glutRemoveOverlay(void);
+GLUTAPI void APIENTRY glutUseLayer(GLenum layer);
+GLUTAPI void APIENTRY glutPostOverlayRedisplay(void);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
+GLUTAPI void APIENTRY glutPostWindowOverlayRedisplay(int win);
+#endif
+GLUTAPI void APIENTRY glutShowOverlay(void);
+GLUTAPI void APIENTRY glutHideOverlay(void);
+#endif
+
+/* GLUT menu sub-API. */
+GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int));
+#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
+GLUTAPI int APIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int));
+#ifndef GLUT_BUILDING_LIB
+static int APIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); }
+#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
+#endif
+#endif
+GLUTAPI void APIENTRY glutDestroyMenu(int menu);
+GLUTAPI int APIENTRY glutGetMenu(void);
+GLUTAPI void APIENTRY glutSetMenu(int menu);
+GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value);
+GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu);
+GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
+GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
+GLUTAPI void APIENTRY glutRemoveMenuItem(int item);
+GLUTAPI void APIENTRY glutAttachMenu(int button);
+GLUTAPI void APIENTRY glutDetachMenu(int button);
+
+/* GLUT window callback sub-API. */
+GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
+GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));
+GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));
+GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));
+GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));
+GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);
+GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));
+#if (GLUT_API_VERSION >= 2)
+GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
+GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state));
+GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state));
+GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value));
+GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
+GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
+#if (GLUT_API_VERSION >= 3)
+GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y));
+GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void));
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state));
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
+GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
+GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
+#endif
+#endif
+#endif
+
+/* GLUT color index sub-API. */
+GLUTAPI void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
+GLUTAPI GLfloat APIENTRY glutGetColor(int ndx, int component);
+GLUTAPI void APIENTRY glutCopyColormap(int win);
+
+/* GLUT state retrieval sub-API. */
+GLUTAPI int APIENTRY glutGet(GLenum type);
+GLUTAPI int APIENTRY glutDeviceGet(GLenum type);
+#if (GLUT_API_VERSION >= 2)
+/* GLUT extension support sub-API */
+GLUTAPI int APIENTRY glutExtensionSupported(const char *name);
+#endif
+#if (GLUT_API_VERSION >= 3)
+GLUTAPI int APIENTRY glutGetModifiers(void);
+GLUTAPI int APIENTRY glutLayerGet(GLenum type);
+#endif
+
+/* GLUT font sub-API */
+GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character);
+GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character);
+GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character);
+GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character);
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+GLUTAPI int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
+GLUTAPI int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
+#endif
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 17)
+GLUTAPI float APIENTRY glutStrokeWidthf(void *font, int character);
+GLUTAPI float APIENTRY glutStrokeLengthf(void *font, const unsigned char *string);
+#endif
+
+/* GLUT pre-built models sub-API */
+GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
+GLUTAPI void APIENTRY glutWireCube(GLdouble size);
+GLUTAPI void APIENTRY glutSolidCube(GLdouble size);
+GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
+GLUTAPI void APIENTRY glutWireDodecahedron(void);
+GLUTAPI void APIENTRY glutSolidDodecahedron(void);
+GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);
+GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);
+GLUTAPI void APIENTRY glutWireOctahedron(void);
+GLUTAPI void APIENTRY glutSolidOctahedron(void);
+GLUTAPI void APIENTRY glutWireTetrahedron(void);
+GLUTAPI void APIENTRY glutSolidTetrahedron(void);
+GLUTAPI void APIENTRY glutWireIcosahedron(void);
+GLUTAPI void APIENTRY glutSolidIcosahedron(void);
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
+/* GLUT video resize sub-API. */
+GLUTAPI int APIENTRY glutVideoResizeGet(GLenum param);
+GLUTAPI void APIENTRY glutSetupVideoResizing(void);
+GLUTAPI void APIENTRY glutStopVideoResizing(void);
+GLUTAPI void APIENTRY glutVideoResize(int x, int y, int width, int height);
+GLUTAPI void APIENTRY glutVideoPan(int x, int y, int width, int height);
+
+/* GLUT debugging sub-API. */
+GLUTAPI void APIENTRY glutReportErrors(void);
+#endif
+
+#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
+/* GLUT device control sub-API. */
+/* glutSetKeyRepeat modes. */
+#define GLUT_KEY_REPEAT_OFF 0
+#define GLUT_KEY_REPEAT_ON 1
+#define GLUT_KEY_REPEAT_DEFAULT 2
+
+/* Joystick button masks. */
+#define GLUT_JOYSTICK_BUTTON_A 1
+#define GLUT_JOYSTICK_BUTTON_B 2
+#define GLUT_JOYSTICK_BUTTON_C 4
+#define GLUT_JOYSTICK_BUTTON_D 8
+
+GLUTAPI void APIENTRY glutIgnoreKeyRepeat(int ignore);
+GLUTAPI void APIENTRY glutSetKeyRepeat(int repeatMode);
+GLUTAPI void APIENTRY glutForceJoystickFunc(void);
+
+/* GLUT game mode sub-API. */
+/* glutGameModeGet. */
+#define GLUT_GAME_MODE_ACTIVE ((GLenum) 0)
+#define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1)
+#define GLUT_GAME_MODE_WIDTH ((GLenum) 2)
+#define GLUT_GAME_MODE_HEIGHT ((GLenum) 3)
+#define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4)
+#define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5)
+#define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6)
+
+GLUTAPI void APIENTRY glutGameModeString(const char *string);
+GLUTAPI int APIENTRY glutEnterGameMode(void);
+GLUTAPI void APIENTRY glutLeaveGameMode(void);
+GLUTAPI int APIENTRY glutGameModeGet(GLenum mode);
+#endif
+
+#ifdef __cplusplus
+}
+
+#endif
+
+#ifdef GLUT_APIENTRY_DEFINED
+# undef GLUT_APIENTRY_DEFINED
+# undef APIENTRY
+#endif
+
+#ifdef GLUT_WINGDIAPI_DEFINED
+# undef GLUT_WINGDIAPI_DEFINED
+# undef WINGDIAPI
+#endif
+
+#ifdef GLUT_DEFINED___CDECL
+# undef GLUT_DEFINED___CDECL
+# undef __cdecl
+#endif
+
+#ifdef GLUT_DEFINED__CRTIMP
+# undef GLUT_DEFINED__CRTIMP
+# undef _CRTIMP
+#endif
+
+#endif /* __glut_h__ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glx.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glx.h
new file mode 100644
index 0000000..66ad53c
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glx.h
@@ -0,0 +1,357 @@
+#ifndef __glx_h__
+#define __glx_h__
+
+/*
+** The contents of this file are subject to the GLX Public License Version 1.0
+** (the "License"). You may not use this file except in compliance with the
+** License. You may obtain a copy of the License at Silicon Graphics, Inc.,
+** attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043
+** or at http://www.sgi.com/software/opensource/glx/license.html.
+**
+** Software distributed under the License is distributed on an "AS IS"
+** basis. ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY
+** IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR
+** PURPOSE OR OF NON- INFRINGEMENT. See the License for the specific
+** language governing rights and limitations under the License.
+**
+** The Original Software is GLX version 1.2 source code, released February,
+** 1999. The developer of the Original Software is Silicon Graphics, Inc.
+** Those portions of the Subject Software created by Silicon Graphics, Inc.
+** are Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved.
+**
+** $Header: //sw/main/drivers/OpenGL/win/glx/include/glx.h#21 $
+*/
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <GL/gl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Names for attributes to glXGetConfig.
+ */
+#define GLX_USE_GL 1 /* support GLX rendering */
+#define GLX_BUFFER_SIZE 2 /* depth of the color buffer */
+#define GLX_LEVEL 3 /* level in plane stacking */
+#define GLX_RGBA 4 /* true if RGBA mode */
+#define GLX_DOUBLEBUFFER 5 /* double buffering supported */
+#define GLX_STEREO 6 /* stereo buffering supported */
+#define GLX_AUX_BUFFERS 7 /* number of aux buffers */
+#define GLX_RED_SIZE 8 /* number of red component bits */
+#define GLX_GREEN_SIZE 9 /* number of green component bits */
+#define GLX_BLUE_SIZE 10 /* number of blue component bits */
+#define GLX_ALPHA_SIZE 11 /* number of alpha component bits */
+#define GLX_DEPTH_SIZE 12 /* number of depth bits */
+#define GLX_STENCIL_SIZE 13 /* number of stencil bits */
+#define GLX_ACCUM_RED_SIZE 14 /* number of red accum bits */
+#define GLX_ACCUM_GREEN_SIZE 15 /* number of green accum bits */
+#define GLX_ACCUM_BLUE_SIZE 16 /* number of blue accum bits */
+#define GLX_ACCUM_ALPHA_SIZE 17 /* number of alpha accum bits */
+
+/*
+ * Error return values from glXGetConfig. Success is indicated by
+ * a value of 0.
+ */
+#define GLX_BAD_SCREEN 1 /* screen # is bad */
+#define GLX_BAD_ATTRIBUTE 2 /* attribute to get is bad */
+#define GLX_NO_EXTENSION 3 /* no glx extension on server */
+#define GLX_BAD_VISUAL 4 /* visual # not known by GLX */
+#define GLX_BAD_CONTEXT 5
+#define GLX_BAD_VALUE 6
+#define GLX_BAD_ENUM 7
+
+/*
+ * Names for attributes to glXGetClientString.
+ */
+#define GLX_VENDOR 0x1
+#define GLX_VERSION 0x2
+#define GLX_EXTENSIONS 0x3
+
+#ifndef GLX_VERSION_1_3
+#define GLX_WINDOW_BIT 0x00000001
+#define GLX_PIXMAP_BIT 0x00000002
+#define GLX_PBUFFER_BIT 0x00000004
+#define GLX_RGBA_BIT 0x00000001
+#define GLX_COLOR_INDEX_BIT 0x00000002
+#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
+#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
+#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
+#define GLX_AUX_BUFFERS_BIT 0x00000010
+#define GLX_DEPTH_BUFFER_BIT 0x00000020
+#define GLX_STENCIL_BUFFER_BIT 0x00000040
+#define GLX_ACCUM_BUFFER_BIT 0x00000080
+#define GLX_CONFIG_CAVEAT 0x20
+#define GLX_X_VISUAL_TYPE 0x22
+#define GLX_TRANSPARENT_TYPE 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE 0x24
+#define GLX_TRANSPARENT_RED_VALUE 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
+#define GLX_DONT_CARE 0xFFFFFFFF
+#define GLX_NONE 0x8000
+#define GLX_SLOW_CONFIG 0x8001
+#define GLX_TRUE_COLOR 0x8002
+#define GLX_DIRECT_COLOR 0x8003
+#define GLX_PSEUDO_COLOR 0x8004
+#define GLX_STATIC_COLOR 0x8005
+#define GLX_GRAY_SCALE 0x8006
+#define GLX_STATIC_GRAY 0x8007
+#define GLX_TRANSPARENT_RGB 0x8008
+#define GLX_TRANSPARENT_INDEX 0x8009
+#define GLX_VISUAL_ID 0x800B
+#define GLX_SCREEN 0x800C
+#define GLX_NON_CONFORMANT_CONFIG 0x800D
+#define GLX_DRAWABLE_TYPE 0x8010
+#define GLX_RENDER_TYPE 0x8011
+#define GLX_X_RENDERABLE 0x8012
+#define GLX_FBCONFIG_ID 0x8013
+#define GLX_RGBA_TYPE 0x8014
+#define GLX_COLOR_INDEX_TYPE 0x8015
+#define GLX_MAX_PBUFFER_WIDTH 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT 0x8017
+#define GLX_MAX_PBUFFER_PIXELS 0x8018
+#define GLX_PRESERVED_CONTENTS 0x801B
+#define GLX_LARGEST_PBUFFER 0x801C
+#define GLX_WIDTH 0x801D
+#define GLX_HEIGHT 0x801E
+#define GLX_EVENT_MASK 0x801F
+#define GLX_DAMAGED 0x8020
+#define GLX_SAVED 0x8021
+#define GLX_WINDOW 0x8022
+#define GLX_PBUFFER 0x8023
+#define GLX_PBUFFER_HEIGHT 0x8040
+#define GLX_PBUFFER_WIDTH 0x8041
+#endif
+
+#ifndef GLX_VERSION_1_4
+#define GLX_SAMPLE_BUFFERS 0x186a0
+#define GLX_SAMPLES 0x186a1
+#endif
+
+#ifndef GLX_ARB_get_proc_address
+typedef void (*__GLXextFuncPtr)(void);
+#endif
+
+/*
+ * GLX resources.
+ */
+typedef XID GLXContextID;
+typedef XID GLXPixmap;
+typedef XID GLXDrawable;
+typedef XID GLXPbuffer;
+typedef XID GLXWindow;
+typedef XID GLXFBConfigID;
+
+/*
+ * GLXContext is a pointer to opaque data.
+ */
+typedef struct __GLXcontextRec *GLXContext;
+
+/*
+ * GLXFBConfig is a pointer to opaque data.
+ */
+typedef struct __GLXFBConfigRec *GLXFBConfig;
+
+
+/**********************************************************************/
+
+/*
+ * GLX 1.0 functions.
+ */
+extern XVisualInfo* glXChooseVisual(Display *dpy, int screen,
+ int *attrib_list);
+
+extern void glXCopyContext(Display *dpy, GLXContext src,
+ GLXContext dst, unsigned long mask);
+
+extern GLXContext glXCreateContext(Display *dpy, XVisualInfo *vis,
+ GLXContext share_list, Bool direct);
+
+extern GLXPixmap glXCreateGLXPixmap(Display *dpy, XVisualInfo *vis,
+ Pixmap pixmap);
+
+extern void glXDestroyContext(Display *dpy, GLXContext ctx);
+
+extern void glXDestroyGLXPixmap(Display *dpy, GLXPixmap pix);
+
+extern int glXGetConfig(Display *dpy, XVisualInfo *vis,
+ int attrib, int *value);
+
+extern GLXContext glXGetCurrentContext(void);
+
+extern GLXDrawable glXGetCurrentDrawable(void);
+
+extern Bool glXIsDirect(Display *dpy, GLXContext ctx);
+
+extern Bool glXMakeCurrent(Display *dpy, GLXDrawable drawable,
+ GLXContext ctx);
+
+extern Bool glXQueryExtension(Display *dpy, int *error_base, int *event_base);
+
+extern Bool glXQueryVersion(Display *dpy, int *major, int *minor);
+
+extern void glXSwapBuffers(Display *dpy, GLXDrawable drawable);
+
+extern void glXUseXFont(Font font, int first, int count, int list_base);
+
+extern void glXWaitGL(void);
+
+extern void glXWaitX(void);
+
+
+#ifndef GLX_VERSION_1_1
+#define GLX_VERSION_1_1 1
+/*
+ * GLX 1.1 functions.
+ */
+extern const char *glXGetClientString(Display *dpy, int name);
+
+extern const char *glXQueryServerString(Display *dpy, int screen, int name);
+
+extern const char *glXQueryExtensionsString(Display *dpy, int screen);
+#endif
+
+
+#ifndef GLX_VERSION_1_2
+#define GLX_VERSION_1_2 1
+/*
+ * GLX 1.2 functions.
+ */
+extern Display *glXGetCurrentDisplay(void);
+#endif
+
+#ifndef GLX_VERSION_1_3
+#define GLX_VERSION_1_3 1
+/*
+ * GLX 1.3 functions.
+ */
+extern GLXFBConfig *glXChooseFBConfig(Display *dpy, int screen,
+ const int *attrib_list, int *nelements);
+
+extern GLXContext glXCreateNewContext(Display *dpy, GLXFBConfig config,
+ int render_type, GLXContext share_list,
+ Bool direct);
+
+extern GLXPbuffer glXCreatePbuffer(Display *dpy, GLXFBConfig config,
+ const int *attrib_list);
+
+extern GLXPixmap glXCreatePixmap(Display *dpy, GLXFBConfig config,
+ Pixmap pixmap, const int *attrib_list);
+
+extern GLXWindow glXCreateWindow(Display *dpy, GLXFBConfig config,
+ Window win, const int *attrib_list);
+
+extern void glXDestroyPbuffer(Display *dpy, GLXPbuffer pbuf);
+
+extern void glXDestroyPixmap(Display *dpy, GLXPixmap pixmap);
+
+extern void glXDestroyWindow(Display *dpy, GLXWindow win);
+
+extern GLXDrawable glXGetCurrentReadDrawable(void);
+
+extern int glXGetFBConfigAttrib(Display *dpy, GLXFBConfig config,
+ int attribute, int *value);
+
+extern GLXFBConfig *glXGetFBConfigs(Display *dpy, int screen, int *nelements);
+
+extern void glXGetSelectedEvent(Display *dpy, GLXDrawable draw,
+ unsigned long *event_mask);
+
+extern XVisualInfo *glXGetVisualFromFBConfig(Display *dpy, GLXFBConfig config);
+
+extern Bool glXMakeContextCurrent(Display *display, GLXDrawable draw,
+ GLXDrawable read, GLXContext ctx);
+
+extern int glXQueryContext(Display *dpy, GLXContext ctx,
+ int attribute, int *value);
+
+extern void glXQueryDrawable(Display *dpy, GLXDrawable draw,
+ int attribute, unsigned int *value);
+
+extern void glXSelectEvent(Display *dpy, GLXDrawable draw,
+ unsigned long event_mask);
+
+typedef GLXFBConfig * ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements);
+typedef GLXFBConfig * ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
+typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value);
+typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config);
+typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);
+typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win);
+typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
+typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap);
+typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list);
+typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf);
+typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
+typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void);
+typedef Display * ( * PFNGLXGETCURRENTDISPLAYPROC) (void);
+typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value);
+typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask);
+typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask);
+#endif
+
+
+#ifndef GLX_VERSION_1_4
+#define GLX_VERSION_1_4 1
+/*
+ * GLX 1.4 functions and typedefs.
+ */
+extern __GLXextFuncPtr glXGetProcAddress (const GLubyte *);
+typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSPROC) (const GLubyte *procName);
+#endif
+
+
+
+/**********************************************************************/
+
+/*
+ * ARB_get_proc_address
+ */
+#ifndef GLX_ARB_get_proc_address
+#define GLX_ARB_get_proc_address 1
+/* Don't wrap this in GLX_GLXEXT_PROTOTYPES! */
+extern void (*glXGetProcAddressARB(const GLubyte *procName))(void);
+typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName);
+#endif
+
+/**********************************************************************/
+
+/*** Should these go here, or in another header? */
+/*
+ * GLX Events
+ */
+typedef struct {
+ int event_type; /* GLX_DAMAGED or GLX_SAVED */
+ int draw_type; /* GLX_WINDOW or GLX_PBUFFER */
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came for SendEvent request */
+ Display *display; /* display the event was read from */
+ GLXDrawable drawable; /* XID of Drawable */
+ unsigned int buffer_mask; /* mask indicating which buffers are affected */
+ unsigned int aux_buffer; /* which aux buffer was affected */
+ int x, y;
+ int width, height;
+ int count; /* if nonzero, at least this many more */
+} GLXPbufferClobberEvent;
+
+typedef union __GLXEvent {
+ GLXPbufferClobberEvent glxpbufferclobber;
+ long pad[24];
+} GLXEvent;
+
+#ifndef GLX_GLXEXT_LEGACY
+#include <GL/glxext.h>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !__glx_h__ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxew.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxew.h
new file mode 100644
index 0000000..6d249f7
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxew.h
@@ -0,0 +1,1587 @@
+/*
+** The OpenGL Extension Wrangler Library
+** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
+** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
+** Copyright (C) 2002, Lev Povalahev
+** All rights reserved.
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+**
+** * Redistributions of source code must retain the above copyright notice,
+** this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright notice,
+** this list of conditions and the following disclaimer in the documentation
+** and/or other materials provided with the distribution.
+** * The name of the author may be used to endorse or promote products
+** derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+** THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * Mesa 3-D graphics library
+ * Version: 7.0
+ *
+ * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+** Copyright (c) 2007 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+#ifndef __glxew_h__
+#define __glxew_h__
+#define __GLXEW_H__
+
+#ifdef __glxext_h_
+#error glxext.h included before glxew.h
+#endif
+
+#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__)
+#error glx.h included before glxew.h
+#endif
+
+#define __glxext_h_
+
+#define GLX_H
+#define __GLX_glx_h__
+#define __glx_h__
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xmd.h>
+#include <GL/glew.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ---------------------------- GLX_VERSION_1_0 --------------------------- */
+
+#ifndef GLX_VERSION_1_0
+#define GLX_VERSION_1_0 1
+
+#define GLX_USE_GL 1
+#define GLX_BUFFER_SIZE 2
+#define GLX_LEVEL 3
+#define GLX_RGBA 4
+#define GLX_DOUBLEBUFFER 5
+#define GLX_STEREO 6
+#define GLX_AUX_BUFFERS 7
+#define GLX_RED_SIZE 8
+#define GLX_GREEN_SIZE 9
+#define GLX_BLUE_SIZE 10
+#define GLX_ALPHA_SIZE 11
+#define GLX_DEPTH_SIZE 12
+#define GLX_STENCIL_SIZE 13
+#define GLX_ACCUM_RED_SIZE 14
+#define GLX_ACCUM_GREEN_SIZE 15
+#define GLX_ACCUM_BLUE_SIZE 16
+#define GLX_ACCUM_ALPHA_SIZE 17
+#define GLX_BAD_SCREEN 1
+#define GLX_BAD_ATTRIBUTE 2
+#define GLX_NO_EXTENSION 3
+#define GLX_BAD_VISUAL 4
+#define GLX_BAD_CONTEXT 5
+#define GLX_BAD_VALUE 6
+#define GLX_BAD_ENUM 7
+
+typedef XID GLXDrawable;
+typedef XID GLXPixmap;
+#ifdef __sun
+typedef struct __glXContextRec *GLXContext;
+#else
+typedef struct __GLXcontextRec *GLXContext;
+#endif
+
+typedef unsigned int GLXVideoDeviceNV;
+
+extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase);
+extern Bool glXQueryVersion (Display *dpy, int *major, int *minor);
+extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value);
+extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList);
+extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap);
+extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix);
+extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
+extern void glXDestroyContext (Display *dpy, GLXContext ctx);
+extern Bool glXIsDirect (Display *dpy, GLXContext ctx);
+extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask);
+extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx);
+extern GLXContext glXGetCurrentContext (void);
+extern GLXDrawable glXGetCurrentDrawable (void);
+extern void glXWaitGL (void);
+extern void glXWaitX (void);
+extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable);
+extern void glXUseXFont (Font font, int first, int count, int listBase);
+
+#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0)
+
+#endif /* GLX_VERSION_1_0 */
+
+/* ---------------------------- GLX_VERSION_1_1 --------------------------- */
+
+#ifndef GLX_VERSION_1_1
+#define GLX_VERSION_1_1
+
+#define GLX_VENDOR 0x1
+#define GLX_VERSION 0x2
+#define GLX_EXTENSIONS 0x3
+
+extern const char* glXQueryExtensionsString (Display *dpy, int screen);
+extern const char* glXGetClientString (Display *dpy, int name);
+extern const char* glXQueryServerString (Display *dpy, int screen, int name);
+
+#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1)
+
+#endif /* GLX_VERSION_1_1 */
+
+/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */
+
+#ifndef GLX_VERSION_1_2
+#define GLX_VERSION_1_2 1
+
+typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void);
+
+#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay)
+
+#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2)
+
+#endif /* GLX_VERSION_1_2 */
+
+/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */
+
+#ifndef GLX_VERSION_1_3
+#define GLX_VERSION_1_3 1
+
+#define GLX_RGBA_BIT 0x00000001
+#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
+#define GLX_WINDOW_BIT 0x00000001
+#define GLX_COLOR_INDEX_BIT 0x00000002
+#define GLX_PIXMAP_BIT 0x00000002
+#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
+#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
+#define GLX_PBUFFER_BIT 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
+#define GLX_AUX_BUFFERS_BIT 0x00000010
+#define GLX_CONFIG_CAVEAT 0x20
+#define GLX_DEPTH_BUFFER_BIT 0x00000020
+#define GLX_X_VISUAL_TYPE 0x22
+#define GLX_TRANSPARENT_TYPE 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE 0x24
+#define GLX_TRANSPARENT_RED_VALUE 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
+#define GLX_STENCIL_BUFFER_BIT 0x00000040
+#define GLX_ACCUM_BUFFER_BIT 0x00000080
+#define GLX_NONE 0x8000
+#define GLX_SLOW_CONFIG 0x8001
+#define GLX_TRUE_COLOR 0x8002
+#define GLX_DIRECT_COLOR 0x8003
+#define GLX_PSEUDO_COLOR 0x8004
+#define GLX_STATIC_COLOR 0x8005
+#define GLX_GRAY_SCALE 0x8006
+#define GLX_STATIC_GRAY 0x8007
+#define GLX_TRANSPARENT_RGB 0x8008
+#define GLX_TRANSPARENT_INDEX 0x8009
+#define GLX_VISUAL_ID 0x800B
+#define GLX_SCREEN 0x800C
+#define GLX_NON_CONFORMANT_CONFIG 0x800D
+#define GLX_DRAWABLE_TYPE 0x8010
+#define GLX_RENDER_TYPE 0x8011
+#define GLX_X_RENDERABLE 0x8012
+#define GLX_FBCONFIG_ID 0x8013
+#define GLX_RGBA_TYPE 0x8014
+#define GLX_COLOR_INDEX_TYPE 0x8015
+#define GLX_MAX_PBUFFER_WIDTH 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT 0x8017
+#define GLX_MAX_PBUFFER_PIXELS 0x8018
+#define GLX_PRESERVED_CONTENTS 0x801B
+#define GLX_LARGEST_PBUFFER 0x801C
+#define GLX_WIDTH 0x801D
+#define GLX_HEIGHT 0x801E
+#define GLX_EVENT_MASK 0x801F
+#define GLX_DAMAGED 0x8020
+#define GLX_SAVED 0x8021
+#define GLX_WINDOW 0x8022
+#define GLX_PBUFFER 0x8023
+#define GLX_PBUFFER_HEIGHT 0x8040
+#define GLX_PBUFFER_WIDTH 0x8041
+#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
+#define GLX_DONT_CARE 0xFFFFFFFF
+
+typedef XID GLXFBConfigID;
+typedef XID GLXPbuffer;
+typedef XID GLXWindow;
+typedef struct __GLXFBConfigRec *GLXFBConfig;
+
+typedef struct {
+ int event_type;
+ int draw_type;
+ unsigned long serial;
+ Bool send_event;
+ Display *display;
+ GLXDrawable drawable;
+ unsigned int buffer_mask;
+ unsigned int aux_buffer;
+ int x, y;
+ int width, height;
+ int count;
+} GLXPbufferClobberEvent;
+typedef union __GLXEvent {
+ GLXPbufferClobberEvent glxpbufferclobber;
+ long pad[24];
+} GLXEvent;
+
+typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
+typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list);
+typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
+typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);
+typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf);
+typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap);
+typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win);
+typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void);
+typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value);
+typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements);
+typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask);
+typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config);
+typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value);
+typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
+typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask);
+
+#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig)
+#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext)
+#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer)
+#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap)
+#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow)
+#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer)
+#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap)
+#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow)
+#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable)
+#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib)
+#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs)
+#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent)
+#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig)
+#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent)
+#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext)
+#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable)
+#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent)
+
+#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3)
+
+#endif /* GLX_VERSION_1_3 */
+
+/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */
+
+#ifndef GLX_VERSION_1_4
+#define GLX_VERSION_1_4 1
+
+#define GLX_SAMPLE_BUFFERS 100000
+#define GLX_SAMPLES 100001
+
+extern void ( * glXGetProcAddress (const GLubyte *procName)) (void);
+
+#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4)
+
+#endif /* GLX_VERSION_1_4 */
+
+/* -------------------------- GLX_3DFX_multisample ------------------------- */
+
+#ifndef GLX_3DFX_multisample
+#define GLX_3DFX_multisample 1
+
+#define GLX_SAMPLE_BUFFERS_3DFX 0x8050
+#define GLX_SAMPLES_3DFX 0x8051
+
+#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample)
+
+#endif /* GLX_3DFX_multisample */
+
+/* ------------------------ GLX_AMD_gpu_association ------------------------ */
+
+#ifndef GLX_AMD_gpu_association
+#define GLX_AMD_gpu_association 1
+
+#define GLX_GPU_VENDOR_AMD 0x1F00
+#define GLX_GPU_RENDERER_STRING_AMD 0x1F01
+#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
+#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
+#define GLX_GPU_RAM_AMD 0x21A3
+#define GLX_GPU_CLOCK_AMD 0x21A4
+#define GLX_GPU_NUM_PIPES_AMD 0x21A5
+#define GLX_GPU_NUM_SIMD_AMD 0x21A6
+#define GLX_GPU_NUM_RB_AMD 0x21A7
+#define GLX_GPU_NUM_SPI_AMD 0x21A8
+
+#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association)
+
+#endif /* GLX_AMD_gpu_association */
+
+/* ------------------------- GLX_ARB_create_context ------------------------ */
+
+#ifndef GLX_ARB_create_context
+#define GLX_ARB_create_context 1
+
+#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
+#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define GLX_CONTEXT_FLAGS_ARB 0x2094
+
+typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
+
+#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB)
+
+#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context)
+
+#endif /* GLX_ARB_create_context */
+
+/* --------------------- GLX_ARB_create_context_profile -------------------- */
+
+#ifndef GLX_ARB_create_context_profile
+#define GLX_ARB_create_context_profile 1
+
+#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
+
+#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile)
+
+#endif /* GLX_ARB_create_context_profile */
+
+/* ------------------- GLX_ARB_create_context_robustness ------------------- */
+
+#ifndef GLX_ARB_create_context_robustness
+#define GLX_ARB_create_context_robustness 1
+
+#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261
+
+#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness)
+
+#endif /* GLX_ARB_create_context_robustness */
+
+/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */
+
+#ifndef GLX_ARB_fbconfig_float
+#define GLX_ARB_fbconfig_float 1
+
+#define GLX_RGBA_FLOAT_BIT 0x00000004
+#define GLX_RGBA_FLOAT_TYPE 0x20B9
+
+#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float)
+
+#endif /* GLX_ARB_fbconfig_float */
+
+/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */
+
+#ifndef GLX_ARB_framebuffer_sRGB
+#define GLX_ARB_framebuffer_sRGB 1
+
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2
+
+#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB)
+
+#endif /* GLX_ARB_framebuffer_sRGB */
+
+/* ------------------------ GLX_ARB_get_proc_address ----------------------- */
+
+#ifndef GLX_ARB_get_proc_address
+#define GLX_ARB_get_proc_address 1
+
+extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void);
+
+#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address)
+
+#endif /* GLX_ARB_get_proc_address */
+
+/* -------------------------- GLX_ARB_multisample -------------------------- */
+
+#ifndef GLX_ARB_multisample
+#define GLX_ARB_multisample 1
+
+#define GLX_SAMPLE_BUFFERS_ARB 100000
+#define GLX_SAMPLES_ARB 100001
+
+#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample)
+
+#endif /* GLX_ARB_multisample */
+
+/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */
+
+#ifndef GLX_ARB_vertex_buffer_object
+#define GLX_ARB_vertex_buffer_object 1
+
+#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095
+
+#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object)
+
+#endif /* GLX_ARB_vertex_buffer_object */
+
+/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */
+
+#ifndef GLX_ATI_pixel_format_float
+#define GLX_ATI_pixel_format_float 1
+
+#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100
+
+#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float)
+
+#endif /* GLX_ATI_pixel_format_float */
+
+/* ------------------------- GLX_ATI_render_texture ------------------------ */
+
+#ifndef GLX_ATI_render_texture
+#define GLX_ATI_render_texture 1
+
+#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800
+#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801
+#define GLX_TEXTURE_FORMAT_ATI 0x9802
+#define GLX_TEXTURE_TARGET_ATI 0x9803
+#define GLX_MIPMAP_TEXTURE_ATI 0x9804
+#define GLX_TEXTURE_RGB_ATI 0x9805
+#define GLX_TEXTURE_RGBA_ATI 0x9806
+#define GLX_NO_TEXTURE_ATI 0x9807
+#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808
+#define GLX_TEXTURE_1D_ATI 0x9809
+#define GLX_TEXTURE_2D_ATI 0x980A
+#define GLX_MIPMAP_LEVEL_ATI 0x980B
+#define GLX_CUBE_MAP_FACE_ATI 0x980C
+#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D
+#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E
+#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F
+#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810
+#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811
+#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812
+#define GLX_FRONT_LEFT_ATI 0x9813
+#define GLX_FRONT_RIGHT_ATI 0x9814
+#define GLX_BACK_LEFT_ATI 0x9815
+#define GLX_BACK_RIGHT_ATI 0x9816
+#define GLX_AUX0_ATI 0x9817
+#define GLX_AUX1_ATI 0x9818
+#define GLX_AUX2_ATI 0x9819
+#define GLX_AUX3_ATI 0x981A
+#define GLX_AUX4_ATI 0x981B
+#define GLX_AUX5_ATI 0x981C
+#define GLX_AUX6_ATI 0x981D
+#define GLX_AUX7_ATI 0x981E
+#define GLX_AUX8_ATI 0x981F
+#define GLX_AUX9_ATI 0x9820
+#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821
+#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822
+
+typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);
+typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list);
+typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer);
+
+#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI)
+#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI)
+#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI)
+
+#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture)
+
+#endif /* GLX_ATI_render_texture */
+
+/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */
+
+#ifndef GLX_EXT_create_context_es2_profile
+#define GLX_EXT_create_context_es2_profile 1
+
+#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+
+#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile)
+
+#endif /* GLX_EXT_create_context_es2_profile */
+
+/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */
+
+#ifndef GLX_EXT_fbconfig_packed_float
+#define GLX_EXT_fbconfig_packed_float 1
+
+#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008
+#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1
+
+#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float)
+
+#endif /* GLX_EXT_fbconfig_packed_float */
+
+/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */
+
+#ifndef GLX_EXT_framebuffer_sRGB
+#define GLX_EXT_framebuffer_sRGB 1
+
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2
+
+#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB)
+
+#endif /* GLX_EXT_framebuffer_sRGB */
+
+/* ------------------------- GLX_EXT_import_context ------------------------ */
+
+#ifndef GLX_EXT_import_context
+#define GLX_EXT_import_context 1
+
+#define GLX_SHARE_CONTEXT_EXT 0x800A
+#define GLX_VISUAL_ID_EXT 0x800B
+#define GLX_SCREEN_EXT 0x800C
+
+typedef XID GLXContextID;
+
+typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context);
+typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context);
+typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID);
+typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value);
+
+#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT)
+#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT)
+#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT)
+#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT)
+
+#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context)
+
+#endif /* GLX_EXT_import_context */
+
+/* -------------------------- GLX_EXT_scene_marker ------------------------- */
+
+#ifndef GLX_EXT_scene_marker
+#define GLX_EXT_scene_marker 1
+
+#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker)
+
+#endif /* GLX_EXT_scene_marker */
+
+/* -------------------------- GLX_EXT_swap_control ------------------------- */
+
+#ifndef GLX_EXT_swap_control
+#define GLX_EXT_swap_control 1
+
+#define GLX_SWAP_INTERVAL_EXT 0x20F1
+#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
+
+typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval);
+
+#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT)
+
+#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control)
+
+#endif /* GLX_EXT_swap_control */
+
+/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */
+
+#ifndef GLX_EXT_texture_from_pixmap
+#define GLX_EXT_texture_from_pixmap 1
+
+#define GLX_TEXTURE_1D_BIT_EXT 0x00000001
+#define GLX_TEXTURE_2D_BIT_EXT 0x00000002
+#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004
+#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0
+#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1
+#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2
+#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3
+#define GLX_Y_INVERTED_EXT 0x20D4
+#define GLX_TEXTURE_FORMAT_EXT 0x20D5
+#define GLX_TEXTURE_TARGET_EXT 0x20D6
+#define GLX_MIPMAP_TEXTURE_EXT 0x20D7
+#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8
+#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9
+#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA
+#define GLX_TEXTURE_1D_EXT 0x20DB
+#define GLX_TEXTURE_2D_EXT 0x20DC
+#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD
+#define GLX_FRONT_LEFT_EXT 0x20DE
+#define GLX_FRONT_RIGHT_EXT 0x20DF
+#define GLX_BACK_LEFT_EXT 0x20E0
+#define GLX_BACK_RIGHT_EXT 0x20E1
+#define GLX_AUX0_EXT 0x20E2
+#define GLX_AUX1_EXT 0x20E3
+#define GLX_AUX2_EXT 0x20E4
+#define GLX_AUX3_EXT 0x20E5
+#define GLX_AUX4_EXT 0x20E6
+#define GLX_AUX5_EXT 0x20E7
+#define GLX_AUX6_EXT 0x20E8
+#define GLX_AUX7_EXT 0x20E9
+#define GLX_AUX8_EXT 0x20EA
+#define GLX_AUX9_EXT 0x20EB
+
+typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list);
+typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer);
+
+#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT)
+#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT)
+
+#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap)
+
+#endif /* GLX_EXT_texture_from_pixmap */
+
+/* -------------------------- GLX_EXT_visual_info -------------------------- */
+
+#ifndef GLX_EXT_visual_info
+#define GLX_EXT_visual_info 1
+
+#define GLX_X_VISUAL_TYPE_EXT 0x22
+#define GLX_TRANSPARENT_TYPE_EXT 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24
+#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28
+#define GLX_NONE_EXT 0x8000
+#define GLX_TRUE_COLOR_EXT 0x8002
+#define GLX_DIRECT_COLOR_EXT 0x8003
+#define GLX_PSEUDO_COLOR_EXT 0x8004
+#define GLX_STATIC_COLOR_EXT 0x8005
+#define GLX_GRAY_SCALE_EXT 0x8006
+#define GLX_STATIC_GRAY_EXT 0x8007
+#define GLX_TRANSPARENT_RGB_EXT 0x8008
+#define GLX_TRANSPARENT_INDEX_EXT 0x8009
+
+#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info)
+
+#endif /* GLX_EXT_visual_info */
+
+/* ------------------------- GLX_EXT_visual_rating ------------------------- */
+
+#ifndef GLX_EXT_visual_rating
+#define GLX_EXT_visual_rating 1
+
+#define GLX_VISUAL_CAVEAT_EXT 0x20
+#define GLX_SLOW_VISUAL_EXT 0x8001
+#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D
+
+#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating)
+
+#endif /* GLX_EXT_visual_rating */
+
+/* -------------------------- GLX_INTEL_swap_event ------------------------- */
+
+#ifndef GLX_INTEL_swap_event
+#define GLX_INTEL_swap_event 1
+
+#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180
+#define GLX_COPY_COMPLETE_INTEL 0x8181
+#define GLX_FLIP_COMPLETE_INTEL 0x8182
+#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000
+
+#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event)
+
+#endif /* GLX_INTEL_swap_event */
+
+/* -------------------------- GLX_MESA_agp_offset -------------------------- */
+
+#ifndef GLX_MESA_agp_offset
+#define GLX_MESA_agp_offset 1
+
+typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer);
+
+#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA)
+
+#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset)
+
+#endif /* GLX_MESA_agp_offset */
+
+/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */
+
+#ifndef GLX_MESA_copy_sub_buffer
+#define GLX_MESA_copy_sub_buffer 1
+
+typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height);
+
+#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA)
+
+#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer)
+
+#endif /* GLX_MESA_copy_sub_buffer */
+
+/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */
+
+#ifndef GLX_MESA_pixmap_colormap
+#define GLX_MESA_pixmap_colormap 1
+
+typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap);
+
+#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA)
+
+#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap)
+
+#endif /* GLX_MESA_pixmap_colormap */
+
+/* ------------------------ GLX_MESA_release_buffers ----------------------- */
+
+#ifndef GLX_MESA_release_buffers
+#define GLX_MESA_release_buffers 1
+
+typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d);
+
+#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA)
+
+#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers)
+
+#endif /* GLX_MESA_release_buffers */
+
+/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */
+
+#ifndef GLX_MESA_set_3dfx_mode
+#define GLX_MESA_set_3dfx_mode 1
+
+#define GLX_3DFX_WINDOW_MODE_MESA 0x1
+#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2
+
+typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode);
+
+#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA)
+
+#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode)
+
+#endif /* GLX_MESA_set_3dfx_mode */
+
+/* ------------------------- GLX_MESA_swap_control ------------------------- */
+
+#ifndef GLX_MESA_swap_control
+#define GLX_MESA_swap_control 1
+
+typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void);
+typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval);
+
+#define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA)
+#define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA)
+
+#define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control)
+
+#endif /* GLX_MESA_swap_control */
+
+/* --------------------------- GLX_NV_copy_image --------------------------- */
+
+#ifndef GLX_NV_copy_image
+#define GLX_NV_copy_image 1
+
+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);
+
+#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV)
+
+#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image)
+
+#endif /* GLX_NV_copy_image */
+
+/* -------------------------- GLX_NV_float_buffer -------------------------- */
+
+#ifndef GLX_NV_float_buffer
+#define GLX_NV_float_buffer 1
+
+#define GLX_FLOAT_COMPONENTS_NV 0x20B0
+
+#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer)
+
+#endif /* GLX_NV_float_buffer */
+
+/* ---------------------- GLX_NV_multisample_coverage ---------------------- */
+
+#ifndef GLX_NV_multisample_coverage
+#define GLX_NV_multisample_coverage 1
+
+#define GLX_COLOR_SAMPLES_NV 0x20B3
+#define GLX_COVERAGE_SAMPLES_NV 100001
+
+#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage)
+
+#endif /* GLX_NV_multisample_coverage */
+
+/* -------------------------- GLX_NV_present_video ------------------------- */
+
+#ifndef GLX_NV_present_video
+#define GLX_NV_present_video 1
+
+#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0
+
+typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list);
+typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements);
+
+#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV)
+#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV)
+
+#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video)
+
+#endif /* GLX_NV_present_video */
+
+/* --------------------------- GLX_NV_swap_group --------------------------- */
+
+#ifndef GLX_NV_swap_group
+#define GLX_NV_swap_group 1
+
+typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier);
+typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group);
+typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count);
+typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers);
+typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier);
+typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen);
+
+#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV)
+#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV)
+#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV)
+#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV)
+#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV)
+#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV)
+
+#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group)
+
+#endif /* GLX_NV_swap_group */
+
+/* ----------------------- GLX_NV_vertex_array_range ----------------------- */
+
+#ifndef GLX_NV_vertex_array_range
+#define GLX_NV_vertex_array_range 1
+
+typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);
+typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer);
+
+#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV)
+#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV)
+
+#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range)
+
+#endif /* GLX_NV_vertex_array_range */
+
+/* -------------------------- GLX_NV_video_capture ------------------------- */
+
+#ifndef GLX_NV_video_capture
+#define GLX_NV_video_capture 1
+
+#define GLX_DEVICE_ID_NV 0x20CD
+#define GLX_UNIQUE_ID_NV 0x20CE
+#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
+
+typedef XID GLXVideoCaptureDeviceNV;
+
+typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device);
+typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements);
+typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device);
+typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value);
+typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device);
+
+#define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV)
+#define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV)
+#define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV)
+#define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV)
+#define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV)
+
+#define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture)
+
+#endif /* GLX_NV_video_capture */
+
+/* -------------------------- GLX_NV_video_output -------------------------- */
+
+#ifndef GLX_NV_video_output
+#define GLX_NV_video_output 1
+
+#define GLX_VIDEO_OUT_COLOR_NV 0x20C3
+#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4
+#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5
+#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
+#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
+#define GLX_VIDEO_OUT_FRAME_NV 0x20C8
+#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9
+#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA
+#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB
+#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC
+
+typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer);
+typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice);
+typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
+typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice);
+typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf);
+typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock);
+
+#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV)
+#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV)
+#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV)
+#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV)
+#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV)
+#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV)
+
+#define GLXEW_NV_video_output GLXEW_GET_VAR(__GLXEW_NV_video_output)
+
+#endif /* GLX_NV_video_output */
+
+/* -------------------------- GLX_OML_swap_method -------------------------- */
+
+#ifndef GLX_OML_swap_method
+#define GLX_OML_swap_method 1
+
+#define GLX_SWAP_METHOD_OML 0x8060
+#define GLX_SWAP_EXCHANGE_OML 0x8061
+#define GLX_SWAP_COPY_OML 0x8062
+#define GLX_SWAP_UNDEFINED_OML 0x8063
+
+#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method)
+
+#endif /* GLX_OML_swap_method */
+
+/* -------------------------- GLX_OML_sync_control ------------------------- */
+
+#ifndef GLX_OML_sync_control
+#define GLX_OML_sync_control 1
+
+typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator);
+typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc);
+typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);
+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);
+typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc);
+
+#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML)
+#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML)
+#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML)
+#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML)
+#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML)
+
+#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control)
+
+#endif /* GLX_OML_sync_control */
+
+/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */
+
+#ifndef GLX_SGIS_blended_overlay
+#define GLX_SGIS_blended_overlay 1
+
+#define GLX_BLENDED_RGBA_SGIS 0x8025
+
+#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay)
+
+#endif /* GLX_SGIS_blended_overlay */
+
+/* -------------------------- GLX_SGIS_color_range ------------------------- */
+
+#ifndef GLX_SGIS_color_range
+#define GLX_SGIS_color_range 1
+
+#define GLX_MIN_RED_SGIS 0
+#define GLX_MAX_GREEN_SGIS 0
+#define GLX_MIN_BLUE_SGIS 0
+#define GLX_MAX_ALPHA_SGIS 0
+#define GLX_MIN_GREEN_SGIS 0
+#define GLX_MIN_ALPHA_SGIS 0
+#define GLX_MAX_RED_SGIS 0
+#define GLX_EXTENDED_RANGE_SGIS 0
+#define GLX_MAX_BLUE_SGIS 0
+
+#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range)
+
+#endif /* GLX_SGIS_color_range */
+
+/* -------------------------- GLX_SGIS_multisample ------------------------- */
+
+#ifndef GLX_SGIS_multisample
+#define GLX_SGIS_multisample 1
+
+#define GLX_SAMPLE_BUFFERS_SGIS 100000
+#define GLX_SAMPLES_SGIS 100001
+
+#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample)
+
+#endif /* GLX_SGIS_multisample */
+
+/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */
+
+#ifndef GLX_SGIS_shared_multisample
+#define GLX_SGIS_shared_multisample 1
+
+#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026
+#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027
+
+#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample)
+
+#endif /* GLX_SGIS_shared_multisample */
+
+/* --------------------------- GLX_SGIX_fbconfig --------------------------- */
+
+#ifndef GLX_SGIX_fbconfig
+#define GLX_SGIX_fbconfig 1
+
+#define GLX_WINDOW_BIT_SGIX 0x00000001
+#define GLX_RGBA_BIT_SGIX 0x00000001
+#define GLX_PIXMAP_BIT_SGIX 0x00000002
+#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
+#define GLX_SCREEN_EXT 0x800C
+#define GLX_DRAWABLE_TYPE_SGIX 0x8010
+#define GLX_RENDER_TYPE_SGIX 0x8011
+#define GLX_X_RENDERABLE_SGIX 0x8012
+#define GLX_FBCONFIG_ID_SGIX 0x8013
+#define GLX_RGBA_TYPE_SGIX 0x8014
+#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
+
+typedef XID GLXFBConfigIDSGIX;
+typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
+
+typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements);
+typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap);
+typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value);
+typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis);
+typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config);
+
+#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX)
+#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX)
+#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX)
+#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX)
+#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX)
+#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX)
+
+#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig)
+
+#endif /* GLX_SGIX_fbconfig */
+
+/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */
+
+#ifndef GLX_SGIX_hyperpipe
+#define GLX_SGIX_hyperpipe 1
+
+#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001
+#define GLX_PIPE_RECT_SGIX 0x00000001
+#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002
+#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002
+#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003
+#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004
+#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80
+#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91
+#define GLX_BAD_HYPERPIPE_SGIX 92
+#define GLX_HYPERPIPE_ID_SGIX 0x8030
+
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int networkId;
+} GLXHyperpipeNetworkSGIX;
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int XOrigin;
+ int YOrigin;
+ int maxHeight;
+ int maxWidth;
+} GLXPipeRectLimits;
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int channel;
+ unsigned int participationType;
+ int timeSlice;
+} GLXHyperpipeConfigSGIX;
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int srcXOrigin;
+ int srcYOrigin;
+ int srcWidth;
+ int srcHeight;
+ int destXOrigin;
+ int destYOrigin;
+ int destWidth;
+ int destHeight;
+} GLXPipeRect;
+
+typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId);
+typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId);
+typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList);
+typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId);
+typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList);
+typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList);
+typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes);
+typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes);
+
+#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX)
+#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX)
+#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX)
+#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX)
+#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX)
+#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX)
+#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX)
+#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX)
+
+#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe)
+
+#endif /* GLX_SGIX_hyperpipe */
+
+/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */
+
+#ifndef GLX_SGIX_pbuffer
+#define GLX_SGIX_pbuffer 1
+
+#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
+#define GLX_PBUFFER_BIT_SGIX 0x00000004
+#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
+#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
+#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
+#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
+#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
+#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
+#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
+#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
+#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
+#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
+#define GLX_PRESERVED_CONTENTS_SGIX 0x801B
+#define GLX_LARGEST_PBUFFER_SGIX 0x801C
+#define GLX_WIDTH_SGIX 0x801D
+#define GLX_HEIGHT_SGIX 0x801E
+#define GLX_EVENT_MASK_SGIX 0x801F
+#define GLX_DAMAGED_SGIX 0x8020
+#define GLX_SAVED_SGIX 0x8021
+#define GLX_WINDOW_SGIX 0x8022
+#define GLX_PBUFFER_SGIX 0x8023
+#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
+
+typedef XID GLXPbufferSGIX;
+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;
+
+typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list);
+typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf);
+typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask);
+typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value);
+typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask);
+
+#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX)
+#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX)
+#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX)
+#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX)
+#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX)
+
+#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer)
+
+#endif /* GLX_SGIX_pbuffer */
+
+/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */
+
+#ifndef GLX_SGIX_swap_barrier
+#define GLX_SGIX_swap_barrier 1
+
+typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier);
+typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max);
+
+#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX)
+#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX)
+
+#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier)
+
+#endif /* GLX_SGIX_swap_barrier */
+
+/* -------------------------- GLX_SGIX_swap_group -------------------------- */
+
+#ifndef GLX_SGIX_swap_group
+#define GLX_SGIX_swap_group 1
+
+typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member);
+
+#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX)
+
+#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group)
+
+#endif /* GLX_SGIX_swap_group */
+
+/* ------------------------- GLX_SGIX_video_resize ------------------------- */
+
+#ifndef GLX_SGIX_video_resize
+#define GLX_SGIX_video_resize 1
+
+#define GLX_SYNC_FRAME_SGIX 0x00000000
+#define GLX_SYNC_SWAP_SGIX 0x00000001
+
+typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window);
+typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h);
+typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype);
+typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h);
+typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh);
+
+#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX)
+#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX)
+#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX)
+#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX)
+#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX)
+
+#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize)
+
+#endif /* GLX_SGIX_video_resize */
+
+/* ---------------------- GLX_SGIX_visual_select_group --------------------- */
+
+#ifndef GLX_SGIX_visual_select_group
+#define GLX_SGIX_visual_select_group 1
+
+#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028
+
+#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group)
+
+#endif /* GLX_SGIX_visual_select_group */
+
+/* ---------------------------- GLX_SGI_cushion ---------------------------- */
+
+#ifndef GLX_SGI_cushion
+#define GLX_SGI_cushion 1
+
+typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion);
+
+#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI)
+
+#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion)
+
+#endif /* GLX_SGI_cushion */
+
+/* ----------------------- GLX_SGI_make_current_read ----------------------- */
+
+#ifndef GLX_SGI_make_current_read
+#define GLX_SGI_make_current_read 1
+
+typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void);
+typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+
+#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI)
+#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI)
+
+#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read)
+
+#endif /* GLX_SGI_make_current_read */
+
+/* -------------------------- GLX_SGI_swap_control ------------------------- */
+
+#ifndef GLX_SGI_swap_control
+#define GLX_SGI_swap_control 1
+
+typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
+
+#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI)
+
+#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control)
+
+#endif /* GLX_SGI_swap_control */
+
+/* --------------------------- GLX_SGI_video_sync -------------------------- */
+
+#ifndef GLX_SGI_video_sync
+#define GLX_SGI_video_sync 1
+
+typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count);
+typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count);
+
+#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI)
+#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI)
+
+#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync)
+
+#endif /* GLX_SGI_video_sync */
+
+/* --------------------- GLX_SUN_get_transparent_index --------------------- */
+
+#ifndef GLX_SUN_get_transparent_index
+#define GLX_SUN_get_transparent_index 1
+
+typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex);
+
+#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN)
+
+#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index)
+
+#endif /* GLX_SUN_get_transparent_index */
+
+/* -------------------------- GLX_SUN_video_resize ------------------------- */
+
+#ifndef GLX_SUN_video_resize
+#define GLX_SUN_video_resize 1
+
+#define GLX_VIDEO_RESIZE_SUN 0x8171
+#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD
+
+typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor);
+typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor);
+
+#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN)
+#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN)
+
+#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize)
+
+#endif /* GLX_SUN_video_resize */
+
+/* ------------------------------------------------------------------------- */
+
+#ifdef GLEW_MX
+#define GLXEW_EXPORT
+#else
+#define GLXEW_EXPORT extern
+#endif /* GLEW_MX */
+
+extern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay;
+
+extern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig;
+extern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext;
+extern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer;
+extern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap;
+extern PFNGLXCREATEWINDOWPROC __glewXCreateWindow;
+extern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer;
+extern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap;
+extern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow;
+extern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable;
+extern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib;
+extern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs;
+extern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent;
+extern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig;
+extern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent;
+extern PFNGLXQUERYCONTEXTPROC __glewXQueryContext;
+extern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable;
+extern PFNGLXSELECTEVENTPROC __glewXSelectEvent;
+
+extern PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB;
+
+extern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI;
+extern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI;
+extern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI;
+
+extern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT;
+extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT;
+extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT;
+extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT;
+
+extern PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT;
+
+extern PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT;
+extern PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT;
+
+extern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA;
+
+extern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA;
+
+extern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA;
+
+extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA;
+
+extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA;
+
+extern PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA;
+extern PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA;
+
+extern PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV;
+
+extern PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV;
+extern PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV;
+
+extern PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV;
+extern PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV;
+extern PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV;
+extern PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV;
+extern PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV;
+extern PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV;
+
+extern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV;
+extern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV;
+
+extern PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV;
+extern PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV;
+extern PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV;
+extern PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV;
+extern PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV;
+
+extern PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV;
+extern PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV;
+extern PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV;
+extern PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV;
+extern PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV;
+extern PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV;
+
+extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML;
+extern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML;
+extern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML;
+extern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML;
+extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML;
+
+extern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX;
+extern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX;
+extern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX;
+extern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX;
+extern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX;
+extern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX;
+
+extern PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX;
+extern PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX;
+extern PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX;
+extern PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX;
+extern PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX;
+extern PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX;
+extern PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX;
+extern PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX;
+
+extern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX;
+extern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX;
+extern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX;
+extern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX;
+extern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX;
+
+extern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX;
+extern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX;
+
+extern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX;
+
+extern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX;
+extern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX;
+extern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX;
+extern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX;
+extern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX;
+
+extern PFNGLXCUSHIONSGIPROC __glewXCushionSGI;
+
+extern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI;
+extern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI;
+
+extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI;
+
+extern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI;
+extern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI;
+
+extern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN;
+
+extern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN;
+extern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN;
+
+#if defined(GLEW_MX)
+struct GLXEWContextStruct
+{
+#endif /* GLEW_MX */
+
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3;
+GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4;
+GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_AMD_gpu_association;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context_profile;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context_robustness;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object;
+GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float;
+GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_swap_control;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating;
+GLXEW_EXPORT GLboolean __GLXEW_INTEL_swap_event;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode;
+GLXEW_EXPORT GLboolean __GLXEW_MESA_swap_control;
+GLXEW_EXPORT GLboolean __GLXEW_NV_copy_image;
+GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer;
+GLXEW_EXPORT GLboolean __GLXEW_NV_multisample_coverage;
+GLXEW_EXPORT GLboolean __GLXEW_NV_present_video;
+GLXEW_EXPORT GLboolean __GLXEW_NV_swap_group;
+GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range;
+GLXEW_EXPORT GLboolean __GLXEW_NV_video_capture;
+GLXEW_EXPORT GLboolean __GLXEW_NV_video_output;
+GLXEW_EXPORT GLboolean __GLXEW_OML_swap_method;
+GLXEW_EXPORT GLboolean __GLXEW_OML_sync_control;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_hyperpipe;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize;
+GLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_cushion;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control;
+GLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync;
+GLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index;
+GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize;
+
+#ifdef GLEW_MX
+}; /* GLXEWContextStruct */
+#endif /* GLEW_MX */
+
+/* ------------------------------------------------------------------------ */
+
+#ifdef GLEW_MX
+
+typedef struct GLXEWContextStruct GLXEWContext;
+extern GLenum glxewContextInit (GLXEWContext* ctx);
+extern GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name);
+
+#define glxewInit() glxewContextInit(glxewGetContext())
+#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x)
+
+#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x))
+#define GLXEW_GET_FUN(x) x
+
+#else /* GLEW_MX */
+
+#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x)
+#define GLXEW_GET_FUN(x) x
+
+extern GLboolean glxewIsSupported (const char* name);
+
+#endif /* GLEW_MX */
+
+extern GLboolean glxewGetExtension (const char* name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __glxew_h__ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxext.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxext.h
new file mode 100644
index 0000000..cccee18
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/glxext.h
@@ -0,0 +1,941 @@
+#ifndef __glxext_h_
+#define __glxext_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** License Applicability. Except to the extent portions of this file are
+** made subject to an alternative license as permitted in the SGI Free
+** Software License B, Version 1.1 (the "License"), the contents of this
+** file are subject only to the provisions of the License. You may not use
+** this file except in compliance with the License. You may obtain a copy
+** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
+** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
+**
+** http://oss.sgi.com/projects/FreeB
+**
+** Note that, as provided in the License, the Software is distributed on an
+** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
+** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
+** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
+** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
+**
+** Original Code. The Original Code is: OpenGL Sample Implementation,
+** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
+** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc.
+** Copyright in any portions created by third parties is as indicated
+** elsewhere herein. All Rights Reserved.
+**
+** Additional Notice Provisions: This software was created using the
+** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has
+** not been independently verified as being compliant with the OpenGL(R)
+** version 1.2.1 Specification.
+*/
+
+#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+#endif
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+#ifndef GLAPI
+#define GLAPI extern
+#endif
+
+/*************************************************************/
+
+/* Header file version number, required by OpenGL ABI for Linux */
+/* glxext.h last updated 2009/01/08 */
+/* Current version at http://www.opengl.org/registry/ */
+#define GLX_GLXEXT_VERSION 21
+
+#ifndef GLX_ARB_get_proc_address
+#endif
+
+#ifndef GLX_ARB_multisample
+#define GLX_SAMPLE_BUFFERS_ARB 100000
+#define GLX_SAMPLES_ARB 100001
+#endif
+
+#ifndef GLX_ARB_fbconfig_float
+#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9
+#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004
+#endif
+
+#ifndef GLX_ARB_create_context
+#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define GLX_CONTEXT_FLAGS_ARB 0x2094
+#endif
+
+#ifndef GLX_SGIS_multisample
+#define GLX_SAMPLE_BUFFERS_SGIS 100000
+#define GLX_SAMPLES_SGIS 100001
+#endif
+
+#ifndef GLX_EXT_visual_info
+#define GLX_X_VISUAL_TYPE_EXT 0x22
+#define GLX_TRANSPARENT_TYPE_EXT 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24
+#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28
+#define GLX_NONE_EXT 0x8000
+#define GLX_TRUE_COLOR_EXT 0x8002
+#define GLX_DIRECT_COLOR_EXT 0x8003
+#define GLX_PSEUDO_COLOR_EXT 0x8004
+#define GLX_STATIC_COLOR_EXT 0x8005
+#define GLX_GRAY_SCALE_EXT 0x8006
+#define GLX_STATIC_GRAY_EXT 0x8007
+#define GLX_TRANSPARENT_RGB_EXT 0x8008
+#define GLX_TRANSPARENT_INDEX_EXT 0x8009
+#endif
+
+#ifndef GLX_SGI_swap_control
+#endif
+
+#ifndef GLX_SGI_video_sync
+#endif
+
+#ifndef GLX_SGI_make_current_read
+#endif
+
+#ifndef GLX_SGIX_video_source
+#endif
+
+#ifndef GLX_EXT_visual_rating
+#define GLX_VISUAL_CAVEAT_EXT 0x20
+#define GLX_SLOW_VISUAL_EXT 0x8001
+#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D
+/* reuse GLX_NONE_EXT */
+#endif
+
+#ifndef GLX_EXT_import_context
+#define GLX_SHARE_CONTEXT_EXT 0x800A
+#define GLX_VISUAL_ID_EXT 0x800B
+#define GLX_SCREEN_EXT 0x800C
+#endif
+
+#ifndef GLX_SGIX_fbconfig
+#define GLX_WINDOW_BIT_SGIX 0x00000001
+#define GLX_PIXMAP_BIT_SGIX 0x00000002
+#define GLX_RGBA_BIT_SGIX 0x00000001
+#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
+#define GLX_DRAWABLE_TYPE_SGIX 0x8010
+#define GLX_RENDER_TYPE_SGIX 0x8011
+#define GLX_X_RENDERABLE_SGIX 0x8012
+#define GLX_FBCONFIG_ID_SGIX 0x8013
+#define GLX_RGBA_TYPE_SGIX 0x8014
+#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
+/* reuse GLX_SCREEN_EXT */
+#endif
+
+#ifndef GLX_SGIX_pbuffer
+#define GLX_PBUFFER_BIT_SGIX 0x00000004
+#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
+#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
+#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
+#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
+#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
+#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
+#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
+#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
+#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
+#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
+#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
+#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
+#define GLX_PRESERVED_CONTENTS_SGIX 0x801B
+#define GLX_LARGEST_PBUFFER_SGIX 0x801C
+#define GLX_WIDTH_SGIX 0x801D
+#define GLX_HEIGHT_SGIX 0x801E
+#define GLX_EVENT_MASK_SGIX 0x801F
+#define GLX_DAMAGED_SGIX 0x8020
+#define GLX_SAVED_SGIX 0x8021
+#define GLX_WINDOW_SGIX 0x8022
+#define GLX_PBUFFER_SGIX 0x8023
+#endif
+
+#ifndef GLX_SGI_cushion
+#endif
+
+#ifndef GLX_SGIX_video_resize
+#define GLX_SYNC_FRAME_SGIX 0x00000000
+#define GLX_SYNC_SWAP_SGIX 0x00000001
+#endif
+
+#ifndef GLX_SGIX_dmbuffer
+#define GLX_DIGITAL_MEDIA_PBUFFER_SGIX 0x8024
+#endif
+
+#ifndef GLX_SGIX_swap_group
+#endif
+
+#ifndef GLX_SGIX_swap_barrier
+#endif
+
+#ifndef GLX_SGIS_blended_overlay
+#define GLX_BLENDED_RGBA_SGIS 0x8025
+#endif
+
+#ifndef GLX_SGIS_shared_multisample
+#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026
+#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027
+#endif
+
+#ifndef GLX_SUN_get_transparent_index
+#endif
+
+#ifndef GLX_3DFX_multisample
+#define GLX_SAMPLE_BUFFERS_3DFX 0x8050
+#define GLX_SAMPLES_3DFX 0x8051
+#endif
+
+#ifndef GLX_MESA_copy_sub_buffer
+#endif
+
+#ifndef GLX_MESA_pixmap_colormap
+#endif
+
+#ifndef GLX_MESA_release_buffers
+#endif
+
+#ifndef GLX_MESA_set_3dfx_mode
+#define GLX_3DFX_WINDOW_MODE_MESA 0x1
+#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2
+#endif
+
+#ifndef GLX_SGIX_visual_select_group
+#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028
+#endif
+
+#ifndef GLX_OML_swap_method
+#define GLX_SWAP_METHOD_OML 0x8060
+#define GLX_SWAP_EXCHANGE_OML 0x8061
+#define GLX_SWAP_COPY_OML 0x8062
+#define GLX_SWAP_UNDEFINED_OML 0x8063
+#endif
+
+#ifndef GLX_OML_sync_control
+#endif
+
+#ifndef GLX_NV_float_buffer
+#define GLX_FLOAT_COMPONENTS_NV 0x20B0
+#endif
+
+#ifndef GLX_SGIX_hyperpipe
+#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80
+#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91
+#define GLX_BAD_HYPERPIPE_SGIX 92
+#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001
+#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002
+#define GLX_PIPE_RECT_SGIX 0x00000001
+#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002
+#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003
+#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004
+#define GLX_HYPERPIPE_ID_SGIX 0x8030
+#endif
+
+#ifndef GLX_MESA_agp_offset
+#endif
+
+
+/*************************************************************/
+
+#ifndef GLX_ARB_get_proc_address
+/*
+ * Linux OpenGL ABI specifies glXGetProcAddressARB should be
+ * in glx.h moving related defines there as well.
+ */
+#endif
+
+#ifndef GLX_SGIX_video_source
+typedef XID GLXVideoSourceSGIX;
+#endif
+
+#ifndef GLX_SGIX_fbconfig
+typedef XID GLXFBConfigIDSGIX;
+typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
+#endif
+
+#ifndef GLX_SGIX_pbuffer
+typedef XID GLXPbufferSGIX;
+typedef struct {
+ int type;
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came for SendEvent request */
+ Display *display; /* display the event was read from */
+ GLXDrawable drawable; /* i.d. of Drawable */
+ int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */
+ int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */
+ unsigned int mask; /* mask indicating which buffers are affected*/
+ int x, y;
+ int width, height;
+ int count; /* if nonzero, at least this many more */
+} GLXBufferClobberEventSGIX;
+#endif
+
+#ifndef GLX_NV_swap_group
+#endif
+
+#ifndef GLX_NV_video_out
+/*
+ * GLXVideoDeviceNV is an opaque handle to a video device (part of the
+ * GLX_NV_video_out extension).
+ */
+typedef unsigned int GLXVideoDeviceNV;
+
+/* glXBindVideoImageNV iVideoBuffer values (NV_video_out) */
+#define GLX_VIDEO_OUT_COLOR_NV 0x20C3
+#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4
+#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5
+#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
+#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
+
+/* glXSendPbufferToVideoNV iBufferType values (NV_video_out) */
+#define GLX_VIDEO_OUT_FRAME_NV 0x20C8
+#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9
+#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA
+#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB
+#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC
+#endif
+
+#ifndef GLX_EXT_fbconfig_packed_float
+#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1
+#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008
+#endif
+
+#ifndef GLX_EXT_framebuffer_sRGB
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2
+#endif
+
+#ifndef GLX_EXT_texture_from_pixmap
+/* New glXGetFBConfigAttrib <attrib_list> tokens */
+#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0
+#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1
+#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2
+#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3
+#define GLX_Y_INVERTED_EXT 0x20D4
+
+/* New glXCreatePixmap attributes and glXQueryDrawable attributes */
+#define GLX_TEXTURE_FORMAT_EXT 0x20D5
+#define GLX_TEXTURE_TARGET_EXT 0x20D6
+#define GLX_MIPMAP_TEXTURE_EXT 0x20D7
+
+/* Values for GLX_TEXTURE_FORMAT_EXT */
+#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8
+#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9
+#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA
+
+/* Bits for GLX_BIND_TO_TEXTURE_TARGETS_EXT mask */
+#define GLX_TEXTURE_1D_BIT_EXT 0x00000001
+#define GLX_TEXTURE_2D_BIT_EXT 0x00000002
+#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004
+
+/* Values for GLX_TEXTURE_TARGET_EXT */
+#define GLX_TEXTURE_1D_EXT 0x20DB
+#define GLX_TEXTURE_2D_EXT 0x20DC
+#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD
+
+/*
+ * Values for the buffer parameter of glXBindTexImageEXT and
+ * glXReleaseTexImageEXT
+ */
+#define GLX_FRONT_LEFT_EXT 0x20DE
+#define GLX_FRONT_RIGHT_EXT 0x20DF
+#define GLX_BACK_LEFT_EXT 0x20E0
+#define GLX_BACK_RIGHT_EXT 0x20E1
+#define GLX_FRONT_EXT GLX_FRONT_LEFT_EXT
+#define GLX_BACK_EXT GLX_BACK_LEFT_EXT
+#define GLX_AUX0_EXT 0x20E2
+#define GLX_AUX1_EXT 0x20E3
+#define GLX_AUX2_EXT 0x20E4
+#define GLX_AUX3_EXT 0x20E5
+#define GLX_AUX4_EXT 0x20E6
+#define GLX_AUX5_EXT 0x20E7
+#define GLX_AUX6_EXT 0x20E8
+#define GLX_AUX7_EXT 0x20E9
+#define GLX_AUX8_EXT 0x20EA
+#define GLX_AUX9_EXT 0x20EB
+
+#endif
+
+#ifndef GLX_NV_multisample_coverage
+#define GLX_COVERAGE_SAMPLES_NV GLX_SAMPLES_ARB
+#define GLX_COLOR_SAMPLES_NV 0x20B3
+#endif
+
+#ifndef GLX_NV_video_capture
+typedef struct GLXVideoCaptureDeviceNVRec *GLXVideoCaptureDeviceNV;
+
+#define GLX_DEVICE_ID_NV 0x20CD
+#define GLX_UNIQUE_ID_NV 0x20CE
+#endif
+
+#ifndef GLX_EXT_swap_control
+#define GLX_SWAP_INTERVAL_EXT 0x20F1
+#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
+#endif
+
+#ifndef GLX_EXT_swap_control_tear
+#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3
+#endif
+
+/* Define int32_t and int64_t types for UST/MSC */
+/* (as used in the GLX_OML_sync_control extension). */
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+#elif defined( __VMS ) || defined(__FreeBSD__)
+#include <inttypes.h>
+#elif (defined(__sun__) && defined(__svr4__)) || (defined(__sun) && defined(__SVR4))
+#include <inttypes.h>
+#elif defined(__SCO__) || defined(__USLC__) || defined(__linux__)
+#include <stdint.h>
+#elif defined(__UNIXOS2__) || defined(__SOL64__)
+typedef long int int32_t;
+typedef long long int int64_t;
+#else
+#error "int32_t and int64_t are undefined!"
+#endif
+
+#ifndef GLX_ARB_get_proc_address
+/* Moved to glx.h */
+#endif
+
+#ifndef GLX_ARB_multisample
+#define GLX_ARB_multisample 1
+#endif
+
+#ifndef GLX_ARB_fbconfig_float
+#define GLX_ARB_fbconfig_float 1
+#endif
+
+#ifndef GLX_ARB_create_context
+#define GLX_ARB_create_context 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern GLXContext glXCreateContextAttribsARB (Display *, GLXFBConfig, GLXContext, Bool, const int *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
+#endif
+
+#ifndef GLX_SGIS_multisample
+#define GLX_SGIS_multisample 1
+#endif
+
+#ifndef GLX_EXT_visual_info
+#define GLX_EXT_visual_info 1
+#endif
+
+#ifndef GLX_SGI_swap_control
+#define GLX_SGI_swap_control 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern int glXSwapIntervalSGI (int);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
+#endif
+
+#ifndef GLX_EXT_swap_control
+#define GLX_EXT_swap_control 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern int glXSwapIntervalEXT (Display *dpy, GLXDrawable drawable, int interval);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef int ( * PFNGLXSWAPINTERVALEXTPROC) (Display *dpy, GLXDrawable drawable, int interval);
+#endif
+
+#ifndef GLX_EXT_swap_control_tear
+#define GLX_EXT_swap_control_tear 1
+#endif
+
+#ifndef GLX_SGI_video_sync
+#define GLX_SGI_video_sync 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern int glXGetVideoSyncSGI (unsigned int *);
+extern int glXWaitVideoSyncSGI (int, int, unsigned int *);
+extern int glXGetRefreshRateSGI(unsigned int *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int *count);
+typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int *count);
+typedef int ( * PFNGLXGETREFRESHRATESGIPROC) (unsigned int *);
+#endif
+
+#ifndef GLX_SGI_make_current_read
+#define GLX_SGI_make_current_read 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Bool glXMakeCurrentReadSGI (Display *, GLXDrawable, GLXDrawable, GLXContext);
+extern GLXDrawable glXGetCurrentReadDrawableSGI (void);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void);
+#endif
+
+#ifndef GLX_SGIX_video_source
+#define GLX_SGIX_video_source 1
+#ifdef _VL_H
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern GLXVideoSourceSGIX glXCreateGLXVideoSourceSGIX (Display *, int, VLServer, VLPath, int, VLNode);
+extern void glXDestroyGLXVideoSourceSGIX (Display *, GLXVideoSourceSGIX);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef GLXVideoSourceSGIX ( * PFNGLXCREATEGLXVIDEOSOURCESGIXPROC) (Display *display, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode);
+typedef void ( * PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC) (Display *dpy, GLXVideoSourceSGIX glxvideosource);
+#endif /* _VL_H */
+#endif
+
+#ifndef GLX_EXT_visual_rating
+#define GLX_EXT_visual_rating 1
+#endif
+
+#ifndef GLX_EXT_import_context
+#define GLX_EXT_import_context 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Display * glXGetCurrentDisplayEXT (void);
+extern int glXQueryContextInfoEXT (Display *, GLXContext, int, int *);
+extern GLXContextID glXGetContextIDEXT (const GLXContext);
+extern GLXContext glXImportContextEXT (Display *, GLXContextID);
+extern void glXFreeContextEXT (Display *, GLXContext);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef Display * ( * PFNGLXGETCURRENTDISPLAYEXTPROC) (void);
+typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display *dpy, GLXContext context, int attribute, int *value);
+typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context);
+typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display *dpy, GLXContextID contextID);
+typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display *dpy, GLXContext context);
+#endif
+
+#ifndef GLX_SGIX_fbconfig
+#define GLX_SGIX_fbconfig 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern int glXGetFBConfigAttribSGIX (Display *, GLXFBConfigSGIX, int, int *);
+extern GLXFBConfigSGIX * glXChooseFBConfigSGIX (Display *, int, int *, int *);
+extern GLXPixmap glXCreateGLXPixmapWithConfigSGIX (Display *, GLXFBConfigSGIX, Pixmap);
+extern GLXContext glXCreateContextWithConfigSGIX (Display *, GLXFBConfigSGIX, int, GLXContext, Bool);
+extern XVisualInfo * glXGetVisualFromFBConfigSGIX (Display *, GLXFBConfigSGIX);
+extern GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX (Display *, XVisualInfo *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value);
+typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements);
+typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap);
+typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct);
+typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config);
+typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display *dpy, XVisualInfo *vis);
+#endif
+
+#ifndef GLX_SGIX_pbuffer
+#define GLX_SGIX_pbuffer 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern GLXPbufferSGIX glXCreateGLXPbufferSGIX (Display *, GLXFBConfigSGIX, unsigned int, unsigned int, int *);
+extern void glXDestroyGLXPbufferSGIX (Display *, GLXPbufferSGIX);
+extern int glXQueryGLXPbufferSGIX (Display *, GLXPbufferSGIX, int, unsigned int *);
+extern void glXSelectEventSGIX (Display *, GLXDrawable, unsigned long);
+extern void glXGetSelectedEventSGIX (Display *, GLXDrawable, unsigned long *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef GLXPbufferSGIX ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list);
+typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf);
+typedef int ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value);
+typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long mask);
+typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display *dpy, GLXDrawable drawable, unsigned long *mask);
+#endif
+
+#ifndef GLX_SGI_cushion
+#define GLX_SGI_cushion 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern void glXCushionSGI (Display *, Window, float);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef void ( * PFNGLXCUSHIONSGIPROC) (Display *dpy, Window window, float cushion);
+#endif
+
+#ifndef GLX_SGIX_video_resize
+#define GLX_SGIX_video_resize 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern int glXBindChannelToWindowSGIX (Display *, int, int, Window);
+extern int glXChannelRectSGIX (Display *, int, int, int, int, int, int);
+extern int glXQueryChannelRectSGIX (Display *, int, int, int *, int *, int *, int *);
+extern int glXQueryChannelDeltasSGIX (Display *, int, int, int *, int *, int *, int *);
+extern int glXChannelRectSyncSGIX (Display *, int, int, GLenum);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display *display, int screen, int channel, Window window);
+typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int x, int y, int w, int h);
+typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display *display, int screen, int channel, int *dx, int *dy, int *dw, int *dh);
+typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display *display, int screen, int channel, int *x, int *y, int *w, int *h);
+typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display *display, int screen, int channel, GLenum synctype);
+#endif
+
+#ifndef GLX_SGIX_dmbuffer
+#define GLX_SGIX_dmbuffer 1
+#ifdef _DM_BUFFER_H_
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Bool glXAssociateDMPbufferSGIX (Display *, GLXPbufferSGIX, DMparams *, DMbuffer);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef Bool ( * PFNGLXASSOCIATEDMPBUFFERSGIXPROC) (Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer);
+#endif /* _DM_BUFFER_H_ */
+#endif
+
+#ifndef GLX_SGIX_swap_group
+#define GLX_SGIX_swap_group 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern void glXJoinSwapGroupSGIX (Display *, GLXDrawable, GLXDrawable);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member);
+#endif
+
+#ifndef GLX_SGIX_swap_barrier
+#define GLX_SGIX_swap_barrier 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern void glXBindSwapBarrierSGIX (Display *, GLXDrawable, int);
+extern Bool glXQueryMaxSwapBarriersSGIX (Display *, int, int *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier);
+typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max);
+#endif
+
+#ifndef GLX_SUN_get_transparent_index
+#define GLX_SUN_get_transparent_index 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Status glXGetTransparentIndexSUN (Display *, Window, Window, long *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display *dpy, Window overlay, Window underlay, long *pTransparentIndex);
+#endif
+
+#ifndef GLX_MESA_copy_sub_buffer
+#define GLX_MESA_copy_sub_buffer 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern void glXCopySubBufferMESA (Display *, GLXDrawable, int, int, int, int);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display *dpy, GLXDrawable drawable, int x, int y, int width, int height);
+#endif
+
+#ifndef GLX_MESA_pixmap_colormap
+#define GLX_MESA_pixmap_colormap 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern GLXPixmap glXCreateGLXPixmapMESA (Display *, XVisualInfo *, Pixmap, Colormap);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display *dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap);
+#endif
+
+#ifndef GLX_MESA_release_buffers
+#define GLX_MESA_release_buffers 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Bool glXReleaseBuffersMESA (Display *, GLXDrawable);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display *dpy, GLXDrawable drawable);
+#endif
+
+#ifndef GLX_MESA_set_3dfx_mode
+#define GLX_MESA_set_3dfx_mode 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Bool glXSet3DfxModeMESA (int);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef Bool ( * PFNGLXSET3DFXMODEMESAPROC) (int mode);
+#endif
+
+#ifndef GLX_SGIX_visual_select_group
+#define GLX_SGIX_visual_select_group 1
+#endif
+
+#ifndef GLX_OML_swap_method
+#define GLX_OML_swap_method 1
+#endif
+
+#ifndef GLX_OML_sync_control
+#define GLX_OML_sync_control 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Bool glXGetSyncValuesOML (Display *, GLXDrawable, int64_t *, int64_t *, int64_t *);
+extern Bool glXGetMscRateOML (Display *, GLXDrawable, int32_t *, int32_t *);
+extern int64_t glXSwapBuffersMscOML (Display *, GLXDrawable, int64_t, int64_t, int64_t);
+extern Bool glXWaitForMscOML (Display *, GLXDrawable, int64_t, int64_t, int64_t, int64_t *, int64_t *, int64_t *);
+extern Bool glXWaitForSbcOML (Display *, GLXDrawable, int64_t, int64_t *, int64_t *, int64_t *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t *ust, int64_t *msc, int64_t *sbc);
+typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display *dpy, GLXDrawable drawable, int32_t *numerator, int32_t *denominator);
+typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);
+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);
+typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display *dpy, GLXDrawable drawable, int64_t target_sbc, int64_t *ust, int64_t *msc, int64_t *sbc);
+#endif
+
+#ifndef GLX_NV_float_buffer
+#define GLX_NV_float_buffer 1
+#endif
+
+#ifndef GLX_SGIX_hyperpipe
+#define GLX_SGIX_hyperpipe 1
+
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int networkId;
+} GLXHyperpipeNetworkSGIX;
+
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int channel;
+ unsigned int
+ participationType;
+ int timeSlice;
+} GLXHyperpipeConfigSGIX;
+
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int srcXOrigin, srcYOrigin, srcWidth, srcHeight;
+ int destXOrigin, destYOrigin, destWidth, destHeight;
+} GLXPipeRect;
+
+typedef struct {
+ char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];
+ int XOrigin, YOrigin, maxHeight, maxWidth;
+} GLXPipeRectLimits;
+
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern GLXHyperpipeNetworkSGIX * glXQueryHyperpipeNetworkSGIX (Display *, int *);
+extern int glXHyperpipeConfigSGIX (Display *, int, int, GLXHyperpipeConfigSGIX *, int *);
+extern GLXHyperpipeConfigSGIX * glXQueryHyperpipeConfigSGIX (Display *, int, int *);
+extern int glXDestroyHyperpipeConfigSGIX (Display *, int);
+extern int glXBindHyperpipeSGIX (Display *, int);
+extern int glXQueryHyperpipeBestAttribSGIX (Display *, int, int, int, void *, void *);
+extern int glXHyperpipeAttribSGIX (Display *, int, int, int, void *);
+extern int glXQueryHyperpipeAttribSGIX (Display *, int, int, int, void *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes);
+typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId);
+typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes);
+typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId);
+typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId);
+typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList);
+typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList);
+typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList);
+#endif
+
+#ifndef GLX_MESA_agp_offset
+#define GLX_MESA_agp_offset 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern unsigned int glXGetAGPOffsetMESA (const void *);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void *pointer);
+#endif
+
+/*
+ * GLX_NV_vertex_array_range is not a real extension name...
+ */
+#ifndef GLX_NV_vertex_array_range
+#define GLX_NV_vertex_array_range 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern void *glXAllocateMemoryNV(GLsizei size, GLfloat readfreq,
+ GLfloat writefreq, GLfloat priority);
+
+extern void glXFreeMemoryNV(GLvoid *pointer);
+#endif
+typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size,
+ GLfloat readfreq,
+ GLfloat writefreq,
+ GLfloat priority);
+
+typedef void ( * PFNGLXFREEMEMORYNVPROC) (GLvoid *pointer);
+#endif
+
+#ifndef GLX_NV_swap_group
+#define GLX_NV_swap_group 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern Bool glXJoinSwapGroupNV(Display *dpy, GLXDrawable drawable,
+ GLuint group);
+
+extern Bool glXBindSwapBarrierNV(Display *dpy, GLuint group, GLuint barrier);
+
+extern Bool glXQuerySwapGroupNV(Display *dpy, GLXDrawable drawable,
+ GLuint *group, GLuint *barrier);
+
+extern Bool glXQueryMaxSwapGroupsNV(Display *dpy, int screen,
+ GLuint *maxGroups, GLuint *maxBarriers);
+
+extern Bool glXQueryFrameCountNV(Display *dpy, int screen, GLuint *count);
+
+extern Bool glXResetFrameCountNV(Display *dpy, int screen);
+#endif
+typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display *dpy,
+ GLXDrawable drawable,
+ GLuint group);
+
+typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display *dpy,
+ GLuint group,
+ GLuint barrier);
+
+typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display *dpy,
+ GLXDrawable drawable,
+ GLuint *group,
+ GLuint *barrier);
+
+typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display *dpy,
+ int screen,
+ GLuint *maxGroups,
+ GLuint *maxBarriers);
+
+typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display *dpy,
+ int screen,
+ GLuint *count);
+
+typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display *dpy, int screen);
+#endif
+
+#ifndef GLX_NV_video_out
+#define GLX_NV_video_out 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern int glXGetVideoDeviceNV(Display *dpy, int screen, int numVideoDevices,
+ GLXVideoDeviceNV *pVideoDevice);
+
+extern int glXReleaseVideoDeviceNV(Display *dpy, int screen,
+ GLXVideoDeviceNV VideoDevice);
+
+extern int glXBindVideoImageNV(Display *dpy, GLXVideoDeviceNV VideoDevice,
+ GLXPbuffer pbuf, int iVideoBuffer);
+
+extern int glXReleaseVideoImageNV(Display *dpy, GLXPbuffer pbuf);
+
+extern int glXSendPbufferToVideoNV(Display *dpy, GLXPbuffer pbuf,
+ int iBufferType,
+ unsigned long *pulCounterPbuffer,
+ GLboolean bBlock);
+
+extern int glXGetVideoInfoNV(Display *dpy, int screen,
+ GLXVideoDeviceNV VideoDevice,
+ unsigned long *pulCounterOutputPbuffer,
+ unsigned long *pulCounterOutputVideo);
+#endif
+typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display *dpy,
+ int screen,
+ int numVideoDevices,
+ GLXVideoDeviceNV *pVideoDevice);
+
+typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display *dpy,
+ int screen,
+ GLXVideoDeviceNV VideoDevice);
+
+typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display *dpy,
+ GLXVideoDeviceNV VideoDevice,
+ GLXPbuffer pbuf,
+ int iVideoBuffer);
+
+typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display *dpy,
+ GLXPbuffer pbuf);
+
+typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display *dpy,
+ GLXPbuffer pbuf,
+ int iBufferType,
+ unsigned long *pulCounterPbuffer,
+ GLboolean bBlock);
+
+typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display *dpy, int screen,
+ GLXVideoDeviceNV VideoDevice,
+ unsigned long *pulCounterOutputPbuffer,
+ unsigned long *pulCounterOutputVideo);
+#endif
+
+#ifndef GLX_EXT_fbconfig_packed_float
+#define GLX_EXT_fbconfig_packed_float 1
+#endif
+
+#ifndef GLX_EXT_framebuffer_sRGB
+#define GLX_EXT_framebuffer_sRGB 1
+#endif
+
+#ifndef GLX_EXT_texture_from_pixmap
+#define GLX_EXT_texture_from_pixmap
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern void glXBindTexImageEXT(Display *dpy, GLXDrawable drawable,
+ int buffer, const int *attrib_list);
+extern void glXReleaseTexImageEXT(Display *dpy, GLXDrawable drawable,
+ int buffer);
+#endif
+typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display *dpy,
+ GLXDrawable drawable,
+ int buffer,
+ const int *attrib_list);
+typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display *dpy,
+ GLXDrawable drawable,
+ int buffer);
+#endif
+
+#ifndef GLX_NV_present_video
+#define GLX_NV_present_video
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern unsigned int *glXEnumerateVideoDevicesNV(Display *dpy,
+ int screen,
+ int *nelements);
+extern int glXBindVideoDeviceNV(Display *dpy,
+ unsigned int video_slot,
+ unsigned int video_device,
+ const int *attrib_list);
+#endif
+typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy,
+ int screen,
+ int *nelements);
+typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display *dpy,
+ unsigned int video_slot,
+ unsigned int video_device,
+ const int *attrib_list);
+#endif
+
+#ifndef GLX_NV_multisample_coverage
+#define GLX_NV_multisample_coverage 1
+#endif
+
+#ifndef GLX_NV_video_capture
+#define GLX_NV_video_capture
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern GLXVideoCaptureDeviceNV*
+ glXEnumerateVideoCaptureDevicesNV(Display *dpy,
+ int screen,
+ int *nelements);
+extern void glXLockVideoCaptureDeviceNV(Display *dpy,
+ GLXVideoCaptureDeviceNV device);
+extern void glXReleaseVideoCaptureDeviceNV(Display *dpy,
+ GLXVideoCaptureDeviceNV device);
+extern int glXBindVideoCaptureDeviceNV(Display *dpy,
+ unsigned int video_capture_slot,
+ GLXVideoCaptureDeviceNV device);
+extern int glXQueryVideoCaptureDeviceNV(Display *dpy,
+ GLXVideoCaptureDeviceNV device,
+ int attribute,
+ int *value);
+#endif
+typedef GLXVideoCaptureDeviceNV* ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)
+ (Display *dpy,
+ int screen,
+ int *nelements);
+typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)
+ (Display *dpy,
+ GLXVideoCaptureDeviceNV device);
+
+typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)
+ (Display *dpy,
+ GLXVideoCaptureDeviceNV device);
+typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)
+ (Display *dpy,
+ unsigned int video_capture_slot,
+ GLXVideoCaptureDeviceNV device);
+typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)
+ (Display *dpy,
+ GLXVideoCaptureDeviceNV device,
+ int attribute,
+ int *value);
+#endif
+
+#ifndef GLX_NV_copy_image
+#define GLX_NV_copy_image 1
+#ifdef GLX_GLXEXT_PROTOTYPES
+extern void glXCopyImageSubDataNV (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);
+#endif /* GLX_GLXEXT_PROTOTYPES */
+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);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/nvogldebug.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/nvogldebug.h
new file mode 100644
index 0000000..10e43b4
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/nvogldebug.h
@@ -0,0 +1,794 @@
+/****************************************************************************
+**
+** Copyright (C) 2005 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+* This file defines the "__NvOglDebugConfig" and NVX_debug_control interfaces.
+* Its purpose is to aid debugging and development by providing a simple way for
+* applications to control global "debug variables" in the driver.
+*/
+
+#ifndef __nvogldebug_h_
+#define __nvogldebug_h_
+
+// An OpenGL implementation can have combinations of internal driver
+// and hardware state that are difficult to achieve by clever use of
+// the extended OpenGL API alone. This extension provides for
+// arbitrary modifications to driver state and behavior at runtime.
+// The exact driver behaviors that can be modified are not specified
+// here, but may be specified by layered extensions.
+
+typedef enum __GLdebugControlFunctionEnum {
+ GL_DEBUG_CONTROL_FUNCTION_IS_SUPPORTED_NVX = 10,
+ GL_DEBUG_CONTROL_FUNCTION_EVICT_OBJECT_NVX = 11,
+ GL_DEBUG_CONTROL_FUNCTION_GET_BUGFIX_PRESENT = 12,
+ GL_DEBUG_CONTROL_FUNCTION_ENABLES = 13,
+ GL_DEBUG_CONTROL_FUNCTION_DETECT_FALLBACK = 14,
+ GL_DEBUG_CONTROL_FUNCTION_CLAW = 15,
+ GL_DEBUG_CONTROL_FUNCTION_GET_STATISTIC = 16,
+ GL_DEBUG_CONTROL_FUNCTION_DO_QUADRO_SLOWDOWN = 17,
+ GL_DEBUG_CONTROL_FUNCTION_BUFFER_OBJECT = 18,
+ GL_DEBUG_CONTROL_FUNCTION_GET_CAPS = 19,
+ GL_DEBUG_CONTROL_FUNCTION_DO_QUADRO_SLOWDOWN_US = 20,
+ GL_DEBUG_CONTROL_FUNCTION_GET_GENERIC_STATISTIC = 21,
+ GL_DEBUG_CONTROL_FUNCTION_INJECT_RC_ERROR = 22,
+ GL_DEBUG_CONTROL_FUNCTION_FORCE_MEMSTRATEGY = 23,
+ GL_DEBUG_CONTROL_FUNCTION_QUERY_APPDB = 24,
+ GL_DEBUG_CONTROL_FUNCTION_SEND_3D_METHOD = 25,
+ GL_DEBUG_CONTROL_FUNCTION_GL_VERSION_3_2 = 26,
+ GL_DEBUG_CONTROL_FUNCTION_SET_CYCLESTATS_STATE = 27,
+ GL_DEBUG_CONTROL_FUNCTION_WWMP = 28,
+ GL_DEBUG_CONTROL_FUNCTION_SET_STATE_OBJECT_GPU = 29,
+ GL_DEBUG_CONTROL_FUNCTION_NVOGTEST_TEST_START = 30,
+ GL_DEBUG_CONTROL_FUNCTION_DUAL_CORE = 31,
+ GL_DEBUG_CONTROL_FUNCTION_THREADING_OPTIMIZATIONS = 32,
+ GL_DEBUG_CONTROL_FUNCTION_NX6PLUSMODE_FORCE_SYNC = 33,
+ GL_DEBUG_CONTROL_FUNCTION_LOOP_ENHANCE = 34,
+ GL_DEBUG_CONTROL_FUNCTION_APICOGL = 35,
+ GL_DEBUG_CONTROL_FUNCTION_GET_GPU_ADDRESS = 36,
+ GL_DEBUG_CONTROL_FUNCTION_EXTRA_CGC_OPTIONS = 37,
+ GL_DEBUG_CONTROL_FUNCTION_ES2_READ_BUFFER_AUTO_STEREO = 38,
+ GL_DEBUG_CONTROL_FUNCTION_ES2_SET_STEREO_PARAMS = 39,
+ GL_DEBUG_CONTROL_FUNCTION_ES2_DISK_CACHE_ENABLE = 40,
+ GL_DEBUG_CONTROL_FUNCTION_INDEX_REORDERING_CONFIG = 41,
+ GL_DEBUG_CONTROL_FUNCTION_INDEX_REORDERING_STATS = 42,
+} __GLdebugControlFunction;
+
+typedef struct __GLdebugControlIsSupportedRec {
+ __GLdebugControlFunction function; // [IN]
+ GLboolean isSupported; // [OUT]
+} __GLdebugControlIsSupported;
+
+typedef struct __GLdebugControlEvictObjectRec {
+ GLuint objType; // [IN]
+ GLuint id; // [IN]
+} __GLdebugControlEvictObject;
+
+typedef enum {
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_393272 = 1, // memhdrs not locked properly on download/eviction
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_LAYERED_CLEAR_PUSHBUFFER_OVERFLOW = 2,
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_395052 = 3, // xfb falls back when raster disabled
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_399272 = 4, // geometry program output size hardware bug
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_391451 = 5, // xfb can't capture layer
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_389986 = 6, // invalid shader uniform array element being updated
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_393139 = 7, // General Vista fixes, especially multi-threading related
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_412399 = 8, // ZCull GL_NEVER bug.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_369989 = 9, // update internal bindings in PopClientAttribs()
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_424295 = 10, // CopyTexImage path crashed when reading from a source with S8D24 internal buffer but no stencil image bound
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_429286 = 11, // __glGenerateMipmaps copies texture level specification correctly
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_426399 = 12, // ActiveTexture produces GL_INVALID_ENUM, not GL_INVALID_OPERATION for invalid textures
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_431407 = 13, // CopyTexSubImage crashed when the texture was not initialized
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_438799 = 14, // NP2 texture base_level bugs.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_440068 = 15, // AA pbuffers incorrectly swapped
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_441074 = 16, // GetRenderbufferParameteriv returns 0 for STENCIL_SIZE
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_416094 = 17, // corruption in primitive restart
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_462805 = 18, // wrong memspace for PBO texsubimage
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_468172 = 19, // DSA uniform calls crash with invalid program ID
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_469086 = 20, // VBO pulling of an edge flag array crashes
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_MAP_BUFFER_RANGE = 21, // Assorted MBR bugs from first implementation
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_466357 = 22, // UINT variable modifier is supported
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_455345 = 23, // Texture API target mismatch bug (tested by tex_match nvogtest)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_306875 = 24, // Erroneous in-band updates to constant buffers (PaBO)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_480517 = 25, // glMatrixMode returns GL_INVALID_OPERATION when active texture is out of range
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_482923 = 26, // Bufferobject counter normalization bug
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_445457 = 27, // Texture array mipmap generation bug
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_489472 = 28, // Shared VBO data store changes not handled
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_458167 = 29, // Dangling gc->buffers.fbo.zeroObject->dp pointer
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_SHADEBLO_GLSL = 30, // ShadeBLo GLSL support, developed after the extension string was added
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_491100 = 31, // Failing to download missing mip levels when BASE_LEVEL is changed
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_VBUM_CLIENTATTRIB = 32, // Interaction between VBUM and ClientAttribDefault
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_505040 = 33, // Interop counters cleanup
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_502904 = 34, // EXT_texture_swizzle interaction with sRGB
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_502904_VTG = 35, // Vertex/Tess/Geometry program EXT_texture_swizzle interaction with sRGB
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_TEX_MAXSIZE_BDR = 36, // cubemap and array textures don't handle border properly
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_489261 = 37, // Unbind a VBO from a VAO
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_430878 = 38, // Fall out of SFR for a 3D blit
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_MODS_CLIPID_TEST = 39, // driver has a MODS hack to force the use of clip IDs for basic functional testing (GL_DEBUG_CONTROL_ENABLE_MODS_CLIPID_TEST)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_505040_2 = 40, // changes for state machine of VBO memory allocation strategy (state_init)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_505040_3 = 41, // changes for state machine of VBO memory allocation strategy (state_vid)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_LOD_FP_ONLY = 42, // Only allow the LOD instruction in fragment programs
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_522575 = 43, // Keep track of lockedCount in the mutex table for GL_DEBUG_CONTROL_GET_GENERIC_STATISTIC_MUTEX_WORD
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_515687 = 44, // ARB_texture_rg: GL_RED should be legal GL_DEPTH_TEXTURE_MODE
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_EXPMS_VCAA = 45, // VCAA depth surface can now be fetch by explicit_multisample
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_VBUM_MBR = 46, // MapBufferRange orphan+discard doesn't work with vbum/shadeblo
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_MAPPED_BUFFER_CRASH = 47, // Deleting a context while a buffer is mapped will crash
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_MAPPED_BUFFER_CRASH_NV4X = 48, // Deleting a context while a buffer is mapped will crash (on NV4X)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_NULL_COMPRESSED_TEXIMG = 49, // Allow NULL for glCompressedTexImage*D
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_SHADER_SUBROUTINE_CHANGE = 50, // Change to NV_shader_subroutine API
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_DSA_TOKENHELPER_BUG_560077 = 51,
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_571236 = 52, // Interactions of dualcore, client-state, and deprecation
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_578086 = 53, // Fixes for max attrib fragment programs
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_SEAMLESS_CUBEMAP = 54, // seamless cubemap enum changed
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_GL32_MAX_COMPONENTS_QUERIES = 55, // driver implements new GL3.2 MAX_*_COMPONENTS queries
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_GL32_GETBUFFERPARAMETERI64V = 56, // driver implements missing 64b buffer parameter query
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_576302 = 57,
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_LOADIM_MULTISAMPLE_TEX = 58, // image_load_store converted to use GL3.2 multisample texture syntax
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_VOTE_IMPLEMENTED = 59, // does NV_gpu_program5 code include support for TGALL/TGANY/TGEQ?
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_424330 = 60,
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_ALPHA_CB_FIX = 61, // Set alpha circular buffer size for gf10y
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_GETINTEGER64I_V = 62, // glGetInteger64i_v is present.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_2DMSARRAY_RENAMED = 63, // Assembly token 2DMSARRAY has been renamed to ARRAY2DMS
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_607673 = 64, // Assembler properly rejects POPA with a CC mask
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_599222 = 65, // Disabled vbo slots are still remembered across context switches.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_TEXBO_GETTEXLEVELPARAM = 66, // Support gettexlevelparameter on buffer textures
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_618201 = 67, // Subsequent VBO ArrayElement calls with different enables cause crash
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_INT64_DIV_MOD = 68, // Supports 64 bit integer DIV and MOD instructions
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_635764 = 69, // Draw without attrib 0 enabled
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_PIXELPATH_PACKED_PIXELS = 71, // support for packed pixel types in the pixel path, part of ARB_texture_rgb10_a2ui
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BEGINQUERYINDEXED = 72, // XFB3 change from using separate query targets to using indexed query targets
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_INDEXED_TXWAR = 73, // Support texture format WAR on indexed texture
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_SHADER_SUBROUTINE_CHANGE2 = 74,// Further shader subroutine changes
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_FRAGMENT_SMID = 75, // Supports the "fragment.smid" binding for MODS (bug 663067).
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BIND_SAMPLER_UINT = 76, // ARB_sampler_objects' BindSampler implementation accepts a uint (bug 668718).
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_MISC_GL33_GL40_FIXES = 77, // Contains fixes for miscellaneous OpenGL 3.3/4.0 impl. bugs
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_663779 = 78, // Support IPA instruction on FPOS attribute
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_368610 = 79, // Sharing FBOs between display connections and closing owning connection
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_674780 = 80, // Driver does not crash when given negative values for sampler texture indices
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_681447 = 81, // glGetIntegerv() support for GL_COPY_READ_BUFFER and GL_COPY_WRITE_BUFFER
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_SUBROUTINE_QUERY_CRASH = 82, // querying information about compatible subroutines from an unbound program crashes
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_IPA_FOGCOORD = 83, // Support IPA instruction on fogcoord
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_710489 = 84, // DSA + VAO fixes, mostly for glGetVertexArrayIntegeri_vEXT
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_PPO_FIXES = 85, // Deleting a bound user pipeline updates properly and bindprogrampipeline updates active programs
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_676759 = 86, // Linker fixes for uniform arrays with 64-bit components.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_741073 = 87, // Linker handles Cg bug in handling matrix uniform arrays where only the last element is used.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_664244 = 88, // Problems with arrays of GLSL subroutine uniforms, crashes on R256 x64
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_744350 = 89, // Problems with FL-predicated subroutine calls
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_751609 = 90, // Crash can occur when doing too many CE operations back-to-back.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_728033 = 91, // New format support for cuda interop has been added to R270 and above.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_762723 = 92, // UBO only allows 12 bindings
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_763409 = 93, // Supports DX11 - OGL interop, R270 and above.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_747891 = 94, // Errors during GLX context creation can cause a hang without this fix.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_758921 = 95, // ClientAttribDefault resets the primitive restart state.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_762974 = 96, // Bad interaction of UBO and EXT_bindable_uniform in the same program.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_779707 = 97, // BPTC textures don't require CompressedSubImage3D on 4 block boundaries
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_746642 = 98, // Addresses returned by VBUM are made virtual to allow modeswitching with XP
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_790472 = 99, // Querying GLSL uniform array names returns "foo[0]" and UBO uniforms return locations of -1
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_792522 = 100, // Fix issue with aa downsample of fbo with mixed dimensions attachments
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_796862 = 101, // Context creation of version 1.0 should result in latest OpenGL version
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_625498 = 102, // Fix dual-core issue with glCallLists (see dlist_hell nvogtest)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_809142 = 103, // Incorrect restore of the program binary refcount causes memory leak
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_800902 = 104, // X crashes when making current to GLX window whose X window is gone
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_362397 = 105, // DivByZero expection when a Buffer attached to a texbo is resized to less than 1px.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_826092 = 106, // GL_ARB_pixel_buffer_object: check if GL errors are correctly set
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_822935 = 107, // LoopEnhance nvogtest support
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_857702 = 108, // driver good enough to handle glsl_ils_fmt* tests
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_845118 = 109, // Need to look at read drawable during read fbo validation
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_856656 = 110, // no known compiler exceptions on glsl_ils_misc* (can run test)
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_852161 = 111, // glMaterial doesn't update GLSL material built-in inside dlist
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_860989 = 112, // program tracking bits not updated by glPopAttrib
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_870498 = 113, // If drawbuffer settings do not match FBO attachment causes a crash
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_876641 = 114, // crash binding the same FBO to two threads simultaneously
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_879671 = 115, // drawElementsInstanced might crash if we copy not enabled vertex data
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_906242 = 116, // glFramebufferTexture and friends are not setting a GL error when the <texture> argument is zero
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_909200 = 117, // assembly CBUFFER and BUFFER4 arrays are sized with correct units
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_918415 = 118, // glMakeBufferNonResidentNV doesn't ensure the buffer is resident before doing its business
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_874617 = 119, // Fix for use-after-delete using FBO
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_920825 = 120, // Fix crash on calling glReadPixels with invalid parameters
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_930245 = 121, // Fix crash on calling glGetBufferPointervOES if buffer object name 0 is bound to target
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_930248 = 122, // Fix crash on glCopyTexSubImage3DOES when x or y is negative value
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_930253 = 123, // Fix crash on glDrawBuffersNV when <bufs> is NULL
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_930290 = 124, // call to glEGLImageTargetTexture2DOES when texture target is 0 excutes without error
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_934987 = 125, // Properly round non-antialiased line widths
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_874933 = 126, // LDDM non-CUDA-interop buffers allocated within CUDA reserved address range
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_936396 = 127, // Linux: Damage events are not generated on parents of GL drawables when GL drawable is created after the Damage object
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_882002 = 128, // Fix mip-mapped compressed NPOT texture's edges
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_937411 = 129, // Fix issues with drawElementeInstanced path and usage of vertex attrib divisor
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_940255 = 130, // Fix crash on querying EGL_STEREO_LAYOUT_NVX surface attribute value using eglQuerySurface
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_945327 = 131, // Fixed MT event and thread handle leaks
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_IS_OBJECT = 132, // The IsObject routines behave correct in that they return FALSE until first bind
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_953084 = 133, // Fix texture completeness check for EGLImage creation
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_960878 = 134, // NV_path_rendering is broken when programmable shaders are in use
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_874652 = 135, // [Cg/AR20] Illegit shader compiles without error: Illegit unreferenced function does not fail to compile
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_952196 = 136, // [Cg/AR20] Assert in vertex shader compilation when same attribute is assigned to multiple varyings
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_968228 = 137, // Default state for UNIFORM_BUFFER_{START,SIZE} is fixed to 0, instead of original -1.
+ GL_DEBUG_CONTROL_GET_BUGFIX_PRESENT_BUG_968768 = 138, // Early Z logic is broken for stencil func GL_NEVER
+} __GLdebugControlGetBugfixPresentEnum;
+
+typedef struct __GLdebugControlGetBugfixPresentRec {
+ __GLdebugControlGetBugfixPresentEnum bugfix; // [IN]
+ GLboolean isSupported; // [OUT]
+} __GLdebugControlGetBugfixPresent;
+
+typedef enum {
+ GL_DEBUG_CONTROL_ENABLE_AGGRESSIVE_EVICTION = 1,
+ GL_DEBUG_CONTROL_ENABLE_MODS_CLIPID_TEST = 2,
+ GL_DEBUG_CONTROL_ENABLE_WSPERF_PUSH = 3,
+ GL_DEBUG_CONTROL_ENABLE_WSPERF_POP = 4,
+ GL_DEBUG_CONTROL_ENABLE_WSPERF_REINIT_GC = 5, // Required before changes take affect
+ GL_DEBUG_CONTROL_ENABLE_WS_VARRAY = 6,
+ GL_DEBUG_CONTROL_ENABLE_SDDR = 7,
+ GL_DEBUG_CONTROL_ENABLE_SDSR = 8,
+ GL_DEBUG_CONTROL_ENABLE_LAZY_VBUM = 9,
+ GL_DEBUG_CONTROL_ENABLE_LOOP_ENHANCE = 10,
+ GL_DEBUG_CONTROL_ENABLE_VAB_IMMEDIATE_MODE = 11,
+ GL_DEBUG_CONTROL_ENABLE_VAB_VERTEXARRAY = 12,
+ GL_DEBUG_CONTROL_ENABLE_CLAW = 13,
+} __GLdebugControlEnableEnum;
+
+// may return an error if the enable isn't supported
+typedef struct __GLdebugControlEnablesRec {
+ __GLdebugControlEnableEnum cap; // [IN]
+ GLboolean enable; // [IN]
+ GLboolean success; // [OUT]
+} __GLdebugControlEnables;
+
+typedef enum {
+ GL_DEBUG_CONTROL_DETECT_FALLBACK_SOFTWARE_VALIDATE = 1,
+} __GLdebugControlDetectFallbackType;
+
+typedef struct __GLdebugControlDetectFallbackRec {
+ // If a fallback of the specified type has occurred since the last reset,
+ // this operation returns GL_TRUE in <result>. If <reset> is GL_TRUE, the
+ // fallback flag will be reset.
+ __GLdebugControlDetectFallbackType type; // [IN]
+ GLboolean reset; // [IN]
+ GLboolean result; // [OUT]
+} __GLdebugControlDetectFallback;
+
+typedef enum {
+ GL_DEBUG_CONTROL_DUAL_CORE_CMD_CHECK_POSSIBLE = 1,
+ GL_DEBUG_CONTROL_DUAL_CORE_CMD_CURRENT_MODE,
+ GL_DEBUG_CONTROL_DUAL_CORE_CMD_ENTER,
+ GL_DEBUG_CONTROL_DUAL_CORE_CMD_LEAVE
+} __GLdebugControlDualCoreCmd;
+
+typedef struct __GLdebugControlDualCoreRec {
+ int size; // [IN] size of this struct; the cmd is ignored if there is a size mismatch
+ __GLdebugControlDualCoreCmd cmd; // [IN]
+ GLint arg1; // [IN]
+ GLint result; // [OUT]
+ GLint success; // [OUT]
+} __GLdebugControlDualCore;
+
+
+typedef enum {
+ GL_DEBUG_CONTROL_LE_INIT,
+ GL_DEBUG_CONTROL_LE_GET_LOOP,
+ GL_DEBUG_CONTROL_LE_CHECK_LOOP,
+ GL_DEBUG_CONTROL_LE_RESET_LOOP,
+ GL_DEBUG_CONTROL_LE_DESTROY
+} __GLdebugControlLEcmd;
+
+typedef enum {
+ GL_DEBUG_CONTROL_LE_SUCCESS,
+ GL_DEBUG_CONTROL_LE_LOOP_REPLACED,
+ GL_DEBUG_CONTROL_LE_NO_MORE_AVAILABLE, // indicates no more loops or applicatiosns available
+ GL_DEBUG_CONTROL_LE_FAIL,
+ GL_DEBUG_CONTROL_LE_FAIL_DUE_TO_OGL32,
+ GL_DEBUG_CONTROL_LE_FAIL_STRUCT_MISMATCH,
+} __GLdebugControlLEreturnCodes;
+
+
+typedef struct __GLdebugControlLERec {
+ __GLdebugControlLEcmd cmd; // [IN]
+ int structSize; // [IN]
+ __GLdebugControlLEreturnCodes result; // [OUT]
+ union {
+ struct {
+ int appNumber; // [IN]
+ } init;
+ struct {
+ int loopNumber; // [IN]
+ void *pFunction; // [OUT]
+ GLboolean color; // [OUT]
+ GLboolean texture; // [OUT]
+ GLboolean index; // [OUT]
+ } getLoop;
+ } u;
+} __GLdebugControlLE;
+
+
+typedef struct __GLdebugControlApicOglRec {
+ void (*callbackProcDrawArrays)(void* basePtr, const GLint *first, const GLsizei *count, GLsizei primcount); // [IN]
+} __GLdebugControlApicOgl;
+
+typedef enum {
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_DISABLE_ALL = 1,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_GET_GLSL_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_SET_GLSL_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_GET_VIEWPORT_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_SET_VIEWPORT_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_GET_MATRIX_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_SET_MATRIX_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_GET_GLSTATE_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_SET_GLSTATE_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_GET_FB_STATUS_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_SET_FB_STATUS_CACHE,
+ GL_DEBUG_CONTROL_THREADING_OPT_CMD_ENABLE_ALL = 0x0000FFFF,
+} __GLdebugControlThreadingOptimizationsCmd;
+
+typedef struct __GLdebugControlThreadingOptimizationsRec {
+ int size; // [IN] size of this struct; the cmd is ignored if there is a size mismatch
+ __GLdebugControlThreadingOptimizationsCmd cmd; // [IN]
+ GLint arg1; // [IN]
+ GLint result; // [OUT]
+ GLint success; // [OUT]
+} __GLdebugControlThreadingOptimizations;
+
+typedef enum {
+ GL_DEBUG_CONTROL_CLAW_CMD_RESET = 1,
+ GL_DEBUG_CONTROL_CLAW_CMD_GET_ENABLES,
+ GL_DEBUG_CONTROL_CLAW_CMD_SET_ENABLES_AND_RESET,
+ GL_DEBUG_CONTROL_CLAW_CMD_DISALLOW,
+ GL_DEBUG_CONTROL_CLAW_CMD_SET_OVERRIDE_ENABLES_AND_RESET,
+} __GLdebugControlClawCmd;
+
+typedef struct __GLdebugControlClawRec {
+ int size; // [IN] size of this struct; the cmd is ignored if there is a size mismatch
+ __GLdebugControlClawCmd cmd; // [IN]
+ GLint arg1; // [IN]
+ GLint result; // [OUT]
+ GLint error; // [OUT]
+} __GLdebugControlClaw;
+
+typedef enum {
+ // nvogtest test tagging
+ GL_DEBUG_CONTROL_GET_GENERIC_STATISTIC_TAG_TEST = 0,
+ GL_DEBUG_CONTROL_GET_GENERIC_STATISTIC_MUTEX_WORD = 1,
+} __GLdebugControlGetGenericStatisticType;
+
+typedef struct __GLdebugControlGetGenericStatisticRec {
+ // If a fallback of the specified type has occurred since the last reset,
+ // this operation returns GL_TRUE in <result>. If <reset> is GL_TRUE, the
+ // fallback flag will be reset. If the driver understands the type, <success>
+ // will be set to GL_TRUE, GL_FALSE otherwise.
+ __GLdebugControlGetGenericStatisticType type; // [IN]
+ GLboolean reset; // [IN]
+ GLboolean success; // [OUT]
+ unsigned int result; // [OUT]
+} __GLdebugControlGetGenericStatistic;
+
+typedef enum {
+ // for blits (copypixels, drawpixels, readpixels, pbo teximage, copyteximage),
+ // report which path performed the blit. Also count number of shaders
+ // replaced, and fragment shaders that use constant color rendering.
+ GL_DEBUG_CONTROL_GET_STATISTIC_BLIT_2D = 1,
+ GL_DEBUG_CONTROL_GET_STATISTIC_BLIT_3D = 2,
+ GL_DEBUG_CONTROL_GET_STATISTIC_BLIT_CE = 3,
+ GL_DEBUG_CONTROL_GET_STATISTIC_BLIT_M2M = 4,
+ GL_DEBUG_CONTROL_GET_STATISTIC_SHADER_REPLACEMENT = 5,
+ GL_DEBUG_CONTROL_GET_STATISTIC_CONSTANT_COLOR_RENDERING = 6,
+ GL_DEBUG_CONTROL_GET_STATISTIC_BLIT_3D_PFM = 7, // PixelsFromMemory in 3D class (GK20A+)
+} __GLdebugControlGetStatisticType;
+
+typedef struct __GLdebugControlGetStatisticRec {
+ // If a fallback of the specified type has occurred since the last reset,
+ // this operation returns GL_TRUE in <result>. If <reset> is GL_TRUE, the
+ // fallback flag will be reset.
+ __GLdebugControlGetStatisticType type; // [IN]
+ GLboolean reset; // [IN]
+ unsigned int result; // [OUT]
+} __GLdebugControlGetStatistic;
+
+typedef struct __GLdebugControlDoQuadroSlowdownRec {
+ // Activates a test which will hang if the card is a GeForce.
+ // when used with GL_DEBUG_CONTROL_FUNCTION_DO_QUADRO_SLOWDOWN_US, value used as microseconds
+ // when used with GL_DEBUG_CONTROL_FUNCTION_DO_QUADRO_SLOWDOWN, value used as clock ticks
+ unsigned int value; // [IN]
+} __GLdebugControlDoQuadroSlowdown;
+
+typedef enum {
+ __GL_DEBUG_CONTROL_BUFFER_OBJECT_STATE_INIT,
+ __GL_DEBUG_CONTROL_BUFFER_OBJECT_STATE_STREAM_VID,
+ __GL_DEBUG_CONTROL_BUFFER_OBJECT_STATE_STREAM_SYSHEAP,
+ __GL_DEBUG_CONTROL_BUFFER_OBJECT_STATE_MAP_FOR_READ,
+ __GL_DEBUG_CONTROL_BUFFER_OBJECT_STATE_FALLBACK,
+ __GL_DEBUG_CONTROL_BUFFER_OBJECT_STATE_MIGHT_STALL,
+ __GL_DEBUG_CONTROL_BUFFER_OBJECT_STATE_INTEROP
+} __GLdebugControlBufferObjectState;
+
+typedef enum {
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_GPU_READ_VTX = 0,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_GPU_READ_INDEX,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_GPU_READ_BLIT,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_CPU_READ,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_CPU_WRITE,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_GPU_WRITE_BLIT,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_USER_MAP_AS_UPDATE,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_USER_MAP_AS_READ,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_SYNC_UPDATE_STALL,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_GPU_WRITE_BLIT_NONCOHERENT,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_GPU_HIGH_PRIORITY,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_INTEROP_VIDMEM,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_INTEROP_SYSMEM,
+ __GL_DEBUG_CONTROL_BUFFER_COUNTER_COUNT
+} __GLdebugControlBufferCounter;
+
+typedef enum {
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_INVALID = 0,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_MALLOC,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_SYSHEAP,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_DMA_CACHED,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_DMA_CACHED_NONCOHERENT,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_VID_ONLY,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_VID_PLUS_MALLOC,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_VID_PLUS_SYSHEAP,
+
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_ANY_GPU_PREFER_SYSHEAP,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_ANY_GPU_PREFER_VID,
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_ANY_GPU_PREFER_CACHED,
+
+ __GL_DEBUG_CONTROL_BUFFER_ALLOC_STRATEGY_COUNT,
+} __GLdebugControlBufferAllocStrategy;
+
+typedef enum {
+ GL_DEBUG_CONTROL_BUFFER_OBJECT_SET_STALLING = 1,
+ GL_DEBUG_CONTROL_BUFFER_OBJECT_GET_STATE = 2,
+ GL_DEBUG_CONTROL_BUFFER_OBJECT_HIDE_STALLING = 3,
+ GL_DEBUG_CONTROL_BUFFER_OBJECT_TAP_COUNTER = 4,
+ GL_DEBUG_CONTROL_BUFFER_OBJECT_SET_COUNTER = 5,
+} __GLdebugControlBufferObjectCmd;
+
+typedef struct __GLdebugControlBufferObjectRec {
+ __GLdebugControlBufferObjectCmd cmd; // [IN]
+ unsigned int bit; // [IN]
+ unsigned int inc; // [IN]
+ GLenum target; // [IN]
+ GLboolean hideStalling; // [IN]
+ unsigned int state; // [OUT]
+} __GLdebugControlBufferObject;
+
+typedef enum {
+ GL_DEBUG_CONTROL_INDEX_REORDERING_CONFIG_READ,
+ GL_DEBUG_CONTROL_INDEX_REORDERING_CONFIG_WRITE,
+} __GLdebugControlIndexReorderingConfigCmd;
+
+typedef struct __GLdebugControlIndexReorderingConfigRec {
+ __GLdebugControlIndexReorderingConfigCmd cmd; // [IN]
+ unsigned int enabled;
+ unsigned int minHitCnt;
+ unsigned int minIndCnt;
+ unsigned int synchronous;
+ unsigned int subranges;
+ float margin;
+ float thresholdACMR;
+ unsigned int ignoreThreshold; //Mostly for testing
+ unsigned int forceReorder; //Mostly for testing
+ unsigned int postTransformCacheSize;
+ unsigned int cacheModel;
+} __GLdebugControlIndexReorderingConfig;
+
+typedef struct __GLdebugControlIndexReorderingStatsRec {
+ unsigned int count;
+} __GLdebugControlIndexReorderingStats;
+
+typedef enum {
+ // Capability types to be returned by GL_DEBUG_CONTROL_FUNCTION_GET_CAPS.
+ // The type of <result> depends on the requested capability. The comment
+ // after the type specifies the return type.
+ GL_DEBUG_CONTROL_GET_CAPS_IS_QUADRO = 1, // Out Type: GLboolean
+ GL_DEBUG_CONTROL_GET_CAPS_IS_FORCED_SYSMEM = 2, // Out Type: GLboolean
+ GL_DEBUG_CONTROL_GET_CAPS_HAS_SHADOW_MAPPING_BUG_280195 = 3, // Out Type: GLboolean
+
+ GL_DEBUG_CONTROL_GET_CAPS_HAS_INDEX_LIMIT = 4, // Out Type: GLboolean
+} __GLdebugControlGetCapsType;
+
+typedef struct __GLdebugControlGetCapsRec {
+ // Returns internal data directly from the driver. <success> is set to
+ // GL_TRUE if the operation was successful.
+ // The type of <result> depends upon the capability that is requested.
+ __GLdebugControlGetCapsType type; // [IN]
+ GLboolean success; // [OUT]
+ void* result; // [OUT]
+} __GLdebugControlGetCaps;
+
+typedef enum {
+ GL_DEBUG_CONTROL_INJECT_RC_ERROR_PARSE_ERROR,
+ GL_DEBUG_CONTROL_INJECT_RC_ERROR_DATA_ERROR,
+} __GLdebugControlInjectRcErrorType;
+
+typedef struct __GLdebugControlInjectRcErrorRec {
+ __GLdebugControlInjectRcErrorType type; // [IN]
+ GLboolean success; // [OUT]
+} __GLdebugControlInjectRcError;
+
+typedef struct __GLdebugControlQueryAppdbRec {
+ GLuint *size; // [IN / OUT]
+ GLchar *data; // [OUT, optional]
+} __GLdebugControlQueryAppdb;
+
+// Sends a 3D subchannel method
+// **DO NOT CALL IN CHECKED IN TESTS**
+typedef struct __GLdebugControlSend3DMethod {
+ GLuint method; // [IN]
+ GLuint data; // [IN]
+} __GLdebugControlSend3DMethod;
+
+typedef struct __GLdebugControlSetCycleStatsState {
+ GLuint stateIndex; // [IN]
+ GLuint stateValue; // [IN]
+} __GLdebugControlSetCycleStatsState;
+
+typedef enum {
+ GL_DEBUG_CONTROL_WWMP_INSTALL_SIGNAL_HANDLER,
+ GL_DEBUG_CONTROL_WWMP_ADD_WRITE_WATCH,
+ GL_DEBUG_CONTROL_WWMP_DISABLE,
+ GL_DEBUG_CONTROL_WWMP_GET_STATE,
+} __GLdebugControlWWMPCmd;
+
+typedef struct __GLdebugControlWWMPRec {
+ __GLdebugControlWWMPCmd cmd; // [IN]
+ union {
+ struct {
+ GLboolean result; // [OUT]
+ void* trackAdr; // [IN]
+ volatile GLintptr **watchAdr; // [OUT]
+ volatile GLintptr *watchValue; // [OUT]
+ void** trackDat; // [OUT]
+ GLboolean *isTracked; // [OUT]
+ } addWriteWatch;
+ struct {
+ GLboolean enabled; // [OUT]
+ int sigactionPending; // [OUT]
+ int sigactionInitialized; // [OUT]
+ }getState;
+ } u;
+} __GLdebugControlWWMP;
+
+typedef struct __GLdebugControlSetStateObjectGPURec {
+ GLuint64EXT handle; // [IN]
+ GLint dynamiccount; // [IN]
+ const GLvoid *dynamicprops; // [IN]
+} __GLdebugControlSetStateObjectGPU;
+
+typedef enum {
+ GL_DEBUG_CONTROL_GET_GPU_ADDRESS_BUFFER_OBJECT = 0,
+} __GLdebugControlGetGPUAddressObjectType;
+
+typedef struct __GLdebugControlGetGPUAddressRec {
+ __GLdebugControlGetGPUAddressObjectType objectType; // [IN]
+ GLenum target; // [IN]
+ GLboolean success; // [OUT]
+ GLuint64EXT address; // [OUT]
+ GLuint64EXT size; // [OUT]
+} __GLdebugControlGetGPUAddress;
+
+typedef struct __GLdebugControlExtraCgcOptionsRec {
+ GLuint argc; // [IN]
+ GLchar **argv; // [IN]
+ GLboolean success; // [OUT]
+} __GLdebugControlExtraCgcOptions;
+
+typedef struct __GLdebugControlNvogtestTestStartRec {
+ GLboolean dcWasRestored; // [OUT]
+} __GLdebugControlNvogtestTestStart;
+
+typedef enum {
+ GL_DEBUG_CONTROL_ES2_LEFT_EYE,
+ GL_DEBUG_CONTROL_ES2_RIGHT_EYE,
+} __GLdebugControlES2StereoEye;
+
+typedef struct __GLdebugControlES2ReadBufferAutoStereoRec {
+ GLuint eye; // [IN]
+ GLenum mode; // [IN]
+} __GLdebugControlES2ReadBufferAutoStereo;
+
+typedef struct __GLdebugControlES2SetStereoParamsRec {
+ GLuint control; // 0 => Stereo Disabled, else Enabled
+ GLuint method; // NvGlStereoMethod
+ GLuint changeSep;
+ float separation;
+ float convergence;
+ float cutoff;
+ float cutoffDir;
+ GLuint screenWidth;
+} __GLdebugControlES2SetStereoParams;
+
+typedef struct __GLdebugControlES2DiskCacheCtrl {
+ GLboolean enable;
+ GLuint numEntries;
+ GLuint numHits;
+ GLboolean deleteCachedFiles;
+ GLboolean blobEnable;
+ GLuint numBlobEntries;
+ GLuint numBlobHits;
+} __GLdebugControlES2DiskCacheCtrl;
+
+struct __GLdebugControlParametersRec
+{
+ __GLdebugControlFunction function;
+
+ // Note: This union is only aligned to 4B. Adding a member with a uint64 in it
+ // will cause it to be aligned to 8B and break compatibility.
+ union
+ {
+ __GLdebugControlIsSupported isSupported;
+ __GLdebugControlEvictObject evictObject;
+ __GLdebugControlGetBugfixPresent getBugfixPresent;
+ __GLdebugControlEnables enables;
+ __GLdebugControlDetectFallback detectFallback;
+ __GLdebugControlClaw claw;
+ __GLdebugControlGetGenericStatistic getGenericStatistic;
+ __GLdebugControlGetStatistic getStatistic;
+ __GLdebugControlDoQuadroSlowdown slowdown;
+ __GLdebugControlBufferObject bufObject;
+ __GLdebugControlGetCaps getCaps;
+ __GLdebugControlInjectRcError injectRcError;
+ __GLdebugControlQueryAppdb queryAppdb;
+ __GLdebugControlSend3DMethod send3DMethod;
+ __GLdebugControlSetCycleStatsState setCycleStatsState;
+ __GLdebugControlWWMP wwmp;
+ // Add new entries to u2 instead of u.
+ } u;
+
+ // This union is 8B-aligned.
+ union
+ {
+ GLuint64EXT x; // force 8B alignment.
+ __GLdebugControlSetStateObjectGPU setStateObjectGPU;
+ __GLdebugControlThreadingOptimizations threadOptimizations;
+ __GLdebugControlDualCore dualCore;
+ __GLdebugControlLE loopEnhance;
+ __GLdebugControlApicOgl apicOgl;
+ __GLdebugControlGetGPUAddress getGPUAddress;
+ __GLdebugControlExtraCgcOptions extraCgcOptions;
+ __GLdebugControlNvogtestTestStart nvogtestTestStart;
+ __GLdebugControlES2ReadBufferAutoStereo readBufferAutoStereo;
+ __GLdebugControlES2SetStereoParams setStereoParams;
+ __GLdebugControlES2DiskCacheCtrl diskCacheCtrl;
+ __GLdebugControlIndexReorderingConfig ibrCfg;
+ __GLdebugControlIndexReorderingStats ibrStats;
+ } u2;
+};
+
+
+// All implementations that export this entrypoint support the function
+// IS_SUPPORTED. Whether or not other functions are supported is
+// implementation defined.
+//
+// The correct usage is as follows. Let's say you want to use the function
+// EVICT_OBJECT:
+//
+// 1) glDebugControlNVX( {IS_SUPPORTED, EVICT_OBJECT, &result} );
+// 2) stop if result is FALSE
+// 3) glDebugControlNVX( {EVICT_OBJECT, objType, id} );
+//
+#define PROC_DebugControlNVX gl6813513874685413
+
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//
+// The remainder of this file is the legacy interface. It is still used by
+// nvogtest and nvapi. Eventually uses of the old interface will be ported to
+// the new interface, at which time the old interface will be removed.
+//
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+// bump this every time you change the list of recognized <pname> values.
+#define __NVOGLDEBUG_ENUM_VERSION 3
+
+// The following values may be passed as <pname> to
+// __NvOglDebugSeti and __NvOglDebugGeti.
+//
+// __NVOGLDEBUG_USER_1 and __NVOGLDEBUG_USER_2 should never be used in
+// checked-in code. Their purpose is for quick hacks while debugging or
+// developing new code. By including them here a priori, an engineer can
+// quickly use them without modifying a key .h file that causes recompilation
+// of the world.
+//
+// __NVOGLDEBUG_NVTRACE_LEVEL refers to the nvTraceLevel.
+//
+#define __NVOGLDEBUG_USER_1 0x8C50
+#define __NVOGLDEBUG_USER_2 0x8C51
+#define __NVOGLDEBUG_NVTRACE_LEVEL 0x8C52
+#define __NVOGLDEBUG_NVTRACE_OPTIONS 0x8C53
+#define __NVOGLDEBUG_VERSION 0x8C54
+#define __NVOGLDEBUG_TAG_TEST 0x8C55
+
+#define __NVOGLDEBUG_NVEXPERT_LEVEL 0x8C56
+#define __NVOGLDEBUG_NVEXPERT_CALLBACK 0x8C57
+#define __NVOGLDEBUG_NVEXPERT_MASK0 0x8C58
+
+#define __NVOGLDEBUG_TEMP0 0x8C59
+#define __NVOGLDEBUG_TEMP1 0x8C5A
+#define __NVOGLDEBUG_TEMP2 0x8C5B
+#define __NVOGLDEBUG_TEMP3 0x8C5C
+#define __NVOGLDEBUG_TEMP4 0x8C5D
+#define __NVOGLDEBUG_INSTRUMENTATION_ENABLED 0x8C5E
+#define __NVOGLDEBUG_OPTIONS 0x8C5F
+
+#define __NVOGLDEBUG_NVTRACE_MASK0 0x8C60
+#define __NVOGLDEBUG_NVTRACE_MASK1 0x8C61
+#define __NVOGLDEBUG_NVTRACE_MASK2 0x8C62
+#define __NVOGLDEBUG_NVTRACE_MASK3 0x8C63
+#define __NVOGLDEBUG_NVTRACE_MASK4 0x8C64
+#define __NVOGLDEBUG_NVTRACE_MASK5 0x8C65
+#define __NVOGLDEBUG_NVTRACE_MASK6 0x8C66
+#define __NVOGLDEBUG_NVTRACE_MASK7 0x8C67
+#define __NVOGLDEBUG_NVTRACE_MASK8 0x8C68
+#define __NVOGLDEBUG_NVTRACE_MASK9 0x8C69
+#define __NVOGLDEBUG_NVTRACE_MASK10 0x8C6A
+#define __NVOGLDEBUG_NVTRACE_MASK11 0x8C6B
+#define __NVOGLDEBUG_NVTRACE_MASK12 0x8C6C
+#define __NVOGLDEBUG_NVTRACE_MASK13 0x8C6D
+#define __NVOGLDEBUG_NVTRACE_MASK14 0x8C6E
+#define __NVOGLDEBUG_NVTRACE_MASK15 0x8C6F
+
+
+// Used to set the value of a debug variable. Returns the old value.
+// XXX deprecated, do not use
+int GLAPIENTRY __NvOglDebugSeti (unsigned int pname, int param);
+typedef int (GLAPIENTRY * PFN__NVOGLDEBUGSETIPROC) (unsigned int pname, int param);
+
+// Used to get the value of a debug variable.
+// XXX deprecated, do not use
+int GLAPIENTRY __NvOglDebugGeti (unsigned int pname);
+typedef int (GLAPIENTRY * PFN__NVOGLDEBUGGETIPROC) (unsigned int pname);
+
+// Used to set the value of a debug variable. Returns the old value.
+// XXX deprecated, do not use
+void* GLAPIENTRY __NvOglDebugSetv (unsigned int pname, void* param);
+typedef void* (GLAPIENTRY * PFN__NVOGLDEBUGSETVPROC) (unsigned int pname, void* param);
+
+// Used to get the value of a debug variable.
+// XXX deprecated, do not use
+void* GLAPIENTRY __NvOglDebugGetv (unsigned int pname);
+typedef void* (GLAPIENTRY * PFN__NVOGLDEBUGGETVPROC) (unsigned int pname);
+
+// keep this in sync with the ogl driver!!!
+#define OGL_PERF_STRAT_CLAW_ENABLED 0x00000001
+#define OGL_PERF_STRAT_CLAW_IGNORE_TRASH 0x00000040
+#define OGL_PERF_STRAT_CLAW_FORCE_EXECUTE_BLOCK 0x00000200
+#define OGL_PERF_STRAT_CLAW_FORCE_EXECUTE_PIKACHOU 0x00000400
+#define OGL_PERF_STRAT_CLAW_PIXEL_ACCURATE 0x00008000
+
+#if defined(QT3DS_MACINTOSH_OSX)
+
+// Used to emulate the debug control API via gldSetInteger. Values of 5000 or greater
+// are reserved for internal driver use.
+enum GLDVendorIntegerParameter
+{
+ GLD_NVIDIA_DEBUG_CONTROL = 5000,
+};
+
+#endif
+
+#endif
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglew.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglew.h
new file mode 100644
index 0000000..05f054f
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglew.h
@@ -0,0 +1,1363 @@
+/*
+** The OpenGL Extension Wrangler Library
+** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>
+** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
+** Copyright (C) 2002, Lev Povalahev
+** All rights reserved.
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are met:
+**
+** * Redistributions of source code must retain the above copyright notice,
+** this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright notice,
+** this list of conditions and the following disclaimer in the documentation
+** and/or other materials provided with the distribution.
+** * The name of the author may be used to endorse or promote products
+** derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+** THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+** Copyright (c) 2007 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+#ifndef __wglew_h__
+#define __wglew_h__
+#define __WGLEW_H__
+
+#ifdef __wglext_h_
+#error wglext.h included before wglew.h
+#endif
+
+#define __wglext_h_
+
+#if !defined(WINAPI)
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN 1
+# endif
+#include <windows.h>
+# undef WIN32_LEAN_AND_MEAN
+#endif
+
+/*
+ * GLEW_STATIC needs to be set when using the static version.
+ * GLEW_BUILD is set when building the DLL version.
+ */
+#ifdef GLEW_STATIC
+# define GLEWAPI extern
+#else
+# ifdef GLEW_BUILD
+# define GLEWAPI extern __declspec(dllexport)
+# else
+# define GLEWAPI extern __declspec(dllimport)
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -------------------------- WGL_3DFX_multisample ------------------------- */
+
+#ifndef WGL_3DFX_multisample
+#define WGL_3DFX_multisample 1
+
+#define WGL_SAMPLE_BUFFERS_3DFX 0x2060
+#define WGL_SAMPLES_3DFX 0x2061
+
+#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample)
+
+#endif /* WGL_3DFX_multisample */
+
+/* ------------------------- WGL_3DL_stereo_control ------------------------ */
+
+#ifndef WGL_3DL_stereo_control
+#define WGL_3DL_stereo_control 1
+
+#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055
+#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056
+#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057
+#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058
+
+typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState);
+
+#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL)
+
+#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control)
+
+#endif /* WGL_3DL_stereo_control */
+
+/* ------------------------ WGL_AMD_gpu_association ------------------------ */
+
+#ifndef WGL_AMD_gpu_association
+#define WGL_AMD_gpu_association 1
+
+#define WGL_GPU_VENDOR_AMD 0x1F00
+#define WGL_GPU_RENDERER_STRING_AMD 0x1F01
+#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
+#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
+#define WGL_GPU_RAM_AMD 0x21A3
+#define WGL_GPU_CLOCK_AMD 0x21A4
+#define WGL_GPU_NUM_PIPES_AMD 0x21A5
+#define WGL_GPU_NUM_SIMD_AMD 0x21A6
+#define WGL_GPU_NUM_RB_AMD 0x21A7
+#define WGL_GPU_NUM_SPI_AMD 0x21A8
+
+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);
+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);
+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList);
+typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);
+typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);
+typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);
+typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);
+typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);
+typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);
+
+#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD)
+#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD)
+#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD)
+#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD)
+#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD)
+#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD)
+#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD)
+#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD)
+#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD)
+
+#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association)
+
+#endif /* WGL_AMD_gpu_association */
+
+/* ------------------------- WGL_ARB_buffer_region ------------------------- */
+
+#ifndef WGL_ARB_buffer_region
+#define WGL_ARB_buffer_region 1
+
+#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
+#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
+#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
+#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
+
+typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);
+typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);
+typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
+typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);
+
+#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB)
+#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB)
+#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB)
+#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB)
+
+#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region)
+
+#endif /* WGL_ARB_buffer_region */
+
+/* ------------------------- WGL_ARB_create_context ------------------------ */
+
+#ifndef WGL_ARB_create_context
+#define WGL_ARB_create_context 1
+
+#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
+#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
+#define WGL_CONTEXT_FLAGS_ARB 0x2094
+#define ERROR_INVALID_VERSION_ARB 0x2095
+#define ERROR_INVALID_PROFILE_ARB 0x2096
+
+typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList);
+
+#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB)
+
+#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context)
+
+#endif /* WGL_ARB_create_context */
+
+/* --------------------- WGL_ARB_create_context_profile -------------------- */
+
+#ifndef WGL_ARB_create_context_profile
+#define WGL_ARB_create_context_profile 1
+
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
+
+#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile)
+
+#endif /* WGL_ARB_create_context_profile */
+
+/* ------------------- WGL_ARB_create_context_robustness ------------------- */
+
+#ifndef WGL_ARB_create_context_robustness
+#define WGL_ARB_create_context_robustness 1
+
+#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
+
+#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness)
+
+#endif /* WGL_ARB_create_context_robustness */
+
+/* ----------------------- WGL_ARB_extensions_string ----------------------- */
+
+#ifndef WGL_ARB_extensions_string
+#define WGL_ARB_extensions_string 1
+
+typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
+
+#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB)
+
+#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string)
+
+#endif /* WGL_ARB_extensions_string */
+
+/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */
+
+#ifndef WGL_ARB_framebuffer_sRGB
+#define WGL_ARB_framebuffer_sRGB 1
+
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
+
+#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB)
+
+#endif /* WGL_ARB_framebuffer_sRGB */
+
+/* ----------------------- WGL_ARB_make_current_read ----------------------- */
+
+#ifndef WGL_ARB_make_current_read
+#define WGL_ARB_make_current_read 1
+
+#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043
+#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
+
+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+
+#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB)
+#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB)
+
+#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read)
+
+#endif /* WGL_ARB_make_current_read */
+
+/* -------------------------- WGL_ARB_multisample -------------------------- */
+
+#ifndef WGL_ARB_multisample
+#define WGL_ARB_multisample 1
+
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SAMPLES_ARB 0x2042
+
+#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample)
+
+#endif /* WGL_ARB_multisample */
+
+/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */
+
+#ifndef WGL_ARB_pbuffer
+#define WGL_ARB_pbuffer 1
+
+#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
+#define WGL_PBUFFER_LARGEST_ARB 0x2033
+#define WGL_PBUFFER_WIDTH_ARB 0x2034
+#define WGL_PBUFFER_HEIGHT_ARB 0x2035
+#define WGL_PBUFFER_LOST_ARB 0x2036
+
+DECLARE_HANDLE(HPBUFFERARB);
+
+typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);
+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue);
+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);
+
+#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB)
+#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB)
+#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB)
+#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB)
+#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB)
+
+#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer)
+
+#endif /* WGL_ARB_pbuffer */
+
+/* -------------------------- WGL_ARB_pixel_format ------------------------- */
+
+#ifndef WGL_ARB_pixel_format
+#define WGL_ARB_pixel_format 1
+
+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#define WGL_DRAW_TO_BITMAP_ARB 0x2002
+#define WGL_ACCELERATION_ARB 0x2003
+#define WGL_NEED_PALETTE_ARB 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
+#define WGL_SWAP_METHOD_ARB 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB 0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
+#define WGL_TRANSPARENT_ARB 0x200A
+#define WGL_SHARE_DEPTH_ARB 0x200C
+#define WGL_SHARE_STENCIL_ARB 0x200D
+#define WGL_SHARE_ACCUM_ARB 0x200E
+#define WGL_SUPPORT_GDI_ARB 0x200F
+#define WGL_SUPPORT_OPENGL_ARB 0x2010
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#define WGL_STEREO_ARB 0x2012
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_RED_BITS_ARB 0x2015
+#define WGL_RED_SHIFT_ARB 0x2016
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_GREEN_SHIFT_ARB 0x2018
+#define WGL_BLUE_BITS_ARB 0x2019
+#define WGL_BLUE_SHIFT_ARB 0x201A
+#define WGL_ALPHA_BITS_ARB 0x201B
+#define WGL_ALPHA_SHIFT_ARB 0x201C
+#define WGL_ACCUM_BITS_ARB 0x201D
+#define WGL_ACCUM_RED_BITS_ARB 0x201E
+#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
+#define WGL_DEPTH_BITS_ARB 0x2022
+#define WGL_STENCIL_BITS_ARB 0x2023
+#define WGL_AUX_BUFFERS_ARB 0x2024
+#define WGL_NO_ACCELERATION_ARB 0x2025
+#define WGL_GENERIC_ACCELERATION_ARB 0x2026
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#define WGL_SWAP_EXCHANGE_ARB 0x2028
+#define WGL_SWAP_COPY_ARB 0x2029
+#define WGL_SWAP_UNDEFINED_ARB 0x202A
+#define WGL_TYPE_RGBA_ARB 0x202B
+#define WGL_TYPE_COLORINDEX_ARB 0x202C
+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
+
+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues);
+
+#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB)
+#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB)
+#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB)
+
+#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format)
+
+#endif /* WGL_ARB_pixel_format */
+
+/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */
+
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_ARB_pixel_format_float 1
+
+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
+
+#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float)
+
+#endif /* WGL_ARB_pixel_format_float */
+
+/* ------------------------- WGL_ARB_render_texture ------------------------ */
+
+#ifndef WGL_ARB_render_texture
+#define WGL_ARB_render_texture 1
+
+#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
+#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
+#define WGL_TEXTURE_FORMAT_ARB 0x2072
+#define WGL_TEXTURE_TARGET_ARB 0x2073
+#define WGL_MIPMAP_TEXTURE_ARB 0x2074
+#define WGL_TEXTURE_RGB_ARB 0x2075
+#define WGL_TEXTURE_RGBA_ARB 0x2076
+#define WGL_NO_TEXTURE_ARB 0x2077
+#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
+#define WGL_TEXTURE_1D_ARB 0x2079
+#define WGL_TEXTURE_2D_ARB 0x207A
+#define WGL_MIPMAP_LEVEL_ARB 0x207B
+#define WGL_CUBE_MAP_FACE_ARB 0x207C
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
+#define WGL_FRONT_LEFT_ARB 0x2083
+#define WGL_FRONT_RIGHT_ARB 0x2084
+#define WGL_BACK_LEFT_ARB 0x2085
+#define WGL_BACK_RIGHT_ARB 0x2086
+#define WGL_AUX0_ARB 0x2087
+#define WGL_AUX1_ARB 0x2088
+#define WGL_AUX2_ARB 0x2089
+#define WGL_AUX3_ARB 0x208A
+#define WGL_AUX4_ARB 0x208B
+#define WGL_AUX5_ARB 0x208C
+#define WGL_AUX6_ARB 0x208D
+#define WGL_AUX7_ARB 0x208E
+#define WGL_AUX8_ARB 0x208F
+#define WGL_AUX9_ARB 0x2090
+
+typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList);
+
+#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB)
+#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB)
+#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB)
+
+#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture)
+
+#endif /* WGL_ARB_render_texture */
+
+/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */
+
+#ifndef WGL_ATI_pixel_format_float
+#define WGL_ATI_pixel_format_float 1
+
+#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0
+#define GL_RGBA_FLOAT_MODE_ATI 0x8820
+#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835
+
+#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float)
+
+#endif /* WGL_ATI_pixel_format_float */
+
+/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */
+
+#ifndef WGL_ATI_render_texture_rectangle
+#define WGL_ATI_render_texture_rectangle 1
+
+#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5
+
+#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle)
+
+#endif /* WGL_ATI_render_texture_rectangle */
+
+/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */
+
+#ifndef WGL_EXT_create_context_es2_profile
+#define WGL_EXT_create_context_es2_profile 1
+
+#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+
+#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile)
+
+#endif /* WGL_EXT_create_context_es2_profile */
+
+/* -------------------------- WGL_EXT_depth_float -------------------------- */
+
+#ifndef WGL_EXT_depth_float
+#define WGL_EXT_depth_float 1
+
+#define WGL_DEPTH_FLOAT_EXT 0x2040
+
+#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float)
+
+#endif /* WGL_EXT_depth_float */
+
+/* ---------------------- WGL_EXT_display_color_table ---------------------- */
+
+#ifndef WGL_EXT_display_color_table
+#define WGL_EXT_display_color_table 1
+
+typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);
+typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length);
+
+#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT)
+#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT)
+#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT)
+#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT)
+
+#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table)
+
+#endif /* WGL_EXT_display_color_table */
+
+/* ----------------------- WGL_EXT_extensions_string ----------------------- */
+
+#ifndef WGL_EXT_extensions_string
+#define WGL_EXT_extensions_string 1
+
+typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);
+
+#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT)
+
+#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string)
+
+#endif /* WGL_EXT_extensions_string */
+
+/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */
+
+#ifndef WGL_EXT_framebuffer_sRGB
+#define WGL_EXT_framebuffer_sRGB 1
+
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
+
+#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB)
+
+#endif /* WGL_EXT_framebuffer_sRGB */
+
+/* ----------------------- WGL_EXT_make_current_read ----------------------- */
+
+#ifndef WGL_EXT_make_current_read
+#define WGL_EXT_make_current_read 1
+
+#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043
+
+typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+
+#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT)
+#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT)
+
+#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read)
+
+#endif /* WGL_EXT_make_current_read */
+
+/* -------------------------- WGL_EXT_multisample -------------------------- */
+
+#ifndef WGL_EXT_multisample
+#define WGL_EXT_multisample 1
+
+#define WGL_SAMPLE_BUFFERS_EXT 0x2041
+#define WGL_SAMPLES_EXT 0x2042
+
+#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample)
+
+#endif /* WGL_EXT_multisample */
+
+/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */
+
+#ifndef WGL_EXT_pbuffer
+#define WGL_EXT_pbuffer 1
+
+#define WGL_DRAW_TO_PBUFFER_EXT 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030
+#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031
+#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032
+#define WGL_PBUFFER_LARGEST_EXT 0x2033
+#define WGL_PBUFFER_WIDTH_EXT 0x2034
+#define WGL_PBUFFER_HEIGHT_EXT 0x2035
+
+DECLARE_HANDLE(HPBUFFEREXT);
+
+typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);
+typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);
+typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);
+typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue);
+typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);
+
+#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT)
+#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT)
+#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT)
+#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT)
+#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT)
+
+#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer)
+
+#endif /* WGL_EXT_pbuffer */
+
+/* -------------------------- WGL_EXT_pixel_format ------------------------- */
+
+#ifndef WGL_EXT_pixel_format
+#define WGL_EXT_pixel_format 1
+
+#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000
+#define WGL_DRAW_TO_WINDOW_EXT 0x2001
+#define WGL_DRAW_TO_BITMAP_EXT 0x2002
+#define WGL_ACCELERATION_EXT 0x2003
+#define WGL_NEED_PALETTE_EXT 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006
+#define WGL_SWAP_METHOD_EXT 0x2007
+#define WGL_NUMBER_OVERLAYS_EXT 0x2008
+#define WGL_NUMBER_UNDERLAYS_EXT 0x2009
+#define WGL_TRANSPARENT_EXT 0x200A
+#define WGL_TRANSPARENT_VALUE_EXT 0x200B
+#define WGL_SHARE_DEPTH_EXT 0x200C
+#define WGL_SHARE_STENCIL_EXT 0x200D
+#define WGL_SHARE_ACCUM_EXT 0x200E
+#define WGL_SUPPORT_GDI_EXT 0x200F
+#define WGL_SUPPORT_OPENGL_EXT 0x2010
+#define WGL_DOUBLE_BUFFER_EXT 0x2011
+#define WGL_STEREO_EXT 0x2012
+#define WGL_PIXEL_TYPE_EXT 0x2013
+#define WGL_COLOR_BITS_EXT 0x2014
+#define WGL_RED_BITS_EXT 0x2015
+#define WGL_RED_SHIFT_EXT 0x2016
+#define WGL_GREEN_BITS_EXT 0x2017
+#define WGL_GREEN_SHIFT_EXT 0x2018
+#define WGL_BLUE_BITS_EXT 0x2019
+#define WGL_BLUE_SHIFT_EXT 0x201A
+#define WGL_ALPHA_BITS_EXT 0x201B
+#define WGL_ALPHA_SHIFT_EXT 0x201C
+#define WGL_ACCUM_BITS_EXT 0x201D
+#define WGL_ACCUM_RED_BITS_EXT 0x201E
+#define WGL_ACCUM_GREEN_BITS_EXT 0x201F
+#define WGL_ACCUM_BLUE_BITS_EXT 0x2020
+#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021
+#define WGL_DEPTH_BITS_EXT 0x2022
+#define WGL_STENCIL_BITS_EXT 0x2023
+#define WGL_AUX_BUFFERS_EXT 0x2024
+#define WGL_NO_ACCELERATION_EXT 0x2025
+#define WGL_GENERIC_ACCELERATION_EXT 0x2026
+#define WGL_FULL_ACCELERATION_EXT 0x2027
+#define WGL_SWAP_EXCHANGE_EXT 0x2028
+#define WGL_SWAP_COPY_EXT 0x2029
+#define WGL_SWAP_UNDEFINED_EXT 0x202A
+#define WGL_TYPE_RGBA_EXT 0x202B
+#define WGL_TYPE_COLORINDEX_EXT 0x202C
+
+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues);
+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues);
+
+#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT)
+#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT)
+#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT)
+
+#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format)
+
+#endif /* WGL_EXT_pixel_format */
+
+/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */
+
+#ifndef WGL_EXT_pixel_format_packed_float
+#define WGL_EXT_pixel_format_packed_float 1
+
+#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8
+
+#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float)
+
+#endif /* WGL_EXT_pixel_format_packed_float */
+
+/* -------------------------- WGL_EXT_swap_control ------------------------- */
+
+#ifndef WGL_EXT_swap_control
+#define WGL_EXT_swap_control 1
+
+typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
+typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
+
+#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT)
+#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT)
+
+#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control)
+
+#endif /* WGL_EXT_swap_control */
+
+/* --------------------- WGL_I3D_digital_video_control --------------------- */
+
+#ifndef WGL_I3D_digital_video_control
+#define WGL_I3D_digital_video_control 1
+
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051
+#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052
+#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053
+
+typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);
+typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);
+
+#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D)
+#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D)
+
+#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control)
+
+#endif /* WGL_I3D_digital_video_control */
+
+/* ----------------------------- WGL_I3D_gamma ----------------------------- */
+
+#ifndef WGL_I3D_gamma
+#define WGL_I3D_gamma 1
+
+#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E
+#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F
+
+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue);
+typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);
+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue);
+typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);
+
+#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D)
+#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D)
+#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D)
+#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D)
+
+#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma)
+
+#endif /* WGL_I3D_gamma */
+
+/* ---------------------------- WGL_I3D_genlock ---------------------------- */
+
+#ifndef WGL_I3D_genlock
+#define WGL_I3D_genlock 1
+
+#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
+#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045
+#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046
+#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047
+#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
+#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
+#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
+#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
+#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
+
+typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);
+typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);
+typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge);
+typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource);
+typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag);
+typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay);
+
+#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D)
+#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D)
+#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D)
+#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D)
+#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D)
+#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D)
+#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D)
+#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D)
+#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D)
+#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D)
+#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D)
+#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D)
+
+#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock)
+
+#endif /* WGL_I3D_genlock */
+
+/* -------------------------- WGL_I3D_image_buffer ------------------------- */
+
+#ifndef WGL_I3D_image_buffer
+#define WGL_I3D_image_buffer 1
+
+#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001
+#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002
+
+typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count);
+typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);
+typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);
+typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count);
+
+#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D)
+#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D)
+#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D)
+#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D)
+
+#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer)
+
+#endif /* WGL_I3D_image_buffer */
+
+/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */
+
+#ifndef WGL_I3D_swap_frame_lock
+#define WGL_I3D_swap_frame_lock 1
+
+typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID);
+typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag);
+
+#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D)
+#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D)
+#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D)
+#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D)
+
+#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock)
+
+#endif /* WGL_I3D_swap_frame_lock */
+
+/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */
+
+#ifndef WGL_I3D_swap_frame_usage
+#define WGL_I3D_swap_frame_usage 1
+
+typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);
+typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
+
+#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D)
+#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D)
+#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D)
+#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D)
+
+#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage)
+
+#endif /* WGL_I3D_swap_frame_usage */
+
+/* --------------------------- WGL_NV_DX_interop --------------------------- */
+
+#ifndef WGL_NV_DX_interop
+#define WGL_NV_DX_interop 1
+
+#define WGL_ACCESS_READ_ONLY_NV 0x0000
+#define WGL_ACCESS_READ_WRITE_NV 0x0001
+#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002
+
+typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice);
+typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);
+typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access);
+typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice);
+typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access);
+typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle);
+typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);
+typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject);
+
+#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV)
+#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV)
+#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV)
+#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV)
+#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV)
+#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV)
+#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV)
+#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV)
+
+#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop)
+
+#endif /* WGL_NV_DX_interop */
+
+/* --------------------------- WGL_NV_copy_image --------------------------- */
+
+#ifndef WGL_NV_copy_image
+#define WGL_NV_copy_image 1
+
+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);
+
+#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV)
+
+#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image)
+
+#endif /* WGL_NV_copy_image */
+
+/* -------------------------- WGL_NV_float_buffer -------------------------- */
+
+#ifndef WGL_NV_float_buffer
+#define WGL_NV_float_buffer 1
+
+#define WGL_FLOAT_COMPONENTS_NV 0x20B0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4
+#define WGL_TEXTURE_FLOAT_R_NV 0x20B5
+#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6
+#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7
+#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8
+
+#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer)
+
+#endif /* WGL_NV_float_buffer */
+
+/* -------------------------- WGL_NV_gpu_affinity -------------------------- */
+
+#ifndef WGL_NV_gpu_affinity
+#define WGL_NV_gpu_affinity 1
+
+#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0
+#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1
+
+DECLARE_HANDLE(HGPUNV);
+typedef struct _GPU_DEVICE {
+ DWORD cb;
+ CHAR DeviceName[32];
+ CHAR DeviceString[128];
+ DWORD Flags;
+ RECT rcVirtualScreen;
+} GPU_DEVICE, *PGPU_DEVICE;
+
+typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList);
+typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc);
+typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);
+typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);
+typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);
+
+#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV)
+#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV)
+#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV)
+#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV)
+#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV)
+
+#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity)
+
+#endif /* WGL_NV_gpu_affinity */
+
+/* ---------------------- WGL_NV_multisample_coverage ---------------------- */
+
+#ifndef WGL_NV_multisample_coverage
+#define WGL_NV_multisample_coverage 1
+
+#define WGL_COVERAGE_SAMPLES_NV 0x2042
+#define WGL_COLOR_SAMPLES_NV 0x20B9
+
+#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage)
+
+#endif /* WGL_NV_multisample_coverage */
+
+/* -------------------------- WGL_NV_present_video ------------------------- */
+
+#ifndef WGL_NV_present_video
+#define WGL_NV_present_video 1
+
+#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0
+
+DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
+
+typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList);
+typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList);
+typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue);
+
+#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV)
+#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV)
+#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV)
+
+#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video)
+
+#endif /* WGL_NV_present_video */
+
+/* ---------------------- WGL_NV_render_depth_texture ---------------------- */
+
+#ifndef WGL_NV_render_depth_texture
+#define WGL_NV_render_depth_texture 1
+
+#define WGL_NO_TEXTURE_ARB 0x2077
+#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
+#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
+#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
+#define WGL_DEPTH_COMPONENT_NV 0x20A7
+
+#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture)
+
+#endif /* WGL_NV_render_depth_texture */
+
+/* -------------------- WGL_NV_render_texture_rectangle -------------------- */
+
+#ifndef WGL_NV_render_texture_rectangle
+#define WGL_NV_render_texture_rectangle 1
+
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
+#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
+
+#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle)
+
+#endif /* WGL_NV_render_texture_rectangle */
+
+/* --------------------------- WGL_NV_swap_group --------------------------- */
+
+#ifndef WGL_NV_swap_group
+#define WGL_NV_swap_group 1
+
+typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);
+typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);
+typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count);
+typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers);
+typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier);
+typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);
+
+#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV)
+#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV)
+#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV)
+#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV)
+#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV)
+#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV)
+
+#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group)
+
+#endif /* WGL_NV_swap_group */
+
+/* ----------------------- WGL_NV_vertex_array_range ----------------------- */
+
+#ifndef WGL_NV_vertex_array_range
+#define WGL_NV_vertex_array_range 1
+
+typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);
+typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);
+
+#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV)
+#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV)
+
+#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range)
+
+#endif /* WGL_NV_vertex_array_range */
+
+/* -------------------------- WGL_NV_video_capture ------------------------- */
+
+#ifndef WGL_NV_video_capture
+#define WGL_NV_video_capture 1
+
+#define WGL_UNIQUE_ID_NV 0x20CE
+#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
+
+DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
+
+typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
+typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList);
+typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue);
+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+
+#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV)
+#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV)
+#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV)
+#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV)
+#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV)
+
+#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture)
+
+#endif /* WGL_NV_video_capture */
+
+/* -------------------------- WGL_NV_video_output -------------------------- */
+
+#ifndef WGL_NV_video_output
+#define WGL_NV_video_output 1
+
+#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0
+#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1
+#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2
+#define WGL_VIDEO_OUT_COLOR_NV 0x20C3
+#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4
+#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5
+#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
+#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
+#define WGL_VIDEO_OUT_FRAME 0x20C8
+#define WGL_VIDEO_OUT_FIELD_1 0x20C9
+#define WGL_VIDEO_OUT_FIELD_2 0x20CA
+#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB
+#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC
+
+DECLARE_HANDLE(HPVIDEODEV);
+
+typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
+typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice);
+typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);
+typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);
+typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock);
+
+#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV)
+#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV)
+#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV)
+#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV)
+#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV)
+#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV)
+
+#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output)
+
+#endif /* WGL_NV_video_output */
+
+/* -------------------------- WGL_OML_sync_control ------------------------- */
+
+#ifndef WGL_OML_sync_control
+#define WGL_OML_sync_control 1
+
+typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator);
+typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc);
+typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
+typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
+typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc);
+typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc);
+
+#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML)
+#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML)
+#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML)
+#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML)
+#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML)
+#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML)
+
+#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control)
+
+#endif /* WGL_OML_sync_control */
+
+/* ------------------------------------------------------------------------- */
+
+#ifdef GLEW_MX
+#define WGLEW_EXPORT
+#else
+#define WGLEW_EXPORT GLEWAPI
+#endif /* GLEW_MX */
+
+#ifdef GLEW_MX
+struct WGLEWContextStruct
+{
+#endif /* GLEW_MX */
+
+WGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL;
+
+WGLEW_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD;
+WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD;
+WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD;
+WGLEW_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD;
+WGLEW_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD;
+WGLEW_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD;
+WGLEW_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD;
+WGLEW_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD;
+WGLEW_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD;
+
+WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB;
+WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB;
+WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB;
+WGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB;
+
+WGLEW_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB;
+
+WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB;
+
+WGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB;
+WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB;
+
+WGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB;
+WGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB;
+WGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB;
+WGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB;
+WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB;
+
+WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB;
+
+WGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB;
+WGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB;
+WGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB;
+
+WGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT;
+WGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT;
+WGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT;
+WGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT;
+
+WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT;
+
+WGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT;
+WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT;
+
+WGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT;
+WGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT;
+WGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT;
+WGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT;
+WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT;
+
+WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT;
+WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT;
+
+WGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT;
+WGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT;
+
+WGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D;
+WGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D;
+
+WGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D;
+WGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D;
+WGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D;
+WGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D;
+
+WGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D;
+WGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D;
+WGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D;
+WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D;
+WGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D;
+WGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D;
+
+WGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D;
+WGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D;
+WGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D;
+WGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D;
+
+WGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D;
+WGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D;
+WGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D;
+WGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D;
+
+WGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D;
+WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D;
+WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D;
+WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D;
+
+WGLEW_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV;
+WGLEW_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV;
+WGLEW_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV;
+WGLEW_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV;
+WGLEW_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV;
+WGLEW_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV;
+WGLEW_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV;
+WGLEW_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV;
+
+WGLEW_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV;
+
+WGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV;
+WGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV;
+WGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV;
+WGLEW_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV;
+WGLEW_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV;
+
+WGLEW_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV;
+WGLEW_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV;
+WGLEW_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV;
+
+WGLEW_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV;
+WGLEW_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV;
+WGLEW_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV;
+WGLEW_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV;
+WGLEW_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV;
+WGLEW_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV;
+
+WGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV;
+WGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV;
+
+WGLEW_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV;
+WGLEW_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV;
+WGLEW_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV;
+WGLEW_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV;
+WGLEW_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV;
+
+WGLEW_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV;
+WGLEW_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV;
+WGLEW_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV;
+WGLEW_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV;
+WGLEW_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV;
+WGLEW_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV;
+
+WGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML;
+WGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML;
+WGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML;
+WGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML;
+WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML;
+WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML;
+WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample;
+WGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control;
+WGLEW_EXPORT GLboolean __WGLEW_AMD_gpu_association;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_profile;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_robustness;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_multisample;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture;
+WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float;
+WGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_multisample;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_gamma;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock;
+WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage;
+WGLEW_EXPORT GLboolean __WGLEW_NV_DX_interop;
+WGLEW_EXPORT GLboolean __WGLEW_NV_copy_image;
+WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer;
+WGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity;
+WGLEW_EXPORT GLboolean __WGLEW_NV_multisample_coverage;
+WGLEW_EXPORT GLboolean __WGLEW_NV_present_video;
+WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture;
+WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle;
+WGLEW_EXPORT GLboolean __WGLEW_NV_swap_group;
+WGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range;
+WGLEW_EXPORT GLboolean __WGLEW_NV_video_capture;
+WGLEW_EXPORT GLboolean __WGLEW_NV_video_output;
+WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control;
+
+#ifdef GLEW_MX
+}; /* WGLEWContextStruct */
+#endif /* GLEW_MX */
+
+/* ------------------------------------------------------------------------- */
+
+#ifdef GLEW_MX
+
+typedef struct WGLEWContextStruct WGLEWContext;
+GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx);
+GLEWAPI GLboolean wglewContextIsSupported (const WGLEWContext* ctx, const char* name);
+
+#define wglewInit() wglewContextInit(wglewGetContext())
+#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x)
+
+#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x))
+#define WGLEW_GET_FUN(x) wglewGetContext()->x
+
+#else /* GLEW_MX */
+
+#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x)
+#define WGLEW_GET_FUN(x) x
+
+GLEWAPI GLboolean wglewIsSupported (const char* name);
+
+#endif /* GLEW_MX */
+
+GLEWAPI GLboolean wglewGetExtension (const char* name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#undef GLEWAPI
+
+#endif /* __wglew_h__ */
diff --git a/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglext.h b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglext.h
new file mode 100644
index 0000000..ac632cc
--- /dev/null
+++ b/src/3rdparty/platformspecific/Windows/PlatformLibs/GL/wglext.h
@@ -0,0 +1,421 @@
+#ifndef __wglext_h_
+#define __wglext_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2013-2016 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+/*
+** This header is generated from the Khronos OpenGL / OpenGL ES XML
+** API Registry. The current version of the Registry, generator scripts
+** used to make the header, and the header can be found at
+** http://www.opengl.org/registry/
+*/
+
+#ifndef GLAPI
+# define GLAPI __stdcall
+# define __DEFINED_GLAPI
+#endif
+
+DECLARE_HANDLE(HPBUFFERARB);
+DECLARE_HANDLE(HPVIDEODEVICE);
+DECLARE_HANDLE(HGPUNV);
+DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
+DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
+
+ /* WGL_NV_gpu_affinity */
+typedef struct _GPU_DEVICE {
+ DWORD cb;
+ CHAR DeviceName[32];
+ CHAR DeviceString[128];
+ DWORD Flags;
+ RECT rcVirtualScreen;
+} GPU_DEVICE, *PGPU_DEVICE;
+
+/*************************************************************/
+
+/* Extensions */
+#define WGL_ARB_buffer_region 1
+#define WGL_ARB_create_context_robustness 1
+#define WGL_ARB_extensions_string 1
+#define WGL_ARB_make_current_read 1
+#define WGL_ARB_multisample 1
+#define WGL_ARB_pbuffer 1
+#define WGL_ARB_pixel_format 1
+#define WGL_ARB_pixel_format_float 1
+#define WGL_ARB_render_texture 1
+#define WGL_ATI_pixel_format_float 1
+#define WGL_EXT_create_context_es2_profile 1
+#define WGL_EXT_extensions_string 1
+#define WGL_EXT_framebuffer_sRGB 1
+#define WGL_EXT_pixel_format_packed_float 1
+#define WGL_EXT_swap_control 1
+#define WGL_NV_allocate_memory 1
+#define WGL_NV_copy_image 1
+#define WGL_NV_float_buffer 1
+#define WGL_NV_multisample_coverage 1
+#define WGL_NV_render_depth_texture 1
+#define WGL_NV_render_texture_rectangle 1
+#define WGL_NV_video_output 1
+#define WGL_KTX_buffer_region 1
+#define WGL_I3D_genlock 1
+#define WGL_NV_swap_group 1
+#define WGL_NV_gpu_affinity 1
+#define WGL_NV_present_video 1
+#define WGL_ARB_create_context 1
+#define WGL_NV_video_capture 1
+
+/* ARB_buffer_region */
+#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
+#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
+#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
+#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
+
+/* ARB_pixel_format */
+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#define WGL_DRAW_TO_BITMAP_ARB 0x2002
+#define WGL_ACCELERATION_ARB 0x2003
+#define WGL_NEED_PALETTE_ARB 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
+#define WGL_SWAP_METHOD_ARB 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB 0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
+#define WGL_TRANSPARENT_ARB 0x200A
+#define WGL_SHARE_DEPTH_ARB 0x200C
+#define WGL_SHARE_STENCIL_ARB 0x200D
+#define WGL_SHARE_ACCUM_ARB 0x200E
+#define WGL_SUPPORT_GDI_ARB 0x200F
+#define WGL_SUPPORT_OPENGL_ARB 0x2010
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#define WGL_STEREO_ARB 0x2012
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_RED_BITS_ARB 0x2015
+#define WGL_RED_SHIFT_ARB 0x2016
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_GREEN_SHIFT_ARB 0x2018
+#define WGL_BLUE_BITS_ARB 0x2019
+#define WGL_BLUE_SHIFT_ARB 0x201A
+#define WGL_ALPHA_BITS_ARB 0x201B
+#define WGL_ALPHA_SHIFT_ARB 0x201C
+#define WGL_ACCUM_BITS_ARB 0x201D
+#define WGL_ACCUM_RED_BITS_ARB 0x201E
+#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
+#define WGL_DEPTH_BITS_ARB 0x2022
+#define WGL_STENCIL_BITS_ARB 0x2023
+#define WGL_AUX_BUFFERS_ARB 0x2024
+#define WGL_NO_ACCELERATION_ARB 0x2025
+#define WGL_GENERIC_ACCELERATION_ARB 0x2026
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#define WGL_SWAP_EXCHANGE_ARB 0x2028
+#define WGL_SWAP_COPY_ARB 0x2029
+#define WGL_SWAP_UNDEFINED_ARB 0x202A
+#define WGL_TYPE_RGBA_ARB 0x202B
+#define WGL_TYPE_COLORINDEX_ARB 0x202C
+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
+
+/* ARB_pbuffer */
+#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
+#define WGL_PBUFFER_LARGEST_ARB 0x2033
+#define WGL_PBUFFER_WIDTH_ARB 0x2034
+#define WGL_PBUFFER_HEIGHT_ARB 0x2035
+#define WGL_PBUFFER_LOST_ARB 0x2036
+
+/* ARB_multisample */
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SAMPLES_ARB 0x2042
+
+/* I3D_genlock */
+#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
+#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045
+#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046
+#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047
+#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
+#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
+#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
+#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
+#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
+
+/* ARB_render_texture */
+#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
+#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
+#define WGL_TEXTURE_FORMAT_ARB 0x2072
+#define WGL_TEXTURE_TARGET_ARB 0x2073
+#define WGL_MIPMAP_TEXTURE_ARB 0x2074
+#define WGL_TEXTURE_RGB_ARB 0x2075
+#define WGL_TEXTURE_RGBA_ARB 0x2076
+#define WGL_NO_TEXTURE_ARB 0x2077
+#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
+#define WGL_TEXTURE_1D_ARB 0x2079
+#define WGL_TEXTURE_2D_ARB 0x207A
+#define WGL_MIPMAP_LEVEL_ARB 0x207B
+#define WGL_CUBE_MAP_FACE_ARB 0x207C
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
+#define WGL_FRONT_LEFT_ARB 0x2083
+#define WGL_FRONT_RIGHT_ARB 0x2084
+#define WGL_BACK_LEFT_ARB 0x2085
+#define WGL_BACK_RIGHT_ARB 0x2086
+#define WGL_AUX0_ARB 0x2087
+#define WGL_AUX1_ARB 0x2088
+#define WGL_AUX2_ARB 0x2089
+#define WGL_AUX3_ARB 0x208A
+#define WGL_AUX4_ARB 0x208B
+#define WGL_AUX5_ARB 0x208C
+#define WGL_AUX6_ARB 0x208D
+#define WGL_AUX7_ARB 0x208E
+#define WGL_AUX8_ARB 0x208F
+#define WGL_AUX9_ARB 0x2090
+
+/* NV_render_depth_texture */
+#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
+#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
+#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
+#define WGL_DEPTH_COMPONENT_NV 0x20A7
+
+/* NV_float_buffer */
+#define WGL_FLOAT_COMPONENTS_NV 0x20B0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4
+#define WGL_TEXTURE_FLOAT_R_NV 0x20B5
+#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6
+#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7
+#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8
+
+/* NV_render_texture_rectangle */
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
+#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
+
+/* ARB_make_current_read */
+#define WGL_ERROR_INVALID_PIXEL_TYPE_ARB 0x2043
+#define WGL_ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
+
+/* ATI_pixel_format_float */
+#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0
+
+/* WGL_NV_video_output */
+#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0
+#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1
+#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2
+#define WGL_VIDEO_OUT_COLOR_NV 0x20C3
+#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4
+#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5
+#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
+#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
+#define WGL_VIDEO_OUT_FRAME_NV 0x20C8
+#define WGL_VIDEO_OUT_FIELD_1_NV 0x20C9
+#define WGL_VIDEO_OUT_FIELD_2_NV 0x20CA
+#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB
+#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC
+
+/* ARB_pixel_format_float */
+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
+
+/* EXT_pixel_format_packed_float */
+#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8
+
+/* NV_gpu_affinity */
+#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0
+#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1
+
+/* EXT_framebuffer_sRGB */
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
+
+/* NV_multisample_coverage */
+#define WGL_COVERAGE_SAMPLES_NV 0x2042
+#define WGL_COLOR_SAMPLES_NV 0x20B9
+
+/* NV_present_video */
+#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0
+
+/* ARB_create_context */
+#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
+#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
+#define WGL_CONTEXT_FLAGS_ARB 0x2094
+#define WGL_ERROR_INVALID_VERSION_ARB 0x2095
+
+/* NV_video_capture */
+#define WGL_UNIQUE_ID_NV 0x20CE
+
+/* EXT_create_context_es2_profile */
+#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x0004
+
+/* ARB_create_context_robustness */
+#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x0004
+#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
+#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+
+
+/*************************************************************/
+
+
+/* WGL_ARB_buffer_region */
+typedef HANDLE (GLAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hdc, int iLayerPlane, UINT uType);
+typedef void (GLAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);
+typedef BOOL (GLAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);
+typedef BOOL (GLAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
+
+/* WGL_ARB_create_context */
+typedef HGLRC (APIENTRY * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC, HGLRC, const int *);
+
+/* WGL_ARB_extensions_string */
+typedef const char * (GLAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
+
+/* WGL_ARB_pbuffer */
+typedef HPBUFFERARB (GLAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hdc, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
+typedef HDC (GLAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);
+typedef int (GLAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hdc);
+typedef BOOL (GLAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);
+typedef BOOL (GLAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
+
+/* WGL_ARB_render_texture */
+typedef BOOL (GLAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (GLAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
+typedef BOOL (GLAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList);
+
+/* WGL_NV_video_output */
+typedef BOOL (GLAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, INT iVideoStreams, HPVIDEODEVICE* phpVideoDevice);
+typedef BOOL (GLAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEVICE hpVideoDevice);
+typedef BOOL (GLAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEVICE hpVideoDevice, HPBUFFERARB hPbuffer, INT iVideoBuffer);
+typedef BOOL (GLAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, INT iVideoBuffer);
+typedef BOOL (GLAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, INT iBufferType, unsigned long * pulCounterPbuffer, BOOL bBlock);
+typedef BOOL (GLAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEVICE hpVideoDevice, unsigned long * pulCounterOutputVideo, unsigned long * pulCounterOutputPbuffer);
+
+/* WGL_ARB_pixel_format */
+typedef BOOL (GLAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+typedef BOOL (GLAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+typedef BOOL (GLAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+
+/* WGL_EXT_extensions_string */
+typedef const char * (GLAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);
+
+/* WGL_EXT_swap_control */
+typedef int (GLAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
+typedef int (GLAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
+
+/* WGL_NV_allocate_memory */
+typedef void * (GLAPI * PFNWGLALLOCATEMEMORYNVPROC) (int size, float readfreq, float writefreq, float priority);
+typedef void (GLAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);
+
+/* WGL_KTX_buffer_region */
+typedef UINT (GLAPI * PFNWGLNEWBUFFERREGIONPROC) (UINT type);
+typedef void (GLAPI * PFNWGLDELETEBUFFERREGIONPROC) (UINT region);
+typedef void (GLAPI * PFNWGLREADBUFFERREGIONPROC) (UINT region, int x, int y, GLint width, GLint height);
+typedef void (GLAPI * PFNWGLDRAWBUFFERREGIONPROC) (UINT region, int x, int y, GLint width, GLint height, int xDest, int yDest);
+typedef UINT (GLAPI * PFNWGLBUFFERREGIONENABLEDPROC) (void);
+
+/* WGL_I3D_genlock */
+typedef BOOL (GLAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hdc);
+typedef BOOL (GLAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hdc);
+typedef BOOL (GLAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hdc, BOOL * pFlag);
+typedef BOOL (GLAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hdc, UINT uSource);
+typedef BOOL (GLAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hdc, UINT * uSource);
+typedef BOOL (GLAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hdc, UINT uEdge);
+typedef BOOL (GLAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hdc, UINT * uEdge);
+typedef BOOL (GLAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hdc, UINT uRate);
+typedef BOOL (GLAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hdc, UINT * uRate);
+typedef BOOL (GLAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hdc, UINT uDelay);
+typedef BOOL (GLAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hdc, UINT * uDelay);
+typedef BOOL (GLAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hdc, UINT * uMaxLineDelay, UINT * uMaxPixelDelay);
+
+/* WGL_NV_swap_group */
+typedef BOOL (GLAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);
+typedef BOOL (GLAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);
+typedef BOOL (GLAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint * group, GLuint * barrier);
+typedef BOOL (GLAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint * maxGroups, GLuint * maxBarriers);
+typedef BOOL (GLAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint * count);
+typedef BOOL (GLAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);
+
+/* WGL_ARB_make_current_read */
+typedef BOOL (GLAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+typedef HDC (GLAPI * PFNWGLGETCURRENTREADDCARBPROC) (void);
+
+/* WGL_NV_copy_image */
+typedef BOOL (GLAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (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);
+
+/* WGL_NV_gpu_affinity */
+typedef BOOL (GLAPI * PFNWGLENUMGPUSNVPROC) (UINT iIndex, HGPUNV *hGpu);
+typedef BOOL (GLAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iIndex, PGPU_DEVICE pGpuDevice);
+typedef HDC (GLAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *pGpuList);
+typedef BOOL (GLAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iIndex, HGPUNV *hGpu);
+typedef BOOL (GLAPI * PFNWGLDELETEDCNVPROC) (HDC hAffinityDC);
+
+/* WGL_NV_present_video */
+typedef INT (GLAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList);
+typedef BOOL (GLAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, UINT uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int * piAttribList);
+typedef BOOL (GLAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (INT iAttribute, INT *piValue);
+
+/* WGL_NV_video_capture */
+typedef BOOL (GLAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hVideoDevice);
+typedef UINT (GLAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDC, HVIDEOINPUTDEVICENV *phDeviceList);
+typedef BOOL (GLAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDC, HVIDEOINPUTDEVICENV hDevice);
+typedef BOOL (GLAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDC, HVIDEOINPUTDEVICENV hDevice, INT iAttribute, INT *piValue);
+typedef BOOL (GLAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDC, HVIDEOINPUTDEVICENV hDevice);
+
+/* WGL_NVX_DX_interop */
+#define WGL_ACCESS_READ_ONLY_NVX 0x0000
+#define WGL_ACCESS_READ_WRITE_NVX 0x0001
+#define WGL_ACCESS_WRITE_DISCARD_NVX 0x0002
+typedef HANDLE (GLAPI * PFNWGLDXOPENDEVICENVXPROC) (void *dxDevice);
+typedef BOOL (GLAPI * PFNWGLDXCLOSEDEVICENVXPROC) (HANDLE hDevice);
+typedef HANDLE (GLAPI * PFNWGLDXREGISTEROBJECTNVXPROC) (HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access);
+typedef BOOL (GLAPI * PFNWGLDXUNREGISTEROBJECTNVXPROC) (HANDLE hDevice, HANDLE hObject);
+typedef BOOL (GLAPI * PFNWGLDXOBJECTACCESSNVXPROC) (HANDLE hObject, GLenum access);
+typedef BOOL (GLAPI * PFNWGLDXLOCKOBJECTSNVXPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects);
+typedef BOOL (GLAPI * PFNWGLDXUNLOCKOBJECTSNVXPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects);
+
+#ifdef __DEFINED_GLAPI
+# undef GLAPI
+# undef __DEFINED_GLAPI
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __wglext_h_ */
diff --git a/src/api/api.pro b/src/api/api.pro
new file mode 100644
index 0000000..7d5b27d
--- /dev/null
+++ b/src/api/api.pro
@@ -0,0 +1,5 @@
+TEMPLATE = subdirs
+CONFIG += ordered
+SUBDIRS += \
+ studio3d \
+ studio3dqml
diff --git a/src/api/studio3d/q3dscommandqueue.cpp b/src/api/studio3d/q3dscommandqueue.cpp
new file mode 100644
index 0000000..c6071aa
--- /dev/null
+++ b/src/api/studio3d/q3dscommandqueue.cpp
@@ -0,0 +1,346 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dscommandqueue_p.h"
+#include "q3dspresentation.h"
+#include "Qt3DSViewerApp.h"
+
+#include <QtCore/qstringlist.h>
+
+ElementCommand::ElementCommand()
+ : m_commandType(CommandType_Invalid)
+{
+}
+
+QString ElementCommand::toString() const
+{
+ QString ret = QStringLiteral("ElementCommand - Type: %1 Path: '%2' StrVal: '%3' VarVal: '%4'");
+ return ret.arg(m_commandType).arg(m_elementPath)
+ .arg(m_stringValue).arg(m_variantValue.toString());
+}
+
+CommandQueue::CommandQueue()
+ : m_visibleChanged(false)
+ , m_scaleModeChanged(false)
+ , m_shadeModeChanged(false)
+ , m_showRenderStatsChanged(false)
+ , m_matteColorChanged(false)
+ , m_sourceChanged(false)
+ , m_variantListChanged(false)
+ , m_globalAnimationTimeChanged(false)
+ , m_delayedLoadingChanged(false)
+ , m_visible(false)
+ , m_scaleMode(Q3DSViewerSettings::ScaleModeCenter)
+ , m_shadeMode(Q3DSViewerSettings::ShadeModeShaded)
+ , m_showRenderStats(false)
+ , m_matteColor(Qt::black)
+ , m_delayedLoading(false)
+ , m_size(0)
+{
+ qRegisterMetaType<CommandType>();
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath,
+ CommandType commandType,
+ const QString &attributeName,
+ const QVariant &value)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_stringValue = attributeName;
+ cmd.m_variantValue = value;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath,
+ CommandType commandType,
+ const QString &attributeName,
+ const QVariant &value,
+ int intValue)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_stringValue = attributeName;
+ cmd.m_variantValue = value;
+ cmd.m_intValues[0] = intValue;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath, CommandType commandType,
+ const QString &value)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_stringValue = value;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath,
+ CommandType commandType, bool value)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_boolValue = value;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath,
+ CommandType commandType, float value)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_floatValue = value;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath,
+ CommandType commandType, int value0, int value1,
+ int value2, int value3)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_intValues[0] = value0;
+ cmd.m_intValues[1] = value1;
+ cmd.m_intValues[2] = value2;
+ cmd.m_intValues[3] = value3;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath, CommandType commandType,
+ const QString &stringValue, void *commandData)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_stringValue = stringValue;
+ cmd.m_data = commandData;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(CommandType commandType, void *commandData)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_data = commandData;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath, CommandType commandType)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+
+ return cmd;
+}
+
+ElementCommand &CommandQueue::queueCommand(const QString &elementPath, CommandType commandType,
+ void *commandData)
+{
+ ElementCommand &cmd = nextFreeCommand();
+
+ cmd.m_commandType = commandType;
+ cmd.m_elementPath = elementPath;
+ cmd.m_data = commandData;
+
+ return cmd;
+}
+
+void CommandQueue::copyCommands(CommandQueue &fromQueue)
+{
+ m_visibleChanged = m_visibleChanged || fromQueue.m_visibleChanged;
+ m_scaleModeChanged = m_scaleModeChanged || fromQueue.m_scaleModeChanged;
+ m_shadeModeChanged = m_shadeModeChanged || fromQueue.m_shadeModeChanged;
+ m_showRenderStatsChanged = m_showRenderStatsChanged || fromQueue.m_showRenderStatsChanged;
+ m_matteColorChanged = m_matteColorChanged || fromQueue.m_matteColorChanged;
+ m_sourceChanged = m_sourceChanged || fromQueue.m_sourceChanged;
+ m_variantListChanged = m_variantListChanged || fromQueue.m_variantListChanged;
+ m_globalAnimationTimeChanged
+ = m_globalAnimationTimeChanged || fromQueue.m_globalAnimationTimeChanged;
+ m_delayedLoadingChanged = m_delayedLoadingChanged || fromQueue.m_delayedLoadingChanged;
+
+ if (fromQueue.m_visibleChanged)
+ m_visible = fromQueue.m_visible;
+ if (fromQueue.m_scaleModeChanged)
+ m_scaleMode = fromQueue.m_scaleMode;
+ if (fromQueue.m_shadeModeChanged)
+ m_shadeMode = fromQueue.m_shadeMode;
+ if (fromQueue.m_showRenderStatsChanged)
+ m_showRenderStats = fromQueue.m_showRenderStats;
+ if (fromQueue.m_matteColorChanged)
+ m_matteColor = fromQueue.m_matteColor;
+ if (fromQueue.m_sourceChanged)
+ m_source = fromQueue.m_source;
+ if (fromQueue.m_variantListChanged)
+ m_variantList = fromQueue.m_variantList;
+ if (fromQueue.m_globalAnimationTimeChanged)
+ m_globalAnimationTime = fromQueue.m_globalAnimationTime;
+ if (fromQueue.m_delayedLoadingChanged)
+ m_delayedLoading = fromQueue.m_delayedLoading;
+
+ // Pending queue may be synchronized multiple times between queue processing, so let's append
+ // to the existing queue rather than clearing it.
+ for (int i = 0; i < fromQueue.m_size; i++) {
+ const ElementCommand &source = fromQueue.constCommandAt(i);
+ switch (source.m_commandType) {
+ case CommandType_SetDataInputValue:
+ queueCommand(source.m_elementPath, source.m_commandType, source.m_stringValue,
+ source.m_variantValue, source.m_intValues[0]);
+ break;
+ case CommandType_SetAttribute:
+ queueCommand(source.m_elementPath, source.m_commandType, source.m_stringValue,
+ source.m_variantValue);
+ break;
+ case CommandType_GoToSlideByName:
+ case CommandType_FireEvent:
+ queueCommand(source.m_elementPath, source.m_commandType, source.m_stringValue);
+ break;
+ case CommandType_SetPresentationActive:
+ queueCommand(source.m_elementPath, source.m_commandType, source.m_boolValue);
+ break;
+ case CommandType_GoToTime:
+ queueCommand(source.m_elementPath, source.m_commandType, source.m_floatValue);
+ break;
+ case CommandType_GoToSlide:
+ case CommandType_GoToSlideRelative:
+ case CommandType_MousePress:
+ case CommandType_MouseRelease:
+ case CommandType_MouseMove:
+ case CommandType_MouseWheel:
+ case CommandType_KeyPress:
+ case CommandType_KeyRelease:
+ queueCommand(source.m_elementPath, source.m_commandType,
+ source.m_intValues[0], source.m_intValues[1],
+ source.m_intValues[2], source.m_intValues[3]);
+ break;
+ case CommandType_CreateElements:
+ queueCommand(source.m_elementPath, source.m_commandType, source.m_stringValue,
+ source.m_data);
+ fromQueue.commandAt(i).m_data = nullptr; // This queue takes ownership of data
+ break;
+ case CommandType_DeleteElements:
+ case CommandType_DeleteMaterials:
+ case CommandType_DeleteMeshes:
+ case CommandType_CreateMeshes:
+ queueCommand(source.m_commandType, source.m_data);
+ fromQueue.commandAt(i).m_data = nullptr; // This queue takes ownership of data
+ break;
+ case CommandType_CreateMaterials:
+ queueCommand(source.m_elementPath, source.m_commandType, source.m_data);
+ fromQueue.commandAt(i).m_data = nullptr; // This queue takes ownership of data
+ break;
+ case CommandType_RequestSlideInfo:
+ case CommandType_UnloadSlide:
+ case CommandType_PreloadSlide:
+ case CommandType_RequestDataInputs:
+ case CommandType_RequestDataOutputs:
+ queueCommand(source.m_elementPath, source.m_commandType);
+ break;
+ default:
+ queueCommand(QString(), CommandType_Invalid, false);
+ break;
+ }
+ }
+}
+
+// Clears changed states and empties the queue
+void CommandQueue::clear(bool deleteCommandData)
+{
+ m_visibleChanged = false;
+ m_scaleModeChanged = false;
+ m_shadeModeChanged = false;
+ m_showRenderStatsChanged = false;
+ m_matteColorChanged = false;
+ m_sourceChanged = false;
+ m_variantListChanged = false;
+ m_globalAnimationTimeChanged = false;
+ m_delayedLoadingChanged = false;
+
+ if (deleteCommandData) {
+ for (int i = 0; i < m_size; ++i) {
+ ElementCommand &cmd = m_elementCommands[i];
+ if (cmd.m_data) {
+ switch (cmd.m_commandType) {
+ case CommandType_CreateElements:
+ delete static_cast<QVector<QHash<QString, QVariant>> *>(cmd.m_data);
+ break;
+ case CommandType_DeleteElements:
+ case CommandType_CreateMaterials:
+ case CommandType_DeleteMaterials:
+ case CommandType_DeleteMeshes:
+ delete static_cast<QStringList *>(cmd.m_data);
+ break;
+ case CommandType_CreateMeshes: {
+ delete static_cast<QHash<QString, Q3DSViewer::MeshData> *>(cmd.m_data);
+ break;
+ }
+ default:
+ Q_ASSERT(false); // Should never come here
+ break;
+ }
+ cmd.m_data = nullptr;
+ }
+ }
+ }
+
+ // We do not clear the actual queued commands, those will be reused the next frame
+ // To avoid a lot of unnecessary reallocations.
+ m_size = 0;
+}
+
+ElementCommand &CommandQueue::nextFreeCommand()
+{
+ m_size++;
+ if (m_size > m_elementCommands.size())
+ m_elementCommands.append(ElementCommand());
+ return m_elementCommands[m_size - 1];
+}
diff --git a/src/api/studio3d/q3dscommandqueue_p.h b/src/api/studio3d/q3dscommandqueue_p.h
new file mode 100644
index 0000000..12d1b7e
--- /dev/null
+++ b/src/api/studio3d/q3dscommandqueue_p.h
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_COMMAND_QUEUE_H
+#define Q3DS_COMMAND_QUEUE_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dsviewersettings.h"
+
+#include <QtGui/qcolor.h>
+#include <QtCore/qsize.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qurl.h>
+#include <QtCore/qvariant.h>
+
+QT_BEGIN_NAMESPACE
+
+enum CommandType {
+ CommandType_Invalid = 0,
+ CommandType_SetAttribute,
+ CommandType_SetPresentationActive,
+ CommandType_GoToSlideByName,
+ CommandType_GoToSlide,
+ CommandType_GoToSlideRelative,
+ CommandType_GoToTime,
+ CommandType_FireEvent,
+ CommandType_MousePress,
+ CommandType_MouseRelease,
+ CommandType_MouseMove,
+ CommandType_MouseWheel,
+ CommandType_KeyPress,
+ CommandType_KeyRelease,
+ CommandType_SetGlobalAnimationTime,
+ CommandType_SetDataInputValue,
+ CommandType_CreateElements,
+ CommandType_DeleteElements,
+ CommandType_CreateMaterials,
+ CommandType_DeleteMaterials,
+ CommandType_CreateMeshes,
+ CommandType_DeleteMeshes,
+
+ // Requests
+ CommandType_RequestSlideInfo,
+ CommandType_RequestDataInputs,
+ CommandType_PreloadSlide,
+ CommandType_UnloadSlide,
+ CommandType_RequestDataOutputs
+};
+
+class Q_STUDIO3D_EXPORT ElementCommand
+{
+public:
+ ElementCommand();
+
+ CommandType m_commandType;
+ QString m_elementPath;
+ QString m_stringValue;
+ QVariant m_variantValue;
+ void *m_data = nullptr; // Data is owned by the queue and is deleted once command is handled
+ union {
+ bool m_boolValue;
+ float m_floatValue;
+ int m_intValues[4];
+ qint64 m_int64Value;
+ };
+
+ QString toString() const;
+};
+
+typedef QVector<ElementCommand> CommandList;
+
+class Q_STUDIO3D_EXPORT CommandQueue
+{
+public:
+ CommandQueue();
+
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ const QString &attributeName, const QVariant &value);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ const QString &attributeName, const QVariant &value,
+ int intValue);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ const QString &value);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ bool value);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ float value);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ int value0, int value1 = 0,
+ int value2 = 0, int value3 = 0);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ const QString &stringValue, void *commandData);
+ ElementCommand &queueCommand(CommandType commandType, void *commandData);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType);
+ ElementCommand &queueCommand(const QString &elementPath, CommandType commandType,
+ void *commandData);
+
+ void copyCommands(CommandQueue &fromQueue);
+
+ bool m_visibleChanged;
+ bool m_scaleModeChanged;
+ bool m_shadeModeChanged;
+ bool m_showRenderStatsChanged;
+ bool m_matteColorChanged;
+ bool m_sourceChanged;
+ bool m_variantListChanged;
+ bool m_globalAnimationTimeChanged;
+ bool m_delayedLoadingChanged;
+
+ bool m_visible;
+ Q3DSViewerSettings::ScaleMode m_scaleMode;
+ Q3DSViewerSettings::ShadeMode m_shadeMode;
+ bool m_showRenderStats;
+ QColor m_matteColor;
+ QUrl m_source;
+ QStringList m_variantList;
+ qint64 m_globalAnimationTime;
+ bool m_delayedLoading;
+
+ void clear(bool deleteCommandData);
+ int size() const { return m_size; }
+ const ElementCommand &constCommandAt(int index) const { return m_elementCommands.at(index); }
+ ElementCommand &commandAt(int index) { return m_elementCommands[index]; }
+
+private:
+ ElementCommand &nextFreeCommand();
+
+ CommandList m_elementCommands;
+ int m_size;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(CommandType)
+
+#endif // Q3DS_COMMAND_QUEUE_H
diff --git a/src/api/studio3d/q3dsdatainput.cpp b/src/api/studio3d/q3dsdatainput.cpp
new file mode 100644
index 0000000..a15f9fb
--- /dev/null
+++ b/src/api/studio3d/q3dsdatainput.cpp
@@ -0,0 +1,451 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsdatainput_p.h"
+#include "q3dspresentation_p.h"
+#include "q3dscommandqueue_p.h"
+
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype DataInput
+ \instantiates Q3DSDataInput
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief Controls a data input entry in a Qt 3D Studio presentation.
+ This class is a convenience class for controlling a data input in a presentation.
+ DataInput provides a clean contract between the presentation design and the code.
+ It hides the presentation details from the code while providing a contractual access
+ point to code for controlling aspects of the presentation (e.g. timeline of a
+ subpresentation). It also allows the design to use a single DataInput to drive
+ multiple aspects of the design (e.g. DataInput for speed can change the color of
+ the speedometer, angle of the needle).
+
+ \note There is a performance cost for each registered DataInput, so try to avoid
+ creating unnecessary DataInputs.
+
+ \sa Presentation, DataOutput, Presentation::slideExited, Presentation::slideEntered
+ \sa Presentation::customSignalEmitted
+*/
+
+/*!
+ \class Q3DSDataInput
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+ \brief Controls a data input entry in a Qt 3D Studio presentation.
+ This class is a convenience class for controlling a data input in a presentation.
+ DataInput provides a clean contract between the presentation design and the code.
+ It hides the presentation details from the code while providing a contractual access
+ point to code for controlling aspects of the presentation (e.g. timeline of a
+ subpresentation). It also allows the design to use a single DataInput to drive
+ multiple aspects of the design (e.g. DataInput for speed can change the color of
+ the speedometer, angle of the needle).
+
+ \note There is a performance cost for each registered DataInput, so try to avoid
+ creating unnecessary DataInputs.
+
+ For other integration points between code and presentation see:
+ \sa Q3DSPresentation::customSignalEmitted
+ \sa Q3DSPresentation::slideEntered
+ \sa Q3DSPresentation::slideExited
+ \sa Q3DSDataOutput
+
+ \sa Q3DSPresentation
+*/
+
+/*!
+ \internal
+ */
+Q3DSDataInput::Q3DSDataInput(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataInputPrivate(this))
+{
+}
+
+/*!
+ \internal
+ */
+Q3DSDataInput::Q3DSDataInput(const QString &name, QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataInputPrivate(this))
+{
+ d_ptr->m_name = name;
+}
+
+/*!
+ Constructs a Q3DSDataInput instance and initializes the \a name. The
+ constructed instance is automatically associated with the specified \a
+ presentation. An optional \a parent object can be specified.
+ */
+Q3DSDataInput::Q3DSDataInput(Q3DSPresentation *presentation, const QString &name, QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataInputPrivate(this))
+{
+ d_ptr->m_name = name;
+ d_ptr->m_presentation = presentation;
+ if (presentation)
+ presentation->registerDataInput(this);
+}
+
+/*!
+ \internal
+ */
+Q3DSDataInput::Q3DSDataInput(Q3DSDataInputPrivate *d, Q3DSPresentation *presentation,
+ const QString &name, QObject *parent)
+ : QObject(parent)
+ , d_ptr(d)
+{
+ d_ptr->m_name = name;
+ d_ptr->m_presentation = presentation;
+ if (presentation)
+ presentation->registerDataInput(this);
+}
+
+/*!
+ Destructor.
+ */
+Q3DSDataInput::~Q3DSDataInput()
+{
+ delete d_ptr;
+}
+
+/*!
+ \qmlproperty string DataInput::name
+
+ Specifies the name of the controlled data input element in the
+ presentation. The name must match a name of a data input defined
+ in the presentation. This property must be set before setting the
+ value property.
+ */
+
+/*!
+ \property Q3DSDataInput::name
+
+ Specifies the name of the controlled data input element in the
+ presentation. The name must match a name of a data input defined
+ in the presentation.
+
+ This property must be set before setting the value property.
+ The initial value is provided via the constructor, but the name
+ can also be changed later on.
+ */
+QString Q3DSDataInput::name() const
+{
+ return d_ptr->m_name;
+}
+
+void Q3DSDataInput::setName(const QString &name)
+{
+ if (d_ptr->m_name != name) {
+ d_ptr->m_name = name;
+ if (d_ptr->m_presentation)
+ d_ptr->m_presentation->registerDataInput(this);
+ Q_EMIT nameChanged();
+ }
+}
+
+/*!
+ \qmlproperty variant DataInput::value
+
+ Specifies the value of the controlled data input element in the
+ presentation.
+
+ The value of this property only accounts for changes done via the same
+ Q3DSDataInput instance. If the value of the same data input in the
+ presentation is changed elsewhere, for example via animations or
+ Q3DSPresentation::setAttribute(), those changes are not reflected in the
+ value of this property. Due to this uncertainty, this property treats all
+ value sets as changes even if the newly set value is the same value as the
+ previous value.
+
+ To get actual values from the presentation, use DataOutput.
+ \sa DataOutput
+*/
+/*!
+ \property Q3DSDataInput::value
+
+ Specifies the value of the controlled data input element in the
+ presentation.
+
+ The value of this property only accounts for changes done via the same
+ Q3DSDataInput instance. If the value of the same data input in the
+ presentation is changed elsewhere, for example via animations or
+ Q3DSPresentation::setAttribute(), those changes are not reflected in the
+ value of this property. Due to this uncertainty, this property treats all
+ value sets as changes even if the newly set value is the same value as the
+ previous value.
+
+ To get actual values from the presentation, use DataOutput.
+ \sa DataOutput
+*/
+QVariant Q3DSDataInput::value() const
+{
+ return d_ptr->m_value;
+}
+
+/*!
+ \property Q3DSDataInput::min
+
+ Contains the minimum range value for datainput. Returned value is zero
+ for datainput types other than \e {Ranged Number}.
+
+ \note This value is read-only.
+ */
+float Q3DSDataInput::min() const
+{
+ if (!d_ptr->m_presentation)
+ return 0.0f;
+
+ return d_ptr->m_presentation->d_ptr->dataInputMin(d_ptr->m_name);
+}
+
+/*!
+ \property Q3DSDataInput::max
+
+ Contains the maximum range value for datainput. Returned value is zero
+ for datainput types other than \e {Ranged Number}.
+
+ \note This value is read-only.
+ */
+float Q3DSDataInput::max() const
+{
+ if (!d_ptr->m_presentation)
+ return 0.0f;
+
+ return d_ptr->m_presentation->d_ptr->dataInputMax(d_ptr->m_name);
+}
+
+/*!
+ Returns true if presentation (or its subpresentation) associated with
+ this datainput has a datainput definition with a matching name. Returns
+ false if the datainput has no associated presentation, or if a match is not found.
+ */
+bool Q3DSDataInput::isValid() const
+{
+ if (d_ptr->m_presentation)
+ return d_ptr->m_presentation->d_ptr->isValidDataInput(this);
+ else
+ return false;
+}
+
+/*!
+ Returns the metadata defined for this datainput with metadata \a key.
+
+ Metadata is user-defined key-value table that can be used, for example, to better describe the
+ usage of, or to indicate the external data source that should be bound to this datainput.
+ Metadata has no impact on presentation rendering.
+
+ \note Datainput metadata is read-only.
+ */
+/*!
+ \qmlmethod string DataInput::metadata
+ Returns the metadata defined for this datainput with metadata \a key.
+
+ Metadata is user-defined key-value table that can be used, for example, to better describe the
+ usage of, or to indicate the external data source that should be bound to this datainput.
+ Metadata has no impact on presentation rendering.
+
+ \note Datainput metadata is read-only.
+ */
+QString Q3DSDataInput::metadata(const QString &key) const
+{
+ if (!d_ptr->m_presentation)
+ return {};
+
+ auto metadata = d_ptr->m_presentation->d_ptr->dataInputMetadata(name());
+
+ return metadata[key];
+}
+
+/*!
+ Returns the metadata keys defined for this datainput.
+
+ \sa metadata
+ */
+/*!
+ \qmlmethod var DataInput::metadataKeys
+ Returns the metadata keys defined for this datainput.
+
+ \note Datainput metadata is read-only.
+ \sa metadata
+ */
+QStringList Q3DSDataInput::metadataKeys() const
+{
+ if (!d_ptr->m_presentation)
+ return {};
+
+ return d_ptr->m_presentation->d_ptr->dataInputMetadata(name()).keys();
+}
+
+/*!
+ \brief Q3DSDataInput::setValue Set a new \a value for this data input.
+ \note For performance reasons do not call setValue unnecessarily.
+ */
+void Q3DSDataInput::setValue(const QVariant &value)
+{
+ // Since properties controlled by data inputs can change without the current value being
+ // reflected on the value of the DataInput element, we allow setting the value to the
+ // same one it was previously and still consider it a change.
+ // For example, when controlling timeline, the value set to DataInput will only be
+ // the current value for one frame if presentation has a running animation.
+ // In order to track an element property, see DataOutput API.
+ d_ptr->setValue(value, ValueRole::Value);
+ Q_EMIT valueChanged();
+}
+
+void Q3DSDataInputPrivate::setPresentation(Q3DSPresentation *presentation)
+{
+ m_presentation = presentation;
+}
+
+Q3DSDataInputPrivate::Q3DSDataInputPrivate(Q3DSDataInput *parent)
+ : q_ptr(parent)
+{
+}
+
+Q3DSDataInputPrivate::~Q3DSDataInputPrivate()
+{
+ if (m_presentation)
+ m_presentation->unregisterDataInput(q_ptr);
+}
+
+void Q3DSDataInputPrivate::setValue(const QVariant &value, Q3DSDataInput::ValueRole valueRole)
+{
+ m_value = value;
+ if (m_presentation)
+ m_presentation->setDataInputValue(m_name, m_value, valueRole);
+}
+
+void Q3DSDataInputPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
+{
+ m_viewerApp = app;
+
+ if (m_viewerApp && m_value.isValid())
+ setValue(m_value);
+}
+
+void Q3DSDataInputPrivate::setCommandQueue(CommandQueue *queue)
+{
+ m_commandQueue = queue;
+
+ if (m_commandQueue && m_value.isValid())
+ setValue(m_value);
+}
+
+
+/*!
+ \qmltype DataInput
+ \instantiates Q3DSDataInput
+ \inqmlmodule QtStudio3D
+ \ingroup OpenGLRuntime
+
+ \brief Controls a data input entry in a Qt 3D Studio presentation.
+
+ This type is a convenience for controlling a data in a presentation. Its functionality is
+ equivalent to \c{Presentation::setDataInputValue()}, however it has a big advantage
+ of being able to use QML property bindings, thus avoiding the need to having to resort
+ to a JavaScript function call for every value change.
+
+ As an example:
+
+ \qml
+ Studio3D {
+ ...
+ Presentation {
+ id: presentation
+ ...
+ property string text: ""
+ DataInput {
+ name: "inputForSomeTextNode"
+ value: presentation.text
+ }
+ }
+ }
+
+ Button {
+ onClicked: presentation.text = "Hello World"
+ }
+ \endqml
+
+ The example assumes that a data input connection was made in Qt 3D Studio
+ presentation using Qt 3D Studio editor between the \c textstring property of
+ target property and a data input name \c inputForSomeTextNode. As the value
+ is now set via a property, the full set of QML property bindings techniques
+ are available.
+
+ \sa Studio3D, Presentation
+*/
+
+/*!
+ \qmlproperty string DataInput::name
+
+ Specifies the name of the controlled data input element in the
+ presentation. This property must be set as part of DataInput declaration,
+ although it is changeable afterwards, if desired.
+*/
+
+/*!
+ \qmlproperty variant DataInput::value
+
+ Specifies the value of the controlled data input element in the presentation.
+
+ The value of this property only accounts for changes done via the same
+ DataInput instance. If the value of the underlying attribute in the
+ presentation is changed elsewhere, for example via animations or
+ Presentation::setAttribute(), those changes are not reflected in the value
+ of this property. Due to this uncertainty, this property treats all value
+ sets as changes even if the newly set value is the same value as the
+ previous value.
+*/
+
+/*!
+ \qmlproperty real DataInput::min
+
+ Contains the minimum value of the controlled data input element range.
+
+ This property is applicable only to data input type \e {Ranged Number}. For other
+ types, value returned is zero.
+
+ \note This value is read-only.
+*/
+
+/*!
+ \qmlproperty real DataInput::max
+
+ Contains the maximum value of the controlled data input element range.
+
+ This property is applicable only to data input type \e {Ranged Number}. For other
+ types, value returned is zero.
+
+ \note This value is read-only.
+*/
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/q3dsdatainput.h b/src/api/studio3d/q3dsdatainput.h
new file mode 100644
index 0000000..3617dcd
--- /dev/null
+++ b/src/api/studio3d/q3dsdatainput.h
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSDATAINPUT_H
+#define Q3DSDATAINPUT_H
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qvariant.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSDataInputPrivate;
+class Q3DSPresentation;
+
+class Q_STUDIO3D_EXPORT Q3DSDataInput : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Q3DSDataInput)
+
+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+ Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged)
+ Q_PROPERTY(float max READ max CONSTANT)
+ Q_PROPERTY(float min READ min CONSTANT)
+public:
+ explicit Q3DSDataInput(QObject *parent = nullptr);
+ explicit Q3DSDataInput(const QString &name, QObject *parent = nullptr);
+ explicit Q3DSDataInput(Q3DSPresentation *presentation, const QString &name,
+ QObject *parent = nullptr);
+
+ virtual ~Q3DSDataInput();
+
+ enum class ValueRole {
+ Value = 0,
+ Min = 1,
+ Max = 2
+ };
+
+ QString name() const;
+ QVariant value() const;
+ float min() const;
+ float max() const;
+ bool isValid() const;
+
+ Q_INVOKABLE QString metadata(const QString &key) const;
+ Q_INVOKABLE QStringList metadataKeys() const;
+
+public Q_SLOTS:
+ void setName(const QString &name);
+ void setValue(const QVariant &value);
+
+Q_SIGNALS:
+ void nameChanged();
+ void valueChanged();
+
+protected:
+ explicit Q3DSDataInput(Q3DSDataInputPrivate *d, Q3DSPresentation *presentation,
+ const QString &name, QObject *parent = nullptr);
+ Q3DSDataInputPrivate *d_ptr;
+
+private:
+ Q_DISABLE_COPY(Q3DSDataInput)
+ friend class Q3DSPresentationPrivate;
+ friend class Q3DSRenderer;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(Q3DSDataInput*)
+
+#endif // Q3DSDATAINPUT_H
diff --git a/src/api/studio3d/q3dsdatainput_p.h b/src/api/studio3d/q3dsdatainput_p.h
new file mode 100644
index 0000000..19b06f9
--- /dev/null
+++ b/src/api/studio3d/q3dsdatainput_p.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSDATAINPUT_P_P_H
+#define Q3DSDATAINPUT_P_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dsdatainput.h"
+#include "q3dscommandqueue_p.h"
+#include "Qt3DSViewerApp.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSPresentationPrivate;
+
+class Q_STUDIO3D_EXPORT Q3DSDataInputPrivate
+{
+ Q_DECLARE_PUBLIC(Q3DSDataInput)
+public:
+ explicit Q3DSDataInputPrivate(Q3DSDataInput *parent);
+ virtual ~Q3DSDataInputPrivate();
+
+ void setValue(const QVariant &value,
+ Q3DSDataInput::ValueRole valueRole = Q3DSDataInput::ValueRole::Value);
+ void setViewerApp(Q3DSViewer::Q3DSViewerApp *app);
+ void setCommandQueue(CommandQueue *queue);
+ void setPresentation(Q3DSPresentation *presentation);
+
+protected:
+ Q3DSDataInput *q_ptr;
+ Q3DSViewer::Q3DSViewerApp *m_viewerApp = nullptr; // Not owned
+ CommandQueue *m_commandQueue = nullptr; // Not owned
+ Q3DSPresentation *m_presentation = nullptr; // Not owned
+ QString m_name;
+ // Local cached values, used only when synchronous getter from runtime engine
+ // is not available (for QML -side that is behind command queue).
+ QVariant m_value;
+ float m_max = 0;
+ float m_min = 0;
+
+ // Note: Qt3d Runtime allows metadata to be both read and set, therefore requiring
+ // internal representation of both keys and values to be QVariant as per API convention.
+ // OpenGL Runtime, in contrast, only allows metadata to be read. As metadata now can only
+ // come from UIA file where it is stored as string, we use QStrings in API as well.
+ QHash<QString, QString> m_metadata;
+
+ friend class Q3DSPresentationPrivate;
+ friend class Q3DSRenderer;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSDATAINPUT_P_P_H
diff --git a/src/api/studio3d/q3dsdataoutput.cpp b/src/api/studio3d/q3dsdataoutput.cpp
new file mode 100644
index 0000000..3cb13a0
--- /dev/null
+++ b/src/api/studio3d/q3dsdataoutput.cpp
@@ -0,0 +1,225 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsdataoutput_p.h"
+#include "q3dspresentation_p.h"
+#include "q3dscommandqueue_p.h"
+
+/*!
+ \qmltype DataOutput
+ \instantiates Q3DSDataOutput
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief Provides notifications from data output entries in Qt 3D Studio presentation.
+ This class is a convenience class for listening for changes in the Qt 3D Studio
+ presentation attributes. DataOutput provides a clean contract between the presentation
+ design and the code. It hides the presentation details from the code while providing a
+ contractual access point to code to be notified when aspects of the presentation change
+ (e.g. movement of an element in the presentation due to timeline animation).
+
+ DataOutput can be attached to same attributes in the design as DataInput is, including
+ presentation timeline. Only exception is slide changes. Slide changes are already notified
+ through \c{Presentation::slideEntered} and \c{Presentation::slideExited} signals.
+
+ \note There is a performance cost for each registered DataOutput, so try to avoid
+ creating unnecessary DataOutputs.
+
+ \sa Presentation, DataInput, Presentation::slideExited, Presentation::slideEntered
+ \sa Presentation::customSignalEmitted
+*/
+
+/*!
+ \class Q3DSDataOutput
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.4
+ \brief Provides notifications from data output entries in Qt 3D Studio presentation.
+ This class is a convenience class for listening for changes in the Qt 3D Studio
+ presentation attributes. DataOutput provides a clean contract between the presentation
+ design and the code. It hides the presentation details from the code while providing a
+ contractual access point to code to be notified when aspects of the presentation change
+ (e.g. movement of an element in the presentation due to timeline animation).
+
+ DataOutput can be attached to same attributes in the design as DataInput is, including
+ presentation timeline. Only excaption is slide changes Slide changes are already notified
+ through \c{Q3DSPresentation::slideEntered} and \c{Q3DSPresentation::slideExited} signals.
+
+ \note There is a performance cost for each registered DataOutput, so try to avoid
+ creating unnecessary DataOutputs.
+
+ For other integration points between code and presentation see:
+ \sa Q3DSPresentation::customSignalEmitted
+ \sa Q3DSPresentation::slideEntered
+ \sa Q3DSPresentation::slideExited
+ \sa Q3DSDataInput
+
+ \sa Q3DSPresentation
+*/
+Q3DSDataOutput::Q3DSDataOutput(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataOutputPrivate(this))
+{
+
+}
+
+Q3DSDataOutput::Q3DSDataOutput(const QString &name, QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSDataOutputPrivate(this))
+{
+ d_ptr->m_name = name;
+}
+
+Q3DSDataOutput::~Q3DSDataOutput()
+{
+ delete d_ptr;
+}
+
+/*!
+ \qmlproperty string DataOutput::name
+
+ Specifies the name of the observed data output element in the
+ presentation. The name must match a name of a data output defined
+ in the presentation. This property must be set before setting the value
+ property.
+ */
+
+/*!
+ \property Q3DSDataOutput::name
+
+ Specifies the name of the observed data output element in the
+ presentation. The name must match a name of a data output defined
+ in the presentation.
+
+ This property must be set before setting the value property.
+ The initial value is provided via the constructor, but the name
+ can also be changed later on.
+ */
+QString Q3DSDataOutput::name() const
+{
+ return d_ptr->m_name;
+}
+
+void Q3DSDataOutput::setName(const QString &name)
+{
+ if (d_ptr->m_name != name) {
+ d_ptr->m_name = name;
+ if (d_ptr->m_presentation)
+ d_ptr->m_presentation->registerDataOutput(this);
+ Q_EMIT nameChanged(name);
+ }
+}
+
+/*!
+ \qmlproperty DataOutput::value
+
+ Contains the read-only value of the controlled data output element in the
+ presentation.
+
+ The value of this property accounts for actual value in the last processed
+ frame of the presentation. This includes animation timeline driven changes,
+ changes done via DataInput and changes done via Behavior scripts.
+*/
+
+/*!
+ \property Q3DSDataOutput::value
+
+ Contains the read-only value of the controlled data output element in the
+ presentation.
+
+ The value of this property accounts for actual value in the last processed
+ frame of the presentation. This includes animation timeline driven changes,
+ changes done via DataInput and changes done via Behavior scripts.
+*/
+QVariant Q3DSDataOutput::value() const
+{
+ return d_ptr->m_value;
+}
+
+/*!
+ * \qmlsignal DataOutput::valueChanged
+ Emitted when the value of the observed DataOutput has changed in the
+ presentation.
+ \param newValue The new value of the observed DataOutput.
+ */
+
+/*!
+ \fn Q3DSDataOutput::valueChanged
+ Emitted when the value of the observed DataOutput has changed in the
+ presentation.
+ \param newValue The new value of the observed DataOutput.
+ */
+
+/*!
+ * \internal
+ */
+void Q3DSDataOutput::setValue(const QVariant &value)
+{
+ if (d_ptr->m_value == value)
+ return;
+
+ d_ptr->m_value = value;
+ Q_EMIT valueChanged(value);
+}
+
+void Q3DSDataOutputPrivate::setPresentation(Q3DSPresentation *presentation)
+{
+ m_presentation = presentation;
+}
+
+Q3DSDataOutputPrivate::Q3DSDataOutputPrivate(Q3DSDataOutput *parent)
+ : q_ptr(parent)
+{
+}
+
+Q3DSDataOutputPrivate::~Q3DSDataOutputPrivate()
+{
+ if (m_presentation)
+ m_presentation->unregisterDataOutput(q_ptr);
+}
+
+void Q3DSDataOutputPrivate::setValue(const QVariant &value)
+{
+ m_value = value;
+ Q_EMIT q_ptr->valueChanged(value);
+}
+
+void Q3DSDataOutputPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
+{
+ m_viewerApp = app;
+
+ if (m_viewerApp && m_value.isValid())
+ setValue(m_value);
+}
+
+void Q3DSDataOutputPrivate::setCommandQueue(CommandQueue *queue)
+{
+ m_commandQueue = queue;
+
+ if (m_commandQueue && m_value.isValid())
+ setValue(m_value);
+}
diff --git a/src/api/studio3d/q3dsdataoutput.h b/src/api/studio3d/q3dsdataoutput.h
new file mode 100644
index 0000000..93f7426
--- /dev/null
+++ b/src/api/studio3d/q3dsdataoutput.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSDATAOUTPUT_H
+#define Q3DSDATAOUTPUT_H
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qvariant.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSDataOutputPrivate;
+class Q3DSPresentation;
+
+class Q_STUDIO3D_EXPORT Q3DSDataOutput : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Q3DSDataOutput)
+
+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+ Q_PROPERTY(QVariant value READ value NOTIFY valueChanged)
+
+public:
+
+ explicit Q3DSDataOutput(QObject *parent = nullptr);
+ explicit Q3DSDataOutput(const QString &name, QObject *parent = nullptr);
+ explicit Q3DSDataOutput(Q3DSPresentation *presentation, const QString &name,
+ QObject *parent = nullptr);
+ virtual ~Q3DSDataOutput();
+
+ QString name() const;
+ QVariant value() const;
+
+public Q_SLOTS:
+ void setName(const QString &name);
+
+Q_SIGNALS:
+ void nameChanged(const QString &newName);
+ void valueChanged(const QVariant &newValue);
+
+protected:
+ explicit Q3DSDataOutput(Q3DSDataOutputPrivate *d, Q3DSPresentation *presentation,
+ const QString &name, QObject *parent = nullptr);
+ Q3DSDataOutputPrivate *d_ptr;
+
+private:
+ Q_DISABLE_COPY(Q3DSDataOutput)
+ void setValue(const QVariant &newValue);
+ friend class Q3DSPresentationPrivate;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(Q3DSDataOutput*)
+
+#endif // Q3DSDATAOUTPUT_H
diff --git a/src/api/studio3d/q3dsdataoutput_p.h b/src/api/studio3d/q3dsdataoutput_p.h
new file mode 100644
index 0000000..c4745bf
--- /dev/null
+++ b/src/api/studio3d/q3dsdataoutput_p.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSDATAOUTPUT_P_H
+#define Q3DSDATAOUTPUT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dsdataoutput.h"
+#include "q3dscommandqueue_p.h"
+#include "Qt3DSViewerApp.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSPresentationPrivate;
+
+class Q_STUDIO3D_EXPORT Q3DSDataOutputPrivate
+{
+ Q_DECLARE_PUBLIC(Q3DSDataOutput)
+public:
+ explicit Q3DSDataOutputPrivate(Q3DSDataOutput *parent);
+ virtual ~Q3DSDataOutputPrivate();
+
+ void setValue(const QVariant &value);
+ void setViewerApp(Q3DSViewer::Q3DSViewerApp *app);
+ void setCommandQueue(CommandQueue *queue);
+ void setPresentation(Q3DSPresentation *presentation);
+
+protected:
+ Q3DSDataOutput *q_ptr;
+ Q3DSViewer::Q3DSViewerApp *m_viewerApp = nullptr; // Not owned
+ CommandQueue *m_commandQueue = nullptr; // Not owned
+ Q3DSPresentation *m_presentation = nullptr; // Not owned
+ QString m_name;
+ QVariant m_value;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSDATAOUTPUT_P_H
diff --git a/src/api/studio3d/q3dselement.cpp b/src/api/studio3d/q3dselement.cpp
new file mode 100644
index 0000000..16ae110
--- /dev/null
+++ b/src/api/studio3d/q3dselement.cpp
@@ -0,0 +1,284 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dselement_p.h"
+#include "q3dspresentation_p.h"
+#include "q3dscommandqueue_p.h"
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qsettings.h>
+#include <QtCore/qcoreapplication.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype Element
+ \instantiates Q3DSElement
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief Control type for elements in a Qt 3D Studio presentation.
+
+ This class is provided for backwards compatibility. We recommend using
+ DataInput and DataOutput APIs for contractual and clean API between
+ the design and the code.
+
+ \sa DataInput, DataOutput
+
+ This type is a convenience for controlling the properties of a scene object
+ (such as, model, material, camera, layer) in a Qt 3D Studio presentation.
+
+ \note The functionality of Element is equivalent to
+ Presentation::setAttribute() and Presentation::fireEvent().
+
+ \sa Studio3D, SceneElement, Presentation, DataInput, DataOutput
+*/
+
+/*!
+ \class Q3DSElement
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+
+ \brief Controls a scene object (node) in a Qt 3D Studio presentation.
+
+ This class is provided for backwards compatibility. We recommend using
+ DataInput and DataOutput APIs for contractual and clean API between
+ the design and the code.
+
+ This class is a convenience class for controlling the properties of a scene
+ object (such as, model, material, camera, layer) in a Qt 3D Studio
+ presentation.
+
+ \sa Q3DSWidget, Q3DSSurfaceViewer, Q3DSSceneElement
+ */
+
+/*!
+ \internal
+ */
+Q3DSElement::Q3DSElement(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSElementPrivate(this))
+{
+}
+
+/*!
+ \internal
+ */
+Q3DSElement::Q3DSElement(const QString &elementPath, QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSElementPrivate(this))
+{
+ d_ptr->m_elementPath = elementPath;
+}
+
+/*!
+ Constructs a Q3DSElement instance controlling the scene object specified by
+ \a elementPath. An optional \a parent object can be specified. The
+ constructed instance is automatically associated with the specified \a
+ presentation. An optional \a parent object can be specified.
+ */
+Q3DSElement::Q3DSElement(Q3DSPresentation *presentation, const QString &elementPath,
+ QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSElementPrivate(this))
+{
+ d_ptr->m_elementPath = elementPath;
+ if (presentation)
+ presentation->registerElement(this);
+}
+
+/*!
+ \internal
+ */
+Q3DSElement::Q3DSElement(Q3DSElementPrivate *d, Q3DSPresentation *presentation,
+ const QString &elementPath, QObject *parent)
+ : QObject(parent)
+ , d_ptr(d)
+{
+ d_ptr->m_elementPath = elementPath;
+ if (presentation)
+ presentation->registerElement(this);
+}
+
+/*!
+ Destructor.
+ */
+Q3DSElement::~Q3DSElement()
+{
+ // Private class isn't QObject, so we need to delete it explicitly
+ delete d_ptr;
+}
+
+/*!
+ \qmlproperty string Element::elementPath
+
+ Holds the element path of the presentation element.
+
+ An element path refers to an object in the scene by name, for example,
+ \c{Scene.Layer.Camera}. Here the right camera object gets chosen even if
+ the scene contains other layers with the default camera names (for instance
+ \c{Scene.Layer2.Camera}).
+
+ To reference an object stored in a property of another object, the dot
+ syntax can be used. The most typical example of this is changing the source
+ of a texture map by changing the \c sourcepath property on the object
+ selected by \c{SomeMaterial.diffusemap}.
+
+ To access an object in a sub-presentation, prepend the name of the
+ sub-presentation followed by a colon, for example,
+ \c{SubPresentationOne:Scene.Layer.Camera}.
+ */
+
+/*!
+ \property Q3DSElement::elementPath
+
+ Holds the element path of the presentation element.
+
+ An element path refers to an object in the scene by name, for example,
+ \c{Scene.Layer.Camera}. Here the right camera object gets chosen even if
+ the scene contains other layers with the default camera names (for instance
+ \c{Scene.Layer2.Camera}).
+
+ To reference an object stored in a property of another object, the dot
+ syntax can be used. The most typical example of this is changing the source
+ of a texture map by changing the \c sourcepath property on the object
+ selected by \c{SomeMaterial.diffusemap}.
+
+ To access an object in a sub-presentation, prepend the name of the
+ sub-presentation followed by a colon, for example,
+ \c{SubPresentationOne:Scene.Layer.Camera}.
+ */
+QString Q3DSElement::elementPath() const
+{
+ return d_ptr->m_elementPath;
+}
+
+void Q3DSElement::setElementPath(const QString &elementPath)
+{
+ if (d_ptr->m_elementPath != elementPath) {
+ d_ptr->setElementPath(elementPath);
+ Q_EMIT elementPathChanged(d_ptr->m_elementPath);
+ }
+}
+
+/*!
+ \qmlmethod void Element::setAttribute(string attributeName, variant value)
+
+ Sets the \a value of an attribute (property) of the scene object specified
+ by this Element instance. The \a attributeName is the \l{Attribute
+ Names}{scripting name} of the attribute.
+*/
+
+/*!
+ Sets the \a value of an attribute (property) of the scene object
+ specified by elementPath.
+
+ The \a attributeName is the \l{Attribute Names}{scripting name} of the attribute.
+ */
+void Q3DSElement::setAttribute(const QString &attributeName, const QVariant &value)
+{
+ if (d_ptr->m_presentation)
+ d_ptr->m_presentation->q_ptr->setAttribute(d_ptr->m_elementPath, attributeName, value);
+ else
+ qWarning() << __FUNCTION__ << "Element is not registered to any presentation!";
+}
+
+/*!
+ \qmlmethod void Element::fireEvent(string eventName)
+
+ Dispatches an event with \a eventName on the scene object
+ specified by elementPath.
+
+ Appropriate actions created in Qt 3D Studio or callbacks registered using
+ the registerForEvent() method in attached \c{behavior scripts} will be
+ executed in response to the event.
+*/
+
+/*!
+ Dispatches an event with \a eventName on the scene object
+ specified by elementPath.
+
+ Appropriate actions created in Qt 3D Studio or callbacks registered using
+ the registerForEvent() method in attached (behavior) scripts will be
+ executed in response to the event.
+ */
+void Q3DSElement::fireEvent(const QString &eventName)
+{
+ if (d_ptr->m_presentation)
+ d_ptr->m_presentation->q_ptr->fireEvent(d_ptr->m_elementPath, eventName);
+ else
+ qWarning() << __FUNCTION__ << "Element is not registered to any presentation!";
+}
+
+Q3DSElementPrivate::Q3DSElementPrivate(Q3DSElement *parent)
+ : q_ptr(parent)
+ , m_viewerApp(nullptr)
+ , m_commandQueue(nullptr)
+ , m_presentation(nullptr)
+{
+}
+
+Q3DSElementPrivate::~Q3DSElementPrivate()
+{
+ if (m_presentation)
+ m_presentation->unregisterElement(q_ptr);
+}
+
+void Q3DSElementPrivate::setElementPath(const QString &elementPath)
+{
+ m_elementPath = elementPath;
+
+ if (m_presentation)
+ m_presentation->registerElement(q_ptr);
+}
+
+void Q3DSElementPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
+{
+ m_viewerApp = app;
+}
+
+void Q3DSElementPrivate::setCommandQueue(CommandQueue *queue)
+{
+ m_commandQueue = queue;
+}
+
+void Q3DSElementPrivate::setPresentation(Q3DSPresentationPrivate *presentation)
+{
+ m_presentation = presentation;
+}
+
+void Q3DSElementPrivate::requestResponseHandler(CommandType commandType, void *requestData)
+{
+ Q_UNUSED(commandType)
+ Q_UNUSED(requestData)
+
+ // Base element doesn't handle any request command types yet
+ qWarning() << __FUNCTION__ << "Unknown command type.";
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/q3dselement.h b/src/api/studio3d/q3dselement.h
new file mode 100644
index 0000000..04c43f5
--- /dev/null
+++ b/src/api/studio3d/q3dselement.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSELEMENT_H
+#define Q3DSELEMENT_H
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qobject.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSElementPrivate;
+class Q3DSPresentation;
+
+class Q_STUDIO3D_EXPORT Q3DSElement : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Q3DSElement)
+
+ Q_PROPERTY(QString elementPath READ elementPath WRITE setElementPath NOTIFY elementPathChanged)
+
+public:
+ explicit Q3DSElement(QObject *parent = nullptr);
+ explicit Q3DSElement(const QString &elementPath, QObject *parent = nullptr);
+ explicit Q3DSElement(Q3DSPresentation *presentation, const QString &elementPath,
+ QObject *parent = nullptr);
+ virtual ~Q3DSElement();
+
+ QString elementPath() const;
+
+public Q_SLOTS:
+ void setElementPath(const QString &elementPath);
+ void setAttribute(const QString &attributeName, const QVariant &value);
+ void fireEvent(const QString &eventName);
+
+Q_SIGNALS:
+ void elementPathChanged(const QString &elementPath);
+
+protected:
+ explicit Q3DSElement(Q3DSElementPrivate *d, Q3DSPresentation *presentation,
+ const QString &elementPath, QObject *parent = nullptr);
+ Q3DSElementPrivate *d_ptr;
+
+private:
+ Q_DISABLE_COPY(Q3DSElement)
+
+ friend class Q3DSPresentationPrivate;
+ friend class Q3DSStudio3D;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSELEMENT_H
diff --git a/src/api/studio3d/q3dselement_p.h b/src/api/studio3d/q3dselement_p.h
new file mode 100644
index 0000000..d4e77b1
--- /dev/null
+++ b/src/api/studio3d/q3dselement_p.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSSCENE_P_H
+#define Q3DSSCENE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dselement.h"
+#include "q3dscommandqueue_p.h"
+#include "Qt3DSViewerApp.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSPresentationPrivate;
+
+class Q_STUDIO3D_EXPORT Q3DSElementPrivate
+{
+ Q_DECLARE_PUBLIC(Q3DSElement)
+public:
+ explicit Q3DSElementPrivate(Q3DSElement *parent);
+ virtual ~Q3DSElementPrivate();
+
+ void setElementPath(const QString &elementPath);
+
+ virtual void setViewerApp(Q3DSViewer::Q3DSViewerApp *app);
+ virtual void setCommandQueue(CommandQueue *queue);
+ virtual void setPresentation(Q3DSPresentationPrivate *presentation);
+
+ virtual void requestResponseHandler(CommandType commandType, void *requestData);
+
+protected:
+ Q3DSElement *q_ptr;
+ Q3DSViewer::Q3DSViewerApp *m_viewerApp; // Not owned
+ CommandQueue *m_commandQueue; // Not owned
+ Q3DSPresentationPrivate *m_presentation; // Not owned
+ QString m_elementPath;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSSCENE_P_H
diff --git a/src/api/studio3d/q3dsgeometry.cpp b/src/api/studio3d/q3dsgeometry.cpp
new file mode 100644
index 0000000..bfc66a9
--- /dev/null
+++ b/src/api/studio3d/q3dsgeometry.cpp
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsgeometry_p.h"
+
+QT_BEGIN_NAMESPACE
+
+Q3DSGeometry::Q3DSGeometry()
+ : d_ptr(new Q3DSGeometryPrivate(this))
+{
+}
+
+Q3DSGeometry::~Q3DSGeometry()
+{
+ delete d_ptr;
+}
+
+void Q3DSGeometry::setVertexData(const QByteArray &data)
+{
+ d_ptr->m_meshData.m_vertexBuffer = data;
+}
+
+void Q3DSGeometry::setIndexData(const QByteArray &data)
+{
+ d_ptr->m_meshData.m_indexBuffer = data;
+}
+
+const QByteArray &Q3DSGeometry::vertexBuffer() const
+{
+ return d_ptr->m_meshData.m_vertexBuffer;
+}
+
+QByteArray &Q3DSGeometry::vertexBuffer()
+{
+ return d_ptr->m_meshData.m_vertexBuffer;
+}
+
+const QByteArray &Q3DSGeometry::indexBuffer() const
+{
+ return d_ptr->m_meshData.m_indexBuffer;
+}
+
+QByteArray &Q3DSGeometry::indexBuffer()
+{
+ return d_ptr->m_meshData.m_indexBuffer;
+}
+
+int Q3DSGeometry::attributeCount() const
+{
+ return d_ptr->m_meshData.m_attributeCount;
+}
+
+void Q3DSGeometry::addAttribute(Q3DSGeometry::Attribute::Semantic semantic,
+ Q3DSGeometry::Attribute::ComponentType componentType)
+{
+ Q_ASSERT(d_ptr->m_meshData.m_attributeCount < Q3DSViewer::MeshData::MAX_ATTRIBUTES);
+
+ Q3DSViewer::MeshData::Attribute &att
+ = d_ptr->m_meshData.m_attributes[d_ptr->m_meshData.m_attributeCount];
+
+ Q3DSGeometry::Attribute::ComponentType theCompType = componentType;
+ if (theCompType == Attribute::DefaultType) {
+ theCompType = semantic == Attribute::IndexSemantic ? Attribute::U32Type
+ : Attribute::F32Type;
+ }
+ att.semantic = static_cast<Q3DSViewer::MeshData::Attribute::Semantic>(semantic);
+ att.componentType = static_cast<Q3DSViewer::MeshData::Attribute::ComponentType>(theCompType);
+ if (semantic != Q3DSGeometry::Attribute::IndexSemantic)
+ att.offset = d_ptr->getNextAttributeOffset();
+
+ d_ptr->m_meshData.m_attributeCount++;
+ d_ptr->m_meshData.m_stride = d_ptr->getNextAttributeOffset();
+}
+
+void Q3DSGeometry::addAttribute(const Q3DSGeometry::Attribute &att)
+{
+ addAttribute(att.semantic, att.componentType);
+}
+
+Q3DSGeometry::Attribute Q3DSGeometry::attribute(int idx) const
+{
+ Attribute att;
+ att.semantic = static_cast<Q3DSGeometry::Attribute::Semantic>(
+ d_ptr->m_meshData.m_attributes[idx].semantic);
+ att.componentType = static_cast<Q3DSGeometry::Attribute::ComponentType>(
+ d_ptr->m_meshData.m_attributes[idx].componentType);
+ return att;
+}
+
+Q3DSGeometry::PrimitiveType Q3DSGeometry::primitiveType() const
+{
+ return static_cast<Q3DSGeometry::PrimitiveType>(d_ptr->m_meshData.m_primitiveType);
+}
+
+void Q3DSGeometry::setPrimitiveType(Q3DSGeometry::PrimitiveType type)
+{
+ d_ptr->m_meshData.m_primitiveType = static_cast<Q3DSViewer::MeshData::PrimitiveType>(type);
+}
+
+void Q3DSGeometry::clear()
+{
+ d_ptr->m_meshData.clear();
+}
+
+Q3DSGeometryPrivate::Q3DSGeometryPrivate(Q3DSGeometry *parent)
+ : q_ptr(parent)
+{
+}
+
+Q3DSGeometryPrivate::~Q3DSGeometryPrivate()
+{
+}
+
+int Q3DSGeometryPrivate::getNextAttributeOffset() const
+{
+ int retval = 0;
+ for (int i = 0; i < m_meshData.m_attributeCount; ++i) {
+ if (m_meshData.m_attributes[i].semantic != Q3DSViewer::MeshData::Attribute::IndexSemantic) {
+ retval += m_meshData.m_attributes[i].typeSize()
+ * m_meshData.m_attributes[i].componentCount();
+ }
+ }
+ return retval;
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/q3dsgeometry.h b/src/api/studio3d/q3dsgeometry.h
new file mode 100644
index 0000000..b9b66e9
--- /dev/null
+++ b/src/api/studio3d/q3dsgeometry.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSGEOMETRY_H
+#define Q3DSGEOMETRY_H
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qbytearray.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSGeometryPrivate;
+
+class Q_STUDIO3D_EXPORT Q3DSGeometry
+{
+public:
+ Q_DECLARE_PRIVATE(Q3DSGeometry)
+
+ // All enums must match the ones defined by MeshData::Attribute struct in Qt3DSViewerApp.h
+ enum PrimitiveType {
+ UnknownType = 0,
+ Points,
+ LineStrip,
+ LineLoop,
+ Lines,
+ TriangleStrip,
+ TriangleFan,
+ Triangles, // Default primitive type
+ Patches
+ };
+
+ struct Attribute {
+ enum Semantic {
+ UnknownSemantic = 0,
+ IndexSemantic,
+ PositionSemantic, // attr_pos
+ NormalSemantic, // attr_norm
+ TexCoordSemantic, // attr_uv0
+ TangentSemantic, // attr_textan
+ BinormalSemantic // attr_binormal
+ };
+ enum ComponentType {
+ DefaultType = 0,
+ U8Type,
+ I8Type,
+ U16Type,
+ I16Type,
+ U32Type, // Default for IndexSemantic
+ I32Type,
+ U64Type,
+ I64Type,
+ F16Type,
+ F32Type, // Default for other semantics
+ F64Type
+ };
+ Semantic semantic = PositionSemantic;
+ ComponentType componentType = DefaultType;
+ };
+
+ explicit Q3DSGeometry();
+ virtual ~Q3DSGeometry();
+
+ void setVertexData(const QByteArray &data);
+ void setIndexData(const QByteArray &data);
+
+ const QByteArray &vertexBuffer() const;
+ QByteArray &vertexBuffer();
+ const QByteArray &indexBuffer() const;
+ QByteArray &indexBuffer();
+
+ int attributeCount() const;
+ void addAttribute(Attribute::Semantic semantic,
+ Attribute::ComponentType componentType = Attribute::DefaultType);
+ void addAttribute(const Attribute &att);
+ Attribute attribute(int idx) const;
+
+ PrimitiveType primitiveType() const;
+ void setPrimitiveType(PrimitiveType type);
+
+ void clear();
+
+protected:
+ Q_DISABLE_COPY(Q3DSGeometry)
+ Q3DSGeometryPrivate *d_ptr;
+
+ friend class Q3DSPresentation;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSGEOMETRY_H
diff --git a/src/api/studio3d/q3dsgeometry_p.h b/src/api/studio3d/q3dsgeometry_p.h
new file mode 100644
index 0000000..586b0d7
--- /dev/null
+++ b/src/api/studio3d/q3dsgeometry_p.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSGEOMETRY_P_H
+#define Q3DSGEOMETRY_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dsgeometry.h"
+#include "Qt3DSViewerApp.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q_STUDIO3D_EXPORT Q3DSGeometryPrivate
+{
+ Q_DECLARE_PUBLIC(Q3DSGeometry)
+public:
+ explicit Q3DSGeometryPrivate(Q3DSGeometry *parent);
+ virtual ~Q3DSGeometryPrivate();
+
+ Q3DSViewer::MeshData &meshData() { return m_meshData; }
+
+private:
+ int getNextAttributeOffset() const;
+
+ Q3DSGeometry *q_ptr;
+ Q3DSViewer::MeshData m_meshData;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSGEOMETRY_P_H
diff --git a/src/api/studio3d/q3dsimagesequencegenerator.cpp b/src/api/studio3d/q3dsimagesequencegenerator.cpp
new file mode 100644
index 0000000..d0b8251
--- /dev/null
+++ b/src/api/studio3d/q3dsimagesequencegenerator.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsimagesequencegenerator_p.h"
+#include "q3dsimagesequencegeneratorthread_p.h"
+
+#ifndef Q_OS_ANDROID
+bool Q3DSImageSequenceGenerator::generateImageSequence(
+ const QString &presentation, qreal start, qreal end, qreal fps, qreal frameInterval,
+ int width, int height, const QString &outPath, const QString &outFile)
+{
+ Q3DSImageSequenceGeneratorThread *thread = new Q3DSImageSequenceGeneratorThread;
+
+ connect(thread, &Q3DSImageSequenceGeneratorThread::generationFinished,
+ this, &Q3DSImageSequenceGenerator::finished);
+
+ bool success = thread->initialize(presentation, start, end, fps, frameInterval, width, height,
+ outPath, outFile);
+
+ if (success) {
+ connect(thread, &Q3DSImageSequenceGeneratorThread::progress,
+ this, &Q3DSImageSequenceGenerator::progress);
+ thread->start();
+ } else {
+ delete thread;
+ }
+
+ return success;
+}
+#endif
diff --git a/src/api/studio3d/q3dsimagesequencegenerator_p.h b/src/api/studio3d/q3dsimagesequencegenerator_p.h
new file mode 100644
index 0000000..bc56fb1
--- /dev/null
+++ b/src/api/studio3d/q3dsimagesequencegenerator_p.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSIMAGE_SEQUENCE_GENERATOR_H
+#define Q3DSIMAGE_SEQUENCE_GENERATOR_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qobject.h>
+#ifndef Q_OS_ANDROID
+QT_BEGIN_NAMESPACE
+
+class Q_STUDIO3D_EXPORT Q3DSImageSequenceGenerator : public QObject
+{
+ Q_OBJECT
+public:
+ Q3DSImageSequenceGenerator() {}
+ virtual ~Q3DSImageSequenceGenerator() {}
+
+ bool generateImageSequence(const QString &presentation, qreal start, qreal end,
+ qreal fps, qreal frameInterval, int width, int height,
+ const QString &outPath, const QString &outFile);
+Q_SIGNALS:
+ void progress(int totalFrames, int frameNumber);
+ void finished(bool success, const QString &details);
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSIMAGE_SEQUENCE_GENERATOR_H
+#endif
diff --git a/src/api/studio3d/q3dsimagesequencegeneratorthread.cpp b/src/api/studio3d/q3dsimagesequencegeneratorthread.cpp
new file mode 100644
index 0000000..0968e3f
--- /dev/null
+++ b/src/api/studio3d/q3dsimagesequencegeneratorthread.cpp
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsimagesequencegeneratorthread_p.h"
+#include "q3dssurfaceviewer.h"
+#include "q3dspresentation.h"
+#include "q3dsviewersettings.h"
+
+#include <QtGui/qopenglcontext.h>
+#include <QtGui/qopenglfunctions.h>
+#include <QtGui/qoffscreensurface.h>
+#include <QtGui/qopenglframebufferobject.h>
+#include <QtCore/qfileinfo.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qdebug.h>
+#include <QtCore/qmath.h>
+
+bool Q3DSImageSequenceGeneratorThread::initialize(
+ const QString &presentation, qreal start, qreal end, qreal fps, qreal frameInterval,
+ int width, int height, const QString &outPath, const QString &outFile)
+{
+ QFileInfo fileInfo(presentation);
+ if (!fileInfo.exists()) {
+ QString error = QObject::tr("File not found: '%1'").arg(presentation);
+ qWarning() << "Generating image sequence failed -" << error;
+ Q_EMIT generationFinished(false, error);
+ return false;
+ }
+
+ m_outputFileName = QStringLiteral("%2/%1_%3.png");
+ if (outFile.isEmpty()) {
+ m_outputFileName = m_outputFileName.arg(fileInfo.baseName())
+ .arg(outPath).arg(QStringLiteral("%1"));
+ } else {
+ m_outputFileName = m_outputFileName.arg(outFile).arg(outPath).arg(QStringLiteral("%1"));
+ }
+
+ m_sourceUrl = QUrl::fromLocalFile(fileInfo.absoluteFilePath());
+
+ QSurfaceFormat format;
+ format.setDepthBufferSize(24);
+ format.setStencilBufferSize(8);
+
+ m_context = new QOpenGLContext;
+ m_context->setFormat(format);
+ if (!m_context->create()) {
+ QString error = QObject::tr("Failed to create context");
+ qWarning() << "Generating image sequence failed -" << error;
+ Q_EMIT generationFinished(false, error);
+ return false;
+ }
+
+ m_surface = new QOffscreenSurface;
+ m_surface->setFormat(m_context->format());
+ m_surface->create();
+
+ m_mainThread = QThread::currentThread();
+ m_surface->moveToThread(this);
+ m_context->moveToThread(this);
+
+ m_start = start;
+ m_end = end;
+ m_fps = fps;
+ m_frameInterval = frameInterval;
+ m_width = width;
+ m_height = height;
+
+ return true;
+}
+
+Q3DSImageSequenceGeneratorThread::Q3DSImageSequenceGeneratorThread()
+ : m_start(0)
+ , m_end(10000)
+ , m_fps(60)
+ , m_frameInterval(16.666667)
+ , m_width(1920)
+ , m_height(1080)
+ , m_surface(nullptr)
+ , m_context(nullptr)
+{
+}
+
+Q3DSImageSequenceGeneratorThread::~Q3DSImageSequenceGeneratorThread() {
+ delete m_context;
+ delete m_surface;
+}
+
+void Q3DSImageSequenceGeneratorThread::run() {
+ if (!m_context->makeCurrent(m_surface)) {
+ QString error = QObject::tr("Couldn't make context current.");
+ qWarning() << "Generating image sequence failed -" << error;
+ Q_EMIT generationFinished(false, error);
+ cleanup();
+ return;
+ }
+
+ const QSize size(m_width, m_height);
+ QOpenGLFramebufferObject fbo(size, QOpenGLFramebufferObject::CombinedDepthStencil);
+
+ Q3DSSurfaceViewer viewer;
+ viewer.presentation()->setSource(m_sourceUrl);
+ viewer.settings()->setScaleMode(Q3DSViewerSettings::ScaleModeFill);
+
+ viewer.setUpdateInterval(-1);
+ viewer.setAutoSize(false);
+ viewer.setSize(size);
+
+ if (!viewer.create(m_surface, m_context, fbo.handle())) {
+ QString error = QObject::tr("Viewer initialization failed.");
+ qWarning() << "Generating image sequence failed -" << error;
+ Q_EMIT generationFinished(false, error);
+ cleanup();
+ return;
+ }
+
+ if (m_frameInterval <= 0)
+ m_frameInterval = 1000.0 / m_fps;
+
+ // Presentations always assume you want to start animating at time zero and set a local
+ // offset to global time when they render the first frame. This means we need to always
+ // render a frame at global time zero first.
+ if (qRound(m_start) != 0) {
+ viewer.presentation()->setGlobalAnimationTime(0);
+ viewer.update();
+ }
+
+ // Add a bit of time to the end time to ensure we don't lose the last frame to rounding errors
+ m_end += m_frameInterval / 10000.0;
+
+ // Ensure directory exists
+ QFileInfo fi(m_outputFileName);
+ QDir dir = fi.absoluteDir();
+ dir.mkpath(".");
+
+ int frameCount = 0;
+ int totalFrames = qCeil((m_end - m_start) / m_frameInterval);
+ for (qreal t = m_start; t <= m_end; t += m_frameInterval) {
+ ++frameCount;
+ viewer.presentation()->setGlobalAnimationTime(qRound64(t));
+ viewer.update();
+ if (!fbo.toImage().save(m_outputFileName.arg(frameCount))) {
+ QString error = QObject::tr("Failed to write output file: '%1'")
+ .arg(m_outputFileName.arg(frameCount));
+ qWarning() << "Generating image sequence failed -" << error;
+ Q_EMIT generationFinished(false, error);
+ cleanup();
+ return;
+ }
+ Q_EMIT progress(totalFrames, frameCount);
+ }
+
+ Q_EMIT generationFinished(true, m_outputFileName.arg("*"));
+ cleanup();
+}
+
+void Q3DSImageSequenceGeneratorThread::cleanup()
+{
+ m_context->doneCurrent();
+ delete m_context;
+ m_context = nullptr;
+ // Surface needs to be deleted in the thread it was created in
+ m_surface->moveToThread(m_mainThread);
+ deleteLater();
+}
diff --git a/src/api/studio3d/q3dsimagesequencegeneratorthread_p.h b/src/api/studio3d/q3dsimagesequencegeneratorthread_p.h
new file mode 100644
index 0000000..45869a6
--- /dev/null
+++ b/src/api/studio3d/q3dsimagesequencegeneratorthread_p.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSIMAGE_SEQUENCE_GENERATOR_THREAD_H
+#define Q3DSIMAGE_SEQUENCE_GENERATOR_THREAD_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qthread.h>
+#include <QtCore/qurl.h>
+
+QT_BEGIN_NAMESPACE
+
+class QOffscreenSurface;
+class QOpenGLContext;
+
+class Q3DSImageSequenceGeneratorThread : public QThread
+{
+ Q_OBJECT
+public:
+ Q3DSImageSequenceGeneratorThread();
+ virtual ~Q3DSImageSequenceGeneratorThread();
+
+ bool initialize(const QString &presentation, qreal start, qreal end,
+ qreal fps, qreal frameInterval, int width, int height,
+ const QString &outPath, const QString &outFile);
+
+Q_SIGNALS:
+ void progress(int totalFrames, int frameNumber);
+ void generationFinished(bool success, const QString &details);
+
+protected:
+ void run() override;
+
+private:
+ void cleanup();
+
+ QUrl m_sourceUrl;
+ qreal m_start;
+ qreal m_end;
+ qreal m_fps;
+ qreal m_frameInterval;
+ int m_width;
+ int m_height;
+ QString m_outputFileName;
+
+ QOffscreenSurface *m_surface;
+ QOpenGLContext *m_context;
+ QThread *m_mainThread;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSIMAGE_SEQUENCE_GENERATOR_THREAD_H
diff --git a/src/api/studio3d/q3dspresentation.cpp b/src/api/studio3d/q3dspresentation.cpp
new file mode 100644
index 0000000..c07922c
--- /dev/null
+++ b/src/api/studio3d/q3dspresentation.cpp
@@ -0,0 +1,2100 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dspresentation_p.h"
+#include "q3dssceneelement_p.h"
+#include "q3dscommandqueue_p.h"
+#include "viewerqmlstreamproxy_p.h"
+#include "q3dsdatainput_p.h"
+#include "q3dsdataoutput_p.h"
+#include "q3dsgeometry_p.h"
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qsettings.h>
+#include <QtCore/qcoreapplication.h>
+#include <QtGui/qevent.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class Q3DSPresentation
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+
+ \brief Represents a Qt 3D Studio presentation.
+
+ This class provides properties and methods for controlling a
+ presentation.
+
+ Qt 3D Studio supports multiple presentations in one project. There
+ is always a main presentation and zero or more
+ subpresentations. The subpresentations are composed into the
+ main presentations either as contents of Qt 3D Studio layers or as
+ texture maps.
+
+ In the filesystem each presentation corresponds to one \c{.uip}
+ presentation file. When present, the \c{.uia} project file ties
+ these together by specifying a name for each of the
+ (sub-)presentations and specifies which one is the main one.
+
+ The \c{.uia} project also defines \l{DataInput}s and
+ \l{DataOutput}s that are exported by the presentations.
+ \l{DataInput}s provide a way to provide input to the presentation
+ to e.g. control a timeline of a subpresentation from code.
+ \c{DataOutput}s provide a way to get notified when an attribute
+ is changed in the presentation by animation timeline,
+ by behavior scripts or by a \l{DataInput}.
+
+ From the API point of view Q3DSPresentation corresponds to the
+ main presentation. The source property can refer either to a
+ \c{.uia} or \c{.uip} file. When specifying a file with \c{.uip}
+ extension and a \c{.uia} is present with the same name, the
+ \c{.uia} is loaded automatically and thus sub-presentation
+ information is available regardless.
+
+ \note This class should not be instantiated directly when working with the
+ C++ APIs. Q3DSSurfaceViewer and Q3DSWidget create a Q3DSPresentation
+ instance implicitly. This can be queried via
+ Q3DSSurfaceViewer::presentation() or Q3DSWidget::presentation().
+ */
+
+/*!
+ Constructs a new Q3DSPresentation with the given \a parent.
+ */
+Q3DSPresentation::Q3DSPresentation(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSPresentationPrivate(this))
+{
+}
+
+/*!
+ Destructor.
+ */
+Q3DSPresentation::~Q3DSPresentation()
+{
+}
+
+/*!
+ \qmlproperty string Presentation::source
+
+ Holds the name of the main presentation file (\c{*.uia} or
+ \c{*.uip}). This may be either a local file or qrc URL.
+
+ The names of all further assets (image files for texture maps, qml
+ behavior scripts, mesh files) will be resolved relative to the
+ location of the presentation, unless they use absolute paths. This
+ allows bundling all assets next to the presentation in the Qt
+ resource system.
+
+ Currently set \c{variantList} property will modify which variant groups
+ and tags are loaded from the presentations. See
+ Q3DSPresentation::variantList property.
+*/
+
+/*!
+ \property Q3DSPresentation::source
+
+ Holds the name of the main presentation file (\c{*.uia} or
+ \c{*.uip}). This may be either a local file or qrc URL.
+
+ The names of all further assets (image files for texture maps, qml
+ behavior scripts, mesh files) will be resolved relative to the
+ location of the presentation, unless they use absolute paths. This
+ allows bundling all assets next to the presentation in the Qt
+ resource system.
+
+ Currently set variantList will modify which variant groups
+ and tags are loaded from the presentations. See
+ Q3DSPresentation::variantList property.
+*/
+QUrl Q3DSPresentation::source() const
+{
+ return d_ptr->m_source;
+}
+
+void Q3DSPresentation::setSource(const QUrl &source)
+{
+ if (d_ptr->m_source != source) {
+ d_ptr->setSource(source);
+ Q_EMIT sourceChanged(source);
+ }
+}
+
+/*!
+ \qmlproperty list<string> Presentation::variantList
+
+ Holds a list of (variant group):(variant) tags that are loaded when the
+ \c{source} property is set. If this list is left empty (default), no variant
+ filtering is applied and all items are loaded regardless of variant tags in
+ the presentation. Variant mechanism allows one presentation project to
+ contain multiple variants of the presentation and the decision which variant
+ set is loaded is determined during runtime based on the \c{variantList}.
+
+ Variants are divided to variant groups, e.g. one variant group could be
+ \c{region} and the variants within that group could be e.g. \c{US, EU, CH}.
+ Another variant group could be e.g. \c{power} and variants within that could
+ be e.g. \c{gas, electric, diesel}. To filter in this example an electric
+ variant for the EU region, the variantList needs to contain two strings
+ "region:EU" and "power:electric". Also of course the presentation project
+ needs to contain these variant groups and tags applied appropriately to the
+ presentation content.
+
+ When variant filters are used, the decision what gets loaded and what is not
+ loaded is based on checking every item in the presentation:
+ \list
+ \li If the item has no variant tags, it will be loaded.
+ \li If the item has no tags defined for the checked variant group(s),
+ it will be loaded.
+ \li If the item has tag(s) for the variant group, any of those tags must
+ match any of the variants defined in the filter for that group.
+ \endlist
+
+ If the item doesn't fulfill the above rules it will not be loaded.
+*/
+
+/*!
+ \property Q3DSPresentation::variantList
+
+ Holds a list of (variant group):(variant) tags that are loaded when the
+ \c{source} property is set. If this list is left empty (default), no variant
+ filtering is applied and all items are loaded regardless of variant tags in
+ the presentation. Variant mechanism allows one presentation project to
+ contain multiple variants of the presentation and the decision which variant
+ set is loaded is determined during runtime based on the \c{variantList}.
+
+ Variants are divided to variant groups, e.g. one variant group could be
+ \c{region} and the variants within that group could be e.g. \c{US, EU, CH}.
+ Another variant group could be e.g. \c{power} and variants within that could
+ be e.g. \c{gas, electric, diesel}. To filter in this example an electric
+ variant for the EU region, the variantList needs to contain two strings
+ "region:EU" and "power:electric". Also of course the presentation project
+ needs to contain these variant groups and tags applied appropriately to the
+ presentation content.
+
+ When variant filters are used, the decision what gets loaded and what is not
+ loaded is based on checking every item in the presentation:
+ \list
+ \li If the item has no variant tags, it will be loaded.
+ \li If the item has no tags defined for the checked variant group(s),
+ it will be loaded.
+ \li If the item has tag(s) for the variant group, any of those tags must
+ match any of the variants defined in the filter for that group.
+ \endlist
+
+ If the item doesn't fulfill the above rules it will not be loaded.
+*/
+QStringList Q3DSPresentation::variantList() const
+{
+ return d_ptr->m_variantList;
+}
+
+void Q3DSPresentation::setVariantList(const QStringList &variantList)
+{
+ if (d_ptr->m_variantList != variantList) {
+ d_ptr->setVariantList(variantList);
+ Q_EMIT variantListChanged(variantList);
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSPresentation::registerElement(Q3DSElement *element)
+{
+ d_ptr->registerElement(element);
+}
+
+/*!
+ \internal
+ */
+void Q3DSPresentation::unregisterElement(Q3DSElement *element)
+{
+ d_ptr->unregisterElement(element);
+}
+
+/*!
+ \internal
+ */
+Q3DSElement *Q3DSPresentation::registeredElement(const QString &elementPath) const
+{
+ return d_ptr->m_elements.value(elementPath, nullptr);
+}
+
+/*!
+ \internal
+ */
+void Q3DSPresentation::registerDataInput(Q3DSDataInput *dataInput)
+{
+ d_ptr->registerDataInput(dataInput);
+}
+
+/*!
+ \internal
+ */
+void Q3DSPresentation::unregisterDataInput(Q3DSDataInput *dataInput)
+{
+ d_ptr->unregisterDataInput(dataInput);
+}
+
+/*!
+ \internal
+ */
+Q3DSDataInput *Q3DSPresentation::registeredDataInput(const QString &name) const
+{
+ return d_ptr->m_dataInputs.value(name, nullptr);
+}
+
+/*!
+ \internal
+ */
+void Q3DSPresentation::registerDataOutput(Q3DSDataOutput *dataOutput)
+{
+ d_ptr->registerDataOutput(dataOutput);
+}
+
+/*!
+ \internal
+ */
+void Q3DSPresentation::unregisterDataOutput(Q3DSDataOutput *dataOutput)
+{
+ d_ptr->unregisterDataOutput(dataOutput);
+}
+
+/*!
+ \internal
+ */
+Q3DSDataOutput *Q3DSPresentation::registeredDataOutput(const QString &name) const
+{
+ return d_ptr->m_dataOutputs.value(name, nullptr);
+}
+
+/*!
+ Returns a list of datainputs defined for this presentation. Use setDataInputValue()
+ interface to set a datainput value using datainput name, or call Q3DSDataInput::setValue
+ directly for a specific datainput.
+
+ \sa setDataInputValue
+ \sa Q3DSDataInput
+ */
+QVector<Q3DSDataInput *> Q3DSPresentation::dataInputs() const
+{
+ QVector<Q3DSDataInput *> ret;
+ // Just return local datainput list
+ const auto datainputs = d_ptr->m_dataInputs;
+ for (const auto &it : datainputs)
+ ret.append(it);
+
+ return ret;
+}
+
+/*!
+ \qmlmethod var Presentation::getDataInputs
+ Returns a list of datainputs defined for this presentation. Use setDataInputValue()
+ interface to set a datainput value using datainput name, or call Q3DSDataInput::setValue
+ directly for a specific datainput.
+
+ \sa DataInput
+ */
+
+/*!
+ Returns a list of datainputs defined for this presentation. Use setDataInputValue()
+ interface to set a datainput value using datainput name, or call Q3DSDataInput::setValue
+ directly for a specific datainput.
+
+ \sa setDataInputValue
+ \sa Q3DSDataInput
+ */
+QVariantList Q3DSPresentation::getDataInputs() const
+{
+ QVariantList ret;
+ const auto datainputs = dataInputs();
+
+ for (const auto &it : datainputs)
+ ret.append(QVariant::fromValue(it));
+
+ return ret;
+}
+
+/*!
+ Returns a list of datainputs defined for this presentation that have the specified
+ \a metadataKey.
+
+ \sa setDataInputValue
+ \sa Q3DSDataInput
+ */
+
+/*!
+ \qmlmethod var Presentation::getDataInputs
+ Returns a list of datainputs defined for this presentation that have the specified
+ \a metadataKey.
+
+ \sa DataInput
+ */
+QVariantList Q3DSPresentation::getDataInputs(const QString &metadataKey) const
+{
+ QVariantList ret;
+ const auto datainputs = dataInputs(metadataKey);
+
+ for (const auto &it : datainputs)
+ ret.append(QVariant::fromValue(it));
+
+ return ret;
+}
+
+/*!
+ Returns a list of datainputs defined for this presentation that have the specified
+ \a metadataKey.
+
+ \sa setDataInputValue
+ \sa Q3DSDataInput
+ */
+QVector<Q3DSDataInput *> Q3DSPresentation::dataInputs(const QString &metadataKey) const
+{
+ // Defer to presentation item as we want to read metadata from viewer app whenever
+ // possible.
+ return d_ptr->dataInputs(metadataKey);
+}
+
+/*!
+ Returns a list of dataoutputs defined for this presentation. Use Qt's connect() method
+ to connect slots to the valueChanged() signal in the required \l{DataOutput}s to get notified
+ when the value tracked by the DataOutput is changed.
+
+ \sa Q3DSDataOutput
+ */
+QVector<Q3DSDataOutput *> Q3DSPresentation::dataOutputs() const
+{
+ QVector<Q3DSDataOutput *> ret;
+ const auto datainputs = d_ptr->m_dataOutputs;
+ for (const auto &it : datainputs)
+ ret.append(it);
+
+ return ret;
+}
+
+/*!
+ \qmlmethod var Presentation::getDataOutputs
+
+ Returns a list of dataoutputs defined for this presentation. Connect slots to the
+ \c{valueChanged()} signal in the required \l{DataOutput}s to get notified
+ when the value tracked by the DataOutput is changed.
+
+ \sa SDataOutput
+ */
+/*!
+ * \brief Q3DSPresentation::getDataOutputs Returns \l{DataOutput}s.
+ Returns a list of dataoutputs defined for this presentation. Use Qt's connect() method
+ to connect slots to the valueChanged() signal in the required \l{DataOutput}s to get notified
+ when the value tracked by the DataOutput is changed.
+
+ \sa Q3DSDataOutput
+ */
+QVariantList Q3DSPresentation::getDataOutputs() const
+{
+ QVariantList ret;
+ const auto dataoutputs = dataOutputs();
+
+ for (const auto &it : dataoutputs)
+ ret.append(QVariant::fromValue(it));
+
+ return ret;
+}
+
+/*!
+ \qmlproperty bool Presentation::delayedLoading
+
+ This property controls whether the presentation resources are loaded while loading
+ the presentation(false) or afterwards when they are actually used in the presentation(true).
+ The resources are loaded per slide basis so that all resources required by a slide will be
+ loaded at once.
+
+ The resources can be images, subpresentations, materials, effects and meshes.
+
+ Default is \c{false}.
+ */
+
+/*!
+ \property Q3DSPresentation::delayedLoading
+
+ This property controls whether the presentation resources are loaded while loading
+ the presentation(false) or afterwards when they are actually used in the presentation(true).
+ The resources are loaded per slide basis so that all resources required by a slide will be
+ loaded at once.
+
+ The resources can be images, subpresentations, materials, effects and meshes.
+
+ Default is \c{false}.
+ */
+bool Q3DSPresentation::delayedLoading() const
+{
+ return d_ptr->m_delayedLoading;
+}
+
+void Q3DSPresentation::setDelayedLoading(bool enable)
+{
+ if (d_ptr->m_delayedLoading != enable) {
+ d_ptr->setDelayedLoading(enable);
+ Q_EMIT delayedLoadingChanged(enable);
+ }
+}
+
+/*!
+ \qmlmethod Presentation::preloadSlide
+ Preloads slide resources to memory. All resources required by the given slide will be
+ loaded in the background. This function has effect only when delayed loading is enabled.
+ \param elementPath
+ */
+/*!
+ \brief Q3DSPresentation::preloadSlide
+ Preloads slide resources to memory. All resources required by the given slide will be
+ loaded in the background. This function has effect only when delayed loading is enabled.
+ \param elementPath
+ */
+void Q3DSPresentation::preloadSlide(const QString &elementPath)
+{
+ if (d_ptr->m_viewerApp)
+ d_ptr->m_viewerApp->preloadSlide(elementPath);
+ else if (d_ptr->m_commandQueue)
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_PreloadSlide);
+}
+
+/*!
+ \qmlmethod Presentation::unloadSlide
+ Unloads slide resources from memory. If the slide is current, then the resources are unloaded
+ when the slide is changed. This function has effect only when delayed loading is enabled.
+ \param elementPath
+ */
+
+/*!
+ \brief Q3DSPresentation::unloadSlide
+ Unloads slide resources from memory. If the slide is current, then the resources are unloaded
+ when the slide is changed. This function has effect only when delayed loading is enabled.
+ \param elementPath
+ */
+void Q3DSPresentation::unloadSlide(const QString &elementPath)
+{
+ if (d_ptr->m_viewerApp)
+ d_ptr->m_viewerApp->unloadSlide(elementPath);
+ else if (d_ptr->m_commandQueue)
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_UnloadSlide);
+}
+
+/*!
+ This API is for backwards compatibility. We recommend using \l{DataInput}s to control
+ slide changes. \l{DataInput} provides stronger contract between the design and
+ code as it avoids use of elementPath (a reference to design's internal structure).
+
+ Requests a time context (a Scene or a Component object) to change
+ to a specific slide by \a index. If the context is already on that
+ slide, playback will start over.
+
+ If \a elementPath points to a time context, that element is
+ controlled. For all other element types the time context owning
+ that element is controlled instead. You can target the command to
+ a specific sub-presentation by adding "SubPresentationId:" in
+ front of the element path, for example \c{"SubPresentationOne:Scene"}.
+ */
+void Q3DSPresentation::goToSlide(const QString &elementPath, unsigned int index)
+{
+ if (d_ptr->m_viewerApp) {
+ const QByteArray path(elementPath.toUtf8());
+ d_ptr->m_viewerApp->GoToSlideByIndex(path, index);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_GoToSlide, int(index));
+ }
+}
+
+/*!
+ This API is for backwards compatibility. We recommend using \l{DataInput}s to control
+ slide changes. \l{DataInput} provides stronger contract between the design and
+ code as it avoids use of elementPath (a reference to design's internal structure).
+
+ Requests a time context (a Scene or a Component object) to change
+ to a specific slide by \a name. If the context is already on that
+ slide, playback will start over.
+
+ If \a elementPath points to a time context, that element is
+ controlled. For all other element types the time context owning
+ that element is controlled instead. You can target the command to
+ a specific sub-presentation by adding "SubPresentationId:" in
+ front of the element path, for example \c{"SubPresentationOne:Scene"}.
+ */
+void Q3DSPresentation::goToSlide(const QString &elementPath, const QString &name)
+{
+ if (d_ptr->m_viewerApp) {
+ const QByteArray path(elementPath.toUtf8());
+ const QByteArray byteName(name.toUtf8());
+ d_ptr->m_viewerApp->GoToSlideByName(path, byteName);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_GoToSlideByName, name);
+ }
+}
+
+/*!
+ This API is for backwards compatibility. We recommend using \l{DataInput}s to control
+ slide changes. \l{DataInput} provides stronger contract between the design and
+ code as it avoids use of elementPath (a reference to design's internal structure).
+
+ Requests a time context (a Scene or a Component object) to change to the
+ next or previous slide, depending on the value of \a next. If the context
+ is already at the last or first slide, \a wrap defines if wrapping over to
+ the first or last slide, respectively, occurs.
+
+ If \a elementPath points to a time context, that element is controlled. For
+ all other element types the time context owning that element is controlled
+ instead. You can target the command to a specific sub-presentation by
+ adding "SubPresentationId:" in front of the element path, for example
+ \c{"SubPresentationOne:Scene"}.
+ */
+void Q3DSPresentation::goToSlide(const QString &elementPath, bool next, bool wrap)
+{
+ if (d_ptr->m_viewerApp) {
+ const QByteArray path(elementPath.toUtf8());
+ d_ptr->m_viewerApp->GoToSlideRelative(path, next, wrap);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_GoToSlideRelative,
+ int(next), int(wrap));
+ }
+}
+
+/*!
+ This API is for backwards compatibility. We recommend using \l{DataInput}s to control
+ slide changes. \l{DataInput} provides stronger contract between the design and
+ code as it avoids use of elementPath (a reference to design's internal structure).
+
+ Moves the timeline for a time context (a Scene or a Component element) to a
+ specific position. The position is given in seconds in \a timeSeconds.
+
+ If \a elementPath points to a time context, that element is
+ controlled. For all other element types the time context owning
+ that element is controlled instead. You can target the command to
+ a specific sub-presentation by adding "SubPresentationId:" in
+ front of the element path, for example
+ \c{"SubPresentationOne:Scene"}.
+
+ The behavior when specifying a time before 0 or after the end time
+ for the current slide depends on the play mode of the slide:
+
+ \list
+ \li \c{Stop at End} - values outside the valid time range instead clamp to the boundaries.
+ For example, going to time -5 is the same as going to time 0.
+ \li \c{Looping} - values outside the valid time range mod into the valid range. For example,
+ going to time -4 on a 10 second slide is the same as going to time 6.
+ \li \c{Ping Pong} - values outside the valid time range bounce off the ends. For example,
+ going to time -4 is the same as going to time 4 (assuming the time context is at least 4 seconds
+ long), while going to time 12 on a 10 second slide is the same as going to time 8.
+ \li \c{Ping} - values less than 0 are treated as time 0, while values greater than the endtime
+ bounce off the end (eventually hitting 0.)
+ \endlist
+ */
+void Q3DSPresentation::goToTime(const QString &elementPath, float time)
+{
+ if (d_ptr->m_viewerApp) {
+ const QByteArray path(elementPath.toUtf8());
+ d_ptr->m_viewerApp->GoToTime(path, time);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_GoToTime, time);
+ }
+}
+
+/*!
+ This API is for backwards compatibility. We recommend using \l{DataInput}s to control
+ attributes in the presentation. \l{DataInput} provides stronger contract between the
+ design and code as it avoids use of elementPath (a reference to design's
+ internal structure).
+
+ Sets the \a value of an attribute (property) on the object specified by
+ \a elementPath. The \a attributeName is the \l{Attribute Names}{scripting
+ name} of the attribute.
+
+ An element path refers to an object in the scene by name, for example,
+ \c{Scene.Layer.Camera}. Here the right camera object gets chosen even if
+ the scene contains other layers with the default camera names (for instance
+ \c{Scene.Layer2.Camera}).
+
+ To reference an object stored in a property of another object, the dot
+ syntax can be used. The most typical example of this is changing the source
+ of a texture map by changing the \c sourcepath property on the object
+ selected by \c{SomeMaterial.diffusemap}.
+
+ To access an object in a sub-presentation, prepend the name of the
+ sub-presentation followed by a colon, for example,
+ \c{SubPresentationOne:Scene.Layer.Camera}.
+ */
+void Q3DSPresentation::setAttribute(const QString &elementPath, const QString &attributeName,
+ const QVariant &value)
+{
+ if (d_ptr->m_viewerApp) {
+ const QByteArray path(elementPath.toUtf8());
+ const QByteArray name(attributeName.toUtf8());
+
+ QByteArray valueStr;
+ float valueFloat;
+
+ const void *theValue = nullptr;
+ switch (static_cast<QMetaType::Type>(value.type())) {
+ case QMetaType::Bool:
+ case QMetaType::Int:
+ case QMetaType::Double:
+ case QMetaType::Float:
+ valueFloat = value.toFloat();
+ theValue = &valueFloat;
+ break;
+ case QMetaType::QString:
+ default: // Try string for other types
+ valueStr = value.toString().toUtf8();
+ theValue = valueStr.constData();
+ break;
+ }
+ d_ptr->m_viewerApp->SetAttribute(path, name, (char *)theValue);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_SetAttribute,
+ attributeName, value);
+ }
+}
+
+/*!
+ Activate or deactivate the presentation identified by \a id depending
+ on the value of \a active.
+ */
+void Q3DSPresentation::setPresentationActive(const QString &id, bool active)
+{
+ if (d_ptr->m_viewerApp) {
+ const QByteArray presId(id.toUtf8());
+ d_ptr->m_viewerApp->SetPresentationActive(presId, active);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(id, CommandType_SetPresentationActive, active);
+ }
+}
+
+/*!
+ Dispatches a Qt 3D Studio presentation event with \a eventName on
+ scene object specified by \a elementPath. These events provide a
+ way to communicate with the \c .qml based \c{behavior scripts}
+ attached to scene objects since they can register to be notified
+ via Behavior::registerForEvent().
+
+ See setAttribute() for a description of \a elementPath.
+ */
+void Q3DSPresentation::fireEvent(const QString &elementPath, const QString &eventName)
+{
+ if (d_ptr->m_viewerApp) {
+ const QByteArray path(elementPath.toUtf8());
+ const QByteArray name(eventName.toUtf8());
+ d_ptr->m_viewerApp->FireEvent(path, name);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_FireEvent, eventName);
+ }
+}
+
+/*!
+ Set global animation time to manual value specified by \a milliseconds
+ (if non-zero) or resume normal timer (if zero).
+ */
+void Q3DSPresentation::setGlobalAnimationTime(qint64 milliseconds)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->SetGlobalAnimationTime(milliseconds);
+ } else {
+ d_ptr->m_commandQueue->m_globalAnimationTimeChanged = true;
+ d_ptr->m_commandQueue->m_globalAnimationTime = milliseconds;
+ }
+}
+
+/*!
+ Sets the \a value of a data input element \a name in the presentation.
+
+ Data input provides a higher level, designer-driven alternative to
+ Q3DSElement and setAttribute(). Instead of exposing a large set of
+ properties with their internal engine names, data input allows designers to
+ decide which properties should be writable by the application, and can
+ assign custom names to these data input entries, thus forming a
+ well-defined contract between the designer and the developer.
+
+ In addition, data input also allows controlling the time line and the
+ current slide for time context objects (Scene or Component). Therefore it
+ is also an alternative to the goToSlide() and goToTime() family of APIs and
+ to Q3DSSceneElement.
+
+ \sa DataInput
+ */
+void Q3DSPresentation::setDataInputValue(const QString &name, const QVariant &value,
+ Q3DSDataInput::ValueRole valueRole)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->SetDataInputValue(name, value,
+ (qt3ds::runtime::DataInputValueRole)valueRole);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(QString(), CommandType_SetDataInputValue,
+ name, value, static_cast<int>(valueRole));
+ }
+}
+
+/*!
+ Adds a new child element for the element specified by \a parentElementPath to the slide
+ specified with \a slideName. Only model and group element creation is currently supported.
+ The \a properties hash table specifies the name-value pairs of the properties of the new
+ element. The property names are the same the setAttribute() recognizes.
+
+ A referenced material element is also created for the new model element. The source material
+ name can be specified with custom "material" attribute in the \a properties hash.
+ The source material must exist in the same presentation where the element is created.
+
+ The mesh for a model is specified with the \c sourcepath property. This can be a local file
+ path to \c .mesh file, a studio mesh primitive (e.g. \c{#Cube}), or the name of a mesh created
+ dynamically with createMesh().
+
+ A property/properties of the element can be bound to be controlled by an existing datainput.
+ Control bindings can be indicated with custom "controlledproperty" attribute in the
+ \a properties hash. The format for attribute value is "$<datainputname> <attributename>", i.e.
+ "$Datainput_1 rotation $Datainput_2 diffusecolor". If datainput name does not match with
+ any of the datainputs defined in UIA file, binding has no impact.
+
+ The element is ready for use once elementsCreated() signal is received for it.
+
+ \sa createElements
+ \sa createMaterial
+ \sa createMesh
+ \sa elementsCreated
+ \sa setAttribute
+ \sa dataInputs
+ */
+void Q3DSPresentation::createElement(const QString &parentElementPath, const QString &slideName,
+ const QHash<QString, QVariant> &properties)
+{
+ QVector<QHash<QString, QVariant>> theProperties;
+ theProperties << properties;
+ createElements(parentElementPath, slideName, theProperties);
+}
+
+/*!
+ Adds multiple new child elements for the element specified by \a parentElementPath to the slide
+ specified with \a slideName. Element properties are specified in \a properties.
+ For more details, see createElement().
+
+ \sa createElement
+ \sa elementsCreated
+ */
+void Q3DSPresentation::createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->createElements(parentElementPath, slideName, properties);
+ } else if (d_ptr->m_commandQueue) {
+ // We need to copy the properties map as queue takes ownership of it
+ QVector<QHash<QString, QVariant>> *theProperties
+ = new QVector<QHash<QString, QVariant>>(properties);
+ d_ptr->m_commandQueue->queueCommand(parentElementPath, CommandType_CreateElements,
+ slideName, theProperties);
+ }
+}
+
+/*!
+ Deletes the element specified by \a elementPath and all its child elements.
+ Deleting elements is supported only for elements that have been dynamically created with
+ createElement() or createElements().
+
+ \sa deleteElements
+ \sa createElement
+ */
+void Q3DSPresentation::deleteElement(const QString &elementPath)
+{
+ QStringList elementPaths;
+ elementPaths << elementPath;
+ deleteElements(elementPaths);
+}
+
+/*!
+ Deletes multiple elements specified by \a elementPaths and all their child elements.
+ Deleting elements is supported only for elements that have been dynamically created with
+ createElement() or createElements().
+
+ \sa deleteElement
+ */
+void Q3DSPresentation::deleteElements(const QStringList &elementPaths)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->deleteElements(elementPaths);
+ } else if (d_ptr->m_commandQueue) {
+ // We need to copy the list as queue takes ownership of it
+ QStringList *theElementPaths = new QStringList(elementPaths);
+ d_ptr->m_commandQueue->queueCommand(CommandType_DeleteElements, theElementPaths);
+ }
+ for (const auto &elementPath : elementPaths)
+ d_ptr->m_createdElements.removeAll(elementPath);
+}
+
+/*!
+ \qmlproperty list<string> Presentation::createdElements
+
+ This property contains a list of all dynamically created elements on this presentation.
+
+ This property is read-only.
+
+ \note Elements can only be dynamically created via C++ API.
+
+ \sa createElement
+ \sa createElements
+*/
+
+/*!
+ \property Q3DSPresentation::createdElements
+
+ This property contains a list of all dynamically created elements on this presentation.
+
+ This property is read-only.
+
+ \sa createElement
+ \sa createElements
+*/
+QStringList Q3DSPresentation::createdElements() const
+{
+ return d_ptr->m_createdElements;
+}
+
+/*!
+ Creates a material specified by the \a materialDefinition parameter into the subpresentation
+ specified by the \a subPresId parameter. If \a subPresId is empty, the material
+ is created into the main presentation.
+
+ The \a materialDefinition parameter can contain either the file path to a Qt 3D Studio
+ material definition file or the actual material definition in the
+ Qt 3D Studio material definition format. The material definition is a XML file that specifies
+ the material properties. They are not meant to be hand crafted - to create one, simply create
+ a new basic material in the Qt 3D Studio editor and edit the material properties in the
+ inspector. The properties are stored into \c{materialName.materialdef} file in \c materials
+ folder of the project, which you can include into the resources of you application and
+ use with this method.
+
+ After creation, the material can be used for new elements created via createElement() by
+ setting \c material property of the new element to the name of the created material.
+ The material name is specified by the \c name property of the material definition.
+
+ The material is ready for use once materialsCreated() signal is received for it.
+
+ \note Creating materials that utilise custom shaders with mipmapped textures can in some cases
+ corrupt the textures on other elements if the same textures are already used by existing basic
+ materials in the scene, as basic materials do not create mipmaps for their textures.
+ Typical symptom of this is black texture on another element after creating a new element using
+ the custom material.
+
+ \sa createMaterials
+ \sa createElement
+ \sa materialsCreated
+ */
+void Q3DSPresentation::createMaterial(const QString &materialDefinition,
+ const QString &subPresId)
+{
+ QStringList materialDefinitions;
+ materialDefinitions << materialDefinition;
+ createMaterials(materialDefinitions, subPresId);
+}
+
+/*!
+ Creates multiple materials specified by the \a materialDefinitions parameter into the
+ subpresentation specified by the \a subPresId parameter. If \a subPresId is empty,
+ the materials are created into the main presentation.
+
+ For more details, see createMaterial().
+
+ \sa createMaterial
+ \sa materialsCreated
+ */
+void Q3DSPresentation::createMaterials(const QStringList &materialDefinitions,
+ const QString &subPresId)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->createMaterials(subPresId, materialDefinitions);
+ } else if (d_ptr->m_commandQueue) {
+ // We need to copy the list as queue takes ownership of it
+ QStringList *theMaterialDefinitions = new QStringList(materialDefinitions);
+ d_ptr->m_commandQueue->queueCommand(subPresId, CommandType_CreateMaterials,
+ theMaterialDefinitions);
+ }
+}
+
+/*!
+ Deletes the material specified by \a materialName from the presentation.
+ To delete material from a subpresentation, prefix \a materialName with the subpresentation ID
+ similarly to the element paths. For example: \c{"SubPresentationOne:MyMaterial"}.
+
+ Deleting materials is supported only for materials that have been dynamically created with
+ createMaterial() or createMaterials().
+
+ \sa deleteMaterials
+ \sa createMaterial
+ */
+void Q3DSPresentation::deleteMaterial(const QString &materialName)
+{
+ QStringList materialNames;
+ materialNames << materialName;
+ deleteMaterials(materialNames);
+}
+
+/*!
+ Deletes materials specified by \a materialNames from the presentation.
+ To delete material from a subpresentation, prefix the material name with the subpresentation ID
+ similarly to the element paths. For example: \c{"SubPresentationOne:MyMaterial"}.
+
+ Deleting materials is supported only for materials that have been dynamically created with
+ createMaterial() or createMaterials().
+
+ \sa deleteMaterial
+ */
+void Q3DSPresentation::deleteMaterials(const QStringList &materialNames)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->deleteMaterials(materialNames);
+ } else if (d_ptr->m_commandQueue) {
+ // We need to copy the list as queue takes ownership of it
+ QStringList *theMaterialNames = new QStringList(materialNames);
+ d_ptr->m_commandQueue->queueCommand(CommandType_DeleteMaterials, theMaterialNames);
+ }
+ for (const auto &name : materialNames)
+ d_ptr->m_createdMaterials.removeAll(name);
+}
+
+/*!
+ \qmlproperty list<string> Presentation::createdMaterials
+
+ This property contains a list of all dynamically created materials on this presentation.
+
+ This property is read-only.
+
+ \note Materials can only be dynamically created via C++ API.
+
+ \sa createMaterial
+ \sa createMaterials
+*/
+
+/*!
+ \property Q3DSPresentation::createdMaterials
+
+ This property contains a list of all dynamically created materials on this presentation.
+
+ This property is read-only.
+
+ \sa createMaterial
+ \sa createMaterials
+*/
+QStringList Q3DSPresentation::createdMaterials() const
+{
+ return d_ptr->m_createdMaterials;
+}
+
+/*!
+ Creates a mesh specified by given \a geometry. The given \a meshName can be used as
+ \c sourcepath property value for model elements created with future createElement() calls.
+
+ The mesh is ready for use once meshesCreated() signal is received for it.
+
+ \sa createElement
+ \sa createMeshes
+ \sa meshesCreated
+*/
+void Q3DSPresentation::createMesh(const QString &meshName, const Q3DSGeometry &geometry)
+{
+ QHash<QString, const Q3DSGeometry *> meshData;
+ meshData.insert(meshName, &geometry);
+ createMeshes(meshData);
+}
+
+/*!
+ Creates multiple meshes specified by given \a meshData. The data is mesh name and geometry
+ pairs. For more details, see createMesh().
+
+ The ownership of supplied geometries stays with the caller.
+
+ \sa createMesh
+ \sa meshesCreated
+*/
+void Q3DSPresentation::createMeshes(const QHash<QString, const Q3DSGeometry *> &meshData)
+{
+ // We can't refer to API class Q3DSGeometry on the runtime side, so let's grab the meshdata
+ // from Q3DSGeometryPrivate that is in runtime approved format and pass that on instead
+ auto theMeshData = new QHash<QString, Q3DSViewer::MeshData>;
+ QHashIterator<QString, const Q3DSGeometry *> it(meshData);
+ while (it.hasNext()) {
+ it.next();
+ theMeshData->insert(it.key(), it.value()->d_ptr->meshData());
+ }
+
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->createMeshes(*theMeshData);
+ delete theMeshData;
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(CommandType_CreateMeshes, theMeshData);
+ }
+}
+
+/*!
+ Deletes the mesh specified by \a meshName.
+ Deleting meshes is supported only for meshes that have been dynamically created with
+ createMesh() or createMeshes().
+
+ \sa deleteMeshes
+ \sa createMesh
+ */
+void Q3DSPresentation::deleteMesh(const QString &meshName)
+{
+ QStringList meshNames;
+ meshNames << meshName;
+ deleteMeshes(meshNames);
+}
+
+/*!
+ Deletes meshes specified by \a meshNames.
+ Deleting meshes is supported only for meshes that have been dynamically created with
+ createMesh() or createMeshes().
+
+ \sa deleteMesh
+ */
+void Q3DSPresentation::deleteMeshes(const QStringList &meshNames)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->deleteMeshes(meshNames);
+ } else if (d_ptr->m_commandQueue) {
+ // We need to copy the list as queue takes ownership of it
+ QStringList *theMeshNames = new QStringList(meshNames);
+ d_ptr->m_commandQueue->queueCommand(CommandType_DeleteMeshes, theMeshNames);
+ }
+ for (const auto &name : meshNames)
+ d_ptr->m_createdMeshes.removeAll(name);
+}
+
+/*!
+ \qmlproperty list<string> Presentation::createdMeshes
+
+ This property contains a list of all dynamically created meshes on this presentation.
+
+ This property is read-only.
+
+ \note Meshes can only be dynamically created via C++ API.
+
+ \sa createMesh
+ \sa createMeshes
+*/
+
+/*!
+ \property Q3DSPresentation::createdMeshes
+
+ This property contains a list of all dynamically created meshes on this presentation.
+
+ This property is read-only.
+
+ \sa createMesh
+ \sa createMeshes
+*/
+QStringList Q3DSPresentation::createdMeshes() const
+{
+ return d_ptr->m_createdMeshes;
+}
+
+/*!
+ * \internal
+ */
+void Q3DSPresentation::mousePressEvent(QMouseEvent *e)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->HandleMousePress(e->x(), e->y(), e->button(), true);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(QString(), CommandType_MousePress,
+ e->x(), e->y(), int(e->button()));
+ }
+}
+
+/*!
+ * \internal
+ */
+void Q3DSPresentation::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->HandleMousePress(e->x(), e->y(), e->button(), false);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(QString(), CommandType_MouseRelease,
+ e->x(), e->y(), int(e->button()));
+ }
+}
+
+/*!
+ * \internal
+ */
+void Q3DSPresentation::mouseMoveEvent(QMouseEvent *e)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->HandleMouseMove(e->x(), e->y(), true);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(QString(), CommandType_MouseMove,
+ e->x(), e->y());
+ }
+}
+
+/*!
+ * \internal
+ */
+void Q3DSPresentation::wheelEvent(QWheelEvent *e)
+{
+ QPoint pixelData = e->pixelDelta();
+ int numSteps = 0;
+ if (pixelData.isNull()) {
+ if (e->orientation() == Qt::Vertical)
+ numSteps = e->angleDelta().y() / 8;
+ else
+ numSteps = e->angleDelta().x() / 8;
+ } else {
+ // trackpad, pixel = one step in scroll wheel.
+ if (e->orientation() == Qt::Vertical)
+ numSteps = pixelData.y();
+ else
+ numSteps = pixelData.x();
+ }
+ if (numSteps != 0) {
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->HandleMouseWheel(e->x(), e->y(),
+ e->orientation() == Qt::Vertical ? 0 : 1,
+ numSteps);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(QString(), CommandType_MouseWheel,
+ e->x(), e->y(),
+ int(e->orientation() == Qt::Vertical), numSteps);
+ }
+ }
+}
+
+/*!
+ * \internal
+ */
+void Q3DSPresentation::keyPressEvent(QKeyEvent *e)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->HandleKeyInput(d_ptr->getScanCode(e), true);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(QString(), CommandType_KeyPress,
+ d_ptr->getScanCode(e));
+ }
+}
+
+/*!
+ * \internal
+ */
+void Q3DSPresentation::keyReleaseEvent(QKeyEvent *e)
+{
+ if (d_ptr->m_viewerApp) {
+ d_ptr->m_viewerApp->HandleKeyInput(d_ptr->getScanCode(e), false);
+ } else if (d_ptr->m_commandQueue) {
+ d_ptr->m_commandQueue->queueCommand(QString(), CommandType_KeyRelease,
+ d_ptr->getScanCode(e));
+ }
+}
+
+// #TODO: QT3DS-3562 Most Presentation signals missing documentation
+/*!
+ * \qmlsignal Presentation::slideEntered
+ * Emitted when
+ * \param elementPath
+ * \param index
+ * \param name
+ */
+
+/*!
+ * \fn Q3DSPresentation::slideEntered
+ * Emitted when
+ * \param elementPath
+ * \param index
+ * \param name
+ */
+
+/*!
+ * \qmlsignal Presentation::slideExited
+ * Emitted when
+ * \param elementPath
+ * \param index
+ * \param name
+ */
+
+/*!
+ * \fn Q3DSPresentation::slideExited
+ * Emitted when
+ * \param elementPath
+ * \param index
+ * \param name
+ */
+
+/*!
+ * \fn Q3DSPresentation::dataInputsReady
+ * Emitted when \l{DataInput}s in the Studio project have been parsed and data inputs are available
+ * through dataInputs() and getDataInputs() methods.
+ */
+
+/*!
+ * \fn Q3DSPresentation::dataOutputsReady
+ * Emitted when \l{DataOutput}s in the Studio project have been parsed and data outputs are available
+ * through dataOutputs() and getDataOutputs() methods.
+ */
+
+/*!
+ * \qmlsignal Presentation::customSignalEmitted
+ * Emitted when
+ * \param elementPath
+ * \param name
+ */
+
+/*!
+ * \fn Q3DSPresentation::customSignalEmitted
+ * Emitted when
+ * \param elementPath
+ * \param name
+ */
+
+/*!
+ \qmlsignal Presentation::elementsCreated
+ Emitted when one or more elements have been created in response to createElement()
+ or createElements() calls. The \a elementPaths list contains the element paths of the created
+ elements. If creation failed, \a error string indicates the reason.
+
+ \sa createElement
+ \sa createElements
+ */
+
+/*!
+ \fn Q3DSPresentation::elementsCreated
+ Emitted when one or more elements have been created in response to createElement()
+ or createElements() calls. The \a elementPaths list contains the element paths of the created
+ elements. If creation failed, \a error string indicates the reason.
+
+ \sa createElement
+ \sa createElements
+ */
+
+/*!
+ \qmlsignal Presentation::materialsCreated
+ Emitted when one or more materials have been created in response to createMaterial()
+ or createMaterials() calls. The \a materialNames list contains the names of the created
+ materials. If the material is created into a subpresentation, the name is prefixed with
+ subpresentation ID followed by a colon.
+ If creation failed, \a error string indicates the reason.
+
+ \sa createMaterial
+ \sa createMaterials
+ */
+
+/*!
+ \fn Q3DSPresentation::materialsCreated
+ Emitted when one or more materials have been created in response to createMaterial()
+ or createMaterials() calls. The \a materialNames list contains the names of the created
+ materials. If creation failed, \a error string indicates the reason.
+
+ \sa createMaterial
+ \sa createMaterials
+ */
+
+/*!
+ \qmlsignal Presentation::meshesCreated
+ Emitted when one or more meshes have been created in response to createMesh()
+ or createMeshes() calls. The \a meshNames list contains the names of the created
+ meshes. If creation failed, \a error string indicates the reason.
+
+ \sa createMesh
+ \sa createMeshes
+ */
+
+/*!
+ \fn Q3DSPresentation::meshesCreated
+ Emitted when one or more meshes have been created in response to createMesh()
+ or createMeshes() calls. The \a meshNames list contains the names of the created
+ meshes. If creation failed, \a error string indicates the reason.
+
+ \sa createMesh
+ \sa createMeshes
+ */
+
+/*!
+ * \internal
+ */
+Q3DSPresentationPrivate::Q3DSPresentationPrivate(Q3DSPresentation *q)
+ : QObject(q)
+ , q_ptr(q)
+ , m_viewerApp(nullptr)
+ , m_commandQueue(nullptr)
+ , m_streamProxy(nullptr)
+ , m_delayedLoading(false)
+{
+}
+
+Q3DSPresentationPrivate::~Q3DSPresentationPrivate()
+{
+ unregisterAllElements();
+ unregisterAllDataInputs();
+ unregisterAllDataOutputs();
+ delete m_streamProxy;
+}
+
+void Q3DSPresentationPrivate::setSource(const QUrl &source)
+{
+ m_source = source;
+ if (m_commandQueue) {
+ m_commandQueue->m_sourceChanged = true;
+ m_commandQueue->m_source = source;
+ }
+}
+
+void Q3DSPresentationPrivate::setVariantList(const QStringList &variantList)
+{
+ m_variantList = variantList;
+ if (m_commandQueue) {
+ m_commandQueue->m_variantListChanged = true;
+ m_commandQueue->m_variantList = variantList;
+ }
+}
+
+void Q3DSPresentationPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app, bool connectApp)
+{
+ Q3DSViewer::Q3DSViewerApp *oldApp = m_viewerApp;
+ m_viewerApp = app;
+
+ const auto elements = m_elements.values();
+ for (Q3DSElement *element : elements)
+ element->d_ptr->setViewerApp(app);
+
+ if (m_viewerApp) {
+ const auto dataInputs = m_viewerApp->dataInputs();
+ for (const auto &name : dataInputs) {
+ if (!m_dataInputs.contains(name)) {
+ // Name is sufficient for C++ side APIs, as other parameters
+ // (max/min) are queried synchronously.
+ auto *di = new Q3DSDataInput(name, nullptr);
+ registerDataInput(di);
+ }
+ }
+ Q_EMIT q_ptr->dataInputsReady();
+ }
+
+ if (connectApp) {
+ if (app) {
+ connect(app, &Q3DSViewer::Q3DSViewerApp::SigSlideEntered,
+ this, &Q3DSPresentationPrivate::handleSlideEntered);
+ connect(app, &Q3DSViewer::Q3DSViewerApp::SigSlideExited,
+ q_ptr, &Q3DSPresentation::slideExited);
+ connect(app, &Q3DSViewer::Q3DSViewerApp::SigCustomSignal,
+ q_ptr, &Q3DSPresentation::customSignalEmitted);
+ connect(app, &Q3DSViewer::Q3DSViewerApp::SigDataOutputValueUpdated,
+ this, &Q3DSPresentationPrivate::handleDataOutputValueUpdate);
+ connect(app, &Q3DSViewer::Q3DSViewerApp::SigElementsCreated,
+ this, &Q3DSPresentationPrivate::handleElementsCreated);
+ connect(app, &Q3DSViewer::Q3DSViewerApp::SigMaterialsCreated,
+ this, &Q3DSPresentationPrivate::handleMaterialsCreated);
+ connect(app, &Q3DSViewer::Q3DSViewerApp::SigMeshesCreated,
+ this, &Q3DSPresentationPrivate::handleMeshesCreated);
+ }
+ if (oldApp) {
+ disconnect(oldApp, &Q3DSViewer::Q3DSViewerApp::SigSlideEntered,
+ this, &Q3DSPresentationPrivate::handleSlideEntered);
+ disconnect(oldApp, &Q3DSViewer::Q3DSViewerApp::SigSlideExited,
+ q_ptr, &Q3DSPresentation::slideExited);
+ disconnect(oldApp, &Q3DSViewer::Q3DSViewerApp::SigCustomSignal,
+ q_ptr, &Q3DSPresentation::customSignalEmitted);
+ disconnect(oldApp, &Q3DSViewer::Q3DSViewerApp::SigDataOutputValueUpdated,
+ this, &Q3DSPresentationPrivate::handleDataOutputValueUpdate);
+ disconnect(oldApp, &Q3DSViewer::Q3DSViewerApp::SigElementsCreated,
+ this, &Q3DSPresentationPrivate::handleElementsCreated);
+ disconnect(oldApp, &Q3DSViewer::Q3DSViewerApp::SigMaterialsCreated,
+ this, &Q3DSPresentationPrivate::handleMaterialsCreated);
+ disconnect(oldApp, &Q3DSViewer::Q3DSViewerApp::SigMeshesCreated,
+ this, &Q3DSPresentationPrivate::handleMeshesCreated);
+ }
+ }
+}
+
+void Q3DSPresentationPrivate::setCommandQueue(CommandQueue *queue)
+{
+ m_commandQueue = queue;
+
+ const auto elements = m_elements.values();
+ const auto dataInputs = m_dataInputs.values();
+ for (Q3DSElement *element : elements)
+ element->d_ptr->setCommandQueue(queue);
+ for (Q3DSDataInput *di : dataInputs)
+ di->d_ptr->setCommandQueue(queue);
+
+ if (m_commandQueue) {
+ setDelayedLoading(m_delayedLoading);
+ setVariantList(m_variantList);
+ // Queue a request ASAP for datainputs and outputs defined in UIA file so that
+ // getDataInputs has up-to-date info at the earliest and that data outputs
+ // connect from source to destination
+ m_commandQueue->queueCommand({}, CommandType_RequestDataInputs);
+ m_commandQueue->queueCommand({}, CommandType_RequestDataOutputs);
+ setSource(m_source);
+ }
+}
+
+void Q3DSPresentationPrivate::setDelayedLoading(bool enable)
+{
+ m_delayedLoading = enable;
+ if (m_commandQueue) {
+ m_commandQueue->m_delayedLoading = enable;
+ m_commandQueue->m_delayedLoadingChanged = true;
+ }
+}
+
+void Q3DSPresentationPrivate::requestResponseHandler(CommandType commandType, void *requestData)
+{
+ switch (commandType) {
+ case CommandType_RequestDataInputs: {
+ QVariantList *response = reinterpret_cast<QVariantList *>(requestData);
+
+ for (int i = 0; i < response->size(); ++i) {
+ // Check and append to QML-side list if the (UIA) presentation has additional datainputs
+ // that are not explicitly defined in QML code.
+ auto receivedDI = response->at(i).value<Q3DSDataInput *>();
+ // For QML behind async command queue, we cache min/max and metadata values in addition
+ // to name, in order to be able to return values initially set in UIA file (in QML
+ // getters).
+ if (!m_dataInputs.contains(receivedDI->name())) {
+ auto newDI = new Q3DSDataInput(receivedDI->name(), nullptr);
+ newDI->d_ptr->m_min = receivedDI->d_ptr->m_min;
+ newDI->d_ptr->m_max = receivedDI->d_ptr->m_max;
+ newDI->d_ptr->m_metadata = receivedDI->d_ptr->m_metadata;
+ registerDataInput(newDI);
+ } else {
+ m_dataInputs[receivedDI->name()]->d_ptr->m_min = receivedDI->d_ptr->m_min;
+ m_dataInputs[receivedDI->name()]->d_ptr->m_max = receivedDI->d_ptr->m_max;
+ m_dataInputs[receivedDI->name()]->d_ptr->m_metadata = receivedDI->d_ptr->m_metadata;
+ }
+ }
+ delete response;
+ Q_EMIT q_ptr->dataInputsReady();
+ break;
+ }
+ case CommandType_RequestDataOutputs: {
+ QVariantList *response = reinterpret_cast<QVariantList *>(requestData);
+
+ for (int i = 0; i < response->size(); ++i) {
+ // Check and append to QML-side list if the (UIA) presentation has additional
+ // dataoutputs that are not explicitly defined in QML code.
+ if (!m_dataOutputs.contains(response->at(i).value<QString>()))
+ registerDataOutput(new Q3DSDataOutput(response->at(i).value<QString>(), nullptr));
+ }
+ delete response;
+ Q_EMIT q_ptr->dataOutputsReady();
+ break;
+ }
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+}
+
+// Doc note: The ownership of the registered scenes remains with the caller, who needs to
+// ensure that registered scenes are alive as long as the presentation is alive.
+void Q3DSPresentationPrivate::registerElement(Q3DSElement *element)
+{
+ Q_ASSERT(!element->elementPath().isEmpty());
+
+ // Allow only single registration for each element path and scene object
+ QMutableHashIterator<QString, Q3DSElement *> i(m_elements);
+ while (i.hasNext()) {
+ i.next();
+ if (i.value() == element) {
+ // If the same scene object is already registered with different path,
+ // remove it from the map to avoid duplication.
+ if (i.key() != element->elementPath())
+ i.remove();
+ } else if (i.key() == element->elementPath()) {
+ // If the same element path is registered by another scene object, the old
+ // scene object is unregistered.
+ i.value()->d_ptr->setViewerApp(nullptr);
+ i.value()->d_ptr->setPresentation(nullptr);
+ i.remove();
+ }
+ }
+
+ element->d_ptr->setViewerApp(m_viewerApp);
+ element->d_ptr->setCommandQueue(m_commandQueue);
+ element->d_ptr->setPresentation(this);
+
+ m_elements.insert(element->elementPath(), element);
+}
+
+void Q3DSPresentationPrivate::unregisterElement(Q3DSElement *element)
+{
+ Q3DSElement *oldScene = m_elements.value(element->elementPath());
+ if (oldScene == element) {
+ element->d_ptr->setViewerApp(nullptr);
+ element->d_ptr->setCommandQueue(nullptr);
+ element->d_ptr->setPresentation(nullptr);
+ m_elements.remove(element->elementPath());
+ }
+}
+
+void Q3DSPresentationPrivate::unregisterAllElements()
+{
+ for (Q3DSElement *element : m_elements.values()) {
+ element->d_ptr->setViewerApp(nullptr);
+ element->d_ptr->setCommandQueue(nullptr);
+ element->d_ptr->setPresentation(nullptr);
+ }
+ m_elements.clear();
+}
+
+void Q3DSPresentationPrivate::registerDataInput(Q3DSDataInput *dataInput)
+{
+ Q_ASSERT(!dataInput->name().isEmpty());
+
+ // Allow only single registration for each DataInput
+ QMutableHashIterator<QString, Q3DSDataInput *> i(m_dataInputs);
+ while (i.hasNext()) {
+ i.next();
+ if (i.value() == dataInput) {
+ // If the same DataInput object is already registered with different name,
+ // remove it from the map to avoid duplication.
+ if (i.key() != dataInput->name())
+ i.remove();
+ } else if (i.key() == dataInput->name()) {
+ // If the same name is registered by another DataInput object, the old
+ // DataInput object is unregistered.
+ i.value()->d_ptr->setViewerApp(nullptr);
+ i.value()->d_ptr->setPresentation(nullptr);
+ i.remove();
+ }
+ }
+
+ dataInput->d_ptr->setPresentation(q_ptr);
+ dataInput->d_ptr->setViewerApp(m_viewerApp);
+ dataInput->d_ptr->setCommandQueue(m_commandQueue);
+
+ m_dataInputs.insert(dataInput->name(), dataInput);
+}
+
+void Q3DSPresentationPrivate::unregisterDataInput(Q3DSDataInput *dataInput)
+{
+ Q3DSDataInput *oldDi = m_dataInputs.value(dataInput->name());
+ if (oldDi == dataInput) {
+ dataInput->d_ptr->setCommandQueue(nullptr);
+ dataInput->d_ptr->setViewerApp(nullptr);
+ dataInput->d_ptr->setPresentation(nullptr);
+ m_dataInputs.remove(dataInput->name());
+ }
+}
+
+void Q3DSPresentationPrivate::unregisterAllDataInputs()
+{
+ for (Q3DSDataInput *di : m_dataInputs.values()) {
+ di->d_ptr->setViewerApp(nullptr);
+ di->d_ptr->setCommandQueue(nullptr);
+ di->d_ptr->setPresentation(nullptr);
+ }
+ m_dataInputs.clear();
+}
+bool Q3DSPresentationPrivate::isValidDataInput(const Q3DSDataInput *dataInput) const
+{
+ // For QML instance separated from runtime engine by command queue,
+ // check locally cached list for this datainput (initialised at presentation load).
+ if (!m_viewerApp) {
+ if (m_dataInputs.contains(dataInput->name()))
+ return true;
+ else
+ return false;
+ }
+
+ return m_viewerApp->dataInputs().contains(dataInput->name());
+}
+
+float Q3DSPresentationPrivate::dataInputMin(const QString &name) const
+{
+ // For QML instance separated from runtime engine by command queue,
+ // return locally cached value (initialised at presentation load).
+ if (!m_viewerApp) {
+ if (m_dataInputs.contains(name))
+ return m_dataInputs[name]->d_ptr->m_min;
+ else
+ return 0.0f;
+ }
+ return m_viewerApp->dataInputMin(name);
+}
+
+float Q3DSPresentationPrivate::dataInputMax(const QString &name) const
+{
+ // For QML instance separated from runtime engine by command queue,
+ // return locally cached value (initialised at presentation load).
+ if (!m_viewerApp) {
+ if (m_dataInputs.contains(name))
+ return m_dataInputs[name]->d_ptr->m_max;
+ else
+ return 0.0f;
+ }
+ return m_viewerApp->dataInputMax(name);
+}
+
+QHash<QString, QString> Q3DSPresentationPrivate::dataInputMetadata(const QString &name) const
+{
+ // For QML instance separated from runtime engine by command queue,
+ // return locally cached value (initialised at presentation load).
+ if (!m_viewerApp) {
+ if (m_dataInputs.contains(name))
+ return m_dataInputs[name]->d_ptr->m_metadata;
+ else
+ return {};
+ }
+ return m_viewerApp->dataInputMetadata(name);
+}
+
+QVector<Q3DSDataInput *> Q3DSPresentationPrivate::dataInputs(const QString &key) const
+{
+ QVector<Q3DSDataInput *> ret;
+ // For QML instance separated from runtime engine by command queue,
+ // return locally cached value (initialised at presentation load).
+ if (!m_viewerApp) {
+ for (const auto &it : m_dataInputs) {
+ if (it->metadataKeys().contains(key))
+ ret.append(it);
+ }
+ } else {
+ // Otherwise, defer to viewer app.
+ const auto &diList = m_viewerApp->dataInputs();
+ // We fetch the metadata(s) from the source (viewer app) but
+ // return the corresponding datainput object(s) held by presentation item.
+ for (const auto &it : diList) {
+ if (m_viewerApp->dataInputMetadata(it).contains(key))
+ ret.append(m_dataInputs[it]);
+ }
+ }
+
+ return ret;
+}
+
+void Q3DSPresentationPrivate::registerDataOutput(Q3DSDataOutput *dataOutput)
+{
+ Q_ASSERT(!dataOutput->name().isEmpty());
+
+ // Allow only single registration for each DataOutput
+ QMutableHashIterator<QString, Q3DSDataOutput *> i(m_dataOutputs);
+ while (i.hasNext()) {
+ i.next();
+ if (i.value() == dataOutput) {
+ // If the same DataOutput object is already registered with different name,
+ // remove it from the map to avoid duplication.
+ if (i.key() != dataOutput->name())
+ i.remove();
+ } else if (i.key() == dataOutput->name()) {
+ // If the same name is registered by another DataOutput object, the old
+ // DataOutput object is unregistered.
+ i.value()->d_ptr->setViewerApp(nullptr);
+ i.value()->d_ptr->setPresentation(nullptr);
+ i.value()->d_ptr->setCommandQueue(nullptr);
+ i.remove();
+ }
+ }
+
+ dataOutput->d_ptr->setPresentation(q_ptr);
+ dataOutput->d_ptr->setViewerApp(m_viewerApp);
+ dataOutput->d_ptr->setCommandQueue(m_commandQueue);
+
+ m_dataOutputs.insert(dataOutput->name(), dataOutput);
+}
+
+void Q3DSPresentationPrivate::unregisterDataOutput(Q3DSDataOutput *dataOutput)
+{
+ Q3DSDataOutput *oldDout = m_dataOutputs.value(dataOutput->name());
+ if (oldDout == dataOutput) {
+ dataOutput->d_ptr->setCommandQueue(nullptr);
+ dataOutput->d_ptr->setViewerApp(nullptr);
+ dataOutput->d_ptr->setPresentation(nullptr);
+ m_dataOutputs.remove(dataOutput->name());
+ }
+}
+
+void Q3DSPresentationPrivate::unregisterAllDataOutputs()
+{
+ const auto values = m_dataOutputs.values();
+ for (Q3DSDataOutput *dout : values) {
+ dout->d_ptr->setViewerApp(nullptr);
+ dout->d_ptr->setCommandQueue(nullptr);
+ dout->d_ptr->setPresentation(nullptr);
+ }
+ m_dataOutputs.clear();
+}
+
+bool Q3DSPresentationPrivate::isValidDataOutput(const Q3DSDataOutput *dataOutput) const
+{
+ if (!m_viewerApp)
+ return false;
+
+ return m_viewerApp->dataOutputs().contains(dataOutput->name());
+}
+
+Q3DStudio::EKeyCode Q3DSPresentationPrivate::getScanCode(QKeyEvent *e)
+{
+ enum {
+ RIGHT_SHIFT = 0x036,
+ RIGHT_CTRL = 0x11d,
+ RIGHT_ALT = 0x138,
+ };
+
+ Qt::Key keyScanCode = static_cast<Qt::Key>(e->key());
+
+ Q3DStudio::EKeyCode newScanCode = Q3DStudio::KEY_NOKEY;
+ switch (keyScanCode) {
+ case Qt::Key_Down:
+ newScanCode = Q3DStudio::KEY_DOWN;
+ break;
+ case Qt::Key_Up:
+ newScanCode = Q3DStudio::KEY_UP;
+ break;
+ case Qt::Key_Left:
+ newScanCode = Q3DStudio::KEY_LEFT;
+ break;
+ case Qt::Key_Right:
+ newScanCode = Q3DStudio::KEY_RIGHT;
+ break;
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ newScanCode = e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPADENTER
+ : Q3DStudio::KEY_RETURN;
+ break;
+ case Qt::Key_Backspace:
+ newScanCode = Q3DStudio::KEY_BACK;
+ break;
+ case Qt::Key_Tab:
+ newScanCode = Q3DStudio::KEY_TAB;
+ break;
+ case Qt::Key_Escape:
+ newScanCode = Q3DStudio::KEY_ESCAPE;
+ break;
+ case Qt::Key_A:
+ newScanCode = Q3DStudio::KEY_A;
+ break;
+ case Qt::Key_B:
+ newScanCode = Q3DStudio::KEY_B;
+ break;
+ case Qt::Key_C:
+ newScanCode = Q3DStudio::KEY_C;
+ break;
+ case Qt::Key_D:
+ newScanCode = Q3DStudio::KEY_D;
+ break;
+ case Qt::Key_E:
+ newScanCode = Q3DStudio::KEY_E;
+ break;
+ case Qt::Key_F:
+ newScanCode = Q3DStudio::KEY_F;
+ break;
+ case Qt::Key_G:
+ newScanCode = Q3DStudio::KEY_G;
+ break;
+ case Qt::Key_H:
+ newScanCode = Q3DStudio::KEY_H;
+ break;
+ case Qt::Key_I:
+ newScanCode = Q3DStudio::KEY_I;
+ break;
+ case Qt::Key_J:
+ newScanCode = Q3DStudio::KEY_J;
+ break;
+ case Qt::Key_K:
+ newScanCode = Q3DStudio::KEY_K;
+ break;
+ case Qt::Key_L:
+ newScanCode = Q3DStudio::KEY_L;
+ break;
+ case Qt::Key_M:
+ newScanCode = Q3DStudio::KEY_M;
+ break;
+ case Qt::Key_N:
+ newScanCode = Q3DStudio::KEY_N;
+ break;
+ case Qt::Key_O:
+ newScanCode = Q3DStudio::KEY_O;
+ break;
+ case Qt::Key_P:
+ newScanCode = Q3DStudio::KEY_P;
+ break;
+ case Qt::Key_Q:
+ newScanCode = Q3DStudio::KEY_Q;
+ break;
+ case Qt::Key_R:
+ newScanCode = Q3DStudio::KEY_R;
+ break;
+ case Qt::Key_S:
+ newScanCode = Q3DStudio::KEY_S;
+ break;
+ case Qt::Key_T:
+ newScanCode = Q3DStudio::KEY_T;
+ break;
+ case Qt::Key_U:
+ newScanCode = Q3DStudio::KEY_U;
+ break;
+ case Qt::Key_V:
+ newScanCode = Q3DStudio::KEY_V;
+ break;
+ case Qt::Key_W:
+ newScanCode = Q3DStudio::KEY_W;
+ break;
+ case Qt::Key_X:
+ newScanCode = Q3DStudio::KEY_X;
+ break;
+ case Qt::Key_Y:
+ newScanCode = Q3DStudio::KEY_Y;
+ break;
+ case Qt::Key_Z:
+ newScanCode = Q3DStudio::KEY_Z;
+ break;
+ case Qt::Key_0:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD0 : Q3DStudio::KEY_0;
+ break;
+ case Qt::Key_1:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD1 : Q3DStudio::KEY_1;
+ break;
+ case Qt::Key_2:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD2 : Q3DStudio::KEY_2;
+ break;
+ case Qt::Key_3:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD3 : Q3DStudio::KEY_3;
+ break;
+ case Qt::Key_4:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD4 : Q3DStudio::KEY_4;
+ break;
+ case Qt::Key_5:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD5 : Q3DStudio::KEY_5;
+ break;
+ case Qt::Key_6:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD6 : Q3DStudio::KEY_6;
+ break;
+ case Qt::Key_7:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD7 : Q3DStudio::KEY_7;
+ break;
+ case Qt::Key_8:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD8 : Q3DStudio::KEY_8;
+ break;
+ case Qt::Key_9:
+ newScanCode =
+ e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPAD9 : Q3DStudio::KEY_9;
+ break;
+ case Qt::Key_Minus:
+ newScanCode = e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPADSUBTRACT
+ : Q3DStudio::KEY_SUBTRACT;
+ break;
+ case Qt::Key_Plus:
+ newScanCode = e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPADADD
+ : Q3DStudio::KEY_EQUALS;
+ break;
+ case Qt::Key_NumLock:
+ newScanCode = Q3DStudio::KEY_NUMLOCK;
+ break;
+ case Qt::Key_ScrollLock:
+ newScanCode = Q3DStudio::KEY_SCROLL;
+ break;
+ case Qt::Key_CapsLock:
+ newScanCode = Q3DStudio::KEY_CAPITAL;
+ break;
+ case Qt::Key_Pause:
+ newScanCode = Q3DStudio::KEY_PAUSE;
+ break;
+ case Qt::Key_Print:
+ newScanCode = Q3DStudio::KEY_PRINTSCREEN;
+ break;
+ case Qt::Key_Insert:
+ newScanCode = Q3DStudio::KEY_INSERT;
+ break;
+ case Qt::Key_Delete:
+ newScanCode = Q3DStudio::KEY_DELETE;
+ break;
+ case Qt::Key_Home:
+ newScanCode = Q3DStudio::KEY_HOME;
+ break;
+ case Qt::Key_End:
+ newScanCode = Q3DStudio::KEY_END;
+ break;
+ case Qt::Key_PageUp:
+ newScanCode = Q3DStudio::KEY_PGUP;
+ break;
+ case Qt::Key_PageDown:
+ newScanCode = Q3DStudio::KEY_PGDN;
+ break;
+ case Qt::Key_F1:
+ newScanCode = Q3DStudio::KEY_F1;
+ break;
+ case Qt::Key_F2:
+ newScanCode = Q3DStudio::KEY_F2;
+ break;
+ case Qt::Key_F3:
+ newScanCode = Q3DStudio::KEY_F3;
+ break;
+ case Qt::Key_F4:
+ newScanCode = Q3DStudio::KEY_F4;
+ break;
+ case Qt::Key_F5:
+ newScanCode = Q3DStudio::KEY_F5;
+ break;
+ case Qt::Key_F6:
+ newScanCode = Q3DStudio::KEY_F6;
+ break;
+ case Qt::Key_F7:
+ newScanCode = Q3DStudio::KEY_F7;
+ break;
+ case Qt::Key_F8:
+ newScanCode = Q3DStudio::KEY_F8;
+ break;
+ case Qt::Key_F9:
+ newScanCode = Q3DStudio::KEY_F9;
+ break;
+ case Qt::Key_F10:
+ newScanCode = Q3DStudio::KEY_F10;
+ break;
+ case Qt::Key_F11:
+ newScanCode = Q3DStudio::KEY_F11;
+ break;
+ case Qt::Key_F12:
+ newScanCode = Q3DStudio::KEY_F12;
+ break;
+ case Qt::Key_F13:
+ newScanCode = Q3DStudio::KEY_F13;
+ break;
+ case Qt::Key_F14:
+ newScanCode = Q3DStudio::KEY_F14;
+ break;
+ case Qt::Key_QuoteLeft:
+ newScanCode = Q3DStudio::KEY_GRAVE;
+ break;
+ case Qt::Key_Asterisk:
+ newScanCode = Q3DStudio::KEY_MULTIPLY;
+ break;
+ case Qt::Key_BracketRight:
+ newScanCode = Q3DStudio::KEY_RBRACKET;
+ break;
+ case Qt::Key_BracketLeft:
+ newScanCode = Q3DStudio::KEY_LBRACKET;
+ break;
+ case Qt::Key_Semicolon:
+ newScanCode = Q3DStudio::KEY_SEMICOLON;
+ break;
+ case Qt::Key_Comma:
+ newScanCode = Q3DStudio::KEY_COMMA;
+ break;
+ case Qt::Key_Period:
+ newScanCode = e->modifiers() == Qt::KeypadModifier ? Q3DStudio::KEY_NUMPADDECIMAL
+ : Q3DStudio::KEY_PERIOD;
+ break;
+ case Qt::Key_Apostrophe:
+ newScanCode = Q3DStudio::KEY_APOSTROPHE;
+ break;
+ case Qt::Key_Slash:
+ newScanCode = Q3DStudio::KEY_SLASH;
+ break;
+ case Qt::Key_Backslash:
+ newScanCode = Q3DStudio::KEY_BACKSLASH;
+ break;
+ case Qt::Key_Equal:
+ newScanCode = Q3DStudio::KEY_EQUALS;
+ break;
+ case Qt::Key_Space:
+ newScanCode = Q3DStudio::KEY_SPACE;
+ break;
+ case Qt::Key_Shift:
+ newScanCode =
+ e->nativeScanCode() == RIGHT_SHIFT ? Q3DStudio::KEY_RSHIFT : Q3DStudio::KEY_LSHIFT;
+ break;
+ case Qt::Key_Control:
+ newScanCode = e->nativeScanCode() == RIGHT_CTRL ? Q3DStudio::KEY_RCONTROL
+ : Q3DStudio::KEY_LCONTROL;
+ break;
+ case Qt::Key_Alt:
+ newScanCode =
+ e->nativeScanCode() == RIGHT_ALT ? Q3DStudio::KEY_RALT : Q3DStudio::KEY_LALT;
+ break;
+ default:
+ break;
+ }
+
+ return newScanCode;
+}
+
+ViewerQmlStreamProxy *Q3DSPresentationPrivate::streamProxy()
+{
+ if (!m_streamProxy)
+ m_streamProxy = new ViewerQmlStreamProxy();
+ return m_streamProxy;
+}
+
+void Q3DSPresentationPrivate::handleSlideEntered(const QString &elementPath, unsigned int index,
+ const QString &name)
+{
+ Q3DSSceneElement *scene = qobject_cast<Q3DSSceneElement *>(m_elements.value(elementPath));
+ if (scene)
+ scene->d_func()->handleSlideEntered(index, name);
+ Q_EMIT q_ptr->slideEntered(elementPath, index, name);
+}
+
+void Q3DSPresentationPrivate::handleDataOutputValueUpdate(const QString &name,
+ const QVariant &newValue)
+{
+ if (!m_dataOutputs.contains(name))
+ return;
+
+ Q3DSDataOutput *node = m_dataOutputs[name];
+ node->setValue(newValue);
+}
+
+void Q3DSPresentationPrivate::handleElementsCreated(const QStringList &elementPaths,
+ const QString &error)
+{
+ if (error.isEmpty())
+ m_createdElements << elementPaths;
+
+ Q_EMIT q_ptr->elementsCreated(elementPaths, error);
+}
+
+void Q3DSPresentationPrivate::handleMaterialsCreated(const QStringList &materialNames,
+ const QString &error)
+{
+ if (error.isEmpty())
+ m_createdMaterials << materialNames;
+
+ Q_EMIT q_ptr->materialsCreated(materialNames, error);
+}
+
+void Q3DSPresentationPrivate::handleMeshesCreated(const QStringList &meshNames,
+ const QString &error)
+{
+ if (error.isEmpty())
+ m_createdMeshes << meshNames;
+
+ Q_EMIT q_ptr->meshesCreated(meshNames, error);
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/q3dspresentation.h b/src/api/studio3d/q3dspresentation.h
new file mode 100644
index 0000000..04faf0d
--- /dev/null
+++ b/src/api/studio3d/q3dspresentation.h
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSPRESENTATION_H
+#define Q3DSPRESENTATION_H
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtStudio3D/q3dsdatainput.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qurl.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qstringlist.h>
+#include <QtStudio3D/q3dsdatainput.h>
+#include <QtStudio3D/q3dsdataoutput.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSPresentationPrivate;
+class Q3DSElement;
+class Q3DSGeometry;
+class QMouseEvent;
+class QWheelEvent;
+class QKeyEvent;
+
+class Q_STUDIO3D_EXPORT Q3DSPresentation : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Q3DSPresentation)
+ Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
+ Q_PROPERTY(QStringList variantList READ variantList WRITE setVariantList NOTIFY variantListChanged)
+ Q_PROPERTY(bool delayedLoading READ delayedLoading WRITE setDelayedLoading NOTIFY delayedLoadingChanged)
+ Q_PROPERTY(QStringList createdElements READ createdElements NOTIFY elementsCreated)
+ Q_PROPERTY(QStringList createdMaterials READ createdMaterials NOTIFY materialsCreated)
+ Q_PROPERTY(QStringList createdMeshes READ createdMeshes NOTIFY meshesCreated)
+
+public:
+ explicit Q3DSPresentation(QObject *parent = nullptr);
+ ~Q3DSPresentation();
+
+ QUrl source() const;
+ QStringList variantList() const;
+
+ void registerElement(Q3DSElement *scene);
+ void unregisterElement(Q3DSElement *scene);
+ Q3DSElement *registeredElement(const QString &elementPath) const;
+
+ void registerDataInput(Q3DSDataInput *dataInput);
+ void unregisterDataInput(Q3DSDataInput *dataInput);
+ Q3DSDataInput *registeredDataInput(const QString &name) const;
+ void registerDataOutput(Q3DSDataOutput *dataOutput);
+ void unregisterDataOutput(Q3DSDataOutput *dataOutput);
+ Q3DSDataOutput *registeredDataOutput(const QString &name) const;
+
+ Q_INVOKABLE QVariantList getDataInputs() const;
+ QVector<Q3DSDataInput *> dataInputs() const;
+ Q_INVOKABLE QVariantList getDataInputs(const QString &metadataKey) const;
+ QVector<Q3DSDataInput *> dataInputs(const QString &metadataKey) const;
+ Q_INVOKABLE QVariantList getDataOutputs() const;
+ QVector<Q3DSDataOutput *> dataOutputs() const;
+
+ bool delayedLoading() const;
+ void setDelayedLoading(bool enable);
+
+ Q_INVOKABLE void preloadSlide(const QString &elementPath);
+ Q_INVOKABLE void unloadSlide(const QString &elementPath);
+
+ // Input event handlers
+ void mousePressEvent(QMouseEvent *e);
+ void mouseReleaseEvent(QMouseEvent *e);
+ void mouseMoveEvent(QMouseEvent *e);
+ void wheelEvent(QWheelEvent *e);
+ void keyPressEvent(QKeyEvent *e);
+ void keyReleaseEvent(QKeyEvent *e);
+
+ void createElement(const QString &parentElementPath, const QString &slideName,
+ const QHash<QString, QVariant> &properties);
+ void createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties);
+ void deleteElement(const QString &elementPath);
+ void deleteElements(const QStringList &elementPaths);
+ QStringList createdElements() const;
+
+ void createMaterial(const QString &materialDefinition, const QString &subPresId = {});
+ void createMaterials(const QStringList &materialDefinitions, const QString &subPresId = {});
+ void deleteMaterial(const QString &materialName);
+ void deleteMaterials(const QStringList &materialNames);
+ QStringList createdMaterials() const;
+
+ void createMesh(const QString &meshName, const Q3DSGeometry &geometry);
+ void createMeshes(const QHash<QString, const Q3DSGeometry *> &meshData);
+ void deleteMesh(const QString &meshName);
+ void deleteMeshes(const QStringList &meshNames);
+ QStringList createdMeshes() const;
+
+public Q_SLOTS:
+ void setSource(const QUrl &source);
+ void setVariantList(const QStringList &variantList);
+ void goToSlide(const QString &elementPath, unsigned int index);
+ void goToSlide(const QString &elementPath, const QString &name);
+ void goToSlide(const QString &elementPath, bool next, bool wrap);
+ void goToTime(const QString &elementPath, float time);
+ void setAttribute(const QString &elementPath, const QString &attributeName,
+ const QVariant &value);
+ void setPresentationActive(const QString &id, bool active);
+ void fireEvent(const QString &elementPath, const QString &eventName);
+ void setGlobalAnimationTime(qint64 milliseconds);
+ void setDataInputValue(const QString &name, const QVariant &value,
+ Q3DSDataInput::ValueRole valueRole = Q3DSDataInput::ValueRole::Value);
+
+Q_SIGNALS:
+ void variantListChanged(const QStringList &variantList);
+ void sourceChanged(const QUrl &source);
+ void slideEntered(const QString &elementPath, unsigned int index, const QString &name);
+ void slideExited(const QString &elementPath, unsigned int index, const QString &name);
+ void dataInputsReady();
+ void dataOutputsReady();
+ void customSignalEmitted(const QString &elementPath, const QString &name);
+ void delayedLoadingChanged(bool enable);
+ void elementsCreated(const QStringList &elementPaths, const QString &error);
+ void materialsCreated(const QStringList &materialNames, const QString &error);
+ void meshesCreated(const QStringList &meshNames, const QString &error);
+
+private:
+ Q_DISABLE_COPY(Q3DSPresentation)
+ Q3DSPresentationPrivate *d_ptr;
+
+ friend class Q3DSPresentationItem;
+ friend class Q3DSSurfaceViewerPrivate;
+ friend class Q3DSRenderer;
+ friend class Q3DSStudio3D;
+ friend class Q3DSDataInput;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSPRESENTATION_H
diff --git a/src/api/studio3d/q3dspresentation_p.h b/src/api/studio3d/q3dspresentation_p.h
new file mode 100644
index 0000000..59b9f38
--- /dev/null
+++ b/src/api/studio3d/q3dspresentation_p.h
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSPRESENTATION_P_H
+#define Q3DSPRESENTATION_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dspresentation.h"
+#include "q3dscommandqueue_p.h"
+#include "Qt3DSViewerApp.h"
+#include <QtCore/QHash>
+#include <QtCore/QUrl>
+
+QT_BEGIN_NAMESPACE
+
+class CommandQueue;
+class ViewerQmlStreamProxy;
+class QKeyEvent;
+
+class Q_STUDIO3D_EXPORT Q3DSPresentationPrivate : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PUBLIC(Q3DSPresentation)
+
+public:
+ typedef QHash<QString, Q3DSElement *> ElementMap;
+ typedef QHash<QString, Q3DSDataInput *> DataInputMap;
+ typedef QHash<QString, Q3DSDataOutput *> DataOutputMap;
+
+ explicit Q3DSPresentationPrivate(Q3DSPresentation *parent);
+ ~Q3DSPresentationPrivate();
+
+ void setSource(const QUrl &source);
+ void setVariantList(const QStringList &variantList);
+ void setViewerApp(Q3DSViewer::Q3DSViewerApp *app, bool connectApp = true);
+ void setCommandQueue(CommandQueue *queue);
+ void setDelayedLoading(bool enable);
+
+ void registerElement(Q3DSElement *element);
+ void unregisterElement(Q3DSElement *element);
+ void unregisterAllElements();
+
+ void registerDataInput(Q3DSDataInput *dataInput);
+ void unregisterDataInput(Q3DSDataInput *dataInput);
+ void unregisterAllDataInputs();
+ void registerDataOutput(Q3DSDataOutput *dataOutput);
+ void unregisterDataOutput(Q3DSDataOutput *dataOutput);
+ void unregisterAllDataOutputs();
+
+ bool isValidDataInput(const Q3DSDataInput *dataInput) const;
+ float dataInputMin(const QString &name) const;
+ float dataInputMax(const QString &name) const;
+ QHash<QString, QString> dataInputMetadata(const QString &name) const;
+ QVector<Q3DSDataInput *> dataInputs(const QString &key) const;
+ bool isValidDataOutput(const Q3DSDataOutput *dataOutput) const;
+
+ ViewerQmlStreamProxy *streamProxy();
+ Q3DStudio::EKeyCode getScanCode(QKeyEvent *e);
+
+ void requestResponseHandler(CommandType commandType, void *requestData);
+
+public Q_SLOTS:
+ void handleSlideEntered(const QString &elementPath, unsigned int index, const QString &name);
+ void handleDataOutputValueUpdate(const QString &name, const QVariant &newValue);
+ void handleElementsCreated(const QStringList &elementPaths, const QString &error);
+ void handleMaterialsCreated(const QStringList &materialNames, const QString &error);
+ void handleMeshesCreated(const QStringList &meshNames, const QString &error);
+
+public:
+ Q3DSPresentation *q_ptr;
+
+private:
+ Q3DSViewer::Q3DSViewerApp *m_viewerApp; // Not owned
+ CommandQueue *m_commandQueue; // Not owned
+ ElementMap m_elements;
+ DataInputMap m_dataInputs;
+ DataOutputMap m_dataOutputs;
+ QUrl m_source;
+ QStringList m_variantList;
+ ViewerQmlStreamProxy *m_streamProxy;
+ bool m_delayedLoading;
+ QStringList m_createdElements;
+ QStringList m_createdMaterials;
+ QStringList m_createdMeshes;
+
+ friend class Q3DSStudio3D;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSPRESENTATION_P_H
diff --git a/src/api/studio3d/q3dssceneelement.cpp b/src/api/studio3d/q3dssceneelement.cpp
new file mode 100644
index 0000000..3f860d6
--- /dev/null
+++ b/src/api/studio3d/q3dssceneelement.cpp
@@ -0,0 +1,436 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dssceneelement_p.h"
+#include "q3dspresentation_p.h"
+#include "q3dscommandqueue_p.h"
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qsettings.h>
+#include <QtCore/qcoreapplication.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype SceneElement
+ \instantiates Q3DSSceneElement
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief Controls the special Scene or Component scene objects in a Qt 3D
+ Studio presentation.
+
+ This class is a convenience class for controlling the properties of Scene
+ and Component objects in the scene. These are special since they have a
+ time context, meaning they control a timeline and a set of associated
+ slides.
+
+ \sa Studio3D, Element, Presentation
+*/
+
+/*!
+ \class Q3DSSceneElement
+ \inherits Q3DSElement
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+
+ \brief Controls the special Scene or Component scene objects in a Qt 3D
+ Studio presentation.
+
+ This class is a convenience class for controlling the properties of Scene
+ and Component objects in the scene. These are special since they have a
+ time context, meaning they control a timline and a set of associated
+ slides.
+
+ \note The functionality of Q3DSSceneElement is equivalent to
+ Q3DSPresentation::goToTime() and Q3DSPresentation::goToSlide().
+
+ \sa Q3DSPresentation, Q3DSWidget, Q3DSSurfaceViewer, Q3DSElement
+ */
+
+/*!
+ \internal
+ */
+Q3DSSceneElement::Q3DSSceneElement(QObject *parent)
+ : Q3DSElement(new Q3DSSceneElementPrivate(this), nullptr, QString(), parent)
+{
+}
+
+/*!
+ \internal
+ */
+Q3DSSceneElement::Q3DSSceneElement(const QString &elementPath, QObject *parent)
+ : Q3DSElement(new Q3DSSceneElementPrivate(this), nullptr, elementPath, parent)
+{
+}
+
+/*!
+ Constructs a Q3DSSceneElement instance and associated it with the object
+ specified by \a elementPath and the given \a presentation. An optional \a
+ parent object can be specified.
+ */
+Q3DSSceneElement::Q3DSSceneElement(Q3DSPresentation *presentation, const QString &elementPath,
+ QObject *parent)
+ : Q3DSElement(new Q3DSSceneElementPrivate(this), presentation, elementPath, parent)
+{
+
+}
+
+/*!
+ Destructor.
+ */
+Q3DSSceneElement::~Q3DSSceneElement()
+{
+}
+
+/*!
+ \qmlproperty int SceneElement::currentSlideIndex
+
+ Holds the index of the currently active slide of the tracked time context.
+
+ \note If this property is set to something else than the default slide for
+ the scene at the initial declaration of SceneElement, a changed signal for
+ the default slide may still be emitted before the slide changes to the
+ desired one. This happens in order to ensure we end up with the index of
+ the slide that is actually shown even if the slide specified in the initial
+ declaration is invalid.
+*/
+
+/*!
+ \property Q3DSSceneElement::currentSlideIndex
+
+ Holds the index of the currently active slide of the tracked time context.
+
+ \note If this property is set to something else than the default slide for
+ the scene at the initial declaration of SceneElement, a changed signal for
+ the default slide may still be emitted before the slide changes to the
+ desired one. This happens in order to ensure we end up with the index of
+ the slide that is actually shown even if the slide specified in the initial
+ declaration is invalid.
+*/
+int Q3DSSceneElement::currentSlideIndex() const
+{
+ Q_D(const Q3DSSceneElement);
+ return d->m_currentSlideIndex;
+}
+
+void Q3DSSceneElement::setCurrentSlideIndex(int currentSlideIndex)
+{
+ Q_D(Q3DSSceneElement);
+ if (d->m_viewerApp) {
+ const QByteArray path(d->m_elementPath.toUtf8());
+ d->m_viewerApp->GoToSlideByIndex(path, currentSlideIndex + 1);
+ } else if (d->m_commandQueue) {
+ d->m_commandQueue->queueCommand(d->m_elementPath, CommandType_GoToSlide,
+ int(currentSlideIndex + 1));
+ } else {
+ // Store desired slide until we have either app or queue. Only name or index can be set.
+ d->m_initialSlideIndex = currentSlideIndex + 1;
+ d->m_initialSlideName.clear();
+ }
+}
+
+/*!
+ \property int SceneElement::previousSlideIndex
+
+ Holds the index of the previously active slide of the tracked time context.
+
+ Note: This property is read-only.
+*/
+/*!
+ \property Q3DSSceneElement::previousSlideIndex
+
+ Holds the index of the previously active slide of the tracked time context.
+
+ This property is read-only.
+*/
+int Q3DSSceneElement::previousSlideIndex() const
+{
+ Q_D(const Q3DSSceneElement);
+ return d->m_previousSlideIndex;
+}
+
+/*!
+ \qmlproperty string SceneElement::currentSlideName
+
+ Holds the name of the currently active slide of the tracked time context.
+
+ \note If this property is set to something else than the default slide for
+ the scene at the initial declaration of SceneElement, a changed signal for
+ the default slide may still be emitted before the slide changes to the
+ desired one. This happens in order to ensure we end up with the index of
+ the slide that is actually shown even if the slide specified in the initial
+ declaration is invalid.
+*/
+
+/*!
+ \property Q3DSSceneElement::currentSlideName
+
+ Holds the name of the currently active slide of the tracked time context.
+
+ \note If this property is set to something else than the default slide for
+ the scene at the initial declaration of SceneElement, a changed signal for
+ the default slide may still be emitted before the slide changes to the
+ desired one. This happens in order to ensure we end up with the index of
+ the slide that is actually shown even if the slide specified in the initial
+ declaration is invalid.
+*/
+QString Q3DSSceneElement::currentSlideName() const
+{
+ Q_D(const Q3DSSceneElement);
+ return d->m_currentSlideName;
+}
+
+void Q3DSSceneElement::setCurrentSlideName(const QString &currentSlideName)
+{
+ Q_D(Q3DSSceneElement);
+ if (d->m_viewerApp) {
+ const QByteArray path(d->m_elementPath.toUtf8());
+ const QByteArray name(currentSlideName.toUtf8());
+ d->m_viewerApp->GoToSlideByName(path, name);
+ } else if (d->m_commandQueue) {
+ d->m_commandQueue->queueCommand(d->m_elementPath, CommandType_GoToSlideByName,
+ currentSlideName);
+ } else {
+ // Store desired slide until we have either app or queue. Only name or index can be set.
+ d->m_initialSlideName = currentSlideName;
+ d->m_initialSlideIndex = 0;
+ }
+}
+
+/*!
+ \qmlmproperty string SceneElement::previousSlideName
+
+ Holds the name of the previously active slide of the tracked time context.
+
+ Note: This property is read-only.
+*/
+/*!
+ \property Q3DSSceneElement::previousSlideName
+
+ Holds the name of the previously active slide of the tracked time context.
+
+ This property is read-only.
+*/
+QString Q3DSSceneElement::previousSlideName() const
+{
+ Q_D(const Q3DSSceneElement);
+ return d->m_previousSlideName;
+}
+
+/*!
+ Requests a time context (a Scene or a Component object) to change to the
+ next or previous slide, depending on the value of \a next. If the context
+ is already at the last or first slide, \a wrap defines if wrapping over to
+ the first or last slide, respectively, occurs.
+ */
+void Q3DSSceneElement::goToSlide(bool next, bool wrap)
+{
+ Q_D(Q3DSSceneElement);
+ d->goToSlide(next, wrap);
+}
+
+/*!
+ Moves the timeline for a time context (a Scene or a Component element) to a
+ specific position. The position is given in seconds in \a timeSeconds.
+ */
+void Q3DSSceneElement::goToTime(float time)
+{
+ Q_D(Q3DSSceneElement);
+ d->goToTime(time);
+}
+
+
+/*!
+ \internal
+ */
+Q3DSSceneElementPrivate::Q3DSSceneElementPrivate(Q3DSSceneElement *parent)
+ : Q3DSElementPrivate(parent)
+ , m_currentSlideIndex(0)
+ , m_previousSlideIndex(0)
+ , m_initialSlideIndex(0)
+ , m_slideInfoRequestPending(false)
+{
+}
+
+/*!
+ \internal
+ */
+Q3DSSceneElementPrivate::~Q3DSSceneElementPrivate()
+{
+}
+
+/*!
+ \internal
+ */
+void Q3DSSceneElementPrivate::handleSlideEntered(int index, const QString &name)
+{
+ Q_Q(Q3DSSceneElement);
+
+ // Initializing presentation will report slide entered for the scenes on the default slide
+ // of the presentation even if user has specified different initial slides.
+ // Since we don't have robust error reporting mechanism from the viewerapp,
+ // we cannot simply ignore these initial enters, as there is no guarantee the slide
+ // user wants even exists.
+
+ // We ignore the slide exited signals and rely on stored previous slide data
+ // to avoid excessive signaling on slide changes.
+ bool notifyCurrent = m_currentSlideIndex != index;
+ bool notifyPrevious = m_previousSlideIndex != m_currentSlideIndex;
+
+ // Since child (i.e. component) slides always get enter event when parent slide is entered,
+ // it is possible that current and previous slides are the same. This feels bit odd, but is
+ // technically correct, as the last time we got enter, the same slide was made current.
+ // It also matches the internal m_viewerApp logic for previous slides.
+ m_previousSlideIndex = m_currentSlideIndex;
+ m_previousSlideName = m_currentSlideName;
+ m_currentSlideIndex = index;
+ m_currentSlideName = name;
+
+ if (notifyPrevious) {
+ Q_EMIT q->previousSlideIndexChanged(m_previousSlideIndex);
+ Q_EMIT q->previousSlideNameChanged(m_previousSlideName);
+ }
+
+ if (notifyCurrent) {
+ Q_EMIT q->currentSlideIndexChanged(m_currentSlideIndex);
+ Q_EMIT q->currentSlideNameChanged(m_currentSlideName);
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSSceneElementPrivate::goToSlide(bool next, bool wrap)
+{
+ if (m_presentation)
+ m_presentation->q_ptr->goToSlide(m_elementPath, next, wrap);
+ else
+ qWarning() << __FUNCTION__ << "Element is not registered to any presentation!";
+}
+
+/*!
+ \internal
+ */
+void Q3DSSceneElementPrivate::goToTime(float time)
+{
+ if (m_presentation)
+ m_presentation->q_ptr->goToTime(m_elementPath, time);
+ else
+ qWarning() << __FUNCTION__ << "Element is not registered to any presentation!";
+}
+
+/*!
+ \internal
+ */
+void Q3DSSceneElementPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
+{
+ Q_Q(Q3DSSceneElement);
+
+ if (app || m_viewerApp) {
+ m_currentSlideIndex = 0;
+ m_currentSlideName.clear();
+ m_previousSlideIndex = 0;
+ m_previousSlideName.clear();
+ }
+
+ Q3DSElementPrivate::setViewerApp(app);
+
+ if (m_viewerApp) {
+ const QByteArray path(m_elementPath.toUtf8());
+ m_viewerApp->GetSlideInfo(path, m_currentSlideIndex, m_previousSlideIndex,
+ m_currentSlideName, m_previousSlideName);
+
+ // If user has set current slide before viewer app has been set for the first time,
+ // we will switch to the desired slide after we initialize.
+ if (m_initialSlideIndex != 0)
+ q->setCurrentSlideIndex(m_initialSlideIndex - 1);
+ else if (!m_initialSlideName.isEmpty())
+ q->setCurrentSlideName(m_initialSlideName);
+
+ m_initialSlideIndex = 0;
+ m_initialSlideName.clear();
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSSceneElementPrivate::setCommandQueue(CommandQueue *queue)
+{
+ Q_Q(Q3DSSceneElement);
+
+ if (queue || m_commandQueue) {
+ m_currentSlideIndex = 0;
+ m_currentSlideName.clear();
+ m_previousSlideIndex = 0;
+ m_previousSlideName.clear();
+ }
+ Q3DSElementPrivate::setCommandQueue(queue);
+
+ if (m_commandQueue) {
+ m_commandQueue->queueCommand(m_elementPath, CommandType_RequestSlideInfo);
+ m_slideInfoRequestPending = true;
+ // If user has set current slide before the queue has been set for the first time,
+ // we will switch to the desired slide after we initialize.
+ if (m_initialSlideIndex != 0)
+ q->setCurrentSlideIndex(m_initialSlideIndex - 1);
+ else if (!m_initialSlideName.isEmpty())
+ q->setCurrentSlideName(m_initialSlideName);
+
+ m_initialSlideIndex = 0;
+ m_initialSlideName.clear();
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSSceneElementPrivate::requestResponseHandler(CommandType commandType, void *requestData)
+{
+ switch (commandType) {
+ case CommandType_RequestSlideInfo: {
+ QVariantList *response = reinterpret_cast<QVariantList *>(requestData);
+ if (m_slideInfoRequestPending) {
+ m_slideInfoRequestPending = false;
+
+ m_previousSlideIndex = response->at(1).toInt();
+ m_previousSlideName = response->at(3).toString();
+
+ handleSlideEntered(response->at(0).toInt(), response->at(2).toString());
+ }
+ delete response;
+ break;
+ }
+ default:
+ Q3DSElementPrivate::requestResponseHandler(commandType, requestData);
+ break;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/q3dssceneelement.h b/src/api/studio3d/q3dssceneelement.h
new file mode 100644
index 0000000..2d96255
--- /dev/null
+++ b/src/api/studio3d/q3dssceneelement.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSSCENEELEMENT_H
+#define Q3DSSCENEELEMENT_H
+
+#include <QtStudio3D/q3dselement.h>
+#include <QtCore/qobject.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSSceneElementPrivate;
+
+class Q_STUDIO3D_EXPORT Q3DSSceneElement : public Q3DSElement
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Q3DSSceneElement)
+
+ Q_PROPERTY(int currentSlideIndex READ currentSlideIndex WRITE setCurrentSlideIndex NOTIFY currentSlideIndexChanged)
+ Q_PROPERTY(int previousSlideIndex READ previousSlideIndex NOTIFY previousSlideIndexChanged)
+ Q_PROPERTY(QString currentSlideName READ currentSlideName WRITE setCurrentSlideName NOTIFY currentSlideNameChanged)
+ Q_PROPERTY(QString previousSlideName READ previousSlideName NOTIFY previousSlideNameChanged)
+
+public:
+ explicit Q3DSSceneElement(QObject *parent = nullptr);
+ explicit Q3DSSceneElement(const QString &elementPath, QObject *parent = nullptr);
+ explicit Q3DSSceneElement(Q3DSPresentation *presentation, const QString &elementPath,
+ QObject *parent = nullptr);
+ ~Q3DSSceneElement();
+
+ int currentSlideIndex() const;
+ int previousSlideIndex() const;
+ QString currentSlideName() const;
+ QString previousSlideName() const;
+
+public Q_SLOTS:
+ void setCurrentSlideIndex(int currentSlideIndex);
+ void setCurrentSlideName(const QString &currentSlideName);
+ void goToSlide(bool next, bool wrap);
+ void goToTime(float time);
+
+Q_SIGNALS:
+ void currentSlideIndexChanged(int currentSlideIndex);
+ void previousSlideIndexChanged(int previousSlideIndex);
+ void currentSlideNameChanged(const QString &currentSlideName);
+ void previousSlideNameChanged(const QString &previousSlideName);
+
+private:
+ Q_DISABLE_COPY(Q3DSSceneElement)
+
+ friend class Q3DSPresentationPrivate;
+ friend class Q3DSStudio3D;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSSCENEELEMENT_H
diff --git a/src/api/studio3d/q3dssceneelement_p.h b/src/api/studio3d/q3dssceneelement_p.h
new file mode 100644
index 0000000..02d2bdf
--- /dev/null
+++ b/src/api/studio3d/q3dssceneelement_p.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSSCENEELEMENT_P_H
+#define Q3DSSCENEELEMENT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dssceneelement.h"
+#include "q3dselement_p.h"
+#include "q3dscommandqueue_p.h"
+#include "Qt3DSViewerApp.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSPresentationPrivate;
+
+class Q_STUDIO3D_EXPORT Q3DSSceneElementPrivate : public Q3DSElementPrivate
+{
+ Q_DECLARE_PUBLIC(Q3DSSceneElement)
+public:
+ explicit Q3DSSceneElementPrivate(Q3DSSceneElement *parent);
+ ~Q3DSSceneElementPrivate();
+
+ void handleSlideEntered(int index, const QString &name);
+ void goToSlide(bool next, bool wrap);
+ void goToTime(float time);
+
+ void setViewerApp(Q3DSViewer::Q3DSViewerApp *app) override;
+ void setCommandQueue(CommandQueue *queue) override;
+
+ void requestResponseHandler(CommandType commandType, void *requestData) override;
+
+private:
+ int m_currentSlideIndex;
+ int m_previousSlideIndex;
+ int m_initialSlideIndex;
+ QString m_currentSlideName;
+ QString m_previousSlideName;
+ QString m_initialSlideName;
+ bool m_slideInfoRequestPending;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSSCENEELEMENT_P_H
diff --git a/src/api/studio3d/q3dssurfaceviewer.cpp b/src/api/studio3d/q3dssurfaceviewer.cpp
new file mode 100644
index 0000000..32ffb99
--- /dev/null
+++ b/src/api/studio3d/q3dssurfaceviewer.cpp
@@ -0,0 +1,722 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dssurfaceviewer_p.h"
+#include "Qt3DSAudioPlayerImpl.h"
+#include "viewerqmlstreamproxy_p.h"
+#include "q3dsviewersettings_p.h"
+#include "q3dspresentation_p.h"
+#include "studioutils_p.h"
+
+#include <QtCore/qdebug.h>
+#include <QtGui/qopenglcontext.h>
+#include <QtGui/qopenglfunctions.h>
+#include <QtGui/qoffscreensurface.h>
+#include <QtGui/qwindow.h>
+#include <QtGui/QPlatformSurfaceEvent>
+
+#include <QtCore/QFileInfo>
+
+using namespace Q3DSViewer;
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class Q3DSSurfaceViewer
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+
+ \brief Renders a Qt 3D Studio presentation on a QWindow or an offscreen
+ render target using OpenGL.
+
+ Q3DSSurfaceViewer is used to render Qt 3D Studio presentations onto a
+ QSurface. In practice this means two types of uses: rendering to an
+ on-screen QWindow, or rendering to an offscreen render target (typically an
+ OpenGL texture via a framebuffer object and a QOffscreenSurface).
+
+ \section2 Example Usage
+
+ \code
+ int main(int argc, char *argv[])
+ {
+ QGuiApplication app(argc, argv);
+
+ QOpenGLContext context;
+ context.create();
+
+ QWindow window;
+ window.setSurfaceType(QSurface::OpenGLSurface);
+ window.setFormat(context.format());
+ window.create();
+
+ Q3DSSurfaceViewer viewer;
+ viewer.presentation()->setSource(QUrl(QStringLiteral("qrc:/my_presentation.uip")));
+ viewer.setUpdateInterval(0); // enable automatic updates
+
+ // Register a scene object for slide management (optional)
+ Q3DSSceneElement scene(viewer.presentation(), QStringLiteral("Scene"));
+
+ // Register an element object for attribute setting (optional)
+ Q3DSElement element(viewer.presentation(), QStringLiteral("Scene.Layer.myCarModel"));
+
+ viewer.create(&window, &context);
+
+ w.resize(1024, 768);
+ w.show();
+
+ return app.exec();
+ }
+ \endcode
+
+ \sa Q3DSWidget
+ */
+
+/*!
+ * \brief Q3DSSurfaceViewer::Q3DSSurfaceViewer Constructor.
+ * \param parent Optional parent of the object.
+ */
+Q3DSSurfaceViewer::Q3DSSurfaceViewer(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSSurfaceViewerPrivate(this))
+{
+}
+
+/*!
+ * \brief Q3DSSurfaceViewer::~Q3DSSurfaceViewer Destructor
+ */
+Q3DSSurfaceViewer::~Q3DSSurfaceViewer()
+{
+ delete d_ptr;
+}
+
+/*!
+ Initializes Q3DSSurfaceViewer to render the presentation to the given
+ \a surface using the \a context.
+
+ The source property of the attached presentation must be set before the
+ viewer can be initialized.
+
+ Returns whether the initialization succeeded.
+
+ \sa running, Q3DSPresentation::source, presentation()
+*/
+bool Q3DSSurfaceViewer::create(QSurface *surface, QOpenGLContext *context)
+{
+ return d_ptr->initialize(surface, context, 0, false);
+}
+
+
+/*!
+ Initializes Q3DSSurfaceViewer to render the presentation to the given
+ \a surface using the \a context and optional framebuffer id (\a fboId). If
+ \a fboId is omitted, it defaults to zero.
+
+ The source property of the attached presentation must be set before the
+ viewer can be initialized.
+
+ Returns whether the initialization succeeded.
+
+ \sa running, Q3DSPresentation::source, presentation()
+*/
+bool Q3DSSurfaceViewer::create(QSurface *surface, QOpenGLContext *context, GLuint fboId)
+{
+ return d_ptr->initialize(surface, context, fboId, true);
+}
+
+/*!
+ Releases the presentation and all related resources.
+ The Q3DSSurfaceViewer instance can be reused by calling create() again.
+ */
+void Q3DSSurfaceViewer::destroy()
+{
+ d_ptr->destroy();
+}
+
+/*!
+ Updates the surface viewer with a new frame.
+*/
+void Q3DSSurfaceViewer::update()
+{
+ d_ptr->update();
+}
+
+/*!
+ Grabs the data rendered to the framebuffer into an image using the given \a
+ rect. The \a rect parameter is optional. If it is omitted, the whole
+ framebuffer is captured.
+
+ \note This is a potentially expensive operation.
+*/
+QImage Q3DSSurfaceViewer::grab(const QRect &rect)
+{
+ return d_ptr->grab(rect);
+}
+
+/*!
+ \property Q3DSSurfaceViewer::size
+
+ Holds the desired size of the presentation. Relevant only when
+ autoSize is set to \c false.
+
+ \sa autoSize
+*/
+QSize Q3DSSurfaceViewer::size() const
+{
+ return d_ptr->m_size;
+}
+
+void Q3DSSurfaceViewer::setSize(const QSize &size)
+{
+ d_ptr->setSize(size);
+}
+
+/*!
+ \property Q3DSSurfaceViewer::autoSize
+
+ Specifies whether the viewer should change the size of the presentation
+ automatically to match the surface size when surface size changes. The
+ \l{Q3DSSurfaceViewer::size}{size} property is updated automatically
+ whenever the viewer is \l{Q3DSSurfaceViewer::update()}{updated} if this
+ property value is \c{true}.
+
+ When rendering offscreen, via a QOffscreenSurface, this property must be
+ set to \c{false} by the application since it is then up to the application
+ to provide a QOpenGLFramebufferObject with the desired size. The size of
+ the Q3DSSurfaceViewer must be set to the same value.
+
+ The default value is \c{true}.
+*/
+bool Q3DSSurfaceViewer::autoSize() const
+{
+ return d_ptr->m_autoSize;
+}
+
+void Q3DSSurfaceViewer::setAutoSize(bool autoSize)
+{
+ if (d_ptr->m_autoSize != autoSize) {
+ d_ptr->m_autoSize = autoSize;
+ Q_EMIT autoSizeChanged(autoSize);
+ }
+}
+
+/*!
+ \property Q3DSSurfaceViewer::updateInterval
+
+ Holds the viewer update interval in milliseconds. If the value is negative,
+ the viewer doesn't update the presentation automatically.
+
+ The default value is -1, meaning there are no automatic updates and
+ update() must be called manually.
+
+ \sa update()
+*/
+int Q3DSSurfaceViewer::updateInterval() const
+{
+ return d_ptr->m_updateInterval;
+}
+
+void Q3DSSurfaceViewer::setUpdateInterval(int interval)
+{
+ d_ptr->setUpdateInterval(interval);
+}
+
+/*!
+ \property Q3DSSurfaceViewer::running
+
+ The value of this property is \c true when the presentation has been loaded
+ and is ready to be shown.
+
+ This property is read-only.
+*/
+bool Q3DSSurfaceViewer::isRunning() const
+{
+ return d_ptr->m_viewerApp != nullptr;
+}
+
+// #TODO QT3DS-3534
+
+/*!
+ \property Q3DSSurfaceViewer::presentationId
+ */
+QString Q3DSSurfaceViewer::presentationId() const
+{
+ return d_ptr->m_id;
+}
+
+/*!
+ Returns the framebuffer id given in initialization.
+
+ \sa create()
+*/
+int Q3DSSurfaceViewer::fboId() const
+{
+ return d_ptr->m_fboId;
+}
+
+/*!
+ Returns the error string.
+*/
+QString Q3DSSurfaceViewer::error() const
+{
+ return d_ptr->m_error;
+}
+
+/*!
+ Returns the surface given in initialization.
+
+ \sa create()
+*/
+QSurface *Q3DSSurfaceViewer::surface() const
+{
+ return d_ptr->m_surface;
+}
+
+/*!
+ Returns the context given in initialization.
+
+ \sa create()
+*/
+QOpenGLContext *Q3DSSurfaceViewer::context() const
+{
+ return d_ptr->m_context;
+}
+
+/*!
+ Returns the settings object used by the Q3DSSurfaceViewer.
+*/
+Q3DSViewerSettings *Q3DSSurfaceViewer::settings() const
+{
+ return d_ptr->m_settings;
+}
+
+/*!
+ Returns the presentation object used by the Q3DSSurfaceViewer.
+*/
+Q3DSPresentation *Q3DSSurfaceViewer::presentation() const
+{
+ return d_ptr->m_presentation;
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewer::setPresentationId(const QString &id)
+{
+ if (d_ptr->m_id != id) {
+ d_ptr->m_id = id;
+ Q_EMIT presentationIdChanged(id);
+ if (d_ptr->m_viewerApp)
+ d_ptr->m_viewerApp->setPresentationId(id);
+ }
+}
+
+// TODO: QT3DS-3563
+
+/*!
+ * \brief Q3DSSurfaceViewer::qmlEngine
+ * \return
+ */
+QQmlEngine *Q3DSSurfaceViewer::qmlEngine() const
+{
+ Q_D(const Q3DSSurfaceViewer);
+ return d->qmlEngine;
+}
+
+/*!
+ * \brief Q3DSSurfaceViewer::setQmlEngine
+ * \param qmlEngine
+ */
+void Q3DSSurfaceViewer::setQmlEngine(QQmlEngine *qmlEngine)
+{
+ Q_D(Q3DSSurfaceViewer);
+ d->qmlEngine = qmlEngine;
+}
+
+
+/*!
+ \fn Q3DSSurfaceViewer::frameUpdate()
+
+ Emitted each time a frame has been rendered.
+*/
+
+/*!
+ \fn Q3DSSurfaceViewer::presentationLoaded()
+
+ Emitted when the presentation has been loaded and is ready
+ to be shown.
+*/
+
+/*!
+ \fn Q3DSSurfaceViewer::presentationReady()
+ Emitted when first frame is about to be shown. DataInputs and setAttribute
+ are ready to be used after this signal.
+ */
+
+/*!
+ * \internal
+ */
+Q3DSSurfaceViewerPrivate::Q3DSSurfaceViewerPrivate(Q3DSSurfaceViewer *q)
+ : QObject(q)
+ , q_ptr(q)
+ , m_viewerApp(nullptr)
+ , m_timer(nullptr)
+ , m_updateInterval(-1)
+ , m_pixelRatio(1.0)
+ , m_fboId(0)
+ , m_surface(nullptr)
+ , m_context(nullptr)
+ , m_autoSize(true)
+ , m_settings(new Q3DSViewerSettings(this))
+ , m_presentation(new Q3DSPresentation(this))
+{
+ m_startupTimer.start();
+ connect(m_presentation, &Q3DSPresentation::sourceChanged,
+ this, &Q3DSSurfaceViewerPrivate::reset);
+}
+
+/*!
+ * \internal
+ */
+Q3DSSurfaceViewerPrivate::~Q3DSSurfaceViewerPrivate()
+{
+ releaseRuntime();
+
+ delete m_timer;
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::setSize(const QSize &size)
+{
+ if (m_size != size) {
+ m_size = size;
+
+ if (m_viewerApp) {
+ m_context->makeCurrent(m_surface);
+ m_viewerApp->Resize(int(m_size.width() * m_pixelRatio),
+ int(m_size.height() * m_pixelRatio));
+ }
+
+ Q_EMIT q_ptr->sizeChanged(m_size);
+ }
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::setUpdateInterval(int interval)
+{
+ if (m_updateInterval != interval) {
+ m_updateInterval = interval;
+ resetUpdateTimer();
+ Q_EMIT q_ptr->updateIntervalChanged(m_updateInterval);
+ }
+}
+
+/*!
+ * \internal
+ */
+bool Q3DSSurfaceViewerPrivate::initialize(QSurface *surface, QOpenGLContext *context, GLuint fboId,
+ bool idValid)
+{
+ Q_ASSERT(context);
+ Q_ASSERT(surface);
+
+ if (m_presentation->source().isEmpty()) {
+ setError(QStringLiteral("Failed to initialize Q3DSSurfaceViewer,"
+ " presentation source must be set before calling initialize()"));
+ return false;
+ }
+
+ QFileInfo info(Q3DSUtils::urlToLocalFileOrQrc(m_presentation->source()));
+ if (!info.exists()) {
+ setError(QStringLiteral("Failed to initialize Q3DSSurfaceViewer, the presentation doesn't exist: %1")
+ .arg(m_presentation->source().toString()));
+ return false;
+ }
+
+ destroy();
+
+ m_surface = surface;
+ m_context = context;
+ m_fboId = idValid ? fboId : m_context->defaultFramebufferObject();
+ if (m_surface->surfaceClass() == QSurface::Window)
+ m_pixelRatio = static_cast<QWindow *>(m_surface)->devicePixelRatio();
+
+ surfaceObject()->installEventFilter(this);
+
+ connect(context, &QOpenGLContext::aboutToBeDestroyed, this, &Q3DSSurfaceViewerPrivate::destroy);
+
+ bool success = initializeRuntime();
+ resetUpdateTimer();
+
+ if (success)
+ Q_EMIT q_ptr->runningChanged(true);
+
+ return success;
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::destroy()
+{
+ bool oldInitialized = (m_viewerApp != nullptr);
+
+ if (m_context) {
+ disconnect(m_context, &QOpenGLContext::aboutToBeDestroyed,
+ this, &Q3DSSurfaceViewerPrivate::destroy);
+ }
+
+ if (m_surface)
+ surfaceObject()->removeEventFilter(this);
+
+ releaseRuntime();
+
+ m_surface = nullptr;
+ m_context = nullptr;
+ m_fboId = 0;
+
+ if (oldInitialized)
+ Q_EMIT q_ptr->runningChanged(false);
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::update()
+{
+ if (m_viewerApp) {
+ if (m_surface->surfaceClass() != QSurface::Window
+ || static_cast<QWindow *>(m_surface)->isExposed()) {
+ if (!m_context->makeCurrent(m_surface)) {
+ qWarning () << "Q3DSSurfaceViewer: Unable to make context current";
+ return;
+ }
+
+ if (!m_viewerApp->IsInitialised() && !initializeRuntime())
+ return;
+
+ if (m_autoSize)
+ setSize(m_surface->size());
+ m_viewerApp->Render();
+
+ const uint defaultFbo = m_context->defaultFramebufferObject();
+
+ if (m_surface->surfaceClass() == QSurface::Window && m_fboId == defaultFbo)
+ m_context->swapBuffers(m_surface);
+
+ Q_EMIT q_ptr->frameUpdate();
+ }
+ }
+}
+
+extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format,
+ bool include_alpha);
+
+/*!
+ * \internal
+ */
+QImage Q3DSSurfaceViewerPrivate::grab(const QRect &rect)
+{
+ QRect captureRect;
+ QSize fullSize = m_size * m_pixelRatio;
+ if (rect.isValid()) {
+ captureRect = QRect(rect.x() * m_pixelRatio, rect.y() * m_pixelRatio,
+ rect.width() * m_pixelRatio, rect.height() * m_pixelRatio);
+ } else {
+ captureRect = QRect(0, 0, fullSize.width(), fullSize.height());
+ }
+ QImage image(captureRect.size(), QImage::Format_ARGB32);
+
+ if (m_surface && m_context && m_viewerApp && m_viewerApp->IsInitialised()
+ && (m_surface->surfaceClass() != QSurface::Window
+ || static_cast<QWindow *>(m_surface)->isExposed())) {
+ m_context->makeCurrent(m_surface);
+
+ // Render now to ensure the image is up to date and will actually exist in case
+ // the surface has a non-preserved swap buffer
+ if (m_autoSize)
+ setSize(m_surface->size());
+ m_viewerApp->Render();
+
+ m_context->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_fboId);
+ QImage fullGrab = qt_gl_read_framebuffer(fullSize, false, false);
+
+ // Also update the screen to match the grab, since we just rendered
+ if (m_surface->surfaceClass() == QSurface::Window
+ && m_fboId == m_context->defaultFramebufferObject()) {
+ m_context->swapBuffers(m_surface);
+ }
+
+ if (captureRect.size() == fullSize)
+ image = fullGrab;
+ else
+ image = fullGrab.copy(captureRect);
+ }
+
+ return image;
+}
+
+/*!
+ * \internal
+ */
+bool Q3DSSurfaceViewerPrivate::eventFilter(QObject *obj, QEvent *e)
+{
+ if (m_surface && e->type() == QEvent::PlatformSurface) {
+ if (surfaceObject() == obj) {
+ QPlatformSurfaceEvent *ev = static_cast<QPlatformSurfaceEvent *>(e);
+ if (ev->surfaceEventType() == QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed)
+ destroy();
+ }
+ }
+ return QObject::eventFilter(obj, e);
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::reset()
+{
+ if (m_viewerApp) {
+ releaseRuntime();
+ initializeRuntime();
+ resetUpdateTimer();
+ }
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::setError(const QString &error)
+{
+ if (m_error != error) {
+ m_error = error;
+ qWarning() << error;
+ Q_EMIT q_ptr->errorChanged();
+ }
+}
+
+/*!
+ * \internal
+ */
+bool Q3DSSurfaceViewerPrivate::initializeRuntime()
+{
+ if (!m_viewerApp) {
+ m_viewerApp = &Q3DSViewerApp::Create(m_context, new Qt3DSAudioPlayerImpl(), &m_startupTimer);
+ connect(m_viewerApp, &Q3DSViewerApp::SigPresentationReady,
+ this->q_ptr, &Q3DSSurfaceViewer::presentationReady);
+ connect(m_viewerApp, &Q3DSViewerApp::SigPresentationLoaded,
+ this->q_ptr, &Q3DSSurfaceViewer::presentationLoaded);
+ Q_ASSERT(m_viewerApp);
+ }
+ if (!m_context->makeCurrent(m_surface)) {
+ qWarning () << "Q3DSSurfaceViewer: Unable to make context current";
+ return false;
+ }
+
+
+ const QString localSource = Q3DSUtils::urlToLocalFileOrQrc(m_presentation->source());
+
+ if (m_autoSize)
+ m_size = m_surface->size();
+
+ if (nullptr != qmlEngine)
+ m_presentation->d_ptr->streamProxy()->setEngine(qmlEngine);
+
+ if (!m_viewerApp->InitializeApp(int(m_size.width() * m_pixelRatio),
+ int(m_size.height() * m_pixelRatio),
+ m_context->format(), m_fboId, localSource,
+ m_presentation->variantList(),
+ m_presentation->delayedLoading(),
+ m_presentation->d_ptr->streamProxy())) {
+ setError(m_viewerApp->error());
+ releaseRuntime();
+ qWarning("Failed to initialize runtime");
+ return false;
+ }
+
+ if (!m_id.isEmpty())
+ m_viewerApp->setPresentationId(m_id);
+ m_settings->d_ptr->setViewerApp(m_viewerApp);
+ m_presentation->d_ptr->setViewerApp(m_viewerApp);
+ return true;
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::releaseRuntime()
+{
+ m_settings->d_ptr->setViewerApp(nullptr);
+ m_presentation->d_ptr->setViewerApp(nullptr);
+
+ if (m_context && m_surface)
+ m_context->makeCurrent(m_surface);
+
+ if (m_viewerApp) {
+ m_viewerApp->Release();
+ m_viewerApp = nullptr;
+ }
+
+ resetUpdateTimer();
+}
+
+/*!
+ * \internal
+ */
+void Q3DSSurfaceViewerPrivate::resetUpdateTimer()
+{
+ if (m_viewerApp && m_updateInterval >= 0) {
+ if (!m_timer) {
+ m_timer = new QTimer();
+ connect(m_timer, &QTimer::timeout, this, &Q3DSSurfaceViewerPrivate::update);
+ }
+ m_timer->start(m_updateInterval);
+ } else if (m_timer) {
+ m_timer->stop();
+ }
+}
+
+/*!
+ * \internal
+ */
+QObject *Q3DSSurfaceViewerPrivate::surfaceObject()
+{
+ if (m_surface) {
+ if (m_surface->surfaceClass() == QSurface::Window)
+ return static_cast<QWindow *>(m_surface);
+ else
+ return static_cast<QOffscreenSurface *>(m_surface);
+ }
+ return nullptr;
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/q3dssurfaceviewer.h b/src/api/studio3d/q3dssurfaceviewer.h
new file mode 100644
index 0000000..42be5c2
--- /dev/null
+++ b/src/api/studio3d/q3dssurfaceviewer.h
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSSURFACEVIEWER_H
+#define Q3DSSURFACEVIEWER_H
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qsize.h>
+#include <QtCore/qurl.h>
+#include <QtGui/qimage.h>
+#include <QtGui/qopengl.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSSurfaceViewerPrivate;
+class QSurface;
+class QOpenGLContext;
+class Q3DSViewerSettings;
+class Q3DSPresentation;
+class QQmlEngine;
+
+class Q_STUDIO3D_EXPORT Q3DSSurfaceViewer : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Q3DSSurfaceViewer)
+
+ Q_PROPERTY(QString error READ error NOTIFY errorChanged)
+ Q_PROPERTY(bool running READ isRunning NOTIFY runningChanged)
+ Q_PROPERTY(QSize size READ size WRITE setSize NOTIFY sizeChanged)
+ Q_PROPERTY(bool autoSize READ autoSize WRITE setAutoSize NOTIFY autoSizeChanged)
+ Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval NOTIFY updateIntervalChanged)
+ Q_PROPERTY(QString presentationId READ presentationId WRITE setPresentationId NOTIFY presentationIdChanged)
+
+public:
+ explicit Q3DSSurfaceViewer(QObject *parent = nullptr);
+ ~Q3DSSurfaceViewer();
+
+ bool create(QSurface *surface, QOpenGLContext *context);
+ bool create(QSurface *surface, QOpenGLContext *context, GLuint fboId);
+ void destroy();
+
+ Q3DSPresentation *presentation() const;
+ Q3DSViewerSettings *settings() const;
+
+ bool isRunning() const;
+
+ QSize size() const;
+ void setSize(const QSize &size);
+
+ bool autoSize() const;
+ void setAutoSize(bool autoSize);
+
+ int updateInterval() const;
+ void setUpdateInterval(int interval);
+
+ int fboId() const;
+ QSurface *surface() const;
+ QOpenGLContext *context() const;
+
+ QImage grab(const QRect &rect = QRect());
+
+ QQmlEngine *qmlEngine() const;
+ void setQmlEngine(QQmlEngine *qmlEngine);
+ QString presentationId() const;
+
+ QString error() const;
+
+public Q_SLOTS:
+ void update();
+ void setPresentationId(const QString &id);
+
+Q_SIGNALS:
+ void presentationLoaded();
+ void presentationReady();
+ void frameUpdate();
+ void errorChanged();
+
+ void presentationIdChanged(const QString &id);
+ void sizeChanged(const QSize &size);
+ void autoSizeChanged(bool autoSize);
+ void updateIntervalChanged(bool autoUpdate);
+ void runningChanged(bool initialized);
+
+private:
+ Q_DISABLE_COPY(Q3DSSurfaceViewer)
+ Q3DSSurfaceViewerPrivate *d_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSSURFACEVIEWER_H
diff --git a/src/api/studio3d/q3dssurfaceviewer_p.h b/src/api/studio3d/q3dssurfaceviewer_p.h
new file mode 100644
index 0000000..fba82e5
--- /dev/null
+++ b/src/api/studio3d/q3dssurfaceviewer_p.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSSURFACEVIEWER_P_H
+#define Q3DSSURFACEVIEWER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dssurfaceviewer.h"
+#include "Qt3DSViewerApp.h"
+
+#include <QtCore/qtimer.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSurface;
+class QOpenGLContext;
+class Q3DSViewerSettings;
+class Q3DSPresentation;
+class QQmlEngine;
+
+class Q_STUDIO3D_EXPORT Q3DSSurfaceViewerPrivate : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PUBLIC(Q3DSSurfaceViewer)
+public:
+ explicit Q3DSSurfaceViewerPrivate(Q3DSSurfaceViewer *parent = nullptr);
+ ~Q3DSSurfaceViewerPrivate();
+
+ void setSize(const QSize &size);
+ void setUpdateInterval(int interval);
+ bool initialize(QSurface *surface, QOpenGLContext *context, GLuint fboId, bool idValid);
+ void update();
+
+ QImage grab(const QRect &rect);
+
+private Q_SLOTS:
+ void destroy();
+
+protected:
+ bool eventFilter(QObject *obj, QEvent *e) override;
+
+private:
+ void reset();
+ void setError(const QString &error);
+ bool initializeRuntime();
+ void releaseRuntime();
+ void resetUpdateTimer();
+ QObject *surfaceObject();
+
+ Q3DSSurfaceViewer *q_ptr;
+
+ Q3DSViewer::Q3DSViewerApp *m_viewerApp;
+ QSize m_size;
+ QTimer *m_timer;
+ int m_updateInterval;
+ qreal m_pixelRatio;
+ GLuint m_fboId;
+ QSurface *m_surface; // Not owned
+ QOpenGLContext *m_context; // Not owned
+ bool m_autoSize;
+ Q3DSViewerSettings *m_settings;
+ Q3DSPresentation *m_presentation;
+ QString m_id;
+ QElapsedTimer m_startupTimer;
+ QQmlEngine *qmlEngine = nullptr;
+ QString m_error;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSSURFACEVIEWER_P_H
diff --git a/src/api/studio3d/q3dsviewersettings.cpp b/src/api/studio3d/q3dsviewersettings.cpp
new file mode 100644
index 0000000..187729a
--- /dev/null
+++ b/src/api/studio3d/q3dsviewersettings.cpp
@@ -0,0 +1,401 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsviewersettings_p.h"
+#include "Qt3DSViewerApp.h"
+#include "q3dscommandqueue_p.h"
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qsettings.h>
+#include <QtCore/qcoreapplication.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype ViewerSettings
+ \instantiates Q3DSViewerSettings
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief Qt 3D Studio presentation viewer settings.
+
+ This type provides properties to define presentation independent viewer settings.
+
+ \note ViewerSettings are only applicable when \l Studio3D is used in the
+ default mode, showing the final, composed image from the Qt 3D Studio
+ renderer.
+
+ \sa Studio3D
+*/
+
+/*!
+ \class Q3DSViewerSettings
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+
+ \brief Qt 3D Studio presentation viewer settings.
+
+ Q3DSViewerSettings provides properties to define presentation independent
+ viewer settings.
+
+ \note This class should not be instantiated directly when working with the
+ C++ APIs. Q3DSSurfaceViewer and Q3DSWidget create a Q3DSViewerSettings
+ instance implicitly. This can be queried via Q3DSSurfaceViewer::settings()
+ or Q3DSWidget::settings().
+ */
+
+/*!
+ * \internal
+ */
+Q3DSViewerSettings::Q3DSViewerSettings(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new Q3DSViewerSettingsPrivate(this))
+{
+}
+
+/*!
+ * \internal
+ */
+Q3DSViewerSettings::~Q3DSViewerSettings()
+{
+}
+
+/*!
+ \enum Q3DSViewerSettings::ScaleMode
+
+ This enumeration specifies the possible scaling modes.
+
+ \value ScaleModeFit Scales the presentation to fit the output area.
+ \value ScaleModeFill Scales the presentation to completely fill the output area.
+ This is the default.
+ \value ScaleModeCenter Centers the presentation in the output area without scaling it.
+*/
+
+/*!
+ \qmlproperty QColor ViewerSettings::matteColor
+
+ Specifies the matte color.
+ */
+
+/*!
+ \property Q3DSViewerSettings::matteColor
+
+ Specifies the matte color.
+ */
+QColor Q3DSViewerSettings::matteColor() const
+{
+ return d_ptr->m_matteColor;
+}
+
+void Q3DSViewerSettings::setMatteColor(const QColor &color)
+{
+ if (d_ptr->m_matteColor != color) {
+ d_ptr->setMatteColor(color);
+ Q_EMIT matteColorChanged(color);
+ }
+}
+
+/*!
+ \qmlproperty bool ViewerSettings::showRenderStats
+
+ If this property is set to \c true, the simple profile
+ view is displayed in-scene, on top of the 3D content.
+
+ \note this feature can be disabled at build time, in which case this
+ property has no effect.
+
+ The default value is \c{false}.
+*/
+
+/*!
+ \property Q3DSViewerSettings::showRenderStats
+
+ When this property is \c{true}, the simple profile
+ view is displayed in-scene, on top of the 3D content.
+
+ \note This feature can be disabled at build time, in which case this
+ property has no effect.
+
+ Default value is \c{false}.
+*/
+bool Q3DSViewerSettings::isShowRenderStats() const
+{
+ return d_ptr->m_showRenderStats;
+}
+
+void Q3DSViewerSettings::setShowRenderStats(bool show)
+{
+ if (d_ptr->m_showRenderStats != show) {
+ d_ptr->setShowRenderStats(show);
+ Q_EMIT showRenderStatsChanged(show);
+ }
+}
+
+/*!
+ \qmlproperty ViewerSettings::shadeMode
+ */
+
+/*!
+ \property Q3DSViewerSettings::shadeMode
+ */
+Q3DSViewerSettings::ShadeMode Q3DSViewerSettings::shadeMode() const
+{
+ return d_ptr->m_shadeMode;
+}
+
+void Q3DSViewerSettings::setShadeMode(Q3DSViewerSettings::ShadeMode mode)
+{
+ if (d_ptr->m_shadeMode != mode) {
+ d_ptr->setShadeMode(mode);
+ Q_EMIT shadeModeChanged(mode);
+ }
+}
+
+/*!
+ \qmlproperty enumeration ViewerSettings::scaleMode
+
+ Specifies the scaling mode. The default value \c is ScaleModeFill where the
+ size of the presentation on-screen follows and fills the size of the output
+ area (the window, the screen, or the area occupied by the Studio3D
+ element).
+
+ During the design phase it can be valuable to see the presentation with
+ some other scaling approach. For example, the Qt 3D Studio Viewer
+ application uses ScaleModeCenter by default.
+
+ \value ScaleModeFit Scales the presentation to fit the output area.
+ \value ScaleModeFill Scales the presentation to completely fill the output area.
+ \value ScaleModeCenter Centers the presentation in the output area without scaling it.
+
+ The default value is \c{ScaleModeFill}.
+*/
+/*!
+ \property Q3DSViewerSettings::scaleMode
+
+ Specifies the scaling mode. The default value \c is ScaleModeFill where the
+ size of the presentation on-screen follows and fills the size of the output
+ area (the window, the screen, or the area occupied by the \l Studio3D
+ element).
+
+ During the design phase it can be valuable to see the presentation with
+ some other scaling approach. For example, the Qt 3D Studio Viewer
+ application uses ScaleModeCenter by default.
+
+ \value ScaleModeFit Scales the presentation to fit the output area.
+ \value ScaleModeFill Scales the presentation to completely fill the output area.
+ \value ScaleModeCenter Centers the presentation in the output area without scaling it.
+
+ The default value is \c{ScaleModeFill}.
+ */
+Q3DSViewerSettings::ScaleMode Q3DSViewerSettings::scaleMode() const
+{
+ return d_ptr->m_scaleMode;
+}
+
+void Q3DSViewerSettings::setScaleMode(Q3DSViewerSettings::ScaleMode mode)
+{
+ if (d_ptr->m_scaleMode != mode) {
+ d_ptr->setScaleMode(mode);
+ Q_EMIT scaleModeChanged(mode);
+ }
+}
+
+/*!
+ \qmmlmethod ViewerSettings::save
+ Persistently saves the viewer \l{QSettings}{settings} using \a group, \a organization and
+ \a application.
+ \param group
+ \param organization
+ \param application
+ */
+/*!
+ * \brief Q3DSViewerSettings::save Persistently saves the viewer \l{QSettings}{settings}
+ Persistently saves the viewer \l{QSettings}{settings} using \a group, \a organization and
+ \a application.
+ \param group
+ \param organization
+ \param application
+ */
+void Q3DSViewerSettings::save(const QString &group, const QString &organization,
+ const QString &application)
+{
+ d_ptr->save(group, organization, application);
+}
+
+/*!
+ \qmlmethod ViewerSettings::load
+ Loads previously saved viewer \l{QSettings}{settings} using \a group, \a organization and
+ \a application.
+ \param group
+ \param organization
+ \param application
+ */
+/*!
+ * \brief Q3DSViewerSettings::load Loads previously saved viewer \l{QSettings}{settings}
+ Loads previously saved viewer \l{QSettings}{settings} using \a group, \a organization and
+ \a application.
+ \param group
+ \param organization
+ \param application
+ */
+void Q3DSViewerSettings::load(const QString &group, const QString &organization,
+ const QString &application)
+{
+ d_ptr->load(group, organization, application);
+}
+
+Q3DSViewerSettingsPrivate::Q3DSViewerSettingsPrivate(Q3DSViewerSettings *q)
+ : QObject(q)
+ , q_ptr(q)
+ , m_viewerApp(nullptr)
+ , m_commandQueue(nullptr)
+ , m_matteColor(Qt::black)
+ , m_showRenderStats(false)
+ , m_shadeMode(Q3DSViewerSettings::ShadeModeShaded)
+ , m_scaleMode(Q3DSViewerSettings::ScaleModeCenter)
+ , m_savedSettings(nullptr)
+{
+}
+
+Q3DSViewerSettingsPrivate::~Q3DSViewerSettingsPrivate()
+{
+}
+
+void Q3DSViewerSettingsPrivate::setViewerApp(Q3DSViewer::Q3DSViewerApp *app)
+{
+ m_viewerApp = app;
+ if (m_viewerApp) {
+ setMatteColor(m_matteColor);
+ setShowRenderStats(m_showRenderStats);
+ setShadeMode(m_shadeMode);
+ setScaleMode(m_scaleMode);
+ }
+}
+
+void Q3DSViewerSettingsPrivate::setCommandQueue(CommandQueue *queue)
+{
+ m_commandQueue = queue;
+ if (m_commandQueue) {
+ setMatteColor(m_matteColor);
+ setShowRenderStats(m_showRenderStats);
+ setShadeMode(m_shadeMode);
+ setScaleMode(m_scaleMode);
+ }
+}
+
+void Q3DSViewerSettingsPrivate::save(const QString &group, const QString &organization,
+ const QString &application)
+{
+ initSettingsStore(group, organization, application);
+
+ m_savedSettings->setValue(QStringLiteral("matteColor"), m_matteColor);
+ m_savedSettings->setValue(QStringLiteral("showRenderStats"), m_showRenderStats);
+ m_savedSettings->setValue(QStringLiteral("shadeMode"), m_shadeMode);
+ m_savedSettings->setValue(QStringLiteral("scaleMode"), m_scaleMode);
+}
+
+void Q3DSViewerSettingsPrivate::load(const QString &group, const QString &organization,
+ const QString &application)
+{
+ initSettingsStore(group, organization, application);
+
+ q_ptr->setMatteColor(m_savedSettings->value(QStringLiteral("matteColor")).value<QColor>());
+ q_ptr->setShowRenderStats(m_savedSettings->value(QStringLiteral("showRenderStats")).toBool());
+ q_ptr->setShadeMode(Q3DSViewerSettings::ShadeMode(
+ m_savedSettings->value(QStringLiteral("shadeMode")).toInt()));
+ q_ptr->setScaleMode(Q3DSViewerSettings::ScaleMode(
+ m_savedSettings->value(QStringLiteral("scaleMode")).toInt()));
+}
+
+void Q3DSViewerSettingsPrivate::setMatteColor(const QColor &color)
+{
+ m_matteColor = color;
+ if (m_viewerApp) {
+ m_viewerApp->setMatteColor(color);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_matteColor = color;
+ m_commandQueue->m_matteColorChanged = true;
+ }
+}
+
+void Q3DSViewerSettingsPrivate::setShowRenderStats(bool show)
+{
+ m_showRenderStats = show;
+ if (m_viewerApp) {
+ m_viewerApp->setShowOnScreenStats(show);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_showRenderStats = show;
+ m_commandQueue->m_showRenderStatsChanged = true;
+ }
+}
+
+void Q3DSViewerSettingsPrivate::setShadeMode(Q3DSViewerSettings::ShadeMode mode)
+{
+ m_shadeMode = mode;
+ if (m_viewerApp) {
+ if (mode == Q3DSViewerSettings::ShadeModeShaded)
+ m_viewerApp->SetShadeMode(Q3DSViewer::ViewerShadeModes::Shaded);
+ else
+ m_viewerApp->SetShadeMode(Q3DSViewer::ViewerShadeModes::ShadedWireframe);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_shadeMode = mode;
+ m_commandQueue->m_shadeModeChanged = true;
+ }
+}
+
+void Q3DSViewerSettingsPrivate::setScaleMode(Q3DSViewerSettings::ScaleMode mode)
+{
+ m_scaleMode = mode;
+ if (m_viewerApp) {
+ if (mode == Q3DSViewerSettings::ScaleModeFit)
+ m_viewerApp->SetScaleMode(Q3DSViewer::ViewerScaleModes::ScaleToFit);
+ else if (mode == Q3DSViewerSettings::ScaleModeFill)
+ m_viewerApp->SetScaleMode(Q3DSViewer::ViewerScaleModes::ScaleToFill);
+ else
+ m_viewerApp->SetScaleMode(Q3DSViewer::ViewerScaleModes::ExactSize);
+ } else if (m_commandQueue) {
+ m_commandQueue->m_scaleMode = mode;
+ m_commandQueue->m_scaleModeChanged = true;
+ }
+}
+
+void Q3DSViewerSettingsPrivate::initSettingsStore(const QString &group, const QString &organization,
+ const QString &application)
+{
+ if (!m_savedSettings) {
+ QString org = organization.isEmpty() ? QCoreApplication::instance()->organizationName()
+ : organization;
+ QString app = application.isEmpty() ? QCoreApplication::instance()->applicationName()
+ : application;
+
+ m_savedSettings = new QSettings(org, app, this);
+ m_savedSettings->beginGroup(group);
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/q3dsviewersettings.h b/src/api/studio3d/q3dsviewersettings.h
new file mode 100644
index 0000000..5d7abf6
--- /dev/null
+++ b/src/api/studio3d/q3dsviewersettings.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSVIEWERSETTINGS_H
+#define Q3DSVIEWERSETTINGS_H
+
+#include <QtStudio3D/qstudio3dglobal.h>
+#include <QtCore/qobject.h>
+#include <QtGui/qcolor.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSViewerSettingsPrivate;
+
+class Q_STUDIO3D_EXPORT Q3DSViewerSettings : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PRIVATE(Q3DSViewerSettings)
+ Q_ENUMS(ShadeMode)
+ Q_ENUMS(ScaleMode)
+
+// #TODO: QT3DS-3542 Q3DSViewerSettings API is missing property matteEnabled compared to 2.3
+// Q_PROPERTY(bool matteEnabled READ matteEnabled WRITE setMatteEnabled NOTIFY matteEnabledChanged)
+
+ Q_PROPERTY(QColor matteColor READ matteColor WRITE setMatteColor NOTIFY matteColorChanged)
+ Q_PROPERTY(bool showRenderStats READ isShowRenderStats WRITE setShowRenderStats NOTIFY showRenderStatsChanged)
+ Q_PROPERTY(ScaleMode scaleMode READ scaleMode WRITE setScaleMode NOTIFY scaleModeChanged)
+
+public:
+ enum ShadeMode {
+ ShadeModeShaded,
+ ShadeModeShadedWireframe
+ };
+
+ enum ScaleMode {
+ ScaleModeFit,
+ ScaleModeFill,
+ ScaleModeCenter
+ };
+
+ explicit Q3DSViewerSettings(QObject *parent = nullptr);
+ ~Q3DSViewerSettings();
+
+ QColor matteColor() const;
+ bool isShowRenderStats() const;
+ ScaleMode scaleMode() const;
+
+ Q_INVOKABLE void save(const QString &group, const QString &organization = QString(),
+ const QString &application = QString());
+ Q_INVOKABLE void load(const QString &group, const QString &organization = QString(),
+ const QString &application = QString());
+
+public Q_SLOTS:
+ void setMatteColor(const QColor &color);
+ void setShowRenderStats(bool show);
+ void setScaleMode(ScaleMode mode);
+
+Q_SIGNALS:
+ void matteColorChanged(const QColor &color);
+ void showRenderStatsChanged(bool show);
+ void shadeModeChanged(ShadeMode mode);
+ void scaleModeChanged(ScaleMode mode);
+
+private:
+ Q_DISABLE_COPY(Q3DSViewerSettings)
+ Q3DSViewerSettingsPrivate *d_ptr;
+
+ ShadeMode shadeMode() const;
+ void setShadeMode(ShadeMode mode);
+
+ friend class Q3DSSurfaceViewerPrivate;
+ friend class Q3DSRenderer;
+ friend class Q3DSStudio3D;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSVIEWERSETTINGS_H
diff --git a/src/api/studio3d/q3dsviewersettings_p.h b/src/api/studio3d/q3dsviewersettings_p.h
new file mode 100644
index 0000000..48fbae3
--- /dev/null
+++ b/src/api/studio3d/q3dsviewersettings_p.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSVIEWERSETTINGS_P_H
+#define Q3DSVIEWERSETTINGS_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dsviewersettings.h"
+#include "Qt3DSViewerApp.h"
+
+QT_BEGIN_NAMESPACE
+
+class QSettings;
+class CommandQueue;
+
+class Q_STUDIO3D_EXPORT Q3DSViewerSettingsPrivate : public QObject
+{
+ Q_OBJECT
+ Q_DECLARE_PUBLIC(Q3DSViewerSettings)
+public:
+ explicit Q3DSViewerSettingsPrivate(Q3DSViewerSettings *parent);
+ ~Q3DSViewerSettingsPrivate();
+
+ void setViewerApp(Q3DSViewer::Q3DSViewerApp *app);
+ void setCommandQueue(CommandQueue *queue);
+ void save(const QString &group, const QString &organization, const QString &application);
+ void load(const QString &group, const QString &organization, const QString &application);
+
+ void setMatteColor(const QColor &color);
+ void setShowRenderStats(bool show);
+ void setShadeMode(Q3DSViewerSettings::ShadeMode mode);
+ void setScaleMode(Q3DSViewerSettings::ScaleMode mode);
+
+public:
+ Q3DSViewerSettings *q_ptr;
+
+private:
+ void initSettingsStore(const QString &group, const QString &organization,
+ const QString &application);
+
+ Q3DSViewer::Q3DSViewerApp *m_viewerApp; // Not owned
+ CommandQueue *m_commandQueue; // Not owned
+ QColor m_matteColor;
+ bool m_showRenderStats;
+ Q3DSViewerSettings::ShadeMode m_shadeMode;
+ Q3DSViewerSettings::ScaleMode m_scaleMode;
+ QSettings *m_savedSettings;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSVIEWERSETTINGS_P_H
diff --git a/src/api/studio3d/qstudio3dglobal.h b/src/api/studio3d/qstudio3dglobal.h
new file mode 100644
index 0000000..52b49ad
--- /dev/null
+++ b/src/api/studio3d/qstudio3dglobal.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QSTUDIO3D_GLOBAL_H
+#define QSTUDIO3D_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+#include <QtGui/qsurfaceformat.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_STATIC
+# if defined(QT_BUILD_STUDIO3D_LIB)
+# define Q_STUDIO3D_EXPORT Q_DECL_EXPORT
+# else
+# define Q_STUDIO3D_EXPORT Q_DECL_IMPORT
+# endif
+#else
+# define Q_STUDIO3D_EXPORT
+#endif
+
+namespace Q3DS {
+/*!
+ * \brief surfaceFormat Detects highest available OpenGL or OpenGL ES version and pre-configures
+ * \l {QSurfaceFormat} that uses that OpenGL version and has 24-bit depth buffer and 8-bit stencil
+ * buffer attachments.
+ * \return Best fit \l {QSurfaceFormat} for the platform.
+ * \note This method requires that \l {QGuiApplication} has already been created.
+ */
+Q_STUDIO3D_EXPORT QSurfaceFormat surfaceFormat();
+}
+
+QT_END_NAMESPACE
+
+#endif // QSTUDIO3D_GLOBAL_H
diff --git a/src/api/studio3d/studio3d.pro b/src/api/studio3d/studio3d.pro
new file mode 100644
index 0000000..8b9fbb0
--- /dev/null
+++ b/src/api/studio3d/studio3d.pro
@@ -0,0 +1,64 @@
+TARGET = QtStudio3D
+
+include($$PWD/../../commoninclude.pri)
+QT += opengl widgets qml
+
+qtHaveModule(multimedia) {
+DEFINES += PLATFORM_HAS_QT_MULTIMEDIA_LIB
+QT += multimedia
+}
+CONFIG += console
+
+LIBS += \
+ -lqt3dsopengl$$qtPlatformTargetSuffix() \
+ -lqt3dsqmlstreamer$$qtPlatformTargetSuffix()
+
+HEADERS += \
+ q3dsdataoutput.h \
+ q3dsdataoutput_p.h \
+ q3dssurfaceviewer.h \
+ q3dssurfaceviewer_p.h \
+ qstudio3dglobal.h \
+ viewerqmlstreamproxy_p.h \
+ q3dsviewersettings.h \
+ q3dsviewersettings_p.h \
+ q3dspresentation.h \
+ q3dspresentation_p.h \
+ q3dssceneelement.h \
+ q3dssceneelement_p.h \
+ q3dselement.h \
+ q3dselement_p.h \
+ studioutils_p.h \
+ q3dscommandqueue_p.h \
+ q3dsimagesequencegenerator_p.h \
+ q3dsimagesequencegeneratorthread_p.h \
+ q3dsdatainput.h \
+ q3dsdatainput_p.h \
+ q3dsgeometry.h \
+ q3dsgeometry_p.h
+
+SOURCES += q3dsdataoutput.cpp \
+ q3dssurfaceviewer.cpp \
+ viewerqmlstreamproxy.cpp \
+ q3dsviewersettings.cpp \
+ q3dspresentation.cpp \
+ q3dssceneelement.cpp \
+ q3dselement.cpp \
+ studioutils.cpp \
+ q3dscommandqueue.cpp \
+ q3dsimagesequencegenerator.cpp \
+ q3dsimagesequencegeneratorthread.cpp \
+ q3dsdatainput.cpp \
+ q3dsgeometry.cpp
+
+# Platform specific surface format discovery functions
+#TODO: QT3DS-3608 Implement OpenGL version discovery for Windows
+#TODO: QT3DS-3609 Implement OpenGL version discovery for Linux
+#TODO: QT3DS-3610 Implement OpenGL version discovery for QNX
+#TODO: QT3DS-3611 Implement OpenGL version discovery for Integrity
+#TODO: QT3DS-3612 Implement OpenGL version discovery for macOS
+#TODO: QT3DS-3613 Implement OpenGL version discovery for Android
+SOURCES += \
+ ../../foundation/qt/formatdiscovery.cpp
+
+load(qt_module)
diff --git a/src/api/studio3d/studioutils.cpp b/src/api/studio3d/studioutils.cpp
new file mode 100644
index 0000000..9156be7
--- /dev/null
+++ b/src/api/studio3d/studioutils.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "studioutils_p.h"
+
+#include <QtCore/QString>
+
+QT_BEGIN_NAMESPACE
+
+QString Q3DSUtils::urlToLocalFileOrQrc(const QUrl &url)
+{
+ const QString scheme(url.scheme().toLower());
+ if (scheme == QLatin1String("qrc")) {
+ if (url.authority().isEmpty())
+ return QLatin1Char(':') + url.path();
+ return QString();
+ }
+
+#if defined(Q_OS_ANDROID)
+ if (scheme == QLatin1String("assets")) {
+ if (url.authority().isEmpty())
+ return url.toString();
+ return QString();
+ }
+#endif
+
+ return url.toLocalFile();
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/studioutils_p.h b/src/api/studio3d/studioutils_p.h
new file mode 100644
index 0000000..afec688
--- /dev/null
+++ b/src/api/studio3d/studioutils_p.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#include "qstudio3dglobal.h"
+
+#include <QtCore/QUrl>
+
+QT_BEGIN_NAMESPACE
+
+class Q_STUDIO3D_EXPORT Q3DSUtils
+{
+public:
+ static QString urlToLocalFileOrQrc(const QUrl &url);
+};
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/viewerqmlstreamproxy.cpp b/src/api/studio3d/viewerqmlstreamproxy.cpp
new file mode 100644
index 0000000..520dc8c
--- /dev/null
+++ b/src/api/studio3d/viewerqmlstreamproxy.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "viewerqmlstreamproxy_p.h"
+
+QT_BEGIN_NAMESPACE
+
+ViewerQmlStreamProxy::ViewerQmlStreamProxy(QObject *parent)
+ : Q3DSQmlStreamProxy(parent)
+{
+}
+
+ViewerQmlStreamProxy::~ViewerQmlStreamProxy()
+{
+}
+
+void ViewerQmlStreamProxy::visit(const char *path)
+{
+ setPath(QLatin1String(path));
+}
+
+void ViewerQmlStreamProxy::visit(const char *type, const char *id, const char *src,
+ const char *args)
+{
+ Q_UNUSED(src);
+ QString assetType = QLatin1String(type);
+ QString presentationId = QLatin1String(id);
+ QString presentationArgs = QLatin1String(args);
+ if (assetType == QLatin1String("presentation-qml"))
+ registerPresentation(presentationId, presentationArgs);
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3d/viewerqmlstreamproxy_p.h b/src/api/studio3d/viewerqmlstreamproxy_p.h
new file mode 100644
index 0000000..16569c1
--- /dev/null
+++ b/src/api/studio3d/viewerqmlstreamproxy_p.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#include "qstudio3dglobal.h"
+#include "q3dsqmlstreamproxy.h"
+#include "Qt3DSViewerApp.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q_STUDIO3D_EXPORT ViewerQmlStreamProxy : public Q3DSQmlStreamProxy,
+ public qt3ds::Qt3DSAssetVisitor
+{
+public:
+ ViewerQmlStreamProxy(QObject *parent = nullptr);
+ ~ViewerQmlStreamProxy();
+
+ void visit(const char *path) override;
+ void visit(const char *type, const char *id, const char *src, const char *args) override;
+};
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3dqml/q3dsplugin.cpp b/src/api/studio3dqml/q3dsplugin.cpp
new file mode 100644
index 0000000..640018f
--- /dev/null
+++ b/src/api/studio3dqml/q3dsplugin.cpp
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (c) 2016 NVIDIA CORPORATION.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsplugin.h"
+
+#include <QtQml/qqml.h>
+
+#include <QtStudio3D/private/q3dsviewersettings_p.h>
+
+#include "q3dsstudio3d_p.h"
+#include "q3dspresentationitem_p.h"
+#include "q3dsqmlstream.h"
+#include "q3dsqmlsubpresentationsettings.h"
+#include "q3dssceneelement.h"
+#include "q3dsdatainput.h"
+
+QT_BEGIN_NAMESPACE
+
+void Q3DSPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(uri == QLatin1String("QtStudio3D.OpenGL"));
+
+ // @uri QtStudio3D.OpenGL
+ qmlRegisterType<Q3DSStudio3D>(uri, 2, 4, "Studio3D");
+ qmlRegisterType<Q3DSViewerSettings>(uri, 2, 4, "ViewerSettings");
+ qmlRegisterType<Q3DSPresentationItem>(uri, 2, 4, "Presentation");
+ qmlRegisterType<Q3DSSceneElement>(uri, 2, 4, "SceneElement");
+ qmlRegisterType<Q3DSElement>(uri, 2, 4, "Element");
+ qmlRegisterType<Q3DSQmlStream>(uri, 2, 4, "QmlStream");
+ qmlRegisterType<Q3DSSubPresentationSettings>(uri, 2, 4, "SubPresentationSettings");
+ qmlRegisterType<Q3DSDataInput>(uri, 2, 4, "DataInput");
+ qmlRegisterType<Q3DSDataOutput>(uri, 2, 4, "DataOutput");
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3dqml/q3dsplugin.h b/src/api/studio3dqml/q3dsplugin.h
new file mode 100644
index 0000000..04f6942
--- /dev/null
+++ b/src/api/studio3dqml/q3dsplugin.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (c) 2016 NVIDIA CORPORATION.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_PLUGIN_H
+#define Q3DS_PLUGIN_H
+
+#include <QtQml/qqmlextensionplugin.h>
+
+static void initResources()
+{
+#ifdef QT_STATIC
+ Q_INIT_RESOURCE(qmake_QtStudio3D_OpenGL);
+#endif
+}
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ Q3DSPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent)
+ {
+ initResources();
+ }
+ void registerTypes(const char *uri) override;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DS_PLUGIN_H
diff --git a/src/api/studio3dqml/q3dspresentationitem.cpp b/src/api/studio3dqml/q3dspresentationitem.cpp
new file mode 100644
index 0000000..6372f2f
--- /dev/null
+++ b/src/api/studio3dqml/q3dspresentationitem.cpp
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dspresentationitem_p.h"
+
+#include <QtStudio3D/q3dssceneelement.h>
+#include <QtStudio3D/q3dsdatainput.h>
+#include <QtStudio3D/private/q3dspresentation_p.h>
+#include <QtStudio3D/private/viewerqmlstreamproxy_p.h>
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype Presentation
+ \instantiates Q3DSPresentationItem
+ \inqmlmodule QtStudio3D
+ \ingroup OpenGLRuntime
+ \inherits Q3DSPresentation
+ \keyword Studio3D
+
+ \brief Represents a Qt 3D Studio presentation.
+
+ This item provides properties and methods for controlling a
+ presentation.
+
+ Qt 3D Studio supports multiple presentations in one project. There
+ is always a main presentation and zero or more
+ sub-presentations. The sub-presentations are composed into the
+ main presentations either as contents of Qt 3D Studio layers or as
+ texture maps.
+
+ In the filesystem each presentation corresponds to one \c{.uip}
+ presentation file. When present, the \c{.uia} project file ties
+ these together by specifying a name for each of the
+ (sub-)presentations and specifies which one is the main one.
+
+ The \c{.uia} project also defines \l{DataInput}s and
+ \l{DataOutput}s that are exported by the presentations.
+ \l{DataInput}s provide a way to provide input to the presentation
+ to e.g. control a timeline of a subpresentation from code.
+ \l{DataOutput}s provide a way to get notified when an attribute
+ is changed in the presentation by animation timeline,
+ by behavior scripts or by a \l{DataInput}.
+
+ The Presentation type handles child objects of the types \l Element, \l
+ SceneElement, \l DataInput, and \l SubPresentationSettings specially. These
+ will get automatically associated with the presentation and can control
+ certain aspects of it from that point on.
+
+ From the API point of view Presentation corresponds to the
+ main presentation. The source property can refer either to a
+ \c{.uia} or \c{.uip} file. When specifying a file with \c{.uip}
+ extension and a \c{.uia} is present with the same name, the
+ \c{.uia} is loaded automatically and thus sub-presentation
+ information is available regardless.
+ */
+Q3DSPresentationItem::Q3DSPresentationItem(QObject *parent)
+ : Q3DSPresentation(parent)
+ , m_subPresentationSettings(nullptr)
+{
+}
+
+Q3DSPresentationItem::~Q3DSPresentationItem()
+{
+}
+
+/*!
+ Returns the \l SubPresentationSettings associated with this presentation.
+*/
+Q3DSSubPresentationSettings *Q3DSPresentationItem::subPresentationSettings() const
+{
+ return m_subPresentationSettings;
+}
+
+QQmlListProperty<QObject> Q3DSPresentationItem::qmlChildren()
+{
+ return QQmlListProperty<QObject>(this, nullptr, &appendQmlChildren, nullptr, nullptr, nullptr);
+}
+
+void Q3DSPresentationItem::appendQmlChildren(QQmlListProperty<QObject> *list, QObject *obj)
+{
+ auto item = qobject_cast<Q3DSPresentationItem *>(list->object);
+ if (item) {
+ auto scene = qobject_cast<Q3DSSceneElement *>(obj);
+ if (scene) {
+ if (item->registeredElement(scene->elementPath()))
+ qWarning() << __FUNCTION__ << "A duplicate SceneElement defined for Presentation.";
+ else
+ item->registerElement(scene);
+ } else {
+ auto studioElement = qobject_cast<Q3DSElement *>(obj);
+ if (studioElement) {
+ if (item->registeredElement(studioElement->elementPath()))
+ qWarning() << __FUNCTION__ << "A duplicate Element defined for Presentation.";
+ else
+ item->registerElement(studioElement);
+ } else {
+ auto subPresSettings = qobject_cast<Q3DSSubPresentationSettings *>(obj);
+ if (subPresSettings) {
+ if (item->m_subPresentationSettings) {
+ qWarning() << __FUNCTION__
+ << "Duplicate SubPresentationSettings defined for Presentation.";
+ } else {
+ item->m_subPresentationSettings = subPresSettings;
+ item->d_ptr->streamProxy()->setSettings(subPresSettings);
+ }
+ } else {
+ auto dataInput = qobject_cast<Q3DSDataInput *>(obj);
+ if (dataInput) {
+ if (item->registeredDataInput(dataInput->name())) {
+ qWarning() << __FUNCTION__
+ << "Duplicate DataInput defined for Presentation.";
+ } else {
+ item->registerDataInput(dataInput);
+ }
+ } else {
+ auto dataOutput = qobject_cast<Q3DSDataOutput *>(obj);
+ if (dataOutput) {
+ if (item->registeredDataOutput(dataOutput->name())) {
+ qWarning() << __FUNCTION__
+ << "Duplicate DataOutput defined for Presentation.";
+ } else {
+ item->registerDataOutput(dataOutput);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3dqml/q3dspresentationitem_p.h b/src/api/studio3dqml/q3dspresentationitem_p.h
new file mode 100644
index 0000000..216f73a
--- /dev/null
+++ b/src/api/studio3dqml/q3dspresentationitem_p.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSPRESENTATIONITEM_H
+#define Q3DSPRESENTATIONITEM_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "q3dsqmlsubpresentationsettings.h"
+
+#include <QtStudio3D/q3dspresentation.h>
+#include <QtQml/qqmllist.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSPresentationItem : public Q3DSPresentation
+{
+ Q_OBJECT
+ Q_PROPERTY(QQmlListProperty<QObject> qmlChildren READ qmlChildren DESIGNABLE false)
+ Q_CLASSINFO("DefaultProperty", "qmlChildren")
+
+public:
+ explicit Q3DSPresentationItem(QObject *parent = nullptr);
+ ~Q3DSPresentationItem();
+
+ Q3DSSubPresentationSettings *subPresentationSettings() const;
+
+ QQmlListProperty<QObject> qmlChildren();
+
+public Q_SLOTS:
+ static void appendQmlChildren(QQmlListProperty<QObject> *list, QObject *obj);
+
+private:
+ Q3DSSubPresentationSettings *m_subPresentationSettings;
+
+ friend class Q3DSStudio3D;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSPRESENTATIONITEM_H
diff --git a/src/api/studio3dqml/q3dsrenderer.cpp b/src/api/studio3dqml/q3dsrenderer.cpp
new file mode 100644
index 0000000..7366d6a
--- /dev/null
+++ b/src/api/studio3dqml/q3dsrenderer.cpp
@@ -0,0 +1,458 @@
+/****************************************************************************
+**
+** Copyright (c) 2016 NVIDIA CORPORATION.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsrenderer_p.h"
+#include "Qt3DSViewerApp.h"
+#include "Qt3DSAudioPlayerImpl.h"
+#include "q3dspresentationitem_p.h"
+
+#include <QtStudio3D/private/q3dscommandqueue_p.h>
+#include <QtStudio3D/private/q3dsviewersettings_p.h>
+#include <QtStudio3D/private/q3dspresentation_p.h>
+#include <QtStudio3D/private/studioutils_p.h>
+#include <QtStudio3D/private/q3dsdatainput_p.h>
+
+#include <QtCore/qdebug.h>
+#include <QtGui/qwindow.h>
+#include <QtGui/qopenglcontext.h>
+#include <QtQuick/qquickwindow.h>
+
+using namespace Q3DSViewer;
+
+QT_BEGIN_NAMESPACE
+
+Q3DSRenderer::Q3DSRenderer(bool visibleFlag, qt3ds::Qt3DSAssetVisitor *assetVisitor)
+ : m_visibleFlag(visibleFlag)
+ , m_initElements(false)
+ , m_runtime(0)
+ , m_window(nullptr)
+ , m_initialized(false)
+ , m_initializationFailure(false)
+ , m_visitor(assetVisitor)
+ , m_settings(new Q3DSViewerSettings(this))
+ , m_presentation(new Q3DSPresentation(this))
+{
+ m_startupTimer.start();
+}
+
+Q3DSRenderer::~Q3DSRenderer()
+{
+ releaseRuntime();
+}
+
+QOpenGLFramebufferObject *Q3DSRenderer::createFramebufferObject(const QSize &size)
+{
+ QOpenGLFramebufferObjectFormat theFormat;
+ theFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
+ QOpenGLFramebufferObject *frameBuffer =
+ new QOpenGLFramebufferObject(size, theFormat);
+ if (m_runtime && m_runtime->IsInitialised())
+ m_runtime->setOffscreenId(frameBuffer->handle());
+ return frameBuffer;
+}
+
+/** Pull pending commands from the plugin.
+ * Invoked automatically by the QML scene graph.
+ *
+ * This is the only place where it is valid for the Q3DSStudio3D plugin and render to communicate.
+ */
+void Q3DSRenderer::synchronize(QQuickFramebufferObject *inView)
+{
+ // Passing m_InitElements here is a bit of a hack to easily set the flag on the plugin.
+ static_cast<Q3DSStudio3D *>(inView)->getCommands(m_initElements, m_commands);
+
+ if (m_initializationFailure)
+ static_cast<Q3DSStudio3D *>(inView)->setError(m_error);
+
+ if (m_commands.m_sourceChanged || m_commands.m_variantListChanged) {
+ releaseRuntime();
+ // Need to update source and variant list here rather than
+ // processCommands, as both are needed for init
+ m_presentation->setVariantList(m_commands.m_variantList);
+ m_presentation->setSource(m_commands.m_source);
+ m_presentation->setDelayedLoading(m_commands.m_delayedLoading);
+ m_initialized = false;
+ m_initializationFailure = false;
+ m_error.clear();
+ static_cast<Q3DSStudio3D *>(inView)->setError(QString());
+ }
+
+ m_initElements = false;
+
+ // We need a handle to the window to be able to reset the GL state inside of Draw().
+ // See https://bugreports.qt.io/browse/QTBUG-47213
+ if (!m_window)
+ m_window = inView->window();
+}
+
+void Q3DSRenderer::releaseRuntime()
+{
+ m_settings->d_ptr->setViewerApp(nullptr);
+ m_presentation->d_ptr->setViewerApp(nullptr);
+
+ if (m_runtime) {
+ m_runtime->Release();
+ m_runtime = nullptr;
+ }
+}
+
+/** Invoked by the QML scene graph indicating that it's time to render.
+ * Calls `draw()` if the plugin is visible, or `processCommands()` otherwise.
+ *
+ * Note that this will still render if the plugin is opacity:0. To avoid this,
+ * add a line to your QML to hide the object when opacity is zero, like:
+ *
+ * visible: opacity != 0
+ */
+void Q3DSRenderer::render()
+{
+ // We may start in a non visible state but we still need
+ // to init the runtime otherwise the commands are never processed
+ if (!m_initialized && !m_initializationFailure) {
+ m_initialized = initializeRuntime(this->framebufferObject());
+ m_initializationFailure = !m_initialized;
+ if (m_initializationFailure)
+ m_commands.clear(true);
+ }
+
+ // Don't render if the plugin is hidden; however, if hidden, but sure
+ // to process pending commands so we can be shown again.
+ if (m_initialized) {
+ if (m_visibleFlag)
+ draw();
+ else
+ processCommands();
+ update(); // mark as dirty to ensure update again
+ }
+}
+
+/** Cause Qt3DS runtime to render content.
+ * Initializes GL and the runtime when called the first time.
+ */
+void Q3DSRenderer::draw()
+{
+ if (m_runtime && m_runtime->IsInitialised() && m_window) {
+ if (m_initialized)
+ m_runtime->RestoreState();
+ m_runtime->Render();
+ m_runtime->SaveState();
+
+ m_window->resetOpenGLState();
+ }
+}
+
+bool Q3DSRenderer::initializeRuntime(QOpenGLFramebufferObject *inFbo)
+{
+ m_runtime = &Q3DSViewerApp::Create(nullptr, new Qt3DSAudioPlayerImpl(), &m_startupTimer);
+ Q_ASSERT(m_runtime);
+
+ // Connect presentation ready signal before initializing the app
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigPresentationReady,
+ this, &Q3DSRenderer::presentationReady);
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigPresentationLoaded,
+ this, &Q3DSRenderer::presentationLoaded);
+
+ int theWidth = inFbo->width();
+ int theHeight = inFbo->height();
+
+ const QString localSource = Q3DSUtils::urlToLocalFileOrQrc(m_presentation->source());
+
+ if (!m_runtime->InitializeApp(theWidth, theHeight,
+ QOpenGLContext::currentContext()->format(),
+ inFbo->handle(), localSource,
+ m_presentation->variantList(),
+ m_presentation->delayedLoading(),
+ m_visitor)) {
+ m_error = m_runtime->error();
+ releaseRuntime();
+ return false;
+ }
+
+ m_runtime->RegisterScriptCallback(Q3DSViewer::ViewerCallbackType::Enum::CALLBACK_ON_INIT,
+ reinterpret_cast<qml_Function>(Q3DSRenderer::onInitHandler),
+ this);
+ m_runtime->RegisterScriptCallback(Q3DSViewer::ViewerCallbackType::Enum::CALLBACK_ON_UPDATE,
+ reinterpret_cast<qml_Function>(Q3DSRenderer::onUpdateHandler),
+ this);
+
+ m_settings->d_ptr->setViewerApp(m_runtime);
+ m_presentation->d_ptr->setViewerApp(m_runtime, false);
+
+ // Connect signals
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigSlideEntered,
+ this, &Q3DSRenderer::enterSlide);
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigSlideExited,
+ this, &Q3DSRenderer::exitSlide);
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigCustomSignal,
+ this, &Q3DSRenderer::customSignalEmitted);
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigElementsCreated,
+ this, &Q3DSRenderer::elementsCreated);
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigMaterialsCreated,
+ this, &Q3DSRenderer::materialsCreated);
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigMeshesCreated,
+ this, &Q3DSRenderer::meshesCreated);
+ connect(m_runtime, &Q3DSViewer::Q3DSViewerApp::SigDataOutputValueUpdated,
+ this, &Q3DSRenderer::dataOutputValueUpdated);
+
+ return true;
+}
+
+/** Accept user commands (e.g. setAttribute) needed to initialize the code.
+ *
+ * If we attempt to run Qt3DS methods like setAttribute() before the runtime
+ * has been initialized, they will be lost. This method is the correct place
+ * to accept user commands.
+ *
+ * Currently this method just sets a flag needed to pass a flag to the
+ * plugin next time syncronize() is called, which eventually gets the plugin
+ * to emit an `runningChanged` signal the next time `tick()` is called.
+ * As a result, code specified in an `onRunningChanged` handler may be run
+ * after one or more frames have already rendered.
+ */
+void Q3DSRenderer::onInitHandler(void *userData)
+{
+ Q3DSRenderer *theRenderer = static_cast<Q3DSRenderer *>(userData);
+ theRenderer->setInitElements(true);
+}
+
+/** Accept the latest pending user commands (e.g. setAttribute).
+ *
+ * This method just calls `ProcessCommands` to avoid unnecessary
+ * pointer dereferencing and accessor methods (or public member variables).
+ */
+void Q3DSRenderer::onUpdateHandler(void *userData)
+{
+ Q3DSRenderer *theRenderer = static_cast<Q3DSRenderer *>(userData);
+ theRenderer->processCommands();
+}
+
+/** Apply commands queued up by the user (e.g. setAttribute).
+ *
+ * Note that these commands are executed even if the plugin is not visible,
+ * in part to allow changes to the visible flag to be noticed, but also
+ * to allow specialty code to continue to be queued up even when not rendering.
+ */
+void Q3DSRenderer::processCommands()
+{
+ if (!m_runtime) {
+ m_commands.clear(true);
+ return;
+ }
+
+ if (m_commands.m_visibleChanged)
+ m_visibleFlag = m_commands.m_visible;
+
+ if (QOpenGLFramebufferObject *inFbo = this->framebufferObject()) {
+ if (inFbo->isValid() && (inFbo->width() != m_runtime->GetWindowWidth()
+ || inFbo->height() != m_runtime->GetWindowHeight())) {
+ m_runtime->Resize(inFbo->width(), inFbo->height());
+ }
+ }
+
+ if (m_commands.m_scaleModeChanged)
+ m_settings->setScaleMode(m_commands.m_scaleMode);
+ if (m_commands.m_shadeModeChanged)
+ m_settings->setShadeMode(m_commands.m_shadeMode);
+ if (m_commands.m_matteColorChanged)
+ m_settings->setMatteColor(m_commands.m_matteColor);
+ if (m_commands.m_showRenderStatsChanged)
+ m_settings->setShowRenderStats(m_commands.m_showRenderStats);
+ if (m_commands.m_delayedLoadingChanged)
+ this->m_runtime->setDelayedLoading(m_commands.m_delayedLoading);
+
+ if (m_commands.m_globalAnimationTimeChanged)
+ m_presentation->setGlobalAnimationTime(m_commands.m_globalAnimationTime);
+
+ // Send scene graph changes over to Q3DS
+ for (int i = 0; i < m_commands.size(); i++) {
+ const ElementCommand &cmd = m_commands.constCommandAt(i);
+ switch (cmd.m_commandType) {
+ case CommandType_SetAttribute:
+ m_presentation->setAttribute(cmd.m_elementPath, cmd.m_stringValue, cmd.m_variantValue);
+ break;
+ case CommandType_SetPresentationActive:
+ m_presentation->setPresentationActive(cmd.m_elementPath, cmd.m_boolValue);
+ break;
+ case CommandType_GoToTime:
+ m_presentation->goToTime(cmd.m_elementPath, cmd.m_floatValue);
+ break;
+ case CommandType_GoToSlide:
+ m_presentation->goToSlide(cmd.m_elementPath, cmd.m_intValues[0]);
+ break;
+ case CommandType_GoToSlideByName:
+ m_presentation->goToSlide(cmd.m_elementPath, cmd.m_stringValue);
+ break;
+ case CommandType_GoToSlideRelative:
+ m_presentation->goToSlide(cmd.m_elementPath, bool(cmd.m_intValues[0]),
+ bool(cmd.m_intValues[1]));
+ break;
+ case CommandType_FireEvent:
+ m_presentation->fireEvent(cmd.m_elementPath, cmd.m_stringValue);
+ break;
+ case CommandType_MousePress:
+ m_runtime->HandleMousePress(cmd.m_intValues[0],
+ cmd.m_intValues[1], cmd.m_intValues[2], true);
+ break;
+ case CommandType_MouseRelease:
+ m_runtime->HandleMousePress(cmd.m_intValues[0],
+ cmd.m_intValues[1], cmd.m_intValues[2], false);
+ break;
+ case CommandType_MouseMove:
+ m_runtime->HandleMouseMove(cmd.m_intValues[0], cmd.m_intValues[1], true);
+ break;
+ case CommandType_MouseWheel:
+ m_runtime->HandleMouseWheel(cmd.m_intValues[0], cmd.m_intValues[1],
+ bool(cmd.m_intValues[2]), cmd.m_intValues[3]);
+ break;
+ case CommandType_KeyPress:
+ m_runtime->HandleKeyInput(Q3DStudio::EKeyCode(cmd.m_intValues[0]), true);
+ break;
+ case CommandType_KeyRelease:
+ m_runtime->HandleKeyInput(Q3DStudio::EKeyCode(cmd.m_intValues[0]), false);
+ break;
+ case CommandType_SetDataInputValue:
+ m_runtime->SetDataInputValue(
+ cmd.m_stringValue, cmd.m_variantValue,
+ static_cast<qt3ds::runtime::DataInputValueRole>(cmd.m_intValues[0]));
+ break;
+ case CommandType_CreateElements: {
+ m_runtime->createElements(
+ cmd.m_elementPath, cmd.m_stringValue,
+ *static_cast<QVector<QHash<QString, QVariant>> *>(cmd.m_data));
+ // Runtime makes copy of the data in its own format, so we can delete it now
+ auto &command = m_commands.commandAt(i);
+ delete reinterpret_cast<QVector<QHash<QString, QVariant>> *>(command.m_data);
+ command.m_data = nullptr;
+ break;
+ }
+ case CommandType_DeleteElements: {
+ m_runtime->deleteElements(*static_cast<QStringList *>(cmd.m_data));
+ // Runtime makes copy of the data in its own format, so we can delete it now
+ auto &command = m_commands.commandAt(i);
+ delete reinterpret_cast<QStringList *>(command.m_data);
+ command.m_data = nullptr;
+ break;
+ }
+ case CommandType_CreateMaterials: {
+ m_runtime->createMaterials(cmd.m_elementPath, *static_cast<QStringList *>(cmd.m_data));
+ // Runtime makes copy of the data in its own format, so we can delete it now
+ auto &command = m_commands.commandAt(i);
+ delete reinterpret_cast<QStringList *>(command.m_data);
+ command.m_data = nullptr;
+ break;
+ }
+ case CommandType_DeleteMaterials: {
+ m_runtime->deleteMaterials(*static_cast<QStringList *>(cmd.m_data));
+ // Runtime makes copy of the data in its own format, so we can delete it now
+ auto &command = m_commands.commandAt(i);
+ delete reinterpret_cast<QStringList *>(command.m_data);
+ command.m_data = nullptr;
+ break;
+ }
+ case CommandType_CreateMeshes: {
+ m_runtime->createMeshes(*static_cast<QHash<QString, Q3DSViewer::MeshData> *>(
+ cmd.m_data));
+ // Runtime makes copy of the data, so we can delete it now
+ auto &command = m_commands.commandAt(i);
+ auto meshData = reinterpret_cast<QHash<QString, Q3DSViewer::MeshData> *>(
+ command.m_data);
+ delete meshData;
+ command.m_data = nullptr;
+ break;
+ }
+ case CommandType_DeleteMeshes: {
+ m_runtime->deleteMeshes(*static_cast<QStringList *>(cmd.m_data));
+ // Runtime makes copy of the data in its own format, so we can delete it now
+ auto &command = m_commands.commandAt(i);
+ delete reinterpret_cast<QStringList *>(command.m_data);
+ command.m_data = nullptr;
+ break;
+ }
+ case CommandType_RequestSlideInfo: {
+ int current = 0;
+ int previous = 0;
+ QString currentName;
+ QString previousName;
+ const QByteArray path(cmd.m_elementPath.toUtf8());
+ m_runtime->GetSlideInfo(path, current, previous, currentName, previousName);
+ QVariantList *requestData = new QVariantList();
+ requestData->append(QVariant(current));
+ requestData->append(QVariant(previous));
+ requestData->append(QVariant(currentName));
+ requestData->append(QVariant(previousName));
+
+ Q_EMIT requestResponse(cmd.m_elementPath, cmd.m_commandType, requestData);
+
+ break;
+ }
+ case CommandType_RequestDataInputs: {
+ QVariantList *requestData = new QVariantList();
+ if (m_runtime) {
+ const auto diList = m_runtime->dataInputs();
+
+ for (const auto &it : diList) {
+ Q3DSDataInput *newIt = new Q3DSDataInput(it, nullptr);
+ newIt->d_ptr->m_max = m_runtime->dataInputMax(it);
+ newIt->d_ptr->m_min = m_runtime->dataInputMin(it);
+ newIt->d_ptr->m_metadata = m_runtime->dataInputMetadata(it);
+ requestData->append(QVariant::fromValue(newIt));
+ }
+ }
+
+ Q_EMIT requestResponse(cmd.m_elementPath, cmd.m_commandType, requestData);
+ break;
+ }
+ case CommandType_RequestDataOutputs: {
+ QVariantList *requestData = new QVariantList();
+ if (m_presentation) {
+ const auto diList = m_presentation->dataOutputs();
+
+ for (const auto &it : diList)
+ requestData->append(QVariant::fromValue(it->name()));
+ }
+
+ Q_EMIT requestResponse(cmd.m_elementPath, cmd.m_commandType, requestData);
+ break;
+ }
+ case CommandType_PreloadSlide:
+ m_runtime->preloadSlide(cmd.m_elementPath);
+ break;
+ case CommandType_UnloadSlide:
+ m_runtime->unloadSlide(cmd.m_elementPath);
+ break;
+ default:
+ qWarning() << __FUNCTION__ << "Unrecognized CommandType in command list!";
+ }
+ }
+
+ m_commands.clear(false);
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3dqml/q3dsrenderer_p.h b/src/api/studio3dqml/q3dsrenderer_p.h
new file mode 100644
index 0000000..6d044ff
--- /dev/null
+++ b/src/api/studio3dqml/q3dsrenderer_p.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (c) 2016 NVIDIA CORPORATION.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_RENDERER_H
+#define Q3DS_RENDERER_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/qopenglframebufferobject.h>
+#include <QtQuick/qquickframebufferobject.h>
+
+#include "Qt3DSViewerApp.h"
+#include "q3dsstudio3d_p.h"
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSViewerSettings;
+class Q3DSPresentation;
+
+class Q3DSRenderer : public QObject,
+ public QQuickFramebufferObject::Renderer
+{
+ Q_OBJECT
+
+public:
+ Q3DSRenderer(bool visibleFlag, qt3ds::Qt3DSAssetVisitor *assetVisitor);
+ ~Q3DSRenderer();
+
+ QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) override;
+
+ void setInitElements(bool inFlag) { m_initElements = inFlag; }
+ void processCommands();
+
+Q_SIGNALS:
+ void enterSlide(const QString &elementPath, unsigned int slide, const QString &slideName);
+ void exitSlide(const QString &elementPath, unsigned int slide, const QString &slideName);
+ void requestResponse(const QString &elementPath, CommandType commandType, void *requestData);
+ void presentationReady();
+ void presentationLoaded();
+ void customSignalEmitted(const QString &elNmentPath, const QString &name);
+ void elementsCreated(const QStringList &elementPaths, const QString &error);
+ void materialsCreated(const QStringList &materialNames, const QString &error);
+ void meshesCreated(const QStringList &meshNames, const QString &error);
+ void dataOutputValueUpdated(const QString &name, const QVariant &newValue);
+
+protected:
+ static void onInitHandler(void *userData);
+ static void onUpdateHandler(void *userData);
+ bool initializeRuntime(QOpenGLFramebufferObject *inFbo);
+ void draw();
+ void render() override;
+ void synchronize(QQuickFramebufferObject *inView) override;
+ void releaseRuntime();
+
+protected:
+ bool m_visibleFlag; // Is the plugin visible? Prevents rendering hidden content.
+ CommandQueue m_commands; // A list of commands retrieved by the plugin to be applied.
+ bool m_initElements; // Flag set when the runtime is first ready to render.
+ Q3DSViewer::Q3DSViewerApp *m_runtime; // The Qt3DS viewer that renders all content.
+ QQuickWindow *m_window; // Window associated with the plugin; needed to reset OpenGL state.
+
+ bool m_initialized; // Has the runtime and OpenGL state been initialized?
+ bool m_initializationFailure; // Initialization failed, no point in trying to init again
+ qt3ds::Qt3DSAssetVisitor *m_visitor;
+
+ Q3DSViewerSettings *m_settings;
+ Q3DSPresentation *m_presentation;
+ QString m_error;
+ QElapsedTimer m_startupTimer;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DS_RENDERER_H
diff --git a/src/api/studio3dqml/q3dsstudio3d.cpp b/src/api/studio3dqml/q3dsstudio3d.cpp
new file mode 100644
index 0000000..5a46089
--- /dev/null
+++ b/src/api/studio3dqml/q3dsstudio3d.cpp
@@ -0,0 +1,535 @@
+/****************************************************************************
+**
+** Copyright (c) 2016 NVIDIA CORPORATION.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsstudio3d_p.h"
+#include "q3dsrenderer_p.h"
+#include "q3dspresentationitem_p.h"
+
+#include <QtStudio3D/private/q3dsviewersettings_p.h>
+#include <QtStudio3D/private/q3dspresentation_p.h>
+#include <QtStudio3D/private/q3dssceneelement_p.h>
+#include <QtStudio3D/private/viewerqmlstreamproxy_p.h>
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qfileinfo.h>
+#include <QtQuick/qquickwindow.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmltype Studio3D
+ \instantiates Q3DSStudio3D
+ \inqmlmodule QtStudio3D
+ \ingroup OpenGLRuntime
+ \inherits Item
+ \keyword Studio3D
+
+ \brief Qt 3D Studio presentation viewer.
+
+ This type enables developers to embed Qt 3D Studio presentations in Qt
+ Quick.
+
+ \section2 Example Usage
+
+ \qml
+ Studio3D {
+ id: studio3D
+ anchors.fill: parent
+
+ Presentation {
+ source: "qrc:///presentation.uia"
+ SceneElement {
+ id: scene
+ elementPath: "Scene"
+ currentSlideIndex: 2
+ }
+ Element {
+ id: textLabel
+ elementPath: "Scene.Layer.myLabel"
+ }
+ }
+ ViewerSettings {
+ showRenderStats: true
+ }
+ onRunningChanged: {
+ console.log("Presentation ready!");
+ }
+ }
+ \endqml
+
+ \section2 Controlling the presentation
+
+ Like the example above suggests, Studio3D and the other types under the
+ QtStudio3D import offer more than simply rendering the animated Qt 3D
+ Studio presentation. They also offer scene manipulation, including
+
+ \list
+
+ \li querying and changing scene object properties (for example, the
+ transform of a model, colors and other settings of a material, etc.) via
+ Presentation::getAttribute(), Presentation::setAttribute(), \l Element, and
+ \l DataInput,
+
+ \li changing slides (and thus starting the relevant animations and applying
+ the scene object property changes associated with the new slide) via
+ Presentation::goToSlide(), \l SceneElement, and \l DataInput,
+
+ \li and controlling the timeline (the current playback position for the
+ key-frame based animations) both on the main scene and on individual
+ Component nodes via Presentation::goToTime(), \l SceneElement, and \l DataInput.
+
+ \endlist
+
+ \sa Presentation
+*/
+
+/*!
+ \qmlsignal Studio3D::frameUpdate()
+
+ This signal is emitted each time a frame has been rendered.
+*/
+
+/*!
+ \qmlsignal Studio3D::presentationLoaded()
+
+ This signal is emitted when the presentation has been loaded and is ready
+ to be shown.
+*/
+
+/*!
+ \qmlsignal Studio3D::presentationReady()
+
+ This signal is emitted when the presentation has fully initialized its 3D
+ scene for the first frame.
+
+ The difference to presentationLoaded() is that this signal is emitted only
+ when the asynchronous operations needed to build to 3D scene and the first
+ frame have completed.
+
+ When implementing splash screens via Loader items and the Item::visible
+ property, this is the signal that should be used to trigger hiding the
+ splash screen.
+*/
+
+Q3DSStudio3D::Q3DSStudio3D()
+ : m_viewerSettings(nullptr)
+ , m_presentation(nullptr)
+ , m_emitRunningChange(false)
+ , m_isRunning(false)
+ , m_eventIgnoreFlags(EnableAllEvents)
+ , m_pixelRatio(1.0)
+{
+ setMirrorVertically(true);
+ connect(this, &Q3DSStudio3D::windowChanged, this, &Q3DSStudio3D::handleWindowChanged);
+ connect(this, &Q3DSStudio3D::visibleChanged, this, &Q3DSStudio3D::handleVisibleChanged);
+
+ updateEventMasks();
+}
+
+Q3DSStudio3D::~Q3DSStudio3D()
+{
+}
+
+/*!
+ \qmlproperty Presentation Studio3D::presentation
+
+ Accessor for the presentation. Applications are expected to create a single
+ Presentation child object for Studio3D. If this is omitted, a presentation
+ is created automatically.
+
+ This property is read-only.
+*/
+Q3DSPresentationItem *Q3DSStudio3D::presentation() const
+{
+ return m_presentation;
+}
+
+// #TODO: QT3DS-3566 viewerSettings is missing documentation
+/*!
+ \qmlproperty ViewerSettings Studio3D::viewerSettings
+
+ This property is read-only.
+*/
+Q3DSViewerSettings *Q3DSStudio3D::viewerSettings() const
+{
+ return m_viewerSettings;
+}
+
+/*!
+ \qmlproperty string Studio3D::error
+
+ Contains the text for the error message that was generated during the
+ loading of the presentation. When no error occurred or there is no
+ presentation loaded, the value is an empty string.
+
+ This property is read-only.
+*/
+QString Q3DSStudio3D::error() const
+{
+ return m_error;
+}
+
+void Q3DSStudio3D::setError(const QString &error)
+{
+ if (error != m_error) {
+ m_error = error;
+ Q_EMIT errorChanged(m_error);
+ }
+}
+
+/*!
+ \qmlproperty EventIgnoreFlags Studio3D::ignoredEvents
+
+ This property can be used to ignore mouse/wheel/keyboard events.
+ By default all events are enabled.
+*/
+
+Q3DSStudio3D::EventIgnoreFlags Q3DSStudio3D::ignoredEvents() const
+{
+ return m_eventIgnoreFlags;
+}
+
+void Q3DSStudio3D::setIgnoredEvents(EventIgnoreFlags flags)
+{
+ if (m_eventIgnoreFlags == flags)
+ return;
+
+ m_eventIgnoreFlags = flags;
+ updateEventMasks();
+ Q_EMIT ignoredEventsChanged();
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::updateEventMasks()
+{
+ if (m_eventIgnoreFlags.testFlag(IgnoreMouseEvents)) {
+ setAcceptedMouseButtons(Qt::NoButton);
+ setAcceptHoverEvents(false);
+ } else {
+ setAcceptedMouseButtons(Qt::MouseButtonMask);
+ setAcceptHoverEvents(true);
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::componentComplete()
+{
+ const auto childObjs = children();
+ for (QObject *child : childObjs) {
+ auto settings = qobject_cast<Q3DSViewerSettings *>(child);
+ if (settings) {
+ if (m_viewerSettings)
+ qWarning("Duplicate ViewerSettings defined for Studio3D.");
+ else
+ m_viewerSettings = settings;
+ }
+ auto presentation = qobject_cast<Q3DSPresentationItem *>(child);
+ if (presentation) {
+ if (m_presentation)
+ qWarning("Duplicate Presentation defined for Studio3D.");
+ else
+ m_presentation = presentation;
+ }
+ }
+ if (!m_viewerSettings)
+ m_viewerSettings = new Q3DSViewerSettings(this);
+ if (!m_presentation)
+ m_presentation = new Q3DSPresentationItem(this);
+
+ m_viewerSettings->d_ptr->setCommandQueue(&m_pendingCommands);
+ m_presentation->d_ptr->setCommandQueue(&m_pendingCommands);
+
+ // Ensure qml stream proxy gets created on main thread
+ m_presentation->d_ptr->streamProxy();
+
+ QQuickFramebufferObject::componentComplete();
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::handleWindowChanged(QQuickWindow *window)
+{
+ if (!window)
+ return;
+
+ window->setClearBeforeRendering(false);
+ m_pixelRatio = window->devicePixelRatio();
+
+ // Call tick every frame of the GUI thread to notify QML about new frame via frameUpdate signal
+ connect(window, &QQuickWindow::afterAnimating, this, &Q3DSStudio3D::tick);
+ // Call update after the frame is handled to queue another frame
+ connect(window, &QQuickWindow::afterSynchronizing, this, &Q3DSStudio3D::update);
+}
+
+/*!
+ \internal
+ Queue up a command to inform the renderer of a newly-changed visible/hidden status.
+ */
+void Q3DSStudio3D::handleVisibleChanged()
+{
+ m_pendingCommands.m_visibleChanged = true;
+ m_pendingCommands.m_visible = isVisible();
+}
+
+/*!
+ \brief internal
+ */
+void Q3DSStudio3D::reset()
+{
+ // Fake a source change to trigger a reloading of the presentation
+ m_pendingCommands.m_sourceChanged = true;
+ m_pendingCommands.m_source = m_presentation->source();
+ m_pendingCommands.m_variantListChanged = true;
+ m_pendingCommands.m_variantList = m_presentation->variantList();
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::requestResponseHandler(const QString &elementPath, CommandType commandType,
+ void *requestData)
+{
+ switch (commandType) {
+ case CommandType_RequestSlideInfo: {
+ Q3DSSceneElement *handler = qobject_cast<Q3DSSceneElement *>(
+ m_presentation->registeredElement(elementPath));
+ if (handler)
+ handler->d_ptr->requestResponseHandler(commandType, requestData);
+ else
+ qWarning() << __FUNCTION__ << "RequestSlideInfo response got for unregistered scene.";
+ break;
+ }
+ case CommandType_RequestDataInputs: {
+ Q3DSPresentation *handler = qobject_cast<Q3DSPresentation *>(m_presentation);
+ if (handler) {
+ handler->d_ptr->requestResponseHandler(commandType, requestData);
+ } else {
+ qWarning() << __FUNCTION__
+ << "RequestDataInputs response got for invalid presentation.";
+ }
+ break;
+ }
+ case CommandType_RequestDataOutputs: {
+ Q3DSPresentation *handler = qobject_cast<Q3DSPresentation *>(m_presentation);
+ if (handler) {
+ handler->d_ptr->requestResponseHandler(commandType, requestData);
+ } else {
+ qWarning() << __FUNCTION__
+ << "RequestDataOutputs response got for invalid presentation.";
+ }
+ break;
+ }
+ default:
+ qWarning() << __FUNCTION__ << "Unknown command type.";
+ break;
+ }
+}
+
+/*!
+ \internal
+ Create the Q3DSRenderer. Invoked automatically by the QML scene graph.
+ */
+QQuickFramebufferObject::Renderer *Q3DSStudio3D::createRenderer() const
+{
+ // It is "illegal" to create a connection between the renderer
+ // and the plugin, and vice-versa. The only valid time the two
+ // may communicate is during Q3DSRenderer::synchronize().
+ Q3DSRenderer *renderer = new Q3DSRenderer(isVisible(), m_presentation->d_ptr->streamProxy());
+
+ connect(renderer, &Q3DSRenderer::enterSlide,
+ m_presentation->d_ptr, &Q3DSPresentationPrivate::handleSlideEntered);
+ connect(renderer, &Q3DSRenderer::dataOutputValueUpdated,
+ m_presentation->d_ptr, &Q3DSPresentationPrivate::handleDataOutputValueUpdate);
+ connect(renderer, &Q3DSRenderer::elementsCreated,
+ m_presentation->d_ptr, &Q3DSPresentationPrivate::handleElementsCreated);
+ connect(renderer, &Q3DSRenderer::materialsCreated,
+ m_presentation->d_ptr, &Q3DSPresentationPrivate::handleMaterialsCreated);
+ connect(renderer, &Q3DSRenderer::meshesCreated,
+ m_presentation->d_ptr, &Q3DSPresentationPrivate::handleMeshesCreated);
+ connect(renderer, &Q3DSRenderer::exitSlide,
+ m_presentation, &Q3DSPresentation::slideExited);
+ connect(renderer, &Q3DSRenderer::customSignalEmitted,
+ m_presentation, &Q3DSPresentation::customSignalEmitted);
+ connect(renderer, &Q3DSRenderer::requestResponse,
+ this, &Q3DSStudio3D::requestResponseHandler);
+ connect(renderer, &Q3DSRenderer::presentationLoaded,
+ this, &Q3DSStudio3D::presentationLoaded);
+ connect(renderer, &Q3DSRenderer::presentationReady,
+ this, &Q3DSStudio3D::presentationReady);
+ return renderer;
+}
+
+/*!
+ \qmlproperty bool Studio3D::running
+
+ The value of this property is \c true when the presentation has been loaded
+ and is ready to be shown.
+
+ This property is read-only.
+*/
+bool Q3DSStudio3D::isRunning() const
+{
+ return m_isRunning;
+}
+
+/*!
+ \internal
+ Emit QML `runningChanged` and `frameUpdate` and signals.
+ This method is called every frame, and emits the `frameUpdate` signal every frame,
+ regardless of plugin visibility. This allows a hidden Qt3DSView to still process
+ information every frame, even though the Renderer is not rendering.
+
+ To prevent expensive onFrameUpdate handlers from being processed when hidden,
+ add an early return to the top like:
+
+ onFrameUpdate: {
+ if (!visible) return;
+ ...
+ }
+ */
+void Q3DSStudio3D::tick()
+{
+ if (m_emitRunningChange) {
+ m_isRunning = true;
+ Q_EMIT runningChanged(true);
+ m_emitRunningChange = false;
+ }
+
+ // Don't call onFrameUpdate until after onInitialize has been called
+ if (m_isRunning) {
+ // Give QML an opportunity to change Qt3DS values every frame
+ Q_EMIT frameUpdate();
+ }
+}
+
+/*!
+ \internal
+ Copies the list of commands previously queued up. Called by Q3DSRenderer::synchronize().
+ */
+void Q3DSStudio3D::getCommands(bool emitInitialize, CommandQueue &renderQueue)
+{
+ if (emitInitialize)
+ m_emitRunningChange = true;
+
+ renderQueue.copyCommands(m_pendingCommands);
+ m_pendingCommands.clear(false);
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::mousePressEvent(QMouseEvent *event)
+{
+ if (m_eventIgnoreFlags.testFlag(IgnoreMouseEvents))
+ return;
+
+ if (m_pixelRatio != 1.0) {
+ QMouseEvent scaledEvent(event->type(), event->pos() * m_pixelRatio,
+ event->button(), event->buttons(), event->modifiers());
+ m_presentation->mousePressEvent(&scaledEvent);
+ } else {
+ m_presentation->mousePressEvent(event);
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::mouseReleaseEvent(QMouseEvent *event)
+{
+ if (m_eventIgnoreFlags.testFlag(IgnoreMouseEvents))
+ return;
+
+ if (m_pixelRatio != 1.0) {
+ QMouseEvent scaledEvent(event->type(), event->pos() * m_pixelRatio,
+ event->button(), event->buttons(), event->modifiers());
+ m_presentation->mouseReleaseEvent(&scaledEvent);
+ } else {
+ m_presentation->mouseReleaseEvent(event);
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::mouseMoveEvent(QMouseEvent *event)
+{
+ if (m_eventIgnoreFlags.testFlag(IgnoreMouseEvents))
+ return;
+
+ if (m_pixelRatio != 1.0) {
+ QMouseEvent scaledEvent(event->type(), event->pos() * m_pixelRatio,
+ event->button(), event->buttons(), event->modifiers());
+ m_presentation->mouseMoveEvent(&scaledEvent);
+ } else {
+ m_presentation->mouseMoveEvent(event);
+ }
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::wheelEvent(QWheelEvent *event)
+{
+ if (m_eventIgnoreFlags.testFlag(IgnoreWheelEvents))
+ return;
+
+ m_presentation->wheelEvent(event);
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::keyPressEvent(QKeyEvent *event)
+{
+ if (m_eventIgnoreFlags.testFlag(IgnoreKeyboardEvents))
+ return;
+
+ m_presentation->keyPressEvent(event);
+}
+
+/*!
+ \internal
+ */
+void Q3DSStudio3D::keyReleaseEvent(QKeyEvent *event)
+{
+ if (m_eventIgnoreFlags.testFlag(IgnoreKeyboardEvents))
+ return;
+
+ if (!event->isAutoRepeat())
+ m_presentation->keyReleaseEvent(event);
+}
+
+QT_END_NAMESPACE
diff --git a/src/api/studio3dqml/q3dsstudio3d_p.h b/src/api/studio3dqml/q3dsstudio3d_p.h
new file mode 100644
index 0000000..eed8459
--- /dev/null
+++ b/src/api/studio3dqml/q3dsstudio3d_p.h
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (c) 2016 NVIDIA CORPORATION.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_STUDIO3D_H
+#define Q3DS_STUDIO3D_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtStudio3D API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtStudio3D/private/q3dscommandqueue_p.h>
+#include <QtGui/qopenglframebufferobject.h>
+#include <QtQuick/qquickframebufferobject.h>
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSRenderer;
+class Q3DSViewerSettings;
+class Q3DSPresentationItem;
+
+class Q3DSStudio3D : public QQuickFramebufferObject
+{
+ Q_OBJECT
+ Q_PROPERTY(bool running READ isRunning NOTIFY runningChanged)
+ Q_PROPERTY(Q3DSPresentationItem *presentation READ presentation CONSTANT)
+ Q_PROPERTY(Q3DSViewerSettings *viewerSettings READ viewerSettings CONSTANT)
+ Q_PROPERTY(QString error READ error NOTIFY errorChanged)
+ Q_PROPERTY(EventIgnoreFlags ignoredEvents READ ignoredEvents WRITE setIgnoredEvents NOTIFY ignoredEventsChanged)
+
+public:
+ enum EventIgnoreFlag {
+ EnableAllEvents = 0,
+ IgnoreMouseEvents = 0x01,
+ IgnoreWheelEvents = 0x02,
+ IgnoreKeyboardEvents = 0x04,
+ IgnoreAllInputEvents = IgnoreMouseEvents | IgnoreWheelEvents | IgnoreKeyboardEvents
+ };
+ Q_DECLARE_FLAGS(EventIgnoreFlags, EventIgnoreFlag)
+ Q_FLAG(EventIgnoreFlags)
+
+ Q3DSStudio3D();
+ ~Q3DSStudio3D() override;
+
+ QQuickFramebufferObject::Renderer *createRenderer() const override;
+
+ bool isRunning() const;
+ Q3DSPresentationItem *presentation() const;
+ Q3DSViewerSettings *viewerSettings() const;
+ QString error() const;
+ void setError(const QString &error);
+
+ void getCommands(bool emitInitialize, CommandQueue &renderQueue);
+
+ void mousePressEvent(QMouseEvent *event) override;
+ void mouseReleaseEvent(QMouseEvent *event) override;
+ void mouseMoveEvent(QMouseEvent *event) override;
+ void wheelEvent(QWheelEvent *event) override;
+ void keyPressEvent(QKeyEvent *event) override;
+ void keyReleaseEvent(QKeyEvent *event) override;
+
+ EventIgnoreFlags ignoredEvents() const;
+ void setIgnoredEvents(EventIgnoreFlags flags);
+
+ void componentComplete() override;
+
+Q_SIGNALS:
+ void frameUpdate();
+ void runningChanged(bool initialized);
+ void errorChanged(const QString &error);
+ void ignoredEventsChanged();
+ void presentationReady();
+ void presentationLoaded();
+
+public Q_SLOTS:
+ void reset();
+
+protected Q_SLOTS:
+ void handleWindowChanged(QQuickWindow *window);
+ void handleVisibleChanged();
+ void tick();
+ void requestResponseHandler(const QString &elementPath, CommandType commandType,
+ void *requestData);
+private:
+ void updateEventMasks();
+
+protected:
+ Q3DSViewerSettings *m_viewerSettings;
+ Q3DSPresentationItem *m_presentation;
+
+ bool m_emitRunningChange;
+ bool m_isRunning;
+ EventIgnoreFlags m_eventIgnoreFlags;
+
+ CommandQueue m_pendingCommands;
+ qreal m_pixelRatio;
+ QString m_error;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(Q3DSStudio3D::EventIgnoreFlags)
+
+QT_END_NAMESPACE
+
+#endif // Q3DS_STUDIO3D_H
diff --git a/src/api/studio3dqml/qmldir b/src/api/studio3dqml/qmldir
new file mode 100644
index 0000000..1eaa8f2
--- /dev/null
+++ b/src/api/studio3dqml/qmldir
@@ -0,0 +1,3 @@
+module QtStudio3D.OpenGL
+plugin declarative_qtstudio3dopengl
+classname Q3DSPlugin
diff --git a/src/api/studio3dqml/studio3dqml.pro b/src/api/studio3dqml/studio3dqml.pro
new file mode 100644
index 0000000..b62a342
--- /dev/null
+++ b/src/api/studio3dqml/studio3dqml.pro
@@ -0,0 +1,34 @@
+include($$PWD/../../commoninclude.pri)
+
+QT += qml quick opengl studio3d-private
+CONFIG += plugin
+
+qtHaveModule(multimedia) {
+DEFINES += PLATFORM_HAS_QT_MULTIMEDIA_LIB
+QT += multimedia
+}
+
+TARGET = qtstudio3dopengl
+TARGETPATH = QtStudio3D/OpenGL
+IMPORT_VERSION = 2.4
+
+SOURCES += \
+ q3dsplugin.cpp \
+ q3dsstudio3d.cpp \
+ q3dsrenderer.cpp \
+ q3dspresentationitem.cpp
+
+HEADERS += \
+ q3dsplugin.h \
+ q3dsrenderer_p.h \
+ q3dsstudio3d_p.h \
+ q3dspresentationitem_p.h
+
+LIBS += \
+ -lqt3dsopengl$$qtPlatformTargetSuffix() \
+ -lqt3dsqmlstreamer$$qtPlatformTargetSuffix()
+
+OTHER_FILES += \
+ qmldir
+
+load(qml_plugin)
diff --git a/src/commoninclude.pri b/src/commoninclude.pri
new file mode 100644
index 0000000..13925a3
--- /dev/null
+++ b/src/commoninclude.pri
@@ -0,0 +1 @@
+include($$PWD/../commoninclude.pri)
diff --git a/src/datamodel/DocumentResourceManagerCustomMaterialParser.h b/src/datamodel/DocumentResourceManagerCustomMaterialParser.h
new file mode 100644
index 0000000..47a8092
--- /dev/null
+++ b/src/datamodel/DocumentResourceManagerCustomMaterialParser.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2002 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef DOCUMENTRESOURCEMANAGERCUSTOMMATERIALPARSERH
+#define DOCUMENTRESOURCEMANAGERCUSTOMMATERIALPARSERH
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+#include "Qt3DSDMXML.h"
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMMetaData.h"
+#include "Qt3DSDMWStrOpsImpl.h"
+#include "foundation/StrConvertUTF.h"
+#include <EASTL/string.h>
+#include "Qt3DSRenderInputStreamFactory.h"
+
+namespace Q3DStudio {
+struct CCustomMaterialParser
+{
+
+ static bool NavigateToMetadata(std::shared_ptr<qt3dsdm::IDOMReader> inReader)
+ {
+ return inReader->MoveToFirstChild("MetaData");
+ }
+
+ static std::shared_ptr<qt3dsdm::IDOMReader>
+ ParseFile(std::shared_ptr<qt3dsdm::IDOMFactory> inFactory,
+ std::shared_ptr<qt3dsdm::IStringTable> inStringTable, const char8_t *inFileData,
+ qt3dsdm::CXmlErrorHandler &inErrorHandler,
+ qt3ds::render::IInputStreamFactory &inStreamFactory)
+ {
+ using namespace qt3ds;
+ using namespace qt3ds::foundation;
+
+ NVScopedRefCounted<qt3ds::render::IRefCountedInputStream> theStream(
+ inStreamFactory.GetStreamForFile(inFileData));
+ if (!theStream) {
+ QT3DS_ASSERT(0);
+ return std::shared_ptr<qt3dsdm::IDOMReader>();
+ }
+
+ qt3dsdm::SDOMElement *theElem(
+ qt3dsdm::CDOMSerializer::Read(*inFactory, *theStream, &inErrorHandler));
+
+ if (theElem == NULL) {
+ return std::shared_ptr<qt3dsdm::IDOMReader>();
+ } else
+ return qt3dsdm::IDOMReader::CreateDOMReader(*theElem, inStringTable, inFactory);
+ }
+};
+}
+
+#endif
diff --git a/src/datamodel/DocumentResourceManagerRenderPluginParser.h b/src/datamodel/DocumentResourceManagerRenderPluginParser.h
new file mode 100644
index 0000000..e3eee1c
--- /dev/null
+++ b/src/datamodel/DocumentResourceManagerRenderPluginParser.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2002 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef DOCUMENTRESOURCEMANAGERRENDERPLUGINPARSERH
+#define DOCUMENTRESOURCEMANAGERRENDERPLUGINPARSERH
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+#include "Qt3DSDMXML.h"
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMMetaData.h"
+#include "Qt3DSDMWStrOpsImpl.h"
+#include "foundation/StrConvertUTF.h"
+#include <EASTL/string.h>
+#include "Qt3DSRenderInputStreamFactory.h"
+
+namespace Q3DStudio {
+struct CRenderPluginParser
+{
+
+ static bool NavigateToMetadata(std::shared_ptr<qt3dsdm::IDOMReader> inReader)
+ {
+ return inReader->MoveToFirstChild("metadata");
+ }
+
+ static std::shared_ptr<qt3dsdm::IDOMReader>
+ ParseFile(std::shared_ptr<qt3dsdm::IDOMFactory> inFactory,
+ std::shared_ptr<qt3dsdm::IStringTable> inStringTable, const char8_t *inFileData,
+ qt3dsdm::CXmlErrorHandler &inErrorHandler,
+ qt3ds::render::IInputStreamFactory &inStreamFactory)
+ {
+ using namespace qt3ds;
+ using namespace qt3ds::foundation;
+
+ NVScopedRefCounted<qt3ds::render::IRefCountedInputStream> theStream(
+ inStreamFactory.GetStreamForFile(inFileData));
+ if (!theStream) {
+ QT3DS_ASSERT(0);
+ return std::shared_ptr<qt3dsdm::IDOMReader>();
+ }
+
+ qt3dsdm::SDOMElement *theElem(
+ qt3dsdm::CDOMSerializer::Read(*inFactory, *theStream, &inErrorHandler));
+
+ if (theElem == NULL) {
+ return std::shared_ptr<qt3dsdm::IDOMReader>();
+ } else
+ return qt3dsdm::IDOMReader::CreateDOMReader(*theElem, inStringTable, inFactory);
+ }
+};
+}
+
+#endif
diff --git a/src/datamodel/DocumentResourceManagerScriptParser.h b/src/datamodel/DocumentResourceManagerScriptParser.h
new file mode 100644
index 0000000..4c2ce43
--- /dev/null
+++ b/src/datamodel/DocumentResourceManagerScriptParser.h
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DOCUMENTRESOURCEMANAGERSCRIPTPARSER_H
+#define DOCUMENTRESOURCEMANAGERSCRIPTPARSER_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+#include "Qt3DSDMXML.h"
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMMetaData.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+
+namespace Q3DStudio {
+namespace ScriptParser {
+
+ using namespace qt3dsdm;
+ using namespace Q3DStudio;
+
+ struct StringInStream : qt3ds::foundation::IInStream
+ {
+ const QString &m_String;
+ QT3DSU32 m_Offset;
+
+ StringInStream(const QString &str)
+ : m_String(str)
+ , m_Offset(0)
+ {
+ }
+
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override
+ {
+ std::string str = m_String.toUtf8().constData();
+ const char *theStart((const char *)str.c_str());
+ const char *theEnd(theStart + str.size());
+
+ QT3DSU32 amountLeft = QT3DSU32(theEnd - theStart) - m_Offset;
+ QT3DSU32 amountToRead = qt3ds::NVMin(data.size(), amountLeft);
+ qt3ds::intrinsics::memCopy(data.begin(), theStart + m_Offset, amountToRead);
+ m_Offset += amountToRead;
+ return amountToRead;
+ }
+ };
+
+ struct SScriptParser
+ {
+ static std::shared_ptr<IDOMReader>
+ ParseScriptFile(std::shared_ptr<IDOMFactory> factory,
+ std::shared_ptr<qt3dsdm::IStringTable> stringTable,
+ const QString &fullPath, CXmlErrorHandler &errorHandler,
+ qt3ds::render::IInputStreamFactory &streamFactory)
+ {
+ QVector<QT3DSU8> readBuf;
+ {
+ using namespace qt3ds;
+ using namespace qt3ds::foundation;
+ eastl::string strConvert;
+ NVScopedRefCounted<qt3ds::render::IRefCountedInputStream> stream(
+ streamFactory.GetStreamForFile(fullPath));
+ if (!stream) {
+ QT3DS_ASSERT(0);
+ return std::shared_ptr<IDOMReader>();
+ }
+
+ QT3DSU32 readLen = 0;
+ do {
+ uint32_t offset = readBuf.size();
+ readBuf.resize(offset + 4096);
+ readLen = stream->Read(NVDataRef<QT3DSU8>(&readBuf[0] + offset, 4096));
+ readBuf.resize(offset + readLen);
+ } while (readLen == 4096);
+ }
+
+ QByteArray byteArray;
+ for (auto &&c : qAsConst(readBuf))
+ byteArray.append(c);
+
+ QString code = QString::fromUtf8(byteArray);
+
+ bool skipXml = false;
+ auto start = code.indexOf("/*[[");
+ if (start == -1)
+ skipXml = true;
+
+ QString tagged("<Behavior>\n");
+ if (!skipXml) {
+ start += 4;
+ auto end = code.indexOf("]]*/", start);
+ if (end == -1)
+ return std::shared_ptr<IDOMReader>();
+
+ QString xml = code.mid(start, end - start).trimmed();
+
+ tagged.append(xml);
+ }
+ tagged.append("</Behavior>\n");
+ tagged.replace("\r\n", "\n");
+
+ StringInStream xmlStream(tagged);
+
+ SDOMElement *element(CDOMSerializer::Read(*factory, xmlStream, &errorHandler));
+ if (element == NULL)
+ return std::shared_ptr<IDOMReader>();
+
+ return IDOMReader::CreateDOMReader(*element, stringTable, factory);
+ }
+ };
+}
+}
+
+#endif // DOCUMENTRESOURCEMANAGERSCRIPTPARSER_H
diff --git a/src/datamodel/Qt3DSMetadata.cpp b/src/datamodel/Qt3DSMetadata.cpp
new file mode 100644
index 0000000..89bb4de
--- /dev/null
+++ b/src/datamodel/Qt3DSMetadata.cpp
@@ -0,0 +1,998 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSMetadata.h"
+#include "SimpleDataCore.h"
+#include "Qt3DSDMXML.h"
+#include "foundation/IOStreams.h"
+#include "Qt3DSEulerAngles.h"
+#include "Qt3DSDMWindowsCompatibility.h"
+#include "Qt3DSDMComposerTypeDefinitions.h"
+#include "DocumentResourceManagerScriptParser.h"
+#include "foundation/StrConvertUTF.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "foundation/FileTools.h"
+#include "foundation/TrackingAllocator.h"
+#include "EASTL/hash_map.h"
+#include "DocumentResourceManagerRenderPluginParser.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/StringTable.h"
+
+using qt3ds::render::IInputStreamFactory;
+using qt3ds::render::IRefCountedInputStream;
+
+using namespace qt3dsdm;
+using namespace Q3DStudio;
+
+namespace {
+
+
+struct SImportXmlErrorHandler : public CXmlErrorHandler
+{
+ void OnXmlError(const QString &errorName, int line, int) override
+ {
+ qCCritical(INTERNAL_ERROR) << "XML error:"
+ << errorName << "on line" << line;
+ }
+};
+
+struct SRuntimeMetaDataPropertyInfo
+{
+ ERuntimeDataModelDataType m_DataType;
+ ERuntimeAdditionalMetaDataType m_AdditionalType;
+ Option<SValue> m_Value;
+ bool m_Exist;
+ SRuntimeMetaDataPropertyInfo(ERuntimeDataModelDataType inDataType,
+ ERuntimeAdditionalMetaDataType inAdditionalType,
+ const Option<SValue> &inValue, bool inExist)
+ : m_DataType(inDataType)
+ , m_AdditionalType(inAdditionalType)
+ , m_Value(inValue)
+ , m_Exist(inExist)
+ {
+ }
+ SRuntimeMetaDataPropertyInfo()
+ : m_DataType(ERuntimeDataModelDataTypeNone)
+ , m_AdditionalType(ERuntimeAdditionalMetaDataTypeNone)
+ , m_Exist(false)
+ {
+ }
+};
+
+struct SPropertyKey
+{
+ const char8_t *m_TypeOrId;
+ const char8_t *m_PropertyName;
+
+ // The character pointers are expected to have come from the string table
+ // thus we can safely use their exact pointer addresses for the hash code.
+ SPropertyKey(const char8_t *typeOrId, const char8_t *inPname)
+ : m_TypeOrId(typeOrId)
+ , m_PropertyName(inPname)
+ {
+ }
+ bool operator==(const SPropertyKey &inOther) const
+ {
+ // equality comparison safe since strings are assumed to come from string table.
+ return m_TypeOrId == inOther.m_TypeOrId && m_PropertyName == inOther.m_PropertyName;
+ }
+};
+}
+
+namespace eastl {
+template <>
+struct hash<SPropertyKey>
+{
+ size_t operator()(const SPropertyKey &inKey) const
+ {
+ return reinterpret_cast<size_t>(inKey.m_TypeOrId)
+ ^ reinterpret_cast<size_t>(inKey.m_PropertyName);
+ }
+};
+}
+
+namespace {
+
+//===========================================================================
+/**
+ * @class SRuntimeMetaDataImpl
+ * @brief implements the IRumtimeMetaData interface class
+ */
+struct SRuntimeMetaDataImpl : public IRuntimeMetaData
+{
+
+private:
+ typedef std::map<TCharStr, int> TIdToHandleMap;
+ typedef eastl::hash_map<SPropertyKey, SRuntimeMetaDataPropertyInfo> TPropertyLookupHash;
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+ std::shared_ptr<qt3dsdm::IStringTable> m_StrTable;
+ std::shared_ptr<IDataCore> m_DataCore;
+ std::shared_ptr<IMetaData> m_NewMetaData;
+ std::shared_ptr<SComposerObjectDefinitions> m_Objects;
+ std::vector<TCharStr> m_TempReferences;
+
+ TIdToHandleMap m_IdToHandleMap;
+ // We cache properties by id or by instance so that the same query for the same value
+ // will return an answer instantly instead of calling GetAggregateInstancePropertyByName which
+ // is really
+ // expensive.
+ TPropertyLookupHash m_PropertyLookupHash;
+ IInputStreamFactory &m_InputStreamFactory;
+
+ // Helper to convert char to wchar_t
+ eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> m_Buf[4];
+
+public:
+ static void SimpleDataModelLogger(const char *inMessage)
+ {
+ qCInfo(TRACE_INFO) << SRuntimeMetaDataImpl::SimpleDataModelLogger
+ << inMessage;
+ }
+ //==============================================================================
+ /**
+ * Constructor
+ */
+ SRuntimeMetaDataImpl(IInputStreamFactory &inFactory)
+ : m_InputStreamFactory(inFactory)
+ {
+ // Use this to enable some simple uicdm debug logging. Beware of a *lot* of log output.
+ // g_DataModelDebugLogger = SimpleDataModelLogger;
+ try {
+ // need to pause here to hook up the debugger
+ m_StrTable = qt3dsdm::IStringTable::CreateStringTable();
+ m_DataCore = std::make_shared<CSimpleDataCore>(m_StrTable);
+ m_NewMetaData = IMetaData::CreateNewMetaData(m_DataCore);
+
+ m_Objects = std::make_shared<SComposerObjectDefinitions>(std::ref(*m_DataCore),
+ std::ref(*m_NewMetaData));
+ } catch (qt3dsdm::Qt3DSDMError &error) {
+ qCCritical(INTERNAL_ERROR) << "SRuntimeMetaDataImpl Qt3DSDMError: "
+ << m_StrTable->GetNarrowStr(error.m_Message);
+ } catch (std::runtime_error &exc) {
+ if (exc.what()) {
+ qCCritical(INTERNAL_ERROR) << "SRuntimeMetaDataImpl std::runtime_error: "
+ << exc.what();
+ } else {
+ qCCritical(INTERNAL_ERROR) << "SRuntimeMetaDataImpl std::runtime_error";
+ }
+ } catch (std::exception &exc) {
+ if (exc.what()) {
+ qCCritical(INTERNAL_ERROR) << "SRuntimeMetaDataImpl std::exception: "
+ << exc.what();
+ } else {
+ qCCritical(INTERNAL_ERROR) << "SRuntimeMetaDataImpl std::exception";
+ }
+ }
+ }
+
+ void Load()
+ {
+ // Create the base types.
+ std::shared_ptr<IDOMFactory> theFactory(IDOMFactory::CreateDOMFactory(m_StrTable));
+ const char8_t *theMetaDataPath = GetMetaDataDirectory();
+ NVScopedRefCounted<IRefCountedInputStream> theInStream(
+ m_InputStreamFactory.GetStreamForFile(theMetaDataPath));
+ SDOMElement *topElement = NULL;
+ if (theInStream)
+ topElement = CDOMSerializer::Read(*theFactory, *theInStream);
+ if (topElement) {
+ shared_ptr<IDOMReader> theReader =
+ IDOMReader::CreateDOMReader(*topElement, m_StrTable, theFactory);
+ m_NewMetaData->Load(*theReader);
+
+ } else {
+ qCCritical(INVALID_OPERATION) << "Metadata loading failed", "Failed to find meta data file";
+ // Q3DStudio_ASSERT requires static linkage to UICSystem, which is only used
+ // by UICEngine and UICRuntime
+ // QT3DS_ASSERT requires the qt3ds foundation libraries which are used by all products.
+ QT3DS_ASSERT(false);
+ return;
+ }
+ }
+
+ // Helper to convert wchar_t to eastl::string
+ static inline void ConvertWide(const wchar_t *inType, eastl::string &outStr)
+ {
+ if (inType && *inType)
+ qt3ds::foundation::ConvertUTF(
+ reinterpret_cast<const qt3ds::foundation::TWCharEASTLConverter::TCharType *>(inType),
+ 0, outStr);
+ else
+ outStr.clear();
+ }
+
+ // Helper to convert char to wchar_t
+ const wchar_t *ConvertChar(const char *inName, int inBufferIndex)
+ {
+ if (inName && *inName) {
+ qt3ds::foundation::ConvertUTF(inName, 0, m_Buf[inBufferIndex]);
+ return reinterpret_cast<const wchar_t *>(m_Buf[inBufferIndex].c_str());
+ }
+ return NULL;
+ }
+ inline const wchar_t *Convert0(const char *inName) { return ConvertChar(inName, 0); }
+ inline const wchar_t *Convert1(const char *inName) { return ConvertChar(inName, 1); }
+ inline const wchar_t *Convert2(const char *inName) { return ConvertChar(inName, 2); }
+ inline const wchar_t *Convert3(const char *inName) { return ConvertChar(inName, 3); }
+
+ inline Qt3DSDMInstanceHandle GetInstanceForType(const wchar_t *inType)
+ {
+ return m_Objects->GetInstanceForType(ComposerObjectTypes::Convert(inType));
+ }
+
+ Qt3DSDMInstanceHandle GetInstanceById(const wchar_t *inId)
+ {
+ if (IsTrivial(inId))
+ return 0;
+ if (inId[0] == '#')
+ ++inId;
+
+ TIdToHandleMap::iterator find = m_IdToHandleMap.find(inId);
+ if (find != m_IdToHandleMap.end())
+ return find->second;
+ return 0;
+ }
+
+ virtual bool IsPropertyExist(const wchar_t *inType, const wchar_t *inProperty,
+ const wchar_t *inId)
+ {
+ Qt3DSDMInstanceHandle theInstance =
+ IsTrivial(inId) ? GetInstanceForType(inType) : GetInstanceById(inId);
+ if (theInstance.Valid()) {
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(theInstance, inProperty);
+
+ return theProperty.Valid();
+ }
+ return false;
+ }
+
+ ERuntimeDataModelDataType Convert(DataModelDataType::Value inType)
+ {
+ switch (inType) {
+ case DataModelDataType::None:
+ return ERuntimeDataModelDataTypeNone;
+ case DataModelDataType::Float:
+ return ERuntimeDataModelDataTypeFloat;
+ case DataModelDataType::Float2:
+ return ERuntimeDataModelDataTypeFloat2;
+ case DataModelDataType::Float3:
+ return ERuntimeDataModelDataTypeFloat3;
+ case DataModelDataType::Float4:
+ return ERuntimeDataModelDataTypeFloat4;
+ case DataModelDataType::Long:
+ return ERuntimeDataModelDataTypeLong;
+ case DataModelDataType::String:
+ return ERuntimeDataModelDataTypeString;
+ case DataModelDataType::Bool:
+ return ERuntimeDataModelDataTypeBool;
+ case DataModelDataType::Long4:
+ return ERuntimeDataModelDataTypeLong4;
+ case DataModelDataType::StringRef:
+ return ERuntimeDataModelDataTypeStringRef;
+ case DataModelDataType::ObjectRef:
+ return ERuntimeDataModelDataTypeObjectRef;
+ case DataModelDataType::StringOrInt:
+ return ERuntimeDataModelDataTypeStringOrInt;
+ default:
+ QT3DS_ASSERT(false);
+ return ERuntimeDataModelDataTypeNone;
+ }
+ }
+
+ virtual ERuntimeDataModelDataType
+ GetPropertyType(const wchar_t *inType, const wchar_t *inProperty, const wchar_t *inId)
+ {
+ Qt3DSDMInstanceHandle theInstance =
+ IsTrivial(inId) ? GetInstanceForType(inType) : GetInstanceById(inId);
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(theInstance, inProperty);
+ return Convert(m_DataCore->GetProperty(theProperty).m_Type);
+ }
+
+ ERuntimeAdditionalMetaDataType Convert(AdditionalMetaDataType::Value inType)
+ {
+ switch (inType) {
+ case AdditionalMetaDataType::None:
+ return ERuntimeAdditionalMetaDataTypeNone;
+ case AdditionalMetaDataType::StringList:
+ return ERuntimeAdditionalMetaDataTypeStringList;
+ case AdditionalMetaDataType::Range:
+ return ERuntimeAdditionalMetaDataTypeRange;
+ case AdditionalMetaDataType::Image:
+ return ERuntimeAdditionalMetaDataTypeImage;
+ case AdditionalMetaDataType::Color:
+ return ERuntimeAdditionalMetaDataTypeColor;
+ case AdditionalMetaDataType::Rotation:
+ return ERuntimeAdditionalMetaDataTypeRotation;
+ case AdditionalMetaDataType::Font:
+ return ERuntimeAdditionalMetaDataTypeFont;
+ case AdditionalMetaDataType::FontSize:
+ return ERuntimeAdditionalMetaDataTypeFontSize;
+ case AdditionalMetaDataType::MultiLine:
+ return ERuntimeAdditionalMetaDataTypeMultiLine;
+ case AdditionalMetaDataType::ObjectRef:
+ return ERuntimeAdditionalMetaDataTypeObjectRef;
+ case AdditionalMetaDataType::Mesh:
+ return ERuntimeAdditionalMetaDataTypeMesh;
+ case AdditionalMetaDataType::Import:
+ return ERuntimeAdditionalMetaDataTypeImport;
+ case AdditionalMetaDataType::Texture:
+ return ERuntimeAdditionalMetaDataTypeTexture;
+ case AdditionalMetaDataType::Renderable:
+ return ERuntimeAdditionalMetaDataTypeRenderable;
+ case AdditionalMetaDataType::PathBuffer:
+ return ERuntimeAdditionalMetaDataTypePathBuffer;
+ case AdditionalMetaDataType::ShadowMapResolution:
+ return ERuntimeAdditionalMetaDataTypeShadowMapResolution;
+ case AdditionalMetaDataType::String:
+ return ERuntimeAdditionalMetaDataTypeString;
+ default:
+ QT3DS_ASSERT(false);
+ return ERuntimeAdditionalMetaDataTypeNone;
+ }
+ }
+
+ virtual ERuntimeAdditionalMetaDataType
+ GetAdditionalType(const wchar_t *inType, const wchar_t *inProperty, const wchar_t *inId)
+ {
+ Qt3DSDMInstanceHandle theInstance =
+ IsTrivial(inId) ? GetInstanceForType(inType) : GetInstanceById(inId);
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(theInstance, inProperty);
+ return Convert(m_NewMetaData->GetAdditionalMetaDataType(theInstance, theProperty));
+ }
+
+ bool GetPropertyValue(const wchar_t *inType, const wchar_t *inProperty, const wchar_t *inId,
+ SValue &outValue)
+ {
+ Qt3DSDMInstanceHandle theInstance =
+ IsTrivial(inId) ? GetInstanceForType(inType) : GetInstanceById(inId);
+ if (theInstance.Valid()) {
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(theInstance, inProperty);
+ return m_DataCore->GetInstancePropertyValue(theInstance, theProperty, outValue);
+ } else {
+ eastl::string typeStr;
+ eastl::string propertyStr;
+ eastl::string idStr;
+ ConvertWide(inType, typeStr);
+ ConvertWide(inProperty, propertyStr);
+ ConvertWide(inId, idStr);
+ qCCritical(INVALID_OPERATION) << "GetPropertyValueString: "
+ << typeStr.c_str() << " "
+ << propertyStr.c_str() << " "
+ << idStr.c_str();
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+
+ SRuntimeMetaDataPropertyInfo &FindProperty(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId)
+ {
+ TStrTableStr theTypeOrId = inId.IsValid() ? inId : inType;
+ SPropertyKey theKey(theTypeOrId, inProperty);
+ eastl::pair<TPropertyLookupHash::iterator, bool> theLookup =
+ m_PropertyLookupHash.insert(eastl::make_pair(theKey, SRuntimeMetaDataPropertyInfo()));
+ if (theLookup.second) {
+ const wchar_t *theType(Convert0(inType));
+ const wchar_t *theProperty(Convert1(inProperty));
+ const wchar_t *theId(Convert2(inId));
+ if (IsPropertyExist(theType, theProperty, theId)) {
+ ERuntimeDataModelDataType theDataType(GetPropertyType(theType, theProperty, theId));
+ ERuntimeAdditionalMetaDataType theAdditionalType(
+ GetAdditionalType(theType, theProperty, theId));
+ Option<SValue> theValue;
+ SValue theValueData;
+ if (GetPropertyValue(theType, theProperty, theId, theValueData))
+ theValue = theValueData.toOldSkool();
+ theLookup.first->second =
+ SRuntimeMetaDataPropertyInfo(theDataType, theAdditionalType, theValue, true);
+ }
+ }
+ return theLookup.first->second;
+ }
+
+ bool IsPropertyExist(TStrTableStr inType, TStrTableStr inProperty, TStrTableStr inId) override
+ {
+ return FindProperty(inType, inProperty, inId).m_Exist;
+ }
+
+ ERuntimeDataModelDataType GetPropertyType(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId) override
+ {
+ return FindProperty(inType, inProperty, inId).m_DataType;
+ }
+
+ virtual ERuntimeAdditionalMetaDataType
+ GetAdditionalType(TStrTableStr inType, TStrTableStr inProperty, TStrTableStr inId) override
+ {
+ return FindProperty(inType, inProperty, inId).m_AdditionalType;
+ }
+
+ Option<float> GetPropertyValueFloat(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue())
+ return qt3dsdm::get<float>(*theInfo.m_Value);
+ return Empty();
+ }
+
+ Option<qt3ds::QT3DSVec2> GetPropertyValueVector2(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue()) {
+ SFloat2 theFloat2 = qt3dsdm::get<SFloat2>(*theInfo.m_Value);
+ return qt3ds::QT3DSVec2(theFloat2[0], theFloat2[1]);
+ }
+ return Empty();
+ }
+
+ Option<qt3ds::QT3DSVec3> GetPropertyValueVector3(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue()) {
+ SFloat3 theFloat3 = qt3dsdm::get<SFloat3>(*theInfo.m_Value);
+ return qt3ds::QT3DSVec3(theFloat3[0], theFloat3[1], theFloat3[2]);
+ }
+ return Empty();
+ }
+
+ Option<qt3ds::QT3DSVec4> GetPropertyValueVector4(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue()) {
+ SFloat4 theFloat4 = qt3dsdm::get<SFloat4>(*theInfo.m_Value);
+ return qt3ds::QT3DSVec4(theFloat4[0], theFloat4[1], theFloat4[2], theFloat4[3]);
+ }
+ return Empty();
+ }
+
+ virtual Option<qt3ds::QT3DSI32> GetPropertyValueLong(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue())
+ return qt3dsdm::get<qt3ds::QT3DSI32>(*theInfo.m_Value);
+ return Empty();
+ }
+
+ virtual Option<TRuntimeMetaDataStrType>
+ GetPropertyValueString(TStrTableStr inType, TStrTableStr inProperty, TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue()) {
+ TDataStrPtr theStr = qt3dsdm::get<TDataStrPtr>(*theInfo.m_Value);
+ TRuntimeMetaDataStrType retval;
+ qt3ds::foundation::ConvertUTF(
+ reinterpret_cast<const qt3ds::foundation::TWCharEASTLConverter::TCharType *>(
+ theStr->GetData()),
+ 0, retval);
+ return retval;
+ }
+ return Empty();
+ }
+
+ virtual Option<TRuntimeMetaDataStrType>
+ GetPropertyValueObjectRef(TStrTableStr inType, TStrTableStr inProperty, TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue()) {
+ SObjectRefType theObjectRef = ConvertToObjectRef(*theInfo.m_Value);
+ if (theObjectRef.GetReferenceType() == ObjectReferenceType::Relative) {
+ TDataStrPtr theStr = qt3dsdm::get<TDataStrPtr>(theObjectRef.m_Value);
+ TRuntimeMetaDataStrType retval;
+ qt3ds::foundation::ConvertUTF(
+ reinterpret_cast<const qt3ds::foundation::TWCharEASTLConverter::TCharType *>(
+ theStr->GetData()),
+ 0, retval);
+ return retval;
+ } else // we don't know how to solve absolute reference type
+ {
+ // QT3DS_ASSERT( false );
+ return TRuntimeMetaDataStrType("");
+ }
+ }
+ return Empty();
+ }
+
+ Option<bool> GetPropertyValueBool(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId) override
+ {
+ SRuntimeMetaDataPropertyInfo &theInfo(FindProperty(inType, inProperty, inId));
+ if (theInfo.m_Value.hasValue())
+ return qt3dsdm::get<bool>(*theInfo.m_Value);
+ return Empty();
+ }
+
+ virtual void GetReferences(const wchar_t *inType,
+ eastl::vector<TRuntimeMetaDataStrType> &outReferences,
+ const wchar_t *inId)
+ {
+ Qt3DSDMInstanceHandle theInstance =
+ IsTrivial(inId) ? GetInstanceForType(inType) : GetInstanceById(inId);
+
+ if (theInstance.Valid()) {
+ m_TempReferences.clear();
+ m_NewMetaData->GetReferences(theInstance, m_TempReferences);
+ outReferences.resize((uint32_t)m_TempReferences.size());
+ for (uint32_t idx = 0, end = (uint32_t)m_TempReferences.size(); idx < end; ++idx) {
+ qt3ds::foundation::ConvertUTF(m_TempReferences[idx].c_str(),
+ m_TempReferences[idx].size(), outReferences[idx]);
+ }
+ }
+ }
+
+ void GetReferences(const char *inType,
+ eastl::vector<TRuntimeMetaDataStrType> &outReferences,
+ const char *inId) override
+ {
+ GetReferences(Convert0(inType), outReferences, Convert2(inId));
+ }
+
+ virtual bool IsCustomProperty(const wchar_t *inId, const wchar_t *inProperty)
+ {
+ Qt3DSDMInstanceHandle theInstance = GetInstanceById(inId);
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(theInstance, inProperty);
+ return m_NewMetaData->IsCustomProperty(theInstance, theProperty);
+ }
+
+ bool IsCustomProperty(const char *inId, const char *inProperty) override
+ {
+ return IsCustomProperty(Convert2(inId), Convert1(inProperty));
+ }
+
+ virtual bool IsCustomHandler(const wchar_t *inId, const wchar_t *inHandlerName)
+ {
+ Qt3DSDMInstanceHandle theInstance = GetInstanceById(inId);
+ Qt3DSDMHandlerHandle theHandle =
+ m_NewMetaData->FindHandlerByName(theInstance, inHandlerName);
+ return m_NewMetaData->IsCustomHandler(theHandle);
+ }
+
+ inline void SetDataType(SAttOrArg &arg, const SMetaPropertyBase &argInfo)
+ {
+ arg.m_DataType = Convert(argInfo.GetDataType());
+ arg.m_MetaType = Convert(argInfo.GetAdditionalType());
+ qt3ds::foundation::ConvertUTF(argInfo.m_Name.c_str(), argInfo.m_Name.size(), arg.m_Name);
+ qt3ds::foundation::ConvertUTF(argInfo.m_FormalName.c_str(), argInfo.m_FormalName.size(),
+ arg.m_FormalName);
+ switch (argInfo.GetAdditionalType()) {
+ case qt3dsdm::AdditionalMetaDataType::StringList: {
+ const eastl::vector<TCharStr> &theData =
+ argInfo.m_MetaDataData.getData<eastl::vector<TCharStr>>();
+ arg.m_MetaDataList.resize(theData.size());
+ for (uint32_t metaIdx = 0, metaEnd = theData.size(); metaIdx < metaEnd; ++metaIdx)
+ qt3ds::foundation::ConvertUTF(theData[metaIdx].c_str(), theData[metaIdx].size(),
+ arg.m_MetaDataList[metaIdx]);
+ } break;
+ case qt3dsdm::AdditionalMetaDataType::Range: {
+ const SMetaDataRange &range = argInfo.m_MetaDataData.getData<SMetaDataRange>();
+ arg.m_MetaDataRange = eastl::make_pair(range.m_min, range.m_max);
+ } break;
+ default:
+ break;
+ }
+ }
+
+ THandlerList GetCustomHandlers(const char *inId) override
+ {
+ THandlerList retval;
+ Qt3DSDMInstanceHandle theInstance = GetInstanceById(Convert0(inId));
+ THandlerHandleList handlerList;
+ m_NewMetaData->GetHandlers(theInstance, handlerList);
+ retval.reserve((uint32_t)handlerList.size());
+ for (size_t idx = 0, end = handlerList.size(); idx < end; ++idx) {
+ if (m_NewMetaData->IsCustomHandler(handlerList[idx])) {
+ SHandlerInfo theInfo(m_NewMetaData->GetHandlerInfo(handlerList[idx]));
+ retval.push_back(SHandler());
+ SHandler &handler(retval.back());
+ qt3ds::foundation::ConvertUTF(theInfo.m_Name.c_str(), theInfo.m_Name.size(),
+ handler.m_Name);
+ qt3ds::foundation::ConvertUTF(theInfo.m_FormalName.c_str(),
+ theInfo.m_FormalName.size(), handler.m_FormalName);
+ vector<SMetaDataHandlerArgumentInfo> theArgInfo;
+ m_NewMetaData->GetHandlerArguments(handlerList[idx], theArgInfo);
+ handler.m_Arguments.resize((uint32_t)theArgInfo.size());
+ for (uint32_t argIdx = 0, argEnd = (uint32_t)theArgInfo.size(); argIdx < argEnd;
+ ++argIdx) {
+ const SMetaDataHandlerArgumentInfo &argInfo(theArgInfo[argIdx]);
+ SAttOrArg &arg = handler.m_Arguments[argIdx];
+ SetDataType(arg, argInfo);
+ }
+ }
+ }
+ return retval;
+ }
+
+ TVisualEventList GetVisualEvents(const char *inId) override
+ {
+ TVisualEventList theRetval;
+ Qt3DSDMInstanceHandle theInstance = GetInstanceById(Convert0(inId));
+ TEventHandleList theEventList;
+ m_NewMetaData->GetEvents(theInstance, theEventList);
+ theRetval.reserve((uint32_t)theEventList.size());
+ for (uint32_t idx = 0, end = (uint32_t)theEventList.size(); idx < end; ++idx) {
+ SEventInfo theInfo(m_NewMetaData->GetEventInfo(theEventList[idx]));
+ theRetval.push_back(SVisualEvent());
+ SVisualEvent &theEvent(theRetval.back());
+ qt3ds::foundation::ConvertUTF(theInfo.m_Name.c_str(), theInfo.m_Name.size(),
+ theEvent.m_Name);
+ qt3ds::foundation::ConvertUTF(theInfo.m_FormalName.c_str(), theInfo.m_FormalName.size(),
+ theEvent.m_FormalName);
+ }
+ return theRetval;
+ }
+
+ void MetaPropertiesToAttList(vector<Qt3DSDMMetaDataPropertyHandle> &theProperties,
+ TAttOrArgList &outAtts)
+ {
+ outAtts.reserve((uint32_t)theProperties.size());
+ for (uint32_t idx = 0, end = (uint32_t)theProperties.size(); idx < end; ++idx) {
+ SMetaDataPropertyInfo thePropInfo =
+ m_NewMetaData->GetMetaDataPropertyInfo(theProperties[idx]);
+ outAtts.push_back(SAttOrArg());
+ SAttOrArg &arg(outAtts.back());
+ arg.m_DataType = Convert(thePropInfo.GetDataType());
+ arg.m_MetaType = Convert(thePropInfo.GetAdditionalType());
+ qt3ds::foundation::ConvertUTF(thePropInfo.m_Name.c_str(), thePropInfo.m_Name.size(),
+ arg.m_Name);
+ qt3ds::foundation::ConvertUTF(thePropInfo.m_FormalName.c_str(),
+ thePropInfo.m_FormalName.size(), arg.m_FormalName);
+ SetDataType(arg, thePropInfo);
+ }
+ }
+
+ SElementInfo LoadElement(const char *clsName, const char *clsRef, const char *inId) override
+ {
+ SElementInfo retval;
+ Qt3DSDMInstanceHandle theInstance;
+ Qt3DSDMInstanceHandle parentInstance;
+ if (!qt3ds::foundation::isTrivial(clsRef)) {
+ if (clsRef[0] == '#')
+ ++clsRef;
+ parentInstance = GetInstanceById(Convert0(clsRef));
+ } else {
+ parentInstance = m_NewMetaData->GetCanonicalInstanceForType(Convert0(clsName));
+ }
+ if (parentInstance.Valid() == false) {
+ QT3DS_ASSERT(false);
+ return retval;
+ }
+ theInstance = m_DataCore->CreateInstance();
+ m_DataCore->DeriveInstance(theInstance, parentInstance);
+ m_IdToHandleMap.insert(std::make_pair(TCharStr(Convert0(inId)), theInstance));
+ // setup isComponent
+ Qt3DSDMInstanceHandle slideOwner = m_NewMetaData->GetCanonicalInstanceForType(L"SlideOwner");
+ retval.m_IsComponent = m_DataCore->IsInstanceOrDerivedFrom(theInstance, slideOwner);
+ TCharStr type = m_NewMetaData->GetTypeForInstance(theInstance);
+ qt3ds::foundation::ConvertUTF(type.c_str(), type.size(), retval.m_ClassName);
+ vector<Qt3DSDMMetaDataPropertyHandle> theProperties;
+ m_NewMetaData->GetMetaDataProperties(theInstance, theProperties);
+ MetaPropertiesToAttList(theProperties, retval.m_Attributes);
+ return retval;
+ }
+
+ TAttOrArgList GetSlideAttributes() override
+ {
+ TAttOrArgList retval;
+ Qt3DSDMInstanceHandle slideOwner = m_NewMetaData->GetCanonicalInstanceForType(L"Slide");
+ vector<Qt3DSDMMetaDataPropertyHandle> theProperties;
+ m_NewMetaData->GetSpecificMetaDataProperties(slideOwner, theProperties);
+ MetaPropertiesToAttList(theProperties, retval);
+ return retval;
+ }
+
+ bool IsCustomHandler(const char *inId, const char *inHandlerName) override
+ {
+ return IsCustomHandler(Convert0(inId), Convert1(inHandlerName));
+ }
+
+ virtual void GetHandlerArgumentType(const wchar_t *inId, const wchar_t *inHandlerName,
+ const wchar_t *inArgumentName,
+ ERuntimeDataModelDataType &outType,
+ ERuntimeAdditionalMetaDataType &outAdditionalType)
+ {
+ outType = ERuntimeDataModelDataTypeNone;
+ outAdditionalType = ERuntimeAdditionalMetaDataTypeNone;
+
+ Qt3DSDMInstanceHandle theInstance = GetInstanceById(inId);
+ Qt3DSDMHandlerHandle theHandle =
+ m_NewMetaData->FindHandlerByName(theInstance, inHandlerName);
+ Option<SMetaDataHandlerArgumentInfo> theArgMetaData(
+ m_NewMetaData->FindHandlerArgumentByName(theHandle, inArgumentName));
+ if (theArgMetaData.hasValue()) {
+ outType = Convert(theArgMetaData->GetDataType());
+ outAdditionalType = Convert(theArgMetaData->GetAdditionalType());
+ }
+
+ // Check if the type is something that we support
+ QT3DS_ASSERT(outType != ERuntimeDataModelDataTypeNone);
+ }
+
+ void GetHandlerArgumentType(const char *inId, const char *inHandlerName,
+ const char *inArgumentName,
+ ERuntimeDataModelDataType &outType,
+ ERuntimeAdditionalMetaDataType &outAdditionalType) override
+ {
+ GetHandlerArgumentType(Convert0(inId), Convert1(inHandlerName), Convert2(inArgumentName),
+ outType, outAdditionalType);
+ }
+
+ std::shared_ptr<IDOMReader> ParseScriptFile(const wchar_t *inFullPathToDocument,
+ std::shared_ptr<qt3dsdm::IStringTable> inStringTable)
+ {
+ using namespace ScriptParser;
+ std::shared_ptr<qt3dsdm::IStringTable> theStringTable(inStringTable);
+ std::shared_ptr<IDOMFactory> theFactory(IDOMFactory::CreateDOMFactory(theStringTable));
+ SImportXmlErrorHandler theXmlErrorHandler;
+ const QString path = QString::fromWCharArray(inFullPathToDocument);
+ std::shared_ptr<IDOMReader> theReaderPtr(
+ SScriptParser::ParseScriptFile(theFactory, inStringTable,
+ path,
+ theXmlErrorHandler, m_InputStreamFactory));
+ if (!theReaderPtr)
+ qCCritical(INVALID_OPERATION) << "Failed to open script file: " << path;
+ return theReaderPtr;
+ }
+
+ Qt3DSDMInstanceHandle CreateAndDeriveInstance(const wchar_t *inType, const wchar_t *inId)
+ {
+ // Make sure that the same id has not been created before
+ TCharStr theId(inId);
+ QT3DS_ASSERT(m_IdToHandleMap.find(theId) == m_IdToHandleMap.end());
+
+ Qt3DSDMInstanceHandle theCanonicalType(m_NewMetaData->GetCanonicalInstanceForType(inType));
+ if (theCanonicalType.Valid() == false) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ Qt3DSDMInstanceHandle theMaster = m_DataCore->CreateInstance();
+ m_DataCore->DeriveInstance(theMaster, theCanonicalType);
+ m_IdToHandleMap.insert(std::make_pair(theId, theMaster));
+ return theMaster;
+ }
+
+ virtual bool LoadScriptFile(const wchar_t *inType, const wchar_t *inId, const wchar_t *inName,
+ const wchar_t *inSourcePath)
+ {
+ TCharStr theId(inId);
+ if (m_IdToHandleMap.find(theId) != m_IdToHandleMap.end())
+ return true;
+
+ Qt3DSDMInstanceHandle theMaster = CreateAndDeriveInstance(inType, inId);
+ if (!theMaster.Valid())
+ return false;
+
+ std::shared_ptr<IDOMReader> theScriptPtr =
+ ParseScriptFile(inSourcePath, m_DataCore->GetStringTablePtr());
+ if (theScriptPtr) {
+ std::vector<SMetaDataLoadWarning> warnings;
+ // Now the magic section
+ m_NewMetaData->LoadInstance(*theScriptPtr, theMaster, inName, warnings);
+
+ // Set the name
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(theMaster, L"name");
+ m_DataCore->SetInstancePropertyValue(theMaster, theProperty,
+ std::make_shared<CDataStr>(inName));
+ return true;
+ }
+
+ return false;
+ }
+
+ bool LoadScriptFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) override
+ {
+ return LoadScriptFile(Convert0(inType), Convert1(inId), Convert2(inName),
+ Convert3(inSourcePath));
+ }
+
+ bool LoadEffectXMLFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) override
+ {
+ const wchar_t *theType(Convert0(inType));
+ const wchar_t *theId(Convert1(inId));
+ const wchar_t *theName(Convert2(inName));
+ if (m_IdToHandleMap.find(theId) != m_IdToHandleMap.end())
+ return true;
+
+ Qt3DSDMInstanceHandle theMaster = CreateAndDeriveInstance(theType, theId);
+ if (!theMaster.Valid())
+ return false;
+ NVScopedRefCounted<IRefCountedInputStream> theStream(
+ m_InputStreamFactory.GetStreamForFile(inSourcePath));
+ if (theStream) {
+ std::vector<SMetaDataLoadWarning> warnings;
+ bool success = m_NewMetaData->LoadEffectXMLFromSourcePath(
+ inSourcePath, theMaster, theName, warnings, *theStream);
+ (void)success;
+ QT3DS_ASSERT(success);
+ return success;
+ }
+ return false;
+ }
+
+ bool LoadMaterialXMLFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) override
+ {
+ const wchar_t *theType(Convert0(inType));
+ const wchar_t *theId(Convert1(inId));
+ const wchar_t *theName(Convert2(inName));
+ (void)theName;
+ if (m_IdToHandleMap.find(theId) != m_IdToHandleMap.end())
+ return true;
+
+ Qt3DSDMInstanceHandle theMaster = CreateAndDeriveInstance(theType, theId);
+ if (!theMaster.Valid())
+ return false;
+
+ NVScopedRefCounted<IRefCountedInputStream> theStream(
+ m_InputStreamFactory.GetStreamForFile(inSourcePath));
+ if (theStream) {
+ std::vector<SMetaDataLoadWarning> warnings;
+ bool success = m_NewMetaData->LoadMaterialClassFromSourcePath(
+ inSourcePath, theMaster, theId, warnings, *theStream);
+ (void)success;
+ QT3DS_ASSERT(success);
+ return success;
+ }
+ return false;
+ }
+
+ struct PluginErrorHandler : public qt3dsdm::CXmlErrorHandler
+ {
+ void OnXmlError(const QString &, int, int) override {}
+ };
+
+ bool LoadPluginXMLFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) override
+ {
+ const wchar_t *theType(Convert0(inType));
+ const wchar_t *theId(Convert1(inId));
+ const wchar_t *theName(Convert2(inName));
+ if (m_IdToHandleMap.find(theId) != m_IdToHandleMap.end())
+ return true;
+
+ Qt3DSDMInstanceHandle theMaster = CreateAndDeriveInstance(theType, theId);
+ if (!theMaster.Valid())
+ return false;
+
+ std::shared_ptr<qt3dsdm::IDOMFactory> theFactory =
+ qt3dsdm::IDOMFactory::CreateDOMFactory(m_StrTable);
+
+ PluginErrorHandler dummyHandler;
+ std::shared_ptr<qt3dsdm::IDOMReader> theReader = Q3DStudio::CRenderPluginParser::ParseFile(
+ theFactory, m_StrTable, inSourcePath, dummyHandler, m_InputStreamFactory);
+ if (theReader) {
+ Q3DStudio::CRenderPluginParser::NavigateToMetadata(theReader);
+ std::vector<SMetaDataLoadWarning> theWarnings;
+ m_NewMetaData->LoadInstance(*theReader, theMaster, theName, theWarnings);
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(theMaster, L"name");
+ m_DataCore->SetInstancePropertyValue(theMaster, theProperty,
+ std::make_shared<CDataStr>(theName));
+ return true;
+ }
+ return false;
+ }
+
+ Option<qt3dsdm::SMetaDataEffect> GetEffectMetaDataBySourcePath(const char *inName) override
+ {
+ return m_NewMetaData->GetEffectBySourcePath(inName);
+ }
+
+ virtual Option<qt3dsdm::SMetaDataCustomMaterial>
+ GetMaterialMetaDataBySourcePath(const char *inName) override
+ {
+ return m_NewMetaData->GetMaterialBySourcePath(inName);
+ }
+
+ virtual void GetInstanceProperties(const wchar_t *inType, const wchar_t *inId,
+ eastl::vector<TRuntimeMetaDataStrType> &outProperties,
+ bool inSearchParent)
+ {
+ // Get the instance handle given the type or id
+ Qt3DSDMInstanceHandle theInstance =
+ IsTrivial(inId) ? GetInstanceForType(inType) : GetInstanceById(inId);
+ if (!theInstance.Valid()) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ vector<Qt3DSDMMetaDataPropertyHandle> theProperties;
+ if (inSearchParent)
+ // Get the meta data properties defined on this object or its derivation parents
+ m_NewMetaData->GetMetaDataProperties(theInstance, theProperties);
+ else
+ // Get the meta data properties defined on *only* this object, don't search parents
+ m_NewMetaData->GetSpecificMetaDataProperties(theInstance, theProperties);
+
+ outProperties.clear();
+ // Iterate each property and fill outProperties
+ for (size_t propIdx = 0, propEnd = theProperties.size(); propIdx < propEnd; ++propIdx) {
+ SMetaDataPropertyInfo theInfo(
+ m_NewMetaData->GetMetaDataPropertyInfo(theProperties[propIdx]));
+ outProperties.push_back(TRuntimeMetaDataStrType());
+ qt3ds::foundation::ConvertUTF(theInfo.m_Name.c_str(), 0, outProperties.back());
+ }
+ }
+
+ void GetInstanceProperties(const char *inType, const char *inId,
+ eastl::vector<TRuntimeMetaDataStrType> &outProperties,
+ bool inSearchParent) override
+ {
+ GetInstanceProperties(Convert0(inType), Convert2(inId), outProperties, inSearchParent);
+ }
+
+ std::shared_ptr<qt3dsdm::IStringTable> GetStringTable() override { return m_StrTable; }
+
+ TStrTableStr Register(const char *inStr) override
+ {
+ return m_StrTable->GetRenderStringTable().RegisterStr(inStr);
+ }
+
+ //==============================================================================
+ /**
+ * @Self release
+ */
+ void release() override { delete this; }
+
+ void ClearPerProjectData() override
+ {
+
+ m_IdToHandleMap.clear();
+ m_PropertyLookupHash.clear();
+ }
+
+}; // end of struct SRuntimeMetaDataImpl
+}
+
+IRuntimeMetaData &IRuntimeMetaData::Create(IInputStreamFactory &inInputStreamFactory)
+{
+ SRuntimeMetaDataImpl &retval = *new SRuntimeMetaDataImpl(inInputStreamFactory);
+ retval.Load();
+ return retval;
+}
diff --git a/src/datamodel/Qt3DSMetadata.h b/src/datamodel/Qt3DSMetadata.h
new file mode 100644
index 0000000..1efe748
--- /dev/null
+++ b/src/datamodel/Qt3DSMetadata.h
@@ -0,0 +1,386 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSVec4.h"
+#include <EASTL/string.h>
+#include <EASTL/vector.h>
+#include "foundation/StringTable.h"
+#include <memory>
+
+namespace qt3ds {
+namespace foundation {
+}
+}
+
+namespace qt3dsdm {
+class IStringTable;
+struct SMetaDataEffect;
+struct SMetaDataCustomMaterial;
+}
+
+namespace qt3ds {
+namespace render {
+ class IInputStreamFactory;
+}
+}
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+using namespace qt3ds::foundation;
+
+//==============================================================================
+// Redifinition of qt3dsdm::DataModelDataType::Value
+//==============================================================================
+enum ERuntimeDataModelDataType {
+ ERuntimeDataModelDataTypeNone,
+ ERuntimeDataModelDataTypeFloat,
+ ERuntimeDataModelDataTypeFloat2,
+ ERuntimeDataModelDataTypeFloat3,
+ ERuntimeDataModelDataTypeFloat4,
+ ERuntimeDataModelDataTypeLong,
+ ERuntimeDataModelDataTypeString,
+ ERuntimeDataModelDataTypeBool,
+ ERuntimeDataModelDataTypeLong4,
+ ERuntimeDataModelDataTypeStringRef,
+ ERuntimeDataModelDataTypeObjectRef,
+ ERuntimeDataModelDataTypeStringOrInt,
+};
+
+//==============================================================================
+// Redifinition of qt3dsdm::AdditionalMetaDataType
+//==============================================================================
+enum ERuntimeAdditionalMetaDataType {
+ ERuntimeAdditionalMetaDataTypeNone,
+ ERuntimeAdditionalMetaDataTypeStringList,
+ ERuntimeAdditionalMetaDataTypeRange,
+ ERuntimeAdditionalMetaDataTypeImage,
+ ERuntimeAdditionalMetaDataTypeColor,
+ ERuntimeAdditionalMetaDataTypeRotation,
+ ERuntimeAdditionalMetaDataTypeFont,
+ ERuntimeAdditionalMetaDataTypeFontSize,
+ ERuntimeAdditionalMetaDataTypeMultiLine,
+ ERuntimeAdditionalMetaDataTypeObjectRef,
+ ERuntimeAdditionalMetaDataTypeMesh,
+ ERuntimeAdditionalMetaDataTypeImport,
+ ERuntimeAdditionalMetaDataTypeTexture,
+ ERuntimeAdditionalMetaDataTypeRenderable,
+ ERuntimeAdditionalMetaDataTypePathBuffer,
+ ERuntimeAdditionalMetaDataTypeShadowMapResolution,
+ ERuntimeAdditionalMetaDataTypeString,
+};
+
+typedef eastl::basic_string<char8_t> TRuntimeMetaDataStrType;
+typedef qt3ds::foundation::CRegisteredString TStrTableStr;
+
+struct SAttOrArg
+{
+ TRuntimeMetaDataStrType m_Name;
+ TRuntimeMetaDataStrType m_FormalName;
+ ERuntimeDataModelDataType m_DataType;
+ ERuntimeAdditionalMetaDataType m_MetaType;
+ eastl::vector<TRuntimeMetaDataStrType> m_MetaDataList;
+ eastl::pair<float, float> m_MetaDataRange;
+};
+
+typedef eastl::vector<SAttOrArg> TAttOrArgList;
+struct SHandler
+{
+ TRuntimeMetaDataStrType m_Name;
+ TRuntimeMetaDataStrType m_FormalName;
+ TAttOrArgList m_Arguments;
+};
+
+typedef eastl::vector<SHandler> THandlerList;
+
+struct SVisualEvent
+{
+ TRuntimeMetaDataStrType m_Name;
+ TRuntimeMetaDataStrType m_FormalName;
+};
+
+typedef eastl::vector<SVisualEvent> TVisualEventList;
+
+struct SElementInfo
+{
+ TRuntimeMetaDataStrType m_ClassName;
+ bool m_IsComponent;
+ TAttOrArgList m_Attributes;
+};
+
+//==============================================================================
+/**
+ * @class IRuntimeMetaData
+ * @brief Declare interfaces for querying meta data values
+ */
+class QT3DS_AUTOTEST_EXPORT IRuntimeMetaData : public NVReleasable
+{
+
+public:
+ static const char *GetMetaDataDirectory()
+ {
+ return ":/res/DataModelMetadata/en-us/MetaData.xml";
+ }
+ //==============================================================================
+ /**
+ * Check if a property for the specified type or id exists
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value type
+ */
+ virtual bool IsPropertyExist(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get property value type
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value type
+ */
+ virtual ERuntimeDataModelDataType GetPropertyType(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get additional metadata type
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property meta data type
+ */
+ virtual ERuntimeAdditionalMetaDataType
+ GetAdditionalType(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get property value as float
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value
+ */
+ virtual Option<float> GetPropertyValueFloat(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get property value as QT3DSVec2
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value
+ */
+ virtual Option<qt3ds::QT3DSVec2> GetPropertyValueVector2(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get property value as QT3DSVec3
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value
+ */
+ virtual Option<qt3ds::QT3DSVec3> GetPropertyValueVector3(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ virtual Option<qt3ds::QT3DSVec4> GetPropertyValueVector4(TStrTableStr inType,
+ TStrTableStr inProperty, TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get property value as long
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value
+ */
+ virtual Option<qt3ds::QT3DSI32> GetPropertyValueLong(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get property value as string
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value
+ */
+ virtual Option<TRuntimeMetaDataStrType>
+ GetPropertyValueString(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get object ref property value as string
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value
+ */
+ virtual Option<TRuntimeMetaDataStrType>
+ GetPropertyValueObjectRef(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get property value as bool
+ * @param inType default object type
+ * @param inProperty the property to query
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param return property value
+ */
+ virtual Option<bool> GetPropertyValueBool(TStrTableStr inType, TStrTableStr inProperty,
+ TStrTableStr inId = TStrTableStr()) = 0;
+
+ //==============================================================================
+ /**
+ * Get references
+ * @param inType default object type
+ * @param outReferences References of the object
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ */
+ virtual void GetReferences(const char *inType,
+ eastl::vector<TRuntimeMetaDataStrType> &outReferences,
+ const char *inId = NULL) = 0;
+
+ //==============================================================================
+ /**
+ * Check if the property is custom or built in (canonical)
+ * @param inId object id
+ * @param inProperty the property to query
+ */
+ virtual bool IsCustomProperty(const char *inId, const char *inProperty) = 0;
+
+ //==============================================================================
+ /**
+ * Check if the handle is custom or built in (canonical)
+ * @param inId object id
+ * @param inHandlerName the handler name
+ */
+ virtual bool IsCustomHandler(const char *inId, const char *inHandlerName) = 0;
+
+ virtual THandlerList GetCustomHandlers(const char *inId) = 0;
+
+ virtual TVisualEventList GetVisualEvents(const char *inId) = 0;
+
+ virtual SElementInfo LoadElement(const char *clsName, const char *clsRef, const char *inId) = 0;
+
+ virtual TAttOrArgList GetSlideAttributes() = 0;
+
+ //==============================================================================
+ /**
+ * Get the data type and additional type of the custom handler
+ * @param inId object id
+ * @param inHandlerName the handler name
+ * @param inArgumentName the handler argument name
+ * @param outType the type
+ * @param outAdditionalType the additional type
+ */
+ virtual void GetHandlerArgumentType(const char *inId, const char *inHandlerName,
+ const char *inArgumentName,
+ ERuntimeDataModelDataType &outType,
+ ERuntimeAdditionalMetaDataType &outAdditionalType) = 0;
+
+ //==============================================================================
+ /**
+ * Get properties of the object with the given id, with the option of searching the parent or
+ *only specific to this object.
+ * @param inType default object type
+ * @param inId object id. if this value is not trivial, the query is based on inId
+ *instead of inType
+ * @param outProperties the list of property names
+ * @param inSearchParent if true, get the properties defined on the object or its derivation
+ *parents
+ * else, get only the properties defined on the object, not properties
+ *derived from the parent.
+ */
+ virtual void GetInstanceProperties(const char *inType, const char *inId,
+ eastl::vector<TRuntimeMetaDataStrType> &outProperties,
+ bool inSearchParent) = 0;
+
+ virtual bool LoadScriptFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) = 0;
+
+ virtual bool LoadEffectXMLFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) = 0;
+
+ virtual bool LoadMaterialXMLFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) = 0;
+
+ virtual bool LoadPluginXMLFile(const char *inType, const char *inId, const char *inName,
+ const char *inSourcePath) = 0;
+
+ virtual Option<qt3dsdm::SMetaDataEffect> GetEffectMetaDataBySourcePath(const char *inName) = 0;
+
+ virtual Option<qt3dsdm::SMetaDataCustomMaterial>
+ GetMaterialMetaDataBySourcePath(const char *inSourcePath) = 0;
+
+ virtual std::shared_ptr<qt3dsdm::IStringTable> GetStringTable() = 0;
+
+ virtual TStrTableStr Register(const char *inStr) = 0;
+
+ // Clear data that affects project loading (mainly id->instance map)
+ virtual void ClearPerProjectData() = 0;
+
+public:
+ //==============================================================================
+ /**
+ * Creation function creates an object implements the IRuntimeMetaData interface
+ * This takes an input stream factory because on android the metadata is installed
+ * in the APK file, so we don't have exact access to it on the filesystem.
+ */
+ static IRuntimeMetaData &Create(qt3ds::render::IInputStreamFactory &inInputStreamFactory);
+};
+
+} // namespace Q3DStudio
diff --git a/src/dm/EASTL_new.cpp b/src/dm/EASTL_new.cpp
new file mode 100644
index 0000000..1ca308e
--- /dev/null
+++ b/src/dm/EASTL_new.cpp
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "EASTL/allocator.h"
+
+void *operator new[](size_t size, const char *, int, unsigned, const char *, int)
+{
+ return malloc(size);
+}
+
+void *operator new[](size_t size, size_t, size_t, const char *, int, unsigned, const char *, int)
+{
+ return malloc(size);
+}
diff --git a/src/dm/Qt3DSDMPrefix.h b/src/dm/Qt3DSDMPrefix.h
new file mode 100644
index 0000000..4164d64
--- /dev/null
+++ b/src/dm/Qt3DSDMPrefix.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifdef __cplusplus
+#pragma once
+
+#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
+#define _WIN32_WINNT \
+ 0x0501 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+// TODO: reference additional headers your program requires here
+#if defined(WIN32) && defined(MSVC)
+#pragma warning(push)
+#pragma warning(disable : 4100)
+#pragma warning(disable : 4512)
+#pragma warning(disable : 4702)
+#pragma warning(disable : 4996)
+#endif
+
+// std includes
+#include <map>
+#include <vector>
+#include <string>
+#include <exception>
+#include <set>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <memory>
+#include <functional>
+
+// Project includes
+#include "StandardExtensions.h"
+
+namespace qt3dsdm {
+using std::ref;
+using std::get;
+using std::bind;
+using std::tuple;
+using std::static_pointer_cast;
+using std::make_pair;
+using std::equal_to;
+using std::vector;
+using std::make_tuple;
+using std::function;
+using std::shared_ptr;
+using std::make_shared;
+}
+#if defined(WIN32) && defined(MSVC)
+#pragma warning(pop)
+#endif
+#endif
diff --git a/src/dm/dm.pro b/src/dm/dm.pro
new file mode 100644
index 0000000..2e57f30
--- /dev/null
+++ b/src/dm/dm.pro
@@ -0,0 +1,58 @@
+TEMPLATE = lib
+TARGET = QT3DSDM
+CONFIG += staticlib
+include(../commoninclude.pri)
+
+DEFINES += QT3DS_AUTHORING _AFXDLL PCRE_STATIC _UNICODE
+
+linux {
+ DEFINES += QT3DSDM_META_DATA_NO_SIGNALS
+}
+
+INCLUDEPATH += \
+ \
+ systems \
+ systems/cores \
+ ../system \
+ ../foundation \
+ ../runtimerender \
+ ../datamodel \
+ ../render \
+ ../3rdparty/EASTL/UnknownVersion/include \
+ ../3rdparty/color \
+
+PRECOMPILED_HEADER = Qt3DSDMPrefix.h
+
+SOURCES += \
+ EASTL_new.cpp \
+ systems/ActionSystem.cpp \
+ systems/SignalsImpl.cpp \
+ systems/SlideSystem.cpp \
+ systems/StudioAnimationSystem.cpp \
+ systems/StudioCoreSystem.cpp \
+ systems/StudioFullSystem.cpp \
+ systems/StudioPropertySystem.cpp \
+ systems/Qt3DSDMComposerTypeDefinitions.cpp \
+ systems/Qt3DSDMGuides.cpp \
+ systems/Qt3DSDMMetaData.cpp \
+ systems/Qt3DSDMSignalSystem.cpp \
+ systems/Qt3DSDMStringTable.cpp \
+ systems/Qt3DSDMValue.cpp \
+ systems/Qt3DSDMXML.cpp \
+ systems/cores/ActionCoreProducer.cpp \
+ systems/cores/AnimationCoreProducer.cpp \
+ systems/cores/DataCoreProducer.cpp \
+ systems/cores/SimpleActionCore.cpp \
+ systems/cores/SimpleAnimationCore.cpp \
+ systems/cores/SimpleDataCore.cpp \
+ systems/cores/SimpleSlideCore.cpp \
+ systems/cores/SimpleSlideGraphCore.cpp \
+ systems/cores/SlideCoreProducer.cpp \
+ systems/cores/SlideGraphCoreProducer.cpp \
+
+HEADERS += \
+ systems/Qt3DSDMDataTypes.h \
+ systems/Qt3DSDMMetaDataTypes.h \
+ systems/Qt3DSDMMetaDataValue.h \
+ systems/Qt3DSDMMetaData.h \
+ systems/Qt3DSDMWStrOpsImpl.h
diff --git a/src/dm/systems/ActionSystem.cpp b/src/dm/systems/ActionSystem.cpp
new file mode 100644
index 0000000..fbd2593
--- /dev/null
+++ b/src/dm/systems/ActionSystem.cpp
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "ActionSystem.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+CActionSystem::CActionSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore,
+ TSlideGraphCorePtr inSlideGraphCore, TActionCorePtr inActionCore,
+ TSlideSystemPtr inSlideSystem, Qt3DSDMInstanceHandle inActionInstance,
+ Qt3DSDMPropertyHandle inActionEyeball)
+ : m_DataCore(inDataCore)
+ , m_SlideCore(inSlideCore)
+ , m_SlideGraphCore(inSlideGraphCore)
+ , m_ActionCore(inActionCore)
+ , m_SlideSystem(inSlideSystem)
+ , m_ActionInstance(inActionInstance)
+ , m_ActionEyeball(inActionEyeball)
+{
+ m_Signaller = CreateActionSystemSignaller();
+}
+
+Qt3DSDMActionHandle CActionSystem::CreateAction(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner,
+ SLong4 inTriggerTargetObjects)
+{
+ Q_ASSERT(inSlide.Valid() && inOwner.Valid());
+
+ // Create Action instance handle that derives from Action instance
+ Qt3DSDMInstanceHandle theActionInstance = m_DataCore->CreateInstance();
+ m_DataCore->DeriveInstance(theActionInstance, m_ActionInstance);
+
+ // Associate Action instance handle with Slide
+ m_SlideSystem->AssociateInstanceWithSlide(inSlide, theActionInstance);
+
+ // Unlink the eyeball property because Action can be eyeballed-on/off per-slide
+ m_SlideSystem->UnlinkProperty(theActionInstance, m_ActionEyeball);
+
+ // Create the Action handle
+ Qt3DSDMActionHandle retval =
+ m_ActionCore->CreateAction(theActionInstance, inSlide, inOwner, inTriggerTargetObjects);
+
+ GetSignalSender()->SendActionCreated(retval, inSlide, inOwner);
+ return retval;
+}
+
+void CActionSystem::DeleteAction(Qt3DSDMActionHandle inAction)
+{
+ Qt3DSDMInstanceHandle theActionInstance;
+ SActionInfo theActionInfo = m_ActionCore->GetActionInfo(inAction);
+ m_ActionCore->DeleteAction(inAction, theActionInstance);
+ m_DataCore->DeleteInstance(theActionInstance);
+ GetSignalSender()->SendActionDeleted(inAction, theActionInfo.m_Slide, theActionInfo.m_Owner);
+}
+
+void CActionSystem::GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const
+{
+ // Get all actions that exist in inSlide
+ m_ActionCore->GetActions(inSlide, inOwner, outActions);
+
+ // if inSlide is not master, get all actions that exist in master slide
+ Qt3DSDMSlideHandle theMaster = m_SlideSystem->GetMasterSlide(inSlide);
+ if (theMaster != inSlide) {
+ TActionHandleList theMasterActions;
+ m_ActionCore->GetActions(theMaster, inOwner, theMasterActions);
+ outActions.insert(outActions.end(), theMasterActions.begin(), theMasterActions.end());
+ sort(outActions.begin(), outActions.end());
+ }
+}
+
+bool CActionSystem::GetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide,
+ Qt3DSDMActionHandle inAction) const
+{
+ SValue theValue;
+ Qt3DSDMInstanceHandle theInstance = m_ActionCore->GetActionInstance(inAction);
+ // Get the eyeball property value from SlideCore. There is no animation on eyeball so we can
+ // query SlideCore directly.
+ m_SlideCore->GetInstancePropertyValue(inActiveSlide, theInstance, m_ActionEyeball, theValue);
+ if (m_SlideCore->IsSlide(inActiveSlide))
+ return qt3dsdm::get<bool>(theValue);
+ return false;
+}
+
+void CActionSystem::SetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide,
+ Qt3DSDMActionHandle inAction, bool inValue)
+{
+ Qt3DSDMInstanceHandle theInstance = m_ActionCore->GetActionInstance(inAction);
+ // Set the eyeball property value to SlideCore.
+ m_SlideCore->ForceSetInstancePropertyValue(inActiveSlide, theInstance, m_ActionEyeball,
+ inValue);
+}
+
+IActionSystemSignalProvider *CActionSystem::GetSignalProvider()
+{
+ return dynamic_cast<IActionSystemSignalProvider *>(m_Signaller.get());
+}
+
+IActionSystemSignalSender *CActionSystem::GetSignalSender()
+{
+ return dynamic_cast<IActionSystemSignalSender *>(m_Signaller.get());
+}
+}
diff --git a/src/dm/systems/ActionSystem.h b/src/dm/systems/ActionSystem.h
new file mode 100644
index 0000000..fea9894
--- /dev/null
+++ b/src/dm/systems/ActionSystem.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef ACTIONSYSTEMH
+#define ACTIONSYSTEMH
+#include "Qt3DSDMActionSystem.h"
+#include "Qt3DSDMActionCore.h"
+#include "Qt3DSDMDataCore.h"
+#include "Qt3DSDMSlideCore.h"
+#include "Qt3DSDMSlideGraphCore.h"
+#include "Qt3DSDMSlides.h"
+#include "Qt3DSDMTransactions.h"
+#include "SignalsImpl.h"
+
+namespace qt3dsdm {
+
+class CActionSystem : public IActionSystem
+{
+ TDataCorePtr m_DataCore;
+ TSlideCorePtr m_SlideCore;
+ TSlideGraphCorePtr m_SlideGraphCore;
+ TActionCorePtr m_ActionCore;
+
+ TSlideSystemPtr m_SlideSystem;
+
+ Qt3DSDMInstanceHandle m_ActionInstance;
+ Qt3DSDMPropertyHandle m_ActionEyeball;
+
+ std::shared_ptr<ISignalItem> m_Signaller;
+
+public:
+ CActionSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore,
+ TSlideGraphCorePtr inSlideGraphCore, TActionCorePtr inActionCore,
+ TSlideSystemPtr inSlideSystem, Qt3DSDMInstanceHandle inActionInstance,
+ Qt3DSDMPropertyHandle inActionEyeball);
+
+ Qt3DSDMActionHandle CreateAction(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ SLong4 inTriggerTargetObjects) override;
+ void DeleteAction(Qt3DSDMActionHandle inAction) override;
+ void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const override;
+
+ bool GetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide,
+ Qt3DSDMActionHandle inAction) const override;
+ void SetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, Qt3DSDMActionHandle inAction,
+ bool inValue) override;
+
+ virtual IActionSystemSignalProvider *GetSignalProvider();
+
+private:
+ virtual IActionSystemSignalSender *GetSignalSender();
+
+ CActionSystem(const CActionSystem&) = delete;
+ CActionSystem& operator=(const CActionSystem&) = delete;
+};
+}
+
+#endif
diff --git a/src/dm/systems/HandleSystemBase.h b/src/dm/systems/HandleSystemBase.h
new file mode 100644
index 0000000..cb8e0f6
--- /dev/null
+++ b/src/dm/systems/HandleSystemBase.h
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef HANDLESYSTEMIMPLH
+#define HANDLESYSTEMIMPLH
+
+#include <unordered_map>
+
+namespace qt3dsdm {
+
+class CHandleObject
+{
+public:
+ // Type of CHandleObject
+ // Each subclass needs to specify what type it is
+ // This is used to avoid dynamic_cast (RTTI) which is expensive
+ enum EHandleObjectType {
+ EHandleObjectTypeUnknown = 0,
+ EHandleObjectTypeCDataModelInstance,
+ EHandleObjectTypeCDataModelPropertyDefinitionObject,
+ EHandleObjectTypeSAnimationTrack,
+ EHandleObjectTypeSKeyframe,
+ EHandleObjectTypeSSlide,
+ EHandleObjectTypeSSlideGraph,
+ EHandleObjectTypeAction,
+ EHandleObjectTypeActionHandlerArgument,
+ EHandleObjectTypeCustomProperty,
+ EHandleObjectTypeEvent,
+ EHandleObjectTypeCustomHandler,
+ EHandleObjectTypeHandlerParam,
+ EHandleObjectTypeEnd,
+ };
+
+ CHandleObject(int inHandle = 0)
+ : m_Handle(inHandle)
+ {
+ }
+ virtual ~CHandleObject() {}
+
+ virtual EHandleObjectType GetType() = 0;
+
+ int m_Handle;
+
+private: //noncopyable
+ CHandleObject(const CHandleObject&) = delete;
+ CHandleObject& operator=(const CHandleObject&) = delete;
+
+};
+
+typedef std::shared_ptr<CHandleObject> THandleObjectPtr;
+
+// Note that maps don't need to copy their objects.
+typedef std::unordered_map<int, THandleObjectPtr> THandleObjectMap;
+typedef std::pair<int, THandleObjectPtr> THandleObjectPair;
+
+class IHandleBase
+{
+public:
+ /**
+ * Check whether a given handle exists
+ */
+ virtual bool HandleValid(int inHandle) const = 0;
+};
+
+struct CHandleBase : public IHandleBase
+{
+ THandleObjectMap m_Objects;
+ int m_NextId;
+
+ CHandleBase()
+ : m_NextId(1)
+ {
+ }
+ CHandleBase(const CHandleBase &inOther)
+ : m_Objects(inOther.m_Objects)
+ , m_NextId(inOther.m_NextId)
+ {
+ }
+
+ CHandleBase &operator=(const CHandleBase &inOther)
+ {
+ m_Objects = inOther.m_Objects;
+ m_NextId = inOther.m_NextId;
+ return *this;
+ }
+
+ // IHandleBase
+ bool HandleValid(int inHandle) const override
+ {
+ return m_Objects.find(inHandle) != m_Objects.end();
+ }
+
+ template <typename T>
+ static inline bool HandleObjectValid(int inHandle, const THandleObjectMap &inMap)
+ {
+ THandleObjectMap::const_iterator theIter = inMap.find(inHandle);
+ if (theIter != inMap.end()) {
+ if (theIter->second->GetType() == T::s_Type)
+ return true;
+ }
+ return false;
+ }
+
+ template <typename T>
+ static inline const T *GetHandleObject(int inHandle, const THandleObjectMap &inMap)
+ {
+ THandleObjectMap::const_iterator theIter = inMap.find(inHandle);
+ if (theIter != inMap.end()) {
+ if (theIter->second->GetType() == T::s_Type)
+ return static_cast<const T *>(theIter->second.get());
+ }
+ return NULL;
+ }
+
+ template <typename ObjectType, typename HandleType>
+ static inline void MaybeAddObject(const std::pair<int, THandleObjectPtr> &inItem,
+ std::vector<HandleType> &outHandles)
+ {
+ if (inItem.second->GetType() == ObjectType::s_Type)
+ outHandles.push_back(HandleType(inItem.first));
+ }
+
+ static void EraseHandle(int inHandle, THandleObjectMap &inObjects)
+ {
+ THandleObjectMap::iterator theFind = inObjects.find(inHandle);
+ if (theFind != inObjects.end())
+ inObjects.erase(theFind);
+ }
+
+ // Return the next unused id. There are no guarantees whether positive or negative; what this
+ // will
+ // guarantee is that it isn't currently used in the object map and it is non-zero.
+ int GetNextId()
+ {
+ do {
+ ++m_NextId;
+ } while (m_Objects.find(m_NextId) != m_Objects.end());
+ return m_NextId;
+ }
+};
+}
+
+#endif
diff --git a/src/dm/systems/HandleSystemTransactions.h b/src/dm/systems/HandleSystemTransactions.h
new file mode 100644
index 0000000..9d77884
--- /dev/null
+++ b/src/dm/systems/HandleSystemTransactions.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef HANDLESYSTEMTRANSACTIONSH
+#define HANDLESYSTEMTRANSACTIONSH
+#include "HandleSystemBase.h"
+#include "Qt3DSDMTransactions.h"
+
+namespace qt3dsdm {
+inline void InsertItemInMap(THandleObjectMap &inObjects,
+ const std::pair<int, THandleObjectPtr> &inItem)
+{
+ inObjects.insert(inItem);
+}
+inline void HandleCreateTransaction(const char *inFile, int inLine, int inHandle,
+ THandleObjectMap &inObjects,
+ TTransactionConsumerPtr &inConsumer)
+{
+ std::pair<int, THandleObjectPtr> theEntry = *inObjects.find(inHandle);
+ std::function<void()> doOp(std::bind(InsertItemInMap, std::ref(inObjects), theEntry));
+ std::function<void()> undoOp(
+ std::bind(CHandleBase::EraseHandle, inHandle, std::ref(inObjects)));
+ TTransactionPtr theTransaction(DoCreateGenericTransaction(inFile, inLine, doOp, undoOp));
+ inConsumer->OnTransaction(theTransaction);
+}
+
+inline void HandleDeleteTransaction(const char *inFile, int inLine, int inHandle,
+ THandleObjectMap &inObjects,
+ TTransactionConsumerPtr &inConsumer)
+{
+ using namespace std;
+ pair<int, THandleObjectPtr> theEntry = *inObjects.find(inHandle);
+ TTransactionPtr theTransaction(DoCreateGenericTransaction(
+ inFile, inLine, std::bind(CHandleBase::EraseHandle, inHandle, std::ref(inObjects)),
+ std::bind(InsertItemInMap, std::ref(inObjects), theEntry)));
+ inConsumer->OnTransaction(theTransaction);
+}
+
+inline void DoCreateHandleCreateTransaction(const char *inFile, int inLine,
+ TTransactionConsumerPtr inConsumer, int inHandle,
+ THandleObjectMap &inObjects)
+{
+ RunWithConsumer(inConsumer, std::bind(HandleCreateTransaction, inFile, inLine, inHandle,
+ std::ref(inObjects), std::placeholders::_1));
+}
+
+#define CREATE_HANDLE_CREATE_TRANSACTION(inConsumer, inHandle, inObjects) \
+ DoCreateHandleCreateTransaction(__FILE__, __LINE__, inConsumer, inHandle, inObjects);
+
+inline void DoCreateHandleDeleteTransaction(const char *inFile, int inLine,
+ TTransactionConsumerPtr inConsumer, int inHandle,
+ THandleObjectMap &inObjects)
+{
+ RunWithConsumer(inConsumer, std::bind(HandleDeleteTransaction, inFile, inLine, inHandle,
+ std::ref(inObjects), std::placeholders::_1));
+}
+
+#define CREATE_HANDLE_DELETE_TRANSACTION(inConsumer, inHandle, inObjects) \
+ DoCreateHandleDeleteTransaction(__FILE__, __LINE__, inConsumer, inHandle, inObjects);
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMActionCore.h b/src/dm/systems/Qt3DSDMActionCore.h
new file mode 100644
index 0000000..a920146
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMActionCore.h
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_ACTION_CORE_H
+#define QT3DSDM_ACTION_CORE_H
+
+#include "Qt3DSDMHandles.h"
+#include "HandleSystemBase.h"
+#include "Qt3DSDMActionInfo.h"
+
+namespace qt3dsdm {
+const long REFERENCED_AS_OWNER = 0x01;
+const long REFERENCED_AS_TRIGGER = 0x02;
+const long REFERENCED_AS_TARGET = 0x04;
+class IStringTable;
+
+/**
+ * ActionCore
+ */
+class IActionCore : public IHandleBase
+{
+public:
+ virtual ~IActionCore() {}
+
+ virtual TStringTablePtr GetStringTablePtr() const = 0;
+ virtual IStringTable &GetStringTable() const = 0;
+ // Action
+ virtual Qt3DSDMActionHandle CreateAction(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ SLong4 inTriggerTargetObjects) = 0;
+ virtual void DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance) = 0;
+ virtual const SActionInfo &GetActionInfo(Qt3DSDMActionHandle inAction) const = 0;
+ virtual void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const = 0;
+ virtual void GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const = 0;
+ virtual void GetActions(Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions) const = 0;
+ virtual void GetActions(TActionHandleList &outActions) const = 0;
+
+ // Return the instance that was allocated for this action.
+ virtual Qt3DSDMInstanceHandle GetActionInstance(Qt3DSDMActionHandle inAction) const = 0;
+ // Reverse lookup into the action system so you can match actions to instances.
+ virtual Qt3DSDMActionHandle GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const = 0;
+
+ // Action Properties
+ virtual void SetTriggerObject(Qt3DSDMActionHandle inAction,
+ const SObjectRefType &inTriggerObject) = 0;
+ virtual void SetTargetObject(Qt3DSDMActionHandle inAction,
+ const SObjectRefType &inTargetObject) = 0;
+ virtual void SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventName) = 0;
+ virtual void SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerName) = 0;
+
+ // Handler Argument
+ virtual Qt3DSDMHandlerArgHandle AddHandlerArgument(Qt3DSDMActionHandle inAction,
+ const TCharStr &inName,
+ HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType) = 0;
+ virtual void RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) = 0;
+ virtual const SHandlerArgumentInfo &
+ GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const = 0;
+ virtual void GetHandlerArguments(Qt3DSDMActionHandle inAction,
+ THandlerArgHandleList &outHandlerArguments) const = 0;
+
+ // Handler Argument Properties
+ virtual void GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ SValue &outValue) const = 0;
+ virtual void SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const SValue &inValue) = 0;
+};
+
+typedef std::shared_ptr<IActionCore> TActionCorePtr;
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMActionInfo.h b/src/dm/systems/Qt3DSDMActionInfo.h
new file mode 100644
index 0000000..40fd964
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMActionInfo.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_ACTION_INFO_H
+#define QT3DSDM_ACTION_INFO_H
+
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMMetaDataTypes.h"
+
+namespace qt3dsdm {
+using std::wstring;
+struct SActionInfo
+{
+ // InstanceHandle corresponding to this action (to store other properties not listed here)
+ Qt3DSDMInstanceHandle m_Instance;
+
+ // Where the action is added to
+ Qt3DSDMSlideHandle m_Slide; // the slide that the action is added to
+ Qt3DSDMInstanceHandle
+ m_Owner; // the object that the action is added to (the owner of the action)
+
+ // Trigger object
+ SObjectRefType m_TriggerObject; // trigger object
+ wstring m_Event; // the list of applicable events is based on object type and stored, by type,
+ // in metadata
+
+ // Target object
+ SObjectRefType m_TargetObject; // target object
+ wstring m_Handler; // the list of applicable action handlers is loaded from metadata xml file
+ // and based on object type
+ THandlerArgHandleList m_HandlerArgs; // the list of applicable action arguments is dependent on
+ // the handler and loaded from the metadata xml file.
+
+ SActionInfo() {}
+
+ SActionInfo(Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner)
+ : m_Instance(inInstance)
+ , m_Slide(inSlide)
+ , m_Owner(inOwner)
+ {
+ }
+};
+
+struct SHandlerArgumentInfo
+{
+ Qt3DSDMActionHandle m_Action; // Action that owns this Action Argument
+ TCharStr m_Name; // Name of the Action Argument
+ HandlerArgumentType::Value m_ArgType; // m_ArgType will override m_ValueType
+ DataModelDataType::Value m_ValueType; // m_ValueType is ignored if ArgType is specified
+ SValue m_Value; // Value of the Action Argument
+
+ SHandlerArgumentInfo()
+ : m_ArgType(HandlerArgumentType::None)
+ , m_ValueType(DataModelDataType::None)
+ {
+ }
+
+ SHandlerArgumentInfo(Qt3DSDMActionHandle inAction, const TCharStr &inName,
+ HandlerArgumentType::Value inArgType, DataModelDataType::Value inValueType)
+ : m_Action(inAction)
+ , m_Name(inName)
+ , m_ArgType(inArgType)
+ , m_ValueType(inValueType)
+ {
+ }
+};
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMActionSystem.h b/src/dm/systems/Qt3DSDMActionSystem.h
new file mode 100644
index 0000000..8713729
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMActionSystem.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_ACTION_SYSTEM_H
+#define QT3DSDM_ACTION_SYSTEM_H
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMActionCore.h"
+
+namespace qt3dsdm {
+/**
+ * ActionSystem acts as a wrapper or helper around ActionCore. ActionSystem will call
+ * ActionCore and perform other necessary setups. It also has the knowledge of other
+ * system or core so there are some synchronization being done here.
+ *
+ * When in doubts which one to use (ActionSystem or ActionCore), always use ActionSystem
+ */
+class IActionSystem
+{
+public:
+ virtual ~IActionSystem() {}
+
+ // CreateAction will create Action's InstanceHandle and Action's ActionHandle and do some
+ // necessary setup
+ virtual Qt3DSDMActionHandle CreateAction(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ SLong4 inTriggerTargetObjects) = 0;
+ // DeleteAction will delete both Action's ActionHandle and Action's InstanceHandle
+ virtual void DeleteAction(Qt3DSDMActionHandle inAction) = 0;
+ // Return all actions that belong to a certain instance in a certain slide + the master slide
+ virtual void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const = 0;
+
+ // Get/set action eyeball property value
+ virtual bool GetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide,
+ Qt3DSDMActionHandle inAction) const = 0;
+ virtual void SetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, Qt3DSDMActionHandle inAction,
+ bool inValue) = 0;
+};
+
+typedef std::shared_ptr<IActionSystem> TActionSystemPtr;
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMAnimation.h b/src/dm/systems/Qt3DSDMAnimation.h
new file mode 100644
index 0000000..457b042
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMAnimation.h
@@ -0,0 +1,841 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DSDM_ANIMATION_H
+#define QT3DSDM_ANIMATION_H
+
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMValue.h"
+
+namespace qt3dsdm {
+
+struct SLinearKeyframe
+{
+ float m_KeyframeSeconds;
+ float m_KeyframeValue;
+};
+
+struct SBezierKeyframe : public SLinearKeyframe
+{
+ float m_InTangentTime; // time
+ float m_InTangentValue; // value offset
+ float m_OutTangentTime; // time offset in seconds
+ float m_OutTangentValue; // value offset
+};
+
+typedef std::vector<SBezierKeyframe> TBezierKeyframeList;
+
+/**
+ * Ease in/out are parameters that affect the bezier evaluation.
+ * Ease in/out at 100 means that the control values are at the end points thus creating
+ * a gradual deceleration. Ease in/out at 0 means that interpolation is linear, the
+ * control points are at 1/3 and 2/3's the distance to the next value.
+ * Ease in/out go from 0.f to 100.0f
+ */
+struct SEaseInEaseOutKeyframe : public SLinearKeyframe
+{
+ float m_EaseIn;
+ float m_EaseOut;
+};
+
+} // namespace qt3dsdm
+
+namespace qt3ds {
+namespace foundation {
+ // Disable calling destructor of these pod types
+ template <>
+ struct DestructTraits<qt3dsdm::SEaseInEaseOutKeyframe>
+ {
+ void destruct(qt3dsdm::SEaseInEaseOutKeyframe &) {}
+ };
+ template <>
+ struct DestructTraits<qt3dsdm::SBezierKeyframe>
+ {
+ void destruct(qt3dsdm::SBezierKeyframe &) {}
+ };
+ template <>
+ struct DestructTraits<qt3dsdm::SLinearKeyframe>
+ {
+ void destruct(qt3dsdm::SLinearKeyframe &) {}
+ };
+}
+}
+
+namespace qt3dsdm {
+
+enum EAnimationType {
+ EAnimationTypeNone = 0,
+ EAnimationTypeLinear,
+ EAnimationTypeBezier,
+ EAnimationTypeEaseInOut,
+};
+
+template <typename TDataType>
+struct SAnimationTypeTraits
+{
+};
+
+template <>
+struct SAnimationTypeTraits<SBezierKeyframe>
+{
+ EAnimationType getType() { return EAnimationTypeBezier; }
+};
+template <>
+struct SAnimationTypeTraits<SLinearKeyframe>
+{
+ EAnimationType getType() { return EAnimationTypeLinear; }
+};
+template <>
+struct SAnimationTypeTraits<SEaseInEaseOutKeyframe>
+{
+ EAnimationType getType() { return EAnimationTypeEaseInOut; }
+};
+
+struct SKeyframeUnionTraits
+{
+ typedef EAnimationType TIdType;
+ enum {
+ TBufferSize = sizeof(SBezierKeyframe),
+ };
+ static TIdType getNoDataId() { return EAnimationTypeNone; }
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return SAnimationTypeTraits<TDataType>().getType();
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case EAnimationTypeBezier:
+ return inVisitor(*reinterpret_cast<SBezierKeyframe *>(inData));
+ case EAnimationTypeLinear:
+ return inVisitor(*reinterpret_cast<SLinearKeyframe *>(inData));
+ case EAnimationTypeEaseInOut:
+ return inVisitor(*reinterpret_cast<SEaseInEaseOutKeyframe *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case EAnimationTypeNone:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case EAnimationTypeBezier:
+ return inVisitor(*reinterpret_cast<const SBezierKeyframe *>(inData));
+ case EAnimationTypeLinear:
+ return inVisitor(*reinterpret_cast<const SLinearKeyframe *>(inData));
+ case EAnimationTypeEaseInOut:
+ return inVisitor(*reinterpret_cast<const SEaseInEaseOutKeyframe *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case EAnimationTypeNone:
+ return inVisitor();
+ }
+ }
+};
+
+typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<SKeyframeUnionTraits,
+ SKeyframeUnionTraits::TBufferSize>,
+ SKeyframeUnionTraits::TBufferSize>
+ TKeyframe;
+
+template <>
+struct Qt3DSDMGetter<TKeyframe>
+{
+ template <typename TRetType>
+ TRetType doGet(const TKeyframe &inValue)
+ {
+ return inValue.getData<TRetType>();
+ }
+};
+
+typedef std::vector<TKeyframe> TKeyframeList;
+
+struct SAnimationInfo
+{
+ Qt3DSDMSlideHandle m_Slide;
+ Qt3DSDMInstanceHandle m_Instance;
+ Qt3DSDMPropertyHandle m_Property;
+ size_t m_Index;
+ EAnimationType m_AnimationType;
+ // Use the existing value for the value of the first keyframe.
+ // Not reflected in studio at this time, purely a runtime problem.
+ // Defaults to false
+ bool m_DynamicFirstKeyframe;
+ bool m_ArtistEdited;
+ SAnimationInfo()
+ : m_Index(0)
+ , m_AnimationType(EAnimationTypeLinear)
+ , m_DynamicFirstKeyframe(false)
+ // Animations are assumed to be artist edited.
+ // And any change will force this flag to true.
+ , m_ArtistEdited(true)
+
+ {
+ }
+ SAnimationInfo(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex, EAnimationType inAnimationType,
+ bool inDynamicFirstKeyframe, bool inArtistEdited)
+ : m_Slide(inSlide)
+ , m_Instance(inInstance)
+ , m_Property(inProperty)
+ , m_Index(inIndex)
+ , m_AnimationType(inAnimationType)
+ , m_DynamicFirstKeyframe(inDynamicFirstKeyframe)
+ , m_ArtistEdited(inArtistEdited)
+ {
+ }
+};
+
+typedef std::pair<SAnimationInfo, TKeyframeList> TAnimationKeyframesPair;
+typedef std::vector<TAnimationKeyframesPair> TAnimationKeyframesPairList;
+typedef std::vector<SAnimationInfo> TAnimationInfoList;
+
+/**
+ * Pure animation core. Not wrapped in any niceties.
+ */
+class IAnimationCore
+{
+public:
+ virtual ~IAnimationCore() {}
+ virtual Qt3DSDMAnimationHandle CreateAnimation(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType,
+ bool inFirstKeyframeDynamic) = 0;
+ virtual void DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) = 0;
+ virtual Qt3DSDMAnimationHandle GetAnimation(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ size_t inIndex) const = 0;
+ virtual SAnimationInfo GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const = 0;
+ virtual void GetAnimations(TAnimationHandleList &outAnimations) const = 0;
+ virtual void GetAnimations(TAnimationInfoList &outAnimations,
+ Qt3DSDMSlideHandle inMaster = Qt3DSDMSlideHandle(),
+ Qt3DSDMSlideHandle inSlide = Qt3DSDMSlideHandle()) const = 0;
+
+ virtual void GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ TAnimationHandleList &outAnimations) = 0;
+
+ virtual void SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue) = 0;
+
+ // keyframe manipulation
+ virtual Qt3DSDMKeyframeHandle InsertKeyframe(Qt3DSDMAnimationHandle inAnimation,
+ const TKeyframe &inKeyframe) = 0;
+ virtual void EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe) = 0;
+ virtual void DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) = 0;
+
+ // All of these mutators will force the artist edited property
+ // of the animation to true.
+ virtual Qt3DSDMAnimationHandle
+ GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const = 0;
+ virtual TKeyframe GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const = 0;
+ virtual void SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0;
+ virtual void GetKeyframes(Qt3DSDMAnimationHandle inAnimation,
+ TKeyframeHandleList &outKeyframes) const = 0;
+ virtual size_t GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const = 0;
+ virtual bool IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const = 0;
+
+ virtual void OffsetAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ long inOffset) = 0;
+
+ // Direct mutators of the artist edited feature of animations
+ virtual void SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited = true) = 0;
+ virtual bool IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const = 0;
+
+ // Animation Evaluation.
+ virtual float EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, float inSeconds) const = 0;
+
+ virtual bool KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const = 0;
+ virtual bool AnimationValid(Qt3DSDMAnimationHandle inAnimation) const = 0;
+
+ virtual void CopyAnimations(Qt3DSDMSlideHandle inSourceSlide,
+ Qt3DSDMInstanceHandle inSourceInstance,
+ Qt3DSDMSlideHandle inDestSlide,
+ Qt3DSDMInstanceHandle inDestInstance) = 0;
+};
+
+typedef std::shared_ptr<IAnimationCore> TAnimationCorePtr;
+
+struct SGetOrSetKeyframeInfo
+{
+ float m_Value = 0.0;
+ float m_EaseIn = -1.f;
+ float m_EaseOut = -1.f;
+ bool m_AnimationTrackIsDynamic = false;
+
+ SGetOrSetKeyframeInfo(float inValue, float inEaseIn = -1.f, float inEaseOut = -1.f,
+ bool inDynamic = false)
+ : m_Value(inValue)
+ , m_EaseIn(inEaseIn)
+ , m_EaseOut(inEaseOut)
+ , m_AnimationTrackIsDynamic(inDynamic)
+ {
+ }
+ SGetOrSetKeyframeInfo() = default;
+
+};
+/**
+ * Interface from studio into the animation system that speaks
+ * a language near to that of studio. Public interface.
+ */
+class IStudioAnimationSystem
+{
+public:
+ virtual ~IStudioAnimationSystem() {}
+
+ /**
+ * When auto-keyframing is on, all calls to setinstancepropertyvalue will
+ * case a keyframe to be set if the instance is a member of a slide graph.
+ */
+ virtual void SetAutoKeyframe(bool inAutoKeyframe) = 0;
+ /**
+ * Returns true when auto keyframing is set.
+ */
+ virtual bool GetAutoKeyframe() const = 0;
+ /**
+ * Create animation on the property on this instance. If the property was animated and had
+ *keyframes previously,
+ * this function will also set the keyframes accordingly.
+ */
+ virtual void Animate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) = 0;
+ /**
+ * Delete animation on the property on this instance
+ */
+ virtual void Deanimate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) = 0;
+ /**
+ * Set a keyframe on this property. Uses the current time of the slide graph.
+ * If the keyframe is within a given time distance of another, this function will simply change
+ * the keyframed value of the other property to match the current value of this property.
+ */
+ virtual void KeyframeProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ bool inDoDiffValue) = 0;
+ /**
+ * Set the value of a existing a keyframe or create a new one, on this property, at the given
+ *time.
+ * If ease in or ease out are unset then the keyframe gets the default ease in or out.
+ */
+ virtual void SetOrCreateKeyframe(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, float inTimeInSeconds,
+ SGetOrSetKeyframeInfo *inKeyframeInfo, size_t inNumInfos) = 0;
+ /**
+ * Return the animation that is currently controlling this property. This function will return
+ * an invalid handle value if there is currently no animation controlling this property.
+ */
+ virtual Qt3DSDMAnimationHandle GetControllingAnimation(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ size_t inIndex) const = 0;
+
+ /**
+ * Return true if the given property is animatable. You can begin animation by calling
+ *KeyframeProperty *or*
+ * by setting auto keyframe to on and setting a property value through the
+ *IInstancePropertyCore system.
+ */
+ virtual bool IsPropertyAnimatable(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+
+ /**
+ * Return true if the given property is animated. Currently, either 0 or ALL channels are
+ *animated. Hence, checking for index = 0 suffices.
+ * And if that changes, this function can be updated accordingly.
+ */
+ virtual bool IsPropertyAnimated(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+
+ /**
+ * Specify if new keyframes should be created with smooth ( ie Ease In/Out values = 100 ) or
+ *linear ( Ease In/Out values = 0 )
+ */
+ virtual void SetInterpolation(bool inSmooth) = 0;
+
+ /**
+ * Get an instance property value. Will override outValue only if the slide, instance,
+ *property is animated.
+ */
+ virtual bool GetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const = 0;
+ /**
+ * Set an instance property value. Will return true in the cases where
+ * the property is actually animated. May only set local values, or may auto set a keyframed
+ *value.
+ */
+ virtual bool SetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+
+ typedef std::function<void(Qt3DSDMInstanceHandle instance)> TRefreshCallbackFunc;
+ virtual void setRefreshCallback(TRefreshCallbackFunc func) = 0;
+};
+
+typedef std::shared_ptr<IStudioAnimationSystem> TStudioAnimationSystemPtr;
+
+inline SLinearKeyframe CreateLinearKeyframe(float inSeconds, float inValue)
+{
+ SLinearKeyframe retval = { inSeconds, inValue };
+ return retval;
+}
+
+inline SBezierKeyframe CreateBezierKeyframe(float inSeconds, float inValue, float inInTangentTime,
+ float inInTangentValue, float inOutTangentTime,
+ float inOutTangentValue)
+{
+ SBezierKeyframe theBezierKeyframe;
+ theBezierKeyframe.m_KeyframeSeconds = inSeconds;
+ theBezierKeyframe.m_KeyframeValue = inValue;
+ theBezierKeyframe.m_InTangentTime = inInTangentTime;
+ theBezierKeyframe.m_InTangentValue = inInTangentValue;
+ theBezierKeyframe.m_OutTangentTime = inOutTangentTime;
+ theBezierKeyframe.m_OutTangentValue = inOutTangentValue;
+ return theBezierKeyframe;
+}
+
+inline SEaseInEaseOutKeyframe CreateEaseInEaseOutKeyframe(float inSeconds, float inValue,
+ float inEaseIn, float inEaseOut)
+{
+ SEaseInEaseOutKeyframe retval;
+ retval.m_KeyframeSeconds = inSeconds;
+ retval.m_KeyframeValue = inValue;
+ retval.m_EaseIn = inEaseIn;
+ retval.m_EaseOut = inEaseOut;
+ return retval;
+}
+
+inline SAnimationInfo CreateAnimationInfo(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType,
+ bool inFirstKeyframeDynamic, bool inArtistEdited)
+{
+ SAnimationInfo retval(inSlide, inInstance, inProperty, inIndex, inAnimationType,
+ inFirstKeyframeDynamic, inArtistEdited);
+ return retval;
+}
+
+struct SKeyframeValueVisitor
+{
+ float operator()(const SLinearKeyframe &inKeyframe) const { return inKeyframe.m_KeyframeValue; }
+ float operator()(const SBezierKeyframe &inKeyframe) const { return inKeyframe.m_KeyframeValue; }
+ float operator()(const SEaseInEaseOutKeyframe &inKeyframe) const
+ {
+ return inKeyframe.m_KeyframeValue;
+ }
+ float operator()()
+ {
+ QT3DS_ASSERT(false);
+ return 0.0f;
+ }
+};
+
+inline float KeyframeValueValue(const TKeyframe &inKeyframe)
+{
+ return inKeyframe.visit<float>(SKeyframeValueVisitor());
+}
+
+struct SKeyframeTimeAnalyzer
+{
+ float operator()(const SLinearKeyframe &inValue) const { return inValue.m_KeyframeSeconds; }
+ float operator()(const SBezierKeyframe &inValue) const { return inValue.m_KeyframeSeconds; }
+ float operator()(const SEaseInEaseOutKeyframe &inValue) const
+ {
+ return inValue.m_KeyframeSeconds;
+ }
+ float operator()()
+ {
+ QT3DS_ASSERT(false);
+ return 0.0f;
+ }
+};
+
+inline float KeyframeTime(const TKeyframe &inValue)
+{
+ return inValue.visit<float>(SKeyframeTimeAnalyzer());
+}
+
+inline EAnimationType GetKeyframeType(const TKeyframe &inKeyframe)
+{
+ return inKeyframe.getType();
+}
+
+struct SAnimatableArityVisitor
+{
+ std::tuple<bool, size_t> operator()(bool) const
+ {
+ return std::tuple<bool, size_t>(true, 1);
+ }
+ std::tuple<bool, size_t> operator()(long) const
+ {
+ return std::tuple<bool, size_t>(true, 1);
+ }
+ std::tuple<bool, size_t> operator()(float) const
+ {
+ return std::tuple<bool, size_t>(true, 1);
+ }
+ std::tuple<bool, size_t> operator()(const SFloat2 &) const
+ {
+ return std::tuple<bool, size_t>(true, 2);
+ }
+ std::tuple<bool, size_t> operator()(const SFloat3 &) const
+ {
+ return std::tuple<bool, size_t>(true, 3);
+ }
+ std::tuple<bool, size_t> operator()(const SFloat4 &) const
+ {
+ return std::tuple<bool, size_t>(true, 4);
+ }
+ template <typename TDataType>
+ std::tuple<bool, size_t> operator()(const TDataType &) const
+ {
+ return std::tuple<bool, size_t>(false, 0);
+ }
+ std::tuple<bool, size_t> operator()()
+ {
+ QT3DS_ASSERT(false);
+ return std::tuple<bool, size_t>(false, 0);
+ }
+};
+
+inline std::tuple<bool, size_t> GetVariantAnimatableAndArity(const SValue &inValue)
+{
+ return inValue.visit<std::tuple<bool, size_t>>(SAnimatableArityVisitor());
+}
+
+inline std::tuple<bool, size_t> GetDatatypeAnimatableAndArity(DataModelDataType::Value inDataType)
+{
+ switch (inDataType) {
+ case DataModelDataType::Long:
+ case DataModelDataType::Float:
+ return std::make_tuple(true, 1);
+
+ case DataModelDataType::Float2:
+ return std::make_tuple(true, 2);
+
+ case DataModelDataType::Float3:
+ return std::make_tuple(true, 3);
+
+ case DataModelDataType::Float4:
+ return std::make_tuple(true, 4);
+
+ default:
+ return std::make_tuple(false, 0);
+ }
+}
+
+template <typename TDataType>
+inline TDataType SetFloatValue(float inValue, size_t inIndex, const TDataType &inDataType)
+{
+ TDataType retval(inDataType);
+ retval[inIndex] = inValue;
+ return retval;
+}
+
+struct SAnimationApplier
+{
+ float m_Value;
+ size_t m_Index;
+ SValue operator()(const bool &) { return m_Value > 0.5f; }
+ SValue operator()(const qt3ds::QT3DSI32 &) { return static_cast<qt3ds::QT3DSI32>(m_Value + .5f); }
+ SValue operator()(const float &) { return m_Value; }
+ SValue operator()(const SFloat2 &inValue) { return SetFloatValue(m_Value, m_Index, inValue); }
+ SValue operator()(const SFloat3 &inValue) { return SetFloatValue(m_Value, m_Index, inValue); }
+ SValue operator()(const SFloat4 &inValue) { return SetFloatValue(m_Value, m_Index, inValue); }
+ template <typename TDataType>
+ SValue operator()(const TDataType &inValue)
+ {
+ return inValue;
+ }
+ SValue operator()()
+ {
+ QT3DS_ASSERT(false);
+ return SValue();
+ }
+};
+
+inline void SetAnimationValue(float inValue, size_t inIndex, SValue &ioValue)
+{
+ using namespace std;
+ SAnimationApplier theApplier;
+ theApplier.m_Value = inValue;
+ theApplier.m_Index = inIndex;
+ ioValue = ioValue.visit<SValue>(theApplier);
+}
+
+template <typename TDataType>
+inline float GetFloatValue(const TDataType &inValue, size_t inIndex)
+{
+ return inValue[inIndex];
+}
+
+struct SAnimationGetter
+{
+ size_t m_Index;
+ float operator()(const bool &inValue) const { return inValue ? 1.f : 0.f; }
+ float operator()(const long &inValue) const { return static_cast<float>(inValue); }
+ float operator()(const float &inValue) const { return inValue; }
+ float operator()(const SFloat2 &inValue) const { return GetFloatValue(inValue, m_Index); }
+ float operator()(const SFloat3 &inValue) const { return GetFloatValue(inValue, m_Index); }
+ float operator()(const SFloat4 &inValue) const { return GetFloatValue(inValue, m_Index); }
+ template <typename TDataType>
+ float operator()(const TDataType & /*inValue*/) const
+ {
+ return 0.f;
+ }
+ float operator()()
+ {
+ QT3DS_ASSERT(false);
+ return 0.0f;
+ }
+};
+
+inline float GetAnimationValue(size_t inIndex, const SValue &ioValue)
+{
+ SAnimationGetter theGetter;
+ theGetter.m_Index = inIndex;
+ return ioValue.visit<float>(theGetter);
+}
+
+struct SKeyframeTimeSetter
+{
+ float m_Seconds;
+ TKeyframe operator()(const SLinearKeyframe &inValue) const
+ {
+ return CreateLinearKeyframe(m_Seconds, inValue.m_KeyframeValue);
+ }
+ TKeyframe operator()(const SBezierKeyframe &inValue) const
+ {
+ return CreateBezierKeyframe(m_Seconds, inValue.m_KeyframeValue, inValue.m_InTangentTime,
+ inValue.m_InTangentValue, inValue.m_OutTangentTime,
+ inValue.m_OutTangentValue);
+ }
+ TKeyframe operator()(const SEaseInEaseOutKeyframe &inValue) const
+ {
+ return CreateEaseInEaseOutKeyframe(m_Seconds, inValue.m_KeyframeValue, inValue.m_EaseIn,
+ inValue.m_EaseOut);
+ }
+ TKeyframe operator()()
+ {
+ QT3DS_ASSERT(false);
+ return TKeyframe();
+ }
+};
+
+inline TKeyframe SetKeyframeSeconds(const TKeyframe &inKeyframe, float inSeconds)
+{
+ SKeyframeTimeSetter theSetter;
+ theSetter.m_Seconds = inSeconds;
+ return inKeyframe.visit<TKeyframe>(theSetter);
+}
+
+struct SKeyframeTimeGetter
+{
+ template <typename TKeyframeType>
+ float operator()(const TKeyframeType &inValue) const
+ {
+ return inValue.m_KeyframeSeconds;
+ }
+ float operator()()
+ {
+ QT3DS_ASSERT(false);
+ return 0.0f;
+ }
+};
+
+inline float GetKeyframeSeconds(const TKeyframe &inKeyframe)
+{
+ SKeyframeTimeGetter theGetter;
+ return inKeyframe.visit<float>(theGetter);
+}
+
+struct SKeyframeValueSetter
+{
+ float m_Value;
+ TKeyframe operator()(const SLinearKeyframe &inValue) const
+ {
+ return CreateLinearKeyframe(inValue.m_KeyframeSeconds, m_Value);
+ }
+ TKeyframe operator()(const SBezierKeyframe &inValue) const
+ {
+ return CreateBezierKeyframe(inValue.m_KeyframeSeconds, m_Value, inValue.m_InTangentTime,
+ inValue.m_InTangentValue, inValue.m_OutTangentTime,
+ inValue.m_OutTangentValue);
+ }
+ TKeyframe operator()(const SEaseInEaseOutKeyframe &inValue) const
+ {
+ return CreateEaseInEaseOutKeyframe(inValue.m_KeyframeSeconds, m_Value, inValue.m_EaseIn,
+ inValue.m_EaseOut);
+ }
+ TKeyframe operator()()
+ {
+ QT3DS_ASSERT(false);
+ return TKeyframe();
+ }
+};
+
+inline TKeyframe SetKeyframeValue(const TKeyframe &inKeyframe, float inValue)
+{
+ SKeyframeValueSetter theSetter;
+ theSetter.m_Value = inValue;
+ return inKeyframe.visit<TKeyframe>(theSetter);
+}
+
+inline float AnimationClamp(float inLowerBound, float inUpperBound, float inValue)
+{
+ if (inValue < inLowerBound)
+ return inLowerBound;
+ if (inValue > inUpperBound)
+ return inUpperBound;
+ return inValue;
+}
+
+inline SBezierKeyframe
+CreateBezierKeyframeFromEaseInEaseOutKeyframe(float *inPreviousValue,
+ SEaseInEaseOutKeyframe inCurrent, float *inNextValue)
+{
+ float theValue = inCurrent.m_KeyframeValue;
+ float theSeconds = inCurrent.m_KeyframeSeconds;
+ float inSeconds = 0.f;
+ float inValue = 0.f;
+ float outSeconds = 0.f;
+ float outValue = 0.f;
+ if (inPreviousValue) {
+ float thePercent = 1.0f - AnimationClamp(0.0f, 1.0f, inCurrent.m_EaseIn / 100.f);
+ double theAmount = 1.0f - thePercent * .333333333334;
+ inValue = (float)(*inPreviousValue
+ + ((inCurrent.m_KeyframeValue - *inPreviousValue) * theAmount));
+ }
+ if (inNextValue) {
+ float thePercent = 1.0f - AnimationClamp(0.0f, 1.0f, inCurrent.m_EaseOut / 100.f);
+ double theAmount = thePercent * .3333333333334;
+ outValue = (float)(inCurrent.m_KeyframeValue
+ + ((*inNextValue - inCurrent.m_KeyframeValue) * theAmount));
+ }
+ return CreateBezierKeyframe(theSeconds, theValue, inSeconds, inValue, outSeconds, outValue);
+}
+
+void CopyKeyframes(const IAnimationCore &inSourceAnimationCore, IAnimationCore &inDestAnimationCore,
+ Qt3DSDMAnimationHandle inDestAnimation, const TKeyframeHandleList &inKeyframes);
+
+Qt3DSDMAnimationHandle CopyAnimation(TAnimationCorePtr inSourceAnimationCore,
+ Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMSlideHandle inNewSlide,
+ Qt3DSDMInstanceHandle inNewInstance,
+ Qt3DSDMPropertyHandle inNewProperty, size_t inNewIndex);
+
+struct SEaseInGetter
+{
+ float operator()(const SLinearKeyframe &) const { return 0.f; }
+ float operator()(const SBezierKeyframe &) const { return 0.f; }
+ float operator()(const SEaseInEaseOutKeyframe &inValue) const { return inValue.m_EaseIn; }
+ float operator()()
+ {
+ QT3DS_ASSERT(false);
+ return 0.0f;
+ }
+};
+struct SEaseOutGetter
+{
+ float operator()(const SLinearKeyframe &) const { return 0.f; }
+ float operator()(const SBezierKeyframe &) const { return 0.f; }
+ float operator()(const SEaseInEaseOutKeyframe &inValue) const { return inValue.m_EaseOut; }
+ float operator()()
+ {
+ QT3DS_ASSERT(false);
+ return 0.0f;
+ }
+};
+inline void GetEaseInOutValues(const TKeyframe &inValue, float &outEaseIn, float &outEaseOut)
+{
+ SEaseInGetter theGetter;
+ outEaseIn = inValue.visit<float>(theGetter);
+
+ SEaseOutGetter theEaseOutGetter;
+ outEaseOut = inValue.visit<float>(theEaseOutGetter);
+}
+
+struct SEaseInSetter
+{
+ float m_Value;
+ TKeyframe operator()(SLinearKeyframe &inValue) const { return inValue; }
+ TKeyframe operator()(SBezierKeyframe &inValue) const { return inValue; }
+ TKeyframe operator()(SEaseInEaseOutKeyframe &inKeyframe) const
+ {
+ inKeyframe.m_EaseIn = m_Value;
+ return inKeyframe;
+ }
+ TKeyframe operator()()
+ {
+ QT3DS_ASSERT(false);
+ return TKeyframe();
+ }
+};
+struct SEaseOutSetter
+{
+ float m_Value;
+ TKeyframe operator()(SLinearKeyframe &inValue) const { return inValue; }
+ TKeyframe operator()(SBezierKeyframe &inValue) const { return inValue; }
+ TKeyframe operator()(SEaseInEaseOutKeyframe &inKeyframe) const
+ {
+ inKeyframe.m_EaseOut = m_Value;
+ return inKeyframe;
+ }
+ TKeyframe operator()()
+ {
+ QT3DS_ASSERT(false);
+ return TKeyframe();
+ }
+};
+inline TKeyframe SetEaseInOutValues(TKeyframe &inKeyframe, float inEaseIn, float inEaseOut)
+{
+ SEaseInSetter theSetter;
+ theSetter.m_Value = inEaseIn;
+ inKeyframe.visit<TKeyframe>(theSetter);
+
+ SEaseOutSetter theEaseOutSetter;
+ theEaseOutSetter.m_Value = inEaseOut;
+ inKeyframe.visit<TKeyframe>(theEaseOutSetter);
+
+ return inKeyframe;
+}
+
+void GetKeyframesAsBezier(Qt3DSDMAnimationHandle inAnimation, const IAnimationCore &inAnimationCore,
+ TBezierKeyframeList &outKeyframes);
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
new file mode 100644
index 0000000..2bd8941
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.cpp
@@ -0,0 +1,579 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMComposerTypeDefinitions.h"
+#include <memory>
+#include "Qt3DSDMDataCore.h"
+#include "SimpleDataCore.h"
+#include "DataCoreProducer.h"
+#include "Qt3DSDMSlideCore.h"
+
+#include <QtGlobal>
+
+using namespace qt3dsdm;
+using std::make_shared;
+using std::shared_ptr;
+
+#ifdef _WIN32
+#pragma warning(disable : 4100)
+#endif
+
+// SComposerTypePropertyDefinition constructors
+
+namespace {
+
+template <typename TDataType>
+struct DataConstructor
+{
+ template <typename TInputType>
+ TDataType Construct(const TInputType &inInput)
+ {
+ return TDataType(inInput);
+ }
+};
+
+template <>
+struct DataConstructor<SLong4>
+{
+ SLong4 Construct(int inValue)
+ {
+ unsigned long theValue((unsigned long)inValue);
+ return SLong4(theValue, theValue, theValue, theValue);
+ }
+};
+
+template <>
+struct DataConstructor<TDataStrPtr>
+{
+ TDataStrPtr Construct(const wchar_t *inData)
+ {
+ if (IsTrivial(inData))
+ return make_shared<CDataStr>();
+ return make_shared<CDataStr>(inData);
+ }
+};
+template <>
+struct DataConstructor<SStringOrInt>
+{
+ SStringOrInt Construct(const wchar_t *inData)
+ {
+ if (IsTrivial(inData))
+ return make_shared<CDataStr>();
+ return make_shared<CDataStr>(inData);
+ }
+};
+template <>
+struct DataConstructor<SObjectRefType>
+{
+ SObjectRefType Construct(const wchar_t *) { return SObjectRefType(); }
+};
+}
+
+#define QT3DS_WCHAR_T_Typed L"Typed"
+#define QT3DS_WCHAR_T_Guided L"Guided"
+#define QT3DS_WCHAR_T_Named L"Named"
+#define QT3DS_WCHAR_T_SlideOwner L"SlideOwner"
+#define QT3DS_WCHAR_T_Slide L"Slide"
+#define QT3DS_WCHAR_T_Action L"Action"
+#define QT3DS_WCHAR_T_Asset L"Asset"
+#define QT3DS_WCHAR_T_Scene L"Scene"
+#define QT3DS_WCHAR_T_Image L"Image"
+#define QT3DS_WCHAR_T_Material L"Material"
+#define QT3DS_WCHAR_T_Behavior L"Behavior"
+#define QT3DS_WCHAR_T_Node L"Node"
+#define QT3DS_WCHAR_T_Layer L"Layer"
+#define QT3DS_WCHAR_T_Group L"Group"
+#define QT3DS_WCHAR_T_Model L"Model"
+#define QT3DS_WCHAR_T_Light L"Light"
+#define QT3DS_WCHAR_T_Camera L"Camera"
+#define QT3DS_WCHAR_T_Component L"Component"
+#define QT3DS_WCHAR_T_Text L"Text"
+#define QT3DS_WCHAR_T_Effect L"Effect"
+#define QT3DS_WCHAR_T_RenderPlugin L"RenderPlugin"
+#define QT3DS_WCHAR_T_MaterialBase L"MaterialBase"
+#define QT3DS_WCHAR_T_CustomMaterial L"CustomMaterial"
+#define QT3DS_WCHAR_T_ReferencedMaterial L"ReferencedMaterial"
+#define QT3DS_WCHAR_T_Alias L"Alias"
+#define QT3DS_WCHAR_T_Lightmaps L"Lightmaps"
+
+#define QT3DS_WCHAR_T_type L"type"
+#define QT3DS_WCHAR_T_id L"id"
+#define QT3DS_WCHAR_T_name L"name"
+#define QT3DS_WCHAR_T_componentid L"componentid"
+#define QT3DS_WCHAR_T_playmode L"playmode"
+#define QT3DS_WCHAR_T_playthroughto L"playthroughto"
+#define QT3DS_WCHAR_T_initialplaystate L"initialplaystate"
+#define QT3DS_WCHAR_T_actioneyeball L"actioneyeball"
+#define QT3DS_WCHAR_T_sourcepath L"sourcepath"
+#define QT3DS_WCHAR_T_importid L"importid"
+#define QT3DS_WCHAR_T_starttime L"starttime"
+#define QT3DS_WCHAR_T_endtime L"endtime"
+#define QT3DS_WCHAR_T_eyeball L"eyeball"
+#define QT3DS_WCHAR_T_shy L"shy"
+#define QT3DS_WCHAR_T_locked L"locked"
+#define QT3DS_WCHAR_T_timebarcolor L"timebarcolor"
+#define QT3DS_WCHAR_T_timebartext L"timebartext"
+#define QT3DS_WCHAR_T_bgcolorenable L"bgcolorenable"
+#define QT3DS_WCHAR_T_background L"background"
+#define QT3DS_WCHAR_T_backgroundcolor L"backgroundcolor"
+#define QT3DS_WCHAR_T_blendtype L"blendtype"
+#define QT3DS_WCHAR_T_scaleu L"scaleu"
+#define QT3DS_WCHAR_T_scalev L"scalev"
+#define QT3DS_WCHAR_T_mappingmode L"mappingmode"
+#define QT3DS_WCHAR_T_tilingmodehorz L"tilingmodehorz"
+#define QT3DS_WCHAR_T_tilingmodevert L"tilingmodevert"
+#define QT3DS_WCHAR_T_rotationuv L"rotationuv"
+#define QT3DS_WCHAR_T_positionu L"positionu"
+#define QT3DS_WCHAR_T_positionv L"positionv"
+#define QT3DS_WCHAR_T_pivotu L"pivotu"
+#define QT3DS_WCHAR_T_pivotv L"pivotv"
+#define QT3DS_WCHAR_T_subpresentation L"subpresentation"
+#define QT3DS_WCHAR_T_iblprobe L"iblprobe"
+#define QT3DS_WCHAR_T_shaderlighting L"shaderlighting"
+#define QT3DS_WCHAR_T_blendmode L"blendmode"
+#define QT3DS_WCHAR_T_vertexcolors L"vertexcolors"
+#define QT3DS_WCHAR_T_diffuse L"diffuse"
+#define QT3DS_WCHAR_T_diffusemap L"diffusemap"
+#define QT3DS_WCHAR_T_diffusemap2 L"diffusemap2"
+#define QT3DS_WCHAR_T_diffusemap3 L"diffusemap3"
+#define QT3DS_WCHAR_T_specularreflection L"specularreflection"
+#define QT3DS_WCHAR_T_specularmap L"specularmap"
+#define QT3DS_WCHAR_T_specularmodel L"specularmodel"
+#define QT3DS_WCHAR_T_speculartint L"speculartint"
+#define QT3DS_WCHAR_T_ior L"ior"
+#define QT3DS_WCHAR_T_specularamount L"specularamount"
+#define QT3DS_WCHAR_T_specularroughness L"specularroughness"
+#define QT3DS_WCHAR_T_roughnessmap L"roughnessmap"
+#define QT3DS_WCHAR_T_opacitymap L"opacitymap"
+#define QT3DS_WCHAR_T_emissivepower L"emissivepower"
+#define QT3DS_WCHAR_T_emissivecolor L"emissivecolor"
+#define QT3DS_WCHAR_T_emissivemap L"emissivemap"
+#define QT3DS_WCHAR_T_emissivemap2 L"emissivemap2"
+#define QT3DS_WCHAR_T_normalmap L"normalmap"
+#define QT3DS_WCHAR_T_normalstrength L"normalstrength"
+#define QT3DS_WCHAR_T_position L"position"
+#define QT3DS_WCHAR_T_rotation L"rotation"
+#define QT3DS_WCHAR_T_scale L"scale"
+#define QT3DS_WCHAR_T_pivot L"pivot"
+#define QT3DS_WCHAR_T_opacity L"opacity"
+#define QT3DS_WCHAR_T_rotationorder L"rotationorder"
+#define QT3DS_WCHAR_T_orientation L"orientation"
+#define QT3DS_WCHAR_T_progressiveaa L"progressiveaa"
+#define QT3DS_WCHAR_T_multisampleaa L"multisampleaa"
+#define QT3DS_WCHAR_T_disabledepthtest L"disabledepthtest"
+#define QT3DS_WCHAR_T_disabledepthprepass L"disabledepthprepass"
+#define QT3DS_WCHAR_T_layerwidth L"layerwidth"
+#define QT3DS_WCHAR_T_layerheight L"layerheight"
+#define QT3DS_WCHAR_T_lighttype L"lighttype"
+#define QT3DS_WCHAR_T_lightdiffuse L"lightdiffuse"
+#define QT3DS_WCHAR_T_lightspecular L"lightspecular"
+#define QT3DS_WCHAR_T_lightambient L"lightambient"
+#define QT3DS_WCHAR_T_brightness L"brightness"
+#define QT3DS_WCHAR_T_linearfade L"linearfade"
+#define QT3DS_WCHAR_T_expfade L"expfade"
+#define QT3DS_WCHAR_T_areawidth L"areawidth"
+#define QT3DS_WCHAR_T_areaheight L"areaheight"
+#define QT3DS_WCHAR_T_castshadow L"castshadow"
+#define QT3DS_WCHAR_T_shdwbias L"shdwbias"
+#define QT3DS_WCHAR_T_shdwfactor L"shdwfactor"
+#define QT3DS_WCHAR_T_shdwmapres L"shdwmapres"
+#define QT3DS_WCHAR_T_shdwmapfar L"shdwmapfar"
+#define QT3DS_WCHAR_T_shdwmapfov L"shdwmapfov"
+#define QT3DS_WCHAR_T_shdwfilter L"shdwfilter"
+#define QT3DS_WCHAR_T_orthographic L"orthographic"
+#define QT3DS_WCHAR_T_fov L"fov"
+#define QT3DS_WCHAR_T_fovhorizontal L"fovhorizontal"
+#define QT3DS_WCHAR_T_clipnear L"clipnear"
+#define QT3DS_WCHAR_T_clipfar L"clipfar"
+#define QT3DS_WCHAR_T_lookatlock L"lookatlock"
+#define QT3DS_WCHAR_T_lookatpoint L"lookatpoint"
+#define QT3DS_WCHAR_T_textstring L"textstring"
+#define QT3DS_WCHAR_T_textcolor L"textcolor"
+#define QT3DS_WCHAR_T_font L"font"
+#define QT3DS_WCHAR_T_size L"size"
+#define QT3DS_WCHAR_T_horzalign L"horzalign"
+#define QT3DS_WCHAR_T_vertalign L"vertalign"
+#define QT3DS_WCHAR_T_leading L"leading"
+#define QT3DS_WCHAR_T_tracking L"tracking"
+#define QT3DS_WCHAR_T_dropshadow L"dropshadow"
+#define QT3DS_WCHAR_T_dropshadowstrength L"dropshadowstrength"
+#define QT3DS_WCHAR_T_dropshadowoffsetx L"dropshadowoffsetx"
+#define QT3DS_WCHAR_T_dropshadowoffsety L"dropshadowoffsety"
+#define QT3DS_WCHAR_T_wordwrap L"wordwrap"
+#define QT3DS_WCHAR_T_boundingbox L"boundingbox"
+#define QT3DS_WCHAR_T_elide L"elide"
+#define QT3DS_WCHAR_T_enableacceleratedfont L"enableacceleratedfont"
+#define QT3DS_WCHAR_T_importfile L"importfile"
+#define QT3DS_WCHAR_T_fileid L"fileid"
+#define QT3DS_WCHAR_T_size L"size"
+#define QT3DS_WCHAR_T_location L"location"
+#define QT3DS_WCHAR_T_boneid L"boneid"
+#define QT3DS_WCHAR_T_poseroot L"poseroot"
+#define QT3DS_WCHAR_T_ignoresparent L"ignoresparent"
+#define QT3DS_WCHAR_T_shadowcaster L"shadowcaster"
+#define QT3DS_WCHAR_T_tessellation L"tessellation"
+#define QT3DS_WCHAR_T_edgetess L"edgetess"
+#define QT3DS_WCHAR_T_innertess L"innertess"
+#define QT3DS_WCHAR_T_scalemode L"scalemode"
+#define QT3DS_WCHAR_T_scaleanchor L"scaleanchor"
+#define QT3DS_WCHAR_T_horzfields L"horzfields"
+#define QT3DS_WCHAR_T_left L"left"
+#define QT3DS_WCHAR_T_leftunits L"leftunits"
+#define QT3DS_WCHAR_T_width L"width"
+#define QT3DS_WCHAR_T_widthunits L"widthunits"
+#define QT3DS_WCHAR_T_right L"right"
+#define QT3DS_WCHAR_T_rightunits L"rightunits"
+#define QT3DS_WCHAR_T_vertfields L"vertfields"
+#define QT3DS_WCHAR_T_top L"top"
+#define QT3DS_WCHAR_T_topunits L"topunits"
+#define QT3DS_WCHAR_T_height L"height"
+#define QT3DS_WCHAR_T_heightunits L"heightunits"
+#define QT3DS_WCHAR_T_bottom L"bottom"
+#define QT3DS_WCHAR_T_bottomunits L"bottomunits"
+#define QT3DS_WCHAR_T_aostrength L"aostrength"
+#define QT3DS_WCHAR_T_aodistance L"aodistance"
+#define QT3DS_WCHAR_T_aosoftness L"aosoftness"
+#define QT3DS_WCHAR_T_aobias L"aobias"
+#define QT3DS_WCHAR_T_aosamplerate L"aosamplerate"
+#define QT3DS_WCHAR_T_aodither L"aodither"
+#define QT3DS_WCHAR_T_shadowstrength L"shadowstrength"
+#define QT3DS_WCHAR_T_shadowdist L"shadowdist"
+#define QT3DS_WCHAR_T_shadowsoftness L"shadowsoftness"
+#define QT3DS_WCHAR_T_shadowbias L"shadowbias"
+#define QT3DS_WCHAR_T_source L"source"
+#define QT3DS_WCHAR_T_referencedmaterial L"referencedmaterial"
+#define QT3DS_WCHAR_T_lightprobe L"lightprobe"
+#define QT3DS_WCHAR_T_probebright L"probebright"
+#define QT3DS_WCHAR_T_fastibl L"fastibl"
+#define QT3DS_WCHAR_T_probehorizon L"probehorizon"
+#define QT3DS_WCHAR_T_probefov L"probefov"
+#define QT3DS_WCHAR_T_lightprobe2 L"lightprobe2"
+#define QT3DS_WCHAR_T_probe2fade L"probe2fade"
+#define QT3DS_WCHAR_T_probe2window L"probe2window"
+#define QT3DS_WCHAR_T_probe2pos L"probe2pos"
+#define QT3DS_WCHAR_T_bumpmap L"bumpmap"
+#define QT3DS_WCHAR_T_bumpamount L"bumpamount"
+#define QT3DS_WCHAR_T_normalmap L"normalmap"
+#define QT3DS_WCHAR_T_displacementmap L"displacementmap"
+#define QT3DS_WCHAR_T_displaceamount L"displaceamount"
+#define QT3DS_WCHAR_T_translucencymap L"translucencymap"
+#define QT3DS_WCHAR_T_translucentfalloff L"translucentfalloff"
+#define QT3DS_WCHAR_T_diffuselightwrap L"diffuselightwrap"
+#define QT3DS_WCHAR_T_fresnelPower L"fresnelPower"
+#define QT3DS_WCHAR_T_referencednode L"referencednode"
+#define QT3DS_WCHAR_T_temporalaa L"temporalaa"
+#define QT3DS_WCHAR_T_scope L"scope"
+#define QT3DS_WCHAR_T_Path L"Path"
+#define QT3DS_WCHAR_T_pathdata L"pathdata"
+#define QT3DS_WCHAR_T_PathAnchorPoint L"PathAnchorPoint"
+#define QT3DS_WCHAR_T_incomingangle L"incomingangle"
+#define QT3DS_WCHAR_T_incomingdistance L"incomingdistance"
+#define QT3DS_WCHAR_T_outgoingdistance L"outgoingdistance"
+#define QT3DS_WCHAR_T_linearerror L"linearerror"
+#define QT3DS_WCHAR_T_edgetessamount L"edgetessamount"
+#define QT3DS_WCHAR_T_innertessamount L"innertessamount"
+#define QT3DS_WCHAR_T_begincap L"begincap"
+#define QT3DS_WCHAR_T_begincapoffset L"begincapoffset"
+#define QT3DS_WCHAR_T_begincapopacity L"begincapopacity"
+#define QT3DS_WCHAR_T_begincapwidth L"begincapwidth"
+#define QT3DS_WCHAR_T_endcap L"endcap"
+#define QT3DS_WCHAR_T_endcapoffset L"endcapoffset"
+#define QT3DS_WCHAR_T_endcapopacity L"endcapopacity"
+#define QT3DS_WCHAR_T_endcapwidth L"endcapwidth"
+#define QT3DS_WCHAR_T_pathtype L"pathtype"
+#define QT3DS_WCHAR_T_closed L"closed"
+#define QT3DS_WCHAR_T_paintstyle L"paintstyle"
+#define QT3DS_WCHAR_T_SubPath L"SubPath"
+#define QT3DS_WCHAR_T_lightmapindirect L"lightmapindirect"
+#define QT3DS_WCHAR_T_lightmapradiosity L"lightmapradiosity"
+#define QT3DS_WCHAR_T_lightmapshadow L"lightmapshadow"
+#define QT3DS_WCHAR_T_controlledproperty L"controlledproperty"
+#define QT3DS_WCHAR_T_variants L"variants"
+
+const wchar_t *ComposerObjectTypes::Convert(ComposerObjectTypes::Enum inType)
+{
+ switch (inType) {
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ case name: \
+ return QT3DS_WCHAR_T_##name;
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return L"Unknown";
+}
+
+ComposerObjectTypes::Enum ComposerObjectTypes::Convert(const wchar_t *inType)
+{
+
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ if (AreEqual(QT3DS_WCHAR_T_##name, inType)) \
+ return ComposerObjectTypes::name;
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+
+ QT3DS_ASSERT(false);
+ return ComposerObjectTypes::Unknown;
+}
+
+ComposerObjectTypes::Enum ComposerObjectTypes::Convert(const char8_t *inType)
+{
+
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ if (AreEqual(#name, inType)) \
+ return ComposerObjectTypes::name;
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+
+ QT3DS_ASSERT(false);
+ return ComposerObjectTypes::Unknown;
+}
+
+const wchar_t *ComposerPropertyNames::Convert(ComposerPropertyNames::Enum inType)
+{
+ switch (inType) {
+#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue)
+#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \
+ case name: \
+ return QT3DS_WCHAR_T_##name;
+#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \
+ HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type)
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+#undef HANDLE_COMPOSER_PROPERTY
+#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT
+#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return L"Unknown";
+}
+
+ComposerPropertyNames::Enum ComposerPropertyNames::Convert(const wchar_t *inType)
+{
+#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue)
+#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \
+ if (AreEqual(inType, QT3DS_WCHAR_T_##name)) \
+ return name;
+#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \
+ HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type)
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+#undef HANDLE_COMPOSER_PROPERTY
+#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT
+#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE
+ QT3DS_ASSERT(false);
+ return ComposerPropertyNames::Unknown;
+}
+
+const char8_t *ComposerPropertyNames::ConvertNarrow(ComposerPropertyNames::Enum inType)
+{
+ switch (inType) {
+#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue)
+#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \
+ case name: \
+ return #name;
+#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \
+ HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type)
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+#undef HANDLE_COMPOSER_PROPERTY
+#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT
+#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return "Unknown";
+}
+
+ComposerPropertyNames::Enum ComposerPropertyNames::Convert(const char8_t *inType)
+{
+#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue)
+#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \
+ if (AreEqual(inType, #name)) \
+ return name;
+#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \
+ HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type)
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+#undef HANDLE_COMPOSER_PROPERTY
+#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT
+#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE
+ QT3DS_ASSERT(false);
+ return ComposerPropertyNames::Unknown;
+}
+
+#define HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue) \
+ , memberName(inCore, inInstance, DataConstructor<dtype>().Construct(defaultValue))
+
+#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, dtype) \
+ , memberName(inCore, inInstance)
+
+#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, dtype, defaultValue) \
+ HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue)
+
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ SComposerTypePropertyDefinition<ComposerObjectTypes::name>::SComposerTypePropertyDefinition( \
+ IDataCore &inCore, Qt3DSDMInstanceHandle inInstance) \
+ : reserved(false) propmacro \
+ { \
+ Q_UNUSED(inCore); \
+ Q_UNUSED(inInstance); \
+ }
+ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+#undef HANDLE_COMPOSER_PROPERTY
+#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT
+#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE
+
+void ComposerTypeDefinitionsHelper::SetInstanceAsCanonical(IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ ComposerObjectTypes::Enum inObjectType)
+{
+ inMetaData.SetInstanceAsCanonical(inInstance, ComposerObjectTypes::Convert(inObjectType));
+}
+
+void ComposerTypeDefinitionsHelper::SetInstancePropertyValue(IDataCore &inDataCore,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const wchar_t *inPropValue)
+{
+ inDataCore.SetInstancePropertyValue(inInstance, inProperty, make_shared<CDataStr>(inPropValue));
+}
+
+void ComposerTypeDefinitionsHelper::DeriveInstance(IDataCore &inDataCore,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent)
+{
+ inDataCore.DeriveInstance(inInstance, inParent);
+}
+
+// Container object for all of the object definitions
+SComposerObjectDefinitions::SComposerObjectDefinitions(IDataCore &inCore, IMetaData &inMetaData)
+ : m_Typed(inCore, inMetaData, inCore.CreateInstance())
+ , m_Guided(inCore, inMetaData, inCore.CreateInstance())
+ , m_Named(inCore, inMetaData, inCore.CreateInstance())
+ , m_SlideOwner(inCore, inMetaData, inCore.CreateInstance())
+ , m_Slide(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Named)
+ , m_Action(inCore, inMetaData, inCore.CreateInstance(), m_Typed)
+ , m_Asset(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Guided, m_Named)
+ , m_Scene(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset, m_SlideOwner)
+ , m_Image(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_MaterialBase(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_Lightmaps(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_MaterialBase)
+ , m_Material(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Lightmaps)
+ , m_CustomMaterial(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Lightmaps)
+ , m_ReferencedMaterial(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Lightmaps)
+ , m_Behavior(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_Effect(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_Node(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_Layer(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_Group(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_Model(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_Light(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_Camera(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_Component(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node, m_SlideOwner)
+ , m_Text(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_RenderPlugin(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_Alias(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_Path(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node)
+ , m_PathAnchorPoint(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_SubPath(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset)
+ , m_DataCore(inCore)
+{
+}
+
+bool SComposerObjectDefinitions::IsA(Qt3DSDMInstanceHandle inInstance,
+ ComposerObjectTypes::Enum inType)
+{
+ if (m_DataCore.IsInstance(inInstance) == false)
+ return false;
+
+ switch (inType) {
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ case ComposerObjectTypes::name: \
+ return m_DataCore.IsInstanceOrDerivedFrom(inInstance, m_##name.m_Instance);
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return false;
+}
+
+// Could easily return None, meaning we can't identify the object type.
+// Checks the type of the first derivation parent, so this won't ever return
+// SlideOwner, for instance.
+ComposerObjectTypes::Enum SComposerObjectDefinitions::GetType(Qt3DSDMInstanceHandle inInstance)
+{
+ if (m_DataCore.IsInstance(inInstance) == false)
+ return ComposerObjectTypes::Unknown;
+
+ Qt3DSDMInstanceHandle theTargetInstance = inInstance;
+ TInstanceHandleList theHandleList;
+ m_DataCore.GetInstanceParents(inInstance, theHandleList);
+ if (theHandleList.empty() == false)
+ theTargetInstance = theHandleList[0];
+
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ if (m_##name.m_Instance == theTargetInstance) \
+ return ComposerObjectTypes::name;
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+
+ return ComposerObjectTypes::Unknown;
+}
+
+Qt3DSDMInstanceHandle
+SComposerObjectDefinitions::GetInstanceForType(ComposerObjectTypes::Enum inType)
+{
+ switch (inType) {
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ case ComposerObjectTypes::name: \
+ return m_##name.m_Instance;
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return 0;
+}
diff --git a/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
new file mode 100644
index 0000000..1a07940
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMComposerTypeDefinitions.h
@@ -0,0 +1,956 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMDataTypes.h"
+#include "foundation/Qt3DSOption.h"
+#include "Qt3DSDMDataCore.h"
+#include <utility>
+
+// Defines the minimal property model that UIComposer needs to
+// run off of.
+namespace qt3dsdm {
+class IDataCore;
+class IMetaData;
+class ISlideCore;
+class IPropertySystem;
+
+// Extensible macro definitions
+// Enumerations *have* to be in derivation order
+// else initialization of the SComposerObjectDefinitions class
+// will fail catastrophically
+// Specific type documentation is below
+#define ITERATE_COMPOSER_OBJECT_TYPES \
+ HANDLE_COMPOSER_OBJECT_TYPE(Typed, ITERATE_COMPOSER_TYPED_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Guided, ITERATE_COMPOSER_GUIDED_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Named, ITERATE_COMPOSER_NAMED_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(SlideOwner, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Slide, ITERATE_COMPOSER_SLIDE_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Action, ITERATE_COMPOSER_ACTION_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Asset, ITERATE_COMPOSER_ASSET_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Scene, ITERATE_COMPOSER_SCENE_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Image, ITERATE_COMPOSER_IMAGE_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(MaterialBase, ITERATE_COMPOSER_MATERIAL_BASE_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Lightmaps, ITERATE_COMPOSER_LIGHTMAP_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Material, ITERATE_COMPOSER_MATERIAL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(CustomMaterial, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(ReferencedMaterial, \
+ ITERATE_COMPOSER_REFERENCED_MATERIAL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Behavior, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Effect, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Node, ITERATE_COMPOSER_NODE_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Layer, ITERATE_COMPOSER_LAYER_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Group, ITERATE_COMPOSER_GROUP_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Model, ITERATE_COMPOSER_MODEL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Light, ITERATE_COMPOSER_LIGHT_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Camera, ITERATE_COMPOSER_CAMERA_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Component, ITERATE_COMPOSER_COMPONENT_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Text, ITERATE_COMPOSER_TEXT_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(RenderPlugin, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Alias, ITERATE_COMPOSER_ALIAS_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(Path, ITERATE_COMPOSER_PATH_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(PathAnchorPoint, ITERATE_COMPOSER_PATH_ANCHOR_POINT_PROPERTIES) \
+ HANDLE_COMPOSER_OBJECT_TYPE(SubPath, ITERATE_COMPOSER_PATH_SUBPATH_PROPERTIES)
+
+#define ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES
+
+#define ITERATE_COMPOSER_TYPED_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(type, m_TypeProp, TDataStrPtr, L"Typed")
+
+#define ITERATE_COMPOSER_GUIDED_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(id, m_GuidProp, SLong4, 0)
+
+#define ITERATE_COMPOSER_NAMED_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(name, m_NameProp, TDataStrPtr, L"Unnamed")
+
+#define ITERATE_COMPOSER_ASSET_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(sourcepath, m_SourcePath, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY(importid, m_ImportId, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY(importfile, m_ImportFile, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY(fileid, m_FileId, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY(starttime, m_StartTime, qt3ds::QT3DSI32, 0) \
+ HANDLE_COMPOSER_PROPERTY(endtime, m_EndTime, qt3ds::QT3DSI32, 10000) \
+ HANDLE_COMPOSER_PROPERTY(eyeball, m_Eyeball, bool, true) \
+ HANDLE_COMPOSER_PROPERTY(shy, m_Shy, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(locked, m_Locked, bool, false) \
+ HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(timebarcolor, m_TimebarColor, SFloat4) \
+ HANDLE_COMPOSER_PROPERTY(timebartext, m_TimebarText, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_SCENE_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(bgcolorenable, m_BgColorEnable, bool, true) \
+ HANDLE_COMPOSER_PROPERTY(backgroundcolor, m_BackgroundColor, SFloat4, SFloat4(0, 0, 0, 1)) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_COMPONENT_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_NODE_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(position, m_Position, SFloat3, SFloat3(0, 0, 0)) \
+ HANDLE_COMPOSER_PROPERTY(rotation, m_Rotation, SFloat3, SFloat3(0, 0, 0)) \
+ HANDLE_COMPOSER_PROPERTY(scale, m_Scale, SFloat3, SFloat3(1, 1, 1)) \
+ HANDLE_COMPOSER_PROPERTY(pivot, m_Pivot, SFloat3, SFloat3(0, 0, 0)) \
+ HANDLE_COMPOSER_PROPERTY(opacity, m_Opacity, float, 100.f) \
+ HANDLE_COMPOSER_PROPERTY(rotationorder, m_RotationOrder, TDataStrPtr, L"YXZ") \
+ HANDLE_COMPOSER_PROPERTY(orientation, m_Orientation, TDataStrPtr, L"Left Handed") \
+ HANDLE_COMPOSER_PROPERTY(boneid, m_BoneId, qt3ds::QT3DSI32, 0) \
+ HANDLE_COMPOSER_PROPERTY(ignoresparent, m_IgnoresParent, bool, false) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_MODEL_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(shadowcaster, m_ShadowCaster, bool, true) \
+ HANDLE_COMPOSER_PROPERTY(poseroot, m_PoseRoot, qt3ds::QT3DSI32, -1) \
+ HANDLE_COMPOSER_PROPERTY(tessellation, m_Tessellation, TDataStrPtr, L"None") \
+ HANDLE_COMPOSER_PROPERTY(edgetess, m_EdgeTess, float, 1.0) \
+ HANDLE_COMPOSER_PROPERTY(innertess, m_InnerTess, float, 1.0) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_IMAGE_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(scaleu, m_RepeatU, float, 1.0f) \
+ HANDLE_COMPOSER_PROPERTY(scalev, m_RepeatV, float, 1.0f) \
+ HANDLE_COMPOSER_PROPERTY(mappingmode, m_TextureMapping, TDataStrPtr, L"UV Mapping") \
+ HANDLE_COMPOSER_PROPERTY(tilingmodehorz, m_TilingU, TDataStrPtr, L"No Tiling") \
+ HANDLE_COMPOSER_PROPERTY(tilingmodevert, m_TilingV, TDataStrPtr, L"No Tiling") \
+ HANDLE_COMPOSER_PROPERTY(rotationuv, m_RotationUV, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(positionu, m_PositionU, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(positionv, m_PositionV, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(pivotu, m_PivotU, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(pivotv, m_PivotV, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(subpresentation, m_SubPresentation, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_LIGHTMAP_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(lightmapindirect, m_LightmapIndirect, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(lightmapradiosity, m_LightmapRadiosity, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(lightmapshadow, m_LightmapShadow, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_CUSTOM_MATERIAL_PROPERTIES \
+ HANDLE_QT3DS_RENDER_PROPERTY(iblprobe, m_IblProbe, SLong4, 0)
+
+#define ITERATE_COMPOSER_MATERIAL_BASE_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(iblprobe, m_IblProbe, SLong4, 0)
+
+#define ITERATE_COMPOSER_MATERIAL_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(shaderlighting, m_ShaderLighting, TDataStrPtr, L"Vertex") \
+ HANDLE_COMPOSER_PROPERTY(blendmode, m_BlendMode, TDataStrPtr, L"Normal") \
+ HANDLE_COMPOSER_PROPERTY(diffuse, m_DiffuseColor, SFloat4, SFloat4(1, 1, 1, 1)) \
+ HANDLE_COMPOSER_PROPERTY(diffusemap, m_DiffuseMap1, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(diffusemap2, m_DiffuseMap2, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(diffusemap3, m_DiffuseMap3, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(specularreflection, m_SpecularReflection, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(specularamount, m_SpecularAmount, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(specularroughness, m_SpecularRoughness, float, 50.f) \
+ HANDLE_COMPOSER_PROPERTY(roughnessmap, m_RoughnessMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(opacity, m_Opacity, float, 100.f) \
+ HANDLE_COMPOSER_PROPERTY(opacitymap, m_OpacityMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(emissivecolor, m_EmissiveColor, SFloat4, SFloat4(1, 1, 1, 1)) \
+ HANDLE_COMPOSER_PROPERTY(emissivepower, m_EmissivePower, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(emissivemap, m_EmissiveMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(emissivemap2, m_EmissiveMap2, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(bumpmap, m_BumpMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(bumpamount, m_BumpAmount, float, 9.0f) \
+ HANDLE_COMPOSER_PROPERTY(normalmap, m_NormalMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(displacementmap, m_DisplacementMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(displaceamount, m_DisplaceAmount, float, 0.5f) \
+ HANDLE_COMPOSER_PROPERTY(translucencymap, m_TranslucencyMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(translucentfalloff, m_TranslucentFalloff, float, 1.f) \
+ HANDLE_COMPOSER_PROPERTY(diffuselightwrap, m_DiffuseLightWrap, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(specularmap, m_SpecularMap, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(specularmodel, m_SpecularModel, TDataStrPtr, L"Default") \
+ HANDLE_COMPOSER_PROPERTY(speculartint, m_SpecularTint, SFloat4, SFloat4(1, 1, 1, 1)) \
+ HANDLE_COMPOSER_PROPERTY(ior, m_IOR, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(fresnelPower, m_FresnelPower, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(vertexcolors, m_VertexColors, bool, false) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_REFERENCED_MATERIAL_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(referencedmaterial, m_ReferencedMaterial, SObjectRefType, L"")
+
+#define ITERATE_COMPOSER_LAYER_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(progressiveaa, m_ProgressiveAA, TDataStrPtr, L"None") \
+ HANDLE_COMPOSER_PROPERTY(multisampleaa, m_MultisampleAA, TDataStrPtr, L"None") \
+ HANDLE_COMPOSER_PROPERTY(temporalaa, m_TemporalAA, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(disabledepthtest, m_DisableDepthTest, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(disabledepthprepass, m_DisableDepthPrepass, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(background, m_Background, TDataStrPtr, L"Transparent") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(backgroundcolor, m_BackgroundColor, SFloat4, \
+ SFloat4(0, 0, 0, 1)) \
+ HANDLE_COMPOSER_PROPERTY(blendtype, m_BlendType, TDataStrPtr, L"Normal") \
+ HANDLE_COMPOSER_PROPERTY(horzfields, m_HorizontalFieldValues, TDataStrPtr, L"Left/Width") \
+ HANDLE_COMPOSER_PROPERTY(left, m_Left, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(leftunits, m_LeftUnits, TDataStrPtr, L"percent") \
+ HANDLE_COMPOSER_PROPERTY(width, m_Width, float, 100.0f) \
+ HANDLE_COMPOSER_PROPERTY(widthunits, m_WidthUnits, TDataStrPtr, L"percent") \
+ HANDLE_COMPOSER_PROPERTY(right, m_Right, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(rightunits, m_RightUnits, TDataStrPtr, L"percent") \
+ HANDLE_COMPOSER_PROPERTY(vertfields, m_VerticalFieldValues, TDataStrPtr, L"Top/Height") \
+ HANDLE_COMPOSER_PROPERTY(top, m_Top, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(topunits, m_TopUnits, TDataStrPtr, L"percent") \
+ HANDLE_COMPOSER_PROPERTY(height, m_Height, float, 100.0f) \
+ HANDLE_COMPOSER_PROPERTY(heightunits, m_HeightUnits, TDataStrPtr, L"percent") \
+ HANDLE_COMPOSER_PROPERTY(bottom, m_Bottom, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(bottomunits, m_BottomUnits, TDataStrPtr, L"percent") \
+ HANDLE_COMPOSER_PROPERTY(aostrength, m_AoStrength, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(aodistance, m_AoDistance, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(aosoftness, m_AoSoftness, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(aobias, m_AoBias, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(aosamplerate, m_AoSamplerate, qt3ds::QT3DSI32, 1) \
+ HANDLE_COMPOSER_PROPERTY(aodither, m_AoDither, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(shadowstrength, m_ShadowStrength, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(shadowdist, m_ShadowDist, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(shadowsoftness, m_ShadowSoftness, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(shadowbias, m_ShadowBias, float, 0) \
+ HANDLE_COMPOSER_PROPERTY(lightprobe, m_LightProbe, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(probebright, m_ProbeBright, float, 100.0f) \
+ HANDLE_COMPOSER_PROPERTY(fastibl, m_FastIbl, bool, true) \
+ HANDLE_COMPOSER_PROPERTY(probehorizon, m_ProbeHorizon, float, -1) \
+ HANDLE_COMPOSER_PROPERTY(probefov, m_ProbeFov, float, 180.0f) \
+ HANDLE_COMPOSER_PROPERTY(lightprobe2, m_LightProbe2, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(probe2fade, m_Probe2Fade, float, 1) \
+ HANDLE_COMPOSER_PROPERTY(probe2window, m_Probe2Window, float, 1) \
+ HANDLE_COMPOSER_PROPERTY(probe2pos, m_Probe2Pos, float, 0.5f) \
+ HANDLE_COMPOSER_PROPERTY(variants, m_variants, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_GROUP_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \
+
+#define ITERATE_COMPOSER_LIGHT_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(lighttype, m_LightType, TDataStrPtr, L"Directional") \
+ HANDLE_COMPOSER_PROPERTY(scope, m_Scope, SObjectRefType, L"") \
+ HANDLE_COMPOSER_PROPERTY(lightdiffuse, m_LightColor, SFloat4, SFloat4(1, 1, 1, 1)) \
+ HANDLE_COMPOSER_PROPERTY(lightspecular, m_SpecularColor, SFloat4, SFloat4(1, 1, 1, 1)) \
+ HANDLE_COMPOSER_PROPERTY(lightambient, m_AmbientColor, SFloat4, SFloat4(0, 0, 0, 1)) \
+ HANDLE_COMPOSER_PROPERTY(brightness, m_Brightness, float, 100.0f) \
+ HANDLE_COMPOSER_PROPERTY(linearfade, m_LinearFade, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(expfade, m_ExpFade, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(areawidth, m_AreaWidth, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(areaheight, m_AreaHeight, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(castshadow, m_CastShadow, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(shdwbias, m_ShadowBias, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(shdwfactor, m_ShadowFactor, float, 5.0f) \
+ HANDLE_COMPOSER_PROPERTY(shdwmapres, m_ShadowMapRes, qt3ds::QT3DSI32, 9) \
+ HANDLE_COMPOSER_PROPERTY(shdwmapfar, m_ShadowMapFar, float, 5000.0f) \
+ HANDLE_COMPOSER_PROPERTY(shdwmapfov, m_ShadowMapFov, float, 90.0f) \
+ HANDLE_COMPOSER_PROPERTY(shdwfilter, m_ShadowFilter, float, 35.0f) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_CAMERA_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(orthographic, m_Orthographic, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(fov, m_Fov, float, 60.f) \
+ HANDLE_COMPOSER_PROPERTY(fovhorizontal, m_FovHorizontal, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(clipnear, m_ClipNear, float, 10.f) \
+ HANDLE_COMPOSER_PROPERTY(clipfar, m_ClipFar, float, 100000.f) \
+ HANDLE_COMPOSER_PROPERTY(scalemode, m_ScaleMode, TDataStrPtr, L"Fit") \
+ HANDLE_COMPOSER_PROPERTY(scaleanchor, m_ScaleAnchor, TDataStrPtr, L"Center") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_EDIT_CAMERA_PROPERTIES HANDLE_COMPOSER_PROPERTY(is3d, m_Is3d, bool, false)
+
+#define ITERATE_COMPOSER_TEXT_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(textstring, m_TextString, TDataStrPtr, L"Text") \
+ HANDLE_COMPOSER_PROPERTY(textcolor, m_TextColor, SFloat4, SFloat4(1, 1, 1, 1)) \
+ HANDLE_COMPOSER_PROPERTY(font, m_Font, TDataStrPtr, L"arial") \
+ HANDLE_COMPOSER_PROPERTY(size, m_Size, float, 24.f) \
+ HANDLE_COMPOSER_PROPERTY(horzalign, m_HorzAlign, TDataStrPtr, L"Center") \
+ HANDLE_COMPOSER_PROPERTY(vertalign, m_VertAlign, TDataStrPtr, L"Middle") \
+ HANDLE_COMPOSER_PROPERTY(leading, m_Leading, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(tracking, m_Tracking, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(dropshadow, m_DropShadow, bool, false) \
+ HANDLE_COMPOSER_PROPERTY(dropshadowstrength, m_DropShadowStrength, float, 80.f) \
+ HANDLE_COMPOSER_PROPERTY(dropshadowoffsetx, m_DropShadowOffsetX, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(dropshadowoffsety, m_DropShadowOffsetY, float, 0.f) \
+ HANDLE_COMPOSER_PROPERTY(wordwrap, m_WordWrap, TDataStrPtr, L"WrapWord") \
+ HANDLE_COMPOSER_PROPERTY(boundingbox, m_BoundingBox, SFloat2, SFloat2(0, 0)) \
+ HANDLE_COMPOSER_PROPERTY(elide, m_Elide, TDataStrPtr, L"ElideNone") \
+ HANDLE_COMPOSER_PROPERTY(enableacceleratedfont, m_EnableAcceleratedFont, bool, false) \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_SLIDE_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(componentid, m_ComponentId, SLong4, 0) \
+ HANDLE_COMPOSER_PROPERTY(playmode, m_PlayMode, TDataStrPtr, L"Looping") \
+ HANDLE_COMPOSER_PROPERTY(playthroughto, m_PlaythroughTo, SStringOrInt, L"Next") \
+ HANDLE_COMPOSER_PROPERTY(initialplaystate, m_InitialPlayState, TDataStrPtr, L"Play") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_ACTION_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(actioneyeball, m_ActionEyeball, bool, true)
+
+#define ITERATE_COMPOSER_ALIAS_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(referencednode, m_ReferencedNode, SObjectRefType, L"") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_PATH_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(pathtype, m_PathType, TDataStrPtr, L"Geometry") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(width, m_Width, float, 5.0f) \
+ HANDLE_COMPOSER_PROPERTY(linearerror, m_LinearError, float, 10) \
+ HANDLE_COMPOSER_PROPERTY(edgetessamount, m_EdgeTessAmount, float, 8) \
+ HANDLE_COMPOSER_PROPERTY(innertessamount, m_InnerTessAmount, float, 8) \
+ HANDLE_COMPOSER_PROPERTY(begincap, m_BeginCap, TDataStrPtr, L"None") \
+ HANDLE_COMPOSER_PROPERTY(begincapoffset, m_BeginCapOffset, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(begincapopacity, m_BeginCapOpacity, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(begincapwidth, m_BeginCapWidth, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(endcap, m_EndCap, TDataStrPtr, L"None") \
+ HANDLE_COMPOSER_PROPERTY(endcapoffset, m_EndCapOffset, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(endcapopacity, m_EndCapOpacity, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(endcapwidth, m_EndCapWidth, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(paintstyle, m_PaintStyle, TDataStrPtr, L"Stroked") \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"")
+
+#define ITERATE_COMPOSER_PATH_ANCHOR_POINT_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY_DUPLICATE(position, m_Position, SFloat2, SFloat2(0.0f, 0.0f)) \
+ HANDLE_COMPOSER_PROPERTY(incomingangle, m_IncomingAngle, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(incomingdistance, m_IncomingDistance, float, 0.0f) \
+ HANDLE_COMPOSER_PROPERTY(outgoingdistance, m_OutgoingDistance, float, 0.0f)
+
+#define ITERATE_COMPOSER_PATH_SUBPATH_PROPERTIES \
+ HANDLE_COMPOSER_PROPERTY(closed, m_Closed, bool, true)
+
+struct ComposerObjectTypes
+{
+ enum Enum {
+ Unknown = 0,
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) name,
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+ ControllableObject
+ };
+ static const wchar_t *Convert(ComposerObjectTypes::Enum inType);
+ static ComposerObjectTypes::Enum Convert(const wchar_t *inType);
+ static ComposerObjectTypes::Enum Convert(const char8_t *inType);
+};
+
+struct ComposerPropertyNames
+{
+ enum Enum {
+ Unknown = 0,
+#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) name,
+#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue)
+#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) name,
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT
+#undef HANDLE_COMPOSER_PROPERTY
+#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE
+ };
+
+ static const wchar_t *Convert(ComposerPropertyNames::Enum inType);
+ static ComposerPropertyNames::Enum Convert(const wchar_t *inType);
+ static const char8_t *ConvertNarrow(ComposerPropertyNames::Enum inType);
+ static ComposerPropertyNames::Enum Convert(const char8_t *inType);
+};
+
+template <typename TDataType>
+struct TypeToDataTypeMap
+{
+ bool force_compile_error;
+};
+template <DataModelDataType::Value TEnum>
+struct DataTypeToTypeMap
+{
+ bool force_compile_error;
+};
+
+#define QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(enumName, type) \
+ template <> \
+ struct TypeToDataTypeMap<type> \
+ { \
+ static DataModelDataType::Value GetDataType() { return enumName; } \
+ }; \
+ template <> \
+ struct DataTypeToTypeMap<enumName> \
+ { \
+ typedef type TDataType; \
+ };
+
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float, float)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float2, SFloat2)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float3, SFloat3)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float4, SFloat4)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Long, qt3ds::QT3DSI32)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::String, TDataStrPtr)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Bool, bool)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Long4, SLong4)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::StringRef, SStringRef)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::StringOrInt, SStringOrInt)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::ObjectRef, SObjectRefType)
+QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::FloatList, TFloatList)
+
+#undef QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE
+
+template <typename TDataType>
+inline DataModelDataType::Value TypeToDataType()
+{
+ return TypeToDataTypeMap<TDataType>::GetDataType();
+}
+
+template <ComposerPropertyNames::Enum TPropName, typename TDataType>
+struct SComposerPropertyDefinition
+{
+ qt3ds::foundation::Option<TDataType> m_DefaultValue;
+ Qt3DSDMPropertyHandle m_Property;
+ SComposerPropertyDefinition(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance,
+ const TDataType &inDefault)
+ : m_DefaultValue(inDefault)
+ {
+ QT3DSDM_LOG_FUNCTION("SComposerPropertyDefinition-1");
+ m_Property = inDataCore.AddProperty(inInstance, ComposerPropertyNames::Convert(TPropName),
+ TypeToDataType<TDataType>());
+ if (m_DefaultValue.hasValue())
+ inDataCore.SetInstancePropertyValue(inInstance, m_Property, m_DefaultValue.getValue());
+ }
+ SComposerPropertyDefinition(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance)
+ {
+ QT3DSDM_LOG_FUNCTION("SComposerPropertyDefinition-2");
+ m_Property = inDataCore.AddProperty(inInstance, ComposerPropertyNames::Convert(TPropName),
+ TypeToDataType<TDataType>());
+ }
+ operator Qt3DSDMPropertyHandle() const { return m_Property; }
+};
+
+// Define all the objects with their properties
+
+template <ComposerObjectTypes::Enum>
+struct SComposerTypePropertyDefinition
+{
+ bool force_compile_error;
+};
+
+#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, dtype) \
+ SComposerPropertyDefinition<ComposerPropertyNames::name, dtype> memberName;
+
+#define HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue) \
+ HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, dtype)
+#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, dtype, defaultValue) \
+ HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue)
+
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ template <> \
+ struct SComposerTypePropertyDefinition<ComposerObjectTypes::name> \
+ { \
+ bool reserved; \
+ propmacro SComposerTypePropertyDefinition(IDataCore &inCore, \
+ Qt3DSDMInstanceHandle inInstance); \
+ };
+
+ITERATE_COMPOSER_OBJECT_TYPES
+
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+#undef HANDLE_COMPOSER_PROPERTY
+#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT
+#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE
+
+struct ComposerTypeDefinitionsHelper
+{
+ // Functions here so we don't have to include UICDMDataCore.h or UICDMMetaData.h
+ static void SetInstanceAsCanonical(IMetaData &inMetaData, Qt3DSDMInstanceHandle inInstance,
+ ComposerObjectTypes::Enum inObjectType);
+ static void SetInstancePropertyValue(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const wchar_t *inPropValue);
+ static void DeriveInstance(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent);
+};
+
+template <ComposerObjectTypes::Enum TEnumType>
+struct SComposerBaseObjectDefinition : public SComposerTypePropertyDefinition<TEnumType>
+{
+ Qt3DSDMInstanceHandle m_Instance;
+ SComposerBaseObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance)
+ : SComposerTypePropertyDefinition<TEnumType>(inCore, inInstance)
+ , m_Instance(inInstance)
+ {
+ QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition");
+ ComposerTypeDefinitionsHelper::SetInstanceAsCanonical(inMetaData, inInstance, TEnumType);
+ }
+
+ template <ComposerObjectTypes::Enum TBaseType>
+ void Derive(IDataCore &inCore, const SComposerBaseObjectDefinition<TBaseType> &inParent)
+ {
+ QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition::Derive");
+ ComposerTypeDefinitionsHelper::DeriveInstance(inCore, m_Instance, inParent.m_Instance);
+ }
+ void SetType(IDataCore &inCore,
+ const SComposerBaseObjectDefinition<ComposerObjectTypes::Typed> &inParent)
+ {
+ QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition::SetInstancePropertyValue");
+ ComposerTypeDefinitionsHelper::SetInstancePropertyValue(
+ inCore, m_Instance, inParent.m_TypeProp, ComposerObjectTypes::Convert(TEnumType));
+ }
+ void TypedDerive(IDataCore &inCore,
+ const SComposerBaseObjectDefinition<ComposerObjectTypes::Typed> &inParent)
+ {
+ QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition::TypedDerive");
+ Derive(inCore, inParent);
+ SetType(inCore, inParent);
+ }
+};
+
+template <ComposerObjectTypes::Enum TEnumType>
+struct SComposerObjectDefinition : public SComposerBaseObjectDefinition<TEnumType>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance)
+ : SComposerBaseObjectDefinition<TEnumType>(inCore, inMetaData, inInstance)
+ {
+ }
+};
+
+// Base class of slides
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Slide>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Slide>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Named> &inNamed)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Slide>(inCore, inMetaData, inInstance)
+ {
+ TypedDerive(inCore, inTyped);
+ Derive(inCore, inNamed);
+ }
+};
+
+// Base class of actions
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Action>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Action>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Action>(inCore, inMetaData, inInstance)
+ {
+ TypedDerive(inCore, inTyped);
+ }
+};
+
+// Base class of assets
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Asset>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Asset>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Guided> &inGuided,
+ SComposerObjectDefinition<ComposerObjectTypes::Named> &inNamed)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Asset>(inCore, inMetaData, inInstance)
+ {
+ TypedDerive(inCore, inTyped);
+ Derive(inCore, inGuided);
+ Derive(inCore, inNamed);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Scene>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Scene>
+{
+ SComposerObjectDefinition(
+ IDataCore &inCore, IMetaData &inMetaData, Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset,
+ SComposerObjectDefinition<ComposerObjectTypes::SlideOwner> &inSlideOwner)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Scene>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inAsset);
+ Derive(inCore, inSlideOwner);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Image>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Image>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Image>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::MaterialBase>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::MaterialBase>
+
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::MaterialBase>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Lightmaps>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Lightmaps>
+
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::MaterialBase> &inBase)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Lightmaps>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inBase);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Material>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Material>
+
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Lightmaps> &inBase)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Material>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inBase);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::CustomMaterial>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::CustomMaterial>
+
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Lightmaps> &inBase)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::CustomMaterial>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inBase);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::ReferencedMaterial>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::ReferencedMaterial>
+
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Lightmaps> &inBase)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::ReferencedMaterial>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inBase);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Behavior>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Behavior>
+
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Behavior>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Effect>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Effect>
+
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Effect>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Node>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Node>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Node>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Layer>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Layer>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Layer>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Model>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Model>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Model>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Group>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Group>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Group>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Light>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Light>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Light>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Camera>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Camera>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Camera>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Text>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Text>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Text>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Component>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Component>
+{
+ SComposerObjectDefinition(
+ IDataCore &inCore, IMetaData &inMetaData, Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode,
+ SComposerObjectDefinition<ComposerObjectTypes::SlideOwner> &inSlideOwner)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Component>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inNode);
+ Derive(inCore, inSlideOwner);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::RenderPlugin>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::RenderPlugin>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::RenderPlugin>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Alias>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Alias>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Alias>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::Path>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::Path>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::Path>(inCore, inMetaData, inInstance)
+ {
+ Derive(inCore, inNode);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::PathAnchorPoint>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::PathAnchorPoint>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::PathAnchorPoint>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+template <>
+struct SComposerObjectDefinition<ComposerObjectTypes::SubPath>
+ : public SComposerBaseObjectDefinition<ComposerObjectTypes::SubPath>
+{
+ SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData,
+ Qt3DSDMInstanceHandle inInstance,
+ SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped,
+ SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset)
+ : SComposerBaseObjectDefinition<ComposerObjectTypes::SubPath>(inCore, inMetaData,
+ inInstance)
+ {
+ Derive(inCore, inAsset);
+ SetType(inCore, inTyped);
+ }
+};
+
+// Container object for all of the object definitions
+class SComposerObjectDefinitions
+{
+public:
+#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \
+ SComposerObjectDefinition<ComposerObjectTypes::name> m_##name;
+ ITERATE_COMPOSER_OBJECT_TYPES
+#undef HANDLE_COMPOSER_OBJECT_TYPE
+
+ SComposerObjectDefinitions(IDataCore &inDataCore, IMetaData &inMetaData);
+ SComposerObjectDefinitions() = default;
+ ~SComposerObjectDefinitions() = default;
+
+ // RTTI API
+ bool IsA(Qt3DSDMInstanceHandle inInstance, ComposerObjectTypes::Enum inType);
+ // Could easily return None, meaning we can't identify the object type.
+ // Checks the type of the first derivation parent, so this won't ever return
+ // SlideOwner, for instance.
+ ComposerObjectTypes::Enum GetType(Qt3DSDMInstanceHandle inInstance);
+
+ Qt3DSDMInstanceHandle GetInstanceForType(ComposerObjectTypes::Enum inType);
+private:
+ IDataCore &m_DataCore;
+ SComposerObjectDefinitions(const SComposerObjectDefinitions&) = delete;
+ SComposerObjectDefinitions& operator=(const SComposerObjectDefinitions&) = delete;
+};
+}
diff --git a/src/dm/systems/Qt3DSDMDataCore.h b/src/dm/systems/Qt3DSDMDataCore.h
new file mode 100644
index 0000000..793cddb
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMDataCore.h
@@ -0,0 +1,320 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_DATACORE_H
+#define QT3DSDM_DATACORE_H
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMPropertyDefinition.h"
+#include "HandleSystemBase.h"
+#include "Qt3DSDMMetaData.h"
+#include "Qt3DSDMValue.h"
+
+namespace qt3dsdm {
+
+typedef std::pair<Qt3DSDMPropertyHandle, SValue> TPropertyHandleValuePair;
+typedef std::vector<TPropertyHandleValuePair> TPropertyHandleValuePairList;
+
+class IInstancePropertyCore
+{
+public:
+ virtual ~IInstancePropertyCore() {}
+
+ /**
+ * Find a given instance property by name. May return an invalid handle.
+ */
+ virtual Qt3DSDMPropertyHandle
+ GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const = 0;
+ /**
+ * Get the entire list of instance properties;
+ */
+ virtual void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const = 0;
+ // Get the properties that are stored only on this instance, not on any parents.
+ virtual void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle,
+ TPropertyHandleValuePairList &outValues) = 0;
+ /**
+ * Return true if this property is on this instance or one of its parents.
+ */
+ virtual bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+
+ /**
+ * Does this value match the approperty property type.
+ * error - PropertyNotFound
+ * error - ValueTypeError
+ */
+ virtual void CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) const = 0;
+ /**
+ * Get this property from this instance. This includes looking up the default value. If the
+ *instance doesn't have the property
+ * and it has no default the return value is false.
+ * error - InstanceNotFound
+ * error - PropertyNotFound if this property doesn't exist on this instance or doesn't exist.
+ */
+ virtual bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const = 0;
+ /**
+ * Set this property on this instance.
+ * error - InstanceNotFound
+ * error - PropertyNotFound if this property doesn't exist on this instance or doesn't exist.
+ * error - ValueTypeError if this value is of the wrong type
+ */
+ virtual void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+};
+
+typedef std::shared_ptr<IInstancePropertyCore> TInstancePropertyCorePtr;
+
+class IStringTable;
+
+/**
+ * Primary interface to data model system. This allows you to define 'classes', which are
+ *really just
+ * collections of properties, and instances of those classes. A zero handle value is regarded
+ *as empty.
+ */
+class IDataCore : public IHandleBase, public IInstancePropertyCore
+{
+public:
+ virtual ~IDataCore() {}
+
+ // Bookkeeping
+ virtual IStringTable &GetStringTable() const = 0;
+ virtual std::shared_ptr<IStringTable> GetStringTablePtr() const = 0;
+
+ //===============================================================
+ // Instances
+ //===============================================================
+ /**
+ * Create a new instance of a class. Instances can be named, in which case
+ * they are sometimes treated differently when serialized. If the name is null
+ * or has no length then it is ignored. If the name is non-null, then a check is
+ * run as named instances must have unique names. When a named instance is a parent
+ * of another instance, only its name is serialized out; not its handle thus you can safely
+ * use names as inter-application instance handles.
+ * May use a target id to specify what the ideal id is; id must not exist.
+ * - error DuplicateInstanceName
+ */
+ virtual Qt3DSDMInstanceHandle
+ CreateInstance(Qt3DSDMInstanceHandle inTargetId = Qt3DSDMInstanceHandle()) = 0;
+ /**
+ * Delete an instance.
+ * error - InstanceNotFound
+ */
+ virtual void DeleteInstance(Qt3DSDMInstanceHandle inHandle) = 0;
+ /**
+ * Return all the instances in the system.
+ */
+ virtual void GetInstances(TInstanceHandleList &outInstances) const = 0;
+ /**
+ * Return all the instances in the system that is derived from parent.
+ */
+ virtual void GetInstancesDerivedFrom(TInstanceHandleList &outInstances,
+ Qt3DSDMInstanceHandle inParentHandle) const = 0;
+
+ //===============================================================
+ // Instance Derivation
+ //===============================================================
+ /**
+ * Derive an instance from another instance. This implies a rebuild of
+ * the aggregate properties of a given instance.
+ * error - InstanceNotFound if either instance or parent aren't found
+ */
+ virtual void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) = 0;
+ /**
+ * Return a count of the parent's of a given instance.
+ * error - InstanceNotFound
+ */
+ virtual void GetInstanceParents(Qt3DSDMInstanceHandle inHandle,
+ TInstanceHandleList &outParents) const = 0;
+
+ /**
+ * Returns true if the instance is derived from the parent somehow.
+ */
+ virtual bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const = 0;
+ //===============================================================
+
+ //===============================================================
+ // Class Properties
+ //===============================================================
+ /**
+ * Add a new property to a given instances. You can use this to overshadow properties
+ * on base instances but you can't add two properties of the same name to a given
+ * instance.
+ * error - InstanceNotFound
+ * error - PropertyExists if the property already exists on this class
+ * error - ValueTypeError if the default value exists and is if a different type than
+ *inPropType
+ */
+ virtual Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName,
+ DataModelDataType::Value inPropType) = 0;
+ /**
+ * Return the property definition that corresponds to a given property value.
+ */
+ virtual const Qt3DSDMPropertyDefinition &GetProperty(Qt3DSDMPropertyHandle inProperty) const = 0;
+ /**
+ * Return the properties specific to this instance, not including properties
+ * gained by derivation
+ */
+ virtual void GetInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const = 0;
+ /**
+ * Remove a property from an instance. Instances will no long have this property accessible
+ *nor will
+ * child instances.
+ */
+ virtual void RemoveProperty(Qt3DSDMPropertyHandle inProperty) = 0;
+ /**
+ * Copy properties (definitions & values) specific to one instance, not including properties
+ * gained by derivation, to another instance.
+ */
+ virtual void CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance,
+ Qt3DSDMInstanceHandle inDestInstance) = 0;
+ /**
+ * Removed cached intermediate values from the instance. DataModel pull properties from the
+ *inheritance hierarchy chain
+ * up to the current instance when someone requests a property in order to make the next
+ *request quicker. This breaks
+ * some forms of updating where a parent's default value gets changed and the instance won't
+ *reflect it (until you
+ * save/load the file).
+ */
+ //===============================================================
+ virtual void RemoveCachedValues(Qt3DSDMInstanceHandle inInstance) = 0;
+
+ //===============================================================
+ // Handle validation
+ //===============================================================
+ /**
+ * Is valid and is instances
+ */
+ virtual bool IsInstance(int inHandle) const = 0;
+ /**
+ * is valid and is property
+ */
+ virtual bool IsProperty(int inHandle) const = 0;
+};
+
+typedef std::shared_ptr<IDataCore> TDataCorePtr;
+
+class IPropertySystem : public IHandleBase
+{
+public:
+ virtual ~IPropertySystem() {}
+
+ virtual Qt3DSDMInstanceHandle CreateInstance() = 0;
+ virtual void DeleteInstance(Qt3DSDMInstanceHandle inHandle) = 0;
+ virtual void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) = 0;
+
+ virtual void GetInstances(TInstanceHandleList &outInstances) const = 0;
+
+ virtual Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName,
+ DataModelDataType::Value inPropType) = 0;
+
+ virtual Qt3DSDMPropertyHandle
+ GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const = 0;
+ virtual void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const = 0;
+ virtual bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+
+ virtual bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const = 0;
+ virtual void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+
+ virtual bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const = 0;
+
+ virtual DataModelDataType::Value GetDataType(Qt3DSDMPropertyHandle inProperty) const = 0;
+ virtual TCharStr GetName(Qt3DSDMPropertyHandle inProperty) const = 0;
+ virtual TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+ virtual AdditionalMetaDataType::Value
+ GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+ virtual TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+ virtual Qt3DSDMInstanceHandle GetPropertyOwner(Qt3DSDMPropertyHandle inProperty) const = 0;
+
+ virtual QVector<Qt3DSDMPropertyHandle> GetControllableProperties(
+ Qt3DSDMInstanceHandle inInst) const = 0;
+
+};
+typedef std::shared_ptr<IPropertySystem> TPropertySystemPtr;
+
+template <typename TCoreType>
+inline SValue GetInstancePropertyValue(TCoreType inCore, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ SValue retval;
+ if (!inCore->GetInstancePropertyValue(inInstance, inProperty, retval))
+ throw PropertyNotFound(L"");
+ return retval;
+}
+
+template <typename TDataType, typename TCoreType>
+inline TDataType GetSpecificInstancePropertyValue(TCoreType inDataCore,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ return qt3dsdm::get<TDataType>(GetInstancePropertyValue(inDataCore, inInstance, inProperty));
+}
+
+template <typename TDataType, typename TCoreType>
+inline TDataType GetNamedInstancePropertyValue(TCoreType inDataCore,
+ Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inName)
+{
+ Qt3DSDMPropertyHandle theProperty =
+ inDataCore->GetAggregateInstancePropertyByName(inInstance, inName);
+ return GetSpecificInstancePropertyValue<TDataType, TCoreType>(inDataCore, inInstance,
+ theProperty);
+}
+
+inline Qt3DSDMPropertyHandle AddPropertyWithValue(IPropertySystem &inPropertySystem,
+ Qt3DSDMInstanceHandle inInstance, TCharPtr inName,
+ DataModelDataType::Value inDataType,
+ const SValue &inValue)
+{
+ Qt3DSDMPropertyHandle theProperty(inPropertySystem.AddProperty(inInstance, inName, inDataType));
+ inPropertySystem.SetInstancePropertyValue(inInstance, theProperty, inValue);
+ return theProperty;
+}
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMDataTypes.h b/src/dm/systems/Qt3DSDMDataTypes.h
new file mode 100644
index 0000000..7a7157f
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMDataTypes.h
@@ -0,0 +1,891 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_DATA_H
+#define QT3DSDM_DATA_H
+
+#include <memory>
+#include <functional>
+
+#include "Qt3DSDMErrors.h"
+#include "Qt3DSDMStringTable.h"
+#include "Qt3DSDMWindowsCompatibility.h"
+#include <stdexcept>
+#include <vector>
+#include <map>
+#include <set>
+#include <EABase/eabase.h> //char8_t, etc.
+#include <EASTL/string.h>
+#include <EASTL/vector.h>
+#include "foundation/StrConvertUTF.h"
+#include "foundation/Qt3DSDiscriminatedUnion.h"
+
+#include <QObject>
+
+namespace qt3dsdm {
+
+typedef const wchar_t *TCharPtr;
+struct Qt3DSDMStr : public eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType>
+{
+ typedef qt3ds::foundation::TWCharEASTLConverter::TCharType TCharType;
+ typedef eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> TStrType;
+ Qt3DSDMStr() {}
+ Qt3DSDMStr(const wchar_t *inStr)
+ : TStrType(qt3ds::NVUnionCast<const TCharType *>(inStr))
+ {
+ }
+ Qt3DSDMStr(const TStrType &inOther)
+ : TStrType(inOther)
+ {
+ }
+
+ const wchar_t *wide_str() const { return reinterpret_cast<const wchar_t *>(c_str()); }
+ bool operator==(const Qt3DSDMStr &inOther) const { return TStrType::compare(inOther) == 0; }
+ bool operator!=(const Qt3DSDMStr &inOther) const { return TStrType::compare(inOther) != 0; }
+ bool operator==(const wchar_t *inOther) const
+ {
+ return TStrType::compare(reinterpret_cast<const TCharType *>(inOther)) == 0;
+ }
+ bool operator!=(const wchar_t *inOther) const
+ {
+ return TStrType::compare(reinterpret_cast<const TCharType *>(inOther)) != 0;
+ }
+
+ TStrType::size_type find_first_of(const wchar_t *p, size_type position = 0) const
+ {
+ return TStrType::find_first_of(reinterpret_cast<const TCharType *>(p), position);
+ }
+ TStrType::size_type find_first_not_of(const wchar_t *p, size_type position = 0) const
+ {
+ return TStrType::find_first_not_of(reinterpret_cast<const TCharType *>(p), position);
+ }
+ TStrType::size_type find_last_not_of(const wchar_t *p,
+ size_type position = TStrType::npos) const
+ {
+ return TStrType::find_last_not_of(reinterpret_cast<const TCharType *>(p), position);
+ }
+ TStrType::size_type find(const wchar_t *p, size_type position = 0) const
+ {
+ return TStrType::find(reinterpret_cast<const TCharType *>(p), position);
+ }
+ TStrType::size_type find(wchar_t p, size_type position = 0) const
+ {
+ return TStrType::find(static_cast<TCharType>(p), position);
+ }
+ TStrType::size_type rfind(const wchar_t *p, size_type position = TStrType::npos) const
+ {
+ return TStrType::rfind(reinterpret_cast<const TCharType *>(p), position);
+ }
+ TStrType::size_type rfind(wchar_t p, size_type position = TStrType::npos) const
+ {
+ return TStrType::rfind(p, position);
+ }
+ Qt3DSDMStr replace(size_type position, size_type length, const wchar_t *inNewStr)
+ {
+ return TStrType::replace(position, length, reinterpret_cast<const TCharType *>(inNewStr));
+ }
+
+ void append(const wchar_t *p) { TStrType::append(reinterpret_cast<const TCharType *>(p)); }
+ void append(const wchar_t *p, size_type position, size_type n)
+ {
+ TStrType::append(reinterpret_cast<const TCharType *>(p), position, n);
+ }
+ void append(const Qt3DSDMStr &p) { TStrType::append(p); }
+ void assign(const wchar_t *p) { TStrType::assign(reinterpret_cast<const TCharType *>(p)); }
+ void assign(const Qt3DSDMStr &p) { TStrType::assign(p); }
+};
+typedef Qt3DSDMStr TCharStr;
+typedef std::vector<wchar_t> TCharList;
+typedef eastl::vector<TCharStr> TCharStrList;
+typedef std::map<TCharStr, int> TCharStrIntMap;
+typedef std::map<int, TCharStr> TIntTCharStrMap;
+typedef std::vector<int> TIntList;
+typedef std::set<int> TIntSet;
+typedef eastl::vector<float> TFloatList;
+
+template <typename TDataType>
+class CImmutableVector : private std::vector<TDataType>
+{
+public:
+ typedef std::vector<TDataType> base;
+
+ CImmutableVector(const std::vector<TDataType> &inSrc)
+ : base(inSrc)
+ {
+ }
+ CImmutableVector(const CImmutableVector &inSrc)
+ : base(inSrc)
+ {
+ }
+
+ CImmutableVector &operator=(const CImmutableVector &inSrc)
+ {
+ base::operator=(inSrc);
+ return *this;
+ }
+
+ typename std::vector<TDataType>::const_iterator begin() const { return base::begin(); }
+ typename std::vector<TDataType>::const_iterator end() const { return base::end(); }
+
+ size_t size() const { return base::size(); }
+
+ const TDataType &at(int inIndex) const { return base::at(inIndex); }
+ const TDataType &operator[](int inIndex) const { return base::at(inIndex); }
+};
+
+typedef CImmutableVector<TCharStr> TImmutableCharStrList;
+typedef std::shared_ptr<TImmutableCharStrList> TImmutableCharStrListPtr;
+
+class CDataStr
+{
+ TCharList m_Data;
+
+public:
+ CDataStr() {}
+ CDataStr(TCharList &inData) { m_Data.swap(inData); }
+ CDataStr(const wchar_t *inData)
+ {
+ if (inData && *inData)
+ m_Data.insert(m_Data.begin(), inData, inData + wcslen(inData));
+ m_Data.push_back(0);
+ }
+ CDataStr(const wchar_t *inData, size_t inLen)
+ {
+ if (inData && *inData)
+ m_Data.insert(m_Data.begin(), inData, inData + inLen);
+ if (m_Data.size() > 0 && m_Data.back() != 0)
+ m_Data.push_back(0);
+ }
+ CDataStr(const CDataStr &inOther)
+ : m_Data(inOther.m_Data)
+ {
+ }
+ virtual ~CDataStr() {}
+
+ CDataStr &operator=(const CDataStr &inOther)
+ {
+ m_Data = inOther.m_Data;
+ return *this;
+ }
+ const wchar_t *GetData() const { return m_Data.size() <= 1 ? L"" : &(*m_Data.begin()); }
+ size_t GetLength() const { return m_Data.size() > 1 ? m_Data.size() - 1 : 0; }
+ bool operator==(const CDataStr &inOther) const { return m_Data == inOther.m_Data; }
+ QString toQString() const { return QString::fromWCharArray(GetData()); }
+};
+
+typedef std::shared_ptr<CDataStr> TDataStrPtr;
+
+struct SFloat2
+{
+ float m_Floats[2];
+ SFloat2(float f1 = 0, float f2 = 0)
+ {
+ m_Floats[0] = f1;
+ m_Floats[1] = f2;
+ }
+ SFloat2(const SFloat2 &inOther) { operator=(inOther); }
+ SFloat2 &operator=(const SFloat2 &inOther)
+ {
+ m_Floats[0] = inOther.m_Floats[0];
+ m_Floats[1] = inOther.m_Floats[1];
+ return *this;
+ }
+ bool operator==(const SFloat2 &other) const
+ {
+ return m_Floats[0] == other.m_Floats[0] && m_Floats[1] == other.m_Floats[1];
+ }
+ float &operator[](size_t inIndex)
+ {
+ switch (inIndex) {
+ default:
+ throw std::out_of_range("");
+ case 0:
+ case 1:
+ return m_Floats[inIndex];
+ }
+ }
+ const float &operator[](size_t inIndex) const
+ {
+ switch (inIndex) {
+ default:
+ throw std::out_of_range("");
+ case 0:
+ case 1:
+ return m_Floats[inIndex];
+ }
+ }
+};
+
+struct SFloat3
+{
+ float m_Floats[3];
+
+ SFloat3(float f1 = 0, float f2 = 0, float f3 = 0)
+ {
+ m_Floats[0] = f1;
+ m_Floats[1] = f2;
+ m_Floats[2] = f3;
+ }
+ SFloat3(const SFloat3 &inOther) { operator=(inOther); }
+ SFloat3 &operator=(const SFloat3 &inOther)
+ {
+ m_Floats[0] = inOther.m_Floats[0];
+ m_Floats[1] = inOther.m_Floats[1];
+ m_Floats[2] = inOther.m_Floats[2];
+ return *this;
+ }
+
+ bool operator==(const SFloat3 &other) const
+ {
+ return m_Floats[0] == other.m_Floats[0] && m_Floats[1] == other.m_Floats[1]
+ && m_Floats[2] == other.m_Floats[2];
+ }
+
+ float &operator[](size_t inIndex)
+ {
+ switch (inIndex) {
+ default:
+ throw std::out_of_range("");
+ case 0:
+ case 1:
+ case 2:
+ return m_Floats[inIndex];
+ }
+ }
+ const float &operator[](size_t inIndex) const
+ {
+ switch (inIndex) {
+ default:
+ throw std::out_of_range("");
+ case 0:
+ case 1:
+ case 2:
+ return m_Floats[inIndex];
+ }
+ }
+};
+
+struct SFloat4
+{
+ float m_Floats[4];
+
+ SFloat4(float f1 = 0, float f2 = 0, float f3 = 0, float f4 = 1)
+ {
+ m_Floats[0] = f1;
+ m_Floats[1] = f2;
+ m_Floats[2] = f3;
+ m_Floats[3] = f4;
+ }
+ SFloat4(const SFloat4 &inOther) { operator=(inOther); }
+ SFloat4 &operator=(const SFloat4 &inOther)
+ {
+ m_Floats[0] = inOther.m_Floats[0];
+ m_Floats[1] = inOther.m_Floats[1];
+ m_Floats[2] = inOther.m_Floats[2];
+ m_Floats[3] = inOther.m_Floats[3];
+ return *this;
+ }
+
+ bool operator==(const SFloat4 &other) const
+ {
+ return m_Floats[0] == other.m_Floats[0] && m_Floats[1] == other.m_Floats[1]
+ && m_Floats[2] == other.m_Floats[2] && m_Floats[3] == other.m_Floats[3];
+ }
+
+ float &operator[](size_t inIndex)
+ {
+ if (inIndex < 4)
+ return m_Floats[inIndex];
+
+ throw std::out_of_range("");
+ }
+ const float &operator[](size_t inIndex) const
+ {
+ if (inIndex < 4)
+ return m_Floats[inIndex];
+
+ throw std::out_of_range("");
+ }
+};
+
+struct SLong4
+{
+ qt3ds::QT3DSU32 m_Longs[4];
+
+ SLong4(qt3ds::QT3DSU32 l1 = 0,
+ qt3ds::QT3DSU32 l2 = 0,
+ qt3ds::QT3DSU32 l3 = 0,
+ qt3ds::QT3DSU32 l4 = 0)
+ {
+ m_Longs[0] = l1;
+ m_Longs[1] = l2;
+ m_Longs[2] = l3;
+ m_Longs[3] = l4;
+ }
+ SLong4(const SLong4 &inOther) { operator=(inOther); }
+ SLong4 &operator=(const SLong4 &inOther)
+ {
+ m_Longs[0] = inOther.m_Longs[0];
+ m_Longs[1] = inOther.m_Longs[1];
+ m_Longs[2] = inOther.m_Longs[2];
+ m_Longs[3] = inOther.m_Longs[3];
+ return *this;
+ }
+
+ bool operator==(const SLong4 &other) const
+ {
+ return m_Longs[0] == other.m_Longs[0] && m_Longs[1] == other.m_Longs[1]
+ && m_Longs[2] == other.m_Longs[2] && m_Longs[3] == other.m_Longs[3];
+ }
+
+ bool operator<(const SLong4 &other) const
+ {
+ if (m_Longs[0] < other.m_Longs[0])
+ return true;
+ else if (m_Longs[0] == other.m_Longs[0]) {
+ if (m_Longs[1] < other.m_Longs[1])
+ return true;
+ else if (m_Longs[1] == other.m_Longs[1]) {
+ if (m_Longs[2] < other.m_Longs[2])
+ return true;
+ else if (m_Longs[3] < other.m_Longs[3])
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool Valid() const
+ {
+ bool retval = false;
+ for (int idx = 0; idx < 4; ++idx)
+ retval = retval || m_Longs[0] > 0;
+ return retval;
+ }
+};
+
+typedef std::vector<SLong4> TLong4Vec;
+
+struct SSizet4
+{
+ size_t m_Longs[4];
+
+ SSizet4(size_t l1 = 0, size_t l2 = 0, size_t l3 = 0, size_t l4 = 0)
+ {
+ m_Longs[0] = l1;
+ m_Longs[1] = l2;
+ m_Longs[2] = l3;
+ m_Longs[3] = l4;
+ }
+ SSizet4(const SSizet4 &inOther) { operator=(inOther); }
+ SSizet4 &operator=(const SSizet4 &inOther)
+ {
+ m_Longs[0] = inOther.m_Longs[0];
+ m_Longs[1] = inOther.m_Longs[1];
+ m_Longs[2] = inOther.m_Longs[2];
+ m_Longs[3] = inOther.m_Longs[3];
+ return *this;
+ }
+
+ bool operator==(const SSizet4 &other) const
+ {
+ return m_Longs[0] == other.m_Longs[0] && m_Longs[1] == other.m_Longs[1]
+ && m_Longs[2] == other.m_Longs[2] && m_Longs[3] == other.m_Longs[3];
+ }
+
+ bool operator<(const SSizet4 &other) const
+ {
+ if (m_Longs[0] < other.m_Longs[0])
+ return true;
+ else if (m_Longs[0] == other.m_Longs[0]) {
+ if (m_Longs[1] < other.m_Longs[1])
+ return true;
+ else if (m_Longs[1] == other.m_Longs[1]) {
+ if (m_Longs[2] < other.m_Longs[2])
+ return true;
+ else if (m_Longs[3] < other.m_Longs[3])
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool Valid() const
+ {
+ bool retval = false;
+ for (int idx = 0; idx < 4; ++idx)
+ retval = retval || m_Longs[0] > 0;
+ return retval;
+ }
+};
+
+inline bool IsTrivial(const wchar_t *inStr)
+{
+ return inStr == NULL || *inStr == 0;
+}
+inline const wchar_t *NonNull(const wchar_t *inStr)
+{
+ return inStr ? inStr : L"";
+}
+inline bool AreEqual(const wchar_t *lhs, const wchar_t *rhs)
+{
+ return wcscmp(NonNull(lhs), NonNull(rhs)) == 0;
+}
+
+inline bool IsTrivial(const char8_t *inStr)
+{
+ return inStr == NULL || *inStr == 0;
+}
+inline const char8_t *NonNull(const char8_t *inStr)
+{
+ return inStr ? inStr : "";
+}
+inline bool AreEqual(const char8_t *lhs, const char8_t *rhs)
+{
+ return strcmp(NonNull(lhs), NonNull(rhs)) == 0;
+}
+
+inline bool AreEqualCaseless(const char8_t *lhs, const char8_t *rhs)
+{
+ if (IsTrivial(lhs) && IsTrivial(rhs))
+ return true;
+ if (IsTrivial(lhs) || IsTrivial(rhs))
+ return false;
+ for (; *lhs && *rhs; ++lhs, ++rhs)
+ if (tolower(*lhs) != tolower(*rhs))
+ return false;
+ if (*lhs || *rhs)
+ return false;
+ return true;
+}
+
+struct SStringRef
+{
+ const wchar_t *m_Id;
+
+ SStringRef(const wchar_t *id = L"")
+ : m_Id(NonNull(id))
+ {
+ }
+
+ operator const wchar_t *() const { return m_Id; }
+ bool operator==(const SStringRef &inOther) const { return AreEqual(m_Id, inOther.m_Id); }
+};
+}
+
+// Traits specializations have to be in the same namespace as they were first declared.
+namespace qt3ds {
+namespace foundation {
+
+ template <>
+ struct DestructTraits<qt3dsdm::SFloat2>
+ {
+ void destruct(qt3dsdm::SFloat2 &) {}
+ };
+ template <>
+ struct DestructTraits<qt3dsdm::SFloat3>
+ {
+ void destruct(qt3dsdm::SFloat3 &) {}
+ };
+ template <>
+ struct DestructTraits<qt3dsdm::SFloat4>
+ {
+ void destruct(qt3dsdm::SFloat4 &) {}
+ };
+ template <>
+ struct DestructTraits<qt3dsdm::SLong4>
+ {
+ void destruct(qt3dsdm::SLong4 &) {}
+ };
+ template <>
+ struct DestructTraits<qt3dsdm::SStringRef>
+ {
+ void destruct(qt3dsdm::SStringRef &) {}
+ };
+
+ template <>
+ struct EqualVisitorTraits<qt3dsdm::TDataStrPtr>
+ {
+ bool operator()(const qt3dsdm::TDataStrPtr &lhs, const qt3dsdm::TDataStrPtr &rhs)
+ {
+ if (lhs && rhs)
+ return *lhs == *rhs;
+ if (lhs || rhs)
+ return false;
+ return true;
+ }
+ };
+}
+}
+
+namespace qt3dsdm {
+
+using qt3ds::NVUnionCast;
+
+struct ObjectReferenceType
+{
+ enum Enum {
+ Unknown = 0,
+ Absolute = 1,
+ Relative = 2,
+ };
+};
+
+template <typename TDataType>
+struct SObjectRefTypeTraits
+{
+};
+
+template <>
+struct SObjectRefTypeTraits<SLong4>
+{
+ ObjectReferenceType::Enum getType() { return ObjectReferenceType::Absolute; }
+};
+template <>
+struct SObjectRefTypeTraits<TDataStrPtr>
+{
+ ObjectReferenceType::Enum getType() { return ObjectReferenceType::Relative; }
+};
+
+struct SObjectRefUnionTraits
+{
+ typedef ObjectReferenceType::Enum TIdType;
+ enum {
+ TBufferSize = sizeof(SSizet4),
+ };
+
+ static ObjectReferenceType::Enum getNoDataId() { return ObjectReferenceType::Unknown; }
+
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return SObjectRefTypeTraits<TDataType>().getType();
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case ObjectReferenceType::Absolute:
+ return inVisitor(*NVUnionCast<SLong4 *>(inData));
+ case ObjectReferenceType::Relative:
+ return inVisitor(*NVUnionCast<TDataStrPtr *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case ObjectReferenceType::Unknown:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case ObjectReferenceType::Absolute:
+ return inVisitor(*NVUnionCast<const SLong4 *>(inData));
+ case ObjectReferenceType::Relative:
+ return inVisitor(*NVUnionCast<const TDataStrPtr *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case ObjectReferenceType::Unknown:
+ return inVisitor();
+ }
+ }
+};
+
+typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<SObjectRefUnionTraits,
+ SObjectRefUnionTraits::TBufferSize>,
+ SObjectRefUnionTraits::TBufferSize>
+ TObjRefUnionType;
+
+template <typename TDataType>
+struct Qt3DSDMGetter
+{
+};
+
+template <typename TRetType, typename TDataType>
+TRetType get(const TDataType &inType)
+{
+ return Qt3DSDMGetter<TDataType>().template doGet<TRetType>(inType);
+}
+
+template <>
+struct Qt3DSDMGetter<TObjRefUnionType>
+{
+ template <typename TRetType>
+ TRetType doGet(const TObjRefUnionType &inValue)
+ {
+ return inValue.getData<TRetType>();
+ }
+};
+
+// Either an absolute reference (SLong4) or a relative reference (string)
+struct SObjectRefType
+{
+ TObjRefUnionType m_Value;
+
+ SObjectRefType(const TDataStrPtr &inValue)
+ : m_Value(inValue)
+ {
+ }
+ SObjectRefType(const SLong4 &inValue)
+ : m_Value(inValue)
+ {
+ }
+ SObjectRefType(const SObjectRefType &inOther)
+ : m_Value(inOther.m_Value)
+ {
+ }
+ SObjectRefType() {}
+ SObjectRefType &operator=(const SObjectRefType &inOther)
+ {
+ m_Value = inOther.m_Value;
+ return *this;
+ }
+ ObjectReferenceType::Enum GetReferenceType() const { return m_Value.getType(); }
+ bool operator==(const SObjectRefType &inOther) const { return m_Value == inOther.m_Value; }
+};
+
+inline bool Equals(const SObjectRefType &lhs, const SObjectRefType &rhs)
+{
+ return lhs == rhs;
+}
+
+struct SStringOrIntTypes
+{
+ enum Enum {
+ Unknown = 0,
+ Int,
+ String,
+ };
+};
+
+template <typename TDataType>
+struct SStringOrIntTypeTraits
+{
+};
+
+template <>
+struct SStringOrIntTypeTraits<long>
+{
+ SStringOrIntTypes::Enum getType() { return SStringOrIntTypes::Int; }
+};
+template <>
+struct SStringOrIntTypeTraits<int>
+{
+ SStringOrIntTypes::Enum getType() { return SStringOrIntTypes::Int; }
+};
+template <>
+struct SStringOrIntTypeTraits<TDataStrPtr>
+{
+ SStringOrIntTypes::Enum getType() { return SStringOrIntTypes::String; }
+};
+
+struct SStringOrIntUnionTraits
+{
+ typedef SStringOrIntTypes::Enum TIdType;
+ enum {
+ TBufferSize = sizeof(TDataStrPtr),
+ };
+
+ static SStringOrIntTypes::Enum getNoDataId() { return SStringOrIntTypes::Unknown; }
+
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return SStringOrIntTypeTraits<TDataType>().getType();
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case SStringOrIntTypes::Int:
+ return inVisitor(*NVUnionCast<long *>(inData));
+ case SStringOrIntTypes::String:
+ return inVisitor(*NVUnionCast<TDataStrPtr *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case SStringOrIntTypes::Unknown:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case SStringOrIntTypes::Int:
+ return inVisitor(*NVUnionCast<const qt3ds::QT3DSI32 *>(inData));
+ case SStringOrIntTypes::String:
+ return inVisitor(*NVUnionCast<const TDataStrPtr *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case SStringOrIntTypes::Unknown:
+ return inVisitor();
+ }
+ }
+};
+
+typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<SStringOrIntUnionTraits,
+ SStringOrIntUnionTraits::TBufferSize>,
+ SStringOrIntUnionTraits::TBufferSize>
+ TStringOrIntUnionType;
+
+template <>
+struct Qt3DSDMGetter<TStringOrIntUnionType>
+{
+ template <typename TRetType>
+ TRetType doGet(const TStringOrIntUnionType &inValue)
+ {
+ return inValue.getData<TRetType>();
+ }
+};
+
+struct SStringOrInt
+{
+ TStringOrIntUnionType m_Value;
+
+ SStringOrInt() {}
+ SStringOrInt(int inValue)
+ : m_Value(inValue)
+ {
+ }
+ SStringOrInt(TDataStrPtr inValue)
+ : m_Value(inValue)
+ {
+ }
+ SStringOrInt(const SStringOrInt &inOther)
+ : m_Value(inOther.m_Value)
+ {
+ }
+
+ SStringOrInt &operator=(const SStringOrInt &inOther)
+ {
+ m_Value = inOther.m_Value;
+ return *this;
+ }
+
+ SStringOrIntTypes::Enum GetType() const { return m_Value.getType(); }
+
+ bool operator==(const SStringOrInt &inOther) const { return m_Value == inOther.m_Value; }
+};
+
+inline bool Equals(const SStringOrInt &lhs, const SStringOrInt &rhs)
+{
+ return lhs == rhs;
+}
+
+//comes from broken X.h
+#ifdef None
+#undef None
+#endif
+
+#ifdef Bool
+#undef Bool
+#endif
+
+struct DataModelDataType {
+
+ enum Value {
+ None,
+ Float,
+ Float2,
+ Float3,
+ Float4,
+ Long,
+ String,
+ Bool,
+ Long4,
+ StringRef,
+ ObjectRef,
+ StringOrInt,
+ FloatList,
+ RangedNumber // datainput-specific type for editor only
+ };
+
+
+ Q_ENUM(Value)
+ Q_GADGET
+};
+
+
+class IStringTable;
+
+template <typename TDataType>
+struct Qt3DSDMValueTyper
+{
+};
+
+template <typename TDataType>
+inline DataModelDataType::Value GetValueType(const TDataType &inValue)
+{
+ return Qt3DSDMValueTyper<TDataType>().Get(inValue);
+}
+
+template <typename TDataType>
+struct SDefaulter
+{
+};
+
+template <typename TDataType>
+inline bool SetDefault(DataModelDataType::Value inDataType, TDataType &outValue)
+{
+ return SDefaulter<TDataType>().SetDefault(inDataType, outValue);
+}
+
+typedef void (*Qt3DSDMDebugLogFunction)(const char *message);
+// UICDMSimpleDataCore.cpp
+extern Qt3DSDMDebugLogFunction g_DataModelDebugLogger;
+
+#define QT3DSDM_DEBUG_LOG(msg) \
+ { \
+ if (g_DataModelDebugLogger) { \
+ g_DataModelDebugLogger(msg); \
+ } \
+ }
+struct Qt3DSDMLogScope
+{
+ const char *m_EndMessage;
+ Qt3DSDMLogScope(const char *inStartMessage, const char *inEndMessage)
+ : m_EndMessage(inEndMessage)
+ {
+ QT3DSDM_DEBUG_LOG(inStartMessage);
+ }
+ ~Qt3DSDMLogScope() { QT3DSDM_DEBUG_LOG(m_EndMessage); }
+};
+
+#define QT3DSDM_LOG_FUNCTION(fnname) Qt3DSDMLogScope __fn_scope(fnname " Enter", fnname " Leave");
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMErrors.h b/src/dm/systems/Qt3DSDMErrors.h
new file mode 100644
index 0000000..77ea7bf
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMErrors.h
@@ -0,0 +1,308 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_ERRORS_H
+#define QT3DSDM_ERRORS_H
+#include "Qt3DSDMWindowsCompatibility.h"
+
+namespace qt3dsdm {
+class Qt3DSDMError : public std::exception
+{
+public:
+ Qt3DSDMError(const wchar_t *inMessage)
+ : std::exception()
+ {
+ wcscpy_s(m_Message, inMessage);
+ }
+ wchar_t m_Message[1024];
+};
+
+class HandleExists : public Qt3DSDMError
+{
+public:
+ HandleExists(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class PropertyNotFound : public Qt3DSDMError
+{
+public:
+ PropertyNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class PropertyExists : public Qt3DSDMError
+{
+public:
+ PropertyExists(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class DuplicateInstanceName : public Qt3DSDMError
+{
+public:
+ DuplicateInstanceName(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class InstanceNotFound : public Qt3DSDMError
+{
+public:
+ InstanceNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class ValueTypeError : public Qt3DSDMError
+{
+public:
+ ValueTypeError(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class SerializationError : public Qt3DSDMError
+{
+public:
+ SerializationError(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class SlideNotFound : public Qt3DSDMError
+{
+public:
+ SlideNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class SlideExists : public Qt3DSDMError
+{
+public:
+ SlideExists(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class SlideDerivationError : public Qt3DSDMError
+{
+public:
+ SlideDerivationError(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class SlideChildNotFoundError : public Qt3DSDMError
+{
+public:
+ SlideChildNotFoundError(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class SlideGraphNotFound : public Qt3DSDMError
+{
+public:
+ SlideGraphNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class SlideGraphExists : public Qt3DSDMError
+{
+public:
+ SlideGraphExists(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class PropertyLinkError : public Qt3DSDMError
+{
+public:
+ PropertyLinkError(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class RearrangeSlideArgumentsMustNotBeZero : public Qt3DSDMError
+{
+public:
+ RearrangeSlideArgumentsMustNotBeZero(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class AnimationNotFound : public Qt3DSDMError
+{
+public:
+ AnimationNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class AnimationExists : public Qt3DSDMError
+{
+public:
+ AnimationExists(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class AnimationKeyframeTypeError : public Qt3DSDMError
+{
+public:
+ AnimationKeyframeTypeError(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class AnimationKeyframeNotFound : public Qt3DSDMError
+{
+public:
+ AnimationKeyframeNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class AnimationEvaluationError : public Qt3DSDMError
+{
+public:
+ AnimationEvaluationError(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class ActionNotFound : public Qt3DSDMError
+{
+public:
+ ActionNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class ActionExists : public Qt3DSDMError
+{
+public:
+ ActionExists(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class HandlerArgumentNotFound : public Qt3DSDMError
+{
+public:
+ HandlerArgumentNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class HandlerArgumentExists : public Qt3DSDMError
+{
+public:
+ HandlerArgumentExists(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class CustomPropertyNotFound : public Qt3DSDMError
+{
+public:
+ CustomPropertyNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class CustomEventNotFound : public Qt3DSDMError
+{
+public:
+ CustomEventNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class CustomHandlerNotFound : public Qt3DSDMError
+{
+public:
+ CustomHandlerNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class CustomHandlerParamNotFound : public Qt3DSDMError
+{
+public:
+ CustomHandlerParamNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+
+class AttributeTypeNotFound : public Qt3DSDMError
+{
+public:
+ AttributeTypeNotFound(const wchar_t *inMessage)
+ : Qt3DSDMError(inMessage)
+ {
+ }
+};
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMGuides.cpp b/src/dm/systems/Qt3DSDMGuides.cpp
new file mode 100644
index 0000000..e8ea421
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMGuides.cpp
@@ -0,0 +1,222 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMGuides.h"
+#include <unordered_map>
+#include "VectorTransactions.h"
+
+using namespace qt3dsdm;
+
+namespace {
+
+#define CONNECT(x) std::make_shared<qt3dsdm::QtSignalConnection>(QObject::connect(this, x, inCallback))
+
+class SGuideSystem : public QObject, public IGuideSystem
+{
+ Q_OBJECT
+public:
+ typedef std::unordered_map<long, SGuideInfo> TGuideMap;
+ typedef std::shared_ptr<IMergeableTransaction<SGuideInfo>> TMergeableTransaction;
+ typedef std::unordered_map<long, TMergeableTransaction> TGuideInfoMergeMap;
+
+ long m_NextHandleValue;
+ TGuideMap m_Guides;
+ bool m_GuidesEditable;
+
+ std::shared_ptr<ITransactionConsumer> m_CurrentTransaction;
+ TGuideInfoMergeMap m_GuideMergeMap;
+Q_SIGNALS:
+ void guideCreated(Qt3DSDMGuideHandle, SGuideInfo);
+ void guideDestroyed(Qt3DSDMGuideHandle, SGuideInfo);
+ void guideModified(Qt3DSDMGuideHandle, SGuideInfo);
+ void guideModifiedImmediate(Qt3DSDMGuideHandle, SGuideInfo);
+public:
+ SGuideSystem()
+ : m_NextHandleValue(0)
+ , m_GuidesEditable(true)
+ {
+ }
+
+ void SignalGuideCreated(long hdl, const SGuideInfo &inInfo) { Q_EMIT guideCreated(hdl, inInfo); }
+
+ void SignalGuideDestroyed(long hdl, const SGuideInfo &inInfo) { Q_EMIT guideDestroyed(hdl, inInfo); }
+
+ void SignalGuideModified(long hdl, const SGuideInfo &inInfo) { Q_EMIT guideModified(hdl, inInfo); }
+
+ Qt3DSDMGuideHandle CreateGuide() override
+ {
+ ++m_NextHandleValue;
+ std::pair<long, SGuideInfo> entry(std::make_pair(m_NextHandleValue, SGuideInfo()));
+ m_Guides.insert(entry);
+ if (m_CurrentTransaction) {
+ CreateHashMapInsertTransaction(__FILE__, __LINE__, m_CurrentTransaction, entry,
+ m_Guides);
+ m_CurrentTransaction->OnDoNotification(std::bind(
+ &SGuideSystem::SignalGuideCreated, this, m_NextHandleValue, SGuideInfo()));
+ m_CurrentTransaction->OnUndoNotification(std::bind(
+ &SGuideSystem::SignalGuideDestroyed, this, m_NextHandleValue, SGuideInfo()));
+ }
+
+ return m_NextHandleValue;
+ }
+
+ SGuideInfo *InternalGetGuideInfo(Qt3DSDMGuideHandle inGuideHandle)
+ {
+ TGuideMap::iterator theFind = m_Guides.find((long)inGuideHandle.GetHandleValue());
+ if (theFind != m_Guides.end())
+ return &theFind->second;
+ return NULL;
+ }
+
+ const SGuideInfo *InternalGetGuideInfo(Qt3DSDMGuideHandle inGuideHandle) const
+ {
+ return const_cast<SGuideSystem &>(*this).InternalGetGuideInfo(inGuideHandle);
+ }
+
+ void SetGuideInfo(Qt3DSDMGuideHandle inGuideHandle, const SGuideInfo &info) override
+ {
+ SGuideInfo *existing = InternalGetGuideInfo(inGuideHandle);
+ long theHdlValue = (long)inGuideHandle.GetHandleValue();
+ TGuideInfoMergeMap::iterator iter = m_GuideMergeMap.find(theHdlValue);
+ if (iter != m_GuideMergeMap.end()) {
+ iter->second->Update(info);
+ *existing = info;
+ } else {
+ if (!existing) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SGuideInfo oldValue(*existing);
+ *existing = info;
+ if (m_CurrentTransaction) {
+ TMergeableTransaction newTransaction =
+ CreateHashMapSwapTransaction(__FILE__, __LINE__, m_CurrentTransaction,
+ theHdlValue, oldValue, info, m_Guides);
+ m_GuideMergeMap.insert(std::make_pair(theHdlValue, newTransaction));
+ m_CurrentTransaction->OnDoNotification(
+ std::bind(&SGuideSystem::SignalGuideModified, this, theHdlValue, info));
+ m_CurrentTransaction->OnUndoNotification(
+ std::bind(&SGuideSystem::SignalGuideModified, this, theHdlValue, oldValue));
+ }
+ }
+ if (AreDataModelSignalsEnabled())
+ Q_EMIT guideModifiedImmediate(theHdlValue, info);
+ }
+
+ SGuideInfo GetGuideInfo(Qt3DSDMGuideHandle inGuideHandle) const override
+ {
+ const SGuideInfo *existing = InternalGetGuideInfo(inGuideHandle);
+ if (existing)
+ return *existing;
+ QT3DS_ASSERT(false);
+ return SGuideInfo();
+ }
+
+ void DeleteGuide(Qt3DSDMGuideHandle inGuideHandle) override
+ {
+
+ SGuideInfo *existing = InternalGetGuideInfo(inGuideHandle);
+ if (!existing) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ long theHdlValue = (long)inGuideHandle.GetHandleValue();
+ SGuideInfo oldValue = *existing;
+ m_Guides.erase(theHdlValue);
+
+ if (m_CurrentTransaction) {
+ std::pair<long, SGuideInfo> entry(std::make_pair(theHdlValue, oldValue));
+ CreateHashMapEraseTransaction(__FILE__, __LINE__, m_CurrentTransaction, entry,
+ m_Guides);
+ m_CurrentTransaction->OnDoNotification(
+ std::bind(&SGuideSystem::SignalGuideDestroyed, this, theHdlValue, oldValue));
+ m_CurrentTransaction->OnUndoNotification(
+ std::bind(&SGuideSystem::SignalGuideCreated, this, theHdlValue, oldValue));
+ }
+ }
+
+ TGuideHandleList GetAllGuides() const override
+ {
+ TGuideHandleList retval;
+ for (TGuideMap::const_iterator iter = m_Guides.begin(), end = m_Guides.end(); iter != end;
+ ++iter)
+ retval.push_back(iter->first);
+ return retval;
+ }
+
+ bool IsGuideValid(Qt3DSDMGuideHandle inGuideHandle) const override
+ {
+ return InternalGetGuideInfo(inGuideHandle) != NULL;
+ }
+ bool AreGuidesEditable() const override { return m_GuidesEditable; }
+ void SetGuidesEditable(bool val) override { m_GuidesEditable = val; }
+
+ // Undo/Redo
+ void SetConsumer(std::shared_ptr<ITransactionConsumer> inConsumer) override
+ {
+ m_CurrentTransaction = inConsumer;
+ m_GuideMergeMap.clear();
+ }
+
+ // These are events coming from undo/redo operations, not events coming directly from the
+ // modification of the guides
+ virtual TSignalConnectionPtr
+ ConnectGuideCreated(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override
+ {
+ return CONNECT(&SGuideSystem::guideCreated);
+ }
+
+ virtual TSignalConnectionPtr
+ ConnectGuideDestroyed(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override
+ {
+ return CONNECT(&SGuideSystem::guideDestroyed);
+ }
+
+ virtual TSignalConnectionPtr
+ ConnectGuideModified(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override
+ {
+ return CONNECT(&SGuideSystem::guideModified);
+ }
+
+ // Signal happens immediately instead of on undo/redo, used for live-update of the inspector
+ // palette
+ TSignalConnectionPtr ConnectGuideModifiedImmediate(
+ const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override
+ {
+ return CONNECT(&SGuideSystem::guideModifiedImmediate);
+ }
+};
+}
+
+shared_ptr<IGuideSystem> IGuideSystem::CreateGuideSystem()
+{
+ return std::make_shared<SGuideSystem>();
+}
+
+#include "Qt3DSDMGuides.moc"
diff --git a/src/dm/systems/Qt3DSDMGuides.h b/src/dm/systems/Qt3DSDMGuides.h
new file mode 100644
index 0000000..0362abf
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMGuides.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_GUIDES_H
+#define QT3DSDM_GUIDES_H
+#include "Qt3DSDMDataTypes.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "Qt3DSDMSignals.h"
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMTransactions.h"
+#include <functional>
+
+namespace qt3dsdm {
+struct GuideDirections
+{
+ enum Enum {
+ UnknownDirection = 0,
+ Vertical,
+ Horizontal,
+ };
+};
+
+struct SGuideInfo
+{
+ qt3ds::QT3DSF32 m_Position;
+ GuideDirections::Enum m_Direction;
+ qt3ds::QT3DSI32 m_Width;
+ SGuideInfo(qt3ds::QT3DSF32 pos = 0.0f, GuideDirections::Enum dir = GuideDirections::UnknownDirection,
+ qt3ds::QT3DSI32 width = 1)
+ : m_Position(pos)
+ , m_Direction(dir)
+ , m_Width(width)
+ {
+ }
+};
+
+class IGuideSystem : public ITransactionProducer
+{
+protected:
+ virtual ~IGuideSystem() {}
+public:
+ friend class std::shared_ptr<IGuideSystem>;
+
+ virtual Qt3DSDMGuideHandle CreateGuide() = 0;
+ virtual void SetGuideInfo(Qt3DSDMGuideHandle inGuideHandle, const SGuideInfo &info) = 0;
+ virtual SGuideInfo GetGuideInfo(Qt3DSDMGuideHandle inGuideHandle) const = 0;
+ virtual void DeleteGuide(Qt3DSDMGuideHandle inGuideHandle) = 0;
+ virtual TGuideHandleList GetAllGuides() const = 0;
+ virtual bool IsGuideValid(Qt3DSDMGuideHandle inGuideHandle) const = 0;
+ // No real effect on datamodel because you can still create guides when they are locked.
+ // Just used in the UI.
+ virtual bool AreGuidesEditable() const = 0;
+ virtual void SetGuidesEditable(bool val) = 0;
+
+ // Undo/Redo
+ void SetConsumer(std::shared_ptr<ITransactionConsumer> inConsumer) override = 0;
+
+ // These are events coming from undo/redo operations, not events coming directly from the
+ // modification of the guides
+ virtual TSignalConnectionPtr
+ ConnectGuideCreated(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectGuideDestroyed(
+ const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectGuideModified(
+ const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0;
+
+ // Signal happens immediately instead of on undo/redo, used for live-update of the inspector
+ // palette
+ virtual TSignalConnectionPtr ConnectGuideModifiedImmediate(
+ const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0;
+
+ static std::shared_ptr<IGuideSystem> CreateGuideSystem();
+};
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMHandles.h b/src/dm/systems/Qt3DSDMHandles.h
new file mode 100644
index 0000000..05867a1
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMHandles.h
@@ -0,0 +1,459 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_HANDLES_H
+#define QT3DSDM_HANDLES_H
+
+#include <QMetaType>
+
+namespace qt3dsdm {
+
+class IDataCore;
+
+class CDataModelHandle
+{
+ int m_Handle;
+
+public:
+ inline CDataModelHandle(int inHandle = 0);
+ inline CDataModelHandle(const CDataModelHandle &other);
+ virtual ~CDataModelHandle();
+
+ // Operators
+ inline CDataModelHandle &operator=(const CDataModelHandle &other);
+ inline bool operator==(const CDataModelHandle &other) const;
+ inline bool operator<(const CDataModelHandle &other) const;
+ inline operator int() const { return GetHandleValue(); }
+
+ // Use
+ inline bool Valid() const { return m_Handle != 0; }
+ int GetHandleValue() const { return m_Handle; }
+};
+
+inline CDataModelHandle::CDataModelHandle(int inHandle)
+ : m_Handle(inHandle)
+{
+}
+inline CDataModelHandle::CDataModelHandle(const CDataModelHandle &other)
+ : m_Handle(other.m_Handle)
+{
+}
+inline CDataModelHandle::~CDataModelHandle()
+{
+}
+
+inline CDataModelHandle &CDataModelHandle::operator=(const CDataModelHandle &other)
+{
+ if (this != &other) {
+ m_Handle = other.m_Handle;
+ }
+ return *this;
+}
+
+inline bool CDataModelHandle::operator==(const CDataModelHandle &other) const
+{
+ return m_Handle == other.m_Handle;
+}
+
+inline bool CDataModelHandle::operator<(const CDataModelHandle &other) const
+{
+ return m_Handle < other.m_Handle;
+}
+
+class Qt3DSDMInstanceHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMInstanceHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMInstanceHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMInstanceHandle(const Qt3DSDMInstanceHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMInstanceHandle &operator=(const Qt3DSDMInstanceHandle &inOther)
+ {
+ return static_cast<Qt3DSDMInstanceHandle &>(CDataModelHandle::operator=(inOther));
+ }
+
+ inline bool operator==(const Qt3DSDMInstanceHandle &other) const
+ {
+ return CDataModelHandle::operator==(other);
+ }
+};
+
+typedef std::vector<Qt3DSDMInstanceHandle> TInstanceHandleList;
+
+class Qt3DSDMPropertyHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMPropertyHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMPropertyHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMPropertyHandle(const Qt3DSDMInstanceHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMPropertyHandle &operator=(const Qt3DSDMPropertyHandle &inOther)
+ {
+ return static_cast<Qt3DSDMPropertyHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMPropertyHandle> TPropertyHandleList;
+
+class Qt3DSDMSlideHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMSlideHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMSlideHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMSlideHandle(const Qt3DSDMSlideHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMSlideHandle &operator=(const Qt3DSDMSlideHandle &inOther)
+ {
+ return static_cast<Qt3DSDMSlideHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMSlideHandle> TSlideHandleList;
+
+class Qt3DSDMSlideGraphHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMSlideGraphHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMSlideGraphHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMSlideGraphHandle(const Qt3DSDMSlideGraphHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMSlideGraphHandle &operator=(const Qt3DSDMSlideGraphHandle &inOther)
+ {
+ return static_cast<Qt3DSDMSlideGraphHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMSlideGraphHandle> TSlideGraphHandleList;
+
+class Qt3DSDMAnimationHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMAnimationHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMAnimationHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMAnimationHandle(const Qt3DSDMAnimationHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMAnimationHandle &operator=(const Qt3DSDMAnimationHandle &inOther)
+ {
+ return static_cast<Qt3DSDMAnimationHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMAnimationHandle> TAnimationHandleList;
+
+class Qt3DSDMKeyframeHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMKeyframeHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMKeyframeHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMKeyframeHandle(const Qt3DSDMKeyframeHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMKeyframeHandle &operator=(const Qt3DSDMKeyframeHandle &inOther)
+ {
+ return static_cast<Qt3DSDMKeyframeHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMKeyframeHandle> TKeyframeHandleList;
+
+class Qt3DSDMActionHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMActionHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMActionHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMActionHandle(const Qt3DSDMActionHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMActionHandle &operator=(const Qt3DSDMActionHandle &inOther)
+ {
+ return static_cast<Qt3DSDMActionHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMActionHandle> TActionHandleList;
+
+class Qt3DSDMHandlerArgHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMHandlerArgHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMHandlerArgHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMHandlerArgHandle(const Qt3DSDMHandlerArgHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+ Qt3DSDMHandlerArgHandle &operator=(const Qt3DSDMHandlerArgHandle &inOther)
+ {
+ return static_cast<Qt3DSDMHandlerArgHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMHandlerArgHandle> THandlerArgHandleList;
+
+class Qt3DSDMEventHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMEventHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMEventHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMEventHandle(const Qt3DSDMEventHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMEventHandle &operator=(const Qt3DSDMEventHandle &inOther)
+ {
+ return static_cast<Qt3DSDMEventHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMEventHandle> TEventHandleList;
+
+class Qt3DSDMHandlerHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMHandlerHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMHandlerHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMHandlerHandle(const Qt3DSDMHandlerHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMHandlerHandle &operator=(const Qt3DSDMHandlerHandle &inOther)
+ {
+ return static_cast<Qt3DSDMHandlerHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMHandlerHandle> THandlerHandleList;
+
+class Qt3DSDMHandlerParamHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMHandlerParamHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMHandlerParamHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMHandlerParamHandle(const Qt3DSDMHandlerParamHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMHandlerParamHandle &operator=(const Qt3DSDMHandlerParamHandle &inOther)
+ {
+ return static_cast<Qt3DSDMHandlerParamHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMHandlerParamHandle> THandlerParamHandleList;
+
+class Qt3DSDMMetaDataPropertyHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMMetaDataPropertyHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMMetaDataPropertyHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMMetaDataPropertyHandle(const Qt3DSDMMetaDataPropertyHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMMetaDataPropertyHandle &operator=(const Qt3DSDMMetaDataPropertyHandle &inOther)
+ {
+ return static_cast<Qt3DSDMMetaDataPropertyHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMMetaDataPropertyHandle> TMetaDataPropertyHandleList;
+
+class Qt3DSDMCategoryHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMCategoryHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMCategoryHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMCategoryHandle(const Qt3DSDMCategoryHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+ Qt3DSDMCategoryHandle &operator=(const Qt3DSDMCategoryHandle &inOther)
+ {
+ return static_cast<Qt3DSDMCategoryHandle &>(CDataModelHandle::operator=(inOther));
+ }
+};
+
+typedef std::vector<Qt3DSDMCategoryHandle> TCategoryHandleList;
+
+class Qt3DSDMGuideHandle : public CDataModelHandle
+{
+public:
+ Qt3DSDMGuideHandle(int inHandle = 0)
+ : CDataModelHandle(inHandle)
+ {
+ }
+
+ Qt3DSDMGuideHandle(const CDataModelHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+
+ Qt3DSDMGuideHandle(const Qt3DSDMCategoryHandle &inOther)
+ : CDataModelHandle(inOther)
+ {
+ }
+ Qt3DSDMGuideHandle &operator=(const Qt3DSDMGuideHandle &inOther)
+ {
+ CDataModelHandle::operator=(inOther);
+ return *this;
+ }
+};
+
+typedef std::vector<Qt3DSDMGuideHandle> TGuideHandleList;
+}
+
+Q_DECLARE_METATYPE(qt3dsdm::Qt3DSDMSlideHandle);
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMMetaData.cpp b/src/dm/systems/Qt3DSDMMetaData.cpp
new file mode 100644
index 0000000..66f56ce
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMMetaData.cpp
@@ -0,0 +1,4170 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#ifdef _WIN32
+#pragma warning(disable : 4103)
+#endif
+#include "Qt3DSDMMetaData.h"
+#include "Qt3DSDMXML.h"
+#include "foundation/Qt3DSAssert.h"
+#include "StandardExtensions.h"
+#include <unordered_map>
+#include <memory>
+#include <unordered_set>
+#include "Qt3DSDMTransactions.h"
+#include "VectorTransactions.h"
+#include "Qt3DSDMSignals.h"
+// Pull in the fancy str-type implementations
+#include "Qt3DSDMWStrOpsImpl.h"
+#include "Qt3DSDMDataCore.h"
+#include "DataCoreProducer.h"
+#include "Qt3DSDMWindowsCompatibility.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "Qt3DSRenderDynamicObjectSystemCommands.h"
+#include "foundation/StringConversionImpl.h"
+
+#include <QtCore/qdir.h>
+
+using namespace qt3dsdm;
+using std::shared_ptr;
+using std::make_shared;
+using std::static_pointer_cast;
+using std::unordered_map;
+using std::unordered_set;
+using std::function;
+using std::bind;
+using std::ref;
+using std::get;
+using qt3ds::foundation::Empty;
+
+typedef Qt3DSDMInstanceHandle TInstanceHandle;
+typedef Qt3DSDMPropertyHandle TPropertyHandle;
+typedef Qt3DSDMEventHandle TEventHandle;
+typedef Qt3DSDMHandlerHandle THandlerHandle;
+typedef Qt3DSDMHandlerArgHandle THandlerArgHandle;
+typedef Qt3DSDMMetaDataPropertyHandle TMetaDataPropertyHandle;
+typedef Qt3DSDMCategoryHandle TCategoryHandle;
+
+namespace qt3dsdm {
+#define QT3DS_WCHAR_T_None L"None"
+#define QT3DS_WCHAR_T_StringList L"StringList"
+#define QT3DS_WCHAR_T_Range L"Range"
+#define QT3DS_WCHAR_T_Image L"Image"
+#define QT3DS_WCHAR_T_Color L"Color"
+#define QT3DS_WCHAR_T_Rotation L"Rotation"
+#define QT3DS_WCHAR_T_Font L"Font"
+#define QT3DS_WCHAR_T_FontSize L"FontSize"
+#define QT3DS_WCHAR_T_MultiLine L"MultiLine"
+#define QT3DS_WCHAR_T_ObjectRef L"ObjectRef"
+#define QT3DS_WCHAR_T_Mesh L"Mesh"
+#define QT3DS_WCHAR_T_Import L"Import"
+#define QT3DS_WCHAR_T_Texture L"Texture"
+#define QT3DS_WCHAR_T_Image2D L"Image2D"
+#define QT3DS_WCHAR_T_Buffer L"Buffer"
+#define QT3DS_WCHAR_T_Property L"Property"
+#define QT3DS_WCHAR_T_Dependent L"Dependent"
+#define QT3DS_WCHAR_T_Slide L"Slide"
+#define QT3DS_WCHAR_T_Event L"Event"
+#define QT3DS_WCHAR_T_Object L"Object"
+#define QT3DS_WCHAR_T_Signal L"Signal"
+#define QT3DS_WCHAR_T_Renderable L"Renderable"
+#define QT3DS_WCHAR_T_PathBuffer L"PathBuffer"
+#define QT3DS_WCHAR_T_ShadowMapResolution L"ShadowMapResolution"
+#define QT3DS_WCHAR_T_String L"String"
+
+#define ITERATE_ADDITIONAL_META_DATA_TYPES \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(None) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(StringList) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Range) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Image) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Color) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Rotation) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Font) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(FontSize) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(MultiLine) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(ObjectRef) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Mesh) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Import) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Texture) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(Renderable) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(PathBuffer) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(ShadowMapResolution) \
+ HANDLE_ADDITIONAL_META_DATA_TYPE(String)
+template <>
+struct WStrOps<AdditionalMetaDataType::Value>
+{
+ QT3DSU32 ToStr(AdditionalMetaDataType::Value item, NVDataRef<wchar_t> buffer)
+ {
+ switch (item) {
+#define HANDLE_ADDITIONAL_META_DATA_TYPE(name) \
+ case AdditionalMetaDataType::name: \
+ wcscpy_s(buffer.begin(), buffer.size(), QT3DS_WCHAR_T_##name); \
+ return 1;
+ ITERATE_ADDITIONAL_META_DATA_TYPES
+ #undef HANDLE_ADDITIONAL_META_DATA_TYPE
+ }
+ return 0;
+ }
+ bool StrTo(const wchar_t *buffer, AdditionalMetaDataType::Value &item)
+ {
+#define HANDLE_ADDITIONAL_META_DATA_TYPE(name) \
+ if (AreEqual(buffer, QT3DS_WCHAR_T_##name)) { \
+ item = AdditionalMetaDataType::name; \
+ return true; \
+ }
+ ITERATE_ADDITIONAL_META_DATA_TYPES
+ #undef HANDLE_ADDITIONAL_META_DATA_TYPE
+ return false;
+ }
+};
+
+#undef ITERATE_ADDITIONAL_META_DATA_TYPES
+
+#define ITERATE_HANDLER_ARG_TYPES \
+ HANDLE_HANDLER_ARG_TYPE(None) \
+ HANDLE_HANDLER_ARG_TYPE(Property) \
+ HANDLE_HANDLER_ARG_TYPE(Dependent) \
+ HANDLE_HANDLER_ARG_TYPE(Slide) \
+ HANDLE_HANDLER_ARG_TYPE(Event) \
+ HANDLE_HANDLER_ARG_TYPE(Object) \
+ HANDLE_HANDLER_ARG_TYPE(Signal)
+
+QT3DSU32 WStrOps<HandlerArgumentType::Value>::ToStr(HandlerArgumentType::Value item, NVDataRef<wchar_t> buffer)
+{
+ switch (item) {
+#define HANDLE_HANDLER_ARG_TYPE(name) \
+ case HandlerArgumentType::name: \
+ wcscpy_s(buffer.begin(), buffer.size(), QT3DS_WCHAR_T_##name); \
+ return 1;
+ ITERATE_HANDLER_ARG_TYPES
+ #undef HANDLE_HANDLER_ARG_TYPE
+ }
+ return 0;
+}
+
+bool WStrOps<HandlerArgumentType::Value>::StrTo(const wchar_t *buffer, HandlerArgumentType::Value &item)
+{
+#define HANDLE_HANDLER_ARG_TYPE(name) \
+ if (AreEqual(buffer, QT3DS_WCHAR_T_##name)) { \
+ item = HandlerArgumentType::name; \
+ return true; \
+}
+ ITERATE_HANDLER_ARG_TYPES
+ #undef HANDLE_HANDLER_ARG_TYPE
+ return false;
+}
+
+#define QT3DS_WCHAR_T_FloatRange L"FloatRange"
+#define QT3DS_WCHAR_T_LongRange L"LongRange"
+#define QT3DS_WCHAR_T_Vector L"Vector"
+#define QT3DS_WCHAR_T_MultiLineString L"MultiLineString"
+#define QT3DS_WCHAR_T_Boolean L"Boolean"
+#define QT3DS_WCHAR_T_Guid L"Guid"
+#define QT3DS_WCHAR_T_StringListOrInt L"StringListOrInt"
+#define QT3DS_WCHAR_T_Scale L"Scale"
+
+#define ITERATE_QT3DSDM_COMPLETE_TYPES \
+ HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(StringList, StringList, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(FloatRange, Range, DataModelDataType::Float) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(LongRange, Range, DataModelDataType::Long) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Float, None, DataModelDataType::Float) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Long, None, DataModelDataType::Long) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Float2, None, DataModelDataType::Float2) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Vector, None, DataModelDataType::Float3) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Scale, None, DataModelDataType::Float3) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Rotation, Rotation, DataModelDataType::Float3) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Color, Color, DataModelDataType::Float4) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Boolean, None, DataModelDataType::Bool) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Slide, None, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Font, Font, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(FontSize, FontSize, DataModelDataType::Float) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(String, String, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(MultiLineString, MultiLine, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(ObjectRef, ObjectRef, DataModelDataType::ObjectRef) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Image, Image, DataModelDataType::Long4) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Mesh, Mesh, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Import, Import, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Texture, Texture, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Image2D, Texture, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Buffer, Texture, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Guid, None, DataModelDataType::Long4) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(StringListOrInt, StringList, DataModelDataType::StringOrInt) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(Renderable, Renderable, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(PathBuffer, PathBuffer, DataModelDataType::String) \
+ HANDLE_QT3DSDM_COMPLETE_TYPE(ShadowMapResolution, ShadowMapResolution, DataModelDataType::Long)
+
+DataModelDataType::Value CompleteMetaDataType::ToDataType(CompleteMetaDataType::Enum inCompleteType)
+{
+ switch (inCompleteType) {
+#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \
+ case Unknown: \
+ return DataModelDataType::None;
+#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \
+ case name: \
+ return dtype;
+ ITERATE_QT3DSDM_COMPLETE_TYPES
+ #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE
+ #undef HANDLE_QT3DSDM_COMPLETE_TYPE
+ }
+ QT3DS_ASSERT(false);
+ return DataModelDataType::None;
+}
+
+AdditionalMetaDataType::Value
+CompleteMetaDataType::ToAdditionalType(CompleteMetaDataType::Enum inCompleteType)
+{
+ switch (inCompleteType) {
+#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \
+ case Unknown: \
+ return AdditionalMetaDataType::None;
+#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \
+ case name: \
+ return AdditionalMetaDataType::addtype;
+ ITERATE_QT3DSDM_COMPLETE_TYPES
+ #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE
+ #undef HANDLE_QT3DSDM_COMPLETE_TYPE
+ }
+ QT3DS_ASSERT(false);
+ return AdditionalMetaDataType::None;
+}
+
+CompleteMetaDataType::Enum
+CompleteMetaDataType::ToCompleteType(DataModelDataType::Value inDataType,
+ AdditionalMetaDataType::Value inAdditionalType)
+{
+#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \
+ if (inDataType == DataModelDataType::None) \
+ return CompleteMetaDataType::Unknown;
+#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \
+ if (inDataType == dtype \
+ && inAdditionalType == AdditionalMetaDataType::addtype) \
+ return CompleteMetaDataType::name;
+
+ ITERATE_QT3DSDM_COMPLETE_TYPES
+ #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE
+ #undef HANDLE_QT3DSDM_COMPLETE_TYPE
+ QT3DS_ASSERT(false);
+ return CompleteMetaDataType::Unknown;
+}
+
+QT3DSU32 WStrOps<CompleteMetaDataType::Enum>::ToStr(CompleteMetaDataType::Enum item,
+ NVDataRef<wchar_t> buffer)
+{
+ switch (item) {
+#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \
+ case CompleteMetaDataType::Unknown: \
+ wcscpy_s(buffer.begin(), buffer.size(), L"None"); \
+ return 1;
+#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \
+ case CompleteMetaDataType::name: \
+ wcscpy_s(buffer.begin(), buffer.size(), QT3DS_WCHAR_T_##name); \
+ return 1;
+
+ ITERATE_QT3DSDM_COMPLETE_TYPES
+ #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE
+ #undef HANDLE_QT3DSDM_COMPLETE_TYPE
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+}
+bool WStrOps<CompleteMetaDataType::Enum>::StrTo(const wchar_t *buffer,
+ CompleteMetaDataType::Enum &item)
+{
+
+#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \
+ if (AreEqual(buffer, L"None")) { \
+ item = CompleteMetaDataType::Unknown; \
+ return true; \
+}
+#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \
+ if (AreEqual(buffer, QT3DS_WCHAR_T_##name)) { \
+ item = CompleteMetaDataType::name; \
+ return true; \
+}
+
+ ITERATE_QT3DSDM_COMPLETE_TYPES
+ #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE
+ #undef HANDLE_QT3DSDM_COMPLETE_TYPE
+ return false;
+}
+}
+
+namespace {
+
+#ifndef QT3DSDM_META_DATA_NO_SIGNALS
+#define CONNECT(x) std::make_shared<qt3dsdm::QtSignalConnection>(QObject::connect(this, x, inCallback))
+#else
+#define CONNECT(x) std::shared_ptr<qt3dsdm::ISignalConnection>()
+
+struct SNullFunc
+{
+ template <typename TArgType>
+ void operator()(TArgType)
+ {
+ }
+ template <typename TA1, typename TA2>
+ void operator()(TA1, TA2)
+ {
+ }
+};
+
+#endif
+
+typedef TCharStr TStrType;
+using std::hash;
+
+struct InstanceHandleVecHash
+{
+ size_t operator()(const vector<TInstanceHandle> &inInstances) const
+ {
+ size_t retval = 0;
+ for (size_t idx = 0, end = inInstances.size(); idx < end; ++idx)
+ retval = retval ^ hash<int>()(inInstances[idx]);
+ return retval;
+ }
+};
+
+struct SEventAndHandlerBase
+{
+ Qt3DSDMInstanceHandle m_Instance;
+ TStrType m_Name;
+ TStrType m_FormalName;
+ TStrType m_Category;
+ TStrType m_Description;
+ SEventAndHandlerBase() {}
+ SEventAndHandlerBase(Qt3DSDMInstanceHandle hdl)
+ : m_Instance(hdl)
+ {
+ }
+};
+
+struct SEvent : public SEventAndHandlerBase
+{
+ SEvent() {}
+ SEvent(Qt3DSDMInstanceHandle hdl)
+ : SEventAndHandlerBase(hdl)
+ {
+ }
+};
+
+struct SHandler : public SEventAndHandlerBase
+{
+ SHandler() {}
+ SHandler(Qt3DSDMInstanceHandle hdl)
+ : SEventAndHandlerBase(hdl)
+ {
+ }
+ vector<SMetaDataHandlerArgumentInfo> m_Arguments;
+};
+
+// Note that this hash item only works for strings that are in the string table.
+// These have the property that pointer comparison also indicates string equality.
+struct SInstanceStrHash
+{
+ size_t operator()(const pair<TInstanceHandle, TCharPtr> &inPair) const
+ {
+ return hash<int>()(inPair.first) ^ hash<const void *>()(inPair.second);
+ }
+};
+
+template <typename TDataType>
+NVConstDataRef<TDataType> VecToCRef(const eastl::vector<TDataType> &inType)
+{
+ return NVConstDataRef<TDataType>(inType.data(), (QT3DSU32)inType.size());
+}
+
+struct SMetaDataDynamicObjectImpl
+{
+private:
+ SMetaDataDynamicObjectImpl &operator=(const SMetaDataDynamicObjectImpl &inOther);
+
+public:
+ TCharStr m_Name;
+ TCharStr m_SourcePath;
+ eastl::vector<SMetaDataShader> m_Shaders;
+ eastl::vector<qt3ds::render::dynamic::SPropertyDefinition> m_Properties;
+ eastl::vector<eastl::vector<qt3ds::foundation::CRegisteredString> *> m_EnumValueNames;
+ ~SMetaDataDynamicObjectImpl() { ClearEnumValueNames(); }
+
+ void ClearEnumValueNames()
+ {
+ for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx)
+ delete (m_EnumValueNames[idx]);
+ m_EnumValueNames.clear();
+ }
+};
+
+struct SMetaDataEffectImpl : public SMetaDataDynamicObjectImpl
+{
+private:
+ SMetaDataEffectImpl &operator=(const SMetaDataEffectImpl &inOther);
+
+public:
+ eastl::vector<qt3ds::render::dynamic::SCommand *> m_EffectCommands;
+
+ void ClearEffectCommands()
+ {
+ for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx)
+ free(m_EffectCommands[idx]);
+ m_EffectCommands.clear();
+ }
+ SMetaDataEffect ToEffect() const
+ {
+ return SMetaDataEffect(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties),
+ VecToCRef(m_EffectCommands));
+ }
+};
+
+struct SMetaDataCustomMaterialImpl : public SMetaDataDynamicObjectImpl
+{
+private:
+ SMetaDataCustomMaterialImpl &operator=(const SMetaDataCustomMaterialImpl &);
+
+public:
+ eastl::vector<qt3ds::render::dynamic::SCommand *>
+ m_CustomerMaterialCommands; ///< our command stream used for rendering
+ bool m_HasTransparency; ///< this material is transparent
+ bool m_HasRefraction; ///< this material is refractive (e.g glass)
+ bool m_AlwaysDirty;
+ QT3DSU32 m_ShaderKey; ///< What does this shader contain ( e.g. specular, diffuse, ...)
+ QT3DSU32 m_LayerCount; ///< How much layers does this material have
+
+ void ClearEffectCommands()
+ {
+ for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx) {
+ free(m_CustomerMaterialCommands[idx]);
+ }
+
+ m_CustomerMaterialCommands.clear();
+ }
+
+ SMetaDataCustomMaterial ToMaterial() const
+ {
+ return SMetaDataCustomMaterial(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties),
+ VecToCRef(m_CustomerMaterialCommands), m_HasTransparency,
+ m_HasRefraction, m_AlwaysDirty, m_ShaderKey, m_LayerCount);
+ }
+};
+
+#ifndef QT3DSDM_META_DATA_NO_SIGNALS
+class SNewMetaDataImpl : public QObject, public IMetaData
+{
+ Q_OBJECT
+#else
+class SNewMetaDataImpl : public IMetaData
+{
+#endif
+public:
+ typedef unordered_map<TCharPtr, TInstanceHandle> TStrInstanceMap;
+ typedef unordered_map<TInstanceHandle, TCharPtr, hash<int>> TInstanceStrMap;
+ // Caching the derivation chain lookup so we can quickly lookup the entire list of
+ // derived instances (and have it ordered, somewhat).
+ typedef unordered_map<vector<TInstanceHandle>, vector<TInstanceHandle>, InstanceHandleVecHash>
+ TDerivationMap;
+
+ typedef unordered_map<TCategoryHandle, SCategoryInfo, hash<int>> TCategoryMap;
+ typedef unordered_map<TCharPtr, TCategoryHandle> TNameCategoryMap;
+
+ typedef unordered_map<TMetaDataPropertyHandle, SMetaDataPropertyInfo, hash<int>>
+ TMetaDataPropertyMap;
+ typedef unordered_map<TInstanceHandle, vector<TMetaDataPropertyHandle>, hash<int>>
+ TInstancePropertyMap;
+ typedef unordered_map<pair<TInstanceHandle, TCharPtr>, TMetaDataPropertyHandle,
+ SInstanceStrHash>
+ TInstancePropertyNamePropertyMap;
+ typedef unordered_map<TMetaDataPropertyHandle, eastl::vector<SPropertyFilterInfo>, hash<int>>
+ TMetaDataPropertyFilterMap;
+ typedef unordered_map<TInstanceHandle, vector<TCharPtr>, hash<int>> TInstanceGroupMap;
+
+ typedef unordered_map<TEventHandle, SEvent, hash<int>> TEventMap;
+ typedef unordered_map<TInstanceHandle, vector<TEventHandle>, hash<int>> TInstanceEventMap;
+ typedef unordered_map<pair<TInstanceHandle, TCharPtr>, TEventHandle, SInstanceStrHash>
+ TInstanceEventNameEventMap;
+
+ typedef unordered_map<THandlerHandle, SHandler, hash<int>> THandlerMap;
+ typedef unordered_map<TInstanceHandle, vector<THandlerHandle>, hash<int>> TInstanceHandlerMap;
+ typedef unordered_map<pair<TInstanceHandle, TCharPtr>, THandlerHandle, SInstanceStrHash>
+ TInstanceHandlerNameHandlerMap;
+
+ typedef unordered_map<TInstanceHandle, vector<TCharPtr>, hash<int>> TInstanceStringListMap;
+ typedef unordered_map<TCharPtr, SMetaDataEffectImpl> TEffectMap;
+ typedef unordered_map<TCharPtr, SMetaDataCustomMaterialImpl> TCustomMaterialMap;
+
+ std::shared_ptr<IDataCore> m_DataCore;
+ IStringTable &m_StringTable;
+ TTransactionConsumerPtr m_Consumer;
+
+ int m_NextId;
+
+ // Helper objects to speed up queries
+ TStrInstanceMap m_CanonicalTypeToInstances;
+ TInstanceStrMap m_InstancesToCanonicalType;
+ TDerivationMap m_DerivationMap;
+
+ TCategoryMap m_Categories;
+ TNameCategoryMap m_NameToCategories;
+
+ TMetaDataPropertyMap m_Properties;
+ TInstancePropertyMap m_InstanceToProperties;
+ TInstancePropertyNamePropertyMap m_InstanceNameToProperties;
+ TMetaDataPropertyFilterMap m_PropertyFilters;
+ TInstanceGroupMap m_InstanceGroupMap;
+
+ TEventMap m_Events;
+ TInstanceEventMap m_InstanceToEvents;
+ TInstanceEventNameEventMap m_InstanceNameToEvents;
+
+ THandlerMap m_Handlers;
+ TInstanceHandlerMap m_InstanceToHandlers;
+ TInstanceHandlerNameHandlerMap m_InstanceNameToHandlers;
+
+ TInstanceStringListMap m_InstanceToReferences;
+
+ vector<TInstanceHandle> m_Parents;
+ vector<TInstanceHandle> m_NextParents;
+ vector<TInstanceHandle> m_DerivationChain;
+ unordered_set<int> m_UniqueSet;
+ unordered_set<size_t> m_SizeTSet;
+
+ MemoryBuffer<RawAllocator> m_TempBuffer;
+ MemoryBuffer<RawAllocator> m_ReadBuffer;
+
+ eastl::string m_ConvertStr;
+
+ TCharStr m_ObjectName;
+
+ TEffectMap m_EffectMap;
+ TCustomMaterialMap m_CustomMaterials;
+
+#ifndef QT3DSDM_META_DATA_NO_SIGNALS
+Q_SIGNALS:
+ void internalCategoryDestroyed(Qt3DSDMCategoryHandle);
+ void internalMetaDataPropertyDestroyed(Qt3DSDMMetaDataPropertyHandle);
+ void internalEventDestroyed(Qt3DSDMEventHandle);
+ void internalHandlerDestroyed(Qt3DSDMHandlerHandle);
+ void internalHandlerArgDestroyed(Qt3DSDMHandlerHandle, QT3DSU32);
+#else
+ SNullFunc internalCategoryDestroyed;
+ SNullFunc internalMetaDataPropertyDestroyed;
+ SNullFunc internalEventDestroyed;
+ SNullFunc internalHandlerDestroyed;
+ SNullFunc internalHandlerArgDestroyed;
+#endif
+public:
+ TSignalConnectionPtr m_PropertyDeletedConnection;
+ bool m_IgnorePropertyDeleted;
+ TSignalConnectionPtr m_InstanceDeletedConnection;
+
+ SNewMetaDataImpl(std::shared_ptr<IDataCore> inDataCore)
+ : m_DataCore(inDataCore)
+ , m_StringTable(inDataCore->GetStringTable())
+ , m_NextId(1)
+ , m_IgnorePropertyDeleted(false)
+ {
+#ifndef QT3DSDM_META_DATA_NO_SIGNALS
+ CDataCoreProducer *producer = dynamic_cast<CDataCoreProducer *>(inDataCore.get());
+ if (producer) {
+ m_PropertyDeletedConnection = producer->ConnectPropertyRemoved(
+ bind(&SNewMetaDataImpl::OnPropertyRemoved, this,
+ std::placeholders::_1, std::placeholders::_2));
+ m_InstanceDeletedConnection = producer->ConnectBeforeInstanceDeleted(
+ bind(&SNewMetaDataImpl::OnInstanceRemoved, this,
+ std::placeholders::_1));
+ }
+#endif
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Helper Functions
+
+ const wchar_t *Intern(TStrType inData) { return m_StringTable.RegisterStr(inData.wide_str()); }
+ const wchar_t *Intern(const char *inData) { return m_StringTable.GetWideStr(inData); }
+
+ inline int GetNextId()
+ {
+ int retval = m_NextId;
+ ++m_NextId;
+ return retval;
+ }
+
+ template <typename TMapType, typename THandleType>
+ static void AddItemToInstanceList(TInstanceHandle inInstance, THandleType inHandle, QT3DSU32 inIdx,
+ TMapType &ioMap)
+ {
+ pair<typename TMapType::iterator, bool> inserter =
+ ioMap.insert(make_pair(inInstance, vector<THandleType>()));
+ inserter.first->second.insert(inserter.first->second.begin() + inIdx, inHandle);
+ }
+
+ template <typename TMapType, typename THandleType>
+ static QT3DSU32 AddItemToInstanceList(TInstanceHandle inInstance, THandleType inHandle,
+ TMapType &ioMap)
+ {
+ pair<typename TMapType::iterator, bool> inserter =
+ ioMap.insert(make_pair(inInstance, vector<THandleType>()));
+ QT3DSU32 offset = (QT3DSU32)inserter.first->second.size();
+ inserter.first->second.push_back(inHandle);
+ return offset;
+ }
+
+ template <typename TItemType>
+ struct VectorEqualPred
+ {
+ TItemType m_Item;
+ VectorEqualPred(const TItemType &inItem)
+ : m_Item(inItem)
+ {
+ }
+
+ bool operator()(const TItemType &inOther) const { return m_Item == inOther; }
+ };
+
+ template <typename THandleType, typename TMapType>
+ static QT3DSU32 DoRemoveItemFromInstanceList(TInstanceHandle inInstance, THandleType inHandle,
+ TMapType &ioMap)
+ {
+ typename TMapType::iterator find = ioMap.find(inInstance);
+ if (find != ioMap.end()) {
+ typename vector<THandleType>::iterator theVecFind =
+ std::find(find->second.begin(), find->second.end(), inHandle);
+ if (theVecFind != find->second.end()) {
+ QT3DSU32 retval = (QT3DSU32)(theVecFind - find->second.begin());
+ find->second.erase(theVecFind);
+ if (find->second.empty())
+ ioMap.erase(find);
+ return retval;
+ }
+ }
+ QT3DS_ASSERT(false);
+ return QT3DS_MAX_U32;
+ }
+
+ template <typename TMapType, typename THandleType>
+ struct InstanceListTransaction : ITransaction
+ {
+ TInstanceHandle m_Instance;
+ THandleType m_Handle;
+ TMapType &m_Map;
+ QT3DSU32 m_Idx;
+ bool m_InsertOnDo;
+
+ InstanceListTransaction(const char *inFile, int inLine, TInstanceHandle inst,
+ THandleType handle, TMapType &map, QT3DSU32 inIdx, bool inInsertOnDo)
+ : ITransaction(inFile, inLine)
+ , m_Instance(inst)
+ , m_Handle(handle)
+ , m_Map(map)
+ , m_Idx(inIdx)
+ , m_InsertOnDo(inInsertOnDo)
+ {
+ }
+
+ void insert()
+ {
+ SNewMetaDataImpl::AddItemToInstanceList(m_Instance, m_Handle, m_Idx, m_Map);
+ }
+ void remove()
+ {
+ SNewMetaDataImpl::DoRemoveItemFromInstanceList(m_Instance, m_Handle, m_Map);
+ }
+
+ void Do() override
+ {
+ if (m_InsertOnDo)
+ insert();
+ else
+ remove();
+ }
+ void Undo() override
+ {
+ if (m_InsertOnDo)
+ remove();
+ else
+ insert();
+ }
+ };
+
+ template <typename THandleType, typename TMapType>
+ void RemoveItemFromInstanceList(const char *inFile, int inLine, TInstanceHandle inInstance,
+ THandleType inHandle, TMapType &ioMap)
+ {
+ typename TMapType::iterator find = ioMap.find(inInstance);
+ if (find != ioMap.end()) {
+ QT3DSU32 idx = DoRemoveItemFromInstanceList(inInstance, inHandle, ioMap);
+ if (m_Consumer != NULL) {
+ m_Consumer->OnTransaction(
+ std::make_shared<InstanceListTransaction<TMapType, THandleType>>(
+ inFile, inLine, inInstance, inHandle, std::ref(ioMap), idx, false));
+ }
+ }
+ }
+
+ template <typename THandleType, typename TValueType, typename TMapType,
+ typename TInstanceListMapType>
+ THandleType CreateItem(const char *inFile, int inLine, Qt3DSDMInstanceHandle inInstance,
+ TMapType &inMap, TInstanceListMapType &inInstanceListMap)
+ {
+ int retval = GetNextId();
+ pair<THandleType, TValueType> thePair(make_pair(retval, TValueType(inInstance)));
+ inMap.insert(thePair);
+ QT3DSU32 idx = AddItemToInstanceList(inInstance, THandleType(retval), inInstanceListMap);
+ if (m_Consumer) {
+ CreateHashMapInsertTransaction(inFile, inLine, m_Consumer, thePair, inMap);
+ m_Consumer->OnTransaction(
+ std::make_shared<InstanceListTransaction<TInstanceListMapType, THandleType>>(
+ inFile, inLine, inInstance, retval, std::ref(inInstanceListMap), idx, true));
+ }
+ return retval;
+ }
+
+ template <typename TKeyType, typename TValueType, typename THashType>
+ TValueType *FindHashItem(TKeyType inHandle,
+ unordered_map<TKeyType, TValueType, THashType> &ioHash)
+ {
+ typename unordered_map<TKeyType, TValueType, THashType>::iterator find =
+ ioHash.find(inHandle);
+ if (find != ioHash.end())
+ return &find->second;
+ return NULL;
+ }
+
+ template <typename THandleType, typename TMapType>
+ static void DoReplaceNamedItem(TInstanceHandle inInst, TCharPtr inOldName, TCharPtr inNewName,
+ THandleType inNewHandle, TMapType &ioMap)
+ {
+ ioMap.erase(make_pair(inInst, inOldName));
+ bool success = ioMap.insert(make_pair(make_pair(inInst, inNewName), inNewHandle)).second;
+ (void)success;
+ QT3DS_ASSERT(success);
+ }
+
+ template <typename TMapType, typename THandleType>
+ struct ReplaceNamedItemTransaction : ITransaction
+ {
+ TInstanceHandle m_Instance;
+ TCharPtr m_OldName;
+ TCharPtr m_NewName;
+ THandleType m_OldHandle;
+ THandleType m_NewHandle;
+ TMapType &m_Map;
+ ReplaceNamedItemTransaction(const char *inFile, int inLine, TInstanceHandle inst,
+ TCharPtr oldNm, TCharPtr newNm, THandleType oldHdl,
+ THandleType newHdl, TMapType &map)
+ : ITransaction(inFile, inLine)
+ , m_Instance(inst)
+ , m_OldName(oldNm)
+ , m_NewName(newNm)
+ , m_OldHandle(oldHdl)
+ , m_NewHandle(newHdl)
+ , m_Map(map)
+ {
+ }
+ void Do() override
+ {
+ SNewMetaDataImpl::DoReplaceNamedItem(m_Instance, m_OldName, m_NewName, m_NewHandle,
+ m_Map);
+ }
+ void Undo() override
+ {
+ SNewMetaDataImpl::DoReplaceNamedItem(m_Instance, m_NewName, m_OldName, m_OldHandle,
+ m_Map);
+ }
+ };
+
+ template <typename THandleType, typename TMapType>
+ void ReplaceNamedItem(const char *inFile, int inLine, TInstanceHandle inInst,
+ TCharPtr inOldName, TCharPtr inNewName, THandleType inNewHandle,
+ TMapType &ioMap)
+ {
+ typename TMapType::iterator find = ioMap.find(std::make_pair(inInst, inOldName));
+ THandleType oldHandle;
+ if (find != ioMap.end())
+ oldHandle = find->second;
+ DoReplaceNamedItem(inInst, inOldName, inNewName, inNewHandle, ioMap);
+ if (m_Consumer) {
+ if (oldHandle.Valid()) {
+ m_Consumer->OnTransaction(
+ std::make_shared<ReplaceNamedItemTransaction<TMapType, THandleType>>(
+ inFile, inLine, inInst, inOldName, inNewName, oldHandle, inNewHandle,
+ std::ref(ioMap)));
+ } else
+ CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer,
+ make_pair(make_pair(inInst, inNewName), inNewHandle),
+ ioMap);
+ }
+ }
+
+ template <typename THandleType, typename TMapType>
+ void DestroyNamedItem(const char *inFile, int inLine, TInstanceHandle inInst, TCharPtr inName,
+ TMapType &ioMap)
+ {
+ typename TMapType::iterator iter = ioMap.find(make_pair(inInst, inName));
+ if (iter != ioMap.end()) {
+ pair<pair<TInstanceHandle, TCharPtr>, THandleType> existing(*iter);
+ ioMap.erase(iter);
+ CreateHashMapEraseTransaction(inFile, inLine, m_Consumer, existing, ioMap);
+ }
+ }
+
+ template <typename THandleType, typename TInfoType, typename TMapType, typename TNamedMapType>
+ void SetItemInfo(const char *inFile, int inLine, THandleType inItem, const TInfoType &oldInfo,
+ const TInfoType &newInfo, TMapType &inMap, TNamedMapType &inNamedMap)
+ {
+ TCharPtr newName = Intern(newInfo.m_Name.wide_str());
+ TCharPtr oldName = Intern(oldInfo.m_Name.wide_str());
+ ReplaceNamedItem(inFile, inLine, newInfo.m_Instance, oldName, newName, inItem, inNamedMap);
+ CreateHashMapSwapTransaction(inFile, inLine, m_Consumer, inItem, oldInfo, newInfo, inMap);
+ }
+
+ bool AddDerivationChainItem(TInstanceHandle inInst)
+ {
+ if (m_UniqueSet.find(inInst) == m_UniqueSet.end()) {
+ m_DerivationChain.push_back(inInst);
+ m_UniqueSet.insert(inInst);
+ return true;
+ }
+ return false;
+ }
+
+ void GetDerivationChain(TInstanceHandle inInst)
+ {
+ m_Parents.clear();
+ m_DerivationChain.clear();
+ m_UniqueSet.clear();
+ m_NextParents.clear();
+ m_DataCore->GetInstanceParents(inInst, m_Parents);
+
+ TDerivationMap::iterator mapIter = m_DerivationMap.find(m_Parents);
+ if (mapIter != m_DerivationMap.end())
+ m_DerivationChain = mapIter->second;
+ else {
+ while (m_Parents.empty() == false) {
+ for (size_t idx = 0, end = m_Parents.size(); idx < end; ++idx) {
+ if (AddDerivationChainItem(m_Parents[idx]))
+ m_DataCore->GetInstanceParents(m_Parents[idx], m_NextParents);
+ }
+ m_Parents = m_NextParents;
+ m_NextParents.clear();
+ }
+ m_NextParents.clear();
+
+ m_DataCore->GetInstanceParents(inInst, m_NextParents);
+ m_DerivationMap.insert(make_pair(m_NextParents, m_DerivationChain));
+ }
+ }
+
+ template <typename THandleType, typename TMapType>
+ THandleType FindItemByName(TInstanceHandle inInst, TCharPtr inName, TMapType &ioMap)
+ {
+ typename TMapType::iterator find(ioMap.find(make_pair(inInst, inName)));
+ if (find != ioMap.end())
+ return find->second;
+
+ GetDerivationChain(inInst);
+ for (size_t idx = 0, end = m_DerivationChain.size(); idx < end; ++idx) {
+ find = ioMap.find(make_pair(m_DerivationChain[idx], inName));
+ if (find != ioMap.end())
+ return find->second;
+ }
+ return 0;
+ }
+
+ template <typename TItemType, typename TVectorType>
+ void AddListMapItems(const std::vector<TItemType> &inMapEntry, TVectorType &outVector)
+ {
+ typedef typename std::vector<TItemType>::const_iterator TIterType;
+ for (TIterType theIter = inMapEntry.begin(), theEnd = inMapEntry.end(); theIter != theEnd;
+ ++theIter)
+ outVector.push_back(*theIter);
+ }
+
+ template <typename TListMapType, typename TSizeTOpType, typename TVectorType>
+ void DoGetHandleList(Qt3DSDMInstanceHandle inInstance, TListMapType &inMap,
+ TVectorType &outHandles, TSizeTOpType inOperator)
+ {
+ typename TListMapType::iterator find;
+ GetDerivationChain(inInstance);
+ for (size_t idx = 0, end = m_DerivationChain.size(); idx < end; ++idx) {
+ // Add base classes to the list first
+ find = inMap.find(m_DerivationChain[end - idx - 1]);
+ if (find != inMap.end())
+ AddListMapItems(find->second, outHandles);
+ }
+ find = inMap.find(inInstance);
+ if (find != inMap.end())
+ AddListMapItems(find->second, outHandles);
+ m_SizeTSet.clear();
+ for (size_t ridx = 0; ridx < outHandles.size(); ++ridx) {
+ size_t idx = outHandles.size() - ridx - 1;
+ // Run through the list backwards, making sure that items further in the list
+ // completely overshadow items earlier in the list.
+
+ // Create unique key from the item that we can check against
+ size_t item = inOperator(outHandles[idx]);
+ if (m_SizeTSet.insert(item).second == false) {
+ outHandles.erase(outHandles.begin() + idx);
+ --ridx;
+ }
+ }
+ }
+
+ template <typename THandleType, typename TMapType>
+ struct NameSizeTOpType
+ {
+ SNewMetaDataImpl &m_Impl;
+ TMapType &m_Map;
+ NameSizeTOpType(SNewMetaDataImpl &inImpl, TMapType &inMap)
+ : m_Impl(inImpl)
+ , m_Map(inMap)
+ {
+ }
+
+ size_t operator()(THandleType inHandle)
+ {
+ return reinterpret_cast<size_t>(m_Impl.Intern(m_Map[inHandle].m_Name));
+ }
+ };
+
+ // Ensure we don't return two items of the same name.
+ template <typename THandleType, typename TListMapType, typename TMapType>
+ void GetHandleList(Qt3DSDMInstanceHandle inInstance, TListMapType &inMap, TMapType &inTypeName,
+ vector<THandleType> &outHandles)
+ {
+ DoGetHandleList(inInstance, inMap, outHandles,
+ NameSizeTOpType<THandleType, TMapType>(*this, inTypeName));
+ }
+
+ template <typename THandleType, typename TMapType, typename TNameMapType,
+ typename TListMapType>
+ bool DestroyItem(const char *inFile, int inLine, THandleType inItem,
+ TMapType &inMap, TNameMapType &inNameMap, TListMapType &inListMap)
+ {
+ typename TMapType::iterator find(inMap.find(inItem));
+ if (find == inMap.end())
+ return false;
+ DestroyNamedItem<THandleType>(inFile, inLine, find->second.m_Instance,
+ Intern(find->second.m_Name.wide_str()), inNameMap);
+ RemoveItemFromInstanceList(inFile, inLine, find->second.m_Instance, inItem, inListMap);
+ CreateHashMapEraseTransaction(inFile, inLine, m_Consumer,
+ make_pair(find->first, find->second), inMap);
+ inMap.erase(find);
+ return true;
+ }
+
+ template <typename THandleType, typename TListMapType>
+ void ForEachItem(Qt3DSDMInstanceHandle inInstance, TListMapType &ioMap,
+ function<void(THandleType)> inOperation)
+ {
+ typename TListMapType::iterator find = ioMap.find(inInstance);
+ if (find != ioMap.end()) {
+ vector<THandleType> itemData(find->second);
+ for (size_t idx = 0, end = itemData.size(); idx < end; ++idx)
+ inOperation(itemData[idx]);
+ }
+ }
+
+ SCategoryInfo *FindCategory(Qt3DSDMCategoryHandle inCategory)
+ {
+ return FindHashItem(inCategory, m_Categories);
+ }
+
+ SMetaDataPropertyInfo *FindProperty(Qt3DSDMMetaDataPropertyHandle inPropertyHandle)
+ {
+ return FindHashItem(inPropertyHandle, m_Properties);
+ }
+
+ SEvent *FindEvent(Qt3DSDMEventHandle inEventHandle)
+ {
+ return FindHashItem(inEventHandle, m_Events);
+ }
+
+ SHandler *FindHandler(Qt3DSDMHandlerHandle inHandle)
+ {
+ return FindHashItem(inHandle, m_Handlers);
+ }
+
+ SMetaDataHandlerArgumentInfo *FindHandlerArg(Qt3DSDMHandlerHandle inHandler, QT3DSU32 inIdx)
+ {
+ SHandler *theHandler(FindHandler(inHandler));
+ if (theHandler && theHandler->m_Arguments.size() > inIdx)
+ return &theHandler->m_Arguments[inIdx];
+ return NULL;
+ }
+
+ void OnPropertyRemoved(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty)
+ {
+ if (m_IgnorePropertyDeleted)
+ return;
+
+ vector<Qt3DSDMMetaDataPropertyHandle> propertiesToDestroy;
+ for (TMetaDataPropertyMap::iterator iter = m_Properties.begin(), end = m_Properties.end();
+ iter != end; ++iter) {
+ if (iter->second.m_Property == inProperty)
+ propertiesToDestroy.push_back(iter->first);
+ }
+
+ for (size_t idx = 0, end = propertiesToDestroy.size(); idx < end; ++idx)
+ DestroyMetaDataProperty(propertiesToDestroy[idx]);
+ }
+
+ void OnInstanceRemoved(Qt3DSDMInstanceHandle inInstance) { DestroyMetaData(inInstance); }
+ template <typename TEntryType, typename TMapType>
+ void InsertWithTransaction(const char *inFile, int inLine, const TEntryType &inEntry,
+ TMapType &inMap)
+ {
+ inMap.insert(inEntry);
+ CreateHashMapInsertTransaction(inFile, inLine, m_Consumer, inEntry, inMap);
+ }
+
+ template <typename TKeyType, typename TMapType>
+ void EraseWithTransaction(const char *inFile, int inLine, TKeyType inKey, TMapType &inMap)
+ {
+ typename TMapType::iterator find(inMap.find(inKey));
+ if (find != inMap.end()) {
+ CreateHashMapEraseTransaction(inFile, inLine, m_Consumer,
+ std::make_pair(find->first, find->second), inMap);
+ inMap.erase(find);
+ }
+ }
+
+ template <typename TEntryType, typename TMapType>
+ void InsertOrUpdateWithTransaction(const TEntryType &inEntry, TMapType &inMap)
+ {
+ pair<typename TMapType::iterator, bool> inserter = inMap.insert(inEntry);
+ if (inserter.second)
+ CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer, inEntry, inMap);
+ else {
+ typename TMapType::iterator theIter(inserter.first);
+ CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer, theIter->first,
+ theIter->second, inEntry.second, inMap);
+ theIter->second = inEntry.second;
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // API Implementation
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Sharing some utility objects
+ IStringTable &GetStringTable() override { return m_DataCore->GetStringTable(); }
+ TStringTablePtr GetStringTablePtr() override { return m_DataCore->GetStringTablePtr(); }
+ TDataCorePtr GetDataCore() override { return m_DataCore; }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Canonical Instances
+ void SetInstanceAsCanonical(Qt3DSDMInstanceHandle inInstance, TStrType inTypename) override
+ {
+ const wchar_t *theTypename(Intern(inTypename));
+ if (g_DataModelDebugLogger)
+ g_DataModelDebugLogger("IMetaData::SetInstanceAsCanonical Enter");
+ if (g_DataModelDebugLogger)
+ g_DataModelDebugLogger(GetStringTable().GetNarrowStr(inTypename.wide_str()));
+ m_CanonicalTypeToInstances.insert(make_pair(theTypename, inInstance));
+ m_InstancesToCanonicalType.insert(make_pair(inInstance, theTypename));
+ CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer,
+ make_pair(theTypename, inInstance),
+ m_CanonicalTypeToInstances);
+ CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer,
+ make_pair(inInstance, theTypename),
+ m_InstancesToCanonicalType);
+ if (g_DataModelDebugLogger)
+ g_DataModelDebugLogger("IMetaData::SetInstanceAsCanonical Leave");
+ }
+
+ Qt3DSDMInstanceHandle GetCanonicalInstanceForType(TStrType inTypename) override
+ {
+ TStrInstanceMap::iterator find = m_CanonicalTypeToInstances.find(Intern(inTypename));
+ if (find != m_CanonicalTypeToInstances.end())
+ return find->second;
+ return 0;
+ }
+
+ Option<TCharStr> GetTypeForCanonicalInstance(Qt3DSDMInstanceHandle inInstance) override
+ {
+ TInstanceStrMap::iterator find = m_InstancesToCanonicalType.find(inInstance);
+ if (find != m_InstancesToCanonicalType.end())
+ return TCharStr(find->second);
+ return Empty();
+ }
+
+ Option<TCharStr> GetTypeForInstance(Qt3DSDMInstanceHandle inInstance) override
+ {
+ Option<TCharStr> theType = GetTypeForCanonicalInstance(inInstance);
+ if (theType.hasValue())
+ return theType;
+ GetDerivationChain(inInstance);
+ for (size_t idx = 0, end = m_DerivationChain.size(); idx < end; ++idx) {
+ theType = GetTypeForCanonicalInstance(m_DerivationChain[idx]);
+ if (theType.hasValue())
+ return theType;
+ }
+ return Empty();
+ }
+
+ QT3DSU32 GetGroupCountForInstance(Qt3DSDMInstanceHandle inInstance) override
+ {
+ std::vector<TCharStr> outNames;
+ QT3DSU32 count = GetGroupNamesForInstance(inInstance, outNames);
+ return (count == 0) ? 1 : count;
+ }
+
+ QT3DSU32 GetGroupNamesForInstance(Qt3DSDMInstanceHandle inInstance,
+ std::vector<TCharStr> &outNames) override
+ {
+ TInstanceStrMap::iterator canonicalFind = m_InstancesToCanonicalType.find(inInstance);
+ if (canonicalFind != m_InstancesToCanonicalType.end()) {
+ TInstanceGroupMap::iterator find = m_InstanceGroupMap.find(inInstance);
+ if (find != m_InstanceGroupMap.end()) {
+ pair<typename TInstanceGroupMap::iterator, bool> inserter =
+ m_InstanceGroupMap.insert(make_pair(inInstance, vector<TCharPtr>()));
+ vector<TCharPtr> &itemList = inserter.first->second;
+ for (size_t i = 0, j = itemList.size(); i < j; ++i) {
+ bool alreadyInList = false;
+ // discard duplicates
+ for (size_t k = 0, l = outNames.size(); k < l; ++k) {
+ TCharStr curListName = itemList[i];
+ if (curListName == outNames[k].wide_str()) {
+ alreadyInList = true;
+ break;
+ }
+ }
+ if (!alreadyInList)
+ outNames.push_back(itemList[i]);
+ }
+ }
+ return (QT3DSU32)outNames.size();
+ }
+
+ GetDerivationChain(inInstance);
+
+ for (int idx = (int)m_DerivationChain.size() - 1, end = 0; idx >= end; --idx) {
+ TInstanceGroupMap::iterator find = m_InstanceGroupMap.find(m_DerivationChain[idx]);
+ if (find != m_InstanceGroupMap.end()) {
+ pair<typename TInstanceGroupMap::iterator, bool> inserter =
+ m_InstanceGroupMap.insert(
+ make_pair(m_DerivationChain[idx], vector<TCharPtr>()));
+ vector<TCharPtr> &itemList = inserter.first->second;
+ for (size_t i = 0, j = itemList.size(); i < j; ++i) {
+ bool alreadyInList = false;
+ // discard duplicates
+ for (size_t k = 0, l = outNames.size(); k < l; ++k) {
+ TCharStr curListName = itemList[i];
+ if (curListName == outNames[k].wide_str()) {
+ alreadyInList = true;
+ break;
+ }
+ }
+ if (!alreadyInList)
+ outNames.push_back(itemList[i]);
+ }
+ }
+ }
+
+ return (QT3DSU32)outNames.size();
+ }
+
+ Option<TCharStr> GetGroupFilterNameForInstance(Qt3DSDMInstanceHandle inInstance,
+ long inIndex) override
+ {
+ std::vector<TCharStr> outNames;
+ QT3DSU32 count = GetGroupNamesForInstance(inInstance, outNames);
+ if (count > (QT3DSU32)inIndex)
+ return outNames[inIndex];
+
+ return Empty();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Categories
+
+ std::pair<Qt3DSDMCategoryHandle, bool> GetOrCreateCategory(TStrType inName) override
+ {
+ TCharPtr theName(Intern(inName));
+ TNameCategoryMap::iterator find = m_NameToCategories.find(theName);
+ if (find != m_NameToCategories.end())
+ return make_pair(find->second, false);
+
+ TCategoryHandle retval(GetNextId());
+ InsertWithTransaction(__FILE__, __LINE__, make_pair(retval, SCategoryInfo(inName)),
+ m_Categories);
+ InsertWithTransaction(__FILE__, __LINE__, make_pair(theName, retval), m_NameToCategories);
+ return make_pair(retval, true);
+ }
+
+ void SetCategoryInfo(Qt3DSDMCategoryHandle inCategory, TStrType inIcon,
+ TStrType inHighlight, TStrType inDescription) override
+ {
+ SCategoryInfo *infoPtr(FindCategory(inCategory));
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SCategoryInfo &newInfo(*infoPtr);
+ SCategoryInfo oldInfo(newInfo);
+
+ newInfo.m_Icon = inIcon;
+ newInfo.m_HighlightIcon = inHighlight;
+ newInfo.m_Description = inDescription;
+ CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer, inCategory, oldInfo, newInfo,
+ m_Categories);
+ }
+
+ void DestroyCategory(Qt3DSDMCategoryHandle inCategory) override
+ {
+ SCategoryInfo *infoPtr(FindCategory(inCategory));
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ EraseWithTransaction(__FILE__, __LINE__, Intern(infoPtr->m_Name), m_NameToCategories);
+ EraseWithTransaction(__FILE__, __LINE__, inCategory, m_Categories);
+ }
+ Option<SCategoryInfo> GetCategoryInfo(Qt3DSDMCategoryHandle inCategory) override
+ {
+ SCategoryInfo *infoPtr(FindCategory(inCategory));
+ if (infoPtr)
+ return *infoPtr;
+ return Empty();
+ }
+ Qt3DSDMCategoryHandle FindCategoryByName(TStrType inName) override
+ {
+ TCharPtr theName(Intern(inName));
+ TNameCategoryMap::iterator find = m_NameToCategories.find(theName);
+ if (find != m_NameToCategories.end())
+ return find->second;
+ return 0;
+ }
+
+ void GetCategories(vector<Qt3DSDMCategoryHandle> &outCategories) override
+ {
+ for (TCategoryMap::iterator iter = m_Categories.begin(), end = m_Categories.end();
+ iter != end; ++iter)
+ outCategories.push_back(iter->first);
+ }
+
+ Option<SCategoryInfo> GetEventCategory(TStrType inName) override
+ {
+ return GetCategoryInfo(FindCategoryByName(inName));
+ }
+
+ Option<SCategoryInfo> GetHandlerCategory(TStrType inName) override
+ {
+ return GetCategoryInfo(FindCategoryByName(inName));
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Properties
+
+ Qt3DSDMMetaDataPropertyHandle CreateMetaDataProperty(Qt3DSDMInstanceHandle inInstance) override
+ {
+ return CreateItem<Qt3DSDMMetaDataPropertyHandle, SMetaDataPropertyInfo>(
+ __FILE__, __LINE__, inInstance, m_Properties, m_InstanceToProperties);
+ }
+
+ void EnsureDataCoreProperty(SMetaDataPropertyInfo &newInfo)
+ {
+ m_IgnorePropertyDeleted = true;
+ // If the existing property under the new name doesn't match
+ // the new info, then we also have to delete the property
+ Qt3DSDMPropertyHandle theExistingProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(newInfo.m_Instance, newInfo.m_Name);
+ // Ensure the types match.
+ if (theExistingProperty.Valid()) {
+ Qt3DSDMPropertyDefinition theDefinition(m_DataCore->GetProperty(theExistingProperty));
+ if (theDefinition.m_Name != newInfo.m_Name
+ || theDefinition.m_Type != newInfo.GetDataType()) {
+ m_DataCore->RemoveProperty(theExistingProperty);
+ theExistingProperty = 0;
+ }
+ }
+
+ // Finally, if we don't have a property at this point, create a new property
+ if (theExistingProperty.Valid() == false)
+ theExistingProperty = m_DataCore->AddProperty(
+ newInfo.m_Instance, newInfo.m_Name.wide_str(), newInfo.GetDataType());
+ newInfo.m_Property = theExistingProperty;
+ m_IgnorePropertyDeleted = false;
+ }
+
+ // If the type doesn't match the default, then it has no default.
+ SValue VerifyDefaultPropertyType(DataModelDataType::Value inDataType, const SValue &inValue)
+ {
+ if (inValue.empty() == false) {
+ DataModelDataType::Value theType = GetValueType(inValue);
+ if (theType != inDataType) {
+ return SValue(0.0f);
+ }
+ }
+ return inValue;
+ }
+ // If the datatype doesn't match the value, force the value to match the type.
+ // some types *have* to have values.
+ TMetaDataData VerifyMetaDataDataType(AdditionalMetaDataType::Value inDataType,
+ const TMetaDataData &inValue)
+ {
+ if (inDataType == AdditionalMetaDataType::StringList
+ || inDataType == AdditionalMetaDataType::Range) {
+ if (inValue.empty() == true || inDataType != GetMetaDataValueType(inValue)) {
+ QT3DS_ASSERT(false);
+ if (inDataType == AdditionalMetaDataType::StringList)
+ return TMetaDataStringList();
+ if (inDataType == AdditionalMetaDataType::Range)
+ return SMetaDataRange(0, 1);
+ }
+ }
+ return inValue;
+ }
+
+ void SetPropertyBaseInfo(SMetaPropertyBase &newInfo, TStrType inName, TStrType inFormalName,
+ TStrType inDescription, TStrType inUsage,
+ CompleteMetaDataType::Enum inDataType, const SValue &inDefaultValue,
+ const TMetaDataData &inMetaData)
+ {
+ newInfo.m_Name = inName;
+ newInfo.m_FormalName = inFormalName;
+ newInfo.m_Description = inDescription;
+ newInfo.m_Usage = inUsage;
+ newInfo.m_CompleteType = inDataType;
+ newInfo.m_DefaultValue =
+ VerifyDefaultPropertyType(CompleteMetaDataType::ToDataType(inDataType),
+ inDefaultValue);
+ newInfo.m_MetaDataData =
+ VerifyMetaDataDataType(CompleteMetaDataType::ToAdditionalType(inDataType),
+ inMetaData);
+ }
+
+ // For properties, you set the default values separately
+ // This may delete the underlying data model property rebuild it.
+ void SetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inPropertyHandle,
+ TStrType inName, TStrType inFormalName,
+ TStrType inDescription, TStrType inUsage,
+ CompleteMetaDataType::Enum inDataType,
+ const SValue &inDefaultValue,
+ const TMetaDataData &inMetaData, TStrType inGroupName,
+ bool inIsHidden, bool inIsAnimatable,
+ bool inIsControllable) override
+ {
+ SMetaDataPropertyInfo *infoPtr = FindProperty(inPropertyHandle);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SMetaDataPropertyInfo &newInfo(*infoPtr);
+ SMetaDataPropertyInfo oldInfo(newInfo);
+
+ SetPropertyBaseInfo(newInfo, inName, inFormalName, inDescription, inUsage, inDataType,
+ inDefaultValue, inMetaData);
+ newInfo.m_IsHidden = inIsHidden;
+ newInfo.m_Animatable = inIsAnimatable;
+ newInfo.m_Controllable = inIsControllable;
+ newInfo.m_GroupName = inGroupName;
+ EnsureDataCoreProperty(newInfo);
+
+ SetItemInfo(__FILE__, __LINE__, inPropertyHandle, oldInfo, newInfo, m_Properties,
+ m_InstanceNameToProperties);
+
+ SetPropertyDefault(newInfo, CompleteMetaDataType::ToDataType(inDataType));
+ }
+
+ void SetPropertyDefault(SMetaDataPropertyInfo &newInfo, DataModelDataType::Value inDataType)
+ {
+ if (newInfo.m_DefaultValue.empty() == false
+ && GetValueType(newInfo.m_DefaultValue) == inDataType) {
+ m_DataCore->SetInstancePropertyValue(newInfo.m_Instance, newInfo.m_Property,
+ newInfo.m_DefaultValue);
+ }
+ }
+
+ // Destroy just this meta data property
+ void DestroyMetaDataProperty(Qt3DSDMMetaDataPropertyHandle inProperty) override
+ {
+ SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (DestroyItem(__FILE__, __LINE__, inProperty,
+ m_Properties, m_InstanceNameToProperties, m_InstanceToProperties)) {
+ Q_EMIT internalMetaDataPropertyDestroyed(inProperty);
+ }
+
+ RemoveMetaDataPropertyFilters(inProperty);
+ }
+
+ Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance,
+ TStrType inPropertyName) override
+ {
+ return FindItemByName<Qt3DSDMMetaDataPropertyHandle>(inInstance, Intern(inPropertyName),
+ m_InstanceNameToProperties);
+ }
+ Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ Qt3DSDMPropertyDefinition propDef(m_DataCore->GetProperty(inProperty));
+ return GetMetaDataProperty(inInstance, propDef.m_Name);
+ }
+ // Sets the value in the data core
+ virtual Option<SMetaDataPropertyInfo>
+ GetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inProperty) override
+ {
+ SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty);
+ if (infoPtr == NULL) {
+ return Empty();
+ }
+ return *infoPtr;
+ }
+
+ void GetMetaDataProperties(Qt3DSDMInstanceHandle inInstance,
+ vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) override
+ {
+ return GetHandleList<Qt3DSDMMetaDataPropertyHandle>(inInstance, m_InstanceToProperties,
+ m_Properties, outProperties);
+ }
+ virtual Qt3DSDMMetaDataPropertyHandle
+ GetSpecificMetaDataProperty(Qt3DSDMInstanceHandle inInstance, TStrType inPropertyName)
+ {
+ TInstancePropertyNamePropertyMap::iterator theFind = m_InstanceNameToProperties.find(
+ make_pair(inInstance, m_StringTable.RegisterStr(inPropertyName.wide_str())));
+ if (theFind != m_InstanceNameToProperties.end())
+ return theFind->second;
+ return 0;
+ }
+ virtual Qt3DSDMMetaDataPropertyHandle
+ GetOrCreateSpecificMetaDataProperty(Qt3DSDMInstanceHandle inInstance,
+ TStrType inPropertyName) override
+ {
+ Qt3DSDMMetaDataPropertyHandle theProp(
+ GetSpecificMetaDataProperty(inInstance, inPropertyName));
+ if (theProp.Valid())
+ return theProp;
+ return CreateMetaDataProperty(inInstance);
+ }
+
+ void GetSpecificMetaDataProperties(Qt3DSDMInstanceHandle inInstance,
+ vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) override
+ {
+ TInstancePropertyMap::iterator find = m_InstanceToProperties.find(inInstance);
+ if (find != m_InstanceToProperties.end())
+ outProperties.insert(outProperties.end(), find->second.begin(), find->second.end());
+ }
+
+ TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty));
+ SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle);
+ if (infoPtr)
+ return infoPtr->m_FormalName;
+ return TCharStr();
+ }
+ AdditionalMetaDataType::Value GetAdditionalMetaDataType(
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override
+ {
+ Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty));
+ SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle);
+ if (infoPtr)
+ return infoPtr->GetAdditionalType();
+ return AdditionalMetaDataType::None;
+ }
+ TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty));
+ SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle);
+ if (propHandle.Valid())
+ return infoPtr->m_MetaDataData;
+ return TMetaDataData();
+ }
+
+ bool IsCustomInstance(Qt3DSDMInstanceHandle inInstance)
+ {
+ return m_InstancesToCanonicalType.find(inInstance) == m_InstancesToCanonicalType.end();
+ }
+
+ SValue GetDefaultValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ Qt3DSDMMetaDataPropertyHandle theProperty(GetMetaDataProperty(inInstance, inProperty));
+ if (theProperty.Valid() == false) {
+ QT3DS_ASSERT(false);
+ return SValue();
+ }
+ return FindProperty(theProperty)->m_DefaultValue;
+ }
+
+ bool IsCustomProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty));
+ SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle);
+ if (infoPtr)
+ return IsCustomInstance(infoPtr->m_Instance);
+
+ return false;
+ }
+
+ bool IsFilterValid(Qt3DSDMMetaDataPropertyHandle inProperty,
+ const SPropertyFilterInfo &inFilter)
+ {
+ SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty);
+ if (m_DataCore->IsProperty(inFilter.m_FilterProperty) == false) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ Qt3DSDMPropertyDefinition theProp(m_DataCore->GetProperty(inFilter.m_FilterProperty));
+ Qt3DSDMPropertyHandle propCheck =
+ m_DataCore->GetAggregateInstancePropertyByName(infoPtr->m_Instance, theProp.m_Name);
+ if (propCheck != inFilter.m_FilterProperty) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ DataModelDataType::Value theType = GetValueType(inFilter.m_Value);
+ if (theType != theProp.m_Type) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ return true;
+ }
+
+ void SetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty,
+ NVConstDataRef<SPropertyFilterInfo> inFilters) override
+ {
+ SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ eastl::vector<SPropertyFilterInfo> newFilters;
+ for (QT3DSU32 idx = 0, end = inFilters.size(); idx < end; ++idx) {
+ const SPropertyFilterInfo &theFilter(inFilters[idx]);
+ if (IsFilterValid(inProperty, theFilter))
+ newFilters.push_back(theFilter);
+ }
+
+ InsertOrUpdateWithTransaction(std::make_pair(inProperty, newFilters), m_PropertyFilters);
+ }
+
+ virtual NVConstDataRef<SPropertyFilterInfo>
+ GetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) override
+ {
+ TMetaDataPropertyFilterMap::iterator theIter(m_PropertyFilters.find(inProperty));
+ if (theIter != m_PropertyFilters.end())
+ return qt3ds::foundation::toDataRef(theIter->second.data(), theIter->second.size());
+ return NVConstDataRef<SPropertyFilterInfo>();
+ }
+
+ void RemoveMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) override
+ {
+ TMetaDataPropertyFilterMap::iterator theIter(m_PropertyFilters.find(inProperty));
+ if (theIter != m_PropertyFilters.end())
+ EraseWithTransaction(__FILE__, __LINE__, inProperty, m_PropertyFilters);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Properties
+ Qt3DSDMEventHandle CreateMetaDataEvent(TInstanceHandle inInstance) override
+ {
+ return CreateItem<Qt3DSDMEventHandle, SEvent>(__FILE__, __LINE__, inInstance, m_Events,
+ m_InstanceToEvents);
+ }
+
+ void SetEventInfo(Qt3DSDMEventHandle inEventHandle, TStrType inName,
+ TStrType inFormalName, TStrType inCategory, TStrType inDescription) override
+ {
+ SEvent *infoPtr = FindEvent(inEventHandle);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SEvent &newInfo(*infoPtr);
+ SEvent oldInfo(newInfo);
+ newInfo.m_Name = inName;
+ newInfo.m_FormalName = inFormalName;
+ newInfo.m_Category = inCategory;
+ newInfo.m_Description = inDescription;
+ SetItemInfo(__FILE__, __LINE__, inEventHandle, oldInfo, newInfo, m_Events,
+ m_InstanceNameToEvents);
+ }
+
+ void DestroyEvent(Qt3DSDMEventHandle inEventHandle) override
+ {
+ if (DestroyItem(__FILE__, __LINE__, inEventHandle, m_Events,
+ m_InstanceNameToEvents, m_InstanceToEvents)) {
+ Q_EMIT internalEventDestroyed(inEventHandle);
+ }
+ }
+
+ void GetEvents(Qt3DSDMInstanceHandle inInstance, TEventHandleList &outEvents) override
+ {
+ return GetHandleList<Qt3DSDMEventHandle>(inInstance, m_InstanceToEvents, m_Events,
+ outEvents);
+ }
+
+ Qt3DSDMEventHandle FindEvent(Qt3DSDMInstanceHandle inInstance, TStrType inName) override
+ {
+ return FindItemByName<Qt3DSDMEventHandle>(inInstance, Intern(inName),
+ m_InstanceNameToEvents);
+ }
+
+ Option<SEventInfo> GetEventInfo(Qt3DSDMEventHandle inEventHandle) override
+ {
+ SEvent *infoPtr = FindEvent(inEventHandle);
+ if (infoPtr == NULL) {
+ return Empty();
+ }
+ SEventInfo retval;
+ retval.m_Name = infoPtr->m_Name;
+ retval.m_FormalName = infoPtr->m_FormalName;
+ retval.m_Description = infoPtr->m_Description;
+ retval.m_Category = infoPtr->m_Category;
+ return retval;
+ }
+
+ bool IsCustomEvent(Qt3DSDMEventHandle inEventHandle) override
+ {
+ SEvent *infoPtr = FindEvent(inEventHandle);
+ if (infoPtr != NULL)
+ return IsCustomInstance(infoPtr->m_Instance);
+ return false;
+ }
+
+ void GetSpecificEvents(Qt3DSDMInstanceHandle inInstance, TEventHandleList &outEvents) override
+ {
+ TInstanceEventMap::iterator theFind(m_InstanceToEvents.find(inInstance));
+ if (theFind != m_InstanceToEvents.end())
+ outEvents.insert(outEvents.end(), theFind->second.begin(), theFind->second.end());
+ }
+
+ Qt3DSDMEventHandle GetOrCreateSpecificEvent(Qt3DSDMInstanceHandle inInstance,
+ TStrType inName) override
+ {
+ TInstanceEventNameEventMap::iterator theFind(
+ m_InstanceNameToEvents.find(make_pair(inInstance, Intern(inName))));
+ if (theFind != m_InstanceNameToEvents.end())
+ return theFind->second;
+ return CreateMetaDataEvent(inInstance);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Handlers
+
+ Qt3DSDMHandlerHandle CreateHandler(Qt3DSDMInstanceHandle inInstance) override
+ {
+ return CreateItem<Qt3DSDMHandlerHandle, SHandler>(__FILE__, __LINE__, inInstance,
+ m_Handlers, m_InstanceToHandlers);
+ }
+
+ void SetHandlerInfo(Qt3DSDMHandlerHandle inHandle, TStrType inName,
+ TStrType inFormalName, TStrType inCategoryName,
+ TStrType inDescription) override
+ {
+ SHandler *infoPtr = FindHandler(inHandle);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SHandler &newInfo(*infoPtr);
+ SHandler oldInfo(newInfo);
+ newInfo.m_Name = inName;
+ newInfo.m_FormalName = inFormalName;
+ newInfo.m_Description = inDescription;
+ newInfo.m_Category = inCategoryName;
+ SetItemInfo(__FILE__, __LINE__, inHandle, oldInfo, newInfo, m_Handlers,
+ m_InstanceNameToHandlers);
+ }
+
+ void DestroyHandler(Qt3DSDMHandlerHandle inHandlerHandle) override
+ {
+ SHandler *infoPtr(FindHandler(inHandlerHandle));
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ while (infoPtr->m_Arguments.empty() == false)
+ DestroyHandlerArgument(inHandlerHandle, (QT3DSU32)infoPtr->m_Arguments.size() - 1);
+ if (DestroyItem(__FILE__, __LINE__, inHandlerHandle, m_Handlers,
+ m_InstanceNameToHandlers, m_InstanceToHandlers)) {
+ Q_EMIT internalHandlerDestroyed(inHandlerHandle);
+ }
+ }
+
+ Qt3DSDMHandlerHandle FindHandlerByName(Qt3DSDMInstanceHandle inInstance,
+ TStrType inName) override
+ {
+ return FindItemByName<Qt3DSDMHandlerHandle>(inInstance, Intern(inName),
+ m_InstanceNameToHandlers);
+ }
+
+ Option<SHandlerInfo> GetHandlerInfo(Qt3DSDMHandlerHandle inHandlerHandle) override
+ {
+ SHandler *infoPtr = FindHandler(inHandlerHandle);
+ if (infoPtr == NULL)
+ return Empty();
+
+ SHandlerInfo retval;
+ retval.m_Name = infoPtr->m_Name;
+ retval.m_FormalName = infoPtr->m_FormalName;
+ retval.m_Category = infoPtr->m_Category;
+ retval.m_Description = infoPtr->m_Description;
+
+ return retval;
+ }
+
+ void GetHandlers(Qt3DSDMInstanceHandle inInstance, THandlerHandleList &outHandlers) override
+ {
+ return GetHandleList<Qt3DSDMHandlerHandle>(inInstance, m_InstanceToHandlers, m_Handlers,
+ outHandlers);
+ }
+
+ bool IsCustomHandler(Qt3DSDMHandlerHandle inHandle) override
+ {
+ SHandler *infoPtr = FindHandler(inHandle);
+ if (infoPtr != NULL)
+ return IsCustomInstance(infoPtr->m_Instance);
+ return false;
+ }
+
+ void GetSpecificHandlers(Qt3DSDMInstanceHandle inInstance,
+ THandlerHandleList &outHandlers) override
+ {
+ TInstanceHandlerMap::iterator theFind = m_InstanceToHandlers.find(inInstance);
+ if (theFind != m_InstanceToHandlers.end())
+ outHandlers.insert(outHandlers.end(), theFind->second.begin(), theFind->second.end());
+ }
+
+ Qt3DSDMHandlerHandle GetOrCreateSpecificHandler(Qt3DSDMInstanceHandle inInstance,
+ TStrType inName) override
+ {
+ TInstanceHandlerNameHandlerMap::iterator theFind =
+ m_InstanceNameToHandlers.find(make_pair(inInstance, Intern(inName)));
+ if (theFind != m_InstanceNameToHandlers.end())
+ return theFind->second;
+ return CreateHandler(inInstance);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Handler Arguments
+
+ void DoAddHandlerArgument(Qt3DSDMHandlerHandle inHandler,
+ const SMetaDataHandlerArgumentInfo &inArgHandle, QT3DSU32 inIdx)
+ {
+ SHandler *infoPtr = FindHandler(inHandler);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ infoPtr->m_Arguments.insert(infoPtr->m_Arguments.begin() + inIdx, inArgHandle);
+ }
+
+ struct ArgNameEqual
+ {
+ const TCharStr &m_Name;
+ ArgNameEqual(const TCharStr &nm)
+ : m_Name(nm)
+ {
+ }
+ bool operator()(const SMetaDataHandlerArgumentInfo &info) const
+ {
+ return m_Name == info.m_Name;
+ }
+ };
+
+ void DoRemoveHandlerArgument(Qt3DSDMHandlerHandle inHandler,
+ const SMetaDataHandlerArgumentInfo &inArgHandle)
+ {
+ SHandler *infoPtr = FindHandler(inHandler);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ erase_if(infoPtr->m_Arguments, ArgNameEqual(inArgHandle.m_Name));
+ }
+
+ struct HandlerArgumentAddRemoveTransaction : public ITransaction
+ {
+ SNewMetaDataImpl &m_Impl;
+ Qt3DSDMHandlerHandle m_Handler;
+ SMetaDataHandlerArgumentInfo m_Arg;
+ QT3DSU32 m_Idx;
+ bool m_AddOnDo;
+
+ HandlerArgumentAddRemoveTransaction(const char *inFile, int inLine, SNewMetaDataImpl &impl,
+ Qt3DSDMHandlerHandle hdl,
+ const SMetaDataHandlerArgumentInfo &arg, QT3DSU32 inIdx,
+ bool inAddOnDo)
+ : ITransaction(inFile, inLine)
+ , m_Impl(impl)
+ , m_Handler(hdl)
+ , m_Arg(arg)
+ , m_Idx(inIdx)
+ , m_AddOnDo(inAddOnDo)
+ {
+ }
+ void insert() { m_Impl.DoAddHandlerArgument(m_Handler, m_Arg, m_Idx); }
+ void remove() { m_Impl.DoRemoveHandlerArgument(m_Handler, m_Arg); }
+ void Do() override
+ {
+ if (m_AddOnDo)
+ insert();
+ else
+ remove();
+ }
+ void Undo() override
+ {
+ if (m_AddOnDo)
+ remove();
+ else
+ insert();
+ }
+ };
+
+ QT3DSU32 AddHandlerArgument(Qt3DSDMHandlerHandle inHandler) override
+ {
+ SHandler *infoPtr = FindHandler(inHandler);
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ SMetaDataHandlerArgumentInfo theInfo(inHandler);
+ QT3DSU32 idx = (QT3DSU32)infoPtr->m_Arguments.size();
+ DoAddHandlerArgument(inHandler, theInfo, idx);
+ if (m_Consumer)
+ m_Consumer->OnTransaction(make_shared<HandlerArgumentAddRemoveTransaction>(
+ __FILE__, __LINE__, ref(*this), inHandler, theInfo,
+ idx, true));
+
+ return idx;
+ }
+
+ void DoSetHandlerArgument(THandlerHandle inHandler, QT3DSU32 inIdx,
+ const SMetaDataHandlerArgumentInfo &inInfo)
+ {
+ SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandler, inIdx));
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ *infoPtr = inInfo;
+ }
+
+ struct SetHandlerArgumentInfoTrans : public ITransaction
+ {
+ SNewMetaDataImpl &m_Impl;
+ THandlerHandle m_Handler;
+ QT3DSU32 m_Idx;
+ SMetaDataHandlerArgumentInfo m_NewValue;
+ SMetaDataHandlerArgumentInfo m_OldValue;
+ SetHandlerArgumentInfoTrans(const char *inFile, int inLine, SNewMetaDataImpl &impl,
+ THandlerHandle handler, QT3DSU32 inIdx,
+ const SMetaDataHandlerArgumentInfo &inNewVal,
+ const SMetaDataHandlerArgumentInfo &inOldVal)
+ : ITransaction(inFile, inLine)
+ , m_Impl(impl)
+ , m_Handler(handler)
+ , m_Idx(inIdx)
+ , m_NewValue(inNewVal)
+ , m_OldValue(inOldVal)
+ {
+ }
+ void Do() override { m_Impl.DoSetHandlerArgument(m_Handler, m_Idx, m_NewValue); }
+ void Undo() override { m_Impl.DoSetHandlerArgument(m_Handler, m_Idx, m_OldValue); }
+ };
+
+ void SetHandlerArgumentInfo(THandlerHandle inHandler, QT3DSU32 inIdx, TStrType inName,
+ TStrType inFormalName, TStrType inDescription,
+ CompleteMetaDataType::Enum inDataType,
+ const SValue &inDefaultValue,
+ const TMetaDataData &inMetaData,
+ HandlerArgumentType::Value inArgType) override
+ {
+ SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandler, inIdx));
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SMetaDataHandlerArgumentInfo &newInfo(*infoPtr);
+ SMetaDataHandlerArgumentInfo oldInfo(newInfo);
+ SetPropertyBaseInfo(newInfo, inName, inFormalName, inDescription, L"", inDataType,
+ inDefaultValue, inMetaData);
+ newInfo.m_ArgType = inArgType;
+ if (m_Consumer != NULL)
+ m_Consumer->OnTransaction(make_shared<SetHandlerArgumentInfoTrans>(
+ __FILE__, __LINE__, ref(*this), inHandler, inIdx,
+ newInfo, oldInfo));
+ }
+
+ void DestroyHandlerArgument(THandlerHandle inHandler, QT3DSU32 inIdx) override
+ {
+ SHandler *ownerPtr = FindHandler(inHandler);
+ SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandler, inIdx));
+ if (infoPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (ownerPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ Q_EMIT internalHandlerArgDestroyed(inHandler, inIdx);
+
+ if (m_Consumer)
+ m_Consumer->OnTransaction(make_shared<HandlerArgumentAddRemoveTransaction>(
+ __FILE__, __LINE__, ref(*this), infoPtr->m_Handler,
+ *infoPtr, inIdx, false));
+
+ DoRemoveHandlerArgument(infoPtr->m_Handler, *infoPtr);
+ }
+
+ Option<SMetaDataHandlerArgumentInfo> FindHandlerArgumentByName(THandlerHandle inHandler,
+ TStrType inName) override
+ {
+ SHandler *ownerPtr = FindHandler(inHandler);
+ if (ownerPtr == NULL) {
+ return Empty();
+ }
+ for (size_t idx = 0, end = ownerPtr->m_Arguments.size(); idx < end; ++idx) {
+ if (ownerPtr->m_Arguments[idx].m_Name == inName)
+ return ownerPtr->m_Arguments[idx];
+ }
+ return Empty();
+ }
+
+ void GetHandlerArguments(THandlerHandle inHandler,
+ vector<SMetaDataHandlerArgumentInfo> &outArguments) override
+ {
+ SHandler *ownerPtr = FindHandler(inHandler);
+ if (ownerPtr == NULL) {
+ return;
+ }
+ outArguments.insert(outArguments.end(), ownerPtr->m_Arguments.begin(),
+ ownerPtr->m_Arguments.end());
+ }
+
+ virtual Option<SMetaDataHandlerArgumentInfo>
+ GetHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandle, QT3DSU32 inIdx) override
+ {
+ SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandle, inIdx));
+ if (infoPtr == NULL) {
+ return Empty();
+ }
+ return *infoPtr;
+ }
+
+ QT3DSU32 GetNumHandlerArguments(Qt3DSDMHandlerHandle inHandler) override
+ {
+ SHandler *ownerPtr = FindHandler(inHandler);
+ if (ownerPtr == NULL) {
+ return 0;
+ }
+ return (QT3DSU32)ownerPtr->m_Arguments.size();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // References
+ void AddReference(Qt3DSDMInstanceHandle inInstance, TStrType inRefString) override
+ {
+ // trim whitespace from the beginning and the end of the string
+ TCharStr::size_type startPos = inRefString.find_first_not_of(L"\n\r\t ");
+ TCharStr::size_type endPos = inRefString.find_last_not_of(L"\n\r\t ");
+ const wchar_t *theStr = NULL;
+ if (startPos != TCharStr::npos) {
+ TStrType temp = inRefString.substr(startPos, endPos - startPos + 1);
+ theStr = Intern(temp);
+ } else
+ theStr = Intern(inRefString);
+
+ QT3DSU32 idx = AddItemToInstanceList(inInstance, theStr, m_InstanceToReferences);
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(
+ std::make_shared<InstanceListTransaction<TInstanceStringListMap,
+ const wchar_t *>>(
+ __FILE__, __LINE__, inInstance, theStr,
+ std::ref(m_InstanceToReferences), idx,
+ true));
+ }
+ }
+
+ void DestroyReferences(Qt3DSDMInstanceHandle inInstance) override
+ {
+ TInstanceStringListMap::iterator find = m_InstanceToReferences.find(inInstance);
+
+ if (find == m_InstanceToReferences.end())
+ return;
+
+ CreateHashMapEraseTransaction(__FILE__, __LINE__, m_Consumer,
+ make_pair(find->first, find->second), m_InstanceToReferences);
+ m_InstanceToReferences.erase(find);
+ }
+
+ struct InternSizeTOpType
+ {
+ SNewMetaDataImpl &m_Impl;
+ InternSizeTOpType(SNewMetaDataImpl &inImpl)
+ : m_Impl(inImpl)
+ {
+ }
+
+ size_t operator()(const TCharStr &inHandle)
+ {
+ return reinterpret_cast<size_t>(m_Impl.Intern(inHandle));
+ }
+ };
+
+ void GetReferences(Qt3DSDMInstanceHandle inInstance, vector<TCharStr> &outReferences) override
+ {
+ DoGetHandleList(inInstance, m_InstanceToReferences, outReferences,
+ InternSizeTOpType(*this));
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Instance-global functions
+ // Destroy all meta data that relates to this instance.
+ // Calling this on a derived instance does nothing, this only works if this specific
+ // instance was mapped to a type.
+ // This function must be completely undoable.
+ void DestroyMetaData(Qt3DSDMInstanceHandle inInstance) override
+ {
+ ForEachItem<TMetaDataPropertyHandle>(
+ inInstance, m_InstanceToProperties,
+ bind(&SNewMetaDataImpl::DestroyMetaDataProperty, this,
+ std::placeholders::_1));
+ ForEachItem<TEventHandle>(inInstance, m_InstanceToEvents,
+ bind(&SNewMetaDataImpl::DestroyEvent, this,
+ std::placeholders::_1));
+ ForEachItem<THandlerHandle>(inInstance, m_InstanceToHandlers,
+ bind(&SNewMetaDataImpl::DestroyHandler, this,
+ std::placeholders::_1));
+ DestroyReferences(inInstance);
+
+ TInstanceStrMap::iterator find = m_InstancesToCanonicalType.find(inInstance);
+ if (find != m_InstancesToCanonicalType.end()) {
+ TCharPtr theName(find->second);
+ m_CanonicalTypeToInstances.erase(theName);
+ m_InstancesToCanonicalType.erase(inInstance);
+ CreateHashMapEraseTransaction(__FILE__, __LINE__, m_Consumer,
+ make_pair(theName, inInstance),
+ m_CanonicalTypeToInstances);
+ CreateHashMapEraseTransaction(__FILE__, __LINE__, m_Consumer,
+ make_pair(inInstance, theName),
+ m_InstancesToCanonicalType);
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Serialization
+ // You can either save out in canonical format (and it will only save canonical-instance-related
+ // information *or* you can save out in normal format where we link directly to instance handle
+ // instead of to typename
+ template <typename THashType>
+ void AddInstancesFromHash(THashType &inHash,
+ unordered_set<TInstanceHandle, hash<int>> &outInstances)
+ {
+ for (typename THashType::const_iterator iter = inHash.begin(), end = inHash.end();
+ iter != end; ++iter)
+ outInstances.insert(iter->first);
+ }
+
+ void SerializeMetaDataData(IDOMWriter &inWriter, TMetaDataData &inItem,
+ AdditionalMetaDataType::Value inType)
+ {
+ if (!inItem.empty()) {
+ if (inType == AdditionalMetaDataType::Range) {
+ SMetaDataRange theRange(get<SMetaDataRange>(inItem));
+ inWriter.Att(L"min", theRange.m_min);
+ inWriter.Att(L"max", theRange.m_max);
+ inWriter.Att(L"decimals", theRange.m_decimals);
+ } else if (inType == AdditionalMetaDataType::StringList) {
+ const TMetaDataStringList &theList(get<TMetaDataStringList>(inItem));
+ TCharStr theBuffer;
+ for (uint32_t idx = 0, end = theList.size(); idx < end; ++idx) {
+ if (idx)
+ theBuffer.append(L":");
+ theBuffer.append(theList[idx]);
+ }
+ inWriter.Att(L"list", theBuffer.wide_str());
+ }
+ }
+ }
+
+ void SerializeDataModelValue(IDOMWriter &inWriter, const SValue &inValue,
+ DataModelDataType::Value /*inType*/,
+ const wchar_t *inName = L"default")
+ {
+ if (inValue.empty())
+ return;
+
+ m_TempBuffer.clear();
+ WCharTWriter writer(m_TempBuffer);
+ WStrOps<SValue>().ToBuf(inValue, writer);
+
+ if (m_TempBuffer.size()) {
+ m_TempBuffer.write((QT3DSU16)0);
+ inWriter.Att(inName, (const wchar_t *)m_TempBuffer.begin());
+ }
+ }
+
+ void SerializeDataModelValue(IDOMReader &inReader, SValue &outValue,
+ DataModelDataType::Value inType,
+ const wchar_t *inName = L"default")
+ {
+ const char8_t *theDefaultValue;
+ qt3ds::foundation::ConvertUTF(
+ reinterpret_cast<const qt3ds::foundation::TWCharEASTLConverter::TCharType *>(
+ inName), 0,
+ m_ConvertStr);
+ if (inReader.UnregisteredAtt(m_ConvertStr.c_str(), theDefaultValue)) {
+ m_TempBuffer.clear();
+ // We have to write a temporary value because the parsing of floats,
+ // in order to be efficient, is destructive.
+ if (theDefaultValue && *theDefaultValue)
+ m_TempBuffer.write(theDefaultValue, (QT3DSU32)strlen(theDefaultValue) + 1);
+
+ if (m_TempBuffer.size() == 0) {
+ SetDefault(inType, outValue);
+ return;
+ }
+ m_ReadBuffer.clear();
+
+ char8_t *trashPtr = (char8_t *)m_TempBuffer.begin();
+ WCharTReader theReader(trashPtr, m_ReadBuffer, m_StringTable);
+ outValue = WStrOps<SValue>().BufTo(inType, theReader);
+ } else
+ SetDefault(inType, outValue);
+ }
+
+ void SerializeMetaDataData(IDOMReader &inReader, TMetaDataData &ioItem,
+ CompleteMetaDataType::Enum &ioType)
+ {
+ // Use the meta data extra information to force the type
+ // to something that works correctly.
+ SMetaDataRange theRange;
+ if (inReader.Att("min", theRange.m_min) && inReader.Att("max", theRange.m_max)) {
+ inReader.Att("decimals", theRange.m_decimals);
+ ioItem = theRange;
+ if (ioType == CompleteMetaDataType::Long)
+ ioType = CompleteMetaDataType::LongRange;
+ else
+ ioType = CompleteMetaDataType::FloatRange;
+ } else {
+ TMetaDataStringList theList;
+ TCharStr theItems;
+ if (inReader.Att(L"list", theItems)) {
+ for (TCharStr::size_type theIter = theItems.find_first_of(L":,");
+ theIter != theItems.npos; theIter = theItems.find_first_of(L":,")) {
+ theList.push_back(theItems.substr(0, theIter));
+ theItems = theItems.substr(theIter + 1);
+ }
+ theList.push_back(theItems);
+ ioItem = theList;
+ if (ioType != CompleteMetaDataType::StringListOrInt)
+ ioType = CompleteMetaDataType::StringList;
+ }
+ }
+ }
+ void EnsureCategory(IDOMWriter &, const TCharStr &, const TCharStr &) {}
+ void EnsureCategory(IDOMReader &, TCharStr &inCategory, const TCharStr &inObjectName)
+ {
+ Qt3DSDMCategoryHandle theCategory = FindCategoryByName(inCategory);
+ if (theCategory.Valid() == false) {
+ if (inObjectName.empty()) {
+ QT3DS_ASSERT(false);
+ } else {
+ if (inCategory.empty())
+ inCategory = inObjectName;
+
+ pair<Qt3DSDMCategoryHandle, bool> theGetOrCreateResult(
+ GetOrCreateCategory(inCategory));
+
+ if (theGetOrCreateResult.second == true) {
+ SetCategoryInfo(theGetOrCreateResult.first, L"Objects-Behavior-Normal.png",
+ L"Objects-Behavior-Normal.png", inCategory);
+ }
+ }
+ }
+ }
+
+ void SerializePropertyBase(IDOMWriter &inArchive, SMetaPropertyBase &inItem)
+ {
+ inArchive.Att(L"name", inItem.m_Name);
+ if (inItem.m_FormalName != inItem.m_Name)
+ inArchive.Att(L"formalName", inItem.m_FormalName);
+ if (inItem.m_Description != inItem.m_Name)
+ inArchive.Att(L"description", inItem.m_Description);
+ if (inItem.m_CompleteType != CompleteMetaDataType::Float
+ && inItem.m_CompleteType != CompleteMetaDataType::FloatRange
+ && inItem.m_CompleteType != CompleteMetaDataType::LongRange
+ && inItem.m_CompleteType != CompleteMetaDataType::StringList) {
+ inArchive.Att(L"type", inItem.m_CompleteType);
+ }
+
+ // Ensure that all types work
+ if (inItem.GetAdditionalType() != AdditionalMetaDataType::None)
+ SerializeMetaDataData(inArchive, inItem.m_MetaDataData, inItem.GetAdditionalType());
+
+ if (inItem.GetDataType() != DataModelDataType::None) {
+ SValue theGlobalDefault;
+ SetDefault(inItem.GetDataType(), theGlobalDefault);
+ if (!Equals(theGlobalDefault.toOldSkool(), inItem.m_DefaultValue.toOldSkool()))
+ SerializeDataModelValue(inArchive, inItem.m_DefaultValue, inItem.GetDataType());
+ }
+ }
+
+ void SerializePropertyBase(IDOMReader &inArchive, SMetaPropertyBase &inItem)
+ {
+ inArchive.Att(L"name", inItem.m_Name);
+ inArchive.Att(L"formalName", inItem.m_FormalName);
+ inArchive.Att(L"usage", inItem.m_Usage);
+ inArchive.Att(L"description", inItem.m_Description);
+ inArchive.Att(L"type", inItem.m_CompleteType);
+ // Setup reasonable defaults in the case where the users are specifying little information
+ // in the file format
+ if (inItem.m_FormalName.empty())
+ inItem.m_FormalName = inItem.m_Name;
+ if (inItem.m_Description.empty())
+ inItem.m_Description = inItem.m_FormalName;
+
+ // Ensure that users can use a float type and make minimal decisions
+ SerializeMetaDataData(inArchive, inItem.m_MetaDataData, inItem.m_CompleteType);
+
+ if (inItem.GetDataType() != DataModelDataType::None)
+ SerializeDataModelValue(inArchive, inItem.m_DefaultValue, inItem.GetDataType());
+ }
+
+ void FinalizeCategory(IDOMWriter &, SCategoryInfo &) {}
+
+ void FinalizeCategory(IDOMReader &, SCategoryInfo &inCategory)
+ {
+ if (inCategory.m_Description.empty())
+ inCategory.m_Description = inCategory.m_Name;
+ }
+
+ template <typename TArchiveType>
+ void SerializeItem(TArchiveType &inArchive, SCategoryInfo &inItem)
+ {
+ inArchive.Att(L"name", inItem.m_Name);
+ inArchive.Att(L"description", inItem.m_Description);
+ inArchive.Att(L"icon", inItem.m_Icon);
+ inArchive.Att(L"highlightIcon", inItem.m_HighlightIcon);
+
+ FinalizeCategory(inArchive, inItem);
+ }
+
+ void SerializeItem(IDOMWriter &inArchive, SMetaDataPropertyInfo &inItem,
+ Qt3DSDMMetaDataPropertyHandle inHandle)
+ {
+ SerializePropertyBase(inArchive, inItem);
+ if (inItem.m_IsHidden == true)
+ inArchive.Att("hidden", inItem.m_IsHidden);
+ if (inItem.m_Animatable == false)
+ inArchive.Att("animatable", inItem.m_Animatable);
+ if (inItem.m_Controllable == true)
+ inArchive.Att("controllable", inItem.m_Controllable);
+ NVConstDataRef<SPropertyFilterInfo> theInfos = GetMetaDataPropertyFilters(inHandle);
+ for (QT3DSU32 idx = 0, end = theInfos.size(); idx < end; ++idx) {
+ const SPropertyFilterInfo &theInfo(theInfos[idx]);
+ Qt3DSDMPropertyDefinition thePropertyInfo(
+ m_DataCore->GetProperty(theInfo.m_FilterProperty));
+
+ const wchar_t *theFilterName;
+ if (theInfo.m_FilterType == PropertyFilterTypes::HideIfEqual)
+ theFilterName = L"HideIfEqual";
+ else
+ theFilterName = L"ShowIfEqual";
+
+ IDOMWriter::Scope filterScope(inArchive, theFilterName);
+ inArchive.Att(L"property", thePropertyInfo.m_Name);
+ SerializeDataModelValue(inArchive, theInfo.m_Value, thePropertyInfo.m_Type, L"value");
+ }
+ }
+
+ void SerializeItem(IDOMReader &inArchive, SMetaDataPropertyInfo &inItem,
+ Qt3DSDMMetaDataPropertyHandle inHandle)
+ {
+ QT3DS_ASSERT(inHandle.Valid());
+
+ SerializePropertyBase(inArchive, inItem);
+ inArchive.Att("hidden", inItem.m_IsHidden);
+ inArchive.Att("animatable", inItem.m_Animatable);
+ inArchive.Att("controllable", inItem.m_Controllable);
+ inArchive.Att(L"category", inItem.m_GroupName);
+ }
+
+ void ReadChildren(IDOMReader &inArchive, SMetaDataPropertyInfo &inItem,
+ Qt3DSDMMetaDataPropertyHandle inHandle)
+ {
+ IDOMReader::Scope __readerScope(inArchive);
+ eastl::vector<SPropertyFilterInfo> theFilters;
+ for (bool success = inArchive.MoveToFirstChild(); success;
+ success = inArchive.MoveToNextSibling()) {
+
+ if (AreEqual(inArchive.GetElementName(), L"ShowIfEqual")) {
+ TCharStr theName;
+ inArchive.Att(L"property", theName);
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(inItem.m_Instance, theName);
+ if (theProperty.Valid() == false) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ Qt3DSDMPropertyDefinition thePropDef(m_DataCore->GetProperty(theProperty));
+
+ SPropertyFilterInfo theInfo;
+ theInfo.m_FilterType = PropertyFilterTypes::ShowIfEqual;
+ theInfo.m_FilterProperty = theProperty;
+ SerializeDataModelValue(inArchive, theInfo.m_Value, thePropDef.m_Type, L"value");
+ theFilters.push_back(theInfo);
+ } else if (AreEqual(inArchive.GetElementName(), L"HideIfEqual")) {
+ TCharStr theName;
+ inArchive.Att(L"property", theName);
+ Qt3DSDMPropertyHandle theProperty =
+ m_DataCore->GetAggregateInstancePropertyByName(inItem.m_Instance, theName);
+ if (theProperty.Valid() == false) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ Qt3DSDMPropertyDefinition thePropDef(m_DataCore->GetProperty(theProperty));
+
+ SPropertyFilterInfo theInfo;
+ theInfo.m_FilterType = PropertyFilterTypes::HideIfEqual;
+ theInfo.m_FilterProperty = theProperty;
+ SerializeDataModelValue(inArchive, theInfo.m_Value, thePropDef.m_Type, L"value");
+ theFilters.push_back(theInfo);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ if (theFilters.size())
+ SetMetaDataPropertyFilters(
+ inHandle, qt3ds::foundation::toDataRef(theFilters.data(),
+ theFilters.size()));
+ }
+
+ void EnsureEventHandlerBase(IDOMWriter &, SEventAndHandlerBase &) {}
+
+ void EnsureEventHandlerBase(IDOMReader &, SEventAndHandlerBase &inItem)
+ {
+ if (inItem.m_FormalName.empty())
+ inItem.m_FormalName = inItem.m_Name;
+ if (inItem.m_Description.empty())
+ inItem.m_Description = inItem.m_Name;
+ }
+
+ void SerializeItem(IDOMWriter &inArchive, SEvent &inItem, Qt3DSDMEventHandle &)
+ {
+ inArchive.Att(L"name", inItem.m_Name);
+ if (inItem.m_Name != inItem.m_FormalName)
+ inArchive.Att(L"formalName", inItem.m_FormalName);
+ if (inItem.m_Category != L"Default")
+ inArchive.Att(L"category", inItem.m_Category);
+ if (inItem.m_Description != inItem.m_Name)
+ inArchive.Att(L"description", inItem.m_Description);
+
+ EnsureCategory(inArchive, inItem.m_Category, m_ObjectName);
+ EnsureEventHandlerBase(inArchive, inItem);
+ }
+
+ void SerializeItem(IDOMReader &inArchive, SEvent &inItem, Qt3DSDMEventHandle &)
+ {
+ inArchive.Att(L"name", inItem.m_Name);
+ inArchive.Att(L"formalName", inItem.m_FormalName);
+ inArchive.Att(L"category", inItem.m_Category);
+ EnsureCategory(inArchive, inItem.m_Category, m_ObjectName);
+ inArchive.Att(L"description", inItem.m_Description);
+ EnsureEventHandlerBase(inArchive, inItem);
+ }
+
+ void SerializeHandlerArgument(IDOMWriter &inArchive, SMetaDataHandlerArgumentInfo &inArgument)
+ {
+ SerializePropertyBase(inArchive, inArgument);
+ if (inArgument.m_ArgType != HandlerArgumentType::None)
+ inArchive.Att(L"argumentType", inArgument.m_ArgType);
+ }
+
+ void SerializeHandlerArgument(IDOMReader &inArchive, SMetaDataHandlerArgumentInfo &inArgument)
+ {
+ SerializePropertyBase(inArchive, inArgument);
+ inArchive.Att(L"argumentType", inArgument.m_ArgType);
+ }
+
+ void SerializeHandlerArguments(IDOMWriter &inWriter, SHandler &inItem, Qt3DSDMHandlerHandle &)
+ {
+ for (size_t idx = 0, end = inItem.m_Arguments.size(); idx < end; ++idx) {
+ SMetaDataHandlerArgumentInfo &theArg(inItem.m_Arguments[idx]);
+ IDOMWriter::Scope __argScope(inWriter, L"Argument");
+ SerializeHandlerArgument(inWriter, theArg);
+ }
+ }
+
+ void SerializeHandlerArguments(IDOMReader &inReader, SHandler &inItem, THandlerHandle &inHandle)
+ {
+ if (inHandle.GetHandleValue() == 0)
+ inHandle = THandlerHandle(GetNextId());
+
+ IDOMReader::Scope __handlerScope(inReader);
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ SMetaDataHandlerArgumentInfo theArg(inHandle);
+ SerializeHandlerArgument(inReader, theArg);
+ inItem.m_Arguments.push_back(theArg);
+ }
+ }
+
+ void SerializeHandlerItem(IDOMWriter &inArchive, SHandler &inItem)
+ {
+ inArchive.Att(L"name", inItem.m_Name);
+ if (inItem.m_FormalName != inItem.m_Name)
+ inArchive.Att(L"formalName", inItem.m_FormalName);
+ if (inItem.m_Category != L"Default")
+ inArchive.Att(L"category", inItem.m_Category);
+ if (inItem.m_Description != inItem.m_Name)
+ inArchive.Att(L"description", inItem.m_Description);
+ EnsureEventHandlerBase(inArchive, inItem);
+ }
+
+ void SerializeHandlerItem(IDOMReader &inArchive, SHandler &inItem)
+ {
+ inArchive.Att(L"name", inItem.m_Name);
+ inArchive.Att(L"formalName", inItem.m_FormalName);
+ inArchive.Att(L"category", inItem.m_Category);
+ EnsureCategory(inArchive, inItem.m_Category, m_ObjectName);
+ inArchive.Att(L"description", inItem.m_Description);
+ EnsureEventHandlerBase(inArchive, inItem);
+ }
+
+ template <typename TArchiveType>
+ void SerializeItem(TArchiveType &inArchive, SHandler &inItem, Qt3DSDMHandlerHandle &inHandle)
+ {
+ SerializeHandlerItem(inArchive, inItem);
+ SerializeHandlerArguments(inArchive, inItem, inHandle);
+ }
+
+ template <typename TInfoType, typename THandleType, typename TListMapType, typename THashType,
+ typename TNameMapType>
+ void SerializeInstanceData(IDOMWriter &inArchive, TInstanceHandle inInstanceHandle,
+ TCharPtr inElementName,
+ unordered_map<THandleType, TInfoType, THashType> &inMap,
+ TListMapType &inListMap, TNameMapType & /*inNameMap*/)
+ {
+ typedef unordered_map<THandleType, TInfoType, THashType> TMapType;
+ typename TListMapType::iterator find = inListMap.find(inInstanceHandle);
+ if (find == inListMap.end())
+ return;
+
+ vector<THandleType> &itemList = find->second;
+ for (size_t idx = 0, end = itemList.size(); idx < end; ++idx) {
+ typename TMapType::iterator iter = inMap.find(itemList[idx]);
+ if (iter == inMap.end()) {
+ QT3DS_ASSERT(false);
+ continue;
+ }
+ TInfoType &theType = iter->second;
+ IDOMWriter::Scope __elemScope(inArchive, inElementName);
+ SerializeItem(inArchive, theType, itemList[idx]);
+ }
+ }
+
+ void CreateInstanceGroupInfo(SMetaDataPropertyInfo &inProperty)
+ {
+ if (!inProperty.m_GroupName.empty()) {
+ const wchar_t *theGroupName = Intern(inProperty.m_GroupName);
+ bool found = false;
+ pair<typename TInstanceGroupMap::iterator, bool> inserter =
+ m_InstanceGroupMap.insert(make_pair(inProperty.m_Instance, vector<TCharPtr>()));
+ vector<TCharPtr> &itemList = inserter.first->second;
+ for (size_t idx = 0, end = itemList.size(); idx < end; ++idx) {
+ TCharStr curListName = itemList[idx];
+ if (curListName == theGroupName) {
+ found = true;
+ break;
+ }
+ }
+ if (!found && !inProperty.m_IsHidden)
+ inserter.first->second.push_back(theGroupName);
+ }
+ }
+ void CreateInstanceGroupInfo(SEvent &) {}
+ void CreateInstanceGroupInfo(SHandler &) {}
+
+ // Make sure the data core
+ void PostLoad(SMetaDataPropertyInfo &inProperty)
+ {
+ EnsureDataCoreProperty(inProperty);
+ SetPropertyDefault(inProperty, inProperty.GetDataType());
+ }
+
+ void ReadChildren(IDOMReader &, SEvent &, Qt3DSDMEventHandle) {}
+ void ReadChildren(IDOMReader &, SHandler &, Qt3DSDMHandlerHandle) {}
+
+ void PostLoad(SEvent &) {}
+ void PostLoad(SHandler &) {}
+ template <typename TInfoType, typename THandleType, typename TListMapType, typename THashType,
+ typename TNameMapType>
+ void SerializeInstanceData(IDOMReader &inArchive, TInstanceHandle inInstanceHandle,
+ TCharPtr inElementName,
+ unordered_map<THandleType, TInfoType, THashType> &inMap,
+ TListMapType &inListMap, TNameMapType &inNameMap)
+ {
+ // Ensure we pop out to where we were.
+ IDOMReader::Scope __readerScope(inArchive);
+ for (bool success = inArchive.MoveToFirstChild(inElementName); success;
+ success = inArchive.MoveToNextSibling(inElementName)) {
+ TInfoType theInfo(inInstanceHandle);
+ THandleType theHandle(GetNextId());
+ SerializeItem(inArchive, theInfo, theHandle);
+ PostLoad(theInfo);
+ CreateInstanceGroupInfo(theInfo);
+ inMap.insert(make_pair(theHandle, theInfo));
+ this->AddItemToInstanceList(inInstanceHandle, theHandle, inListMap);
+ inNameMap.insert(
+ make_pair(make_pair(inInstanceHandle, Intern(theInfo.m_Name)), theHandle));
+ ReadChildren(inArchive, theInfo, theHandle);
+ }
+ }
+
+ void SerializeInstanceData(IDOMWriter &inArchive, TInstanceHandle inInstance,
+ TCharPtr inElementName, TInstanceStringListMap &inMap)
+ {
+ TInstanceStringListMap::iterator iter = inMap.find(inInstance);
+ if (iter == inMap.end())
+ return;
+ const vector<TCharPtr> &theValueList(iter->second);
+ for (size_t idx = 0, end = theValueList.size(); idx < end; ++idx) {
+ IDOMWriter::Scope __elemScope(inArchive, inElementName);
+ inArchive.Value(theValueList[idx]);
+ }
+ }
+
+ void SerializeInstanceData(IDOMReader &inArchive, TInstanceHandle inInstance,
+ TCharPtr inElementName, TInstanceStringListMap &inMap)
+ {
+ IDOMReader::Scope __readerScope(inArchive);
+ for (bool success = inArchive.MoveToFirstChild(inElementName); success;
+ success = inArchive.MoveToNextSibling(inElementName)) {
+ const wchar_t *theValue;
+ if (inArchive.RegisteredValue(theValue))
+ AddItemToInstanceList(inInstance, theValue, inMap);
+ }
+ }
+
+ template <typename TArchiveType>
+ void SerializeInstance(TArchiveType &inArchive, TInstanceHandle inInstance)
+ {
+ SerializeInstanceData(inArchive, inInstance, L"Property", m_Properties,
+ m_InstanceToProperties, m_InstanceNameToProperties);
+ SerializeInstanceData(inArchive, inInstance, L"Event", m_Events, m_InstanceToEvents,
+ m_InstanceNameToEvents);
+ SerializeInstanceData(inArchive, inInstance, L"Handler", m_Handlers, m_InstanceToHandlers,
+ m_InstanceNameToHandlers);
+ SerializeInstanceData(inArchive, inInstance, L"Reference", m_InstanceToReferences);
+ }
+ void SerializeCategories(IDOMWriter &inWriter)
+ {
+ for (TCategoryMap::iterator iter = m_Categories.begin(), end = m_Categories.end();
+ iter != end; ++iter) {
+ IDOMWriter::Scope __writerScope(inWriter, L"Category");
+ SerializeItem(inWriter, iter->second);
+ }
+ }
+ void SerializeCategories(IDOMReader &inReader)
+ {
+ IDOMReader::Scope __readerScope(inReader);
+ for (bool success = inReader.MoveToFirstChild(L"Category"); success;
+ success = inReader.MoveToNextSibling(L"Category")) {
+ SCategoryInfo theInfo;
+ SerializeItem(inReader, theInfo);
+ TCategoryHandle newHandle(GetNextId());
+ theInfo.m_Canonical = true;
+ m_Categories.insert(make_pair(newHandle, theInfo));
+ m_NameToCategories.insert(make_pair(Intern(theInfo.m_Name), newHandle));
+ }
+ }
+
+ struct SInstanceSorter
+ {
+ const TInstanceStrMap &m_Map;
+ SInstanceSorter(const TInstanceStrMap &inMap)
+ : m_Map(inMap)
+ {
+ }
+ bool operator()(TInstanceHandle lhs, TInstanceHandle rhs)
+ {
+ TInstanceStrMap::const_iterator lhsIter(m_Map.find(lhs));
+ TInstanceStrMap::const_iterator rhsIter(m_Map.find(rhs));
+ if (lhsIter == rhsIter)
+ return false;
+ if (lhsIter == m_Map.end())
+ return false;
+ if (rhsIter == m_Map.end())
+ return true;
+ return wcscmp(lhsIter->second, rhsIter->second) < 0;
+ }
+ };
+
+ void Save(IDOMWriter &inWriter) override
+ {
+ SerializeCategories(inWriter);
+ typedef unordered_set<TInstanceHandle, hash<int>> TInstanceListType;
+ TInstanceListType theInstanceList;
+ // Get the list of instances to serialize.
+
+ AddInstancesFromHash(m_InstanceToProperties, theInstanceList);
+ AddInstancesFromHash(m_InstanceToEvents, theInstanceList);
+ AddInstancesFromHash(m_InstanceToHandlers, theInstanceList);
+ AddInstancesFromHash(m_InstanceToReferences, theInstanceList);
+
+ vector<TInstanceHandle> theInstances;
+ theInstances.reserve(theInstanceList.size());
+ theInstances.insert(theInstances.begin(), theInstanceList.begin(), theInstanceList.end());
+ sort(theInstances.begin(), theInstances.end(), SInstanceSorter(m_InstancesToCanonicalType));
+
+ for (vector<TInstanceHandle>::iterator iter = theInstances.begin(),
+ end = theInstances.end();
+ iter != end; ++iter) {
+ TInstanceHandle instHandle = *iter;
+ Option<TCharStr> theType(GetTypeForCanonicalInstance(*iter));
+ if (theType.hasValue()) {
+ IDOMWriter::Scope __instanceElem(inWriter, theType->wide_str());
+ SerializeInstance(inWriter, *iter);
+ }
+ }
+ }
+
+ // Loading expects the canonical instances to be setup already which means that
+ // it will perform lookups based on
+ void Load(IDOMReader &inReader) override
+ {
+ if (!inReader.Att("NextId", m_NextId))
+ m_NextId = 1;
+ m_ObjectName = L"";
+ SerializeCategories(inReader);
+ IDOMReader::Scope __instanceGatherScope(inReader);
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ const wchar_t *elemName = inReader.GetElementName();
+ TStrInstanceMap::iterator find = m_CanonicalTypeToInstances.find(elemName);
+ if (find == m_CanonicalTypeToInstances.end()) {
+ continue;
+ }
+
+ SerializeInstance(inReader, find->second);
+ }
+ }
+
+ template <typename THandleType, typename TMapType>
+ void RemoveOldItemsAndSetOrder(
+ Qt3DSDMInstanceHandle inInstance, vector<THandleType> &inNewHandles,
+ void (SNewMetaDataImpl::*inGetSpecificFun)(Qt3DSDMInstanceHandle, vector<THandleType> &),
+ void (SNewMetaDataImpl::*inDestroyFun)(THandleType), TMapType &inListMap)
+ {
+ vector<THandleType> theHandles;
+ (this->*inGetSpecificFun)(inInstance, theHandles);
+ for (size_t idx = 0, end = theHandles.size(); idx < end; ++idx)
+ if (find(inNewHandles.begin(), inNewHandles.end(), theHandles[idx])
+ == inNewHandles.end())
+ (this->*inDestroyFun)(theHandles[idx]);
+
+ InsertOrUpdateWithTransaction(make_pair(inInstance, inNewHandles), inListMap);
+ }
+
+ // Load meta data and apply it to just this instance
+ // This needs to be undoable so we have to do this through a slightly different
+ // system than we did before.
+ void LoadInstance(IDOMReader &inReader, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings) override
+ {
+ const wchar_t *theAtt;
+ vector<Qt3DSDMMetaDataPropertyHandle> theProperties;
+ vector<Qt3DSDMEventHandle> theEvents;
+ vector<Qt3DSDMHandlerHandle> theHandlers;
+ DestroyReferences(inInstance);
+ m_ObjectName = inObjectName;
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetElementName(), L"Category")) {
+ SCategoryInfo theInfo;
+ SerializeItem(inReader, theInfo);
+ Qt3DSDMCategoryHandle theCategoryInfo(GetOrCreateCategory(theInfo.m_Name).first);
+ SetCategoryInfo(theCategoryInfo, theInfo.m_Icon, theInfo.m_HighlightIcon,
+ theInfo.m_Description);
+ } else if (AreEqual(inReader.GetElementName(), L"Property")) {
+ SMetaDataPropertyInfo theInfo(inInstance);
+ if (inReader.Att(L"name", theAtt)) {
+ Qt3DSDMMetaDataPropertyHandle theProperty(
+ GetOrCreateSpecificMetaDataProperty(inInstance, theAtt));
+ SerializeItem(inReader, theInfo, theProperty);
+ SetMetaDataPropertyInfo(theProperty, theInfo.m_Name, theInfo.m_FormalName,
+ theInfo.m_Description, theInfo.m_Usage,
+ theInfo.m_CompleteType, theInfo.m_DefaultValue,
+ theInfo.m_MetaDataData, theInfo.m_GroupName,
+ theInfo.m_IsHidden, theInfo.m_Animatable,
+ theInfo.m_Controllable);
+ CreateInstanceGroupInfo(theInfo);
+ theProperties.push_back(theProperty);
+ ReadChildren(inReader, theInfo, theProperty);
+ } else
+ outWarnings.push_back(
+ SMetaDataLoadWarning(MetaDataLoadWarningType::InvalidProperty,
+ MetaDataLoadWarningMessage::MissingName));
+ } else if (AreEqual(inReader.GetElementName(), L"Event")) {
+ SEvent theInfo(inInstance);
+ if (inReader.Att(L"name", theAtt)) {
+ Qt3DSDMEventHandle theEvent(GetOrCreateSpecificEvent(inInstance, theAtt));
+ SerializeItem(inReader, theInfo, theEvent);
+ SetEventInfo(theEvent, theInfo.m_Name, theInfo.m_FormalName, theInfo.m_Category,
+ theInfo.m_Description);
+ theEvents.push_back(theEvent);
+ } else
+ outWarnings.push_back(
+ SMetaDataLoadWarning(MetaDataLoadWarningType::InvalidEvent,
+ MetaDataLoadWarningMessage::MissingName));
+ } else if (AreEqual(inReader.GetElementName(), L"Handler")) {
+ if (inReader.Att(L"name", theAtt)) {
+ Qt3DSDMHandlerHandle theHandler(GetOrCreateSpecificHandler(inInstance, theAtt));
+ SHandler theInfo(inInstance);
+ SerializeHandlerItem(inReader, theInfo);
+ SetHandlerInfo(theHandler, theInfo.m_Name, theInfo.m_FormalName,
+ theInfo.m_Category, theInfo.m_Description);
+ IDOMReader::Scope __argScope(inReader);
+ QT3DSU32 argIdx = 0;
+ for (bool argSuccess = inReader.MoveToFirstChild(); argSuccess;
+ argSuccess = inReader.MoveToNextSibling(), ++argIdx) {
+ SMetaDataHandlerArgumentInfo theArg(theHandler);
+ SerializeHandlerArgument(inReader, theArg);
+ while (argIdx >= GetNumHandlerArguments(theHandler))
+ AddHandlerArgument(theHandler);
+
+ if (argIdx < GetNumHandlerArguments(theHandler)) {
+ SetHandlerArgumentInfo(theHandler, argIdx, theArg.m_Name,
+ theArg.m_FormalName, theArg.m_Description,
+ theArg.m_CompleteType, theArg.m_DefaultValue,
+ theArg.m_MetaDataData, theArg.m_ArgType);
+ }
+ }
+ while (GetNumHandlerArguments(theHandler) > argIdx)
+ DestroyHandlerArgument(theHandler, GetNumHandlerArguments(theHandler) - 1);
+ theHandlers.push_back(theHandler);
+ } else
+ outWarnings.push_back(
+ SMetaDataLoadWarning(MetaDataLoadWarningType::InvalidHandler,
+ MetaDataLoadWarningMessage::MissingName));
+ } else if (AreEqual(inReader.GetElementName(), L"Reference")) {
+ const wchar_t *theValue;
+ if (inReader.Value(theValue))
+ AddReference(inInstance, theValue);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ RemoveOldItemsAndSetOrder(
+ inInstance, theProperties, &SNewMetaDataImpl::GetSpecificMetaDataProperties,
+ &SNewMetaDataImpl::DestroyMetaDataProperty, m_InstanceToProperties);
+ RemoveOldItemsAndSetOrder(inInstance, theEvents, &SNewMetaDataImpl::GetSpecificEvents,
+ &SNewMetaDataImpl::DestroyEvent, m_InstanceToEvents);
+ RemoveOldItemsAndSetOrder(inInstance, theHandlers, &SNewMetaDataImpl::GetSpecificHandlers,
+ &SNewMetaDataImpl::DestroyHandler, m_InstanceToHandlers);
+ }
+
+ // Save just this instances meta data out to the writer
+ void SaveInstance(IDOMWriter &inWriter, Qt3DSDMInstanceHandle inInstance) override
+ {
+ SerializeInstance(inWriter, inInstance);
+ }
+
+ // Helper to convert char to wchar_t
+ eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> m_Buf;
+ const wchar_t *ConvertChar(const char *inName)
+ {
+ if (inName && *inName) {
+ qt3ds::foundation::ConvertUTF(inName, 0, m_Buf);
+ return reinterpret_cast<const wchar_t *>(m_Buf.c_str());
+ }
+ return NULL;
+ }
+
+ void LoadEffectInstance(const char *inShaderFile, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) override
+ {
+ QString shaderFile(inShaderFile);
+ if (shaderFile.endsWith(".effect")) {
+ LoadEffectXMLFromSourcePath(inShaderFile, inInstance, inObjectName, outWarnings,
+ inStream);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ bool IsEffectInstanceRegistered(const char *inName) override
+ {
+ return m_EffectMap.find(Intern(inName)) != m_EffectMap.end();
+ }
+
+ inline qt3ds::render::NVRenderTextureFormats::Enum
+ ConvertTypeAndFormatToTextureFormat(const char8_t *inType, const char8_t *inFormat)
+ {
+ qt3ds::render::NVRenderTextureFormats::Enum retval
+ = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ if (AreEqual(inFormat, "source"))
+ retval = qt3ds::render::NVRenderTextureFormats::Unknown;
+ else if (AreEqual(inFormat, "depth24stencil8"))
+ retval = qt3ds::render::NVRenderTextureFormats::Depth24Stencil8;
+ else {
+ if (AreEqual(inType, "ubyte")) {
+ if (AreEqual(inFormat, "rgb"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGB8;
+ else if (AreEqual(inFormat, "rgba"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ else if (AreEqual(inFormat, "alpha"))
+ retval = qt3ds::render::NVRenderTextureFormats::Alpha8;
+ else if (AreEqual(inFormat, "lum"))
+ retval = qt3ds::render::NVRenderTextureFormats::Luminance8;
+ else if (AreEqual(inFormat, "lum_alpha"))
+ retval = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8;
+ else if (AreEqual(inFormat, "rg"))
+ retval = qt3ds::render::NVRenderTextureFormats::RG8;
+ } else if (AreEqual(inType, "ushort")) {
+ if (AreEqual(inFormat, "rgb"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGB565;
+ else if (AreEqual(inFormat, "rgba"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGBA5551;
+ } else if (AreEqual(inType, "fp16")) {
+ if (AreEqual(inFormat, "rgba"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGBA16F;
+ else if (AreEqual(inFormat, "rg"))
+ retval = qt3ds::render::NVRenderTextureFormats::RG16F;
+ } else if (AreEqual(inType, "fp32")) {
+ if (AreEqual(inFormat, "rgba"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGBA32F;
+ else if (AreEqual(inFormat, "rg"))
+ retval = qt3ds::render::NVRenderTextureFormats::RG32F;
+ } else {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported texture type %s,
+ // defaulting to RGBA8", inType );
+ }
+ }
+ return retval;
+ }
+
+ static inline qt3ds::render::NVRenderTextureMagnifyingOp::Enum
+ ConvertFilterToMagOp(const char8_t *inFilter)
+ {
+ if (AreEqual(inFilter, "linear"))
+ return qt3ds::render::NVRenderTextureMagnifyingOp::Linear;
+ if (IsTrivial(inFilter) || AreEqual(inFilter, "nearest"))
+ return qt3ds::render::NVRenderTextureMagnifyingOp::Nearest;
+ else {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting to
+ // linear", inFilter );
+ return qt3ds::render::NVRenderTextureMagnifyingOp::Linear;
+ }
+ }
+
+ static inline qt3ds::render::NVRenderTextureMinifyingOp::Enum
+ ConvertFilterToMinOp(const char8_t *inFilter)
+ {
+ // we make the decision based on the texture usage
+ if (AreEqual(inFilter, "linear"))
+ return qt3ds::render::NVRenderTextureMinifyingOp::Linear;
+ if (AreEqual(inFilter, "nearest"))
+ return qt3ds::render::NVRenderTextureMinifyingOp::Nearest;
+ if (AreEqual(inFilter, "linearMipmapLinear"))
+ return qt3ds::render::NVRenderTextureMinifyingOp::LinearMipmapLinear;
+ if (AreEqual(inFilter, "nearestMipmapNearest"))
+ return qt3ds::render::NVRenderTextureMinifyingOp::NearestMipmapNearest;
+ if (AreEqual(inFilter, "nearestMipmapLinear"))
+ return qt3ds::render::NVRenderTextureMinifyingOp::NearestMipmapLinear;
+ if (AreEqual(inFilter, "linearMipmapNearest"))
+ return qt3ds::render::NVRenderTextureMinifyingOp::LinearMipmapNearest;
+ else {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting
+ // to linear", inFilter );
+ return qt3ds::render::NVRenderTextureMinifyingOp::Linear;
+ }
+ }
+
+ static inline qt3ds::render::NVRenderTextureCoordOp::Enum
+ ConvertTextureCoordOp(const char8_t *inWrap)
+ {
+ if (IsTrivial(inWrap) || AreEqual(inWrap, "clamp"))
+ return qt3ds::render::NVRenderTextureCoordOp::ClampToEdge;
+ if (AreEqual(inWrap, "repeat"))
+ return qt3ds::render::NVRenderTextureCoordOp::Repeat;
+ else {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported wrap type %s, defaulting to
+ // clamp", inWrap );
+ return qt3ds::render::NVRenderTextureCoordOp::ClampToEdge;
+ }
+ }
+
+ static inline qt3ds::render::NVRenderTextureTypeValue::Enum
+ ConvertTextureType(const char8_t *inTexType)
+ {
+ // this usually comes from a MDL description file
+ if (IsTrivial(inTexType))
+ return qt3ds::render::NVRenderTextureTypeValue::Unknown;
+ if (AreEqual(inTexType, "environment"))
+ return qt3ds::render::NVRenderTextureTypeValue::Environment;
+ if (AreEqual(inTexType, "diffuse"))
+ return qt3ds::render::NVRenderTextureTypeValue::Diffuse;
+ if (AreEqual(inTexType, "specular"))
+ return qt3ds::render::NVRenderTextureTypeValue::Specular;
+ if (AreEqual(inTexType, "bump"))
+ return qt3ds::render::NVRenderTextureTypeValue::Bump;
+ if (AreEqual(inTexType, "displacement"))
+ return qt3ds::render::NVRenderTextureTypeValue::Displace;
+ if (AreEqual(inTexType, "shadow"))
+ return qt3ds::render::NVRenderTextureTypeValue::LightmapShadow;
+ if (AreEqual(inTexType, "emissive"))
+ return qt3ds::render::NVRenderTextureTypeValue::Emissive;
+ if (AreEqual(inTexType, "emissive_mask"))
+ return qt3ds::render::NVRenderTextureTypeValue::Emissive2;
+ else {
+ return qt3ds::render::NVRenderTextureTypeValue::Unknown;
+ }
+ }
+
+ static inline qt3ds::render::NVRenderSrcBlendFunc::Enum
+ ConvertToSrcBlendFunc(const char8_t *inFilter)
+ {
+ if (AreEqual(inFilter, "SrcAlpha"))
+ return qt3ds::render::NVRenderSrcBlendFunc::SrcAlpha;
+ if (AreEqual(inFilter, "OneMinusSrcAlpha"))
+ return qt3ds::render::NVRenderSrcBlendFunc::OneMinusSrcAlpha;
+ if (AreEqual(inFilter, "One"))
+ return qt3ds::render::NVRenderSrcBlendFunc::One;
+ else {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting
+ // to linear", inFilter );
+ return qt3ds::render::NVRenderSrcBlendFunc::One;
+ }
+ }
+
+ static inline qt3ds::render::NVRenderDstBlendFunc::Enum
+ ConvertToDstBlendFunc(const char8_t *inFilter)
+ {
+ if (AreEqual(inFilter, "SrcAlpha"))
+ return qt3ds::render::NVRenderDstBlendFunc::SrcAlpha;
+ if (AreEqual(inFilter, "OneMinusSrcAlpha"))
+ return qt3ds::render::NVRenderDstBlendFunc::OneMinusSrcAlpha;
+ if (AreEqual(inFilter, "One"))
+ return qt3ds::render::NVRenderDstBlendFunc::One;
+ else {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting
+ // to linear", inFilter );
+ return qt3ds::render::NVRenderDstBlendFunc::One;
+ }
+ }
+
+ static inline qt3ds::render::NVRenderState::Enum ConvertRenderState(const char8_t *inState)
+ {
+ if (AreEqual(inState, "Stencil"))
+ return qt3ds::render::NVRenderState::StencilTest;
+ else {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting
+ // to linear", inFilter );
+ return qt3ds::render::NVRenderState::StencilTest;
+ }
+ }
+
+ static inline qt3ds::render::NVRenderImageAccessType::Enum
+ ConvertToImageAccessType(const char8_t *inAccess)
+ {
+ if (AreEqual(inAccess, "read"))
+ return qt3ds::render::NVRenderImageAccessType::Read;
+ if (AreEqual(inAccess, "write"))
+ return qt3ds::render::NVRenderImageAccessType::Write;
+ if (AreEqual(inAccess, "readwrite"))
+ return qt3ds::render::NVRenderImageAccessType::ReadWrite;
+ else
+ QT3DS_ASSERT(false);
+
+ return qt3ds::render::NVRenderImageAccessType::ReadWrite;
+ }
+
+ static inline size_t GetTypeSize(const char8_t *inType)
+ {
+ if (AreEqual(inType, "uint"))
+ return sizeof(QT3DSU32);
+ else if (AreEqual(inType, "int"))
+ return sizeof(QT3DSI32);
+ else if (AreEqual(inType, "uvec4"))
+ return sizeof(QT3DSU32) * 4;
+ else
+ QT3DS_ASSERT(false);
+
+ return 1;
+ }
+
+ inline qt3ds::render::NVRenderBufferBindValues::Enum
+ ConvertFormatToBufferBindFlags(const char8_t *inFormat)
+ {
+ if (AreEqual(inFormat, "storage"))
+ return qt3ds::render::NVRenderBufferBindValues::Storage;
+ else if (AreEqual(inFormat, "indirect"))
+ return qt3ds::render::NVRenderBufferBindValues::Draw_Indirect;
+ else
+ QT3DS_ASSERT(false);
+
+ return qt3ds::render::NVRenderBufferBindValues::Unknown;
+ }
+
+ static inline void AppendShaderUniform(const char8_t *type, const char8_t *name,
+ eastl::string &shaderPrefix)
+ {
+ shaderPrefix.append("uniform ");
+ shaderPrefix.append(type);
+ shaderPrefix.append(" ");
+ shaderPrefix.append(name);
+ shaderPrefix.append(";\n");
+ }
+ static inline void AppendShaderCode(
+ const char8_t *inCode, Qt3DSDMStr &ioStr,
+ eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType>
+ &inConvertBuffer)
+ {
+ qt3ds::foundation::ConvertUTF(inCode, 0, inConvertBuffer);
+ ioStr.append(inConvertBuffer);
+ }
+ void HideEffectProperty(Qt3DSDMInstanceHandle inInstance, const char8_t *inParamName)
+ {
+ Qt3DSDMMetaDataPropertyHandle theProp =
+ GetSpecificMetaDataProperty(inInstance, Intern(inParamName));
+ if (theProp.Valid()) {
+ SMetaDataPropertyInfo theInfo = GetMetaDataPropertyInfo(theProp);
+ SetMetaDataPropertyInfo(theProp, theInfo.m_Name, theInfo.m_FormalName,
+ theInfo.m_Description, theInfo.m_Usage, theInfo.m_CompleteType,
+ theInfo.m_DefaultValue, theInfo.m_MetaDataData,
+ theInfo.m_GroupName, true, theInfo.m_Animatable,
+ theInfo.m_Controllable);
+ }
+ }
+
+ static inline void GetShaderName(const TCharStr &inObjectName,
+ const char8_t *inShaderSpecificName,
+ eastl::string &outShaderName)
+ {
+ outShaderName.clear();
+ qt3ds::foundation::ConvertUTF(inObjectName.c_str(), 0, outShaderName);
+ outShaderName.append(" - ");
+ outShaderName.append(inShaderSpecificName);
+ }
+
+ void LoadDynamicObjectProperties(IDOMReader &inStream, SMetaDataDynamicObjectImpl &ioObject,
+ Qt3DSDMInstanceHandle inInstance, const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ eastl::string &shaderPrefix)
+ {
+ eastl::string vertexUniforms;
+ eastl::string fragmentUniforms;
+ vertexUniforms += "#ifdef VERTEX_SHADER\n";
+ fragmentUniforms += "#ifdef FRAGMENT_SHADER\n";
+ using namespace qt3ds::render::dynamic;
+ ioObject.m_Properties.clear();
+ ioObject.ClearEnumValueNames();
+ IDOMReader::Scope __readerScope(inStream);
+ if (inStream.MoveToFirstChild("MetaData")) {
+ {
+ IDOMReader::Scope __readerScope(inStream);
+ LoadInstance(inStream, inInstance, inObjectName, outWarnings);
+ }
+
+ vector<Qt3DSDMMetaDataPropertyHandle> theProperties;
+ GetSpecificMetaDataProperties(inInstance, theProperties);
+ size_t propIdx = 0, propEnd = theProperties.size();
+ for (bool success = inStream.MoveToFirstChild("Property"); success && propIdx < propEnd;
+ success = inStream.MoveToNextSibling("Property"), ++propIdx) {
+ ioObject.m_Properties.push_back();
+ SPropertyDefinition &theNewDefinition = ioObject.m_Properties.back();
+ SMetaDataPropertyInfo theInfo(GetMetaDataPropertyInfo(theProperties[propIdx]));
+ theNewDefinition.m_Name =
+ m_StringTable.GetRenderStringTable().RegisterStr(theInfo.m_Name.c_str());
+ const char8_t *xmlName;
+ inStream.Att("name", xmlName);
+ const char8_t *stage;
+ inStream.Att("stage", stage);
+ eastl::string uniforms;
+ if (AreEqual(xmlName, theNewDefinition.m_Name.c_str())) {
+ switch (theInfo.GetDataType()) {
+ case DataModelDataType::Bool:
+ theNewDefinition.m_DataType =
+ qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool;
+ AppendShaderUniform("bool", theNewDefinition.m_Name.c_str(), uniforms);
+ break;
+ case DataModelDataType::Long:
+ theNewDefinition.m_DataType
+ = qt3ds::render::NVRenderShaderDataTypes::QT3DSI32;
+ AppendShaderUniform("int", theNewDefinition.m_Name.c_str(), uniforms);
+ break;
+ case DataModelDataType::Float2:
+ theNewDefinition.m_DataType
+ = qt3ds::render::NVRenderShaderDataTypes::QT3DSVec2;
+ AppendShaderUniform("vec2", theNewDefinition.m_Name.c_str(), uniforms);
+ break;
+ case DataModelDataType::Float3:
+ theNewDefinition.m_DataType
+ = qt3ds::render::NVRenderShaderDataTypes::QT3DSVec3;
+ AppendShaderUniform("vec3", theNewDefinition.m_Name.c_str(), uniforms);
+ break;
+ case DataModelDataType::Float4:
+ theNewDefinition.m_DataType
+ = qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4;
+ AppendShaderUniform("vec4", theNewDefinition.m_Name.c_str(), uniforms);
+ break;
+ case DataModelDataType::String:
+ if (theInfo.m_CompleteType == CompleteMetaDataType::Texture) {
+ theNewDefinition.m_DataType =
+ qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr;
+ const char8_t *filter = "linear", *minFilter = "linear",
+ *clamp = "clamp", *usage = "", *path = "";
+ if (inStream.Att("filter", filter))
+ theNewDefinition.m_MagFilterOp = ConvertFilterToMagOp(filter);
+ if (inStream.Att("minfilter", minFilter))
+ theNewDefinition.m_MinFilterOp = ConvertFilterToMinOp(minFilter);
+ if (inStream.Att("clamp", clamp))
+ theNewDefinition.m_CoordOp = ConvertTextureCoordOp(clamp);
+ if (inStream.Att("usage", usage))
+ theNewDefinition.m_TexUsageType = ConvertTextureType(usage);
+ if (inStream.Att("default", path)) {
+ TDataStrPtr theDataStr(
+ theInfo.m_DefaultValue.getData<TDataStrPtr>());
+ theNewDefinition.m_ImagePath =
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ theDataStr->GetData());
+ }
+
+ // Output macro so we can change the set of variables used for this
+ // independent of the
+ // meta data system.
+ uniforms.append("SNAPPER_SAMPLER2D(");
+ uniforms.append(theNewDefinition.m_Name.c_str());
+ uniforms.append(", ");
+ uniforms.append(theNewDefinition.m_Name.c_str());
+ uniforms.append(", ");
+ uniforms.append(filter);
+ uniforms.append(", ");
+ uniforms.append(clamp);
+ uniforms.append(", ");
+ uniforms.append("false )\n");
+ } else if (theInfo.m_CompleteType == CompleteMetaDataType::StringList) {
+ theNewDefinition.m_DataType =
+ qt3ds::render::NVRenderShaderDataTypes::QT3DSI32;
+ const TMetaDataStringList &theList =
+ qt3dsdm::get<TMetaDataStringList>(theInfo.m_MetaDataData);
+ ioObject.m_EnumValueNames.push_back(
+ new eastl::vector<qt3ds::foundation::CRegisteredString>());
+ eastl::vector<qt3ds::foundation::CRegisteredString> &theBack =
+ *ioObject.m_EnumValueNames.back();
+ for (QT3DSU32 idx = 0, end = (QT3DSU32)theList.size(); idx < end; ++idx)
+ theBack.push_back(m_StringTable.GetRenderStringTable().RegisterStr(
+ theList[idx].c_str()));
+ theNewDefinition.m_EnumValueNames = VecToCRef(theBack);
+ theNewDefinition.m_IsEnumProperty = true;
+ AppendShaderUniform("int", theNewDefinition.m_Name.c_str(),
+ uniforms);
+ } else if (theInfo.m_CompleteType == CompleteMetaDataType::Image2D) {
+ theNewDefinition.m_DataType =
+ qt3ds::render::NVRenderShaderDataTypes::NVRenderImage2DPtr;
+ const char8_t *format = "", *binding = "", *access = "readonly";
+ uniforms.append("layout(");
+ inStream.Att("format", format);
+ uniforms.append(format);
+ if (inStream.Att("binding", binding)) {
+ uniforms.append(", binding = ");
+ uniforms.append(binding);
+ }
+ uniforms.append(") ");
+
+ // if we have format layout we cannot set an additional access qualifier
+ if (inStream.Att("access", access) && !AreEqual(format, ""))
+ uniforms.append(access);
+
+ uniforms.append(" uniform image2D ");
+ uniforms.append(theNewDefinition.m_Name.c_str());
+ uniforms.append(";\n");
+ } else if (theInfo.m_CompleteType == CompleteMetaDataType::Buffer) {
+ theNewDefinition.m_DataType =
+ qt3ds::render::NVRenderShaderDataTypes::NVRenderDataBufferPtr;
+ const char8_t *align = "std140", *usage = "storage", *binding = "",
+ *format = "float";
+ uniforms.append("layout(");
+
+ inStream.Att("format", format);
+ inStream.Att("usage", usage);
+ if (AreEqual(usage, "storage")) {
+ inStream.Att("align", align);
+ uniforms.append(align);
+
+ if (inStream.Att("binding", binding)) {
+ uniforms.append(", binding = ");
+ uniforms.append(binding);
+ }
+
+ uniforms.append(") ");
+
+ uniforms.append("buffer ");
+ uniforms.append(theNewDefinition.m_Name.c_str());
+ uniforms.append("\n{ \n");
+ uniforms.append(format);
+ uniforms.append(" ");
+ uniforms.append(theNewDefinition.m_Name.c_str());
+ uniforms.append("_data[]; \n};\n");
+ } else {
+ // currently we only handle storage counters
+ QT3DS_ASSERT(false);
+ }
+ }
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ // Fallthrough intentional
+ case DataModelDataType::Float:
+ theNewDefinition.m_DataType = qt3ds::render::NVRenderShaderDataTypes::QT3DSF32;
+ AppendShaderUniform("float", theNewDefinition.m_Name.c_str(), uniforms);
+ break;
+ }
+ } else {
+ // It is conceivable that we not every property tag gets parsed into a property.
+ QT3DS_ASSERT(false);
+ // So we will bump to the next item and try again.
+ --propIdx;
+ }
+
+ if (AreEqual(stage, "vertex")) {
+ vertexUniforms += uniforms;
+ } else if (AreEqual(stage, "fragment")) {
+ fragmentUniforms += uniforms;
+ } else {
+ vertexUniforms += uniforms;
+ fragmentUniforms += uniforms;
+ }
+ }
+ }
+ vertexUniforms += "#endif\n";
+ fragmentUniforms += "#endif\n";
+ shaderPrefix.append(vertexUniforms);
+ shaderPrefix.append(fragmentUniforms);
+ }
+
+ void LoadDynamicObjectShaders(IDOMReader &inStream, SMetaDataDynamicObjectImpl &ioObject,
+ eastl::string &shaderPrefix, const TCharStr &inObjectName)
+ {
+ eastl::string theShaderNameStr;
+ eastl::string theShaderTypeStr;
+ eastl::string theShaderVersionStr;
+ {
+ IDOMReader::Scope __readerScope(inStream);
+ eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> theConvertBuffer;
+ if (inStream.MoveToFirstChild("Shaders")) {
+ const char8_t *globalShared = "";
+ const char8_t *globalVertexShared = "";
+ const char8_t *globalFragmentShared = "";
+ inStream.ChildValue("Shared", globalShared);
+ inStream.ChildValue("VertexShaderShared", globalVertexShared);
+ inStream.ChildValue("FragmentShaderShared", globalFragmentShared);
+
+ inStream.Att("type", theShaderTypeStr); // can be empty
+ inStream.Att("version", theShaderVersionStr); // can be empty
+
+ for (bool success = inStream.MoveToFirstChild(); success;
+ success = inStream.MoveToNextSibling()) {
+ IDOMReader::Scope __shaderScope(inStream);
+ const char8_t *elemName = inStream.GetNarrowElementName();
+ // If this is neither a compute shader nor a normal shader, go on and ignore
+ // element.
+ if (!(AreEqual(elemName, "Shader") || AreEqual(elemName, "ComputeShader")))
+ continue;
+
+ ioObject.m_Shaders.push_back();
+ SMetaDataShader &theShader = ioObject.m_Shaders.back();
+
+ qt3ds::foundation::ConvertUTF(theShaderTypeStr.c_str(), theShaderTypeStr.size(),
+ theShader.m_Type);
+ qt3ds::foundation::ConvertUTF(theShaderVersionStr.c_str(),
+ theShaderVersionStr.size(), theShader.m_Version);
+ const char8_t *theName = "";
+ char8_t theITOABuffer[64] = { 0 };
+ if (!inStream.Att("name", theName)) {
+ sprintf(theITOABuffer, "%d", (int)ioObject.m_Shaders.size() - 1);
+ theName = theITOABuffer;
+ }
+ GetShaderName(inObjectName, theName, theShaderNameStr);
+ qt3ds::foundation::ConvertUTF(theShaderNameStr.c_str(), theShaderNameStr.size(),
+ theShader.m_Name);
+
+ if (AreEqual(elemName, "Shader")) {
+ const char8_t *shaderShared = "";
+ inStream.ChildValue("Shared", shaderShared);
+ const char8_t *vertexCode = "";
+ inStream.ChildValue("VertexShader", vertexCode);
+ if (IsTrivial(vertexCode))
+ vertexCode = "void vert(){}";
+ const char8_t *fragmentCode = "void frag(){}";
+ inStream.ChildValue("FragmentShader", fragmentCode);
+ if (IsTrivial(fragmentCode))
+ fragmentCode = "void frag(){}";
+ const char8_t *geomCode = "";
+ inStream.ChildValue("GeometryShader", geomCode);
+
+ AppendShaderCode(shaderPrefix.c_str(), theShader.m_Code, theConvertBuffer);
+ AppendShaderCode(globalShared, theShader.m_Code, theConvertBuffer);
+ AppendShaderCode(shaderShared, theShader.m_Code, theConvertBuffer);
+ AppendShaderCode("\n#ifdef VERTEX_SHADER\n", theShader.m_Code,
+ theConvertBuffer);
+ AppendShaderCode(globalVertexShared, theShader.m_Code, theConvertBuffer);
+ AppendShaderCode(vertexCode, theShader.m_Code, theConvertBuffer);
+ AppendShaderCode("\n#endif\n", theShader.m_Code, theConvertBuffer);
+ if (!IsTrivial(geomCode)) {
+ AppendShaderCode("\n#ifdef USER_GEOMETRY_SHADER\n", theShader.m_Code,
+ theConvertBuffer);
+ AppendShaderCode(geomCode, theShader.m_Code, theConvertBuffer);
+ AppendShaderCode("\n#endif\n", theShader.m_Code, theConvertBuffer);
+ theShader.m_HasGeomShader = true;
+ }
+ AppendShaderCode("\n#ifdef FRAGMENT_SHADER\n", theShader.m_Code,
+ theConvertBuffer);
+ AppendShaderCode(globalFragmentShared, theShader.m_Code, theConvertBuffer);
+ AppendShaderCode(fragmentCode, theShader.m_Code, theConvertBuffer);
+ AppendShaderCode("\n#endif\n", theShader.m_Code, theConvertBuffer);
+ } else if (AreEqual(elemName, "ComputeShader")) {
+ const char8_t *shaderCode = "";
+ inStream.Value(shaderCode);
+ theShader.m_IsComputeShader = true;
+ AppendShaderCode(shaderCode, theShader.m_Code, theConvertBuffer);
+ }
+ }
+ }
+ }
+ }
+
+ static size_t Align(size_t inValue)
+ {
+ if (inValue % 4)
+ return inValue + (4 - (inValue % 4));
+ return inValue;
+ }
+
+ static qt3ds::render::dynamic::SDepthStencilFlags ParseDepthStencilFlags(const char8_t *inFlags)
+ {
+ eastl::string parseStr(inFlags);
+ eastl::string tokenStr;
+ qt3ds::render::dynamic::SDepthStencilFlags retval;
+ for (uint32_t pos = parseStr.find('|'); parseStr.empty() == false;
+ pos = parseStr.find('|')) {
+ if (pos != eastl::string::npos) {
+ tokenStr = parseStr.substr(pos);
+ parseStr.erase(parseStr.begin(), parseStr.begin() + pos + 1);
+ } else {
+ tokenStr = parseStr;
+ parseStr.clear();
+ }
+ if (AreEqual(tokenStr.c_str(), "clear-stencil"))
+ retval |= qt3ds::render::dynamic::DepthStencilFlagValues::ClearStencil;
+ if (AreEqual(tokenStr.c_str(), "clear-depth"))
+ retval |= qt3ds::render::dynamic::DepthStencilFlagValues::ClearDepth;
+ }
+ return retval;
+ }
+
+ static qt3ds::render::NVRenderBoolOp::Enum ParseBoolOp(const char8_t *inOp)
+ {
+ if (AreEqual(inOp, "never"))
+ return qt3ds::render::NVRenderBoolOp::Never;
+ if (AreEqual(inOp, "less"))
+ return qt3ds::render::NVRenderBoolOp::Less;
+ if (AreEqual(inOp, "less-than-or-equal"))
+ return qt3ds::render::NVRenderBoolOp::LessThanOrEqual;
+ if (AreEqual(inOp, "equal"))
+ return qt3ds::render::NVRenderBoolOp::Equal;
+ if (AreEqual(inOp, "not-equal"))
+ return qt3ds::render::NVRenderBoolOp::NotEqual;
+ if (AreEqual(inOp, "greater"))
+ return qt3ds::render::NVRenderBoolOp::Greater;
+ if (AreEqual(inOp, "greater-than-or-equal"))
+ return qt3ds::render::NVRenderBoolOp::GreaterThanOrEqual;
+ if (AreEqual(inOp, "always"))
+ return qt3ds::render::NVRenderBoolOp::AlwaysTrue;
+
+ QT3DS_ASSERT(false);
+ return qt3ds::render::NVRenderBoolOp::Unknown;
+ }
+
+ static qt3ds::render::NVRenderStencilOp::Enum ParseStencilOp(const char8_t *inOp)
+ {
+
+ if (AreEqual(inOp, "keep"))
+ return qt3ds::render::NVRenderStencilOp::Keep;
+ if (AreEqual(inOp, "zero"))
+ return qt3ds::render::NVRenderStencilOp::Zero;
+ if (AreEqual(inOp, "replace"))
+ return qt3ds::render::NVRenderStencilOp::Replace;
+ if (AreEqual(inOp, "increment"))
+ return qt3ds::render::NVRenderStencilOp::Increment;
+ if (AreEqual(inOp, "increment-wrap"))
+ return qt3ds::render::NVRenderStencilOp::IncrementWrap;
+ if (AreEqual(inOp, "decrement"))
+ return qt3ds::render::NVRenderStencilOp::Decrement;
+ if (AreEqual(inOp, "decrement-wrap"))
+ return qt3ds::render::NVRenderStencilOp::DecrementWrap;
+ if (AreEqual(inOp, "invert"))
+ return qt3ds::render::NVRenderStencilOp::Invert;
+
+ QT3DS_ASSERT(false);
+ return qt3ds::render::NVRenderStencilOp::Unknown;
+ }
+
+ // Reloads an effect if one is already loaded so we can replace the existing effect definition
+ void LoadEffectXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ const TCharStr &inSourcePath) override
+ {
+ using namespace qt3ds::render::dynamic;
+ std::pair<TEffectMap::iterator, bool> theInserter =
+ m_EffectMap.insert(std::make_pair(Intern(inObjectName), SMetaDataEffectImpl()));
+ /*if ( inStream.MoveToFirstChild( "Effect" ) == false )
+ {
+ outWarnings.push_back( SMetaDataLoadWarning( MetaDataLoadWarningType::Unknown,
+ MetaDataLoadWarningMessage::GeneralError, L"File doesn't appear to be an effect xml file,
+ missing top level Effect tag" ) );
+ return;
+ }*/
+ eastl::string shaderPrefix = "#include \"effect.glsllib\"\n";
+
+ SMetaDataEffectImpl &theEffect = theInserter.first->second;
+ m_ObjectName = inObjectName;
+ theEffect.m_Name = inObjectName;
+ theEffect.m_SourcePath = inSourcePath;
+ theEffect.ClearEffectCommands();
+ LoadDynamicObjectProperties(inStream, theEffect, inInstance, inObjectName, outWarnings,
+ shaderPrefix);
+ theEffect.m_Shaders.clear();
+ LoadDynamicObjectShaders(inStream, theEffect, shaderPrefix, inObjectName);
+ eastl::string theShaderNameStr;
+ {
+ IDOMReader::Scope __readerScope(inStream);
+ if (inStream.MoveToFirstChild("Passes")) {
+ for (bool success = inStream.MoveToFirstChild(); success;
+ success = inStream.MoveToNextSibling()) {
+ IDOMReader::Scope __passScope(inStream);
+ if (AreEqual("Pass", inStream.GetNarrowElementName())) {
+ bool drawIndirect = false;
+ const char8_t *shader = "", *input = "[source]", *output = "[dest]",
+ *outputFormat = "rgba";
+ inStream.Att("shader", shader);
+ inStream.Att("input", input);
+ inStream.Att("output", output);
+ // this is only for the final output of the effect
+ inStream.Att("format", outputFormat);
+ qt3ds::render::NVRenderTextureFormats::Enum theOutputFormat =
+ ConvertTypeAndFormatToTextureFormat("ubyte", outputFormat);
+ if (AreEqual(output, "[dest]") || IsTrivial(output))
+ theEffect.m_EffectCommands.push_back(new SBindTarget(theOutputFormat));
+ else
+ theEffect.m_EffectCommands.push_back(
+ new SBindBuffer(
+ m_StringTable.GetRenderStringTable().RegisterStr(output),
+ false));
+ GetShaderName(inObjectName, shader, theShaderNameStr);
+ theEffect.m_EffectCommands.push_back(
+ new SBindShader(m_StringTable.GetRenderStringTable().RegisterStr(
+ theShaderNameStr.c_str())));
+ theEffect.m_EffectCommands.push_back(new SApplyInstanceValue());
+ if (AreEqual(input, "[source]") || IsTrivial(input))
+ theEffect.m_EffectCommands.push_back(
+ new SApplyBufferValue(
+ m_StringTable.GetRenderStringTable().RegisterStr(""),
+ m_StringTable.GetRenderStringTable().RegisterStr("")));
+ else
+ theEffect.m_EffectCommands.push_back(
+ new SApplyBufferValue(
+ m_StringTable.GetRenderStringTable().RegisterStr(input),
+ m_StringTable.GetRenderStringTable().RegisterStr("")));
+ for (bool bufParam = inStream.MoveToFirstChild(); bufParam;
+ bufParam = inStream.MoveToNextSibling()) {
+ if (AreEqual("BufferInput", inStream.GetNarrowElementName())) {
+ const char8_t *param = "";
+ const char8_t *value = "";
+ inStream.Att("param", param);
+ inStream.Att("value", value);
+ if (AreEqual("[source]", value))
+ value = "";
+ theEffect.m_EffectCommands.push_back(
+ new SApplyBufferValue(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ value),
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ param)));
+ HideEffectProperty(inInstance, param);
+ } else if (AreEqual("DepthInput", inStream.GetNarrowElementName())) {
+ const char8_t *param = "";
+ inStream.Att("param", param);
+ theEffect.m_EffectCommands.push_back(
+ new SApplyDepthValue(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ param)));
+ HideEffectProperty(inInstance, param);
+ } else if (AreEqual("ImageInput", inStream.GetNarrowElementName())) {
+ bool useAsTexture = false;
+ bool needSync = false;
+ const char8_t *param = "";
+ const char8_t *value = "";
+ const char8_t *usage = "";
+ const char8_t *sync = "";
+ inStream.Att("param", param);
+ inStream.Att("value", value);
+ if (AreEqual("[source]", value))
+ value = "";
+ inStream.Att("usage", usage);
+ if (AreEqual("texture", usage))
+ useAsTexture = true;
+ inStream.Att("sync", sync);
+ if (AreEqual("true", sync))
+ needSync = true;
+
+ theEffect.m_EffectCommands.push_back(
+ new SApplyImageValue(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ value),
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ param), useAsTexture, needSync));
+ HideEffectProperty(inInstance, param);
+ } else if (AreEqual("DataBufferInput",
+ inStream.GetNarrowElementName())) {
+ const char8_t *param = "";
+ const char8_t *usage = "";
+ inStream.Att("param", param);
+ inStream.Att("usage", usage);
+ qt3ds::render::NVRenderBufferBindValues::Enum bufType =
+ ConvertFormatToBufferBindFlags(usage);
+
+ // check if we using an indirect buffer for drawing
+ if (bufType == qt3ds::render::NVRenderBufferBindValues::Draw_Indirect)
+ drawIndirect = true;
+
+ theEffect.m_EffectCommands.push_back(
+ new SApplyDataBufferValue(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ param), bufType));
+ HideEffectProperty(inInstance, param);
+ } else if (AreEqual("SetParam", inStream.GetNarrowElementName())) {
+ const char8_t *name = "";
+ inStream.Att("name", name);
+ const char8_t *value = "";
+ inStream.Att("value", value);
+ // find the param and the type.
+ qt3ds::foundation::CRegisteredString propName =
+ m_StringTable.GetRenderStringTable().RegisterStr(name);
+ qt3ds::render::dynamic::SPropertyDefinition *theDefinition = NULL;
+ for (uint32_t propIdx = 0, propEnd = theEffect.m_Properties.size();
+ propIdx < propEnd && theDefinition == NULL; ++propIdx) {
+ if (theEffect.m_Properties[propIdx].m_Name == propName)
+ theDefinition = &theEffect.m_Properties[propIdx];
+ }
+ if (theDefinition != NULL) {
+ // Hack it for now because the shader datatypes don't have a
+ // built in sizeof operator.
+ QT3DSU32 valueSize = 4;
+ qt3ds::render::NVRenderShaderDataTypes::Enum theDataType =
+ theDefinition->m_DataType;
+ size_t allocSize = sizeof(SApplyValue) + valueSize;
+ QT3DSU8 *theCommandData = (QT3DSU8 *)malloc(allocSize);
+ QT3DSU8 *theValueData = theCommandData + sizeof(SApplyValue);
+ new (theCommandData) SApplyValue(propName, theDataType);
+ SApplyValue *theCommand =
+ reinterpret_cast<SApplyValue *>(theCommandData);
+ switch (theDataType) {
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool: {
+ bool &target = *reinterpret_cast<bool *>(theValueData);
+ qt3ds::foundation::StringConversion<bool>().StrTo(value,
+ target);
+ } break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSI32: {
+ QT3DSI32 &target = *reinterpret_cast<QT3DSI32 *>(
+ theValueData);
+ qt3ds::foundation::StringConversion<QT3DSI32>().StrTo(
+ value, target);
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ // Fallthrough intentional
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSF32: {
+ QT3DSF32 &target = *reinterpret_cast<QT3DSF32 *>(
+ theValueData);
+ qt3ds::foundation::StringConversion<QT3DSF32>().StrTo(
+ value, target);
+ } break;
+ }
+ theCommand->m_Value = NVDataRef<QT3DSU8>(theValueData,
+ valueSize);
+ theEffect.m_EffectCommands.push_back(theCommand);
+ }
+ } else if (AreEqual("Blending", inStream.GetNarrowElementName())) {
+ const char8_t *theSrcBlendFuncStr = "", *theDestBlendFuncStr = "";
+ inStream.Att("source", theSrcBlendFuncStr);
+ inStream.Att("dest", theDestBlendFuncStr);
+
+ qt3ds::render::NVRenderSrcBlendFunc::Enum theSrcBlendFunc =
+ ConvertToSrcBlendFunc(theSrcBlendFuncStr);
+ qt3ds::render::NVRenderDstBlendFunc::Enum theDstBlendFuc =
+ ConvertToDstBlendFunc(theDestBlendFuncStr);
+
+ // this will setup blending
+ theEffect.m_EffectCommands.push_back(
+ new SApplyBlending(theSrcBlendFunc, theDstBlendFuc));
+ } else if (AreEqual("RenderState", inStream.GetNarrowElementName())) {
+ const char8_t *name = "";
+ inStream.Att("name", name);
+ const char8_t *value = "";
+ inStream.Att("value", value);
+ // find the param and the type.
+ bool theStateEnable = false;
+ qt3ds::render::NVRenderState::Enum theState
+ = ConvertRenderState(name);
+ if (AreEqual("true", value))
+ theStateEnable = true;
+
+ // this will setup blending
+ theEffect.m_EffectCommands.push_back(
+ new SApplyRenderState(theState, theStateEnable));
+ } else if (AreEqual("DepthStencil", inStream.GetNarrowElementName())) {
+ const char8_t *bufferName = "";
+ inStream.Att("buffer", bufferName);
+ QT3DSU32 stencilvalue = 0;
+ inStream.Att("reference", stencilvalue);
+ const char8_t *flags = "";
+ inStream.Att("flags", flags);
+ QT3DSU32 mask = QT3DS_MAX_U32;
+ inStream.Att("mask", mask);
+ qt3ds::render::NVRenderBoolOp::Enum stencilFunction =
+ qt3ds::render::NVRenderBoolOp::Equal;
+ qt3ds::render::NVRenderStencilOp::Enum stencilFailOperation =
+ qt3ds::render::NVRenderStencilOp::Keep;
+ qt3ds::render::NVRenderStencilOp::Enum depthPass =
+ qt3ds::render::NVRenderStencilOp::Keep;
+ qt3ds::render::NVRenderStencilOp::Enum depthFail =
+ qt3ds::render::NVRenderStencilOp::Keep;
+ const char8_t *temp;
+ if (inStream.Att("stencil-fail", temp))
+ stencilFailOperation = ParseStencilOp(temp);
+ if (inStream.Att("depth-pass", temp))
+ depthPass = ParseStencilOp(temp);
+ if (inStream.Att("depth-fail", temp))
+ depthFail = ParseStencilOp(temp);
+ if (inStream.Att("stencil-function", temp))
+ stencilFunction = ParseBoolOp(temp);
+
+ qt3ds::render::dynamic::SDepthStencilFlags flagValues =
+ ParseDepthStencilFlags(flags);
+ theEffect.m_EffectCommands.push_back(
+ new SDepthStencil(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ bufferName), flagValues, stencilFailOperation,
+ depthPass, depthFail, stencilFunction, stencilvalue,
+ mask));
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ theEffect.m_EffectCommands.push_back(new SRender(drawIndirect));
+ } else if (AreEqual("Buffer", inStream.GetNarrowElementName())
+ || AreEqual("Image", inStream.GetNarrowElementName())) {
+ SAllocateBufferFlags theFlags;
+ const char8_t *theLifetimeStr = "", *theType = "", *theFormat = "",
+ *theFilter = "", *theWrap = "", *theName = "";
+ QT3DSF32 theSize = 1.0f;
+ bool isImage = AreEqual("Image", inStream.GetNarrowElementName());
+ inStream.Att("name", theName);
+ inStream.Att("lifetime", theLifetimeStr);
+ inStream.Att("type", theType);
+ inStream.Att("format", theFormat);
+ inStream.Att("filter", theFilter);
+ inStream.Att("wrap", theWrap);
+ inStream.Att("size", theSize);
+ // Clamp the size to valid amounts
+ if (theSize <= 0)
+ theSize = 1.0f;
+ if (theSize > 1.0f)
+ theSize = 1.0f;
+ if (AreEqual(theLifetimeStr, "scene"))
+ theFlags.SetSceneLifetime(true);
+ qt3ds::render::NVRenderTextureFormats::Enum theTexFormat =
+ ConvertTypeAndFormatToTextureFormat(theType, theFormat);
+ qt3ds::render::NVRenderTextureMagnifyingOp::Enum theMagOp =
+ ConvertFilterToMagOp(theFilter);
+ qt3ds::render::NVRenderTextureCoordOp::Enum theCoordOp =
+ ConvertTextureCoordOp(theWrap);
+ if (*theName == 0) {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Buffer is missing its
+ // name" );
+ } else if (isImage) {
+ const char8_t *temp;
+ qt3ds::render::NVRenderImageAccessType::Enum theAccess =
+ qt3ds::render::NVRenderImageAccessType::ReadWrite;
+ if (inStream.Att("access", temp))
+ theAccess = ConvertToImageAccessType(temp);
+
+ theEffect.m_EffectCommands.push_back(
+ new SAllocateImage(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ theName), theTexFormat, theMagOp, theCoordOp,
+ theSize, theFlags, theAccess));
+ } else {
+ theEffect.m_EffectCommands.push_back(
+ new SAllocateBuffer(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ theName), theTexFormat, theMagOp, theCoordOp,
+ theSize, theFlags));
+ }
+ } else if (AreEqual("DataBuffer", inStream.GetNarrowElementName())) {
+ SAllocateBufferFlags theFlags;
+ const char8_t *theLifetimeStr = "", *theType = "", *theWrapName = "",
+ *theWrapType = "", *theFormat = "", *theName = "";
+ QT3DSF32 theSize = 1.0f;
+ qt3ds::render::NVRenderBufferBindValues::Enum bufType,
+ wrapBufType = qt3ds::render::NVRenderBufferBindValues::Unknown;
+
+ inStream.Att("name", theName);
+ inStream.Att("lifetime", theLifetimeStr);
+ inStream.Att("type", theType);
+ inStream.Att("format", theFormat);
+ inStream.Att("size", theSize);
+ if (AreEqual(theLifetimeStr, "scene"))
+ theFlags.SetSceneLifetime(true);
+ bufType = ConvertFormatToBufferBindFlags(theType);
+
+ if (inStream.Att("wrapType", theWrapType)) {
+ wrapBufType = ConvertFormatToBufferBindFlags(theWrapType);
+ inStream.Att("wrapName", theWrapName);
+ if (*theWrapName == 0)
+ QT3DS_ASSERT(false);
+ }
+
+ theSize *= GetTypeSize(theFormat);
+
+ if (theSize <= 0)
+ theSize = 1.0f;
+
+ if (*theName == 0) {
+ QT3DS_ASSERT(false);
+ } else {
+ theEffect.m_EffectCommands.push_back(
+ new SAllocateDataBuffer(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ theName), bufType,
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ theWrapName), wrapBufType, theSize, theFlags));
+ }
+ } else {
+ QT3DS_ASSERT(false); // Unrecognized effect passes member.
+ }
+ }
+
+ } else {
+ if (theEffect.m_Shaders.size()) {
+ // Create the minimal set of commands that we could run the first shader with.
+ theEffect.m_EffectCommands.push_back(new SBindTarget());
+ theEffect.m_EffectCommands.push_back(
+ new SBindShader(m_StringTable.GetRenderStringTable().RegisterStr(
+ theEffect.m_Shaders[0].m_Name.c_str())));
+ theEffect.m_EffectCommands.push_back(new SApplyInstanceValue());
+ theEffect.m_EffectCommands.push_back(new SRender(false));
+ }
+ }
+ }
+ }
+
+ bool LoadEffectXMLFromSourcePath(const char *inSourcePath,
+ Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) override
+ {
+ std::shared_ptr<IDOMFactory> theFactory(
+ IDOMFactory::CreateDOMFactory(m_DataCore->GetStringTablePtr()));
+ qt3dsdm::SDOMElement *theElem = CDOMSerializer::Read(*theFactory, inStream, NULL);
+ if (theElem != NULL) {
+ std::shared_ptr<IDOMReader> theReader(
+ IDOMReader::CreateDOMReader(*theElem, m_DataCore->GetStringTablePtr(),
+ theFactory));
+ LoadEffectXML(*theReader, inInstance, inObjectName, outWarnings,
+ TCharStr(Intern(inSourcePath)));
+ return true;
+ }
+ return false;
+ }
+
+ Option<SMetaDataEffect> GetEffectBySourcePath(const char *inSourcePath) override
+ {
+ QDir sourcePath = QDir::cleanPath(QString(inSourcePath));
+ for (TEffectMap::iterator iter = m_EffectMap.begin(), end = m_EffectMap.end(); iter != end;
+ ++iter) {
+ QDir effectPath = QDir::cleanPath(QString::fromWCharArray(
+ iter->second.m_SourcePath.wide_str()));
+ if (effectPath == sourcePath)
+ return iter->second.ToEffect();
+ }
+ return Empty();
+ }
+
+ void LoadMaterialInstance(const char *inShaderFile, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) override
+ {
+ QString shaderFile(inShaderFile);
+ if (shaderFile.endsWith(".material") || shaderFile.endsWith(".shader")) {
+ LoadMaterialClassFromSourcePath(inShaderFile, inInstance, inName, outWarnings,
+ inStream);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ bool IsMaterialClassRegistered(const char *inName) override
+ {
+ return m_CustomMaterials.find(Intern(inName)) != m_CustomMaterials.end();
+ }
+
+ void LoadMaterialClassXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ const TCharStr &inSourcePath) override
+ {
+ using namespace qt3ds::render::dynamic;
+
+ std::pair<TCustomMaterialMap::iterator, bool> theInserter = m_CustomMaterials.insert(
+ std::make_pair(Intern(inObjectName), SMetaDataCustomMaterialImpl()));
+ /*if ( inStream.MoveToFirstChild( "Effect" ) == false )
+ {
+ outWarnings.push_back( SMetaDataLoadWarning( MetaDataLoadWarningType::Unknown,
+ MetaDataLoadWarningMessage::GeneralError, L"File doesn't appear to be an effect xml file,
+ missing top level Effect tag" ) );
+ return;
+ }*/
+ eastl::string shaderPrefix = "#include \"customMaterial.glsllib\"\n";
+
+ SMetaDataCustomMaterialImpl &theMaterial = theInserter.first->second;
+ m_ObjectName = inObjectName;
+ theMaterial.m_Name = inObjectName;
+ theMaterial.m_SourcePath = inSourcePath;
+ theMaterial.m_HasTransparency = false;
+ theMaterial.m_HasRefraction = false;
+ theMaterial.m_AlwaysDirty = false;
+ theMaterial.m_ShaderKey = 0;
+ theMaterial.m_LayerCount = 0;
+ inStream.Att("always-dirty", theMaterial.m_AlwaysDirty);
+ LoadDynamicObjectProperties(inStream, theMaterial, inInstance, inObjectName, outWarnings,
+ shaderPrefix);
+ LoadDynamicObjectShaders(inStream, theMaterial, shaderPrefix, inObjectName);
+
+ // currently single pass shader only
+ if (theMaterial.m_Shaders.size()) {
+ eastl::string theShaderNameStr;
+
+ // in Passes we store additional render commands
+ IDOMReader::Scope __readerScope(inStream);
+ if (inStream.MoveToFirstChild("Passes")) {
+ for (bool success = inStream.MoveToFirstChild(); success;
+ success = inStream.MoveToNextSibling()) {
+ IDOMReader::Scope __passScope(inStream);
+ if (AreEqual("Pass", inStream.GetNarrowElementName())) {
+ const char8_t *typeStr;
+ if (!inStream.UnregisteredAtt("type", typeStr))
+ typeStr = "render";
+ if (AreEqual(typeStr, "render")) {
+ const char8_t *shader = "", *input = "[source]", *output = "[dest]",
+ *outputFormat = "rgba", *clear = "";
+ bool needsClear = false;
+ inStream.Att("shader", shader);
+ inStream.Att("input", input);
+ inStream.Att("output", output);
+ // for multi pass materials
+ inStream.Att("clear", clear);
+ if (AreEqual("true", clear))
+ needsClear = true;
+
+ GetShaderName(inObjectName, shader, theShaderNameStr);
+ // this is only for the final output of the effect
+ inStream.Att("format", outputFormat);
+ qt3ds::render::NVRenderTextureFormats::Enum theOutputFormat =
+ ConvertTypeAndFormatToTextureFormat("ubyte", outputFormat);
+
+ if (AreEqual(output, "[dest]") || IsTrivial(output)) {
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SBindTarget(theOutputFormat));
+ } else {
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SBindBuffer(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ output), needsClear));
+ }
+
+ // add shader to command stream
+ qt3ds::render::CRegisteredString theShaderName;
+ if (!IsTrivial(shader)) {
+ for (QT3DSU32 idx = 0, end = theMaterial.m_Shaders.size();
+ idx < end && theShaderName.IsValid() == false; ++idx) {
+ qt3ds::render::CRegisteredString thePossibleNameStr =
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ theMaterial.m_Shaders[idx].m_Name.c_str());
+ if (AreEqual(thePossibleNameStr.c_str(),
+ theShaderNameStr.c_str()))
+ theShaderName = thePossibleNameStr;
+ }
+ }
+ if (theShaderName.IsValid() == false
+ && theMaterial.m_Shaders.empty() == false)
+ theShaderName = m_StringTable.GetRenderStringTable().RegisterStr(
+ theMaterial.m_Shaders[0].m_Name.c_str());
+ if (theShaderName.IsValid()) {
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SBindShader(theShaderName));
+ // this is a place holder for our input values to the shader
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SApplyInstanceValue());
+
+ for (bool bufParam = inStream.MoveToFirstChild(); bufParam;
+ bufParam = inStream.MoveToNextSibling()) {
+ if (AreEqual("BufferBlit", inStream.GetNarrowElementName())) {
+ const char8_t *value = "";
+ const char8_t *dest = "";
+ const char8_t *source = "";
+ inStream.Att("dest", dest);
+ if (AreEqual("[dest]", dest))
+ value = "";
+ inStream.Att("source", source);
+ if (AreEqual("[source]", source))
+ value = "";
+
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SApplyBlitFramebuffer(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ source),
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ dest)));
+
+ // note need a better way to pass information from MDL to
+ // our input
+ // We use buffer blits to simulate glass refraction
+ theMaterial.m_HasRefraction = true;
+ } else if (AreEqual("BufferInput",
+ inStream.GetNarrowElementName())) {
+ const char8_t *param = "";
+ const char8_t *value = "";
+ inStream.Att("param", param);
+ inStream.Att("value", value);
+ if (AreEqual("[source]", value))
+ value = "";
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SApplyBufferValue(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ value),
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ param)));
+ HideEffectProperty(inInstance, param);
+ } else if (AreEqual("Blending",
+ inStream.GetNarrowElementName())) {
+ const char8_t *theSrcBlendFuncStr = "",
+ *theDestBlendFuncStr = "";
+ inStream.Att("source", theSrcBlendFuncStr);
+ inStream.Att("dest", theDestBlendFuncStr);
+
+ qt3ds::render::NVRenderSrcBlendFunc::Enum theSrcBlendFunc =
+ ConvertToSrcBlendFunc(theSrcBlendFuncStr);
+ qt3ds::render::NVRenderDstBlendFunc::Enum theDstBlendFuc =
+ ConvertToDstBlendFunc(theDestBlendFuncStr);
+
+ // this will setup blending
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SApplyBlending(theSrcBlendFunc,
+ theDstBlendFuc));
+ // if we have blending we have transparency
+ theMaterial.m_HasTransparency = true;
+ } else if (AreEqual("RenderState",
+ inStream.GetNarrowElementName())) {
+ // UdoL Todo: add this one
+ }
+ }
+ }
+ // add the render command as last thing in the pass, it is a render
+ // pass.
+ theMaterial.m_CustomerMaterialCommands.push_back(new SRender(false));
+ }
+ } else if (AreEqual("ShaderKey", inStream.GetNarrowElementName())) {
+ QT3DSU32 theValue = 0;
+ inStream.Att("value", theValue);
+ theMaterial.m_ShaderKey = theValue;
+ } else if (AreEqual("LayerKey", inStream.GetNarrowElementName())) {
+ QT3DSU32 theValue = 0;
+ inStream.Att("count", theValue);
+ theMaterial.m_LayerCount = theValue;
+ } else if (AreEqual("Buffer", inStream.GetNarrowElementName())) {
+ SAllocateBufferFlags theFlags;
+ const char8_t *theLifetimeStr = "", *theType = "", *theFormat = "",
+ *theFilter = "", *theWrap = "", *theName = "";
+ QT3DSF32 theSize = 1.0f;
+ inStream.Att("name", theName);
+ inStream.Att("lifetime", theLifetimeStr);
+ inStream.Att("type", theType);
+ inStream.Att("format", theFormat);
+ inStream.Att("filter", theFilter);
+ inStream.Att("wrap", theWrap);
+ inStream.Att("size", theSize);
+ // Clamp the size to valid amounts
+ if (theSize <= 0)
+ theSize = 1.0f;
+ if (theSize > 1.0f)
+ theSize = 1.0f;
+ if (AreEqual(theLifetimeStr, "scene"))
+ theFlags.SetSceneLifetime(true);
+ qt3ds::render::NVRenderTextureFormats::Enum theTexFormat =
+ ConvertTypeAndFormatToTextureFormat(theType, theFormat);
+ qt3ds::render::NVRenderTextureMagnifyingOp::Enum theMagOp =
+ ConvertFilterToMagOp(theFilter);
+ qt3ds::render::NVRenderTextureCoordOp::Enum theCoordOp =
+ ConvertTextureCoordOp(theWrap);
+ if (*theName == 0) {
+ QT3DS_ASSERT(false);
+ // inFoundation.error( QT3DS_INVALID_PARAMETER, "Buffer is missing its
+ // name" );
+ } else {
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SAllocateBuffer(
+ m_StringTable.GetRenderStringTable().RegisterStr(
+ theName), theTexFormat, theMagOp, theCoordOp,
+ theSize, theFlags));
+ }
+ }
+ }
+ }
+
+ if (theMaterial.m_CustomerMaterialCommands.size() == 0) {
+ // add minimal set
+ // add shader to command stream
+ theMaterial.m_CustomerMaterialCommands.push_back(
+ new SBindShader(m_StringTable.GetRenderStringTable().RegisterStr(
+ theMaterial.m_Shaders[0].m_Name.c_str())));
+ // this is a place holder for our input values to the shader
+ theMaterial.m_CustomerMaterialCommands.push_back(new SApplyInstanceValue());
+ // add the render command as last thing
+ theMaterial.m_CustomerMaterialCommands.push_back(new SRender(false));
+ }
+ }
+ }
+
+ bool LoadMaterialClassFromSourcePath(const char *inSourcePath,
+ Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) override
+ {
+ std::shared_ptr<IDOMFactory> theFactory(
+ IDOMFactory::CreateDOMFactory(m_DataCore->GetStringTablePtr()));
+ qt3dsdm::SDOMElement *theElem = CDOMSerializer::Read(*theFactory, inStream, NULL);
+ if (theElem != NULL) {
+ std::shared_ptr<IDOMReader> theReader(
+ IDOMReader::CreateDOMReader(*theElem, m_DataCore->GetStringTablePtr(),
+ theFactory));
+ LoadMaterialClassXML(*theReader, inInstance, inObjectName, outWarnings,
+ TCharStr(Intern(inSourcePath)));
+ return true;
+ }
+ return false;
+ }
+
+ Option<SMetaDataCustomMaterial> GetMaterialBySourcePath(const char *inSourcePath) override
+ {
+ TCharStr theSourcePath(Intern(inSourcePath));
+ for (TCustomMaterialMap::iterator iter = m_CustomMaterials.begin(),
+ end = m_CustomMaterials.end();
+ iter != end; ++iter) {
+ if (iter->second.m_SourcePath == theSourcePath)
+ return iter->second.ToMaterial();
+ }
+ return Empty();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Undo/Redo
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override { m_Consumer = inConsumer; }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Signals
+ virtual TSignalConnectionPtr
+ ConnectInternalCategoryDestroyed(function<void(Qt3DSDMCategoryHandle)> inCallback)
+ {
+ return CONNECT(&SNewMetaDataImpl::internalCategoryDestroyed);
+ }
+ virtual TSignalConnectionPtr
+ ConnectInternalPropertyDestroyed(function<void(Qt3DSDMMetaDataPropertyHandle)> inCallback)
+ {
+ return CONNECT(&SNewMetaDataImpl::internalMetaDataPropertyDestroyed);
+ }
+ virtual TSignalConnectionPtr
+ ConnectInternalEventDestroyed(function<void(Qt3DSDMEventHandle)> inCallback)
+ {
+ return CONNECT(&SNewMetaDataImpl::internalEventDestroyed);
+ }
+ virtual TSignalConnectionPtr
+ ConnectInternalHandlerDestroyed(function<void(Qt3DSDMHandlerHandle)> inCallback)
+ {
+ return CONNECT(&SNewMetaDataImpl::internalHandlerDestroyed);
+ }
+ virtual TSignalConnectionPtr
+ ConnectInternalHandlerArgDestroyed(function<void(Qt3DSDMHandlerHandle, QT3DSU32)> inCallback)
+ {
+ return CONNECT(&SNewMetaDataImpl::internalHandlerArgDestroyed);
+ }
+};
+}
+
+std::shared_ptr<IMetaData> IMetaData::CreateNewMetaData(std::shared_ptr<IDataCore> inDataCore)
+{
+ return std::make_shared<SNewMetaDataImpl>(inDataCore);
+}
+#ifndef QT3DSDM_META_DATA_NO_SIGNALS
+#include "Qt3DSDMMetaData.moc"
+#endif
diff --git a/src/dm/systems/Qt3DSDMMetaData.h b/src/dm/systems/Qt3DSDMMetaData.h
new file mode 100644
index 0000000..67a7fb1
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMMetaData.h
@@ -0,0 +1,400 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+
+#include "Qt3DSDMMetaDataTypes.h"
+#include "foundation/Qt3DSOption.h"
+#include <functional>
+#include <memory>
+#include "Qt3DSDMActionInfo.h"
+#include "Qt3DSDMStringTable.h"
+#include "Qt3DSDMValue.h"
+
+struct SShaderParameters;
+namespace qt3ds {
+namespace foundation {
+ class IInStream;
+}
+}
+
+namespace qt3dsdm {
+
+using qt3ds::foundation::Option;
+using qt3ds::QT3DSU32;
+using std::pair;
+using std::vector;
+
+class ISignalConnection;
+class ITransactionConsumer;
+class IDOMWriter;
+class IDOMReader;
+class IDataCore;
+class CDataCoreProducer;
+
+struct MetaDataLoadWarningType
+{
+ enum Enum {
+ Unknown = 0,
+ InvalidProperty,
+ InvalidEvent,
+ InvalidHandler,
+ };
+};
+
+struct MetaDataLoadWarningMessage
+{
+ enum Enum {
+ Unknown = 0,
+ GeneralError,
+ MissingName,
+ InvalidDefault,
+ };
+};
+
+struct SMetaDataLoadWarning
+{
+ MetaDataLoadWarningType::Enum m_Type;
+ MetaDataLoadWarningMessage::Enum m_Message;
+ TCharStr m_ExtraInfo;
+
+ SMetaDataLoadWarning(MetaDataLoadWarningType::Enum inType,
+ MetaDataLoadWarningMessage::Enum inMessage, TCharStr inInfo = TCharStr())
+ : m_Type(inType)
+ , m_Message(inMessage)
+ , m_ExtraInfo(inInfo)
+ {
+ }
+ SMetaDataLoadWarning()
+ : m_Type(MetaDataLoadWarningType::Unknown)
+ , m_Message(MetaDataLoadWarningMessage::Unknown)
+ {
+ }
+};
+
+/**
+ * Meta data class to hold meta data descriptions of the objects used in DataModel.
+ * A user-visible type in DataModel (things in the timeline) has a specific set of metadata,
+ * the type can have properties, events, handlers, and references.
+ *
+ * Properties are exactly what they sound like. Events are messages the object can send,
+ * and handlers are functions that are exported from the object.
+ *
+ * Events are hooked up to handlers using an ActionCore which takes tuples
+ * of instance, event, handler and slide and maintains a specific instance of an action.
+ *
+ * References allow us to track which properties are being accessed. Properties are stripped
+ * from the engine portion of the runtime (although they still appear in the scenegraph)
+ * if they aren't animated nor set in a given slide.
+ */
+class IMetaData
+{
+protected:
+ virtual ~IMetaData() {}
+public:
+ typedef const TCharStr &TStrType;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Sharing some utility objects
+ virtual IStringTable &GetStringTable() = 0;
+ virtual TStringTablePtr GetStringTablePtr() = 0;
+ virtual std::shared_ptr<IDataCore> GetDataCore() = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Canonical Instances
+ // Map an instance to a given type name. The type name is stored, along with the instance
+ // handle in the file if this object is *not* canonical.
+ // If this object is canonical, then we expect this mapping setup before loading the
+ // canonical data, and we will use a type lookup instead of a direct handle lookup
+ // when loading canonical information.
+ virtual void SetInstanceAsCanonical(Qt3DSDMInstanceHandle inInstance, TStrType inTypename) = 0;
+
+ virtual Qt3DSDMInstanceHandle GetCanonicalInstanceForType(TStrType inTypename) = 0;
+ // If this instance wasn't registered as canonical, then we return empty.
+ virtual Option<TCharStr> GetTypeForCanonicalInstance(Qt3DSDMInstanceHandle inInstance) = 0;
+ // Gets the type for this instance via derivation
+ virtual Option<TCharStr> GetTypeForInstance(Qt3DSDMInstanceHandle inInstance) = 0;
+ // Get group count for instance
+ virtual QT3DSU32 GetGroupCountForInstance(Qt3DSDMInstanceHandle inInstance) = 0;
+ // Get all group names
+ virtual QT3DSU32 GetGroupNamesForInstance(Qt3DSDMInstanceHandle inInstance,
+ std::vector<TCharStr> &outNames) = 0;
+ // Get group count for instance
+ virtual Option<TCharStr> GetGroupFilterNameForInstance(Qt3DSDMInstanceHandle inInstance,
+ long inIndex) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Categories
+ // Categories appear in the UI to divide up large lists of events, actions, and properties.
+ // Returns <handle,true> if a category was created
+ // else returns <handle,false>
+ virtual pair<Qt3DSDMCategoryHandle, bool> GetOrCreateCategory(TStrType inName) = 0;
+
+ virtual void SetCategoryInfo(Qt3DSDMCategoryHandle inCategory, TStrType inIcon,
+ TStrType inHighlight, TStrType inDescription) = 0;
+ virtual void DestroyCategory(Qt3DSDMCategoryHandle inCategory) = 0;
+
+ virtual Option<SCategoryInfo> GetCategoryInfo(Qt3DSDMCategoryHandle inCategory) = 0;
+ virtual Qt3DSDMCategoryHandle FindCategoryByName(TStrType inName) = 0;
+ virtual void GetCategories(vector<Qt3DSDMCategoryHandle> &outCategories) = 0;
+ virtual Option<SCategoryInfo> GetEventCategory(TStrType inName) = 0;
+ virtual Option<SCategoryInfo> GetHandlerCategory(TStrType inName) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Properties
+ // Will create the property on the instance associated with this type name if it doesn't exist.
+ // Metadata properties can be redifined for child instances and this re-definition will override
+ // the parent definition. We currently use this to give different formal names and description
+ // to the sourcepath property (for models it is mesh, for materials it is image).
+ virtual Qt3DSDMMetaDataPropertyHandle
+ CreateMetaDataProperty(Qt3DSDMInstanceHandle inInstance) = 0;
+
+ // For properties, you set the default values separately
+ // This may delete the underlying data model property rebuild it.
+ virtual void SetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inPropertyHandle,
+ TStrType inName, TStrType inFormalName,
+ TStrType inDescription, TStrType inUsage,
+ CompleteMetaDataType::Enum inDataType,
+ const SValue &inDefaultValue,
+ const TMetaDataData &inMetaData, TStrType inGroupName,
+ bool inIsHidden = false, bool inIsAnimatable = false,
+ bool inIsControllable = false) = 0;
+
+ // Destroy just this meta data property
+ // Does not destroy the underlying data core property, so this function isn't a perfect
+ // reverse of the above system. This *just* destroyed the meta data pointed to by
+ // this property.
+ virtual void DestroyMetaDataProperty(Qt3DSDMMetaDataPropertyHandle inProperty) = 0;
+
+ virtual Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance,
+ TStrType inPropertyName) = 0;
+ virtual Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual Option<SMetaDataPropertyInfo>
+ GetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inProperty) = 0;
+ // Get all of the meta data properties defined on this object or its derivation parents
+ virtual void GetMetaDataProperties(Qt3DSDMInstanceHandle inInstance,
+ vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) = 0;
+
+ // Get the meta data properties defined on *only* this object, don't search parents
+ virtual Qt3DSDMMetaDataPropertyHandle
+ GetOrCreateSpecificMetaDataProperty(Qt3DSDMInstanceHandle inInstance,
+ TStrType inPropertyName) = 0;
+ virtual void
+ GetSpecificMetaDataProperties(Qt3DSDMInstanceHandle inInstance,
+ vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) = 0;
+
+ virtual TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual AdditionalMetaDataType::Value GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual bool IsCustomProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual SValue GetDefaultValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+
+ virtual void
+ SetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty,
+ qt3ds::foundation::NVConstDataRef<SPropertyFilterInfo> inFilters) = 0;
+ virtual qt3ds::foundation::NVConstDataRef<SPropertyFilterInfo>
+ GetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) = 0;
+ virtual void RemoveMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Events
+ // CreateMetaDataEvent was original named CreateEvent but this collides with
+ // the microsoft macro CreateEvent which expands to CreateEventA or CreateEventW
+ virtual Qt3DSDMEventHandle CreateMetaDataEvent(Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SetEventInfo(Qt3DSDMEventHandle inEventHandle, TStrType inName,
+ TStrType inFormalName, TStrType inCategory,
+ TStrType inDescription) = 0;
+
+ virtual void DestroyEvent(Qt3DSDMEventHandle inEventHandle) = 0;
+
+ virtual void GetEvents(Qt3DSDMInstanceHandle inInstance, TEventHandleList &outEvents) = 0;
+ virtual Qt3DSDMEventHandle FindEvent(Qt3DSDMInstanceHandle inInstance, TStrType inName) = 0;
+ virtual Option<SEventInfo> GetEventInfo(Qt3DSDMEventHandle inEventHandle) = 0;
+ virtual bool IsCustomEvent(Qt3DSDMEventHandle inEventHandle) = 0;
+
+ // Get/Find an event that occurs on just this instance, don't search parent instances
+ virtual void GetSpecificEvents(Qt3DSDMInstanceHandle inInstance,
+ TEventHandleList &outEvents) = 0;
+ virtual Qt3DSDMEventHandle GetOrCreateSpecificEvent(Qt3DSDMInstanceHandle inInstance,
+ TStrType inName) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Handlers
+ virtual Qt3DSDMHandlerHandle CreateHandler(Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SetHandlerInfo(Qt3DSDMHandlerHandle inHandle, TStrType inName,
+ TStrType inFormalName, TStrType inCategory,
+ TStrType inDescription) = 0;
+ virtual void DestroyHandler(Qt3DSDMHandlerHandle inHandlerHandle) = 0;
+
+ virtual Qt3DSDMHandlerHandle FindHandlerByName(Qt3DSDMInstanceHandle inInstance,
+ TStrType inName) = 0;
+ virtual Option<SHandlerInfo> GetHandlerInfo(Qt3DSDMHandlerHandle inHandlerHandle) = 0;
+ virtual void GetHandlers(Qt3DSDMInstanceHandle inInstance, THandlerHandleList &outHandlers) = 0;
+ virtual bool IsCustomHandler(Qt3DSDMHandlerHandle inEventHandle) = 0;
+
+ virtual void GetSpecificHandlers(Qt3DSDMInstanceHandle inInstance,
+ THandlerHandleList &outHandlers) = 0;
+ virtual Qt3DSDMHandlerHandle GetOrCreateSpecificHandler(Qt3DSDMInstanceHandle inInstance,
+ TStrType inName) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Handler Arguments
+ virtual QT3DSU32 AddHandlerArgument(Qt3DSDMHandlerHandle inHandler) = 0;
+ virtual void
+ SetHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandler, QT3DSU32 inArgIndex, TStrType inName,
+ TStrType inFormalName, TStrType inDescription,
+ CompleteMetaDataType::Enum inDataType, const SValue &inDefaultValue,
+ const TMetaDataData &inMetaData, HandlerArgumentType::Value inArgType) = 0;
+
+ virtual void DestroyHandlerArgument(Qt3DSDMHandlerHandle inHandler, QT3DSU32 inArgIndex) = 0;
+
+ virtual Option<SMetaDataHandlerArgumentInfo>
+ FindHandlerArgumentByName(Qt3DSDMHandlerHandle inHandler, TStrType inName) = 0;
+ virtual void GetHandlerArguments(Qt3DSDMHandlerHandle inHandler,
+ vector<SMetaDataHandlerArgumentInfo> &outArguments) = 0;
+ virtual Option<SMetaDataHandlerArgumentInfo>
+ GetHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandle, QT3DSU32 inIndex) = 0;
+ virtual QT3DSU32 GetNumHandlerArguments(Qt3DSDMHandlerHandle inHandler) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // References
+ // Duplicate references are removed from this instance
+ virtual void AddReference(Qt3DSDMInstanceHandle inInstance, TStrType inRefString) = 0;
+ virtual void DestroyReferences(Qt3DSDMInstanceHandle inInstance) = 0;
+
+ // Does the recursive gather from all the parents. Duplicate references are removed from the
+ // final list.
+ virtual void GetReferences(Qt3DSDMInstanceHandle inInstance,
+ std::vector<TCharStr> &outReferences) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Instance-global functions
+ // Destroy all meta data that relates to this instance.
+ // Calling this on a derived instance does nothing, this only works if this specific
+ // instance was mapped directly to meta data.
+ virtual void DestroyMetaData(Qt3DSDMInstanceHandle inInstance) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Serialization
+ // You can either save out in canonical format (and it will only save canonical-instance-related
+ // information *or* you can save out in normal format where we link directly to instance handle
+ // instead of to typename
+ virtual void Save(IDOMWriter &inWriter) = 0;
+ // Loading expects the canonical instances to be setup already which means that
+ // it will perform lookups based on
+ // One huge assumption is that the reader is using the same string table
+ // that this object was built with
+ // InIsCanonical tells us whether to mark loaded categories as canonical
+ // or not.
+ virtual void Load(IDOMReader &ioStream) = 0;
+
+ // Load meta data and apply it to just this instance
+ virtual void LoadInstance(IDOMReader &inReader, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inName,
+ std::vector<SMetaDataLoadWarning> &outWarnings) = 0;
+
+ // Save just this instances meta data out to the writer
+ virtual void SaveInstance(IDOMWriter &inWriter, Qt3DSDMInstanceHandle inInstance) = 0;
+
+ // Load effect meta data from file and apply it to just this instance
+ virtual void LoadEffectInstance(const char *inShaderFile, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) = 0;
+
+ virtual bool IsEffectInstanceRegistered(const char *inName) = 0;
+ virtual void LoadEffectXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ const TCharStr &inSourcePath) = 0;
+ virtual bool LoadEffectXMLFromSourcePath(const char *inSourcePath,
+ Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) = 0;
+ virtual Option<SMetaDataEffect> GetEffectBySourcePath(const char *inName) = 0;
+
+ virtual void LoadMaterialInstance(const char *inShaderFile,
+ Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) = 0;
+ virtual bool IsMaterialClassRegistered(const char *inName) = 0;
+ virtual void LoadMaterialClassXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ const TCharStr &inSourcePath) = 0;
+ virtual bool LoadMaterialClassFromSourcePath(const char *inSourcePath,
+ Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inObjectName,
+ std::vector<SMetaDataLoadWarning> &outWarnings,
+ qt3ds::foundation::IInStream &inStream) = 0;
+ virtual Option<SMetaDataCustomMaterial> GetMaterialBySourcePath(const char *inSourcePath) = 0;
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Undo/Redo
+ virtual void SetConsumer(std::shared_ptr<ITransactionConsumer> inConsumer) = 0;
+
+#ifndef QT3DSDM_META_DATA_NO_SIGNALS
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Signals
+ // These events are sent out only once, they aren't set into the transaction consumer
+ // to be sent out upon undo and redo. These events are meant for chaining together side effects
+ // so other systems don't have references to invalid handler arguments and handles.
+ // Also, the objects in these messages are still valid so you can query information about them
+ // at this time. They will be destroyed subsequent to the event.
+ virtual std::shared_ptr<ISignalConnection>
+ ConnectInternalCategoryDestroyed(std::function<void(Qt3DSDMCategoryHandle)> inCallback) = 0;
+ virtual std::shared_ptr<ISignalConnection> ConnectInternalPropertyDestroyed(
+ std::function<void(Qt3DSDMMetaDataPropertyHandle)> inCallback) = 0;
+ virtual std::shared_ptr<ISignalConnection>
+ ConnectInternalEventDestroyed(std::function<void(Qt3DSDMEventHandle)> inCallback) = 0;
+ virtual std::shared_ptr<ISignalConnection>
+ ConnectInternalHandlerDestroyed(std::function<void(Qt3DSDMHandlerHandle)> inCallback) = 0;
+ virtual std::shared_ptr<ISignalConnection> ConnectInternalHandlerArgDestroyed(
+ std::function<void(Qt3DSDMHandlerHandle, QT3DSU32)> inCallback) = 0;
+#endif
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ // Creation/Lifetime Management
+ friend class std::shared_ptr<IMetaData>;
+ // The data core is used to create the properties if they don't exist or
+ // query their underlying type if they do exist. We also subscribe to
+ // the datacore's beforeInstanceDelete function in order to ensure
+ // that we delete our existing meta data for instances that are being deleted.
+ static std::shared_ptr<IMetaData> CreateNewMetaData(std::shared_ptr<IDataCore> inDataCore);
+};
+
+typedef std::shared_ptr<IMetaData> TNewMetaDataPtr;
+}
diff --git a/src/dm/systems/Qt3DSDMMetaDataTypes.h b/src/dm/systems/Qt3DSDMMetaDataTypes.h
new file mode 100644
index 0000000..5532e0a
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMMetaDataTypes.h
@@ -0,0 +1,350 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#include "Qt3DSDMMetaDataValue.h"
+
+namespace qt3ds {
+namespace render {
+ namespace dynamic {
+ struct SCommand;
+ struct SPropertyDeclaration;
+ struct SPropertyDefinition;
+ }
+}
+}
+
+namespace qt3dsdm {
+
+struct HandlerArgumentType {
+
+ enum Value {
+ None,
+ Property, // Property reference. Load the Properties of the Target Object.
+ Dependent, // Property type depends on another property.
+ Slide, // Slide reference. Load the list of slides of the Target Object if
+ // applicable.
+ Event, // Event reference. Load the applicable Events of the Target Object.
+ Object, // Object reference. Used for dynamic actions with object referenced
+ // property.
+ Signal, // Signal reference. Used for emiting signals fired from the trigger
+ // object.
+ };
+
+ Q_ENUM(Value)
+ Q_GADGET
+};
+
+struct CompleteMetaDataType
+{
+ enum Enum {
+ Unknown = 0,
+ StringList,
+ FloatRange,
+ LongRange,
+ Float,
+ Long,
+ Float2,
+ Vector,
+ Scale,
+ Rotation,
+ Color,
+ Boolean,
+ Slide,
+ Font,
+ FontSize,
+ String,
+ MultiLineString,
+ ObjectRef,
+ Image,
+ Mesh,
+ Import,
+ Texture,
+ Guid,
+ StringListOrInt,
+ Renderable,
+ Image2D,
+ Buffer,
+ PathBuffer,
+ ShadowMapResolution,
+ };
+
+ // Functions defined in UICDMMetaData.cpp
+ static DataModelDataType::Value ToDataType(Enum inCompleteType);
+ static AdditionalMetaDataType::Value ToAdditionalType(Enum inCompleteType);
+ static CompleteMetaDataType::Enum ToCompleteType(DataModelDataType::Value inDataType,
+ AdditionalMetaDataType::Value inAdditionalType);
+ Q_ENUM(Enum)
+ Q_GADGET
+};
+
+typedef std::pair<DataModelDataType::Value, AdditionalMetaDataType::Value> TDataTypePair;
+
+inline bool Equals(const TMetaDataData &lhs, const TMetaDataData &rhs)
+{
+ return rhs == lhs;
+}
+
+inline AdditionalMetaDataType::Value GetMetaDataValueType(const TMetaDataData &inValue)
+{
+ return inValue.getType();
+}
+
+// Base class shared between property info
+// and handler arguments.
+struct SMetaPropertyBase
+{
+ TCharStr m_Name;
+ TCharStr m_FormalName;
+ TCharStr m_Usage;
+ TCharStr m_Description;
+ CompleteMetaDataType::Enum m_CompleteType;
+ TMetaDataData m_MetaDataData;
+ SValue m_DefaultValue;
+
+ SMetaPropertyBase()
+ : m_CompleteType(CompleteMetaDataType::Float)
+ {
+ }
+ bool operator==(const SMetaPropertyBase &inOther) const
+ {
+ return m_Name == inOther.m_Name && m_FormalName == inOther.m_FormalName
+ && m_Usage == inOther.m_Usage && m_Description == inOther.m_Description
+ && m_CompleteType == inOther.m_CompleteType
+ && Equals(m_DefaultValue.toOldSkool(), inOther.m_DefaultValue.toOldSkool())
+ && Equals(m_MetaDataData, inOther.m_MetaDataData);
+ }
+ DataModelDataType::Value GetDataType() const
+ {
+ return CompleteMetaDataType::ToDataType(m_CompleteType);
+ }
+ AdditionalMetaDataType::Value GetAdditionalType() const
+ {
+ return CompleteMetaDataType::ToAdditionalType(m_CompleteType);
+ }
+};
+
+struct SMetaDataPropertyInfo : SMetaPropertyBase
+{
+ Qt3DSDMInstanceHandle m_Instance;
+ Qt3DSDMPropertyHandle m_Property;
+ bool m_Controllable = false; // Can this property be controlled via data input (default no)
+ bool m_IsHidden = false; // Is this property hidden in the inspector (default no)
+ bool m_Animatable = true; // Is this property animatable (default yes)
+ // Note: all animatables are controllable
+
+ TCharStr m_GroupName; // Name of the group this property belongs to or "default"
+
+ SMetaDataPropertyInfo(Qt3DSDMInstanceHandle inInstance)
+ : m_Instance(inInstance)
+ {
+ }
+ SMetaDataPropertyInfo() {}
+
+ bool operator==(const SMetaDataPropertyInfo &inOther) const
+ {
+ return m_Instance == inOther.m_Instance && m_Property == inOther.m_Property
+ && m_IsHidden == inOther.m_IsHidden && m_Animatable == inOther.m_Animatable
+ && m_GroupName == inOther.m_GroupName
+ && m_Controllable == inOther.m_Controllable
+ && SMetaPropertyBase::operator==(inOther);
+ }
+
+ bool operator!=(const SMetaDataPropertyInfo &inOther) const { return !(*this == inOther); }
+};
+
+struct SMetaDataHandlerArgumentInfo : SMetaPropertyBase
+{
+ Qt3DSDMHandlerHandle m_Handler;
+ HandlerArgumentType::Value m_ArgType;
+ SMetaDataHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandler = Qt3DSDMHandlerHandle())
+ : m_Handler(inHandler)
+ , m_ArgType(HandlerArgumentType::None)
+ {
+ }
+};
+
+struct SCategoryInfo
+{
+ TCharStr m_Name;
+ TCharStr m_Description;
+ TCharStr m_Icon;
+ TCharStr m_HighlightIcon;
+ bool m_Canonical;
+
+ SCategoryInfo()
+ : m_Canonical(false)
+ {
+ }
+ SCategoryInfo(TCharStr inName)
+ : m_Name(inName)
+ , m_Canonical(false)
+ {
+ }
+};
+
+struct SEventInfo
+{
+ bool operator!=(const SEventInfo &inEvent) const
+ {
+ return (m_Name != inEvent.m_Name || m_FormalName != inEvent.m_FormalName
+ || m_Category != inEvent.m_Category || m_Description != inEvent.m_Description);
+ }
+
+ TCharStr m_Name;
+ TCharStr m_FormalName;
+ TCharStr m_Category;
+ TCharStr m_Description;
+};
+
+struct SHandlerInfo
+{
+ TCharStr m_Name;
+ TCharStr m_FormalName;
+ TCharStr m_Category;
+ TCharStr m_Description;
+
+ bool operator!=(const SHandlerInfo &inHandler) const
+ {
+ return (m_Name != inHandler.m_Name || m_FormalName != inHandler.m_FormalName
+ || m_Category != inHandler.m_Category || m_Description != inHandler.m_Description);
+ }
+};
+
+struct PropertyFilterTypes
+{
+ enum Enum {
+ Unknown,
+ ShowIfEqual,
+ HideIfEqual,
+ };
+};
+
+struct SPropertyFilterInfo
+{
+ PropertyFilterTypes::Enum m_FilterType;
+ Qt3DSDMPropertyHandle m_FilterProperty;
+ SValue m_Value;
+ SPropertyFilterInfo()
+ : m_FilterType(PropertyFilterTypes::Unknown)
+ {
+ }
+ SPropertyFilterInfo(PropertyFilterTypes::Enum inFilterType, Qt3DSDMPropertyHandle inProp,
+ const SValue &inValue)
+ : m_FilterType(inFilterType)
+ , m_FilterProperty(inProp)
+ , m_Value(inValue)
+ {
+ }
+};
+struct SMetaDataShader
+{
+ TCharStr m_Name;
+ TCharStr m_Type; ///< shader type (GLSL or HLSL)
+ TCharStr m_Version; ///< shader version (e.g. 330 vor GLSL)
+ // Code contains both the vertex and fragment portions separated by #define's.
+ //#define VERTEX_SHADER, #define FRAGMENT_SHADER
+ TCharStr m_Code;
+ bool m_HasGeomShader;
+ bool m_IsComputeShader;
+ SMetaDataShader()
+ : m_HasGeomShader(false)
+ , m_IsComputeShader(false)
+ {
+ }
+ SMetaDataShader(const TCharStr &inName, const TCharStr &inType, const TCharStr &inVersion,
+ const TCharStr &inCode, bool hasGeom, bool isCompute)
+ : m_Name(inName)
+ , m_Type(inType)
+ , m_Version(inVersion)
+ , m_Code(inCode)
+ , m_HasGeomShader(hasGeom)
+ , m_IsComputeShader(isCompute)
+ {
+ }
+};
+
+struct SMetaDataDynamicObject
+{
+ TCharStr m_Name;
+ qt3ds::foundation::NVConstDataRef<SMetaDataShader> m_Shaders;
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> m_Properties;
+ SMetaDataDynamicObject() {}
+ SMetaDataDynamicObject(
+ const TCharStr &inName, qt3ds::foundation::NVConstDataRef<SMetaDataShader> inShaders,
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> inProperties)
+ : m_Name(inName)
+ , m_Shaders(inShaders)
+ , m_Properties(inProperties)
+ {
+ }
+};
+
+struct SMetaDataEffect : public SMetaDataDynamicObject
+{
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> m_EffectCommands;
+ SMetaDataEffect() {}
+ SMetaDataEffect(
+ const TCharStr &inName, qt3ds::foundation::NVConstDataRef<SMetaDataShader> inShaders,
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> inProperties,
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> inEffectCommands)
+ : SMetaDataDynamicObject(inName, inShaders, inProperties)
+ , m_EffectCommands(inEffectCommands)
+ {
+ }
+};
+
+struct SMetaDataCustomMaterial : public SMetaDataDynamicObject
+{
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> m_CustomMaterialCommands;
+ bool m_HasTransparency;
+ bool m_HasRefraction;
+ bool m_AlwaysDirty;
+ unsigned int m_ShaderKey;
+ unsigned int m_LayerCount;
+ SMetaDataCustomMaterial() {}
+ SMetaDataCustomMaterial(
+ const TCharStr &inName, qt3ds::foundation::NVConstDataRef<SMetaDataShader> inShaders,
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> inProperties,
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> inCustomMaterialCommands,
+ bool inHasTransparency, bool inHasRefraction, bool inIsAlwaysDirty,
+ unsigned int inShaderKey, unsigned int inLayerCount)
+ : SMetaDataDynamicObject(inName, inShaders, inProperties)
+ , m_CustomMaterialCommands(inCustomMaterialCommands)
+ , m_HasTransparency(inHasTransparency)
+ , m_HasRefraction(inHasRefraction)
+ , m_AlwaysDirty(inIsAlwaysDirty)
+ , m_ShaderKey(inShaderKey)
+ , m_LayerCount(inLayerCount)
+ {
+ }
+};
+}
+
+Q_DECLARE_METATYPE(qt3dsdm::HandlerArgumentType::Value)
+
diff --git a/src/dm/systems/Qt3DSDMMetaDataValue.h b/src/dm/systems/Qt3DSDMMetaDataValue.h
new file mode 100644
index 0000000..b981b95
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMMetaDataValue.h
@@ -0,0 +1,251 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#include <EASTL/string.h>
+#include <EASTL/vector.h>
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMDataTypes.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "Qt3DSDMValue.h"
+
+#include <QStringList>
+
+namespace qt3dsdm {
+
+struct AdditionalMetaDataType {
+
+ enum Value {
+ None,
+ StringList,
+ Range,
+ Image,
+ Color,
+ Rotation,
+ Font,
+ FontSize,
+ MultiLine,
+ ObjectRef,
+ Mesh,
+ Import,
+ Texture,
+ Renderable,
+ PathBuffer,
+ ShadowMapResolution,
+ String,
+ };
+
+
+ Q_ENUM(Value)
+ Q_GADGET
+};
+
+// List type metadata
+typedef eastl::vector<TCharStr> TMetaDataStringList;
+
+// Float type metadata
+struct SMetaDataRange
+{
+ SMetaDataRange() {}
+
+ SMetaDataRange(float min, float max, int decimals = -1)
+ : m_min(min)
+ , m_max(max)
+ , m_decimals(decimals)
+ {
+ }
+
+ bool operator==(const SMetaDataRange &other) const
+ {
+ // no need to check m_decimals for quality as it is not significant to the range value
+ return m_min == other.m_min && m_max == other.m_max;
+ }
+
+ float m_min = 0.0f;
+ float m_max = 0.0f;
+ int m_decimals = -1; // num decimals to show, -1: dynamically calculated
+};
+}
+
+namespace qt3ds {
+namespace foundation {
+
+ template <>
+ struct DestructTraits<qt3dsdm::SMetaDataRange>
+ {
+ void destruct(qt3dsdm::SMetaDataRange &) {}
+ };
+}
+}
+
+namespace qt3dsdm {
+
+template <typename TDataType>
+struct SMetaDataTypeToEnumMap
+{
+};
+template <>
+struct SMetaDataTypeToEnumMap<eastl::vector<TCharStr>>
+{
+ static AdditionalMetaDataType::Value getType() { return AdditionalMetaDataType::StringList; }
+};
+template <>
+struct SMetaDataTypeToEnumMap<SMetaDataRange>
+{
+ static AdditionalMetaDataType::Value getType() { return AdditionalMetaDataType::Range; }
+};
+
+struct SMetaDataValueTraits
+{
+ typedef AdditionalMetaDataType::Value TIdType;
+
+ enum {
+ TBufferSize = sizeof(TMetaDataStringList),
+ };
+
+ static TIdType getNoDataId() { return AdditionalMetaDataType::None; }
+
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return SMetaDataTypeToEnumMap<TDataType>::getType();
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, AdditionalMetaDataType::Value inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case AdditionalMetaDataType::StringList:
+ return inVisitor(*reinterpret_cast<TMetaDataStringList *>(inData));
+ case AdditionalMetaDataType::Range:
+ return inVisitor(*reinterpret_cast<SMetaDataRange *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case AdditionalMetaDataType::None:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, AdditionalMetaDataType::Value inType,
+ TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case AdditionalMetaDataType::StringList:
+ return inVisitor(*reinterpret_cast<const TMetaDataStringList *>(inData));
+ case AdditionalMetaDataType::Range:
+ return inVisitor(*reinterpret_cast<const SMetaDataRange *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case AdditionalMetaDataType::None:
+ return inVisitor();
+ }
+ }
+};
+
+struct SMetaDataData
+ : public qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<SMetaDataValueTraits,
+ Qt3DSDMDataTypeUnionTraits::
+ TBufferSize>,
+ SMetaDataValueTraits::TBufferSize>
+{
+ typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::DiscriminatedUnionGenericBase<SMetaDataValueTraits,
+ Qt3DSDMDataTypeUnionTraits::
+ TBufferSize>,
+ SMetaDataValueTraits::TBufferSize>
+ TBase;
+ SMetaDataData() {}
+ SMetaDataData(const SMetaDataData &inOther)
+ : TBase(static_cast<const TBase &>(inOther))
+ {
+ }
+ SMetaDataData &operator=(const SMetaDataData &inOther)
+ {
+ TBase::operator=(static_cast<const TBase &>(inOther));
+ return *this;
+ }
+ SMetaDataData(const TMetaDataStringList &inData)
+ : TBase(inData)
+ {
+ }
+ SMetaDataData(const SMetaDataRange &inData)
+ : TBase(inData)
+ {
+ }
+ SMetaDataData &operator=(const TMetaDataStringList &inData)
+ {
+ TBase::operator=(inData);
+ return *this;
+ }
+ SMetaDataData &operator=(const SMetaDataRange &inData)
+ {
+ TBase::operator=(inData);
+ return *this;
+ }
+ bool empty() const { return getType() == AdditionalMetaDataType::None; }
+};
+
+template <>
+struct Qt3DSDMGetter<SMetaDataData>
+{
+ template <typename TRetType>
+ TRetType doGet(const SMetaDataData &inValue)
+ {
+ return inValue.getData<TRetType>();
+ }
+};
+
+template <>
+struct Qt3DSDMValueTyper<SMetaDataData>
+{
+ AdditionalMetaDataType::Value Get(const SMetaDataData &inValue) { return inValue.getType(); }
+};
+
+typedef SMetaDataData TMetaDataData;
+
+
+template <>
+inline QStringList get<QStringList>(const qt3dsdm::SMetaDataData &inType)
+{
+ QStringList result;
+ if (inType.getType() == qt3dsdm::AdditionalMetaDataType::None)
+ return result;
+
+ auto list = qt3dsdm::get<qt3dsdm::TMetaDataStringList>(inType);
+ std::transform(list.begin(), list.end(), std::back_inserter(result), [](const Qt3DSDMStr &s) {
+ return QString::fromWCharArray(s.wide_str());
+ });
+ return result;
+}
+}
+
+Q_DECLARE_METATYPE(qt3dsdm::AdditionalMetaDataType)
+
diff --git a/src/dm/systems/Qt3DSDMPropertyDefinition.h b/src/dm/systems/Qt3DSDMPropertyDefinition.h
new file mode 100644
index 0000000..d324b53
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMPropertyDefinition.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_PROPERTY_DEFINITION_H
+#define QT3DSDM_PROPERTY_DEFINITION_H
+
+#include "Qt3DSDMDataTypes.h"
+
+namespace qt3dsdm {
+
+struct Qt3DSDMPropertyDefinition
+{
+ TCharStr m_Name;
+ Qt3DSDMInstanceHandle m_Instance;
+ DataModelDataType::Value m_Type;
+
+ Qt3DSDMPropertyDefinition()
+ : m_Type(DataModelDataType::None)
+ {
+ }
+ Qt3DSDMPropertyDefinition(Qt3DSDMInstanceHandle inInstanceHandle, TCharPtr inName,
+ DataModelDataType::Value inType)
+ : m_Name(inName)
+ , m_Instance(inInstanceHandle)
+ , m_Type(inType)
+ {
+ }
+ Qt3DSDMPropertyDefinition(const Qt3DSDMPropertyDefinition &inOther)
+ : m_Name(inOther.m_Name)
+ , m_Instance(inOther.m_Instance)
+ , m_Type(inOther.m_Type)
+ {
+ }
+
+ Qt3DSDMPropertyDefinition &operator=(const Qt3DSDMPropertyDefinition &inOther)
+ {
+ if (this != &inOther) {
+ m_Name = inOther.m_Name;
+ m_Instance = inOther.m_Instance;
+ m_Type = inOther.m_Type;
+ }
+ return *this;
+ }
+};
+
+typedef std::vector<Qt3DSDMPropertyDefinition> TPropertyDefinitionList;
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMSignalStructImpl.h b/src/dm/systems/Qt3DSDMSignalStructImpl.h
new file mode 100644
index 0000000..9664566
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSignalStructImpl.h
@@ -0,0 +1,305 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SIGNAL_STRUCT_IMPL_H
+#define QT3DSDM_SIGNAL_STRUCT_IMPL_H
+#include "Qt3DSDMSignalStructs.h"
+
+namespace qt3dsdm {
+
+struct SSignalDataStruct0
+{
+ typedef SSignalDataStruct0 TThisType;
+ typedef std::function<void()> TFunType;
+ static void Send(ISignalSystem &system, void *sender, const char *sigName)
+ {
+ system.Signal(sender, sigName, NULL, 0);
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == 0)
+ inHandler();
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(std::function<void()> inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT0(name) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void()> inHandler) \
+ { \
+ typedef SSignalDataStruct0 TBase; \
+ return TBase::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender) \
+ { \
+ typedef SSignalDataStruct0 TBase; \
+ TBase::Send(system, sender, #name); \
+ }
+
+template <typename TData1>
+struct SSignalDataStruct1
+{
+ typedef SSignalDataStruct1<TData1> TThisType;
+ TData1 m_Data1;
+ typedef std::function<void(TData1)> TFunType;
+ SSignalDataStruct1(TData1 d1)
+ : m_Data1(d1)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1)
+ {
+ TThisType theData(d1);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT1(name, d1) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1)> inHandler) \
+ { \
+ typedef SSignalDataStruct1<d1> TBase; \
+ return TBase::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg) \
+ { \
+ typedef SSignalDataStruct1<d1> TBase; \
+ TBase::Send(system, sender, #name, arg); \
+ }
+
+template <typename TData1, typename TData2>
+struct SSignalDataStruct2
+{
+ typedef SSignalDataStruct2<TData1, TData2> TThisType;
+ typedef std::function<void(TData1, TData2)> TFunType;
+ TData1 m_Data1;
+ TData2 m_Data2;
+ SSignalDataStruct2(TData1 d1, TData2 d2)
+ : m_Data1(d1)
+ , m_Data2(d2)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1,
+ const TData2 &d2)
+ {
+ TThisType theData(d1, d2);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1, theData->m_Data2);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT2(name, d1, d2) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2)> inHandler) \
+ { \
+ return SSignalDataStruct2<d1, d2>::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2) \
+ { \
+ SSignalDataStruct2<d1, d2>::Send(system, sender, #name, arg1, arg2); \
+ }
+
+template <typename TData1, typename TData2, typename TData3>
+struct SSignalDataStruct3
+{
+ typedef SSignalDataStruct3<TData1, TData2, TData3> TThisType;
+ typedef std::function<void(TData1, TData2, TData3)> TFunType;
+ TData1 m_Data1;
+ TData2 m_Data2;
+ TData3 m_Data3;
+ SSignalDataStruct3(const TData1 &d1, const TData2 &d2, const TData3 &d3)
+ : m_Data1(d1)
+ , m_Data2(d2)
+ , m_Data3(d3)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1,
+ const TData2 &d2, const TData3 &d3)
+ {
+ TThisType theData(d1, d2, d3);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1, theData->m_Data2, theData->m_Data2);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT3(name, d1, d2, d3) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2, d3)> inHandler) \
+ { \
+ return SSignalDataStruct3<d1, d2, d3>::AddListener(inSystem, inSender, #name, inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \
+ const d3 &arg3) \
+ { \
+ SSignalDataStruct3<d1, d2, d3>::Send(system, sender, #name, arg1, arg2, arg3); \
+ }
+
+template <typename TData1, typename TData2, typename TData3, typename TData4>
+struct SSignalDataStruct4
+{
+ typedef SSignalDataStruct4<TData1, TData2, TData3, TData4> TThisType;
+ typedef std::function<void(TData1, TData2, TData3, TData4)> TFunType;
+ TData1 m_Data1;
+ TData2 m_Data2;
+ TData3 m_Data3;
+ TData4 m_Data4;
+ SSignalDataStruct4(const TData1 &d1, const TData2 &d2, const TData3 &d3, const TData4 &d4)
+ : m_Data1(d1)
+ , m_Data2(d2)
+ , m_Data3(d3)
+ , m_Data4(d4)
+ {
+ }
+ static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1,
+ const TData2 &d2, const TData3 &d3, const TData4 &d4)
+ {
+ TThisType theData(d1, d2, d3, d4);
+ system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType));
+ }
+
+ static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize,
+ TFunType inHandler)
+ {
+ if (inDataSize == sizeof(TThisType)) {
+ const TThisType *theData = reinterpret_cast<const TThisType *>(inData);
+ inHandler(theData->m_Data1, theData->m_Data2, theData->m_Data2, theData->m_Data4);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler)
+ {
+ return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, inHandler);
+ }
+
+ static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender,
+ const char *inName, TFunType inHandler)
+ {
+ return inSystem.AddListener(inSender, inName, CreateHandler(inHandler));
+ }
+};
+
+#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT4(name, d1, d2, d3, d4) \
+ std::shared_ptr<ISignalConnection> Sig##name::AddListener( \
+ ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2, d3, d4)> inHandler) \
+ { \
+ return SSignalDataStruct4<d1, d2, d3, d4>::AddListener(inSystem, inSender, #name, \
+ inHandler); \
+ } \
+ void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \
+ const d3 &arg3, const d4 &arg4) \
+ { \
+ SSignalDataStruct4<d1, d2, d3, d4>::Send(system, sender, #name, arg1, arg2, arg3, arg4); \
+ }
+}
+#endif
diff --git a/src/dm/systems/Qt3DSDMSignalStructs.h b/src/dm/systems/Qt3DSDMSignalStructs.h
new file mode 100644
index 0000000..86c09fd
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSignalStructs.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SIGNAL_STRUCTS_H
+#define QT3DSDM_SIGNAL_STRUCTS_H
+#include "Qt3DSDMSignalSystem.h"
+// Helper structs for signals of different arity.
+namespace qt3dsdm {
+// Helper defines to create static tables of signals
+// Macros with the same number of args but with 'declare' replaced by 'define
+// are available in UICDMSignalStructImpl.h. You will need to place these somewhere but
+// they rely on std::bind so I don't place them here.
+#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT0(name) \
+ struct Sig##name \
+ { \
+ static std::shared_ptr<ISignalConnection> \
+ AddListener(ISignalSystem &inSystem, void *inSender, std::function<void()> inHandler); \
+ static void Send(ISignalSystem &system, void *sender); \
+ };
+
+// Helper defines to create static tables of signals
+#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT1(name, d1) \
+ struct Sig##name \
+ { \
+ static std::shared_ptr<ISignalConnection> \
+ AddListener(ISignalSystem &inSystem, void *inSender, std::function<void(d1)> inHandler); \
+ static void Send(ISignalSystem &system, void *sender, const d1 &arg); \
+ };
+
+// Helper defines to create static tables of signals
+#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT2(name, d1, d2) \
+ struct Sig##name \
+ { \
+ static std::shared_ptr<ISignalConnection> \
+ AddListener(ISignalSystem &inSystem, void *inSender, \
+ std::function<void(d1, d2)> inHandler); \
+ static void Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2); \
+ };
+
+// Helper defines to create static tables of signals
+#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT3(name, d1, d2, d3) \
+ struct Sig##name \
+ { \
+ static std::shared_ptr<ISignalConnection> \
+ AddListener(ISignalSystem &inSystem, void *inSender, \
+ std::function<void(d1, d2, d3)> inHandler); \
+ static void Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \
+ const d3 &arg3); \
+ };
+
+// Helper defines to create static tables of signals
+#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT4(name, d1, d2, d3, d4) \
+ struct Sig##name \
+ { \
+ static std::shared_ptr<ISignalConnection> \
+ AddListener(ISignalSystem &inSystem, void *inSender, \
+ std::function<void(d1, d2, d3, d4)> inHandler); \
+ static void Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \
+ const d3 &arg3, const d4 &arg4); \
+ };
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMSignalSystem.cpp b/src/dm/systems/Qt3DSDMSignalSystem.cpp
new file mode 100644
index 0000000..37d0200
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSignalSystem.cpp
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMSignalSystem.h"
+#include "EASTL/hash_map.h"
+
+using namespace qt3dsdm;
+
+namespace {
+
+struct SSignalListener;
+class ISignalSystemImpl
+{
+public:
+ virtual ~ISignalSystemImpl() {}
+ virtual void RemoveListener(SSignalListener &inListener) = 0;
+};
+
+struct SSignalSystemKey
+{
+ void *m_Sender;
+ const char *m_SignalName;
+ SSignalSystemKey(void *inSender, const char *inSigName, IStringTable &inStrTable)
+ : m_Sender(inSender)
+ , m_SignalName(inStrTable.GetNarrowStr(inSigName))
+ {
+ }
+ SSignalSystemKey(const SSignalSystemKey &inOther)
+ : m_Sender(inOther.m_Sender)
+ , m_SignalName(inOther.m_SignalName)
+ {
+ }
+
+ SSignalSystemKey &operator=(const SSignalSystemKey &inOther)
+ {
+ if (this != &inOther) {
+ m_Sender = inOther.m_Sender;
+ m_SignalName = inOther.m_SignalName;
+ }
+ return *this;
+ }
+
+ bool operator==(const SSignalSystemKey &inOther) const
+ {
+ return m_Sender == inOther.m_Sender && m_SignalName == inOther.m_SignalName;
+ }
+};
+
+struct SSignalListener : ISignalConnection
+{
+ shared_ptr<ISignalSystemImpl> m_SignalSystem;
+ TGenericSignalHandlerFunc m_Handler;
+ SSignalSystemKey m_Key;
+ SSignalListener(shared_ptr<ISignalSystemImpl> inSystem, TGenericSignalHandlerFunc inHandler,
+ SSignalSystemKey inKey)
+ : m_SignalSystem(inSystem)
+ , m_Handler(inHandler)
+ , m_Key(inKey)
+ {
+ }
+ ~SSignalListener() { m_SignalSystem->RemoveListener(*this); }
+ void Signal(void *inSender, const char *inName, const char *inData, size_t inDataSize)
+ {
+ m_Handler(inSender, inName, inData, inDataSize);
+ }
+};
+
+typedef eastl::vector<SSignalListener *> TSignalListenerPtrList;
+}
+
+namespace eastl {
+template <>
+struct hash<SSignalSystemKey>
+{
+ size_t operator()(const SSignalSystemKey &inKey) const
+ {
+ return hash<void *>()(inKey.m_Sender) ^ hash<const char *>()(inKey.m_SignalName);
+ }
+};
+}
+
+namespace {
+typedef eastl::hash_map<SSignalSystemKey, TSignalListenerPtrList> TSignalHandlerMap;
+
+struct SSignalSystemImpl : public ISignalSystemImpl
+{
+ TSignalHandlerMap m_SignalHandlers;
+ shared_ptr<IStringTable> m_StringTable;
+ SSignalSystemImpl(shared_ptr<IStringTable> inStrTable)
+ : m_StringTable(inStrTable)
+ {
+ }
+
+ TSignalListenerPtrList *FindListenerList(const SSignalSystemKey &inKey)
+ {
+ TSignalHandlerMap::iterator theIter = m_SignalHandlers.find(inKey);
+ if (theIter != m_SignalHandlers.end())
+ return &theIter->second;
+ return NULL;
+ }
+
+ void Signal(void *inSender, const char *inName, const char *inData, size_t inDataSize)
+ {
+ TSignalListenerPtrList *theSignals =
+ FindListenerList(SSignalSystemKey(inSender, inName, *m_StringTable));
+ if (theSignals) {
+ for (eastl_size_t idx = 0, end = theSignals->size(); idx < end; ++idx) {
+ (*theSignals)[idx]->Signal(inSender, inName, inData, inDataSize);
+ }
+ }
+ }
+
+ void RemoveListener(SSignalListener &inListener) override
+ {
+ TSignalListenerPtrList *theSignals = FindListenerList(inListener.m_Key);
+ if (theSignals) {
+ // If we could allow unordered access then this could potentially be a lot faster.
+ TSignalListenerPtrList::iterator theFind =
+ eastl::find(theSignals->begin(), theSignals->end(), &inListener);
+ if (theFind != theSignals->end())
+ theSignals->erase(theFind);
+ }
+ }
+};
+
+struct SSignalSystem : public ISignalSystem
+{
+ shared_ptr<SSignalSystemImpl> m_System;
+ SSignalSystem(shared_ptr<IStringTable> inStrTable)
+ {
+ m_System = std::make_shared<SSignalSystemImpl>(inStrTable);
+ }
+
+ shared_ptr<ISignalConnection> AddListener(void *inSender, const char *inName,
+ TGenericSignalHandlerFunc inFunc) override
+ {
+ SSignalSystemKey theKey(inSender, inName, *m_System->m_StringTable);
+ TSignalHandlerMap::iterator theIter =
+ m_System->m_SignalHandlers.insert(eastl::make_pair(theKey, TSignalListenerPtrList()))
+ .first;
+ TSignalListenerPtrList &theList(theIter->second);
+ shared_ptr<SSignalListener> theSender =
+ std::make_shared<SSignalListener>(m_System, inFunc, theKey);
+ theList.push_back(theSender.get());
+ return theSender;
+ }
+
+ void Signal(void *inSender, const char *inName, const char *inData, size_t inDataSize) override
+ {
+ m_System->Signal(inSender, inName, inData, inDataSize);
+ }
+};
+}
+
+shared_ptr<ISignalSystem> ISignalSystem::CreateSignalSystem(shared_ptr<IStringTable> inStrTable)
+{
+ return std::make_shared<SSignalSystem>(inStrTable);
+}
diff --git a/src/dm/systems/Qt3DSDMSignalSystem.h b/src/dm/systems/Qt3DSDMSignalSystem.h
new file mode 100644
index 0000000..cd80010
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSignalSystem.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SIGNAL_SYSTEM_H
+#define QT3DSDM_SIGNAL_SYSTEM_H
+#include <functional>
+#include "Qt3DSDMSignals.h"
+
+namespace qt3dsdm {
+typedef std::function<void(void *, const char *, const char *, size_t)> TGenericSignalHandlerFunc;
+
+class ISignalSystem
+{
+protected:
+ virtual ~ISignalSystem() {}
+public:
+ virtual shared_ptr<ISignalConnection> AddListener(void *inSender, const char *inName,
+ TGenericSignalHandlerFunc inFunc) = 0;
+ virtual void Signal(void *inSender, const char *inName, const char *inData,
+ size_t inDataSize) = 0;
+
+ static shared_ptr<ISignalSystem> CreateSignalSystem(shared_ptr<IStringTable> inStrTable);
+};
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMSignals.h b/src/dm/systems/Qt3DSDMSignals.h
new file mode 100644
index 0000000..57b9659
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSignals.h
@@ -0,0 +1,611 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SIGNALS_H
+#define QT3DSDM_SIGNALS_H
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMAnimation.h"
+#include "Qt3DSDMActionInfo.h"
+#include "Qt3DSDMValue.h"
+#include <functional>
+#include <string>
+
+namespace qt3dsdm {
+
+class ISignalConnection
+{
+public:
+ virtual ~ISignalConnection() {}
+};
+
+class ISignalItem
+{
+public:
+ virtual ~ISignalItem() {}
+};
+
+typedef std::shared_ptr<ISignalItem> TSignalItemPtr;
+
+typedef std::shared_ptr<ISignalConnection> TSignalConnectionPtr;
+
+class QtSignalConnection : public ISignalConnection
+{
+ Q_DISABLE_COPY(QtSignalConnection)
+private:
+ QMetaObject::Connection m_connection;
+public:
+ QtSignalConnection(const QMetaObject::Connection &inConnection)
+ : m_connection(inConnection)
+ {
+ }
+ ~QtSignalConnection() override
+ {
+ QObject::disconnect(m_connection);
+ }
+};
+
+
+class IInstancePropertyCoreSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr ConnectInstancePropertyValue(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)>
+ &inCallback) = 0;
+};
+
+class IInstancePropertyCoreSignalSender : public ISignalItem
+{
+public:
+ virtual void SignalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+};
+
+class IDataCoreSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr
+ ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectBeforeInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstanceDerived(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstanceParentRemoved(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectPropertyAdded(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ TCharPtr, DataModelDataType::Value)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectPropertyRemoved(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr,
+ DataModelDataType::Value)> &inCallback) = 0;
+};
+
+class IDataCoreSignalSender : public ISignalItem
+{
+public:
+ virtual void SignalInstanceCreated(Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SignalBeforeInstanceDeleted(Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SignalInstanceDeleted(Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SignalInstanceDerived(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) = 0;
+ virtual void SignalInstanceParentRemoved(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) = 0;
+ virtual void SignalPropertyAdded(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, TCharPtr inName,
+ DataModelDataType::Value inDataType) = 0;
+ virtual void SignalPropertyRemoved(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, TCharPtr inName,
+ DataModelDataType::Value inDataType) = 0;
+};
+
+class ISlideCoreSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr
+ ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectBeforeSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectSlideDerived(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstancePropertyValueSet(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstancePropertyValueRemoved(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectSlideTimeChanged(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+};
+
+class ISlideCoreSignalSender : public ISignalItem
+{
+public:
+ virtual void SendSlideCreated(Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendBeforeSlideDeleted(Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendSlideDerived(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent,
+ int inIndex) = 0;
+ virtual void SendPropertyValueSet(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inParent, const SValue &inValue) = 0;
+ // This gives clients a chance to override a property value the first time it is set on a slide
+ virtual void SendPropertyValueRemoved(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inParent, const SValue &inValue) = 0;
+ virtual void SendSlideTimeChanged(Qt3DSDMSlideHandle inSlide) = 0;
+};
+
+class ISlideGraphCoreSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr ConnectGraphCreated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectGraphDeleted(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstanceAssociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstanceDissociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectGraphActiveSlide(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) = 0;
+};
+
+class ISlideGraphCoreSignalSender : public ISignalItem
+{
+public:
+ virtual void SendGraphCreated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendGraphDeleted(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendInstanceAssociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SendInstanceDissociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SendGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph,
+ Qt3DSDMSlideHandle inSlide) = 0;
+};
+
+class IAnimationCoreSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr ConnectAnimationCreated(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectBeforeAnimationDeleted(
+ const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectAnimationDeleted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectKeyframeInserted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectBeforeKeyframeErased(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectKeyframeErased(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectBeforeAllKeyframesErased(
+ const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectKeyframeUpdated(
+ const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectFirstKeyframeDynamicSet(
+ const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) = 0;
+};
+
+class IAnimationCoreSignalSender : public ISignalItem
+{
+public:
+ virtual void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType) = 0;
+ virtual void SendBeforeAnimationDeleted(Qt3DSDMAnimationHandle inAnimation) = 0;
+ virtual void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType) = 0;
+ virtual void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0;
+ virtual void SendBeforeKeyframeErased(Qt3DSDMKeyframeHandle inAnimation) = 0;
+ virtual void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0;
+ virtual void SendBeforeAllKeyframesErased(Qt3DSDMAnimationHandle inAnimation) = 0;
+ virtual void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0;
+ virtual void SendFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation,
+ bool inKeyframeDynamic) = 0;
+};
+
+class IActionCoreSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr ConnectTriggerObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectTargetObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectEventSet(
+ const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectHandlerSet(
+ const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectHandlerArgumentAdded(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectHandlerArgumentRemoved(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectHandlerArgumentValueSet(
+ const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback) = 0;
+};
+
+class IActionCoreSignalSender : public ISignalItem
+{
+public:
+ virtual void SendTriggerObjectSet(Qt3DSDMActionHandle inAction,
+ SObjectRefType &inTriggerObject) = 0;
+ virtual void SendTargetObjectSet(Qt3DSDMActionHandle inAction,
+ SObjectRefType &inTargetObject) = 0;
+ virtual void SendEventSet(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) = 0;
+ virtual void SendHandlerSet(Qt3DSDMActionHandle inAction, const wstring &inActionName) = 0;
+
+ virtual void SendHandlerArgumentAdded(Qt3DSDMActionHandle inAction,
+ Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const TCharStr &inName, HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType) = 0;
+ virtual void SendHandlerArgumentRemoved(Qt3DSDMActionHandle inAction,
+ Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const TCharStr &inName, HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType) = 0;
+ virtual void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const SValue &inValue) = 0;
+};
+
+class IActionSystemSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr ConnectActionCreated(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectActionDeleted(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) = 0;
+};
+
+class IActionSystemSignalSender : public ISignalItem
+{
+public:
+ virtual void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+};
+
+class ICustomPropCoreSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr ConnectCustomPropertyCreated(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomPropertyDeleted(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomPropertyModified(
+ const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectCustomEventCreated(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomEventDeleted(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectCustomHandlerCreated(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerDeleted(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectCustomHandlerParamCreated(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerParamDeleted(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerParamModified(
+ const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectCustomReferencesModified(
+ const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) = 0;
+};
+
+class ICustomPropCoreSignalSender : public ISignalItem
+{
+public:
+ virtual void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) = 0;
+
+ virtual void SendCustomEventCreated(Qt3DSDMEventHandle inEvent,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomEventModified(Qt3DSDMEventHandle inEvent) = 0;
+
+ virtual void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) = 0;
+
+ virtual void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) = 0;
+ virtual void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) = 0;
+ virtual void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) = 0;
+
+ virtual void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner,
+ const TCharStr &inString) = 0;
+};
+
+class ISlideSystemSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr
+ ConnectMasterCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectMasterDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectSlideCreated(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectSlideDeleted(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectSlideRearranged(
+ const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstanceAssociated(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectInstanceDissociated(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectPropertyLinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectPropertyUnlinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectActiveSlide(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle, Qt3DSDMSlideHandle)>
+ &inCallback) = 0;
+};
+
+class ISlideSystemSignalSender : public ISignalItem
+{
+public:
+ virtual void SendMasterCreated(Qt3DSDMSlideHandle inMaster) = 0;
+ virtual void SendMasterDeleted(Qt3DSDMSlideHandle inMaster) = 0;
+ virtual void SendSlideCreated(Qt3DSDMSlideHandle inMaster, int inIndex,
+ Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendSlideDeleted(Qt3DSDMSlideHandle inMaster, int inIndex,
+ Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex,
+ int inNewIndex) = 0;
+ virtual void SendInstanceAssociated(Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SendInstanceDissociated(Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex,
+ Qt3DSDMSlideHandle inOldSlide, Qt3DSDMSlideHandle inNewSlide) = 0;
+};
+
+class IStudioFullSystemSignalProvider : public ISignalItem
+{
+public:
+ virtual TSignalConnectionPtr
+ ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectSlideRearranged(
+ const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectBeginComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectPropertyLinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectPropertyUnlinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectActiveSlide(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr
+ ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr
+ ConnectAnimationCreated(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectKeyframeInserted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectKeyframeErased(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectKeyframeUpdated(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectFirstKeyframeDynamicSet(
+ const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectInstancePropertyValue(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectActionCreated(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectActionDeleted(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectTriggerObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectTargetObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectEventSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectHandlerArgumentValueSet(
+ const std::function<void(Qt3DSDMHandlerArgHandle)> &inCallback) = 0;
+
+ virtual TSignalConnectionPtr ConnectCustomPropertyCreated(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomPropertyDeleted(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomPropertyModified(
+ const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomEventCreated(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomEventDeleted(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerCreated(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerDeleted(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr
+ ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerParamCreated(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerParamDeleted(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomHandlerParamModified(
+ const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectCustomReferencesModified(
+ const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) = 0;
+ virtual TSignalConnectionPtr ConnectControlledToggled(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) = 0;
+};
+
+class IStudioFullSystemSignalSender : public ISignalItem
+{
+public:
+ virtual void SendSlideCreated(Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) = 0;
+ virtual void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex,
+ int inNewIndex) = 0;
+ virtual void SendComponentSeconds(Qt3DSDMSlideHandle inMaster) = 0;
+ virtual void SendBeginComponentSeconds(Qt3DSDMSlideHandle inMaster) = 0;
+ virtual void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex,
+ Qt3DSDMSlideHandle inSlide) = 0;
+
+ virtual void SendInstanceCreated(Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void SendInstanceDeleted(Qt3DSDMInstanceHandle inInstance) = 0;
+
+ virtual void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe) = 0;
+ virtual void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe) = 0;
+ virtual void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe) = 0;
+ virtual void SendConnectFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation,
+ bool inDynamic) = 0;
+
+ virtual void SendInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+
+ virtual void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendTriggerObjectSet(Qt3DSDMActionHandle inAction) = 0;
+ virtual void SendTargetObjectSet(Qt3DSDMActionHandle inAction) = 0;
+ virtual void SendEventSet(Qt3DSDMActionHandle inAction) = 0;
+ virtual void SendHandlerSet(Qt3DSDMActionHandle inAction) = 0;
+ virtual void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument) = 0;
+
+ virtual void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) = 0;
+ virtual void SendCustomEventCreated(Qt3DSDMEventHandle inEvent,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomEventModified(Qt3DSDMEventHandle inEvent) = 0;
+ virtual void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) = 0;
+ virtual void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) = 0;
+ virtual void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) = 0;
+ virtual void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) = 0;
+ virtual void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) = 0;
+ virtual void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner,
+ const TCharStr &inString) = 0;
+ virtual void SendControlledToggled(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+};
+
+// Use this if you want to register for only a specific instance or specific property
+template <typename TTransaction>
+inline void MaybackCallbackInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ Qt3DSDMInstanceHandle inDesiredInstance,
+ Qt3DSDMPropertyHandle inDesiredProperty,
+ TTransaction inCallback)
+{
+ if ((!inDesiredInstance.Valid() || (inDesiredInstance == inInstance))
+ && (!inDesiredProperty.Valid() || (inDesiredProperty == inProperty)))
+ inCallback(inInstance, inProperty);
+}
+
+void SetDataModelSignalsEnabled(bool inEnabled);
+// Defaults to true
+bool AreDataModelSignalsEnabled();
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMSlideCore.h b/src/dm/systems/Qt3DSDMSlideCore.h
new file mode 100644
index 0000000..8216b01
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSlideCore.h
@@ -0,0 +1,239 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SLIDE_CORE_H
+#define QT3DSDM_SLIDE_CORE_H
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMDataTypes.h"
+#include "HandleSystemBase.h"
+#include "Qt3DSDMStringTable.h"
+#include "Qt3DSDMDataCore.h"
+
+namespace qt3dsdm {
+typedef std::pair<Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle> TInstancePropertyPair;
+typedef std::vector<TInstancePropertyPair> TInstancePropertyPairList;
+
+// instance,property,value
+typedef std::tuple<Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, SValue> TSlideEntry;
+typedef std::vector<TSlideEntry> TSlideEntryList;
+
+class ISlideCore : public IHandleBase
+{
+public:
+ virtual ~ISlideCore() {}
+ virtual TStringTablePtr GetStringTablePtr() const = 0;
+ virtual IStringTable &GetStringTable() const = 0;
+ //===============================================================
+ // Slide lifetime management
+ //===============================================================
+ /**
+ * Create a new slide. Slides must have an instance allocated for them.
+ */
+ virtual Qt3DSDMSlideHandle CreateSlide(Qt3DSDMInstanceHandle inInstance) = 0;
+ /**
+ * Return the instance that was allocated for this slide.
+ */
+ virtual Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const = 0;
+ /**
+ * Reverse lookup into the slide system so you can match slides to instances.
+ */
+ virtual Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const = 0;
+ /**
+ * Delete a given slide. This recursively deletes all children. All associated instances
+ * are returned in the outInstances list so the caller can further delete them.
+ * The deleted object is removed from the parent's list of children. Child objects are
+ * also deleted.
+ */
+ virtual void DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) = 0;
+ /**
+ * Return all of the slides in the core.
+ */
+ virtual void GetSlides(TSlideHandleList &outSlides) const = 0;
+
+ virtual float GetSlideTime(Qt3DSDMSlideHandle inSlide) const = 0;
+
+ virtual void SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) = 0;
+
+ //===============================================================
+ // Slide derivation
+ //===============================================================
+ /**
+ * Derive a slide from another slide. This simply provides an alternate path for property
+ *lookup
+ * if it isn't found on this slide. OK for parent to be an invalid handle. It is also fine
+ * for the slide to have a valid parent; all involved parties are notified and updated.
+ */
+ virtual void DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent,
+ int inIndex = -1) = 0;
+ /**
+ * Return the parent slide for this slide. Invalid handle if no parent.
+ */
+ virtual Qt3DSDMSlideHandle GetParentSlide(Qt3DSDMSlideHandle inSlide) const = 0;
+ /**
+ * Return a list of derived slides for this slide.
+ */
+ virtual void GetChildSlides(Qt3DSDMSlideHandle inSlide, TSlideHandleList &outChildren) const = 0;
+
+ /**
+ * Return the index of this child. Exception if child isn't found
+ */
+ virtual int GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const = 0;
+ //===============================================================
+
+ //===============================================================
+ // Instance Property Access
+ //===============================================================
+ /**
+ * Get this property from this instance in this slide. Includes lookup into any parent slides.
+ */
+ virtual bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const = 0;
+
+ /**
+ * Set this property. If this slide doesn't already contain an entry
+ *(PushPropertyValueToChildren)
+ * then this will attempt to set it on the parent slide. If it does not have a parent slide or
+ *if
+ * it already has a property entry then it sets the value locally.
+ */
+ virtual void SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+
+ /**
+ * Set this property on this slide; do not try to set on parent slide under any circumstances.
+ *Always adds entry to this slide.
+ */
+ virtual void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+
+ /**
+ * Set a property value on an instance on all slides.
+ */
+ virtual void forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+
+ /**
+ * Return the value for this property if it exists on this slide.
+ */
+ virtual bool GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const = 0;
+
+ /**
+ * Return all of the properties for this instance stored on this slide.
+ */
+ virtual void GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleValuePairList &outValues) = 0;
+
+ /**
+ * Get all of the property entries for the slide.
+ */
+ virtual void GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide,
+ TSlideEntryList &outEntries) const = 0;
+
+ /**
+ * Set this property value on all my child slides.
+ */
+ virtual void PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+
+ /**
+ * If any property entries in slide1 intersect (have matching instance and property handles)
+ *with slide 2,
+ * add said property entry from slide1 to outEntries;
+ */
+ virtual void GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2,
+ TSlideEntryList &outEntries) const = 0;
+
+ /**
+ * Take the intersection of the properties of slide1 and slide2 and push values from slide1 to
+ *destination.
+ * Used for new slide operations.
+ */
+ virtual void PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2,
+ Qt3DSDMSlideHandle inDestination) = 0;
+
+ /**
+ * Ensure the children of this parent item do not contain entries for a given property.
+ */
+ virtual void ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+
+ /**
+ * Delete all property entries related to this instance.
+ */
+ virtual void DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle) = 0;
+
+ /**
+ * Delete all of the property entries related to this property
+ */
+ virtual void DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) = 0;
+
+ /**
+ * Delete all property entries that have an instance in the instances list *and*
+ * a property in the properties list.
+ */
+ virtual void DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties) = 0;
+
+ /**
+ * Does this slide contain this property?
+ */
+ virtual bool ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+
+ /**
+ * Copy the properties from the source slide and source instance to the destination slide and
+ *destination
+ * instance.
+ */
+ virtual void CopyProperties(Qt3DSDMSlideHandle inSourceSlide,
+ Qt3DSDMInstanceHandle inSourceInstance,
+ Qt3DSDMSlideHandle inDestSlide,
+ Qt3DSDMInstanceHandle inDestInstance) = 0;
+
+ virtual bool IsSlide(Qt3DSDMSlideHandle inSlide) const = 0;
+};
+
+typedef std::shared_ptr<ISlideCore> TSlideCorePtr;
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMSlideGraphCore.h b/src/dm/systems/Qt3DSDMSlideGraphCore.h
new file mode 100644
index 0000000..34c04e1
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSlideGraphCore.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SLIDE_GRAPH_CORE_H
+#define QT3DSDM_SLIDE_GRAPH_CORE_H
+
+#include "Qt3DSDMHandles.h"
+#include "HandleSystemBase.h"
+
+namespace qt3dsdm {
+
+typedef std::pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle> TSlideInstancePair;
+typedef std::vector<TSlideInstancePair> TSlideInstancePairList;
+typedef std::pair<Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle> TGraphSlidePair;
+
+/**
+ * Binding instances to slide graphs.
+ */
+class ISlideGraphCore : public IHandleBase
+{
+public:
+ virtual ~ISlideGraphCore() {}
+
+ /**
+ * A slide graph is used to associate a set of instances to a set of slides.
+ * This allows rapid lookup of properties, as an implementation of these.
+ * There are a few assumptions here. First is that a given slide can be a member
+ * of one and only one graph (i.e. it does not derive from another slide outside of the graph).
+ * Second is that an instance is a member of one and only one graph.
+ */
+ virtual Qt3DSDMSlideGraphHandle CreateSlideGraph(Qt3DSDMSlideHandle inRoot) = 0;
+ virtual Qt3DSDMSlideHandle GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const = 0;
+ virtual Qt3DSDMSlideGraphHandle GetSlideGraph(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual void GetSlideGraphs(TSlideGraphHandleList &outGraphs) const = 0;
+ virtual void DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) = 0;
+
+ /**
+ * Associate a given instance handle with a given graph. This will ensure that property
+ *lookups
+ * will travel through this graph before they hit the main data core. Instances may be
+ *associated
+ * with a sub-slide of a given graph, not just the root. An instance associated with the root
+ *is
+ * implicitly associated with any root-derived slides.
+ */
+ virtual void AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual void GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph,
+ TSlideInstancePairList &outAssociations) const = 0;
+ virtual TGraphSlidePair GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const = 0;
+ virtual void DissociateInstance(Qt3DSDMInstanceHandle inInstance) = 0;
+
+ /**
+ * All graphs always have an active slide. This is assumed to be the root right off the bat.
+ */
+ virtual void SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) = 0;
+ virtual Qt3DSDMSlideHandle GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const = 0;
+};
+
+typedef std::shared_ptr<ISlideGraphCore> TSlideGraphCorePtr;
+}
+
+#endif \ No newline at end of file
diff --git a/src/dm/systems/Qt3DSDMSlides.h b/src/dm/systems/Qt3DSDMSlides.h
new file mode 100644
index 0000000..aa7c27c
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMSlides.h
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_SLIDES_H
+#define QT3DSDM_SLIDES_H
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMSlideCore.h"
+
+namespace qt3dsdm {
+/**
+ * Some properties point to instances which act like extended properties.
+ * An example of this would be the images on materials. If a material has an
+ * image in one of its slots, that image should be duplicated upon property unlink
+ * and deleted upon property link. It (and its animations) should be duplicated upon
+ * create slide and deleted upon slide destruction such that the concept that the image
+ * is really a property on the material stays sound.
+ */
+class IPropertyInstanceInfo
+{
+public:
+ virtual ~IPropertyInstanceInfo() {}
+
+ /**
+ * Return the instance that relates to this property
+ */
+ virtual Qt3DSDMInstanceHandle GetInstanceForProperty(const SValue &inValue) = 0;
+
+ /**
+ * Duplicate this instance and whichever properties and animations you desire,
+ * returning a new data model value that will be set on the newly created property.
+ * Don't forget to associate the instance with a the dest slide. I doubt things
+ * will work correctly if you do not.
+ */
+ virtual SValue CreateInstanceForProperty(Qt3DSDMSlideHandle inSourceSlide,
+ Qt3DSDMSlideHandle inDestSlide,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+};
+
+typedef std::shared_ptr<IPropertyInstanceInfo> TPropertyInstanceInfoPtr;
+
+struct SInstanceSlideInformation
+{
+ // The slide associated with the instance
+ Qt3DSDMSlideHandle m_AssociatedSlide;
+ // The master slide of the component.
+ Qt3DSDMSlideHandle m_MasterSlide;
+ // The active slide of the component.
+ Qt3DSDMSlideHandle m_ActiveSlide;
+ // The current milliseconds of the active slide on the component.
+ long m_ComponentMilliseconds;
+
+ SInstanceSlideInformation()
+ : m_ComponentMilliseconds(0)
+ {
+ }
+ SInstanceSlideInformation(Qt3DSDMSlideHandle inAssoc, Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMSlideHandle inActive, long inMilliseconds)
+ : m_AssociatedSlide(inAssoc)
+ , m_MasterSlide(inMaster)
+ , m_ActiveSlide(inActive)
+ , m_ComponentMilliseconds(inMilliseconds)
+ {
+ }
+};
+
+class ISlideSystem
+{
+public:
+ virtual ~ISlideSystem() {}
+ virtual Qt3DSDMSlideHandle CreateMasterSlide() = 0;
+ virtual Qt3DSDMSlideHandle CreateSlide(Qt3DSDMSlideHandle inMaster, int inIndex = -1) = 0;
+ // Duplicate this slide and put it into the master's child lists at index.
+ virtual Qt3DSDMSlideHandle DuplicateSlide(Qt3DSDMSlideHandle inSourceSlide, int inDestIndex) = 0;
+ virtual Qt3DSDMSlideHandle GetMasterSlide(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual bool IsMasterSlide(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual Qt3DSDMSlideHandle GetMasterSlideByComponentGuid(SLong4 inGuid) const = 0;
+ // Indexes are 1 based. Index 0 refers to the master slide; you can't delete this.
+ virtual void DeleteSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) = 0;
+ virtual void GetSlideReferencedInstances(Qt3DSDMSlideHandle inMaster, size_t inIndex,
+ TInstanceHandleList &outReferencedInstances) = 0;
+ virtual Qt3DSDMSlideHandle GetSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) const = 0;
+ virtual void SetActiveSlide(Qt3DSDMSlideHandle inMaster, size_t inIndex) = 0;
+ virtual void RearrangeSlide(Qt3DSDMSlideHandle inMaster, size_t inOldIndex,
+ size_t inNewIndex) = 0;
+ /**
+ * Set the current component time. This object will figure out the component from the slide.
+ */
+ virtual void SetComponentSeconds(Qt3DSDMSlideHandle inSlide, float inSeconds) = 0;
+ /**
+ * Return the current time of the component
+ */
+ virtual float GetComponentSeconds(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual long GetComponentSecondsLong(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual long GetComponentSecondsLong(Qt3DSDMInstanceHandle inInstance) const = 0;
+
+ // The fastest way possible, get all of the slide information for this instance.
+ virtual SInstanceSlideInformation
+ GetInstanceSlideInformation(Qt3DSDMInstanceHandle inInstance) const = 0;
+ /**
+ * Slide count includes the master slide;
+ */
+ virtual size_t GetSlideCount(Qt3DSDMSlideHandle inMaster) const = 0;
+ /**
+ * Use the instance for storing information such as name, or the GUID of the object
+ * this slide links to.
+ */
+ virtual Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const = 0;
+ /**
+ * Reverse lookup into the slide system so you can match slides to instances.
+ */
+ virtual Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const = 0;
+ /**
+ * Slide may be either a master slide
+ */
+ virtual void AssociateInstanceWithSlide(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+ virtual Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance) const = 0;
+ virtual void GetAssociatedInstances(
+ Qt3DSDMSlideHandle inMaster,
+ std::vector<std::pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle>> &outAssociations) const = 0;
+ virtual void GetAssociatedInstances(Qt3DSDMSlideHandle inSlide,
+ TInstanceHandleList &outAssociations) const = 0;
+ virtual void LinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual void UnlinkProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+ virtual bool IsPropertyLinked(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+ virtual bool CanPropertyBeLinked(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+ virtual void GetUnionOfProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide,
+ TInstancePropertyPairList &outProperties) const = 0;
+
+ virtual bool GetSlidePropertyValue(size_t inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) = 0;
+
+ virtual void SetActiveSlide(Qt3DSDMSlideHandle inSlide) = 0;
+ virtual Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const = 0;
+
+ virtual bool SlideValid(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual int GetSlideIndex(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual int GetActiveSlideIndex(Qt3DSDMSlideHandle inMaster) const = 0;
+ virtual Qt3DSDMSlideHandle GetActiveSlide(Qt3DSDMSlideHandle inMaster) const = 0;
+ virtual Qt3DSDMInstanceHandle GetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide) const = 0;
+ virtual void SetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) = 0;
+
+ virtual Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle) = 0;
+ virtual Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) = 0;
+
+ virtual bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const = 0;
+ virtual bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const = 0;
+ virtual void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) = 0;
+
+ /**
+ * Let this object know that this property will sometimes reference another property
+ * and give an outside entity the chance to create new objects and properties when
+ * the property is unlinked and linked.
+ */
+ virtual void RegisterPropertyInstance(Qt3DSDMPropertyHandle inPropertyHandle,
+ TPropertyInstanceInfoPtr inPropertyInfo) = 0;
+};
+
+typedef std::shared_ptr<ISlideSystem> TSlideSystemPtr;
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMStringTable.cpp b/src/dm/systems/Qt3DSDMStringTable.cpp
new file mode 100644
index 0000000..58db71c
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMStringTable.cpp
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMStringTable.h"
+#include "foundation/StringTable.h"
+#include "foundation/TrackingAllocator.h"
+
+using namespace qt3dsdm;
+using namespace eastl;
+using namespace qt3ds;
+
+namespace {
+
+struct StringTableImpl : public IStringTable
+{
+ qt3ds::foundation::MallocAllocator m_MallocAllocator;
+ qt3ds::foundation::IStringTable &m_StringTable;
+ StringTableImpl()
+ : m_StringTable(qt3ds::foundation::IStringTable::CreateStringTable(m_MallocAllocator))
+ {
+ m_StringTable.addRef();
+ }
+ StringTableImpl(qt3ds::foundation::IStringTable &inStrTable)
+ : m_StringTable(inStrTable)
+ {
+ m_StringTable.addRef();
+ }
+
+ virtual ~StringTableImpl() { m_StringTable.release(); }
+ const wchar_t *RegisterStr(const wchar_t *inStr) override
+ {
+ return m_StringTable.GetWideStr(inStr);
+ }
+ const char8_t *RegisterStr(const char8_t *inStr) override
+ {
+ return m_StringTable.GetNarrowStr(inStr);
+ }
+ // Get the utf-8 or utf-(sizeof wchar_t) converted strings
+ const wchar_t *GetWideStr(const char8_t *inStr) override
+ {
+ return m_StringTable.GetWideStr(inStr);
+ }
+ const char8_t *GetNarrowStr(const wchar_t *inStr) override
+ {
+ return m_StringTable.GetNarrowStr(inStr);
+ }
+ qt3ds::foundation::IStringTable &GetRenderStringTable() override { return m_StringTable; }
+};
+}
+
+TStringTablePtr IStringTable::CreateStringTable()
+{
+ return std::make_shared<StringTableImpl>();
+}
+
+TStringTablePtr IStringTable::CreateStringTable(qt3ds::foundation::IStringTable &inStrTable)
+{
+ return std::make_shared<StringTableImpl>(std::ref(inStrTable));
+}
diff --git a/src/dm/systems/Qt3DSDMStringTable.h b/src/dm/systems/Qt3DSDMStringTable.h
new file mode 100644
index 0000000..7f1e945
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMStringTable.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_IMPORT_STRINGTABLE_H
+#define QT3DS_IMPORT_STRINGTABLE_H
+
+#include <string>
+#include <EABase/eabase.h>
+#include "foundation/Qt3DSPreprocessor.h"
+
+namespace qt3ds {
+namespace foundation {
+ class IStringTable;
+}
+}
+
+namespace qt3dsdm {
+
+class QT3DS_AUTOTEST_EXPORT IStringTable
+{
+public:
+ virtual ~IStringTable() {}
+
+ virtual const wchar_t *RegisterStr(const wchar_t *inStr) = 0;
+ virtual const char8_t *RegisterStr(const char8_t *inStr) = 0;
+ // Get the utf-8 or utf-(sizeof wchar_t) converted strings
+ virtual const wchar_t *GetWideStr(const char8_t *inStr) = 0;
+ virtual const char8_t *GetNarrowStr(const wchar_t *inStr) = 0;
+
+ const wchar_t *GetWideStr(const wchar_t *inStr) { return RegisterStr(inStr); }
+ const char8_t *GetNarrowStr(const char8_t *inStr) { return RegisterStr(inStr); }
+
+ const wchar_t *RegisterStr(const std::wstring &inStr) { return RegisterStr(inStr.c_str()); }
+ const char8_t *RegisterStr(const std::string &inStr) { return RegisterStr(inStr.c_str()); }
+
+ virtual qt3ds::foundation::IStringTable &GetRenderStringTable() = 0;
+
+ static std::shared_ptr<IStringTable> CreateStringTable();
+ static std::shared_ptr<IStringTable>
+ CreateStringTable(qt3ds::foundation::IStringTable &inStrTable);
+};
+typedef std::shared_ptr<IStringTable> TStringTablePtr;
+};
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMTestOps.h b/src/dm/systems/Qt3DSDMTestOps.h
new file mode 100644
index 0000000..ac43eaf
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMTestOps.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_OPS_H
+#define QT3DSDM_OPS_H
+
+namespace qt3dsdm {
+inline const TCharStr &GetPropertyName(const IDataCore &inModel, Qt3DSDMPropertyHandle inProperty)
+{
+ return inModel.GetProperty(inProperty).m_Name;
+}
+
+inline bool PropertyNameMatches(const IDataCore &inModel, const TCharStr &inName,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ return inName == GetPropertyName(inModel, inProperty);
+}
+
+inline const Qt3DSDMPropertyHandle
+GetPropertyByName(const IDataCore &inModel, Qt3DSDMInstanceHandle inInstance, const TCharStr &inName)
+{
+ using namespace std;
+ TPropertyHandleList properties;
+ inModel.GetAggregateInstanceProperties(inInstance, properties);
+ TPropertyHandleList::iterator theProp =
+ std::find_if(properties.begin(), properties.end(),
+ std::bind(PropertyNameMatches, std::ref(inModel), inName,
+ std::placeholders::_1));
+ if (theProp != properties.end())
+ return *theProp;
+ return 0;
+}
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMTransactions.h b/src/dm/systems/Qt3DSDMTransactions.h
new file mode 100644
index 0000000..f6ed3da
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMTransactions.h
@@ -0,0 +1,244 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_TRANSACTIONS_H
+#define QT3DSDM_TRANSACTIONS_H
+#include "Qt3DSDMDataTypes.h"
+#include "StandardExtensions.h"
+#include <functional>
+
+namespace qt3dsdm {
+
+/**
+ * Transaction is some small entity that changes data. A transaction consumer is expected to
+ *execute
+ * a list of these either forward on a "redo" command or backwards on an "undo" command.
+ *
+ * Transactions merely change data. There are two other lists on consumers for "do"
+ *notifications
+ * and "undo" notifications. These lists control the events sent out to the UI about what
+ *actually
+ * changed in the model. Note that undo/do notifications may be more clever than simple
+ *send-signal
+ * commands in that they may check if an object is alive or not before sending a notification
+ *and may
+ * decline to send a notification if the target object is not currently alive.
+ *
+ * Currently the undo/redo system first executes all of the transactions and then sends the
+ *appropriate
+ * notifications. This means that when the UI receives any notification, the model is in its
+ *most-updated
+ * state.
+ */
+class ITransaction
+{
+public:
+ const char *m_File;
+ int m_Line;
+
+ ITransaction(const char *inFile, int inLine)
+ : m_File(inFile)
+ , m_Line(inLine)
+ {
+ }
+ virtual ~ITransaction() {}
+ virtual void Do() = 0;
+ virtual void Undo() = 0;
+};
+
+/**
+ * Merging allows us to efficient handle situations where the users are continuously
+ * modifying an object (or set of objects). These are referred to as live-update
+ * scenarios. Dragging an object in the 3d view or dragging keyframes in the timeline
+ * would be an example of live-update scenarios.
+ */
+template <typename TValueType>
+class IMergeableTransaction
+{
+public:
+ virtual ~IMergeableTransaction() {}
+ // Called when a new value has arrived and we would rather update
+ // an existing representation rather than create a new one.
+ virtual void Update(const TValueType &inValue) = 0;
+};
+
+/**
+ * A consumer is an object that records the transaction. This interface keeps the
+ * base producer objects from binding to how the transaction or the notifications
+ * are stored.
+ */
+class ITransactionConsumer
+{
+public:
+ virtual ~ITransactionConsumer() {}
+ virtual void OnTransaction(std::shared_ptr<ITransaction> inTransaction) = 0;
+ // Notifications to be sent for undo/redo These are used to
+ // notify clients that something is different.
+ virtual void OnDoNotification(std::function<void()> inNotification) = 0;
+ virtual void OnUndoNotification(std::function<void()> inNotification) = 0;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// Implementation of helper objects and functions.
+///////////////////////////////////////////////////////////////////////////////
+
+typedef std::vector<std::function<void()>> TVoidFunctionList;
+
+typedef std::shared_ptr<ITransactionConsumer> TTransactionConsumerPtr;
+
+class ITransactionProducer
+{
+public:
+ virtual ~ITransactionProducer() {}
+ virtual void SetConsumer(TTransactionConsumerPtr inConsumer) = 0;
+};
+
+template <typename TDoTransaction, typename TUndoTransaction>
+class CGenericTransaction : public ITransaction
+{
+ Q_DISABLE_COPY(CGenericTransaction)
+
+ TUndoTransaction m_UndoTransaction;
+ TDoTransaction m_DoTransaction;
+
+public:
+ CGenericTransaction(const char *inFile, int inLine, TDoTransaction inDo,
+ TUndoTransaction inUndo)
+ : ITransaction(inFile, inLine)
+ , m_UndoTransaction(inUndo)
+ , m_DoTransaction(inDo)
+ {
+ }
+ void Do() override { m_DoTransaction(); }
+ void Undo() override { m_UndoTransaction(); }
+};
+
+template <typename TDoTransaction, typename TUndoTransaction>
+ITransaction *DoCreateGenericTransaction(const char *inFile, int inLine, TDoTransaction inDo,
+ TUndoTransaction inUndo)
+{
+ return static_cast<ITransaction *>(
+ new CGenericTransaction<TDoTransaction, TUndoTransaction>(inFile, inLine, inDo, inUndo));
+}
+
+#define CREATE_GENERIC_TRANSACTION(inDo, inUndo) \
+ DoCreateGenericTransaction(__FILE__, __LINE__, inDo, inUndo)
+
+typedef std::shared_ptr<ITransaction> TTransactionPtr;
+typedef std::vector<TTransactionPtr> TTransactionPtrList;
+
+struct CTransactionConsumer : public ITransactionConsumer
+{
+ TTransactionPtrList m_TransactionList;
+ TVoidFunctionList m_DoNotifications;
+ TVoidFunctionList m_UndoNotifications;
+ void OnTransaction(TTransactionPtr inTransaction) override
+ {
+ m_TransactionList.push_back(inTransaction);
+ }
+ void OnDoNotification(std::function<void()> inNotification) override
+ {
+ m_DoNotifications.push_back(inNotification);
+ }
+ void OnUndoNotification(std::function<void()> inNotification) override
+ {
+ m_UndoNotifications.push_back(inNotification);
+ }
+
+ // Merge with another CTransactionConsumer
+ virtual void Merge(const ITransactionConsumer *inConsumer)
+ {
+ const CTransactionConsumer *theConsumer =
+ static_cast<const CTransactionConsumer *>(inConsumer);
+ m_TransactionList.insert(m_TransactionList.begin(), theConsumer->m_TransactionList.begin(),
+ theConsumer->m_TransactionList.end());
+ }
+ void Reset()
+ {
+ m_TransactionList.clear();
+ m_DoNotifications.clear();
+ m_UndoNotifications.clear();
+ }
+};
+
+template <typename TTransactionType>
+inline void RunWithConsumer(TTransactionConsumerPtr inConsumer, TTransactionType inTransaction)
+{
+ if (inConsumer)
+ inTransaction(inConsumer);
+}
+
+template <typename TDoTransaction, typename TUndoTransaction>
+inline void CreateGenericTransactionWithConsumer(const char *inFile, int inLine,
+ TTransactionConsumerPtr inConsumer,
+ TDoTransaction inDoTransaction,
+ TUndoTransaction inUndoTransaction)
+{
+ if (inConsumer)
+ inConsumer->OnTransaction(TTransactionPtr(
+ DoCreateGenericTransaction(inFile, inLine, inDoTransaction, inUndoTransaction)));
+}
+
+template <typename TItemType>
+inline void DoSetConsumer(TTransactionConsumerPtr inConsumer,
+ std::shared_ptr<TItemType> inTypePtr)
+{
+ ITransactionProducer *theProducer = dynamic_cast<ITransactionProducer *>(inTypePtr.get());
+ if (theProducer)
+ theProducer->SetConsumer(inConsumer);
+}
+
+template <typename TContainer>
+inline void Undo(TContainer &inTransactions)
+{
+ std::for_each(inTransactions.rbegin(), inTransactions.rend(), std::bind(&ITransaction::Undo,
+ std::placeholders::_1));
+}
+
+template <typename TContainer>
+inline void Redo(TContainer &inTransactions)
+{
+ do_all(inTransactions, std::bind(&ITransaction::Do, std::placeholders::_1));
+}
+
+template <typename TItemType>
+void Notify(std::vector<TItemType> &inNotifications)
+{
+ do_all(inNotifications, std::bind(&TItemType::operator(), std::placeholders::_1));
+}
+
+template <typename TItemType>
+void NotifyReverse(std::vector<TItemType> &inNotifications)
+{
+ std::for_each(inNotifications.rbegin(), inNotifications.rend(),
+ std::bind(&TItemType::operator(), std::placeholders::_1));
+}
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMValue.cpp b/src/dm/systems/Qt3DSDMValue.cpp
new file mode 100644
index 0000000..94c5a59
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMValue.cpp
@@ -0,0 +1,178 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMValue.h"
+
+#include <QColor>
+#include <QDebug>
+#include <QVariant>
+
+using namespace qt3dsdm;
+
+SValue::SValue(const QVariant &inData)
+{
+ switch (inData.type()) {
+ case QVariant::Bool:
+ {
+ *this = inData.toBool();
+ break;
+ }
+ case QVariant::Color:
+ {
+ const QColor c = inData.value<QColor>();
+ *this = qt3dsdm::SFloat4(c.redF(), c.greenF(), c.blueF(), c.alphaF());
+ break;
+ }
+ case QVariant::String:
+ {
+ const QString q = inData.toString();
+ const int count = q.size() + 1;
+#ifdef __INTEGRITY
+ wchar_t* tempBuf = reinterpret_cast<wchar_t*>(malloc(count * sizeof(wchar_t)));
+#else
+ wchar_t* tempBuf = reinterpret_cast<wchar_t*>(alloca(count * sizeof(wchar_t)));
+#endif
+ tempBuf[count - 1] = 0;
+ q.toWCharArray(tempBuf);
+ *this = std::make_shared<qt3dsdm::CDataStr>(tempBuf);
+#ifdef __INTEGRITY
+ free(tempBuf);
+#endif
+ break;
+ }
+ case QVariant::Int: {
+ *this = inData.toInt();
+ break;
+ }
+ case QVariant::Double: {
+ *this = inData.toFloat();
+ break;
+ }
+
+ case QVariant::Vector2D: {
+ const auto v = inData.value<QVector2D>();
+ *this = qt3dsdm::SFloat2(v.x(), v.y());
+ break;
+ }
+
+ case QVariant::Vector3D: {
+ const auto v = inData.value<QVector3D>();
+ *this = qt3dsdm::SFloat3(v.x(), v.y(), v.z());
+ break;
+ }
+
+ default:
+ qDebug() << "Add a handler for QVariant::type" << inData.type();
+ throw std::runtime_error("Cannot transform this QVariant into SValue");
+ }
+}
+
+QVariant SValue::toQVariant() const
+{
+ switch (getType()) {
+ case DataModelDataType::String:
+ case DataModelDataType::StringRef:
+ {
+ return get<QString>(*this);
+ }
+ case DataModelDataType::Float: {
+ return get<float>(*this);
+ }
+ case DataModelDataType::Float2: {
+ return QVariant::fromValue(get<QVector2D>(*this));
+ }
+ case DataModelDataType::Float3: {
+ return QVariant::fromValue(get<QVector3D>(*this));
+ }
+ case DataModelDataType::Float4: {
+ return QVariant::fromValue(get<QVector<float> >(*this));
+ }
+ case DataModelDataType::Long: {
+ return QVariant::fromValue(get<qt3ds::QT3DSI32>(*this));
+ }
+ case DataModelDataType::Bool: {
+ return get<bool>(*this);
+ }
+ case DataModelDataType::FloatList: {
+ //KDAB_TODO
+ qDebug() << "Add a handler for type DataModelDataType::FloatList";
+ return {};
+ }
+ case DataModelDataType::Long4: {
+ return QVariant::fromValue(get<QVector<qt3ds::QT3DSU32> >(*this));
+ }
+ case DataModelDataType::ObjectRef: {
+ const SObjectRefType &theRef(get<SObjectRefType>(*this));
+ switch (theRef.GetReferenceType()) {
+ case ObjectReferenceType::Absolute:
+ return SValue(get<SLong4>(theRef.m_Value)).toQVariant();
+ break;
+ case ObjectReferenceType::Relative:
+ return SValue(get<TDataStrPtr>(theRef.m_Value)).toQVariant();
+ break;
+ case ObjectReferenceType::Unknown:
+ return QVariant::fromValue(QVector<qt3ds::QT3DSU32>());
+ break;
+ }
+ }
+ case DataModelDataType::StringOrInt: {
+ const SStringOrInt &theData(get<SStringOrInt>(*this));
+ if (theData.GetType() == SStringOrIntTypes::Int) {
+ return QVariant::fromValue(get<qt3ds::QT3DSI32>(theData.m_Value));
+ } else if (theData.GetType() == SStringOrIntTypes::String) {
+ auto wideStr = get<TDataStrPtr>(theData.m_Value)->GetData();
+ return QString::fromWCharArray(wideStr);
+ } else {
+ return {};
+ }
+
+ }
+ case DataModelDataType::None:
+ return {};
+ default:
+ break;
+ }
+ return {};
+}
+
+SInternValue::SInternValue(const SValue &inValue, IStringTable &inStringTable)
+{
+ if (GetValueType(inValue) == DataModelDataType::StringRef) {
+ const SStringRef &current = get<SStringRef>(inValue);
+ SStringRef newId = inStringTable.RegisterStr(current.m_Id);
+ m_Value = SValue(newId);
+ } else {
+ m_Value = inValue;
+ }
+}
+
+SInternValue::SInternValue(const SInternValue &inOther)
+ : m_Value(inOther.m_Value)
+{
+}
diff --git a/src/dm/systems/Qt3DSDMValue.h b/src/dm/systems/Qt3DSDMValue.h
new file mode 100644
index 0000000..9e00632
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMValue.h
@@ -0,0 +1,341 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_VALUE_H
+#define QT3DSDM_VALUE_H
+#include "Qt3DSDMDataTypes.h"
+
+#include <QColor>
+#include <QMetaType>
+#include <QVariant>
+#include <QVector>
+#include <QVector2D>
+#include <QVector3D>
+
+namespace qt3dsdm {
+
+template <typename TDataType>
+struct SDataTypeToEnumMap
+{
+};
+
+template <DataModelDataType::Value TEnumVal>
+struct SEnumToDataTypeMap
+{
+};
+
+#define DEFINE_QT3DSDM_DATA_TYPE_MAP(dtype, enumName) \
+ template <> \
+ struct SDataTypeToEnumMap<dtype> \
+ { \
+ static DataModelDataType::Value getType() { return enumName; } \
+ }; \
+ template <> \
+ struct SEnumToDataTypeMap<enumName> \
+ { \
+ typedef dtype TDataType; \
+ };
+
+#define ITERATE_QT3DSDM_DATA_TYPES \
+ HANDLE_QT3DSDM_DATA_TYPE(float, DataModelDataType::Float); \
+ HANDLE_QT3DSDM_DATA_TYPE(SFloat2, DataModelDataType::Float2); \
+ HANDLE_QT3DSDM_DATA_TYPE(SFloat3, DataModelDataType::Float3); \
+ HANDLE_QT3DSDM_DATA_TYPE(SFloat4, DataModelDataType::Float4); \
+ HANDLE_QT3DSDM_DATA_TYPE(qt3ds::QT3DSI32, DataModelDataType::Long); \
+ HANDLE_QT3DSDM_DATA_TYPE(TDataStrPtr, DataModelDataType::String); \
+ HANDLE_QT3DSDM_DATA_TYPE(bool, DataModelDataType::Bool); \
+ HANDLE_QT3DSDM_DATA_TYPE(SLong4, DataModelDataType::Long4); \
+ HANDLE_QT3DSDM_DATA_TYPE(SStringRef, DataModelDataType::StringRef); \
+ HANDLE_QT3DSDM_DATA_TYPE(SObjectRefType, DataModelDataType::ObjectRef); \
+ HANDLE_QT3DSDM_DATA_TYPE(SStringOrInt, DataModelDataType::StringOrInt); \
+ HANDLE_QT3DSDM_DATA_TYPE(TFloatList, DataModelDataType::FloatList);
+
+#define HANDLE_QT3DSDM_DATA_TYPE(a, b) DEFINE_QT3DSDM_DATA_TYPE_MAP(a, b)
+ITERATE_QT3DSDM_DATA_TYPES
+#undef HANDLE_QT3DSDM_DATA_TYPE
+
+struct Qt3DSDMDataTypeUnionTraits
+{
+ typedef DataModelDataType::Value TIdType;
+
+ enum {
+ TBufferSize = sizeof(SObjectRefType),
+ };
+
+ static TIdType getNoDataId() { return DataModelDataType::None; }
+
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return SDataTypeToEnumMap<TDataType>::getType();
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, DataModelDataType::Value inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+#define HANDLE_QT3DSDM_DATA_TYPE(dtype, enumType) \
+ case enumType: \
+ return inVisitor(*NVUnionCast<dtype *>(inData));
+ ITERATE_QT3DSDM_DATA_TYPES
+#undef HANDLE_QT3DSDM_DATA_TYPE
+
+ default:
+ QT3DS_ASSERT(false);
+ case DataModelDataType::None:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, DataModelDataType::Value inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+#define HANDLE_QT3DSDM_DATA_TYPE(dtype, enumType) \
+ case enumType: \
+ return inVisitor(*NVUnionCast<const dtype *>(inData));
+ ITERATE_QT3DSDM_DATA_TYPES
+#undef HANDLE_QT3DSDM_DATA_TYPE
+
+ default:
+ QT3DS_ASSERT(false);
+ case DataModelDataType::None:
+ return inVisitor();
+ }
+ }
+};
+
+typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<Qt3DSDMDataTypeUnionTraits,
+ Qt3DSDMDataTypeUnionTraits::TBufferSize>,
+ Qt3DSDMDataTypeUnionTraits::TBufferSize>
+ TValue;
+
+struct SValue : public TValue
+{
+ SValue() {}
+ SValue(const SValue &inOther)
+ : TValue(static_cast<const TValue &>(inOther))
+ {
+ }
+ SValue(const QVariant &inData);
+
+ template <typename TDataType>
+ SValue(const TDataType &inData)
+ : TValue(inData)
+ {
+ }
+ SValue &operator=(const SValue &inOther)
+ {
+ TValue::operator=(inOther);
+ return *this;
+ }
+ bool operator==(const SValue &inOther) const { return TValue::operator==(inOther); }
+ bool operator!=(const SValue &inOther) const { return TValue::operator!=(inOther); }
+ bool empty() const { return getType() == DataModelDataType::None; }
+
+ // Conversion from this data type into a data model value
+ const SValue &toOldSkool() const { return *this; }
+
+ QVariant toQVariant() const;
+};
+
+typedef std::shared_ptr<SValue> SValuePtr;
+
+template <>
+struct Qt3DSDMGetter<SValue>
+{
+ template <typename TRetType>
+ TRetType doGet(const SValue &inValue)
+ {
+ return inValue.getData<TRetType>();
+ }
+};
+
+template <>
+struct Qt3DSDMValueTyper<SValue>
+{
+ DataModelDataType::Value Get(const SValue &inValue) { return inValue.getType(); }
+};
+
+inline bool CheckValueType(DataModelDataType::Value inType, const SValue &inValue)
+{
+ bool retval = inType == inValue.getType();
+ if (!retval)
+ throw ValueTypeError(L"");
+ return retval;
+}
+
+inline bool Equals(const SValue &lhs, const SValue &rhs)
+{
+ return lhs == rhs;
+}
+
+class SInternValue
+{
+ SValue m_Value;
+
+public:
+ SInternValue(const SValue &inValue, IStringTable &inTable);
+ SInternValue() {}
+ SInternValue(const SInternValue &inOther);
+ SInternValue &operator=(const SInternValue &inOther)
+ {
+ m_Value = inOther.m_Value;
+ return *this;
+ }
+
+ static SInternValue ISwearThisHasAlreadyBeenInternalized(const SValue &inValue)
+ {
+ SInternValue retval;
+ retval.m_Value = inValue;
+ return retval;
+ }
+
+ const SValue &GetValue() const { return m_Value; }
+ operator const SValue &() const { return m_Value; }
+};
+
+template <>
+struct SDefaulter<SValue>
+{
+ inline bool SetDefault(DataModelDataType::Value inDataType, SValue &outValue)
+ {
+ switch (inDataType) {
+ case DataModelDataType::Float:
+ outValue = SValue(0.f);
+ break;
+ case DataModelDataType::Float2:
+ outValue = SValue(SFloat2());
+ break;
+ case DataModelDataType::Float3:
+ outValue = SValue(SFloat3());
+ break;
+ case DataModelDataType::Float4:
+ outValue = SValue(SFloat4());
+ break;
+ case DataModelDataType::Long:
+ outValue = SValue(0);
+ break;
+ case DataModelDataType::String:
+ outValue = SValue(TDataStrPtr(new CDataStr(L"")));
+ break;
+ case DataModelDataType::Bool:
+ outValue = SValue(false);
+ break;
+ case DataModelDataType::Long4:
+ outValue = SValue(SLong4());
+ break;
+ case DataModelDataType::StringRef:
+ outValue = SValue(SStringRef());
+ break;
+ case DataModelDataType::ObjectRef:
+ outValue = SValue(SObjectRefType());
+ break;
+ case DataModelDataType::FloatList:
+ outValue = SValue(TFloatList());
+ break;
+ case DataModelDataType::StringOrInt:
+ default:
+ outValue = SValue(SStringOrInt());
+ return false;
+ }
+ return true;
+ }
+};
+
+inline SObjectRefType ConvertToObjectRef(const SValue &inValue)
+{
+ using namespace std;
+ switch (GetValueType(inValue)) {
+ case DataModelDataType::StringRef:
+ return SObjectRefType(make_shared<CDataStr>(get<SStringRef>(inValue).m_Id));
+ case DataModelDataType::String:
+ return SObjectRefType(get<TDataStrPtr>(inValue));
+ case DataModelDataType::Long4:
+ return SObjectRefType(get<SLong4>(inValue));
+ case DataModelDataType::ObjectRef:
+ return get<SObjectRefType>(inValue);
+ default:
+ break;
+ }
+ return SObjectRefType();
+}
+
+
+template <>
+inline QColor get<QColor>(const SValue &inType)
+{
+ auto f = get<qt3dsdm::SFloat4>(inType);
+ qreal r = qBound<qreal>(0.0, f.m_Floats[0], 1.0);
+ qreal g = qBound<qreal>(0.0, f.m_Floats[1], 1.0);
+ qreal b = qBound<qreal>(0.0, f.m_Floats[2], 1.0);
+ qreal a = qBound<qreal>(0.0, f.m_Floats[3], 1.0);
+ return QColor::fromRgbF(r, g, b, a);
+}
+
+template <>
+inline QString get<QString>(const qt3dsdm::SValue &inType)
+{
+ return QString::fromWCharArray(qt3dsdm::get<qt3dsdm::TDataStrPtr>(inType)->GetData());
+}
+
+template <>
+inline QVector2D get<QVector2D>(const qt3dsdm::SValue &inType)
+{
+ auto f = get<qt3dsdm::SFloat2>(inType);
+ return QVector2D(f.m_Floats[0], f.m_Floats[1]);
+}
+
+template <>
+inline QVector3D get<QVector3D>(const qt3dsdm::SValue &inType)
+{
+ auto f = get<qt3dsdm::SFloat3>(inType);
+ return QVector3D(f.m_Floats[0], f.m_Floats[1], f.m_Floats[2]);
+}
+
+template <>
+inline QVector<float> get<QVector<float> >(const qt3dsdm::SValue &inType)
+{
+ auto f = get<qt3dsdm::SFloat4>(inType);
+ return {f.m_Floats[0], f.m_Floats[1], f.m_Floats[2], f.m_Floats[3]};
+}
+
+// KDAB_TODO Shortcut to not define our own 4 member long structure
+template <>
+inline QVector<qt3ds::QT3DSU32> get<QVector<qt3ds::QT3DSU32> >(const qt3dsdm::SValue &inType)
+{
+ auto f = get<qt3dsdm::SLong4>(inType);
+ return {f.m_Longs[0], f.m_Longs[1], f.m_Longs[2], f.m_Longs[3]};
+}
+
+}
+Q_DECLARE_METATYPE(qt3dsdm::DataModelDataType)
+#endif
diff --git a/src/dm/systems/Qt3DSDMWStrOps.h b/src/dm/systems/Qt3DSDMWStrOps.h
new file mode 100644
index 0000000..b1e1fb0
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMWStrOps.h
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_WSTR_OPS_H
+#define QT3DSDM_WSTR_OPS_H
+namespace qt3dsdm {
+// Template base class so that we can convert items to and from wide string
+template <typename TDataType>
+struct WStrOps
+{
+ bool force_compile_error;
+};
+}
+#endif \ No newline at end of file
diff --git a/src/dm/systems/Qt3DSDMWStrOpsImpl.h b/src/dm/systems/Qt3DSDMWStrOpsImpl.h
new file mode 100644
index 0000000..d65ac13
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMWStrOpsImpl.h
@@ -0,0 +1,761 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_IMPORT_WSTR_OPS_IMPL_H
+#define QT3DS_IMPORT_WSTR_OPS_IMPL_H
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMWStrOps.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMAnimation.h"
+#include "Qt3DSDMMetaDataTypes.h"
+#include "Qt3DSDMXML.h"
+#include "EABase/eabase.h"
+#include "Qt3DSDMStringTable.h"
+
+namespace qt3dsdm {
+using qt3ds::QT3DSI8;
+using qt3ds::QT3DSU8;
+using qt3ds::QT3DSI16;
+using qt3ds::QT3DSU16;
+using qt3ds::QT3DSU32;
+using qt3ds::QT3DSI32;
+using qt3ds::QT3DSU64;
+using qt3ds::QT3DSI64;
+using qt3ds::QT3DSF32;
+using qt3ds::QT3DSF64;
+template <>
+struct WStrOps<bool>
+{
+ QT3DSU32 ToStr(bool item, NVDataRef<wchar_t> buffer)
+ {
+ return static_cast<QT3DSU32>(
+ swprintf(buffer.begin(), buffer.size(), L"%s", item ? L"True" : L"False"));
+ }
+ bool StrTo(const wchar_t *buffer, bool &item)
+ {
+ if (AreEqual(buffer, L"True"))
+ item = true;
+ else
+ item = false;
+ return true;
+ }
+ QT3DSU32 ToStr(bool item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(
+ _snprintf(buffer.begin(), buffer.size(), "%s", item ? "True" : "False"));
+ }
+ bool StrTo(const char8_t *buffer, bool &item)
+ {
+ if (AreEqualCaseless(buffer, "True"))
+ item = true;
+ else
+ item = false;
+ return true;
+ }
+};
+template <>
+struct WStrOps<QT3DSU8>
+{
+ QT3DSU32 ToStr(QT3DSU8 item, NVDataRef<wchar_t> buffer)
+ {
+ return static_cast<QT3DSU32>(
+ swprintf(buffer.begin(), buffer.size(), L"%hu", static_cast<QT3DSU16>(item)));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSU8 &item)
+ {
+ item = static_cast<QT3DSU8>(strtoul(buffer, NULL, 10));
+ return true;
+ }
+};
+template <>
+struct WStrOps<QT3DSI8>
+{
+ QT3DSU32 ToStr(QT3DSI8 item, NVDataRef<wchar_t> buffer)
+ {
+ return static_cast<QT3DSU32>(
+ swprintf(buffer.begin(), buffer.size(), L"%hd", static_cast<QT3DSI16>(item)));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSI8 &item)
+ {
+ item = static_cast<QT3DSI8>(strtol(buffer, NULL, 10));
+ return true;
+ }
+};
+template <>
+struct WStrOps<QT3DSU16>
+{
+ QT3DSU32 ToStr(QT3DSU16 item, NVDataRef<wchar_t> buffer)
+ {
+ return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%hu", item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSU16 &item)
+ {
+ item = static_cast<QT3DSU16>(strtoul(buffer, NULL, 10));
+ return true;
+ }
+};
+template <>
+struct WStrOps<QT3DSI16>
+{
+ QT3DSU32 ToStr(QT3DSI16 item, NVDataRef<wchar_t> buffer)
+ {
+ return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%hd", item));
+ }
+ QT3DSU32 ToStr(QT3DSI16 item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(sprintf(buffer.begin(), "%hd", item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSI16 &item)
+ {
+ item = static_cast<QT3DSI16>(strtol(buffer, NULL, 10));
+ return true;
+ }
+};
+
+template <>
+struct WStrOps<QT3DSU32>
+{
+ QT3DSU32 ToStr(QT3DSU32 item, NVDataRef<wchar_t> buffer)
+ {
+ return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%lu", item));
+ }
+ QT3DSU32 ToStr(QT3DSU32 item, NVDataRef<char8_t> buffer)
+ {
+ // hope the buffer is big enough...
+ return static_cast<QT3DSU32>(sprintf(buffer.begin(), "%u", item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSU32 &item)
+ {
+ item = strtoul(buffer, NULL, 10);
+ return true;
+ }
+};
+
+template <>
+struct WStrOps<QT3DSI32>
+{
+ QT3DSU32 ToStr(QT3DSI32 item, NVDataRef<wchar_t> buffer)
+ {
+ return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%ld", item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSI32 &item)
+ {
+ item = strtol(buffer, NULL, 10);
+ return true;
+ }
+};
+template <>
+struct WStrOps<QT3DSF32>
+{
+ QT3DSU32 ToStr(QT3DSF32 item, NVDataRef<wchar_t> buffer)
+ {
+ QString s = QLocale::c().toString(item);
+ wcsncpy(buffer.begin(), s.toStdWString().c_str(), buffer.size());
+ return s.length();
+ }
+ QT3DSU32 ToStr(QT3DSF32 item, NVDataRef<char8_t> buffer)
+ {
+ QString s = QLocale::c().toString(item);
+ strncpy(buffer.begin(), s.toStdString().c_str(), buffer.size());
+ return s.length();
+ }
+ bool StrTo(const char8_t *buffer, QT3DSF32 &item)
+ {
+ bool ok;
+ item = QLocale::c().toFloat(buffer, &ok);
+ return ok;
+ }
+};
+
+template <>
+struct WStrOps<QT3DSF64>
+{
+ QT3DSU32 ToStr(QT3DSF64 item, NVDataRef<wchar_t> buffer)
+ {
+ QString s = QLocale::c().toString(item);
+ wcsncpy(buffer.begin(), s.toStdWString().c_str(), buffer.size());
+ return s.length();
+ }
+ bool StrTo(const char8_t *buffer, QT3DSF64 &item)
+ {
+ bool ok;
+ item = QLocale::c().toDouble(buffer, &ok);
+ return ok;
+ }
+};
+#define QT3DS_WCHAR_T_None L"None"
+#define QT3DS_WCHAR_T_Float L"Float"
+#define QT3DS_WCHAR_T_Float2 L"Float2"
+#define QT3DS_WCHAR_T_Float3 L"Float3"
+#define QT3DS_WCHAR_T_Float4 L"Float4"
+#define QT3DS_WCHAR_T_Long L"Long"
+#define QT3DS_WCHAR_T_String L"String"
+#define QT3DS_WCHAR_T_Bool L"Bool"
+#define QT3DS_WCHAR_T_Long4 L"Long4"
+#define QT3DS_WCHAR_T_StringRef L"StringRef"
+#define QT3DS_WCHAR_T_ObjectRef L"ObjectRef"
+#define QT3DS_WCHAR_T_StringOrInt L"StringOrInt"
+#define QT3DS_WCHAR_T_FloatList L"FloatList"
+
+#define QT3DS_IMPORT_ITERATE_DMTYPE \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::None, None, QT3DSF32) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float, Float, QT3DSF32) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float2, Float2, SFloat2) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float3, Float3, SFloat3) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float4, Float4, SFloat4) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Long, Long, QT3DSI32) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::String, String, TDataStrPtr) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Bool, Bool, bool) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Long4, Long4, SLong4) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::StringRef, StringRef, SStringRef) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::ObjectRef, ObjectRef, SObjectRefType) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::StringOrInt, StringOrInt, SStringOrInt) \
+ QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::FloatList, FloatList, TFloatList)
+
+template <>
+struct WStrOps<DataModelDataType::Value>
+{
+ QT3DSU32 ToStr(DataModelDataType::Value item, NVDataRef<wchar_t> buffer)
+ {
+ const wchar_t *data = NULL;
+ switch (item) {
+#define QT3DS_IMPORT_HANDLE_DMTYPE(x, y, z) \
+ case x: \
+ data = QT3DS_WCHAR_T_##y; \
+ break;
+ QT3DS_IMPORT_ITERATE_DMTYPE
+#undef QT3DS_IMPORT_HANDLE_DMTYPE
+ default:
+ break;
+ }
+ if (data == NULL) {
+ QT3DS_ASSERT(false);
+ data = L"Unknown";
+ }
+ return (QT3DSU32)swprintf(buffer.begin(), buffer.size(), L"%ls", data);
+ }
+ bool StrTo(const wchar_t *buffer, DataModelDataType::Value &item)
+ {
+#define QT3DS_IMPORT_HANDLE_DMTYPE(x, y, z) \
+ if (AreEqual(buffer, QT3DS_WCHAR_T_##y)) { \
+ item = x; \
+ return true; \
+ }
+ QT3DS_IMPORT_ITERATE_DMTYPE
+#undef QT3DS_IMPORT_HANDLE_DMTYPE
+ item = DataModelDataType::None;
+ return false;
+ }
+};
+template <typename TBufferType>
+struct WStrOpsDMWriter
+{
+ TBufferType &buf;
+ WStrOpsDMWriter(TBufferType &_buf)
+ : buf(_buf)
+ {
+ }
+
+ void operator()(float val) { buf.Write(val); }
+ void operator()(const SFloat2 &val) { buf.Write(NVConstDataRef<QT3DSF32>(&val[0], 2)); }
+ void operator()(const SFloat3 &val) { buf.Write(NVConstDataRef<QT3DSF32>(&val[0], 3)); }
+ void operator()(const SFloat4 &val) { buf.Write(NVConstDataRef<QT3DSF32>(&val[0], 4)); }
+ void operator()(QT3DSI32 val) { buf.Write(val); }
+ void operator()(bool val) { buf.Write(val); }
+ void operator()(const TDataStrPtr &val)
+ {
+ if (val != NULL)
+ buf.Write(NVConstDataRef<wchar_t>(val->GetData(), (QT3DSU32)val->GetLength()));
+ }
+ void operator()(const SLong4 &val)
+ {
+ buf.Write(NVConstDataRef<QT3DSU32>(&val.m_Longs[0], 4), 4);
+ }
+ void operator()(const SStringRef &val) { buf.Write(val.m_Id, (QT3DSU32)wcslen(val.m_Id) + 1); }
+ void operator()(const SObjectRefType &val) { val.m_Value.visit<void>(*this); }
+ void operator()(const SStringOrInt &val) { val.m_Value.visit<void>(*this); }
+ void operator()(const TFloatList &val)
+ {
+ buf.Write(NVConstDataRef<float>(val.data(), (QT3DSU32)val.size()));
+ }
+ void operator()() { QT3DS_ASSERT(false); }
+};
+
+template <>
+struct WStrOps<SValue>
+{
+ template <typename TBufferType>
+ void ToBuf(const SValue &item, TBufferType &outBuffer)
+ {
+ WStrOpsDMWriter<TBufferType> writer(outBuffer);
+ item.visit<void>(writer);
+ }
+ template <typename TBufferType>
+ SValue BufTo(DataModelDataType::Value type, TBufferType &inReader)
+ {
+ switch (type) {
+#define QT3DS_IMPORT_HANDLE_DMTYPE(x, y, z) \
+ case x: { \
+ z retval; \
+ Read(inReader, retval); \
+ return retval; \
+ }
+ QT3DS_IMPORT_ITERATE_DMTYPE
+#undef QT3DS_IMPORT_HANDLE_DMTYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return SValue();
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, float &val)
+ {
+ reader.Read(val);
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, SFloat2 &val)
+ {
+ reader.ReadRef(NVDataRef<QT3DSF32>(&val[0], 2));
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, SFloat3 &val)
+ {
+ reader.ReadRef(NVDataRef<QT3DSF32>(&val[0], 3));
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, SFloat4 &val)
+ {
+ reader.ReadRef(NVDataRef<QT3DSF32>(&val[0], 4));
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, QT3DSI32 &val)
+ {
+ reader.Read(val);
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, bool &val)
+ {
+ reader.Read(val);
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, TDataStrPtr &val)
+ {
+ NVConstDataRef<wchar_t> buffer;
+ reader.ReadBuffer(buffer);
+ val = std::make_shared<CDataStr>(buffer.begin(), buffer.size());
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, SLong4 &val)
+ {
+ reader.ReadRef(NVDataRef<QT3DSU32>(&val.m_Longs[0], 4));
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, SStringRef &val)
+ {
+ NVConstDataRef<wchar_t> buffer;
+ reader.ReadBuffer(buffer);
+ val = SStringRef(buffer.begin());
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, TFloatList &val)
+ {
+ NVConstDataRef<QT3DSF32> buffer;
+ reader.ReadBuffer(buffer);
+ val.assign(buffer.begin(), buffer.end());
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, SObjectRefType &val)
+ {
+ // Force the read to be as string; callers can always convert to a different
+ // format later if required.
+ TDataStrPtr theValue;
+ Read(reader, theValue);
+ val.m_Value = theValue;
+ }
+ template <typename TBufferType>
+ void Read(TBufferType &reader, SStringOrInt &val)
+ {
+ NVConstDataRef<char8_t> buffer;
+ reader.ReadBuffer(buffer);
+ if (buffer.size() == 0)
+ return;
+
+ if ((buffer[0] >= '0' && buffer[0] <= '9') || buffer[0] == '-') {
+ QT3DSI32 theVal;
+ WStrOps<QT3DSI32>().StrTo(buffer.begin(), theVal);
+ val = SStringOrInt(theVal);
+ } else {
+ NVConstDataRef<wchar_t> wideBuffer;
+ reader.ReadBuffer(wideBuffer);
+ val = SStringOrInt(std::make_shared<CDataStr>(wideBuffer.begin()));
+ }
+ }
+};
+
+// Write the wchar_t but exlude the null terminator
+// Meant to write data model values.
+// Memory buffer contains a non-null-terminated
+// wchar_t string
+struct WCharTWriter
+{
+ MemoryBuffer<RawAllocator> &m_Buffer;
+ WCharTWriter(MemoryBuffer<RawAllocator> &buf)
+ : m_Buffer(buf)
+ {
+ }
+ void Write(const wchar_t *value, QT3DSU32 len = 0)
+ {
+ if (IsTrivial(value))
+ return;
+ if (len == 0)
+ len = (QT3DSU32)wcslen(value);
+ m_Buffer.write(value, len);
+ }
+ void Write(wchar_t value) { m_Buffer.write(value); }
+ void Write(bool value) { Write(value ? L"True" : L"False"); }
+
+ // Takes care of long and float
+ template <typename TDataType>
+ void Write(TDataType value)
+ {
+ wchar_t buf[256];
+ QT3DSU32 numWritten = WStrOps<TDataType>().ToStr(value, NVDataRef<wchar_t>(buf, 256));
+ if (numWritten)
+ Write((const wchar_t *)buf);
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ template <typename TDataType>
+ void Write(NVConstDataRef<TDataType> values, QT3DSU32 grouping = 6, QT3DSU32 tabCount = 0)
+ {
+ for (QT3DSU32 idx = 0; idx < values.size(); ++idx) {
+ if (idx) {
+ if ((idx % grouping) == 0) {
+ Write((wchar_t)'\n');
+ for (QT3DSU32 tabIdx = 0; tabIdx < tabCount; ++tabIdx)
+ Write((wchar_t)'\t');
+ } else
+ Write((wchar_t)' ');
+ }
+ Write(values[idx]);
+ }
+ }
+
+ void Write(NVConstDataRef<wchar_t> values, QT3DSU32 ignored = 6)
+ {
+ (void)ignored;
+ if (values.size() && values[0] != 0) {
+ QT3DSU32 lastItem = values.size() - 1;
+ if (values[lastItem] == 0)
+ --lastItem;
+ Write(values.begin(), lastItem + 1);
+ }
+ }
+};
+
+inline bool IsWhite(wchar_t value)
+{
+ return value == '\n' || value == '\r' || value == ' ' || value == '\t';
+}
+
+// skip until we find whitespace.
+inline wchar_t *FindNextWhitespace(wchar_t *input)
+{
+ if (input == NULL)
+ return input;
+ wchar_t *marker = input;
+ // Empty loop intentional
+ for (; *marker && !IsWhite(*marker); ++marker)
+ ;
+ return marker;
+}
+
+// skip until we find whitespace.
+inline char8_t *FindNextWhitespace(char8_t *input)
+{
+ if (input == NULL)
+ return input;
+ char8_t *marker = input;
+ // Empty loop intentional
+ for (; *marker && !IsWhite(*marker); ++marker)
+ ;
+ return marker;
+}
+
+// skip until we find something that isn't whitespace.
+inline wchar_t *FindNextNonWhitespace(wchar_t *input)
+{
+ if (input == NULL)
+ return input;
+ wchar_t *marker = input;
+ // Empty loop intentional
+ for (; *marker && IsWhite(*marker); ++marker)
+ ;
+ return marker;
+}
+
+inline char8_t *FindNextNonWhitespace(char8_t *input)
+{
+ if (input == NULL)
+ return input;
+ char8_t *marker = input;
+ // Empty loop intentional
+ for (; *marker && IsWhite(*marker); ++marker)
+ ;
+ return marker;
+}
+
+// Reading is destructive in the case of floating point lists, so we may
+// destroy the incoming string.
+// We are assuming the string is null-terminated at end ptr.
+struct WCharTReader
+{
+ char8_t *m_StartPtr;
+ // Buffer used for temp storage
+ MemoryBuffer<RawAllocator> &m_Buffer;
+ IStringTable &m_StringTable;
+ WCharTReader(char8_t *sp, MemoryBuffer<RawAllocator> &buf, IStringTable &inStringTable)
+ : m_StartPtr(sp)
+ , m_Buffer(buf)
+ , m_StringTable(inStringTable)
+ {
+ }
+ void Read(const char8_t *&outPtr) { outPtr = m_StartPtr; }
+ void Read(const wchar_t *&outPtr) { outPtr = m_StringTable.GetWideStr(m_StartPtr); }
+ template <typename TDataType>
+ void Read(TDataType &data)
+ {
+ bool success = WStrOps<TDataType>().StrTo(m_StartPtr, data);
+ QT3DS_ASSERT(success);
+ (void)success;
+ }
+ // Destructive operation because we can't trust
+ // strtod to do the right thing. On windows, for long strings,
+ // it calls strlen every operation thus leading to basically N^2
+ // behavior
+ template <typename TDataType>
+ void ReadRef(NVDataRef<TDataType> data)
+ {
+ QT3DSU32 idx = 0;
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr);
+ for (; idx < data.size() && m_StartPtr && *m_StartPtr; ++idx) {
+ char8_t *nextPtr = FindNextWhitespace(m_StartPtr);
+ if (nextPtr && *nextPtr)
+ *nextPtr = 0;
+ else
+ nextPtr = NULL;
+ WStrOps<TDataType>().StrTo(m_StartPtr, data[idx]);
+ m_StartPtr = nextPtr;
+ if (m_StartPtr)
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr + 1);
+ }
+ }
+
+ void ReadBuffer(NVConstDataRef<char8_t> &outBuffer)
+ {
+ if (m_StartPtr && *m_StartPtr) {
+ QT3DSU32 len = (QT3DSU32)strlen(m_StartPtr);
+ outBuffer = NVConstDataRef<char8_t>(m_StartPtr, len + 1);
+ }
+ }
+ void ReadBuffer(NVConstDataRef<wchar_t> &outBuffer)
+ {
+ if (m_StartPtr && *m_StartPtr) {
+ QT3DSU32 len = (QT3DSU32)strlen(m_StartPtr);
+ outBuffer = NVConstDataRef<wchar_t>(m_StringTable.GetWideStr(m_StartPtr), len + 1);
+ }
+ }
+
+ // Destructive operation because we can't trust
+ // strtod to do the right thing. On windows, for long strings,
+ // it calls strlen every operation thus leading to basically N^2
+ // behavior
+ template <typename TDataType>
+ void ReadBuffer(NVConstDataRef<TDataType> &outBuffer)
+ {
+ m_Buffer.clear();
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr);
+ while (m_StartPtr && *m_StartPtr) {
+ char8_t *nextPtr = FindNextWhitespace(m_StartPtr);
+ if (nextPtr && *nextPtr)
+ *nextPtr = 0;
+ else
+ nextPtr = NULL;
+ TDataType temp;
+ WStrOps<TDataType>().StrTo(m_StartPtr, temp);
+ m_Buffer.write(temp);
+ m_StartPtr = nextPtr;
+ if (m_StartPtr)
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr + 1);
+ }
+ QT3DSU32 numItems = m_Buffer.size() / sizeof(TDataType);
+ if (numItems)
+ outBuffer = NVConstDataRef<TDataType>((TDataType *)m_Buffer.begin(), numItems);
+ else
+ outBuffer = NVConstDataRef<TDataType>();
+ }
+};
+
+template <>
+struct WStrOps<CDataModelHandle>
+{
+ template <typename THandleType>
+ QT3DSU32 ToStr(THandleType item, NVDataRef<wchar_t> buffer)
+ {
+ int theValue(item);
+ return WStrOps<int>().ToStr(theValue, buffer);
+ }
+ template <typename THandleType>
+ bool StrTo(const char8_t *buffer, THandleType &item)
+ {
+ int theValue;
+ bool retval = WStrOps<int>().StrTo(buffer, theValue);
+ item = theValue;
+ return retval;
+ }
+};
+
+#define IMPLEMENT_HANDLE_WSTROPS(HandleType) \
+ template <> \
+ struct WStrOps<HandleType> : public WStrOps<CDataModelHandle> \
+ { \
+ };
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMInstanceHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMPropertyHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMSlideHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMSlideGraphHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMAnimationHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMKeyframeHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMActionHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMHandlerArgHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMEventHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMHandlerHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMHandlerParamHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMMetaDataPropertyHandle);
+IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMCategoryHandle);
+#undef IMPLEMENT_HANDLE_WSTROPS
+
+template <>
+struct WStrOps<EAnimationType>
+{
+ QT3DSU32 ToStr(EAnimationType value, NVDataRef<wchar_t> buffer)
+ {
+ const wchar_t *animType = NULL;
+ switch (value) {
+ case EAnimationTypeLinear:
+ animType = L"Linear";
+ break;
+ case EAnimationTypeBezier:
+ animType = L"Bezier";
+ break;
+ case EAnimationTypeEaseInOut:
+ animType = L"EaseInOut";
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ if (animType != NULL)
+ return swprintf(buffer.begin(), buffer.size(), L"%ls", animType);
+ else {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ }
+ bool StrTo(const wchar_t *buffer, EAnimationType &item)
+ {
+ if (AreEqual(L"Linear", buffer)) {
+ item = EAnimationTypeLinear;
+ return true;
+ }
+ if (AreEqual(L"Bezier", buffer)) {
+ item = EAnimationTypeBezier;
+ return true;
+ }
+ if (AreEqual(L"EaseInOut", buffer)) {
+ item = EAnimationTypeEaseInOut;
+ return true;
+ }
+ return false;
+ }
+};
+
+// Implemented in UICDMMetaData.h
+template <>
+struct WStrOps<CompleteMetaDataType::Enum>
+{
+ QT3DSU32 ToStr(CompleteMetaDataType::Enum item, NVDataRef<wchar_t> buffer);
+ bool StrTo(const wchar_t *buffer, CompleteMetaDataType::Enum &item);
+};
+
+template <>
+struct WStrOps<HandlerArgumentType::Value>
+{
+ QT3DSU32 ToStr(HandlerArgumentType::Value item, NVDataRef<wchar_t> buffer);
+ bool StrTo(const wchar_t *buffer, HandlerArgumentType::Value &item);
+};
+
+#ifndef __clang__
+#ifndef __INTEGRITY
+// IDOMReader implementations
+template <typename TDataType>
+bool IDOMReader::ValueList(NVDataRef<TDataType> data)
+{
+ const wchar_t *value;
+ if (Value(value)) {
+ WCharTReader reader(const_cast<wchar_t *>(value), m_TempBuf);
+ reader.ReadRef(data);
+ }
+ return true;
+}
+
+// Destructive operation because we can't trust
+// strtod to do the right thing. On windows, for long strings,
+// it calls strlen every operation thus leading to basically N^2
+// behavior
+template <typename TDataType>
+NVConstDataRef<TDataType> IDOMReader::ChildValueList(TWideXMLCharPtr listName)
+{
+ NVConstDataRef<TDataType> retval;
+ TWideXMLCharPtr childValue = NULL;
+ if (ChildValue(listName, childValue)) {
+ WCharTReader reader(const_cast<wchar_t *>(childValue), m_TempBuf);
+ reader.ReadBuffer(retval);
+ }
+ return retval;
+}
+#endif
+#endif
+}
+
+#endif
diff --git a/src/dm/systems/Qt3DSDMWindowsCompatibility.h b/src/dm/systems/Qt3DSDMWindowsCompatibility.h
new file mode 100644
index 0000000..0a53c71
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMWindowsCompatibility.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DSDM_WINDOWS_COMPATIBILITY_H
+#define QT3DSDM_WINDOWS_COMPATIBILITY_H
+#include "EABase/config/eaplatform.h"
+#include "EABase/eabase.h"
+#include <string>
+#ifndef __INTEGRITY
+#include <memory.h>
+#endif
+#include <string.h>
+#include <stdio.h>
+
+#if defined QT3DS_PLATFORM_NEEDS_WCHAR_T
+
+inline size_t wcslen(const wchar_t *inStr)
+{
+ size_t retval = 0;
+ while (inStr && *inStr) {
+ ++retval;
+ ++inStr;
+ }
+ return retval;
+}
+
+inline int wmemcmp(const wchar_t *lhs, const wchar_t *rhs, size_t count)
+{
+ return memcmp(lhs, rhs, count * sizeof(wchar_t));
+}
+
+inline wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, size_t count)
+{
+ memcpy(dest, src, count * sizeof(wchar_t));
+ return dest;
+}
+
+inline const wchar_t *wmemchr(const wchar_t *inFirst, size_t count, const wchar_t val)
+{
+ size_t idx;
+ // empty loop intentional
+ for (idx = 0; idx < count && inFirst[idx] != val; ++idx) {
+ }
+ if (idx < count)
+ return inFirst + idx;
+ return NULL;
+}
+
+inline wchar_t *wmemmove(wchar_t *dest, const wchar_t *src, size_t count)
+{
+ memmove(dest, src, count * sizeof(wchar_t));
+ return dest;
+}
+
+inline wchar_t *wmemset(wchar_t *dest, size_t count, wchar_t val)
+{
+ for (size_t idx = 0; idx < count; ++idx)
+ dest[idx] = val;
+ return dest;
+}
+
+#endif
+
+inline size_t WideToNarrow(char *inDest, size_t inDestLen, const wchar_t *inWideStr);
+template <unsigned int N>
+inline size_t WideToNarrow(char (&inDest)[N], const wchar_t *inWideStr);
+
+#if !defined EA_PLATFORM_WINDOWS
+
+inline void wcscpy_s(wchar_t *inDest, size_t destLen, const wchar_t *inMessage)
+{
+ if (destLen) {
+ size_t idx = 0;
+ while (inMessage && *inMessage && idx < destLen) {
+ inDest[idx] = *inMessage;
+ ++inMessage;
+ ++idx;
+ }
+
+ idx = idx < destLen ? idx : destLen - 1;
+ inDest[idx] = 0;
+ }
+}
+
+template <unsigned int N>
+inline void wcscpy_s(wchar_t (&inDest)[N], const wchar_t *inMessage)
+{
+ wcscpy_s(inDest, N, inMessage);
+}
+
+inline FILE *_wfopen(const wchar_t *inFname, const wchar_t *inFlags)
+{
+ char name[1024] = { 0 };
+ WideToNarrow(name, inFname);
+ char flags[24] = { 0 };
+ WideToNarrow(flags, inFlags);
+ return fopen(name, flags);
+}
+
+inline int _fseeki64(FILE *inFile, int64_t pos, int seekFlags)
+{
+ return fseek(inFile, (int32_t)pos, seekFlags);
+}
+
+inline int64_t _ftelli64(FILE *inFile)
+{
+ return ftell(inFile);
+}
+
+#define _snprintf snprintf
+
+#endif
+
+template <typename TLHS, typename TRHS>
+inline size_t ConvertStr(TLHS *inDest, size_t inDestLen, const TRHS *inWideStr)
+{
+ if (inDestLen == 0)
+ return 0;
+
+ size_t nameLen = 0;
+
+ // empty loop intentional.
+ for (const TRHS *tempPtr = inWideStr; tempPtr && *tempPtr; ++tempPtr, ++nameLen) {
+ }
+
+ if (nameLen > inDestLen - 1)
+ nameLen = inDestLen - 1;
+ for (size_t idx = 0; idx < nameLen; ++idx)
+ inDest[idx] = (char)inWideStr[idx];
+ inDest[nameLen] = 0;
+ return nameLen;
+}
+
+inline size_t WideToNarrow(char *inDest, size_t inDestLen, const wchar_t *inWideStr)
+{
+ return ConvertStr(inDest, inDestLen, inWideStr);
+}
+
+template <unsigned int N>
+inline size_t WideToNarrow(char (&inDest)[N], const wchar_t *inWideStr)
+{
+ return WideToNarrow(inDest, N, inWideStr);
+}
+
+inline size_t WideToNarrow(char *inDest, size_t inDestLen, const char16_t *inWideStr)
+{
+ return ConvertStr(inDest, inDestLen, inWideStr);
+}
+
+template <unsigned int N>
+inline size_t WideToNarrow(char (&inDest)[N], const char16_t *inWideStr)
+{
+ return WideToNarrow(inDest, N, inWideStr);
+}
+
+#endif \ No newline at end of file
diff --git a/src/dm/systems/Qt3DSDMXML.cpp b/src/dm/systems/Qt3DSDMXML.cpp
new file mode 100644
index 0000000..2055adf
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMXML.cpp
@@ -0,0 +1,1253 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMXML.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSDMStringTable.h"
+#include "Qt3DSDMWStrOpsImpl.h"
+#include <memory>
+#include "foundation/StrConvertUTF.h"
+#include "foundation/StringTable.h"
+#ifdef QT3DS_VC
+#include <winsock2.h>
+#include <windows.h> //output debug string
+#endif
+
+#include <QtCore/qxmlstream.h>
+
+typedef char XML_Char;
+typedef char XML_LChar;
+
+using namespace qt3dsdm;
+using std::shared_ptr;
+using namespace qt3ds::foundation;
+using qt3ds::foundation::Pool;
+
+#define QT3DSXML_FOREACH(idxnm, val) \
+ for (QT3DSU32 idxnm = 0, __numItems = (QT3DSU32)val; idxnm < __numItems; ++idxnm)
+
+namespace qt3dsdm {
+
+// All names are string table values so we can do straight
+// pointer comparisons on them, we don't have the compare their
+// values.
+struct SDOMAttribute
+{
+ TXMLCharPtr m_Name;
+ TXMLCharPtr m_Value;
+ SDOMAttribute *m_NextAttribute;
+
+ SDOMAttribute(TXMLCharPtr nm, TXMLCharPtr val)
+ : m_Name(nm)
+ , m_Value(val)
+ , m_NextAttribute(NULL)
+ {
+ }
+};
+
+struct SDOMElement
+{
+ TXMLCharPtr m_Name;
+ SDOMAttribute *m_FirstAttribute;
+ SDOMAttribute *m_LastAttribute;
+ SDOMElement *m_Parent;
+ SDOMElement *m_FirstChild;
+ SDOMElement *m_LastChild;
+ SDOMElement *m_NextSibling;
+ TXMLCharPtr m_Value;
+
+ SDOMElement(TXMLCharPtr nm)
+ : m_Name(nm)
+ , m_FirstAttribute(NULL)
+ , m_LastAttribute(NULL)
+ , m_Parent(NULL)
+ , m_FirstChild(NULL)
+ , m_LastChild(NULL)
+ , m_NextSibling(NULL)
+ , m_Value("")
+ {
+ }
+
+ void AddAttribute(SDOMAttribute &att)
+ {
+ if (m_LastAttribute) {
+ m_LastAttribute->m_NextAttribute = &att;
+ m_LastAttribute = &att;
+ } else {
+ QT3DS_ASSERT(m_FirstAttribute == NULL);
+ m_FirstAttribute = m_LastAttribute = &att;
+ }
+ }
+ // Used to ensure duplicate attributes can't happen
+ void SetAttributeValue(TXMLCharPtr inName, TXMLCharPtr inValue, IDOMFactory &inFactory,
+ const SDOMFlags &inFlags)
+ {
+ inName = inFactory.GetStringTable()->RegisterStr(inName);
+ SDOMAttribute *att = FindAttribute(inName, inFlags);
+ if (att) {
+ att->m_Value = inFactory.RegisterValue(inValue);
+ } else {
+ AddAttribute(*inFactory.NextAttribute(inName, inValue));
+ }
+ }
+ void SetAttributeValue(TWideXMLCharPtr inName, TWideXMLCharPtr inValue, IDOMFactory &inFactory,
+ const SDOMFlags &inFlags)
+ {
+ TXMLCharPtr theName = inFactory.GetStringTable()->GetNarrowStr(inName);
+ SDOMAttribute *att = FindAttribute(theName, inFlags);
+ if (att) {
+ att->m_Value = inFactory.RegisterValue(inValue);
+ } else {
+ AddAttribute(
+ *inFactory.NextAttribute(inFactory.GetStringTable()->GetWideStr(inName), inValue));
+ }
+ }
+ const SDOMAttribute *FindAttribute(TXMLCharPtr nm, const SDOMFlags &inFlags) const
+ {
+ return const_cast<SDOMElement *>(this)->FindAttribute(nm, inFlags);
+ }
+ SDOMAttribute *FindAttribute(TXMLCharPtr nm, const SDOMFlags &inFlags)
+ {
+ for (SDOMAttribute *att = m_FirstAttribute; att != NULL; att = att->m_NextAttribute) {
+ if (att->m_Name == nm)
+ return att;
+ else if (inFlags.CaselessAttributes() && AreEqualCaseless(nm, att->m_Name))
+ return att;
+ }
+ return NULL;
+ }
+ void RemoveAttribute(TXMLCharPtr nm, const SDOMFlags &inFlags)
+ {
+ SDOMAttribute *preatt = m_FirstAttribute;
+ for (SDOMAttribute *att = m_FirstAttribute; att != NULL;
+ preatt = att, att = att->m_NextAttribute) {
+ if (att->m_Name == nm
+ || (inFlags.CaselessAttributes() && AreEqualCaseless(nm, att->m_Name))) {
+ if (att == m_FirstAttribute) {
+ m_FirstAttribute = att->m_NextAttribute;
+ } else {
+ preatt->m_NextAttribute = att->m_NextAttribute;
+ if (att == m_LastAttribute)
+ m_LastAttribute = preatt;
+ }
+
+ att->m_NextAttribute = NULL;
+ }
+ }
+ }
+ TXMLCharPtr GetAttributeValue(TXMLCharPtr nm, SDOMFlags &inFlags) const
+ {
+ const SDOMAttribute *att = FindAttribute(nm, inFlags);
+ if (att)
+ return att->m_Value;
+ return NULL;
+ }
+ void AddChild(SDOMElement &elem)
+ {
+ elem.m_Parent = this;
+ if (m_LastChild) {
+ m_LastChild->m_NextSibling = &elem;
+ m_LastChild = &elem;
+ } else {
+ QT3DS_ASSERT(m_FirstChild == NULL);
+ m_FirstChild = m_LastChild = &elem;
+ }
+ }
+ SDOMElement *FindPreviousChild(SDOMElement &elem)
+ {
+ if (&elem == m_FirstChild)
+ return NULL;
+ // Find the previous sibling.
+ SDOMElement *theChild = m_FirstChild;
+ // Empty loop intentional
+ for (; theChild && theChild->m_NextSibling != &elem; theChild = theChild->m_NextSibling) {
+ }
+
+ return theChild;
+ }
+ void RemoveChild(SDOMElement &elem)
+ {
+ if (elem.m_Parent != this) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ elem.m_Parent = NULL;
+ if (&elem == m_FirstChild) {
+ m_FirstChild = elem.m_NextSibling;
+ } else {
+ SDOMElement *theChild(FindPreviousChild(elem));
+ QT3DS_ASSERT(theChild);
+ if (theChild) {
+ theChild->m_NextSibling = elem.m_NextSibling;
+ if (&elem == m_LastChild)
+ m_LastChild = theChild;
+ }
+ }
+ elem.m_NextSibling = NULL;
+ }
+
+ void ReplaceChild(SDOMElement &inChild, SDOMElement &inReplacement)
+ {
+ inChild.m_Parent = NULL;
+ if (&inChild == m_FirstChild)
+ m_FirstChild = &inReplacement;
+ else {
+ SDOMElement *theChild(FindPreviousChild(inChild));
+ QT3DS_ASSERT(theChild);
+ if (theChild) {
+ theChild->m_NextSibling = &inReplacement;
+ if (&inChild == m_LastChild)
+ m_LastChild = &inReplacement;
+ }
+ }
+ inReplacement.m_NextSibling = inChild.m_NextSibling;
+ inReplacement.m_Parent = this;
+ inChild.m_NextSibling = NULL;
+ }
+
+ void InsertChildBefore(SDOMElement &elem, SDOMElement &theSibling)
+ {
+ // Ensure elem isn't in the graph.
+ QT3DS_ASSERT(elem.m_Parent == NULL);
+ QT3DS_ASSERT(elem.m_NextSibling == NULL);
+ elem.m_Parent = this;
+ if (&theSibling == m_FirstChild)
+ m_FirstChild = &elem;
+ else {
+ SDOMElement *thePrevious = FindPreviousChild(theSibling);
+ QT3DS_ASSERT(thePrevious);
+ if (thePrevious)
+ thePrevious->m_NextSibling = &elem;
+ }
+
+ elem.m_NextSibling = &theSibling;
+ }
+ QT3DSU32 GetNumChildren(TXMLCharPtr inChildName, const SDOMFlags &inFlags) const
+ {
+ QT3DSU32 idx = 0;
+ for (SDOMElement *elem = m_FirstChild; elem != NULL; elem = elem->m_NextSibling) {
+ if (elem->m_Name == inChildName)
+ ++idx;
+ else if (inFlags.CaselessElements() && AreEqualCaseless(inChildName, elem->m_Name))
+ ++idx;
+ }
+ return idx;
+ }
+ QT3DSU32 GetNumChildren() const
+ {
+ QT3DSU32 idx = 0;
+ for (SDOMElement *elem = m_FirstChild; elem != NULL; elem = elem->m_NextSibling)
+ ++idx;
+ return idx;
+ }
+ SDOMElement *FindChildByName(TXMLCharPtr nm, const SDOMFlags &inFlags) const
+ {
+ for (SDOMElement *elem = m_FirstChild; elem != NULL; elem = elem->m_NextSibling) {
+ if (elem->m_Name == nm)
+ return elem;
+ else if (inFlags.CaselessElements() && AreEqualCaseless(nm, elem->m_Name))
+ return elem;
+ }
+ return NULL;
+ }
+ SDOMElement *FindNextSiblingByName(TXMLCharPtr nm, const SDOMFlags &inFlags) const
+ {
+ for (SDOMElement *elem = m_NextSibling; elem != NULL; elem = elem->m_NextSibling) {
+ if (elem->m_Name == nm)
+ return elem;
+ else if (inFlags.CaselessElements() && AreEqualCaseless(nm, elem->m_Name))
+ return elem;
+ }
+ return NULL;
+ }
+};
+}
+
+namespace {
+
+const QT3DSU16 g_BOMMarker = (QT3DSU16)0xFEFF;
+
+struct SElemPointer : eastl::pair<SDOMElement *, SDOMAttribute *>
+{
+ SElemPointer(SDOMElement *elem = NULL)
+ : eastl::pair<SDOMElement *, SDOMAttribute *>(elem, NULL)
+ {
+ }
+ SElemPointer &operator=(SDOMElement *elem)
+ {
+ first = elem;
+ second = NULL;
+ return *this;
+ }
+ SElemPointer &operator=(SDOMAttribute *att)
+ {
+ second = att;
+ return *this;
+ }
+ SElemPointer &operator=(const eastl::pair<SDOMElement *, SDOMAttribute *> &other)
+ {
+ eastl::pair<SDOMElement *, SDOMAttribute *>::operator=(other);
+ return *this;
+ }
+ operator SDOMElement *() const { return first; }
+ SDOMElement *operator->() const { return first; }
+};
+
+// Some DOM parsing operations are destructive. If you need
+// them to not be destructive, then we need to modify
+// the reader. Specifically parsing lists of floats, due
+// to a bug in strtod, is destructive.
+struct SDOMReader : public IDOMReader
+{
+ SElemPointer m_TopElement;
+ eastl::vector<eastl::pair<SDOMElement *, SDOMAttribute *>> m_ScopeStack;
+ std::shared_ptr<IDOMFactory> m_Factory;
+ SDOMFlags m_Flags;
+ eastl::basic_string<TWCharEASTLConverter::TCharType> m_TempBuffer;
+
+ SDOMReader(SDOMElement &te, std::shared_ptr<qt3dsdm::IStringTable> s,
+ std::shared_ptr<IDOMFactory> inFactory = std::shared_ptr<IDOMFactory>())
+ : IDOMReader(s)
+ , m_TopElement(&te)
+ , m_Factory(inFactory)
+ {
+ }
+
+ SDOMElement *Current() const { return m_TopElement.first; }
+ void SetDOMFlags(SDOMFlags inFlags) override { m_Flags = inFlags; }
+ SDOMFlags GetDOMFlags() const override { return m_Flags; }
+
+ void PushScope() override { m_ScopeStack.push_back(m_TopElement); }
+ void PopScope() override
+ {
+ if (m_ScopeStack.size()) {
+ m_TopElement = m_ScopeStack.back();
+ m_ScopeStack.pop_back();
+ } else
+ m_TopElement = eastl::pair<SDOMElement *, SDOMAttribute *>(NULL, NULL);
+ }
+
+ void *GetScope() override { return m_TopElement.first; }
+
+ void SetScope(void *inScope) override
+ {
+ m_TopElement =
+ eastl::make_pair(reinterpret_cast<SDOMElement *>(inScope), (SDOMAttribute *)NULL);
+ }
+
+ TWideXMLCharPtr GetElementName() const override
+ {
+ return m_StringTable->GetWideStr(GetNarrowElementName());
+ }
+
+ TXMLCharPtr GetNarrowElementName() const override
+ {
+ if (!Current()) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ return Current()->m_Name;
+ }
+
+ bool UnregisteredAtt(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) override
+ {
+ outValue = L"";
+ SDOMElement *current(Current());
+ if (current) {
+ TXMLCharPtr theValue =
+ current->GetAttributeValue(m_StringTable->GetNarrowStr(name), m_Flags);
+ if (theValue && *theValue) {
+ qt3ds::foundation::ConvertUTF(theValue, 0, m_TempBuffer);
+ outValue = reinterpret_cast<const wchar_t *>(m_TempBuffer.c_str());
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+
+ bool UnregisteredAtt(TXMLCharPtr name, TXMLCharPtr &outValue) override
+ {
+ outValue = "";
+ SDOMElement *current(Current());
+ if (current) {
+ outValue = current->GetAttributeValue(m_StringTable->GetNarrowStr(name), m_Flags);
+ if (outValue)
+ return true;
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+
+ bool Att(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) override
+ {
+ if (UnregisteredAtt(name, outValue)) {
+ outValue = m_StringTable->RegisterStr(outValue);
+ return true;
+ }
+ return false;
+ }
+ bool Att(TXMLCharPtr name, TXMLCharPtr &outValue) override
+ {
+ if (UnregisteredAtt(name, outValue)) {
+ outValue = m_StringTable->RegisterStr(outValue);
+ return true;
+ }
+ return false;
+ }
+
+ QT3DSU32 CountChildren() override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ return elem->GetNumChildren();
+ }
+
+ QT3DSU32 CountChildren(TWideXMLCharPtr childName) override
+ {
+ return CountChildren(m_StringTable->GetNarrowStr(childName));
+ }
+
+ QT3DSU32 CountChildren(TXMLCharPtr childName) override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ return elem->GetNumChildren(m_StringTable->GetNarrowStr(childName), m_Flags);
+ }
+
+ eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr>
+ ToWide(const eastl::pair<TXMLCharPtr, TXMLCharPtr> &att)
+ {
+ return eastl::make_pair(m_StringTable->GetWideStr(att.first),
+ m_StringTable->GetWideStr(att.second));
+ }
+ eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> CurrentAtt()
+ {
+ return ToWide(CurrentAttNarrow());
+ }
+
+ eastl::pair<TXMLCharPtr, TXMLCharPtr> CurrentAttNarrow()
+ {
+ if (m_TopElement.second)
+ return eastl::make_pair(m_TopElement.second->m_Name, m_TopElement.second->m_Value);
+ return eastl::make_pair("", "");
+ }
+ eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowFirstAttribute() override
+ {
+ if (m_TopElement.first == NULL) {
+ QT3DS_ASSERT(false);
+ eastl::make_pair("", "");
+ }
+ m_TopElement.second = m_TopElement.first->m_FirstAttribute;
+ return CurrentAttNarrow();
+ }
+
+ eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetFirstAttribute() override
+ {
+ return ToWide(GetNarrowFirstAttribute());
+ }
+ eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowNextAttribute() override
+ {
+ if (m_TopElement.second)
+ m_TopElement.second = m_TopElement.second->m_NextAttribute;
+ return CurrentAttNarrow();
+ }
+
+ eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetNextAttribute() override
+ {
+ return ToWide(GetNarrowNextAttribute());
+ }
+
+ bool MoveToFirstChild() override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ if (elem->m_FirstChild) {
+ m_TopElement = elem->m_FirstChild;
+ return true;
+ }
+ return false;
+ }
+ bool MoveToFirstChild(TXMLCharPtr childName) override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ SDOMElement *child = elem->FindChildByName(m_StringTable->RegisterStr(childName), m_Flags);
+ if (child != NULL) {
+ m_TopElement = child;
+ return true;
+ }
+ return false;
+ }
+
+ bool MoveToFirstChild(TWideXMLCharPtr childName) override
+ {
+ return MoveToFirstChild(m_StringTable->GetNarrowStr(childName));
+ }
+
+ bool MoveToNextSibling() override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ if (elem->m_NextSibling) {
+ m_TopElement = elem->m_NextSibling;
+ return true;
+ }
+ return false;
+ }
+ bool MoveToNextSibling(TXMLCharPtr childName) override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ SDOMElement *nextSibling =
+ elem->FindNextSiblingByName(m_StringTable->RegisterStr(childName), m_Flags);
+ if (nextSibling) {
+ m_TopElement = nextSibling;
+ return true;
+ }
+ return false;
+ }
+ bool MoveToNextSibling(TWideXMLCharPtr childName) override
+ {
+ return MoveToNextSibling(m_StringTable->GetNarrowStr(childName));
+ }
+ // Leave element means go to its parent.
+ void Leave() override
+ {
+ if (m_TopElement)
+ m_TopElement = m_TopElement->m_Parent;
+
+ QT3DS_ASSERT(m_TopElement);
+ }
+ bool Value(TXMLCharPtr &outValue) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ outValue = current->m_Value;
+ return true;
+ }
+
+ bool Value(TWideXMLCharPtr &outValue) override
+ {
+ outValue = L"";
+ TXMLCharPtr theValue;
+ if (Value(theValue)) {
+ qt3ds::foundation::ConvertUTF(theValue, 0, m_TempBuffer);
+ outValue = reinterpret_cast<const wchar_t *>(m_TempBuffer.c_str());
+ return true;
+ }
+ return false;
+ }
+
+ SDOMElement *GetTopElement() override
+ {
+ SDOMElement *current(Current());
+ while (current && current->m_Parent)
+ current = current->m_Parent;
+ return current;
+ }
+
+ virtual std::shared_ptr<IDOMFactory> GetFactory() { return m_Factory; }
+};
+
+struct SDOMWriter : public IDOMWriter, public SDOMReader
+{
+ std::shared_ptr<IDOMFactory> m_FactoryPtr;
+ IDOMFactory &m_Factory;
+
+ SDOMWriter(std::shared_ptr<IDOMFactory> inDOMFactory,
+ std::shared_ptr<qt3dsdm::IStringTable> inStringTable, SDOMElement &inTopElem)
+ : m_FactoryPtr(inDOMFactory)
+ , m_Factory(*inDOMFactory)
+ , SDOMReader(inTopElem, inStringTable)
+ {
+ }
+ void SetDOMFlags(SDOMFlags inFlags) override { m_Flags = inFlags; }
+ SDOMFlags GetDOMFlags() const override { return m_Flags; }
+
+ void Begin(TXMLCharPtr inElemName) override
+ {
+ if (!m_TopElement) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SDOMElement *current(Current());
+ SDOMElement *newElement(m_Factory.NextElement(inElemName));
+ current->AddChild(*newElement);
+ m_TopElement = newElement;
+ }
+
+ void Begin(TWideXMLCharPtr inElemName) override
+ {
+ Begin(m_FactoryPtr->GetStringTable()->GetNarrowStr(inElemName));
+ }
+
+ void Att(TXMLCharPtr name, TXMLCharPtr value) override
+ {
+ if (!m_TopElement) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ m_TopElement->SetAttributeValue(name, value, m_Factory, m_Flags);
+ }
+ // Attributes. They may be sorted just before write
+ void Att(TWideXMLCharPtr name, TWideXMLCharPtr value) override
+ {
+ if (!m_TopElement) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ m_TopElement->SetAttributeValue(name, value, m_Factory, m_Flags);
+ }
+
+ void Value(TWideXMLCharPtr value) override
+ {
+ if (!m_TopElement) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (value == NULL)
+ value = L"";
+ size_t len = wcslen(value);
+ m_Factory.AppendStrBuf(value, (QT3DSU32)len);
+ m_TopElement->m_Value = m_Factory.FinalizeStrBuf();
+ }
+ void Value(TXMLCharPtr value) override
+ {
+ if (!m_TopElement) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (value == NULL)
+ value = "";
+ size_t len = strlen(value);
+ m_Factory.AppendStrBuf(value, (QT3DSU32)len);
+ m_TopElement->m_Value = m_Factory.FinalizeStrBuf();
+ }
+
+ void End() override
+ {
+ if (!m_TopElement) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ Leave();
+ }
+ void RemoveCurrent() override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (current->m_Parent) {
+ m_TopElement = current->m_Parent;
+ m_TopElement->RemoveChild(*current);
+ }
+ }
+ void ReplaceCurrent(SDOMElement &inElement) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (current->m_Parent) {
+ current->m_Parent->ReplaceChild(*current, inElement);
+ m_TopElement = &inElement;
+ } else {
+ m_TopElement = &inElement;
+ inElement.m_Parent = NULL;
+ inElement.m_NextSibling = NULL;
+ }
+ }
+ void AppendChildren(SDOMElement &inElement) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SDOMElement *theChild = inElement.m_FirstChild;
+ inElement.m_FirstChild = inElement.m_LastChild = NULL;
+ while (theChild) {
+ SDOMElement *theCurrentChild = theChild;
+ theChild = theChild->m_NextSibling;
+
+ theCurrentChild->m_Parent = NULL;
+ theCurrentChild->m_NextSibling = NULL;
+ current->AddChild(*theCurrentChild);
+ }
+ }
+ void RemoveAttribute(TXMLCharPtr inItem) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ current->RemoveAttribute(m_StringTable->RegisterStr(inItem), m_Flags);
+ }
+ void RemoveAttribute(TWideXMLCharPtr inItem) override
+ {
+ RemoveAttribute(m_StringTable->GetNarrowStr(inItem));
+ }
+
+ void MoveBefore(TXMLCharPtr inItem, TXMLCharPtr inSibling) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ SDOMElement *theItem =
+ current->FindChildByName(m_StringTable->RegisterStr(inItem), m_Flags);
+ SDOMElement *theSibling =
+ current->FindChildByName(m_StringTable->RegisterStr(inSibling), m_Flags);
+ QT3DS_ASSERT(theItem && theSibling);
+ if (theItem && theSibling) {
+ current->RemoveChild(*theItem);
+ current->InsertChildBefore(*theItem, *theSibling);
+ }
+ }
+
+ void MoveBefore(TWideXMLCharPtr inItem, TWideXMLCharPtr inSibling) override
+ {
+ MoveBefore(m_StringTable->GetNarrowStr(inItem), m_StringTable->GetNarrowStr(inSibling));
+ }
+
+ // If current has no parent, then we are at the top
+ // of the tree and we should return 0. Or if there is no
+ // current.
+ // If there is one parent, we should return 1.
+ QT3DSU32 GetTabs() override
+ {
+ QT3DSU32 retval = 0;
+ SDOMElement *current(Current());
+ do {
+ if (current)
+ current = current->m_Parent;
+ if (current)
+ ++retval;
+ } while (current);
+ return retval;
+ }
+
+ SDOMElement *GetTopElement() override { return SDOMReader::GetTopElement(); }
+
+ std::shared_ptr<IDOMFactory> GetFactory() override { return m_FactoryPtr; }
+};
+
+struct SimpleXmlWriter
+{
+ IOutStream &m_Stream;
+ eastl::vector<eastl::pair<TXMLCharPtr, bool>> m_OpenElements;
+ bool m_ElementOpen;
+ wchar_t m_PrintBuf[256];
+ QT3DSU32 m_Tabs;
+ eastl::basic_string<char8_t> m_ConvertBuf;
+ eastl::basic_string<TWCharEASTLConverter::TCharType> m_WideBuffer;
+
+ SimpleXmlWriter(IOutStream &stream, QT3DSU32 inTabs = 0)
+ : m_Stream(stream)
+ , m_ElementOpen(false)
+ , m_Tabs(inTabs)
+ {
+ }
+ void Write(TWideXMLCharPtr data)
+ {
+ if (!IsTrivial(data)) {
+ qt3ds::foundation::ConvertUTF(
+ reinterpret_cast<const TWCharEASTLConverter::TCharType *>(data), 0,
+ m_ConvertBuf);
+ m_Stream.Write(m_ConvertBuf.begin(), m_ConvertBuf.size());
+ }
+ }
+ void Write(const char8_t *data)
+ {
+ if (!IsTrivial(data)) {
+ m_Stream.Write(data, (QT3DSU32)strlen(data));
+ }
+ }
+ void BeginWideWrite() { m_WideBuffer.clear(); }
+ void WriteTemp(wchar_t data) { m_WideBuffer.append(1, data); }
+ void WriteTemp(const wchar_t *data)
+ {
+ m_WideBuffer.append(reinterpret_cast<const TWCharEASTLConverter::TCharType *>(data));
+ }
+ void EndWideWrite() { Write(reinterpret_cast<const wchar_t *>(m_WideBuffer.c_str())); }
+ void Write(char8_t data) { m_Stream.Write(data); }
+ void Tabs()
+ {
+ QT3DSXML_FOREACH(idx, (m_OpenElements.size() + m_Tabs))
+ Write('\t');
+ }
+ void Close(bool newline)
+ {
+ if (m_ElementOpen) {
+ Write(L" >");
+ if (newline)
+ Write('\n');
+ }
+ m_ElementOpen = false;
+ }
+ void Begin(TXMLCharPtr name)
+ {
+ Close(true);
+ Tabs();
+ Write('<');
+ Write(name);
+ m_OpenElements.push_back(eastl::pair<TXMLCharPtr, bool>(name, false));
+ m_ElementOpen = true;
+ }
+ TWideXMLCharPtr ToStr(char8_t val)
+ {
+ m_PrintBuf[0] = val;
+ m_PrintBuf[1] = 0;
+ return m_PrintBuf;
+ }
+ template <typename TDataType>
+ TWideXMLCharPtr ToStr(TDataType val)
+ {
+ WStrOps<TDataType>().ToStr(val, NVDataRef<wchar_t>(m_PrintBuf, 256));
+ return m_PrintBuf;
+ }
+ void Att(TXMLCharPtr name, TXMLCharPtr value)
+ {
+ QT3DS_ASSERT(m_ElementOpen);
+ Write(' ');
+ Write(name);
+ Write("=\"");
+ QString str = QString::fromUtf8(nonNull(value)).toHtmlEscaped();
+ Write(str.toUtf8().constData());
+ Write("\"");
+ }
+ template <typename TData>
+ void Att(TXMLCharPtr name, TData value)
+ {
+ Att(name, ToStr(value));
+ }
+
+ void Value(TXMLCharPtr value)
+ {
+ if (!IsTrivial(value)) {
+ Close(false);
+ QString str = QString::fromUtf8(nonNull(value)).toHtmlEscaped();
+ Write(str.toUtf8().constData());
+ m_OpenElements.back().second = true;
+ }
+ }
+ void ChildValue(TXMLCharPtr name, TXMLCharPtr value)
+ {
+ Begin(name);
+ Value(value);
+ End();
+ }
+ void End(bool newlineAfterClose = true)
+ {
+ QT3DS_ASSERT(m_OpenElements.size());
+ eastl::pair<TXMLCharPtr, bool> topElem = m_OpenElements.back();
+ m_OpenElements.pop_back();
+ if (m_ElementOpen)
+ Write(" />");
+ else {
+ if (topElem.second == false)
+ Tabs();
+ Write("</");
+ Write(topElem.first);
+ Write(">");
+ }
+ m_ElementOpen = false;
+ if (newlineAfterClose == true)
+ Write('\n');
+ }
+};
+
+struct DOMParser
+{
+ typedef eastl::basic_string<TWCharEASTLConverter::TCharType> TStrType;
+ IDOMFactory &m_Factory;
+ SDOMElement *m_TopElement;
+ SDOMElement *m_FirstElement;
+
+ DOMParser(IDOMFactory &factory)
+ : m_Factory(factory)
+ , m_FirstElement(NULL)
+ {
+ }
+
+ template <QT3DSU32 THeaderLen>
+ struct SHeaderInStream : public IInStream
+ {
+ QT3DSU8 m_Header[THeaderLen];
+ QT3DSU32 m_BytesRead;
+ IInStream &m_InStream;
+ SHeaderInStream(IInStream &inStream)
+ : m_InStream(inStream)
+ , m_BytesRead(0)
+ {
+ }
+ bool readHeader()
+ {
+ QT3DSU32 amountRead = m_InStream.Read(NVDataRef<QT3DSU8>(m_Header, THeaderLen));
+ return amountRead == THeaderLen;
+ }
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override
+ {
+ if (data.size() == 0)
+ return 0;
+ QT3DSU8 *writePtr(data.begin());
+ QT3DSU32 amountToRead(data.size());
+ QT3DSU32 amountRead = 0;
+ if (m_BytesRead < THeaderLen) {
+ QT3DSU32 headerLeft = qMin(THeaderLen - m_BytesRead, amountToRead);
+ memCopy(writePtr, m_Header + m_BytesRead, headerLeft);
+ writePtr += headerLeft;
+ amountToRead -= headerLeft;
+ amountRead += headerLeft;
+ }
+ if (amountToRead)
+ amountRead += m_InStream.Read(NVDataRef<QT3DSU8>(writePtr, amountToRead));
+ m_BytesRead += amountRead;
+ return amountRead;
+ }
+ };
+
+ static SDOMElement *ParseXMLFile(IDOMFactory &factory, IInStream &inStream,
+ CXmlErrorHandler *handler = NULL)
+ {
+ QXmlStreamReader sreader;
+
+ DOMParser domParser(factory);
+ QT3DSU8 dataBuf[2048];
+ QT3DSU32 amountRead = 0;
+ do {
+ amountRead = inStream.Read(toDataRef(dataBuf, 2048));
+ if (amountRead) {
+ QByteArray tmp = QByteArray::fromRawData((char*)dataBuf,amountRead);
+ sreader.addData(tmp);
+ }
+ } while (amountRead > 0);
+
+ while (!sreader.atEnd()) {
+ QXmlStreamReader::TokenType token = sreader.readNext();
+
+ if (token == QXmlStreamReader::StartElement) {
+ domParser.m_Factory.IgnoreStrBuf();
+ SDOMElement *newElem = domParser.m_Factory.NextElement(
+ (TXMLCharPtr)sreader.name().toUtf8().data());
+ if (domParser.m_FirstElement == NULL) {
+ domParser.m_FirstElement = newElem;
+ domParser.m_TopElement = newElem;
+ } else {
+ domParser.m_TopElement->AddChild(*newElem);
+ domParser.m_TopElement = newElem;
+ }
+ const QXmlStreamAttributes& attributes = sreader.attributes();
+ for (auto attrib : attributes) {
+ SDOMAttribute *att = domParser.m_Factory.NextAttribute(
+ (TXMLCharPtr)attrib.name().toUtf8().data(),
+ (TXMLCharPtr)attrib.value().toUtf8().data());
+ newElem->AddAttribute(*att);
+ }
+ } else if (token == QXmlStreamReader::Characters) {
+ QByteArray text = sreader.text().toUtf8();
+ domParser.m_Factory.AppendStrBuf(text.data(),text.length());
+ } else if (token == QXmlStreamReader::EndElement) {
+ domParser.m_TopElement->m_Value = domParser.m_Factory.FinalizeStrBuf();
+ domParser.m_TopElement = domParser.m_TopElement->m_Parent;
+ }
+ if (sreader.hasError()) {
+ if (handler) {
+ handler->OnXmlError(sreader.errorString(), sreader.lineNumber(),
+ sreader.columnNumber());
+ } else {
+ qWarning() << "XML parse error:" << sreader.errorString()
+ << "line:" << sreader.lineNumber()
+ << "column:" << sreader.columnNumber();
+ }
+ return nullptr;
+ }
+ }
+ return domParser.m_FirstElement;
+ }
+};
+
+class SimpleDomFactory : public IDOMFactory
+{
+ typedef eastl::basic_string<char8_t> TNarrowStr;
+ Pool<SDOMElement> m_ElementPool;
+ Pool<SDOMAttribute> m_AttributePool;
+ eastl::vector<char8_t *> m_BigStrings;
+ eastl::vector<char8_t> m_StringBuilder;
+ TNarrowStr m_ConvertBuffer;
+ std::shared_ptr<qt3dsdm::IStringTable> m_StringTable;
+
+public:
+ SimpleDomFactory(std::shared_ptr<qt3dsdm::IStringTable> strt)
+ : m_StringTable(strt)
+ {
+ }
+ ~SimpleDomFactory()
+ {
+ QT3DSXML_FOREACH(idx, m_BigStrings.size())
+ free(m_BigStrings[idx]);
+ }
+
+ TWideXMLCharPtr RegisterStr(TWideXMLCharPtr str)
+ {
+ if (str == NULL || *str == 0)
+ return L"";
+ return m_StringTable->RegisterStr(str);
+ }
+
+ TXMLCharPtr RegisterStr(TXMLCharPtr str)
+ {
+ if (str == NULL || *str == 0)
+ return "";
+ return m_StringTable->RegisterStr(str);
+ }
+
+ void Release() override { delete this; }
+ void AppendStrBuf(TXMLCharPtr str, QT3DSU32 len) override
+ {
+ if (len && *str) {
+ QT3DSU32 offset = m_StringBuilder.size();
+ m_StringBuilder.resize(offset + len);
+ memCopy(&m_StringBuilder[0] + offset, str, len * sizeof(char8_t));
+ }
+ }
+ // Str does not need to be null terminated.
+ void AppendStrBuf(TWideXMLCharPtr str, QT3DSU32 len) override
+ {
+ if (len && *str) {
+ const TWCharEASTLConverter::TCharType *bufPtr =
+ reinterpret_cast<const TWCharEASTLConverter::TCharType *>(str);
+ qt3ds::foundation::ConvertUTF(bufPtr, len, m_ConvertBuffer);
+ AppendStrBuf(m_ConvertBuffer.data(), m_ConvertBuffer.size());
+ }
+ }
+
+ // Null terminate what is there and return the buffer.
+ // This pointer needs to be persistent.
+ TXMLCharPtr FinalizeStrBuf() override
+ {
+ if (m_StringBuilder.size() == 0)
+ return "";
+ m_StringBuilder.push_back(0);
+ QT3DSU32 len = m_StringBuilder.size();
+ QT3DSU32 numBytes = len * sizeof(char8_t);
+ char8_t *newMem = (char8_t *)malloc(numBytes);
+ memCopy(newMem, &m_StringBuilder[0], numBytes);
+ m_BigStrings.push_back(newMem);
+ m_StringBuilder.clear();
+ return newMem;
+ }
+ void IgnoreStrBuf() override { m_StringBuilder.clear(); }
+
+ SDOMAttribute *NextAttribute(TXMLCharPtr name, TXMLCharPtr val) override
+ {
+ TXMLCharPtr n(m_StringTable->GetNarrowStr(name));
+ TXMLCharPtr v(RegisterValue(val));
+ return m_AttributePool.construct(n, v, __FILE__, __LINE__);
+ }
+
+ SDOMAttribute *NextAttribute(TWideXMLCharPtr name, TWideXMLCharPtr val) override
+ {
+ TXMLCharPtr n(m_StringTable->GetNarrowStr(name));
+ TXMLCharPtr v(RegisterValue(val));
+ return m_AttributePool.construct(n, v, __FILE__, __LINE__);
+ }
+
+ SDOMElement *NextElement(TXMLCharPtr name) override
+ {
+ IgnoreStrBuf();
+ TXMLCharPtr n(m_StringTable->GetNarrowStr(name));
+ return m_ElementPool.construct(n, __FILE__, __LINE__);
+ }
+ SDOMElement *NextElement(TWideXMLCharPtr name) override
+ {
+ IgnoreStrBuf();
+ TXMLCharPtr n(m_StringTable->GetNarrowStr(name));
+ return m_ElementPool.construct(n, __FILE__, __LINE__);
+ }
+
+ std::shared_ptr<qt3dsdm::IStringTable> GetStringTable() override { return m_StringTable; }
+};
+}
+
+bool IDOMReader::Value(DataModelDataType::Value type, SValue &outValue)
+{
+ TXMLCharPtr value;
+ if (Value(value)) {
+ WCharTReader reader(const_cast<char8_t *>(value), m_TempBuf, *GetStringTable());
+ outValue = WStrOps<SValue>().BufTo(type, reader);
+ return true;
+ }
+ return false;
+}
+
+std::shared_ptr<IDOMReader>
+IDOMReader::CreateDOMReader(SDOMElement &inRootElement,
+ std::shared_ptr<qt3dsdm::IStringTable> inStringTable,
+ std::shared_ptr<IDOMFactory> inFactory)
+{
+ return std::make_shared<SDOMReader>(std::ref(inRootElement), std::ref(inStringTable),
+ inFactory);
+}
+
+eastl::pair<std::shared_ptr<IDOMWriter>, std::shared_ptr<IDOMReader>>
+IDOMWriter::CreateDOMWriter(std::shared_ptr<IDOMFactory> inFactory, SDOMElement &inRootElement,
+ std::shared_ptr<qt3dsdm::IStringTable> inStringTable)
+{
+ std::shared_ptr<SDOMWriter> writer(std::make_shared<SDOMWriter>(
+ inFactory, std::ref(inStringTable), std::ref(inRootElement)));
+ return eastl::make_pair(writer, writer);
+}
+
+TXMLCharPtr IDOMFactory::RegisterValue(TWideXMLCharPtr inValue)
+{
+ if (IsTrivial(inValue))
+ return "";
+ IgnoreStrBuf();
+ AppendStrBuf(inValue, (QT3DSU32)wcslen(inValue));
+ return FinalizeStrBuf();
+}
+
+TXMLCharPtr IDOMFactory::RegisterValue(TXMLCharPtr inValue)
+{
+ if (IsTrivial(inValue))
+ return "";
+ IgnoreStrBuf();
+ AppendStrBuf(inValue, (QT3DSU32)strlen(inValue));
+ return FinalizeStrBuf();
+}
+
+std::shared_ptr<IDOMFactory>
+IDOMFactory::CreateDOMFactory(std::shared_ptr<qt3dsdm::IStringTable> inStrTable)
+{
+ return std::make_shared<SimpleDomFactory>(std::ref(inStrTable));
+}
+
+void CDOMSerializer::WriteXMLHeader(IOutStream &inStream)
+{
+ SimpleXmlWriter writer(inStream);
+ writer.Write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
+}
+
+// Lexigraphically sort the attributes.
+struct SAttributeComparator
+{
+ bool operator()(const SDOMAttribute *lhs, const SDOMAttribute *rhs)
+ {
+ return strcmp(lhs->m_Name, rhs->m_Name) < 0;
+ }
+};
+
+// Write an element with attributes sorted by name so a file diff is effective.
+void WriteElement(SDOMElement &inElement, SimpleXmlWriter &inWriter,
+ std::vector<SDOMAttribute *> &inAttSorter)
+{
+ inAttSorter.clear();
+ for (SDOMAttribute *att = inElement.m_FirstAttribute; att; att = att->m_NextAttribute)
+ inAttSorter.push_back(att);
+ // We decided that we don't want attribute sorting; the code that adds attributes needs
+ // to be consistent.
+ // std::sort( inAttSorter.begin(), inAttSorter.end(), SAttributeComparator() );
+ // This element doesn't add anything to the system in this case.
+ if (inElement.m_FirstAttribute == NULL && inElement.m_FirstChild == NULL
+ && IsTrivial(inElement.m_Value))
+ return;
+
+ inWriter.Begin(inElement.m_Name);
+
+ const char8_t *theLastAttName = 0;
+ for (size_t idx = 0, end = inAttSorter.size(); idx < end; ++idx) {
+ SDOMAttribute *theAtt(inAttSorter[idx]);
+ if (theAtt->m_Name != theLastAttName)
+ inWriter.Att(theAtt->m_Name, theAtt->m_Value);
+ else {
+ QT3DS_ASSERT(false);
+ }
+ theLastAttName = theAtt->m_Name;
+ }
+ // Elements can either have children or values but not both at this point.
+ if (inElement.m_FirstChild) {
+ for (SDOMElement *theChild = inElement.m_FirstChild; theChild;
+ theChild = theChild->m_NextSibling)
+ WriteElement(*theChild, inWriter, inAttSorter);
+ inWriter.End();
+ } else {
+ if (!IsTrivial(inElement.m_Value))
+ inWriter.Value(inElement.m_Value);
+
+ inWriter.End();
+ }
+}
+
+void CDOMSerializer::Write(SDOMElement &inElement, IOutStream &inStream, QT3DSU32 inTabs)
+{
+ // TODO: QXmlStreamWriter here?
+ std::vector<SDOMAttribute *> theAttributes;
+ SimpleXmlWriter writer(inStream, inTabs);
+ std::vector<SDOMAttribute *> theAttSorter;
+ WriteElement(inElement, writer, theAttSorter);
+}
+
+SDOMElement *CDOMSerializer::Read(IDOMFactory &inFactory, IInStream &inStream,
+ CXmlErrorHandler *inErrorHandler)
+{
+ return DOMParser::ParseXMLFile(inFactory, inStream, inErrorHandler);
+}
diff --git a/src/dm/systems/Qt3DSDMXML.h b/src/dm/systems/Qt3DSDMXML.h
new file mode 100644
index 0000000..5fe722f
--- /dev/null
+++ b/src/dm/systems/Qt3DSDMXML.h
@@ -0,0 +1,506 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_IMPORT_XML_H
+#define QT3DS_IMPORT_XML_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "Qt3DSDMDataTypes.h"
+#include <string>
+#include "Qt3DSDMWStrOps.h" //Conversion between string and various datatypes.
+#include "foundation/Qt3DSFlags.h"
+#include "EASTL/algorithm.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/IOStreams.h"
+#include "Qt3DSDMValue.h"
+#include <memory>
+
+namespace qt3dsdm {
+using qt3ds::foundation::MemoryBuffer;
+using qt3ds::foundation::RawAllocator;
+class IStringTable;
+
+class IDOMFactory;
+struct SDOMAttribute;
+struct SDOMElement;
+
+typedef const char8_t *TXMLCharPtr;
+typedef const wchar_t *TWideXMLCharPtr;
+
+typedef TCharStr TXMLWideStr;
+typedef eastl::basic_string<char8_t> TXMLStr;
+
+using qt3ds::QT3DSU32;
+using qt3ds::NVFlags;
+using qt3ds::foundation::NVDataRef;
+using qt3ds::foundation::NVConstDataRef;
+using qt3ds::foundation::IOutStream;
+
+class IDOMFactory
+{
+protected:
+ virtual ~IDOMFactory() {}
+public:
+ friend class std::shared_ptr<IDOMFactory>;
+
+ virtual void Release() = 0;
+ // Str does not need to be null terminated.
+ virtual void AppendStrBuf(TXMLCharPtr str, QT3DSU32 len) = 0;
+ virtual void AppendStrBuf(TWideXMLCharPtr str, QT3DSU32 len) = 0;
+ // Null terminate what is there and return the buffer.
+ // This pointer needs to be persistent.
+ virtual TXMLCharPtr FinalizeStrBuf() = 0;
+ virtual void IgnoreStrBuf() = 0;
+
+ virtual std::shared_ptr<IStringTable> GetStringTable() = 0;
+
+ virtual SDOMAttribute *NextAttribute(TWideXMLCharPtr name, TWideXMLCharPtr val) = 0;
+ virtual SDOMElement *NextElement(TWideXMLCharPtr name) = 0;
+
+ virtual SDOMAttribute *NextAttribute(TXMLCharPtr name, TXMLCharPtr val) = 0;
+ virtual SDOMElement *NextElement(TXMLCharPtr name) = 0;
+
+ TXMLCharPtr RegisterValue(TXMLCharPtr inValue);
+ TXMLCharPtr RegisterValue(TWideXMLCharPtr inValue);
+
+ static std::shared_ptr<IDOMFactory>
+ CreateDOMFactory(std::shared_ptr<IStringTable> inStrTable);
+};
+
+struct DOMFlagValues
+{
+ enum Enum {
+ CaselessElementNames = 1 << 0,
+ CaselessAttributeNames = 1 << 1,
+ };
+};
+
+struct SDOMFlags : NVFlags<DOMFlagValues::Enum, int>
+{
+ SDOMFlags()
+ : NVFlags<DOMFlagValues::Enum, int>(DOMFlagValues::CaselessElementNames
+ | DOMFlagValues::CaselessAttributeNames)
+ {
+ }
+ bool CaselessAttributes() const { return *this & DOMFlagValues::CaselessAttributeNames; }
+ bool CaselessElements() const { return *this & DOMFlagValues::CaselessElementNames; }
+};
+
+class IDOMReader
+{
+protected:
+ virtual ~IDOMReader() {}
+public:
+ friend class std::shared_ptr<IDOMReader>;
+
+ // Stack object to save the reader's state.
+ struct Scope
+ {
+ IDOMReader &m_Reader;
+ Scope(IDOMReader &reader)
+ : m_Reader(reader)
+ {
+ m_Reader.PushScope();
+ }
+ ~Scope() { m_Reader.PopScope(); }
+ };
+
+ // Parse buffer
+ MemoryBuffer<RawAllocator> m_TempBuf;
+ std::shared_ptr<IStringTable> m_StringTable;
+
+ IDOMReader(std::shared_ptr<IStringTable> inStringTable)
+ : m_StringTable(inStringTable)
+ {
+ }
+
+ std::shared_ptr<IStringTable> GetStringTable() { return m_StringTable; }
+
+ // DOM reader flags change the nature of the DOM reader.
+ // see DOMFlagValues
+ // Defaults to caseless comparisons for attributes and for
+ // element names.
+ virtual void SetDOMFlags(SDOMFlags inFlags) = 0;
+ virtual SDOMFlags GetDOMFlags() const = 0;
+
+ // Pushing scope saves your state so no matter where you are when
+ // you next pop scope, you come back to the same state.
+ virtual void PushScope() = 0;
+ virtual void PopScope() = 0;
+
+ // Sometimes pushing and popping scope isn't enough and you need
+ // somewhat random access to scope.
+ // This scope does not remember the current attribute.
+ virtual void *GetScope() = 0;
+ virtual void SetScope(void *inScope) = 0;
+ // Return an attribute whose value is *not* registered with the string table.
+ // You can't hold onto this value for any length of time, but when you need to
+ // immediately convert to a different value this is the most efficient way.
+ virtual bool UnregisteredAtt(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) = 0;
+ virtual bool UnregisteredAtt(TXMLCharPtr name, TXMLCharPtr &outValue) = 0;
+ // Return an attribute whose value *is* registered with the string table.
+ virtual bool Att(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) = 0;
+ virtual bool Att(TXMLCharPtr name, TXMLCharPtr &outValue) = 0;
+ virtual eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetFirstAttribute() = 0;
+ virtual eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetNextAttribute() = 0;
+ virtual eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowFirstAttribute() = 0;
+ virtual eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowNextAttribute() = 0;
+ virtual QT3DSU32 CountChildren() = 0;
+ virtual QT3DSU32 CountChildren(TWideXMLCharPtr childName) = 0;
+ virtual QT3DSU32 CountChildren(TXMLCharPtr childName) = 0;
+ virtual bool MoveToFirstChild(TWideXMLCharPtr childName) = 0;
+ virtual bool MoveToFirstChild(TXMLCharPtr childName) = 0;
+ virtual bool MoveToFirstChild() = 0;
+ virtual bool MoveToNextSibling(TWideXMLCharPtr siblingName) = 0;
+ virtual bool MoveToNextSibling(TXMLCharPtr siblingName) = 0;
+ virtual bool MoveToNextSibling() = 0;
+ // Leave element means go to its parent.
+ virtual void Leave() = 0;
+ virtual TWideXMLCharPtr GetElementName() const = 0;
+ virtual TXMLCharPtr GetNarrowElementName() const = 0;
+
+ // Value is the concatentated text node values inside the element
+ virtual bool Value(TWideXMLCharPtr &outValue) = 0;
+ virtual bool Value(TXMLCharPtr &outValue) = 0;
+
+ // Get the element this reader was created with
+ virtual SDOMElement *GetTopElement() = 0;
+
+ bool Att(TWideXMLCharPtr name, TXMLWideStr &outValue)
+ {
+ TWideXMLCharPtr temp;
+ if (UnregisteredAtt(name, temp)) {
+ outValue.assign(temp);
+ return true;
+ }
+ return false;
+ }
+
+ bool Att(TXMLCharPtr name, TXMLStr &outValue)
+ {
+ TXMLCharPtr temp;
+ if (UnregisteredAtt(name, temp)) {
+ outValue.assign(temp);
+ return true;
+ }
+ return false;
+ }
+
+ // Helpers to help make the parsing a bit easier.
+ template <typename TDataType>
+ bool Att(TWideXMLCharPtr name, TDataType &outValue)
+ {
+ TWideXMLCharPtr temp;
+ if (UnregisteredAtt(name, temp)) {
+ WStrOps<TDataType>().StrTo(temp, outValue);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ template <typename TDataType>
+ bool Att(TXMLCharPtr name, TDataType &outValue)
+ {
+ TXMLCharPtr temp;
+ if (UnregisteredAtt(name, temp)) {
+ WStrOps<TDataType>().StrTo(temp, outValue);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ bool ChildValue(TXMLCharPtr name, TXMLCharPtr &value)
+ {
+ if (MoveToFirstChild(name)) {
+ Value(value);
+ Leave();
+ return true;
+ }
+ return false;
+ }
+
+ bool ChildValue(TWideXMLCharPtr name, TWideXMLCharPtr &value)
+ {
+ if (MoveToFirstChild(name)) {
+ Value(value);
+ Leave();
+ return true;
+ }
+ return false;
+ }
+
+ bool RegisteredChildValue(TWideXMLCharPtr name, TWideXMLCharPtr &value)
+ {
+ if (MoveToFirstChild(name)) {
+ RegisteredValue(value);
+ Leave();
+ return true;
+ }
+ return false;
+ }
+ bool RegisteredChildValue(TXMLCharPtr name, TXMLCharPtr &value)
+ {
+ if (MoveToFirstChild(name)) {
+ RegisteredValue(value);
+ Leave();
+ return true;
+ }
+ return false;
+ }
+ bool RegisteredValue(TWideXMLCharPtr &outValue)
+ {
+ bool retval = Value(outValue);
+ if (retval)
+ outValue = m_StringTable->RegisterStr(outValue);
+ return retval;
+ }
+ bool RegisteredValue(TXMLCharPtr &outValue)
+ {
+ bool retval = Value(outValue);
+ if (retval)
+ outValue = m_StringTable->RegisterStr(outValue);
+ return retval;
+ }
+ bool Value(DataModelDataType::Value type, SValue &outValue);
+
+ template <typename TDataType>
+ bool Value(TDataType &outValue)
+ {
+ TXMLCharPtr value;
+ if (Value(value)) {
+ WStrOps<TDataType>().StrTo(value, outValue);
+ return true;
+ }
+ return false;
+ }
+
+ // Functions below implemented in WStrOpsImpl
+ // to avoid circular dependencies
+ // Returns the number of items read
+ // Destructive parsing
+ template <typename TDataType>
+ bool ValueList(NVDataRef<TDataType> data);
+
+ // Destructive operation because we can't trust
+ // strtod to do the right thing. On windows, for long strings,
+ // it calls strlen every operation thus leading to basically N^2
+ // behavior
+ template <typename TDataType>
+ NVConstDataRef<TDataType> ChildValueList(TWideXMLCharPtr listName);
+
+ template <typename TDataType>
+ NVConstDataRef<TDataType> ChildValueList(TXMLCharPtr listName);
+
+ template <typename TSerializer>
+ void Serialize(const wchar_t *elemName, TSerializer &serializer)
+ {
+ IDOMReader::Scope __theScope(*this);
+ if (MoveToFirstChild(elemName)) {
+ serializer.Serialize(*this);
+ }
+ }
+ // Optionally hold on to the factory to keep our elements in memory as long as we are.
+ static std::shared_ptr<IDOMReader>
+ CreateDOMReader(SDOMElement &inRootElement, std::shared_ptr<IStringTable> inStringTable,
+ std::shared_ptr<IDOMFactory> inFactory = std::shared_ptr<IDOMFactory>());
+};
+
+// Write out data in an xml-like fasion without specifying exactly
+// where that data is being written.
+class IDOMWriter
+{
+protected:
+ virtual ~IDOMWriter() {}
+public:
+ friend class std::shared_ptr<IDOMWriter>;
+
+ // Control the element scope.
+ struct Scope
+ {
+ IDOMWriter &m_Writer;
+ Scope(IDOMWriter &writer, TWideXMLCharPtr inElemName)
+ : m_Writer(writer)
+ {
+ m_Writer.Begin(inElemName);
+ }
+ Scope(IDOMWriter &writer, TXMLCharPtr inElemName)
+ : m_Writer(writer)
+ {
+ m_Writer.Begin(inElemName);
+ }
+ ~Scope() { m_Writer.End(); }
+ };
+
+ wchar_t m_PrintBuf[256];
+ char8_t m_NarrowBuf[256];
+
+ virtual void SetDOMFlags(SDOMFlags inFlags) = 0;
+ virtual SDOMFlags GetDOMFlags() const = 0;
+ // There tend to be two types of elements.
+ // Containers (<a>\n\t<b/><b/>\n</a>)
+ // and Values <b>onetwothree</b>
+ virtual void Begin(TWideXMLCharPtr inElemName) = 0;
+ virtual void Begin(TXMLCharPtr inElemName) = 0;
+ // Attributes. They may be sorted just before write
+ virtual void Att(TWideXMLCharPtr name, TWideXMLCharPtr value) = 0;
+ virtual void Att(TXMLCharPtr name, TXMLCharPtr value) = 0;
+ virtual void Value(TWideXMLCharPtr value) = 0;
+ virtual void Value(TXMLCharPtr value) = 0;
+ virtual void End() = 0;
+ virtual void RemoveCurrent() = 0;
+ virtual void ReplaceCurrent(SDOMElement &inElement) = 0;
+ // Append all the children of inElement to the child list of the current items.
+ virtual void AppendChildren(SDOMElement &inElement) = 0;
+ virtual void RemoveAttribute(TWideXMLCharPtr inItem) = 0;
+ virtual void RemoveAttribute(TXMLCharPtr inItem) = 0;
+ // Get the number of tabs required to line up the next line
+ // with the opening of the previous line
+ virtual QT3DSU32 GetTabs() = 0;
+ virtual SDOMElement *GetTopElement() = 0;
+ virtual std::shared_ptr<IDOMFactory> GetFactory() = 0;
+ // Move this item before this sibling. Function does not rearrange the
+ // tree in any major way and will not work if inItem and inSibling aren't
+ // siblings.
+ virtual void MoveBefore(TWideXMLCharPtr inItem, TWideXMLCharPtr inSibling) = 0;
+ virtual void MoveBefore(TXMLCharPtr inItem, TXMLCharPtr inSibling) = 0;
+
+ virtual void ChildValue(TWideXMLCharPtr name, TWideXMLCharPtr value)
+ {
+ Begin(name);
+ Value(value);
+ End();
+ }
+
+ virtual void ChildValue(TXMLCharPtr name, TXMLCharPtr value)
+ {
+ Begin(name);
+ Value(value);
+ End();
+ }
+
+ TWideXMLCharPtr ToStr(wchar_t val)
+ {
+ m_PrintBuf[0] = val;
+ m_PrintBuf[1] = 0;
+ return m_PrintBuf;
+ }
+ TXMLCharPtr ToStr(char8_t val)
+ {
+ m_NarrowBuf[0] = val;
+ m_NarrowBuf[1] = 0;
+ return m_NarrowBuf;
+ }
+ template <typename TDataType>
+ TWideXMLCharPtr ToStr(TDataType val)
+ {
+ WStrOps<TDataType>().ToStr(val, NVDataRef<wchar_t>(m_PrintBuf, 256));
+ return m_PrintBuf;
+ }
+
+ template <typename TDataType>
+ TXMLCharPtr ToNarrowStr(TDataType val)
+ {
+ WStrOps<TDataType>().ToStr(val, NVDataRef<char8_t>(m_NarrowBuf, 256));
+ return m_NarrowBuf;
+ }
+
+ void Att(TWideXMLCharPtr name, const TXMLWideStr &inValue)
+ {
+ return Att(name, inValue.wide_str());
+ }
+
+ void Att(TXMLCharPtr name, const TXMLStr &inValue) { return Att(name, inValue.c_str()); }
+
+ template <typename TData>
+ void Att(TWideXMLCharPtr name, TData value)
+ {
+ Att(name, ToStr(value));
+ }
+
+ template <typename TData>
+ void Att(TXMLCharPtr name, TData value)
+ {
+ Att(name, ToNarrowStr(value));
+ }
+
+ template <typename TSerializer>
+ void Serialize(const wchar_t *elemName, TSerializer &serializer)
+ {
+ IDOMWriter::Scope __theScope(*this, elemName);
+ serializer.Serialize(*this);
+ }
+
+ template <typename TSerializer>
+ void Serialize(const char8_t *elemName, TSerializer &serializer)
+ {
+ IDOMWriter::Scope __theScope(*this, elemName);
+ serializer.Serialize(*this);
+ }
+
+ std::shared_ptr<IDOMReader> CreateDOMReader()
+ {
+ std::shared_ptr<IDOMFactory> theFactory(GetFactory());
+ return IDOMReader::CreateDOMReader(*GetTopElement(), theFactory->GetStringTable(),
+ theFactory);
+ }
+
+ // Note that the default method of creating a writer also creates a reader; they can
+ // both manipulation the DOM hierarch.
+ static eastl::pair<std::shared_ptr<IDOMWriter>, std::shared_ptr<IDOMReader>>
+ CreateDOMWriter(std::shared_ptr<IDOMFactory> inFactory, SDOMElement &inRootElement,
+ std::shared_ptr<IStringTable> inStringTable);
+
+ static eastl::pair<std::shared_ptr<IDOMWriter>, std::shared_ptr<IDOMReader>>
+ CreateDOMWriter(const wchar_t *inTopElemName, std::shared_ptr<IStringTable> inStringTable)
+ {
+ std::shared_ptr<IDOMFactory> theFactory(IDOMFactory::CreateDOMFactory(inStringTable));
+ SDOMElement *theRoot = theFactory->NextElement(inTopElemName);
+ return CreateDOMWriter(theFactory, *theRoot, inStringTable);
+ }
+};
+
+class CXmlErrorHandler
+{
+protected:
+ virtual ~CXmlErrorHandler() {}
+public:
+ virtual void OnXmlError(const QString &errorName, int line, int column) = 0;
+};
+
+class CDOMSerializer
+{
+public:
+ static void WriteXMLHeader(IOutStream &inStream);
+ static void Write(SDOMElement &inElement, IOutStream &inStream, QT3DSU32 inTabs = 0);
+ static SDOMElement *Read(IDOMFactory &inFactory, qt3ds::foundation::IInStream &inStream,
+ CXmlErrorHandler *inErrorHandler = NULL);
+};
+}
+#endif
diff --git a/src/dm/systems/SignalsImpl.cpp b/src/dm/systems/SignalsImpl.cpp
new file mode 100644
index 0000000..6f42516
--- /dev/null
+++ b/src/dm/systems/SignalsImpl.cpp
@@ -0,0 +1,1565 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#ifdef WIN32
+#pragma warning(disable : 4103 4512 4503)
+#endif
+#include "SignalsImpl.h"
+
+using namespace std;
+
+namespace {
+bool g_DataModelSignalsEnabled = true;
+
+#define CHECK_SIGNALS_ENABLED() \
+ { \
+ if (g_DataModelSignalsEnabled == false) \
+ return; \
+ }
+}
+
+namespace qt3dsdm {
+void SetDataModelSignalsEnabled(bool inEnabled)
+{
+ g_DataModelSignalsEnabled = inEnabled;
+}
+// Defaults to true
+bool AreDataModelSignalsEnabled()
+{
+ return g_DataModelSignalsEnabled;
+}
+
+#define CONNECT_QT(x) TSignalConnectionPtr(new QtSignalConnection(x))
+#define CONNECT_SIGNAL_QT(x) CONNECT_QT(QObject::connect(this, x, inCallback))
+
+class CPropertyCoreSignaller : public QObject, public IInstancePropertyCoreSignalProvider,
+ public IInstancePropertyCoreSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void propertySignal(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue);
+public:
+ TSignalConnectionPtr ConnectInstancePropertyValue(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)>
+ &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CPropertyCoreSignaller::propertySignal,
+ inCallback));
+ }
+ void SignalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT propertySignal(inInstance, inProperty, inValue);
+ }
+};
+
+TSignalItemPtr CreatePropertyCoreSignaller()
+{
+ return TSignalItemPtr(
+ static_cast<IInstancePropertyCoreSignalProvider *>(new CPropertyCoreSignaller()));
+}
+
+class CDataCoreSignaller : public QObject, public IDataCoreSignalProvider,
+ public IDataCoreSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void instanceCreated(Qt3DSDMInstanceHandle handle);
+ void beforeInstanceDeleted(Qt3DSDMInstanceHandle handle);
+ void instanceDeleted(Qt3DSDMInstanceHandle handle);
+ void instanceDerived(Qt3DSDMInstanceHandle handle, Qt3DSDMInstanceHandle handle2);
+ void instanceParentRemoved(Qt3DSDMInstanceHandle handle, Qt3DSDMInstanceHandle handle2);
+ void propertyAdded(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr,
+ DataModelDataType::Value);
+ void propertyRemoved(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr,
+ DataModelDataType::Value);
+
+public:
+ virtual TSignalConnectionPtr
+ ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceCreated,
+ inCallback));
+ }
+ virtual TSignalConnectionPtr
+ ConnectBeforeInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::beforeInstanceDeleted,
+ inCallback));
+ }
+ virtual TSignalConnectionPtr
+ ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceDeleted,
+ inCallback));
+ }
+ TSignalConnectionPtr ConnectInstanceDerived(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceDerived,
+ inCallback));
+ }
+ TSignalConnectionPtr ConnectInstanceParentRemoved(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceParentRemoved,
+ inCallback));
+ }
+ virtual TSignalConnectionPtr
+ ConnectPropertyAdded(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ TCharPtr, DataModelDataType::Value)> &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::propertyAdded, inCallback));
+ }
+ virtual TSignalConnectionPtr
+ ConnectPropertyRemoved(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ TCharPtr, DataModelDataType::Value)> &inCallback) override
+ {
+ return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::propertyRemoved,
+ inCallback));
+ }
+
+ void SignalInstanceCreated(Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceCreated(inInstance);
+ }
+ void SignalBeforeInstanceDeleted(Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT beforeInstanceDeleted(inInstance);
+ }
+ void SignalInstanceDeleted(Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceDeleted(inInstance);
+ }
+ void SignalInstanceDerived(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceDerived(inInstance, inParent);
+ }
+ void SignalInstanceParentRemoved(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceParentRemoved(inInstance, inParent);
+ }
+ void SignalPropertyAdded(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, TCharPtr inName,
+ DataModelDataType::Value inDataType) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT propertyAdded(inInstance, inProperty, inName, inDataType);
+ }
+ void SignalPropertyRemoved(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, TCharPtr inName,
+ DataModelDataType::Value inDataType) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT propertyRemoved(inInstance, inProperty, inName, inDataType);
+ }
+};
+
+TSignalItemPtr CreateDataCoreSignaller()
+{
+ return TSignalItemPtr(static_cast<IDataCoreSignalProvider *>(new CDataCoreSignaller()));
+}
+
+class CSlideCoreSignaller : public QObject, public ISlideCoreSignalProvider,
+ public ISlideCoreSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+
+ void slideCreated(Qt3DSDMSlideHandle);
+ void beforeSlideDeleted(Qt3DSDMSlideHandle);
+ void slideDeleted(Qt3DSDMSlideHandle);
+ void slideDerived(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int);
+ void instancePropertyValueSet(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &);
+ qt3dsdm::SValue instancePropertyValueAdded(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle,
+ Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &);
+ void instancePropertyValueRemoved(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, const SValue &);
+ void slideTimeChanged(Qt3DSDMSlideHandle);
+
+public:
+ virtual TSignalConnectionPtr
+ ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideCreated);
+ }
+ virtual TSignalConnectionPtr
+ ConnectBeforeSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::beforeSlideDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideDeleted);
+ }
+ TSignalConnectionPtr ConnectSlideDerived(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideDerived);
+ }
+ TSignalConnectionPtr ConnectInstancePropertyValueSet(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::instancePropertyValueSet);
+ }
+ virtual TSignalConnectionPtr ConnectInstancePropertyValueAdded(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, const SValue &)> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::instancePropertyValueAdded);
+ }
+ TSignalConnectionPtr ConnectInstancePropertyValueRemoved(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::instancePropertyValueRemoved);
+ }
+ virtual TSignalConnectionPtr
+ ConnectSlideTimeChanged(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideTimeChanged);
+ }
+
+ void SendSlideCreated(Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideCreated(inSlide);
+ }
+ void SendBeforeSlideDeleted(Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT beforeSlideDeleted(inSlide);
+ }
+ void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideDeleted(inSlide);
+ }
+ void SendSlideDerived(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent,
+ int inIndex) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideDerived(inSlide, inParent, inIndex);
+ }
+ void SendPropertyValueSet(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instancePropertyValueSet(inSlide, inInstance, inProperty, inValue);
+ }
+ virtual SValue SendPropertyValueAdded(Qt3DSDMSlideHandle inSource, Qt3DSDMSlideHandle inDest,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue)
+ {
+ if (!g_DataModelSignalsEnabled) return SValue();
+
+ // check that we have one and only one slot connected to
+ // instancePropertyValueAdded signal as it returns a value.
+ Q_ASSERT(
+ receivers(
+ SIGNAL(
+ instancePropertyValueAdded(
+ Qt3DSDMSlideHandle, Qt3DSDMSlideHandle,
+ Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,const SValue &))) == 1);
+ // emit instancePropertyValueAdded
+ return instancePropertyValueAdded(inSource, inDest, inInstance, inProperty, inValue);
+ }
+ void SendPropertyValueRemoved(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instancePropertyValueRemoved(inSlide, inInstance, inProperty, inValue);
+ }
+ void SendSlideTimeChanged(Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideTimeChanged(inSlide);
+ }
+};
+
+TSignalItemPtr CreateSlideCoreSignaller()
+{
+ return TSignalItemPtr(static_cast<ISlideCoreSignalProvider *>(new CSlideCoreSignaller()));
+}
+
+class CSlideGraphCoreSignaller : public QObject, public ISlideGraphCoreSignalProvider,
+ public ISlideGraphCoreSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void graphCreated(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle);
+ void graphDeleted(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle);
+ void instanceAssociated(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+ void instanceDissociated(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+ void graphActiveSlide(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle);
+ void graphSeconds(Qt3DSDMSlideGraphHandle, float);
+
+public:
+ TSignalConnectionPtr ConnectGraphCreated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphCreated);
+ }
+ TSignalConnectionPtr ConnectGraphDeleted(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphDeleted);
+ }
+ TSignalConnectionPtr ConnectInstanceAssociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::instanceAssociated);
+ }
+ TSignalConnectionPtr ConnectInstanceDissociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::instanceDissociated);
+ }
+ TSignalConnectionPtr ConnectGraphActiveSlide(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphActiveSlide);
+ }
+ virtual TSignalConnectionPtr
+ ConnectGraphSeconds(const std::function<void(Qt3DSDMSlideGraphHandle, float)> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphSeconds);
+ }
+
+ void SendGraphCreated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT graphCreated(inGraph, inSlide);
+ }
+ void SendGraphDeleted(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT graphDeleted(inGraph, inSlide);
+ }
+ void SendInstanceAssociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceAssociated(inGraph, inSlide, inInstance);
+ }
+ void SendInstanceDissociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceDissociated(inGraph, inSlide, inInstance);
+ }
+ void SendGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT graphActiveSlide(inGraph, inSlide);
+ }
+ virtual void SendGraphSeconds(Qt3DSDMSlideGraphHandle inGraph, float inSeconds)
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT graphSeconds(inGraph, inSeconds);
+ }
+};
+
+TSignalItemPtr CreateSlideGraphCoreSignaller()
+{
+ return TSignalItemPtr(
+ static_cast<ISlideGraphCoreSignalProvider *>(new CSlideGraphCoreSignaller()));
+}
+
+class CAnimationCoreSignaller : public QObject, public IAnimationCoreSignalProvider,
+ public IAnimationCoreSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void animationCreated(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType);
+ void beforeAnimationDeleted(Qt3DSDMAnimationHandle);
+ void animationDeleted(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType);
+ void keyframeInserted(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &);
+ void beforeKeyframeErased(Qt3DSDMKeyframeHandle);
+ void keyframeErased(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &);
+ void beforeAllKeyframesErased(Qt3DSDMAnimationHandle);
+ void keyframeUpdated(Qt3DSDMKeyframeHandle, const TKeyframe &);
+ void firstKeyframeDynamic(Qt3DSDMAnimationHandle, bool);
+
+public:
+ TSignalConnectionPtr ConnectAnimationCreated(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::animationCreated);
+ }
+ virtual TSignalConnectionPtr
+ ConnectBeforeAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::beforeAnimationDeleted);
+ }
+ TSignalConnectionPtr ConnectAnimationDeleted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::animationDeleted);
+ }
+ TSignalConnectionPtr ConnectKeyframeInserted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::keyframeInserted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectBeforeKeyframeErased(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::beforeKeyframeErased);
+ }
+ TSignalConnectionPtr ConnectKeyframeErased(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::keyframeErased);
+ }
+ virtual TSignalConnectionPtr
+ ConnectBeforeAllKeyframesErased(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::beforeAllKeyframesErased);
+ }
+ TSignalConnectionPtr ConnectKeyframeUpdated(
+ const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::keyframeUpdated);
+ }
+ TSignalConnectionPtr ConnectFirstKeyframeDynamicSet(
+ const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::firstKeyframeDynamic);
+ }
+
+ void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT animationCreated(inAnimation, inSlide, inInstance, inProperty, inIndex,
+ inAnimationType);
+ }
+ void SendBeforeAnimationDeleted(Qt3DSDMAnimationHandle inAnimation) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT beforeAnimationDeleted(inAnimation);
+ }
+ void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT animationDeleted(inAnimation, inSlide, inInstance, inProperty, inIndex,
+ inAnimationType);
+ }
+ void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT keyframeInserted(inAnimation, inKeyframe, inData);
+ }
+ void SendBeforeKeyframeErased(Qt3DSDMKeyframeHandle inKeyframe) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT beforeKeyframeErased(inKeyframe);
+ }
+ void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT keyframeErased(inAnimation, inKeyframe, inData);
+ }
+ void SendBeforeAllKeyframesErased(Qt3DSDMAnimationHandle inAnimation) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT beforeAllKeyframesErased(inAnimation);
+ }
+ void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT keyframeUpdated(inKeyframe, inData);
+ }
+ void SendFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation,
+ bool inKeyframeDynamic) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT firstKeyframeDynamic(inAnimation, inKeyframeDynamic);
+ }
+};
+
+TSignalItemPtr CreateAnimationCoreSignaller()
+{
+ return TSignalItemPtr(
+ static_cast<IAnimationCoreSignalProvider *>(new CAnimationCoreSignaller()));
+}
+
+class CActionCoreSignaller : public QObject, public IActionCoreSignalProvider,
+ public IActionCoreSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void triggerObjectSet(Qt3DSDMActionHandle, SObjectRefType &);
+ void targetObjectSet(Qt3DSDMActionHandle, SObjectRefType &);
+ void eventHandleSet(Qt3DSDMActionHandle, const wstring &);
+ void handlerHandleSet(Qt3DSDMActionHandle, const wstring &);
+
+ void handlerArgumentAdded(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value);
+ void handlerArgumentRemoved(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value);
+ void handlerArgumentValueSet(Qt3DSDMHandlerArgHandle, const SValue &);
+
+public:
+ TSignalConnectionPtr ConnectTriggerObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionCoreSignaller::triggerObjectSet);
+ }
+ TSignalConnectionPtr ConnectTargetObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionCoreSignaller::targetObjectSet);
+ }
+ virtual TSignalConnectionPtr
+ ConnectEventSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionCoreSignaller::eventHandleSet);
+ }
+ virtual TSignalConnectionPtr
+ ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerHandleSet);
+ }
+
+ TSignalConnectionPtr ConnectHandlerArgumentAdded(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerArgumentAdded);
+ }
+ TSignalConnectionPtr ConnectHandlerArgumentRemoved(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerArgumentRemoved);
+ }
+ TSignalConnectionPtr ConnectHandlerArgumentValueSet(
+ const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerArgumentValueSet);
+ }
+
+ void SendTriggerObjectSet(Qt3DSDMActionHandle inAction, SObjectRefType &inTriggerObject) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT triggerObjectSet(inAction, inTriggerObject);
+ }
+ void SendTargetObjectSet(Qt3DSDMActionHandle inAction, SObjectRefType &inTargetObject) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT targetObjectSet(inAction, inTargetObject);
+ }
+ void SendEventSet(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT eventHandleSet(inAction, inEventHandle);
+ }
+ void SendHandlerSet(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT handlerHandleSet(inAction, inHandlerHandle);
+ }
+
+ void SendHandlerArgumentAdded(Qt3DSDMActionHandle inAction,
+ Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const TCharStr &inName, HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT handlerArgumentAdded(inAction, inHandlerArgument, inName, inArgType, inValueType);
+ }
+ void SendHandlerArgumentRemoved(Qt3DSDMActionHandle inAction,
+ Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const TCharStr &inName, HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT handlerArgumentRemoved(inAction, inHandlerArgument, inName, inArgType, inValueType);
+ }
+ void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const SValue &inValue) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT handlerArgumentValueSet(inHandlerArgument, inValue);
+ }
+};
+
+TSignalItemPtr CreateActionCoreSignaller()
+{
+ return TSignalItemPtr(static_cast<IActionCoreSignalProvider *>(new CActionCoreSignaller()));
+}
+
+class CActionSystemSignaller : public QObject, public IActionSystemSignalProvider,
+ public IActionSystemSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void actionCreated(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+ void actionDeleted(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+
+public:
+ TSignalConnectionPtr ConnectActionCreated(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionSystemSignaller::actionCreated);
+ }
+ TSignalConnectionPtr ConnectActionDeleted(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CActionSystemSignaller::actionDeleted);
+ }
+
+ void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT actionCreated(inAction, inSlide, inOwner);
+ }
+ void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT actionDeleted(inAction, inSlide, inOwner);
+ }
+};
+
+TSignalItemPtr CreateActionSystemSignaller()
+{
+ return TSignalItemPtr(static_cast<IActionSystemSignalProvider *>(new CActionSystemSignaller()));
+}
+
+class CSlideSystemSignaller : public QObject, public ISlideSystemSignalProvider,
+ public ISlideSystemSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void masterCreated(Qt3DSDMSlideHandle);
+ void masterDeleted(Qt3DSDMSlideHandle);
+ void slideCreated(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle);
+ void slideDeleted(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle);
+ void slideRearranged(Qt3DSDMSlideHandle, int, int);
+ void componentSeconds(Qt3DSDMSlideHandle, float);
+ void instanceAssociated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+ void instanceDissociated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+ void propertyLinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void propertyUnlinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void activeSlide(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle, Qt3DSDMSlideHandle);
+
+ qt3dsdm::SValue valueCreated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue);
+ void valueDestroyed(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue);
+
+public:
+ virtual TSignalConnectionPtr
+ ConnectMasterCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::masterCreated);
+ }
+ virtual TSignalConnectionPtr
+ ConnectMasterDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::masterDeleted);
+ }
+ TSignalConnectionPtr ConnectSlideCreated(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::slideCreated);
+ }
+ TSignalConnectionPtr ConnectSlideDeleted(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::slideDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectSlideRearranged(const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::slideRearranged);
+ }
+ virtual TSignalConnectionPtr
+ ConnectComponentSeconds(const std::function<void(Qt3DSDMSlideHandle, float)> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::componentSeconds);
+ }
+ TSignalConnectionPtr ConnectInstanceAssociated(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::instanceAssociated);
+ }
+ TSignalConnectionPtr ConnectInstanceDissociated(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::instanceDissociated);
+ }
+ TSignalConnectionPtr ConnectPropertyLinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::propertyLinked);
+ }
+ TSignalConnectionPtr ConnectPropertyUnlinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::propertyUnlinked);
+ }
+ TSignalConnectionPtr ConnectActiveSlide(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle, Qt3DSDMSlideHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::activeSlide);
+ }
+ virtual TSignalConnectionPtr ConnectPropertyValueCreated(
+ const std::function<SValue(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::valueCreated);
+ }
+ virtual TSignalConnectionPtr ConnectPropertyValueDestroyed(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::valueDestroyed);
+ }
+
+ void SendMasterCreated(Qt3DSDMSlideHandle inMaster) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT masterCreated(inMaster);
+ }
+ void SendMasterDeleted(Qt3DSDMSlideHandle inMaster) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT masterDeleted(inMaster);
+ }
+ void SendSlideCreated(Qt3DSDMSlideHandle inMaster, int inIndex,
+ Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideCreated(inMaster, inIndex, inSlide);
+ }
+ void SendSlideDeleted(Qt3DSDMSlideHandle inMaster, int inIndex,
+ Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideDeleted(inMaster, inIndex, inSlide);
+ }
+ void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex, int inNewIndex) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideRearranged(inMaster, inOldIndex, inNewIndex);
+ }
+ virtual void SendComponentSeconds(Qt3DSDMSlideHandle inMaster, float inSeconds)
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT componentSeconds(inMaster, inSeconds);
+ }
+ void SendInstanceAssociated(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceAssociated(inMaster, inInstance);
+ }
+ void SendInstanceDissociated(Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceDissociated(inMaster, inInstance);
+ }
+ void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT propertyLinked(inMaster, inInstance, inProperty);
+ }
+ void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT propertyUnlinked(inMaster, inInstance, inProperty);
+ }
+ void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex,
+ Qt3DSDMSlideHandle inOldSlide, Qt3DSDMSlideHandle inNewSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT activeSlide(inMaster, inIndex, inOldSlide, inNewSlide);
+ }
+
+ virtual SValue SendPropertyValueCreated(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue)
+ {
+ if (!g_DataModelSignalsEnabled) return SValue();
+
+ // check that we have one and only one slot connected to
+ // valueCreated signal as it returns a value.
+ Q_ASSERT(
+ receivers(
+ SIGNAL(
+ valueCreated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, const SValue &))) == 1);
+ // emit valueCreated
+ return valueCreated(inSlide, inInstance, inProperty, inValue);
+ }
+ virtual void SendPropertyValueDestroyed(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue)
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT valueDestroyed(inSlide, inInstance, inProperty, inValue);
+ }
+};
+
+TSignalItemPtr CreateSlideSystemSignaller()
+{
+ return TSignalItemPtr(static_cast<ISlideSystemSignalProvider *>(new CSlideSystemSignaller()));
+}
+
+class CCustomPropCoreSignaller : public QObject, public ICustomPropCoreSignalProvider,
+ public ICustomPropCoreSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void customPropertyCreated(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle);
+ void customPropertyDeleted(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle);
+ void customPropertyModified(Qt3DSDMPropertyHandle);
+ void customEventCreated(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle);
+ void customEventDeleted(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle);
+ void customEventModified(Qt3DSDMEventHandle);
+ void customHandlerCreated(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle);
+ void customHandlerDeleted(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle);
+ void customHandlerModified(Qt3DSDMHandlerHandle);
+ void customHandlerParamCreated(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle);
+ void customHandlerParamDeleted(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle);
+ void customHandlerParamModified(Qt3DSDMHandlerParamHandle);
+ void customReferencesModified(Qt3DSDMInstanceHandle, const TCharStr &);
+
+public:
+ TSignalConnectionPtr ConnectCustomPropertyCreated(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customPropertyCreated);
+ }
+ TSignalConnectionPtr ConnectCustomPropertyDeleted(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customPropertyDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectCustomPropertyModified(const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customPropertyModified);
+ }
+ TSignalConnectionPtr ConnectCustomEventCreated(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customEventCreated);
+ }
+ TSignalConnectionPtr ConnectCustomEventDeleted(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customEventDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customEventModified);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerCreated(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerCreated);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerDeleted(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerModified);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerParamCreated(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerParamCreated);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerParamDeleted(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerParamDeleted);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerParamModified(
+ const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerParamModified);
+ }
+ TSignalConnectionPtr ConnectCustomReferencesModified(
+ const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customReferencesModified);
+ }
+
+ void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customPropertyCreated(inProp, inOwner);
+ }
+ void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customPropertyDeleted(inProp, inOwner);
+ }
+ void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customPropertyModified(inProp);
+ }
+ void SendCustomEventCreated(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customEventCreated(inEvent, inOwner);
+ }
+ void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customEventDeleted(inEvent, inOwner);
+ }
+ void SendCustomEventModified(Qt3DSDMEventHandle inEvent) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customEventModified(inEvent);
+ }
+ void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerCreated(inHandler, inOwner);
+ }
+ void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerDeleted(inHandler, inOwner);
+ }
+ void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerModified(inHandler);
+ }
+ void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerParamCreated(inParameter, inHandler);
+ }
+ void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerParamDeleted(inParameter, inHandler);
+ }
+ void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerParamModified(inParameter);
+ }
+ void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner,
+ const TCharStr &inString) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customReferencesModified(inOwner, inString);
+ }
+};
+
+TSignalItemPtr CreateCustomPropCoreSignaller()
+{
+ return TSignalItemPtr(
+ static_cast<ICustomPropCoreSignalProvider *>(new CCustomPropCoreSignaller()));
+}
+
+class CStudioFullSystemSignaller : public QObject, public IStudioFullSystemSignalProvider,
+ public IStudioFullSystemSignalSender
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void changeSetBegin();
+ void changeSetEnd();
+ void animationBegin();
+ void animationEnd();
+ void slideCreated(Qt3DSDMSlideHandle);
+ void slideDeleted(Qt3DSDMSlideHandle);
+ void slideRearranged(Qt3DSDMSlideHandle, int, int);
+ void componentSeconds(Qt3DSDMSlideHandle);
+ void beginComponentSeconds(Qt3DSDMSlideHandle);
+ void propertyLinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void propertyUnlinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void activeSlide(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle);
+ void instanceCreated(Qt3DSDMInstanceHandle);
+ void instanceDeleted(Qt3DSDMInstanceHandle);
+ void animationCreated(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void animationDeleted(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void controlledToggled(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void keyframeInserted(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle);
+ void keyframeErased(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle);
+ void keyframeUpdated(Qt3DSDMKeyframeHandle);
+ void connectFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle, bool);
+ void instancePropertyValue(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle);
+ void actionCreated(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+ void actionDeleted(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle);
+ void triggerObjectSet(Qt3DSDMActionHandle);
+ void targetObjectSet(Qt3DSDMActionHandle);
+ void eventHandleSet(Qt3DSDMActionHandle);
+ void handlerHandleSet(Qt3DSDMActionHandle);
+ void handlerArgumentValueSet(Qt3DSDMHandlerArgHandle);
+ void customPropertyCreated(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle);
+ void customPropertyDeleted(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle);
+ void customPropertyModified(Qt3DSDMPropertyHandle);
+ void customEventCreated(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle);
+ void customEventDeleted(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle);
+ void customEventModified(Qt3DSDMEventHandle);
+ void customHandlerCreated(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle);
+ void customHandlerDeleted(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle);
+ void customHandlerModified(Qt3DSDMHandlerHandle);
+ void customHandlerParamCreated(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle);
+ void customHandlerParamDeleted(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle);
+ void customHandlerParamModified(Qt3DSDMHandlerParamHandle);
+ void customReferencesModified(Qt3DSDMInstanceHandle, const TCharStr &);
+private:
+ ISlideSystemSignalProvider *m_SlideSystemSignalProvider;
+
+public:
+ CStudioFullSystemSignaller(ISlideSystemSignalProvider *inProvider)
+ : m_SlideSystemSignalProvider(inProvider)
+ {
+ }
+
+ virtual TSignalConnectionPtr ConnectChangeSetBegin(const std::function<void()> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::changeSetBegin);
+ }
+ virtual TSignalConnectionPtr ConnectChangeSetEnd(const std::function<void()> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::changeSetEnd);
+ }
+
+ // Used when people start to set component times.
+ virtual TSignalConnectionPtr ConnectAnimationSetBegin(const std::function<void()> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationBegin);
+ }
+ virtual TSignalConnectionPtr ConnectAnimationSetEnd(const std::function<void()> &inCallback)
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationEnd);
+ }
+
+ virtual TSignalConnectionPtr
+ ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::slideCreated);
+ }
+ virtual TSignalConnectionPtr
+ ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::slideDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectSlideRearranged(const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::slideRearranged);
+ }
+ virtual TSignalConnectionPtr
+ ConnectBeginComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::beginComponentSeconds);
+ }
+ virtual TSignalConnectionPtr
+ ConnectComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::componentSeconds);
+ }
+ TSignalConnectionPtr ConnectPropertyLinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::propertyLinked);
+ }
+ TSignalConnectionPtr ConnectPropertyUnlinked(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::propertyUnlinked);
+ }
+ TSignalConnectionPtr ConnectActiveSlide(
+ const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::activeSlide);
+ }
+
+ virtual TSignalConnectionPtr
+ ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::instanceCreated);
+ }
+ virtual TSignalConnectionPtr
+ ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::instanceDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectAnimationCreated(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationCreated);
+ }
+ virtual TSignalConnectionPtr
+ ConnectAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationDeleted);
+ }
+ TSignalConnectionPtr ConnectKeyframeInserted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::keyframeInserted);
+ }
+ TSignalConnectionPtr ConnectKeyframeErased(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::keyframeErased);
+ }
+ virtual TSignalConnectionPtr
+ ConnectKeyframeUpdated(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::keyframeUpdated);
+ }
+ TSignalConnectionPtr ConnectInstancePropertyValue(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::instancePropertyValue);
+ }
+ TSignalConnectionPtr ConnectFirstKeyframeDynamicSet(
+ const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::connectFirstKeyframeDynamicSet);
+ }
+
+ TSignalConnectionPtr ConnectActionCreated(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::actionCreated);
+ }
+ TSignalConnectionPtr ConnectActionDeleted(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::actionDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectTriggerObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::triggerObjectSet);
+ }
+ virtual TSignalConnectionPtr
+ ConnectTargetObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::targetObjectSet);
+ }
+ virtual TSignalConnectionPtr
+ ConnectEventSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::eventHandleSet);
+ }
+ virtual TSignalConnectionPtr
+ ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::handlerHandleSet);
+ }
+ virtual TSignalConnectionPtr
+ ConnectHandlerArgumentValueSet(const std::function<void(Qt3DSDMHandlerArgHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::handlerArgumentValueSet);
+ }
+
+ TSignalConnectionPtr ConnectCustomPropertyCreated(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customPropertyCreated);
+ }
+ TSignalConnectionPtr ConnectCustomPropertyDeleted(
+ const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customPropertyDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectCustomPropertyModified(const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customPropertyModified);
+ }
+ TSignalConnectionPtr ConnectCustomEventCreated(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customEventCreated);
+ }
+ TSignalConnectionPtr ConnectCustomEventDeleted(
+ const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customEventDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customEventModified);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerCreated(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerCreated);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerDeleted(
+ const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerDeleted);
+ }
+ virtual TSignalConnectionPtr
+ ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerModified);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerParamCreated(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerParamCreated);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerParamDeleted(
+ const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerParamDeleted);
+ }
+ TSignalConnectionPtr ConnectCustomHandlerParamModified(
+ const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerParamModified);
+ }
+ TSignalConnectionPtr ConnectCustomReferencesModified(
+ const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customReferencesModified);
+ }
+ TSignalConnectionPtr ConnectControlledToggled(
+ const std::function<void(
+ Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) override
+ {
+ return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::controlledToggled);
+ }
+
+ virtual void SendChangeSetBegin()
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT changeSetBegin();
+ }
+ virtual void SendChangeSetEnd()
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT changeSetEnd();
+ }
+
+ virtual void SendAnimationSetBegin()
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT animationBegin();
+ }
+ virtual void SendAnimationSetEnd()
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT animationEnd();
+ }
+
+ void SendSlideCreated(Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideCreated(inSlide);
+ }
+ void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideDeleted(inSlide);
+ }
+ void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex, int inNewIndex) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT slideRearranged(inMaster, inOldIndex, inNewIndex);
+ }
+ void SendBeginComponentSeconds(Qt3DSDMSlideHandle inMaster) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT beginComponentSeconds(inMaster);
+ }
+ void SendComponentSeconds(Qt3DSDMSlideHandle inMaster) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT componentSeconds(inMaster);
+ }
+ void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT propertyLinked(inMaster, inInstance, inProperty);
+ }
+ void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT propertyUnlinked(inMaster, inInstance, inProperty);
+ }
+ void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex, Qt3DSDMSlideHandle inSlide) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT activeSlide(inMaster, inIndex, inSlide);
+ }
+
+ void SendInstanceCreated(Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceCreated(inInstance);
+ }
+ void SendInstanceDeleted(Qt3DSDMInstanceHandle inInstance) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instanceDeleted(inInstance);
+ }
+
+ void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT animationCreated(inAnimation, inInstance, inProperty);
+ }
+ void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT animationDeleted(inAnimation, inInstance, inProperty);
+ }
+ void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT keyframeInserted(inAnimation, inKeyframe);
+ }
+ void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation,
+ Qt3DSDMKeyframeHandle inKeyframe) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT keyframeErased(inAnimation, inKeyframe);
+ }
+ void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT keyframeUpdated(inKeyframe);
+ }
+ void SendConnectFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation,
+ bool inDynamic) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT connectFirstKeyframeDynamicSet(inAnimation, inDynamic);
+ }
+
+ void SendInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT instancePropertyValue(inInstance, inProperty);
+ }
+
+ void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT actionCreated(inAction, inSlide, inOwner);
+ }
+ void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT actionDeleted(inAction, inSlide, inOwner);
+ }
+ void SendTriggerObjectSet(Qt3DSDMActionHandle inAction) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT triggerObjectSet(inAction);
+ }
+ void SendTargetObjectSet(Qt3DSDMActionHandle inAction) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT targetObjectSet(inAction);
+ }
+ void SendEventSet(Qt3DSDMActionHandle inAction) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT eventHandleSet(inAction);
+ }
+ void SendHandlerSet(Qt3DSDMActionHandle inAction) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT handlerHandleSet(inAction);
+ }
+ void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT handlerArgumentValueSet(inHandlerArgument);
+ }
+
+ void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customPropertyCreated(inProp, inOwner);
+ }
+ void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customPropertyDeleted(inProp, inOwner);
+ }
+ void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customPropertyModified(inProp);
+ }
+ void SendCustomEventCreated(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customEventCreated(inEvent, inOwner);
+ }
+ void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customEventDeleted(inEvent, inOwner);
+ }
+ void SendCustomEventModified(Qt3DSDMEventHandle inEvent) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customEventModified(inEvent);
+ }
+ void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerCreated(inHandler, inOwner);
+ }
+ void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler,
+ Qt3DSDMInstanceHandle inOwner) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerDeleted(inHandler, inOwner);
+ }
+ void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerModified(inHandler);
+ }
+ void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerParamCreated(inParameter, inHandler);
+ }
+ void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter,
+ Qt3DSDMHandlerHandle inHandler) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerParamDeleted(inParameter, inHandler);
+ }
+ void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customHandlerParamModified(inParameter);
+ }
+ void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner,
+ const TCharStr &inString) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT customReferencesModified(inOwner, inString);
+ }
+
+ void SendControlledToggled(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) override
+ {
+ CHECK_SIGNALS_ENABLED();
+ Q_EMIT controlledToggled(inInstance, inProperty);
+ }
+};
+
+TSignalItemPtr
+CreateStudioFullSystemSignaller(ISlideSystemSignalProvider *inSlideSystemSignalProvider)
+{
+ return TSignalItemPtr(static_cast<IStudioFullSystemSignalProvider *>(
+ new CStudioFullSystemSignaller(inSlideSystemSignalProvider)));
+}
+}
+
+#include "SignalsImpl.moc"
diff --git a/src/dm/systems/SignalsImpl.h b/src/dm/systems/SignalsImpl.h
new file mode 100644
index 0000000..988270e
--- /dev/null
+++ b/src/dm/systems/SignalsImpl.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef SIGNALSIMPLH
+#define SIGNALSIMPLH
+#include "Qt3DSDMSignals.h"
+
+namespace qt3dsdm {
+class ISlideSystemSignalProvider;
+
+TSignalItemPtr CreatePropertyCoreSignaller();
+TSignalItemPtr CreateDataCoreSignaller();
+TSignalItemPtr CreateSlideCoreSignaller();
+TSignalItemPtr CreateSlideGraphCoreSignaller();
+TSignalItemPtr CreateAnimationCoreSignaller();
+TSignalItemPtr CreateActionCoreSignaller();
+TSignalItemPtr CreateActionSystemSignaller();
+TSignalItemPtr CreateSlideSystemSignaller();
+TSignalItemPtr CreateCustomPropCoreSignaller();
+TSignalItemPtr
+CreateStudioFullSystemSignaller(ISlideSystemSignalProvider *inSlideSystemSignalProvider);
+}
+
+#endif \ No newline at end of file
diff --git a/src/dm/systems/SlideSystem.cpp b/src/dm/systems/SlideSystem.cpp
new file mode 100644
index 0000000..d6d8893
--- /dev/null
+++ b/src/dm/systems/SlideSystem.cpp
@@ -0,0 +1,867 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#ifdef WIN32
+#pragma warning(disable : 4503)
+#endif
+#include "SlideSystem.h"
+#include "SimpleSlideCore.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+SSlideSystem::SSlideSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore,
+ TSlideGraphCorePtr inSlideGraphCore, TAnimationCorePtr inAnimationCore,
+ Qt3DSDMInstanceHandle inSlideInstance,
+ Qt3DSDMPropertyHandle inComponentGuidProperty)
+ : m_DataCore(inDataCore)
+ , m_SlideCore(inSlideCore)
+ , m_SlideGraphCore(inSlideGraphCore)
+ , m_AnimationCore(inAnimationCore)
+ , m_SlideInstance(inSlideInstance)
+ , m_ComponentGuid(inComponentGuidProperty)
+{
+ m_Signaller = CreateSlideSystemSignaller();
+}
+void SSlideSystem::SetPropertySystem(TPropertySystemPtr inPropertySystem)
+{
+ m_PropertySystem = inPropertySystem;
+}
+
+Qt3DSDMSlideHandle SSlideSystem::CreateMasterSlide()
+{
+ Qt3DSDMInstanceHandle theSlideInstance = m_DataCore->CreateInstance();
+ m_DataCore->DeriveInstance(theSlideInstance, m_SlideInstance);
+ Qt3DSDMSlideHandle retval = m_SlideCore->CreateSlide(theSlideInstance);
+ m_SlideGraphCore->CreateSlideGraph(retval);
+ GetSignalSender()->SendMasterCreated(retval);
+ return retval;
+}
+
+inline bool PropertyHandlePairEquals(const TPropertyHandlePropertyInfoPair &inPair,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ return (inProperty == inPair.first);
+}
+
+void AddReferencedInstance(const TSlideEntry &inEntry,
+ const TPropertyHandlePropertyInfoPairList &inInfoPairList,
+ Qt3DSDMSlideHandle inSourceSlide, Qt3DSDMSlideHandle inDestSlide,
+ TInstanceHandleList &outInstances, TSlideEntryList &outReferencedEntries)
+{
+ TPropertyHandlePropertyInfoPairList::const_iterator theFind =
+ find_if<TPropertyHandlePropertyInfoPairList::const_iterator>(
+ inInfoPairList, std::bind(PropertyHandlePairEquals,
+ std::placeholders::_1, get<1>(inEntry)));
+ if (theFind != inInfoPairList.end()) {
+ TPropertyInstanceInfoPtr theInfo(theFind->second);
+ Qt3DSDMInstanceHandle theReferenced(theInfo->GetInstanceForProperty(get<2>(inEntry)));
+ if (theReferenced.Valid()
+ && !exists(outInstances, std::bind(equal_to<int>(), theReferenced,
+ std::placeholders::_1))) {
+ insert_unique(outInstances, theReferenced);
+ SValue theNewValue(
+ theInfo->CreateInstanceForProperty(inSourceSlide, inDestSlide, theReferenced));
+ outReferencedEntries.push_back(
+ make_tuple(get<0>(inEntry), get<1>(inEntry), theNewValue));
+ }
+ }
+}
+
+void CopySpecificAnimation(Qt3DSDMSlideHandle inMaster, Qt3DSDMSlideHandle inTarget,
+ TInstancePropertyPair inPropertyPair, TAnimationCorePtr inAnimationCore,
+ size_t inIndex)
+{
+ Qt3DSDMAnimationHandle theAnimation = inAnimationCore->GetAnimation(
+ inMaster, inPropertyPair.first, inPropertyPair.second, inIndex);
+ if (theAnimation.Valid())
+ CopyAnimation(inAnimationCore, theAnimation, inTarget, inPropertyPair.first,
+ inPropertyPair.second, inIndex);
+}
+
+void CopyAnimationIfExist(Qt3DSDMSlideHandle inMaster, Qt3DSDMSlideHandle inTarget,
+ TInstancePropertyPair inPropertyPair, TPropertySystemPtr inPropertySystem,
+ TAnimationCorePtr inAnimationCore)
+{
+ DataModelDataType::Value thePropertyType = inPropertySystem->GetDataType(inPropertyPair.second);
+ std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(thePropertyType);
+ if (std::get<0>(theArity))
+ do_times(std::get<1>(theArity), std::bind(CopySpecificAnimation, inMaster, inTarget,
+ inPropertyPair, inAnimationCore,
+ std::placeholders::_1));
+}
+
+void SetEntryValueIfNotReferenced(const TSlideEntry &inEntry,
+ const TInstanceHandleList &inReferencedInstances,
+ const TSlideEntryList &inReferencedEntries,
+ Qt3DSDMSlideHandle inSource, Qt3DSDMSlideHandle inDestSlide,
+ TPropertySystemPtr inPropertySystem, TSlideCorePtr inDestCore,
+ TAnimationCorePtr inAnimationCore)
+{
+ // Don't copy referenced instance properties.
+ if (exists(inReferencedInstances, std::bind(equal_to<int>(), get<0>(inEntry),
+ std::placeholders::_1)))
+ return;
+ TSlideEntryList::const_iterator theFind = find_if<TSlideEntryList::const_iterator>(
+ inReferencedEntries,
+ std::bind(CSimpleSlideCore::PropertyFound, get<0>(inEntry), get<1>(inEntry),
+ std::placeholders::_1));
+ if (theFind != inReferencedEntries.end())
+ inDestCore->ForceSetInstancePropertyValue(inDestSlide, get<0>(inEntry), get<1>(inEntry),
+ get<2>(*theFind));
+ else
+ inDestCore->ForceSetInstancePropertyValue(inDestSlide, get<0>(inEntry), get<1>(inEntry),
+ get<2>(inEntry));
+ CopyAnimationIfExist(inSource, inDestSlide, make_pair(get<0>(inEntry), get<1>(inEntry)),
+ inPropertySystem, inAnimationCore);
+}
+
+Qt3DSDMSlideHandle SSlideSystem::CreateSlide(Qt3DSDMSlideHandle inMaster, int inIndex)
+{
+ return DuplicateSlide(inMaster, inIndex);
+}
+
+Qt3DSDMSlideHandle SSlideSystem::DuplicateSlide(Qt3DSDMSlideHandle inSourceSlide, int inIndex)
+{
+ Qt3DSDMSlideHandle theMaster = GetMasterSlide(inSourceSlide);
+ Qt3DSDMInstanceHandle theSlideInstance = m_DataCore->CreateInstance();
+ m_DataCore->DeriveInstance(theSlideInstance, m_SlideInstance);
+ Qt3DSDMSlideHandle retval = m_SlideCore->CreateSlide(theSlideInstance);
+
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(theMaster, theChildren);
+ m_SlideCore->DeriveSlide(retval, theMaster, inIndex - 1);
+ int finalIndex = m_SlideCore->GetChildIndex(theMaster, retval) + 1;
+ if (!theChildren.empty()) {
+ // If the master was passed in, we get the intersecting properties
+ // of the master and first child.
+ // if another slide was passed in, we again do the intersection but we
+ // take the values from the source slide instead of the master.
+ TSlideEntryList theIntersectingEntries;
+ if (inSourceSlide == theMaster)
+ m_SlideCore->GetIntersectingProperties(theMaster, theChildren.at(0),
+ theIntersectingEntries);
+ else
+ m_SlideCore->GetIntersectingProperties(inSourceSlide, theMaster,
+ theIntersectingEntries);
+
+ // duplicates the instance properties, from source slide (could be master (a new slide
+ // command) or another other slides (duplicate slide) to the newly created slide
+ m_DataCore->CopyInstanceProperties(this->GetSlideInstance(inSourceSlide), theSlideInstance);
+
+ TInstanceHandleList theReferencedInstances;
+ TSlideEntryList theReferencedEntries;
+ do_all(theIntersectingEntries,
+ std::bind(AddReferencedInstance, std::placeholders::_1,
+ std::cref(m_PropertyInfoPairList),
+ inSourceSlide, retval, std::ref(theReferencedInstances),
+ std::ref(theReferencedEntries)));
+ do_all(theIntersectingEntries,
+ std::bind(SetEntryValueIfNotReferenced, std::placeholders::_1,
+ std::cref(theReferencedInstances),
+ std::cref(theReferencedEntries), inSourceSlide, retval,
+ m_PropertySystem, m_SlideCore, m_AnimationCore));
+ }
+ GetSignalSender()->SendSlideCreated(theMaster, finalIndex, retval);
+ return retval;
+}
+
+Qt3DSDMSlideHandle SSlideSystem::GetMasterSlide(Qt3DSDMSlideHandle inSlide) const
+{
+ if (inSlide.Valid() && m_SlideCore->IsSlide(inSlide)) {
+ Qt3DSDMSlideHandle theParent = m_SlideCore->GetParentSlide(inSlide);
+ if (theParent.Valid())
+ return theParent;
+ return inSlide;
+ }
+ return 0;
+}
+
+bool SSlideSystem::IsMasterSlide(Qt3DSDMSlideHandle inSlide) const
+{
+ Qt3DSDMSlideHandle theParent = m_SlideCore->GetParentSlide(inSlide);
+ if (!theParent.Valid())
+ return true;
+ else
+ return false;
+}
+
+inline bool GraphGuidMatches(Qt3DSDMSlideGraphHandle inGraph, TSlideGraphCorePtr inSlideGraph,
+ TSlideCorePtr inSlideCore, TDataCorePtr inDataCore,
+ Qt3DSDMPropertyHandle inProperty, SValue inValue)
+{
+ Qt3DSDMSlideHandle theMaster = inSlideGraph->GetGraphRoot(inGraph);
+ Qt3DSDMInstanceHandle theInstance = inSlideCore->GetSlideInstance(theMaster);
+ SValue theValue;
+ if (inDataCore->GetInstancePropertyValue(theInstance, inProperty, theValue)
+ && Equals(inValue, theValue.toOldSkool()))
+ return true;
+ return false;
+}
+
+Qt3DSDMSlideHandle SSlideSystem::GetMasterSlideByComponentGuid(SLong4 inGuid) const
+{
+ TSlideGraphHandleList theGraphs;
+ m_SlideGraphCore->GetSlideGraphs(theGraphs);
+ TSlideGraphHandleList::iterator theFind = find_if<TSlideGraphHandleList::iterator>(
+ theGraphs, std::bind(GraphGuidMatches,
+ std::placeholders::_1, m_SlideGraphCore, m_SlideCore, m_DataCore,
+ m_ComponentGuid, inGuid));
+ if (theFind != theGraphs.end())
+ return m_SlideGraphCore->GetGraphRoot(*theFind);
+ return 0;
+}
+
+void InsertIfReferencedProperty(const TSlideEntry &inEntry,
+ const TPropertyHandlePropertyInfoPairList &inRefProperties,
+ TInstanceHandleList &inInstances)
+{
+ TPropertyHandlePropertyInfoPairList::const_iterator theFind =
+ find_if<TPropertyHandlePropertyInfoPairList::const_iterator>(
+ inRefProperties, std::bind(PropertyHandlePairEquals, std::placeholders::_1, get<1>(inEntry)));
+ if (theFind != inRefProperties.end()) {
+ Qt3DSDMInstanceHandle theInstance(theFind->second->GetInstanceForProperty(get<2>(inEntry)));
+ if (theInstance.Valid())
+ inInstances.push_back(theInstance);
+ }
+}
+
+void SSlideSystem::InsertEntryAndPropertyInstance(const TSlideEntry &inEntry,
+ TInstanceHandleList &inInstances,
+ Qt3DSDMSlideHandle inSlide)
+{
+ Qt3DSDMInstanceHandle theEntryInstance = get<0>(inEntry);
+ if (find(inInstances.begin(), inInstances.end(), theEntryInstance) == inInstances.end()) {
+ TGraphSlidePair thePair = m_SlideGraphCore->GetAssociatedGraph(theEntryInstance);
+ if (thePair.second == inSlide) // if this instance belongs to this slide
+ {
+ // get all references belong to this instance (ex: image instances that belong to this
+ // material instance)
+ qt3dsdm::SValue theValue;
+ for (TPropertyHandlePropertyInfoPairList::iterator theIter =
+ m_PropertyInfoPairList.begin();
+ theIter != m_PropertyInfoPairList.end(); ++theIter) {
+ if (m_DataCore->HasAggregateInstanceProperty(
+ theEntryInstance,
+ theIter->first) // check if the property exists before querying the value
+ && m_DataCore->GetInstancePropertyValue(
+ theEntryInstance, theIter->first,
+ theValue)) // this function may throw error if the property doesn't exist
+ {
+ Qt3DSDMInstanceHandle theInstance(
+ theIter->second->GetInstanceForProperty(theValue.toOldSkool()));
+ if (theInstance.Valid())
+ inInstances.push_back(theInstance);
+ }
+ }
+ // get this instance as well
+ inInstances.push_back(theEntryInstance);
+ }
+ }
+}
+
+// Delete the referenced instances of this slide
+// This function is very similar to GetReferencedInstances
+// You change one function, you need to change the other function
+void SSlideSystem::DeleteReferencedInstances(Qt3DSDMSlideHandle inSlide)
+{
+ // Recursively delete the children of this slide
+ // Usually the slide has children if it is a Master slide (for example when deleting a
+ // Component)
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(inSlide, theChildren);
+ do_all(theChildren, std::bind(&SSlideSystem::DeleteReferencedInstances, this,
+ std::placeholders::_1));
+
+ // Delete the referenced instances from this slide
+ TSlideEntryList theEntries;
+ m_SlideCore->GetSlidePropertyEntries(inSlide, theEntries);
+
+ // Run through all entries, if you find a reference property delete the associated instance.
+ // This is for properties that are set on this slide (because you can set property on slide or
+ // on instance)
+ TInstanceHandleList theReferencedInstances;
+ do_all(theEntries,
+ std::bind(InsertIfReferencedProperty, std::placeholders::_1,
+ std::cref(m_PropertyInfoPairList),
+ std::ref(theReferencedInstances)));
+ do_all(theReferencedInstances, std::bind(&IDataCore::DeleteInstance, m_DataCore,
+ std::placeholders::_1));
+
+ // Run through all entries, delete all instances that belong to this slide and its reference
+ // property instances
+ // This is for properties that are set on instance
+ theReferencedInstances.clear();
+ do_all(theEntries, std::bind(&SSlideSystem::InsertEntryAndPropertyInstance, this,
+ std::placeholders::_1,
+ std::ref(theReferencedInstances), inSlide));
+ do_all(theReferencedInstances, std::bind(&IDataCore::DeleteInstance, m_DataCore,
+ std::placeholders::_1));
+}
+
+// Get the referenced instances of this slide
+// This function is very similar to DeleteReferencedInstances
+// You change one function, you need to change the other function
+void SSlideSystem::GetReferencedInstances(Qt3DSDMSlideHandle inSlide,
+ TInstanceHandleList &outReferencedInstances)
+{
+ // Recursively get the children of this slide
+ // Usually the slide has children if it is a Master slide (for example Component)
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(inSlide, theChildren);
+ do_all(theChildren, std::bind(&SSlideSystem::GetReferencedInstances, this,
+ std::placeholders::_1,
+ std::ref(outReferencedInstances)));
+
+ // Get the referenced instances from this slide
+ TSlideEntryList theEntries;
+ m_SlideCore->GetSlidePropertyEntries(inSlide, theEntries);
+
+ // Run through all entries, if you find a reference property get the associated instance.
+ // This is for properties that are set on this slide (because you can set property on slide or
+ // on instance)
+ do_all(theEntries,
+ std::bind(InsertIfReferencedProperty, std::placeholders::_1,
+ std::cref(m_PropertyInfoPairList),
+ std::ref(outReferencedInstances)));
+
+ // Run through all entries, get all instances that belong to this slide and its reference
+ // property instances
+ // This is for properties that are set on instance
+ do_all(theEntries, std::bind(&SSlideSystem::InsertEntryAndPropertyInstance, this,
+ std::placeholders::_1,
+ std::ref(outReferencedInstances), inSlide));
+}
+
+void SSlideSystem::DeleteSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex)
+{
+ Qt3DSDMSlideHandle theChild = GetSlideByIndex(inMaster, inIndex);
+ TInstanceHandleList theInstances;
+ if (theChild.Valid()) {
+ DeleteReferencedInstances(theChild);
+ m_SlideCore->DeleteSlide(theChild, theInstances);
+ do_all(theInstances, std::bind(&IDataCore::DeleteInstance, m_DataCore,
+ std::placeholders::_1));
+ }
+ if (inIndex == 0)
+ GetSignalSender()->SendMasterDeleted(inMaster);
+ else
+ GetSignalSender()->SendSlideDeleted(inMaster, (int)inIndex, theChild);
+}
+
+void SSlideSystem::GetSlideReferencedInstances(Qt3DSDMSlideHandle inMaster, size_t inIndex,
+ TInstanceHandleList &outReferencedInstances)
+{
+ outReferencedInstances.clear();
+ Qt3DSDMSlideHandle theChild = GetSlideByIndex(inMaster, inIndex);
+ if (theChild.Valid()) {
+ GetReferencedInstances(theChild, outReferencedInstances);
+ }
+}
+
+Qt3DSDMSlideHandle SSlideSystem::GetSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) const
+{
+ if (inIndex == 0)
+ return inMaster;
+ --inIndex;
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(inMaster, theChildren);
+ if (inIndex < theChildren.size())
+ return theChildren[inIndex];
+ return Qt3DSDMSlideHandle();
+}
+
+void SSlideSystem::SetActiveSlide(Qt3DSDMSlideHandle inMaster, size_t inIndex)
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(inMaster);
+ Qt3DSDMSlideHandle theActiveSlide = inMaster;
+ if (inIndex > 0)
+ theActiveSlide = GetSlideByIndex(inMaster, inIndex);
+ Qt3DSDMSlideHandle theOldSlide = m_SlideGraphCore->GetGraphActiveSlide(theGraph);
+ m_SlideGraphCore->SetGraphActiveSlide(theGraph, theActiveSlide);
+ GetSignalSender()->SendActiveSlide(inMaster, (int)inIndex, theOldSlide, theActiveSlide);
+}
+
+size_t SSlideSystem::GetSlideCount(Qt3DSDMSlideHandle inMaster) const
+{
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(inMaster, theChildren);
+ return 1 + theChildren.size();
+}
+
+void SSlideSystem::RearrangeSlide(Qt3DSDMSlideHandle inMaster, size_t inOldIndex, size_t inNewIndex)
+{
+ if (inOldIndex == 0)
+ throw RearrangeSlideArgumentsMustNotBeZero(L"");
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(inMaster, theChildren);
+ Qt3DSDMSlideHandle theChild = theChildren.at(inOldIndex - 1);
+ m_SlideCore->DeriveSlide(theChild, inMaster, (int)inNewIndex - 1);
+ GetSignalSender()->SendSlideRearranged(inMaster, (int)inOldIndex, (int)inNewIndex);
+}
+
+void SSlideSystem::SetComponentSeconds(Qt3DSDMSlideHandle inSlide, float inSeconds)
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inSlide));
+ m_SlideCore->SetSlideTime(m_SlideGraphCore->GetGraphActiveSlide(theGraph), inSeconds);
+}
+
+float SSlideSystem::GetComponentSeconds(Qt3DSDMSlideHandle inSlide) const
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inSlide));
+ return m_SlideCore->GetSlideTime(m_SlideGraphCore->GetGraphActiveSlide(theGraph));
+}
+
+long SSlideSystem::GetComponentSecondsLong(Qt3DSDMSlideHandle inSlide) const
+{
+ float seconds(GetComponentSeconds(inSlide));
+ return static_cast<long>((seconds * 1000) + .5f);
+}
+
+long SSlideSystem::GetComponentSecondsLong(Qt3DSDMInstanceHandle inInstance) const
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetAssociatedGraph(inInstance).first;
+ float seconds = m_SlideCore->GetSlideTime(m_SlideGraphCore->GetGraphActiveSlide(theGraph));
+ return static_cast<long>((seconds * 1000) + .5f);
+}
+
+SInstanceSlideInformation
+SSlideSystem::GetInstanceSlideInformation(Qt3DSDMInstanceHandle inInstance) const
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance);
+ Qt3DSDMSlideHandle theAssociatedSlide(theGraphSlidePair.second);
+ if (theAssociatedSlide.Valid() == false)
+ return SInstanceSlideInformation();
+ Qt3DSDMSlideHandle theMasterSlide(GetMasterSlide(theGraphSlidePair.second));
+ Qt3DSDMSlideHandle theActiveSlide(
+ m_SlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first));
+ float seconds = m_SlideCore->GetSlideTime(theActiveSlide);
+ long theMilliseconds = static_cast<long>((seconds * 1000) + .5f);
+ return SInstanceSlideInformation(theAssociatedSlide, theMasterSlide, theActiveSlide,
+ theMilliseconds);
+}
+
+/**
+ * Use the instance for storing information such as name, or the GUID of the object
+ * this slide links to.
+ */
+Qt3DSDMInstanceHandle SSlideSystem::GetSlideInstance(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_SlideCore->GetSlideInstance(inSlide);
+}
+/**
+ * Reverse lookup into the slide system so you can match slides to instances.
+ */
+Qt3DSDMSlideHandle SSlideSystem::GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const
+{
+ return m_SlideCore->GetSlideByInstance(inSlide);
+}
+
+/**
+ * Slide may be either a master slide
+ */
+void SSlideSystem::AssociateInstanceWithSlide(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance)
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inSlide));
+ m_SlideGraphCore->AssociateInstance(theGraph, inSlide, inInstance);
+ GetSignalSender()->SendInstanceAssociated(inSlide, inInstance);
+}
+
+Qt3DSDMSlideHandle SSlideSystem::GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance) const
+{
+ return m_SlideGraphCore->GetAssociatedGraph(inInstance).second;
+}
+
+/**
+ * This gets the instances that resides int the SlideGraph, i.e. all the instances in all the
+ *slides for this component/scene
+ * TODO rename this to make it more clear
+ */
+void SSlideSystem::GetAssociatedInstances(Qt3DSDMSlideHandle inMaster,
+ TSlideInstancePairList &outAssociations) const
+{
+ m_SlideGraphCore->GetAssociatedInstances(
+ m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inMaster)), outAssociations);
+}
+
+/**
+ * Gets all the instances in this slide
+ */
+void SSlideSystem::GetAssociatedInstances(Qt3DSDMSlideHandle inSlide,
+ TInstanceHandleList &outAssociations) const
+{
+ Qt3DSDMSlideHandle theMasterSlide = GetMasterSlide(inSlide);
+ TSlideInstancePairList theGraphInstances;
+ m_SlideGraphCore->GetAssociatedInstances(m_SlideGraphCore->GetSlideGraph(theMasterSlide),
+ theGraphInstances);
+ for (TSlideInstancePairList::const_iterator theIter = theGraphInstances.begin();
+ theIter != theGraphInstances.end(); ++theIter) {
+ if (theIter->first == inSlide || theIter->first == theMasterSlide) {
+ // in the current slide or master slide
+ outAssociations.push_back(theIter->second);
+ }
+ }
+}
+
+void DeleteInstanceIfExistsAsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, TSlideCorePtr inSlideCore,
+ TPropertyInstanceInfoPtr inPropertyInfoPtr,
+ TDataCorePtr inDataCore)
+{
+ SValue theValue;
+ if (inSlideCore->GetSpecificInstancePropertyValue(inSlide, inInstance, inProperty, theValue)) {
+ Qt3DSDMInstanceHandle theInstance(inPropertyInfoPtr->GetInstanceForProperty(theValue));
+ if (theInstance.Valid())
+ inDataCore->DeleteInstance(theInstance);
+ }
+}
+
+void SSlideSystem::LinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty)
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetAssociatedGraph(inInstance).first;
+ Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphRoot(theGraph);
+ TPropertyHandlePropertyInfoPairList::const_iterator theFind =
+ find_if<TPropertyHandlePropertyInfoPairList::const_iterator>(
+ m_PropertyInfoPairList, std::bind(PropertyHandlePairEquals,
+ std::placeholders::_1, inProperty));
+ if (theFind != m_PropertyInfoPairList.end()) {
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(theSlide, theChildren);
+ do_all(theChildren, std::bind(DeleteInstanceIfExistsAsProperty, std::placeholders::_1, inInstance,
+ inProperty, m_SlideCore, theFind->second, m_DataCore));
+ }
+ m_SlideCore->ClearChildrenPropertyValues(theSlide, inInstance, inProperty);
+ GetSignalSender()->SendPropertyLinked(theSlide, inInstance, inProperty);
+}
+
+void ClearPropertyValueIfLinked(Qt3DSDMSlideHandle inMaster, const TSlideHandleList &inChildren,
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ TSlideCorePtr inSlideCore)
+{
+ if (inChildren.empty())
+ return;
+
+ if (inSlideCore->ContainsProperty(inChildren.at(0), inInstance,
+ inProperty)) // if property is linked,
+ inSlideCore->ClearChildrenPropertyValues(inMaster, inInstance,
+ inProperty); // get it off non-master slides
+}
+
+void SetReferencedEntryValue(Qt3DSDMSlideHandle inMaster, Qt3DSDMSlideHandle inDestSlide,
+ TPropertyInstanceInfoPtr inInfo, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ Qt3DSDMInstanceHandle inReferencedInstance, TSlideCorePtr inSlideCore)
+{
+ SValue theNewValue(
+ inInfo->CreateInstanceForProperty(inMaster, inDestSlide, inReferencedInstance));
+ inSlideCore->ForceSetInstancePropertyValue(inDestSlide, inInstance, inProperty, theNewValue);
+}
+
+void SSlideSystem::UnlinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty)
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetAssociatedGraph(inInstance).first;
+ Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphRoot(theGraph);
+ SValue theValue;
+ SValue theTempValue;
+ if (!m_SlideCore->GetInstancePropertyValue(theSlide, inInstance, inProperty, theValue)) {
+ if (!m_PropertySystem->GetInstancePropertyValue(inInstance, inProperty, theTempValue))
+ throw PropertyLinkError(L"");
+ theValue = theTempValue.toOldSkool();
+ }
+
+ m_SlideCore->ForceSetInstancePropertyValue(theSlide, inInstance, inProperty, theValue);
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(theSlide, theChildren);
+
+ Qt3DSDMInstanceHandle theReferenced;
+ TPropertyHandlePropertyInfoPairList::const_iterator theFind =
+ find_if<TPropertyHandlePropertyInfoPairList::const_iterator>(
+ m_PropertyInfoPairList, std::bind(PropertyHandlePairEquals,
+ std::placeholders::_1, inProperty));
+ TPropertyInstanceInfoPtr theInfo;
+ if (theFind != m_PropertyInfoPairList.end()) {
+ theInfo = theFind->second;
+ theReferenced = theInfo->GetInstanceForProperty(theValue);
+ }
+ if (theReferenced.Valid()) {
+ TPropertyHandleList theProperties;
+ m_PropertySystem->GetAggregateInstanceProperties(
+ theReferenced,
+ theProperties); // TODO: We should make the method return the custom properties.
+ // Remove the property instance's unlinked properties from non-master slides.
+ do_all(theProperties,
+ std::bind(ClearPropertyValueIfLinked, theSlide, std::cref(theChildren),
+ theReferenced, std::placeholders::_1, m_SlideCore));
+ // Remove all property values from the children from that instance.
+ do_all(theChildren, std::bind(SetReferencedEntryValue, theSlide,
+ std::placeholders::_1, theInfo, inInstance,
+ inProperty, theReferenced, m_SlideCore));
+ } else {
+ do_all(theChildren, std::bind(&ISlideCore::ForceSetInstancePropertyValue, m_SlideCore,
+ std::placeholders::_1,
+ inInstance, inProperty, theValue));
+ do_all(theChildren,
+ std::bind(CopyAnimationIfExist, theSlide, std::placeholders::_1, make_pair(inInstance, inProperty),
+ m_PropertySystem, m_AnimationCore));
+ }
+ GetSignalSender()->SendPropertyUnlinked(theSlide, inInstance, inProperty);
+}
+
+bool SSlideSystem::IsPropertyLinked(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance);
+ Qt3DSDMSlideGraphHandle theGraph = theGraphSlidePair.first;
+ if (!theGraph.Valid())
+ return false;
+
+ Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphRoot(theGraph);
+ if (theGraphSlidePair.second != theSlide)
+ return false;
+
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(theSlide, theChildren);
+ bool containsProperty = false;
+ for (TSlideHandleList::iterator theIter = theChildren.begin();
+ theIter != theChildren.end() && !containsProperty; ++theIter) {
+ containsProperty =
+ containsProperty || m_SlideCore->ContainsProperty(*theIter, inInstance, inProperty);
+ }
+
+ return !containsProperty;
+}
+
+bool SSlideSystem::CanPropertyBeLinked(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance);
+ if (theGraphSlidePair.first.Valid()
+ && theGraphSlidePair.second == m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first))
+ return true;
+ return false;
+}
+
+bool SSlideSystem::GetSlidePropertyValue(size_t inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue)
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance);
+ Qt3DSDMSlideGraphHandle theGraph = theGraphSlidePair.first;
+ if (!theGraph.Valid())
+ return false;
+ Qt3DSDMSlideHandle theSlide = GetSlideByIndex(m_SlideGraphCore->GetGraphRoot(theGraph), inSlide);
+ if (!theSlide.Valid())
+ return false;
+ return m_SlideCore->GetSpecificInstancePropertyValue(theSlide, inInstance, inProperty,
+ outValue);
+}
+
+void AddEntriesToHash(const TSlideEntryList &theSlideEntries, TSlideEntryHash &theEntryHash,
+ TInstancePropertyPairList &outProperties)
+{
+ for (size_t idx = 0, end = theSlideEntries.size(); idx < end; ++idx) {
+ const TSlideEntry &theEntry(theSlideEntries[idx]);
+ pair<TSlideEntryHash::iterator, bool> insertRecord(theEntryHash.insert(
+ make_pair(TSlideInstancePropertyPair(get<0>(theEntry), get<1>(theEntry)),
+ SInternValue::ISwearThisHasAlreadyBeenInternalized(get<2>(theEntry)))));
+ if (insertRecord.second)
+ outProperties.push_back(insertRecord.first->first);
+ }
+}
+
+void SSlideSystem::GetUnionOfProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2,
+ TInstancePropertyPairList &outProperties) const
+{
+ TSlideEntryHash theEntryHash;
+ TSlideEntryList theSlideEntries;
+ if (m_SlideCore->IsSlide(inSlide1)) {
+ m_SlideCore->GetSlidePropertyEntries(inSlide1, theSlideEntries);
+ AddEntriesToHash(theSlideEntries, theEntryHash, outProperties);
+ }
+ if (m_SlideCore->IsSlide(inSlide2)) {
+ m_SlideCore->GetSlidePropertyEntries(inSlide2, theSlideEntries);
+ AddEntriesToHash(theSlideEntries, theEntryHash, outProperties);
+ }
+}
+
+void SSlideSystem::SetActiveSlide(Qt3DSDMSlideHandle inSlide)
+{
+ Qt3DSDMSlideHandle theMaster = GetMasterSlide(inSlide);
+ int theIndex = GetSlideIndex(inSlide);
+ SetActiveSlide(theMaster, theIndex);
+}
+
+Qt3DSDMSlideHandle SSlideSystem::GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance);
+ Qt3DSDMSlideGraphHandle theGraph = theGraphSlidePair.first;
+ if (!theGraph.Valid())
+ return 0;
+ Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphActiveSlide(theGraph);
+ if (theSlide.Valid()) {
+ if (m_SlideCore->ContainsProperty(theSlide, inInstance, inProperty))
+ return theSlide;
+ theSlide = m_SlideCore->GetParentSlide(theSlide);
+ if (theSlide.Valid() && m_SlideCore->ContainsProperty(theSlide, inInstance, inProperty))
+ return theSlide;
+ return theGraphSlidePair.second;
+ }
+ return 0;
+}
+
+bool SSlideSystem::SlideValid(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_SlideCore->HandleValid(inSlide);
+}
+
+int SSlideSystem::GetSlideIndex(Qt3DSDMSlideHandle inSlide) const
+{
+ Qt3DSDMSlideHandle theMaster = GetMasterSlide(inSlide);
+ if (inSlide.Valid() && inSlide != theMaster)
+ return m_SlideCore->GetChildIndex(theMaster, inSlide) + 1;
+ return 0;
+}
+
+int SSlideSystem::GetActiveSlideIndex(Qt3DSDMSlideHandle inMaster) const
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(inMaster);
+ Qt3DSDMSlideHandle theActiveSlide = m_SlideGraphCore->GetGraphActiveSlide(theGraph);
+ if (theActiveSlide == inMaster)
+ return 0;
+ return GetSlideIndex(theActiveSlide);
+}
+
+Qt3DSDMSlideHandle SSlideSystem::GetActiveSlide(Qt3DSDMSlideHandle inMaster) const
+{
+ Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(inMaster);
+ return m_SlideGraphCore->GetGraphActiveSlide(theGraph);
+}
+
+Qt3DSDMInstanceHandle SSlideSystem::GetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide) const
+{
+ TIntIntMap::const_iterator theIter = m_SlideSelectedInstances.find(inSlide);
+ if (theIter != m_SlideSelectedInstances.end() && m_DataCore->IsInstance(theIter->second))
+ return theIter->second;
+ return 0;
+}
+
+void SSlideSystem::SetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance)
+{
+ m_SlideSelectedInstances[inSlide] = inInstance;
+}
+
+void SSlideSystem::RegisterPropertyInstance(Qt3DSDMPropertyHandle inPropertyHandle,
+ TPropertyInstanceInfoPtr inPropertyInfo)
+{
+ m_PropertyInfoPairList.push_back(make_pair(inPropertyHandle, inPropertyInfo));
+}
+
+ISlideSystemSignalProvider *SSlideSystem::GetSignalProvider()
+{
+ return dynamic_cast<ISlideSystemSignalProvider *>(m_Signaller.get());
+}
+
+ISlideSystemSignalSender *SSlideSystem::GetSignalSender()
+{
+ return dynamic_cast<ISlideSystemSignalSender *>(m_Signaller.get());
+}
+
+qt3dsdm::Qt3DSDMSlideHandle SSlideSystem::GetApplicableSlide(Qt3DSDMInstanceHandle inHandle)
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inHandle);
+ if (!theGraphSlidePair.first.Valid())
+ return Qt3DSDMSlideHandle();
+
+ Qt3DSDMSlideHandle theMaster = m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first);
+ if (theGraphSlidePair.second != theMaster)
+ return theGraphSlidePair.second;
+
+ return theMaster;
+}
+
+qt3dsdm::Qt3DSDMSlideHandle SSlideSystem::GetApplicableSlide(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inHandle);
+ if (!theGraphSlidePair.first.Valid())
+ return Qt3DSDMSlideHandle();
+
+ Qt3DSDMSlideHandle theMaster = m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first);
+ if (theGraphSlidePair.second != theMaster)
+ return theGraphSlidePair.second;
+
+ Qt3DSDMSlideHandle theActive = m_SlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first);
+ if (m_SlideCore->ContainsProperty(theActive, inHandle, inProperty))
+ return theActive;
+
+ return theMaster;
+}
+
+bool SSlideSystem::GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const
+{
+ return m_SlideCore->GetInstancePropertyValue(inSlide, inInstance, inProperty, outValue);
+}
+
+bool SSlideSystem::GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance);
+ if (theGraphSlidePair.first.Valid()) {
+ // Check to see if the object is on the master slide;
+ if (theGraphSlidePair.second == m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first)) {
+ TSlideHandleList theChildren;
+ m_SlideCore->GetChildSlides(theGraphSlidePair.second, theChildren);
+ // See if the value exists on slide 1.
+ if (!theChildren.empty()
+ && m_SlideCore->GetSpecificInstancePropertyValue(theChildren.at(0), inInstance,
+ inProperty, outValue))
+ return true;
+ }
+
+ if (m_SlideCore->GetSpecificInstancePropertyValue(theGraphSlidePair.second, inInstance,
+ inProperty, outValue))
+ return true;
+ }
+ return false;
+}
+
+void SSlideSystem::ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ m_SlideCore->ForceSetInstancePropertyValue(inSlide, inInstance, inProperty, inValue);
+}
+}
diff --git a/src/dm/systems/SlideSystem.h b/src/dm/systems/SlideSystem.h
new file mode 100644
index 0000000..1ea3f81
--- /dev/null
+++ b/src/dm/systems/SlideSystem.h
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef SLIDESYSTEMH
+#define SLIDESYSTEMH
+#include "Qt3DSDMDataCore.h"
+#include "Qt3DSDMSlideCore.h"
+#include "Qt3DSDMSlideGraphCore.h"
+#include "Qt3DSDMTransactions.h"
+#include "Qt3DSDMSlides.h"
+#include "Qt3DSDMAnimation.h"
+#include "StudioPropertySystem.h"
+#include "SignalsImpl.h"
+
+/**
+ * The systems aggregate the various cores and provide further information or
+ * integrity checking taking the various cores into account.
+ */
+
+namespace qt3dsdm {
+
+typedef std::pair<Qt3DSDMPropertyHandle, TPropertyInstanceInfoPtr> TPropertyHandlePropertyInfoPair;
+typedef std::vector<TPropertyHandlePropertyInfoPair> TPropertyHandlePropertyInfoPairList;
+/**
+ * Provides more thorough checking and will return an appropriate
+ * slide graph when calling GetSlideGraph
+ */
+struct SSlideSystem : public ISlideSystem
+{
+ Q_DISABLE_COPY(SSlideSystem)
+
+ TDataCorePtr m_DataCore; // TODO: We might want to throw this away and use the PropertySystem,
+ // unless we have a clean seperate of IPropertySystem and IDataCore
+ TPropertySystemPtr m_PropertySystem;
+ TSlideCorePtr m_SlideCore;
+ TSlideGraphCorePtr m_SlideGraphCore;
+ TAnimationCorePtr m_AnimationCore;
+ Qt3DSDMInstanceHandle m_SlideInstance;
+ Qt3DSDMPropertyHandle m_ComponentGuid;
+ std::shared_ptr<ISignalItem> m_Signaller;
+ TPropertyHandlePropertyInfoPairList m_PropertyInfoPairList;
+ typedef std::unordered_map<int, int> TIntIntMap;
+ TIntIntMap m_SlideSelectedInstances;
+
+ SSlideSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore,
+ TSlideGraphCorePtr inSlideGraphCore, TAnimationCorePtr inAnimationCore,
+ Qt3DSDMInstanceHandle inSlideInstance,
+ Qt3DSDMPropertyHandle inComponentGuidProperty);
+
+ void SetPropertySystem(TPropertySystemPtr inPropertySystem);
+
+ Qt3DSDMSlideHandle CreateMasterSlide() override;
+ Qt3DSDMSlideHandle CreateSlide(Qt3DSDMSlideHandle inMaster, int inIndex = -1) override;
+ Qt3DSDMSlideHandle DuplicateSlide(Qt3DSDMSlideHandle inSourceSlide, int inDestIndex = -1) override;
+ Qt3DSDMSlideHandle GetMasterSlide(Qt3DSDMSlideHandle inSlide) const override;
+ bool IsMasterSlide(Qt3DSDMSlideHandle inSlide) const override;
+ Qt3DSDMSlideHandle GetMasterSlideByComponentGuid(SLong4 inGuid) const override;
+ // Indexes are 1 based. Index 0 refers to the master slide; you can't delete this.
+ void DeleteSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) override;
+ void GetSlideReferencedInstances(Qt3DSDMSlideHandle inMaster, size_t inIndex,
+ TInstanceHandleList &outReferencedInstances) override;
+ Qt3DSDMSlideHandle GetSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) const override;
+ void SetActiveSlide(Qt3DSDMSlideHandle inMaster, size_t inIndex) override;
+ size_t GetSlideCount(Qt3DSDMSlideHandle inMaster) const override;
+ void RearrangeSlide(Qt3DSDMSlideHandle inMaster, size_t inOldIndex, size_t inNewIndex) override;
+
+ void SetComponentSeconds(Qt3DSDMSlideHandle inSlide, float inSeconds) override;
+ float GetComponentSeconds(Qt3DSDMSlideHandle inSlide) const override;
+ long GetComponentSecondsLong(Qt3DSDMSlideHandle inSlide) const override;
+ // For any given instance, find the current seconds via backtracking to the graph, finding the
+ // active
+ // slide, and return.
+ long GetComponentSecondsLong(Qt3DSDMInstanceHandle inInstance) const override;
+ virtual SInstanceSlideInformation
+ GetInstanceSlideInformation(Qt3DSDMInstanceHandle inInstance) const override;
+ /**
+ * Use the instance for storing information such as name, or the GUID of the object
+ * this slide links to.
+ */
+ Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inInstance) const override;
+ /**
+ * Reverse lookup into the slide system so you can match slides to instances.
+ */
+ Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const override;
+
+ /**
+ * Slide may be either a master slide or a normal slide. This will associate this instance
+ * with this set of slides. Property lookups (using the above IInstancePropertyCore interface)
+ * will now run through the slide set before hitting the main data core database.
+ */
+ void AssociateInstanceWithSlide(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) override;
+ Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance) const override;
+ void GetAssociatedInstances(
+ Qt3DSDMSlideHandle inMaster,
+ std::vector<std::pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle>> &outAssociations) const override;
+ void GetAssociatedInstances(Qt3DSDMSlideHandle inSlide,
+ TInstanceHandleList &outAssociations) const override;
+ void LinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override;
+ void UnlinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override;
+ bool IsPropertyLinked(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ bool CanPropertyBeLinked(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ bool GetSlidePropertyValue(size_t inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) override;
+ void GetUnionOfProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide,
+ TInstancePropertyPairList &outProperties) const override;
+
+ void SetActiveSlide(Qt3DSDMSlideHandle inSlide) override;
+ Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+
+ bool SlideValid(Qt3DSDMSlideHandle inSlide) const override;
+ int GetSlideIndex(Qt3DSDMSlideHandle inSlide) const override;
+ int GetActiveSlideIndex(Qt3DSDMSlideHandle inMaster) const override;
+ Qt3DSDMSlideHandle GetActiveSlide(Qt3DSDMSlideHandle inMaster) const override;
+ Qt3DSDMInstanceHandle GetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide) const override;
+ void SetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance) override;
+
+ Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle) override;
+ Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) override;
+
+ bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+ bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const override;
+ void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) override;
+
+ void RegisterPropertyInstance(Qt3DSDMPropertyHandle inPropertyHandle,
+ TPropertyInstanceInfoPtr inPropertyInfo) override;
+
+ virtual ISlideSystemSignalProvider *GetSignalProvider();
+
+private:
+ virtual ISlideSystemSignalSender *GetSignalSender();
+ // helper method
+ void InsertEntryAndPropertyInstance(const TSlideEntry &inEntry,
+ TInstanceHandleList &inInstances,
+ Qt3DSDMSlideHandle inSlide);
+ void DeleteReferencedInstances(Qt3DSDMSlideHandle inSlide);
+ void GetReferencedInstances(Qt3DSDMSlideHandle inSlide,
+ TInstanceHandleList &outReferencedInstances);
+};
+}
+
+#endif
diff --git a/src/dm/systems/StandardExtensions.h b/src/dm/systems/StandardExtensions.h
new file mode 100644
index 0000000..a994600
--- /dev/null
+++ b/src/dm/systems/StandardExtensions.h
@@ -0,0 +1,196 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef STANDARDEXTENSIONSH
+#define STANDARDEXTENSIONSH
+#include <algorithm>
+
+namespace qt3dsdm {
+template <typename TContainer, typename TPred>
+inline void erase_if(TContainer &inContainer, TPred inPred)
+{
+ inContainer.erase(std::remove_if(inContainer.begin(), inContainer.end(), inPred),
+ inContainer.end());
+}
+
+template <typename TRetType, typename TContainerType, typename TPred>
+inline TRetType find_if(TContainerType &inContainer, TPred inPred)
+{
+ return std::find_if(inContainer.begin(), inContainer.end(), inPred);
+}
+
+template <typename TContainer, typename TTransaction>
+inline void do_all(TContainer &inContainer, TTransaction inTransaction)
+{
+ std::for_each(inContainer.begin(), inContainer.end(), inTransaction);
+}
+
+template <typename TNumType, typename TTransaction>
+inline void do_times(TNumType numberOfTimes, TTransaction inTransaction)
+{
+ for (TNumType index = 0; index < numberOfTimes; ++index)
+ inTransaction(index);
+}
+
+template <typename TCountFunc, typename TItemByIndexFunc, typename TTransaction>
+inline void for_each_item(TCountFunc inCountFunc, TItemByIndexFunc inItemByIndex,
+ TTransaction inTransaction)
+{
+ int theEnd = static_cast<int>(inCountFunc());
+ for (int index = 0; index < theEnd; ++index)
+ inTransaction(inItemByIndex(index));
+}
+
+template <typename TContainerType, typename TItemType>
+inline void insert_unique(TContainerType &inContainer, const TItemType &inItem)
+{
+ if (find(inContainer.begin(), inContainer.end(), inItem) == inContainer.end())
+ inContainer.insert(inContainer.end(), inItem);
+}
+
+template <typename TContainerType, typename TItemType, typename TPred>
+inline void insert_unique_if(TContainerType &inContainer, const TItemType &inItem, TPred inPred)
+{
+ if (find_if(inContainer.begin(), inContainer.end(), inPred) == inContainer.end())
+ inContainer.insert(inContainer.end(), inItem);
+}
+
+template <typename TItemType>
+inline TItemType identity(const TItemType &inValue)
+{
+ return inValue;
+}
+
+template <typename TItemType, typename TOutContainerType>
+inline void transformv_all(const std::vector<TItemType> &inSource, TOutContainerType &outDest)
+{
+ outDest.resize(inSource.size());
+ std::transform(inSource.begin(), inSource.end(), outDest.begin(), identity<TItemType>);
+}
+
+template <typename TContainerType, typename Pred>
+inline bool exists(TContainerType &inContainer, Pred inPredicate)
+{
+ return std::find_if(inContainer.begin(), inContainer.end(), inPredicate) != inContainer.end();
+}
+
+// Always return a default value (useful for default true for false)
+template <typename TRetType>
+inline TRetType always(TRetType inValue)
+{
+ return inValue;
+}
+
+template <typename TRetType, typename TIgnoreType>
+inline TRetType always_ignore(TIgnoreType, TRetType inValue)
+{
+ return inValue;
+}
+
+template <typename TArgument, typename TTransaction, typename TPredicate>
+inline void predicate_apply(TArgument inArgument, TTransaction inTransaction,
+ TPredicate inPredicate)
+{
+ if (inPredicate(inArgument))
+ inTransaction(inArgument);
+}
+
+template <typename TItemType>
+inline void assign_to(const TItemType &inSource, TItemType &inDest)
+{
+ inDest = inSource;
+}
+
+template <typename TPredType, typename TArgType>
+bool complement(TPredType inPredicate, TArgType inArgument)
+{
+ return !(inPredicate(inArgument));
+}
+
+template <typename TItemType, typename TPredicate>
+void insert_or_update(const TItemType &inItem, std::vector<TItemType> &inItems,
+ TPredicate inPredicate)
+{
+ typename std::vector<TItemType>::iterator theIter =
+ find_if<typename std::vector<TItemType>::iterator>(inItems, inPredicate);
+ if (theIter == inItems.end())
+ inItems.push_back(inItem);
+ else
+ *theIter = inItem;
+}
+
+template <typename TItemType>
+typename std::vector<TItemType>::iterator binary_sort_find(std::vector<TItemType> &inItems,
+ const TItemType &inItem)
+{
+ typedef typename std::vector<TItemType>::iterator TIterType;
+ TIterType insertPos = std::lower_bound(inItems.begin(), inItems.end(), inItem);
+ if (insertPos != inItems.end() && *insertPos == inItem)
+ return insertPos;
+ return inItems.end();
+}
+
+template <typename TItemType, typename TPredicate>
+std::pair<typename std::vector<TItemType>::iterator, bool>
+binary_sort_insert_unique(std::vector<TItemType> &inItems, const TItemType &inItem,
+ TPredicate inPredicate)
+{
+ typedef typename std::vector<TItemType>::iterator TIterType;
+ TIterType insertPos = std::lower_bound(inItems.begin(), inItems.end(), inItem, inPredicate);
+ // OK, insertPos can equal begin, it can equal end, or somewhere in between.
+ // If it doesn't equal end, then we may be pointing at the object and we let
+ // the caller figure out what to do. Else we insert
+ if (insertPos != inItems.end() && *insertPos == inItem)
+ return std::make_pair(insertPos, false);
+ size_t diff = insertPos - inItems.begin();
+ inItems.insert(insertPos, inItem);
+ return std::make_pair(inItems.begin() + diff, true);
+}
+
+template <typename TItemType>
+std::pair<typename std::vector<TItemType>::iterator, bool>
+binary_sort_insert_unique(std::vector<TItemType> &inItems, const TItemType &inItem)
+{
+ return binary_sort_insert_unique(inItems, inItem, std::less<TItemType>());
+}
+
+template <typename TItemType>
+bool binary_sort_erase(std::vector<TItemType> &inItems, const TItemType &inItem)
+{
+ typedef typename std::vector<TItemType>::iterator TIterType;
+ TIterType insertPos = binary_sort_find(inItems, inItem);
+ if (insertPos != inItems.end()) {
+ inItems.erase(insertPos);
+ return true;
+ }
+ return false;
+}
+}
+
+#endif
diff --git a/src/dm/systems/StudioAnimationSystem.cpp b/src/dm/systems/StudioAnimationSystem.cpp
new file mode 100644
index 0000000..2b78888
--- /dev/null
+++ b/src/dm/systems/StudioAnimationSystem.cpp
@@ -0,0 +1,610 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "StudioAnimationSystem.h"
+#include "StudioPropertySystem.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+bool AnimationFloatPairContainsAnimation(Qt3DSDMAnimationHandle inAnimation,
+ const TAnimationFloatPair &inPair)
+{
+ return inAnimation == inPair.first;
+}
+
+CStudioAnimationSystem::CStudioAnimationSystem(TPropertySystemPtr inPropertySystem,
+ TSlideSystemPtr inSlideSystem,
+ TSlideCorePtr inSlideCore,
+ TSlideGraphCorePtr inSlideGraphCore,
+ TAnimationCorePtr inAnimationCore)
+ : m_PropertySystem(inPropertySystem)
+ , m_SlideSystem(inSlideSystem)
+ , m_SlideCore(inSlideCore)
+ , m_SlideGraphCore(inSlideGraphCore)
+ , m_AnimationCore(inAnimationCore)
+ , m_AutoKeyframe(false)
+ , m_SmoothInterpolation(false)
+{
+ IAnimationCoreSignalProvider *theAnimationSignals =
+ dynamic_cast<IAnimationCoreSignalProvider *>(m_AnimationCore.get());
+ m_Connections.push_back(theAnimationSignals->ConnectAnimationDeleted(
+ std::bind(&CStudioAnimationSystem::OnAnimationDeleted, this, std::placeholders::_1)));
+}
+
+void CStudioAnimationSystem::OnAnimationDeleted(Qt3DSDMAnimationHandle inAnimation)
+{
+ ClearTemporaryAnimationValues(inAnimation);
+}
+
+void CStudioAnimationSystem::ClearTemporaryAnimationValues()
+{
+ m_AnimationFloatPairs.clear();
+}
+
+void CStudioAnimationSystem::ClearTemporaryAnimationValues(Qt3DSDMAnimationHandle inAnimation)
+{
+ erase_if(m_AnimationFloatPairs,
+ std::bind(AnimationFloatPairContainsAnimation, inAnimation, std::placeholders::_1));
+}
+
+inline bool IsAnimationInfoEqual(const SAnimationInfo &inInfo, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty)
+{
+ if (inInfo.m_Slide == inSlide && inInfo.m_Instance == inInstance
+ && inInfo.m_Property == inProperty)
+ return true;
+ return false;
+}
+inline bool IsAnimationInfoEqual(const SAnimationInfo &inInfo, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ size_t inIndex)
+{
+ if (IsAnimationInfoEqual(inInfo, inSlide, inInstance, inProperty) && inInfo.m_Index == inIndex)
+ return true;
+ return false;
+}
+
+inline bool ApplyIfAnimationMatches(TAnimationFloatPair inAnimationFloatPair,
+ Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ TAnimationCorePtr inAnimationCore, SValue &outValue)
+{
+ SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimationFloatPair.first);
+ if (IsAnimationInfoEqual(theInfo, inSlide, inInstance, inProperty)) {
+ SetAnimationValue(inAnimationFloatPair.second, theInfo.m_Index, outValue);
+ return true;
+ }
+ return false;
+}
+
+void CStudioAnimationSystem::OverrideChannelIfAnimated(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ size_t inIndex, float inSeconds,
+ bool &ioAnimated, SValue &outValue) const
+{
+ Qt3DSDMAnimationHandle theAnimation =
+ m_AnimationCore->GetAnimation(inSlide, inInstance, inProperty, inIndex);
+ if (theAnimation.Valid() && m_AnimationCore->GetKeyframeCount(theAnimation)) {
+ float theValue = m_AnimationCore->EvaluateAnimation(theAnimation, inSeconds);
+ SetAnimationValue(theValue, inIndex, outValue);
+ ioAnimated |= true;
+ }
+}
+
+// Value must be *primed* first.
+bool CStudioAnimationSystem::GetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ bool retval = false;
+
+ tuple<bool, size_t> arity = GetVariantAnimatableAndArity(outValue);
+ if (get<0>(arity)) {
+ for (size_t index = 0; index < m_AnimationFloatPairs.size(); ++index)
+ retval |= ApplyIfAnimationMatches(m_AnimationFloatPairs.at(index), inSlide, inInstance,
+ inProperty, m_AnimationCore, outValue);
+ }
+
+ if (!retval) {
+ bool animatable;
+ size_t numChannels;
+ bool animated = false;
+
+ std::tie(animatable, numChannels) = GetVariantAnimatableAndArity(outValue);
+ if (animatable) {
+ TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance);
+ float theSeconds = m_SlideCore->GetSlideTime(
+ m_SlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first));
+
+ do_times(numChannels, std::bind(&CStudioAnimationSystem::OverrideChannelIfAnimated,
+ this, inSlide, inInstance, inProperty,
+ std::placeholders::_1, theSeconds,
+ std::ref(animated), std::ref(outValue)));
+ }
+
+ if (animated)
+ retval = true;
+ }
+
+ return retval;
+}
+
+bool KeyframeNear(const TKeyframe &inKeyframe, float inSeconds)
+{
+ return fabs(KeyframeTime(inKeyframe) - inSeconds) < .01;
+}
+Qt3DSDMKeyframeHandle CreateKeyframeExplicit(Qt3DSDMAnimationHandle inAnimation, float inValue,
+ float inSeconds, TAnimationCorePtr inAnimationCore,
+ float inEaseIn, float inEaseOut)
+{
+ TKeyframeHandleList theKeyframes;
+ float theValue = inValue;
+ inAnimationCore->GetKeyframes(inAnimation, theKeyframes);
+ function<TKeyframe(Qt3DSDMKeyframeHandle)> theConverter(
+ std::bind(&IAnimationCore::GetKeyframeData, inAnimationCore, std::placeholders::_1));
+
+ TKeyframeHandleList::iterator theFind =
+ std::find_if(theKeyframes.begin(), theKeyframes.end(),
+ [theConverter, inSeconds](const Qt3DSDMKeyframeHandle &handle)
+ { return KeyframeNear(theConverter(handle), inSeconds); });
+
+ float theEaseIn = inEaseIn;
+ float theEaseOut = inEaseOut;
+ Qt3DSDMKeyframeHandle theKeyframe;
+ if (theFind != theKeyframes.end()) {
+ theKeyframe = *theFind;
+
+ inAnimationCore->SetKeyframeData(
+ theKeyframe, CreateEaseInEaseOutKeyframe(inSeconds, theValue, theEaseIn, theEaseOut));
+ } else {
+ theKeyframe = inAnimationCore->InsertKeyframe(
+ inAnimation, CreateEaseInEaseOutKeyframe(inSeconds, theValue, theEaseIn, theEaseOut));
+ }
+ return theKeyframe;
+}
+
+Qt3DSDMKeyframeHandle CreateKeyframe(Qt3DSDMAnimationHandle inAnimation, const SValue &inValue,
+ float inSeconds, TAnimationCorePtr inAnimationCore,
+ float inEaseIn, float inEaseOut)
+{
+ SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation));
+ return CreateKeyframeExplicit(inAnimation, GetAnimationValue(theInfo.m_Index, inValue),
+ inSeconds, inAnimationCore, inEaseIn, inEaseOut);
+}
+
+void MaybeAddAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore, TAnimationHandleList &outAnimations)
+{
+ SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation));
+ if (IsAnimationInfoEqual(theInfo, inSlide, inInstance, inProperty))
+ outAnimations.push_back(inAnimation);
+}
+
+bool SortAnimationHandlesByIndex(Qt3DSDMAnimationHandle lhs, Qt3DSDMAnimationHandle rhs,
+ TAnimationCorePtr inCore)
+{
+ return inCore->GetAnimationInfo(lhs).m_Index < inCore->GetAnimationInfo(rhs).m_Index;
+}
+
+void GetPresentAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const TAnimationFloatPairList &inAnimationPairs,
+ TAnimationCorePtr inAnimationCore, TAnimationHandleList &outAnimations)
+{
+ function<void(Qt3DSDMAnimationHandle)> theOperation(
+ std::bind(MaybeAddAnimation, inSlide, inInstance, inProperty,
+ std::placeholders::_1, inAnimationCore,
+ std::ref(outAnimations)));
+
+ for (auto animation : inAnimationPairs) {
+ MaybeAddAnimation(inSlide, inInstance, inProperty, animation.first, inAnimationCore,
+ std::ref(outAnimations));
+ }
+
+ if (outAnimations.empty()) {
+ TAnimationHandleList theAnimationHandles;
+ inAnimationCore->GetAnimations(theAnimationHandles);
+ do_all(theAnimationHandles, theOperation);
+ }
+ std::sort(outAnimations.begin(), outAnimations.end(),
+ std::bind(SortAnimationHandlesByIndex,
+ std::placeholders::_1, std::placeholders::_2, inAnimationCore));
+}
+
+void CreateAnimationAndAdd(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ TAnimationCorePtr inAnimationCore, TAnimationHandleList &outAnimations)
+{
+ outAnimations.push_back(inAnimationCore->CreateAnimation(
+ inSlide, inInstance, inProperty, inIndex, EAnimationTypeEaseInOut, false));
+}
+
+bool AnimationValueDiffers(Qt3DSDMAnimationHandle inAnimation, const SValue &inValue,
+ float inSeconds, TAnimationCorePtr inAnimationCore)
+{
+ SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation));
+ if (inAnimationCore->GetKeyframeCount(inAnimation) == 0)
+ return true; // currently there is no keyframe, so return true
+ float theValue = GetAnimationValue(theInfo.m_Index, inValue);
+ float theAnimatedValue = inAnimationCore->EvaluateAnimation(inAnimation, inSeconds);
+ return fabs(theValue - theAnimatedValue) > .001;
+}
+
+bool AnimationExistsInPresentAnimations(const TAnimationFloatPair &inAnimation,
+ TAnimationHandleList &inPresentAnimations)
+{
+ return exists(inPresentAnimations,
+ std::bind(equal_to<Qt3DSDMAnimationHandle>(), inAnimation.first,
+ std::placeholders::_1));
+}
+
+void DoKeyframeProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue, float inTimeInSecs,
+ bool inDoDiffValue, TAnimationCorePtr inAnimationCore,
+ TAnimationFloatPairList &inAnimationFloatPairs, float inEaseIn,
+ float inEaseOut)
+{
+ tuple<bool, size_t> arity = GetVariantAnimatableAndArity(inValue);
+ TAnimationHandleList thePresentAnimations;
+ GetPresentAnimations(inSlide, inInstance, inProperty, std::cref(inAnimationFloatPairs),
+ inAnimationCore, thePresentAnimations);
+ if (thePresentAnimations.empty())
+ do_times(get<1>(arity), std::bind(CreateAnimationAndAdd, inSlide, inInstance, inProperty,
+ std::placeholders::_1,
+ inAnimationCore, std::ref(thePresentAnimations)));
+ if (!inDoDiffValue
+ || find_if(thePresentAnimations.begin(), thePresentAnimations.end(),
+ std::bind(AnimationValueDiffers,
+ std::placeholders::_1, inValue, inTimeInSecs, inAnimationCore))
+ != thePresentAnimations.end()) {
+ do_all(thePresentAnimations,
+ std::bind(CreateKeyframe, std::placeholders::_1,
+ std::cref(inValue), inTimeInSecs, inAnimationCore,
+ inEaseIn, inEaseOut));
+ erase_if(inAnimationFloatPairs, std::bind(AnimationExistsInPresentAnimations,
+ std::placeholders::_1,
+ std::ref(thePresentAnimations)));
+ }
+}
+
+void DoKeyframeProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue, bool inDoDiffValue,
+ TAnimationCorePtr inAnimationCore, TSlideGraphCorePtr inSlideGraphCore,
+ TSlideCorePtr inSlideCore, TAnimationFloatPairList &inAnimationFloatPairs,
+ float inEaseIn, float inEaseOut)
+{
+ TGraphSlidePair theGraphSlidePair = inSlideGraphCore->GetAssociatedGraph(inInstance);
+ float theCurrentTime =
+ inSlideCore->GetSlideTime(inSlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first));
+ DoKeyframeProperty(inSlide, inInstance, inProperty, inValue, theCurrentTime, inDoDiffValue,
+ inAnimationCore, inAnimationFloatPairs, inEaseIn, inEaseOut);
+}
+
+void DoKeyframeProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue, bool inDoDiffValue,
+ TAnimationCorePtr inAnimationCore, TSlideGraphCorePtr inSlideGraphCore,
+ TSlideCorePtr inSlideCore, TAnimationFloatPairList &inAnimationFloatPairs,
+ bool inSmoothInterpolation)
+{
+ float theEaseIn = 0.0f, theEaseOut = 0.0f;
+ if (inSmoothInterpolation)
+ theEaseIn = theEaseOut = 100.f;
+ DoKeyframeProperty(inSlide, inInstance, inProperty, inValue, inDoDiffValue, inAnimationCore,
+ inSlideGraphCore, inSlideCore, inAnimationFloatPairs, theEaseIn, theEaseOut);
+}
+
+TAnimationFloatPair CreateAnimationFloatPair(Qt3DSDMAnimationHandle inAnimation,
+ const SValue &inValue,
+ TAnimationCorePtr inAnimationCore)
+{
+ SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation));
+ float theValue = GetAnimationValue(theInfo.m_Index, inValue);
+ return make_pair(inAnimation, theValue);
+}
+
+void InsertUniqueAnimationFloatPair(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationFloatPairList &inList, const SValue &inValue,
+ TAnimationCorePtr inAnimationCore)
+{
+ TAnimationFloatPair thePair = CreateAnimationFloatPair(inAnimation, inValue, inAnimationCore);
+ insert_or_update(thePair, inList,
+ std::bind(AnimationFloatPairContainsAnimation, inAnimation, std::placeholders::_1));
+}
+
+bool CStudioAnimationSystem::SetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ tuple<bool, size_t> arity = GetVariantAnimatableAndArity(inValue);
+ if (get<0>(arity)) {
+ if (m_AutoKeyframe && IsPropertyAnimated(inInstance, inProperty)) // prerequisite for
+ // autoset-keyframes is
+ // that the property is
+ // already animated.
+ {
+ DoKeyframeProperty(inSlide, inInstance, inProperty, inValue, true, m_AnimationCore,
+ m_SlideGraphCore, m_SlideCore, m_AnimationFloatPairs,
+ m_SmoothInterpolation);
+ return true;
+ }
+
+ TAnimationHandleList thePresentAnimations;
+ GetPresentAnimations(inSlide, inInstance, inProperty, std::cref(m_AnimationFloatPairs),
+ m_AnimationCore, thePresentAnimations);
+ if (!thePresentAnimations.empty()) {
+ TAnimationFloatPairList thePreList(m_AnimationFloatPairs);
+ do_all(thePresentAnimations, std::bind(InsertUniqueAnimationFloatPair, std::placeholders::_1,
+ std::ref(m_AnimationFloatPairs),
+ std::cref(inValue), m_AnimationCore));
+
+
+ if (m_Consumer && m_refreshCallback) {
+ // Only create a single refresh per transaction stack
+ if (((CTransactionConsumer *)m_Consumer.get())->m_TransactionList.size() == 0) {
+ CreateGenericTransactionWithConsumer(
+ __FILE__, __LINE__, m_Consumer,
+ std::bind(m_refreshCallback, inInstance),
+ std::bind(m_refreshCallback, inInstance));
+ }
+ }
+
+ CreateGenericTransactionWithConsumer(
+ __FILE__, __LINE__, m_Consumer,
+ std::bind(assign_to<TAnimationFloatPairList>, m_AnimationFloatPairs,
+ std::ref(m_AnimationFloatPairs)),
+ std::bind(assign_to<TAnimationFloatPairList>, thePreList,
+ std::ref(m_AnimationFloatPairs)));
+ return true;
+ }
+ }
+ return false;
+}
+
+void CStudioAnimationSystem::SetAutoKeyframe(bool inAutoKeyframe)
+{
+ m_AutoKeyframe = inAutoKeyframe;
+}
+bool CStudioAnimationSystem::GetAutoKeyframe() const
+{
+ return m_AutoKeyframe;
+}
+
+Qt3DSDMSlideHandle CStudioAnimationSystem::GetApplicableGraphAndSlide(
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, const SValue &inValue)
+{
+ Qt3DSDMSlideHandle theApplicableSlide;
+ tuple<bool, size_t> arity = GetVariantAnimatableAndArity(inValue);
+ if (get<0>(arity))
+ theApplicableSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty);
+ return theApplicableSlide;
+}
+
+void InsertUniqueAnimationKeyframesPair(TAnimationKeyframesPairList &ioList, SAnimationInfo &inInfo,
+ TKeyframeList &inKeyframes)
+{
+ bool theFound = false;
+ for (TAnimationKeyframesPairList::iterator theAnimationKeyframeIter = ioList.begin();
+ theAnimationKeyframeIter < ioList.end(); ++theAnimationKeyframeIter) {
+ if (IsAnimationInfoEqual(theAnimationKeyframeIter->first, inInfo.m_Slide, inInfo.m_Instance,
+ inInfo.m_Property, inInfo.m_Index)) {
+ theFound = true;
+ // Overwrite the existing value
+ SAnimationInfo &theInfo = theAnimationKeyframeIter->first;
+ theInfo.m_AnimationType = inInfo.m_AnimationType;
+ theInfo.m_DynamicFirstKeyframe = inInfo.m_DynamicFirstKeyframe;
+ theAnimationKeyframeIter->second = inKeyframes;
+ break;
+ }
+ }
+ if (!theFound) {
+ ioList.push_back(std::make_pair(inInfo, inKeyframes));
+ }
+}
+
+void CStudioAnimationSystem::Animate(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ SValue theValue;
+ m_PropertySystem->GetInstancePropertyValue(inInstance, inProperty, theValue);
+ Qt3DSDMSlideHandle theApplicableSlide =
+ GetApplicableGraphAndSlide(inInstance, inProperty, theValue.toOldSkool());
+ if (theApplicableSlide.Valid()) {
+ // Check if previously we have set animation & keyframes
+ DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty);
+ std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType);
+ bool theFound = false;
+ for (size_t i = 0; i < std::get<1>(theArity); ++i) {
+ TAnimationKeyframesPairList::iterator theAnimationKeyframeIter =
+ m_DeletedAnimationData.begin();
+ for (; theAnimationKeyframeIter < m_DeletedAnimationData.end();
+ ++theAnimationKeyframeIter) {
+ if (IsAnimationInfoEqual(theAnimationKeyframeIter->first, theApplicableSlide,
+ inInstance, inProperty, i)) {
+ theFound = true;
+
+ // We use previously set animation & keyframes to create new animation &
+ // keyframe
+ SAnimationInfo &theInfo = theAnimationKeyframeIter->first;
+ Qt3DSDMAnimationHandle theAnimation = m_AnimationCore->CreateAnimation(
+ theInfo.m_Slide, theInfo.m_Instance, theInfo.m_Property, theInfo.m_Index,
+ theInfo.m_AnimationType, theInfo.m_DynamicFirstKeyframe);
+
+ TKeyframeList theKeyframes = theAnimationKeyframeIter->second;
+ for (TKeyframeList::const_iterator theKeyframeIter = theKeyframes.begin();
+ theKeyframeIter < theKeyframes.end(); ++theKeyframeIter)
+ m_AnimationCore->InsertKeyframe(theAnimation, *theKeyframeIter);
+
+ break;
+ }
+ }
+ }
+
+ if (!theFound)
+ DoKeyframeProperty(theApplicableSlide, inInstance, inProperty, theValue.toOldSkool(),
+ true, m_AnimationCore, m_SlideGraphCore, m_SlideCore,
+ m_AnimationFloatPairs, m_SmoothInterpolation);
+ }
+}
+
+void CStudioAnimationSystem::Deanimate(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty);
+ std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType);
+ for (size_t i = 0; i < std::get<1>(theArity); ++i) {
+ Qt3DSDMAnimationHandle theAnimationHandle =
+ GetControllingAnimation(inInstance, inProperty, i);
+
+ if (theAnimationHandle.Valid()) {
+ // Get animation & keyframe data and save it
+ SAnimationInfo theInfo(m_AnimationCore->GetAnimationInfo(theAnimationHandle));
+ TKeyframeHandleList theKeyframeHandles;
+ m_AnimationCore->GetKeyframes(theAnimationHandle, theKeyframeHandles);
+ TKeyframeList theKeyframeList;
+ for (TKeyframeHandleList::const_iterator theKeyframeIter = theKeyframeHandles.begin();
+ theKeyframeIter < theKeyframeHandles.end(); ++theKeyframeIter)
+ theKeyframeList.push_back(m_AnimationCore->GetKeyframeData(*theKeyframeIter));
+ InsertUniqueAnimationKeyframesPair(m_DeletedAnimationData, theInfo, theKeyframeList);
+
+ // Delete the animation
+ m_AnimationCore->DeleteAnimation(theAnimationHandle);
+ }
+ }
+}
+
+void CStudioAnimationSystem::KeyframeProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, bool inDoDiffValue)
+{
+ SValue theValue;
+ m_PropertySystem->GetInstancePropertyValue(inInstance, inProperty, theValue);
+ Qt3DSDMSlideHandle theApplicableSlide =
+ GetApplicableGraphAndSlide(inInstance, inProperty, theValue.toOldSkool());
+ if (theApplicableSlide.Valid())
+ DoKeyframeProperty(theApplicableSlide, inInstance, inProperty, theValue.toOldSkool(),
+ inDoDiffValue, m_AnimationCore, m_SlideGraphCore, m_SlideCore,
+ m_AnimationFloatPairs, m_SmoothInterpolation);
+}
+void CStudioAnimationSystem::SetOrCreateKeyframe(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ float inTimeInSeconds,
+ SGetOrSetKeyframeInfo *inKeyframeInfo,
+ size_t inNumInfos)
+{
+ qt3dsdm::DataModelDataType::Value thePropertyType = m_PropertySystem->GetDataType(inProperty);
+ Qt3DSDMSlideHandle theApplicableSlide;
+ std::tuple<bool, size_t> arity = GetDatatypeAnimatableAndArity(thePropertyType);
+ if (std::get<0>(arity)) {
+ theApplicableSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty);
+ if (theApplicableSlide.Valid()) {
+
+ TAnimationHandleList thePresentAnimations;
+ GetPresentAnimations(theApplicableSlide, inInstance, inProperty,
+ std::cref(m_AnimationFloatPairs), m_AnimationCore,
+ thePresentAnimations);
+ size_t numIterations = std::min(inNumInfos, get<1>(arity));
+ if (thePresentAnimations.empty()) {
+ for (size_t idx = 0, end = numIterations; idx < end; ++idx) {
+ CreateAnimationAndAdd(theApplicableSlide, inInstance, inProperty, idx,
+ m_AnimationCore, thePresentAnimations);
+ }
+ }
+ for (size_t idx = 0, end = numIterations; idx < end; ++idx) {
+ CreateKeyframeExplicit(thePresentAnimations[idx], inKeyframeInfo[idx].m_Value,
+ inTimeInSeconds, m_AnimationCore,
+ inKeyframeInfo[idx].m_EaseIn, inKeyframeInfo[idx].m_EaseOut);
+ if (inKeyframeInfo[idx].m_AnimationTrackIsDynamic)
+ m_AnimationCore->SetFirstKeyframeDynamic(thePresentAnimations[idx], true);
+ }
+ erase_if(m_AnimationFloatPairs, std::bind(AnimationExistsInPresentAnimations,
+ std::placeholders::_1,
+ std::ref(thePresentAnimations)));
+ }
+ }
+}
+
+inline bool FindMatchingAnimation(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore, size_t inIndex)
+{
+ return inAnimationCore->GetAnimationInfo(inAnimation).m_Index == inIndex;
+}
+
+Qt3DSDMAnimationHandle CStudioAnimationSystem::GetControllingAnimation(
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, size_t inIndex) const
+{
+ Qt3DSDMSlideHandle theApplicableSlide =
+ m_SlideSystem->GetApplicableSlide(inInstance, inProperty);
+ // first check our anim float pairs
+ for (size_t idx = 0, end = m_AnimationFloatPairs.size(); idx < end; ++idx) {
+ const SAnimationInfo &theInfo =
+ m_AnimationCore->GetAnimationInfo(m_AnimationFloatPairs[idx].first);
+ if (IsAnimationInfoEqual(theInfo, theApplicableSlide, inInstance, inProperty, inIndex))
+ return m_AnimationFloatPairs[idx].first;
+ }
+ // Use the cache lookup instead of linear search algorithm
+ return m_AnimationCore->GetAnimation(theApplicableSlide, inInstance, inProperty, inIndex);
+}
+
+bool CStudioAnimationSystem::IsPropertyAnimatable(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty);
+ std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType);
+ if (std::get<0>(theArity))
+ return m_SlideGraphCore->GetAssociatedGraph(inInstance).first.Valid();
+ return false;
+}
+
+bool CStudioAnimationSystem::IsPropertyAnimated(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty);
+ std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType);
+ for (size_t i = 0; i < std::get<1>(theArity); ++i) {
+ if (GetControllingAnimation(inInstance, inProperty, i).Valid())
+ return true;
+ }
+ return false;
+}
+
+void CStudioAnimationSystem::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ m_Consumer = inConsumer;
+}
+
+void CStudioAnimationSystem::setRefreshCallback(TRefreshCallbackFunc func)
+{
+ m_refreshCallback = func;
+}
+}
diff --git a/src/dm/systems/StudioAnimationSystem.h b/src/dm/systems/StudioAnimationSystem.h
new file mode 100644
index 0000000..e6fdf75
--- /dev/null
+++ b/src/dm/systems/StudioAnimationSystem.h
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef STUDIOANIMATIONSYSTEMIMPLH
+#define STUDIOANIMATIONSYSTEMIMPLH
+
+#include "Qt3DSDMAnimation.h"
+#include "Qt3DSDMSlides.h"
+#include "Qt3DSDMSlideCore.h"
+#include "Qt3DSDMSlideGraphCore.h"
+#include "Qt3DSDMTransactions.h"
+#include "Qt3DSDMDataCore.h"
+#include "Qt3DSDMSignals.h"
+
+namespace qt3dsdm {
+
+typedef std::pair<Qt3DSDMAnimationHandle, float> TAnimationFloatPair;
+typedef std::vector<TAnimationFloatPair> TAnimationFloatPairList;
+
+class CStudioAnimationSystem : public IStudioAnimationSystem,
+ public ITransactionProducer
+{
+ Q_DISABLE_COPY(CStudioAnimationSystem)
+
+ TPropertySystemPtr m_PropertySystem;
+ TSlideSystemPtr m_SlideSystem;
+ TSlideCorePtr m_SlideCore;
+ TSlideGraphCorePtr m_SlideGraphCore;
+ TAnimationCorePtr m_AnimationCore;
+ TRefreshCallbackFunc m_refreshCallback = nullptr;
+
+ bool m_AutoKeyframe;
+ // When a property has an animation associated with it, then writes
+ // do not go all the way down to the db. They stay on this object.
+ TAnimationFloatPairList m_AnimationFloatPairs;
+ bool m_SmoothInterpolation;
+
+ TAnimationKeyframesPairList m_DeletedAnimationData; // list to store deanimated animation &
+ // keyframe data. This will be use if user
+ // wants to animate the same property again
+
+ TTransactionConsumerPtr m_Consumer;
+
+ std::vector<std::shared_ptr<ISignalConnection>> m_Connections;
+
+public:
+ CStudioAnimationSystem(TPropertySystemPtr inPropertySystem, TSlideSystemPtr inSlideSystem,
+ TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore,
+ TAnimationCorePtr inAnimationCore);
+
+ void ClearTemporaryAnimationValues();
+ void ClearTemporaryAnimationValues(Qt3DSDMAnimationHandle inAnimation);
+
+ void SetPropertySystem(TPropertySystemPtr inPropertySystem)
+ {
+ m_PropertySystem = inPropertySystem;
+ } // HACK: TODO: We should really consider having all the subsytem know everyone else without
+ // passing in so many things in the constructor
+
+ //====================================================================
+ // IStudioAnimationSystem implementation
+ //====================================================================
+ void SetAutoKeyframe(bool inAutoKeyframe) override;
+ bool GetAutoKeyframe() const override;
+ void Animate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override;
+ void Deanimate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override;
+ void KeyframeProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ bool inDoDiffValue) override;
+ void SetOrCreateKeyframe(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, float inTimeInSeconds,
+ SGetOrSetKeyframeInfo *inKeyframeInfo, size_t inNumInfos) override;
+ Qt3DSDMAnimationHandle GetControllingAnimation(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ size_t inIndex) const override;
+ bool IsPropertyAnimatable(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ bool IsPropertyAnimated(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ void SetInterpolation(bool inSmooth) override { m_SmoothInterpolation = inSmooth; }
+
+ bool GetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const override;
+ bool SetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) override;
+ //====================================================================
+
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+
+ void setRefreshCallback(TRefreshCallbackFunc func) override;
+
+private:
+ void OnAnimationDeleted(Qt3DSDMAnimationHandle inAnimation);
+
+ Qt3DSDMSlideHandle GetApplicableGraphAndSlide(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue);
+
+ void OverrideChannelIfAnimated(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex, float inSeconds,
+ bool &ioAnimated, SValue &outValue) const;
+};
+}
+
+#endif
diff --git a/src/dm/systems/StudioCoreSystem.cpp b/src/dm/systems/StudioCoreSystem.cpp
new file mode 100644
index 0000000..f9f0e2c
--- /dev/null
+++ b/src/dm/systems/StudioCoreSystem.cpp
@@ -0,0 +1,409 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "StudioCoreSystem.h"
+#include "SlideCoreProducer.h"
+#include "SlideGraphCoreProducer.h"
+#include "DataCoreProducer.h"
+#include "AnimationCoreProducer.h"
+#include "ActionCoreProducer.h"
+#include "Qt3DSDMSignals.h"
+#include "Qt3DSDMMetaData.h"
+#include "Qt3DSDMGuides.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+inline bool AnimationInstanceMatches(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore,
+ Qt3DSDMInstanceHandle inInstance)
+{
+ return inInstance == inAnimationCore->GetAnimationInfo(inAnimation).m_Instance;
+}
+
+inline bool AnimationPropertyMatches(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ return inProperty == inAnimationCore->GetAnimationInfo(inAnimation).m_Property;
+}
+
+inline bool AnimationSlideMatches(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore, Qt3DSDMSlideHandle inSlide)
+{
+ return inSlide == inAnimationCore->GetAnimationInfo(inAnimation).m_Slide;
+}
+
+inline bool AnimationSlideInstancePropertyMatch(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore,
+ Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimation);
+ return theInfo.m_Slide == inSlide && theInfo.m_Instance == inInstance
+ && theInfo.m_Property == inProperty;
+}
+
+inline bool AnimationInstancesPropertiesMatch(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore,
+ const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties)
+{
+ SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimation);
+ return exists(inInstances, std::bind(equal_to<int>(), theInfo.m_Instance,
+ std::placeholders::_1))
+ && exists(inProperties, std::bind(equal_to<int>(), theInfo.m_Property,
+ std::placeholders::_1));
+}
+
+void EraseAnimationsThatMatch(TAnimationCorePtr inAnimationCore,
+ function<bool(Qt3DSDMAnimationHandle)> inPredicate)
+{
+ TAnimationHandleList theAnimations;
+ inAnimationCore->GetAnimations(theAnimations);
+ function<bool(Qt3DSDMAnimationHandle)> theComp(std::bind(
+ complement<function<bool(Qt3DSDMAnimationHandle)>, Qt3DSDMAnimationHandle>, inPredicate,
+ std::placeholders::_1));
+ TAnimationHandleList::iterator theRemovals =
+ remove_if(theAnimations.begin(), theAnimations.end(), theComp);
+ for_each(theAnimations.begin(), theRemovals,
+ std::bind(&IAnimationCore::DeleteAnimation, inAnimationCore, std::placeholders::_1));
+}
+
+void EraseActions(TDataCorePtr inDataCore, TActionCorePtr inActionCore,
+ const TActionHandleList &inActions)
+{
+ for (TActionHandleList::const_iterator theActionIter = inActions.begin();
+ theActionIter != inActions.end(); ++theActionIter) {
+ Qt3DSDMInstanceHandle theActionInstance;
+ inActionCore->DeleteAction(*theActionIter, theActionInstance);
+ inDataCore->DeleteInstance(theActionInstance);
+ }
+}
+
+void CascadeInstanceDelete(Qt3DSDMInstanceHandle inInstance, TDataCorePtr inDataCore,
+ TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore,
+ TAnimationCorePtr inAnimationCore, TActionCorePtr inActionCore)
+{
+ inSlideCore->DeleteAllInstanceEntries(inInstance);
+
+ inSlideGraphCore->DissociateInstance(inInstance);
+
+ function<bool(Qt3DSDMAnimationHandle)> thePredicate(
+ std::bind(AnimationInstanceMatches, std::placeholders::_1, inAnimationCore, inInstance));
+ EraseAnimationsThatMatch(inAnimationCore, thePredicate);
+
+ TActionHandleList theActions;
+ inActionCore->GetActions(inInstance, theActions);
+ EraseActions(inDataCore, inActionCore, theActions);
+}
+
+void CascadePropertyRemove(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore,
+ TAnimationCorePtr inAnimationCore)
+{
+ inSlideCore->DeleteAllPropertyEntries(inProperty);
+ function<bool(Qt3DSDMAnimationHandle)> thePredicate(
+ std::bind(AnimationPropertyMatches, std::placeholders::_1, inAnimationCore, inProperty));
+ EraseAnimationsThatMatch(inAnimationCore, thePredicate);
+}
+
+void CascadeSlideDelete(Qt3DSDMSlideHandle inSlide, TDataCorePtr inDataCore,
+ TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore,
+ TAnimationCorePtr inAnimationCore, TActionCorePtr inActionCore)
+{
+ Qt3DSDMSlideGraphHandle theGraph = inSlideGraphCore->GetSlideGraph(inSlide);
+ if (theGraph.Valid()) {
+ TSlideHandleList theChildren;
+ inSlideCore->GetChildSlides(inSlide, theChildren);
+ TInstanceHandleList instances;
+ for (size_t idx = 0, end = theChildren.size(); idx < end; ++idx) {
+ instances.clear();
+ inSlideCore->DeleteSlide(theChildren[idx], instances);
+ for (size_t instIdx = 0, instEnd = instances.size(); instIdx < instEnd; ++instIdx)
+ inDataCore->DeleteInstance(instances[instIdx]);
+ }
+ inSlideGraphCore->DeleteSlideGraph(theGraph);
+ }
+
+ else {
+ Qt3DSDMSlideHandle theMaster(inSlideCore->GetParentSlide(inSlide));
+ if (theMaster.Valid()) {
+ Qt3DSDMSlideGraphHandle theGraph = inSlideGraphCore->GetSlideGraph(theMaster);
+ if (theGraph.Valid()) {
+ /*
+ tricky stuff. The slide change was recorded in the transaction system when the
+ slide was created. But since there didn't *have* to be a slide change when the
+ slide was destroyed there was no slide change recorded at that point.
+
+ Then on the first redo, the system quietly switched the active slide to the new
+ slide. On the second redo the system crashed due to attempting to access the
+ new slide after it had been deleted (as nothing switched the system back to the
+ current slide).
+
+ So the correct answer is that the cascading system needs to *always* set the
+ active slide, even if it seems like it would be, at the moment, unnecessary
+ because the slide getting deleted is not currently active. This is the mirror
+ of the fact that new slide *always* sets the active slide so it does make
+ logical sense.*/
+ Qt3DSDMSlideHandle theNewActiveSlide =
+ inSlideGraphCore->GetGraphActiveSlide(theGraph);
+ if (theNewActiveSlide == inSlide) {
+ TSlideHandleList theChildren;
+ inSlideCore->GetChildSlides(theMaster, theChildren);
+ size_t idx = 0;
+ for (size_t end = theChildren.size(); idx < end; ++idx) {
+ if (theChildren[idx] != inSlide) {
+ theNewActiveSlide = theChildren[idx];
+ break;
+ }
+ }
+ if (theNewActiveSlide == inSlide)
+ theNewActiveSlide = theMaster;
+ }
+ inSlideGraphCore->SetGraphActiveSlide(theGraph, theNewActiveSlide);
+ }
+ }
+ }
+ EraseAnimationsThatMatch(inAnimationCore,
+ std::bind(AnimationSlideMatches,
+ std::placeholders::_1, inAnimationCore, inSlide));
+
+ TActionHandleList theActions;
+ inActionCore->GetActions(inSlide, theActions);
+ EraseActions(inDataCore, inActionCore, theActions);
+}
+
+void CascadeSlidePropertyRemove(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, TAnimationCorePtr inAnimationCore)
+{
+ EraseAnimationsThatMatch(inAnimationCore,
+ std::bind(AnimationSlideInstancePropertyMatch,
+ std::placeholders::_1, inAnimationCore,
+ inSlide, inInstance, inProperty));
+}
+
+void CascadeInstanceParentRemoved(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent,
+ TDataCorePtr inDataCore, TSlideCorePtr inSlideCore,
+ TAnimationCorePtr inAnimationCore)
+{
+ TPropertyHandleList theProperties;
+ inDataCore->GetInstanceProperties(inParent, theProperties);
+ TInstanceHandleList allInstances;
+ inDataCore->GetInstances(allInstances);
+ function<bool(Qt3DSDMInstanceHandle)> InstanceOrDerived(
+ std::bind(&IDataCore::IsInstanceOrDerivedFrom, inDataCore,
+ std::placeholders::_1, inInstance));
+ function<bool(Qt3DSDMInstanceHandle)> DerivedComplement(
+ std::bind(complement<function<bool(Qt3DSDMInstanceHandle)>, Qt3DSDMInstanceHandle>,
+ InstanceOrDerived, std::placeholders::_1));
+ TInstanceHandleList::iterator all_derived =
+ remove_if(allInstances.begin(), allInstances.end(), DerivedComplement);
+ TInstanceHandleList derivedInstances(allInstances.begin(), all_derived);
+ inSlideCore->DeleteAllInstancePropertyEntries(derivedInstances, theProperties);
+ EraseAnimationsThatMatch(
+ inAnimationCore, std::bind(AnimationInstancesPropertiesMatch,
+ std::placeholders::_1, inAnimationCore,
+ std::cref(derivedInstances), std::cref(theProperties)));
+}
+
+void CascadeBeforeAnimationDeleted(Qt3DSDMAnimationHandle inAnimation,
+ TAnimationCorePtr inAnimationCore, TDataCorePtr inDataCore,
+ TSlideCorePtr inSlideCore)
+{
+ SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimation);
+ SValue theSlideValue;
+ if (inDataCore->IsInstance(theInfo.m_Instance) && inSlideCore->IsSlide(theInfo.m_Slide)
+ && inSlideCore->GetSpecificInstancePropertyValue(theInfo.m_Slide, theInfo.m_Instance,
+ theInfo.m_Property, theSlideValue)
+ && inAnimationCore->GetKeyframeCount(inAnimation)) {
+ float theTime = inSlideCore->GetSlideTime(theInfo.m_Slide);
+ float theValue = inAnimationCore->EvaluateAnimation(inAnimation, theTime);
+ SetAnimationValue(theValue, theInfo.m_Index, theSlideValue);
+ inSlideCore->ForceSetInstancePropertyValue(theInfo.m_Slide, theInfo.m_Instance,
+ theInfo.m_Property, theSlideValue);
+ }
+}
+
+void CascadeBeforeKeyframeErased(Qt3DSDMKeyframeHandle inKeyframe, TAnimationCorePtr inAnimationCore,
+ TDataCorePtr inDataCore, TSlideCorePtr inSlideCore)
+{
+ Qt3DSDMAnimationHandle theAnimation = inAnimationCore->GetAnimationForKeyframe(inKeyframe);
+ if (inAnimationCore->GetKeyframeCount(theAnimation) == 1)
+ CascadeBeforeAnimationDeleted(theAnimation, inAnimationCore, inDataCore, inSlideCore);
+}
+
+CStudioCoreSystem::CStudioCoreSystem(TStringTablePtr strTable)
+ : m_StringTable(strTable.get() != NULL ? strTable : IStringTable::CreateStringTable())
+ , m_DataCore(new CDataCoreProducer(m_StringTable))
+ , m_SlideCore(new CSlideCoreProducer(m_StringTable))
+ , m_SlideGraphCore(new CSlideGraphCoreProducer())
+ , m_AnimationCore(new CAnimationCoreProducer())
+ , m_ActionCore(new CActionCoreProducer(m_StringTable))
+ , m_NewMetaData(
+ IMetaData::CreateNewMetaData(dynamic_pointer_cast<CDataCoreProducer>(m_DataCore)))
+ , m_GuideSystem(IGuideSystem::CreateGuideSystem())
+{
+ IDataCoreSignalProvider *theProvider =
+ dynamic_cast<IDataCoreSignalProvider *>(m_DataCore.get());
+ m_Connections.push_back(theProvider->ConnectInstanceDeleted(
+ std::bind(CascadeInstanceDelete, std::placeholders::_1, m_DataCore, m_SlideCore,
+ m_SlideGraphCore, m_AnimationCore, m_ActionCore)));
+ m_Connections.push_back(theProvider->ConnectPropertyRemoved(std::bind(
+ CascadePropertyRemove, std::placeholders::_1,
+ std::placeholders::_2, m_SlideCore, m_SlideGraphCore, m_AnimationCore)));
+ m_Connections.push_back(theProvider->ConnectInstanceParentRemoved(std::bind(
+ CascadeInstanceParentRemoved, std::placeholders::_1,
+ std::placeholders::_2, m_DataCore, m_SlideCore, m_AnimationCore)));
+ ISlideCoreSignalProvider *theSlideCoreSignalProvider =
+ dynamic_cast<ISlideCoreSignalProvider *>(m_SlideCore.get());
+ m_Connections.push_back(theSlideCoreSignalProvider->ConnectBeforeSlideDeleted(
+ std::bind(CascadeSlideDelete, std::placeholders::_1, m_DataCore, m_SlideCore,
+ m_SlideGraphCore, m_AnimationCore, m_ActionCore)));
+ m_Connections.push_back(theSlideCoreSignalProvider->ConnectInstancePropertyValueRemoved(
+ std::bind(CascadeSlidePropertyRemove, std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3, m_AnimationCore)));
+ IAnimationCoreSignalProvider *theAnimProvider =
+ dynamic_cast<IAnimationCoreSignalProvider *>(m_AnimationCore.get());
+ m_Connections.push_back(theAnimProvider->ConnectBeforeAnimationDeleted(
+ std::bind(CascadeBeforeAnimationDeleted, std::placeholders::_1,
+ m_AnimationCore, m_DataCore, m_SlideCore)));
+ m_Connections.push_back(theAnimProvider->ConnectBeforeKeyframeErased(
+ std::bind(CascadeBeforeKeyframeErased, std::placeholders::_1,
+ m_AnimationCore, m_DataCore, m_SlideCore)));
+ m_Connections.push_back(theAnimProvider->ConnectBeforeAllKeyframesErased(
+ std::bind(CascadeBeforeAnimationDeleted, std::placeholders::_1,
+ m_AnimationCore, m_DataCore, m_SlideCore)));
+}
+
+CStudioCoreSystem::~CStudioCoreSystem()
+{
+}
+
+std::shared_ptr<IDataCore> CStudioCoreSystem::GetDataCore()
+{
+ return m_DataCore;
+}
+std::shared_ptr<ISlideCore> CStudioCoreSystem::GetSlideCore()
+{
+ return m_SlideCore;
+}
+std::shared_ptr<ISlideGraphCore> CStudioCoreSystem::GetSlideGraphCore()
+{
+ return m_SlideGraphCore;
+}
+std::shared_ptr<IAnimationCore> CStudioCoreSystem::GetAnimationCore()
+{
+ return m_AnimationCore;
+}
+std::shared_ptr<IActionCore> CStudioCoreSystem::GetActionCore()
+{
+ return m_ActionCore;
+}
+std::shared_ptr<ICustomPropCore> CStudioCoreSystem::GetCustomPropCore()
+{
+ return m_CustomPropCore;
+}
+std::shared_ptr<IMetaData> CStudioCoreSystem::GetNewMetaData()
+{
+ return m_NewMetaData;
+}
+std::shared_ptr<IGuideSystem> CStudioCoreSystem::GetGuideSystem()
+{
+ return m_GuideSystem;
+}
+
+std::shared_ptr<IDataCore> CStudioCoreSystem::GetTransactionlessDataCore()
+{
+ return dynamic_cast<CDataCoreProducer *>(m_DataCore.get())->GetTransactionlessDataCore();
+}
+std::shared_ptr<ISlideCore> CStudioCoreSystem::GetTransactionlessSlideCore()
+{
+ return dynamic_cast<CSlideCoreProducer *>(m_SlideCore.get())->GetTransactionlessSlideCore();
+}
+std::shared_ptr<ISlideGraphCore> CStudioCoreSystem::GetTransactionlessSlideGraphCore()
+{
+ return dynamic_cast<CSlideGraphCoreProducer *>(m_SlideGraphCore.get())
+ ->GetTransactionlessSlideGraphCore();
+}
+std::shared_ptr<IAnimationCore> CStudioCoreSystem::GetTransactionlessAnimationCore()
+{
+ return dynamic_cast<CAnimationCoreProducer *>(m_AnimationCore.get())
+ ->GetTransactionlessAnimationCore();
+}
+std::shared_ptr<IActionCore> CStudioCoreSystem::GetTransactionlessActionCore()
+{
+ return dynamic_cast<CActionCoreProducer *>(m_ActionCore.get())->GetTransactionlessActionCore();
+}
+
+inline bool InstanceSpecificNameMatches(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const TCharStr &inName,
+ const CSimpleDataCore &inData)
+{
+ TPropertyHandleList theProperties;
+ inData.GetAggregateInstanceProperties(inInstance, theProperties);
+ SValue theValue;
+ if (exists(theProperties, std::bind(equal_to<int>(), inProperty, std::placeholders::_1))
+ && inData.GetSpecificInstancePropertyValue(inInstance, inProperty, theValue)) {
+ return inName == get<TDataStrPtr>(theValue)->GetData();
+ }
+ return false;
+}
+
+Qt3DSDMInstanceHandle CStudioCoreSystem::FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty,
+ const TCharStr &inName) const
+{
+ TInstanceHandleList theInstances;
+ m_DataCore->GetInstances(theInstances);
+ TInstanceHandleList::iterator theFind = find_if<TInstanceHandleList::iterator>(
+ theInstances,
+ std::bind(InstanceSpecificNameMatches, std::placeholders::_1, inNameProperty, std::cref(inName),
+ std::cref(*dynamic_cast<CDataCoreProducer *>(m_DataCore.get())
+ ->GetTransactionlessDataCore())));
+ if (theFind != theInstances.end())
+ return *theFind;
+ return 0;
+}
+
+void CStudioCoreSystem::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ DoSetConsumer(inConsumer, m_DataCore);
+ DoSetConsumer(inConsumer, m_SlideCore);
+ DoSetConsumer(inConsumer, m_SlideGraphCore);
+ DoSetConsumer(inConsumer, m_AnimationCore);
+ DoSetConsumer(inConsumer, m_ActionCore);
+ DoSetConsumer(inConsumer, m_GuideSystem);
+ // In general the meta data doesn't participate in the undo/redo system except
+ // in special cases.
+ if (!inConsumer)
+ DoSetConsumer(inConsumer, m_NewMetaData);
+}
+}
diff --git a/src/dm/systems/StudioCoreSystem.h b/src/dm/systems/StudioCoreSystem.h
new file mode 100644
index 0000000..18f1dad
--- /dev/null
+++ b/src/dm/systems/StudioCoreSystem.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef STUDIOCORESYSTEMH
+#define STUDIOCORESYSTEMH
+#include "Qt3DSDMTransactions.h"
+#include "Qt3DSDMHandles.h"
+
+namespace qt3dsdm {
+class IDataCore;
+class ISlideCore;
+class ISlideGraphCore;
+class IAnimationCore;
+class IActionCore;
+class ICustomPropCore;
+class ISignalConnection;
+class IMetaData;
+class IGuideSystem;
+
+// Manages cascading operations between cores so that the entire group of
+// cores stays up to date.
+class CStudioCoreSystem : public ITransactionProducer
+{
+ Q_DISABLE_COPY(CStudioCoreSystem)
+
+ TStringTablePtr m_StringTable;
+ std::shared_ptr<IDataCore> m_DataCore;
+ std::shared_ptr<ISlideCore> m_SlideCore;
+ std::shared_ptr<ISlideGraphCore> m_SlideGraphCore;
+ std::shared_ptr<IAnimationCore> m_AnimationCore;
+ std::shared_ptr<IActionCore> m_ActionCore;
+ std::shared_ptr<ICustomPropCore> m_CustomPropCore;
+ std::shared_ptr<IMetaData> m_NewMetaData;
+ std::shared_ptr<IGuideSystem> m_GuideSystem;
+
+ std::vector<std::shared_ptr<ISignalConnection>> m_Connections;
+
+public:
+ CStudioCoreSystem(TStringTablePtr strTable = TStringTablePtr());
+ virtual ~CStudioCoreSystem();
+ TStringTablePtr GetStringTablePtr() const { return m_StringTable; }
+
+ std::shared_ptr<IDataCore> GetDataCore();
+ std::shared_ptr<ISlideCore> GetSlideCore();
+ std::shared_ptr<ISlideGraphCore> GetSlideGraphCore();
+ std::shared_ptr<IAnimationCore> GetAnimationCore();
+ std::shared_ptr<IActionCore> GetActionCore();
+ std::shared_ptr<ICustomPropCore> GetCustomPropCore();
+ std::shared_ptr<IMetaData> GetNewMetaData();
+ std::shared_ptr<IGuideSystem> GetGuideSystem();
+
+ std::shared_ptr<IDataCore> GetTransactionlessDataCore();
+ std::shared_ptr<ISlideCore> GetTransactionlessSlideCore();
+ std::shared_ptr<ISlideGraphCore> GetTransactionlessSlideGraphCore();
+ std::shared_ptr<IAnimationCore> GetTransactionlessAnimationCore();
+ std::shared_ptr<IActionCore> GetTransactionlessActionCore();
+ std::shared_ptr<ICustomPropCore> GetTransactionlessCustomPropCore();
+
+ Qt3DSDMInstanceHandle FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty,
+ const TCharStr &inName) const;
+
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+};
+
+typedef std::shared_ptr<CStudioCoreSystem> TStudioCoreSystemPtr;
+}
+
+#endif
diff --git a/src/dm/systems/StudioFullSystem.cpp b/src/dm/systems/StudioFullSystem.cpp
new file mode 100644
index 0000000..c98f8a8
--- /dev/null
+++ b/src/dm/systems/StudioFullSystem.cpp
@@ -0,0 +1,647 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "StudioFullSystem.h"
+#include "StudioCoreSystem.h"
+#include "StudioPropertySystem.h"
+#include "SlideSystem.h"
+#include "StudioAnimationSystem.h"
+#include "ActionSystem.h"
+#include "SignalsImpl.h"
+#include "SimpleDataCore.h"
+#include "SimpleSlideCore.h"
+#include "SimpleSlideGraphCore.h"
+#include "SimpleAnimationCore.h"
+#include "DataCoreProducer.h"
+#include "SlideCoreProducer.h"
+#include "SlideGraphCoreProducer.h"
+#include "ActionCoreProducer.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+template <typename TDoTransaction, typename TUndoTransaction>
+inline void NotifyConsumer(TTransactionConsumerPtr inConsumer, TDoTransaction inDoNotification,
+ TUndoTransaction inUndoNotification)
+{
+ if (inConsumer) {
+ inConsumer->OnDoNotification(inDoNotification);
+ inConsumer->OnUndoNotification(inUndoNotification);
+ } else {
+ inDoNotification(); // No consumer, send notification right away
+ }
+}
+
+void NotifySlideCreated(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide)
+{
+ NotifyConsumer(inConsumer,
+ bind(&IStudioFullSystemSignalSender::SendSlideCreated, inSender, inSlide),
+ bind(&IStudioFullSystemSignalSender::SendSlideDeleted, inSender, inSlide));
+}
+
+void NotifySlideDeleted(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide)
+{
+ NotifyConsumer(inConsumer,
+ bind(&IStudioFullSystemSignalSender::SendSlideDeleted, inSender, inSlide),
+ bind(&IStudioFullSystemSignalSender::SendSlideCreated, inSender, inSlide));
+}
+
+void NotifySlideRearranged(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide,
+ int inOldIndex, int inNewIndex)
+{
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendSlideRearranged, inSender,
+ inSlide, inOldIndex, inNewIndex),
+ bind(&IStudioFullSystemSignalSender::SendSlideRearranged, inSender, inSlide,
+ inNewIndex, inOldIndex));
+}
+
+void SendInstancePropertyValueChanged(TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ // Ignore when the instance is not an instance (undoing an add operation may create this, as
+ // transactions are run first and notifications second).
+ if (inCore->IsInstance(inInstance))
+ inSender->SendInstancePropertyValue(inInstance, inProperty);
+}
+
+void NotifyInstancePropertyChanged(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ bool inIsAggregate)
+{
+ if (inConsumer) {
+ if (inIsAggregate == false) {
+ NotifyConsumer(
+ inConsumer,
+ bind(SendInstancePropertyValueChanged, inCore, inSender, inInstance, inProperty),
+ bind(SendInstancePropertyValueChanged, inCore, inSender, inInstance, inProperty));
+ }
+ } else {
+ SendInstancePropertyValueChanged(inCore, inSender, inInstance, inProperty);
+ }
+}
+
+void RunAnimations(IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMSlideHandle inSlide, TAnimationCorePtr inAnimationCore,
+ TDataCorePtr inDataCore, TTransactionConsumerPtr &inConsumer)
+{
+ TAnimationInfoList theAnimations;
+ inAnimationCore->GetAnimations(theAnimations, inMaster, inSlide);
+ size_t theEnd = theAnimations.size();
+ for (size_t theIndex = 0; theIndex < theEnd; ++theIndex) {
+ SAnimationInfo &theInfo(theAnimations[theIndex]);
+ NotifyInstancePropertyChanged(inConsumer, inDataCore, inSender, theInfo.m_Instance,
+ theInfo.m_Property, false);
+ }
+}
+
+void NotifyComponentSeconds(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide,
+ TDataCorePtr inCore, TAnimationCorePtr inAnimationCore,
+ TStudioAnimationSystemPtr inAnimationSystem,
+ TSlideSystemPtr inSlideSystem)
+{
+ Qt3DSDMSlideHandle theMaster = inSlideSystem->GetMasterSlide(inSlide);
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendBeginComponentSeconds,
+ inSender, theMaster),
+ bind(&IStudioFullSystemSignalSender::SendComponentSeconds, inSender, theMaster));
+ RunAnimations(inSender, theMaster, inSlide, inAnimationCore, inCore, inConsumer);
+ dynamic_cast<CStudioAnimationSystem *>(inAnimationSystem.get())
+ ->ClearTemporaryAnimationValues();
+ NotifyConsumer(
+ inConsumer, bind(&IStudioFullSystemSignalSender::SendComponentSeconds, inSender, theMaster),
+ bind(&IStudioFullSystemSignalSender::SendBeginComponentSeconds, inSender, theMaster));
+}
+
+void NotifyPropertyLinked(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ bool inAggregate)
+{
+ if (inAggregate == false) {
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendPropertyLinked,
+ inSender, inMaster, inInstance, inProperty),
+ bind(&IStudioFullSystemSignalSender::SendPropertyUnlinked, inSender,
+ inMaster, inInstance, inProperty));
+ NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty,
+ inAggregate);
+ }
+}
+
+void NotifyPropertyUnlinked(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ bool inAggregate)
+{
+ if (inAggregate == false) {
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendPropertyUnlinked,
+ inSender, inMaster, inInstance, inProperty),
+ bind(&IStudioFullSystemSignalSender::SendPropertyLinked, inSender, inMaster,
+ inInstance, inProperty));
+ NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty,
+ inAggregate);
+ }
+}
+
+void NotifyActiveSlide(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster,
+ int /*inIndex*/, Qt3DSDMSlideHandle inOldSlide, Qt3DSDMSlideHandle inNewSlide,
+ TAnimationCorePtr inAnimationCore, TSlideSystemPtr inSlideSystem)
+{
+ TInstancePropertyPairList thePropertyList;
+ inSlideSystem->GetUnionOfProperties(inOldSlide, inNewSlide, thePropertyList);
+ for (size_t idx = 0, end = thePropertyList.size(); idx < end; ++idx)
+ NotifyInstancePropertyChanged(inConsumer, inCore, inSender, thePropertyList[idx].first,
+ thePropertyList[idx].second, false);
+
+ RunAnimations(inSender, inMaster, inNewSlide, inAnimationCore, inCore, inConsumer);
+}
+
+void NotifyAnimationCreated(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMAnimationHandle inAnimation, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, bool inIsAggregate)
+{
+ if (!inIsAggregate) {
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendAnimationCreated,
+ inSender, inAnimation, inInstance, inProperty),
+ bind(&IStudioFullSystemSignalSender::SendAnimationDeleted, inSender,
+ inAnimation, inInstance, inProperty));
+ }
+}
+
+void NotifyAnimationDeleted(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMAnimationHandle inAnimation, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendAnimationDeleted, inSender,
+ inAnimation, inInstance, inProperty),
+ bind(&IStudioFullSystemSignalSender::SendAnimationCreated, inSender, inAnimation,
+ inInstance, inProperty));
+ NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty, false);
+}
+
+void NotifyAnimationChanged(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMAnimationHandle inAnimation, TAnimationCorePtr inAnimationCore,
+ bool inIsAggregate)
+{
+ if (!inIsAggregate) {
+ SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation));
+ NotifyInstancePropertyChanged(inConsumer, inCore, inSender, theInfo.m_Instance,
+ theInfo.m_Property, inIsAggregate);
+ }
+}
+
+void NotifyKeyframeInserted(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe,
+ TAnimationCorePtr inAnimationCore, bool inIsAggregate)
+{
+ if (!inIsAggregate) {
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendKeyframeInserted,
+ inSender, inAnimation, inKeyframe),
+ bind(&IStudioFullSystemSignalSender::SendKeyframeErased, inSender,
+ inAnimation, inKeyframe));
+ NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false);
+ }
+}
+
+void NotifyKeyframeErased(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe,
+ TAnimationCorePtr inAnimationCore)
+{
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendKeyframeErased, inSender,
+ inAnimation, inKeyframe),
+ bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, inSender, inAnimation,
+ inKeyframe));
+ NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false);
+}
+
+void NotifyKeyframeUpdated(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMKeyframeHandle inKeyframe,
+ TAnimationCorePtr inAnimationCore)
+{
+ NotifyConsumer(inConsumer,
+ bind(&IStudioFullSystemSignalSender::SendKeyframeUpdated, inSender, inKeyframe),
+ bind(&IStudioFullSystemSignalSender::SendKeyframeUpdated, inSender, inKeyframe));
+ Qt3DSDMAnimationHandle theAnimation(inAnimationCore->GetAnimationForKeyframe(inKeyframe));
+ NotifyAnimationChanged(inConsumer, inCore, inSender, theAnimation, inAnimationCore, false);
+}
+
+void NotifyConnectFirstKeyframeDynamicSet(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMAnimationHandle inAnimation, bool inDynamic,
+ TAnimationCorePtr inAnimationCore)
+{
+ NotifyConsumer(inConsumer,
+ bind(&IStudioFullSystemSignalSender::SendConnectFirstKeyframeDynamicSet,
+ inSender, inAnimation, inDynamic),
+ bind(&IStudioFullSystemSignalSender::SendConnectFirstKeyframeDynamicSet,
+ inSender, inAnimation, inDynamic));
+ NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false);
+}
+
+inline ISlideCoreSignalProvider *GetSlideSignaller(TSlideCorePtr inSlideCore)
+{
+ return dynamic_cast<CSlideCoreProducer *>(inSlideCore.get());
+}
+
+void NotifyInstanceCreated(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle instance)
+{
+ NotifyConsumer(inConsumer,
+ bind(&IStudioFullSystemSignalSender::SendInstanceCreated, inSender, instance),
+ bind(&IStudioFullSystemSignalSender::SendInstanceDeleted, inSender, instance));
+}
+
+void NotifyInstanceDeleted(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle instance)
+{
+ NotifyConsumer(inConsumer,
+ bind(&IStudioFullSystemSignalSender::SendInstanceDeleted, inSender, instance),
+ bind(&IStudioFullSystemSignalSender::SendInstanceCreated, inSender, instance));
+}
+
+void NotifyActionCreated(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction,
+ Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance)
+{
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendActionCreated, inSender,
+ inAction, inSlide, inInstance),
+ bind(&IStudioFullSystemSignalSender::SendActionDeleted, inSender, inAction,
+ inSlide, inInstance));
+}
+
+void NotifyActionDestroyed(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction,
+ Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance)
+{
+ NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendActionDeleted, inSender,
+ inAction, inSlide, inInstance),
+ bind(&IStudioFullSystemSignalSender::SendActionCreated, inSender, inAction,
+ inSlide, inInstance));
+}
+
+void SendActionEvent(Qt3DSDMActionHandle inAction, TActionCorePtr inCore,
+ function<void()> inFunction)
+{
+ if (inCore->HandleValid(inAction))
+ inFunction();
+}
+
+void NotifyTriggerObjectSet(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction,
+ TActionCorePtr inCore)
+{
+ function<void()> theFunc(
+ bind(&IStudioFullSystemSignalSender::SendTriggerObjectSet, inSender, inAction));
+ NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc),
+ bind(SendActionEvent, inAction, inCore, theFunc));
+}
+
+void NotifyTargetObjectSet(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction,
+ TActionCorePtr inCore)
+{
+ function<void()> theFunc(
+ bind(&IStudioFullSystemSignalSender::SendTargetObjectSet, inSender, inAction));
+ NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc),
+ bind(SendActionEvent, inAction, inCore, theFunc));
+}
+
+void NotifyEventSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMActionHandle inAction, TActionCorePtr inCore)
+{
+ function<void()> theFunc(
+ bind(&IStudioFullSystemSignalSender::SendEventSet, inSender, inAction));
+ NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc),
+ bind(SendActionEvent, inAction, inCore, theFunc));
+}
+
+void NotifyHandlerSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMActionHandle inAction, TActionCorePtr inCore)
+{
+ function<void()> theFunc(
+ bind(&IStudioFullSystemSignalSender::SendHandlerSet, inSender, inAction));
+ NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc),
+ bind(SendActionEvent, inAction, inCore, theFunc));
+}
+
+void NotifyHandlerArgumentValueSet(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender,
+ Qt3DSDMHandlerArgHandle inAction, TActionCorePtr inCore)
+{
+ function<void()> theFunc(
+ bind(&IStudioFullSystemSignalSender::SendHandlerArgumentValueSet, inSender, inAction));
+ Qt3DSDMActionHandle theActionHdl(inCore->GetHandlerArgumentInfo(inAction).m_Action);
+ NotifyConsumer(inConsumer, bind(SendActionEvent, theActionHdl, inCore, theFunc),
+ bind(SendActionEvent, theActionHdl, inCore, theFunc));
+}
+
+void NotifyAllKeyframesErased(TTransactionConsumerPtr &inConsumer,
+ IStudioFullSystemSignalSender *inSender,
+ TAnimationCorePtr inAnimationCore, Qt3DSDMAnimationHandle inAnimation)
+{
+ if (inConsumer) {
+ TKeyframeHandleList theKeyframes;
+ inAnimationCore->GetKeyframes(inAnimation, theKeyframes);
+ for (size_t idx = 0, end = theKeyframes.size(); idx < end; ++idx) {
+ inConsumer->OnDoNotification(bind(&IStudioFullSystemSignalSender::SendKeyframeErased,
+ inSender, inAnimation, theKeyframes[idx]));
+ inConsumer->OnUndoNotification(
+ bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, inSender, inAnimation,
+ theKeyframes[idx]));
+ }
+ }
+}
+
+CStudioFullSystem::CStudioFullSystem(std::shared_ptr<CStudioCoreSystem> inCoreSystem,
+ Qt3DSDMInstanceHandle inSlideInstance,
+ Qt3DSDMPropertyHandle inComponentGuidProperty,
+ Qt3DSDMInstanceHandle inActionInstance,
+ Qt3DSDMPropertyHandle inActionEyeball)
+ : m_CoreSystem(inCoreSystem)
+ , m_SlideSystem(new SSlideSystem(m_CoreSystem->GetDataCore(), m_CoreSystem->GetSlideCore(),
+ m_CoreSystem->GetSlideGraphCore(),
+ m_CoreSystem->GetAnimationCore(), inSlideInstance,
+ inComponentGuidProperty))
+ , m_ActionSystem(new CActionSystem(m_CoreSystem->GetDataCore(), m_CoreSystem->GetSlideCore(),
+ m_CoreSystem->GetSlideGraphCore(),
+ m_CoreSystem->GetActionCore(), m_SlideSystem,
+ inActionInstance, inActionEyeball))
+ , m_AggregateOperation(false)
+{
+ // TODO: Too many parameters passed in to the subsystem. Just make them know about FullSystem so
+ // they can get whatever they want
+ CStudioAnimationSystem *theAnimationSystem = new CStudioAnimationSystem(
+ m_PropertySystem, m_SlideSystem, m_CoreSystem->GetSlideCore(),
+ m_CoreSystem->GetSlideGraphCore(), m_CoreSystem->GetAnimationCore());
+ m_AnimationSystem = std::shared_ptr<qt3dsdm::IStudioAnimationSystem>(theAnimationSystem);
+
+ m_PropertySystem = std::shared_ptr<qt3dsdm::IPropertySystem>(
+ new CStudioPropertySystem(m_CoreSystem->GetNewMetaData(), m_CoreSystem->GetDataCore(),
+ m_SlideSystem, m_AnimationSystem));
+ theAnimationSystem->SetPropertySystem(m_PropertySystem);
+
+ TDataCorePtr dataCore(m_CoreSystem->GetDataCore());
+
+ static_cast<SSlideSystem *>(m_SlideSystem.get())->SetPropertySystem(m_PropertySystem);
+
+ ISlideSystemSignalProvider *theSlideSignaller =
+ dynamic_cast<SSlideSystem *>(m_SlideSystem.get())->GetSignalProvider();
+ m_Signaller = CreateStudioFullSystemSignaller(theSlideSignaller);
+ IStudioFullSystemSignalSender *theSystemSender =
+ dynamic_cast<IStudioFullSystemSignalSender *>(m_Signaller.get());
+ m_Connections.push_back(theSlideSignaller->ConnectSlideRearranged(
+ bind(NotifySlideRearranged, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3)));
+ m_Connections.push_back(theSlideSignaller->ConnectPropertyLinked(
+ bind(NotifyPropertyLinked, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3,
+ std::cref(m_AggregateOperation))));
+ m_Connections.push_back(theSlideSignaller->ConnectPropertyUnlinked(
+ bind(NotifyPropertyUnlinked, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3,
+ std::cref(m_AggregateOperation))));
+
+ m_Connections.push_back(theSlideSignaller->ConnectActiveSlide(
+ bind(NotifyActiveSlide, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1,
+ std::placeholders::_2, std::placeholders::_3, std::placeholders::_4,
+ GetAnimationCore(), GetSlideSystem())));
+
+ IDataCoreSignalProvider *theDataSignals =
+ dynamic_cast<IDataCoreSignalProvider *>(m_CoreSystem->GetDataCore().get());
+ m_Connections.push_back(theDataSignals->ConnectInstanceCreated(
+ bind(NotifyInstanceCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1)));
+ m_Connections.push_back(theDataSignals->ConnectInstanceDeleted(
+ bind(NotifyInstanceDeleted, ref(m_Consumer), theSystemSender, std::placeholders::_1)));
+
+ ISlideCoreSignalProvider *theSlideCoreSignaller =
+ dynamic_cast<ISlideCoreSignalProvider *>(m_CoreSystem->GetSlideCore().get());
+ m_Connections.push_back(theSlideCoreSignaller->ConnectInstancePropertyValueSet(
+ bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_2, std::placeholders::_3,
+ std::cref(m_AggregateOperation))));
+ m_Connections.push_back(theSlideCoreSignaller->ConnectSlideTimeChanged(
+ bind(NotifyComponentSeconds, ref(m_Consumer), theSystemSender, std::placeholders::_1,
+ dataCore, GetAnimationCore(), GetAnimationSystem(), GetSlideSystem())));
+ m_Connections.push_back(theSlideCoreSignaller->ConnectSlideCreated(
+ bind(NotifySlideCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1)));
+ m_Connections.push_back(theSlideCoreSignaller->ConnectSlideDeleted(
+ bind(NotifySlideDeleted, ref(m_Consumer), theSystemSender, std::placeholders::_1)));
+
+ IAnimationCoreSignalProvider *theAnimationSignals =
+ dynamic_cast<IAnimationCoreSignalProvider *>(GetAnimationCore().get());
+ m_Connections.push_back(theAnimationSignals->ConnectAnimationCreated(
+ bind(NotifyAnimationCreated, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, std::placeholders::_3, std::placeholders::_4,
+ std::cref(m_AggregateOperation))));
+ m_Connections.push_back(theAnimationSignals->ConnectAnimationDeleted(
+ bind(NotifyAnimationDeleted, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1, std::placeholders::_3, std::placeholders::_4)));
+ m_Connections.push_back(theAnimationSignals->ConnectKeyframeInserted(
+ bind(NotifyKeyframeInserted, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1, std::placeholders::_2,
+ GetAnimationCore(), std::cref(m_AggregateOperation))));
+ m_Connections.push_back(theAnimationSignals->ConnectKeyframeErased(
+ bind(NotifyKeyframeErased, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1, std::placeholders::_2,
+ GetAnimationCore())));
+ m_Connections.push_back(theAnimationSignals->ConnectKeyframeUpdated(
+ bind(NotifyKeyframeUpdated, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1, GetAnimationCore())));
+ m_Connections.push_back(theAnimationSignals->ConnectFirstKeyframeDynamicSet(
+ bind(NotifyConnectFirstKeyframeDynamicSet, ref(m_Consumer), dataCore,
+ theSystemSender, std::placeholders::_1,
+ std::placeholders::_2, GetAnimationCore())));
+ m_Connections.push_back(theAnimationSignals->ConnectBeforeAllKeyframesErased(
+ bind(NotifyAllKeyframesErased, ref(m_Consumer), theSystemSender,
+ GetAnimationCore(), std::placeholders::_1)));
+
+ IInstancePropertyCoreSignalProvider *thePropertyCoreSignaller =
+ dynamic_cast<CStudioPropertySystem *>(m_PropertySystem.get())
+ ->GetPropertyCoreSignalProvider();
+ m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue(
+ bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1, std::placeholders::_2, std::cref(m_AggregateOperation))));
+
+ thePropertyCoreSignaller = dynamic_cast<CStudioPropertySystem *>(m_PropertySystem.get())
+ ->GetImmediatePropertyCoreSignalProvider();
+ m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue(
+ bind(&IStudioFullSystemSignalSender::SendInstancePropertyValue, theSystemSender,
+ std::placeholders::_1, std::placeholders::_2)));
+
+ thePropertyCoreSignaller =
+ dynamic_cast<IInstancePropertyCoreSignalProvider *>(m_CoreSystem->GetDataCore().get());
+ m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue(
+ bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender,
+ std::placeholders::_1, std::placeholders::_2, std::cref(m_AggregateOperation))));
+
+ IActionCoreSignalProvider *theActionSignals =
+ dynamic_cast<IActionCoreSignalProvider *>(m_CoreSystem->GetActionCore().get());
+ m_Connections.push_back(theActionSignals->ConnectTriggerObjectSet(
+ bind(NotifyTriggerObjectSet, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, GetActionCore())));
+ m_Connections.push_back(theActionSignals->ConnectTargetObjectSet(
+ bind(NotifyTargetObjectSet, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, GetActionCore())));
+ m_Connections.push_back(theActionSignals->ConnectEventSet(
+ bind(NotifyEventSet, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, GetActionCore())));
+ m_Connections.push_back(theActionSignals->ConnectHandlerSet(
+ bind(NotifyHandlerSet, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, GetActionCore())));
+ m_Connections.push_back(theActionSignals->ConnectHandlerArgumentValueSet(bind(
+ NotifyHandlerArgumentValueSet, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, GetActionCore())));
+
+ IActionSystemSignalProvider *theActionSystemSignals =
+ dynamic_cast<CActionSystem *>(m_ActionSystem.get())->GetSignalProvider();
+ m_Connections.push_back(theActionSystemSignals->ConnectActionCreated(
+ bind(NotifyActionCreated, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)));
+ m_Connections.push_back(theActionSystemSignals->ConnectActionDeleted(
+ bind(NotifyActionDestroyed, ref(m_Consumer), theSystemSender,
+ std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)));
+}
+
+CStudioFullSystem::~CStudioFullSystem()
+{
+}
+
+std::shared_ptr<IPropertySystem> CStudioFullSystem::GetPropertySystem()
+{
+ return m_PropertySystem;
+}
+std::shared_ptr<ISlideSystem> CStudioFullSystem::GetSlideSystem()
+{
+ return m_SlideSystem;
+}
+std::shared_ptr<ISlideCore> CStudioFullSystem::GetSlideCore()
+{
+ return m_CoreSystem->GetSlideCore();
+}
+std::shared_ptr<IAnimationCore> CStudioFullSystem::GetAnimationCore()
+{
+ return m_CoreSystem->GetAnimationCore();
+}
+std::shared_ptr<IStudioAnimationSystem> CStudioFullSystem::GetAnimationSystem()
+{
+ return m_AnimationSystem;
+}
+std::shared_ptr<IActionCore> CStudioFullSystem::GetActionCore()
+{
+ return m_CoreSystem->GetActionCore();
+}
+std::shared_ptr<IActionSystem> CStudioFullSystem::GetActionSystem()
+{
+ return m_ActionSystem;
+}
+
+std::shared_ptr<IPropertySystem> CStudioFullSystem::GetPropertySystem() const
+{
+ return m_PropertySystem;
+}
+std::shared_ptr<ISlideSystem> CStudioFullSystem::GetSlideSystem() const
+{
+ return m_SlideSystem;
+}
+std::shared_ptr<ISlideCore> CStudioFullSystem::GetSlideCore() const
+{
+ return m_CoreSystem->GetSlideCore();
+}
+std::shared_ptr<IAnimationCore> CStudioFullSystem::GetAnimationCore() const
+{
+ return m_CoreSystem->GetAnimationCore();
+}
+std::shared_ptr<IStudioAnimationSystem> CStudioFullSystem::GetAnimationSystem() const
+{
+ return m_AnimationSystem;
+}
+std::shared_ptr<IActionCore> CStudioFullSystem::GetActionCore() const
+{
+ return m_CoreSystem->GetActionCore();
+}
+std::shared_ptr<IActionSystem> CStudioFullSystem::GetActionSystem() const
+{
+ return m_ActionSystem;
+}
+
+std::shared_ptr<CStudioCoreSystem> CStudioFullSystem::GetCoreSystem()
+{
+ return m_CoreSystem;
+}
+
+bool CStudioFullSystem::GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ SValue theTemp;
+ bool retval = dynamic_cast<const CStudioPropertySystem *>(m_PropertySystem.get())
+ ->GetCanonicalInstancePropertyValue(inInstance, inProperty, theTemp);
+ if (retval)
+ outValue = theTemp.toOldSkool();
+ return retval;
+}
+
+Qt3DSDMInstanceHandle CStudioFullSystem::FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty,
+ const TCharStr &inName) const
+{
+ return m_CoreSystem->FindInstanceByName(inNameProperty, inName);
+}
+
+void CStudioFullSystem::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ m_CoreSystem->SetConsumer(inConsumer);
+ DoSetConsumer(inConsumer, m_AnimationSystem);
+ m_Consumer = inConsumer;
+}
+
+IStudioFullSystemSignalProvider *CStudioFullSystem::GetSignalProvider()
+{
+ return dynamic_cast<IStudioFullSystemSignalProvider *>(m_Signaller.get());
+}
+
+IStudioFullSystemSignalSender *CStudioFullSystem::GetSignalSender()
+{
+ return dynamic_cast<IStudioFullSystemSignalSender *>(m_Signaller.get());
+}
+}
diff --git a/src/dm/systems/StudioFullSystem.h b/src/dm/systems/StudioFullSystem.h
new file mode 100644
index 0000000..9411e78
--- /dev/null
+++ b/src/dm/systems/StudioFullSystem.h
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef STUDIOFULLSYSTEMH
+#define STUDIOFULLSYSTEMH
+#include "Qt3DSDMTransactions.h"
+#include "Qt3DSDMHandles.h"
+#include "Qt3DSDMSignals.h"
+#include "Qt3DSDMDataTypes.h"
+
+namespace qt3dsdm {
+class IPropertySystem;
+class ISlideSystem;
+class IStudioAnimationSystem;
+class CStudioCoreSystem;
+class IInstancePropertyCore;
+class INotificationEngine;
+class IAnimationCore;
+class IActionCore;
+class ISlideCore;
+class IActionSystem;
+class ISignalConnection;
+
+class IStudioFullSystemSerializeHelper
+{
+public:
+ virtual ~IStudioFullSystemSerializeHelper() {}
+ /**
+ * Given an instance, set the name if possible. Called for parents of existing instances
+ * so we can find instances by name later. There is an implicit assumption for partial
+ * serialization that none of the instances that are serialized out are base instances
+ * for other serialized instances. There is another implicit assumption that the system
+ * can name any instances used a base.
+ */
+ virtual bool GetInstanceName(Qt3DSDMInstanceHandle inInstance, TCharStr &outName) = 0;
+};
+
+typedef std::shared_ptr<IStudioFullSystemSerializeHelper> TStudioFullSystemSerializeHelperPtr;
+
+// The full studio system needs extra information in the deserialize stage. This information
+// requires knowledge of the larger studio universe in order to work and thus clients need to
+// pass in an interface.
+class IStudioFullSystemDeserializeHelper
+{
+public:
+ virtual ~IStudioFullSystemDeserializeHelper() {}
+ /**
+ * Return an instance by name. Whatever method was used above to name instances
+ * should be used to find a given instance by name.
+ */
+ virtual Qt3DSDMInstanceHandle FindInstanceByName(const TCharStr &inName) = 0;
+ /**
+ * Translate a given guid. For pass 1, you should only translate ids and just return identity
+ * for anything that isn't an id.
+ */
+ virtual void TranslateGuidPass1(Qt3DSDMPropertyHandle inProperty, SLong4 inValue) = 0;
+ /**
+ * Now translate guids that are used as data variables. These are links to other objects and
+ *the GUID
+ * information should come from what was created in pass 1.
+ */
+ virtual SLong4 TranslateGuidPass2(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SLong4 inValue) = 0;
+};
+
+typedef std::shared_ptr<IStudioFullSystemDeserializeHelper> TStudioFullSystemDeserializeHelperPtr;
+
+class CStudioFullSystem : public ITransactionProducer
+{
+ Q_DISABLE_COPY(CStudioFullSystem)
+
+ // Base that the other types are built upon
+ std::shared_ptr<CStudioCoreSystem> m_CoreSystem;
+
+ // The data model exposed to studio
+ std::shared_ptr<IPropertySystem> m_PropertySystem;
+ std::shared_ptr<ISlideSystem> m_SlideSystem;
+ std::shared_ptr<IStudioAnimationSystem> m_AnimationSystem;
+ std::shared_ptr<IActionSystem> m_ActionSystem;
+
+ std::vector<std::shared_ptr<ISignalConnection>> m_Connections;
+
+ TTransactionConsumerPtr m_Consumer;
+ TSignalItemPtr m_Signaller;
+ bool m_AggregateOperation;
+
+public:
+ CStudioFullSystem(std::shared_ptr<CStudioCoreSystem> inCoreSystem,
+ Qt3DSDMInstanceHandle inSlideInstance,
+ Qt3DSDMPropertyHandle inComponentGuidProperty,
+ Qt3DSDMInstanceHandle inActionInstance, Qt3DSDMPropertyHandle inActionEyeball);
+ virtual ~CStudioFullSystem();
+
+ void BeginAggregateOperation() { m_AggregateOperation = true; }
+ void EndAggregateOperation() { m_AggregateOperation = false; }
+
+ std::shared_ptr<IPropertySystem> GetPropertySystem();
+ std::shared_ptr<ISlideSystem> GetSlideSystem();
+ std::shared_ptr<ISlideCore> GetSlideCore();
+ std::shared_ptr<IAnimationCore> GetAnimationCore();
+ std::shared_ptr<IStudioAnimationSystem> GetAnimationSystem();
+ std::shared_ptr<IActionCore> GetActionCore();
+ std::shared_ptr<IActionSystem> GetActionSystem();
+
+ std::shared_ptr<IPropertySystem> GetPropertySystem() const;
+ std::shared_ptr<ISlideSystem> GetSlideSystem() const;
+ std::shared_ptr<ISlideCore> GetSlideCore() const;
+ std::shared_ptr<IAnimationCore> GetAnimationCore() const;
+ std::shared_ptr<IStudioAnimationSystem> GetAnimationSystem() const;
+ std::shared_ptr<IActionCore> GetActionCore() const;
+ std::shared_ptr<IActionSystem> GetActionSystem() const;
+
+ // Don't use this unless you are a test harness or some other more-knowledgeable-than-ordinary
+ // entity.
+ std::shared_ptr<CStudioCoreSystem> GetCoreSystem();
+
+ // Ignoring animation and the currently active slide, get the canonical instance property value
+ // for this instance.
+ bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const;
+ Qt3DSDMInstanceHandle FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty,
+ const TCharStr &inName) const;
+
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+ TTransactionConsumerPtr GetConsumer() { return m_Consumer; }
+
+ // This signal provider sends signals during undo/redo and during
+ // animation runs.
+ IStudioFullSystemSignalProvider *GetSignalProvider();
+
+ // Return the signal sender so that we can activate/deactivate signals
+ IStudioFullSystemSignalSender *GetSignalSender();
+};
+
+typedef std::shared_ptr<CStudioFullSystem> TStudioFullSystemPtr;
+}
+
+#endif
diff --git a/src/dm/systems/StudioPropertySystem.cpp b/src/dm/systems/StudioPropertySystem.cpp
new file mode 100644
index 0000000..78fabc6
--- /dev/null
+++ b/src/dm/systems/StudioPropertySystem.cpp
@@ -0,0 +1,233 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSDMPrefix.h"
+#include "StudioPropertySystem.h"
+#include "StudioAnimationSystem.h"
+#include "SignalsImpl.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+CStudioPropertySystem::CStudioPropertySystem(std::shared_ptr<IMetaData> inMetaData,
+ TDataCorePtr inDataCore, TSlideSystemPtr inSlideSystem,
+ TStudioAnimationSystemPtr inStudioAnimationSystem)
+ : m_MetaData(inMetaData)
+ , m_DataCore(inDataCore)
+ , m_SlideSystem(inSlideSystem)
+ , m_StudioAnimationSystem(inStudioAnimationSystem)
+{
+ m_PropertyCoreSignaller = CreatePropertyCoreSignaller();
+ m_ImmediateModePropertyCoreSignaller = CreatePropertyCoreSignaller();
+}
+
+DataModelDataType::Value CStudioPropertySystem::GetDataType(Qt3DSDMPropertyHandle inProperty) const
+{
+ if (m_DataCore->IsProperty(inProperty))
+ return m_DataCore->GetProperty(inProperty).m_Type;
+ return DataModelDataType::None;
+}
+
+TCharStr CStudioPropertySystem::GetName(Qt3DSDMPropertyHandle inProperty) const
+{
+ if (m_DataCore->IsProperty(inProperty))
+ return m_DataCore->GetProperty(inProperty).m_Name;
+ return TCharStr();
+}
+
+TCharStr CStudioPropertySystem::GetFormalName(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ if (inInstance.Valid() && inProperty.Valid())
+ return m_MetaData->GetFormalName(inInstance, inProperty);
+ return TCharStr();
+}
+
+AdditionalMetaDataType::Value
+CStudioPropertySystem::GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ return m_MetaData->GetAdditionalMetaDataType(inInstance, inProperty);
+}
+
+TMetaDataData
+CStudioPropertySystem::GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ return m_MetaData->GetAdditionalMetaDataData(inInstance, inProperty);
+}
+
+Qt3DSDMInstanceHandle CStudioPropertySystem::GetPropertyOwner(Qt3DSDMPropertyHandle inProperty) const
+{
+
+ qt3dsdm::Qt3DSDMPropertyDefinition thePropDef = m_DataCore->GetProperty(inProperty);
+ return thePropDef.m_Instance;
+}
+
+Qt3DSDMPropertyHandle
+CStudioPropertySystem::GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const
+{
+ return m_DataCore->GetAggregateInstancePropertyByName(inInstance, inStr);
+}
+
+void CStudioPropertySystem::GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const
+{
+ m_DataCore->GetAggregateInstanceProperties(inInstance, outProperties);
+}
+
+bool CStudioPropertySystem::HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ return m_DataCore->HasAggregateInstanceProperty(inInstance, inProperty);
+}
+
+bool ApplyValueAndReturnTrue(const SValue &inValue, SValue &outValue)
+{
+ outValue = inValue;
+ return true;
+}
+
+bool CStudioPropertySystem::GetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ if (!m_DataCore->IsInstance(inInstance))
+ return false;
+ if (!m_DataCore->IsProperty(inProperty))
+ return false;
+
+ Qt3DSDMSlideHandle theAnimationSlide;
+ theAnimationSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty);
+ SValue theTemp;
+ bool retval = SetDefault(GetDataType(inProperty), theTemp);
+ if (retval && theAnimationSlide.Valid()
+ && m_StudioAnimationSystem->GetAnimatedInstancePropertyValue(theAnimationSlide, inInstance,
+ inProperty, theTemp))
+ return ApplyValueAndReturnTrue(theTemp, outValue);
+ if (theAnimationSlide.Valid()
+ && m_SlideSystem->GetInstancePropertyValue(theAnimationSlide, inInstance, inProperty,
+ theTemp))
+ return ApplyValueAndReturnTrue(theTemp, outValue);
+ return m_DataCore->GetInstancePropertyValue(inInstance, inProperty, outValue);
+}
+
+void CStudioPropertySystem::SetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ m_DataCore->CheckValue(inInstance, inProperty, inValue);
+
+ Qt3DSDMSlideHandle theApplicableSlide;
+ theApplicableSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty);
+ if (theApplicableSlide.Valid()) {
+ if (!m_StudioAnimationSystem->SetAnimatedInstancePropertyValue(
+ theApplicableSlide, inInstance, inProperty, inValue.toOldSkool())) {
+ // Force set on slide where item exists as it doesn't exist on the root.
+ m_SlideSystem->ForceSetInstancePropertyValue(theApplicableSlide, inInstance, inProperty,
+ inValue.toOldSkool());
+ }
+ } else {
+ m_DataCore->SetInstancePropertyValue(inInstance, inProperty, inValue);
+ }
+}
+
+Qt3DSDMInstanceHandle CStudioPropertySystem::CreateInstance()
+{
+ return m_DataCore->CreateInstance();
+}
+
+void CStudioPropertySystem::GetInstances(TInstanceHandleList &outInstances) const
+{
+ m_DataCore->GetInstances(outInstances);
+}
+
+void CStudioPropertySystem::DeleteInstance(Qt3DSDMInstanceHandle inHandle)
+{
+ m_DataCore->DeleteInstance(inHandle);
+}
+
+void CStudioPropertySystem::DeriveInstance(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent)
+{
+ m_DataCore->DeriveInstance(inInstance, inParent);
+}
+
+bool CStudioPropertySystem::IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const
+{
+ return m_DataCore->IsInstanceOrDerivedFrom(inInstance, inParent);
+}
+
+QVector<Qt3DSDMPropertyHandle>
+CStudioPropertySystem::GetControllableProperties(Qt3DSDMInstanceHandle inInst) const
+{
+ vector<Qt3DSDMMetaDataPropertyHandle> propList;
+ QVector<Qt3DSDMPropertyHandle> outList;
+ m_MetaData->GetMetaDataProperties(inInst, propList);
+
+ for (const auto it : qAsConst(propList)) {
+ auto metadata = m_MetaData->GetMetaDataPropertyInfo(it).getValue();
+
+ if ((metadata.m_Controllable
+ || (metadata.m_Animatable
+ && m_StudioAnimationSystem->IsPropertyAnimatable(inInst, metadata.m_Property)))
+ && !metadata.m_IsHidden) {
+ outList.append(metadata.m_Property);
+ }
+ }
+ return outList;
+}
+
+Qt3DSDMPropertyHandle CStudioPropertySystem::AddProperty(Qt3DSDMInstanceHandle inInstance,
+ TCharPtr inName,
+ DataModelDataType::Value inPropType)
+{
+ return m_DataCore->AddProperty(inInstance, inName, inPropType);
+}
+
+bool CStudioPropertySystem::HandleValid(int inHandle) const
+{
+ return m_DataCore->HandleValid(inHandle);
+}
+
+bool CStudioPropertySystem::GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ SValue theTempValue;
+ if (m_SlideSystem->GetCanonicalInstancePropertyValue(inInstance, inProperty, theTempValue)) {
+ outValue = SValue(theTempValue);
+ return true;
+ }
+ return m_DataCore->GetInstancePropertyValue(inInstance, inProperty, outValue);
+}
+}
diff --git a/src/dm/systems/StudioPropertySystem.h b/src/dm/systems/StudioPropertySystem.h
new file mode 100644
index 0000000..67abcf9
--- /dev/null
+++ b/src/dm/systems/StudioPropertySystem.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef INSTANCEPROPERTYCORESYSTEMH
+#define INSTANCEPROPERTYCORESYSTEMH
+
+#include "Qt3DSDMSlides.h"
+#include "Qt3DSDMAnimation.h"
+#include "Qt3DSDMSignals.h"
+#include "Qt3DSDMDataCore.h"
+
+namespace qt3dsdm {
+
+typedef std::tuple<Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, SValue> TTemporaryPropertyValue;
+typedef std::vector<TTemporaryPropertyValue> TTemporaryPropertyValueList;
+
+/**
+ * Get/set instance properties taking the slide and slide graph, and animation systems into
+ *account.
+ * Also takes care of notifying external entities when a property changes.
+ */
+class CStudioPropertySystem : public IPropertySystem
+{
+ std::shared_ptr<IMetaData> m_MetaData;
+ TDataCorePtr m_DataCore;
+
+ TSlideSystemPtr m_SlideSystem;
+ TStudioAnimationSystemPtr m_StudioAnimationSystem;
+
+ TSignalItemPtr m_PropertyCoreSignaller;
+ TSignalItemPtr m_ImmediateModePropertyCoreSignaller;
+
+public:
+ CStudioPropertySystem(std::shared_ptr<IMetaData> inMetaData, TDataCorePtr inDataCore,
+ TSlideSystemPtr inSlideSystem,
+ TStudioAnimationSystemPtr inStudioAnimationSystem);
+
+ IInstancePropertyCoreSignalProvider *GetPropertyCoreSignalProvider()
+ {
+ return dynamic_cast<IInstancePropertyCoreSignalProvider *>(m_PropertyCoreSignaller.get());
+ }
+ // The immediate signaller is used before changes have been committed for very live feedback.
+ IInstancePropertyCoreSignalProvider *GetImmediatePropertyCoreSignalProvider()
+ {
+ return dynamic_cast<IInstancePropertyCoreSignalProvider *>(
+ m_ImmediateModePropertyCoreSignaller.get());
+ }
+
+ IInstancePropertyCoreSignalSender *GetPropertyCoreSignalSender()
+ {
+ return dynamic_cast<IInstancePropertyCoreSignalSender *>(m_PropertyCoreSignaller.get());
+ }
+
+ DataModelDataType::Value GetDataType(Qt3DSDMPropertyHandle inProperty) const override;
+ TCharStr GetName(Qt3DSDMPropertyHandle inProperty) const override;
+ TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ virtual AdditionalMetaDataType::Value
+ GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ Qt3DSDMInstanceHandle GetPropertyOwner(Qt3DSDMPropertyHandle inProperty) const override;
+
+ Qt3DSDMPropertyHandle GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const override;
+ void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const override;
+ bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+
+ bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+ void SetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+
+ Qt3DSDMInstanceHandle CreateInstance() override;
+ void GetInstances(TInstanceHandleList &outInstances) const override;
+ void DeleteInstance(Qt3DSDMInstanceHandle inHandle) override;
+
+ void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) override;
+ bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const override;
+
+ Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName,
+ DataModelDataType::Value inPropType) override;
+ bool HandleValid(int inHandle) const override;
+
+ // Get the instance property value from the slide that owns the instance or the data core if the
+ // slide doesn't have the value
+ bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const;
+
+ QVector<Qt3DSDMPropertyHandle> GetControllableProperties(
+ Qt3DSDMInstanceHandle inInst) const override;
+
+private:
+ static bool DerivedGuidMatches(qt3dsdm::IDataCore &inDataCore,
+ qt3dsdm::Qt3DSDMInstanceHandle inInstance,
+ qt3dsdm::Qt3DSDMPropertyHandle inProperty, qt3dsdm::SLong4 inGuid);
+ CStudioPropertySystem(const CStudioPropertySystem&) = delete;
+ CStudioPropertySystem& operator=(const CStudioPropertySystem&) = delete;
+};
+}
+
+#endif
diff --git a/src/dm/systems/VectorTransactions.h b/src/dm/systems/VectorTransactions.h
new file mode 100644
index 0000000..ff1fe2e
--- /dev/null
+++ b/src/dm/systems/VectorTransactions.h
@@ -0,0 +1,235 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef VECTORTRANSACTIONSH
+#define VECTORTRANSACTIONSH
+
+namespace qt3dsdm {
+template <typename TItemType>
+inline void VecInsert(std::vector<TItemType> &inItems, const TItemType &inItem, size_t inIndex)
+{
+ inItems.insert(inItems.begin() + inIndex, inItem);
+}
+
+template <typename TItemType>
+inline void VecErase(std::vector<TItemType> &inItems, const TItemType &inItem)
+{
+ erase_if(inItems, std::bind(std::equal_to<TItemType>(), inItem, std::placeholders::_1));
+}
+
+template <typename TItemType>
+inline void VecInsertTransaction(const char *inFile, int inLine, std::vector<TItemType> &inItems,
+ size_t inIndex, TTransactionConsumerPtr &inConsumer)
+{
+ TItemType theItem = inItems.at(inIndex);
+ TTransactionPtr theTransaction(DoCreateGenericTransaction(
+ inFile, inLine, std::bind(VecInsert<TItemType>, std::ref(inItems), theItem, inIndex),
+ std::bind(VecErase<TItemType>, std::ref(inItems), theItem)));
+ inConsumer->OnTransaction(theTransaction);
+}
+
+template <typename TItemType>
+inline void VecEraseTransaction(const char *inFile, int inLine, std::vector<TItemType> &inItems,
+ size_t inIndex, const TItemType &inItem,
+ TTransactionConsumerPtr &inConsumer)
+{
+ TTransactionPtr theTransaction(DoCreateGenericTransaction(
+ inFile, inLine, std::bind(VecErase<TItemType>, std::ref(inItems), inItem),
+ std::bind(VecInsert<TItemType>, std::ref(inItems), inItem, inIndex)));
+ inConsumer->OnTransaction(theTransaction);
+}
+
+template <typename TItemType>
+inline void CreateVecInsertTransaction(const char *inFile, int inLine,
+ TTransactionConsumerPtr inConsumer, const TItemType &inItem,
+ std::vector<TItemType> &inItems)
+{
+ using namespace std;
+ size_t theDistance = distance(inItems.begin(), find(inItems.begin(), inItems.end(), inItem));
+ RunWithConsumer(inConsumer, std::bind(VecInsertTransaction<TItemType>, inFile, inLine,
+ std::ref(inItems), theDistance, std::placeholders::_1));
+}
+
+template <typename TItemType>
+inline void CreateVecEraseTransaction(const char *inFile, int inLine,
+ TTransactionConsumerPtr inConsumer, const TItemType &inItem,
+ std::vector<TItemType> &inItems)
+{
+ using namespace std;
+ size_t theDistance = distance(inItems.begin(), find(inItems.begin(), inItems.end(), inItem));
+ RunWithConsumer(inConsumer,
+ std::bind(VecEraseTransaction<TItemType>, inFile, inLine, std::ref(inItems),
+ theDistance, std::ref(inItem), std::placeholders::_1));
+}
+
+template <typename TKeyType, typename TValueType, typename THashType>
+struct HashMapAction
+{
+ std::unordered_map<TKeyType, TValueType, THashType> &m_HashMap;
+ std::pair<TKeyType, TValueType> m_Value;
+
+ HashMapAction(std::unordered_map<TKeyType, TValueType, THashType> &map,
+ const std::pair<TKeyType, TValueType> &val)
+ : m_HashMap(map)
+ , m_Value(val)
+ {
+ }
+ bool Exists() { return m_HashMap.find(m_Value.first) != m_HashMap.end(); }
+ void Add()
+ {
+ Q_ASSERT(!Exists());
+ m_HashMap.insert(m_Value);
+ }
+ void Remove()
+ {
+ Q_ASSERT(Exists());
+ m_HashMap.erase(m_HashMap.find(m_Value.first));
+ }
+};
+
+template <typename TKeyType, typename TValueType, typename THashType>
+struct HashMapInsertTransaction : public HashMapAction<TKeyType, TValueType, THashType>,
+ public ITransaction,
+ public IMergeableTransaction<TValueType>
+{
+ typedef HashMapAction<TKeyType, TValueType, THashType> base;
+ HashMapInsertTransaction(const char *inFile, int inLine,
+ std::unordered_map<TKeyType, TValueType, THashType> &map,
+ const std::pair<TKeyType, TValueType> &val)
+ : HashMapAction<TKeyType, TValueType, THashType>(map, val)
+ , ITransaction(inFile, inLine)
+ {
+ }
+ void Do() override { base::Add(); }
+ void Undo() override { base::Remove(); }
+ void Update(const TValueType &inValue) override { base::m_Value.second = inValue; }
+};
+
+template <typename TKeyType, typename TValueType, typename THashType>
+struct HashMapEraseTransaction : public HashMapAction<TKeyType, TValueType, THashType>,
+ public ITransaction
+{
+ typedef HashMapAction<TKeyType, TValueType, THashType> base;
+ HashMapEraseTransaction(const char *inFile, int inLine,
+ std::unordered_map<TKeyType, TValueType, THashType> &map,
+ const std::pair<TKeyType, TValueType> &val)
+ : HashMapAction<TKeyType, TValueType, THashType>(map, val)
+ , ITransaction(inFile, inLine)
+ {
+ }
+ void Do() override { base::Remove(); }
+ void Undo() override { base::Add(); }
+};
+
+template <typename TKeyType, typename TValueType, typename THashType>
+inline std::shared_ptr<IMergeableTransaction<TValueType>>
+CreateHashMapInsertTransaction(const char *inFile, int inLine, TTransactionConsumerPtr inConsumer,
+ const std::pair<TKeyType, TValueType> &inItem,
+ std::unordered_map<TKeyType, TValueType, THashType> &inItems)
+{
+ using namespace std;
+ std::shared_ptr<IMergeableTransaction<TValueType>> retval;
+ if (inConsumer) {
+ std::shared_ptr<HashMapInsertTransaction<TKeyType, TValueType, THashType>> transaction(
+ std::make_shared<HashMapInsertTransaction<TKeyType, TValueType, THashType>>(
+ inFile, inLine, std::ref(inItems), std::cref(inItem)));
+ retval = static_pointer_cast<IMergeableTransaction<TValueType>>(transaction);
+ inConsumer->OnTransaction(static_pointer_cast<ITransaction>(transaction));
+ }
+ return retval;
+}
+
+template <typename TKeyType, typename TValueType, typename THashType>
+inline void
+CreateHashMapEraseTransaction(const char *inFile, int inLine, TTransactionConsumerPtr inConsumer,
+ const std::pair<TKeyType, TValueType> &inItem,
+ std::unordered_map<TKeyType, TValueType, THashType> &inItems)
+{
+ using namespace std;
+ if (inConsumer)
+ inConsumer->OnTransaction(static_pointer_cast<ITransaction>(
+ std::make_shared<HashMapEraseTransaction<TKeyType, TValueType, THashType>>(
+ inFile, inLine, std::ref(inItems), std::cref(inItem))));
+}
+
+template <typename TKeyType, typename TValueType, typename THashType>
+struct HashMapSwapTransaction : public ITransaction, public IMergeableTransaction<TValueType>
+{
+ typedef std::unordered_map<TKeyType, TValueType, THashType> TMapType;
+
+ TMapType &m_HashMap;
+ TKeyType m_Key;
+ TValueType m_OldValue;
+ TValueType m_NewValue;
+
+ HashMapSwapTransaction(const char *inFile, int inLine, TMapType &inMap, const TKeyType &inKey,
+ const TValueType &inOldVal, const TValueType &inNewVal)
+ : ITransaction(inFile, inLine)
+ , m_HashMap(inMap)
+ , m_Key(inKey)
+ , m_OldValue(inOldVal)
+ , m_NewValue(inNewVal)
+ {
+ }
+
+ bool Exists() { return m_HashMap.find(m_Key) != m_HashMap.end(); }
+ void SetValue(const TValueType &inVal)
+ {
+ typename TMapType::iterator find(m_HashMap.find(m_Key));
+ if (find != m_HashMap.end())
+ find->second = inVal;
+ else
+ m_HashMap.insert(std::make_pair(m_Key, inVal));
+ }
+ void Do() override { SetValue(m_NewValue); }
+ void Undo() override { SetValue(m_OldValue); }
+ void Update(const TValueType &inValue) override { m_NewValue = inValue; }
+};
+
+template <typename TKeyType, typename TValueType, typename THashType>
+inline std::shared_ptr<IMergeableTransaction<TValueType>>
+CreateHashMapSwapTransaction(const char *inFile, int inLine, TTransactionConsumerPtr inConsumer,
+ const TKeyType &inKey, const TValueType &inOldValue,
+ const TValueType &inNewValue,
+ std::unordered_map<TKeyType, TValueType, THashType> &inItems)
+{
+ using namespace std;
+ std::shared_ptr<IMergeableTransaction<TValueType>> retval;
+ if (inConsumer) {
+ std::shared_ptr<HashMapSwapTransaction<TKeyType, TValueType, THashType>> transaction =
+ std::make_shared<HashMapSwapTransaction<TKeyType, TValueType, THashType>>(
+ inFile, inLine, std::ref(inItems), inKey, inOldValue, inNewValue);
+ retval = static_pointer_cast<IMergeableTransaction<TValueType>>(transaction);
+ inConsumer->OnTransaction(static_pointer_cast<ITransaction>(transaction));
+ }
+ return retval;
+}
+}
+
+#endif
diff --git a/src/dm/systems/cores/ActionCoreProducer.cpp b/src/dm/systems/cores/ActionCoreProducer.cpp
new file mode 100644
index 0000000..c262c23
--- /dev/null
+++ b/src/dm/systems/cores/ActionCoreProducer.cpp
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "ActionCoreProducer.h"
+#include "HandleSystemTransactions.h"
+#include "VectorTransactions.h"
+#include "SignalsImpl.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+Qt3DSDMActionHandle CActionCoreProducer::CreateAction(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner,
+ SLong4 inTriggerTargetObjects)
+{
+ Qt3DSDMActionHandle retval =
+ m_Data->CreateAction(inInstance, inSlide, inOwner, inTriggerTargetObjects);
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ return retval;
+}
+
+void CActionCoreProducer::DeleteAction(Qt3DSDMActionHandle inAction,
+ Qt3DSDMInstanceHandle &outInstance)
+{
+ // Ensure action exists
+ SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects);
+ CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inAction, m_Data->m_Objects);
+ do_all(theAction->m_ActionInfo.m_HandlerArgs,
+ std::bind(DoCreateHandleDeleteTransaction, __FILE__, __LINE__, m_Consumer,
+ std::placeholders::_1, std::ref(m_Data->m_Objects)));
+ m_Data->DeleteAction(inAction, outInstance);
+}
+
+const SActionInfo &CActionCoreProducer::GetActionInfo(Qt3DSDMActionHandle inAction) const
+{
+ return m_Data->GetActionInfo(inAction);
+}
+
+void CActionCoreProducer::GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const
+{
+ return m_Data->GetActions(inSlide, inOwner, outActions);
+}
+
+void CActionCoreProducer::GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const
+{
+ return m_Data->GetActions(inSlide, outActions);
+}
+
+void CActionCoreProducer::GetActions(Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const
+{
+ return m_Data->GetActions(inOwner, outActions);
+}
+
+void CActionCoreProducer::GetActions(TActionHandleList &outActions) const
+{
+ return m_Data->GetActions(outActions);
+}
+
+Qt3DSDMInstanceHandle CActionCoreProducer::GetActionInstance(Qt3DSDMActionHandle inAction) const
+{
+ return m_Data->GetActionInstance(inAction);
+}
+
+Qt3DSDMActionHandle
+CActionCoreProducer::GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const
+{
+ return m_Data->GetActionByInstance(inActionInstance);
+}
+
+void CActionCoreProducer::SetTriggerObject(Qt3DSDMActionHandle inAction,
+ const SObjectRefType &inTriggerObject)
+{
+ SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects);
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSimpleActionCore::SetTriggerObject, m_Data, inAction, inTriggerObject),
+ std::bind(&CSimpleActionCore::SetTriggerObject, m_Data, inAction,
+ theAction->m_ActionInfo.m_TriggerObject))));
+ }
+ m_Data->SetTriggerObject(inAction, inTriggerObject);
+ GetSignalSender()->SendTriggerObjectSet(inAction, theAction->m_ActionInfo.m_TriggerObject);
+}
+
+void CActionCoreProducer::SetTargetObject(Qt3DSDMActionHandle inAction,
+ const SObjectRefType &inTargetObject)
+{
+ SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects);
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSimpleActionCore::SetTargetObject, m_Data, inAction, inTargetObject),
+ std::bind(&CSimpleActionCore::SetTargetObject, m_Data, inAction,
+ theAction->m_ActionInfo.m_TargetObject))));
+ }
+ m_Data->SetTargetObject(inAction, inTargetObject);
+ GetSignalSender()->SendTargetObjectSet(inAction, theAction->m_ActionInfo.m_TargetObject);
+}
+
+void CActionCoreProducer::SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventHandle)
+{
+ SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects);
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSimpleActionCore::SetEvent, m_Data, inAction, inEventHandle),
+ std::bind(&CSimpleActionCore::SetEvent, m_Data, inAction,
+ theAction->m_ActionInfo.m_Event))));
+ }
+ m_Data->SetEvent(inAction, inEventHandle);
+ GetSignalSender()->SendEventSet(inAction, inEventHandle);
+}
+
+void CActionCoreProducer::SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle)
+{
+ SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects);
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSimpleActionCore::SetHandler, m_Data, inAction, inHandlerHandle),
+ std::bind(&CSimpleActionCore::SetHandler, m_Data, inAction,
+ theAction->m_ActionInfo.m_Handler))));
+ }
+ m_Data->SetHandler(inAction, inHandlerHandle);
+ GetSignalSender()->SendHandlerSet(inAction, inHandlerHandle);
+}
+
+Qt3DSDMHandlerArgHandle CActionCoreProducer::AddHandlerArgument(Qt3DSDMActionHandle inAction,
+ const TCharStr &inName,
+ HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType)
+{
+ Qt3DSDMHandlerArgHandle retval =
+ m_Data->AddHandlerArgument(inAction, inName, inArgType, inValueType);
+ SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects);
+ CreateVecInsertTransaction<Qt3DSDMHandlerArgHandle>(__FILE__, __LINE__, m_Consumer, retval,
+ theAction->m_ActionInfo.m_HandlerArgs);
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ GetSignalSender()->SendHandlerArgumentAdded(inAction, retval, inName, inArgType, inValueType);
+ return retval;
+}
+
+void CActionCoreProducer::RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument)
+{
+ SHandlerArgument *theHandlerArgument =
+ CSimpleActionCore::GetHandlerArgumentNF(inHandlerArgument, m_Data->m_Objects);
+ SAction *theAction = CSimpleActionCore::GetActionNF(
+ theHandlerArgument->m_HandlerArgInfo.m_Action, m_Data->m_Objects);
+ if (exists(theAction->m_ActionInfo.m_HandlerArgs,
+ std::bind(equal_to<Qt3DSDMHandlerArgHandle>(), inHandlerArgument,
+ std::placeholders::_1))) {
+ CreateVecEraseTransaction<Qt3DSDMHandlerArgHandle>(__FILE__, __LINE__, m_Consumer,
+ inHandlerArgument,
+ theAction->m_ActionInfo.m_HandlerArgs);
+ CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inHandlerArgument, m_Data->m_Objects);
+ }
+ m_Data->RemoveHandlerArgument(inHandlerArgument);
+ GetSignalSender()->SendHandlerArgumentRemoved(theAction->m_Handle, theHandlerArgument->m_Handle,
+ theHandlerArgument->m_HandlerArgInfo.m_Name,
+ theHandlerArgument->m_HandlerArgInfo.m_ArgType,
+ theHandlerArgument->m_HandlerArgInfo.m_ValueType);
+}
+
+const SHandlerArgumentInfo &
+CActionCoreProducer::GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const
+{
+ return m_Data->GetHandlerArgumentInfo(inHandlerArgument);
+}
+
+void CActionCoreProducer::GetHandlerArguments(Qt3DSDMActionHandle inAction,
+ THandlerArgHandleList &outHandlerArguments) const
+{
+ return m_Data->GetHandlerArguments(inAction, outHandlerArguments);
+}
+
+void CActionCoreProducer::GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ SValue &outValue) const
+{
+ return m_Data->GetHandlerArgumentValue(inHandlerArgument, outValue);
+}
+
+void CActionCoreProducer::SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const SValue &inValue)
+{
+ SHandlerArgument *theHandlerArgument =
+ CSimpleActionCore::GetHandlerArgumentNF(inHandlerArgument, m_Data->m_Objects);
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSimpleActionCore::SetHandlerArgumentValue, m_Data, inHandlerArgument,
+ inValue),
+ std::bind(&CSimpleActionCore::SetHandlerArgumentValue, m_Data, inHandlerArgument,
+ theHandlerArgument->m_HandlerArgInfo.m_Value))));
+ }
+ m_Data->SetHandlerArgumentValue(inHandlerArgument, inValue);
+ GetSignalSender()->SendHandlerArgumentValueSet(inHandlerArgument, inValue);
+}
+
+// CHandleBase
+bool CActionCoreProducer::HandleValid(int inHandle) const
+{
+ return m_Data->HandleValid(inHandle);
+}
+
+// ITransactionProducer implementation
+void CActionCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ m_Consumer = inConsumer;
+}
+
+TSignalConnectionPtr CActionCoreProducer::ConnectTriggerObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectTriggerObjectSet(inCallback);
+}
+TSignalConnectionPtr CActionCoreProducer::ConnectTargetObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectTargetObjectSet(inCallback);
+}
+TSignalConnectionPtr CActionCoreProducer::ConnectEventSet(
+ const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectEventSet(inCallback);
+}
+TSignalConnectionPtr CActionCoreProducer::ConnectHandlerSet(
+ const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectHandlerSet(inCallback);
+}
+
+TSignalConnectionPtr CActionCoreProducer::ConnectHandlerArgumentAdded(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback)
+{
+ return GetSignalProvider()->ConnectHandlerArgumentAdded(inCallback);
+}
+TSignalConnectionPtr CActionCoreProducer::ConnectHandlerArgumentRemoved(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback)
+{
+ return GetSignalProvider()->ConnectHandlerArgumentRemoved(inCallback);
+}
+TSignalConnectionPtr CActionCoreProducer::ConnectHandlerArgumentValueSet(
+ const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectHandlerArgumentValueSet(inCallback);
+}
+
+void CActionCoreProducer::InitSignaller()
+{
+ m_Signaller = CreateActionCoreSignaller();
+}
+
+IActionCoreSignalProvider *CActionCoreProducer::GetSignalProvider()
+{
+ return dynamic_cast<IActionCoreSignalProvider *>(m_Signaller.get());
+}
+
+IActionCoreSignalSender *CActionCoreProducer::GetSignalSender()
+{
+ return dynamic_cast<IActionCoreSignalSender *>(m_Signaller.get());
+}
+}
diff --git a/src/dm/systems/cores/ActionCoreProducer.h b/src/dm/systems/cores/ActionCoreProducer.h
new file mode 100644
index 0000000..bf65a38
--- /dev/null
+++ b/src/dm/systems/cores/ActionCoreProducer.h
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef ACTIONCOREPRODUCERH
+#define ACTIONCOREPRODUCERH
+
+#include "SimpleActionCore.h"
+#include "Qt3DSDMTransactions.h"
+#include "Qt3DSDMSignals.h"
+#include "Qt3DSDMStringTable.h"
+
+namespace qt3dsdm {
+class CActionCoreProducer : public IActionCore,
+ public ITransactionProducer,
+ public IActionCoreSignalProvider
+{
+ Q_DISABLE_COPY(CActionCoreProducer)
+
+ TSimpleActionCorePtr m_Data;
+ TTransactionConsumerPtr m_Consumer;
+ TSignalItemPtr m_Signaller;
+
+public:
+ CActionCoreProducer(TStringTablePtr inStringTable)
+ : m_Data(new CSimpleActionCore(inStringTable))
+ {
+ InitSignaller();
+ }
+
+ TSimpleActionCorePtr GetTransactionlessActionCore() const { return m_Data; }
+
+ // IActionCore implementation
+ IStringTable &GetStringTable() const override { return m_Data->GetStringTable(); }
+ TStringTablePtr GetStringTablePtr() const override { return m_Data->GetStringTablePtr(); }
+ // Action
+ Qt3DSDMActionHandle CreateAction(Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner, SLong4 inTriggerTargetObjects) override;
+ void DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance) override;
+ const SActionInfo &GetActionInfo(Qt3DSDMActionHandle inAction) const override;
+ void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const override;
+ void GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const override;
+ void GetActions(Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions) const override;
+ void GetActions(TActionHandleList &outActions) const override;
+ Qt3DSDMInstanceHandle GetActionInstance(Qt3DSDMActionHandle inAction) const override;
+ Qt3DSDMActionHandle GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const override;
+
+ // Action Properties
+ void SetTriggerObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTriggerObject) override;
+ void SetTargetObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTargetObject) override;
+ void SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) override;
+ void SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle) override;
+
+ // Action Argument
+ Qt3DSDMHandlerArgHandle AddHandlerArgument(Qt3DSDMActionHandle inAction, const TCharStr &inName,
+ HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType) override;
+ void RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) override;
+ const SHandlerArgumentInfo &
+ GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const override;
+ void GetHandlerArguments(Qt3DSDMActionHandle inAction,
+ THandlerArgHandleList &outHandlerArguments) const override;
+
+ // Action Argument Properties
+ void GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, SValue &outValue) const override;
+ void SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, const SValue &inValue) override;
+
+ // CHandleBase
+ bool HandleValid(int inHandle) const override;
+
+ // ITransactionProducer implementation
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+
+ TSignalConnectionPtr ConnectTriggerObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override;
+ TSignalConnectionPtr ConnectTargetObjectSet(
+ const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectEventSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override;
+
+ TSignalConnectionPtr ConnectHandlerArgumentAdded(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override;
+ TSignalConnectionPtr ConnectHandlerArgumentRemoved(
+ const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &,
+ HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override;
+ TSignalConnectionPtr ConnectHandlerArgumentValueSet(
+ const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback) override;
+
+private:
+ void InitSignaller();
+ IActionCoreSignalProvider *GetSignalProvider();
+ IActionCoreSignalSender *GetSignalSender();
+};
+}
+
+#endif
diff --git a/src/dm/systems/cores/AnimationCoreProducer.cpp b/src/dm/systems/cores/AnimationCoreProducer.cpp
new file mode 100644
index 0000000..14d1824
--- /dev/null
+++ b/src/dm/systems/cores/AnimationCoreProducer.cpp
@@ -0,0 +1,488 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "AnimationCoreProducer.h"
+#include "HandleSystemTransactions.h"
+#include "VectorTransactions.h"
+#include "SignalsImpl.h"
+#ifdef _WIN32
+#pragma warning(disable : 4512) // assignment operator not generated
+#endif
+
+using namespace std;
+
+namespace qt3dsdm {
+
+struct SArtistEditedUndoRedoScope
+{
+ TSimpleAnimationCorePtr m_AnimationCore;
+ Qt3DSDMAnimationHandle m_Animation;
+ TTransactionConsumerPtr m_Consumer;
+ bool m_ArtistEdited;
+ SArtistEditedUndoRedoScope(TSimpleAnimationCorePtr inAnimCore, Qt3DSDMAnimationHandle inAnim,
+ TTransactionConsumerPtr inConsumer)
+ : m_AnimationCore(inAnimCore)
+ , m_Animation(inAnim)
+ , m_Consumer(inConsumer)
+ , m_ArtistEdited(inAnimCore->IsArtistEdited(inAnim))
+ {
+ }
+ ~SArtistEditedUndoRedoScope()
+ {
+ bool edited = m_AnimationCore->IsArtistEdited(m_Animation);
+ if (m_Consumer && edited != m_ArtistEdited) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSimpleAnimationCore::SetIsArtistEdited, m_AnimationCore, m_Animation,
+ edited),
+ std::bind(&CSimpleAnimationCore::SetIsArtistEdited, m_AnimationCore, m_Animation,
+ m_ArtistEdited))));
+ }
+ }
+};
+
+struct SLookupCacheDoUndoOp : public ITransaction
+{
+ std::shared_ptr<SAnimationTrack> m_Animation;
+ TSimpleAnimationCorePtr m_AnimationCore;
+ bool m_AddOnDo;
+ SLookupCacheDoUndoOp(const char *inFile, int inLine, Qt3DSDMAnimationHandle inAnimHandle,
+ TSimpleAnimationCorePtr inCore, bool addOnDo)
+ : ITransaction(inFile, inLine)
+ , m_AnimationCore(inCore)
+ , m_AddOnDo(addOnDo)
+ {
+ THandleObjectMap::const_iterator theIter(inCore->m_Objects.find(inAnimHandle));
+ if (theIter != inCore->m_Objects.end())
+ m_Animation = static_pointer_cast<SAnimationTrack>(theIter->second);
+ }
+ void Remove()
+ {
+ if (m_Animation)
+ m_AnimationCore->RemoveAnimationFromLookupCache(m_Animation);
+ }
+ void Add()
+ {
+ if (m_Animation)
+ m_AnimationCore->AddAnimationToLookupCache(m_Animation);
+ }
+ void Do() override
+ {
+ if (m_AddOnDo)
+ Add();
+ else
+ Remove();
+ }
+ void Undo() override
+ {
+ if (m_AddOnDo)
+ Remove();
+ else
+ Add();
+ }
+};
+
+Qt3DSDMAnimationHandle
+CAnimationCoreProducer::CreateAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType, bool inFirstKeyframeDynamic)
+{
+ Qt3DSDMAnimationHandle retval = m_Data->CreateAnimation(inSlide, inInstance, inProperty, inIndex,
+ inAnimationType, inFirstKeyframeDynamic);
+
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ if (m_Consumer)
+ m_Consumer->OnTransaction(
+ std::make_shared<SLookupCacheDoUndoOp>(__FILE__, __LINE__, retval, m_Data, true));
+ GetSignalSender()->SendAnimationCreated(retval, inSlide, inInstance, inProperty, inIndex,
+ inAnimationType);
+ return retval;
+}
+
+void CAnimationCoreProducer::DeleteAnimation(Qt3DSDMAnimationHandle inAnimation)
+{
+ // Ensure animation exists
+ SAnimationTrack *theAnimation =
+ CSimpleAnimationCore::GetAnimationNF(inAnimation, m_Data->m_Objects);
+ GetSignalSender()->SendBeforeAnimationDeleted(inAnimation);
+ if (m_Consumer)
+ m_Consumer->OnTransaction(std::make_shared<SLookupCacheDoUndoOp>(
+ __FILE__, __LINE__, inAnimation, m_Data, false));
+ CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inAnimation, m_Data->m_Objects);
+ do_all(theAnimation->m_Keyframes,
+ std::bind(DoCreateHandleDeleteTransaction, __FILE__, __LINE__, m_Consumer,
+ std::placeholders::_1, std::ref(m_Data->m_Objects)));
+ SAnimationInfo theInfo = m_Data->GetAnimationInfo(inAnimation);
+ m_Data->DeleteAnimation(inAnimation);
+ GetSignalSender()->SendAnimationDeleted(inAnimation, theInfo.m_Slide, theInfo.m_Instance,
+ theInfo.m_Property, theInfo.m_Index,
+ theInfo.m_AnimationType);
+}
+
+Qt3DSDMAnimationHandle CAnimationCoreProducer::GetAnimation(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ size_t inIndex) const
+{
+ return m_Data->GetAnimation(inSlide, inInstance, inProperty, inIndex);
+}
+
+SAnimationInfo CAnimationCoreProducer::GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const
+{
+ return m_Data->GetAnimationInfo(inAnimation);
+}
+
+void CAnimationCoreProducer::GetAnimations(TAnimationHandleList &outAnimations) const
+{
+ return m_Data->GetAnimations(outAnimations);
+}
+
+void CAnimationCoreProducer::GetAnimations(TAnimationInfoList &outAnimations,
+ Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMSlideHandle inSlide) const
+{
+ return m_Data->GetAnimations(outAnimations, inMaster, inSlide);
+}
+
+void CAnimationCoreProducer::SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation,
+ bool inValue)
+{
+ SAnimationInfo theInfo(m_Data->GetAnimationInfo(inAnimation));
+ SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer);
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSimpleAnimationCore::SetFirstKeyframeDynamic, m_Data, inAnimation,
+ inValue),
+ std::bind(&CSimpleAnimationCore::SetFirstKeyframeDynamic, m_Data, inAnimation,
+ theInfo.m_DynamicFirstKeyframe))));
+ }
+ m_Data->SetFirstKeyframeDynamic(inAnimation, inValue);
+ GetSignalSender()->SendFirstKeyframeDynamicSet(inAnimation, inValue);
+}
+
+inline void DirtyKeyframes(Qt3DSDMAnimationHandle inAnimation, THandleObjectMap &inObjects)
+{
+ SAnimationTrack *theAnimation = CSimpleAnimationCore::GetAnimationNF(inAnimation, inObjects);
+ theAnimation->m_KeyframesDirty = true;
+}
+
+inline void CreateDirtyKeyframesTransaction(TTransactionConsumerPtr inConsumer,
+ Qt3DSDMAnimationHandle inAnimation,
+ THandleObjectMap &inObjects)
+{
+ if (inConsumer) {
+ inConsumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(DirtyKeyframes, inAnimation, std::ref(inObjects)),
+ std::bind(DirtyKeyframes, inAnimation, std::ref(inObjects)))));
+ }
+}
+
+Qt3DSDMKeyframeHandle CAnimationCoreProducer::InsertKeyframe(Qt3DSDMAnimationHandle inAnimation,
+ const TKeyframe &inKeyframe)
+{
+ SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer);
+ Qt3DSDMKeyframeHandle retval = m_Data->InsertKeyframe(inAnimation, inKeyframe);
+ SAnimationTrack *theAnimation =
+ CSimpleAnimationCore::GetAnimationNF(inAnimation, m_Data->m_Objects);
+ CreateVecInsertTransaction<Qt3DSDMKeyframeHandle>(__FILE__, __LINE__, m_Consumer, retval,
+ theAnimation->m_Keyframes);
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ CreateDirtyKeyframesTransaction(m_Consumer, inAnimation, m_Data->m_Objects);
+ GetSignalSender()->SendKeyframeInserted(inAnimation, retval, inKeyframe);
+ return retval;
+}
+
+void CAnimationCoreProducer::EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe)
+{
+ SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, m_Data->m_Objects);
+ SArtistEditedUndoRedoScope __editedScope(m_Data, theKeyframe->m_Animation, m_Consumer);
+ GetSignalSender()->SendBeforeKeyframeErased(inKeyframe);
+ SAnimationTrack *theAnimation =
+ CSimpleAnimationCore::GetAnimationNF(theKeyframe->m_Animation, m_Data->m_Objects);
+ if (exists(theAnimation->m_Keyframes, std::bind(equal_to<int>(), inKeyframe,
+ std::placeholders::_1))) {
+ CreateVecEraseTransaction<Qt3DSDMKeyframeHandle>(__FILE__, __LINE__, m_Consumer, inKeyframe,
+ theAnimation->m_Keyframes);
+ CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inKeyframe, m_Data->m_Objects);
+ CreateDirtyKeyframesTransaction(m_Consumer, theKeyframe->m_Animation, m_Data->m_Objects);
+ }
+ int theKeyframeHandle = theKeyframe->m_Handle;
+ TKeyframe theData = theKeyframe->m_Keyframe;
+ m_Data->EraseKeyframe(inKeyframe);
+ GetSignalSender()->SendKeyframeErased(theAnimation->m_Handle, theKeyframeHandle, theData);
+}
+
+template <typename TDataType>
+struct VectorSwapTransaction : public ITransaction
+{
+ vector<TDataType> m_Data;
+ vector<TDataType> &m_Target;
+ VectorSwapTransaction(const char *inFile, int inLine, vector<TDataType> &inTarget)
+ : ITransaction(inFile, inLine)
+ , m_Data(inTarget)
+ , m_Target(inTarget)
+ {
+ }
+ void Do() override { std::swap(m_Data, m_Target); }
+ void Undo() override { Do(); }
+};
+
+void CAnimationCoreProducer::DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation)
+{
+ // Ensure animation exists
+ SAnimationTrack *theAnimation =
+ CSimpleAnimationCore::GetAnimationNF(inAnimation, m_Data->m_Objects);
+ SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer);
+ GetSignalSender()->SendBeforeAllKeyframesErased(inAnimation);
+ do_all(theAnimation->m_Keyframes,
+ std::bind(DoCreateHandleDeleteTransaction, __FILE__, __LINE__, m_Consumer,
+ std::placeholders::_1, std::ref(m_Data->m_Objects)));
+ if (m_Consumer)
+ m_Consumer->OnTransaction(std::make_shared<VectorSwapTransaction<Qt3DSDMKeyframeHandle>>(
+ __FILE__, __LINE__, std::ref(theAnimation->m_Keyframes)));
+ theAnimation->m_Keyframes.clear();
+}
+
+Qt3DSDMAnimationHandle
+CAnimationCoreProducer::GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const
+{
+ return m_Data->GetAnimationForKeyframe(inKeyframe);
+}
+
+struct KeyframeDataTransaction : public ITransaction, public IMergeableTransaction<TKeyframe>
+{
+ TSimpleAnimationCorePtr m_AnimationCore;
+ Qt3DSDMKeyframeHandle m_Keyframe;
+ TKeyframe m_OldData;
+ TKeyframe m_NewData;
+
+ KeyframeDataTransaction(const char *inFile, int inLine, TSimpleAnimationCorePtr animCore,
+ Qt3DSDMKeyframeHandle keyframe, TKeyframe oldData, TKeyframe newData)
+ : ITransaction(inFile, inLine)
+ , m_AnimationCore(animCore)
+ , m_Keyframe(keyframe)
+ , m_OldData(oldData)
+ , m_NewData(newData)
+ {
+ }
+
+ void Do() override { m_AnimationCore->DoSetKeyframeData(m_Keyframe, m_NewData); }
+ void Undo() override { m_AnimationCore->DoSetKeyframeData(m_Keyframe, m_OldData); }
+
+ void Update(const TKeyframe &inKeyframe) override { m_NewData = inKeyframe; }
+};
+
+void CAnimationCoreProducer::SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe,
+ const TKeyframe &inData)
+{
+ SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, m_Data->m_Objects);
+ SArtistEditedUndoRedoScope __editedScope(m_Data, theKeyframe->m_Animation, m_Consumer);
+ TKeyframe theNewData(inData);
+ TKeyframe theOldData = theKeyframe->m_Keyframe;
+ m_Data->SetKeyframeData(inKeyframe, inData);
+ TKeyframeDataMergeMap::iterator iter(m_KeyframeMergeMap.find(inKeyframe));
+ if (iter != m_KeyframeMergeMap.end())
+ iter->second->Update(theNewData);
+ else {
+ if (m_Consumer) {
+ std::shared_ptr<KeyframeDataTransaction> theKeyframeTransaction(
+ std::make_shared<KeyframeDataTransaction>(__FILE__, __LINE__, m_Data, inKeyframe,
+ theOldData, theNewData));
+ m_Consumer->OnTransaction(static_pointer_cast<ITransaction>(theKeyframeTransaction));
+ m_KeyframeMergeMap.insert(make_pair(
+ inKeyframe,
+ static_pointer_cast<IMergeableTransaction<TKeyframe>>(theKeyframeTransaction)));
+ }
+ GetSignalSender()->SendKeyframeUpdated(inKeyframe, inData);
+ }
+}
+
+TKeyframe CAnimationCoreProducer::GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const
+{
+ return m_Data->GetKeyframeData(inKeyframe);
+}
+
+void CAnimationCoreProducer::GetKeyframes(Qt3DSDMAnimationHandle inAnimation,
+ TKeyframeHandleList &outKeyframes) const
+{
+ return m_Data->GetKeyframes(inAnimation, outKeyframes);
+}
+
+size_t CAnimationCoreProducer::GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const
+{
+ return m_Data->GetKeyframeCount(inAnimation);
+}
+
+void CAnimationCoreProducer::OffsetAnimations(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ long inMillisecondOffset)
+{
+ float theOffsetSeconds = static_cast<float>(inMillisecondOffset) / 1000.f;
+ for (THandleObjectMap::const_iterator iter = m_Data->m_Objects.begin(),
+ end = m_Data->m_Objects.end();
+ iter != end; ++iter) {
+ SAnimationTrack *theTrack = static_cast<SAnimationTrack *>(iter->second.get());
+ if (theTrack->m_Slide == inSlide && theTrack->m_Instance == inInstance) {
+ for (size_t keyframeIdx = 0, keyframeEnd = theTrack->m_Keyframes.size();
+ keyframeIdx < keyframeEnd; ++keyframeIdx) {
+ Qt3DSDMKeyframeHandle theKeyframeHandle(theTrack->m_Keyframes[keyframeIdx]);
+ TKeyframe theCurrentKeyframe = m_Data->GetKeyframeData(theKeyframeHandle);
+
+ float seconds = qt3dsdm::GetKeyframeSeconds(theCurrentKeyframe);
+
+ theCurrentKeyframe =
+ qt3dsdm::SetKeyframeSeconds(theCurrentKeyframe, seconds + theOffsetSeconds);
+
+ SetKeyframeData(theKeyframeHandle, theCurrentKeyframe);
+ }
+ }
+ }
+}
+
+void CAnimationCoreProducer::SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited)
+{
+ SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer);
+ m_Data->SetIsArtistEdited(inAnimation, inEdited);
+}
+
+bool CAnimationCoreProducer::IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const
+{
+ return m_Data->IsArtistEdited(inAnimation);
+}
+// Animation Evaluation.
+float CAnimationCoreProducer::EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation,
+ float inSeconds) const
+{
+ return m_Data->EvaluateAnimation(inAnimation, inSeconds);
+}
+
+bool CAnimationCoreProducer::KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const
+{
+ return m_Data->KeyframeValid(inKeyframe);
+}
+
+bool CAnimationCoreProducer::AnimationValid(Qt3DSDMAnimationHandle inAnimation) const
+{
+ return m_Data->AnimationValid(inAnimation);
+}
+
+void CAnimationCoreProducer::CopyAnimations(Qt3DSDMSlideHandle inSourceSlide,
+ Qt3DSDMInstanceHandle inSourceInstance,
+ Qt3DSDMSlideHandle inDestSlide,
+ Qt3DSDMInstanceHandle inDestInstance)
+{
+ std::vector<SAnimationTrack *> theAnimations;
+ for (THandleObjectMap::const_iterator iter = m_Data->m_Objects.begin(),
+ end = m_Data->m_Objects.end();
+ iter != end; ++iter) {
+ SAnimationTrack *theTrack = static_cast<SAnimationTrack *>(iter->second.get());
+ if (theTrack->m_Instance == inSourceInstance && theTrack->m_Slide == inSourceSlide)
+ theAnimations.push_back(theTrack);
+ }
+ for (size_t idx = 0, end = theAnimations.size(); idx < end; ++idx) {
+ const SAnimationTrack &newTrack(*theAnimations[idx]);
+ Qt3DSDMAnimationHandle theNewAnimation(
+ CreateAnimation(inDestSlide, inDestInstance, newTrack.m_Property, newTrack.m_Index,
+ newTrack.m_AnimationType, newTrack.m_FirstKeyframeDynamic));
+ for (size_t keyIdx = 0, keyEnd = newTrack.m_Keyframes.size(); keyIdx < keyEnd; ++keyIdx)
+ InsertKeyframe(theNewAnimation, GetKeyframeData(newTrack.m_Keyframes[keyIdx]));
+ }
+}
+
+// ITransactionProducer implementation
+void CAnimationCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ m_Consumer = inConsumer;
+ m_KeyframeMergeMap.clear();
+}
+
+TSignalConnectionPtr CAnimationCoreProducer::ConnectAnimationCreated(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback)
+{
+ return GetSignalProvider()->ConnectAnimationCreated(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectBeforeAnimationDeleted(
+ const std::function<void(Qt3DSDMAnimationHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectBeforeAnimationDeleted(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectAnimationDeleted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback)
+{
+ return GetSignalProvider()->ConnectAnimationDeleted(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectKeyframeInserted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback)
+{
+ return GetSignalProvider()->ConnectKeyframeInserted(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectBeforeKeyframeErased(
+ const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectBeforeKeyframeErased(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectKeyframeErased(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback)
+{
+ return GetSignalProvider()->ConnectKeyframeErased(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectBeforeAllKeyframesErased(
+ const std::function<void(Qt3DSDMAnimationHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectBeforeAllKeyframesErased(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectKeyframeUpdated(
+ const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectKeyframeUpdated(inCallback);
+}
+TSignalConnectionPtr CAnimationCoreProducer::ConnectFirstKeyframeDynamicSet(
+ const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback)
+{
+ return GetSignalProvider()->ConnectFirstKeyframeDynamicSet(inCallback);
+}
+
+void CAnimationCoreProducer::InitSignaller()
+{
+ m_Signaller = CreateAnimationCoreSignaller();
+}
+
+IAnimationCoreSignalProvider *CAnimationCoreProducer::GetSignalProvider()
+{
+ return dynamic_cast<IAnimationCoreSignalProvider *>(m_Signaller.get());
+}
+
+IAnimationCoreSignalSender *CAnimationCoreProducer::GetSignalSender()
+{
+ return dynamic_cast<IAnimationCoreSignalSender *>(m_Signaller.get());
+}
+}
diff --git a/src/dm/systems/cores/AnimationCoreProducer.h b/src/dm/systems/cores/AnimationCoreProducer.h
new file mode 100644
index 0000000..17603d6
--- /dev/null
+++ b/src/dm/systems/cores/AnimationCoreProducer.h
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef ANIMATIONCOREPRODUCERH
+#define ANIMATIONCOREPRODUCERH
+#include "SimpleAnimationCore.h"
+#include "Qt3DSDMTransactions.h"
+#include "Qt3DSDMSignals.h"
+
+namespace qt3dsdm {
+class CAnimationCoreProducer : public IAnimationCore,
+ public ITransactionProducer,
+ public IAnimationCoreSignalProvider
+{
+ Q_DISABLE_COPY(CAnimationCoreProducer)
+
+ typedef std::shared_ptr<IMergeableTransaction<TKeyframe>> TKeyframeDataMergeMapEntry;
+ typedef std::unordered_map<int, TKeyframeDataMergeMapEntry> TKeyframeDataMergeMap;
+
+ TSimpleAnimationCorePtr m_Data;
+ TTransactionConsumerPtr m_Consumer;
+ TSignalItemPtr m_Signaller;
+ TKeyframeDataMergeMap m_KeyframeMergeMap;
+
+public:
+ CAnimationCoreProducer()
+ : m_Data(new CSimpleAnimationCore())
+ {
+ InitSignaller();
+ }
+ CAnimationCoreProducer(TStringTablePtr strTable)
+ : m_Data(new CSimpleAnimationCore(strTable))
+ {
+ InitSignaller();
+ }
+
+ TSimpleAnimationCorePtr GetTransactionlessAnimationCore() const { return m_Data; }
+
+ // IAnimationManger implementation
+
+ Qt3DSDMAnimationHandle CreateAnimation(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType,
+ bool inFirstKeyframeDynamic) override;
+ void DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) override;
+ Qt3DSDMAnimationHandle GetAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex) const override;
+ SAnimationInfo GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const override;
+ void GetAnimations(TAnimationHandleList &outAnimations) const override;
+ void GetAnimations(TAnimationInfoList &outAnimations, Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMSlideHandle inSlide) const override;
+ void GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ TAnimationHandleList &outAnimations) override
+ {
+ m_Data->GetSpecificInstanceAnimations(inSlide, inInstance, outAnimations);
+ }
+
+ void SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue) override;
+
+ Qt3DSDMKeyframeHandle InsertKeyframe(Qt3DSDMAnimationHandle inAnimation,
+ const TKeyframe &inKeyframe) override;
+ void EraseKeyframe(Qt3DSDMKeyframeHandle) override;
+ void DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) override;
+ Qt3DSDMAnimationHandle GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override;
+ TKeyframe GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const override;
+ void SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override;
+ void GetKeyframes(Qt3DSDMAnimationHandle inAnimation, TKeyframeHandleList &outKeyframes) const override;
+ size_t GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const override;
+ bool IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override
+ {
+ return m_Data->IsFirstKeyframe(inKeyframe);
+ }
+ void OffsetAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ long inMillisecondOffset) override;
+
+ void SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited = true) override;
+ bool IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const override;
+
+ // Animation Evaluation.
+ float EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, float inSeconds) const override;
+
+ bool KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const override;
+ bool AnimationValid(Qt3DSDMAnimationHandle inAnimation) const override;
+
+ void CopyAnimations(Qt3DSDMSlideHandle inSourceSlide, Qt3DSDMInstanceHandle inSourceInstance,
+ Qt3DSDMSlideHandle inDestSlide, Qt3DSDMInstanceHandle inDestInstance) override;
+
+ // ITransactionProducer implementation
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+
+ TSignalConnectionPtr ConnectAnimationCreated(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectBeforeAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectAnimationDeleted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override;
+ TSignalConnectionPtr ConnectKeyframeInserted(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectBeforeKeyframeErased(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectKeyframeErased(
+ const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)>
+ &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectBeforeAllKeyframesErased(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectKeyframeUpdated(
+ const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback) override;
+ TSignalConnectionPtr ConnectFirstKeyframeDynamicSet(
+ const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) override;
+
+private:
+ void InitSignaller();
+ IAnimationCoreSignalProvider *GetSignalProvider();
+ IAnimationCoreSignalSender *GetSignalSender();
+};
+}
+
+#endif
diff --git a/src/dm/systems/cores/DataCoreProducer.cpp b/src/dm/systems/cores/DataCoreProducer.cpp
new file mode 100644
index 0000000..5c3cc92
--- /dev/null
+++ b/src/dm/systems/cores/DataCoreProducer.cpp
@@ -0,0 +1,457 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "DataCoreProducer.h"
+#include "HandleSystemTransactions.h"
+#include "VectorTransactions.h"
+#include "SignalsImpl.h"
+#ifdef _WIN32
+#pragma warning(disable : 4503) // decorated name length exceeded
+#endif
+namespace qt3dsdm {
+
+Qt3DSDMInstanceHandle CDataCoreProducer::CreateInstance(Qt3DSDMInstanceHandle inTargetId)
+{
+ Qt3DSDMInstanceHandle retval = m_Data->CreateInstance(inTargetId);
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ GetDataCoreSender()->SignalInstanceCreated(retval);
+ return retval;
+}
+
+inline tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition>
+TransformProperty(Qt3DSDMPropertyHandle inProperty, CSimpleDataCore &inData)
+{
+ return make_tuple(inProperty, inData.GetProperty(inProperty));
+}
+
+inline void SignalPropertyRemoved(Qt3DSDMInstanceHandle inInstance,
+ tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition> inData,
+ IDataCoreSignalSender *inSender)
+{
+ inSender->SignalPropertyRemoved(inInstance, get<0>(inData), get<1>(inData).m_Name.wide_str(),
+ get<1>(inData).m_Type);
+}
+
+void CDataCoreProducer::DeleteInstance(Qt3DSDMInstanceHandle inInstance)
+{
+ TIntList theProperties;
+ TIntList theInstances;
+
+ GetDataCoreSender()->SignalBeforeInstanceDeleted(inInstance);
+ // Ensure the instance exists
+ m_Data->GetInstanceNF(inInstance, m_Data->m_Objects);
+ do_all(m_Data->m_Objects,
+ std::bind(CSimpleDataCore::FindRelatedItemsForDelete, inInstance.GetHandleValue(),
+ std::ref(theProperties), std::ref(theInstances), std::placeholders::_1));
+
+ if (m_Consumer) {
+ CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inInstance, m_Data->m_Objects);
+ do_all(theProperties, std::bind(HandleDeleteTransaction, __FILE__, __LINE__,
+ std::placeholders::_1,
+ std::ref(m_Data->m_Objects), m_Consumer));
+ }
+
+ vector<tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition>> theDefinitionList;
+ theDefinitionList.resize(theProperties.size());
+
+ function<tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition>(Qt3DSDMPropertyHandle)>
+ thePropertyTransform(bind(TransformProperty, std::placeholders::_1, ref(*m_Data)));
+ transform(theProperties.begin(), theProperties.end(), theDefinitionList.begin(),
+ thePropertyTransform);
+
+ GetDataCoreSender()->SignalInstanceDeleted(inInstance);
+
+ m_Data->DeleteInstance(inInstance);
+ // Signal that these theProperties are no longer with us.
+ do_all(theDefinitionList, bind(SignalPropertyRemoved, inInstance,
+ std::placeholders::_1, GetDataCoreSender()));
+}
+
+bool CDataCoreProducer::IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const
+{
+ return m_Data->IsInstanceOrDerivedFrom(inInstance, inParent);
+}
+
+void CDataCoreProducer::GetInstances(TInstanceHandleList &outInstances) const
+{
+ m_Data->GetInstances(outInstances);
+}
+void CDataCoreProducer::GetInstancesDerivedFrom(TInstanceHandleList &outInstances,
+ Qt3DSDMInstanceHandle inParentHandle) const
+{
+ m_Data->GetInstancesDerivedFrom(outInstances, inParentHandle);
+}
+
+struct ClearInstanceParentCacheTransaction : public ITransaction
+{
+ const CDataModelInstance &m_Instance;
+ ClearInstanceParentCacheTransaction(const char *inFile, int inLine,
+ const CDataModelInstance &inst)
+ : ITransaction(inFile, inLine)
+ , m_Instance(inst)
+ {
+ }
+ void Do() override { m_Instance.ClearParentCache(); }
+ void Undo() override { m_Instance.ClearParentCache(); }
+};
+
+void CDataCoreProducer::DeriveInstance(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent)
+{
+ m_Data->DeriveInstance(inInstance, inParent);
+ TDataModelInstancePtr theInstance =
+ CSimpleDataCore::GetInstanceNF(inInstance, m_Data->m_Objects);
+ if (m_Consumer) {
+ CreateHashMapInsertTransaction(
+ __FILE__, __LINE__, m_Consumer,
+ make_pair(inParent.GetHandleValue(),
+ CSimpleDataCore::GetInstanceNF(inParent, m_Data->m_Objects)),
+ theInstance->m_Parents);
+ m_Consumer->OnTransaction(std::static_pointer_cast<ITransaction>(
+ std::make_shared<ClearInstanceParentCacheTransaction>(__FILE__, __LINE__,
+ *theInstance)));
+ }
+ GetDataCoreSender()->SignalInstanceDerived(inInstance, inParent);
+}
+
+void CDataCoreProducer::GetInstanceParents(Qt3DSDMInstanceHandle inHandle,
+ TInstanceHandleList &outParents) const
+{
+ m_Data->GetInstanceParents(inHandle, outParents);
+}
+
+Qt3DSDMPropertyHandle CDataCoreProducer::AddProperty(Qt3DSDMInstanceHandle inInstance,
+ TCharPtr inName, DataModelDataType::Value inPropType)
+{
+ Qt3DSDMPropertyHandle retval = m_Data->AddProperty(inInstance, inName, inPropType);
+ TDataModelInstancePtr theInstance =
+ CSimpleDataCore::GetInstanceNF(inInstance, m_Data->m_Objects);
+ CreateVecInsertTransaction<int>(__FILE__, __LINE__, m_Consumer, retval,
+ theInstance->m_Properties);
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ GetDataCoreSender()->SignalPropertyAdded(inInstance, retval, inName, inPropType);
+ return retval;
+}
+
+void CDataCoreProducer::GetInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const
+{
+ m_Data->GetInstanceProperties(inInstance, outProperties);
+}
+
+const Qt3DSDMPropertyDefinition &
+CDataCoreProducer::GetProperty(Qt3DSDMPropertyHandle inProperty) const
+{
+ return m_Data->GetProperty(inProperty);
+}
+
+void CDataCoreProducer::RemoveProperty(Qt3DSDMPropertyHandle inProperty)
+{
+ Qt3DSDMPropertyDefinition theDef = GetProperty(inProperty);
+ TDataModelInstancePtr theInstance =
+ CSimpleDataCore::GetInstanceNF(theDef.m_Instance, m_Data->m_Objects);
+ if (find_if<TIntList::iterator>(theInstance->m_Properties,
+ std::bind(equal_to<int>(), inProperty, std::placeholders::_1))
+ != theInstance->m_Properties.end()) {
+ CreateVecEraseTransaction<int>(__FILE__, __LINE__, m_Consumer, inProperty,
+ theInstance->m_Properties);
+ CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inProperty, m_Data->m_Objects);
+ GetDataCoreSender()->SignalPropertyRemoved(theDef.m_Instance, inProperty,
+ theDef.m_Name.wide_str(), theDef.m_Type);
+ m_Data->RemoveProperty(inProperty);
+ } else {
+ throw PropertyNotFound(L"");
+ }
+}
+
+inline void AddCopyInstancePropertyTransaction(int inProperty, const TIntList &inOriginalList,
+ CDataModelInstance &inInstance,
+ TTransactionConsumerPtr &inConsumer)
+{
+ // if this property was never in the original list
+ if (find_if<TIntList::const_iterator>(inOriginalList,
+ std::bind(equal_to<int>(), inProperty,
+ std::placeholders::_1))
+ == inOriginalList.end())
+ CreateVecInsertTransaction<int>(__FILE__, __LINE__, inConsumer,
+ Qt3DSDMPropertyHandle(inProperty), inInstance.m_Properties);
+}
+
+inline void AddCopyInstanceValuePropertyTransaction(const TPropertyPair &inProperty,
+ const TPropertyPairHash &inOriginalList,
+ CDataModelInstance &inInstance,
+ TTransactionConsumerPtr &inConsumer)
+{
+ // if this property was never in the original list
+ if (inOriginalList.end() == inOriginalList.find(inProperty.first))
+ CreateHashMapInsertTransaction(__FILE__, __LINE__, inConsumer, inProperty,
+ inInstance.m_PropertyValues);
+}
+
+struct InstancePropertyValuesTransaction : public ITransaction
+{
+ CDataModelInstance &m_Instance;
+ TIntList m_OldProperties;
+ TPropertyPairList m_OldValues;
+ TIntList m_NewProperties;
+ TPropertyPairList m_NewValues;
+
+ InstancePropertyValuesTransaction(const char *inFile, int inLine,
+ CDataModelInstance &inInstance)
+ : ITransaction(inFile, inLine)
+ , m_Instance(inInstance)
+ , m_OldProperties(inInstance.m_Properties)
+ {
+ inInstance.ToPropertyPairList(m_OldValues);
+ }
+
+ void SetNew()
+ {
+ m_NewProperties = m_Instance.m_Properties;
+ m_Instance.ToPropertyPairList(m_NewValues);
+ }
+
+ void Do() override
+ {
+ m_Instance.m_Properties = m_NewProperties;
+ m_Instance.FromPropertyPairList(m_NewValues);
+ }
+
+ void Undo() override
+ {
+ m_Instance.m_Properties = m_OldProperties;
+ m_Instance.FromPropertyPairList(m_OldValues);
+ }
+};
+
+void CDataCoreProducer::CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance,
+ Qt3DSDMInstanceHandle inDestInstance)
+{
+ TDataModelInstancePtr theInstance =
+ CSimpleDataCore::GetInstanceNF(inDestInstance, m_Data->m_Objects);
+ if (m_Consumer) {
+ // Create the transaction object setting its 'old values' property to the current instance
+ // property values.
+ std::shared_ptr<InstancePropertyValuesTransaction> theTransaction(
+ std::make_shared<InstancePropertyValuesTransaction>(__FILE__, __LINE__,
+ ref(*theInstance)));
+
+ // Change the current instance property values
+ m_Data->CopyInstanceProperties(inSrcInstance, inDestInstance);
+
+ // Ask the transaction to copy the new values into it's new values datastructure.
+ theTransaction->SetNew();
+
+ m_Consumer->OnTransaction(std::static_pointer_cast<ITransaction>(theTransaction));
+ } else {
+ m_Data->CopyInstanceProperties(inSrcInstance, inDestInstance);
+ }
+}
+
+Qt3DSDMPropertyHandle
+CDataCoreProducer::GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const
+{
+ return m_Data->GetAggregateInstancePropertyByName(inInstance, inStr);
+}
+
+void CDataCoreProducer::GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const
+{
+ m_Data->GetAggregateInstanceProperties(inInstance, outProperties);
+}
+
+void CDataCoreProducer::GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle,
+ TPropertyHandleValuePairList &outValues)
+{
+ m_Data->GetSpecificInstancePropertyValues(inHandle, outValues);
+}
+
+bool CDataCoreProducer::HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ return m_Data->HasAggregateInstanceProperty(inInstance, inProperty);
+}
+
+void CDataCoreProducer::CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) const
+{
+ return m_Data->CheckValue(inInstance, inProperty, inValue);
+}
+
+bool CDataCoreProducer::GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ return m_Data->GetInstancePropertyValue(inHandle, inProperty, outValue);
+}
+
+inline void EraseProperty(TPropertyPairHash &inProperties, int inProperty)
+{
+ inProperties.erase(
+ find_if(inProperties.begin(), inProperties.end(),
+ std::bind(CSimpleDataCore::InstancePropertyMatches, inProperty,
+ std::placeholders::_1)));
+}
+
+void CDataCoreProducer::SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ // Two possible courses of actions. The property exists, in which case
+ // we need to get its old value.
+ // If it doesn't exist, then we need to erase for undo.
+ TPropertyValuePair theOldValue(PropertyValueFlags(PropertyValueFlags::SetViaAutoPropagate),
+ SInternValue(0.0f, GetStringTable()));
+ TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inHandle, m_Data->m_Objects);
+ TPropertyPairHash::iterator theItem =
+ theInstance->m_PropertyValues.find(inProperty.GetHandleValue());
+ bool foundProp = theItem != theInstance->m_PropertyValues.end();
+ if (foundProp)
+ theOldValue = theItem->second;
+ m_Data->SetInstancePropertyValue(inHandle, inProperty, inValue);
+ TPropertyValuePair theNewValue =
+ theInstance->m_PropertyValues.find(inProperty.GetHandleValue())->second;
+ if (m_Consumer) {
+ // Check if we already have the entry
+ TSlideInstancePropertyPair theKey(inHandle, inProperty);
+ TPropertyMergeMap::iterator iter = m_PropertyMergeMap.find(theKey);
+ // Then we merge the values in to the original event where they
+ // first happened.
+ if (iter != m_PropertyMergeMap.end()) {
+ iter->second->Update(theNewValue);
+ return; // don't send the signal if we just updated value
+ } else // Else we add a new merge entry.
+ {
+ TPropertyMergeMapEntry theEntry;
+ if (!foundProp)
+ theEntry = CreateHashMapInsertTransaction(
+ __FILE__, __LINE__, m_Consumer,
+ make_pair(inProperty.GetHandleValue(), theNewValue),
+ theInstance->m_PropertyValues);
+ else
+ theEntry = CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer,
+ inProperty.GetHandleValue(), theOldValue,
+ theNewValue, theInstance->m_PropertyValues);
+ m_PropertyMergeMap.insert(std::make_pair(theKey, theEntry));
+ }
+ }
+ GetPropertyCoreSender()->SignalInstancePropertyValue(inHandle, inProperty, inValue);
+}
+
+bool CDataCoreProducer::HandleValid(int inHandle) const
+{
+ return m_Data->HandleValid(inHandle);
+}
+
+void CDataCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ m_Consumer = inConsumer;
+ m_PropertyMergeMap.clear();
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectInstancePropertyValue(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)>
+ &inCallback)
+{
+ return GetPropertyCoreProvider()->ConnectInstancePropertyValue(inCallback);
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectInstanceCreated(
+ const std::function<void(Qt3DSDMInstanceHandle)> &inCallback)
+{
+ return GetDataCoreProvider()->ConnectInstanceCreated(inCallback);
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectInstanceDeleted(
+ const std::function<void(Qt3DSDMInstanceHandle)> &inCallback)
+{
+ return GetDataCoreProvider()->ConnectInstanceDeleted(inCallback);
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectBeforeInstanceDeleted(
+ const std::function<void(Qt3DSDMInstanceHandle)> &inCallback)
+{
+ return GetDataCoreProvider()->ConnectBeforeInstanceDeleted(inCallback);
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectInstanceDerived(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback)
+{
+ return GetDataCoreProvider()->ConnectInstanceDerived(inCallback);
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectInstanceParentRemoved(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback)
+{
+ return GetDataCoreProvider()->ConnectInstanceParentRemoved(inCallback);
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectPropertyAdded(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr,
+ DataModelDataType::Value)> &inCallback)
+{
+ return GetDataCoreProvider()->ConnectPropertyAdded(inCallback);
+}
+
+TSignalConnectionPtr CDataCoreProducer::ConnectPropertyRemoved(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr,
+ DataModelDataType::Value)> &inCallback)
+{
+ return GetDataCoreProvider()->ConnectPropertyRemoved(inCallback);
+}
+
+void CDataCoreProducer::InitSignallers()
+{
+ m_InstancePropertyCoreSignaller = CreatePropertyCoreSignaller();
+ m_DataCoreSignaller = CreateDataCoreSignaller();
+}
+
+IInstancePropertyCoreSignalProvider *CDataCoreProducer::GetPropertyCoreProvider()
+{
+ return dynamic_cast<IInstancePropertyCoreSignalProvider *>(
+ m_InstancePropertyCoreSignaller.get());
+}
+
+IInstancePropertyCoreSignalSender *CDataCoreProducer::GetPropertyCoreSender()
+{
+ return dynamic_cast<IInstancePropertyCoreSignalSender *>(m_InstancePropertyCoreSignaller.get());
+}
+
+IDataCoreSignalProvider *CDataCoreProducer::GetDataCoreProvider()
+{
+ return dynamic_cast<IDataCoreSignalProvider *>(m_DataCoreSignaller.get());
+}
+
+IDataCoreSignalSender *CDataCoreProducer::GetDataCoreSender()
+{
+ return dynamic_cast<IDataCoreSignalSender *>(m_DataCoreSignaller.get());
+}
+}
diff --git a/src/dm/systems/cores/DataCoreProducer.h b/src/dm/systems/cores/DataCoreProducer.h
new file mode 100644
index 0000000..8d89bfa
--- /dev/null
+++ b/src/dm/systems/cores/DataCoreProducer.h
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef DATACOREPRODUCERH
+#define DATACOREPRODUCERH
+
+#include "Qt3DSDMTransactions.h"
+#include "SimpleDataCore.h"
+#include "Qt3DSDMSignals.h"
+#include "SimpleSlideCore.h"
+
+namespace qt3dsdm {
+
+class CDataCoreProducer : public IDataCore,
+ public ITransactionProducer,
+ public IInstancePropertyCoreSignalProvider,
+ public IDataCoreSignalProvider
+{
+ typedef std::shared_ptr<IMergeableTransaction<TPropertyValuePair>> TPropertyMergeMapEntry;
+ typedef std::unordered_map<TSlideInstancePropertyPair, TPropertyMergeMapEntry>
+ TPropertyMergeMap;
+
+ TTransactionConsumerPtr m_Consumer;
+ TSimpleDataCorePtr m_Data;
+ TSignalItemPtr m_InstancePropertyCoreSignaller;
+ TSignalItemPtr m_DataCoreSignaller;
+
+ TPropertyMergeMap m_PropertyMergeMap;
+
+public:
+ CDataCoreProducer(TStringTablePtr inStringTable)
+ : m_Data(new CSimpleDataCore(inStringTable))
+ {
+ InitSignallers();
+ }
+ virtual ~CDataCoreProducer() {}
+
+ IStringTable &GetStringTable() const override { return m_Data->GetStringTable(); }
+ std::shared_ptr<IStringTable> GetStringTablePtr() const override
+ {
+ return m_Data->GetStringTablePtr();
+ }
+
+ // IHandleBase
+ bool HandleValid(int inHandle) const override;
+
+ // IInstancePropertyCore
+ //===============================================================
+ Qt3DSDMPropertyHandle GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const override;
+ void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const override;
+ void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle,
+ TPropertyHandleValuePairList &outValues) override;
+ bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+
+ void CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) const override;
+ bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+ void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+ //===============================================================
+
+ // IDataCore
+ //===============================================================
+ Qt3DSDMInstanceHandle CreateInstance(Qt3DSDMInstanceHandle hdl = Qt3DSDMInstanceHandle()) override;
+ void GetInstances(TInstanceHandleList &outInstances) const override;
+ void GetInstancesDerivedFrom(TInstanceHandleList &outInstances,
+ Qt3DSDMInstanceHandle inParent) const override;
+ void DeleteInstance(Qt3DSDMInstanceHandle inHandle) override;
+
+ void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) override;
+ void GetInstanceParents(Qt3DSDMInstanceHandle inHandle,
+ TInstanceHandleList &outParents) const override;
+ bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const override;
+
+ Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName,
+ DataModelDataType::Value inPropType) override;
+ void GetInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const override;
+ const Qt3DSDMPropertyDefinition &GetProperty(Qt3DSDMPropertyHandle inProperty) const override;
+ void RemoveProperty(Qt3DSDMPropertyHandle inProperty) override;
+ void CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance,
+ Qt3DSDMInstanceHandle inDestInstance) override;
+
+ void RemoveCachedValues(Qt3DSDMInstanceHandle inInstance) override
+ {
+ m_Data->RemoveCachedValues(inInstance);
+ }
+ bool IsInstance(int inHandle) const override { return m_Data->IsInstance(inHandle); }
+ bool IsProperty(int inHandle) const override { return m_Data->IsProperty(inHandle); }
+ //===============================================================
+
+ //===============================================================
+ // Set the current consumer
+ //===============================================================
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+
+ //===============================================================
+ // Return a serializable data model for load/save
+ //===============================================================
+ virtual TSimpleDataCorePtr GetTransactionlessDataCore() { return m_Data; }
+ virtual TSimpleDataCorePtr GetTransactionlessDataCore() const { return m_Data; }
+
+ //===============================================================
+ // Signal provider implementation
+ //===============================================================
+ TSignalConnectionPtr ConnectInstancePropertyValue(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)>
+ &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectBeforeInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectInstanceDerived(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectInstanceParentRemoved(
+ const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectPropertyAdded(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ TCharPtr, DataModelDataType::Value)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectPropertyRemoved(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ TCharPtr, DataModelDataType::Value)> &inCallback) override;
+
+private:
+ CDataCoreProducer(const CDataCoreProducer&) = delete;
+ CDataCoreProducer& operator=(const CDataCoreProducer&) = delete;
+
+ template <typename TTransactionType>
+ inline void RunWithConsumer(TTransactionType inTransaction)
+ {
+ qt3dsdm::RunWithConsumer(m_Consumer, inTransaction);
+ }
+
+ void InitSignallers();
+ IInstancePropertyCoreSignalProvider *GetPropertyCoreProvider();
+ IInstancePropertyCoreSignalSender *GetPropertyCoreSender();
+ IDataCoreSignalProvider *GetDataCoreProvider();
+ IDataCoreSignalSender *GetDataCoreSender();
+};
+}
+
+#endif
diff --git a/src/dm/systems/cores/SimpleActionCore.cpp b/src/dm/systems/cores/SimpleActionCore.cpp
new file mode 100644
index 0000000..b2f3553
--- /dev/null
+++ b/src/dm/systems/cores/SimpleActionCore.cpp
@@ -0,0 +1,240 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "SimpleActionCore.h"
+
+namespace qt3dsdm {
+
+Qt3DSDMActionHandle CSimpleActionCore::CreateAction(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner,
+ SLong4 inTriggerTargetObjects)
+{
+ int nextId = GetNextId();
+ Qt3DSDMActionHandle retval = CreateActionWithHandle(nextId, inInstance, inSlide, inOwner);
+ SetTriggerObject(retval, inTriggerTargetObjects);
+ SetTargetObject(retval, inTriggerTargetObjects);
+ return retval;
+}
+
+void CSimpleActionCore::DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance)
+{
+ SAction *theAction = GetActionNF(inAction, m_Objects);
+ outInstance = theAction->m_ActionInfo.m_Instance;
+ do_all(theAction->m_ActionInfo.m_HandlerArgs,
+ std::bind(EraseHandle, std::placeholders::_1, std::ref(m_Objects)));
+ EraseHandle(inAction, m_Objects);
+}
+
+const SActionInfo &CSimpleActionCore::GetActionInfo(Qt3DSDMActionHandle inAction) const
+{
+ const SAction *theAction = GetActionNF(inAction, m_Objects);
+ return theAction->m_ActionInfo;
+}
+
+inline void AddIfActionMatches(const THandleObjectPair &inPair, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions)
+{
+ if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeAction) {
+ const SAction *theAction = static_cast<SAction *>(inPair.second.get());
+ if ((!inSlide.Valid() || inSlide == theAction->m_ActionInfo.m_Slide)
+ && (!inOwner.Valid() || inOwner == theAction->m_ActionInfo.m_Owner))
+ outActions.push_back(inPair.first);
+ }
+}
+
+// Return all actions that belong to a certain instance in a certain slide
+void CSimpleActionCore::GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const
+{
+ outActions.clear();
+ do_all(m_Objects,
+ std::bind(AddIfActionMatches,
+ std::placeholders::_1, inSlide, inOwner, std::ref(outActions)));
+}
+
+// Return all actions that exist in a certain slide
+void CSimpleActionCore::GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const
+{
+ GetActions(inSlide, 0, outActions);
+}
+
+// Return all actions that belong to a certain instance
+void CSimpleActionCore::GetActions(Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const
+{
+ GetActions(0, inOwner, outActions);
+}
+
+// Return all actions
+void CSimpleActionCore::GetActions(TActionHandleList &outActions) const
+{
+ outActions.clear();
+ outActions.reserve(m_Objects.size());
+ do_all(m_Objects,
+ std::bind(MaybeAddObject<SAction, Qt3DSDMActionHandle>,
+ std::placeholders::_1, std::ref(outActions)));
+}
+
+// Return the instance that was allocated for this action.
+Qt3DSDMInstanceHandle CSimpleActionCore::GetActionInstance(Qt3DSDMActionHandle inAction) const
+{
+ return GetActionNF(inAction, m_Objects)->m_ActionInfo.m_Instance;
+}
+
+inline bool ActionInstanceMatches(const THandleObjectPair &inPair, Qt3DSDMInstanceHandle inInstance)
+{
+ if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeAction) {
+ const SAction *theAction = static_cast<SAction *>(inPair.second.get());
+ if (inInstance == theAction->m_ActionInfo.m_Instance)
+ return true;
+ }
+ return false;
+}
+
+// Reverse lookup into the action system so you can match actions to instances.
+Qt3DSDMActionHandle
+CSimpleActionCore::GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const
+{
+ THandleObjectMap::const_iterator theAction =
+ find_if(m_Objects.begin(), m_Objects.end(),
+ std::bind(ActionInstanceMatches, std::placeholders::_1, inActionInstance));
+ if (theAction != m_Objects.end())
+ return theAction->first;
+ throw ActionNotFound(L"");
+}
+
+// Action Properties
+void CSimpleActionCore::SetTriggerObject(Qt3DSDMActionHandle inAction,
+ const SObjectRefType &inTriggerObject)
+{
+ SAction *theAction = GetActionNF(inAction, m_Objects);
+ theAction->m_ActionInfo.m_TriggerObject = inTriggerObject;
+}
+
+void CSimpleActionCore::SetTargetObject(Qt3DSDMActionHandle inAction,
+ const SObjectRefType &inTargetObject)
+{
+ SAction *theAction = GetActionNF(inAction, m_Objects);
+ theAction->m_ActionInfo.m_TargetObject = inTargetObject;
+}
+
+void CSimpleActionCore::SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventHandle)
+{
+ SAction *theAction = GetActionNF(inAction, m_Objects);
+ theAction->m_ActionInfo.m_Event = inEventHandle;
+}
+
+void CSimpleActionCore::SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle)
+{
+ SAction *theAction = GetActionNF(inAction, m_Objects);
+ theAction->m_ActionInfo.m_Handler = inHandlerHandle;
+}
+
+// Action Argument
+Qt3DSDMHandlerArgHandle CSimpleActionCore::AddHandlerArgument(Qt3DSDMActionHandle inAction,
+ const TCharStr &inName,
+ HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType)
+{
+ int nextId = GetNextId();
+ return AddHandlerArgumentWithHandle(nextId, inAction, inName, inArgType, inValueType);
+}
+
+void CSimpleActionCore::RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument)
+{
+ SHandlerArgument *theHandlerArgument = GetHandlerArgumentNF(inHandlerArgument, m_Objects);
+ SAction *theAction = GetActionNF(theHandlerArgument->m_HandlerArgInfo.m_Action, m_Objects);
+ EraseHandle(inHandlerArgument, m_Objects);
+ erase_if(theAction->m_ActionInfo.m_HandlerArgs,
+ std::bind(equal_to<int>(), std::placeholders::_1, inHandlerArgument.GetHandleValue()));
+}
+
+const SHandlerArgumentInfo &
+CSimpleActionCore::GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const
+{
+ if (HandleValid(inHandlerArgument)) {
+ const SHandlerArgument *theHandlerArgument =
+ GetHandlerArgumentNF(inHandlerArgument, m_Objects);
+ return theHandlerArgument->m_HandlerArgInfo;
+ } else {
+ static SHandlerArgumentInfo dummy;
+ return dummy;
+ }
+}
+
+void CSimpleActionCore::GetHandlerArguments(Qt3DSDMActionHandle inAction,
+ THandlerArgHandleList &outHandlerArguments) const
+{
+ const SAction *theAction = GetActionNF(inAction, m_Objects);
+ outHandlerArguments = theAction->m_ActionInfo.m_HandlerArgs;
+}
+
+// Action Argument Properties
+void CSimpleActionCore::GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ SValue &outValue) const
+{
+ const SHandlerArgument *theHandlerArgument = GetHandlerArgumentNF(inHandlerArgument, m_Objects);
+ outValue = theHandlerArgument->m_HandlerArgInfo.m_Value;
+}
+
+void CSimpleActionCore::SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument,
+ const SValue &inValue)
+{
+ SHandlerArgument *theHandlerArgument = GetHandlerArgumentNF(inHandlerArgument, m_Objects);
+ theHandlerArgument->m_HandlerArgInfo.m_Value = inValue;
+}
+
+// Helper functions
+Qt3DSDMActionHandle CSimpleActionCore::CreateActionWithHandle(int inHandle,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner)
+{
+ if (HandleValid(inHandle))
+ throw HandleExists(L"");
+ m_Objects.insert(make_pair(
+ inHandle, (THandleObjectPtr) new SAction(inHandle, inInstance, inSlide, inOwner)));
+ return inHandle;
+}
+
+Qt3DSDMHandlerArgHandle
+CSimpleActionCore::AddHandlerArgumentWithHandle(int inHandle, Qt3DSDMActionHandle inAction,
+ const TCharStr &inName, HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType)
+{
+ if (HandleValid(inHandle))
+ throw HandleExists(L"");
+ m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SHandlerArgument(
+ inHandle, inAction, inName, inArgType, inValueType)));
+ SAction *theAction = GetActionNF(inAction, m_Objects);
+ theAction->m_ActionInfo.m_HandlerArgs.push_back(inHandle);
+ return inHandle;
+}
+}
diff --git a/src/dm/systems/cores/SimpleActionCore.h b/src/dm/systems/cores/SimpleActionCore.h
new file mode 100644
index 0000000..1e229f1
--- /dev/null
+++ b/src/dm/systems/cores/SimpleActionCore.h
@@ -0,0 +1,165 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef ACTIONCOREH
+#define ACTIONCOREH
+
+#include "Qt3DSDMActionCore.h"
+#include "HandleSystemBase.h"
+#include "Qt3DSDMErrors.h"
+
+namespace qt3dsdm {
+struct SAction : public CHandleObject
+{
+ SActionInfo m_ActionInfo;
+
+ SAction() {}
+
+ SAction(int inHandle, Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner)
+ : CHandleObject(inHandle)
+ , m_ActionInfo(inInstance, inSlide, inOwner)
+ {
+ }
+
+ static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeAction;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+struct SHandlerArgument : public CHandleObject
+{
+ SHandlerArgumentInfo m_HandlerArgInfo;
+
+ SHandlerArgument() {}
+
+ SHandlerArgument(int inHandle, Qt3DSDMActionHandle inAction, const TCharStr &inName,
+ HandlerArgumentType::Value inArgType, DataModelDataType::Value inValueType)
+ : CHandleObject(inHandle)
+ , m_HandlerArgInfo(inAction, inName, inArgType, inValueType)
+ {
+ }
+
+ static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeActionHandlerArgument;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+class CSimpleActionCore : public CHandleBase, public IActionCore
+{
+ mutable TStringTablePtr m_StringTable;
+
+public: // Use
+ CSimpleActionCore(TStringTablePtr strTable)
+ : m_StringTable(strTable)
+ {
+ }
+
+ IStringTable &GetStringTable() const override { return *m_StringTable.get(); }
+ TStringTablePtr GetStringTablePtr() const override { return m_StringTable; }
+ // Action
+ Qt3DSDMActionHandle CreateAction(Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner, SLong4 inTriggerTargetObjects) override;
+ void DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance) override;
+ const SActionInfo &GetActionInfo(Qt3DSDMActionHandle inAction) const override;
+ void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner,
+ TActionHandleList &outActions) const override;
+ void GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const override;
+ void GetActions(Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions) const override;
+ void GetActions(TActionHandleList &outActions) const override;
+
+ // Return the instance that was allocated for this action.
+ Qt3DSDMInstanceHandle GetActionInstance(Qt3DSDMActionHandle inAction) const override;
+ // Reverse lookup into the action system so you can match actions to instances.
+ Qt3DSDMActionHandle GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const override;
+
+ // Action Properties
+ void SetTriggerObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTriggerObject) override;
+ void SetTargetObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTargetObject) override;
+ void SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEvent) override;
+ void SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandler) override;
+
+ // Action Argument
+ Qt3DSDMHandlerArgHandle AddHandlerArgument(Qt3DSDMActionHandle inAction, const TCharStr &inName,
+ HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType) override;
+ void RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) override;
+ const SHandlerArgumentInfo &
+ GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const override;
+ void GetHandlerArguments(Qt3DSDMActionHandle inAction,
+ THandlerArgHandleList &outHandlerArguments) const override;
+
+ // Action Argument Properties
+ void GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, SValue &outValue) const override;
+ void SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, const SValue &inValue) override;
+
+ // CHandleBase
+ bool HandleValid(int inHandle) const override { return CHandleBase::HandleValid(inHandle); }
+
+ // Helper functions
+ Qt3DSDMActionHandle CreateActionWithHandle(int inHandle, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inOwner);
+ Qt3DSDMHandlerArgHandle AddHandlerArgumentWithHandle(int inHandle, Qt3DSDMActionHandle inAction,
+ const TCharStr &inName,
+ HandlerArgumentType::Value inArgType,
+ DataModelDataType::Value inValueType);
+
+ static SAction *GetActionNF(int inHandle, THandleObjectMap &inObjects)
+ {
+ return const_cast<SAction *>(
+ GetActionNF(inHandle, static_cast<const THandleObjectMap &>(inObjects)));
+ }
+
+ static const SAction *GetActionNF(int inHandle, const THandleObjectMap &inObjects)
+ {
+ const SAction *theAction = GetHandleObject<SAction>(inHandle, inObjects);
+ if (theAction)
+ return theAction;
+ throw ActionNotFound(L"");
+ }
+
+ static SHandlerArgument *GetHandlerArgumentNF(int inHandle, THandleObjectMap &inObjects)
+ {
+ return const_cast<SHandlerArgument *>(
+ GetHandlerArgumentNF(inHandle, static_cast<const THandleObjectMap &>(inObjects)));
+ }
+
+ static const SHandlerArgument *GetHandlerArgumentNF(int inHandle,
+ const THandleObjectMap &inObjects)
+ {
+ const SHandlerArgument *theItem = GetHandleObject<SHandlerArgument>(inHandle, inObjects);
+ if (theItem)
+ return theItem;
+ throw HandlerArgumentNotFound(L"");
+ }
+};
+
+typedef std::shared_ptr<CSimpleActionCore> TSimpleActionCorePtr;
+}
+
+#endif
diff --git a/src/dm/systems/cores/SimpleAnimationCore.cpp b/src/dm/systems/cores/SimpleAnimationCore.cpp
new file mode 100644
index 0000000..00d6df4
--- /dev/null
+++ b/src/dm/systems/cores/SimpleAnimationCore.cpp
@@ -0,0 +1,618 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "SimpleAnimationCore.h"
+
+#ifdef _WIN32
+#pragma warning(disable : 4503) // decorated name length exceeded
+#endif
+
+typedef long INT32;
+typedef float FLOAT;
+#define DATALOGGER_CUBICROOT 0
+
+struct SPerfLogEvent
+{
+ SPerfLogEvent(int) {}
+};
+
+typedef SPerfLogEvent TPerfLogMathEvent1;
+
+#include "Qt3DSCubicRoots.h"
+#include "Qt3DSCubicRootsImpl.h"
+#include "Qt3DSBezierEval.h"
+using namespace std;
+
+namespace qt3dsdm {
+
+Qt3DSDMAnimationHandle
+CSimpleAnimationCore::CreateAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType, bool inFirstKeyframeDynamic)
+{
+ if (GetAnimation(inSlide, inInstance, inProperty, inIndex).Valid())
+ throw AnimationExists(L"");
+
+ int nextId = GetNextId();
+ Qt3DSDMAnimationHandle retval = CreateAnimationWithHandle(
+ nextId, inSlide, inInstance, inProperty, inIndex, inAnimationType, inFirstKeyframeDynamic);
+ AddAnimationToLookupCache(retval);
+ return retval;
+}
+
+void CSimpleAnimationCore::DeleteAnimation(Qt3DSDMAnimationHandle inAnimation)
+{
+ RemoveAnimationFromLookupCache(inAnimation);
+ SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ do_all(theItem->m_Keyframes, std::bind(EraseHandle,
+ std::placeholders::_1, std::ref(m_Objects)));
+ EraseHandle(inAnimation, m_Objects);
+}
+
+void CSimpleAnimationCore::EnsureAnimationCache() const
+{
+ if (m_AnimationMatchesCache.size() == 0) {
+ for (THandleObjectMap::const_iterator theIter = m_Objects.begin(), theEnd = m_Objects.end();
+ theIter != theEnd; ++theIter) {
+ if (theIter->second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack)
+ AddAnimationToLookupCache(static_pointer_cast<SAnimationTrack>(theIter->second));
+ }
+ }
+}
+
+Qt3DSDMAnimationHandle CSimpleAnimationCore::GetAnimation(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ size_t inIndex) const
+{
+ EnsureAnimationCache();
+
+ pair<TStateInstanceAnimationMap::const_iterator, TStateInstanceAnimationMap::const_iterator>
+ theRange(m_AnimationMatchesCache.equal_range(
+ make_pair(inSlide.GetHandleValue(), inInstance.GetHandleValue())));
+ for (TStateInstanceAnimationMap::const_iterator theIter = theRange.first;
+ theIter != theRange.second; ++theIter) {
+ std::shared_ptr<SAnimationTrack> theItem = theIter->second;
+ if (inSlide.GetHandleValue() == theItem->m_Slide
+ && inInstance.GetHandleValue() == theItem->m_Instance
+ && inProperty.GetHandleValue() == theItem->m_Property && inIndex == theItem->m_Index)
+ return theItem->m_Handle;
+ }
+ return 0;
+}
+
+SAnimationInfo CSimpleAnimationCore::GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const
+{
+ if (m_Objects.find(inAnimation) != m_Objects.end()) {
+ const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ return CreateAnimationInfo(theItem->m_Slide, theItem->m_Instance, theItem->m_Property,
+ theItem->m_Index, theItem->m_AnimationType,
+ theItem->m_FirstKeyframeDynamic, theItem->m_ArtistEdited);
+ }
+ return SAnimationInfo();
+}
+
+inline void AddIfAnimation(const THandleObjectPair &inPair, TAnimationHandleList &outAnimations)
+{
+ if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack)
+ outAnimations.push_back(inPair.first);
+}
+
+void CSimpleAnimationCore::GetAnimations(TAnimationHandleList &outAnimations) const
+{
+ outAnimations.clear();
+ do_all(m_Objects, std::bind(AddIfAnimation, std::placeholders::_1, std::ref(outAnimations)));
+}
+
+void CSimpleAnimationCore::GetAnimations(TAnimationInfoList &outAnimations,
+ Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMSlideHandle inSlide) const
+{
+ outAnimations.clear();
+ for (THandleObjectMap::const_iterator iter = m_Objects.begin(), end = m_Objects.end();
+ iter != end; ++iter) {
+ if (iter->second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack) {
+ const SAnimationTrack *theItem =
+ static_cast<const SAnimationTrack *>(iter->second.get());
+ // If either master or slide is valid, then item slide must match.
+ // If item slide matches neither, then we ignore unless neither are valid.
+ bool keep = (theItem->m_Slide == inMaster || theItem->m_Slide == inSlide)
+ || (inMaster.Valid() == false && inSlide.Valid() == false);
+ if (keep) {
+ outAnimations.push_back(
+ CreateAnimationInfo(theItem->m_Slide, theItem->m_Instance, theItem->m_Property,
+ theItem->m_Index, theItem->m_AnimationType,
+ theItem->m_FirstKeyframeDynamic, theItem->m_ArtistEdited));
+ }
+ }
+ }
+}
+
+inline void AddSpecificAnimationsIf(const THandleObjectPair &inPair, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ TAnimationHandleList &outAnimations)
+{
+ if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack) {
+ const SAnimationTrack *theTrack = static_cast<const SAnimationTrack *>(inPair.second.get());
+ if (theTrack->m_Slide == inSlide && theTrack->m_Instance == inInstance)
+ outAnimations.push_back(inPair.first);
+ }
+}
+
+void CSimpleAnimationCore::GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ TAnimationHandleList &outAnimations)
+{
+ EnsureAnimationCache();
+ pair<TStateInstanceAnimationMap::const_iterator, TStateInstanceAnimationMap::const_iterator>
+ theRange(m_AnimationMatchesCache.equal_range(
+ make_pair(inSlide.GetHandleValue(), inInstance.GetHandleValue())));
+ for (TStateInstanceAnimationMap::const_iterator iter = theRange.first; iter != theRange.second;
+ ++iter)
+ outAnimations.push_back(iter->second->m_Handle);
+}
+
+void CSimpleAnimationCore::SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue)
+{
+ SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ theItem->m_FirstKeyframeDynamic = inValue;
+ SetIsArtistEdited(inAnimation);
+}
+
+inline void CheckKeyframeType(EAnimationType inExpected, const TKeyframe &inKeyframe)
+{
+ if (inExpected != GetKeyframeType(inKeyframe))
+ throw AnimationKeyframeTypeError(L"");
+}
+
+// keyframe manipulation
+Qt3DSDMKeyframeHandle CSimpleAnimationCore::InsertKeyframe(Qt3DSDMAnimationHandle inAnimation,
+ const TKeyframe &inKeyframe)
+{
+ SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ CheckKeyframeType(theItem->m_AnimationType, inKeyframe);
+ int nextId = GetNextId();
+ m_Objects.insert(
+ make_pair(nextId, (THandleObjectPtr) new SKeyframe(nextId, inAnimation, inKeyframe)));
+ theItem->m_Keyframes.push_back(nextId);
+ theItem->m_KeyframesDirty = true;
+ SetIsArtistEdited(inAnimation);
+ return nextId;
+}
+
+void CSimpleAnimationCore::EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe)
+{
+ SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects);
+ int theAnimHandle(theKeyframe->m_Animation);
+ SAnimationTrack *theItem = GetAnimationNF(theAnimHandle, m_Objects);
+ EraseHandle(inKeyframe, m_Objects);
+ erase_if(theItem->m_Keyframes, std::bind(equal_to<int>(),
+ std::placeholders::_1, inKeyframe.GetHandleValue()));
+ SetIsArtistEdited(theAnimHandle);
+}
+
+void CSimpleAnimationCore::DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation)
+{
+ SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ do_all(theItem->m_Keyframes, std::bind(EraseHandle,
+ std::placeholders::_1, std::ref(m_Objects)));
+ theItem->m_Keyframes.clear();
+ SetIsArtistEdited(inAnimation);
+}
+
+Qt3DSDMAnimationHandle
+CSimpleAnimationCore::GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const
+{
+ const SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects);
+ return theKeyframe->m_Animation;
+}
+
+TKeyframe CSimpleAnimationCore::GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const
+{
+ const SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects);
+ return theKeyframe->m_Keyframe;
+}
+
+void CSimpleAnimationCore::SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData)
+{
+ DoSetKeyframeData(inKeyframe, inData);
+ SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects);
+ SetIsArtistEdited(theKeyframe->m_Animation);
+}
+
+void CSimpleAnimationCore::DoSetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe,
+ const TKeyframe &inData)
+{
+ SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects);
+ CheckKeyframeType(GetKeyframeType(theKeyframe->m_Keyframe), inData);
+ theKeyframe->m_Keyframe = inData;
+ SAnimationTrack *theItem = GetAnimationNF(theKeyframe->m_Animation, m_Objects);
+ theItem->m_KeyframesDirty = true;
+}
+
+bool KeyframeLessThan(int inLeftSide, int inRightSide, const THandleObjectMap &inObjects)
+{
+ const SKeyframe *theLeft = CSimpleAnimationCore::GetKeyframeNF(inLeftSide, inObjects);
+ const SKeyframe *theRight = CSimpleAnimationCore::GetKeyframeNF(inRightSide, inObjects);
+ return KeyframeTime(theLeft->m_Keyframe) < KeyframeTime(theRight->m_Keyframe);
+}
+
+void SortKeyframes(TKeyframeHandleList &inKeyframes, const THandleObjectMap &inObjects)
+{
+ return stable_sort(inKeyframes.begin(), inKeyframes.end(),
+ std::bind(KeyframeLessThan, std::placeholders::_1,
+ std::placeholders::_2, std::ref(inObjects)));
+}
+
+void CheckKeyframesSorted(const SAnimationTrack *theItem, const THandleObjectMap &inObjects)
+{
+ if (theItem->m_KeyframesDirty) {
+ SAnimationTrack *theNonConst = const_cast<SAnimationTrack *>(theItem);
+ SortKeyframes(theNonConst->m_Keyframes, inObjects);
+ theNonConst->m_KeyframesDirty = false;
+ }
+}
+
+void CSimpleAnimationCore::GetKeyframes(Qt3DSDMAnimationHandle inAnimation,
+ TKeyframeHandleList &outKeyframes) const
+{
+ const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ CheckKeyframesSorted(theItem, m_Objects);
+ outKeyframes = theItem->m_Keyframes;
+}
+
+size_t CSimpleAnimationCore::GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const
+{
+ const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ return theItem->m_Keyframes.size();
+}
+
+bool CSimpleAnimationCore::IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const
+{
+ Qt3DSDMAnimationHandle theAnimation = GetAnimationForKeyframe(inKeyframe);
+ if (theAnimation.Valid()) {
+ const SAnimationTrack *theItem = GetAnimationNF(theAnimation, m_Objects);
+ return theItem->m_Keyframes.size() && theItem->m_Keyframes[0] == inKeyframe;
+ }
+ return false;
+}
+
+void CSimpleAnimationCore::OffsetAnimations(Qt3DSDMSlideHandle /*inSlide*/,
+ Qt3DSDMInstanceHandle /*inInstance*/, long /*inOffset*/)
+{
+ throw std::runtime_error("unimplemented");
+}
+
+void CSimpleAnimationCore::SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited)
+{
+ if (m_Objects.find(inAnimation) == m_Objects.end()) {
+ Q_ASSERT(false);
+ return;
+ }
+ SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ if (theItem->m_ArtistEdited != inEdited)
+ theItem->m_ArtistEdited = inEdited;
+}
+
+bool CSimpleAnimationCore::IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const
+{
+ if (m_Objects.find(inAnimation) == m_Objects.end()) {
+ return false;
+ }
+ const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ return theItem->m_ArtistEdited;
+}
+
+inline bool KeyframeTimeLessThan(int inKeyframe, float inSeconds, const THandleObjectMap &inObjects)
+{
+ const SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, inObjects);
+ return KeyframeTime(theKeyframe->m_Keyframe) < inSeconds;
+}
+
+inline bool KeyframeValueTimeLessThan(const TKeyframe &inLeft, const TKeyframe &inRight)
+{
+ return KeyframeTime(inLeft) < KeyframeTime(inRight);
+}
+
+TKeyframe IntToKeyframe(int inKeyframe, const THandleObjectMap &inObjects)
+{
+ const SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, inObjects);
+ return theKeyframe->m_Keyframe;
+}
+
+inline float KeyframeValue(int inKeyframe, const THandleObjectMap &inObjects)
+{
+ const SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, inObjects);
+ return KeyframeValueValue(theKeyframe->m_Keyframe);
+}
+
+inline float EvaluateLinear(float inS1, float inS2, float inV1, float inV2, float inSeconds)
+{
+ float amount = (inSeconds - inS1) / (inS2 - inS1);
+ return inV1 + amount * (inV2 - inV1);
+}
+
+inline float EvaluateLinearKeyframe(SLinearKeyframe &inK1, SLinearKeyframe &inK2, float inSeconds)
+{
+ return EvaluateLinear(inK1.m_KeyframeSeconds, inK2.m_KeyframeSeconds, inK1.m_KeyframeValue,
+ inK2.m_KeyframeValue, inSeconds);
+}
+
+inline float DoBezierEvaluation(float inSeconds, const SBezierKeyframe &inK1,
+ const SBezierKeyframe &inK2)
+{
+ return Q3DStudio::EvaluateBezierKeyframe(
+ inSeconds, inK1.m_KeyframeSeconds, inK1.m_KeyframeValue, inK1.m_OutTangentTime,
+ inK1.m_OutTangentValue, inK2.m_InTangentTime, inK2.m_InTangentValue, inK2.m_KeyframeSeconds,
+ inK2.m_KeyframeValue);
+}
+
+// Animation Evaluation.
+float CSimpleAnimationCore::EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation,
+ float inSeconds) const
+{
+ const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects);
+ if (theItem->m_Keyframes.empty())
+ return 0.0f;
+ CheckKeyframesSorted(theItem, m_Objects);
+ // Default to linear for now.
+ SLinearKeyframe theKeyframe = { 0 };
+ theKeyframe.m_KeyframeSeconds = inSeconds;
+ TKeyframe theSearchKey(theKeyframe);
+ function<TKeyframe(int)> theIntToKeyframe(
+ std::bind(IntToKeyframe, std::placeholders::_1, std::ref(m_Objects)));
+
+ TKeyframeHandleList::const_iterator theBound =
+ lower_bound(theItem->m_Keyframes.begin(), theItem->m_Keyframes.end(), theSearchKey,
+ [theIntToKeyframe](const Qt3DSDMKeyframeHandle &inLeft,
+ const TKeyframe &inRight)
+ {return KeyframeTime(theIntToKeyframe(inLeft)) < KeyframeTime(inRight);});
+
+ if (theBound == theItem->m_Keyframes.end())
+ return KeyframeValue(theItem->m_Keyframes.back(), m_Objects);
+ if (theBound == theItem->m_Keyframes.begin())
+ return KeyframeValue(*theItem->m_Keyframes.begin(), m_Objects);
+
+ TKeyframeHandleList::const_iterator theStartIter = theBound;
+ --theStartIter;
+
+ // Both iterators must be valid at this point...
+ Qt3DSDMKeyframeHandle theStart = *theStartIter;
+ Qt3DSDMKeyframeHandle theFinish = *theBound;
+ switch (theItem->m_AnimationType) {
+ default:
+ throw AnimationEvaluationError(L"");
+ case EAnimationTypeLinear: {
+ SLinearKeyframe k1 = get<SLinearKeyframe>(theIntToKeyframe(theStart));
+ SLinearKeyframe k2 = get<SLinearKeyframe>(theIntToKeyframe(theFinish));
+ return EvaluateLinearKeyframe(k1, k2, inSeconds);
+ }
+ case EAnimationTypeBezier: {
+ SBezierKeyframe k1 = get<SBezierKeyframe>(theIntToKeyframe(theStart));
+ SBezierKeyframe k2 = get<SBezierKeyframe>(theIntToKeyframe(theFinish));
+ return DoBezierEvaluation(inSeconds, k1, k2);
+ }
+ case EAnimationTypeEaseInOut: {
+ SEaseInEaseOutKeyframe k1 = get<SEaseInEaseOutKeyframe>(theIntToKeyframe(theStart));
+ SEaseInEaseOutKeyframe k2 = get<SEaseInEaseOutKeyframe>(theIntToKeyframe(theFinish));
+ return DoBezierEvaluation(
+ inSeconds, CreateBezierKeyframeFromEaseInEaseOutKeyframe(NULL, k1, &k2.m_KeyframeValue),
+ CreateBezierKeyframeFromEaseInEaseOutKeyframe(&k1.m_KeyframeValue, k2, NULL));
+ }
+ }
+}
+
+bool CSimpleAnimationCore::KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const
+{
+ return HandleObjectValid<SKeyframe>(inKeyframe, m_Objects);
+}
+
+bool CSimpleAnimationCore::AnimationValid(Qt3DSDMAnimationHandle inAnimation) const
+{
+ return HandleObjectValid<SAnimationTrack>(inAnimation, m_Objects);
+}
+
+Qt3DSDMAnimationHandle CSimpleAnimationCore::CreateAnimationWithHandle(
+ int inHandle, Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex, EAnimationType inAnimationType,
+ bool inFirstKeyframeDynamic)
+{
+ if (HandleValid(inHandle))
+ throw HandleExists(L"");
+ m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SAnimationTrack(
+ inHandle, inSlide, inInstance, inProperty, inIndex,
+ inAnimationType, inFirstKeyframeDynamic, true)));
+ return inHandle;
+}
+
+void CSimpleAnimationCore::AddAnimationToLookupCache(Qt3DSDMAnimationHandle inAnimation) const
+{
+ THandleObjectMap::const_iterator theAnim = m_Objects.find(inAnimation);
+ if (theAnim != m_Objects.end())
+ AddAnimationToLookupCache(static_pointer_cast<SAnimationTrack>(theAnim->second));
+}
+void CSimpleAnimationCore::RemoveAnimationFromLookupCache(Qt3DSDMAnimationHandle inAnimation) const
+{
+ THandleObjectMap::const_iterator theAnim = m_Objects.find(inAnimation);
+ if (theAnim != m_Objects.end())
+ RemoveAnimationFromLookupCache(static_pointer_cast<SAnimationTrack>(theAnim->second));
+}
+
+// Ensure there is only one of these in the multimap.
+void CSimpleAnimationCore::AddAnimationToLookupCache(
+ std::shared_ptr<SAnimationTrack> inAnimation) const
+{
+ Qt3DSDMSlideHandle theSlide = inAnimation->m_Slide;
+ Qt3DSDMInstanceHandle theInstance = inAnimation->m_Instance;
+ pair<TStateInstanceAnimationMap::iterator, TStateInstanceAnimationMap::iterator> theRange =
+ m_AnimationMatchesCache.equal_range(
+ make_pair(theSlide.GetHandleValue(), theInstance.GetHandleValue()));
+ for (TStateInstanceAnimationMap::iterator theIter = theRange.first; theIter != theRange.second;
+ ++theIter) {
+ if (theIter->second == inAnimation)
+ return;
+ }
+ m_AnimationMatchesCache.insert(
+ make_pair(make_pair(theSlide.GetHandleValue(), theInstance.GetHandleValue()), inAnimation));
+}
+
+// Remove this from the multimap
+void CSimpleAnimationCore::RemoveAnimationFromLookupCache(
+ std::shared_ptr<SAnimationTrack> inAnimation) const
+{
+ TStateInstanceAnimationMap &theMap(m_AnimationMatchesCache);
+ Qt3DSDMSlideHandle theSlide = inAnimation->m_Slide;
+ Qt3DSDMInstanceHandle theInstance = inAnimation->m_Instance;
+ pair<TStateInstanceAnimationMap::iterator, TStateInstanceAnimationMap::iterator> theRange =
+ theMap.equal_range(make_pair(theSlide.GetHandleValue(), theInstance.GetHandleValue()));
+ for (TStateInstanceAnimationMap::iterator theIter = theRange.first; theIter != theRange.second;
+ ++theIter) {
+ if (theIter->second == inAnimation) {
+ theMap.erase(theIter);
+ break;
+ }
+ }
+}
+
+//================================================================================
+// UICDMAnimation.h function implementations
+//================================================================================
+
+void CopyKeyframe(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe,
+ const IAnimationCore &inSourceAnimationCore, IAnimationCore &inDestAnimationCore)
+{
+ TKeyframe theData = inSourceAnimationCore.GetKeyframeData(inKeyframe);
+ inDestAnimationCore.InsertKeyframe(inAnimation, theData);
+}
+
+void CopyKeyframes(const IAnimationCore &inSourceAnimationCore, IAnimationCore &inDestAnimationCore,
+ Qt3DSDMAnimationHandle inDestAnimation, const TKeyframeHandleList &inKeyframes)
+{
+ do_all(inKeyframes,
+ std::bind(CopyKeyframe, inDestAnimation, std::placeholders::_1,
+ std::cref(inSourceAnimationCore), std::ref(inDestAnimationCore)));
+}
+
+Qt3DSDMAnimationHandle CopyAnimation(TAnimationCorePtr inAnimationCore,
+ Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inNewSlide,
+ Qt3DSDMInstanceHandle inNewInstance,
+ Qt3DSDMPropertyHandle inNewProperty, size_t inNewIndex)
+{
+ TKeyframeHandleList theKeyframes;
+ inAnimationCore->GetKeyframes(inAnimation, theKeyframes);
+ SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation));
+ Qt3DSDMAnimationHandle theAnimation =
+ inAnimationCore->CreateAnimation(inNewSlide, inNewInstance, inNewProperty, inNewIndex,
+ theInfo.m_AnimationType, theInfo.m_DynamicFirstKeyframe);
+ CopyKeyframes(*inAnimationCore, *inAnimationCore, theAnimation, theKeyframes);
+ return theAnimation;
+}
+
+SBezierKeyframe GetBezierKeyframeData(Qt3DSDMKeyframeHandle inKeyframe,
+ const IAnimationCore &inAnimationCore)
+{
+ return get<SBezierKeyframe>(inAnimationCore.GetKeyframeData(inKeyframe));
+}
+
+SEaseInEaseOutKeyframe GetEaseInEaseOutKeyframeData(Qt3DSDMKeyframeHandle inKeyframe,
+ const IAnimationCore &inAnimationCore)
+{
+ return get<SEaseInEaseOutKeyframe>(inAnimationCore.GetKeyframeData(inKeyframe));
+}
+
+TKeyframeHandleList::iterator SafeIncrementIterator(TKeyframeHandleList::iterator inIter,
+ const TKeyframeHandleList::iterator &inEnd)
+{
+ return inIter == inEnd ? inEnd : inIter + 1;
+}
+
+void GetKeyframesAsBezier(Qt3DSDMAnimationHandle inAnimation, const IAnimationCore &inAnimationCore,
+ TBezierKeyframeList &outKeyframes)
+{
+ SAnimationInfo theInfo(inAnimationCore.GetAnimationInfo(inAnimation));
+ TKeyframeHandleList theKeyframes;
+ inAnimationCore.GetKeyframes(inAnimation, theKeyframes);
+ outKeyframes.resize(theKeyframes.size());
+ switch (theInfo.m_AnimationType) {
+ default:
+ throw invalid_argument("AnimationType");
+ case EAnimationTypeBezier:
+ transform(theKeyframes.begin(), theKeyframes.end(), outKeyframes.begin(),
+ std::bind(GetBezierKeyframeData, std::placeholders::_1,
+ std::cref(inAnimationCore)));
+ break;
+ case EAnimationTypeEaseInOut: {
+
+ TKeyframeHandleList::iterator theEndKeyframe = theKeyframes.end();
+
+ typedef std::function<SEaseInEaseOutKeyframe(Qt3DSDMKeyframeHandle)> TConvertFunc;
+ TConvertFunc theDataConverter(
+ std::bind(GetEaseInEaseOutKeyframeData, std::placeholders::_1,
+ std::cref(inAnimationCore)));
+
+ TKeyframeHandleList::iterator thePreviousKeyframe = theKeyframes.begin();
+
+ TKeyframeHandleList::iterator theCurrentKeyframe =
+ SafeIncrementIterator(thePreviousKeyframe, theEndKeyframe);
+
+ TKeyframeHandleList::iterator theNextKeyframe =
+ SafeIncrementIterator(theCurrentKeyframe, theEndKeyframe);
+
+ TBezierKeyframeList::iterator theResult(outKeyframes.begin());
+
+ if (thePreviousKeyframe != theEndKeyframe) {
+ float *theNextValuePtr = NULL;
+ float theNextValue;
+ if (theCurrentKeyframe != theEndKeyframe) {
+ theNextValue = theDataConverter(*theCurrentKeyframe).m_KeyframeValue;
+ theNextValuePtr = &theNextValue;
+ }
+ *theResult = CreateBezierKeyframeFromEaseInEaseOutKeyframe(
+ NULL, theDataConverter(*thePreviousKeyframe), theNextValuePtr);
+ theResult = theResult + 1;
+ }
+ for (; theCurrentKeyframe != theEndKeyframe;
+ ++thePreviousKeyframe,
+ theCurrentKeyframe = SafeIncrementIterator(theCurrentKeyframe, theEndKeyframe),
+ theNextKeyframe = SafeIncrementIterator(theNextKeyframe, theEndKeyframe),
+ ++theResult) {
+ float theLastValue(theDataConverter(*thePreviousKeyframe).m_KeyframeValue);
+ float *theNextValuePtr = NULL;
+ float theNextValue;
+ if (theNextKeyframe != theEndKeyframe) {
+ theNextValue = theDataConverter(*theNextKeyframe).m_KeyframeValue;
+ theNextValuePtr = &theNextValue;
+ }
+ *theResult = CreateBezierKeyframeFromEaseInEaseOutKeyframe(
+ &theLastValue, theDataConverter(*theCurrentKeyframe), theNextValuePtr);
+ }
+ } break;
+ }
+}
+}
diff --git a/src/dm/systems/cores/SimpleAnimationCore.h b/src/dm/systems/cores/SimpleAnimationCore.h
new file mode 100644
index 0000000..cb4c415
--- /dev/null
+++ b/src/dm/systems/cores/SimpleAnimationCore.h
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef ANIMATIONCOREH
+#define ANIMATIONCOREH
+#include "Qt3DSDMAnimation.h"
+#include "HandleSystemBase.h"
+#include <unordered_map>
+
+namespace {
+struct pair_hash {
+ template <class T1, class T2>
+ std::size_t operator () (const std::pair<T1, T2> &p) const {
+ auto h1 = std::hash<T1>{}(p.first);
+ auto h2 = std::hash<T2>{}(p.second);
+
+ return h1 ^ h2;
+ }
+ };
+}
+
+namespace qt3dsdm {
+struct SAnimationTrack : public CHandleObject
+{
+ int m_Slide;
+ int m_Instance;
+ int m_Property;
+ EAnimationType m_AnimationType;
+ size_t m_Index;
+ TKeyframeHandleList m_Keyframes;
+ bool m_KeyframesDirty;
+ bool m_FirstKeyframeDynamic;
+ bool m_ArtistEdited;
+
+ SAnimationTrack()
+ : m_Slide(0)
+ , m_Instance(0)
+ , m_Property(0)
+ , m_AnimationType(EAnimationTypeLinear)
+ , m_Index(0)
+ , m_KeyframesDirty(false)
+ , m_FirstKeyframeDynamic(false)
+ , m_ArtistEdited(true)
+ {
+ }
+
+ SAnimationTrack(int inHandle, Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex, EAnimationType inAnimationType,
+ bool inFirstKeyframeDynamic, bool inArtistEdited)
+ : CHandleObject(inHandle)
+ , m_Slide(inSlide)
+ , m_Instance(inInstance)
+ , m_Property(inProperty)
+ , m_AnimationType(inAnimationType)
+ , m_Index(inIndex)
+ , m_KeyframesDirty(false)
+ , m_FirstKeyframeDynamic(inFirstKeyframeDynamic)
+ , m_ArtistEdited(inArtistEdited)
+ {
+ }
+
+ static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSAnimationTrack;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+struct SKeyframe : public CHandleObject
+{
+ TKeyframe m_Keyframe;
+ int m_Animation;
+
+ SKeyframe(int inHandle, int inAnimation, const TKeyframe &inKeyframe)
+ : CHandleObject(inHandle)
+ , m_Keyframe(inKeyframe)
+ , m_Animation(inAnimation)
+ {
+ }
+
+ static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSKeyframe;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+class CAnimationCoreProducer;
+
+class CSimpleAnimationCore : public CHandleBase, public IAnimationCore
+{
+ TStringTablePtr m_StringTable;
+ typedef std::unordered_multimap<std::pair<int, int>,
+ std::shared_ptr<SAnimationTrack>, pair_hash> TStateInstanceAnimationMap;
+ // state,instance pair map to animation handle to speed up querying if a particular
+ // property is animated.
+ mutable TStateInstanceAnimationMap m_AnimationMatchesCache;
+
+public: // Use
+ friend class CAnimationCoreProducer;
+ // We don't use the string table ptr we are constructed with
+ // but the testing system needs an unified interface to creating
+ // objects
+ CSimpleAnimationCore() {}
+ CSimpleAnimationCore(TStringTablePtr strTable)
+ : m_StringTable(strTable)
+ {
+ }
+ TStringTablePtr GetStringTablePtr() const { return m_StringTable; }
+
+ Qt3DSDMAnimationHandle CreateAnimation(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType,
+ bool inFirstKeyframeDynamic) override;
+ void DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) override;
+ Qt3DSDMAnimationHandle GetAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex) const override;
+ SAnimationInfo GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const override;
+ void GetAnimations(TAnimationHandleList &outAnimations) const override;
+ void GetAnimations(TAnimationInfoList &outAnimations, Qt3DSDMSlideHandle inMaster,
+ Qt3DSDMSlideHandle inSlide) const override;
+ void GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ TAnimationHandleList &outAnimations) override;
+
+ void SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue) override;
+
+ // keyframe manipulation
+ Qt3DSDMKeyframeHandle InsertKeyframe(Qt3DSDMAnimationHandle inAnimation,
+ const TKeyframe &inKeyframe) override;
+ void EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe) override;
+ void DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) override;
+ Qt3DSDMAnimationHandle GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override;
+ TKeyframe GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const override;
+ void SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override;
+ // Set the keyframe data, but don't set the artist edited flag. Used for undo/redo operations
+ // where the artist edited flag has handeled by a different transaction
+ void DoSetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData);
+ void GetKeyframes(Qt3DSDMAnimationHandle inAnimation, TKeyframeHandleList &outKeyframes) const override;
+ size_t GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const override;
+ bool IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override;
+ // Only implemented in the producer for now.
+ void OffsetAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance,
+ long inOffset) override;
+
+ void SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited = true) override;
+ bool IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const override;
+
+ // Animation Evaluation.
+ float EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, float inSeconds) const override;
+
+ bool KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const override;
+ bool AnimationValid(Qt3DSDMAnimationHandle inAnimation) const override;
+
+ // Only implemented at the producer level, not at the simple core level.
+ void CopyAnimations(Qt3DSDMSlideHandle /*inSourceSlide*/,
+ Qt3DSDMInstanceHandle /*inSourceInstance*/,
+ Qt3DSDMSlideHandle /*inDestSlide*/, Qt3DSDMInstanceHandle /*inDestInstance*/) override
+ {
+ throw AnimationNotFound(L"");
+ }
+
+ // Lookup cache management so we can find particular animations quickly.
+ void ClearAnimationMatchesLookupCache() const { m_AnimationMatchesCache.clear(); }
+ void AddAnimationToLookupCache(Qt3DSDMAnimationHandle inAnimation) const;
+ void RemoveAnimationFromLookupCache(Qt3DSDMAnimationHandle inAnimation) const;
+ void AddAnimationToLookupCache(std::shared_ptr<SAnimationTrack> inAnimation) const;
+ void RemoveAnimationFromLookupCache(std::shared_ptr<SAnimationTrack> inAnimation) const;
+
+ void EnsureAnimationCache() const;
+
+ Qt3DSDMAnimationHandle CreateAnimationWithHandle(int inHandle, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, size_t inIndex,
+ EAnimationType inAnimationType,
+ bool inFirstKeyframeDynamic);
+
+ static SAnimationTrack *GetAnimationNF(int inHandle, THandleObjectMap &inObjects)
+ {
+ return const_cast<SAnimationTrack *>(
+ GetAnimationNF(inHandle, static_cast<const THandleObjectMap &>(inObjects)));
+ }
+
+ static const SAnimationTrack *GetAnimationNF(int inHandle, const THandleObjectMap &inObjects)
+ {
+ const SAnimationTrack *theAnimation = GetHandleObject<SAnimationTrack>(inHandle, inObjects);
+ if (theAnimation)
+ return theAnimation;
+ throw AnimationNotFound(L"");
+ }
+
+ static SKeyframe *GetKeyframeNF(int inHandle, THandleObjectMap &inObjects)
+ {
+ return const_cast<SKeyframe *>(
+ GetKeyframeNF(inHandle, static_cast<const THandleObjectMap &>(inObjects)));
+ }
+
+ static const SKeyframe *GetKeyframeNF(int inHandle, const THandleObjectMap &inObjects)
+ {
+ const SKeyframe *theItem = GetHandleObject<SKeyframe>(inHandle, inObjects);
+ if (theItem)
+ return theItem;
+ throw AnimationKeyframeNotFound(L"");
+ }
+};
+
+typedef std::shared_ptr<CSimpleAnimationCore> TSimpleAnimationCorePtr;
+}
+
+#endif
diff --git a/src/dm/systems/cores/SimpleDataCore.cpp b/src/dm/systems/cores/SimpleDataCore.cpp
new file mode 100644
index 0000000..d6a1470
--- /dev/null
+++ b/src/dm/systems/cores/SimpleDataCore.cpp
@@ -0,0 +1,574 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "SimpleDataCore.h"
+
+namespace qt3dsdm {
+Qt3DSDMDebugLogFunction g_DataModelDebugLogger = NULL;
+// Instances
+Qt3DSDMInstanceHandle CSimpleDataCore::CreateInstance(Qt3DSDMInstanceHandle hdl)
+{
+ int nextId = hdl;
+ if (hdl.Valid() == false)
+ nextId = GetNextId();
+
+ return CreateInstanceWithHandle(nextId);
+}
+
+inline void RemoveParentFromClass(int inParent, int inChild, THandleObjectMap &inMap)
+{
+ TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inChild, inMap);
+ theInstance->m_Parents.erase(theInstance->m_Parents.find(inParent));
+ // Cascade the delete operation
+}
+
+void CSimpleDataCore::DeleteInstance(Qt3DSDMInstanceHandle inHandle)
+{
+ // Ensure it exists in the first place.
+ CSimpleDataCore::GetInstanceNF(inHandle, m_Objects); // Check for instance existance
+ CSimpleDataCore::EraseHandle(inHandle, m_Objects);
+ TIntList properties;
+ TIntList instances;
+ do_all(m_Objects, std::bind(FindRelatedItemsForDelete, inHandle.GetHandleValue(),
+ std::ref(properties), std::ref(instances), std::placeholders::_1));
+ do_all(instances, std::bind(RemoveParentFromClass, inHandle.GetHandleValue(),
+ std::placeholders::_1, std::ref(m_Objects)));
+ do_all(properties, std::bind(EraseHandle, std::placeholders::_1, std::ref(m_Objects)));
+}
+
+void CSimpleDataCore::GetInstances(TInstanceHandleList &outInstances) const
+{
+ // reserve the vector to m_Objects.size() to prevent vector reallocation
+ // m_Objects.size() is the upper bound of the no of instances
+ // the exact no of instances = m_Objects.size() - the no of properties as added by
+ // CClientDataModelBridge::InitializeDataCore (as of now, we have 31 properties)
+ outInstances.reserve(m_Objects.size());
+ do_all(m_Objects, std::bind(MaybeAddObject<CDataModelInstance, Qt3DSDMInstanceHandle>,
+ std::placeholders::_1, std::ref(outInstances)));
+}
+
+// Get instances that are derived from a specific parent
+void CSimpleDataCore::GetInstancesDerivedFrom(TInstanceHandleList &outInstances,
+ Qt3DSDMInstanceHandle inParentHandle) const
+{
+ do_all(m_Objects, std::bind(&CSimpleDataCore::AddInstanceIfDerivedFrom, this,
+ std::placeholders::_1,
+ std::ref(outInstances), inParentHandle));
+}
+
+// add instance that is derived from a specific parent
+void CSimpleDataCore::AddInstanceIfDerivedFrom(const std::pair<int, THandleObjectPtr> &inItem,
+ TInstanceHandleList &outInstances,
+ Qt3DSDMInstanceHandle inParentHandle) const
+{
+ if (inItem.second->GetType() == CHandleObject::EHandleObjectTypeCDataModelInstance) {
+ TDataModelInstancePtr theInstance = static_pointer_cast<CDataModelInstance>(inItem.second);
+ if (IsInstanceOrDerivedFromHelper(theInstance, inParentHandle))
+ outInstances.push_back(inItem.first);
+ }
+}
+
+// Derivation
+void CSimpleDataCore::DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent)
+{
+ if (g_DataModelDebugLogger)
+ g_DataModelDebugLogger("CSimpleDataCore::DeriveInstance Enter");
+ TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inInstance, m_Objects);
+ if (theInstance->m_Parents.find(inParent) == theInstance->m_Parents.end()) {
+ std::shared_ptr<CDataModelInstance> theParent(GetInstanceNF(inParent, m_Objects));
+ theInstance->m_Parents.insert(make_pair(inParent, theParent));
+ }
+ if (g_DataModelDebugLogger)
+ g_DataModelDebugLogger("CSimpleDataCore::DeriveInstance Leave");
+}
+
+void CSimpleDataCore::GetInstanceParents(Qt3DSDMInstanceHandle inHandle,
+ TInstanceHandleList &outParents) const
+{
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inHandle, m_Objects);
+ for (CDataModelInstance::TInstancePairList::const_iterator theParent =
+ theInstance->m_Parents.begin();
+ theParent != theInstance->m_Parents.end(); ++theParent)
+ outParents.push_back(theParent->first);
+}
+
+inline bool ComparePropertyNames(const TCharStr &inName, int inPropHandle,
+ const THandleObjectMap &inObjects)
+{
+ if (CSimpleDataCore::GetPropertyDefinitionNF(inPropHandle, inObjects)->m_Definition.m_Name
+ == inName)
+ return true;
+ return false;
+}
+
+inline const wchar_t *SafeStrPtr(const wchar_t *inData)
+{
+ return inData == NULL ? L"" : inData;
+}
+
+// Properties
+Qt3DSDMPropertyHandle CSimpleDataCore::AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName,
+ DataModelDataType::Value inPropType)
+{
+ QT3DSDM_LOG_FUNCTION("CSimpleDataCore::AddProperty");
+ QT3DSDM_DEBUG_LOG(m_StringTable->GetNarrowStr(inName));
+ TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ TCharStr theName(inName);
+ if (find_if<TIntList::iterator>(
+ theInstance->m_Properties,
+ std::bind(ComparePropertyNames, std::ref(theName),
+ std::placeholders::_1, std::ref(m_Objects)))
+ != theInstance->m_Properties.end()) {
+ QT3DSDM_DEBUG_LOG("Property Exists!!");
+ throw PropertyExists(L"");
+ }
+
+ int nextId = GetNextId();
+ return AddPropertyWithHandle(nextId, inInstance, inName, inPropType);
+}
+
+void CSimpleDataCore::GetInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const
+{
+ transformv_all(GetInstanceNF(inInstance, m_Objects)->m_Properties, outProperties);
+}
+
+const Qt3DSDMPropertyDefinition &CSimpleDataCore::GetProperty(Qt3DSDMPropertyHandle inProperty) const
+{
+ const CDataModelPropertyDefinitionObject *theProp =
+ GetPropertyDefinitionNF(inProperty, m_Objects);
+ return theProp->m_Definition;
+}
+
+void CSimpleDataCore::RemoveProperty(Qt3DSDMPropertyHandle inProperty)
+{
+ CDataModelPropertyDefinitionObject *theProp =
+ CSimpleDataCore::GetPropertyDefinitionNF(inProperty, m_Objects);
+ TDataModelInstancePtr theInstance =
+ CSimpleDataCore::GetInstanceNF(theProp->m_Definition.m_Instance, m_Objects);
+ erase_if(theInstance->m_Properties,
+ std::bind(equal_to<int>(), inProperty.GetHandleValue(), std::placeholders::_1));
+ CSimpleDataCore::EraseHandle(inProperty, m_Objects);
+}
+
+inline bool PropertyMatches(int inProperty, Qt3DSDMPropertyHandle inTarget)
+{
+ return inProperty == inTarget.GetHandleValue();
+}
+
+inline bool GetInstanceValue(Qt3DSDMInstanceHandle inInstanceHandle,
+ Qt3DSDMPropertyHandle inPropertyHandle, CSimpleDataCore &inDataCore,
+ SValue &outValue)
+{
+ const TDataModelInstancePtr theInstance =
+ CSimpleDataCore::GetInstanceNF(inInstanceHandle, inDataCore.m_Objects);
+
+ TPropertyPairHash::const_iterator theInstanceProp =
+ theInstance->m_PropertyValues.find(inPropertyHandle.GetHandleValue());
+ if (theInstanceProp != theInstance->m_PropertyValues.end()) {
+ outValue = theInstanceProp->second.second.GetValue();
+ return true;
+ }
+ return false;
+}
+
+inline void CopyInstanceProperty(Qt3DSDMPropertyHandle inSrcPropertyHandle,
+ Qt3DSDMInstanceHandle inSrcInstanceHandle,
+ Qt3DSDMInstanceHandle inInstanceHandle, CSimpleDataCore &inDataCore)
+{
+ // create the property definition that matches the source
+ const Qt3DSDMPropertyDefinition &theProperty = inDataCore.GetProperty(inSrcPropertyHandle);
+ Qt3DSDMPropertyHandle theNewProperty =
+ inDataCore.AddProperty(inInstanceHandle, theProperty.m_Name.wide_str(), theProperty.m_Type);
+ // copy the value if one exists on the src.
+ SValue theValue;
+ if (GetInstanceValue(inSrcInstanceHandle, inSrcPropertyHandle, inDataCore, theValue))
+ inDataCore.SetInstancePropertyValue(inInstanceHandle, theNewProperty, theValue);
+}
+
+// logic : if destination property is one gained through derivation in inSrcInstanceHandle, copy the
+// value over.
+inline void CopyAggregatedPropertyValues(Qt3DSDMPropertyHandle inDestPropertyHandle,
+ Qt3DSDMInstanceHandle inSrcInstanceHandle,
+ Qt3DSDMInstanceHandle inInstanceHandle,
+ const TPropertyHandleList &inSrcNonAggregateList,
+ CSimpleDataCore &inDataCore)
+{
+ if (find_if(inSrcNonAggregateList.begin(), inSrcNonAggregateList.end(),
+ bind(PropertyMatches, inDestPropertyHandle, std::placeholders::_1))
+ == inSrcNonAggregateList.end()
+ && inDataCore.HasAggregateInstanceProperty(inSrcInstanceHandle, inDestPropertyHandle)) {
+ SValue theValue;
+ if (GetInstanceValue(inSrcInstanceHandle, inDestPropertyHandle, inDataCore, theValue))
+ inDataCore.SetInstancePropertyValue(inInstanceHandle, inDestPropertyHandle, theValue);
+ }
+}
+
+void CSimpleDataCore::CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance,
+ Qt3DSDMInstanceHandle inDestInstance)
+{
+ TPropertyHandleList theList;
+ GetInstanceProperties(inSrcInstance, theList);
+ do_all(theList, bind(CopyInstanceProperty, std::placeholders::_1,
+ inSrcInstance, inDestInstance, ref(*this)));
+
+ TPropertyHandleList theDestList;
+ GetAggregateInstanceProperties(inDestInstance, theDestList);
+ do_all(theDestList, std::bind(CopyAggregatedPropertyValues, std::placeholders::_1,
+ inSrcInstance, inDestInstance,
+ theList, std::ref(*this)));
+}
+
+void CSimpleDataCore::RemoveCachedValues(Qt3DSDMInstanceHandle inInstance)
+{
+ const TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inInstance, m_Objects);
+ theInstance->RemoveCachedValues();
+}
+
+void GetAggregateProperties(const TDataModelInstancePtr inInstance, TIntList &inVisited,
+ TPropertyHandleList &outProperties)
+{
+ if (find(inVisited.begin(), inVisited.end(), inInstance->m_Handle) == inVisited.end()) {
+ inVisited.push_back(inInstance->m_Handle);
+ size_t theSize = outProperties.size();
+ outProperties.resize(theSize + inInstance->m_Properties.size());
+ transform(inInstance->m_Properties.begin(), inInstance->m_Properties.end(),
+ outProperties.begin() + theSize, identity<int>);
+ for (CDataModelInstance::TInstancePairList::const_iterator theParent =
+ inInstance->m_Parents.begin();
+ theParent != inInstance->m_Parents.end(); ++theParent)
+ GetAggregateProperties(theParent->second, inVisited, outProperties);
+ }
+}
+
+template <typename TPredicate>
+inline std::tuple<bool, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle>
+RecurseFindProperty(const TDataModelInstancePtr inInstance, TPredicate inPredicate)
+{
+ TIntList::const_iterator theFind = eastl::find_if(inInstance->m_Properties.begin(),
+ inInstance->m_Properties.end(), inPredicate);
+ if (theFind != inInstance->m_Properties.end())
+ return make_tuple(true, inInstance->m_Handle, *theFind);
+
+ for (CDataModelInstance::TInstancePairList::const_iterator theParent =
+ inInstance->m_Parents.begin();
+ theParent != inInstance->m_Parents.end(); ++theParent) {
+ std::tuple<bool, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle> theValue =
+ RecurseFindProperty(theParent->second, inPredicate);
+ if (get<0>(theValue))
+ return theValue;
+ }
+ return make_tuple(false, 0, 0);
+}
+
+inline bool PropertyNameMatches(int inProperty, const THandleObjectMap &inObjects,
+ const TCharStr &inStr)
+{
+ const CDataModelPropertyDefinitionObject *theProp =
+ CSimpleDataCore::GetPropertyDefinitionNF(inProperty, inObjects);
+ return (theProp->m_Definition.m_Name == inStr);
+}
+
+Qt3DSDMPropertyHandle
+CSimpleDataCore::GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const
+{
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ return get<2>(
+ RecurseFindProperty(theInstance, std::bind(PropertyNameMatches,
+ std::placeholders::_1, std::ref(m_Objects),
+ std::ref(inStr))));
+}
+
+// A simplified RecurseFindProperty function
+bool RecurseFindPropertyMatches(const TDataModelInstancePtr inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ TIntList::const_iterator theFind =
+ find(inInstance->m_Properties.begin(), inInstance->m_Properties.end(),
+ inProperty.GetHandleValue());
+ if (theFind != inInstance->m_Properties.end())
+ return true;
+
+ for (CDataModelInstance::TInstancePairList::const_iterator theParent =
+ inInstance->m_Parents.begin();
+ theParent != inInstance->m_Parents.end(); ++theParent) {
+ if (RecurseFindPropertyMatches(theParent->second, inProperty))
+ return true;
+ }
+ return false;
+}
+
+bool CSimpleDataCore::HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ if (theInstance->m_PropertyValues.find(inProperty.GetHandleValue())
+ != theInstance->m_PropertyValues.end())
+ return true;
+
+ return RecurseFindPropertyMatches(theInstance, inProperty);
+}
+
+void CSimpleDataCore::GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const
+{
+ TIntList inVisited;
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ GetAggregateProperties(theInstance, inVisited, outProperties);
+}
+
+void CSimpleDataCore::CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) const
+{
+ CheckPropertyExistence(GetInstanceNF(inInstance, m_Objects), inProperty, m_Objects);
+ const CDataModelPropertyDefinitionObject *theDefinition =
+ CSimpleDataCore::GetPropertyDefinitionNF(inProperty, m_Objects);
+ CheckValueType(theDefinition->m_Definition.m_Type, inValue);
+}
+
+bool CSimpleDataCore::GetInstancePropertyValueHelper(const TDataModelInstancePtr inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ TPropertyPairHash::const_iterator theInstanceProp =
+ inInstance->m_PropertyValues.find(inProperty);
+ if (theInstanceProp != inInstance->m_PropertyValues.end()) {
+ outValue = theInstanceProp->second.second.GetValue();
+ return true;
+ } else {
+ // Is the property valid?
+ const CDataModelPropertyDefinitionObject *theProp =
+ GetPropertyDefinitionNF(inProperty, m_Objects);
+ int thePropInstance = theProp->m_Definition.m_Instance;
+ if (thePropInstance != inInstance->m_Handle) {
+ for (CDataModelInstance::TInstancePairList::const_iterator theParent =
+ inInstance->m_Parents.begin();
+ theParent != inInstance->m_Parents.end(); ++theParent) {
+ if (IsInstanceOrDerivedFromHelper(theParent->second, thePropInstance)
+ && GetInstancePropertyValueHelper(theParent->second, inProperty, outValue)) {
+ // Quietly propagate to this instance so next time we won't go through this
+ // large property lookup chain.
+ inInstance->m_PropertyValues.insert(std::make_pair(
+ inProperty,
+ TPropertyValuePair(
+ PropertyValueFlags(PropertyValueFlags::SetViaAutoPropagate),
+ SInternValue::ISwearThisHasAlreadyBeenInternalized(outValue))));
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+bool CSimpleDataCore::GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ if (IsInstance(inHandle) == false || IsProperty(inProperty) == false) {
+ Q_ASSERT(0);
+ return false;
+ }
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inHandle, m_Objects);
+ return GetInstancePropertyValueHelper(theInstance, inProperty, outValue);
+}
+
+void CSimpleDataCore::SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ if (IsInstance(inHandle) == false || IsProperty(inProperty) == false) {
+ Q_ASSERT(0);
+ return;
+ }
+ CheckValue(inHandle, inProperty, inValue);
+ UncheckedSetSpecificInstancePropertyValue(inHandle, inProperty, inValue, PropertyValueFlags());
+}
+
+void CSimpleDataCore::GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle,
+ TPropertyHandleValuePairList &outValues)
+{
+ if (IsInstance(inHandle) == false)
+ return;
+
+ TDataModelInstancePtr theInstance = GetInstanceNF(inHandle, m_Objects);
+ for (TPropertyPairHash::const_iterator theIter = theInstance->m_PropertyValues.begin(),
+ theEnd = theInstance->m_PropertyValues.end();
+ theIter != theEnd; ++theIter) {
+ const pair<int, TPropertyValuePair> &thePair(*theIter);
+ if (thePair.second.first.IsSetViaAutoPropagation() == false) {
+ Qt3DSDMPropertyHandle thePropertyHandle(thePair.first);
+ SValue theValue(thePair.second.second.GetValue());
+ outValues.push_back(make_pair(thePair.first, theValue));
+ }
+ }
+}
+
+bool CSimpleDataCore::IsInstance(int inHandle) const
+{
+ return HandleObjectValid<CDataModelInstance>(inHandle, m_Objects);
+}
+bool CSimpleDataCore::IsProperty(int inHandle) const
+{
+ return HandleObjectValid<CDataModelPropertyDefinitionObject>(inHandle, m_Objects);
+}
+
+Qt3DSDMInstanceHandle CSimpleDataCore::CreateInstanceWithHandle(int inHandle)
+{
+ if (g_DataModelDebugLogger)
+ g_DataModelDebugLogger("CSimpleDataCore::CreateInstance Enter");
+ if (HandleValid(inHandle)) {
+ if (g_DataModelDebugLogger) {
+ g_DataModelDebugLogger("CSimpleDataCore::CreateInstance Handle Exists!!");
+ char buf[32];
+ sprintf(buf, "%d", inHandle);
+ g_DataModelDebugLogger(buf);
+ }
+ throw HandleExists(L"");
+ }
+
+ THandleObjectPtr theHandleObjectPtr(new CDataModelInstance(inHandle));
+ const pair<int, THandleObjectPtr> thePair(std::make_pair(inHandle, theHandleObjectPtr));
+ m_Objects.insert(thePair);
+
+ if (g_DataModelDebugLogger)
+ g_DataModelDebugLogger("CSimpleDataCore::CreateInstance Leave");
+
+ return inHandle;
+}
+
+Qt3DSDMPropertyHandle CSimpleDataCore::AddPropertyWithHandle(int inHandle,
+ Qt3DSDMInstanceHandle inInstance,
+ TCharPtr inName,
+ DataModelDataType::Value inPropType)
+{
+ QT3DSDM_DEBUG_LOG("CSimpleDataCore::AddPropertyWithHandle Enter");
+ QT3DSDM_DEBUG_LOG(m_StringTable->GetNarrowStr(inName));
+ if (HandleValid(inHandle)) {
+ if (g_DataModelDebugLogger) {
+ g_DataModelDebugLogger("CSimpleDataCore::AddPropertyWithHandle Handle Exists!!");
+ char buf[32];
+ sprintf(buf, "%d", inHandle);
+ g_DataModelDebugLogger(buf);
+ }
+
+ throw HandleExists(L"");
+ }
+
+ TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+
+ Qt3DSDMPropertyDefinition theDefinition(inInstance, SafeStrPtr(inName), inPropType);
+ THandleObjectPtr theHandleObjectPtr(
+ new CDataModelPropertyDefinitionObject(inHandle, theDefinition));
+ const pair<int, THandleObjectPtr> thePair(std::make_pair(inHandle, theHandleObjectPtr));
+ m_Objects.insert(thePair);
+ theInstance->m_Properties.push_back(inHandle);
+ QT3DSDM_DEBUG_LOG("CSimpleDataCore::AddPropertyWithHandle Leave");
+ return inHandle;
+}
+
+bool CSimpleDataCore::GetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ TPropertyPairHash::const_iterator theInstanceProp =
+ theInstance->m_PropertyValues.find(inProperty);
+ if (theInstanceProp != theInstance->m_PropertyValues.end()) {
+ outValue = theInstanceProp->second.second.GetValue();
+ return true;
+ }
+ return false;
+}
+
+void CSimpleDataCore::GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inInstance,
+ TPropertyPairHash &outValues) const
+{
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ outValues = theInstance->m_PropertyValues;
+}
+
+void CSimpleDataCore::UncheckedSetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue,
+ PropertyValueFlags inIsUserSet)
+{
+ TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ TPropertyValuePair theValuePair(inIsUserSet, SInternValue(inValue, GetStringTable()));
+
+ std::pair<TPropertyPairHash::iterator, bool> theInsert = theInstance->m_PropertyValues.insert(
+ std::make_pair(inProperty.GetHandleValue(), theValuePair));
+ if (theInsert.second == false)
+ theInsert.first->second = theValuePair;
+}
+
+bool CSimpleDataCore::CheckParentPropertyExistenceWithFail(const TDataModelInstancePtr inInstance,
+ int inProperty,
+ const THandleObjectMap &inObjects)
+{
+ if (find(inInstance->m_Properties.begin(), inInstance->m_Properties.end(), inProperty)
+ != inInstance->m_Properties.end())
+ return true;
+ for (CDataModelInstance::TInstancePairList::const_iterator theParent =
+ inInstance->m_Parents.begin();
+ theParent != inInstance->m_Parents.end(); ++theParent) {
+ if (CheckParentPropertyExistenceWithFail(theParent->second, inProperty, inObjects))
+ return true;
+ }
+ return false;
+}
+
+// safety check to see if property exists
+void CSimpleDataCore::CheckPropertyExistence(const TDataModelInstancePtr inInstance, int inProperty,
+ const THandleObjectMap &inObjects)
+{
+ if (!CheckParentPropertyExistenceWithFail(inInstance, inProperty, inObjects))
+ throw PropertyNotFound(L"");
+}
+
+bool CSimpleDataCore::IsInstanceOrDerivedFromHelper(const TDataModelInstancePtr inInstance,
+ Qt3DSDMInstanceHandle inParent) const
+{
+ if (inInstance->m_Handle == inParent) // Am I this object?
+ return true;
+ return inInstance->IsDerivedFrom(inParent);
+}
+
+bool CSimpleDataCore::IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const
+{
+ if (IsInstance(inInstance) == false || IsInstance(inParent) == false)
+ return false;
+ if (inInstance == inParent) // Am I this object?
+ return true;
+ const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects);
+ return IsInstanceOrDerivedFromHelper(theInstance, inParent);
+}
+}
diff --git a/src/dm/systems/cores/SimpleDataCore.h b/src/dm/systems/cores/SimpleDataCore.h
new file mode 100644
index 0000000..2664dab
--- /dev/null
+++ b/src/dm/systems/cores/SimpleDataCore.h
@@ -0,0 +1,373 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef DATACOREH
+#define DATACOREH
+
+#include "Qt3DSDMDataTypes.h"
+#include "Qt3DSDMSignals.h"
+#include "HandleSystemBase.h"
+#include "Qt3DSDMPropertyDefinition.h"
+#include "Qt3DSDMDataCore.h"
+#include "Qt3DSDMStringTable.h"
+#include <unordered_set>
+#include "Qt3DSDMValue.h"
+
+namespace qt3dsdm {
+
+struct PropertyValueFlags
+{
+ enum Enum {
+ // Property values that are set via event propagation should
+ // not be serialized to a file. The auto-propagation step
+ // is meant to make looking up property values quicker because
+ // the the derivation chain doesn't need to be followed to get
+ // the latest default value.
+ SetViaAutoPropagate = 1,
+ };
+
+ int m_Flags;
+
+ PropertyValueFlags()
+ : m_Flags(0)
+ {
+ }
+ explicit PropertyValueFlags(int inFlags)
+ : m_Flags(inFlags)
+ {
+ }
+
+ bool IsSetViaAutoPropagation() const { return (m_Flags & SetViaAutoPropagate) > 0; }
+};
+
+// Pair of property value flags and property value. The property value flags allow
+// us to track metadata that is
+typedef std::pair<PropertyValueFlags, SInternValue> TPropertyValuePair;
+typedef std::unordered_map<int, TPropertyValuePair> TPropertyPairHash;
+// Property pairs are referred to by property handle.
+typedef std::pair<int, TPropertyValuePair> TPropertyPair;
+typedef std::vector<TPropertyPair> TPropertyPairList;
+
+class CDataModelPropertyDefinitionObject : public CHandleObject
+{
+public:
+ Qt3DSDMPropertyDefinition m_Definition;
+
+ CDataModelPropertyDefinitionObject(int inHandle, const Qt3DSDMPropertyDefinition &inDefinition)
+ : CHandleObject(inHandle)
+ , m_Definition(inDefinition)
+ {
+ }
+ CDataModelPropertyDefinitionObject() {}
+
+ static const EHandleObjectType s_Type =
+ CHandleObject::EHandleObjectTypeCDataModelPropertyDefinitionObject;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+typedef std::unordered_map<int, SInternValue> TIntStringVariantList;
+
+class CDataModelInstance : public CHandleObject
+{
+public:
+ typedef std::pair<int, std::shared_ptr<CDataModelInstance>> TInstancePair;
+ typedef std::unordered_map<int, std::shared_ptr<CDataModelInstance>> TInstancePairList;
+ typedef std::unordered_map<int, bool> TInstanceParentMap;
+
+ TInstancePairList m_Parents;
+ mutable TInstanceParentMap m_CachedParents;
+ // Properties specific to this class
+ TIntList m_Properties;
+ TPropertyPairHash m_PropertyValues;
+
+ CDataModelInstance() {}
+ CDataModelInstance(int inHandle)
+ : CHandleObject(inHandle)
+ {
+ }
+
+ void ToPropertyPairList(TPropertyPairList &outList) const
+ {
+ for (TPropertyPairHash::const_iterator iter = m_PropertyValues.begin(),
+ end = m_PropertyValues.end();
+ iter != end; ++iter)
+ outList.push_back(*iter);
+ }
+
+ void FromPropertyPairList(const TPropertyPairList &inList)
+ {
+ m_PropertyValues.clear();
+ for (TPropertyPairList::const_iterator iter = inList.begin(), end = inList.end();
+ iter != end; ++iter)
+ m_PropertyValues.insert(*iter);
+ }
+
+ void ClearParentCache() const { m_CachedParents.clear(); }
+
+ bool IsDerivedFrom(Qt3DSDMInstanceHandle inParent) const
+ {
+ std::pair<TInstanceParentMap::iterator, bool> theQueryResult =
+ m_CachedParents.insert(std::make_pair(inParent.GetHandleValue(), false));
+ // If the insert failed, returned what the hashtable already had in it
+ if (theQueryResult.second == false)
+ return theQueryResult.first->second;
+
+ // Else find a valid answer
+ if (m_Parents.find(inParent.GetHandleValue()) != m_Parents.end()) {
+ theQueryResult.first->second = true;
+ } else {
+ for (TInstancePairList::const_iterator iter = m_Parents.begin(), end = m_Parents.end();
+ iter != end; ++iter) {
+ if (iter->second->IsDerivedFrom(inParent)) {
+ theQueryResult.first->second = true;
+ break;
+ }
+ }
+ }
+
+ // Note that we inserted false to begin with. This means that
+ // we can return the insert result here safely as if it wasn't
+ // supposed to be false, we would have set it above.
+ return theQueryResult.first->second;
+ }
+
+ void RemoveCachedValues()
+ {
+ vector<int> theCachedProperties;
+
+ for (TPropertyPairHash::iterator theProperty = m_PropertyValues.begin(),
+ end = m_PropertyValues.end();
+ theProperty != end; ++theProperty) {
+ if (theProperty->second.first.IsSetViaAutoPropagation())
+ theCachedProperties.push_back(theProperty->first);
+ }
+
+ for (size_t idx = 0, end = theCachedProperties.size(); idx < end; ++idx)
+ m_PropertyValues.erase(theCachedProperties[idx]);
+ }
+
+ // CHandleObject
+ static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeCDataModelInstance;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+typedef std::shared_ptr<CDataModelInstance> TDataModelInstancePtr;
+
+class CSimpleDataCore : public CHandleBase, public IDataCore
+{
+ mutable TStringTablePtr m_StringTable;
+
+public:
+ CSimpleDataCore(TStringTablePtr strTable)
+ : m_StringTable(strTable)
+ {
+ }
+ CSimpleDataCore(const CSimpleDataCore &inOther)
+ : CHandleBase(inOther)
+ , m_StringTable(inOther.m_StringTable)
+ {
+ }
+
+ CSimpleDataCore &operator=(const CSimpleDataCore &inOther)
+ {
+ CHandleBase::operator=(inOther);
+ return *this;
+ }
+
+ IStringTable &GetStringTable() const override { return *m_StringTable.get(); }
+ TStringTablePtr GetStringTablePtr() const override { return m_StringTable; }
+
+ // IHandleBase
+ bool HandleValid(int inHandle) const override
+ {
+ return m_Objects.find(inHandle) != m_Objects.end();
+ }
+
+ // IInstancePropertyCore
+ Qt3DSDMPropertyHandle GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance,
+ const TCharStr &inStr) const override;
+ void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const override;
+ void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle,
+ TPropertyHandleValuePairList &outValues) override;
+ bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ void CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) const override;
+ bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+ void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+
+ // IDataCore
+ //===============================================================
+ Qt3DSDMInstanceHandle CreateInstance(Qt3DSDMInstanceHandle hdl = Qt3DSDMInstanceHandle()) override;
+ void DeleteInstance(Qt3DSDMInstanceHandle inHandle) override;
+ void GetInstances(TInstanceHandleList &outInstances) const override;
+ void GetInstancesDerivedFrom(TInstanceHandleList &outInstances,
+ Qt3DSDMInstanceHandle inParentHandle) const override;
+
+ void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) override;
+ void GetInstanceParents(Qt3DSDMInstanceHandle inHandle,
+ TInstanceHandleList &outParents) const override;
+ // Returns true if inParent == inInstance || inInstance is derived from inParent somehow.
+ // Recursive.
+ bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMInstanceHandle inParent) const override;
+
+ Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inClass, TCharPtr inName,
+ DataModelDataType::Value inPropType) override;
+ const Qt3DSDMPropertyDefinition &GetProperty(Qt3DSDMPropertyHandle inProperty) const override;
+ void GetInstanceProperties(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleList &outProperties) const override;
+ void RemoveProperty(Qt3DSDMPropertyHandle inProperty) override;
+ void CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance,
+ Qt3DSDMInstanceHandle inDestInstance) override;
+ void RemoveCachedValues(Qt3DSDMInstanceHandle inInstance) override;
+
+ bool IsInstance(int inHandle) const override;
+ bool IsProperty(int inHandle) const override;
+ //===============================================================
+
+ bool GetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const;
+ void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inInstance,
+ TPropertyPairHash &outValues) const;
+
+ static CDataModelPropertyDefinitionObject *GetPropertyDefinitionNF(int inHandle,
+ THandleObjectMap &inObjects)
+ {
+ return const_cast<CDataModelPropertyDefinitionObject *>(
+ GetPropertyDefinitionNF(inHandle, static_cast<const THandleObjectMap &>(inObjects)));
+ }
+
+ static const CDataModelPropertyDefinitionObject *
+ GetPropertyDefinitionNF(int inHandle, const THandleObjectMap &inObjects)
+ {
+ const CDataModelPropertyDefinitionObject *theClass =
+ GetHandleObject<CDataModelPropertyDefinitionObject>(inHandle, inObjects);
+ if (theClass)
+ return theClass;
+ throw PropertyNotFound(L"");
+ }
+
+ static TDataModelInstancePtr GetInstance(int inHandle, const THandleObjectMap &inObjects)
+ {
+ THandleObjectMap::const_iterator theFind(inObjects.find(inHandle));
+ // dynamic cast isn't allowed in runtime code as the runtime doesn't enable rtti.
+ if (theFind != inObjects.end())
+ return std::static_pointer_cast<CDataModelInstance>(theFind->second);
+ return TDataModelInstancePtr();
+ }
+
+ static TDataModelInstancePtr GetInstanceNF(int inHandle, const THandleObjectMap &inObjects)
+ {
+ TDataModelInstancePtr retval = GetInstance(inHandle, inObjects);
+ if (retval)
+ return retval;
+ throw InstanceNotFound(L"");
+ }
+
+ static inline bool InstancePairMatches(int inHandle,
+ const CDataModelInstance::TInstancePair &inInstancePair)
+ {
+ return inHandle == inInstancePair.first;
+ }
+
+ // if inInstance doesn't exists in inObjects, it will push back NULL instead of throwing
+ // exception
+ static inline void UncheckAddInstancePair(CDataModelInstance::TInstancePairList &outInstances,
+ Qt3DSDMInstanceHandle inInstance,
+ THandleObjectMap &inObjects)
+ {
+ outInstances.insert(
+ std::make_pair(inInstance, CSimpleDataCore::GetInstance(inInstance, inObjects)));
+ }
+
+ static inline bool InstancePropertyMatches(int inProp, const TPropertyPair &inPropPair)
+ {
+ return inProp == inPropPair.first;
+ }
+
+ static bool CheckParentPropertyExistenceWithFail(const TDataModelInstancePtr inInstance,
+ int inProperty,
+ const THandleObjectMap &inObjects);
+
+ static void CheckPropertyExistence(const TDataModelInstancePtr inInstance, int inProperty,
+ const THandleObjectMap &inObjects);
+
+ static inline void FindRelatedItemsForDelete(int inInstance, TIntList &outProperties,
+ TIntList &outChildInstances,
+ const std::pair<int, THandleObjectPtr> &inPair)
+ {
+
+ using namespace std;
+ if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeCDataModelInstance) {
+ TDataModelInstancePtr theInstance =
+ static_pointer_cast<CDataModelInstance>(inPair.second);
+ // No longer a parent class.
+ if (find_if(theInstance->m_Parents.begin(), theInstance->m_Parents.end(),
+ std::bind(InstancePairMatches, inInstance, std::placeholders::_1))
+ != theInstance->m_Parents.end())
+ outChildInstances.push_back(inPair.first);
+ } else if (inPair.second->GetType()
+ == CHandleObject::EHandleObjectTypeCDataModelPropertyDefinitionObject) {
+ const CDataModelPropertyDefinitionObject *theProperty =
+ static_cast<const CDataModelPropertyDefinitionObject *>(inPair.second.get());
+ if (theProperty->m_Definition.m_Instance.GetHandleValue() == inInstance)
+ outProperties.push_back(inPair.first);
+ }
+ }
+
+protected:
+ bool IsInstanceOrDerivedFromHelper(const TDataModelInstancePtr inInstance,
+ Qt3DSDMInstanceHandle inParent) const;
+ void AddInstanceIfDerivedFrom(const std::pair<int, THandleObjectPtr> &inItem,
+ TInstanceHandleList &outInstances,
+ Qt3DSDMInstanceHandle inParentHandle) const;
+
+ bool GetInstancePropertyValueHelper(const TDataModelInstancePtr inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const;
+
+ // Create an instance *at* this specific handle position
+ // This is used for special cases of serialization
+ Qt3DSDMInstanceHandle CreateInstanceWithHandle(int inHandle);
+ Qt3DSDMPropertyHandle AddPropertyWithHandle(int inHandle, Qt3DSDMInstanceHandle inClass,
+ TCharPtr inName, DataModelDataType::Value inPropType);
+
+ void UncheckedSetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue,
+ PropertyValueFlags inIsUserSet);
+};
+
+typedef std::shared_ptr<CSimpleDataCore> TSimpleDataCorePtr;
+}
+
+#endif
diff --git a/src/dm/systems/cores/SimpleSlideCore.cpp b/src/dm/systems/cores/SimpleSlideCore.cpp
new file mode 100644
index 0000000..87eadb9
--- /dev/null
+++ b/src/dm/systems/cores/SimpleSlideCore.cpp
@@ -0,0 +1,420 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "SimpleSlideCore.h"
+
+using namespace std;
+#ifdef _WIN32
+#pragma warning(disable : 4503)
+#endif
+
+namespace qt3dsdm {
+
+Qt3DSDMSlideHandle CSimpleSlideCore::CreateSlide(Qt3DSDMInstanceHandle inInstance)
+{
+ int nextId = GetNextId();
+ return CreateSlideWithHandle(nextId, inInstance);
+}
+
+Qt3DSDMInstanceHandle CSimpleSlideCore::GetSlideInstance(Qt3DSDMSlideHandle inSlide) const
+{
+ return GetSlideNF(inSlide, m_Objects)->m_Instance;
+}
+
+inline bool SlideInstanceMatches(const THandleObjectPair &inPair, int inInstance)
+{
+ if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSSlide
+ && static_cast<const SSlide *>(inPair.second.get())->m_Instance == inInstance)
+ return true;
+ return false;
+}
+
+Qt3DSDMSlideHandle CSimpleSlideCore::GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const
+{
+ THandleObjectMap::const_iterator theSlide =
+ find_if(m_Objects.begin(), m_Objects.end(),
+ std::bind(SlideInstanceMatches,
+ std::placeholders::_1, inInstance.GetHandleValue()));
+ if (theSlide != m_Objects.end())
+ return theSlide->first;
+ throw SlideNotFound(L"");
+}
+
+void RecurseDeleteSlide(Qt3DSDMSlideHandle inSlide, THandleObjectMap &inObjects,
+ TInstanceHandleList &outInstances)
+{
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, inObjects);
+ do_all(theSlide->m_Children,
+ std::bind(RecurseDeleteSlide, std::placeholders::_1,
+ std::ref(inObjects), std::ref(outInstances)));
+ outInstances.push_back(theSlide->m_Instance);
+ CHandleBase::EraseHandle(inSlide, inObjects);
+}
+
+void CSimpleSlideCore::DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances)
+{
+ SSlide *theSlide = GetSlideNF(inSlide, m_Objects);
+ if (theSlide->m_Parent) {
+ SSlide *theParent = GetSlideNF(theSlide->m_Parent, m_Objects);
+ erase_if(theParent->m_Children, std::bind(equal_to<int>(), theSlide->m_Handle,
+ std::placeholders::_1));
+ }
+ RecurseDeleteSlide(inSlide, m_Objects, outInstances);
+}
+
+template <typename TDataType, typename TVectorType>
+inline void MaybeAddObject(const THandleObjectPair &inPair, vector<TVectorType> &outVectorItems)
+{
+ if (inPair.second->GetType() == TDataType::s_Type)
+ outVectorItems.push_back(inPair.first);
+}
+
+void CSimpleSlideCore::GetSlides(TSlideHandleList &outSlides) const
+{
+ do_all(m_Objects,
+ std::bind(MaybeAddObject<SSlide, Qt3DSDMSlideHandle>,
+ std::placeholders::_1, std::ref(outSlides)));
+}
+
+float CSimpleSlideCore::GetSlideTime(Qt3DSDMSlideHandle inSlide) const
+{
+ return GetSlideNF(inSlide, m_Objects)->m_Time;
+}
+
+void CSimpleSlideCore::SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime)
+{
+ GetSlideNF(inSlide, m_Objects)->m_Time = inNewTime;
+}
+
+void CSimpleSlideCore::DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent,
+ int inIndex)
+{
+ int oldParent = GetSlideNF(inSlide, m_Objects)->m_Parent;
+ if (oldParent)
+ erase_if(GetSlideNF(oldParent, m_Objects)->m_Children,
+ std::bind(equal_to<int>(), inSlide, std::placeholders::_1));
+ if (inParent.Valid()) {
+ SSlide *theParent = GetSlideNF(inParent, m_Objects);
+ if (exists(theParent->m_Children, std::bind(equal_to<int>(), inSlide,
+ std::placeholders::_1)))
+ throw SlideDerivationError(L"Already derived");
+ if (inIndex < 0 || inIndex >= (int)theParent->m_Children.size())
+ inIndex = (int)theParent->m_Children.size();
+ theParent->m_Children.insert(theParent->m_Children.begin() + inIndex,
+ inSlide.GetHandleValue());
+ }
+ GetSlideNF(inSlide, m_Objects)->m_Parent = inParent;
+}
+
+Qt3DSDMSlideHandle CSimpleSlideCore::GetParentSlide(Qt3DSDMSlideHandle inSlide) const
+{
+ return GetSlideNF(inSlide, m_Objects)->m_Parent;
+}
+
+void CSimpleSlideCore::GetChildSlides(Qt3DSDMSlideHandle inSlide,
+ TSlideHandleList &outChildren) const
+{
+ transformv_all(GetSlideNF(inSlide, m_Objects)->m_Children, outChildren);
+}
+
+int CSimpleSlideCore::GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const
+{
+ const SSlide *theSlide = GetSlideNF(inParent, m_Objects);
+ size_t dist = distance(theSlide->m_Children.begin(),
+ find_if<TIntList::const_iterator>(
+ theSlide->m_Children, std::bind(equal_to<int>(), inChild,
+ std::placeholders::_1)));
+ if (dist == theSlide->m_Children.size())
+ throw SlideChildNotFoundError(L"");
+ return (int)dist;
+}
+
+bool CSimpleSlideCore::GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ const SSlide *theSlide = GetSlideNF(inSlide, m_Objects);
+ SInternValue *theValue = theSlide->GetInstancePropertyValue(inHandle, inProperty);
+ if (theValue) {
+ outValue = theValue->GetValue();
+ return true;
+ }
+ if (theSlide->m_Parent)
+ return GetInstancePropertyValue(theSlide->m_Parent, inHandle, inProperty, outValue);
+ return false;
+}
+
+std::pair<SSlide *, SInternValue *> CSimpleSlideCore::ResolveSetInstancePropertyValue(
+ Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, Qt3DSDMPropertyHandle inProperty)
+{
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Objects);
+ SInternValue *theValue = theSlide->GetInstancePropertyValue(inHandle, inProperty);
+ // If we have the value already *or* or parent is not a valid slide, then return now
+ if (theValue || theSlide->m_Parent == 0)
+ return std::make_pair(theSlide, theValue);
+ // Else give our parent a chance.
+ return ResolveSetInstancePropertyValue(theSlide->m_Parent, inHandle, inProperty);
+}
+
+void CSimpleSlideCore::SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ std::pair<SSlide *, SInternValue *> theTarget(
+ ResolveSetInstancePropertyValue(inSlide, inHandle, inProperty));
+ SInternValue theValue(inValue, GetStringTable());
+ if (theTarget.second)
+ *theTarget.second = theValue;
+ else
+ theTarget.first->SetInstancePropertyValue(inHandle, inProperty, theValue);
+}
+
+void CSimpleSlideCore::ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ CSimpleSlideCore::ForceSetPropertyValue(GetStringTable(), m_Objects, inSlide, inHandle,
+ inProperty, inValue);
+}
+
+void CSimpleSlideCore::forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ for (auto &it : m_Objects) {
+ if (it.second->GetType() == SSlide::s_Type) {
+ Qt3DSDMSlideHandle slide(it.first);
+ ForceSetInstancePropertyValue(slide, inInstance, inProperty, inValue);
+ }
+ }
+}
+
+bool CSimpleSlideCore::GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ const SSlide *theSlide = GetSlideNF(inSlide, m_Objects);
+ SInternValue *theValue = theSlide->GetInstancePropertyValue(inInstance, inProperty);
+ if (theValue) {
+ outValue = theValue->GetValue();
+ return true;
+ }
+ return false;
+}
+
+void CSimpleSlideCore::GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleValuePairList &outValues)
+{
+ const SSlide *theSlide = GetSlideNF(inSlide, m_Objects);
+ theSlide->GetSpecificInstancePropertyValues(inInstance, outValues);
+}
+
+void CSimpleSlideCore::GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide,
+ TSlideEntryList &outEntries) const
+{
+ const SSlide *theSlide = GetSlideNF(inSlide, m_Objects);
+ theSlide->ToSlideEntryList(outEntries);
+}
+
+bool CSimpleSlideCore::ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ const SSlide *theSlide = GetSlideNF(inSlide, m_Objects);
+ return theSlide->GetInstancePropertyValue(inHandle, inProperty) != NULL;
+}
+
+Qt3DSDMSlideHandle CSimpleSlideCore::CreateSlideWithHandle(int inHandle,
+ Qt3DSDMInstanceHandle inInstance)
+{
+ if (HandleValid(inHandle))
+ throw HandleExists(L"");
+ m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SSlide(inHandle, inInstance)));
+ return inHandle;
+}
+
+void CSimpleSlideCore::GetSlideProperties(Qt3DSDMSlideHandle inSlide,
+ TSlideEntryList &outProperties) const
+{
+ outProperties.clear();
+ GetSlidePropertyEntries(inSlide, outProperties);
+}
+
+bool CSimpleSlideCore::IsSlide(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_Objects.find(inSlide) != m_Objects.end();
+}
+
+void CSimpleSlideCore::ForceSetPropertyValue(IStringTable &inStringTable,
+ THandleObjectMap &inObjects, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue)
+{
+ CSimpleSlideCore::GetSlideNF(inSlide, inObjects)
+ ->SetInstancePropertyValue(inHandle, inProperty, SInternValue(inValue, inStringTable));
+}
+
+void CSimpleSlideCore::PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ ForceSetPropertyValue(GetStringTable(), m_Objects, inParent, inHandle, inProperty, inValue);
+ do_all(CSimpleSlideCore::GetSlideNF(inParent, m_Objects)->m_Children,
+ std::bind(ForceSetPropertyValue, std::ref(GetStringTable()), std::ref(m_Objects),
+ std::placeholders::_1, inHandle, inProperty, inValue));
+}
+
+inline void AddIntersectingEntry(TSlideEntryList &outEntries, Qt3DSDMInstanceHandle inst,
+ Qt3DSDMPropertyHandle prop, const SInternValue &inValue)
+{
+ outEntries.push_back(TSlideEntry(inst, prop, inValue.GetValue()));
+}
+
+void CSimpleSlideCore::GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1,
+ Qt3DSDMSlideHandle inSlide2,
+ TSlideEntryList &outEntries) const
+{
+ const SSlide *theSlide1 = GetSlideNF(inSlide1, m_Objects);
+ const SSlide *theSlide2 = GetSlideNF(inSlide2, m_Objects);
+ theSlide1->IntersectProperties(
+ *theSlide2, std::bind(AddIntersectingEntry, std::ref(outEntries),
+ std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3));
+}
+
+void CSimpleSlideCore::PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1,
+ Qt3DSDMSlideHandle inSlide2,
+ Qt3DSDMSlideHandle inDestination)
+{
+ const SSlide *theSlide1 = GetSlideNF(inSlide1, m_Objects);
+ const SSlide *theSlide2 = GetSlideNF(inSlide2, m_Objects);
+ SSlide *theDest = GetSlideNF(inDestination, m_Objects);
+ theSlide1->IntersectProperties(
+ *theSlide2, std::bind(&SSlide::SetInstancePropertyValue, theDest,
+ std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3));
+}
+
+void CSimpleSlideCore::ClearPropertyValue(THandleObjectMap &inObjects, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ CSimpleSlideCore::GetSlideNF(inSlide, inObjects)
+ ->RemoveInstancePropertyValue(inInstance, inProperty);
+}
+
+inline void DoForEachSlide(std::pair<int, THandleObjectPtr> inObject,
+ std::function<void(SSlide *)> inFunction)
+{
+ inFunction((SSlide *)inObject.second.get());
+}
+
+void CSimpleSlideCore::ForEachSlide(std::function<void(SSlide *)> inFunction)
+{
+ do_all(m_Objects, std::bind(DoForEachSlide, std::placeholders::_1, inFunction));
+}
+
+void LookupSlideAndDoSomething(Qt3DSDMSlideHandle inSlide, THandleObjectMap &inObjects,
+ std::function<void(SSlide *)> inFunction)
+{
+ inFunction(CSimpleSlideCore::GetSlideNF(inSlide, inObjects));
+}
+
+void CSimpleSlideCore::ForEachChild(Qt3DSDMSlideHandle inParent,
+ std::function<void(SSlide *)> inFunction)
+{
+ do_all(GetSlideNF(inParent, m_Objects)->m_Children,
+ std::bind(LookupSlideAndDoSomething, std::placeholders::_1, m_Objects, inFunction));
+}
+
+bool InstanceMatches(Qt3DSDMInstanceHandle inTarget, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle)
+{
+ return inTarget == inHandle;
+}
+
+bool PropertyMatches(Qt3DSDMPropertyHandle inTarget, Qt3DSDMInstanceHandle,
+ Qt3DSDMPropertyHandle inProp)
+{
+ return inTarget == inProp;
+}
+
+bool InstancePropertyMatchesVector(const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties,
+ Qt3DSDMInstanceHandle slideInst, Qt3DSDMPropertyHandle slideProp)
+{
+ return std::find(inInstances.begin(), inInstances.end(), slideInst) != inInstances.end()
+ && std::find(inProperties.begin(), inProperties.end(), slideProp) != inProperties.end();
+}
+
+bool InstancePropertyMatches(const Qt3DSDMInstanceHandle inInstance,
+ const Qt3DSDMPropertyHandle inProperty, Qt3DSDMInstanceHandle slideInst,
+ Qt3DSDMPropertyHandle slideProp)
+{
+ return inInstance == slideInst && inProperty == slideProp;
+}
+
+void CSimpleSlideCore::DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle)
+{
+ std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate(
+ std::bind(InstanceMatches, inHandle, std::placeholders::_1, std::placeholders::_2));
+ ForEachSlide(std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate));
+}
+
+void CSimpleSlideCore::DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle)
+{
+ std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate(
+ std::bind(PropertyMatches, inHandle, std::placeholders::_1, std::placeholders::_2));
+ ForEachSlide(std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate));
+}
+
+void CSimpleSlideCore::DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties)
+{
+ std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate(
+ std::bind(InstancePropertyMatchesVector, inInstances, inProperties,
+ std::placeholders::_1, std::placeholders::_2));
+ ForEachSlide(std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate));
+}
+
+void CSimpleSlideCore::ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate(
+ std::bind(InstancePropertyMatches, inHandle, inProperty,
+ std::placeholders::_1, std::placeholders::_2));
+ ForEachChild(inParent, std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate));
+}
+}
diff --git a/src/dm/systems/cores/SimpleSlideCore.h b/src/dm/systems/cores/SimpleSlideCore.h
new file mode 100644
index 0000000..278ef77
--- /dev/null
+++ b/src/dm/systems/cores/SimpleSlideCore.h
@@ -0,0 +1,408 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef SLIDECOREH
+#define SLIDECOREH
+#include "HandleSystemBase.h"
+#include "Qt3DSDMSlideCore.h"
+#include "SimpleDataCore.h"
+#include "Qt3DSDMStringTable.h"
+#include <unordered_map>
+#include <QtCore/qdebug.h>
+
+namespace std {
+
+template<> struct hash<std::pair<int,int> >
+{
+ typedef std::pair<int,int> argument_type;
+ typedef std::size_t result_type;
+ result_type operator()(std::pair<int,int> const& pa) const
+ {
+ result_type const h1 ( std::hash<int>{}(pa.first) );
+ result_type const h2 ( std::hash<int>{}(pa.second) );
+ return h1 ^ (h2 << 1);
+ }
+};
+
+}
+
+namespace qt3dsdm {
+
+// The first revision of this
+typedef std::pair<int, int> TSlideInstancePropertyPair;
+typedef std::unordered_map<TSlideInstancePropertyPair, SInternValue > TSlideEntryHash;
+
+using std::make_pair;
+
+// Abstract access to these objects a little bit because in the future we are going to
+// reorganize the data such that getting a defined set of properties for a single instance is
+// very fast.
+struct SSlide : public CHandleObject
+{
+ SSlide()
+ : m_Instance(0)
+ , m_Parent(0)
+ {
+ }
+ SSlide(int inHandle, int inInstance)
+ : CHandleObject(inHandle)
+ , m_Instance(inInstance)
+ , m_Parent(0)
+ , m_Time(0)
+ {
+ }
+ int m_Instance;
+ int m_Parent;
+ TIntList m_Children;
+ TSlideEntryHash m_Properties;
+ float m_Time;
+
+ // Returns true if it was inserted, false if the property value was set.
+ bool SetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty,
+ const SInternValue &inValue)
+ {
+ TSlideInstancePropertyPair theKey(inInstance.GetHandleValue(), inProperty.GetHandleValue());
+ std::pair<TSlideEntryHash::iterator, bool> insertResult =
+ m_Properties.insert(std::make_pair(theKey, inValue));
+
+ if (insertResult.second == false)
+ insertResult.first->second = inValue;
+ return insertResult.second;
+ }
+ // Returns true if the property was deleted
+ bool RemoveInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty)
+ {
+ TSlideInstancePropertyPair theKey(inInstance.GetHandleValue(), inProperty.GetHandleValue());
+ TSlideEntryHash::iterator find(m_Properties.find(theKey));
+ if (find != m_Properties.end()) {
+ m_Properties.erase(find);
+ return true;
+ }
+ return false;
+ }
+ // Return a pointer to out property value. This allows quicker checks for isset and such
+ SInternValue *GetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty) const
+ {
+ TSlideInstancePropertyPair theKey(inInstance.GetHandleValue(), inProperty.GetHandleValue());
+ TSlideEntryHash::const_iterator find(m_Properties.find(theKey));
+ if (find != m_Properties.end())
+ return const_cast<SInternValue *>(&find->second);
+ return NULL;
+ }
+
+ void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleValuePairList &outProperties) const
+ {
+ for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(),
+ theEnd = m_Properties.end();
+ theIter != theEnd; ++theIter) {
+ if (theIter->first.first == inInstance)
+ outProperties.push_back(
+ make_pair(theIter->first.second, theIter->second.GetValue()));
+ }
+ }
+
+ bool HasProperty(std::function<bool(const TSlideEntry &)> inPredicate) const
+ {
+ for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(),
+ theEnd = m_Properties.end();
+ theIter != theEnd; ++theIter) {
+ if (inPredicate(TSlideEntry(theIter->first.first, theIter->first.second,
+ theIter->second.GetValue())))
+ return true;
+ }
+ return false;
+ }
+
+ void DeleteSlideEntries(TSlideEntryList &outList,
+ std::function<bool(const TSlideEntry &)> inPredicate)
+ {
+ for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(),
+ theEnd = m_Properties.end();
+ theIter != theEnd; ++theIter) {
+ if (inPredicate(TSlideEntry(theIter->first.first, theIter->first.second,
+ theIter->second.GetValue()))) {
+ outList.push_back(TSlideEntry(theIter->first.first, theIter->first.second,
+ theIter->second.GetValue()));
+ }
+ }
+ DeleteEntriesFromList(outList);
+ }
+
+ void DeleteEntriesFromList(const TSlideEntryList &inList)
+ {
+ for (size_t idx = 0, end = inList.size(); idx < end; ++idx)
+ m_Properties.erase(
+ std::pair<int, int>(std::get<0>(inList[idx]), std::get<1>(inList[idx])));
+ }
+
+ void InsertSlideEntries(const TSlideEntryList &inList, IStringTable &inStringTable)
+ {
+ for (size_t idx = 0, end = inList.size(); idx < end; ++idx) {
+ TSlideInstancePropertyPair theKey(std::get<0>(inList[idx]), std::get<1>(inList[idx]));
+
+ if (m_Properties.find(theKey) != m_Properties.end()) {
+ // The only known case when this condition happens is when DnD a sub-presentation to
+ // the scene as a texture rect then undoing.
+ qWarning() << __FUNCTION__ << ": Instance/Property Pair" << theKey
+ << "already exists, erasing it.";
+ m_Properties.erase(theKey);
+ }
+
+ m_Properties.insert(
+ std::make_pair(theKey, SInternValue(std::get<2>(inList[idx]), inStringTable)));
+ }
+ }
+
+ // Convert to the older, straight forward representation of the
+ // data in this slide.
+ void ToSlideEntryList(TSlideEntryList &outList) const
+ {
+ for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(),
+ theEnd = m_Properties.end();
+ theIter != theEnd; ++theIter)
+ outList.push_back(TSlideEntry(theIter->first.first, theIter->first.second,
+ theIter->second.GetValue()));
+ }
+
+ void FromSlideEntryList(const TSlideEntryList &inList, IStringTable &inStringTable)
+ {
+ using namespace std;
+ m_Properties.clear();
+ for (TSlideEntryList::const_iterator theIter = inList.begin(), theEnd = inList.end();
+ theIter != theEnd; ++theIter)
+ SetInstancePropertyValue(get<0>(*theIter), get<1>(*theIter),
+ SInternValue(get<2>(*theIter), inStringTable));
+ }
+
+ // result is the instance, property, myvalue, othervalue
+ void IntersectProperties(const SSlide &inOther,
+ std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ SInternValue, SInternValue)>
+ inResult) const
+ {
+ for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(),
+ theEnd = m_Properties.end();
+ theIter != theEnd; ++theIter) {
+ SInternValue *otherValue =
+ inOther.GetInstancePropertyValue(theIter->first.first, theIter->first.second);
+ if (otherValue)
+ inResult(theIter->first.first, theIter->first.second, theIter->second, *otherValue);
+ }
+ }
+
+ // Call the predicate, if it returns true set the property for all properties.
+ // This allows a third party to manipulate the property values during the process.
+ void SetPropertyValuesIf(
+ IStringTable &inStringTable,
+ std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, SValue &)> inPredIntercept)
+ {
+ for (TSlideEntryHash::iterator theIter = m_Properties.begin(), theEnd = m_Properties.end();
+ theIter != theEnd; ++theIter) {
+ SValue theValue(theIter->second.GetValue());
+ if (inPredIntercept(theIter->first.first, theIter->first.second, theValue))
+ theIter->second = SInternValue(theValue, inStringTable);
+ }
+ }
+
+ void
+ ClearPropertiesIf(std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> inPredicate)
+ {
+ bool foundOne;
+ do {
+ foundOne = false;
+ for (TSlideEntryHash::iterator theIter = m_Properties.begin(),
+ theEnd = m_Properties.end();
+ theIter != theEnd; ++theIter) {
+ if (inPredicate(theIter->first.first, theIter->first.second)) {
+ foundOne = true;
+ m_Properties.erase(theIter->first);
+ break;
+ }
+ }
+
+ } while (foundOne);
+ }
+
+ static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSSlide;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+class CSimpleSlideCore : public CHandleBase, public ISlideCore
+{
+ TStringTablePtr m_StringTable;
+
+public: // use
+ CSimpleSlideCore(TStringTablePtr inStrTable)
+ : m_StringTable(inStrTable)
+ {
+ }
+
+ TStringTablePtr GetStringTablePtr() const override { return m_StringTable; }
+ IStringTable &GetStringTable() const override { return *m_StringTable.get(); }
+ Qt3DSDMSlideHandle CreateSlide(Qt3DSDMInstanceHandle inInstance) override;
+ Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const override;
+ Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const override;
+ void DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) override;
+ void GetSlides(TSlideHandleList &outSlides) const override;
+
+ float GetSlideTime(Qt3DSDMSlideHandle inSlide) const override;
+ void SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) override;
+
+ void DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, int inIndex = -1) override;
+ Qt3DSDMSlideHandle GetParentSlide(Qt3DSDMSlideHandle inSlide) const override;
+ void GetChildSlides(Qt3DSDMSlideHandle inSlide, TSlideHandleList &outChildren) const override;
+ int GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const override;
+
+ bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+ void SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+
+ // Return the slide this property should be set on, along with the previous value if any.
+ // Set the value on the slide.
+ std::pair<SSlide *, SInternValue *>
+ ResolveSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty);
+ void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+ void forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) override;
+
+ bool GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+
+ void GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleValuePairList &outValues) override;
+
+ void GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide, TSlideEntryList &outEntries) const override;
+
+ void PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+
+ void GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2,
+ TSlideEntryList &outEntries) const override;
+ void PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2,
+ Qt3DSDMSlideHandle inDestination) override;
+
+ void ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) override;
+
+ void DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle) override;
+ void DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) override;
+ void DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties) override;
+
+ bool ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ bool HandleValid(int inHandle) const override { return CHandleBase::HandleValid(inHandle); }
+
+ Qt3DSDMSlideHandle CreateSlideWithHandle(int inHandle, Qt3DSDMInstanceHandle inInstance);
+ void GetSlideProperties(Qt3DSDMSlideHandle inSlide, TSlideEntryList &outProperties) const;
+
+ bool IsSlide(Qt3DSDMSlideHandle inSlide) const override;
+
+ // Possibly alter every slide in the database
+ void ForEachSlide(std::function<void(SSlide *)> inFunction);
+ void ForEachChild(Qt3DSDMSlideHandle inSlide, std::function<void(SSlide *)> inFunction);
+
+ // Only implemented at the producer level, not at this lower level.
+ void CopyProperties(Qt3DSDMSlideHandle /*inSourceSlide*/,
+ Qt3DSDMInstanceHandle /*inSourceInstance*/,
+ Qt3DSDMSlideHandle /*inDestSlide*/, Qt3DSDMInstanceHandle /*inDestInstance*/) override
+ {
+ throw SlideNotFound(L"");
+ }
+
+ static SSlide *GetSlideNF(int inHandle, THandleObjectMap &inObjects)
+ {
+ return const_cast<SSlide *>(
+ GetSlideNF(inHandle, static_cast<const THandleObjectMap &>(inObjects)));
+ }
+
+ static const SSlide *GetSlideNF(int inHandle, const THandleObjectMap &inObjects)
+ {
+ const SSlide *theSlide = GetHandleObject<SSlide>(inHandle, inObjects);
+ if (theSlide)
+ return theSlide;
+ throw SlideNotFound(L"");
+ }
+
+ static inline bool PropertyFound(int inInstance, int inProperty, const TSlideEntry &inEntry)
+ {
+ if (inInstance == std::get<0>(inEntry) && inProperty == std::get<1>(inEntry))
+ return true;
+ return false;
+ }
+
+ static void ForceSetPropertyValue(IStringTable &inStringTable, THandleObjectMap &inObjects,
+ Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue);
+
+ static void ClearPropertyValue(THandleObjectMap &inObjects, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty);
+
+ static inline bool SlideEntryInstanceMatches(const TSlideEntry &inEntry,
+ Qt3DSDMInstanceHandle inHandle)
+ {
+ using namespace std;
+ if (inHandle.GetHandleValue() == get<0>(inEntry))
+ return true;
+ return false;
+ }
+
+ static inline bool SlideEntryPropertyMatches(const TSlideEntry &inEntry,
+ Qt3DSDMPropertyHandle inProperty)
+ {
+ using namespace std;
+ return inProperty.GetHandleValue() == get<1>(inEntry);
+ }
+
+ static inline bool SlideEntryInstancePropertyMatches(const TSlideEntry &inEntry,
+ const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties)
+ {
+ using namespace std;
+ return exists(inInstances, std::bind(equal_to<int>(), get<0>(inEntry),
+ std::placeholders::_1))
+ && exists(inProperties, std::bind(equal_to<int>(), get<1>(inEntry),
+ std::placeholders::_1));
+ }
+};
+
+typedef std::shared_ptr<CSimpleSlideCore> TSimpleSlideCorePtr;
+}
+
+#endif
diff --git a/src/dm/systems/cores/SimpleSlideGraphCore.cpp b/src/dm/systems/cores/SimpleSlideGraphCore.cpp
new file mode 100644
index 0000000..5f1de1e
--- /dev/null
+++ b/src/dm/systems/cores/SimpleSlideGraphCore.cpp
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "SimpleSlideGraphCore.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+Qt3DSDMSlideGraphHandle CSimpleSlideGraphCore::CreateSlideGraph(Qt3DSDMSlideHandle inRoot)
+{
+ int nextId = GetNextId();
+ return CreateSlideGraphWithHandle(nextId, inRoot);
+}
+
+Qt3DSDMSlideHandle CSimpleSlideGraphCore::GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const
+{
+ return GetSlideGraphNF(inGraph, m_Objects)->m_Root;
+}
+
+inline bool RootSlideMatches(const THandleObjectPair &inPair, Qt3DSDMSlideHandle inSlide)
+{
+ const SSlideGraph *theGraph = static_cast<SSlideGraph *>(inPair.second.get());
+ if (theGraph->m_Root == inSlide)
+ return true;
+ return false;
+}
+
+Qt3DSDMSlideGraphHandle CSimpleSlideGraphCore::GetSlideGraph(Qt3DSDMSlideHandle inSlide) const
+{
+ THandleObjectMap::const_iterator theFind = find_if<THandleObjectMap::const_iterator>(
+ m_Objects, std::bind(RootSlideMatches, std::placeholders::_1, inSlide));
+ if (theFind != m_Objects.end())
+ return theFind->first;
+ return 0;
+}
+
+inline Qt3DSDMSlideGraphHandle ToGraphHandle(const THandleObjectPair &inPair)
+{
+ return inPair.first;
+}
+
+void CSimpleSlideGraphCore::GetSlideGraphs(TSlideGraphHandleList &outGraphs) const
+{
+ outGraphs.resize(m_Objects.size());
+ transform(m_Objects.begin(), m_Objects.end(), outGraphs.begin(), ToGraphHandle);
+}
+
+void CSimpleSlideGraphCore::DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle)
+{
+ TSlideInstancePairList theAssociatedInstances;
+ GetAssociatedInstances(inHandle, theAssociatedInstances);
+ for (size_t idx = 0, end = theAssociatedInstances.size(); idx < end; ++idx)
+ DissociateInstance(theAssociatedInstances[idx].second);
+ EraseHandle(inHandle, m_Objects);
+}
+
+void CSimpleSlideGraphCore::AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph,
+ Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance)
+{
+ pair<TInstanceToGraphMap::iterator, bool> theResult =
+ m_InstanceToGraph.insert(make_pair(inInstance, make_pair(inSlideGraph, inSlide)));
+ Q_ASSERT(theResult.second);
+ if (theResult.second == false) {
+ theResult.first->second.first = inSlideGraph;
+ theResult.first->second.second = inSlide;
+ }
+ pair<TGraphToInstanceMap::iterator, bool> theGraphResult =
+ m_GraphToInstances.insert(make_pair(inSlideGraph, TSlideInstancePairList()));
+ insert_unique(theGraphResult.first->second, make_pair(inSlide, inInstance));
+}
+
+void CSimpleSlideGraphCore::GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph,
+ TSlideInstancePairList &outAssociations) const
+{
+ TGraphToInstanceMap::const_iterator theFind = m_GraphToInstances.find(inSlideGraph);
+ if (theFind != m_GraphToInstances.end())
+ outAssociations.insert(outAssociations.end(), theFind->second.begin(),
+ theFind->second.end());
+}
+
+TGraphSlidePair CSimpleSlideGraphCore::GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const
+{
+ TInstanceToGraphMap::const_iterator theResult = m_InstanceToGraph.find(inInstance);
+ if (theResult != m_InstanceToGraph.end())
+ return theResult->second;
+ return TGraphSlidePair();
+}
+
+struct SInstanceMatcher
+{
+ Qt3DSDMInstanceHandle m_Instance;
+ SInstanceMatcher(Qt3DSDMInstanceHandle inInst)
+ : m_Instance(inInst)
+ {
+ }
+ bool operator()(const pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle> &inItem) const
+ {
+ return m_Instance == inItem.second;
+ }
+};
+
+void CSimpleSlideGraphCore::DissociateInstance(Qt3DSDMInstanceHandle inInstance)
+{
+ TGraphSlidePair theAssociatedGraph(GetAssociatedGraph(inInstance));
+
+ TGraphToInstanceMap::iterator theFind = m_GraphToInstances.find(theAssociatedGraph.first);
+ if (theFind != m_GraphToInstances.end()) {
+ erase_if(theFind->second, SInstanceMatcher(inInstance));
+ if (theFind->second.size() == 0)
+ m_GraphToInstances.erase(theAssociatedGraph.first);
+ }
+
+ m_InstanceToGraph.erase(inInstance);
+}
+
+void CSimpleSlideGraphCore::SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph,
+ Qt3DSDMSlideHandle inSlide)
+{
+ GetSlideGraphNF(inGraph, m_Objects)->m_ActiveSlide = inSlide;
+}
+
+Qt3DSDMSlideHandle CSimpleSlideGraphCore::GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const
+{
+ const SSlideGraph *theSlide = GetSlideGraphNF(inGraph, m_Objects);
+ if (theSlide->m_ActiveSlide)
+ return theSlide->m_ActiveSlide;
+ return theSlide->m_Root;
+}
+
+bool CSimpleSlideGraphCore::HandleValid(int inHandle) const
+{
+ return CHandleBase::HandleValid(inHandle);
+}
+
+Qt3DSDMSlideGraphHandle CSimpleSlideGraphCore::CreateSlideGraphWithHandle(int inHandle,
+ Qt3DSDMSlideHandle inRoot)
+{
+ m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SSlideGraph(inHandle, inRoot)));
+ return inHandle;
+}
+}
diff --git a/src/dm/systems/cores/SimpleSlideGraphCore.h b/src/dm/systems/cores/SimpleSlideGraphCore.h
new file mode 100644
index 0000000..484d675
--- /dev/null
+++ b/src/dm/systems/cores/SimpleSlideGraphCore.h
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef SLIDEGRAPHCOREH
+#define SLIDEGRAPHCOREH
+#include "Qt3DSDMStringTable.h"
+#include "Qt3DSDMSlideGraphCore.h"
+#include "HandleSystemBase.h"
+#include "Qt3DSDMErrors.h"
+
+namespace qt3dsdm {
+using namespace std;
+struct SSlideGraph : public CHandleObject
+{
+ SSlideGraph()
+ : m_Root(0)
+ , m_ActiveSlide(0)
+ {
+ }
+ SSlideGraph(int inHandle, int inSlideRoot)
+ : CHandleObject(inHandle)
+ , m_Root(inSlideRoot)
+ , m_ActiveSlide(0)
+ {
+ }
+ Qt3DSDMSlideHandle m_Root;
+ Qt3DSDMSlideHandle m_ActiveSlide;
+
+ static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSSlideGraph;
+ EHandleObjectType GetType() override { return s_Type; }
+};
+
+class CSimpleSlideGraphCore : public CHandleBase, public ISlideGraphCore
+{
+ TStringTablePtr m_StringTable;
+ typedef std::unordered_map<Qt3DSDMInstanceHandle,
+ pair<Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle>, std::hash<int>>
+ TInstanceToGraphMap;
+ typedef std::unordered_map<Qt3DSDMSlideGraphHandle, TSlideInstancePairList, std::hash<int>>
+ TGraphToInstanceMap;
+
+ TInstanceToGraphMap m_InstanceToGraph;
+ TGraphToInstanceMap m_GraphToInstances;
+
+public:
+ CSimpleSlideGraphCore(TStringTablePtr strTable = TStringTablePtr())
+ : m_StringTable(strTable)
+ {
+ }
+ TStringTablePtr GetStringTablePtr() { return m_StringTable; }
+ /**
+ * A slide graph is used to associate a set of instances to a set of slides.
+ * This allows rapid lookup of properties, as an implementation of these.
+ * There are a few assumptions here. First is that a given slide can be a member
+ * of one and only one graph (i.e. it does not derive from another slide outside of the graph).
+ * Second is that an instance is a member of one and only one graph.
+ */
+ Qt3DSDMSlideGraphHandle CreateSlideGraph(Qt3DSDMSlideHandle inRoot) override;
+ Qt3DSDMSlideHandle GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const override;
+ Qt3DSDMSlideGraphHandle GetSlideGraph(Qt3DSDMSlideHandle inSlide) const override;
+ void GetSlideGraphs(TSlideGraphHandleList &outGraphs) const override;
+ void DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) override;
+
+ /**
+ * Associate a given instance handle with a given graph. This will ensure that property
+ *lookups
+ * will travel through this graph before they hit the main data core. Instances may be
+ *associated
+ * with a sub-slide of a given graph, not just the root. An instance associated with the root
+ *is
+ * implicitly associated with any root-derived slides.
+ */
+ void AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) override;
+ void GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph,
+ TSlideInstancePairList &outAssociations) const override;
+ TGraphSlidePair GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const override;
+ void DissociateInstance(Qt3DSDMInstanceHandle inInstance) override;
+
+ /**
+ * All graphs always have an active slide. This is assumed to be the root right off the bat.
+ */
+ void SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override;
+ Qt3DSDMSlideHandle GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const override;
+
+ bool HandleValid(int inHandle) const override;
+
+ Qt3DSDMSlideGraphHandle CreateSlideGraphWithHandle(int inHandle, Qt3DSDMSlideHandle inRoot);
+
+ static SSlideGraph *GetSlideGraphNF(int inHandle, THandleObjectMap &inObjects)
+ {
+ return const_cast<SSlideGraph *>(
+ GetSlideGraphNF(inHandle, static_cast<const THandleObjectMap &>(inObjects)));
+ }
+
+ static const SSlideGraph *GetSlideGraphNF(int inHandle, const THandleObjectMap &inObjects)
+ {
+ const SSlideGraph *theSlide = GetHandleObject<SSlideGraph>(inHandle, inObjects);
+ if (theSlide)
+ return theSlide;
+ throw SlideGraphNotFound(L"");
+ }
+};
+
+typedef std::shared_ptr<CSimpleSlideGraphCore> TSimpleSlideGraphCorePtr;
+}
+
+#endif
diff --git a/src/dm/systems/cores/SlideCoreProducer.cpp b/src/dm/systems/cores/SlideCoreProducer.cpp
new file mode 100644
index 0000000..86b0d1f
--- /dev/null
+++ b/src/dm/systems/cores/SlideCoreProducer.cpp
@@ -0,0 +1,562 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#ifdef _WIN32
+#pragma warning(disable : 4503) // decorated name length exceeded
+#endif
+#include "SlideCoreProducer.h"
+#include "HandleSystemTransactions.h"
+#include "VectorTransactions.h"
+#include "SignalsImpl.h"
+
+using namespace std;
+
+namespace qt3dsdm {
+
+Qt3DSDMSlideHandle CSlideCoreProducer::CreateSlide(Qt3DSDMInstanceHandle inInstance)
+{
+ Qt3DSDMSlideHandle retval = m_Data->CreateSlide(inInstance);
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ GetSignalSender()->SendSlideCreated(retval);
+ return retval;
+}
+
+Qt3DSDMInstanceHandle CSlideCoreProducer::GetSlideInstance(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_Data->GetSlideInstance(inSlide);
+}
+
+Qt3DSDMSlideHandle CSlideCoreProducer::GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const
+{
+ return m_Data->GetSlideByInstance(inSlide);
+}
+
+void SendPropertyRemoved(const TSlideEntry &inEntry, Qt3DSDMSlideHandle inSlide,
+ ISlideCoreSignalSender *inSender)
+{
+ inSender->SendPropertyValueRemoved(inSlide, get<0>(inEntry), get<1>(inEntry), get<2>(inEntry));
+}
+
+void RecurseCreateDeleteTransactions(TTransactionConsumerPtr inConsumer, Qt3DSDMSlideHandle inSlide,
+ THandleObjectMap &inObjects, ISlideCoreSignalSender *inSender)
+{
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, inObjects);
+ inSender->SendBeforeSlideDeleted(theSlide->m_Handle);
+ do_all(theSlide->m_Children, std::bind(RecurseCreateDeleteTransactions, inConsumer,
+ std::placeholders::_1,
+ std::ref(inObjects), inSender));
+ if (inConsumer)
+ CREATE_HANDLE_DELETE_TRANSACTION(inConsumer, inSlide, inObjects);
+ inSender->SendSlideDeleted(theSlide->m_Handle);
+}
+
+void CSlideCoreProducer::DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances)
+{
+ // Ensure exists
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects);
+ if (theSlide->m_Parent) {
+ SSlide *theParent = CSimpleSlideCore::GetSlideNF(theSlide->m_Parent, m_Data->m_Objects);
+ CreateVecEraseTransaction<int>(__FILE__, __LINE__, m_Consumer, inSlide,
+ theParent->m_Children);
+ }
+ RecurseCreateDeleteTransactions(m_Consumer, inSlide, m_Data->m_Objects, GetSignalSender());
+ // Not any more...
+ m_Data->DeleteSlide(inSlide, outInstances);
+}
+
+void CSlideCoreProducer::GetSlides(TSlideHandleList &outSlides) const
+{
+ m_Data->GetSlides(outSlides);
+}
+
+float CSlideCoreProducer::GetSlideTime(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_Data->GetSlideTime(inSlide);
+}
+
+void CSlideCoreProducer::SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime)
+{
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects);
+ float oldTime = theSlide->m_Time;
+ theSlide->m_Time = inNewTime;
+ if (m_Consumer) {
+ m_Consumer->OnTransaction(std::shared_ptr<ITransaction>(CREATE_GENERIC_TRANSACTION(
+ std::bind(&CSlideCoreProducer::SetSlideTime, this, inSlide, inNewTime),
+ std::bind(&CSlideCoreProducer::SetSlideTime, this, inSlide, oldTime))));
+ } else
+ GetSignalSender()->SendSlideTimeChanged(inSlide);
+}
+
+inline void SetSlideParent(THandleObjectMap &inObjects, int inSlide, int inParent)
+{
+ CSimpleSlideCore::GetSlideNF(inSlide, inObjects)->m_Parent = inParent;
+}
+
+void CSlideCoreProducer::DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent,
+ int inIndex)
+{
+ // Integrity checks to ensure operation will proceed
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects);
+ SSlide *theNewParent = NULL;
+ if (inParent)
+ theNewParent = CSimpleSlideCore::GetSlideNF(inParent, m_Data->m_Objects);
+ SSlide *theOldParent = NULL;
+ if (theSlide->m_Parent)
+ theOldParent = CSimpleSlideCore::GetSlideNF(theSlide->m_Parent, m_Data->m_Objects);
+
+ if (theSlide->m_Parent && m_Consumer) {
+ m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION(
+ std::bind(SetSlideParent, std::ref(m_Data->m_Objects), inSlide, inParent),
+ std::bind(SetSlideParent, std::ref(m_Data->m_Objects), inSlide,
+ theSlide->m_Parent))));
+ if (theOldParent)
+ CreateVecEraseTransaction<int>(__FILE__, __LINE__, m_Consumer, inSlide,
+ theOldParent->m_Children);
+ GetSignalSender()->SendSlideDerived(inSlide, 0, inIndex);
+ }
+ m_Data->DeriveSlide(inSlide, inParent, inIndex);
+ if (theNewParent)
+ CreateVecInsertTransaction<int>(__FILE__, __LINE__, m_Consumer, inSlide,
+ theNewParent->m_Children);
+ GetSignalSender()->SendSlideDerived(inSlide, inParent, inIndex);
+}
+
+Qt3DSDMSlideHandle CSlideCoreProducer::GetParentSlide(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_Data->GetParentSlide(inSlide);
+}
+
+void CSlideCoreProducer::GetChildSlides(Qt3DSDMSlideHandle inSlide,
+ TSlideHandleList &outChildren) const
+{
+ m_Data->GetChildSlides(inSlide, outChildren);
+}
+
+int CSlideCoreProducer::GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const
+{
+ return m_Data->GetChildIndex(inParent, inChild);
+}
+
+bool CSlideCoreProducer::GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ return m_Data->GetInstancePropertyValue(inSlide, inHandle, inProperty, outValue);
+}
+
+inline void EraseProperty(TSlideEntryList &inProperties, int inInstance, int inProperty)
+{
+ erase_if(inProperties,
+ std::bind(CSimpleSlideCore::PropertyFound, inInstance, inProperty,
+ std::placeholders::_1));
+}
+
+void CSlideCoreProducer::SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ std::pair<SSlide *, SInternValue *> slideAndProp(
+ m_Data->ResolveSetInstancePropertyValue(inSlide, inHandle, inProperty));
+ DoForceSetInstancePropertyValue(slideAndProp.first->m_Handle, inHandle, inProperty, inValue);
+}
+
+struct HashMapDataValueInsertTransaction
+ : public HashMapInsertTransaction<TSlideInstancePropertyPair, SInternValue,
+ TSlideEntryHash::hasher>
+{
+ typedef HashMapInsertTransaction<TSlideInstancePropertyPair, SInternValue,
+ TSlideEntryHash::hasher>
+ TBase;
+ HashMapDataValueInsertTransaction(
+ const char *inFile, int inLine, TSlideEntryHash &map,
+ const std::pair<TSlideInstancePropertyPair, SInternValue> &val)
+ : TBase(inFile, inLine, map, val)
+ {
+ }
+ void Do() override
+ {
+ std::pair<int, int> theKey = m_Value.first;
+ SValue theTempValue = m_Value.second.GetValue();
+ TDataStrPtr theStrPtr;
+ if (GetValueType(theTempValue) == DataModelDataType::String) {
+ theStrPtr = qt3dsdm::get<TDataStrPtr>(theTempValue);
+ }
+ (void)theStrPtr;
+ TBase::Add();
+ }
+};
+
+inline void CSlideCoreProducer::DoForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects);
+ SInternValue theNewValue(inValue, m_Data->GetStringTable());
+ SInternValue *theCurrentValue(theSlide->GetInstancePropertyValue(inHandle, inProperty));
+
+ std::pair<int, int> theKey(inHandle, inProperty);
+ SlideInstancePropertyKey mergeMapKey(inSlide, inHandle, inProperty);
+ TSlidePropertyMergeMap::iterator iter = m_PropertyMergeMap.find(mergeMapKey);
+ if (iter != m_PropertyMergeMap.end()) {
+ const SValue &theTempValue(theNewValue.GetValue());
+ CSimpleSlideCore::ForceSetPropertyValue(m_Data->GetStringTable(), m_Data->m_Objects,
+ inSlide, inHandle, inProperty, theTempValue);
+ iter->second->Update(theNewValue);
+ if (GetValueType(theTempValue) == DataModelDataType::String) {
+ TDataStrPtr theStrPtr = qt3dsdm::get<TDataStrPtr>(theTempValue);
+ QT3DSDM_DEBUG_LOG(m_Data->GetStringTable().GetNarrowStr(theStrPtr->GetData()));
+ }
+ return; // don't signal
+ } else {
+ TSlidePropertyMergeMapEntry theEntry;
+ if (theCurrentValue) {
+ theEntry =
+ CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer, theKey,
+ *theCurrentValue, theNewValue, theSlide->m_Properties);
+ } else {
+ if (m_Consumer) {
+ std::shared_ptr<HashMapDataValueInsertTransaction> theTransaction =
+ std::make_shared<HashMapDataValueInsertTransaction>(
+ __FILE__, __LINE__, std::ref(theSlide->m_Properties),
+ std::make_pair(theKey, theNewValue));
+ m_Consumer->OnTransaction(theTransaction);
+ theEntry = theTransaction;
+ }
+ }
+ if (theEntry)
+ m_PropertyMergeMap.insert(make_pair(mergeMapKey, theEntry));
+ CSimpleSlideCore::ForceSetPropertyValue(m_Data->GetStringTable(), m_Data->m_Objects,
+ inSlide, inHandle, inProperty,
+ theNewValue.GetValue());
+ GetSignalSender()->SendPropertyValueSet(inSlide, inHandle, inProperty,
+ theNewValue.GetValue());
+ }
+}
+
+void CSlideCoreProducer::ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ if (m_Consumer)
+ DoForceSetInstancePropertyValue(inSlide, inHandle, inProperty, inValue);
+ else
+ m_Data->ForceSetInstancePropertyValue(inSlide, inHandle, inProperty, inValue);
+}
+
+void CSlideCoreProducer::forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ m_Data->forceSetInstancePropertyValueOnAllSlides(inInstance, inProperty, inValue);
+}
+
+bool CSlideCoreProducer::GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ SValue &outValue) const
+{
+ return m_Data->GetSpecificInstancePropertyValue(inSlide, inInstance, inProperty, outValue);
+}
+
+bool CSlideCoreProducer::ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) const
+{
+ return m_Data->ContainsProperty(inSlide, inHandle, inProperty);
+}
+
+void CSlideCoreProducer::GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide,
+ TSlideEntryList &outEntries) const
+{
+ return m_Data->GetSlidePropertyEntries(inSlide, outEntries);
+}
+
+void CSlideCoreProducer::PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue)
+{
+ SSlide *theParent = CSimpleSlideCore::GetSlideNF(inParent, m_Data->m_Objects);
+ DoForceSetInstancePropertyValue(inParent, inHandle, inProperty, inValue);
+ do_all(theParent->m_Children, std::bind(&CSlideCoreProducer::DoForceSetInstancePropertyValue,
+ this, std::placeholders::_1,
+ inHandle, inProperty, inValue));
+}
+
+inline void ClearValueWithTransactions(TTransactionConsumerPtr inConsumer,
+ THandleObjectMap &inObjects,
+ ISlideCoreSignalSender *inSignalSender, int inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, inObjects);
+ SInternValue *theCurrentValue(theSlide->GetInstancePropertyValue(inHandle, inProperty));
+ if (theCurrentValue) {
+ SValue theValue(theCurrentValue->GetValue());
+ std::pair<int, int> theKey(inHandle, inProperty);
+ CreateHashMapEraseTransaction(__FILE__, __LINE__, inConsumer,
+ std::make_pair(theKey, *theCurrentValue),
+ theSlide->m_Properties);
+ CSimpleSlideCore::ClearPropertyValue(inObjects, inSlide, inHandle, inProperty);
+ inSignalSender->SendPropertyValueRemoved(inSlide, inHandle, inProperty, theValue);
+ }
+}
+
+void CSlideCoreProducer::ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty)
+{
+ SSlide *theParent = CSimpleSlideCore::GetSlideNF(inParent, m_Data->m_Objects);
+ do_all(theParent->m_Children,
+ std::bind(ClearValueWithTransactions, m_Consumer, std::ref(m_Data->m_Objects),
+ GetSignalSender(), std::placeholders::_1, inHandle, inProperty));
+}
+
+typedef tuple<int, TSlideEntryList, TSlideEntryList> TSlideSlideEntryTuple;
+typedef std::vector<TSlideSlideEntryTuple> TSlideSlideEntryTupleList;
+
+inline void CreateVectorPreReplaceData(THandleObjectPair inPair,
+ TSlideSlideEntryTupleList &outSlideSlideEntries,
+ function<bool(const TSlideEntry &)> inPredicate)
+{
+ if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSSlide) {
+ SSlide *theSlide = static_cast<SSlide *>(inPair.second.get());
+ if (theSlide->HasProperty(inPredicate)) {
+ outSlideSlideEntries.push_back(
+ TSlideSlideEntryTuple(inPair.first, TSlideEntryList(), TSlideEntryList()));
+ theSlide->DeleteSlideEntries(get<1>(outSlideSlideEntries.back()), inPredicate);
+ }
+ }
+}
+
+inline void RunInsert(tuple<int, TSlideEntryList, TSlideEntryList> &inTuple,
+ THandleObjectMap &inObjects, IStringTable &inStringTable)
+{
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(get<0>(inTuple), inObjects);
+ theSlide->InsertSlideEntries(get<1>(inTuple), inStringTable);
+}
+
+inline void RunFullInsert(std::shared_ptr<TSlideSlideEntryTupleList> inList,
+ THandleObjectMap &inObjects, IStringTable &inStringTable)
+{
+ for (TSlideSlideEntryTupleList::iterator theIter = inList->begin(); theIter != inList->end();
+ ++theIter)
+ RunInsert(*theIter, inObjects, inStringTable);
+}
+
+inline void RunFullErase(std::shared_ptr<TSlideSlideEntryTupleList> inList,
+ THandleObjectMap &inObjects)
+{
+ for (TSlideSlideEntryTupleList::iterator theIter = inList->begin(); theIter != inList->end();
+ ++theIter) {
+ SSlide *theSlide = CSimpleSlideCore::GetSlideNF(get<0>(*theIter), inObjects);
+ theSlide->DeleteEntriesFromList(std::get<1>(*theIter));
+ }
+}
+
+void DeleteAllSlideEntriesWithUndo(TTransactionConsumerPtr inConsumer, IStringTable &inStringTable,
+ THandleObjectMap &inObjects,
+ function<bool(const TSlideEntry &)> inPredicate)
+{
+ std::shared_ptr<TSlideSlideEntryTupleList> theEntries(new TSlideSlideEntryTupleList);
+ do_all(inObjects,
+ std::bind(CreateVectorPreReplaceData,
+ std::placeholders::_1, std::ref(*theEntries), inPredicate));
+ if (inConsumer)
+ CreateGenericTransactionWithConsumer(
+ __FILE__, __LINE__, inConsumer,
+ std::bind(RunFullErase, theEntries, std::ref(inObjects)),
+ std::bind(RunFullInsert, theEntries, std::ref(inObjects),
+ std::ref(inStringTable)));
+}
+
+void CSlideCoreProducer::DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inInstance)
+{
+ DeleteAllSlideEntriesWithUndo(
+ m_Consumer, GetStringTable(), m_Data->m_Objects,
+ std::bind(CSimpleSlideCore::SlideEntryInstanceMatches, std::placeholders::_1, inInstance));
+}
+void CSlideCoreProducer::DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle)
+{
+ DeleteAllSlideEntriesWithUndo(
+ m_Consumer, GetStringTable(), m_Data->m_Objects,
+ std::bind(CSimpleSlideCore::SlideEntryPropertyMatches, std::placeholders::_1, inHandle));
+}
+
+void CSlideCoreProducer::DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties)
+{
+ DeleteAllSlideEntriesWithUndo(m_Consumer, GetStringTable(), m_Data->m_Objects,
+ std::bind(CSimpleSlideCore::SlideEntryInstancePropertyMatches,
+ std::placeholders::_1, std::cref(inInstances),
+ std::cref(inProperties)));
+}
+
+void CSlideCoreProducer::GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1,
+ Qt3DSDMSlideHandle inSlide2,
+ TSlideEntryList &outEntries) const
+{
+ return m_Data->GetIntersectingProperties(inSlide1, inSlide2, outEntries);
+}
+
+bool InstancePropMatches(Qt3DSDMInstanceHandle instance, Qt3DSDMPropertyHandle prop,
+ const TSlideEntry &entry)
+{
+ return instance == get<0>(entry) && prop == get<1>(entry);
+}
+
+bool SendPropertyAddedIfNotInList(Qt3DSDMInstanceHandle instance, Qt3DSDMPropertyHandle prop,
+ SValue & /*value*/, const TSlideEntryList &inList,
+ Qt3DSDMSlideHandle inSource, Qt3DSDMSlideHandle inSlide,
+ ISlideCoreSignalSender * /*inSignalSender*/)
+{
+ if (find_if<TSlideEntryList::const_iterator>(
+ inList, std::bind(InstancePropMatches, instance, prop, std::placeholders::_1))
+ == inList.end()) {
+ return true;
+ }
+ return false;
+}
+
+// destination gets the properties from slide 1 that have corresponding entries in slide 2
+void CSlideCoreProducer::PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1,
+ Qt3DSDMSlideHandle inSlide2,
+ Qt3DSDMSlideHandle inDestination)
+{
+ SSlide *theDest = CSimpleSlideCore::GetSlideNF(inDestination, m_Data->m_Objects);
+ TSlideEntryList theProperties;
+ theDest->ToSlideEntryList(theProperties);
+ m_Data->PushIntersectingProperties(inSlide1, inSlide2, inDestination);
+ theDest->SetPropertyValuesIf(GetStringTable(), std::bind(SendPropertyAddedIfNotInList,
+ std::placeholders::_1,
+ std::placeholders::_2,
+ std::placeholders::_3,
+ theProperties, inSlide1,
+ inDestination, GetSignalSender()));
+ if (m_Consumer) {
+ TSlideEntryList theResult;
+ theDest->ToSlideEntryList(theResult);
+ m_Consumer->OnTransaction(TTransactionPtr(
+ CREATE_GENERIC_TRANSACTION(std::bind(&SSlide::FromSlideEntryList, theDest, theResult,
+ std::ref(GetStringTable())),
+ std::bind(&SSlide::FromSlideEntryList, theDest,
+ theProperties, std::ref(GetStringTable())))));
+ }
+}
+
+void CSlideCoreProducer::CopyProperties(Qt3DSDMSlideHandle inSourceSlide,
+ Qt3DSDMInstanceHandle inSourceInstance,
+ Qt3DSDMSlideHandle inDestSlide,
+ Qt3DSDMInstanceHandle inDestInstance)
+{
+ SSlide *sourceSlide = CSimpleSlideCore::GetSlideNF(inSourceSlide, m_Data->m_Objects);
+
+ for (TSlideEntryHash::iterator theIter = sourceSlide->m_Properties.begin(),
+ theEnd = sourceSlide->m_Properties.end();
+ theIter != theEnd; ++theIter) {
+ if (theIter->first.first == inSourceInstance) {
+ // Set it once so it appears in the slide
+ // Then call the main method that will send the events.
+ DoForceSetInstancePropertyValue(inDestSlide, inDestInstance, theIter->first.second,
+ theIter->second.GetValue());
+ }
+ }
+}
+
+bool CSlideCoreProducer::HandleValid(int inHandle) const
+{
+ return m_Data->HandleValid(inHandle);
+}
+
+bool CSlideCoreProducer::IsSlide(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_Data->IsSlide(inSlide);
+}
+
+void CSlideCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ m_Consumer = inConsumer;
+ m_PropertyMergeMap.clear();
+}
+
+TSignalConnectionPtr
+CSlideCoreProducer::ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectSlideCreated(inCallback);
+}
+TSignalConnectionPtr CSlideCoreProducer::ConnectBeforeSlideDeleted(
+ const std::function<void(Qt3DSDMSlideHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectBeforeSlideDeleted(inCallback);
+}
+TSignalConnectionPtr
+CSlideCoreProducer::ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectSlideDeleted(inCallback);
+}
+TSignalConnectionPtr CSlideCoreProducer::ConnectSlideDerived(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback)
+{
+ return GetSignalProvider()->ConnectSlideDerived(inCallback);
+}
+TSignalConnectionPtr CSlideCoreProducer::ConnectInstancePropertyValueSet(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectInstancePropertyValueSet(inCallback);
+}
+TSignalConnectionPtr CSlideCoreProducer::ConnectInstancePropertyValueRemoved(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback)
+{
+ return GetSignalProvider()->ConnectInstancePropertyValueRemoved(inCallback);
+}
+TSignalConnectionPtr CSlideCoreProducer::ConnectSlideTimeChanged(
+ const std::function<void(Qt3DSDMSlideHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectSlideTimeChanged(inCallback);
+}
+
+void CSlideCoreProducer::InitSignaller()
+{
+ m_SlideCoreSignaller = CreateSlideCoreSignaller();
+}
+
+ISlideCoreSignalProvider *CSlideCoreProducer::GetSignalProvider()
+{
+ return dynamic_cast<ISlideCoreSignalProvider *>(m_SlideCoreSignaller.get());
+}
+ISlideCoreSignalSender *CSlideCoreProducer::GetSignalSender()
+{
+ return dynamic_cast<ISlideCoreSignalSender *>(m_SlideCoreSignaller.get());
+}
+}
diff --git a/src/dm/systems/cores/SlideCoreProducer.h b/src/dm/systems/cores/SlideCoreProducer.h
new file mode 100644
index 0000000..dec0297
--- /dev/null
+++ b/src/dm/systems/cores/SlideCoreProducer.h
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef SLIDECOREPRODUCERH
+#define SLIDECOREPRODUCERH
+#include "Qt3DSDMTransactions.h"
+#include "SimpleSlideCore.h"
+#include "Qt3DSDMSignals.h"
+
+namespace qt3dsdm {
+struct SlideInstancePropertyKey
+{
+ int m_Slide;
+ int m_Instance;
+ int m_Property;
+ SlideInstancePropertyKey(int slide, int inst, int prop)
+ : m_Slide(slide)
+ , m_Instance(inst)
+ , m_Property(prop)
+ {
+ }
+ SlideInstancePropertyKey()
+ : m_Slide(0)
+ , m_Instance(0)
+ , m_Property(0)
+ {
+ }
+
+ bool operator==(const SlideInstancePropertyKey &inOther) const
+ {
+ return m_Slide == inOther.m_Slide && m_Instance == inOther.m_Instance
+ && m_Property == inOther.m_Property;
+ }
+};
+
+struct SlideInstancePropertyKeyHasher
+{
+ std::size_t operator()(const SlideInstancePropertyKey &inEntry) const
+ {
+ return std::hash<int>()(inEntry.m_Slide) ^ std::hash<int>()(inEntry.m_Instance)
+ ^ std::hash<int>()(inEntry.m_Property);
+ }
+};
+
+typedef std::shared_ptr<IMergeableTransaction<SInternValue>> TSlidePropertyMergeMapEntry;
+typedef std::unordered_map<SlideInstancePropertyKey, TSlidePropertyMergeMapEntry,
+ SlideInstancePropertyKeyHasher>
+ TSlidePropertyMergeMap;
+
+class CSlideCoreProducer : public ISlideCore,
+ public ITransactionProducer,
+ public ISlideCoreSignalProvider
+{
+ Q_DISABLE_COPY(CSlideCoreProducer)
+
+ TTransactionConsumerPtr m_Consumer;
+ TSimpleSlideCorePtr m_Data;
+ TSignalItemPtr m_SlideCoreSignaller;
+ TSlidePropertyMergeMap m_PropertyMergeMap;
+
+public:
+ CSlideCoreProducer(TStringTablePtr inStrTable)
+ : m_Data(new CSimpleSlideCore(inStrTable))
+ {
+ InitSignaller();
+ }
+
+ IStringTable &GetStringTable() const override { return m_Data->GetStringTable(); }
+ TStringTablePtr GetStringTablePtr() const override { return m_Data->GetStringTablePtr(); }
+
+ TSimpleSlideCorePtr GetTransactionlessSlideCore() { return m_Data; }
+ TSimpleSlideCorePtr GetTransactionlessSlideCore() const { return m_Data; }
+
+ Qt3DSDMSlideHandle CreateSlide(Qt3DSDMInstanceHandle inInstance) override;
+ Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const override;
+ Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const override;
+ void DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) override;
+ void GetSlides(TSlideHandleList &outSlides) const override;
+
+ float GetSlideTime(Qt3DSDMSlideHandle inSlide) const override;
+ void SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) override;
+
+ void DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, int inIndex = -1) override;
+ Qt3DSDMSlideHandle GetParentSlide(Qt3DSDMSlideHandle inSlide) const override;
+ void GetChildSlides(Qt3DSDMSlideHandle inSlide, TSlideHandleList &outChildren) const override;
+ int GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const override;
+
+ bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+ void SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+ void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+ void forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue) override;
+ bool GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override;
+ void GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance,
+ TPropertyHandleValuePairList &outValues) override
+ {
+ return m_Data->GetSpecificInstancePropertyValues(inSlide, inInstance, outValues);
+ }
+ bool ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) const override;
+ void GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide, TSlideEntryList &outEntries) const override;
+
+ void PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override;
+ void ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty) override;
+ void DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle) override;
+ void DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) override;
+ void DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances,
+ const TPropertyHandleList &inProperties) override;
+
+ void GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2,
+ TSlideEntryList &outEntries) const override;
+ void PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2,
+ Qt3DSDMSlideHandle inDestination) override;
+ void CopyProperties(Qt3DSDMSlideHandle inSourceSlide, Qt3DSDMInstanceHandle inSourceInstance,
+ Qt3DSDMSlideHandle inDestSlide, Qt3DSDMInstanceHandle inDestInstance) override;
+
+ bool IsSlide(Qt3DSDMSlideHandle inSlide) const override;
+
+ bool HandleValid(int inHandle) const override;
+
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+
+ //===================================================================
+ // Signals
+ //===================================================================
+
+ virtual TSignalConnectionPtr
+ ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectBeforeSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectSlideDerived(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback) override;
+ TSignalConnectionPtr ConnectInstancePropertyValueSet(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback) override;
+ TSignalConnectionPtr ConnectInstancePropertyValueRemoved(
+ const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,
+ const SValue &)> &inCallback) override;
+ virtual TSignalConnectionPtr
+ ConnectSlideTimeChanged(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override;
+
+private:
+ inline void DoForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inHandle,
+ Qt3DSDMPropertyHandle inProperty,
+ const SValue &inValue);
+ void InitSignaller();
+ ISlideCoreSignalProvider *GetSignalProvider();
+ ISlideCoreSignalSender *GetSignalSender();
+};
+}
+
+#endif
diff --git a/src/dm/systems/cores/SlideGraphCoreProducer.cpp b/src/dm/systems/cores/SlideGraphCoreProducer.cpp
new file mode 100644
index 0000000..c514108
--- /dev/null
+++ b/src/dm/systems/cores/SlideGraphCoreProducer.cpp
@@ -0,0 +1,245 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSDMPrefix.h"
+#include "SlideGraphCoreProducer.h"
+#include "HandleSystemTransactions.h"
+#include "VectorTransactions.h"
+#include "SignalsImpl.h"
+using namespace std;
+
+namespace qt3dsdm {
+
+Qt3DSDMSlideGraphHandle CSlideGraphCoreProducer::CreateSlideGraph(Qt3DSDMSlideHandle inRoot)
+{
+ Qt3DSDMSlideGraphHandle retval(m_Data->CreateSlideGraph(inRoot));
+ CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects);
+ GetSignalSender()->SendGraphCreated(retval, inRoot);
+ return retval;
+}
+
+Qt3DSDMSlideHandle CSlideGraphCoreProducer::GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const
+{
+ return m_Data->GetGraphRoot(inGraph);
+}
+
+Qt3DSDMSlideGraphHandle CSlideGraphCoreProducer::GetSlideGraph(Qt3DSDMSlideHandle inSlide) const
+{
+ return m_Data->GetSlideGraph(inSlide);
+}
+
+void CSlideGraphCoreProducer::GetSlideGraphs(TSlideGraphHandleList &outGraphs) const
+{
+ return m_Data->GetSlideGraphs(outGraphs);
+}
+
+struct DissocateAllInstanceTrans : public ITransaction
+{
+ std::shared_ptr<CSimpleSlideGraphCore> m_Graph;
+ Qt3DSDMSlideGraphHandle m_Handle;
+ TSlideInstancePairList m_Instances;
+ DissocateAllInstanceTrans(const char *inFile, int inLine,
+ std::shared_ptr<CSimpleSlideGraphCore> inGraph,
+ Qt3DSDMSlideGraphHandle inHandle)
+ : ITransaction(inFile, inLine)
+ , m_Graph(inGraph)
+ , m_Handle(inHandle)
+ {
+ inGraph->GetAssociatedInstances(m_Handle, m_Instances);
+ }
+ void Do() override
+ {
+ for (size_t idx = 0, end = m_Instances.size(); idx < end; ++idx)
+ m_Graph->DissociateInstance(m_Instances[idx].second);
+ }
+ void Undo() override
+ {
+ for (size_t idx = 0, end = m_Instances.size(); idx < end; ++idx)
+ m_Graph->AssociateInstance(m_Handle, m_Instances[idx].first, m_Instances[idx].second);
+ }
+};
+
+void CSlideGraphCoreProducer::DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle)
+{
+ SSlideGraph *theGraph = CSimpleSlideGraphCore::GetSlideGraphNF(inHandle, m_Data->m_Objects);
+ Qt3DSDMSlideHandle theRootSlide(theGraph->m_Root);
+ if (m_Consumer)
+ m_Consumer->OnTransaction(
+ make_shared<DissocateAllInstanceTrans>(__FILE__, __LINE__, m_Data, inHandle));
+ CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inHandle, m_Data->m_Objects);
+ m_Data->DeleteSlideGraph(inHandle);
+ GetSignalSender()->SendGraphDeleted(inHandle, theRootSlide);
+}
+
+struct SInstanceAssociateTrans : public ITransaction
+{
+ std::shared_ptr<CSimpleSlideGraphCore> m_Graph;
+ Qt3DSDMSlideGraphHandle m_GraphHandle;
+ Qt3DSDMSlideHandle m_Slide;
+ Qt3DSDMInstanceHandle m_Instance;
+ bool m_InsertOnDo;
+ SInstanceAssociateTrans(const char *inFile, int inLine,
+ std::shared_ptr<CSimpleSlideGraphCore> inGraph,
+ Qt3DSDMSlideGraphHandle inGraphHandle, Qt3DSDMSlideHandle inSlideHandle,
+ Qt3DSDMInstanceHandle inInstance, bool inInsertOnDo)
+ : ITransaction(inFile, inLine)
+ , m_Graph(inGraph)
+ , m_GraphHandle(inGraphHandle)
+ , m_Slide(inSlideHandle)
+ , m_Instance(inInstance)
+ , m_InsertOnDo(inInsertOnDo)
+ {
+ }
+ void Insert() { m_Graph->AssociateInstance(m_GraphHandle, m_Slide, m_Instance); }
+ void Remove() { m_Graph->DissociateInstance(m_Instance); }
+
+ void Do() override
+ {
+ if (m_InsertOnDo)
+ Insert();
+ else
+ Remove();
+ }
+ void Undo() override
+ {
+ if (m_InsertOnDo)
+ Remove();
+ else
+ Insert();
+ }
+};
+
+void CSlideGraphCoreProducer::AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph,
+ Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance)
+{
+ m_Data->AssociateInstance(inSlideGraph, inSlide, inInstance);
+ if (m_Consumer)
+ m_Consumer->OnTransaction(make_shared<SInstanceAssociateTrans>(
+ __FILE__, __LINE__, m_Data, inSlideGraph, inSlide, inInstance, true));
+
+ GetSignalSender()->SendInstanceAssociated(inSlideGraph, inSlide, inInstance);
+}
+void CSlideGraphCoreProducer::GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph,
+ TSlideInstancePairList &outAssociations) const
+{
+ m_Data->GetAssociatedInstances(inSlideGraph, outAssociations);
+}
+
+TGraphSlidePair CSlideGraphCoreProducer::GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const
+{
+ return m_Data->GetAssociatedGraph(inInstance);
+}
+
+void CSlideGraphCoreProducer::DissociateInstance(Qt3DSDMInstanceHandle inInstance)
+{
+ TGraphSlidePair theAssociatedGraph(m_Data->GetAssociatedGraph(inInstance));
+
+ if (theAssociatedGraph.first.Valid()) {
+ m_Data->DissociateInstance(inInstance);
+ if (m_Consumer)
+ m_Consumer->OnTransaction(make_shared<SInstanceAssociateTrans>(
+ __FILE__, __LINE__, m_Data, theAssociatedGraph.first, theAssociatedGraph.second,
+ inInstance, false));
+ GetSignalSender()->SendInstanceDissociated(theAssociatedGraph.first,
+ theAssociatedGraph.second, inInstance);
+ }
+}
+
+void CSlideGraphCoreProducer::SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph,
+ Qt3DSDMSlideHandle inSlide)
+{
+ if (m_Consumer) {
+ Qt3DSDMSlideHandle current = m_Data->GetGraphActiveSlide(inGraph);
+ TTransactionPtr theTransaction(CREATE_GENERIC_TRANSACTION(
+ bind(&CSimpleSlideGraphCore::SetGraphActiveSlide, m_Data, inGraph, inSlide),
+ bind(&CSimpleSlideGraphCore::SetGraphActiveSlide, m_Data, inGraph, current)));
+ m_Consumer->OnTransaction(theTransaction);
+ }
+ m_Data->SetGraphActiveSlide(inGraph, inSlide);
+ GetSignalSender()->SendGraphActiveSlide(inGraph, inSlide);
+}
+
+Qt3DSDMSlideHandle CSlideGraphCoreProducer::GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const
+{
+ return m_Data->GetGraphActiveSlide(inGraph);
+}
+
+bool CSlideGraphCoreProducer::HandleValid(int inHandle) const
+{
+ return m_Data->HandleValid(inHandle);
+}
+
+void CSlideGraphCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer)
+{
+ m_Consumer = inConsumer;
+}
+
+TSignalConnectionPtr CSlideGraphCoreProducer::ConnectGraphCreated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectGraphCreated(inCallback);
+}
+TSignalConnectionPtr CSlideGraphCoreProducer::ConnectGraphDeleted(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectGraphDeleted(inCallback);
+}
+TSignalConnectionPtr CSlideGraphCoreProducer::ConnectInstanceAssociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback)
+{
+ return GetSignalProvider()->ConnectInstanceAssociated(inCallback);
+}
+TSignalConnectionPtr CSlideGraphCoreProducer::ConnectInstanceDissociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback)
+{
+ return GetSignalProvider()->ConnectInstanceDissociated(inCallback);
+}
+TSignalConnectionPtr CSlideGraphCoreProducer::ConnectGraphActiveSlide(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback)
+{
+ return GetSignalProvider()->ConnectGraphActiveSlide(inCallback);
+}
+
+void CSlideGraphCoreProducer::InitSignaller()
+{
+ m_Signaller = CreateSlideGraphCoreSignaller();
+}
+
+ISlideGraphCoreSignalProvider *CSlideGraphCoreProducer::GetSignalProvider()
+{
+ return dynamic_cast<ISlideGraphCoreSignalProvider *>(m_Signaller.get());
+}
+
+ISlideGraphCoreSignalSender *CSlideGraphCoreProducer::GetSignalSender()
+{
+ return dynamic_cast<ISlideGraphCoreSignalSender *>(m_Signaller.get());
+}
+}
diff --git a/src/dm/systems/cores/SlideGraphCoreProducer.h b/src/dm/systems/cores/SlideGraphCoreProducer.h
new file mode 100644
index 0000000..5b34cdb
--- /dev/null
+++ b/src/dm/systems/cores/SlideGraphCoreProducer.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef SLIDEGRAPHCOREPRODUCERH
+#define SLIDEGRAPHCOREPRODUCERH
+#include "SimpleSlideGraphCore.h"
+#include "Qt3DSDMTransactions.h"
+#include "Qt3DSDMSignals.h"
+
+namespace qt3dsdm {
+class CSlideGraphCoreProducer : public ISlideGraphCore,
+ public ITransactionProducer,
+ public ISlideGraphCoreSignalProvider
+{
+ Q_DISABLE_COPY(CSlideGraphCoreProducer)
+
+ TSimpleSlideGraphCorePtr m_Data;
+ TTransactionConsumerPtr m_Consumer;
+ TSignalItemPtr m_Signaller;
+
+public:
+ CSlideGraphCoreProducer(TStringTablePtr strTable = TStringTablePtr())
+ : m_Data(new CSimpleSlideGraphCore(strTable))
+ {
+ InitSignaller();
+ }
+ TSimpleSlideGraphCorePtr GetTransactionlessSlideGraphCore() { return m_Data; }
+ TSimpleSlideGraphCorePtr GetTransactionlessSlideGraphCore() const { return m_Data; }
+
+ Qt3DSDMSlideGraphHandle CreateSlideGraph(Qt3DSDMSlideHandle inRoot) override;
+ Qt3DSDMSlideHandle GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const override;
+ Qt3DSDMSlideGraphHandle GetSlideGraph(Qt3DSDMSlideHandle inSlide) const override;
+ void GetSlideGraphs(TSlideGraphHandleList &outGraphs) const override;
+ void DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) override;
+
+ void AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, Qt3DSDMSlideHandle inSlide,
+ Qt3DSDMInstanceHandle inInstance) override;
+ void GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph,
+ TSlideInstancePairList &outAssociations) const override;
+ TGraphSlidePair GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const override;
+ void DissociateInstance(Qt3DSDMInstanceHandle inInstance) override;
+
+ void SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override;
+ Qt3DSDMSlideHandle GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const override;
+
+ bool HandleValid(int inHandle) const override;
+ void SetConsumer(TTransactionConsumerPtr inConsumer) override;
+
+ //===================================================================
+ // Signals
+ //===================================================================
+ TSignalConnectionPtr ConnectGraphCreated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectGraphDeleted(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override;
+ TSignalConnectionPtr ConnectInstanceAssociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override;
+ TSignalConnectionPtr ConnectInstanceDissociated(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)>
+ &inCallback) override;
+ TSignalConnectionPtr ConnectGraphActiveSlide(
+ const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override;
+
+private:
+ void InitSignaller();
+ ISlideGraphCoreSignalProvider *GetSignalProvider();
+ ISlideGraphCoreSignalSender *GetSignalSender();
+};
+}
+
+#endif
diff --git a/src/engine/EnginePrefix.h b/src/engine/EnginePrefix.h
new file mode 100644
index 0000000..d901785
--- /dev/null
+++ b/src/engine/EnginePrefix.h
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "render/backends/gl/Qt3DSOpenGLPrefix.h"
+
+#ifdef _WIN32
+//==============================================================================
+// DEFINES
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+//==============================================================================
+// DISABLED WARNINGS
+//
+// Note that most of these warnings are tuned off by default by the compiler
+// even at warning level 4. Using option /Wall turns on all warnings and makes
+// even standard Microsoft include files cry. We had to turn off these or
+// turn off warnings individually for each standard include file which was
+// too much work. Point is that /Wall is like Warning Level 5 and this brings
+// it down to about Warning level 4.5, still way above /W4.
+#pragma warning(disable : 4127) // conditional expression is constant
+#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
+//#pragma warning( disable : 4355 ) // 'this' : used in base member initializer list
+//#pragma warning( disable : 4511 ) // copy constructor could not be generated
+#pragma warning(disable : 4512) // assignment operator could not be generated
+#pragma warning(disable : 4514) // unreferenced inline function has been removed
+//#pragma warning( disable : 4619 ) // #pragma warning : there is no warning number '4619' (in
+//string.h)
+#pragma warning(disable : 4625) // copy constructor could not be generated because a base class copy
+ // constructor is inaccessible
+#pragma warning(disable : 4626) // assignment operator could not be generated because a base class
+ // assignment operator is inaccessible
+//#pragma warning( disable : 4640 ) // TODO MF Remove - construction of local static object is
+//not thread-safe
+#pragma warning(disable : 4710) // function not inlined
+#pragma warning(disable : 4711) // function selected for automatic inline expansion
+#pragma warning( \
+ disable : 4738) // storing 32-bit float result in memory, possible loss of performance
+#pragma warning(disable : 4826) // Conversion from 'const void *' to 'void *' is sign-extended
+//#pragma warning( disable : 4996 ) // _snprintf' was declared deprecated
+
+#endif //_WIN32
+
+//==============================================================================
+// Non-windows environments need to declare this
+#ifndef MAX_PATH
+#define MAX_PATH 260
+#endif
+
+//==============================================================================
+// STD - Standard includes MUST come first
+#ifdef _WIN32
+#pragma warning(push, 3)
+#pragma warning( \
+ disable : 4548) // expression before comma has no effect; expected expression with side-effect
+#endif
+
+#include <stdio.h>
+#include <iostream>
+
+#if defined(_PCPLATFORM) || defined(_TEGRAPLATFORM)
+#include <tchar.h>
+#endif
+
+#ifdef _WIN32
+#pragma warning(pop)
+#endif
+
+//==============================================================================
+// Runtime
+//==============================================================================
+#include "Qt3DSAssert.h"
+#include "Qt3DSMacros.h"
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSQmlEngine.h"
+#include "Qt3DSAttributeHashes.h"
+
+//==============================================================================
+// Additional Linux only dependencies
+//==============================================================================
+#if defined(_LINUXPLATFORM) || defined(_INTEGRITYPLATFORM)
+
+#pragma pack(1)
+struct BITMAPFILEHEADER
+{
+ Q3DStudio::UINT16 bfType;
+ Q3DStudio::UINT32 bfSize;
+ Q3DStudio::UINT16 bfReserved1;
+ Q3DStudio::UINT16 bfReserved2;
+ Q3DStudio::UINT32 bfOffBits;
+};
+#pragma pack()
+
+#pragma pack(1)
+
+typedef struct tagBITMAPINFOHEADER
+{
+ Q3DStudio::UINT32 biSize;
+ Q3DStudio::INT32 biWidth;
+ Q3DStudio::INT32 biHeight;
+ Q3DStudio::UINT16 biPlanes;
+ Q3DStudio::UINT16 biBitCount;
+ Q3DStudio::UINT32 biCompression;
+ Q3DStudio::UINT32 biSizeImage;
+ Q3DStudio::INT32 biXPelsPerMeter;
+ Q3DStudio::INT32 biYPelsPerMeter;
+ Q3DStudio::UINT32 biClrUsed;
+ Q3DStudio::UINT32 biClrImportant;
+} BITMAPINFOHEADER;
+
+#pragma pack()
+
+#define UNREFERENCED_PARAMETER(theParam) theParam;
+
+#endif
diff --git a/src/engine/NVImageScaler.h b/src/engine/NVImageScaler.h
new file mode 100644
index 0000000..069604a
--- /dev/null
+++ b/src/engine/NVImageScaler.h
@@ -0,0 +1,311 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+namespace Q3DStudio {
+namespace ImageScaler {
+
+ //==============================================================================
+ /**
+ *
+ */
+ template <INT32 TNumChannels>
+ inline void BilinearReduceRows(const CHAR *inSrcBuffer, INT32 inSrcWidth, INT32 inSrcHeight,
+ CHAR *outDstBuffer, INT32 inDstHeight)
+ {
+ INT32 theDDAConst = static_cast<INT32>(1024.0 * inDstHeight / inSrcHeight);
+ INT32 theDDAAccum = 0;
+ INT32 thePixelCount;
+
+ INT32 theSrcRow;
+ INT32 theSrcCol;
+ INT32 theDstRow;
+
+ INT32 theChannelAccum[TNumChannels] = { 0 };
+
+ CHAR *theDstPointer = outDstBuffer;
+ const CHAR *theSrcPointer = inSrcBuffer;
+ const CHAR *theSrcColPointer = NULL;
+ CHAR *theDstColPointer = NULL;
+
+ INT32 theStepSize = TNumChannels;
+ INT32 theSrcStride = TNumChannels * inSrcWidth;
+ INT32 theDstStride = TNumChannels * inSrcWidth;
+
+ for (theSrcCol = 0; theSrcCol < inSrcWidth; ++theSrcCol) {
+ theSrcColPointer = theSrcPointer + (theSrcCol * theStepSize);
+ theDstColPointer = theDstPointer + (theSrcCol * theStepSize);
+
+ theSrcRow = 0L;
+ theDstRow = 0L;
+ thePixelCount = 0L;
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] = 0L;
+
+ theDDAAccum = 0L;
+
+ while (theSrcRow < inSrcHeight) {
+ while ((theDDAAccum < 1024L) && (theSrcRow < inSrcHeight)) {
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] +=
+ 1024L * theSrcColPointer[(theSrcRow * theSrcStride) + idx];
+
+ theDDAAccum += theDDAConst;
+ thePixelCount += 1024L;
+ ++theSrcRow;
+ }
+
+ theDDAAccum = (theSrcRow < inSrcHeight) ? (theDDAAccum - 1024L) : (0L);
+ thePixelCount -= theDDAAccum;
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] -= theDDAAccum
+ * (INT32)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + idx];
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theDstColPointer[(theDstRow * theDstStride) + idx] =
+ (CHAR)(theChannelAccum[idx] / thePixelCount);
+
+ thePixelCount = 1024L - theDDAAccum;
+ ++theDstRow;
+
+ if (theDstRow >= inDstHeight)
+ break;
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] = thePixelCount
+ * (INT32)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + idx];
+ }
+ }
+ }
+
+ inline void BilinearReduceRows(const CHAR *inSrcBuffer, INT32 inSrcWidth, INT32 inSrcHeight,
+ INT32 inChannels, CHAR *outDstBuffer, INT32 inDstHeight)
+ {
+ switch (inChannels) {
+ case 4:
+ BilinearReduceRows<4>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstHeight);
+ break;
+ case 3:
+ BilinearReduceRows<3>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstHeight);
+ break;
+ case 2:
+ BilinearReduceRows<2>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstHeight);
+ break;
+ case 1:
+ BilinearReduceRows<1>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstHeight);
+ break;
+ }
+ }
+
+ template <INT32 TNumChannels>
+ inline void BilinearReduceCols(const CHAR *inSrcBuffer, INT32 inSrcWidth, INT32 inSrcHeight,
+ CHAR *outDstBuffer, INT32 inDstWidth)
+ {
+ INT32 theDDAConst = static_cast<INT32>(1024.0 * inDstWidth / inSrcWidth);
+ INT32 theDDAAccum = 0L;
+ INT32 thePixelCount;
+
+ INT32 theSrcRow;
+ INT32 theSrcCol;
+ INT32 theDstCol;
+
+ INT32 theChannelAccum[TNumChannels];
+
+ CHAR *theDstPointer = outDstBuffer;
+ const CHAR *theSrcPointer = inSrcBuffer;
+ const CHAR *theSrcRowPointer;
+ CHAR *theDstRowPointer;
+
+ INT32 theSrcStepSize = TNumChannels;
+ INT32 theDstStepSize = TNumChannels;
+
+ for (theSrcRow = 0; theSrcRow < inSrcHeight; ++theSrcRow) {
+
+ theSrcRowPointer = theSrcPointer + (theSrcRow * inSrcWidth * theSrcStepSize);
+ theDstRowPointer = theDstPointer + (theSrcRow * inDstWidth * theDstStepSize);
+
+ theSrcCol = 0L;
+ theDstCol = 0L;
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] = 0L;
+ thePixelCount = 0L;
+ theDDAAccum = 0L;
+
+ while (theSrcCol < inSrcWidth) {
+ while ((theDDAAccum < 1024L) && (theSrcCol < inSrcWidth)) {
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] +=
+ 1024L * theSrcRowPointer[(theSrcCol * theSrcStepSize) + idx];
+
+ theDDAAccum += theDDAConst;
+ thePixelCount += 1024L;
+ ++theSrcCol;
+ }
+
+ theDDAAccum = (theSrcCol < inSrcWidth) ? (theDDAAccum - 1024L) : (0L);
+ thePixelCount -= theDDAAccum;
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] -= theDDAAccum
+ * (INT32)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + idx];
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theDstRowPointer[(theDstCol * theDstStepSize) + idx] =
+ (CHAR)(theChannelAccum[idx] / thePixelCount);
+
+ thePixelCount = 1024L - theDDAAccum;
+ ++theDstCol;
+
+ if (theDstCol >= inDstWidth) {
+ break;
+ }
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theChannelAccum[idx] = thePixelCount
+ * (INT32)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + idx];
+ }
+ }
+ }
+
+ inline void BilinearReduceCols(const CHAR *inSrcBuffer, INT32 inSrcWidth, INT32 inSrcHeight,
+ INT32 inChannels, CHAR *&outDstBuffer, INT32 inDstWidth)
+ {
+ switch (inChannels) {
+ case 4:
+ BilinearReduceCols<4>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth);
+ break;
+ case 3:
+ BilinearReduceCols<3>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth);
+ break;
+ case 2:
+ BilinearReduceCols<2>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth);
+ break;
+ case 1:
+ BilinearReduceCols<1>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth);
+ break;
+ }
+ }
+
+ template <INT32 TNumChannels>
+ inline void BilinearReduceImage(const CHAR *inSrcBuffer, INT32 inSrcWidth, INT32 inSrcHeight,
+ CHAR *outDstBuffer, INT32 inDstWidth, INT32 inDstHeight)
+ {
+ // Number larger than 1024
+ // One pixel in the source image is equivalent to this much of a pixel
+ // in terms of dest pixels.
+ INT32 theXIncrement = static_cast<INT32>(1024.f * inSrcWidth / inDstWidth);
+ // How many rows do we skip, in fixed point arithmetic, when we bump lines
+ INT32 theYIncrement = static_cast<INT32>(1024.f * inSrcHeight / inDstHeight);
+ // We are starting at position .5 in textel space
+ INT32 theSrcYPtr = 0;
+ CHAR *theDstPtr = outDstBuffer;
+ for (INT32 theHeightIndex = 0; theHeightIndex < inDstHeight;
+ ++theHeightIndex, theSrcYPtr += theYIncrement) {
+ INT32 theSrcXPtr = 0;
+ for (INT32 theWidthIndex = 0; theWidthIndex < inDstWidth;
+ ++theWidthIndex, theSrcXPtr += theXIncrement, theDstPtr += TNumChannels) {
+ INT32 theAccum[TNumChannels] = { 0 };
+ INT32 theNumPixels = 0;
+ // Pull all reasonable pixels from the source image.
+ INT32 theStartRow = (theSrcYPtr / 1024);
+ INT32 theStopRow = (theSrcYPtr + theYIncrement) / 1024;
+ INT32 theStartColumn = theSrcXPtr / 1024;
+ INT32 theStopColumn = (theSrcXPtr + theXIncrement) / 1024;
+ // Average everything between the columns
+ for (INT32 theRow = theStartRow; theRow < theStopRow; ++theRow) {
+ INT32 theSrcAddr = (theRow * inSrcWidth + theStartColumn) * TNumChannels;
+ for (INT32 theCol = theStartColumn; theCol < theStopColumn;
+ ++theCol, theSrcAddr += TNumChannels) {
+ ++theNumPixels;
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theAccum[idx] += inSrcBuffer[theSrcAddr + idx];
+ }
+ }
+
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theDstPtr[idx] = theAccum[idx] / theNumPixels;
+ }
+ }
+ }
+
+ template <INT32 TNumChannels>
+ inline void NearestReduceImage(const CHAR *inSrcBuffer, INT32 inSrcWidth, INT32 inSrcHeight,
+ CHAR *outDstBuffer, INT32 inDstWidth, INT32 inDstHeight)
+ {
+ // Number larger than 1024
+ // One pixel in the source image is equivalent to this much of a pixel
+ // in terms of dest pixels.
+ INT32 theXIncrement = static_cast<INT32>(1024.f * inSrcWidth / inDstWidth);
+ // How many rows do we skip, in fixed point arithmetic, when we bump lines
+ INT32 theYIncrement = static_cast<INT32>(1024.f * inSrcHeight / inDstHeight);
+ // We are starting at position .5 in textel space
+ INT32 theSrcYPtr = theYIncrement / 2;
+ CHAR *theDstPtr = outDstBuffer;
+ for (INT32 theHeightIndex = 0; theHeightIndex < inDstHeight;
+ ++theHeightIndex, theSrcYPtr += theYIncrement) {
+ INT32 theSrcRow = (theSrcYPtr / 1024) * inSrcWidth * TNumChannels;
+ INT32 theSrcXPtr = theXIncrement / 2;
+ for (INT32 theWidthIndex = 0; theWidthIndex < inDstWidth;
+ ++theWidthIndex, theSrcXPtr += theXIncrement, theDstPtr += TNumChannels) {
+ INT32 theSrcPtr = theSrcRow + (theSrcXPtr >> 10) * TNumChannels;
+ for (INT32 idx = 0; idx < TNumChannels; ++idx)
+ theDstPtr[idx] = inSrcBuffer[theSrcPtr + idx];
+ }
+ }
+ }
+
+ inline void NearestReduceImage(const CHAR *inSrcBuffer, INT32 inSrcWidth, INT32 inSrcHeight,
+ INT32 inChannels, CHAR *outDstBuffer, INT32 inDstWidth,
+ INT32 inDstHeight)
+ {
+ switch (inChannels) {
+ case 4:
+ NearestReduceImage<4>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth,
+ inDstHeight);
+ break;
+ case 3:
+ NearestReduceImage<3>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth,
+ inDstHeight);
+ break;
+ case 2:
+ NearestReduceImage<2>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth,
+ inDstHeight);
+ break;
+ case 1:
+ NearestReduceImage<1>(inSrcBuffer, inSrcWidth, inSrcHeight, outDstBuffer, inDstWidth,
+ inDstHeight);
+ break;
+ }
+ }
+}
+} \ No newline at end of file
diff --git a/src/engine/OpenKodeInclude.h b/src/engine/OpenKodeInclude.h
new file mode 100644
index 0000000..06bdf00
--- /dev/null
+++ b/src/engine/OpenKodeInclude.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Includes
+//==============================================================================
+
+// Wrap the <kd/kd.h> include so we can ensure it gets compiled with 8 byte alignment
+// also, this means we need to compile nv_main.c (via right click -> properties) with 8 byte
+// alignment too!
+
+#pragma pack(push)
+#pragma pack(8)
+#include <KD/kd.h>
+#pragma pack(pop)
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace NVUI {
+
+} // namespace NVUI
diff --git a/src/engine/Qt3DSEGLInfo.h b/src/engine/Qt3DSEGLInfo.h
new file mode 100644
index 0000000..7be2c09
--- /dev/null
+++ b/src/engine/Qt3DSEGLInfo.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_EGLINFO_H
+#define QT3DS_EGLINFO_H
+
+#ifdef _PLATFORM_USE_EGL
+#include <EGL/egl.h>
+
+namespace Q3DStudio {
+struct SEGLInfo
+{
+ EGLDisplay display;
+ EGLSurface surface;
+ EGLContext context;
+ EGLConfig config;
+ EGLNativeWindowType nativewin;
+};
+};
+
+#else
+namespace Q3DStudio {
+struct SEGLInfo
+{
+ void *display;
+ void *surface;
+ void *context;
+ void *config;
+ void *nativewin;
+};
+};
+#endif
+
+#endif
diff --git a/src/engine/Qt3DSEGLWindowSystem.h b/src/engine/Qt3DSEGLWindowSystem.h
new file mode 100644
index 0000000..770f5c9
--- /dev/null
+++ b/src/engine/Qt3DSEGLWindowSystem.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_EGL_WINDOW_SYSTEM_H
+#define QT3DS_EGL_WINDOW_SYSTEM_H
+#include "Qt3DSEGLInfo.h"
+#include "Qt3DSWindowSystem.h"
+#include "nv_main/nv_main.h"
+
+namespace Q3DStudio {
+struct SEGLWindowSystemImpl : public IWindowSystem
+{
+ SEGLInfo m_EGLInfo;
+
+ virtual QSize GetWindowDimensions()
+ {
+ int w, h;
+
+ eglQuerySurface(gEGLHandles[0].display, gEGLHandles[0].surface, EGL_WIDTH, &w);
+ eglQuerySurface(gEGLHandles[0].display, gEGLHandles[0].surface, EGL_HEIGHT, &h);
+
+ return QSize(w, h);
+ }
+ virtual void SetWindowDimensions(const QSize &) {}
+ // For platforms that support it, we get the egl info for render plugins
+ // Feel free to return NULL.
+ virtual SEGLInfo *GetEGLInfo()
+ {
+ m_EGLInfo.display = gEGLHandles[0].display;
+ m_EGLInfo.surface = gEGLHandles[0].surface;
+ m_EGLInfo.context = gEGLHandles[0].context;
+ m_EGLInfo.config = gEGLHandles[0].config;
+ m_EGLInfo.nativewin = gEGLHandles[0].nativewin;
+ return &m_EGLInfo;
+ }
+ // on some systems we allow our default render target to be a offscreen buffer
+ // otherwise return 0;
+ virtual int GetDefaultRenderTargetID() { return 0; }
+ // returns the depth buffer bit count for the render window
+ // overwrite this one for your own needs
+ virtual int GetDepthBitCount()
+ {
+ EGLint depth = 16;
+#ifdef _PLATFORM_USE_EGL
+ if (gEGLHandles[0].display && gEGLHandles[0].config)
+ eglGetConfigAttrib(gEGLHandles[0].display, gEGLHandles[0].config, EGL_DEPTH_SIZE,
+ &depth);
+#endif
+
+ return depth;
+ }
+};
+};
+
+#endif
diff --git a/src/engine/Qt3DSPluginDLL.h b/src/engine/Qt3DSPluginDLL.h
new file mode 100644
index 0000000..1ba7cf0
--- /dev/null
+++ b/src/engine/Qt3DSPluginDLL.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//==============================================================================
+// Includes
+//==============================================================================
+#pragma once
+#include "Qt3DSBasicPluginDLL.h"
+
+#include <QtGlobal>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//==============================================================================
+// Enums
+//==============================================================================
+// Texture format
+typedef enum _ETEXTUREFORMAT {
+ ETEXTUREFORMAT_Unknown = 0,
+ ETEXTUREFORMAT_RGBA8,
+ ETEXTUREFORMAT_RGB8,
+ ETEXTUREFORMAT_RGB565,
+ ETEXTUREFORMAT_RGBA5551,
+ ETEXTUREFORMAT_Alpha8,
+ ETEXTUREFORMAT_Luminance8,
+ ETEXTUREFORMAT_LuminanceAlpha8,
+ ETEXTUREFORMAT_RGBA_DXT1,
+ ETEXTUREFORMAT_RGB_DXT1,
+ ETEXTUREFORMAT_RGBA_DXT3,
+ ETEXTUREFORMAT_RGBA_DXT5,
+} ETEXTUREFORMAT;
+
+//==============================================================================
+// Functions declarations
+//==============================================================================
+
+//==============================================================================
+/**
+ * Perform plugin initialization.
+ * @param inArgs string arguments from XIF arg parameter
+ * @return EDLLSTATUS_OK if initialization suceeds
+ */
+typedef long (*PROC_Initialize)(const char *inArgs);
+Q_DECL_EXPORT long Initialize(const char *inArgs);
+
+//==============================================================================
+/**
+ * Passes the current screen size and format to the plugin.
+ * Plugin should override with it's own desired settings.
+ * This affects the size and format of the allocated offscreen texture.
+ * When resources are allocated, SetAllocatedRenderInfo will be called to
+ * inform the plugin of the allocated resources
+ * @param ioWidth width
+ * @param ioHeight height
+ * @param ioTextureFormat See ETEXTUREFORMAT
+ */
+typedef void (*PROC_GetDesiredTextureSize)(long *ioWidth, long *ioHeight,
+ ETEXTUREFORMAT *ioTextureFormat);
+Q_DECL_EXPORT void GetDesiredTextureSize(long *ioWidth, long *ioHeight,
+ ETEXTUREFORMAT *ioTextureFormat);
+
+//==============================================================================
+/**
+ * Information about the current EGL environment.
+ * Useful if plugin wishes to switch EGLContext to manage it's own state.
+ * Optional
+ * @param inEGLDisplay pointer to EGLDisplay
+ * @param inEGLCurrentContext pointer to current EGLContext
+ * @param inEGLSurface pointer to EGLSurface
+ * @param inEGLConfig pointer to EGLConfig attributes
+ */
+typedef void (*PROC_SetEGLInfo)(void *inEGLDisplay, void *inEGLCurrentContext, void *inEGLSurface,
+ void *inEGLConfig);
+Q_DECL_EXPORT void SetEGLInfo(void *inEGLDisplay, void *inEGLCurrentContext,
+ void *inEGLSurface, void *inEGLConfig);
+
+//==============================================================================
+/**
+ * Render pulse whenever the runtime requires a frame from the plugin.
+ * Note that if plugin wishes to switch EGLContext,
+ * it should restore the previous EGLContext(obtained from SetEGLInfo) at the end of this
+ *function.
+ * @param inHostWidth width of the host rectangle
+ * @param inHostHeight height of the host rectangle
+ * @param inDrawTime current time in milliseconds
+ */
+typedef void (*PROC_Render)(long inHostWidth, long inHostHeight, long inDrawTime);
+Q_DECL_EXPORT void Render(long inHostWidth, long inHostHeight, long inDrawTime);
+
+//==============================================================================
+/**
+ * Perform plugin uninitialization.
+ * @return EDLLSTATUS_OK if successful
+ */
+typedef long (*PROC_Uninitialize)();
+Q_DECL_EXPORT long Uninitialize();
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/engine/Qt3DSRenderRuntimeBinding.cpp b/src/engine/Qt3DSRenderRuntimeBinding.cpp
new file mode 100644
index 0000000..4507c74
--- /dev/null
+++ b/src/engine/Qt3DSRenderRuntimeBinding.cpp
@@ -0,0 +1,1858 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "EnginePrefix.h"
+#include "Qt3DSRenderRuntimeBindingImpl.h"
+#include "Qt3DSSceneManager.h"
+#include "Qt3DSIScene.h"
+#include "Qt3DSRuntimeView.h"
+#include "Qt3DSQmlEngine.h"
+#include "Qt3DSRenderUIPLoader.h"
+#include "Qt3DSPresentationFrameData.h"
+#include "foundation/AutoDeallocatorAllocator.h"
+#include "Qt3DSRenderSubpresentation.h"
+#include "Qt3DSIScriptBridge.h"
+#include "Qt3DSFileStream.h"
+#include "Qt3DSDMPrefix.h"
+#include "foundation/IOStreams.h"
+#include "Qt3DSDMStringTable.h"
+#include "Qt3DSDMXML.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "foundation/SerializationTypes.h"
+#include "Qt3DSRenderGraphObjectSerializer.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderImageBatchLoader.h"
+#include "Qt3DSPresentation.h"
+
+#include "Qt3DSDLLManager.h"
+#include "Qt3DSBasicPluginDLL.h"
+#include "Qt3DSPluginDLL.h"
+#include "Qt3DSRenderPlugin.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSStateVisualBindingContextCommands.h"
+#include "Qt3DSStateScriptContext.h"
+#include "EventPollingSystem.h"
+#include "EventSystem.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSMatrix.h"
+#include "Qt3DSWindowSystem.h"
+#if !defined (Q_OS_MACOS)
+#include "Qt3DSEGLInfo.h"
+#endif
+#include "Qt3DSOffscreenRenderKey.h"
+#include "Qt3DSOldNBustedRenderPlugin.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "Qt3DSRenderBufferLoader.h"
+#include "Qt3DSRenderRenderList.h"
+#include "Qt3DSRenderPrefilterTexture.h"
+#include "foundation/PoolingAllocator.h"
+#include "q3dsqmlrender.h"
+
+#ifdef EA_PLATFORM_WINDOWS
+#pragma warning(disable : 4355)
+#endif
+
+using namespace qt3ds::render;
+using eastl::make_pair;
+using eastl::pair;
+using qt3ds::runtime::IApplication;
+
+#ifndef _WIN32
+#define stricmp strcasecmp
+#endif
+namespace qt3ds {
+namespace render {
+ qt3ds::foundation::MallocAllocator g_BaseAllocator;
+}
+}
+namespace {
+struct Qt3DSRenderScene;
+
+struct Qt3DSRenderSceneSubPresRenderer : public CSubPresentationRenderer
+{
+ Qt3DSRenderScene &m_Scene;
+ Qt3DSRenderSceneSubPresRenderer(Qt3DSRenderScene &inScene, IQt3DSRenderContext &inRenderContext,
+ SPresentation &inPresentation)
+ : CSubPresentationRenderer(inRenderContext, inPresentation)
+ , m_Scene(inScene)
+ {
+ }
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext.GetAllocator())
+ SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment,
+ QT3DSVec2 inPresScale,
+ const SRenderInstanceId instanceId) override;
+ void Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer,
+ const SRenderInstanceId instanceId) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec4 inClearColor,
+ const SRenderInstanceId instanceId) override;
+};
+
+struct SSceneLoadData
+{
+ NVAllocatorCallback &m_Allocator;
+ NVScopedRefCounted<ILoadedBuffer> m_Data;
+ SPresentation *m_Presentation;
+ NVDataRef<QT3DSU8> m_TranslatorData;
+ NVDataRef<QT3DSU8> m_SceneGraphData;
+ eastl::vector<Qt3DSTranslator *> m_Translators;
+ SPoolingAllocator m_AutoAllocator;
+ Q3DStudio::IPresentation *m_RuntimePresentation;
+ QT3DSI32 mRefCount;
+
+ SSceneLoadData(NVAllocatorCallback &alloc)
+ : m_Allocator(alloc)
+ , m_Presentation(nullptr)
+ , m_AutoAllocator(alloc)
+ , m_RuntimePresentation(nullptr)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Allocator)
+};
+
+struct Qt3DSRenderScene : public Q3DStudio::IScene
+{
+ SBindingCore &m_BindingCore;
+ NVScopedRefCounted<IQt3DSRenderContext> m_Context;
+ NVScopedRefCounted<SSceneLoadData> m_LoadData;
+ // The scene graph gets allocated kind of on its own
+ // So do the smaller translation objects that translate TElement properties
+ // into the graph.
+ SPresentation *m_Presentation;
+ Q3DStudio::IPresentation *m_RuntimePresentation;
+ void *m_UserData;
+ TTranslatorDirytSet m_DirtySet;
+ CRegisteredString m_OffscreenRendererId;
+ IOffscreenRenderer *m_OffscreenRenderer;
+ CRegisteredString m_SubPresentationType;
+ nvvector<SGraphObject *> m_GraphObjectList;
+ bool m_LoggedPickLastFrame;
+ NVRenderRect m_LastRenderViewport;
+ CRegisteredString m_PathSubPathType;
+
+ Qt3DSRenderScene(SBindingCore &inBindingCore, IQt3DSRenderContext &inContext,
+ SSceneLoadData &inLoadData)
+ : m_BindingCore(inBindingCore)
+ , m_Context(inContext)
+ , m_LoadData(inLoadData)
+ , m_Presentation(inLoadData.m_Presentation)
+ , m_RuntimePresentation(inLoadData.m_RuntimePresentation)
+ , m_UserData(nullptr)
+ , m_DirtySet(inContext.GetAllocator(), "Qt3DSRenderScene::m_DirtySet")
+ , m_OffscreenRenderer(nullptr)
+ , m_SubPresentationType(
+ inContext.GetStringTable().RegisterStr(CSubPresentationRenderer::GetRendererName()))
+ , m_GraphObjectList(inContext.GetAllocator(), "Qt3DSDSRenderScene::m_GraphObjectList")
+ , m_LoggedPickLastFrame(false)
+ {
+ for (QT3DSU32 idx = 0, end = inLoadData.m_Translators.size(); idx < end; ++idx) {
+ m_DirtySet.insert(*inLoadData.m_Translators[idx]);
+ }
+ m_PathSubPathType = inContext.GetStringTable().RegisterStr("PathAnchorPoint");
+ }
+
+ virtual ~Qt3DSRenderScene() override
+ {
+ if (m_OffscreenRenderer)
+ m_Context->GetOffscreenRenderManager().ReleaseOffscreenRenderer(m_OffscreenRendererId);
+ m_OffscreenRenderer = nullptr;
+ if (m_Presentation && m_Presentation->m_Scene) {
+ for (SLayer *theLayer = m_Presentation->m_Scene->m_FirstChild; theLayer;
+ theLayer = static_cast<SLayer *>(theLayer->m_NextSibling)) {
+ m_Context->GetRenderer().ReleaseLayerRenderResources(*theLayer, nullptr);
+ }
+ }
+ }
+
+ qt3ds::NVAllocatorCallback &allocator() override { return m_LoadData->m_AutoAllocator; }
+ Q3DStudio::IPresentation &GetPresentation() override { return *m_RuntimePresentation; }
+
+ bool preferKtx() const override
+ {
+ return m_Presentation->m_preferKTX;
+ }
+
+ // Update really just adds objects to the dirty set
+ bool Update()
+ {
+ Q3DStudio::TElementList &theDirtyList =
+ m_RuntimePresentation->GetFrameData().GetDirtyList();
+ for (int idx = 0, end = theDirtyList.GetCount(); idx < end; ++idx) {
+ Q3DStudio::TElement &theElement = *theDirtyList[idx];
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(theElement.GetAssociation());
+ if (!theTranslator && theElement.GetType() == m_PathSubPathType) {
+ Q3DStudio::TElement *theParent = theElement.GetParent();
+ if (theParent) {
+ theTranslator = reinterpret_cast<Qt3DSTranslator *>(theParent->GetAssociation());
+ // The path translator responds to anchor point changes as well as its own data
+ // changes.
+ if (theTranslator
+ && theTranslator->RenderObject().m_Type != GraphObjectTypes::PathSubPath)
+ theTranslator = nullptr;
+ }
+ }
+ if (theTranslator)
+ m_DirtySet.insert(*theTranslator);
+ }
+ return m_DirtySet.size() > 0;
+ }
+
+ void TransferDirtyProperties()
+ {
+ if (m_Presentation) {
+ for (QT3DSU32 idx = 0, end = m_DirtySet.size(); idx < end; ++idx) {
+ QT3DS_ASSERT(m_DirtySet.size() == end);
+ m_DirtySet[idx]->OnElementChanged(*m_Presentation, *m_Context,
+ *m_RuntimePresentation);
+ }
+ m_DirtySet.clear();
+ }
+ }
+
+ bool PrepareForRender()
+ {
+ TransferDirtyProperties();
+ m_LastRenderViewport = m_Context->GetRenderList().GetViewport();
+ if (m_Presentation && m_Presentation->m_Scene) {
+ NVRenderRect theViewportSize(m_LastRenderViewport);
+ return m_Presentation->m_Scene->PrepareForRender(
+ QT3DSVec2(QT3DSF32(theViewportSize.m_Width), QT3DSF32(theViewportSize.m_Height)),
+ *m_Context);
+ }
+ return false;
+ }
+
+ void Render()
+ {
+ if (m_Presentation && m_Presentation->m_Scene) {
+ NVRenderRect theViewportSize(m_LastRenderViewport);
+ m_Presentation->m_Scene->Render(
+ QT3DSVec2(QT3DSF32(theViewportSize.m_Width), QT3DSF32(theViewportSize.m_Height)),
+ *m_Context, SScene::DoNotClear);
+ }
+ }
+
+ // Note that we do not need to call WindowToPresentation on the mouse coordinates because they
+ // are specifically
+ // supposed to be the return values from getMousePosition which applies that transformation. We
+ // do, however need
+ // to reverse part of this transformation; whatever part happens after
+ // m_Context->GetMousePickMouseCoords
+ Q3DStudio::TElement *UserPick(float mouseX, float mouseY)
+ {
+ // Note that the pick code below only calls GetMousePickMouseCoords
+ // while windowToPresentation subtracts the window positional offset from
+ // the mouse position.
+ // Thus we have to add it back.
+ QT3DSVec2 mousePos(mouseX + m_LastRenderViewport.m_X, mouseY + m_LastRenderViewport.m_Y);
+
+ Qt3DSRenderPickResult thePickResult = m_Context->GetRenderer().Pick(
+ *m_Presentation->m_Scene->m_FirstChild, m_Context->GetMousePickViewport()
+ // GetMousePickMouseCoords is called by the renderer to setup the pick frame.
+ // This is so that the presentation's lastMouseX and lastMouseY variables are correctly
+ // setup.
+ ,
+ mousePos, true, true);
+
+ if (thePickResult.m_HitObject != nullptr) {
+ SModel *theHitModel =
+ static_cast<SModel *>(const_cast<SGraphObject *>(thePickResult.m_HitObject));
+ return &Qt3DSTranslator::GetTranslatorFromGraphNode(*theHitModel)->Element();
+ }
+ return nullptr;
+ }
+
+ virtual Option<QT3DSVec2> FacePosition(Q3DStudio::TElement &inElement, float mouseX, float mouseY,
+ NVDataRef<Q3DStudio::TElement *> inMapperElements,
+ Q3DStudio::FacePositionPlanes::Enum inPlane)
+ {
+ if (inElement.GetBelongedPresentation() != this->m_RuntimePresentation
+ && inMapperElements.size() == 0) {
+ return Empty();
+ }
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement.GetAssociation());
+ if (theTranslator == nullptr)
+ return Empty();
+ bool isValidPickObject =
+ GraphObjectTypes::IsNodeType(theTranslator->m_RenderObject->m_Type);
+ if (isValidPickObject == false)
+ return Empty();
+ SNode &theNode = static_cast<SNode &>(*theTranslator->m_RenderObject);
+ NVBounds3 theBounds = GetNodeLocalBoundingBox(&inElement, false);
+ // See commens in UserPick
+ QT3DSVec2 mousePos(mouseX + m_LastRenderViewport.m_X, mouseY + m_LastRenderViewport.m_Y);
+ eastl::vector<SGraphObject *> theMapperObjects(inMapperElements.size());
+ for (QT3DSU32 idx = 0, end = inMapperElements.size(); idx < end; ++idx) {
+ Qt3DSTranslator *theMapperTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inMapperElements[idx]->GetAssociation());
+ SGraphObject *theMapperObject = nullptr;
+ if (theMapperTranslator) {
+ theMapperObject = theMapperTranslator->m_RenderObject;
+ }
+ if (theMapperObject == nullptr) {
+ QT3DS_ASSERT(false);
+ } else {
+ theMapperObjects[idx] = theMapperObject;
+ }
+ }
+ qt3ds::render::SBasisPlanes::Enum thePlane(qt3ds::render::SBasisPlanes::XY);
+ switch (inPlane) {
+ case Q3DStudio::FacePositionPlanes::XY:
+ thePlane = qt3ds::render::SBasisPlanes::XY;
+ break;
+ case Q3DStudio::FacePositionPlanes::YZ:
+ thePlane = qt3ds::render::SBasisPlanes::YZ;
+ break;
+ case Q3DStudio::FacePositionPlanes::XZ:
+ thePlane = qt3ds::render::SBasisPlanes::XZ;
+ break;
+ }
+ if (theBounds.isEmpty() == false) {
+ return m_Context->GetRenderer().FacePosition(
+ theNode, theBounds, theNode.m_GlobalTransform, m_Context->GetMousePickViewport(),
+ mousePos, NVDataRef<SGraphObject *>(theMapperObjects.data(),
+ QT3DSU32(theMapperObjects.size())), thePlane);
+ }
+ return Empty();
+ }
+
+ void Pick(Q3DStudio::SPickFrame &ioPickFrame)
+ {
+ // Presentation's m_Hide can disable rendering
+ bool wasPickLoggedLastFrame = m_LoggedPickLastFrame;
+ m_LoggedPickLastFrame = false;
+ if (ioPickFrame.m_InputFrame.m_PickValid) {
+ // If we have not already found a valid pick on a previous layer
+ if (!ioPickFrame.m_ResultValid && m_Presentation && m_Presentation->m_Scene
+ && m_Presentation->m_Scene->m_FirstChild) {
+ Qt3DSRenderPickResult thePickResult = m_Context->GetRenderer().Pick(
+ *m_Presentation->m_Scene->m_FirstChild, m_Context->GetMousePickViewport()
+ // GetMousePickMouseCoords is called by the renderer to setup the pick frame.
+ // This is so that the presentation's lastMouseX and lastMouseY variables are
+ // correctly setup.
+ ,
+ m_Context->GetMousePickMouseCoords(
+ QT3DSVec2(ioPickFrame.m_InputFrame.m_PickX, ioPickFrame.m_InputFrame.m_PickY)),
+ true);
+ if (thePickResult.m_HitObject != nullptr) {
+ SModel *theHitModel = static_cast<SModel *>(
+ const_cast<SGraphObject *>(thePickResult.m_HitObject));
+ ioPickFrame.m_Model =
+ &Qt3DSTranslator::GetTranslatorFromGraphNode(*theHitModel)->Element();
+ // I don't think local hit is used any more, but not sure. If they are used,
+ // then the code below is probably wrong.
+ ioPickFrame.m_LocalHit[0] = thePickResult.m_LocalUVCoords.x;
+ ioPickFrame.m_LocalHit[1] = thePickResult.m_LocalUVCoords.y;
+ ioPickFrame.m_SquaredDistance = thePickResult.m_CameraDistanceSq;
+ ioPickFrame.m_ResultValid = true;
+ if (wasPickLoggedLastFrame == false) {
+ m_LoggedPickLastFrame = true;
+ Q3DStudio::IPresentation *thePresentation =
+ ioPickFrame.m_Model->GetBelongedPresentation();
+ IApplication &theRuntime = thePresentation->GetApplication();
+ // We are picking against the previous frame of information.
+ qCInfo(TRACE_INFO, "Model Picked: %s on frame %d",
+ theHitModel->m_Id.c_str(),
+ theRuntime.GetFrameCount() - 1);
+ }
+ } else {
+ // The scene is always picked if it is pickable; nothing else really makes
+ // sense.
+ Qt3DSTranslator *theTranslator =
+ Qt3DSTranslator::GetTranslatorFromGraphNode(*m_Presentation->m_Scene);
+
+ if (theTranslator) {
+ ioPickFrame.m_Model = &theTranslator->Element();
+ // I don't think local hit is used any more, but not sure. If they are
+ // used, then the code below is probably wrong.
+ ioPickFrame.m_LocalHit[0] = ioPickFrame.m_InputFrame.m_PickX
+ / m_Presentation->m_PresentationDimensions.x;
+ ioPickFrame.m_LocalHit[1] = 1.0f
+ - ioPickFrame.m_InputFrame.m_PickY
+ / m_Presentation->m_PresentationDimensions.y;
+ ioPickFrame.m_SquaredDistance = 0;
+ ioPickFrame.m_ResultValid = true;
+ }
+ }
+ }
+ }
+ }
+
+ void SetUserData(void *inUserData) override { m_UserData = inUserData; }
+ void *GetUserData() override { return m_UserData; }
+
+ // Unfortunately, you should expect the node to be dirty at this point so we may need to force
+ // an update
+ void CalculateGlobalTransform(Q3DStudio::TElement *inElement,
+ Q3DStudio::RuntimeMatrix &outTransform) override
+ {
+ if (inElement == nullptr) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement->GetAssociation());
+ if (theTranslator && GraphObjectTypes::IsNodeType(theTranslator->GetUIPType())) {
+ Update();
+ TransferDirtyProperties();
+ SNode *theNode = static_cast<SNode *>(&theTranslator->RenderObject());
+ // Ensure the node stays dirty
+ bool wasDirty = theNode->m_Flags.IsDirty();
+ theNode->CalculateGlobalVariables();
+ theNode->m_Flags.SetDirty(wasDirty);
+ memCopy(outTransform.m_Data, theNode->m_GlobalTransform.front(), sizeof(QT3DSMat44));
+ } else {
+ qCCritical(INVALID_OPERATION, "Calculate global transform called on invalide object");
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void SetLocalTransformMatrix(Q3DStudio::TElement *inElement,
+ const Q3DStudio::RuntimeMatrix &inTransform) override
+ {
+ if (inElement == nullptr) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement->GetAssociation());
+ if (theTranslator && GraphObjectTypes::IsNodeType(theTranslator->GetUIPType())) {
+ SNode *theNode = static_cast<SNode *>(&theTranslator->RenderObject());
+ QT3DSMat44 transform;
+ memCopy(transform.front(), inTransform.m_Data, sizeof(QT3DSMat44));
+ theNode->SetLocalTransformFromMatrix(transform);
+ theNode->MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ }
+ }
+
+ void EnsureNodeIsUpToDate(SNode &inNode, bool inIncludeChildren)
+ {
+ bool wasDirty = inNode.m_Flags.IsDirty();
+ if (wasDirty) {
+ inNode.CalculateGlobalVariables();
+ inNode.m_Flags.SetDirty(wasDirty);
+ if (inIncludeChildren) {
+ for (SNode *theChild = inNode.m_FirstChild; theChild;
+ theChild = theChild->m_NextSibling)
+ EnsureNodeIsUpToDate(*theChild, inIncludeChildren);
+ }
+ }
+ }
+
+ NVBounds3 GetNodeLocalBoundingBox(Q3DStudio::TElement *inElement, bool inSelfOnly)
+ {
+ NVBounds3 retval(NVBounds3::empty());
+ if (inElement == nullptr) {
+ QT3DS_ASSERT(false);
+ return retval;
+ }
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement->GetAssociation());
+ if (theTranslator && GraphObjectTypes::IsNodeType(theTranslator->GetUIPType())) {
+ Update();
+ TransferDirtyProperties();
+ SNode *theNode = static_cast<SNode *>(&theTranslator->RenderObject());
+ bool theIncludeChildren = !inSelfOnly;
+ EnsureNodeIsUpToDate(*theNode, theIncludeChildren);
+ IBufferManager &theBufferManager(m_Context->GetBufferManager());
+ return theNode->GetBounds(theBufferManager, m_Context->GetPathManager(),
+ theIncludeChildren);
+ } else {
+ qCCritical(INVALID_OPERATION, "GetBoundingBox called on invalid object");
+ QT3DS_ASSERT(false);
+ }
+ return retval;
+ }
+
+ static void Assign(Q3DStudio::CBoundingBox &lhs, NVBounds3 &rhs)
+ {
+ lhs.m_Min.m_X = rhs.minimum.x;
+ lhs.m_Min.m_Y = rhs.minimum.y;
+ lhs.m_Min.m_Z = rhs.minimum.z;
+
+ lhs.m_Max.m_X = rhs.maximum.x;
+ lhs.m_Max.m_Y = rhs.maximum.y;
+ lhs.m_Max.m_Z = rhs.maximum.z;
+ }
+
+ Q3DStudio::CBoundingBox GetBoundingBox(Q3DStudio::TElement *inElement, bool inSelfOnly) override
+ {
+ Q3DStudio::CBoundingBox retval;
+ retval.SetEmpty();
+ NVBounds3 theLocalBox = GetNodeLocalBoundingBox(inElement, inSelfOnly);
+ if (theLocalBox.isEmpty() == false) {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement->GetAssociation());
+ if (theTranslator && GraphObjectTypes::IsNodeType(theTranslator->GetUIPType())) {
+ SNode *theNode = static_cast<SNode *>(&theTranslator->RenderObject());
+ theLocalBox.transform(theNode->m_GlobalTransform);
+ Assign(retval, theLocalBox);
+ // Left handed nodes need to return values in their space, not in the global space
+ // This is a hack fix due to a bug.
+ if (theNode->m_Flags.IsLeftHanded()) {
+ eastl::swap(retval.m_Min.m_Z, retval.m_Max.m_Z);
+ retval.m_Min.m_Z *= -1;
+ retval.m_Max.m_Z *= -1;
+ }
+ }
+ }
+ return retval;
+ }
+
+ Q3DStudio::CBoundingBox GetLocalBoundingBox(Q3DStudio::TElement *inElement,
+ bool inSelfOnly) override
+ {
+ Q3DStudio::CBoundingBox retval;
+ retval.SetEmpty();
+ if (inElement == nullptr) {
+ QT3DS_ASSERT(false);
+ return retval;
+ }
+ NVBounds3 theLocalBounds = GetNodeLocalBoundingBox(inElement, inSelfOnly);
+ if (theLocalBounds.isEmpty() == false)
+ Assign(retval, theLocalBounds);
+
+ return retval;
+ }
+
+ Q3DStudio::SCameraRect GetCameraBounds(Q3DStudio::TElement &inElem) override
+ {
+ Qt3DSTranslator *theTranslator = reinterpret_cast<Qt3DSTranslator *>(inElem.GetAssociation());
+ if (theTranslator && theTranslator->m_RenderObject) {
+ Option<qt3ds::render::SCuboidRect> theRectOpt =
+ m_Context->GetRenderer().GetCameraBounds(*theTranslator->m_RenderObject);
+ if (theRectOpt.hasValue()) {
+ qt3ds::render::SCuboidRect theRect(*theRectOpt);
+ return Q3DStudio::SCameraRect(theRect.m_Left, theRect.m_Top, theRect.m_Right,
+ theRect.m_Bottom);
+ }
+ }
+ return Q3DStudio::SCameraRect();
+ }
+
+ void PositionToScreen(Q3DStudio::TElement &inElement, QT3DSVec3 &inPos, QT3DSVec3 &outScreen) override
+ {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement.GetAssociation());
+ if (theTranslator && theTranslator->m_RenderObject) {
+ SNode *theNode = reinterpret_cast<SNode *>(theTranslator->m_RenderObject);
+ QT3DSVec3 thePos = theNode->m_GlobalTransform.transform(inPos);
+ outScreen = m_Context->GetRenderer().ProjectPosition(*theNode, thePos);
+ }
+ }
+
+ void ScreenToPosition(Q3DStudio::TElement &inElement, QT3DSVec3 &inScreen, QT3DSVec3 &outPos) override
+ {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement.GetAssociation());
+ if (theTranslator && theTranslator->m_RenderObject) {
+ SNode *theNode = reinterpret_cast<SNode *>(theTranslator->m_RenderObject);
+ QT3DSVec3 objPos = theNode->GetGlobalPos();
+ outPos = m_Context->GetRenderer().UnprojectWithDepth(*(theNode), objPos, inScreen);
+ }
+ }
+
+ static void GenerateBsdfMipmaps(SImage *theImage, const unsigned char *inBuffer,
+ Q3DStudio::INT32 inBufferLength, Q3DStudio::INT32 inWidth,
+ Q3DStudio::INT32 inHeight,
+ qt3ds::render::NVRenderTextureFormats::Enum inFormat,
+ IQt3DSRenderContext *theContext)
+ {
+ NVRenderTextureFormats::Enum destFormat = qt3ds::render::NVRenderTextureFormats::RGBA16F;
+
+ Qt3DSRenderPrefilterTexture *theBSDFMipMap = theImage->m_TextureData.m_BSDFMipMap;
+ if (theBSDFMipMap == nullptr) {
+ theBSDFMipMap = Qt3DSRenderPrefilterTexture::Create(
+ &theContext->GetRenderContext(), inWidth, inHeight,
+ *theImage->m_TextureData.m_Texture, destFormat, theContext->GetFoundation());
+ theImage->m_TextureData.m_BSDFMipMap = theBSDFMipMap;
+ }
+
+ if (theBSDFMipMap)
+ theBSDFMipMap->Build((void *)(inBuffer), inBufferLength, inFormat);
+ }
+
+ // This could cause some significant drama.
+ void SetTextureData(Q3DStudio::TElement *inElement, const unsigned char *inBuffer,
+ Q3DStudio::INT32 inBufferLength, Q3DStudio::INT32 inWidth,
+ Q3DStudio::INT32 inHeight,
+ qt3ds::render::NVRenderTextureFormats::Enum inFormat,
+ Q3DStudio::INT32 inHasTransparency) override
+ {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement->GetAssociation());
+ if (theTranslator && theTranslator->GetUIPType() == GraphObjectTypes::Image) {
+ SImage *theImage = static_cast<SImage *>(&theTranslator->RenderObject());
+ // Attempt to resolve the image's path
+ if (!theImage->m_TextureData.m_Texture) {
+ if (theImage->m_ImagePath.IsValid())
+ theImage->m_TextureData = m_Context->GetBufferManager().LoadRenderImage(
+ theImage->m_ImagePath, false,
+ theImage->m_MappingMode == ImageMappingModes::LightProbe);
+ }
+ // Here we go, updating the texture.
+ if (theImage->m_TextureData.m_Texture) {
+
+ if (theImage->m_MappingMode == ImageMappingModes::LightProbe) {
+ // theImage->m_TextureData.m_Texture->GenerateMipmaps();
+ GenerateBsdfMipmaps(theImage, inBuffer, inBufferLength, inWidth, inHeight,
+ inFormat, m_Context);
+ } else
+ theImage->m_TextureData.m_Texture->SetTextureData(
+ NVDataRef<QT3DSU8>((QT3DSU8 *)inBuffer, (QT3DSU32)inBufferLength), 0, inWidth,
+ inHeight, inFormat);
+
+ if (inHasTransparency >= 0) {
+ bool hasTransparency = inHasTransparency ? true : false;
+ theImage->m_TextureData.m_TextureFlags.SetHasTransparency(hasTransparency);
+ m_Context->GetBufferManager().SetImageHasTransparency(theImage->m_ImagePath,
+ hasTransparency);
+ }
+ theImage->m_Flags.SetDirty(true);
+ }
+ } else {
+ qCCritical(INVALID_OPERATION, "SetTextureData called on object that is not an image");
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ bool CreateOrSetMeshData(const char *inPathStr, unsigned char *vertData,
+ unsigned int numVerts, unsigned int vertStride,
+ unsigned int *indexData, unsigned int numIndices,
+ qt3ds::NVBounds3 &objBounds) override
+ {
+ SRenderMesh *theMesh = nullptr;
+
+ if (inPathStr && vertData && indexData) {
+ theMesh = m_Context->GetBufferManager().CreateMesh(
+ inPathStr, vertData, numVerts, vertStride, indexData, numIndices, objBounds);
+ } else {
+ qCCritical(INVALID_OPERATION,
+ "CreateOrSetMeshData was not supplied necessary buffers or object path");
+ }
+
+ return (theMesh != nullptr);
+ }
+
+ Q3DStudio::STextSizes MeasureText(Q3DStudio::TElement *inElement, const char *inTextStr) override
+ {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inElement->GetAssociation());
+ Q3DStudio::STextSizes retval;
+ if (theTranslator && theTranslator->GetUIPType() == GraphObjectTypes::Text) {
+ if (inElement->IsDirty()) {
+ theTranslator->OnElementChanged(*m_Presentation, *m_Context,
+ *m_RuntimePresentation);
+ }
+ SText *theText = static_cast<SText *>(&theTranslator->RenderObject());
+ if (theText) {
+
+ STextDimensions theDimensions =
+ m_Context->GetTextRenderer()->MeasureText(*theText, 1.0f, inTextStr);
+
+ retval = Q3DStudio::STextSizes(Q3DStudio::INT32(theDimensions.m_TextWidth),
+ Q3DStudio::INT32(theDimensions.m_TextHeight));
+ }
+ } else {
+ qCCritical(INVALID_OPERATION, "MeasureText called on object that is not text");
+ QT3DS_ASSERT(false);
+
+ }
+ return retval;
+ }
+
+ Q3DStudio::STextSizes GetPresentationDesignDimensions() override
+ {
+ if (m_Presentation) {
+ return Q3DStudio::STextSizes(
+ static_cast<Q3DStudio::INT32>(m_Presentation->m_PresentationDimensions.x),
+ static_cast<Q3DStudio::INT32>(m_Presentation->m_PresentationDimensions.y));
+ }
+ QT3DS_ASSERT(false);
+ return Q3DStudio::STextSizes();
+ }
+
+ virtual Q3DStudio::SMousePosition
+ WindowToPresentation(const Q3DStudio::SMousePosition &inWindowCoords) override
+ {
+ // If there aren't any rotations, then account for the difference in width/height of the
+ // presentation and the window
+ QT3DSVec2 theCoords = m_Context->GetMousePickMouseCoords(
+ QT3DSVec2(QT3DSF32(inWindowCoords.m_X), QT3DSF32(inWindowCoords.m_Y)));
+ theCoords.x -= m_LastRenderViewport.m_X;
+ // Note that the mouse Y is reversed. Thus a positive offset of the viewport will reduce
+ // the mouse value.
+ theCoords.y -= m_LastRenderViewport.m_Y;
+ return Q3DStudio::SMousePosition(theCoords.x, theCoords.y);
+ }
+
+ qt3ds::foundation::CRegisteredString RegisterStr(const char *inStr) override
+ {
+ return m_Context->GetStringTable().RegisterStr(inStr);
+ }
+
+ void RegisterOffscreenRenderer(const char *inKey) override
+ {
+ m_OffscreenRenderer = QT3DS_NEW(m_Context->GetAllocator(), Qt3DSRenderSceneSubPresRenderer)(
+ *this, *m_Context, *m_Presentation);
+ m_OffscreenRendererId = m_Context->GetStringTable().RegisterStr(inKey);
+ m_Context->GetOffscreenRenderManager().RegisterOffscreenRenderer(m_OffscreenRendererId,
+ *m_OffscreenRenderer);
+ }
+
+ template <typename T, typename C>
+ void forAllObjects(nvvector<SGraphObject *> &vec, GraphObjectTypes::Enum type, C callable)
+ {
+ nvvector<SGraphObject *>::iterator it = vec.begin();
+ nvvector<SGraphObject *>::iterator end = vec.end();
+ while (it != end) {
+ if ((*it)->m_Type == type)
+ callable(static_cast<T*>(*it));
+ ++it;
+ }
+ }
+
+ void PostLoadStep()
+ {
+ IBufferManager &mgr = m_Context->GetBufferManager();
+ forAllObjects<SImage>(m_GraphObjectList, GraphObjectTypes::Image, [&mgr](SImage *image){
+ if (image->m_ImagePath.IsValid() && qt3ds::runtime::isImagePath(
+ image->m_ImagePath.c_str())) {
+ const bool ibl = image->m_MappingMode == ImageMappingModes::LightProbe;
+ image->m_LoadedTextureData = mgr.CreateReloadableImage(image->m_ImagePath,
+ false, ibl);
+ image->m_LoadedTextureData->m_callbacks.push_back(image);
+ }
+ });
+ }
+
+ void Release() override { NVDelete(m_Context->GetAllocator(), this); }
+};
+
+SOffscreenRenderFlags
+Qt3DSRenderSceneSubPresRenderer::NeedsRender(const SOffscreenRendererEnvironment &inEnvironment,
+ QT3DSVec2 inPresScale,
+ const SRenderInstanceId instanceId)
+{
+ m_Scene.TransferDirtyProperties();
+ return CSubPresentationRenderer::NeedsRender(inEnvironment, inPresScale, instanceId);
+}
+
+void Qt3DSRenderSceneSubPresRenderer::Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext,
+ QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer,
+ const SRenderInstanceId instanceId)
+{
+ CSubPresentationRenderer::Render(inEnvironment, inRenderContext, inPresScale, inClearBuffer,
+ instanceId);
+}
+
+void Qt3DSRenderSceneSubPresRenderer::RenderWithClear(
+ const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec4 inClearColor,
+ const SRenderInstanceId id)
+{
+ CSubPresentationRenderer::RenderWithClear(inEnvironment, inRenderContext,
+ inPresScale, inClearBuffer,
+ inClearColor, id);
+}
+
+//////////////////////////////////////////////////////////////////
+// Scene Manager
+//////////////////////////////////////////////////////////////////
+
+struct Qt3DSRenderSceneManager : public Q3DStudio::ISceneManager,
+ public Q3DStudio::ISceneBinaryLoader
+{
+ typedef nvhash_map<CRegisteredString, bool> TStrBoolMap;
+
+ NVScopedRefCounted<SBindingCore> m_Context;
+ nvvector<pair<Q3DStudio::IPresentation *, Qt3DSRenderScene *>> m_Scenes;
+ nvvector<pair<qt3ds::foundation::CRegisteredString, long>> m_RenderPlugins;
+ Q3DStudio::INT32 m_ViewWidth;
+ Q3DStudio::INT32 m_ViewHeight;
+ Q3DStudio::SPickFrame m_PickFrame;
+ NVDataRef<QT3DSU8> m_StrTableData;
+ // The boolean is to mark transparent images and ibl images
+ nvvector<eastl::pair<CRegisteredString, eastl::pair<bool, bool>>> m_SourcePaths;
+ eastl::hash_set<CRegisteredString> m_SourcePathSet;
+
+ Qt3DSRenderScene *m_LastRenderedScene;
+ Q3DStudio::IWindowSystem &m_WindowSystem;
+ Mutex m_LoadingScenesMutex;
+ eastl::vector<NVScopedRefCounted<SSceneLoadData>> m_LoadingScenes;
+ CRegisteredString m_ProjectDir;
+ CRegisteredString m_BinaryDir;
+ bool m_ProjectInitialized;
+ QT3DSI32 mRefCount;
+
+ Qt3DSRenderSceneManager(SBindingCore &ctx, Q3DStudio::IWindowSystem &inWindowSystem)
+ : m_Context(ctx)
+ , m_Scenes(ctx.GetAllocator(), "Qt3DSRenderSceneManager::m_Scenes")
+ , m_RenderPlugins(ctx.GetAllocator(), "Qt3DSRenderSceneManager::m_RenderPlugins")
+ , m_ViewWidth(0)
+ , m_ViewHeight(0)
+ , m_SourcePaths(ctx.GetAllocator(), "Qt3DSRenderSceneManager::m_SourcePaths")
+ , m_LastRenderedScene(nullptr)
+ , m_WindowSystem(inWindowSystem)
+ , m_LoadingScenesMutex(ctx.GetAllocator())
+ , m_ProjectInitialized(false)
+ , mRefCount(0)
+ {
+ memZero(&m_PickFrame, sizeof(m_PickFrame));
+ }
+ virtual ~Qt3DSRenderSceneManager() override
+ {
+ for (QT3DSU32 idx = 0, end = m_Scenes.size(); idx < end; ++idx)
+ m_Scenes[idx].second->Release();
+ m_Scenes.clear();
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Context->GetAllocator())
+
+ static QT3DSU32 GetFileTag()
+ {
+ const char *fileTag = "Qt3DSS";
+ const QT3DSU32 *theTagPtr = reinterpret_cast<const QT3DSU32 *>(fileTag);
+ return *theTagPtr;
+ }
+
+ void FinalizeScene(Q3DStudio::IPresentation &inPresentation, Qt3DSRenderScene &inScene)
+ {
+ inPresentation.SetScene(&inScene);
+ if (m_ProjectInitialized == false) {
+ m_ProjectInitialized = true;
+ // For QT3DS-3353 assume project fonts are in a subdirectory relative to presentation.
+ QString projectFontDir = inPresentation.getProjectPath() + QStringLiteral("/fonts");
+ if (m_Context->m_Context->GetTextRenderer()) {
+ m_Context->m_Context->GetTextRenderer()->AddProjectFontDirectory(
+ projectFontDir.toUtf8().data());
+ }
+ if (m_Context->m_Context->getDistanceFieldRenderer()) {
+ m_Context->m_Context->getDistanceFieldRenderer()->AddProjectFontDirectory(
+ projectFontDir.toUtf8().data());
+ }
+ eastl::string theBinaryPath(inPresentation.GetFilePath().toLatin1().constData());
+ qt3ds::foundation::CFileTools::AppendDirectoryInPathToFile(theBinaryPath, "binary");
+ eastl::string theBinaryDir(theBinaryPath);
+ qt3ds::foundation::CFileTools::GetDirectory(theBinaryDir);
+ if (m_Context->m_WriteOutShaderCache)
+ qt3ds::foundation::CFileTools::CreateDir(theBinaryDir.c_str());
+ }
+ inScene.m_RuntimePresentation = &inPresentation;
+ m_Scenes.push_back(make_pair(&inPresentation, &inScene));
+ Qt3DSTranslator::AssignUserData(inPresentation, *inScene.m_Presentation);
+ }
+
+ static const char *GetBinaryExtension() { return "uibsg"; }
+
+ struct SPluginInstanceTableProvider : public Q3DStudio::IScriptTableProvider
+ {
+ IRenderPluginInstance &m_Instance;
+ SPluginInstanceTableProvider(IRenderPluginInstance &ins)
+ : m_Instance(ins)
+ {
+ }
+ void CreateTable(script_State *inState) override { m_Instance.CreateScriptProxy(inState); }
+ };
+
+ void InitializeTranslator(Qt3DSTranslator &inTranslator, Q3DStudio::IScriptBridge &inBridge)
+ {
+ if (inTranslator.m_RenderObject->m_Type == GraphObjectTypes::RenderPlugin) {
+ SRenderPlugin &theRenderPlugin =
+ static_cast<SRenderPlugin &>(*inTranslator.m_RenderObject);
+ IRenderPluginInstance *thePluginInstance =
+ m_Context->m_Context->GetRenderPluginManager().GetOrCreateRenderPluginInstance(
+ theRenderPlugin.m_PluginPath, &theRenderPlugin);
+ if (thePluginInstance) {
+ SPluginInstanceTableProvider theProvider(*thePluginInstance);
+ inBridge.SetTableForElement(*inTranslator.m_Element, theProvider);
+ }
+ }
+ }
+
+ struct SResolver : public qt3ds::render::IUIPReferenceResolver
+ {
+ IStringTable &m_StringTable;
+ Q3DStudio::IUIPParser &m_Parser;
+ SResolver(IStringTable &strt, Q3DStudio::IUIPParser &p)
+ : m_StringTable(strt)
+ , m_Parser(p)
+ {
+ }
+
+ CRegisteredString ResolveReference(CRegisteredString inStart,
+ const char *inReference) override
+ {
+ eastl::string theResolvedId = m_Parser.ResolveReference(inStart, inReference);
+ if (theResolvedId.size())
+ return m_StringTable.RegisterStr(theResolvedId.c_str());
+ return CRegisteredString();
+ }
+ };
+
+ Q3DStudio::IScene *LoadScene(Q3DStudio::IPresentation *inPresentation,
+ Q3DStudio::IUIPParser *inParser,
+ Q3DStudio::IScriptBridge &inBridge,
+ const qt3ds::Q3DSVariantConfig &variantConfig) override
+ {
+ // We have to initialize the tags late so that we can load flow data before adding anything
+ // to the string table.
+ Qt3DSTranslator::InitializePointerTags(m_Context->m_RenderContext->GetStringTable());
+ NVScopedRefCounted<SSceneLoadData> theScene =
+ QT3DS_NEW(m_Context->GetAllocator(), SSceneLoadData)(m_Context->GetAllocator());
+ Qt3DSRenderScene *theIScene = nullptr;
+ if (inParser) {
+ QString thePath(inPresentation->GetFilePath());
+ QFileInfo fileInfo(thePath);
+ TIdObjectMap theObjMap(m_Context->GetAllocator(), "LoadScene::theObjMap");
+ SResolver theResolver(m_Context->m_CoreContext->GetStringTable(), *inParser);
+
+ theScene->m_Presentation = IUIPLoader::LoadUIPFile(
+ inParser->GetDOMReader(),
+ fileInfo.absoluteFilePath().toLatin1().constData(),
+ inParser->GetMetaData(),
+ m_Context->m_CoreContext->GetStringTable(),
+ m_Context->m_RenderContext->GetFoundation(),
+ theScene->m_AutoAllocator, theObjMap,
+ m_Context->m_Context->GetBufferManager(),
+ m_Context->m_Context->GetEffectSystem(),
+ fileInfo.path().toLatin1().constData(),
+ m_Context->m_Context->GetRenderPluginManager(),
+ m_Context->m_Context->GetCustomMaterialSystem(),
+ m_Context->m_Context->GetDynamicObjectSystem(),
+ m_Context->m_Context->GetPathManager(), &theResolver,
+ variantConfig, false);
+ if (!theScene->m_Presentation) {
+ QT3DS_ASSERT(false);
+ return nullptr;
+ }
+
+ NVConstDataRef<eastl::string> theSourcePathData(inParser->GetSourcePaths());
+ const QVector<QString> slideSourcePaths = inParser->GetSlideSourcePaths();
+ IBufferManager &theManager(m_Context->m_Context->GetBufferManager());
+ // List of image paths to be loaded in parallel at the end.
+ eastl::vector<CRegisteredString> theSourcePathList;
+ eastl::vector<CRegisteredString> iblList;
+ for (QT3DSU32 idx = 0, end = theSourcePathData.size(); idx < end; ++idx) {
+ const eastl::string &theValue = theSourcePathData[idx];
+ CRegisteredString theSourcePath =
+ m_Context->m_CoreContext->GetStringTable().RegisterStr(theValue.c_str());
+ size_t theValueSize = theValue.size();
+ if (theValueSize > 3) {
+ CRegisteredString theObjectPath = theSourcePath;
+ if (qt3ds::runtime::isImagePath(theValue.c_str())) {
+ // load only images not on any slide
+ if (!theManager.isReloadableResourcesEnabled() ||
+ !slideSourcePaths.contains(QString::fromLatin1(theValue.c_str()))) {
+ theManager.SetImageTransparencyToFalseIfNotSet(theObjectPath);
+ bool ibl = inParser->isIblImage(theObjectPath.c_str());
+ bool transparent = theManager.GetImageHasTransparency(theObjectPath);
+ if (m_SourcePathSet.insert(theSourcePath).second) {
+
+ m_SourcePaths.push_back(eastl::make_pair(theSourcePath,
+ eastl::make_pair(transparent, ibl)));
+ }
+ if (ibl)
+ iblList.push_back(theObjectPath);
+ else
+ theSourcePathList.push_back(theObjectPath);
+
+ }
+ } else if (theValue.find(".mesh") != eastl::string::npos) {
+ theManager.LoadMesh(theObjectPath);
+ }
+ }
+ }
+
+ // Fire off parallel loading of the source paths
+ QT3DSU64 imageBatchId = m_Context->m_Context->GetImageBatchLoader().LoadImageBatch(
+ toConstDataRef(theSourcePathList.data(), theSourcePathList.size()),
+ CRegisteredString(), nullptr, m_Context->m_Context->GetRenderContext()
+ .GetRenderContextType(),
+ theScene->m_Presentation->m_preferKTX, false);
+ QT3DSU64 iblImageBatchId = m_Context->m_Context->GetImageBatchLoader().LoadImageBatch(
+ toConstDataRef(iblList.data(), iblList.size()),
+ CRegisteredString(), nullptr, m_Context->m_Context->GetRenderContext()
+ .GetRenderContextType(),
+ theScene->m_Presentation->m_preferKTX, true);
+ m_Context->m_Context->GetImageBatchLoader().BlockUntilLoaded(
+ static_cast<TImageBatchId>(imageBatchId));
+ m_Context->m_Context->GetImageBatchLoader().BlockUntilLoaded(
+ static_cast<TImageBatchId>(iblImageBatchId));
+
+ theIScene = QT3DS_NEW(m_Context->GetAllocator(),
+ Qt3DSRenderScene)(*m_Context, *m_Context->m_Context, *theScene);
+ // Now we need to associate the presentation with everything else.
+ NVAllocatorCallback &translatorAllocator = theScene->m_AutoAllocator;
+ for (TIdObjectMap::iterator iter = theObjMap.begin(), end = theObjMap.end();
+ iter != end; ++iter) {
+ theIScene->m_GraphObjectList.push_back(iter->second);
+ Q3DStudio::SElementAndType theElement =
+ inParser->GetElementForID(iter->first.c_str());
+ if (theElement.m_Element
+ && theElement.m_Type != Q3DStudio::UIPElementTypes::Unknown) {
+ Qt3DSTranslator *theTranslator = Qt3DSTranslator::CreateTranslatorForElement(
+ *theElement.m_Element, *iter->second, translatorAllocator);
+ if (theTranslator) {
+ theIScene->m_DirtySet.insert(*theTranslator);
+ InitializeTranslator(*theTranslator, inBridge);
+ }
+ }
+ }
+ theIScene->PostLoadStep();
+ } else {
+ // Binary load path is quite different than normal load path and
+ // nothing else will load here.
+ QT3DS_ASSERT(false);
+ }
+ if (inPresentation && theIScene)
+ FinalizeScene(*inPresentation, *theIScene);
+ return theIScene;
+ }
+
+ // threadsafe
+ // Can be called from any thread
+ bool GetBinaryLoadFileName(eastl::string &inPresentationFilename,
+ eastl::string &outResult) override
+ {
+ eastl::string theBinaryPath(inPresentationFilename.c_str());
+ qt3ds::foundation::CFileTools::AppendDirectoryInPathToFile(theBinaryPath, "binary");
+ qt3ds::foundation::CFileTools::SetExtension(
+ theBinaryPath, GetBinaryExtension()); // uibb: short for ui binary binding
+ outResult = theBinaryPath;
+ return true;
+ }
+
+ // threadsafe
+ // returns a handle to the loaded object. Return value of zero means error.
+ qt3ds::QT3DSU32 LoadSceneStage1(CRegisteredString inPresentationDirectory,
+ qt3ds::render::ILoadedBuffer &inData) override
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load Scene Graph Stage 1");
+ NVDataRef<QT3DSU8> theLoadedData(inData.Data());
+ SDataReader theReader(theLoadedData.begin(), theLoadedData.end());
+
+ QT3DSU32 theFileSig = theReader.LoadRef<QT3DSU32>();
+ QT3DSU32 theBinaryVersion = theReader.LoadRef<QT3DSU32>();
+ QT3DSU32 theDataSectionSize = QT3DSU32(theReader.m_EndPtr - theReader.m_CurrentPtr);
+
+ if (theFileSig != GetFileTag()
+ || theBinaryVersion != SGraphObject::GetSceneGraphBinaryVersion()) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ QT3DSU32 theLoadingSceneIndex = 0;
+ SSceneLoadData *theScene;
+ {
+ Mutex::ScopedLock __locker(m_LoadingScenesMutex);
+ theLoadingSceneIndex = QT3DSU32(m_LoadingScenes.size()) + 1;
+ m_LoadingScenes.push_back(
+ QT3DS_NEW(m_Context->GetAllocator(), SSceneLoadData)(m_Context->GetAllocator()));
+ theScene = m_LoadingScenes.back();
+ }
+ // preserve the data buffer because we run directly from it; there isn't a memcopy.
+ theScene->m_Data = inData;
+
+ QT3DSU32 theTranslatorOffset = theReader.LoadRef<QT3DSU32>();
+
+ NVDataRef<QT3DSU8> theSGData = NVDataRef<QT3DSU8>(theReader.m_CurrentPtr, theTranslatorOffset);
+ NVDataRef<QT3DSU8> theTranslatorData = NVDataRef<QT3DSU8>(
+ theReader.m_CurrentPtr + theTranslatorOffset, theDataSectionSize - theTranslatorOffset);
+
+ CStrTableOrDataRef theStrTableData(m_Context->m_CoreContext->GetStringTable());
+ if (m_StrTableData.size())
+ theStrTableData = CStrTableOrDataRef(m_StrTableData);
+
+ theScene->m_Presentation = SGraphObjectSerializer::Load(
+ theSGData, m_StrTableData, m_Context->m_CoreContext->GetDynamicObjectSystemCore(),
+ m_Context->m_CoreContext->GetPathManagerCore(), m_Context->GetAllocator(),
+ inPresentationDirectory);
+ if (theScene->m_Presentation)
+ theScene->m_Presentation->m_PresentationDirectory = inPresentationDirectory;
+
+ theScene->m_TranslatorData = theTranslatorData;
+ theScene->m_SceneGraphData = theSGData;
+
+ {
+ Mutex::ScopedLock __locker(m_LoadingScenesMutex);
+ m_LoadingScenes[theLoadingSceneIndex - 1] = theScene;
+ }
+ return theLoadingSceneIndex;
+ }
+
+ // threadsafe
+ // still does not require openGL context but has dependency on a few other things.
+ void LoadSceneStage2(qt3ds::QT3DSU32 inSceneHandle, Q3DStudio::IPresentation &inPresentation,
+ size_t inElementMemoryOffset, Q3DStudio::IScriptBridge &inBridge) override
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load Scene Graph Stage 2");
+ QT3DSU32 theSceneIndex = QT3DS_MAX_U32;
+ SSceneLoadData *theScene;
+ {
+ Mutex::ScopedLock __locker(m_LoadingScenesMutex);
+ QT3DSU32 numLoadingScenes = QT3DSU32(m_LoadingScenes.size());
+ if (inSceneHandle && inSceneHandle <= numLoadingScenes) {
+ theSceneIndex = inSceneHandle - 1;
+ theScene = m_LoadingScenes[theSceneIndex];
+ } else {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ }
+ SDataReader theReader(theScene->m_TranslatorData.begin(), theScene->m_TranslatorData.end());
+ QT3DSU32 theNumTranslators = theReader.LoadRef<QT3DSU32>();
+ theScene->m_Translators.resize(theNumTranslators);
+ theScene->m_RuntimePresentation = &inPresentation;
+ for (QT3DSU32 idx = 0, end = theNumTranslators; idx < end; ++idx) {
+ Qt3DSTranslator *theTranslator = Qt3DSTranslator::LoadTranslator(
+ theReader, inElementMemoryOffset, theScene->m_SceneGraphData,
+ theScene->m_AutoAllocator);
+ if (theTranslator) {
+ InitializeTranslator(*theTranslator, inBridge);
+ }
+ theScene->m_Translators[idx] = theTranslator;
+ }
+ }
+
+ void OnGraphicsInitialized()
+ {
+ QT3DS_ASSERT(m_Context->m_Context.mPtr);
+ // this means graphics have been initialized
+ eastl::string theSourcePathStr;
+ IBufferManager &theManager(m_Context->m_Context->GetBufferManager());
+ nvvector<CRegisteredString> imagePathList(m_Context->GetAllocator(),
+ "imagePathList");
+ nvvector<CRegisteredString> iblImagePathList(m_Context->GetAllocator(),
+ "iblImagePathList");
+ for (QT3DSU32 idx = 0, end = m_SourcePaths.size(); idx < end; ++idx) {
+ theSourcePathStr.assign(m_SourcePaths[idx].first);
+ bool hasTransparency = m_SourcePaths[idx].second.first;
+ bool isIbl = m_SourcePaths[idx].second.second;
+ if (theSourcePathStr.size() > 4) {
+ CRegisteredString theObjectPath = m_SourcePaths[idx].first;
+ if (qt3ds::runtime::isImagePath(theSourcePathStr.c_str())) {
+ theManager.SetImageHasTransparency(theObjectPath, hasTransparency);
+ if (isIbl)
+ iblImagePathList.push_back(theObjectPath);
+ else
+ imagePathList.push_back(theObjectPath);
+ } else {
+ if (theSourcePathStr.find(".mesh") != eastl::string::npos)
+ theManager.LoadMesh(theObjectPath);
+ }
+ }
+ }
+
+ bool pktx = false;
+ for (unsigned int i = 0; i < m_Scenes.size(); ++i) {
+ if (m_Scenes[i].second->m_Presentation->m_preferKTX) {
+ pktx = true;
+ break;
+ }
+ }
+
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Initial Batch Image Load");
+
+ m_Context->m_Context->GetImageBatchLoader().LoadImageBatch(
+ toConstDataRef(imagePathList.data(), imagePathList.size()),
+ CRegisteredString(), nullptr, m_Context->m_Context->GetRenderContext()
+ .GetRenderContextType(), pktx, false);
+ m_Context->m_Context->GetImageBatchLoader().LoadImageBatch(
+ toConstDataRef(iblImagePathList.data(), iblImagePathList.size()),
+ CRegisteredString(), nullptr, m_Context->m_Context->GetRenderContext()
+ .GetRenderContextType(), pktx, true);
+ }
+
+ {
+
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Initialize Scenes");
+ for (QT3DSU32 idx = 0, end = m_LoadingScenes.size(); idx < end; ++idx) {
+ SSceneLoadData &theScene = *m_LoadingScenes[idx];
+ // m_Context->m_Foundation->error( QT3DS_WARN, "Finalizing scene %d", (int)idx+1 );
+ if (theScene.m_RuntimePresentation) {
+ Qt3DSRenderScene *theIScene = QT3DS_NEW(m_Context->GetAllocator(), Qt3DSRenderScene)(
+ *m_Context, *m_Context->m_Context, theScene);
+ FinalizeScene(*theScene.m_RuntimePresentation, *theIScene);
+ theIScene->PostLoadStep();
+ } else {
+ qCWarning(WARNING, "Failed to finalize scene %d", int(idx + 1));
+ }
+ }
+ }
+ }
+
+ void LoadRenderPlugin(const char *inAssetIDString, const char *inPath,
+ const char *inArgs) override
+ {
+ Q3DStudio::CDLLManager &theDLLManager = Q3DStudio::CDLLManager::GetDLLManager();
+ long theHandle = theDLLManager.LoadLibrary(inPath, EDLLTYPE_RENDERABLE_PLUGIN);
+ if (theHandle >= 0) {
+ qt3ds::render::IOffscreenRenderer *theOffscreenRenderer =
+ QT3DS_NEW(m_Context->GetAllocator(),
+ qt3ds::render::COldNBustedPluginRenderer)(*m_Context->m_Context, theHandle);
+ qt3ds::foundation::CRegisteredString theAssetString =
+ m_Context->m_CoreContext->GetStringTable().RegisterStr(inAssetIDString);
+
+ m_Context->m_Context->GetOffscreenRenderManager().RegisterOffscreenRenderer(
+ theAssetString, *theOffscreenRenderer);
+
+ PROC_Initialize theInitializeProc =
+ reinterpret_cast<PROC_Initialize>(theDLLManager.GetProc("Initialize", theHandle));
+ Q3DStudio_ASSERT(theInitializeProc);
+#if !defined (Q_OS_MACOS)
+ PROC_SetEGLInfo theSetEGLInfoProc =
+ reinterpret_cast<PROC_SetEGLInfo>(theDLLManager.GetProc("SetEGLInfo", theHandle));
+ // Set EGL parameters used for optional context creation
+ if (theSetEGLInfoProc) {
+ Q3DStudio::SEGLInfo *theInfo = m_WindowSystem.GetEGLInfo();
+ if (theInfo)
+ theSetEGLInfoProc(theInfo->display, theInfo->context, theInfo->surface,
+ theInfo->config);
+ }
+#endif
+ if (theInitializeProc && theInitializeProc(inArgs) == EDLLSTATUS_OK)
+ m_RenderPlugins.push_back(make_pair(theAssetString, theHandle));
+ else
+ qCWarning(qt3ds::INVALID_OPERATION) << "Unable to load plugin " << inAssetIDString;
+ } else
+ qCWarning(qt3ds::INVALID_OPERATION) << "Unable to load plugin " << inAssetIDString;
+
+ return;
+ }
+
+ void LoadQmlStreamerPlugin(const char *inAssetIDString) override
+ {
+ qt3ds::render::IOffscreenRenderer *theOffscreenRenderer =
+ QT3DS_NEW(m_Context->GetAllocator(),
+ Q3DSQmlRender)(*m_Context->m_Context, inAssetIDString);
+ if (theOffscreenRenderer) {
+ qt3ds::foundation::CRegisteredString theAssetString =
+ m_Context->m_CoreContext->GetStringTable().RegisterStr(inAssetIDString);
+ m_Context->m_Context->GetOffscreenRenderManager().RegisterOffscreenRenderer(
+ SOffscreenRendererKey(theAssetString), *theOffscreenRenderer);
+
+ m_RenderPlugins.push_back(make_pair(theAssetString, 0));
+ }
+ }
+
+ void BinarySave(Q3DStudio::IScene &inScene) override
+ {
+ Qt3DSRenderScene &theScene = static_cast<Qt3DSRenderScene &>(inScene);
+ qt3ds::render::SWriteBuffer theWriteBuffer(m_Context->GetAllocator(), "BinarySaveBuffer");
+ qt3ds::render::SPtrOffsetMap theSGOffsetMap(m_Context->GetAllocator(), "PointerOffsetMap");
+ // Start with some versioning and sanity checks.
+ theWriteBuffer.write(GetFileTag());
+ theWriteBuffer.write(SGraphObject::GetSceneGraphBinaryVersion());
+ QT3DSU32 theTranslatorOffsetAddress = theWriteBuffer.size();
+ // Now the data section starts. Offsets should be relative to here, not the first
+ // 8 bytes.
+ theWriteBuffer.writeZeros(4); // offset where the translator data starts;
+ QT3DSU32 theDataSectionStart = theWriteBuffer.size();
+
+ // These offsets are after we have read in the data section
+ SGraphObjectSerializer::Save(
+ m_Context->m_RenderContext->GetFoundation(), *theScene.m_Presentation, theWriteBuffer,
+ m_Context->m_Context->GetDynamicObjectSystem(),
+ m_Context->m_Context->GetPathManager(), theSGOffsetMap,
+ m_Context->m_CoreContext->GetStringTable(), theScene.m_GraphObjectList);
+
+ theWriteBuffer.align(sizeof(void *));
+ QT3DSU32 theTranslatorCountAddress = theWriteBuffer.size();
+ QT3DSU32 theTranslatorOffset = theTranslatorCountAddress - theDataSectionStart;
+
+ theWriteBuffer.writeZeros(4);
+ // Now write out the translators verbatim. We get an adjustment parameter on save that
+ // allows a translation
+ // from old element ptr->new element ptr.
+ QT3DSU32 theTranslatorCount = 0;
+ for (QT3DSU32 idx = 0, end = theScene.m_GraphObjectList.size(); idx < end; ++idx) {
+ Qt3DSTranslator *theTranslator =
+ Qt3DSTranslator::GetTranslatorFromGraphNode(*theScene.m_GraphObjectList[idx]);
+ // Presentation nodes don't have translator
+ if (theTranslator) {
+ qt3ds::render::SPtrOffsetMap::iterator theIter =
+ theSGOffsetMap.find(theScene.m_GraphObjectList[idx]);
+ if (theIter != theSGOffsetMap.end()) {
+ QT3DSU32 theOffset = theIter->second;
+ theTranslator->Save(theWriteBuffer, theOffset);
+ ++theTranslatorCount;
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ QT3DSU32 *theTranslatorCountPtr =
+ reinterpret_cast<QT3DSU32 *>(theWriteBuffer.begin() + theTranslatorCountAddress);
+ *theTranslatorCountPtr = theTranslatorCount;
+ QT3DSU32 *theTranslatorOffsetPtr =
+ reinterpret_cast<QT3DSU32 *>(theWriteBuffer.begin() + theTranslatorOffsetAddress);
+ *theTranslatorOffsetPtr = theTranslatorOffset;
+
+ Q3DStudio::IPresentation &thePresentation = *theScene.m_RuntimePresentation;
+ eastl::string theBinaryPath(thePresentation.GetFilePath().toLatin1().constData());
+ qt3ds::foundation::CFileTools::AppendDirectoryInPathToFile(theBinaryPath, "binary");
+ eastl::string theBinaryDir(theBinaryPath);
+ qt3ds::foundation::CFileTools::GetDirectory(theBinaryDir);
+ qt3ds::foundation::CFileTools::SetExtension(
+ theBinaryPath, GetBinaryExtension()); // uibb: short for ui binary binding
+
+ Q3DStudio::CFileStream theStream(theBinaryPath.c_str(), "wb");
+ if (theStream.IsOpen() == false) {
+ QT3DS_ASSERT(false);
+ }
+
+ theStream.WriteRaw(theWriteBuffer.begin(), theWriteBuffer.size());
+ theStream.Close();
+ }
+
+ // We save in the reverse order that we load because the effect system may add strings
+ // to the string table when it is writing its data out, this the string table needs to come
+ // last.
+ // Loading, obviously, the string table needs to be the first object loaded.
+ void BinarySaveManagerData(qt3ds::foundation::IOutStream &inStream,
+ const char *inBinaryDir) override
+ {
+ qt3ds::render::SWriteBuffer theWriteBuffer(m_Context->GetAllocator(), "BinarySaveBuffer");
+ IStringTable &theStrTable = m_Context->m_CoreContext->GetStringTable();
+ eastl::string theProjectDir(inBinaryDir);
+ qt3ds::foundation::CFileTools::GetDirectory(theProjectDir);
+
+ // We save everything before the string table because often times saving something creates
+ // new strings.
+ theWriteBuffer.writeZeros(4); // Total data size
+ // Dynamic object system
+ theWriteBuffer.writeZeros(4); // Effect system offset
+ // effect system
+ theWriteBuffer.writeZeros(4); // Material system offset
+ // material system
+ theWriteBuffer.writeZeros(4); // Binary path offset
+ // binary path data
+ theWriteBuffer.writeZeros(4); // Plugin manager offset
+ // plugin manager
+ theWriteBuffer.writeZeros(4); // String system offset
+ // string system last.
+ QT3DSU32 theOffsetStart = theWriteBuffer.size();
+ m_Context->m_Context->GetDynamicObjectSystem().Save(
+ theWriteBuffer, theStrTable.GetRemapMap(), theProjectDir.c_str());
+ theWriteBuffer.align(sizeof(void *));
+ QT3DSU32 theEffectSystemOffset = theWriteBuffer.size() - theOffsetStart;
+ m_Context->m_Context->GetEffectSystem().Save(theWriteBuffer, theStrTable.GetRemapMap(),
+ theProjectDir.c_str());
+ theWriteBuffer.align(sizeof(void *));
+ QT3DSU32 theMaterialSystemOffset = theWriteBuffer.size() - theOffsetStart;
+ m_Context->m_Context->GetCustomMaterialSystem().Save(
+ theWriteBuffer, theStrTable.GetRemapMap(), theProjectDir.c_str());
+ QT3DSU32 theBinaryPathOffset = theWriteBuffer.size() - theOffsetStart;
+
+ theWriteBuffer.write(QT3DSU32(m_SourcePaths.size()));
+ for (nvvector<pair<CRegisteredString, eastl::pair<bool, bool>>>::iterator iter
+ = m_SourcePaths.begin(), end = m_SourcePaths.end();
+ iter != end; ++iter) {
+ CRegisteredString theStr(iter->first);
+ theStr.Remap(theStrTable.GetRemapMap());
+ theWriteBuffer.write(size_t(theStr.c_str()));
+ QT3DSU32 theSourcePathFlags = iter->second.first ? 1 : 0;
+ theSourcePathFlags |= iter->second.second ? 2 : 0;
+ theWriteBuffer.write(theSourcePathFlags);
+ }
+
+ QT3DSU32 thePluginManagerOffset = theWriteBuffer.size() - theOffsetStart;
+
+ m_Context->m_Context->GetRenderPluginManager().Save(
+ theWriteBuffer, theStrTable.GetRemapMap(), theProjectDir.c_str());
+
+ QT3DSU32 theStringTableOffset = theWriteBuffer.size() - theOffsetStart;
+
+ theStrTable.Save(theWriteBuffer);
+
+ QT3DSU32 *theSizePtr = reinterpret_cast<QT3DSU32 *>(theWriteBuffer.begin());
+
+ theSizePtr[0] = theWriteBuffer.size() - 4; // overall size
+ theSizePtr[1] = theEffectSystemOffset;
+ theSizePtr[2] = theMaterialSystemOffset;
+ theSizePtr[3] = theBinaryPathOffset; // thePathOffset
+ theSizePtr[4] = thePluginManagerOffset;
+ theSizePtr[5] = theStringTableOffset;
+
+ inStream.Write(theWriteBuffer.begin(), theWriteBuffer.size());
+ }
+
+ NVDataRef<qt3ds::QT3DSU8> BinaryLoadManagerData(qt3ds::foundation::IInStream &inStream,
+ const char *inBinaryDir) override
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load UIAB - String Table + Render Objects");
+ QT3DS_ASSERT(m_Context->m_FlowData == nullptr);
+ QT3DSU32 dataSize = 0;
+ inStream.Read(dataSize);
+ m_Context->m_FlowData = (QT3DSU8 *)m_Context->m_CoreContext->GetAllocator().allocate(
+ dataSize, "SceneManager::BinaryFlowData", __FILE__, __LINE__);
+
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load UIAB - Initial Data Load");
+ inStream.Read(m_Context->m_FlowData, dataSize);
+ }
+ SDataReader theReader(m_Context->m_FlowData, m_Context->m_FlowData + dataSize);
+ QT3DSU32 theEffectSystemOffset = theReader.LoadRef<QT3DSU32>();
+ QT3DSU32 theMaterialSystemOffset = theReader.LoadRef<QT3DSU32>();
+ QT3DSU32 theBinaryPathOffset = theReader.LoadRef<QT3DSU32>();
+ QT3DSU32 thePluginManagerOffset = theReader.LoadRef<QT3DSU32>();
+ QT3DSU32 theStringTableOffset = theReader.LoadRef<QT3DSU32>();
+ QT3DSU8 *theStartOffset = theReader.m_CurrentPtr;
+ IStringTable &theStrTable = m_Context->m_CoreContext->GetStringTable();
+
+ // Load string table.
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load UIAB - Load String Table");
+ m_StrTableData = toDataRef(theReader.m_CurrentPtr + theStringTableOffset,
+ dataSize - theStringTableOffset);
+ theStrTable.Load(m_StrTableData);
+ }
+
+ // Load source paths to preload heavy data
+ theReader.m_CurrentPtr = theStartOffset + theBinaryPathOffset;
+ QT3DSU32 theNumSourcePaths = theReader.LoadRef<QT3DSU32>();
+ eastl::string theSourcePathStr;
+ eastl::string theProjectDir(inBinaryDir);
+ eastl::string theShaderCacheDir(inBinaryDir);
+
+ // Up one moves to the project directory.
+ qt3ds::foundation::CFileTools::GetDirectory(theProjectDir);
+ const char8_t *theBasePath(theProjectDir.c_str());
+
+ m_ProjectDir = theStrTable.RegisterStr(theProjectDir.c_str());
+ m_BinaryDir = theStrTable.RegisterStr(theShaderCacheDir.c_str());
+
+ // Preload the heavy buffers
+ m_SourcePaths.resize(theNumSourcePaths);
+ for (QT3DSU32 idx = 0, end = theNumSourcePaths; idx < end; ++idx) {
+ CRegisteredString thePath = theReader.LoadRef<CRegisteredString>();
+ QT3DSU32 theFlags = theReader.LoadRef<QT3DSU32>();
+ thePath.Remap(m_StrTableData);
+ bool theBoolFlagValue = theFlags ? true : false;
+ m_SourcePaths[idx] = eastl::make_pair(thePath, theBoolFlagValue);
+ }
+
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load UIAB - Base Dynamic System");
+ // Load effect system.
+ NVDataRef<QT3DSU8> theDynamicSystemData(theStartOffset, theEffectSystemOffset);
+ m_Context->m_CoreContext->GetDynamicObjectSystemCore().Load(
+ theDynamicSystemData, m_StrTableData, theBasePath);
+ }
+
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load UIAB - Effect System");
+ NVDataRef<QT3DSU8> theEffectSystemData(theStartOffset + theEffectSystemOffset,
+ theMaterialSystemOffset - theEffectSystemOffset);
+ m_Context->m_CoreContext->GetEffectSystemCore().Load(theEffectSystemData,
+ m_StrTableData, theBasePath);
+ }
+
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load UIAB - Material System");
+ NVDataRef<QT3DSU8> theMaterialSystemData(theStartOffset + theMaterialSystemOffset,
+ thePluginManagerOffset - theMaterialSystemOffset);
+ m_Context->m_CoreContext->GetMaterialSystemCore().Load(theMaterialSystemData,
+ m_StrTableData, theBasePath);
+ }
+
+ {
+ SStackPerfTimer __perfTimer(m_Context->m_CoreContext->GetPerfTimer(),
+ "Load UIAB - Plugin Manager Data");
+ NVDataRef<QT3DSU8> thePluginManagerData(theStartOffset + thePluginManagerOffset,
+ theStringTableOffset - thePluginManagerOffset);
+ m_Context->m_CoreContext->GetRenderPluginCore().Load(thePluginManagerData,
+ m_StrTableData, theBasePath);
+ }
+
+ return m_StrTableData;
+ }
+
+ virtual void DeleteScene(Q3DStudio::IPresentation *inPresentation)
+ {
+ QT3DSU32 idx;
+ QT3DSU32 end;
+ for (idx = 0, end = m_Scenes.size(); idx < end; ++idx) {
+ if (m_Scenes[idx].first == inPresentation)
+ break;
+ }
+ if (idx < m_Scenes.size()) {
+ m_Scenes[idx].second->Release();
+ m_Scenes.erase(m_Scenes.begin() + idx);
+ }
+ }
+
+ Q3DStudio::BOOL Update() override
+ {
+ bool theResult = false;
+ long theSceneCount = m_Scenes.size();
+ for (size_t theSceneIndex = 0; theSceneIndex < theSceneCount; ++theSceneIndex) {
+ Qt3DSRenderScene *theScene = m_Scenes[theSceneIndex].second;
+ theResult |= theScene->Update();
+ }
+ return theResult;
+ }
+
+ Q3DStudio::BOOL RenderPresentation(Q3DStudio::IPresentation *inPresentation,
+ bool firstFrame) override
+ {
+ Qt3DSRenderScene *theFirstScene = nullptr;
+ for (QT3DSU32 idx = 0, end = m_Scenes.size(); idx < end && theFirstScene == nullptr; ++idx)
+ if (m_Scenes[idx].second->m_RuntimePresentation == inPresentation)
+ theFirstScene = m_Scenes[idx].second;
+
+ if (theFirstScene && theFirstScene->m_Presentation) {
+ m_LastRenderedScene = theFirstScene;
+ if (theFirstScene->m_Presentation->m_Scene
+ && theFirstScene->m_Presentation->m_Scene->m_UseClearColor) {
+ m_Context->m_Context->SetSceneColor(
+ theFirstScene->m_Presentation->m_Scene->m_ClearColor);
+ } else
+ m_Context->m_Context->SetSceneColor(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+
+ // Setup the render rotation *before* rendering so that the magic can happen on begin
+ // render.
+ if (m_Context->m_RenderRotationsEnabled)
+ m_Context->m_Context->SetRenderRotation(
+ theFirstScene->m_Presentation->m_PresentationRotation);
+ else
+ m_Context->m_Context->SetRenderRotation(RenderRotationValues::NoRotation);
+
+ m_Context->m_Context->SetPresentationDimensions(QSize(
+ int(theFirstScene->m_Presentation->m_PresentationDimensions.x),
+ int(theFirstScene->m_Presentation->m_PresentationDimensions.y)));
+ }
+
+ m_Context->m_Context->BeginFrame(firstFrame);
+ m_Context->m_RenderContext->ResetBlendState();
+
+ // How exactly does this work, I have no idea.
+ // Should we only render the first scene and not every scene, perhaps?
+ bool wasDirty = false;
+ if (theFirstScene)
+ wasDirty = theFirstScene->PrepareForRender();
+ else {
+ m_Context->m_RenderContext->SetClearColor(QT3DSVec4(0, 0, 0, 0));
+ m_Context->m_RenderContext->Clear(qt3ds::render::NVRenderClearFlags(
+ NVRenderClearValues::Color | NVRenderClearValues::Depth));
+ }
+ m_Context->m_Context->RunRenderTasks();
+ if (theFirstScene)
+ theFirstScene->Render();
+
+ m_Context->m_Context->EndFrame();
+
+ return wasDirty;
+ }
+ // I think render::check resize is called so this isn't necessary
+ void OnViewResize(Q3DStudio::INT32 inViewWidth, Q3DStudio::INT32 inViewHeight) override
+ {
+ m_ViewWidth = inViewWidth;
+ m_ViewHeight = inViewHeight;
+ }
+ void GetViewSize(Q3DStudio::INT32 &outWidth, Q3DStudio::INT32 &outHeight) override
+ {
+ outWidth = m_ViewWidth;
+ outHeight = m_ViewHeight;
+ }
+
+ Q3DStudio::STextSizes GetDisplayDimensions(Q3DStudio::IPresentation *inPresentation) override
+ {
+ Qt3DSRenderScene *theFirstScene = nullptr;
+ for (QT3DSU32 idx = 0, end = m_Scenes.size(); idx < end && theFirstScene == nullptr; ++idx)
+ if (m_Scenes[idx].second->m_RuntimePresentation == inPresentation)
+ theFirstScene = m_Scenes[idx].second;
+ if (theFirstScene) {
+ m_Context->m_Context->SetPresentationDimensions(QSize(
+ int(theFirstScene->m_Presentation->m_PresentationDimensions.x),
+ int(theFirstScene->m_Presentation->m_PresentationDimensions.y)));
+ render::NVRenderRectF theDisplayViewport =
+ m_Context->m_Context->GetDisplayViewport();
+ return Q3DStudio::STextSizes(
+ static_cast<Q3DStudio::INT32>(theDisplayViewport.m_Width),
+ static_cast<Q3DStudio::INT32>(theDisplayViewport.m_Height));
+ }
+ return Q3DStudio::STextSizes(static_cast<Q3DStudio::INT32>(0),
+ static_cast<Q3DStudio::INT32>(0));
+ }
+
+ Q3DStudio::TElement *UserPick(float mouseX, float mouseY) override
+ {
+ if (m_LastRenderedScene) {
+ return m_LastRenderedScene->UserPick(mouseX, mouseY);
+ }
+ return nullptr;
+ }
+
+ Option<QT3DSVec2> FacePosition(Q3DStudio::TElement &inElement, float mouseX, float mouseY,
+ NVDataRef<Q3DStudio::TElement *> inElements,
+ Q3DStudio::FacePositionPlanes::Enum inPlane) override
+ {
+ if (m_LastRenderedScene) {
+
+ return m_LastRenderedScene->FacePosition(inElement, mouseX, mouseY, inElements,
+ inPlane);
+ }
+ return Empty();
+ }
+
+ Q3DStudio::SPickFrame AdvancePickFrame(const Q3DStudio::SInputFrame &inInputFrame) override
+ {
+ // We now have a new input frame, and our results are invalid but ready to be filled
+ m_PickFrame.m_InputFrame = inInputFrame;
+ m_PickFrame.m_Model = nullptr;
+ m_PickFrame.m_ResultValid = false;
+ if (m_LastRenderedScene) {
+ if (m_PickFrame.m_InputFrame.m_PickValid)
+ m_LastRenderedScene->Pick(m_PickFrame);
+ }
+ return m_PickFrame;
+ }
+
+ void Release() override
+ {
+ long theRenderPluginSize = m_RenderPlugins.size();
+ Q3DStudio::CDLLManager &theDLLManager = Q3DStudio::CDLLManager::GetDLLManager();
+ for (int theRenderPluginIndex = 0; theRenderPluginIndex < theRenderPluginSize;
+ ++theRenderPluginIndex) {
+ long theDLLHandle = m_RenderPlugins[theRenderPluginIndex].second;
+ PROC_Uninitialize theUninitializeProc = reinterpret_cast<PROC_Uninitialize>(
+ theDLLManager.GetProc("Uninitialize", theDLLHandle));
+ Q3DStudio_ASSERT(theUninitializeProc);
+ theUninitializeProc &&theUninitializeProc();
+
+ theDLLManager.UnloadLibrary(theDLLHandle);
+ }
+
+ // Ensure the binding core doesn't get released until after we get released.
+ NVScopedRefCounted<SBindingCore> theContext(m_Context);
+ NVDelete(m_Context->GetAllocator(), this);
+ }
+};
+
+struct SRenderFactory;
+
+struct SRenderFactory : public IQt3DSRenderFactoryCore, public IQt3DSRenderFactory
+{
+ NVScopedRefCounted<SBindingCore> m_Context;
+
+ NVScopedRefCounted<Q3DStudio::CQmlEngine> m_ScriptBridgeQml;
+ NVScopedRefCounted<Qt3DSRenderSceneManager> m_SceneManager;
+ NVScopedRefCounted<qt3ds::evt::IEventSystem> m_EventSystem;
+ qt3ds::runtime::IApplication *m_Application;
+ QT3DSI32 m_RefCount;
+
+ SRenderFactory(SBindingCore &inCore)
+ : m_Context(inCore)
+ , m_ScriptBridgeQml(nullptr)
+ , m_SceneManager(nullptr)
+ , m_Application(nullptr)
+ , m_RefCount(0)
+ {
+ }
+
+ ~SRenderFactory()
+ {
+ using namespace Q3DStudio;
+ // Release the event system, it must be released before script engine
+ m_EventSystem = nullptr;
+ m_ScriptBridgeQml->Shutdown(*m_Context->m_Foundation);
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVScopedRefCounted<SBindingCore> theContext(m_Context);
+ NVDelete(m_Context->GetAllocator(), this);
+ }
+ }
+
+ qt3ds::render::IQt3DSRenderContextCore &GetRenderContextCore() override
+ {
+ return *m_Context->m_CoreContext;
+ }
+
+ qt3ds::runtime::IApplication *GetApplicationCore() override { return m_Application; }
+ void SetApplicationCore(qt3ds::runtime::IApplication *app) override
+ {
+ m_Application = app;
+ }
+
+ Q3DStudio::ISceneBinaryLoader &GetSceneLoader() override
+ {
+ if (m_SceneManager == nullptr)
+ m_SceneManager = QT3DS_NEW(m_Context->GetAllocator(),
+ Qt3DSRenderSceneManager)(*m_Context, m_Context->m_WindowSystem);
+ return *m_SceneManager;
+ }
+
+ Q3DStudio::ITegraApplicationRenderEngine &CreateRenderEngine() override
+ {
+ return m_Context->CreateRenderer();
+ }
+ Q3DStudio::ISceneManager &GetSceneManager() override
+ {
+ if (m_SceneManager == nullptr)
+ m_SceneManager = QT3DS_NEW(m_Context->GetAllocator(),
+ Qt3DSRenderSceneManager)(*m_Context, m_Context->m_WindowSystem);
+ return *m_SceneManager;
+ }
+ Q3DStudio::IScriptBridge &GetScriptEngineQml() override
+ {
+ if (m_ScriptBridgeQml == nullptr) {
+ m_ScriptBridgeQml =
+ Q3DStudio::CQmlEngine::Create(*m_Context->m_Foundation, m_Context->m_TimeProvider);
+ }
+
+ return *m_ScriptBridgeQml;
+ }
+ qt3ds::render::IInputStreamFactory &GetInputStreamFactory() override
+ {
+ return m_Context->m_CoreContext->GetInputStreamFactory();
+ }
+
+ qt3ds::render::IQt3DSRenderContext &GetQt3DSRenderContext() override
+ {
+ return *m_Context->m_Context;
+ }
+
+ qt3ds::evt::IEventSystem &GetEventSystem() override
+ {
+ if (!m_EventSystem) {
+ m_EventSystem = qt3ds::evt::IEventSystem::Create(*m_Context->m_Foundation);
+ }
+ return *m_EventSystem;
+ }
+ Q3DStudio::ITimeProvider &GetTimeProvider() override { return m_Context->m_TimeProvider; }
+ qt3ds::foundation::IStringTable &GetStringTable() override
+ {
+ return m_Context->m_CoreContext->GetStringTable();
+ }
+ qt3ds::NVFoundationBase &GetFoundation() override { return *m_Context->m_Foundation.mPtr; }
+ qt3ds::foundation::IPerfTimer &GetPerfTimer() override
+ {
+ return m_Context->m_CoreContext->GetPerfTimer();
+ }
+ qt3ds::runtime::IApplication *GetApplication() override { return m_Application; }
+ void SetApplication(qt3ds::runtime::IApplication *app) override
+ {
+ m_Application = app;
+ if (app) {
+ // QML engine
+ GetScriptEngineQml();
+ m_ScriptBridgeQml->SetApplication(*app);
+ m_ScriptBridgeQml->Initialize();
+ }
+ }
+ void SetDllDir(const char *dllDir) override
+ {
+ m_Context->m_CoreContext->GetRenderPluginCore().SetDllDir(dllDir);
+ }
+
+ void AddSearchPath(const char8_t *inFile) override
+ {
+ m_Context->m_CoreContext->GetInputStreamFactory().AddSearchDirectory(inFile);
+ }
+ virtual void Release() { NVDelete(m_Context->GetAllocator(), this); }
+
+ struct SContextTypeRenderFactory : public IRuntimeFactoryRenderFactory
+ {
+ QSurfaceFormat format;
+ SContextTypeRenderFactory(const QSurfaceFormat &fmt)
+ : format(fmt)
+ {
+ }
+
+ qt3ds::render::NVRenderContext *CreateRenderContext(qt3ds::NVFoundationBase &foundat,
+ IStringTable &strt) override
+ {
+#ifndef Qt3DS_NO_RENDER_SYMBOLS
+ qt3ds::render::NVRenderContext &retval = NVRenderContext::CreateGL(foundat, strt, format);
+ return &retval;
+#else
+ qt3ds::render::NVRenderContext &retval = NVRenderContext::Createnullptr(foundat, strt);
+ return &retval;
+#endif
+ }
+ };
+
+ IQt3DSRenderFactory &CreateRenderFactory(const QSurfaceFormat& format,
+ bool delayedLoading) override
+ {
+
+ SContextTypeRenderFactory theContextFactory(format);
+ m_Context->CreateRenderContext(theContextFactory, delayedLoading);
+
+ GetSceneLoader();
+ {
+ SStackPerfTimer __loadTimer(GetPerfTimer(), "SceneManager OnGraphicsInitialized");
+ m_SceneManager->OnGraphicsInitialized();
+ }
+ return *this;
+ }
+};
+
+}
+
+IQt3DSRenderFactoryCore &IQt3DSRenderFactoryCore::CreateRenderFactoryCore(
+ const char8_t *inApplicationDirectory,
+ Q3DStudio::IWindowSystem &inWindowSystem,
+ Q3DStudio::ITimeProvider &inTimeProvider)
+{
+ SBindingCore *theCore = reinterpret_cast<SBindingCore *>(malloc(sizeof(SBindingCore)));
+ new (theCore) SBindingCore(inApplicationDirectory, inWindowSystem, inTimeProvider);
+ return *QT3DS_NEW(theCore->GetAllocator(), SRenderFactory)(*theCore);
+}
diff --git a/src/engine/Qt3DSRenderRuntimeBinding.h b/src/engine/Qt3DSRenderRuntimeBinding.h
new file mode 100644
index 0000000..ad0c4e6
--- /dev/null
+++ b/src/engine/Qt3DSRenderRuntimeBinding.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_RENDER_RUNTIME_BINDING_H
+#define QT3DS_RENDER_RUNTIME_BINDING_H
+
+#include "Qt3DSRuntimeFactory.h"
+#include "EABase/eabase.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+
+#include <QSurfaceFormat>
+
+namespace Q3DStudio {
+class ITegraApplicationRenderEngine;
+class ITimeProvider;
+class IWindowSystem;
+}
+
+namespace qt3ds {
+namespace render {
+
+ class ITextRenderer;
+ class IRuntimeFactoryRenderFactory
+ {
+ protected:
+ virtual ~IRuntimeFactoryRenderFactory() {}
+ public:
+ virtual qt3ds::render::NVRenderContext *
+ CreateRenderContext(qt3ds::NVFoundationBase &foundat, qt3ds::foundation::IStringTable &strt) = 0;
+ };
+
+ class IQt3DSRenderFactory;
+
+ class QT3DS_AUTOTEST_EXPORT IQt3DSRenderFactoryCore : public Q3DStudio::IRuntimeFactoryCore
+ {
+ public:
+ virtual IQt3DSRenderFactory &
+ CreateRenderFactory(const QSurfaceFormat &format, bool delayedLoading) = 0;
+
+ static IQt3DSRenderFactoryCore &
+ CreateRenderFactoryCore(const char8_t *inApplicationDirectory,
+ Q3DStudio::IWindowSystem &inWindowSystem,
+ Q3DStudio::ITimeProvider &inTimeProvider);
+ };
+
+ class IQt3DSRenderFactory : public Q3DStudio::IRuntimeFactory
+ {
+ public:
+ virtual Q3DStudio::ITegraApplicationRenderEngine &CreateRenderEngine() = 0;
+ };
+}
+}
+
+#endif
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImpl.h b/src/engine/Qt3DSRenderRuntimeBindingImpl.h
new file mode 100644
index 0000000..92cb865
--- /dev/null
+++ b/src/engine/Qt3DSRenderRuntimeBindingImpl.h
@@ -0,0 +1,218 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_RENDER_RUNTIME_BINDING_IMPL_H
+#define QT3DS_RENDER_RUNTIME_BINDING_IMPL_H
+
+#include "Qt3DSRenderRuntimeBinding.h"
+#include "foundation/TrackingAllocator.h"
+#include "foundation/Utils.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderContextCore.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSIPresentation.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSRenderPresentation.h"
+#include "Qt3DSRenderScene.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderModel.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSUIPParser.h"
+#include "Qt3DSRenderEffect.h"
+#include "Qt3DSRenderCustomMaterial.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "foundation/Qt3DSInvasiveSet.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderText.h"
+#include "foundation/StrConvertUTF.h"
+#include "Qt3DSMetadata.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSWindowSystem.h"
+#include "Qt3DSRenderPluginGraphObject.h"
+#include "Qt3DSRenderReferencedMaterial.h"
+#include "Qt3DSRenderText.h"
+#include "foundation/Qt3DSMutex.h"
+
+#ifdef EA_PLATFORM_WINDOWS
+#pragma warning(disable : 4355)
+#else
+#define stricmp strcasecmp
+#endif
+
+using namespace qt3ds::render;
+using eastl::make_pair;
+using eastl::pair;
+
+namespace qt3ds {
+namespace render {
+
+ extern qt3ds::foundation::MallocAllocator g_BaseAllocator;
+ // Small core object shared between the larger objects.
+ // creates the object stack needed by the rest of the system.
+ struct SBindingCore : public NVRefCounted
+ {
+ qt3ds::render::CAllocator m_Allocator;
+ QT3DSU8 *m_FlowData;
+ NVScopedRefCounted<NVFoundation> m_Foundation;
+ NVScopedRefCounted<IStringTable> m_StringTable;
+ NVScopedRefCounted<IQt3DSRenderContextCore> m_CoreContext;
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+ NVScopedRefCounted<IQt3DSRenderContext> m_Context;
+ QSize m_WindowDimensions;
+ eastl::string m_PrimitivePath;
+ bool m_RenderRotationsEnabled;
+ bool m_WriteOutShaderCache;
+ volatile QT3DSI32 mRefCount;
+ Q3DStudio::IWindowSystem &m_WindowSystem;
+ Q3DStudio::ITimeProvider &m_TimeProvider;
+
+ SBindingCore(const char8_t *inPrimitivePath, Q3DStudio::IWindowSystem &inWindowSystem,
+ Q3DStudio::ITimeProvider &inTimeProvider)
+ : m_Allocator()
+ , m_FlowData(NULL)
+ , m_Foundation(NVCreateFoundation(QT3DS_FOUNDATION_VERSION, m_Allocator))
+ , m_StringTable(IStringTable::CreateStringTable(m_Foundation->getAllocator()))
+ , m_CoreContext(IQt3DSRenderContextCore::Create(*m_Foundation, *m_StringTable))
+ , m_PrimitivePath(inPrimitivePath)
+ , m_RenderRotationsEnabled(false)
+ , m_WriteOutShaderCache(false)
+ , mRefCount(0)
+ , m_WindowSystem(inWindowSystem)
+ , m_TimeProvider(inTimeProvider)
+ {
+ m_CoreContext->SetTextRendererCore(
+ ITextRendererCore::CreateQtTextRenderer(*m_Foundation, *m_StringTable));
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ m_CoreContext->setDistanceFieldRenderer(
+ ITextRendererCore::createDistanceFieldRenderer(*m_Foundation));
+#endif
+
+ m_CoreContext->SetOnscreenTextRendererCore(
+ ITextRendererCore::CreateOnscreenTextRenderer(*m_Foundation));
+ }
+ virtual ~SBindingCore()
+ {
+ m_CoreContext = NULL;
+ m_Context = NULL;
+ m_RenderContext = NULL;
+ if (m_FlowData)
+ m_Allocator.deallocate(m_FlowData);
+ m_FlowData = NULL;
+ }
+
+ void CreateRenderContext(qt3ds::render::IRuntimeFactoryRenderFactory &inContextFactory,
+ bool delayedLoading)
+ {
+ m_RenderContext = inContextFactory.CreateRenderContext(*m_Foundation, *m_StringTable);
+ if (m_RenderContext) {
+ m_Context =
+ m_CoreContext->CreateRenderContext(*m_RenderContext, m_PrimitivePath.c_str(),
+ delayedLoading);
+ }
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(g_BaseAllocator)
+
+ NVAllocatorCallback &GetAllocator() { return m_Allocator; }
+
+ Q3DStudio::ITegraApplicationRenderEngine &CreateRenderer();
+ };
+ struct STranslatorContext
+ {
+ };
+
+ ////////////////////////////////////////
+ // Translators are the set of objects that translate
+ // changes in the elements to changes in the scene graph.
+ // TODO - get rid of the virtual functions and just do dispatch
+ // on the m_RenderObject.m_Type.
+ ////////////////////////////////////////
+ class Qt3DSTranslator
+ {
+ public:
+ QT3DSU32 m_DirtyIndex;
+ Q3DStudio::TElement *m_Element;
+ SGraphObject *m_RenderObject;
+ STranslatorContext *m_TranslatorContext;
+
+ Qt3DSTranslator(Q3DStudio::TElement &inElement, SGraphObject &inRenderObject);
+ GraphObjectTypes::Enum GetUIPType() const { return m_RenderObject->m_Type; }
+ Q3DStudio::TElement &Element() { return *m_Element; }
+ SGraphObject &RenderObject() { return *m_RenderObject; }
+
+ // This function is done via a dispatch mechanism on the graph object type.
+ void OnElementChanged(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &inStudioPresentation);
+
+ void Save(SWriteBuffer &inWriteBuffer, QT3DSU32 inGraphObjectOffset);
+ // Most translators don't need an extra allocation but effects due because the mapping from
+ // effect property
+ // to runtime property is too complex to do quickly.
+ static Qt3DSTranslator *LoadTranslator(SDataReader &inReader, size_t inElemOffset,
+ NVDataRef<QT3DSU8> inSGSection,
+ NVAllocatorCallback &inAllocator);
+
+ static Qt3DSTranslator *GetTranslatorFromGraphNode(SGraphObject &inObject);
+ static Qt3DSTranslator *CreateTranslatorForElement(Q3DStudio::TElement &inElement,
+ SGraphObject &inGraphObject,
+ NVAllocatorCallback &inAlloc);
+ static Q3DStudio::IPresentation *
+ GetPresentationFromPresentation(SPresentation &inPresentation);
+ static void InitializePointerTags(IStringTable &inTable);
+ static void AssignUserData(Q3DStudio::IPresentation &inPresentation,
+ SPresentation &inGraphPresentation);
+ };
+
+ struct STranslatorGetOp
+ {
+ QT3DSU32 operator()(const Qt3DSTranslator &translator) { return translator.m_DirtyIndex; }
+ };
+ struct STranslatorSetOp
+ {
+ void operator()(Qt3DSTranslator &translator, QT3DSU32 value)
+ {
+ translator.m_DirtyIndex = value;
+ }
+ };
+
+ typedef InvasiveSet<Qt3DSTranslator, STranslatorGetOp, STranslatorSetOp> TTranslatorDirytSet;
+}
+}
+
+#endif
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
new file mode 100644
index 0000000..b41c83b
--- /dev/null
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp
@@ -0,0 +1,224 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "EnginePrefix.h"
+#include "Qt3DSRenderRuntimeBindingImpl.h"
+#include "Qt3DSRuntimeView.h"
+#include "Qt3DSWindowSystem.h"
+#include "Qt3DSRenderLoadedTexture.h"
+
+struct SRenderer;
+struct SRendererRSM : public Q3DStudio::ITegraRenderStateManager
+{
+ SRenderer &m_Renderer;
+
+public:
+ SRendererRSM(SRenderer &renderer)
+ : m_Renderer(renderer)
+ {
+ }
+
+ void SetViewport(Q3DStudio::INT32 inX, Q3DStudio::INT32 inY, Q3DStudio::INT32 inWidth,
+ Q3DStudio::INT32 inHeight) override;
+ void PushState() override;
+ void PopState() override;
+ void SetScissorTestEnabled(bool inValue) override;
+ void SaveAllState() override;
+ void RestoreAllState() override;
+};
+
+struct SRenderer : public Q3DStudio::ITegraApplicationRenderEngine
+{
+ NVScopedRefCounted<SBindingCore> m_BindingCore;
+ NVScopedRefCounted<IQt3DSRenderContext> m_Context;
+ NVRenderRect m_Viewport;
+ nvvector<NVRenderRect> m_StateStack;
+ QSize m_PresentationDimensions;
+ SRendererRSM m_RSM;
+ Q3DStudio::IWindowSystem &m_WindowSystem;
+
+ SRenderer(SBindingCore &inCore, Q3DStudio::IWindowSystem &inWindowSystem)
+ : m_BindingCore(inCore)
+ , m_Context(*inCore.m_Context)
+ , m_StateStack(inCore.m_Context->GetAllocator(), "SRenderer::m_StateStack")
+ , m_RSM(*this)
+ , m_WindowSystem(inWindowSystem)
+ {
+ m_Context->SetSceneColor(QT3DSVec4(0, 0, 0, 0.0f));
+ if (m_BindingCore->m_RenderContext) {
+ m_BindingCore->m_RenderContext->SetDefaultRenderTarget(
+ m_WindowSystem.GetDefaultRenderTargetID());
+ m_BindingCore->m_RenderContext->SetDefaultDepthBufferBitCount(
+ m_WindowSystem.GetDepthBitCount());
+ }
+ }
+
+ void ensureRenderTarget() override
+ {
+ m_BindingCore->m_RenderContext->SetDefaultRenderTarget(
+ m_WindowSystem.GetDefaultRenderTargetID());
+ }
+
+ void CheckResize(bool, Q3DStudio::IPresentation & /*inPresentation*/) override
+ {
+ QSize theWindowDims(m_WindowSystem.GetWindowDimensions());
+ m_BindingCore->m_WindowDimensions = theWindowDims;
+ m_BindingCore->m_Context->SetWindowDimensions(m_BindingCore->m_WindowDimensions);
+ }
+ Q3DStudio::BOOL LoadShaderCache(const char * /*inFilePath*/) override { return true; }
+
+ void AbandonLoadingImages(Q3DStudio::IScene & /*inScene*/) override {}
+
+ Q3DStudio::BOOL IsPickValid(Q3DStudio::FLOAT &outX, Q3DStudio::FLOAT &outY,
+ const Q3DStudio::IPresentation & /*inPresentation*/) const override
+ {
+ Q3DStudio::FLOAT theX = outX;
+ Q3DStudio::FLOAT theY = outY;
+ theX = theX / static_cast<Q3DStudio::FLOAT>(m_BindingCore->m_WindowDimensions.width());
+ theY = theY / static_cast<Q3DStudio::FLOAT>(m_BindingCore->m_WindowDimensions.height());
+ Q3DStudio::BOOL theValid = false;
+
+ if ((theX >= 0.0f) && (theY >= 0.0f) && (theX <= 1.0f) && (theY <= 1.0f))
+ theValid = true;
+ return theValid;
+ }
+
+ void SetScaleMode(Q3DStudio::TegraRenderScaleModes::Enum inScale) override
+ {
+ if (m_BindingCore && m_BindingCore->m_Context)
+ m_BindingCore->m_Context->SetScaleMode(static_cast<ScaleModes::Enum>(inScale));
+ }
+ Q3DStudio::TegraRenderScaleModes::Enum GetScaleMode() const override
+ {
+ if (m_BindingCore && m_BindingCore->m_Context)
+ return static_cast<Q3DStudio::TegraRenderScaleModes::Enum>(
+ const_cast<SRenderer &>(*this).m_BindingCore->m_Context->GetScaleMode());
+
+ QT3DS_ASSERT(false);
+ return Q3DStudio::TegraRenderScaleModes::ExactSize;
+ }
+
+ void SetShadeMode(Q3DStudio::TegraRenderShadeModes::Enum inShade) override
+ {
+ if (m_BindingCore && m_BindingCore->m_Context) {
+ m_BindingCore->m_Context->SetWireframeMode(
+ (inShade == Q3DStudio::TegraRenderShadeModes::Shaded) ? false : true);
+ }
+ }
+
+ void EnableRenderRotation(bool inEnable) override
+ {
+ m_BindingCore->m_RenderRotationsEnabled = inEnable;
+ }
+
+ void SetWriteOutShaderCache(bool inWriteOutShaderCache) override
+ {
+ m_BindingCore->m_WriteOutShaderCache = inWriteOutShaderCache;
+ }
+
+ Q3DStudio::ITegraRenderStateManager &GetTegraRenderStateManager() override { return m_RSM; }
+ qt3ds::render::NVRenderContext &GetRenderContext() override
+ {
+ return *m_BindingCore->m_RenderContext;
+ }
+
+ void Release() override
+ {
+ // Ensure the core doesn't die until after we do.
+ NVScopedRefCounted<SBindingCore> theContext(m_BindingCore);
+ NVDelete(m_Context->GetAllocator(), this);
+ }
+
+ void SetViewport(Q3DStudio::INT32 inX, Q3DStudio::INT32 inY, Q3DStudio::INT32 inWidth,
+ Q3DStudio::INT32 inHeight) override
+ {
+ m_Viewport = NVRenderRect(inX, inY, inWidth, inHeight);
+ m_BindingCore->m_RenderContext->SetViewport(m_Viewport);
+ }
+ void SetApplicationViewport(const qt3ds::render::NVRenderRect &inViewport) override
+ {
+ m_BindingCore->m_Context->SetViewport(inViewport);
+ }
+
+ void SetMatteColor(Option<QT3DSVec4> inColor) override { m_Context->SetMatteColor(inColor); }
+ virtual void PushState() { m_StateStack.push_back(m_Viewport); }
+ virtual void PopState()
+ {
+ m_Viewport = m_StateStack.back();
+ m_StateStack.pop_back();
+ SetViewport(m_Viewport.m_X, m_Viewport.m_Y, m_Viewport.m_Width, m_Viewport.m_Height);
+ }
+
+ void RenderText2D(Q3DStudio::FLOAT x, Q3DStudio::FLOAT y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor, const char *text) override
+ {
+ m_Context->RenderText2D(x, y, inColor, text);
+ }
+
+ void RenderGpuProfilerStats(Q3DStudio::FLOAT x, Q3DStudio::FLOAT y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor) override
+ {
+ m_Context->RenderGpuProfilerStats(x, y, inColor);
+ }
+};
+
+void SRendererRSM::SetViewport(Q3DStudio::INT32 inX, Q3DStudio::INT32 inY, Q3DStudio::INT32 inWidth,
+ Q3DStudio::INT32 inHeight)
+{
+ m_Renderer.SetViewport(inX, inY, inWidth, inHeight);
+}
+void SRendererRSM::PushState()
+{
+ m_Renderer.PushState();
+}
+void SRendererRSM::PopState()
+{
+ m_Renderer.PopState();
+}
+void SRendererRSM::SetScissorTestEnabled(bool inValue)
+{
+ m_Renderer.m_BindingCore->m_RenderContext->SetScissorTestEnabled(inValue);
+}
+void SRendererRSM::SaveAllState()
+{
+ m_Renderer.m_BindingCore->m_RenderContext->PushPropertySet();
+}
+void SRendererRSM::RestoreAllState()
+{
+ m_Renderer.m_BindingCore->m_RenderContext->PopPropertySet(true);
+}
+
+Q3DStudio::ITegraApplicationRenderEngine &SBindingCore::CreateRenderer()
+{
+ SRenderer *retval = NULL;
+ if (m_Context)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SRenderer)(*this, this->m_WindowSystem);
+
+ return *retval;
+}
diff --git a/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
new file mode 100644
index 0000000..a4b3bc7
--- /dev/null
+++ b/src/engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp
@@ -0,0 +1,1841 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "EnginePrefix.h"
+#include "Qt3DSRenderRuntimeBindingImpl.h"
+#include "Qt3DSRenderUIPSharedTranslation.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "foundation/SerializationTypes.h"
+#include "StringTools.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSHash.h"
+#include "Qt3DSRenderPlugin.h"
+#include "Qt3DSRenderPluginPropertyValue.h"
+#include "Qt3DSElementHelper.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderPath.h"
+#include "Qt3DSRenderPathSubPath.h"
+#include "Qt3DSRenderPathManager.h"
+
+using namespace qt3ds::foundation;
+
+namespace Q3DStudio {
+enum ExtendedAttributes {
+ ATTRIBUTE_NONE = 0,
+ ATTRIBUTE_NONE_R,
+ ATTRIBUTE_NONE_G,
+ ATTRIBUTE_NONE_B
+};
+}
+
+namespace {
+QT3DSU32 g_TranslatorTag;
+QT3DSU32 g_PresentationTag;
+}
+
+// Add specializations for the tagged pointer operations to make casting
+// a bit safer and more transparent.
+namespace qt3ds {
+namespace render {
+ template <>
+ struct SPointerTag<Qt3DSTranslator>
+ {
+ static QT3DSU32 GetTag() { return g_TranslatorTag; }
+ };
+ template <>
+ struct SPointerTag<Q3DStudio::IPresentation>
+ {
+ static QT3DSU32 GetTag() { return g_PresentationTag; }
+ };
+}
+}
+
+namespace {
+
+template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+struct SDirtySetter
+{
+};
+
+template <>
+struct SDirtySetter<Qt3DSRenderDirtyFlags::Dirty>
+{
+ static void Set(bool &dirty, bool & /*transformDirty*/, bool & /*textDirty*/) { dirty = true; }
+};
+template <>
+struct SDirtySetter<Qt3DSRenderDirtyFlags::TransformDirty>
+{
+ static void Set(bool &dirty, bool &transformDirty, bool & /*textDirty*/)
+ {
+ dirty = true;
+ transformDirty = true;
+ }
+};
+template <>
+struct SDirtySetter<Qt3DSRenderDirtyFlags::TextDirty>
+{
+ static void Set(bool &dirty, bool & /*transformDirty*/, bool &textDirty)
+ {
+ dirty = true;
+ textDirty = true;
+ }
+};
+template <>
+struct SDirtySetter<Qt3DSRenderDirtyFlags::Unknown>
+{
+ static void Set(bool & /*dirty*/, bool & /*transformDirty*/, bool & /*textDirty*/) {}
+};
+
+// Translates individual property values from the runtime into the rendering system.
+struct SRuntimePropertyParser
+{
+ QT3DSI32 m_PropertyName;
+ Q3DStudio::UVariant m_Value;
+ Q3DStudio::EAttributeType m_Type;
+ Q3DStudio::TElement &m_Element;
+ SPresentation &m_Presentation;
+ IQt3DSRenderContext &m_RenderContext;
+ bool m_Dirty;
+ bool m_TransformDirty;
+ bool m_TextDirty;
+
+ SRuntimePropertyParser(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::TElement &inElement)
+ : m_PropertyName(0)
+ , m_Type((Q3DStudio::EAttributeType)0)
+ , m_Element(inElement)
+ , m_Presentation(inPresentation)
+ , m_RenderContext(inRenderContext)
+ , m_Dirty(false)
+ , m_TransformDirty(false)
+ , m_TextDirty(false)
+ {
+ }
+
+ void Setup(QT3DSI32 inPropName, Q3DStudio::UVariant inValue, Q3DStudio::EAttributeType inType)
+ {
+ m_PropertyName = inPropName;
+ m_Value = inValue;
+ m_Type = inType;
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ void SetDirty()
+ {
+ SDirtySetter<TDirtyType>::Set(m_Dirty, m_TransformDirty, m_TextDirty);
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(QT3DSF32 &outValue)
+ {
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_FLOAT) {
+ QT3DSF32 newValue = m_Value.m_FLOAT;
+ if (outValue != newValue) {
+ outValue = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ };
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(QT3DSU32 &outValue)
+ {
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_INT32) {
+ QT3DSU32 newValue = (QT3DSU32)m_Value.m_INT32;
+ if (outValue != newValue) {
+ outValue = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ };
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(SGraphObject *&outValue)
+ {
+ Q3DStudio::TElement *theElem = NULL;
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_ELEMENTREF) {
+ theElem = m_Element.GetBelongedPresentation()->GetApplication().GetElementByHandle(
+ m_Value.m_ElementHandle);
+ } else if (m_Type == Q3DStudio::ATTRIBUTETYPE_STRING) {
+ CRegisteredString theString =
+ m_RenderContext.GetStringTable().HandleToStr(m_Value.m_StringHandle);
+ theElem = Q3DStudio::CElementHelper::GetElement(
+ m_Element.GetBelongedPresentation()->GetApplication(),
+ m_Element.GetBelongedPresentation(), theString.c_str(), &m_Element);
+ }
+
+ SGraphObject *newValue = NULL;
+ if (theElem) {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(theElem->GetAssociation());
+ if (theTranslator)
+ newValue = theTranslator->m_RenderObject;
+ }
+ if (outValue != newValue) {
+ outValue = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ return false;
+ };
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseRadianProperty(QT3DSF32 &outValue)
+ {
+ if (ParseProperty<TDirtyType>(outValue)) {
+ TORAD(outValue);
+ return true;
+ }
+ return false;
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseOpacityProperty(QT3DSF32 &outValue)
+ {
+ if (ParseProperty<TDirtyType>(outValue)) {
+ outValue *= 1.0f / 100.0f;
+ return true;
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseOrientationProperty(bool &ioCurrent)
+ {
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_STRING) {
+ CRegisteredString strValue =
+ m_RenderContext.GetStringTable().HandleToStr(m_Value.m_StringHandle);
+ bool newValue = AreEqual(strValue.c_str(), "Left Handed") ? true : false;
+ if (ioCurrent != newValue) {
+ ioCurrent = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(bool &ioCurrent)
+ {
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_BOOL || m_Type == Q3DStudio::ATTRIBUTETYPE_INT32) {
+ bool newValue = m_Value.m_INT32 ? true : false;
+ if (ioCurrent != newValue) {
+ ioCurrent = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseInverseBoolean(bool &ioCurrent)
+ {
+ bool temp = !ioCurrent;
+ if (ParseProperty<TDirtyType>(temp)) {
+ ioCurrent = temp;
+ return true;
+ }
+ return false;
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(QT3DSVec3 &outValue)
+ {
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_FLOAT3) {
+ QT3DSVec3 newValue(m_Value.m_FLOAT3[0], m_Value.m_FLOAT3[1], m_Value.m_FLOAT3[2]);
+ if (outValue != newValue) {
+ outValue = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(QT3DSVec4 &outValue)
+ {
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_FLOAT4) {
+ QT3DSVec4 newValue(m_Value.m_FLOAT4[0], m_Value.m_FLOAT4[1], m_Value.m_FLOAT4[2],
+ m_Value.m_FLOAT4[3]);
+ if (outValue != newValue) {
+ outValue = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(CRegisteredString &outValue)
+ {
+ if (m_Type == Q3DStudio::ATTRIBUTETYPE_STRING) {
+ CRegisteredString newValue =
+ m_RenderContext.GetStringTable().HandleToStr(m_Value.m_StringHandle);
+ if (newValue.c_str() != outValue.c_str()) {
+ outValue = newValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseRotationOrder(QT3DSU32 &outValue)
+ {
+ CRegisteredString theString;
+ ParseProperty<Qt3DSRenderDirtyFlags::Unknown>(theString);
+ if (theString.IsValid()) {
+ QT3DSU32 newRotationOrder = MapRotationOrder(theString);
+ if (newRotationOrder != outValue) {
+ outValue = newRotationOrder;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseOrientation(NodeFlags &outValue)
+ {
+ bool temp = false;
+ ParseOrientationProperty<TDirtyType>(temp);
+ bool wasLeftHanded = outValue.IsLeftHanded();
+ if (wasLeftHanded != temp) {
+ outValue.SetLeftHanded(temp);
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ return false;
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseNodeFlagsProperty(NodeFlags &outValue, NodeFlagValues::Enum inFlag)
+ {
+ bool temp = false;
+ ParseProperty<Qt3DSRenderDirtyFlags::Unknown>(temp);
+ bool wasSet = outValue & inFlag;
+ if (temp != wasSet) {
+ outValue.ClearOrSet(temp, inFlag);
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseNodeFlagsInverseProperty(NodeFlags &outValue, NodeFlagValues::Enum inFlag)
+ {
+ bool temp = false;
+ ParseProperty<Qt3DSRenderDirtyFlags::Unknown>(temp);
+ temp = !temp;
+ bool wasSet = outValue & inFlag;
+ if (temp != wasSet) {
+ outValue.ClearOrSet(temp, inFlag);
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType, typename TEnumType>
+ bool ParseEnumProperty(TEnumType &outValue)
+ {
+ CRegisteredString theString;
+ ParseProperty<Qt3DSRenderDirtyFlags::Unknown>(theString);
+ if (theString.IsValid()) {
+ SEnumNameMap *theMap = SEnumParseMap<TEnumType>::GetMap();
+ for (SEnumNameMap *theItem = theMap; theItem->m_Name && *theItem->m_Name; ++theItem) {
+ // hack to match advanced overlay types, whose name start with a '*'
+ const char8_t *p = theString.c_str();
+ if (*p == '*')
+ ++p;
+ if (strcmp(p, theItem->m_Name) == 0) {
+ TEnumType theNewValue = static_cast<TEnumType>(theItem->m_Enum);
+ if (outValue != theNewValue) {
+ outValue = theNewValue;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseAndResolveSourcePath(CRegisteredString &outValue)
+ {
+ CRegisteredString theTemp;
+ ParseProperty<Qt3DSRenderDirtyFlags::Unknown>(theTemp);
+ CRegisteredString theNewStr = theTemp;
+ if (outValue.c_str() != theNewStr.c_str()) {
+ SetDirty<TDirtyType>();
+ outValue = theNewStr;
+ return true;
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(SImage *&ioImagePtr)
+ {
+ Q3DStudio::TElement *theElem =
+ m_Element.GetBelongedPresentation()->GetApplication().GetElementByHandle(
+ m_Value.m_ElementHandle);
+ // Try to be very careful in here as casting things around like crazy is a sure
+ // way to crash the runtime at a bad point.
+ if (theElem != NULL) {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(theElem->GetAssociation());
+ if (theTranslator != NULL && theTranslator->GetUIPType() == GraphObjectTypes::Image) {
+ SImage *theImage = static_cast<SImage *>(theTranslator->m_RenderObject);
+ if (ioImagePtr != theImage) {
+ ioImagePtr = theImage;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ template <Qt3DSRenderDirtyFlags::Enum TDirtyType>
+ bool ParseProperty(SNode *&ioNodePtr)
+ {
+ Q3DStudio::TElement *theElem =
+ m_Element.GetBelongedPresentation()->GetApplication().GetElementByHandle(
+ m_Value.m_ElementHandle);
+ // Try to be very careful in here as casting things around like crazy is a sure
+ // way to crash the runtime at a bad point.
+ SNode *theNode = NULL;
+ if (theElem != NULL
+ && theElem->GetBelongedPresentation() == m_Element.GetBelongedPresentation()) {
+ Qt3DSTranslator *theTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(theElem->GetAssociation());
+ if (theTranslator != NULL
+ && GraphObjectTypes::IsNodeType(theTranslator->GetUIPType())) {
+ theNode = static_cast<SNode *>(theTranslator->m_RenderObject);
+ }
+ }
+ if (ioNodePtr != theNode) {
+ ioNodePtr = theNode;
+ SetDirty<TDirtyType>();
+ return true;
+ }
+ return false;
+ }
+};
+
+// Fill out parse name table.
+#define Scene_ClearColor_R ATTRIBUTE_BACKGROUNDCOLOR_R
+#define Scene_ClearColor_G ATTRIBUTE_BACKGROUNDCOLOR_G
+#define Scene_ClearColor_B ATTRIBUTE_BACKGROUNDCOLOR_B
+#define Scene_ClearColor_A ATTRIBUTE_BACKGROUNDCOLOR_A
+#define Scene_UseClearColor ATTRIBUTE_BGCOLORENABLE
+#define Node_Rotation ATTRIBUTE_ROTATION
+#define Node_Rotation_X ATTRIBUTE_ROTATION_X
+#define Node_Rotation_Y ATTRIBUTE_ROTATION_Y
+#define Node_Rotation_Z ATTRIBUTE_ROTATION_Z
+#define Node_Position ATTRIBUTE_POSITION
+#define Node_Position_X ATTRIBUTE_POSITION_X
+#define Node_Position_Y ATTRIBUTE_POSITION_Y
+#define Node_Position_Z ATTRIBUTE_POSITION_Z
+#define Node_Scale ATTRIBUTE_SCALE
+#define Node_Scale_X ATTRIBUTE_SCALE_X
+#define Node_Scale_Y ATTRIBUTE_SCALE_Y
+#define Node_Scale_Z ATTRIBUTE_SCALE_Z
+#define Node_Pivot ATTRIBUTE_PIVOT
+#define Node_Pivot_X ATTRIBUTE_PIVOT_X
+#define Node_Pivot_Y ATTRIBUTE_PIVOT_Y
+#define Node_Pivot_Z ATTRIBUTE_PIVOT_Z
+#define Node_LocalOpacity ATTRIBUTE_OPACITY
+#define Node_RotationOrder ATTRIBUTE_ROTATIONORDER
+#define Node_LeftHanded ATTRIBUTE_ORIENTATION
+#define Layer_TemporalAAEnabled ATTRIBUTE_TEMPORALAA
+#define Layer_LayerEnableDepthTest ATTRIBUTE_DISABLEDEPTHTEST
+#define Layer_LayerEnableDepthPrePass ATTRIBUTE_DISABLEDEPTHPREPASS
+#define Layer_ClearColor_R ATTRIBUTE_BACKGROUNDCOLOR_R
+#define Layer_ClearColor_G ATTRIBUTE_BACKGROUNDCOLOR_G
+#define Layer_ClearColor_B ATTRIBUTE_BACKGROUNDCOLOR_B
+#define Layer_ClearColor_A ATTRIBUTE_BACKGROUNDCOLOR_A
+#define Layer_Background ATTRIBUTE_BACKGROUND
+#define Layer_BlendType ATTRIBUTE_BLENDTYPE
+#define Layer_ProgressiveAAMode ATTRIBUTE_PROGRESSIVEAA
+#define Layer_MultisampleAAMode ATTRIBUTE_MULTISAMPLEAA
+#define Layer_HorizontalFieldValues ATTRIBUTE_HORZFIELDS
+#define Layer_Left ATTRIBUTE_LEFT
+#define Layer_LeftUnits ATTRIBUTE_LEFTUNITS
+#define Layer_Width ATTRIBUTE_WIDTH
+#define Layer_WidthUnits ATTRIBUTE_WIDTHUNITS
+#define Layer_Right ATTRIBUTE_RIGHT
+#define Layer_RightUnits ATTRIBUTE_RIGHTUNITS
+#define Layer_VerticalFieldValues ATTRIBUTE_VERTFIELDS
+#define Layer_Top ATTRIBUTE_TOP
+#define Layer_TopUnits ATTRIBUTE_TOPUNITS
+#define Layer_Height ATTRIBUTE_HEIGHT
+#define Layer_HeightUnits ATTRIBUTE_HEIGHTUNITS
+#define Layer_Bottom ATTRIBUTE_BOTTOM
+#define Layer_BottomUnits ATTRIBUTE_BOTTOMUNITS
+#define Layer_AoStrength ATTRIBUTE_AOSTRENGTH
+#define Layer_AoDistance ATTRIBUTE_AODISTANCE
+#define Layer_AoSoftness ATTRIBUTE_AOSOFTNESS
+#define Layer_AoBias ATTRIBUTE_AOBIAS
+#define Layer_AoSamplerate ATTRIBUTE_AOSAMPLERATE
+#define Layer_AoDither ATTRIBUTE_AODITHER
+#define Layer_ShadowStrength ATTRIBUTE_SHADOWSTRENGTH
+#define Layer_ShadowDist ATTRIBUTE_SHADOWDIST
+#define Layer_ShadowSoftness ATTRIBUTE_SHADOWSOFTNESS
+#define Layer_ShadowBias ATTRIBUTE_SHADOWBIAS
+#define Layer_LightProbe ATTRIBUTE_LIGHTPROBE
+#define Layer_ProbeBright ATTRIBUTE_PROBEBRIGHT
+#define Layer_FastIbl ATTRIBUTE_FASTIBL
+#define Layer_ProbeTheta ATTRIBUTE_PROBETHETA
+#define Layer_ProbePhi ATTRIBUTE_PROBEPHI
+#define Layer_ProbeHorizon ATTRIBUTE_PROBEHORIZON
+#define Layer_LightProbe2 ATTRIBUTE_LIGHTPROBE2
+#define Layer_Probe2Fade ATTRIBUTE_PROBE2FADE
+#define Layer_Probe2Window ATTRIBUTE_PROBE2WINDOW
+#define Layer_Probe2Pos ATTRIBUTE_PROBE2POS
+#define Layer_ProbeFov ATTRIBUTE_PROBEFOV
+#define Layer_TexturePath ATTRIBUTE_SOURCEPATH
+#define Camera_ClipNear ATTRIBUTE_CLIPNEAR
+#define Camera_ClipFar ATTRIBUTE_CLIPFAR
+#define Camera_FOV ATTRIBUTE_FOV
+#define Camera_FOVHorizontal ATTRIBUTE_FOVHORIZONTAL
+#define Camera_Orthographic ATTRIBUTE_ORTHOGRAPHIC
+#define Camera_ScaleMode ATTRIBUTE_SCALEMODE
+#define Camera_ScaleAnchor ATTRIBUTE_SCALEANCHOR
+#define Light_ImageSource ATTRIBUTE_IMAGESOURCE
+#define Light_Scope ATTRIBUTE_SCOPE
+#define Light_ImageSetsColor ATTRIBUTE_IMAGESETSCOLOR
+#define Light_ImageSetsRotation ATTRIBUTE_IMAGESETSROTATION
+#define Light_ImageHFov ATTRIBUTE_IMAGEHFOV
+#define Light_ImageIsFisheye ATTRIBUTE_IMAGEISFISHEYE
+#define Light_LightType ATTRIBUTE_LIGHTTYPE
+#define Light_DiffuseColor ATTRIBUTE_LIGHTDIFFUSE
+#define Light_DiffuseColor_R ATTRIBUTE_LIGHTDIFFUSE_R
+#define Light_DiffuseColor_G ATTRIBUTE_LIGHTDIFFUSE_G
+#define Light_DiffuseColor_B ATTRIBUTE_LIGHTDIFFUSE_B
+#define Light_DiffuseColor_A ATTRIBUTE_LIGHTDIFFUSE_A
+#define Light_SpecularColor ATTRIBUTE_LIGHTSPECULAR
+#define Light_SpecularColor_R ATTRIBUTE_LIGHTSPECULAR_R
+#define Light_SpecularColor_G ATTRIBUTE_LIGHTSPECULAR_G
+#define Light_SpecularColor_B ATTRIBUTE_LIGHTSPECULAR_B
+#define Light_SpecularColor_A ATTRIBUTE_LIGHTSPECULAR_A
+#define Light_AmbientColor ATTRIBUTE_LIGHTAMBIENT
+#define Light_AmbientColor_R ATTRIBUTE_LIGHTAMBIENT_R
+#define Light_AmbientColor_G ATTRIBUTE_LIGHTAMBIENT_G
+#define Light_AmbientColor_B ATTRIBUTE_LIGHTAMBIENT_B
+#define Light_AmbientColor_A ATTRIBUTE_LIGHTAMBIENT_A
+#define Light_Brightness ATTRIBUTE_BRIGHTNESS
+#define Light_LinearFade ATTRIBUTE_LINEARFADE
+#define Light_ExponentialFade ATTRIBUTE_EXPFADE
+#define Light_AreaWidth ATTRIBUTE_AREAWIDTH
+#define Light_AreaHeight ATTRIBUTE_AREAHEIGHT
+#define Light_CastShadow ATTRIBUTE_CASTSHADOW
+#define Light_ShadowBias ATTRIBUTE_SHDWBIAS
+#define Light_ShadowFactor ATTRIBUTE_SHDWFACTOR
+#define Light_ShadowMapRes ATTRIBUTE_SHDWMAPRES
+#define Light_ShadowMapFar ATTRIBUTE_SHDWMAPFAR
+#define Light_ShadowMapFov ATTRIBUTE_SHDWMAPFOV
+#define Light_ShadowFilter ATTRIBUTE_SHDWFILTER
+#define Model_MeshPath ATTRIBUTE_SOURCEPATH
+#define Model_ShadowCaster ATTRIBUTE_SHADOWCASTER
+#define Model_TessellationMode ATTRIBUTE_TESSELLATION
+#define Model_EdgeTess ATTRIBUTE_EDGETESS
+#define Model_InnerTess ATTRIBUTE_INNERTESS
+#define Lightmaps_LightmapIndirect ATTRIBUTE_LIGHTMAPINDIRECT
+#define Lightmaps_LightmapRadiosity ATTRIBUTE_LIGHTMAPRADIOSITY
+#define Lightmaps_LightmapShadow ATTRIBUTE_LIGHTMAPSHADOW
+#define Material_Lighting ATTRIBUTE_SHADERLIGHTING
+#define Material_BlendMode ATTRIBUTE_BLENDMODE
+#define MaterialBase_IblProbe ATTRIBUTE_IBLPROBE
+#define Material_DiffuseColor ATTRIBUTE_DIFFUSE
+#define Material_DiffuseColor_R ATTRIBUTE_DIFFUSE_R
+#define Material_DiffuseColor_G ATTRIBUTE_DIFFUSE_G
+#define Material_DiffuseColor_B ATTRIBUTE_DIFFUSE_B
+#define Material_DiffuseColor_A ATTRIBUTE_DIFFUSE_A
+#define Material_DiffuseMaps_0 ATTRIBUTE_DIFFUSEMAP
+#define Material_DiffuseMaps_1 ATTRIBUTE_DIFFUSEMAP2
+#define Material_DiffuseMaps_2 ATTRIBUTE_DIFFUSEMAP3
+#define Material_EmissivePower ATTRIBUTE_EMISSIVEPOWER
+#define Material_EmissiveColor ATTRIBUTE_EMISSIVECOLOR
+#define Material_EmissiveColor_R ATTRIBUTE_EMISSIVECOLOR_R
+#define Material_EmissiveColor_G ATTRIBUTE_EMISSIVECOLOR_G
+#define Material_EmissiveColor_B ATTRIBUTE_EMISSIVECOLOR_B
+#define Material_EmissiveColor_A ATTRIBUTE_EMISSIVECOLOR_A
+#define Material_EmissiveMap ATTRIBUTE_EMISSIVEMAP
+#define Material_EmissiveMap2 ATTRIBUTE_EMISSIVEMAP2
+#define Material_SpecularReflection ATTRIBUTE_SPECULARREFLECTION
+#define Material_SpecularMap ATTRIBUTE_SPECULARMAP
+#define Material_SpecularModel ATTRIBUTE_SPECULARMODEL
+#define Material_SpecularTint ATTRIBUTE_SPECULARTINT
+#define Material_SpecularTint_R ATTRIBUTE_SPECULARTINT_R
+#define Material_SpecularTint_G ATTRIBUTE_SPECULARTINT_G
+#define Material_SpecularTint_B ATTRIBUTE_SPECULARTINT_B
+#define Material_SpecularTint_A ATTRIBUTE_SPECULARTINT_A
+#define Material_IOR ATTRIBUTE_IOR
+#define Material_FresnelPower ATTRIBUTE_FRESNELPOWER
+#define Material_SpecularAmount ATTRIBUTE_SPECULARAMOUNT
+#define Material_SpecularRoughness ATTRIBUTE_SPECULARROUGHNESS
+#define Material_RoughnessMap ATTRIBUTE_ROUGHNESSMAP
+#define Material_Opacity ATTRIBUTE_OPACITY
+#define Material_OpacityMap ATTRIBUTE_OPACITYMAP
+#define Material_BumpAmount ATTRIBUTE_BUMPAMOUNT
+#define Material_BumpMap ATTRIBUTE_BUMPMAP
+#define Material_NormalMap ATTRIBUTE_NORMALMAP
+#define Material_DisplaceAmount ATTRIBUTE_DISPLACEAMOUNT
+#define Material_DisplacementMap ATTRIBUTE_DISPLACEMENTMAP
+#define Material_TranslucentFalloff ATTRIBUTE_TRANSLUCENTFALLOFF
+#define Material_TranslucencyMap ATTRIBUTE_TRANSLUCENCYMAP
+#define Material_DiffuseLightWrap ATTRIBUTE_DIFFUSELIGHTWRAP
+#define Material_ReferencedMaterial ATTRIBUTE_REFERENCEDMATERIAL
+#define Material_VertexColors ATTRIBUTE_VERTEXCOLORS
+#define Image_ImagePath ATTRIBUTE_SOURCEPATH
+#define Image_OffscreenRendererId ATTRIBUTE_SUBPRESENTATION
+#define Image_Scale_X ATTRIBUTE_SCALEU
+#define Image_Scale_Y ATTRIBUTE_SCALEV
+#define Image_Pivot_X ATTRIBUTE_PIVOTU
+#define Image_Pivot_Y ATTRIBUTE_PIVOTV
+#define Image_Rotation ATTRIBUTE_ROTATIONUV
+#define Image_Position_X ATTRIBUTE_POSITIONU
+#define Image_Position_Y ATTRIBUTE_POSITIONV
+#define Image_MappingMode ATTRIBUTE_MAPPINGMODE
+#define Image_HorizontalTilingMode ATTRIBUTE_TILINGMODEHORZ
+#define Image_VerticalTilingMode ATTRIBUTE_TILINGMODEVERT
+#define Text_Text ATTRIBUTE_TEXTSTRING
+#define Text_Font ATTRIBUTE_FONT
+#define Text_FontSize ATTRIBUTE_SIZE
+#define Text_HorizontalAlignment ATTRIBUTE_HORZALIGN
+#define Text_VerticalAlignment ATTRIBUTE_VERTALIGN
+#define Text_Leading ATTRIBUTE_LEADING
+#define Text_Tracking ATTRIBUTE_TRACKING
+#define Text_DropShadow ATTRIBUTE_DROPSHADOW
+#define Text_DropShadowStrength ATTRIBUTE_DROPSHADOWSTRENGTH
+#define Text_DropShadowOffsetX ATTRIBUTE_DROPSHADOWOFFSETX
+#define Text_DropShadowOffsetY ATTRIBUTE_DROPSHADOWOFFSETY
+#define Text_WordWrap ATTRIBUTE_WORDWRAP
+#define Text_BoundingBox ATTRIBUTE_BOUNDINGBOX
+#define Text_BoundingBox_X ATTRIBUTE_BOUNDINGBOX_X
+#define Text_BoundingBox_Y ATTRIBUTE_BOUNDINGBOX_Y
+#define Text_Elide ATTRIBUTE_ELIDE
+#define Text_TextColor ATTRIBUTE_TEXTCOLOR
+#define Text_TextColor_R ATTRIBUTE_TEXTCOLOR_R
+#define Text_TextColor_G ATTRIBUTE_TEXTCOLOR_G
+#define Text_TextColor_B ATTRIBUTE_TEXTCOLOR_B
+#define Text_TextColor_A ATTRIBUTE_TEXTCOLOR_A
+#define Text_BackColor_R ATTRIBUTE_BACKCOLOR_R
+#define Text_BackColor_G ATTRIBUTE_BACKCOLOR_G
+#define Text_BackColor_B ATTRIBUTE_BACKCOLOR_B
+#define Text_BackColor_A ATTRIBUTE_BACKCOLOR_A
+#define Text_UseBackColor ATTRIBUTE_USEBACKCOLOR
+#define Text_EnableAcceleratedFont ATTRIBUTE_ENABLEACCELERATEDFONT
+#define Path_PathType ATTRIBUTE_PATHTYPE
+#define Path_Width ATTRIBUTE_WIDTH
+#define Path_LinearError ATTRIBUTE_LINEARERROR
+#define Path_EdgeTessAmount ATTRIBUTE_EDGETESSAMOUNT
+#define Path_InnerTessAmount ATTRIBUTE_INNERTESSAMOUNT
+#define Path_BeginCapping ATTRIBUTE_BEGINCAP
+#define Path_BeginCapOffset ATTRIBUTE_BEGINCAPOFFSET
+#define Path_BeginCapOpacity ATTRIBUTE_BEGINCAPOPACITY
+#define Path_BeginCapWidth ATTRIBUTE_BEGINCAPWIDTH
+#define Path_EndCapping ATTRIBUTE_ENDCAP
+#define Path_EndCapOffset ATTRIBUTE_ENDCAPOFFSET
+#define Path_EndCapOpacity ATTRIBUTE_ENDCAPOPACITY
+#define Path_EndCapWidth ATTRIBUTE_ENDCAPWIDTH
+#define Path_PaintStyle ATTRIBUTE_PAINTSTYLE
+#define Path_PathBuffer ATTRIBUTE_SOURCEPATH
+#define SubPath_Closed ATTRIBUTE_CLOSED
+
+// Fill in implementations for the actual parse tables.
+#define HANDLE_QT3DS_RENDER_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_VEC3_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name##_X: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.x); \
+ break; \
+ case Q3DStudio::type##_##name##_Y: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.y); \
+ break; \
+ case Q3DStudio::type##_##name##_Z: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.z); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_REAL_VEC2_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name##_X: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.x); \
+ break; \
+ case Q3DStudio::type##_##name##_Y: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.y); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_COLOR_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name##_R: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.x); \
+ break; \
+ case Q3DStudio::type##_##name##_G: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.y); \
+ break; \
+ case Q3DStudio::type##_##name##_B: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.z); \
+ break; \
+ case Q3DStudio::type##_##name##_A: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.w); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_TRANSFORM_VEC3_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_RADIAN_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseRadianProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+// The runtime converts rotations for us.
+#define HANDLE_QT3DS_RENDER_VEC3_RADIAN_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name##_X: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.x); \
+ break; \
+ case Q3DStudio::type##_##name##_Y: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.y); \
+ break; \
+ case Q3DStudio::type##_##name##_Z: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.z); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_OPACITY_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseOpacityProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_ROTATION_ORDER_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseRotationOrder<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_NODE_ORIENTATION_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseOrientation<Qt3DSRenderDirtyFlags::dirty>(theItem.m_Flags); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_DEPTH_TEST_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseInverseBoolean<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_NODE_FLAGS_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseNodeFlagsProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_Flags, \
+ NodeFlagValues::name); \
+ break;
+
+#define HANDLE_QT3DS_NODE_FLAGS_INVERSE_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseNodeFlagsInverseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_Flags, \
+ NodeFlagValues::name); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_ENUM_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseEnumProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_SOURCEPATH_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name: \
+ inParser.ParseAndResolveSourcePath<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_ARRAY_PROPERTY(type, name, index, dirty) \
+ case Q3DStudio::type##_##name##_##index: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name[index]); \
+ break;
+
+#define HANDLE_QT3DS_RENDER_VEC2_PROPERTY(type, name, dirty) \
+ case Q3DStudio::type##_##name##_X: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.x); \
+ break; \
+ case Q3DStudio::type##_##name##_Y: \
+ inParser.ParseProperty<Qt3DSRenderDirtyFlags::dirty>(theItem.m_##name.y); \
+ break;
+
+struct SSceneTranslator : public Qt3DSTranslator
+{
+ typedef SScene TNodeType;
+ SSceneTranslator(Q3DStudio::TElement &inElement, SScene &inRenderObject)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ }
+ // Ignored, scenes are always active
+ void SetActive(bool /*inElementActive*/) {}
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SScene &theItem = *static_cast<SScene *>(m_RenderObject);
+
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_SCENE_PROPERTIES
+ // These are ignored by the renderer
+ case Q3DStudio::ATTRIBUTE_NAME:
+ case Q3DStudio::ATTRIBUTE_STARTTIME:
+ case Q3DStudio::ATTRIBUTE_ENDTIME:
+ case Q3DStudio::ATTRIBUTE_IMPORTID:
+ case Q3DStudio::ATTRIBUTE_EYEBALL:
+ break;
+ default:
+ // Unknown attribute
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ }
+ void PostPropertyChanged(const SRuntimePropertyParser &, Q3DStudio::IPresentation &) {}
+};
+
+struct SNodeTranslator : public Qt3DSTranslator
+{
+ typedef SNode TNodeType;
+ SNodeTranslator(Q3DStudio::TElement &inElement, SNode &inRenderObject)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ SNode &theItem = *static_cast<SNode *>(m_RenderObject);
+ theItem.m_Flags.SetLocallyPickable(false);
+ }
+ void SetActive(bool inElementActive)
+ {
+ SNode &theItem = *static_cast<SNode *>(m_RenderObject);
+ if (theItem.m_Flags.IsActive() != inElementActive) {
+ theItem.m_Flags.SetActive(inElementActive);
+ theItem.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ }
+ }
+
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SNode &theItem = *static_cast<SNode *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_NODE_PROPERTIES
+ case Q3DStudio::ATTRIBUTE_NAME:
+ case Q3DStudio::ATTRIBUTE_STARTTIME:
+ case Q3DStudio::ATTRIBUTE_ENDTIME:
+ case Q3DStudio::ATTRIBUTE_IMPORTID:
+ case Q3DStudio::ATTRIBUTE_EYEBALL:
+ // Groups have a source path property on them that we like to ignore.
+ case Q3DStudio::ATTRIBUTE_SOURCEPATH:
+ break;
+ default:
+ // Unknown attribute
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ }
+ void PostPropertyChanged(const SRuntimePropertyParser &inParser,
+ Q3DStudio::IPresentation & /*inStudioPresentation*/)
+ {
+ SNode &theItem = *static_cast<SNode *>(m_RenderObject);
+ if (inParser.m_TransformDirty)
+ theItem.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ else if (inParser.m_Dirty)
+ theItem.MarkDirty(NodeTransformDirtyFlag::TransformNotDirty);
+ if (inParser.m_TextDirty)
+ theItem.m_Flags.SetTextDirty(true);
+ SetActive(Element().GetActive());
+ bool isNodePickable = m_Element->IsPickEnabled();
+ if (theItem.m_Flags.IsLocallyPickable() != isNodePickable) {
+ theItem.m_Flags.SetLocallyPickable(isNodePickable);
+ theItem.MarkDirty(NodeTransformDirtyFlag::TransformNotDirty);
+ }
+ }
+};
+
+struct SLayerTranslator : public SNodeTranslator
+{
+ typedef SLayer TNodeType;
+ SLayerTranslator(Q3DStudio::TElement &inElement, SLayer &inRenderObject)
+ : SNodeTranslator(inElement, inRenderObject)
+ {
+ }
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ const char *propName =
+ Q3DStudio::GetAttributeString((Q3DStudio::EAttribute)inParser.m_PropertyName);
+ (void)propName;
+ SLayer &theItem = *static_cast<SLayer *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_LAYER_PROPERTIES
+ // Ignored
+ default:
+ SNodeTranslator::OnSpecificPropertyChange(inParser);
+ }
+ }
+};
+
+struct SLightTranslator : public SNodeTranslator
+{
+ typedef SLight TNodeType;
+ SLightTranslator(Q3DStudio::TElement &inElement, SLight &inRenderObject)
+ : SNodeTranslator(inElement, inRenderObject)
+ {
+ }
+
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SLight &theItem = *static_cast<SLight *>(m_RenderObject);
+ // I guess there is no switching of light type in the runtime right now.
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_LIGHT_PROPERTIES
+ default:
+ SNodeTranslator::OnSpecificPropertyChange(inParser);
+ break;
+ }
+ }
+};
+struct SCameraTranslator : public SNodeTranslator
+{
+ typedef SCamera TNodeType;
+ SCameraTranslator(Q3DStudio::TElement &inElement, SCamera &inRenderObject)
+ : SNodeTranslator(inElement, inRenderObject)
+ {
+ }
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SCamera &theItem = *static_cast<SCamera *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_CAMERA_PROPERTIES
+ default:
+ SNodeTranslator::OnSpecificPropertyChange(inParser);
+ break;
+ }
+ }
+};
+
+struct SModelTranslator : public SNodeTranslator
+{
+ typedef SModel TNodeType;
+ SModelTranslator(Q3DStudio::TElement &inElement, SModel &inRenderObject)
+ : SNodeTranslator(inElement, inRenderObject)
+ {
+ }
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SModel &theItem = *static_cast<SModel *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_MODEL_PROPERTIES
+ default:
+ SNodeTranslator::OnSpecificPropertyChange(inParser);
+ break;
+ }
+ }
+};
+
+struct SPathTranslator : public SNodeTranslator
+{
+ typedef SPath TNodeType;
+ SPathTranslator(Q3DStudio::TElement &inElement, SPath &inRenderObject)
+ : SNodeTranslator(inElement, inRenderObject)
+ {
+ }
+
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SPath &theItem = *static_cast<SPath *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_PATH_PROPERTIES
+ default:
+ SNodeTranslator::OnSpecificPropertyChange(inParser);
+ break;
+ }
+ }
+};
+
+struct SPathSubPathTranslator : public Qt3DSTranslator
+{
+
+ typedef SPathSubPath TNodeType;
+
+ SPathSubPathTranslator(Q3DStudio::TElement &inElement, SPathSubPath &inRenderObject)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ }
+
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SPathSubPath &theItem = *static_cast<SPathSubPath *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_PATH_SUBPATH_PROPERTIES
+ default:
+ break;
+ }
+ }
+
+ void PostPropertyChanged(const SRuntimePropertyParser &inParser,
+ Q3DStudio::IPresentation & /*inStudioPresentation*/)
+ {
+ SPathSubPath &theItem = *static_cast<SPathSubPath *>(m_RenderObject);
+ qt3ds::render::IPathManager &theManager = inParser.m_RenderContext.GetPathManager();
+ QT3DSU32 numAnchors = 0;
+ bool updatePath = false;
+ CRegisteredString theAnchorType =
+ inParser.m_RenderContext.GetStringTable().RegisterStr("PathAnchorPoint");
+ for (Q3DStudio::TElement *theChild = Element().GetChild(); theChild;
+ theChild = theChild->GetSibling()) {
+ if (theChild->GetType() == theAnchorType) {
+ ++numAnchors;
+ if (theChild->IsDirty())
+ updatePath = true;
+ }
+ }
+ if (updatePath) {
+ NVDataRef<qt3ds::render::SPathAnchorPoint> thePathBuffer =
+ theManager.ResizePathSubPathBuffer(theItem, numAnchors);
+ if (thePathBuffer.size()) {
+ QT3DSU32 anchorIndex = 0;
+ for (Q3DStudio::TElement *theChild = Element().GetChild(); theChild;
+ theChild = theChild->GetSibling()) {
+ if (theChild->GetType() == theAnchorType) {
+ if (theChild->IsDirty()) {
+ qt3ds::render::SPathAnchorPoint &thePoint(thePathBuffer[anchorIndex]);
+
+ for (QT3DSI32 idx = 0, end = theChild->GetAttributeCount(); idx < end;
+ ++idx) {
+ qt3ds::runtime::element::TPropertyDescAndValuePtr thePropInfo =
+ theChild->GetPropertyByIndex(idx);
+ switch (thePropInfo.first.GetNameHash()) {
+ case Q3DStudio::ATTRIBUTE_POSITION_X:
+ thePoint.m_Position.x = thePropInfo.second->m_FLOAT;
+ break;
+ case Q3DStudio::ATTRIBUTE_POSITION_Y:
+ thePoint.m_Position.y = thePropInfo.second->m_FLOAT;
+ break;
+ case Q3DStudio::ATTRIBUTE_INCOMINGANGLE:
+ thePoint.m_IncomingAngle = thePropInfo.second->m_FLOAT;
+ thePoint.m_OutgoingAngle = thePoint.m_IncomingAngle + 180.0f;
+ break;
+ case Q3DStudio::ATTRIBUTE_INCOMINGDISTANCE:
+ thePoint.m_IncomingDistance = thePropInfo.second->m_FLOAT;
+ break;
+ case Q3DStudio::ATTRIBUTE_OUTGOINGDISTANCE:
+ thePoint.m_OutgoingDistance = thePropInfo.second->m_FLOAT;
+ break;
+ default: // ignored
+ break;
+ }
+ }
+ }
+ ++anchorIndex;
+ }
+ }
+ }
+ }
+ }
+};
+
+struct SDefaultMaterialTranslator : public Qt3DSTranslator
+{
+ typedef SDefaultMaterial TNodeType;
+ SDefaultMaterialTranslator(Q3DStudio::TElement &inElement, SDefaultMaterial &inRenderObject)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ }
+ // Right now materials do not respect the active flag
+ void SetActive(bool) {}
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SDefaultMaterial &theItem = *static_cast<SDefaultMaterial *>(m_RenderObject);
+ // There is no render-time caching on a material, so the dirty flag doesn't do much.
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_MATERIAL_PROPERTIES
+
+ case Q3DStudio::ATTRIBUTE_NAME:
+ case Q3DStudio::ATTRIBUTE_STARTTIME:
+ case Q3DStudio::ATTRIBUTE_ENDTIME:
+ case Q3DStudio::ATTRIBUTE_IMPORTID:
+ case Q3DStudio::ATTRIBUTE_EYEBALL:
+ case Q3DStudio::ATTRIBUTE_SOURCEPATH:
+ break;
+ default:
+ // Unknown attribute
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ }
+
+ void PostPropertyChanged(const SRuntimePropertyParser &, Q3DStudio::IPresentation &)
+ {
+ SDefaultMaterial &theItem = *static_cast<SDefaultMaterial *>(m_RenderObject);
+ theItem.m_Dirty.SetDirty();
+ }
+};
+
+struct SImageTranslator : public Qt3DSTranslator
+{
+ typedef SImage TNodeType;
+ SImageTranslator(Q3DStudio::TElement &inElement, SImage &inRenderObject)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ }
+
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SImage &theItem = *static_cast<SImage *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_IMAGE_PROPERTIES
+ case Q3DStudio::ATTRIBUTE_STARTTIME:
+ case Q3DStudio::ATTRIBUTE_ENDTIME:
+ case Q3DStudio::ATTRIBUTE_NAME:
+ case Q3DStudio::ATTRIBUTE_EYEBALL:
+ break;
+ default:
+ // Unknown attribute
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ }
+ void PostPropertyChanged(const SRuntimePropertyParser &inParser, Q3DStudio::IPresentation &)
+ {
+ SImage &theItem = *static_cast<SImage *>(m_RenderObject);
+ if (inParser.m_Dirty)
+ theItem.m_Flags.SetDirty(true);
+ if (inParser.m_TransformDirty)
+ theItem.m_Flags.SetTransformDirty(true);
+ }
+};
+
+struct SReferencedMaterialTranslator : public Qt3DSTranslator
+{
+ typedef SReferencedMaterial TNodeType;
+ SReferencedMaterialTranslator(Q3DStudio::TElement &inElement, TNodeType &inRenderObject)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ }
+
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ TNodeType &theItem = *static_cast<TNodeType *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_REFERENCED_MATERIAL_PROPERTIES
+ case Q3DStudio::ATTRIBUTE_STARTTIME:
+ case Q3DStudio::ATTRIBUTE_ENDTIME:
+ case Q3DStudio::ATTRIBUTE_NAME:
+ case Q3DStudio::ATTRIBUTE_EYEBALL:
+ break;
+ default:
+ // Unknown attribute
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ }
+ void PostPropertyChanged(const SRuntimePropertyParser &inParser, Q3DStudio::IPresentation &)
+ {
+ TNodeType &theItem = *static_cast<TNodeType *>(m_RenderObject);
+ if (inParser.m_Dirty)
+ theItem.m_Dirty.SetDirty();
+ }
+};
+
+struct STextTranslator : public SNodeTranslator
+{
+ typedef SText TNodeType;
+ STextTranslator(Q3DStudio::TElement &inElement, SText &inRenderObject)
+ : SNodeTranslator(inElement, inRenderObject)
+ {
+ }
+ void OnSpecificPropertyChange(SRuntimePropertyParser &inParser)
+ {
+ SText &theItem = *static_cast<SText *>(m_RenderObject);
+ switch (inParser.m_PropertyName) {
+ ITERATE_QT3DS_RENDER_TEXT_PROPERTIES
+ case Q3DStudio::ATTRIBUTE_TEXTTYPE:
+ case Q3DStudio::ATTRIBUTE_RENDERSTYLE:
+ case Q3DStudio::ATTRIBUTE_HORZSCROLL:
+ case Q3DStudio::ATTRIBUTE_VERTSCROLL:
+ case Q3DStudio::ATTRIBUTE_BOXHEIGHT:
+ case Q3DStudio::ATTRIBUTE_BOXWIDTH:
+ case Q3DStudio::ATTRIBUTE_REMOTESTRINGSOURCE:
+ case Q3DStudio::ATTRIBUTE_CACHEDTEXTSTRING:
+ // These text properties are ignored for now.
+ break;
+ default:
+ SNodeTranslator::OnSpecificPropertyChange(inParser);
+ break;
+ }
+ }
+};
+
+struct SEffectPropertyEntry
+{
+ Q3DStudio::EAttributeType m_AttributeType;
+ QT3DSU32 m_PropertyOffset; // offset into the property array for the property def
+ QT3DSU32 m_DataOffset;
+ SEffectPropertyEntry(Q3DStudio::EAttributeType attType, QT3DSU32 poff, QT3DSU32 doff = 0)
+ : m_AttributeType(attType)
+ , m_PropertyOffset(poff)
+ , m_DataOffset(doff)
+ {
+ }
+};
+
+struct SDynamicObjectTranslatorContext : public STranslatorContext
+{
+ typedef nvhash_map<Q3DStudio::INT32, SEffectPropertyEntry> THashToOffsetMap;
+ THashToOffsetMap m_PropertyHashes;
+ NVAllocatorCallback &m_Allocator;
+ Qt3DSString m_Workspace;
+ SDynamicObjectTranslatorContext(NVAllocatorCallback &inCallback)
+ : m_PropertyHashes(inCallback, "SEffectTranslatorContext::PropertyHashes")
+ , m_Allocator(inCallback)
+ {
+ }
+ ~SDynamicObjectTranslatorContext() {}
+ void AddEffectExtendedProperty(const qt3ds::render::dynamic::SPropertyDefinition &thePropDef,
+ const char *inExtension, Q3DStudio::EAttributeType inType,
+ Qt3DSString &ioStringBuilder, QT3DSU32 inOffset, QT3DSU32 dataOffset)
+ {
+ ioStringBuilder.fromUtf8(thePropDef.m_Name.c_str());
+ ioStringBuilder.append(inExtension);
+ Q3DStudio::INT32 theHash = Q3DStudio::CHash::HashAttribute(
+ ioStringBuilder.toUtf8().constData());
+ m_PropertyHashes.insert(
+ eastl::make_pair(theHash, SEffectPropertyEntry(inType, inOffset, dataOffset)));
+ }
+ void BuildPropertyHashes(NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> inProperties)
+ {
+ if (m_PropertyHashes.size() == 0) {
+ qt3ds::foundation::Qt3DSString theNameBuilder;
+ for (QT3DSU32 idx = 0, end = inProperties.size(); idx < end; ++idx) {
+ const qt3ds::render::dynamic::SPropertyDefinition &thePropDef = inProperties[idx];
+ switch (thePropDef.m_DataType) {
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSF32:
+ m_PropertyHashes.insert(eastl::make_pair(
+ Q3DStudio::CHash::HashAttribute(thePropDef.m_Name.c_str()),
+ SEffectPropertyEntry(Q3DStudio::ATTRIBUTETYPE_FLOAT, idx)));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool:
+ m_PropertyHashes.insert(
+ eastl::make_pair(Q3DStudio::CHash::HashAttribute(thePropDef.m_Name.c_str()),
+ SEffectPropertyEntry(Q3DStudio::ATTRIBUTETYPE_BOOL, idx)));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSI32:
+ if (thePropDef.m_IsEnumProperty == false) {
+ m_PropertyHashes.insert(eastl::make_pair(
+ Q3DStudio::CHash::HashAttribute(thePropDef.m_Name.c_str()),
+ SEffectPropertyEntry(Q3DStudio::ATTRIBUTETYPE_INT32, idx)));
+ } else {
+ m_PropertyHashes.insert(eastl::make_pair(
+ Q3DStudio::CHash::HashAttribute(thePropDef.m_Name.c_str()),
+ SEffectPropertyEntry(Q3DStudio::ATTRIBUTETYPE_STRING, idx)));
+ }
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec2:
+ AddEffectExtendedProperty(thePropDef, ".x", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 0);
+ AddEffectExtendedProperty(thePropDef, ".y", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, sizeof(QT3DSF32));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec3:
+ AddEffectExtendedProperty(thePropDef, ".x", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 0);
+ AddEffectExtendedProperty(thePropDef, ".y", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, sizeof(QT3DSF32));
+ AddEffectExtendedProperty(thePropDef, ".z", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 2 * sizeof(QT3DSF32));
+
+ AddEffectExtendedProperty(thePropDef, ".r", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 0);
+ AddEffectExtendedProperty(thePropDef, ".g", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, sizeof(QT3DSF32));
+ AddEffectExtendedProperty(thePropDef, ".b", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 2 * sizeof(QT3DSF32));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4:
+ AddEffectExtendedProperty(thePropDef, ".x", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 0);
+ AddEffectExtendedProperty(thePropDef, ".y", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, sizeof(QT3DSF32));
+ AddEffectExtendedProperty(thePropDef, ".z", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 2 * sizeof(QT3DSF32));
+ AddEffectExtendedProperty(thePropDef, ".w", Q3DStudio::ATTRIBUTETYPE_FLOAT,
+ theNameBuilder, idx, 3 * sizeof(QT3DSF32));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr:
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderImage2DPtr:
+ m_PropertyHashes.insert(eastl::make_pair(
+ Q3DStudio::CHash::HashAttribute(thePropDef.m_Name.c_str()),
+ SEffectPropertyEntry(Q3DStudio::ATTRIBUTETYPE_STRING, idx)));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderDataBufferPtr:
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ }
+ }
+ void ApplyChanges(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext,
+ SDynamicObject &inObject, Q3DStudio::TElement &element,
+ IDynamicObjectSystem &inSystem)
+ {
+ if (element.GetActive()) {
+ NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> theProperties =
+ inSystem.GetProperties(inObject.m_ClassName);
+ BuildPropertyHashes(theProperties);
+ SDynamicObject &theItem(inObject);
+ for (long idx = 0, end = element.GetAttributeCount(); idx < end; ++idx) {
+ qt3ds::runtime::element::TPropertyDescAndValuePtr thePropInfo =
+ *element.GetPropertyByIndex(idx);
+ THashToOffsetMap::iterator theFind =
+ m_PropertyHashes.find(thePropInfo.first.GetNameHash());
+ if (theFind != m_PropertyHashes.end()) {
+ const SEffectPropertyEntry &theEntry(theFind->second);
+ const qt3ds::render::dynamic::SPropertyDefinition &theDefinition(
+ theProperties[theEntry.m_PropertyOffset]);
+ if (theEntry.m_AttributeType
+ == (Q3DStudio::EAttributeType)thePropInfo.first.m_Type) {
+ switch (theEntry.m_AttributeType) {
+ case Q3DStudio::ATTRIBUTETYPE_BOOL:
+ theItem.SetPropertyValue(theDefinition,
+ thePropInfo.second->m_INT32 ? true : false);
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_FLOAT:
+ theItem.SetPropertyValue(theDefinition, thePropInfo.second->m_FLOAT,
+ theEntry.m_DataOffset);
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_INT32:
+ theItem.SetPropertyValue(theDefinition,
+ (QT3DSI32)thePropInfo.second->m_INT32);
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_STRING: {
+ CRegisteredString theStr =
+ element.GetBelongedPresentation()->GetStringTable().HandleToStr(
+ thePropInfo.second->m_StringHandle);
+ theItem.SetPropertyValue(theDefinition, theStr.c_str(),
+ inPresentation.m_PresentationDirectory.c_str(),
+ m_Workspace, inRenderContext.GetStringTable());
+ } break;
+ default:
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ } else {
+ // QT3DS_ASSERT( false );
+ }
+ }
+ }
+ theItem.m_Flags.SetDirty(true);
+ }
+ }
+};
+
+struct SEffectTranslator : public Qt3DSTranslator
+{
+ typedef SEffect TNodeType;
+ SEffectTranslator(Q3DStudio::TElement &inElement, SEffect &inRenderObject,
+ NVAllocatorCallback &inCallback)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ m_TranslatorContext = QT3DS_NEW(inCallback, SDynamicObjectTranslatorContext)(inCallback);
+ }
+
+ void OnElementChanged(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &)
+ {
+ SRuntimePropertyParser theParser(inPresentation, inRenderContext, *m_Element);
+ SEffect &theItem = *static_cast<SEffect *>(m_RenderObject);
+ static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext)
+ ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(),
+ inRenderContext.GetDynamicObjectSystem());
+ theItem.SetActive(Element().GetActive(), inRenderContext.GetEffectSystem());
+ }
+};
+
+struct SCustomMaterialTranslator : public Qt3DSTranslator
+{
+ typedef SCustomMaterial TNodeType;
+ SCustomMaterialTranslator(Q3DStudio::TElement &inElement, SCustomMaterial &inRenderObject,
+ NVAllocatorCallback &inCallback)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ m_TranslatorContext = QT3DS_NEW(inCallback, SDynamicObjectTranslatorContext)(inCallback);
+ }
+
+ void OnElementChanged(SPresentation &inPresentation, IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &)
+ {
+ SRuntimePropertyParser theParser(inPresentation, inRenderContext, *m_Element);
+ SCustomMaterial &theItem = *static_cast<SCustomMaterial *>(m_RenderObject);
+ static_cast<SDynamicObjectTranslatorContext *>(m_TranslatorContext)
+ ->ApplyChanges(inPresentation, inRenderContext, theItem, Element(),
+ inRenderContext.GetDynamicObjectSystem());
+ bool active = m_Element->GetActive();
+ if (active != theItem.m_Flags.IsActive()) {
+ theItem.m_Flags.SetActive(active);
+ ICustomMaterialSystem &theSystem(inRenderContext.GetCustomMaterialSystem());
+ theSystem.OnMaterialActivationChange(theItem, active);
+ }
+ }
+};
+
+struct SRenderPluginTranslatorContext : public STranslatorContext
+{
+ NVAllocatorCallback &m_Allocator;
+ nvhash_map<int, CRegisteredString> m_AttribHashIndexMap;
+ nvvector<SRenderPropertyValueUpdate> m_PropertyUpdates;
+ SRenderPluginTranslatorContext(NVAllocatorCallback &alloc)
+ : m_Allocator(alloc)
+ , m_AttribHashIndexMap(alloc, "SRenderPluginTranslatorContext::AttribIndexMap")
+ , m_PropertyUpdates(alloc, "SRenderPluginTranslatorContext::m_PropertyUpdates")
+ {
+ }
+ void ReverseMap(CRegisteredString str)
+ {
+ m_AttribHashIndexMap.insert(
+ eastl::make_pair(Q3DStudio::CHash::HashAttribute(str.c_str()), str));
+ }
+};
+
+struct SRenderPluginTranslator : public Qt3DSTranslator
+{
+ typedef SRenderPlugin TNodeType;
+ SRenderPluginTranslator(Q3DStudio::TElement &inElement, SRenderPlugin &inRenderObject,
+ NVAllocatorCallback &inCallback)
+ : Qt3DSTranslator(inElement, inRenderObject)
+ {
+ m_TranslatorContext = QT3DS_NEW(inCallback, SRenderPluginTranslatorContext)(inCallback);
+ }
+
+ void OnElementChanged(SPresentation & /*inPresentation*/, IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &)
+ {
+ SRenderPlugin &theItem = *static_cast<SRenderPlugin *>(m_RenderObject);
+ theItem.m_Flags.SetActive(Element().GetActive());
+ IRenderPluginInstance *theInstance =
+ inRenderContext.GetRenderPluginManager().GetOrCreateRenderPluginInstance(
+ theItem.m_PluginPath, &theItem);
+ if (theInstance != NULL) {
+ IRenderPluginClass &theClass(theInstance->GetPluginClass());
+ SRenderPluginTranslatorContext &theTransContext =
+ static_cast<SRenderPluginTranslatorContext &>(*m_TranslatorContext);
+ if (theTransContext.m_AttribHashIndexMap.empty()) {
+ NVConstDataRef<SRenderPluginPropertyDeclaration> theProperties(
+ theClass.GetRegisteredProperties());
+ for (QT3DSU32 idx = 0, end = theProperties.size(); idx < end; ++idx) {
+ const SRenderPluginPropertyDeclaration &theDec(theProperties[idx]);
+ switch (theDec.m_Type) {
+ case SRenderPluginPropertyTypes::Boolean:
+ theTransContext.ReverseMap(theDec.m_Name);
+ break;
+ case SRenderPluginPropertyTypes::Float:
+ theTransContext.ReverseMap(theDec.m_Name);
+ break;
+ case SRenderPluginPropertyTypes::Long:
+ theTransContext.ReverseMap(theDec.m_Name);
+ break;
+ case SRenderPluginPropertyTypes::String:
+ theTransContext.ReverseMap(theDec.m_Name);
+ break;
+ case SRenderPluginPropertyTypes::Vector2:
+ theTransContext.ReverseMap(
+ theClass.GetPropertyValueInfo(theDec.m_StartOffset).first);
+ theTransContext.ReverseMap(
+ theClass.GetPropertyValueInfo(theDec.m_StartOffset + 1).first);
+ break;
+ case SRenderPluginPropertyTypes::Vector3:
+ case SRenderPluginPropertyTypes::Color:
+ theTransContext.ReverseMap(
+ theClass.GetPropertyValueInfo(theDec.m_StartOffset).first);
+ theTransContext.ReverseMap(
+ theClass.GetPropertyValueInfo(theDec.m_StartOffset + 1).first);
+ theTransContext.ReverseMap(
+ theClass.GetPropertyValueInfo(theDec.m_StartOffset + 2).first);
+ break;
+ default:
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ }
+ } // ok, now we have an efficient mapping from attribute to plugin value name.
+ theTransContext.m_PropertyUpdates.clear();
+ for (long idx = 0, end = Element().GetAttributeCount(); idx < end; ++idx) {
+ qt3ds::runtime::element::TPropertyDescAndValuePtr thePropInfo =
+ *Element().GetPropertyByIndex(idx);
+ nvhash_map<int, CRegisteredString>::iterator theFind =
+ theTransContext.m_AttribHashIndexMap.find(thePropInfo.first.GetNameHash());
+ if (theFind != theTransContext.m_AttribHashIndexMap.end()) {
+ CRegisteredString thePropName(theFind->second);
+ Q3DStudio::EAttributeType theType =
+ (Q3DStudio::EAttributeType)thePropInfo.first.m_Type;
+ switch (theType) {
+ case Q3DStudio::ATTRIBUTETYPE_BOOL:
+ theTransContext.m_PropertyUpdates.push_back(SRenderPropertyValueUpdate(
+ thePropName, thePropInfo.second->m_INT32 ? true : false));
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_FLOAT:
+ theTransContext.m_PropertyUpdates.push_back(
+ SRenderPropertyValueUpdate(thePropName, thePropInfo.second->m_FLOAT));
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_INT32:
+ theTransContext.m_PropertyUpdates.push_back(SRenderPropertyValueUpdate(
+ thePropName, (QT3DSI32)thePropInfo.second->m_INT32));
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_STRING: {
+ CRegisteredString theStr = inRenderContext.GetStringTable().HandleToStr(
+ thePropInfo.second->m_StringHandle);
+ theTransContext.m_PropertyUpdates.push_back(
+ SRenderPropertyValueUpdate(thePropName, theStr));
+ } break;
+ default:
+ // QT3DS_ASSERT( false );
+ break;
+ }
+ }
+ }
+ if (theTransContext.m_PropertyUpdates.empty() == false) {
+ theInstance->Update(toConstDataRef(theTransContext.m_PropertyUpdates.data(),
+ theTransContext.m_PropertyUpdates.size()));
+ }
+ }
+ }
+};
+}
+
+Qt3DSTranslator::Qt3DSTranslator(Q3DStudio::TElement &inElement, SGraphObject &inRenderObject)
+ : m_DirtyIndex(QT3DS_MAX_U32)
+ , m_Element(&inElement)
+ , m_RenderObject(&inRenderObject)
+ , m_TranslatorContext(NULL)
+{
+ Element().SetAssociation(reinterpret_cast<void *>(this));
+ inRenderObject.m_UserData = STaggedPointer(this);
+}
+
+void Qt3DSTranslator::Save(SWriteBuffer &inWriteBuffer, QT3DSU32 inGraphObjectOffset)
+{
+ // We have to start on pointer aligned boundaries.
+ QT3DS_ASSERT(inWriteBuffer.size() % 4 == 0);
+ QT3DSU32 theOffset = inWriteBuffer.size();
+ inWriteBuffer.write(*this);
+ Qt3DSTranslator *theNewTranslator =
+ reinterpret_cast<Qt3DSTranslator *>(inWriteBuffer.begin() + theOffset);
+ theNewTranslator->m_DirtyIndex = QT3DS_MAX_U32;
+ if (theNewTranslator->m_Element)
+ theNewTranslator->m_Element = m_Element->GetBelongedPresentation()
+ ->GetApplication()
+ .GetElementAllocator()
+ .GetRemappedElementAddress(m_Element);
+ size_t *graphObjPtr = reinterpret_cast<size_t *>(&theNewTranslator->m_RenderObject);
+ *graphObjPtr = inGraphObjectOffset;
+}
+
+Qt3DSTranslator *Qt3DSTranslator::GetTranslatorFromGraphNode(SGraphObject &inObject)
+{
+ return inObject.m_UserData.DynamicCast<Qt3DSTranslator>();
+}
+
+namespace {
+struct SPresentationTranslator;
+struct SEffectTranslator;
+template <typename TTranslatorType>
+struct STranslatorCreator
+{
+ static TTranslatorType *Create(Q3DStudio::TElement &inElement, SGraphObject &inObject,
+ NVAllocatorCallback &inAllocator)
+ {
+ typedef typename TTranslatorType::TNodeType TNodeType;
+ // This assert needs to be here because we serialize all translators generically without
+ // regard for type.
+ StaticAssert<sizeof(TTranslatorType) == sizeof(Qt3DSTranslator)>::valid_expression();
+ return QT3DS_NEW(inAllocator, TTranslatorType)(inElement, static_cast<TNodeType &>(inObject));
+ }
+ static void InitializeTranslator(Qt3DSTranslator &inTranslator, NVAllocatorCallback &)
+ {
+ typedef typename TTranslatorType::TNodeType TNodeType;
+ // Initialize the vtable.
+ new (&inTranslator) TTranslatorType(inTranslator.Element(),
+ static_cast<TNodeType &>(inTranslator.RenderObject()));
+ }
+
+ static void OnElementChanged(Qt3DSTranslator &inTranslator, SPresentation &inPresentation,
+ IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &inStudioPresentation)
+ {
+ TTranslatorType &theTranslator(static_cast<TTranslatorType &>(inTranslator));
+ SRuntimePropertyParser theParser(inPresentation, inRenderContext, *theTranslator.m_Element);
+ if (theTranslator.Element().GetActive()) {
+ // Don't push properties from inactive elements.
+ for (long idx = 0, end = theTranslator.Element().GetAttributeCount(); idx < end;
+ ++idx) {
+ qt3ds::runtime::element::TPropertyDescAndValuePtr thePropInfo =
+ *theTranslator.Element().GetPropertyByIndex(idx);
+ theParser.Setup(thePropInfo.first.GetNameHash(), *thePropInfo.second,
+ (Q3DStudio::EAttributeType)thePropInfo.first.m_Type);
+ // right now, this is the best we can do because the attribute's dirty system
+ // is all jacked up.
+ theTranslator.OnSpecificPropertyChange(theParser);
+ }
+ // same for dynamic properties
+ for (long idx = 0, end = theTranslator.Element().GetDynamicAttributeCount(); idx < end;
+ ++idx) {
+ qt3ds::runtime::element::TPropertyDescAndValuePtr thePropInfo =
+ *theTranslator.Element().GetDynamicPropertyByIndex(idx);
+ theParser.Setup(thePropInfo.first.GetNameHash(), *thePropInfo.second,
+ (Q3DStudio::EAttributeType)thePropInfo.first.m_Type);
+ // right now, this is the best we can do because the attribute's dirty system
+ // is all jacked up.
+ theTranslator.OnSpecificPropertyChange(theParser);
+ }
+ // Set appropriate dirty flags
+ }
+ theTranslator.PostPropertyChanged(theParser, inStudioPresentation);
+ }
+};
+
+template <>
+struct STranslatorCreator<SPresentationTranslator>
+{
+ static Qt3DSTranslator *Create(Q3DStudio::TElement &, SGraphObject &, NVAllocatorCallback &)
+ {
+ return NULL;
+ }
+ static void InitializeTranslator(Qt3DSTranslator &, NVAllocatorCallback &) {}
+ static void OnElementChanged(Qt3DSTranslator & /*inTranslator*/,
+ SPresentation & /*inPresentation*/
+ ,
+ IQt3DSRenderContext & /*inRenderContext*/,
+ Q3DStudio::IPresentation & /*inStudioPresentation*/)
+ {
+ QT3DS_ASSERT(false);
+ }
+};
+
+template <>
+struct STranslatorCreator<SEffectTranslator>
+{
+ static SEffectTranslator *Create(Q3DStudio::TElement &inElement, SGraphObject &inObject,
+ NVAllocatorCallback &inAllocator)
+ {
+ typedef SEffectTranslator::TNodeType TNodeType;
+ // This assert needs to be here because we serialize all translators generically without
+ // regard for type.
+ StaticAssert<sizeof(SEffectTranslator) == sizeof(Qt3DSTranslator)>::valid_expression();
+ return QT3DS_NEW(inAllocator, SEffectTranslator)(inElement, static_cast<TNodeType &>(inObject),
+ inAllocator);
+ }
+
+ static void InitializeTranslator(Qt3DSTranslator &inTranslator, NVAllocatorCallback &inAllocator)
+ {
+ typedef SEffectTranslator::TNodeType TNodeType;
+ // Initialize the vtable.
+ new (&inTranslator)
+ SEffectTranslator(inTranslator.Element(),
+ static_cast<TNodeType &>(inTranslator.RenderObject()), inAllocator);
+ }
+ static void OnElementChanged(Qt3DSTranslator &inTranslator, SPresentation &inPresentation,
+ IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &inStudioPresentation)
+ {
+ static_cast<SEffectTranslator &>(inTranslator)
+ .OnElementChanged(inPresentation, inRenderContext, inStudioPresentation);
+ }
+};
+
+template <>
+struct STranslatorCreator<SCustomMaterialTranslator>
+{
+ static SCustomMaterialTranslator *Create(Q3DStudio::TElement &inElement, SGraphObject &inObject,
+ NVAllocatorCallback &inAllocator)
+ {
+ typedef SCustomMaterialTranslator::TNodeType TNodeType;
+ // This assert needs to be here because we serialize all translators generically without
+ // regard for type.
+ StaticAssert<sizeof(SCustomMaterialTranslator)
+ == sizeof(Qt3DSTranslator)>::valid_expression();
+ return QT3DS_NEW(inAllocator, SCustomMaterialTranslator)(
+ inElement, static_cast<TNodeType &>(inObject), inAllocator);
+ }
+
+ static void InitializeTranslator(Qt3DSTranslator &inTranslator, NVAllocatorCallback &inAllocator)
+ {
+ typedef SCustomMaterialTranslator::TNodeType TNodeType;
+ // Initialize the vtable.
+ new (&inTranslator) SCustomMaterialTranslator(
+ inTranslator.Element(), static_cast<TNodeType &>(inTranslator.RenderObject()),
+ inAllocator);
+ }
+
+ static void OnElementChanged(Qt3DSTranslator &inTranslator, SPresentation &inPresentation,
+ IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &inStudioPresentation)
+ {
+ static_cast<SCustomMaterialTranslator &>(inTranslator)
+ .OnElementChanged(inPresentation, inRenderContext, inStudioPresentation);
+ }
+};
+
+template <>
+struct STranslatorCreator<SRenderPluginTranslator>
+{
+ static SRenderPluginTranslator *Create(Q3DStudio::TElement &inElement, SGraphObject &inObject,
+ NVAllocatorCallback &inAllocator)
+ {
+ typedef SRenderPluginTranslator::TNodeType TNodeType;
+ // This assert needs to be here because we serialize all translators generically without
+ // regard for type.
+ StaticAssert<sizeof(SRenderPluginTranslator) == sizeof(Qt3DSTranslator)>::valid_expression();
+ return QT3DS_NEW(inAllocator, SRenderPluginTranslator)(
+ inElement, static_cast<TNodeType &>(inObject), inAllocator);
+ }
+
+ static void InitializeTranslator(Qt3DSTranslator &inTranslator, NVAllocatorCallback &inAllocator)
+ {
+ typedef SRenderPluginTranslator::TNodeType TNodeType;
+ // Initialize the vtable.
+ new (&inTranslator) SRenderPluginTranslator(
+ inTranslator.Element(), static_cast<TNodeType &>(inTranslator.RenderObject()),
+ inAllocator);
+ }
+ static void OnElementChanged(Qt3DSTranslator &inTranslator, SPresentation &inPresentation,
+ IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &inStudioPresentation)
+ {
+ static_cast<SRenderPluginTranslator &>(inTranslator)
+ .OnElementChanged(inPresentation, inRenderContext, inStudioPresentation);
+ }
+};
+}
+Qt3DSTranslator *Qt3DSTranslator::CreateTranslatorForElement(Q3DStudio::TElement &inElement,
+ SGraphObject &inObject,
+ NVAllocatorCallback &inAlloc)
+{
+ Qt3DSTranslator *theTranslator = NULL;
+ switch (inObject.m_Type) {
+#define QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(type) \
+ case GraphObjectTypes::type: \
+ theTranslator = \
+ STranslatorCreator<S##type##Translator>::Create(inElement, inObject, inAlloc); \
+ break;
+ QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES
+#undef QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ return theTranslator;
+}
+
+void Qt3DSTranslator::OnElementChanged(SPresentation &inPresentation,
+ IQt3DSRenderContext &inRenderContext,
+ Q3DStudio::IPresentation &inStudioPresentation)
+{
+ switch (m_RenderObject->m_Type) {
+#define QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(type) \
+ case GraphObjectTypes::type: \
+ STranslatorCreator<S##type##Translator>::OnElementChanged( \
+ *this, inPresentation, inRenderContext, inStudioPresentation); \
+ break;
+ QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES
+#undef QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+}
+
+Qt3DSTranslator *Qt3DSTranslator::LoadTranslator(SDataReader &inReader, size_t inElemOffset,
+ NVDataRef<QT3DSU8> inSGSection,
+ NVAllocatorCallback &inAllocator)
+{
+ // Reader points to a new translator but we don't know what type
+ QT3DSU8 *theTranslatorStart = inReader.m_CurrentPtr;
+ // Make sure things are aligned
+ (void)theTranslatorStart;
+ QT3DS_ASSERT((size_t)theTranslatorStart % 4 == 0);
+ Qt3DSTranslator *theTranslator = inReader.Load<Qt3DSTranslator>();
+ if (theTranslator) {
+ size_t *elemPtr = reinterpret_cast<size_t *>(&theTranslator->m_Element);
+ *elemPtr += inElemOffset;
+ size_t *graphObjPtr = reinterpret_cast<size_t *>(&theTranslator->m_RenderObject);
+ size_t sgSectionStart = reinterpret_cast<size_t>(inSGSection.begin());
+ *graphObjPtr += sgSectionStart;
+ // Call actual constructor to initialize vtable.
+ switch (theTranslator->RenderObject().m_Type) {
+#define QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(type) \
+ case GraphObjectTypes::type: \
+ STranslatorCreator<S##type##Translator>::InitializeTranslator(*theTranslator, \
+ inAllocator); \
+ break;
+ QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES
+#undef QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ return theTranslator;
+}
+Q3DStudio::IPresentation *
+Qt3DSTranslator::GetPresentationFromPresentation(SPresentation &inPresentation)
+{
+ return inPresentation.m_UserData.DynamicCast<Q3DStudio::IPresentation>();
+}
+
+void Qt3DSTranslator::InitializePointerTags(IStringTable &)
+{
+ g_TranslatorTag = 0x0044FEED;
+ g_PresentationTag = 0x0022ABBA;
+}
+
+void Qt3DSTranslator::AssignUserData(Q3DStudio::IPresentation &inPresentation,
+ SPresentation &inGraphPresentation)
+{
+ inGraphPresentation.m_UserData = STaggedPointer(&inPresentation);
+}
diff --git a/src/engine/Qt3DSRuntimeView.cpp b/src/engine/Qt3DSRuntimeView.cpp
new file mode 100644
index 0000000..c1f3b3d
--- /dev/null
+++ b/src/engine/Qt3DSRuntimeView.cpp
@@ -0,0 +1,862 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSRuntimeView.h"
+#include "Qt3DSTegraInputEngine.h"
+#include "Qt3DSDataLogger.h"
+#include "Qt3DSFileStream.h"
+#include "Qt3DSArray.h"
+#include "Qt3DSApplication.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSPresentation.h"
+#include "EASTL/string.h"
+#include "Qt3DSMemory.h"
+#include "Qt3DSKernelTypes.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderRuntimeBindingImpl.h"
+#include "Qt3DSImportMesh.h"
+
+#include "Qt3DSDLLManager.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/TrackingAllocator.h"
+// For perf log timestamp
+#include <time.h>
+#include "Qt3DSArray.h"
+// For perf log timestamp
+#include <time.h>
+
+#ifdef _LINUXPLATFORM
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#ifdef ANDROID
+#include <android/log.h>
+#endif
+
+#include <QCoreApplication>
+#include <QSurfaceFormat>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace qt3ds {
+namespace render {
+extern qt3ds::foundation::MallocAllocator g_BaseAllocator;
+}
+}
+
+namespace Q3DStudio {
+
+namespace {
+
+bool CaselessEqual(const char *lhs, const char *rhs)
+{
+ if (lhs == nullptr)
+ lhs = "";
+ if (rhs == nullptr)
+ rhs = "";
+ return Q3DStudio_stricmp(lhs, rhs) == 0;
+}
+
+CInputEngine *CreateInputEngine()
+{
+ return Q3DStudio_virtual_new(CTegraInputEngine) CTegraInputEngine();
+}
+
+static eastl::string *theAppDir = nullptr;
+const eastl::string &GetAppDir(const eastl::string &inAppExe)
+{
+ if (!theAppDir)
+ theAppDir = new eastl::string;
+#ifndef __ANDROID__
+ theAppDir->assign(inAppExe.empty() == false ? inAppExe : "");
+#ifdef Qt3DS_OS_LINUX
+ char theBuf[1024] = { 0 };
+ int rc = readlink("/proc/self/exe", theBuf, sizeof(theBuf));
+ if (rc > 0)
+ theAppDir->assign(theBuf);
+#endif
+#ifdef Qt3DS_OS_QNX
+ char theBuf[1024] = { 0 };
+ FILE *exefile = fopen("/proc/self/exefile", "r");
+ if (exefile != nullptr) {
+ fgets(theBuf, sizeof(theBuf), exefile);
+ fclose(exefile);
+ theAppDir->assign(theBuf);
+ }
+#endif
+ eastl::string::size_type pos = theAppDir->find_last_of("\\/");
+ if (pos != eastl::string::npos)
+ *theAppDir = theAppDir->substr(0, pos);
+ theAppDir->append("\\");
+#endif
+ return *theAppDir;
+}
+}
+
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+
+class CRuntimeView : public IRuntimeView
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+private:
+ ITegraApplicationRenderEngine *m_RenderEngine; ///< Handles all rendering functions
+ CTegraInputEngine *m_InputEngine; ///< Handles all user input events
+ // Pre graphics init objects
+ NVScopedRefCounted<qt3ds::render::IQt3DSRenderFactoryCore> m_RuntimeFactoryCore;
+ ///< Base application before graphics
+ NVScopedRefCounted<qt3ds::runtime::IApplication> m_ApplicationCore;
+
+ // Post graphics init objects
+ NVScopedRefCounted<qt3ds::render::IQt3DSRenderFactory> m_RuntimeFactory;
+ NVScopedRefCounted<qt3ds::runtime::IApplication> m_Application; ///< Application after graphics
+ ///< Currently loaded presentation, this should be removed in the future
+ CPresentation *m_Presentation;
+
+ CPausingTimeProvider m_TimeProvider;
+ IWindowSystem &m_WindowSystem;
+ IAudioPlayer *m_AudioPlayer;
+
+ volatile QT3DSI32 mRefCount;
+
+ qt3ds::Qt3DSAssetVisitor *m_visitor;
+ bool m_showOnScreenStats;
+ QElapsedTimer *m_startupTimer;
+ qint64 m_startupTime;
+
+public:
+ CRuntimeView(ITimeProvider &inTimeProvider, IWindowSystem &inWindowSystem,
+ IAudioPlayer *inAudioPlayer, QElapsedTimer *startupTimer);
+ ~CRuntimeView() override;
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(qt3ds::render::g_BaseAllocator)
+
+ bool BeginLoad(const QString &sourcePath, const QStringList &variantList) override;
+ bool HasOfflineLoadingCompleted() override;
+ bool InitializeGraphics(const QSurfaceFormat &format, bool delayedLoading) override;
+
+ void Cleanup() override;
+
+ bool CanRender() override;
+ void Render() override;
+ bool WasLastFrameDirty() override;
+
+ bool HandleMessage(const QEvent *inEvent) override;
+
+ void Pause() override;
+ void UnPause() override;
+ bool IsPaused() override;
+ void setAssetVisitor(qt3ds::Qt3DSAssetVisitor *) override;
+
+ INT32 GetFrameCount() override;
+ void showOnScreenStats(bool) override;
+
+ CInputEngine *GetInputEngine() override;
+ // Only valid after InitializeGraphics
+ ITegraApplicationRenderEngine *GetTegraRenderEngine() override { return m_RenderEngine; }
+
+ void GoToSlideByName(const char *elementPath, const char *slideName) override;
+ void GoToSlideByIndex(const char *elementPath, const int slideIndex) override;
+ void GoToSlideRelative(const char *elementPath, const bool next, const bool wrap) override;
+ bool GetSlideInfo(const char *elementPath, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName) override;
+ void SetPresentationAttribute(const char *presId, const char *, const char *value) override;
+ void GoToTime(const char *elementPath, const float time) override;
+ void SetGlobalAnimationTime(qint64 inMilliSecs) override;
+ void SetDataInputValue(const QString &name, const QVariant &value,
+ int property) override;
+
+ void setPresentationId(const QString &id) override
+ {
+ m_Application->setPresentationId(id);
+ }
+
+ QList<QString> dataInputs() const override;
+ QList<QString> dataOutputs() const override;
+ float dataInputMax(const QString &name) const override;
+ float dataInputMin(const QString &name) const override;
+ QHash<QString, QString> dataInputMetadata(const QString &name) const override;
+
+ void createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties) override;
+ void deleteElements(const QStringList &elementPaths) override;
+ void createMaterials(const QString &subPresId,
+ const QStringList &materialDefinitions) override;
+ void deleteMaterials(const QStringList &materialNames) override;
+ void createMesh(const QString &name, qt3dsimp::Mesh *mesh) override;
+ void deleteMeshes(const QStringList &meshNames) override;
+ void SetAttribute(const char *elementPath, const char *attributeName,
+ const char *value) override;
+ bool GetAttribute(const char *elementPath, const char *attributeName, void *value) override;
+ void FireEvent(const char *element, const char *evtName) override;
+ bool PeekCustomAction(char *&outElementPath, char *&outActionName) override;
+ bool RegisterScriptCallback(int callbackType, qml_Function func, void *inUserData) override;
+ void FireEvent(const TEventCommandHash inEventType, eastl::string inArgument) override;
+ qt3ds::foundation::Option<SPresentationSize> GetPresentationSize() override;
+ void preloadSlide(const QString &slide) override;
+ void unloadSlide(const QString &slide) override;
+ void setDelayedLoading(bool enable) override;
+ void BootupPreGraphicsInitObjects();
+};
+
+CRuntimeView::CRuntimeView(ITimeProvider &inTimeProvider, IWindowSystem &inWindowSystem,
+ IAudioPlayer *inAudioPlayer, QElapsedTimer *startupTimer)
+ : m_RenderEngine(nullptr)
+ , m_InputEngine(nullptr)
+ , m_Application(nullptr)
+ , m_Presentation(nullptr)
+ , m_TimeProvider(inTimeProvider)
+ , m_WindowSystem(inWindowSystem)
+ , m_AudioPlayer(inAudioPlayer)
+ , mRefCount(0)
+ , m_visitor(nullptr)
+ , m_showOnScreenStats(false)
+ , m_startupTimer(startupTimer)
+ , m_startupTime(-1)
+{
+}
+
+CRuntimeView::~CRuntimeView()
+{
+}
+
+bool CRuntimeView::BeginLoad(const QString &sourcePath, const QStringList &variantList)
+{
+ bool theResult = false;
+
+ // boot up the application
+ BootupPreGraphicsInitObjects();
+
+ // If there was a presentation file then we have to load it or something failed.
+ if (m_ApplicationCore->BeginLoad(sourcePath.toUtf8(), variantList))
+ theResult = true;
+ else
+ theResult = false;
+
+ // If Initialize wasn't successful - this means the CShaderFactory failed to initialize
+ // or, the presentation failed to load.
+ //
+ // NOTE: if no presentation was passed, this is 'ok'
+ if (!theResult)
+ Cleanup();
+
+ return theResult;
+}
+
+bool CRuntimeView::HasOfflineLoadingCompleted()
+{
+ if (m_Application.mPtr == nullptr) {
+ if (m_ApplicationCore)
+ return m_ApplicationCore->HasCompletedLoading();
+ else
+ return false;
+ }
+ return true;
+}
+
+bool CRuntimeView::InitializeGraphics(const QSurfaceFormat &format, bool delayedLoading)
+{
+ m_ApplicationCore->EndLoad();
+ // Next call will initialize the render portion of the scenes. This *must* have a loaded
+ // application to go further as it will bind scene graph data to application data.
+ m_RuntimeFactory = m_RuntimeFactoryCore->CreateRenderFactory(format, delayedLoading);
+ m_Application
+ = m_ApplicationCore->CreateApplication(*m_InputEngine, m_AudioPlayer,
+ *m_RuntimeFactory);
+ if (!m_Application->createSuccessful())
+ return false;
+
+ m_Application->ResetTime();
+ m_RenderEngine = &m_RuntimeFactory->CreateRenderEngine();
+ m_Presentation = m_Application->GetPrimaryPresentation();
+
+ QObject::connect(m_Presentation->signalProxy(), &QPresentationSignalProxy::SigSlideEntered,
+ signalProxy(), &QRuntimeViewSignalProxy::SigSlideEntered);
+ QObject::connect(m_Presentation->signalProxy(), &QPresentationSignalProxy::SigSlideExited,
+ signalProxy(), &QRuntimeViewSignalProxy::SigSlideExited);
+ QObject::connect(m_Presentation->signalProxy(), &QPresentationSignalProxy::SigCustomSignal,
+ signalProxy(), &QRuntimeViewSignalProxy::SigCustomSignal);
+ QObject::connect(m_Presentation->signalProxy(),
+ &QPresentationSignalProxy::SigPresentationReady,
+ signalProxy(), &QRuntimeViewSignalProxy::SigPresentationReady);
+ QObject::connect(m_Presentation->signalProxy(), &QPresentationSignalProxy::SigElementsCreated,
+ signalProxy(), &QRuntimeViewSignalProxy::SigElementsCreated);
+ QObject::connect(m_Presentation->signalProxy(), &QPresentationSignalProxy::SigMaterialsCreated,
+ signalProxy(), &QRuntimeViewSignalProxy::SigMaterialsCreated);
+ QObject::connect(m_Presentation->signalProxy(),
+ &QPresentationSignalProxy::SigDataOutputValueUpdated,
+ signalProxy(),
+ &QRuntimeViewSignalProxy::SigDataOutputValueUpdated);
+
+ m_TimeProvider.Reset();
+ return true;
+}
+
+void CRuntimeView::Cleanup()
+{
+ // Q3DStudio_virtual_delete( m_Timer, CTimer );
+ // Q3DStudio_virtual_delete( m_PerfFileStream, CFileStream );
+ m_Application = nullptr;
+ Q3DStudio_virtual_delete(m_InputEngine, CTegraInputEngine);
+ if (m_RenderEngine) {
+ m_RenderEngine->Release();
+ m_RenderEngine = nullptr;
+ }
+
+ CDLLManager &theDLLManager = CDLLManager::GetDLLManager();
+ theDLLManager.Cleanup();
+ if (m_Presentation)
+ QObject::disconnect(m_Presentation->signalProxy(), 0, signalProxy(), 0);
+
+ m_InputEngine = nullptr;
+ m_RenderEngine = nullptr;
+ m_Presentation = nullptr;
+}
+
+bool CRuntimeView::CanRender()
+{
+ return m_Application.mPtr != nullptr;
+}
+
+//==============================================================================
+/**
+ * nv_main APP-SPECIFIC rendering call
+ * returns KD_TRUE to call egl_render and swap properly, KD_FALSE if there has been no scene update
+ *or redraw.
+ */
+void CRuntimeView::Render()
+{
+ if (m_Application.mPtr == nullptr) {
+ // InitializeGraphics has not been called
+ QT3DS_ASSERT(false);
+ }
+
+ PerfLogGeneralEvent1(DATALOGGER_FRAME);
+
+ m_Application->UpdateAndRender();
+
+ if (m_startupTime < 0 && m_startupTimer) {
+ m_startupTime = m_startupTimer->elapsed();
+ m_startupTimer->invalidate();
+ }
+
+ if (m_showOnScreenStats) {
+ ITegraRenderStateManager &manager
+ = GetTegraRenderEngine()->GetTegraRenderStateManager();
+ manager.PushState();
+
+ QSize dim = m_WindowSystem.GetWindowDimensions();
+ manager.SetScissorTestEnabled(false);
+ manager.SetViewport(0, 0, dim.width(), dim.height());
+
+ QPair<QT3DSF32, QT3DSF32> fps
+ = m_RuntimeFactory->GetQt3DSRenderContext().GetFPS();
+ const QVector<QT3DSF32> times = m_RuntimeFactory->GetQt3DSRenderContext().GetFrameTimes();
+
+ QString text;
+ QTextStream stream(&text);
+ stream << QStringLiteral("Render Statistics: ");
+ stream << QString::number(fps.first, 'f', 2);
+ stream << " fps, frame count ";
+ stream << QString::number(fps.second);
+ stream << ", frame time ";
+ stream << QString::number(times[0], 'f', 2);
+ stream << " ms";
+ if (m_startupTime) {
+ stream << ", Init time: ";
+ stream << QString::number(m_startupTime);
+ stream << " ms";
+ }
+
+ // bottom left coordinates
+ GetTegraRenderEngine()->RenderText2D(
+ dim.width() / 4, dim.height() - 25, qt3ds::QT3DSVec3(0.0, 1.0, 0.0),
+ text.toLatin1().constData());
+ GetTegraRenderEngine()->RenderGpuProfilerStats(
+ 20.0, dim.height() - 80, qt3ds::QT3DSVec3(0.0, 1.0, 0.0));
+
+ manager.PopState();
+ }
+}
+
+bool CRuntimeView::WasLastFrameDirty()
+{
+ if (m_Application)
+ return m_Application->IsApplicationDirty();
+ return false;
+}
+
+//==============================================================================
+/**
+ * nv_main APP-SPECIFIC message call
+ * HandleMessage
+ */
+bool CRuntimeView::HandleMessage(const QEvent *inEvent)
+{
+ if (m_Application.mPtr == nullptr || m_RenderEngine == nullptr)
+ return 0;
+
+ bool ret = false;
+ switch (inEvent->type()) {
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ {
+ const QMouseEvent *event = static_cast<const QMouseEvent *>(inEvent);
+ m_InputEngine->SetPickInput(static_cast<FLOAT>(event->x()),
+ static_cast<FLOAT>(event->y()), true);
+ m_InputEngine->SetPickFlags(inEvent->type() == QEvent::MouseButtonPress
+ ? LMOUSE_DOWN : LMOUSE_UP);
+ ret = true;
+ }
+ break;
+ case QEvent::Resize:
+ {
+ if (m_Application->GetPrimaryPresentation())
+ m_RenderEngine->CheckResize(true, *m_Application->GetPrimaryPresentation());
+ ret = true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ m_InputEngine->HandleMessage(inEvent, *m_RenderEngine, m_Application->GetPrimaryPresentation());
+ return ret ? 1 : 0;
+}
+
+void CRuntimeView::Pause()
+{
+ m_TimeProvider.Pause();
+}
+
+void CRuntimeView::UnPause()
+{
+ m_TimeProvider.UnPause();
+}
+
+bool CRuntimeView::IsPaused()
+{
+ return m_TimeProvider.IsPaused();
+}
+
+INT32 CRuntimeView::GetFrameCount()
+{
+ return m_Application->GetFrameCount();
+}
+
+void CRuntimeView::showOnScreenStats(bool show)
+{
+ m_showOnScreenStats = show;
+ m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer().EnableLayerGpuProfiling(show);
+}
+
+CInputEngine *CRuntimeView::GetInputEngine()
+{
+ return m_InputEngine;
+}
+
+//==============================================================================
+/**
+ * Generates an event in the presentation.
+ */
+void CRuntimeView::GoToSlideByName(const char *elementPath, const char *slideName)
+{
+ if (m_Application) {
+ if (!elementPath || !slideName)
+ return;
+
+ CPresentation *thePresentation = m_Application->GetPrimaryPresentation();
+ IScriptBridge *theBridge = thePresentation->GetScriptBridgeQml();
+
+ if (!theBridge)
+ return;
+
+ theBridge->GotoSlide(elementPath, slideName, SScriptEngineGotoSlideArgs());
+ }
+}
+
+void CRuntimeView::GoToSlideByIndex(const char *elementPath, const int slideIndex)
+{
+ if (m_Application) {
+ if (!elementPath || slideIndex < 0)
+ return;
+
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ theBridgeEngine.GotoSlideIndex(elementPath, slideIndex, SScriptEngineGotoSlideArgs());
+ }
+}
+
+void CRuntimeView::GoToSlideRelative(const char *elementPath, const bool next, const bool wrap)
+{
+ if (m_Application) {
+ if (!elementPath)
+ return;
+
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ theBridgeEngine.GotoSlideRelative(elementPath, next, wrap, SScriptEngineGotoSlideArgs());
+ }
+}
+
+bool CRuntimeView::GetSlideInfo(const char *elementPath, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName)
+{
+ if (m_Application && elementPath) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ return theBridgeEngine.GetSlideInfo(elementPath, currentIndex, previousIndex,
+ currentName, previousName);
+ }
+ return false;
+}
+
+void CRuntimeView::SetPresentationAttribute(const char *presId, const char *, const char *value)
+{
+ if (m_Application) {
+ if (!presId || !value)
+ return;
+
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ theBridgeEngine.SetPresentationAttribute(presId, nullptr, value);
+ }
+}
+
+bool CRuntimeView::RegisterScriptCallback(int callbackType, qml_Function func, void *inUserData)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ return theBridgeEngine.RegisterCallback(callbackType, func, inUserData);
+ }
+
+ return false;
+}
+
+void CRuntimeView::GoToTime(const char *elementPath, const float time)
+{
+ if (m_Application) {
+ if (!elementPath || time < 0.0)
+ return;
+
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ theBridgeEngine.GotoTime(elementPath, time);
+ }
+}
+
+void CRuntimeView::SetGlobalAnimationTime(qint64 inMilliSecs)
+{
+ if (m_Application)
+ m_Application->SetTimeMilliSecs(inMilliSecs);
+}
+
+void CRuntimeView::SetDataInputValue(
+ const QString &name, const QVariant &value,
+ int property = 0)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ theBridgeEngine.SetDataInputValue(name, value, (qt3ds::runtime::DataInputValueRole)property);
+ }
+}
+
+QList<QString> CRuntimeView::dataInputs() const
+{
+ if (m_Application)
+ return m_Application->dataInputs();
+
+ return {};
+}
+
+QList<QString> CRuntimeView::dataOutputs() const
+{
+ if (m_Application)
+ return m_Application->dataOutputs();
+
+ return {};
+}
+
+float CRuntimeView::dataInputMax(const QString &name) const
+{
+ if (m_Application)
+ return m_Application->dataInputMax(name);
+
+ return 0;
+}
+
+float CRuntimeView::dataInputMin(const QString &name) const
+{
+ if (m_Application)
+ return m_Application->dataInputMin(name);
+
+ return 0;
+}
+
+QHash<QString, QString> CRuntimeView::dataInputMetadata(const QString &name) const
+{
+ if (m_Application)
+ return m_Application->dataInputMetadata(name);
+
+ return {};
+}
+
+void CRuntimeView::createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ theBridgeEngine.createElements(parentElementPath, slideName, properties,
+ &m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer());
+ }
+}
+
+void CRuntimeView::deleteElements(const QStringList &elementPaths)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ theBridgeEngine.deleteElements(elementPaths,
+ &m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer());
+ }
+}
+
+void CRuntimeView::createMaterials(const QString &subPresId,
+ const QStringList &materialDefinitions)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ theBridgeEngine.createMaterials(
+ subPresId, materialDefinitions,
+ &m_RuntimeFactory->GetQt3DSRenderContext().GetCustomMaterialSystem(),
+ &m_RuntimeFactory->GetQt3DSRenderContext().GetDynamicObjectSystem(),
+ &m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer());
+ }
+}
+
+void CRuntimeView::deleteMaterials(const QStringList &materialNames)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ theBridgeEngine.deleteMaterials(materialNames,
+ &m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer());
+ }
+}
+
+void CRuntimeView::createMesh(const QString &name, qt3dsimp::Mesh *mesh)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ theBridgeEngine.createMesh(
+ name, mesh, &m_RuntimeFactory->GetQt3DSRenderContext().GetBufferManager());
+ }
+}
+
+void CRuntimeView::deleteMeshes(const QStringList &meshNames)
+{
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+ theBridgeEngine.deleteMeshes(
+ meshNames, &m_RuntimeFactory->GetQt3DSRenderContext().GetBufferManager());
+ }
+}
+
+void CRuntimeView::SetAttribute(const char *elementPath, const char *attributeName,
+ const char *value)
+{
+ if (m_Application) {
+ if (!elementPath || !attributeName || !value)
+ return;
+
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ theBridgeEngine.SetAttribute(elementPath, attributeName, value);
+ }
+}
+
+bool CRuntimeView::GetAttribute(const char *elementPath, const char *attributeName, void *value)
+{
+ if (m_Application) {
+ if (!elementPath || !attributeName || !value)
+ return false;
+
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ return theBridgeEngine.GetAttribute(elementPath, attributeName, (char *)value);
+ }
+
+ return false;
+}
+
+void CRuntimeView::FireEvent(const char *element, const char *evtName)
+{
+ if (m_Application) {
+ if (!element || !evtName)
+ return;
+
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ theBridgeEngine.FireEvent(element, evtName);
+ }
+}
+
+bool CRuntimeView::PeekCustomAction(char *&outElementPath, char *&outActionName)
+{
+ bool actionAvailable = true;
+
+ if (m_Application) {
+ Q3DStudio::CQmlEngine &theBridgeEngine
+ = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml());
+
+ Q3DStudio::TElement *theElement = nullptr;
+ actionAvailable = theBridgeEngine.PeekSignal(theElement, outActionName);
+ if (actionAvailable && theElement)
+ outElementPath = (char *)theElement->m_Path.c_str();
+ }
+
+ return actionAvailable;
+}
+
+void CRuntimeView::FireEvent(const TEventCommandHash inEventType, eastl::string inArgument)
+{
+ if (m_Application) {
+ CPresentation *thePresentation = m_Application->GetPrimaryPresentation();
+ TElement *theScene = thePresentation->GetRoot();
+ if (inArgument.empty()) {
+ thePresentation->FireEvent(inEventType, theScene, nullptr, nullptr, ATTRIBUTETYPE_NONE,
+ ATTRIBUTETYPE_NONE);
+ } else {
+ UVariant inArg;
+ inArg.m_StringHandle = thePresentation->GetStringTable().GetHandle(inArgument.c_str());
+ thePresentation->FireEvent(inEventType, theScene, &inArg, nullptr, ATTRIBUTETYPE_STRING,
+ ATTRIBUTETYPE_NONE);
+ }
+ }
+}
+
+void CRuntimeView::preloadSlide(const QString &slide)
+{
+ if (m_Application)
+ m_Application->preloadSlide(slide);
+}
+
+void CRuntimeView::unloadSlide(const QString &slide)
+{
+ if (m_Application)
+ m_Application->unloadSlide(slide);
+}
+
+void CRuntimeView::setDelayedLoading(bool enable)
+{
+ if (m_Application)
+ m_Application->setDelayedLoading(enable);
+}
+
+qt3ds::foundation::Option<SPresentationSize> CRuntimeView::GetPresentationSize()
+{
+ if (m_Application) {
+ CPresentation *thePresentation = m_Application->GetPrimaryPresentation();
+ if (thePresentation)
+ return thePresentation->GetSize();
+ }
+ return qt3ds::foundation::Empty();
+}
+
+//==============================================================================
+/**
+ * Perform the initialization steps prior to loading any presentation.
+ */
+void CRuntimeView::BootupPreGraphicsInitObjects()
+{
+ qCInfo(TRACE_INFO) << "CNDDView::BootupPreGraphicsInitObjects: DoInitialize";
+ // Create engines and runtime
+ const eastl::string &theAppDir = QCoreApplication::applicationDirPath().toLatin1().constData();
+
+ m_RuntimeFactoryCore = qt3ds::render::IQt3DSRenderFactoryCore::CreateRenderFactoryCore(
+ theAppDir.c_str(), m_WindowSystem, m_TimeProvider);
+ m_ApplicationCore = qt3ds::runtime::IApplication::CreateApplicationCore(*m_RuntimeFactoryCore,
+ theAppDir.c_str());
+
+ if (m_ApplicationCore && m_visitor)
+ m_ApplicationCore->setAssetVisitor(m_visitor);
+
+ m_InputEngine = static_cast<CTegraInputEngine *>(CreateInputEngine());
+ Q3DStudio_ASSERT(m_InputEngine != nullptr);
+
+ qCInfo(TRACE_INFO) << "CNDDView::DoInitialize: Successfully initialized!";
+}
+
+void CRuntimeView::setAssetVisitor(qt3ds::Qt3DSAssetVisitor *v)
+{
+ m_visitor = v;
+ if (m_ApplicationCore)
+ m_ApplicationCore->setAssetVisitor(v);
+}
+
+IRuntimeView &IRuntimeView::Create(ITimeProvider &inProvider, IWindowSystem &inWindowSystem,
+ IAudioPlayer *inAudioPlayer, QElapsedTimer *startupTimer)
+{
+ return *QT3DS_NEW(qt3ds::render::g_BaseAllocator, CRuntimeView)(inProvider, inWindowSystem,
+ inAudioPlayer, startupTimer);
+}
+
+QRuntimeViewSignalProxy *IRuntimeView::signalProxy()
+{
+ return &m_SignalProxy;
+}
+
+} // namespace Q3DStudio
+
diff --git a/src/engine/Qt3DSRuntimeView.h b/src/engine/Qt3DSRuntimeView.h
new file mode 100644
index 0000000..22d8cba
--- /dev/null
+++ b/src/engine/Qt3DSRuntimeView.h
@@ -0,0 +1,238 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_RUNTIME_VIEW_H
+#define QT3DS_RUNTIME_VIEW_H
+
+#include "EnginePrefix.h"
+#include "Qt3DSIStateful.h"
+#include "foundation/Qt3DSVec4.h"
+#include "foundation/Qt3DSOption.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSWindowSystem.h"
+#include "Qt3DSTimer.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSRenderRuntimeBinding.h"
+#include <QtCore/qobject.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qstringlist.h>
+#include <QtGui/qsurfaceformat.h>
+
+typedef void (*qml_Function)(void *inUserData);
+
+namespace qt3dsimp {
+ struct Mesh;
+}
+
+class QRuntimeViewSignalProxy : public QObject
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void SigSlideEntered(const QString &elementPath, unsigned int index, const QString &name);
+ void SigSlideExited(const QString &elementPath, unsigned int index, const QString &name);
+ void SigCustomSignal(const QString &elementPath, const QString &name);
+ void SigPresentationReady();
+ void SigElementsCreated(const QStringList &elementPaths, const QString &error);
+ void SigMaterialsCreated(const QStringList &materialNames, const QString &error);
+ void SigDataOutputValueUpdated(const QString &name, const QVariant &value);
+};
+
+namespace qt3ds {
+class Qt3DSAssetVisitor;
+}
+
+namespace qt3ds {
+namespace render {
+class NVRenderContext;
+}
+}
+
+namespace Q3DStudio {
+
+class CTegraInputEngine;
+class CTegraRenderEngine;
+class IScene;
+class CInputEngine;
+class IAudioPlayer;
+
+class ITegraRenderStateManager : public IStatefulStackBase
+{
+protected:
+ virtual ~ITegraRenderStateManager() {}
+public:
+ virtual void SetViewport(INT32 inX, INT32 inY, INT32 inWidth, INT32 inHeight) = 0;
+ virtual void SetScissorTestEnabled(bool inValue) = 0;
+ virtual void SaveAllState() = 0;
+ virtual void RestoreAllState() = 0;
+};
+
+struct TegraRenderScaleModes
+{
+ enum Enum {
+ ExactSize = 0, // Ensure the viewport is exactly same size as application
+ ScaleToFit = 1, // Resize viewport keeping aspect ratio
+ ScaleToFill = 2, // Resize viewport to entire window
+ };
+};
+
+struct TegraRenderShadeModes
+{
+ enum Enum {
+ Shaded = 0, // Geometry is shaded only
+ ShadedWireframe = 1, // Wireframe is drawn on top shaded geometry
+ Wireframe = 2, // Wireframe only
+ };
+};
+
+class ITegraApplicationRenderEngine
+{
+protected:
+ virtual ~ITegraApplicationRenderEngine() {}
+
+public:
+ virtual void SetViewport(INT32 inX, INT32 inY, INT32 inWidth, INT32 inHeight) = 0;
+ virtual void SetApplicationViewport(const qt3ds::render::NVRenderRect &inViewport) = 0;
+ virtual void ensureRenderTarget() = 0;
+ virtual void CheckResize(bool inForce, IPresentation &inActivePresentation) = 0;
+ virtual BOOL LoadShaderCache(const CHAR *inFilePath) = 0;
+ virtual void AbandonLoadingImages(IScene &inScene) = 0;
+ virtual BOOL IsPickValid(FLOAT &outX, FLOAT &outY,
+ const IPresentation &inPresentation) const = 0;
+ virtual void SetScaleMode(TegraRenderScaleModes::Enum inScale) = 0;
+ virtual void SetShadeMode(TegraRenderShadeModes::Enum inShade) = 0;
+ virtual TegraRenderScaleModes::Enum GetScaleMode() const = 0;
+
+ // TODO: To be removed, not used anywhere anymore
+ void CycleScaleMode()
+ {
+ int mode = (int)GetScaleMode();
+ mode = (mode + 1) % 3;
+ SetScaleMode((TegraRenderScaleModes::Enum)mode);
+ }
+
+ virtual ITegraRenderStateManager &GetTegraRenderStateManager() = 0;
+ virtual qt3ds::render::NVRenderContext &GetRenderContext() = 0;
+ virtual void SetMatteColor(qt3ds::foundation::Option<qt3ds::QT3DSVec4> inColor) = 0;
+ virtual void EnableRenderRotation(bool inEnable) = 0;
+ virtual void SetWriteOutShaderCache(bool inWriteOutShaderCache) = 0;
+ virtual void Release() = 0;
+ virtual void RenderText2D(FLOAT x, FLOAT y, qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor,
+ const char *text) = 0;
+ virtual void RenderGpuProfilerStats(FLOAT x, FLOAT y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor) = 0;
+};
+
+class IRuntimeView : public qt3ds::foundation::NVRefCounted
+{
+public:
+ virtual ~IRuntimeView(){}
+
+public: // loading
+ virtual bool BeginLoad(const QString &sourcePath, const QStringList &variantList) = 0;
+ virtual bool HasOfflineLoadingCompleted() = 0;
+ virtual bool InitializeGraphics(const QSurfaceFormat &format, bool delayedLoading) = 0;
+
+ virtual void Cleanup() = 0;
+
+ virtual bool CanRender() = 0;
+
+ virtual void Render() = 0;
+
+ virtual bool WasLastFrameDirty() = 0;
+
+ virtual bool HandleMessage(const QEvent *inEvent) = 0;
+
+ virtual void Pause() = 0;
+ virtual void UnPause() = 0;
+ virtual bool IsPaused() = 0;
+ virtual INT32 GetFrameCount() = 0;
+ virtual void showOnScreenStats(bool) = 0;
+
+ virtual void setPresentationId(const QString &id) = 0;
+
+public: // Input engine access
+ virtual CInputEngine *GetInputEngine() = 0;
+ // Only valid after InitializeGraphics
+ virtual ITegraApplicationRenderEngine *GetTegraRenderEngine() = 0;
+
+public:
+ virtual void GoToSlideByName(const char *elementPath, const char *slideName) = 0;
+ virtual void GoToSlideByIndex(const char *elementPath, const int slideIndex) = 0;
+ virtual void GoToSlideRelative(const char *elementPath, const bool next, const bool wrap) = 0;
+ virtual bool GetSlideInfo(const char *elementPath, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName) = 0;
+ virtual void SetPresentationAttribute(const char *presId, const char *, const char *value) = 0;
+ virtual void GoToTime(const char *elementPath, const float time) = 0;
+ virtual void SetGlobalAnimationTime(qint64 inMilliSecs) = 0;
+ virtual void SetDataInputValue(const QString &name, const QVariant &value,
+ int property) = 0;
+ virtual QList<QString> dataInputs() const = 0;
+ virtual QList<QString> dataOutputs() const = 0;
+ virtual float dataInputMax(const QString &name) const = 0;
+ virtual float dataInputMin(const QString &name) const = 0;
+ virtual QHash<QString, QString> dataInputMetadata(const QString &name) const = 0;
+ virtual void createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties) = 0;
+ virtual void deleteElements(const QStringList &elementPaths) = 0;
+ virtual void createMaterials(const QString &subPresId,
+ const QStringList &materialDefinitions) = 0;
+ virtual void deleteMaterials(const QStringList &materialNames) = 0;
+ virtual void createMesh(const QString &name, qt3dsimp::Mesh *mesh) = 0;
+ virtual void deleteMeshes(const QStringList &meshNames) = 0;
+ virtual void SetAttribute(const char *elementPath, const char *attributeName,
+ const char *value) = 0;
+ virtual bool GetAttribute(const char *elementPath, const char *attributeName, void *value) = 0;
+ virtual void FireEvent(const char *element, const char *evtName) = 0;
+ virtual bool PeekCustomAction(char *&outElementPath, char *&outActionName) = 0;
+ virtual bool RegisterScriptCallback(int callbackType, qml_Function func, void *inUserData) = 0;
+ virtual void FireEvent(const TEventCommandHash inEventType, eastl::string inArgument) = 0;
+ virtual qt3ds::foundation::Option<SPresentationSize> GetPresentationSize() = 0;
+ virtual void setAssetVisitor(qt3ds::Qt3DSAssetVisitor *) = 0;
+ virtual void preloadSlide(const QString &slide) = 0;
+ virtual void unloadSlide(const QString &slide) = 0;
+ virtual void setDelayedLoading(bool enable) = 0;
+
+public:
+ static IRuntimeView &Create(ITimeProvider &inProvider, IWindowSystem &inWindowSystem,
+ IAudioPlayer *inAudioPlayer = nullptr,
+ QElapsedTimer *startupTimer = nullptr);
+
+public:
+ QRuntimeViewSignalProxy *signalProxy();
+private:
+ QRuntimeViewSignalProxy m_SignalProxy;
+};
+
+} // namespace Q3DStudio
+
+#endif // QT3DS_RUNTIME_VIEW_H
diff --git a/src/engine/Qt3DSTegraInputEngine.cpp b/src/engine/Qt3DSTegraInputEngine.cpp
new file mode 100644
index 0000000..bb9a7f9
--- /dev/null
+++ b/src/engine/Qt3DSTegraInputEngine.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "EnginePrefix.h"
+#include "Qt3DSTegraInputEngine.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * XXX
+ */
+CTegraInputEngine::CTegraInputEngine()
+{
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+CTegraInputEngine::~CTegraInputEngine()
+{
+}
+
+//==============================================================================
+/**
+ * Returns the structure that contains the input information for the current frame.
+ */
+SInputFrame &CTegraInputEngine::GetInputFrame()
+{
+ return m_InputFrame;
+}
+
+//==============================================================================
+/**
+ * Handles the input message.
+ */
+void CTegraInputEngine::HandleMessage(const QEvent *inEvent,
+ ITegraApplicationRenderEngine &inRenderEngine,
+ CPresentation *inPresentation)
+{
+ static bool s_PointerWasDown = false;
+
+ if (NULL == inPresentation)
+ return;
+
+ switch (inEvent->type()) {
+
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ {
+ const QMouseEvent *event = static_cast<const QMouseEvent *>(inEvent);
+
+ QPointF pos = event->localPos();
+ FLOAT x = pos.x();
+ FLOAT y = pos.y();
+
+ const bool pressed = inEvent->type() == QEvent::MouseButtonPress;
+
+ if (inRenderEngine.IsPickValid(x, y, *inPresentation)) {
+ // printf( "INPUT x %ld y %ld\n", (int)x, (int)y );
+ SetPickInput(x, y, (pressed || s_PointerWasDown) ? true : false);
+
+ if (pressed) {
+ if (s_PointerWasDown)
+ SetPickFlags(LMOUSE_DOWN);
+ else
+ SetPickFlags(LMOUSE_PRESSED);
+
+ s_PointerWasDown = true;
+ } else {
+ if (s_PointerWasDown)
+ SetPickFlags(LMOUSE_RELEASED);
+ else
+ SetPickFlags(LMOUSE_UP);
+
+ s_PointerWasDown = false;
+ }
+ } else {
+ if (s_PointerWasDown)
+ SetPickFlags(LMOUSE_RELEASED);
+ else
+ SetPickFlags(LMOUSE_UP);
+
+ s_PointerWasDown = false;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+} // namespace Q3DStudio
diff --git a/src/engine/Qt3DSTegraInputEngine.h b/src/engine/Qt3DSTegraInputEngine.h
new file mode 100644
index 0000000..29f20f2
--- /dev/null
+++ b/src/engine/Qt3DSTegraInputEngine.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_TEGRA_INPUT_ENGINE_H
+#define QT3DS_TEGRA_INPUT_ENGINE_H
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSInputEngine.h"
+#include "Qt3DSRuntimeView.h"
+#include "Qt3DSInputEventTypes.h"
+#include "Qt3DSPresentation.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class CTegraRenderEngine;
+class CPresentation;
+class ITegraApplicationRenderEngine;
+
+//==============================================================================
+/**
+* @class CTegraInputEngine
+* @brief
+*/
+class CTegraInputEngine : public CInputEngine
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CTegraInputEngine();
+ virtual ~CTegraInputEngine();
+
+public: // Access
+ SInputFrame &GetInputFrame() override;
+
+ void HandleMessage(const QEvent *inEvent, ITegraApplicationRenderEngine &inRenderEngine,
+ CPresentation *inPresentation);
+};
+
+} // namespace Q3DStudio
+
+#endif // QT3DS_TEGRA_INPUT_ENGINE_H
diff --git a/src/engine/Qt3DSWindowSystem.h b/src/engine/Qt3DSWindowSystem.h
new file mode 100644
index 0000000..173dd83
--- /dev/null
+++ b/src/engine/Qt3DSWindowSystem.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_WINDOW_SYSTEM_H
+#define QT3DS_WINDOW_SYSTEM_H
+
+#include <QtCore/qsize.h>
+
+namespace Q3DStudio {
+
+struct SEGLInfo;
+
+class IWindowSystem
+{
+protected:
+ virtual ~IWindowSystem() {}
+public:
+ virtual QSize GetWindowDimensions() = 0;
+ virtual void SetWindowDimensions(const QSize &inSize) = 0;
+ // For platforms that support it, we get the egl info for render plugins
+ // Feel free to return NULL.
+ virtual SEGLInfo *GetEGLInfo() = 0;
+ // on some systems we allow our default render target to be a offscreen buffer
+ // otherwise return 0;
+ virtual int GetDefaultRenderTargetID() = 0;
+ // returns the depth buffer bit count for the render window
+ virtual int GetDepthBitCount() = 0;
+};
+}
+
+#endif
diff --git a/src/event/EventFactory.cpp b/src/event/EventFactory.cpp
new file mode 100644
index 0000000..4bf776c
--- /dev/null
+++ b/src/event/EventFactory.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "EventFactory.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/StringTable.h"
+#include "foundation/Utils.h"
+
+using namespace qt3ds::evt;
+
+typedef char TEventChar;
+using qt3ds::QT3DSU32;
+
+class CInitableRegisteredStr : public Qt3DSEventSystemRegisteredStr
+{
+public:
+ CInitableRegisteredStr(const TEventStr inString) { m_Data = inString; }
+};
+
+CFactory &CFactory::Create(qt3ds::NVFoundationBase &inFoundation)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), CFactory)(inFoundation);
+}
+
+CFactory::CFactory(qt3ds::NVFoundationBase &inFoundation)
+ : m_Foundation(inFoundation)
+ , m_Allocator(inFoundation.getAllocator(), "event factory allocator")
+ , m_StringTable(qt3ds::foundation::IStringTable::CreateStringTable(inFoundation.getAllocator()))
+{
+}
+
+CFactory::~CFactory()
+{
+}
+
+Qt3DSEventSystemEvent &CFactory::CreateEvent(int inNumData)
+{
+ // Ensure num data is in range
+ inNumData = qt3ds::NVMax(0, inNumData);
+ // Ensure we can actually allocate something that big
+ QT3DSU32 dataSize = static_cast<QT3DSU32>(
+ qt3ds::NVMin((size_t)inNumData * sizeof(Qt3DSEventSystemEventData),
+ TEventAllocator::getSlabSize() - sizeof(Qt3DSEventSystemEvent)));
+ // get the actual num data after safety checks.
+ inNumData = (int)(dataSize / sizeof(Qt3DSEventSystemEventData));
+
+ QT3DSU32 allocSize = sizeof(Qt3DSEventSystemEvent) + inNumData * sizeof(Qt3DSEventSystemEventData);
+
+ Qt3DSEventSystemEvent *theEvent = (Qt3DSEventSystemEvent *)m_Allocator.allocate(
+ allocSize, "Event allocation", __FILE__, __LINE__);
+ theEvent->m_NumData = inNumData;
+ theEvent->m_Data = reinterpret_cast<Qt3DSEventSystemEventData *>(((qt3ds::QT3DSU8 *)theEvent)
+ + sizeof(Qt3DSEventSystemEvent));
+
+ // Initialize the event data to zero so that a free event won't cause a calamity.
+ qt3ds::intrinsics::memZero(theEvent->m_Data, dataSize);
+
+ return *theEvent;
+}
+
+size_t CFactory::GetMaxNumEventData()
+{
+ return m_Allocator.getSlabSize() - sizeof(Qt3DSEventSystemEvent);
+}
+
+size_t CFactory::GetMaxStrLength()
+{
+ return m_Allocator.getSlabSize();
+}
+
+void CFactory::ReleaseOutstandingEvents()
+{
+ m_Allocator.reset();
+}
+
+Qt3DSEventSystemRegisteredStr CFactory::RegisterStr(TEventStr inSrc)
+{
+ return CInitableRegisteredStr(m_StringTable->RegisterStr(inSrc));
+}
+
+TEventStr CFactory::AllocateStr(TEventStr inSrc)
+{
+ size_t theSizeInByte = sizeof(TEventChar) * (strlen(qt3ds::foundation::nonNull(inSrc)) + 1);
+ theSizeInByte = qt3ds::NVMin(theSizeInByte, TEventAllocator::getSlabSize());
+
+ TEventChar *theNewString = (TEventChar *)m_Allocator.allocate(
+ theSizeInByte, "Qt3DS::evt::CFactory::UnManagedString", __FILE__, __LINE__);
+
+ if (theNewString)
+ memcpy(theNewString, inSrc, theSizeInByte);
+
+ theNewString[theSizeInByte - 1] = 0;
+
+ return theNewString;
+}
+
+TEventStr CFactory::AllocateStr(int inLength)
+{
+ ++inLength;
+ int safeLen = (int)qt3ds::NVMin((size_t)inLength, TEventAllocator::getSlabSize());
+ // Either give the users what they ask for or return nothing.
+ if (safeLen != inLength)
+ return NULL;
+
+ void *retval = m_Allocator.allocate(inLength * sizeof(TEventChar),
+ "Qt3DS::evt::CFactory::UnManagedString", __FILE__, __LINE__);
+ qt3ds::intrinsics::memZero(retval, inLength);
+ return (TEventStr)retval;
+}
+
+void CFactory::Release()
+{
+ this->~CFactory();
+ QT3DS_FREE(m_Foundation.getAllocator(), this);
+}
diff --git a/src/event/EventFactory.h b/src/event/EventFactory.h
new file mode 100644
index 0000000..10fe6b7
--- /dev/null
+++ b/src/event/EventFactory.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EVENT_FACTORY_H
+#define EVENT_FACTORY_H
+
+#include "EventSystem.h"
+#include "EventPollingSystem.h"
+
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/FastAllocator.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+namespace foundation {
+ class IStringTable;
+}
+}
+
+namespace qt3ds {
+namespace evt {
+
+ class CEventProviderRefCounted;
+
+ class CFactory : public IEventFactory
+ {
+ private:
+ explicit CFactory(qt3ds::NVFoundationBase &inFoundation);
+ virtual ~CFactory();
+
+ CFactory &operator=(const CFactory &) { return *this; }
+ public:
+ // Interfaces from IEventFactory
+ Qt3DSEventSystemEvent &CreateEvent(int inNumData) override;
+ size_t GetMaxNumEventData() override;
+ size_t GetMaxStrLength() override;
+
+ Qt3DSEventSystemRegisteredStr RegisterStr(TEventStr inSrc) override;
+ // Null terminates if strlen(inSrc) > getMaxStrLength
+ TEventStr AllocateStr(TEventStr inSrc) override;
+
+ // Returns null if inLength > getMaxStrLength
+ TEventStr AllocateStr(int inLength) override;
+
+ void ReleaseOutstandingEvents();
+ void Release();
+
+ static CFactory &Create(qt3ds::NVFoundationBase &inFoundation);
+
+ private:
+ typedef qt3ds::foundation::SFastAllocator<> TEventAllocator;
+
+ qt3ds::NVFoundationBase &m_Foundation;
+ TEventAllocator m_Allocator;
+ qt3ds::foundation::NVScopedRefCounted<qt3ds::foundation::IStringTable> m_StringTable;
+ };
+}
+}
+
+#endif // EVENT_FACTORY_H
diff --git a/src/event/EventPoller.cpp b/src/event/EventPoller.cpp
new file mode 100644
index 0000000..a811595
--- /dev/null
+++ b/src/event/EventPoller.cpp
@@ -0,0 +1,375 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <EASTL/algorithm.h>
+
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAllocator.h"
+
+#include "EventPoller.h"
+#include "EventFactory.h"
+
+#define MAX_EVENTS 256
+
+using namespace qt3ds::evt;
+using qt3ds::QT3DSU32;
+
+IEventSystem &IEventSystem::Create(qt3ds::NVFoundationBase &inFoundation)
+{
+ return CPoller::Create(inFoundation);
+}
+
+CPoller &CPoller::Create(qt3ds::NVFoundationBase &inFoundation)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), CPoller)(inFoundation);
+}
+
+CPoller::~CPoller()
+{
+ for (QT3DSU32 idx = 0, end = m_Providers.size(); idx < end; ++idx)
+ m_Providers[idx].first->Release();
+ m_Providers.clear();
+ ReleaseEvents();
+ m_EventFactory.Release();
+}
+
+void CPoller::ReleaseEvents()
+{
+ m_EventFactory.ReleaseOutstandingEvents();
+
+ m_EventList.clear();
+ m_EventIndex = 0;
+}
+
+static void AddProviderFn(void *inPoller, Qt3DSEventSystemEventProvider inProvider)
+{
+ CPoller *thePoller = reinterpret_cast<CPoller *>(inPoller);
+ thePoller->AddProvider(*thePoller->GetOrCreateEventProviderWrapper(inProvider));
+}
+
+static void RemoveProviderFn(void *inPoller, Qt3DSEventSystemEventProvider inProvider)
+{
+ CPoller *thePoller = reinterpret_cast<CPoller *>(inPoller);
+ CPoller::TProvider theProvider = thePoller->GetEventProviderWrapper(inProvider);
+ if (theProvider)
+ thePoller->RemoveProvider(*theProvider);
+ thePoller->ReleaseEventProviderWrapper(inProvider);
+}
+
+static int IgnoreProviderFn(void *inPoller, Qt3DSEventSystemEventProvider inProvider)
+{
+ CPoller *thePoller = reinterpret_cast<CPoller *>(inPoller);
+ CPoller::TProvider theProvider = thePoller->GetEventProviderWrapper(inProvider);
+ if (theProvider)
+ return thePoller->IgnoreProvider(*theProvider);
+ return 0;
+}
+
+static int ActivateProviderFn(void *inPoller, Qt3DSEventSystemEventProvider inProvider)
+{
+ CPoller *thePoller = reinterpret_cast<CPoller *>(inPoller);
+ CPoller::TProvider theProvider = thePoller->GetEventProviderWrapper(inProvider);
+ if (theProvider)
+ return thePoller->ActivateProvider(*theProvider);
+ return 0;
+}
+
+CPoller::CPoller(qt3ds::NVFoundationBase &inFoundation)
+ : mRefCount(0)
+ , m_Foundation(inFoundation)
+ , m_EventFactory(CFactory::Create(inFoundation))
+ , m_Providers(inFoundation.getAllocator(), "CPoller::m_Providers")
+ , m_EventList(inFoundation.getAllocator(), "CPoller::m_EventList")
+ , m_EventIndex(0)
+ , m_EventFetched(false)
+{
+ m_CInterface.m_Poller = this;
+ m_CInterface.addProvider = AddProviderFn;
+ m_CInterface.removeProvider = RemoveProviderFn;
+ m_CInterface.ignoreProvider = IgnoreProviderFn;
+ m_CInterface.activateProvider = ActivateProviderFn;
+}
+
+struct SProviderSearch
+{
+ IEventProvider *m_Provider;
+ SProviderSearch(IEventProvider &inProvider)
+ : m_Provider(&inProvider)
+ {
+ }
+ bool operator()(const eastl::pair<CPoller::TProvider, bool> &item)
+ {
+ return item.first == m_Provider;
+ }
+};
+
+void CPoller::AddProvider(IEventProvider &inProvider)
+{
+ TProviderList::iterator iter =
+ eastl::find_if(m_Providers.begin(), m_Providers.end(), SProviderSearch(inProvider));
+ if (iter == m_Providers.end())
+ m_Providers.push_back(eastl::make_pair(&inProvider, true));
+}
+
+void CPoller::RemoveProvider(IEventProvider &inProvider)
+{
+ TProviderList::iterator thePos =
+ eastl::find_if(m_Providers.begin(), m_Providers.end(), SProviderSearch(inProvider));
+ if (thePos != m_Providers.end())
+ m_Providers.erase(thePos);
+}
+
+bool CPoller::IgnoreProvider(IEventProvider &inProvider)
+{
+ TProviderList::iterator thePos =
+ eastl::find_if(m_Providers.begin(), m_Providers.end(), SProviderSearch(inProvider));
+ if (thePos != m_Providers.end()) {
+ thePos->second = false;
+ return true;
+ }
+ return false;
+}
+
+bool CPoller::ActivateProvider(IEventProvider &inProvider)
+{
+ TProviderList::iterator thePos =
+ eastl::find_if(m_Providers.begin(), m_Providers.end(), SProviderSearch(inProvider));
+ if (thePos != m_Providers.end()) {
+ thePos->second = true;
+ return true;
+ }
+ return false;
+}
+
+Qt3DSEventSystemEvent *CPoller::GetNextEvent(bool inAllowResetBuffer)
+{
+ if (m_EventIndex < m_EventList.size()) {
+ Qt3DSEventSystemEvent *retval = m_EventList[m_EventIndex];
+ ++m_EventIndex;
+ return retval;
+ }
+ if (inAllowResetBuffer) {
+ ReleaseEvents();
+ }
+ size_t theNewEventCount = 0;
+ for (QT3DSU32 idx = 0, end = m_Providers.size(); idx < end; ++idx) {
+ if (m_Providers[idx].second) {
+ Qt3DSEventSystemEvent *evtBuffer[MAX_EVENTS];
+ for (QT3DSU32 numEvents = (QT3DSU32)(m_Providers[idx].first)
+ ->GetNextEvents(m_EventFactory, evtBuffer, MAX_EVENTS);
+ numEvents;
+ numEvents = (QT3DSU32)(m_Providers[idx].first)
+ ->GetNextEvents(m_EventFactory, evtBuffer, MAX_EVENTS)) {
+ m_EventList.insert(m_EventList.end(), evtBuffer, evtBuffer + numEvents);
+ ++theNewEventCount;
+ }
+ }
+ }
+ if (theNewEventCount)
+ return GetNextEvent(inAllowResetBuffer);
+
+ return NULL;
+}
+
+size_t CPoller::GetNextEvents(Qt3DSEventSystemEvent **outBuffer, size_t bufLen)
+{
+ m_EventFetched = true;
+ size_t bufIdx = 0;
+ bool theAllowResetBuffer = true;
+ for (; bufIdx < bufLen; ++bufIdx) {
+ Qt3DSEventSystemEvent *evt = GetNextEvent(theAllowResetBuffer);
+ if (!evt)
+ break;
+ theAllowResetBuffer = false;
+ outBuffer[bufIdx] = evt;
+ }
+ return bufIdx;
+}
+
+IEventFactory &CPoller::GetEventFactory()
+{
+ return m_EventFactory;
+}
+
+Qt3DSEventSystemEventPoller *CPoller::GetCInterface()
+{
+ return &m_CInterface;
+}
+
+bool CPoller::GetAndClearEventFetchedFlag()
+{
+ bool theOld = m_EventFetched;
+ m_EventFetched = false;
+ return theOld;
+}
+
+void CPoller::PurgeEvents()
+{
+ // Get events from providers and drop,
+ // so the providers need not to provide an additional interface for clear events
+ static const size_t EVENTS_NUM_ONCE_CLEAR = 512;
+ Qt3DSEventSystemEvent *theEvents[EVENTS_NUM_ONCE_CLEAR];
+ GetNextEvents(theEvents, EVENTS_NUM_ONCE_CLEAR);
+ ReleaseEvents();
+}
+
+void CPoller::addRef()
+{
+ qt3ds::foundation::atomicIncrement(&mRefCount);
+}
+
+void CPoller::release()
+{
+ qt3ds::QT3DSI32 value = qt3ds::foundation::atomicDecrement(&mRefCount);
+ if (value <= 0) {
+ qt3ds::NVAllocatorCallback &alloc(m_Foundation.getAllocator());
+ this->~CPoller();
+ QT3DS_FREE(alloc, this);
+ }
+}
+
+struct SProviderFinder
+{
+ void *m_Key;
+ SProviderFinder(void *k)
+ : m_Key(k)
+ {
+ }
+ bool operator()(const CPoller::TCEventProviderPair &inPair)
+ {
+ if (inPair.first == m_Key)
+ return true;
+ return false;
+ }
+};
+
+static Qt3DSEventSystemEvent *CreateEventFn(void *inFactory, int numData)
+{
+ IEventFactory *theFactory = reinterpret_cast<IEventFactory *>(inFactory);
+ return &theFactory->CreateEvent(numData);
+}
+
+static size_t MaxNumEventDataFn(void *inFactory)
+{
+ IEventFactory *theFactory = reinterpret_cast<IEventFactory *>(inFactory);
+ return theFactory->GetMaxNumEventData();
+}
+
+static size_t MaxStrLenFn(void *inFactory)
+{
+ IEventFactory *theFactory = reinterpret_cast<IEventFactory *>(inFactory);
+ return theFactory->GetMaxStrLength();
+}
+
+static Qt3DSEventSystemRegisteredStr RegisterStrFn(void *inFactory, Qt3DSEventSystemStr inStr)
+{
+ IEventFactory *theFactory = reinterpret_cast<IEventFactory *>(inFactory);
+ return theFactory->RegisterStr(inStr);
+}
+
+static Qt3DSEventSystemStr AllocateStrFn(void *inFactory, Qt3DSEventSystemStr inStr)
+{
+ IEventFactory *theFactory = reinterpret_cast<IEventFactory *>(inFactory);
+ return theFactory->AllocateStr(inStr);
+}
+
+static Qt3DSEventSystemStr AllocateStrLenFn(void *inFactory, int len)
+{
+ IEventFactory *theFactory = reinterpret_cast<IEventFactory *>(inFactory);
+ return theFactory->AllocateStr(len);
+}
+
+struct SWrappedProvider : public IEventProvider
+{
+ Qt3DSEventSystemEventProvider m_Provider;
+ SWrappedProvider(Qt3DSEventSystemEventProvider prov)
+ : m_Provider(prov)
+ {
+ }
+
+ size_t GetNextEvents(IEventFactory &inFactory, Qt3DSEventSystemEvent **outBuffer,
+ size_t bufLen) override
+ {
+ if (m_Provider.m_Provider) {
+ Qt3DSEventSystemEventFactory theFactory;
+ theFactory.m_Factory = &inFactory;
+ theFactory.createEvent = CreateEventFn;
+ theFactory.getMaxNumEventData = MaxNumEventDataFn;
+ theFactory.getMaxStrLength = MaxStrLenFn;
+ theFactory.registerStr = RegisterStrFn;
+ theFactory.allocateStr = AllocateStrFn;
+ theFactory.allocateStrLen = AllocateStrLenFn;
+ return m_Provider.getNextEvents(m_Provider.m_Provider, theFactory, outBuffer, bufLen);
+ }
+ return 0;
+ }
+
+ void Release() override
+ {
+ if (m_Provider.m_Provider)
+ m_Provider.release(m_Provider.m_Provider);
+ delete this;
+ }
+};
+
+CPoller::TProvider CPoller::GetEventProviderWrapper(Qt3DSEventSystemEventProvider inProvider)
+{
+ TCEventProviderList::iterator iter = eastl::find_if(
+ m_CEventProviders.begin(), m_CEventProviders.end(), SProviderFinder(inProvider.m_Provider));
+ if (iter != m_CEventProviders.end())
+ return iter->second;
+ return TProvider();
+}
+
+CPoller::TProvider CPoller::GetOrCreateEventProviderWrapper(Qt3DSEventSystemEventProvider inProvider)
+{
+ TCEventProviderList::iterator iter = eastl::find_if(
+ m_CEventProviders.begin(), m_CEventProviders.end(), SProviderFinder(inProvider.m_Provider));
+ if (iter == m_CEventProviders.end()) {
+ TProvider retval = new SWrappedProvider(inProvider);
+ m_CEventProviders.push_back(eastl::make_pair(inProvider.m_Provider, retval));
+ return retval;
+ }
+ return iter->second;
+}
+
+void CPoller::ReleaseEventProviderWrapper(Qt3DSEventSystemEventProvider inProvider)
+{
+ TCEventProviderList::iterator iter = eastl::find_if(
+ m_CEventProviders.begin(), m_CEventProviders.end(), SProviderFinder(inProvider.m_Provider));
+ if (iter != m_CEventProviders.end()) {
+ SWrappedProvider &wrappedProvider = static_cast<SWrappedProvider &>(*iter->second);
+ wrappedProvider.m_Provider.m_Provider = NULL;
+ m_CEventProviders.erase(
+ iter); // deletes the wrapper but does not release the wrapped provider.
+ }
+}
diff --git a/src/event/EventPoller.h b/src/event/EventPoller.h
new file mode 100644
index 0000000..99ac27d
--- /dev/null
+++ b/src/event/EventPoller.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EVENT_POLLER_H
+#define EVENT_POLLER_H
+
+#include <EASTL/vector.h>
+
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSContainers.h"
+
+#include "EventSystem.h"
+#include "EventPollingSystem.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace evt {
+
+ class CFactory;
+
+ class CPoller : public IEventSystem
+ {
+ public:
+ typedef IEventProvider *TProvider;
+ typedef qt3ds::foundation::nvvector<eastl::pair<TProvider, bool>> TProviderList;
+ typedef qt3ds::foundation::nvvector<Qt3DSEventSystemEvent *> TEventList;
+ typedef eastl::pair<void *, TProvider> TCEventProviderPair;
+ typedef eastl::vector<TCEventProviderPair> TCEventProviderList;
+
+ private:
+ explicit CPoller(qt3ds::NVFoundationBase &inFoundation);
+ virtual ~CPoller();
+
+ public:
+ // Providers once added are released if the poller goes out of scope.
+ void AddProvider(IEventProvider &inProvider) override;
+ void RemoveProvider(IEventProvider &inProvider) override;
+ bool IgnoreProvider(IEventProvider &inProvider) override;
+ bool ActivateProvider(IEventProvider &inProvider) override;
+ size_t GetNextEvents(Qt3DSEventSystemEvent **outBuffer, size_t bufLen) override;
+ IEventFactory &GetEventFactory() override;
+ Qt3DSEventSystemEventPoller *GetCInterface() override;
+ bool GetAndClearEventFetchedFlag() override;
+ void PurgeEvents() override;
+
+ void ReleaseEvents();
+
+ void addRef() override;
+ void release() override;
+
+ TProvider GetEventProviderWrapper(Qt3DSEventSystemEventProvider inProvider);
+ TProvider GetOrCreateEventProviderWrapper(Qt3DSEventSystemEventProvider inProvider);
+ void ReleaseEventProviderWrapper(Qt3DSEventSystemEventProvider inProvider);
+
+ static CPoller &Create(qt3ds::NVFoundationBase &inFoundation);
+
+ private:
+ Qt3DSEventSystemEvent *GetNextEvent(bool inAllowResetBuffer /* = true*/);
+
+ qt3ds::QT3DSI32 mRefCount;
+ qt3ds::NVFoundationBase &m_Foundation;
+ CFactory &m_EventFactory;
+ TProviderList m_Providers;
+ TEventList m_EventList;
+ qt3ds::QT3DSU32 m_EventIndex;
+ Qt3DSEventSystemEventPoller m_CInterface;
+ TCEventProviderList m_CEventProviders;
+ bool m_EventFetched;
+ };
+}
+}
+
+#endif // EVENT_POLLER_H
diff --git a/src/event/EventPollingSystem.h b/src/event/EventPollingSystem.h
new file mode 100644
index 0000000..4d41406
--- /dev/null
+++ b/src/event/EventPollingSystem.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef EVENT_SYSTEM_H
+#define EVENT_SYSTEM_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "EventSystem.h"
+
+namespace qt3ds {
+namespace evt {
+
+ class CEventProviderRefCounted;
+
+ class IEventSystem : public qt3ds::foundation::NVRefCounted
+ {
+ protected:
+ virtual ~IEventSystem() {}
+ public:
+ // Providers once added are released if the poller goes out of scope.
+ // Adding the same provider twice has no effect.
+ virtual void AddProvider(IEventProvider &inProvider) = 0;
+
+ // removeProvider does not release the provider; callers are expected to release the
+ // provider themselves after calling remove provider. Calling remove provider
+ // with a provider that isn't in the system has no effect.
+ virtual void RemoveProvider(IEventProvider &inProvider) = 0;
+
+ // Ignore events from this provider. Returns true if provider is added.
+ virtual bool IgnoreProvider(IEventProvider &inProvider) = 0;
+
+ // Listen on this provider. Returns true if provider is added.
+ virtual bool ActivateProvider(IEventProvider &inProvider) = 0;
+
+ // Get a set of events from the poller. The poller will simply run through and ask each
+ // provider
+ // for events and then begin returning the set of events.
+ // Note: this interface needs to set the event fetched flag.
+ virtual size_t GetNextEvents(Qt3DSEventSystemEvent **outBuffer, size_t bufLen) = 0;
+
+ // Get the event factory used for this poller.
+ virtual IEventFactory &GetEventFactory() = 0;
+
+ virtual Qt3DSEventSystemEventPoller *GetCInterface() = 0;
+
+ // Get and clear the flag indicates whether GetNextEvents has been called after last call of
+ // this interface
+ // Note: the event fetched flag is set by GetNextEvents
+ virtual bool GetAndClearEventFetchedFlag() = 0;
+
+ // Clear events in event system and events in all providers
+ virtual void PurgeEvents() = 0;
+
+ static IEventSystem &Create(qt3ds::NVFoundationBase &inFoundation);
+ };
+}
+}
+
+#endif // EVENT_SYSTEM_H
diff --git a/src/event/EventSystem.h b/src/event/EventSystem.h
new file mode 100644
index 0000000..a9e3dbc
--- /dev/null
+++ b/src/event/EventSystem.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MESSAGE_SYSTEM_H
+#define MESSAGE_SYSTEM_H
+#include <cstdlib>
+#include "EventSystemC.h"
+
+namespace qt3ds {
+namespace evt {
+
+ typedef Qt3DSEventSystemStr TEventStr;
+
+ // Factory from the provider's perspective.
+ class IEventFactory
+ {
+ protected:
+ virtual ~IEventFactory() {}
+ public:
+ virtual Qt3DSEventSystemEvent &CreateEvent(int numData) = 0;
+ // Guaranteed to be at least 4K - sizeof(Qt3DSEventSystemEvent)
+ virtual size_t GetMaxNumEventData() = 0;
+ // Guaranteed to be at least 4K
+ virtual size_t GetMaxStrLength() = 0;
+
+ virtual Qt3DSEventSystemRegisteredStr RegisterStr(TEventStr inSrc) = 0;
+ // Null terminates if strlen(inSrc) > getMaxStrLength
+ virtual TEventStr AllocateStr(TEventStr inSrc) = 0;
+ // Returns null if inLength > getMaxStrLength
+ virtual TEventStr AllocateStr(int inLength) = 0;
+ };
+
+ class IEventProvider
+ {
+ protected:
+ virtual ~IEventProvider() {}
+ public:
+ // Return the next N events, placed into the event buffer.
+ virtual size_t GetNextEvents(IEventFactory &inFactory, Qt3DSEventSystemEvent **outBuffer,
+ size_t bufLen) = 0;
+ virtual void Release() = 0;
+ };
+}
+}
+
+#endif
diff --git a/src/event/EventSystemC.cpp b/src/event/EventSystemC.cpp
new file mode 100644
index 0000000..8bfdb81
--- /dev/null
+++ b/src/event/EventSystemC.cpp
@@ -0,0 +1,34 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "EventSystemC.h"
+
+const char *PROVIDER_TABLE_ENTRY = "__provider_impl";
+const char *POLLER_TABLE_ENTRY = "__poller_impl"; \ No newline at end of file
diff --git a/src/event/EventSystemC.h b/src/event/EventSystemC.h
new file mode 100644
index 0000000..2517eae
--- /dev/null
+++ b/src/event/EventSystemC.h
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_EVENT_SYSTEM_C_H
+#define QT3DS_EVENT_SYSTEM_C_H
+#include <stddef.h> //size_t
+
+// Interface we expect plugins to use in order to interace with the event system.
+// This interface is design to avoid using c++ vtables and the C++ abi isn't stable
+// across compilers.
+
+#ifdef _cplusplus
+extern "C" {
+#endif
+
+// Obnoxious long names to void namespace conflicts
+enum QT3DSEventSystemEventTypes {
+ QT3DSEventSystemEventTypesNoData = 0,
+ QT3DSEventSystemEventTypesString = 1,
+ QT3DSEventSystemEventTypesNumber = 2,
+};
+
+typedef const char *Qt3DSEventSystemStr;
+
+typedef struct _Qt3DSEventSystemEventValue
+{
+ QT3DSEventSystemEventTypes m_Type;
+ double m_Number;
+ Qt3DSEventSystemStr m_String;
+} Qt3DSEventSystemEventValue;
+
+typedef struct _Qt3DSEventSystemRegisteredStr
+{
+ Qt3DSEventSystemStr m_Data;
+} Qt3DSEventSystemRegisteredStr;
+
+typedef struct _Qt3DSEventSystemEventData
+{
+ Qt3DSEventSystemRegisteredStr m_Name;
+ Qt3DSEventSystemEventValue m_Value;
+} Qt3DSEventSystemEventData;
+
+typedef struct _Qt3DSEventSystemEvent
+{
+ Qt3DSEventSystemEventData *m_Data; // contiguous block of event data.
+ int m_NumData;
+} Qt3DSEventSystemEvent;
+
+typedef Qt3DSEventSystemEvent *(*Qt3DSEventSystemEventFactoryCreateEventFn)(void *inFactory,
+ int numData);
+typedef size_t (*Qt3DSEventSystemEventFactoryMaxNumEventDataFn)(void *inFactory);
+typedef size_t (*Qt3DSEventSystemEventFactoryMaxStrLenFn)(void *inFactory);
+typedef Qt3DSEventSystemRegisteredStr (*Qt3DSEventSystemEventFactoryRegisterStrFn)(
+ void *inFactory, Qt3DSEventSystemStr inStr);
+typedef Qt3DSEventSystemStr (*Qt3DSEventSystemEventFactoryAllocateStrFn)(void *inFactory,
+ Qt3DSEventSystemStr inStr);
+typedef Qt3DSEventSystemStr (*Qt3DSEventSystemEventFactoryAllocateStrLenFn)(void *inFactory, int len);
+
+// Factory from the provider's perspective.
+typedef struct _Qt3DSEventSystemEventFactory
+{
+ void *m_Factory;
+ Qt3DSEventSystemEventFactoryCreateEventFn createEvent;
+ Qt3DSEventSystemEventFactoryMaxNumEventDataFn getMaxNumEventData;
+ Qt3DSEventSystemEventFactoryMaxStrLenFn getMaxStrLength;
+ Qt3DSEventSystemEventFactoryRegisterStrFn registerStr;
+ Qt3DSEventSystemEventFactoryAllocateStrFn allocateStr;
+ Qt3DSEventSystemEventFactoryAllocateStrLenFn allocateStrLen;
+
+} Qt3DSEventSystemEventFactory;
+
+typedef size_t (*Qt3DSEventSystemProviderGetNextEventsFn)(void *inProvider,
+ Qt3DSEventSystemEventFactory inFactory,
+ Qt3DSEventSystemEvent **outBuffer,
+ size_t outBufLen);
+typedef void (*Qt3DSEventSystemProviderReleaseFn)(void *inProvider);
+
+typedef struct _Qt3DSEventSystemEventProvider
+{
+ void *m_Provider;
+ Qt3DSEventSystemProviderGetNextEventsFn getNextEvents;
+ Qt3DSEventSystemProviderReleaseFn release;
+} Qt3DSEventSystemEventProvider;
+
+typedef void (*Qt3DSEventSystemPollerAddProviderFn)(void *inPoller,
+ Qt3DSEventSystemEventProvider inProvider);
+typedef void (*Qt3DSEventSystemPollerRemoveProviderFn)(void *inPoller,
+ Qt3DSEventSystemEventProvider inProvider);
+typedef int (*Qt3DSEventSystemPollerignoreProviderFn)(void *inPoller,
+ Qt3DSEventSystemEventProvider inProvider);
+typedef int (*Qt3DSEventSystemPolleractivateProviderFn)(void *inPoller,
+ Qt3DSEventSystemEventProvider inProvider);
+
+typedef struct _Qt3DSEventSystemEventPoller
+{
+ void *m_Poller;
+ // Providers, once added, will be released by the event poller unless removed
+ Qt3DSEventSystemPollerAddProviderFn addProvider;
+ // Callers are responsible for releasing removed providers.
+ Qt3DSEventSystemPollerRemoveProviderFn removeProvider;
+ Qt3DSEventSystemPollerignoreProviderFn ignoreProvider;
+ Qt3DSEventSystemPolleractivateProviderFn activateProvider;
+
+} Qt3DSEventSystemEventPoller;
+
+extern const char *PROVIDER_TABLE_ENTRY;
+extern const char *POLLER_TABLE_ENTRY;
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif \ No newline at end of file
diff --git a/src/event/test/CanProviderDemo.cpp b/src/event/test/CanProviderDemo.cpp
new file mode 100644
index 0000000..dc51e9d
--- /dev/null
+++ b/src/event/test/CanProviderDemo.cpp
@@ -0,0 +1,259 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <time.h>
+#include <math.h>
+
+#include "CanProviderDemo.h"
+
+CCanProviderDemo::CCanProviderDemo()
+ : m_Frame(0)
+ , m_LastClock(0)
+{
+}
+
+CCanProviderDemo::~CCanProviderDemo()
+{
+}
+
+unsigned short g_VehicleSpeedData[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16,
+ 18, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136,
+ 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 264,
+ 272, 280, 288, 296, 304, 312, 320, 328, 336, 344, 352, 360, 368, 376, 384, 392,
+ 400, 408, 416, 424, 432, 440, 448, 456, 462, 468, 474, 480, 486, 492, 498, 504,
+ 510, 516, 522, 528, 534, 540, 546, 552, 558, 564, 570, 576, 582, 588, 594, 600,
+ 606, 612, 618, 624, 630, 636, 642, 648, 654, 660, 666, 672, 678, 684, 690, 696,
+ 702, 708, 714, 720, 726, 732, 738, 744, 750, 756, 762, 768, 774, 780, 786, 792,
+ 798, 804, 810, 816, 820, 824, 828, 832, 836, 840, 844, 848, 852, 856, 860, 864,
+ 868, 872, 876, 880, 884, 888, 892, 896, 900, 904, 908, 912, 916, 920, 924, 928,
+ 932, 936, 940, 944, 948, 952, 956, 960, 964, 968, 972, 976, 980, 984, 988, 992,
+ 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056,
+ 1054, 1052, 1050, 1048, 1046, 1044, 1042, 1040, 1038, 1036, 1034, 1032, 1030, 1028, 1026, 1024,
+ 1022, 1020, 1018, 1016, 1014, 1012, 1010, 1008, 1006, 1004, 1002, 1000, 998, 996, 994, 992,
+ 990, 988, 986, 984, 982, 980, 978, 976, 974, 972, 970, 968, 966, 964, 962, 960,
+ 958, 956, 954, 952, 950, 948, 946, 944, 942, 940, 938, 936, 934, 932, 930, 928,
+ 926, 924, 922, 920, 918, 916, 914, 912, 910, 908, 906, 904, 902, 900, 898, 896,
+ 894, 892, 890, 888, 886, 884, 882, 880, 878, 876, 874, 872, 870, 868, 866, 864,
+ 862, 860, 858, 856, 854, 852, 850, 848, 846, 844, 842, 840, 838, 836, 834, 832,
+ 830, 828, 826, 824, 822, 820, 818, 816, 823, 830, 837, 844, 851, 858, 865, 872,
+ 879, 886, 893, 900, 907, 914, 921, 928, 935, 942, 949, 956, 963, 970, 977, 984,
+ 991, 998, 1005, 1012, 1019, 1026, 1033, 1040, 1047, 1054, 1061, 1068, 1075, 1082, 1089, 1096,
+ 1103, 1110, 1117, 1124, 1131, 1138, 1145, 1152, 1159, 1166, 1173, 1180, 1187, 1194, 1201, 1208,
+ 1215, 1222, 1229, 1236, 1246, 1256, 1266, 1276, 1286, 1296, 1306, 1316, 1326, 1336, 1346, 1356,
+ 1366, 1376, 1386, 1396, 1406, 1416, 1426, 1436, 1446, 1456, 1466, 1476, 1486, 1496, 1506, 1516,
+ 1526, 1536, 1546, 1556, 1566, 1576, 1586, 1596, 1606, 1616, 1626, 1636, 1646, 1656, 1666, 1676,
+ 1686, 1696, 1706, 1716, 1726, 1736, 1746, 1756, 1766, 1776, 1786, 1796, 1806, 1816, 1826, 1836,
+ 1836, 1836, 1836, 1834, 1832, 1830, 1828, 1826, 1824, 1822, 1820, 1818, 1816, 1814, 1812, 1810,
+ 1808, 1806, 1804, 1802, 1800, 1798, 1796, 1794, 1792, 1790, 1788, 1786, 1784, 1782, 1780, 1778,
+ 1776, 1774, 1772, 1770, 1768, 1766, 1764, 1762, 1760, 1758, 1756, 1754, 1752, 1750, 1748, 1746,
+ 1744, 1742, 1740, 1738, 1736, 1734, 1732, 1730, 1728, 1726, 1724, 1722, 1723, 1724, 1725, 1726,
+ 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1753, 1756, 1759, 1762,
+ 1765, 1768, 1771, 1774, 1777, 1780, 1783, 1786, 1789, 1792, 1795, 1798, 1801, 1804, 1807, 1810,
+ 1813, 1816, 1819, 1822, 1825, 1828, 1831, 1834, 1837, 1840, 1843, 1846, 1849, 1852, 1855, 1858,
+ 1861, 1864, 1867, 1870, 1873, 1876, 1879, 1882, 1885, 1888, 1891, 1894, 1897, 1900, 1903, 1906,
+ 1909, 1912, 1915, 1918, 1921, 1924, 1927, 1930, 1933, 1936, 1939, 1942, 1945, 1948, 1951, 1954,
+ 1957, 1960, 1963, 1966, 1969, 1972, 1975, 1978, 1981, 1984, 1987, 1990, 1993, 1996, 1999, 2002,
+ 2005, 2008, 2011, 2014, 2017, 2020, 2023, 2026, 2029, 2032, 2035, 2038, 2041, 2044, 2047, 2050,
+ 2053, 2056, 2059, 2062, 2064, 2066, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 2084, 2086,
+ 2088, 2090, 2092, 2094, 2096, 2098, 2100, 2102, 2104, 2106, 2108, 2110, 2112, 2114, 2116, 2118,
+ 2120, 2122, 2124, 2126, 2128, 2130, 2132, 2134, 2136, 2138, 2140, 2142, 2144, 2146, 2148, 2150,
+ 2152, 2154, 2156, 2158, 2160, 2162, 2164, 2166, 2168, 2170, 2172, 2174, 2176, 2178, 2180, 2182,
+ 2184, 2186, 2188, 2190, 2192, 2194, 2196, 2198, 2200, 2202, 2204, 2206, 2208, 2210, 2212, 2214,
+ 2216, 2218, 2220, 2222, 2224, 2226, 2228, 2230, 2232, 2234, 2236, 2238, 2240, 2242, 2244, 2246,
+ 2248, 2250, 2252, 2254, 2256, 2258, 2260, 2262, 2264, 2266, 2268, 2270, 2272, 2274, 2276, 2278,
+ 2280, 2282, 2284, 2286, 2288, 2290, 2292, 2294, 2296, 2298, 2300, 2302, 2301, 2300, 2299, 2298,
+ 2297, 2296, 2295, 2294, 2293, 2292, 2291, 2290, 2289, 2288, 2287, 2286, 2285, 2284, 2283, 2282,
+ 2281, 2280, 2279, 2278, 2277, 2276, 2275, 2274, 2273, 2272, 2271, 2270, 2269, 2268, 2267, 2266,
+ 2265, 2264, 2263, 2262, 2261, 2260, 2259, 2258, 2257, 2256, 2255, 2254, 2253, 2252, 2251, 2250,
+ 2249, 2248, 2247, 2246, 2245, 2244, 2243, 2242, 2239, 2236, 2233, 2230, 2227, 2224, 2221, 2218,
+ 2215, 2212, 2209, 2206, 2203, 2200, 2197, 2194, 2191, 2188, 2185, 2182, 2179, 2176, 2173, 2170,
+ 2167, 2164, 2161, 2158, 2155, 2152, 2149, 2146, 2143, 2140, 2137, 2134, 2131, 2128, 2125, 2122,
+ 2119, 2116, 2113, 2110, 2107, 2104, 2101, 2098, 2095, 2092, 2089, 2086, 2083, 2080, 2077, 2074,
+ 2071, 2068, 2065, 2062, 2058, 2054, 2050, 2046, 2042, 2038, 2034, 2030, 2026, 2022, 2018, 2014,
+ 2010, 2006, 2001, 1996, 1991, 1986, 1981, 1976, 1971, 1966, 1961, 1956, 1951, 1946, 1941, 1936,
+ 1931, 1926, 1921, 1916, 1911, 1906, 1901, 1896, 1891, 1886, 1881, 1876, 1871, 1866, 1861, 1856,
+ 1851, 1846, 1841, 1836, 1831, 1826, 1821, 1816, 1811, 1806, 1801, 1796, 1791, 1786, 1781, 1776,
+ 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776,
+ 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776,
+ 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776,
+ 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1779, 1782, 1785, 1788,
+ 1791, 1794, 1797, 1800, 1803, 1806, 1809, 1812, 1815, 1818, 1821, 1824, 1827, 1830, 1833, 1836,
+ 1839, 1842, 1845, 1848, 1851, 1854, 1857, 1860, 1863, 1866, 1869, 1872, 1875, 1878, 1881, 1884,
+ 1887, 1890, 1893, 1896, 1899, 1902, 1905, 1908, 1911, 1914, 1917, 1920, 1923, 1926, 1929, 1932,
+ 1935, 1938, 1941, 1944, 1947, 1950, 1953, 1956, 1958, 1960, 1962, 1964, 1966, 1968, 1970, 1972,
+ 1974, 1976, 1978, 1980, 1982, 1984, 1986, 1988, 1990, 1992, 1994, 1996, 1998, 2000, 2002, 2004,
+ 2006, 2008, 2010, 2012, 2014, 2016, 2018, 2020, 2022, 2024, 2026, 2028, 2030, 2032, 2034, 2036,
+ 2038, 2040, 2042, 2044, 2046, 2048, 2050, 2052, 2054, 2056, 2058, 2060, 2062, 2064, 2066, 2068,
+ 2070, 2072, 2074, 2076, 2078, 2080, 2082, 2084, 2086, 2088, 2090, 2092, 2094, 2096, 2098, 2100,
+ 2102, 2104, 2106, 2108, 2110, 2112, 2114, 2116, 2118, 2120, 2122, 2124, 2126, 2128, 2130, 2132,
+ 2134, 2136, 2138, 2140, 2142, 2144, 2146, 2148, 2150, 2152, 2154, 2156, 2158, 2160, 2162, 2164,
+ 2166, 2168, 2170, 2172, 2174, 2176, 2178, 2180, 2182, 2184, 2186, 2188, 2190, 2192, 2194, 2196,
+ 2198, 2200, 2202, 2204, 2206, 2208, 2210, 2212, 2214, 2216, 2218, 2220, 2222, 2224, 2226, 2228,
+ 2230, 2232, 2234, 2236, 2238, 2240, 2242, 2244, 2246, 2248, 2250, 2252, 2254, 2256, 2258, 2260,
+ 2262, 2264, 2266, 2268, 2270, 2272, 2274, 2276, 2278, 2280, 2282, 2284, 2286, 2288, 2290, 2292,
+ 2294, 2296, 2298, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312,
+ 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328,
+ 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344,
+ 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360,
+ 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2366, 2364, 2362, 2360, 2358, 2356, 2354, 2352,
+ 2350, 2348, 2346, 2344, 2342, 2340, 2338, 2336, 2334, 2332, 2330, 2328, 2326, 2324, 2322, 2320,
+ 2318, 2316, 2314, 2312, 2310, 2308, 2306, 2304, 2302, 2300, 2298, 2296, 2294, 2292, 2290, 2288,
+ 2286, 2284, 2282, 2280, 2278, 2276, 2274, 2272, 2270, 2268, 2266, 2264, 2262, 2260, 2258, 2256,
+ 2254, 2252, 2250, 2248, 2240, 2230, 2220, 2210, 2200, 2190, 2180, 2170, 2160, 2150, 2140, 2130,
+ 2120, 2110, 2100, 2090, 2080, 2070, 2060, 2050, 2040, 2030, 2020, 2010, 2000, 1990, 1980, 1970,
+ 1960, 1950, 1940, 1930, 1920, 1910, 1900, 1890, 1880, 1870, 1860, 1850, 1840, 1830, 1820, 1810,
+ 1800, 1790, 1780, 1770, 1760, 1750, 1740, 1730, 1720, 1710, 1700, 1690, 1680, 1670, 1660, 1650,
+ 1645, 1640, 1635, 1630, 1625, 1620, 1615, 1610, 1605, 1600, 1595, 1590, 1585, 1580, 1575, 1570,
+ 1565, 1560, 1555, 1550, 1545, 1540, 1535, 1530, 1525, 1520, 1515, 1510, 1505, 1500, 1495, 1490,
+ 1485, 1480, 1475, 1470, 1465, 1460, 1455, 1450, 1445, 1440, 1435, 1430, 1425, 1420, 1415, 1410,
+ 1405, 1400, 1395, 1390, 1385, 1380, 1375, 1370, 1365, 1360, 1355, 1350, 1345, 1340, 1335, 1330,
+ 1325, 1320, 1315, 1310, 1305, 1300, 1295, 1290, 1285, 1280, 1275, 1270, 1265, 1260, 1255, 1250,
+ 1245, 1240, 1235, 1230, 1225, 1220, 1215, 1210, 1205, 1200, 1195, 1190, 1185, 1180, 1175, 1170,
+ 1165, 1160, 1155, 1150, 1145, 1140, 1135, 1130, 1125, 1120, 1115, 1110, 1105, 1100, 1090, 1088,
+ 1086, 1084, 1082, 1080, 1078, 1076, 1074, 1072, 1070, 1065, 1060, 1055, 1050, 1045, 1040, 1035,
+ 1030, 1025, 1020, 1015, 1010, 1005, 1000, 995, 990, 985, 980, 975, 970, 965, 960, 955,
+ 950, 945, 940, 935, 930, 925, 920, 915, 910, 905, 900, 895, 890, 885, 880, 875,
+ 870, 865, 860, 855, 850, 845, 840, 835, 830, 825, 820, 815, 810, 805, 800, 795,
+ 790, 785, 780, 775, 772, 769, 766, 763, 760, 757, 754, 751, 748, 745, 742, 739,
+ 736, 733, 730, 727, 724, 721, 718, 715, 712, 709, 706, 703, 700, 697, 694, 691,
+ 688, 685, 682, 679, 676, 673, 670, 667, 664, 661, 658, 655, 652, 649, 646, 643,
+ 640, 637, 634, 631, 628, 625, 622, 619, 616, 613, 610, 607, 604, 601, 598, 595,
+ 597, 599, 601, 603, 605, 607, 609, 611, 613, 615, 617, 619, 621, 623, 625, 627,
+ 629, 631, 633, 635, 637, 639, 641, 643, 645, 647, 649, 651, 653, 655, 657, 659,
+ 661, 663, 665, 667, 669, 671, 673, 675, 677, 679, 681, 683, 685, 687, 689, 691,
+ 693, 695, 697, 699, 701, 703, 705, 707, 709, 711, 713, 715, 715, 715, 715, 715,
+ 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715,
+ 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715,
+ 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715,
+ 715, 715, 715, 715, 715, 715, 715, 715, 710, 705, 700, 695, 690, 685, 680, 675,
+ 670, 665, 660, 655, 650, 645, 640, 635, 630, 625, 620, 615, 610, 605, 600, 595,
+ 590, 585, 580, 575, 570, 565, 560, 555, 550, 545, 540, 535, 530, 525, 520, 515,
+ 510, 505, 500, 495, 490, 485, 480, 475, 470, 465, 460, 455, 450, 445, 440, 435,
+ 430, 425, 420, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439,
+ 441, 443, 445, 447, 449, 451, 453, 455, 457, 459, 461, 463, 465, 467, 469, 471,
+ 473, 475, 477, 479, 481, 483, 485, 487, 489, 491, 493, 495, 497, 499, 501, 503,
+ 505, 507, 509, 511, 513, 515, 517, 519, 521, 523, 525, 527, 529, 531, 533, 535,
+ 536, 532, 528, 524, 520, 516, 512, 508, 504, 500, 496, 492, 488, 484, 480, 476,
+ 472, 468, 464, 460, 456, 452, 448, 444, 440, 436, 432, 428, 424, 420, 416, 412,
+ 408, 404, 400, 396, 392, 388, 384, 380, 376, 372, 368, 364, 360, 356, 352, 348,
+ 344, 340, 336, 332, 328, 324, 320, 316, 312, 308, 304, 300, 295, 290, 285, 280,
+ 275, 270, 265, 260, 255, 250, 245, 240, 235, 230, 225, 220, 215, 210, 205, 200,
+ 195, 190, 185, 180, 175, 170, 165, 160, 155, 150, 145, 140, 135, 130, 125, 120,
+ 115, 110, 105, 100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40,
+ 35, 30, 25, 20, 15, 10, 5, 0
+};
+
+Qt3DSEventSystemEvent *CCanProviderDemo::GetNextEvent(IEventFactory &inFactory)
+{
+ clock_t theCurClock = clock();
+ if (theCurClock > m_LastClock
+ && (theCurClock - m_LastClock) / (CLOCKS_PER_SEC / 1000) < 1000 / 6)
+ return 0;
+ m_LastClock = theCurClock;
+ unsigned char theLength = 0;
+ unsigned char theData[8];
+ theData[0] = 81;
+#define SIN_SAMPLE(s, m) ((sin((float)s) / 2 + 0.5) * m)
+ switch (rand() % 2) {
+ case 0:
+ theData[1] = 1;
+ { // Vehicle speed
+ int theIndex = m_Frame % (sizeof(g_VehicleSpeedData) / sizeof(g_VehicleSpeedData[0]));
+ theData[2] = (unsigned short)(g_VehicleSpeedData[theIndex] * 0.06) >> 8;
+ theData[3] = (unsigned char)(g_VehicleSpeedData[theIndex] * 0.06);
+ }
+ {
+ unsigned short theOdo = m_Frame;
+ theData[4] = theOdo >> 8;
+ theData[5] = (unsigned char)theOdo;
+ }
+ theLength = 6;
+ break;
+ case 1:
+ theData[1] = 2;
+ {
+ unsigned short theTrip = m_Frame;
+ theData[2] = theTrip >> 8;
+ theData[3] = (unsigned char)theTrip;
+ }
+ {
+ unsigned short theCoolant = (unsigned char)SIN_SAMPLE(m_Frame / 170, 300);
+ theData[4] = theCoolant >> 8;
+ theData[5] = (unsigned char)theCoolant;
+ }
+ theLength = 6;
+ break;
+ default:
+ return 0;
+ }
+ ++m_Frame;
+ Qt3DSEventSystemEvent &theEvent = inFactory.CreateEvent(9);
+ Qt3DSEventSystemEventData *theCurrentData = theEvent.m_Data;
+ theCurrentData->m_Name = inFactory.RegisterStr("device_type");
+ theCurrentData->m_Value.m_Type = QT3DSEventSystemEventTypesString;
+ theCurrentData->m_Value.m_String = inFactory.AllocateStr("CAN");
+ ++theCurrentData;
+ theCurrentData->m_Name = inFactory.RegisterStr("id");
+ theCurrentData->m_Value.m_Type = QT3DSEventSystemEventTypesNumber;
+ theCurrentData->m_Value.m_Number = 101;
+ ++theCurrentData;
+ theCurrentData->m_Name = inFactory.RegisterStr("length");
+ theCurrentData->m_Value.m_Type = QT3DSEventSystemEventTypesNumber;
+ theCurrentData->m_Value.m_Number = 6;
+ ++theCurrentData;
+ for (int i = 0; i < theLength; ++i) {
+ theCurrentData->m_Name = inFactory.RegisterStr("data");
+ theCurrentData->m_Value.m_Type = QT3DSEventSystemEventTypesNumber;
+ theCurrentData->m_Value.m_Number = theData[i];
+ ++theCurrentData;
+ }
+
+ return &theEvent;
+}
+
+size_t CCanProviderDemo::GetNextEvents(IEventFactory &inFactory, Qt3DSEventSystemEvent **outBuffer,
+ size_t bufLen)
+{
+ size_t bufIdx = 0;
+ Qt3DSEventSystemEvent *evt = NULL;
+ for (evt = GetNextEvent(inFactory); evt && bufIdx < bufLen;
+ evt = GetNextEvent(inFactory), ++bufIdx)
+ outBuffer[bufIdx] = evt;
+ return bufIdx;
+}
+
+void CCanProviderDemo::Release()
+{
+ delete this;
+}
diff --git a/src/event/test/CanProviderDemo.h b/src/event/test/CanProviderDemo.h
new file mode 100644
index 0000000..7d6788b
--- /dev/null
+++ b/src/event/test/CanProviderDemo.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CAN_PROVIDER_DEMO_H
+#define CAN_PROVIDER_DEMO_H
+
+#include <ctime>
+
+#include <EventSystem.h>
+
+using namespace qt3ds::evt;
+
+class CCanProviderDemo : public IEventProvider
+{
+public:
+ CCanProviderDemo();
+ virtual ~CCanProviderDemo();
+
+ Qt3DSEventSystemEvent *GetNextEvent(IEventFactory &inFactory);
+ virtual size_t GetNextEvents(IEventFactory &inFactory, Qt3DSEventSystemEvent **outBuffer,
+ size_t bufLen);
+ virtual void Release();
+
+private:
+ unsigned int m_Frame;
+ clock_t m_LastClock;
+};
+
+#endif // CAN_PROVIDER_DEMO_H
diff --git a/src/foundation/AutoDeallocatorAllocator.h b/src/foundation/AutoDeallocatorAllocator.h
new file mode 100644
index 0000000..5cbbc8b
--- /dev/null
+++ b/src/foundation/AutoDeallocatorAllocator.h
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_FOUNDATION_AUTO_DEALLOCATOR_ALLOCATOR_H
+#define QT3DS_FOUNDATION_AUTO_DEALLOCATOR_ALLOCATOR_H
+#pragma once
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ using eastl::make_pair;
+ using eastl::pair;
+
+ struct SSAutoDeallocatorAllocator : public NVAllocatorCallback
+ {
+ NVAllocatorCallback &m_Allocator;
+ nvhash_map<void *, size_t> m_Allocations;
+ SSAutoDeallocatorAllocator(NVFoundationBase &inFnd)
+ : m_Allocator(inFnd.getAllocator())
+ , m_Allocations(inFnd.getAllocator(), "SSAutoDeallocatorAllocator::m_Allocations")
+ {
+ }
+
+ SSAutoDeallocatorAllocator(NVAllocatorCallback &inAlloc)
+ : m_Allocator(inAlloc)
+ , m_Allocations(inAlloc, "SSAutoDeallocatorAllocator::m_Allocations")
+ {
+ }
+
+ // Automatically deallocates everything that hasn't already been deallocated.
+ ~SSAutoDeallocatorAllocator() { deallocateAllAllocations(); }
+
+ void deallocateAllAllocations()
+ {
+ for (nvhash_map<void *, size_t>::iterator iter = m_Allocations.begin(),
+ end = m_Allocations.end();
+ iter != end; ++iter)
+ m_Allocator.deallocate(iter->first);
+ m_Allocations.clear();
+ }
+
+ void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ int flags = 0) override
+ {
+ void *value = m_Allocator.allocate(size, typeName, filename, line, flags);
+ m_Allocations.insert(make_pair(value, size));
+ return value;
+ }
+
+ void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ size_t alignment, size_t alignmentOffset) override
+ {
+ void *value =
+ m_Allocator.allocate(size, typeName, filename, line, alignment, alignmentOffset);
+ m_Allocations.insert(make_pair(value, size));
+ return value;
+ }
+ void deallocate(void *ptr) override
+ {
+ nvhash_map<void *, size_t>::iterator iter = m_Allocations.find(ptr);
+ QT3DS_ASSERT(iter != m_Allocations.end());
+ m_Allocator.deallocate(iter->first);
+ m_Allocations.erase(iter);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/ConvertUTF.cpp b/src/foundation/ConvertUTF.cpp
new file mode 100644
index 0000000..a71a3ae
--- /dev/null
+++ b/src/foundation/ConvertUTF.cpp
@@ -0,0 +1,661 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+* Copyright 2001-2004 Unicode, Inc.
+*
+* Disclaimer
+*
+* This source code is provided as is by Unicode, Inc. No claims are
+* made as to fitness for any particular purpose. No warranties of any
+* kind are expressed or implied. The recipient agrees to determine
+* applicability of information provided. If this file has been
+* purchased on magnetic or optical media from Unicode, Inc., the
+* sole remedy for any claim will be exchange of defective media
+* within 90 days of receipt.
+*
+* Limitations on Rights to Redistribute This Code
+*
+* Unicode, Inc. hereby grants the right to freely use the information
+* supplied in this file in the creation of products supporting the
+* Unicode Standard, and to make copies of this file in any form
+* for internal or external distribution as long as this notice
+* remains attached.
+*/
+
+/* ---------------------------------------------------------------------
+ Conversions between UTF32, UTF-16, and UTF-8. Source code file.
+ Author: Mark E. Davis, 1994.
+ Rev History: Rick McGowan, fixes & updates May 2001.
+ Sept 2001: fixed const & error conditions per
+ mods suggested by S. Parent & A. Lillich.
+ June 2002: Tim Dodd added detection and handling of incomplete
+ source sequences, enhanced error detection, added casts
+ to eliminate compiler warnings.
+ July 2003: slight mods to back out aggressive FFFE detection.
+ Jan 2004: updated switches in from-UTF8 conversions.
+ Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.
+ See the header file "ConvertUTF.h" for complete documentation.
+------------------------------------------------------------------------ */
+
+#include "foundation/ConvertUTF.h"
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4365) // warnings on conversion from unsigned int to int
+#endif
+
+#ifdef CVTUTF_DEBUG
+#include <stdio.h>
+#endif
+
+static const int halfShift = 10; /* used for shifting by 10 bits */
+
+static const UTF32 halfBase = 0x0010000UL;
+static const UTF32 halfMask = 0x3FFUL;
+
+#define UNI_SUR_HIGH_START (UTF32)0xD800
+#define UNI_SUR_HIGH_END (UTF32)0xDBFF
+#define UNI_SUR_LOW_START (UTF32)0xDC00
+#define UNI_SUR_LOW_END (UTF32)0xDFFF
+#define false 0
+#define true 1
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult Q3DSConvertUTF32toUTF16(const UTF32 **sourceStart, const UTF32 *sourceEnd,
+ UTF16 **targetStart, UTF16 *targetEnd,
+ ConversionFlags flags)
+{
+ ConversionResult result = conversionOK;
+ const UTF32 *source = *sourceStart;
+ UTF16 *target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch;
+ if (target >= targetEnd) {
+ result = targetExhausted;
+ break;
+ }
+ ch = *source++;
+ if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
+ /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved
+ * values */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ if (flags == strictConversion) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ *target++ = (UTF16)ch; /* normal case */
+ }
+ } else if (ch > UNI_MAX_LEGAL_UTF32) {
+ if (flags == strictConversion) {
+ result = sourceIllegal;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ /* target is a character in range 0xFFFF - 0x10FFFF. */
+ if (target + 1 >= targetEnd) {
+ --source; /* Back up source pointer! */
+ result = targetExhausted;
+ break;
+ }
+ ch -= halfBase;
+ *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
+ *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
+ }
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult Q3DSConvertUTF16toUTF32(const UTF16 **sourceStart, const UTF16 *sourceEnd,
+ UTF32 **targetStart, UTF32 *targetEnd,
+ ConversionFlags flags)
+{
+ ConversionResult result = conversionOK;
+ const UTF16 *source = *sourceStart;
+ UTF32 *target = *targetStart;
+ UTF32 ch, ch2;
+ while (source < sourceEnd) {
+ const UTF16 *oldSource =
+ source; /* In case we have to back up because of target overflow. */
+ ch = *source++;
+ /* If we have a surrogate pair, convert to UTF32 first. */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
+ /* If the 16 bits following the high surrogate are in the source buffer... */
+ if (source < sourceEnd) {
+ ch2 = *source;
+ /* If it's a low surrogate, convert to UTF32. */
+ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
+ ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START)
+ + halfBase;
+ ++source;
+ } else if (flags == strictConversion) { /* it's an unpaired high surrogate */
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ } else { /* We don't have the 16 bits following the high surrogate. */
+ --source; /* return to the high surrogate */
+ result = sourceExhausted;
+ break;
+ }
+ } else if (flags == strictConversion) {
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ }
+ if (target >= targetEnd) {
+ source = oldSource; /* Back up source pointer! */
+ result = targetExhausted;
+ break;
+ }
+ *target++ = ch;
+ }
+ *sourceStart = source;
+ *targetStart = target;
+#ifdef CVTUTF_DEBUG
+ if (result == sourceIllegal) {
+ fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2);
+ fflush(stderr);
+ }
+#endif
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * Index into the table below with the first byte of a UTF-8 sequence to
+ * get the number of trailing bytes that are supposed to follow it.
+ * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is
+ * left as-is for anyone who may want to do such conversion, which was
+ * allowed in earlier algorithms.
+ */
+static const char trailingBytesForUTF8[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5
+};
+
+/*
+ * Magic values subtracted from a buffer value during UTF8 conversion.
+ * This table contains as many values as there might be trailing bytes
+ * in a UTF-8 sequence.
+ */
+static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
+ 0x03C82080UL, 0xFA082080UL, 0x82082080UL };
+
+/*
+ * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed
+ * into the first byte, depending on how many bytes follow. There are
+ * as many entries in this table as there are UTF-8 sequence types.
+ * (I.e., one byte sequence, two byte... etc.). Remember that sequencs
+ * for *legal* UTF-8 will be 4 or fewer bytes total.
+ */
+static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
+
+/* --------------------------------------------------------------------- */
+
+/* The interface converts a whole buffer to avoid function-call overhead.
+ * Constants have been gathered. Loops & conditionals have been removed as
+ * much as possible for efficiency, in favor of drop-through switches.
+ * (See "Note A" at the bottom of the file for equivalent code.)
+ * If your compiler supports it, the "isLegalUTF8" call can be turned
+ * into an inline function.
+ */
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult Q3DSConvertUTF16toUTF8(const UTF16 **sourceStart, const UTF16 *sourceEnd,
+ UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags)
+{
+ ConversionResult result = conversionOK;
+ const UTF16 *source = *sourceStart;
+ UTF8 *target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch;
+ unsigned short bytesToWrite = 0;
+ const UTF32 byteMask = 0xBF;
+ const UTF32 byteMark = 0x80;
+ const UTF16 *oldSource =
+ source; /* In case we have to back up because of target overflow. */
+ ch = *source++;
+ /* If we have a surrogate pair, convert to UTF32 first. */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
+ /* If the 16 bits following the high surrogate are in the source buffer... */
+ if (source < sourceEnd) {
+ UTF32 ch2 = *source;
+ /* If it's a low surrogate, convert to UTF32. */
+ if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
+ ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + (ch2 - UNI_SUR_LOW_START)
+ + halfBase;
+ ++source;
+ } else if (flags == strictConversion) { /* it's an unpaired high surrogate */
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ } else { /* We don't have the 16 bits following the high surrogate. */
+ --source; /* return to the high surrogate */
+ result = sourceExhausted;
+ break;
+ }
+ } else if (flags == strictConversion) {
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ }
+ /* Figure out how many bytes the result will require */
+ if (ch < (UTF32)0x80) {
+ bytesToWrite = 1;
+ } else if (ch < (UTF32)0x800) {
+ bytesToWrite = 2;
+ } else if (ch < (UTF32)0x10000) {
+ bytesToWrite = 3;
+ } else if (ch < (UTF32)0x110000) {
+ bytesToWrite = 4;
+ } else {
+ bytesToWrite = 3;
+ ch = UNI_REPLACEMENT_CHAR;
+ }
+
+ target += bytesToWrite;
+ if (target > targetEnd) {
+ source = oldSource; /* Back up source pointer! */
+ target -= bytesToWrite;
+ result = targetExhausted;
+ break;
+ }
+ switch (bytesToWrite) { /* note: everything falls through. */
+ case 4:
+ *--target = (UTF8)((ch | byteMark) & byteMask);
+ ch >>= 6;
+ case 3:
+ *--target = (UTF8)((ch | byteMark) & byteMask);
+ ch >>= 6;
+ case 2:
+ *--target = (UTF8)((ch | byteMark) & byteMask);
+ ch >>= 6;
+ case 1:
+ *--target = (UTF8)(ch | firstByteMark[bytesToWrite]);
+ }
+ target += bytesToWrite;
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * Utility routine to tell whether a sequence of bytes is legal UTF-8.
+ * This must be called with the length pre-determined by the first byte.
+ * If not calling this from ConvertUTF8to*, then the length can be set by:
+ * length = trailingBytesForUTF8[*source]+1;
+ * and the sequence is illegal right away if there aren't that many bytes
+ * available.
+ * If presented with a length > 4, this returns false. The Unicode
+ * definition of UTF-8 goes up to 4-byte sequences.
+ */
+
+static Boolean isLegalUTF8(const UTF8 *source, int length)
+{
+ UTF8 a;
+ const UTF8 *srcptr = source + length;
+ switch (length) {
+ default:
+ return false;
+ /* Everything else falls through when "true"... */
+ case 4:
+ if ((a = (*--srcptr)) < 0x80 || a > 0xBF)
+ return false;
+ case 3:
+ if ((a = (*--srcptr)) < 0x80 || a > 0xBF)
+ return false;
+ case 2:
+ if ((a = (*--srcptr)) > 0xBF)
+ return false;
+
+ switch (*source) {
+ /* no fall-through in this inner switch */
+ case 0xE0:
+ if (a < 0xA0)
+ return false;
+ break;
+ case 0xED:
+ if (a > 0x9F)
+ return false;
+ break;
+ case 0xF0:
+ if (a < 0x90)
+ return false;
+ break;
+ case 0xF4:
+ if (a > 0x8F)
+ return false;
+ break;
+ default:
+ if (a < 0x80)
+ return false;
+ }
+
+ case 1:
+ if (*source >= 0x80 && *source < 0xC2)
+ return false;
+ }
+ if (*source > 0xF4)
+ return false;
+ return true;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * Exported function to return whether a UTF-8 sequence is legal or not.
+ * This is not used here; it's just exported.
+ */
+Boolean Q3DSIsLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd)
+{
+ int length = trailingBytesForUTF8[*source] + 1;
+ if (source + length > sourceEnd) {
+ return false;
+ }
+ return isLegalUTF8(source, length);
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult Q3DSConvertUTF8toUTF16(const UTF8 **sourceStart, const UTF8 *sourceEnd,
+ UTF16 **targetStart, UTF16 *targetEnd,
+ ConversionFlags flags)
+{
+ ConversionResult result = conversionOK;
+ const UTF8 *source = *sourceStart;
+ UTF16 *target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch = 0;
+ unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
+ if (source + extraBytesToRead >= sourceEnd) {
+ result = sourceExhausted;
+ break;
+ }
+ /* Do this check whether lenient or strict */
+ if (!isLegalUTF8(source, extraBytesToRead + 1)) {
+ result = sourceIllegal;
+ break;
+ }
+ /*
+ * The cases all fall through. See "Note A" below.
+ */
+ switch (extraBytesToRead) {
+ case 5:
+ ch += *source++;
+ ch <<= 6; /* remember, illegal UTF-8 */
+ case 4:
+ ch += *source++;
+ ch <<= 6; /* remember, illegal UTF-8 */
+ case 3:
+ ch += *source++;
+ ch <<= 6;
+ case 2:
+ ch += *source++;
+ ch <<= 6;
+ case 1:
+ ch += *source++;
+ ch <<= 6;
+ case 0:
+ ch += *source++;
+ }
+ ch -= offsetsFromUTF8[extraBytesToRead];
+
+ if (target >= targetEnd) {
+ source -= (extraBytesToRead + 1); /* Back up source pointer! */
+ result = targetExhausted;
+ break;
+ }
+ if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ if (flags == strictConversion) {
+ source -= (extraBytesToRead + 1); /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ *target++ = (UTF16)ch; /* normal case */
+ }
+ } else if (ch > UNI_MAX_UTF16) {
+ if (flags == strictConversion) {
+ result = sourceIllegal;
+ source -= (extraBytesToRead + 1); /* return to the start */
+ break; /* Bail out; shouldn't continue */
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ /* target is a character in range 0xFFFF - 0x10FFFF. */
+ if (target + 1 >= targetEnd) {
+ source -= (extraBytesToRead + 1); /* Back up source pointer! */
+ result = targetExhausted;
+ break;
+ }
+ ch -= halfBase;
+ *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
+ *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
+ }
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult Q3DSConvertUTF32toUTF8(const UTF32 **sourceStart, const UTF32 *sourceEnd,
+ UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags)
+{
+ ConversionResult result = conversionOK;
+ const UTF32 *source = *sourceStart;
+ UTF8 *target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch;
+ unsigned short bytesToWrite = 0;
+ const UTF32 byteMask = 0xBF;
+ const UTF32 byteMark = 0x80;
+ ch = *source++;
+ if (flags == strictConversion) {
+ /* UTF-16 surrogate values are illegal in UTF-32 */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ --source; /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ }
+ }
+ /*
+ * Figure out how many bytes the result will require. Turn any
+ * illegally large UTF32 things (> Plane 17) into replacement chars.
+ */
+ if (ch < (UTF32)0x80) {
+ bytesToWrite = 1;
+ } else if (ch < (UTF32)0x800) {
+ bytesToWrite = 2;
+ } else if (ch < (UTF32)0x10000) {
+ bytesToWrite = 3;
+ } else if (ch <= UNI_MAX_LEGAL_UTF32) {
+ bytesToWrite = 4;
+ } else {
+ bytesToWrite = 3;
+ ch = UNI_REPLACEMENT_CHAR;
+ result = sourceIllegal;
+ }
+
+ target += bytesToWrite;
+ if (target > targetEnd) {
+ --source; /* Back up source pointer! */
+ target -= bytesToWrite;
+ result = targetExhausted;
+ break;
+ }
+ switch (bytesToWrite) { /* note: everything falls through. */
+ case 4:
+ *--target = (UTF8)((ch | byteMark) & byteMask);
+ ch >>= 6;
+ case 3:
+ *--target = (UTF8)((ch | byteMark) & byteMask);
+ ch >>= 6;
+ case 2:
+ *--target = (UTF8)((ch | byteMark) & byteMask);
+ ch >>= 6;
+ case 1:
+ *--target = (UTF8)(ch | firstByteMark[bytesToWrite]);
+ }
+ target += bytesToWrite;
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* --------------------------------------------------------------------- */
+
+ConversionResult Q3DSConvertUTF8toUTF32(const UTF8 **sourceStart, const UTF8 *sourceEnd,
+ UTF32 **targetStart, UTF32 *targetEnd,
+ ConversionFlags flags)
+{
+ ConversionResult result = conversionOK;
+ const UTF8 *source = *sourceStart;
+ UTF32 *target = *targetStart;
+ while (source < sourceEnd) {
+ UTF32 ch = 0;
+ unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
+ if (source + extraBytesToRead >= sourceEnd) {
+ result = sourceExhausted;
+ break;
+ }
+ /* Do this check whether lenient or strict */
+ if (!isLegalUTF8(source, extraBytesToRead + 1)) {
+ result = sourceIllegal;
+ break;
+ }
+ /*
+ * The cases all fall through. See "Note A" below.
+ */
+ switch (extraBytesToRead) {
+ case 5:
+ ch += *source++;
+ ch <<= 6;
+ case 4:
+ ch += *source++;
+ ch <<= 6;
+ case 3:
+ ch += *source++;
+ ch <<= 6;
+ case 2:
+ ch += *source++;
+ ch <<= 6;
+ case 1:
+ ch += *source++;
+ ch <<= 6;
+ case 0:
+ ch += *source++;
+ }
+ ch -= offsetsFromUTF8[extraBytesToRead];
+
+ if (target >= targetEnd) {
+ source -= (extraBytesToRead + 1); /* Back up the source pointer! */
+ result = targetExhausted;
+ break;
+ }
+ if (ch <= UNI_MAX_LEGAL_UTF32) {
+ /*
+ * UTF-16 surrogate values are illegal in UTF-32, and anything
+ * over Plane 17 (> 0x10FFFF) is illegal.
+ */
+ if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
+ if (flags == strictConversion) {
+ source -= (extraBytesToRead + 1); /* return to the illegal value itself */
+ result = sourceIllegal;
+ break;
+ } else {
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ } else {
+ *target++ = ch;
+ }
+ } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */
+ result = sourceIllegal;
+ *target++ = UNI_REPLACEMENT_CHAR;
+ }
+ }
+ *sourceStart = source;
+ *targetStart = target;
+ return result;
+}
+
+/* ---------------------------------------------------------------------
+
+ Note A.
+ The fall-through switches in UTF-8 reading code save a
+ temp variable, some decrements & conditionals. The switches
+ are equivalent to the following loop:
+ {
+ int tmpBytesToRead = extraBytesToRead+1;
+ do {
+ ch += *source++;
+ --tmpBytesToRead;
+ if (tmpBytesToRead) ch <<= 6;
+ } while (tmpBytesToRead > 0);
+ }
+ In UTF-8 writing code, the switches on "bytesToWrite" are
+ similarly unrolled loops.
+
+ --------------------------------------------------------------------- */
diff --git a/src/foundation/ConvertUTF.h b/src/foundation/ConvertUTF.h
new file mode 100644
index 0000000..93614a0
--- /dev/null
+++ b/src/foundation/ConvertUTF.h
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+/*
+ * Copyright 2001-2004 Unicode, Inc.
+ *
+ * Disclaimer
+ *
+ * This source code is provided as is by Unicode, Inc. No claims are
+ * made as to fitness for any particular purpose. No warranties of any
+ * kind are expressed or implied. The recipient agrees to determine
+ * applicability of information provided. If this file has been
+ * purchased on magnetic or optical media from Unicode, Inc., the
+ * sole remedy for any claim will be exchange of defective media
+ * within 90 days of receipt.
+ *
+ * Limitations on Rights to Redistribute This Code
+ *
+ * Unicode, Inc. hereby grants the right to freely use the information
+ * supplied in this file in the creation of products supporting the
+ * Unicode Standard, and to make copies of this file in any form
+ * for internal or external distribution as long as this notice
+ * remains attached.
+ */
+
+/* ---------------------------------------------------------------------
+
+ Conversions between UTF32, UTF-16, and UTF-8. Header file.
+
+ Several funtions are included here, forming a complete set of
+ conversions between the three formats. UTF-7 is not included
+ here, but is handled in a separate source file.
+
+ Each of these routines takes pointers to input buffers and output
+ buffers. The input buffers are const.
+
+ Each routine converts the text between *sourceStart and sourceEnd,
+ putting the result into the buffer between *targetStart and
+ targetEnd. Note: the end pointers are *after* the last item: e.g.
+ *(sourceEnd - 1) is the last item.
+
+ The return result indicates whether the conversion was successful,
+ and if not, whether the problem was in the source or target buffers.
+ (Only the first encountered problem is indicated.)
+
+ After the conversion, *sourceStart and *targetStart are both
+ updated to point to the end of last text successfully converted in
+ the respective buffers.
+
+ Input parameters:
+ sourceStart - pointer to a pointer to the source buffer.
+ The contents of this are modified on return so that
+ it points at the next thing to be converted.
+ targetStart - similarly, pointer to pointer to the target buffer.
+ sourceEnd, targetEnd - respectively pointers to the ends of the
+ two buffers, for overflow checking only.
+
+ These conversion functions take a ConversionFlags argument. When this
+ flag is set to strict, both irregular sequences and isolated surrogates
+ will cause an error. When the flag is set to lenient, both irregular
+ sequences and isolated surrogates are converted.
+
+ Whether the flag is strict or lenient, all illegal sequences will cause
+ an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,
+ or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code
+ must check for illegal sequences.
+
+ When the flag is set to lenient, characters over 0x10FFFF are converted
+ to the replacement character; otherwise (when the flag is set to strict)
+ they constitute an error.
+
+ Output parameters:
+ The value "sourceIllegal" is returned from some routines if the input
+ sequence is malformed. When "sourceIllegal" is returned, the source
+ value will point to the illegal value that caused the problem. E.g.,
+ in UTF-8 when a sequence is malformed, it points to the start of the
+ malformed sequence.
+
+ Author: Mark E. Davis, 1994.
+ Rev History: Rick McGowan, fixes & updates May 2001.
+ Fixes & updates, Sept 2001.
+
+------------------------------------------------------------------------ */
+
+/* ---------------------------------------------------------------------
+ The following 4 definitions are compiler-specific.
+ The C standard does not guarantee that wchar_t has at least
+ 16 bits, so wchar_t is no less portable than unsigned short!
+ All should be unsigned values to avoid sign extension during
+ bit mask & shift operations.
+------------------------------------------------------------------------ */
+
+typedef unsigned int UTF32; /* at least 32 bits */
+typedef unsigned short UTF16; /* at least 16 bits */
+typedef unsigned char UTF8; /* typically 8 bits */
+typedef unsigned char Boolean; /* 0 or 1 */
+
+/* Some fundamental constants */
+
+#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
+#define UNI_MAX_BMP (UTF32)0x0000FFFF
+#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
+#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
+#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
+
+typedef enum {
+ conversionOK, /* conversion successful */
+ sourceExhausted, /* partial character in source, but hit end */
+ targetExhausted, /* insuff. room in target for conversion */
+ sourceIllegal /* source sequence is illegal/malformed */
+} ConversionResult;
+
+typedef enum { strictConversion = 0, lenientConversion } ConversionFlags;
+
+/* This is for C++ and does no harm in C */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ConversionResult Q3DSConvertUTF8toUTF16(const UTF8 **sourceStart, const UTF8 *sourceEnd,
+ UTF16 **targetStart, UTF16 *targetEnd,
+ ConversionFlags flags);
+
+ConversionResult Q3DSConvertUTF16toUTF8(const UTF16 **sourceStart, const UTF16 *sourceEnd,
+ UTF8 **targetStart, UTF8 *targetEnd,
+ ConversionFlags flags);
+
+ConversionResult Q3DSConvertUTF8toUTF32(const UTF8 **sourceStart, const UTF8 *sourceEnd,
+ UTF32 **targetStart, UTF32 *targetEnd,
+ ConversionFlags flags);
+
+ConversionResult Q3DSConvertUTF32toUTF8(const UTF32 **sourceStart, const UTF32 *sourceEnd,
+ UTF8 **targetStart, UTF8 *targetEnd,
+ ConversionFlags flags);
+
+ConversionResult Q3DSConvertUTF16toUTF32(const UTF16 **sourceStart, const UTF16 *sourceEnd,
+ UTF32 **targetStart, UTF32 *targetEnd,
+ ConversionFlags flags);
+
+ConversionResult Q3DSConvertUTF32toUTF16(const UTF32 **sourceStart, const UTF32 *sourceEnd,
+ UTF16 **targetStart, UTF16 *targetEnd,
+ ConversionFlags flags);
+
+Boolean Q3DSIsLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);
+
+#ifdef __cplusplus
+}
+#endif
+
+/* --------------------------------------------------------------------- */
diff --git a/src/foundation/EASTL_new.cpp b/src/foundation/EASTL_new.cpp
new file mode 100644
index 0000000..61e8e0b
--- /dev/null
+++ b/src/foundation/EASTL_new.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// we have some build dependencies which forces us to include
+// this on linux to recognize malloc
+#include <stdio.h>
+#include <stdarg.h>
+
+#if !defined(_MSC_VER)
+#include <stdlib.h>
+#endif
+
+#include "EASTL/allocator.h"
+
+void *operator new[](size_t size, const char *, int, unsigned, const char *, int)
+{
+ return malloc(size);
+}
+
+void *operator new[](size_t size, size_t, size_t, const char *, int, unsigned, const char *, int)
+{
+ return malloc(size);
+}
+// EASTL also wants us to define this (see string.h line 197)
+int Vsnprintf8(char8_t *pDestination, size_t n, const char8_t *pFormat, va_list arguments)
+{
+#ifdef _MSC_VER
+ return _vsnprintf(pDestination, n, pFormat, arguments);
+#else
+ return vsnprintf(pDestination, n, pFormat, arguments);
+#endif
+}
+int Vsnprintf16(char8_t *pDestination, size_t n, const char16_t *pFormat, va_list arguments)
+{
+#ifdef _MSC_VER
+ return _vsnprintf(pDestination, n, (char *)pFormat, arguments);
+#else
+ return vsnprintf(pDestination, n, (char *)pFormat, arguments);
+#endif
+}
+int Vsnprintf32(char8_t *pDestination, size_t n, const char32_t *pFormat, va_list arguments)
+{
+#ifdef _MSC_VER
+ return _vsnprintf(pDestination, n, (char *)pFormat, arguments);
+#else
+ return vsnprintf(pDestination, n, (char *)pFormat, arguments);
+#endif
+}
diff --git a/src/foundation/FastAllocator.h b/src/foundation/FastAllocator.h
new file mode 100644
index 0000000..c296bcb
--- /dev/null
+++ b/src/foundation/FastAllocator.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DSContainers.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ /**
+ * Allocator that allocates slabs of a certain size and objects then
+ * get allocated from those slabs. This allocator is designed to reset,
+ * meaning every frame you can call reset and the objects get freed but
+ * not destructed. This allocator does not call destructors!!
+ */
+ template <QT3DSU32 alignmentInBytes = 4, QT3DSU32 slabSize = 8192>
+ struct SFastAllocator : NVAllocatorCallback
+ {
+ ForwardingAllocator m_Allocator;
+ nvvector<QT3DSU8 *> m_Slabs;
+ QT3DSU32 m_Offset;
+
+ enum {
+ SlabSize = slabSize,
+ };
+
+ static size_t getSlabSize() { return slabSize; }
+
+ SFastAllocator(NVAllocatorCallback &alloc, const char *memName)
+ : m_Allocator(alloc, memName)
+ , m_Slabs(alloc, "SFastAllocator::m_Slabs")
+ , m_Offset(0)
+ {
+ }
+
+ ~SFastAllocator()
+ {
+ for (QT3DSU32 idx = 0, end = m_Slabs.size(); idx < end; ++idx)
+ m_Allocator.deallocate(m_Slabs[idx]);
+ m_Slabs.clear();
+ m_Offset = 0;
+ }
+ void *allocate(size_t inSize, const char *inFile, int inLine, int inFlags = 0)
+ {
+ (void)inFlags;
+ if (inSize > slabSize) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ QT3DSU32 misalign = m_Offset % alignmentInBytes;
+ if (misalign)
+ m_Offset = m_Offset + (alignmentInBytes - misalign);
+
+ QT3DSU32 currentSlab = m_Offset / slabSize;
+ QT3DSU32 slabOffset = m_Offset % slabSize;
+ QT3DSU32 amountLeftInSlab = slabSize - slabOffset;
+ if (inSize > amountLeftInSlab) {
+ ++currentSlab;
+ slabOffset = 0;
+ m_Offset = currentSlab * slabSize;
+ }
+ while (currentSlab >= m_Slabs.size()) {
+ m_Slabs.push_back((QT3DSU8 *)m_Allocator.allocate(slabSize, inFile, inLine));
+ }
+ QT3DSU8 *data = m_Slabs[currentSlab] + slabOffset;
+ // This would indicate the underlying allocator isn't handing back aligned memory.
+ QT3DS_ASSERT(reinterpret_cast<size_t>(data) % alignmentInBytes == 0);
+ m_Offset += (QT3DSU32)inSize;
+ return data;
+ }
+ void *allocate(size_t size, const char * /*typeName*/, const char *filename, int line,
+ int flags = 0) override
+ {
+ return allocate(size, filename, line, flags);
+ }
+ void *allocate(size_t size, const char * /*typeName*/, const char *filename, int line,
+ size_t alignment, size_t /*alignmentOffset*/) override
+ {
+ QT3DS_ASSERT(alignment == alignmentInBytes);
+ if (alignment == alignmentInBytes)
+ return allocate(size, filename, line);
+ return NULL;
+ }
+ // only reset works with deallocation
+ void deallocate(void *) override {}
+ void reset() { m_Offset = 0; }
+ };
+}
+}
diff --git a/src/foundation/FileTools.cpp b/src/foundation/FileTools.cpp
new file mode 100644
index 0000000..c1733a6
--- /dev/null
+++ b/src/foundation/FileTools.cpp
@@ -0,0 +1,550 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/FileTools.h"
+#include "foundation/Utils.h"
+#include <string.h>
+#
+#ifdef EA_PLATFORM_WINDOWS
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#else // posix
+#include <stdio.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
+#endif
+#include <QDir>
+#include <QFile>
+#include <QUrl>
+
+using namespace qt3ds::foundation;
+
+namespace {
+// State machine where you can add a character
+// and it will tell you how many characters to erase
+struct SPathStateMachine
+{
+ struct States
+ {
+ enum Enum {
+ NoState = 0, // Don't care
+ Slash, // Last char was either a forward or backward slash
+ Period, // Last char was a period
+ TwoPeriods, // Last two characters were periods
+ };
+ };
+ struct Actions
+ {
+ enum Enum {
+ NoAction = 0,
+ DeleteBack1Slash,
+ DeleteBack2Slashes,
+ };
+ };
+
+ States::Enum m_State;
+
+ SPathStateMachine()
+ : m_State(States::NoState)
+ {
+ }
+
+ Actions::Enum AnalyzeChar(char32_t inChar)
+ {
+ switch (inChar) {
+ case '\\':
+ case '/':
+ switch (m_State) {
+ case States::NoState:
+ m_State = States::Slash;
+ break;
+ case States::Period:
+ m_State = States::Slash;
+ return Actions::DeleteBack1Slash;
+
+ case States::TwoPeriods:
+ m_State = States::Slash;
+ return Actions::DeleteBack2Slashes;
+ case States::Slash:
+ return Actions::DeleteBack1Slash;
+ }
+ break;
+ case '.':
+ switch (m_State) {
+ case States::Slash:
+ case States::NoState:
+ m_State = States::Period;
+ break;
+ case States::Period:
+ m_State = States::TwoPeriods;
+ break;
+ case States::TwoPeriods:
+ break;
+ }
+ break;
+ default:
+ m_State = States::NoState;
+ break;
+ }
+ return Actions::NoAction;
+ }
+};
+
+template <typename TStrType>
+inline bool DoDeleteBack1Slash(TStr::size_type &idx, TStrType &ioPath)
+{
+ TStr::size_type slashLoc = ioPath.rfind('/', idx - 1);
+ if ((slashLoc != TStr::npos) && (slashLoc > 2)
+ // and the next *two* characters aren't both dots.
+ && ((ioPath[slashLoc - 1] != '.') || (ioPath[slashLoc - 2] != '.'))) {
+
+ ioPath.erase(ioPath.begin() + slashLoc, ioPath.begin() + idx);
+ idx = slashLoc;
+ return true;
+ }
+ return false;
+}
+
+template <typename TStrType>
+void NormalizePathT(TStrType &ioPath)
+{
+ TStr::size_type pathLen = ioPath.size();
+ SPathStateMachine theStateMachine;
+ for (TStr::size_type idx = 0; idx < pathLen; ++idx) {
+ char8_t &currentChar = ioPath[idx];
+ if (currentChar == '\\')
+ currentChar = '/';
+ SPathStateMachine::Actions::Enum action = theStateMachine.AnalyzeChar(currentChar);
+ switch (action) {
+ case SPathStateMachine::Actions::DeleteBack2Slashes:
+ if (DoDeleteBack1Slash(idx, ioPath))
+ DoDeleteBack1Slash(idx, ioPath);
+ pathLen = ioPath.size();
+ break;
+
+ case SPathStateMachine::Actions::DeleteBack1Slash:
+ DoDeleteBack1Slash(idx, ioPath);
+ pathLen = ioPath.size();
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+bool IsAbsolute(const char8_t *inPath, size_t inLen)
+{
+ if (inLen > 2 && inPath[1] == ':')
+ return true;
+ else if (inLen > 1 && (inPath[0] == '\\' || inPath[0] == '/'))
+ return true;
+ return false;
+}
+
+template <typename TStrType>
+void CombineBaseAndRelativeT(const char8_t *inBase, const char8_t *inRelative, TStrType &outString)
+{
+ if (IsAbsolute(inRelative, StrLen(inRelative))) {
+ outString.assign(nonNull(inRelative));
+ } else {
+ if (inRelative && *inRelative) {
+ if (inRelative[0] == '#')
+ outString.assign(inRelative);
+ else {
+ if (IsAbsolute(inRelative, strlen(inRelative))) {
+ outString.assign(inRelative);
+ } else {
+ outString = inBase ? inBase : "";
+ if (outString.size())
+ outString.append("/");
+ outString.append(inRelative ? inRelative : (const char8_t *)L"");
+ }
+ NormalizePathT(outString);
+ }
+ }
+ }
+}
+
+template <typename TStrType>
+void GetRelativeFromBaseT(TStrType &inBaseStr, TStrType &inRelativeStr, TStrType &outString)
+{
+ outString.clear();
+ NormalizePathT(inBaseStr);
+ NormalizePathT(inRelativeStr);
+ if (inBaseStr.size() == 0) {
+ outString.assign(inRelativeStr.c_str());
+ return;
+ }
+ if (inRelativeStr.size() == 0) {
+ outString.clear();
+ return;
+ }
+ // find longest common string
+ const char8_t *inBase = inBaseStr.c_str();
+ const char8_t *baseEnd = inBaseStr.c_str() + inBaseStr.size();
+ const char8_t *inRelative = inRelativeStr.c_str();
+ size_t relativeLen = inRelativeStr.size();
+ const char8_t *relativeEnd = inRelative + relativeLen;
+
+ for (; inRelative < relativeEnd && inBase < baseEnd && *inRelative == *inBase;
+ ++inRelative, ++inBase)
+ ;
+
+ // They had nothing in common.
+ if (inBase == inBaseStr.c_str()) {
+ outString.assign(inRelativeStr.c_str());
+ return;
+ }
+
+ if (inRelative && (*inRelative == '\\' || *inRelative == '/'))
+ ++inRelative;
+
+ const char *common = inBase;
+ if (common == NULL || *common == 0) {
+ outString.assign("./");
+ outString.append(inRelative);
+ NormalizePathT(outString);
+ return;
+ }
+ // Backtrack to the nearest slash.
+ while (*common && *common != '\\' && *common != '/')
+ --common;
+
+ bool foundNonSlash = false;
+ for (; common != baseEnd; ++common) {
+ if (*common != '\\' && *common != '/') {
+ if (foundNonSlash == false)
+ outString.append("..\\");
+ foundNonSlash = true;
+ } else
+ foundNonSlash = false;
+ }
+ if (inRelative < relativeEnd) {
+ if (outString.size() == 0)
+ outString.assign("./");
+ outString.append(inRelative);
+ }
+ NormalizePathT(outString);
+}
+}
+
+void CFileTools::NormalizePath(TStr &ioPath)
+{
+ NormalizePathT(ioPath);
+}
+
+void CFileTools::NormalizePath(eastl::string &ioPath)
+{
+ NormalizePathT(ioPath);
+}
+
+QString CFileTools::NormalizePathForQtUsage(const QString &path)
+{
+ // path can be a file path or a qrc URL string.
+
+ QString filePath = QDir::cleanPath(path);
+
+ filePath.replace(QLatin1Char('\\'), QLatin1Char('/'));
+
+ if (filePath.startsWith(QLatin1String("./")))
+ return filePath.mid(2);
+
+ if (filePath.startsWith(QLatin1String("qrc:/")))
+ return filePath.mid(3);
+ else
+ return filePath;
+}
+
+void CFileTools::CombineBaseAndRelative(const char8_t *inBase, const char8_t *inRelative,
+ TStr &outString)
+{
+ CombineBaseAndRelativeT(inBase, inRelative, outString);
+}
+
+void CFileTools::CombineBaseAndRelative(const char8_t *inBase, const char8_t *inRelative,
+ eastl::string &outString)
+{
+ CombineBaseAndRelativeT(inBase, inRelative, outString);
+}
+
+void CFileTools::GetRelativeFromBase(TStr &inBaseStr, TStr &inRelativeStr, TStr &outString)
+{
+ GetRelativeFromBaseT(inBaseStr, inRelativeStr, outString);
+}
+
+void CFileTools::GetRelativeFromBase(eastl::string &inBaseStr, eastl::string &inRelativeStr,
+ eastl::string &outString)
+{
+ GetRelativeFromBaseT(inBaseStr, inRelativeStr, outString);
+}
+
+bool CFileTools::RequiresCombineBaseAndRelative(const char8_t *inPath)
+{
+ if (inPath && *inPath)
+ return inPath[0] == '.';
+ return false;
+}
+
+template <typename TStrType>
+void ToPlatformPathT(TStrType &outString)
+{
+#ifndef EA_PLATFORM_WINDOWS
+ for (TStr::size_type pos = outString.find('\\'); pos != TStr::npos;
+ pos = outString.find('\\', pos + 1))
+ outString.replace(outString.begin() + pos, outString.begin() + pos + 1, "/");
+#else
+ (void)outString;
+#endif
+}
+
+void CFileTools::ToPlatformPath(TStr &outString)
+{
+ ToPlatformPathT(outString);
+}
+
+void CFileTools::ToPlatformPath(eastl::string &outString)
+{
+ ToPlatformPathT(outString);
+}
+
+CRegisteredString CFileTools::RemapPathToBinaryFormat(TStr &inPath, TStr &inPresentationDir,
+ TStr &ioWorkspaceStr,
+ IStringTable &inStringTable)
+{
+ GetRelativeFromBase(inPresentationDir, inPath, ioWorkspaceStr);
+ CRegisteredString theNewStr = inStringTable.RegisterStr(ioWorkspaceStr.c_str());
+ theNewStr.Remap(inStringTable.GetRemapMap());
+ return theNewStr;
+}
+
+CRegisteredString CFileTools::RemapPathFromBinaryFormat(CRegisteredString inPath,
+ const char8_t *inPresDir,
+ TStr &ioWorkspaceStr,
+ const CStrTableOrDataRef &inRef,
+ IStringTable &inStringTable)
+{
+ inPath.Remap(inRef);
+ if (RequiresCombineBaseAndRelative(inPath.c_str())) {
+ CombineBaseAndRelative(inPresDir, inPath, ioWorkspaceStr);
+ return inStringTable.RegisterStr(ioWorkspaceStr.c_str());
+ }
+ return inPath;
+}
+
+void CFileTools::GetDirectory(eastl::string &ioPath)
+{
+ eastl::string::size_type theSlashPos = ioPath.find_last_of("\\/");
+ if (theSlashPos == eastl::string::npos) {
+ ioPath.clear();
+ return;
+ }
+ ioPath.resize(theSlashPos);
+}
+
+bool CFileTools::DirectoryExists(const char8_t *inPath)
+{
+#ifdef EA_PLATFORM_WINDOWS
+ DWORD theAtts = GetFileAttributesA(inPath);
+ return theAtts != INVALID_FILE_ATTRIBUTES && (theAtts & FILE_ATTRIBUTE_DIRECTORY);
+#else // Posix style check for directory
+ int status;
+ struct stat st_buf;
+ status = stat(inPath, &st_buf);
+ if (status == 0 && S_ISDIR(st_buf.st_mode))
+ return true;
+ return false;
+#endif
+}
+
+bool CFileTools::FileExists(const char8_t *inPath)
+{
+#ifdef EA_PLATFORM_WINDOWS
+ DWORD theAtts = GetFileAttributesA(inPath);
+ return theAtts != INVALID_FILE_ATTRIBUTES;
+#else // Posix style check for directory
+ int status;
+ struct stat st_buf;
+ status = stat(inPath, &st_buf);
+ if (status == 0)
+ return true;
+ return false;
+#endif
+}
+
+eastl::string CFileTools::GetFileOrAssetPath(const char8_t *inPath)
+{
+ QFile tmp(inPath);
+ if (tmp.exists())
+ return inPath;
+ return eastl::string("assets:/") + inPath;
+}
+
+void CFileTools::SetStreamPosition(QIODevice& device, qint64 inOffset,
+ qt3ds::foundation::SeekPosition::Enum inEnum)
+{
+ if (inEnum == qt3ds::foundation::SeekPosition::Begin)
+ device.seek(inOffset);
+ else if (inEnum == qt3ds::foundation::SeekPosition::Current)
+ device.seek(device.pos() + inOffset);
+ else if (inEnum == qt3ds::foundation::SeekPosition::End)
+ device.seek(device.size() + inOffset);
+}
+
+void CFileTools::GetExtension(const char8_t *inPath, eastl::string &outExt)
+{
+ outExt.assign(nonNull(inPath));
+ size_t dotPos = outExt.find_last_of('.');
+ if (dotPos != eastl::string::npos)
+ outExt.erase(outExt.begin(), outExt.begin() + dotPos + 1);
+}
+
+void CFileTools::Split(const char8_t *inPath, eastl::string &outDir, eastl::string &outFileStem,
+ eastl::string &outExtension)
+{
+ outDir.assign(nonNull(inPath));
+ NormalizePath(outDir);
+ outFileStem = outDir;
+ GetDirectory(outDir);
+ size_t lenDiff = outFileStem.size() - outDir.size();
+ if (lenDiff > 0) {
+ if (outDir.size())
+ outFileStem = outFileStem.substr(outDir.size() + 1);
+
+ eastl::string::size_type lastDot = outFileStem.find_last_of('.');
+ if (lastDot != eastl::string::npos) {
+ outExtension = outFileStem.substr(lastDot + 1);
+ outFileStem.resize(lastDot);
+ }
+ }
+}
+
+#ifdef EA_PLATFORM_WINDOWS
+void CFileTools::GetDirectoryEntries(const eastl::string &inPath,
+ eastl::vector<eastl::string> &outFiles)
+{
+ if (inPath.size() == 0)
+ return;
+ eastl::string tempPath(inPath);
+ NormalizePath(tempPath);
+ for (eastl::string::size_type pos = tempPath.find_first_of('/'); pos != eastl::string::npos;
+ pos = tempPath.find_first_of('/', pos + 1))
+ tempPath[pos] = '\\';
+ if (tempPath.back() != '\\')
+ tempPath.append("\\");
+ tempPath.append(1, '*');
+ WIN32_FIND_DATAA ffd;
+ HANDLE hFind = FindFirstFileA(tempPath.c_str(), &ffd);
+ outFiles.clear();
+ if (INVALID_HANDLE_VALUE == hFind)
+ return;
+
+ do {
+ if (strcmp(ffd.cFileName, ".") == 0 || strcmp(ffd.cFileName, "..") == 0)
+ continue;
+ outFiles.push_back(eastl::string(ffd.cFileName));
+ } while (FindNextFileA(hFind, &ffd) != 0);
+}
+#else
+void CFileTools::GetDirectoryEntries(const eastl::string &inPath,
+ eastl::vector<eastl::string> &outFiles)
+{
+ if (inPath.size() == 0)
+ return;
+ eastl::string tempPath(inPath);
+ NormalizePath(tempPath);
+ struct dirent *dent;
+ DIR *srcdir = opendir(tempPath.c_str());
+ if (srcdir) {
+ while ((dent = readdir(srcdir)) != NULL) {
+ if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0)
+ continue;
+ outFiles.push_back(eastl::string(dent->d_name));
+ }
+ closedir(srcdir);
+ }
+}
+#endif
+
+bool CFileTools::CreateDir(const eastl::string &inPath, bool inRecurse)
+{
+ if (DirectoryExists(inPath.c_str()))
+ return true;
+
+ eastl::string temp(inPath);
+ GetDirectory(temp);
+ if (temp.size() && !DirectoryExists(temp.c_str())) {
+ if (inRecurse)
+ CreateDir(temp, inRecurse);
+ else
+ return false;
+ }
+
+#ifdef EA_PLATFORM_WINDOWS
+ BOOL result = CreateDirectoryA(inPath.c_str(), NULL);
+ return result != 0;
+#else
+ int result = mkdir(inPath.c_str(), 0777);
+ return result == 0;
+#endif
+}
+
+void CFileTools::AppendDirectoryInPathToFile(eastl::string &ioPath, const char8_t *dirName)
+{
+ eastl::string::size_type lastSlash = ioPath.find_last_of("\\/");
+ if (lastSlash != eastl::string::npos) {
+ if (dirName == NULL)
+ dirName = ""; // avoid crashes on null strings
+ ioPath.insert(lastSlash + 1, "/");
+ ioPath.insert(lastSlash + 1, dirName);
+ } else {
+ ioPath.insert(0, "/");
+ ioPath.insert(0, dirName);
+ }
+}
+
+void CFileTools::RemoveLastDirectoryInPathToFile(eastl::string &ioPath)
+{
+ eastl::string::size_type lastSlash = ioPath.find_last_of("\\/");
+ if (lastSlash != eastl::string::npos) {
+ eastl::string::size_type secondToLastSlash = ioPath.find_last_of("\\/", lastSlash - 1);
+ if (secondToLastSlash != eastl::string::npos)
+ ioPath = ioPath.erase(secondToLastSlash, lastSlash - secondToLastSlash);
+ }
+}
+
+void CFileTools::SetExtension(eastl::string &ioPath, const char8_t *inExt)
+{
+ eastl::string::size_type thePos = ioPath.find_last_of(".");
+ if (thePos != eastl::string::npos) {
+ ++thePos;
+ ioPath = ioPath.replace(thePos, ioPath.size() - thePos, inExt);
+ }
+}
diff --git a/src/foundation/FileTools.h b/src/foundation/FileTools.h
new file mode 100644
index 0000000..5745525
--- /dev/null
+++ b/src/foundation/FileTools.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_FILE_TOOLS_H
+#define QT3DS_FOUNDATION_FILE_TOOLS_H
+
+#include "EASTL/string.h"
+#include "EASTL/vector.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/StringTable.h"
+#include "foundation/IOStreams.h"
+#include <QtGlobal>
+
+QT_FORWARD_DECLARE_CLASS(QIODevice)
+
+namespace qt3ds {
+namespace foundation {
+
+ typedef eastl::basic_string<char8_t, ForwardingAllocator> TStr;
+
+ class CFileTools
+ {
+ public:
+ // Normalizes all slashes to be windows-like
+ static void NormalizePath(TStr &ioPath);
+ static void NormalizePath(eastl::string &ioPath);
+
+ // This is kind of the opposite of the 'NormalizePath' methods above in
+ // that it forces usage of unix style directory separators rather than
+ // windows separators. In addition, the path here can be a file path or
+ // a qrc URL string. This function will eventually be refactored away
+ // when we've converted to using Qt's file system abstraction throughout
+ // the code base and use QUrl's throughout instead of raw strings to
+ // represent resources.
+ static QString NormalizePathForQtUsage(const QString &path);
+
+ static void CombineBaseAndRelative(const char8_t *inBase, const char8_t *inRelative,
+ TStr &outString);
+ static void CombineBaseAndRelative(const char8_t *inBase, const char8_t *inRelative,
+ eastl::string &outString);
+
+ // inBase and inRelative will get normalized
+ // This algorithm changes based on the platform. On windows it is not case sensitive, on
+ // not-windows it is.
+ static void GetRelativeFromBase(TStr &inBase, TStr &inRelative, TStr &outString);
+ static void GetRelativeFromBase(eastl::string &inBase, eastl::string &inRelative,
+ eastl::string &outString);
+
+ // A remapped path is a file path that starts with a '.' or a '/'. GetRelativeFromBase
+ // *always*
+ // places a '.' or a '/' at the front of the path, so if you *know* the path came from
+ // GetRelativeFromBase then you also know this function returns true of GetRelativeFromBase
+ // actually generated a path that needs CombineBaseAndRelative.
+ static bool RequiresCombineBaseAndRelative(const char8_t *inPath);
+
+ // Search/replace so that all slashes are unix-like but only on non-windows platforms
+ // Assumes the incoming path has been normalized
+ static void ToPlatformPath(TStr &ioPath);
+ static void ToPlatformPath(eastl::string &ioPath);
+
+ static CRegisteredString RemapPathToBinaryFormat(TStr &inPath, TStr &inPresentationDir,
+ TStr &ioWorkspaceStr,
+ IStringTable &inStringTable);
+ static CRegisteredString RemapPathFromBinaryFormat(CRegisteredString inPath,
+ const char8_t *inPresDir,
+ TStr &ioWorkspaceStr,
+ const CStrTableOrDataRef &inRef,
+ IStringTable &inStringTable);
+ // I
+ static void GetDirectory(eastl::string &ioPath);
+ static bool DirectoryExists(const char8_t *inPath);
+ static void GetExtension(const char8_t *inPath, eastl::string &outExt);
+ static void Split(const char8_t *inPath, eastl::string &outDir, eastl::string &outFileStem,
+ eastl::string &outExtension);
+
+ // Only implemented for windows. Does not return '.' and '..' special entries
+ // inPath is mangled in a platform specific way
+ static void GetDirectoryEntries(const eastl::string &inPath,
+ eastl::vector<eastl::string> &outFiles);
+
+ static bool CreateDir(const eastl::string &inPath, bool inRecurse = true);
+
+ // Given a/b.txt, we will end up with a/dirName/b.txt
+ static void AppendDirectoryInPathToFile(eastl::string &ioPath, const char8_t *dirName);
+ static void RemoveLastDirectoryInPathToFile(eastl::string &ioPath);
+
+ static void SetExtension(eastl::string &ioPath, const char8_t *inExt);
+
+ static bool FileExists(const char8_t *inPath);
+ static eastl::string GetFileOrAssetPath(const char8_t *inPath);
+ static void SetStreamPosition(QIODevice& device, qint64 inOffset,
+ qt3ds::foundation::SeekPosition::Enum inEnum);
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/IOStreams.cpp b/src/foundation/IOStreams.cpp
new file mode 100644
index 0000000..f1adfbc
--- /dev/null
+++ b/src/foundation/IOStreams.cpp
@@ -0,0 +1,384 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/IOStreams.h"
+#include "foundation/FileTools.h"
+#include "foundation/StrConvertUTF.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSThread.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+
+using namespace qt3ds::foundation;
+
+#ifndef _WIN32
+
+inline int _fseeki64(FILE *inFile, int64_t pos, int seekFlags)
+{
+ return fseek(inFile, (int32_t)pos, seekFlags);
+}
+
+inline int64_t _ftelli64(FILE *inFile)
+{
+ return ftell(inFile);
+}
+
+#endif
+
+CFileSeekableIOStream::CFileSeekableIOStream(const char *inFileName, FileOpenFlags inFlags)
+{
+ openFile(QString(inFileName), inFlags);
+}
+
+#ifdef WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T
+
+CFileSeekableIOStream::CFileSeekableIOStream(const wchar_t *inFileName, FileOpenFlags inFlags)
+{
+ openFile(QString::fromWCharArray(inFileName), inFlags);
+}
+
+#endif
+
+CFileSeekableIOStream::CFileSeekableIOStream(const char16_t *inWideName, FileOpenFlags inFlags)
+{
+ openFile(QString::fromUtf16(inWideName), inFlags);
+}
+
+CFileSeekableIOStream::CFileSeekableIOStream(const QString &inFIle, FileOpenFlags inFlags)
+{
+ openFile(inFIle, inFlags);
+}
+
+void CFileSeekableIOStream::openFile(const QString &path, FileOpenFlags inFlags)
+{
+ if (path.isEmpty())
+ return;
+
+ QIODevice::OpenMode fileFlags = QIODevice::ReadOnly;
+ if (inFlags & FileOpenFlagValues::Write)
+ fileFlags = QIODevice::ReadWrite;
+ if (inFlags & FileOpenFlagValues::Truncate)
+ fileFlags |= QIODevice::Truncate;
+
+ m_File.setFileName(CFileTools::NormalizePathForQtUsage(path));
+ if (!m_File.open(fileFlags)) {
+ qCCritical(INTERNAL_ERROR) << "failed to open file"
+ << path << "with error" << m_File.errorString();
+ QT3DS_ASSERT(false);
+ }
+}
+
+CFileSeekableIOStream::~CFileSeekableIOStream()
+{
+ m_File.close();
+}
+
+bool CFileSeekableIOStream::IsOpen()
+{
+ return m_File.isOpen();
+}
+
+void CFileSeekableIOStream::SetPosition(QT3DSI64 inOffset, SeekPosition::Enum inEnum)
+{
+ if (inOffset > QT3DS_MAX_I32 || inOffset < QT3DS_MIN_I32) {
+ qCCritical(INVALID_OPERATION, "Attempt to seek further than platform allows");
+ QT3DS_ASSERT(false);
+ return;
+ } else {
+ CFileTools::SetStreamPosition(m_File, inOffset, inEnum);
+ }
+}
+
+QT3DSI64 CFileSeekableIOStream::GetPosition() const
+{
+ return m_File.pos();
+}
+
+QT3DSU32 CFileSeekableIOStream::Read(NVDataRef<QT3DSU8> data)
+{
+ return m_File.read((char *)data.begin(), data.size());
+}
+
+bool CFileSeekableIOStream::Write(NVConstDataRef<QT3DSU8> data)
+{
+ if (!m_File.isOpen()) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ qint64 numBytes = m_File.write((char*)data.begin(), data.size());
+ return numBytes == data.size();
+}
+
+CMemorySeekableIOStream::CMemorySeekableIOStream(NVAllocatorCallback &inAlloc,
+ const char *inAllocName)
+ : m_Allocator(inAlloc)
+ , m_AllocationName(inAllocName)
+ , m_Data(NULL)
+ , m_Size(0)
+ , m_Offset(0)
+ , m_Capacity(0)
+{
+}
+
+CMemorySeekableIOStream::~CMemorySeekableIOStream()
+{
+ if (m_Data)
+ m_Allocator.deallocate(m_Data);
+ m_Data = NULL;
+ m_Size = 0;
+ m_Capacity = 0;
+ m_Offset = 0;
+}
+
+void CMemorySeekableIOStream::SetPosition(QT3DSI64 inOffset, SeekPosition::Enum inEnum)
+{
+ QT3DSI64 startPos = 0;
+
+ switch (inEnum) {
+ case SeekPosition::Begin:
+ startPos = 0;
+ break;
+ case SeekPosition::Current:
+ startPos = m_Offset;
+ break;
+ case SeekPosition::End:
+ startPos = m_Size;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ startPos += inOffset;
+ if (m_Size == 0 && inOffset != 0) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (startPos < 0) {
+ QT3DS_ASSERT(false);
+ startPos = 0;
+ }
+ if (startPos >= m_Size && startPos != 0) {
+ QT3DS_ASSERT(false);
+ startPos = m_Size - 1;
+ }
+ m_Offset = static_cast<QT3DSU32>(startPos);
+}
+
+QT3DSU32 CMemorySeekableIOStream::Read(NVDataRef<QT3DSU8> data)
+{
+ if (m_Data == NULL)
+ return 0;
+ QT3DSU32 amountLeft = m_Size - m_Offset;
+ QT3DSU32 numBytes = NVMin(amountLeft, data.size());
+ intrinsics::memCopy(data.begin(), m_Data + m_Offset, numBytes);
+ m_Offset += numBytes;
+ return numBytes;
+}
+
+bool CMemorySeekableIOStream::Write(NVConstDataRef<QT3DSU8> data)
+{
+ reserve(data.size() + m_Offset);
+ intrinsics::memCopy(m_Data + m_Offset, data.begin(), data.size());
+ m_Offset += data.size();
+ m_Size = NVMax(m_Size, m_Offset);
+ return true;
+}
+
+void CMemorySeekableIOStream::reserve(QT3DSU32 inNewSize)
+{
+ if (inNewSize > m_Capacity) {
+ if (inNewSize < 100000)
+ inNewSize *= 2;
+ QT3DSU8 *newData =
+ (QT3DSU8 *)m_Allocator.allocate(inNewSize, m_AllocationName, __FILE__, __LINE__);
+ if (m_Size) {
+ intrinsics::memCopy(newData, m_Data, m_Size);
+ m_Allocator.deallocate(m_Data);
+ }
+ m_Data = newData;
+ m_Capacity = inNewSize;
+ }
+}
+
+namespace {
+
+struct WriteBufferedStreamImpl;
+struct WriteBufferThread : public Thread
+{
+ // When a buffer is available
+ WriteBufferedStreamImpl &m_Impl;
+ WriteBufferThread(NVFoundationBase &fnd, WriteBufferedStreamImpl &i)
+ : Thread(fnd)
+ , m_Impl(i)
+ {
+ setName("WriteBufferThread");
+ }
+ void execute() override;
+};
+
+#ifdef _WIN32
+#pragma warning(disable : 4355)
+#endif
+/* Double buffered stream implementation with a sending thread constantly
+ * pulling data from the main thread and writing it out to socket.
+ */
+struct WriteBufferedStreamImpl : public WriteBufferedOutStream
+{
+ NVFoundationBase &m_Foundation;
+ IOutStream &m_Stream;
+ MemoryBuffer<> m_Buf1;
+ MemoryBuffer<> m_Buf2;
+ MemoryBuffer<> *m_CurrentBuffer;
+ MemoryBuffer<> *m_WriteBuffer;
+ QT3DSU32 m_BufferSize;
+ volatile bool m_StreamValid;
+ Mutex m_BufferLock;
+ Sync m_DataAvailable;
+ Sync m_WriteFinished;
+ WriteBufferThread m_Thread;
+ QT3DSI32 mRefCount;
+
+ WriteBufferedStreamImpl(NVFoundationBase &fnd, QT3DSU32 totalBufSize, IOutStream &s)
+ : m_Foundation(fnd)
+ , m_Stream(s)
+ , m_Buf1(ForwardingAllocator(fnd.getAllocator(), "WriteBufferedStreamImpl::buffer"))
+ , m_Buf2(ForwardingAllocator(fnd.getAllocator(), "WriteBufferedStreamImpl::buffer"))
+ , m_CurrentBuffer(&m_Buf1)
+ , m_WriteBuffer(NULL)
+ , m_BufferSize(totalBufSize / 2)
+ , m_StreamValid(true)
+ , m_BufferLock(fnd.getAllocator())
+ , m_DataAvailable(fnd.getAllocator())
+ , m_WriteFinished(fnd.getAllocator())
+ , m_Thread(fnd, *this)
+ , mRefCount(0)
+ {
+ m_Buf1.reserve(m_BufferSize);
+ m_Buf2.reserve(m_BufferSize);
+ }
+ ~WriteBufferedStreamImpl()
+ {
+ m_Thread.signalQuit();
+ m_DataAvailable.set();
+ m_Thread.waitForQuit();
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ bool Write(NVConstDataRef<QT3DSU8> data) override
+ {
+ while (data.size() && m_StreamValid) {
+ QT3DSU32 currentBufferSize;
+ QT3DSU32 amountCanWrite;
+ {
+ Mutex::ScopedLock locker(m_BufferLock);
+ currentBufferSize = m_CurrentBuffer->size();
+ amountCanWrite = NVMin(data.size(), m_BufferSize - currentBufferSize);
+ m_CurrentBuffer->write(data.begin(), amountCanWrite);
+ currentBufferSize += amountCanWrite;
+ }
+ m_DataAvailable.set();
+ if (currentBufferSize == m_BufferSize) {
+ m_WriteFinished.wait();
+ m_WriteFinished.reset();
+ // Blocking call if we are already sending data.
+ data = NVConstDataRef<QT3DSU8>(data.begin() + amountCanWrite,
+ data.size() - amountCanWrite);
+ }
+ }
+ return m_StreamValid;
+ }
+
+ IOutStream &wrappedStream() override { return m_Stream; }
+
+ QT3DSU32 getTotalBufferSize()
+ {
+ Mutex::ScopedLock locker(m_BufferLock);
+ QT3DSU32 retval = m_CurrentBuffer->size();
+ if (m_WriteBuffer)
+ retval += m_WriteBuffer->size();
+ return retval;
+ }
+
+ QT3DSU32 getWriteBufferSize()
+ {
+ Mutex::ScopedLock locker(m_BufferLock);
+ if (m_WriteBuffer)
+ return m_WriteBuffer->size();
+ return 0;
+ }
+
+ void flush() override
+ {
+ while (getTotalBufferSize()) {
+ m_WriteFinished.wait();
+ m_WriteFinished.reset();
+ }
+ }
+};
+
+void WriteBufferThread::execute()
+{
+ while (!quitIsSignalled()) {
+ m_Impl.m_DataAvailable.wait();
+
+ if (!quitIsSignalled() && m_Impl.m_StreamValid) {
+ m_Impl.m_DataAvailable.reset();
+ {
+ Mutex::ScopedLock locker(m_Impl.m_BufferLock);
+ m_Impl.m_WriteBuffer = m_Impl.m_CurrentBuffer;
+ m_Impl.m_CurrentBuffer =
+ m_Impl.m_CurrentBuffer == &m_Impl.m_Buf1 ? &m_Impl.m_Buf2 : &m_Impl.m_Buf1;
+ QT3DS_ASSERT(m_Impl.m_WriteBuffer != m_Impl.m_CurrentBuffer);
+ }
+ NVConstDataRef<QT3DSU8> dataBuffer(*m_Impl.m_WriteBuffer);
+ if (dataBuffer.size()) {
+ m_Impl.m_StreamValid = m_Impl.m_Stream.Write(dataBuffer);
+ {
+ Mutex::ScopedLock locker(m_Impl.m_BufferLock);
+ m_Impl.m_WriteBuffer->clear();
+ m_Impl.m_WriteBuffer = NULL;
+ }
+ }
+ m_Impl.m_WriteFinished.set();
+ }
+ }
+ quit();
+}
+}
+
+NVScopedRefCounted<WriteBufferedOutStream>
+WriteBufferedOutStreamCreate(NVFoundationBase &fnd, IOutStream &stream, QT3DSU32 totalBufferSize)
+{
+ return QT3DS_NEW(fnd.getAllocator(), WriteBufferedStreamImpl)(fnd, totalBufferSize, stream);
+}
diff --git a/src/foundation/IOStreams.h b/src/foundation/IOStreams.h
new file mode 100644
index 0000000..855e520
--- /dev/null
+++ b/src/foundation/IOStreams.h
@@ -0,0 +1,278 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_IO_STREAMS_H
+#define QT3DS_FOUNDATION_IO_STREAMS_H
+
+#include "EABase/eabase.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/TrackingAllocator.h"
+#include "foundation/Qt3DSMath.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/Utils.h"
+#include "foundation/Qt3DSRefCounted.h"
+
+#include <QFile>
+#include <QString>
+
+namespace qt3ds {
+class NVFoundationBase;
+
+namespace foundation {
+
+ class IOutStream
+ {
+ protected:
+ virtual ~IOutStream() {}
+ public:
+ virtual bool Write(NVConstDataRef<QT3DSU8> data) = 0;
+ void WriteWithLen(NVConstDataRef<QT3DSU8> data)
+ {
+ Write(data.size());
+ Write(data);
+ }
+ template <typename TDataType>
+ void Write(const TDataType &type)
+ {
+ Write(toU8ConstDataRef(type));
+ }
+ template <typename TDataType>
+ void Write(const TDataType *data, QT3DSU32 numItems)
+ {
+ Write(toU8ConstDataRef(data, numItems));
+ }
+ void Write(const wchar_t *data)
+ {
+ if (data == NULL)
+ data = L"";
+ // Write the null character at the end of the string.
+ // This just makes reading and debugging a lot less error prone.
+ // at the expense of 2 bytes.
+ Write(data, (QT3DSU32)StrLen(data) + 1);
+ }
+ template <typename TDataType>
+ void WriteWithLen(const TDataType *data, QT3DSU32 numItems)
+ {
+ WriteWithLen(toU8ConstDataRef(data, numItems));
+ }
+ };
+
+ class IInStream
+ {
+ protected:
+ virtual ~IInStream() {}
+ public:
+ // Semantics are precisely that you return the amount read
+ virtual QT3DSU32 Read(NVDataRef<QT3DSU8> data) = 0;
+
+ QT3DSU32 SafeRead(NVDataRef<QT3DSU8> data)
+ {
+ QT3DSU32 amountRead = Read(data);
+ QT3DS_ASSERT(amountRead == data.size());
+ if (amountRead < data.size())
+ intrinsics::memZero(data.begin() + amountRead, data.size() - amountRead);
+ return amountRead;
+ }
+ QT3DSU32 ReadWithLen(NVDataRef<QT3DSU8> data)
+ {
+ QT3DSU32 len = 0;
+ Read(len);
+ return SafeRead(toDataRef(data.begin(), len));
+ }
+ template <typename TDataType>
+ QT3DSU32 Read(TDataType &type)
+ {
+ return SafeRead(toU8DataRef(type));
+ }
+ template <typename TDataType>
+ QT3DSU32 Read(TDataType *data, QT3DSU32 numItems)
+ {
+ return SafeRead(toU8DataRef(data, numItems));
+ }
+ };
+
+ struct SeekPosition
+ {
+ enum Enum {
+ Unknown,
+ Begin,
+ Current,
+ End,
+ };
+ };
+
+ class ISeekable
+ {
+ protected:
+ virtual ~ISeekable() {}
+ public:
+ virtual void SetPosition(QT3DSI64 inOffset, SeekPosition::Enum inEnum) = 0;
+ virtual QT3DSI64 GetPosition() const = 0;
+ virtual QT3DSI64 GetLength() const
+ {
+ ISeekable &seekable(const_cast<ISeekable &>(*this));
+ QT3DSI64 currentPos(GetPosition());
+ seekable.SetPosition(0, SeekPosition::End);
+ QT3DSI64 retval(GetPosition());
+ seekable.SetPosition(currentPos, SeekPosition::Begin);
+ return retval;
+ }
+ };
+
+ class ISeekableIOStream : public IInStream, public IOutStream, public ISeekable
+ {
+ };
+
+ struct FileOpenFlagValues
+ {
+ enum Enum {
+ Open = 1, // Without this flag, function fails if file exists
+ Truncate = 1 << 1, // Truncate the file so an immediate close will empty it.
+ Create = 1 << 2,
+ Write = 1 << 3,
+ };
+ };
+
+ typedef NVFlags<FileOpenFlagValues::Enum, int> FileOpenFlags;
+
+ static inline FileOpenFlags FileReadFlags() { return FileOpenFlags(FileOpenFlagValues::Open); }
+
+ static inline FileOpenFlags FileWriteFlags()
+ {
+ return FileOpenFlags(FileOpenFlagValues::Create | FileOpenFlagValues::Open
+ | FileOpenFlagValues::Write | FileOpenFlagValues::Truncate);
+ }
+ static inline FileOpenFlags FileAppendFlags()
+ {
+ return FileOpenFlags(FileOpenFlagValues::Create | FileOpenFlagValues::Open
+ | FileOpenFlagValues::Write);
+ }
+
+ class CFileSeekableIOStream : public ISeekableIOStream
+ {
+ protected:
+ QFile m_File;
+
+ public:
+ // Enabling append also enables reading from the file while being able to
+ // write to it.
+ CFileSeekableIOStream(const char *inFile, FileOpenFlags inFlags);
+#ifdef WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T
+ CFileSeekableIOStream(const wchar_t *inFile, FileOpenFlags inFlags);
+#endif
+
+ CFileSeekableIOStream(const char16_t *inFile, FileOpenFlags inFlags);
+ CFileSeekableIOStream(const QString &inFIle, FileOpenFlags inFlags);
+ virtual ~CFileSeekableIOStream();
+ virtual bool IsOpen();
+ void SetPosition(QT3DSI64 inOffset, SeekPosition::Enum inEnum) override;
+ QT3DSI64 GetPosition() const override;
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override;
+ bool Write(NVConstDataRef<QT3DSU8> data) override;
+
+ private:
+ void openFile(const QString &path, FileOpenFlags inFlags);
+ };
+
+ class CMemorySeekableIOStream : public ISeekableIOStream
+ {
+ protected:
+ NVAllocatorCallback &m_Allocator;
+ const char *m_AllocationName;
+ QT3DSU8 *m_Data;
+ QT3DSU32 m_Size;
+ QT3DSU32 m_Offset;
+ QT3DSU32 m_Capacity;
+
+ public:
+ CMemorySeekableIOStream(NVAllocatorCallback &inAlloc, const char *inAllocName);
+ virtual ~CMemorySeekableIOStream();
+ void SetPosition(QT3DSI64 inOffset, SeekPosition::Enum inEnum) override;
+ QT3DSI64 GetPosition() const override { return m_Offset; }
+ QT3DSI64 GetLength() const override { return m_Size; }
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override;
+ bool Write(NVConstDataRef<QT3DSU8> data) override;
+
+ // Add in the standard container functions
+ QT3DSU8 *begin() { return m_Data; }
+ QT3DSU8 *end() { return m_Data + m_Size; }
+ const QT3DSU8 *begin() const { return m_Data; }
+ const QT3DSU8 *end() const { return m_Data + m_Size; }
+ void clear()
+ {
+ m_Offset = 0;
+ m_Size = 0;
+ }
+ QT3DSU32 size() const { return m_Size; }
+ void reserve(QT3DSU32 inNewSize);
+ void resize(QT3DSU32 inNewSize)
+ {
+ reserve(inNewSize);
+ m_Size = inNewSize;
+ }
+ };
+
+ // Simple, one way input stream.
+ struct SMemoryInStream : public IInStream
+ {
+ const QT3DSU8 *m_Begin;
+ const QT3DSU8 *m_End;
+ SMemoryInStream(const QT3DSU8 *b, const QT3DSU8 *e)
+ : m_Begin(b)
+ , m_End(e)
+ {
+ }
+
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override
+ {
+ size_t available = m_End - m_Begin;
+ size_t requested = data.size();
+ size_t amount = NVMin(available, requested);
+ qt3ds::intrinsics::memCopy(data.mData, m_Begin, (QT3DSU32)amount);
+ m_Begin += amount;
+ return (QT3DSU32)amount;
+ }
+ };
+
+ class WriteBufferedOutStream : public IOutStream, public NVRefCounted
+ {
+ public:
+ virtual IOutStream &wrappedStream() = 0;
+ virtual void flush() = 0;
+
+ static NVScopedRefCounted<WriteBufferedOutStream>
+ Create(NVFoundationBase &fnd, IOutStream &stream, QT3DSU32 totalBufferSize = 128 * 1024);
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/LICENCE_SOCKET.TXT b/src/foundation/LICENCE_SOCKET.TXT
new file mode 100644
index 0000000..9b9ab80
--- /dev/null
+++ b/src/foundation/LICENCE_SOCKET.TXT
@@ -0,0 +1,20 @@
+LuaSocket 3.0 license
+Copyright (C) 2004-2013 Diego Nehab
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/src/foundation/LICENSE_CONVERTUTF.TXT b/src/foundation/LICENSE_CONVERTUTF.TXT
new file mode 100644
index 0000000..254acdf
--- /dev/null
+++ b/src/foundation/LICENSE_CONVERTUTF.TXT
@@ -0,0 +1,19 @@
+Copyright 2001-2004 Unicode, Inc.
+
+Disclaimer
+
+This source code is provided as is by Unicode, Inc. No claims are
+made as to fitness for any particular purpose. No warranties of any
+kind are expressed or implied. The recipient agrees to determine
+applicability of information provided. If this file has been
+purchased on magnetic or optical media from Unicode, Inc., the
+sole remedy for any claim will be exchange of defective media
+within 90 days of receipt.
+
+Limitations on Rights to Redistribute This Code
+
+Unicode, Inc. hereby grants the right to freely use the information
+supplied in this file in the creation of products supporting the
+Unicode Standard, and to make copies of this file in any form
+for internal or external distribution as long as this notice
+remains attached.
diff --git a/src/foundation/PoolingAllocator.h b/src/foundation/PoolingAllocator.h
new file mode 100644
index 0000000..9d939fd
--- /dev/null
+++ b/src/foundation/PoolingAllocator.h
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_FOUNDATION_POOLING_ALLOCATOR_H
+#define QT3DS_FOUNDATION_POOLING_ALLOCATOR_H
+#pragma once
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/AutoDeallocatorAllocator.h"
+#include "foundation/Qt3DSMutex.h"
+
+// Pooling allocator. Not designed for small allocations
+// starting at 64 bytes and up to 4 K, allocator uses pools.
+// Above that, uses default allocator. THis object is absolutely not threadsafe.
+// This addes 8 bytes to each allocation in order to safely track the allocation size.
+// There is no strict requirement to deallocate; this allocator automatically deallocates
+// anything allocated through it.
+namespace qt3ds {
+namespace foundation {
+ struct SPoolingAllocator : public NVAllocatorCallback
+ {
+ typedef Mutex TMutexType;
+ typedef Mutex::ScopedLock TLockType;
+
+ NVAllocatorCallback &m_Allocator;
+ TMutexType m_Mutex;
+
+ struct SAllocationTag
+ {
+ QT3DSU32 m_Tag;
+ size_t m_Size;
+ SAllocationTag(size_t inSize = 0)
+ : m_Tag(0xAB5534CD)
+ , m_Size(inSize)
+ {
+ }
+ };
+
+ template <size_t TObjSize>
+ struct SPoolObj
+ {
+ QT3DSU32 m_Buffer[TObjSize / 4];
+ SPoolObj() {}
+ };
+#define ITERATE_POOLING_ALLOCATOR_POOL_SIZES \
+ HANDLE_POOLING_ALLOCATOR_POOL_SIZE(64) \
+ HANDLE_POOLING_ALLOCATOR_POOL_SIZE(128) \
+ HANDLE_POOLING_ALLOCATOR_POOL_SIZE(256) \
+ HANDLE_POOLING_ALLOCATOR_POOL_SIZE(512) \
+ HANDLE_POOLING_ALLOCATOR_POOL_SIZE(1024)
+
+#define HANDLE_POOLING_ALLOCATOR_POOL_SIZE(sz) \
+ Pool<SPoolObj<sz>, ForwardingAllocator, 4> m_Pool##sz;
+ ITERATE_POOLING_ALLOCATOR_POOL_SIZES
+#undef HANDLE_POOLING_ALLOCATOR_POOL_SIZE
+
+ SSAutoDeallocatorAllocator m_LargeAllocator;
+
+#define HANDLE_POOLING_ALLOCATOR_POOL_SIZE(sz) \
+ , m_Pool##sz(ForwardingAllocator(inAllocator, "PoolingAllocatorPool"))
+
+ SPoolingAllocator(NVAllocatorCallback &inAllocator)
+ : m_Allocator(inAllocator)
+ , m_Mutex(inAllocator) ITERATE_POOLING_ALLOCATOR_POOL_SIZES
+ , m_LargeAllocator(inAllocator)
+ {
+ }
+#undef HANDLE_POOLING_ALLOCATOR_POOL_SIZE
+
+ void *doAllocateFromPool(size_t size)
+ {
+ TLockType locker(m_Mutex);
+
+#define HANDLE_POOLING_ALLOCATOR_POOL_SIZE(sz) \
+ if (size <= sz) \
+ return m_Pool##sz.allocate(__FILE__, __LINE__);
+ ITERATE_POOLING_ALLOCATOR_POOL_SIZES
+#undef HANDLE_POOLING_ALLOCATOR_POOL_SIZE
+
+ return m_LargeAllocator.allocate(size, "largetype", __FILE__, __LINE__, 0);
+ }
+
+ void *doAllocate(size_t size)
+ {
+ size += sizeof(SAllocationTag);
+ SAllocationTag *tag = reinterpret_cast<SAllocationTag *>(doAllocateFromPool(size));
+ new (tag) SAllocationTag(size);
+ QT3DSU8 *data = reinterpret_cast<QT3DSU8 *>(tag);
+ return data + sizeof(SAllocationTag);
+ }
+
+ void *allocate(size_t size, const char * /*typeName*/, const char * /*filename*/,
+ int /*line*/, int /*flags*/ = 0) override
+ {
+ return doAllocate(size);
+ }
+
+ void *allocate(size_t size, const char * /*typeName*/, const char * /*filename*/,
+ int /*line*/, size_t /*alignment*/, size_t /*alignmentOffset*/) override
+ {
+ return doAllocate(size);
+ }
+
+ /**
+ \brief Frees memory previously allocated by allocate().
+
+ <b>Threading:</b> This function should be thread safe as it can be called in the context of
+ the user thread
+ and physics processing thread(s).
+
+ \param ptr Memory to free.
+ */
+ void deallocate(void *ptr) override
+ {
+ TLockType locker(m_Mutex);
+
+ // Deallocate on null is fine.
+ if (ptr == NULL)
+ return;
+
+ SAllocationTag tempTag;
+ QT3DSU8 *dataPtr = reinterpret_cast<QT3DSU8 *>(ptr);
+ SAllocationTag *theTag =
+ reinterpret_cast<SAllocationTag *>(dataPtr - sizeof(SAllocationTag));
+ if (theTag->m_Tag != tempTag.m_Tag) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ size_t size = theTag->m_Size;
+
+ // We add this offset at allocation time
+ ptr = dataPtr - sizeof(SAllocationTag);
+
+#define HANDLE_POOLING_ALLOCATOR_POOL_SIZE(sz) \
+ if (size <= sz) { \
+ m_Pool##sz.deallocate(ptr); \
+ return; \
+ }
+ ITERATE_POOLING_ALLOCATOR_POOL_SIZES
+#undef HANDLE_POOLING_ALLOCATOR_POOL_SIZE
+ m_LargeAllocator.deallocate(ptr);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/PreAllocatedAllocator.h b/src/foundation/PreAllocatedAllocator.h
new file mode 100644
index 0000000..aea0357
--- /dev/null
+++ b/src/foundation/PreAllocatedAllocator.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_RENDER_PRE_ALLOCATED_ALLOCATOR_H
+#define QT3DS_RENDER_PRE_ALLOCATED_ALLOCATOR_H
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ // Ignores deallocate calls if they originate withing the pre-allocation block
+ struct SPreAllocatedAllocator : public NVAllocatorCallback
+ {
+ NVAllocatorCallback &m_Allocator;
+ NVDataRef<QT3DSU8> m_PreAllocatedBlock;
+ bool m_OwnsMemory; // then we attempt to deallocate on destruction
+
+ SPreAllocatedAllocator(NVAllocatorCallback &inAllocator)
+ : m_Allocator(inAllocator)
+ , m_OwnsMemory(false)
+ {
+ }
+
+ SPreAllocatedAllocator(NVAllocatorCallback &inAllocator, NVDataRef<QT3DSU8> inData,
+ bool inOwnsMemory)
+ : m_Allocator(inAllocator)
+ , m_PreAllocatedBlock(inData)
+ , m_OwnsMemory(inOwnsMemory)
+ {
+ }
+
+ virtual ~SPreAllocatedAllocator()
+ {
+ if (m_OwnsMemory)
+ m_Allocator.deallocate(m_PreAllocatedBlock.begin());
+ }
+
+ void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ int flags = 0) override
+ {
+ return m_Allocator.allocate(size, typeName, filename, line, flags);
+ }
+
+ void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ size_t alignment, size_t alignmentOffset) override
+ {
+ return m_Allocator.allocate(size, typeName, filename, line, alignment, alignmentOffset);
+ }
+
+ void deallocate(void *ptr) override
+ {
+ if (!ptr)
+ return;
+ if (ptr < m_PreAllocatedBlock.begin() || ptr >= m_PreAllocatedBlock.end())
+ m_Allocator.deallocate(ptr);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/Qt3DS.h b/src/foundation/Qt3DS.h
new file mode 100644
index 0000000..041923c
--- /dev/null
+++ b/src/foundation/Qt3DS.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_H
+#define QT3DS_H
+#include "EABase/eabase.h"
+#include "foundation/Qt3DSPreprocessor.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSAssert.h"
+
+namespace eastl {
+}
+
+namespace qt3ds {
+class NVEmpty
+{
+};
+class QT3DSMat33;
+class QT3DSMat44;
+class QT3DSVec2;
+class QT3DSVec3;
+class QT3DSVec4;
+class NVTransform;
+
+#if !defined QT3DS_DONT_PRAGMA_WARNINGS && defined EA_COMPILER_MSVC
+#pragma warning(disable : 4512) // assignment operator not generated
+#endif
+
+#define QT3DS_SIGN_BITMASK 0x80000000
+}
+
+#endif
diff --git a/src/foundation/Qt3DSAllocator.h b/src/foundation/Qt3DSAllocator.h
new file mode 100644
index 0000000..cdbbe5f
--- /dev/null
+++ b/src/foundation/Qt3DSAllocator.h
@@ -0,0 +1,195 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSALLOCATOR_H
+#define QT3DS_FOUNDATION_PSALLOCATOR_H
+
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+
+#if (defined(QT3DS_WINDOWS) | defined(QT3DS_X360))
+#include <typeinfo.h>
+#endif
+#if (defined(QT3DS_APPLE))
+#include <typeinfo>
+#endif
+
+#include <new>
+
+// Allocation macros going through user allocator
+#define QT3DS_ALLOC(alloc, n, name) alloc.allocate(n, name, __FILE__, __LINE__)
+#define QT3DS_ALLOC_TEMP(alloc, n, name) QT3DS_ALLOC(n, name)
+#define QT3DS_FREE(alloc, x) alloc.deallocate(x)
+#define QT3DS_FREE_AND_RESET(x) \
+{ \
+ QT3DS_FREE(x); \
+ x = 0; \
+ }
+
+// The following macros support plain-old-types and classes derived from UserAllocated.
+#define QT3DS_NEW(alloc, T) new (QT3DS_ALLOC(alloc, sizeof(T), #T)) T
+#define QT3DS_NEW_TEMP(alloc, T) QT3DS_NEW(alloc, T)
+#define QT3DS_DELETE_POD(x) \
+{ \
+ QT3DS_FREE(x); \
+ x = 0; \
+ }
+
+namespace qt3ds {
+namespace foundation {
+template <typename TObjType>
+inline void NVDelete(NVAllocatorCallback &alloc, TObjType *item)
+{
+ if (item) {
+ item->~TObjType();
+ alloc.deallocate(item);
+ }
+}
+}
+}
+
+//! placement new macro to make it easy to spot bad use of 'new'
+#define QT3DS_PLACEMENT_NEW(p, T) new (p) T
+
+// Don't use inline for alloca !!!
+#ifdef QT3DS_WINDOWS
+#include <malloc.h>
+#define NVAlloca(x) _alloca(x)
+#elif defined(QT3DS_LINUX) || defined(QT3DS_ANDROID) || defined(QT3DS_QNX)
+#if defined(__INTEGRITY)
+#include <alloca.h>
+#else
+#include <malloc.h>
+#endif
+#define NVAlloca(x) alloca(x)
+#elif defined(QT3DS_PSP2)
+#include <alloca.h>
+#define NVAlloca(x) alloca(x)
+#elif defined(QT3DS_APPLE)
+#include <stdlib.h>
+#include <alloca.h>
+#define NVAlloca(x) alloca(x)
+#elif defined(QT3DS_PS3)
+#include <alloca.h>
+#define NVAlloca(x) alloca(x)
+#elif defined(QT3DS_X360)
+#include <malloc.h>
+#define NVAlloca(x) _alloca(x)
+#elif defined(QT3DS_WII)
+#include <alloca.h>
+#define NVAlloca(x) alloca(x)
+#endif
+
+namespace qt3ds {
+namespace foundation {
+/*
+ * Bootstrap allocator using malloc/free.
+ * Don't use unless your objects get allocated before foundation is initialized.
+ */
+class RawAllocator
+{
+public:
+ RawAllocator(const char * = 0) {}
+ void *allocate(size_t size, const char *, int)
+ {
+#if defined(QT3DS_APPLE)
+ // malloc returns valid pointer for size==0, no need to check
+ return malloc(size);
+#else
+ // malloc returns valid pointer for size==0, no need to check
+ return ::malloc(size);
+#endif
+ }
+ void deallocate(void *ptr)
+ {
+#if defined(QT3DS_APPLE)
+ free(ptr);
+#else
+ // free(0) is guaranteed to have no side effect, no need to check
+ ::free(ptr);
+#endif
+ }
+};
+
+struct ForwardingAllocator
+{
+ NVAllocatorCallback *mAllocator;
+ const char *mTypeName;
+ ForwardingAllocator(const char *typeName)
+ : mTypeName(typeName)
+ {
+ }
+ ForwardingAllocator(NVAllocatorCallback &alloc, const char *typeName)
+ : mAllocator(&alloc)
+ , mTypeName(typeName)
+ {
+ }
+ ForwardingAllocator(NVAllocatorCallback *alloc = NULL)
+ : mAllocator(alloc)
+ , mTypeName("__error__")
+ {
+ QT3DS_ASSERT(false);
+ }
+ ForwardingAllocator(const ForwardingAllocator &other)
+ : mAllocator(other.mAllocator)
+ , mTypeName(other.mTypeName)
+ {
+ }
+ ForwardingAllocator &operator=(const ForwardingAllocator &other)
+ {
+ mAllocator = other.mAllocator;
+ mTypeName = other.mTypeName;
+ return *this;
+ }
+ bool operator==(const ForwardingAllocator &other) const
+ {
+ return mAllocator == other.mAllocator;
+ }
+ NVAllocatorCallback &getAllocator() { return *mAllocator; }
+ // flags are unused
+ void *allocate(size_t size, const char *filename, int line, int flags = 0)
+ {
+ return getAllocator().allocate(size, mTypeName, filename, line, flags);
+ }
+ void *allocate(size_t size, const char *filename, int line, size_t alignment,
+ size_t alignmentOffset)
+ {
+ return getAllocator().allocate(size, mTypeName, filename, line, alignment,
+ alignmentOffset);
+ }
+ void deallocate(void *ptr, size_t) { getAllocator().deallocate(ptr); }
+ void deallocate(void *ptr) { getAllocator().deallocate(ptr); }
+};
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSAllocatorCallback.h b/src/foundation/Qt3DSAllocatorCallback.h
new file mode 100644
index 0000000..ebbf819
--- /dev/null
+++ b/src/foundation/Qt3DSAllocatorCallback.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_ALLOCATOR_CALLBACK_H
+#define QT3DS_FOUNDATION_QT3DS_ALLOCATOR_CALLBACK_H
+
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DS.h"
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/**
+\brief Abstract base class for an application defined memory allocator that can be used by the NV
+library.
+
+\note The SDK state should not be modified from within any allocation/free function.
+
+<b>Threading:</b> All methods of this class should be thread safe as it can be called from the user
+thread
+or the physics processing thread(s).
+*/
+
+class NVAllocatorCallback
+{
+public:
+ /**
+ \brief destructor
+ */
+ virtual ~NVAllocatorCallback() {}
+
+ /**
+ \brief Allocates size bytes of memory, which must be 16-byte aligned.
+
+ This method should never return NULL. If you run out of memory, then
+ you should terminate the app or take some other appropriate action.
+
+ <b>Threading:</b> This function should be thread safe as it can be called in the context of the
+ user thread
+ and physics processing thread(s).
+
+ \param size Number of bytes to allocate.
+ \param typeName Name of the datatype that is being allocated
+ \param filename The source file which allocated the memory
+ \param line The source line which allocated the memory
+ \return The allocated block of memory.
+ */
+ virtual void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ int flags = 0) = 0;
+ virtual void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ size_t alignment, size_t alignmentOffset) = 0;
+
+ /**
+ \brief Frees memory previously allocated by allocate().
+
+ <b>Threading:</b> This function should be thread safe as it can be called in the context of the
+ user thread
+ and physics processing thread(s).
+
+ \param ptr Memory to free.
+ */
+ virtual void deallocate(void *ptr) = 0;
+};
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif
diff --git a/src/foundation/Qt3DSAssert.h b/src/foundation/Qt3DSAssert.h
new file mode 100644
index 0000000..a628159
--- /dev/null
+++ b/src/foundation/Qt3DSAssert.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_ASSERT_H
+#define QT3DS_ASSERT_H
+#include "foundation/Qt3DSPreprocessor.h"
+
+// Force the user to define the Qt3DSAssert function
+namespace qt3ds {
+void Qt3DSAssert(const char *exp, const char *file, int line, bool *ignore);
+}
+
+#ifdef __CUDACC__
+#define QT3DS_ASSERT(exp) ((void)0)
+#define QT3DS_ALWAYS_ASSERT_MESSAGE(exp) ((void)0)
+#else // __CUDACC__
+#ifndef NDEBUG
+#define QT3DS_ASSERT(exp) \
+ { \
+ static bool ignore = false; \
+ (void)((!!(exp)) || (qt3ds::Qt3DSAssert(#exp, __FILE__, __LINE__, &ignore), false)); \
+ }
+#else // NDEBUG
+#define QT3DS_ASSERT(exp) ((void)0)
+#endif // NDEBUG
+#define QT3DS_ALWAYS_ASSERT_MESSAGE(exp) \
+ { \
+ static bool ignore = false; \
+ (void)((qt3ds::Qt3DSAssert(exp, __FILE__, __LINE__, &ignore), false)); \
+ }
+#endif // __CUDACC__
+
+#define QT3DS_ALWAYS_ASSERT() QT3DS_ASSERT(0)
+
+#endif
diff --git a/src/foundation/Qt3DSAtomic.h b/src/foundation/Qt3DSAtomic.h
new file mode 100644
index 0000000..69c7d3b
--- /dev/null
+++ b/src/foundation/Qt3DSAtomic.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSATOMIC_H
+#define QT3DS_FOUNDATION_PSATOMIC_H
+
+#include "foundation/Qt3DS.h"
+
+namespace qt3ds {
+namespace foundation {
+ /* set *dest equal to val. Return the old value of *dest */
+ QT3DS_AUTOTEST_EXPORT QT3DSI32 atomicExchange(volatile QT3DSI32 *dest, QT3DSI32 val);
+
+ /* if *dest == comp, replace with exch. Return original value of *dest */
+ QT3DS_AUTOTEST_EXPORT QT3DSI32 atomicCompareExchange(volatile QT3DSI32 *dest, QT3DSI32 exch, QT3DSI32 comp);
+
+ /* if *dest == comp, replace with exch. Return original value of *dest */
+ QT3DS_AUTOTEST_EXPORT void *atomicCompareExchangePointer(volatile void **dest, void *exch,
+ void *comp);
+
+ /* increment the specified location. Return the incremented value */
+ QT3DS_AUTOTEST_EXPORT QT3DSI32 atomicIncrement(volatile QT3DSI32 *val);
+
+ /* decrement the specified location. Return the decremented value */
+ QT3DS_AUTOTEST_EXPORT QT3DSI32 atomicDecrement(volatile QT3DSI32 *val);
+
+ /* add delta to *val. Return the new value */
+ QT3DS_AUTOTEST_EXPORT QT3DSI32 atomicAdd(volatile QT3DSI32 *val, QT3DSI32 delta);
+
+ /* compute the maximum of dest and val. Return the new value */
+ QT3DS_AUTOTEST_EXPORT QT3DSI32 atomicMax(volatile QT3DSI32 *val, QT3DSI32 val2);
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSBasicTemplates.h b/src/foundation/Qt3DSBasicTemplates.h
new file mode 100644
index 0000000..f14c7b3
--- /dev/null
+++ b/src/foundation/Qt3DSBasicTemplates.h
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSBASICTEMPLATES_H
+#define QT3DS_FOUNDATION_PSBASICTEMPLATES_H
+
+#include "foundation/Qt3DS.h"
+
+namespace qt3ds {
+namespace foundation {
+ template <typename A>
+ struct Equal
+ {
+ bool operator()(const A &a, const A &b) const { return a == b; }
+ };
+
+ template <typename A>
+ struct Less
+ {
+ bool operator()(const A &a, const A &b) const { return a < b; }
+ };
+
+ template <typename A>
+ struct Greater
+ {
+ bool operator()(const A &a, const A &b) const { return a > b; }
+ };
+
+ template <class F, class S>
+ class Pair
+ {
+ public:
+ F first;
+ S second;
+ Pair()
+ : first(F())
+ , second(S())
+ {
+ }
+ Pair(const F &f, const S &s)
+ : first(f)
+ , second(s)
+ {
+ }
+ Pair(const Pair &p)
+ : first(p.first)
+ , second(p.second)
+ {
+ }
+ // CN - fix for /.../Qt3DSBasicTemplates.h(61) : warning C4512: 'nv::foundation::Pair<F,S>' :
+ // assignment operator could not be generated
+ Pair &operator=(const Pair &p)
+ {
+ first = p.first;
+ second = p.second;
+ return *this;
+ }
+ bool operator==(const Pair &p) const { return first == p.first && second == p.second; }
+ };
+
+ template <unsigned int A>
+ struct LogTwo
+ {
+ static const unsigned int value = LogTwo<(A >> 1)>::value + 1;
+ };
+ template <>
+ struct LogTwo<1>
+ {
+ static const unsigned int value = 0;
+ };
+
+ template <typename T>
+ struct UnConst
+ {
+ typedef T Type;
+ };
+ template <typename T>
+ struct UnConst<const T>
+ {
+ typedef T Type;
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSBounds3.h b/src/foundation/Qt3DSBounds3.h
new file mode 100644
index 0000000..fda4a6d
--- /dev/null
+++ b/src/foundation/Qt3DSBounds3.h
@@ -0,0 +1,443 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_BOUNDS3_H
+#define QT3DS_FOUNDATION_QT3DS_BOUNDS3_H
+
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DSTransform.h"
+#include "foundation/Qt3DSMat33.h"
+#include "foundation/Qt3DSMat44.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+typedef QT3DSVec3 TNVBounds2BoxPoints[8];
+
+/**
+\brief Class representing 3D range or axis aligned bounding box.
+
+Stored as minimum and maximum extent corners. Alternate representation
+would be center and dimensions.
+May be empty or nonempty. If not empty, minimum <= maximum has to hold.
+*/
+class NVBounds3
+{
+public:
+ /**
+ \brief Default constructor, not performing any initialization for performance reason.
+ \remark Use empty() function below to construct empty bounds.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3() {}
+
+ /**
+ \brief Construct from two bounding points
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3(const QT3DSVec3 &minimum, const QT3DSVec3 &maximum);
+
+ /**
+ \brief Return empty bounds.
+ */
+ static QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3 empty();
+
+ /**
+ \brief returns the AABB containing v0 and v1.
+ \param v0 first point included in the AABB.
+ \param v1 second point included in the AABB.
+ */
+ static QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3 boundsOfPoints(const QT3DSVec3 &v0,
+ const QT3DSVec3 &v1);
+
+ /**
+ \brief returns the AABB from center and extents vectors.
+ \param center Center vector
+ \param extent Extents vector
+ */
+ static QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3 centerExtents(const QT3DSVec3 &center,
+ const QT3DSVec3 &extent);
+
+ /**
+ \brief Construct from center, extent, and (not necessarily orthogonal) basis
+ */
+ static QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 basisExtent(const QT3DSVec3 &center,
+ const QT3DSMat33 &basis,
+ const QT3DSVec3 &extent);
+
+ /**
+ \brief Construct from pose and extent
+ */
+ static QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 poseExtent(const NVTransform &pose,
+ const QT3DSVec3 &extent);
+
+ /**
+ \brief gets the transformed bounds of the passed AABB (resulting in a bigger AABB).
+ \param[in] matrix Transform to apply, can contain scaling as well
+ \param[in] bounds The bounds to transform.
+ */
+ static QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 transform(const QT3DSMat33 &matrix,
+ const NVBounds3 &bounds);
+
+ /**
+ \brief gets the transformed bounds of the passed AABB (resulting in a bigger AABB).
+ \param[in] transform Transform to apply, can contain scaling as well
+ \param[in] bounds The bounds to transform.
+ */
+ static QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 transform(const NVTransform &transform,
+ const NVBounds3 &bounds);
+
+ /**
+ \brief Sets empty to true
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void setEmpty();
+
+ /**
+ \brief Sets infinite bounds
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void setInfinite();
+
+ /**
+ \brief expands the volume to include v
+ \param v Point to expand to.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void include(const QT3DSVec3 &v);
+
+ /**
+ \brief expands the volume to include b.
+ \param b Bounds to perform union with.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void include(const NVBounds3 &b);
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isEmpty() const;
+
+ /**
+ \brief indicates whether the intersection of this and b is empty or not.
+ \param b Bounds to test for intersection.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool intersects(const NVBounds3 &b) const;
+
+ /**
+ \brief computes the 1D-intersection between two AABBs, on a given axis.
+ \param a the other AABB
+ \param axis the axis (0, 1, 2)
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool intersects1D(const NVBounds3 &a, QT3DSU32 axis) const;
+
+ /**
+ \brief indicates if these bounds contain v.
+ \param v Point to test against bounds.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool contains(const QT3DSVec3 &v) const;
+
+ /**
+ \brief checks a box is inside another box.
+ \param box the other AABB
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isInside(const NVBounds3 &box) const;
+
+ /**
+ \brief returns the center of this axis aligned box.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 getCenter() const;
+
+ /**
+ \brief get component of the box's center along a given axis
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float getCenter(QT3DSU32 axis) const;
+
+ /**
+ \brief get component of the box's extents along a given axis
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float getExtents(QT3DSU32 axis) const;
+
+ /**
+ \brief returns the dimensions (width/height/depth) of this axis aligned box.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 getDimensions() const;
+
+ /**
+ \brief returns the extents, which are half of the width/height/depth.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 getExtents() const;
+
+ /**
+ \brief scales the AABB.
+ \param scale Factor to scale AABB by.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void scale(QT3DSF32 scale);
+
+ /**
+ fattens the AABB in all 3 dimensions by the given distance.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void fatten(NVReal distance);
+
+ /**
+ checks that the AABB values are not NaN
+ */
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isFinite() const;
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void expand(TNVBounds2BoxPoints &outPoints) const;
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void transform(const QT3DSMat44 &inMatrix);
+
+ QT3DSVec3 minimum, maximum;
+};
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3::NVBounds3(const QT3DSVec3 &minimum, const QT3DSVec3 &maximum)
+ : minimum(minimum)
+ , maximum(maximum)
+{
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3 NVBounds3::empty()
+{
+ return NVBounds3(QT3DSVec3(QT3DS_MAX_REAL), QT3DSVec3(-QT3DS_MAX_REAL));
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVBounds3::isFinite() const
+{
+ return minimum.isFinite() && maximum.isFinite();
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3 NVBounds3::boundsOfPoints(const QT3DSVec3 &v0,
+ const QT3DSVec3 &v1)
+{
+ return NVBounds3(v0.minimum(v1), v0.maximum(v1));
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVBounds3 NVBounds3::centerExtents(const QT3DSVec3 &center,
+ const QT3DSVec3 &extent)
+{
+ return NVBounds3(center - extent, center + extent);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 NVBounds3::basisExtent(const QT3DSVec3 &center,
+ const QT3DSMat33 &basis,
+ const QT3DSVec3 &extent)
+{
+ // extended basis vectors
+ QT3DSVec3 c0 = basis.column0 * extent.x;
+ QT3DSVec3 c1 = basis.column1 * extent.y;
+ QT3DSVec3 c2 = basis.column2 * extent.z;
+
+ QT3DSVec3 w;
+ // find combination of base vectors that produces max. distance for each component = sum of
+ // abs()
+ w.x = NVAbs(c0.x) + NVAbs(c1.x) + NVAbs(c2.x);
+ w.y = NVAbs(c0.y) + NVAbs(c1.y) + NVAbs(c2.y);
+ w.z = NVAbs(c0.z) + NVAbs(c1.z) + NVAbs(c2.z);
+
+ return NVBounds3(center - w, center + w);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 NVBounds3::poseExtent(const NVTransform &pose,
+ const QT3DSVec3 &extent)
+{
+ return basisExtent(pose.p, QT3DSMat33(pose.q), extent);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::setEmpty()
+{
+ minimum = QT3DSVec3(QT3DS_MAX_REAL);
+ maximum = QT3DSVec3(-QT3DS_MAX_REAL);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::setInfinite()
+{
+ minimum = QT3DSVec3(-QT3DS_MAX_REAL);
+ maximum = QT3DSVec3(QT3DS_MAX_REAL);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::include(const QT3DSVec3 &v)
+{
+ QT3DS_ASSERT(isFinite());
+ minimum = minimum.minimum(v);
+ maximum = maximum.maximum(v);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::include(const NVBounds3 &b)
+{
+ QT3DS_ASSERT(isFinite());
+ minimum = minimum.minimum(b.minimum);
+ maximum = maximum.maximum(b.maximum);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVBounds3::isEmpty() const
+{
+ QT3DS_ASSERT(isFinite());
+ // Consistency condition for (Min, Max) boxes: minimum < maximum
+ return minimum.x > maximum.x || minimum.y > maximum.y || minimum.z > maximum.z;
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVBounds3::intersects(const NVBounds3 &b) const
+{
+ QT3DS_ASSERT(isFinite() && b.isFinite());
+ return !(b.minimum.x > maximum.x || minimum.x > b.maximum.x || b.minimum.y > maximum.y
+ || minimum.y > b.maximum.y || b.minimum.z > maximum.z || minimum.z > b.maximum.z);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVBounds3::intersects1D(const NVBounds3 &a, QT3DSU32 axis) const
+{
+ QT3DS_ASSERT(isFinite() && a.isFinite());
+ return maximum[axis] >= a.minimum[axis] && a.maximum[axis] >= minimum[axis];
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVBounds3::contains(const QT3DSVec3 &v) const
+{
+ QT3DS_ASSERT(isFinite());
+
+ return !(v.x < minimum.x || v.x > maximum.x || v.y < minimum.y || v.y > maximum.y
+ || v.z < minimum.z || v.z > maximum.z);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVBounds3::isInside(const NVBounds3 &box) const
+{
+ QT3DS_ASSERT(isFinite() && box.isFinite());
+ if (box.minimum.x > minimum.x)
+ return false;
+ if (box.minimum.y > minimum.y)
+ return false;
+ if (box.minimum.z > minimum.z)
+ return false;
+ if (box.maximum.x < maximum.x)
+ return false;
+ if (box.maximum.y < maximum.y)
+ return false;
+ if (box.maximum.z < maximum.z)
+ return false;
+ return true;
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 NVBounds3::getCenter() const
+{
+ QT3DS_ASSERT(isFinite());
+ return (minimum + maximum) * NVReal(0.5);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float NVBounds3::getCenter(QT3DSU32 axis) const
+{
+ QT3DS_ASSERT(isFinite());
+ return (minimum[axis] + maximum[axis]) * NVReal(0.5);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float NVBounds3::getExtents(QT3DSU32 axis) const
+{
+ QT3DS_ASSERT(isFinite());
+ return (maximum[axis] - minimum[axis]) * NVReal(0.5);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 NVBounds3::getDimensions() const
+{
+ QT3DS_ASSERT(isFinite());
+ return maximum - minimum;
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 NVBounds3::getExtents() const
+{
+ QT3DS_ASSERT(isFinite());
+ return getDimensions() * NVReal(0.5);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::scale(QT3DSF32 scale)
+{
+ QT3DS_ASSERT(isFinite());
+ *this = centerExtents(getCenter(), getExtents() * scale);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::fatten(NVReal distance)
+{
+ QT3DS_ASSERT(isFinite());
+ minimum.x -= distance;
+ minimum.y -= distance;
+ minimum.z -= distance;
+
+ maximum.x += distance;
+ maximum.y += distance;
+ maximum.z += distance;
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 NVBounds3::transform(const QT3DSMat33 &matrix,
+ const NVBounds3 &bounds)
+{
+ QT3DS_ASSERT(bounds.isFinite());
+ return bounds.isEmpty() ? bounds : NVBounds3::basisExtent(matrix * bounds.getCenter(), matrix,
+ bounds.getExtents());
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_INLINE NVBounds3 NVBounds3::transform(const NVTransform &transform,
+ const NVBounds3 &bounds)
+{
+ QT3DS_ASSERT(bounds.isFinite());
+ return bounds.isEmpty() ? bounds
+ : NVBounds3::basisExtent(transform.transform(bounds.getCenter()),
+ QT3DSMat33(transform.q), bounds.getExtents());
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::expand(TNVBounds2BoxPoints &outPoints) const
+{
+ if (isEmpty()) {
+ for (QT3DSU32 idx = 0; idx < 8; ++idx)
+ outPoints[idx] = QT3DSVec3(0, 0, 0);
+ } else {
+ // Min corner of box
+ outPoints[0] = QT3DSVec3(minimum[0], minimum[1], minimum[2]);
+ outPoints[1] = QT3DSVec3(maximum[0], minimum[1], minimum[2]);
+ outPoints[2] = QT3DSVec3(minimum[0], maximum[1], minimum[2]);
+ outPoints[3] = QT3DSVec3(minimum[0], minimum[1], maximum[2]);
+
+ // Max corner of box
+ outPoints[4] = QT3DSVec3(maximum[0], maximum[1], maximum[2]);
+ outPoints[5] = QT3DSVec3(minimum[0], maximum[1], maximum[2]);
+ outPoints[6] = QT3DSVec3(maximum[0], minimum[1], maximum[2]);
+ outPoints[7] = QT3DSVec3(maximum[0], maximum[1], minimum[2]);
+ }
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void NVBounds3::transform(const QT3DSMat44 &inMatrix)
+{
+ if (!isEmpty()) {
+ TNVBounds2BoxPoints thePoints;
+ expand(thePoints);
+ setEmpty();
+ for (QT3DSU32 idx = 0; idx < 8; ++idx)
+ include(inMatrix.transform(thePoints[idx]));
+ }
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_BOUNDS3_H
diff --git a/src/foundation/Qt3DSBroadcastingAllocator.h b/src/foundation/Qt3DSBroadcastingAllocator.h
new file mode 100644
index 0000000..dc6ae7b
--- /dev/null
+++ b/src/foundation/Qt3DSBroadcastingAllocator.h
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_BROADCASTING_ALLOCATOR_H
+#define QT3DS_FOUNDATION_QT3DS_BROADCASTING_ALLOCATOR_H
+
+#include "foundation/Qt3DSAllocatorCallback.h"
+
+/** \addtogroup foundation
+ @{
+*/
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/**
+\brief Abstract listener class that listens to allocation and deallocation events from the
+ foundation memory system.
+
+<b>Threading:</b> All methods of this class should be thread safe as it can be called from the user
+thread
+or the physics processing thread(s).
+*/
+class NVAllocationListener
+{
+protected:
+ virtual ~NVAllocationListener() {}
+
+public:
+ /**
+ \brief callback when memory is allocated.
+ \param size Size of the allocation in bytes.
+ \param typeName Type this data is being allocated for.
+ \param filename File the allocation came from.
+ \param line the allocation came from.
+ \param allocatedMemory memory that will be returned from the allocation.
+ */
+ virtual void onAllocation(size_t size, const char *typeName, const char *filename, int line,
+ void *allocatedMemory) = 0;
+
+ /**
+ /brief callback when memory is deallocated.
+ /param allocatedMemory memory just before allocation.
+ */
+ virtual void onDeallocation(void *allocatedMemory) = 0;
+};
+
+/**
+\brief Abstract base class for an application defined memory allocator that allows an external
+listener
+to audit the memory allocations.
+
+<b>Threading:</b> Register/deregister are *not* threadsafe!!!
+You need to be sure multiple threads are using this allocator when you are adding
+new listeners.
+*/
+class NVBroadcastingAllocator : public NVAllocatorCallback
+{
+protected:
+ virtual ~NVBroadcastingAllocator() {}
+
+public:
+ /**
+ \brief Register an allocation listener. This object will be notified whenever an
+ allocation happens.
+
+ <b>Threading:</b>Not threadsafe if you are allocating and deallocating in another
+ thread using this allocator.
+ */
+ virtual void registerAllocationListener(NVAllocationListener &inListener) = 0;
+ /**
+ \brief Deregister an allocation listener. This object will no longer receive
+ notifications upon allocation.
+
+ <b>Threading:</b>Not threadsafe if you are allocating and deallocating in another
+ thread using this allocator.
+ */
+ virtual void deregisterAllocationListener(NVAllocationListener &inListener) = 0;
+};
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_BROADCASTING_ALLOCATOR_H
diff --git a/src/foundation/Qt3DSContainers.h b/src/foundation/Qt3DSContainers.h
new file mode 100644
index 0000000..de86d85
--- /dev/null
+++ b/src/foundation/Qt3DSContainers.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef QT3DS_CONTAINERS_H
+#define QT3DS_CONTAINERS_H
+#include "foundation/Qt3DS.h"
+#include "EASTL/vector.h"
+#include "EASTL/hash_map.h"
+#include "EASTL/hash_set.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <typename T>
+ class nvvector : public eastl::vector<T, ForwardingAllocator>
+ {
+ typedef eastl::vector<T, ForwardingAllocator> base_type;
+
+ public:
+ using base_type::data;
+ using base_type::size;
+
+ nvvector(NVAllocatorCallback &inAllocator, const char *inTypeName)
+ : eastl::vector<T, ForwardingAllocator>(ForwardingAllocator(inAllocator, inTypeName))
+ {
+ }
+ nvvector(const nvvector<T> &inOther)
+ : eastl::vector<T, ForwardingAllocator>(inOther)
+ {
+ }
+ nvvector<T> &operator=(const nvvector<T> &inOther)
+ {
+ eastl::vector<T, ForwardingAllocator>::operator=(inOther);
+ return *this;
+ }
+ operator NVConstDataRef<T>() const { return NVConstDataRef<T>(data(), size()); }
+ operator NVDataRef<T>() { return NVDataRef<T>(data(), size()); }
+ };
+
+ template <typename TKey, typename TValue, typename THash = eastl::hash<TKey>,
+ typename TPredicate = eastl::equal_to<TKey>>
+ class nvhash_map : public eastl::hash_map<TKey, TValue, THash, TPredicate, ForwardingAllocator>
+ {
+ typedef eastl::hash_map<TKey, TValue, THash, TPredicate, ForwardingAllocator> base_type;
+
+ public:
+ using base_type::find;
+ using base_type::end;
+
+ nvhash_map(NVAllocatorCallback &inAllocator, const char *inTypeName)
+ : eastl::hash_map<TKey, TValue, THash, TPredicate, ForwardingAllocator>(
+ ForwardingAllocator(inAllocator, inTypeName))
+ {
+ }
+ nvhash_map(const nvhash_map<TKey, TValue, THash, TPredicate> &inOther)
+ : eastl::hash_map<TKey, TValue, THash, TPredicate, ForwardingAllocator>(inOther)
+ {
+ }
+ nvhash_map<TKey, TValue, THash, TPredicate> &
+ operator=(const nvhash_map<TKey, TValue, THash, TPredicate> &inOther)
+ {
+ eastl::hash_map<TKey, TValue, THash, TPredicate, ForwardingAllocator>::operator=(
+ inOther);
+ return *this;
+ }
+ bool contains(const TKey &inKey) const { return find(inKey) != end(); }
+ };
+
+ template <typename TKey, typename THash = eastl::hash<TKey>,
+ typename TPredicate = eastl::equal_to<TKey>>
+ class nvhash_set : public eastl::hash_set<TKey, THash, TPredicate, ForwardingAllocator>
+ {
+ typedef eastl::hash_set<TKey, THash, TPredicate, ForwardingAllocator> base_type;
+
+ public:
+ using base_type::find;
+ using base_type::end;
+
+ nvhash_set(NVAllocatorCallback &inAllocator, const char *inTypeName)
+ : eastl::hash_set<TKey, THash, TPredicate, ForwardingAllocator>(
+ ForwardingAllocator(inAllocator, inTypeName))
+ {
+ }
+ nvhash_set(const nvhash_map<TKey, THash, TPredicate> &inOther)
+ : eastl::hash_set<TKey, THash, TPredicate, ForwardingAllocator>(inOther)
+ {
+ }
+ nvhash_set<TKey, THash, TPredicate> &
+ operator=(const nvhash_set<TKey, THash, TPredicate> &inOther)
+ {
+ eastl::hash_set<TKey, THash, TPredicate, ForwardingAllocator>::operator=(inOther);
+ return *this;
+ }
+ bool contains(const TKey &inKey) const { return find(inKey) != end(); }
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/Qt3DSDataRef.h b/src/foundation/Qt3DSDataRef.h
new file mode 100644
index 0000000..ad860ce
--- /dev/null
+++ b/src/foundation/Qt3DSDataRef.h
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_DATA_REF_H
+#define QT3DS_FOUNDATION_DATA_REF_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <typename TDataType>
+ struct NVConstDataRef
+ {
+ const TDataType *mData;
+ QT3DSU32 mSize;
+
+ NVConstDataRef(const TDataType *inData, QT3DSU32 inSize)
+ : mData(inData)
+ , mSize(inSize)
+ {
+ }
+ NVConstDataRef()
+ : mData(0)
+ , mSize(0)
+ {
+ }
+
+ QT3DSU32 size() const { return mSize; }
+
+ const TDataType *begin() const { return mData; }
+ const TDataType *end() const { return mData + mSize; }
+
+ const TDataType &operator[](QT3DSU32 index) const
+ {
+ QT3DS_ASSERT(index < mSize);
+ return mData[index];
+ }
+ };
+
+ template <typename TDataType>
+ inline NVConstDataRef<TDataType> toConstDataRef(const TDataType &type)
+ {
+ return NVConstDataRef<TDataType>(&type, 1);
+ }
+
+ template <typename TDataType>
+ inline NVConstDataRef<QT3DSU8> toU8ConstDataRef(const TDataType &type)
+ {
+ return NVConstDataRef<QT3DSU8>(reinterpret_cast<const QT3DSU8 *>(&type), sizeof(TDataType));
+ }
+
+ template <typename TDataType>
+ inline NVConstDataRef<TDataType> toConstDataRef(const TDataType *type, QT3DSU32 count)
+ {
+ return NVConstDataRef<TDataType>(type, count);
+ }
+
+ template <typename TDataType>
+ inline NVConstDataRef<QT3DSU8> toU8ConstDataRef(const TDataType *type, QT3DSU32 count)
+ {
+ return NVConstDataRef<QT3DSU8>(reinterpret_cast<const QT3DSU8 *>(type),
+ sizeof(TDataType) * count);
+ }
+
+ template <typename TDataType>
+ struct NVDataRef
+ {
+ TDataType *mData;
+ QT3DSU32 mSize;
+
+ NVDataRef(TDataType *inData, QT3DSU32 inSize)
+ : mData(inData)
+ , mSize(inSize)
+ {
+ }
+ NVDataRef()
+ : mData(0)
+ , mSize(0)
+ {
+ }
+ QT3DSU32 size() const { return mSize; }
+
+ TDataType *begin() { return mData; }
+ TDataType *end() { return mData + mSize; }
+
+ TDataType *begin() const { return mData; }
+ TDataType *end() const { return mData + mSize; }
+
+ TDataType &operator[](QT3DSU32 index)
+ {
+ QT3DS_ASSERT(index < mSize);
+ return mData[index];
+ }
+
+ const TDataType &operator[](QT3DSU32 index) const
+ {
+ QT3DS_ASSERT(index < mSize);
+ return mData[index];
+ }
+
+ operator NVConstDataRef<TDataType>() const
+ {
+ return NVConstDataRef<TDataType>(mData, mSize);
+ }
+ };
+
+ template <typename TDataType>
+ inline NVDataRef<TDataType> toDataRef(TDataType &type)
+ {
+ return NVDataRef<TDataType>(&type, 1);
+ }
+
+ template <typename TDataType>
+ inline NVDataRef<QT3DSU8> toU8DataRef(TDataType &type)
+ {
+ return NVDataRef<QT3DSU8>(reinterpret_cast<QT3DSU8 *>(&type), sizeof(TDataType));
+ }
+
+ template <typename TDataType>
+ inline NVDataRef<TDataType> toDataRef(TDataType *type, QT3DSU32 count)
+ {
+ return NVDataRef<TDataType>(type, count);
+ }
+
+ template <typename TDataType>
+ inline NVDataRef<QT3DSU8> toU8DataRef(TDataType *type, QT3DSU32 count)
+ {
+ return NVDataRef<QT3DSU8>(reinterpret_cast<QT3DSU8 *>(type), sizeof(TDataType) * count);
+ }
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/foundation/Qt3DSDiscriminatedUnion.h b/src/foundation/Qt3DSDiscriminatedUnion.h
new file mode 100644
index 0000000..1957eb2
--- /dev/null
+++ b/src/foundation/Qt3DSDiscriminatedUnion.h
@@ -0,0 +1,335 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_DISCRIMINATED_UNION_H
+#define QT3DS_FOUNDATION_DISCRIMINATED_UNION_H
+#include "Qt3DSAssert.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSUnionCast.h"
+
+#ifdef WIN32
+#pragma warning(disable : 4100)
+#endif
+
+namespace qt3ds {
+namespace foundation {
+
+ template <typename TUnionTraits, int TBufferSize>
+ class DiscriminatedUnion
+ {
+ public:
+ typedef DiscriminatedUnion<TUnionTraits, TBufferSize> TThisType;
+ typedef TUnionTraits TTraits;
+ typedef typename TTraits::TIdType TIdType;
+
+ protected:
+ char m_Data[TBufferSize];
+ // Id type must include a no-data type.
+ TIdType m_DataType;
+
+ public:
+ DiscriminatedUnion() { TTraits::defaultConstruct(m_Data, m_DataType); }
+
+ DiscriminatedUnion(const TThisType &inOther)
+ : m_DataType(inOther.m_DataType)
+ {
+ TTraits::copyConstruct(m_Data, inOther.m_Data, m_DataType);
+ }
+
+ template <typename TDataType>
+ DiscriminatedUnion(const TDataType &inType)
+ {
+ TTraits::copyConstruct(m_Data, m_DataType, inType);
+ }
+
+ ~DiscriminatedUnion() { TTraits::destruct(m_Data, m_DataType); }
+
+ TThisType &operator=(const TThisType &inType)
+ {
+ if (this != &inType) {
+ TTraits::destruct(m_Data, m_DataType);
+ m_DataType = inType.m_DataType;
+ TTraits::copyConstruct(m_Data, inType.m_Data, inType.m_DataType);
+ }
+ return *this;
+ }
+
+ typename TTraits::TIdType getType() const { return m_DataType; }
+
+ template <typename TDataType>
+ const TDataType *getDataPtr() const
+ {
+ return TTraits::template getDataPtr<TDataType>(m_Data, m_DataType);
+ }
+
+ template <typename TDataType>
+ TDataType *getDataPtr()
+ {
+ return TTraits::template getDataPtr<TDataType>(m_Data, m_DataType);
+ }
+
+ template <typename TDataType>
+ TDataType getData() const
+ {
+ const TDataType *dataPtr = getDataPtr<TDataType>();
+ if (dataPtr)
+ return *dataPtr;
+ QT3DS_ASSERT(false);
+ return TDataType();
+ }
+
+ bool operator==(const TThisType &inOther) const
+ {
+ return m_DataType == inOther.m_DataType
+ && TTraits::areEqual(m_Data, inOther.m_Data, m_DataType);
+ }
+
+ bool operator!=(const TThisType &inOther) const
+ {
+ return m_DataType != inOther.m_DataType
+ || TTraits::areEqual(m_Data, inOther.m_Data, m_DataType) == false;
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ TRetType visit(TVisitorType inVisitor)
+ {
+ return TTraits::template visit<TRetType>(m_Data, m_DataType, inVisitor);
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ TRetType visit(TVisitorType inVisitor) const
+ {
+ return TTraits::template visit<TRetType>(m_Data, m_DataType, inVisitor);
+ }
+ };
+
+ // Helper system to enable quicker and correct construction of union traits types
+
+ struct CopyConstructVisitor
+ {
+ const char *m_Src;
+ CopyConstructVisitor(const char *inSrc)
+ : m_Src(inSrc)
+ {
+ }
+
+ template <typename TDataType>
+ void operator()(TDataType &inDst)
+ {
+ new (&inDst) TDataType(*NVUnionCast<const TDataType *>(m_Src));
+ }
+ void operator()() { QT3DS_ASSERT(false); }
+ };
+
+ template <typename TDataType>
+ struct DestructTraits
+ {
+ void destruct(TDataType &inType) { inType.~TDataType(); }
+ };
+
+ // Until compilers improve a bit, you need this for POD types else you get
+ // unused parameter warnings.
+ template <>
+ struct DestructTraits<QT3DSU8>
+ {
+ void destruct(QT3DSU8 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSI8>
+ {
+ void destruct(QT3DSI8 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSU16>
+ {
+ void destruct(QT3DSU16 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSI16>
+ {
+ void destruct(QT3DSI16 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSU32>
+ {
+ void destruct(QT3DSU32 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSI32>
+ {
+ void destruct(QT3DSI32 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSU64>
+ {
+ void destruct(QT3DSU64 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSI64>
+ {
+ void destruct(QT3DSI64 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSF32>
+ {
+ void destruct(QT3DSF32 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSF64>
+ {
+ void destruct(QT3DSF64 &) {}
+ };
+ template <>
+ struct DestructTraits<bool>
+ {
+ void destruct(bool &) {}
+ };
+ template <>
+ struct DestructTraits<void *>
+ {
+ void destruct(void *&) {}
+ };
+#ifdef __INTEGRITY
+ template <>
+ struct DestructTraits<QT3DSVec2>
+ {
+ void destruct(QT3DSVec2 &) {}
+ };
+ template <>
+ struct DestructTraits<QT3DSVec3>
+ {
+ void destruct(QT3DSVec3 &) {}
+ };
+#endif
+
+ struct DestructVisitor
+ {
+ template <typename TDataType>
+ void operator()(TDataType &inDst)
+ {
+ DestructTraits<TDataType>().destruct(inDst);
+ }
+ void operator()() { QT3DS_ASSERT(false); }
+ };
+
+ template <typename TDataType>
+ struct EqualVisitorTraits
+ {
+ bool operator()(const TDataType &lhs, const TDataType &rhs) { return lhs == rhs; }
+ };
+
+ struct EqualVisitor
+ {
+ const char *m_Rhs;
+ EqualVisitor(const char *rhs)
+ : m_Rhs(rhs)
+ {
+ }
+ template <typename TDataType>
+ bool operator()(const TDataType &lhs)
+ {
+ const TDataType &rhs(*NVUnionCast<const TDataType *>(m_Rhs));
+ return EqualVisitorTraits<TDataType>()(lhs, rhs);
+ }
+ bool operator()()
+ {
+ QT3DS_ASSERT(false);
+ return true;
+ }
+ };
+
+ template <typename TBase, QT3DSU32 TBufferSize>
+ struct DiscriminatedUnionGenericBase : public TBase
+ {
+ typedef typename TBase::TIdType TIdType;
+
+ static void zeroBuf(char *outDst) { qt3ds::intrinsics::memZero(outDst, TBufferSize); }
+
+ static void defaultConstruct(char *outDst, TIdType &outType)
+ {
+ zeroBuf(outDst);
+ outType = TBase::getNoDataId();
+ }
+
+ template <typename TDataType>
+ static void copyConstruct(char *outDst, TIdType &outType, const TDataType &inSrc)
+ {
+ zeroBuf(outDst);
+ StaticAssert<sizeof(TDataType) <= TBufferSize>::valid_expression();
+ outType = TBase::template getType<TDataType>();
+ new (outDst) TDataType(inSrc);
+ }
+
+ static void copyConstruct(char *inDst, const char *inSrc, TIdType inType)
+ {
+ if (inType == TBase::getNoDataId())
+ zeroBuf(inDst);
+ else
+ TBase::template visit<void>(inDst, inType, CopyConstructVisitor(inSrc));
+ }
+
+ static void destruct(char *inDst, TIdType inType)
+ {
+ if (inType != TBase::getNoDataId())
+ TBase::template visit<void>(inDst, inType, DestructVisitor());
+ zeroBuf(inDst);
+ }
+
+ template <typename TDataType>
+ static const TDataType *getDataPtr(const char *inData, const TIdType &inType)
+ {
+ if (TBase::template getType<TDataType>() == inType)
+ return NVUnionCast<const TDataType *>(inData);
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ template <typename TDataType>
+ static TDataType *getDataPtr(char *inData, const TIdType &inType)
+ {
+ if (TBase::template getType<TDataType>() == inType)
+ return NVUnionCast<TDataType *>(inData);
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ static bool areEqual(const char *inLhs, const char *inRhs, TIdType inType)
+ {
+ if (inType != TBase::getNoDataId())
+ return TBase::template visit<bool>(inLhs, inType, EqualVisitor(inRhs));
+ else
+ return true;
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/Qt3DSFPU.h b/src/foundation/Qt3DSFPU.h
new file mode 100644
index 0000000..e4a47f0
--- /dev/null
+++ b/src/foundation/Qt3DSFPU.h
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSFPU_H
+#define QT3DS_FOUNDATION_PSFPU_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSUnionCast.h"
+
+// unsigned integer representation of a floating-point value.
+#ifdef QT3DS_PS3
+QT3DS_FORCE_INLINE unsigned int QT3DS_IR(const float x)
+{
+ return qt3ds::NVUnionCast<unsigned int, float>(x);
+}
+#else
+#define QT3DS_IR(x) ((QT3DSU32 &)(x))
+#endif
+
+// signed integer representation of a floating-point value.
+#ifdef QT3DS_PS3
+QT3DS_FORCE_INLINE int QT3DS_SIR(const float x)
+{
+ return qt3ds::NVUnionCast<int, float>(x);
+}
+#else
+#define QT3DS_SIR(x) ((QT3DSI32 &)(x))
+#endif
+
+// Floating-point representation of a integer value.
+#ifdef QT3DS_PS3
+QT3DS_FORCE_INLINE float QT3DS_FR(const unsigned int x)
+{
+ return qt3ds::NVUnionCast<float, unsigned int>(x);
+}
+#else
+#define QT3DS_FR(x) ((QT3DSF32 &)(x))
+#endif
+
+#ifdef QT3DS_PS3
+QT3DS_FORCE_INLINE float *QT3DS_FPTR(unsigned int *x)
+{
+ return qt3ds::NVUnionCast<float *, unsigned int *>(x);
+}
+
+QT3DS_FORCE_INLINE float *QT3DS_FPTR(int *x)
+{
+ return qt3ds::NVUnionCast<float *, int *>(x);
+}
+#else
+#define QT3DS_FPTR(x) ((QT3DSF32 *)(x))
+#endif
+
+#define QT3DS_SIGN_BITMASK 0x80000000
+
+namespace qt3ds {
+namespace foundation {
+class QT3DS_FOUNDATION_API FPUGuard
+{
+public:
+ FPUGuard(); // set fpu control word for PhysX
+ ~FPUGuard(); // restore fpu control word
+private:
+ QT3DSU32 mControlWords[8];
+};
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSFastIPC.h b/src/foundation/Qt3DSFastIPC.h
new file mode 100644
index 0000000..800c3df
--- /dev/null
+++ b/src/foundation/Qt3DSFastIPC.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FAST_IPC_H
+#define QT3DS_FAST_IPC_H
+
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSIPC.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ NVIPC *createFastIPC(
+ NVIPC::ErrorCode &errorCode, // error code return if creation fails
+ NVIPC::ConnectionType connectionType =
+ NVIPC::CT_CLIENT_OR_SERVER, // how to establish the connection
+ const char *mappingObject = "Global\\FastIPC", // Name of communications channel
+ QT3DSU32 serverRingBufferSize = 1024 * 4, // buffer size for outgoing server messages.
+ QT3DSU32 clientRingBufferSize = 1024 * 4, // buffer size for incoming client messages.
+ bool allowLongMessages = true,
+ bool bufferSends = false,
+ QT3DSU32 maxBufferSendSize = 1024 * 8); // True if we want to buffer sends, if true, then
+ // pumpSendBuffers should be called by the send thread.
+
+ void releaseFastIPC(NVIPC *f);
+
+}; // end of namespace
+}; // end of namespace
+
+#endif
diff --git a/src/foundation/Qt3DSFlags.h b/src/foundation/Qt3DSFlags.h
new file mode 100644
index 0000000..765f386
--- /dev/null
+++ b/src/foundation/Qt3DSFlags.h
@@ -0,0 +1,360 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_FLAGS_H
+#define QT3DS_FOUNDATION_QT3DS_FLAGS_H
+
+/** \addtogroup foundation
+ @{
+*/
+
+#include "foundation/Qt3DS.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+/**
+\brief Container for bitfield flag variables associated with a specific enum type.
+
+This allows for type safe manipulation for bitfields.
+
+<h3>Example</h3>
+ // enum that defines each bit...
+ struct MyEnum
+ {
+ enum Enum
+ {
+ eMAN = 1,
+ eBEAR = 2,
+ ePIG = 4,
+ };
+ };
+
+ // implements some convenient global operators.
+ QT3DS_FLAGS_OPERATORS(MyEnum::Enum, QT3DSU8);
+
+ NVFlags<MyEnum::Enum, QT3DSU8> myFlags;
+ myFlags |= MyEnum::eMAN;
+ myFlags |= MyEnum::eBEAR | MyEnum::ePIG;
+ if(myFlags & MyEnum::eBEAR)
+ {
+ doSomething();
+ }
+*/
+template <typename enumtype, typename storagetype = QT3DSU32>
+class NVFlags
+{
+public:
+ QT3DS_INLINE explicit NVFlags(const NVEmpty &) {}
+ QT3DS_INLINE NVFlags(void);
+ QT3DS_INLINE NVFlags(enumtype e);
+ QT3DS_INLINE NVFlags(const NVFlags<enumtype, storagetype> &f);
+ QT3DS_INLINE explicit NVFlags(storagetype b);
+
+ QT3DS_INLINE bool operator==(enumtype e) const;
+ QT3DS_INLINE bool operator==(const NVFlags<enumtype, storagetype> &f) const;
+ QT3DS_INLINE bool operator==(bool b) const;
+ QT3DS_INLINE bool operator!=(enumtype e) const;
+ QT3DS_INLINE bool operator!=(const NVFlags<enumtype, storagetype> &f) const;
+
+ QT3DS_INLINE NVFlags<enumtype, storagetype> &operator=(enumtype e);
+
+ QT3DS_INLINE NVFlags<enumtype, storagetype> &operator|=(enumtype e);
+ QT3DS_INLINE NVFlags<enumtype, storagetype> &operator|=(const NVFlags<enumtype, storagetype> &f);
+ QT3DS_INLINE NVFlags<enumtype, storagetype> operator|(enumtype e) const;
+ QT3DS_INLINE NVFlags<enumtype, storagetype>
+ operator|(const NVFlags<enumtype, storagetype> &f) const;
+
+ QT3DS_INLINE NVFlags<enumtype, storagetype> &operator&=(enumtype e);
+ QT3DS_INLINE NVFlags<enumtype, storagetype> &operator&=(const NVFlags<enumtype, storagetype> &f);
+ QT3DS_INLINE NVFlags<enumtype, storagetype> operator&(enumtype e) const;
+ QT3DS_INLINE NVFlags<enumtype, storagetype>
+ operator&(const NVFlags<enumtype, storagetype> &f) const;
+
+ QT3DS_INLINE NVFlags<enumtype, storagetype> &operator^=(enumtype e);
+ QT3DS_INLINE NVFlags<enumtype, storagetype> &operator^=(const NVFlags<enumtype, storagetype> &f);
+ QT3DS_INLINE NVFlags<enumtype, storagetype> operator^(enumtype e) const;
+ QT3DS_INLINE NVFlags<enumtype, storagetype>
+ operator^(const NVFlags<enumtype, storagetype> &f) const;
+
+ QT3DS_INLINE NVFlags<enumtype, storagetype> operator~(void)const;
+
+ QT3DS_INLINE operator bool(void) const;
+ QT3DS_INLINE operator QT3DSU8(void) const;
+ QT3DS_INLINE operator QT3DSU16(void) const;
+ QT3DS_INLINE operator QT3DSU32(void) const;
+
+ QT3DS_INLINE void clear(enumtype e);
+
+ QT3DS_INLINE void clearOrSet(bool value, enumtype enumVal);
+
+public:
+ friend QT3DS_INLINE NVFlags<enumtype, storagetype> operator&(enumtype a,
+ NVFlags<enumtype, storagetype> &b)
+ {
+ NVFlags<enumtype, storagetype> out;
+ out.mBits = a & b.mBits;
+ return out;
+ }
+
+private:
+ storagetype mBits;
+};
+
+#define QT3DS_FLAGS_OPERATORS(enumtype, storagetype) \
+ QT3DS_INLINE NVFlags<enumtype, storagetype> operator|(enumtype a, enumtype b) \
+{ \
+ NVFlags<enumtype, storagetype> r(a); \
+ r |= b; \
+ return r; \
+} \
+ QT3DS_INLINE NVFlags<enumtype, storagetype> operator&(enumtype a, enumtype b) \
+{ \
+ NVFlags<enumtype, storagetype> r(a); \
+ r &= b; \
+ return r; \
+} \
+ QT3DS_INLINE NVFlags<enumtype, storagetype> operator~(enumtype a) \
+{ \
+ return ~NVFlags<enumtype, storagetype>(a); \
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::NVFlags(void)
+{
+ mBits = 0;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::NVFlags(enumtype e)
+{
+ mBits = static_cast<storagetype>(e);
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::NVFlags(const NVFlags<enumtype, storagetype> &f)
+{
+ mBits = f.mBits;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::NVFlags(storagetype b)
+{
+ mBits = b;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE bool NVFlags<enumtype, storagetype>::operator==(enumtype e) const
+{
+ return mBits == static_cast<storagetype>(e);
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE bool NVFlags<enumtype, storagetype>::
+operator==(const NVFlags<enumtype, storagetype> &f) const
+{
+ return mBits == f.mBits;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE bool NVFlags<enumtype, storagetype>::operator==(bool b) const
+{
+ return ((bool)*this) == b;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE bool NVFlags<enumtype, storagetype>::operator!=(enumtype e) const
+{
+ return mBits != static_cast<storagetype>(e);
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE bool NVFlags<enumtype, storagetype>::
+operator!=(const NVFlags<enumtype, storagetype> &f) const
+{
+ return mBits != f.mBits;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> &NVFlags<enumtype, storagetype>::operator=(enumtype e)
+{
+ mBits = static_cast<storagetype>(e);
+ return *this;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> &NVFlags<enumtype, storagetype>::operator|=(enumtype e)
+{
+ mBits |= static_cast<storagetype>(e);
+ return *this;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> &NVFlags<enumtype, storagetype>::
+operator|=(const NVFlags<enumtype, storagetype> &f)
+{
+ mBits |= f.mBits;
+ return *this;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> NVFlags<enumtype, storagetype>::operator|(enumtype e) const
+{
+ NVFlags<enumtype, storagetype> out(*this);
+ out |= e;
+ return out;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> NVFlags<enumtype, storagetype>::
+operator|(const NVFlags<enumtype, storagetype> &f) const
+{
+ NVFlags<enumtype, storagetype> out(*this);
+ out |= f;
+ return out;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> &NVFlags<enumtype, storagetype>::operator&=(enumtype e)
+{
+ mBits &= static_cast<storagetype>(e);
+ return *this;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> &NVFlags<enumtype, storagetype>::
+operator&=(const NVFlags<enumtype, storagetype> &f)
+{
+ mBits &= f.mBits;
+ return *this;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> NVFlags<enumtype, storagetype>::operator&(enumtype e) const
+{
+ NVFlags<enumtype, storagetype> out = *this;
+ out.mBits &= static_cast<storagetype>(e);
+ return out;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> NVFlags<enumtype, storagetype>::
+operator&(const NVFlags<enumtype, storagetype> &f) const
+{
+ NVFlags<enumtype, storagetype> out = *this;
+ out.mBits &= f.mBits;
+ return out;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> &NVFlags<enumtype, storagetype>::operator^=(enumtype e)
+{
+ mBits ^= static_cast<storagetype>(e);
+ return *this;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> &NVFlags<enumtype, storagetype>::
+operator^=(const NVFlags<enumtype, storagetype> &f)
+{
+ mBits ^= f.mBits;
+ return *this;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> NVFlags<enumtype, storagetype>::operator^(enumtype e) const
+{
+ NVFlags<enumtype, storagetype> out = *this;
+ out.mBits ^= static_cast<storagetype>(e);
+ return out;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> NVFlags<enumtype, storagetype>::
+operator^(const NVFlags<enumtype, storagetype> &f) const
+{
+ NVFlags<enumtype, storagetype> out = *this;
+ out.mBits ^= f.mBits;
+ return out;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype> NVFlags<enumtype, storagetype>::operator~(void)const
+{
+ NVFlags<enumtype, storagetype> out;
+ out.mBits = ~mBits;
+ return out;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::operator bool(void) const
+{
+ return mBits ? true : false;
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::operator QT3DSU8(void) const
+{
+ return static_cast<QT3DSU8>(mBits);
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::operator QT3DSU16(void) const
+{
+ return static_cast<QT3DSU16>(mBits);
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE NVFlags<enumtype, storagetype>::operator QT3DSU32(void) const
+{
+ return static_cast<QT3DSU32>(mBits);
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE void NVFlags<enumtype, storagetype>::clear(enumtype e)
+{
+ mBits &= ~static_cast<storagetype>(e);
+}
+
+template <typename enumtype, typename storagetype>
+QT3DS_INLINE void NVFlags<enumtype, storagetype>::clearOrSet(bool value, enumtype enumVal)
+{
+ if (value)
+ this->operator|=(enumVal);
+ else
+ clear(enumVal);
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // #ifndef QT3DS_FOUNDATION_QT3DS_FLAGS_H
diff --git a/src/foundation/Qt3DSFoundation.cpp b/src/foundation/Qt3DSFoundation.cpp
new file mode 100644
index 0000000..8687cd6
--- /dev/null
+++ b/src/foundation/Qt3DSFoundation.cpp
@@ -0,0 +1,237 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSFoundation.h"
+
+#include "foundation/Qt3DSQuat.h"
+#include "foundation/Qt3DSThread.h"
+#include "foundation/Qt3DSUtilities.h"
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSLogging.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "EASTL/hash_map.h"
+
+#include <stdio.h>
+#ifdef _WIN32
+#pragma warning(disable : 4996) // intentionally suppressing this warning message
+#endif
+namespace qt3ds {
+namespace foundation {
+ using namespace intrinsics;
+ union TempAllocatorChunk;
+
+ class NVAllocatorListenerManager;
+
+ class QT3DS_FOUNDATION_API Foundation : public NVFoundation
+ {
+
+ Foundation(NVAllocatorCallback &alloc);
+ ~Foundation();
+
+ public:
+ void addRef() override;
+ void release() override;
+
+ // factory
+ static Foundation *createInstance(QT3DSU32 version, NVAllocatorCallback &alloc);
+
+ NVBroadcastingAllocator &getAllocator() const override { return mAllocator; }
+ NVAllocatorCallback &getAllocatorCallback() const override;
+ NVAllocatorCallback &getCheckedAllocator() { return mAllocator; }
+
+ private:
+ class AlignCheckAllocator : public NVBroadcastingAllocator
+ {
+ static const QT3DSU32 MaxListenerCount = 5;
+
+ public:
+ AlignCheckAllocator(NVAllocatorCallback &originalAllocator)
+ : mAllocator(originalAllocator)
+ , mListenerCount(0)
+ {
+ }
+
+ void deallocate(void *ptr) override
+ {
+ // So here, for performance reasons I don't grab the mutex.
+ // The listener array is very rarely changing; for most situations
+ // only at startup. So it is unlikely that using the mutex
+ // will help a lot but it could have serious perf implications.
+ QT3DSU32 theCount = mListenerCount;
+ for (QT3DSU32 idx = 0; idx < theCount; ++idx)
+ mListeners[idx]->onDeallocation(ptr);
+ mAllocator.deallocate(ptr);
+ }
+ void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ int flags) override;
+ void *allocate(size_t size, const char *typeName, const char *filename, int line,
+ size_t alignment, size_t alignmentOffset) override;
+ NVAllocatorCallback &getBaseAllocator() const { return mAllocator; }
+ void registerAllocationListener(NVAllocationListener &inListener) override
+ {
+ QT3DS_ASSERT(mListenerCount < MaxListenerCount);
+ if (mListenerCount < MaxListenerCount) {
+ mListeners[mListenerCount] = &inListener;
+ ++mListenerCount;
+ }
+ }
+ void deregisterAllocationListener(NVAllocationListener &inListener) override
+ {
+ for (QT3DSU32 idx = 0; idx < mListenerCount; ++idx) {
+ if (mListeners[idx] == &inListener) {
+ mListeners[idx] = mListeners[mListenerCount - 1];
+ --mListenerCount;
+ break;
+ }
+ }
+ }
+
+ private:
+ NVAllocatorCallback &mAllocator;
+ // I am not sure about using a NVArray here.
+ // For now, this is fine.
+ NVAllocationListener *mListeners[MaxListenerCount];
+ volatile QT3DSU32 mListenerCount;
+ };
+
+ mutable AlignCheckAllocator mAllocator;
+ QT3DSU32 mRefCount;
+ Mutex mRefCountMutex;
+ };
+
+ Foundation::Foundation(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ , mRefCount(0)
+ , mRefCountMutex(alloc)
+
+ {
+ }
+
+ Foundation::~Foundation() {}
+
+ NVAllocatorCallback &Foundation::getAllocatorCallback() const
+ {
+ return mAllocator.getBaseAllocator();
+ }
+
+ Foundation *Foundation::createInstance(QT3DSU32 version, NVAllocatorCallback &alloc)
+ {
+ if (version != QT3DS_FOUNDATION_VERSION) {
+ qCCritical(INVALID_PARAMETER, "Wrong version: foundation version is %d, tried to create %d",
+ QT3DS_FOUNDATION_VERSION, version);
+ return 0;
+ }
+ Foundation *mInstance = NULL;
+
+ if (!mInstance) {
+ // if we don't assign this here, the Foundation object can't create member
+ // subobjects which require the allocator
+
+ mInstance = reinterpret_cast<Foundation *>(
+ alloc.allocate(sizeof(Foundation), "Foundation", __FILE__, __LINE__));
+
+ if (mInstance) {
+ QT3DS_PLACEMENT_NEW(mInstance, Foundation)(alloc);
+
+ QT3DS_ASSERT(mInstance->mRefCount == 0);
+
+ return mInstance;
+ } else {
+ qCCritical(INTERNAL_ERROR, "Memory allocation for foundation object failed.");
+ }
+ } else {
+ qCCritical(
+ INVALID_OPERATION,
+ "Foundation object exists already. Only one instance per process can be created.");
+ }
+
+ return 0;
+ }
+
+ void Foundation::addRef()
+ {
+ mRefCountMutex.lock();
+ ++mRefCount;
+ mRefCountMutex.unlock();
+ }
+
+ void Foundation::release()
+ {
+ mRefCountMutex.lock();
+ if (mRefCount)
+ --mRefCount;
+ QT3DSU32 refCount = mRefCount;
+ mRefCountMutex.unlock();
+ if (!refCount) {
+ NVAllocatorCallback &alloc = mAllocator.getBaseAllocator();
+ this->~Foundation();
+ alloc.deallocate(this);
+ }
+ }
+
+ void *Foundation::AlignCheckAllocator::allocate(size_t size, const char *typeName,
+ const char *filename, int line, int)
+ {
+ void *addr = mAllocator.allocate(size, typeName, filename, line);
+
+ if (!addr)
+ qFatal("User allocator returned NULL.");
+
+ if (!(reinterpret_cast<size_t>(addr) & 15)) {
+ // Same comment as before in the allocation system.
+ // We don't lock the listener array mutex because of an assumption
+ // where the listener array is rarely changing.
+ QT3DSU32 theCount = mListenerCount;
+ for (QT3DSU32 idx = 0; idx < theCount; ++idx)
+ mListeners[idx]->onAllocation(size, typeName, filename, line, addr);
+ return addr;
+ }
+
+ qFatal("Allocations for qt3ds::foundation must be 16-byte aligned.");
+ return 0;
+ }
+
+ void *Foundation::AlignCheckAllocator::allocate(size_t size, const char *typeName,
+ const char *filename, int line,
+ size_t /*alignment*/,
+ size_t /*alignmentOffset*/)
+ {
+ return allocate(size, typeName, filename, line, 0);
+ }
+
+} // namespace foundation
+} // namespace qt3ds
+
+qt3ds::NVFoundation *NVCreateFoundation(qt3ds::QT3DSU32 version, qt3ds::NVAllocatorCallback &allocator)
+{
+ return qt3ds::foundation::Foundation::createInstance(version, allocator);
+}
diff --git a/src/foundation/Qt3DSFoundation.h b/src/foundation/Qt3DSFoundation.h
new file mode 100644
index 0000000..19065d2
--- /dev/null
+++ b/src/foundation/Qt3DSFoundation.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_FOUNDATION_H
+#define QT3DS_FOUNDATION_QT3DS_FOUNDATION_H
+
+/** \addtogroup foundation
+ @{
+*/
+
+#include <stdarg.h>
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSVersionNumber.h"
+#include "foundation/Qt3DSLogging.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+class NVAllocatorCallback;
+class NVProfilingZone;
+class NVBroadcastingAllocator;
+
+class NVFoundationBase
+{
+public:
+ /**
+ retrieves the current allocator.
+ */
+ virtual NVBroadcastingAllocator &getAllocator() const = 0;
+};
+
+namespace foundation {
+template <typename TObjType>
+inline void NVDelete(NVFoundationBase &alloc, TObjType *item)
+{
+ NVDelete(alloc.getAllocator(), item);
+}
+}
+
+/**
+\brief Foundation SDK singleton class.
+
+You need to have an instance of this class to instance the higher level SDKs.
+*/
+class QT3DS_FOUNDATION_API NVFoundation : public NVFoundationBase
+{
+public:
+ virtual void addRef() = 0;
+ /**
+ \brief Destroys the instance it is called on.
+
+ The operation will fail, if there are still modules referencing the foundation object. Release
+ all dependent modules prior
+ to calling this method.
+
+ @see NVCreateFoundation()
+ */
+ virtual void release() = 0;
+
+ /**
+ Retrieves the allocator this object was created with.
+ */
+ virtual NVAllocatorCallback &getAllocatorCallback() const = 0;
+
+protected:
+ virtual ~NVFoundation() {}
+};
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/**
+\brief Creates an instance of the foundation class
+
+\param version Version number we are expecting (should be QT3DS_FOUNDATION_VERSION)
+\param allocator User supplied interface for allocating memory(see #NVAllocatorCallback)
+\return Foundation instance on success, NULL if operation failed
+
+@see NVFoundation
+*/
+
+#ifdef QT3DS_FOUNDATION_NO_EXPORTS
+QT3DS_AUTOTEST_EXPORT
+#else
+QT3DS_FOUNDATION_API
+#endif
+qt3ds::NVFoundation *QT3DS_CALL_CONV NVCreateFoundation(
+ qt3ds::QT3DSU32 version, qt3ds::NVAllocatorCallback &allocator);
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_FOUNDATION_H
diff --git a/src/foundation/Qt3DSIPC.h b/src/foundation/Qt3DSIPC.h
new file mode 100644
index 0000000..9bcea1a
--- /dev/null
+++ b/src/foundation/Qt3DSIPC.h
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_IPC_H
+#define QT3DS_IPC_H
+
+#include "foundation/Qt3DS.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ class NVIPC
+ {
+ public:
+ enum ConnectionType {
+ CT_CLIENT, // start up as a client, will succeed even if the server has not yet been
+ // found.
+ CT_CLIENT_REQUIRE_SERVER, // start up as a client, but only if the server already
+ // exists.
+ CT_SERVER, // will start up as a server, will fail if an existing server is already
+ // open.
+ CT_CLIENT_OR_SERVER, // connect as either a client or server, don't care who is created
+ // first.
+ CT_LAST
+ };
+
+ enum ErrorCode {
+ EC_OK, // no error.
+ EC_FAIL, // generic failure.
+ EC_SERVER_ALREADY_EXISTS, // couldn't create a server, because the server already
+ // exists.
+ EC_CLIENT_ALREADY_EXISTS, // couldn't create a client, because an existing client is
+ // already registered.
+ EC_CLIENT_SERVER_ALREADY_EXISTS, // both the client and server channels are already used
+ EC_SERVER_NOT_FOUND, // client opened with a required server, which was not found.
+ EC_BUFFER_MISSMATCH, // the reserved buffers for client/server do not match up.
+ EC_MAPFILE_CREATE, // failed to create the shared memory map file.
+ EC_MAPFILE_VIEW, // failed to map the memory view of he
+ // communications errors.
+ EC_SEND_DATA_EXCEEDS_MAX_BUFFER, // trying to send more data than can even fit in the
+ // sednd buffe.
+ EC_SEND_DATA_TOO_LARGE, // the data we tried to send exceeds the available room int the
+ // output ring buffer.
+ EC_SEND_BUFFER_FULL, // the send buffer is completely full.
+ EC_SEND_FROM_WRONG_THREAD, // Tried to do a send from a different thread
+ EC_RECEIVE_FROM_WRONG_THREAD, // Tried to do a recieve from a different thread
+ EC_NO_RECEIVE_PENDING, // tried to acknowledge a receive but none was pending.
+ };
+
+ virtual bool pumpPendingSends(void) = 0; // give up a time slice to pending sends; returns
+ // true if there are still pends sending.
+ virtual ErrorCode sendData(const void *data, QT3DSU32 data_len, bool bufferIfFull) = 0;
+ virtual const void *receiveData(QT3DSU32 &data_len) = 0;
+ virtual ErrorCode receiveAcknowledge(void) = 0; // acknowledge that we have processed the
+ // incoming message and can advance the read
+ // buffer.
+
+ virtual bool isServer(void) const = 0; // returns true if we are opened as a server.
+
+ virtual bool haveConnection(void) const = 0;
+
+ virtual bool canSend(QT3DSU32 len) = 0; // return true if we can send a message of this size.
+
+ virtual void release(void) = 0;
+
+ protected:
+ virtual ~NVIPC(void){}
+ };
+}; // end of namespace
+}; // end of namespace
+
+#endif
diff --git a/src/foundation/Qt3DSIndexableLinkedList.h b/src/foundation/Qt3DSIndexableLinkedList.h
new file mode 100644
index 0000000..ff36b42
--- /dev/null
+++ b/src/foundation/Qt3DSIndexableLinkedList.h
@@ -0,0 +1,309 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_INDEXABLE_LINKED_LIST_H
+#define QT3DS_FOUNDATION_INDEXABLE_LINKED_LIST_H
+#include "foundation/Qt3DSPool.h"
+
+namespace qt3ds {
+namespace foundation {
+ // Set of helper functions for manipulation of lists that are
+ // somewhat indexable but also amenable to using a pool structure.
+ template <typename TNodeType, typename TObjType, QT3DSU32 TObjCount>
+ struct IndexableLinkedList
+ {
+ typedef TNodeType SNode;
+
+ typedef Pool<SNode, ForwardingAllocator> TPoolType;
+
+ static TObjType &Create(SNode *&inInitialNode, QT3DSU32 &ioCurrentCount, TPoolType &ioPool)
+ {
+ QT3DSU32 idx = ioCurrentCount;
+ ++ioCurrentCount;
+ QT3DSU32 numGroups = (ioCurrentCount + TObjCount - 1) / TObjCount;
+ QT3DSU32 localIdx = idx % TObjCount;
+
+ SNode *theCurrentNode = inInitialNode;
+ for (QT3DSU32 idx = 0, end = numGroups; idx < end; ++idx) {
+ if (idx == 0) {
+ if (theCurrentNode == NULL)
+ inInitialNode = ioPool.construct(__FILE__, __LINE__);
+
+ theCurrentNode = inInitialNode;
+ } else {
+ if (theCurrentNode->m_NextNode == NULL)
+ theCurrentNode->m_NextNode = ioPool.construct(__FILE__, __LINE__);
+ theCurrentNode = theCurrentNode->m_NextNode;
+ }
+ }
+ return theCurrentNode->m_Data[localIdx];
+ }
+
+ static void CreateAll(SNode *&inInitialNode, QT3DSU32 inCount, TPoolType &ioPool)
+ {
+ QT3DSU32 numGroups = (inCount + TObjCount - 1) / TObjCount;
+ SNode *lastNode = NULL;
+ for (QT3DSU32 idx = 0, end = numGroups; idx < end; ++idx) {
+ SNode *nextNode = ioPool.construct(__FILE__, __LINE__);
+ if (idx == 0)
+ inInitialNode = nextNode;
+ else
+ lastNode->m_NextNode = nextNode;
+ lastNode = nextNode;
+ }
+ }
+
+ static void DeleteList(SNode *&inInitialNode, TPoolType &ioPool)
+ {
+ SNode *theNode = inInitialNode;
+ inInitialNode = NULL;
+ while (theNode) {
+ SNode *theNext = theNode->m_NextNode;
+ theNode->m_NextNode = NULL;
+ ioPool.deallocate(theNode);
+ theNode = theNext;
+ }
+ }
+
+ // Performs no checking, so you need to have already allocated what you need.
+ static const TObjType &GetObjAtIdx(const SNode *inInitialNode, QT3DSU32 inIdx)
+ {
+ QT3DSU32 groupIdx = inIdx / TObjCount;
+ QT3DSU32 localIdx = inIdx % TObjCount;
+ for (QT3DSU32 idx = 0; idx < groupIdx; ++idx)
+ inInitialNode = inInitialNode->m_NextNode;
+ return inInitialNode->m_Data[inIdx];
+ }
+
+ static TObjType &GetObjAtIdx(SNode *inInitialNode, QT3DSU32 inIdx)
+ {
+ QT3DSU32 groupIdx = inIdx / TObjCount;
+ QT3DSU32 localIdx = inIdx % TObjCount;
+ for (QT3DSU32 idx = 0; idx < groupIdx; ++idx)
+ inInitialNode = inInitialNode->m_NextNode;
+ return inInitialNode->m_Data[localIdx];
+ }
+
+ struct SIteratorType
+ {
+ QT3DSU32 m_Idx;
+ QT3DSU32 m_Count;
+ SNode *m_Node;
+
+ SIteratorType()
+ : m_Idx(0)
+ , m_Count(0)
+ , m_Node(NULL)
+ {
+ }
+ SIteratorType(const SIteratorType &iter)
+ : m_Idx(iter.m_Idx)
+ , m_Count(iter.m_Count)
+ , m_Node(iter.m_Node)
+ {
+ }
+ SIteratorType(SNode *inNode, QT3DSU32 inCount, QT3DSU32 inIdx)
+ : m_Idx(inIdx)
+ , m_Count(inCount)
+ , m_Node(inNode)
+ {
+ }
+
+ bool operator==(const SIteratorType &iter) const { return m_Idx == iter.m_Idx; }
+
+ bool operator!=(const SIteratorType &iter) const { return m_Idx != iter.m_Idx; }
+
+ TObjType &operator*()
+ {
+ QT3DSU32 localIdx = m_Idx % TObjCount;
+ return m_Node->m_Data[localIdx];
+ }
+
+ SIteratorType &operator++()
+ {
+ ++m_Idx;
+ if ((m_Idx % TObjCount) == 0)
+ m_Node = m_Node->m_NextNode;
+
+ return *this;
+ }
+ };
+
+ struct SConstIteratorType
+ {
+ QT3DSU32 m_Idx;
+ QT3DSU32 m_Count;
+ const SNode *m_Node;
+
+ SConstIteratorType()
+ : m_Idx(0)
+ , m_Count(0)
+ , m_Node(NULL)
+ {
+ }
+ SConstIteratorType(const SIteratorType &iter)
+ : m_Idx(iter.m_Idx)
+ , m_Count(iter.m_Count)
+ , m_Node(iter.m_Node)
+ {
+ }
+ SConstIteratorType(const SConstIteratorType &iter)
+ : m_Idx(iter.m_Idx)
+ , m_Count(iter.m_Count)
+ , m_Node(iter.m_Node)
+ {
+ }
+ SConstIteratorType(const SNode *inNode, QT3DSU32 inCount, QT3DSU32 inIdx)
+ : m_Idx(inIdx)
+ , m_Count(inCount)
+ , m_Node(inNode)
+ {
+ }
+
+ bool operator==(const SConstIteratorType &iter) const { return m_Idx == iter.m_Idx; }
+
+ bool operator!=(const SConstIteratorType &iter) const { return m_Idx != iter.m_Idx; }
+
+ const TObjType &operator*()
+ {
+ QT3DSU32 localIdx = m_Idx % TObjCount;
+ return m_Node->m_Data[localIdx];
+ }
+
+ SConstIteratorType &operator++()
+ {
+ ++m_Idx;
+ if ((m_Idx % TObjCount) == 0)
+ m_Node = m_Node->m_NextNode;
+
+ return *this;
+ }
+ };
+
+ typedef SIteratorType iterator;
+ typedef SConstIteratorType const_iterator;
+
+ static iterator begin(SNode *inInitialNode, QT3DSU32 inItemCount)
+ {
+ return SIteratorType(inInitialNode, inItemCount, 0);
+ }
+
+ static iterator end(SNode * /*inInitialNode*/, QT3DSU32 inItemCount)
+ {
+ return SIteratorType(NULL, inItemCount, inItemCount);
+ }
+
+ static const_iterator begin(const SNode *inInitialNode, QT3DSU32 inItemCount)
+ {
+ return SConstIteratorType(inInitialNode, inItemCount, 0);
+ }
+
+ static const_iterator end(const SNode * /*inInitialNode*/, QT3DSU32 inItemCount)
+ {
+ return SConstIteratorType(NULL, inItemCount, inItemCount);
+ }
+
+ struct SNodeIteratorType
+ {
+ SNode *m_Node;
+
+ SNodeIteratorType()
+ : m_Node(NULL)
+ {
+ }
+ SNodeIteratorType(const SNodeIteratorType &iter)
+ : m_Node(iter.m_Node)
+ {
+ }
+ SNodeIteratorType(SNode *inNode)
+ : m_Node(inNode)
+ {
+ }
+
+ bool operator==(const SNodeIteratorType &iter) const { return m_Node == iter.m_Node; }
+
+ bool operator!=(const SNodeIteratorType &iter) const { return m_Node != iter.m_Node; }
+
+ TNodeType &operator*() { return *m_Node; }
+
+ SNodeIteratorType &operator++()
+ {
+ if (m_Node)
+ m_Node = m_Node->m_NextNode;
+
+ return *this;
+ }
+ };
+
+ typedef SNodeIteratorType node_iterator;
+ static node_iterator node_begin(SNode *inFirstNode) { return node_iterator(inFirstNode); }
+ static node_iterator node_end(SNode * /*inFirstNode*/) { return node_iterator(NULL); }
+
+ // Iterates through the number of nodes required for a given count of objects
+ struct SCountIteratorType
+ {
+ QT3DSU32 m_Idx;
+ QT3DSU32 m_Count;
+
+ SCountIteratorType()
+ : m_Idx(0)
+ , m_Count(0)
+ {
+ }
+ SCountIteratorType(const SCountIteratorType &iter)
+ : m_Idx(iter.m_Idx)
+ , m_Count(iter.m_Count)
+ {
+ }
+ SCountIteratorType(QT3DSU32 idx, QT3DSU32 count)
+ : m_Idx(idx)
+ , m_Count(count)
+ {
+ }
+
+ bool operator==(const SCountIteratorType &iter) const { return m_Idx == iter.m_Idx; }
+
+ bool operator!=(const SCountIteratorType &iter) const { return m_Idx != iter.m_Idx; }
+
+ SCountIteratorType &operator++()
+ {
+ m_Idx = NVMin(m_Idx + TObjCount, m_Count);
+ return *this;
+ }
+ };
+
+ typedef SCountIteratorType count_iterator;
+ static count_iterator count_begin(QT3DSU32 count) { return SCountIteratorType(0, count); }
+ static count_iterator count_end(QT3DSU32 count) { return SCountIteratorType(count, count); }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/foundation/Qt3DSIntrinsics.h b/src/foundation/Qt3DSIntrinsics.h
new file mode 100644
index 0000000..1d6ac7a
--- /dev/null
+++ b/src/foundation/Qt3DSIntrinsics.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_INTRINSICS_H
+#define QT3DS_FOUNDATION_QT3DS_INTRINSICS_H
+
+#include "foundation/Qt3DSPreprocessor.h"
+
+#if defined QT3DS_WINDOWS || defined QT3DS_WIN8ARM
+#include "windows/Qt3DSWindowsIntrinsics.h"
+#elif defined QT3DS_X360
+#include "xbox360/NVXbox360Intrinsics.h"
+#elif (defined QT3DS_LINUX || defined QT3DS_ANDROID || defined QT3DS_APPLE || defined QT3DS_QNX)
+#include "linux/Qt3DSLinuxIntrinsics.h"
+#elif defined QT3DS_PS3
+#include "ps3/NVPS3Intrinsics.h"
+#elif defined QT3DS_PSP2
+#include "psp2/NVPSP2Intrinsics.h"
+#else
+#error "Platform not supported!"
+#endif
+
+#endif // QT3DS_FOUNDATION_QT3DS_INTRINSICS_H
diff --git a/src/foundation/Qt3DSInvasiveLinkedList.h b/src/foundation/Qt3DSInvasiveLinkedList.h
new file mode 100644
index 0000000..da90e12
--- /dev/null
+++ b/src/foundation/Qt3DSInvasiveLinkedList.h
@@ -0,0 +1,361 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_INVASIVE_LINKED_LIST_H
+#define QT3DS_FOUNDATION_INVASIVE_LINKED_LIST_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DSContainers.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ // Base linked list without an included head or tail member.
+ template <typename TObjType, typename TObjHeadOp, typename TObjTailOp>
+ struct SInvasiveLinkListBase
+ {
+ TObjType *tail(TObjType *inObj)
+ {
+ if (inObj)
+ return TObjTailOp().get(inObj);
+ return NULL;
+ }
+
+ TObjType *head(TObjType *inObj)
+ {
+ if (inObj)
+ return TObjHeadOp().get(inObj);
+ return NULL;
+ }
+
+ const TObjType *tail(const TObjType *inObj)
+ {
+ if (inObj)
+ return TObjTailOp().get(inObj);
+ return NULL;
+ }
+
+ const TObjType *head(const TObjType *inObj)
+ {
+ if (inObj)
+ return TObjHeadOp().get(inObj);
+ return NULL;
+ }
+
+ void remove(TObjType &inObj)
+ {
+ TObjHeadOp theHeadOp;
+ TObjTailOp theTailOp;
+ TObjType *theHead = theHeadOp.get(inObj);
+ TObjType *theTail = theTailOp.get(inObj);
+ if (theHead)
+ theTailOp.set(*theHead, theTail);
+ if (theTail)
+ theHeadOp.set(*theTail, theHead);
+ theHeadOp.set(inObj, NULL);
+ theTailOp.set(inObj, NULL);
+ }
+
+ void insert_after(TObjType &inPosition, TObjType &inObj)
+ {
+ TObjTailOp theTailOp;
+ TObjType *theHead = &inPosition;
+ TObjType *theTail = theTailOp.get(inPosition);
+ insert(theHead, theTail, inObj);
+ }
+
+ void insert_before(TObjType &inPosition, TObjType &inObj)
+ {
+ TObjHeadOp theHeadOp;
+ TObjType *theHead = theHeadOp.get(inPosition);
+ TObjType *theTail = &inPosition;
+ insert(theHead, theTail, inObj);
+ }
+
+ void insert(TObjType *inHead, TObjType *inTail, TObjType &inObj)
+ {
+ TObjHeadOp theHeadOp;
+ TObjTailOp theTailOp;
+ if (inHead)
+ theTailOp.set(*inHead, &inObj);
+ if (inTail)
+ theHeadOp.set(*inTail, &inObj);
+ theHeadOp.set(inObj, inHead);
+ theTailOp.set(inObj, inTail);
+ }
+ };
+
+ template <typename TObjType, typename TObjTailOp>
+ struct SLinkedListIterator
+ {
+ typedef SLinkedListIterator<TObjType, TObjTailOp> TMyType;
+ TObjType *m_Obj;
+ SLinkedListIterator(TObjType *inObj = NULL)
+ : m_Obj(inObj)
+ {
+ }
+
+ bool operator!=(const TMyType &inIter) const { return m_Obj != inIter.m_Obj; }
+ bool operator==(const TMyType &inIter) const { return m_Obj == inIter.m_Obj; }
+
+ TMyType &operator++()
+ {
+ if (m_Obj)
+ m_Obj = TObjTailOp().get(*m_Obj);
+ return *this;
+ }
+
+ TMyType &operator++(int)
+ {
+ TMyType retval(*this);
+ ++(*this);
+ return retval;
+ }
+
+ TObjType &operator*() { return *m_Obj; }
+ TObjType *operator->() { return m_Obj; }
+ };
+
+ // Used for singly linked list where
+ // items have either no head or tail ptr.
+ template <typename TObjType>
+ struct SNullOp
+ {
+ void set(TObjType &, TObjType *) {}
+ TObjType *get(const TObjType &) { return NULL; }
+ };
+
+ template <typename TObjType, typename TObjTailOp>
+ struct InvasiveSingleLinkedList
+ : public SInvasiveLinkListBase<TObjType, SNullOp<TObjType>, TObjTailOp>
+ {
+ typedef InvasiveSingleLinkedList<TObjType, TObjTailOp> TMyType;
+ typedef SInvasiveLinkListBase<TObjType, SNullOp<TObjType>, TObjTailOp> TBaseType;
+ typedef SLinkedListIterator<TObjType, TObjTailOp> iterator;
+ typedef iterator const_iterator;
+ TObjType *m_Head;
+ InvasiveSingleLinkedList()
+ : m_Head(NULL)
+ {
+ }
+ InvasiveSingleLinkedList(const TMyType &inOther)
+ : m_Head(inOther.m_Head)
+ {
+ }
+ TMyType &operator=(const TMyType &inOther)
+ {
+ m_Head = inOther.m_Head;
+ return *this;
+ }
+
+ TObjType &front() const { return *m_Head; }
+
+ void push_front(TObjType &inObj)
+ {
+ if (m_Head != NULL)
+ TBaseType::insert_before(*m_Head, inObj);
+ m_Head = &inObj;
+ }
+
+ void push_back(TObjType &inObj)
+ {
+ if (m_Head == NULL)
+ m_Head = &inObj;
+ else {
+ TObjType *lastObj = NULL;
+ for (iterator iter = begin(), endIter = end(); iter != endIter; ++iter)
+ lastObj = &(*iter);
+
+ QT3DS_ASSERT(lastObj);
+ if (lastObj)
+ TObjTailOp().set(*lastObj, &inObj);
+ }
+ }
+
+ void remove(TObjType &inObj)
+ {
+ if (m_Head == &inObj)
+ m_Head = TObjTailOp().get(inObj);
+ TBaseType::remove(inObj);
+ }
+
+ bool empty() const { return m_Head == NULL; }
+
+ iterator begin() { return iterator(m_Head); }
+ iterator end() { return iterator(NULL); }
+
+ const_iterator begin() const { return iterator(m_Head); }
+ const_iterator end() const { return iterator(NULL); }
+ };
+
+ template <typename TObjType, typename TObjHeadOp, typename TObjTailOp>
+ struct InvasiveLinkedList : public SInvasiveLinkListBase<TObjType, TObjHeadOp, TObjTailOp>
+ {
+ typedef InvasiveLinkedList<TObjType, TObjHeadOp, TObjTailOp> TMyType;
+ typedef SInvasiveLinkListBase<TObjType, TObjHeadOp, TObjTailOp> TBaseType;
+ typedef SLinkedListIterator<TObjType, TObjTailOp> iterator;
+ typedef iterator const_iterator;
+ typedef SLinkedListIterator<TObjType, TObjHeadOp> reverse_iterator;
+ typedef reverse_iterator const_reverse_iterator;
+
+ TObjType *m_Head;
+ TObjType *m_Tail;
+
+ InvasiveLinkedList()
+ : m_Head(NULL)
+ , m_Tail(NULL)
+ {
+ }
+ InvasiveLinkedList(const TMyType &inOther)
+ : m_Head(inOther.m_Head)
+ , m_Tail(inOther.m_Tail)
+ {
+ }
+ TMyType &operator=(const TMyType &inOther)
+ {
+ m_Head = inOther.m_Head;
+ m_Tail = inOther.m_Tail;
+ return *this;
+ }
+
+ TObjType &front() const
+ {
+ QT3DS_ASSERT(m_Head);
+ return *m_Head;
+ }
+ TObjType &back() const
+ {
+ QT3DS_ASSERT(m_Tail);
+ return *m_Tail;
+ }
+
+ TObjType *front_ptr() const { return m_Head; }
+ TObjType *back_ptr() const { return m_Tail; }
+
+ void push_front(TObjType &inObj)
+ {
+ if (m_Head != NULL)
+ TBaseType::insert_before(*m_Head, inObj);
+ m_Head = &inObj;
+
+ if (m_Tail == NULL)
+ m_Tail = &inObj;
+ }
+
+ void push_back(TObjType &inObj)
+ {
+ if (m_Tail != NULL)
+ TBaseType::insert_after(*m_Tail, inObj);
+ m_Tail = &inObj;
+
+ if (m_Head == NULL)
+ m_Head = &inObj;
+ }
+
+ void remove(TObjType &inObj)
+ {
+ if (m_Head == &inObj)
+ m_Head = TObjTailOp().get(inObj);
+ if (m_Tail == &inObj)
+ m_Tail = TObjHeadOp().get(inObj);
+
+ TBaseType::remove(inObj);
+ }
+
+ bool empty() const { return m_Head == NULL; }
+
+ iterator begin() { return iterator(m_Head); }
+ iterator end() { return iterator(NULL); }
+
+ const_iterator begin() const { return iterator(m_Head); }
+ const_iterator end() const { return iterator(NULL); }
+
+ reverse_iterator rbegin() { return reverse_iterator(m_Tail); }
+ reverse_iterator rend() { return reverse_iterator(NULL); }
+
+ const_reverse_iterator rbegin() const { return reverse_iterator(m_Tail); }
+ const_reverse_iterator rend() const { return reverse_iterator(NULL); }
+ };
+
+// Macros to speed up the definitely of invasive linked lists.
+#define DEFINE_INVASIVE_SINGLE_LIST(type) \
+ struct S##type; \
+ struct S##type##NextOp \
+ { \
+ S##type *get(S##type &s); \
+ const S##type *get(const S##type &s) const; \
+ void set(S##type &inItem, S##type *inNext); \
+ }; \
+ typedef InvasiveSingleLinkedList<S##type, S##type##NextOp> T##type##List;
+
+#define DEFINE_INVASIVE_LIST(type) \
+ struct S##type; \
+ struct S##type##NextOp \
+ { \
+ S##type *get(S##type &s); \
+ const S##type *get(const S##type &s) const; \
+ void set(S##type &inItem, S##type *inNext); \
+ }; \
+ struct S##type##PreviousOp \
+ { \
+ S##type *get(S##type &s); \
+ const S##type *get(const S##type &s) const; \
+ void set(S##type &inItem, S##type *inNext); \
+ }; \
+ typedef InvasiveLinkedList<S##type, S##type##PreviousOp, S##type##NextOp> T##type##List;
+
+#define IMPLEMENT_INVASIVE_LIST(type, prevMember, nextMember) \
+ inline S##type *S##type##NextOp::get(S##type &s) { return s.nextMember; } \
+ inline const S##type *S##type##NextOp::get(const S##type &s) const { return s.nextMember; } \
+ inline void S##type##NextOp::set(S##type &inItem, S##type *inNext) \
+ { \
+ inItem.nextMember = inNext; \
+ } \
+ inline S##type *S##type##PreviousOp::get(S##type &s) { return s.prevMember; } \
+ inline const S##type *S##type##PreviousOp::get(const S##type &s) const \
+ { \
+ return s.prevMember; \
+ } \
+ inline void S##type##PreviousOp::set(S##type &inItem, S##type *inNext) \
+ { \
+ inItem.prevMember = inNext; \
+ }
+
+#define IMPLEMENT_INVASIVE_SINGLE_LIST(type, nextMember) \
+ inline S##type *S##type##NextOp::get(S##type &s) { return s.nextMember; } \
+ inline const S##type *S##type##NextOp::get(const S##type &s) const { return s.nextMember; } \
+ inline void S##type##NextOp::set(S##type &inItem, S##type *inNext) \
+ { \
+ inItem.nextMember = inNext; \
+ }
+}
+}
+#endif \ No newline at end of file
diff --git a/src/foundation/Qt3DSInvasiveSet.h b/src/foundation/Qt3DSInvasiveSet.h
new file mode 100644
index 0000000..772a230
--- /dev/null
+++ b/src/foundation/Qt3DSInvasiveSet.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_INVASIVE_SET_H
+#define QT3DS_FOUNDATION_INVASIVE_SET_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DSContainers.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <typename TObjectType, typename TGetSetIndexOp, typename TSetSetIndexOp>
+ class InvasiveSet
+ {
+ nvvector<TObjectType *> mSet;
+
+ InvasiveSet(const InvasiveSet &other);
+ InvasiveSet &operator=(const InvasiveSet &other);
+
+ public:
+ InvasiveSet(NVAllocatorCallback &callback, const char *allocName)
+ : mSet(callback, allocName)
+ {
+ }
+
+ bool insert(TObjectType &inObject)
+ {
+ QT3DSU32 currentIdx = TGetSetIndexOp()(inObject);
+ if (currentIdx == QT3DS_MAX_U32) {
+ TSetSetIndexOp()(inObject, mSet.size());
+ mSet.push_back(&inObject);
+ return true;
+ }
+ return false;
+ }
+
+ bool remove(TObjectType &inObject)
+ {
+ QT3DSU32 currentIdx = TGetSetIndexOp()(inObject);
+ if (currentIdx != QT3DS_MAX_U32) {
+ TObjectType *theEnd = mSet.back();
+ TObjectType *theObj = &inObject;
+ if (theEnd != theObj) {
+ TSetSetIndexOp()(*theEnd, currentIdx);
+ mSet[currentIdx] = theEnd;
+ }
+ mSet.pop_back();
+ TSetSetIndexOp()(inObject, QT3DS_MAX_U32);
+ return true;
+ }
+ return false;
+ }
+
+ bool contains(TObjectType &inObject) { return TGetSetIndexOp()(inObject) != QT3DS_MAX_U32; }
+
+ void clear()
+ {
+ for (QT3DSU32 idx = 0; idx < mSet.size(); ++idx)
+ TSetSetIndexOp()(*(mSet[idx]), QT3DS_MAX_U32);
+ mSet.clear();
+ }
+
+ TObjectType *operator[](QT3DSU32 idx) { return mSet[idx]; }
+ const TObjectType *operator[](QT3DSU32 idx) const { return mSet[idx]; }
+ QT3DSU32 size() const { return mSet.size(); }
+ TObjectType **begin() { return mSet.begin(); }
+ TObjectType **end() { return mSet.end(); }
+ const TObjectType **begin() const { return mSet.begin(); }
+ const TObjectType **end() const { return mSet.end(); }
+ const TObjectType *back() const { return mSet.back(); }
+ TObjectType *back() { return mSet.back(); }
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/foundation/Qt3DSLogging.cpp b/src/foundation/Qt3DSLogging.cpp
new file mode 100644
index 0000000..257b39b
--- /dev/null
+++ b/src/foundation/Qt3DSLogging.cpp
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSLogging.h"
+
+namespace qt3ds {
+
+Q_LOGGING_CATEGORY(GL_ERROR, "qt3ds.gl_error")
+Q_LOGGING_CATEGORY(INVALID_PARAMETER, "qt3ds.invalid_parameter")
+Q_LOGGING_CATEGORY(INVALID_OPERATION, "qt3ds.invalid_operation")
+Q_LOGGING_CATEGORY(OUT_OF_MEMORY, "qt3ds.out_of_memory")
+Q_LOGGING_CATEGORY(INTERNAL_ERROR, "qt3ds.internal_error")
+Q_LOGGING_CATEGORY(PERF_WARNING, "qt3ds.perf_warning")
+Q_LOGGING_CATEGORY(PERF_INFO, "qt3ds.perf_info")
+Q_LOGGING_CATEGORY(TRACE_INFO, "qt3ds.trace_info")
+Q_LOGGING_CATEGORY(WARNING, "qt3ds.warning")
+
+} // namespace qt3ds
diff --git a/src/foundation/Qt3DSLogging.h b/src/foundation/Qt3DSLogging.h
new file mode 100644
index 0000000..4fcb77b
--- /dev/null
+++ b/src/foundation/Qt3DSLogging.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_ERRORS_H
+#define QT3DS_FOUNDATION_QT3DS_ERRORS_H
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qloggingcategory.h>
+
+namespace qt3ds {
+
+Q_DECLARE_LOGGING_CATEGORY(GL_ERROR)
+Q_DECLARE_LOGGING_CATEGORY(INVALID_PARAMETER)
+Q_DECLARE_LOGGING_CATEGORY(INVALID_OPERATION)
+Q_DECLARE_LOGGING_CATEGORY(OUT_OF_MEMORY)
+Q_DECLARE_LOGGING_CATEGORY(INTERNAL_ERROR)
+Q_DECLARE_LOGGING_CATEGORY(PERF_WARNING)
+Q_DECLARE_LOGGING_CATEGORY(PERF_INFO)
+Q_DECLARE_LOGGING_CATEGORY(TRACE_INFO)
+Q_DECLARE_LOGGING_CATEGORY(WARNING)
+
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSMat33.h b/src/foundation/Qt3DSMat33.h
new file mode 100644
index 0000000..6fa69eb
--- /dev/null
+++ b/src/foundation/Qt3DSMat33.h
@@ -0,0 +1,385 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_MAT33_H
+#define QT3DS_FOUNDATION_QT3DS_MAT33_H
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSQuat.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+/*!
+\brief 3x3 matrix class
+
+Some clarifications, as there have been much confusion about matrix formats etc in the past.
+
+Short:
+- Matrix have base vectors in columns (vectors are column matrices, 3x1 matrices).
+- Matrix is physically stored in column major format
+- Matrices are concaternated from left
+
+Long:
+Given three base vectors a, b and c the matrix is stored as
+
+|a.x b.x c.x|
+|a.y b.y c.y|
+|a.z b.z c.z|
+
+Vectors are treated as columns, so the vector v is
+
+|x|
+|y|
+|z|
+
+And matrices are applied _before_ the vector (pre-multiplication)
+v' = M*v
+
+|x'| |a.x b.x c.x| |x| |a.x*x + b.x*y + c.x*z|
+|y'| = |a.y b.y c.y| * |y| = |a.y*x + b.y*y + c.y*z|
+|z'| |a.z b.z c.z| |z| |a.z*x + b.z*y + c.z*z|
+
+
+Physical storage and indexing:
+To be compatible with popular 3d rendering APIs (read D3d and OpenGL)
+the physical indexing is
+
+|0 3 6|
+|1 4 7|
+|2 5 8|
+
+index = column*3 + row
+
+which in C++ translates to M[column][row]
+
+The mathematical indexing is M_row,column and this is what is used for _-notation
+so _12 is 1st row, second column and operator(row, column)!
+
+@see QT3DSMat44
+
+*/
+class QT3DSMat33
+{
+public:
+ //! Default constructor
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33() {}
+
+ //! Construct from three base vectors
+ QT3DS_CUDA_CALLABLE QT3DSMat33(const QT3DSVec3 &col0, const QT3DSVec3 &col1, const QT3DSVec3 &col2)
+ : column0(col0)
+ , column1(col1)
+ , column2(col2)
+ {
+ }
+
+ //! Construct from float[9]
+ QT3DS_CUDA_CALLABLE explicit QT3DS_INLINE QT3DSMat33(NVReal values[])
+ : column0(values[0], values[1], values[2])
+ , column1(values[3], values[4], values[5])
+ , column2(values[6], values[7], values[8])
+ {
+ }
+
+ //! Construct from a quaternion
+ QT3DS_CUDA_CALLABLE explicit QT3DS_FORCE_INLINE QT3DSMat33(const QT3DSQuat &q)
+ {
+ const NVReal x = q.x;
+ const NVReal y = q.y;
+ const NVReal z = q.z;
+ const NVReal w = q.w;
+
+ const NVReal x2 = x + x;
+ const NVReal y2 = y + y;
+ const NVReal z2 = z + z;
+
+ const NVReal xx = x2 * x;
+ const NVReal yy = y2 * y;
+ const NVReal zz = z2 * z;
+
+ const NVReal xy = x2 * y;
+ const NVReal xz = x2 * z;
+ const NVReal xw = x2 * w;
+
+ const NVReal yz = y2 * z;
+ const NVReal yw = y2 * w;
+ const NVReal zw = z2 * w;
+
+ column0 = QT3DSVec3(1.0f - yy - zz, xy + zw, xz - yw);
+ column1 = QT3DSVec3(xy - zw, 1.0f - xx - zz, yz + xw);
+ column2 = QT3DSVec3(xz + yw, yz - xw, 1.0f - xx - yy);
+ }
+
+ //! Copy constructor
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33(const QT3DSMat33 &other)
+ : column0(other.column0)
+ , column1(other.column1)
+ , column2(other.column2)
+ {
+ }
+
+ //! Assignment operator
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSMat33 &operator=(const QT3DSMat33 &other)
+ {
+ column0 = other.column0;
+ column1 = other.column1;
+ column2 = other.column2;
+ return *this;
+ }
+
+ //! Set to identity matrix
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE static QT3DSMat33 createIdentity()
+ {
+ return QT3DSMat33(QT3DSVec3(1, 0, 0), QT3DSVec3(0, 1, 0), QT3DSVec3(0, 0, 1));
+ }
+
+ //! Set to zero matrix
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE static QT3DSMat33 createZero()
+ {
+ return QT3DSMat33(QT3DSVec3(0.0f), QT3DSVec3(0.0f), QT3DSVec3(0.0f));
+ }
+
+ //! Construct from diagonal, off-diagonals are zero.
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE static QT3DSMat33 createDiagonal(const QT3DSVec3 &d)
+ {
+ return QT3DSMat33(QT3DSVec3(d.x, 0.0f, 0.0f), QT3DSVec3(0.0f, d.y, 0.0f), QT3DSVec3(0.0f, 0.0f, d.z));
+ }
+
+ //! Get transposed matrix
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSMat33 getTranspose() const
+ {
+ const QT3DSVec3 v0(column0.x, column1.x, column2.x);
+ const QT3DSVec3 v1(column0.y, column1.y, column2.y);
+ const QT3DSVec3 v2(column0.z, column1.z, column2.z);
+
+ return QT3DSMat33(v0, v1, v2);
+ }
+
+ //! Get the real inverse
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 getInverse() const
+ {
+ const NVReal det = getDeterminant();
+ QT3DSMat33 inverse;
+
+ if (det != 0) {
+ const NVReal invDet = 1.0f / det;
+
+ inverse.column0[0] = invDet * (column1[1] * column2[2] - column2[1] * column1[2]);
+ inverse.column0[1] = invDet * -(column0[1] * column2[2] - column2[1] * column0[2]);
+ inverse.column0[2] = invDet * (column0[1] * column1[2] - column0[2] * column1[1]);
+
+ inverse.column1[0] = invDet * -(column1[0] * column2[2] - column1[2] * column2[0]);
+ inverse.column1[1] = invDet * (column0[0] * column2[2] - column0[2] * column2[0]);
+ inverse.column1[2] = invDet * -(column0[0] * column1[2] - column0[2] * column1[0]);
+
+ inverse.column2[0] = invDet * (column1[0] * column2[1] - column1[1] * column2[0]);
+ inverse.column2[1] = invDet * -(column0[0] * column2[1] - column0[1] * column2[0]);
+ inverse.column2[2] = invDet * (column0[0] * column1[1] - column1[0] * column0[1]);
+
+ return inverse;
+ } else {
+ return createIdentity();
+ }
+ }
+
+ //! Get determinant
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal getDeterminant() const
+ {
+ return column0.dot(column1.cross(column2));
+ }
+
+ //! Unary minus
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 operator-() const
+ {
+ return QT3DSMat33(-column0, -column1, -column2);
+ }
+
+ //! Add
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 operator+(const QT3DSMat33 &other) const
+ {
+ return QT3DSMat33(column0 + other.column0, column1 + other.column1, column2 + other.column2);
+ }
+
+ //! Subtract
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 operator-(const QT3DSMat33 &other) const
+ {
+ return QT3DSMat33(column0 - other.column0, column1 - other.column1, column2 - other.column2);
+ }
+
+ //! Scalar multiplication
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 operator*(NVReal scalar) const
+ {
+ return QT3DSMat33(column0 * scalar, column1 * scalar, column2 * scalar);
+ }
+
+ friend QT3DSMat33 operator*(NVReal, const QT3DSMat33 &);
+
+ //! Matrix vector multiplication (returns 'this->transform(vec)')
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 operator*(const QT3DSVec3 &vec) const { return transform(vec); }
+
+ //! Matrix multiplication
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSMat33 operator*(const QT3DSMat33 &other) const
+ {
+ // Rows from this <dot> columns from other
+ // column0 = transform(other.column0) etc
+ return QT3DSMat33(transform(other.column0), transform(other.column1),
+ transform(other.column2));
+ }
+
+ // a <op>= b operators
+
+ //! Equals-add
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 &operator+=(const QT3DSMat33 &other)
+ {
+ column0 += other.column0;
+ column1 += other.column1;
+ column2 += other.column2;
+ return *this;
+ }
+
+ //! Equals-sub
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 &operator-=(const QT3DSMat33 &other)
+ {
+ column0 -= other.column0;
+ column1 -= other.column1;
+ column2 -= other.column2;
+ return *this;
+ }
+
+ //! Equals scalar multiplication
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 &operator*=(NVReal scalar)
+ {
+ column0 *= scalar;
+ column1 *= scalar;
+ column2 *= scalar;
+ return *this;
+ }
+
+ //! Element access, mathematical way!
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal operator()(unsigned int row, unsigned int col) const
+ {
+ return (*this)[col][row];
+ }
+
+ //! Element access, mathematical way!
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal &operator()(unsigned int row, unsigned int col)
+ {
+ return (*this)[col][row];
+ }
+
+ // Transform etc
+
+ //! Transform vector by matrix, equal to v' = M*v
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 transform(const QT3DSVec3 &other) const
+ {
+ return column0 * other.x + column1 * other.y + column2 * other.z;
+ }
+
+ //! Transform vector by matrix transpose, v' = M^t*v
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 transformTranspose(const QT3DSVec3 &other) const
+ {
+ return QT3DSVec3(column0.dot(other), column1.dot(other), column2.dot(other));
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const NVReal *front() const { return &column0.x; }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 &operator[](int num) { return (&column0)[num]; }
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const QT3DSVec3 &operator[](int num) const
+ {
+ return (&column0)[num];
+ }
+
+ // Data, see above for format!
+
+ QT3DSVec3 column0, column1, column2; // the three base vectors
+};
+
+// implementation from Qt3DSQuat.h
+QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat::QT3DSQuat(const QT3DSMat33 &m)
+{
+ NVReal tr = m(0, 0) + m(1, 1) + m(2, 2), h;
+ if (tr >= 0) {
+ h = NVSqrt(tr + 1);
+ w = NVReal(0.5) * h;
+ h = NVReal(0.5) / h;
+
+ x = (m(2, 1) - m(1, 2)) * h;
+ y = (m(0, 2) - m(2, 0)) * h;
+ z = (m(1, 0) - m(0, 1)) * h;
+ } else {
+ int i = 0;
+ if (m(1, 1) > m(0, 0))
+ i = 1;
+ if (m(2, 2) > m(i, i))
+ i = 2;
+ switch (i) {
+ case 0:
+ h = NVSqrt((m(0, 0) - (m(1, 1) + m(2, 2))) + 1);
+ x = NVReal(0.5) * h;
+ h = NVReal(0.5) / h;
+
+ y = (m(0, 1) + m(1, 0)) * h;
+ z = (m(2, 0) + m(0, 2)) * h;
+ w = (m(2, 1) - m(1, 2)) * h;
+ break;
+ case 1:
+ h = NVSqrt((m(1, 1) - (m(2, 2) + m(0, 0))) + 1);
+ y = NVReal(0.5) * h;
+ h = NVReal(0.5) / h;
+
+ z = (m(1, 2) + m(2, 1)) * h;
+ x = (m(0, 1) + m(1, 0)) * h;
+ w = (m(0, 2) - m(2, 0)) * h;
+ break;
+ case 2:
+ h = NVSqrt((m(2, 2) - (m(0, 0) + m(1, 1))) + 1);
+ z = NVReal(0.5) * h;
+ h = NVReal(0.5) / h;
+
+ x = (m(2, 0) + m(0, 2)) * h;
+ y = (m(1, 2) + m(2, 1)) * h;
+ w = (m(1, 0) - m(0, 1)) * h;
+ break;
+ default: // Make compiler happy
+ x = y = z = w = 0;
+ break;
+ }
+ }
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_MAT33_H
diff --git a/src/foundation/Qt3DSMat44.h b/src/foundation/Qt3DSMat44.h
new file mode 100644
index 0000000..53a66e2
--- /dev/null
+++ b/src/foundation/Qt3DSMat44.h
@@ -0,0 +1,497 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_MAT44_H
+#define QT3DS_FOUNDATION_QT3DS_MAT44_H
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DSQuat.h"
+#include "foundation/Qt3DSVec4.h"
+#include "foundation/Qt3DSMat33.h"
+#include "foundation/Qt3DSTransform.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/*!
+\brief 4x4 matrix class
+
+This class is layout-compatible with D3D and OpenGL matrices. More notes on layout are given in the QT3DSMat33
+Graphics matrices always (by which I mean DX and OpenGL) have the rotation basis vectors stored contiguously
+in 0-2, 3-5, 6-8 and the the translation stored contiguously in 12-14. However, DX calls this row major and GL calls it column-major.
+http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html
+
+you can blat these directly into GL (or DX)
+
+--Dilip Sequeira
+
+@see QT3DSMat33 NVTransform
+*/
+
+class QT3DSMat44
+{
+public:
+ //! Default constructor
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44() {}
+
+ //! Construct from four 4-vectors
+ QT3DS_CUDA_CALLABLE QT3DSMat44(const QT3DSVec4 &col0, const QT3DSVec4 &col1, const QT3DSVec4 &col2,
+ const QT3DSVec4 &col3)
+ : column0(col0)
+ , column1(col1)
+ , column2(col2)
+ , column3(col3)
+ {
+ }
+
+ //! Construct from three base vectors and a translation
+ QT3DS_CUDA_CALLABLE QT3DSMat44(const QT3DSVec3 &column0, const QT3DSVec3 &column1, const QT3DSVec3 &column2,
+ const QT3DSVec3 &column3)
+ : column0(column0, 0)
+ , column1(column1, 0)
+ , column2(column2, 0)
+ , column3(column3, 1)
+ {
+ }
+
+ //! Construct from float[16]
+ explicit QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44(NVReal values[])
+ : column0(values[0], values[1], values[2], values[3])
+ , column1(values[4], values[5], values[6], values[7])
+ , column2(values[8], values[9], values[10], values[11])
+ , column3(values[12], values[13], values[14], values[15])
+ {
+ }
+
+ //! Construct from a quaternion
+ explicit QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44(const QT3DSQuat &q)
+ {
+ const NVReal x = q.x;
+ const NVReal y = q.y;
+ const NVReal z = q.z;
+ const NVReal w = q.w;
+
+ const NVReal x2 = x + x;
+ const NVReal y2 = y + y;
+ const NVReal z2 = z + z;
+
+ const NVReal xx = x2 * x;
+ const NVReal yy = y2 * y;
+ const NVReal zz = z2 * z;
+
+ const NVReal xy = x2 * y;
+ const NVReal xz = x2 * z;
+ const NVReal xw = x2 * w;
+
+ const NVReal yz = y2 * z;
+ const NVReal yw = y2 * w;
+ const NVReal zw = z2 * w;
+
+ column0 = QT3DSVec4(1.0f - yy - zz, xy + zw, xz - yw, 0.0f);
+ column1 = QT3DSVec4(xy - zw, 1.0f - xx - zz, yz + xw, 0.0f);
+ column2 = QT3DSVec4(xz + yw, yz - xw, 1.0f - xx - yy, 0.0f);
+ column3 = QT3DSVec4(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+
+ //! Construct from a diagonal vector
+ explicit QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44(const QT3DSVec4 &diagonal)
+ : column0(diagonal.x, 0.0f, 0.0f, 0.0f)
+ , column1(0.0f, diagonal.y, 0.0f, 0.0f)
+ , column2(0.0f, 0.0f, diagonal.z, 0.0f)
+ , column3(0.0f, 0.0f, 0.0f, diagonal.w)
+ {
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DSMat44(const QT3DSMat33 &orientation, const QT3DSVec3 &position)
+ : column0(orientation.column0, 0.0f)
+ , column1(orientation.column1, 0.0f)
+ , column2(orientation.column2, 0.0f)
+ , column3(position, 1)
+ {
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DSMat44(const NVTransform &t) { *this = QT3DSMat44(QT3DSMat33(t.q), t.p); }
+
+ //! Copy constructor
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44(const QT3DSMat44 &other)
+ : column0(other.column0)
+ , column1(other.column1)
+ , column2(other.column2)
+ , column3(other.column3)
+ {
+ }
+
+ //! Assignment operator
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE const QT3DSMat44 &operator=(const QT3DSMat44 &other)
+ {
+ column0 = other.column0;
+ column1 = other.column1;
+ column2 = other.column2;
+ column3 = other.column3;
+ return *this;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE static QT3DSMat44 createIdentity()
+ {
+ return QT3DSMat44(QT3DSVec4(1.0f, 0.0f, 0.0f, 0.0f), QT3DSVec4(0.0f, 1.0f, 0.0f, 0.0f),
+ QT3DSVec4(0.0f, 0.0f, 1.0f, 0.0f), QT3DSVec4(0.0f, 0.0f, 0.0f, 1.0f));
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE static QT3DSMat44 createZero()
+ {
+ return QT3DSMat44(QT3DSVec4(0.0f), QT3DSVec4(0.0f), QT3DSVec4(0.0f), QT3DSVec4(0.0f));
+ }
+
+ //! Get transposed matrix
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 getTranspose() const
+ {
+ return QT3DSMat44(QT3DSVec4(column0.x, column1.x, column2.x, column3.x),
+ QT3DSVec4(column0.y, column1.y, column2.y, column3.y),
+ QT3DSVec4(column0.z, column1.z, column2.z, column3.z),
+ QT3DSVec4(column0.w, column1.w, column2.w, column3.w));
+ }
+
+ //! Unary minus
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 operator-() const
+ {
+ return QT3DSMat44(-column0, -column1, -column2, -column3);
+ }
+
+ //! Add
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 operator+(const QT3DSMat44 &other) const
+ {
+ return QT3DSMat44(column0 + other.column0, column1 + other.column1, column2 + other.column2,
+ column3 + other.column3);
+ }
+
+ //! Subtract
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 operator-(const QT3DSMat44 &other) const
+ {
+ return QT3DSMat44(column0 - other.column0, column1 - other.column1, column2 - other.column2,
+ column3 - other.column3);
+ }
+
+ //! Scalar multiplication
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 operator*(NVReal scalar) const
+ {
+ return QT3DSMat44(column0 * scalar, column1 * scalar, column2 * scalar, column3 * scalar);
+ }
+
+ friend QT3DSMat44 operator*(NVReal, const QT3DSMat44 &);
+
+ //! Matrix multiplication
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 operator*(const QT3DSMat44 &other) const
+ {
+ // Rows from this <dot> columns from other
+ // column0 = transform(other.column0) etc
+ return QT3DSMat44(transform(other.column0), transform(other.column1), transform(other.column2),
+ transform(other.column3));
+ }
+
+ // a <op>= b operators
+
+ //! Equals-add
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 &operator+=(const QT3DSMat44 &other)
+ {
+ column0 += other.column0;
+ column1 += other.column1;
+ column2 += other.column2;
+ column3 += other.column3;
+ return *this;
+ }
+
+ //! Equals-sub
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 &operator-=(const QT3DSMat44 &other)
+ {
+ column0 -= other.column0;
+ column1 -= other.column1;
+ column2 -= other.column2;
+ column3 -= other.column3;
+ return *this;
+ }
+
+ //! Equals scalar multiplication
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 &operator*=(NVReal scalar)
+ {
+ column0 *= scalar;
+ column1 *= scalar;
+ column2 *= scalar;
+ column3 *= scalar;
+ return *this;
+ }
+
+ //! Element access, mathematical way!
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal operator()(unsigned int row, unsigned int col) const
+ {
+ return (*this)[col][row];
+ }
+
+ //! Element access, mathematical way!
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal &operator()(unsigned int row, unsigned int col)
+ {
+ return (*this)[col][row];
+ }
+
+ //! Transform vector by matrix, equal to v' = M*v
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 transform(const QT3DSVec4 &other) const
+ {
+ return column0 * other.x + column1 * other.y + column2 * other.z + column3 * other.w;
+ }
+
+ //! Transform vector by matrix, equal to v' = M*v
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 transform(const QT3DSVec3 &other) const
+ {
+ return transform(QT3DSVec4(other, 1)).getXYZ();
+ }
+
+ //! Rotate vector by matrix, equal to v' = M*v
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 rotate(const QT3DSVec4 &other) const
+ {
+ return column0 * other.x + column1 * other.y + column2 * other.z; // + column3*0;
+ }
+
+ //! Rotate vector by matrix, equal to v' = M*v
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 rotate(const QT3DSVec3 &other) const
+ {
+ return rotate(QT3DSVec4(other, 1)).getXYZ();
+ }
+
+ /**
+* Shamelessly pulled from gl-matrix.js
+ * Rotates a matrix by the given angle around the specified axis
+*
+* @param angle Angle (in radians) to rotate
+* @param axis vec3 representing the axis to rotate around
+*/
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool rotate(QT3DSF32 angleRadians, QT3DSVec3 axis)
+ {
+ QT3DSF32 x = axis[0], y = axis[1], z = axis[2], len = x * x + y * y + z * z, s, c, t, a00, a01,
+ a02, a03, a10, a11, a12, a13, a20, a21, a22, a23, b00, b01, b02, b10, b11, b12, b20,
+ b21, b22;
+
+ if (!len) {
+ return false;
+ }
+ if (len != 1.0f) {
+ len = 1 / (NVSqrt(len));
+ x *= len;
+ y *= len;
+ z *= len;
+ }
+
+ s = NVSin(angleRadians);
+ c = NVCos(angleRadians);
+ t = 1 - c;
+
+ QT3DSF32 *dataPtr(front());
+
+// inverse algorithm was written for row-major matrixes.
+#define mat(idx) dataPtr[idx]
+
+ a00 = mat(0);
+ a01 = mat(1);
+ a02 = mat(2);
+ a03 = mat(3);
+ a10 = mat(4);
+ a11 = mat(5);
+ a12 = mat(6);
+ a13 = mat(7);
+ a20 = mat(8);
+ a21 = mat(9);
+ a22 = mat(10);
+ a23 = mat(11);
+#undef mat
+
+ // Construct the elements of the rotation matrix
+ b00 = x * x * t + c;
+ b01 = y * x * t + z * s;
+ b02 = z * x * t - y * s;
+ b10 = x * y * t - z * s;
+ b11 = y * y * t + c;
+ b12 = z * y * t + x * s;
+ b20 = x * z * t + y * s;
+ b21 = y * z * t - x * s;
+ b22 = z * z * t + c;
+
+// Perform rotation-specific matrix multiplication
+
+#define dest(idx) dataPtr[idx]
+
+ dest(0) = a00 * b00 + a10 * b01 + a20 * b02;
+ dest(1) = a01 * b00 + a11 * b01 + a21 * b02;
+ dest(2) = a02 * b00 + a12 * b01 + a22 * b02;
+ dest(3) = a03 * b00 + a13 * b01 + a23 * b02;
+
+ dest(4) = a00 * b10 + a10 * b11 + a20 * b12;
+ dest(5) = a01 * b10 + a11 * b11 + a21 * b12;
+ dest(6) = a02 * b10 + a12 * b11 + a22 * b12;
+ dest(7) = a03 * b10 + a13 * b11 + a23 * b12;
+
+ dest(8) = a00 * b20 + a10 * b21 + a20 * b22;
+ dest(9) = a01 * b20 + a11 * b21 + a21 * b22;
+ dest(10) = a02 * b20 + a12 * b21 + a22 * b22;
+ dest(11) = a03 * b20 + a13 * b21 + a23 * b22;
+
+#undef dest
+
+ return true;
+ };
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 getBasis(int num) const
+ {
+ QT3DS_ASSERT(num >= 0 && num < 3);
+ return (&column0)[num].getXYZ();
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 getPosition() const { return column3.getXYZ(); }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE void setPosition(const QT3DSVec3 &position)
+ {
+ column3.x = position.x;
+ column3.y = position.y;
+ column3.z = position.z;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal *front() { return &column0.x; }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const NVReal *front() const { return &column0.x; }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec4 &operator[](int num) { return (&column0)[num]; }
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const QT3DSVec4 &operator[](int num) const
+ {
+ return (&column0)[num];
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE void scale(const QT3DSVec4 &p)
+ {
+ column0 *= p.x;
+ column1 *= p.y;
+ column2 *= p.z;
+ column3 *= p.w;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 inverseRT(void) const
+ {
+ QT3DSVec3 r0(column0.x, column1.x, column2.x), r1(column0.y, column1.y, column2.y),
+ r2(column0.z, column1.z, column2.z);
+
+ return QT3DSMat44(r0, r1, r2, -(r0 * column3.x + r1 * column3.y + r2 * column3.z));
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat44 getInverse(void) const
+ {
+ // inverse algorithm was written for row-major matrixes.
+ const QT3DSF32 *myPtr(front());
+#define mat(idx) myPtr[idx]
+
+ QT3DSF32 a00 = mat(0), a01 = mat(1), a02 = mat(2), a03 = mat(3), a10 = mat(4), a11 = mat(5),
+ a12 = mat(6), a13 = mat(7), a20 = mat(8), a21 = mat(9), a22 = mat(10), a23 = mat(11),
+ a30 = mat(12), a31 = mat(13), a32 = mat(14), a33 = mat(15),
+#undef mat
+
+ b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10,
+ b03 = a01 * a12 - a02 * a11, b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12,
+ b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30, b08 = a20 * a33 - a23 * a30,
+ b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32,
+
+ d = (b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06), invDet;
+
+ // Calculate the determinant
+ if (!d) {
+ QT3DS_ASSERT(false);
+ return QT3DSMat44::createIdentity();
+ }
+ invDet = 1 / d;
+
+ QT3DSMat44 retval;
+ QT3DSF32 *destPtr = retval.front();
+
+#define dest(idx) destPtr[idx]
+ dest(0) = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;
+ dest(1) = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;
+ dest(2) = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;
+ dest(3) = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;
+ dest(4) = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;
+ dest(5) = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;
+ dest(6) = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;
+ dest(7) = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;
+ dest(8) = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;
+ dest(9) = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;
+ dest(10) = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;
+ dest(11) = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;
+ dest(12) = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;
+ dest(13) = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;
+ dest(14) = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;
+ dest(15) = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;
+#undef dest
+
+ return retval;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool isFinite() const
+ {
+ return column0.isFinite() && column1.isFinite() && column2.isFinite() && column3.isFinite();
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 getUpper3x3() const
+ {
+ return QT3DSMat33(column0.getXYZ(), column1.getXYZ(), column2.getXYZ());
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSMat33 getUpper3x3InverseTranspose() const
+ {
+ return getUpper3x3().getInverse().getTranspose();
+ }
+
+ // Data, see above for format!
+
+ QT3DSVec4 column0, column1, column2, column3; // the four base vectors
+};
+
+// implementation from Qt3DSTransform.h
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVTransform::NVTransform(const QT3DSMat44 &m)
+{
+ QT3DSVec3 column0 = QT3DSVec3(m.column0.x, m.column0.y, m.column0.z);
+ QT3DSVec3 column1 = QT3DSVec3(m.column1.x, m.column1.y, m.column1.z);
+ QT3DSVec3 column2 = QT3DSVec3(m.column2.x, m.column2.y, m.column2.z);
+
+ q = QT3DSQuat(QT3DSMat33(column0, column1, column2));
+ p = QT3DSVec3(m.column3.x, m.column3.y, m.column3.z);
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_MAT44_H
diff --git a/src/foundation/Qt3DSMath.h b/src/foundation/Qt3DSMath.h
new file mode 100644
index 0000000..931852e
--- /dev/null
+++ b/src/foundation/Qt3DSMath.h
@@ -0,0 +1,323 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_MATH_H
+#define QT3DS_FOUNDATION_QT3DS_MATH_H
+
+/** \addtogroup foundation
+@{
+*/
+
+#include <math.h>
+#include <float.h>
+#include <stdlib.h>
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSAssert.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+// constants
+static const NVReal NVPi = NVReal(3.141592653589793);
+static const NVReal NVHalfPi = NVReal(1.57079632679489661923);
+static const NVReal NVTwoPi = NVReal(6.28318530717958647692);
+static const NVReal NVInvPi = NVReal(0.31830988618379067154);
+
+/**
+\brief The return value is the greater of the two specified values.
+*/
+template <class T>
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE T NVMax(T a, T b)
+{
+ return a < b ? b : a;
+}
+
+//! overload for float to use fsel on xbox
+template <>
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float NVMax(float a, float b)
+{
+ return intrinsics::selectMax(a, b);
+}
+
+/**
+\brief The return value is the lesser of the two specified values.
+*/
+template <class T>
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE T NVMin(T a, T b)
+{
+ return a < b ? a : b;
+}
+
+template <>
+//! overload for float to use fsel on xbox
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float NVMin(float a, float b)
+{
+ return intrinsics::selectMin(a, b);
+}
+
+/*
+Many of these are just implemented as QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE calls to the C lib right now,
+but later we could replace some of them with some approximations or more
+clever stuff.
+*/
+
+/**
+\brief abs returns the absolute value of its argument.
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVAbs(QT3DSF32 a)
+{
+ return intrinsics::abs(a);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVEquals(QT3DSF32 a, QT3DSF32 b, QT3DSF32 epsilon)
+{
+ return (NVAbs(a - b) < epsilon);
+}
+
+/**
+\brief abs returns the absolute value of its argument.
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVAbs(QT3DSF64 a)
+{
+ return ::fabs(a);
+}
+
+/**
+\brief abs returns the absolute value of its argument.
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSI32 NVAbs(QT3DSI32 a)
+{
+ return ::abs(a);
+}
+
+/**
+\brief Clamps v to the range [hi,lo]
+*/
+template <class T>
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE T NVClamp(T v, T lo, T hi)
+{
+ QT3DS_ASSERT(lo <= hi);
+ return NVMin(hi, NVMax(lo, v));
+}
+
+//! \brief Square root.
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVSqrt(QT3DSF32 a)
+{
+ return intrinsics::sqrt(a);
+}
+
+//! \brief Square root.
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVSqrt(QT3DSF64 a)
+{
+ return ::sqrt(a);
+}
+
+//! \brief reciprocal square root.
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVRecipSqrt(QT3DSF32 a)
+{
+ return intrinsics::recipSqrt(a);
+}
+
+//! \brief reciprocal square root.
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVRecipSqrt(QT3DSF64 a)
+{
+ return 1 / ::sqrt(a);
+}
+
+//!trigonometry -- all angles are in radians.
+
+//! \brief Sine of an angle ( <b>Unit:</b> Radians )
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVSin(QT3DSF32 a)
+{
+ return intrinsics::sin(a);
+}
+
+//! \brief Sine of an angle ( <b>Unit:</b> Radians )
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVSin(QT3DSF64 a)
+{
+ return ::sin(a);
+}
+
+//! \brief Cosine of an angle (<b>Unit:</b> Radians)
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVCos(QT3DSF32 a)
+{
+ return intrinsics::cos(a);
+}
+
+//! \brief Cosine of an angle (<b>Unit:</b> Radians)
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVCos(QT3DSF64 a)
+{
+ return ::cos(a);
+}
+
+/**
+\brief Tangent of an angle.
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVTan(QT3DSF32 a)
+{
+ return QT3DSF32(::tan(a));
+}
+
+/**
+\brief Tangent of an angle.
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVTan(QT3DSF64 a)
+{
+ return ::tan(a);
+}
+
+/**
+\brief Arcsine.
+Returns angle between -PI/2 and PI/2 in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVAsin(QT3DSF32 f)
+{
+ return QT3DSF32(::asin(NVClamp(f, -1.0f, 1.0f)));
+}
+
+/**
+\brief Arcsine.
+Returns angle between -PI/2 and PI/2 in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVAsin(QT3DSF64 f)
+{
+ return ::asin(NVClamp(f, -1.0, 1.0));
+}
+
+/**
+\brief Arccosine.
+Returns angle between 0 and PI in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVAcos(QT3DSF32 f)
+{
+ return QT3DSF32(::acos(NVClamp(f, -1.0f, 1.0f)));
+}
+
+/**
+\brief Arccosine.
+Returns angle between 0 and PI in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVAcos(QT3DSF64 f)
+{
+ return ::acos(NVClamp(f, -1.0, 1.0));
+}
+
+/**
+\brief ArcTangent.
+Returns angle between -PI/2 and PI/2 in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVAtan(QT3DSF32 a)
+{
+ return QT3DSF32(::atan(a));
+}
+
+/**
+\brief ArcTangent.
+Returns angle between -PI/2 and PI/2 in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVAtan(QT3DSF64 a)
+{
+ return ::atan(a);
+}
+
+/**
+\brief Arctangent of (x/y) with correct sign.
+Returns angle between -PI and PI in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVAtan2(QT3DSF32 x, QT3DSF32 y)
+{
+ return QT3DSF32(::atan2(x, y));
+}
+
+/**
+\brief Arctangent of (x/y) with correct sign.
+Returns angle between -PI and PI in radians
+<b>Unit:</b> Radians
+*/
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 NVAtan2(QT3DSF64 x, QT3DSF64 y)
+{
+ return ::atan2(x, y);
+}
+
+//! \brief returns true if the passed number is a finite floating point number as opposed to INF, NAN, etc.
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVIsFinite(QT3DSF32 f)
+{
+ return intrinsics::isFinite(f);
+}
+
+//! \brief returns true if the passed number is a finite floating point number as opposed to INF, NAN, etc.
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool NVIsFinite(QT3DSF64 f)
+{
+ return intrinsics::isFinite(f);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVFloor(QT3DSF32 a)
+{
+ return ::floorf(a);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVExp(QT3DSF32 a)
+{
+ return ::expf(a);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVCeil(QT3DSF32 a)
+{
+ return ::ceilf(a);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVSign(QT3DSF32 a)
+{
+ return qt3ds::intrinsics::sign(a);
+}
+
+QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 NVPow(QT3DSF32 x, QT3DSF32 y)
+{
+ return ::powf(x, y);
+};
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_MATH_H
diff --git a/src/foundation/Qt3DSMathUtils.cpp b/src/foundation/Qt3DSMathUtils.cpp
new file mode 100644
index 0000000..7eee740
--- /dev/null
+++ b/src/foundation/Qt3DSMathUtils.cpp
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSMathUtils.h"
+#include "foundation/Qt3DSUtilities.h"
+#include "foundation/Qt3DSMat33.h"
+
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace qt3ds::intrinsics;
+
+QT3DSQuat qt3ds::foundation::computeQuatFromNormal(const QT3DSVec3 &n)
+{
+ // parallel or anti-parallel
+ if (n.x > 0.9999f) {
+ // parallel
+ return QT3DSQuat::createIdentity();
+ } else if (n.x < -0.9999f) {
+ // anti-parallel
+ // contactQuaternion.fromAngleAxisFast(PXD_PI, Vector3(0.0f, 1.0f, 0.0f));
+ return QT3DSQuat(0.0f, 1.0f, 0.0f, 0.0f);
+ } else {
+ QT3DSVec3 rotVec(0.0f, -n.z, n.y);
+
+ // Convert to quat
+ NVReal angle = rotVec.magnitude();
+ rotVec *= 1.0f / angle;
+ // if(angle > 1.0f) angle = 1.0f;
+ angle = selectMin(angle, 1.0f);
+
+ // djs: injudiciously imbecilic use of trig functions, good thing Adam is going to trample
+ // this path like a
+ // frustrated rhinoceros in mating season
+
+ angle = NVAsin(angle);
+
+ // if(n.x < 0)
+ // angle = NVPi - angle;
+ angle = fsel(n.x, angle, NVPi - angle);
+
+ return QT3DSQuat(angle, rotVec);
+ }
+}
+
+/**
+\brief computes a oriented bounding box around the scaled basis.
+\param basis Input = skewed basis, Output = (normalized) orthogonal basis.
+\return Bounding box extent.
+*/
+QT3DSVec3 qt3ds::foundation::optimizeBoundingBox(QT3DSMat33 &basis)
+{
+ QT3DSVec3 *QT3DS_RESTRICT vec = &basis[0]; // PT: don't copy vectors if not needed...
+
+ // PT: since we store the magnitudes to memory, we can avoid the FCMNV afterwards
+ QT3DSVec3 magnitude(vec[0].magnitudeSquared(), vec[1].magnitudeSquared(),
+ vec[2].magnitudeSquared());
+
+// find indices sorted by magnitude
+#ifdef QT3DS_X360
+ int i = (QT3DSU32 &)(magnitude[1]) > (QT3DSU32 &)(magnitude[0]) ? 1 : 0;
+ int j = (QT3DSU32 &)(magnitude[2]) > (QT3DSU32 &)(magnitude[1 - i]) ? 2 : 1 - i;
+#else
+ int i = magnitude[1] > magnitude[0] ? 1 : 0;
+ int j = magnitude[2] > magnitude[1 - i] ? 2 : 1 - i;
+#endif
+ const int k = 3 - i - j;
+#ifdef QT3DS_X360
+ if ((QT3DSU32 &)(magnitude[i]) < (QT3DSU32 &)(magnitude[j]))
+#else
+ if (magnitude[i] < magnitude[j])
+#endif
+ swap(i, j);
+
+ // ortho-normalize basis
+
+ NVReal invSqrt = NVRecipSqrt(magnitude[i]);
+ magnitude[i] *= invSqrt;
+ vec[i] *= invSqrt; // normalize the first axis
+ NVReal dotij = vec[i].dot(vec[j]);
+ NVReal dotik = vec[i].dot(vec[k]);
+ magnitude[i] += NVAbs(dotij) + NVAbs(dotik); // elongate the axis by projection of the other two
+ vec[j] -= vec[i] * dotij; // orthogonize the two remaining axii relative to vec[i]
+ vec[k] -= vec[i] * dotik;
+
+ magnitude[j] = vec[j].normalize();
+ NVReal dotjk = vec[j].dot(vec[k]);
+ magnitude[j] += NVAbs(dotjk); // elongate the axis by projection of the other one
+ vec[k] -= vec[j] * dotjk; // orthogonize vec[k] relative to vec[j]
+
+ magnitude[k] = vec[k].normalize();
+
+ return magnitude;
+}
+
+QT3DSQuat qt3ds::foundation::slerp(const NVReal t, const QT3DSQuat &left, const QT3DSQuat &right)
+{
+ const NVReal quatEpsilon = (NVReal(1.0e-8f));
+
+ NVReal cosine = left.dot(right);
+ NVReal sign = NVReal(1);
+ if (cosine < 0) {
+ cosine = -cosine;
+ sign = NVReal(-1);
+ }
+
+ NVReal sine = NVReal(1) - cosine * cosine;
+
+ if (sine >= quatEpsilon * quatEpsilon) {
+ sine = NVSqrt(sine);
+ const NVReal angle = NVAtan2(sine, cosine);
+ const NVReal i_sin_angle = NVReal(1) / sine;
+
+ const NVReal leftw = NVSin(angle * (NVReal(1) - t)) * i_sin_angle;
+ const NVReal rightw = NVSin(angle * t) * i_sin_angle * sign;
+
+ return left * leftw + right * rightw;
+ }
+
+ return left;
+}
+
+void qt3ds::foundation::integrateTransform(const NVTransform &curTrans, const QT3DSVec3 &linvel,
+ const QT3DSVec3 &angvel, NVReal timeStep, NVTransform &result)
+{
+ result.p = curTrans.p + linvel * timeStep;
+
+ // from void NVsDynamicsContext::integrateAtomPose(NVsRigidBody* atom, Cm::BitMap
+ // &shapeChangedMap) const:
+ // Integrate the rotation using closed form quaternion integrator
+ NVReal w = angvel.magnitudeSquared();
+
+ if (w != 0.0f) {
+ w = NVSqrt(w);
+ if (w != 0.0f) {
+ const NVReal v = timeStep * w * 0.5f;
+ const NVReal q = NVCos(v);
+ const NVReal s = NVSin(v) / w;
+
+ const QT3DSVec3 pqr = angvel * s;
+ const QT3DSQuat quatVel(pqr.x, pqr.y, pqr.z, 0);
+ QT3DSQuat out; // need to have temporary, otherwise we may overwrite input if &curTrans ==
+ // &result.
+ out = quatVel * curTrans.q;
+ out.x += curTrans.q.x * q;
+ out.y += curTrans.q.y * q;
+ out.z += curTrans.q.z * q;
+ out.w += curTrans.q.w * q;
+ result.q = out;
+ return;
+ }
+ }
+ // orientation stays the same - convert from quat to matrix:
+ result.q = curTrans.q;
+}
diff --git a/src/foundation/Qt3DSMathUtils.h b/src/foundation/Qt3DSMathUtils.h
new file mode 100644
index 0000000..6d3d0ab
--- /dev/null
+++ b/src/foundation/Qt3DSMathUtils.h
@@ -0,0 +1,571 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSMATHUTILS_H
+#define QT3DS_FOUNDATION_PSMATHUTILS_H
+
+#include "foundation/Qt3DSTransform.h"
+#include "foundation/Qt3DSMat33.h"
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include <stdlib.h>
+
+// General guideline is: if it's an abstract math function, it belongs here.
+// If it's a math function where the inputs have specific semantics (e.g.
+// separateSwingTwist) it doesn't.
+
+namespace qt3ds {
+namespace foundation {
+ using namespace intrinsics;
+ /**
+ \brief sign returns the sign of its argument. The sign of zero is undefined.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 sign(const QT3DSF32 a) {
+ return intrinsics::sign(a);
+ }
+
+ /**
+ \brief sign returns the sign of its argument. The sign of zero is undefined.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 sign(const QT3DSF64 a) { return (a >= 0.0) ? 1.0 : -1.0; }
+
+ /**
+ \brief sign returns the sign of its argument. The sign of zero is undefined.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSI32 sign(const QT3DSI32 a) { return (a >= 0) ? 1 : -1; }
+
+ /**
+ \brief Returns true if the two numbers are within eps of each other.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool equals(const QT3DSF32 a, const QT3DSF32 b, const QT3DSF32 eps)
+ {
+ return (NVAbs(a - b) < eps);
+ }
+
+ /**
+ \brief Returns true if the two numbers are within eps of each other.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool equals(const QT3DSF64 a, const QT3DSF64 b, const QT3DSF64 eps)
+ {
+ return (NVAbs(a - b) < eps);
+ }
+
+ /**
+ \brief The floor function returns a floating-point value representing the largest integer that
+ is less than or equal to x.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 floor(const QT3DSF32 a) { return floatFloor(a); }
+
+ /**
+ \brief The floor function returns a floating-point value representing the largest integer that
+ is less than or equal to x.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 floor(const QT3DSF64 a) { return ::floor(a); }
+
+ /**
+ \brief The ceil function returns a single value representing the smallest integer that is
+ greater than or equal to x.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 ceil(const QT3DSF32 a) { return ::ceilf(a); }
+
+ /**
+ \brief The ceil function returns a double value representing the smallest integer that is
+ greater than or equal to x.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 ceil(const QT3DSF64 a) { return ::ceil(a); }
+
+ /**
+ \brief mod returns the floating-point remainder of x / y.
+
+ If the value of y is 0.0, mod returns a quiet NaN.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 mod(const QT3DSF32 x, const QT3DSF32 y)
+ {
+ return (QT3DSF32)::fmod(x, y);
+ }
+
+ /**
+ \brief mod returns the floating-point remainder of x / y.
+
+ If the value of y is 0.0, mod returns a quiet NaN.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 mod(const QT3DSF64 x, const QT3DSF64 y)
+ {
+ return ::fmod(x, y);
+ }
+
+ /**
+ \brief Square.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 sqr(const QT3DSF32 a) { return a * a; }
+
+ /**
+ \brief Square.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 sqr(const QT3DSF64 a) { return a * a; }
+
+ /**
+ \brief Calculates x raised to the power of y.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 pow(const QT3DSF32 x, const QT3DSF32 y)
+ {
+ return ::powf(x, y);
+ }
+
+ /**
+ \brief Calculates x raised to the power of y.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 pow(const QT3DSF64 x, const QT3DSF64 y) { return ::pow(x, y); }
+
+ /**
+ \brief Calculates e^n
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 exp(const QT3DSF32 a) { return QT3DSF32(::exp(a)); }
+ /**
+
+ \brief Calculates e^n
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 exp(const QT3DSF64 a) { return ::exp(a); }
+
+ /**
+ \brief Calculates logarithms.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 logE(const QT3DSF32 a) { return QT3DSF32(::log(a)); }
+
+ /**
+ \brief Calculates logarithms.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 logE(const QT3DSF64 a) { return ::log(a); }
+
+ /**
+ \brief Calculates logarithms.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 log2(const QT3DSF32 a)
+ {
+ return QT3DSF32(::log(a)) / 0.693147180559945309417f;
+ }
+
+ /**
+ \brief Calculates logarithms.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 log2(const QT3DSF64 a)
+ {
+ return ::log(a) / 0.693147180559945309417;
+ }
+
+ /**
+ \brief Calculates logarithms.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 log10(const QT3DSF32 a) { return (QT3DSF32)::log10(a); }
+
+ /**
+ \brief Calculates logarithms.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 log10(const QT3DSF64 a) { return ::log10(a); }
+
+ /**
+ \brief Converts degrees to radians.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 degToRad(const QT3DSF32 a)
+ {
+ return (QT3DSF32)0.01745329251994329547 * a;
+ }
+
+ /**
+ \brief Converts degrees to radians.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 degToRad(const QT3DSF64 a)
+ {
+ return (QT3DSF64)0.01745329251994329547 * a;
+ }
+
+ /**
+ \brief Converts radians to degrees.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 radToDeg(const QT3DSF32 a)
+ {
+ return (QT3DSF32)57.29577951308232286465 * a;
+ }
+
+ /**
+ \brief Converts radians to degrees.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF64 radToDeg(const QT3DSF64 a)
+ {
+ return (QT3DSF64)57.29577951308232286465 * a;
+ }
+
+ //! \brief compute sine and cosine at the same time. There is a 'fsincos' on PC that we probably want to use here
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void sincos(const QT3DSF32 radians, QT3DSF32 &sin, QT3DSF32 &cos)
+ {
+ /* something like:
+ _asm fld Local
+ _asm fsincos
+ _asm fstp LocalCos
+ _asm fstp LocalSin
+ */
+ sin = NVSin(radians);
+ cos = NVCos(radians);
+ }
+
+ /**
+ \brief uniform random number in [a,b]
+ */
+ QT3DS_FORCE_INLINE QT3DSI32 rand(const QT3DSI32 a, const QT3DSI32 b)
+ {
+ return a + (QT3DSI32)(::rand() % (b - a + 1));
+ }
+
+ /**
+ \brief uniform random number in [a,b]
+ */
+ QT3DS_FORCE_INLINE QT3DSF32 rand(const QT3DSF32 a, const QT3DSF32 b)
+ {
+ return a + (b - a) * ::rand() / RAND_MAX;
+ }
+
+ //! \brief return angle between two vectors in radians
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSF32 angle(const QT3DSVec3 &v0, const QT3DSVec3 &v1)
+ {
+ const QT3DSF32 cos = v0.dot(v1); // |v0|*|v1|*Cos(Angle)
+ const QT3DSF32 sin = (v0.cross(v1)).magnitude(); // |v0|*|v1|*Sin(Angle)
+ return NVAtan2(sin, cos);
+ }
+
+ //! If possible use instead fsel on the dot product /*fsel(d.dot(p),onething,anotherthing);*/
+ //! Compares orientations (more readable, user-friendly function)
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool sameDirection(const QT3DSVec3 &d, const QT3DSVec3 &p)
+ {
+ return d.dot(p) >= 0.0f;
+ }
+
+ //! Checks 2 values have different signs
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE IntBool differentSign(NVReal f0, NVReal f1)
+ {
+ union {
+ QT3DSU32 u;
+ NVReal f;
+ } u1, u2;
+ u1.f = f0;
+ u2.f = f1;
+ return (u1.u ^ u2.u) & QT3DS_SIGN_BITMASK;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSMat33 star(const QT3DSVec3 &v)
+ {
+ return QT3DSMat33(QT3DSVec3(0, v.z, -v.y), QT3DSVec3(-v.z, 0, v.x), QT3DSVec3(v.y, -v.x, 0));
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 log(const QT3DSQuat &q)
+ {
+ const NVReal s = q.getImaginaryPart().magnitude();
+ if (s < 1e-12)
+ return QT3DSVec3(0.0f);
+ // force the half-angle to have magnitude <= pi/2
+ NVReal halfAngle = q.w < 0 ? NVAtan2(-s, -q.w) : NVAtan2(s, q.w);
+ QT3DS_ASSERT(halfAngle >= -NVPi / 2 && halfAngle <= NVPi / 2);
+
+ return q.getImaginaryPart().getNormalized() * 2 * halfAngle;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat exp(const QT3DSVec3 &v)
+ {
+ const NVReal m = v.magnitudeSquared();
+ return m < 1e-24 ? QT3DSQuat::createIdentity() : QT3DSQuat(NVSqrt(m), v * NVRecipSqrt(m));
+ }
+
+ // quat to rotate v0 t0 v1
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat rotationArc(const QT3DSVec3 &v0, const QT3DSVec3 &v1)
+ {
+ const QT3DSVec3 cross = v0.cross(v1);
+ const NVReal d = v0.dot(v1);
+ if (d <= -0.99999f)
+ return (NVAbs(v0.x) < 0.1f ? QT3DSQuat(0.0f, v0.z, -v0.y, 0.0f)
+ : QT3DSQuat(v0.y, -v0.x, 0.0, 0.0))
+ .getNormalized();
+
+ const NVReal s = NVSqrt((1 + d) * 2), r = 1 / s;
+
+ return QT3DSQuat(cross.x * r, cross.y * r, cross.z * r, s * 0.5f).getNormalized();
+ }
+
+ //! Computes the maximum delta to another transform
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal maxComponentDelta(const NVTransform &t0,
+ const NVTransform &t1)
+ {
+ NVReal delta = NVAbs(t0.p.x - t1.p.x);
+ delta = NVMax(delta, NVAbs(t0.p.y - t1.p.y));
+ delta = NVMax(delta, NVAbs(t0.p.z - t1.p.z));
+ delta = NVMax(delta, NVAbs(t0.q.x - t1.q.x));
+ delta = NVMax(delta, NVAbs(t0.q.y - t1.q.y));
+ delta = NVMax(delta, NVAbs(t0.q.z - t1.q.z));
+ delta = NVMax(delta, NVAbs(t0.q.w - t1.q.w));
+
+ return delta;
+ }
+
+ /**
+ \brief returns largest axis
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSU32 largestAxis(const QT3DSVec3 &v)
+ {
+ QT3DSU32 m = v.y > v.x ? 1 : 0;
+ return v.z > v[m] ? 2 : m;
+ }
+
+ /**
+ \brief returns axis with smallest absolute value
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSU32 closestAxis(const QT3DSVec3 &v)
+ {
+ QT3DSU32 m = NVAbs(v.y) > NVAbs(v.x) ? 1 : 0;
+ return NVAbs(v.z) > NVAbs(v[m]) ? 2 : m;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSU32 closestAxis(const QT3DSVec3 &v, QT3DSU32 &j, QT3DSU32 &k)
+ {
+ // find largest 2D plane projection
+ const QT3DSF32 absNV = NVAbs(v.x);
+ const QT3DSF32 absNy = NVAbs(v.y);
+ const QT3DSF32 absNz = NVAbs(v.z);
+
+ QT3DSU32 m = 0; // x biggest axis
+ j = 1;
+ k = 2;
+ if (absNy > absNV && absNy > absNz) {
+ // y biggest
+ j = 2;
+ k = 0;
+ m = 1;
+ } else if (absNz > absNV) {
+ // z biggest
+ j = 0;
+ k = 1;
+ m = 2;
+ }
+ return m;
+ }
+
+ /*!
+ Extend an edge along its length by a factor
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void makeFatEdge(QT3DSVec3 &p0, QT3DSVec3 &p1, NVReal fatCoeff)
+ {
+ QT3DSVec3 delta = p1 - p0;
+
+ const NVReal m = delta.magnitude();
+ if (m > 0.0f) {
+ delta *= fatCoeff / m;
+ p0 -= delta;
+ p1 += delta;
+ }
+ }
+
+ //! Compute point as combination of barycentric coordinates
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 computeBarycentricPoint(const QT3DSVec3 &p0,
+ const QT3DSVec3 &p1,
+ const QT3DSVec3 &p2, NVReal u,
+ NVReal v)
+ {
+ // This seems to confuse the compiler...
+ // return (1.0f - u - v)*p0 + u*p1 + v*p2;
+ const QT3DSF32 w = 1.0f - u - v;
+ return QT3DSVec3(w * p0.x + u * p1.x + v * p2.x, w * p0.y + u * p1.y + v * p2.y,
+ w * p0.z + u * p1.z + v * p2.z);
+ }
+
+ // generates a pair of quaternions (swing, twist) such that in = swing * twist, with
+ // swing.x = 0
+ // twist.y = twist.z = 0, and twist is a unit quat
+ QT3DS_FORCE_INLINE void separateSwingTwist(const QT3DSQuat &q, QT3DSQuat &swing, QT3DSQuat &twist)
+ {
+ twist = q.x != 0.0f ? QT3DSQuat(q.x, 0, 0, q.w).getNormalized() : QT3DSQuat::createIdentity();
+ swing = q * twist.getConjugate();
+ }
+
+ // generate two tangent vectors to a given normal
+ QT3DS_FORCE_INLINE void normalToTangents(const QT3DSVec3 &normal, QT3DSVec3 &tangent0, QT3DSVec3 &tangent1)
+ {
+ tangent0 = NVAbs(normal.x) < 0.70710678f ? QT3DSVec3(0, -normal.z, normal.y)
+ : QT3DSVec3(-normal.y, normal.x, 0);
+ tangent0.normalize();
+ tangent1 = normal.cross(tangent0);
+ }
+
+ // todo: what is this function doing?
+ QT3DS_FOUNDATION_API QT3DSQuat computeQuatFromNormal(const QT3DSVec3 &n);
+
+ /**
+ \brief computes a oriented bounding box around the scaled basis.
+ \param basis Input = skewed basis, Output = (normalized) orthogonal basis.
+ \return Bounding box extent.
+ */
+ QT3DS_FOUNDATION_API QT3DSVec3 optimizeBoundingBox(QT3DSMat33 &basis);
+
+ QT3DS_FOUNDATION_API QT3DSQuat slerp(const NVReal t, const QT3DSQuat &left, const QT3DSQuat &right);
+
+ QT3DS_INLINE QT3DSVec3 ellipseClamp(const QT3DSVec3 &point, const QT3DSVec3 &radii)
+ {
+ // This function need to be implemented in the header file because
+ // it is included in a spu shader program.
+
+ // finds the closest point on the ellipse to a given point
+
+ // (p.y, p.z) is the input point
+ // (e.y, e.z) are the radii of the ellipse
+
+ // lagrange multiplier method with Newton/Halley hybrid root-finder.
+ // see http://www.geometrictools.com/Documentation/DistancePointToEllipse2.pdf
+ // for proof of Newton step robustness and initial estimate.
+ // Halley converges much faster but sometimes overshoots - when that happens we take
+ // a newton step instead
+
+ // converges in 1-2 iterations where D&C works well, and it's good with 4 iterations
+ // with any ellipse that isn't completely crazy
+
+ const QT3DSU32 MAX_ITERATIONS = 20;
+ const NVReal convergenceThreshold = 1e-4f;
+
+ // iteration requires first quadrant but we recover generality later
+
+ QT3DSVec3 q(0, NVAbs(point.y), NVAbs(point.z));
+ const NVReal tinyEps =
+ (NVReal)(1e-6f); // very close to minor axis is numerically problematic but trivial
+ if (radii.y >= radii.z) {
+ if (q.z < tinyEps)
+ return QT3DSVec3(0, point.y > 0 ? radii.y : -radii.y, 0);
+ } else {
+ if (q.y < tinyEps)
+ return QT3DSVec3(0, 0, point.z > 0 ? radii.z : -radii.z);
+ }
+
+ QT3DSVec3 denom, e2 = radii.multiply(radii), eq = radii.multiply(q);
+
+ // we can use any initial guess which is > maximum(-e.y^2,-e.z^2) and for which f(t) is > 0.
+ // this guess works well near the axes, but is weak along the diagonals.
+
+ NVReal t = NVMax(eq.y - e2.y, eq.z - e2.z);
+
+ for (QT3DSU32 i = 0; i < MAX_ITERATIONS; i++) {
+ denom = QT3DSVec3(0, 1 / (t + e2.y), 1 / (t + e2.z));
+ QT3DSVec3 denom2 = eq.multiply(denom);
+
+ QT3DSVec3 fv = denom2.multiply(denom2);
+ NVReal f = fv.y + fv.z - 1;
+
+ // although in exact arithmetic we are guaranteed f>0, we can get here
+ // on the first iteration via catastrophic cancellation if the point is
+ // very close to the origin. In that case we just behave as if f=0
+
+ if (f < convergenceThreshold)
+ return e2.multiply(point).multiply(denom);
+
+ NVReal df = fv.dot(denom) * -2.0f;
+ t = t - f / df;
+ }
+
+ // we didn't converge, so clamp what we have
+ QT3DSVec3 r = e2.multiply(point).multiply(denom);
+ return r * NVRecipSqrt(sqr(r.y / radii.y) + sqr(r.z / radii.z));
+ }
+
+ QT3DS_INLINE NVReal tanHalf(NVReal sin, NVReal cos) { return sin / (1 + cos); }
+
+ QT3DS_INLINE QT3DSQuat quatFromTanQVector(const QT3DSVec3 &v)
+ {
+ NVReal v2 = v.dot(v);
+ if (v2 < 1e-12f)
+ return QT3DSQuat::createIdentity();
+ NVReal d = 1 / (1 + v2);
+ return QT3DSQuat(v.x * 2, v.y * 2, v.z * 2, 1 - v2) * d;
+ }
+
+ QT3DS_FORCE_INLINE QT3DSVec3 cross100(const QT3DSVec3 &b) { return QT3DSVec3(0.0f, -b.z, b.y); }
+ QT3DS_FORCE_INLINE QT3DSVec3 cross010(const QT3DSVec3 &b) { return QT3DSVec3(b.z, 0.0f, -b.x); }
+ QT3DS_FORCE_INLINE QT3DSVec3 cross001(const QT3DSVec3 &b) { return QT3DSVec3(-b.y, b.x, 0.0f); }
+
+ QT3DS_INLINE void decomposeVector(QT3DSVec3 &normalCompo, QT3DSVec3 &tangentCompo,
+ const QT3DSVec3 &outwardDir, const QT3DSVec3 &outwardNormal)
+ {
+ normalCompo = outwardNormal * (outwardDir.dot(outwardNormal));
+ tangentCompo = outwardDir - normalCompo;
+ }
+
+ //! \brief Return (i+1)%3
+ // Avoid variable shift for XBox:
+ // QT3DS_INLINE QT3DSU32 NV::getNextIndex3(QT3DSU32 i) { return (1<<i) & 3;
+ // }
+ QT3DS_INLINE QT3DSU32 getNextIndex3(QT3DSU32 i) { return (i + 1 + (i >> 1)) & 3; }
+
+ QT3DS_INLINE QT3DSMat33 rotFrom2Vectors(const QT3DSVec3 &from, const QT3DSVec3 &to)
+ {
+ // See bottom of
+ // http://www.euclideanspace.com/maths/algebra/matrix/orthogonal/rotation/index.htm
+
+ // Early exit if to = from
+ if ((from - to).magnitudeSquared() < 1e-4f)
+ return QT3DSMat33::createIdentity();
+
+ // Early exit if to = -from
+ if ((from + to).magnitudeSquared() < 1e-4f)
+ return QT3DSMat33::createDiagonal(QT3DSVec3(1.0f, -1.0f, -1.0f));
+
+ QT3DSVec3 n = from.cross(to);
+
+ NVReal C = from.dot(to), S = NVSqrt(1 - C * C), CC = 1 - C;
+
+ NVReal xx = n.x * n.x, yy = n.y * n.y, zz = n.z * n.z, xy = n.x * n.y, yz = n.y * n.z,
+ xz = n.x * n.z;
+
+ QT3DSMat33 R;
+
+ R(0, 0) = 1 + CC * (xx - 1);
+ R(0, 1) = -n.z * S + CC * xy;
+ R(0, 2) = n.y * S + CC * xz;
+
+ R(1, 0) = n.z * S + CC * xy;
+ R(1, 1) = 1 + CC * (yy - 1);
+ R(1, 2) = -n.x * S + CC * yz;
+
+ R(2, 0) = -n.y * S + CC * xz;
+ R(2, 1) = n.x * S + CC * yz;
+ R(2, 2) = 1 + CC * (zz - 1);
+
+ return R;
+ }
+
+ QT3DS_FOUNDATION_API void integrateTransform(const NVTransform &curTrans, const QT3DSVec3 &linvel,
+ const QT3DSVec3 &angvel, NVReal timeStep,
+ NVTransform &result);
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSMemoryBuffer.h b/src/foundation/Qt3DSMemoryBuffer.h
new file mode 100644
index 0000000..bee2f0c
--- /dev/null
+++ b/src/foundation/Qt3DSMemoryBuffer.h
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_MEMORYBUFFER_H
+#define QT3DS_FOUNDATION_MEMORYBUFFER_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSIntrinsics.h"
+
+#ifdef __INTEGRITY
+#define __restrict
+#endif
+
+namespace qt3ds {
+namespace foundation {
+ using namespace intrinsics;
+
+ template <typename TAllocator = ForwardingAllocator>
+ class MemoryBuffer : public TAllocator
+ {
+ QT3DSU8 *mBegin;
+ QT3DSU8 *mEnd;
+ QT3DSU8 *mCapacityEnd;
+
+ public:
+ MemoryBuffer(const TAllocator &inAlloc = TAllocator())
+ : TAllocator(inAlloc)
+ , mBegin(0)
+ , mEnd(0)
+ , mCapacityEnd(0)
+ {
+ }
+ ~MemoryBuffer()
+ {
+ if (mBegin)
+ TAllocator::deallocate(mBegin);
+ }
+ QT3DSU32 size() const { return static_cast<QT3DSU32>(mEnd - mBegin); }
+ QT3DSU32 capacity() const { return static_cast<QT3DSU32>(mCapacityEnd - mBegin); }
+ QT3DSU8 *begin() { return mBegin; }
+ QT3DSU8 *end() { return mEnd; }
+ const QT3DSU8 *begin() const { return mBegin; }
+ const QT3DSU8 *end() const { return mEnd; }
+ void clear() { mEnd = mBegin; }
+ void write(QT3DSU8 inValue) { *growBuf(1) = inValue; }
+
+ template <typename TDataType>
+ void write(const TDataType &inValue)
+ {
+ const QT3DSU8 *__restrict readPtr = reinterpret_cast<const QT3DSU8 *>(&inValue);
+ QT3DSU8 *__restrict writePtr = growBuf(sizeof(TDataType));
+ for (QT3DSU32 idx = 0; idx < sizeof(TDataType); ++idx)
+ writePtr[idx] = readPtr[idx];
+ }
+
+ template <typename TDataType>
+ void write(const TDataType *inValue, QT3DSU32 inLength)
+ {
+ using namespace qt3ds::intrinsics;
+ if (inValue && inLength) {
+ QT3DSU32 writeSize = inLength * sizeof(TDataType);
+ memCopy(growBuf(writeSize), inValue, writeSize);
+ }
+ if (inLength && !inValue) {
+ QT3DS_ASSERT(false);
+ // You can't not write something, because that will cause
+ // the receiving end to crash.
+ QT3DSU32 writeSize = inLength * sizeof(TDataType);
+ for (QT3DSU32 idx = 0; idx < writeSize; ++idx)
+ write((QT3DSU8)0);
+ }
+ }
+
+ void writeStrided(const QT3DSU8 *__restrict inData, QT3DSU32 inItemSize, QT3DSU32 inLength,
+ QT3DSU32 inStride)
+ {
+ if (inStride == 0 || inStride == inItemSize)
+ write(inData, inLength * inItemSize);
+ else if (inData && inLength) {
+ QT3DSU32 writeSize = inLength * inItemSize;
+ QT3DSU8 *__restrict writePtr = growBuf(writeSize);
+ for (QT3DSU32 idx = 0; idx < inLength;
+ ++idx, writePtr += inItemSize, inData += inStride)
+ memCopy(writePtr, inData, inItemSize);
+ }
+ }
+ QT3DSU8 *growBuf(QT3DSU32 inAmount)
+ {
+ QT3DSU32 offset = size();
+ QT3DSU32 newSize = offset + inAmount;
+ reserve(newSize);
+ mEnd += inAmount;
+ return mBegin + offset;
+ }
+ void writeZeros(QT3DSU32 inAmount)
+ {
+ QT3DSU32 offset = size();
+ growBuf(inAmount);
+ qt3ds::foundation::memZero(begin() + offset, inAmount);
+ }
+ void align(QT3DSU32 inAmount)
+ {
+ QT3DSU32 leftover = size() % inAmount;
+ if (leftover)
+ writeZeros(inAmount - leftover);
+ }
+ void reserve(QT3DSU32 newSize)
+ {
+ using namespace qt3ds::intrinsics;
+ QT3DSU32 currentSize = size();
+ if (newSize && newSize >= capacity()) {
+ QT3DSU32 newDataSize = newSize * 2;
+ if (newDataSize > 8192)
+ newDataSize = (QT3DSU32)((QT3DSU32)newSize * 1.2f);
+ QT3DSU8 *newData =
+ static_cast<QT3DSU8 *>(TAllocator::allocate(newDataSize, __FILE__, __LINE__));
+ if (mBegin) {
+ memCopy(newData, mBegin, currentSize);
+ TAllocator::deallocate(mBegin);
+ }
+ mBegin = newData;
+ mEnd = mBegin + currentSize;
+ mCapacityEnd = mBegin + newDataSize;
+ }
+ }
+ operator NVDataRef<QT3DSU8>() { return NVDataRef<QT3DSU8>(begin(), size()); }
+ operator NVConstDataRef<QT3DSU8>() const { return NVConstDataRef<QT3DSU8>(begin(), size()); }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/foundation/Qt3DSMutex.h b/src/foundation/Qt3DSMutex.h
new file mode 100644
index 0000000..5b717e5
--- /dev/null
+++ b/src/foundation/Qt3DSMutex.h
@@ -0,0 +1,376 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSMUTEX_H
+#define QT3DS_FOUNDATION_PSMUTEX_H
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSNoCopy.h"
+
+/*
+ * This <new> inclusion is a best known fix for gcc 4.4.1 error:
+ * Creating object file for apex/src/NVAllocator.cpp ...
+ * In file included from apex/include/Qt3DSFoundation.h:30,
+ * from apex/src/NVAllocator.cpp:26:
+ * apex/include/Qt3DSMutex.h: In constructor 'nv::foundation::MutexT<Alloc>::MutexT(const Alloc&)':
+ * apex/include/Qt3DSMutex.h:92: error: no matching function for call to 'operator new(unsigned int,
+ * qt3ds::foundation::MutexImpl*&)'
+ * <built-in>:0: note: candidates are: void* operator new(unsigned int)
+ */
+#include <new>
+
+namespace qt3ds {
+namespace foundation {
+#ifdef QT3DS_FOUNDATION_NO_EXPORTS
+ class QT3DS_AUTOTEST_EXPORT MutexImpl
+#else
+ class QT3DS_FOUNDATION_API MutexImpl
+#endif
+ {
+ public:
+ /**
+ The constructor for Mutex creates a mutex. It is initially unlocked.
+ */
+ MutexImpl();
+
+ /**
+ The destructor for Mutex deletes the mutex.
+ */
+ ~MutexImpl();
+
+ /**
+ Acquire (lock) the mutex. If the mutex is already locked
+ by another thread, this method blocks until the mutex is
+ unlocked.
+ */
+ bool lock();
+
+ /**
+ Acquire (lock) the mutex. If the mutex is already locked
+ by another thread, this method returns false without blocking.
+ */
+ bool trylock();
+
+ /**
+ Release (unlock) the mutex.
+ */
+ bool unlock();
+
+ /**
+ Size of this class.
+ */
+ static const QT3DSU32 size;
+ };
+
+ class Mutex
+ {
+ public:
+ class ScopedLock : private NoCopy
+ {
+ Mutex &mMutex;
+
+ public:
+ QT3DS_INLINE ScopedLock(Mutex &mutex)
+ : mMutex(mutex)
+ {
+ mMutex.lock();
+ }
+ QT3DS_INLINE ~ScopedLock() { mMutex.unlock(); }
+ };
+
+ /**
+ The constructor for Mutex creates a mutex. It is initially unlocked.
+ */
+ Mutex(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ mImpl = (MutexImpl *)QT3DS_ALLOC(alloc, MutexImpl::size, "MutexImpl");
+ QT3DS_PLACEMENT_NEW(mImpl, MutexImpl)();
+ }
+
+ /**
+ The destructor for Mutex deletes the mutex.
+ */
+ ~Mutex()
+ {
+ mImpl->~MutexImpl();
+ QT3DS_FREE(mAllocator, mImpl);
+ }
+
+ /**
+ Acquire (lock) the mutex. If the mutex is already locked
+ by another thread, this method blocks until the mutex is
+ unlocked.
+ */
+ bool lock() const { return mImpl->lock(); }
+
+ /**
+ Acquire (lock) the mutex. If the mutex is already locked
+ by another thread, this method returns false without blocking.
+ */
+ bool trylock() const { return mImpl->trylock(); }
+
+ /**
+ Release (unlock) the mutex.
+ */
+ bool unlock() const { return mImpl->unlock(); }
+
+ private:
+ NVAllocatorCallback &mAllocator;
+ MutexImpl *mImpl;
+ };
+
+ class QT3DS_FOUNDATION_API ReadWriteLock : private NoCopy
+ {
+ public:
+ ReadWriteLock(NVAllocatorCallback &alloc);
+ ~ReadWriteLock();
+
+ void lockReader();
+ void lockWriter();
+
+ void unlockReader();
+ void unlockWriter();
+
+ private:
+ class ReadWriteLockImpl *mImpl;
+ };
+
+ class ScopedReadLock : private NoCopy
+ {
+ public:
+ QT3DS_INLINE ScopedReadLock(ReadWriteLock &lock)
+ : mLock(lock)
+ {
+ mLock.lockReader();
+ }
+ QT3DS_INLINE ~ScopedReadLock() { mLock.unlockReader(); }
+
+ private:
+ ReadWriteLock &mLock;
+ };
+
+ class ScopedWriteLock : private NoCopy
+ {
+ public:
+ QT3DS_INLINE ScopedWriteLock(ReadWriteLock &lock)
+ : mLock(lock)
+ {
+ mLock.lockWriter();
+ }
+ QT3DS_INLINE ~ScopedWriteLock() { mLock.unlockWriter(); }
+
+ private:
+ ReadWriteLock &mLock;
+ };
+
+/*
+ * Use this type of lock for mutex behaviour that must operate on SPU and PPU
+ * On non-PS3 platforms, it is implemented using Mutex
+ */
+#ifndef QT3DS_PS3
+
+ class AtomicLock : private NoCopy
+ {
+ Mutex mMutex;
+
+ public:
+ AtomicLock(NVAllocatorCallback &alloc)
+ : mMutex(alloc)
+ {
+ }
+
+ bool lock() { return mMutex.lock(); }
+
+ bool trylock() { return mMutex.trylock(); }
+
+ bool unlock() { return mMutex.unlock(); }
+ };
+
+ class AtomicLockCopy
+ {
+ AtomicLock *pLock;
+
+ public:
+ AtomicLockCopy()
+ : pLock(NULL)
+ {
+ }
+
+ AtomicLockCopy &operator=(AtomicLock &lock)
+ {
+ pLock = &lock;
+ return *this;
+ }
+
+ bool lock() { return pLock->lock(); }
+
+ bool trylock() { return pLock->trylock(); }
+
+ bool unlock() { return pLock->unlock(); }
+ };
+#else
+ struct AtomicLockImpl
+ {
+ QT3DS_ALIGN(128, QT3DSU32 m_Lock);
+ QT3DSI32 m_LockId;
+ QT3DSU32 m_LockCount;
+
+ AtomicLockImpl();
+ };
+ class AtomicLock //: private NoCopy
+ {
+ friend class AtomicLockCopy;
+ AtomicLockImpl *m_pImpl;
+
+ public:
+ AtomicLock();
+
+ ~AtomicLock();
+
+ bool lock();
+
+ bool trylock();
+
+ bool unlock();
+ };
+
+ // if an AtomicLock is copied and then the copy goes out of scope, it'll delete the atomic
+ // primitive
+ // (just a 128-byte aligned int) and cause a crash when it tries to delete it again
+ // This class just uses the atomic primitive without releasing it in the end.
+
+ class AtomicLockCopy
+ {
+ AtomicLockImpl *m_pImpl;
+
+ public:
+ AtomicLockCopy()
+ : m_pImpl(NULL)
+ {
+ }
+
+ AtomicLockCopy(const AtomicLock &lock)
+ : m_pImpl(lock.m_pImpl)
+ {
+ }
+
+ ~AtomicLockCopy() {}
+
+ AtomicLockCopy &operator=(const AtomicLock &lock)
+ {
+ m_pImpl = lock.m_pImpl;
+ return *this;
+ }
+
+ bool lock();
+
+ bool trylock();
+
+ bool unlock();
+ };
+#endif
+
+#ifndef QT3DS_PS3
+
+ class AtomicRwLock : private NoCopy
+ {
+ ReadWriteLock m_Lock;
+
+ public:
+ AtomicRwLock(NVAllocatorCallback &alloc)
+ : m_Lock(alloc)
+ {
+ }
+
+ void lockReader() { m_Lock.lockReader(); }
+ void lockWriter() { m_Lock.lockWriter(); }
+
+ bool tryLockReader()
+ {
+ // Todo - implement this
+ m_Lock.lockReader();
+ return true;
+ }
+
+ void unlockReader() { m_Lock.unlockReader(); }
+ void unlockWriter() { m_Lock.unlockWriter(); }
+ };
+#else
+
+ struct AtomicRwLockImpl
+ {
+ QT3DS_ALIGN(128, volatile QT3DSU32 m_Lock);
+ QT3DS_ALIGN(128, volatile QT3DSU32 m_ReadCounter);
+ QT3DSI32 m_LockId;
+ QT3DSU32 m_LockCount;
+
+ AtomicRwLockImpl();
+ };
+
+ class AtomicRwLock : private NoCopy
+ {
+ AtomicRwLockImpl *m_pImpl;
+
+ public:
+ AtomicRwLock();
+
+ ~AtomicRwLock();
+
+ void lockReader();
+
+ bool tryLockReader();
+
+ void lockWriter();
+
+ void unlockReader();
+
+ void unlockWriter();
+ };
+
+#endif
+
+ class ScopedAtomicLock : private NoCopy
+ {
+ QT3DS_INLINE ScopedAtomicLock(AtomicLock &lock)
+ : mLock(lock)
+ {
+ mLock.lock();
+ }
+ QT3DS_INLINE ~ScopedAtomicLock() { mLock.unlock(); }
+
+ private:
+ AtomicLock &mLock;
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSNoCopy.h b/src/foundation/Qt3DSNoCopy.h
new file mode 100644
index 0000000..817f5e1
--- /dev/null
+++ b/src/foundation/Qt3DSNoCopy.h
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSNOCOPY_H
+#define QT3DS_FOUNDATION_PSNOCOPY_H
+
+#include "foundation/Qt3DS.h"
+
+namespace qt3ds {
+namespace foundation {
+ class NoCopy
+ {
+ NoCopy(const NoCopy &c);
+ NoCopy &operator=(const NoCopy &c);
+
+ public:
+ NoCopy() {}
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSOption.h b/src/foundation/Qt3DSOption.h
new file mode 100644
index 0000000..18d6c3b
--- /dev/null
+++ b/src/foundation/Qt3DSOption.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_OPTION_H
+#define QT3DS_FOUNDATION_OPTION_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ struct Empty
+ {
+ };
+
+ template <typename TDataType>
+ class Option
+ {
+ TDataType mData;
+ bool mHasValue;
+
+ public:
+ Option(const TDataType &data)
+ : mData(data)
+ , mHasValue(true)
+ {
+ }
+ Option(const Empty &)
+ : mHasValue(false)
+ {
+ }
+ Option()
+ : mHasValue(false)
+ {
+ }
+ Option(const Option &other)
+ : mData(other.mData)
+ , mHasValue(other.mHasValue)
+ {
+ }
+ Option &operator=(const Option &other)
+ {
+ mData = other.mData;
+ mHasValue = other.mHasValue;
+ return *this;
+ }
+
+ bool isEmpty() const { return !mHasValue; }
+ void setEmpty() { mHasValue = false; }
+ bool hasValue() const { return mHasValue; }
+
+ const TDataType &getValue() const
+ {
+ QT3DS_ASSERT(mHasValue);
+ return mData;
+ }
+ TDataType &getValue()
+ {
+ QT3DS_ASSERT(mHasValue);
+ return mData;
+ }
+ TDataType &unsafeGetValue() { return mData; }
+
+ operator const TDataType &() const { return getValue(); }
+ operator TDataType &() { return getValue(); }
+
+ const TDataType *operator->() const { return &getValue(); }
+ TDataType *operator->() { return &getValue(); }
+
+ const TDataType &operator*() const { return getValue(); }
+ TDataType &operator*() { return getValue(); }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/foundation/Qt3DSPerfTimer.cpp b/src/foundation/Qt3DSPerfTimer.cpp
new file mode 100644
index 0000000..06fb5d3
--- /dev/null
+++ b/src/foundation/Qt3DSPerfTimer.cpp
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "EASTL/hash_map.h"
+#include "EASTL/string.h"
+#include "EASTL/vector.h"
+#include "EASTL/sort.h"
+
+using namespace qt3ds::foundation;
+using namespace qt3ds;
+
+namespace {
+struct STimerEntry
+{
+ QT3DSU64 m_Total;
+ QT3DSU64 m_Max;
+ QT3DSU32 m_UpdateCount;
+ CRegisteredString m_Tag;
+ size_t m_Order;
+
+ STimerEntry(CRegisteredString tag, size_t order)
+ : m_Total(0)
+ , m_Max(0)
+ , m_UpdateCount(0)
+ , m_Tag(tag)
+ , m_Order(order)
+ {
+ }
+ void Update(QT3DSU64 increment)
+ {
+ m_Total += increment;
+ m_Max = increment > m_Max ? increment : m_Max;
+ ++m_UpdateCount;
+ }
+
+ void Output(NVFoundationBase &fnd, QT3DSU32 inFramesPassed)
+ {
+ Q_UNUSED(fnd)
+ if (m_Total) {
+ QT3DSU64 tensNanos = Time::sCounterFreq.toTensOfNanos(m_Total);
+ QT3DSU64 maxNanos = Time::sCounterFreq.toTensOfNanos(m_Max);
+
+ double milliseconds = tensNanos / 100000.0;
+ double maxMilliseconds = maxNanos / 100000.0;
+ if (inFramesPassed == 0)
+ qCWarning(WARNING, PERF_INFO, "%s - %fms", m_Tag.c_str(), milliseconds);
+ else {
+ milliseconds /= inFramesPassed;
+ qCWarning(WARNING, PERF_INFO, "%s - %fms/frame-total %fms-max %u hits",
+ m_Tag.c_str(), milliseconds, maxMilliseconds, m_UpdateCount);
+ }
+ }
+ }
+
+ void Reset()
+ {
+ m_Total = 0;
+ m_Max = 0;
+ m_UpdateCount = 0;
+ }
+
+ bool operator<(const STimerEntry &other) const { return m_Order < other.m_Order; }
+};
+struct SPerfTimer : public IPerfTimer
+{
+ typedef eastl::hash_map<CRegisteredString, STimerEntry> THashMapType;
+ NVFoundationBase &m_Foundation;
+ // This object needs its own string table because it is used during the binary load process with
+ // the application string table gets booted up.
+ NVScopedRefCounted<IStringTable> m_StringTable;
+ THashMapType m_Entries;
+ eastl::vector<STimerEntry> m_PrintEntries;
+ Mutex m_Mutex;
+ QT3DSI32 mRefCount;
+
+ SPerfTimer(NVFoundationBase &fnd)
+ : m_Foundation(fnd)
+ , m_StringTable(IStringTable::CreateStringTable(fnd.getAllocator()))
+ , m_Mutex(fnd.getAllocator())
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ void Update(const char *inId, QT3DSU64 inAmount) override
+ {
+ Mutex::ScopedLock __locker(m_Mutex);
+ CRegisteredString theStr(m_StringTable->RegisterStr(inId));
+ THashMapType::iterator theFind =
+ m_Entries.insert(eastl::make_pair(theStr, STimerEntry(theStr, m_Entries.size()))).first;
+ theFind->second.Update(inAmount);
+ }
+
+ // Dump current summation of timer data.
+ void OutputTimerData(QT3DSU32 inFramesPassed = 0) override
+ {
+ Mutex::ScopedLock __locker(m_Mutex);
+ m_PrintEntries.clear();
+ for (THashMapType::iterator iter = m_Entries.begin(), end = m_Entries.end(); iter != end;
+ ++iter) {
+ m_PrintEntries.push_back(iter->second);
+ iter->second.Reset();
+ }
+
+ eastl::sort(m_PrintEntries.begin(), m_PrintEntries.end());
+
+ for (QT3DSU32 idx = 0, end = (QT3DSU32)m_PrintEntries.size(); idx < end; ++idx) {
+ m_PrintEntries[idx].Output(m_Foundation, inFramesPassed);
+ }
+ }
+
+ void ResetTimerData() override
+ {
+ Mutex::ScopedLock __locker(m_Mutex);
+ for (THashMapType::iterator iter = m_Entries.begin(), end = m_Entries.end(); iter != end;
+ ++iter) {
+ iter->second.Reset();
+ }
+ }
+
+ virtual void ClearPerfKeys()
+ {
+ Mutex::ScopedLock __locker(m_Mutex);
+ m_Entries.clear();
+ }
+};
+}
+
+IPerfTimer &IPerfTimer::CreatePerfTimer(NVFoundationBase &fnd)
+{
+ return *QT3DS_NEW(fnd.getAllocator(), SPerfTimer)(fnd);
+}
diff --git a/src/foundation/Qt3DSPerfTimer.h b/src/foundation/Qt3DSPerfTimer.h
new file mode 100644
index 0000000..c63091c
--- /dev/null
+++ b/src/foundation/Qt3DSPerfTimer.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PERFTIMER_H
+#define QT3DS_FOUNDATION_PERFTIMER_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSTime.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ class IPerfTimer : public NVRefCounted
+ {
+ protected:
+ virtual ~IPerfTimer() {}
+ public:
+ // amount is in counter frequency units
+ virtual void Update(const char *inTag, QT3DSU64 inAmount) = 0;
+ // Dump current summation of timer data.
+ virtual void OutputTimerData(QT3DSU32 inFrameCount = 0) = 0;
+ virtual void ResetTimerData() = 0;
+
+ static IPerfTimer &CreatePerfTimer(NVFoundationBase &inFoundation);
+ };
+
+ // Specialize this struct to get the perf timer in different contexts.
+ template <typename TTimerProvider>
+ struct STimerProvider
+ {
+ static IPerfTimer &getPerfTimer(TTimerProvider &inProvider)
+ {
+ return inProvider.getPerfTimer();
+ }
+ };
+
+ template <typename TTimerProvider>
+ IPerfTimer &getPerfTimer(TTimerProvider &inProvider)
+ {
+ return STimerProvider<TTimerProvider>::getPerfTimer(inProvider);
+ }
+
+ struct SStackPerfTimer
+ {
+ IPerfTimer *m_Timer;
+ QT3DSU64 m_Start;
+ const char *m_Id;
+
+ SStackPerfTimer(IPerfTimer &destination, const char *inId)
+ : m_Timer(&destination)
+ , m_Start(Time::getCurrentCounterValue())
+ , m_Id(inId)
+ {
+ }
+
+ SStackPerfTimer(IPerfTimer *destination, const char *inId)
+ : m_Timer(destination)
+ , m_Start(Time::getCurrentCounterValue())
+ , m_Id(inId)
+ {
+ }
+
+ ~SStackPerfTimer()
+ {
+ if (m_Timer) {
+ QT3DSU64 theStop = Time::getCurrentCounterValue();
+ QT3DSU64 theAmount = theStop - m_Start;
+ m_Timer->Update(m_Id, theAmount);
+ }
+ }
+ };
+}
+}
+
+#define QT3DS_FOUNDATION_PERF_SCOPED_TIMER(context, name) \
+ SStackPerfTimer __perfTimer(getPerfTimer(context), #name);
+
+#endif \ No newline at end of file
diff --git a/src/foundation/Qt3DSPlane.h b/src/foundation/Qt3DSPlane.h
new file mode 100644
index 0000000..378c3bc
--- /dev/null
+++ b/src/foundation/Qt3DSPlane.h
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_PLANE_H
+#define QT3DS_FOUNDATION_QT3DS_PLANE_H
+
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DSMath.h"
+#include "foundation/Qt3DSVec3.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/**
+\brief Representation of a plane.
+
+ Plane equation used: n.dot(v) + d = 0
+*/
+class NVPlane
+{
+public:
+ /**
+ \brief Constructor
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVPlane() {}
+
+ /**
+ \brief Constructor from a normal and a distance
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVPlane(NVReal nx, NVReal ny, NVReal nz, NVReal distance)
+ : n(nx, ny, nz)
+ , d(distance)
+ {
+ }
+
+ /**
+ \brief Constructor from a normal and a distance
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVPlane(const QT3DSVec3 &normal, NVReal distance)
+ : n(normal)
+ , d(distance)
+ {
+ }
+
+ /**
+ \brief Constructor from a point on the plane and a normal
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVPlane(const QT3DSVec3 &point, const QT3DSVec3 &normal)
+ : n(normal)
+ , d(-point.dot(n)) // p satisfies normal.dot(p) + d = 0
+ {
+ }
+
+ /**
+ \brief Constructor from three points
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVPlane(const QT3DSVec3 &p0, const QT3DSVec3 &p1, const QT3DSVec3 &p2)
+ {
+ n = (p1 - p0).cross(p2 - p0).getNormalized();
+ d = -p0.dot(n);
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal distance(const QT3DSVec3 &p) const { return p.dot(n) + d; }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool contains(const QT3DSVec3 &p) const
+ {
+ return NVAbs(distance(p)) < (1.0e-7f);
+ }
+
+ /**
+ \brief projects p into the plane
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 project(const QT3DSVec3 &p) const
+ {
+ return p - n * distance(p);
+ }
+
+ /**
+ \brief find an arbitrary point in the plane
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 pointInPlane() const { return -n * d; }
+
+ /**
+ \brief equivalent plane with unit normal
+ */
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void normalize()
+ {
+ NVReal denom = 1.0f / n.magnitude();
+ n *= denom;
+ d *= denom;
+ }
+
+ QT3DSVec3 n; //!< The normal to the plane
+ NVReal d; //!< The distance from the origin
+};
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif
diff --git a/src/foundation/Qt3DSPool.h b/src/foundation/Qt3DSPool.h
new file mode 100644
index 0000000..5bd07f8
--- /dev/null
+++ b/src/foundation/Qt3DSPool.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_POOL_H
+#define QT3DS_POOL_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSMath.h" //NVMax
+#include "EASTL/vector.h"
+
+namespace qt3ds {
+namespace foundation {
+ // Pool of fixed size objects.
+ template <typename TObjType, typename TAllocator = EASTLAllocatorType,
+ QT3DSU32 alignmentInBytes = 4, QT3DSU32 slabSize = 4096>
+ class Pool
+ {
+ protected:
+ TAllocator mAllocator;
+ struct Link
+ {
+ Link *mNext;
+ Link(Link *next = NULL)
+ : mNext(next)
+ {
+ }
+ };
+ eastl::vector<void *, TAllocator> mSlabs;
+ Link *mFreeList;
+
+ public:
+ Pool(const TAllocator &alloc = TAllocator())
+ : mAllocator(alloc)
+ , mSlabs(alloc)
+ , mFreeList(NULL)
+ {
+ StaticAssert<sizeof(TObjType) < slabSize>::valid_expression();
+ }
+ ~Pool()
+ {
+ for (QT3DSU32 idx = 0, end = mSlabs.size(); idx < end; ++idx)
+ mAllocator.deallocate(mSlabs[idx], slabSize);
+ mSlabs.clear();
+ mFreeList = NULL;
+ }
+ void appendToFreeList(Link *inLink)
+ {
+ inLink->mNext = mFreeList;
+ mFreeList = inLink;
+ }
+ void appendSlabToFreeList(void *slab)
+ {
+ QT3DSU8 *newMem = reinterpret_cast<QT3DSU8 *>(slab);
+ QT3DSU32 objSize = (QT3DSU32)qt3ds::NVMax(sizeof(TObjType), sizeof(Link));
+ // align the memory correctly
+ if (objSize % alignmentInBytes)
+ objSize += alignmentInBytes - (objSize % alignmentInBytes);
+
+ QT3DSU32 numObjsInSlab = slabSize / objSize;
+ for (QT3DSU32 idx = 0; idx < numObjsInSlab; ++idx) {
+ QT3DSU8 *objPtr = newMem + idx * objSize;
+ appendToFreeList(reinterpret_cast<Link *>(objPtr));
+ }
+ }
+ void allocateSlab(const char *file, int line)
+ {
+ QT3DSU32 objSize = (QT3DSU32)NVMax(sizeof(TObjType), sizeof(Link));
+ // align the memory correctly
+ if (objSize % alignmentInBytes)
+ objSize += alignmentInBytes - (objSize % alignmentInBytes);
+
+ QT3DSU8 *newMem = (QT3DSU8 *)mAllocator.allocate(slabSize, file, line);
+ if (newMem == NULL)
+ return; // out of mem, bad error
+ mSlabs.push_back(newMem);
+ appendSlabToFreeList(newMem);
+ }
+
+ void *allocate(const char *file, int line)
+ {
+ if (!mFreeList)
+ allocateSlab(file, line);
+
+ if (mFreeList) {
+ Link *retval = mFreeList;
+ mFreeList = retval->mNext;
+ return retval;
+ }
+
+ return NULL;
+ }
+
+ void deallocate(void *inPtr)
+ {
+#if _DEBUG
+ // Ensure inPtr came from a known slab.
+ bool found = false;
+ for (QT3DSU32 idx = 0, end = mSlabs.size(); idx < end && !found; ++idx) {
+ QT3DSU8 *slabMem = reinterpret_cast<QT3DSU8 *>(mSlabs[idx]);
+ QT3DSU8 *slabEnd = slabMem + slabSize;
+ QT3DSU8 *memPtr = reinterpret_cast<QT3DSU8 *>(inPtr);
+
+ if (memPtr >= mSlabs[idx] && memPtr < slabEnd)
+ found = true;
+ }
+ QT3DS_ASSERT(found);
+#endif
+ appendToFreeList(reinterpret_cast<Link *>(inPtr));
+ }
+
+ template <typename TArg1, typename TArg2>
+ TObjType *construct(const TArg1 &arg1, const TArg2 &arg2, const char *file, int line)
+ {
+ TObjType *newMem = (TObjType *)allocate(file, line);
+ return new (newMem) TObjType(arg1, arg2);
+ }
+
+ template <typename TArg1>
+ TObjType *construct(const TArg1 &arg1, const char *file, int line)
+ {
+ TObjType *newMem = (TObjType *)allocate(file, line);
+ return new (newMem) TObjType(arg1);
+ }
+
+ TObjType *construct(const char *file, int line)
+ {
+ TObjType *newMem = (TObjType *)allocate(file, line);
+ return new (newMem) TObjType();
+ }
+ };
+}
+}
+#endif
diff --git a/src/foundation/Qt3DSPreprocessor.h b/src/foundation/Qt3DSPreprocessor.h
new file mode 100644
index 0000000..371d3e6
--- /dev/null
+++ b/src/foundation/Qt3DSPreprocessor.h
@@ -0,0 +1,375 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_PREPROCESSOR_H
+#define QT3DS_FOUNDATION_QT3DS_PREPROCESSOR_H
+
+#include <stddef.h>
+/** \addtogroup foundation
+ @{
+*/
+
+/**
+List of preprocessor defines used to configure the SDK
+- NDEBUG/_DEBUG: enable asserts (exactly one needs to be defined)
+- QT3DS_CHECKED: enable run time checks, mostly unused or equiv. to _DEBUG
+- QT3DS_SUPPORT_VISUAL_DEBUGGER: ...
+- AG_PERFMON: ...
+*/
+
+/**
+Compiler define
+*/
+#ifdef _MSC_VER
+#define QT3DS_VC
+#if _MSC_VER >= 1600
+#define QT3DS_VC10
+#elif _MSC_VER >= 1500
+#define QT3DS_VC9
+#elif _MSC_VER >= 1400
+#define QT3DS_VC8
+#elif _MSC_VER >= 1300
+#define QT3DS_VC7
+#else
+#define QT3DS_VC6
+#endif
+#elif __GNUC__ || __SNC__
+#define QT3DS_GNUC
+#elif defined(__MWERKS__)
+#define QT3DS_CW
+#elif defined(__ghs__)
+#define QT3DS_GHS
+#else
+#error "Unknown compiler"
+#endif
+
+/**
+Platform define
+*/
+#ifdef QT3DS_VC
+#ifdef _M_IX86
+#define QT3DS_X86
+#define QT3DS_WINDOWS
+#elif defined(_M_X64)
+#define QT3DS_X64
+#define QT3DS_WINDOWS
+#elif defined(_M_PPC)
+#define QT3DS_PPC
+#define QT3DS_X360
+#define QT3DS_VMX
+#elif defined(_M_ARM)
+#define QT3DS_ARM
+#define QT3DS_WIN8ARM
+#define QT3DS_ARM_NEON
+#else
+#error "Unknown platform"
+#endif
+#elif defined QT3DS_GNUC
+#ifdef __CELLOS_LV2__
+#define QT3DS_PS3
+#define QT3DS_VMX
+#elif defined(__arm__)
+#define QT3DS_ARM
+#if defined(__SNC__)
+#define QT3DS_PSP2
+#endif
+#if defined(__ARM_PCS_VFP)
+#define QT3DS_ARM_HARDFP
+#else
+#define QT3DS_ARM_SOFTFP
+#endif
+#elif defined(__aarch64__)
+#define QT3DS_ARM
+#elif defined(__i386__)
+#define QT3DS_X86
+#define QT3DS_VMX
+#elif defined(__x86_64__)
+#define QT3DS_X64
+#elif defined(__ppc__)
+#define QT3DS_PPC
+#elif defined(__ppc64__)
+#define QT3DS_PPC
+#define QT3DS_PPC64
+//# elif defined(__aarch64__)
+//# define QT3DS_ARM_64
+#else
+#error "Unknown platform"
+#endif
+#if defined(ANDROID)
+#define QT3DS_ANDROID
+#elif defined(__linux__)
+#define QT3DS_LINUX
+#elif defined(__APPLE__)
+#define QT3DS_APPLE
+#if defined(__arm__)
+#define QT3DS_APPLE_IOS
+#endif
+#elif defined(__CYGWIN__)
+#define QT3DS_CYGWIN
+#define QT3DS_LINUX
+#elif defined(__QNX__)
+#define QT3DS_QNX
+#elif defined(_WIN32)
+#define QT3DS_WINDOWS
+#else
+#error "Unkown OS"
+#endif
+#elif defined QT3DS_CW
+#if defined(__PPCGEKKO__)
+#if defined(RVL)
+#define QT3DS_WII
+#else
+#define QT3DS_GC
+#endif
+#else
+#error "Unknown platform"
+#endif
+#elif defined QT3DS_GHS
+#define QT3DS_LINUX // INTEGRITY deviations flagged with __INTEGRITY
+#if defined(__arm__) || defined(__aarch64__) || defined(__ARM64__)
+#define QT3DS_ARM
+#endif
+#endif
+
+/**
+DLL export macros
+*/
+#ifndef QT3DS_C_EXPORT
+#define QT3DS_C_EXPORT extern "C"
+#endif
+
+/**
+Define API function declaration
+
+QT3DS_FOUNDATION_EXPORTS - used by the DLL library (PhysXCommon) to export the API
+QT3DS_FOUNDATION_NO_EXPORTS - exists because there are windows configurations where
+ the QT3DS_FOUNDATION_API is linked through standard
+static linking
+no definition - this will allow DLLs and libraries to use the exported API from PhysXCommon
+
+*/
+#if defined(QT3DS_WINDOWS) && !defined(__CUDACC__)
+#if defined QT3DS_FOUNDATION_EXPORTS
+#define QT3DS_FOUNDATION_API __declspec(dllexport)
+#elif defined QT3DS_FOUNDATION_NO_EXPORTS
+#define QT3DS_FOUNDATION_API
+#else
+#define QT3DS_FOUNDATION_API __declspec(dllimport)
+#endif
+#else
+#define QT3DS_FOUNDATION_API
+#endif
+
+
+#if defined(QT3DS_AUTOTESTS_ENABLED)
+#include <qglobal.h>
+#if defined(QT3DS_BUILDING_LIBRARY)
+#define QT3DS_AUTOTEST_EXPORT Q_DECL_EXPORT
+#else
+#define QT3DS_AUTOTEST_EXPORT Q_DECL_IMPORT
+#endif
+#else
+#define QT3DS_AUTOTEST_EXPORT
+#endif
+
+/**
+Calling convention
+*/
+#ifndef QT3DS_CALL_CONV
+#if defined QT3DS_WINDOWS
+#define QT3DS_CALL_CONV __cdecl
+#else
+#define QT3DS_CALL_CONV
+#endif
+#endif
+
+/**
+Pack macros - disabled on SPU because they are not supported
+*/
+#if defined(QT3DS_VC)
+#define QT3DS_PUSH_PACK_DEFAULT __pragma(pack(push, 8))
+#define QT3DS_POP_PACK __pragma(pack(pop))
+#elif defined(QT3DS_GNUC) && !defined(__SPU__)
+#define QT3DS_PUSH_PACK_DEFAULT _Pragma("pack(push, 8)")
+#define QT3DS_POP_PACK _Pragma("pack(pop)")
+#else
+#define QT3DS_PUSH_PACK_DEFAULT
+#define QT3DS_POP_PACK
+#endif
+
+/**
+Inline macro
+*/
+#if defined(QT3DS_WINDOWS) || defined(QT3DS_X360)
+#define QT3DS_INLINE inline
+#ifdef QT3DS_VC
+#pragma inline_depth(255)
+#endif
+#else
+#define QT3DS_INLINE inline
+#endif
+
+/**
+Force inline macro
+*/
+#if defined(QT3DS_VC)
+#define QT3DS_FORCE_INLINE __forceinline
+#elif defined(QT3DS_LINUX) \
+ || defined(QT3DS_QNX) // Workaround; Fedora Core 3 do not agree with force inline and NVcPool
+#define QT3DS_FORCE_INLINE inline
+#elif defined(QT3DS_GNUC)
+#define QT3DS_FORCE_INLINE inline __attribute__((always_inline))
+#else
+#define QT3DS_FORCE_INLINE inline
+#endif
+
+/**
+Noinline macro
+*/
+#if defined QT3DS_WINDOWS
+#define QT3DS_NOINLINE __declspec(noinline)
+#elif defined(QT3DS_GNUC)
+#define QT3DS_NOINLINE __attribute__((noinline))
+#else
+#define QT3DS_NOINLINE
+#endif
+
+/*! restrict macro */
+#if __CUDACC__
+#define QT3DS_RESTRICT __restrict__
+#elif defined(QT3DS_GNUC) || defined(QT3DS_VC)
+#define QT3DS_RESTRICT __restrict
+#elif defined(QT3DS_CW) && __STDC_VERSION__ >= 199901L
+#define QT3DS_RESTRICT restrict
+#else
+#define QT3DS_RESTRICT
+#endif
+
+#if defined(QT3DS_WINDOWS) || defined(QT3DS_X360)
+#define QT3DS_NOALIAS __declspec(noalias)
+#else
+#define QT3DS_NOALIAS
+#endif
+
+/**
+Alignment macros
+
+QT3DS_ALIGN_PREFIX and QT3DS_ALIGN_SUFFIX can be used for type alignment instead of aligning individual
+variables as follows:
+QT3DS_ALIGN_PREFIX(16)
+struct A {
+...
+} QT3DS_ALIGN_SUFFIX(16);
+This declaration style is parsed correctly by Visual Assist.
+
+*/
+#ifndef QT3DS_ALIGN
+#if defined(QT3DS_VC)
+#define QT3DS_ALIGN(alignment, decl) __declspec(align(alignment)) decl
+#define QT3DS_ALIGN_PREFIX(alignment) __declspec(align(alignment))
+#define QT3DS_ALIGN_SUFFIX(alignment)
+#elif defined(QT3DS_GNUC)
+#define QT3DS_ALIGN(alignment, decl) decl __attribute__((aligned(alignment)))
+#define QT3DS_ALIGN_PREFIX(alignment)
+#define QT3DS_ALIGN_SUFFIX(alignment) __attribute__((aligned(alignment)))
+#elif defined(QT3DS_CW)
+#define QT3DS_ALIGN(alignment, decl) decl __attribute__((aligned(alignment)))
+#define QT3DS_ALIGN_PREFIX(alignment)
+#define QT3DS_ALIGN_SUFFIX(alignment) __attribute__((aligned(alignment)))
+#else
+#define QT3DS_ALIGN(alignment, decl)
+#define QT3DS_ALIGN_PREFIX(alignment)
+#define QT3DS_ALIGN_SUFFIX(alignment)
+#endif
+#endif
+
+/**
+Deprecated marco
+*/
+#if 0 // set to 1 to create warnings for deprecated functions
+#define QT3DS_DEPRECATED __declspec(deprecated)
+#else
+#define QT3DS_DEPRECATED
+#endif
+
+// VC6 no '__FUNCTION__' workaround
+#if defined QT3DS_VC6 && !defined __FUNCTION__
+#define __FUNCTION__ "Undefined"
+#endif
+
+/**
+General defines
+*/
+
+// Assertion type
+template <bool b>
+struct StaticAssert
+{
+};
+// Specialisation with member function
+template <>
+struct StaticAssert<true>
+{
+public:
+ static void valid_expression(){}
+};
+
+// static assert
+#define QT3DS_COMPILE_TIME_ASSERT(exp) typedef char NVCompileTimeAssert_Dummy[(exp) ? 1 : -1]
+
+#ifdef QT3DS_GNUC
+#define QT3DS_OFFSET_OF(X, Y) __builtin_offsetof(X, Y)
+#else
+#define QT3DS_OFFSET_OF(X, Y) offsetof(X, Y)
+#endif
+
+// avoid unreferenced parameter warning (why not just disable it?)
+// PT: or why not just omit the parameter's name from the declaration????
+#define QT3DS_FORCE_PARAMETER_REFERENCE(_P) (void)(_P);
+#define QT3DS_UNUSED(_P) QT3DS_FORCE_PARAMETER_REFERENCE(_P)
+
+// check that exactly one of NDEBUG and _DEBUG is defined
+#if !(defined NDEBUG ^ defined _DEBUG)
+#error Exactly one of NDEBUG and _DEBUG needs to be defined by preprocessor
+#endif
+
+// make sure QT3DS_CHECKED is defined in all _DEBUG configurations as well
+#if !defined(QT3DS_CHECKED) && _DEBUG
+#define QT3DS_CHECKED
+#endif
+
+#ifdef __CUDACC__
+#define QT3DS_CUDA_CALLABLE __host__ __device__
+#else
+#define QT3DS_CUDA_CALLABLE
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_PREPROCESSOR_H
diff --git a/src/foundation/Qt3DSQuat.h b/src/foundation/Qt3DSQuat.h
new file mode 100644
index 0000000..2792f97
--- /dev/null
+++ b/src/foundation/Qt3DSQuat.h
@@ -0,0 +1,381 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_QUAT_H
+#define QT3DS_FOUNDATION_QT3DS_QUAT_H
+
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DSVec3.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/**
+\brief This is a quaternion class. For more information on quaternion mathematics
+consult a mathematics source on complex numbers.
+
+*/
+
+class QT3DSQuat
+{
+public:
+ /**
+ \brief Default constructor, does not do any initialization.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat() {}
+
+ /**
+ \brief Constructor. Take note of the order of the elements!
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat(NVReal nx, NVReal ny, NVReal nz, NVReal nw)
+ : x(nx)
+ , y(ny)
+ , z(nz)
+ , w(nw)
+ {
+ }
+
+ /**
+ \brief Creates from angle-axis representation.
+
+ Axis must be normalized!
+
+ Angle is in radians!
+
+ <b>Unit:</b> Radians
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat(NVReal angleRadians, const QT3DSVec3 &unitAxis)
+ {
+ QT3DS_ASSERT(NVAbs(1.0f - unitAxis.magnitude()) < 1e-3f);
+ const NVReal a = angleRadians * 0.5f;
+ const NVReal s = NVSin(a);
+ w = NVCos(a);
+ x = unitAxis.x * s;
+ y = unitAxis.y * s;
+ z = unitAxis.z * s;
+ }
+
+ /**
+ \brief Copy ctor.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat(const QT3DSQuat &v)
+ : x(v.x)
+ , y(v.y)
+ , z(v.z)
+ , w(v.w)
+ {
+ }
+
+ /**
+ \brief Creates from orientation matrix.
+
+ \param[in] m Rotation matrix to extract quaternion from.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE explicit QT3DSQuat(const QT3DSMat33 &m); /* defined in Qt3DSMat33.h */
+
+ /**
+ \brief returns true if all elements are finite (not NAN or INF, etc.)
+ */
+ QT3DS_CUDA_CALLABLE bool isFinite() const
+ {
+ return NVIsFinite(x) && NVIsFinite(y) && NVIsFinite(z) && NVIsFinite(w);
+ }
+
+ /**
+ \brief returns true if finite and magnitude is close to unit
+ */
+
+ QT3DS_CUDA_CALLABLE bool isUnit() const
+ {
+ const NVReal unitTolerance = NVReal(1e-4);
+ return isFinite() && NVAbs(magnitude() - 1) < unitTolerance;
+ }
+
+ /**
+ \brief returns true if finite and magnitude is reasonably close to unit to allow for some
+ accumulation of error vs isValid
+ */
+
+ QT3DS_CUDA_CALLABLE bool isSane() const
+ {
+ const NVReal unitTolerance = NVReal(1e-2);
+ return isFinite() && NVAbs(magnitude() - 1) < unitTolerance;
+ }
+
+ /**
+ \brief converts this quaternion to angle-axis representation
+ */
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE void toRadiansAndUnitAxis(NVReal &angle, QT3DSVec3 &axis) const
+ {
+ const NVReal quatEpsilon = (NVReal(1.0e-8f));
+ const NVReal s2 = x * x + y * y + z * z;
+ if (s2 < quatEpsilon * quatEpsilon) // can't extract a sensible axis
+ {
+ angle = 0;
+ axis = QT3DSVec3(1, 0, 0);
+ } else {
+ const NVReal s = NVRecipSqrt(s2);
+ axis = QT3DSVec3(x, y, z) * s;
+ angle = w < quatEpsilon ? NVPi : NVAtan2(s2 * s, w) * 2;
+ }
+ }
+
+ /**
+ \brief Gets the angle between this quat and the identity quaternion.
+
+ <b>Unit:</b> Radians
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal getAngle() const { return NVAcos(w) * NVReal(2); }
+
+ /**
+ \brief Gets the angle between this quat and the argument
+
+ <b>Unit:</b> Radians
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal getAngle(const QT3DSQuat &q) const
+ {
+ return NVAcos(dot(q)) * NVReal(2);
+ }
+
+ /**
+ \brief This is the squared 4D vector length, should be 1 for unit quaternions.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal magnitudeSquared() const
+ {
+ return x * x + y * y + z * z + w * w;
+ }
+
+ /**
+ \brief returns the scalar product of this and other.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal dot(const QT3DSQuat &v) const
+ {
+ return x * v.x + y * v.y + z * v.z + w * v.w;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat getNormalized() const
+ {
+ const NVReal s = 1.0f / magnitude();
+ return QT3DSQuat(x * s, y * s, z * s, w * s);
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE float magnitude() const { return NVSqrt(magnitudeSquared()); }
+
+ // modifiers:
+ /**
+ \brief maps to the closest unit quaternion.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal normalize() // convert this QT3DSQuat to a unit quaternion
+ {
+ const NVReal mag = magnitude();
+ if (mag) {
+ const NVReal imag = NVReal(1) / mag;
+
+ x *= imag;
+ y *= imag;
+ z *= imag;
+ w *= imag;
+ }
+ return mag;
+ }
+
+ /*
+ \brief returns the conjugate.
+
+ \note for unit quaternions, this is the inverse.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat getConjugate() const { return QT3DSQuat(-x, -y, -z, w); }
+
+ /*
+ \brief returns imaginary part.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 getImaginaryPart() const { return QT3DSVec3(x, y, z); }
+
+ /** brief computes rotation of x-axis */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 getBasisVector0() const
+ {
+ // return rotate(QT3DSVec3(1,0,0));
+ const QT3DSF32 x2 = x * 2.0f;
+ const QT3DSF32 w2 = w * 2.0f;
+ return QT3DSVec3((w * w2) - 1.0f + x * x2, (z * w2) + y * x2, (-y * w2) + z * x2);
+ }
+
+ /** brief computes rotation of y-axis */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 getBasisVector1() const
+ {
+ // return rotate(QT3DSVec3(0,1,0));
+ const QT3DSF32 y2 = y * 2.0f;
+ const QT3DSF32 w2 = w * 2.0f;
+ return QT3DSVec3((-z * w2) + x * y2, (w * w2) - 1.0f + y * y2, (x * w2) + z * y2);
+ }
+
+ /** brief computes rotation of z-axis */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 getBasisVector2() const
+ {
+ // return rotate(QT3DSVec3(0,0,1));
+ const QT3DSF32 z2 = z * 2.0f;
+ const QT3DSF32 w2 = w * 2.0f;
+ return QT3DSVec3((y * w2) + x * z2, (-x * w2) + y * z2, (w * w2) - 1.0f + z * z2);
+ }
+
+ /**
+ rotates passed vec by this (assumed unitary)
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const QT3DSVec3 rotate(const QT3DSVec3 &v) const
+ // QT3DS_CUDA_CALLABLE QT3DS_INLINE const QT3DSVec3 rotate(const QT3DSVec3& v) const
+ {
+ const QT3DSF32 vx = 2.0f * v.x;
+ const QT3DSF32 vy = 2.0f * v.y;
+ const QT3DSF32 vz = 2.0f * v.z;
+ const QT3DSF32 w2 = w * w - 0.5f;
+ const QT3DSF32 dot2 = (x * vx + y * vy + z * vz);
+ return QT3DSVec3((vx * w2 + (y * vz - z * vy) * w + x * dot2),
+ (vy * w2 + (z * vx - x * vz) * w + y * dot2),
+ (vz * w2 + (x * vy - y * vx) * w + z * dot2));
+ /*
+ const QT3DSVec3 qv(x,y,z);
+ return (v*(w*w-0.5f) + (qv.cross(v))*w + qv*(qv.dot(v)))*2;
+ */
+ }
+
+ /**
+ inverse rotates passed vec by this (assumed unitary)
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const QT3DSVec3 rotateInv(const QT3DSVec3 &v) const
+ // QT3DS_CUDA_CALLABLE QT3DS_INLINE const QT3DSVec3 rotateInv(const QT3DSVec3& v) const
+ {
+ const QT3DSF32 vx = 2.0f * v.x;
+ const QT3DSF32 vy = 2.0f * v.y;
+ const QT3DSF32 vz = 2.0f * v.z;
+ const QT3DSF32 w2 = w * w - 0.5f;
+ const QT3DSF32 dot2 = (x * vx + y * vy + z * vz);
+ return QT3DSVec3((vx * w2 - (y * vz - z * vy) * w + x * dot2),
+ (vy * w2 - (z * vx - x * vz) * w + y * dot2),
+ (vz * w2 - (x * vy - y * vx) * w + z * dot2));
+ // const QT3DSVec3 qv(x,y,z);
+ // return (v*(w*w-0.5f) - (qv.cross(v))*w + qv*(qv.dot(v)))*2;
+ }
+
+ /**
+ \brief Assignment operator
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat &operator=(const QT3DSQuat &p)
+ {
+ x = p.x;
+ y = p.y;
+ z = p.z;
+ w = p.w;
+ return *this;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat &operator*=(const QT3DSQuat &q)
+ {
+ const NVReal tx = w * q.x + q.w * x + y * q.z - q.y * z;
+ const NVReal ty = w * q.y + q.w * y + z * q.x - q.z * x;
+ const NVReal tz = w * q.z + q.w * z + x * q.y - q.x * y;
+
+ w = w * q.w - q.x * x - y * q.y - q.z * z;
+ x = tx;
+ y = ty;
+ z = tz;
+
+ return *this;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat &operator+=(const QT3DSQuat &q)
+ {
+ x += q.x;
+ y += q.y;
+ z += q.z;
+ w += q.w;
+ return *this;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat &operator-=(const QT3DSQuat &q)
+ {
+ x -= q.x;
+ y -= q.y;
+ z -= q.z;
+ w -= q.w;
+ return *this;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat &operator*=(const NVReal s)
+ {
+ x *= s;
+ y *= s;
+ z *= s;
+ w *= s;
+ return *this;
+ }
+
+ /** quaternion multiplication */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat operator*(const QT3DSQuat &q) const
+ {
+ return QT3DSQuat(w * q.x + q.w * x + y * q.z - q.y * z, w * q.y + q.w * y + z * q.x - q.z * x,
+ w * q.z + q.w * z + x * q.y - q.x * y, w * q.w - x * q.x - y * q.y - z * q.z);
+ }
+
+ /** quaternion addition */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat operator+(const QT3DSQuat &q) const
+ {
+ return QT3DSQuat(x + q.x, y + q.y, z + q.z, w + q.w);
+ }
+
+ /** quaternion subtraction */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat operator-() const { return QT3DSQuat(-x, -y, -z, -w); }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat operator-(const QT3DSQuat &q) const
+ {
+ return QT3DSQuat(x - q.x, y - q.y, z - q.z, w - q.w);
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSQuat operator*(NVReal r) const
+ {
+ return QT3DSQuat(x * r, y * r, z * r, w * r);
+ }
+
+ static QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSQuat createIdentity() { return QT3DSQuat(0, 0, 0, 1); }
+
+ /** the quaternion elements */
+ NVReal x, y, z, w;
+};
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_QUAT_H
diff --git a/src/foundation/Qt3DSRefCounted.h b/src/foundation/Qt3DSRefCounted.h
new file mode 100644
index 0000000..b500b5f
--- /dev/null
+++ b/src/foundation/Qt3DSRefCounted.h
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_REFCOUNTED_H
+#define QT3DS_FOUNDATION_QT3DS_REFCOUNTED_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSNoCopy.h"
+
+namespace qt3ds {
+namespace foundation {
+ /**
+ Marker class for objects that have a release method that is expected
+ to destroy or release the object.
+ */
+ class NVReleasable
+ {
+ protected:
+ virtual ~NVReleasable() {}
+ public:
+ virtual void release() = 0;
+ };
+
+ template <typename TObjType>
+ inline void NVSafeRelease(TObjType *&item)
+ {
+ if (item) {
+ item->release();
+ item = NULL;
+ }
+ }
+
+ /**Scoped pointer that releases its data
+ when it is being destroyed*/
+ template <typename TObjType>
+ struct NVScopedReleasable : public NoCopy
+ {
+ TObjType *mPtr;
+ NVScopedReleasable()
+ : mPtr(NULL)
+ {
+ }
+ NVScopedReleasable(TObjType *item)
+ : mPtr(item)
+ {
+ }
+ NVScopedReleasable(TObjType &item)
+ : mPtr(&item)
+ {
+ }
+ ~NVScopedReleasable() { NVSafeRelease(mPtr); }
+
+ NVScopedReleasable &operator=(TObjType *inItem)
+ {
+ if (inItem != mPtr) {
+ if (mPtr)
+ mPtr->release();
+ mPtr = inItem;
+ }
+ return *this;
+ }
+
+ NVScopedReleasable &operator=(const NVScopedReleasable<TObjType> inItem)
+ {
+ QT3DS_ASSERT(false);
+ // try to do the right thing.
+ mPtr = inItem.mPtr;
+ const_cast<NVScopedReleasable<TObjType> &>(inItem).mPtr = NULL;
+ return *this;
+ }
+
+ TObjType *forget_unsafe()
+ {
+ mPtr = NULL;
+ return mPtr;
+ }
+
+ TObjType *operator->() { return mPtr; }
+ const TObjType *operator->() const { return mPtr; }
+ TObjType &operator*() { return *mPtr; }
+ const TObjType &operator*() const { return *mPtr; }
+ operator TObjType *() { return mPtr; }
+ operator const TObjType *() const { return mPtr; }
+ };
+
+ // Marker class for objects that are ref counted.
+ class NVRefCounted : public NVReleasable
+ {
+ public:
+ virtual void addRef() = 0;
+ };
+
+/**Helpers to make implementing ref counted objects as concise as possible*/
+#define QT3DS_IMPLEMENT_REF_COUNT_RELEASE(alloc) \
+ QT3DSI32 value = atomicDecrement(&mRefCount); \
+ if (value <= 0) \
+ NVDelete(alloc, this);
+
+#define QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(alloc) \
+ void addRef() { atomicIncrement(&mRefCount); } \
+ void release() { QT3DS_IMPLEMENT_REF_COUNT_RELEASE(alloc); }
+
+
+#define QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(alloc) \
+ void addRef() override { atomicIncrement(&mRefCount); } \
+ void release() override { QT3DS_IMPLEMENT_REF_COUNT_RELEASE(alloc); }
+
+ /**Safe function that checks for null before addrefing the object*/
+ template <typename TObjType>
+ inline TObjType *NVSafeAddRef(TObjType *item)
+ {
+ if (item) {
+ item->addRef();
+ }
+ return item;
+ }
+
+ /**Scoped pointer that addref's its data upon acquisition and releases its data
+ when it is being destroyed*/
+ template <typename TObjType>
+ struct NVScopedRefCounted
+ {
+ TObjType *mPtr;
+ ~NVScopedRefCounted() { NVSafeRelease(mPtr); }
+ NVScopedRefCounted(TObjType *item = NULL)
+ : mPtr(item)
+ {
+ NVSafeAddRef(mPtr);
+ }
+ NVScopedRefCounted(TObjType &item)
+ : mPtr(&item)
+ {
+ NVSafeAddRef(mPtr);
+ }
+ NVScopedRefCounted(const NVScopedRefCounted<TObjType> &other)
+ : mPtr(const_cast<TObjType *>(other.mPtr))
+ {
+ NVSafeAddRef(mPtr);
+ }
+ NVScopedRefCounted<TObjType> &operator=(const NVScopedRefCounted<TObjType> &other)
+ {
+ if (other.mPtr != mPtr) {
+ NVSafeRelease(mPtr);
+ mPtr = const_cast<TObjType *>(other.mPtr);
+ NVSafeAddRef(mPtr);
+ }
+ return *this;
+ }
+ TObjType *forget_unsafe()
+ {
+ mPtr = NULL;
+ return mPtr;
+ }
+
+ TObjType *operator->() { return mPtr; }
+ const TObjType *operator->() const { return mPtr; }
+ TObjType &operator*() { return *mPtr; }
+ const TObjType &operator*() const { return *mPtr; }
+ operator TObjType *() { return mPtr; }
+ operator const TObjType *() const { return mPtr; }
+ bool operator==(NVScopedRefCounted<TObjType> &inOther) const
+ {
+ return mPtr == inOther.mPtr;
+ }
+ bool operator!=(NVScopedRefCounted<TObjType> &inOther) const
+ {
+ return mPtr != inOther.mPtr;
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/Qt3DSSemaphore.h b/src/foundation/Qt3DSSemaphore.h
new file mode 100644
index 0000000..f58bb6e
--- /dev/null
+++ b/src/foundation/Qt3DSSemaphore.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSSEMAPHORE_H
+#define QT3DS_FOUNDATION_PSSEMAPHORE_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+
+namespace qt3ds {
+namespace foundation {
+ class QT3DS_FOUNDATION_API Semaphore
+ {
+ public:
+ static const QT3DSU32 waitForever = 0xffffffff;
+
+ Semaphore(NVAllocatorCallback &alloc, QT3DSU32 initialCount, QT3DSU32 maxCount);
+
+ ~Semaphore();
+
+ /**Decrements (locks) the semaphore. If the semaphore's value is greater than zero,
+ * then the decrement proceeds, and the function returns, immediately. Otherwise
+ * Wait for at most the given number of ms. Returns true if the Semaphore is signaled.
+ * Semaphore::waitForever will block forever or until the semaphore is signaled.
+ */
+
+ bool wait(QT3DSU32 milliseconds = waitForever);
+
+ /** increments (unlocks) the semaphore */
+
+ void post();
+
+ private:
+ class SemaphoreImpl *mImpl;
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSSimpleTypes.h b/src/foundation/Qt3DSSimpleTypes.h
new file mode 100644
index 0000000..05ac8d9
--- /dev/null
+++ b/src/foundation/Qt3DSSimpleTypes.h
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_QT3DS_SIMPLE_TYPES_H
+#define QT3DS_FOUNDATION_QT3DS_SIMPLE_TYPES_H
+
+/** \addtogroup foundation
+ @{
+*/
+
+// Platform specific types:
+// Design note: Its OK to use int for general loop variables and temps.
+
+#include <QtCore/qglobal.h>
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSPreprocessor.h"
+#include "EABase/eabase.h"
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif //#ifndef QT3DS_DOXYGEN
+
+typedef quint8 QT3DSU8;
+typedef qint8 QT3DSI8;
+typedef quint16 QT3DSU16;
+typedef qint16 QT3DSI16;
+typedef quint32 QT3DSU32;
+typedef qint32 QT3DSI32;
+
+// Android's definition of GLuint64 as unsigned long (64-bits) requires this workaround
+#if Q_PROCESSOR_WORDSIZE == 8 && (defined(Q_OS_ANDROID) || defined(Q_OS_INTEGRITY))
+typedef unsigned long QT3DSU64;
+#else
+typedef quint64 QT3DSU64;
+#endif
+
+typedef qint64 QT3DSI64;
+typedef float QT3DSF32;
+typedef double QT3DSF64;
+typedef QT3DSI32 IntBool;
+
+struct QT3DSF16
+{
+ QT3DSU16 mData;
+};
+
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSI8) == 1);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSU8) == 1);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSI16) == 2);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSU16) == 2);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSI32) == 4);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSU32) == 4);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSI64) == 8);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(QT3DSU64) == 8);
+
+// Type ranges
+#define QT3DS_MAX_I8 127 // maximum possible sbyte value, 0x7f
+#define QT3DS_MIN_I8 (-128) // minimum possible sbyte value, 0x80
+#define QT3DS_MAX_U8 255U // maximum possible ubyte value, 0xff
+#define QT3DS_MIN_U8 0 // minimum possible ubyte value, 0x00
+#define QT3DS_MAX_I16 32767 // maximum possible sword value, 0x7fff
+#define QT3DS_MIN_I16 (-32768) // minimum possible sword value, 0x8000
+#define QT3DS_MAX_U16 65535U // maximum possible uword value, 0xffff
+#define QT3DS_MIN_U16 0 // minimum possible uword value, 0x0000
+#define QT3DS_MAX_I32 2147483647 // maximum possible sdword value, 0x7fffffff
+#define QT3DS_MIN_I32 (-2147483647 - 1) // minimum possible sdword value, 0x80000000
+#define QT3DS_MAX_U32 4294967295U // maximum possible udword value, 0xffffffff
+#define QT3DS_MIN_U32 0 // minimum possible udword value, 0x00000000
+#define QT3DS_MAX_F32 3.4028234663852885981170418348452e+38F
+// maximum possible float value
+#define QT3DS_MAX_F64 DBL_MAX // maximum possible double value
+
+#define QT3DS_ENV_F32 FLT_EPSILON // maximum relative error of float rounding
+#define QT3DS_ENV_F64 DBL_EPSILON // maximum relative error of double rounding
+
+#ifndef QT3DS_FOUNDATION_USE_F64
+
+typedef QT3DSF32 NVReal;
+
+#define QT3DS_MAX_REAL QT3DS_MAX_F32
+#define QT3DS_ENV_REAL QT3DS_ENV_F32
+#define QT3DS_NORMALIZATION_EPSILON NVReal(1e-20f)
+
+#else
+
+typedef QT3DSF64 NVReal;
+
+#define QT3DS_MAX_REAL QT3DS_MAX_F64
+#define QT3DS_ENV_REAL QT3DS_ENV_F64
+#define QT3DS_NORMALIZATION_EPSILON NVReal(1e-180)
+
+#endif
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_SIMPLE_TYPES_H
diff --git a/src/foundation/Qt3DSStringTokenizer.h b/src/foundation/Qt3DSStringTokenizer.h
new file mode 100644
index 0000000..5229bab
--- /dev/null
+++ b/src/foundation/Qt3DSStringTokenizer.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_STRING_TOKENIZER_H
+#define QT3DS_FOUNDATION_STRING_TOKENIZER_H
+
+#include "EASTL/string.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <typename TStrType>
+ class QT3DS_FOUNDATION_API StringTokenizer
+ {
+ typedef typename eastl::basic_string<TStrType>::size_type size_t;
+
+ public:
+ StringTokenizer(const eastl::basic_string<TStrType> &inString,
+ const eastl::basic_string<TStrType> &inToken)
+ {
+ eastl::basic_string<TStrType> mStr = inString;
+ eastl::basic_string<TStrType> theTempString = inString.substr(0, inToken.length());
+
+ while (inToken.length() && theTempString.compare(inToken) == 0) {
+ mStr = mStr.substr(inToken.length());
+ theTempString = mStr.substr(0, inToken.length());
+ }
+
+ theTempString = mStr.substr(mStr.length() - 1 - inToken.length());
+ while (theTempString.compare(inToken) == 0) {
+ mStr = mStr.substr(0, mStr.length() - inToken.length());
+ theTempString = mStr.substr(mStr.length() - 1 - inToken.length());
+ }
+
+ m_OriginalString = mStr;
+ m_Token = inToken;
+ m_Index = 0;
+ }
+
+ eastl::basic_string<TStrType> GetCurrentPartition()
+ {
+ eastl::basic_string<TStrType> theReturnString;
+ if (m_Index != eastl::basic_string<TStrType>::npos) {
+ size_t theCurrentTokenIndex = m_OriginalString.find(m_Token, m_Index);
+ if (theCurrentTokenIndex == eastl::basic_string<TStrType>::npos) {
+ theReturnString = m_OriginalString.substr(m_Index);
+ } else {
+ theReturnString =
+ m_OriginalString.substr(m_Index, theCurrentTokenIndex - m_Index);
+ }
+ }
+
+ return theReturnString;
+ }
+
+ bool HasNextPartition() { return m_Index != eastl::basic_string<TStrType>::npos; }
+
+ void operator++()
+ {
+ if (m_Index != eastl::basic_string<TStrType>::npos) {
+ size_t theCurrentTokenIndex = m_OriginalString.find(m_Token, m_Index);
+ if (theCurrentTokenIndex == eastl::basic_string<TStrType>::npos) {
+ m_Index = eastl::basic_string<TStrType>::npos;
+ } else {
+ m_Index = theCurrentTokenIndex + m_Token.length();
+ if (m_Index > m_OriginalString.length())
+ m_Index = eastl::basic_string<TStrType>::npos;
+ }
+ }
+ }
+
+ private:
+ size_t m_Index;
+ eastl::basic_string<TStrType> m_Token;
+ eastl::basic_string<TStrType> m_OriginalString;
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSSync.h b/src/foundation/Qt3DSSync.h
new file mode 100644
index 0000000..a36afae
--- /dev/null
+++ b/src/foundation/Qt3DSSync.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSSYNC_H
+#define QT3DS_FOUNDATION_PSSYNC_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+
+namespace qt3ds {
+namespace foundation {
+ class QT3DS_FOUNDATION_API Sync
+ {
+ public:
+ static const QT3DSU32 waitForever = 0xffffffff;
+
+ Sync(NVAllocatorCallback &alloc);
+
+ ~Sync();
+
+ /** Wait on the object for at most the given number of ms. Returns
+ * true if the object is signaled. Sync::waitForever will block forever
+ * or until the object is signaled.
+ */
+
+ bool wait(QT3DSU32 milliseconds = waitForever);
+
+ /** Signal the synchronization object, waking all threads waiting on it */
+
+ void set();
+
+ /** Reset the synchronization object */
+
+ void reset();
+
+ private:
+ class SyncImpl *mImpl;
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSSystem.cpp b/src/foundation/Qt3DSSystem.cpp
new file mode 100644
index 0000000..e87a25e
--- /dev/null
+++ b/src/foundation/Qt3DSSystem.cpp
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSSystem.h"
+#include "foundation/Qt3DSPreprocessor.h"
+#include "EASTL/string.h"
+
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+
+#if defined(QT3DS_ANDROID)
+const char *qt3ds::foundation::System::g_OS = "android";
+const char *qt3ds::foundation::System::g_DLLExtension = ".so";
+#elif defined(QT3DS_APPLE)
+const char *qt3ds::foundation::System::g_OS = "osx";
+const char *qt3ds::foundation::System::g_DLLExtension = ".dylib";
+#elif defined(QT3DS_LINUX)
+const char *qt3ds::foundation::System::g_OS = "linux";
+const char *qt3ds::foundation::System::g_DLLExtension = ".so";
+#elif defined(QT3DS_QNX)
+const char *qt3ds::foundation::System::g_OS = "qnx";
+const char *qt3ds::foundation::System::g_DLLExtension = ".so";
+#elif defined(QT3DS_WINDOWS)
+const char *qt3ds::foundation::System::g_OS = "windows";
+const char *qt3ds::foundation::System::g_DLLExtension = ".dll";
+#else
+#error "Unknown Operating System"
+#endif
+
+#if defined(QT3DS_X86)
+const char *qt3ds::foundation::System::g_Processor = "x86";
+const char *qt3ds::foundation::System::g_BitWidth = "32";
+const char *qt3ds::foundation::System::g_FloatingPointModel = "";
+#elif defined(QT3DS_X64)
+const char *qt3ds::foundation::System::g_Processor = "x64";
+const char *qt3ds::foundation::System::g_BitWidth = "64";
+const char *qt3ds::foundation::System::g_FloatingPointModel = "";
+#elif defined(QT3DS_ARM)
+#if defined(__aarch64__) || defined(__ARM64__)
+const char *qt3ds::foundation::System::g_Processor = "arm";
+const char *qt3ds::foundation::System::g_BitWidth = "64";
+const char *qt3ds::foundation::System::g_FloatingPointModel = "softfp";
+#else
+const char *qt3ds::foundation::System::g_Processor = "arm";
+const char *qt3ds::foundation::System::g_BitWidth = "32";
+#if defined(QT3DS_ARM_HARDFP)
+const char *qt3ds::foundation::System::g_FloatingPointModel = "hardfp";
+#elif defined(QT3DS_ARM_SOFTFP)
+const char *qt3ds::foundation::System::g_FloatingPointModel = "softfp";
+#else
+#error "Unknown floating point model!"
+#endif
+#endif
+#else
+#error "Unknown Platform"
+#endif
+
+#if defined(QT3DS_ARM)
+#if defined(QT3DS_GRAPHICS_API_GLES2)
+const char *qt3ds::foundation::System::g_GPUType = "gles2";
+#elif defined(QT3DS_GRAPHICS_API_GL)
+const char *qt3ds::foundation::System::g_GPUType = "gl";
+#elif defined(QT3DS_GRAPHICS_API_GLES3)
+const char *qt3ds::foundation::System::g_GPUType = "gles3";
+#else
+#error \
+ "Must define a GPU type for arm platforms (QT3DS_GRAPHICS_API_GLES2, QT3DS_GRAPHICS_API_GLES3, QT3DS_GRAPHICS_API_GL)"
+#endif
+#elif defined(QT3DS_X86)
+const char *qt3ds::foundation::System::g_GPUType = "";
+#elif defined(QT3DS_X64)
+const char *qt3ds::foundation::System::g_GPUType = "";
+#else
+#error "Must define a processor type (QT3DS_ARM or QT3DS_X86)"
+#endif
+
+namespace {
+static const unsigned SYSTEM_STR_SIZE = 100;
+void SystemAppendString(eastl::string &str, const char *delim, const char *string)
+{
+ if (string && *string) {
+ str.append(delim);
+ str.append(string);
+ }
+}
+}
+const char *System::getPlatformStr()
+{
+ static char text[SYSTEM_STR_SIZE];
+ {
+ eastl::string str(g_Processor);
+ SystemAppendString(str, "_", g_BitWidth);
+ SystemAppendString(str, "_", g_FloatingPointModel);
+ SystemAppendString(str, "_", g_OS);
+ strcpy(text, str.c_str());
+ }
+ return text;
+}
+
+const char *System::getPlatformGLStr()
+{
+ static char text[SYSTEM_STR_SIZE];
+ {
+ eastl::string str(g_Processor);
+ SystemAppendString(str, "_", g_BitWidth);
+ SystemAppendString(str, "_", g_FloatingPointModel);
+ SystemAppendString(str, "_", g_GPUType);
+ SystemAppendString(str, "_", g_OS);
+ strcpy(text, str.c_str());
+ }
+ return text;
+} \ No newline at end of file
diff --git a/src/foundation/Qt3DSSystem.h b/src/foundation/Qt3DSSystem.h
new file mode 100644
index 0000000..84ca87d
--- /dev/null
+++ b/src/foundation/Qt3DSSystem.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef QT3DS_FOUNDATION_SYSTEM_H
+#define QT3DS_FOUNDATION_SYSTEM_H
+
+#include "foundation/Qt3DS.h"
+
+namespace qt3ds {
+namespace foundation {
+ class QT3DS_FOUNDATION_API System
+ {
+ public:
+ static const char *g_OS;
+ static const char *g_Processor;
+ static const char *g_BitWidth;
+ static const char *g_FloatingPointModel;
+ static const char *g_GPUType;
+ static const char *g_DLLExtension;
+ static const char *getPlatformStr();
+ static const char *getPlatformGLStr();
+
+ private:
+ System();
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSThread.h b/src/foundation/Qt3DSThread.h
new file mode 100644
index 0000000..84e169d
--- /dev/null
+++ b/src/foundation/Qt3DSThread.h
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSTHREAD_H
+#define QT3DS_FOUNDATION_PSTHREAD_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSFoundation.h"
+
+// dsequeira: according to existing comment here (David Black would be my guess)
+// "This is useful to reduce bus contention on tight spin locks. And it needs
+// to be a macro as the xenon compiler often ignores even __forceinline." What's not
+// clear is why a pause function needs inlining...? (TODO: check with XBox team)
+
+// todo: these need to go somewhere else
+
+#if defined(QT3DS_WINDOWS)
+#define NVSpinLockPause() __asm pause
+#elif defined(QT3DS_X360)
+#define NVSpinLockPause() __asm nop
+#elif defined(QT3DS_LINUX) || defined(QT3DS_ANDROID) || defined(QT3DS_APPLE) || defined(QT3DS_QNX)
+#define NVSpinLockPause() asm("nop")
+#elif defined(QT3DS_PS3)
+#define NVSpinLockPause() asm("nop") // don't know if it's correct yet...
+#define QT3DS_TLS_MAX_SLOTS 64
+#elif defined(QT3DS_WII)
+#define NVSpinLockPause() asm { nop } // don't know if it's correct yet...
+#endif
+
+namespace qt3ds {
+namespace foundation {
+ struct ThreadPriority // todo: put in some other header file
+ {
+ enum Enum {
+ /**
+ \brief High priority
+ */
+ eHIGH = 0,
+
+ /**
+ \brief Above Normal priority
+ */
+ eABOVE_NORMAL = 1,
+
+ /**
+ \brief Normal/default priority
+ */
+ eNORMAL = 2,
+
+ /**
+ \brief Below Normal priority
+ */
+ eBELOW_NORMAL = 3,
+
+ /**
+ \brief Low priority.
+ */
+ eLOW = 4,
+
+ eFORCE_DWORD = 0xffFFffFF
+ };
+ };
+
+ /**
+ Thread abstraction API
+ */
+
+ class QT3DS_FOUNDATION_API Thread
+ {
+ public:
+ static const QT3DSU32 DEFAULT_STACK_SIZE;
+ typedef size_t Id; // space for a pointer or an integer
+ typedef void *(*ExecuteFn)(void *);
+
+ static Id getId();
+
+ /**
+ Construct (but do not start) the thread object. Executes in the context
+ of the spawning thread
+ */
+
+ Thread(NVFoundationBase &foundation);
+
+ /**
+ Construct and start the the thread, passing the given arg to the given fn. (pthread style)
+ */
+
+ Thread(NVFoundationBase &foundation, ExecuteFn fn, void *arg);
+
+ /**
+ Deallocate all resources associated with the thread. Should be called in the
+ context of the spawning thread.
+ */
+
+ virtual ~Thread();
+
+ /**
+ start the thread running. Called in the context of the spawning thread.
+ */
+
+ void start(QT3DSU32 stackSize);
+
+ /**
+ Violently kill the current thread. Blunt instrument, not recommended since
+ it can leave all kinds of things unreleased (stack, memory, mutexes...) Should
+ be called in the context of the spawning thread.
+ */
+
+ void kill();
+
+ /**
+ The virtual execute() method is the user defined function that will
+ run in the new thread. Called in the context of the spawned thread.
+ */
+
+ virtual void execute(void);
+
+ /**
+ stop the thread. Signals the spawned thread that it should stop, so the
+ thread should check regularly
+ */
+
+ void signalQuit();
+
+ /**
+ Wait for a thread to stop. Should be called in the context of the spawning
+ thread. Returns false if the thread has not been started.
+ */
+
+ bool waitForQuit();
+
+ /**
+ check whether the thread is signalled to quit. Called in the context of the
+ spawned thread.
+ */
+
+ bool quitIsSignalled();
+
+ /**
+ Cleanly shut down this thread. Called in the context of the spawned thread.
+ */
+ void quit();
+
+ /**
+ Change the affinity mask for this thread.
+ On Xbox360, sets the hardware thread to the first non-zero bit.
+
+ Returns previous mask if successful, or zero on failure
+ */
+ virtual QT3DSU32 setAffinityMask(QT3DSU32 mask);
+
+ static ThreadPriority::Enum getPriority(Id threadId);
+
+ /** Set thread priority. */
+ void setPriority(ThreadPriority::Enum prio);
+
+ /** set the thread's name */
+ void setName(const char *name);
+
+ /** Put the current thread to sleep for the given number of milliseconds */
+ static void sleep(QT3DSU32 ms);
+
+ /** Yield the current thread's slot on the CPU */
+ static void yield();
+
+ private:
+ class ThreadImpl *mImpl;
+ };
+
+ QT3DS_FOUNDATION_API QT3DSU32 TlsAlloc();
+ QT3DS_FOUNDATION_API void TlsFree(QT3DSU32 index);
+ QT3DS_FOUNDATION_API void *TlsGet(QT3DSU32 index);
+ QT3DS_FOUNDATION_API QT3DSU32 TlsSet(QT3DSU32 index, void *value);
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSTime.h b/src/foundation/Qt3DSTime.h
new file mode 100644
index 0000000..955bd7e
--- /dev/null
+++ b/src/foundation/Qt3DSTime.h
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSTIME_H
+#define QT3DS_FOUNDATION_PSTIME_H
+
+#include "foundation/Qt3DS.h"
+
+#if defined(QT3DS_LINUX) || defined(QT3DS_ANDROID) || defined(QT3DS_QNX)
+#include <time.h>
+#endif
+
+namespace qt3ds {
+namespace foundation {
+
+ struct CounterFrequencyToTensOfNanos
+ {
+ QT3DSU64 mNumerator;
+ QT3DSU64 mDenominator;
+ CounterFrequencyToTensOfNanos(QT3DSU64 inNum, QT3DSU64 inDenom)
+ : mNumerator(inNum)
+ , mDenominator(inDenom)
+ {
+ }
+
+ // quite slow.
+ QT3DSU64 toTensOfNanos(QT3DSU64 inCounter) const
+ {
+ return (inCounter * mNumerator) / mDenominator;
+ }
+ };
+
+ class QT3DS_FOUNDATION_API Time
+ {
+ public:
+ typedef double Second;
+ static const QT3DSU64 sNumTensOfNanoSecondsInASecond = 100000000;
+ // This is supposedly guaranteed to not change after system boot
+ // regardless of processors, speedstep, etc.
+ static const CounterFrequencyToTensOfNanos sCounterFreq;
+
+ static CounterFrequencyToTensOfNanos getCounterFrequency();
+
+ static QT3DSU64 getCurrentCounterValue();
+
+ // SLOW!!
+ // Thar be a 64 bit divide in thar!
+ static QT3DSU64 getCurrentTimeInTensOfNanoSeconds()
+ {
+ QT3DSU64 ticks = getCurrentCounterValue();
+ return sCounterFreq.toTensOfNanos(ticks);
+ }
+
+ Time();
+ Second getElapsedSeconds();
+ Second peekElapsedSeconds();
+ Second getLastTime() const;
+
+ private:
+#if defined(QT3DS_LINUX) || defined(QT3DS_ANDROID) || defined(QT3DS_APPLE) || defined(QT3DS_PSP2) \
+ || defined(QT3DS_QNX)
+ Second mLastTime;
+#else
+ QT3DSI64 mTickCount;
+#endif
+ };
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/Qt3DSTransform.h b/src/foundation/Qt3DSTransform.h
new file mode 100644
index 0000000..0fee0a8
--- /dev/null
+++ b/src/foundation/Qt3DSTransform.h
@@ -0,0 +1,195 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_TRANSFORM_H
+#define QT3DS_FOUNDATION_QT3DS_TRANSFORM_H
+/** \addtogroup foundation
+ @{
+*/
+
+#include "foundation/Qt3DSQuat.h"
+#include "foundation/Qt3DSPlane.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/*!
+\brief class representing a rigid euclidean transform as a quaternion and a vector
+*/
+
+class NVTransform
+{
+public:
+ QT3DSQuat q;
+ QT3DSVec3 p;
+
+ //#define PXTRANSFORM_DEFAULT_CONSTRUCT_NAN
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVTransform()
+#ifdef PXTRANSFORM_DEFAULT_CONSTRUCT_IDENTITY
+ : q(0, 0, 0, 1)
+ , p(0, 0, 0)
+#elif defined(PXTRANSFORM_DEFAULT_CONSTRUCT_NAN)
+#define invalid NVSqrt(-1.0f)
+ : q(invalid, invalid, invalid, invalid)
+ , p(invalid, invalid, invalid)
+#undef invalid
+#endif
+ {
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE explicit NVTransform(const QT3DSVec3 &position)
+ : q(0, 0, 0, 1)
+ , p(position)
+ {
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE explicit NVTransform(const QT3DSQuat &orientation)
+ : q(orientation)
+ , p(0, 0, 0)
+ {
+ QT3DS_ASSERT(orientation.isSane());
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVTransform(const QT3DSVec3 &p0, const QT3DSQuat &q0)
+ : q(q0)
+ , p(p0)
+ {
+ QT3DS_ASSERT(q0.isSane());
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE explicit NVTransform(const QT3DSMat44 &m); // defined in Qt3DSMat44.h
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVTransform operator*(const NVTransform &x) const
+ {
+ QT3DS_ASSERT(x.isSane());
+ return transform(x);
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVTransform getInverse() const
+ {
+ QT3DS_ASSERT(isFinite());
+ return NVTransform(q.rotateInv(-p), q.getConjugate());
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 transform(const QT3DSVec3 &input) const
+ {
+ QT3DS_ASSERT(isFinite());
+ return q.rotate(input) + p;
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 transformInv(const QT3DSVec3 &input) const
+ {
+ QT3DS_ASSERT(isFinite());
+ return q.rotateInv(input - p);
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 rotate(const QT3DSVec3 &input) const
+ {
+ QT3DS_ASSERT(isFinite());
+ return q.rotate(input);
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 rotateInv(const QT3DSVec3 &input) const
+ {
+ QT3DS_ASSERT(isFinite());
+ return q.rotateInv(input);
+ }
+
+ //! Transform transform to parent (returns compound transform: first src, then *this)
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVTransform transform(const NVTransform &src) const
+ {
+ QT3DS_ASSERT(src.isSane());
+ QT3DS_ASSERT(isSane());
+ // src = [srct, srcr] -> [r*srct + t, r*srcr]
+ return NVTransform(q.rotate(src.p) + p, q * src.q);
+ }
+
+ /**
+ \brief returns true if finite and q is a unit quaternion
+ */
+
+ QT3DS_CUDA_CALLABLE bool isValid() const { return p.isFinite() && q.isFinite() && q.isUnit(); }
+
+ /**
+ \brief returns true if finite and quat magnitude is reasonably close to unit to allow for some
+ accumulation of error vs isValid
+ */
+
+ QT3DS_CUDA_CALLABLE bool isSane() const { return isFinite() && q.isSane(); }
+
+ /**
+ \brief returns true if all elems are finite (not NAN or INF, etc.)
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isFinite() const { return p.isFinite() && q.isFinite(); }
+
+ //! Transform transform from parent (returns compound transform: first src, then this->inverse)
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVTransform transformInv(const NVTransform &src) const
+ {
+ QT3DS_ASSERT(src.isSane());
+ QT3DS_ASSERT(isFinite());
+ // src = [srct, srcr] -> [r^-1*(srct-t), r^-1*srcr]
+ QT3DSQuat qinv = q.getConjugate();
+ return NVTransform(qinv.rotate(src.p - p), qinv * src.q);
+ }
+
+ QT3DS_CUDA_CALLABLE static QT3DS_FORCE_INLINE NVTransform createIdentity()
+ {
+ return NVTransform(QT3DSVec3(0));
+ }
+
+ /**
+ \brief transform plane
+ */
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVPlane transform(const NVPlane &plane) const
+ {
+ QT3DSVec3 transformedNormal = rotate(plane.n);
+ return NVPlane(transformedNormal, plane.d - p.dot(transformedNormal));
+ }
+
+ /**
+ \brief inverse-transform plane
+ */
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVPlane inverseTransform(const NVPlane &plane) const
+ {
+ QT3DSVec3 transformedNormal = rotateInv(plane.n);
+ return NVPlane(transformedNormal, plane.d + p.dot(plane.n));
+ }
+};
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_TRANSFORM_H
diff --git a/src/foundation/Qt3DSUnionCast.h b/src/foundation/Qt3DSUnionCast.h
new file mode 100644
index 0000000..a3d0355
--- /dev/null
+++ b/src/foundation/Qt3DSUnionCast.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_UNION_CAST_H
+#define QT3DS_FOUNDATION_QT3DS_UNION_CAST_H
+
+#include "foundation/Qt3DSPreprocessor.h"
+
+/** \addtogroup foundation
+@{
+*/
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+template <class A, class B>
+QT3DS_FORCE_INLINE A NVUnionCast(B b)
+{
+ union AB {
+ AB(B bb)
+ : _b(bb)
+ {
+ }
+ B _b;
+ A _a;
+ } u(b);
+ return u._a;
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+
+#endif
diff --git a/src/foundation/Qt3DSUtilities.h b/src/foundation/Qt3DSUtilities.h
new file mode 100644
index 0000000..cb9ae6a
--- /dev/null
+++ b/src/foundation/Qt3DSUtilities.h
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_PSUTILITIES_H
+#define QT3DS_FOUNDATION_PSUTILITIES_H
+
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSIntrinsics.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ // PT: checked casts
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSU16 to16(QT3DSU32 value)
+ {
+ QT3DS_ASSERT(value <= 0xffff);
+ return QT3DSU16(value);
+ }
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSU8 to8(QT3DSU16 value)
+ {
+ QT3DS_ASSERT(value <= 0xff);
+ return QT3DSU8(value);
+ }
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSU8 to8(QT3DSU32 value)
+ {
+ QT3DS_ASSERT(value <= 0xff);
+ return QT3DSU8(value);
+ }
+
+ template <class T>
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE void swap(T &x, T &y)
+ {
+// crash with optimizations enabled, ticket in Sony
+#ifdef QT3DS_PSP2
+#pragma control % push O = 0
+#endif
+ T tmp = x;
+ x = y;
+ y = tmp;
+#ifdef QT3DS_PSP2
+#pragma control % pop O
+#endif
+ }
+
+ /*!
+Get number of elements in array
+*/
+ template <typename T, size_t N>
+ char (&ArraySizeHelper(T (&array)[N]))[N];
+#define QT3DS_ARRAY_SIZE(_array) (sizeof(qt3ds::foundation::ArraySizeHelper(_array)))
+
+ /*!
+Sort two elements using operator<
+
+On return x will be the smaller of the two
+*/
+ template <class T>
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void order(T &x, T &y)
+ {
+ if (y < x)
+ swap(x, y);
+ }
+
+ // most architectures can do predication on real comparisons, and on VMX, it matters
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void order(NVReal &x, NVReal &y)
+ {
+ NVReal newX = NVMin(x, y);
+ NVReal newY = NVMax(x, y);
+ x = newX;
+ y = newY;
+ }
+
+ /*!
+ Sort two elements using operator< and also keep order
+ of any extra data
+ */
+ template <class T, class E1>
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE void order(T &x, T &y, E1 &xe1, E1 &ye1)
+ {
+ if (y < x) {
+ swap(x, y);
+ swap(xe1, ye1);
+ }
+ }
+
+ QT3DS_INLINE void debugBreak()
+ {
+#if defined(QT3DS_WINDOWS)
+ __debugbreak();
+#elif defined(QT3DS_LINUX) || defined(QT3DS_ANDROID) || defined(QT3DS_QNX)
+ asm("int $3");
+#elif defined(QT3DS_GNUC)
+ __builtin_trap();
+#else
+ QT3DS_ASSERT(false);
+#endif
+ }
+
+ bool checkValid(const float &);
+ bool checkValid(const QT3DSVec3 &);
+ bool checkValid(const QT3DSQuat &);
+ bool checkValid(const QT3DSMat33 &);
+ bool checkValid(const NVTransform &);
+ bool checkValid(const char *);
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSI32 getPadding2(size_t value, QT3DSU32 alignment)
+ {
+ const QT3DSI32 mask = alignment - 1;
+ const QT3DSI32 overhead = QT3DSI32(value) & mask;
+ return (alignment - overhead) & mask;
+ }
+
+ // PT: "After doing a dcbz128, there is a delay of about 140 cycles before writes to that cache
+ // line can proceed without stalling.
+ // This is much faster than an L2 cache miss, but for ideal performance, it is best to avoid
+ // this stall by doing the cache-line
+ // zeroing a few cache lines ahead of where you are writing."
+ QT3DS_FORCE_INLINE void invalidateCache(void *QT3DS_RESTRICT voidPtr, QT3DSI32 size)
+ {
+#ifdef QT3DS_X360
+ QT3DSU8 *QT3DS_RESTRICT ptr = reinterpret_cast<QT3DSU8 *>(voidPtr);
+ const QT3DSI32 padding = getPadding2(size_t(ptr), 128);
+ const QT3DSI32 sizeToCover = size - padding;
+ if (sizeToCover >= 128) {
+ QT3DSU8 *ptr128 = ptr + padding;
+ QT3DSU32 nb128 = sizeToCover / 128;
+ while (nb128--) {
+ // NV::memZero128(ptr128);
+ qt3ds::foundation::memZero128(ptr128);
+ ptr128 += 128;
+ }
+ }
+#else
+ (void)voidPtr;
+ (void)size;
+#endif
+ }
+
+ // equivalent to std::max_element
+ template <typename T>
+ inline const T *maxElement(const T *first, const T *last)
+ {
+ const T *m = first;
+ for (const T *it = first + 1; it < last; ++it)
+ if (*m < *it)
+ m = it;
+
+ return m;
+ }
+
+} // namespace foundation
+} // namespace qt3ds
+
+#define QT3DS_STRINGIZE_HELPER(X) #X
+#define QT3DS_STRINGIZE(X) QT3DS_STRINGIZE_HELPER(X)
+
+#define QT3DS_CONCAT_HELPER(X, Y) X##Y
+#define QT3DS_CONCAT(X, Y) QT3DS_CONCAT_HELPER(X, Y)
+
+#endif
diff --git a/src/foundation/Qt3DSVec2.h b/src/foundation/Qt3DSVec2.h
new file mode 100644
index 0000000..0d86c91
--- /dev/null
+++ b/src/foundation/Qt3DSVec2.h
@@ -0,0 +1,321 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_VEC2_H
+#define QT3DS_FOUNDATION_QT3DS_VEC2_H
+
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DSMath.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/**
+\brief 2 Element vector class.
+
+This is a vector class with public data members.
+This is not nice but it has become such a standard that hiding the xy data members
+makes it difficult to reuse external code that assumes that these are public in the library.
+The vector class can be made to use float or double precision by appropriately defining NVReal.
+This has been chosen as a cleaner alternative to a template class.
+*/
+class QT3DSVec2
+{
+public:
+ /**
+ \brief default constructor leaves data uninitialized.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2() {}
+
+ /**
+ \brief Assigns scalar parameter to all elements.
+
+ Useful to initialize to zero or one.
+
+ \param[in] a Value to assign to elements.
+ */
+ explicit QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2(NVReal a)
+ : x(a)
+ , y(a)
+ {
+ }
+
+ /**
+ \brief Initializes from 2 scalar parameters.
+
+ \param[in] nx Value to initialize X component.
+ \param[in] ny Value to initialize Y component.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2(NVReal nx, NVReal ny)
+ : x(nx)
+ , y(ny)
+ {
+ }
+
+ /**
+ \brief Copy ctor.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2(const QT3DSVec2 &v)
+ : x(v.x)
+ , y(v.y)
+ {
+ }
+
+ // Operators
+
+ /**
+ \brief Assignment operator
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 &operator=(const QT3DSVec2 &p)
+ {
+ x = p.x;
+ y = p.y;
+ return *this;
+ }
+
+ /**
+ \brief element access
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal &operator[](int index)
+ {
+ QT3DS_ASSERT(index >= 0 && index <= 1);
+ return (&x)[index];
+ }
+
+ /**
+ \brief element access
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const NVReal &operator[](int index) const
+ {
+ QT3DS_ASSERT(index >= 0 && index <= 1);
+ return (&x)[index];
+ }
+
+ /**
+ \brief returns true if the two vectors are exactly equal.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool operator==(const QT3DSVec2 &v) const
+ {
+ return x == v.x && y == v.y;
+ }
+
+ /**
+ \brief returns true if the two vectors are not exactly equal.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool operator!=(const QT3DSVec2 &v) const
+ {
+ return x != v.x || y != v.y;
+ }
+
+ /**
+ \brief tests for exact zero vector
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isZero() const { return x == 0.0f && y == 0.0f; }
+
+ /**
+ \brief returns true if all 2 elems of the vector are finite (not NAN or INF, etc.)
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool isFinite() const { return NVIsFinite(x) && NVIsFinite(y); }
+
+ /**
+ \brief is normalized - used by API parameter validation
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isNormalized() const
+ {
+ const float unitTolerance = NVReal(1e-4);
+ return isFinite() && NVAbs(magnitude() - 1) < unitTolerance;
+ }
+
+ /**
+ \brief returns the squared magnitude
+
+ Avoids calling NVSqrt()!
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal magnitudeSquared() const { return x * x + y * y; }
+
+ /**
+ \brief returns the magnitude
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal magnitude() const { return NVSqrt(magnitudeSquared()); }
+
+ /**
+ \brief negation
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 operator-() const { return QT3DSVec2(-x, -y); }
+
+ /**
+ \brief vector addition
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 operator+(const QT3DSVec2 &v) const
+ {
+ return QT3DSVec2(x + v.x, y + v.y);
+ }
+
+ /**
+ \brief vector difference
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 operator-(const QT3DSVec2 &v) const
+ {
+ return QT3DSVec2(x - v.x, y - v.y);
+ }
+
+ /**
+ \brief scalar post-multiplication
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 operator*(NVReal f) const
+ {
+ return QT3DSVec2(x * f, y * f);
+ }
+
+ /**
+ \brief scalar division
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 operator/(NVReal f) const
+ {
+ f = NVReal(1) / f; // PT: inconsistent notation with operator /=
+ return QT3DSVec2(x * f, y * f);
+ }
+
+ /**
+ \brief vector addition
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 &operator+=(const QT3DSVec2 &v)
+ {
+ x += v.x;
+ y += v.y;
+ return *this;
+ }
+
+ /**
+ \brief vector difference
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 &operator-=(const QT3DSVec2 &v)
+ {
+ x -= v.x;
+ y -= v.y;
+ return *this;
+ }
+
+ /**
+ \brief scalar multiplication
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 &operator*=(NVReal f)
+ {
+ x *= f;
+ y *= f;
+ return *this;
+ }
+ /**
+ \brief scalar division
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 &operator/=(NVReal f)
+ {
+ f = 1.0f / f; // PT: inconsistent notation with operator /
+ x *= f;
+ y *= f;
+ return *this;
+ }
+
+ /**
+ \brief returns the scalar product of this and other.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal dot(const QT3DSVec2 &v) const { return x * v.x + y * v.y; }
+
+ /** return a unit vector */
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 getNormalized() const
+ {
+ const NVReal m = magnitudeSquared();
+ return m > 0 ? *this * NVRecipSqrt(m) : QT3DSVec2(0, 0);
+ }
+
+ /**
+ \brief normalizes the vector in place
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal normalize()
+ {
+ const NVReal m = magnitude();
+ if (m > 0)
+ *this /= m;
+ return m;
+ }
+
+ /**
+ \brief a[i] * b[i], for all i.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 multiply(const QT3DSVec2 &a) const
+ {
+ return QT3DSVec2(x * a.x, y * a.y);
+ }
+
+ /**
+ \brief element-wise minimum
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 minimum(const QT3DSVec2 &v) const
+ {
+ return QT3DSVec2(NVMin(x, v.x), NVMin(y, v.y));
+ }
+
+ /**
+ \brief returns MIN(x, y);
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float minElement() const { return NVMin(x, y); }
+
+ /**
+ \brief element-wise maximum
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec2 maximum(const QT3DSVec2 &v) const
+ {
+ return QT3DSVec2(NVMax(x, v.x), NVMax(y, v.y));
+ }
+
+ /**
+ \brief returns MAX(x, y);
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float maxElement() const { return NVMax(x, y); }
+
+ NVReal x, y;
+};
+
+QT3DS_CUDA_CALLABLE static QT3DS_FORCE_INLINE QT3DSVec2 operator*(NVReal f, const QT3DSVec2 &v)
+{
+ return QT3DSVec2(f * v.x, f * v.y);
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_VEC2_H
diff --git a/src/foundation/Qt3DSVec3.h b/src/foundation/Qt3DSVec3.h
new file mode 100644
index 0000000..24ab823
--- /dev/null
+++ b/src/foundation/Qt3DSVec3.h
@@ -0,0 +1,377 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_VEC3_H
+#define QT3DS_FOUNDATION_QT3DS_VEC3_H
+
+/** \addtogroup foundation
+@{
+*/
+
+#include "foundation/Qt3DSMath.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+/**
+\brief 3 Element vector class.
+
+This is a vector class with public data members.
+This is not nice but it has become such a standard that hiding the xyz data members
+makes it difficult to reuse external code that assumes that these are public in the library.
+The vector class can be made to use float or double precision by appropriately defining NVReal.
+This has been chosen as a cleaner alternative to a template class.
+*/
+class QT3DSVec3
+{
+public:
+ /**
+ \brief default constructor leaves data uninitialized.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3() {}
+
+ /**
+ \brief Assigns scalar parameter to all elements.
+
+ Useful to initialize to zero or one.
+
+ \param[in] a Value to assign to elements.
+ */
+ explicit QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3(NVReal a)
+ : x(a)
+ , y(a)
+ , z(a)
+ {
+ }
+
+ /**
+ \brief Initializes from 3 scalar parameters.
+
+ \param[in] nx Value to initialize X component.
+ \param[in] ny Value to initialize Y component.
+ \param[in] nz Value to initialize Z component.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3(NVReal nx, NVReal ny, NVReal nz)
+ : x(nx)
+ , y(ny)
+ , z(nz)
+ {
+ }
+
+ /**
+ \brief Copy ctor.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3(const QT3DSVec3 &v)
+ : x(v.x)
+ , y(v.y)
+ , z(v.z)
+ {
+ }
+
+ // Operators
+
+ /**
+ \brief Assignment operator
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 &operator=(const QT3DSVec3 &p)
+ {
+ x = p.x;
+ y = p.y;
+ z = p.z;
+ return *this;
+ }
+
+ /**
+ \brief element access
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal &operator[](int index)
+ {
+ QT3DS_ASSERT(index >= 0 && index <= 2);
+ return (&x)[index];
+ }
+
+ /**
+ \brief element access
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE const NVReal &operator[](int index) const
+ {
+ QT3DS_ASSERT(index >= 0 && index <= 2);
+ return (&x)[index];
+ }
+
+ /**
+ \brief returns true if the two vectors are exactly equal.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool operator==(const QT3DSVec3 &v) const
+ {
+ return x == v.x && y == v.y && z == v.z;
+ }
+
+ /**
+ \brief returns true if the two vectors are not exactly equal.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool operator!=(const QT3DSVec3 &v) const
+ {
+ return x != v.x || y != v.y || z != v.z;
+ }
+
+ /**
+ \brief tests for exact zero vector
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isZero() const
+ {
+ return x == 0.0f && y == 0.0f && z == 0.0f;
+ }
+
+ /**
+ \brief returns true if all 3 elems of the vector are finite (not NAN or INF, etc.)
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool isFinite() const
+ {
+ return NVIsFinite(x) && NVIsFinite(y) && NVIsFinite(z);
+ }
+
+ /**
+ \brief is normalized - used by API parameter validation
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isNormalized() const
+ {
+ const float unitTolerance = NVReal(1e-4);
+ return isFinite() && NVAbs(magnitude() - 1) < unitTolerance;
+ }
+
+ /**
+ \brief returns the squared magnitude
+
+ Avoids calling NVSqrt()!
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal magnitudeSquared() const
+ {
+ return x * x + y * y + z * z;
+ }
+
+ /**
+ \brief returns the magnitude
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal magnitude() const { return NVSqrt(magnitudeSquared()); }
+
+ /**
+ \brief negation
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 operator-() const { return QT3DSVec3(-x, -y, -z); }
+
+ /**
+ \brief vector addition
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 operator+(const QT3DSVec3 &v) const
+ {
+ return QT3DSVec3(x + v.x, y + v.y, z + v.z);
+ }
+
+ /**
+ \brief vector difference
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 operator-(const QT3DSVec3 &v) const
+ {
+ return QT3DSVec3(x - v.x, y - v.y, z - v.z);
+ }
+
+ /**
+ \brief scalar post-multiplication
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 operator*(NVReal f) const
+ {
+ return QT3DSVec3(x * f, y * f, z * f);
+ }
+
+ /**
+ \brief scalar division
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 operator/(NVReal f) const
+ {
+ f = NVReal(1) / f; // PT: inconsistent notation with operator /=
+ return QT3DSVec3(x * f, y * f, z * f);
+ }
+
+ /**
+ \brief vector addition
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 &operator+=(const QT3DSVec3 &v)
+ {
+ x += v.x;
+ y += v.y;
+ z += v.z;
+ return *this;
+ }
+
+ /**
+ \brief vector difference
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 &operator-=(const QT3DSVec3 &v)
+ {
+ x -= v.x;
+ y -= v.y;
+ z -= v.z;
+ return *this;
+ }
+
+ /**
+ \brief scalar multiplication
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 &operator*=(NVReal f)
+ {
+ x *= f;
+ y *= f;
+ z *= f;
+ return *this;
+ }
+ /**
+ \brief scalar division
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 &operator/=(NVReal f)
+ {
+ f = 1.0f / f; // PT: inconsistent notation with operator /
+ x *= f;
+ y *= f;
+ z *= f;
+ return *this;
+ }
+
+ /**
+ \brief returns the scalar product of this and other.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal dot(const QT3DSVec3 &v) const
+ {
+ return x * v.x + y * v.y + z * v.z;
+ }
+
+ /**
+ \brief cross product
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 cross(const QT3DSVec3 &v) const
+ {
+ return QT3DSVec3(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x);
+ }
+
+ /** return a unit vector */
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 getNormalized() const
+ {
+ const NVReal m = magnitudeSquared();
+ return m > 0 ? *this * NVRecipSqrt(m) : QT3DSVec3(0, 0, 0);
+ }
+
+ /**
+ \brief normalizes the vector in place
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal normalize()
+ {
+ const NVReal m = magnitude();
+ if (m > 0)
+ *this /= m;
+ return m;
+ }
+
+ /**
+ \brief normalizes the vector in place. Does nothing if vector magnitude is under
+ QT3DS_NORMALIZATION_EPSILON.
+ Returns vector magnitude if >= QT3DS_NORMALIZATION_EPSILON and 0.0f otherwise.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal normalizeSafe()
+ {
+ const NVReal mag = magnitude();
+ if (mag < QT3DS_NORMALIZATION_EPSILON)
+ return 0.0f;
+ *this *= NVReal(1) / mag;
+ return mag;
+ }
+
+ /**
+ \brief normalizes the vector in place. Asserts if vector magnitude is under
+ QT3DS_NORMALIZATION_EPSILON.
+ returns vector magnitude.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE NVReal normalizeFast()
+ {
+ const NVReal mag = magnitude();
+ QT3DS_ASSERT(mag >= QT3DS_NORMALIZATION_EPSILON);
+ *this *= NVReal(1) / mag;
+ return mag;
+ }
+
+ /**
+ \brief a[i] * b[i], for all i.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 multiply(const QT3DSVec3 &a) const
+ {
+ return QT3DSVec3(x * a.x, y * a.y, z * a.z);
+ }
+
+ /**
+ \brief element-wise minimum
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 minimum(const QT3DSVec3 &v) const
+ {
+ return QT3DSVec3(NVMin(x, v.x), NVMin(y, v.y), NVMin(z, v.z));
+ }
+
+ /**
+ \brief returns MIN(x, y, z);
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float minElement() const { return NVMin(x, NVMin(y, z)); }
+
+ /**
+ \brief element-wise maximum
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE QT3DSVec3 maximum(const QT3DSVec3 &v) const
+ {
+ return QT3DSVec3(NVMax(x, v.x), NVMax(y, v.y), NVMax(z, v.z));
+ }
+
+ /**
+ \brief returns MAX(x, y, z);
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float maxElement() const { return NVMax(x, NVMax(y, z)); }
+
+ NVReal x, y, z;
+};
+
+QT3DS_CUDA_CALLABLE static QT3DS_FORCE_INLINE QT3DSVec3 operator*(NVReal f, const QT3DSVec3 &v)
+{
+ return QT3DSVec3(f * v.x, f * v.y, f * v.z);
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_VEC3_H
diff --git a/src/foundation/Qt3DSVec4.h b/src/foundation/Qt3DSVec4.h
new file mode 100644
index 0000000..acccd48
--- /dev/null
+++ b/src/foundation/Qt3DSVec4.h
@@ -0,0 +1,373 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_VEC4_H
+#define QT3DS_FOUNDATION_QT3DS_VEC4_H
+/** \addtogroup foundation
+@{
+*/
+#include "foundation/Qt3DSMath.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSAssert.h"
+
+/**
+\brief 4 Element vector class.
+
+This is a vector class with public data members.
+This is not nice but it has become such a standard that hiding the xyz data members
+makes it difficult to reuse external code that assumes that these are public in the library.
+The vector class can be made to use float or double precision by appropriately defining NVReal.
+This has been chosen as a cleaner alternative to a template class.
+*/
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+class QT3DSVec4
+{
+public:
+ /**
+ \brief default constructor leaves data uninitialized.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4() {}
+
+ /**
+ \brief Assigns scalar parameter to all elements.
+
+ Useful to initialize to zero or one.
+
+ \param[in] a Value to assign to elements.
+ */
+ explicit QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4(NVReal a)
+ : x(a)
+ , y(a)
+ , z(a)
+ , w(a)
+ {
+ }
+
+ /**
+ \brief Initializes from 3 scalar parameters.
+
+ \param[in] nx Value to initialize X component.
+ \param[in] ny Value to initialize Y component.
+ \param[in] nz Value to initialize Z component.
+ \param[in] nw Value to initialize W component.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4(NVReal nx, NVReal ny, NVReal nz, NVReal nw)
+ : x(nx)
+ , y(ny)
+ , z(nz)
+ , w(nw)
+ {
+ }
+
+ /**
+ \brief Initializes from 3 scalar parameters.
+
+ \param[in] v Value to initialize the X, Y, and Z components.
+ \param[in] nw Value to initialize W component.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4(const QT3DSVec3 &v, NVReal nw)
+ : x(v.x)
+ , y(v.y)
+ , z(v.z)
+ , w(nw)
+ {
+ }
+
+ /**
+ \brief Initializes from an array of scalar parameters.
+
+ \param[in] v Value to initialize with.
+ */
+ explicit QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4(const NVReal v[])
+ : x(v[0])
+ , y(v[1])
+ , z(v[2])
+ , w(v[3])
+ {
+ }
+
+ /**
+ \brief Copy ctor.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4(const QT3DSVec4 &v)
+ : x(v.x)
+ , y(v.y)
+ , z(v.z)
+ , w(v.w)
+ {
+ }
+
+ // Operators
+
+ /**
+ \brief Assignment operator
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 &operator=(const QT3DSVec4 &p)
+ {
+ x = p.x;
+ y = p.y;
+ z = p.z;
+ w = p.w;
+ return *this;
+ }
+
+ /**
+ \brief element access
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal &operator[](int index)
+ {
+ QT3DS_ASSERT(index >= 0 && index <= 3);
+ return (&x)[index];
+ }
+
+ /**
+ \brief element access
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE const NVReal &operator[](int index) const
+ {
+ QT3DS_ASSERT(index >= 0 && index <= 3);
+ return (&x)[index];
+ }
+
+ /**
+ \brief returns true if the two vectors are exactly equal.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool operator==(const QT3DSVec4 &v) const
+ {
+ return x == v.x && y == v.y && z == v.z && w == v.w;
+ }
+
+ /**
+ \brief returns true if the two vectors are not exactly equal.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool operator!=(const QT3DSVec4 &v) const
+ {
+ return x != v.x || y != v.y || z != v.z || w != v.w;
+ }
+
+ /**
+ \brief tests for exact zero vector
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool isZero() const { return x == 0 && y == 0 && z == 0 && w == 0; }
+
+ /**
+ \brief returns true if all 3 elems of the vector are finite (not NAN or INF, etc.)
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool isFinite() const
+ {
+ return NVIsFinite(x) && NVIsFinite(y) && NVIsFinite(z) && NVIsFinite(w);
+ }
+
+ /**
+ \brief is normalized - used by API parameter validation
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE bool isNormalized() const
+ {
+ const float unitTolerance = NVReal(1e-4);
+ return isFinite() && NVAbs(magnitude() - 1) < unitTolerance;
+ }
+
+ /**
+ \brief returns the squared magnitude
+
+ Avoids calling NVSqrt()!
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal magnitudeSquared() const
+ {
+ return x * x + y * y + z * z + w * w;
+ }
+
+ /**
+ \brief returns the magnitude
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal magnitude() const { return NVSqrt(magnitudeSquared()); }
+
+ /**
+ \brief negation
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 operator-() const { return QT3DSVec4(-x, -y, -z, -w); }
+
+ /**
+ \brief vector addition
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 operator+(const QT3DSVec4 &v) const
+ {
+ return QT3DSVec4(x + v.x, y + v.y, z + v.z, w + v.w);
+ }
+
+ /**
+ \brief vector difference
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 operator-(const QT3DSVec4 &v) const
+ {
+ return QT3DSVec4(x - v.x, y - v.y, z - v.z, w - v.w);
+ }
+
+ /**
+ \brief scalar post-multiplication
+ */
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 operator*(NVReal f) const
+ {
+ return QT3DSVec4(x * f, y * f, z * f, w * f);
+ }
+
+ /**
+ \brief scalar division
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 operator/(NVReal f) const
+ {
+ f = NVReal(1) / f;
+ return QT3DSVec4(x * f, y * f, z * f, w * f);
+ }
+
+ /**
+ \brief vector addition
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 &operator+=(const QT3DSVec4 &v)
+ {
+ x += v.x;
+ y += v.y;
+ z += v.z;
+ w += v.w;
+ return *this;
+ }
+
+ /**
+ \brief vector difference
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 &operator-=(const QT3DSVec4 &v)
+ {
+ x -= v.x;
+ y -= v.y;
+ z -= v.z;
+ w -= v.w;
+ return *this;
+ }
+
+ /**
+ \brief scalar multiplication
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 &operator*=(NVReal f)
+ {
+ x *= f;
+ y *= f;
+ z *= f;
+ w *= f;
+ return *this;
+ }
+ /**
+ \brief scalar division
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 &operator/=(NVReal f)
+ {
+ f = 1.0f / f;
+ x *= f;
+ y *= f;
+ z *= f;
+ w *= f;
+ return *this;
+ }
+
+ /**
+ \brief returns the scalar product of this and other.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal dot(const QT3DSVec4 &v) const
+ {
+ return x * v.x + y * v.y + z * v.z + w * v.w;
+ }
+
+ /** return a unit vector */
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 getNormalized() const
+ {
+ NVReal m = magnitudeSquared();
+ return m > 0 ? *this * NVRecipSqrt(m) : QT3DSVec4(0, 0, 0, 0);
+ }
+
+ /**
+ \brief normalizes the vector in place
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE NVReal normalize()
+ {
+ NVReal m = magnitude();
+ if (m > 0)
+ *this /= m;
+ return m;
+ }
+
+ /**
+ \brief a[i] * b[i], for all i.
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 multiply(const QT3DSVec4 &a) const
+ {
+ return QT3DSVec4(x * a.x, y * a.y, z * a.z, w * a.w);
+ }
+
+ /**
+ \brief element-wise minimum
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 minimum(const QT3DSVec4 &v) const
+ {
+ return QT3DSVec4(NVMin(x, v.x), NVMin(y, v.y), NVMin(z, v.z), NVMin(w, v.w));
+ }
+
+ /**
+ \brief element-wise maximum
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec4 maximum(const QT3DSVec4 &v) const
+ {
+ return QT3DSVec4(NVMax(x, v.x), NVMax(y, v.y), NVMax(z, v.z), NVMax(w, v.w));
+ }
+
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE QT3DSVec3 getXYZ() const { return QT3DSVec3(x, y, z); }
+
+ /**
+ \brief set vector elements to zero
+ */
+ QT3DS_CUDA_CALLABLE QT3DS_INLINE void setZero() { x = y = z = w = NVReal(0); }
+
+ NVReal x, y, z, w;
+};
+
+QT3DS_CUDA_CALLABLE static QT3DS_INLINE QT3DSVec4 operator*(NVReal f, const QT3DSVec4 &v)
+{
+ return QT3DSVec4(f * v.x, f * v.y, f * v.z, f * v.w);
+}
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+/** @} */
+#endif // QT3DS_FOUNDATION_QT3DS_VEC4_H
diff --git a/src/foundation/Qt3DSVersionNumber.h b/src/foundation/Qt3DSVersionNumber.h
new file mode 100644
index 0000000..5942ef7
--- /dev/null
+++ b/src/foundation/Qt3DSVersionNumber.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+VersionNumbers: The combination of these
+numbers uniquely identifies the API, and should
+be incremented when the SDK API changes. This may
+include changes to file formats.
+
+This header is included in the main SDK header files
+so that the entire SDK and everything that builds on it
+is completely rebuilt when this file changes. Thus,
+this file is not to include a frequently changing
+build number. See BuildNumber.h for that.
+
+Each of these three values should stay below 255 because
+sometimes they are stored in a byte.
+*/
+/** \addtogroup foundation
+ @{
+*/
+#ifndef QT3DS_FOUNDATION_QT3DS_VERSION_NUMBER_H
+#define QT3DS_FOUNDATION_QT3DS_VERSION_NUMBER_H
+
+#define QT3DS_FOUNDATION_VERSION_MAJOR 3
+#define QT3DS_FOUNDATION_VERSION_MINOR 3
+#define QT3DS_FOUNDATION_VERSION_BUGFIX 0
+
+/**
+The constant QT3DS_FOUNDATION_VERSION is used when creating certain PhysX module objects.
+This is to ensure that the application is using the same header version as the library was built
+with.
+*/
+#define QT3DS_FOUNDATION_VERSION \
+ ((QT3DS_FOUNDATION_VERSION_MAJOR << 24) + (QT3DS_FOUNDATION_VERSION_MINOR << 16) \
+ + (QT3DS_FOUNDATION_VERSION_BUGFIX << 8) + 0)
+
+#endif // QT3DS_FOUNDATION_QT3DS_VERSION_NUMBER_H
+
+/** @} */
diff --git a/src/foundation/SerializationTypes.h b/src/foundation/SerializationTypes.h
new file mode 100644
index 0000000..c7fe5ce
--- /dev/null
+++ b/src/foundation/SerializationTypes.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SERIALIZATION_TYPES_H
+#define QT3DS_RENDER_SERIALIZATION_TYPES_H
+#include "EASTL/hash_map.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "foundation/Qt3DSContainers.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ struct SStrRemapMap : public nvhash_map<char8_t *, QT3DSU32>
+ {
+ typedef nvhash_map<char8_t *, QT3DSU32> TBaseType;
+ SStrRemapMap(NVAllocatorCallback &inAlloc, const char *inName)
+ : TBaseType(inAlloc, inName)
+ {
+ }
+ };
+
+ struct SPtrOffsetMap : public nvhash_map<const void *, QT3DSU32>
+ {
+ typedef nvhash_map<const void *, QT3DSU32> TBaseType;
+ SPtrOffsetMap(NVAllocatorCallback &inAlloc, const char *inName)
+ : TBaseType(inAlloc, inName)
+ {
+ }
+ };
+
+ struct SWriteBuffer : public MemoryBuffer<>
+ {
+ SWriteBuffer(NVAllocatorCallback &inAlloc, const char *inName)
+ : MemoryBuffer<>(ForwardingAllocator(inAlloc, inName))
+ {
+ }
+ };
+
+ // Simple data reader that mimics a string
+ struct SDataReader
+ {
+ QT3DSU8 *m_CurrentPtr;
+ QT3DSU8 *m_EndPtr;
+ SDataReader(QT3DSU8 *inStartPtr, QT3DSU8 *inEndPtr)
+ : m_CurrentPtr(inStartPtr)
+ , m_EndPtr(inEndPtr)
+ {
+ }
+
+ template <typename TDataType>
+ TDataType *Load()
+ {
+ if ((m_CurrentPtr + sizeof(TDataType)) > m_EndPtr) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ TDataType *theType = reinterpret_cast<TDataType *>(m_CurrentPtr);
+ m_CurrentPtr += sizeof(TDataType);
+ return theType;
+ }
+
+ template <typename TDataType>
+ void MemCopy(TDataType *dt, QT3DSU32 count)
+ {
+ if (count) {
+ QT3DSU32 loadSize = count * sizeof(TDataType);
+ QT3DSU32 amountLeft = (QT3DSU32)(m_EndPtr - m_CurrentPtr);
+ QT3DSU32 amountLoaded = NVMin(loadSize, amountLeft);
+ memCopy(dt, m_CurrentPtr, amountLoaded);
+ m_CurrentPtr += amountLoaded;
+ if (amountLoaded < loadSize) {
+ QT3DS_ASSERT(false);
+ QT3DSU8 *rawPtr = (QT3DSU8 *)dt;
+ rawPtr += amountLoaded;
+ size_t leftover = loadSize - amountLoaded;
+ // zeroing things out at least is an attempt to provide ordered
+ // data that may prevent a crash in some cases.
+ memZero(rawPtr, (QT3DSU32)leftover);
+ }
+ }
+ }
+
+ // Don't make a habit of using this a lot.
+ template <typename TDataType>
+ TDataType &LoadRef()
+ {
+ TDataType *retval = Load<TDataType>();
+ if (!retval)
+ QT3DS_ASSERT(false);
+ return *retval;
+ }
+
+ void Align(size_t alignment)
+ {
+ size_t offset = (size_t)(m_CurrentPtr);
+ if (offset % alignment)
+ m_CurrentPtr += (alignment - (offset % alignment));
+ }
+
+ void Align() { Align(sizeof(void *)); }
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/foundation/Socket.cpp b/src/foundation/Socket.cpp
new file mode 100644
index 0000000..df00e60
--- /dev/null
+++ b/src/foundation/Socket.cpp
@@ -0,0 +1,472 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+LuaSocket 3.0 license
+Copyright � 2004-2013 Diego Nehab
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+#include "foundation/Socket.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+
+#if defined QT3DS_WINDOWS || defined QT3DS_WIN8ARM
+#include "windows/SocketImpl.h"
+#else
+#include "linux/SocketImpl.h"
+#endif
+
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace qt3ds::foundation::socketimpl;
+
+namespace {
+
+#if defined QT3DS_WINDOWS || defined QT3DS_WIN8ARM
+/*-------------------------------------------------------------------------*\
+* Some systems do not provide this so that we provide our own. It's not
+* marvelously fast, but it works just fine.
+\*-------------------------------------------------------------------------*/
+int inet_aton(const char *cp, struct in_addr *inp)
+{
+ unsigned int a = 0, b = 0, c = 0, d = 0;
+ int n = 0, r;
+ unsigned long int addr = 0;
+ r = sscanf(cp, "%u.%u.%u.%u%n", &a, &b, &c, &d, &n);
+ if (r == 0 || n == 0)
+ return 0;
+ cp += n;
+ if (*cp)
+ return 0;
+ if (a > 255 || b > 255 || c > 255 || d > 255)
+ return 0;
+ if (inp) {
+ addr += a;
+ addr <<= 8;
+ addr += b;
+ addr <<= 8;
+ addr += c;
+ addr <<= 8;
+ addr += d;
+ inp->s_addr = htonl(addr);
+ }
+ return 1;
+}
+#endif
+
+/*-------------------------------------------------------------------------*\
+* Tries to connect to remote address (address, port)
+\*-------------------------------------------------------------------------*/
+int inet_tryconnect(p_socket ps, const char *address, unsigned short port, QT3DSU32 tm, SA *remoteAddr)
+{
+ struct sockaddr_in remote;
+ int err;
+ memset(&remote, 0, sizeof(remote));
+ remote.sin_family = AF_INET;
+ remote.sin_port = htons(port);
+ if (strcmp(address, "*")) {
+ if (!inet_aton(address, &remote.sin_addr)) {
+ struct hostent *hp = NULL;
+ struct in_addr **addr;
+ err = socket_gethostbyname(address, &hp);
+ if (err != IO_DONE)
+ return err;
+ addr = (struct in_addr **)hp->h_addr_list;
+ memcpy(&remote.sin_addr, *addr, sizeof(struct in_addr));
+ }
+ } else
+ remote.sin_family = AF_UNSPEC;
+ if (remoteAddr)
+ memcpy(remoteAddr, &remote, sizeof(remote));
+ err = socket_connect(ps, (SA *)&remote, sizeof(remote), tm);
+ return err;
+}
+
+/*-------------------------------------------------------------------------*\
+* Tries to bind socket to (address, port)
+\*-------------------------------------------------------------------------*/
+int inet_trybind(p_socket ps, const char *address, unsigned short port)
+{
+ struct sockaddr_in local;
+ int err;
+ memset(&local, 0, sizeof(local));
+ /* address is either wildcard or a valid ip address */
+ local.sin_addr.s_addr = htonl(INADDR_ANY);
+ local.sin_port = htons(port);
+ local.sin_family = AF_INET;
+ if (strcmp(address, "*") && !inet_aton(address, &local.sin_addr)) {
+ struct hostent *hp = NULL;
+ struct in_addr **addr;
+ err = socket_gethostbyname(address, &hp);
+ if (err != IO_DONE)
+ return err;
+ addr = (struct in_addr **)hp->h_addr_list;
+ memcpy(&local.sin_addr, *addr, sizeof(struct in_addr));
+ }
+ err = socket_bind(ps, (SA *)&local, sizeof(local));
+ if (err != IO_DONE)
+ socket_destroy(ps);
+ return err;
+}
+
+static bool is_socket_error(int errcode)
+{
+ return errcode != IO_DONE && errcode != IO_TIMEOUT;
+}
+
+const char *generalized_strerror(int err)
+{
+ if (err <= 0)
+ return io_strerror(err);
+ else
+ return socket_strerror(err);
+}
+
+struct SocketSystemCore : public NVRefCounted
+{
+ NVFoundationBase &m_Foundation;
+ QT3DSI32 mRefCount;
+ SocketSystemCore(NVFoundationBase &fnd)
+ : m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+ ~SocketSystemCore() { socket_close(); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ static NVScopedRefCounted<SocketSystemCore> Create(NVFoundationBase &fnd)
+ {
+ int success = socket_open();
+ if (!success) {
+ qCCritical(INVALID_OPERATION, "Failed to initialize network subsystem");
+ return NVScopedRefCounted<SocketSystemCore>();
+ }
+ return QT3DS_NEW(fnd.getAllocator(), SocketSystemCore)(fnd);
+ }
+};
+
+struct SocketStreamImpl : public SocketStream
+{
+ NVScopedRefCounted<SocketSystemCore> m_SocketCore;
+ NVFoundationBase &m_Foundation;
+ t_socket m_Socket;
+ SA m_Destination;
+ bool m_Connected;
+ QT3DSU32 m_Timeout;
+ QT3DSI32 mRefCount;
+ SocketStreamImpl(SocketSystemCore &core, NVFoundationBase &fnd, t_socket s, SA dest)
+ : m_SocketCore(core)
+ , m_Foundation(fnd)
+ , m_Socket(s)
+ , m_Destination(dest)
+ , m_Connected(true)
+ , m_Timeout(10000)
+ , mRefCount(0)
+ {
+ // We use wait functions in order to block.
+ socket_setnonblocking(&m_Socket);
+ }
+
+ ~SocketStreamImpl()
+ {
+ shutdown();
+ socket_destroy(&m_Socket);
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ void setTimeout(QT3DSU32 milliseconds) override { m_Timeout = milliseconds; }
+
+ bool Write(NVConstDataRef<QT3DSU8> data) override
+ {
+ if (m_Connected == false)
+ return false;
+
+ size_t totalSent = 0;
+ const char *writePtr(reinterpret_cast<const char *>(data.begin()));
+ size_t amountLeft = data.size();
+ do {
+
+ size_t amountSent = 0;
+ int errcode =
+ socket_send(&m_Socket, writePtr + totalSent, amountLeft, &amountSent, m_Timeout);
+
+ if (is_socket_error(errcode)) {
+ m_Connected = false;
+ qCWarning(WARNING, "Networking error during send: %s", generalized_strerror(errcode));
+ return false;
+ }
+ totalSent += amountSent;
+ amountLeft -= amountSent;
+ } while (amountLeft);
+ return true;
+ }
+
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override
+ {
+ if (m_Connected == false)
+ return 0;
+ size_t amountReceived = 0;
+ int errcode = socket_recv(&m_Socket, reinterpret_cast<char *>(data.begin()), data.size(),
+ &amountReceived, m_Timeout);
+ if (is_socket_error(errcode)) {
+ m_Connected = false;
+ qCWarning(WARNING, "Networking error during receive: %s", generalized_strerror(errcode));
+ return false;
+ }
+ return static_cast<QT3DSU32>(amountReceived);
+ }
+
+ QT3DSU32 nonBlockingRead(NVDataRef<QT3DSU8> data) override
+ {
+ if (m_Connected == false)
+ return 0;
+ size_t amountReceived = 0;
+ int errcode = socket_recv(&m_Socket, reinterpret_cast<char *>(data.begin()), data.size(),
+ &amountReceived, 0);
+ if (is_socket_error(errcode)) {
+ m_Connected = false;
+ qCWarning(WARNING, "Networking error during receive: %s",
+ generalized_strerror(errcode));
+ return false;
+ }
+ return static_cast<QT3DSU32>(amountReceived);
+ }
+
+ bool connected() override { return m_Connected; }
+
+ void shutdown() override
+ {
+ if (m_Connected) {
+ socket_shutdown(&m_Socket, 2);
+ m_Connected = false;
+ }
+ }
+};
+
+struct FileSocketStreamImpl : public SocketStream
+{
+ NVFoundationBase &m_Foundation;
+ CFileSeekableIOStream m_Stream;
+ FileOpenFlags m_FileFlags;
+ bool m_Connected;
+ QT3DSI32 mRefCount;
+
+ FileSocketStreamImpl(NVFoundationBase &fnd, const char *fname, FileOpenFlags fileFlags)
+ : m_Foundation(fnd)
+ , m_Stream(fname, fileFlags)
+ , m_FileFlags(fileFlags)
+ , m_Connected(false)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ bool IsOpen() { return m_Connected && m_Stream.IsOpen(); }
+
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override
+ {
+ if (IsOpen()) {
+ QT3DSU32 retval = m_Stream.Read(data);
+ if (retval < data.size())
+ m_Connected = false;
+ return retval;
+ }
+
+ return 0;
+ }
+
+ bool Write(NVConstDataRef<QT3DSU8> data) override
+ {
+ bool canWrite = m_FileFlags & FileOpenFlagValues::Write;
+ if (IsOpen() && canWrite) {
+ m_Stream.Write(data);
+ return true;
+ }
+ return false;
+ }
+
+ void setTimeout(QT3DSU32) override {}
+
+ QT3DSU32 nonBlockingRead(NVDataRef<QT3DSU8> data) override { return Read(data); }
+
+ bool connected() override { return m_Connected; }
+
+ void shutdown() override { m_Connected = false; }
+};
+
+struct SocketServerImpl : public SocketServer
+{
+ NVScopedRefCounted<SocketSystemCore> m_SocketCore;
+ NVFoundationBase &m_Foundation;
+ t_socket m_Socket;
+ int m_Port;
+ QT3DSU32 m_Timeout;
+ QT3DSI32 mRefCount;
+ SocketServerImpl(SocketSystemCore &core, NVFoundationBase &fnd, t_socket s, int port)
+ : m_SocketCore(core)
+ , m_Foundation(fnd)
+ , m_Socket(s)
+ , m_Port(port)
+ , m_Timeout(10000)
+ , mRefCount(0)
+ {
+ }
+
+ ~SocketServerImpl() { socket_destroy(&m_Socket); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ int port() override { return m_Port; }
+
+ void setTimeout(QT3DSU32 milliseconds) override { m_Timeout = milliseconds; }
+
+ NVScopedRefCounted<SocketStream> nextClient() override
+ {
+ SA daddr;
+ memset(&daddr, 0, sizeof(daddr));
+ t_socket new_socket;
+ int errcode = socket_accept(&m_Socket, &new_socket, NULL, NULL, m_Timeout);
+
+ if (is_socket_error(errcode)) {
+ return NVScopedRefCounted<SocketStream>();
+ } else if (errcode == IO_DONE) {
+ return QT3DS_NEW(m_Foundation.getAllocator(),
+ SocketStreamImpl)(*m_SocketCore, m_Foundation, new_socket, daddr);
+ }
+ return NVScopedRefCounted<SocketStream>();
+ }
+};
+
+struct SocketSystemImpl : public SocketSystem
+{
+ NVScopedRefCounted<SocketSystemCore> m_SocketCore;
+ NVFoundationBase &m_Foundation;
+ QT3DSI32 mRefCount;
+ SocketSystemImpl(SocketSystemCore &core, NVFoundationBase &fnd)
+ : m_SocketCore(core)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+
+ {
+ }
+ ~SocketSystemImpl() {}
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ NVScopedRefCounted<SocketStream> createStream(const char *host, QT3DSI32 port,
+ QT3DSU32 timeoutMilliseconds) override
+ {
+ t_socket newSocket(SOCKET_INVALID);
+ int errcode = socket_create(&newSocket, PF_INET, SOCK_STREAM, 0);
+ if (is_socket_error(errcode)) {
+ qCWarning(WARNING, "Error during connect: %s", generalized_strerror(errcode));
+ return NVScopedRefCounted<SocketStream>();
+ }
+ SA remoteAddr;
+ memset(&remoteAddr, 0, sizeof(SA));
+ errcode = inet_tryconnect(&newSocket, host, (unsigned short)port, timeoutMilliseconds,
+ &remoteAddr);
+ if (is_socket_error(errcode)) {
+ qCWarning(WARNING, "Error during connect: %s", generalized_strerror(errcode));
+ return NVScopedRefCounted<SocketStream>();
+ } else if (errcode == IO_DONE) {
+ return QT3DS_NEW(m_Foundation.getAllocator(),
+ SocketStreamImpl)(*m_SocketCore, m_Foundation, newSocket, remoteAddr);
+ }
+ return NVScopedRefCounted<SocketStream>();
+ }
+
+ NVScopedRefCounted<SocketServer> createServer(QT3DSI32 port) override
+ {
+ t_socket newSocket(SOCKET_INVALID);
+ int errcode = socket_create(&newSocket, PF_INET, SOCK_STREAM, 0);
+ if (is_socket_error(errcode)) {
+ qCWarning(WARNING, "Error during create server create socket: %s",
+ generalized_strerror(errcode));
+ return NVScopedRefCounted<SocketServer>();
+ }
+ errcode = inet_trybind(&newSocket, "*", (unsigned short)port);
+ if (is_socket_error(errcode)) {
+ qCWarning(WARNING, "Error during create server bind: %s",
+ generalized_strerror(errcode));
+ return NVScopedRefCounted<SocketServer>();
+ } else if (errcode == IO_DONE) {
+ errcode = socket_listen(&newSocket, 10);
+ if (errcode == IO_DONE) {
+ return QT3DS_NEW(m_Foundation.getAllocator(),
+ SocketServerImpl)(*m_SocketCore, m_Foundation, newSocket, port);
+ } else
+ qCWarning(WARNING, "Error during create server listen: %s",
+ generalized_strerror(errcode));
+ }
+ return NVScopedRefCounted<SocketServer>();
+ }
+};
+}
+
+NVScopedRefCounted<SocketStream>
+SocketStream::CreateFileStream(NVFoundationBase &fnd, const char *fname, FileOpenFlags flags)
+{
+ return QT3DS_NEW(fnd.getAllocator(), FileSocketStreamImpl)(fnd, fname, flags);
+}
+
+NVScopedRefCounted<SocketSystem> SocketSystem::createSocketSystem(NVFoundationBase &fnd)
+{
+ NVScopedRefCounted<SocketSystemCore> theCore = SocketSystemCore::Create(fnd);
+ if (theCore) {
+ return QT3DS_NEW(fnd.getAllocator(), SocketSystemImpl)(*theCore, fnd);
+ }
+ return NVScopedRefCounted<SocketSystem>();
+}
diff --git a/src/foundation/Socket.h b/src/foundation/Socket.h
new file mode 100644
index 0000000..f561ab8
--- /dev/null
+++ b/src/foundation/Socket.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_SOCKET_H
+#define QT3DS_FOUNDATION_SOCKET_H
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+
+namespace qt3ds {
+
+class NVFoundationBase;
+namespace foundation {
+
+ class SocketStream : public IInStream, public IOutStream, public NVRefCounted
+ {
+ public:
+ // set timeout for write and blocking read operations
+ // Setting to zero makes all operations nonblocking.
+ virtual void setTimeout(QT3DSU32 milliseconds) = 0;
+ virtual QT3DSU32 nonBlockingRead(NVDataRef<QT3DSU8> ioBuffer) = 0;
+ virtual bool connected() = 0;
+ virtual void shutdown() = 0;
+
+ // Useful to testing systems without going into the issues that a network connection can
+ // cause.
+ static NVScopedRefCounted<SocketStream>
+ CreateFileStream(NVFoundationBase &fnd, const char *fname, FileOpenFlags flags);
+ };
+
+ class SocketServer : public NVRefCounted
+ {
+ public:
+ virtual int port() = 0;
+ virtual void setTimeout(QT3DSU32 milliseconds) = 0;
+ virtual NVScopedRefCounted<SocketStream> nextClient() = 0;
+ };
+
+ class SocketSystem : public NVRefCounted
+ {
+ public:
+ // timeout of 0 means wait forever
+ virtual NVScopedRefCounted<SocketStream>
+ createStream(const char *host, QT3DSI32 port, QT3DSU32 timeoutMilliseconds = 10000) = 0;
+ virtual NVScopedRefCounted<SocketServer> createServer(QT3DSI32 port) = 0;
+
+ static NVScopedRefCounted<SocketSystem> createSocketSystem(NVFoundationBase &fnd);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/foundation/StrConvertUTF.h b/src/foundation/StrConvertUTF.h
new file mode 100644
index 0000000..965867c
--- /dev/null
+++ b/src/foundation/StrConvertUTF.h
@@ -0,0 +1,213 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef QT3DS_RENDER_STR_CONVERT_UTF_H
+#define QT3DS_RENDER_STR_CONVERT_UTF_H
+#include <EASTL/string.h>
+#include "foundation/ConvertUTF.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ using namespace qt3ds;
+ template <typename TSrcType>
+ struct ConverterType
+ {
+ };
+ template <>
+ struct ConverterType<char8_t>
+ {
+ typedef UTF8 TConverterType;
+ };
+ template <>
+ struct ConverterType<char16_t>
+ {
+ typedef UTF16 TConverterType;
+ };
+ template <>
+ struct ConverterType<char32_t>
+ {
+ typedef UTF32 TConverterType;
+ };
+
+ template <QT3DSU32 TWCharSize>
+ struct WCharType
+ {
+ };
+
+ template <>
+ struct WCharType<2>
+ {
+ typedef char16_t TCharType;
+ };
+
+ template <>
+ struct WCharType<4>
+ {
+ typedef char32_t TCharType;
+ };
+
+ typedef WCharType<sizeof(wchar_t)> TWCharEASTLConverter;
+
+ template <typename TSrcType, typename TDestType>
+ struct UTFConversionSelector
+ {
+ };
+
+ template <>
+ struct UTFConversionSelector<char8_t, char16_t>
+ {
+ static ConversionResult Convert(const UTF8 **sourceStart, const UTF8 *sourceEnd,
+ UTF16 **targetStart, UTF16 *targetEnd,
+ ConversionFlags flags)
+ {
+ return Q3DSConvertUTF8toUTF16(sourceStart, sourceEnd, targetStart, targetEnd, flags);
+ }
+ };
+
+ template <>
+ struct UTFConversionSelector<char8_t, char32_t>
+ {
+ static ConversionResult Convert(const UTF8 **sourceStart, const UTF8 *sourceEnd,
+ UTF32 **targetStart, UTF32 *targetEnd,
+ ConversionFlags flags)
+ {
+ return Q3DSConvertUTF8toUTF32(sourceStart, sourceEnd, targetStart, targetEnd, flags);
+ }
+ };
+ template <>
+ struct UTFConversionSelector<char16_t, char8_t>
+ {
+ static ConversionResult Convert(const UTF16 **sourceStart, const UTF16 *sourceEnd,
+ UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags)
+ {
+ return Q3DSConvertUTF16toUTF8(sourceStart, sourceEnd, targetStart, targetEnd, flags);
+ }
+ };
+ template <>
+ struct UTFConversionSelector<char16_t, char32_t>
+ {
+ static ConversionResult Convert(const UTF16 **sourceStart, const UTF16 *sourceEnd,
+ UTF32 **targetStart, UTF32 *targetEnd,
+ ConversionFlags flags)
+ {
+ return Q3DSConvertUTF16toUTF32(sourceStart, sourceEnd, targetStart, targetEnd, flags);
+ }
+ };
+ template <>
+ struct UTFConversionSelector<char32_t, char8_t>
+ {
+ static ConversionResult Convert(const UTF32 **sourceStart, const UTF32 *sourceEnd,
+ UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags)
+ {
+ return Q3DSConvertUTF32toUTF8(sourceStart, sourceEnd, targetStart, targetEnd, flags);
+ }
+ };
+ template <>
+ struct UTFConversionSelector<char32_t, char16_t>
+ {
+ static ConversionResult Convert(const UTF32 **sourceStart, const UTF32 *sourceEnd,
+ UTF16 **targetStart, UTF16 *targetEnd,
+ ConversionFlags flags)
+ {
+ return Q3DSConvertUTF32toUTF16(sourceStart, sourceEnd, targetStart, targetEnd, flags);
+ }
+ };
+
+ // Convert into an EASTL string type.
+ // inSrcLen may be zero in which case we analyze the string looking for the zero element.
+ template <typename TSrcType, typename TDestType, typename TAllocType>
+ bool ConvertUTF(const TSrcType *inSrc, size_t inSrcLen,
+ eastl::basic_string<TDestType, TAllocType> &outString)
+ {
+ typedef typename ConverterType<TDestType>::TConverterType TDestUTFType;
+ typedef typename ConverterType<TSrcType>::TConverterType TSrcUTFType;
+ if (inSrc == 0 || *inSrc == 0) {
+ outString.clear();
+ return true;
+ }
+
+ if (inSrcLen == 0) {
+ // empty loop intentional.
+ for (const TSrcType *ptr = inSrc; ptr && *ptr; ++ptr, ++inSrcLen) {
+ }
+ }
+
+ typename eastl::basic_string<TDestType, TAllocType>::size_type capacity =
+ outString.capacity();
+ if (capacity == 0)
+ outString.resize((QT3DSU32)inSrcLen * 2);
+ else
+ outString.resize(capacity);
+
+ ConversionResult theConversionResult(conversionOK);
+ TDestUTFType *writePtr = NULL;
+ do {
+ writePtr = reinterpret_cast<TDestUTFType *>(const_cast<TDestType *>(outString.data()));
+ TDestUTFType *writeEnd(writePtr + outString.size());
+ const TSrcUTFType *readPtr(reinterpret_cast<const TSrcUTFType *>(inSrc));
+ const TSrcUTFType *readEnd = readPtr + inSrcLen;
+ theConversionResult = UTFConversionSelector<TSrcType, TDestType>::Convert(
+ &readPtr, readEnd, &writePtr, writeEnd, lenientConversion);
+ if (theConversionResult == targetExhausted) {
+ capacity = outString.capacity() * 2;
+ outString.resize(capacity);
+ }
+ } while (theConversionResult == targetExhausted);
+
+ if (theConversionResult == conversionOK) {
+ TDestUTFType *writeStart =
+ reinterpret_cast<TDestUTFType *>(const_cast<TDestType *>(outString.data()));
+ outString.resize((QT3DSU32)(writePtr - writeStart));
+ return true;
+ } else {
+ outString.clear();
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ }
+
+#ifdef WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T
+
+ template <typename TDestType, typename TAllocType>
+ bool ConvertWideUTF(const wchar_t *inSrc, size_t inSrcLen,
+ eastl::basic_string<TDestType, TAllocType> &outString)
+ {
+ return ConvertUTF((const TWCharEASTLConverter::TCharType *)inSrc, inSrcLen, outString);
+ }
+
+#endif
+}
+}
+
+#endif
diff --git a/src/foundation/StringConversion.h b/src/foundation/StringConversion.h
new file mode 100644
index 0000000..a55ebb3
--- /dev/null
+++ b/src/foundation/StringConversion.h
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_STRING_CONVERSION_H
+#define QT3DS_FOUNDATION_STRING_CONVERSION_H
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Utils.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ // Template base class so that we can convert items to and from char* and wchar_t*
+ // representations
+ template <typename TDataType>
+ struct StringConversion
+ {
+ bool force_compile_error;
+ };
+
+ // Write the char8_t but exlude the null terminator
+ // Meant to write data model values.
+ // Memory buffer contains a non-null-terminated
+ // char8_t string
+ struct Char8TWriter
+ {
+ MemoryBuffer<ForwardingAllocator> &m_Buffer;
+ Char8TWriter(MemoryBuffer<ForwardingAllocator> &buf)
+ : m_Buffer(buf)
+ {
+ }
+ void Write(const char8_t *value, QT3DSU32 len = 0)
+ {
+ if (isTrivial(value))
+ return;
+ if (len == 0)
+ len = (QT3DSU32)StrLen(value);
+ m_Buffer.write(value, len);
+ }
+ void Write(char8_t value) { m_Buffer.write(value); }
+ void Write(bool value) { Write(value ? "True" : "False"); }
+
+ // Takes care of long and float
+ template <typename TDataType>
+ void Write(TDataType value)
+ {
+ char8_t buf[256];
+ QT3DSU32 numWritten =
+ StringConversion<TDataType>().ToStr(value, NVDataRef<char8_t>(buf, 256));
+ if (numWritten)
+ Write((const char8_t *)buf);
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ template <typename TDataType>
+ void Write(NVConstDataRef<TDataType> values, QT3DSU32 grouping = 6, QT3DSU32 tabCount = 0)
+ {
+ for (QT3DSU32 idx = 0; idx < values.size(); ++idx) {
+ if (idx) {
+ if ((idx % grouping) == 0) {
+ Write((char8_t)'\n');
+ for (QT3DSU32 tabIdx = 0; tabIdx < tabCount; ++tabIdx)
+ Write((char8_t)'\t');
+ } else
+ Write((char8_t)' ');
+ }
+ Write(values[idx]);
+ }
+ }
+
+ void Write(NVConstDataRef<char8_t> values, QT3DSU32 ignored = 6)
+ {
+ (void)ignored;
+ if (values.size() && values[0] != 0) {
+ QT3DSU32 lastItem = values.size() - 1;
+ if (values[lastItem] == 0)
+ --lastItem;
+ Write(values.begin(), lastItem + 1);
+ }
+ }
+ };
+
+ inline bool IsWhite(char8_t value)
+ {
+ return value == '\n' || value == '\r' || value == ' ' || value == '\t';
+ }
+
+ // skip until we find whitespace.
+ inline char8_t *FindNextWhitespace(char8_t *input)
+ {
+ if (input == NULL)
+ return input;
+ char8_t *marker = input;
+ // Empty loop intentional
+ for (; *marker && !IsWhite(*marker); ++marker)
+ ;
+ return marker;
+ }
+
+ // skip until we find something that isn't whitespace.
+ inline char8_t *FindNextNonWhitespace(char8_t *input)
+ {
+ if (input == NULL)
+ return input;
+ char8_t *marker = input;
+ // Empty loop intentional
+ for (; *marker && IsWhite(*marker); ++marker)
+ ;
+ return marker;
+ }
+
+ // Reading is destructive in the case of floating point lists, so we may
+ // destroy the incoming string.
+ // We are assuming the string is null-terminated at end ptr.
+ struct Char8TReader
+ {
+ char8_t *m_StartPtr;
+ // Buffer used for temp storage
+ MemoryBuffer<ForwardingAllocator> &m_Buffer;
+ Char8TReader(char8_t *sp, MemoryBuffer<ForwardingAllocator> &buf)
+ : m_StartPtr(sp)
+ , m_Buffer(buf)
+ {
+ }
+ void Read(const char8_t *&outPtr) { outPtr = m_StartPtr; }
+
+ template <typename TDataType>
+ void Read(TDataType &data)
+ {
+ bool success = StringConversion<TDataType>().StrTo(m_StartPtr, data);
+ QT3DS_ASSERT(success);
+ (void)success;
+ }
+ // Destructive operation because we can't trust
+ // strtod to do the right thing. On windows, for long strings,
+ // it calls strlen every operation thus leading to basically N^2
+ // behavior
+ template <typename TDataType>
+ void ReadRef(NVDataRef<TDataType> data)
+ {
+ QT3DSU32 idx = 0;
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr);
+ for (; idx < data.size() && m_StartPtr && *m_StartPtr; ++idx) {
+ char8_t *nextPtr = FindNextWhitespace(m_StartPtr);
+ if (nextPtr && *nextPtr)
+ *nextPtr = 0;
+ else
+ nextPtr = NULL;
+ StringConversion<TDataType>().StrTo(m_StartPtr, data[idx]);
+ m_StartPtr = nextPtr;
+ if (m_StartPtr)
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr + 1);
+ }
+ QT3DS_ASSERT(idx == data.size());
+ }
+
+ void ReadBuffer(NVConstDataRef<char8_t> &outBuffer)
+ {
+ if (m_StartPtr && *m_StartPtr) {
+ QT3DSU32 len = (QT3DSU32)strlen(m_StartPtr);
+ outBuffer = NVConstDataRef<char8_t>(m_StartPtr, len + 1);
+ }
+ }
+
+ // Destructive operation because we can't trust
+ // strtod to do the right thing. On windows, for long strings,
+ // it calls strlen every operation thus leading to basically N^2
+ // behavior
+ template <typename TDataType>
+ void ReadBuffer(NVConstDataRef<TDataType> &outBuffer)
+ {
+ m_Buffer.clear();
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr);
+ while (m_StartPtr && *m_StartPtr) {
+ char8_t *nextPtr = FindNextWhitespace(m_StartPtr);
+ if (nextPtr && *nextPtr)
+ *nextPtr = 0;
+ else
+ nextPtr = NULL;
+ TDataType temp;
+ StringConversion<TDataType>().StrTo(m_StartPtr, temp);
+ m_Buffer.write(temp);
+ m_StartPtr = nextPtr;
+ if (m_StartPtr)
+ m_StartPtr = FindNextNonWhitespace(m_StartPtr + 1);
+ }
+ QT3DSU32 numItems = m_Buffer.size() / sizeof(TDataType);
+ if (numItems)
+ outBuffer = NVConstDataRef<TDataType>((TDataType *)m_Buffer.begin(), numItems);
+ else
+ outBuffer = NVConstDataRef<TDataType>();
+ }
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/foundation/StringConversionImpl.h b/src/foundation/StringConversionImpl.h
new file mode 100644
index 0000000..c5063e6
--- /dev/null
+++ b/src/foundation/StringConversionImpl.h
@@ -0,0 +1,219 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_STRING_CONVERSION_IMPL_H
+#define QT3DS_FOUNDATION_STRING_CONVERSION_IMPL_H
+#include "foundation/StringConversion.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "EABase/eabase.h"
+#include "foundation/StringTable.h"
+#include "foundation/Utils.h"
+#include "stdlib.h"
+#include "stdio.h" //snprintf
+#include <QLocale>
+
+#if !defined EA_PLATFORM_WINDOWS
+#define _snprintf snprintf
+#endif
+
+namespace qt3ds {
+namespace foundation {
+
+ template <>
+ struct StringConversion<bool>
+ {
+ QT3DSU32 ToStr(bool item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(
+ _snprintf(buffer.begin(), buffer.size(), "%s", item ? "True" : "False"));
+ }
+ bool StrTo(const char8_t *buffer, bool &item)
+ {
+ if (AreEqualCaseless(buffer, "True"))
+ item = true;
+ else
+ item = false;
+ return true;
+ }
+ };
+
+ template <>
+ struct StringConversion<QT3DSU8>
+ {
+ QT3DSU32 ToStr(QT3DSU8 item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(
+ _snprintf(buffer.begin(), buffer.size(), "%hu", static_cast<QT3DSU16>(item)));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSU8 &item)
+ {
+ item = static_cast<QT3DSU8>(strtoul(buffer, NULL, 10));
+ return true;
+ }
+ };
+ template <>
+ struct StringConversion<QT3DSI8>
+ {
+ QT3DSU32 ToStr(QT3DSI8 item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(
+ _snprintf(buffer.begin(), buffer.size(), "%hd", static_cast<QT3DSI16>(item)));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSI8 &item)
+ {
+ item = static_cast<QT3DSI8>(strtol(buffer, NULL, 10));
+ return true;
+ }
+ };
+ template <>
+ struct StringConversion<QT3DSU16>
+ {
+ QT3DSU32 ToStr(QT3DSU16 item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%hu", item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSU16 &item)
+ {
+ item = static_cast<QT3DSU16>(strtoul(buffer, NULL, 10));
+ return true;
+ }
+ };
+ template <>
+ struct StringConversion<QT3DSI16>
+ {
+ QT3DSU32 ToStr(QT3DSI16 item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%hd", item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSI16 &item)
+ {
+ item = static_cast<QT3DSI16>(strtol(buffer, NULL, 10));
+ return true;
+ }
+ };
+
+ template <>
+ struct StringConversion<QT3DSU32>
+ {
+ QT3DSU32 ToStr(QT3DSU32 item, NVDataRef<char8_t> buffer)
+ {
+ // hope the buffer is big enough...
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%u", item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSU32 &item)
+ {
+ item = strtoul(buffer, NULL, 10);
+ return true;
+ }
+ };
+ template <>
+ struct StringConversion<QT3DSI32>
+ {
+ QT3DSU32 ToStr(QT3DSI32 item, NVDataRef<char8_t> buffer)
+ {
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%d", (int)item));
+ }
+ bool StrTo(const char8_t *buffer, QT3DSI32 &item)
+ {
+ item = strtol(buffer, NULL, 10);
+ return true;
+ }
+ };
+ template <>
+ struct StringConversion<QT3DSU64>
+ {
+ QT3DSU32 ToStr(QT3DSU64 item, NVDataRef<char8_t> buffer)
+ {
+#ifdef _WIN32
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%I64u", item));
+#else
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%lu", item));
+#endif
+ }
+ bool StrTo(const char8_t *buffer, QT3DSU64 &item)
+ {
+ item = strtoul(buffer, NULL, 10);
+ return true;
+ }
+ };
+ template <>
+ struct StringConversion<QT3DSI64>
+ {
+ QT3DSU32 ToStr(QT3DSI64 item, NVDataRef<char8_t> buffer)
+ {
+#ifdef _WIN32
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%I64d", item));
+#else
+ return static_cast<QT3DSU32>(_snprintf(buffer.begin(), buffer.size(), "%ld", item));
+#endif
+ }
+ bool StrTo(const char8_t *buffer, QT3DSI64 &item)
+ {
+ item = strtol(buffer, NULL, 10);
+ return true;
+ }
+ };
+ template <>
+ struct StringConversion<QT3DSF32>
+ {
+ QT3DSU32 ToStr(QT3DSF32 item, NVDataRef<char8_t> buffer)
+ {
+ QString s = QLocale::c().toString(item);
+ strncpy(buffer.begin(), s.toStdString().c_str(), buffer.size());
+ return s.length();
+ }
+ bool StrTo(const char8_t *buffer, QT3DSF32 &item)
+ {
+ bool ok;
+ item = QLocale::c().toFloat(buffer, &ok);
+ return ok;
+ }
+ };
+
+ template <>
+ struct StringConversion<QT3DSF64>
+ {
+ QT3DSU32 ToStr(QT3DSF64 item, NVDataRef<char8_t> buffer)
+ {
+ QString s = QLocale::c().toString(item);
+ strncpy(buffer.begin(), s.toStdString().c_str(), buffer.size());
+ return s.length();
+ }
+ bool StrTo(const char8_t *buffer, QT3DSF64 &item)
+ {
+ bool ok;
+ item = QLocale::c().toDouble(buffer, &ok);
+ return ok;
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/foundation/StringTable.cpp b/src/foundation/StringTable.cpp
new file mode 100644
index 0000000..47130dc
--- /dev/null
+++ b/src/foundation/StringTable.cpp
@@ -0,0 +1,700 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Utils.h"
+#include "EASTL/string.h"
+#include "EASTL/sort.h"
+#include "foundation/StrConvertUTF.h"
+#include "foundation/PreAllocatedAllocator.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/Qt3DSMutex.h"
+
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace eastl;
+
+namespace eastl {
+struct SCharAndHash
+{
+ const char8_t *m_Data;
+ size_t m_Hash;
+ // Cache the generated hash code.
+ SCharAndHash(const char8_t *inData)
+ : m_Data(inData)
+ , m_Hash(eastl::hash<const char8_t *>()(inData))
+ {
+ }
+ SCharAndHash()
+ : m_Data(nullptr)
+ , m_Hash(0)
+ {
+ }
+ operator const char *() const { return m_Data; }
+};
+template <>
+struct hash<SCharAndHash>
+{
+ size_t operator()(const SCharAndHash &inItem) const { return inItem.m_Hash; }
+};
+
+template <>
+struct equal_to<SCharAndHash>
+{
+ bool operator()(const SCharAndHash &inLhs, const SCharAndHash &inRhs) const
+ {
+ return char_equal_to()(inLhs.m_Data, inRhs.m_Data);
+ }
+};
+}
+
+void CRegisteredString::Remap(const IStringTable &inTable)
+{
+ Remap(const_cast<IStringTable &>(inTable).GetRemapMap());
+}
+
+void CRegisteredString::Remap(const SStrRemapMap &inMap)
+{
+ if (IsValid()) {
+ SStrRemapMap::const_iterator theIter = inMap.find((char8_t *)m_String);
+ if (theIter != inMap.end())
+ m_String = reinterpret_cast<const char8_t *>(theIter->second);
+ else {
+ QT3DS_ASSERT(false);
+ // Ensure a failure here doesn't *guarantee* a crash somewhere else.
+ m_String = nullptr;
+ }
+ } else {
+ // Indicates an invalid string.
+ m_String = reinterpret_cast<const char8_t *>(QT3DS_MAX_U32);
+ }
+}
+
+void CRegisteredString::Remap(NVDataRef<QT3DSU8> inDataPtr)
+{
+ size_t theOffset = reinterpret_cast<size_t>(m_String);
+ if (theOffset >= QT3DS_MAX_U32)
+ m_String = "";
+ else {
+ if (theOffset < inDataPtr.size())
+ m_String = reinterpret_cast<char8_t *>(inDataPtr.begin() + theOffset);
+ else {
+ QT3DS_ASSERT(false);
+ m_String = "";
+ }
+ }
+}
+
+namespace {
+
+const char16_t g_char16EmptyStr[] = { 0, 0, 0, 0 };
+const char32_t g_char32EmptyStr[] = { 0, 0, 0, 0 };
+
+typedef eastl::basic_string<char8_t, ForwardingAllocator> TNarrowStr;
+typedef eastl::basic_string<TWCharEASTLConverter::TCharType, ForwardingAllocator> TWideStr;
+
+inline bool isTrivialWide(const wchar_t *str)
+{
+ return str == nullptr || *str == 0;
+}
+
+QT3DSU8 *AlignPointer(QT3DSU8 *inStart, QT3DSU8 *inPtr)
+{
+ QT3DSU32 alignment = sizeof(void *);
+ size_t numBytes = (size_t)(inPtr - inStart);
+ QT3DS_ASSERT(inStart < inPtr);
+ if (numBytes % alignment)
+ inPtr += alignment - (numBytes % alignment);
+ return inPtr;
+}
+
+QT3DSU32 Align(QT3DSU32 inValue)
+{
+ QT3DSU32 alignment = sizeof(void *);
+ QT3DSU32 leftover = inValue % alignment;
+ if (leftover)
+ inValue += alignment - leftover;
+ return inValue;
+}
+
+// Structure that is written out to the file.
+// Directly after this is the string character data.
+// TWideStr& inConvertStr
+struct SStringFileData
+{
+ QT3DSU32 m_StartOffset;
+ QT3DSU32 m_StrLen;
+ QT3DSU32 m_Handle;
+ char8_t *m_Str;
+ SStringFileData(QT3DSU32 len, QT3DSU32 off, QT3DSU32 handle, char8_t *data)
+ : m_StartOffset(off)
+ , m_StrLen(len)
+ , m_Handle(handle)
+ , m_Str(data)
+ {
+ }
+ SStringFileData()
+ : m_StartOffset(0)
+ , m_StrLen(0)
+ , m_Handle(0)
+ , m_Str(nullptr)
+ {
+ }
+ void Deallocate(NVAllocatorCallback &inAlloc)
+ {
+ inAlloc.deallocate(m_Str);
+ m_Str = nullptr;
+ }
+ const char8_t *GetNarrow() { return m_Str; }
+ operator CRegisteredString() const
+ {
+ return CRegisteredString::ISwearThisHasBeenRegistered(m_Str);
+ }
+ QT3DSU32 EndOffset() const { return m_StartOffset + m_StrLen; }
+
+ // Used only for the lower bound operation to find a given object by offset.
+ bool operator<(const SStringFileData &inOther) const
+ {
+ return m_StartOffset < inOther.m_StartOffset;
+ }
+};
+
+struct SCharAndHandle
+{
+ const char8_t *m_Data;
+ QT3DSU32 m_Handle;
+ SCharAndHandle()
+ : m_Data(nullptr)
+ , m_Handle(0)
+ {
+ }
+ SCharAndHandle(const char8_t *data, QT3DSU32 hdl)
+ : m_Data(data)
+ , m_Handle(hdl)
+ {
+ }
+ operator const char *() const { return m_Data; }
+};
+
+struct SStringFileHeader
+{
+ QT3DSU32 m_NumStrings;
+ QT3DSU32 m_NextHandleValue;
+ // offset to the items of fixed size. Variable sized data is stored
+ // up front.
+ QT3DSU32 m_FixedBufferOffset;
+ SStringFileHeader()
+ : m_NumStrings(0)
+ , m_NextHandleValue(0)
+ , m_FixedBufferOffset(0)
+ {
+ }
+
+ SStringFileHeader(QT3DSU32 ns, QT3DSU32 hv, QT3DSU32 fbo)
+ : m_NumStrings(ns)
+ , m_NextHandleValue(hv)
+ , m_FixedBufferOffset(fbo)
+ {
+ }
+};
+
+// This is the core of the string table.
+struct SStringFileDataList
+{
+ typedef nvhash_map<SCharAndHash, SCharAndHandle> TMapType;
+ typedef nvhash_map<QT3DSU32, const char8_t *> THandleMapType;
+
+ mutable SPreAllocatedAllocator m_Allocator;
+
+ // When we load from a file, we get a these items
+ NVConstDataRef<SStringFileData> m_DataBlock;
+ NVConstDataRef<eastl::pair<size_t, QT3DSU32>> m_HashDataBlockOffset;
+ NVConstDataRef<eastl::pair<QT3DSU32, QT3DSU32>> m_HandleDataBlockOffset;
+
+ // When we are running normally, this items get mangled
+ nvvector<SStringFileData> m_AppendedStrings;
+
+protected:
+ // Built roughly on demand
+ SStrRemapMap m_StrRemapMap;
+ TMapType m_HashToStrMap;
+ THandleMapType m_HandleToStrMap;
+ QT3DSU32 m_NextHandleValue;
+
+public:
+ SStringFileDataList(NVAllocatorCallback &inAlloc)
+ : m_Allocator(inAlloc)
+ , m_AppendedStrings(inAlloc, "StringTable::m_AppendedStrings")
+ , m_StrRemapMap(inAlloc, "StringTable::m_StrRemapMap")
+ , m_HashToStrMap(inAlloc, "StringTable::m_HashToStrMap")
+ , m_HandleToStrMap(inAlloc, "StringTable::m_HashToStrMap")
+ , m_NextHandleValue(1)
+ {
+ }
+ ~SStringFileDataList()
+ {
+ for (QT3DSU32 idx = 0, end = m_AppendedStrings.size(); idx < end; ++idx)
+ m_AppendedStrings[idx].Deallocate(m_Allocator);
+ }
+
+ SStrRemapMap &GetRemapMap()
+ {
+ if (m_StrRemapMap.empty()) {
+ for (QT3DSU32 idx = 0, end = m_DataBlock.size(); idx < end; ++idx)
+ m_StrRemapMap.insert(
+ eastl::make_pair(m_DataBlock[idx].m_Str, m_DataBlock[idx].m_StartOffset));
+ for (QT3DSU32 idx = 0, end = m_AppendedStrings.size(); idx < end; ++idx)
+ m_StrRemapMap.insert(eastl::make_pair(m_AppendedStrings[idx].m_Str,
+ m_AppendedStrings[idx].m_StartOffset));
+ }
+ return m_StrRemapMap;
+ }
+
+ struct SHashPairComparator
+ {
+ bool operator()(const eastl::pair<size_t, QT3DSU32> &lhs,
+ const eastl::pair<size_t, QT3DSU32> &rhs) const
+ {
+ return lhs.first < rhs.first;
+ }
+ };
+
+ struct SHandlePairComparator
+ {
+ bool operator()(const eastl::pair<QT3DSU32, QT3DSU32> &lhs,
+ const eastl::pair<QT3DSU32, QT3DSU32> &rhs) const
+ {
+ return lhs.first < rhs.first;
+ }
+ };
+
+ SCharAndHandle DoFindStr(SCharAndHash hashCode)
+ {
+ if (isTrivial(hashCode.m_Data))
+ return SCharAndHandle();
+ TMapType::iterator theFind = m_HashToStrMap.find(hashCode);
+ if (theFind == m_HashToStrMap.end()) {
+ SCharAndHandle newStr = FindStrByHash(hashCode);
+ if (!newStr.m_Data)
+ newStr = Append(hashCode);
+
+ // It may not be obvious why we have to reset the data member.
+ // we have to do this so the hashtable keys don't change if the user isn't
+ // passing in a persistent string.
+ hashCode.m_Data = newStr;
+
+ theFind = m_HashToStrMap.insert(eastl::make_pair(hashCode, newStr)).first;
+ m_HandleToStrMap.insert(eastl::make_pair(theFind->second.m_Handle, newStr));
+ }
+ return theFind->second;
+ }
+
+ const CRegisteredString FindStr(SCharAndHash hashCode)
+ {
+ SCharAndHandle result = DoFindStr(hashCode);
+ if (result.m_Data)
+ return CRegisteredString::ISwearThisHasBeenRegistered(result.m_Data);
+ return CRegisteredString();
+ }
+
+ const CStringHandle FindStrHandle(SCharAndHash hashCode)
+ {
+ SCharAndHandle result = DoFindStr(hashCode);
+ return CStringHandle::ISwearThisHasBeenRegistered(result.m_Handle);
+ }
+
+ const CRegisteredString FindStrByHandle(QT3DSU32 handle)
+ {
+ if (handle == 0)
+ return CRegisteredString();
+
+ THandleMapType::iterator theFind = m_HandleToStrMap.find(handle);
+ if (theFind == m_HandleToStrMap.end()) {
+ const char8_t *newStr = FindStrByHandleData(handle);
+ if (!newStr)
+ return CRegisteredString();
+ theFind = m_HandleToStrMap.insert(eastl::make_pair(handle, newStr)).first;
+ }
+ return CRegisteredString::ISwearThisHasBeenRegistered(theFind->second);
+ }
+
+ void Save(SWriteBuffer &ioBuffer) const
+ {
+ // Buffer should be aligned before we get to it.
+ QT3DS_ASSERT(ioBuffer.size() % 4 == 0);
+
+ QT3DSU32 numStrs = Size();
+ size_t bufferBegin = ioBuffer.size();
+ SStringFileHeader theHeader;
+ ioBuffer.write(theHeader);
+ QT3DSU32 startOffset = ioBuffer.size();
+
+ eastl::vector<eastl::pair<size_t, QT3DSU32>> hashToStringIndex;
+ eastl::vector<eastl::pair<QT3DSU32, QT3DSU32>> handleToStringIndex;
+ hashToStringIndex.reserve(numStrs);
+ handleToStringIndex.reserve(numStrs);
+ WriteStringBlockData(m_DataBlock.begin(), m_DataBlock.end(), ioBuffer, hashToStringIndex,
+ handleToStringIndex);
+ WriteStringBlockData(m_AppendedStrings.data(),
+ m_AppendedStrings.data() + m_AppendedStrings.size(), ioBuffer,
+ hashToStringIndex, handleToStringIndex);
+ ioBuffer.align(4);
+
+ QT3DSU32 fixedOffset = ioBuffer.size() - startOffset;
+ WriteStringBlock(m_DataBlock.begin(), m_DataBlock.end(), ioBuffer);
+ WriteStringBlock(m_AppendedStrings.data(),
+ m_AppendedStrings.data() + m_AppendedStrings.size(), ioBuffer);
+
+ // sort by hash code so we can do binary lookups later.
+ eastl::sort(hashToStringIndex.begin(), hashToStringIndex.end(), SHashPairComparator());
+ ioBuffer.write(hashToStringIndex.data(), (QT3DSU32)hashToStringIndex.size());
+
+ eastl::sort(handleToStringIndex.begin(), handleToStringIndex.end(),
+ SHandlePairComparator());
+ ioBuffer.write(handleToStringIndex.data(), (QT3DSU32)handleToStringIndex.size());
+
+ SStringFileHeader *fixedOffsetPtr =
+ reinterpret_cast<SStringFileHeader *>(ioBuffer.begin() + bufferBegin);
+ *fixedOffsetPtr = SStringFileHeader(numStrs, m_NextHandleValue, fixedOffset);
+ }
+
+ void Load(NVDataRef<QT3DSU8> inMemory)
+ {
+ QT3DS_ASSERT(m_AppendedStrings.empty());
+ m_Allocator.m_PreAllocatedBlock = inMemory;
+ m_Allocator.m_OwnsMemory = false;
+ SDataReader theReader(inMemory.begin(), inMemory.end());
+ SStringFileHeader theHeader = theReader.LoadRef<SStringFileHeader>();
+ QT3DSU32 numStrs = theHeader.m_NumStrings;
+ m_NextHandleValue = theHeader.m_NextHandleValue;
+ QT3DSU32 fixedOffset = theHeader.m_FixedBufferOffset;
+ theReader.m_CurrentPtr += fixedOffset;
+ m_DataBlock = NVConstDataRef<SStringFileData>(
+ reinterpret_cast<const SStringFileData *>(theReader.m_CurrentPtr), numStrs);
+ theReader.m_CurrentPtr += sizeof(SStringFileData) * numStrs;
+
+ m_HashDataBlockOffset = NVConstDataRef<eastl::pair<size_t, QT3DSU32>>(
+ reinterpret_cast<const eastl::pair<size_t, QT3DSU32> *>(theReader.m_CurrentPtr), numStrs);
+ theReader.m_CurrentPtr += sizeof(eastl::pair<size_t, QT3DSU32>) * numStrs;
+
+ m_HandleDataBlockOffset = NVConstDataRef<eastl::pair<QT3DSU32, QT3DSU32>>(
+ reinterpret_cast<const eastl::pair<QT3DSU32, QT3DSU32> *>(theReader.m_CurrentPtr), numStrs);
+
+ for (QT3DSU32 idx = 0, end = m_DataBlock.size(); idx < end; ++idx) {
+ SStringFileData &theData = const_cast<SStringFileData &>(m_DataBlock[idx]);
+ theData.m_Str = reinterpret_cast<char8_t *>(inMemory.mData + theData.m_StartOffset);
+ }
+ }
+
+protected:
+ // When we load from a file, we do not put every string into the hash because building
+ // hashtables takes
+ // time. We only put them into the hash on demand; this avoids building a giant hashtable upon
+ // load.
+ // and since in general we do not need to lookup all hash values again it avoids building the
+ // hashtable
+ // in general.
+ SCharAndHandle FindStrByHash(SCharAndHash hashCode) const
+ {
+ const eastl::pair<size_t, QT3DSU32> *iter =
+ eastl::lower_bound(m_HashDataBlockOffset.begin(), m_HashDataBlockOffset.end(),
+ eastl::make_pair(hashCode.m_Hash, (QT3DSU32)0), SHashPairComparator());
+
+ for (; iter != m_HashDataBlockOffset.end() && iter->first == hashCode.m_Hash; ++iter) {
+ if (AreEqual(m_DataBlock[iter->second].m_Str, hashCode.m_Data))
+ return SCharAndHandle(m_DataBlock[iter->second].m_Str,
+ m_DataBlock[iter->second].m_Handle);
+ }
+ return SCharAndHandle();
+ }
+
+ const char8_t *FindStrByHandleData(QT3DSU32 handle) const
+ {
+ const eastl::pair<QT3DSU32, QT3DSU32> *iter =
+ eastl::lower_bound(m_HandleDataBlockOffset.begin(), m_HandleDataBlockOffset.end(),
+ eastl::make_pair(handle, (QT3DSU32)0), SHandlePairComparator());
+
+ if (iter != m_HandleDataBlockOffset.end() && iter->first == handle
+ && m_DataBlock[iter->second].m_Handle == handle)
+ return m_DataBlock[iter->second].m_Str;
+ return nullptr;
+ }
+
+ void WriteStringBlockData(const SStringFileData *begin, const SStringFileData *end,
+ SWriteBuffer &ioBuffer,
+ eastl::vector<eastl::pair<size_t, QT3DSU32>> &ioHashToStringIndex,
+ eastl::vector<eastl::pair<QT3DSU32, QT3DSU32>> &ioHandleToStringIndex) const
+ {
+ for (const SStringFileData *iter = begin; iter != end; ++iter) {
+ size_t idx = ioHashToStringIndex.size();
+ SCharAndHash theHash(iter->m_Str);
+ ioHashToStringIndex.push_back(eastl::make_pair(theHash.m_Hash, (QT3DSU32)idx));
+ ioHandleToStringIndex.push_back(eastl::make_pair(iter->m_Handle, (QT3DSU32)idx));
+ ioBuffer.write(iter->m_Str, iter->m_StrLen);
+ }
+ }
+
+ void WriteStringBlock(const SStringFileData *begin, const SStringFileData *end,
+ SWriteBuffer &ioBuffer) const
+ {
+ for (const SStringFileData *iter = begin; iter != end; ++iter)
+ ioBuffer.write(*iter);
+ }
+
+ SCharAndHandle Append(SCharAndHash inStrHash)
+ {
+ if (isTrivial(inStrHash.m_Data))
+ return SCharAndHandle();
+
+ const char8_t *inStr(inStrHash.m_Data);
+ QT3DSU32 len = (QT3DSU32)strlen(inStr) + 1;
+ char8_t *newStr = (char8_t *)m_Allocator.allocate(len, "StringData", __FILE__, __LINE__);
+ memCopy(newStr, inStr, len);
+
+ // We write the number of strings to the file just after the header.
+ QT3DSU32 theOffset = sizeof(SStringFileHeader);
+ if (Size())
+ theOffset = Back().EndOffset();
+
+ QT3DSU32 handleValue = m_NextHandleValue;
+ ++m_NextHandleValue;
+ m_AppendedStrings.push_back(SStringFileData(len, theOffset, handleValue, newStr));
+
+ // Only add to the str map if necessary because building it could be expensive.
+ if (m_StrRemapMap.empty() == false)
+ m_StrRemapMap.insert(eastl::make_pair(newStr, theOffset));
+
+ return SCharAndHandle(newStr, handleValue);
+ }
+ // precondition is that size != 0
+ const SStringFileData &Back() const
+ {
+ QT3DS_ASSERT(Size());
+
+ if (m_AppendedStrings.size()) {
+ return m_AppendedStrings.back();
+ } else {
+ return m_DataBlock[m_DataBlock.size() - 1];
+ }
+ }
+
+ QT3DSU32 Size() const { return static_cast<QT3DSU32>(m_AppendedStrings.size() + m_DataBlock.size()); }
+};
+
+struct SStringTableMutexScope
+{
+ Mutex *m_Mutex;
+ SStringTableMutexScope(Mutex *inM)
+ : m_Mutex(inM)
+ {
+ if (m_Mutex)
+ m_Mutex->lock();
+ }
+ ~SStringTableMutexScope()
+ {
+ if (m_Mutex)
+ m_Mutex->unlock();
+ }
+};
+
+#define STRING_TABLE_MULTITHREADED_METHOD SStringTableMutexScope __locker(m_MultithreadMutex)
+
+class StringTable : public IStringTable
+{
+ typedef nvhash_map<SCharAndHash, QT3DSU32> TMapType;
+ typedef nvhash_map<CRegisteredString, TWideStr> TNarrowToWideMapType;
+ SStringFileDataList m_FileData;
+ NVAllocatorCallback &m_Allocator;
+ TNarrowToWideMapType m_StrWideMap;
+ volatile QT3DSI32 mRefCount; // fnd's naming convention
+ eastl::basic_string<char8_t, ForwardingAllocator> m_ConvertBuffer;
+ TWideStr m_WideConvertBuffer;
+ Mutex m_MultithreadMutexBacker;
+ Mutex *m_MultithreadMutex;
+ // Data that will be written out to the file.
+
+public:
+ StringTable(NVAllocatorCallback &alloc)
+ : m_FileData(alloc)
+ , m_Allocator(m_FileData.m_Allocator)
+ , m_StrWideMap(alloc, "StringTable::m_StrWideMap")
+ , mRefCount(0)
+ , m_ConvertBuffer(ForwardingAllocator(alloc, "StringTable::m_ConvertBuffer"))
+ , m_WideConvertBuffer(ForwardingAllocator(alloc, "StringTable::m_WideConvertBuffer"))
+ , m_MultithreadMutexBacker(alloc)
+ , m_MultithreadMutex(nullptr)
+ {
+ }
+
+ virtual ~StringTable() override {}
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_FileData.m_Allocator.m_Allocator)
+
+ void EnableMultithreadedAccess() override
+ {
+ m_MultithreadMutex = &m_MultithreadMutexBacker;
+ }
+
+ void DisableMultithreadedAccess() override
+ {
+ m_MultithreadMutex = nullptr;
+ }
+
+ CRegisteredString RegisterStr(const QString &str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ if (str.isEmpty())
+ return CRegisteredString();
+ return RegisterStr(str.toUtf8());
+ }
+
+ CRegisteredString RegisterStr(const QByteArray &str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ if (str.isEmpty())
+ return CRegisteredString();
+ return RegisterStr(str.constData());
+ }
+
+ CRegisteredString RegisterStr(const eastl::string &string) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ return RegisterStr(string.c_str());
+ }
+
+ CRegisteredString RegisterStr(Qt3DSBCharPtr str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ if (isTrivial(str))
+ return CRegisteredString();
+ return m_FileData.FindStr(str);
+ }
+
+ // utf-16->utf-8
+ CRegisteredString RegisterStr(const char16_t *str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ qt3ds::foundation::ConvertUTF(str, 0, m_ConvertBuffer);
+ return RegisterStr(m_ConvertBuffer.c_str());
+ }
+ // utf-32->utf-8
+ CRegisteredString RegisterStr(const char32_t *str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ qt3ds::foundation::ConvertUTF(str, 0, m_ConvertBuffer);
+ return RegisterStr(m_ConvertBuffer.c_str());
+ }
+
+ CRegisteredString RegisterStr(const wchar_t *str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ if (isTrivialWide(str))
+ return CRegisteredString();
+ qt3ds::foundation::ConvertUTF(
+ reinterpret_cast<const TWCharEASTLConverter::TCharType *>(str), 0,
+ m_ConvertBuffer);
+ return RegisterStr(m_ConvertBuffer.c_str());
+ }
+
+ CStringHandle GetHandle(Qt3DSBCharPtr str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ return m_FileData.FindStrHandle(str);
+ }
+
+ CRegisteredString HandleToStr(QT3DSU32 strHandle) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ return m_FileData.FindStrByHandle(strHandle);
+ }
+
+ const wchar_t *GetWideStr(CRegisteredString theStr)
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ eastl::pair<TNarrowToWideMapType::iterator, bool> pair_iter = m_StrWideMap.insert(
+ eastl::make_pair(theStr, TWideStr(ForwardingAllocator(m_Allocator, "WideString"))));
+ if (pair_iter.second)
+ qt3ds::foundation::ConvertUTF(theStr.c_str(), 0, pair_iter.first->second);
+ return reinterpret_cast<const wchar_t *>(pair_iter.first->second.c_str());
+ }
+
+ const wchar_t *GetWideStr(Qt3DSBCharPtr src) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ if (isTrivial(src))
+ return L"";
+ return GetWideStr(RegisterStr(src));
+ }
+
+ const wchar_t *GetWideStr(const wchar_t *str) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ if (isTrivialWide(str))
+ return L"";
+ qt3ds::foundation::ConvertUTF(
+ reinterpret_cast<const TWCharEASTLConverter::TCharType *>(str), 0,
+ m_ConvertBuffer);
+ return GetWideStr(RegisterStr(m_ConvertBuffer.c_str()));
+ }
+
+ const SStrRemapMap &GetRemapMap() override { return m_FileData.GetRemapMap(); }
+
+ NVAllocatorCallback &GetAllocator() override { return m_FileData.m_Allocator.m_Allocator; }
+
+ // Save to a block of memory. It is up the callers to deallocate using allocator
+ // from GetAllocator(). Returns a remap map that takes existing strings and changes their
+ // address such that they are offsets into the block of memory where this object
+ // started saving. Returns a map that converts registered strings into offsets of the
+ // written buffer.
+ void Save(SWriteBuffer &ioBuffer) const override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ m_FileData.Save(ioBuffer);
+ }
+
+ // Load all the strings from inMemory. inMemory is not freed by this object
+ // Finally, you will need to take inMemory and call remap on all strings
+ // from offsets back into their correct address into inMemory.
+ void Load(qt3ds::foundation::NVDataRef<QT3DSU8> inMemory) override
+ {
+ STRING_TABLE_MULTITHREADED_METHOD;
+ m_FileData.Load(inMemory);
+ }
+};
+}
+
+const char16_t *char16EmptyStr = g_char16EmptyStr;
+const char32_t *char32EmptyStr = g_char32EmptyStr;
+
+IStringTable &IStringTable::CreateStringTable(NVAllocatorCallback &alloc)
+{
+ return *QT3DS_NEW(alloc, StringTable)(alloc);
+}
diff --git a/src/foundation/StringTable.h b/src/foundation/StringTable.h
new file mode 100644
index 0000000..d46c111
--- /dev/null
+++ b/src/foundation/StringTable.h
@@ -0,0 +1,311 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_STRING_TABLE_H
+#define QT3DS_RENDER_STRING_TABLE_H
+
+#if defined(_WIN32) || defined(__QNXNTO__)
+#include <wchar.h>
+#ifndef WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T
+#define WIDE_IS_DIFFERENT_TYPE_THAN_CHAR16_T
+#endif
+#endif
+
+#include <QtCore/qstring.h>
+#include <QtCore/qbytearray.h>
+
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "EASTL/string.h"
+#include "EASTL/functional.h"
+#include "EABase/eabase.h" //char16_t definition
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSOption.h"
+
+#include <QtCore/qstring.h>
+#include <QtCore/qhashfunctions.h>
+
+namespace qt3ds {
+namespace foundation {
+ typedef char8_t Qt3DSBChar;
+ typedef const char8_t *Qt3DSBCharPtr;
+ class IStringTable;
+
+ // Serialization types, NVRenderSerializationTypes.h
+ struct SStrRemapMap;
+ struct SWriteBuffer;
+
+ class CRegisteredString;
+
+ // Discriminated union of either data ref or str table
+ // used so clients can test serialization without actually saving
+ // the string table out and rebooting the entire system.
+ class CStrTableOrDataRef
+ {
+ Option<NVDataRef<QT3DSU8>> m_DataRef;
+ IStringTable *m_StrTable;
+
+ public:
+ CStrTableOrDataRef()
+ : m_StrTable(nullptr)
+ {
+ }
+ CStrTableOrDataRef(NVDataRef<QT3DSU8> inData)
+ : m_DataRef(inData)
+ {
+ }
+ CStrTableOrDataRef(IStringTable &inStrTable)
+ : m_StrTable(&inStrTable)
+ {
+ }
+ CStrTableOrDataRef(const CStrTableOrDataRef &inOther)
+ : m_DataRef(inOther.m_DataRef)
+ , m_StrTable(inOther.m_StrTable)
+ {
+ }
+ CStrTableOrDataRef &operator=(const CStrTableOrDataRef &inOther)
+ {
+ m_DataRef = inOther.m_DataRef;
+ m_StrTable = inOther.m_StrTable;
+ return *this;
+ }
+ bool HasStrTable() const { return m_StrTable != nullptr; }
+ bool HasDataRef() const { return m_DataRef.hasValue(); }
+ NVDataRef<QT3DSU8> GetDataRef() const { return *m_DataRef; }
+ IStringTable *GetStringTable() const
+ {
+ QT3DS_ASSERT(m_StrTable);
+ return m_StrTable;
+ }
+ };
+
+ // String that can only be constructed from strings in the string table.
+ // These strings are valid utf-8 strings
+ class CRegisteredString
+ {
+ Qt3DSBCharPtr m_String;
+
+ public:
+ CRegisteredString()
+ : m_String("")
+ {
+ }
+ CRegisteredString(const CRegisteredString &inOther)
+ : m_String(inOther.m_String)
+ {
+ }
+ CRegisteredString &operator=(const CRegisteredString &inOther)
+ {
+ m_String = inOther.m_String;
+ return *this;
+ }
+
+ bool operator==(const CRegisteredString &inStr) const { return m_String == inStr.m_String; }
+ // If you use this in a real map then you will get them sorted roughly by the correct
+ // order.
+ bool operator<(const char *inStr) const
+ {
+ // Ensure non-null strings to strcmp.
+ const char *myStr = m_String ? m_String : "";
+ inStr = inStr ? inStr : "";
+ int answer;
+ while (*myStr && *inStr) {
+ answer = *inStr - *myStr;
+ if (answer)
+ return answer < 0;
+ ++myStr;
+ ++inStr;
+ }
+ answer = *inStr - *myStr;
+ return answer < 0;
+ }
+ size_t hash() const { return eastl::hash<size_t>()(reinterpret_cast<size_t>(m_String)); }
+ operator Qt3DSBCharPtr() const { return c_str(); }
+ Qt3DSBCharPtr c_str() const { return m_String ? m_String : ""; }
+ bool IsValid() const { return m_String && *m_String; }
+
+ // If this string is in the map, changes it to the map value.
+ void Remap(const SStrRemapMap &inMap);
+
+ void Remap(const IStringTable &inTable);
+
+ // Using m_String as an offset, if possible remap into
+ // inDataPtr's block of memory
+ void Remap(NVDataRef<QT3DSU8> inDataPtr);
+
+ void Remap(const CStrTableOrDataRef &inRef)
+ {
+ if (inRef.HasDataRef())
+ Remap(inRef.GetDataRef());
+ else if (inRef.HasStrTable())
+ Remap(*inRef.GetStringTable());
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ static CRegisteredString ISwearThisHasBeenRegistered(Qt3DSBCharPtr str)
+ {
+ CRegisteredString retval;
+ retval.m_String = str;
+ return retval;
+ }
+ };
+
+ inline uint qHash(const CRegisteredString &rString)
+ {
+ // Note that we are intentionally hashing a pointer to the string rather than its content,
+ // as CRegisteredString strings reside in the string table, which guarantees two instances
+ // with same string point to same string table string.
+ return QT_PREPEND_NAMESPACE(qHash(rString.c_str()));
+ }
+
+ class IStringTable;
+
+ class CStringHandle
+ {
+ QT3DSU32 m_Data;
+
+ CStringHandle(QT3DSU32 hdl)
+ : m_Data(hdl)
+ {
+ }
+
+ public:
+ CStringHandle()
+ : m_Data(0)
+ {
+ }
+ CStringHandle(const CStringHandle &other)
+ : m_Data(other.m_Data)
+ {
+ }
+ CStringHandle &operator=(const CStringHandle &other)
+ {
+ m_Data = other.m_Data;
+ return *this;
+ }
+ bool IsValid() const { return m_Data != 0; }
+ QT3DSU32 handle() const { return m_Data; }
+ inline const char8_t *c_str(IStringTable &strTable) const;
+ operator QT3DSU32() const { return m_Data; }
+ static CStringHandle ISwearThisHasBeenRegistered(QT3DSU32 strHandle)
+ {
+ return CStringHandle(strHandle);
+ }
+ };
+
+ // String table stores strings in utf-8 format and does valid utf-16,utf-32 -> utf-8
+ // also converts utf8 -> either utf-32 or utf-16, depending on sizeof( wchar_t ) if
+ // requested.
+ // UICStrConvertUTF.h
+ // Also generates offsets that are consistent so clients can convert their strings
+ // to offsets during save and convert from offset to string during load regardless
+ // of if they load before or after this table.
+ class QT3DS_AUTOTEST_EXPORT IStringTable : public NVRefCounted
+ {
+ public:
+ // default state is for multithreaded access to be disabled.
+ // remember to implement in CNullStringManager in UICTestPresentation.hxx
+ virtual void EnableMultithreadedAccess() = 0;
+ virtual void DisableMultithreadedAccess() = 0;
+
+ virtual CRegisteredString RegisterStr(const QByteArray &str) = 0;
+ virtual CRegisteredString RegisterStr(const QString &str) = 0;
+ virtual CRegisteredString RegisterStr(const eastl::string &string) = 0;
+
+ virtual CRegisteredString RegisterStr(Qt3DSBCharPtr str) = 0;
+ // utf-16->utf-8
+ virtual CRegisteredString RegisterStr(const char16_t *str) = 0;
+ // utf-32->utf-8
+ virtual CRegisteredString RegisterStr(const char32_t *str) = 0;
+
+ virtual CStringHandle GetHandle(Qt3DSBCharPtr str) = 0;
+ virtual CRegisteredString HandleToStr(QT3DSU32 strHandle) = 0;
+
+ virtual CRegisteredString RegisterStr(const wchar_t *str) = 0;
+
+ virtual const wchar_t *GetWideStr(Qt3DSBCharPtr src) = 0;
+ virtual const wchar_t *GetWideStr(const wchar_t *str) = 0;
+
+ Qt3DSBCharPtr GetNarrowStr(const wchar_t *src) { return RegisterStr(src); }
+ Qt3DSBCharPtr GetNarrowStr(Qt3DSBCharPtr src) { return RegisterStr(src); }
+
+ // The string table maintains a map that will tell clients where their strings will be
+ // in terms of offsets into the data that the string table writes.
+ // This map will change each time a new string is added to the string table.
+ // Conversion from string -> data offset.
+ virtual const SStrRemapMap &GetRemapMap() = 0;
+
+ virtual NVAllocatorCallback &GetAllocator() = 0;
+
+ // Save to a block of memory. It is up the callers to deallocate using allocator
+ // from GetAllocator(). Returns a remap map that takes existing strings and changes their
+ // address such that they are offsets into the block of memory where this object
+ // started saving. Returns a map that converts registered strings into offsets of the
+ // written buffer.
+ virtual void Save(SWriteBuffer &ioBuffer) const = 0;
+
+ // Load all the strings from inMemory. inMemory is not freed by this object
+ // Finally, you will need to take inMemory and call remap on all strings
+ // from offsets back into their correct address into inMemory.
+ virtual void Load(qt3ds::foundation::NVDataRef<QT3DSU8> inMemory) = 0;
+
+ static IStringTable &CreateStringTable(NVAllocatorCallback &alloc);
+ };
+
+ inline const char8_t *CStringHandle::c_str(IStringTable &strTable) const
+ {
+ return strTable.HandleToStr(m_Data);
+ }
+}
+}
+
+// eastl extensions to allow easy hashtable creation using string table strings.
+namespace eastl {
+
+template <>
+struct hash<qt3ds::foundation::CRegisteredString>
+{
+ size_t operator()(const qt3ds::foundation::CRegisteredString &str) const { return str.hash(); }
+};
+
+template <>
+struct equal_to<qt3ds::foundation::CRegisteredString>
+{
+ bool operator()(const qt3ds::foundation::CRegisteredString &lhs,
+ const qt3ds::foundation::CRegisteredString &rhs) const
+ {
+ return lhs == rhs;
+ }
+};
+}
+
+#endif
diff --git a/src/foundation/StringTools.h b/src/foundation/StringTools.h
new file mode 100644
index 0000000..43324b4
--- /dev/null
+++ b/src/foundation/StringTools.h
@@ -0,0 +1,614 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_STRING_H
+#define QT3DS_RENDER_STRING_H
+#include <QtCore/qstring.h>
+#include <QtCore/qbytearray.h>
+#include <QtCore/qhash.h>
+#include <string>
+
+#include "Qt3DSRender.h"
+#include "EASTL/string.h"
+
+namespace qt3ds {
+namespace foundation {
+
+class Qt3DSStringUtils {
+public:
+ static inline QString ConvertUTFtoQString(const char16_t *string)
+ {
+ return QString::fromUtf16(string);
+ }
+
+ static inline QString ConvertUTFtoQString(const char32_t *string)
+ {
+ return QString::fromUcs4(string);
+ }
+
+ static inline QString ConvertUTFtoQString(const wchar_t *string)
+ {
+ return QString::fromWCharArray(string);
+ }
+
+ static inline QString &append(QString &target, QString::iterator begin,
+ QString::iterator end)
+ {
+ for (QString::iterator iter = begin;iter != end;++iter)
+ target.append(*iter);
+ return target;
+ }
+
+ static inline QString &append(QString &target, QString::const_iterator begin,
+ QString::const_iterator end)
+ {
+ for (QString::const_iterator iter = begin;iter != end;++iter)
+ target.append(*iter);
+ return target;
+ }
+
+ /**
+ * @brief replace Replaces specified portion of a string.
+ * @param source Source text that will be used. Note: This is const and will
+ * not be directly modified.
+ * @param first First character in the range that will be replaced.
+ * @param last Last character in the range that will be replaced.
+ * @param replaceText Pointer to the character string to use for replacement.
+ * @param len Length of the replacement character string.
+ * @return Returns a new QString containing the modified result.
+ */
+ static inline QString replace(const QString &source,
+ QString::const_iterator first,
+ QString::const_iterator last,
+ const char *replaceText, int len)
+ {
+ return replace(source, first, last, QString::fromUtf8(replaceText, len));
+ }
+
+ /**
+ * @brief replace Replaces specified portion of a string.
+ * @param source Source text that will be used. Note: This is const and will
+ * not be directly modified.
+ * @param first First character in the range that will be replaced.
+ * @param last Last character in the range that will be replaced.
+ * @param replaceText String to use for replacement.
+ * @return Returns a new QString containing the modified result.
+ */
+ static inline QString replace(const QString &source,
+ QString::const_iterator first,
+ QString::const_iterator last,
+ const QString &replaceText)
+ {
+ QString newStr;
+ for (QString::const_iterator iter = source.constBegin(); iter != first;
+ iter++)
+ newStr.append(*iter);
+
+ newStr.append(replaceText);
+
+ for (QString::const_iterator iter = last; iter != source.constEnd();
+ iter++)
+ newStr.append(*iter);
+ return newStr;
+ }
+
+ /**
+ * @brief replace Replaces specified portion of a string.
+ * @param source Source text that will be used. Note: This is const and
+ * will not be directly modified.
+ * @param first First character in the range that will be replaced.
+ * @param last Last character in the range that will be replaced.
+ * @param replaceText Pointer to the character string to use for replacement.
+ * @param len Length of the replacement character string.
+ * @return Returns a temporary object allocated on the stack containing
+ * the modified result.
+ */
+ static inline QString &replace(QString &target,
+ QString::iterator first,
+ QString::iterator last,
+ const char *replaceText, int len)
+ {
+ return replace(target, first, last, QString::fromUtf8(replaceText, len));
+ }
+
+ /**
+ * @brief replace Replaces specified portion of a string.
+ * @param target Target QString that will be modified.
+ * @param first First character in the range that will be replaced.
+ * @param last Last character in the range that will be replaced.
+ * @param replaceText String to use for replacement.
+ * @return Returns the string given in target, containing the modified result.
+ */
+ static inline QString &replace(QString &target,
+ QString::iterator first,
+ QString::iterator last,
+ const QString &replaceText)
+ {
+ QString newStr;
+ for (QString::iterator iter = target.begin(); iter != first; iter++)
+ newStr.append(*iter);
+
+ newStr.append(replaceText);
+
+ for (QString::iterator iter = last; iter != target.end(); iter++)
+ newStr.append(*iter);
+
+ target = newStr;
+ return target;
+ }
+};
+
+class Qt3DSString {
+public:
+ inline Qt3DSString() {}
+
+ Qt3DSString(QChar c) : m_string(QString(c)) {}
+
+ Qt3DSString(int size, QChar c) : m_string(size, c) {}
+
+ inline Qt3DSString(QLatin1String latin1)
+ : m_string(latin1) {}
+
+ explicit Qt3DSString(const QChar *unicode, int size = -1)
+ : m_string(unicode,size) {}
+
+ inline Qt3DSString(const QString &str) Q_DECL_NOTHROW
+ : m_string(str) {}
+
+ inline Qt3DSString(const Qt3DSString &str) Q_DECL_NOTHROW
+ : m_string(str.m_string) {}
+
+ ~Qt3DSString() {}
+
+ inline operator QString() const
+ {
+ return m_string;
+ }
+
+ inline void operator=(const Qt3DSString &text)
+ {
+ m_string = text.m_string;
+ m_isDirty = true;
+ }
+
+ inline void operator=(const QString &text)
+ {
+ m_string = text;
+ m_isDirty = true;
+ }
+
+ // QString method wrappers
+ static inline Qt3DSString fromUtf8(const char *str, int size = -1)
+ {
+ return Qt3DSString(QString::fromUtf8(str, size));
+ }
+
+ typedef int size_type;
+ typedef qptrdiff difference_type;
+ typedef const QChar & const_reference;
+ typedef QChar & reference;
+ typedef QChar *pointer;
+ typedef const QChar *const_pointer;
+ typedef QChar value_type;
+ typedef QChar *iterator;
+ typedef const QChar *const_iterator;
+ typedef iterator Iterator;
+ typedef const_iterator ConstIterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ inline iterator begin() { return m_string.begin(); }
+ inline const_iterator begin() const { return m_string.begin(); }
+ inline const_iterator cbegin() const { return m_string.cbegin(); }
+ inline const_iterator constBegin() const { return m_string.constBegin(); }
+ inline iterator end() { return m_string.end(); }
+ inline const_iterator end() const { return m_string.end(); }
+ inline const_iterator cend() const { return m_string.cend(); }
+ inline const_iterator constEnd() const { return m_string.constEnd(); }
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
+ reverse_iterator rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
+ const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
+
+ inline void push_back(QChar c)
+ {
+ m_string.push_back(c);
+ m_isDirty = true;
+ }
+
+ inline void push_back(const QString &s)
+ {
+ m_string.push_back(s);
+ m_isDirty = true;
+ }
+
+ inline void push_front(QChar c)
+ {
+ m_string.push_front(c);
+ m_isDirty = true;
+ }
+
+ inline void push_front(const QString &s)
+ {
+ m_string.push_front(s);
+ m_isDirty = true;
+ }
+
+ inline bool operator==(const QString &rhs)
+ {
+ return rhs == m_string;
+ }
+
+ inline bool operator<(const QString &rhs)
+ {
+ return m_string < rhs;
+ }
+
+ inline bool operator!=(const QString &rhs)
+ {
+ return !(*this == rhs);
+ }
+
+ inline bool operator>(const QString& rhs)
+ {
+ return (rhs < m_string);
+ }
+
+ inline bool operator<=(const QString& rhs)
+ {
+ return !operator> (rhs);
+ }
+
+ inline bool operator>=(const QString& rhs)
+ {
+ return !operator< (rhs);
+ }
+
+ inline Qt3DSString& operator+=(const QString &rhs)
+ {
+ m_string += rhs;
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString& operator+=(const char *s)
+ {
+ m_string += s;
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline bool isEmpty() const
+ {
+ return m_string.isEmpty();
+ }
+
+ int indexOf(const QString &str, int from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.indexOf(str, from, cs);
+ }
+
+ int indexOf(QChar ch, int from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.indexOf(ch, from, cs);
+ }
+
+ int indexOf(QLatin1String str, int from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.indexOf(str, from, cs);
+ }
+
+ int indexOf(const QStringRef &str, int from = 0,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.indexOf(str, from, cs);
+ }
+
+ int lastIndexOf(const QString &str, int from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.lastIndexOf(str, from, cs);
+ }
+
+ int lastIndexOf(QChar ch, int from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.lastIndexOf(ch, from, cs);
+ }
+
+ int lastIndexOf(QLatin1String str, int from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.lastIndexOf(str, from, cs);
+ }
+
+ int lastIndexOf(const QStringRef &str, int from = -1,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.lastIndexOf(str, from, cs);
+ }
+
+ inline void clear()
+ {
+ m_string.clear();
+ m_isDirty = true;
+ }
+
+ inline Qt3DSString &insert(int i, QChar c)
+ {
+ m_string.insert(i,c);
+ m_isDirty = true;
+ return *this;
+ }
+ inline Qt3DSString &insert(int i, const QChar *uc, int len)
+ {
+ m_string.insert(i,uc, len);
+ m_isDirty = true;
+ return *this;
+ }
+ inline Qt3DSString &insert(int i, const QString &s)
+ {
+ m_string.insert(i,s);
+ m_isDirty = true;
+ return *this;
+ }
+ inline Qt3DSString &insert(int i, const QStringRef &s)
+ {
+ m_string.insert(i,s);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &insert(int i, QLatin1String s)
+ {
+ m_string.insert(i,s);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline int size() const
+ {
+ return m_string.size();
+ }
+
+ inline int length() const {
+ return m_string.length();
+ }
+
+ inline Qt3DSString &append(QChar c)
+ {
+ m_string.append(c);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &append(const QChar *uc, int len)
+ {
+ m_string.append(uc, len);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &append(const QString &s)
+ {
+ m_string.append(s);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &append(const QStringRef &s)
+ {
+ m_string.append(s);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &append(QLatin1String s)
+ {
+ m_string.append(s);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline int compare(const QString &s,
+ Qt::CaseSensitivity cs = Qt::CaseSensitive) const
+ {
+ return m_string.compare(s, cs);
+ }
+
+ // Compatibility wrappers for std::basic_string and eastl::basic_string
+ // Required for now for the Qt 3D Studio's template classes.
+ static const int npos = -1;
+
+ inline char operator[](int idx) const
+ {
+ return m_string[idx].toLatin1();
+ }
+
+ inline void assign(const char *text)
+ {
+ m_string = QString::fromUtf8(text);
+ m_isDirty = true;
+ }
+
+ inline void assign(const char16_t *text)
+ {
+ m_string = QString::fromUtf16(text);
+ m_isDirty = true;
+ }
+
+ inline void assign(const char32_t *text)
+ {
+ m_string = QString::fromUcs4(text);
+ m_isDirty = true;
+ }
+
+ inline void assign(const wchar_t *text)
+ {
+ m_string = QString::fromWCharArray(text);
+ m_isDirty = true;
+ }
+
+ inline void assign(const eastl::string &text)
+ {
+ m_string = QString::fromUtf8(text.c_str());
+ m_isDirty = true;
+ }
+
+ inline void operator=(const char *text)
+ {
+ assign(text);
+ }
+
+ inline void operator=(const char16_t *text)
+ {
+ assign(text);
+ }
+
+ inline void operator=(const char32_t *text)
+ {
+ assign(text);
+ }
+
+ inline void operator=(const wchar_t *text)
+ {
+ assign(text);
+ }
+
+ inline void operator=(const eastl::string &text)
+ {
+ assign(text);
+ }
+
+ inline void operator=(const eastl::basic_string<char*> &text)
+ {
+ assign(*text.c_str());
+ }
+
+ inline Qt3DSString &append(QString::iterator first,
+ QString::iterator last)
+ {
+ Qt3DSStringUtils::append(m_string, first, last);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &append(QString::const_iterator first,
+ QString::const_iterator last)
+ {
+ Qt3DSStringUtils::append(m_string, first, last);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &append(const char *text, int size)
+ {
+ m_string.append(QString::fromUtf8(text, size));
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &append(const char *text)
+ {
+ m_string.append(QString::fromUtf8(text));
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &replace(QString::iterator replaceBegin,
+ QString::iterator replaceEnd,
+ const char *replaceText, int len)
+ {
+ return replace(replaceBegin, replaceEnd,
+ QString::fromUtf8(replaceText, len));
+ }
+
+ inline Qt3DSString &replace(QString::iterator replaceBegin,
+ QString::iterator replaceEnd,
+ const QString &replaceText)
+ {
+ m_string = Qt3DSStringUtils::replace(this->m_string,
+ replaceBegin, replaceEnd,
+ replaceText);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline Qt3DSString &replace(QString::const_iterator replaceBegin,
+ QString::const_iterator replaceEnd,
+ const QString &replaceText)
+ {
+ m_string = Qt3DSStringUtils::replace(this->m_string,
+ replaceBegin, replaceEnd,
+ replaceText);
+ m_isDirty = true;
+ return *this;
+ }
+
+ inline QByteArray toUtf8() const
+ {
+ updateCache();
+ return m_array;
+ }
+
+ inline const char *c_str() const
+ {
+ updateCache();
+ return m_array.constData();
+ }
+
+ inline const char *c_str()
+ {
+ updateCache();
+ return m_array.constData();
+ }
+
+private:
+ inline void updateCache() const
+ {
+ if (m_isDirty) {
+ m_array = m_string.toUtf8();
+ m_isDirty = false;
+ }
+ }
+
+ QString m_string;
+ mutable bool m_isDirty = true;
+ mutable QByteArray m_array;
+};
+
+}
+}
+
+#endif
diff --git a/src/foundation/TaggedPointer.h b/src/foundation/TaggedPointer.h
new file mode 100644
index 0000000..aa22725
--- /dev/null
+++ b/src/foundation/TaggedPointer.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_TAGGED_POINTER_H
+#define QT3DS_FOUNDATION_TAGGED_POINTER_H
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <typename TDataType>
+ struct SPointerTag
+ {
+ /* Expected API for runtime RTTI
+ static CRegisteredString GetTag() { return g_dtype_specific_string; }
+ */
+ };
+
+ // A pointer tagged with an identifier so we can have generic
+ // user data that is still somewhat typesafe.
+ struct STaggedPointer
+ {
+ void *m_UserData;
+ CRegisteredString m_Tag;
+ STaggedPointer()
+ : m_UserData(NULL)
+ {
+ }
+
+ STaggedPointer(void *inUserData, CRegisteredString inTag)
+ : m_UserData(inUserData)
+ , m_Tag(inTag)
+ {
+ }
+
+ template <typename TDataType>
+ STaggedPointer(TDataType *inType)
+ : m_UserData(reinterpret_cast<void *>(inType))
+ , m_Tag(SPointerTag<TDataType>::GetTag())
+ {
+ }
+
+ template <typename TDataType>
+ TDataType *DynamicCast() const
+ {
+ if (m_Tag == SPointerTag<TDataType>::GetTag())
+ return reinterpret_cast<TDataType *>(m_UserData);
+ return NULL;
+ }
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/foundation/ThreadSafeQueue.h b/src/foundation/ThreadSafeQueue.h
new file mode 100644
index 0000000..462b6d4
--- /dev/null
+++ b/src/foundation/ThreadSafeQueue.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_FOUNDATION_THREAD_SAFE_QUEUE_H
+#define QT3DS_FOUNDATION_THREAD_SAFE_QUEUE_H
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSSemaphore.h"
+#include "EASTL/vector.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <typename TObjType, typename TAllocator = EASTLAllocatorType>
+ class ThreadSafeQueue
+ {
+ public:
+ static const QT3DSU32 MaxQueue = 0xffffffff;
+
+ protected:
+ eastl::vector<TObjType, TAllocator> mQueue;
+ Semaphore mGetSemaphore;
+ Semaphore mPutSemaphore;
+ Mutex mMutex;
+ const QT3DSU32 mMaxCount;
+
+ public:
+ ThreadSafeQueue(NVAllocatorCallback &alloc, QT3DSU32 maxCount = MaxQueue)
+ : mMutex(alloc)
+ , mGetSemaphore(alloc, 0, maxCount)
+ , mPutSemaphore(alloc, maxCount, maxCount)
+ , mMaxCount(maxCount)
+ {
+ mQueue.clear();
+ }
+
+ bool push(const TObjType &obj, QT3DSU32 milliseconds = MaxQueue)
+ {
+ if (mPutSemaphore.wait(milliseconds)) {
+ Mutex::ScopedLock __locker(mMutex);
+ mQueue.push_back(obj);
+ mGetSemaphore.post();
+ return true;
+ }
+ return false;
+ }
+
+ bool pop(TObjType &obj, QT3DSU32 milliseconds = 0)
+ {
+ if (mGetSemaphore.wait(milliseconds)) {
+ Mutex::ScopedLock __locker(mMutex);
+ obj = mQueue.back();
+ mQueue.pop_back();
+ mPutSemaphore.post();
+ return true;
+ }
+ return false;
+ }
+
+ bool isFull()
+ {
+ Mutex::ScopedLock __locker(mMutex);
+ return mQueue.size() >= mMaxCount;
+ }
+
+ bool isEmpty()
+ {
+ Mutex::ScopedLock __locker(mMutex);
+ return mQueue.size() == 0;
+ }
+
+ void clear()
+ {
+ Mutex::ScopedLock __locker(mMutex);
+ while (!mQueue.empty()) {
+ if (mGetSemaphore.wait(MaxQueue)) {
+ mQueue.pop_back();
+ mPutSemaphore.post();
+ }
+ }
+ }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/foundation/TrackingAllocator.cpp b/src/foundation/TrackingAllocator.cpp
new file mode 100644
index 0000000..242b0ac
--- /dev/null
+++ b/src/foundation/TrackingAllocator.cpp
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/TrackingAllocator.h"
+
+namespace qt3ds {
+namespace foundation {
+
+CAllocator::~CAllocator()
+{
+ QT3DS_ASSERT(mAllocations.size() == 0);
+ MemInfo info;
+ for (PtrToInfoMap::iterator iter = mAllocations.begin(), end = mAllocations.end();
+ iter != end; ++iter) {
+ info = iter->second;
+ qCCritical(INTERNAL_ERROR, "!!Outstanding allocation of %lu bytes from %s::%d, %s",
+ info.size, info.file, info.line, info.name ? info.name : "");
+ }
+ QT3DS_UNUSED(info);
+}
+
+}
+}
diff --git a/src/foundation/TrackingAllocator.h b/src/foundation/TrackingAllocator.h
new file mode 100644
index 0000000..4fd5806
--- /dev/null
+++ b/src/foundation/TrackingAllocator.h
@@ -0,0 +1,252 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_RENDER_ALLOCATOR_H
+#define QT3DS_RENDER_ALLOCATOR_H
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DSMutex.h"
+#include "EASTL/hash_map.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSLogging.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ // The simplest allocator. Performs no alignment nor memory checking.
+ struct MallocAllocator : public NVAllocatorCallback
+ {
+ void *allocate(size_t size, const char *, const char *, int, int = 0) override
+ {
+ return malloc(size);
+ }
+ void *allocate(size_t size, const char *, const char *, int, size_t, size_t) override
+ {
+ return malloc(size);
+ }
+ void deallocate(void *ptr) override { free(ptr); }
+ };
+
+ struct MemInfo
+ {
+ size_t size;
+ void *originalAddress;
+ const char *name;
+ const char *file;
+ int line;
+ MemInfo(size_t _size = 0, void *addr = 0, const char *_name = "", const char *_file = "",
+ int _line = 0)
+ : size(_size)
+ , originalAddress(addr)
+ , name(_name)
+ , file(_file)
+ , line(_line)
+ {
+ }
+ };
+
+ struct FileAndLine
+ {
+ const char *mFile;
+ QT3DSU32 mLine;
+ FileAndLine(const char *f, QT3DSU32 l)
+ : mFile(f)
+ , mLine(l)
+ {
+ }
+ };
+} // namespace foundation
+} // namespace qt3ds
+
+namespace eastl {
+template <>
+struct hash<qt3ds::foundation::FileAndLine>
+{
+ size_t operator()(const qt3ds::foundation::FileAndLine &fl) const
+ {
+ return hash<const void *>()((const void *)fl.mFile) ^ hash<int>()(fl.mLine);
+ }
+};
+
+template <>
+struct equal_to<qt3ds::foundation::FileAndLine>
+{
+ bool operator()(const qt3ds::foundation::FileAndLine &fl1,
+ const qt3ds::foundation::FileAndLine &fl2) const
+ {
+ size_t fl1File(reinterpret_cast<size_t>(fl1.mFile));
+ size_t fl2File(reinterpret_cast<size_t>(fl2.mFile));
+
+ return fl1File == fl2File && fl1.mLine == fl2.mLine;
+ }
+};
+}
+
+namespace qt3ds {
+namespace foundation {
+
+ struct MemInfoAndCount : MemInfo
+ {
+ QT3DSU32 mCount;
+ QT3DSU64 mTotalBytes;
+ MemInfoAndCount(const MemInfo &info)
+ : MemInfo(info)
+ , mCount(1)
+ , mTotalBytes(info.size)
+ {
+ }
+ void increment(const MemInfo &otherInfo)
+ {
+ ++mCount;
+ mTotalBytes += otherInfo.size;
+ }
+ };
+
+ typedef nvhash_map<FileAndLine, MemInfoAndCount> TFileAndLineMemHash;
+
+ class AllocationCheckPrinter
+ {
+ protected:
+ virtual ~AllocationCheckPrinter() {}
+ public:
+ virtual void printMissing(const MemInfoAndCount &item) = 0;
+ virtual void printIncorrectCount(const MemInfoAndCount &later,
+ const MemInfoAndCount &earlier) = 0;
+ };
+
+ // All allocations are 16 byte aligned.
+ // Prints out unallocated memory at destruction.
+ class QT3DS_AUTOTEST_EXPORT CAllocator : public NVAllocatorCallback
+ {
+ public:
+ typedef Mutex TMutexType;
+ typedef Mutex::ScopedLock TLockType;
+ typedef nvhash_map<void *, MemInfo> PtrToInfoMap;
+
+ private:
+ MallocAllocator mAlloc;
+ PtrToInfoMap mAllocations;
+ PtrToInfoMap mStoredAllocations;
+ TMutexType mMutex;
+
+ public:
+ CAllocator()
+ : mAllocations(mAlloc, "MemInfo")
+ , mStoredAllocations(mAlloc, "MemInfo")
+ , mMutex(mAlloc)
+ {
+ }
+ virtual ~CAllocator();
+
+ void *allocate(size_t size, const char *tn, const char *fl, int ln, int flags) override
+ {
+ QT3DS_ASSERT(size);
+ if (size) {
+ size += 15;
+ TLockType locker(mMutex);
+ void *original = mAlloc.allocate(size, tn, fl, ln, flags);
+ size_t temp = (size_t)original;
+ temp = (temp + 15) & (~15);
+ void *retval = (void *)temp;
+ mAllocations.insert(eastl::make_pair(retval, MemInfo(size, original, tn, fl, ln)));
+ return retval;
+ }
+ return NULL;
+ }
+ void *allocate(size_t size, const char *tn, const char *fl, int ln, size_t, size_t) override
+ {
+ return allocate(size, tn, fl, ln, 0);
+ }
+ void deallocate(void *ptr) override
+ {
+ if (ptr) {
+ TLockType locker(mMutex);
+ PtrToInfoMap::iterator entry(mAllocations.find(ptr));
+ if (entry != mAllocations.end()) {
+ mAlloc.deallocate(entry->second.originalAddress);
+ mAllocations.erase(ptr);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ const PtrToInfoMap &getOutstandingAllocations() const { return mAllocations; }
+ static void convert(const CAllocator::PtrToInfoMap &map, TFileAndLineMemHash &fl)
+ {
+ for (CAllocator::PtrToInfoMap::const_iterator iter = map.begin(), end = map.end();
+ iter != end; ++iter) {
+ const MemInfo &info(iter->second);
+ FileAndLine flKey(info.file, info.line);
+ TFileAndLineMemHash::const_iterator find(fl.find(flKey));
+ if (find == fl.end())
+ fl.insert(eastl::make_pair(flKey, MemInfoAndCount(info)));
+ else
+ const_cast<MemInfoAndCount &>(find->second).increment(info);
+ }
+ }
+ static void copyMap(const CAllocator::PtrToInfoMap &map1, CAllocator::PtrToInfoMap &map2)
+ {
+ for (CAllocator::PtrToInfoMap::const_iterator iter = map1.begin(), end = map1.end();
+ iter != end; ++iter) {
+ map2.insert(eastl::make_pair(iter->first, iter->second));
+ }
+ }
+
+ static void printDiffs(const TFileAndLineMemHash &fl1, const TFileAndLineMemHash &fl2,
+ AllocationCheckPrinter &printer)
+ {
+ using namespace std;
+ for (TFileAndLineMemHash::const_iterator iter = fl1.begin(), end = fl1.end();
+ iter != end; ++iter) {
+ TFileAndLineMemHash::const_iterator entry = fl2.find(iter->first);
+ if (entry != fl2.end()) {
+ printer.printMissing(iter->second);
+ } else if (iter->second.mCount > entry->second.mCount) {
+ printer.printIncorrectCount(iter->second, entry->second);
+ }
+ }
+ }
+
+ void printAllocationDiff(AllocationCheckPrinter &printer)
+ {
+ TFileAndLineMemHash map1fl(mAlloc, "printAllocationDiff");
+ TFileAndLineMemHash map2fl(mAlloc, "printAllocationDiff");
+ convert(mStoredAllocations, map1fl);
+ convert(mAllocations, map2fl);
+ printDiffs(map2fl, map1fl, printer);
+ }
+ void storeAllocations()
+ {
+ mStoredAllocations.clear();
+ copyMap(mAllocations, mStoredAllocations);
+ }
+ bool hasStoredAllocations() { return mStoredAllocations.size() > 0; }
+ };
+}
+}
+#endif
diff --git a/src/foundation/Utils.h b/src/foundation/Utils.h
new file mode 100644
index 0000000..33c2400
--- /dev/null
+++ b/src/foundation/Utils.h
@@ -0,0 +1,382 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_UTILS_H
+#define QT3DS_RENDER_UTILS_H
+#include "EASTL/hash_map.h"
+#include "EASTL/hash_set.h"
+#include "EASTL/vector.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSMath.h"
+#include <ctype.h>
+
+namespace qt3ds {
+namespace foundation {
+
+ // Defined in IStringTable.cpp
+ extern const char16_t *char16EmptyStr;
+ extern const char32_t *char32EmptyStr;
+
+ inline const char *nonNull(const char *src) { return src == NULL ? "" : src; }
+ inline bool isTrivial(const char *str) { return str == NULL || *str == 0; }
+ inline const char16_t *nonNull(const char16_t *src)
+ {
+ return src == NULL ? char16EmptyStr : src;
+ }
+ inline bool isTrivial(const char16_t *str) { return str == NULL || *str == 0; }
+ inline const char32_t *nonNull(const char32_t *src)
+ {
+ return src == NULL ? char32EmptyStr : src;
+ }
+ inline bool isTrivial(const char32_t *str) { return str == NULL || *str == 0; }
+
+ // Note this is safe to call on null strings.
+ template <typename TCharType>
+ inline QT3DSU32 StrLen(const TCharType *inType)
+ {
+ QT3DSU32 retval = 0;
+ while (inType && *inType) {
+ ++retval;
+ ++inType;
+ }
+ return retval;
+ }
+
+ template <typename TCharType>
+ inline QT3DSI32 Compare(const TCharType *inLhs, const TCharType *inRhs)
+ {
+ inLhs = nonNull(inLhs);
+ inRhs = nonNull(inRhs);
+ while (*inLhs && *inRhs) {
+ QT3DSI32 diff = *inLhs - *inRhs;
+ if (diff)
+ return diff;
+ ++inLhs;
+ ++inRhs;
+ }
+ return *inLhs - *inRhs;
+ }
+
+ template <typename TCharType>
+ inline QT3DSI32 CompareCaseless(const TCharType *inLhs, const TCharType *inRhs)
+ {
+ inLhs = nonNull(inLhs);
+ inRhs = nonNull(inRhs);
+ while (*inLhs && *inRhs) {
+ QT3DSI32 diff = tolower(*inLhs) - tolower(*inRhs);
+ if (diff)
+ return diff;
+ ++inLhs;
+ ++inRhs;
+ }
+ return *inLhs - *inRhs;
+ }
+
+ template <typename TCharType>
+ inline QT3DSI32 CompareNChars(const TCharType *inLhs, const TCharType *inRhs, QT3DSU32 inNumChars)
+ {
+ inLhs = nonNull(inLhs);
+ inRhs = nonNull(inRhs);
+ while (*inLhs && *inRhs && inNumChars) {
+ QT3DSI32 diff = *inLhs - *inRhs;
+ if (diff)
+ return diff;
+ ++inLhs;
+ ++inRhs;
+ --inNumChars;
+ }
+ if (inNumChars)
+ return *inLhs - *inRhs;
+ return 0;
+ }
+
+ template <typename TCharType>
+ bool AreEqual(const TCharType *inLhs, const TCharType *inRhs)
+ {
+ return Compare(inLhs, inRhs) == 0;
+ }
+
+ template <typename TCharType>
+ bool AreEqualCaseless(const TCharType *inLhs, const TCharType *inRhs)
+ {
+ return CompareCaseless(inLhs, inRhs) == 0;
+ }
+
+ inline QT3DSU32 IsBitSetInBitmap(NVConstDataRef<QT3DSU32> bitmap, QT3DSU32 entryIndex)
+ {
+ QT3DSU32 bitMapIndex = entryIndex / 32;
+ QT3DSU32 bitIndex = entryIndex % 32;
+ QT3DSU32 shouldApply = 0;
+ if (bitMapIndex < bitmap.mSize)
+ shouldApply = (1 << bitIndex) & bitmap[bitMapIndex];
+ return shouldApply;
+ }
+
+ inline void SetBitInBitmap(nvvector<QT3DSU32> &bitmap, QT3DSU32 entryIndex)
+ {
+ QT3DSU32 bitMapIndex = entryIndex / 32;
+ QT3DSU32 bitIndex = entryIndex % 32;
+ while (bitmap.size() <= bitMapIndex)
+ bitmap.push_back(0);
+ bitmap[bitMapIndex] |= (QT3DSU32)(1 << bitIndex);
+ }
+ inline void UnsetBitInBitmap(nvvector<QT3DSU32> &bitmap, QT3DSU32 entryIndex)
+ {
+ QT3DSU32 bitMapIndex = entryIndex / 32;
+ QT3DSU32 bitIndex = entryIndex % 32;
+ if (bitMapIndex < bitmap.size())
+ bitmap[bitMapIndex] &= ~((QT3DSU32)(1 << bitIndex));
+ }
+
+#define CHECK_CONDITION_AND_RETURN_FALSE(cond, errorType, message) \
+ if (cond) { \
+ m_Foundation.error(errorType, message); \
+ QT3DS_ASSERT(false); \
+ return false; \
+ }
+// Returns false if the property type doesn't match the incoming type.
+#define CHECK_CONDITION_AND_RETURN(cond, errorType, message) \
+ if (cond) { \
+ m_Foundation.error(errorType, message); \
+ QT3DS_ASSERT(false); \
+ }
+
+#define QT3DS_FOREACH(varname, stop) for (QT3DSU32 varname = 0, end = stop; varname < end; ++varname)
+
+ template <typename TKeyType, typename TValueType, typename THashType, typename TPredicate,
+ typename TBufType, typename TOperator>
+ QT3DSU32 GetMapKeysOp(const eastl::hash_map<TKeyType, TValueType, THashType, TPredicate,
+ ForwardingAllocator> &map,
+ TBufType *buffer, QT3DSU32 bufSize, QT3DSU32 startIdx, TOperator op)
+ {
+ QT3DSU32 numItems = static_cast<QT3DSU32>(map.size());
+ if (numItems == 0 || bufSize == 0)
+ return 0;
+
+ startIdx = NVMin(numItems - 1, startIdx);
+ QT3DSU32 retval = 0;
+ for (typename eastl::hash_map<TKeyType, TValueType, THashType, TPredicate,
+ ForwardingAllocator>::const_iterator iter = map.begin(),
+ end = map.end();
+ iter != end && bufSize; ++iter) {
+ if (startIdx)
+ --startIdx;
+ else {
+ buffer[retval] = op(iter->first);
+ --bufSize;
+ ++retval;
+ }
+ }
+ return retval;
+ }
+
+ struct IdOp
+ {
+ template <typename TDataType>
+ TDataType operator()(const TDataType &item)
+ {
+ return item;
+ }
+ };
+
+ template <typename TKeyType, typename TValueType, typename THashType, typename TPredicateType>
+ QT3DSU32
+ GetMapKeys(const eastl::hash_map<TKeyType, TValueType, THashType, ForwardingAllocator> &map,
+ TKeyType *buffer, QT3DSU32 bufSize, QT3DSU32 startIdx)
+ {
+ return GetMapKeysOp(map, buffer, bufSize, startIdx, IdOp());
+ }
+
+ struct DerefOp
+ {
+ template <typename TDataType>
+ TDataType operator()(const TDataType *item)
+ {
+ return *item;
+ }
+ };
+
+ template <typename TKeyType, typename TValueType, typename THashType, typename TPredicateType,
+ typename TAllocatorType, typename TBufType, typename TOp>
+ QT3DSU32 GetMapValues(
+ const eastl::hash_map<TKeyType, TValueType, THashType, TPredicateType, TAllocatorType> &map,
+ TBufType *buffer, QT3DSU32 bufSize, QT3DSU32 startIdx, TOp op)
+ {
+ QT3DSU32 numItems = static_cast<QT3DSU32>(map.size());
+ if (numItems == 0 || bufSize == 0)
+ return 0;
+
+ startIdx = NVMin(numItems - 1, startIdx);
+ QT3DSU32 retval = 0;
+ for (typename eastl::hash_map<TKeyType, TValueType, THashType, TPredicateType,
+ TAllocatorType>::const_iterator iter = map.begin(),
+ end = map.end();
+ iter != end && bufSize; ++iter) {
+ if (startIdx)
+ --startIdx;
+ else {
+ buffer[retval] = op(iter->second);
+ --bufSize;
+ ++retval;
+ }
+ }
+ return retval;
+ }
+
+ template <typename TValueType, typename TBufType>
+ QT3DSU32 GetArrayEntries(const nvvector<TValueType> &data, TBufType *buffer, QT3DSU32 bufSize,
+ QT3DSU32 startIdx)
+ {
+ QT3DSU32 numItems = static_cast<QT3DSU32>(data.size());
+ if (numItems == 0 || bufSize == 0)
+ return 0;
+
+ startIdx = NVMin(numItems - 1, startIdx);
+ QT3DSU32 available = NVMin(numItems - startIdx, bufSize);
+ QT3DS_FOREACH(idx, available)
+ buffer[idx] = data[idx + startIdx];
+ return available;
+ }
+
+ template <typename TValueType, typename TBufType>
+ QT3DSU32 GetDataRefEntries(const NVDataRef<TValueType> &data, TBufType *buffer, QT3DSU32 bufSize,
+ QT3DSU32 startIdx)
+ {
+ QT3DSU32 numItems = static_cast<QT3DSU32>(data.size());
+ if (numItems == 0 || bufSize == 0)
+ return 0;
+
+ startIdx = NVMin(numItems - 1, startIdx);
+ QT3DSU32 available = NVMin(numItems - startIdx, bufSize);
+ QT3DS_FOREACH(idx, available)
+ buffer[idx] = data.mData[idx + startIdx];
+ return available;
+ }
+
+ template <typename TValueType, typename TBufType>
+ QT3DSU32 GetDataRefEntries(const NVConstDataRef<TValueType> &data, TBufType *buffer, QT3DSU32 bufSize,
+ QT3DSU32 startIdx)
+ {
+ QT3DSU32 numItems = static_cast<QT3DSU32>(data.size());
+ if (numItems == 0 || bufSize == 0)
+ return 0;
+
+ startIdx = NVMin(numItems - 1, startIdx);
+ QT3DSU32 available = NVMin(numItems - startIdx, bufSize);
+ QT3DS_FOREACH(idx, available)
+ buffer[idx] = data.mData[idx + startIdx];
+ return available;
+ }
+
+ template <typename TKeyType, typename THashType, typename TPredicate, typename TAllocator>
+ QT3DSU32 GetHashSetEntries(eastl::hash_set<TKeyType, THashType, TPredicate, TAllocator> &data,
+ TKeyType *buffer, QT3DSU32 bufSize, QT3DSU32 startIdx)
+ {
+ QT3DSU32 numItems = static_cast<QT3DSU32>(data.size());
+ if (numItems == 0 || bufSize == 0)
+ return 0;
+ startIdx = NVMin(numItems - 1, startIdx);
+ QT3DSU32 available = NVMin(numItems - startIdx, bufSize);
+ QT3DSU32 idx = 0;
+ for (typename eastl::hash_set<TKeyType, THashType, TPredicate, TAllocator>::const_iterator
+ iter = data.begin(),
+ end = data.end();
+ iter != end && idx < available; ++iter, ++idx) {
+ if (startIdx) {
+ --startIdx;
+ continue;
+ }
+ buffer[idx] = *iter;
+ }
+ return available;
+ }
+
+ template <typename TDataType>
+ void memCopyT(TDataType *dest, const TDataType *src, QT3DSU32 size)
+ {
+ memCopy(dest, src, size * sizeof(TDataType));
+ }
+
+ template <typename TDataType>
+ NVDataRef<TDataType> PtrAtOffset(QT3DSU8 *baseData, QT3DSU32 offset, QT3DSU32 byteSize)
+ {
+ return NVDataRef<TDataType>(byteSize ? (TDataType *)(baseData + offset) : NULL,
+ byteSize / sizeof(TDataType));
+ }
+
+ struct char_hasher
+ {
+ size_t operator()(const char *item) const { return eastl::hash<const char8_t *>()(item); }
+ };
+
+ struct char_equal_to
+ {
+ bool operator()(const char *lhs, const char *rhs) const
+ {
+ if (lhs == NULL)
+ lhs = "";
+ if (rhs == NULL)
+ rhs = "";
+ return strcmp(lhs, rhs) == 0;
+ }
+ };
+
+ struct wide_char_hasher
+ {
+ size_t operator()(const char16_t *item) const
+ {
+ return eastl::hash<const char16_t *>()(item);
+ }
+ };
+
+ struct wide_char_equal_to
+ {
+ bool operator()(const char16_t *lhs, const char16_t *rhs) const
+ {
+ if (lhs == NULL)
+ lhs = reinterpret_cast<const char16_t *>(L"");
+ if (rhs == NULL)
+ rhs = reinterpret_cast<const char16_t *>(L"");
+ while (*lhs && *rhs) {
+ int answer = *lhs - *rhs;
+ if (answer)
+ return false;
+ ++lhs;
+ ++rhs;
+ }
+ return *lhs == *rhs;
+ }
+ };
+}
+}
+#endif
diff --git a/src/foundation/XML.cpp b/src/foundation/XML.cpp
new file mode 100644
index 0000000..bd12dfa
--- /dev/null
+++ b/src/foundation/XML.cpp
@@ -0,0 +1,948 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/XML.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+#include "foundation/IOStreams.h"
+#include "foundation/StringConversionImpl.h"
+#include "foundation/StrConvertUTF.h"
+#include "foundation/StringTable.h"
+#include "foundation/Utils.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/hash_map.h"
+
+#ifdef QT3DS_VC
+#include <windows.h> //output debug string
+#endif
+
+#include <QtCore/qxmlstream.h>
+
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace qt3ds::intrinsics;
+
+typedef char XML_Char;
+
+namespace {
+
+const QT3DSU16 g_BOMMarker = (QT3DSU16)0xFEFF;
+
+// Some DOM parsing operations are destructive. If you need
+// them to not be destructive, then we need to modify
+// the reader. Specifically parsing lists of floats, due
+// to a bug in strtod, is destructive.
+struct SDOMReader : public IDOMReader
+{
+ SReaderScope m_TopElement;
+ eastl::vector<SReaderScope> m_ScopeStack;
+ NVScopedRefCounted<IDOMFactory> m_Factory;
+ volatile QT3DSI32 mRefCount;
+
+ SDOMReader(NVAllocatorCallback &inAlloc, SDOMElement &te, NVScopedRefCounted<IStringTable> s,
+ NVScopedRefCounted<IDOMFactory> inFactory)
+ : IDOMReader(inAlloc, s)
+ , m_TopElement(&te)
+ , m_Factory(inFactory)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Factory->GetAllocator())
+
+ SDOMElement *Current() const { return m_TopElement.m_Element; }
+
+ void PushScope() override { m_ScopeStack.push_back(SReaderScope(m_TopElement)); }
+
+ void PopScope() override
+ {
+ if (m_ScopeStack.size()) {
+ m_TopElement = m_ScopeStack.back();
+ m_ScopeStack.pop_back();
+ } else
+ m_TopElement = SReaderScope();
+ }
+
+ SReaderScope GetScope() override { return m_TopElement; }
+
+ void SetScope(SReaderScope inScope) override { m_TopElement = inScope; }
+
+ SDOMElement *GetElement() const override { return m_TopElement.m_Element; }
+
+ Option<CRegisteredString> RegisterNS(TXMLCharPtr ns)
+ {
+ if (ns) {
+ return m_StringTable->RegisterStr(ns);
+ }
+ return Empty();
+ }
+
+ bool UnregisteredAtt(TXMLCharPtr name, TXMLCharPtr &outValue, TXMLCharPtr ns = NULL) override
+ {
+ outValue = "";
+ SDOMElement *current(Current());
+ if (current) {
+ return current->AttValue(m_StringTable->RegisterStr(name), RegisterNS(ns), outValue);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return false;
+ }
+
+ bool Att(TXMLCharPtr name, CRegisteredString &outValue, TXMLCharPtr ns = NULL) override
+ {
+ const char8_t *unregValue = NULL;
+ if (UnregisteredAtt(name, unregValue, ns)) {
+ outValue = m_StringTable->RegisterStr(unregValue);
+ return true;
+ }
+ return false;
+ }
+
+ QT3DSU32 CountChildren(TXMLCharPtr childName = NULL, TXMLCharPtr ns = NULL) override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ return elem->GetNumChildren(m_StringTable->RegisterStr(childName), RegisterNS(ns));
+ }
+
+ SDOMAttribute *CurrentAtt()
+ {
+ if (m_TopElement.m_Attribute)
+ return m_TopElement.m_Attribute;
+ return NULL;
+ }
+
+ SDOMAttribute *GetFirstAttribute() override
+ {
+ if (m_TopElement.m_Element)
+ m_TopElement.m_Attribute = m_TopElement.m_Element->m_Attributes.m_Head;
+ return m_TopElement.m_Attribute;
+ }
+
+ SDOMAttribute *GetNextAttribute() override
+ {
+ if (m_TopElement.m_Attribute)
+ m_TopElement.m_Attribute = m_TopElement.m_Attribute->m_NextAttribute;
+ return CurrentAtt();
+ }
+
+ bool MoveToFirstChild(TXMLCharPtr childName = NULL, TXMLCharPtr ns = NULL) override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ SDOMElement *child = elem->FindChild(m_StringTable->RegisterStr(childName), RegisterNS(ns));
+ if (child != NULL) {
+ m_TopElement = child;
+ return true;
+ }
+ return false;
+ }
+
+ bool MoveToNextSibling(TXMLCharPtr childName = NULL, TXMLCharPtr ns = NULL) override
+ {
+ SDOMElement *elem = Current();
+ if (elem == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ SDOMElement *nextSibling =
+ elem->FindSibling(m_StringTable->RegisterStr(childName), RegisterNS(ns));
+ if (nextSibling) {
+ m_TopElement = nextSibling;
+ return true;
+ }
+ return false;
+ }
+ // Leave element means go to its parent.
+ void Leave() override
+ {
+ QT3DS_ASSERT(m_TopElement.m_Element);
+ if (m_TopElement.m_Element)
+ m_TopElement = m_TopElement.m_Element->m_Parent;
+ }
+
+ bool Value(TXMLCharPtr &outValue) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ outValue = current->m_Value;
+ return true;
+ }
+
+ SDOMElement *GetTopElement() override
+ {
+ SDOMElement *current(Current());
+ while (current && current->m_Parent)
+ current = current->m_Parent;
+ return current;
+ }
+
+ virtual NVScopedRefCounted<IDOMFactory> GetFactory() { return m_Factory; }
+};
+
+struct SDOMWriter : public IDOMWriter, public SDOMReader
+{
+ NVScopedRefCounted<IDOMFactory> m_FactoryPtr;
+ IDOMFactory &m_Factory;
+
+ SDOMWriter(NVScopedRefCounted<IDOMFactory> inDOMFactory,
+ NVScopedRefCounted<IStringTable> inStringTable, SDOMElement &inTopElem)
+ : SDOMReader(inDOMFactory->GetAllocator(), inTopElem, inStringTable, *inDOMFactory)
+ , m_FactoryPtr(inDOMFactory)
+ , m_Factory(*inDOMFactory)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Factory.GetAllocator())
+
+ void Begin(TXMLCharPtr inElemName, TXMLCharPtr inNamespace = NULL, int inLine = 0) override
+ {
+ if (!m_TopElement.m_Element) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SDOMElement *current(Current());
+ SDOMElement *newElement(m_Factory.NextElement(m_StringTable->RegisterStr(inElemName),
+ m_StringTable->RegisterStr(inNamespace),
+ inLine));
+ current->AppendChild(*newElement);
+ m_TopElement = newElement;
+ }
+
+ void Att(TXMLCharPtr name, TXMLCharPtr value, TXMLCharPtr ns, int inLine) override
+ {
+ if (!m_TopElement.m_Element) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ m_TopElement.m_Element->SetAttributeValue(m_StringTable->RegisterStr(name), RegisterNS(ns),
+ value, m_Factory, inLine);
+ }
+
+ void Value(TXMLCharPtr value) override
+ {
+ if (!m_TopElement.m_Element) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (value == NULL)
+ value = "";
+ size_t len = strlen(value);
+ m_Factory.AppendStrBuf(value, (QT3DSU32)len);
+ m_TopElement.m_Element->m_Value = m_Factory.FinalizeStrBuf();
+ }
+
+ void End() override
+ {
+ if (!m_TopElement.m_Element) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ Leave();
+ }
+ void RemoveCurrent() override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (current->m_Parent) {
+ m_TopElement = current->m_Parent;
+ m_TopElement.m_Element->RemoveChild(*current);
+ }
+ }
+ void RemoveAttribute(TXMLCharPtr inItem, TXMLCharPtr inNamespace) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ current->RemoveAttribute(m_StringTable->RegisterStr(inItem), RegisterNS(inNamespace));
+ }
+
+ void MoveBefore(TXMLCharPtr inItem, TXMLCharPtr inSibling, TXMLCharPtr inNs = NULL) override
+ {
+ SDOMElement *current(Current());
+ if (!current) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ SDOMElement *theItem =
+ current->FindChild(m_StringTable->RegisterStr(inItem), RegisterNS(inNs));
+ SDOMElement *theSibling =
+ current->FindChild(m_StringTable->RegisterStr(inSibling), RegisterNS(inNs));
+ QT3DS_ASSERT(theItem && theSibling);
+ if (theItem && theSibling)
+ current->PrependChild(*theItem, theSibling);
+ }
+
+ // If current has no parent, then we are at the top
+ // of the tree and we should return 0. Or if there is no
+ // current.
+ // If there is one parent, we should return 1.
+ QT3DSU32 GetTabs() override
+ {
+ QT3DSU32 retval = 0;
+ SDOMElement *current(Current());
+ do {
+ if (current)
+ current = current->m_Parent;
+ if (current)
+ ++retval;
+ } while (current);
+ return retval;
+ }
+
+ SDOMElement *GetTopElement() override { return SDOMReader::GetTopElement(); }
+
+ NVScopedRefCounted<IDOMFactory> GetFactory() override { return m_FactoryPtr; }
+
+ NVAllocatorCallback &GetAllocator() override { return m_Factory.GetAllocator(); }
+};
+
+struct SimpleXmlWriter
+{
+
+ struct SNameNS
+ {
+ TXMLCharPtr name;
+ TXMLCharPtr ns;
+ SNameNS(TXMLCharPtr _name = NULL, TXMLCharPtr _ns = NULL)
+ : name(_name)
+ , ns(_ns)
+ {
+ }
+ };
+ IOutStream &m_Stream;
+ eastl::vector<eastl::pair<SNameNS, bool>> m_OpenElements;
+ bool m_ElementOpen;
+ char8_t m_PrintBuf[256];
+ QT3DSU32 m_Tabs;
+ eastl::basic_string<char8_t, ForwardingAllocator> m_Buffer;
+
+ SimpleXmlWriter(NVAllocatorCallback &inAlloc, IOutStream &stream, QT3DSU32 inTabs = 0)
+ : m_Stream(stream)
+ , m_ElementOpen(false)
+ , m_Tabs(inTabs)
+ , m_Buffer(ForwardingAllocator(inAlloc, "SimpleXMLWriter::m_Buffer"))
+ {
+ }
+
+ void Write(const SNameNS &data)
+ {
+ if (data.ns && *data.ns) {
+ Write(data.ns);
+ Write(':');
+ }
+ Write(data.name);
+ }
+
+ void Write(const char8_t *data, QT3DSU32 inLen = 0)
+ {
+ if (!isTrivial(data)) {
+ if (inLen == 0)
+ inLen = StrLen(data);
+ m_Stream.Write(data, inLen);
+ }
+ }
+ void BeginWrite() { m_Buffer.clear(); }
+ void WriteTemp(char8_t data) { m_Buffer.append(1, data); }
+ void WriteTemp(const char8_t *data) { m_Buffer.append(data); }
+ void EndWrite() { Write(reinterpret_cast<const char8_t *>(m_Buffer.c_str()), m_Buffer.size()); }
+ void Write(char8_t data) { m_Stream.Write(data); }
+ void Tabs()
+ {
+ QT3DS_FOREACH(idx, (m_OpenElements.size() + m_Tabs))
+ Write('\t');
+ }
+ void Close(bool newline)
+ {
+ if (m_ElementOpen) {
+ Write(">");
+ if (newline)
+ Write('\n');
+ }
+ m_ElementOpen = false;
+ }
+ void Begin(TXMLCharPtr name, TXMLCharPtr ns)
+ {
+ Close(true);
+ Tabs();
+ Write('<');
+ SNameNS theName(name, ns);
+ Write(theName);
+ m_OpenElements.push_back(eastl::pair<SNameNS, bool>(theName, false));
+ m_ElementOpen = true;
+ }
+ TXMLCharPtr ToStr(char8_t val)
+ {
+ m_PrintBuf[0] = val;
+ m_PrintBuf[1] = 0;
+ return m_PrintBuf;
+ }
+ template <typename TDataType>
+ TXMLCharPtr ToStr(TDataType val)
+ {
+ StringConversion<TDataType>().ToStr(val, NVDataRef<char8_t>(m_PrintBuf, 256));
+ return m_PrintBuf;
+ }
+ void Att(TXMLCharPtr name, TXMLCharPtr ns, TXMLCharPtr value)
+ {
+ QT3DS_ASSERT(m_ElementOpen);
+ Write(' ');
+ Write(SNameNS(name, ns));
+
+ Write("=\"");
+
+ QString str = QString::fromUtf8(nonNull(value)).toHtmlEscaped();
+ Write(str.toUtf8().constData());
+ Write("\"");
+ }
+ template <typename TData>
+ void Att(TXMLCharPtr name, TXMLCharPtr ns, TData value)
+ {
+ Att(name, ns, ToStr(value));
+ }
+
+ void Value(TXMLCharPtr value)
+ {
+ if (!isTrivial(value)) {
+ Close(false);
+
+ QString str = QString::fromUtf8(nonNull(value)).toHtmlEscaped();
+ Write(str.toUtf8().constData());
+ m_OpenElements.back().second = true;
+ }
+ }
+ void ChildValue(TXMLCharPtr name, TXMLCharPtr ns, TXMLCharPtr value)
+ {
+ Begin(name, ns);
+ Value(value);
+ End();
+ }
+ void End(bool newlineAfterClose = true)
+ {
+ QT3DS_ASSERT(m_OpenElements.size());
+ eastl::pair<SNameNS, bool> topElem = m_OpenElements.back();
+ m_OpenElements.pop_back();
+ if (m_ElementOpen)
+ Write("/>");
+ else {
+ if (topElem.second == false)
+ Tabs();
+ Write("</");
+ Write(topElem.first);
+ Write(">");
+ }
+ m_ElementOpen = false;
+ if (newlineAfterClose == true)
+ Write('\n');
+ }
+};
+
+struct DOMParser
+{
+ IDOMFactory &m_Factory;
+ SDOMElement *m_TopElement;
+ SDOMElement *m_FirstElement;
+ char8_t m_nsSeparator;
+ typedef eastl::basic_string<char8_t, ForwardingAllocator> TStrType;
+ TStrType m_NSBuffer;
+ TStrType m_NameBuffer;
+ CRegisteredString m_RegName;
+ CRegisteredString m_RegNS;
+ SNamespacePairNode *m_FirstPair;
+ SNamespacePairNode *m_LastPair;
+ QXmlStreamReader *m_XMLParser;
+
+ DOMParser(IDOMFactory &factory, QXmlStreamReader &parser, char8_t nsSeparator)
+ : m_Factory(factory)
+ , m_FirstElement(NULL)
+ , m_nsSeparator(nsSeparator)
+ , m_NSBuffer(ForwardingAllocator(factory.GetAllocator(), "DOMParser::m_NSBuffer"))
+ , m_NameBuffer(ForwardingAllocator(factory.GetAllocator(), "DOMParser::m_NameBuffer"))
+ , m_FirstPair(NULL)
+ , m_LastPair(NULL)
+ , m_XMLParser(&parser)
+ {
+ }
+
+ void ParseName(const XML_Char *name)
+ {
+ m_NSBuffer.assign(name);
+ eastl::string::size_type pos = m_NSBuffer.find(m_nsSeparator);
+ if (pos != TStrType::npos) {
+ m_NameBuffer.assign(m_NSBuffer.c_str() + pos + 1);
+ m_NSBuffer.resize(pos);
+ } else {
+ m_NameBuffer = m_NSBuffer;
+ m_NSBuffer.clear();
+ // Find the namespace with no abbreviation.
+ for (SNamespacePairNode *theNode = m_FirstPair; theNode;
+ theNode = theNode->m_NextNode) {
+ if (theNode->m_Abbreviation.IsValid() == false)
+ m_NSBuffer.assign(theNode->m_Namespace.c_str());
+ }
+ }
+ m_RegName = m_Factory.GetStringTable()->RegisterStr(m_NameBuffer.c_str());
+ m_RegNS = m_Factory.GetStringTable()->RegisterStr(m_NSBuffer.c_str());
+ }
+
+ struct SimpleXmlErrorHandler : public CXmlErrorHandler
+ {
+ void OnXmlError(TXMLCharPtr errorName, int line, int column) override
+ {
+ char8_t buffer[1024];
+ _snprintf(buffer, 1024, "%s(%d): Xml Error %s on line %d, column %d", __FILE__,
+ __LINE__, errorName, line, column);
+#ifdef QT3DS_VC
+ OutputDebugStringA(buffer);
+#endif
+ printf("%s\n", buffer);
+ }
+ };
+
+ template <QT3DSU32 THeaderLen>
+ struct SHeaderInStream : public IInStream
+ {
+ QT3DSU8 m_Header[THeaderLen];
+ IInStream &m_InStream;
+ QT3DSU32 m_BytesRead;
+
+ SHeaderInStream(IInStream &inStream)
+ : m_InStream(inStream)
+ , m_BytesRead(0)
+ {
+ }
+ bool readHeader()
+ {
+ QT3DSU32 amountRead = m_InStream.Read(NVDataRef<QT3DSU8>(m_Header, THeaderLen));
+ return amountRead == THeaderLen;
+ }
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override
+ {
+ if (data.size() == 0)
+ return 0;
+ QT3DSU8 *writePtr(data.begin());
+ QT3DSU32 amountToRead(data.size());
+ QT3DSU32 amountRead = 0;
+ if (m_BytesRead < THeaderLen) {
+ QT3DSU32 headerLeft = NVMin(THeaderLen - m_BytesRead, amountToRead);
+ memCopy(writePtr, m_Header + m_BytesRead, headerLeft);
+ writePtr += headerLeft;
+ amountToRead -= headerLeft;
+ amountRead += headerLeft;
+ }
+ if (amountToRead)
+ amountRead += m_InStream.Read(NVDataRef<QT3DSU8>(writePtr, amountToRead));
+ m_BytesRead += amountRead;
+ return amountRead;
+ }
+ };
+
+ static eastl::pair<SNamespacePairNode *, SDOMElement *>
+ ParseXMLFile(IDOMFactory &factory, IInStream &inStream, CXmlErrorHandler *handler = NULL)
+ {
+ SimpleXmlErrorHandler simpleHandler;
+ if (handler == NULL)
+ handler = &simpleHandler;
+
+ // look for BOM (Byte-Order-Marker) in the file
+ // if found, pass in UTF-16 as the format. else
+ // pass in UTF-8 as the format.
+ SHeaderInStream<sizeof(g_BOMMarker)> theInStream(inStream);
+ if (theInStream.readHeader() == false) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ QT3DSU16 theHeaderData;
+ memCopy(&theHeaderData, theInStream.m_Header, sizeof(g_BOMMarker));
+
+ char8_t nsSeparator = '$';
+
+ if (theHeaderData == g_BOMMarker)
+ qFatal("UTF-16 files not supported");
+
+ QXmlStreamReader sreader;
+ DOMParser domParser(factory, sreader, nsSeparator);
+ QT3DSU8 dataBuf[2048];
+ QT3DSU32 amountRead = 0;
+ do {
+ amountRead = theInStream.Read(toDataRef(dataBuf, 2048));
+ if (amountRead) {
+ QByteArray tmp = QByteArray::fromRawData((char*)dataBuf,amountRead);
+ sreader.addData(tmp);
+ }
+ } while (amountRead > 0);
+ while (!sreader.atEnd()) {
+ QXmlStreamReader::TokenType token = sreader.readNext();
+ if (token == QXmlStreamReader::StartElement) {
+ domParser.m_Factory.IgnoreStrBuf();
+ domParser.ParseName((TXMLCharPtr)sreader.name().toUtf8().data());
+ int line = sreader.lineNumber();
+ SDOMElement *newElem =
+ domParser.m_Factory.NextElement(domParser.m_RegName, domParser.m_RegNS, line);
+ if (domParser.m_FirstElement == NULL) {
+ domParser.m_FirstElement = newElem;
+ domParser.m_TopElement = newElem;
+ } else {
+ domParser.m_TopElement->AppendChild(*newElem);
+ domParser.m_TopElement = newElem;
+ }
+ const QXmlStreamAttributes& attributes = sreader.attributes();
+ for (auto attrib : attributes) {
+ domParser.ParseName((TXMLCharPtr)attrib.name().toUtf8().data());
+ SDOMAttribute *att =
+ domParser.m_Factory.NextAttribute(domParser.m_RegName,
+ (TXMLCharPtr)attrib.value()
+ .toUtf8().data(),
+ domParser.m_RegNS, line);
+ newElem->m_Attributes.push_back(*att);
+ }
+ } else if (token == QXmlStreamReader::Characters) {
+ QByteArray text = sreader.text().toUtf8();
+ domParser.m_Factory.AppendStrBuf(text.data(), text.length());
+ } else if (token == QXmlStreamReader::EndElement) {
+ domParser.m_TopElement->m_Value = domParser.m_Factory.FinalizeStrBuf();
+ domParser.m_TopElement = domParser.m_TopElement->m_Parent;
+ }
+
+ if (sreader.hasError()) {
+ TXMLCharPtr error = (TXMLCharPtr)sreader.errorString().toUtf8().data();
+ handler->OnXmlError(error, sreader.lineNumber(), sreader.columnNumber());
+ return nullptr;
+ }
+
+ }
+ return eastl::make_pair(domParser.m_FirstPair, domParser.m_FirstElement);
+ }
+};
+
+class SimpleDomFactory : public IDOMFactory
+{
+ typedef eastl::basic_string<char8_t, ForwardingAllocator> TNarrowStr;
+ NVAllocatorCallback &m_Allocator;
+ Pool<SDOMElement> m_ElementPool;
+ Pool<SDOMAttribute> m_AttributePool;
+ Pool<SNamespacePairNode> m_NamespaceNodePool;
+ eastl::vector<char8_t *> m_BigStrings;
+ NVScopedRefCounted<IStringTable> m_StringTable;
+ TNarrowStr m_StringBuilder;
+ volatile QT3DSI32 mRefCount;
+
+public:
+ SimpleDomFactory(NVAllocatorCallback &alloc, NVScopedRefCounted<IStringTable> strt)
+ : m_Allocator(alloc)
+ , m_StringTable(strt)
+ , m_StringBuilder(ForwardingAllocator(alloc, "SimpleDomFactory::m_StringBuilder"))
+ , mRefCount(0)
+ {
+ }
+
+ ~SimpleDomFactory()
+ {
+ QT3DS_FOREACH(idx, m_BigStrings.size())
+ m_Allocator.deallocate(m_BigStrings[idx]);
+ m_BigStrings.clear();
+ }
+
+ NVAllocatorCallback &GetAllocator() override { return m_Allocator; }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Allocator)
+
+ TXMLCharPtr RegisterStr(TXMLCharPtr str)
+ {
+ if (str == NULL || *str == 0)
+ return "";
+ return m_StringTable->RegisterStr(str);
+ }
+
+ virtual void Release() { delete this; }
+ void AppendStrBuf(TXMLCharPtr str, QT3DSU32 len) override
+ {
+ if (len && *str) {
+ m_StringBuilder.append(str, str + len);
+ }
+ }
+
+ // Null terminate what is there and return the buffer.
+ // This pointer needs to be persistent.
+ TXMLCharPtr FinalizeStrBuf() override
+ {
+ if (m_StringBuilder.size() == 0)
+ return "";
+ QT3DSU32 len = m_StringBuilder.size() + 1;
+ QT3DSU32 numBytes = len * sizeof(char8_t);
+ char8_t *newMem =
+ (char8_t *)m_Allocator.allocate(numBytes, "DOMFactory::ValueStr", __FILE__, __LINE__);
+ memCopy(newMem, m_StringBuilder.c_str(), numBytes);
+ m_BigStrings.push_back(newMem);
+ m_StringBuilder.clear();
+ return newMem;
+ }
+ void IgnoreStrBuf() override { m_StringBuilder.clear(); }
+
+ SDOMAttribute *NextAttribute(CRegisteredString name, TXMLCharPtr val,
+ CRegisteredString ns, int inLine) override
+ {
+ TXMLCharPtr v(RegisterValue(val));
+ SDOMAttribute *att = (SDOMAttribute *)m_AttributePool.allocate(__FILE__, __LINE__);
+ new (att) SDOMAttribute(name, ns, v, inLine);
+ return att;
+ }
+
+ SDOMElement *NextElement(CRegisteredString name, CRegisteredString ns, int inLine) override
+ {
+ IgnoreStrBuf();
+ SDOMElement *elem = (SDOMElement *)(m_ElementPool.allocate(__FILE__, __LINE__));
+ new (elem) SDOMElement(name, ns, inLine);
+ return elem;
+ }
+
+ SNamespacePairNode *NextNSPairNode(CRegisteredString ns, CRegisteredString abbr) override
+ {
+ return m_NamespaceNodePool.construct(SNamespacePair(ns, abbr), __FILE__, __LINE__);
+ }
+
+ NVScopedRefCounted<IStringTable> GetStringTable() override { return m_StringTable; }
+};
+}
+
+NVScopedRefCounted<IDOMReader>
+IDOMReader::CreateDOMReader(NVAllocatorCallback &inAlloc, SDOMElement &inRootElement,
+ NVScopedRefCounted<IStringTable> inStringTable,
+ NVScopedRefCounted<IDOMFactory> inFactory)
+{
+ return QT3DS_NEW(inAlloc, SDOMReader)(inAlloc, inRootElement, inStringTable, inFactory);
+}
+
+eastl::pair<NVScopedRefCounted<IDOMWriter>, NVScopedRefCounted<IDOMReader>>
+IDOMWriter::CreateDOMWriter(NVScopedRefCounted<IDOMFactory> inFactory, SDOMElement &inRootElement,
+ NVScopedRefCounted<IStringTable> inStringTable)
+{
+ NVScopedRefCounted<SDOMWriter> writer(
+ QT3DS_NEW(inFactory->GetAllocator(), SDOMWriter)(inFactory, inStringTable, inRootElement));
+ return eastl::make_pair(writer.mPtr, writer.mPtr);
+}
+
+TXMLCharPtr IDOMFactory::RegisterValue(TXMLCharPtr inValue)
+{
+ if (isTrivial(inValue))
+ return "";
+ IgnoreStrBuf();
+ AppendStrBuf(inValue, (QT3DSU32)strlen(inValue));
+ return FinalizeStrBuf();
+}
+
+NVScopedRefCounted<IDOMFactory>
+IDOMFactory::CreateDOMFactory(NVAllocatorCallback &inAlloc,
+ NVScopedRefCounted<IStringTable> inStrTable)
+{
+ return QT3DS_NEW(inAlloc, SimpleDomFactory)(inAlloc, inStrTable);
+}
+
+void CDOMSerializer::WriteXMLHeader(IOutStream &inStream)
+{
+ const char8_t *header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
+ QT3DSU32 len = (QT3DSU32)strlen(header);
+ inStream.Write(header, len);
+}
+
+// Lexigraphically sort the attributes.
+struct SAttributeComparator
+{
+ bool operator()(const SDOMAttribute *lhs, const SDOMAttribute *rhs)
+ {
+ int nsCmp = strcmp(lhs->m_Namespace, rhs->m_Namespace);
+ if (nsCmp)
+ return nsCmp < 0;
+
+ return strcmp(lhs->m_Name, rhs->m_Name) < 0;
+ }
+};
+
+typedef eastl::vector<SDOMAttribute *, ForwardingAllocator> TAttVector;
+typedef eastl::hash_map<CRegisteredString, CRegisteredString, eastl::hash<CRegisteredString>,
+ eastl::equal_to<CRegisteredString>, ForwardingAllocator>
+ TNSMap;
+
+CRegisteredString GetOrCreateNamespaceAbbr(NVAllocatorCallback &inAlloc, CRegisteredString theNs,
+ TNSMap &inNamespace, TNSMap &inReverseNamespaces,
+ IStringTable &inStrTable, bool &outCreated)
+{
+ CRegisteredString abbr;
+ if (theNs.IsValid()) {
+ TNSMap::iterator nsIter = inNamespace.find(theNs);
+ if (nsIter != inNamespace.end()) {
+ abbr = nsIter->second;
+ outCreated = false;
+ } else {
+ eastl::basic_string<char8_t, ForwardingAllocator> theStr(
+ ForwardingAllocator(inAlloc, "nsBuilderString"));
+ theStr.assign("a");
+ eastl::basic_string<char8_t, ForwardingAllocator> theNsStr(
+ ForwardingAllocator(inAlloc, "nsBuilderString"));
+ CRegisteredString theNS = inStrTable.RegisterStr(theStr.c_str());
+ while (inReverseNamespaces.find(theNS) != inReverseNamespaces.end()) {
+ for (int idx = 0;
+ idx < 26 && inReverseNamespaces.find(theNS) == inReverseNamespaces.end();
+ ++idx) {
+ theNsStr = theStr;
+ theNsStr.append(1, (char8_t)('a' + idx));
+ theNS = inStrTable.RegisterStr(theNsStr.c_str());
+ }
+ theStr.append(1, 'a');
+ }
+ inNamespace.insert(eastl::make_pair(theNs, theNS));
+ abbr = theNS;
+ outCreated = true;
+ }
+ }
+ return abbr;
+}
+
+// Write an element with attributes sorted by name so a file diff is effective.
+void WriteElement(NVAllocatorCallback &inAlloc, SDOMElement &inElement, SimpleXmlWriter &inWriter,
+ TAttVector &inAttSorter, TNSMap &inNamespace, TNSMap &inReverseNamespaces,
+ IStringTable &inStrTable, bool inTrimEmptyElems, bool inWriteXMLNS)
+{
+ inAttSorter.clear();
+
+ // We decided that we don't want attribute sorting; the code that adds attributes needs
+ // to be consistent.
+ // This element doesn't add anything to the system in this case.
+ if (inTrimEmptyElems && inElement.m_Attributes.empty() && inElement.m_Children.empty()
+ && isTrivial(inElement.m_Value))
+ return;
+
+ for (TAttributeList::iterator iter = inElement.m_Attributes.begin(),
+ end = inElement.m_Attributes.end();
+ iter != end; ++iter)
+ inAttSorter.push_back(&(*iter));
+
+ // Find the namespace for the element
+ bool createdAbbr = false;
+ CRegisteredString abbr = GetOrCreateNamespaceAbbr(inAlloc, inElement.m_Namespace, inNamespace,
+ inReverseNamespaces, inStrTable, createdAbbr);
+
+ inWriter.Begin(inElement.m_Name, abbr);
+ eastl::basic_string<char8_t, ForwardingAllocator> theStr(
+ ForwardingAllocator(inAlloc, "nsBuilderString"));
+ if (inWriteXMLNS) {
+ for (TNSMap::iterator iter = inNamespace.begin(), end = inNamespace.end(); iter != end;
+ ++iter) {
+ theStr.assign("xmlns");
+ if (iter->second.IsValid()) {
+ theStr.append(1, ':');
+ theStr.append(iter->second.c_str());
+ }
+ inWriter.Att(theStr.c_str(), NULL, iter->first.c_str());
+ }
+ } else if (createdAbbr) {
+ theStr.assign("xmlns:");
+ theStr.append(abbr.c_str());
+ inWriter.Att(theStr.c_str(), NULL, inElement.m_Namespace.c_str());
+ }
+
+ const char8_t *theLastAttName = 0;
+ const char8_t *theLastAttNamespace = 0;
+ for (QT3DSU32 idx = 0, end = inAttSorter.size(); idx < end; ++idx) {
+ SDOMAttribute *theAtt(inAttSorter[idx]);
+ if (theAtt->m_Name != theLastAttName || theAtt->m_Namespace != theLastAttNamespace) {
+ abbr = GetOrCreateNamespaceAbbr(inAlloc, theAtt->m_Namespace, inNamespace,
+ inReverseNamespaces, inStrTable, createdAbbr);
+ if (createdAbbr) {
+ theStr.assign("xmlns:");
+ theStr.append(abbr.c_str());
+ inWriter.Att(theStr.c_str(), NULL, inElement.m_Namespace.c_str());
+ }
+
+ inWriter.Att(theAtt->m_Name, abbr, theAtt->m_Value);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ theLastAttName = theAtt->m_Name;
+ theLastAttNamespace = theAtt->m_Namespace;
+ }
+ // Elements can either have children or values but not both at this point.
+ if (inElement.m_Children.empty() == false) {
+ for (SDOMElement::TElementChildList::iterator iter = inElement.m_Children.begin(),
+ end = inElement.m_Children.end();
+ iter != end; ++iter)
+ WriteElement(inAlloc, *iter, inWriter, inAttSorter, inNamespace, inReverseNamespaces,
+ inStrTable, inTrimEmptyElems, false);
+
+ inWriter.End();
+ } else {
+ if (!isTrivial(inElement.m_Value))
+ inWriter.Value(inElement.m_Value);
+
+ inWriter.End();
+ }
+}
+
+void CDOMSerializer::Write(NVAllocatorCallback &inAlloc, SDOMElement &inElement,
+ IOutStream &inStream, IStringTable &inStrTable,
+ NVConstDataRef<SNamespacePair> inNamespaces, bool inTrimEmptyElements,
+ QT3DSU32 inTabs, bool inWriteNamespaces)
+{
+ TAttVector theAttSorter(ForwardingAllocator(inAlloc, "CDOMSerializer::AttributeList"));
+ TNSMap theNamespaces(ForwardingAllocator(inAlloc, "CDOMSerializer::NamespaceMap"));
+ TNSMap theReverseNamespaces(ForwardingAllocator(inAlloc, "CDOMSerializer::NamespaceMap"));
+ for (QT3DSU32 idx = 0, end = inNamespaces.size(); idx < end; ++idx) {
+ theNamespaces.insert(
+ eastl::make_pair(inNamespaces[idx].m_Namespace, inNamespaces[idx].m_Abbreviation));
+ theReverseNamespaces.insert(
+ eastl::make_pair(inNamespaces[idx].m_Abbreviation, inNamespaces[idx].m_Namespace));
+ }
+ SimpleXmlWriter writer(inAlloc, inStream, inTabs);
+ WriteElement(inAlloc, inElement, writer, theAttSorter, theNamespaces, theReverseNamespaces,
+ inStrTable, inTrimEmptyElements, inWriteNamespaces);
+}
+
+eastl::pair<SNamespacePairNode *, SDOMElement *>
+CDOMSerializer::Read(IDOMFactory &inFactory, IInStream &inStream, CXmlErrorHandler *inErrorHandler)
+{
+ return DOMParser::ParseXMLFile(inFactory, inStream, inErrorHandler);
+}
diff --git a/src/foundation/XML.h b/src/foundation/XML.h
new file mode 100644
index 0000000..360bfdd
--- /dev/null
+++ b/src/foundation/XML.h
@@ -0,0 +1,680 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_FOUNDATION_XML_H
+#define QT3DS_FOUNDATION_XML_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "foundation/StringConversion.h" //Conversion between string and various datatypes.
+#include "foundation/Qt3DSFlags.h"
+#include "EASTL/algorithm.h"
+#include "foundation/IOStreams.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ class IStringTable;
+
+ class IDOMFactory;
+
+ class IInStream;
+ class IOutStream;
+ struct SDOMAttribute;
+ struct SDOMElement;
+ struct SNamespacePairNode;
+
+ typedef const char8_t *TXMLCharPtr;
+
+ typedef eastl::basic_string<char8_t, ForwardingAllocator> TXMLStr;
+
+ // When the factor is destroyed, all elements and attributes are destroyed.
+ class IDOMFactory : public NVRefCounted
+ {
+ protected:
+ virtual ~IDOMFactory() {}
+ public:
+ // Str does not need to be null terminated.
+ virtual void AppendStrBuf(TXMLCharPtr str, QT3DSU32 len) = 0;
+ // Null terminate what is there and return the buffer.
+ // This pointer needs to be persistent.
+ virtual TXMLCharPtr FinalizeStrBuf() = 0;
+ virtual void IgnoreStrBuf() = 0;
+
+ virtual SDOMAttribute *NextAttribute(CRegisteredString name, TXMLCharPtr val,
+ CRegisteredString ns = CRegisteredString(),
+ int inLine = 0) = 0;
+ virtual SDOMElement *NextElement(CRegisteredString name,
+ CRegisteredString ns = CRegisteredString(),
+ int inLine = 0) = 0;
+ virtual SNamespacePairNode *NextNSPairNode(CRegisteredString ns,
+ CRegisteredString abbr) = 0;
+
+ TXMLCharPtr RegisterValue(TXMLCharPtr inValue);
+
+ virtual NVScopedRefCounted<IStringTable> GetStringTable() = 0;
+ virtual NVAllocatorCallback &GetAllocator() = 0;
+
+ static NVScopedRefCounted<IDOMFactory>
+ CreateDOMFactory(NVAllocatorCallback &inAllocator,
+ NVScopedRefCounted<IStringTable> inStrTable);
+ };
+
+ struct SDOMAttribute
+ {
+ CRegisteredString m_Namespace;
+ CRegisteredString m_Name;
+ const char8_t *m_Value;
+ SDOMAttribute *m_NextAttribute;
+ SDOMAttribute *m_PreviousAttribute;
+ int m_Line;
+ SDOMAttribute()
+ : m_Value(NULL)
+ , m_NextAttribute(NULL)
+ , m_PreviousAttribute(NULL)
+ , m_Line(0)
+ {
+ }
+
+ SDOMAttribute(CRegisteredString inName, CRegisteredString inNs, const char8_t *inValue,
+ int line)
+ : m_Namespace(inNs)
+ , m_Name(inName)
+ , m_Value(inValue)
+ , m_NextAttribute(NULL)
+ , m_PreviousAttribute(NULL)
+ , m_Line(line)
+ {
+ }
+
+ bool Value(const char8_t *&outValue)
+ {
+ outValue = m_Value;
+ return true;
+ }
+
+ template <typename TDataType>
+ bool Value(TDataType &outValue)
+ {
+ StringConversion<TDataType>().StrTo(m_Value, outValue);
+ return true;
+ }
+ };
+
+ struct SNextAttOp
+ {
+ SDOMAttribute *get(SDOMAttribute &inAtt) { return inAtt.m_NextAttribute; }
+ const SDOMAttribute *get(const SDOMAttribute &inAtt) { return inAtt.m_NextAttribute; }
+ void set(SDOMAttribute &inAtt, SDOMAttribute *next) { inAtt.m_NextAttribute = next; }
+ };
+ struct SPrevAttOp
+ {
+ SDOMAttribute *get(SDOMAttribute &inAtt) { return inAtt.m_PreviousAttribute; }
+ const SDOMAttribute *get(const SDOMAttribute &inAtt) { return inAtt.m_PreviousAttribute; }
+ void set(SDOMAttribute &inAtt, SDOMAttribute *prev) { inAtt.m_PreviousAttribute = prev; }
+ };
+
+ typedef InvasiveLinkedList<SDOMAttribute, SPrevAttOp, SNextAttOp> TAttributeList;
+
+ struct SNamespacePair
+ {
+ CRegisteredString m_Namespace;
+ CRegisteredString m_Abbreviation;
+ SNamespacePair(CRegisteredString ns = CRegisteredString(),
+ CRegisteredString abbr = CRegisteredString())
+ : m_Namespace(ns)
+ , m_Abbreviation(abbr)
+ {
+ }
+ };
+
+ struct SNamespacePairNode : public SNamespacePair
+ {
+ SNamespacePairNode *m_NextNode;
+ SNamespacePairNode(const SNamespacePair &inSrc = SNamespacePair())
+ : SNamespacePair(inSrc)
+ , m_NextNode(NULL)
+ {
+ }
+ };
+
+ // Simplified dom element. All it has is one character value and list of attributes
+ // and children. So you can't mix elements and character data like you can in
+ // full xml, but this simplifies parsing.
+ struct SDOMElement
+ {
+ struct SNextElemOp
+ {
+ SDOMElement *get(SDOMElement &elem) { return elem.m_NextSibling; }
+ const SDOMElement *get(const SDOMElement &elem) { return elem.m_NextSibling; }
+ void set(SDOMElement &elem, SDOMElement *next) { elem.m_NextSibling = next; }
+ };
+ struct SPrevElemOp
+ {
+ SDOMElement *get(SDOMElement &elem) { return elem.m_PreviousSibling; }
+ const SDOMElement *get(const SDOMElement &elem) { return elem.m_PreviousSibling; }
+ void set(SDOMElement &elem, SDOMElement *prev) { elem.m_PreviousSibling = prev; }
+ };
+ typedef InvasiveLinkedList<SDOMElement, SPrevElemOp, SNextElemOp> TElementChildList;
+
+ CRegisteredString m_Namespace;
+ CRegisteredString m_Name;
+ const char8_t *m_Value;
+ SDOMElement *m_Parent;
+ SDOMElement *m_NextSibling;
+ SDOMElement *m_PreviousSibling;
+ TAttributeList m_Attributes;
+ TElementChildList m_Children;
+ int m_Line;
+
+ SDOMElement()
+ : m_Value(NULL)
+ , m_Parent(NULL)
+ , m_NextSibling(NULL)
+ , m_PreviousSibling(NULL)
+ , m_Line(0)
+ {
+ }
+
+ SDOMElement(CRegisteredString name, CRegisteredString ns, int inLine)
+ : m_Namespace(ns)
+ , m_Name(name)
+ , m_Value(NULL)
+ , m_Parent(NULL)
+ , m_NextSibling(NULL)
+ , m_PreviousSibling(NULL)
+ , m_Line(inLine)
+ {
+ }
+
+ void AppendChild(SDOMElement &inElem, SDOMElement *inPos = NULL)
+ {
+ if (inElem.m_Parent)
+ inElem.m_Parent->RemoveChild(inElem);
+ inElem.m_Parent = this;
+ if (inPos) {
+ QT3DS_ASSERT(inPos->m_Parent == this);
+ m_Children.insert_after(*inPos, inElem);
+ } else
+ m_Children.push_back(inElem);
+ }
+
+ void PrependChild(SDOMElement &inElem, SDOMElement *inPos = NULL)
+ {
+ if (inElem.m_Parent)
+ inElem.m_Parent->RemoveChild(inElem);
+ inElem.m_Parent = this;
+ if (inPos) {
+ QT3DS_ASSERT(inPos->m_Parent == this);
+ m_Children.insert_before(*inPos, inElem);
+ } else
+ m_Children.push_front(inElem);
+ }
+
+ void RemoveChild(SDOMElement &inElem)
+ {
+ if (inElem.m_Parent == this) {
+ m_Children.remove(inElem);
+ } else {
+ if (inElem.m_Parent) {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ SDOMElement *FindNext(CRegisteredString inName, Option<CRegisteredString> inNamespace,
+ TElementChildList::iterator iter)
+ {
+ for (TElementChildList::iterator end(NULL); iter != end; ++iter) {
+ if (inName.IsValid() == false || inName == iter->m_Name) {
+ if (inNamespace.hasValue() == false || *inNamespace == iter->m_Namespace)
+ return &(*iter);
+ }
+ }
+ return NULL;
+ }
+ // Search starts just *after inStartPos if provided
+ SDOMElement *FindChild(CRegisteredString inName, Option<CRegisteredString> inNamespace,
+ SDOMElement *inStartPos = NULL)
+ {
+ TElementChildList::iterator iter = m_Children.begin();
+ if (inStartPos) {
+ QT3DS_ASSERT(inStartPos->m_Parent == this);
+ iter = TElementChildList::iterator(inStartPos->m_NextSibling);
+ }
+ return FindNext(inName, inNamespace, iter);
+ }
+ // Search starts just *after inStartPos if provided
+ SDOMElement *FindSibling(CRegisteredString inName, Option<CRegisteredString> inNamespace)
+ {
+ TElementChildList::iterator iter(m_NextSibling);
+ return FindNext(inName, inNamespace, iter);
+ }
+
+ SDOMAttribute *FindAttribute(CRegisteredString inName,
+ Option<CRegisteredString> inNamespace)
+ {
+ for (TAttributeList::iterator iter = m_Attributes.begin(), end = m_Attributes.end();
+ iter != end; ++iter) {
+ if (iter->m_Name == inName) {
+ if (inNamespace.hasValue() == false || *inNamespace == iter->m_Namespace)
+ return &(*iter);
+ }
+ }
+ return NULL;
+ }
+
+ template <typename TDataType>
+ bool AttValue(CRegisteredString inName, Option<CRegisteredString> inNamespace,
+ TDataType &outValue)
+ {
+ SDOMAttribute *att = FindAttribute(inName, inNamespace);
+ if (att)
+ return att->Value(outValue);
+ return false;
+ }
+
+ QT3DSU32 GetNumChildren(CRegisteredString inName,
+ Option<CRegisteredString> inNamespace = Empty()) const
+ {
+ QT3DSU32 count = 0;
+ if (inName.IsValid() == false) {
+ // empty loop intentional
+ for (TElementChildList::iterator iter = m_Children.begin(), end = m_Children.end();
+ iter != end; ++iter, ++count)
+ ;
+ } else {
+ for (TElementChildList::iterator iter = m_Children.begin(), end = m_Children.end();
+ iter != end; ++iter) {
+ if (iter->m_Name == inName
+ && (inNamespace.isEmpty() || iter->m_Namespace == *inNamespace))
+ ++count;
+ }
+ }
+ return count;
+ }
+
+ void SetAttributeValue(CRegisteredString inName, Option<CRegisteredString> inNamespace,
+ TXMLCharPtr inValue, IDOMFactory &inFactory, int inLine)
+ {
+ SDOMAttribute *att = FindAttribute(inName, inNamespace);
+ if (att) {
+ att->m_Value = inFactory.RegisterValue(inValue);
+ } else {
+ m_Attributes.push_back(*inFactory.NextAttribute(
+ inName, inValue, inNamespace.unsafeGetValue(), inLine));
+ }
+ }
+
+ void RemoveAttribute(CRegisteredString nm, Option<CRegisteredString> inNamespace)
+ {
+ SDOMAttribute *theAttribute = FindAttribute(nm, inNamespace);
+ if (theAttribute)
+ m_Attributes.remove(*theAttribute);
+ }
+ };
+
+ struct SReaderScope
+ {
+ SDOMElement *m_Element;
+ SDOMAttribute *m_Attribute;
+ SReaderScope(SDOMElement *inElem = NULL, SDOMAttribute *inAtt = NULL)
+ : m_Element(inElem)
+ , m_Attribute(inAtt)
+ {
+ }
+ };
+
+ class IDOMReader : public NVRefCounted
+ {
+ protected:
+ virtual ~IDOMReader() {}
+ public:
+ // Stack object to save the reader's state.
+ struct Scope
+ {
+ IDOMReader &m_Reader;
+ Scope(IDOMReader &reader)
+ : m_Reader(reader)
+ {
+ m_Reader.PushScope();
+ }
+ Scope(NVScopedRefCounted<IDOMReader> reader)
+ : m_Reader(*reader)
+ {
+ m_Reader.PushScope();
+ }
+ ~Scope() { m_Reader.PopScope(); }
+ };
+
+ // Parse buffer
+ MemoryBuffer<ForwardingAllocator> m_TempBuf;
+ NVScopedRefCounted<IStringTable> m_StringTable;
+
+ IDOMReader(NVAllocatorCallback &inAlloc, NVScopedRefCounted<IStringTable> inStringTable)
+ : m_TempBuf(ForwardingAllocator(inAlloc, "IDOMReader::m_TempBuf"))
+ , m_StringTable(inStringTable)
+ {
+ }
+
+ NVScopedRefCounted<IStringTable> GetStringTable() { return m_StringTable; }
+
+ // Pushing scope saves your state so no matter where you are when
+ // you next pop scope, you come back to the same state.
+ virtual void PushScope() = 0;
+ virtual void PopScope() = 0;
+
+ // Sometimes pushing and popping scope isn't enough and you need
+ // somewhat random access to scope.
+ // This scope does not remember the current attribute.
+ virtual SReaderScope GetScope() = 0;
+ virtual void SetScope(SReaderScope inScope) = 0;
+ // Return an attribute whose value is *not* registered with the string table.
+ // You can't hold onto this value for any length of time, but when you need to
+ // immediately convert to a different value this is the most efficient way.
+ virtual bool UnregisteredAtt(TXMLCharPtr name, TXMLCharPtr &outValue,
+ TXMLCharPtr ns = NULL) = 0;
+ // Return an attribute whose value *is* registered with the string table.
+ virtual bool Att(TXMLCharPtr name, CRegisteredString &outValue, TXMLCharPtr ns = NULL) = 0;
+ virtual SDOMAttribute *GetFirstAttribute() = 0;
+ virtual SDOMAttribute *GetNextAttribute() = 0;
+ virtual QT3DSU32 CountChildren(TXMLCharPtr childName = NULL, TXMLCharPtr ns = NULL) = 0;
+ virtual bool MoveToFirstChild(TXMLCharPtr childName = NULL, TXMLCharPtr ns = NULL) = 0;
+ virtual bool MoveToNextSibling(TXMLCharPtr siblingName = NULL, TXMLCharPtr ns = NULL) = 0;
+ // Leave element means go to its parent.
+ virtual void Leave() = 0;
+ virtual SDOMElement *GetElement() const = 0;
+ CRegisteredString GetElementName() const
+ {
+ SDOMElement *elem = GetElement();
+ if (elem)
+ return elem->m_Name;
+ return CRegisteredString();
+ }
+
+ // Value is the concatentated text node values inside the element
+ virtual bool Value(TXMLCharPtr &outValue) = 0;
+
+ // Get the element this reader was created with
+ virtual SDOMElement *GetTopElement() = 0;
+
+ bool Att(TXMLCharPtr name, TXMLStr &outValue)
+ {
+ TXMLCharPtr temp;
+ if (UnregisteredAtt(name, temp)) {
+ outValue.assign(temp);
+ return true;
+ }
+ return false;
+ }
+
+ template <typename TDataType>
+ bool Att(TXMLCharPtr name, TDataType &outValue)
+ {
+ TXMLCharPtr temp;
+ if (UnregisteredAtt(name, temp)) {
+ StringConversion<TDataType>().StrTo(temp, outValue);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ bool ChildValue(TXMLCharPtr name, TXMLCharPtr &value)
+ {
+ if (MoveToFirstChild(name)) {
+ Value(value);
+ Leave();
+ return true;
+ }
+ return false;
+ }
+
+ bool RegisteredChildValue(TXMLCharPtr name, TXMLCharPtr &value)
+ {
+ if (MoveToFirstChild(name)) {
+ RegisteredValue(value);
+ Leave();
+ return true;
+ }
+ return false;
+ }
+ bool RegisteredValue(TXMLCharPtr &outValue)
+ {
+ bool retval = Value(outValue);
+ if (retval)
+ outValue = m_StringTable->RegisterStr(outValue);
+ return retval;
+ }
+
+ template <typename TDataType>
+ bool Value(TDataType &outValue)
+ {
+ TXMLCharPtr value;
+ if (Value(value)) {
+ StringConversion<TDataType>().StrTo(value, outValue);
+ return true;
+ }
+ return false;
+ }
+
+ // IDOMReader implementations
+ template <typename TDataType>
+ bool ValueList(NVDataRef<TDataType> data)
+ {
+ const char8_t *value;
+ if (Value(value)) {
+ Char8TReader reader(const_cast<char8_t *>(value), m_TempBuf);
+ reader.ReadRef(data);
+ }
+ return true;
+ }
+
+ // Destructive operation because we can't trust
+ // strtod to do the right thing. On windows, for long strings,
+ // it calls strlen every operation thus leading to basically N^2
+ // behavior
+ template <typename TDataType>
+ NVConstDataRef<TDataType> ChildValueList(TXMLCharPtr listName)
+ {
+ NVConstDataRef<TDataType> retval;
+ TXMLCharPtr childValue = NULL;
+ if (ChildValue(listName, childValue)) {
+ Char8TReader reader(const_cast<char8_t *>(childValue), m_TempBuf);
+ reader.ReadBuffer(retval);
+ }
+ return retval;
+ }
+
+ template <typename TSerializer>
+ void Serialize(const char8_t *elemName, TSerializer &serializer,
+ const char8_t *inNamespace = NULL)
+ {
+ IDOMReader::Scope __theScope(*this);
+ if (MoveToFirstChild(elemName, inNamespace)) {
+ serializer.Serialize(*this);
+ }
+ }
+ // Optionally hold on to the factory to keep our elements in memory as long as we are.
+ static NVScopedRefCounted<IDOMReader> CreateDOMReader(
+ NVAllocatorCallback &inAlloc, SDOMElement &inRootElement,
+ NVScopedRefCounted<IStringTable> inStringTable,
+ NVScopedRefCounted<IDOMFactory> inFactory = NVScopedRefCounted<IDOMFactory>());
+ };
+
+ // Write out data in an xml-like fasion without specifying exactly
+ // where that data is being written.
+ class IDOMWriter : public NVRefCounted
+ {
+ protected:
+ virtual ~IDOMWriter() {}
+ public:
+ // Control the element scope.
+ struct Scope
+ {
+ IDOMWriter &m_Writer;
+ Scope(IDOMWriter &writer, TXMLCharPtr inElemName, TXMLCharPtr inNamespace = NULL)
+ : m_Writer(writer)
+ {
+ m_Writer.Begin(inElemName, inNamespace);
+ }
+ ~Scope() { m_Writer.End(); }
+ };
+
+ char8_t m_NarrowBuf[256];
+
+ // There tend to be two types of elements.
+ // Containers (<a>\n\t<b/><b/>\n</a>)
+ // and Values <b>onetwothree</b>
+ virtual void Begin(TXMLCharPtr inElemName, TXMLCharPtr inNamespace = NULL,
+ int inLine = 0) = 0;
+ // Attributes. They may be sorted just before write
+ virtual void Att(TXMLCharPtr name, TXMLCharPtr value, TXMLCharPtr inNamespace = NULL,
+ int inLine = 0) = 0;
+ virtual void Value(TXMLCharPtr value) = 0;
+ virtual void End() = 0;
+ virtual void RemoveCurrent() = 0;
+ virtual void RemoveAttribute(TXMLCharPtr inItem, TXMLCharPtr inNamespace = NULL) = 0;
+ // Get the number of tabs required to line up the next line
+ // with the opening of the previous line
+ virtual QT3DSU32 GetTabs() = 0;
+ virtual SDOMElement *GetTopElement() = 0;
+ virtual NVScopedRefCounted<IDOMFactory> GetFactory() = 0;
+ // Move this item before this sibling. Function does not rearrange the
+ // tree in any major way and will not work if inItem and inSibling aren't
+ // siblings.
+ virtual void MoveBefore(TXMLCharPtr inItem, TXMLCharPtr inSibling,
+ TXMLCharPtr inNamespace = NULL) = 0;
+ virtual NVAllocatorCallback &GetAllocator() = 0;
+
+ virtual void ChildValue(TXMLCharPtr name, TXMLCharPtr value, TXMLCharPtr inNamespace = NULL)
+ {
+ Begin(name, inNamespace);
+ Value(value);
+ End();
+ }
+
+ TXMLCharPtr ToStr(char8_t val)
+ {
+ m_NarrowBuf[0] = val;
+ m_NarrowBuf[1] = 0;
+ return m_NarrowBuf;
+ }
+
+ template <typename TDataType>
+ TXMLCharPtr ToStr(TDataType val)
+ {
+ StringConversion<TDataType>().ToStr(val, NVDataRef<char8_t>(m_NarrowBuf, 256));
+ return m_NarrowBuf;
+ }
+
+ void Att(TXMLCharPtr name, const TXMLStr &inValue, TXMLCharPtr inNamespace = NULL)
+ {
+ return Att(name, inValue.c_str(), inNamespace);
+ }
+
+ template <typename TData>
+ void Att(TXMLCharPtr name, TData value, TXMLCharPtr inNamespace = NULL)
+ {
+ Att(name, ToStr(value), inNamespace);
+ }
+
+ template <typename TSerializer>
+ void Serialize(const char8_t *elemName, TSerializer &serializer,
+ TXMLCharPtr inNamespace = NULL)
+ {
+ IDOMWriter::Scope __theScope(*this, elemName, inNamespace);
+ serializer.Serialize(*this);
+ }
+
+ NVScopedRefCounted<IDOMReader> CreateDOMReader()
+ {
+ NVScopedRefCounted<IDOMFactory> theFactory(GetFactory());
+ return IDOMReader::CreateDOMReader(GetAllocator(), *GetTopElement(),
+ theFactory->GetStringTable(), theFactory);
+ }
+
+ // Note that the default method of creating a writer also creates a reader; they can
+ // both manipulation the DOM hierarch.
+ static eastl::pair<NVScopedRefCounted<IDOMWriter>, NVScopedRefCounted<IDOMReader>>
+ CreateDOMWriter(NVScopedRefCounted<IDOMFactory> inFactory, SDOMElement &inRootElement,
+ NVScopedRefCounted<IStringTable> inStringTable);
+
+ static eastl::pair<NVScopedRefCounted<IDOMWriter>, NVScopedRefCounted<IDOMReader>>
+ CreateDOMWriter(NVAllocatorCallback &inAlloc, const char8_t *inTopElemName,
+ NVScopedRefCounted<IStringTable> inStringTable,
+ const char8_t *inNamespace = NULL)
+ {
+ NVScopedRefCounted<IDOMFactory> theFactory(
+ IDOMFactory::CreateDOMFactory(inAlloc, inStringTable));
+ SDOMElement *theRoot =
+ theFactory->NextElement(theFactory->GetStringTable()->RegisterStr(inTopElemName),
+ theFactory->GetStringTable()->RegisterStr(inNamespace));
+ return CreateDOMWriter(theFactory, *theRoot, inStringTable);
+ }
+ };
+
+ class CXmlErrorHandler
+ {
+ protected:
+ virtual ~CXmlErrorHandler() {}
+ public:
+ virtual void OnXmlError(TXMLCharPtr errorName, int line, int column) = 0;
+ };
+
+ class CDOMSerializer
+ {
+ public:
+ static void WriteXMLHeader(IOutStream &inStream);
+
+ // Write out the elements. These pairs will be used in order to abbreviate namespaces with
+ // nicer abbreviations.
+ // Any namespaces not found in those pairs will get auto-generated abbreviations
+ // The document will be assumed to be in the namespace that has no abbreviation.
+ // For fragments or snippets, it is better to avoid writing out the namespace declarations
+ static void
+ Write(NVAllocatorCallback &inAlloc, SDOMElement &inElement, IOutStream &inStream,
+ IStringTable &inStrTable,
+ NVConstDataRef<SNamespacePair> inNamespaces = NVConstDataRef<SNamespacePair>(),
+ bool inTrimEmptyElements = true, QT3DSU32 inTabs = 0, bool inWriteNamespaces = true);
+
+ // Returns a pair of the namespace pair nodes and the dom element. The ns pair nodes allow
+ // us to at least keep the same abbreviations
+ // used if namespace are used.
+ static eastl::pair<SNamespacePairNode *, SDOMElement *>
+ Read(IDOMFactory &inFactory, IInStream &inStream, CXmlErrorHandler *inErrorHandler = NULL);
+ };
+}
+}
+#endif
diff --git a/src/foundation/linux/LICENSE.TXT b/src/foundation/linux/LICENSE.TXT
new file mode 100644
index 0000000..f40caef
--- /dev/null
+++ b/src/foundation/linux/LICENSE.TXT
@@ -0,0 +1,7 @@
+ Copyright (c) 2001 Intel Corporation.
+
+Permition is granted to use, copy, distribute and prepare derivative works
+of this library for any purpose and without fee, provided, that the above
+copyright notice and this statement appear in all copies.
+Intel makes no representations about the suitability of this library for
+any purpose, and specifically disclaims all warranties.
diff --git a/src/foundation/linux/Qt3DSLinuxAoS.h b/src/foundation/linux/Qt3DSLinuxAoS.h
new file mode 100644
index 0000000..6bcb440
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxAoS.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_LINUX_AOS_H
+#define QT3DS_LINUX_AOS_H
+
+// no includes here! this file should be included from NVcVecMath.h only!!!
+
+#if !COMPILE_VECTOR_INTRINSICS
+#error Vector intrinsics should not be included when using scalar implementation.
+#endif
+
+// only SSE compatible platforms should reach this
+// likely to be split up when we add NEON support.
+#include <xmmintrin.h>
+
+typedef union UnionM128 {
+ UnionM128() {}
+ UnionM128(__m128 in) { m128 = in; }
+
+ UnionM128(__m128i in) { m128i = in; }
+
+ operator __m128() { return m128; }
+
+ operator const __m128() const { return m128; }
+
+ float m128_f32[4];
+ __int8_t m128_i8[16];
+ __int16_t m128_i16[8];
+ __int32_t m128_i32[4];
+ __int64_t m128_i64[2];
+ __uint16_t m128_u16[8];
+ __uint32_t m128_u32[4];
+ __uint64_t m128_u64[2];
+ __m128 m128;
+ __m128i m128i;
+} UnionM128;
+
+typedef __m128 FloatV;
+typedef __m128 Vec3V;
+typedef __m128 Vec4V;
+typedef __m128 BoolV;
+typedef __m128 QuatV;
+// typedef __m128 VecU32V;
+// typedef __m128 VecI32V;
+// typedef __m128 VecU16V;
+// typedef __m128 VecI16V;
+// typedef __m128 VecU8V;
+typedef UnionM128 VecU32V;
+typedef UnionM128 VecI32V;
+typedef UnionM128 VecU16V;
+typedef UnionM128 VecI16V;
+typedef UnionM128 VecU8V;
+
+#define FloatVArg FloatV &
+#define Vec3VArg Vec3V &
+#define Vec4VArg Vec4V &
+#define BoolVArg BoolV &
+#define VecU32VArg VecU32V &
+#define VecI32VArg VecI32V &
+#define VecU16VArg VecU16V &
+#define VecI16VArg VecI16V &
+#define VecU8VArg VecU8V &
+#define QuatVArg QuatV &
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat33V
+{
+ Mat33V() {}
+ Mat33V(const Vec3V &c0, const Vec3V &c1, const Vec3V &c2)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ {
+ }
+ Vec3V QT3DS_ALIGN(16, col0);
+ Vec3V QT3DS_ALIGN(16, col1);
+ Vec3V QT3DS_ALIGN(16, col2);
+} QT3DS_ALIGN_SUFFIX(16);
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat34V
+{
+ Mat34V() {}
+ Mat34V(const Vec3V &c0, const Vec3V &c1, const Vec3V &c2, const Vec3V &c3)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ , col3(c3)
+ {
+ }
+ Vec3V QT3DS_ALIGN(16, col0);
+ Vec3V QT3DS_ALIGN(16, col1);
+ Vec3V QT3DS_ALIGN(16, col2);
+ Vec3V QT3DS_ALIGN(16, col3);
+} QT3DS_ALIGN_SUFFIX(16);
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat43V
+{
+ Mat43V() {}
+ Mat43V(const Vec4V &c0, const Vec4V &c1, const Vec4V &c2)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ {
+ }
+ Vec4V QT3DS_ALIGN(16, col0);
+ Vec4V QT3DS_ALIGN(16, col1);
+ Vec4V QT3DS_ALIGN(16, col2);
+} QT3DS_ALIGN_SUFFIX(16);
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat44V
+{
+ Mat44V() {}
+ Mat44V(const Vec4V &c0, const Vec4V &c1, const Vec4V &c2, const Vec4V &c3)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ , col3(c3)
+ {
+ }
+ Vec4V QT3DS_ALIGN(16, col0);
+ Vec4V QT3DS_ALIGN(16, col1);
+ Vec4V QT3DS_ALIGN(16, col2);
+ Vec4V QT3DS_ALIGN(16, col3);
+} QT3DS_ALIGN_SUFFIX(16);
+
+#endif // QT3DS_LINUX_AOS_H
diff --git a/src/foundation/linux/Qt3DSLinuxAtomic.cpp b/src/foundation/linux/Qt3DSLinuxAtomic.cpp
new file mode 100644
index 0000000..f0045dd
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxAtomic.cpp
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAtomic.h"
+#ifdef __QNX__
+#include <atomic.h>
+#endif
+#ifdef __INTEGRITY
+#include <QtCore/qmutex.h>
+#endif
+
+#define PAUSE() asm("nop")
+
+namespace qt3ds {
+namespace foundation {
+#ifdef __QNX__
+ QT3DSI32 atomicIncrement(volatile QT3DSI32 *val)
+ {
+ atomic_add((volatile unsigned *)val, 1);
+ return *val;
+ }
+
+ QT3DSI32 atomicDecrement(volatile QT3DSI32 *val)
+ {
+ atomic_sub((volatile unsigned *)val, 1);
+ return *val;
+ }
+#elif defined (__INTEGRITY)
+ // TestAndSet and AtomicModify take in volatile Address* leading to overflow error if used
+
+ QT3DSI32 atomicCompareExchange(volatile QT3DSI32 *dest, QT3DSI32 exch, QT3DSI32 comp)
+ {
+ static QMutex mutex;
+ QMutexLocker lock(&mutex);
+ QT3DSI32 ret = *dest;
+ *dest = (*dest == comp) ? exch : ret;
+ return ret;
+ }
+
+ QT3DSI32 atomicIncrement(volatile QT3DSI32 *val)
+ {
+ static QMutex mutex;
+ QMutexLocker lock(&mutex);
+ return ++(*val);
+ }
+
+ QT3DSI32 atomicDecrement(volatile QT3DSI32 *val)
+ {
+ static QMutex mutex;
+ QMutexLocker lock(&mutex);
+ return --(*val);
+ }
+#else
+ void *atomicCompareExchangePointer(volatile void **dest, void *exch, void *comp)
+ {
+ return __sync_val_compare_and_swap((void **)dest, comp, exch);
+ }
+
+ QT3DSI32 atomicCompareExchange(volatile QT3DSI32 *dest, QT3DSI32 exch, QT3DSI32 comp)
+ {
+ return __sync_val_compare_and_swap(dest, comp, exch);
+ }
+
+ QT3DSI32 atomicIncrement(volatile QT3DSI32 *val) { return __sync_add_and_fetch(val, 1); }
+
+ QT3DSI32 atomicDecrement(volatile QT3DSI32 *val) { return __sync_sub_and_fetch(val, 1); }
+
+ QT3DSI32 atomicAdd(volatile QT3DSI32 *val, QT3DSI32 delta) { return __sync_add_and_fetch(val, delta); }
+
+ QT3DSI32 atomicMax(volatile QT3DSI32 *val, QT3DSI32 val2)
+ {
+ QT3DSI32 oldVal, newVal;
+
+ do {
+ PAUSE();
+ oldVal = *val;
+
+ if (val2 > oldVal)
+ newVal = val2;
+ else
+ newVal = oldVal;
+
+ } while (atomicCompareExchange(val, newVal, oldVal) != oldVal);
+
+ return *val;
+ }
+
+ QT3DSI32 atomicExchange(volatile QT3DSI32 *val, QT3DSI32 val2)
+ {
+ QT3DSI32 newVal, oldVal;
+
+ do {
+ PAUSE();
+ oldVal = *val;
+ newVal = val2;
+ } while (atomicCompareExchange(val, newVal, oldVal) != oldVal);
+
+ return newVal;
+ }
+#endif
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/linux/Qt3DSLinuxFPU.cpp b/src/foundation/linux/Qt3DSLinuxFPU.cpp
new file mode 100644
index 0000000..c3eae21
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxFPU.cpp
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/Qt3DSFPU.h"
+#include <fenv.h>
+
+QT3DS_COMPILE_TIME_ASSERT(8 * sizeof(qt3ds::QT3DSU32) >= sizeof(fenv_t));
+
+qt3ds::foundation::FPUGuard::FPUGuard()
+{
+#ifdef __CYGWIN__
+#pragma message "FPUGuard::FPUGuard() is not implemented"
+#else
+ fegetenv(reinterpret_cast<fenv_t *>(mControlWords));
+ fesetenv(FE_DFL_ENV);
+#endif
+}
+
+qt3ds::foundation::FPUGuard::~FPUGuard()
+{
+#ifdef __CYGWIN__
+#pragma message "FPUGuard::~FPUGuard() is not implemented"
+#else
+ fesetenv(reinterpret_cast<fenv_t *>(mControlWords));
+#endif
+}
diff --git a/src/foundation/linux/Qt3DSLinuxFile.h b/src/foundation/linux/Qt3DSLinuxFile.h
new file mode 100644
index 0000000..1369735
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxFile.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_LINUX_FILE_H
+#define QT3DS_FOUNDATION_QT3DS_LINUX_FILE_H
+
+#include "foundation/Qt3DS.h"
+#include <stdio.h>
+
+namespace qt3ds {
+namespace foundation {
+ QT3DS_INLINE int fopen_s(FILE **_File, const char *_Filename, const char *_Mode)
+ {
+ FILE *fp = ::fopen(_Filename, _Mode);
+ return fp ? *_File = fp, 0 : -1;
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/linux/Qt3DSLinuxInlineAoS.h b/src/foundation/linux/Qt3DSLinuxInlineAoS.h
new file mode 100644
index 0000000..0443ba9
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxInlineAoS.h
@@ -0,0 +1,2666 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// Copyright (c) 2001 Intel Corporation.
+//
+// Permition is granted to use, copy, distribute and prepare derivative works
+// of this library for any purpose and without fee, provided, that the above
+// copyright notice and this statement appear in all copies.
+// Intel makes no representations about the suitability of this library for
+// any purpose, and specifically disclaims all warranties.
+// See LEGAL.TXT for all the legal information.
+//
+
+#ifndef QT3DS_LINUX_INLINE_AOS_H
+#define QT3DS_LINUX_INLINE_AOS_H
+
+#if !COMPILE_VECTOR_INTRINSICS
+#error Vector intrinsics should not be included when using scalar implementation.
+#endif
+
+// Remove this define when all platforms use simd solver.
+#define QT3DS_SUPPORT_SIMD
+
+#define _QT3DS_FPCLASS_SNAN 0x0001 /* signaling NaN */
+#define _QT3DS_FPCLASS_QNAN 0x0002 /* quiet NaN */
+#define _QT3DS_FPCLASS_NINF 0x0004 /* negative infinity */
+#define _QT3DS_FPCLASS_PINF 0x0200 /* positive infinity */
+
+QT3DS_FORCE_INLINE __m128 m128_I2F(__m128i n)
+{
+ return _mm_castsi128_ps(n);
+}
+QT3DS_FORCE_INLINE __m128i m128_F2I(__m128 n)
+{
+ return _mm_castps_si128(n);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAllTrue4_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return moveMask == (0xf);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAnyTrue4_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return moveMask != (0x0);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAllTrue3_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return (moveMask & 0x7) == (0x7);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAnyTrue3_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return (moveMask & 0x7) != (0x0);
+}
+
+/////////////////////////////////////////////////////////////////////
+////FUNCTIONS USED ONLY FOR ASSERTS IN VECTORISED IMPLEMENTATIONS
+/////////////////////////////////////////////////////////////////////
+
+QT3DS_FORCE_INLINE QT3DSU32 FiniteTestEq(const Vec4V a, const Vec4V b)
+{
+ // This is a bit of a bodge.
+ //_mm_comieq_ss returns 1 if either value is nan so we need to re-cast a and b with true encoded
+ //as a non-nan number.
+ // There must be a better way of doing this in sse.
+ const BoolV one = FOne();
+ const BoolV zero = FZero();
+ const BoolV a1 = V4Sel(a, one, zero);
+ const BoolV b1 = V4Sel(b, one, zero);
+ return (_mm_comieq_ss(a1, b1) && _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(1, 1, 1, 1)),
+ _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(1, 1, 1, 1)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(2, 2, 2, 2)),
+ _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(2, 2, 2, 2)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(3, 3, 3, 3)),
+ _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(3, 3, 3, 3))));
+}
+
+QT3DS_FORCE_INLINE bool isValidFloatV(const FloatV a)
+{
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3))));
+}
+
+QT3DS_FORCE_INLINE bool isValidVec3V(const Vec3V a)
+{
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FZero()) ? true : false);
+}
+
+QT3DS_FORCE_INLINE bool isFiniteFloatV(const FloatV a)
+{
+ const QT3DSU32 badNumber =
+ (_QT3DS_FPCLASS_SNAN | _QT3DS_FPCLASS_QNAN | _QT3DS_FPCLASS_NINF | _QT3DS_FPCLASS_PINF);
+ const FloatV vBadNum = FloatV_From_F32((QT3DSF32 &)badNumber);
+ const BoolV vMask = BAnd(vBadNum, a);
+ return FiniteTestEq(vMask, BFFFF()) == 1;
+}
+
+QT3DS_FORCE_INLINE bool isFiniteVec3V(const Vec3V a)
+{
+ const QT3DSU32 badNumber =
+ (_QT3DS_FPCLASS_SNAN | _QT3DS_FPCLASS_QNAN | _QT3DS_FPCLASS_NINF | _QT3DS_FPCLASS_PINF);
+ const Vec3V vBadNum = Vec3V_From_F32((QT3DSF32 &)badNumber);
+ const BoolV vMask = BAnd(BAnd(vBadNum, a), BTTTF());
+ return FiniteTestEq(vMask, BFFFF()) == 1;
+}
+
+QT3DS_FORCE_INLINE bool isFiniteVec4V(const Vec4V a)
+{
+ /*Vec4V a;
+ QT3DS_ALIGN(16, QT3DSF32 f[4]);
+ F32Array_Aligned_From_Vec4V(a, f);
+ return NVIsFinite(f[0])
+ && NVIsFinite(f[1])
+ && NVIsFinite(f[2])
+ && NVIsFinite(f[3]);*/
+
+ const QT3DSU32 badNumber =
+ (_QT3DS_FPCLASS_SNAN | _QT3DS_FPCLASS_QNAN | _QT3DS_FPCLASS_NINF | _QT3DS_FPCLASS_PINF);
+ const Vec4V vBadNum = Vec4V_From_F32((QT3DSF32 &)badNumber);
+ const BoolV vMask = BAnd(vBadNum, a);
+
+ return FiniteTestEq(vMask, BFFFF()) == 1;
+}
+
+QT3DS_FORCE_INLINE bool hasZeroElementinFloatV(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FloatV_From_F32(0.0f))
+ ? true
+ : false);
+}
+
+QT3DS_FORCE_INLINE bool hasZeroElementInVec3V(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FloatV_From_F32(0.0f))
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FloatV_From_F32(0.0f))
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FloatV_From_F32(0.0f)));
+}
+
+QT3DS_FORCE_INLINE bool hasZeroElementInVec4V(const Vec4V a)
+{
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FloatV_From_F32(0.0f))
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FloatV_From_F32(0.0f))
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FloatV_From_F32(0.0f))
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FloatV_From_F32(0.0f)));
+}
+
+/////////////////////////////////////////////////////////////////////
+////VECTORISED FUNCTION IMPLEMENTATIONS
+/////////////////////////////////////////////////////////////////////
+
+QT3DS_FORCE_INLINE FloatV FloatV_From_F32(const QT3DSF32 f)
+{
+ return (_mm_load1_ps(&f));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_F32(const QT3DSF32 f)
+{
+ return _mm_set_ps(0.0f, f, f, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_F32(const QT3DSF32 f)
+{
+ return (_mm_load1_ps(&f));
+}
+
+QT3DS_FORCE_INLINE BoolV BoolV_From_Bool32(const bool f)
+{
+ const QT3DSU32 i = -(QT3DSI32)f;
+ return _mm_load1_ps((float *)&i);
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_NVVec3_Aligned(const QT3DSVec3 &f)
+{
+ VECMATHAOS_ASSERT(0 == ((size_t)&f & 0x0f));
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_NVVec3(const QT3DSVec3 &f)
+{
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_NVVec3_WUndefined(const QT3DSVec3 &f)
+{
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V v)
+{
+ return V4SetW(v, V4Zero());
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f)
+{
+ return f; // ok if it is implemented as the same type.
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_NVVec3_WUndefined(const QT3DSVec3 &f)
+{
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Mat33V Mat33V_From_NVMat33(const QT3DSMat33 &m)
+{
+ return Mat33V(Vec3V_From_NVVec3(m.column0), Vec3V_From_NVVec3(m.column1),
+ Vec3V_From_NVVec3(m.column2));
+}
+
+QT3DS_FORCE_INLINE void NVMat33_From_Mat33V(const Mat33V &m, QT3DSMat33 &out)
+{
+ QT3DS_ASSERT((size_t(&out) & 15) == 0);
+ NVVec3_From_Vec3V(m.col0, out.column0);
+ NVVec3_From_Vec3V(m.col1, out.column1);
+ NVVec3_From_Vec3V(m.col2, out.column2);
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_F32Array_Aligned(const QT3DSF32 *const f)
+{
+ VECMATHAOS_ASSERT(0 == ((QT3DSU64)f & 0x0f));
+ return (_mm_load_ps(f));
+}
+
+QT3DS_FORCE_INLINE void F32Array_Aligned_From_Vec4V(Vec4V a, QT3DSF32 *f)
+{
+ VECMATHAOS_ASSERT(0 == ((QT3DSU64)f & 0x0f));
+ _mm_store_ps(f, a);
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_F32Array(const QT3DSF32 *const f)
+{
+ return (_mm_loadu_ps(f));
+}
+
+QT3DS_FORCE_INLINE BoolV BoolV_From_Bool32Array(const bool *const f)
+{
+ const QT3DS_ALIGN(16, QT3DSU32) b[4] = { -(QT3DSI32)f[0], -(QT3DSI32)f[1], -(QT3DSI32)f[2], -(QT3DSI32)f[3] };
+ return _mm_load1_ps((float *)&b);
+}
+
+QT3DS_FORCE_INLINE QT3DSF32 NVF32_From_FloatV(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ QT3DSF32 f;
+ _mm_store_ss(&f, a);
+ return f;
+}
+
+QT3DS_FORCE_INLINE void NVF32_From_FloatV(const FloatV a, QT3DSF32 *QT3DS_RESTRICT f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ _mm_store_ss(f, a);
+}
+
+QT3DS_FORCE_INLINE void NVVec3Aligned_From_Vec3V(const Vec3V a, QT3DSVec3 &f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(0 == ((int)&a & 0x0F));
+ VECMATHAOS_ASSERT(0 == ((int)&f & 0x0F));
+ QT3DS_ALIGN(16, QT3DSF32) f2[4];
+ _mm_store_ps(f2, a);
+ f = QT3DSVec3(f2[0], f2[1], f2[2]);
+}
+
+QT3DS_FORCE_INLINE void NVVec3_From_Vec3V(const Vec3V a, QT3DSVec3 &f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(0 == ((int)&a & 0x0F));
+ QT3DS_ALIGN(16, QT3DSF32) f2[4];
+ _mm_store_ps(f2, a);
+ f = QT3DSVec3(f2[0], f2[1], f2[2]);
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualFloatV(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return (_mm_comieq_ss(a, b) != 0);
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualVec3V(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return V3AllEq(a, b) != 0;
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualVec4V(const Vec4V a, const Vec4V b)
+{
+ return V4AllEq(a, b) != 0;
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualBoolV(const BoolV a, const BoolV b)
+{
+ return BAllTrue4_R(VecI32V_IsEq(a, b)) != 0;
+}
+
+#define VECMATH_AOS_EPSILON (1e-3f)
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsNearEqualFloatV(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ const FloatV c = FSub(a, b);
+ const FloatV minError = FloatV_From_F32(-VECMATH_AOS_EPSILON);
+ const FloatV maxError = FloatV_From_F32(VECMATH_AOS_EPSILON);
+ return (_mm_comigt_ss(c, minError) && _mm_comilt_ss(c, maxError));
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsNearEqualVec3V(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ const Vec3V c = V3Sub(a, b);
+ const Vec3V minError = Vec3V_From_F32(-VECMATH_AOS_EPSILON);
+ const Vec3V maxError = Vec3V_From_F32(VECMATH_AOS_EPSILON);
+ return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError));
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsNearEqualVec4V(const Vec4V a, const Vec4V b)
+{
+ const Vec4V c = V4Sub(a, b);
+ const Vec4V minError = Vec4V_From_F32(-VECMATH_AOS_EPSILON);
+ const Vec4V maxError = Vec4V_From_F32(VECMATH_AOS_EPSILON);
+ return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), maxError));
+}
+
+//////////////////////////////////
+// FLOATV
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE FloatV FZero()
+{
+ return FloatV_From_F32(0.0f);
+}
+
+QT3DS_FORCE_INLINE FloatV FOne()
+{
+ return FloatV_From_F32(1.0f);
+}
+
+QT3DS_FORCE_INLINE FloatV FHalf()
+{
+ return FloatV_From_F32(0.5f);
+}
+
+QT3DS_FORCE_INLINE FloatV FEps()
+{
+ return FloatV_From_F32(QT3DS_ENV_REAL);
+}
+
+QT3DS_FORCE_INLINE FloatV FEps6()
+{
+ return FloatV_From_F32(1e-6f);
+}
+
+QT3DS_FORCE_INLINE FloatV FMax()
+{
+ return FloatV_From_F32(QT3DS_MAX_REAL);
+}
+
+QT3DS_FORCE_INLINE FloatV FNegMax()
+{
+ return FloatV_From_F32(-QT3DS_MAX_REAL);
+}
+
+QT3DS_FORCE_INLINE FloatV IZero()
+{
+ const QT3DSU32 zero = 0;
+ return _mm_load1_ps((QT3DSF32 *)&zero);
+}
+
+QT3DS_FORCE_INLINE FloatV IOne()
+{
+ const QT3DSU32 one = 1;
+ return _mm_load1_ps((QT3DSF32 *)&one);
+}
+
+QT3DS_FORCE_INLINE FloatV ITwo()
+{
+ const QT3DSU32 two = 2;
+ return _mm_load1_ps((QT3DSF32 *)&two);
+}
+
+QT3DS_FORCE_INLINE FloatV IThree()
+{
+ const QT3DSU32 three = 3;
+ return _mm_load1_ps((QT3DSF32 *)&three);
+}
+
+QT3DS_FORCE_INLINE FloatV IFour()
+{
+ QT3DSU32 four = 4;
+ return _mm_load1_ps((QT3DSF32 *)&four);
+}
+
+QT3DS_FORCE_INLINE FloatV FNeg(const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return _mm_sub_ps(_mm_setzero_ps(), f);
+}
+
+QT3DS_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_add_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_sub_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE FloatV FRecip(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return _mm_rcp_ps(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FRecipFast(const FloatV a)
+{
+ return FRecip(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FRsqrt(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return _mm_rsqrt_ps(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FSqrt(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return _mm_sqrt_ps(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FRsqrtFast(const FloatV a)
+{
+ return FRsqrt(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidFloatV(c));
+ return FAdd(FMul(a, b), c);
+}
+
+QT3DS_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidFloatV(c));
+ return FSub(c, FMul(a, b));
+}
+
+QT3DS_FORCE_INLINE FloatV FAbs(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ QT3DS_ALIGN(16, const QT3DSU32) absMask[4] = { 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF };
+ return _mm_and_ps(a, _mm_load_ps((QT3DSF32 *)absMask));
+}
+
+QT3DS_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(_VecMathTests::allElementsEqualBoolV(c, BTTTT())
+ || _VecMathTests::allElementsEqualBoolV(c, BFFFF()));
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
+}
+
+QT3DS_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_cmpgt_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_cmpge_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_max_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_min_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(minV));
+ VECMATHAOS_ASSERT(isValidFloatV(maxV));
+ return FMax(FMin(a, maxV), minV);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FAllGrtr(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return (_mm_comigt_ss(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FAllGrtrOrEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+
+ return (_mm_comige_ss(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FAllEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+
+ return (_mm_comieq_ss(a, b));
+}
+
+QT3DS_FORCE_INLINE FloatV FRound(const FloatV a)
+{
+ // return _mm_round_ps(a, 0x0);
+ const Vec3V half = Vec3V_From_F32(0.5f);
+ const Vec3V aPlusHalf = V3Add(a, half);
+ __m128i tmp = _mm_cvttps_epi32(aPlusHalf);
+ return _mm_cvtepi32_ps(tmp);
+}
+
+QT3DS_FORCE_INLINE FloatV FSin(const FloatV a)
+{
+ // Vec4V V1, V2, V3, V5, V7, V9, V11, V13, V15, V17, V19, V21, V23;
+ // Vec4V S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11;
+ FloatV Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const FloatV twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const FloatV tmp = FMul(a, twoPi);
+ const FloatV b = FRound(tmp);
+ const FloatV V1 = FNegMulSub(twoPi, b, a);
+
+ // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! -
+ // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI)
+ const FloatV V2 = FMul(V1, V1);
+ const FloatV V3 = FMul(V2, V1);
+ const FloatV V5 = FMul(V3, V2);
+ const FloatV V7 = FMul(V5, V2);
+ const FloatV V9 = FMul(V7, V2);
+ const FloatV V11 = FMul(V9, V2);
+ const FloatV V13 = FMul(V11, V2);
+ const FloatV V15 = FMul(V13, V2);
+ const FloatV V17 = FMul(V15, V2);
+ const FloatV V19 = FMul(V17, V2);
+ const FloatV V21 = FMul(V19, V2);
+ const FloatV V23 = FMul(V21, V2);
+
+ const Vec4V sinCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients0.f);
+ const Vec4V sinCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients1.f);
+ const Vec4V sinCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients2.f);
+
+ const FloatV S1 = V4GetY(sinCoefficients0);
+ const FloatV S2 = V4GetZ(sinCoefficients0);
+ const FloatV S3 = V4GetW(sinCoefficients0);
+ const FloatV S4 = V4GetX(sinCoefficients1);
+ const FloatV S5 = V4GetY(sinCoefficients1);
+ const FloatV S6 = V4GetZ(sinCoefficients1);
+ const FloatV S7 = V4GetW(sinCoefficients1);
+ const FloatV S8 = V4GetX(sinCoefficients2);
+ const FloatV S9 = V4GetY(sinCoefficients2);
+ const FloatV S10 = V4GetZ(sinCoefficients2);
+ const FloatV S11 = V4GetW(sinCoefficients2);
+
+ Result = FMulAdd(S1, V3, V1);
+ Result = FMulAdd(S2, V5, Result);
+ Result = FMulAdd(S3, V7, Result);
+ Result = FMulAdd(S4, V9, Result);
+ Result = FMulAdd(S5, V11, Result);
+ Result = FMulAdd(S6, V13, Result);
+ Result = FMulAdd(S7, V15, Result);
+ Result = FMulAdd(S8, V17, Result);
+ Result = FMulAdd(S9, V19, Result);
+ Result = FMulAdd(S10, V21, Result);
+ Result = FMulAdd(S11, V23, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE FloatV FCos(const FloatV a)
+{
+ // XMVECTOR V1, V2, V4, V6, V8, V10, V12, V14, V16, V18, V20, V22;
+ // XMVECTOR C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11;
+ FloatV Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const FloatV twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const FloatV tmp = FMul(a, twoPi);
+ const FloatV b = FRound(tmp);
+ const FloatV V1 = FNegMulSub(twoPi, b, a);
+
+ // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! -
+ // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI)
+ const FloatV V2 = FMul(V1, V1);
+ const FloatV V4 = FMul(V2, V2);
+ const FloatV V6 = FMul(V4, V2);
+ const FloatV V8 = FMul(V4, V4);
+ const FloatV V10 = FMul(V6, V4);
+ const FloatV V12 = FMul(V6, V6);
+ const FloatV V14 = FMul(V8, V6);
+ const FloatV V16 = FMul(V8, V8);
+ const FloatV V18 = FMul(V10, V8);
+ const FloatV V20 = FMul(V10, V10);
+ const FloatV V22 = FMul(V12, V10);
+
+ const Vec4V cosCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients0.f);
+ const Vec4V cosCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients1.f);
+ const Vec4V cosCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients2.f);
+
+ const FloatV C1 = V4GetY(cosCoefficients0);
+ const FloatV C2 = V4GetZ(cosCoefficients0);
+ const FloatV C3 = V4GetW(cosCoefficients0);
+ const FloatV C4 = V4GetX(cosCoefficients1);
+ const FloatV C5 = V4GetY(cosCoefficients1);
+ const FloatV C6 = V4GetZ(cosCoefficients1);
+ const FloatV C7 = V4GetW(cosCoefficients1);
+ const FloatV C8 = V4GetX(cosCoefficients2);
+ const FloatV C9 = V4GetY(cosCoefficients2);
+ const FloatV C10 = V4GetZ(cosCoefficients2);
+ const FloatV C11 = V4GetW(cosCoefficients2);
+
+ Result = FMulAdd(C1, V2, V4One());
+ Result = FMulAdd(C2, V4, Result);
+ Result = FMulAdd(C3, V6, Result);
+ Result = FMulAdd(C4, V8, Result);
+ Result = FMulAdd(C5, V10, Result);
+ Result = FMulAdd(C6, V12, Result);
+ Result = FMulAdd(C7, V14, Result);
+ Result = FMulAdd(C8, V16, Result);
+ Result = FMulAdd(C9, V18, Result);
+ Result = FMulAdd(C10, V20, Result);
+ Result = FMulAdd(C11, V22, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max)
+{
+ const BoolV ffff = BFFFF();
+ const BoolV c = BOr(FIsGrtr(a, max), FIsGrtr(min, a));
+ return !BAllEq(c, ffff);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FInBounds(const FloatV a, const FloatV min, const FloatV max)
+{
+ const BoolV tttt = BTTTT();
+ const BoolV c = BAnd(FIsGrtrOrEq(a, min), FIsGrtrOrEq(max, a));
+ return BAllEq(c, tttt);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FOutOfBounds(const FloatV a, const FloatV bounds)
+{
+ return FOutOfBounds(a, FNeg(bounds), bounds);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FInBounds(const FloatV a, const FloatV bounds)
+{
+ return FInBounds(a, FNeg(bounds), bounds);
+}
+
+//////////////////////////////////
+// VEC3V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec3V V3Splat(const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ const __m128 zero = FloatV_From_F32(0.0f);
+ const __m128 fff0 = _mm_move_ss(f, zero);
+ return _mm_shuffle_ps(fff0, fff0, _MM_SHUFFLE(0, 1, 2, 3));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(x));
+ VECMATHAOS_ASSERT(isValidFloatV(y));
+ VECMATHAOS_ASSERT(isValidFloatV(z));
+ // static on zero causes compiler crash on x64 debug_opt
+ const __m128 zero = FloatV_From_F32(0.0f);
+ const __m128 xy = _mm_move_ss(x, y);
+ const __m128 z0 = _mm_move_ss(zero, z);
+
+ return _mm_shuffle_ps(xy, z0, _MM_SHUFFLE(1, 0, 0, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3UnitX()
+{
+ const QT3DS_ALIGN(16, QT3DSF32) x[4] = { 1.0f, 0.0f, 0.0f, 0.0f };
+ const __m128 x128 = _mm_load_ps(x);
+ return x128;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3UnitY()
+{
+ const QT3DS_ALIGN(16, QT3DSF32) y[4] = { 0.0f, 1.0f, 0.0f, 0.0f };
+ const __m128 y128 = _mm_load_ps(y);
+ return y128;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3UnitZ()
+{
+ const QT3DS_ALIGN(16, QT3DSF32) z[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
+ const __m128 z128 = _mm_load_ps(z);
+ return z128;
+}
+
+QT3DS_FORCE_INLINE FloatV V3GetX(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
+}
+
+QT3DS_FORCE_INLINE FloatV V3GetY(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
+}
+
+QT3DS_FORCE_INLINE FloatV V3GetZ(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V3Sel(BFTTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V3Sel(BTFTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V3Sel(BTTFT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 0, 3, 0));
+ return V3SetY(r, V3GetX(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 1, 3, 1));
+ return V3SetY(r, V3GetY(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 2, 3, 2));
+ return V3SetY(r, V3GetZ(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Zero()
+{
+ return Vec3V_From_F32(0.0f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Eps()
+{
+ return Vec3V_From_F32(QT3DS_ENV_REAL);
+}
+QT3DS_FORCE_INLINE Vec3V V3One()
+{
+ return Vec3V_From_F32(1.0f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Neg(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_sub_ps(_mm_setzero_ps(), f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_add_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_sub_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ const __m128 one = Vec3V_From_F32(1.0f);
+ const __m128 tttf = BTTTF();
+ const __m128 b1 = V3Sel(tttf, b, one);
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ const __m128 one = Vec3V_From_F32(1.0f);
+ const __m128 tttf = BTTTF();
+ const __m128 b1 = V3Sel(tttf, b, one);
+ return _mm_mul_ps(a, _mm_rcp_ps(b1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Recip(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = Vec3V_From_F32(0.0f);
+ const __m128 tttf = BTTTF();
+ const __m128 recipA = _mm_rcp_ps(a);
+ return V3Sel(tttf, recipA, zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a)
+{
+ return V3Recip(a);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = Vec3V_From_F32(0.0f);
+ const __m128 tttf = BTTTF();
+ const __m128 recipA = _mm_rsqrt_ps(a);
+ return V3Sel(tttf, recipA, zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a)
+{
+ return V3Rsqrt(a);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Add(V3Scale(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Sub(c, V3Scale(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Add(V3Mul(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Sub(c, V3Scale(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Abs(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return V3Max(
+ a, V3Neg(a)); // sw/physx/shared/reviewed/3/feature/sdk/include/windows/Qt3DSWindowsInlineAoS.h
+}
+
+QT3DS_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ //__m128 dot1 = _mm_mul_ps(a, b);
+ ////w,z,y,x
+ //__m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2,1,0,3)); //z,y,x,w
+ //__m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1,0,3,2)); //y,x,w,z
+ //__m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0,3,2,1)); //x,w,z,y
+ // return _mm_add_ps(_mm_add_ps(shuf2, shuf3), _mm_add_ps(dot1,shuf1));
+
+ __m128 dot1 = _mm_mul_ps(a, b);
+ __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 0, 0, 0)); // z,y,x,w
+ __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 1, 1, 1)); // y,x,w,z
+ __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 2, 2, 2)); // x,w,z,y
+ return _mm_add_ps(_mm_add_ps(shuf2, shuf3), shuf1);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w
+ __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w
+ __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w
+ __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w
+ return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2));
+}
+
+QT3DS_FORCE_INLINE FloatV V3Length(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_sqrt_ps(V3Dot(a, a));
+}
+
+QT3DS_FORCE_INLINE FloatV V3LengthSq(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return V3Dot(a, a);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Normalize(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return V3Scale(a, _mm_rsqrt_ps(V3Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NormalizeFast(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return V3Scale(a, _mm_rsqrt_ps(V3Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = FloatV_From_F32(0.0f);
+ const __m128 length = V3Length(a);
+ const __m128 isGreaterThanZero = FIsGrtr(length, zero);
+ return V3Sel(isGreaterThanZero, V3ScaleInv(a, length), zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
+}
+
+QT3DS_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_cmpgt_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_cmpge_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_max_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_min_ps(a, b);
+}
+
+// Extract the maximum value from a
+QT3DS_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a)
+{
+ const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
+ const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
+ const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
+
+ return _mm_max_ps(_mm_max_ps(shuf1, shuf2), shuf3);
+}
+
+// Extract the maximum value from a
+QT3DS_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a)
+{
+ const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
+ const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
+ const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
+
+ return _mm_min_ps(_mm_min_ps(shuf1, shuf2), shuf3);
+}
+
+// return (a >= 0.0f) ? 1.0f : -1.0f;
+QT3DS_FORCE_INLINE Vec3V V3Sign(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = V3Zero();
+ const __m128 one = V3One();
+ const __m128 none = V3Neg(one);
+ return V3Sel(V3IsGrtrOrEq(a, zero), one, none);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(minV));
+ VECMATHAOS_ASSERT(isValidVec3V(maxV));
+ return V3Max(V3Min(a, maxV), minV);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3AllGrtr(const Vec3V a, const Vec3V b)
+{
+ return BAllTrue3_R(V4IsGrtr(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b)
+{
+ return BAllTrue3_R(V4IsGrtrOrEq(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3AllEq(const Vec3V a, const Vec3V b)
+{
+ return BAllTrue3_R(V4IsEq(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Round(const Vec3V a)
+{
+ // return _mm_round_ps(a, 0x0);
+ const Vec3V half = Vec3V_From_F32(0.5f);
+ const Vec3V aPlusHalf = V3Add(a, half);
+ __m128i tmp = _mm_cvttps_epi32(aPlusHalf);
+ return _mm_cvtepi32_ps(tmp);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Sin(const Vec3V a)
+{
+ // Vec4V V1, V2, V3, V5, V7, V9, V11, V13, V15, V17, V19, V21, V23;
+ // Vec4V S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11;
+ Vec3V Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const Vec3V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec3V tmp = V3Mul(a, twoPi);
+ const Vec3V b = V3Round(tmp);
+ const Vec3V V1 = V3NegMulSub(twoPi, b, a);
+
+ // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! -
+ // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI)
+ const Vec3V V2 = V3Mul(V1, V1);
+ const Vec3V V3 = V3Mul(V2, V1);
+ const Vec3V V5 = V3Mul(V3, V2);
+ const Vec3V V7 = V3Mul(V5, V2);
+ const Vec3V V9 = V3Mul(V7, V2);
+ const Vec3V V11 = V3Mul(V9, V2);
+ const Vec3V V13 = V3Mul(V11, V2);
+ const Vec3V V15 = V3Mul(V13, V2);
+ const Vec3V V17 = V3Mul(V15, V2);
+ const Vec3V V19 = V3Mul(V17, V2);
+ const Vec3V V21 = V3Mul(V19, V2);
+ const Vec3V V23 = V3Mul(V21, V2);
+
+ const Vec4V sinCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients0.f);
+ const Vec4V sinCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients1.f);
+ const Vec4V sinCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients2.f);
+
+ const FloatV S1 = V4GetY(sinCoefficients0);
+ const FloatV S2 = V4GetZ(sinCoefficients0);
+ const FloatV S3 = V4GetW(sinCoefficients0);
+ const FloatV S4 = V4GetX(sinCoefficients1);
+ const FloatV S5 = V4GetY(sinCoefficients1);
+ const FloatV S6 = V4GetZ(sinCoefficients1);
+ const FloatV S7 = V4GetW(sinCoefficients1);
+ const FloatV S8 = V4GetX(sinCoefficients2);
+ const FloatV S9 = V4GetY(sinCoefficients2);
+ const FloatV S10 = V4GetZ(sinCoefficients2);
+ const FloatV S11 = V4GetW(sinCoefficients2);
+
+ Result = V3MulAdd(S1, V3, V1);
+ Result = V3MulAdd(S2, V5, Result);
+ Result = V3MulAdd(S3, V7, Result);
+ Result = V3MulAdd(S4, V9, Result);
+ Result = V3MulAdd(S5, V11, Result);
+ Result = V3MulAdd(S6, V13, Result);
+ Result = V3MulAdd(S7, V15, Result);
+ Result = V3MulAdd(S8, V17, Result);
+ Result = V3MulAdd(S9, V19, Result);
+ Result = V3MulAdd(S10, V21, Result);
+ Result = V3MulAdd(S11, V23, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Cos(const Vec3V a)
+{
+ // XMVECTOR V1, V2, V4, V6, V8, V10, V12, V14, V16, V18, V20, V22;
+ // XMVECTOR C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11;
+ Vec3V Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const Vec3V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec3V tmp = V3Mul(a, twoPi);
+ const Vec3V b = V3Round(tmp);
+ const Vec3V V1 = V3NegMulSub(twoPi, b, a);
+
+ // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! -
+ // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI)
+ const Vec3V V2 = V3Mul(V1, V1);
+ const Vec3V V4 = V3Mul(V2, V2);
+ const Vec3V V6 = V3Mul(V4, V2);
+ const Vec3V V8 = V3Mul(V4, V4);
+ const Vec3V V10 = V3Mul(V6, V4);
+ const Vec3V V12 = V3Mul(V6, V6);
+ const Vec3V V14 = V3Mul(V8, V6);
+ const Vec3V V16 = V3Mul(V8, V8);
+ const Vec3V V18 = V3Mul(V10, V8);
+ const Vec3V V20 = V3Mul(V10, V10);
+ const Vec3V V22 = V3Mul(V12, V10);
+
+ const Vec4V cosCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients0.f);
+ const Vec4V cosCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients1.f);
+ const Vec4V cosCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients2.f);
+
+ const FloatV C1 = V4GetY(cosCoefficients0);
+ const FloatV C2 = V4GetZ(cosCoefficients0);
+ const FloatV C3 = V4GetW(cosCoefficients0);
+ const FloatV C4 = V4GetX(cosCoefficients1);
+ const FloatV C5 = V4GetY(cosCoefficients1);
+ const FloatV C6 = V4GetZ(cosCoefficients1);
+ const FloatV C7 = V4GetW(cosCoefficients1);
+ const FloatV C8 = V4GetX(cosCoefficients2);
+ const FloatV C9 = V4GetY(cosCoefficients2);
+ const FloatV C10 = V4GetZ(cosCoefficients2);
+ const FloatV C11 = V4GetW(cosCoefficients2);
+
+ Result = V3MulAdd(C1, V2, V4One());
+ Result = V3MulAdd(C2, V4, Result);
+ Result = V3MulAdd(C3, V6, Result);
+ Result = V3MulAdd(C4, V8, Result);
+ Result = V3MulAdd(C5, V10, Result);
+ Result = V3MulAdd(C6, V12, Result);
+ Result = V3MulAdd(C7, V14, Result);
+ Result = V3MulAdd(C8, V16, Result);
+ Result = V3MulAdd(C9, V18, Result);
+ Result = V3MulAdd(C10, V20, Result);
+ Result = V3MulAdd(C11, V22, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a)
+{
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 2, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a)
+{
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 1, 0));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a)
+{
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 2, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 0, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1)
+{
+ return _mm_shuffle_ps(v1, v0, _MM_SHUFFLE(3, 1, 2, 3));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1)
+{
+ return _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(3, 0, 3, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1)
+{
+ // There must be a better way to do this.
+ Vec3V v2 = V3Zero();
+ FloatV y1 = V3GetY(v1);
+ FloatV x0 = V3GetX(v0);
+ v2 = V3SetX(v2, y1);
+ return V3SetY(v2, x0);
+}
+
+QT3DS_FORCE_INLINE FloatV V3SumElems(const Vec3V a)
+{
+ __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); // z,y,x,w
+ __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); // y,x,w,z
+ __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); // x,w,z,y
+ return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max)
+{
+ const BoolV ffff = BFFFF();
+ const BoolV c = BOr(V3IsGrtr(a, max), V3IsGrtr(min, a));
+ return !BAllEq(c, ffff);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max)
+{
+ const BoolV tttt = BTTTT();
+ const BoolV c = BAnd(V3IsGrtrOrEq(a, min), V3IsGrtrOrEq(max, a));
+ return BAllEq(c, tttt);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds)
+{
+ return V3OutOfBounds(a, V3Neg(bounds), bounds);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3InBounds(const Vec3V a, const Vec3V bounds)
+{
+ return V3InBounds(a, V3Neg(bounds), bounds);
+}
+
+//////////////////////////////////
+// VEC4V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec4V V4Splat(const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Merge(const FloatV *const floatVArray)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[0]));
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[1]));
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[2]));
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[3]));
+ __m128 xw = _mm_move_ss(floatVArray[1], floatVArray[0]); // y, y, y, x
+ __m128 yz = _mm_move_ss(floatVArray[2], floatVArray[3]); // z, z, z, w
+ return (_mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z,
+ const FloatVArg w)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(x));
+ VECMATHAOS_ASSERT(isValidFloatV(y));
+ VECMATHAOS_ASSERT(isValidFloatV(z));
+ VECMATHAOS_ASSERT(isValidFloatV(w));
+ __m128 xw = _mm_move_ss(y, x); // y, y, y, x
+ __m128 yz = _mm_move_ss(z, w); // z, z, z, w
+ return (_mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitW()
+{
+ const QT3DS_ALIGN(16, QT3DSF32) w[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ const __m128 w128 = _mm_load_ps(w);
+ return w128;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitX()
+{
+ const QT3DS_ALIGN(16, QT3DSF32) x[4] = { 1.0f, 0.0f, 0.0f, 0.0f };
+ const __m128 x128 = _mm_load_ps(x);
+ return x128;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitY()
+{
+ const QT3DS_ALIGN(16, QT3DSF32) y[4] = { 0.0f, 1.0f, 0.0f, 0.0f };
+ const __m128 y128 = _mm_load_ps(y);
+ return y128;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitZ()
+{
+ const QT3DS_ALIGN(16, QT3DSF32) z[4] = { 0.0f, 0.0f, 1.0f, 0.0f };
+ const __m128 z128 = _mm_load_ps(z);
+ return z128;
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetW(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetX(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetY(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetZ(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BTTTF(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BFTTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BTFTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BTTFT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Zero()
+{
+ return Vec4V_From_F32(0.0f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4One()
+{
+ return Vec4V_From_F32(1.0f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V4Eps()
+{
+ return Vec3V_From_F32(QT3DS_ENV_REAL);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Neg(const Vec4V f)
+{
+ return _mm_sub_ps(_mm_setzero_ps(), f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b)
+{
+ return _mm_add_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b)
+{
+ return _mm_sub_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b)
+{
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b)
+{
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b)
+{
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b)
+{
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Recip(const Vec4V a)
+{
+ return _mm_rcp_ps(a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a)
+{
+ return V4Recip(a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a)
+{
+ return _mm_rsqrt_ps(a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a)
+{
+ return V4Rsqrt(a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return V4Add(V4Scale(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return V4Sub(c, V4Scale(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c)
+{
+ return V4Add(V4Scale(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c)
+{
+ return V4Sub(c, V4Scale(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Abs(const Vec4V a)
+{
+ return V4Max(a, V3Neg(a));
+}
+
+QT3DS_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b)
+{
+ __m128 dot1 = _mm_mul_ps(a, b); // x,y,z,w
+ __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 1, 0, 3)); // w,x,y,z
+ __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 0, 3, 2)); // z,w,x,y
+ __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 3, 2, 1)); // y,z,w,x
+ return _mm_add_ps(_mm_add_ps(shuf2, shuf3), _mm_add_ps(dot1, shuf1));
+}
+
+QT3DS_FORCE_INLINE FloatV V4Length(const Vec4V a)
+{
+ return _mm_sqrt_ps(V4Dot(a, a));
+}
+
+QT3DS_FORCE_INLINE FloatV V4LengthSq(const Vec4V a)
+{
+ return V4Dot(a, a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Normalize(const Vec4V a)
+{
+ return V4ScaleInv(a, _mm_sqrt_ps(V4Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a)
+{
+ return V4ScaleInvFast(a, _mm_sqrt_ps(V4Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a)
+{
+ const __m128 zero = FloatV_From_F32(0.0f);
+ const __m128 length = V4Length(a);
+ const __m128 isGreaterThanZero = FIsGrtr(length, zero);
+ return V4Sel(isGreaterThanZero, V4ScaleInv(a, length), zero);
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b)
+{
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b)
+{
+ return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b)
+{
+ return _mm_cmpgt_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b)
+{
+ return _mm_cmpge_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b)
+{
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V4Max(const Vec4V a, const Vec4V b)
+{
+ return _mm_max_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b)
+{
+ return _mm_min_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a)
+{
+ __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3));
+ __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
+ __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1));
+
+ return _mm_max_ps(_mm_max_ps(a, shuf1), _mm_max_ps(shuf2, shuf3));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV)
+{
+ return V4Max(V4Min(a, maxV), minV);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V4AllGrtr(const Vec4V a, const Vec4V b)
+{
+ return BAllTrue4_R(V4IsGrtr(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b)
+{
+ return BAllTrue4_R(V4IsGrtrOrEq(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V4AllEq(const Vec4V a, const Vec4V b)
+{
+ return BAllTrue4_R(V4IsEq(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Round(const Vec4V a)
+{
+ // return _mm_round_ps(a, 0x0);
+ const Vec3V half = Vec3V_From_F32(0.5f);
+ const Vec3V aPlusHalf = V3Add(a, half);
+ __m128i tmp = _mm_cvttps_epi32(aPlusHalf);
+ return _mm_cvtepi32_ps(tmp);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Sin(const Vec4V a)
+{
+ // Vec4V V1, V2, V3, V5, V7, V9, V11, V13, V15, V17, V19, V21, V23;
+ // Vec4V S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11;
+ Vec4V Result;
+
+ const Vec4V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec4V tmp = V4Mul(a, twoPi);
+ const Vec4V b = V4Round(tmp);
+ const Vec4V V1 = V4NegMulSub(twoPi, b, a);
+
+ // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! -
+ // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI)
+ const Vec4V V2 = V4Mul(V1, V1);
+ const Vec4V V3 = V4Mul(V2, V1);
+ const Vec4V V5 = V4Mul(V3, V2);
+ const Vec4V V7 = V4Mul(V5, V2);
+ const Vec4V V9 = V4Mul(V7, V2);
+ const Vec4V V11 = V4Mul(V9, V2);
+ const Vec4V V13 = V4Mul(V11, V2);
+ const Vec4V V15 = V4Mul(V13, V2);
+ const Vec4V V17 = V4Mul(V15, V2);
+ const Vec4V V19 = V4Mul(V17, V2);
+ const Vec4V V21 = V4Mul(V19, V2);
+ const Vec4V V23 = V4Mul(V21, V2);
+
+ const Vec4V sinCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients0.f);
+ const Vec4V sinCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients1.f);
+ const Vec4V sinCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients2.f);
+
+ const FloatV S1 = V4GetY(sinCoefficients0);
+ const FloatV S2 = V4GetZ(sinCoefficients0);
+ const FloatV S3 = V4GetW(sinCoefficients0);
+ const FloatV S4 = V4GetX(sinCoefficients1);
+ const FloatV S5 = V4GetY(sinCoefficients1);
+ const FloatV S6 = V4GetZ(sinCoefficients1);
+ const FloatV S7 = V4GetW(sinCoefficients1);
+ const FloatV S8 = V4GetX(sinCoefficients2);
+ const FloatV S9 = V4GetY(sinCoefficients2);
+ const FloatV S10 = V4GetZ(sinCoefficients2);
+ const FloatV S11 = V4GetW(sinCoefficients2);
+
+ Result = V4MulAdd(S1, V3, V1);
+ Result = V4MulAdd(S2, V5, Result);
+ Result = V4MulAdd(S3, V7, Result);
+ Result = V4MulAdd(S4, V9, Result);
+ Result = V4MulAdd(S5, V11, Result);
+ Result = V4MulAdd(S6, V13, Result);
+ Result = V4MulAdd(S7, V15, Result);
+ Result = V4MulAdd(S8, V17, Result);
+ Result = V4MulAdd(S9, V19, Result);
+ Result = V4MulAdd(S10, V21, Result);
+ Result = V4MulAdd(S11, V23, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Cos(const Vec4V a)
+{
+ // XMVECTOR V1, V2, V4, V6, V8, V10, V12, V14, V16, V18, V20, V22;
+ // XMVECTOR C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11;
+ Vec4V Result;
+
+ const Vec4V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec4V tmp = V4Mul(a, twoPi);
+ const Vec4V b = V4Round(tmp);
+ const Vec4V V1 = V4NegMulSub(twoPi, b, a);
+
+ // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! -
+ // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI)
+ const Vec4V V2 = V4Mul(V1, V1);
+ const Vec4V V4 = V4Mul(V2, V2);
+ const Vec4V V6 = V4Mul(V4, V2);
+ const Vec4V V8 = V4Mul(V4, V4);
+ const Vec4V V10 = V4Mul(V6, V4);
+ const Vec4V V12 = V4Mul(V6, V6);
+ const Vec4V V14 = V4Mul(V8, V6);
+ const Vec4V V16 = V4Mul(V8, V8);
+ const Vec4V V18 = V4Mul(V10, V8);
+ const Vec4V V20 = V4Mul(V10, V10);
+ const Vec4V V22 = V4Mul(V12, V10);
+
+ const Vec4V cosCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients0.f);
+ const Vec4V cosCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients1.f);
+ const Vec4V cosCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients2.f);
+
+ const FloatV C1 = V4GetY(cosCoefficients0);
+ const FloatV C2 = V4GetZ(cosCoefficients0);
+ const FloatV C3 = V4GetW(cosCoefficients0);
+ const FloatV C4 = V4GetX(cosCoefficients1);
+ const FloatV C5 = V4GetY(cosCoefficients1);
+ const FloatV C6 = V4GetZ(cosCoefficients1);
+ const FloatV C7 = V4GetW(cosCoefficients1);
+ const FloatV C8 = V4GetX(cosCoefficients2);
+ const FloatV C9 = V4GetY(cosCoefficients2);
+ const FloatV C10 = V4GetZ(cosCoefficients2);
+ const FloatV C11 = V4GetW(cosCoefficients2);
+
+ Result = V4MulAdd(C1, V2, V4One());
+ Result = V4MulAdd(C2, V4, Result);
+ Result = V4MulAdd(C3, V6, Result);
+ Result = V4MulAdd(C4, V8, Result);
+ Result = V4MulAdd(C5, V10, Result);
+ Result = V4MulAdd(C6, V12, Result);
+ Result = V4MulAdd(C7, V14, Result);
+ Result = V4MulAdd(C8, V16, Result);
+ Result = V4MulAdd(C9, V18, Result);
+ Result = V4MulAdd(C10, V20, Result);
+ Result = V4MulAdd(C11, V22, Result);
+
+ return Result;
+}
+
+//////////////////////////////////
+// VEC4V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE BoolV BFFFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0, 0, 0 };
+ const __m128 ffff = _mm_load_ps((float *)&f);
+ return ffff;
+}
+
+QT3DS_FORCE_INLINE BoolV BFFFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0, 0, 0xFFFFFFFF };
+ const __m128 ffft = _mm_load_ps((float *)&f);
+ return ffft;
+}
+
+QT3DS_FORCE_INLINE BoolV BFFTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0, 0xFFFFFFFF, 0 };
+ const __m128 fftf = _mm_load_ps((float *)&f);
+ return fftf;
+}
+
+QT3DS_FORCE_INLINE BoolV BFFTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 fftt = _mm_load_ps((float *)&f);
+ return fftt;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0xFFFFFFFF, 0, 0 };
+ const __m128 ftff = _mm_load_ps((float *)&f);
+ return ftff;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0xFFFFFFFF, 0, 0xFFFFFFFF };
+ const __m128 ftft = _mm_load_ps((float *)&f);
+ return ftft;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0xFFFFFFFF, 0xFFFFFFFF, 0 };
+ const __m128 fttf = _mm_load_ps((float *)&f);
+ return fttf;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 fttt = _mm_load_ps((float *)&f);
+ return fttt;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0, 0, 0 };
+ const __m128 tfff = _mm_load_ps((float *)&f);
+ return tfff;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0, 0, 0xFFFFFFFF };
+ const __m128 tfft = _mm_load_ps((float *)&f);
+ return tfft;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0, 0xFFFFFFFF, 0 };
+ const __m128 tftf = _mm_load_ps((float *)&f);
+ return tftf;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 tftt = _mm_load_ps((float *)&f);
+ return tftt;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0xFFFFFFFF, 0, 0 };
+ const __m128 ttff = _mm_load_ps((float *)&f);
+ return ttff;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0xFFFFFFFF, 0, 0xFFFFFFFF };
+ const __m128 ttft = _mm_load_ps((float *)&f);
+ return ttft;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0 };
+ const __m128 tttf = _mm_load_ps((float *)&f);
+ return tttf;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 tttt = _mm_load_ps((float *)&f);
+ return tttt;
+}
+
+QT3DS_FORCE_INLINE BoolV BXMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0xFFFFFFFF, 0, 0, 0 };
+ const __m128 tfff = _mm_load_ps((float *)&f);
+ return tfff;
+}
+
+QT3DS_FORCE_INLINE BoolV BYMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0xFFFFFFFF, 0, 0 };
+ const __m128 ftff = _mm_load_ps((float *)&f);
+ return ftff;
+}
+
+QT3DS_FORCE_INLINE BoolV BZMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0, 0xFFFFFFFF, 0 };
+ const __m128 fftf = _mm_load_ps((float *)&f);
+ return fftf;
+}
+
+QT3DS_FORCE_INLINE BoolV BWMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32) f[4] = { 0, 0, 0, 0xFFFFFFFF };
+ const __m128 ffft = _mm_load_ps((float *)&f);
+ return ffft;
+}
+
+QT3DS_FORCE_INLINE BoolV BGetX(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
+}
+
+QT3DS_FORCE_INLINE BoolV BGetY(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
+}
+
+QT3DS_FORCE_INLINE BoolV BGetZ(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
+}
+
+QT3DS_FORCE_INLINE BoolV BGetW(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
+}
+
+QT3DS_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b)
+{
+ return (_mm_and_ps(a, b));
+}
+
+QT3DS_FORCE_INLINE BoolV BNot(const BoolV a)
+{
+ const BoolV bAllTrue(BTTTT());
+ return _mm_xor_ps(a, bAllTrue);
+}
+
+QT3DS_FORCE_INLINE BoolV BAndNot(const BoolV a, const BoolV b)
+{
+ return (_mm_andnot_ps(a, b));
+}
+
+QT3DS_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b)
+{
+ return (_mm_or_ps(a, b));
+}
+
+QT3DS_FORCE_INLINE BoolV BAllTrue4(const BoolV a)
+{
+ const BoolV bTmp = _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3)));
+ return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE BoolV BAnyTrue4(const BoolV a)
+{
+ const BoolV bTmp = _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3)));
+ return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE BoolV BAllTrue3(const BoolV a)
+{
+ const BoolV bTmp = _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
+ return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE BoolV BAnyTrue3(const BoolV a)
+{
+ const BoolV bTmp = _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
+ return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAllEq(const BoolV a, const BoolV b)
+{
+ const BoolV bTest = m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b)));
+ return BAllTrue4_R(bTest);
+}
+
+//////////////////////////////////
+// MAT33V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec3V M33MulV3(const Mat33V &a, const Vec3V b)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ const Vec3V v0 = V3Scale(a.col0, x);
+ const Vec3V v1 = V3Scale(a.col1, y);
+ const Vec3V v2 = V3Scale(a.col2, z);
+ const Vec3V v0PlusV1 = V3Add(v0, v1);
+ return V3Add(v0PlusV1, v2);
+}
+
+QT3DS_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V &a, const Vec3V b)
+{
+ const FloatV x = V3Dot(a.col0, b);
+ const FloatV y = V3Dot(a.col1, b);
+ const FloatV z = V3Dot(a.col2, b);
+ return V3Merge(x, y, z);
+}
+
+QT3DS_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V &A, const Vec3V b, const Vec3V c)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ Vec3V result = V3MulAdd(A.col0, x, c);
+ result = V3MulAdd(A.col1, y, result);
+ return V3MulAdd(A.col2, z, result);
+}
+
+QT3DS_FORCE_INLINE Mat33V M33MulM33(const Mat33V &a, const Mat33V &b)
+{
+ return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Add(const Mat33V &a, const Mat33V &b)
+{
+ return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Inverse(const Mat33V &a)
+{
+ const BoolV tfft = BTFFT();
+ const BoolV tttf = BTTTF();
+ const FloatV zero = FloatV_From_F32(0.0f);
+ const Vec3V cross01 = V3Cross(a.col0, a.col1);
+ const Vec3V cross12 = V3Cross(a.col1, a.col2);
+ const Vec3V cross20 = V3Cross(a.col2, a.col0);
+ const FloatV dot = V3Dot(cross01, a.col2);
+ const FloatV invDet = _mm_rcp_ps(dot);
+ const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01);
+ const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01);
+ Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20);
+ colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0));
+ const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2));
+ const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0));
+ const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd));
+ const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0));
+ const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0));
+ const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd));
+
+ return Mat33V(_mm_mul_ps(colInv0, invDet), _mm_mul_ps(colInv1, invDet),
+ _mm_mul_ps(colInv2, invDet));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Trnsps(const Mat33V &a)
+{
+ return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)),
+ V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)),
+ V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2)));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Identity()
+{
+ return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ());
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Sub(const Mat33V &a, const Mat33V &b)
+{
+ return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Neg(const Mat33V &a)
+{
+ return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Abs(const Mat33V &a)
+{
+ return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V PromoteVec3V(const Vec3V v)
+{
+ const BoolV bTFFF = BTFFF();
+ const BoolV bFTFF = BFTFF();
+ const BoolV bFFTF = BTFTF();
+
+ const Vec3V zero = V3Zero();
+
+ return Mat33V(V3Sel(bTFFF, v, zero), V3Sel(bFTFF, v, zero), V3Sel(bFFTF, v, zero));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg d)
+{
+ const FloatV x = V3Mul(V3UnitX(), d);
+ const FloatV y = V3Mul(V3UnitY(), d);
+ const FloatV z = V3Mul(V3UnitZ(), d);
+ return Mat33V(x, y, z);
+}
+
+//////////////////////////////////
+// MAT34V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec3V M34MulV3(const Mat34V &a, const Vec3V b)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ const Vec3V v0 = V3Scale(a.col0, x);
+ const Vec3V v1 = V3Scale(a.col1, y);
+ const Vec3V v2 = V3Scale(a.col2, z);
+ const Vec3V v0PlusV1 = V3Add(v0, v1);
+ const Vec3V v0PlusV1Plusv2 = V3Add(v0PlusV1, v2);
+ return (V3Add(v0PlusV1Plusv2, a.col3));
+}
+
+QT3DS_FORCE_INLINE Vec3V M34Mul33V3(const Mat34V &a, const Vec3V b)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ const Vec3V v0 = V3Scale(a.col0, x);
+ const Vec3V v1 = V3Scale(a.col1, y);
+ const Vec3V v2 = V3Scale(a.col2, z);
+ const Vec3V v0PlusV1 = V3Add(v0, v1);
+ return V3Add(v0PlusV1, v2);
+}
+
+QT3DS_FORCE_INLINE Vec3V M34TrnspsMul33V3(const Mat34V &a, const Vec3V b)
+{
+ const FloatV x = V3Dot(a.col0, b);
+ const FloatV y = V3Dot(a.col1, b);
+ const FloatV z = V3Dot(a.col2, b);
+ return V3Merge(x, y, z);
+}
+
+QT3DS_FORCE_INLINE Mat34V M34MulM34(const Mat34V &a, const Mat34V &b)
+{
+ return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2),
+ M34MulV3(a, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat33V M34MulM33(const Mat34V &a, const Mat33V &b)
+{
+ return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M34Mul33MM34(const Mat34V &a, const Mat34V &b)
+{
+ return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat34V M34Add(const Mat34V &a, const Mat34V &b)
+{
+ return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2),
+ V3Add(a.col3, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat34V M34InverseV(const Mat34V &a)
+{
+ Mat34V aInv;
+ const BoolV tfft = BTFFT();
+ const BoolV tttf = BTTTF();
+ const FloatV zero = FloatV_From_F32(0.0f);
+ const Vec3V cross01 = V3Cross(a.col0, a.col1);
+ const Vec3V cross12 = V3Cross(a.col1, a.col2);
+ const Vec3V cross20 = V3Cross(a.col2, a.col0);
+ const FloatV dot = V3Dot(cross01, a.col2);
+ const FloatV invDet = _mm_rcp_ps(dot);
+ const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01);
+ const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01);
+ Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20);
+ colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0));
+ const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2));
+ const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0));
+ const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd));
+ const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0));
+ const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0));
+ const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd));
+ aInv.col0 = _mm_mul_ps(colInv0, invDet);
+ aInv.col1 = _mm_mul_ps(colInv1, invDet);
+ aInv.col2 = _mm_mul_ps(colInv2, invDet);
+ aInv.col3 = M34Mul33V3(aInv, V3Neg(a.col3));
+ return aInv;
+}
+
+QT3DS_FORCE_INLINE Mat33V M34Trnsps33(const Mat34V &a)
+{
+ return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)),
+ V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)),
+ V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2)));
+}
+
+//////////////////////////////////
+// MAT44V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec4V M44MulV4(const Mat44V &a, const Vec4V b)
+{
+ const FloatV x = V4GetX(b);
+ const FloatV y = V4GetY(b);
+ const FloatV z = V4GetZ(b);
+ const FloatV w = V4GetW(b);
+
+ const Vec4V v0 = V4Scale(a.col0, x);
+ const Vec4V v1 = V4Scale(a.col1, y);
+ const Vec4V v2 = V4Scale(a.col2, z);
+ const Vec4V v3 = V4Scale(a.col3, w);
+ const Vec4V v0PlusV1 = V4Add(v0, v1);
+ const Vec4V v0PlusV1Plusv2 = V4Add(v0PlusV1, v2);
+ return (V4Add(v0PlusV1Plusv2, v3));
+}
+
+QT3DS_FORCE_INLINE Vec4V M44TrnspsMulV4(const Mat44V &a, const Vec4V b)
+{
+ QT3DS_ALIGN(16, FloatV)
+ dotProdArray[4] = { V4Dot(a.col0, b), V4Dot(a.col1, b), V4Dot(a.col2, b), V4Dot(a.col3, b) };
+ return V4Merge(dotProdArray);
+}
+
+QT3DS_FORCE_INLINE Mat44V M44MulM44(const Mat44V &a, const Mat44V &b)
+{
+ return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2),
+ M44MulV4(a, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat44V M44Add(const Mat44V &a, const Mat44V &b)
+{
+ return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2),
+ V4Add(a.col3, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat44V M44Trnsps(const Mat44V &a)
+{
+ const Vec4V v0 = _mm_unpacklo_ps(a.col0, a.col2);
+ const Vec4V v1 = _mm_unpackhi_ps(a.col0, a.col2);
+ const Vec4V v2 = _mm_unpacklo_ps(a.col1, a.col3);
+ const Vec4V v3 = _mm_unpackhi_ps(a.col1, a.col3);
+ return Mat44V(_mm_unpacklo_ps(v0, v2), _mm_unpackhi_ps(v0, v2), _mm_unpacklo_ps(v1, v3),
+ _mm_unpackhi_ps(v1, v3));
+}
+
+QT3DS_FORCE_INLINE Mat44V M44Inverse(const Mat44V &a)
+{
+ __m128 minor0, minor1, minor2, minor3;
+ __m128 row0, row1, row2, row3;
+ __m128 det, tmp1;
+
+ tmp1 = FloatV_From_F32(0.0f);
+ row1 = FloatV_From_F32(0.0f);
+ row3 = FloatV_From_F32(0.0f);
+
+ row0 = a.col0;
+ row1 = _mm_shuffle_ps(a.col1, a.col1, _MM_SHUFFLE(1, 0, 3, 2));
+ row2 = a.col2;
+ row3 = _mm_shuffle_ps(a.col3, a.col3, _MM_SHUFFLE(1, 0, 3, 2));
+
+ tmp1 = _mm_mul_ps(row2, row3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor0 = _mm_mul_ps(row1, tmp1);
+ minor1 = _mm_mul_ps(row0, tmp1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor0 = _mm_sub_ps(_mm_mul_ps(row1, tmp1), minor0);
+ minor1 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor1);
+ minor1 = _mm_shuffle_ps(minor1, minor1, 0x4E);
+
+ tmp1 = _mm_mul_ps(row1, row2);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor0 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor0);
+ minor3 = _mm_mul_ps(row0, tmp1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row3, tmp1));
+ minor3 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor3);
+ minor3 = _mm_shuffle_ps(minor3, minor3, 0x4E);
+
+ tmp1 = _mm_mul_ps(_mm_shuffle_ps(row1, row1, 0x4E), row3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ row2 = _mm_shuffle_ps(row2, row2, 0x4E);
+ minor0 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor0);
+ minor2 = _mm_mul_ps(row0, tmp1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row2, tmp1));
+ minor2 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor2);
+ minor2 = _mm_shuffle_ps(minor2, minor2, 0x4E);
+
+ tmp1 = _mm_mul_ps(row0, row1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor2 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor2);
+ minor3 = _mm_sub_ps(_mm_mul_ps(row2, tmp1), minor3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor2 = _mm_sub_ps(_mm_mul_ps(row3, tmp1), minor2);
+ minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row2, tmp1));
+
+ tmp1 = _mm_mul_ps(row0, row3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row2, tmp1));
+ minor2 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor2);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor1 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor1);
+ minor2 = _mm_sub_ps(minor2, _mm_mul_ps(row1, tmp1));
+
+ tmp1 = _mm_mul_ps(row0, row2);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor1 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor1);
+ minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row1, tmp1));
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row3, tmp1));
+ minor3 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor3);
+
+ det = _mm_mul_ps(row0, minor0);
+ det = _mm_add_ps(_mm_shuffle_ps(det, det, 0x4E), det);
+ det = _mm_add_ss(_mm_shuffle_ps(det, det, 0xB1), det);
+ tmp1 = _mm_rcp_ss(det);
+#if 0
+ det = _mm_sub_ss(_mm_add_ss(tmp1, tmp1), _mm_mul_ss(det, _mm_mul_ss(tmp1, tmp1)));
+ det = _mm_shuffle_ps(det, det, 0x00);
+#else
+ det = _mm_shuffle_ps(tmp1, tmp1, _MM_SHUFFLE(0, 0, 0, 0));
+#endif
+
+ minor0 = _mm_mul_ps(det, minor0);
+ minor1 = _mm_mul_ps(det, minor1);
+ minor2 = _mm_mul_ps(det, minor2);
+ minor3 = _mm_mul_ps(det, minor3);
+ Mat44V invTrans(minor0, minor1, minor2, minor3);
+ return M44Trnsps(invTrans);
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_XYZW(QT3DSF32 x, QT3DSF32 y, QT3DSF32 z, QT3DSF32 w)
+{
+ return _mm_set_ps(w, z, y, x);
+}
+
+// AP: work in progress - use proper SSE intrinsics where possible
+QT3DS_FORCE_INLINE VecU16V V4U32PK(VecU32V a, VecU32V b)
+{
+ VecU16V result;
+ result.m128_u16[0] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[0], 0, 0xFFFF));
+ result.m128_u16[1] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[1], 0, 0xFFFF));
+ result.m128_u16[2] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[2], 0, 0xFFFF));
+ result.m128_u16[3] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[3], 0, 0xFFFF));
+ result.m128_u16[4] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[0], 0, 0xFFFF));
+ result.m128_u16[5] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[1], 0, 0xFFFF));
+ result.m128_u16[6] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[2], 0, 0xFFFF));
+ result.m128_u16[7] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[3], 0, 0xFFFF));
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b)
+{
+ return m128_I2F(_mm_or_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b)
+{
+ return m128_I2F(_mm_and_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b)
+{
+ return m128_I2F(_mm_andnot_si128(m128_F2I(b), m128_F2I(a)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16Or(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_or_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16And(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_and_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16Andc(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_andnot_si128(m128_F2I(b), m128_F2I(a)));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_From_I32(const QT3DSI32 i)
+{
+ return (_mm_load1_ps((QT3DSF32 *)&i));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_From_I32Array(const QT3DSI32 *i)
+{
+ return _mm_loadu_ps((QT3DSF32 *)i);
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_From_I32Array_Aligned(const QT3DSI32 *i)
+{
+ return _mm_load_ps((QT3DSF32 *)i);
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_add_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_sub_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_cmpgt_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Zero()
+{
+ return V4Zero();
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Merge(const VecI32VArg a, const VecI32VArg b, const VecI32VArg c,
+ const VecI32VArg d)
+{
+ return V4Merge(a, b, c, d);
+}
+
+template <int a>
+QT3DS_FORCE_INLINE VecI32V V4ISplat()
+{
+ VecI32V result;
+ result.m128_i32[0] = a;
+ result.m128_i32[1] = a;
+ result.m128_i32[2] = a;
+ result.m128_i32[3] = a;
+ return result;
+}
+
+QT3DS_FORCE_INLINE void V4U16StoreAligned(VecU16V val, VecU16V *address)
+{
+ *address = val;
+}
+
+QT3DS_FORCE_INLINE void V4U32StoreAligned(VecU32V val, VecU32V *address)
+{
+ *address = val;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4LoadAligned(Vec4V *addr)
+{
+ return *addr;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4LoadUnaligned(Vec4V *addr)
+{
+ return Vec4V_From_F32Array((float *)addr);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b)
+{
+ VecU32V result32(a);
+ result32 = V4U32Andc(result32, b);
+ return Vec4V(result32);
+}
+
+QT3DS_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b)
+{
+ return V4IsGrtr(a, b);
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16LoadAligned(VecU16V *addr)
+{
+ return *addr;
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16LoadUnaligned(VecU16V *addr)
+{
+ return *addr;
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16CompareGt(VecU16V a, VecU16V b)
+{
+ // _mm_cmpgt_epi16 doesn't work for unsigned values unfortunately
+ // return m128_I2F(_mm_cmpgt_epi16(m128_F2I(a), m128_F2I(b)));
+ VecU16V result;
+ result.m128_u16[0] = (a).m128_u16[0] > (b).m128_u16[0];
+ result.m128_u16[1] = (a).m128_u16[1] > (b).m128_u16[1];
+ result.m128_u16[2] = (a).m128_u16[2] > (b).m128_u16[2];
+ result.m128_u16[3] = (a).m128_u16[3] > (b).m128_u16[3];
+ result.m128_u16[4] = (a).m128_u16[4] > (b).m128_u16[4];
+ result.m128_u16[5] = (a).m128_u16[5] > (b).m128_u16[5];
+ result.m128_u16[6] = (a).m128_u16[6] > (b).m128_u16[6];
+ result.m128_u16[7] = (a).m128_u16[7] > (b).m128_u16[7];
+ return result;
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a)
+{
+ Vec4V result = Vec4V_From_XYZW(QT3DSF32(a.m128_u32[0]), QT3DSF32(a.m128_u32[1]), QT3DSF32(a.m128_u32[2]),
+ QT3DSF32(a.m128_u32[3]));
+ return result;
+}
+
+template <int index>
+QT3DS_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a)
+{
+ VecU32V result;
+ result.m128_u32[0] = result.m128_u32[1] = result.m128_u32[2] = result.m128_u32[3] =
+ a.m128_u32[index];
+ return result;
+}
+
+template <int index>
+QT3DS_FORCE_INLINE Vec4V V4SplatElement(Vec4V a)
+{
+ float *data = (float *)&a;
+ return Vec4V_From_F32(data[index]);
+}
+
+template <int index>
+QT3DS_FORCE_INLINE VecU16V V4U16SplatElement(VecU16V a)
+{
+ VecU16V result;
+ for (int i = 0; i < 8; i++)
+ result.m128_u16[i] = a.m128_u16[index];
+ return result;
+}
+
+template <int imm>
+QT3DS_FORCE_INLINE VecI16V V4I16SplatImmediate()
+{
+ VecI16V result;
+ result.m128_i16[0] = imm;
+ result.m128_i16[1] = imm;
+ result.m128_i16[2] = imm;
+ result.m128_i16[3] = imm;
+ result.m128_i16[4] = imm;
+ result.m128_i16[5] = imm;
+ result.m128_i16[6] = imm;
+ result.m128_i16[7] = imm;
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16SubtractModulo(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_sub_epi16(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16AddModulo(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_add_epi16(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U16GetLo16(VecU16V a)
+{
+ VecU32V result;
+ result.m128_u32[0] = a.m128_u16[0];
+ result.m128_u32[1] = a.m128_u16[2];
+ result.m128_u32[2] = a.m128_u16[4];
+ result.m128_u32[3] = a.m128_u16[6];
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U16GetHi16(VecU16V a)
+{
+ VecU32V result;
+ result.m128_u32[0] = a.m128_u16[1];
+ result.m128_u32[1] = a.m128_u16[3];
+ result.m128_u32[2] = a.m128_u16[5];
+ result.m128_u32[3] = a.m128_u16[7];
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU32V VecU32V_From_XYZW(QT3DSU32 x, QT3DSU32 y, QT3DSU32 z, QT3DSU32 w)
+{
+ VecU32V result;
+ result.m128_u32[0] = x;
+ result.m128_u32[1] = y;
+ result.m128_u32[2] = z;
+ result.m128_u32[3] = w;
+ return result;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Ceil(const Vec4V in)
+{
+ UnionM128 a(in);
+ return Vec4V_From_XYZW(NVCeil(a.m128_f32[0]), NVCeil(a.m128_f32[1]), NVCeil(a.m128_f32[2]),
+ NVCeil(a.m128_f32[3]));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Floor(const Vec4V in)
+{
+ UnionM128 a(in);
+ return Vec4V_From_XYZW(NVFloor(a.m128_f32[0]), NVFloor(a.m128_f32[1]), NVFloor(a.m128_f32[2]),
+ NVFloor(a.m128_f32[3]));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(const Vec4V in, QT3DSU32 power)
+{
+ QT3DS_ASSERT(power == 0 && "Non-zero power not supported in convertToU32VSaturate");
+ QT3DS_FORCE_PARAMETER_REFERENCE(power); // prevent warning in release builds
+ QT3DSF32 ffffFFFFasFloat = QT3DSF32(0xFFFF0000);
+ UnionM128 a(in);
+ VecU32V result;
+ result.m128_u32[0] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[0], 0.0f, ffffFFFFasFloat));
+ result.m128_u32[1] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[1], 0.0f, ffffFFFFasFloat));
+ result.m128_u32[2] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[2], 0.0f, ffffFFFFasFloat));
+ result.m128_u32[3] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[3], 0.0f, ffffFFFFasFloat));
+ return result;
+}
+
+#endif // QT3DS_LINUX_INLINE_AOS_H
diff --git a/src/foundation/linux/Qt3DSLinuxIntrinsics.h b/src/foundation/linux/Qt3DSLinuxIntrinsics.h
new file mode 100644
index 0000000..7097460
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxIntrinsics.h
@@ -0,0 +1,209 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_LINUX_INTRINSICS_H
+#define QT3DS_FOUNDATION_QT3DS_LINUX_INTRINSICS_H
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+
+#if !(defined QT3DS_LINUX || defined QT3DS_ANDROID || defined QT3DS_APPLE || defined QT3DS_QNX)
+#error "This file should only be included by Linux builds!!"
+#endif
+
+#include <cmath>
+#include <math.h>
+#include <float.h>
+#include <string.h>
+
+namespace qt3ds {
+namespace intrinsics {
+ //! \brief platform-specific absolute value
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float abs(float a) { return ::fabs(a); }
+
+ //! \brief platform-specific select float
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float fsel(float a, float b, float c)
+ {
+ return (a >= 0.0f) ? b : c;
+ }
+
+ //! \brief platform-specific sign
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float sign(float a) { return (a >= 0.0f) ? 1.0f : -1.0f; }
+
+ //! \brief platform-specific reciprocal
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recip(float a) { return 1.0f / a; }
+
+ //! \brief platform-specific reciprocal estimate
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recipFast(float a) { return 1.0f / a; }
+
+ //! \brief platform-specific square root
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float sqrt(float a) { return ::sqrtf(a); }
+
+ //! \brief platform-specific reciprocal square root
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recipSqrt(float a) { return 1.0f / ::sqrtf(a); }
+
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recipSqrtFast(float a) { return 1.0f / ::sqrtf(a); }
+
+ //! \brief platform-specific sine
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float sin(float a) { return ::sinf(a); }
+
+ //! \brief platform-specific cosine
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float cos(float a) { return ::cosf(a); }
+
+ //! \brief platform-specific minimum
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float selectMin(float a, float b) { return a < b ? a : b; }
+
+ //! \brief platform-specific maximum
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float selectMax(float a, float b) { return a > b ? a : b; }
+
+ //! \brief platform-specific finiteness check (not INF or NAN)
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isFinite(float a) { return std::isfinite(a); }
+
+ //! \brief platform-specific finiteness check (not INF or NAN)
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isFinite(double a) { return std::isfinite(a); }
+ QT3DS_FORCE_INLINE void memoryBarrier()
+ {
+#if 0 //!defined (QT3DS_ARM)
+ smp_mb();
+#endif
+ }
+
+ /*!
+ Return the index of the highest set bit. Undefined for zero arg.
+ */
+ QT3DS_INLINE QT3DSU32 highestSetBitUnsafe(QT3DSU32 v)
+ {
+
+ // http://graphics.stanford.edu/~seander/bithacks.html
+ static const QT3DSU32 MultiplyDeBruijnBitPosition[32] = { 0, 9, 1, 10, 13, 21, 2, 29,
+ 11, 14, 16, 18, 22, 25, 3, 30,
+ 8, 12, 20, 28, 15, 17, 24, 7,
+ 19, 27, 23, 6, 26, 5, 4, 31 };
+
+ v |= v >> 1; // first round up to one less than a power of 2
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+
+ return MultiplyDeBruijnBitPosition[(QT3DSU32)(v * 0x07C4ACDDU) >> 27];
+ }
+
+ /*!
+ Return the index of the highest set bit. Undefined for zero arg.
+ */
+ QT3DS_INLINE QT3DSI32 lowestSetBitUnsafe(QT3DSU32 v)
+ {
+ // http://graphics.stanford.edu/~seander/bithacks.html
+ static const QT3DSU32 MultiplyDeBruijnBitPosition[32] = { 0, 1, 28, 2, 29, 14, 24, 3,
+ 30, 22, 20, 15, 25, 17, 4, 8,
+ 31, 27, 13, 23, 21, 19, 16, 7,
+ 26, 12, 18, 6, 11, 5, 10, 9 };
+ QT3DSI32 w = v;
+ return MultiplyDeBruijnBitPosition[(QT3DSU32)((w & -w) * 0x077CB531U) >> 27];
+ }
+
+ /*!
+ Returns the index of the highest set bit. Undefined for zero arg.
+ */
+ QT3DS_INLINE QT3DSU32 countLeadingZeros(QT3DSU32 v)
+ {
+ QT3DSI32 result = 0;
+#ifdef _INTEGRITYPLATFORM
+ QT3DSU32 testBit = (1U << 31);
+#else
+ QT3DSU32 testBit = (1 << 31);
+#endif
+ while ((v & testBit) == 0 && testBit != 0)
+ result++, testBit >>= 1;
+ return result;
+ }
+
+ /*!
+ Sets \c count bytes starting at \c dst to zero.
+ */
+ QT3DS_FORCE_INLINE void *memZero(void *QT3DS_RESTRICT dest, QT3DSU32 count)
+ {
+ return memset(dest, 0, count);
+ }
+
+ /*!
+ Sets \c count bytes starting at \c dst to \c c.
+ */
+ QT3DS_FORCE_INLINE void *memSet(void *QT3DS_RESTRICT dest, QT3DSI32 c, QT3DSU32 count)
+ {
+ return memset(dest, c, count);
+ }
+
+ /*!
+ Copies \c count bytes from \c src to \c dst. User memMove if regions overlap.
+ */
+ QT3DS_FORCE_INLINE void *memCopy(void *QT3DS_RESTRICT dest, const void *QT3DS_RESTRICT src, QT3DSU32 count)
+ {
+ return memcpy(dest, src, count);
+ }
+
+ /*!
+ Copies \c count bytes from \c src to \c dst. Supports overlapping regions.
+ */
+ QT3DS_FORCE_INLINE void *memMove(void *QT3DS_RESTRICT dest, const void *QT3DS_RESTRICT src, QT3DSU32 count)
+ {
+ return memmove(dest, src, count);
+ }
+
+ /*!
+ Set 128B to zero starting at \c dst+offset. Must be aligned.
+ */
+ QT3DS_FORCE_INLINE void memZero128(void *QT3DS_RESTRICT dest, QT3DSU32 offset = 0)
+ {
+ QT3DS_ASSERT(((size_t(dest) + offset) & 0x7f) == 0);
+ memSet((char *QT3DS_RESTRICT)dest + offset, 0, 128);
+ }
+
+ /*!
+ Prefetch aligned 128B around \c ptr+offset.
+ */
+ QT3DS_FORCE_INLINE void prefetch128(const void *, QT3DSU32 = 0) {}
+
+ /*!
+ Prefetch \c count bytes starting at \c ptr.
+ */
+ QT3DS_FORCE_INLINE void prefetch(const void *ptr, QT3DSU32 count = 0)
+ {
+ for (QT3DSU32 i = 0; i <= count; i += 128)
+ prefetch128(ptr, i);
+ }
+
+ //! \brief platform-specific floor
+ QT3DS_FORCE_INLINE float floatFloor(float x) { return ::floorf(x); }
+} // namespace intrinsics
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/linux/Qt3DSLinuxMutex.cpp b/src/foundation/linux/Qt3DSLinuxMutex.cpp
new file mode 100644
index 0000000..bbc5582
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxMutex.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSAtomic.h"
+
+#include <pthread.h>
+
+namespace qt3ds {
+namespace foundation {
+
+ namespace {
+ pthread_mutex_t *getMutex(MutexImpl *impl)
+ {
+ return reinterpret_cast<pthread_mutex_t *>(impl);
+ }
+ }
+
+ MutexImpl::MutexImpl()
+ {
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(getMutex(this), &attr);
+ pthread_mutexattr_destroy(&attr);
+ }
+
+ MutexImpl::~MutexImpl() { pthread_mutex_destroy(getMutex(this)); }
+
+ bool MutexImpl::lock() { return !pthread_mutex_lock(getMutex(this)); }
+
+ bool MutexImpl::trylock() { return !pthread_mutex_trylock(getMutex(this)); }
+
+ bool MutexImpl::unlock() { return !pthread_mutex_unlock(getMutex(this)); }
+
+ const QT3DSU32 MutexImpl::size = sizeof(pthread_mutex_t);
+
+ class ReadWriteLockImpl
+ {
+ public:
+ ReadWriteLockImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ pthread_mutex_t mutex;
+ volatile int readerCounter;
+ };
+
+ ReadWriteLock::ReadWriteLock(NVAllocatorCallback &alloc)
+ {
+ mImpl = QT3DS_NEW(alloc, ReadWriteLockImpl)(alloc);
+
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&mImpl->mutex, &attr);
+ pthread_mutexattr_destroy(&attr);
+
+ mImpl->readerCounter = 0;
+ }
+
+ ReadWriteLock::~ReadWriteLock()
+ {
+ pthread_mutex_destroy(&mImpl->mutex);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ void ReadWriteLock::lockReader()
+ {
+ pthread_mutex_lock(&mImpl->mutex);
+
+ atomicIncrement(&mImpl->readerCounter);
+
+ pthread_mutex_unlock(&mImpl->mutex);
+ }
+
+ void ReadWriteLock::lockWriter()
+ {
+ pthread_mutex_lock(&mImpl->mutex);
+
+ while (mImpl->readerCounter != 0)
+ ;
+ }
+
+ void ReadWriteLock::unlockReader() { atomicDecrement(&mImpl->readerCounter); }
+
+ void ReadWriteLock::unlockWriter() { pthread_mutex_unlock(&mImpl->mutex); }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/linux/Qt3DSLinuxSemaphore.cpp b/src/foundation/linux/Qt3DSLinuxSemaphore.cpp
new file mode 100644
index 0000000..90aab79
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxSemaphore.cpp
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSSemaphore.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+
+namespace qt3ds {
+namespace foundation {
+
+ class SemaphoreImpl
+ {
+ public:
+ SemaphoreImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ QT3DSU32 count;
+ QT3DSU32 maxCount;
+ };
+
+ struct NVLinuxScopeLock
+ {
+ NVLinuxScopeLock(pthread_mutex_t &m)
+ : mMutex(m)
+ {
+ pthread_mutex_lock(&mMutex);
+ }
+
+ ~NVLinuxScopeLock() { pthread_mutex_unlock(&mMutex); }
+ private:
+ pthread_mutex_t &mMutex;
+ };
+
+ Semaphore::Semaphore(NVAllocatorCallback &alloc, QT3DSU32 initialCount, QT3DSU32 maxCount)
+ {
+ mImpl = QT3DS_NEW(alloc, SemaphoreImpl)(alloc);
+ int status = pthread_mutex_init(&mImpl->mutex, 0);
+ QT3DS_ASSERT(!status);
+ status = pthread_cond_init(&mImpl->cond, 0);
+ QT3DS_ASSERT(!status);
+ mImpl->count = initialCount;
+ mImpl->maxCount = maxCount;
+ QT3DS_ASSERT(initialCount <= maxCount);
+ }
+
+ Semaphore::~Semaphore()
+ {
+ pthread_cond_destroy(&mImpl->cond);
+ pthread_mutex_destroy(&mImpl->mutex);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ bool Semaphore::wait(QT3DSU32 milliseconds)
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+
+ if (mImpl->count > 0) {
+ mImpl->count--;
+ return true;
+ }
+
+ if (milliseconds == 0) {
+ return false;
+ }
+
+ if (milliseconds == QT3DSU32(-1)) {
+ int status = pthread_cond_wait(&mImpl->cond, &mImpl->mutex);
+ QT3DS_ASSERT(!status);
+ (void)status;
+ } else {
+ timespec ts;
+ timeval tp;
+ gettimeofday(&tp, NULL);
+ QT3DSU32 sec = milliseconds / 1000;
+ QT3DSU32 usec = (milliseconds - 1000 * sec) * 1000;
+
+ // sschirm: taking into account that us might accumulate to a second
+ // otherwise the pthread_cond_timedwait complains on osx.
+ usec = tp.tv_usec + usec;
+ QT3DSU32 div_sec = usec / 1000000;
+ QT3DSU32 rem_usec = usec - div_sec * 1000000;
+
+ ts.tv_sec = tp.tv_sec + sec + div_sec;
+ ts.tv_nsec = rem_usec * 1000;
+
+ int ierr = pthread_cond_timedwait(&mImpl->cond, &mImpl->mutex, &ts);
+ QT3DS_ASSERT((ierr == 0) || (ierr == ETIMEDOUT));
+ (void)ierr;
+ return false;
+ }
+
+ return true;
+ }
+
+ void Semaphore::post()
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ mImpl->count++;
+ if (mImpl->count > mImpl->maxCount)
+ mImpl->count = mImpl->maxCount;
+ else {
+ pthread_cond_broadcast(&mImpl->cond);
+ }
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/linux/Qt3DSLinuxString.h b/src/foundation/linux/Qt3DSLinuxString.h
new file mode 100644
index 0000000..a4645f2
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxString.h
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_LINUX_STRING_H
+#define QT3DS_FOUNDATION_QT3DS_LINUX_STRING_H
+
+#include "foundation/Qt3DS.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#pragma warning(push)
+#pragma warning(disable : 4995 4996)
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+QT3DS_INLINE void NVStrcpy(char *dest, size_t size, const char *src)
+{
+ ::strncpy(dest, src, size);
+}
+
+QT3DS_INLINE int NVStrcat(char *dest, size_t size, const char *src)
+{
+ ::strcat(dest, src);
+ return 0;
+}
+QT3DS_INLINE int NVVsprintf(char *dest, size_t size, const char *src, va_list arg)
+{
+ int r = ::vsprintf(dest, src, arg);
+
+ return r;
+}
+QT3DS_INLINE int NVStricmp(const char *str, const char *str1)
+{
+ return (::strcasecmp(str, str1));
+}
+
+namespace string {
+
+ QT3DS_INLINE void strcpy(char *dest, size_t size, const char *src) { ::strcpy(dest, src); }
+ QT3DS_INLINE void strcat(char *dest, size_t size, const char *src) { ::strcat(dest, src); }
+ // QT3DS_INLINE int strcasecmp(const char *str, const char *str1) {return(::strcasecmp(str,
+ // str1));}
+ QT3DS_INLINE QT3DSI32 stricmp(const char *str, const char *str1) { return (::strcasecmp(str, str1)); }
+ QT3DS_INLINE QT3DSI32 strnicmp(const char *str, const char *str1, size_t len)
+ {
+ return (::strncasecmp(str, str1, len));
+ }
+
+ QT3DS_INLINE QT3DSI32 strncat_s(char *dstBfr, size_t dstSize, const char *srcBfr, size_t numCpy)
+ {
+ if (!dstBfr || !srcBfr || !dstSize)
+ return -1;
+
+ size_t len = strlen(dstBfr);
+
+ if (len >= dstSize)
+ return -1;
+
+ size_t remain = dstSize - len - 1;
+ size_t transfer = remain > numCpy ? numCpy : remain;
+ ::memmove(dstBfr + len, srcBfr, transfer);
+ dstBfr[len + transfer] = '\0';
+ return numCpy <= remain ? 0 : -1;
+ }
+
+ QT3DS_INLINE QT3DSI32 _vsnprintf(char *dest, size_t size, const char *src, va_list arg)
+ {
+ QT3DSI32 r = ::vsnprintf(dest, size, src, arg);
+
+ return r;
+ }
+ QT3DS_INLINE QT3DSI32 vsprintf(char *dest, size_t size, const char *src, va_list arg)
+ {
+ QT3DSI32 r = ::vsprintf(dest, src, arg);
+
+ return r;
+ }
+ QT3DS_INLINE int vsprintf_s(char *dest, size_t size, const char *src, va_list arg)
+ {
+ int r = ::vsprintf(dest, src, arg);
+
+ return r;
+ }
+
+ QT3DS_INLINE int sprintf_s(char *_DstBuf, size_t _DstSize, const char *_Format, ...)
+ {
+ if (_DstBuf == NULL || _Format == NULL) {
+ return -1;
+ }
+
+ va_list arg;
+ va_start(arg, _Format);
+ int r = ::vsprintf(_DstBuf, _Format, arg);
+ va_end(arg);
+
+ return r;
+ }
+
+ QT3DS_INLINE QT3DSI32 sprintf(char *_DstBuf, size_t _DstSize, const char *_Format, ...)
+ {
+ va_list arg;
+ va_start(arg, _Format);
+ QT3DSI32 r = ::vsprintf(_DstBuf, _Format, arg);
+ va_end(arg);
+
+ return r;
+ }
+
+ QT3DS_INLINE int strncpy_s(char *strDest, size_t sizeInBytes, const char *strSource, size_t count)
+ {
+ if (strDest == NULL || strSource == NULL || sizeInBytes == 0) {
+ return -1;
+ }
+
+ if (sizeInBytes < count) {
+ strDest[0] = 0;
+ return -1;
+ }
+
+ ::strncpy(strDest, strSource, count);
+ return 0;
+ }
+
+ QT3DS_INLINE void strcpy_s(char *dest, size_t size, const char *src)
+ {
+ ::strncpy(dest, src, size);
+ }
+
+ QT3DS_INLINE int strcat_s(char *dest, size_t size, const char *src)
+ {
+ ::strcat(dest, src);
+ return 0;
+ }
+
+ QT3DS_INLINE QT3DSI32 sscanf(const char *buffer, const char *format, ...)
+ {
+ va_list arg;
+ va_start(arg, format);
+ QT3DSI32 r = ::sscanf(buffer, format, arg);
+ va_end(arg);
+
+ return r;
+ };
+
+ QT3DS_INLINE void strlwr(char *str)
+ {
+ while (*str) {
+ if (*str >= 'A' && *str <= 'Z')
+ *str += 32;
+ str++;
+ }
+ }
+
+ QT3DS_INLINE void strupr(char *str)
+ {
+ while (*str) {
+ if (*str >= 'a' && *str <= 'z')
+ *str -= 32;
+ str++;
+ }
+ }
+
+} // namespace string
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+#pragma warning(pop)
+
+#endif
diff --git a/src/foundation/linux/Qt3DSLinuxSync.cpp b/src/foundation/linux/Qt3DSLinuxSync.cpp
new file mode 100644
index 0000000..52f9d7a
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxSync.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+
+namespace qt3ds {
+namespace foundation {
+
+ class SyncImpl
+ {
+ public:
+ SyncImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ volatile bool is_set;
+ };
+
+ struct NVLinuxScopeLock
+ {
+ NVLinuxScopeLock(pthread_mutex_t &m)
+ : mMutex(m)
+ {
+ pthread_mutex_lock(&mMutex);
+ }
+
+ ~NVLinuxScopeLock() { pthread_mutex_unlock(&mMutex); }
+ private:
+ pthread_mutex_t &mMutex;
+ };
+
+ Sync::Sync(NVAllocatorCallback &alloc)
+ {
+ mImpl = QT3DS_NEW(alloc, SyncImpl)(alloc);
+ int status = pthread_mutex_init(&mImpl->mutex, 0);
+ QT3DS_ASSERT(!status);
+ status = pthread_cond_init(&mImpl->cond, 0);
+ QT3DS_ASSERT(!status);
+ mImpl->is_set = false;
+ }
+
+ Sync::~Sync()
+ {
+ pthread_cond_destroy(&mImpl->cond);
+ pthread_mutex_destroy(&mImpl->mutex);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ void Sync::reset()
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ mImpl->is_set = false;
+ }
+
+ void Sync::set()
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ if (!mImpl->is_set) {
+ mImpl->is_set = true;
+ pthread_cond_broadcast(&mImpl->cond);
+ }
+ }
+
+ bool Sync::wait(QT3DSU32 ms)
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ if (!mImpl->is_set) {
+ if (ms == QT3DSU32(-1)) {
+ int status = pthread_cond_wait(&mImpl->cond, &mImpl->mutex);
+ QT3DS_ASSERT(!status);
+ (void)status;
+ } else {
+ timespec ts;
+ timeval tp;
+ gettimeofday(&tp, NULL);
+ QT3DSU32 sec = ms / 1000;
+ QT3DSU32 usec = (ms - 1000 * sec) * 1000;
+
+ // sschirm: taking into account that us might accumulate to a second
+ // otherwise the pthread_cond_timedwait complains on osx.
+ usec = tp.tv_usec + usec;
+ QT3DSU32 div_sec = usec / 1000000;
+ QT3DSU32 rem_usec = usec - div_sec * 1000000;
+
+ ts.tv_sec = tp.tv_sec + sec + div_sec;
+ ts.tv_nsec = rem_usec * 1000;
+
+ int ierr = pthread_cond_timedwait(&mImpl->cond, &mImpl->mutex, &ts);
+ QT3DS_ASSERT((ierr == 0) || (ierr == ETIMEDOUT));
+ (void)ierr;
+ }
+ }
+ return mImpl->is_set;
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/linux/Qt3DSLinuxThread.cpp b/src/foundation/linux/Qt3DSLinuxThread.cpp
new file mode 100644
index 0000000..fa6e069
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxThread.cpp
@@ -0,0 +1,384 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSThread.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#if !defined(QT3DS_APPLE) && !defined(ANDROID) && !defined(__CYGWIN__) && !defined(__QNX__) && !defined(__INTEGRITY)
+#include <bits/local_lim.h> // PTHREAD_STACK_MIN
+#endif
+#include <stdio.h>
+#include <pthread.h>
+#if !defined(__QNX__) && !defined(__INTEGRITY)
+#include <unistd.h>
+#include <sys/syscall.h>
+#if !defined(QT3DS_APPLE)
+#include <asm/unistd.h>
+#include <sys/resource.h>
+#endif
+#endif
+
+#define NVSpinLockPause() asm("nop")
+
+namespace qt3ds {
+namespace foundation {
+ using namespace intrinsics;
+
+ typedef enum { _NVThreadNotStarted, _NVThreadStarted, _NVThreadStopped } NVThreadState;
+
+ class ThreadImpl
+ {
+ public:
+ ThreadImpl(NVFoundationBase &foundation)
+ : mFoundation(foundation)
+ {
+ }
+ NVFoundationBase &mFoundation;
+ Thread::ExecuteFn fn;
+ void *arg;
+ volatile QT3DSI32 quitNow;
+ volatile QT3DSI32 threadStarted;
+ NVThreadState state;
+
+ pthread_t thread;
+ pid_t tid;
+ };
+
+ void *NVThreadStart(void *arg);
+
+ Thread::Id Thread::getId() { return Id(pthread_self()); }
+
+ Thread::Thread(NVFoundationBase &foundation)
+ {
+ mImpl = QT3DS_NEW(foundation.getAllocator(), ThreadImpl)(foundation);
+ mImpl->thread = 0;
+ mImpl->tid = 0;
+ mImpl->state = _NVThreadNotStarted;
+ mImpl->quitNow = 0;
+ mImpl->threadStarted = 0;
+ mImpl->fn = NULL;
+ mImpl->arg = NULL;
+ }
+
+ Thread::Thread(NVFoundationBase &foundation, Thread::ExecuteFn fn, void *arg)
+ {
+ mImpl = (ThreadImpl *)QT3DS_NEW(foundation.getAllocator(), ThreadImpl)(foundation);
+ mImpl->thread = 0;
+ mImpl->tid = 0;
+ mImpl->state = _NVThreadNotStarted;
+ mImpl->quitNow = 0;
+ mImpl->threadStarted = 0;
+ mImpl->fn = fn;
+ mImpl->arg = arg;
+
+ start(0);
+ }
+
+ Thread::~Thread()
+ {
+ if (mImpl->state == _NVThreadStarted)
+ kill();
+ QT3DS_FREE(mImpl->mFoundation.getAllocator(), mImpl);
+ }
+
+ void Thread::start(QT3DSU32 stackSize)
+ {
+ if (mImpl->state != _NVThreadNotStarted)
+ return;
+
+ if (stackSize == 0)
+ stackSize = DEFAULT_STACK_SIZE;
+
+#if defined(PTHREAD_STACK_MIN) && !defined(ANDROID)
+ if (stackSize < PTHREAD_STACK_MIN) {
+ qCWarning(WARNING, "Thread::start(): stack size was set below PTHREAD_STACK_MIN");
+ stackSize = PTHREAD_STACK_MIN;
+ }
+#endif
+
+ pthread_attr_t attr;
+ int status = pthread_attr_init(&attr);
+ QT3DS_ASSERT(!status);
+
+ status = pthread_attr_setstacksize(&attr, stackSize);
+ QT3DS_ASSERT(!status);
+ status = pthread_create(&mImpl->thread, &attr, NVThreadStart, this);
+ QT3DS_ASSERT(!status);
+
+#ifndef __QNX__
+ // wait for thread to startup and write out TID
+ // otherwise TID dependent calls like setAffinity will fail.
+ while (atomicCompareExchange(&(mImpl->threadStarted), 1, 1) == 0)
+ yield();
+#endif
+
+ mImpl->state = _NVThreadStarted;
+
+ status = pthread_attr_destroy(&attr);
+ QT3DS_ASSERT(!status);
+ }
+
+ static void setTid(ThreadImpl &threadImpl)
+ {
+#ifndef __QNX__
+// query TID
+#ifdef QT3DS_APPLE
+ threadImpl.tid = syscall(SYS_gettid);
+#elif defined(__INTEGRITY)
+ pthread_t ptid = pthread_self();
+ uint64_t threadId = 0;
+ memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid)));
+ threadImpl.tid = threadId;
+#else
+ threadImpl.tid = syscall(__NR_gettid);
+#endif
+
+ // notify/unblock parent thread
+ atomicCompareExchange(&(threadImpl.threadStarted), 1, 0);
+#else
+ QT3DS_ASSERT(false);
+#endif
+ }
+
+ void *NVThreadStart(void *arg)
+ {
+ // run execute from base class to run gettid in the new thread's context
+ ((Thread *)arg)->Thread::execute();
+ return 0;
+ }
+
+ void Thread::execute(void)
+ {
+ // run setTid in thread's context
+ setTid(*mImpl);
+
+ // then run either the passed in function or execute from the derived class.
+ if (mImpl->fn)
+ (*mImpl->fn)(mImpl->arg);
+ else
+ this->execute();
+ }
+
+ void Thread::signalQuit() { atomicIncrement(&(mImpl->quitNow)); }
+
+ bool Thread::waitForQuit()
+ {
+ if (mImpl->state == _NVThreadNotStarted)
+ return false;
+
+ pthread_join(mImpl->thread, NULL);
+ return true;
+ }
+
+ bool Thread::quitIsSignalled()
+ {
+#ifndef __QNX__
+ return atomicCompareExchange(&(mImpl->quitNow), 0, 0) != 0;
+#else
+ // Hope for memory locking on the arm.
+ return mImpl->quitNow != 0;
+#endif
+ }
+
+ void Thread::quit()
+ {
+ mImpl->state = _NVThreadStopped;
+ pthread_exit(0);
+ }
+
+ void Thread::kill()
+ {
+#ifndef ANDROID
+ if (mImpl->state == _NVThreadStarted)
+ pthread_cancel(mImpl->thread);
+ mImpl->state = _NVThreadStopped;
+#else
+ qCWarning(WARNING, "Thread::kill() called, but is not implemented");
+#endif
+ }
+
+ void Thread::sleep(QT3DSU32 ms)
+ {
+ timespec sleepTime;
+ QT3DSU32 remainder = ms % 1000;
+ sleepTime.tv_sec = ms - remainder;
+ sleepTime.tv_nsec = remainder * 1000000L;
+
+ while (nanosleep(&sleepTime, &sleepTime) == -1)
+ continue;
+ }
+
+ void Thread::yield() { sched_yield(); }
+
+ QT3DSU32 Thread::setAffinityMask(QT3DSU32 mask)
+ {
+ // Same as windows impl if mask is zero
+ if (!mask)
+ return 0;
+
+#ifndef __QNX__
+ QT3DSU64 prevMask = 0;
+
+// Apple doesn't support syscall with getaffinity and setaffinity
+#if !defined(QT3DS_APPLE) && !defined(__INTEGRITY)
+ QT3DSI32 errGet = syscall(__NR_sched_getaffinity, mImpl->tid, sizeof(prevMask), &prevMask);
+ if (errGet < 0)
+ return 0;
+
+ QT3DSI32 errSet = syscall(__NR_sched_setaffinity, mImpl->tid, sizeof(mask), &mask);
+ if (errSet != 0)
+ return 0;
+#endif
+
+ return QT3DSU32(prevMask);
+#else
+ QT3DS_ASSERT(false);
+ return 0;
+#endif
+ }
+
+ void Thread::setName(const char *name)
+ {
+#if (defined(ANDROID) && (__ANDROID_API__ > 8))
+ pthread_setname_np(mImpl->thread, name);
+#else
+// not implemented because most unix APIs expect setName()
+// to be called from the thread's context. Example see next comment:
+
+// this works only with the current thread and can rename
+// the main process if used in the wrong context:
+// prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(name) ,0,0,0);
+#endif
+ }
+
+#if !defined(QT3DS_APPLE) && !defined(__INTEGRITY)
+ static ThreadPriority::Enum convertPriorityFromLinux(QT3DSU32 inPrio, int policy)
+ {
+ QT3DS_COMPILE_TIME_ASSERT(ThreadPriority::eLOW > ThreadPriority::eHIGH);
+ QT3DS_COMPILE_TIME_ASSERT(ThreadPriority::eHIGH == 0);
+
+ int maxL = sched_get_priority_max(policy);
+ int minL = sched_get_priority_min(policy);
+ int rangeL = maxL - minL;
+ int rangeNV = ThreadPriority::eLOW - ThreadPriority::eHIGH;
+
+ // case for default scheduler policy
+ if (rangeL == 0)
+ return ThreadPriority::eNORMAL;
+
+ float floatPrio = (float(maxL - inPrio) * float(rangeNV)) / float(rangeL);
+
+ return ThreadPriority::Enum(int(roundf(floatPrio)));
+ }
+
+ static int convertPriorityToLinux(ThreadPriority::Enum inPrio, int policy)
+ {
+ int maxL = sched_get_priority_max(policy);
+ int minL = sched_get_priority_min(policy);
+ int rangeL = maxL - minL;
+ int rangeNV = ThreadPriority::eLOW - ThreadPriority::eHIGH;
+
+ // case for default scheduler policy
+ if (rangeL == 0)
+ return 0;
+
+ float floatPrio = (float(ThreadPriority::eLOW - inPrio) * float(rangeL)) / float(rangeNV);
+
+ return minL + int(roundf(floatPrio));
+ }
+#endif
+
+ void Thread::setPriority(ThreadPriority::Enum val)
+ {
+#if !defined(QT3DS_APPLE) && !defined(__INTEGRITY)
+ int policy;
+ sched_param s_param;
+ pthread_getschedparam(mImpl->thread, &policy, &s_param);
+ s_param.sched_priority = convertPriorityToLinux(val, policy);
+ pthread_setschedparam(mImpl->thread, policy, &s_param);
+#endif
+ }
+
+ ThreadPriority::Enum Thread::getPriority(Id pthread)
+ {
+#if !defined(QT3DS_APPLE) && !defined(__INTEGRITY)
+ int policy;
+ sched_param s_param;
+ int ret = pthread_getschedparam(pthread_t(pthread), &policy, &s_param);
+ if (ret == 0)
+ return convertPriorityFromLinux(s_param.sched_priority, policy);
+ else
+ return ThreadPriority::eNORMAL;
+#else
+ return ThreadPriority::eNORMAL;
+#endif
+ }
+
+ QT3DSU32 TlsAlloc()
+ {
+#if !defined(__INTEGRITY)
+ pthread_key_t key;
+ int status = pthread_key_create(&key, NULL);
+ QT3DS_ASSERT(!status);
+ (void)status;
+ return (QT3DSU32)key;
+#else
+ QT3DS_ASSERT(false);
+ return 0;
+#endif
+ }
+
+ void TlsFree(QT3DSU32 index)
+ {
+ int status = pthread_key_delete((pthread_key_t)index);
+ QT3DS_ASSERT(!status);
+ (void)status;
+ }
+
+ void *TlsGet(QT3DSU32 index) { return (void *)pthread_getspecific((pthread_key_t)index); }
+
+ QT3DSU32 TlsSet(QT3DSU32 index, void *value)
+ {
+ int status = pthread_setspecific((pthread_key_t)index, value);
+ QT3DS_ASSERT(!status);
+ return !status;
+ }
+
+ // DM: On Linux x86-32, without implementation-specific restrictions
+ // the default stack size for a new thread should be 2 megabytes (kernel.org).
+ // NOTE: take care of this value on other architecutres!
+ const QT3DSU32 Thread::DEFAULT_STACK_SIZE = 1 << 21;
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/linux/Qt3DSLinuxTime.cpp b/src/foundation/linux/Qt3DSLinuxTime.cpp
new file mode 100644
index 0000000..6b3e93e
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxTime.cpp
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSTime.h"
+
+#include <time.h>
+#include <sys/time.h>
+
+#if defined QT3DS_APPLE
+#include <mach/mach_time.h>
+#endif
+
+// Use real-time high-precision timer.
+#ifndef QT3DS_APPLE
+#define CLOCKID CLOCK_REALTIME
+#endif
+
+namespace qt3ds {
+namespace foundation {
+
+ const CounterFrequencyToTensOfNanos Time::sCounterFreq = Time::getCounterFrequency();
+
+ static Time::Second getTimeSeconds()
+ {
+ static struct timeval _tv;
+ gettimeofday(&_tv, NULL);
+ return double(_tv.tv_sec) + double(_tv.tv_usec) * 0.000001;
+ }
+
+ Time::Time() { mLastTime = getTimeSeconds(); }
+
+ Time::Second Time::getElapsedSeconds()
+ {
+ Time::Second curTime = getTimeSeconds();
+ Time::Second diff = curTime - mLastTime;
+ mLastTime = curTime;
+ return diff;
+ }
+
+ Time::Second Time::peekElapsedSeconds()
+ {
+ Time::Second curTime = getTimeSeconds();
+ Time::Second diff = curTime - mLastTime;
+ return diff;
+ }
+
+ Time::Second Time::getLastTime() const { return mLastTime; }
+
+#ifdef QT3DS_APPLE
+ CounterFrequencyToTensOfNanos Time::getCounterFrequency()
+ {
+ mach_timebase_info_data_t info;
+ mach_timebase_info(&info);
+ // sschirm: some code in the PhysX samples assumes that
+ // CounterFrequencyToTensOfNanos::mDenominator is #ticks/second
+ // which is bad since it ignores the numenator. This is a temporary fix
+ // with the same setup as windows
+ // return CounterFrequencyToTensOfNanos( info.numer, info.denom*10 );
+ return CounterFrequencyToTensOfNanos(sNumTensOfNanoSecondsInASecond,
+ info.denom * 1000000000 / info.numer);
+ }
+
+ QT3DSU64 Time::getCurrentCounterValue() { return mach_absolute_time(); }
+
+#else
+
+ CounterFrequencyToTensOfNanos Time::getCounterFrequency()
+ {
+ return CounterFrequencyToTensOfNanos(1, 10);
+ }
+
+ QT3DSU64 Time::getCurrentCounterValue()
+ {
+ struct timespec mCurrTimeInt;
+ clock_gettime(CLOCKID, &mCurrTimeInt);
+ // Convert to nanos as this doesn't cause a large divide here
+ return (static_cast<QT3DSU64>(mCurrTimeInt.tv_sec) * 1000000000)
+ + (static_cast<QT3DSU64>(mCurrTimeInt.tv_nsec));
+ }
+#endif
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/linux/Qt3DSLinuxTrigConstants.h b/src/foundation/linux/Qt3DSLinuxTrigConstants.h
new file mode 100644
index 0000000..120dec7
--- /dev/null
+++ b/src/foundation/linux/Qt3DSLinuxTrigConstants.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_LINUX_TRIG_CONSTANTS_H
+#define QT3DS_LINUX_TRIG_CONSTANTS_H
+
+//#define QT3DS_GLOBALCONST extern const __declspec(selectany)
+
+#define QT3DS_GLOBALCONST extern const __attribute__((weak))
+
+QT3DS_ALIGN_PREFIX(16)
+struct QT3DS_VECTORF32
+{
+ float f[4];
+};
+
+#define QT3DS_PI 3.141592654f
+#define QT3DS_2PI 6.283185307f
+#define QT3DS_1DIVPI 0.318309886f
+#define QT3DS_1DIV2PI 0.159154943f
+#define QT3DS_PIDIV2 1.570796327f
+#define QT3DS_PIDIV4 0.785398163f
+
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinCoefficients0 = { 1.0f, -0.166666667f, 8.333333333e-3f,
+ -1.984126984e-4f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinCoefficients1 = { 2.755731922e-6f, -2.505210839e-8f,
+ 1.605904384e-10f, -7.647163732e-13f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinCoefficients2 = { 2.811457254e-15f, -8.220635247e-18f,
+ 1.957294106e-20f, -3.868170171e-23f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosCoefficients0 = { 1.0f, -0.5f, 4.166666667e-2f,
+ -1.388888889e-3f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosCoefficients1 = { 2.480158730e-5f, -2.755731922e-7f,
+ 2.087675699e-9f, -1.147074560e-11f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosCoefficients2 = { 4.779477332e-14f, -1.561920697e-16f,
+ 4.110317623e-19f, -8.896791392e-22f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanCoefficients0 = { 1.0f, 0.333333333f, 0.133333333f,
+ 5.396825397e-2f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanCoefficients1 = { 2.186948854e-2f, 8.863235530e-3f,
+ 3.592128167e-3f, 1.455834485e-3f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanCoefficients2 = { 5.900274264e-4f, 2.391290764e-4f,
+ 9.691537707e-5f, 3.927832950e-5f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinCoefficients0 = { -0.05806367563904f, -0.41861972469416f,
+ 0.22480114791621f, 2.17337241360606f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinCoefficients1 = { 0.61657275907170f, 4.29696498283455f,
+ -1.18942822255452f, -6.53784832094831f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinCoefficients2 = { -1.36926553863413f, -4.48179294237210f,
+ 1.41810672941833f, 5.48179257935713f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanCoefficients0 = { 1.0f, 0.333333334f, 0.2f, 0.142857143f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanCoefficients1 = { 1.111111111e-1f, 9.090909091e-2f,
+ 7.692307692e-2f, 6.666666667e-2f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanCoefficients2 = { 5.882352941e-2f, 5.263157895e-2f,
+ 4.761904762e-2f, 4.347826087e-2f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinEstCoefficients = { 1.0f, -1.66521856991541e-1f,
+ 8.199913018755e-3f, -1.61475937228e-4f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosEstCoefficients = { 1.0f, -4.95348008918096e-1f,
+ 3.878259962881e-2f, -9.24587976263e-4f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanEstCoefficients = { 2.484f, -1.954923183e-1f, 2.467401101f,
+ QT3DS_1DIVPI };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanEstCoefficients = { 7.689891418951e-1f, 1.104742493348f,
+ 8.661844266006e-1f, QT3DS_PIDIV2 };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinEstCoefficients = { -1.36178272886711f, 2.37949493464538f,
+ -8.08228565650486e-1f,
+ 2.78440142746736e-1f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinEstConstants = { 1.00000011921f, QT3DS_PIDIV2, 0.0f, 0.0f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXPiConstants0 = { QT3DS_PI, QT3DS_2PI, QT3DS_1DIVPI, QT3DS_1DIV2PI };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXReciprocalTwoPi = { QT3DS_1DIV2PI, QT3DS_1DIV2PI, QT3DS_1DIV2PI,
+ QT3DS_1DIV2PI };
+
+#endif
diff --git a/src/foundation/linux/SocketImpl.h b/src/foundation/linux/SocketImpl.h
new file mode 100644
index 0000000..4c3fcb7
--- /dev/null
+++ b/src/foundation/linux/SocketImpl.h
@@ -0,0 +1,424 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef FOUNDATION_LINUX_SOCKET_IMPL_H
+#define FOUNDATION_LINUX_SOCKET_IMPL_H
+#pragma once
+
+/*=========================================================================*\
+* BSD include files
+\*=========================================================================*/
+/* error codes */
+#include <errno.h>
+/* close function */
+#include <unistd.h>
+/* fnctnl function and associated constants */
+#include <fcntl.h>
+/* struct sockaddr */
+#include <sys/types.h>
+/* socket function */
+#include <sys/socket.h>
+/* struct timeval */
+#include <sys/time.h>
+/* gethostbyname and gethostbyaddr functions */
+#include <netdb.h>
+/* sigpipe handling */
+#include <signal.h>
+/* IP stuff*/
+#include <netinet/in.h>
+#include <arpa/inet.h>
+/* TCP options (nagle algorithm disable) */
+#include <netinet/tcp.h>
+
+namespace qt3ds {
+namespace foundation {
+ namespace socketimpl {
+ // Functions take from lua socket implementation. Note that it has an MIT license.
+
+ enum {
+ IO_DONE = 0, /* operation completed successfully */
+ IO_TIMEOUT = -1, /* operation timed out */
+ IO_CLOSED = -2, /* the connection has been closed */
+ IO_UNKNOWN = -3
+ };
+
+ /*-------------------------------------------------------------------------*\
+ * I/O error strings
+ \*-------------------------------------------------------------------------*/
+ const char *io_strerror(int err)
+ {
+ switch (err) {
+ case IO_DONE:
+ return NULL;
+ case IO_CLOSED:
+ return "closed";
+ case IO_TIMEOUT:
+ return "timeout";
+ default:
+ return "unknown error";
+ }
+ }
+
+ typedef int t_socket;
+ typedef t_socket *p_socket;
+ typedef struct sockaddr SA;
+
+#define SOCKET_INVALID (-1)
+
+#define WAITFD_R 1
+#define WAITFD_W 2
+#define WAITFD_C (WAITFD_R | WAITFD_W)
+
+ int socket_waitfd(p_socket ps, int sw, QT3DSU32 tm)
+ {
+ int ret;
+ fd_set rfds, wfds, *rp, *wp;
+ struct timeval tv, *tp = NULL;
+ if (tm == 0)
+ return IO_TIMEOUT; /* optimize timeout == 0 case */
+ if (tm < QT3DS_MAX_U32) {
+ // shoule consider max timeout specially by setting tp = NULL
+ // or you get invalid argument errno = 22
+ tv.tv_sec = (int)(tm / 1000);
+ QT3DSU32 leftover = tm % 1000;
+ tv.tv_usec = (int)(leftover * 100000);
+ tp = &tv;
+ }
+ do {
+ /* must set bits within loop, because select may have modifed them */
+ rp = wp = NULL;
+ if (sw & WAITFD_R) {
+ FD_ZERO(&rfds);
+ FD_SET(*ps, &rfds);
+ rp = &rfds;
+ }
+ if (sw & WAITFD_W) {
+ FD_ZERO(&wfds);
+ FD_SET(*ps, &wfds);
+ wp = &wfds;
+ }
+ ret = select(*ps + 1, rp, wp, NULL, tp);
+ } while (ret == -1 && errno == EINTR);
+ if (ret == -1)
+ return errno;
+ if (ret == 0)
+ return IO_TIMEOUT;
+ if (sw == WAITFD_C && FD_ISSET(*ps, &rfds))
+ return IO_CLOSED;
+ return IO_DONE;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Initializes module
+ \*-------------------------------------------------------------------------*/
+ int socket_open(void)
+ {
+ /* instals a handler to ignore sigpipe or it will crash us */
+ signal(SIGPIPE, SIG_IGN);
+ return 1;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Close module
+ \*-------------------------------------------------------------------------*/
+ int socket_close(void) { return 1; }
+
+ /*-------------------------------------------------------------------------*\
+ * Put socket into blocking mode
+ \*-------------------------------------------------------------------------*/
+ void socket_setblocking(p_socket ps)
+ {
+ int flags = fcntl(*ps, F_GETFL, 0);
+ flags &= (~(O_NONBLOCK));
+ fcntl(*ps, F_SETFL, flags);
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Put socket into non-blocking mode
+ \*-------------------------------------------------------------------------*/
+ void socket_setnonblocking(p_socket ps)
+ {
+ int flags = fcntl(*ps, F_GETFL, 0);
+ flags |= O_NONBLOCK;
+ fcntl(*ps, F_SETFL, flags);
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Close and inutilize socket
+ \*-------------------------------------------------------------------------*/
+ void socket_destroy(p_socket ps)
+ {
+ if (*ps != SOCKET_INVALID) {
+ socket_setblocking(ps);
+ close(*ps);
+ *ps = SOCKET_INVALID;
+ }
+ }
+ /*-------------------------------------------------------------------------*\
+ *
+ \*-------------------------------------------------------------------------*/
+ void socket_shutdown(p_socket ps, int how)
+ {
+ socket_setblocking(ps);
+ shutdown(*ps, how);
+ socket_setnonblocking(ps);
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Creates and sets up a socket
+ \*-------------------------------------------------------------------------*/
+ int socket_create(p_socket ps, int domain, int type, int protocol)
+ {
+ *ps = socket(domain, type, protocol);
+ if (*ps != SOCKET_INVALID)
+ return IO_DONE;
+ else
+ return errno;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ *
+ \*-------------------------------------------------------------------------*/
+ int socket_listen(p_socket ps, int backlog)
+ {
+ int err = IO_DONE;
+ socket_setblocking(ps);
+ if (listen(*ps, backlog))
+ err = errno;
+ socket_setnonblocking(ps);
+ return err;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Binds or returns error message
+ \*-------------------------------------------------------------------------*/
+ int socket_bind(p_socket ps, SA *addr, socklen_t len)
+ {
+ int err = IO_DONE;
+ socket_setblocking(ps);
+ if (bind(*ps, addr, len) < 0)
+ err = errno;
+ socket_setnonblocking(ps);
+ return err;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Connects or returns error message
+ \*-------------------------------------------------------------------------*/
+ int socket_connect(p_socket ps, SA *addr, socklen_t len, QT3DSU32 tm)
+ {
+ int err;
+ /* avoid calling on closed sockets */
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ /* call connect until done or failed without being interrupted */
+ do
+ if (connect(*ps, addr, len) == 0)
+ return IO_DONE;
+ while ((err = errno) == EINTR);
+ /* if connection failed immediately, return error code */
+ if (err != EINPROGRESS && err != EAGAIN)
+ return err;
+ /* zero timeout case optimization */
+ if (tm == 0)
+ return IO_TIMEOUT;
+ /* wait until we have the result of the connection attempt or timeout */
+ err = socket_waitfd(ps, WAITFD_C, tm);
+ if (err == IO_CLOSED) {
+ if (recv(*ps, (char *)&err, 0, 0) == 0)
+ return IO_DONE;
+ else
+ return errno;
+ } else
+ return err;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Accept with timeout
+ \*-------------------------------------------------------------------------*/
+ int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, QT3DSU32 tm)
+ {
+ SA daddr;
+ socklen_t dlen = sizeof(daddr);
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ if (!addr)
+ addr = &daddr;
+ if (!len)
+ len = &dlen;
+ for (;;) {
+ int err;
+ if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID)
+ return IO_DONE;
+ err = errno;
+ if (err == EINTR)
+ continue;
+ if (err != EAGAIN && err != ECONNABORTED)
+ return err;
+ if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE)
+ return err;
+ }
+ /* can't reach here */
+ return IO_UNKNOWN;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Send with timeout
+ \*-------------------------------------------------------------------------*/
+ int socket_send(p_socket ps, const char *data, size_t count, size_t *sent, QT3DSU32 tm)
+ {
+ int err;
+ *sent = 0;
+ /* avoid making system calls on closed sockets */
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ /* loop until we send something or we give up on error */
+ for (;;) {
+ long put = (long)send(*ps, data, count, 0);
+ /* if we sent anything, we are done */
+ if (put > 0) {
+ *sent = put;
+ return IO_DONE;
+ }
+ err = errno;
+ /* send can't really return 0, but EPIPE means the connection was closed */
+ if (put == 0 || err == EPIPE)
+ return IO_CLOSED;
+ /* we call was interrupted, just try again */
+ if (err == EINTR)
+ continue;
+ /* if failed fatal reason, report error */
+ if (err != EAGAIN)
+ return err;
+ /* wait until we can send something or we timeout */
+ if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE)
+ return err;
+ }
+ /* can't reach here */
+ return IO_UNKNOWN;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Receive with timeout
+ \*-------------------------------------------------------------------------*/
+ int socket_recv(p_socket ps, char *data, size_t count, size_t *got, QT3DSU32 tm)
+ {
+ int err;
+ *got = 0;
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ for (;;) {
+ long taken = (long)recv(*ps, data, count, 0);
+ if (taken > 0) {
+ *got = taken;
+ return IO_DONE;
+ }
+ err = errno;
+ if (taken == 0)
+ return IO_CLOSED;
+ if (err == EINTR)
+ continue;
+ if (err != EAGAIN)
+ return err;
+ if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE)
+ return err;
+ }
+ return IO_UNKNOWN;
+ }
+
+ int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp)
+ {
+ *hp = gethostbyaddr(addr, len, AF_INET);
+ if (*hp)
+ return IO_DONE;
+ else if (h_errno)
+ return h_errno;
+ else if (errno)
+ return errno;
+ else
+ return IO_UNKNOWN;
+ }
+
+ int socket_gethostbyname(const char *addr, struct hostent **hp)
+ {
+ *hp = gethostbyname(addr);
+ if (*hp)
+ return IO_DONE;
+ else if (h_errno)
+ return h_errno;
+ else if (errno)
+ return errno;
+ else
+ return IO_UNKNOWN;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Error translation functions
+ * Make sure important error messages are standard
+ \*-------------------------------------------------------------------------*/
+ const char *socket_hoststrerror(int err)
+ {
+ if (err <= 0)
+ return io_strerror(err);
+ switch (err) {
+ case HOST_NOT_FOUND:
+ return "host not found";
+ default:
+ return hstrerror(err);
+ }
+ }
+
+ const char *socket_strerror(int err)
+ {
+ if (err <= 0)
+ return io_strerror(err);
+ switch (err) {
+ case EADDRINUSE:
+ return "address already in use";
+ case EISCONN:
+ return "already connected";
+ case EACCES:
+ return "permission denied";
+ case ECONNREFUSED:
+ return "connection refused";
+ case ECONNABORTED:
+ return "closed";
+ case ECONNRESET:
+ return "closed";
+ case ETIMEDOUT:
+ return "timeout";
+ default:
+ return strerror(errno);
+ }
+ }
+ }
+}
+}
+
+#endif
diff --git a/src/foundation/linux/qt_attribution.json b/src/foundation/linux/qt_attribution.json
new file mode 100644
index 0000000..3c3bed6
--- /dev/null
+++ b/src/foundation/linux/qt_attribution.json
@@ -0,0 +1,10 @@
+{
+ "Id": "qt3dslinuxinlineaos",
+ "Name": "Qt3DSLinuxInlineAoS",
+ "QDocModule": "qt3dstudio",
+ "QtUsage": "Used by Qt3DStudio, Runtime component.",
+
+ "License": "Other",
+ "LicenseFile": "LICENSE.TXT",
+ "Copyright": "Copyright (c) 2001 Intel Corporation."
+}
diff --git a/src/foundation/macos/Qt3DSUnixAtomic.cpp b/src/foundation/macos/Qt3DSUnixAtomic.cpp
new file mode 100644
index 0000000..c1ac396
--- /dev/null
+++ b/src/foundation/macos/Qt3DSUnixAtomic.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2001-2004 NovodeX AG.
+** Copyright (C) 2004-2008 AGEIA Technologies, Inc.
+** Copyright (C) 2008-2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAtomic.h"
+
+#define PAUSE() asm("nop")
+
+namespace qt3ds {
+namespace foundation {
+
+ void *atomicCompareExchangePointer(volatile void **dest, void *exch, void *comp)
+ {
+ return __sync_val_compare_and_swap((void **)dest, comp, exch);
+ }
+
+ QT3DSI32 atomicCompareExchange(volatile QT3DSI32 *dest, QT3DSI32 exch, QT3DSI32 comp)
+ {
+ return __sync_val_compare_and_swap(dest, comp, exch);
+ }
+
+ QT3DSI32 atomicIncrement(volatile QT3DSI32 *val) { return __sync_add_and_fetch(val, 1); }
+
+ QT3DSI32 atomicDecrement(volatile QT3DSI32 *val) { return __sync_sub_and_fetch(val, 1); }
+
+ QT3DSI32 atomicAdd(volatile QT3DSI32 *val, QT3DSI32 delta) { return __sync_add_and_fetch(val, delta); }
+
+ QT3DSI32 atomicMax(volatile QT3DSI32 *val, QT3DSI32 val2)
+ {
+ QT3DSI32 oldVal, newVal;
+
+ do {
+ PAUSE();
+ oldVal = *val;
+
+ if (val2 > oldVal)
+ newVal = val2;
+ else
+ newVal = oldVal;
+
+ } while (atomicCompareExchange(val, newVal, oldVal) != oldVal);
+
+ return *val;
+ }
+
+ QT3DSI32 atomicExchange(volatile QT3DSI32 *val, QT3DSI32 val2)
+ {
+ QT3DSI32 newVal, oldVal;
+
+ do {
+ PAUSE();
+ oldVal = *val;
+ newVal = val2;
+ } while (atomicCompareExchange(val, newVal, oldVal) != oldVal);
+
+ return oldVal;
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/macos/Qt3DSUnixFPU.cpp b/src/foundation/macos/Qt3DSUnixFPU.cpp
new file mode 100644
index 0000000..59c9850
--- /dev/null
+++ b/src/foundation/macos/Qt3DSUnixFPU.cpp
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2001-2004 NovodeX AG.
+** Copyright (C) 2004-2008 AGEIA Technologies, Inc.
+** Copyright (C) 2008-2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSFPU.h"
+#include <fenv.h>
+
+#if !(defined(__CYGWIN__) || defined(PX_ANDROID))
+QT3DS_COMPILE_TIME_ASSERT(8 * sizeof(qt3ds::QT3DSU32) >= sizeof(fenv_t));
+#endif
+
+qt3ds::foundation::FPUGuard::FPUGuard()
+{
+#if defined(__CYGWIN__)
+#pragma message "FPUGuard::FPUGuard() is not implemented"
+#elif defined(PX_ANDROID)
+// not supported unless ARM_HARD_FLOAT is enabled.
+#else
+ fegetenv(reinterpret_cast<fenv_t *>(mControlWords));
+ fesetenv(FE_DFL_ENV);
+#endif
+}
+
+qt3ds::foundation::FPUGuard::~FPUGuard()
+{
+#if defined(__CYGWIN__)
+#pragma message "FPUGuard::~FPUGuard() is not implemented"
+#elif defined(PX_ANDROID)
+// not supported unless ARM_HARD_FLOAT is enabled.
+#else
+ fesetenv(reinterpret_cast<fenv_t *>(mControlWords));
+#endif
+}
diff --git a/src/foundation/macos/Qt3DSUnixMutex.cpp b/src/foundation/macos/Qt3DSUnixMutex.cpp
new file mode 100644
index 0000000..bbc5582
--- /dev/null
+++ b/src/foundation/macos/Qt3DSUnixMutex.cpp
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSAtomic.h"
+
+#include <pthread.h>
+
+namespace qt3ds {
+namespace foundation {
+
+ namespace {
+ pthread_mutex_t *getMutex(MutexImpl *impl)
+ {
+ return reinterpret_cast<pthread_mutex_t *>(impl);
+ }
+ }
+
+ MutexImpl::MutexImpl()
+ {
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(getMutex(this), &attr);
+ pthread_mutexattr_destroy(&attr);
+ }
+
+ MutexImpl::~MutexImpl() { pthread_mutex_destroy(getMutex(this)); }
+
+ bool MutexImpl::lock() { return !pthread_mutex_lock(getMutex(this)); }
+
+ bool MutexImpl::trylock() { return !pthread_mutex_trylock(getMutex(this)); }
+
+ bool MutexImpl::unlock() { return !pthread_mutex_unlock(getMutex(this)); }
+
+ const QT3DSU32 MutexImpl::size = sizeof(pthread_mutex_t);
+
+ class ReadWriteLockImpl
+ {
+ public:
+ ReadWriteLockImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ pthread_mutex_t mutex;
+ volatile int readerCounter;
+ };
+
+ ReadWriteLock::ReadWriteLock(NVAllocatorCallback &alloc)
+ {
+ mImpl = QT3DS_NEW(alloc, ReadWriteLockImpl)(alloc);
+
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&mImpl->mutex, &attr);
+ pthread_mutexattr_destroy(&attr);
+
+ mImpl->readerCounter = 0;
+ }
+
+ ReadWriteLock::~ReadWriteLock()
+ {
+ pthread_mutex_destroy(&mImpl->mutex);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ void ReadWriteLock::lockReader()
+ {
+ pthread_mutex_lock(&mImpl->mutex);
+
+ atomicIncrement(&mImpl->readerCounter);
+
+ pthread_mutex_unlock(&mImpl->mutex);
+ }
+
+ void ReadWriteLock::lockWriter()
+ {
+ pthread_mutex_lock(&mImpl->mutex);
+
+ while (mImpl->readerCounter != 0)
+ ;
+ }
+
+ void ReadWriteLock::unlockReader() { atomicDecrement(&mImpl->readerCounter); }
+
+ void ReadWriteLock::unlockWriter() { pthread_mutex_unlock(&mImpl->mutex); }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/macos/Qt3DSUnixSemaphore.cpp b/src/foundation/macos/Qt3DSUnixSemaphore.cpp
new file mode 100644
index 0000000..90aab79
--- /dev/null
+++ b/src/foundation/macos/Qt3DSUnixSemaphore.cpp
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSSemaphore.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+
+namespace qt3ds {
+namespace foundation {
+
+ class SemaphoreImpl
+ {
+ public:
+ SemaphoreImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ QT3DSU32 count;
+ QT3DSU32 maxCount;
+ };
+
+ struct NVLinuxScopeLock
+ {
+ NVLinuxScopeLock(pthread_mutex_t &m)
+ : mMutex(m)
+ {
+ pthread_mutex_lock(&mMutex);
+ }
+
+ ~NVLinuxScopeLock() { pthread_mutex_unlock(&mMutex); }
+ private:
+ pthread_mutex_t &mMutex;
+ };
+
+ Semaphore::Semaphore(NVAllocatorCallback &alloc, QT3DSU32 initialCount, QT3DSU32 maxCount)
+ {
+ mImpl = QT3DS_NEW(alloc, SemaphoreImpl)(alloc);
+ int status = pthread_mutex_init(&mImpl->mutex, 0);
+ QT3DS_ASSERT(!status);
+ status = pthread_cond_init(&mImpl->cond, 0);
+ QT3DS_ASSERT(!status);
+ mImpl->count = initialCount;
+ mImpl->maxCount = maxCount;
+ QT3DS_ASSERT(initialCount <= maxCount);
+ }
+
+ Semaphore::~Semaphore()
+ {
+ pthread_cond_destroy(&mImpl->cond);
+ pthread_mutex_destroy(&mImpl->mutex);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ bool Semaphore::wait(QT3DSU32 milliseconds)
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+
+ if (mImpl->count > 0) {
+ mImpl->count--;
+ return true;
+ }
+
+ if (milliseconds == 0) {
+ return false;
+ }
+
+ if (milliseconds == QT3DSU32(-1)) {
+ int status = pthread_cond_wait(&mImpl->cond, &mImpl->mutex);
+ QT3DS_ASSERT(!status);
+ (void)status;
+ } else {
+ timespec ts;
+ timeval tp;
+ gettimeofday(&tp, NULL);
+ QT3DSU32 sec = milliseconds / 1000;
+ QT3DSU32 usec = (milliseconds - 1000 * sec) * 1000;
+
+ // sschirm: taking into account that us might accumulate to a second
+ // otherwise the pthread_cond_timedwait complains on osx.
+ usec = tp.tv_usec + usec;
+ QT3DSU32 div_sec = usec / 1000000;
+ QT3DSU32 rem_usec = usec - div_sec * 1000000;
+
+ ts.tv_sec = tp.tv_sec + sec + div_sec;
+ ts.tv_nsec = rem_usec * 1000;
+
+ int ierr = pthread_cond_timedwait(&mImpl->cond, &mImpl->mutex, &ts);
+ QT3DS_ASSERT((ierr == 0) || (ierr == ETIMEDOUT));
+ (void)ierr;
+ return false;
+ }
+
+ return true;
+ }
+
+ void Semaphore::post()
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ mImpl->count++;
+ if (mImpl->count > mImpl->maxCount)
+ mImpl->count = mImpl->maxCount;
+ else {
+ pthread_cond_broadcast(&mImpl->cond);
+ }
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/macos/Qt3DSUnixSync.cpp b/src/foundation/macos/Qt3DSUnixSync.cpp
new file mode 100644
index 0000000..52f9d7a
--- /dev/null
+++ b/src/foundation/macos/Qt3DSUnixSync.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <time.h>
+#include <sys/time.h>
+
+namespace qt3ds {
+namespace foundation {
+
+ class SyncImpl
+ {
+ public:
+ SyncImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ volatile bool is_set;
+ };
+
+ struct NVLinuxScopeLock
+ {
+ NVLinuxScopeLock(pthread_mutex_t &m)
+ : mMutex(m)
+ {
+ pthread_mutex_lock(&mMutex);
+ }
+
+ ~NVLinuxScopeLock() { pthread_mutex_unlock(&mMutex); }
+ private:
+ pthread_mutex_t &mMutex;
+ };
+
+ Sync::Sync(NVAllocatorCallback &alloc)
+ {
+ mImpl = QT3DS_NEW(alloc, SyncImpl)(alloc);
+ int status = pthread_mutex_init(&mImpl->mutex, 0);
+ QT3DS_ASSERT(!status);
+ status = pthread_cond_init(&mImpl->cond, 0);
+ QT3DS_ASSERT(!status);
+ mImpl->is_set = false;
+ }
+
+ Sync::~Sync()
+ {
+ pthread_cond_destroy(&mImpl->cond);
+ pthread_mutex_destroy(&mImpl->mutex);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ void Sync::reset()
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ mImpl->is_set = false;
+ }
+
+ void Sync::set()
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ if (!mImpl->is_set) {
+ mImpl->is_set = true;
+ pthread_cond_broadcast(&mImpl->cond);
+ }
+ }
+
+ bool Sync::wait(QT3DSU32 ms)
+ {
+ NVLinuxScopeLock lock(mImpl->mutex);
+ if (!mImpl->is_set) {
+ if (ms == QT3DSU32(-1)) {
+ int status = pthread_cond_wait(&mImpl->cond, &mImpl->mutex);
+ QT3DS_ASSERT(!status);
+ (void)status;
+ } else {
+ timespec ts;
+ timeval tp;
+ gettimeofday(&tp, NULL);
+ QT3DSU32 sec = ms / 1000;
+ QT3DSU32 usec = (ms - 1000 * sec) * 1000;
+
+ // sschirm: taking into account that us might accumulate to a second
+ // otherwise the pthread_cond_timedwait complains on osx.
+ usec = tp.tv_usec + usec;
+ QT3DSU32 div_sec = usec / 1000000;
+ QT3DSU32 rem_usec = usec - div_sec * 1000000;
+
+ ts.tv_sec = tp.tv_sec + sec + div_sec;
+ ts.tv_nsec = rem_usec * 1000;
+
+ int ierr = pthread_cond_timedwait(&mImpl->cond, &mImpl->mutex, &ts);
+ QT3DS_ASSERT((ierr == 0) || (ierr == ETIMEDOUT));
+ (void)ierr;
+ }
+ }
+ return mImpl->is_set;
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/macos/Qt3DSUnixTime.cpp b/src/foundation/macos/Qt3DSUnixTime.cpp
new file mode 100644
index 0000000..58eadcb
--- /dev/null
+++ b/src/foundation/macos/Qt3DSUnixTime.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2001-2004 NovodeX AG.
+** Copyright (C) 2004-2008 AGEIA Technologies, Inc.
+** Copyright (C) 2008-2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSTime.h"
+
+#include <time.h>
+#include <sys/time.h>
+
+#if defined QT3DS_APPLE
+#include <mach/mach_time.h>
+#endif
+
+// Use real-time high-precision timer.
+#ifndef QT3DS_APPLE
+#define CLOCKID CLOCK_REALTIME
+#endif
+
+namespace qt3ds {
+namespace foundation {
+
+ const CounterFrequencyToTensOfNanos Time::sCounterFreq = Time::getCounterFrequency();
+
+ static Time::Second getTimeSeconds()
+ {
+ static struct timeval _tv;
+ gettimeofday(&_tv, NULL);
+ return double(_tv.tv_sec) + double(_tv.tv_usec) * 0.000001;
+ }
+
+ Time::Time() { mLastTime = getTimeSeconds(); }
+
+ Time::Second Time::getElapsedSeconds()
+ {
+ Time::Second curTime = getTimeSeconds();
+ Time::Second diff = curTime - mLastTime;
+ mLastTime = curTime;
+ return diff;
+ }
+
+ Time::Second Time::peekElapsedSeconds()
+ {
+ Time::Second curTime = getTimeSeconds();
+ Time::Second diff = curTime - mLastTime;
+ return diff;
+ }
+
+ Time::Second Time::getLastTime() const { return mLastTime; }
+
+#ifdef QT3DS_APPLE
+ CounterFrequencyToTensOfNanos Time::getCounterFrequency()
+ {
+ mach_timebase_info_data_t info;
+ mach_timebase_info(&info);
+ // mach_absolute_time * (info.numer/info.denom) is in units of nano seconds
+ return CounterFrequencyToTensOfNanos(info.numer, info.denom * 10);
+ }
+
+ QT3DSU64 Time::getCurrentCounterValue() { return mach_absolute_time(); }
+
+#else
+
+ CounterFrequencyToTensOfNanos Time::getCounterFrequency()
+ {
+ return CounterFrequencyToTensOfNanos(1, 10);
+ }
+
+ PxU64 Time::getCurrentCounterValue()
+ {
+ struct timespec mCurrTimeInt;
+ clock_gettime(CLOCKID, &mCurrTimeInt);
+ // Convert to nanos as this doesn't cause a large divide here
+ return (static_cast<PxU64>(mCurrTimeInt.tv_sec) * 1000000000)
+ + (static_cast<PxU64>(mCurrTimeInt.tv_nsec));
+ }
+#endif
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/qt/formatdiscovery.cpp b/src/foundation/qt/formatdiscovery.cpp
new file mode 100644
index 0000000..7ea762b
--- /dev/null
+++ b/src/foundation/qt/formatdiscovery.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui/qopenglcontext.h>
+#include <QtGui/qoffscreensurface.h>
+#include <QtGui/qopenglfunctions.h>
+#include <QtGui/qopengltexture.h>
+
+#include "qstudio3dglobal.h"
+#include "Qt3DSFoundation.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace Q3DS {
+
+static QSurfaceFormat findIdealGLVersion()
+{
+ QSurfaceFormat fmt;
+ fmt.setProfile(QSurfaceFormat::CoreProfile);
+
+ // Advanced: Try 4.3 core (so we get compute shaders for instance)
+ fmt.setVersion(4, 3);
+ QOpenGLContext ctx;
+ ctx.setFormat(fmt);
+ if (ctx.create() && ctx.format().version() >= qMakePair(4, 3)) {
+ qDebug("Requesting OpenGL 4.3 core context succeeded");
+ return ctx.format();
+ }
+
+ // Basic: Stick with 3.3 for now to keep less fortunate, Mesa-based systems happy
+ fmt.setVersion(3, 3);
+ ctx.setFormat(fmt);
+ if (ctx.create() && ctx.format().version() >= qMakePair(3, 3)) {
+ qDebug("Requesting OpenGL 3.3 core context succeeded");
+ return ctx.format();
+ }
+
+ qWarning("Failed to get OpenGL 3.3 or OpenGL 4.3 context!");
+ return fmt;
+}
+
+static QSurfaceFormat findIdealGLESVersion()
+{
+ QSurfaceFormat fmt;
+
+ // Advanced: Try 3.1 (so we get compute shaders for instance)
+ fmt.setVersion(3, 1);
+ QOpenGLContext ctx;
+ ctx.setFormat(fmt);
+
+ // Now, it's important to check the format with the actual version (parsed
+ // back from GL_VERSION) since some implementations, ANGLE for instance,
+ // are broken and succeed the 3.1 context request even though they only
+ // support and return a 3.0 context. This is against the spec since 3.0 is
+ // obviously not backwards compatible with 3.1, but hey...
+ if (ctx.create() && ctx.format().version() >= qMakePair(3, 1)) {
+ qDebug("Requesting OpenGL ES 3.1 context succeeded");
+ return ctx.format();
+ }
+
+ // Basic: OpenGL ES 3.0 is a hard requirement at the moment since we can
+ // only generate 300 ES shaders, uniform buffers are mandatory.
+ fmt.setVersion(3, 0);
+ ctx.setFormat(fmt);
+ if (ctx.create() && ctx.format().version() >= qMakePair(3, 0)) {
+ qDebug("Requesting OpenGL ES 3.0 context succeeded");
+ return ctx.format();
+ }
+
+ fmt.setVersion(2, 0);
+ ctx.setFormat(fmt);
+ if (ctx.create()) {
+ qDebug("Requesting OpenGL ES 2.0 context succeeded");
+ return fmt;
+ }
+
+ qWarning("Failed to get OpenGL ES 2.0, 3.0 or 3.1 context");
+ return fmt;
+}
+
+QSurfaceFormat surfaceFormat()
+{
+ static const QSurfaceFormat f = [] {
+ QSurfaceFormat fmt;
+ // works in dynamic gl builds too because there's a qguiapp already
+ // this requirement is also a problem, see QT3DS-3603
+ if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL)
+ fmt = findIdealGLVersion();
+ else
+ fmt = findIdealGLESVersion();
+ fmt.setDepthBufferSize(24);
+ fmt.setStencilBufferSize(8);
+ // Ignore MSAA here as that is a per-layer setting.
+ return fmt;
+ }();
+ return f;
+}
+} // End namespace Q3DS
+
+QT_END_NAMESPACE
diff --git a/src/foundation/qt_attribution.json b/src/foundation/qt_attribution.json
new file mode 100644
index 0000000..537d8be
--- /dev/null
+++ b/src/foundation/qt_attribution.json
@@ -0,0 +1,22 @@
+{
+ "Id": "convertutf",
+ "Name": "ConvertUTF",
+ "QDocModule": "qt3dstudio",
+ "QtUsage": "Used by Qt3DStudio, Studio and Runtime components.",
+
+ "License": "Other",
+ "LicenseFile": "LICENSE_CONVERTUTF.TXT",
+ "Copyright": "Copyright 2001-2004 Unicode, Inc."
+}
+,
+{
+ "Id": "socket",
+ "Name": "Socket",
+ "QDocModule": "qt3dstudio",
+ "QtUsage": "Used by Qt3DStudio, Runtime component.",
+
+ "License": "MIT license",
+ "LicenseId": "MIT",
+ "LicenseFile": "LICENCE_SOCKET.TXT",
+ "Copyright": "Copyright (C) 2004-2013 Diego Nehab."
+}
diff --git a/src/foundation/windows/LICENSE.TXT b/src/foundation/windows/LICENSE.TXT
new file mode 100644
index 0000000..f40caef
--- /dev/null
+++ b/src/foundation/windows/LICENSE.TXT
@@ -0,0 +1,7 @@
+ Copyright (c) 2001 Intel Corporation.
+
+Permition is granted to use, copy, distribute and prepare derivative works
+of this library for any purpose and without fee, provided, that the above
+copyright notice and this statement appear in all copies.
+Intel makes no representations about the suitability of this library for
+any purpose, and specifically disclaims all warranties.
diff --git a/src/foundation/windows/Qt3DSWindowsAoS.h b/src/foundation/windows/Qt3DSWindowsAoS.h
new file mode 100644
index 0000000..c654ec7
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsAoS.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_WINDOWS_AOS_H
+#define QT3DS_WINDOWS_AOS_H
+
+// no includes here! this file should be included from NVcVecMath.h only!!!
+
+#if !COMPILE_VECTOR_INTRINSICS
+#error Vector intrinsics should not be included when using scalar implementation.
+#endif
+
+typedef __m128 FloatV;
+typedef __m128 Vec3V;
+typedef __m128 Vec4V;
+typedef __m128 BoolV;
+typedef __m128 VecU32V;
+typedef __m128 VecI32V;
+typedef __m128 VecU16V;
+typedef __m128 VecI16V;
+typedef __m128 VecU8V;
+typedef __m128 QuatV;
+
+#define FloatVArg FloatV &
+#define Vec3VArg Vec3V &
+#define Vec4VArg Vec4V &
+#define BoolVArg BoolV &
+#define VecU32VArg VecU32V &
+#define VecI32VArg VecI32V &
+#define VecU16VArg VecU16V &
+#define VecI16VArg VecI16V &
+#define VecU8VArg VecU8V &
+#define QuatVArg QuatV &
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat33V
+{
+ Mat33V() {}
+ Mat33V(const Vec3V &c0, const Vec3V &c1, const Vec3V &c2)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ {
+ }
+ Vec3V QT3DS_ALIGN(16, col0);
+ Vec3V QT3DS_ALIGN(16, col1);
+ Vec3V QT3DS_ALIGN(16, col2);
+} QT3DS_ALIGN_SUFFIX(16);
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat34V
+{
+ Mat34V() {}
+ Mat34V(const Vec3V &c0, const Vec3V &c1, const Vec3V &c2, const Vec3V &c3)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ , col3(c3)
+ {
+ }
+ Vec3V QT3DS_ALIGN(16, col0);
+ Vec3V QT3DS_ALIGN(16, col1);
+ Vec3V QT3DS_ALIGN(16, col2);
+ Vec3V QT3DS_ALIGN(16, col3);
+} QT3DS_ALIGN_SUFFIX(16);
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat43V
+{
+ Mat43V() {}
+ Mat43V(const Vec4V &c0, const Vec4V &c1, const Vec4V &c2)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ {
+ }
+ Vec4V QT3DS_ALIGN(16, col0);
+ Vec4V QT3DS_ALIGN(16, col1);
+ Vec4V QT3DS_ALIGN(16, col2);
+} QT3DS_ALIGN_SUFFIX(16);
+
+QT3DS_ALIGN_PREFIX(16)
+struct Mat44V
+{
+ Mat44V() {}
+ Mat44V(const Vec4V &c0, const Vec4V &c1, const Vec4V &c2, const Vec4V &c3)
+ : col0(c0)
+ , col1(c1)
+ , col2(c2)
+ , col3(c3)
+ {
+ }
+ Vec4V QT3DS_ALIGN(16, col0);
+ Vec4V QT3DS_ALIGN(16, col1);
+ Vec4V QT3DS_ALIGN(16, col2);
+ Vec4V QT3DS_ALIGN(16, col3);
+} QT3DS_ALIGN_SUFFIX(16);
+
+#endif // QT3DS_WINDOWS_AOS_H
diff --git a/src/foundation/windows/Qt3DSWindowsAtomic.cpp b/src/foundation/windows/Qt3DSWindowsAtomic.cpp
new file mode 100644
index 0000000..4f95d3d
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsAtomic.cpp
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/windows/Qt3DSWindowsInclude.h"
+#include "foundation/Qt3DSAtomic.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ QT3DSI32 atomicExchange(volatile QT3DSI32 *val, QT3DSI32 val2)
+ {
+ return (QT3DSI32)InterlockedExchange((volatile LONG *)val, (LONG)val2);
+ }
+
+ QT3DSI32 atomicCompareExchange(volatile QT3DSI32 *dest, QT3DSI32 exch, QT3DSI32 comp)
+ {
+ return (QT3DSI32)InterlockedCompareExchange((volatile LONG *)dest, exch, comp);
+ }
+
+ void *atomicCompareExchangePointer(volatile void **dest, void *exch, void *comp)
+ {
+ return InterlockedCompareExchangePointer((volatile PVOID *)dest, exch, comp);
+ }
+
+ QT3DSI32 atomicIncrement(volatile QT3DSI32 *val)
+ {
+ return (QT3DSI32)InterlockedIncrement((volatile LONG *)val);
+ }
+
+ QT3DSI32 atomicDecrement(volatile QT3DSI32 *val)
+ {
+ return (QT3DSI32)InterlockedDecrement((volatile LONG *)val);
+ }
+
+ QT3DSI32 atomicAdd(volatile QT3DSI32 *val, QT3DSI32 delta)
+ {
+ LONG newValue, oldValue;
+ do {
+ oldValue = *val;
+ newValue = oldValue + delta;
+ } while (InterlockedCompareExchange((volatile LONG *)val, newValue, oldValue) != oldValue);
+
+ return newValue;
+ }
+
+ QT3DSI32 atomicMax(volatile QT3DSI32 *val, QT3DSI32 val2)
+ {
+ // Could do this more efficiently in asm...
+
+ LONG newValue, oldValue;
+
+ do {
+ oldValue = *val;
+
+ if (val2 > oldValue)
+ newValue = val2;
+ else
+ newValue = oldValue;
+
+ } while (InterlockedCompareExchange((volatile LONG *)val, newValue, oldValue) != oldValue);
+
+ return newValue;
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/windows/Qt3DSWindowsFPU.cpp b/src/foundation/windows/Qt3DSWindowsFPU.cpp
new file mode 100644
index 0000000..4724280
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsFPU.cpp
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "foundation/Qt3DSFPU.h"
+#include "float.h"
+
+#ifdef QT3DS_X64
+#define _MCW_ALL _MCW_DN | _MCW_EM | _MCW_RC
+#else
+#define _MCW_ALL _MCW_DN | _MCW_EM | _MCW_IC | _MCW_RC | _MCW_PC
+#endif
+
+qt3ds::foundation::FPUGuard::FPUGuard()
+{
+// default plus FTZ and DAZ
+#if defined(QT3DS_WINDOWS) && defined(QT3DS_VC)
+#ifdef QT3DS_X64
+ _controlfp_s(mControlWords, _CW_DEFAULT | _DN_FLUSH, _MCW_ALL);
+#else
+ __control87_2(_CW_DEFAULT | _DN_FLUSH, _MCW_ALL, mControlWords, mControlWords + 1);
+#endif
+#endif
+}
+
+qt3ds::foundation::FPUGuard::~FPUGuard()
+{
+#if defined(QT3DS_WINDOWS) && defined(QT3DS_VC)
+#ifdef QT3DS_X64
+ _controlfp_s(mControlWords, *mControlWords, _MCW_ALL);
+#else
+ __control87_2(mControlWords[0], _MCW_ALL, mControlWords, 0);
+ __control87_2(mControlWords[1], _MCW_ALL, 0, mControlWords + 1);
+#endif
+#endif
+}
diff --git a/src/foundation/windows/Qt3DSWindowsFile.h b/src/foundation/windows/Qt3DSWindowsFile.h
new file mode 100644
index 0000000..6c232a5
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsFile.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_WINDOWS_FILE_H
+#define QT3DS_FOUNDATION_QT3DS_WINDOWS_FILE_H
+
+#include "foundation/Qt3DS.h"
+
+#include <stdio.h>
+
+namespace qt3ds {
+namespace foundation {
+ QT3DS_INLINE errno_t fopen_s(FILE **_File, const char *_Filename, const char *_Mode)
+ {
+ return ::fopen_s(_File, _Filename, _Mode);
+ };
+
+} // namespace foundation
+} // namespace qt3ds
+
+#endif
diff --git a/src/foundation/windows/Qt3DSWindowsInclude.h b/src/foundation/windows/Qt3DSWindowsInclude.h
new file mode 100644
index 0000000..f01c9f1
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsInclude.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef WINDOWSINCLUDE_H
+#define WINDOWSINCLUDE_H
+
+#include "foundation/Qt3DS.h"
+
+#ifndef _WIN32
+#error "This file should only be included by Windows builds!!"
+#endif
+
+#ifdef _WINDOWS_ // windows already included
+#error "Only include windows.h through this file!!"
+#endif
+
+// We only support >= Windows XP, and we need this for critical section and
+#define _WIN32_WINNT 0x0500
+
+// turn off as much as we can for windows. All we really need is the thread functions(critical
+// sections/Interlocked* etc)
+#define NOGDICAPMASKS
+#define NOVIRTUALKEYCODES
+#define NOWINMESSAGES
+#define NOWINSTYLES
+#define NOSYSMETRICS
+#define NOMENUS
+#define NOICONS
+#define NOKEYSTATES
+#define NOSYSCOMMANDS
+#define NORASTEROPS
+#define NOSHOWWINDOW
+#define NOATOM
+#define NOCLIPBOARD
+#define NOCOLOR
+#define NOCTLMGR
+#define NODRAWTEXT
+#define NOGDI
+#define NOUSER
+#define NONLS
+#define NOMB
+#define NOMEMMGR
+#define NOMETAFILE
+#define NOMSG
+#define NOOPENFILE
+#define NOSCROLL
+#define NOSERVICE
+#define NOSOUND
+#define NOTEXTMETRIC
+#define NOWH
+#define NOWINOFFSETS
+#define NOCOMM
+#define NOKANJI
+#define NOHELP
+#define NOPROFILER
+#define NODEFERWINDOWPOS
+#define NOMCX
+#define WIN32_LEAN_AND_MEAN
+
+#include <windows.h>
+
+#ifdef QT3DS_SUPPORT_SSE
+#include <xmmintrin.h>
+#endif
+
+#endif
diff --git a/src/foundation/windows/Qt3DSWindowsInlineAoS.h b/src/foundation/windows/Qt3DSWindowsInlineAoS.h
new file mode 100644
index 0000000..60c5789
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsInlineAoS.h
@@ -0,0 +1,2715 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+// Copyright (c) 2001 Intel Corporation.
+//
+// Permition is granted to use, copy, distribute and prepare derivative works
+// of this library for any purpose and without fee, provided, that the above
+// copyright notice and this statement appear in all copies.
+// Intel makes no representations about the suitability of this library for
+// any purpose, and specifically disclaims all warranties.
+// See LEGAL.TXT for all the legal information.
+//
+
+#ifndef QT3DS_WINDOWS_INLINE_AOS_H
+#define QT3DS_WINDOWS_INLINE_AOS_H
+
+#if !COMPILE_VECTOR_INTRINSICS
+#error Vector intrinsics should not be included when using scalar implementation.
+#endif
+
+// Remove this define when all platforms use simd solver.
+#define QT3DS_SUPPORT_SIMD
+
+QT3DS_FORCE_INLINE __m128 m128_I2F(__m128i n)
+{
+ return _mm_castsi128_ps(n);
+}
+QT3DS_FORCE_INLINE __m128i m128_F2I(__m128 n)
+{
+ return _mm_castps_si128(n);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAllTrue4_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return moveMask == (0xf);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAnyTrue4_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return moveMask != (0x0);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAllTrue3_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return (moveMask & 0x7) == (0x7);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAnyTrue3_R(const BoolV a)
+{
+ const QT3DSI32 moveMask = _mm_movemask_ps(a);
+ return (moveMask & 0x7) != (0x0);
+}
+
+/////////////////////////////////////////////////////////////////////
+////FUNCTIONS USED ONLY FOR ASSERTS IN VECTORISED IMPLEMENTATIONS
+/////////////////////////////////////////////////////////////////////
+
+QT3DS_FORCE_INLINE QT3DSU32 FiniteTestEq(const Vec4V a, const Vec4V b)
+{
+ // This is a bit of a bodge.
+ //_mm_comieq_ss returns 1 if either value is nan so we need to re-cast a and b with true encoded
+ //as a non-nan number.
+ // There must be a better way of doing this in sse.
+ const BoolV one = FOne();
+ const BoolV zero = FZero();
+ const BoolV a1 = V4Sel(a, one, zero);
+ const BoolV b1 = V4Sel(b, one, zero);
+ return (_mm_comieq_ss(a1, b1) && _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(1, 1, 1, 1)),
+ _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(1, 1, 1, 1)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(2, 2, 2, 2)),
+ _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(2, 2, 2, 2)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(3, 3, 3, 3)),
+ _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(3, 3, 3, 3))));
+}
+
+QT3DS_FORCE_INLINE bool isValidFloatV(const FloatV a)
+{
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)))
+ && _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3))));
+}
+
+QT3DS_FORCE_INLINE bool isValidVec3V(const Vec3V a)
+{
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FZero()) ? true : false);
+}
+
+QT3DS_FORCE_INLINE bool isFiniteFloatV(const FloatV a)
+{
+ const QT3DSU32 badNumber = (_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF);
+ const FloatV vBadNum = FloatV_From_F32((QT3DSF32 &)badNumber);
+ const BoolV vMask = BAnd(vBadNum, a);
+ return FiniteTestEq(vMask, BFFFF()) == 1;
+}
+
+QT3DS_FORCE_INLINE bool isFiniteVec3V(const Vec3V a)
+{
+ const QT3DSU32 badNumber = (_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF);
+ const Vec3V vBadNum = Vec3V_From_F32((QT3DSF32 &)badNumber);
+ const BoolV vMask = BAnd(BAnd(vBadNum, a), BTTTF());
+ return FiniteTestEq(vMask, BFFFF()) == 1;
+}
+
+QT3DS_FORCE_INLINE bool isFiniteVec4V(const Vec4V a)
+{
+ /*Vec4V a;
+ QT3DS_ALIGN(16, QT3DSF32 f[4]);
+ F32Array_Aligned_From_Vec4V(a, f);
+ return NVIsFinite(f[0])
+ && NVIsFinite(f[1])
+ && NVIsFinite(f[2])
+ && NVIsFinite(f[3]);*/
+
+ const QT3DSU32 badNumber = (_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF);
+ const Vec4V vBadNum = Vec4V_From_F32((QT3DSF32 &)badNumber);
+ const BoolV vMask = BAnd(vBadNum, a);
+
+ return FiniteTestEq(vMask, BFFFF()) == 1;
+}
+
+QT3DS_FORCE_INLINE bool hasZeroElementinFloatV(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ? true : false);
+}
+
+QT3DS_FORCE_INLINE bool hasZeroElementInVec3V(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero())
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero())
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero()));
+}
+
+QT3DS_FORCE_INLINE bool hasZeroElementInVec4V(const Vec4V a)
+{
+ return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero())
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero())
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero())
+ || _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FZero()));
+}
+
+/////////////////////////////////////////////////////////////////////
+////VECTORISED FUNCTION IMPLEMENTATIONS
+/////////////////////////////////////////////////////////////////////
+
+QT3DS_FORCE_INLINE FloatV FloatV_From_F32(const QT3DSF32 f)
+{
+ return (_mm_load1_ps(&f));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_F32(const QT3DSF32 f)
+{
+ return _mm_set_ps(0.0f, f, f, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_F32(const QT3DSF32 f)
+{
+ return (_mm_load1_ps(&f));
+}
+
+QT3DS_FORCE_INLINE BoolV BoolV_From_Bool32(const bool f)
+{
+ const QT3DSU32 i = -(QT3DSI32)f;
+ return _mm_load1_ps((float *)&i);
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_NVVec3_Aligned(const QT3DSVec3 &f)
+{
+ VECMATHAOS_ASSERT(0 == ((size_t)&f & 0x0f));
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_NVVec3(const QT3DSVec3 &f)
+{
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_NVVec3_WUndefined(const QT3DSVec3 &f)
+{
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V v)
+{
+ return V4SetW(v, V4Zero());
+}
+
+QT3DS_FORCE_INLINE Vec3V Vec3V_From_F32Array_Aligned(const QT3DSF32 *const f)
+{
+ VECMATHAOS_ASSERT(0 == ((QT3DSU64)f & 0x0f));
+ return (_mm_load_ps(f));
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f)
+{
+ return f; // ok if it is implemented as the same type.
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_NVVec3_WUndefined(const QT3DSVec3 &f)
+{
+ return (_mm_set_ps(0.0f, f.z, f.y, f.x));
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_F32Array_Aligned(const QT3DSF32 *const f)
+{
+ VECMATHAOS_ASSERT(0 == ((QT3DSU64)f & 0x0f));
+ return (_mm_load_ps(f));
+}
+
+QT3DS_FORCE_INLINE void F32Array_Aligned_From_Vec4V(const Vec4V a, QT3DSF32 *f)
+{
+ VECMATHAOS_ASSERT(0 == ((QT3DSU64)f & 0x0f));
+ _mm_store_ps(f, a);
+}
+
+QT3DS_FORCE_INLINE void NVU32Array_Aligned_From_BoolV(const BoolV a, QT3DSU32 *f)
+{
+ VECMATHAOS_ASSERT(0 == ((QT3DSU64)f & 0x0f));
+ _mm_store_ps((QT3DSF32 *)f, a);
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_F32Array(const QT3DSF32 *const f)
+{
+ return (_mm_loadu_ps(f));
+}
+
+QT3DS_FORCE_INLINE BoolV BoolV_From_Bool32Array(const bool *const f)
+{
+ const QT3DS_ALIGN(16, QT3DSU32 b[4]) = { -(QT3DSI32)f[0], -(QT3DSI32)f[1], -(QT3DSI32)f[2], -(QT3DSI32)f[3] };
+ return _mm_load1_ps((float *)&b);
+}
+
+QT3DS_FORCE_INLINE QT3DSF32 NVF32_From_FloatV(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ QT3DSF32 f;
+ _mm_store_ss(&f, a);
+ return f;
+}
+
+QT3DS_FORCE_INLINE void NVF32_From_FloatV(const FloatV a, QT3DSF32 *QT3DS_RESTRICT f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ _mm_store_ss(f, a);
+}
+
+QT3DS_FORCE_INLINE void NVVec3Aligned_From_Vec3V(const Vec3V a, QT3DSVec3 &f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(0 == ((int)&a & 0x0F));
+ VECMATHAOS_ASSERT(0 == ((int)&f & 0x0F));
+ QT3DS_ALIGN(16, QT3DSF32 f2[4]);
+ _mm_store_ps(f2, a);
+ f = QT3DSVec3(f2[0], f2[1], f2[2]);
+}
+
+QT3DS_FORCE_INLINE void Store_From_BoolV(const BoolV b, QT3DSU32 *b2)
+{
+ _mm_store_ss((QT3DSF32 *)b2, b);
+}
+
+QT3DS_FORCE_INLINE void NVVec3_From_Vec3V(const Vec3V a, QT3DSVec3 &f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(0 == ((int)&a & 0x0F));
+ QT3DS_ALIGN(16, QT3DSF32 f2[4]);
+ _mm_store_ps(f2, a);
+ f = QT3DSVec3(f2[0], f2[1], f2[2]);
+}
+
+QT3DS_FORCE_INLINE Mat33V Mat33V_From_NVMat33(const QT3DSMat33 &m)
+{
+ return Mat33V(Vec3V_From_NVVec3(m.column0), Vec3V_From_NVVec3(m.column1),
+ Vec3V_From_NVVec3(m.column2));
+}
+
+QT3DS_FORCE_INLINE void NVMat33_From_Mat33V(const Mat33V &m, QT3DSMat33 &out)
+{
+ QT3DS_ASSERT((size_t(&out) & 15) == 0);
+ NVVec3_From_Vec3V(m.col0, out.column0);
+ NVVec3_From_Vec3V(m.col1, out.column1);
+ NVVec3_From_Vec3V(m.col2, out.column2);
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualFloatV(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return (_mm_comieq_ss(a, b) != 0);
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualVec3V(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return V3AllEq(a, b) != 0;
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualVec4V(const Vec4V a, const Vec4V b)
+{
+ return V4AllEq(a, b) != 0;
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsEqualBoolV(const BoolV a, const BoolV b)
+{
+ return BAllTrue4_R(VecI32V_IsEq(a, b)) != 0;
+}
+
+#define VECMATH_AOS_EPSILON (1e-3f)
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsNearEqualFloatV(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ const FloatV c = FSub(a, b);
+ static const FloatV minError = FloatV_From_F32(-VECMATH_AOS_EPSILON);
+ static const FloatV maxError = FloatV_From_F32(VECMATH_AOS_EPSILON);
+ return (_mm_comigt_ss(c, minError) && _mm_comilt_ss(c, maxError));
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsNearEqualVec3V(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ const Vec3V c = V3Sub(a, b);
+ static const Vec3V minError = Vec3V_From_F32(-VECMATH_AOS_EPSILON);
+ static const Vec3V maxError = Vec3V_From_F32(VECMATH_AOS_EPSILON);
+ return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError));
+}
+
+QT3DS_FORCE_INLINE bool _VecMathTests::allElementsNearEqualVec4V(const Vec4V a, const Vec4V b)
+{
+ const Vec4V c = V4Sub(a, b);
+ static const Vec4V minError = Vec4V_From_F32(-VECMATH_AOS_EPSILON);
+ static const Vec4V maxError = Vec4V_From_F32(VECMATH_AOS_EPSILON);
+ return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError)
+ && _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), minError)
+ && _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), maxError));
+}
+
+//////////////////////////////////
+// FLOATV
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE FloatV FZero()
+{
+ return FloatV_From_F32(0.0f);
+}
+
+QT3DS_FORCE_INLINE FloatV FOne()
+{
+ return FloatV_From_F32(1.0f);
+}
+
+QT3DS_FORCE_INLINE FloatV FHalf()
+{
+ return FloatV_From_F32(0.5f);
+}
+
+QT3DS_FORCE_INLINE FloatV FEps()
+{
+ return FloatV_From_F32(QT3DS_ENV_REAL);
+}
+
+QT3DS_FORCE_INLINE FloatV FEps6()
+{
+ return FloatV_From_F32(1e-6f);
+}
+
+QT3DS_FORCE_INLINE FloatV FMax()
+{
+ return FloatV_From_F32(QT3DS_MAX_REAL);
+}
+
+QT3DS_FORCE_INLINE FloatV FNegMax()
+{
+ return FloatV_From_F32(-QT3DS_MAX_REAL);
+}
+
+QT3DS_FORCE_INLINE FloatV IZero()
+{
+ const QT3DSU32 zero = 0;
+ return _mm_load1_ps((QT3DSF32 *)&zero);
+}
+
+QT3DS_FORCE_INLINE FloatV IOne()
+{
+ const QT3DSU32 one = 1;
+ return _mm_load1_ps((QT3DSF32 *)&one);
+}
+
+QT3DS_FORCE_INLINE FloatV ITwo()
+{
+ const QT3DSU32 two = 2;
+ return _mm_load1_ps((QT3DSF32 *)&two);
+}
+
+QT3DS_FORCE_INLINE FloatV IThree()
+{
+ const QT3DSU32 three = 3;
+ return _mm_load1_ps((QT3DSF32 *)&three);
+}
+
+QT3DS_FORCE_INLINE FloatV IFour()
+{
+ QT3DSU32 four = 4;
+ return _mm_load1_ps((QT3DSF32 *)&four);
+}
+
+QT3DS_FORCE_INLINE FloatV FNeg(const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return _mm_sub_ps(_mm_setzero_ps(), f);
+}
+
+QT3DS_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_add_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_sub_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE FloatV FRecip(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return _mm_div_ps(FOne(), a);
+}
+
+QT3DS_FORCE_INLINE FloatV FRecipFast(const FloatV a)
+{
+ return _mm_rcp_ps(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FRsqrt(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return _mm_div_ps(FOne(), _mm_sqrt_ps(a));
+}
+
+QT3DS_FORCE_INLINE FloatV FSqrt(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ return _mm_sqrt_ps(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FRsqrtFast(const FloatV a)
+{
+ return _mm_rsqrt_ps(a);
+}
+
+QT3DS_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidFloatV(c));
+ return FAdd(FMul(a, b), c);
+}
+
+QT3DS_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidFloatV(c));
+ return FSub(c, FMul(a, b));
+}
+
+QT3DS_FORCE_INLINE FloatV FAbs(const FloatV a)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ QT3DS_ALIGN(16, const static QT3DSU32 absMask[4]) = { 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF,
+ 0x7fFFffFF };
+ return _mm_and_ps(a, _mm_load_ps((QT3DSF32 *)absMask));
+}
+
+QT3DS_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(_VecMathTests::allElementsEqualBoolV(c, BTTTT())
+ || _VecMathTests::allElementsEqualBoolV(c, BFFFF()));
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
+}
+
+QT3DS_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_cmpgt_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_cmpge_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_max_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_min_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(minV));
+ VECMATHAOS_ASSERT(isValidFloatV(maxV));
+ return FMax(FMin(a, maxV), minV);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FAllGrtr(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return (_mm_comigt_ss(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FAllGrtrOrEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+
+ return (_mm_comige_ss(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FAllEq(const FloatV a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+
+ return (_mm_comieq_ss(a, b));
+}
+
+QT3DS_FORCE_INLINE FloatV FRound(const FloatV a)
+{
+ // return _mm_round_ps(a, 0x0);
+ const Vec3V half = Vec3V_From_F32(0.5f);
+ const Vec3V aPlusHalf = V3Add(a, half);
+ __m128i tmp = _mm_cvttps_epi32(aPlusHalf);
+ return _mm_cvtepi32_ps(tmp);
+}
+
+QT3DS_FORCE_INLINE FloatV FSin(const FloatV a)
+{
+ // Vec4V V1, V2, V3, V5, V7, V9, V11, V13, V15, V17, V19, V21, V23;
+ // Vec4V S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11;
+ FloatV Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const FloatV twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const FloatV tmp = FMul(a, twoPi);
+ const FloatV b = FRound(tmp);
+ const FloatV V1 = FNegMulSub(twoPi, b, a);
+
+ // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! -
+ // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI)
+ const FloatV V2 = FMul(V1, V1);
+ const FloatV V3 = FMul(V2, V1);
+ const FloatV V5 = FMul(V3, V2);
+ const FloatV V7 = FMul(V5, V2);
+ const FloatV V9 = FMul(V7, V2);
+ const FloatV V11 = FMul(V9, V2);
+ const FloatV V13 = FMul(V11, V2);
+ const FloatV V15 = FMul(V13, V2);
+ const FloatV V17 = FMul(V15, V2);
+ const FloatV V19 = FMul(V17, V2);
+ const FloatV V21 = FMul(V19, V2);
+ const FloatV V23 = FMul(V21, V2);
+
+ const Vec4V sinCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients0.f);
+ const Vec4V sinCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients1.f);
+ const Vec4V sinCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients2.f);
+
+ const FloatV S1 = V4GetY(sinCoefficients0);
+ const FloatV S2 = V4GetZ(sinCoefficients0);
+ const FloatV S3 = V4GetW(sinCoefficients0);
+ const FloatV S4 = V4GetX(sinCoefficients1);
+ const FloatV S5 = V4GetY(sinCoefficients1);
+ const FloatV S6 = V4GetZ(sinCoefficients1);
+ const FloatV S7 = V4GetW(sinCoefficients1);
+ const FloatV S8 = V4GetX(sinCoefficients2);
+ const FloatV S9 = V4GetY(sinCoefficients2);
+ const FloatV S10 = V4GetZ(sinCoefficients2);
+ const FloatV S11 = V4GetW(sinCoefficients2);
+
+ Result = FMulAdd(S1, V3, V1);
+ Result = FMulAdd(S2, V5, Result);
+ Result = FMulAdd(S3, V7, Result);
+ Result = FMulAdd(S4, V9, Result);
+ Result = FMulAdd(S5, V11, Result);
+ Result = FMulAdd(S6, V13, Result);
+ Result = FMulAdd(S7, V15, Result);
+ Result = FMulAdd(S8, V17, Result);
+ Result = FMulAdd(S9, V19, Result);
+ Result = FMulAdd(S10, V21, Result);
+ Result = FMulAdd(S11, V23, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE FloatV FCos(const FloatV a)
+{
+ // XMVECTOR V1, V2, V4, V6, V8, V10, V12, V14, V16, V18, V20, V22;
+ // XMVECTOR C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11;
+ FloatV Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const FloatV twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const FloatV tmp = FMul(a, twoPi);
+ const FloatV b = FRound(tmp);
+ const FloatV V1 = FNegMulSub(twoPi, b, a);
+
+ // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! -
+ // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI)
+ const FloatV V2 = FMul(V1, V1);
+ const FloatV V4 = FMul(V2, V2);
+ const FloatV V6 = FMul(V4, V2);
+ const FloatV V8 = FMul(V4, V4);
+ const FloatV V10 = FMul(V6, V4);
+ const FloatV V12 = FMul(V6, V6);
+ const FloatV V14 = FMul(V8, V6);
+ const FloatV V16 = FMul(V8, V8);
+ const FloatV V18 = FMul(V10, V8);
+ const FloatV V20 = FMul(V10, V10);
+ const FloatV V22 = FMul(V12, V10);
+
+ const Vec4V cosCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients0.f);
+ const Vec4V cosCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients1.f);
+ const Vec4V cosCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients2.f);
+
+ const FloatV C1 = V4GetY(cosCoefficients0);
+ const FloatV C2 = V4GetZ(cosCoefficients0);
+ const FloatV C3 = V4GetW(cosCoefficients0);
+ const FloatV C4 = V4GetX(cosCoefficients1);
+ const FloatV C5 = V4GetY(cosCoefficients1);
+ const FloatV C6 = V4GetZ(cosCoefficients1);
+ const FloatV C7 = V4GetW(cosCoefficients1);
+ const FloatV C8 = V4GetX(cosCoefficients2);
+ const FloatV C9 = V4GetY(cosCoefficients2);
+ const FloatV C10 = V4GetZ(cosCoefficients2);
+ const FloatV C11 = V4GetW(cosCoefficients2);
+
+ Result = FMulAdd(C1, V2, V4One());
+ Result = FMulAdd(C2, V4, Result);
+ Result = FMulAdd(C3, V6, Result);
+ Result = FMulAdd(C4, V8, Result);
+ Result = FMulAdd(C5, V10, Result);
+ Result = FMulAdd(C6, V12, Result);
+ Result = FMulAdd(C7, V14, Result);
+ Result = FMulAdd(C8, V16, Result);
+ Result = FMulAdd(C9, V18, Result);
+ Result = FMulAdd(C10, V20, Result);
+ Result = FMulAdd(C11, V22, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max)
+{
+ const BoolV ffff = BFFFF();
+ const BoolV c = BOr(FIsGrtr(a, max), FIsGrtr(min, a));
+ return !BAllEq(c, ffff);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FInBounds(const FloatV a, const FloatV min, const FloatV max)
+{
+ const BoolV tttt = BTTTT();
+ const BoolV c = BAnd(FIsGrtrOrEq(a, min), FIsGrtrOrEq(max, a));
+ return BAllEq(c, tttt);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FOutOfBounds(const FloatV a, const FloatV bounds)
+{
+ return FOutOfBounds(a, FNeg(bounds), bounds);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 FInBounds(const FloatV a, const FloatV bounds)
+{
+ return FInBounds(a, FNeg(bounds), bounds);
+}
+
+//////////////////////////////////
+// VEC3V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec3V V3Splat(const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ const __m128 zero = V3Zero();
+ const __m128 fff0 = _mm_move_ss(f, zero);
+ return _mm_shuffle_ps(fff0, fff0, _MM_SHUFFLE(0, 1, 2, 3));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(x));
+ VECMATHAOS_ASSERT(isValidFloatV(y));
+ VECMATHAOS_ASSERT(isValidFloatV(z));
+ // static on zero causes compiler crash on x64 debug_opt
+ const __m128 zero = V3Zero();
+ const __m128 xy = _mm_move_ss(x, y);
+ const __m128 z0 = _mm_move_ss(zero, z);
+
+ return _mm_shuffle_ps(xy, z0, _MM_SHUFFLE(1, 0, 0, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3UnitX()
+{
+ const QT3DS_ALIGN(16, QT3DSF32 x[4]) = { 1.0f, 0.0f, 0.0f, 0.0f };
+ const __m128 x128 = _mm_load_ps(x);
+ return x128;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3UnitY()
+{
+ const QT3DS_ALIGN(16, QT3DSF32 y[4]) = { 0.0f, 1.0f, 0.0f, 0.0f };
+ const __m128 y128 = _mm_load_ps(y);
+ return y128;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3UnitZ()
+{
+ const QT3DS_ALIGN(16, QT3DSF32 z[4]) = { 0.0f, 0.0f, 1.0f, 0.0f };
+ const __m128 z128 = _mm_load_ps(z);
+ return z128;
+}
+
+QT3DS_FORCE_INLINE FloatV V3GetX(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
+}
+
+QT3DS_FORCE_INLINE FloatV V3GetY(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
+}
+
+QT3DS_FORCE_INLINE FloatV V3GetZ(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V3Sel(BFTTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V3Sel(BTFTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V3Sel(BTTFT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 0, 3, 0));
+ return V3SetY(r, V3GetX(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 1, 3, 1));
+ return V3SetY(r, V3GetY(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 2, 3, 2));
+ return V3SetY(r, V3GetZ(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Zero()
+{
+ return Vec3V_From_F32(0.0f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3One()
+{
+ return Vec3V_From_F32(1.0f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Eps()
+{
+ return Vec3V_From_F32(QT3DS_ENV_REAL);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Neg(const Vec3V f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(f));
+ return _mm_sub_ps(_mm_setzero_ps(), f);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_add_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_sub_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ // why are these here?
+ // static const __m128 one=V3One();
+ // static const __m128 tttf=BTTTF();
+ // const __m128 b1=V3Sel(tttf,b,one);
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ const __m128 one = V3One();
+ const __m128 tttf = BTTTF();
+ const __m128 b1 = V3Sel(tttf, b, one);
+ return _mm_mul_ps(a, _mm_rcp_ps(b1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Recip(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = V3Zero();
+ const __m128 tttf = BTTTF();
+ const __m128 recipA = _mm_div_ps(V3One(), a);
+ return V3Sel(tttf, recipA, zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = V3Zero();
+ const __m128 tttf = BTTTF();
+ const __m128 recipA = _mm_rcp_ps(a);
+ return V3Sel(tttf, recipA, zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = V3Zero();
+ const __m128 tttf = BTTTF();
+ const __m128 recipA = _mm_div_ps(V3One(), _mm_sqrt_ps(a));
+ return V3Sel(tttf, recipA, zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = V3Zero();
+ const __m128 tttf = BTTTF();
+ const __m128 recipA = _mm_rsqrt_ps(a);
+ return V3Sel(tttf, recipA, zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Add(V3Scale(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Sub(c, V3Scale(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Add(V3Mul(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ VECMATHAOS_ASSERT(isValidVec3V(c));
+ return V3Sub(c, V3Mul(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Abs(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return V3Max(a, V3Neg(a));
+}
+
+QT3DS_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ __m128 dot1 = _mm_mul_ps(a, b); // w,z,y,x
+ //__m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2,1,0,3)); //z,y,x,w
+ //__m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1,0,3,2)); //y,x,w,z
+ //__m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0,3,2,1)); //x,w,z,y
+ // return _mm_add_ps(_mm_add_ps(shuf2, shuf3), _mm_add_ps(dot1,shuf1));
+
+ __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 0, 0, 0)); // z,y,x,w
+ __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 1, 1, 1)); // y,x,w,z
+ __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 2, 2, 2)); // x,w,z,y
+ return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w
+ __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w
+ __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w
+ __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w
+ return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2));
+}
+
+QT3DS_FORCE_INLINE FloatV V3Length(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_sqrt_ps(V3Dot(a, a));
+}
+
+QT3DS_FORCE_INLINE FloatV V3LengthSq(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return V3Dot(a, a);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Normalize(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(V3Dot(a, a) != FZero())
+ return V3ScaleInv(a, _mm_sqrt_ps(V3Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NormalizeFast(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return V3Mul(a, _mm_rsqrt_ps(V3Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = V3Zero();
+ const __m128 eps = V3Eps();
+ const __m128 length = V3Length(a);
+ const __m128 isGreaterThanZero = FIsGrtr(length, eps);
+ return V3Sel(isGreaterThanZero, V3ScaleInv(a, length), zero);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
+}
+
+QT3DS_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_cmpgt_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_cmpge_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_max_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(b));
+ return _mm_min_ps(a, b);
+}
+
+// Extract the maximum value from a
+QT3DS_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a)
+{
+ const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
+ const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
+ const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
+
+ return _mm_max_ps(_mm_max_ps(shuf1, shuf2), shuf3);
+}
+
+// Extract the maximum value from a
+QT3DS_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a)
+{
+ const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0));
+ const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1));
+ const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2));
+
+ return _mm_min_ps(_mm_min_ps(shuf1, shuf2), shuf3);
+}
+
+//// if(a > 0.0f) return 1.0f; else if a == 0.f return 0.f, else return -1.f;
+// QT3DS_FORCE_INLINE Vec3V V3MathSign(const Vec3V a)
+//{
+// VECMATHAOS_ASSERT(isValidVec3V(a));
+//
+// const __m128i ai = _mm_cvtps_epi32(a);
+// const __m128i bi = _mm_cvtps_epi32(V3Neg(a));
+// const __m128 aa = _mm_cvtepi32_ps(_mm_srai_epi32(ai, 31));
+// const __m128 bb = _mm_cvtepi32_ps(_mm_srai_epi32(bi, 31));
+// return _mm_or_ps(aa, bb);
+//}
+
+// return (a >= 0.0f) ? 1.0f : -1.0f;
+QT3DS_FORCE_INLINE Vec3V V3Sign(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ const __m128 zero = V3Zero();
+ const __m128 one = V3One();
+ const __m128 none = V3Neg(one);
+ return V3Sel(V3IsGrtrOrEq(a, zero), one, none);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(minV));
+ VECMATHAOS_ASSERT(isValidVec3V(maxV));
+ return V3Max(V3Min(a, maxV), minV);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3AllGrtr(const Vec3V a, const Vec3V b)
+{
+ return BAllTrue3_R(V4IsGrtr(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b)
+{
+ return BAllTrue3_R(V4IsGrtrOrEq(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3AllEq(const Vec3V a, const Vec3V b)
+{
+ return BAllTrue3_R(V4IsEq(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Round(const Vec3V a)
+{
+ // return _mm_round_ps(a, 0x0);
+ const Vec3V half = Vec3V_From_F32(0.5f);
+ const Vec3V aPlusHalf = V3Add(a, half);
+ const __m128i tmp = _mm_cvttps_epi32(aPlusHalf);
+ return _mm_cvtepi32_ps(tmp);
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Sin(const Vec3V a)
+{
+ // Vec4V V1, V2, V3, V5, V7, V9, V11, V13, V15, V17, V19, V21, V23;
+ // Vec4V S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11;
+ Vec3V Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const Vec3V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec3V tmp = V3Mul(a, twoPi);
+ const Vec3V b = V3Round(tmp);
+ const Vec3V V1 = V3NegMulSub(twoPi, b, a);
+
+ // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! -
+ // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI)
+ const Vec3V V2 = V3Mul(V1, V1);
+ const Vec3V V3 = V3Mul(V2, V1);
+ const Vec3V V5 = V3Mul(V3, V2);
+ const Vec3V V7 = V3Mul(V5, V2);
+ const Vec3V V9 = V3Mul(V7, V2);
+ const Vec3V V11 = V3Mul(V9, V2);
+ const Vec3V V13 = V3Mul(V11, V2);
+ const Vec3V V15 = V3Mul(V13, V2);
+ const Vec3V V17 = V3Mul(V15, V2);
+ const Vec3V V19 = V3Mul(V17, V2);
+ const Vec3V V21 = V3Mul(V19, V2);
+ const Vec3V V23 = V3Mul(V21, V2);
+
+ const Vec4V sinCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients0.f);
+ const Vec4V sinCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients1.f);
+ const Vec4V sinCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients2.f);
+
+ const FloatV S1 = V4GetY(sinCoefficients0);
+ const FloatV S2 = V4GetZ(sinCoefficients0);
+ const FloatV S3 = V4GetW(sinCoefficients0);
+ const FloatV S4 = V4GetX(sinCoefficients1);
+ const FloatV S5 = V4GetY(sinCoefficients1);
+ const FloatV S6 = V4GetZ(sinCoefficients1);
+ const FloatV S7 = V4GetW(sinCoefficients1);
+ const FloatV S8 = V4GetX(sinCoefficients2);
+ const FloatV S9 = V4GetY(sinCoefficients2);
+ const FloatV S10 = V4GetZ(sinCoefficients2);
+ const FloatV S11 = V4GetW(sinCoefficients2);
+
+ Result = V3MulAdd(S1, V3, V1);
+ Result = V3MulAdd(S2, V5, Result);
+ Result = V3MulAdd(S3, V7, Result);
+ Result = V3MulAdd(S4, V9, Result);
+ Result = V3MulAdd(S5, V11, Result);
+ Result = V3MulAdd(S6, V13, Result);
+ Result = V3MulAdd(S7, V15, Result);
+ Result = V3MulAdd(S8, V17, Result);
+ Result = V3MulAdd(S9, V19, Result);
+ Result = V3MulAdd(S10, V21, Result);
+ Result = V3MulAdd(S11, V23, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Cos(const Vec3V a)
+{
+ // XMVECTOR V1, V2, V4, V6, V8, V10, V12, V14, V16, V18, V20, V22;
+ // XMVECTOR C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11;
+ Vec3V Result;
+
+ // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI
+ const Vec3V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec3V tmp = V3Mul(a, twoPi);
+ const Vec3V b = V3Round(tmp);
+ const Vec3V V1 = V3NegMulSub(twoPi, b, a);
+
+ // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! -
+ // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI)
+ const Vec3V V2 = V3Mul(V1, V1);
+ const Vec3V V4 = V3Mul(V2, V2);
+ const Vec3V V6 = V3Mul(V4, V2);
+ const Vec3V V8 = V3Mul(V4, V4);
+ const Vec3V V10 = V3Mul(V6, V4);
+ const Vec3V V12 = V3Mul(V6, V6);
+ const Vec3V V14 = V3Mul(V8, V6);
+ const Vec3V V16 = V3Mul(V8, V8);
+ const Vec3V V18 = V3Mul(V10, V8);
+ const Vec3V V20 = V3Mul(V10, V10);
+ const Vec3V V22 = V3Mul(V12, V10);
+
+ const Vec4V cosCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients0.f);
+ const Vec4V cosCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients1.f);
+ const Vec4V cosCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients2.f);
+
+ const FloatV C1 = V4GetY(cosCoefficients0);
+ const FloatV C2 = V4GetZ(cosCoefficients0);
+ const FloatV C3 = V4GetW(cosCoefficients0);
+ const FloatV C4 = V4GetX(cosCoefficients1);
+ const FloatV C5 = V4GetY(cosCoefficients1);
+ const FloatV C6 = V4GetZ(cosCoefficients1);
+ const FloatV C7 = V4GetW(cosCoefficients1);
+ const FloatV C8 = V4GetX(cosCoefficients2);
+ const FloatV C9 = V4GetY(cosCoefficients2);
+ const FloatV C10 = V4GetZ(cosCoefficients2);
+ const FloatV C11 = V4GetW(cosCoefficients2);
+
+ Result = V3MulAdd(C1, V2, V4One());
+ Result = V3MulAdd(C2, V4, Result);
+ Result = V3MulAdd(C3, V6, Result);
+ Result = V3MulAdd(C4, V8, Result);
+ Result = V3MulAdd(C5, V10, Result);
+ Result = V3MulAdd(C6, V12, Result);
+ Result = V3MulAdd(C7, V14, Result);
+ Result = V3MulAdd(C8, V16, Result);
+ Result = V3MulAdd(C9, V18, Result);
+ Result = V3MulAdd(C10, V20, Result);
+ Result = V3MulAdd(C11, V22, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 2, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 1, 0));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a))
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 2, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 0, 1));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v0));
+ VECMATHAOS_ASSERT(isValidVec3V(v1));
+ return _mm_shuffle_ps(v1, v0, _MM_SHUFFLE(3, 1, 2, 3));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v0));
+ VECMATHAOS_ASSERT(isValidVec3V(v1));
+ return _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(3, 0, 3, 2));
+}
+
+QT3DS_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v0));
+ VECMATHAOS_ASSERT(isValidVec3V(v1));
+ // There must be a better way to do this.
+ Vec3V v2 = V3Zero();
+ FloatV y1 = V3GetY(v1);
+ FloatV x0 = V3GetX(v0);
+ v2 = V3SetX(v2, y1);
+ return V3SetY(v2, x0);
+}
+
+QT3DS_FORCE_INLINE FloatV V3SumElems(const Vec3V a)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+
+ __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); // z,y,x,w
+ __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); // y,x,w,z
+ __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); // x,w,z,y
+ return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(min));
+ VECMATHAOS_ASSERT(isValidVec3V(max));
+ const BoolV ffff = BFFFF();
+ const BoolV c = BOr(V3IsGrtr(a, max), V3IsGrtr(min, a));
+ return !BAllEq(c, ffff);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(a));
+ VECMATHAOS_ASSERT(isValidVec3V(min));
+ VECMATHAOS_ASSERT(isValidVec3V(max));
+ const BoolV tttt = BTTTT();
+ const BoolV c = BAnd(V3IsGrtrOrEq(a, min), V3IsGrtrOrEq(max, a));
+ return BAllEq(c, tttt);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds)
+{
+ return V3OutOfBounds(a, V3Neg(bounds), bounds);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V3InBounds(const Vec3V a, const Vec3V bounds)
+{
+ return V3InBounds(a, V3Neg(bounds), bounds);
+}
+
+//////////////////////////////////
+// VEC4V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec4V V4Splat(const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ // return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0,0,0,0));
+ return f;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Merge(const FloatV *const floatVArray)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[0]));
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[1]));
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[2]));
+ VECMATHAOS_ASSERT(isValidFloatV(floatVArray[3]));
+ __m128 xw = _mm_move_ss(floatVArray[1], floatVArray[0]); // y, y, y, x
+ __m128 yz = _mm_move_ss(floatVArray[2], floatVArray[3]); // z, z, z, w
+ return (_mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z,
+ const FloatVArg w)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(x));
+ VECMATHAOS_ASSERT(isValidFloatV(y));
+ VECMATHAOS_ASSERT(isValidFloatV(z));
+ VECMATHAOS_ASSERT(isValidFloatV(w));
+ __m128 xw = _mm_move_ss(y, x); // y, y, y, x
+ __m128 yz = _mm_move_ss(z, w); // z, z, z, w
+ return (_mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitW()
+{
+ const QT3DS_ALIGN(16, QT3DSF32 w[4]) = { 0.0f, 0.0f, 0.0f, 1.0f };
+ const __m128 w128 = _mm_load_ps(w);
+ return w128;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitX()
+{
+ const QT3DS_ALIGN(16, QT3DSF32 x[4]) = { 1.0f, 0.0f, 0.0f, 0.0f };
+ const __m128 x128 = _mm_load_ps(x);
+ return x128;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitY()
+{
+ const QT3DS_ALIGN(16, QT3DSF32 y[4]) = { 0.0f, 1.0f, 0.0f, 0.0f };
+ const __m128 y128 = _mm_load_ps(y);
+ return y128;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4UnitZ()
+{
+ const QT3DS_ALIGN(16, QT3DSF32 z[4]) = { 0.0f, 0.0f, 1.0f, 0.0f };
+ const __m128 z128 = _mm_load_ps(z);
+ return z128;
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetW(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetX(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetY(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
+}
+
+QT3DS_FORCE_INLINE FloatV V4GetZ(const Vec4V f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BTTTF(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BFTTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BTFTT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f)
+{
+ VECMATHAOS_ASSERT(isValidVec3V(v));
+ VECMATHAOS_ASSERT(isValidFloatV(f));
+ return V4Sel(BTTFT(), v, f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Zero()
+{
+ return Vec4V_From_F32(0.0f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4One()
+{
+ return Vec4V_From_F32(1.0f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Eps()
+{
+ return Vec4V_From_F32(QT3DS_ENV_REAL);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Neg(const Vec4V f)
+{
+ return _mm_sub_ps(_mm_setzero_ps(), f);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b)
+{
+ return _mm_add_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b)
+{
+ return _mm_sub_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b)
+{
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b)
+{
+ return _mm_mul_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b)
+{
+ return _mm_div_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b)
+{
+ return _mm_mul_ps(a, _mm_rcp_ps(b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Recip(const Vec4V a)
+{
+ return _mm_div_ps(V4One(), a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a)
+{
+ return _mm_rcp_ps(a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a)
+{
+ return _mm_div_ps(V4One(), _mm_sqrt_ps(a));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a)
+{
+ return _mm_rsqrt_ps(a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return V4Add(V4Scale(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c)
+{
+ VECMATHAOS_ASSERT(isValidFloatV(b));
+ return V4Sub(c, V4Scale(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c)
+{
+ return V4Add(V4Mul(a, b), c);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c)
+{
+ return V4Sub(c, V4Mul(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Abs(const Vec4V a)
+{
+ return V4Max(a, V4Neg(a));
+}
+
+QT3DS_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b)
+{
+ __m128 dot1 = _mm_mul_ps(a, b); // x,y,z,w
+ __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 1, 0, 3)); // w,x,y,z
+ __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 0, 3, 2)); // z,w,x,y
+ __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 3, 2, 1)); // y,z,w,x
+ return _mm_add_ps(_mm_add_ps(shuf2, shuf3), _mm_add_ps(dot1, shuf1));
+}
+
+QT3DS_FORCE_INLINE FloatV V4Length(const Vec4V a)
+{
+ return _mm_sqrt_ps(V4Dot(a, a));
+}
+
+QT3DS_FORCE_INLINE FloatV V4LengthSq(const Vec4V a)
+{
+ return V4Dot(a, a);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Normalize(const Vec4V a)
+{
+ VECMATHAOS_ASSERT(V4Dot(a, a) != FZero())
+ return V4ScaleInv(a, _mm_sqrt_ps(V4Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a)
+{
+ return V4ScaleInvFast(a, _mm_sqrt_ps(V4Dot(a, a)));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a)
+{
+ const __m128 zero = FZero();
+ const __m128 eps = V3Eps();
+ const __m128 length = V4Length(a);
+ const __m128 isGreaterThanZero = V4IsGrtr(length, eps);
+ return V4Sel(isGreaterThanZero, V4ScaleInv(a, length), zero);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b)
+{
+ return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a));
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b)
+{
+ return _mm_cmpgt_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b)
+{
+ return _mm_cmpge_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b)
+{
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b)
+{
+ return _mm_cmpeq_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec3V V4Max(const Vec4V a, const Vec4V b)
+{
+ return _mm_max_ps(a, b);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b)
+{
+ return _mm_min_ps(a, b);
+}
+
+// Extract the maximum value from a
+QT3DS_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a)
+{
+ __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3));
+ __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
+ __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1));
+
+ return _mm_max_ps(_mm_max_ps(a, shuf1), _mm_max_ps(shuf2, shuf3));
+}
+
+// Extract the maximum value from a
+QT3DS_FORCE_INLINE FloatV V4ExtractMin(const Vec4V a)
+{
+ __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3));
+ __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2));
+ __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1));
+
+ return _mm_min_ps(_mm_min_ps(a, shuf1), _mm_min_ps(shuf2, shuf3));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV)
+{
+ return V4Max(V4Min(a, maxV), minV);
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V4AllGrtr(const Vec4V a, const Vec4V b)
+{
+ return BAllTrue4_R(V4IsGrtr(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b)
+{
+ return BAllTrue4_R(V4IsGrtrOrEq(a, b));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 V4AllEq(const Vec4V a, const Vec4V b)
+{
+ return BAllTrue4_R(V4IsEq(a, b));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Round(const Vec4V a)
+{
+ // return _mm_round_ps(a, 0x0);
+ const Vec3V half = Vec3V_From_F32(0.5f);
+ const Vec3V aPlusHalf = V3Add(a, half);
+ __m128i tmp = _mm_cvttps_epi32(aPlusHalf);
+ return _mm_cvtepi32_ps(tmp);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Sin(const Vec4V a)
+{
+ // Vec4V V1, V2, V3, V5, V7, V9, V11, V13, V15, V17, V19, V21, V23;
+ // Vec4V S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11;
+ Vec4V Result;
+
+ const Vec4V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec4V tmp = V4Mul(a, twoPi);
+ const Vec4V b = V4Round(tmp);
+ const Vec4V V1 = V4NegMulSub(twoPi, b, a);
+
+ // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! -
+ // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI)
+ const Vec4V V2 = V4Mul(V1, V1);
+ const Vec4V V3 = V4Mul(V2, V1);
+ const Vec4V V5 = V4Mul(V3, V2);
+ const Vec4V V7 = V4Mul(V5, V2);
+ const Vec4V V9 = V4Mul(V7, V2);
+ const Vec4V V11 = V4Mul(V9, V2);
+ const Vec4V V13 = V4Mul(V11, V2);
+ const Vec4V V15 = V4Mul(V13, V2);
+ const Vec4V V17 = V4Mul(V15, V2);
+ const Vec4V V19 = V4Mul(V17, V2);
+ const Vec4V V21 = V4Mul(V19, V2);
+ const Vec4V V23 = V4Mul(V21, V2);
+
+ const Vec4V sinCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients0.f);
+ const Vec4V sinCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients1.f);
+ const Vec4V sinCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXSinCoefficients2.f);
+
+ const FloatV S1 = V4GetY(sinCoefficients0);
+ const FloatV S2 = V4GetZ(sinCoefficients0);
+ const FloatV S3 = V4GetW(sinCoefficients0);
+ const FloatV S4 = V4GetX(sinCoefficients1);
+ const FloatV S5 = V4GetY(sinCoefficients1);
+ const FloatV S6 = V4GetZ(sinCoefficients1);
+ const FloatV S7 = V4GetW(sinCoefficients1);
+ const FloatV S8 = V4GetX(sinCoefficients2);
+ const FloatV S9 = V4GetY(sinCoefficients2);
+ const FloatV S10 = V4GetZ(sinCoefficients2);
+ const FloatV S11 = V4GetW(sinCoefficients2);
+
+ Result = V4MulAdd(S1, V3, V1);
+ Result = V4MulAdd(S2, V5, Result);
+ Result = V4MulAdd(S3, V7, Result);
+ Result = V4MulAdd(S4, V9, Result);
+ Result = V4MulAdd(S5, V11, Result);
+ Result = V4MulAdd(S6, V13, Result);
+ Result = V4MulAdd(S7, V15, Result);
+ Result = V4MulAdd(S8, V17, Result);
+ Result = V4MulAdd(S9, V19, Result);
+ Result = V4MulAdd(S10, V21, Result);
+ Result = V4MulAdd(S11, V23, Result);
+
+ return Result;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Cos(const Vec4V a)
+{
+ // XMVECTOR V1, V2, V4, V6, V8, V10, V12, V14, V16, V18, V20, V22;
+ // XMVECTOR C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11;
+ Vec4V Result;
+
+ const Vec4V twoPi = Vec4V_From_F32Array_Aligned(g_PXReciprocalTwoPi.f);
+ const Vec4V tmp = V4Mul(a, twoPi);
+ const Vec4V b = V4Round(tmp);
+ const Vec4V V1 = V4NegMulSub(twoPi, b, a);
+
+ // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! -
+ // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI)
+ const Vec4V V2 = V4Mul(V1, V1);
+ const Vec4V V4 = V4Mul(V2, V2);
+ const Vec4V V6 = V4Mul(V4, V2);
+ const Vec4V V8 = V4Mul(V4, V4);
+ const Vec4V V10 = V4Mul(V6, V4);
+ const Vec4V V12 = V4Mul(V6, V6);
+ const Vec4V V14 = V4Mul(V8, V6);
+ const Vec4V V16 = V4Mul(V8, V8);
+ const Vec4V V18 = V4Mul(V10, V8);
+ const Vec4V V20 = V4Mul(V10, V10);
+ const Vec4V V22 = V4Mul(V12, V10);
+
+ const Vec4V cosCoefficients0 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients0.f);
+ const Vec4V cosCoefficients1 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients1.f);
+ const Vec4V cosCoefficients2 = Vec4V_From_F32Array_Aligned(g_PXCosCoefficients2.f);
+
+ const FloatV C1 = V4GetY(cosCoefficients0);
+ const FloatV C2 = V4GetZ(cosCoefficients0);
+ const FloatV C3 = V4GetW(cosCoefficients0);
+ const FloatV C4 = V4GetX(cosCoefficients1);
+ const FloatV C5 = V4GetY(cosCoefficients1);
+ const FloatV C6 = V4GetZ(cosCoefficients1);
+ const FloatV C7 = V4GetW(cosCoefficients1);
+ const FloatV C8 = V4GetX(cosCoefficients2);
+ const FloatV C9 = V4GetY(cosCoefficients2);
+ const FloatV C10 = V4GetZ(cosCoefficients2);
+ const FloatV C11 = V4GetW(cosCoefficients2);
+
+ Result = V4MulAdd(C1, V2, V4One());
+ Result = V4MulAdd(C2, V4, Result);
+ Result = V4MulAdd(C3, V6, Result);
+ Result = V4MulAdd(C4, V8, Result);
+ Result = V4MulAdd(C5, V10, Result);
+ Result = V4MulAdd(C6, V12, Result);
+ Result = V4MulAdd(C7, V14, Result);
+ Result = V4MulAdd(C8, V16, Result);
+ Result = V4MulAdd(C9, V18, Result);
+ Result = V4MulAdd(C10, V20, Result);
+ Result = V4MulAdd(C11, V22, Result);
+
+ return Result;
+}
+
+//////////////////////////////////
+// BoolV
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE BoolV BFFFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0, 0, 0 };
+ const __m128 ffff = _mm_load_ps((float *)&f);
+ return ffff;
+}
+
+QT3DS_FORCE_INLINE BoolV BFFFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0, 0, 0xFFFFFFFF };
+ const __m128 ffft = _mm_load_ps((float *)&f);
+ return ffft;
+}
+
+QT3DS_FORCE_INLINE BoolV BFFTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0, 0xFFFFFFFF, 0 };
+ const __m128 fftf = _mm_load_ps((float *)&f);
+ return fftf;
+}
+
+QT3DS_FORCE_INLINE BoolV BFFTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 fftt = _mm_load_ps((float *)&f);
+ return fftt;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0xFFFFFFFF, 0, 0 };
+ const __m128 ftff = _mm_load_ps((float *)&f);
+ return ftff;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0xFFFFFFFF, 0, 0xFFFFFFFF };
+ const __m128 ftft = _mm_load_ps((float *)&f);
+ return ftft;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0xFFFFFFFF, 0xFFFFFFFF, 0 };
+ const __m128 fttf = _mm_load_ps((float *)&f);
+ return fttf;
+}
+
+QT3DS_FORCE_INLINE BoolV BFTTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 fttt = _mm_load_ps((float *)&f);
+ return fttt;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0, 0, 0 };
+ const __m128 tfff = _mm_load_ps((float *)&f);
+ return tfff;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0, 0, 0xFFFFFFFF };
+ const __m128 tfft = _mm_load_ps((float *)&f);
+ return tfft;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0, 0xFFFFFFFF, 0 };
+ const __m128 tftf = _mm_load_ps((float *)&f);
+ return tftf;
+}
+
+QT3DS_FORCE_INLINE BoolV BTFTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 tftt = _mm_load_ps((float *)&f);
+ return tftt;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTFF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0, 0 };
+ const __m128 ttff = _mm_load_ps((float *)&f);
+ return ttff;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTFT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0, 0xFFFFFFFF };
+ const __m128 ttft = _mm_load_ps((float *)&f);
+ return ttft;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTTF()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0 };
+ const __m128 tttf = _mm_load_ps((float *)&f);
+ return tttf;
+}
+
+QT3DS_FORCE_INLINE BoolV BTTTT()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+ const __m128 tttt = _mm_load_ps((float *)&f);
+ return tttt;
+}
+
+QT3DS_FORCE_INLINE BoolV BXMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0xFFFFFFFF, 0, 0, 0 };
+ const __m128 tfff = _mm_load_ps((float *)&f);
+ return tfff;
+}
+
+QT3DS_FORCE_INLINE BoolV BYMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0xFFFFFFFF, 0, 0 };
+ const __m128 ftff = _mm_load_ps((float *)&f);
+ return ftff;
+}
+
+QT3DS_FORCE_INLINE BoolV BZMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0, 0xFFFFFFFF, 0 };
+ const __m128 fftf = _mm_load_ps((float *)&f);
+ return fftf;
+}
+
+QT3DS_FORCE_INLINE BoolV BWMask()
+{
+ const QT3DS_ALIGN(16, QT3DSU32 f[4]) = { 0, 0, 0, 0xFFFFFFFF };
+ const __m128 ffft = _mm_load_ps((float *)&f);
+ return ffft;
+}
+
+QT3DS_FORCE_INLINE BoolV BGetX(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0));
+}
+
+QT3DS_FORCE_INLINE BoolV BGetY(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1));
+}
+
+QT3DS_FORCE_INLINE BoolV BGetZ(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2));
+}
+
+QT3DS_FORCE_INLINE BoolV BGetW(const BoolV f)
+{
+ return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3));
+}
+
+QT3DS_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b)
+{
+ return (_mm_and_ps(a, b));
+}
+
+QT3DS_FORCE_INLINE BoolV BNot(const BoolV a)
+{
+ const BoolV bAllTrue(BTTTT());
+ return _mm_xor_ps(a, bAllTrue);
+}
+
+QT3DS_FORCE_INLINE BoolV BAndNot(const BoolV a, const BoolV b)
+{
+ return (_mm_andnot_ps(a, b));
+}
+
+QT3DS_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b)
+{
+ return (_mm_or_ps(a, b));
+}
+
+QT3DS_FORCE_INLINE BoolV BAllTrue4(const BoolV a)
+{
+ const BoolV bTmp = _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3)));
+ return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE BoolV BAnyTrue4(const BoolV a)
+{
+ const BoolV bTmp = _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3)));
+ return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE BoolV BAllTrue3(const BoolV a)
+{
+ const BoolV bTmp = _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
+ return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE BoolV BAnyTrue3(const BoolV a)
+{
+ const BoolV bTmp = _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)),
+ _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
+ return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)),
+ _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1)));
+}
+
+QT3DS_FORCE_INLINE QT3DSU32 BAllEq(const BoolV a, const BoolV b)
+{
+ const BoolV bTest = m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b)));
+ return BAllTrue4_R(bTest);
+}
+
+//////////////////////////////////
+// MAT33V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec3V M33MulV3(const Mat33V &a, const Vec3V b)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ const Vec3V v0 = V3Scale(a.col0, x);
+ const Vec3V v1 = V3Scale(a.col1, y);
+ const Vec3V v2 = V3Scale(a.col2, z);
+ const Vec3V v0PlusV1 = V3Add(v0, v1);
+ return V3Add(v0PlusV1, v2);
+}
+
+QT3DS_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V &a, const Vec3V b)
+{
+ const FloatV x = V3Dot(a.col0, b);
+ const FloatV y = V3Dot(a.col1, b);
+ const FloatV z = V3Dot(a.col2, b);
+ return V3Merge(x, y, z);
+}
+
+QT3DS_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V &A, const Vec3V b, const Vec3V c)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ Vec3V result = V3MulAdd(A.col0, x, c);
+ result = V3MulAdd(A.col1, y, result);
+ return V3MulAdd(A.col2, z, result);
+}
+
+QT3DS_FORCE_INLINE Mat33V M33MulM33(const Mat33V &a, const Mat33V &b)
+{
+ return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Add(const Mat33V &a, const Mat33V &b)
+{
+ return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Sub(const Mat33V &a, const Mat33V &b)
+{
+ return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Neg(const Mat33V &a)
+{
+ return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Abs(const Mat33V &a)
+{
+ return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Inverse(const Mat33V &a)
+{
+ const BoolV tfft = BTFFT();
+ const BoolV tttf = BTTTF();
+ const FloatV zero = V3Zero();
+ const Vec3V cross01 = V3Cross(a.col0, a.col1);
+ const Vec3V cross12 = V3Cross(a.col1, a.col2);
+ const Vec3V cross20 = V3Cross(a.col2, a.col0);
+ const FloatV dot = V3Dot(cross01, a.col2);
+ const FloatV invDet = _mm_rcp_ps(dot);
+ const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01);
+ const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01);
+ Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20);
+ colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0));
+ const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2));
+ const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0));
+ const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd));
+ const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0));
+ const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0));
+ const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd));
+
+ return Mat33V(_mm_mul_ps(colInv0, invDet), _mm_mul_ps(colInv1, invDet),
+ _mm_mul_ps(colInv2, invDet));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Trnsps(const Mat33V &a)
+{
+ return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)),
+ V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)),
+ V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2)));
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Identity()
+{
+ return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ());
+}
+
+QT3DS_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg d)
+{
+ const FloatV x = V3Mul(V3UnitX(), d);
+ const FloatV y = V3Mul(V3UnitY(), d);
+ const FloatV z = V3Mul(V3UnitZ(), d);
+ return Mat33V(x, y, z);
+}
+
+//////////////////////////////////
+// MAT34V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec3V M34MulV3(const Mat34V &a, const Vec3V b)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ const Vec3V v0 = V3Scale(a.col0, x);
+ const Vec3V v1 = V3Scale(a.col1, y);
+ const Vec3V v2 = V3Scale(a.col2, z);
+ const Vec3V v0PlusV1 = V3Add(v0, v1);
+ const Vec3V v0PlusV1Plusv2 = V3Add(v0PlusV1, v2);
+ return (V3Add(v0PlusV1Plusv2, a.col3));
+}
+
+QT3DS_FORCE_INLINE Vec3V M34Mul33V3(const Mat34V &a, const Vec3V b)
+{
+ const FloatV x = V3GetX(b);
+ const FloatV y = V3GetY(b);
+ const FloatV z = V3GetZ(b);
+ const Vec3V v0 = V3Scale(a.col0, x);
+ const Vec3V v1 = V3Scale(a.col1, y);
+ const Vec3V v2 = V3Scale(a.col2, z);
+ const Vec3V v0PlusV1 = V3Add(v0, v1);
+ return V3Add(v0PlusV1, v2);
+}
+
+QT3DS_FORCE_INLINE Vec3V M34TrnspsMul33V3(const Mat34V &a, const Vec3V b)
+{
+ const FloatV x = V3Dot(a.col0, b);
+ const FloatV y = V3Dot(a.col1, b);
+ const FloatV z = V3Dot(a.col2, b);
+ return V3Merge(x, y, z);
+}
+
+QT3DS_FORCE_INLINE Mat34V M34MulM34(const Mat34V &a, const Mat34V &b)
+{
+ return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2),
+ M34MulV3(a, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat33V M34MulM33(const Mat34V &a, const Mat33V &b)
+{
+ return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat33V M34Mul33MM34(const Mat34V &a, const Mat34V &b)
+{
+ return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2));
+}
+
+QT3DS_FORCE_INLINE Mat34V M34Add(const Mat34V &a, const Mat34V &b)
+{
+ return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2),
+ V3Add(a.col3, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat34V M34Inverse(const Mat34V &a)
+{
+ Mat34V aInv;
+ const BoolV tfft = BTFFT();
+ const BoolV tttf = BTTTF();
+ const FloatV zero = V3Zero();
+ const Vec3V cross01 = V3Cross(a.col0, a.col1);
+ const Vec3V cross12 = V3Cross(a.col1, a.col2);
+ const Vec3V cross20 = V3Cross(a.col2, a.col0);
+ const FloatV dot = V3Dot(cross01, a.col2);
+ const FloatV invDet = _mm_rcp_ps(dot);
+ const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01);
+ const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01);
+ Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20);
+ colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0));
+ const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2));
+ const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0));
+ const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd));
+ const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0));
+ const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0));
+ const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd));
+ aInv.col0 = _mm_mul_ps(colInv0, invDet);
+ aInv.col1 = _mm_mul_ps(colInv1, invDet);
+ aInv.col2 = _mm_mul_ps(colInv2, invDet);
+ aInv.col3 = M34Mul33V3(aInv, V3Neg(a.col3));
+ return aInv;
+}
+
+QT3DS_FORCE_INLINE Mat33V M34Trnsps33(const Mat34V &a)
+{
+ return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)),
+ V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)),
+ V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2)));
+}
+
+//////////////////////////////////
+// MAT44V
+//////////////////////////////////
+
+QT3DS_FORCE_INLINE Vec4V M44MulV4(const Mat44V &a, const Vec4V b)
+{
+ const FloatV x = V4GetX(b);
+ const FloatV y = V4GetY(b);
+ const FloatV z = V4GetZ(b);
+ const FloatV w = V4GetW(b);
+
+ const Vec4V v0 = V4Scale(a.col0, x);
+ const Vec4V v1 = V4Scale(a.col1, y);
+ const Vec4V v2 = V4Scale(a.col2, z);
+ const Vec4V v3 = V4Scale(a.col3, w);
+ const Vec4V v0PlusV1 = V4Add(v0, v1);
+ const Vec4V v0PlusV1Plusv2 = V4Add(v0PlusV1, v2);
+ return (V4Add(v0PlusV1Plusv2, v3));
+}
+
+QT3DS_FORCE_INLINE Vec4V M44TrnspsMulV4(const Mat44V &a, const Vec4V b)
+{
+ QT3DS_ALIGN(16, FloatV dotProdArray[4]) = { V4Dot(a.col0, b), V4Dot(a.col1, b), V4Dot(a.col2, b),
+ V4Dot(a.col3, b) };
+ return V4Merge(dotProdArray);
+}
+
+QT3DS_FORCE_INLINE Mat44V M44MulM44(const Mat44V &a, const Mat44V &b)
+{
+ return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2),
+ M44MulV4(a, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat44V M44Add(const Mat44V &a, const Mat44V &b)
+{
+ return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2),
+ V4Add(a.col3, b.col3));
+}
+
+QT3DS_FORCE_INLINE Mat44V M44Trnsps(const Mat44V &a)
+{
+ const Vec4V v0 = _mm_unpacklo_ps(a.col0, a.col2);
+ const Vec4V v1 = _mm_unpackhi_ps(a.col0, a.col2);
+ const Vec4V v2 = _mm_unpacklo_ps(a.col1, a.col3);
+ const Vec4V v3 = _mm_unpackhi_ps(a.col1, a.col3);
+ return Mat44V(_mm_unpacklo_ps(v0, v2), _mm_unpackhi_ps(v0, v2), _mm_unpacklo_ps(v1, v3),
+ _mm_unpackhi_ps(v1, v3));
+}
+
+// The original code as provided by Intel in
+// "Streaming SIMD Extensions - Inverse of 4x4 Matrix"
+// (ftp://download.intel.com/design/pentiumiii/sml/24504301.pdf)
+QT3DS_FORCE_INLINE Mat44V M44Inverse(const Mat44V &a)
+{
+ __m128 minor0, minor1, minor2, minor3;
+ __m128 row0, row1, row2, row3;
+ __m128 det, tmp1;
+
+ tmp1 = V4Zero();
+ row1 = V4Zero();
+ row3 = V4Zero();
+
+ row0 = a.col0;
+ row1 = _mm_shuffle_ps(a.col1, a.col1, _MM_SHUFFLE(1, 0, 3, 2));
+ row2 = a.col2;
+ row3 = _mm_shuffle_ps(a.col3, a.col3, _MM_SHUFFLE(1, 0, 3, 2));
+
+ tmp1 = _mm_mul_ps(row2, row3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor0 = _mm_mul_ps(row1, tmp1);
+ minor1 = _mm_mul_ps(row0, tmp1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor0 = _mm_sub_ps(_mm_mul_ps(row1, tmp1), minor0);
+ minor1 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor1);
+ minor1 = _mm_shuffle_ps(minor1, minor1, 0x4E);
+
+ tmp1 = _mm_mul_ps(row1, row2);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor0 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor0);
+ minor3 = _mm_mul_ps(row0, tmp1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row3, tmp1));
+ minor3 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor3);
+ minor3 = _mm_shuffle_ps(minor3, minor3, 0x4E);
+
+ tmp1 = _mm_mul_ps(_mm_shuffle_ps(row1, row1, 0x4E), row3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ row2 = _mm_shuffle_ps(row2, row2, 0x4E);
+ minor0 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor0);
+ minor2 = _mm_mul_ps(row0, tmp1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row2, tmp1));
+ minor2 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor2);
+ minor2 = _mm_shuffle_ps(minor2, minor2, 0x4E);
+
+ tmp1 = _mm_mul_ps(row0, row1);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor2 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor2);
+ minor3 = _mm_sub_ps(_mm_mul_ps(row2, tmp1), minor3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor2 = _mm_sub_ps(_mm_mul_ps(row3, tmp1), minor2);
+ minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row2, tmp1));
+
+ tmp1 = _mm_mul_ps(row0, row3);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row2, tmp1));
+ minor2 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor2);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor1 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor1);
+ minor2 = _mm_sub_ps(minor2, _mm_mul_ps(row1, tmp1));
+
+ tmp1 = _mm_mul_ps(row0, row2);
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
+ minor1 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor1);
+ minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row1, tmp1));
+ tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
+ minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row3, tmp1));
+ minor3 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor3);
+
+ det = _mm_mul_ps(row0, minor0);
+ det = _mm_add_ps(_mm_shuffle_ps(det, det, 0x4E), det);
+ det = _mm_add_ss(_mm_shuffle_ps(det, det, 0xB1), det);
+ tmp1 = _mm_rcp_ss(det);
+#if 0
+ det = _mm_sub_ss(_mm_add_ss(tmp1, tmp1), _mm_mul_ss(det, _mm_mul_ss(tmp1, tmp1)));
+ det = _mm_shuffle_ps(det, det, 0x00);
+#else
+ det = _mm_shuffle_ps(tmp1, tmp1, _MM_SHUFFLE(0, 0, 0, 0));
+#endif
+
+ minor0 = _mm_mul_ps(det, minor0);
+ minor1 = _mm_mul_ps(det, minor1);
+ minor2 = _mm_mul_ps(det, minor2);
+ minor3 = _mm_mul_ps(det, minor3);
+ Mat44V invTrans(minor0, minor1, minor2, minor3);
+ return M44Trnsps(invTrans);
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_XYZW(QT3DSF32 x, QT3DSF32 y, QT3DSF32 z, QT3DSF32 w)
+{
+ return _mm_set_ps(w, z, y, x);
+}
+
+// AP: work in progress - use proper SSE intrinsics where possible
+QT3DS_FORCE_INLINE VecU16V V4U32PK(VecU32V a, VecU32V b)
+{
+ VecU16V result;
+ result.m128_u16[0] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[0], 0, 0xFFFF));
+ result.m128_u16[1] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[1], 0, 0xFFFF));
+ result.m128_u16[2] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[2], 0, 0xFFFF));
+ result.m128_u16[3] = QT3DSU16(NVClamp<QT3DSU32>((a).m128_u32[3], 0, 0xFFFF));
+ result.m128_u16[4] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[0], 0, 0xFFFF));
+ result.m128_u16[5] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[1], 0, 0xFFFF));
+ result.m128_u16[6] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[2], 0, 0xFFFF));
+ result.m128_u16[7] = QT3DSU16(NVClamp<QT3DSU32>((b).m128_u32[3], 0, 0xFFFF));
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b)
+{
+ return m128_I2F(_mm_or_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b)
+{
+ return m128_I2F(_mm_and_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b)
+{
+ return m128_I2F(_mm_andnot_si128(m128_F2I(b), m128_F2I(a)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16Or(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_or_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16And(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_and_si128(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16Andc(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_andnot_si128(m128_F2I(b), m128_F2I(a)));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_From_I32(const QT3DSI32 i)
+{
+ return (_mm_load1_ps((QT3DSF32 *)&i));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_From_I32Array(const QT3DSI32 *i)
+{
+ return _mm_loadu_ps((QT3DSF32 *)i);
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_From_I32Array_Aligned(const QT3DSI32 *i)
+{
+ return _mm_load_ps((QT3DSF32 *)i);
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_add_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_sub_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_cmpgt_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b)
+{
+ return m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Zero()
+{
+ return V4Zero();
+}
+
+QT3DS_FORCE_INLINE VecI32V VecI32V_Merge(const VecI32VArg a, const VecI32VArg b, const VecI32VArg c,
+ const VecI32VArg d)
+{
+ return V4Merge(a, b, c, d);
+}
+
+template <int a>
+QT3DS_FORCE_INLINE VecI32V V4ISplat()
+{
+ VecI32V result;
+ result.m128_i32[0] = a;
+ result.m128_i32[1] = a;
+ result.m128_i32[2] = a;
+ result.m128_i32[3] = a;
+ return result;
+}
+
+QT3DS_FORCE_INLINE void V4U16StoreAligned(VecU16V val, VecU16V *address)
+{
+ *address = val;
+}
+
+QT3DS_FORCE_INLINE void V4U32StoreAligned(VecU32V val, VecU32V *address)
+{
+ *address = val;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4LoadAligned(Vec4V *addr)
+{
+ return *addr;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4LoadUnaligned(Vec4V *addr)
+{
+ return Vec4V_From_F32Array((float *)addr);
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b)
+{
+ VecU32V result32(a);
+ result32 = V4U32Andc(result32, b);
+ return Vec4V(result32);
+}
+
+QT3DS_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b)
+{
+ return V4IsGrtr(a, b);
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16LoadAligned(VecU16V *addr)
+{
+ return *addr;
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16LoadUnaligned(VecU16V *addr)
+{
+ return *addr;
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16CompareGt(VecU16V a, VecU16V b)
+{
+ // _mm_cmpgt_epi16 doesn't work for unsigned values unfortunately
+ // return m128_I2F(_mm_cmpgt_epi16(m128_F2I(a), m128_F2I(b)));
+ VecU16V result;
+ result.m128_u16[0] = (a).m128_u16[0] > (b).m128_u16[0];
+ result.m128_u16[1] = (a).m128_u16[1] > (b).m128_u16[1];
+ result.m128_u16[2] = (a).m128_u16[2] > (b).m128_u16[2];
+ result.m128_u16[3] = (a).m128_u16[3] > (b).m128_u16[3];
+ result.m128_u16[4] = (a).m128_u16[4] > (b).m128_u16[4];
+ result.m128_u16[5] = (a).m128_u16[5] > (b).m128_u16[5];
+ result.m128_u16[6] = (a).m128_u16[6] > (b).m128_u16[6];
+ result.m128_u16[7] = (a).m128_u16[7] > (b).m128_u16[7];
+ return result;
+}
+
+QT3DS_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a)
+{
+ Vec4V result = Vec4V_From_XYZW(QT3DSF32(a.m128_u32[0]), QT3DSF32(a.m128_u32[1]), QT3DSF32(a.m128_u32[2]),
+ QT3DSF32(a.m128_u32[3]));
+ return result;
+}
+
+template <int index>
+QT3DS_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a)
+{
+ VecU32V result;
+ result.m128_u32[0] = result.m128_u32[1] = result.m128_u32[2] = result.m128_u32[3] =
+ a.m128_u32[index];
+ return result;
+}
+
+template <int index>
+QT3DS_FORCE_INLINE Vec4V V4SplatElement(Vec4V a)
+{
+ float *data = (float *)&a;
+ return Vec4V_From_F32(data[index]);
+}
+
+template <int index>
+QT3DS_FORCE_INLINE VecU16V V4U16SplatElement(VecU16V a)
+{
+ VecU16V result = a; // AM: initializing to avoid nonsensical warning 4701 here with VC10.
+ for (int i = 0; i < 8; i++)
+ result.m128_u16[i] = a.m128_u16[index];
+ return result;
+}
+
+template <int imm>
+QT3DS_FORCE_INLINE VecI16V V4I16SplatImmediate()
+{
+ VecI16V result;
+ result.m128_i16[0] = imm;
+ result.m128_i16[1] = imm;
+ result.m128_i16[2] = imm;
+ result.m128_i16[3] = imm;
+ result.m128_i16[4] = imm;
+ result.m128_i16[5] = imm;
+ result.m128_i16[6] = imm;
+ result.m128_i16[7] = imm;
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16SubtractModulo(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_sub_epi16(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU16V V4U16AddModulo(VecU16V a, VecU16V b)
+{
+ return m128_I2F(_mm_add_epi16(m128_F2I(a), m128_F2I(b)));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U16GetLo16(VecU16V a)
+{
+ VecU32V result;
+ result.m128_u32[0] = a.m128_u16[0];
+ result.m128_u32[1] = a.m128_u16[2];
+ result.m128_u32[2] = a.m128_u16[4];
+ result.m128_u32[3] = a.m128_u16[6];
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU32V V4U16GetHi16(VecU16V a)
+{
+ VecU32V result;
+ result.m128_u32[0] = a.m128_u16[1];
+ result.m128_u32[1] = a.m128_u16[3];
+ result.m128_u32[2] = a.m128_u16[5];
+ result.m128_u32[3] = a.m128_u16[7];
+ return result;
+}
+
+QT3DS_FORCE_INLINE VecU32V VecU32V_From_XYZW(QT3DSU32 x, QT3DSU32 y, QT3DSU32 z, QT3DSU32 w)
+{
+ VecU32V result;
+ result.m128_u32[0] = x;
+ result.m128_u32[1] = y;
+ result.m128_u32[2] = z;
+ result.m128_u32[3] = w;
+ return result;
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Ceil(const Vec4V a)
+{
+ return Vec4V_From_XYZW(NVCeil(a.m128_f32[0]), NVCeil(a.m128_f32[1]), NVCeil(a.m128_f32[2]),
+ NVCeil(a.m128_f32[3]));
+}
+
+QT3DS_FORCE_INLINE Vec4V V4Floor(const Vec4V a)
+{
+ return Vec4V_From_XYZW(NVFloor(a.m128_f32[0]), NVFloor(a.m128_f32[1]), NVFloor(a.m128_f32[2]),
+ NVFloor(a.m128_f32[3]));
+}
+
+QT3DS_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(const Vec4V a, QT3DSU32 power)
+{
+ QT3DS_ASSERT(power == 0 && "Non-zero power not supported in convertToU32VSaturate");
+ QT3DS_FORCE_PARAMETER_REFERENCE(power); // prevent warning in release builds
+ QT3DSF32 ffffFFFFasFloat = QT3DSF32(0xFFFF0000);
+ VecU32V result;
+ result.m128_u32[0] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[0], 0.0f, ffffFFFFasFloat));
+ result.m128_u32[1] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[1], 0.0f, ffffFFFFasFloat));
+ result.m128_u32[2] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[2], 0.0f, ffffFFFFasFloat));
+ result.m128_u32[3] = QT3DSU32(NVClamp<QT3DSF32>((a).m128_f32[3], 0.0f, ffffFFFFasFloat));
+ return result;
+}
+
+#endif // QT3DS_WINDOWS_INLINE_AOS_H
diff --git a/src/foundation/windows/Qt3DSWindowsIntrinsics.h b/src/foundation/windows/Qt3DSWindowsIntrinsics.h
new file mode 100644
index 0000000..3e0b3e8
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsIntrinsics.h
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_WINDOWS_INTRINSICS_H
+#define QT3DS_FOUNDATION_QT3DS_WINDOWS_INTRINSICS_H
+
+#include "foundation/Qt3DS.h"
+
+#if !defined QT3DS_WINDOWS && !defined QT3DS_WIN8ARM
+#error "This file should only be included by Windows builds!!"
+#endif
+
+#ifdef QT3DS_GNUC
+#include <cmath>
+#else
+#include <math.h>
+#endif
+#include <float.h>
+#include <intrin.h>
+#include <string.h>
+#include "foundation/Qt3DSAssert.h"
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+namespace intrinsics {
+#endif
+
+ //! \brief platform-specific absolute value
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float abs(float a) { return float(::fabs(a)); }
+
+ //! \brief platform-specific select float
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float fsel(float a, float b, float c)
+ {
+ return (a >= 0.0f) ? b : c;
+ }
+
+ //! \brief platform-specific sign
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float sign(float a) { return (a >= 0.0f) ? 1.0f : -1.0f; }
+
+ //! \brief platform-specific reciprocal
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recip(float a) { return 1.0f / a; }
+
+ //! \brief platform-specific square root
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float sqrt(float a) { return ::sqrtf(a); }
+
+ //! \brief platform-specific reciprocal square root
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recipSqrt(float a) { return 1.0f / ::sqrtf(a); }
+
+ //! \brief platform-specific sine
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float sin(float a) { return ::sinf(a); }
+
+ //! \brief platform-specific cosine
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float cos(float a) { return ::cosf(a); }
+
+ //! \brief platform-specific minimum
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float selectMin(float a, float b) { return a < b ? a : b; }
+
+ //! \brief platform-specific maximum
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float selectMax(float a, float b) { return a > b ? a : b; }
+
+ //! \brief platform-specific finiteness check (not INF or NAN)
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isFinite(float a)
+ {
+#if defined(__CUDACC__)
+ return isfinite(a)? true : false;
+#elif defined(QT3DS_GNUC)
+ return (std::isfinite(a) && !std::isinf(a)) ? true : false;
+#else
+ return (0 == ((_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF) & _fpclass(a)));
+#endif
+ }
+
+ //! \brief platform-specific finiteness check (not INF or NAN)
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE bool isFinite(double a)
+ {
+#if defined(__CUDACC__)
+ return isfinite(a)? true : false;
+#elif defined(QT3DS_GNUC)
+ return (std::isfinite(a) && !std::isinf(a)) ? true : false;
+#else
+ return (0 == ((_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF) & _fpclass(a)));
+#endif
+ }
+ /*
+* Implements a memory barrier
+*/
+ QT3DS_FORCE_INLINE void memoryBarrier()
+ {
+ _ReadWriteBarrier();
+ /* long Barrier;
+ __asm {
+ xchg Barrier, eax
+ }*/
+ }
+
+ /*!
+ Returns the index of the highest set bit. Not valid for zero arg.
+ */
+ QT3DS_FORCE_INLINE QT3DSU32 highestSetBitUnsafe(QT3DSU32 v)
+ {
+ unsigned long retval;
+ _BitScanReverse(&retval, v);
+ return retval;
+ }
+
+ /*!
+ Returns the index of the highest set bit. Undefined for zero arg.
+ */
+ QT3DS_FORCE_INLINE QT3DSU32 lowestSetBitUnsafe(QT3DSU32 v)
+ {
+ unsigned long retval;
+ _BitScanForward(&retval, v);
+ return retval;
+ }
+
+ /*!
+ Returns the number of leading zeros in v. Returns 32 for v=0.
+ */
+ QT3DS_FORCE_INLINE QT3DSU32 countLeadingZeros(QT3DSU32 v)
+ {
+ if (v) {
+ unsigned long bsr = (unsigned long)-1;
+ _BitScanReverse(&bsr, v);
+ return 31 - bsr;
+ } else
+ return 32;
+ }
+
+ /*!
+ Sets \c count bytes starting at \c dst to zero.
+ */
+ QT3DS_FORCE_INLINE void *memZero(void *QT3DS_RESTRICT dest, QT3DSU32 count)
+ {
+ return memset(dest, 0, count);
+ }
+
+ /*!
+ Sets \c count bytes starting at \c dst to \c c.
+ */
+ QT3DS_FORCE_INLINE void *memSet(void *QT3DS_RESTRICT dest, QT3DSI32 c, QT3DSU32 count)
+ {
+ return memset(dest, c, count);
+ }
+
+ /*!
+ Copies \c count bytes from \c src to \c dst. User memMove if regions overlap.
+ */
+ QT3DS_FORCE_INLINE void *memCopy(void *QT3DS_RESTRICT dest, const void *QT3DS_RESTRICT src, QT3DSU32 count)
+ {
+ return memcpy(dest, src, count);
+ }
+
+ /*!
+ Copies \c count bytes from \c src to \c dst. Supports overlapping regions.
+ */
+ QT3DS_FORCE_INLINE void *memMove(void *QT3DS_RESTRICT dest, const void *QT3DS_RESTRICT src, QT3DSU32 count)
+ {
+ return memmove(dest, src, count);
+ }
+
+ /*!
+ Set 128B to zero starting at \c dst+offset. Must be aligned.
+ */
+ QT3DS_FORCE_INLINE void memZero128(void *QT3DS_RESTRICT dest, QT3DSU32 offset = 0)
+ {
+ QT3DS_ASSERT(((size_t(dest) + offset) & 0x7f) == 0);
+ memSet((char *QT3DS_RESTRICT)dest + offset, 0, 128);
+ }
+
+ /*!
+ Prefetch aligned 128B around \c ptr+offset.
+ */
+ QT3DS_FORCE_INLINE void prefetch128(const void *ptr, QT3DSU32 offset = 0)
+ {
+#ifdef QT3DS_WINDOWS
+ _mm_prefetch(((const char *)ptr + offset), _MM_HINT_T0);
+#endif
+ }
+
+ /*!
+ Prefetch \c count bytes starting at \c ptr.
+ */
+ QT3DS_FORCE_INLINE void prefetch(const void *ptr, QT3DSU32 count = 0)
+ {
+ for (QT3DSU32 i = 0; i <= count; i += 128)
+ prefetch128(ptr, i);
+ }
+
+ //! \brief platform-specific reciprocal
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recipFast(float a) { return 1.0f / a; }
+
+ //! \brief platform-specific fast reciprocal square root
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float recipSqrtFast(float a) { return 1.0f / ::sqrtf(a); }
+
+ //! \brief platform-specific floor
+ QT3DS_CUDA_CALLABLE QT3DS_FORCE_INLINE float floatFloor(float x) { return ::floorf(x); }
+
+#ifndef QT3DS_DOXYGEN
+} // namespace intrinsics
+} // namespace qt3ds
+#endif
+
+#endif
diff --git a/src/foundation/windows/Qt3DSWindowsMutex.cpp b/src/foundation/windows/Qt3DSWindowsMutex.cpp
new file mode 100644
index 0000000..c5fef09
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsMutex.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/windows/Qt3DSWindowsInclude.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSAssert.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ namespace {
+ CRITICAL_SECTION *getMutex(MutexImpl *impl)
+ {
+ return reinterpret_cast<CRITICAL_SECTION *>(impl);
+ }
+ }
+
+ MutexImpl::MutexImpl() { InitializeCriticalSection(getMutex(this)); }
+
+ MutexImpl::~MutexImpl() { DeleteCriticalSection(getMutex(this)); }
+
+ bool MutexImpl::lock()
+ {
+ EnterCriticalSection(getMutex(this));
+ return true;
+ }
+
+ bool MutexImpl::trylock() { return TryEnterCriticalSection(getMutex(this)) != 0; }
+
+ bool MutexImpl::unlock()
+ {
+ LeaveCriticalSection(getMutex(this));
+ return true;
+ }
+
+ const QT3DSU32 MutexImpl::size = sizeof(CRITICAL_SECTION);
+
+ class ReadWriteLockImpl
+ {
+ public:
+ ReadWriteLockImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ HANDLE hReaderEvent;
+ HANDLE hMutex;
+ CRITICAL_SECTION writerMutex;
+ LONG counter; // count the number of readers in the lock.
+ LONG recursionCounter; // handle recursive writer locking
+ };
+
+ ReadWriteLock::ReadWriteLock(NVAllocatorCallback &alloc)
+ {
+ mImpl = QT3DS_NEW(alloc, ReadWriteLockImpl)(alloc);
+
+ mImpl->hReaderEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ QT3DS_ASSERT(mImpl->hReaderEvent != NULL);
+
+ mImpl->hMutex = CreateEvent(NULL, FALSE, TRUE, NULL);
+ QT3DS_ASSERT(mImpl->hMutex != NULL);
+
+ InitializeCriticalSection(&mImpl->writerMutex);
+ mImpl->counter = -1;
+ mImpl->recursionCounter = 0;
+ }
+
+ ReadWriteLock::~ReadWriteLock()
+ {
+ if (mImpl->hReaderEvent != NULL) {
+ CloseHandle(mImpl->hReaderEvent);
+ }
+
+ if (mImpl->hMutex != NULL) {
+ CloseHandle(mImpl->hMutex);
+ }
+
+ DeleteCriticalSection(&mImpl->writerMutex);
+
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ void ReadWriteLock::lockReader()
+ {
+ if (InterlockedIncrement(&mImpl->counter) == 0) {
+ WaitForSingleObject(mImpl->hMutex, INFINITE);
+ SetEvent(mImpl->hReaderEvent);
+ }
+
+ WaitForSingleObject(mImpl->hReaderEvent, INFINITE);
+ }
+
+ void ReadWriteLock::lockWriter()
+ {
+ EnterCriticalSection(&mImpl->writerMutex);
+
+ // we may already have the global mutex(really an event so we have to handle recursion
+ // ourselves)
+ if (++mImpl->recursionCounter == 1) {
+ WaitForSingleObject(mImpl->hMutex, INFINITE);
+ }
+ }
+
+ void ReadWriteLock::unlockReader()
+ {
+ if (InterlockedDecrement(&mImpl->counter) < 0) {
+ ResetEvent(mImpl->hReaderEvent);
+ SetEvent(mImpl->hMutex);
+ }
+ }
+
+ void ReadWriteLock::unlockWriter()
+ {
+ if (--mImpl->recursionCounter == 0) {
+ SetEvent(mImpl->hMutex);
+ }
+
+ LeaveCriticalSection(&mImpl->writerMutex);
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/windows/Qt3DSWindowsSemaphore.cpp b/src/foundation/windows/Qt3DSWindowsSemaphore.cpp
new file mode 100644
index 0000000..bb14c10
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsSemaphore.cpp
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/windows/Qt3DSWindowsInclude.h"
+#include "foundation/Qt3DSSemaphore.h"
+#include "foundation/Qt3DSAllocator.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ class SemaphoreImpl
+ {
+ public:
+ SemaphoreImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ HANDLE handle;
+ };
+
+ Semaphore::Semaphore(NVAllocatorCallback &alloc, QT3DSU32 initialCount, QT3DSU32 maxCount)
+ {
+ mImpl = QT3DS_NEW(alloc, SemaphoreImpl)(alloc);
+ mImpl->handle = CreateSemaphore(0, initialCount, maxCount, (LPCTSTR)NULL);
+ }
+
+ Semaphore::~Semaphore()
+ {
+ CloseHandle(mImpl->handle);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ bool Semaphore::wait(QT3DSU32 milliseconds)
+ {
+ if (milliseconds == -1)
+ milliseconds = INFINITE;
+
+ return WaitForSingleObject(mImpl->handle, milliseconds) == WAIT_OBJECT_0 ? true : false;
+ }
+
+ void Semaphore::post() { ReleaseSemaphore(mImpl->handle, 1, (LPLONG)NULL); }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/windows/Qt3DSWindowsString.h b/src/foundation/windows/Qt3DSWindowsString.h
new file mode 100644
index 0000000..8d5fcd3
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsString.h
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_FOUNDATION_QT3DS_WINDOWS_STRING_H
+#define QT3DS_FOUNDATION_QT3DS_WINDOWS_STRING_H
+
+#include "foundation/Qt3DS.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#pragma warning(push)
+#pragma warning(disable : 4995 4996)
+
+#ifndef QT3DS_DOXYGEN
+namespace qt3ds {
+#endif
+
+QT3DS_INLINE void NVStrcpy(char *dest, size_t size, const char *src)
+{
+ ::strcpy_s(dest, size, src);
+}
+QT3DS_INLINE void NVStrcat(char *dest, size_t size, const char *src)
+{
+ ::strcat_s(dest, size, src);
+}
+QT3DS_INLINE QT3DSI32 NVVsprintf(char *dest, size_t size, const char *src, va_list arg)
+{
+ QT3DSI32 r = ::vsprintf_s(dest, size, src, arg);
+
+ return r;
+}
+QT3DS_INLINE QT3DSI32 NVStricmp(const char *str, const char *str1)
+{
+ return (::_stricmp(str, str1));
+}
+
+namespace string {
+ QT3DS_INLINE QT3DSI32 stricmp(const char *str, const char *str1) { return (::_stricmp(str, str1)); }
+ QT3DS_INLINE QT3DSI32 strnicmp(const char *str, const char *str1, size_t len)
+ {
+ return (::_strnicmp(str, str1, len));
+ }
+ QT3DS_INLINE QT3DSI32 strncat_s(char *a, QT3DSI32 b, const char *c, size_t d)
+ {
+ return (::strncat_s(a, b, c, d));
+ }
+ QT3DS_INLINE QT3DSI32 strncpy_s(char *strDest, size_t sizeInBytes, const char *strSource,
+ size_t count)
+ {
+ return (::strncpy_s(strDest, sizeInBytes, strSource, count));
+ }
+ QT3DS_INLINE void strcpy_s(char *dest, size_t size, const char *src)
+ {
+ ::strcpy_s(dest, size, src);
+ }
+ QT3DS_INLINE void strcat_s(char *dest, size_t size, const char *src)
+ {
+ ::strcat_s(dest, size, src);
+ }
+ QT3DS_INLINE QT3DSI32 _vsnprintf(char *dest, size_t size, const char *src, va_list arg)
+ {
+ QT3DSI32 r = ::_vsnprintf(dest, size, src, arg);
+
+ return r;
+ }
+ QT3DS_INLINE QT3DSI32 vsprintf_s(char *dest, size_t size, const char *src, va_list arg)
+ {
+ QT3DSI32 r = ::vsprintf_s(dest, size, src, arg);
+
+ return r;
+ }
+
+ QT3DS_INLINE QT3DSI32 sprintf_s(char *_DstBuf, size_t _DstSize, const char *_Format, ...)
+ {
+ va_list arg;
+ va_start(arg, _Format);
+ QT3DSI32 r = ::vsprintf_s(_DstBuf, _DstSize, _Format, arg);
+ va_end(arg);
+
+ return r;
+ }
+ QT3DS_INLINE QT3DSI32 sscanf_s(const char *buffer, const char *format, ...)
+ {
+ va_list arg;
+ va_start(arg, format);
+ QT3DSI32 r = ::sscanf_s(buffer, format, arg);
+ va_end(arg);
+
+ return r;
+ };
+
+ QT3DS_INLINE void strlwr(char *str)
+ {
+ while (*str) {
+ if (*str >= 'A' && *str <= 'Z')
+ *str += 32;
+ str++;
+ }
+ }
+
+ QT3DS_INLINE void strupr(char *str)
+ {
+ while (*str) {
+ if (*str >= 'a' && *str <= 'z')
+ *str -= 32;
+ str++;
+ }
+ }
+
+} // namespace string
+
+#ifndef QT3DS_DOXYGEN
+} // namespace qt3ds
+#endif
+
+#pragma warning(pop)
+
+#endif
diff --git a/src/foundation/windows/Qt3DSWindowsSync.cpp b/src/foundation/windows/Qt3DSWindowsSync.cpp
new file mode 100644
index 0000000..49667e9
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsSync.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/windows/Qt3DSWindowsInclude.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSAllocator.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ class SyncImpl
+ {
+ public:
+ SyncImpl(NVAllocatorCallback &alloc)
+ : mAllocator(alloc)
+ {
+ }
+ NVAllocatorCallback &mAllocator;
+ HANDLE handle;
+ };
+
+ Sync::Sync(NVAllocatorCallback &alloc)
+ {
+ mImpl = QT3DS_NEW(alloc, SyncImpl)(alloc);
+ mImpl->handle = CreateEvent(0, true, false, 0);
+ }
+
+ Sync::~Sync()
+ {
+ CloseHandle(mImpl->handle);
+ QT3DS_FREE(mImpl->mAllocator, mImpl);
+ }
+
+ void Sync::reset() { ResetEvent(mImpl->handle); }
+
+ void Sync::set() { SetEvent(mImpl->handle); }
+
+ bool Sync::wait(QT3DSU32 milliseconds)
+ {
+ if (milliseconds == -1)
+ milliseconds = INFINITE;
+
+ return WaitForSingleObject(mImpl->handle, milliseconds) == WAIT_OBJECT_0 ? true : false;
+ }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/windows/Qt3DSWindowsThread.cpp b/src/foundation/windows/Qt3DSWindowsThread.cpp
new file mode 100644
index 0000000..3a30de8
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsThread.cpp
@@ -0,0 +1,241 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/windows/Qt3DSWindowsInclude.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSThread.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+
+// an exception for setting the thread name in microsoft debuggers
+#define QT3DS_MS_VC_EXCEPTION 0x406D1388
+
+namespace qt3ds {
+namespace foundation {
+
+// struct for naming a thread in the debugger
+#pragma pack(push, 8)
+
+ typedef struct tagTHREADNAME_INFO
+ {
+ DWORD dwType; // Must be 0x1000.
+ LPCSTR szName; // Pointer to name (in user addr space).
+ DWORD dwThreadID; // Thread ID (-1=caller thread).
+ DWORD dwFlags; // Reserved for future use, must be zero.
+ } THREADNAME_INFO;
+
+#pragma pack(pop)
+
+ namespace {
+
+ DWORD WINAPI NVThreadStart(LPVOID arg)
+ {
+ ((Thread *)arg)->execute();
+ return 0;
+ }
+ }
+
+ class ThreadImpl
+ {
+ public:
+ enum State { NotStarted, Started, Stopped };
+ ThreadImpl(NVFoundationBase &foundation)
+ : mFoundation(foundation)
+ {
+ }
+ NVFoundationBase &mFoundation;
+ HANDLE thread;
+ LONG quitNow; // Should be 32bit aligned on SMP systems.
+ State state;
+ DWORD threadID;
+
+ Thread::ExecuteFn fn;
+ void *arg;
+ };
+
+ Thread::Id Thread::getId() { return static_cast<Id>(GetCurrentThreadId()); }
+
+ Thread::Thread(NVFoundationBase &foundation)
+ {
+ mImpl = (ThreadImpl *)QT3DS_NEW(foundation.getAllocator(), ThreadImpl)(foundation);
+ mImpl->thread = NULL;
+ mImpl->state = ThreadImpl::NotStarted;
+ mImpl->quitNow = 0;
+ }
+
+ Thread::Thread(NVFoundationBase &foundation, ExecuteFn fn, void *arg)
+ {
+ mImpl = (ThreadImpl *)QT3DS_NEW(foundation.getAllocator(), ThreadImpl)(foundation);
+ mImpl->thread = NULL;
+ mImpl->state = ThreadImpl::NotStarted;
+ mImpl->quitNow = 0;
+ mImpl->fn = fn;
+ mImpl->arg = arg;
+
+ start(0);
+ }
+
+ Thread::~Thread()
+ {
+ if (mImpl->state == ThreadImpl::Started)
+ kill();
+ CloseHandle(mImpl->thread);
+ QT3DS_FREE(mImpl->mFoundation.getAllocator(), mImpl);
+ }
+
+ void Thread::start(QT3DSU32 stackSize)
+ {
+ if (mImpl->state != ThreadImpl::NotStarted)
+ return;
+ mImpl->state = ThreadImpl::Started;
+
+ mImpl->thread =
+ CreateThread(NULL, stackSize, NVThreadStart, (LPVOID)this, 0, &mImpl->threadID);
+ }
+
+ void Thread::signalQuit() { InterlockedIncrement(&(mImpl->quitNow)); }
+
+ bool Thread::waitForQuit()
+ {
+ if (mImpl->state == ThreadImpl::NotStarted)
+ return false;
+
+ WaitForSingleObject(mImpl->thread, INFINITE);
+ return true;
+ }
+
+ bool Thread::quitIsSignalled()
+ {
+ return InterlockedCompareExchange(&(mImpl->quitNow), 0, 0) != 0;
+ }
+
+ void Thread::quit()
+ {
+ mImpl->state = ThreadImpl::Stopped;
+ ExitThread(0);
+ }
+
+ void Thread::kill()
+ {
+ if (mImpl->state == ThreadImpl::Started)
+ TerminateThread(mImpl->thread, 0);
+ mImpl->state = ThreadImpl::Stopped;
+ }
+
+ void Thread::sleep(QT3DSU32 ms) { Sleep(ms); }
+
+ void Thread::yield() { SwitchToThread(); }
+
+ void Thread::execute(void) { (*mImpl->fn)(mImpl->arg); }
+
+ QT3DSU32 Thread::setAffinityMask(QT3DSU32 mask)
+ {
+ return mask ? (QT3DSU32)SetThreadAffinityMask(mImpl->thread, mask) : 0;
+ }
+
+ void Thread::setName(const char *name)
+ {
+ THREADNAME_INFO info;
+ info.dwType = 0x1000;
+ info.szName = name;
+ info.dwThreadID = mImpl->threadID;
+ info.dwFlags = 0;
+
+#ifdef QT3DS_VC
+ // C++ Exceptions are disabled for this project, but SEH is not (and cannot be)
+ // http://stackoverflow.com/questions/943087/what-exactly-will-happen-if-i-disable-c-exceptions-in-a-project
+ __try {
+ RaiseException(QT3DS_MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR),
+ (ULONG_PTR *)&info);
+ } __except (EXCEPTION_EXECUTE_HANDLER) {
+ // this runs if not attached to a debugger (thus not really naming the thread)
+ }
+#else
+ RaiseException(QT3DS_MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR),
+ (ULONG_PTR *)&info);
+#endif
+ }
+
+ void Thread::setPriority(ThreadPriority::Enum prio)
+ {
+ switch (prio) {
+ case ThreadPriority::eHIGH:
+ SetThreadPriority(mImpl->thread, THREAD_PRIORITY_HIGHEST);
+ break;
+ case ThreadPriority::eABOVE_NORMAL:
+ SetThreadPriority(mImpl->thread, THREAD_PRIORITY_ABOVE_NORMAL);
+ break;
+ case ThreadPriority::eNORMAL:
+ SetThreadPriority(mImpl->thread, THREAD_PRIORITY_NORMAL);
+ break;
+ case ThreadPriority::eBELOW_NORMAL:
+ SetThreadPriority(mImpl->thread, THREAD_PRIORITY_BELOW_NORMAL);
+ break;
+ case ThreadPriority::eLOW:
+ SetThreadPriority(mImpl->thread, THREAD_PRIORITY_LOWEST);
+ break;
+ default:
+ break;
+ }
+ }
+
+ ThreadPriority::Enum Thread::getPriority(Id threadId)
+ {
+ ThreadPriority::Enum retval = ThreadPriority::eLOW;
+ int priority = GetThreadPriority((HANDLE)threadId);
+ StaticAssert<(THREAD_PRIORITY_HIGHEST > THREAD_PRIORITY_ABOVE_NORMAL)>::valid_expression();
+ if (priority >= THREAD_PRIORITY_HIGHEST)
+ retval = ThreadPriority::eHIGH;
+ else if (priority >= THREAD_PRIORITY_ABOVE_NORMAL)
+ retval = ThreadPriority::eABOVE_NORMAL;
+ else if (priority >= THREAD_PRIORITY_NORMAL)
+ retval = ThreadPriority::eNORMAL;
+ else if (priority >= THREAD_PRIORITY_BELOW_NORMAL)
+ retval = ThreadPriority::eBELOW_NORMAL;
+ return retval;
+ }
+
+ QT3DSU32 TlsAlloc()
+ {
+ DWORD rv = ::TlsAlloc();
+ QT3DS_ASSERT(rv != TLS_OUT_OF_INDEXES);
+ return (QT3DSU32)rv;
+ }
+
+ void TlsFree(QT3DSU32 index) { ::TlsFree(index); }
+
+ void *TlsGet(QT3DSU32 index) { return ::TlsGetValue(index); }
+
+ QT3DSU32 TlsSet(QT3DSU32 index, void *value) { return ::TlsSetValue(index, value); }
+
+ const QT3DSU32 Thread::DEFAULT_STACK_SIZE = 1048576;
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/windows/Qt3DSWindowsTime.cpp b/src/foundation/windows/Qt3DSWindowsTime.cpp
new file mode 100644
index 0000000..9215d64
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsTime.cpp
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSTime.h"
+#include "foundation/windows/Qt3DSWindowsInclude.h"
+
+namespace {
+::qt3ds::QT3DSI64 getTimeTicks()
+{
+ LARGE_INTEGER a;
+ QueryPerformanceCounter(&a);
+ return a.QuadPart;
+}
+
+double getTickDuration()
+{
+ LARGE_INTEGER a;
+ QueryPerformanceFrequency(&a);
+ return 1.0f / double(a.QuadPart);
+}
+
+double sTickDuration = getTickDuration();
+} // namespace
+
+namespace qt3ds {
+namespace foundation {
+
+ const CounterFrequencyToTensOfNanos Time::sCounterFreq = Time::getCounterFrequency();
+
+ CounterFrequencyToTensOfNanos Time::getCounterFrequency()
+ {
+ LARGE_INTEGER freq;
+ QueryPerformanceFrequency(&freq);
+ return CounterFrequencyToTensOfNanos(Time::sNumTensOfNanoSecondsInASecond, freq.QuadPart);
+ }
+
+ QT3DSU64 Time::getCurrentCounterValue()
+ {
+ LARGE_INTEGER ticks;
+ QueryPerformanceCounter(&ticks);
+ return ticks.QuadPart;
+ }
+
+ Time::Time()
+ : mTickCount(0)
+ {
+ getElapsedSeconds();
+ }
+
+ Time::Second Time::getElapsedSeconds()
+ {
+ QT3DSI64 lastTickCount = mTickCount;
+ mTickCount = getTimeTicks();
+ return (mTickCount - lastTickCount) * sTickDuration;
+ }
+
+ Time::Second Time::peekElapsedSeconds()
+ {
+ return (getTimeTicks() - mTickCount) * sTickDuration;
+ }
+
+ Time::Second Time::getLastTime() const { return mTickCount * sTickDuration; }
+
+} // namespace foundation
+} // namespace qt3ds
diff --git a/src/foundation/windows/Qt3DSWindowsTrigConstants.h b/src/foundation/windows/Qt3DSWindowsTrigConstants.h
new file mode 100644
index 0000000..e3da844
--- /dev/null
+++ b/src/foundation/windows/Qt3DSWindowsTrigConstants.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_WINDOWS_TRIG_CONSTANTS_H
+#define QT3DS_WINDOWS_TRIG_CONSTANTS_H
+
+#define QT3DS_GLOBALCONST extern const __declspec(selectany)
+
+__declspec(align(16)) struct QT3DS_VECTORF32
+{
+ float f[4];
+};
+
+#define QT3DS_PI 3.141592654f
+#define QT3DS_2PI 6.283185307f
+#define QT3DS_1DIVPI 0.318309886f
+#define QT3DS_1DIV2PI 0.159154943f
+#define QT3DS_PIDIV2 1.570796327f
+#define QT3DS_PIDIV4 0.785398163f
+
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinCoefficients0 = { 1.0f, -0.166666667f, 8.333333333e-3f,
+ -1.984126984e-4f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinCoefficients1 = { 2.755731922e-6f, -2.505210839e-8f,
+ 1.605904384e-10f, -7.647163732e-13f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinCoefficients2 = { 2.811457254e-15f, -8.220635247e-18f,
+ 1.957294106e-20f, -3.868170171e-23f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosCoefficients0 = { 1.0f, -0.5f, 4.166666667e-2f,
+ -1.388888889e-3f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosCoefficients1 = { 2.480158730e-5f, -2.755731922e-7f,
+ 2.087675699e-9f, -1.147074560e-11f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosCoefficients2 = { 4.779477332e-14f, -1.561920697e-16f,
+ 4.110317623e-19f, -8.896791392e-22f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanCoefficients0 = { 1.0f, 0.333333333f, 0.133333333f,
+ 5.396825397e-2f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanCoefficients1 = { 2.186948854e-2f, 8.863235530e-3f,
+ 3.592128167e-3f, 1.455834485e-3f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanCoefficients2 = { 5.900274264e-4f, 2.391290764e-4f,
+ 9.691537707e-5f, 3.927832950e-5f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinCoefficients0 = { -0.05806367563904f, -0.41861972469416f,
+ 0.22480114791621f, 2.17337241360606f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinCoefficients1 = { 0.61657275907170f, 4.29696498283455f,
+ -1.18942822255452f, -6.53784832094831f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinCoefficients2 = { -1.36926553863413f, -4.48179294237210f,
+ 1.41810672941833f, 5.48179257935713f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanCoefficients0 = { 1.0f, 0.333333334f, 0.2f, 0.142857143f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanCoefficients1 = { 1.111111111e-1f, 9.090909091e-2f,
+ 7.692307692e-2f, 6.666666667e-2f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanCoefficients2 = { 5.882352941e-2f, 5.263157895e-2f,
+ 4.761904762e-2f, 4.347826087e-2f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXSinEstCoefficients = { 1.0f, -1.66521856991541e-1f,
+ 8.199913018755e-3f, -1.61475937228e-4f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXCosEstCoefficients = { 1.0f, -4.95348008918096e-1f,
+ 3.878259962881e-2f, -9.24587976263e-4f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXTanEstCoefficients = { 2.484f, -1.954923183e-1f, 2.467401101f,
+ QT3DS_1DIVPI };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXATanEstCoefficients = { 7.689891418951e-1f, 1.104742493348f,
+ 8.661844266006e-1f, QT3DS_PIDIV2 };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinEstCoefficients = { -1.36178272886711f, 2.37949493464538f,
+ -8.08228565650486e-1f,
+ 2.78440142746736e-1f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXASinEstConstants = { 1.00000011921f, QT3DS_PIDIV2, 0.0f, 0.0f };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXPiConstants0 = { QT3DS_PI, QT3DS_2PI, QT3DS_1DIVPI, QT3DS_1DIV2PI };
+QT3DS_GLOBALCONST QT3DS_VECTORF32 g_PXReciprocalTwoPi = { QT3DS_1DIV2PI, QT3DS_1DIV2PI, QT3DS_1DIV2PI,
+ QT3DS_1DIV2PI };
+
+#endif
diff --git a/src/foundation/windows/SocketImpl.h b/src/foundation/windows/SocketImpl.h
new file mode 100644
index 0000000..f72203b
--- /dev/null
+++ b/src/foundation/windows/SocketImpl.h
@@ -0,0 +1,506 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*
+LuaSocket 3.0 license
+Copyright � 2004-2013 Diego Nehab
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef FOUNDATION_WINDOWS_SOCKET_IMPL_H
+#define FOUNDATION_WINDOWS_SOCKET_IMPL_H
+#pragma once
+#include <winsock.h>
+#pragma warning(disable : 4127)
+#pragma warning(disable : 4702)
+
+namespace qt3ds {
+namespace foundation {
+ namespace socketimpl {
+
+ // Functions take from lua socket implementation. Note that it has an MIT license.
+
+ enum {
+ IO_DONE = 0, /* operation completed successfully */
+ IO_TIMEOUT = -1, /* operation timed out */
+ IO_CLOSED = -2, /* the connection has been closed */
+ IO_UNKNOWN = -3
+ };
+
+ /*-------------------------------------------------------------------------*\
+ * I/O error strings
+ \*-------------------------------------------------------------------------*/
+ const char *io_strerror(int err)
+ {
+ switch (err) {
+ case IO_DONE:
+ return NULL;
+ case IO_CLOSED:
+ return "closed";
+ case IO_TIMEOUT:
+ return "timeout";
+ default:
+ return "unknown error";
+ }
+ }
+
+ typedef int socklen_t;
+ typedef SOCKET t_socket;
+ typedef t_socket *p_socket;
+ typedef struct sockaddr SA;
+
+#define SOCKET_INVALID (INVALID_SOCKET)
+
+ static const char *wstrerror(int err)
+ {
+ switch (err) {
+ case WSAEINTR:
+ return "Interrupted function call";
+ case WSAEACCES:
+ return "Permission denied";
+ case WSAEFAULT:
+ return "Bad address";
+ case WSAEINVAL:
+ return "Invalid argument";
+ case WSAEMFILE:
+ return "Too many open files";
+ case WSAEWOULDBLOCK:
+ return "Resource temporarily unavailable";
+ case WSAEINPROGRESS:
+ return "Operation now in progress";
+ case WSAEALREADY:
+ return "Operation already in progress";
+ case WSAENOTSOCK:
+ return "Socket operation on nonsocket";
+ case WSAEDESTADDRREQ:
+ return "Destination address required";
+ case WSAEMSGSIZE:
+ return "Message too long";
+ case WSAEPROTOTYPE:
+ return "Protocol wrong type for socket";
+ case WSAENOPROTOOPT:
+ return "Bad protocol option";
+ case WSAEPROTONOSUPPORT:
+ return "Protocol not supported";
+ case WSAESOCKTNOSUPPORT:
+ return "Socket type not supported";
+ case WSAEOPNOTSUPP:
+ return "Operation not supported";
+ case WSAEPFNOSUPPORT:
+ return "Protocol family not supported";
+ case WSAEAFNOSUPPORT:
+ return "Address family not supported by protocol family";
+ case WSAEADDRINUSE:
+ return "Address already in use";
+ case WSAEADDRNOTAVAIL:
+ return "Cannot assign requested address";
+ case WSAENETDOWN:
+ return "Network is down";
+ case WSAENETUNREACH:
+ return "Network is unreachable";
+ case WSAENETRESET:
+ return "Network dropped connection on reset";
+ case WSAECONNABORTED:
+ return "Software caused connection abort";
+ case WSAECONNRESET:
+ return "Connection reset by peer";
+ case WSAENOBUFS:
+ return "No buffer space available";
+ case WSAEISCONN:
+ return "Socket is already connected";
+ case WSAENOTCONN:
+ return "Socket is not connected";
+ case WSAESHUTDOWN:
+ return "Cannot send after socket shutdown";
+ case WSAETIMEDOUT:
+ return "Connection timed out";
+ case WSAECONNREFUSED:
+ return "Connection refused";
+ case WSAEHOSTDOWN:
+ return "Host is down";
+ case WSAEHOSTUNREACH:
+ return "No route to host";
+ case WSAEPROCLIM:
+ return "Too many processes";
+ case WSASYSNOTREADY:
+ return "Network subsystem is unavailable";
+ case WSAVERNOTSUPPORTED:
+ return "Winsock.dll version out of range";
+ case WSANOTINITIALISED:
+ return "Successful WSAStartup not yet performed";
+ case WSAEDISCON:
+ return "Graceful shutdown in progress";
+ case WSAHOST_NOT_FOUND:
+ return "Host not found";
+ case WSATRY_AGAIN:
+ return "Nonauthoritative host not found";
+ case WSANO_RECOVERY:
+ return "Nonrecoverable name lookup error";
+ case WSANO_DATA:
+ return "Valid name, no data record of requested type";
+ default:
+ return "Unknown error";
+ }
+ }
+
+ const char *socket_strerror(int err)
+ {
+ switch (err) {
+ case WSAEADDRINUSE:
+ return "address already in use";
+ case WSAECONNREFUSED:
+ return "connection refused";
+ case WSAEISCONN:
+ return "already connected";
+ case WSAEACCES:
+ return "permission denied";
+ case WSAECONNABORTED:
+ return "closed";
+ case WSAECONNRESET:
+ return "closed";
+ case WSAETIMEDOUT:
+ return "timeout";
+ default:
+ return wstrerror(err);
+ }
+ }
+
+ int socket_open(void)
+ {
+ WSADATA wsaData;
+ WORD wVersionRequested = MAKEWORD(2, 0);
+ int err = WSAStartup(wVersionRequested, &wsaData);
+ if (err != 0)
+ return 0;
+ if ((LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0)
+ && (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)) {
+ WSACleanup();
+ return 0;
+ }
+ return 1;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Close module
+ \*-------------------------------------------------------------------------*/
+ int socket_close(void)
+ {
+ WSACleanup();
+ return 1;
+ }
+
+/*-------------------------------------------------------------------------*\
+* Wait for readable/writable/connected socket with timeout
+\*-------------------------------------------------------------------------*/
+#define WAITFD_R 1
+#define WAITFD_W 2
+#define WAITFD_E 4
+#define WAITFD_C (WAITFD_E | WAITFD_W)
+
+ static int socket_waitfd(p_socket ps, int sw, QT3DSU32 timeoutMilliseconds)
+ {
+ int ret;
+ fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL;
+ struct timeval tv, *tp = NULL;
+ if (timeoutMilliseconds == 0)
+ return IO_TIMEOUT; /* optimize timeout == 0 case */
+ if (sw & WAITFD_R) {
+ FD_ZERO(&rfds);
+ FD_SET(*ps, &rfds);
+ rp = &rfds;
+ }
+ if (sw & WAITFD_W) {
+ FD_ZERO(&wfds);
+ FD_SET(*ps, &wfds);
+ wp = &wfds;
+ }
+ if (sw & WAITFD_C) {
+ FD_ZERO(&efds);
+ FD_SET(*ps, &efds);
+ ep = &efds;
+ }
+ if (timeoutMilliseconds >= 0.0) {
+ tv.tv_sec = (int)(timeoutMilliseconds / 1000);
+ QT3DSU32 leftover = timeoutMilliseconds % 1000;
+ tv.tv_usec = (int)(leftover * 100000);
+ tp = &tv;
+ }
+ ret = select(0, rp, wp, ep, tp);
+ if (ret == -1)
+ return WSAGetLastError();
+ if (ret == 0)
+ return IO_TIMEOUT;
+ if (sw == WAITFD_C && FD_ISSET(*ps, &efds))
+ return IO_CLOSED;
+ return IO_DONE;
+ }
+
+ static int socket_send(p_socket ps, const char *data, size_t count, size_t *sent,
+ QT3DSU32 timeoutMilliseconds)
+ {
+ int err;
+ *sent = 0;
+ /* avoid making system calls on closed sockets */
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ /* loop until we send something or we give up on error */
+ for (;;) {
+ /* try to send something */
+ int put = send(*ps, data, (int)count, 0);
+ /* if we sent something, we are done */
+ if (put > 0) {
+ *sent = put;
+ return IO_DONE;
+ }
+ /* deal with failure */
+ err = WSAGetLastError();
+ /* we can only proceed if there was no serious error */
+ if (err != WSAEWOULDBLOCK)
+ return err;
+ /* avoid busy wait */
+ if ((err = socket_waitfd(ps, WAITFD_W, timeoutMilliseconds)) != IO_DONE)
+ return err;
+ }
+ /* can't reach here */
+ return IO_UNKNOWN;
+ }
+ /*-------------------------------------------------------------------------*\
+ * Receive with timeout
+ \*-------------------------------------------------------------------------*/
+ static int socket_recv(p_socket ps, char *data, size_t count, size_t *got,
+ QT3DSU32 timeoutMilliseconds)
+ {
+ int err;
+ *got = 0;
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ for (;;) {
+ int taken = recv(*ps, data, (int)count, 0);
+ if (taken > 0) {
+ *got = taken;
+ return IO_DONE;
+ }
+ if (taken == 0)
+ return IO_CLOSED;
+ err = WSAGetLastError();
+ if (err != WSAEWOULDBLOCK)
+ return err;
+ if ((err = socket_waitfd(ps, WAITFD_R, timeoutMilliseconds)) != IO_DONE)
+ return err;
+ }
+ return IO_UNKNOWN;
+ }
+
+ void socket_setblocking(p_socket ps)
+ {
+ u_long argp = 0;
+ ioctlsocket(*ps, FIONBIO, &argp);
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Put socket into non-blocking mode
+ \*-------------------------------------------------------------------------*/
+ void socket_setnonblocking(p_socket ps)
+ {
+ u_long argp = 1;
+ ioctlsocket(*ps, FIONBIO, &argp);
+ }
+
+ int socket_listen(p_socket ps, int backlog)
+ {
+ int err = IO_DONE;
+ socket_setblocking(ps);
+ if (listen(*ps, backlog) < 0)
+ err = WSAGetLastError();
+ socket_setnonblocking(ps);
+ return err;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Accept with timeout
+ \*-------------------------------------------------------------------------*/
+ static int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, QT3DSU32 tm)
+ {
+ SA daddr;
+ socklen_t dlen = sizeof(daddr);
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ if (!addr)
+ addr = &daddr;
+ if (!len)
+ len = &dlen;
+ for (;;) {
+ int err;
+ /* try to get client socket */
+ if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID)
+ return IO_DONE;
+ /* find out why we failed */
+ err = WSAGetLastError();
+ /* if we failed because there was no connectoin, keep trying */
+ if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED)
+ return err;
+ /* call select to avoid busy wait */
+ if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE)
+ return err;
+ }
+ /* can't reach here */
+ return IO_UNKNOWN;
+ }
+
+ int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp)
+ {
+ *hp = gethostbyaddr(addr, len, AF_INET);
+ if (*hp)
+ return IO_DONE;
+ else
+ return WSAGetLastError();
+ }
+
+ int socket_gethostbyname(const char *addr, struct hostent **hp)
+ {
+ *hp = gethostbyname(addr);
+ if (*hp)
+ return IO_DONE;
+ else
+ return WSAGetLastError();
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Error translation functions
+ \*-------------------------------------------------------------------------*/
+ const char *socket_hoststrerror(int err)
+ {
+ if (err <= 0)
+ return io_strerror(err);
+ switch (err) {
+ case WSAHOST_NOT_FOUND:
+ return "host not found";
+ default:
+ return wstrerror(err);
+ }
+ }
+ /*-------------------------------------------------------------------------*\
+ * Close and inutilize socket
+ \*-------------------------------------------------------------------------*/
+ void socket_destroy(p_socket ps)
+ {
+ if (*ps != SOCKET_INVALID) {
+ socket_setblocking(ps); /* close can take a long time on WIN32 */
+ closesocket(*ps);
+ *ps = SOCKET_INVALID;
+ }
+ }
+
+ /*-------------------------------------------------------------------------*\
+ *
+ \*-------------------------------------------------------------------------*/
+ void socket_shutdown(p_socket ps, int how)
+ {
+ socket_setblocking(ps);
+ shutdown(*ps, how);
+ }
+
+ int socket_create(p_socket ps, int domain, int type, int protocol)
+ {
+ *ps = socket(domain, type, protocol);
+ if (*ps != SOCKET_INVALID)
+ return IO_DONE;
+ else
+ return WSAGetLastError();
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Connects or returns error message
+ \*-------------------------------------------------------------------------*/
+ int socket_connect(p_socket ps, SA *addr, socklen_t len, QT3DSU32 tm)
+ {
+ int err;
+ /* don't call on closed socket */
+ if (*ps == SOCKET_INVALID)
+ return IO_CLOSED;
+ /* ask system to connect */
+ if (connect(*ps, addr, len) == 0)
+ return IO_DONE;
+ /* make sure the system is trying to connect */
+ err = WSAGetLastError();
+ if (err != WSAEWOULDBLOCK && err != WSAEINPROGRESS)
+ return err;
+ /* zero timeout case optimization */
+ if (tm == 0)
+ return IO_TIMEOUT;
+ /* we wait until something happens */
+ err = socket_waitfd(ps, WAITFD_C, tm);
+ if (err == IO_CLOSED) {
+ int len = sizeof(err);
+ /* give windows time to set the error (yes, disgusting) */
+ Sleep(10);
+ /* find out why we failed */
+ getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len);
+ /* we KNOW there was an error. if 'why' is 0, we will return
+ * "unknown error", but it's not really our fault */
+ return err > 0 ? err : IO_UNKNOWN;
+ } else
+ return err;
+ }
+
+ /*-------------------------------------------------------------------------*\
+ * Binds or returns error message
+ \*-------------------------------------------------------------------------*/
+ int socket_bind(p_socket ps, SA *addr, socklen_t len)
+ {
+ int err = IO_DONE;
+ socket_setblocking(ps);
+ if (bind(*ps, addr, len) < 0)
+ err = WSAGetLastError();
+ socket_setnonblocking(ps);
+ return err;
+ }
+ }
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/foundation/windows/qt_attribution.json b/src/foundation/windows/qt_attribution.json
new file mode 100644
index 0000000..e0310cf
--- /dev/null
+++ b/src/foundation/windows/qt_attribution.json
@@ -0,0 +1,10 @@
+{
+ "Id": "qt3dswindowsaos",
+ "Name": "Qt3DSWindowsAoS",
+ "QDocModule": "qt3dstudio",
+ "QtUsage": "Used by Qt3DStudio, Runtime component.",
+
+ "License": "Other",
+ "LicenseFile": "LICENSE.TXT",
+ "Copyright": "Copyright (c) 2001 Intel Corporation."
+}
diff --git a/src/hdr/CUDABSDFMipmap.cpp b/src/hdr/CUDABSDFMipmap.cpp
new file mode 100644
index 0000000..94f6712
--- /dev/null
+++ b/src/hdr/CUDABSDFMipmap.cpp
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifdef PLATFORM_HAS_CUDA
+
+#include "CUDABSDFMipmap.h"
+#include "cuda.h"
+#include "cuda_runtime.h"
+#include "cuda_gl_interop.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "nv_log.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace qt3ds::foundation;
+
+__host__ void jerror1(cudaError error);
+#ifdef _DEBUG
+#define CHECK_AND_HANDLE_CUDA_ERROR(func) \
+ func; \
+ { \
+ cudaError error = cudaGetLastError(); \
+ if (error != cudaSuccess) { \
+ printf("%s\n", cudaGetErrorString(error)); \
+ jerror1(error); \
+ QT3DS_ASSERT(false); \
+ } \
+ }
+#else
+#define CHECK_AND_HANDLE_CUDA_ERROR(func) func;
+#endif
+
+CUDABSDFMipMap::CUDABSDFMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture2D,
+ NVRenderTextureFormats::Enum inDestFormat, NVFoundationBase &inFnd)
+ : BSDFMipMap(inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd)
+ , m_TextureBinded(false)
+{
+
+ // CHECK_AND_HANDLE_CUDA_ERROR( cudaFree( 0 ); )
+ m_Pitches = (size_t *)QT3DS_ALLOC(m_Foundation.getAllocator(),
+ sizeof(size_t) * m_MaxMipMapLevel + 1, "BSDF MipMap pitches");
+ md_MipMapsData = (void **)QT3DS_ALLOC(m_Foundation.getAllocator(),
+ sizeof(void *) * m_MaxMipMapLevel + 1, "BSDF MipMap data");
+ // CHECK_AND_HANDLE_CUDA_ERROR();
+ size_t imagePitch;
+ int width = m_Width;
+ int height = m_Height;
+
+ for (int i = 0; i <= m_MaxMipMapLevel; ++i) {
+ imagePitch = m_SizeOfFormat * width;
+ // checkCudaErrors(cudaMalloc((void **)&cuda_dest_resource[mip], size_tex_data));
+ CHECK_AND_HANDLE_CUDA_ERROR(
+ cudaMallocPitch((void **)&md_MipMapsData[i], &m_Pitches[i], imagePitch, height);)
+ CHECK_AND_HANDLE_CUDA_ERROR(cudaMemset(md_MipMapsData[i], -1, m_Pitches[i] * height);)
+
+ width = width > 2 ? width >> 1 : 1;
+ height = height > 2 ? height >> 1 : 1;
+ }
+}
+
+CUDABSDFMipMap::~CUDABSDFMipMap()
+{
+ // CHECK_AND_HANDLE_CUDA_ERROR( cudaDeviceReset(); )
+ CHECK_AND_HANDLE_CUDA_ERROR(cudaDeviceSynchronize();)
+ for (int i = 0; i <= m_MaxMipMapLevel; ++i) {
+ CHECK_AND_HANDLE_CUDA_ERROR(cudaFree(md_MipMapsData[i]);)
+ }
+ QT3DS_FREE(m_Foundation.getAllocator(), md_MipMapsData);
+ QT3DS_FREE(m_Foundation.getAllocator(), m_Pitches);
+}
+
+void CUDABSDFMipMap::BindTexture()
+{
+ if (!m_TextureBinded) {
+ m_TextureBinded = true;
+
+ int width = m_Width;
+ int height = m_Height;
+ for (int i = 0; i <= m_MaxMipMapLevel; ++i) {
+ // if you wwant to change some texture filter settings use m_Texture2D object
+ m_Texture2D.SetTextureData(NVDataRef<QT3DSU8>(), (QT3DSU8)i, width, height,
+ NVRenderTextureFormats::RGBA16F,
+ NVRenderTextureFormats::RGBA16F);
+
+ width = width > 2 ? width >> 1 : 1;
+ height = height > 2 ? height >> 1 : 1;
+ }
+ // CHECK_AND_HANDLE_CUDA_ERROR( cudaGraphicsGLRegisterImage( &m_CudaMipMapResource,
+ // (GLuint)m_TextureHandle, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsWriteDiscard |
+ // cudaGraphicsRegisterFlagsTextureGather) )
+ CHECK_AND_HANDLE_CUDA_ERROR(cudaGraphicsGLRegisterImage(
+ &m_CudaMipMapResource, (GLuint)m_TextureHandle, GL_TEXTURE_2D,
+ cudaGraphicsRegisterFlagsWriteDiscard | cudaGraphicsRegisterFlagsTextureGather))
+ }
+}
+
+void CUDABSDFMipMap::TransferTexture() // after cuda generation
+{
+ cudaArray *texturePtr;
+ CHECK_AND_HANDLE_CUDA_ERROR(cudaGraphicsMapResources(1, &m_CudaMipMapResource, 0))
+ int width = m_Width;
+ int height = m_Height;
+ for (int i = 0; i <= m_MaxMipMapLevel; ++i) {
+ CHECK_AND_HANDLE_CUDA_ERROR(
+ cudaGraphicsSubResourceGetMappedArray(&texturePtr, m_CudaMipMapResource, 0, i))
+ CHECK_AND_HANDLE_CUDA_ERROR(cudaMemcpy2DToArray(texturePtr, 0, 0, md_MipMapsData[i],
+ m_Pitches[i], width * m_SizeOfFormat,
+ height, cudaMemcpyDeviceToDevice));
+
+ width = width > 2 ? width >> 1 : 1;
+ height = height > 2 ? height >> 1 : 1;
+ }
+ CHECK_AND_HANDLE_CUDA_ERROR(cudaGraphicsUnmapResources(1, &m_CudaMipMapResource, 0))
+}
+
+#endif
diff --git a/src/hdr/CUDABSDFMipmap.h b/src/hdr/CUDABSDFMipmap.h
new file mode 100644
index 0000000..33e0b91
--- /dev/null
+++ b/src/hdr/CUDABSDFMipmap.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CUDABSDfMIPMAP_H
+#define CUDABSDFMIPMAP_H
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "MipmapBSDF.h"
+
+#include "Qt3DSRenderLoadedTexture.h"
+
+#include "Qt3DSTypes.h"
+struct cudaGraphicsResource;
+#ifdef _LINUXPLATFORM
+#define __declspec(dllexport)
+#define __cdecl
+
+#endif
+using namespace qt3ds::render;
+
+class CUDABSDFMipMap : public BSDFMipMap
+{
+public:
+ CUDABSDFMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture, NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+ ~CUDABSDFMipMap();
+ void Build(void *inTextureData, int inTextureDataSize,
+ NVRenderBackend::NVRenderBackendTextureObject inTextureHandle,
+ NVRenderTextureFormats::Enum inFormat);
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation);
+
+private:
+ void CreateBsdfMipMaps(qt3ds::render::SLoadedTexture &inLoadedImage, void **result, int width,
+ int height); //, qt3ds::foundation::IPerfTimer& inPerfTimer);
+
+ void BindTexture();
+ void TransferTexture();
+
+ cudaGraphicsResource *m_CudaMipMapResource;
+ void **md_MipMapsData;
+ size_t *m_Pitches;
+ NVRenderBackend::NVRenderBackendTextureObject m_TextureHandle;
+ bool m_TextureBinded;
+};
+
+#endif
diff --git a/src/hdr/GLComputeMipMap.h b/src/hdr/GLComputeMipMap.h
new file mode 100644
index 0000000..a1a7ce5
--- /dev/null
+++ b/src/hdr/GLComputeMipMap.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef GLCOMPUTE_BSDF_MIMAP_H
+#define GLCOMPUTE_BSDF_MIMAP_H
+
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "MipmapBSDF.h"
+
+#include "Qt3DSRenderLoadedTexture.h"
+#include "Qt3DSTypes.h"
+
+using namespace qt3ds::render;
+
+class qt3ds::render::NVRenderContext;
+class qt3ds::render::NVRenderShaderProgram;
+class qt3ds::render::NVRenderTexture2D;
+
+class GLComputeMipMap : public BSDFMipMap
+{
+public:
+ GLComputeMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture, NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+ ~GLComputeMipMap();
+ void Build(void *inTextureData, int inTextureDataSize,
+ NVRenderBackend::NVRenderBackendTextureObject inTextureHandle,
+ NVRenderTextureFormats::Enum inFormat);
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation);
+
+private:
+ void CreateLevel0Tex(void *inTextureData, int inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat);
+
+ NVScopedRefCounted<NVRenderShaderProgram> m_BSDFProgram;
+ NVScopedRefCounted<NVRenderShaderProgram> m_UploadProgram_RGBA8;
+ NVScopedRefCounted<NVRenderShaderProgram> m_UploadProgram_RGB8;
+ NVScopedRefCounted<NVRenderTexture2D> m_Level0Tex;
+ bool m_TextureCreated;
+
+ void createComputeProgram(NVRenderContext *context);
+ NVRenderShaderProgram *getOrCreateUploadComputeProgram(NVRenderContext *context,
+ NVRenderTextureFormats::Enum inFormat);
+};
+
+#endif
diff --git a/src/hdr/GLComputeMipmap.cpp b/src/hdr/GLComputeMipmap.cpp
new file mode 100644
index 0000000..36b550d
--- /dev/null
+++ b/src/hdr/GLComputeMipmap.cpp
@@ -0,0 +1,394 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "GLComputeMipMap.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "render/Qt3DSRenderContext.h"
+#include "nv_log.h"
+#include <string>
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace qt3ds::foundation;
+
+static const char *computeUploadShader(std::string &prog, NVRenderTextureFormats::Enum inFormat,
+ bool binESContext)
+{
+ if (binESContext) {
+ prog += "#version 310 es\n"
+ "#extension GL_ARB_compute_shader : enable\n"
+ "precision highp float;\n"
+ "precision highp int;\n"
+ "precision mediump image2D;\n";
+ } else {
+ prog += "#version 430\n"
+ "#extension GL_ARB_compute_shader : enable\n";
+ }
+
+ if (inFormat == NVRenderTextureFormats::RGBA8) {
+ prog += "// Set workgroup layout;\n"
+ "layout (local_size_x = 16, local_size_y = 16) in;\n\n"
+ "layout (rgba8, binding = 1) uniform image2D inputImage;\n\n"
+ "layout (rgba16f, binding = 2) uniform image2D outputImage;\n\n"
+ "void main()\n"
+ "{\n"
+ " if ( gl_GlobalInvocationID.x >= gl_NumWorkGroups.x || gl_GlobalInvocationID.y "
+ ">= gl_NumWorkGroups.y )\n"
+ " return;\n"
+ " vec4 value = imageLoad(inputImage, ivec2(gl_GlobalInvocationID.xy));\n"
+ " imageStore( outputImage, ivec2(gl_GlobalInvocationID.xy), value );\n"
+ "}\n";
+ } else {
+ prog += "float convertToFloat( in uint inValue )\n"
+ "{\n"
+ " uint v = inValue & uint(0xFF);\n"
+ " float f = float(v)/256.0;\n"
+ " return f;\n"
+ "}\n";
+
+ prog += "int getMod( in int inValue, in int mod )\n"
+ "{\n"
+ " int v = mod * (inValue/mod);\n"
+ " return inValue - v;\n"
+ "}\n";
+
+ prog += "vec4 getRGBValue( in int byteNo, vec4 inVal, vec4 inVal1 )\n"
+ "{\n"
+ " vec4 result= vec4(0.0);\n"
+ " if( byteNo == 0) {\n"
+ " result.r = inVal.r;\n"
+ " result.g = inVal.g;\n"
+ " result.b = inVal.b;\n"
+ " }\n"
+ " else if( byteNo == 1) {\n"
+ " result.r = inVal.g;\n"
+ " result.g = inVal.b;\n"
+ " result.b = inVal.a;\n"
+ " }\n"
+ " else if( byteNo == 2) {\n"
+ " result.r = inVal.b;\n"
+ " result.g = inVal.a;\n"
+ " result.b = inVal1.r;\n"
+ " }\n"
+ " else if( byteNo == 3) {\n"
+ " result.r = inVal.a;\n"
+ " result.g = inVal1.r;\n"
+ " result.b = inVal1.g;\n"
+ " }\n"
+ " return result;\n"
+ "}\n";
+
+ prog += "// Set workgroup layout;\n"
+ "layout (local_size_x = 16, local_size_y = 16) in;\n\n"
+ "layout (rgba8, binding = 1) uniform image2D inputImage;\n\n"
+ "layout (rgba16f, binding = 2) uniform image2D outputImage;\n\n"
+ "void main()\n"
+ "{\n"
+ " vec4 result = vec4(0.0);\n"
+ " if ( gl_GlobalInvocationID.x >= gl_NumWorkGroups.x || gl_GlobalInvocationID.y "
+ ">= gl_NumWorkGroups.y )\n"
+ " return;\n"
+ " int xpos = (int(gl_GlobalInvocationID.x)*3)/4;\n"
+ " int xmod = getMod(int(gl_GlobalInvocationID.x)*3, 4);\n"
+ " ivec2 readPos = ivec2(xpos, gl_GlobalInvocationID.y);\n"
+ " vec4 value = imageLoad(inputImage, readPos);\n"
+ " vec4 value1 = imageLoad(inputImage, ivec2(readPos.x + 1, readPos.y));\n"
+ " result = getRGBValue( xmod, value, value1);\n"
+ " imageStore( outputImage, ivec2(gl_GlobalInvocationID.xy), result );\n"
+ "}\n";
+ }
+ return prog.c_str();
+}
+
+static const char *computeWorkShader(std::string &prog, bool binESContext)
+{
+ if (binESContext) {
+ prog += "#version 310 es\n"
+ "#extension GL_ARB_compute_shader : enable\n"
+ "precision highp float;\n"
+ "precision highp int;\n"
+ "precision mediump image2D;\n";
+ } else {
+ prog += "#version 430\n"
+ "#extension GL_ARB_compute_shader : enable\n";
+ }
+
+ prog += "int wrapMod( in int a, in int base )\n"
+ "{\n"
+ " return ( a >= 0 ) ? a % base : -(a % base) + base;\n"
+ "}\n";
+
+ prog += "void getWrappedCoords( inout int sX, inout int sY, in int width, in int height )\n"
+ "{\n"
+ " if (sY < 0) { sX -= width >> 1; sY = -sY; }\n"
+ " if (sY >= height) { sX += width >> 1; sY = height - sY; }\n"
+ " sX = wrapMod( sX, width );\n"
+ "}\n";
+
+ prog += "// Set workgroup layout;\n"
+ "layout (local_size_x = 16, local_size_y = 16) in;\n\n"
+ "layout (rgba16f, binding = 1) uniform image2D inputImage;\n\n"
+ "layout (rgba16f, binding = 2) uniform image2D outputImage;\n\n"
+ "void main()\n"
+ "{\n"
+ " int prevWidth = int(gl_NumWorkGroups.x) << 1;\n"
+ " int prevHeight = int(gl_NumWorkGroups.y) << 1;\n"
+ " if ( gl_GlobalInvocationID.x >= gl_NumWorkGroups.x || gl_GlobalInvocationID.y >= "
+ "gl_NumWorkGroups.y )\n"
+ " return;\n"
+ " vec4 accumVal = vec4(0.0);\n"
+ " for ( int sy = -2; sy <= 2; ++sy )\n"
+ " {\n"
+ " for ( int sx = -2; sx <= 2; ++sx )\n"
+ " {\n"
+ " int sampleX = sx + (int(gl_GlobalInvocationID.x) << 1);\n"
+ " int sampleY = sy + (int(gl_GlobalInvocationID.y) << 1);\n"
+ " getWrappedCoords(sampleX, sampleY, prevWidth, prevHeight);\n"
+ " if ((sampleY * prevWidth + sampleX) < 0 )\n"
+ " sampleY = prevHeight + sampleY;\n"
+ " ivec2 pos = ivec2(sampleX, sampleY);\n"
+ " vec4 value = imageLoad(inputImage, pos);\n"
+ " float filterPdf = 1.0 / ( 1.0 + float(sx*sx + sy*sy)*2.0 );\n"
+ " filterPdf /= 4.71238898;\n"
+ " accumVal[0] += filterPdf * value.r;\n"
+ " accumVal[1] += filterPdf * value.g;\n"
+ " accumVal[2] += filterPdf * value.b;\n"
+ " accumVal[3] += filterPdf * value.a;\n"
+ " }\n"
+ " }\n"
+ " imageStore( outputImage, ivec2(gl_GlobalInvocationID.xy), accumVal );\n"
+ "}\n";
+
+ return prog.c_str();
+}
+
+GLComputeMipMap::GLComputeMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture2D,
+ NVRenderTextureFormats::Enum inDestFormat, NVFoundationBase &inFnd)
+ : BSDFMipMap(inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd)
+ , m_BSDFProgram(NULL)
+ , m_UploadProgram_RGBA8(NULL)
+ , m_UploadProgram_RGB8(NULL)
+ , m_Level0Tex(NULL)
+ , m_TextureCreated(false)
+{
+}
+
+GLComputeMipMap::~GLComputeMipMap()
+{
+ m_UploadProgram_RGB8 = NULL;
+ m_UploadProgram_RGBA8 = NULL;
+ m_BSDFProgram = NULL;
+ m_Level0Tex = NULL;
+}
+
+inline NVConstDataRef<QT3DSI8> toRef(const char *data)
+{
+ size_t len = strlen(data) + 1;
+ return NVConstDataRef<QT3DSI8>((const QT3DSI8 *)data, (QT3DSU32)len);
+}
+
+static bool isGLESContext(NVRenderContext *context)
+{
+ NVRenderContextType ctxType = context->GetRenderContextType();
+
+ // Need minimum of GL3 or GLES3
+ if (ctxType == NVRenderContextValues::GLES2 || ctxType == NVRenderContextValues::GLES3
+ || ctxType == NVRenderContextValues::GLES31) {
+ return true;
+ }
+
+ return false;
+}
+
+#define WORKGROUP_SIZE 16
+
+void GLComputeMipMap::createComputeProgram(NVRenderContext *context)
+{
+ std::string computeProg;
+
+ if (!m_BSDFProgram) {
+ m_BSDFProgram = context
+ ->CompileComputeSource(
+ "Compute BSDF mipmap shader",
+ toRef(computeWorkShader(computeProg, isGLESContext(context))))
+ .mShader;
+ }
+}
+
+NVRenderShaderProgram *
+GLComputeMipMap::getOrCreateUploadComputeProgram(NVRenderContext *context,
+ NVRenderTextureFormats::Enum inFormat)
+{
+ std::string computeProg;
+
+ if (inFormat == NVRenderTextureFormats::RGB8) {
+ if (!m_UploadProgram_RGB8) {
+ m_UploadProgram_RGB8 =
+ context
+ ->CompileComputeSource(
+ "Compute BSDF mipmap level 0 RGB8 shader",
+ toRef(computeUploadShader(computeProg, inFormat, isGLESContext(context))))
+ .mShader;
+ }
+
+ return m_UploadProgram_RGB8;
+ } else {
+ if (!m_UploadProgram_RGBA8) {
+ m_UploadProgram_RGBA8 =
+ context
+ ->CompileComputeSource(
+ "Compute BSDF mipmap level 0 RGBA8 shader",
+ toRef(computeUploadShader(computeProg, inFormat, isGLESContext(context))))
+ .mShader;
+ }
+
+ return m_UploadProgram_RGBA8;
+ }
+}
+
+void GLComputeMipMap::CreateLevel0Tex(void *inTextureData, int inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat)
+{
+ NVRenderTextureFormats::Enum theFormat = inFormat;
+ int theWidth = m_Width;
+
+ // Since we cannot use RGB format in GL compute
+ // we treat it as a RGBA component format
+ if (inFormat == NVRenderTextureFormats::RGB8) {
+ // This works only with 4 byte aligned data
+ QT3DS_ASSERT(m_Width % 4 == 0);
+ theFormat = NVRenderTextureFormats::RGBA8;
+ theWidth = (m_Width * 3) / 4;
+ }
+
+ if (m_Level0Tex == NULL) {
+ m_Level0Tex = m_NVRenderContext->CreateTexture2D();
+ m_Level0Tex->SetTextureStorage(1, theWidth, m_Height, theFormat, theFormat,
+ NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize));
+ } else {
+ m_Level0Tex->SetTextureSubData(NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize), 0,
+ 0, 0, theWidth, m_Height, theFormat);
+ }
+}
+
+void GLComputeMipMap::Build(void *inTextureData, int inTextureDataSize,
+ NVRenderBackend::NVRenderBackendTextureObject,
+ NVRenderTextureFormats::Enum inFormat)
+{
+ bool needMipUpload = (inFormat != m_DestinationFormat);
+ // re-upload data
+ if (!m_TextureCreated) {
+ m_Texture2D.SetTextureStorage(
+ m_MaxMipMapLevel + 1, m_Width, m_Height, m_DestinationFormat, inFormat, (needMipUpload)
+ ? NVDataRef<QT3DSU8>()
+ : NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize));
+ m_Texture2D.addRef();
+ // create a compute shader (if not aloread done) which computes the BSDF mipmaps for this
+ // texture
+ createComputeProgram(m_NVRenderContext);
+
+ if (!m_BSDFProgram) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ m_TextureCreated = true;
+ } else if (!needMipUpload) {
+ m_Texture2D.SetTextureSubData(NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize), 0,
+ 0, 0, m_Width, m_Height, inFormat);
+ }
+
+ if (needMipUpload) {
+ CreateLevel0Tex(inTextureData, inTextureDataSize, inFormat);
+ }
+
+ NVScopedRefCounted<NVRenderImage2D> theInputImage;
+ NVScopedRefCounted<NVRenderImage2D> theOutputImage;
+ theInputImage =
+ m_NVRenderContext->CreateImage2D(&m_Texture2D, NVRenderImageAccessType::ReadWrite);
+ theOutputImage =
+ m_NVRenderContext->CreateImage2D(&m_Texture2D, NVRenderImageAccessType::ReadWrite);
+
+ if (needMipUpload && m_Level0Tex) {
+ NVRenderShaderProgram *uploadProg =
+ getOrCreateUploadComputeProgram(m_NVRenderContext, inFormat);
+ if (!uploadProg)
+ return;
+
+ m_NVRenderContext->SetActiveShader(uploadProg);
+
+ NVScopedRefCounted<NVRenderImage2D> theInputImage0;
+ theInputImage0 =
+ m_NVRenderContext->CreateImage2D(m_Level0Tex, NVRenderImageAccessType::ReadWrite);
+
+ theInputImage0->SetTextureLevel(0);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedinputImage0("inputImage",
+ *uploadProg);
+ theCachedinputImage0.Set(theInputImage0);
+
+ theOutputImage->SetTextureLevel(0);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedOutputImage("outputImage",
+ *uploadProg);
+ theCachedOutputImage.Set(theOutputImage);
+
+ m_NVRenderContext->DispatchCompute(uploadProg, m_Width, m_Height, 1);
+
+ // sync
+ NVRenderBufferBarrierFlags flags(NVRenderBufferBarrierValues::ShaderImageAccess);
+ m_NVRenderContext->SetMemoryBarrier(flags);
+ }
+
+ int width = m_Width >> 1;
+ int height = m_Height >> 1;
+
+ m_NVRenderContext->SetActiveShader(m_BSDFProgram);
+
+ for (int i = 1; i <= m_MaxMipMapLevel; ++i) {
+ theOutputImage->SetTextureLevel(i);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedOutputImage("outputImage",
+ *m_BSDFProgram);
+ theCachedOutputImage.Set(theOutputImage);
+ theInputImage->SetTextureLevel(i - 1);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedinputImage("inputImage",
+ *m_BSDFProgram);
+ theCachedinputImage.Set(theInputImage);
+
+ m_NVRenderContext->DispatchCompute(m_BSDFProgram, width, height, 1);
+
+ width = width > 2 ? width >> 1 : 1;
+ height = height > 2 ? height >> 1 : 1;
+
+ // sync
+ NVRenderBufferBarrierFlags flags(NVRenderBufferBarrierValues::ShaderImageAccess);
+ m_NVRenderContext->SetMemoryBarrier(flags);
+ }
+}
diff --git a/src/hdr/HDR.cpp b/src/hdr/HDR.cpp
new file mode 100644
index 0000000..9abe2b3
--- /dev/null
+++ b/src/hdr/HDR.cpp
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "HDR.h"
diff --git a/src/hdr/HDR.h b/src/hdr/HDR.h
new file mode 100644
index 0000000..fbc4ea4
--- /dev/null
+++ b/src/hdr/HDR.h
@@ -0,0 +1,239 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef HDR_H
+#define HDR_H
+
+#include "foundation/Qt3DSVec3.h"
+//#include "HDR.h"
+
+namespace qt3ds {
+class QT3DSVec3;
+
+namespace HDR {
+
+ template <int N>
+ class HDRConfiguration;
+
+ template <int N>
+ class Histogram
+ {
+ public:
+ /**
+ * @brief build the histogram based on 2^10 binning.
+ *
+ * @param[in] inImage Pointer to image
+ * @param[in] inWidth Width of image
+ * @param[in] inHeight Height of image
+ * @param[out] outHistogram
+ *
+ * @return No return
+ */
+ static void Build(QT3DSVec3 *inImage, int inWidth, int inHeight, QT3DSVec3 *outHistogram)
+ {
+ long noPixels = inWidth * inHeight;
+
+ for (int i = 0; i < noPixels; ++i) {
+ outHistogram[(int)inImage[i].x].x++;
+ outHistogram[(int)inImage[i].y].y++;
+ outHistogram[(int)inImage[i].z].z++;
+ }
+ }
+ };
+
+ template <int N>
+ class HDR
+ {
+
+ public:
+ HDR(HDRConfiguration<N> *inConfiguration) { mHDRConfiguration = inConfiguration; }
+
+ void Build(QT3DSVec3 **inImages, int inNoImages, int inWidth, int inHeight, float *inExposures,
+ QT3DSVec3 *outRadiance)
+ {
+ for (int x = 0; x < inWidth; ++x) {
+ for (int y = 0; y < inHeight; ++y) {
+ QT3DSVec3 divisor(0.0f);
+ QT3DSVec3 dividend(0.0f);
+ for (int i = 0; i < inNoImages; ++i) {
+ QT3DSVec3 pixel = inImages[i][x + y * inWidth];
+
+ dividend += (LUT(mHDRConfiguration->weights, pixel) * inExposures[i])
+ .multiply(LUT(mHDRConfiguration->CRF, pixel));
+ divisor += LUT(mHDRConfiguration->weights, pixel) * inExposures[i]
+ * inExposures[i];
+ }
+ divisor.x = 1.0f / divisor.x;
+ divisor.y = 1.0f / divisor.y;
+ divisor.z = 1.0f / divisor.z;
+
+ outRadiance[x + y * inWidth] = dividend.multiply(divisor);
+ }
+ }
+ }
+
+ private:
+ /**
+ * @brief Return the value based off from array as a LUT
+ *
+ * @param[in] inLUT The LUT table of interest
+ * @param[in] inValue The value that you have
+ * @param[out] QT3DSVec3 The corresponding value of array based on input
+ * tuple
+ *
+ * @return No return
+ */
+ QT3DSVec3 LUT(float *inLUT, QT3DSVec3 inValue)
+ {
+ return QT3DSVec3(inLUT[(int)inValue.x], inLUT[(int)inValue.y], inLUT[(int)inValue.z]);
+ }
+
+ QT3DSVec3 LUT(QT3DSVec3 *inLUT, QT3DSVec3 inValue)
+ {
+ return QT3DSVec3(inLUT[(int)inValue.x].x, inLUT[(int)inValue.y].y,
+ inLUT[(int)inValue.z].z);
+ }
+
+ HDRConfiguration<N> *mHDRConfiguration;
+ };
+
+ template <int N>
+ class HDRConfiguration
+ {
+ public:
+ HDRConfiguration()
+ {
+ threshold = 0.1f;
+ maxIterations = 30;
+ GenerateRobertsonWeighting();
+ }
+
+ void SetCRF(QT3DSVec3 *inCRF) { memcpy(CRF, inCRF, sizeof(QT3DSVec3) * N); }
+
+ /**
+ * @brief build the camera response function
+ *
+ * @param[in] inImages Pointer to images
+ * @param[in] inNoImages Number of images
+ * @param[in] inWidth Width of image
+ * @param[in] inHeight Height of image
+ * @param[out] outHistogram
+ *
+ * @return No return
+ */
+ void BuildCRF(QT3DSVec3 **inImages, int inNoImages, int inWidth, int inHeight,
+ float *inExposures)
+ {
+ QT3DSVec3 histogram[N];
+ QT3DSVec3 newCRF[N];
+
+ HDR<N> hdr(this);
+
+ memset(histogram, 0, sizeof(QT3DSVec3) * N);
+
+ for (int i = 0; i < inNoImages; ++i) {
+ Histogram<N>::Build(inImages[i], inWidth, inHeight, histogram);
+ }
+
+ for (int i = 0; i < N; ++i) {
+ histogram[i].x = histogram[i].x > 0 ? 1 / histogram[i].x : 0;
+ histogram[i].y = histogram[i].y > 0 ? 1 / histogram[i].y : 0;
+ histogram[i].z = histogram[i].z > 0 ? 1 / histogram[i].z : 0;
+ }
+
+ QT3DSVec3 *radiance = new QT3DSVec3[inWidth * inHeight * sizeof(QT3DSVec3)];
+
+ // iteration 0, linearize CRF
+ for (int i = 0; i < N; ++i) {
+ CRF[i] = QT3DSVec3((float)i) * 2.0f / N;
+ }
+
+ for (int iteration = 0; iteration < maxIterations; ++iteration) {
+ hdr.Build(inImages, inNoImages, inWidth, inHeight, inExposures, radiance);
+
+ memset(newCRF, 0, sizeof(QT3DSVec3) * N);
+
+ for (int i = 0; i < inNoImages; ++i) {
+ for (int x = 0; x < inWidth; ++x) {
+ for (int y = 0; y < inHeight; ++y) {
+ long offset = x + y * inWidth;
+ QT3DSVec3 pixel = inImages[i][offset];
+ newCRF[(int)pixel.x].x += (inExposures[i] * radiance[offset].x);
+ newCRF[(int)pixel.y].y += (inExposures[i] * radiance[offset].y);
+ newCRF[(int)pixel.z].z += (inExposures[i] * radiance[offset].z);
+ }
+ }
+ }
+
+ float difference = 0;
+ for (int i = 0; i < N; ++i) {
+ newCRF[i] = newCRF[i].multiply(histogram[i]);
+ }
+
+ QT3DSVec3 middle = newCRF[N / 2];
+ for (int i = 0; i < N; ++i) {
+ newCRF[i].x = newCRF[i].x / middle.x;
+ newCRF[i].y = newCRF[i].y / middle.y;
+ newCRF[i].z = newCRF[i].z / middle.z;
+ difference += (CRF[i] - newCRF[i]).magnitude();
+ }
+ for (int i = 0; i < N; ++i) {
+ CRF[i] = newCRF[i];
+ }
+ if (difference < threshold) {
+ break;
+ }
+ }
+ delete[] radiance;
+ }
+
+ float weights[N];
+ QT3DSVec3 CRF[N];
+
+ private:
+ void GenerateRobertsonWeighting()
+ {
+ // Dynamic Range Improvement Through Multiple Exposures (5)
+ // gaussian random weighting
+ float divisor = (N - 1) * (N - 1) / 4.0;
+ for (int i = 0; i < N; ++i) {
+ float dividend = (i - (N - 1) / 2.0f);
+ dividend *= dividend;
+ weights[i] = exp(-4.0f * dividend / divisor);
+ }
+ }
+
+ int maxIterations;
+ float threshold;
+ };
+}
+}
+#endif
diff --git a/src/hdr/MipmapBSDF.cpp b/src/hdr/MipmapBSDF.cpp
new file mode 100644
index 0000000..fd57015
--- /dev/null
+++ b/src/hdr/MipmapBSDF.cpp
@@ -0,0 +1,265 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "MipmapBSDF.h"
+#include "GLComputeMipMap.h"
+
+#ifdef PLATFORM_HAS_CUDA
+#include "cuda.h"
+#include "cuda_runtime.h"
+#include "CUDABSDFMipmap.h"
+#endif
+
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "nv_log.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace qt3ds::foundation;
+
+BSDFMipMap::BSDFMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture2D, NVRenderTextureFormats::Enum inDestFormat,
+ NVFoundationBase &inFnd)
+ : m_Foundation(inFnd)
+ , m_Texture2D(inTexture2D)
+ , m_Width(inWidth)
+ , m_Height(inHeight)
+ , m_DestinationFormat(inDestFormat)
+ , m_NVRenderContext(inNVRenderContext)
+{
+ // Calculate mip level
+ int maxDim = inWidth >= inHeight ? inWidth : inHeight;
+
+ m_MaxMipMapLevel = static_cast<int>(logf((float)maxDim) / logf(2.0f));
+ // no concept of sizeOfFormat just does'nt make sense
+ m_SizeOfFormat = NVRenderTextureFormats::getSizeofFormat(m_DestinationFormat);
+ m_NoOfComponent = NVRenderTextureFormats::getNumberOfComponent(m_DestinationFormat);
+}
+
+BSDFMipMap *BSDFMipMap::Create(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture2D,
+ NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd)
+{
+ BSDFMipMap *theBSDFMipMap = NULL;
+#ifdef PLATFORM_HAS_CUDA
+ int deviceCount;
+ cudaError_t e = cudaGetDeviceCount(&deviceCount);
+#endif
+
+ if (inNVRenderContext->IsComputeSupported()) {
+ theBSDFMipMap = QT3DS_NEW(inFnd.getAllocator(), GLComputeMipMap)(
+ inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd);
+ } else
+#ifdef PLATFORM_HAS_CUDA
+ if (e == cudaSuccess && deviceCount > 0) {
+ theBSDFMipMap = QT3DS_NEW(inFnd.getAllocator(), CUDABSDFMipMap)(
+ inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd);
+ } else
+#endif
+ if (!theBSDFMipMap) {
+ theBSDFMipMap = QT3DS_NEW(inFnd.getAllocator(), BasicBSDFMipMap)(
+ inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd);
+ }
+
+ return theBSDFMipMap;
+}
+
+BasicBSDFMipMap::BasicBSDFMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture2D,
+ NVRenderTextureFormats::Enum inDestFormat, NVFoundationBase &inFnd)
+ : BSDFMipMap(inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd)
+{
+}
+
+BSDFMipMap::~BSDFMipMap()
+{
+}
+
+void BasicBSDFMipMap::Build(void *inTextureData, int inTextureDataSize,
+ NVRenderBackend::NVRenderBackendTextureObject,
+ NVRenderTextureFormats::Enum inFormat)
+{
+
+ m_InternalFormat = inFormat;
+ m_SizeOfInternalFormat = NVRenderTextureFormats::getSizeofFormat(m_InternalFormat);
+ m_InternalNoOfComponent = NVRenderTextureFormats::getNumberOfComponent(m_InternalFormat);
+
+ m_Texture2D.SetTextureData(NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize), 0,
+ m_Width, m_Height, inFormat, m_DestinationFormat);
+
+ STextureData theMipImage;
+ STextureData prevImage;
+ prevImage.data = inTextureData;
+ prevImage.dataSizeInBytes = inTextureDataSize;
+ prevImage.format = inFormat;
+ int curWidth = m_Width;
+ int curHeight = m_Height;
+ int size = NVRenderTextureFormats::getSizeofFormat(m_InternalFormat);
+ for (int idx = 1; idx <= m_MaxMipMapLevel; ++idx) {
+ theMipImage =
+ CreateBsdfMipLevel(theMipImage, prevImage, curWidth, curHeight); //, m_PerfTimer );
+ curWidth = curWidth >> 1;
+ curHeight = curHeight >> 1;
+ curWidth = curWidth >= 1 ? curWidth : 1;
+ curHeight = curHeight >= 1 ? curHeight : 1;
+ inTextureDataSize = curWidth * curHeight * size;
+
+ m_Texture2D.SetTextureData(toU8DataRef((char *)theMipImage.data, (QT3DSU32)inTextureDataSize),
+ (QT3DSU8)idx, (QT3DSU32)curWidth, (QT3DSU32)curHeight, theMipImage.format,
+ m_DestinationFormat);
+
+ if (prevImage.data == inTextureData)
+ prevImage = STextureData();
+
+ STextureData temp = prevImage;
+ prevImage = theMipImage;
+ theMipImage = temp;
+ }
+ QT3DS_FREE(m_Foundation.getAllocator(), theMipImage.data);
+ QT3DS_FREE(m_Foundation.getAllocator(), prevImage.data);
+}
+
+inline int BasicBSDFMipMap::wrapMod(int a, int base)
+{
+ return (a >= 0) ? a % base : (a % base) + base;
+}
+
+inline void BasicBSDFMipMap::getWrappedCoords(int &sX, int &sY, int width, int height)
+{
+ if (sY < 0) {
+ sX -= width >> 1;
+ sY = -sY;
+ }
+ if (sY >= height) {
+ sX += width >> 1;
+ sY = height - sY;
+ }
+ sX = wrapMod(sX, width);
+}
+
+STextureData BasicBSDFMipMap::CreateBsdfMipLevel(STextureData &inCurMipLevel,
+ STextureData &inPrevMipLevel, int width,
+ int height) //, IPerfTimer& inPerfTimer )
+{
+ // SStackPerfTimer __timer( inPerfTimer, "Image BSDF Mip Level" );
+ STextureData retval;
+ int newWidth = width >> 1;
+ int newHeight = height >> 1;
+ newWidth = newWidth >= 1 ? newWidth : 1;
+ newHeight = newHeight >= 1 ? newHeight : 1;
+
+ if (inCurMipLevel.data) {
+ retval = inCurMipLevel;
+ retval.dataSizeInBytes =
+ newWidth * newHeight * NVRenderTextureFormats::getSizeofFormat(inPrevMipLevel.format);
+ } else {
+ retval.dataSizeInBytes =
+ newWidth * newHeight * NVRenderTextureFormats::getSizeofFormat(inPrevMipLevel.format);
+ retval.format = inPrevMipLevel.format; // inLoadedImage.format;
+ retval.data = m_Foundation.getAllocator().allocate(
+ retval.dataSizeInBytes, "Bsdf Scaled Image Data", __FILE__, __LINE__);
+ }
+
+ for (int y = 0; y < newHeight; ++y) {
+ for (int x = 0; x < newWidth; ++x) {
+ float accumVal[4];
+ accumVal[0] = 0;
+ accumVal[1] = 0;
+ accumVal[2] = 0;
+ accumVal[3] = 0;
+ for (int sy = -2; sy <= 2; ++sy) {
+ for (int sx = -2; sx <= 2; ++sx) {
+ int sampleX = sx + (x << 1);
+ int sampleY = sy + (y << 1);
+ getWrappedCoords(sampleX, sampleY, width, height);
+
+ // Cauchy filter (this is simply because it's the easiest to evaluate, and
+ // requires no complex
+ // functions).
+ float filterPdf = 1.f / (1.f + float(sx * sx + sy * sy) * 2.f);
+ // With FP HDR formats, we're not worried about intensity loss so much as
+ // unnecessary energy gain,
+ // whereas with LDR formats, the fear with a continuous normalization factor is
+ // that we'd lose
+ // intensity and saturation as well.
+ filterPdf /= (NVRenderTextureFormats::getSizeofFormat(retval.format) >= 8)
+ ? 4.71238898f
+ : 4.5403446f;
+ // filterPdf /= 4.5403446f; // Discrete normalization factor
+ // filterPdf /= 4.71238898f; // Continuous normalization factor
+ float curPix[4];
+ QT3DSI32 byteOffset = (sampleY * width + sampleX)
+ * NVRenderTextureFormats::getSizeofFormat(retval.format);
+ if (byteOffset < 0) {
+ sampleY = height + sampleY;
+ byteOffset = (sampleY * width + sampleX)
+ * NVRenderTextureFormats::getSizeofFormat(retval.format);
+ }
+
+ NVRenderTextureFormats::decodeToFloat(inPrevMipLevel.data, byteOffset, curPix,
+ retval.format);
+
+ accumVal[0] += filterPdf * curPix[0];
+ accumVal[1] += filterPdf * curPix[1];
+ accumVal[2] += filterPdf * curPix[2];
+ accumVal[3] += filterPdf * curPix[3];
+ }
+ }
+
+ /*
+ // Re-adjustment after the fact for the RGBD hack.
+ if (retval.format == NVRenderTextureFormats::RGBA8 || retval.format ==
+ NVRenderTextureFormats::SRGB8A8)
+ {
+ float divVal = (accumVal[0] > accumVal[1]) ? accumVal[0] : accumVal[1];
+ divVal = (divVal > accumVal[2]) ? divVal : accumVal[2];
+ if (divVal > 1.0)
+ {
+ divVal = 1.0f / divVal;
+ accumVal[0] *= divVal;
+ accumVal[1] *= divVal;
+ accumVal[2] *= divVal;
+ accumVal[3] = divVal;
+ }
+ else
+ accumVal[3] = 1.0f;
+ }
+ */
+ QT3DSU32 newIdx =
+ (y * newWidth + x) * NVRenderTextureFormats::getSizeofFormat(retval.format);
+
+ NVRenderTextureFormats::encodeToPixel(accumVal, retval.data, newIdx, retval.format);
+ }
+ }
+
+ return retval;
+}
diff --git a/src/hdr/MipmapBSDF.cu b/src/hdr/MipmapBSDF.cu
new file mode 100644
index 0000000..6ddac4b
--- /dev/null
+++ b/src/hdr/MipmapBSDF.cu
@@ -0,0 +1,404 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#if defined (_PLATFORM_USE_EGL)
+#include <GLES31/gl31.h>
+#include <GLES31/gl2ext.h>
+#endif
+
+#include "CUDABSDFMipmap.h"
+#include "cuda.h"
+#include "cuda_runtime.h"
+#include "cuda_gl_interop.h"
+#include <iostream>
+
+using namespace nv;
+using namespace nv::render;
+__host__ void jerror1(cudaError error)
+{
+ static int i = 0;
+ ++i;
+}
+#ifdef _DEBUG
+#define CHECK_AND_HANDLE_CUDA_ERROR(func) \
+ func; \
+ { \
+ cudaError error = cudaGetLastError(); \
+ if ( error != cudaSuccess ) \
+ { \
+ printf("%s\n", cudaGetErrorString(error)); \
+ jerror1(error);\
+ NV_ASSERT( false ); \
+ } \
+ }
+#else
+#define CHECK_AND_HANDLE_CUDA_ERROR(func) \
+func;
+#endif
+
+__device__ inline int wrapMod( int a, int base )
+{
+ int ret = a % base;
+ if (ret < 0 ) ret += base;
+ return ret;
+}
+
+__device__ inline void getWrappedCoords( int &sX, int &sY, int width, int height )
+{
+ if (sY < 0) { sX -= width >> 1; sY = -sY; }
+ if (sY >= height) { sX += width >> 1; sY = height - sY; }
+ sX = wrapMod( sX, width );
+ sY = wrapMod( sY, height );
+}
+
+__device__ void decodeToFloat( void *inPtr, NVU32 byteOfs, float *outPtr, NVRenderTextureFormats::Enum inFmt, unsigned int numberOfComponent )
+{
+ outPtr[0] = 0.0f; outPtr[1] = 0.0f; outPtr[2] = 0.0f; outPtr[3] = 0.0f;
+ NVU8 *src = reinterpret_cast<NVU8 *>(inPtr);
+ //float divisor; // If we want to support RGBD?
+ switch(inFmt)
+ {
+ case NVRenderTextureFormats::Alpha8:
+ outPtr[0] = ((float)src[byteOfs]) / 255.0f;
+ break;
+
+ case NVRenderTextureFormats::Luminance8:
+ case NVRenderTextureFormats::LuminanceAlpha8:
+ case NVRenderTextureFormats::R8:
+ case NVRenderTextureFormats::RG8:
+ case NVRenderTextureFormats::RGB8:
+ case NVRenderTextureFormats::RGBA8:
+ case NVRenderTextureFormats::SRGB8:
+ case NVRenderTextureFormats::SRGB8A8:
+ // NOTE : RGBD Hack here for reference. Not meant for installation.
+ //divisor = (NVRenderTextureFormats::getSizeofFormat(inFmt) == 4) ? ((float)src[byteOfs+3]) / 255.0f : 1.0f;
+ for ( NVU32 i = 0; i < numberOfComponent; ++i )
+ {
+ float val = ((float)src[byteOfs + i]) / 255.0f;
+ outPtr[i] = (i < 3) ? powf(val, 0.4545454545f) : val;
+ // Assuming RGBA8 actually means RGBD (which is stupid, I know)
+ //if ( NVRenderTextureFormats::getSizeofFormat(inFmt) == 4 ) { outPtr[i] /= divisor; }
+ }
+ //outPtr[3] = divisor;
+ break;
+
+ case NVRenderTextureFormats::RGBA32F:
+ outPtr[0] = reinterpret_cast<float *>(src+byteOfs)[0];
+ outPtr[1] = reinterpret_cast<float *>(src+byteOfs)[1];
+ outPtr[2] = reinterpret_cast<float *>(src+byteOfs)[2];
+ outPtr[3] = reinterpret_cast<float *>(src+byteOfs)[3];
+ break;
+ case NVRenderTextureFormats::RGB32F:
+ outPtr[0] = reinterpret_cast<float *>(src+byteOfs)[0];
+ outPtr[1] = reinterpret_cast<float *>(src+byteOfs)[1];
+ outPtr[2] = reinterpret_cast<float *>(src+byteOfs)[2];
+ break;
+
+ case NVRenderTextureFormats::RGBA16F:
+ /*
+ for ( NVU32 i = 0; i < 4; ++i )
+ {
+ // NOTE : This only works on the assumption that we don't have any denormals, Infs or NaNs.
+ // Every pixel in our source image should be "regular"
+ NVU16 h = reinterpret_cast<NVU16 *>(src + byteOfs)[i];
+ NVU32 sign = (h & 0x8000) << 16;
+ NVU32 exponent = (((((h & 0x7c00) >> 10) - 15) + 127) << 23);
+ NVU32 mantissa = ((h & 0x3ff) << 13);
+ NVU32 result = sign | exponent | mantissa;
+
+ if (h == 0 || h == 0x8000) { result = 0; } // Special case for zero and negative zero
+ memcpy( reinterpret_cast<NVU32 *>(outPtr) + i, &result, 4 );
+ }*/
+
+ for ( NVU32 i = 0; i < 2; i++ )
+ {
+ // NOTE : This only works on the assumption that we don't have any denormals, Infs or NaNs.
+ // Every pixel in our source image should be "regular"
+
+ NVU32 h1 = reinterpret_cast<NVU32 *>(src + byteOfs)[i];
+
+ for ( NVU8 j = 0; j < 2; j++ )
+ {
+ NVU16 h = (h1 & (0x0000FFFF << j*16 )) >> j*16;
+ NVU32 sign = (h & 0x8000) << 16;
+ NVU32 exponent = (((((h & 0x7c00) >> 10) - 15) + 127) << 23);
+ NVU32 mantissa = ((h & 0x3ff) << 13);
+ NVU32 result = sign | exponent | mantissa;
+
+ if (h == 0 || h == 0x8000) { result = 0; } // Special case for zero and negative zero
+ memcpy( reinterpret_cast<NVU32 *>(outPtr) + i*2 + j, &result, 4 );
+ }
+ }
+ break;
+
+ case NVRenderTextureFormats::R11G11B10:
+ // place holder
+ NV_ASSERT( false );
+ break;
+
+ default:
+ outPtr[0] = 0.0f;
+ outPtr[1] = 0.0f;
+ outPtr[2] = 0.0f;
+ outPtr[3] = 0.0f;
+ break;
+ }
+}
+
+void __device__ encodeToPixel( float *inPtr, void *outPtr, NVU32 byteOfs, NVRenderTextureFormats::Enum inFmt, unsigned int noOfComponent )
+{
+ NVU8 *dest = reinterpret_cast<NVU8 *>(outPtr);
+ switch(inFmt)
+ {
+ case NVRenderTextureFormats::Alpha8:
+ dest[byteOfs] = NVU8( inPtr[0] * 255.0f );
+ break;
+
+ case NVRenderTextureFormats::Luminance8:
+ case NVRenderTextureFormats::LuminanceAlpha8:
+ case NVRenderTextureFormats::R8:
+ case NVRenderTextureFormats::RG8:
+ case NVRenderTextureFormats::RGB8:
+ case NVRenderTextureFormats::RGBA8:
+ case NVRenderTextureFormats::SRGB8:
+ case NVRenderTextureFormats::SRGB8A8:
+ for ( NVU32 i = 0; i < noOfComponent; ++i )
+ {
+ inPtr[i] = (inPtr[i] > 1.0f) ? 1.0f : inPtr[i];
+ if (i < 3)
+ dest[byteOfs+i] = NVU8( powf( inPtr[i], 2.2f ) * 255.0f);
+ else
+ dest[byteOfs+i] = NVU8( inPtr[i] * 255.0f );
+ }
+ break;
+
+ case NVRenderTextureFormats::RGBA32F:
+ reinterpret_cast<float *>(dest+byteOfs)[0] = inPtr[0];
+ reinterpret_cast<float *>(dest+byteOfs)[1] = inPtr[1];
+ reinterpret_cast<float *>(dest+byteOfs)[2] = inPtr[2];
+ reinterpret_cast<float *>(dest+byteOfs)[3] = inPtr[3];
+ break;
+ case NVRenderTextureFormats::RGB32F:
+ reinterpret_cast<float *>(dest+byteOfs)[0] = inPtr[0];
+ reinterpret_cast<float *>(dest+byteOfs)[1] = inPtr[1];
+ reinterpret_cast<float *>(dest+byteOfs)[2] = inPtr[2];
+ break;
+
+ case NVRenderTextureFormats::RGBA16F:
+ for ( NVU32 i = 0; i < 4; ++i )
+ {
+ // NOTE : This also has the limitation of not handling infs, NaNs and denormals, but it should be
+ // sufficient for our purposes.
+ if (inPtr[i] > 65519.0f) { inPtr[i] = 65519.0f; }
+ if (fabs(inPtr[i]) < 6.10352E-5f) { inPtr[i] = 0.0f; }
+ NVU32 f = reinterpret_cast<NVU32 *>(inPtr)[i];
+ NVU32 sign = (f & 0x80000000) >> 16;
+ NVI32 exponent = (f & 0x7f800000) >> 23;
+ NVU32 mantissa = (f >> 13) & 0x3ff;
+ exponent = exponent - 112;
+ if (exponent > 31) { exponent = 31; }
+ if (exponent < 0) { exponent = 0; }
+ exponent = exponent << 10;
+ reinterpret_cast<NVU16 *>(dest + byteOfs)[i] = NVU16(sign | exponent | mantissa);
+ }
+ break;
+
+ case NVRenderTextureFormats::R11G11B10:
+ // place holder
+ NV_ASSERT( false );
+ break;
+
+ default:
+ dest[byteOfs] = 0;
+ dest[byteOfs+1] = 0;
+ dest[byteOfs+2] = 0;
+ dest[byteOfs+3] = 0;
+ break;
+ }
+}
+
+void __global__ Convert3To4Component( cudaTextureObject_t tex, float *d_outBuffer, Q3DStudio::INT32 dpitch, Q3DStudio::INT32 width, Q3DStudio::INT32 height )
+{
+ float *dest = d_outBuffer;
+
+ int x = threadIdx.x + blockIdx.x * blockDim.x;
+ int y = threadIdx.y + blockIdx.y * blockDim.y;
+ if ( x >= width || y >= height )
+ return;
+ int inX = x * 3;
+ int outX = x * 4;
+ dest[outX + y * width * 4] = tex2D<float>(tex, inX, y);
+ dest[outX + y * width * 4 + 1] = tex2D<float>(tex, inX + 1, y);
+ dest[outX + y * width * 4 + 2] = tex2D<float>(tex, inX + 2, y);
+ dest[outX + y * width * 4 + 3] = 255 * 255;
+}
+
+void __global__ ConvertData( void* d_InBuffer, NVRenderTextureFormats::Enum inFmt, int inSizeOfFormat, int inNoOfComponent, int inPitch,
+ void* d_OutBuffer, NVRenderTextureFormats::Enum outFmt, int outSizeOfFormat, int outNoOfComponent, int outPitch, int width, int height )
+{
+
+ int x = threadIdx.x + blockIdx.x * blockDim.x;
+ int y = threadIdx.y + blockIdx.y * blockDim.y;
+ if ( x >= width || y >= height )
+ return;
+ float values[4];
+
+ decodeToFloat( d_InBuffer, (inPitch * y) + (x * inSizeOfFormat), values, inFmt, inNoOfComponent );
+ encodeToPixel( values, d_OutBuffer, (outPitch * y) + (x * outSizeOfFormat), outFmt, outSizeOfFormat );
+}
+
+void __global__ CreateBsdfMipLevel( cudaTextureObject_t tex, void *d_curBuffer, void *d_prevBuffer, Q3DStudio::INT32 pitch, Q3DStudio::INT32 width, Q3DStudio::INT32 height,
+ nv::render::NVRenderTextureFormats::Enum inFormat, unsigned int sizeOfFormat )
+{
+ float accumVal[4];
+ //unsigned int sizeofFormat = getSizeofFormat(inFormat);
+ //__shared__ float dataBlock[ ]; //(32+4) * (32+4) * 12
+ int x = threadIdx.x + blockIdx.x * blockDim.x;
+ int y = threadIdx.y + blockIdx.y * blockDim.y;
+
+ if ( x >= (width > 2 ? width >> 1 : 1) || y >= (height > 2 ? height >> 1 : 1)) return;
+
+ accumVal[0] = 0; accumVal[1] = 0; accumVal[2] = 0; accumVal[3] = 0;
+
+ for ( int sy = -2; sy <= 2; ++sy )
+ {
+ for ( int sx = -2; sx <= 2; ++sx )
+ {
+ int sampleX = sx + (x << 1);
+ int sampleY = sy + (y << 1);
+ //getWrappedCoords(sampleX, sampleY, width, height);
+ // Cauchy filter (this is simply because it's the easiest to evaluate, and requires no complex
+ // functions).
+ float filterPdf = 1.f / ( 1.f + float(sx*sx + sy*sy)*2.f );
+ // With FP HDR formats, we're not worried about intensity loss so much as unnecessary energy gain,
+ // whereas with LDR formats, the fear with a continuous normalization factor is that we'd lose
+ // intensity and saturation as well.
+ filterPdf /= sizeOfFormat >= 8 ? 4.71238898f : 4.5403446f;
+ //filterPdf /= 4.5403446f; // Discrete normalization factor
+ //filterPdf /= 4.71238898f; // Continuous normalization factor
+ //float curPix[4];
+ sampleX = sampleX*4;
+ getWrappedCoords(sampleX, sampleY, width*4, height);
+ accumVal[0] += filterPdf * tex2D<float>(tex, sampleX, sampleY);
+ accumVal[1] += filterPdf * tex2D<float>(tex, sampleX + 1, sampleY);
+ accumVal[2] += filterPdf * tex2D<float>(tex, sampleX + 2, sampleY);
+ accumVal[3] += filterPdf * tex2D<float>(tex, sampleX + 3, sampleY);
+ }
+ }
+
+ encodeToPixel(accumVal, d_curBuffer, y * pitch + x * sizeOfFormat, inFormat, sizeOfFormat);
+}
+
+struct SMipTextureData
+{
+ void* data;
+ unsigned int dataSize;
+ unsigned int mipLevel;
+ unsigned int width;
+ unsigned int height;
+ NVRenderTextureFormats::Enum format;
+};
+
+__host__ void CUDABSDFMipMap::Build( void* inTextureData, int inTextureDataSize, NVRenderBackend::NVRenderBackendTextureObject inTextureHandle, NVRenderTextureFormats::Enum inFormat )
+{
+ m_TextureHandle = inTextureHandle;
+ m_InternalFormat = inFormat;
+ m_SizeOfInternalFormat = NVRenderTextureFormats::getSizeofFormat( m_InternalFormat );
+ m_InternalNoOfComponent = NVRenderTextureFormats::getNumberOfComponent( m_InternalFormat );
+
+ m_Texture2D.SetTextureData( NVDataRef<NVU8>( (NVU8*)inTextureData, inTextureDataSize )
+ , 0
+ , m_Width
+ , m_Height
+ , inFormat
+ , m_DestinationFormat );
+
+ size_t pitch;
+ float* d_inTextureData;
+
+ cudaMallocPitch(&d_inTextureData, &pitch, m_Width * m_SizeOfInternalFormat, m_Height); CHECK_AND_HANDLE_CUDA_ERROR();
+ CHECK_AND_HANDLE_CUDA_ERROR( cudaMemcpy2D( d_inTextureData, pitch, inTextureData, m_Width * m_SizeOfInternalFormat, m_Width * m_SizeOfInternalFormat, m_Height, cudaMemcpyHostToDevice ) );
+ {
+ dim3 blockDim(16, 16, 1);
+ dim3 gridDim(ceil(m_Width / 16.0f), ceil(m_Height / 16.0f) ,1 );
+
+ //std::cerr << "if= " << m_InternalFormat << " sizeOut= " << m_SizeOfInternalFormat << " numOfIntComp" << m_InternalNoOfComponent << " pitch= " << pitch << " destFormat= " << m_DestinationFormat << " sizeFormat= " << m_SizeOfFormat << " numOfComp= " << m_NoOfComponent << " Pitch0=" << m_Pitches[0] << std::endl;
+ //NVLogWarn("cuda", "%i %i %i %i %i %i %i %i\n",(int)m_InternalFormat ,m_SizeOfInternalFormat ,m_InternalNoOfComponent , pitch, (int)m_DestinationFormat, m_SizeOfFormat, m_NoOfComponent ,m_Pitches[0]);
+ ConvertData<<<gridDim, blockDim>>>( d_inTextureData, m_InternalFormat, m_SizeOfInternalFormat, m_InternalNoOfComponent, pitch,
+ md_MipMapsData[0], m_DestinationFormat, m_SizeOfFormat, m_NoOfComponent, m_Pitches[0], m_Width, m_Height );
+ }
+ cudaFree(d_inTextureData);
+
+ int curWidth = m_Width;
+ int curHeight = m_Height;
+
+ cudaTextureObject_t* tex;
+ tex = new cudaTextureObject_t[m_MaxMipMapLevel];
+ for ( int idx = 1; idx <= m_MaxMipMapLevel; ++idx )
+ {
+ tex[idx-1] = -1;
+ dim3 blockDim(16, 16, 1);
+ dim3 gridDim(ceil(curWidth / 32.0f), ceil(curHeight / 32.0f) ,1 );
+
+ cudaResourceDesc resDesc;
+ memset(&resDesc, 0, sizeof(resDesc));
+ resDesc.res.pitch2D.desc.f = cudaChannelFormatKindFloat;
+ resDesc.res.pitch2D.desc.x = m_SizeOfFormat / m_NoOfComponent * 8; // bits per channel
+ resDesc.resType = cudaResourceTypePitch2D;
+ resDesc.res.pitch2D.devPtr = (char*)(md_MipMapsData[idx-1]);
+ resDesc.res.pitch2D.height = curHeight;
+ resDesc.res.pitch2D.width = curWidth * m_NoOfComponent;
+ resDesc.res.pitch2D.pitchInBytes = m_Pitches[idx-1];// aligned to texturePitchAlignment
+
+ cudaTextureDesc texDesc;
+ memset(&texDesc, 0, sizeof(texDesc));
+ texDesc.addressMode[0] = cudaAddressModeWrap;
+ texDesc.addressMode[1] = cudaAddressModeWrap;
+ texDesc.readMode = cudaReadModeElementType;
+ //texDesc.normalizedCoords = 1;
+
+
+ CHECK_AND_HANDLE_CUDA_ERROR( cudaCreateTextureObject( &tex[idx-1], &resDesc, &texDesc, NULL ) );
+ CreateBsdfMipLevel<<<gridDim, blockDim>>>( tex[idx-1], (reinterpret_cast<NVU8 *>(md_MipMapsData[idx])), (reinterpret_cast<NVU8 *>(md_MipMapsData[idx-1])), m_Pitches[idx], curWidth, curHeight, m_DestinationFormat, m_SizeOfFormat );
+
+ curWidth = curWidth > 2 ? curWidth >> 1 : 1;
+ curHeight = curHeight > 2 ? curHeight >> 1 : 1;
+ }
+
+ CHECK_AND_HANDLE_CUDA_ERROR( cudaDeviceSynchronize(); )
+ BindTexture();
+ TransferTexture();
+ for (int idx = 0; idx < m_MaxMipMapLevel;++idx )
+ cudaDestroyTextureObject(tex[idx]);
+// CHECK_AND_HANDLE_CUDA_ERROR( cudaDeviceReset(); )
+ CHECK_AND_HANDLE_CUDA_ERROR( cudaDeviceSynchronize(); )
+
+ //NV_FREE( m_Foundation.getAllocator(), inTextureData );
+
+}
diff --git a/src/hdr/MipmapBSDF.h b/src/hdr/MipmapBSDF.h
new file mode 100644
index 0000000..be8f136
--- /dev/null
+++ b/src/hdr/MipmapBSDF.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MIPMAPBSDF_H
+#define MIPMAPBSDF_H
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/backends/gl/Qt3DSOpenGLUtil.h"
+
+#include "Qt3DSRenderLoadedTexture.h"
+
+#include "Qt3DSTypes.h"
+#ifdef _LINUXPLATFORM
+#define __declspec(dllexport)
+#define __cdecl
+
+#endif
+using namespace qt3ds::render;
+
+class BSDFMipMap : public NVRefCounted
+{
+public:
+ BSDFMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture, NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+ virtual ~BSDFMipMap();
+
+ virtual void Build(void *inTextureData, int inTextureDataSize,
+ NVRenderBackend::NVRenderBackendTextureObject inTextureHandle,
+ NVRenderTextureFormats::Enum inFormat) = 0;
+ static BSDFMipMap *Create(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture,
+ NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+
+protected:
+ volatile QT3DSI32 mRefCount; ///< reference count
+ NVFoundationBase &m_Foundation; ///< Foundation class for allocations and other base things
+
+ NVRenderTexture2D &m_Texture2D;
+ NVRenderTextureFormats::Enum m_InternalFormat;
+ NVRenderTextureFormats::Enum m_DestinationFormat;
+ int m_Width;
+ int m_Height;
+ int m_MaxMipMapLevel;
+ int m_SizeOfFormat;
+ int m_SizeOfInternalFormat;
+ int m_InternalNoOfComponent;
+ int m_NoOfComponent;
+ NVRenderContext *m_NVRenderContext;
+};
+
+class BasicBSDFMipMap : public BSDFMipMap
+{
+public:
+ BasicBSDFMipMap(NVRenderContext *inNVRenderContext, int inWidth, int inHeight,
+ NVRenderTexture2D &inTexture, NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+
+ void Build(void *inTextureData, int inTextureDataSize,
+ NVRenderBackend::NVRenderBackendTextureObject inTextureHandle,
+ NVRenderTextureFormats::Enum inFormat);
+
+ STextureData CreateBsdfMipLevel(STextureData &inCurMipLevel, STextureData &inPrevMipLevel,
+ int width, int height); //, IPerfTimer& inPerfTimer );
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation);
+
+ int wrapMod(int a, int base);
+ void getWrappedCoords(int &sX, int &sY, int width, int height);
+ NVRenderBackend::NVRenderBackendTextureObject m_TextureHandle;
+};
+
+#endif
diff --git a/src/importlib/Qt3DSImportContainers.h b/src/importlib/Qt3DSImportContainers.h
new file mode 100644
index 0000000..2f2a72e
--- /dev/null
+++ b/src/importlib/Qt3DSImportContainers.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_IMPORT_CONTAINERS_H
+#define QT3DS_IMPORT_CONTAINERS_H
+
+#include "EASTL/hash_map.h"
+#include "EASTL/hash_set.h"
+#include "EASTL/vector.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "Qt3DSDMWStrOps.h"
+
+namespace qt3dsimp {
+
+#define QT3DSIMP_FOREACH(idxnm, val) \
+ for (QT3DSU32 idxnm = 0, __numItems = (QT3DSU32)val; idxnm < __numItems; ++idxnm)
+
+template <typename TKey, typename TValue, typename THash = eastl::hash<TKey>,
+ typename TPredicate = eastl::equal_to<TKey>>
+struct ImportHashMap : public eastl::hash_map<TKey, TValue, THash, TPredicate>
+{
+ using base_type = eastl::hash_map<TKey, TValue, THash, TPredicate>;
+
+ ImportHashMap() {}
+
+
+
+ bool contains(const TKey &key) const { return find(key) != base_type::end(); }
+};
+template <typename TKey>
+struct ImportHashSet : public eastl::hash_set<TKey, eastl::hash<TKey>, eastl::equal_to<TKey>>
+{
+ using base_type = eastl::hash_set<TKey, eastl::hash<TKey>, eastl::equal_to<TKey>>;
+ ImportHashSet() {}
+ bool contains(const TKey &key) const { return base_type::find(key) != base_type::end(); }
+};
+template <typename TValue>
+struct ImportArray : public eastl::vector<TValue>
+{
+ using base_type = eastl::vector<TValue>;
+
+ ImportArray() {}
+ operator NVConstDataRef<TValue>() const
+ {
+ return NVConstDataRef<TValue>(base_type::data(), (QT3DSU32) base_type::size());
+ }
+
+ operator NVDataRef<TValue>() {
+ return NVDataRef<TValue>(base_type::data(), (QT3DSU32) base_type::size());
+ }
+};
+
+inline NVConstDataRef<wchar_t> toRef(const wchar_t *data, QT3DSU32 len = 0)
+{
+ if (IsTrivial(data))
+ return NVConstDataRef<wchar_t>(L"", 0);
+ len = len ? len : (QT3DSU32)wcslen(data);
+ return NVConstDataRef<wchar_t>(data, len);
+}
+}
+
+#endif
diff --git a/src/importlib/Qt3DSImportLibPrecompile.h b/src/importlib/Qt3DSImportLibPrecompile.h
new file mode 100644
index 0000000..34da79d
--- /dev/null
+++ b/src/importlib/Qt3DSImportLibPrecompile.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSOption.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include <map>
+#include <vector>
+#include <string>
+#include <exception>
+#include <set>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include "Qt3DSDMDataTypes.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSBasicTemplates.h"
+
+namespace qt3dsimp {
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace qt3ds::render;
+using namespace qt3dsdm;
+using namespace std;
+}
+
+// TODO: reference additional headers your program requires here
diff --git a/src/importlib/Qt3DSImportMesh.cpp b/src/importlib/Qt3DSImportMesh.cpp
new file mode 100644
index 0000000..1535b91
--- /dev/null
+++ b/src/importlib/Qt3DSImportMesh.cpp
@@ -0,0 +1,829 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifdef WIN32
+#pragma warning(disable : 4100)
+#endif
+#include "Qt3DSImportLibPrecompile.h"
+#include "Qt3DSImportMesh.h"
+
+using namespace qt3dsimp;
+
+#ifdef QT3DS_X86
+
+// Ensure our objects are of expected sizes. This keeps us honest
+// And ensures that we can load the datastructures we expect to by simply
+// mapping the memory.
+QT3DS_COMPILE_TIME_ASSERT(sizeof(NVRenderComponentTypes::Enum) == 4);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(NVRenderDrawMode::Enum) == 4);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(NVRenderVertexBufferEntry) == 20);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(VertexBuffer) == 20);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(IndexBuffer) == 12);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(MeshSubset) == 40);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(MeshDataHeader) == 12);
+QT3DS_COMPILE_TIME_ASSERT(sizeof(Mesh) == 56);
+
+#endif
+
+#define QT3DSIMP_FOREACH(idxnm, val) \
+ for (QT3DSU32 idxnm = 0, __numItems = (QT3DSU32)val; idxnm < __numItems; ++idxnm)
+
+namespace {
+
+struct MeshSubsetV1
+{
+ // See description of a logical vertex buffer below
+ QT3DSU32 m_LogicalVbufIndex;
+ // QT3DS_MAX_U32 means use all available items
+ QT3DSU32 m_Count;
+ // Offset is in item size, not bytes.
+ QT3DSU32 m_Offset;
+ // Bounds of this subset. This is filled in by the builder
+ // see AddMeshSubset
+ NVBounds3 m_Bounds;
+};
+
+struct LogicalVertexBuffer
+{
+ QT3DSU32 m_ByteOffset;
+ QT3DSU32 m_ByteSize;
+ LogicalVertexBuffer(QT3DSU32 byteOff, QT3DSU32 byteSize)
+ : m_ByteOffset(byteOff)
+ , m_ByteSize(byteSize)
+ {
+ }
+ LogicalVertexBuffer()
+ : m_ByteOffset(0)
+ , m_ByteSize(0)
+ {
+ }
+};
+
+struct MeshV1
+{
+ VertexBuffer m_VertexBuffer;
+ IndexBuffer m_IndexBuffer;
+ SOffsetDataRef<LogicalVertexBuffer> m_LogicalVertexBuffers; // may be empty
+ SOffsetDataRef<MeshSubsetV1> m_Subsets;
+ NVRenderDrawMode::Enum m_DrawMode;
+ NVRenderWinding::Enum m_Winding;
+ typedef MeshSubsetV1 TSubsetType;
+};
+
+template <typename TSerializer>
+void Serialize(TSerializer &serializer, MeshV1 &mesh)
+{
+ QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(&mesh);
+ serializer.streamify(mesh.m_VertexBuffer.m_Entries);
+ serializer.align();
+ QT3DSIMP_FOREACH(entry, mesh.m_VertexBuffer.m_Entries.size())
+ {
+ MeshVertexBufferEntry &entryData = const_cast<MeshVertexBufferEntry &>(
+ mesh.m_VertexBuffer.m_Entries.index(baseAddr, entry));
+ serializer.streamifyCharPointerOffset(entryData.m_NameOffset);
+ serializer.align();
+ }
+ serializer.streamify(mesh.m_VertexBuffer.m_Data);
+ serializer.align();
+ serializer.streamify(mesh.m_IndexBuffer.m_Data);
+ serializer.align();
+ serializer.streamify(mesh.m_LogicalVertexBuffers);
+ serializer.align();
+ serializer.streamify(mesh.m_Subsets);
+ serializer.align();
+}
+
+struct MeshSubsetV2
+{
+ QT3DSU32 m_LogicalVbufIndex;
+ QT3DSU32 m_Count;
+ QT3DSU32 m_Offset;
+ NVBounds3 m_Bounds;
+ SOffsetDataRef<char16_t> m_Name;
+};
+
+struct MeshV2
+{
+ static const char16_t *s_DefaultName;
+
+ VertexBuffer m_VertexBuffer;
+ IndexBuffer m_IndexBuffer;
+ SOffsetDataRef<LogicalVertexBuffer> m_LogicalVertexBuffers; // may be empty
+ SOffsetDataRef<MeshSubsetV2> m_Subsets;
+ NVRenderDrawMode::Enum m_DrawMode;
+ NVRenderWinding::Enum m_Winding;
+ typedef MeshSubsetV2 TSubsetType;
+};
+
+template <typename TSerializer>
+void Serialize(TSerializer &serializer, MeshV2 &mesh)
+{
+ QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(&mesh);
+ serializer.streamify(mesh.m_VertexBuffer.m_Entries);
+ serializer.align();
+ QT3DSIMP_FOREACH(entry, mesh.m_VertexBuffer.m_Entries.size())
+ {
+ MeshVertexBufferEntry &entryData = const_cast<MeshVertexBufferEntry &>(
+ mesh.m_VertexBuffer.m_Entries.index(baseAddr, entry));
+ serializer.streamifyCharPointerOffset(entryData.m_NameOffset);
+ serializer.align();
+ }
+ serializer.streamify(mesh.m_VertexBuffer.m_Data);
+ serializer.align();
+ serializer.streamify(mesh.m_IndexBuffer.m_Data);
+ serializer.align();
+ serializer.streamify(mesh.m_LogicalVertexBuffers);
+ serializer.align();
+ serializer.streamify(mesh.m_Subsets);
+ serializer.align();
+ QT3DSIMP_FOREACH(entry, mesh.m_Subsets.size())
+ {
+ MeshSubsetV2 &theSubset = const_cast<MeshSubsetV2 &>(mesh.m_Subsets.index(baseAddr, entry));
+ serializer.streamify(theSubset.m_Name);
+ serializer.align();
+ }
+}
+
+// Localize the knowledge required to read/write a mesh into one function
+// written in such a way that you can both read and write by passing
+// in one serializer type or another.
+// This function needs to be careful to request alignment after every write of a
+// buffer that may leave us unaligned. The easiest way to be correct is to request
+// alignment a lot. The hardest way is to use knowledge of the datatypes and
+// only request alignment when necessary.
+template <typename TSerializer>
+void Serialize(TSerializer &serializer, Mesh &mesh)
+{
+ QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(&mesh);
+ serializer.streamify(mesh.m_VertexBuffer.m_Entries);
+ serializer.align();
+ QT3DSIMP_FOREACH(entry, mesh.m_VertexBuffer.m_Entries.size())
+ {
+ MeshVertexBufferEntry &entryData = mesh.m_VertexBuffer.m_Entries.index(baseAddr, entry);
+ serializer.streamifyCharPointerOffset(entryData.m_NameOffset);
+ serializer.align();
+ }
+ serializer.streamify(mesh.m_VertexBuffer.m_Data);
+ serializer.align();
+ serializer.streamify(mesh.m_IndexBuffer.m_Data);
+ serializer.align();
+ serializer.streamify(mesh.m_Subsets);
+ serializer.align();
+ QT3DSIMP_FOREACH(entry, mesh.m_Subsets.size())
+ {
+ MeshSubset &theSubset = const_cast<MeshSubset &>(mesh.m_Subsets.index(baseAddr, entry));
+ serializer.streamify(theSubset.m_Name);
+ serializer.align();
+ }
+ serializer.streamify(mesh.m_Joints);
+ serializer.align();
+}
+
+struct TotallingSerializer
+{
+ QT3DSU32 m_NumBytes;
+ QT3DSU8 *m_BaseAddress;
+ TotallingSerializer(QT3DSU8 *inBaseAddr)
+ : m_NumBytes(0)
+ , m_BaseAddress(inBaseAddr)
+ {
+ }
+ template <typename TDataType>
+ void streamify(const SOffsetDataRef<TDataType> &data)
+ {
+ m_NumBytes += data.size() * sizeof(TDataType);
+ }
+ void streamify(const char *data)
+ {
+ if (data == NULL)
+ data = "";
+ QT3DSU32 len = (QT3DSU32)strlen(data) + 1;
+ m_NumBytes += 4;
+ m_NumBytes += len;
+ }
+ void streamifyCharPointerOffset(QT3DSU32 inOffset)
+ {
+ if (inOffset) {
+ const char *dataPtr = (const char *)(inOffset + m_BaseAddress);
+ streamify(dataPtr);
+ } else
+ streamify("");
+ }
+ bool needsAlignment() const { return getAlignmentAmount() > 0; }
+ QT3DSU32 getAlignmentAmount() const { return 4 - (m_NumBytes % 4); }
+ void align()
+ {
+ if (needsAlignment())
+ m_NumBytes += getAlignmentAmount();
+ }
+};
+
+struct ByteWritingSerializer
+{
+ IOutStream &m_Stream;
+ TotallingSerializer m_ByteCounter;
+ QT3DSU8 *m_BaseAddress;
+ ByteWritingSerializer(IOutStream &str, QT3DSU8 *inBaseAddress)
+ : m_Stream(str)
+ , m_ByteCounter(inBaseAddress)
+ , m_BaseAddress(inBaseAddress)
+ {
+ }
+
+ template <typename TDataType>
+ void streamify(const SOffsetDataRef<TDataType> &data)
+ {
+ m_ByteCounter.streamify(data);
+ m_Stream.Write(data.begin(m_BaseAddress), data.size());
+ }
+ void streamify(const char *data)
+ {
+ m_ByteCounter.streamify(data);
+ if (data == NULL)
+ data = "";
+ QT3DSU32 len = (QT3DSU32)strlen(data) + 1;
+ m_Stream.Write(len);
+ m_Stream.Write(data, len);
+ }
+ void streamifyCharPointerOffset(QT3DSU32 inOffset)
+ {
+ const char *dataPtr = (const char *)(inOffset + m_BaseAddress);
+ streamify(dataPtr);
+ }
+
+ void align()
+ {
+ if (m_ByteCounter.needsAlignment()) {
+ QT3DSU8 buffer[] = { 0, 0, 0, 0 };
+ m_Stream.Write(buffer, m_ByteCounter.getAlignmentAmount());
+ m_ByteCounter.align();
+ }
+ }
+};
+
+struct MemoryAssigningSerializer
+{
+ QT3DSU8 *m_Memory;
+ QT3DSU8 *m_BaseAddress;
+ QT3DSU32 m_Size;
+ TotallingSerializer m_ByteCounter;
+ bool m_Failure;
+ MemoryAssigningSerializer(QT3DSU8 *data, QT3DSU32 size, QT3DSU32 startOffset)
+ : m_Memory(data + startOffset)
+ , m_BaseAddress(data)
+ , m_Size(size)
+ , m_ByteCounter(data)
+ , m_Failure(false)
+ {
+ // We expect 4 byte aligned memory to begin with
+ QT3DS_ASSERT((((size_t)m_Memory) % 4) == 0);
+ }
+
+ template <typename TDataType>
+ void streamify(const SOffsetDataRef<TDataType> &_data)
+ {
+ SOffsetDataRef<TDataType> &data = const_cast<SOffsetDataRef<TDataType> &>(_data);
+ if (m_Failure) {
+ data.m_Size = 0;
+ data.m_Offset = 0;
+ return;
+ }
+ QT3DSU32 current = m_ByteCounter.m_NumBytes;
+ m_ByteCounter.streamify(_data);
+ if (m_ByteCounter.m_NumBytes > m_Size) {
+ data.m_Size = 0;
+ data.m_Offset = 0;
+ m_Failure = true;
+ return;
+ }
+ QT3DSU32 numBytes = m_ByteCounter.m_NumBytes - current;
+ if (numBytes) {
+ data.m_Offset = (QT3DSU32)(m_Memory - m_BaseAddress);
+ updateMemoryBuffer(numBytes);
+ } else {
+ data.m_Offset = 0;
+ data.m_Size = 0;
+ }
+ }
+ void streamify(const char *&_data)
+ {
+ QT3DSU32 len;
+ m_ByteCounter.m_NumBytes += 4;
+ if (m_ByteCounter.m_NumBytes > m_Size) {
+ _data = "";
+ m_Failure = true;
+ return;
+ }
+ qt3ds::intrinsics::memCopy(&len, m_Memory, 4);
+ updateMemoryBuffer(4);
+ m_ByteCounter.m_NumBytes += len;
+ if (m_ByteCounter.m_NumBytes > m_Size) {
+ _data = "";
+ m_Failure = true;
+ return;
+ }
+ _data = (const char *)m_Memory;
+ updateMemoryBuffer(len);
+ }
+ void streamifyCharPointerOffset(QT3DSU32 &inOffset)
+ {
+ const char *dataPtr;
+ streamify(dataPtr);
+ inOffset = (QT3DSU32)(dataPtr - (const char *)m_BaseAddress);
+ }
+ void align()
+ {
+ if (m_ByteCounter.needsAlignment()) {
+ QT3DSU32 numBytes = m_ByteCounter.getAlignmentAmount();
+ m_ByteCounter.align();
+ updateMemoryBuffer(numBytes);
+ }
+ }
+ void updateMemoryBuffer(QT3DSU32 numBytes) { m_Memory += numBytes; }
+};
+
+inline QT3DSU32 GetMeshDataSize(Mesh &mesh)
+{
+ TotallingSerializer s(reinterpret_cast<QT3DSU8 *>(&mesh));
+ Serialize(s, mesh);
+ return s.m_NumBytes;
+}
+
+template <typename TDataType>
+QT3DSU32 NextIndex(const QT3DSU8 *inBaseAddress, const SOffsetDataRef<QT3DSU8> data, QT3DSU32 idx)
+{
+ QT3DSU32 numItems = data.size() / sizeof(TDataType);
+ if (idx < numItems) {
+ const TDataType *dataPtr(reinterpret_cast<const TDataType *>(data.begin(inBaseAddress)));
+ return dataPtr[idx];
+ } else {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+}
+
+template <typename TDataType>
+QT3DSU32 NextIndex(NVConstDataRef<QT3DSU8> data, QT3DSU32 idx)
+{
+ QT3DSU32 numItems = data.size() / sizeof(TDataType);
+ if (idx < numItems) {
+ const TDataType *dataPtr(reinterpret_cast<const TDataType *>(data.begin()));
+ return dataPtr[idx];
+ } else {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+}
+
+inline QT3DSU32 NextIndex(NVConstDataRef<QT3DSU8> inData,
+ qt3ds::render::NVRenderComponentTypes::Enum inCompType, QT3DSU32 idx)
+{
+ if (inData.size() == 0)
+ return idx;
+ switch (inCompType) {
+ case NVRenderComponentTypes::QT3DSU8:
+ return NextIndex<QT3DSU8>(inData, idx);
+ case NVRenderComponentTypes::QT3DSI8:
+ return NextIndex<QT3DSI8>(inData, idx);
+ case NVRenderComponentTypes::QT3DSU16:
+ return NextIndex<QT3DSU16>(inData, idx);
+ case NVRenderComponentTypes::QT3DSI16:
+ return NextIndex<QT3DSI16>(inData, idx);
+ case NVRenderComponentTypes::QT3DSU32:
+ return NextIndex<QT3DSU32>(inData, idx);
+ case NVRenderComponentTypes::QT3DSI32:
+ return NextIndex<QT3DSI32>(inData, idx);
+ default:
+ break;
+ }
+
+ // Invalid index buffer index type.
+ QT3DS_ASSERT(false);
+ return 0;
+}
+
+template <typename TMeshType>
+// Not exposed to the outside world
+TMeshType *DoInitialize(MeshBufHeaderFlags /*meshFlags*/, NVDataRef<QT3DSU8> data)
+{
+ QT3DSU8 *newMem = data.begin();
+ QT3DSU32 amountLeft = data.size() - sizeof(TMeshType);
+ MemoryAssigningSerializer s(newMem, amountLeft, sizeof(TMeshType));
+ TMeshType *retval = (TMeshType *)newMem;
+ Serialize(s, *retval);
+ if (s.m_Failure)
+ return NULL;
+ return retval;
+}
+}
+
+NVBounds3 Mesh::CalculateSubsetBounds(const NVRenderVertexBufferEntry &inEntry,
+ NVConstDataRef<QT3DSU8> inVertxData, QT3DSU32 inStride,
+ NVConstDataRef<QT3DSU8> inIndexData,
+ qt3ds::render::NVRenderComponentTypes::Enum inIndexCompType,
+ QT3DSU32 inSubsetCount, QT3DSU32 inSubsetOffset)
+{
+ NVBounds3 retval(NVBounds3::empty());
+ const NVRenderVertexBufferEntry &entry(inEntry);
+ if (entry.m_ComponentType != NVRenderComponentTypes::QT3DSF32 || entry.m_NumComponents != 3) {
+ QT3DS_ASSERT(false);
+ return retval;
+ }
+
+ const QT3DSU8 *beginPtr = inVertxData.begin();
+ QT3DSU32 numBytes = inVertxData.size();
+ QT3DSU32 dataStride = inStride;
+ QT3DSU32 posOffset = entry.m_FirstItemOffset;
+ // The loop below could be template specialized *if* we wanted to do this.
+ // and the perf of the existing loop was determined to be a problem.
+ // Else I would rather stay way from the template specialization.
+ QT3DSIMP_FOREACH(idx, inSubsetCount)
+ {
+ QT3DSU32 dataIdx = NextIndex(inIndexData, inIndexCompType, idx + inSubsetOffset);
+ QT3DSU32 finalOffset = (dataIdx * dataStride) + posOffset;
+ if (finalOffset + sizeof(QT3DSVec3) <= numBytes) {
+ const QT3DSU8 *dataPtr = beginPtr + finalOffset;
+ retval.include(*reinterpret_cast<const QT3DSVec3 *>(dataPtr));
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ return retval;
+}
+
+void Mesh::Save(IOutStream &outStream) const
+{
+ Mesh &mesh(const_cast<Mesh &>(*this));
+ QT3DSU8 *baseAddress = reinterpret_cast<QT3DSU8 *>(&mesh);
+ QT3DSU32 numBytes = sizeof(Mesh) + GetMeshDataSize(mesh);
+ MeshDataHeader header(numBytes);
+ outStream.Write(header);
+ outStream.Write(*this);
+ ByteWritingSerializer writer(outStream, baseAddress);
+ Serialize(writer, mesh);
+}
+
+wchar_t g_DefaultName[] = { 0 };
+
+const wchar_t *Mesh::s_DefaultName = g_DefaultName;
+
+template <typename TMeshType>
+struct SubsetNameHandler
+{
+};
+
+template <>
+struct SubsetNameHandler<MeshV1>
+{
+ void AssignName(const QT3DSU8 * /*v1BaseAddress*/, const MeshSubsetV1 & /*mesh*/,
+ QT3DSU8 * /*baseAddress*/, QT3DSU8 *& /*nameBuffer*/, MeshSubset &outDest)
+ {
+ outDest.m_Name = SOffsetDataRef<char16_t>();
+ }
+ QT3DSU32 NameLength(const MeshSubsetV1 &) { return 0; }
+};
+
+using qt3ds::intrinsics::memCopy;
+
+template <>
+struct SubsetNameHandler<MeshV2>
+{
+ void AssignName(const QT3DSU8 *v2BaseAddress, const MeshSubsetV2 &mesh, QT3DSU8 *baseAddress,
+ QT3DSU8 *&nameBuffer, MeshSubset &outDest)
+ {
+ outDest.m_Name.m_Size = mesh.m_Name.m_Size;
+ outDest.m_Name.m_Offset = (QT3DSU32)(nameBuffer - baseAddress);
+ QT3DSU32 dtypeSize = mesh.m_Name.m_Size * 2;
+ memCopy(nameBuffer, mesh.m_Name.begin(v2BaseAddress), dtypeSize);
+ nameBuffer += dtypeSize;
+ }
+ QT3DSU32 NameLength(const MeshSubsetV2 &mesh) { return (mesh.m_Name.size() + 1) * 2; }
+};
+
+QT3DSU32 GetAlignedOffset(QT3DSU32 offset, QT3DSU32 align)
+{
+ QT3DSU32 leftover = offset % align;
+ if (leftover)
+ return offset + (align - leftover);
+ return offset;
+}
+
+template <typename TPreviousMeshType>
+Mesh *CreateMeshFromPreviousMesh(TPreviousMeshType *temp, NVAllocatorCallback &alloc)
+{
+ QT3DSU32 newMeshSize = sizeof(Mesh);
+ QT3DSU8 *tempBaseAddress = reinterpret_cast<QT3DSU8 *>(temp);
+ QT3DSU32 alignment = sizeof(void *);
+
+ QT3DSU32 vertBufferSize = GetAlignedOffset(temp->m_VertexBuffer.m_Data.size(), alignment);
+ newMeshSize += vertBufferSize;
+ QT3DSU32 entryDataSize = temp->m_VertexBuffer.m_Entries.size() * sizeof(MeshVertexBufferEntry);
+ newMeshSize += entryDataSize;
+ QT3DSU32 indexBufferSize = GetAlignedOffset(temp->m_IndexBuffer.m_Data.size(), alignment);
+ newMeshSize += indexBufferSize;
+ QT3DSU32 entryNameSize = 0;
+ for (QT3DSU32 entryIdx = 0, entryEnd = temp->m_VertexBuffer.m_Entries.size(); entryIdx < entryEnd;
+ ++entryIdx) {
+ const qt3ds::render::NVRenderVertexBufferEntry theEntry =
+ temp->m_VertexBuffer.m_Entries.index(tempBaseAddress, entryIdx)
+ .ToVertexBufferEntry(tempBaseAddress);
+ const char *namePtr = theEntry.m_Name;
+ if (namePtr == NULL)
+ namePtr = "";
+
+ entryNameSize += (QT3DSU32)strlen(theEntry.m_Name) + 1;
+ }
+ entryNameSize = GetAlignedOffset(entryNameSize, alignment);
+
+ newMeshSize += entryNameSize;
+ QT3DSU32 subsetBufferSize = temp->m_Subsets.size() * sizeof(MeshSubset);
+ newMeshSize += subsetBufferSize;
+ QT3DSU32 nameLength = 0;
+ for (QT3DSU32 subsetIdx = 0, subsetEnd = temp->m_Subsets.size(); subsetIdx < subsetEnd;
+ ++subsetIdx) {
+ nameLength += SubsetNameHandler<TPreviousMeshType>().NameLength(
+ temp->m_Subsets.index(tempBaseAddress, subsetIdx));
+ }
+ nameLength = GetAlignedOffset(nameLength, alignment);
+
+ newMeshSize += nameLength;
+
+ Mesh *retval = (Mesh *)alloc.allocate(newMeshSize, "TempData", __FILE__, __LINE__);
+ new (retval) Mesh();
+ QT3DSU8 *baseOffset = reinterpret_cast<QT3DSU8 *>(retval);
+ QT3DSU8 *vertBufferData = baseOffset + sizeof(Mesh);
+ QT3DSU8 *entryBufferData = vertBufferData + vertBufferSize;
+ QT3DSU8 *entryNameBuffer = entryBufferData + entryDataSize;
+ QT3DSU8 *indexBufferData = entryNameBuffer + entryNameSize;
+ QT3DSU8 *subsetBufferData = indexBufferData + indexBufferSize;
+ QT3DSU8 *nameData = subsetBufferData + subsetBufferSize;
+
+ retval->m_DrawMode = temp->m_DrawMode;
+ retval->m_Winding = temp->m_Winding;
+ retval->m_VertexBuffer = temp->m_VertexBuffer;
+ retval->m_VertexBuffer.m_Data.m_Offset = (QT3DSU32)(vertBufferData - baseOffset);
+ retval->m_VertexBuffer.m_Entries.m_Offset = (QT3DSU32)(entryBufferData - baseOffset);
+ memCopy(vertBufferData, temp->m_VertexBuffer.m_Data.begin(tempBaseAddress),
+ temp->m_VertexBuffer.m_Data.size());
+ memCopy(entryBufferData, temp->m_VertexBuffer.m_Entries.begin(tempBaseAddress), entryDataSize);
+ QT3DSIMP_FOREACH(idx, temp->m_VertexBuffer.m_Entries.size())
+ {
+ const MeshVertexBufferEntry &src =
+ temp->m_VertexBuffer.m_Entries.index(tempBaseAddress, idx);
+ MeshVertexBufferEntry &dest = retval->m_VertexBuffer.m_Entries.index(baseOffset, idx);
+
+ const char *targetName = reinterpret_cast<const char *>(src.m_NameOffset + tempBaseAddress);
+ if (src.m_NameOffset == 0)
+ targetName = "";
+ QT3DSU32 nameLen = (QT3DSU32)strlen(targetName) + 1;
+ dest.m_NameOffset = (QT3DSU32)(entryNameBuffer - baseOffset);
+ memCopy(entryNameBuffer, targetName, nameLen);
+ entryNameBuffer += nameLen;
+ }
+
+ retval->m_IndexBuffer = temp->m_IndexBuffer;
+ retval->m_IndexBuffer.m_Data.m_Offset = (QT3DSU32)(indexBufferData - baseOffset);
+ memCopy(indexBufferData, temp->m_IndexBuffer.m_Data.begin(tempBaseAddress),
+ temp->m_IndexBuffer.m_Data.size());
+
+ retval->m_Subsets.m_Size = temp->m_Subsets.m_Size;
+ retval->m_Subsets.m_Offset = (QT3DSU32)(subsetBufferData - baseOffset);
+ QT3DSIMP_FOREACH(idx, temp->m_Subsets.size())
+ {
+ MeshSubset &dest = const_cast<MeshSubset &>(retval->m_Subsets.index(baseOffset, idx));
+ const typename TPreviousMeshType::TSubsetType &src =
+ temp->m_Subsets.index(tempBaseAddress, idx);
+ dest.m_Count = src.m_Count;
+ dest.m_Offset = src.m_Offset;
+ dest.m_Bounds = src.m_Bounds;
+ SubsetNameHandler<TPreviousMeshType>().AssignName(tempBaseAddress, src, baseOffset,
+ nameData, dest);
+ }
+ alloc.deallocate(temp);
+ return retval;
+}
+
+Mesh *Mesh::Load(NVAllocatorCallback &alloc, IInStream &inStream)
+{
+ MeshDataHeader header;
+ inStream.Read(header);
+ QT3DS_ASSERT(header.m_FileId == MeshDataHeader::GetFileId());
+ if (header.m_FileId != MeshDataHeader::GetFileId())
+ return NULL;
+ if (header.m_FileVersion < 1 || header.m_FileVersion > MeshDataHeader::GetCurrentFileVersion())
+ return NULL;
+ if (header.m_SizeInBytes < sizeof(Mesh))
+ return NULL;
+ QT3DSU8 *newMem = (QT3DSU8 *)alloc.allocate(header.m_SizeInBytes, "Mesh", __FILE__, __LINE__);
+ QT3DSU32 amountRead = inStream.Read(NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes));
+ if (amountRead != header.m_SizeInBytes)
+ goto failure;
+
+ if (header.m_FileVersion == 1) {
+ MeshV1 *temp = DoInitialize<MeshV1>(header.m_HeaderFlags,
+ NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes));
+ if (temp == NULL)
+ goto failure;
+ return CreateMeshFromPreviousMesh(temp, alloc);
+
+ } else if (header.m_FileVersion == 2) {
+ MeshV2 *temp = DoInitialize<MeshV2>(header.m_HeaderFlags,
+ NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes));
+ if (temp == NULL)
+ goto failure;
+ return CreateMeshFromPreviousMesh(temp, alloc);
+ } else {
+ Mesh *retval = Initialize(header.m_FileVersion, header.m_HeaderFlags,
+ NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes));
+ if (retval == NULL)
+ goto failure;
+ return retval;
+ }
+
+failure:
+ QT3DS_ASSERT(false);
+ alloc.deallocate(newMem);
+ return NULL;
+}
+
+Mesh *Mesh::Initialize(QT3DSU16 meshVersion, MeshBufHeaderFlags meshFlags, NVDataRef<QT3DSU8> data)
+{
+ if (meshVersion != MeshDataHeader::GetCurrentFileVersion())
+ return NULL;
+ return DoInitialize<Mesh>(meshFlags, data);
+}
+
+// Multimesh support where you have multiple meshes in a single file.
+// Save multi where you have overridden the allocator.
+QT3DSU32 Mesh::SaveMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream, QT3DSU32 inId) const
+{
+ QT3DSU32 nextId = 1;
+ MeshMultiHeader tempHeader;
+ MeshMultiHeader *theHeader = NULL;
+ MeshMultiHeader *theWriteHeader = NULL;
+
+ QT3DSI64 newMeshStartPos = 0;
+ if (inStream.GetLength() != 0) {
+ theHeader = LoadMultiHeader(alloc, inStream);
+ if (theHeader == NULL) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ QT3DSU8 *headerBaseAddr = reinterpret_cast<QT3DSU8 *>(theHeader);
+ for (QT3DSU32 idx = 0, end = theHeader->m_Entries.size(); idx < end; ++idx) {
+ if (inId != 0) {
+ QT3DS_ASSERT(inId != theHeader->m_Entries.index(headerBaseAddr, idx).m_MeshId);
+ }
+ nextId = qMax(nextId, theHeader->m_Entries.index(headerBaseAddr, idx).m_MeshId + 1);
+ }
+ newMeshStartPos =
+ sizeof(MeshMultiHeader) + theHeader->m_Entries.size() * sizeof(MeshMultiEntry);
+ theWriteHeader = theHeader;
+ } else
+ theWriteHeader = &tempHeader;
+
+ inStream.SetPosition(-newMeshStartPos, SeekPosition::End);
+ QT3DSI64 meshOffset = inStream.GetPosition();
+
+ Save(inStream);
+
+ if (inId != 0)
+ nextId = inId;
+ QT3DSU8 *theWriteBaseAddr = reinterpret_cast<QT3DSU8 *>(theWriteHeader);
+ // Now write a new header out.
+ inStream.Write(theWriteHeader->m_Entries.begin(theWriteBaseAddr),
+ theWriteHeader->m_Entries.size());
+ MeshMultiEntry newEntry(static_cast<QT3DSI64>(meshOffset), nextId);
+ inStream.Write(newEntry);
+ theWriteHeader->m_Entries.m_Size++;
+ inStream.Write(*theWriteHeader);
+
+ if (theHeader != NULL) {
+ alloc.deallocate(theHeader);
+ }
+ return static_cast<QT3DSU32>(nextId);
+}
+
+// Load a single mesh directly from a multi file with the provided overridden items
+SMultiLoadResult Mesh::LoadMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream,
+ QT3DSU32 inId)
+{
+ MeshMultiHeader *theHeader(LoadMultiHeader(alloc, inStream));
+ if (theHeader == NULL) {
+ return SMultiLoadResult();
+ }
+ QT3DSU64 fileOffset = (QT3DSU64)-1;
+ QT3DSU32 theId = inId;
+ QT3DSU8 *theHeaderBaseAddr = reinterpret_cast<QT3DSU8 *>(theHeader);
+ bool foundMesh = false;
+ for (QT3DSU32 idx = 0, end = theHeader->m_Entries.size(); idx < end && !foundMesh; ++idx) {
+ const MeshMultiEntry &theEntry(theHeader->m_Entries.index(theHeaderBaseAddr, idx));
+ if (theEntry.m_MeshId == inId || (inId == 0 && theEntry.m_MeshId > theId)) {
+ if (theEntry.m_MeshId == inId)
+ foundMesh = true;
+ theId = qMax(theId, (QT3DSU32)theEntry.m_MeshId);
+ fileOffset = theEntry.m_MeshOffset;
+ }
+ }
+ Mesh *retval = NULL;
+ if (fileOffset == (QT3DSU64)-1) {
+ goto endFunction;
+ }
+
+ inStream.SetPosition(static_cast<QT3DSI64>(fileOffset), SeekPosition::Begin);
+ retval = Load(alloc, inStream);
+endFunction:
+ if (theHeader != NULL)
+ alloc.deallocate(theHeader);
+ return SMultiLoadResult(retval, theId);
+}
+
+// Returns true if this is a multimesh (several meshes in one file).
+bool Mesh::IsMulti(ISeekableIOStream &inStream)
+{
+ MeshMultiHeader theHeader;
+ inStream.SetPosition(-((QT3DSI64)(sizeof(MeshMultiHeader))), SeekPosition::End);
+ QT3DSU32 numBytes = inStream.Read(theHeader);
+ if (numBytes != sizeof(MeshMultiHeader))
+ return false;
+ return theHeader.m_Version == MeshMultiHeader::GetMultiStaticFileId();
+}
+// Load a multi header from a stream.
+MeshMultiHeader *Mesh::LoadMultiHeader(NVAllocatorCallback &alloc, ISeekableIOStream &inStream)
+{
+ MeshMultiHeader theHeader;
+ inStream.SetPosition(-((QT3DSI64)sizeof(MeshMultiHeader)), SeekPosition::End);
+ QT3DSU32 numBytes = inStream.Read(theHeader);
+ if (numBytes != sizeof(MeshMultiHeader)
+ || theHeader.m_FileId != MeshMultiHeader::GetMultiStaticFileId()
+ || theHeader.m_Version > MeshMultiHeader::GetMultiStaticVersion()) {
+ return NULL;
+ }
+ size_t allocSize =
+ sizeof(MeshMultiHeader) + theHeader.m_Entries.m_Size * sizeof(MeshMultiEntry);
+ MeshMultiHeader *retval =
+ (MeshMultiHeader *)alloc.allocate(allocSize, "MeshMultiHeader", __FILE__, __LINE__);
+ if (retval == NULL) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(retval);
+ QT3DSU8 *entryData = baseAddr + sizeof(MeshMultiHeader);
+ *retval = theHeader;
+ retval->m_Entries.m_Offset = (QT3DSU32)(entryData - baseAddr);
+ inStream.SetPosition(-((QT3DSI64)allocSize), SeekPosition::End);
+
+ numBytes =
+ inStream.Read(reinterpret_cast<MeshMultiEntry *>(entryData), retval->m_Entries.m_Size);
+ if (numBytes != retval->m_Entries.m_Size * sizeof(MeshMultiEntry)) {
+ QT3DS_ASSERT(false);
+ alloc.deallocate(retval);
+ retval = NULL;
+ }
+ return retval;
+}
+
+QT3DSU32 GetHighestId(NVAllocatorCallback &inAlloc, MeshMultiHeader *inHeader)
+{
+ if (inHeader == NULL) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ QT3DSU8 *baseHeaderAddr = reinterpret_cast<QT3DSU8 *>(inHeader);
+ QT3DSU32 highestId = 0;
+ for (QT3DSU32 idx = 0, end = inHeader->m_Entries.size(); idx < end; ++idx)
+ highestId = qMax(highestId, inHeader->m_Entries.index(baseHeaderAddr, idx).m_MeshId);
+ inAlloc.deallocate(inHeader);
+ return highestId;
+}
+
+QT3DSU32 Mesh::GetHighestMultiVersion(NVAllocatorCallback &alloc, ISeekableIOStream &inStream)
+{
+ return GetHighestId(alloc, LoadMultiHeader(alloc, inStream));
+}
diff --git a/src/importlib/Qt3DSImportMesh.h b/src/importlib/Qt3DSImportMesh.h
new file mode 100644
index 0000000..36b7a84
--- /dev/null
+++ b/src/importlib/Qt3DSImportMesh.h
@@ -0,0 +1,530 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_IMPORT_MESH_H
+#define QT3DS_IMPORT_MESH_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/IOStreams.h"
+
+namespace qt3dsimp {
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace qt3ds::render;
+template <typename TDataType>
+struct SOffsetDataRef
+{
+ QT3DSU32 m_Offset;
+ QT3DSU32 m_Size;
+ SOffsetDataRef()
+ : m_Offset(0)
+ , m_Size(0)
+ {
+ }
+ TDataType *begin(QT3DSU8 *inBase) { return reinterpret_cast<TDataType *>(inBase + m_Offset); }
+ TDataType *end(QT3DSU8 *inBase) { return begin(inBase) + m_Size; }
+ const TDataType *begin(const QT3DSU8 *inBase) const
+ {
+ return reinterpret_cast<const TDataType *>(inBase + m_Offset);
+ }
+ const TDataType *end(const QT3DSU8 *inBase) const { return begin(inBase) + m_Size; }
+ QT3DSU32 size() const { return m_Size; }
+ bool empty() const { return m_Size == 0; }
+ TDataType &index(QT3DSU8 *inBase, QT3DSU32 idx)
+ {
+ QT3DS_ASSERT(idx < m_Size);
+ return begin(inBase)[idx];
+ }
+ const TDataType &index(const QT3DSU8 *inBase, QT3DSU32 idx) const
+ {
+ QT3DS_ASSERT(idx < m_Size);
+ return begin(inBase)[idx];
+ }
+};
+
+struct MeshVertexBufferEntry
+{
+ QT3DSU32 m_NameOffset;
+ /** Datatype of the this entry points to in the buffer */
+ NVRenderComponentTypes::Enum m_ComponentType;
+ /** Number of components of each data member. 1,2,3, or 4. Don't be stupid.*/
+ QT3DSU32 m_NumComponents;
+ /** Offset from the beginning of the buffer of the first item */
+ QT3DSU32 m_FirstItemOffset;
+ MeshVertexBufferEntry()
+ : m_NameOffset(0)
+ , m_ComponentType(NVRenderComponentTypes::QT3DSF32)
+ , m_NumComponents(3)
+ , m_FirstItemOffset(0)
+ {
+ }
+ NVRenderVertexBufferEntry ToVertexBufferEntry(QT3DSU8 *inBaseAddress)
+ {
+ const char *nameBuffer = "";
+ if (m_NameOffset)
+ nameBuffer = reinterpret_cast<const char *>(inBaseAddress + m_NameOffset);
+ return NVRenderVertexBufferEntry(nameBuffer, m_ComponentType, m_NumComponents,
+ m_FirstItemOffset);
+ }
+};
+
+struct VertexBuffer
+{
+ SOffsetDataRef<MeshVertexBufferEntry> m_Entries;
+ QT3DSU32 m_Stride;
+ SOffsetDataRef<QT3DSU8> m_Data;
+ VertexBuffer(SOffsetDataRef<MeshVertexBufferEntry> entries, QT3DSU32 stride,
+ SOffsetDataRef<QT3DSU8> data)
+ : m_Entries(entries)
+ , m_Stride(stride)
+ , m_Data(data)
+ {
+ }
+ VertexBuffer()
+ : m_Stride(0)
+ {
+ }
+};
+
+struct IndexBuffer
+{
+ // Component types must be either QT3DSU16 or QT3DSU8 in order for the
+ // graphics hardware to deal with the buffer correctly.
+ NVRenderComponentTypes::Enum m_ComponentType;
+ SOffsetDataRef<QT3DSU8> m_Data;
+ // Either QT3DSU8 or QT3DSU16 component types are allowed by the underlying rendering
+ // system, so you would be wise to stick with those.
+ IndexBuffer(NVRenderComponentTypes::Enum compType, SOffsetDataRef<QT3DSU8> data)
+ : m_ComponentType(compType)
+ , m_Data(data)
+ {
+ }
+ IndexBuffer()
+ : m_ComponentType(NVRenderComponentTypes::Unknown)
+ {
+ }
+};
+
+template <QT3DSU32 TNumBytes>
+struct MeshPadding
+{
+ QT3DSU8 m_Padding[TNumBytes];
+ MeshPadding() { memZero(m_Padding, TNumBytes); }
+};
+
+struct MeshSubset
+{
+ // QT3DS_MAX_U32 means use all available items
+ QT3DSU32 m_Count;
+ // Offset is in item size, not bytes.
+ QT3DSU32 m_Offset;
+ // Bounds of this subset. This is filled in by the builder
+ // see AddMeshSubset
+ NVBounds3 m_Bounds;
+
+ // Subsets have to be named else artists will be unable to use
+ // a mesh with multiple subsets as they won't have any idea
+ // while part of the model a given mesh actually maps to.
+ SOffsetDataRef<char16_t> m_Name;
+
+ MeshSubset(QT3DSU32 count, QT3DSU32 off, const NVBounds3 &bounds, SOffsetDataRef<char16_t> inName)
+ : m_Count(count)
+ , m_Offset(off)
+ , m_Bounds(bounds)
+ , m_Name(inName)
+ {
+ }
+ MeshSubset()
+ : m_Count((QT3DSU32)-1)
+ , m_Offset(0)
+ , m_Bounds(NVBounds3::empty())
+ {
+ }
+ bool HasCount() const { return m_Count != QT3DS_MAX_U32; }
+};
+
+// Placeholder for bitflags in the mesh header.
+struct MeshBufHeaderFlagValues
+{
+ enum Enum {};
+};
+
+struct MeshBufHeaderFlags : NVFlags<MeshBufHeaderFlagValues::Enum, QT3DSU16>
+{
+ MeshBufHeaderFlags() {}
+ MeshBufHeaderFlags(QT3DSU16 value)
+ : NVFlags<MeshBufHeaderFlagValues::Enum, QT3DSU16>(value)
+ {
+ }
+ // Binary or creates an integer.
+ MeshBufHeaderFlags(int value)
+ : NVFlags<MeshBufHeaderFlagValues::Enum, QT3DSU16>((QT3DSU16)value)
+ {
+ }
+};
+
+struct MeshDataHeader
+{
+ static QT3DSU32 GetFileId() { return (QT3DSU32)-929005747; }
+ static QT3DSU16 GetCurrentFileVersion() { return 3; }
+ QT3DSU32 m_FileId;
+ QT3DSU16 m_FileVersion;
+ MeshBufHeaderFlags m_HeaderFlags;
+ QT3DSU32 m_SizeInBytes;
+ MeshDataHeader(QT3DSU32 size = 0)
+ : m_FileId(GetFileId())
+ , m_FileVersion(GetCurrentFileVersion())
+ , m_SizeInBytes(size)
+ {
+ }
+};
+
+struct Joint
+{
+ QT3DSI32 m_JointID;
+ QT3DSI32 m_ParentID;
+ QT3DSF32 m_invBindPose[16];
+ QT3DSF32 m_localToGlobalBoneSpace[16];
+
+ Joint(QT3DSI32 jointID, QT3DSI32 parentID, const QT3DSF32 *invBindPose,
+ const QT3DSF32 *localToGlobalBoneSpace)
+ : m_JointID(jointID)
+ , m_ParentID(parentID)
+ {
+ ::memcpy(m_invBindPose, invBindPose, sizeof(float) * 16);
+ ::memcpy(m_localToGlobalBoneSpace, localToGlobalBoneSpace, sizeof(float) * 16);
+ }
+ Joint()
+ : m_JointID(-1)
+ , m_ParentID(-1)
+ {
+ ::memset(m_invBindPose, 0, sizeof(float) * 16);
+ ::memset(m_localToGlobalBoneSpace, 0, sizeof(float) * 16);
+ }
+};
+
+// Tells us what offset a mesh with this ID starts.
+struct MeshMultiEntry
+{
+ QT3DSU64 m_MeshOffset;
+ QT3DSU32 m_MeshId;
+ QT3DSU32 m_Padding;
+ MeshMultiEntry()
+ : m_MeshOffset(0)
+ , m_MeshId(0)
+ , m_Padding(0)
+ {
+ }
+ MeshMultiEntry(QT3DSU64 mo, QT3DSU32 meshId)
+ : m_MeshOffset(mo)
+ , m_MeshId(meshId)
+ , m_Padding(0)
+ {
+ }
+};
+
+// The multi headers are actually saved at the end of the file.
+// Thus when you append to the file we overwrite the last header
+// then write out a new header structure.
+// The last 8 bytes of the file contain the multi header.
+// The previous N*8 bytes contain the mesh entries.
+struct MeshMultiHeader
+{
+ QT3DSU32 m_FileId;
+ QT3DSU32 m_Version;
+ SOffsetDataRef<MeshMultiEntry> m_Entries;
+ static QT3DSU32 GetMultiStaticFileId() { return (QT3DSU32)555777497; }
+ static QT3DSU32 GetMultiStaticVersion() { return 1; }
+
+ MeshMultiHeader()
+ : m_FileId(GetMultiStaticFileId())
+ , m_Version(GetMultiStaticVersion())
+ {
+ }
+};
+
+struct Mesh;
+
+// Result of a multi-load operation. This returns both the mesh
+// and the id of the mesh that was loaded.
+struct SMultiLoadResult
+{
+ Mesh *m_Mesh;
+ QT3DSU32 m_Id;
+ SMultiLoadResult(Mesh *inMesh, QT3DSU32 inId)
+ : m_Mesh(inMesh)
+ , m_Id(inId)
+ {
+ }
+ SMultiLoadResult()
+ : m_Mesh(NULL)
+ , m_Id(0)
+ {
+ }
+ operator Mesh *() { return m_Mesh; }
+};
+
+/**
+* A Mesh defines one vertex buffer layout, one or more logical vertex buffers
+* one index buffer, and a set of defined draw calls (subsets).
+*
+* The vertex buffer data is held together continguously and the layout cannot
+* change. There can be several actual vertex buffers on the card, however, in order
+* to facilitate using index buffer components of smaller component sizes than there
+* are actual vertex buffer data entries. For instance, you may have a very large vertex
+* buffer, larger than 64 K but openglES has a restriction on the size of the index buffer
+*component
+* that it cannot be larger than two bytes per entry. So you would need to split the vertex
+*buffer
+* into multiple logical vertex buffers and adjust your indexes such that you indexed into
+* only one logical vertex buffer per draw call.
+*
+* No logical vertex buffers means that the vertex buffer index on a mesh subset will be
+*ignored.
+*/
+struct Mesh
+{
+ static const wchar_t *s_DefaultName;
+
+ VertexBuffer m_VertexBuffer;
+ IndexBuffer m_IndexBuffer;
+ SOffsetDataRef<MeshSubset> m_Subsets;
+ SOffsetDataRef<Joint> m_Joints;
+ NVRenderDrawMode::Enum m_DrawMode;
+ NVRenderWinding::Enum m_Winding;
+
+ Mesh()
+ : m_DrawMode(NVRenderDrawMode::Triangles)
+ , m_Winding(NVRenderWinding::CounterClockwise)
+ {
+ }
+ Mesh(VertexBuffer vbuf, IndexBuffer ibuf, const SOffsetDataRef<MeshSubset> &insts,
+ const SOffsetDataRef<Joint> &joints,
+ NVRenderDrawMode::Enum drawMode = NVRenderDrawMode::Triangles,
+ NVRenderWinding::Enum winding = NVRenderWinding::CounterClockwise)
+ : m_VertexBuffer(vbuf)
+ , m_IndexBuffer(ibuf)
+ , m_Subsets(insts)
+ , m_Joints(joints)
+ , m_DrawMode(drawMode)
+ , m_Winding(winding)
+ {
+ }
+
+ QT3DSU8 *GetBaseAddress() { return reinterpret_cast<QT3DSU8 *>(this); }
+ const QT3DSU8 *GetBaseAddress() const { return reinterpret_cast<const QT3DSU8 *>(this); }
+
+ static const char *GetPositionAttrName() { return "attr_pos"; }
+ static const char *GetNormalAttrName() { return "attr_norm"; }
+ static const char *GetUVAttrName() { return "attr_uv0"; }
+ static const char *GetUV2AttrName() { return "attr_uv1"; }
+ static const char *GetTexTanAttrName() { return "attr_textan"; }
+ static const char *GetTexBinormalAttrName() { return "attr_binormal"; }
+ static const char *GetWeightAttrName() { return "attr_weight"; }
+ static const char *GetBoneIndexAttrName() { return "attr_boneid"; }
+ static const char *GetColorAttrName() { return "attr_color"; }
+
+ // Run through the vertex buffer items indicated by subset
+ // Assume vbuf entry[posEntryIndex] is the position entry
+ // This entry has to be QT3DSF32 and 3 components.
+ // Using this entry and the (possibly empty) index buffer
+ // along with the (possibly emtpy) logical vbuf data
+ // return a bounds of the given vertex buffer.
+ static NVBounds3 CalculateSubsetBounds(const NVRenderVertexBufferEntry &inEntry,
+ NVConstDataRef<QT3DSU8> inVertxData, QT3DSU32 inStride,
+ NVConstDataRef<QT3DSU8> inIndexData,
+ qt3ds::render::NVRenderComponentTypes::Enum inIndexCompType,
+ QT3DSU32 inSubsetCount, QT3DSU32 inSubsetOffset);
+
+ // Format is:
+ // MeshDataHeader
+ // mesh data.
+ void Save(IOutStream &outStream) const;
+
+ // Save a mesh using fopen and fwrite
+ bool Save(const char *inFilePath) const;
+
+ // read the header, then read the object.
+ // Object data is written in LE format for now.
+ // Free the new mesh by calling:
+ // alloc.deallocate( mesh );
+ // All the memory is allocated once and then pointers are back
+ // filled, so this will work.
+ static Mesh *Load(NVAllocatorCallback &alloc, IInStream &inStream);
+
+ // Load a mesh using fopen and fread
+ // Mesh needs to be freed by the caller using free
+ static Mesh *Load(const char *inFilePath);
+
+ // Create a mesh given this header, and that data. data.size() must match
+ // header.SizeInBytes. The mesh returned starts a data[0], so however data
+ // was allocated is how the mesh should be deallocated.
+ static Mesh *Initialize(QT3DSU16 meshVersion, MeshBufHeaderFlags meshFlags, NVDataRef<QT3DSU8> data);
+
+ // Multimesh support where you have multiple meshes in a single file.
+ // Save multi where you have overridden the allocator.
+ QT3DSU32 SaveMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream, QT3DSU32 inId = 0) const;
+ // You can save multiple meshes in a file. Each mesh returns an incrementing
+ // integer for the multi file. The original meshes aren't changed, and the file
+ // is appended to.
+ QT3DSU32 SaveMulti(const char *inFilePath) const;
+
+ // Load a single mesh directly from a multi file with the provided overridden items
+ // Loading a multimesh with id == 0 indicates to just load the mesh with the highest id.
+ static SMultiLoadResult LoadMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream,
+ QT3DSU32 inId = 0);
+ // Load a single mesh using c file API and malloc/free.
+ static SMultiLoadResult LoadMulti(const char *inFilePath, QT3DSU32 inId);
+ // Returns true if this is a multimesh (several meshes in one file).
+ static bool IsMulti(ISeekableIOStream &inStream);
+ // Load a multi header from a stream.
+ static MeshMultiHeader *LoadMultiHeader(NVAllocatorCallback &alloc,
+ ISeekableIOStream &inStream);
+ // Load a multi header from a file using malloc. Header needs to be freed using free.
+ static MeshMultiHeader *LoadMultiHeader(const char *inFilePath);
+
+ // Get the highest mesh version from a stream.
+ static QT3DSU32 GetHighestMultiVersion(NVAllocatorCallback &alloc, ISeekableIOStream &inStream);
+ // Get the highest mesh version from a file.
+ static QT3DSU32 GetHighestMultiVersion(const char *inFilePath);
+};
+
+struct ScopedMesh
+{
+ Mesh *m_Mesh;
+ NVAllocatorCallback *m_Callback;
+ ScopedMesh(Mesh *m, NVAllocatorCallback *cback = NULL)
+ : m_Mesh(m)
+ , m_Callback(cback)
+ {
+ }
+ ~ScopedMesh()
+ {
+ if (m_Mesh) {
+ if (m_Callback)
+ m_Callback->deallocate(m_Mesh);
+ else
+ free(m_Mesh);
+ }
+ }
+ Mesh *operator->() { return m_Mesh; }
+ operator Mesh *() { return m_Mesh; }
+};
+
+struct MeshBuilderVBufEntry
+{
+ const char *m_Name;
+ NVConstDataRef<QT3DSU8> m_Data;
+ NVRenderComponentTypes::Enum m_ComponentType;
+ QT3DSU32 m_NumComponents;
+ MeshBuilderVBufEntry()
+ : m_Name(NULL)
+ , m_ComponentType(NVRenderComponentTypes::Unknown)
+ , m_NumComponents(0)
+ {
+ }
+ MeshBuilderVBufEntry(const char *name, NVConstDataRef<QT3DSU8> data,
+ NVRenderComponentTypes::Enum componentType, QT3DSU32 numComponents)
+ : m_Name(name)
+ , m_Data(data)
+ , m_ComponentType(componentType)
+ , m_NumComponents(numComponents)
+ {
+ }
+};
+
+// Useful class to build up a mesh. Necessary since meshes don't include that
+// sort of utility.
+class MeshBuilder
+{
+protected:
+ virtual ~MeshBuilder() {}
+public:
+ virtual void Release() = 0;
+ virtual void Reset() = 0;
+ // Set the draw parameters for any subsets. Defaults to triangles and counter clockwise
+ virtual void SetDrawParameters(NVRenderDrawMode::Enum drawMode,
+ NVRenderWinding::Enum winding) = 0;
+ // Set the vertex buffer and have the mesh builder interleave the data for you
+ virtual bool SetVertexBuffer(NVConstDataRef<MeshBuilderVBufEntry> entries) = 0;
+ // Set the vertex buffer from interleaved data.
+ virtual void SetVertexBuffer(NVConstDataRef<NVRenderVertexBufferEntry> entries, QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> data) = 0;
+ // The builder (and the majority of the rest of the product) only supports unsigned 16 bit
+ // indexes
+ virtual void SetIndexBuffer(NVConstDataRef<QT3DSU8> data, NVRenderComponentTypes::Enum comp) = 0;
+ // Assets if the supplied parameters are out of range.
+ virtual void AddJoint(QT3DSI32 jointID, QT3DSI32 parentID, const QT3DSF32 *invBindPose,
+ const QT3DSF32 *localToGlobalBoneSpace) = 0;
+ /**
+ * Add a subset, which equates roughly to a draw call.
+ * A logical vertex buffer allows you to have more that 64K vertexes but still
+ * use u16 index buffers. In any case, if the mesh has an index buffer then this subset
+ * refers to that index buffer, else it is assumed to index into the vertex buffer.
+ * count and offset do exactly what they seem to do, while boundsPositionEntryIndex, if set to
+ * something other than QT3DS_MAX_U32, drives the calculation of the aa-bounds of the subset
+ * using mesh::CalculateSubsetBounds
+ */
+ virtual void AddMeshSubset(const wchar_t *inSubsetName = Mesh::s_DefaultName,
+ QT3DSU32 count = QT3DS_MAX_U32, QT3DSU32 offset = 0,
+ QT3DSU32 boundsPositionEntryIndex = QT3DS_MAX_U32) = 0;
+
+ virtual void AddMeshSubset(const wchar_t *inSubsetName, QT3DSU32 count, QT3DSU32 offset,
+ const NVBounds3 &inBounds) = 0;
+
+ // Call to optimize the index and vertex buffers. This doesn't change the subset information,
+ // each triangle is rendered precisely the same.
+ // It just orders the vertex data so we iterate through it as linearly as possible.
+ // This *only* works if the *entire* builder is using triangles as the draw mode. This will be
+ // a disaster if that
+ // condition is not met.
+ virtual void OptimizeMesh() = 0;
+
+ /**
+ * @brief This functions stitches together sub-meshes with the same material.
+ * This re-writes the index buffer
+ *
+ * @return no return.
+ */
+ virtual void ConnectSubMeshes() = 0;
+
+ // Return the current mesh. This is only good for this function call, item may change or be
+ // released
+ // due to any further function calls.
+ virtual Mesh &GetMesh() = 0;
+
+ // Uses new/delete.
+ static MeshBuilder &CreateMeshBuilder();
+};
+}
+
+#endif
diff --git a/src/importlib/Qt3DSImportMeshBuilder.cpp b/src/importlib/Qt3DSImportMeshBuilder.cpp
new file mode 100644
index 0000000..e8c6d92
--- /dev/null
+++ b/src/importlib/Qt3DSImportMeshBuilder.cpp
@@ -0,0 +1,598 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSImportLibPrecompile.h"
+#include "Qt3DSImportMesh.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "Qt3DSImportContainers.h"
+
+using namespace qt3dsimp;
+
+// Disable mesh optimization. TODO: After removing NvTriStrip need
+// to implement mesh optimization.
+//#define DISABLE_MESH_OPTIMIZATION 1
+
+// It turns out we can't enable vertex remapping because it would break
+// mesh morphing.
+#define DISABLE_VERTEX_REMAP 1
+
+namespace {
+template <typename TDataType>
+NVConstDataRef<TDataType> toRefBuf(QT3DSU8 *bufData, QT3DSU32 off, QT3DSU32 size)
+{
+ QT3DS_ASSERT(size % sizeof(TDataType) == 0);
+ if (size)
+ return NVConstDataRef<TDataType>((TDataType *)(bufData + off), size / sizeof(TDataType));
+ return NVConstDataRef<TDataType>();
+}
+struct DynamicVBuf
+{
+ QT3DSU32 m_Stride;
+ ImportArray<NVRenderVertexBufferEntry> m_VertexBufferEntries;
+ MemoryBuffer<RawAllocator> m_VertexData;
+
+ void clear()
+ {
+ m_Stride = 0;
+ m_VertexBufferEntries.clear();
+ m_VertexData.clear();
+ }
+};
+struct DynamicIndexBuf
+{
+ NVRenderComponentTypes::Enum m_CompType;
+ MemoryBuffer<RawAllocator> m_IndexData;
+ DynamicIndexBuf() {}
+
+ void clear() { m_IndexData.clear(); }
+};
+
+struct SubsetDesc
+{
+ QT3DSU32 m_Count;
+ QT3DSU32 m_Offset;
+
+ NVBounds3 m_Bounds;
+ QString m_Name;
+ SubsetDesc(QT3DSU32 c, QT3DSU32 off)
+ : m_Count(c)
+ , m_Offset(off)
+ {
+ }
+ SubsetDesc()
+ : m_Count(0)
+ , m_Offset(0)
+ {
+ }
+};
+
+QT3DSU32 GetAlignedOffset(QT3DSU32 offset, QT3DSU32 align)
+{
+ QT3DSU32 leftover = offset % align;
+ if (leftover)
+ return offset + (align - leftover);
+ return offset;
+}
+
+class MeshBuilderImpl : public MeshBuilder
+{
+ DynamicVBuf m_VertexBuffer;
+ DynamicIndexBuf m_IndexBuffer;
+ ImportArray<Joint> m_Joints;
+ ImportArray<SubsetDesc> m_MeshSubsetDescs;
+ NVRenderDrawMode::Enum m_DrawMode;
+ NVRenderWinding::Enum m_Winding;
+ MemoryBuffer<RawAllocator> m_RemappedVertexData;
+ MemoryBuffer<RawAllocator> m_NewIndexBuffer;
+ ImportArray<QT3DSU8> m_MeshBuffer;
+
+public:
+ MeshBuilderImpl() { Reset(); }
+ virtual ~MeshBuilderImpl() { Reset(); }
+ void Release() override { delete this; }
+ void Reset() override
+ {
+ m_VertexBuffer.clear();
+ m_IndexBuffer.clear();
+ m_Joints.clear();
+ m_MeshSubsetDescs.clear();
+ m_DrawMode = NVRenderDrawMode::Triangles;
+ m_Winding = NVRenderWinding::CounterClockwise;
+ m_MeshBuffer.clear();
+ }
+
+ void SetDrawParameters(NVRenderDrawMode::Enum drawMode, NVRenderWinding::Enum winding) override
+ {
+ m_DrawMode = drawMode;
+ m_Winding = winding;
+ }
+
+ // Somewhat burly method to interleave the data as tightly as possible
+ // while taking alignment into account.
+ bool SetVertexBuffer(NVConstDataRef<MeshBuilderVBufEntry> entries) override
+ {
+ QT3DSU32 currentOffset = 0;
+ QT3DSU32 bufferAlignment = 0;
+ QT3DSU32 numItems = 0;
+ bool retval = true;
+ QT3DSIMP_FOREACH(idx, entries.size())
+ {
+ const MeshBuilderVBufEntry &entry(entries[idx]);
+ // Ignore entries with no data.
+ if (entry.m_Data.begin() == NULL || entry.m_Data.size() == 0)
+ continue;
+
+ QT3DSU32 alignment = NVRenderComponentTypes::getSizeofType(entry.m_ComponentType);
+ bufferAlignment = qMax(bufferAlignment, alignment);
+ QT3DSU32 byteSize = alignment * entry.m_NumComponents;
+
+ if (entry.m_Data.size() % alignment != 0) {
+ QT3DS_ASSERT(false);
+ retval = false;
+ }
+
+ QT3DSU32 localNumItems = entry.m_Data.size() / byteSize;
+ if (numItems == 0) {
+ numItems = localNumItems;
+ } else if (numItems != localNumItems) {
+ QT3DS_ASSERT(false);
+ retval = false;
+ numItems = qMin(numItems, localNumItems);
+ }
+ // Lots of platforms can't handle non-aligned data.
+ // so ensure we are aligned.
+ currentOffset = GetAlignedOffset(currentOffset, alignment);
+ NVRenderVertexBufferEntry vbufEntry(entry.m_Name, entry.m_ComponentType,
+ entry.m_NumComponents, currentOffset);
+ m_VertexBuffer.m_VertexBufferEntries.push_back(vbufEntry);
+ currentOffset += byteSize;
+ }
+ m_VertexBuffer.m_Stride = GetAlignedOffset(currentOffset, bufferAlignment);
+
+ // Packed interleave the data
+ QT3DSIMP_FOREACH(idx, numItems)
+ {
+ QT3DSU32 dataOffset = 0;
+ QT3DSIMP_FOREACH(entryIdx, entries.size())
+ {
+ const MeshBuilderVBufEntry &entry(entries[entryIdx]);
+ // Ignore entries with no data.
+ if (entry.m_Data.begin() == NULL || entry.m_Data.size() == 0)
+ continue;
+
+ QT3DSU32 alignment = NVRenderComponentTypes::getSizeofType(entry.m_ComponentType);
+ QT3DSU32 byteSize = alignment * entry.m_NumComponents;
+ QT3DSU32 offset = byteSize * idx;
+ QT3DSU32 newOffset = GetAlignedOffset(dataOffset, alignment);
+ if (newOffset != dataOffset)
+ m_VertexBuffer.m_VertexData.writeZeros(newOffset - dataOffset);
+ m_VertexBuffer.m_VertexData.write(entry.m_Data.begin() + offset, byteSize);
+ dataOffset = newOffset + byteSize;
+ }
+ QT3DS_ASSERT(dataOffset == m_VertexBuffer.m_Stride);
+ }
+ return retval;
+ }
+
+ void SetVertexBuffer(NVConstDataRef<NVRenderVertexBufferEntry> entries, QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> data) override
+ {
+ QT3DSIMP_FOREACH(idx, (QT3DSU32)entries.size())
+ {
+ m_VertexBuffer.m_VertexBufferEntries.push_back(entries[idx]);
+ }
+ m_VertexBuffer.m_VertexData.write(data.begin(), data.size());
+ if (stride == 0) {
+ // Calculate the stride of the buffer using the vbuf entries
+ QT3DSIMP_FOREACH(idx, entries.size())
+ {
+ const NVRenderVertexBufferEntry &entry(entries[idx]);
+ stride = qMax(stride, entry.m_FirstItemOffset
+ + (entry.m_NumComponents * NVRenderComponentTypes::getSizeofType(
+ entry.m_ComponentType)));
+ }
+ }
+ m_VertexBuffer.m_Stride = stride;
+ }
+
+ void SetIndexBuffer(NVConstDataRef<QT3DSU8> data, NVRenderComponentTypes::Enum comp) override
+ {
+ m_IndexBuffer.m_CompType = comp;
+ m_IndexBuffer.m_IndexData.write(data.begin(), data.size());
+ }
+
+ void AddJoint(QT3DSI32 jointID, QT3DSI32 parentID, const QT3DSF32 *invBindPose,
+ const QT3DSF32 *localToGlobalBoneSpace) override
+ {
+ m_Joints.push_back(Joint(jointID, parentID, invBindPose, localToGlobalBoneSpace));
+ }
+
+ SubsetDesc CreateSubset(const wchar_t *inName, QT3DSU32 count, QT3DSU32 offset)
+ {
+ if (inName == NULL)
+ inName = L"";
+ SubsetDesc retval(count, offset);
+ retval.m_Name = QString::fromWCharArray(inName);
+ return retval;
+ }
+
+ // indexBuffer QT3DS_MAX_U32 means no index buffer.
+ // count of QT3DS_MAX_U32 means use all available items
+ // offset means exactly what you would think. Offset is in item size, not bytes.
+ void AddMeshSubset(const wchar_t *inName, QT3DSU32 count, QT3DSU32 offset,
+ QT3DSU32 boundsPositionEntryIndex) override
+ {
+ SubsetDesc retval = CreateSubset(inName, count, offset);
+ if (boundsPositionEntryIndex != QT3DS_MAX_U32) {
+ retval.m_Bounds = Mesh::CalculateSubsetBounds(
+ m_VertexBuffer.m_VertexBufferEntries[boundsPositionEntryIndex],
+ m_VertexBuffer.m_VertexData, m_VertexBuffer.m_Stride, m_IndexBuffer.m_IndexData,
+ m_IndexBuffer.m_CompType, count, offset);
+ }
+ m_MeshSubsetDescs.push_back(retval);
+ }
+
+ void AddMeshSubset(const wchar_t *inName, QT3DSU32 count, QT3DSU32 offset,
+ const NVBounds3 &inBounds) override
+ {
+ SubsetDesc retval = CreateSubset(inName, count, offset);
+ retval.m_Bounds = inBounds;
+ m_MeshSubsetDescs.push_back(retval);
+ }
+#ifndef DISABLE_MESH_OPTIMIZATION
+ void DeletePrimitiveGroup(PrimitiveGroup *&inGroup)
+ {
+ if (inGroup)
+ delete[] inGroup;
+ inGroup = NULL;
+ }
+#endif
+ // We connect sub meshes which habe the same material
+ void ConnectSubMeshes() override
+ {
+ if (m_MeshSubsetDescs.size() < 2) {
+ // nothing to do
+ return;
+ }
+
+ QT3DSU32 matDuplicates = 0;
+
+ // as a pre-step we check if we have duplicate material at all
+ for (QT3DSU32 i = 0, subsetEnd = m_MeshSubsetDescs.size(); i < subsetEnd && !matDuplicates;
+ ++i) {
+ SubsetDesc &currentSubset = m_MeshSubsetDescs[i];
+
+ for (QT3DSU32 j = 0, subsetEnd = m_MeshSubsetDescs.size(); j < subsetEnd; ++j) {
+ SubsetDesc &theSubset = m_MeshSubsetDescs[j];
+
+ if (i == j)
+ continue;
+
+ if (currentSubset.m_Name == theSubset.m_Name) {
+ matDuplicates++;
+ break; // found a duplicate bail out
+ }
+ }
+ }
+
+ // did we find some duplicates?
+ if (matDuplicates) {
+ ImportArray<SubsetDesc> newMeshSubsetDescs;
+ ImportArray<SubsetDesc>::iterator theIter;
+ QString curMatName;
+ m_NewIndexBuffer.clear();
+
+ for (theIter = m_MeshSubsetDescs.begin(); theIter != m_MeshSubsetDescs.end();
+ ++theIter) {
+ bool bProcessed = false;
+
+ for (ImportArray<SubsetDesc>::iterator iter = newMeshSubsetDescs.begin();
+ iter != newMeshSubsetDescs.end(); ++iter) {
+ if (theIter->m_Name == iter->m_Name) {
+ bProcessed = true;
+ break;
+ }
+ }
+
+ if (bProcessed)
+ continue;
+
+ curMatName = theIter->m_Name;
+
+ QT3DSU32 theIndexCompSize =
+ NVRenderComponentTypes::getSizeofType(m_IndexBuffer.m_CompType);
+ // get pointer to indices
+ QT3DSU8 *theIndices =
+ (m_IndexBuffer.m_IndexData.begin()) + (theIter->m_Offset * theIndexCompSize);
+ // write new offset
+ theIter->m_Offset = m_NewIndexBuffer.size() / theIndexCompSize;
+ // store indices
+ m_NewIndexBuffer.write(theIndices, theIter->m_Count * theIndexCompSize);
+
+ for (QT3DSU32 j = 0, subsetEnd = m_MeshSubsetDescs.size(); j < subsetEnd; ++j) {
+ if (theIter == &m_MeshSubsetDescs[j])
+ continue;
+
+ SubsetDesc &theSubset = m_MeshSubsetDescs[j];
+
+ if (curMatName == theSubset.m_Name) {
+ // get pointer to indices
+ QT3DSU8 *theIndices = (m_IndexBuffer.m_IndexData.begin())
+ + (theSubset.m_Offset * theIndexCompSize);
+ // store indices
+ m_NewIndexBuffer.write(theIndices, theSubset.m_Count * theIndexCompSize);
+ // increment indices count
+ theIter->m_Count += theSubset.m_Count;
+ }
+ }
+
+ newMeshSubsetDescs.push_back(*theIter);
+ }
+
+ m_MeshSubsetDescs.clear();
+ m_MeshSubsetDescs = newMeshSubsetDescs;
+ m_IndexBuffer.m_IndexData.clear();
+ m_IndexBuffer.m_IndexData.write(m_NewIndexBuffer.begin(), m_NewIndexBuffer.size());
+
+ // compute new bounding box
+ for (theIter = m_MeshSubsetDescs.begin(); theIter != m_MeshSubsetDescs.end();
+ ++theIter) {
+ theIter->m_Bounds = Mesh::CalculateSubsetBounds(
+ m_VertexBuffer.m_VertexBufferEntries[0], m_VertexBuffer.m_VertexData,
+ m_VertexBuffer.m_Stride, m_IndexBuffer.m_IndexData, m_IndexBuffer.m_CompType,
+ theIter->m_Count, theIter->m_Offset);
+ }
+ }
+ }
+
+ // Here is the NVTriStrip magic.
+ void OptimizeMesh() override
+ {
+ if (NVRenderComponentTypes::getSizeofType(m_IndexBuffer.m_CompType) != 2) {
+ // we currently re-arrange unsigned int indices.
+ // this is because NvTriStrip only supports short indices
+ QT3DS_ASSERT(NVRenderComponentTypes::getSizeofType(m_IndexBuffer.m_CompType) == 4);
+ return;
+ }
+#ifndef DISABLE_MESH_OPTIMIZATION
+ SetCacheSize(CACHESIZE_GEFORCE3);
+ SetStitchStrips(true);
+ SetMinStripSize(0);
+ // Create the optimized list indices
+ SetListsOnly(true);
+ // Optimize the indices using NvTriStrip
+
+ // First, nv-tri-strip all of the indexes. They shouldn't be interleaved, meaning
+ // there is an assumption here that mesh subset1 doesn't uses indexes from mesh subset 2.
+ // They may share vertexes, however, which means that we need to be careful when remapping
+ // them.
+ // Have to go subset by subset in order for the tri-strip to avoid stepping on subsets.
+ m_NewIndexBuffer.clear();
+ for (QT3DSU32 subsetIdx = 0, subsetEnd = m_MeshSubsetDescs.size(); subsetIdx < subsetEnd;
+ ++subsetIdx) {
+ SubsetDesc &theSubset = m_MeshSubsetDescs[subsetIdx];
+ QT3DSU16 *theIndices =
+ reinterpret_cast<QT3DSU16 *>(m_IndexBuffer.m_IndexData.begin()) + theSubset.m_Offset;
+ QT3DSU32 theIndexCount = theSubset.m_Count;
+ QT3DSU16 theNumGroups = 0;
+ PrimitiveGroup *thePrimitiveGroupsList = NULL;
+ theSubset.m_Offset = m_NewIndexBuffer.size() / sizeof(QT3DSU16);
+ theSubset.m_Count = 0;
+
+ // We don't support larger vertex buffers. That requires splitting the buffer,
+ // an operation we haven't implemented (yet).
+ if (GenerateStrips(theIndices, theIndexCount, &thePrimitiveGroupsList, &theNumGroups)) {
+ if (theNumGroups) {
+ QT3DS_ASSERT(theNumGroups == 1);
+ PrimitiveGroup &srcGroup(thePrimitiveGroupsList[0]);
+ QT3DS_ASSERT(srcGroup.type == PT_LIST);
+ m_NewIndexBuffer.write(srcGroup.indices, srcGroup.numIndices);
+ theSubset.m_Count = srcGroup.numIndices;
+ }
+ }
+
+ DeletePrimitiveGroup(thePrimitiveGroupsList);
+ }
+ m_IndexBuffer.m_IndexData.clear();
+ m_IndexBuffer.m_IndexData.write(m_NewIndexBuffer.begin(), m_NewIndexBuffer.size());
+
+#ifndef DISABLE_VERTEX_REMAP
+ // This operation does not go subset by subset
+ // by rather remaps the entire vertex buffer in one shot
+ // once all of the index buffers are setup.
+ QT3DSU16 *theIndices = reinterpret_cast<QT3DSU16 *>(m_IndexBuffer.m_IndexData.begin());
+ QT3DSU32 theIndexCount = m_IndexBuffer.m_IndexData.size() / sizeof(QT3DSU16);
+
+ // Setup input to the remap system
+ QT3DSU16 theNumGroups = 1;
+ PrimitiveGroup thePrimitiveGroup;
+ thePrimitiveGroup.type = PT_LIST;
+ thePrimitiveGroup.numIndices = theIndexCount;
+ thePrimitiveGroup.indices = new QT3DSU16[theIndexCount];
+ memCopy(thePrimitiveGroup.indices, theIndices, theIndexCount * sizeof(QT3DSU16));
+
+ PrimitiveGroup *theRemappedGroup = NULL;
+ QT3DSU32 vertBufByteSize = m_VertexBuffer.m_VertexData.size();
+ QT3DSU32 numVertexIndices = vertBufByteSize / m_VertexBuffer.m_Stride;
+ QT3DS_ASSERT(numVertexIndices < QT3DS_MAX_U16);
+ QT3DSU32 vertBufStride = m_VertexBuffer.m_Stride;
+ // This remaps the vertexes
+ RemapIndices(&thePrimitiveGroup, theNumGroups, static_cast<QT3DSU16>(numVertexIndices),
+ &theRemappedGroup);
+ m_RemappedVertexData.reserve(vertBufByteSize);
+ const QT3DSU8 *srcVertexPtr(m_VertexBuffer.m_VertexData.begin());
+ QT3DSU8 *dstVertexPtr(m_RemappedVertexData.begin());
+ QT3DS_ASSERT(theNumGroups == 1);
+ for (QT3DSU32 theGroupIdx = 0; theGroupIdx < 1; ++theGroupIdx) {
+ PrimitiveGroup &srcGroup(thePrimitiveGroup);
+ PrimitiveGroup &dstGroup(theRemappedGroup[theGroupIdx]);
+ QT3DS_ASSERT(srcGroup.type == PT_LIST);
+
+ for (QT3DSU32 theIndexIdx = 0; theIndexIdx < srcGroup.numIndices; ++theIndexIdx) {
+ QT3DSU16 srcIndex = srcGroup.indices[theIndexIdx];
+ QT3DSU16 dstIndex = dstGroup.indices[theIndexIdx];
+ QT3DS_ASSERT(dstIndex * m_VertexBuffer.m_Stride < vertBufByteSize);
+ QT3DS_ASSERT(srcIndex * m_VertexBuffer.m_Stride < vertBufByteSize);
+ // Maybe add in a check to see if we possibly already copied this information
+ // That would of course be only an optimization.
+ memCopy(dstVertexPtr + dstIndex * vertBufStride,
+ srcVertexPtr + srcIndex * vertBufStride, vertBufStride);
+ theIndices[theIndexIdx] = dstIndex;
+ }
+ memCopy(m_VertexBuffer.m_VertexData.begin(), m_RemappedVertexData.begin(),
+ vertBufByteSize);
+ }
+
+ DeletePrimitiveGroup(theRemappedGroup);
+#endif // DISABLE_VERTEX_REMAP
+#endif // DISABLE_MESH_OPTIMIZATION
+ }
+
+ template <typename TDataType>
+ static void Assign(QT3DSU8 *inBaseAddress, QT3DSU8 *inDataAddress,
+ SOffsetDataRef<TDataType> &inBuffer, const TDataType *inDestData,
+ QT3DSU32 inDestSize)
+ {
+ inBuffer.m_Offset = (QT3DSU32)(inDataAddress - inBaseAddress);
+ inBuffer.m_Size = inDestSize;
+ memCopy(inDataAddress, inDestData, inDestSize * sizeof(TDataType));
+ }
+ template <typename TDataType>
+ static void Assign(QT3DSU8 *inBaseAddress, QT3DSU8 *inDataAddress,
+ SOffsetDataRef<TDataType> &inBuffer, QT3DSU32 inDestSize)
+ {
+ inBuffer.m_Offset = (QT3DSU32)(inDataAddress - inBaseAddress);
+ inBuffer.m_Size = inDestSize;
+ }
+ // Return the current mesh. This is only good for this function call, item may change or be
+ // released
+ // due to any further function calls.
+ Mesh &GetMesh() override
+ {
+ QT3DSU32 meshSize = sizeof(Mesh);
+ QT3DSU32 alignment = sizeof(void *);
+ QT3DSU32 vertDataSize = GetAlignedOffset(m_VertexBuffer.m_VertexData.size(), alignment);
+ meshSize += vertDataSize;
+ QT3DSU32 entrySize = m_VertexBuffer.m_VertexBufferEntries.size()
+ * sizeof(qt3ds::render::NVRenderVertexBufferEntry);
+ meshSize += entrySize;
+ QT3DSU32 entryNameSize = 0;
+ for (QT3DSU32 idx = 0, end = m_VertexBuffer.m_VertexBufferEntries.size(); idx < end; ++idx) {
+ const qt3ds::render::NVRenderVertexBufferEntry &theEntry(
+ m_VertexBuffer.m_VertexBufferEntries[idx]);
+ const char *entryName = theEntry.m_Name;
+ if (entryName == NULL)
+ entryName = "";
+ entryNameSize += (QT3DSU32)(strlen(theEntry.m_Name)) + 1;
+ }
+ entryNameSize = GetAlignedOffset(entryNameSize, alignment);
+ meshSize += entryNameSize;
+ QT3DSU32 indexBufferSize = GetAlignedOffset(m_IndexBuffer.m_IndexData.size(), alignment);
+ meshSize += indexBufferSize;
+ QT3DSU32 subsetSize = m_MeshSubsetDescs.size() * sizeof(MeshSubset);
+ QT3DSU32 nameSize = 0;
+ for (QT3DSU32 idx = 0, end = m_MeshSubsetDescs.size(); idx < end; ++idx) {
+ if (!m_MeshSubsetDescs[idx].m_Name.isEmpty())
+ nameSize += m_MeshSubsetDescs[idx].m_Name.size() + 1;
+ }
+ nameSize *= sizeof(char16_t);
+ nameSize = GetAlignedOffset(nameSize, alignment);
+
+ meshSize += subsetSize + nameSize;
+ QT3DSU32 jointsSize = m_Joints.size() * sizeof(qt3dsimp::Joint);
+ meshSize += jointsSize;
+ m_MeshBuffer.resize(meshSize);
+ QT3DSU8 *baseAddress = m_MeshBuffer.data();
+ Mesh *retval = reinterpret_cast<Mesh *>(baseAddress);
+ retval->m_DrawMode = m_DrawMode;
+ retval->m_Winding = m_Winding;
+ QT3DSU8 *vertBufferData = baseAddress + sizeof(Mesh);
+ QT3DSU8 *vertEntryData = vertBufferData + vertDataSize;
+ QT3DSU8 *vertEntryNameData = vertEntryData + entrySize;
+ QT3DSU8 *indexBufferData = vertEntryNameData + entryNameSize;
+ QT3DSU8 *subsetBufferData = indexBufferData + indexBufferSize;
+ QT3DSU8 *nameBufferData = subsetBufferData + subsetSize;
+ QT3DSU8 *jointBufferData = nameBufferData + nameSize;
+
+ retval->m_VertexBuffer.m_Stride = m_VertexBuffer.m_Stride;
+ Assign(baseAddress, vertBufferData, retval->m_VertexBuffer.m_Data,
+ m_VertexBuffer.m_VertexData.begin(), m_VertexBuffer.m_VertexData.size());
+ retval->m_VertexBuffer.m_Entries.m_Size = m_VertexBuffer.m_VertexBufferEntries.size();
+ retval->m_VertexBuffer.m_Entries.m_Offset = (QT3DSU32)(vertEntryData - baseAddress);
+ for (QT3DSU32 idx = 0, end = m_VertexBuffer.m_VertexBufferEntries.size(); idx < end; ++idx) {
+ const qt3ds::render::NVRenderVertexBufferEntry &theEntry(
+ m_VertexBuffer.m_VertexBufferEntries[idx]);
+ MeshVertexBufferEntry &theDestEntry(
+ retval->m_VertexBuffer.m_Entries.index(baseAddress, idx));
+ theDestEntry.m_ComponentType = theEntry.m_ComponentType;
+ theDestEntry.m_FirstItemOffset = theEntry.m_FirstItemOffset;
+ theDestEntry.m_NumComponents = theEntry.m_NumComponents;
+ const char *targetName = theEntry.m_Name;
+ if (targetName == NULL)
+ targetName = "";
+
+ QT3DSU32 entryNameLen = (QT3DSU32)(strlen(targetName)) + 1;
+ theDestEntry.m_NameOffset = (QT3DSU32)(vertEntryNameData - baseAddress);
+ memCopy(vertEntryNameData, theEntry.m_Name, entryNameLen);
+ vertEntryNameData += entryNameLen;
+ }
+
+ retval->m_IndexBuffer.m_ComponentType = m_IndexBuffer.m_CompType;
+ Assign(baseAddress, indexBufferData, retval->m_IndexBuffer.m_Data,
+ m_IndexBuffer.m_IndexData.begin(), m_IndexBuffer.m_IndexData.size());
+ Assign(baseAddress, subsetBufferData, retval->m_Subsets, m_MeshSubsetDescs.size());
+ for (QT3DSU32 idx = 0, end = m_MeshSubsetDescs.size(); idx < end; ++idx) {
+ SubsetDesc &theDesc = m_MeshSubsetDescs[idx];
+ MeshSubset &theSubset = reinterpret_cast<MeshSubset *>(subsetBufferData)[idx];
+ theSubset.m_Bounds = theDesc.m_Bounds;
+ theSubset.m_Count = theDesc.m_Count;
+ theSubset.m_Offset = theDesc.m_Offset;
+ if (!theDesc.m_Name.isEmpty()) {
+ theSubset.m_Name.m_Size = theDesc.m_Name.size() + 1;
+ theSubset.m_Name.m_Offset = (QT3DSU32)(nameBufferData - baseAddress);
+ std::transform(theDesc.m_Name.begin(), theDesc.m_Name.end(),
+ reinterpret_cast<char16_t *>(nameBufferData),
+ [](QChar c) { return static_cast<char16_t>(c.unicode()); });
+ reinterpret_cast<char16_t *>(nameBufferData)[theDesc.m_Name.size()] = 0;
+ nameBufferData += (theDesc.m_Name.size() + 1) * sizeof(char16_t);
+ } else {
+ theSubset.m_Name.m_Size = 0;
+ theSubset.m_Name.m_Offset = 0;
+ }
+ }
+ Assign(baseAddress, jointBufferData, retval->m_Joints, m_Joints.data(), m_Joints.size());
+ return *retval;
+ }
+};
+}
+
+// Uses new/delete.
+MeshBuilder &MeshBuilder::CreateMeshBuilder()
+{
+ return *(new MeshBuilderImpl());
+}
diff --git a/src/importlib/Qt3DSImportPath.cpp b/src/importlib/Qt3DSImportPath.cpp
new file mode 100644
index 0000000..3523ef5
--- /dev/null
+++ b/src/importlib/Qt3DSImportPath.cpp
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSImportLibPrecompile.h"
+#include "Qt3DSImportPath.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+
+using namespace qt3dsimp;
+
+void SPathBuffer::Save(IOutStream &outStream) const
+{
+ outStream.Write(GetFileTag());
+ outStream.Write(GetFileVersion());
+ outStream.Write((QT3DSU32)m_Commands.size());
+ outStream.Write((QT3DSU32)m_Data.size());
+ outStream.Write(toU8ConstDataRef((PathCommand::Enum *)m_Commands.begin(), m_Commands.size()));
+ outStream.Write(toU8ConstDataRef((QT3DSF32 *)m_Data.begin(), m_Data.size()));
+}
+
+SPathBuffer *SPathBuffer::Load(IInStream &inStream, NVFoundationBase &inFoundation)
+{
+ QT3DSU64 fileTag;
+ QT3DSU32 version, numCommands, numData;
+ inStream.Read(fileTag);
+ inStream.Read(version);
+ inStream.Read(numCommands);
+ inStream.Read(numData);
+ if (fileTag != GetFileTag()) {
+ qCCritical(INVALID_OPERATION, "Invalid file, not a path file");
+ return NULL;
+ }
+ if (version > GetFileVersion()) {
+ qCCritical(INVALID_OPERATION, "Version number out of range.");
+ return NULL;
+ }
+ QT3DSU32 commandSize = numCommands * sizeof(QT3DSU32);
+ QT3DSU32 dataSize = numData * sizeof(QT3DSF32);
+ QT3DSU32 objectSize = sizeof(SPathBuffer);
+ QT3DSU32 allocSize = objectSize + commandSize + dataSize;
+ QT3DSU8 *rawData =
+ (QT3DSU8 *)inFoundation.getAllocator().allocate(allocSize, "SPathBuffer", __FILE__, __LINE__);
+ SPathBuffer *retval = new (rawData) SPathBuffer();
+ QT3DSU8 *commandBuffer = rawData + sizeof(SPathBuffer);
+ QT3DSU8 *dataBuffer = commandBuffer + commandSize;
+ inStream.Read(commandBuffer, commandSize);
+ inStream.Read(dataBuffer, dataSize);
+ retval->m_Commands = toDataRef((PathCommand::Enum *)commandBuffer, numCommands);
+ retval->m_Data = toDataRef((QT3DSF32 *)dataBuffer, numData);
+ return retval;
+}
+
+void SPathBuffer::Free(NVAllocatorCallback &inAllocator)
+{
+ inAllocator.deallocate(this);
+}
+
+namespace {
+struct SBuilder : public IPathBufferBuilder
+{
+ NVFoundationBase &m_Foundation;
+ nvvector<PathCommand::Enum> m_Commands;
+ nvvector<QT3DSF32> m_Data;
+ QT3DSI32 m_RefCount;
+
+ SBuilder(NVFoundationBase &inFoundation)
+ : m_Foundation(inFoundation)
+ , m_Commands(inFoundation.getAllocator(), "m_Commands")
+ , m_Data(inFoundation.getAllocator(), "m_Data")
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &theAlloc(m_Foundation.getAllocator());
+ NVDelete(theAlloc, this);
+ }
+ }
+
+ void Clear() override
+ {
+ m_Commands.clear();
+ m_Data.clear();
+ }
+
+ void Push(const QT3DSVec2 inPos)
+ {
+ m_Data.push_back(inPos.x);
+ m_Data.push_back(inPos.y);
+ }
+
+ void MoveTo(const QT3DSVec2 &inPos) override
+ {
+ m_Commands.push_back(PathCommand::MoveTo);
+ Push(inPos);
+ }
+
+ void CubicCurveTo(const QT3DSVec2 &inC1, const QT3DSVec2 &inC2, const QT3DSVec2 &inP2) override
+ {
+ m_Commands.push_back(PathCommand::CubicCurveTo);
+ Push(inC1);
+ Push(inC2);
+ Push(inP2);
+ }
+
+ void Close() override { m_Commands.push_back(PathCommand::Close); }
+
+ // Points back to internal data structures, must use or copy.
+ SPathBuffer GetPathBuffer() override
+ {
+ SPathBuffer retval;
+ retval.m_Data = m_Data;
+ retval.m_Commands = m_Commands;
+ return retval;
+ }
+};
+}
+
+IPathBufferBuilder &IPathBufferBuilder::CreateBuilder(NVFoundationBase &inFoundation)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), SBuilder)(inFoundation);
+}
diff --git a/src/importlib/Qt3DSImportPath.h b/src/importlib/Qt3DSImportPath.h
new file mode 100644
index 0000000..3b52c8c
--- /dev/null
+++ b/src/importlib/Qt3DSImportPath.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_IMPORT_PATH_H
+#define QT3DS_IMPORT_PATH_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSVec2.h"
+
+namespace qt3dsimp {
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace qt3ds::render;
+struct PathCommand
+{
+ enum Enum {
+ Noner = 0,
+ MoveTo, // 2 floats
+ CubicCurveTo, // 6 floats, c1, c2, p2. p1 is existing location
+ Close, // 0 floats
+ };
+};
+
+struct SPathBuffer
+{
+ // 64 bit random number to uniquely identify this file type.
+ static QT3DSU64 GetFileTag() { return 0x7b1a41633c43a6afULL; }
+ static QT3DSU32 GetFileVersion() { return 1; }
+ NVConstDataRef<PathCommand::Enum> m_Commands;
+ NVConstDataRef<QT3DSF32> m_Data;
+ SPathBuffer() {}
+ void Save(IOutStream &outStream) const;
+ static SPathBuffer *Load(IInStream &inStream, NVFoundationBase &inFoundation);
+
+ // Object is unused after this call. Anything created with Load must use this function.
+ void Free(NVAllocatorCallback &inAllocator);
+ SPathBuffer *Copy(NVAllocatorCallback &inAllocator) const;
+};
+
+class IPathBufferBuilder : public NVRefCounted
+{
+public:
+ virtual void Clear() = 0;
+
+ virtual void MoveTo(const QT3DSVec2 &inPos) = 0;
+ virtual void CubicCurveTo(const QT3DSVec2 &inC1, const QT3DSVec2 &inC2, const QT3DSVec2 &inP2) = 0;
+ virtual void Close() = 0;
+ // Points back to internal data structures, must use or copy.
+ virtual SPathBuffer GetPathBuffer() = 0;
+
+ static IPathBufferBuilder &CreateBuilder(NVFoundationBase &inFoundation);
+};
+}
+
+#endif \ No newline at end of file
diff --git a/src/ogl-runtime-dylib/ogl-runtime-dylib.pro b/src/ogl-runtime-dylib/ogl-runtime-dylib.pro
new file mode 100644
index 0000000..6cafa4c
--- /dev/null
+++ b/src/ogl-runtime-dylib/ogl-runtime-dylib.pro
@@ -0,0 +1,74 @@
+TEMPLATE = lib
+TARGET = qt3dsopengl
+VERSION = $$MODULE_VERSION
+
+DEFINES += QT3DS_RUNTIME_EXPORTS
+
+CONFIG += installed
+include(../commoninclude.pri)
+QT += qml
+QT += quick-private
+
+boot2qt: {
+ RESOURCES += ../../res.qrc
+ DEFINES += EMBEDDED_LINUX # TODO: Is there a compile-time flag for boot2qt?
+}
+
+integrity|ios {
+ RESOURCES += ../../res.qrc
+}
+
+SOURCES += \
+ ../viewer/Qt3DSAudioPlayerImpl.cpp \
+ ../viewer/Qt3DSViewerApp.cpp
+
+HEADERS += \
+ ../viewer/qt3dsruntimeglobal.h \
+ ../viewer/Qt3DSAudioPlayerImpl.h \
+ ../viewer/Qt3DSViewerApp.h \
+ ../viewer/Qt3DSViewerTimer.h
+
+linux|qnx|mingw {
+ BEGIN_ARCHIVE = -Wl,--whole-archive
+ END_ARCHIVE = -Wl,--no-whole-archive
+}
+
+STATICRUNTIME = \
+ $$BEGIN_ARCHIVE \
+ -lqt3dsruntimestatic$$qtPlatformTargetSuffix() \
+ -lEASTL$$qtPlatformTargetSuffix() \
+ $$END_ARCHIVE
+
+# On non-windows systems link the whole static archives and do not put them
+# in the prl file to prevent them being linked again by targets that depend
+# upon this shared library
+!win32:!CONFIG(static){
+ QMAKE_LFLAGS += $$STATICRUNTIME
+ LIBS += -lqt3dsqmlstreamer$$qtPlatformTargetSuffix()
+} else {
+ LIBS += \
+ $$STATICRUNTIME \
+ -lqt3dsqmlstreamer$$qtPlatformTargetSuffix()
+}
+
+win32 {
+ LIBS += \
+ -lws2_32
+
+ RESOURCES += ../../platformres.qrc
+}
+
+linux {
+ LIBS += \
+ -ldl \
+ -lEGL
+}
+
+macos {
+ QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/
+}
+
+PREDEPS_LIBS = qt3dsruntimestatic
+
+include(../../utils.pri)
+PRE_TARGETDEPS += $$fixLibPredeps($$LIBDIR, PREDEPS_LIBS)
diff --git a/src/ogl-runtime-static/ogl-runtime-static.pro b/src/ogl-runtime-static/ogl-runtime-static.pro
new file mode 100644
index 0000000..8b2c95a
--- /dev/null
+++ b/src/ogl-runtime-static/ogl-runtime-static.pro
@@ -0,0 +1,656 @@
+TEMPLATE = lib
+TARGET = qt3dsruntimestatic
+CONFIG += staticlib
+include(../commoninclude.pri)
+
+!boot2qt:!integrity:!ios {
+ RESOURCES += ../../res.qrc
+}
+
+linux {
+ DEFINES += _POSIX_C_SOURCE=199309L
+ QMAKE_LFLAGS += -lrt
+}
+
+DEFINES += QT3DS_BUILDING_LIBRARY DISABLE_MESH_OPTIMIZATION
+
+QT += qml
+QT += quick-private
+
+# Foundation
+SOURCES += \
+ ../foundation/ConvertUTF.cpp \
+ ../foundation/EASTL_new.cpp \
+ ../foundation/FileTools.cpp \
+ ../foundation/IOStreams.cpp \
+ ../foundation/Qt3DSLogging.cpp \
+ ../foundation/Qt3DSFoundation.cpp \
+ ../foundation/Qt3DSMathUtils.cpp \
+ ../foundation/Qt3DSPerfTimer.cpp \
+ ../foundation/Qt3DSSystem.cpp \
+ ../foundation/Socket.cpp \
+ ../foundation/StringTable.cpp \
+ ../foundation/XML.cpp \
+ ../foundation/TrackingAllocator.cpp \
+ ../runtimerender/q3dsqmlrender.cpp \
+ ../engine/Qt3DSRenderRuntimeBinding.cpp \
+ ../engine/Qt3DSRenderRuntimeBindingImplRenderer.cpp \
+ ../engine/Qt3DSRenderRuntimeBindingImplTranslation.cpp \
+ ../engine/Qt3DSTegraInputEngine.cpp \
+ ../runtime/Qt3DSActivationManager.cpp \
+ ../runtime/Qt3DSAnimationSystem.cpp \
+ ../runtime/Qt3DSApplication.cpp \
+ ../runtime/Qt3DSAttributeHashes.cpp \
+ ../runtime/Qt3DSComponentManager.cpp \
+ ../runtime/Qt3DSElementSystem.cpp \
+ ../runtime/Qt3DSEventCallbacks.cpp \
+ ../runtime/Qt3DSInputEngine.cpp \
+ ../runtime/Qt3DSLogicSystem.cpp \
+ ../runtime/Qt3DSCommandHelper.cpp \
+ ../runtime/Qt3DSElementHelper.cpp \
+ ../runtime/Qt3DSOutputMemoryStream.cpp \
+ ../runtime/Qt3DSParametersSystem.cpp \
+ ../runtime/Qt3DSPresentation.cpp \
+ ../runtime/Qt3DSPresentationFrameData.cpp \
+ ../runtime/Qt3DSQmlElementHelper.cpp \
+ ../runtime/Qt3DSQmlEngine.cpp \
+ ../runtime/Qt3DSSlideSystem.cpp \
+ ../runtime/Qt3DSTimePolicy.cpp \
+ ../runtime/q3dsvariantconfig.cpp \
+ ../runtime/q3dsmaterialdefinitionparser.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderCamera.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderEffect.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderImage.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderLayer.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderLight.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderLightmaps.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderModel.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderNode.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderPath.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderPresentation.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderScene.cpp \
+ ../runtimerender/graphobjects/Qt3DSRenderText.cpp \
+ ../runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp \
+ ../runtimerender/rendererimpl/Qt3DSRendererImpl.cpp \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderBufferLoader.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureBMP.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureGIF.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureHDR.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.cpp \
+ ../runtimerender/Qt3DSOffscreenRenderManager.cpp \
+ ../runtimerender/Qt3DSOldNBustedRenderPlugin.cpp \
+ ../runtimerender/Qt3DSOnscreenTextRenderer.cpp \
+ ../runtimerender/Qt3DSQtTextRenderer.cpp \
+ ../runtimerender/Qt3DSRenderClippingFrustum.cpp \
+ ../runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp \
+ ../runtimerender/Qt3DSRenderCustomMaterialSystem.cpp \
+ ../runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp \
+ ../runtimerender/Qt3DSRenderDynamicObjectSystem.cpp \
+ ../runtimerender/Qt3DSRenderEffectSystem.cpp \
+ ../runtimerender/Qt3DSRendererUtil.cpp \
+ ../runtimerender/Qt3DSRenderEulerAngles.cpp \
+ ../runtimerender/Qt3DSRenderGpuProfiler.cpp \
+ ../runtimerender/Qt3DSRenderGraphObjectSerializer.cpp \
+ ../runtimerender/Qt3DSRenderImageScaler.cpp \
+ ../runtimerender/Qt3DSRenderInputStreamFactory.cpp \
+ ../runtimerender/Qt3DSRenderPathManager.cpp \
+ ../runtimerender/Qt3DSRenderPixelGraphicsRenderer.cpp \
+ ../runtimerender/Qt3DSRenderPixelGraphicsTypes.cpp \
+ ../runtimerender/Qt3DSRenderPlugin.cpp \
+ ../runtimerender/Qt3DSRenderRay.cpp \
+ ../runtimerender/Qt3DSRenderRenderList.cpp \
+ ../runtimerender/Qt3DSRenderShaderCache.cpp \
+ ../runtimerender/Qt3DSRenderShaderCodeGenerator.cpp \
+ ../runtimerender/Qt3DSRenderShaderCodeGeneratorV2.cpp \
+ ../runtimerender/Qt3DSRenderShadowMap.cpp \
+ ../runtimerender/Qt3DSRenderSubpresentation.cpp \
+ ../runtimerender/Qt3DSRenderTextTextureAtlas.cpp \
+ ../runtimerender/Qt3DSRenderTextTextureCache.cpp \
+ ../runtimerender/Qt3DSRenderTextureAtlas.cpp \
+ ../runtimerender/Qt3DSRenderThreadPool.cpp \
+ ../runtimerender/Qt3DSRenderUIPLoader.cpp \
+ ../runtimerender/Qt3DSRenderUIPSharedTranslation.cpp \
+ ../runtimerender/Qt3DSRenderWidgets.cpp \
+ ../runtimerender/Qt3DSTextRenderer.cpp \
+ ../system/Qt3DSAssert.cpp \
+ ../system/Qt3DSBoundingBox.cpp \
+ ../system/Qt3DSColor.cpp \
+ ../system/Qt3DSCubicRoots.cpp \
+ ../system/Qt3DSDataLogger.cpp \
+ ../system/Qt3DSDLLManager.cpp \
+ ../system/Qt3DSEulerAngles.cpp \
+ ../system/Qt3DSFile.cpp \
+ ../system/Qt3DSFileStream.cpp \
+ ../system/Qt3DSFunctionWrappers.cpp \
+ ../system/Qt3DSMatrix.cpp \
+ ../system/Qt3DSMemory.cpp \
+ ../system/Qt3DSMemoryFilter.cpp \
+ ../system/Qt3DSMemoryHeap.cpp \
+ ../system/Qt3DSMemoryManager.cpp \
+ ../system/Qt3DSMemoryPool.cpp \
+ ../system/Qt3DSMemoryProbe.cpp \
+ ../system/Qt3DSMemoryStatistics.cpp \
+ ../system/Qt3DSMemoryTracker.cpp \
+ ../system/Qt3DSTimer.cpp \
+ ../system/Qt3DSTypes.cpp \
+ ../system/Qt3DSVector3.cpp \
+ ../uipparser/Qt3DSUIPParserActionHelper.cpp \
+ ../uipparser/Qt3DSUIPParserImpl.cpp \
+ ../uipparser/Qt3DSUIPParserObjectRefHelper.cpp \
+ ../runtimerender/Qt3DSRenderContextCore.cpp \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.cpp \
+ ../runtimerender/Qt3DSDistanceFieldRenderer.cpp \
+ ../runtimerender/Qt3DSFontDatabase.cpp \
+ ../runtimerender/Qt3DSDistanceFieldGlyphCacheManager.cpp \
+ ../runtimerender/Qt3DSDistanceFieldGlyphCache.cpp \
+ ../engine/Qt3DSRuntimeView.cpp
+
+HEADERS += \
+ ../foundation/ConvertUTF.h \
+ ../foundation/FileTools.h \
+ ../foundation/StringTools.h \
+ ../foundation/IOStreams.h \
+ ../foundation/Qt3DSLogging.h \
+ ../foundation/Qt3DSFoundation.h \
+ ../foundation/Qt3DSMathUtils.h \
+ ../foundation/Qt3DSPerfTimer.h \
+ ../foundation/Qt3DSSystem.h \
+ ../foundation/Socket.h \
+ ../foundation/StringTable.h \
+ ../foundation/XML.h \
+ ../foundation/AutoDeallocatorAllocator.h \
+ ../foundation/FastAllocator.h \
+ ../foundation/PoolingAllocator.h \
+ ../foundation/PreAllocatedAllocator.h \
+ ../foundation/Qt3DS.h \
+ ../foundation/Qt3DSAllocator.h \
+ ../foundation/Qt3DSAllocatorCallback.h \
+ ../foundation/Qt3DSAssert.h \
+ ../foundation/Qt3DSAtomic.h \
+ ../foundation/Qt3DSBasicTemplates.h \
+ ../foundation/Qt3DSBounds3.h \
+ ../foundation/Qt3DSBroadcastingAllocator.h \
+ ../foundation/Qt3DSContainers.h \
+ ../foundation/Qt3DSDataRef.h \
+ ../foundation/Qt3DSDiscriminatedUnion.h \
+ ../foundation/Qt3DSFastIPC.h \
+ ../foundation/Qt3DSFlags.h \
+ ../foundation/Qt3DSFPU.h \
+ ../foundation/Qt3DSIndexableLinkedList.h \
+ ../foundation/Qt3DSIntrinsics.h \
+ ../foundation/Qt3DSInvasiveLinkedList.h \
+ ../foundation/Qt3DSInvasiveSet.h \
+ ../foundation/Qt3DSIPC.h \
+ ../foundation/Qt3DSMat33.h \
+ ../foundation/Qt3DSMat44.h \
+ ../foundation/Qt3DSMath.h \
+ ../foundation/Qt3DSMemoryBuffer.h \
+ ../foundation/Qt3DSMutex.h \
+ ../foundation/Qt3DSNoCopy.h \
+ ../foundation/Qt3DSOption.h \
+ ../foundation/Qt3DSPlane.h \
+ ../foundation/Qt3DSPool.h \
+ ../foundation/Qt3DSPreprocessor.h \
+ ../foundation/Qt3DSQuat.h \
+ ../foundation/Qt3DSRefCounted.h \
+ ../foundation/Qt3DSSemaphore.h \
+ ../foundation/Qt3DSSimpleTypes.h \
+ ../foundation/Qt3DSStringTokenizer.h \
+ ../foundation/Qt3DSSync.h \
+ ../foundation/Qt3DSThread.h \
+ ../foundation/Qt3DSTime.h \
+ ../foundation/Qt3DSTransform.h \
+ ../foundation/Qt3DSUnionCast.h \
+ ../foundation/Qt3DSUtilities.h \
+ ../foundation/Qt3DSVec2.h \
+ ../foundation/Qt3DSVec3.h \
+ ../foundation/Qt3DSVec4.h \
+ ../foundation/Qt3DSVersionNumber.h \
+ ../foundation/SerializationTypes.h \
+ ../foundation/StrConvertUTF.h \
+ ../foundation/StringConversion.h \
+ ../foundation/StringConversionImpl.h \
+ ../foundation/TaggedPointer.h \
+ ../foundation/ThreadSafeQueue.h \
+ ../foundation/TrackingAllocator.h \
+ ../foundation/Utils.h \
+ ../runtimerender/q3dsqmlrender.h \
+ ../engine/Qt3DSRenderRuntimeBinding.h \
+ ../engine/Qt3DSRenderRuntimeBindingImpl.h \
+ ../engine/Qt3DSTegraInputEngine.h \
+ ../runtime/Qt3DSActivationManager.h \
+ ../runtime/Qt3DSAnimationSystem.h \
+ ../runtime/Qt3DSApplication.h \
+ ../runtime/Qt3DSAttributeHashes.h \
+ ../runtime/Qt3DSComponentManager.h \
+ ../runtime/Qt3DSElementSystem.h \
+ ../runtime/Qt3DSEventCallbacks.h \
+ ../runtime/Qt3DSInputEngine.h \
+ ../runtime/Qt3DSLogicSystem.h \
+ ../runtime/Qt3DSCommandHelper.h \
+ ../runtime/Qt3DSElementHelper.h \
+ ../runtime/Qt3DSOutputMemoryStream.h \
+ ../runtime/Qt3DSParametersSystem.h \
+ ../runtime/Qt3DSPresentation.h \
+ ../runtime/Qt3DSPresentationFrameData.h \
+ ../runtime/Qt3DSQmlElementHelper.h \
+ ../runtime/Qt3DSQmlEngine.h \
+ ../runtime/Qt3DSSlideSystem.h \
+ ../runtime/Qt3DSTimePolicy.h \
+ ../runtime/Qt3DSApplicationValues.h \
+ ../runtime/Qt3DSIComponentManager.h \
+ ../runtime/Qt3DSIInputSystem.h \
+ ../runtime/Qt3DSInputDefs.h \
+ ../runtime/Qt3DSInputEventTypes.h \
+ ../runtime/Qt3DSIStateful.h \
+ ../runtime/Qt3DSIText.h \
+ ../runtime/Qt3DSKernelTypes.h \
+ ../runtime/q3dsvariantconfig_p.h \
+ ../runtime/q3dsmaterialdefinitionparser.h \
+ ../runtimerender/graphobjects/Qt3DSRenderCamera.h \
+ ../runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h \
+ ../runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h \
+ ../runtimerender/graphobjects/Qt3DSRenderDynamicObject.h \
+ ../runtimerender/graphobjects/Qt3DSRenderEffect.h \
+ ../runtimerender/graphobjects/Qt3DSRenderGraphObject.h \
+ ../runtimerender/graphobjects/Qt3DSRenderImage.h \
+ ../runtimerender/graphobjects/Qt3DSRenderLayer.h \
+ ../runtimerender/graphobjects/Qt3DSRenderLight.h \
+ ../runtimerender/graphobjects/Qt3DSRenderLightmaps.h \
+ ../runtimerender/graphobjects/Qt3DSRenderMaterialDirty.h \
+ ../runtimerender/graphobjects/Qt3DSRenderModel.h \
+ ../runtimerender/graphobjects/Qt3DSRenderNode.h \
+ ../runtimerender/graphobjects/Qt3DSRenderPath.h \
+ ../runtimerender/graphobjects/Qt3DSRenderPathSubPath.h \
+ ../runtimerender/graphobjects/Qt3DSRenderPresentation.h \
+ ../runtimerender/graphobjects/Qt3DSRenderReferencedMaterial.h \
+ ../runtimerender/graphobjects/Qt3DSRenderScene.h \
+ ../runtimerender/graphobjects/Qt3DSRenderText.h \
+ ../runtimerender/Qt3DSOffscreenRenderKey.h \
+ ../runtimerender/Qt3DSOffscreenRenderManager.h \
+ ../runtimerender/Qt3DSOldNBustedRenderPlugin.h \
+ ../runtimerender/Qt3DSRender.h \
+ ../runtimerender/Qt3DSRenderableImage.h \
+ ../runtimerender/Qt3DSRenderClippingFrustum.h \
+ ../runtimerender/Qt3DSRenderCustomMaterialRenderContext.h \
+ ../runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.h \
+ ../runtimerender/Qt3DSRenderCustomMaterialSystem.h \
+ ../runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.h \
+ ../runtimerender/Qt3DSRenderDynamicObjectSystem.h \
+ ../runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h \
+ ../runtimerender/Qt3DSRenderDynamicObjectSystemUtil.h \
+ ../runtimerender/Qt3DSRenderEffectSystem.h \
+ ../runtimerender/Qt3DSRenderer.h \
+ ../runtimerender/Qt3DSRendererUtil.h \
+ ../runtimerender/Qt3DSRenderEulerAngles.h \
+ ../runtimerender/Qt3DSRenderGraphObjectPickQuery.h \
+ ../runtimerender/Qt3DSRenderGraphObjectSerializer.h \
+ ../runtimerender/Qt3DSRenderGraphObjectTypes.h \
+ ../runtimerender/Qt3DSRenderImageScaler.h \
+ ../runtimerender/Qt3DSRenderImageTextureData.h \
+ ../runtimerender/Qt3DSRenderInputStreamFactory.h \
+ ../runtimerender/Qt3DSRenderMaterialHelpers.h \
+ ../runtimerender/Qt3DSRenderMaterialShaderGenerator.h \
+ ../runtimerender/Qt3DSRenderMesh.h \
+ ../runtimerender/Qt3DSRenderPathManager.h \
+ ../runtimerender/Qt3DSRenderPathMath.h \
+ ../runtimerender/Qt3DSRenderPathRenderContext.h \
+ ../runtimerender/Qt3DSRenderPixelGraphicsRenderer.h \
+ ../runtimerender/Qt3DSRenderPixelGraphicsTypes.h \
+ ../runtimerender/Qt3DSRenderPlugin.h \
+ ../runtimerender/Qt3DSRenderPluginCInterface.h \
+ ../runtimerender/Qt3DSRenderPluginGraphObject.h \
+ ../runtimerender/Qt3DSRenderPluginPropertyValue.h \
+ ../runtimerender/Qt3DSRenderProfiler.h \
+ ../runtimerender/Qt3DSRenderRay.h \
+ ../runtimerender/Qt3DSRenderRenderList.h \
+ ../runtimerender/Qt3DSRenderRotationHelper.h \
+ ../runtimerender/Qt3DSRenderShaderCache.h \
+ ../runtimerender/Qt3DSRenderShaderCodeGenerator.h \
+ ../runtimerender/Qt3DSRenderShaderCodeGeneratorV2.h \
+ ../runtimerender/Qt3DSRenderShaderKeys.h \
+ ../runtimerender/Qt3DSRenderShadowMap.h \
+ ../runtimerender/Qt3DSRenderSubpresentation.h \
+ ../runtimerender/Qt3DSRenderSubPresentationHelper.h \
+ ../runtimerender/Qt3DSRenderTaggedPointer.h \
+ ../runtimerender/Qt3DSRenderTessModeValues.h \
+ ../runtimerender/Qt3DSRenderTextTextureAtlas.h \
+ ../runtimerender/Qt3DSRenderTextTextureCache.h \
+ ../runtimerender/Qt3DSRenderTextTypes.h \
+ ../runtimerender/Qt3DSRenderTextureAtlas.h \
+ ../runtimerender/Qt3DSRenderThreadPool.h \
+ ../runtimerender/Qt3DSRenderUIPLoader.h \
+ ../runtimerender/Qt3DSRenderUIPSharedTranslation.h \
+ ../runtimerender/Qt3DSRenderWidgets.h \
+ ../runtimerender/Qt3DSTextRenderer.h \
+ ../runtimerender/rendererimpl/Qt3DSRenderableObjects.h \
+ ../runtimerender/rendererimpl/Qt3DSRendererImpl.h \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h \
+ ../runtimerender/rendererimpl/Qt3DSRendererImplShaders.h \
+ ../runtimerender/rendererimpl/Qt3DSVertexPipelineImpl.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderBufferLoader.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderBufferManager.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureFreeImageCompat.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderResourceManager.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.h \
+ ../system/Qt3DSArray.h \
+ ../system/Qt3DSAssert.h \
+ ../system/Qt3DSAudioPlayer.h \
+ ../system/Qt3DSBasicPluginDLL.h \
+ ../system/Qt3DSBezierEval.h \
+ ../system/Qt3DSBoundingBox.h \
+ ../system/Qt3DSCircularArray.h \
+ ../system/Qt3DSColor.h \
+ ../system/Qt3DSConfig.h \
+ ../system/Qt3DSCubicRoots.h \
+ ../system/Qt3DSCubicRootsImpl.h \
+ ../system/Qt3DSDataLogger.h \
+ ../system/Qt3DSDataLogger.hpp \
+ ../system/Qt3DSDataLoggerEnums.h \
+ ../system/Qt3DSDataLoggerViewer.h \
+ ../system/Qt3DSDLLManager.h \
+ ../system/Qt3DSEGLTimer.h \
+ ../system/Qt3DSEndian.h \
+ ../system/Qt3DSEulerAngles.h \
+ ../system/Qt3DSFile.h \
+ ../system/Qt3DSFileStream.h \
+ ../system/Qt3DSFixedArray.h \
+ ../system/Qt3DSFNDTimer.h \
+ ../system/Qt3DSFunctionWrappers.h \
+ ../system/Qt3DSHash.h \
+ ../system/Qt3DSIFileStream.h \
+ ../system/Qt3DSIStream.h \
+ ../system/Qt3DSITimer.h \
+ ../system/Qt3DSMacros.h \
+ ../system/Qt3DSMatrix.h \
+ ../system/Qt3DSMemory.h \
+ ../system/Qt3DSMemoryFilter.h \
+ ../system/Qt3DSMemoryHeap.h \
+ ../system/Qt3DSMemoryManager.h \
+ ../system/Qt3DSMemoryPool.h \
+ ../system/Qt3DSMemoryProbe.h \
+ ../system/Qt3DSMemorySettings.h \
+ ../system/Qt3DSMemoryStatistics.h \
+ ../system/Qt3DSMemoryTracker.h \
+ ../system/Qt3DSPlatformSpecific.h \
+ ../system/Qt3DSTimer.h \
+ ../system/Qt3DSTypes.h \
+ ../system/Qt3DSVector3.h \
+ ../system/Qt3DSArray.inl \
+ ../system/Qt3DSCircularArray.inl \
+ ../system/Qt3DSFixedArray.inl \
+ ../state/Qt3DSState.h \
+ ../state/Qt3DSStateTypes.h \
+ ../state/Qt3DSStateScriptContext.h \
+ ../state/Qt3DSStateVisualBindingContextCommands.h \
+ ../uipparser/Qt3DSIPresentation.h \
+ ../uipparser/Qt3DSUIPParser.h \
+ ../uipparser/Qt3DSUIPParserActionHelper.h \
+ ../uipparser/Qt3DSUIPParserImpl.h \
+ ../uipparser/Qt3DSUIPParserObjectRefHelper.h \
+ ../runtime/Qt3DSCommandEventTypes.h \
+ ../runtime/Qt3DSEvent.h \
+ ../runtime/Qt3DSFrameworkTypes.h \
+ ../runtime/Qt3DSInputFrame.h \
+ ../runtime/Qt3DSIScene.h \
+ ../runtime/Qt3DSIScriptBridge.h \
+ ../runtime/Qt3DSPickFrame.h \
+ ../runtime/Qt3DSRuntimeFactory.h \
+ ../runtime/Qt3DSSceneManager.h \
+ ../engine/Qt3DSEGLInfo.h \
+ ../engine/Qt3DSEGLWindowSystem.h \
+ ../engine/Qt3DSPluginDLL.h \
+ ../engine/Qt3DSWindowSystem.h \
+ ../runtimerender/Qt3DSRenderContextCore.h \
+ ../runtimerender/Qt3DSRenderLightConstantProperties.h \
+ ../runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.h \
+ ../runtimerender/Qt3DSDistanceFieldRenderer.h \
+ ../runtimerender/Qt3DSFontDatabase_p.h \
+ ../runtimerender/Qt3DSDistanceFieldGlyphCacheManager_p.h \
+ ../runtimerender/Qt3DSDistanceFieldGlyphCache_p.h \
+ ../engine/Qt3DSRuntimeView.h
+
+win32 {
+SOURCES += \
+ ../foundation/windows/Qt3DSWindowsAtomic.cpp \
+ ../foundation/windows/Qt3DSWindowsFPU.cpp \
+ ../foundation/windows/Qt3DSWindowsMutex.cpp \
+ ../foundation/windows/Qt3DSWindowsSemaphore.cpp \
+ ../foundation/windows/Qt3DSWindowsSync.cpp \
+ ../foundation/windows/Qt3DSWindowsThread.cpp \
+ ../foundation/windows/Qt3DSWindowsTime.cpp
+
+HEADERS += \
+ ../foundation/windows/Qt3DSWindowsAoS.h \
+ ../foundation/windows/Qt3DSWindowsFile.h \
+ ../foundation/windows/Qt3DSWindowsInclude.h \
+ ../foundation/windows/Qt3DSWindowsInlineAoS.h \
+ ../foundation/windows/Qt3DSWindowsIntrinsics.h \
+ ../foundation/windows/Qt3DSWindowsString.h \
+ ../foundation/windows/Qt3DSWindowsTrigConstants.h
+}
+
+macos: SOURCES += \
+ ../foundation/macos/Qt3DSUnixAtomic.cpp \
+ ../foundation/macos/Qt3DSUnixFPU.cpp \
+ ../foundation/macos/Qt3DSUnixMutex.cpp \
+ ../foundation/macos/Qt3DSUnixSemaphore.cpp \
+ ../foundation/macos/Qt3DSUnixSync.cpp \
+ ../foundation/linux/Qt3DSLinuxThread.cpp \
+ ../foundation/macos/Qt3DSUnixTime.cpp
+
+linux|integrity|qnx {
+SOURCES += \
+ ../foundation/linux/Qt3DSLinuxAtomic.cpp \
+ ../foundation/linux/Qt3DSLinuxFPU.cpp \
+ ../foundation/linux/Qt3DSLinuxMutex.cpp \
+ ../foundation/linux/Qt3DSLinuxSemaphore.cpp \
+ ../foundation/linux/Qt3DSLinuxSync.cpp \
+ ../foundation/linux/Qt3DSLinuxThread.cpp \
+ ../foundation/linux/Qt3DSLinuxTime.cpp
+
+HEADERS += \
+ ../foundation/linux/Qt3DSLinuxAoS.h \
+ ../foundation/linux/Qt3DSLinuxFile.h \
+ ../foundation/linux/Qt3DSLinuxInlineAoS.h \
+ ../foundation/linux/Qt3DSLinuxIntrinsics.h \
+ ../foundation/linux/Qt3DSLinuxString.h \
+ ../foundation/linux/Qt3DSLinuxTrigConstants.h
+}
+
+# Libs
+SOURCES += \
+ ../platformspecific/$$PlatformSpecificDir/libs/nv_math/nv_math.cpp \
+ ../platformspecific/$$PlatformSpecificDir/libs/nv_math/nv_matrix.cpp \
+ ../platformspecific/$$PlatformSpecificDir/libs/nv_math/nv_quat.cpp
+
+# RenderBase
+SOURCES += \
+ ../render/Qt3DSRenderAtomicCounterBuffer.cpp \
+ ../render/Qt3DSRenderAttribLayout.cpp \
+ ../render/Qt3DSRenderBaseTypes.cpp \
+ ../render/Qt3DSRenderComputeShader.cpp \
+ ../render/Qt3DSRenderConstantBuffer.cpp \
+ ../render/Qt3DSRenderContext.cpp \
+ ../render/Qt3DSRenderDataBuffer.cpp \
+ ../render/Qt3DSRenderDepthStencilState.cpp \
+ ../render/Qt3DSRenderDrawIndirectBuffer.cpp \
+ ../render/Qt3DSRenderFragmentShader.cpp \
+ ../render/Qt3DSRenderFrameBuffer.cpp \
+ ../render/Qt3DSRenderGeometryShader.cpp \
+ ../render/Qt3DSRenderImageTexture.cpp \
+ ../render/Qt3DSRenderIndexBuffer.cpp \
+ ../render/Qt3DSRenderInputAssembler.cpp \
+ ../render/Qt3DSRenderOcclusionQuery.cpp \
+ ../render/Qt3DSRenderPathFontSpecification.cpp \
+ ../render/Qt3DSRenderPathFontText.cpp \
+ ../render/Qt3DSRenderPathRender.cpp \
+ ../render/Qt3DSRenderPathSpecification.cpp \
+ ../render/Qt3DSRenderProgramPipeline.cpp \
+ ../render/Qt3DSRenderQueryBase.cpp \
+ ../render/Qt3DSRenderRasterizerState.cpp \
+ ../render/Qt3DSRenderRenderBuffer.cpp \
+ ../render/Qt3DSRenderSampler.cpp \
+ ../render/Qt3DSRenderShaderProgram.cpp \
+ ../render/Qt3DSRenderStorageBuffer.cpp \
+ ../render/Qt3DSRenderSync.cpp \
+ ../render/Qt3DSRenderTessellationShader.cpp \
+ ../render/Qt3DSRenderTexture2D.cpp \
+ ../render/Qt3DSRenderTexture2DArray.cpp \
+ ../render/Qt3DSRenderTextureBase.cpp \
+ ../render/Qt3DSRenderTextureCube.cpp \
+ ../render/Qt3DSRenderTimerQuery.cpp \
+ ../render/Qt3DSRenderVertexBuffer.cpp \
+ ../render/Qt3DSRenderVertexShader.cpp
+
+HEADERS += \
+ ../render/Qt3DSRenderAtomicCounterBuffer.h \
+ ../render/Qt3DSRenderAttribLayout.h \
+ ../render/Qt3DSRenderBaseTypes.h \
+ ../render/Qt3DSRenderComputeShader.h \
+ ../render/Qt3DSRenderConstantBuffer.h \
+ ../render/Qt3DSRenderContext.h \
+ ../render/Qt3DSRenderDataBuffer.h \
+ ../render/Qt3DSRenderDepthStencilState.h \
+ ../render/Qt3DSRenderDrawable.h \
+ ../render/Qt3DSRenderDrawIndirectBuffer.h \
+ ../render/Qt3DSRenderFragmentShader.h \
+ ../render/Qt3DSRenderFrameBuffer.h \
+ ../render/Qt3DSRenderGeometryShader.h \
+ ../render/Qt3DSRenderImageTexture.h \
+ ../render/Qt3DSRenderIndexBuffer.h \
+ ../render/Qt3DSRenderInputAssembler.h \
+ ../render/Qt3DSRenderOcclusionQuery.h \
+ ../render/Qt3DSRenderPathFontSpecification.h \
+ ../render/Qt3DSRenderPathFontText.h \
+ ../render/Qt3DSRenderPathRender.h \
+ ../render/Qt3DSRenderPathSpecification.h \
+ ../render/Qt3DSRenderProgramPipeline.h \
+ ../render/Qt3DSRenderQueryBase.h \
+ ../render/Qt3DSRenderRasterizerState.h \
+ ../render/Qt3DSRenderRenderBuffer.h \
+ ../render/Qt3DSRenderSampler.h \
+ ../render/Qt3DSRenderShader.h \
+ ../render/Qt3DSRenderShaderConstant.h \
+ ../render/Qt3DSRenderShaderProgram.h \
+ ../render/Qt3DSRenderStorageBuffer.h \
+ ../render/Qt3DSRenderSync.h \
+ ../render/Qt3DSRenderTessellationShader.h \
+ ../render/Qt3DSRenderTexture2D.h \
+ ../render/Qt3DSRenderTexture2DArray.h \
+ ../render/Qt3DSRenderTextureBase.h \
+ ../render/Qt3DSRenderTextureCube.h \
+ ../render/Qt3DSRenderTimerQuery.h \
+ ../render/Qt3DSRenderVertexBuffer.h \
+ ../render/Qt3DSRenderVertexShader.h \
+ ../render/glg/Qt3DSGLImplObjects.h
+
+# Render
+SOURCES += \
+ ../render/backends/gl/Qt3DSOpenGLExtensions.cpp \
+ ../render/backends/gl/Qt3DSRenderBackendGL3.cpp \
+ ../render/backends/gl/Qt3DSRenderBackendGL4.cpp \
+ ../render/backends/gl/Qt3DSRenderBackendGLBase.cpp \
+ ../render/backends/gl/Qt3DSRenderContextGL.cpp \
+ ../render/backends/software/Qt3DSRenderBackendNULL.cpp \
+ ../render/backends/gl/Q3DSRenderBackendGLES2.cpp
+
+HEADERS += \
+ ../render/backends/Qt3DSRenderBackend.h \
+ ../render/backends/gl/Qt3DSOpenGLPrefix.h \
+ ../render/backends/gl/Qt3DSOpenGLUtil.h \
+ ../render/backends/gl/Qt3DSOpenGLExtensions.h \
+ ../render/backends/gl/Qt3DSRenderBackendGL3.h \
+ ../render/backends/gl/Qt3DSRenderBackendGL4.h \
+ ../render/backends/gl/Qt3DSRenderBackendGLBase.h \
+ ../render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h \
+ ../render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h \
+ ../render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h \
+ ../render/backends/software/Qt3DSRenderBackendNULL.h \
+ ../render/backends/gl/Q3DSRenderBackendGLES2.h
+
+# DataModel
+SOURCES += \
+ ../datamodel/Qt3DSMetadata.cpp \
+ ../importlib/Qt3DSImportMesh.cpp \
+ ../importlib/Qt3DSImportMeshBuilder.cpp \
+ ../importlib/Qt3DSImportPath.cpp \
+ ../dm/systems/Qt3DSDMMetaData.cpp \
+ ../dm/systems/Qt3DSDMXML.cpp \
+ ../dm/systems/Qt3DSDMStringTable.cpp \
+ ../dm/systems/Qt3DSDMComposerTypeDefinitions.cpp \
+ ../dm/systems/Qt3DSDMValue.cpp \
+ ../dm/systems/cores/SimpleDataCore.cpp
+
+HEADERS += \
+ ../datamodel/Qt3DSMetadata.h \
+ ../datamodel/DocumentResourceManagerScriptParser.h \
+ ../importlib/Qt3DSImportMesh.h \
+ ../importlib/Qt3DSImportPath.h \
+ ../dm/systems/Qt3DSDMMetaData.h \
+ ../dm/systems/Qt3DSDMXML.h \
+ ../dm/systems/Qt3DSDMStringTable.h \
+ ../dm/systems/Qt3DSDMHandles.h \
+ ../dm/systems/Qt3DSDMComposerTypeDefinitions.h \
+ ../dm/systems/Qt3DSDMValue.h \
+ ../dm/systems/cores/SimpleDataCore.h
+
+# Engine
+HEADERS += \
+ ../engine/EnginePrefix.h
+
+# Event
+SOURCES += \
+ ../event/EventFactory.cpp \
+ ../event/EventPoller.cpp \
+ ../event/EventSystemC.cpp
+
+HEADERS += \
+ ../event/EventPollingSystem.h \
+ ../event/EventSystem.h \
+ ../event/EventSystemC.h
+
+# Render
+HEADERS += \
+ ../runtimerender/android/DynamicLibLoader.h \
+ ../runtimerender/linux/DynamicLibLoader.h \
+ ../runtimerender/macos/DynamicLibLoader.h \
+ ../runtimerender/qnx/DynamicLibLoader.h \
+ ../runtimerender/windows/DynamicLibLoader.h
+
+# Runtime
+HEADERS += \
+ ../runtime/RuntimePrefix.h \
+ ../runtime/q3dsqmlscript.h \
+ ../runtime/q3dsqmlbehavior.h
+
+SOURCES += \
+ ../runtime/q3dsqmlscript.cpp \
+ ../runtime/q3dsqmlbehavior.cpp
+
+# System
+HEADERS += \
+ ../system/SystemPrefix.h
+
+DISTFILES += \
+ ../runtime/Qt3DSAttributeHashes.txt
diff --git a/src/platformspecific/android/jni/libs/nv_math/NvVec.h b/src/platformspecific/android/jni/libs/nv_math/NvVec.h
new file mode 100644
index 0000000..4e5b09c
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/NvVec.h
@@ -0,0 +1,316 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_VEC_H
+#define INCLUDED_QT3DS_MATH_CPP_VEC_H
+
+#include "misc.h"
+
+struct _NvVec3
+{
+ union {
+ struct
+ {
+ float x, y, z;
+ };
+ float v[3];
+ };
+};
+
+struct NvVec3 : public _NvVec3
+{
+ NvVec3() { zero(); }
+
+ NvVec3(float x, float y, float z)
+ {
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+ }
+
+ NvVec3(NvVec3 const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ v[2] = that.v[2];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ v[2] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec3 &operator+=(NvVec3 const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ v[2] += that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator-=(NvVec3 const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ v[2] -= that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+ return *this;
+ }
+
+ NvVec3 &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ v[2] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec3 const &a, NvVec3 const &b)
+{
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+inline NvVec3 operator+(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] + b.v[0], a.v[1] + b.v[1], a.v[2] + b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] - b.v[0], a.v[1] - b.v[1], a.v[2] - b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a)
+{
+
+ return NvVec3(-a.v[0], -a.v[1], -a.v[2]);
+}
+
+inline NvVec3 operator*(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] * s, a.v[1] * s, a.v[2] * s);
+}
+
+inline NvVec3 operator*(float s, NvVec3 const &a)
+{
+
+ return NvVec3(s * a.v[0], s * a.v[1], s * a.v[2]);
+}
+
+inline NvVec3 operator/(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] / s, a.v[1] / s, a.v[2] / s);
+}
+
+inline float magnitude(NvVec3 const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec3 normalize(NvVec3 const &v)
+{
+ float l = magnitude(v);
+ return NvVec3(v[0] / l, v[1] / l, v[2] / l);
+}
+
+inline NvVec3 cross(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[1] * b.v[2] - a.v[2] * b.v[1], a.v[2] * b.v[0] - a.v[0] * b.v[2],
+ a.v[0] * b.v[1] - a.v[1] * b.v[0]);
+}
+
+inline bool operator==(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] == b.v[0] && a.v[1] == b.v[1] && a.v[2] == b.v[2]);
+}
+
+inline bool operator!=(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] != b.v[0] || a.v[1] != b.v[1] || a.v[2] != b.v[2]);
+}
+
+struct NvVec2f
+{
+ union {
+ struct
+ {
+ float x, y;
+ float v[2];
+ };
+ };
+
+ NvVec2f() { zero(); }
+
+ NvVec2f(float x, float y)
+ {
+ v[0] = x;
+ v[1] = y;
+ }
+
+ NvVec2f(NvVec2f const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec2f &operator+=(NvVec2f const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator-=(NvVec2f const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ return *this;
+ }
+
+ NvVec2f &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a[0] * b[0] + a[1] * b[1];
+}
+
+inline NvVec2f operator+(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] + b.v[0], a.v[1] + b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] - b.v[0], a.v[1] - b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a)
+{
+
+ return NvVec2f(-a.v[0], -a.v[1]);
+}
+
+inline NvVec2f operator*(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] * s, a.v[1] * s);
+}
+
+inline NvVec2f operator*(float s, NvVec2f const &a)
+{
+
+ return NvVec2f(s * a.v[0], s * a.v[1]);
+}
+
+inline NvVec2f operator/(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] / s, a.v[1] / s);
+}
+
+inline float magnitude(NvVec2f const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec2f normalize(NvVec2f const &v)
+{
+ float l = dot(v, v);
+ return NvVec2f(v[0] / l, v[1] / l);
+}
+
+inline float cross(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a.v[0] * b.v[1] - b.v[0] * a.v[1];
+}
+
+#endif
diff --git a/src/platformspecific/android/jni/libs/nv_math/misc.h b/src/platformspecific/android/jni/libs/nv_math/misc.h
new file mode 100644
index 0000000..983410f
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/misc.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_MISC_H
+#define INCLUDED_QT3DS_MATH_CPP_MISC_H
+
+inline bool nvIsPowerOfTwo(unsigned int i)
+{
+ return (i & (i - 1)) == 0;
+}
+
+inline float nvDegToRadf(float d)
+{
+ return d * 3.14159265358979323846f / 180.0f;
+}
+
+inline float nvRadToDegf(float r)
+{
+ return r * 180.0f / 3.14159265358979323846f;
+}
+
+/*
+ 'mod' differs from '%' in that it behaves correctly when either the
+ numerator or denominator is negative.
+*/
+
+inline int nvMod(int n, int d)
+{
+ int m = n % d;
+ return (((m < 0) && (d > 0)) || ((m > 0) && (d < 0))) ? (m + d) : m;
+}
+
+inline int nvAbs(int n)
+{
+ if (n < 0)
+ return -n;
+ return n;
+}
+
+inline int nvSign(int n)
+{
+ if (n > 0)
+ return 1;
+ if (n < 0)
+ return -1;
+ return 0;
+}
+
+/*
+ This returns the smallest amplitude value x such that
+ nvMod(b + x, m) == a
+*/
+
+inline int nvDifMod(int a, int b, int m)
+{
+
+ int x1 = a - b;
+ int x2 = (x1 > 0) ? x1 - m : x1 + m;
+ return (nvAbs(x1) < nvAbs(x2)) ? x1 : x2;
+}
+
+inline float nvWrapf(float a, float min, float max)
+{
+
+ assert(max > min);
+
+ float d = max - min;
+ float s = a - min;
+ float q = s / d;
+ float m = q - floorf(q);
+ return m * d + min;
+}
+
+inline float nvClampf(float a, float min, float max)
+{
+ return (a < min) ? min : ((a > max) ? max : a);
+}
+
+inline int nvClampi(int i, int min, int max)
+{
+ return (i < min) ? min : ((i > max) ? max : i);
+}
+
+inline float nvGaussian(float x, float s)
+{
+ float c = s * sqrtf(2.0f * 3.14159265358979323846f);
+ return expf(-(x * x) / (2.0f * s * s)) / c;
+}
+
+inline float nvLerpf(float a, float b, float t)
+{
+ return a * (1.0f - t) + b * t;
+}
+
+inline float nvEasef(float t)
+{
+
+ float t_2 = t * t;
+ float t_3 = t_2 * t;
+ return 3.0f * t_2 - 2.0f * t_3;
+}
+
+#endif
diff --git a/src/platformspecific/android/jni/libs/nv_math/nv_math.cpp b/src/platformspecific/android/jni/libs/nv_math/nv_math.cpp
new file mode 100644
index 0000000..b83cb39
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/nv_math.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_math.h"
+
+static const double a = 16807.0;
+static const double m = 2147483647.0;
+
+static double nextSeed(double seed)
+{
+ double t = a * seed;
+ return t - m * (double)((int)(t / m));
+}
+
+GLfloat NvRandf()
+{
+ static double seed = 1.0;
+ seed = nextSeed(seed);
+ return (GLfloat)(seed * (1 / m));
+}
+
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime)
+{
+ // kdGetTimeUST is never supposed to decrease (i.e. that
+ // means it can't wrap, either. IIRC, it will wrap in
+ // 593 years). So we ignore that option...
+
+ // Used for frame-to-frame diffs, this will fit in 32b
+ // as long as the times are < ~4.3s apart
+ long long int diffTime = newTime - oldTime;
+
+ // Need to find a better way to do this.
+ // However, I believe we will be uSec precise (not run
+ // out of mantissa bits for uSecs) as long as the diff
+ // is < ~16s (1e-6 * (2^24))
+ return ((GLfloat)diffTime) / 1.0e9f;
+}
diff --git a/src/platformspecific/android/jni/libs/nv_math/nv_math.h b/src/platformspecific/android/jni/libs/nv_math/nv_math.h
new file mode 100644
index 0000000..cf2d8b3
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/nv_math.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _QT3DS_MATH_H
+#define _QT3DS_MATH_H
+
+#include <GLES2/gl2.h>
+
+GLfloat NvRandf();
+
+/* These are the recommended "safer" ways to use GLfloat for time */
+
+/* Returns the seconds between the two given times */
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime);
+
+#define QT3DS_MILISECS_TO_UST(ms) ((long long int)(ms)*1000000)
+
+#endif
diff --git a/src/platformspecific/android/jni/libs/nv_math/nv_matrix.cpp b/src/platformspecific/android/jni/libs/nv_math/nv_matrix.cpp
new file mode 100644
index 0000000..e208ac3
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/nv_matrix.cpp
@@ -0,0 +1,1030 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_matrix.h"
+
+int NvDifferentMatsf(GLfloat a[4][4], const GLfloat b[4][4])
+{
+ return ((&a[3][3] < &b[0][0]) || (&b[3][3] < &a[0][0]));
+}
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+}
+
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+}
+
+GLfloat NvVecLengthf(const GLfloat v[3])
+{
+ return sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+}
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3])
+{
+ GLfloat const l = NvVecLengthf(v);
+ r[0] = v[0] / l;
+ r[1] = v[1] / l;
+ r[2] = v[2] / l;
+}
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] + b[0];
+ r[1] = a[1] + b[1];
+ r[2] = a[2] + b[2];
+}
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] - b[0];
+ r[1] = a[1] - b[1];
+ r[2] = a[2] - b[2];
+}
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ GLfloat t[3];
+
+ t[0] = a[1] * b[2] - a[2] * b[1];
+ t[1] = a[2] * b[0] - a[0] * b[2];
+ t[2] = a[0] * b[1] - a[1] * b[0];
+
+ r[0] = t[0];
+ r[1] = t[1];
+ r[2] = t[2];
+}
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ GLfloat inv_w = 1.0f / (m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3]);
+
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * inv_w;
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * inv_w;
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * inv_w;
+}
+
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * a[3];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * a[3];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * a[3];
+ r[3] = m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3] * a[3];
+}
+
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2];
+}
+
+static void NvMultMat3x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2];
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x4f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2] + a[3][0] * b[0][3];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2] + a[3][1] * b[0][3];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2] + a[3][2] * b[0][3];
+ r[0][3] = a[0][3] * b[0][0] + a[1][3] * b[0][1] + a[2][3] * b[0][2] + a[3][3] * b[0][3];
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2] + a[3][0] * b[1][3];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2] + a[3][1] * b[1][3];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2] + a[3][2] * b[1][3];
+ r[1][3] = a[0][3] * b[1][0] + a[1][3] * b[1][1] + a[2][3] * b[1][2] + a[3][3] * b[1][3];
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2] + a[3][0] * b[2][3];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2] + a[3][1] * b[2][3];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2] + a[3][2] * b[2][3];
+ r[2][3] = a[0][3] * b[2][0] + a[1][3] * b[2][1] + a[2][3] * b[2][2] + a[3][3] * b[2][3];
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0] * b[3][3];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1] * b[3][3];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2] * b[3][3];
+ r[3][3] = a[0][3] * b[3][0] + a[1][3] * b[3][1] + a[2][3] * b[3][2] + a[3][3] * b[3][3];
+}
+
+void NvMultMatf(GLfloat result[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((a[0][3] == 0.0f) && (a[1][3] == 0.0f) && (a[2][3] == 0.0f) && (a[2][3] == 1.0f)
+ && (b[0][3] == 0.0f) && (b[1][3] == 0.0f) && (b[2][3] == 0.0f) && (b[2][3] == 1.0f)) {
+ if ((a[3][0] == 0.0f) && (a[3][1] == 0.0f) && (a[3][2] == 0.0f) && (b[3][0] == 0.0f)
+ && (b[3][1] == 0.0f) && (b[3][2] == 0.0f)) {
+ NvMultMat3x3f(r, a, b);
+ } else {
+ NvMultMat4x3f(r, a, b);
+ }
+ } else {
+ NvMultMat4x4f(r, a, b);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+static void NvInvMat3x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ /* x */
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ /* y */
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ /* z */
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x4f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] * m[3][3] + m[0][0] * m[1][2] * m[2][3] * m[3][1]
+ + m[0][0] * m[1][3] * m[2][1] * m[3][2] + m[0][1] * m[1][0] * m[2][3] * m[3][2]
+ + m[0][1] * m[1][2] * m[2][0] * m[3][3] + m[0][1] * m[1][3] * m[2][2] * m[3][0]
+ + m[0][2] * m[1][0] * m[2][1] * m[3][3] + m[0][2] * m[1][1] * m[2][3] * m[3][0]
+ + m[0][2] * m[1][3] * m[2][0] * m[3][1] + m[0][3] * m[1][0] * m[2][2] * m[3][1]
+ + m[0][3] * m[1][1] * m[2][0] * m[3][2] + m[0][3] * m[1][2] * m[2][1] * m[3][0]
+ + -m[0][0] * m[1][1] * m[2][3] * m[3][2] + -m[0][0] * m[1][2] * m[2][1] * m[3][3]
+ + -m[0][0] * m[1][3] * m[2][2] * m[3][1] + -m[0][1] * m[1][0] * m[2][2] * m[3][3]
+ + -m[0][1] * m[1][2] * m[2][3] * m[3][0] + -m[0][1] * m[1][3] * m[2][0] * m[3][2]
+ + -m[0][2] * m[1][0] * m[2][3] * m[3][1] + -m[0][2] * m[1][1] * m[2][0] * m[3][3]
+ + -m[0][2] * m[1][3] * m[2][1] * m[3][0] + -m[0][3] * m[1][0] * m[2][1] * m[3][2]
+ + -m[0][3] * m[1][1] * m[2][2] * m[3][0] + -m[0][3] * m[1][2] * m[2][0] * m[3][1];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] * m[3][3] + m[1][2] * m[2][3] * m[3][1]
+ + m[1][3] * m[2][1] * m[3][2] + -m[1][1] * m[2][3] * m[3][2]
+ + -m[1][2] * m[2][1] * m[3][3] + -m[1][3] * m[2][2] * m[3][1])
+ / d;
+
+ r[0][1] = (m[0][1] * m[2][3] * m[3][2] + m[0][2] * m[2][1] * m[3][3]
+ + m[0][3] * m[2][2] * m[3][1] + -m[0][1] * m[2][2] * m[3][3]
+ + -m[0][2] * m[2][3] * m[3][1] + -m[0][3] * m[2][1] * m[3][2])
+ / d;
+
+ r[0][2] = (m[0][1] * m[1][2] * m[3][3] + m[0][2] * m[1][3] * m[3][1]
+ + m[0][3] * m[1][1] * m[3][2] + -m[0][1] * m[1][3] * m[3][2]
+ + -m[0][2] * m[1][1] * m[3][3] + -m[0][3] * m[1][2] * m[3][1])
+ / d;
+
+ r[0][3] = (m[0][1] * m[1][3] * m[2][2] + m[0][2] * m[1][1] * m[2][3]
+ + m[0][3] * m[1][2] * m[2][1] + -m[0][1] * m[1][2] * m[2][3]
+ + -m[0][2] * m[1][3] * m[2][1] + -m[0][3] * m[1][1] * m[2][2])
+ / d;
+
+ r[1][0] = (m[1][0] * m[2][3] * m[3][2] + m[1][2] * m[2][0] * m[3][3]
+ + m[1][3] * m[2][2] * m[3][0] + -m[1][0] * m[2][2] * m[3][3]
+ + -m[1][2] * m[2][3] * m[3][0] + -m[1][3] * m[2][0] * m[3][2])
+ / d;
+
+ r[1][1] = (m[0][0] * m[2][2] * m[3][3] + m[0][2] * m[2][3] * m[3][0]
+ + m[0][3] * m[2][0] * m[3][2] + -m[0][0] * m[2][3] * m[3][2]
+ + -m[0][2] * m[2][0] * m[3][3] + -m[0][3] * m[2][2] * m[3][0])
+ / d;
+
+ r[1][2] = (m[0][0] * m[1][3] * m[3][2] + m[0][2] * m[1][0] * m[3][3]
+ + m[0][3] * m[1][2] * m[3][0] + -m[0][0] * m[1][2] * m[3][3]
+ + -m[0][2] * m[1][3] * m[3][0] + -m[0][3] * m[1][0] * m[3][2])
+ / d;
+
+ r[1][3] = (m[0][0] * m[1][2] * m[2][3] + m[0][2] * m[1][3] * m[2][0]
+ + m[0][3] * m[1][0] * m[2][2] + -m[0][0] * m[1][3] * m[2][2]
+ + -m[0][2] * m[1][0] * m[2][3] + -m[0][3] * m[1][2] * m[2][0])
+ / d;
+
+ r[2][0] = (m[1][0] * m[2][1] * m[3][3] + m[1][1] * m[2][3] * m[3][0]
+ + m[1][3] * m[2][0] * m[3][1] + -m[1][0] * m[2][3] * m[3][1]
+ + -m[1][1] * m[2][0] * m[3][3] + -m[1][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][1] =
+ (-m[0][0] * m[2][1] * m[3][3] + -m[0][1] * m[2][3] * m[3][0] + -m[0][3] * m[2][0] * m[3][1]
+ + m[0][0] * m[2][3] * m[3][1] + m[0][1] * m[2][0] * m[3][3] + m[0][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][2] = (m[0][0] * m[1][1] * m[3][3] + m[0][1] * m[1][3] * m[3][0]
+ + m[0][3] * m[1][0] * m[3][1] + -m[0][0] * m[1][3] * m[3][1]
+ + -m[0][1] * m[1][0] * m[3][3] + -m[0][3] * m[1][1] * m[3][0])
+ / d;
+
+ r[2][3] = (m[0][0] * m[1][3] * m[2][1] + m[0][1] * m[1][0] * m[2][3]
+ + m[0][3] * m[1][1] * m[2][0] + -m[0][1] * m[1][3] * m[2][0]
+ + -m[0][3] * m[1][0] * m[2][1] + -m[0][0] * m[1][1] * m[2][3])
+ / d;
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = (m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1]
+ + -m[0][1] * m[1][0] * m[2][2] + -m[0][2] * m[1][1] * m[2][0])
+ / d;
+}
+
+void NvInvMatf(GLfloat result[4][4], const GLfloat m[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((m[0][3] == 0.0f) && (m[1][3] == 0.0f) && (m[2][3] == 0.0f) && (m[2][3] == 1.0f)) {
+ if ((m[3][0] == 0.0f) && (m[3][1] == 0.0f) && (m[3][2] == 0.0f)) {
+ NvInvMat3x3f(r, m);
+ } else {
+ NvInvMat4x3f(r, m);
+ }
+ } else {
+ NvInvMat4x4f(r, m);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildIdentityMatf(GLfloat r[4][4])
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = x;
+ r[3][1] = y;
+ r[3][2] = z;
+ r[3][3] = 1.0f;
+}
+
+void NvMultTranslateMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y,
+ GLfloat z)
+{
+ GLfloat r[4][4]; /*temporary storage for result */
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[0][0] * x + m[1][0] * y + m[2][0] * z + m[3][0];
+ r[3][1] = m[0][1] * x + m[1][1] * y + m[2][1] * z + m[3][1];
+ r[3][2] = m[0][2] * x + m[1][2] * y + m[2][2] * z + m[3][2];
+ r[3][3] = m[0][3] * x + m[1][3] * y + m[2][3] * z + m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = x;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = y;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = z;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultScaleMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * x;
+ r[0][1] = m[0][1] * x;
+ r[0][2] = m[0][2] * x;
+ r[0][3] = m[0][3] * x;
+
+ r[1][0] = m[1][0] * y;
+ r[1][1] = m[1][1] * y;
+ r[1][2] = m[1][2] * y;
+ r[1][3] = m[1][3] * y;
+
+ r[2][0] = m[2][0] * z;
+ r[2][1] = m[2][1] * z;
+ r[2][2] = m[2][2] * z;
+ r[2][3] = m[2][3] * z;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = c;
+ r[1][2] = s;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = -s;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = 0.0f;
+ r[0][2] = -s;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = s;
+ r[2][1] = 0.0f;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = s;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = -s;
+ r[1][1] = c;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultRotXRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0] * c + m[2][0] * s;
+ r[1][1] = m[1][1] * c + m[2][1] * s;
+ r[1][2] = m[1][2] * c + m[2][2] * s;
+ r[1][3] = m[1][3] * c + m[2][3] * s;
+
+ r[2][0] = m[1][0] * -s + m[2][0] * c;
+ r[2][1] = m[1][1] * -s + m[2][1] * c;
+ r[2][2] = m[1][2] * -s + m[2][2] * c;
+ r[2][3] = m[1][3] * -s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotYRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[2][0] * -s;
+ r[0][1] = m[0][1] * c + m[2][1] * -s;
+ r[0][2] = m[0][2] * c + m[2][2] * -s;
+ r[0][3] = m[0][3] * c + m[2][3] * -s;
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[0][0] * s + m[2][0] * c;
+ r[2][1] = m[0][1] * s + m[2][1] * c;
+ r[2][2] = m[0][2] * s + m[2][2] * c;
+ r[2][3] = m[0][3] * s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotZRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[1][0] * s;
+ r[0][1] = m[0][1] * c + m[1][1] * s;
+ r[0][2] = m[0][2] * c + m[1][2] * s;
+ r[0][3] = m[0][3] * c + m[1][3] * s;
+
+ r[1][0] = m[0][0] * -s + m[1][0] * c;
+ r[1][1] = m[0][1] * -s + m[1][1] * c;
+ r[1][2] = m[0][2] * -s + m[1][2] * c;
+ r[1][3] = m[0][3] * -s + m[1][3] * c;
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotRadMatf(GLfloat result[4][4], const GLfloat axis[3], GLfloat radians)
+{
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ /* build a matrix from the quat */
+
+ result[0][0] = 1.0f - 2.0f * (j * j + k * k);
+ result[0][1] = 2.0f * (i * j + r * k);
+ result[0][2] = 2.0f * (i * k - r * j);
+ result[0][3] = 0.0f;
+
+ result[1][0] = 2.0f * (i * j - r * k);
+ result[1][1] = 1.0f - 2.0f * (i * i + k * k);
+ result[1][2] = 2.0f * (j * k + r * i);
+ result[1][3] = 0.0f;
+
+ result[2][0] = 2.0f * (i * k + r * j);
+ result[2][1] = 2.0f * (j * k - r * i);
+ result[2][2] = 1.0f - 2.0f * (i * i + j * j);
+ result[2][3] = 0.0f;
+
+ result[3][0] = 0.0f;
+ result[3][1] = 0.0f;
+ result[3][2] = 0.0f;
+ result[3][3] = 1.0f;
+}
+
+void NvMultRotRadMatf(GLfloat result[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians)
+{
+ GLfloat r[4][4];
+
+ {
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat const dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ {
+ /* build a matrix from the quat */
+
+ GLfloat const a00 = 1.0f - 2.0f * (j * j + k * k);
+ GLfloat const a01 = 2.0f * (i * j + r * k);
+ GLfloat const a02 = 2.0f * (i * k - r * j);
+
+ GLfloat const a10 = 2.0f * (i * j - r * k);
+ GLfloat const a11 = 1.0f - 2.0f * (i * i + k * k);
+ GLfloat const a12 = 2.0f * (j * k + r * i);
+
+ GLfloat const a20 = 2.0f * (i * k + r * j);
+ GLfloat const a21 = 2.0f * (j * k - r * i);
+ GLfloat const a22 = 1.0f - 2.0f * (i * i + j * j);
+
+ result[0][0] = m[0][0] * a00 + m[1][0] * a01 + m[2][0] * a02;
+ result[0][1] = m[0][1] * a00 + m[1][1] * a01 + m[2][1] * a02;
+ result[0][2] = m[0][2] * a00 + m[1][2] * a01 + m[2][2] * a02;
+ result[0][3] = m[0][3] * a00 + m[1][3] * a01 + m[2][3] * a02;
+
+ result[1][0] = m[0][0] * a10 + m[1][0] * a11 + m[2][0] * a12;
+ result[1][1] = m[0][1] * a10 + m[1][1] * a11 + m[2][1] * a12;
+ result[1][2] = m[0][2] * a10 + m[1][2] * a11 + m[2][2] * a12;
+ result[1][3] = m[0][3] * a10 + m[1][3] * a11 + m[2][3] * a12;
+
+ result[2][0] = m[0][0] * a20 + m[1][0] * a21 + m[2][0] * a22;
+ result[2][1] = m[0][1] * a20 + m[1][1] * a21 + m[2][1] * a22;
+ result[2][2] = m[0][2] * a20 + m[1][2] * a21 + m[2][2] * a22;
+ result[2][3] = m[0][3] * a20 + m[1][3] * a21 + m[2][3] * a22;
+
+ result[3][0] = m[3][0];
+ result[3][1] = m[3][1];
+ result[3][2] = m[3][2];
+ result[3][3] = m[3][3];
+ }
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotXRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotYRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotZRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotXRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotYRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotZRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees)
+{
+ NvBuildRotRadMatf(r, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees)
+{
+ NvMultRotRadMatf(r, m, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3])
+{
+ GLfloat ev[3];
+ GLfloat z[3];
+ GLfloat x_tmp[3];
+ GLfloat x[3];
+ GLfloat y[3];
+
+ NvSubVecf(ev, eye, obj);
+
+ NvNormalizeVecf(z, ev);
+
+ NvCrossProductf(x_tmp, up, z);
+
+ NvNormalizeVecf(x, x_tmp);
+
+ NvCrossProductf(y, z, x);
+
+ r[0][0] = x[0];
+ r[0][1] = y[0];
+ r[0][2] = z[0];
+ r[0][3] = 0.0f;
+
+ r[1][0] = x[1];
+ r[1][1] = y[1];
+ r[1][2] = z[1];
+ r[1][3] = 0.0f;
+
+ r[2][0] = x[2];
+ r[2][1] = y[2];
+ r[2][2] = z[2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = -x[0] * eye[0] + -x[1] * eye[1] + -x[2] * eye[2];
+ r[3][1] = -y[0] * eye[0] + -y[1] * eye[1] + -y[2] * eye[2];
+ r[3][2] = -z[0] * eye[0] + -z[1] * eye[1] + -z[2] * eye[2];
+ r[3][3] = 1.0f;
+}
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const m00 = znear * 2.0f / (right - left);
+ GLfloat const m11 = znear * 2.0f / (top - bottom);
+ GLfloat const m22 = -(zfar + znear) / (zfar - znear);
+
+ GLfloat const m20 = (right + left) / (right - left);
+ GLfloat const m21 = (top + bottom) / (top - bottom);
+
+ GLfloat const m32 = -(2.0f * zfar * znear) / (zfar - znear);
+ GLfloat const m23 = -1.0f;
+
+ r[0][0] = m00;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = m11;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = m20;
+ r[2][1] = m21;
+ r[2][2] = m22;
+ r[2][3] = m23;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = m32;
+ r[3][3] = 0.0f;
+}
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+ GLfloat const sz = -2.0f / (zfar - znear);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+ GLfloat const tz = -(zfar + znear) / (zfar - znear);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = sz;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = tz;
+ r[3][3] = 1.0f;
+}
diff --git a/src/platformspecific/android/jni/libs/nv_math/nv_matrix.h b/src/platformspecific/android/jni/libs/nv_math/nv_matrix.h
new file mode 100644
index 0000000..2a8e186
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/nv_matrix.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_MATRIX_H
+#define INCLUDED_MATRIX_H
+
+#include <GLES2/gl2.h>
+#include <math.h>
+#include <assert.h>
+
+#define KD_FLT_EPSILON 1.19209290E-07F
+#define KD_DEG_TO_RAD_F 0.0174532924F
+#define KD_RAD_TO_DEG_F 57.2957802F
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4]);
+
+/* vector utilities */
+
+GLfloat NvVecLengthf(const GLfloat v[3]);
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3]);
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4]);
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+
+/* matrix utilities */
+
+void NvMultMatf(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4]);
+
+void NvInvMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+
+/* matrix building utilities */
+
+void NvBuildIdentityMatf(GLfloat r[4][4]);
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees);
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees);
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians);
+
+void NvBuildRotRadMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat radians);
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3]);
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top);
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+/* matrix concatenation utilities */
+
+void NvMultTranslateMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+void NvMultScaleMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees);
+
+void NvMultRotXRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotYRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotZRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+
+void NvMultRotRadMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians);
+
+#endif
diff --git a/src/platformspecific/android/jni/libs/nv_math/nv_quat.cpp b/src/platformspecific/android/jni/libs/nv_math/nv_quat.cpp
new file mode 100644
index 0000000..6dc6d1a
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/nv_quat.cpp
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_quat.h"
+#include <stdlib.h>
+#include <cstring>
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4])
+{
+ memcpy(r, q, 4 * sizeof(GLfloat));
+}
+
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4])
+{
+ // Assumes that the quaternion is normalized!
+ GLfloat x2 = q[0] * 2.0f;
+ GLfloat y2 = q[1] * 2.0f;
+ GLfloat z2 = q[2] * 2.0f;
+ GLfloat xSq2 = x2 * q[0];
+ GLfloat ySq2 = y2 * q[1];
+ GLfloat zSq2 = z2 * q[2];
+ GLfloat xy2 = x2 * q[1];
+ GLfloat xz2 = x2 * q[2];
+ GLfloat xw2 = x2 * q[3];
+ GLfloat yz2 = y2 * q[2];
+ GLfloat yw2 = y2 * q[3];
+ GLfloat zw2 = z2 * q[3];
+
+ /* Matrix is
+ * | 1 - 2y^2 - 2z^2 2xy - 2zw 2xz + 2yw |
+ * | 2xy + 2zw 1 - 2x^2 - 2z^2 2yz - 2xw |
+ * | 2xz - 2yw 2yz + 2xw 1 - 2x^2 - 2y^2 |
+ */
+ r[0][0] = 1.0f - ySq2 - zSq2;
+ r[0][1] = xy2 - zw2;
+ r[0][2] = xz2 + yw2;
+
+ r[1][0] = xy2 + zw2;
+ r[1][1] = 1.0f - xSq2 - zSq2;
+ r[1][2] = yz2 - xw2;
+
+ r[2][0] = xz2 - yw2;
+ r[2][1] = yz2 + xw2;
+ r[2][2] = 1.0f - xSq2 - ySq2;
+}
+
+void NvQuatIdentity(GLfloat r[4])
+{
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = 1.0f;
+}
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3])
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = axis[0] * sina;
+ r[1] = axis[1] * sina;
+ r[2] = axis[2] * sina;
+ r[3] = cosa;
+}
+
+void NvQuatX(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = sina;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatY(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = sina;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatZ(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = sina;
+ r[3] = cosa;
+}
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatY(h, heading);
+ NvQuatX(p, pitch);
+ NvQuatZ(ro, roll);
+
+ NvQuatMult(r, h, p);
+ NvQuatMult(r, ro, r);
+}
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatZ(ro, roll);
+ NvQuatX(p, pitch);
+ NvQuatY(h, heading);
+
+ NvQuatMult(r, p, h);
+ NvQuatMult(r, r, ro);
+}
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4])
+{
+ return q1[0] * q2[0] + q1[1] * q2[1] + q1[2] * q2[2] + q1[3] * q2[3];
+}
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4])
+{
+ const GLfloat q1x = q1[0];
+ const GLfloat q1y = q1[1];
+ const GLfloat q1z = q1[2];
+ const GLfloat q1w = q1[3];
+ const GLfloat q2x = q2[0];
+ const GLfloat q2y = q2[1];
+ const GLfloat q2z = q2[2];
+ const GLfloat q2w = q2[3];
+
+ r[0] = q1y * q2z - q2y * q1z + q1w * q2x + q2w * q1x;
+ r[1] = q1z * q2x - q2z * q1x + q1w * q2y + q2w * q1y;
+ r[2] = q1x * q2y - q2x * q1y + q1w * q2z + q2w * q1z;
+ r[3] = q1w * q2w - q1x * q2x - q1y * q2y - q1z * q2z;
+}
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t)
+{
+ GLfloat omt = 1.0f - t;
+
+ if (NvQuatDot(q1, q2) < 0.0f) {
+ r[0] = -q1[0] * omt + q2[0] * t;
+ r[1] = -q1[1] * omt + q2[1] * t;
+ r[2] = -q1[2] * omt + q2[2] * t;
+ r[3] = -q1[3] * omt + q2[3] * t;
+ } else {
+ r[0] = q1[0] * omt + q2[0] * t;
+ r[1] = q1[1] * omt + q2[1] * t;
+ r[2] = q1[2] * omt + q2[2] * t;
+ r[3] = q1[3] * omt + q2[3] * t;
+ }
+
+ NvQuatNormalize(r, r);
+}
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4])
+{
+ GLfloat invLength = 1.0f / sqrtf(NvQuatDot(q, q));
+
+ r[0] = invLength * q[0];
+ r[1] = invLength * q[1];
+ r[2] = invLength * q[2];
+ r[3] = invLength * q[3];
+}
diff --git a/src/platformspecific/android/jni/libs/nv_math/nv_quat.h b/src/platformspecific/android/jni/libs/nv_math/nv_quat.h
new file mode 100644
index 0000000..688c30a
--- /dev/null
+++ b/src/platformspecific/android/jni/libs/nv_math/nv_quat.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QUAT_H
+#define INCLUDED_QUAT_H
+
+#include <GLES2/gl2.h>
+#include <math.h>
+#include <assert.h>
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4]);
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4]);
+
+void NvQuatIdentity(GLfloat r[4]);
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3]);
+
+void NvQuatX(GLfloat r[4], GLfloat radians);
+
+void NvQuatY(GLfloat r[4], GLfloat radians);
+
+void NvQuatZ(GLfloat r[4], GLfloat radians);
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t);
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4]);
+
+#endif
diff --git a/src/platformspecific/linux/assets/courier+lucida_256.abc b/src/platformspecific/linux/assets/courier+lucida_256.abc
new file mode 100644
index 0000000..f7e3c2f
--- /dev/null
+++ b/src/platformspecific/linux/assets/courier+lucida_256.abc
Binary files differ
diff --git a/src/platformspecific/linux/assets/courier+lucida_256.dds b/src/platformspecific/linux/assets/courier+lucida_256.dds
new file mode 100644
index 0000000..5bde760
--- /dev/null
+++ b/src/platformspecific/linux/assets/courier+lucida_256.dds
Binary files differ
diff --git a/src/platformspecific/linux/assets/courier+lucida_512.abc b/src/platformspecific/linux/assets/courier+lucida_512.abc
new file mode 100644
index 0000000..2ff7875
--- /dev/null
+++ b/src/platformspecific/linux/assets/courier+lucida_512.abc
Binary files differ
diff --git a/src/platformspecific/linux/assets/courier+lucida_512.dds b/src/platformspecific/linux/assets/courier+lucida_512.dds
new file mode 100644
index 0000000..f9e76d9
--- /dev/null
+++ b/src/platformspecific/linux/assets/courier+lucida_512.dds
Binary files differ
diff --git a/src/platformspecific/linux/assets/font.frag b/src/platformspecific/linux/assets/font.frag
new file mode 100644
index 0000000..e4673cf
--- /dev/null
+++ b/src/platformspecific/linux/assets/font.frag
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+uniform sampler2D fontTex;
+
+varying lowp vec4 col_var;
+varying lowp vec2 tex_var;
+
+void main()
+{
+ gl_FragColor = texture2D(fontTex, tex_var).a * col_var;
+}
+
diff --git a/src/platformspecific/linux/assets/font.vert b/src/platformspecific/linux/assets/font.vert
new file mode 100644
index 0000000..9f307a2
--- /dev/null
+++ b/src/platformspecific/linux/assets/font.vert
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+// this is set from higher level. think of it as the upper model matrix
+uniform mat4 pixelToClipMat;
+
+uniform vec4 col_uni;
+
+attribute vec2 pos_attr;
+attribute vec2 tex_attr;
+attribute vec4 col_attr;
+
+varying vec4 col_var;
+varying vec2 tex_var;
+
+void main()
+{
+ // account for translation and rotation of the primitive into [-1,1] spatial default.
+ gl_Position = pixelToClipMat * vec4(pos_attr.x, pos_attr.y, 0, 1);
+
+ col_var = col_attr * col_uni;
+ tex_var = tex_attr;
+}
diff --git a/src/platformspecific/linux/libs/nv_color.h b/src/platformspecific/linux/libs/nv_color.h
new file mode 100644
index 0000000..b934752
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_color.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _QT3DS_COLOR_H
+#define _QT3DS_COLOR_H
+
+/** @file nv_color.h
+ Simple abstraction for RGBA colors as parameters to various libraries/functions.
+*/
+
+/** Base type for a single color channel (8-bit unsigned). */
+typedef unsigned char NvPCColor8;
+
+//#define NV_COLOR_BREAKOLD
+#ifdef NV_COLOR_BREAKOLD // uses a struct to break backwards-compat and accidental uses
+
+typedef struct
+{
+ NvPCColor8 r;
+ NvPCColor8 g;
+ NvPCColor8 b;
+ NvPCColor8 a;
+} NvPackedColor;
+
+static const NvPackedColor gnvpcwhite = { 255, 255, 255, 255 };
+static const NvPackedColor gnvpcblack = { 0, 0, 0, 255 };
+
+#define NV_PACKED_COLOR(r, g, b, a) \
+ { \
+ (NvPCColor8)(r), (NvPCColor8)(g), (NvPCColor8)(b), (NvPCColor8)(a) \
+ }
+
+#define NV_PC_PREDEF_WHITE gnvpcwhite
+#define NV_PC_PREDEF_BLACK gnvpcblack
+
+#define NV_PC_RED(c) (c.r)
+#define NV_PC_GREEN(c) (c.g)
+#define NV_PC_BLUE(c) (c.b)
+#define NV_PC_ALPHA(c) (c.a)
+
+#define NV_PC_PACK_UINT(c) (*(unsigned int *)(&(c)))
+
+#define NV_PC_EQUAL(x, y) ((x).r == (y).r && (x).g == (y).g && (x).b == (y).b && (x).a == (y).a)
+
+#else /* code that doesn't break old pass-as-uint stuff */
+
+/** Main type declaration for a packed 4-color construct. */
+typedef unsigned int NvPackedColor;
+
+/** A macro to build a packed color, passing in RGBA as four 8-bit integer values. */
+#define NV_PACKED_COLOR(r, g, b, a) \
+ ((NvPackedColor)(((((int)(a)) & 0xFF) << 24) | ((((int)(b)) & 0xFF) << 16) \
+ | ((((int)(g)) & 0xFF) << 8) | ((((int)(r)) & 0xFF))))
+
+/** A predefined constant for WHITE. */
+#define NV_PC_PREDEF_WHITE NV_PACKED_COLOR(0xFF, 0xFF, 0xFF, 0xFF)
+/** A predefined constant for BLACK. */
+#define NV_PC_PREDEF_BLACK NV_PACKED_COLOR(0x00, 0x00, 0x00, 0xFF)
+
+/** A macro for 'extracting' the red value from an NvPackedColor. */
+#define NV_PC_RED(c) ((c >> 0) & 0xff)
+/** A macro for 'extracting' the green value from an NvPackedColor. */
+#define NV_PC_GREEN(c) ((c >> 8) & 0xff)
+/** A macro for 'extracting' the blue value from an NvPackedColor. */
+#define NV_PC_BLUE(c) ((c >> 16) & 0xff)
+/** A macro for 'extracting' the alpha value from an NvPackedColor. */
+#define NV_PC_ALPHA(c) ((c >> 24) & 0xff)
+
+/** A macro requesting the packed color repacked into a 32-bit unsigned int.
+ This is a no-op for the color-as-uint approach.
+*/
+#define NV_PC_PACK_UINT(c) (c)
+/** A macro for testing the equality of two NvPackedColors. */
+#define NV_PC_EQUAL(x, y) (x == y)
+#endif
+
+/** A macro for mapping a single packed color channel into its floating point [0,1] rep. */
+#define NV_PC_TO_FLOAT(c) (c / 255.0f)
+
+#endif /*_QT3DS_COLOR_H*/
diff --git a/src/platformspecific/linux/libs/nv_debug.h b/src/platformspecific/linux/libs/nv_debug.h
new file mode 100644
index 0000000..2559dd6
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_debug.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_DEBUG_H
+#define __INCLUDED_QT3DS_DEBUG_H
+
+#define CT_ASSERT(tag, cond) enum { COMPILE_TIME_ASSERT__##tag = 1 / (cond) }
+
+#define dimof(x) (sizeof(x) / sizeof(x[0]))
+#include <android/log.h>
+
+#define DBG_DETAILED 0
+
+#if 0
+
+ // the detailed prefix can be customised by setting DBG_DETAILED_PREFIX. See
+ // below as a reference.
+ // NOTE: fmt is the desired format string and must be in the prefix.
+ //#ifndef DBG_DETAILED_PREFIX
+ // #define DBG_DETAILED_PREFIX "%s, %s, line %d: " fmt, __FILE__, __FUNCTION__, __LINE__,
+ //#endif
+ //#define DEBUG_D_(fmt, args...)
+ //#define DEBUG_D(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, (DBG_DETAILED_PREFIX) ## args)
+
+#else
+
+#ifdef STRINGIFY
+#pragma push_macro("STRINGIFY")
+#undef STRINGIFY
+#define STRINGIFYPUSHED_____
+#endif
+#define STRINGIFY(x) #x
+
+// debug macro, includes file name function name and line number
+#define TO(x) typeof(x)
+#define DEBUG_D_(file, line, fmt, args...) \
+ __android_log_print(ANDROID_LOG_DEBUG, MODULE, file ", %s, line(" STRINGIFY(line) "): " fmt, \
+ __FUNCTION__, ##args)
+#define DEBUG_D(fmt, args...) DEBUG_D_(__FILE__, __LINE__, fmt, ##args)
+
+#ifdef STRINGIFYPUSHED_____
+#undef STRINGIFYPUSHED_____
+#pragma pop_macro("STRINGIFY")
+#endif
+
+#endif
+
+// basic debug macro
+#define DEBUG_(fmt, args...) (__android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ##args))
+
+// Debug macro that can be switched to spew a file name,
+// function and line number using DEBUG_DETAILED
+#if DBG_DETAILED == 1
+#define DEBUG(fmt, args...) DEBUG_D(fmt, ##args)
+#else
+#define DEBUG(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ##args)
+#endif
+
+#endif
diff --git a/src/platformspecific/linux/libs/nv_global.h b/src/platformspecific/linux/libs/nv_global.h
new file mode 100644
index 0000000..9d23d45
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_global.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_GLOBAL_H
+#define __INCLUDED_QT3DS_GLOBAL_H
+
+#include "nv_types.h"
+
+#endif
diff --git a/src/platformspecific/linux/libs/nv_math/NvVec.h b/src/platformspecific/linux/libs/nv_math/NvVec.h
new file mode 100644
index 0000000..4e5b09c
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/NvVec.h
@@ -0,0 +1,316 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_VEC_H
+#define INCLUDED_QT3DS_MATH_CPP_VEC_H
+
+#include "misc.h"
+
+struct _NvVec3
+{
+ union {
+ struct
+ {
+ float x, y, z;
+ };
+ float v[3];
+ };
+};
+
+struct NvVec3 : public _NvVec3
+{
+ NvVec3() { zero(); }
+
+ NvVec3(float x, float y, float z)
+ {
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+ }
+
+ NvVec3(NvVec3 const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ v[2] = that.v[2];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ v[2] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec3 &operator+=(NvVec3 const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ v[2] += that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator-=(NvVec3 const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ v[2] -= that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+ return *this;
+ }
+
+ NvVec3 &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ v[2] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec3 const &a, NvVec3 const &b)
+{
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+inline NvVec3 operator+(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] + b.v[0], a.v[1] + b.v[1], a.v[2] + b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] - b.v[0], a.v[1] - b.v[1], a.v[2] - b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a)
+{
+
+ return NvVec3(-a.v[0], -a.v[1], -a.v[2]);
+}
+
+inline NvVec3 operator*(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] * s, a.v[1] * s, a.v[2] * s);
+}
+
+inline NvVec3 operator*(float s, NvVec3 const &a)
+{
+
+ return NvVec3(s * a.v[0], s * a.v[1], s * a.v[2]);
+}
+
+inline NvVec3 operator/(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] / s, a.v[1] / s, a.v[2] / s);
+}
+
+inline float magnitude(NvVec3 const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec3 normalize(NvVec3 const &v)
+{
+ float l = magnitude(v);
+ return NvVec3(v[0] / l, v[1] / l, v[2] / l);
+}
+
+inline NvVec3 cross(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[1] * b.v[2] - a.v[2] * b.v[1], a.v[2] * b.v[0] - a.v[0] * b.v[2],
+ a.v[0] * b.v[1] - a.v[1] * b.v[0]);
+}
+
+inline bool operator==(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] == b.v[0] && a.v[1] == b.v[1] && a.v[2] == b.v[2]);
+}
+
+inline bool operator!=(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] != b.v[0] || a.v[1] != b.v[1] || a.v[2] != b.v[2]);
+}
+
+struct NvVec2f
+{
+ union {
+ struct
+ {
+ float x, y;
+ float v[2];
+ };
+ };
+
+ NvVec2f() { zero(); }
+
+ NvVec2f(float x, float y)
+ {
+ v[0] = x;
+ v[1] = y;
+ }
+
+ NvVec2f(NvVec2f const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec2f &operator+=(NvVec2f const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator-=(NvVec2f const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ return *this;
+ }
+
+ NvVec2f &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a[0] * b[0] + a[1] * b[1];
+}
+
+inline NvVec2f operator+(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] + b.v[0], a.v[1] + b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] - b.v[0], a.v[1] - b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a)
+{
+
+ return NvVec2f(-a.v[0], -a.v[1]);
+}
+
+inline NvVec2f operator*(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] * s, a.v[1] * s);
+}
+
+inline NvVec2f operator*(float s, NvVec2f const &a)
+{
+
+ return NvVec2f(s * a.v[0], s * a.v[1]);
+}
+
+inline NvVec2f operator/(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] / s, a.v[1] / s);
+}
+
+inline float magnitude(NvVec2f const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec2f normalize(NvVec2f const &v)
+{
+ float l = dot(v, v);
+ return NvVec2f(v[0] / l, v[1] / l);
+}
+
+inline float cross(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a.v[0] * b.v[1] - b.v[0] * a.v[1];
+}
+
+#endif
diff --git a/src/platformspecific/linux/libs/nv_math/misc.h b/src/platformspecific/linux/libs/nv_math/misc.h
new file mode 100644
index 0000000..983410f
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/misc.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_MISC_H
+#define INCLUDED_QT3DS_MATH_CPP_MISC_H
+
+inline bool nvIsPowerOfTwo(unsigned int i)
+{
+ return (i & (i - 1)) == 0;
+}
+
+inline float nvDegToRadf(float d)
+{
+ return d * 3.14159265358979323846f / 180.0f;
+}
+
+inline float nvRadToDegf(float r)
+{
+ return r * 180.0f / 3.14159265358979323846f;
+}
+
+/*
+ 'mod' differs from '%' in that it behaves correctly when either the
+ numerator or denominator is negative.
+*/
+
+inline int nvMod(int n, int d)
+{
+ int m = n % d;
+ return (((m < 0) && (d > 0)) || ((m > 0) && (d < 0))) ? (m + d) : m;
+}
+
+inline int nvAbs(int n)
+{
+ if (n < 0)
+ return -n;
+ return n;
+}
+
+inline int nvSign(int n)
+{
+ if (n > 0)
+ return 1;
+ if (n < 0)
+ return -1;
+ return 0;
+}
+
+/*
+ This returns the smallest amplitude value x such that
+ nvMod(b + x, m) == a
+*/
+
+inline int nvDifMod(int a, int b, int m)
+{
+
+ int x1 = a - b;
+ int x2 = (x1 > 0) ? x1 - m : x1 + m;
+ return (nvAbs(x1) < nvAbs(x2)) ? x1 : x2;
+}
+
+inline float nvWrapf(float a, float min, float max)
+{
+
+ assert(max > min);
+
+ float d = max - min;
+ float s = a - min;
+ float q = s / d;
+ float m = q - floorf(q);
+ return m * d + min;
+}
+
+inline float nvClampf(float a, float min, float max)
+{
+ return (a < min) ? min : ((a > max) ? max : a);
+}
+
+inline int nvClampi(int i, int min, int max)
+{
+ return (i < min) ? min : ((i > max) ? max : i);
+}
+
+inline float nvGaussian(float x, float s)
+{
+ float c = s * sqrtf(2.0f * 3.14159265358979323846f);
+ return expf(-(x * x) / (2.0f * s * s)) / c;
+}
+
+inline float nvLerpf(float a, float b, float t)
+{
+ return a * (1.0f - t) + b * t;
+}
+
+inline float nvEasef(float t)
+{
+
+ float t_2 = t * t;
+ float t_3 = t_2 * t;
+ return 3.0f * t_2 - 2.0f * t_3;
+}
+
+#endif
diff --git a/src/platformspecific/linux/libs/nv_math/nv_math.cpp b/src/platformspecific/linux/libs/nv_math/nv_math.cpp
new file mode 100644
index 0000000..b83cb39
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/nv_math.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_math.h"
+
+static const double a = 16807.0;
+static const double m = 2147483647.0;
+
+static double nextSeed(double seed)
+{
+ double t = a * seed;
+ return t - m * (double)((int)(t / m));
+}
+
+GLfloat NvRandf()
+{
+ static double seed = 1.0;
+ seed = nextSeed(seed);
+ return (GLfloat)(seed * (1 / m));
+}
+
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime)
+{
+ // kdGetTimeUST is never supposed to decrease (i.e. that
+ // means it can't wrap, either. IIRC, it will wrap in
+ // 593 years). So we ignore that option...
+
+ // Used for frame-to-frame diffs, this will fit in 32b
+ // as long as the times are < ~4.3s apart
+ long long int diffTime = newTime - oldTime;
+
+ // Need to find a better way to do this.
+ // However, I believe we will be uSec precise (not run
+ // out of mantissa bits for uSecs) as long as the diff
+ // is < ~16s (1e-6 * (2^24))
+ return ((GLfloat)diffTime) / 1.0e9f;
+}
diff --git a/src/platformspecific/linux/libs/nv_math/nv_math.h b/src/platformspecific/linux/libs/nv_math/nv_math.h
new file mode 100644
index 0000000..2ef7bba
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/nv_math.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _QT3DS_MATH_H
+#define _QT3DS_MATH_H
+
+#include <QtGui/qopengl.h>
+
+GLfloat NvRandf();
+
+/* These are the recommended "safer" ways to use GLfloat for time */
+
+/* Returns the seconds between the two given times */
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime);
+
+#define QT3DS_MILISECS_TO_UST(ms) ((long long int)(ms)*1000000)
+
+#endif
diff --git a/src/platformspecific/linux/libs/nv_math/nv_matrix.cpp b/src/platformspecific/linux/libs/nv_math/nv_matrix.cpp
new file mode 100644
index 0000000..e208ac3
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/nv_matrix.cpp
@@ -0,0 +1,1030 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_matrix.h"
+
+int NvDifferentMatsf(GLfloat a[4][4], const GLfloat b[4][4])
+{
+ return ((&a[3][3] < &b[0][0]) || (&b[3][3] < &a[0][0]));
+}
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+}
+
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+}
+
+GLfloat NvVecLengthf(const GLfloat v[3])
+{
+ return sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+}
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3])
+{
+ GLfloat const l = NvVecLengthf(v);
+ r[0] = v[0] / l;
+ r[1] = v[1] / l;
+ r[2] = v[2] / l;
+}
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] + b[0];
+ r[1] = a[1] + b[1];
+ r[2] = a[2] + b[2];
+}
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] - b[0];
+ r[1] = a[1] - b[1];
+ r[2] = a[2] - b[2];
+}
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ GLfloat t[3];
+
+ t[0] = a[1] * b[2] - a[2] * b[1];
+ t[1] = a[2] * b[0] - a[0] * b[2];
+ t[2] = a[0] * b[1] - a[1] * b[0];
+
+ r[0] = t[0];
+ r[1] = t[1];
+ r[2] = t[2];
+}
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ GLfloat inv_w = 1.0f / (m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3]);
+
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * inv_w;
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * inv_w;
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * inv_w;
+}
+
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * a[3];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * a[3];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * a[3];
+ r[3] = m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3] * a[3];
+}
+
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2];
+}
+
+static void NvMultMat3x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2];
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x4f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2] + a[3][0] * b[0][3];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2] + a[3][1] * b[0][3];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2] + a[3][2] * b[0][3];
+ r[0][3] = a[0][3] * b[0][0] + a[1][3] * b[0][1] + a[2][3] * b[0][2] + a[3][3] * b[0][3];
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2] + a[3][0] * b[1][3];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2] + a[3][1] * b[1][3];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2] + a[3][2] * b[1][3];
+ r[1][3] = a[0][3] * b[1][0] + a[1][3] * b[1][1] + a[2][3] * b[1][2] + a[3][3] * b[1][3];
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2] + a[3][0] * b[2][3];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2] + a[3][1] * b[2][3];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2] + a[3][2] * b[2][3];
+ r[2][3] = a[0][3] * b[2][0] + a[1][3] * b[2][1] + a[2][3] * b[2][2] + a[3][3] * b[2][3];
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0] * b[3][3];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1] * b[3][3];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2] * b[3][3];
+ r[3][3] = a[0][3] * b[3][0] + a[1][3] * b[3][1] + a[2][3] * b[3][2] + a[3][3] * b[3][3];
+}
+
+void NvMultMatf(GLfloat result[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((a[0][3] == 0.0f) && (a[1][3] == 0.0f) && (a[2][3] == 0.0f) && (a[2][3] == 1.0f)
+ && (b[0][3] == 0.0f) && (b[1][3] == 0.0f) && (b[2][3] == 0.0f) && (b[2][3] == 1.0f)) {
+ if ((a[3][0] == 0.0f) && (a[3][1] == 0.0f) && (a[3][2] == 0.0f) && (b[3][0] == 0.0f)
+ && (b[3][1] == 0.0f) && (b[3][2] == 0.0f)) {
+ NvMultMat3x3f(r, a, b);
+ } else {
+ NvMultMat4x3f(r, a, b);
+ }
+ } else {
+ NvMultMat4x4f(r, a, b);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+static void NvInvMat3x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ /* x */
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ /* y */
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ /* z */
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x4f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] * m[3][3] + m[0][0] * m[1][2] * m[2][3] * m[3][1]
+ + m[0][0] * m[1][3] * m[2][1] * m[3][2] + m[0][1] * m[1][0] * m[2][3] * m[3][2]
+ + m[0][1] * m[1][2] * m[2][0] * m[3][3] + m[0][1] * m[1][3] * m[2][2] * m[3][0]
+ + m[0][2] * m[1][0] * m[2][1] * m[3][3] + m[0][2] * m[1][1] * m[2][3] * m[3][0]
+ + m[0][2] * m[1][3] * m[2][0] * m[3][1] + m[0][3] * m[1][0] * m[2][2] * m[3][1]
+ + m[0][3] * m[1][1] * m[2][0] * m[3][2] + m[0][3] * m[1][2] * m[2][1] * m[3][0]
+ + -m[0][0] * m[1][1] * m[2][3] * m[3][2] + -m[0][0] * m[1][2] * m[2][1] * m[3][3]
+ + -m[0][0] * m[1][3] * m[2][2] * m[3][1] + -m[0][1] * m[1][0] * m[2][2] * m[3][3]
+ + -m[0][1] * m[1][2] * m[2][3] * m[3][0] + -m[0][1] * m[1][3] * m[2][0] * m[3][2]
+ + -m[0][2] * m[1][0] * m[2][3] * m[3][1] + -m[0][2] * m[1][1] * m[2][0] * m[3][3]
+ + -m[0][2] * m[1][3] * m[2][1] * m[3][0] + -m[0][3] * m[1][0] * m[2][1] * m[3][2]
+ + -m[0][3] * m[1][1] * m[2][2] * m[3][0] + -m[0][3] * m[1][2] * m[2][0] * m[3][1];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] * m[3][3] + m[1][2] * m[2][3] * m[3][1]
+ + m[1][3] * m[2][1] * m[3][2] + -m[1][1] * m[2][3] * m[3][2]
+ + -m[1][2] * m[2][1] * m[3][3] + -m[1][3] * m[2][2] * m[3][1])
+ / d;
+
+ r[0][1] = (m[0][1] * m[2][3] * m[3][2] + m[0][2] * m[2][1] * m[3][3]
+ + m[0][3] * m[2][2] * m[3][1] + -m[0][1] * m[2][2] * m[3][3]
+ + -m[0][2] * m[2][3] * m[3][1] + -m[0][3] * m[2][1] * m[3][2])
+ / d;
+
+ r[0][2] = (m[0][1] * m[1][2] * m[3][3] + m[0][2] * m[1][3] * m[3][1]
+ + m[0][3] * m[1][1] * m[3][2] + -m[0][1] * m[1][3] * m[3][2]
+ + -m[0][2] * m[1][1] * m[3][3] + -m[0][3] * m[1][2] * m[3][1])
+ / d;
+
+ r[0][3] = (m[0][1] * m[1][3] * m[2][2] + m[0][2] * m[1][1] * m[2][3]
+ + m[0][3] * m[1][2] * m[2][1] + -m[0][1] * m[1][2] * m[2][3]
+ + -m[0][2] * m[1][3] * m[2][1] + -m[0][3] * m[1][1] * m[2][2])
+ / d;
+
+ r[1][0] = (m[1][0] * m[2][3] * m[3][2] + m[1][2] * m[2][0] * m[3][3]
+ + m[1][3] * m[2][2] * m[3][0] + -m[1][0] * m[2][2] * m[3][3]
+ + -m[1][2] * m[2][3] * m[3][0] + -m[1][3] * m[2][0] * m[3][2])
+ / d;
+
+ r[1][1] = (m[0][0] * m[2][2] * m[3][3] + m[0][2] * m[2][3] * m[3][0]
+ + m[0][3] * m[2][0] * m[3][2] + -m[0][0] * m[2][3] * m[3][2]
+ + -m[0][2] * m[2][0] * m[3][3] + -m[0][3] * m[2][2] * m[3][0])
+ / d;
+
+ r[1][2] = (m[0][0] * m[1][3] * m[3][2] + m[0][2] * m[1][0] * m[3][3]
+ + m[0][3] * m[1][2] * m[3][0] + -m[0][0] * m[1][2] * m[3][3]
+ + -m[0][2] * m[1][3] * m[3][0] + -m[0][3] * m[1][0] * m[3][2])
+ / d;
+
+ r[1][3] = (m[0][0] * m[1][2] * m[2][3] + m[0][2] * m[1][3] * m[2][0]
+ + m[0][3] * m[1][0] * m[2][2] + -m[0][0] * m[1][3] * m[2][2]
+ + -m[0][2] * m[1][0] * m[2][3] + -m[0][3] * m[1][2] * m[2][0])
+ / d;
+
+ r[2][0] = (m[1][0] * m[2][1] * m[3][3] + m[1][1] * m[2][3] * m[3][0]
+ + m[1][3] * m[2][0] * m[3][1] + -m[1][0] * m[2][3] * m[3][1]
+ + -m[1][1] * m[2][0] * m[3][3] + -m[1][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][1] =
+ (-m[0][0] * m[2][1] * m[3][3] + -m[0][1] * m[2][3] * m[3][0] + -m[0][3] * m[2][0] * m[3][1]
+ + m[0][0] * m[2][3] * m[3][1] + m[0][1] * m[2][0] * m[3][3] + m[0][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][2] = (m[0][0] * m[1][1] * m[3][3] + m[0][1] * m[1][3] * m[3][0]
+ + m[0][3] * m[1][0] * m[3][1] + -m[0][0] * m[1][3] * m[3][1]
+ + -m[0][1] * m[1][0] * m[3][3] + -m[0][3] * m[1][1] * m[3][0])
+ / d;
+
+ r[2][3] = (m[0][0] * m[1][3] * m[2][1] + m[0][1] * m[1][0] * m[2][3]
+ + m[0][3] * m[1][1] * m[2][0] + -m[0][1] * m[1][3] * m[2][0]
+ + -m[0][3] * m[1][0] * m[2][1] + -m[0][0] * m[1][1] * m[2][3])
+ / d;
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = (m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1]
+ + -m[0][1] * m[1][0] * m[2][2] + -m[0][2] * m[1][1] * m[2][0])
+ / d;
+}
+
+void NvInvMatf(GLfloat result[4][4], const GLfloat m[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((m[0][3] == 0.0f) && (m[1][3] == 0.0f) && (m[2][3] == 0.0f) && (m[2][3] == 1.0f)) {
+ if ((m[3][0] == 0.0f) && (m[3][1] == 0.0f) && (m[3][2] == 0.0f)) {
+ NvInvMat3x3f(r, m);
+ } else {
+ NvInvMat4x3f(r, m);
+ }
+ } else {
+ NvInvMat4x4f(r, m);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildIdentityMatf(GLfloat r[4][4])
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = x;
+ r[3][1] = y;
+ r[3][2] = z;
+ r[3][3] = 1.0f;
+}
+
+void NvMultTranslateMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y,
+ GLfloat z)
+{
+ GLfloat r[4][4]; /*temporary storage for result */
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[0][0] * x + m[1][0] * y + m[2][0] * z + m[3][0];
+ r[3][1] = m[0][1] * x + m[1][1] * y + m[2][1] * z + m[3][1];
+ r[3][2] = m[0][2] * x + m[1][2] * y + m[2][2] * z + m[3][2];
+ r[3][3] = m[0][3] * x + m[1][3] * y + m[2][3] * z + m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = x;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = y;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = z;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultScaleMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * x;
+ r[0][1] = m[0][1] * x;
+ r[0][2] = m[0][2] * x;
+ r[0][3] = m[0][3] * x;
+
+ r[1][0] = m[1][0] * y;
+ r[1][1] = m[1][1] * y;
+ r[1][2] = m[1][2] * y;
+ r[1][3] = m[1][3] * y;
+
+ r[2][0] = m[2][0] * z;
+ r[2][1] = m[2][1] * z;
+ r[2][2] = m[2][2] * z;
+ r[2][3] = m[2][3] * z;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = c;
+ r[1][2] = s;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = -s;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = 0.0f;
+ r[0][2] = -s;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = s;
+ r[2][1] = 0.0f;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = s;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = -s;
+ r[1][1] = c;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultRotXRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0] * c + m[2][0] * s;
+ r[1][1] = m[1][1] * c + m[2][1] * s;
+ r[1][2] = m[1][2] * c + m[2][2] * s;
+ r[1][3] = m[1][3] * c + m[2][3] * s;
+
+ r[2][0] = m[1][0] * -s + m[2][0] * c;
+ r[2][1] = m[1][1] * -s + m[2][1] * c;
+ r[2][2] = m[1][2] * -s + m[2][2] * c;
+ r[2][3] = m[1][3] * -s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotYRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[2][0] * -s;
+ r[0][1] = m[0][1] * c + m[2][1] * -s;
+ r[0][2] = m[0][2] * c + m[2][2] * -s;
+ r[0][3] = m[0][3] * c + m[2][3] * -s;
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[0][0] * s + m[2][0] * c;
+ r[2][1] = m[0][1] * s + m[2][1] * c;
+ r[2][2] = m[0][2] * s + m[2][2] * c;
+ r[2][3] = m[0][3] * s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotZRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[1][0] * s;
+ r[0][1] = m[0][1] * c + m[1][1] * s;
+ r[0][2] = m[0][2] * c + m[1][2] * s;
+ r[0][3] = m[0][3] * c + m[1][3] * s;
+
+ r[1][0] = m[0][0] * -s + m[1][0] * c;
+ r[1][1] = m[0][1] * -s + m[1][1] * c;
+ r[1][2] = m[0][2] * -s + m[1][2] * c;
+ r[1][3] = m[0][3] * -s + m[1][3] * c;
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotRadMatf(GLfloat result[4][4], const GLfloat axis[3], GLfloat radians)
+{
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ /* build a matrix from the quat */
+
+ result[0][0] = 1.0f - 2.0f * (j * j + k * k);
+ result[0][1] = 2.0f * (i * j + r * k);
+ result[0][2] = 2.0f * (i * k - r * j);
+ result[0][3] = 0.0f;
+
+ result[1][0] = 2.0f * (i * j - r * k);
+ result[1][1] = 1.0f - 2.0f * (i * i + k * k);
+ result[1][2] = 2.0f * (j * k + r * i);
+ result[1][3] = 0.0f;
+
+ result[2][0] = 2.0f * (i * k + r * j);
+ result[2][1] = 2.0f * (j * k - r * i);
+ result[2][2] = 1.0f - 2.0f * (i * i + j * j);
+ result[2][3] = 0.0f;
+
+ result[3][0] = 0.0f;
+ result[3][1] = 0.0f;
+ result[3][2] = 0.0f;
+ result[3][3] = 1.0f;
+}
+
+void NvMultRotRadMatf(GLfloat result[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians)
+{
+ GLfloat r[4][4];
+
+ {
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat const dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ {
+ /* build a matrix from the quat */
+
+ GLfloat const a00 = 1.0f - 2.0f * (j * j + k * k);
+ GLfloat const a01 = 2.0f * (i * j + r * k);
+ GLfloat const a02 = 2.0f * (i * k - r * j);
+
+ GLfloat const a10 = 2.0f * (i * j - r * k);
+ GLfloat const a11 = 1.0f - 2.0f * (i * i + k * k);
+ GLfloat const a12 = 2.0f * (j * k + r * i);
+
+ GLfloat const a20 = 2.0f * (i * k + r * j);
+ GLfloat const a21 = 2.0f * (j * k - r * i);
+ GLfloat const a22 = 1.0f - 2.0f * (i * i + j * j);
+
+ result[0][0] = m[0][0] * a00 + m[1][0] * a01 + m[2][0] * a02;
+ result[0][1] = m[0][1] * a00 + m[1][1] * a01 + m[2][1] * a02;
+ result[0][2] = m[0][2] * a00 + m[1][2] * a01 + m[2][2] * a02;
+ result[0][3] = m[0][3] * a00 + m[1][3] * a01 + m[2][3] * a02;
+
+ result[1][0] = m[0][0] * a10 + m[1][0] * a11 + m[2][0] * a12;
+ result[1][1] = m[0][1] * a10 + m[1][1] * a11 + m[2][1] * a12;
+ result[1][2] = m[0][2] * a10 + m[1][2] * a11 + m[2][2] * a12;
+ result[1][3] = m[0][3] * a10 + m[1][3] * a11 + m[2][3] * a12;
+
+ result[2][0] = m[0][0] * a20 + m[1][0] * a21 + m[2][0] * a22;
+ result[2][1] = m[0][1] * a20 + m[1][1] * a21 + m[2][1] * a22;
+ result[2][2] = m[0][2] * a20 + m[1][2] * a21 + m[2][2] * a22;
+ result[2][3] = m[0][3] * a20 + m[1][3] * a21 + m[2][3] * a22;
+
+ result[3][0] = m[3][0];
+ result[3][1] = m[3][1];
+ result[3][2] = m[3][2];
+ result[3][3] = m[3][3];
+ }
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotXRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotYRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotZRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotXRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotYRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotZRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees)
+{
+ NvBuildRotRadMatf(r, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees)
+{
+ NvMultRotRadMatf(r, m, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3])
+{
+ GLfloat ev[3];
+ GLfloat z[3];
+ GLfloat x_tmp[3];
+ GLfloat x[3];
+ GLfloat y[3];
+
+ NvSubVecf(ev, eye, obj);
+
+ NvNormalizeVecf(z, ev);
+
+ NvCrossProductf(x_tmp, up, z);
+
+ NvNormalizeVecf(x, x_tmp);
+
+ NvCrossProductf(y, z, x);
+
+ r[0][0] = x[0];
+ r[0][1] = y[0];
+ r[0][2] = z[0];
+ r[0][3] = 0.0f;
+
+ r[1][0] = x[1];
+ r[1][1] = y[1];
+ r[1][2] = z[1];
+ r[1][3] = 0.0f;
+
+ r[2][0] = x[2];
+ r[2][1] = y[2];
+ r[2][2] = z[2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = -x[0] * eye[0] + -x[1] * eye[1] + -x[2] * eye[2];
+ r[3][1] = -y[0] * eye[0] + -y[1] * eye[1] + -y[2] * eye[2];
+ r[3][2] = -z[0] * eye[0] + -z[1] * eye[1] + -z[2] * eye[2];
+ r[3][3] = 1.0f;
+}
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const m00 = znear * 2.0f / (right - left);
+ GLfloat const m11 = znear * 2.0f / (top - bottom);
+ GLfloat const m22 = -(zfar + znear) / (zfar - znear);
+
+ GLfloat const m20 = (right + left) / (right - left);
+ GLfloat const m21 = (top + bottom) / (top - bottom);
+
+ GLfloat const m32 = -(2.0f * zfar * znear) / (zfar - znear);
+ GLfloat const m23 = -1.0f;
+
+ r[0][0] = m00;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = m11;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = m20;
+ r[2][1] = m21;
+ r[2][2] = m22;
+ r[2][3] = m23;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = m32;
+ r[3][3] = 0.0f;
+}
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+ GLfloat const sz = -2.0f / (zfar - znear);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+ GLfloat const tz = -(zfar + znear) / (zfar - znear);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = sz;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = tz;
+ r[3][3] = 1.0f;
+}
diff --git a/src/platformspecific/linux/libs/nv_math/nv_matrix.h b/src/platformspecific/linux/libs/nv_math/nv_matrix.h
new file mode 100644
index 0000000..5f567f0
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/nv_matrix.h
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_MATRIX_H
+#define INCLUDED_MATRIX_H
+
+#include <QtGui/qopengl.h>
+
+#include <math.h>
+#include <assert.h>
+
+#define KD_FLT_EPSILON 1.19209290E-07F
+#define KD_DEG_TO_RAD_F 0.0174532924F
+#define KD_RAD_TO_DEG_F 57.2957802F
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4]);
+
+/* vector utilities */
+
+GLfloat NvVecLengthf(const GLfloat v[3]);
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3]);
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4]);
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+
+/* matrix utilities */
+
+void NvMultMatf(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4]);
+
+void NvInvMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+
+/* matrix building utilities */
+
+void NvBuildIdentityMatf(GLfloat r[4][4]);
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees);
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees);
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians);
+
+void NvBuildRotRadMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat radians);
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3]);
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top);
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+/* matrix concatenation utilities */
+
+void NvMultTranslateMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+void NvMultScaleMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees);
+
+void NvMultRotXRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotYRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotZRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+
+void NvMultRotRadMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians);
+
+#endif
diff --git a/src/platformspecific/linux/libs/nv_math/nv_quat.cpp b/src/platformspecific/linux/libs/nv_math/nv_quat.cpp
new file mode 100644
index 0000000..e66420c
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/nv_quat.cpp
@@ -0,0 +1,203 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_quat.h"
+#include <stdlib.h>
+#ifdef _INTEGRITYPLATFORM
+#include <string.h>
+#else
+#include <memory.h>
+#endif
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4])
+{
+ memcpy(r, q, 4 * sizeof(GLfloat));
+}
+
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4])
+{
+ // Assumes that the quaternion is normalized!
+ GLfloat x2 = q[0] * 2.0f;
+ GLfloat y2 = q[1] * 2.0f;
+ GLfloat z2 = q[2] * 2.0f;
+ GLfloat xSq2 = x2 * q[0];
+ GLfloat ySq2 = y2 * q[1];
+ GLfloat zSq2 = z2 * q[2];
+ GLfloat xy2 = x2 * q[1];
+ GLfloat xz2 = x2 * q[2];
+ GLfloat xw2 = x2 * q[3];
+ GLfloat yz2 = y2 * q[2];
+ GLfloat yw2 = y2 * q[3];
+ GLfloat zw2 = z2 * q[3];
+
+ /* Matrix is
+ * | 1 - 2y^2 - 2z^2 2xy - 2zw 2xz + 2yw |
+ * | 2xy + 2zw 1 - 2x^2 - 2z^2 2yz - 2xw |
+ * | 2xz - 2yw 2yz + 2xw 1 - 2x^2 - 2y^2 |
+ */
+ r[0][0] = 1.0f - ySq2 - zSq2;
+ r[0][1] = xy2 - zw2;
+ r[0][2] = xz2 + yw2;
+
+ r[1][0] = xy2 + zw2;
+ r[1][1] = 1.0f - xSq2 - zSq2;
+ r[1][2] = yz2 - xw2;
+
+ r[2][0] = xz2 - yw2;
+ r[2][1] = yz2 + xw2;
+ r[2][2] = 1.0f - xSq2 - ySq2;
+}
+
+void NvQuatIdentity(GLfloat r[4])
+{
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = 1.0f;
+}
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3])
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = axis[0] * sina;
+ r[1] = axis[1] * sina;
+ r[2] = axis[2] * sina;
+ r[3] = cosa;
+}
+
+void NvQuatX(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = sina;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatY(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = sina;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatZ(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = sina;
+ r[3] = cosa;
+}
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatY(h, heading);
+ NvQuatX(p, pitch);
+ NvQuatZ(ro, roll);
+
+ NvQuatMult(r, h, p);
+ NvQuatMult(r, ro, r);
+}
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatZ(ro, roll);
+ NvQuatX(p, pitch);
+ NvQuatY(h, heading);
+
+ NvQuatMult(r, p, h);
+ NvQuatMult(r, r, ro);
+}
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4])
+{
+ return q1[0] * q2[0] + q1[1] * q2[1] + q1[2] * q2[2] + q1[3] * q2[3];
+}
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4])
+{
+ const GLfloat q1x = q1[0];
+ const GLfloat q1y = q1[1];
+ const GLfloat q1z = q1[2];
+ const GLfloat q1w = q1[3];
+ const GLfloat q2x = q2[0];
+ const GLfloat q2y = q2[1];
+ const GLfloat q2z = q2[2];
+ const GLfloat q2w = q2[3];
+
+ r[0] = q1y * q2z - q2y * q1z + q1w * q2x + q2w * q1x;
+ r[1] = q1z * q2x - q2z * q1x + q1w * q2y + q2w * q1y;
+ r[2] = q1x * q2y - q2x * q1y + q1w * q2z + q2w * q1z;
+ r[3] = q1w * q2w - q1x * q2x - q1y * q2y - q1z * q2z;
+}
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t)
+{
+ GLfloat omt = 1.0f - t;
+
+ if (NvQuatDot(q1, q2) < 0.0f) {
+ r[0] = -q1[0] * omt + q2[0] * t;
+ r[1] = -q1[1] * omt + q2[1] * t;
+ r[2] = -q1[2] * omt + q2[2] * t;
+ r[3] = -q1[3] * omt + q2[3] * t;
+ } else {
+ r[0] = q1[0] * omt + q2[0] * t;
+ r[1] = q1[1] * omt + q2[1] * t;
+ r[2] = q1[2] * omt + q2[2] * t;
+ r[3] = q1[3] * omt + q2[3] * t;
+ }
+
+ NvQuatNormalize(r, r);
+}
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4])
+{
+ GLfloat invLength = 1.0f / sqrtf(NvQuatDot(q, q));
+
+ r[0] = invLength * q[0];
+ r[1] = invLength * q[1];
+ r[2] = invLength * q[2];
+ r[3] = invLength * q[3];
+}
diff --git a/src/platformspecific/linux/libs/nv_math/nv_quat.h b/src/platformspecific/linux/libs/nv_math/nv_quat.h
new file mode 100644
index 0000000..2e97c71
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_math/nv_quat.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QUAT_H
+#define INCLUDED_QUAT_H
+
+#include <QtGui/qopengl.h>
+
+#include <math.h>
+#include <assert.h>
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4]);
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4]);
+
+void NvQuatIdentity(GLfloat r[4]);
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3]);
+
+void NvQuatX(GLfloat r[4], GLfloat radians);
+
+void NvQuatY(GLfloat r[4], GLfloat radians);
+
+void NvQuatZ(GLfloat r[4], GLfloat radians);
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t);
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4]);
+
+#endif
diff --git a/src/platformspecific/linux/libs/nv_types.h b/src/platformspecific/linux/libs/nv_types.h
new file mode 100644
index 0000000..1d1b030
--- /dev/null
+++ b/src/platformspecific/linux/libs/nv_types.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_TYPES_H
+#define __INCLUDED_QT3DS_TYPES_H
+
+typedef unsigned char NvU8; // 0 to 255
+typedef unsigned short NvU16; // 0 to 65535
+typedef unsigned int NvU32; // 0 to 4294967295
+typedef unsigned long long NvU64; // 0 to 18446744073709551615
+typedef signed char NvS8; // -128 to 127
+typedef signed short NvS16; // -32768 to 32767
+typedef signed int NvS32; // -2147483648 to 2147483647
+typedef signed long long NvS64; // 2^-63 to 2^63-1
+
+// Explicitly sized floats
+typedef float NvF32; // IEEE Single Precision (S1E8M23)
+typedef double NvF64; // IEEE Double Precision (S1E11M52)
+
+// Boolean type
+#define QT3DS_FALSE 0
+#define QT3DS_TRUE 1
+typedef NvU8 NvBool;
+
+// Result of sizeof operator
+typedef unsigned long NvSize;
+
+// Type large enough to hold a relative file offset
+typedef long NvOffset;
+
+// Base NULL type.
+#define QT3DS_NULL 0
+
+// Error related
+typedef enum {
+ NvError_Success = 0,
+ NvError_NotSupported,
+ NvError_NotInitialized,
+ NvError_BadParameter,
+ NvError_InsufficientMemory,
+ NvError_NoEntries,
+ NvError_UnknownError,
+} NvError;
+
+#if 1 // defined(_DEBUG) // !!!!TBD TODO
+#define NvAssert(c)
+#else
+#define NvAssert(c) ((void)((c) ? 0 : (NvHandleAssertion(#c, __FILE__, __LINE__), 0)))
+#endif
+
+// Other standardized typedefs
+typedef NvU64 NvUST; // U64 unadjusted system time value
+
+#endif
diff --git a/src/platformspecific/macos/assets/courier+lucida_256.abc b/src/platformspecific/macos/assets/courier+lucida_256.abc
new file mode 100644
index 0000000..f7e3c2f
--- /dev/null
+++ b/src/platformspecific/macos/assets/courier+lucida_256.abc
Binary files differ
diff --git a/src/platformspecific/macos/assets/courier+lucida_256.dds b/src/platformspecific/macos/assets/courier+lucida_256.dds
new file mode 100644
index 0000000..5bde760
--- /dev/null
+++ b/src/platformspecific/macos/assets/courier+lucida_256.dds
Binary files differ
diff --git a/src/platformspecific/macos/assets/courier+lucida_512.abc b/src/platformspecific/macos/assets/courier+lucida_512.abc
new file mode 100644
index 0000000..2ff7875
--- /dev/null
+++ b/src/platformspecific/macos/assets/courier+lucida_512.abc
Binary files differ
diff --git a/src/platformspecific/macos/assets/courier+lucida_512.dds b/src/platformspecific/macos/assets/courier+lucida_512.dds
new file mode 100644
index 0000000..f9e76d9
--- /dev/null
+++ b/src/platformspecific/macos/assets/courier+lucida_512.dds
Binary files differ
diff --git a/src/platformspecific/macos/assets/font.frag b/src/platformspecific/macos/assets/font.frag
new file mode 100644
index 0000000..e4673cf
--- /dev/null
+++ b/src/platformspecific/macos/assets/font.frag
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+uniform sampler2D fontTex;
+
+varying lowp vec4 col_var;
+varying lowp vec2 tex_var;
+
+void main()
+{
+ gl_FragColor = texture2D(fontTex, tex_var).a * col_var;
+}
+
diff --git a/src/platformspecific/macos/assets/font.vert b/src/platformspecific/macos/assets/font.vert
new file mode 100644
index 0000000..9f307a2
--- /dev/null
+++ b/src/platformspecific/macos/assets/font.vert
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+// this is set from higher level. think of it as the upper model matrix
+uniform mat4 pixelToClipMat;
+
+uniform vec4 col_uni;
+
+attribute vec2 pos_attr;
+attribute vec2 tex_attr;
+attribute vec4 col_attr;
+
+varying vec4 col_var;
+varying vec2 tex_var;
+
+void main()
+{
+ // account for translation and rotation of the primitive into [-1,1] spatial default.
+ gl_Position = pixelToClipMat * vec4(pos_attr.x, pos_attr.y, 0, 1);
+
+ col_var = col_attr * col_uni;
+ tex_var = tex_attr;
+}
diff --git a/src/platformspecific/macos/libs/nv_color.h b/src/platformspecific/macos/libs/nv_color.h
new file mode 100644
index 0000000..b934752
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_color.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _QT3DS_COLOR_H
+#define _QT3DS_COLOR_H
+
+/** @file nv_color.h
+ Simple abstraction for RGBA colors as parameters to various libraries/functions.
+*/
+
+/** Base type for a single color channel (8-bit unsigned). */
+typedef unsigned char NvPCColor8;
+
+//#define NV_COLOR_BREAKOLD
+#ifdef NV_COLOR_BREAKOLD // uses a struct to break backwards-compat and accidental uses
+
+typedef struct
+{
+ NvPCColor8 r;
+ NvPCColor8 g;
+ NvPCColor8 b;
+ NvPCColor8 a;
+} NvPackedColor;
+
+static const NvPackedColor gnvpcwhite = { 255, 255, 255, 255 };
+static const NvPackedColor gnvpcblack = { 0, 0, 0, 255 };
+
+#define NV_PACKED_COLOR(r, g, b, a) \
+ { \
+ (NvPCColor8)(r), (NvPCColor8)(g), (NvPCColor8)(b), (NvPCColor8)(a) \
+ }
+
+#define NV_PC_PREDEF_WHITE gnvpcwhite
+#define NV_PC_PREDEF_BLACK gnvpcblack
+
+#define NV_PC_RED(c) (c.r)
+#define NV_PC_GREEN(c) (c.g)
+#define NV_PC_BLUE(c) (c.b)
+#define NV_PC_ALPHA(c) (c.a)
+
+#define NV_PC_PACK_UINT(c) (*(unsigned int *)(&(c)))
+
+#define NV_PC_EQUAL(x, y) ((x).r == (y).r && (x).g == (y).g && (x).b == (y).b && (x).a == (y).a)
+
+#else /* code that doesn't break old pass-as-uint stuff */
+
+/** Main type declaration for a packed 4-color construct. */
+typedef unsigned int NvPackedColor;
+
+/** A macro to build a packed color, passing in RGBA as four 8-bit integer values. */
+#define NV_PACKED_COLOR(r, g, b, a) \
+ ((NvPackedColor)(((((int)(a)) & 0xFF) << 24) | ((((int)(b)) & 0xFF) << 16) \
+ | ((((int)(g)) & 0xFF) << 8) | ((((int)(r)) & 0xFF))))
+
+/** A predefined constant for WHITE. */
+#define NV_PC_PREDEF_WHITE NV_PACKED_COLOR(0xFF, 0xFF, 0xFF, 0xFF)
+/** A predefined constant for BLACK. */
+#define NV_PC_PREDEF_BLACK NV_PACKED_COLOR(0x00, 0x00, 0x00, 0xFF)
+
+/** A macro for 'extracting' the red value from an NvPackedColor. */
+#define NV_PC_RED(c) ((c >> 0) & 0xff)
+/** A macro for 'extracting' the green value from an NvPackedColor. */
+#define NV_PC_GREEN(c) ((c >> 8) & 0xff)
+/** A macro for 'extracting' the blue value from an NvPackedColor. */
+#define NV_PC_BLUE(c) ((c >> 16) & 0xff)
+/** A macro for 'extracting' the alpha value from an NvPackedColor. */
+#define NV_PC_ALPHA(c) ((c >> 24) & 0xff)
+
+/** A macro requesting the packed color repacked into a 32-bit unsigned int.
+ This is a no-op for the color-as-uint approach.
+*/
+#define NV_PC_PACK_UINT(c) (c)
+/** A macro for testing the equality of two NvPackedColors. */
+#define NV_PC_EQUAL(x, y) (x == y)
+#endif
+
+/** A macro for mapping a single packed color channel into its floating point [0,1] rep. */
+#define NV_PC_TO_FLOAT(c) (c / 255.0f)
+
+#endif /*_QT3DS_COLOR_H*/
diff --git a/src/platformspecific/macos/libs/nv_debug.h b/src/platformspecific/macos/libs/nv_debug.h
new file mode 100644
index 0000000..2559dd6
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_debug.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_DEBUG_H
+#define __INCLUDED_QT3DS_DEBUG_H
+
+#define CT_ASSERT(tag, cond) enum { COMPILE_TIME_ASSERT__##tag = 1 / (cond) }
+
+#define dimof(x) (sizeof(x) / sizeof(x[0]))
+#include <android/log.h>
+
+#define DBG_DETAILED 0
+
+#if 0
+
+ // the detailed prefix can be customised by setting DBG_DETAILED_PREFIX. See
+ // below as a reference.
+ // NOTE: fmt is the desired format string and must be in the prefix.
+ //#ifndef DBG_DETAILED_PREFIX
+ // #define DBG_DETAILED_PREFIX "%s, %s, line %d: " fmt, __FILE__, __FUNCTION__, __LINE__,
+ //#endif
+ //#define DEBUG_D_(fmt, args...)
+ //#define DEBUG_D(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, (DBG_DETAILED_PREFIX) ## args)
+
+#else
+
+#ifdef STRINGIFY
+#pragma push_macro("STRINGIFY")
+#undef STRINGIFY
+#define STRINGIFYPUSHED_____
+#endif
+#define STRINGIFY(x) #x
+
+// debug macro, includes file name function name and line number
+#define TO(x) typeof(x)
+#define DEBUG_D_(file, line, fmt, args...) \
+ __android_log_print(ANDROID_LOG_DEBUG, MODULE, file ", %s, line(" STRINGIFY(line) "): " fmt, \
+ __FUNCTION__, ##args)
+#define DEBUG_D(fmt, args...) DEBUG_D_(__FILE__, __LINE__, fmt, ##args)
+
+#ifdef STRINGIFYPUSHED_____
+#undef STRINGIFYPUSHED_____
+#pragma pop_macro("STRINGIFY")
+#endif
+
+#endif
+
+// basic debug macro
+#define DEBUG_(fmt, args...) (__android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ##args))
+
+// Debug macro that can be switched to spew a file name,
+// function and line number using DEBUG_DETAILED
+#if DBG_DETAILED == 1
+#define DEBUG(fmt, args...) DEBUG_D(fmt, ##args)
+#else
+#define DEBUG(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ##args)
+#endif
+
+#endif
diff --git a/src/platformspecific/macos/libs/nv_global.h b/src/platformspecific/macos/libs/nv_global.h
new file mode 100644
index 0000000..9d23d45
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_global.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_GLOBAL_H
+#define __INCLUDED_QT3DS_GLOBAL_H
+
+#include "nv_types.h"
+
+#endif
diff --git a/src/platformspecific/macos/libs/nv_math/NvVec.h b/src/platformspecific/macos/libs/nv_math/NvVec.h
new file mode 100644
index 0000000..4e5b09c
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/NvVec.h
@@ -0,0 +1,316 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_VEC_H
+#define INCLUDED_QT3DS_MATH_CPP_VEC_H
+
+#include "misc.h"
+
+struct _NvVec3
+{
+ union {
+ struct
+ {
+ float x, y, z;
+ };
+ float v[3];
+ };
+};
+
+struct NvVec3 : public _NvVec3
+{
+ NvVec3() { zero(); }
+
+ NvVec3(float x, float y, float z)
+ {
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+ }
+
+ NvVec3(NvVec3 const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ v[2] = that.v[2];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ v[2] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec3 &operator+=(NvVec3 const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ v[2] += that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator-=(NvVec3 const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ v[2] -= that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+ return *this;
+ }
+
+ NvVec3 &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ v[2] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec3 const &a, NvVec3 const &b)
+{
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+inline NvVec3 operator+(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] + b.v[0], a.v[1] + b.v[1], a.v[2] + b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] - b.v[0], a.v[1] - b.v[1], a.v[2] - b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a)
+{
+
+ return NvVec3(-a.v[0], -a.v[1], -a.v[2]);
+}
+
+inline NvVec3 operator*(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] * s, a.v[1] * s, a.v[2] * s);
+}
+
+inline NvVec3 operator*(float s, NvVec3 const &a)
+{
+
+ return NvVec3(s * a.v[0], s * a.v[1], s * a.v[2]);
+}
+
+inline NvVec3 operator/(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] / s, a.v[1] / s, a.v[2] / s);
+}
+
+inline float magnitude(NvVec3 const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec3 normalize(NvVec3 const &v)
+{
+ float l = magnitude(v);
+ return NvVec3(v[0] / l, v[1] / l, v[2] / l);
+}
+
+inline NvVec3 cross(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[1] * b.v[2] - a.v[2] * b.v[1], a.v[2] * b.v[0] - a.v[0] * b.v[2],
+ a.v[0] * b.v[1] - a.v[1] * b.v[0]);
+}
+
+inline bool operator==(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] == b.v[0] && a.v[1] == b.v[1] && a.v[2] == b.v[2]);
+}
+
+inline bool operator!=(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] != b.v[0] || a.v[1] != b.v[1] || a.v[2] != b.v[2]);
+}
+
+struct NvVec2f
+{
+ union {
+ struct
+ {
+ float x, y;
+ float v[2];
+ };
+ };
+
+ NvVec2f() { zero(); }
+
+ NvVec2f(float x, float y)
+ {
+ v[0] = x;
+ v[1] = y;
+ }
+
+ NvVec2f(NvVec2f const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec2f &operator+=(NvVec2f const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator-=(NvVec2f const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ return *this;
+ }
+
+ NvVec2f &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a[0] * b[0] + a[1] * b[1];
+}
+
+inline NvVec2f operator+(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] + b.v[0], a.v[1] + b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] - b.v[0], a.v[1] - b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a)
+{
+
+ return NvVec2f(-a.v[0], -a.v[1]);
+}
+
+inline NvVec2f operator*(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] * s, a.v[1] * s);
+}
+
+inline NvVec2f operator*(float s, NvVec2f const &a)
+{
+
+ return NvVec2f(s * a.v[0], s * a.v[1]);
+}
+
+inline NvVec2f operator/(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] / s, a.v[1] / s);
+}
+
+inline float magnitude(NvVec2f const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec2f normalize(NvVec2f const &v)
+{
+ float l = dot(v, v);
+ return NvVec2f(v[0] / l, v[1] / l);
+}
+
+inline float cross(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a.v[0] * b.v[1] - b.v[0] * a.v[1];
+}
+
+#endif
diff --git a/src/platformspecific/macos/libs/nv_math/misc.h b/src/platformspecific/macos/libs/nv_math/misc.h
new file mode 100644
index 0000000..983410f
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/misc.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_MISC_H
+#define INCLUDED_QT3DS_MATH_CPP_MISC_H
+
+inline bool nvIsPowerOfTwo(unsigned int i)
+{
+ return (i & (i - 1)) == 0;
+}
+
+inline float nvDegToRadf(float d)
+{
+ return d * 3.14159265358979323846f / 180.0f;
+}
+
+inline float nvRadToDegf(float r)
+{
+ return r * 180.0f / 3.14159265358979323846f;
+}
+
+/*
+ 'mod' differs from '%' in that it behaves correctly when either the
+ numerator or denominator is negative.
+*/
+
+inline int nvMod(int n, int d)
+{
+ int m = n % d;
+ return (((m < 0) && (d > 0)) || ((m > 0) && (d < 0))) ? (m + d) : m;
+}
+
+inline int nvAbs(int n)
+{
+ if (n < 0)
+ return -n;
+ return n;
+}
+
+inline int nvSign(int n)
+{
+ if (n > 0)
+ return 1;
+ if (n < 0)
+ return -1;
+ return 0;
+}
+
+/*
+ This returns the smallest amplitude value x such that
+ nvMod(b + x, m) == a
+*/
+
+inline int nvDifMod(int a, int b, int m)
+{
+
+ int x1 = a - b;
+ int x2 = (x1 > 0) ? x1 - m : x1 + m;
+ return (nvAbs(x1) < nvAbs(x2)) ? x1 : x2;
+}
+
+inline float nvWrapf(float a, float min, float max)
+{
+
+ assert(max > min);
+
+ float d = max - min;
+ float s = a - min;
+ float q = s / d;
+ float m = q - floorf(q);
+ return m * d + min;
+}
+
+inline float nvClampf(float a, float min, float max)
+{
+ return (a < min) ? min : ((a > max) ? max : a);
+}
+
+inline int nvClampi(int i, int min, int max)
+{
+ return (i < min) ? min : ((i > max) ? max : i);
+}
+
+inline float nvGaussian(float x, float s)
+{
+ float c = s * sqrtf(2.0f * 3.14159265358979323846f);
+ return expf(-(x * x) / (2.0f * s * s)) / c;
+}
+
+inline float nvLerpf(float a, float b, float t)
+{
+ return a * (1.0f - t) + b * t;
+}
+
+inline float nvEasef(float t)
+{
+
+ float t_2 = t * t;
+ float t_3 = t_2 * t;
+ return 3.0f * t_2 - 2.0f * t_3;
+}
+
+#endif
diff --git a/src/platformspecific/macos/libs/nv_math/nv_math.cpp b/src/platformspecific/macos/libs/nv_math/nv_math.cpp
new file mode 100644
index 0000000..b83cb39
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/nv_math.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_math.h"
+
+static const double a = 16807.0;
+static const double m = 2147483647.0;
+
+static double nextSeed(double seed)
+{
+ double t = a * seed;
+ return t - m * (double)((int)(t / m));
+}
+
+GLfloat NvRandf()
+{
+ static double seed = 1.0;
+ seed = nextSeed(seed);
+ return (GLfloat)(seed * (1 / m));
+}
+
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime)
+{
+ // kdGetTimeUST is never supposed to decrease (i.e. that
+ // means it can't wrap, either. IIRC, it will wrap in
+ // 593 years). So we ignore that option...
+
+ // Used for frame-to-frame diffs, this will fit in 32b
+ // as long as the times are < ~4.3s apart
+ long long int diffTime = newTime - oldTime;
+
+ // Need to find a better way to do this.
+ // However, I believe we will be uSec precise (not run
+ // out of mantissa bits for uSecs) as long as the diff
+ // is < ~16s (1e-6 * (2^24))
+ return ((GLfloat)diffTime) / 1.0e9f;
+}
diff --git a/src/platformspecific/macos/libs/nv_math/nv_math.h b/src/platformspecific/macos/libs/nv_math/nv_math.h
new file mode 100644
index 0000000..e777e40
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/nv_math.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _QT3DS_MATH_H
+#define _QT3DS_MATH_H
+
+#include <OpenGL/gl.h>
+
+GLfloat NvRandf();
+
+/* These are the recommended "safer" ways to use GLfloat for time */
+
+/* Returns the seconds between the two given times */
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime);
+
+#define QT3DS_MILISECS_TO_UST(ms) ((long long int)(ms)*1000000)
+
+#endif
diff --git a/src/platformspecific/macos/libs/nv_math/nv_matrix.cpp b/src/platformspecific/macos/libs/nv_math/nv_matrix.cpp
new file mode 100644
index 0000000..e208ac3
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/nv_matrix.cpp
@@ -0,0 +1,1030 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_matrix.h"
+
+int NvDifferentMatsf(GLfloat a[4][4], const GLfloat b[4][4])
+{
+ return ((&a[3][3] < &b[0][0]) || (&b[3][3] < &a[0][0]));
+}
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+}
+
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+}
+
+GLfloat NvVecLengthf(const GLfloat v[3])
+{
+ return sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+}
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3])
+{
+ GLfloat const l = NvVecLengthf(v);
+ r[0] = v[0] / l;
+ r[1] = v[1] / l;
+ r[2] = v[2] / l;
+}
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] + b[0];
+ r[1] = a[1] + b[1];
+ r[2] = a[2] + b[2];
+}
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] - b[0];
+ r[1] = a[1] - b[1];
+ r[2] = a[2] - b[2];
+}
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ GLfloat t[3];
+
+ t[0] = a[1] * b[2] - a[2] * b[1];
+ t[1] = a[2] * b[0] - a[0] * b[2];
+ t[2] = a[0] * b[1] - a[1] * b[0];
+
+ r[0] = t[0];
+ r[1] = t[1];
+ r[2] = t[2];
+}
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ GLfloat inv_w = 1.0f / (m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3]);
+
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * inv_w;
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * inv_w;
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * inv_w;
+}
+
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * a[3];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * a[3];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * a[3];
+ r[3] = m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3] * a[3];
+}
+
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2];
+}
+
+static void NvMultMat3x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2];
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x4f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2] + a[3][0] * b[0][3];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2] + a[3][1] * b[0][3];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2] + a[3][2] * b[0][3];
+ r[0][3] = a[0][3] * b[0][0] + a[1][3] * b[0][1] + a[2][3] * b[0][2] + a[3][3] * b[0][3];
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2] + a[3][0] * b[1][3];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2] + a[3][1] * b[1][3];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2] + a[3][2] * b[1][3];
+ r[1][3] = a[0][3] * b[1][0] + a[1][3] * b[1][1] + a[2][3] * b[1][2] + a[3][3] * b[1][3];
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2] + a[3][0] * b[2][3];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2] + a[3][1] * b[2][3];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2] + a[3][2] * b[2][3];
+ r[2][3] = a[0][3] * b[2][0] + a[1][3] * b[2][1] + a[2][3] * b[2][2] + a[3][3] * b[2][3];
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0] * b[3][3];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1] * b[3][3];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2] * b[3][3];
+ r[3][3] = a[0][3] * b[3][0] + a[1][3] * b[3][1] + a[2][3] * b[3][2] + a[3][3] * b[3][3];
+}
+
+void NvMultMatf(GLfloat result[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((a[0][3] == 0.0f) && (a[1][3] == 0.0f) && (a[2][3] == 0.0f) && (a[2][3] == 1.0f)
+ && (b[0][3] == 0.0f) && (b[1][3] == 0.0f) && (b[2][3] == 0.0f) && (b[2][3] == 1.0f)) {
+ if ((a[3][0] == 0.0f) && (a[3][1] == 0.0f) && (a[3][2] == 0.0f) && (b[3][0] == 0.0f)
+ && (b[3][1] == 0.0f) && (b[3][2] == 0.0f)) {
+ NvMultMat3x3f(r, a, b);
+ } else {
+ NvMultMat4x3f(r, a, b);
+ }
+ } else {
+ NvMultMat4x4f(r, a, b);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+static void NvInvMat3x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ /* x */
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ /* y */
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ /* z */
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x4f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] * m[3][3] + m[0][0] * m[1][2] * m[2][3] * m[3][1]
+ + m[0][0] * m[1][3] * m[2][1] * m[3][2] + m[0][1] * m[1][0] * m[2][3] * m[3][2]
+ + m[0][1] * m[1][2] * m[2][0] * m[3][3] + m[0][1] * m[1][3] * m[2][2] * m[3][0]
+ + m[0][2] * m[1][0] * m[2][1] * m[3][3] + m[0][2] * m[1][1] * m[2][3] * m[3][0]
+ + m[0][2] * m[1][3] * m[2][0] * m[3][1] + m[0][3] * m[1][0] * m[2][2] * m[3][1]
+ + m[0][3] * m[1][1] * m[2][0] * m[3][2] + m[0][3] * m[1][2] * m[2][1] * m[3][0]
+ + -m[0][0] * m[1][1] * m[2][3] * m[3][2] + -m[0][0] * m[1][2] * m[2][1] * m[3][3]
+ + -m[0][0] * m[1][3] * m[2][2] * m[3][1] + -m[0][1] * m[1][0] * m[2][2] * m[3][3]
+ + -m[0][1] * m[1][2] * m[2][3] * m[3][0] + -m[0][1] * m[1][3] * m[2][0] * m[3][2]
+ + -m[0][2] * m[1][0] * m[2][3] * m[3][1] + -m[0][2] * m[1][1] * m[2][0] * m[3][3]
+ + -m[0][2] * m[1][3] * m[2][1] * m[3][0] + -m[0][3] * m[1][0] * m[2][1] * m[3][2]
+ + -m[0][3] * m[1][1] * m[2][2] * m[3][0] + -m[0][3] * m[1][2] * m[2][0] * m[3][1];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] * m[3][3] + m[1][2] * m[2][3] * m[3][1]
+ + m[1][3] * m[2][1] * m[3][2] + -m[1][1] * m[2][3] * m[3][2]
+ + -m[1][2] * m[2][1] * m[3][3] + -m[1][3] * m[2][2] * m[3][1])
+ / d;
+
+ r[0][1] = (m[0][1] * m[2][3] * m[3][2] + m[0][2] * m[2][1] * m[3][3]
+ + m[0][3] * m[2][2] * m[3][1] + -m[0][1] * m[2][2] * m[3][3]
+ + -m[0][2] * m[2][3] * m[3][1] + -m[0][3] * m[2][1] * m[3][2])
+ / d;
+
+ r[0][2] = (m[0][1] * m[1][2] * m[3][3] + m[0][2] * m[1][3] * m[3][1]
+ + m[0][3] * m[1][1] * m[3][2] + -m[0][1] * m[1][3] * m[3][2]
+ + -m[0][2] * m[1][1] * m[3][3] + -m[0][3] * m[1][2] * m[3][1])
+ / d;
+
+ r[0][3] = (m[0][1] * m[1][3] * m[2][2] + m[0][2] * m[1][1] * m[2][3]
+ + m[0][3] * m[1][2] * m[2][1] + -m[0][1] * m[1][2] * m[2][3]
+ + -m[0][2] * m[1][3] * m[2][1] + -m[0][3] * m[1][1] * m[2][2])
+ / d;
+
+ r[1][0] = (m[1][0] * m[2][3] * m[3][2] + m[1][2] * m[2][0] * m[3][3]
+ + m[1][3] * m[2][2] * m[3][0] + -m[1][0] * m[2][2] * m[3][3]
+ + -m[1][2] * m[2][3] * m[3][0] + -m[1][3] * m[2][0] * m[3][2])
+ / d;
+
+ r[1][1] = (m[0][0] * m[2][2] * m[3][3] + m[0][2] * m[2][3] * m[3][0]
+ + m[0][3] * m[2][0] * m[3][2] + -m[0][0] * m[2][3] * m[3][2]
+ + -m[0][2] * m[2][0] * m[3][3] + -m[0][3] * m[2][2] * m[3][0])
+ / d;
+
+ r[1][2] = (m[0][0] * m[1][3] * m[3][2] + m[0][2] * m[1][0] * m[3][3]
+ + m[0][3] * m[1][2] * m[3][0] + -m[0][0] * m[1][2] * m[3][3]
+ + -m[0][2] * m[1][3] * m[3][0] + -m[0][3] * m[1][0] * m[3][2])
+ / d;
+
+ r[1][3] = (m[0][0] * m[1][2] * m[2][3] + m[0][2] * m[1][3] * m[2][0]
+ + m[0][3] * m[1][0] * m[2][2] + -m[0][0] * m[1][3] * m[2][2]
+ + -m[0][2] * m[1][0] * m[2][3] + -m[0][3] * m[1][2] * m[2][0])
+ / d;
+
+ r[2][0] = (m[1][0] * m[2][1] * m[3][3] + m[1][1] * m[2][3] * m[3][0]
+ + m[1][3] * m[2][0] * m[3][1] + -m[1][0] * m[2][3] * m[3][1]
+ + -m[1][1] * m[2][0] * m[3][3] + -m[1][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][1] =
+ (-m[0][0] * m[2][1] * m[3][3] + -m[0][1] * m[2][3] * m[3][0] + -m[0][3] * m[2][0] * m[3][1]
+ + m[0][0] * m[2][3] * m[3][1] + m[0][1] * m[2][0] * m[3][3] + m[0][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][2] = (m[0][0] * m[1][1] * m[3][3] + m[0][1] * m[1][3] * m[3][0]
+ + m[0][3] * m[1][0] * m[3][1] + -m[0][0] * m[1][3] * m[3][1]
+ + -m[0][1] * m[1][0] * m[3][3] + -m[0][3] * m[1][1] * m[3][0])
+ / d;
+
+ r[2][3] = (m[0][0] * m[1][3] * m[2][1] + m[0][1] * m[1][0] * m[2][3]
+ + m[0][3] * m[1][1] * m[2][0] + -m[0][1] * m[1][3] * m[2][0]
+ + -m[0][3] * m[1][0] * m[2][1] + -m[0][0] * m[1][1] * m[2][3])
+ / d;
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = (m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1]
+ + -m[0][1] * m[1][0] * m[2][2] + -m[0][2] * m[1][1] * m[2][0])
+ / d;
+}
+
+void NvInvMatf(GLfloat result[4][4], const GLfloat m[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((m[0][3] == 0.0f) && (m[1][3] == 0.0f) && (m[2][3] == 0.0f) && (m[2][3] == 1.0f)) {
+ if ((m[3][0] == 0.0f) && (m[3][1] == 0.0f) && (m[3][2] == 0.0f)) {
+ NvInvMat3x3f(r, m);
+ } else {
+ NvInvMat4x3f(r, m);
+ }
+ } else {
+ NvInvMat4x4f(r, m);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildIdentityMatf(GLfloat r[4][4])
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = x;
+ r[3][1] = y;
+ r[3][2] = z;
+ r[3][3] = 1.0f;
+}
+
+void NvMultTranslateMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y,
+ GLfloat z)
+{
+ GLfloat r[4][4]; /*temporary storage for result */
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[0][0] * x + m[1][0] * y + m[2][0] * z + m[3][0];
+ r[3][1] = m[0][1] * x + m[1][1] * y + m[2][1] * z + m[3][1];
+ r[3][2] = m[0][2] * x + m[1][2] * y + m[2][2] * z + m[3][2];
+ r[3][3] = m[0][3] * x + m[1][3] * y + m[2][3] * z + m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = x;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = y;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = z;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultScaleMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * x;
+ r[0][1] = m[0][1] * x;
+ r[0][2] = m[0][2] * x;
+ r[0][3] = m[0][3] * x;
+
+ r[1][0] = m[1][0] * y;
+ r[1][1] = m[1][1] * y;
+ r[1][2] = m[1][2] * y;
+ r[1][3] = m[1][3] * y;
+
+ r[2][0] = m[2][0] * z;
+ r[2][1] = m[2][1] * z;
+ r[2][2] = m[2][2] * z;
+ r[2][3] = m[2][3] * z;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = c;
+ r[1][2] = s;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = -s;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = 0.0f;
+ r[0][2] = -s;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = s;
+ r[2][1] = 0.0f;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = s;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = -s;
+ r[1][1] = c;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultRotXRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0] * c + m[2][0] * s;
+ r[1][1] = m[1][1] * c + m[2][1] * s;
+ r[1][2] = m[1][2] * c + m[2][2] * s;
+ r[1][3] = m[1][3] * c + m[2][3] * s;
+
+ r[2][0] = m[1][0] * -s + m[2][0] * c;
+ r[2][1] = m[1][1] * -s + m[2][1] * c;
+ r[2][2] = m[1][2] * -s + m[2][2] * c;
+ r[2][3] = m[1][3] * -s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotYRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[2][0] * -s;
+ r[0][1] = m[0][1] * c + m[2][1] * -s;
+ r[0][2] = m[0][2] * c + m[2][2] * -s;
+ r[0][3] = m[0][3] * c + m[2][3] * -s;
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[0][0] * s + m[2][0] * c;
+ r[2][1] = m[0][1] * s + m[2][1] * c;
+ r[2][2] = m[0][2] * s + m[2][2] * c;
+ r[2][3] = m[0][3] * s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotZRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[1][0] * s;
+ r[0][1] = m[0][1] * c + m[1][1] * s;
+ r[0][2] = m[0][2] * c + m[1][2] * s;
+ r[0][3] = m[0][3] * c + m[1][3] * s;
+
+ r[1][0] = m[0][0] * -s + m[1][0] * c;
+ r[1][1] = m[0][1] * -s + m[1][1] * c;
+ r[1][2] = m[0][2] * -s + m[1][2] * c;
+ r[1][3] = m[0][3] * -s + m[1][3] * c;
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotRadMatf(GLfloat result[4][4], const GLfloat axis[3], GLfloat radians)
+{
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ /* build a matrix from the quat */
+
+ result[0][0] = 1.0f - 2.0f * (j * j + k * k);
+ result[0][1] = 2.0f * (i * j + r * k);
+ result[0][2] = 2.0f * (i * k - r * j);
+ result[0][3] = 0.0f;
+
+ result[1][0] = 2.0f * (i * j - r * k);
+ result[1][1] = 1.0f - 2.0f * (i * i + k * k);
+ result[1][2] = 2.0f * (j * k + r * i);
+ result[1][3] = 0.0f;
+
+ result[2][0] = 2.0f * (i * k + r * j);
+ result[2][1] = 2.0f * (j * k - r * i);
+ result[2][2] = 1.0f - 2.0f * (i * i + j * j);
+ result[2][3] = 0.0f;
+
+ result[3][0] = 0.0f;
+ result[3][1] = 0.0f;
+ result[3][2] = 0.0f;
+ result[3][3] = 1.0f;
+}
+
+void NvMultRotRadMatf(GLfloat result[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians)
+{
+ GLfloat r[4][4];
+
+ {
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat const dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ {
+ /* build a matrix from the quat */
+
+ GLfloat const a00 = 1.0f - 2.0f * (j * j + k * k);
+ GLfloat const a01 = 2.0f * (i * j + r * k);
+ GLfloat const a02 = 2.0f * (i * k - r * j);
+
+ GLfloat const a10 = 2.0f * (i * j - r * k);
+ GLfloat const a11 = 1.0f - 2.0f * (i * i + k * k);
+ GLfloat const a12 = 2.0f * (j * k + r * i);
+
+ GLfloat const a20 = 2.0f * (i * k + r * j);
+ GLfloat const a21 = 2.0f * (j * k - r * i);
+ GLfloat const a22 = 1.0f - 2.0f * (i * i + j * j);
+
+ result[0][0] = m[0][0] * a00 + m[1][0] * a01 + m[2][0] * a02;
+ result[0][1] = m[0][1] * a00 + m[1][1] * a01 + m[2][1] * a02;
+ result[0][2] = m[0][2] * a00 + m[1][2] * a01 + m[2][2] * a02;
+ result[0][3] = m[0][3] * a00 + m[1][3] * a01 + m[2][3] * a02;
+
+ result[1][0] = m[0][0] * a10 + m[1][0] * a11 + m[2][0] * a12;
+ result[1][1] = m[0][1] * a10 + m[1][1] * a11 + m[2][1] * a12;
+ result[1][2] = m[0][2] * a10 + m[1][2] * a11 + m[2][2] * a12;
+ result[1][3] = m[0][3] * a10 + m[1][3] * a11 + m[2][3] * a12;
+
+ result[2][0] = m[0][0] * a20 + m[1][0] * a21 + m[2][0] * a22;
+ result[2][1] = m[0][1] * a20 + m[1][1] * a21 + m[2][1] * a22;
+ result[2][2] = m[0][2] * a20 + m[1][2] * a21 + m[2][2] * a22;
+ result[2][3] = m[0][3] * a20 + m[1][3] * a21 + m[2][3] * a22;
+
+ result[3][0] = m[3][0];
+ result[3][1] = m[3][1];
+ result[3][2] = m[3][2];
+ result[3][3] = m[3][3];
+ }
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotXRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotYRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotZRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotXRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotYRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotZRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees)
+{
+ NvBuildRotRadMatf(r, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees)
+{
+ NvMultRotRadMatf(r, m, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3])
+{
+ GLfloat ev[3];
+ GLfloat z[3];
+ GLfloat x_tmp[3];
+ GLfloat x[3];
+ GLfloat y[3];
+
+ NvSubVecf(ev, eye, obj);
+
+ NvNormalizeVecf(z, ev);
+
+ NvCrossProductf(x_tmp, up, z);
+
+ NvNormalizeVecf(x, x_tmp);
+
+ NvCrossProductf(y, z, x);
+
+ r[0][0] = x[0];
+ r[0][1] = y[0];
+ r[0][2] = z[0];
+ r[0][3] = 0.0f;
+
+ r[1][0] = x[1];
+ r[1][1] = y[1];
+ r[1][2] = z[1];
+ r[1][3] = 0.0f;
+
+ r[2][0] = x[2];
+ r[2][1] = y[2];
+ r[2][2] = z[2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = -x[0] * eye[0] + -x[1] * eye[1] + -x[2] * eye[2];
+ r[3][1] = -y[0] * eye[0] + -y[1] * eye[1] + -y[2] * eye[2];
+ r[3][2] = -z[0] * eye[0] + -z[1] * eye[1] + -z[2] * eye[2];
+ r[3][3] = 1.0f;
+}
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const m00 = znear * 2.0f / (right - left);
+ GLfloat const m11 = znear * 2.0f / (top - bottom);
+ GLfloat const m22 = -(zfar + znear) / (zfar - znear);
+
+ GLfloat const m20 = (right + left) / (right - left);
+ GLfloat const m21 = (top + bottom) / (top - bottom);
+
+ GLfloat const m32 = -(2.0f * zfar * znear) / (zfar - znear);
+ GLfloat const m23 = -1.0f;
+
+ r[0][0] = m00;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = m11;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = m20;
+ r[2][1] = m21;
+ r[2][2] = m22;
+ r[2][3] = m23;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = m32;
+ r[3][3] = 0.0f;
+}
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+ GLfloat const sz = -2.0f / (zfar - znear);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+ GLfloat const tz = -(zfar + znear) / (zfar - znear);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = sz;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = tz;
+ r[3][3] = 1.0f;
+}
diff --git a/src/platformspecific/macos/libs/nv_math/nv_matrix.h b/src/platformspecific/macos/libs/nv_math/nv_matrix.h
new file mode 100644
index 0000000..0709f11
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/nv_matrix.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_MATRIX_H
+#define INCLUDED_MATRIX_H
+
+#include <OpenGL/gl.h>
+#include <math.h>
+#include <assert.h>
+
+#define KD_FLT_EPSILON 1.19209290E-07F
+#define KD_DEG_TO_RAD_F 0.0174532924F
+#define KD_RAD_TO_DEG_F 57.2957802F
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4]);
+
+/* vector utilities */
+
+GLfloat NvVecLengthf(const GLfloat v[3]);
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3]);
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4]);
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+
+/* matrix utilities */
+
+void NvMultMatf(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4]);
+
+void NvInvMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+
+/* matrix building utilities */
+
+void NvBuildIdentityMatf(GLfloat r[4][4]);
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees);
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees);
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians);
+
+void NvBuildRotRadMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat radians);
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3]);
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top);
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+/* matrix concatenation utilities */
+
+void NvMultTranslateMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+void NvMultScaleMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees);
+
+void NvMultRotXRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotYRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotZRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+
+void NvMultRotRadMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians);
+
+#endif
diff --git a/src/platformspecific/macos/libs/nv_math/nv_quat.cpp b/src/platformspecific/macos/libs/nv_math/nv_quat.cpp
new file mode 100644
index 0000000..ec49794
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/nv_quat.cpp
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_quat.h"
+#include <stdlib.h>
+#include <memory.h>
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4])
+{
+ memcpy(r, q, 4 * sizeof(GLfloat));
+}
+
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4])
+{
+ // Assumes that the quaternion is normalized!
+ GLfloat x2 = q[0] * 2.0f;
+ GLfloat y2 = q[1] * 2.0f;
+ GLfloat z2 = q[2] * 2.0f;
+ GLfloat xSq2 = x2 * q[0];
+ GLfloat ySq2 = y2 * q[1];
+ GLfloat zSq2 = z2 * q[2];
+ GLfloat xy2 = x2 * q[1];
+ GLfloat xz2 = x2 * q[2];
+ GLfloat xw2 = x2 * q[3];
+ GLfloat yz2 = y2 * q[2];
+ GLfloat yw2 = y2 * q[3];
+ GLfloat zw2 = z2 * q[3];
+
+ /* Matrix is
+ * | 1 - 2y^2 - 2z^2 2xy - 2zw 2xz + 2yw |
+ * | 2xy + 2zw 1 - 2x^2 - 2z^2 2yz - 2xw |
+ * | 2xz - 2yw 2yz + 2xw 1 - 2x^2 - 2y^2 |
+ */
+ r[0][0] = 1.0f - ySq2 - zSq2;
+ r[0][1] = xy2 - zw2;
+ r[0][2] = xz2 + yw2;
+
+ r[1][0] = xy2 + zw2;
+ r[1][1] = 1.0f - xSq2 - zSq2;
+ r[1][2] = yz2 - xw2;
+
+ r[2][0] = xz2 - yw2;
+ r[2][1] = yz2 + xw2;
+ r[2][2] = 1.0f - xSq2 - ySq2;
+}
+
+void NvQuatIdentity(GLfloat r[4])
+{
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = 1.0f;
+}
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3])
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = axis[0] * sina;
+ r[1] = axis[1] * sina;
+ r[2] = axis[2] * sina;
+ r[3] = cosa;
+}
+
+void NvQuatX(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = sina;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatY(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = sina;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatZ(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = sina;
+ r[3] = cosa;
+}
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatY(h, heading);
+ NvQuatX(p, pitch);
+ NvQuatZ(ro, roll);
+
+ NvQuatMult(r, h, p);
+ NvQuatMult(r, ro, r);
+}
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatZ(ro, roll);
+ NvQuatX(p, pitch);
+ NvQuatY(h, heading);
+
+ NvQuatMult(r, p, h);
+ NvQuatMult(r, r, ro);
+}
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4])
+{
+ return q1[0] * q2[0] + q1[1] * q2[1] + q1[2] * q2[2] + q1[3] * q2[3];
+}
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4])
+{
+ const GLfloat q1x = q1[0];
+ const GLfloat q1y = q1[1];
+ const GLfloat q1z = q1[2];
+ const GLfloat q1w = q1[3];
+ const GLfloat q2x = q2[0];
+ const GLfloat q2y = q2[1];
+ const GLfloat q2z = q2[2];
+ const GLfloat q2w = q2[3];
+
+ r[0] = q1y * q2z - q2y * q1z + q1w * q2x + q2w * q1x;
+ r[1] = q1z * q2x - q2z * q1x + q1w * q2y + q2w * q1y;
+ r[2] = q1x * q2y - q2x * q1y + q1w * q2z + q2w * q1z;
+ r[3] = q1w * q2w - q1x * q2x - q1y * q2y - q1z * q2z;
+}
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t)
+{
+ GLfloat omt = 1.0f - t;
+
+ if (NvQuatDot(q1, q2) < 0.0f) {
+ r[0] = -q1[0] * omt + q2[0] * t;
+ r[1] = -q1[1] * omt + q2[1] * t;
+ r[2] = -q1[2] * omt + q2[2] * t;
+ r[3] = -q1[3] * omt + q2[3] * t;
+ } else {
+ r[0] = q1[0] * omt + q2[0] * t;
+ r[1] = q1[1] * omt + q2[1] * t;
+ r[2] = q1[2] * omt + q2[2] * t;
+ r[3] = q1[3] * omt + q2[3] * t;
+ }
+
+ NvQuatNormalize(r, r);
+}
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4])
+{
+ GLfloat invLength = 1.0f / sqrtf(NvQuatDot(q, q));
+
+ r[0] = invLength * q[0];
+ r[1] = invLength * q[1];
+ r[2] = invLength * q[2];
+ r[3] = invLength * q[3];
+}
diff --git a/src/platformspecific/macos/libs/nv_math/nv_quat.h b/src/platformspecific/macos/libs/nv_math/nv_quat.h
new file mode 100644
index 0000000..2afdcb7
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_math/nv_quat.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QUAT_H
+#define INCLUDED_QUAT_H
+
+#include <OpenGL/gl.h>
+#include <math.h>
+#include <assert.h>
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4]);
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4]);
+
+void NvQuatIdentity(GLfloat r[4]);
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3]);
+
+void NvQuatX(GLfloat r[4], GLfloat radians);
+
+void NvQuatY(GLfloat r[4], GLfloat radians);
+
+void NvQuatZ(GLfloat r[4], GLfloat radians);
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t);
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4]);
+
+#endif
diff --git a/src/platformspecific/macos/libs/nv_types.h b/src/platformspecific/macos/libs/nv_types.h
new file mode 100644
index 0000000..1d1b030
--- /dev/null
+++ b/src/platformspecific/macos/libs/nv_types.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_TYPES_H
+#define __INCLUDED_QT3DS_TYPES_H
+
+typedef unsigned char NvU8; // 0 to 255
+typedef unsigned short NvU16; // 0 to 65535
+typedef unsigned int NvU32; // 0 to 4294967295
+typedef unsigned long long NvU64; // 0 to 18446744073709551615
+typedef signed char NvS8; // -128 to 127
+typedef signed short NvS16; // -32768 to 32767
+typedef signed int NvS32; // -2147483648 to 2147483647
+typedef signed long long NvS64; // 2^-63 to 2^63-1
+
+// Explicitly sized floats
+typedef float NvF32; // IEEE Single Precision (S1E8M23)
+typedef double NvF64; // IEEE Double Precision (S1E11M52)
+
+// Boolean type
+#define QT3DS_FALSE 0
+#define QT3DS_TRUE 1
+typedef NvU8 NvBool;
+
+// Result of sizeof operator
+typedef unsigned long NvSize;
+
+// Type large enough to hold a relative file offset
+typedef long NvOffset;
+
+// Base NULL type.
+#define QT3DS_NULL 0
+
+// Error related
+typedef enum {
+ NvError_Success = 0,
+ NvError_NotSupported,
+ NvError_NotInitialized,
+ NvError_BadParameter,
+ NvError_InsufficientMemory,
+ NvError_NoEntries,
+ NvError_UnknownError,
+} NvError;
+
+#if 1 // defined(_DEBUG) // !!!!TBD TODO
+#define NvAssert(c)
+#else
+#define NvAssert(c) ((void)((c) ? 0 : (NvHandleAssertion(#c, __FILE__, __LINE__), 0)))
+#endif
+
+// Other standardized typedefs
+typedef NvU64 NvUST; // U64 unadjusted system time value
+
+#endif
diff --git a/src/platformspecific/windows/assets/courier+lucida_256.abc b/src/platformspecific/windows/assets/courier+lucida_256.abc
new file mode 100644
index 0000000..f7e3c2f
--- /dev/null
+++ b/src/platformspecific/windows/assets/courier+lucida_256.abc
Binary files differ
diff --git a/src/platformspecific/windows/assets/courier+lucida_256.dds b/src/platformspecific/windows/assets/courier+lucida_256.dds
new file mode 100644
index 0000000..5bde760
--- /dev/null
+++ b/src/platformspecific/windows/assets/courier+lucida_256.dds
Binary files differ
diff --git a/src/platformspecific/windows/assets/courier+lucida_512.abc b/src/platformspecific/windows/assets/courier+lucida_512.abc
new file mode 100644
index 0000000..2ff7875
--- /dev/null
+++ b/src/platformspecific/windows/assets/courier+lucida_512.abc
Binary files differ
diff --git a/src/platformspecific/windows/assets/courier+lucida_512.dds b/src/platformspecific/windows/assets/courier+lucida_512.dds
new file mode 100644
index 0000000..f9e76d9
--- /dev/null
+++ b/src/platformspecific/windows/assets/courier+lucida_512.dds
Binary files differ
diff --git a/src/platformspecific/windows/assets/font.frag b/src/platformspecific/windows/assets/font.frag
new file mode 100644
index 0000000..e4673cf
--- /dev/null
+++ b/src/platformspecific/windows/assets/font.frag
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+uniform sampler2D fontTex;
+
+varying lowp vec4 col_var;
+varying lowp vec2 tex_var;
+
+void main()
+{
+ gl_FragColor = texture2D(fontTex, tex_var).a * col_var;
+}
+
diff --git a/src/platformspecific/windows/assets/font.vert b/src/platformspecific/windows/assets/font.vert
new file mode 100644
index 0000000..9f307a2
--- /dev/null
+++ b/src/platformspecific/windows/assets/font.vert
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+// this is set from higher level. think of it as the upper model matrix
+uniform mat4 pixelToClipMat;
+
+uniform vec4 col_uni;
+
+attribute vec2 pos_attr;
+attribute vec2 tex_attr;
+attribute vec4 col_attr;
+
+varying vec4 col_var;
+varying vec2 tex_var;
+
+void main()
+{
+ // account for translation and rotation of the primitive into [-1,1] spatial default.
+ gl_Position = pixelToClipMat * vec4(pos_attr.x, pos_attr.y, 0, 1);
+
+ col_var = col_attr * col_uni;
+ tex_var = tex_attr;
+}
diff --git a/src/platformspecific/windows/libs/nv_color.h b/src/platformspecific/windows/libs/nv_color.h
new file mode 100644
index 0000000..b934752
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_color.h
@@ -0,0 +1,107 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _QT3DS_COLOR_H
+#define _QT3DS_COLOR_H
+
+/** @file nv_color.h
+ Simple abstraction for RGBA colors as parameters to various libraries/functions.
+*/
+
+/** Base type for a single color channel (8-bit unsigned). */
+typedef unsigned char NvPCColor8;
+
+//#define NV_COLOR_BREAKOLD
+#ifdef NV_COLOR_BREAKOLD // uses a struct to break backwards-compat and accidental uses
+
+typedef struct
+{
+ NvPCColor8 r;
+ NvPCColor8 g;
+ NvPCColor8 b;
+ NvPCColor8 a;
+} NvPackedColor;
+
+static const NvPackedColor gnvpcwhite = { 255, 255, 255, 255 };
+static const NvPackedColor gnvpcblack = { 0, 0, 0, 255 };
+
+#define NV_PACKED_COLOR(r, g, b, a) \
+ { \
+ (NvPCColor8)(r), (NvPCColor8)(g), (NvPCColor8)(b), (NvPCColor8)(a) \
+ }
+
+#define NV_PC_PREDEF_WHITE gnvpcwhite
+#define NV_PC_PREDEF_BLACK gnvpcblack
+
+#define NV_PC_RED(c) (c.r)
+#define NV_PC_GREEN(c) (c.g)
+#define NV_PC_BLUE(c) (c.b)
+#define NV_PC_ALPHA(c) (c.a)
+
+#define NV_PC_PACK_UINT(c) (*(unsigned int *)(&(c)))
+
+#define NV_PC_EQUAL(x, y) ((x).r == (y).r && (x).g == (y).g && (x).b == (y).b && (x).a == (y).a)
+
+#else /* code that doesn't break old pass-as-uint stuff */
+
+/** Main type declaration for a packed 4-color construct. */
+typedef unsigned int NvPackedColor;
+
+/** A macro to build a packed color, passing in RGBA as four 8-bit integer values. */
+#define NV_PACKED_COLOR(r, g, b, a) \
+ ((NvPackedColor)(((((int)(a)) & 0xFF) << 24) | ((((int)(b)) & 0xFF) << 16) \
+ | ((((int)(g)) & 0xFF) << 8) | ((((int)(r)) & 0xFF))))
+
+/** A predefined constant for WHITE. */
+#define NV_PC_PREDEF_WHITE NV_PACKED_COLOR(0xFF, 0xFF, 0xFF, 0xFF)
+/** A predefined constant for BLACK. */
+#define NV_PC_PREDEF_BLACK NV_PACKED_COLOR(0x00, 0x00, 0x00, 0xFF)
+
+/** A macro for 'extracting' the red value from an NvPackedColor. */
+#define NV_PC_RED(c) ((c >> 0) & 0xff)
+/** A macro for 'extracting' the green value from an NvPackedColor. */
+#define NV_PC_GREEN(c) ((c >> 8) & 0xff)
+/** A macro for 'extracting' the blue value from an NvPackedColor. */
+#define NV_PC_BLUE(c) ((c >> 16) & 0xff)
+/** A macro for 'extracting' the alpha value from an NvPackedColor. */
+#define NV_PC_ALPHA(c) ((c >> 24) & 0xff)
+
+/** A macro requesting the packed color repacked into a 32-bit unsigned int.
+ This is a no-op for the color-as-uint approach.
+*/
+#define NV_PC_PACK_UINT(c) (c)
+/** A macro for testing the equality of two NvPackedColors. */
+#define NV_PC_EQUAL(x, y) (x == y)
+#endif
+
+/** A macro for mapping a single packed color channel into its floating point [0,1] rep. */
+#define NV_PC_TO_FLOAT(c) (c / 255.0f)
+
+#endif /*_QT3DS_COLOR_H*/
diff --git a/src/platformspecific/windows/libs/nv_config/nv_config.h b/src/platformspecific/windows/libs/nv_config/nv_config.h
new file mode 100644
index 0000000..fb0b88a
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_config/nv_config.h
@@ -0,0 +1,278 @@
+/****************************************************************************
+**
+** Copyright (C) 2007-2008 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef _QT3DS_CONFIG_H
+#define _QT3DS_CONFIG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <KD/kd.h>
+
+/** \file nv_config.h
+ Support for block-based text config files.
+
+ Supports:
+ <ul>
+ <li> C-style comment blocks
+ <li> C++-style comment lines
+ <li> Line continuation via backslash
+ <li> Linux, Mac and Windows line endings
+ <li> Arrays of tokens, broken out by line
+ <li> Tokens are split by commas and whitespace
+ <li> Quoted string tokens containing any characters
+ </ul>
+ */
+
+/** The in-memory representation of a loaded config file.
+
+ This opaque data structure is passed by pointer to all of the
+ configuration functions and represents the loaded configuration
+ file. Once loaded, there is no mutable persistent state in this
+ object. It is passed as const to all functions
+*/
+typedef struct NvConfigData NvConfigData;
+
+/** The representation of a sub-range of lines in a config file.
+
+ This structure is application-readable and mutable, and is used to
+ represent a subset of the lines in a config file. Generally, these
+ ranges represent delineated blocks in the config file. Special versions
+ of many of the config file functions take data ranges instead of
+ entire config files
+
+ @see NvConfigFindDelimitedBlock()
+*/
+typedef struct NvConfigDataRange
+{
+ /** A reference to the "parent" config file for this range */
+ NvConfigData *data;
+ /** The first line of the range (inclusive) */
+ KDint startLine;
+ /** The last line of the range (inclusive) */
+ KDint endLine;
+} NvConfigDataRange;
+
+/** Creates a config data object that represents an existing config file
+
+ @return A pointer to the allocated config data, or NULL if the file cannot
+ be found or does not conform to the basic config file format
+ @param filename The path of the config file to be loaded
+ @see NvConfigFree()
+*/
+NvConfigData *NvConfigCreateFromFile(const KDchar *filename);
+
+/** Creates a config data object from an-in memory string
+
+ Useful when the config file is loaded from a larger, packed data file,
+ or generated on-the-fly in the application. Note that the code does not
+ automatically handle NULL-terminated strings
+
+ @return A pointer to the allocated config data, or NULL if the string
+ does not conform to the basic config file format
+ @param fileBuffer A pointer to the start of the string of config data
+ @param fileSize The length of the string in characters
+ @see NvConfigFree()
+*/
+NvConfigData *NvConfigCreateFromBuffer(const KDchar *fileBuffer, KDint fileSize);
+
+/** Deletes an existing config file data object
+
+ @param data A pointer to the data object to delete
+*/
+void NvConfigFree(NvConfigData *data);
+
+/** Returns the number of token-bearing lines in the config data object.
+
+ This does not count merged lines, comment lines, or whitespace. This
+ value is one greater than the maximum valid line index in the file
+
+ @return The line count
+ @param data A pointer to the data object
+*/
+KDint NvConfigGetLineCount(const NvConfigData *data);
+
+/** Returns the number of tokens in the indexed line
+
+ @return The token count
+ @param data A pointer to the data object
+ @param line The line whose count is to be returned. This parameter must
+ be at least 0 and must be less than the line count of the object
+ @see NvConfigGetLineCount
+*/
+KDint NvConfigGetTokenCount(const NvConfigData *data, KDint line);
+
+/** Returns a NULL-terminated string token at the given line and token index
+
+ The parameters are unchecked.
+
+ @return A non-mutable token pointer for the referenced token
+ @param data A pointer to the data object
+ @param line The line whose token is to be returned. This parameter must
+ be at least 0 and must be less than the line count of the object
+ @param token The token index of the token to be returned. This parameter must
+ be at least 0 and must be less than the token count of the line
+ @see NvConfigGetLineCount
+ @see NvConfigGetTokenCount
+*/
+const KDchar *NvConfigGetToken(const NvConfigData *data, KDint line, KDint token);
+
+/** Returns the string token converted to an integer
+
+ Returns the string token at the given line and token index converted to an integer.
+ The parameters are unchecked, and the string token is assumed to be convertible to
+ an integer value.
+
+ @return The integer value of the referenced token
+ @param data A pointer to the data object
+ @param line The line whose token is to be returned. This parameter must
+ be at least 0 and must be less than the line count of the object
+ @param token The token index of the token to be returned. This parameter must
+ be at least 0 and must be less than the token count of the line
+ @see NvConfigGetLineCount
+ @see NvConfigGetTokenCount
+*/
+KDint NvConfigGetIntToken(const NvConfigData *data, KDint line, KDint token);
+
+/** Returns the string token converted to a floating-point value
+
+ Returns the string token at the given line and token index converted to a
+ floating-point number. The parameters are unchecked, and the string token
+ is assumed to be convertible to a real value.
+
+ @return The floating-point value of the referenced token
+ @param data A pointer to the data object
+ @param line The line whose token is to be returned. This parameter must
+ be at least 0 and must be less than the line count of the object
+ @param token The token index of the token to be returned. This parameter must
+ be at least 0 and must be less than the token count of the line
+ @see NvConfigGetLineCount
+ @see NvConfigGetTokenCount
+*/
+KDfloat32 NvConfigGetFloatToken(const NvConfigData *data, KDint line, KDint token);
+
+/** Returns the count of lines in the config data whose leading token
+ matches a given string
+
+ The search starts at the indicated line and continues to the end of the file
+
+ @return The count of matching lines
+ @param data A pointer to the data object
+ @param name The string to be matched (case-sensitive)
+ @param startLine The line at which the search should start. This parameter must
+ be at least 0 and must be less than the line count of the object
+ @see NvConfigGetLineCount
+*/
+KDint NvConfigCountMatchingLines(const NvConfigData *data, const KDchar *name, KDint startLine);
+
+/** Returns the count of lines in the subrange of the config data
+ whose leading token matches a given string
+
+ The search is run only in the given subrange of the file
+
+ @return The count of matching lines
+ @param range A pointer to the subrange of the data object
+ @param name The string to be matched (case-sensitive)
+*/
+KDint NvConfigCountMatchingLinesInRange(const NvConfigDataRange *range, const KDchar *name);
+
+/** Returns the index of the first line in the config data (at or after
+ the given start line) whose leading token matches a given string
+
+ The search starts at the indicated line and continues to the end of the
+ file
+
+ @return The index of the first matching line, or -1 if no match
+ @param data A pointer to the data object
+ @param name The string to be matched (case-sensitive)
+ @param startLine The line at which the search should start. This parameter must
+ be at least 0 and must be less than the line count of the object
+ @see NvConfigGetLineCount
+*/
+KDint NvConfigFindMatchingLine(const NvConfigData *data, const KDchar *name, KDint startLine);
+
+/** Returns the index of the first line in the subrange of the config data
+ whose leading token matches a given string
+
+ The search is run only in the given subrange of the file
+
+ @return The index of the first matching line, or -1 if no match
+ @param range A pointer to the subrange of the data object
+ @param name The string to be matched (case-sensitive)
+*/
+KDint NvConfigFindMatchingLineInRange(const NvConfigDataRange *range, const KDchar *name);
+
+/** Finds a matching token-delimited block in the file and returns it as a subrange.
+
+ Searches for a token-delimited open/close block in the given line range.
+ If the nested parameter is true, then additional nested open/close blocks
+ are tracked and the returned block is the one that properly closes the
+ given open block. If the nested flag is false, then the open/close are
+ treated like C-comments, and the first closing token found is returned
+
+ @return KD_TRUE if a block with both an open and a close token is found,
+ KD_FALSE otherwise
+ @param data A pointer to the data object
+ @param openText The string token to be matched as the start of a block.
+ (case-sensitive) Only the leading token of each line is tested
+ @param closeText The string token to be matched as the end of a block.
+ (case-sensitive) Only the leading token of each line is tested
+ @param nested If KD_TRUE, C-bracket-style nesting is used to determine
+ which end token is matched. If KD_FALSE, C-comment-style flat matching
+ is used to match the end token.
+ @param startLine The index of the first line to search (inclusive)
+ @param endLine The index of the last line to search (inclusive)
+ @param range Output: A pointer to the subrange of the data object. This
+ should be a pointer to an allocated struct
+*/
+KDboolean NvConfigFindDelimitedBlock(const NvConfigData *data, const KDchar *openText,
+ const KDchar *closeText, KDboolean nested, KDint startLine,
+ KDint endLine, NvConfigDataRange *range);
+
+/** Returns the index of the first matching token in the given line
+
+ Returns the index of the first token on the given line (if any) that
+ matches the given string.
+
+ @return The index of the matching string token in the line, or else -1 if
+ the token is not found in the line
+ @param data A pointer to the data object
+ @param token The string to be matched (case-sensitive)
+ @param line The line to search. This parameter must
+ be at least 0 and must be less than the line count of the object
+ @see NvConfigGetLineCount
+*/
+KDint NvConfigFindMatchingTokenInLine(const NvConfigData *data, const KDchar *token, KDint line);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_debug.h b/src/platformspecific/windows/libs/nv_debug.h
new file mode 100644
index 0000000..2559dd6
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_debug.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_DEBUG_H
+#define __INCLUDED_QT3DS_DEBUG_H
+
+#define CT_ASSERT(tag, cond) enum { COMPILE_TIME_ASSERT__##tag = 1 / (cond) }
+
+#define dimof(x) (sizeof(x) / sizeof(x[0]))
+#include <android/log.h>
+
+#define DBG_DETAILED 0
+
+#if 0
+
+ // the detailed prefix can be customised by setting DBG_DETAILED_PREFIX. See
+ // below as a reference.
+ // NOTE: fmt is the desired format string and must be in the prefix.
+ //#ifndef DBG_DETAILED_PREFIX
+ // #define DBG_DETAILED_PREFIX "%s, %s, line %d: " fmt, __FILE__, __FUNCTION__, __LINE__,
+ //#endif
+ //#define DEBUG_D_(fmt, args...)
+ //#define DEBUG_D(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, (DBG_DETAILED_PREFIX) ## args)
+
+#else
+
+#ifdef STRINGIFY
+#pragma push_macro("STRINGIFY")
+#undef STRINGIFY
+#define STRINGIFYPUSHED_____
+#endif
+#define STRINGIFY(x) #x
+
+// debug macro, includes file name function name and line number
+#define TO(x) typeof(x)
+#define DEBUG_D_(file, line, fmt, args...) \
+ __android_log_print(ANDROID_LOG_DEBUG, MODULE, file ", %s, line(" STRINGIFY(line) "): " fmt, \
+ __FUNCTION__, ##args)
+#define DEBUG_D(fmt, args...) DEBUG_D_(__FILE__, __LINE__, fmt, ##args)
+
+#ifdef STRINGIFYPUSHED_____
+#undef STRINGIFYPUSHED_____
+#pragma pop_macro("STRINGIFY")
+#endif
+
+#endif
+
+// basic debug macro
+#define DEBUG_(fmt, args...) (__android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ##args))
+
+// Debug macro that can be switched to spew a file name,
+// function and line number using DEBUG_DETAILED
+#if DBG_DETAILED == 1
+#define DEBUG(fmt, args...) DEBUG_D(fmt, ##args)
+#else
+#define DEBUG(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, MODULE, fmt, ##args)
+#endif
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_global.h b/src/platformspecific/windows/libs/nv_global.h
new file mode 100644
index 0000000..9d23d45
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_global.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_GLOBAL_H
+#define __INCLUDED_QT3DS_GLOBAL_H
+
+#include "nv_types.h"
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_math/NvVec.h b/src/platformspecific/windows/libs/nv_math/NvVec.h
new file mode 100644
index 0000000..4e5b09c
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/NvVec.h
@@ -0,0 +1,316 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_VEC_H
+#define INCLUDED_QT3DS_MATH_CPP_VEC_H
+
+#include "misc.h"
+
+struct _NvVec3
+{
+ union {
+ struct
+ {
+ float x, y, z;
+ };
+ float v[3];
+ };
+};
+
+struct NvVec3 : public _NvVec3
+{
+ NvVec3() { zero(); }
+
+ NvVec3(float x, float y, float z)
+ {
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+ }
+
+ NvVec3(NvVec3 const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ v[2] = that.v[2];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ v[2] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 3) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec3 &operator+=(NvVec3 const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ v[2] += that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator-=(NvVec3 const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ v[2] -= that.v[2];
+ return *this;
+ }
+
+ NvVec3 &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ v[2] *= s;
+ return *this;
+ }
+
+ NvVec3 &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ v[2] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec3 const &a, NvVec3 const &b)
+{
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+inline NvVec3 operator+(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] + b.v[0], a.v[1] + b.v[1], a.v[2] + b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[0] - b.v[0], a.v[1] - b.v[1], a.v[2] - b.v[2]);
+}
+
+inline NvVec3 operator-(NvVec3 const &a)
+{
+
+ return NvVec3(-a.v[0], -a.v[1], -a.v[2]);
+}
+
+inline NvVec3 operator*(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] * s, a.v[1] * s, a.v[2] * s);
+}
+
+inline NvVec3 operator*(float s, NvVec3 const &a)
+{
+
+ return NvVec3(s * a.v[0], s * a.v[1], s * a.v[2]);
+}
+
+inline NvVec3 operator/(NvVec3 const &a, float s)
+{
+
+ return NvVec3(a.v[0] / s, a.v[1] / s, a.v[2] / s);
+}
+
+inline float magnitude(NvVec3 const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec3 normalize(NvVec3 const &v)
+{
+ float l = magnitude(v);
+ return NvVec3(v[0] / l, v[1] / l, v[2] / l);
+}
+
+inline NvVec3 cross(NvVec3 const &a, NvVec3 const &b)
+{
+
+ return NvVec3(a.v[1] * b.v[2] - a.v[2] * b.v[1], a.v[2] * b.v[0] - a.v[0] * b.v[2],
+ a.v[0] * b.v[1] - a.v[1] * b.v[0]);
+}
+
+inline bool operator==(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] == b.v[0] && a.v[1] == b.v[1] && a.v[2] == b.v[2]);
+}
+
+inline bool operator!=(NvVec3 const &a, NvVec3 const &b)
+{
+ return (a.v[0] != b.v[0] || a.v[1] != b.v[1] || a.v[2] != b.v[2]);
+}
+
+struct NvVec2f
+{
+ union {
+ struct
+ {
+ float x, y;
+ float v[2];
+ };
+ };
+
+ NvVec2f() { zero(); }
+
+ NvVec2f(float x, float y)
+ {
+ v[0] = x;
+ v[1] = y;
+ }
+
+ NvVec2f(NvVec2f const &that)
+ {
+ v[0] = that.v[0];
+ v[1] = that.v[1];
+ }
+
+ inline void zero()
+ {
+ v[0] = 0.0f;
+ v[1] = 0.0f;
+ }
+
+ inline float &operator[](int i)
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ inline float const &operator[](int i) const
+ {
+ assert((i < 2) && (i >= 0));
+ return v[i];
+ }
+
+ NvVec2f &operator+=(NvVec2f const &that)
+ {
+ v[0] += that.v[0];
+ v[1] += that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator-=(NvVec2f const &that)
+ {
+ v[0] -= that.v[0];
+ v[1] -= that.v[1];
+ return *this;
+ }
+
+ NvVec2f &operator*=(float s)
+ {
+ v[0] *= s;
+ v[1] *= s;
+ return *this;
+ }
+
+ NvVec2f &operator/=(float s)
+ {
+ v[0] /= s;
+ v[1] /= s;
+ return *this;
+ }
+};
+
+inline float dot(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a[0] * b[0] + a[1] * b[1];
+}
+
+inline NvVec2f operator+(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] + b.v[0], a.v[1] + b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return NvVec2f(a.v[0] - b.v[0], a.v[1] - b.v[1]);
+}
+
+inline NvVec2f operator-(NvVec2f const &a)
+{
+
+ return NvVec2f(-a.v[0], -a.v[1]);
+}
+
+inline NvVec2f operator*(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] * s, a.v[1] * s);
+}
+
+inline NvVec2f operator*(float s, NvVec2f const &a)
+{
+
+ return NvVec2f(s * a.v[0], s * a.v[1]);
+}
+
+inline NvVec2f operator/(NvVec2f const &a, float s)
+{
+
+ return NvVec2f(a.v[0] / s, a.v[1] / s);
+}
+
+inline float magnitude(NvVec2f const &v)
+{
+ return sqrtf(dot(v, v));
+}
+
+inline NvVec2f normalize(NvVec2f const &v)
+{
+ float l = dot(v, v);
+ return NvVec2f(v[0] / l, v[1] / l);
+}
+
+inline float cross(NvVec2f const &a, NvVec2f const &b)
+{
+
+ return a.v[0] * b.v[1] - b.v[0] * a.v[1];
+}
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_math/misc.h b/src/platformspecific/windows/libs/nv_math/misc.h
new file mode 100644
index 0000000..983410f
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/misc.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QT3DS_MATH_CPP_MISC_H
+#define INCLUDED_QT3DS_MATH_CPP_MISC_H
+
+inline bool nvIsPowerOfTwo(unsigned int i)
+{
+ return (i & (i - 1)) == 0;
+}
+
+inline float nvDegToRadf(float d)
+{
+ return d * 3.14159265358979323846f / 180.0f;
+}
+
+inline float nvRadToDegf(float r)
+{
+ return r * 180.0f / 3.14159265358979323846f;
+}
+
+/*
+ 'mod' differs from '%' in that it behaves correctly when either the
+ numerator or denominator is negative.
+*/
+
+inline int nvMod(int n, int d)
+{
+ int m = n % d;
+ return (((m < 0) && (d > 0)) || ((m > 0) && (d < 0))) ? (m + d) : m;
+}
+
+inline int nvAbs(int n)
+{
+ if (n < 0)
+ return -n;
+ return n;
+}
+
+inline int nvSign(int n)
+{
+ if (n > 0)
+ return 1;
+ if (n < 0)
+ return -1;
+ return 0;
+}
+
+/*
+ This returns the smallest amplitude value x such that
+ nvMod(b + x, m) == a
+*/
+
+inline int nvDifMod(int a, int b, int m)
+{
+
+ int x1 = a - b;
+ int x2 = (x1 > 0) ? x1 - m : x1 + m;
+ return (nvAbs(x1) < nvAbs(x2)) ? x1 : x2;
+}
+
+inline float nvWrapf(float a, float min, float max)
+{
+
+ assert(max > min);
+
+ float d = max - min;
+ float s = a - min;
+ float q = s / d;
+ float m = q - floorf(q);
+ return m * d + min;
+}
+
+inline float nvClampf(float a, float min, float max)
+{
+ return (a < min) ? min : ((a > max) ? max : a);
+}
+
+inline int nvClampi(int i, int min, int max)
+{
+ return (i < min) ? min : ((i > max) ? max : i);
+}
+
+inline float nvGaussian(float x, float s)
+{
+ float c = s * sqrtf(2.0f * 3.14159265358979323846f);
+ return expf(-(x * x) / (2.0f * s * s)) / c;
+}
+
+inline float nvLerpf(float a, float b, float t)
+{
+ return a * (1.0f - t) + b * t;
+}
+
+inline float nvEasef(float t)
+{
+
+ float t_2 = t * t;
+ float t_3 = t_2 * t;
+ return 3.0f * t_2 - 2.0f * t_3;
+}
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_math/nv_math.cpp b/src/platformspecific/windows/libs/nv_math/nv_math.cpp
new file mode 100644
index 0000000..b83cb39
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/nv_math.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_math.h"
+
+static const double a = 16807.0;
+static const double m = 2147483647.0;
+
+static double nextSeed(double seed)
+{
+ double t = a * seed;
+ return t - m * (double)((int)(t / m));
+}
+
+GLfloat NvRandf()
+{
+ static double seed = 1.0;
+ seed = nextSeed(seed);
+ return (GLfloat)(seed * (1 / m));
+}
+
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime)
+{
+ // kdGetTimeUST is never supposed to decrease (i.e. that
+ // means it can't wrap, either. IIRC, it will wrap in
+ // 593 years). So we ignore that option...
+
+ // Used for frame-to-frame diffs, this will fit in 32b
+ // as long as the times are < ~4.3s apart
+ long long int diffTime = newTime - oldTime;
+
+ // Need to find a better way to do this.
+ // However, I believe we will be uSec precise (not run
+ // out of mantissa bits for uSecs) as long as the diff
+ // is < ~16s (1e-6 * (2^24))
+ return ((GLfloat)diffTime) / 1.0e9f;
+}
diff --git a/src/platformspecific/windows/libs/nv_math/nv_math.h b/src/platformspecific/windows/libs/nv_math/nv_math.h
new file mode 100644
index 0000000..ec729a7
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/nv_math.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _QT3DS_MATH_H
+#define _QT3DS_MATH_H
+
+#include <QtOpenGL/qgl.h>
+
+GLfloat NvRandf();
+
+/* These are the recommended "safer" ways to use GLfloat for time */
+
+/* Returns the seconds between the two given times */
+GLfloat NvClockDiffInSecs(long long int newTime, long long int oldTime);
+
+#define QT3DS_MILISECS_TO_UST(ms) ((long long int)(ms)*1000000)
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_math/nv_matrix.cpp b/src/platformspecific/windows/libs/nv_math/nv_matrix.cpp
new file mode 100644
index 0000000..e208ac3
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/nv_matrix.cpp
@@ -0,0 +1,1030 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_matrix.h"
+
+int NvDifferentMatsf(GLfloat a[4][4], const GLfloat b[4][4])
+{
+ return ((&a[3][3] < &b[0][0]) || (&b[3][3] < &a[0][0]));
+}
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+}
+
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4])
+{
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+}
+
+GLfloat NvVecLengthf(const GLfloat v[3])
+{
+ return sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+}
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3])
+{
+ GLfloat const l = NvVecLengthf(v);
+ r[0] = v[0] / l;
+ r[1] = v[1] / l;
+ r[2] = v[2] / l;
+}
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] + b[0];
+ r[1] = a[1] + b[1];
+ r[2] = a[2] + b[2];
+}
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ r[0] = a[0] - b[0];
+ r[1] = a[1] - b[1];
+ r[2] = a[2] - b[2];
+}
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3])
+{
+ GLfloat t[3];
+
+ t[0] = a[1] * b[2] - a[2] * b[1];
+ t[1] = a[2] * b[0] - a[0] * b[2];
+ t[2] = a[0] * b[1] - a[1] * b[0];
+
+ r[0] = t[0];
+ r[1] = t[1];
+ r[2] = t[2];
+}
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ GLfloat inv_w = 1.0f / (m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3]);
+
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * inv_w;
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * inv_w;
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * inv_w;
+}
+
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2] + m[3][0] * a[3];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2] + m[3][1] * a[3];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2] + m[3][2] * a[3];
+ r[3] = m[0][3] * a[0] + m[1][3] * a[1] + m[2][3] * a[2] + m[3][3] * a[3];
+}
+
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3])
+{
+ r[0] = m[0][0] * a[0] + m[1][0] * a[1] + m[2][0] * a[2];
+ r[1] = m[0][1] * a[0] + m[1][1] * a[1] + m[2][1] * a[2];
+ r[2] = m[0][2] * a[0] + m[1][2] * a[1] + m[2][2] * a[2];
+}
+
+static void NvMultMat3x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x3f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2];
+ r[0][3] = 0.0f;
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2];
+ r[1][3] = 0.0f;
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2];
+ r[3][3] = 1.0f;
+}
+
+static void NvMultMat4x4f(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ assert(NvDifferentMatsf(r, a) && NvDifferentMatsf(r, b));
+
+ r[0][0] = a[0][0] * b[0][0] + a[1][0] * b[0][1] + a[2][0] * b[0][2] + a[3][0] * b[0][3];
+ r[0][1] = a[0][1] * b[0][0] + a[1][1] * b[0][1] + a[2][1] * b[0][2] + a[3][1] * b[0][3];
+ r[0][2] = a[0][2] * b[0][0] + a[1][2] * b[0][1] + a[2][2] * b[0][2] + a[3][2] * b[0][3];
+ r[0][3] = a[0][3] * b[0][0] + a[1][3] * b[0][1] + a[2][3] * b[0][2] + a[3][3] * b[0][3];
+
+ r[1][0] = a[0][0] * b[1][0] + a[1][0] * b[1][1] + a[2][0] * b[1][2] + a[3][0] * b[1][3];
+ r[1][1] = a[0][1] * b[1][0] + a[1][1] * b[1][1] + a[2][1] * b[1][2] + a[3][1] * b[1][3];
+ r[1][2] = a[0][2] * b[1][0] + a[1][2] * b[1][1] + a[2][2] * b[1][2] + a[3][2] * b[1][3];
+ r[1][3] = a[0][3] * b[1][0] + a[1][3] * b[1][1] + a[2][3] * b[1][2] + a[3][3] * b[1][3];
+
+ r[2][0] = a[0][0] * b[2][0] + a[1][0] * b[2][1] + a[2][0] * b[2][2] + a[3][0] * b[2][3];
+ r[2][1] = a[0][1] * b[2][0] + a[1][1] * b[2][1] + a[2][1] * b[2][2] + a[3][1] * b[2][3];
+ r[2][2] = a[0][2] * b[2][0] + a[1][2] * b[2][1] + a[2][2] * b[2][2] + a[3][2] * b[2][3];
+ r[2][3] = a[0][3] * b[2][0] + a[1][3] * b[2][1] + a[2][3] * b[2][2] + a[3][3] * b[2][3];
+
+ r[3][0] = a[0][0] * b[3][0] + a[1][0] * b[3][1] + a[2][0] * b[3][2] + a[3][0] * b[3][3];
+ r[3][1] = a[0][1] * b[3][0] + a[1][1] * b[3][1] + a[2][1] * b[3][2] + a[3][1] * b[3][3];
+ r[3][2] = a[0][2] * b[3][0] + a[1][2] * b[3][1] + a[2][2] * b[3][2] + a[3][2] * b[3][3];
+ r[3][3] = a[0][3] * b[3][0] + a[1][3] * b[3][1] + a[2][3] * b[3][2] + a[3][3] * b[3][3];
+}
+
+void NvMultMatf(GLfloat result[4][4], const GLfloat a[4][4], const GLfloat b[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((a[0][3] == 0.0f) && (a[1][3] == 0.0f) && (a[2][3] == 0.0f) && (a[2][3] == 1.0f)
+ && (b[0][3] == 0.0f) && (b[1][3] == 0.0f) && (b[2][3] == 0.0f) && (b[2][3] == 1.0f)) {
+ if ((a[3][0] == 0.0f) && (a[3][1] == 0.0f) && (a[3][2] == 0.0f) && (b[3][0] == 0.0f)
+ && (b[3][1] == 0.0f) && (b[3][2] == 0.0f)) {
+ NvMultMat3x3f(r, a, b);
+ } else {
+ NvMultMat4x3f(r, a, b);
+ }
+ } else {
+ NvMultMat4x4f(r, a, b);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+static void NvInvMat3x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x3f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1] + -m[0][1] * m[1][0] * m[2][2]
+ + -m[0][2] * m[1][1] * m[2][0];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / d;
+ r[0][1] = (m[0][2] * m[2][1] - m[0][1] * m[2][2]) / d;
+ r[0][2] = (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / d;
+ r[0][3] = 0.0f;
+
+ r[1][0] = (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / d;
+ r[1][1] = (m[0][0] * m[2][2] - m[0][2] * m[2][0]) / d;
+ r[1][2] = (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / d;
+ r[1][3] = 0.0f;
+
+ r[2][0] = (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / d;
+ r[2][1] = (m[0][1] * m[2][0] - m[0][0] * m[2][1]) / d;
+ r[2][2] = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / d;
+ r[2][3] = 0.0f;
+
+ /* x */
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ /* y */
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ /* z */
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = 1.0f;
+}
+
+static void NvInvMat4x4f(GLfloat r[4][4], const GLfloat m[4][4])
+{
+ GLfloat d = m[0][0] * m[1][1] * m[2][2] * m[3][3] + m[0][0] * m[1][2] * m[2][3] * m[3][1]
+ + m[0][0] * m[1][3] * m[2][1] * m[3][2] + m[0][1] * m[1][0] * m[2][3] * m[3][2]
+ + m[0][1] * m[1][2] * m[2][0] * m[3][3] + m[0][1] * m[1][3] * m[2][2] * m[3][0]
+ + m[0][2] * m[1][0] * m[2][1] * m[3][3] + m[0][2] * m[1][1] * m[2][3] * m[3][0]
+ + m[0][2] * m[1][3] * m[2][0] * m[3][1] + m[0][3] * m[1][0] * m[2][2] * m[3][1]
+ + m[0][3] * m[1][1] * m[2][0] * m[3][2] + m[0][3] * m[1][2] * m[2][1] * m[3][0]
+ + -m[0][0] * m[1][1] * m[2][3] * m[3][2] + -m[0][0] * m[1][2] * m[2][1] * m[3][3]
+ + -m[0][0] * m[1][3] * m[2][2] * m[3][1] + -m[0][1] * m[1][0] * m[2][2] * m[3][3]
+ + -m[0][1] * m[1][2] * m[2][3] * m[3][0] + -m[0][1] * m[1][3] * m[2][0] * m[3][2]
+ + -m[0][2] * m[1][0] * m[2][3] * m[3][1] + -m[0][2] * m[1][1] * m[2][0] * m[3][3]
+ + -m[0][2] * m[1][3] * m[2][1] * m[3][0] + -m[0][3] * m[1][0] * m[2][1] * m[3][2]
+ + -m[0][3] * m[1][1] * m[2][2] * m[3][0] + -m[0][3] * m[1][2] * m[2][0] * m[3][1];
+
+ assert(NvDifferentMatsf(r, m));
+
+ r[0][0] = (m[1][1] * m[2][2] * m[3][3] + m[1][2] * m[2][3] * m[3][1]
+ + m[1][3] * m[2][1] * m[3][2] + -m[1][1] * m[2][3] * m[3][2]
+ + -m[1][2] * m[2][1] * m[3][3] + -m[1][3] * m[2][2] * m[3][1])
+ / d;
+
+ r[0][1] = (m[0][1] * m[2][3] * m[3][2] + m[0][2] * m[2][1] * m[3][3]
+ + m[0][3] * m[2][2] * m[3][1] + -m[0][1] * m[2][2] * m[3][3]
+ + -m[0][2] * m[2][3] * m[3][1] + -m[0][3] * m[2][1] * m[3][2])
+ / d;
+
+ r[0][2] = (m[0][1] * m[1][2] * m[3][3] + m[0][2] * m[1][3] * m[3][1]
+ + m[0][3] * m[1][1] * m[3][2] + -m[0][1] * m[1][3] * m[3][2]
+ + -m[0][2] * m[1][1] * m[3][3] + -m[0][3] * m[1][2] * m[3][1])
+ / d;
+
+ r[0][3] = (m[0][1] * m[1][3] * m[2][2] + m[0][2] * m[1][1] * m[2][3]
+ + m[0][3] * m[1][2] * m[2][1] + -m[0][1] * m[1][2] * m[2][3]
+ + -m[0][2] * m[1][3] * m[2][1] + -m[0][3] * m[1][1] * m[2][2])
+ / d;
+
+ r[1][0] = (m[1][0] * m[2][3] * m[3][2] + m[1][2] * m[2][0] * m[3][3]
+ + m[1][3] * m[2][2] * m[3][0] + -m[1][0] * m[2][2] * m[3][3]
+ + -m[1][2] * m[2][3] * m[3][0] + -m[1][3] * m[2][0] * m[3][2])
+ / d;
+
+ r[1][1] = (m[0][0] * m[2][2] * m[3][3] + m[0][2] * m[2][3] * m[3][0]
+ + m[0][3] * m[2][0] * m[3][2] + -m[0][0] * m[2][3] * m[3][2]
+ + -m[0][2] * m[2][0] * m[3][3] + -m[0][3] * m[2][2] * m[3][0])
+ / d;
+
+ r[1][2] = (m[0][0] * m[1][3] * m[3][2] + m[0][2] * m[1][0] * m[3][3]
+ + m[0][3] * m[1][2] * m[3][0] + -m[0][0] * m[1][2] * m[3][3]
+ + -m[0][2] * m[1][3] * m[3][0] + -m[0][3] * m[1][0] * m[3][2])
+ / d;
+
+ r[1][3] = (m[0][0] * m[1][2] * m[2][3] + m[0][2] * m[1][3] * m[2][0]
+ + m[0][3] * m[1][0] * m[2][2] + -m[0][0] * m[1][3] * m[2][2]
+ + -m[0][2] * m[1][0] * m[2][3] + -m[0][3] * m[1][2] * m[2][0])
+ / d;
+
+ r[2][0] = (m[1][0] * m[2][1] * m[3][3] + m[1][1] * m[2][3] * m[3][0]
+ + m[1][3] * m[2][0] * m[3][1] + -m[1][0] * m[2][3] * m[3][1]
+ + -m[1][1] * m[2][0] * m[3][3] + -m[1][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][1] =
+ (-m[0][0] * m[2][1] * m[3][3] + -m[0][1] * m[2][3] * m[3][0] + -m[0][3] * m[2][0] * m[3][1]
+ + m[0][0] * m[2][3] * m[3][1] + m[0][1] * m[2][0] * m[3][3] + m[0][3] * m[2][1] * m[3][0])
+ / d;
+
+ r[2][2] = (m[0][0] * m[1][1] * m[3][3] + m[0][1] * m[1][3] * m[3][0]
+ + m[0][3] * m[1][0] * m[3][1] + -m[0][0] * m[1][3] * m[3][1]
+ + -m[0][1] * m[1][0] * m[3][3] + -m[0][3] * m[1][1] * m[3][0])
+ / d;
+
+ r[2][3] = (m[0][0] * m[1][3] * m[2][1] + m[0][1] * m[1][0] * m[2][3]
+ + m[0][3] * m[1][1] * m[2][0] + -m[0][1] * m[1][3] * m[2][0]
+ + -m[0][3] * m[1][0] * m[2][1] + -m[0][0] * m[1][1] * m[2][3])
+ / d;
+
+ r[3][0] = (m[1][0] * m[2][2] * m[3][1] + m[1][1] * m[2][0] * m[3][2]
+ + m[1][2] * m[2][1] * m[3][0] + -m[1][0] * m[2][1] * m[3][2]
+ + -m[1][1] * m[2][2] * m[3][0] + -m[1][2] * m[2][0] * m[3][1])
+ / d;
+
+ r[3][1] = (m[0][0] * m[2][1] * m[3][2] + m[0][1] * m[2][2] * m[3][0]
+ + m[0][2] * m[2][0] * m[3][1] + -m[0][0] * m[2][2] * m[3][1]
+ + -m[0][1] * m[2][0] * m[3][2] + -m[0][2] * m[2][1] * m[3][0])
+ / d;
+
+ r[3][2] = (m[0][0] * m[1][2] * m[3][1] + m[0][1] * m[1][0] * m[3][2]
+ + m[0][2] * m[1][1] * m[3][0] + -m[0][0] * m[1][1] * m[3][2]
+ + -m[0][1] * m[1][2] * m[3][0] + -m[0][2] * m[1][0] * m[3][1])
+ / d;
+
+ r[3][3] = (m[0][0] * m[1][1] * m[2][2] + m[0][1] * m[1][2] * m[2][0]
+ + m[0][2] * m[1][0] * m[2][1] + -m[0][0] * m[1][2] * m[2][1]
+ + -m[0][1] * m[1][0] * m[2][2] + -m[0][2] * m[1][1] * m[2][0])
+ / d;
+}
+
+void NvInvMatf(GLfloat result[4][4], const GLfloat m[4][4])
+{
+ /*
+ Use a temporary matrix for the result and copy the temporary
+ into the result when finished. Doing this instead of writing
+ the result directly guarantees that the routine will work even
+ if the result overlaps one or more of the arguments in
+ memory.
+ */
+
+ GLfloat r[4][4];
+
+ if ((m[0][3] == 0.0f) && (m[1][3] == 0.0f) && (m[2][3] == 0.0f) && (m[2][3] == 1.0f)) {
+ if ((m[3][0] == 0.0f) && (m[3][1] == 0.0f) && (m[3][2] == 0.0f)) {
+ NvInvMat3x3f(r, m);
+ } else {
+ NvInvMat4x3f(r, m);
+ }
+ } else {
+ NvInvMat4x4f(r, m);
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildIdentityMatf(GLfloat r[4][4])
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = x;
+ r[3][1] = y;
+ r[3][2] = z;
+ r[3][3] = 1.0f;
+}
+
+void NvMultTranslateMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y,
+ GLfloat z)
+{
+ GLfloat r[4][4]; /*temporary storage for result */
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[0][0] * x + m[1][0] * y + m[2][0] * z + m[3][0];
+ r[3][1] = m[0][1] * x + m[1][1] * y + m[2][1] * z + m[3][1];
+ r[3][2] = m[0][2] * x + m[1][2] * y + m[2][2] * z + m[3][2];
+ r[3][3] = m[0][3] * x + m[1][3] * y + m[2][3] * z + m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+ r[0][0] = x;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = y;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = z;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultScaleMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z)
+{
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * x;
+ r[0][1] = m[0][1] * x;
+ r[0][2] = m[0][2] * x;
+ r[0][3] = m[0][3] * x;
+
+ r[1][0] = m[1][0] * y;
+ r[1][1] = m[1][1] * y;
+ r[1][2] = m[1][2] * y;
+ r[1][3] = m[1][3] * y;
+
+ r[2][0] = m[2][0] * z;
+ r[2][1] = m[2][1] * z;
+ r[2][2] = m[2][2] * z;
+ r[2][3] = m[2][3] * z;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = 1.0f;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = c;
+ r[1][2] = s;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = -s;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = 0.0f;
+ r[0][2] = -s;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = 1.0f;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = s;
+ r[2][1] = 0.0f;
+ r[2][2] = c;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ r[0][0] = c;
+ r[0][1] = s;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = -s;
+ r[1][1] = c;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvMultRotXRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0];
+ r[0][1] = m[0][1];
+ r[0][2] = m[0][2];
+ r[0][3] = m[0][3];
+
+ r[1][0] = m[1][0] * c + m[2][0] * s;
+ r[1][1] = m[1][1] * c + m[2][1] * s;
+ r[1][2] = m[1][2] * c + m[2][2] * s;
+ r[1][3] = m[1][3] * c + m[2][3] * s;
+
+ r[2][0] = m[1][0] * -s + m[2][0] * c;
+ r[2][1] = m[1][1] * -s + m[2][1] * c;
+ r[2][2] = m[1][2] * -s + m[2][2] * c;
+ r[2][3] = m[1][3] * -s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotYRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[2][0] * -s;
+ r[0][1] = m[0][1] * c + m[2][1] * -s;
+ r[0][2] = m[0][2] * c + m[2][2] * -s;
+ r[0][3] = m[0][3] * c + m[2][3] * -s;
+
+ r[1][0] = m[1][0];
+ r[1][1] = m[1][1];
+ r[1][2] = m[1][2];
+ r[1][3] = m[1][3];
+
+ r[2][0] = m[0][0] * s + m[2][0] * c;
+ r[2][1] = m[0][1] * s + m[2][1] * c;
+ r[2][2] = m[0][2] * s + m[2][2] * c;
+ r[2][3] = m[0][3] * s + m[2][3] * c;
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvMultRotZRadMatf(GLfloat result[4][4], const GLfloat m[4][4], GLfloat radians)
+{
+
+ GLfloat const s = sinf(radians);
+ GLfloat const c = cosf(radians);
+
+ GLfloat r[4][4];
+
+ r[0][0] = m[0][0] * c + m[1][0] * s;
+ r[0][1] = m[0][1] * c + m[1][1] * s;
+ r[0][2] = m[0][2] * c + m[1][2] * s;
+ r[0][3] = m[0][3] * c + m[1][3] * s;
+
+ r[1][0] = m[0][0] * -s + m[1][0] * c;
+ r[1][1] = m[0][1] * -s + m[1][1] * c;
+ r[1][2] = m[0][2] * -s + m[1][2] * c;
+ r[1][3] = m[0][3] * -s + m[1][3] * c;
+
+ r[2][0] = m[2][0];
+ r[2][1] = m[2][1];
+ r[2][2] = m[2][2];
+ r[2][3] = m[2][3];
+
+ r[3][0] = m[3][0];
+ r[3][1] = m[3][1];
+ r[3][2] = m[3][2];
+ r[3][3] = m[3][3];
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotRadMatf(GLfloat result[4][4], const GLfloat axis[3], GLfloat radians)
+{
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ /* build a matrix from the quat */
+
+ result[0][0] = 1.0f - 2.0f * (j * j + k * k);
+ result[0][1] = 2.0f * (i * j + r * k);
+ result[0][2] = 2.0f * (i * k - r * j);
+ result[0][3] = 0.0f;
+
+ result[1][0] = 2.0f * (i * j - r * k);
+ result[1][1] = 1.0f - 2.0f * (i * i + k * k);
+ result[1][2] = 2.0f * (j * k + r * i);
+ result[1][3] = 0.0f;
+
+ result[2][0] = 2.0f * (i * k + r * j);
+ result[2][1] = 2.0f * (j * k - r * i);
+ result[2][2] = 1.0f - 2.0f * (i * i + j * j);
+ result[2][3] = 0.0f;
+
+ result[3][0] = 0.0f;
+ result[3][1] = 0.0f;
+ result[3][2] = 0.0f;
+ result[3][3] = 1.0f;
+}
+
+void NvMultRotRadMatf(GLfloat result[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians)
+{
+ GLfloat r[4][4];
+
+ {
+ /* build a quat first */
+
+ GLfloat i, j, k, r;
+
+ /* should be */
+ GLfloat const dst_l = sinf(radians / 2.0f);
+
+ /* actually is */
+ GLfloat const src_l = sqrtf(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
+
+ if (src_l <= KD_FLT_EPSILON) {
+ i = 0.0f;
+ j = 0.0f;
+ k = 0.0f;
+ r = 1.0f;
+ } else {
+ GLfloat const s = dst_l / src_l;
+ i = axis[0] * s;
+ j = axis[1] * s;
+ k = axis[2] * s;
+ r = cosf(radians / 2.0f);
+ }
+
+ {
+ /* build a matrix from the quat */
+
+ GLfloat const a00 = 1.0f - 2.0f * (j * j + k * k);
+ GLfloat const a01 = 2.0f * (i * j + r * k);
+ GLfloat const a02 = 2.0f * (i * k - r * j);
+
+ GLfloat const a10 = 2.0f * (i * j - r * k);
+ GLfloat const a11 = 1.0f - 2.0f * (i * i + k * k);
+ GLfloat const a12 = 2.0f * (j * k + r * i);
+
+ GLfloat const a20 = 2.0f * (i * k + r * j);
+ GLfloat const a21 = 2.0f * (j * k - r * i);
+ GLfloat const a22 = 1.0f - 2.0f * (i * i + j * j);
+
+ result[0][0] = m[0][0] * a00 + m[1][0] * a01 + m[2][0] * a02;
+ result[0][1] = m[0][1] * a00 + m[1][1] * a01 + m[2][1] * a02;
+ result[0][2] = m[0][2] * a00 + m[1][2] * a01 + m[2][2] * a02;
+ result[0][3] = m[0][3] * a00 + m[1][3] * a01 + m[2][3] * a02;
+
+ result[1][0] = m[0][0] * a10 + m[1][0] * a11 + m[2][0] * a12;
+ result[1][1] = m[0][1] * a10 + m[1][1] * a11 + m[2][1] * a12;
+ result[1][2] = m[0][2] * a10 + m[1][2] * a11 + m[2][2] * a12;
+ result[1][3] = m[0][3] * a10 + m[1][3] * a11 + m[2][3] * a12;
+
+ result[2][0] = m[0][0] * a20 + m[1][0] * a21 + m[2][0] * a22;
+ result[2][1] = m[0][1] * a20 + m[1][1] * a21 + m[2][1] * a22;
+ result[2][2] = m[0][2] * a20 + m[1][2] * a21 + m[2][2] * a22;
+ result[2][3] = m[0][3] * a20 + m[1][3] * a21 + m[2][3] * a22;
+
+ result[3][0] = m[3][0];
+ result[3][1] = m[3][1];
+ result[3][2] = m[3][2];
+ result[3][3] = m[3][3];
+ }
+ }
+
+ NvCopyMatf(result, r);
+}
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotXRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotYRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees)
+{
+ NvBuildRotZRadMatf(r, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotXRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotYRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees)
+{
+ NvMultRotZRadMatf(r, m, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees)
+{
+ NvBuildRotRadMatf(r, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees)
+{
+ NvMultRotRadMatf(r, m, axis, degrees * KD_DEG_TO_RAD_F);
+}
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3])
+{
+ GLfloat ev[3];
+ GLfloat z[3];
+ GLfloat x_tmp[3];
+ GLfloat x[3];
+ GLfloat y[3];
+
+ NvSubVecf(ev, eye, obj);
+
+ NvNormalizeVecf(z, ev);
+
+ NvCrossProductf(x_tmp, up, z);
+
+ NvNormalizeVecf(x, x_tmp);
+
+ NvCrossProductf(y, z, x);
+
+ r[0][0] = x[0];
+ r[0][1] = y[0];
+ r[0][2] = z[0];
+ r[0][3] = 0.0f;
+
+ r[1][0] = x[1];
+ r[1][1] = y[1];
+ r[1][2] = z[1];
+ r[1][3] = 0.0f;
+
+ r[2][0] = x[2];
+ r[2][1] = y[2];
+ r[2][2] = z[2];
+ r[2][3] = 0.0f;
+
+ r[3][0] = -x[0] * eye[0] + -x[1] * eye[1] + -x[2] * eye[2];
+ r[3][1] = -y[0] * eye[0] + -y[1] * eye[1] + -y[2] * eye[2];
+ r[3][2] = -z[0] * eye[0] + -z[1] * eye[1] + -z[2] * eye[2];
+ r[3][3] = 1.0f;
+}
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const m00 = znear * 2.0f / (right - left);
+ GLfloat const m11 = znear * 2.0f / (top - bottom);
+ GLfloat const m22 = -(zfar + znear) / (zfar - znear);
+
+ GLfloat const m20 = (right + left) / (right - left);
+ GLfloat const m21 = (top + bottom) / (top - bottom);
+
+ GLfloat const m32 = -(2.0f * zfar * znear) / (zfar - znear);
+ GLfloat const m23 = -1.0f;
+
+ r[0][0] = m00;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = m11;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = m20;
+ r[2][1] = m21;
+ r[2][2] = m22;
+ r[2][3] = m23;
+
+ r[3][0] = 0.0f;
+ r[3][1] = 0.0f;
+ r[3][2] = m32;
+ r[3][3] = 0.0f;
+}
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = 1.0f;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = 0.0f;
+ r[3][3] = 1.0f;
+}
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar)
+{
+ GLfloat const sx = 2.0f / (right - left);
+ GLfloat const sy = 2.0f / (top - bottom);
+ GLfloat const sz = -2.0f / (zfar - znear);
+
+ GLfloat const tx = -(right + left) / (right - left);
+ GLfloat const ty = -(top + bottom) / (top - bottom);
+ GLfloat const tz = -(zfar + znear) / (zfar - znear);
+
+ r[0][0] = sx;
+ r[0][1] = 0.0f;
+ r[0][2] = 0.0f;
+ r[0][3] = 0.0f;
+
+ r[1][0] = 0.0f;
+ r[1][1] = sy;
+ r[1][2] = 0.0f;
+ r[1][3] = 0.0f;
+
+ r[2][0] = 0.0f;
+ r[2][1] = 0.0f;
+ r[2][2] = sz;
+ r[2][3] = 0.0f;
+
+ r[3][0] = tx;
+ r[3][1] = ty;
+ r[3][2] = tz;
+ r[3][3] = 1.0f;
+}
diff --git a/src/platformspecific/windows/libs/nv_math/nv_matrix.h b/src/platformspecific/windows/libs/nv_math/nv_matrix.h
new file mode 100644
index 0000000..0e04568
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/nv_matrix.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_MATRIX_H
+#define INCLUDED_MATRIX_H
+
+#include <QtOpenGL/qgl.h>
+#include <math.h>
+#include <assert.h>
+
+#define KD_FLT_EPSILON 1.19209290E-07F
+#define KD_DEG_TO_RAD_F 0.0174532924F
+#define KD_RAD_TO_DEG_F 57.2957802F
+
+void NvCopyMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+void NvExtract3x3Matf(GLfloat r[3][3], const GLfloat m[4][4]);
+
+/* vector utilities */
+
+GLfloat NvVecLengthf(const GLfloat v[3]);
+
+void NvNormalizeVecf(GLfloat r[3], const GLfloat v[3]);
+
+void NvAddVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvSubVecf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvCrossProductf(GLfloat r[3], const GLfloat a[3], const GLfloat b[3]);
+
+void NvTransformPointf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+void NvTransformHomPointf(GLfloat r[4], const GLfloat m[4][4], const GLfloat a[4]);
+void NvTransformVecf(GLfloat r[3], const GLfloat m[4][4], const GLfloat a[3]);
+
+/* matrix utilities */
+
+void NvMultMatf(GLfloat r[4][4], const GLfloat a[4][4], const GLfloat b[4][4]);
+
+void NvInvMatf(GLfloat r[4][4], const GLfloat m[4][4]);
+
+/* matrix building utilities */
+
+void NvBuildIdentityMatf(GLfloat r[4][4]);
+
+void NvBuildTranslateMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildScaleMatf(GLfloat r[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvBuildRotXDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotYDegMatf(GLfloat r[4][4], GLfloat degrees);
+void NvBuildRotZDegMatf(GLfloat r[4][4], GLfloat degrees);
+
+void NvBuildRotDegMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat degrees);
+
+void NvBuildRotXRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotYRadMatf(GLfloat r[4][4], GLfloat radians);
+void NvBuildRotZRadMatf(GLfloat r[4][4], GLfloat radians);
+
+void NvBuildRotRadMatf(GLfloat r[4][4], const GLfloat axis[3], GLfloat radians);
+
+void NvBuildLookatMatf(GLfloat r[4][4], const GLfloat eye[3], const GLfloat obj[3],
+ const GLfloat up[3]);
+
+void NvBuildFrustumMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+void NvBuildOrtho2Matf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top);
+
+void NvBuildOrthoMatf(GLfloat r[4][4], GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
+ GLfloat znear, GLfloat zfar);
+
+/* matrix concatenation utilities */
+
+void NvMultTranslateMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+void NvMultScaleMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat x, GLfloat y, GLfloat z);
+
+void NvMultRotXDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotYDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+void NvMultRotZDegMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat degrees);
+
+void NvMultRotDegMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat degrees);
+
+void NvMultRotXRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotYRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+void NvMultRotZRadMatf(GLfloat r[4][4], const GLfloat m[4][4], GLfloat radians);
+
+void NvMultRotRadMatf(GLfloat r[4][4], const GLfloat m[4][4], const GLfloat axis[3],
+ GLfloat radians);
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_math/nv_quat.cpp b/src/platformspecific/windows/libs/nv_math/nv_quat.cpp
new file mode 100644
index 0000000..9626eb8
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/nv_quat.cpp
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "nv_quat.h"
+#include <stdlib.h>
+#include <string.h>
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4])
+{
+ memcpy(r, q, 4 * sizeof(GLfloat));
+}
+
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4])
+{
+ // Assumes that the quaternion is normalized!
+ GLfloat x2 = q[0] * 2.0f;
+ GLfloat y2 = q[1] * 2.0f;
+ GLfloat z2 = q[2] * 2.0f;
+ GLfloat xSq2 = x2 * q[0];
+ GLfloat ySq2 = y2 * q[1];
+ GLfloat zSq2 = z2 * q[2];
+ GLfloat xy2 = x2 * q[1];
+ GLfloat xz2 = x2 * q[2];
+ GLfloat xw2 = x2 * q[3];
+ GLfloat yz2 = y2 * q[2];
+ GLfloat yw2 = y2 * q[3];
+ GLfloat zw2 = z2 * q[3];
+
+ /* Matrix is
+ * | 1 - 2y^2 - 2z^2 2xy - 2zw 2xz + 2yw |
+ * | 2xy + 2zw 1 - 2x^2 - 2z^2 2yz - 2xw |
+ * | 2xz - 2yw 2yz + 2xw 1 - 2x^2 - 2y^2 |
+ */
+ r[0][0] = 1.0f - ySq2 - zSq2;
+ r[0][1] = xy2 - zw2;
+ r[0][2] = xz2 + yw2;
+
+ r[1][0] = xy2 + zw2;
+ r[1][1] = 1.0f - xSq2 - zSq2;
+ r[1][2] = yz2 - xw2;
+
+ r[2][0] = xz2 - yw2;
+ r[2][1] = yz2 + xw2;
+ r[2][2] = 1.0f - xSq2 - ySq2;
+}
+
+void NvQuatIdentity(GLfloat r[4])
+{
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = 1.0f;
+}
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3])
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = axis[0] * sina;
+ r[1] = axis[1] * sina;
+ r[2] = axis[2] * sina;
+ r[3] = cosa;
+}
+
+void NvQuatX(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = sina;
+ r[1] = 0.0f;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatY(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = sina;
+ r[2] = 0.0f;
+ r[3] = cosa;
+}
+
+void NvQuatZ(GLfloat r[4], GLfloat radians)
+{
+ GLfloat cosa = cosf(radians * 0.5f);
+ GLfloat sina = sinf(radians * 0.5f);
+
+ r[0] = 0.0f;
+ r[1] = 0.0f;
+ r[2] = sina;
+ r[3] = cosa;
+}
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatY(h, heading);
+ NvQuatX(p, pitch);
+ NvQuatZ(ro, roll);
+
+ NvQuatMult(r, h, p);
+ NvQuatMult(r, ro, r);
+}
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll)
+{
+ GLfloat h[4], p[4], ro[4];
+
+ NvQuatZ(ro, roll);
+ NvQuatX(p, pitch);
+ NvQuatY(h, heading);
+
+ NvQuatMult(r, p, h);
+ NvQuatMult(r, r, ro);
+}
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4])
+{
+ return q1[0] * q2[0] + q1[1] * q2[1] + q1[2] * q2[2] + q1[3] * q2[3];
+}
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4])
+{
+ const GLfloat q1x = q1[0];
+ const GLfloat q1y = q1[1];
+ const GLfloat q1z = q1[2];
+ const GLfloat q1w = q1[3];
+ const GLfloat q2x = q2[0];
+ const GLfloat q2y = q2[1];
+ const GLfloat q2z = q2[2];
+ const GLfloat q2w = q2[3];
+
+ r[0] = q1y * q2z - q2y * q1z + q1w * q2x + q2w * q1x;
+ r[1] = q1z * q2x - q2z * q1x + q1w * q2y + q2w * q1y;
+ r[2] = q1x * q2y - q2x * q1y + q1w * q2z + q2w * q1z;
+ r[3] = q1w * q2w - q1x * q2x - q1y * q2y - q1z * q2z;
+}
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t)
+{
+ GLfloat omt = 1.0f - t;
+
+ if (NvQuatDot(q1, q2) < 0.0f) {
+ r[0] = -q1[0] * omt + q2[0] * t;
+ r[1] = -q1[1] * omt + q2[1] * t;
+ r[2] = -q1[2] * omt + q2[2] * t;
+ r[3] = -q1[3] * omt + q2[3] * t;
+ } else {
+ r[0] = q1[0] * omt + q2[0] * t;
+ r[1] = q1[1] * omt + q2[1] * t;
+ r[2] = q1[2] * omt + q2[2] * t;
+ r[3] = q1[3] * omt + q2[3] * t;
+ }
+
+ NvQuatNormalize(r, r);
+}
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4])
+{
+ GLfloat invLength = 1.0f / sqrtf(NvQuatDot(q, q));
+
+ r[0] = invLength * q[0];
+ r[1] = invLength * q[1];
+ r[2] = invLength * q[2];
+ r[3] = invLength * q[3];
+}
diff --git a/src/platformspecific/windows/libs/nv_math/nv_quat.h b/src/platformspecific/windows/libs/nv_math/nv_quat.h
new file mode 100644
index 0000000..4c65cb9
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_math/nv_quat.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef INCLUDED_QUAT_H
+#define INCLUDED_QUAT_H
+
+#include <QtOpenGL/qgl.h>
+#include <math.h>
+#include <assert.h>
+
+void NvQuatCopy(GLfloat r[4], const GLfloat q[4]);
+void NvQuatConvertTo3x3Mat(GLfloat r[3][3], const GLfloat q[4]);
+
+void NvQuatIdentity(GLfloat r[4]);
+
+void NvQuatFromAngleAxis(GLfloat r[4], GLfloat radians, const GLfloat axis[3]);
+
+void NvQuatX(GLfloat r[4], GLfloat radians);
+
+void NvQuatY(GLfloat r[4], GLfloat radians);
+
+void NvQuatZ(GLfloat r[4], GLfloat radians);
+
+void NvQuatFromEuler(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+void NvQuatFromEulerReverse(GLfloat r[4], GLfloat heading, GLfloat pitch, GLfloat roll);
+
+GLfloat NvQuatDot(const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatMult(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4]);
+
+void NvQuatNLerp(GLfloat r[4], const GLfloat q1[4], const GLfloat q2[4], GLfloat t);
+
+void NvQuatNormalize(GLfloat r[4], const GLfloat q[4]);
+
+#endif
diff --git a/src/platformspecific/windows/libs/nv_types.h b/src/platformspecific/windows/libs/nv_types.h
new file mode 100644
index 0000000..1d1b030
--- /dev/null
+++ b/src/platformspecific/windows/libs/nv_types.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2009-2011 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef __INCLUDED_QT3DS_TYPES_H
+#define __INCLUDED_QT3DS_TYPES_H
+
+typedef unsigned char NvU8; // 0 to 255
+typedef unsigned short NvU16; // 0 to 65535
+typedef unsigned int NvU32; // 0 to 4294967295
+typedef unsigned long long NvU64; // 0 to 18446744073709551615
+typedef signed char NvS8; // -128 to 127
+typedef signed short NvS16; // -32768 to 32767
+typedef signed int NvS32; // -2147483648 to 2147483647
+typedef signed long long NvS64; // 2^-63 to 2^63-1
+
+// Explicitly sized floats
+typedef float NvF32; // IEEE Single Precision (S1E8M23)
+typedef double NvF64; // IEEE Double Precision (S1E11M52)
+
+// Boolean type
+#define QT3DS_FALSE 0
+#define QT3DS_TRUE 1
+typedef NvU8 NvBool;
+
+// Result of sizeof operator
+typedef unsigned long NvSize;
+
+// Type large enough to hold a relative file offset
+typedef long NvOffset;
+
+// Base NULL type.
+#define QT3DS_NULL 0
+
+// Error related
+typedef enum {
+ NvError_Success = 0,
+ NvError_NotSupported,
+ NvError_NotInitialized,
+ NvError_BadParameter,
+ NvError_InsufficientMemory,
+ NvError_NoEntries,
+ NvError_UnknownError,
+} NvError;
+
+#if 1 // defined(_DEBUG) // !!!!TBD TODO
+#define NvAssert(c)
+#else
+#define NvAssert(c) ((void)((c) ? 0 : (NvHandleAssertion(#c, __FILE__, __LINE__), 0)))
+#endif
+
+// Other standardized typedefs
+typedef NvU64 NvUST; // U64 unadjusted system time value
+
+#endif
diff --git a/src/platformspecific/windows/viewer/Resource.h b/src/platformspecific/windows/viewer/Resource.h
new file mode 100644
index 0000000..58c9336
--- /dev/null
+++ b/src/platformspecific/windows/viewer/Resource.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#define IDI_ICON1 103
+#define IDI_ICON2 105
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 106
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/src/qmlstreamer/q3dsincubationcontroller.h b/src/qmlstreamer/q3dsincubationcontroller.h
new file mode 100644
index 0000000..733037c
--- /dev/null
+++ b/src/qmlstreamer/q3dsincubationcontroller.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QCoreApplication>
+#include <QGuiApplication>
+#include <QQmlComponent>
+#include <QQuickItem>
+#include <QQmlIncubationController>
+#include <QScreen>
+
+class Q3DSIncubationController : public QObject, public QQmlIncubationController
+{
+ Q_OBJECT
+public:
+ explicit Q3DSIncubationController(QObject *parent = nullptr)
+ : QObject(parent)
+ , m_incubationTime(std::max(1, int(333 / QGuiApplication::primaryScreen()->refreshRate())))
+ {
+ startTimer(QGuiApplication::primaryScreen()->refreshRate());
+ }
+
+ void timerEvent(QTimerEvent *) Q_DECL_OVERRIDE
+ {
+ incubateFor(m_incubationTime);
+ }
+
+private:
+ const int m_incubationTime;
+};
diff --git a/src/qmlstreamer/q3dsqmlstream.cpp b/src/qmlstreamer/q3dsqmlstream.cpp
new file mode 100644
index 0000000..e1b9e85
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstream.cpp
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlstream.h"
+
+/*!
+ \qmltype QmlStream
+ \instantiates Q3DSQmlStream
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief Allows streaming of QML as subpresentation.
+
+ \sa Studio3D, Presentation, SubPresentation
+*/
+/*!
+ \class Q3DSQmlStream
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+ \brief Allows streaming of QML as subpresentation.
+ \param parent
+ */
+
+/*!
+ * \brief Q3DSQmlStream::Q3DSQmlStream Constructor
+ * \param parent Optional parent object.
+ */
+Q3DSQmlStream::Q3DSQmlStream(QObject *parent)
+ : QObject(parent)
+ , m_item(nullptr)
+{
+}
+
+/*!
+ * \brief Q3DSQmlStream::~Q3DSQmlStream Destructor.
+ */
+Q3DSQmlStream::~Q3DSQmlStream()
+{
+}
+
+/*!
+ * \qmlproperty string QmlStream::presentationId
+ * Contains the presentation id of this subpresentation.
+ */
+/*!
+ * \property Q3DSQmlStream::presentationId
+ * Contains the presentation id of this subpresentation.
+ */
+QString Q3DSQmlStream::presentationId() const
+{
+ return m_presentationId;
+}
+
+/*!
+ * \qmlproperty Item QmlStream::item
+ * Contains the Item to be streamed as subpresentation.
+ */
+/*!
+ * \property Q3DSQmlStream::item
+ * Contains the QQuickItem to be streamed as subpresentation.
+ */
+QQuickItem *Q3DSQmlStream::item() const
+{
+ return m_item;
+}
+
+void Q3DSQmlStream::setPresentationId(const QString presentationId)
+{
+ if (m_presentationId != presentationId) {
+ m_presentationId = presentationId;
+ emit presentationIdChanged(presentationId);
+ }
+}
+
+void Q3DSQmlStream::setItem(QQuickItem *item)
+{
+ if (m_item != item) {
+ m_item = item;
+ emit itemChanged(item);
+ }
+}
diff --git a/src/qmlstreamer/q3dsqmlstream.h b/src/qmlstreamer/q3dsqmlstream.h
new file mode 100644
index 0000000..7482590
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstream.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QMLSTREAM_H
+#define Q3DS_QMLSTREAM_H
+
+#include <QObject>
+
+#include "q3dsqmlstreamer_global.h"
+
+QT_BEGIN_NAMESPACE
+class QQuickItem;
+QT_END_NAMESPACE
+
+class Q3DS_QMLSTREAMERSHARED_EXPORT Q3DSQmlStream : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString presentationId READ presentationId WRITE setPresentationId NOTIFY presentationIdChanged)
+ Q_PROPERTY(QQuickItem *item READ item WRITE setItem NOTIFY itemChanged)
+
+ Q_CLASSINFO("DefaultProperty", "item")
+public:
+ Q3DSQmlStream(QObject *parent = nullptr);
+ ~Q3DSQmlStream();
+
+ QString presentationId() const;
+ QQuickItem *item() const;
+
+public Q_SLOTS:
+ void setPresentationId(const QString presentationId);
+ void setItem(QQuickItem *item);
+
+Q_SIGNALS:
+ void presentationIdChanged(const QString presentationId);
+ void itemChanged(QQuickItem *item);
+
+private:
+ QString m_presentationId;
+ QQuickItem *m_item;
+};
+
+#endif // Q3DSQMLSTREAM_H
diff --git a/src/qmlstreamer/q3dsqmlstreamer_global.h b/src/qmlstreamer/q3dsqmlstreamer_global.h
new file mode 100644
index 0000000..af12e6f
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamer_global.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QMLSTREAMER_GLOBAL_H
+#define Q3DS_QMLSTREAMER_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(QMLSTREAMER_LIBRARY)
+# define Q3DS_QMLSTREAMERSHARED_EXPORT Q_DECL_EXPORT
+#else
+# define Q3DS_QMLSTREAMERSHARED_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // Q3DS_QMLSTREAMER_GLOBAL_H
diff --git a/src/qmlstreamer/q3dsqmlstreamerserviceimpl.cpp b/src/qmlstreamer/q3dsqmlstreamerserviceimpl.cpp
new file mode 100644
index 0000000..78c0a36
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamerserviceimpl.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlstreamerserviceimpl.h"
+
+Q3DSQmlStreamServiceImpl::Q3DSQmlStreamServiceImpl()
+{
+
+}
+
+IQ3DSQmlStreamRenderer *Q3DSQmlStreamServiceImpl::getRenderer(const char *id)
+{
+ if (m_producers[QString(id)])
+ return m_producers[QString(id)]->getRenderer();
+ return nullptr;
+}
+
+bool Q3DSQmlStreamServiceImpl::registerProducer(IQ3DSQmlStreamProducer *producer, const char *id)
+{
+ m_producers[QString(id)] = producer;
+ return true;
+}
+
+void Q3DSQmlStreamServiceImpl::unregisterProducer(IQ3DSQmlStreamProducer *producer)
+{
+ auto iter = m_producers.begin();
+ for (; iter != m_producers.end(); ++iter) {
+ if (*iter == producer) {
+ m_producers.erase(iter);
+ return;
+ }
+ }
+}
+
+static Q3DSQmlStreamServiceImpl *service = nullptr;
+IQ3DSQmlStreamService *IQ3DSQmlStreamService::getQmlStreamService()
+{
+ if (!service)
+ service = new Q3DSQmlStreamServiceImpl();
+ return service;
+}
diff --git a/src/qmlstreamer/q3dsqmlstreamerserviceimpl.h b/src/qmlstreamer/q3dsqmlstreamerserviceimpl.h
new file mode 100644
index 0000000..a17bf34
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamerserviceimpl.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QMLSTREAM_SERVICE_IMPL_H
+#define Q3DS_QMLSTREAM_SERVICE_IMPL_H
+
+#include <QMap>
+
+#include "q3dsqmlstreamservice.h"
+
+#include "q3dsqmlstreamer_global.h"
+
+class Q3DSQmlStreamServiceImpl : public IQ3DSQmlStreamService
+{
+public:
+ Q3DSQmlStreamServiceImpl();
+
+ IQ3DSQmlStreamRenderer *getRenderer(const char *id) override;
+ bool registerProducer(IQ3DSQmlStreamProducer *producer, const char *id) override;
+ void unregisterProducer(IQ3DSQmlStreamProducer *producer) override;
+private:
+
+ QMap<QString, IQ3DSQmlStreamProducer *> m_producers;
+};
+
+#endif // Q3DS_QMLSTREAMER_SERVICE_IMPL_H
diff --git a/src/qmlstreamer/q3dsqmlstreamproducer.cpp b/src/qmlstreamer/q3dsqmlstreamproducer.cpp
new file mode 100644
index 0000000..39eccb1
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamproducer.cpp
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlstreamproducer.h"
+#include "q3dsqmlstreamrenderer.h"
+
+Q3DSQmlStreamProducer::Q3DSQmlStreamProducer(const QString &id, const QString &args,
+ QObject *parent)
+ : QObject(parent), m_id(id), m_args(args), m_renderer(new Q3DSQmlStreamRenderer)
+{
+
+}
+
+Q3DSQmlStreamProducer::~Q3DSQmlStreamProducer()
+{
+ delete m_renderer;
+}
+
+IQ3DSQmlStreamRenderer* Q3DSQmlStreamProducer::getRenderer()
+{
+ return m_renderer;
+}
+
+void Q3DSQmlStreamProducer::setPresentationItem(QQuickItem *item)
+{
+ m_renderer->setItem(item);
+}
diff --git a/src/qmlstreamer/q3dsqmlstreamproducer.h b/src/qmlstreamer/q3dsqmlstreamproducer.h
new file mode 100644
index 0000000..d3b330d
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamproducer.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QMLSTREAM_PRODUCER_H
+#define Q3DS_QMLSTREAM_PRODUCER_H
+
+#include <QObject>
+#include "q3dsqmlstreamservice.h"
+#include "q3dsqmlstreamer_global.h"
+
+QT_BEGIN_NAMESPACE
+class QQuickItem;
+QT_END_NAMESPACE
+
+class Q3DSQmlStreamRenderer;
+
+class Q3DS_QMLSTREAMERSHARED_EXPORT Q3DSQmlStreamProducer : public QObject,
+ public IQ3DSQmlStreamProducer
+{
+ Q_OBJECT
+public:
+ Q3DSQmlStreamProducer(const QString &id, const QString &args, QObject *parent = nullptr);
+ virtual ~Q3DSQmlStreamProducer();
+
+ IQ3DSQmlStreamRenderer* getRenderer() override;
+
+ void setPresentationItem(QQuickItem *item);
+
+private:
+ QString m_id;
+ QString m_args;
+ Q3DSQmlStreamRenderer *m_renderer;
+};
+
+#endif // Q3DS_QMLSTREAM_PRODUCER_H
diff --git a/src/qmlstreamer/q3dsqmlstreamproxy.cpp b/src/qmlstreamer/q3dsqmlstreamproxy.cpp
new file mode 100644
index 0000000..9b8550c
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamproxy.cpp
@@ -0,0 +1,253 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlstreamservice.h"
+#include "q3dsqmlstreamproxy.h"
+#include "q3dsqmlstreamproducer.h"
+#include "q3dsincubationcontroller.h"
+
+#include <QCoreApplication>
+#include <QGuiApplication>
+#include <QQmlComponent>
+#include <QQuickItem>
+#include <QQmlIncubationController>
+#include <QScreen>
+#include <QFileInfo>
+
+class Qt3DSQmlStreamEvent : public QEvent
+{
+public:
+ Qt3DSQmlStreamEvent(const QString &id, const QString &args)
+ : QEvent(QEvent::User), presentationId(id), presentationArgs(args), unregister(false)
+ {
+
+ }
+
+ Qt3DSQmlStreamEvent(const QString &id)
+ : QEvent(QEvent::User), presentationId(id), unregister(true)
+ {
+
+ }
+
+ QString presentationId;
+ QString presentationArgs;
+ bool unregister;
+};
+
+Q3DSQmlStreamProxy::renderitem::~renderitem()
+{
+ delete item;
+ delete component;
+}
+
+Q3DSQmlStreamProxy::Q3DSQmlStreamProxy(QObject *parent)
+ : QObject(parent), m_engine(nullptr), m_settings(nullptr)
+{
+}
+
+Q3DSQmlStreamProxy::~Q3DSQmlStreamProxy()
+{
+ for (Q3DSQmlStreamProducer *p : m_streamProducers) {
+ IQ3DSQmlStreamService::getQmlStreamService()->unregisterProducer(p);
+ delete p;
+ }
+}
+
+void Q3DSQmlStreamProxy::loadPresentationItem(const QString& presentationId,
+ const QString& presentationArgs)
+{
+ if (!m_engine) {
+ m_engine = new QQmlEngine;
+
+ // Add extra import path for binary installations
+ QString extraImportPath(QStringLiteral("%1/qml"));
+ m_engine->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath()));
+
+ m_engine->setIncubationController(new Q3DSIncubationController(this));
+ }
+
+ QString itemPath = presentationArgs;
+ itemPath.replace("\\", "/");
+
+ QUrl purl = QUrl(itemPath);
+ if (purl.isRelative()) {
+ purl.setPath(m_path.path() + QStringLiteral("/") + purl.path());
+ purl.setScheme(m_path.scheme());
+ } else {
+ purl = pathToUrl(itemPath);
+ }
+
+ QQmlComponent *component = new QQmlComponent(m_engine, purl);
+ if (!component)
+ return;
+ renderitem *item = new renderitem;
+ item->args = itemPath;
+ item->component = component;
+ item->presentationId = presentationId;
+ m_loadedItems.push_back(item);
+
+ if (component->isLoading())
+ connect(component, &QQmlComponent::statusChanged, this, &Q3DSQmlStreamProxy::itemLoaded);
+ else
+ itemLoaded();
+}
+
+void Q3DSQmlStreamProxy::itemLoaded()
+{
+ for (renderitem *item : m_loadedItems) {
+ if (item->item == nullptr && item->component->isLoading() == false) {
+ disconnect(item->component, &QQmlComponent::statusChanged,
+ this, &Q3DSQmlStreamProxy::itemLoaded);
+ if (!item->component->errors().isEmpty()) {
+ QList<QQmlError> errorList = item->component->errors();
+ for (const QQmlError &error: errorList)
+ qWarning() << error.url() << error.line() << error;
+ m_loadedItems.removeAll(item);
+ delete item;
+ } else {
+ QObject *root = item->component->create();
+ if (!root) {
+ QList<QQmlError> errorList = item->component->errors();
+ for (const QQmlError &error: errorList)
+ qWarning() << error.url() << error.line() << error;
+ m_loadedItems.removeAll(item);
+ delete item;
+ } else {
+ QQuickItem *qi = qobject_cast<QQuickItem *>(root);
+ if (!qi) {
+ m_loadedItems.removeAll(item);
+ delete item;
+ } else {
+ item->item = qi;
+ m_streamProducers[item->presentationId]->setPresentationItem(qi);
+ }
+ }
+ }
+ }
+ }
+}
+
+QUrl Q3DSQmlStreamProxy::pathToUrl(const QString &path)
+{
+ QUrl retval;
+ if (path.startsWith(QStringLiteral(":"))) {
+ retval.setScheme(QStringLiteral("qrc"));
+ retval.setPath(path.mid(1));
+ } else if (path.startsWith(QStringLiteral("qrc:"), Qt::CaseInsensitive)) {
+ retval.setScheme(QStringLiteral("qrc"));
+ retval.setPath(path.mid(4));
+ } else {
+ retval.setScheme(QStringLiteral("file"));
+ retval.setPath(path);
+ }
+ return retval;
+}
+
+bool Q3DSQmlStreamProxy::event(QEvent *event)
+{
+ if (event->type() == QEvent::User) {
+ Qt3DSQmlStreamEvent *e = static_cast<Qt3DSQmlStreamEvent *>(event);
+ Q3DSQmlStreamProducer *producer = nullptr;
+ if (e->unregister && m_streamProducers.contains(e->presentationId)) {
+ for (int i = 0; i < m_loadedItems.size(); i++) {
+ if (m_loadedItems[i]->presentationId == e->presentationId) {
+ delete m_loadedItems[i];
+ m_loadedItems.remove(i);
+ break;
+ }
+ }
+ producer = static_cast<Q3DSQmlStreamProducer *>(
+ m_streamProducers.take(e->presentationId));
+ IQ3DSQmlStreamService::getQmlStreamService()->unregisterProducer(producer);
+ delete producer;
+ return true;
+ }
+ if (!m_streamProducers.contains(e->presentationId)) {
+ producer = new Q3DSQmlStreamProducer(e->presentationId, e->presentationArgs, this);
+ m_streamProducers[e->presentationId] = producer;
+ IQ3DSQmlStreamService::getQmlStreamService()
+ ->registerProducer(producer, e->presentationId.toLatin1().data());
+ } else {
+ producer = static_cast<Q3DSQmlStreamProducer *>(m_streamProducers[e->presentationId]);
+ }
+
+ if (m_settings) {
+ bool streamFound = false;
+ for (Q3DSQmlStream *s : m_settings->qmlStreamsList()) {
+ if (s->presentationId() == e->presentationId) {
+ producer->setPresentationItem(s->item());
+ streamFound = true;
+ break;
+ }
+ }
+ if (!streamFound && !e->presentationArgs.isNull())
+ loadPresentationItem(e->presentationId, e->presentationArgs);
+ } else if (!e->presentationArgs.isNull()){
+ loadPresentationItem(e->presentationId, e->presentationArgs);
+ }
+ return true;
+ }
+ return false;
+}
+
+void Q3DSQmlStreamProxy::registerPresentation(const QString &presentationId, const QString &args)
+{
+ QCoreApplication::postEvent(this,
+ new Qt3DSQmlStreamEvent(QString(presentationId), QString(args)));
+}
+
+void Q3DSQmlStreamProxy::unregisterPresentation(const QString &presentationId)
+{
+ QCoreApplication::postEvent(this, new Qt3DSQmlStreamEvent(QString(presentationId)));
+}
+
+void Q3DSQmlStreamProxy::setSettings(Q3DSSubPresentationSettings *settings)
+{
+ m_settings = settings;
+}
+
+void Q3DSQmlStreamProxy::setPath(const QString& path)
+{
+ QString modPath = QFileInfo(path).path(); // path() strips filename out
+ m_path = pathToUrl(modPath);
+}
+
+void Q3DSQmlStreamProxy::setEngine(QQmlEngine *engine)
+{
+ if (m_engine)
+ delete m_engine;
+
+ m_engine = engine;
+
+ // Add extra import path for binary installations
+ QString extraImportPath(QStringLiteral("%1/qml"));
+ m_engine->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath()));
+
+ m_engine->setIncubationController(new Q3DSIncubationController(this));
+}
diff --git a/src/qmlstreamer/q3dsqmlstreamproxy.h b/src/qmlstreamer/q3dsqmlstreamproxy.h
new file mode 100644
index 0000000..85a1cc6
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamproxy.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QMLSTREAM_PROXY_H
+#define Q3DS_QMLSTREAM_PROXY_H
+
+#include <QtCore/QObject>
+#include <QtCore/QEvent>
+#include <QtCore/QString>
+#include <QtCore/QVector>
+#include <QtQml/QQmlEngine>
+
+#include "q3dsqmlstreamproducer.h"
+#include "q3dsqmlsubpresentationsettings.h"
+
+class Q3DS_QMLSTREAMERSHARED_EXPORT Q3DSQmlStreamProxy : public QObject
+{
+ Q_OBJECT
+
+public:
+ Q3DSQmlStreamProxy(QObject *parent = nullptr);
+ ~Q3DSQmlStreamProxy();
+
+ bool event(QEvent *event) Q_DECL_OVERRIDE;
+ void registerPresentation(const QString &presentationId, const QString &args);
+ void unregisterPresentation(const QString &presentationId);
+ void setSettings(Q3DSSubPresentationSettings *settings);
+ void setPath(const QString& path);
+ void setEngine(QQmlEngine *engine);
+
+private:
+ void loadPresentationItem(const QString& presentationId, const QString& presentationArgs);
+ void itemLoaded();
+ QUrl pathToUrl(const QString &path);
+
+ QQmlEngine *m_engine;
+ Q3DSSubPresentationSettings *m_settings;
+ QMap<QString, Q3DSQmlStreamProducer *> m_streamProducers;
+ struct renderitem {
+ QString args;
+ QString presentationId;
+ QQmlComponent *component;
+ QQuickItem *item;
+ renderitem()
+ : component(nullptr), item(nullptr) {}
+ ~renderitem();
+ };
+
+ QUrl m_path;
+ QVector<renderitem *> m_loadedItems;
+};
+
+#endif // Q3DS_QMLSTREAM_PROXY_H
diff --git a/src/qmlstreamer/q3dsqmlstreamrenderer.cpp b/src/qmlstreamer/q3dsqmlstreamrenderer.cpp
new file mode 100644
index 0000000..f1879a6
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamrenderer.cpp
@@ -0,0 +1,483 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlstreamrenderer.h"
+
+#include <QCoreApplication>
+#include <qdebug.h>
+#include <QOpenGLContext>
+#include <QSurface>
+#include <QPainter>
+#include <QOpenGLFunctions>
+#include <QWindow>
+#include <QQuickWindow>
+#include <QQuickRenderControl>
+#include <QtQml/QQmlEngine>
+#include <QtQml/QQmlContext>
+#include <QQuickWindow>
+#include <QQuickItem>
+#include <QThread>
+#include <QOffscreenSurface>
+#include <QOpenGLFramebufferObject>
+#include <QOpenGLShaderProgram>
+#include <QOpenGLBuffer>
+#include <QOpenGLVertexArrayObject>
+
+Q_GLOBAL_STATIC(QThread, renderThread)
+Q_GLOBAL_STATIC(QAtomicInt, renderThreadClientCount)
+
+#define RenderEvent(name, value) \
+ class name : public QEvent \
+ { \
+ public: \
+ name() : QEvent(_type) {} \
+ static const QEvent::Type _type; \
+ }; \
+ const QEvent::Type name::_type = QEvent::Type(value);
+
+RenderEvent(InitializeRender, QEvent::User + 1)
+RenderEvent(RequestUpdate, QEvent::User + 2)
+RenderEvent(InitializeRenderThread, QEvent::User + 3)
+RenderEvent(PrepareRender, QEvent::User + 4)
+RenderEvent(Cleanup, QEvent::User + 5)
+
+#define EventType(e) (e::_type)
+
+class RenderControl : public QQuickRenderControl
+{
+public:
+ RenderControl(QWindow *w)
+ : m_window(w)
+ {
+ }
+
+ QWindow *renderWindow(QPoint *offset) Q_DECL_OVERRIDE
+ {
+ if (offset)
+ *offset = QPoint(0, 0);
+ return m_window;
+ }
+
+private:
+ QWindow *m_window;
+};
+
+Q3DSQmlStreamEventHandler::Q3DSQmlStreamEventHandler(Q3DSQmlStreamRenderer *renderer)
+ : m_renderer(renderer)
+{
+
+}
+
+bool Q3DSQmlStreamEventHandler::event(QEvent *e)
+{
+ switch (e->type()) {
+
+ case EventType(RequestUpdate): {
+ m_renderer->renderTexture();
+ return true;
+ }
+
+ case EventType(InitializeRenderThread): {
+ m_renderer->initializeRender();
+ return true;
+ }
+
+ case EventType(Cleanup): {
+ m_renderer->cleanup();
+ return true;
+ }
+
+ default:
+ break;
+ }
+ return QObject::event(e);
+}
+
+Q3DSQmlStreamRenderer::Q3DSQmlStreamRenderer()
+ : m_renderControl(nullptr)
+ , m_quickWindow(nullptr)
+ , m_rootItem(nullptr)
+ , m_frameBuffer(nullptr)
+ , m_program(nullptr)
+ , m_vao(nullptr)
+ , m_vertices(nullptr)
+ , m_context(nullptr)
+ , m_offscreenSurface(nullptr)
+ , m_renderObject(nullptr)
+ , m_renderThread(nullptr)
+ , m_requestUpdate(false)
+ , m_initialized(false)
+ , m_prepared(false)
+ , m_update(false)
+ , m_delayedUpdateRequest(false)
+{
+ renderThreadClientCount->fetchAndAddAcquire(1);
+
+ QSurfaceFormat format = QSurfaceFormat::defaultFormat();
+ if (QOpenGLContext::currentContext())
+ format = QOpenGLContext::currentContext()->format();
+ else {
+ format.setDepthBufferSize(24);
+ format.setStencilBufferSize(8);
+ }
+
+ m_offscreenSurface = new QOffscreenSurface;
+ m_offscreenSurface->setFormat(format);
+ m_offscreenSurface->create();
+
+ m_renderControl = new RenderControl(nullptr);
+
+ connect(m_renderControl, &QQuickRenderControl::renderRequested,
+ this, &Q3DSQmlStreamRenderer::requestUpdate);
+ connect(m_renderControl, &QQuickRenderControl::sceneChanged,
+ this, &Q3DSQmlStreamRenderer::requestUpdate);
+
+ m_quickWindow = new QQuickWindow(m_renderControl);
+ m_quickWindow->setClearBeforeRendering(true);
+ m_quickWindow->setColor(Qt::transparent);
+
+ m_renderObject = new Q3DSQmlStreamEventHandler(this);
+ renderThread->setObjectName(QStringLiteral("Qt3DSQmlStreamRenderer::renderThread"));
+ m_renderThread = renderThread;
+
+ m_renderObject->moveToThread(m_renderThread);
+ if (!m_renderThread->isRunning())
+ m_renderThread->start();
+}
+
+Q3DSQmlStreamRenderer::~Q3DSQmlStreamRenderer()
+{
+ QMutexLocker lock(&m_mutex);
+ QCoreApplication::postEvent(m_renderObject, new Cleanup());
+ m_waitCondition.wait(&m_mutex);
+
+ delete m_offscreenSurface;
+ delete m_renderControl;
+ delete m_quickWindow;
+ delete m_renderObject;
+
+ renderThreadClientCount->fetchAndSubAcquire(1);
+ if (renderThreadClientCount->load() == 0)
+ renderThread->quit();
+}
+
+void Q3DSQmlStreamRenderer::cleanup()
+{
+ if (m_context)
+ m_context->makeCurrent(m_offscreenSurface);
+ if (m_renderControl)
+ m_renderControl->invalidate();
+
+ delete m_frameBuffer;
+ delete m_program;
+ delete m_vertices;
+
+ if (m_context)
+ m_context->doneCurrent();
+ delete m_context;
+
+ if (m_renderObject)
+ m_renderObject->moveToThread(QCoreApplication::instance()->thread());
+ m_waitCondition.wakeOne();
+}
+
+bool Q3DSQmlStreamRenderer::initialize(QOpenGLContext *context, QSurface *surface)
+{
+ Q_UNUSED(surface);
+ QMutexLocker lock(&m_renderMutex);
+ if (!m_context) {
+ m_context = new QOpenGLContext();
+ m_context->setShareContext(context);
+ m_context->setFormat(context->format());
+ m_context->create();
+ m_context->moveToThread(m_renderThread);
+ }
+
+ if (!m_rootItem) {
+ return true;
+ }
+
+ if (m_initialized) {
+ Q_ASSERT(QOpenGLContext::areSharing(context, m_context));
+ return true;
+ }
+
+ m_rootItem->setParentItem(m_quickWindow->contentItem());
+
+ updateSizes();
+
+ m_initialized = true;
+ // Initialize render thread
+ QCoreApplication::postEvent(m_renderObject,
+ new InitializeRenderThread());
+ return true;
+}
+void Q3DSQmlStreamRenderer::initializeFboCopy()
+{
+ m_program = new QOpenGLShaderProgram;
+ if (m_context->format().renderableType() == QSurfaceFormat::OpenGLES) {
+ static const char *vsSource =
+ "attribute highp vec4 pos;\n"
+ "attribute highp vec2 tc;\n"
+ "varying lowp vec2 texcoord;\n"
+ "void main() {\n"
+ " texcoord = tc;\n"
+ " gl_Position = pos;\n"
+ "}\n";
+ static const char *fsSource =
+ "varying highp vec2 texcoord;\n"
+ "uniform sampler2D sampler;\n"
+ "void main() {\n"
+ " gl_FragColor = texture2D(sampler, texcoord);\n"
+ "}\n";
+ m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vsSource);
+ m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fsSource);
+ } else {
+ static const char *vsSource =
+ "#version 150 core\n"
+ "in vec4 pos;\n"
+ "in vec2 tc;\n"
+ "out vec2 texcoord;\n"
+ "void main() {\n"
+ " texcoord = tc;\n"
+ " gl_Position = pos;\n"
+ "}\n";
+ static const char *fsSource =
+ "#version 150 core\n"
+ "in vec2 texcoord;\n"
+ "out vec4 fragColor;\n"
+ "uniform sampler2D sampler;\n"
+ "void main() {\n"
+ " fragColor = texture(sampler, texcoord);\n"
+ "}\n";
+ m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vsSource);
+ m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fsSource);
+ }
+
+ m_program->bindAttributeLocation("pos", 0);
+ m_program->bindAttributeLocation("tc", 1);
+
+ if (!m_program->link()) {
+ QByteArray logData(m_program->log().toLocal8Bit());
+ const char *log = logData.data();
+ qFatal("Failed to create shader program: %s", log);
+ }
+
+ m_vertices = new QOpenGLBuffer;
+ m_vertices->create();
+ m_vertices->bind();
+
+ static const float vertices[] =
+ {
+ -1, -1, 0, 1, 0, 0,
+ 1, -1, 0, 1, 1, 0,
+ 1, 1, 0, 1, 1, 1,
+ -1, -1, 0, 1, 0, 0,
+ 1, 1, 0, 1, 1, 1,
+ -1, 1, 0, 1, 0, 1,
+ };
+
+ m_vertices->allocate(vertices, sizeof(vertices));
+ m_vertices->release();
+}
+
+void Q3DSQmlStreamRenderer::initializeRender()
+{
+ QMutexLocker lock(&m_renderMutex);
+ m_context->makeCurrent(m_offscreenSurface);
+ m_renderControl->initialize(m_context);
+ m_context->doneCurrent();
+ QCoreApplication::postEvent(this, new PrepareRender());
+}
+
+QSize Q3DSQmlStreamRenderer::getDesiredSize()
+{
+ return m_size;
+}
+
+E_TEXTURE_FORMAT Q3DSQmlStreamRenderer::getDesiredFormat()
+{
+ return E_TEXTURE_RGBA8;
+}
+
+bool Q3DSQmlStreamRenderer::isUpdateRequested()
+{
+ return m_update;
+}
+
+// Called by stream renderer client when it stops using the renderer
+// TODO: We are sharing the context so stop using it.
+void Q3DSQmlStreamRenderer::uninitialize()
+{
+}
+
+void Q3DSQmlStreamRenderer::setItem(QQuickItem *item)
+{
+ if (item && m_rootItem && m_initialized) {
+ QMutexLocker lock(&m_renderMutex);
+ m_rootItem->setParentItem(nullptr);
+ m_rootItem = item;
+ m_rootItem->setParentItem(m_quickWindow->contentItem());
+ updateSizes();
+ } else {
+ if (item && m_rootItem != item) {
+ m_rootItem = item;
+
+ if (m_context)
+ initialize(m_context, nullptr);
+ }
+ }
+}
+
+bool Q3DSQmlStreamRenderer::event(QEvent *event)
+{
+ switch (event->type()) {
+
+ case EventType(PrepareRender): {
+
+ m_renderControl->prepareThread(m_renderThread);
+ m_prepared = true;
+
+ if (m_delayedUpdateRequest) {
+ QCoreApplication::postEvent(this, new RequestUpdate());
+ m_delayedUpdateRequest = false;
+ }
+
+ return true;
+ }
+
+ case EventType(RequestUpdate): {
+
+ m_renderControl->polishItems();
+ QMutexLocker lock(&m_mutex);
+ QCoreApplication::postEvent(m_renderObject, new RequestUpdate());
+ m_waitCondition.wait(&m_mutex);
+ return true;
+ }
+
+ default:
+ break;
+ }
+
+ return QObject::event(event);
+}
+
+void Q3DSQmlStreamRenderer::updateSizes()
+{
+ if (m_rootItem->width() > 0 && m_rootItem->height() > 0) {
+ m_size = QSize(m_rootItem->width(), m_rootItem->height());
+ } else {
+ m_rootItem->setWidth(256);
+ m_rootItem->setHeight(256);
+ }
+
+ m_quickWindow->setGeometry(0, 0, m_size.width(), m_size.height());
+}
+
+void Q3DSQmlStreamRenderer::requestUpdate()
+{
+ if (!m_requestUpdate) {
+ m_requestUpdate = true;
+ if (m_initialized)
+ QCoreApplication::postEvent(this, new RequestUpdate());
+ else
+ m_delayedUpdateRequest = true;
+ }
+}
+
+void Q3DSQmlStreamRenderer::renderTexture()
+{
+ QMutexLocker lock(&m_renderMutex);
+ m_context->makeCurrent(m_offscreenSurface);
+
+ if (!m_frameBuffer || m_frameBuffer->size() != m_size) {
+ if (m_frameBuffer)
+ delete m_frameBuffer;
+
+ m_frameBuffer = new QOpenGLFramebufferObject(m_size);
+ m_frameBuffer->setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
+ m_quickWindow->setRenderTarget(m_frameBuffer);
+ }
+
+ {
+ QMutexLocker lock(&m_mutex);
+ if (m_requestUpdate) {
+ m_requestUpdate = false;
+ m_renderControl->sync();
+ m_renderControl->render();
+ m_waitCondition.wakeOne();
+ }
+ }
+
+ m_context->functions()->glFlush();
+ m_quickWindow->resetOpenGLState();
+ m_context->doneCurrent();
+ m_update = true;
+}
+
+void Q3DSQmlStreamRenderer::render()
+{
+ QMutexLocker lock(&m_renderMutex);
+ if (m_update && m_initialized) {
+ QOpenGLContext *context = QOpenGLContext::currentContext();
+ QOpenGLFunctions *func = context->functions();
+ GLuint texture = m_frameBuffer->texture();
+ func->glDisable(GL_DEPTH_TEST);
+ func->glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+
+ if (!m_program)
+ initializeFboCopy();
+
+ m_program->bind();
+
+ if (!m_vao) {
+ m_vao = new QOpenGLVertexArrayObject;
+ m_vao->create();
+ m_vao->bind();
+ m_vertices->bind();
+
+ m_program->enableAttributeArray(0);
+ m_program->enableAttributeArray(1);
+ func->glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(float), 0);
+ func->glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(float),
+ (const void *)(4 * sizeof(GLfloat)));
+ m_vertices->release();
+ } else {
+ m_vao->bind();
+ }
+
+ func->glActiveTexture(GL_TEXTURE0);
+ func->glBindTexture(GL_TEXTURE_2D, texture);
+ func->glDrawArrays(GL_TRIANGLES, 0, 6);
+ func->glEnable(GL_DEPTH_TEST);
+
+ m_program->release();
+ m_vao->release();
+ }
+}
diff --git a/src/qmlstreamer/q3dsqmlstreamrenderer.h b/src/qmlstreamer/q3dsqmlstreamrenderer.h
new file mode 100644
index 0000000..e927479
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamrenderer.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QMLSTREAM_RENDERER_H
+#define Q3DS_QMLSTREAM_RENDERER_H
+
+#include "q3dsqmlstreamservice.h"
+
+#include <QOpenGLFunctions>
+#include <QSize>
+#include <QThread>
+#include <QWaitCondition>
+#include <QMutex>
+
+QT_BEGIN_NAMESPACE
+class QQuickRenderControl;
+class QQuickWindow;
+class QQuickItem;
+class QOpenGLContext;
+class QOffscreenSurface;
+class QOpenGLFramebufferObject;
+class QOpenGLShaderProgram;
+class QOpenGLBuffer;
+class QOpenGLVertexArrayObject;
+QT_END_NAMESPACE
+
+class Q3DSQmlStreamRenderer;
+
+class Q3DSQmlStreamEventHandler : public QObject
+{
+ Q_OBJECT
+public:
+ Q3DSQmlStreamEventHandler(Q3DSQmlStreamRenderer *renderer);
+ bool event(QEvent *e) Q_DECL_OVERRIDE;
+
+private:
+ Q3DSQmlStreamRenderer *m_renderer;
+};
+
+class Q3DSQmlStreamRenderer : public QObject,
+ public IQ3DSQmlStreamRenderer
+{
+ Q_OBJECT
+public:
+ Q3DSQmlStreamRenderer();
+ virtual ~Q3DSQmlStreamRenderer();
+
+ bool initialize(QOpenGLContext *context, QSurface *surface) override;
+
+ QSize getDesiredSize() override;
+ E_TEXTURE_FORMAT getDesiredFormat() override;
+ bool isUpdateRequested() override;
+
+ void render() override;
+
+ void uninitialize() override;
+
+ void setItem(QQuickItem *item);
+
+ bool event(QEvent *event) Q_DECL_OVERRIDE;
+
+private:
+
+ void updateSizes();
+ void requestUpdate();
+ void cleanup();
+ void initializeRender();
+ void renderTexture();
+ void initializeFboCopy();
+
+ QSize m_size;
+ QMutex m_mutex, m_renderMutex;
+ QWaitCondition m_waitCondition;
+
+ QQuickRenderControl *m_renderControl;
+ QQuickWindow *m_quickWindow;
+ QQuickItem *m_rootItem;
+
+ QOpenGLFramebufferObject *m_frameBuffer;
+ QOpenGLShaderProgram *m_program;
+ QOpenGLVertexArrayObject *m_vao;
+ QOpenGLBuffer *m_vertices;
+ QOpenGLContext *m_context;
+ QOffscreenSurface *m_offscreenSurface;
+
+ Q3DSQmlStreamEventHandler *m_renderObject;
+ QThread *m_renderThread;
+
+ bool m_requestUpdate;
+ bool m_initialized;
+ bool m_prepared;
+ bool m_update;
+ bool m_delayedUpdateRequest;
+
+ friend class Q3DSQmlStreamEventHandler;
+};
+
+#endif // Q3DS_QMLSTREAM_RENDERER_H
diff --git a/src/qmlstreamer/q3dsqmlstreamservice.h b/src/qmlstreamer/q3dsqmlstreamservice.h
new file mode 100644
index 0000000..2b44fe3
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlstreamservice.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QMLSTREAM_SERVICE_H
+#define Q3DS_QMLSTREAM_SERVICE_H
+
+#include <qglobal.h>
+#include <q3dsqmlstreamer_global.h>
+
+QT_BEGIN_NAMESPACE
+class QOpenGLContext;
+class QSurface;
+class QSize;
+QT_END_NAMESPACE
+
+enum E_TEXTURE_FORMAT
+{
+ E_TEXTURE_RGBA8,
+ E_TEXTURE_UNKNOWN
+};
+
+class Q3DS_QMLSTREAMERSHARED_EXPORT IQ3DSQmlStreamRenderer
+{
+public:
+ virtual bool initialize(QT_PREPEND_NAMESPACE(QOpenGLContext) *context, QSurface *surface) = 0;
+
+ virtual QSize getDesiredSize() = 0;
+ virtual E_TEXTURE_FORMAT getDesiredFormat() = 0;
+ virtual bool isUpdateRequested() = 0;
+
+ virtual void render() = 0;
+
+ virtual void uninitialize() = 0;
+};
+
+class Q3DS_QMLSTREAMERSHARED_EXPORT IQ3DSQmlStreamProducer
+{
+public:
+ virtual IQ3DSQmlStreamRenderer *getRenderer() = 0;
+};
+
+class Q3DS_QMLSTREAMERSHARED_EXPORT IQ3DSQmlStreamService
+{
+public:
+ virtual IQ3DSQmlStreamRenderer *getRenderer(const char *id) = 0;
+ virtual bool registerProducer(IQ3DSQmlStreamProducer *producer, const char *id) = 0;
+ virtual void unregisterProducer(IQ3DSQmlStreamProducer *producer) = 0;
+
+ static IQ3DSQmlStreamService *getQmlStreamService();
+};
+
+#endif // Q3DS_QMLSTREAM_SERVICE_H
+
+
diff --git a/src/qmlstreamer/q3dsqmlsubpresentationsettings.cpp b/src/qmlstreamer/q3dsqmlsubpresentationsettings.cpp
new file mode 100644
index 0000000..bde5ad3
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlsubpresentationsettings.cpp
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlsubpresentationsettings.h"
+#include "q3dsqmlstream.h"
+
+/*!
+ \qmltype SubPresentationSettings
+ \instantiates Q3DSSubPresentationSettings
+ \inqmlmodule Qt3DStudio
+ \ingroup OpenGLRuntime
+ \brief
+
+ \sa Studio3D, Presentation, QmlStream
+*/
+/*!
+ \class Q3DSSubPresentationSettings
+ \inmodule OpenGLRuntime
+ \since Qt 3D Studio 2.0
+ \brief Settings for subpresentations.
+ \param parent
+
+ \sa Q3DSPresentation, Q3DSQmlStream
+ */
+Q3DSSubPresentationSettings::Q3DSSubPresentationSettings(QObject *parent)
+ : QObject(parent)
+{
+}
+
+Q3DSSubPresentationSettings::~Q3DSSubPresentationSettings()
+{
+ qDeleteAll(m_list);
+}
+
+/*!
+ * \qmlproperty variant SubPresentationSettings::qmlStream
+ * Contains the QML streams to be used as subpresentations.
+ */
+/*!
+ * \property Q3DSSubPresentationSettings::qmlStreams
+ * Contains the QML streams to be used as subpresentations.
+ */
+QQmlListProperty<Q3DSQmlStream> Q3DSSubPresentationSettings::qmlStreams()
+{
+ return QQmlListProperty<Q3DSQmlStream>(this, m_list);
+}
+
+QList<Q3DSQmlStream *> Q3DSSubPresentationSettings::qmlStreamsList()
+{
+ return m_list;
+}
+
diff --git a/src/qmlstreamer/q3dsqmlsubpresentationsettings.h b/src/qmlstreamer/q3dsqmlsubpresentationsettings.h
new file mode 100644
index 0000000..b295f2a
--- /dev/null
+++ b/src/qmlstreamer/q3dsqmlsubpresentationsettings.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DS_QML_SUBPRESENTATION_SETTINGS_H
+#define Q3DS_QML_SUBPRESENTATION_SETTINGS_H
+
+#include <QtCore/QObject>
+#include <QtCore/QList>
+#include <QtQml/QQmlListProperty>
+
+#include "q3dsqmlstream.h"
+#include "q3dsqmlstreamer_global.h"
+
+class Q3DS_QMLSTREAMERSHARED_EXPORT Q3DSSubPresentationSettings : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QQmlListProperty<Q3DSQmlStream> qmlStreams READ qmlStreams)
+public:
+
+ Q3DSSubPresentationSettings(QObject *parent = nullptr);
+ ~Q3DSSubPresentationSettings();
+
+ QQmlListProperty<Q3DSQmlStream> qmlStreams();
+ QList<Q3DSQmlStream *> qmlStreamsList();
+private:
+ QList<Q3DSQmlStream *> m_list;
+};
+
+#endif // Q3DS_QML_SUBPRESENTATION_SETTINGS_H
diff --git a/src/qmlstreamer/qmlstreamer.pro b/src/qmlstreamer/qmlstreamer.pro
new file mode 100644
index 0000000..5e82c7c
--- /dev/null
+++ b/src/qmlstreamer/qmlstreamer.pro
@@ -0,0 +1,50 @@
+TEMPLATE = lib
+TARGET = qt3dsqmlstreamer
+VERSION = $$MODULE_VERSION
+include($$PWD/../../commonplatform.pri)
+
+CONFIG += installed
+load(qt_helper_lib)
+
+# qt_helper_lib assumes non-qt lib, so it clears some qt variables, reset those
+CONFIG += qt
+QT += core qml quick opengl
+
+DEFINES += QMLSTREAMER_LIBRARY
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which as been marked as deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if you use deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+ q3dsqmlstream.cpp \
+ q3dsqmlstreamerserviceimpl.cpp \
+ q3dsqmlstreamproducer.cpp \
+ q3dsqmlstreamproxy.cpp \
+ q3dsqmlstreamrenderer.cpp \
+ q3dsqmlsubpresentationsettings.cpp
+
+HEADERS += \
+ q3dsincubationcontroller.h \
+ q3dsqmlstream.h \
+ q3dsqmlstreamer_global.h \
+ q3dsqmlstreamerserviceimpl.h \
+ q3dsqmlstreamproducer.h \
+ q3dsqmlstreamproxy.h \
+ q3dsqmlstreamrenderer.h \
+ q3dsqmlstreamservice.h \
+ q3dsqmlsubpresentationsettings.h
+
+INCLUDEPATH += \
+ $$PWD/../Runtime/ogl-runtime/src/engine \
+ $$PWD/../Runtime/ogl-runtime/src/system \
+ $$PWD/../QtExtras/qmlstreamer
+
+macos:QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/
diff --git a/src/render/Examples/Qt3DSRenderClearColorExample.cpp b/src/render/Examples/Qt3DSRenderClearColorExample.cpp
new file mode 100644
index 0000000..f67cf71
--- /dev/null
+++ b/src/render/Examples/Qt3DSRenderClearColorExample.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderExample.h"
+#include "foundation/Qt3DSVec4.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+
+namespace {
+class ClearColor : public NVRenderExample
+{
+ NVRenderContext &m_Context;
+
+public:
+ ClearColor(NVRenderContext &ctx)
+ : m_Context(ctx)
+ {
+ }
+ virtual void drawFrame(double currentSeconds)
+ {
+ // Apply this value immediately but track it so that a later pop will in fact
+ // restore this value.
+ if (currentSeconds < 1)
+ m_Context.SetClearColor(QT3DSVec4(.8f, .0f, .0f, 1.f));
+ else if (currentSeconds < 2)
+ m_Context.SetClearColor(QT3DSVec4(0.f, .0f, 1.f, 1.f));
+ else
+ m_Context.SetClearColor(QT3DSVec4(0.f, 1.0f, 1.f, 1.f));
+ m_Context.Clear(NVRenderClearFlags(NVRenderClearValues::Color));
+ }
+ virtual QT3DSU32 getRuntimeInSeconds() { return 2; }
+ virtual void release() { NVDelete(m_Context.GetFoundation(), this); }
+};
+}
+
+// QT3DS_RENDER_REGISTER_EXAMPLE( ClearColor ); \ No newline at end of file
diff --git a/src/render/Examples/Qt3DSRenderExample.cpp b/src/render/Examples/Qt3DSRenderExample.cpp
new file mode 100644
index 0000000..d866cda
--- /dev/null
+++ b/src/render/Examples/Qt3DSRenderExample.cpp
@@ -0,0 +1,491 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderExample.h"
+#include "render/NvRenderBaseTypes.h"
+#include "render_util/NVRenderAllocator.h"
+#include "render_util/NVRenderErrorStream.h"
+#include "render_util/NVRenderUtils.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSTime.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSMath.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+
+static TExampleCreateFunc gCreateFuncs[128];
+
+TExampleCreateFunc *NVRenderExampleFactory::mExampleCreators = gCreateFuncs;
+QT3DSU32 NVRenderExampleFactory::mMaxCreators = 128;
+QT3DSU32 NVRenderExampleFactory::mNumCreators = 0;
+namespace {
+NVRenderErrorStream g_errorStream;
+NVRenderAllocator g_allocator(g_errorStream);
+NVFoundation *g_foundation(NULL);
+NVRenderContext *g_renderContext(NULL);
+NVRenderExample *g_example(NULL);
+QT3DSI32 g_exampleIdx(0);
+Time::Second g_runTime;
+Time g_timer;
+}
+
+bool NVRenderExampleFactory::nextExample()
+{
+ if (g_example)
+ g_example->release();
+ g_example = 0;
+ if (g_exampleIdx < (int)mNumCreators) {
+ g_example = mExampleCreators[g_exampleIdx](*g_renderContext);
+ ++g_exampleIdx;
+ g_runTime = g_example->getRuntimeInSeconds();
+ g_timer = Time();
+ return true;
+ }
+ return false;
+}
+
+void NVRenderExampleFactory::beginExamples()
+{
+ g_foundation = NVCreateFoundation(QT3DS_FOUNDATION_VERSION, g_allocator, g_errorStream);
+ g_renderContext =
+ &NVRenderContext::CreateGL(*g_foundation, NVRenderContextType(NVRenderContextValues::GL2));
+ nextExample();
+}
+bool NVRenderExampleFactory::update()
+{
+ Time::Second currentTime = g_timer.peekElapsedSeconds();
+ if (currentTime > g_runTime)
+ nextExample();
+ if (g_example)
+ g_example->drawFrame(currentTime);
+
+ return g_example != NULL;
+}
+
+void NVRenderExampleFactory::endExamples()
+{
+ g_exampleIdx = mNumCreators;
+ nextExample();
+ if (g_renderContext)
+ g_renderContext->release();
+ if (g_foundation)
+ g_foundation->release();
+
+ g_renderContext = NULL;
+ g_foundation = NULL;
+}
+
+namespace qt3ds {
+namespace render {
+ ///////////////////////////////////////////////////////////////////////////////
+
+ // Math stuff
+
+ int eq(float a, float b)
+ {
+ float diff = a - b;
+ if (diff < 0) {
+ diff = -diff;
+ }
+ return diff <= eps;
+ }
+
+ //
+ // Matrix functions, since GLES 2.x doesn't provide them
+ //
+
+ void NvGl2DemoMatrixIdentity(float m[16])
+ {
+ memset(m, 0, sizeof(float) * 16);
+ m[4 * 0 + 0] = m[4 * 1 + 1] = m[4 * 2 + 2] = m[4 * 3 + 3] = 1.0;
+ }
+
+ int NvGl2DemoMatrixEquals(float a[16], float b[16])
+ {
+ int i;
+ for (i = 0; i < 16; ++i)
+ if (!eq(a[i], b[i]))
+ return 0;
+
+ return 1;
+ }
+
+ void NvGl2DemoMatrixTranspose(float m[16])
+ {
+ int i, j;
+ float t;
+ for (i = 1; i < 4; ++i)
+ for (j = 0; j < i; ++j) {
+ t = m[4 * i + j];
+ m[4 * i + j] = m[4 * j + i];
+ m[4 * j + i] = t;
+ }
+ }
+
+ void NvGl2DemoMatrixMultiply(float m0[16], float m1[16])
+ {
+ int r, c, i;
+ for (r = 0; r < 4; r++) {
+ float m[4] = { 0.0, 0.0, 0.0, 0.0 };
+ for (c = 0; c < 4; c++) {
+ for (i = 0; i < 4; i++) {
+ m[c] += m0[4 * i + r] * m1[4 * c + i];
+ }
+ }
+ for (c = 0; c < 4; c++) {
+ m0[4 * c + r] = m[c];
+ }
+ }
+ }
+
+ void NvGl2DemoMatrixMultiply_4x4_3x3(float m0[16], float m1[9])
+ {
+ int r, c, i;
+ for (r = 0; r < 4; r++) {
+ float m[3] = { 0.0, 0.0, 0.0 };
+ for (c = 0; c < 3; c++) {
+ for (i = 0; i < 3; i++) {
+ m[c] += m0[4 * i + r] * m1[3 * c + i];
+ }
+ }
+ for (c = 0; c < 3; c++) {
+ m0[4 * c + r] = m[c];
+ }
+ }
+ }
+
+ void NvGl2DemoMatrixMultiply_3x3(float m0[9], float m1[9])
+ {
+ int r, c, i;
+ for (r = 0; r < 3; r++) {
+ float m[3] = { 0.0, 0.0, 0.0 };
+ for (c = 0; c < 3; c++) {
+ for (i = 0; i < 3; i++) {
+ m[c] += m0[3 * i + r] * m1[3 * c + i];
+ }
+ }
+ for (c = 0; c < 3; c++) {
+ m0[3 * c + r] = m[c];
+ }
+ }
+ }
+
+ void NvGl2DemoMatrixFrustum(float m[16], float l, float r, float b, float t, float n, float f)
+ {
+ float m1[16];
+ float rightMinusLeftInv, topMinusBottomInv, farMinusNearInv, twoNear;
+
+ rightMinusLeftInv = 1.0f / (r - l);
+ topMinusBottomInv = 1.0f / (t - b);
+ farMinusNearInv = 1.0f / (f - n);
+ twoNear = 2.0f * n;
+
+ m1[0] = twoNear * rightMinusLeftInv;
+ m1[1] = 0.0f;
+ m1[2] = 0.0f;
+ m1[3] = 0.0f;
+
+ m1[4] = 0.0f;
+ m1[5] = twoNear * topMinusBottomInv;
+ m1[6] = 0.0f;
+ m1[7] = 0.0f;
+
+ m1[8] = (r + l) * rightMinusLeftInv;
+ m1[9] = (t + b) * topMinusBottomInv;
+ m1[10] = -(f + n) * farMinusNearInv;
+ m1[11] = -1.0f;
+
+ m1[12] = 0.0f;
+ m1[13] = 0.0f;
+ m1[14] = -(twoNear * f) * farMinusNearInv;
+ m1[15] = 0.0f;
+
+ NvGl2DemoMatrixMultiply(m, m1);
+ }
+
+ void NvGl2DemoMatrixOrtho(float m[16], float l, float r, float b, float t, float n, float f)
+ {
+ float m1[16];
+ float rightMinusLeftInv, topMinusBottomInv, farMinusNearInv;
+
+ rightMinusLeftInv = 1.0f / (r - l);
+ topMinusBottomInv = 1.0f / (t - b);
+ farMinusNearInv = 1.0f / (f - n);
+
+ m1[0] = 2.0f * rightMinusLeftInv;
+ m1[1] = 0.0f;
+ m1[2] = 0.0f;
+ m1[3] = 0.0f;
+
+ m1[4] = 0.0f;
+ m1[5] = 2.0f * topMinusBottomInv;
+ m1[6] = 0.0f;
+ m1[7] = 0.0f;
+
+ m1[8] = 0.0f;
+ m1[9] = 0.0f;
+ m1[10] = -2.0f * farMinusNearInv;
+ m1[11] = 0.0f;
+
+ m1[12] = -(r + l) * rightMinusLeftInv;
+ m1[13] = -(t + b) * topMinusBottomInv;
+ m1[14] = -(f + n) * farMinusNearInv;
+ m1[15] = 1.0f;
+
+ NvGl2DemoMatrixMultiply(m, m1);
+ }
+
+ void NvGl2DemoMatrixTranslate(float m[16], float x, float y, float z)
+ {
+ float m1[16];
+ NvGl2DemoMatrixIdentity(m1);
+
+ m1[4 * 3 + 0] = x;
+ m1[4 * 3 + 1] = y;
+ m1[4 * 3 + 2] = z;
+
+ NvGl2DemoMatrixMultiply(m, m1);
+ }
+
+ void NvGl2DemoMatrixRotate_create3x3(float m[9], float theta, float x, float y, float z)
+ {
+ float len = (float)sqrtf(x * x + y * y + z * z);
+ float u0 = x / len;
+ float u1 = y / len;
+ float u2 = z / len;
+ float rad = (float)(theta / 180 * NVPi);
+ float c = (float)cosf(rad);
+ float s = (float)sinf(rad);
+ m[3 * 0 + 0] = u0 * u0 + c * (1 - u0 * u0) + s * 0;
+ m[3 * 0 + 1] = u0 * u1 + c * (0 - u0 * u1) + s * u2;
+ m[3 * 0 + 2] = u0 * u2 + c * (0 - u0 * u2) - s * u1;
+
+ m[3 * 1 + 0] = u1 * u0 + c * (0 - u1 * u0) - s * u2;
+ m[3 * 1 + 1] = u1 * u1 + c * (1 - u1 * u1) + s * 0;
+ m[3 * 1 + 2] = u1 * u2 + c * (0 - u1 * u2) + s * u0;
+
+ m[3 * 2 + 0] = u2 * u0 + c * (0 - u2 * u0) + s * u1;
+ m[3 * 2 + 1] = u2 * u1 + c * (0 - u2 * u1) - s * u0;
+ m[3 * 2 + 2] = u2 * u2 + c * (1 - u2 * u2) + s * 0;
+ }
+
+ void NvGl2DemoMatrixRotate(float m[16], float theta, float x, float y, float z)
+ {
+ float r[9];
+ NvGl2DemoMatrixRotate_create3x3(r, theta, x, y, z);
+ NvGl2DemoMatrixMultiply_4x4_3x3(m, r);
+ }
+
+ void NvGl2DemoMatrixRotate_3x3(float m[9], float theta, float x, float y, float z)
+ {
+ float r[9];
+ NvGl2DemoMatrixRotate_create3x3(r, theta, x, y, z);
+ NvGl2DemoMatrixMultiply_3x3(m, r);
+ }
+
+ float NvGl2DemoMatrixDeterminant(float m[16])
+ {
+ return m[4 * 0 + 3] * m[4 * 1 + 2] * m[4 * 2 + 1] * m[4 * 3 + 0]
+ - m[4 * 0 + 2] * m[4 * 1 + 3] * m[4 * 2 + 1] * m[4 * 3 + 0]
+ - m[4 * 0 + 3] * m[4 * 1 + 1] * m[4 * 2 + 2] * m[4 * 3 + 0]
+ + m[4 * 0 + 1] * m[4 * 1 + 3] * m[4 * 2 + 2] * m[4 * 3 + 0]
+ + m[4 * 0 + 2] * m[4 * 1 + 1] * m[4 * 2 + 3] * m[4 * 3 + 0]
+ - m[4 * 0 + 1] * m[4 * 1 + 2] * m[4 * 2 + 3] * m[4 * 3 + 0]
+ - m[4 * 0 + 3] * m[4 * 1 + 2] * m[4 * 2 + 0] * m[4 * 3 + 1]
+ + m[4 * 0 + 2] * m[4 * 1 + 3] * m[4 * 2 + 0] * m[4 * 3 + 1]
+ + m[4 * 0 + 3] * m[4 * 1 + 0] * m[4 * 2 + 2] * m[4 * 3 + 1]
+ - m[4 * 0 + 0] * m[4 * 1 + 3] * m[4 * 2 + 2] * m[4 * 3 + 1]
+ - m[4 * 0 + 2] * m[4 * 1 + 0] * m[4 * 2 + 3] * m[4 * 3 + 1]
+ + m[4 * 0 + 0] * m[4 * 1 + 2] * m[4 * 2 + 3] * m[4 * 3 + 1]
+ + m[4 * 0 + 3] * m[4 * 1 + 1] * m[4 * 2 + 0] * m[4 * 3 + 2]
+ - m[4 * 0 + 1] * m[4 * 1 + 3] * m[4 * 2 + 0] * m[4 * 3 + 2]
+ - m[4 * 0 + 3] * m[4 * 1 + 0] * m[4 * 2 + 1] * m[4 * 3 + 2]
+ + m[4 * 0 + 0] * m[4 * 1 + 3] * m[4 * 2 + 1] * m[4 * 3 + 2]
+ + m[4 * 0 + 1] * m[4 * 1 + 0] * m[4 * 2 + 3] * m[4 * 3 + 2]
+ - m[4 * 0 + 0] * m[4 * 1 + 1] * m[4 * 2 + 3] * m[4 * 3 + 2]
+ - m[4 * 0 + 2] * m[4 * 1 + 1] * m[4 * 2 + 0] * m[4 * 3 + 3]
+ + m[4 * 0 + 1] * m[4 * 1 + 2] * m[4 * 2 + 0] * m[4 * 3 + 3]
+ + m[4 * 0 + 2] * m[4 * 1 + 0] * m[4 * 2 + 1] * m[4 * 3 + 3]
+ - m[4 * 0 + 0] * m[4 * 1 + 2] * m[4 * 2 + 1] * m[4 * 3 + 3]
+ - m[4 * 0 + 1] * m[4 * 1 + 0] * m[4 * 2 + 2] * m[4 * 3 + 3]
+ + m[4 * 0 + 0] * m[4 * 1 + 1] * m[4 * 2 + 2] * m[4 * 3 + 3];
+ }
+
+ void NvGl2DemoMatrixInverse(float m[16])
+ {
+ float a[16];
+ float det;
+ int i;
+ float b[16], e[16];
+
+ a[4 * 0 + 0] = m[4 * 1 + 2] * m[4 * 2 + 3] * m[4 * 3 + 1]
+ - m[4 * 1 + 3] * m[4 * 2 + 2] * m[4 * 3 + 1]
+ + m[4 * 1 + 3] * m[4 * 2 + 1] * m[4 * 3 + 2]
+ - m[4 * 1 + 1] * m[4 * 2 + 3] * m[4 * 3 + 2]
+ - m[4 * 1 + 2] * m[4 * 2 + 1] * m[4 * 3 + 3]
+ + m[4 * 1 + 1] * m[4 * 2 + 2] * m[4 * 3 + 3];
+ a[4 * 0 + 1] = m[4 * 0 + 3] * m[4 * 2 + 2] * m[4 * 3 + 1]
+ - m[4 * 0 + 2] * m[4 * 2 + 3] * m[4 * 3 + 1]
+ - m[4 * 0 + 3] * m[4 * 2 + 1] * m[4 * 3 + 2]
+ + m[4 * 0 + 1] * m[4 * 2 + 3] * m[4 * 3 + 2]
+ + m[4 * 0 + 2] * m[4 * 2 + 1] * m[4 * 3 + 3]
+ - m[4 * 0 + 1] * m[4 * 2 + 2] * m[4 * 3 + 3];
+ a[4 * 0 + 2] = m[4 * 0 + 2] * m[4 * 1 + 3] * m[4 * 3 + 1]
+ - m[4 * 0 + 3] * m[4 * 1 + 2] * m[4 * 3 + 1]
+ + m[4 * 0 + 3] * m[4 * 1 + 1] * m[4 * 3 + 2]
+ - m[4 * 0 + 1] * m[4 * 1 + 3] * m[4 * 3 + 2]
+ - m[4 * 0 + 2] * m[4 * 1 + 1] * m[4 * 3 + 3]
+ + m[4 * 0 + 1] * m[4 * 1 + 2] * m[4 * 3 + 3];
+ a[4 * 0 + 3] = m[4 * 0 + 3] * m[4 * 1 + 2] * m[4 * 2 + 1]
+ - m[4 * 0 + 2] * m[4 * 1 + 3] * m[4 * 2 + 1]
+ - m[4 * 0 + 3] * m[4 * 1 + 1] * m[4 * 2 + 2]
+ + m[4 * 0 + 1] * m[4 * 1 + 3] * m[4 * 2 + 2]
+ + m[4 * 0 + 2] * m[4 * 1 + 1] * m[4 * 2 + 3]
+ - m[4 * 0 + 1] * m[4 * 1 + 2] * m[4 * 2 + 3];
+ a[4 * 1 + 0] = m[4 * 1 + 3] * m[4 * 2 + 2] * m[4 * 3 + 0]
+ - m[4 * 1 + 2] * m[4 * 2 + 3] * m[4 * 3 + 0]
+ - m[4 * 1 + 3] * m[4 * 2 + 0] * m[4 * 3 + 2]
+ + m[4 * 1 + 0] * m[4 * 2 + 3] * m[4 * 3 + 2]
+ + m[4 * 1 + 2] * m[4 * 2 + 0] * m[4 * 3 + 3]
+ - m[4 * 1 + 0] * m[4 * 2 + 2] * m[4 * 3 + 3];
+ a[4 * 1 + 1] = m[4 * 0 + 2] * m[4 * 2 + 3] * m[4 * 3 + 0]
+ - m[4 * 0 + 3] * m[4 * 2 + 2] * m[4 * 3 + 0]
+ + m[4 * 0 + 3] * m[4 * 2 + 0] * m[4 * 3 + 2]
+ - m[4 * 0 + 0] * m[4 * 2 + 3] * m[4 * 3 + 2]
+ - m[4 * 0 + 2] * m[4 * 2 + 0] * m[4 * 3 + 3]
+ + m[4 * 0 + 0] * m[4 * 2 + 2] * m[4 * 3 + 3];
+ a[4 * 1 + 2] = m[4 * 0 + 3] * m[4 * 1 + 2] * m[4 * 3 + 0]
+ - m[4 * 0 + 2] * m[4 * 1 + 3] * m[4 * 3 + 0]
+ - m[4 * 0 + 3] * m[4 * 1 + 0] * m[4 * 3 + 2]
+ + m[4 * 0 + 0] * m[4 * 1 + 3] * m[4 * 3 + 2]
+ + m[4 * 0 + 2] * m[4 * 1 + 0] * m[4 * 3 + 3]
+ - m[4 * 0 + 0] * m[4 * 1 + 2] * m[4 * 3 + 3];
+ a[4 * 1 + 3] = m[4 * 0 + 2] * m[4 * 1 + 3] * m[4 * 2 + 0]
+ - m[4 * 0 + 3] * m[4 * 1 + 2] * m[4 * 2 + 0]
+ + m[4 * 0 + 3] * m[4 * 1 + 0] * m[4 * 2 + 2]
+ - m[4 * 0 + 0] * m[4 * 1 + 3] * m[4 * 2 + 2]
+ - m[4 * 0 + 2] * m[4 * 1 + 0] * m[4 * 2 + 3]
+ + m[4 * 0 + 0] * m[4 * 1 + 2] * m[4 * 2 + 3];
+ a[4 * 2 + 0] = m[4 * 1 + 1] * m[4 * 2 + 3] * m[4 * 3 + 0]
+ - m[4 * 1 + 3] * m[4 * 2 + 1] * m[4 * 3 + 0]
+ + m[4 * 1 + 3] * m[4 * 2 + 0] * m[4 * 3 + 1]
+ - m[4 * 1 + 0] * m[4 * 2 + 3] * m[4 * 3 + 1]
+ - m[4 * 1 + 1] * m[4 * 2 + 0] * m[4 * 3 + 3]
+ + m[4 * 1 + 0] * m[4 * 2 + 1] * m[4 * 3 + 3];
+ a[4 * 2 + 1] = m[4 * 0 + 3] * m[4 * 2 + 1] * m[4 * 3 + 0]
+ - m[4 * 0 + 1] * m[4 * 2 + 3] * m[4 * 3 + 0]
+ - m[4 * 0 + 3] * m[4 * 2 + 0] * m[4 * 3 + 1]
+ + m[4 * 0 + 0] * m[4 * 2 + 3] * m[4 * 3 + 1]
+ + m[4 * 0 + 1] * m[4 * 2 + 0] * m[4 * 3 + 3]
+ - m[4 * 0 + 0] * m[4 * 2 + 1] * m[4 * 3 + 3];
+ a[4 * 2 + 2] = m[4 * 0 + 1] * m[4 * 1 + 3] * m[4 * 3 + 0]
+ - m[4 * 0 + 3] * m[4 * 1 + 1] * m[4 * 3 + 0]
+ + m[4 * 0 + 3] * m[4 * 1 + 0] * m[4 * 3 + 1]
+ - m[4 * 0 + 0] * m[4 * 1 + 3] * m[4 * 3 + 1]
+ - m[4 * 0 + 1] * m[4 * 1 + 0] * m[4 * 3 + 3]
+ + m[4 * 0 + 0] * m[4 * 1 + 1] * m[4 * 3 + 3];
+ a[4 * 2 + 3] = m[4 * 0 + 3] * m[4 * 1 + 1] * m[4 * 2 + 0]
+ - m[4 * 0 + 1] * m[4 * 1 + 3] * m[4 * 2 + 0]
+ - m[4 * 0 + 3] * m[4 * 1 + 0] * m[4 * 2 + 1]
+ + m[4 * 0 + 0] * m[4 * 1 + 3] * m[4 * 2 + 1]
+ + m[4 * 0 + 1] * m[4 * 1 + 0] * m[4 * 2 + 3]
+ - m[4 * 0 + 0] * m[4 * 1 + 1] * m[4 * 2 + 3];
+ a[4 * 3 + 0] = m[4 * 1 + 2] * m[4 * 2 + 1] * m[4 * 3 + 0]
+ - m[4 * 1 + 1] * m[4 * 2 + 2] * m[4 * 3 + 0]
+ - m[4 * 1 + 2] * m[4 * 2 + 0] * m[4 * 3 + 1]
+ + m[4 * 1 + 0] * m[4 * 2 + 2] * m[4 * 3 + 1]
+ + m[4 * 1 + 1] * m[4 * 2 + 0] * m[4 * 3 + 2]
+ - m[4 * 1 + 0] * m[4 * 2 + 1] * m[4 * 3 + 2];
+ a[4 * 3 + 1] = m[4 * 0 + 1] * m[4 * 2 + 2] * m[4 * 3 + 0]
+ - m[4 * 0 + 2] * m[4 * 2 + 1] * m[4 * 3 + 0]
+ + m[4 * 0 + 2] * m[4 * 2 + 0] * m[4 * 3 + 1]
+ - m[4 * 0 + 0] * m[4 * 2 + 2] * m[4 * 3 + 1]
+ - m[4 * 0 + 1] * m[4 * 2 + 0] * m[4 * 3 + 2]
+ + m[4 * 0 + 0] * m[4 * 2 + 1] * m[4 * 3 + 2];
+ a[4 * 3 + 2] = m[4 * 0 + 2] * m[4 * 1 + 1] * m[4 * 3 + 0]
+ - m[4 * 0 + 1] * m[4 * 1 + 2] * m[4 * 3 + 0]
+ - m[4 * 0 + 2] * m[4 * 1 + 0] * m[4 * 3 + 1]
+ + m[4 * 0 + 0] * m[4 * 1 + 2] * m[4 * 3 + 1]
+ + m[4 * 0 + 1] * m[4 * 1 + 0] * m[4 * 3 + 2]
+ - m[4 * 0 + 0] * m[4 * 1 + 1] * m[4 * 3 + 2];
+ a[4 * 3 + 3] = m[4 * 0 + 1] * m[4 * 1 + 2] * m[4 * 2 + 0]
+ - m[4 * 0 + 2] * m[4 * 1 + 1] * m[4 * 2 + 0]
+ + m[4 * 0 + 2] * m[4 * 1 + 0] * m[4 * 2 + 1]
+ - m[4 * 0 + 0] * m[4 * 1 + 2] * m[4 * 2 + 1]
+ - m[4 * 0 + 1] * m[4 * 1 + 0] * m[4 * 2 + 2]
+ + m[4 * 0 + 0] * m[4 * 1 + 1] * m[4 * 2 + 2];
+
+ det = NvGl2DemoMatrixDeterminant(m);
+
+ for (i = 0; i < 16; ++i)
+ a[i] /= det;
+
+ NvGl2DemoMatrixIdentity(e);
+
+ NvGl2DemoMatrixCopy(b, m);
+ NvGl2DemoMatrixMultiply(b, a);
+
+ NvGl2DemoMatrixCopy(m, a);
+ }
+
+ void NvGl2DemoMatrixCopy(float dest[16], float src[16])
+ {
+ memcpy(dest, src, 16 * sizeof(float));
+ }
+
+ void NvGl2DemoMatrixPrint(float a[16])
+ {
+ int i, j;
+
+ for (i = 0; i < 4; ++i)
+ for (j = 0; j < 4; ++j)
+ printf("%f%c", a[4 * i + j], j == 3 ? '\n' : ' ');
+ }
+
+ void NvGl2DemoMatrixVectorMultiply(float m[16], float v[4])
+ {
+ float res[4];
+ int i, j;
+
+ for (i = 0; i < 4; ++i) {
+ res[i] = 0;
+ for (j = 0; j < 4; ++j)
+ res[i] += m[i * 4 + j] * v[j];
+ }
+
+ memcpy(v, res, sizeof(res));
+ }
+}
+} \ No newline at end of file
diff --git a/src/render/Examples/Qt3DSRenderExample.h b/src/render/Examples/Qt3DSRenderExample.h
new file mode 100644
index 0000000..79bfd91
--- /dev/null
+++ b/src/render/Examples/Qt3DSRenderExample.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_EXAMPLE_H
+#define QT3DS_RENDER_EXAMPLE_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/NvRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContext;
+
+ class NVRenderExample
+ {
+ protected:
+ virtual ~NVRenderExample() {}
+ public:
+ virtual void drawFrame(double currentSeconds) = 0;
+ virtual QT3DSU32 getRuntimeInSeconds() { return 5; }
+ virtual void handleKeypress(int /*keypress*/) {}
+ virtual void release() = 0;
+ };
+
+ typedef NVRenderExample *(*TExampleCreateFunc)(NVRenderContext &context);
+
+ struct NVRenderExampleFactory
+ {
+ static TExampleCreateFunc *mExampleCreators;
+ static QT3DSU32 mMaxCreators;
+ static QT3DSU32 mNumCreators;
+
+ static void addCreator(TExampleCreateFunc creator)
+ {
+ if (mNumCreators < mMaxCreators) {
+ mExampleCreators[mNumCreators] = creator;
+ ++mNumCreators;
+ } else
+ QT3DS_ASSERT(false);
+ }
+
+ // Assuming that the render context is egl
+ // Relies on the global structures defined in demo common
+ // to figure out window state.
+ static bool nextExample();
+ static void beginExamples();
+ static bool update();
+ static void endExamples();
+ };
+
+ template <typename TExample>
+ struct NVRenderExampleCreator
+ {
+
+ static NVRenderExample *createExample(NVRenderContext &context)
+ {
+ return QT3DS_NEW(context.GetFoundation().getAllocator(), TExample)(context);
+ }
+ NVRenderExampleCreator() { NVRenderExampleFactory::addCreator(createExample); }
+ };
+
+#define QT3DS_RENDER_REGISTER_EXAMPLE(dtype) static NVRenderExampleCreator<dtype> dtype##Creator
+
+#define eps 1e-4
+
+ int eq(float a, float b);
+
+ // Matrix functions
+ void NvGl2DemoMatrixIdentity(float m[16]);
+ int NvGl2DemoMatrixEquals(float a[16], float b[16]);
+ void NvGl2DemoMatrixTranspose(float m[16]);
+ void NvGl2DemoMatrixMultiply(float m0[16], float m1[16]);
+ void NvGl2DemoMatrixMultiply_4x4_3x3(float m0[16], float m1[9]);
+ void NvGl2DemoMatrixMultiply_3x3(float m0[9], float m1[9]);
+ void NvGl2DemoMatrixFrustum(float m[16], float l, float r, float b, float t, float n, float f);
+ void NvGl2DemoMatrixOrtho(float m[16], float l, float r, float b, float t, float n, float f);
+ void NvGl2DemoMatrixTranslate(float m[16], float x, float y, float z);
+ void NvGl2DemoMatrixRotate_create3x3(float m[9], float theta, float x, float y, float z);
+ void NvGl2DemoMatrixRotate(float m[16], float theta, float x, float y, float z);
+ void NvGl2DemoMatrixRotate_3x3(float m[9], float theta, float x, float y, float z);
+
+ float NvGl2DemoMatrixDeterminant(float m[16]);
+ void NvGl2DemoMatrixInverse(float m[16]);
+ void NvGl2DemoMatrixCopy(float dest[16], float src[16]);
+
+ void NvGl2DemoMatrixPrint(float a[16]);
+
+ void NvGl2DemoMatrixVectorMultiply(float m[16], float v[4]);
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/render/Examples/Qt3DSRenderExampleTools.cpp b/src/render/Examples/Qt3DSRenderExampleTools.cpp
new file mode 100644
index 0000000..efae6f5
--- /dev/null
+++ b/src/render/Examples/Qt3DSRenderExampleTools.cpp
@@ -0,0 +1,188 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderExampleTools.h"
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render_util/NVRenderUtils.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSVec4.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+
+struct BoxFace
+{
+ QT3DSVec3 positions[4];
+ QT3DSVec3 normal;
+};
+
+static const BoxFace g_BoxFaces[] = {
+ { // Z+
+ QT3DSVec3(-1, -1, 1), QT3DSVec3(-1, 1, 1), QT3DSVec3(1, 1, 1), QT3DSVec3(1, -1, 1), QT3DSVec3(0, 0, 1) },
+ { // X+
+ QT3DSVec3(1, -1, 1), QT3DSVec3(1, 1, 1), QT3DSVec3(1, 1, -1), QT3DSVec3(1, -1, -1), QT3DSVec3(1, 0, 0) },
+ { // Z-
+ QT3DSVec3(1, -1, -1), QT3DSVec3(1, 1, -1), QT3DSVec3(-1, 1, -1), QT3DSVec3(-1, -1, -1),
+ QT3DSVec3(0, 0, -1) },
+ { // X-
+ QT3DSVec3(-1, -1, -1), QT3DSVec3(-1, 1, -1), QT3DSVec3(-1, 1, 1), QT3DSVec3(-1, -1, 1),
+ QT3DSVec3(-1, 0, 0) },
+ { // Y+
+ QT3DSVec3(-1, 1, 1), QT3DSVec3(-1, 1, -1), QT3DSVec3(1, 1, -1), QT3DSVec3(1, 1, 1), QT3DSVec3(0, 1, 0) },
+ { // Y-
+ QT3DSVec3(-1, -1, -1), QT3DSVec3(-1, -1, 1), QT3DSVec3(1, -1, 1), QT3DSVec3(1, -1, -1), QT3DSVec3(0, -1, 0) }
+};
+
+static const QT3DSVec3 g_BoxUVs[] = {
+ QT3DSVec3(0, 1, 0), QT3DSVec3(0, 0, 0), QT3DSVec3(1, 0, 0), QT3DSVec3(1, 1, 0),
+};
+
+void NVRenderExampleTools::createBox(NVRenderContext &context,
+ NVRenderVertexBuffer *&outVertexBuffer,
+ NVRenderIndexBuffer *&outIndexBuffer, bool releaseMemory)
+{
+ const QT3DSU32 numVerts = 24;
+ const QT3DSU32 numIndices = 36;
+ QT3DSVec3 extents = QT3DSVec3(1, 1, 1);
+
+ NVRenderVertexBufferEntry entries[] = {
+ NVRenderVertexBufferEntry("attr_pos", NVRenderComponentTypes::QT3DSF32, 3, 0),
+ NVRenderVertexBufferEntry("attr_norm", NVRenderComponentTypes::QT3DSF32, 3, 3 * sizeof(QT3DSF32)),
+ NVRenderVertexBufferEntry("attr_uv", NVRenderComponentTypes::QT3DSF32, 2, 6 * sizeof(QT3DSF32)),
+ };
+
+ QT3DSU32 bufStride = 8 * sizeof(QT3DSF32);
+ QT3DSU32 bufSize = bufStride * numVerts;
+ outVertexBuffer = context.CreateVertexBuffer(
+ NVRenderBufferUsageType::Static, NVConstDataRef<NVRenderVertexBufferEntry>(entries, 3), 0,
+ releaseMemory ? 0 : bufSize);
+ QT3DS_ASSERT(bufStride == outVertexBuffer->GetStride());
+ NVDataRef<QT3DSU8> vertData;
+ if (releaseMemory)
+ vertData = NVDataRef<QT3DSU8>(
+ (QT3DSU8 *)QT3DS_ALLOC(context.GetFoundation().getAllocator(), bufSize, "VertexBufferData"),
+ bufSize);
+ else
+ vertData = outVertexBuffer->LockBuffer(bufSize);
+ QT3DSU8 *positions = (QT3DSU8 *)vertData.begin();
+ QT3DSU8 *normals = positions + 3 * sizeof(QT3DSF32);
+ QT3DSU8 *uvs = normals + 3 * sizeof(QT3DSF32);
+
+ for (QT3DSU32 i = 0; i < 6; i++) {
+ const BoxFace &bf = g_BoxFaces[i];
+ for (QT3DSU32 j = 0; j < 4; j++) {
+ QT3DSVec3 &p = *(QT3DSVec3 *)positions;
+ positions = ((QT3DSU8 *)positions) + bufStride;
+ QT3DSVec3 &n = *(QT3DSVec3 *)normals;
+ normals = ((QT3DSU8 *)normals) + bufStride;
+ QT3DSF32 *uv = (QT3DSF32 *)uvs;
+ uvs = ((QT3DSU8 *)uvs) + bufStride;
+ n = bf.normal;
+ p = bf.positions[j].multiply(extents);
+ uv[0] = g_BoxUVs[j].x;
+ uv[1] = g_BoxUVs[j].y;
+ }
+ }
+
+ if (releaseMemory) {
+ outVertexBuffer->SetBuffer(vertData, false);
+ context.GetFoundation().getAllocator().deallocate(vertData.begin());
+ } else
+ outVertexBuffer->UnlockBuffer();
+
+ bufSize = numIndices * sizeof(QT3DSU16);
+ outIndexBuffer =
+ context.CreateIndexBuffer(NVRenderBufferUsageType::Static, NVRenderComponentTypes::QT3DSU16,
+ releaseMemory ? 0 : bufSize);
+ NVDataRef<QT3DSU8> indexData;
+ if (releaseMemory)
+ indexData = NVDataRef<QT3DSU8>(
+ (QT3DSU8 *)QT3DS_ALLOC(context.GetFoundation().getAllocator(), bufSize, "IndexData"),
+ bufSize);
+ else
+ indexData = outIndexBuffer->LockBuffer(bufSize);
+ QT3DSU16 *indices = reinterpret_cast<QT3DSU16 *>(indexData.begin());
+ for (QT3DSU8 i = 0; i < 6; i++) {
+ const QT3DSU16 base = i * 4;
+ *(indices++) = base + 0;
+ *(indices++) = base + 1;
+ *(indices++) = base + 2;
+ *(indices++) = base + 0;
+ *(indices++) = base + 2;
+ *(indices++) = base + 3;
+ }
+ if (releaseMemory) {
+ outIndexBuffer->SetBuffer(indexData, false);
+ context.GetFoundation().getAllocator().deallocate(indexData.begin());
+ } else
+ outIndexBuffer->UnlockBuffer();
+}
+
+namespace {
+
+inline NVConstDataRef<QT3DSI8> toRef(const char *data)
+{
+ size_t len = strlen(data) + 1;
+ return NVConstDataRef<QT3DSI8>((const QT3DSI8 *)data, len);
+}
+
+static void dumpShaderOutput(NVRenderContext &ctx,
+ const NVRenderVertFragCompilationResult &compResult)
+{
+ if (!isTrivial(compResult.mFragCompilationOutput)) {
+ ctx.GetFoundation().error(QT3DS_WARN, "Frag output:\n%s", compResult.mFragCompilationOutput);
+ }
+ if (!isTrivial(compResult.mVertCompilationOutput)) {
+ ctx.GetFoundation().error(QT3DS_WARN, "Vert output:\n%s", compResult.mVertCompilationOutput);
+ }
+ if (!isTrivial(compResult.mLinkOutput)) {
+ ctx.GetFoundation().error(QT3DS_WARN, "Link output:\n%s", compResult.mLinkOutput);
+ }
+}
+
+NVRenderVertFragShader *compileAndDump(NVRenderContext &ctx, const char *name,
+ const char *vertShader, const char *fragShader)
+{
+ NVRenderVertFragCompilationResult compResult =
+ ctx.CompileSource(name, toRef(vertShader), toRef(fragShader));
+ dumpShaderOutput(ctx, compResult);
+ return compResult.mShader;
+}
+}
+
+NVRenderVertFragShader *NVRenderExampleTools::createSimpleShader(NVRenderContext &ctx)
+{
+ return compileAndDump(ctx, "SimpleShader", getSimpleVertShader(), getSimpleFragShader());
+}
+
+NVRenderVertFragShader *NVRenderExampleTools::createSimpleShaderTex(NVRenderContext &ctx)
+{
+ return compileAndDump(ctx, "SimpleShader", getSimpleVertShader(), getSimpleFragShaderTex());
+} \ No newline at end of file
diff --git a/src/render/Examples/Qt3DSRenderExampleTools.h b/src/render/Examples/Qt3DSRenderExampleTools.h
new file mode 100644
index 0000000..5b40286
--- /dev/null
+++ b/src/render/Examples/Qt3DSRenderExampleTools.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_EXAMPLE_TOOLS_H
+#define QT3DS_RENDER_EXAMPLE_TOOLS_H
+#include "Qt3DSRenderExample.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderExampleTools
+ {
+ public:
+ static const char *getSimpleVertShader()
+ {
+ return "uniform mat4 mat_mvp;\n"
+ "attribute vec3 attr_pos; // Vertex pos\n"
+ "attribute vec3 attr_norm; // Vertex pos\n"
+ "attribute vec2 attr_uv; // UV coords\n"
+ "varying vec4 color_to_add;\n"
+ "varying vec2 uv_coords;\n"
+ "void main()\n"
+ "{\n"
+ "gl_Position = mat_mvp * vec4(attr_pos, 1.0);\n"
+ "color_to_add.xyz = attr_norm * attr_norm;\n"
+ "color_to_add.a = 1.0;\n"
+ "uv_coords = attr_uv;\n"
+ "}\n";
+ }
+
+ static const char *getSimpleFragShader()
+ {
+ return "precision mediump sampler2D;\n"
+ "precision mediump float;\n"
+ "varying vec4 color_to_add;\n"
+ "void main()\n"
+ "{\n"
+ "gl_FragColor=color_to_add;\n"
+ "}\n";
+ }
+
+ static const char *getSimpleFragShaderTex()
+ {
+ return "precision mediump sampler2D;\n"
+ "precision mediump float;\n"
+ "uniform sampler2D image0;\n"
+ "varying vec2 uv_coords;\n"
+ "void main()\n"
+ "{\n"
+ "gl_FragColor=vec4(texture2D( image0, uv_coords ).xyz, 1.0 );\n"
+ "}\n";
+ }
+
+ static void createBox(NVRenderContext &context, NVRenderVertexBuffer *&outVertexBuffer,
+ NVRenderIndexBuffer *&outIndexBuffer, bool releaseMemory = true);
+ static NVRenderVertFragShader *createSimpleShader(NVRenderContext &context);
+ static NVRenderVertFragShader *createSimpleShaderTex(NVRenderContext &context);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/render/Examples/Qt3DSRenderRenderToTextureExample.cpp b/src/render/Examples/Qt3DSRenderRenderToTextureExample.cpp
new file mode 100644
index 0000000..e2cb414
--- /dev/null
+++ b/src/render/Examples/Qt3DSRenderRenderToTextureExample.cpp
@@ -0,0 +1,178 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderExample.h"
+#include "Qt3DSRenderExampleTools.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "foundation/Qt3DSVec4.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+
+namespace {
+struct ShaderArgs
+{
+ float mvp[16];
+ NVRenderTexture2DPtr texture;
+ NVRenderVertFragShaderPtr shader;
+ ShaderArgs() {}
+};
+class RenderToTexture : public NVRenderExample
+{
+ NVRenderContext &m_Context;
+ NVScopedRefCounted<NVRenderVertexBuffer> mVertexBuffer;
+ NVScopedRefCounted<NVRenderIndexBuffer> mIndexBuffer;
+ // Simple shader
+ NVScopedRefCounted<NVRenderVertFragShader> mSimpleShader;
+ // Simple shader with texture lookup.
+ NVScopedRefCounted<NVRenderVertFragShader> mSimpleShaderTex;
+
+ NVScopedRefCounted<NVRenderFrameBuffer> mFrameBuffer;
+ NVScopedRefCounted<NVRenderTexture2D> mColorBuffer;
+ NVScopedRefCounted<NVRenderTexture2D> mDepthBuffer;
+
+ NVRenderHandle mGroupId;
+ QT3DSU32 mFBWidth;
+ QT3DSU32 mFBHeight;
+
+ ShaderArgs mShaderArgs;
+ float frus[16];
+ float model[16];
+ float rot[9];
+
+public:
+ RenderToTexture(NVRenderContext &context)
+ : m_Context(context)
+ , mFBWidth(400)
+ , mFBHeight(400)
+ {
+ NVRenderExampleTools::createBox(m_Context, mVertexBuffer.mPtr, mIndexBuffer.mPtr);
+ mVertexBuffer->addRef();
+ mIndexBuffer->addRef();
+ mSimpleShader = NVRenderExampleTools::createSimpleShader(m_Context);
+ mSimpleShaderTex = NVRenderExampleTools::createSimpleShaderTex(m_Context);
+ // If you don't want the depth buffer information back out of the system, then you can
+ // do this.
+ // mDepthBuffer = m_Context.CreateRenderBuffer( NVRenderRenderBufferFormats::Depth16,
+ // mFBWidth, mFBHeight );
+
+ mDepthBuffer = m_Context.CreateTexture2D();
+ mDepthBuffer->SetTextureData(NVDataRef<QT3DSU8>(), 0, mFBWidth, mFBHeight,
+ NVRenderTextureFormats::Depth16);
+ mColorBuffer = m_Context.CreateTexture2D();
+ mColorBuffer->SetTextureData(NVDataRef<QT3DSU8>(), 0, mFBWidth, mFBHeight,
+ NVRenderTextureFormats::RGBA8);
+ if (mDepthBuffer.mPtr && mColorBuffer.mPtr) {
+ // Creating objects tends to Bind them to their active state hooks.
+ // So to protect the rest of the system against what they are doing (if we care), we
+ // need
+ // to push the current state
+ // Auto-binds the framebuffer.
+ mFrameBuffer = m_Context.CreateFrameBuffer();
+ mFrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0, *mColorBuffer.mPtr);
+ mFrameBuffer->Attach(NVRenderFrameBufferAttachments::Depth, *mDepthBuffer.mPtr);
+ QT3DS_ASSERT(mFrameBuffer->IsComplete());
+
+ m_Context.SetRenderTarget(NULL);
+ }
+ mColorBuffer->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ mColorBuffer->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ m_Context.SetVertexBuffer(mVertexBuffer);
+ m_Context.SetIndexBuffer(mIndexBuffer);
+ m_Context.SetDepthTestEnabled(true);
+ m_Context.SetDepthWriteEnabled(true);
+ m_Context.SetClearColor(QT3DSVec4(.3f));
+ // Setup various matrici
+ NvGl2DemoMatrixIdentity(model);
+ NvGl2DemoMatrixIdentity(frus);
+ NvGl2DemoMatrixFrustum(frus, -1, 1, -1, 1, 1, 10);
+ NvGl2DemoMatrixTranslate(model, 0, 0, -4);
+ mShaderArgs.texture = mColorBuffer.mPtr;
+ }
+ void setupMVP(QT3DSVec3 translation)
+ {
+ float *mvp(mShaderArgs.mvp);
+ memCopy(mvp, frus, 16 * sizeof(float));
+ NvGl2DemoMatrixMultiply(mvp, model);
+ NvGl2DemoMatrixTranslate(mvp, translation.x, translation.y, translation.z);
+ NvGl2DemoMatrixMultiply_4x4_3x3(mvp, rot);
+ }
+ void DrawIndexedArrays(QT3DSVec3 translation)
+ {
+ setupMVP(translation);
+ m_Context.SetActiveShader(mShaderArgs.shader);
+ mShaderArgs.shader->Bind();
+ mShaderArgs.shader->SetPropertyValue("mat_mvp",
+ *reinterpret_cast<QT3DSMat44 *>(mShaderArgs.mvp));
+ mShaderArgs.shader->SetPropertyValue("image0", mShaderArgs.texture);
+ m_Context.Draw(NVRenderDrawMode::Triangles, mIndexBuffer->GetNumIndices(), 0);
+ }
+
+ virtual void drawFrame(double currentSeconds)
+ {
+ NvGl2DemoMatrixRotate_create3x3(rot, (float)currentSeconds * 50, .707f, .707f, 0);
+ NVRenderClearFlags clearFlags(NVRenderClearValues::Color | NVRenderClearValues::Depth);
+ // render to frame buffer
+ {
+ NVRenderContextScopedProperty<NVRenderFrameBufferPtr> __framebuffer(
+ m_Context, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget,
+ mFrameBuffer);
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ m_Context, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport,
+ NVRenderRect(0, 0, mFBWidth, mFBHeight));
+ NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
+ m_Context, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor,
+ QT3DSVec4(.6f));
+ m_Context.Clear(clearFlags);
+ mShaderArgs.shader = mSimpleShader;
+ DrawIndexedArrays(QT3DSVec3(0.f));
+ }
+ m_Context.Clear(clearFlags);
+ mShaderArgs.texture = mColorBuffer;
+ mShaderArgs.shader = mSimpleShaderTex;
+
+ DrawIndexedArrays(QT3DSVec3(-2.f, 0.f, 0.f));
+
+ mShaderArgs.texture = mDepthBuffer;
+ DrawIndexedArrays(QT3DSVec3(2.f, 0.f, 0.f));
+ }
+ virtual QT3DSU32 getRuntimeInSeconds()
+ {
+ return mSimpleShader.mPtr && mSimpleShaderTex.mPtr ? 5 : 0;
+ }
+ virtual void release() { NVDelete(m_Context.GetFoundation(), this); }
+};
+}
+
+QT3DS_RENDER_REGISTER_EXAMPLE(RenderToTexture); \ No newline at end of file
diff --git a/src/render/Examples/Qt3DSRenderSpinningCubeExample.cpp b/src/render/Examples/Qt3DSRenderSpinningCubeExample.cpp
new file mode 100644
index 0000000..807f082
--- /dev/null
+++ b/src/render/Examples/Qt3DSRenderSpinningCubeExample.cpp
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderExample.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "render/NVRenderVertFragShader.h"
+#include "render_util/NVRenderUtils.h"
+#include "Qt3DSRenderExampleTools.h"
+#include "foundation/Qt3DSMat44.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+
+#pragma warning(disable : 4189)
+#pragma warning(disable : 4100)
+
+namespace {
+
+struct ShaderArguments
+{
+ QT3DSMat44 mMatrix;
+};
+
+class SpinningCube : public NVRenderExample
+{
+ NVRenderContext &m_Context;
+ NVScopedRefCounted<NVRenderVertexBuffer> mVertexBuffer;
+ NVScopedRefCounted<NVRenderIndexBuffer> mIndexBuffer;
+ NVScopedRefCounted<NVRenderVertFragShader> mShader;
+ NVRenderHandle mShaderArgGroupId;
+ float frus[16];
+ float model[16];
+ float rot[9];
+
+public:
+ SpinningCube(NVRenderContext &ctx)
+ : m_Context(ctx)
+ {
+ NVRenderExampleTools::createBox(ctx, mVertexBuffer.mPtr, mIndexBuffer.mPtr, false);
+ mVertexBuffer->addRef();
+ mIndexBuffer->addRef();
+ mShader = NVRenderExampleTools::createSimpleShader(ctx);
+ ctx.SetViewport(NVRenderRect(0, 0, 400, 400));
+ // These properties will get applied just before render no matter what
+ // so we can just use the default settings here.
+ ctx.SetVertexBuffer(mVertexBuffer);
+ ctx.SetIndexBuffer(mIndexBuffer);
+ if (mShader) {
+ ctx.SetActiveShader(mShader);
+ }
+ ctx.SetDepthTestEnabled(true);
+ ctx.SetDepthWriteEnabled(true);
+ NvGl2DemoMatrixIdentity(model);
+ NvGl2DemoMatrixIdentity(frus);
+ NvGl2DemoMatrixFrustum(frus, -1, 1, -1, 1, 1, 10);
+ NvGl2DemoMatrixTranslate(model, 0, 0, -4);
+ }
+ virtual void drawFrame(double currentSeconds)
+ {
+ NvGl2DemoMatrixRotate_create3x3(rot, (float)currentSeconds * 50, .707f, .707f, 0);
+ float mvp[16];
+ NvGl2DemoMatrixIdentity(mvp);
+ NvGl2DemoMatrixMultiply(mvp, frus);
+ NvGl2DemoMatrixMultiply(mvp, model);
+ NvGl2DemoMatrixMultiply_4x4_3x3(mvp, rot);
+
+ NVConstDataRef<QT3DSU8> instance((QT3DSU8 *)mvp, 16 * sizeof(float));
+ m_Context.Clear(
+ NVRenderClearFlags(NVRenderClearValues::Color | NVRenderClearValues::Depth));
+ mShader->SetPropertyValue("mat_mvp", *reinterpret_cast<QT3DSMat44 *>(mvp));
+ m_Context.Draw(NVRenderDrawMode::Triangles, mIndexBuffer->GetNumIndices(), 0);
+ }
+ virtual QT3DSU32 getRuntimeInSeconds() { return mShader.mPtr ? 5 : 0; }
+ virtual void release() { NVDelete(m_Context.GetFoundation(), this); }
+};
+}
+QT3DS_RENDER_REGISTER_EXAMPLE(SpinningCube); \ No newline at end of file
diff --git a/src/render/Qt3DSRenderAtomicCounterBuffer.cpp b/src/render/Qt3DSRenderAtomicCounterBuffer.cpp
new file mode 100644
index 0000000..272c3e8
--- /dev/null
+++ b/src/render/Qt3DSRenderAtomicCounterBuffer.cpp
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderAtomicCounterBuffer.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+namespace qt3ds {
+namespace render {
+
+ ///< struct handling a constant buffer entry
+ class AtomicCounterBufferEntry
+ {
+ public:
+ CRegisteredString m_Name; ///< parameter Name
+ QT3DSI32 m_Offset; ///< offset into the memory buffer
+
+ AtomicCounterBufferEntry(CRegisteredString name, QT3DSI32 offset)
+ : m_Name(name)
+ , m_Offset(offset)
+ {
+ }
+ };
+
+ NVRenderAtomicCounterBuffer::NVRenderAtomicCounterBuffer(
+ NVRenderContextImpl &context, CRegisteredString bufferName, size_t size,
+ NVRenderBufferUsageType::Enum usageType, NVDataRef<QT3DSU8> data)
+ : NVRenderDataBuffer(context, context.GetFoundation(), size,
+ NVRenderBufferBindValues::Storage, usageType, data)
+ , m_Name(bufferName)
+ , m_AtomicCounterBufferEntryMap(
+ m_Foundation.getAllocator(),
+ "NVRenderAtomicCounterBuffer::m_AtomicCounterBufferEntryMap")
+ , m_Dirty(true)
+ {
+ QT3DS_ASSERT(context.IsStorageBufferSupported());
+ }
+
+ NVRenderAtomicCounterBuffer::~NVRenderAtomicCounterBuffer()
+ {
+ for (TRenderAtomiCounterBufferEntryMap::iterator
+ iter = m_AtomicCounterBufferEntryMap.begin(),
+ end = m_AtomicCounterBufferEntryMap.end();
+ iter != end; ++iter) {
+ NVDelete(m_Foundation.getAllocator(), iter->second);
+ }
+
+ m_AtomicCounterBufferEntryMap.clear();
+
+ m_Context.BufferDestroyed(*this);
+ }
+
+ void NVRenderAtomicCounterBuffer::Bind()
+ {
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to Bind a locked buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ m_Backend->BindBuffer(m_BufferHandle, m_BindFlags);
+ }
+
+ void NVRenderAtomicCounterBuffer::BindToShaderProgram(QT3DSU32 index)
+ {
+ m_Backend->ProgramSetAtomicCounterBuffer(index, m_BufferHandle);
+ }
+
+ void NVRenderAtomicCounterBuffer::Update()
+ {
+ // we only update the buffer if it is dirty and we actually have some data
+ if (m_Dirty && m_BufferData.size()) {
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, m_BufferData.size(), m_UsageType,
+ m_BufferData.begin());
+ m_Dirty = false;
+ }
+ }
+
+ void NVRenderAtomicCounterBuffer::UpdateData(QT3DSI32 offset, NVDataRef<QT3DSU8> data)
+ {
+ // we only update the buffer if we something
+ if (data.size())
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, data.size(), m_UsageType,
+ data.begin() + offset);
+ }
+
+ void NVRenderAtomicCounterBuffer::AddParam(CRegisteredString name, QT3DSU32 offset)
+ {
+ if (m_AtomicCounterBufferEntryMap.find(name) == m_AtomicCounterBufferEntryMap.end()) {
+ AtomicCounterBufferEntry *newEntry =
+ QT3DS_NEW(m_Foundation.getAllocator(), AtomicCounterBufferEntry)(name, offset);
+
+ if (newEntry)
+ m_AtomicCounterBufferEntryMap.insert(eastl::make_pair(name, newEntry));
+ } else {
+ // no duplicated entries
+ return;
+ }
+ }
+
+ bool NVRenderAtomicCounterBuffer::ContainsParam(CRegisteredString name)
+ {
+ if (m_AtomicCounterBufferEntryMap.find(name) != m_AtomicCounterBufferEntryMap.end())
+ return true;
+ else
+ return false;
+ }
+
+ NVRenderAtomicCounterBuffer *
+ NVRenderAtomicCounterBuffer::Create(NVRenderContextImpl &context, const char *bufferName,
+ NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVFoundationBase &fnd(context.GetFoundation());
+ NVRenderAtomicCounterBuffer *retval = NULL;
+
+ if (context.IsAtomicCounterBufferSupported()) {
+ CRegisteredString theBufferName(context.GetStringTable().RegisterStr(bufferName));
+ QT3DSU32 bufSize = sizeof(NVRenderAtomicCounterBuffer);
+ QT3DSU8 *newMem = (QT3DSU8 *)QT3DS_ALLOC(fnd.getAllocator(), bufSize, "AtomicCounterBuffer");
+ retval = new (newMem) NVRenderAtomicCounterBuffer(
+ context, theBufferName, size, usageType,
+ toDataRef(const_cast<QT3DSU8 *>(bufferData.begin()), bufferData.size()));
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderAtomicCounterBuffer.h b/src/render/Qt3DSRenderAtomicCounterBuffer.h
new file mode 100644
index 0000000..5ff449e
--- /dev/null
+++ b/src/render/Qt3DSRenderAtomicCounterBuffer.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_ATOMIC_COUNTER_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_ATOMIC_COUNTER_BUFFER_H
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Utils.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderDataBuffer.h"
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ // forward declaration
+ class NVRenderContextImpl;
+ class AtomicCounterBufferEntry;
+
+ typedef nvhash_map<CRegisteredString, AtomicCounterBufferEntry *>
+ TRenderAtomiCounterBufferEntryMap;
+
+ ///< Constant (uniform) buffer representation
+ class QT3DS_AUTOTEST_EXPORT NVRenderAtomicCounterBuffer : public NVRenderDataBuffer
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] bufferName Name of the buffer. Must match the name used in programs
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return.
+ */
+ NVRenderAtomicCounterBuffer(NVRenderContextImpl &context, CRegisteredString bufferName,
+ size_t size, NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data);
+
+ ///< destructor
+ virtual ~NVRenderAtomicCounterBuffer();
+
+ /**
+ * @brief bind the buffer bypasses the context state
+ *
+ * @return no return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief bind the buffer to a shader program
+ *
+ * @param[in] index Index of the constant buffer within the program
+ *
+ * @return no return.
+ */
+ virtual void BindToShaderProgram(QT3DSU32 index);
+
+ /**
+ * @brief update the buffer to hardware
+ *
+ * @return no return.
+ */
+ virtual void Update();
+
+ /**
+ * @brief update a piece of memory directly within the storage buffer
+ *
+ * Note: When you use this function you should know what you are doing.
+ * The memory layout within C++ must exactly match the memory layout in the
+ *shader.
+ * We use std140 (430) layout which guarantees a specific layout behavior across
+ *all HW vendors.
+ * How the memory layout is computed can be found in the GL spec.
+ *
+ * @param[in] offset offset into storage buffer
+ * @param[in] data pointer to data
+ *
+ * @return no return
+ */
+ void UpdateData(QT3DSI32 offset, NVDataRef<QT3DSU8> data);
+
+ /**
+ * @brief add a parameter to the atomic counter buffer
+ *
+ * @param[in] name Name of the parameter (must match the name in the shader
+ * program)
+ * @param[in] offset Offset in bytes into the buffer
+ *
+ * @return no return
+ */
+ void AddParam(CRegisteredString name, QT3DSU32 offset);
+
+ /**
+ * @brief Check if the buffer contains this param
+ *
+ * @param[in] name Name of the parameter (must match the name in the shader
+ * program)
+ *
+ * @return no return
+ */
+ bool ContainsParam(CRegisteredString name);
+
+ /**
+ * @brief get the buffer name
+ *
+ * @return the buffer name
+ */
+ CRegisteredString GetBufferName() const { return m_Name; }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendBufferObject GetBuffertHandle() const override
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_BufferHandle);
+ }
+
+ /**
+ * @brief create a NVRenderAtomicCounterBuffer object
+ *
+ * @param[in] context Pointer to context
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return the buffer object or NULL
+ */
+ static NVRenderAtomicCounterBuffer *Create(NVRenderContextImpl &context,
+ const char *bufferName,
+ NVRenderBufferUsageType::Enum usageType,
+ size_t size, NVConstDataRef<QT3DSU8> bufferData);
+
+ private:
+ CRegisteredString m_Name; ///< buffer name
+ TRenderAtomiCounterBufferEntryMap
+ m_AtomicCounterBufferEntryMap; ///< holds the entries of a atomic counter buffer
+ bool m_Dirty; ///< true if buffer is dirty
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderAttribLayout.cpp b/src/render/Qt3DSRenderAttribLayout.cpp
new file mode 100644
index 0000000..42641a0
--- /dev/null
+++ b/src/render/Qt3DSRenderAttribLayout.cpp
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderAttribLayout.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ ///< constructor
+ NVRenderAttribLayout::NVRenderAttribLayout(NVRenderContextImpl &context,
+ NVConstDataRef<NVRenderVertexBufferEntry> attribs)
+ : m_Context(context)
+ , m_Foundation(context.GetFoundation())
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ {
+ m_AttribLayoutHandle = m_Backend->CreateAttribLayout(attribs);
+ QT3DS_ASSERT(m_AttribLayoutHandle);
+ }
+
+ ///< destructor
+ NVRenderAttribLayout::~NVRenderAttribLayout()
+ {
+ if (m_AttribLayoutHandle) {
+ m_Backend->ReleaseAttribLayout(m_AttribLayoutHandle);
+ }
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderAttribLayout.h b/src/render/Qt3DSRenderAttribLayout.h
new file mode 100644
index 0000000..da801c8
--- /dev/null
+++ b/src/render/Qt3DSRenderAttribLayout.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_ATTRIB_LAYOUT_H
+#define QT3DS_RENDER_ATTRIB_LAYOUT_H
+
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Utils.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ // forward declarations
+ class NVRenderContextImpl;
+ class NVRenderBackend;
+
+ ///< this class handles the vertex attribute layout setup
+ class NVRenderAttribLayout : public NVRefCounted
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] attribs Pointer to attribute list
+ *
+ * @return No return.
+ */
+ NVRenderAttribLayout(NVRenderContextImpl &context,
+ NVConstDataRef<NVRenderVertexBufferEntry> attribs);
+ ///< destructor
+ ~NVRenderAttribLayout();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendAttribLayoutObject GetAttribLayoutHandle() const
+ {
+ return m_AttribLayoutHandle;
+ }
+
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+
+ NVRenderBackend::NVRenderBackendAttribLayoutObject
+ m_AttribLayoutHandle; ///< opaque backend handle
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderBaseTypes.cpp b/src/render/Qt3DSRenderBaseTypes.cpp
new file mode 100644
index 0000000..e881d27
--- /dev/null
+++ b/src/render/Qt3DSRenderBaseTypes.cpp
@@ -0,0 +1,1049 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qdebug.h>
+
+#include "Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+using namespace foundation;
+
+QDebug operator<<(QDebug debug, const NVRenderComponentTypes::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderComponentTypes::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderContextValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderContextValues::Enum::GLES2:
+ debug.nospace() << "GLES2";
+ break;
+ case NVRenderContextValues::Enum::GL2:
+ debug.nospace() << "GL2";
+ break;
+ case NVRenderContextValues::Enum::GLES3:
+ debug.nospace() << "GLES3";
+ break;
+ case NVRenderContextValues::Enum::GL3:
+ debug.nospace() << "GL3";
+ break;
+ case NVRenderContextValues::Enum::GLES3PLUS:
+ debug.nospace() << "GLES3PLUS";
+ break;
+ case NVRenderContextValues::Enum::GL4:
+ debug.nospace() << "GL4";
+ break;
+ case NVRenderContextValues::Enum::NullContext:
+ debug.nospace() << "NullContext";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderClearValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderClearValues::Enum::Color:
+ debug.nospace() << "Color";
+ break;
+ case NVRenderClearValues::Enum::Depth:
+ debug.nospace() << "Depth";
+ break;
+ case NVRenderClearValues::Enum::Stencil:
+ debug.nospace() << "Stencil";
+ break;
+ case NVRenderClearValues::Enum::Coverage:
+ debug.nospace() << "Coverage";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderQueryType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderQueryType::Enum::Samples:
+ debug.nospace() << "Samples";
+ break;
+ case NVRenderQueryType::Enum::Timer:
+ debug.nospace() << "Timer";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderQueryResultType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderQueryResultType::Enum::ResultAvailable:
+ debug.nospace() << "ResultAvailable";
+ break;
+ case NVRenderQueryResultType::Enum::Result:
+ debug.nospace() << "Result";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderSyncType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderSyncType::Enum::GpuCommandsComplete:
+ debug.nospace() << "GpuCommandsComplete";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderSyncValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "Unknown";
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderCommandFlushValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderCommandFlushValues::Enum::SyncFlushCommands:
+ debug.nospace() << "SyncFlushCommands";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBufferBindValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderBufferBindValues::Enum::Vertex:
+ debug.nospace() << "Vertex";
+ break;
+ case NVRenderBufferBindValues::Enum::Index:
+ debug.nospace() << "Index";
+ break;
+ case NVRenderBufferBindValues::Enum::Constant:
+ debug.nospace() << "Constant";
+ break;
+ case NVRenderBufferBindValues::Enum::Storage:
+ debug.nospace() << "Storage";
+ break;
+ case NVRenderBufferBindValues::Enum::Atomic_Counter:
+ debug.nospace() << "Atomic_Counter";
+ break;
+ case NVRenderBufferBindValues::Enum::Draw_Indirect:
+ debug.nospace() << "Draw_Indirect";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBufferUsageType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderBufferUsageType::Enum::Static:
+ debug.nospace() << "Static";
+ break;
+ case NVRenderBufferUsageType::Enum::Dynamic:
+ debug.nospace() << "Dynamic";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderImageAccessType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderImageAccessType::Enum::Read:
+ debug.nospace() << "Read";
+ break;
+ case NVRenderImageAccessType::Enum::Write:
+ debug.nospace() << "Write";
+ break;
+ case NVRenderImageAccessType::Enum::ReadWrite:
+ debug.nospace() << "ReadWrite";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBufferAccessTypeValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderBufferAccessTypeValues::Enum::Read:
+ debug.nospace() << "Read";
+ break;
+ case NVRenderBufferAccessTypeValues::Enum::Write:
+ debug.nospace() << "Write";
+ break;
+ case NVRenderBufferAccessTypeValues::Enum::Invalid:
+ debug.nospace() << "Invalid";
+ break;
+ case NVRenderBufferAccessTypeValues::Enum::InvalidRange:
+ debug.nospace() << "InvalidRange";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBufferBarrierValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderBufferBarrierValues::Enum::VertexAttribArray:
+ debug.nospace() << "VertexAttribArray";
+ break;
+ case NVRenderBufferBarrierValues::Enum::ElementArray:
+ debug.nospace() << "ElementArray";
+ break;
+ case NVRenderBufferBarrierValues::Enum::UniformBuffer:
+ debug.nospace() << "UniformBuffer";
+ break;
+ case NVRenderBufferBarrierValues::Enum::TextureFetch:
+ debug.nospace() << "TextureFetch";
+ break;
+ case NVRenderBufferBarrierValues::Enum::ShaderImageAccess:
+ debug.nospace() << "ShaderImageAccess";
+ break;
+ case NVRenderBufferBarrierValues::Enum::CommandBuffer:
+ debug.nospace() << "CommandBuffer";
+ break;
+ case NVRenderBufferBarrierValues::Enum::PixelBuffer:
+ debug.nospace() << "PixelBuffer";
+ break;
+ case NVRenderBufferBarrierValues::Enum::TextureUpdate:
+ debug.nospace() << "TextureUpdate";
+ break;
+ case NVRenderBufferBarrierValues::Enum::BufferUpdate:
+ debug.nospace() << "BufferUpdate";
+ break;
+ case NVRenderBufferBarrierValues::Enum::Framebuffer:
+ debug.nospace() << "Framebuffer";
+ break;
+ case NVRenderBufferBarrierValues::Enum::TransformFeedback:
+ debug.nospace() << "TransformFeedback";
+ break;
+ case NVRenderBufferBarrierValues::Enum::AtomicCounter:
+ debug.nospace() << "AtomicCounter";
+ break;
+ case NVRenderBufferBarrierValues::Enum::ShaderStorage:
+ debug.nospace() << "ShaderStorage";
+ break;
+ case NVRenderBufferBarrierValues::Enum::All:
+ debug.nospace() << "All";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderRenderBufferFormats::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderRenderBufferFormats::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureFormats::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderTextureFormats::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureTargetType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderTextureTargetType::Enum::Texture2D:
+ debug.nospace() << "Texture2D";
+ break;
+ case NVRenderTextureTargetType::Enum::Texture2D_MS:
+ debug.nospace() << "Texture2D_MS";
+ break;
+ case NVRenderTextureTargetType::Enum::Texture2D_Array:
+ debug.nospace() << "Texture2D_Array";
+ break;
+ case NVRenderTextureTargetType::Enum::TextureCube:
+ debug.nospace() << "TextureCube";
+ break;
+ case NVRenderTextureTargetType::Enum::TextureCubePosX:
+ debug.nospace() << "TextureCubePosX";
+ break;
+ case NVRenderTextureTargetType::Enum::TextureCubeNegX:
+ debug.nospace() << "TextureCubeNegX";
+ break;
+ case NVRenderTextureTargetType::Enum::TextureCubePosY:
+ debug.nospace() << "TextureCubePosY";
+ break;
+ case NVRenderTextureTargetType::Enum::TextureCubeNegY:
+ debug.nospace() << "TextureCubeNegY";
+ break;
+ case NVRenderTextureTargetType::Enum::TextureCubePosZ:
+ debug.nospace() << "TextureCubePosZ";
+ break;
+ case NVRenderTextureTargetType::Enum::TextureCubeNegZ:
+ debug.nospace() << "TextureCubeNegZ";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureUnit::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ if (value > NVRenderTextureUnit::Enum::TextureUnit_31)
+ debug.nospace() << "Unknown";
+ else
+ debug.nospace() << "TextureUnit_" << value;
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureCompareMode::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderTextureCompareMode::Enum::NoCompare:
+ debug.nospace() << "NoCompare";
+ break;
+ case NVRenderTextureCompareMode::Enum::CompareToRef:
+ debug.nospace() << "CompareToRef";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureSwizzleMode::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderTextureSwizzleMode::Enum::NoSwizzle:
+ debug.nospace() << "NoSwizzle";
+ break;
+ case NVRenderTextureSwizzleMode::Enum::L8toR8:
+ debug.nospace() << "L8toR8";
+ break;
+ case NVRenderTextureSwizzleMode::Enum::A8toR8:
+ debug.nospace() << "A8toR8";
+ break;
+ case NVRenderTextureSwizzleMode::Enum::L8A8toRG8:
+ debug.nospace() << "L8A8toRG8";
+ break;
+ case NVRenderTextureSwizzleMode::Enum::L16toR16:
+ debug.nospace() << "L16toR16";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureCompareOp::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_BOOL_OP(x) \
+ case NVRenderTextureCompareOp::Enum::x: \
+ debug.nospace() << #x; \
+ break;
+ QT3DS_RENDER_ITERATE_BOOL_OP
+ #undef QT3DS_RENDER_HANDLE_BOOL_OP
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureMinifyingOp::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderTextureMinifyingOp::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureMagnifyingOp::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderTextureMagnifyingOp::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureCoordOp::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderTextureCoordOp::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderHint::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderHint::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderVertexBufferEntry value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderVertexBufferEntry(name:" << value.m_Name
+ << ",componentType:" << value.m_ComponentType
+ << ",numComponents" << value.m_NumComponents
+ << ",firstItemOffset" << value.m_FirstItemOffset
+ << ",inputSlot" << value.m_InputSlot;
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderVertFragCompilationResult value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderVertFragCompilationResult(ShaderName:" << value.mShaderName
+ << ",Shader:" << value.mShader;
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderDrawMode::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderDrawMode::Enum::Points:
+ debug.nospace() << "Points";
+ break;
+ case NVRenderDrawMode::Enum::LineStrip:
+ debug.nospace() << "LineStrip";
+ break;
+ case NVRenderDrawMode::Enum::LineLoop:
+ debug.nospace() << "LineLoop";
+ break;
+ case NVRenderDrawMode::Enum::Lines:
+ debug.nospace() << "Lines";
+ break;
+ case NVRenderDrawMode::Enum::TriangleStrip:
+ debug.nospace() << "TriangleStrip";
+ break;
+ case NVRenderDrawMode::Enum::TriangleFan:
+ debug.nospace() << "TriangleFan";
+ break;
+ case NVRenderDrawMode::Enum::Triangles:
+ debug.nospace() << "Triangles";
+ break;
+ case NVRenderDrawMode::Enum::Patches:
+ debug.nospace() << "Patches";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureCubeFaces::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderTextureCubeFaces::Enum::InvalidFace:
+ debug.nospace() << "InvalidFace";
+ break;
+ case NVRenderTextureCubeFaces::Enum::CubePosX:
+ debug.nospace() << "CubePosX";
+ break;
+ case NVRenderTextureCubeFaces::Enum::CubeNegX:
+ debug.nospace() << "CubeNegX";
+ break;
+ case NVRenderTextureCubeFaces::Enum::CubePosY:
+ debug.nospace() << "CubePosY";
+ break;
+ case NVRenderTextureCubeFaces::Enum::CubeNegY:
+ debug.nospace() << "CubeNegY";
+ break;
+ case NVRenderTextureCubeFaces::Enum::CubePosZ:
+ debug.nospace() << "CubePosZ";
+ break;
+ case NVRenderTextureCubeFaces::Enum::CubeNegZ:
+ debug.nospace() << "CubeNegZ";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathCommands::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathCommands::Enum::Close:
+ debug.nospace() << "Close";
+ break;
+ case NVRenderPathCommands::Enum::MoveTo:
+ debug.nospace() << "MoveTo";
+ break;
+ case NVRenderPathCommands::Enum::CubicCurveTo:
+ debug.nospace() << "CubicCurveTo";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathFontTarget::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathFontTarget::Enum::StandardFont:
+ debug.nospace() << "StandardFont";
+ break;
+ case NVRenderPathFontTarget::Enum::SystemFont:
+ debug.nospace() << "SystemFont";
+ break;
+ case NVRenderPathFontTarget::Enum::FileFont:
+ debug.nospace() << "FileFont";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathMissingGlyphs::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathMissingGlyphs::Enum::SkipMissing:
+ debug.nospace() << "SkipMissing";
+ break;
+ case NVRenderPathMissingGlyphs::Enum::UseMissing:
+ debug.nospace() << "UseMissing";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathFontStyleValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathFontStyleValues::Enum::Bold:
+ debug.nospace() << "Bold";
+ break;
+ case NVRenderPathFontStyleValues::Enum::Italic:
+ debug.nospace() << "Italic";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathReturnValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathReturnValues::Enum::FontGlypsAvailable:
+ debug.nospace() << "FontGlypsAvailable";
+ break;
+ case NVRenderPathReturnValues::Enum::FontTargetUnavailable:
+ debug.nospace() << "FontTargetUnavailable";
+ break;
+ case NVRenderPathReturnValues::Enum::FontUnavailable:
+ debug.nospace() << "FontUnavailable";
+ break;
+ case NVRenderPathReturnValues::Enum::FontUnintelligible:
+ debug.nospace() << "FontUnintelligible";
+ break;
+ case NVRenderPathReturnValues::Enum::InvalidEnum:
+ debug.nospace() << "InvalidEnum";
+ break;
+ case NVRenderPathReturnValues::Enum::OutOfMemory:
+ debug.nospace() << "OutOfMemory";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathFormatType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathFormatType::Enum::Byte:
+ debug.nospace() << "Byte";
+ break;
+ case NVRenderPathFormatType::Enum::UByte:
+ debug.nospace() << "UByte";
+ break;
+ case NVRenderPathFormatType::Enum::Short:
+ debug.nospace() << "Short";
+ break;
+ case NVRenderPathFormatType::Enum::UShort:
+ debug.nospace() << "UShort";
+ break;
+ case NVRenderPathFormatType::Enum::Int:
+ debug.nospace() << "Int";
+ break;
+ case NVRenderPathFormatType::Enum::Uint:
+ debug.nospace() << "Uint";
+ break;
+ case NVRenderPathFormatType::Enum::Float:
+ debug.nospace() << "Float";
+ break;
+ case NVRenderPathFormatType::Enum::Utf8:
+ debug.nospace() << "Utf8";
+ break;
+ case NVRenderPathFormatType::Enum::Utf16:
+ debug.nospace() << "Utf16";
+ break;
+ case NVRenderPathFormatType::Enum::Bytes2:
+ debug.nospace() << "Bytes2";
+ break;
+ case NVRenderPathFormatType::Enum::Bytes3:
+ debug.nospace() << "Bytes3";
+ break;
+ case NVRenderPathFormatType::Enum::Bytes4:
+ debug.nospace() << "Bytes4";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathGlyphFontMetricValues::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphWidth:
+ debug.nospace() << "GlyphWidth";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphHeight:
+ debug.nospace() << "GlyphHeight";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphHorizontalBearingX:
+ debug.nospace() << "GlyphHorizontalBearingX";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphHorizontalBearingY:
+ debug.nospace() << "GlyphHorizontalBearingY";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphHorizontalBearingAdvance:
+ debug.nospace() << "GlyphHorizontalBearingAdvance";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphVerticalBearingX:
+ debug.nospace() << "GlyphVerticalBearingX";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphVerticalBearingY:
+ debug.nospace() << "GlyphVerticalBearingY";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphVerticalBearingAdvance:
+ debug.nospace() << "GlyphVerticalBearingAdvance";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::GlyphHasKerning:
+ debug.nospace() << "GlyphHasKerning";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontXMinBounds:
+ debug.nospace() << "FontXMinBounds";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontYMinBounds:
+ debug.nospace() << "FontYMinBounds";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontXMaxBounds:
+ debug.nospace() << "FontXMaxBounds";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontYMaxBounds:
+ debug.nospace() << "FontYMaxBounds";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontUnitsPerEm:
+ debug.nospace() << "FontUnitsPerEm";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontAscender:
+ debug.nospace() << "FontAscender";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontDescender:
+ debug.nospace() << "FontDescender";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontHeight:
+ debug.nospace() << "FontHeight";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontMaxAdvanceWidth:
+ debug.nospace() << "FontMaxAdvanceWidth";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontMaxAdvanceHeight:
+ debug.nospace() << "FontMaxAdvanceHeight";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontUnderlinePosition:
+ debug.nospace() << "FontUnderlinePosition";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontUnderlineThickness:
+ debug.nospace() << "FontUnderlineThickness";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontHasKerning:
+ debug.nospace() << "FontHasKerning";
+ break;
+ case NVRenderPathGlyphFontMetricValues::Enum::FontNumGlyphIndices:
+ debug.nospace() << "FontNumGlyphIndices";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathListMode::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathListMode::Enum::AccumAdjacentPairs:
+ debug.nospace() << "AccumAdjacentPairs";
+ break;
+ case NVRenderPathListMode::Enum::AdjacentPairs:
+ debug.nospace() << "AdjacentPairs";
+ break;
+ case NVRenderPathListMode::Enum::FirstToRest:
+ debug.nospace() << "FirstToRest";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathFillMode::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathFillMode::Enum::Fill:
+ debug.nospace() << "Fill";
+ break;
+ case NVRenderPathFillMode::Enum::CountUp:
+ debug.nospace() << "CountUp";
+ break;
+ case NVRenderPathFillMode::Enum::CountDown:
+ debug.nospace() << "CountDown";
+ break;
+ case NVRenderPathFillMode::Enum::Invert:
+ debug.nospace() << "Invert";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathCoverMode::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathCoverMode::Enum::ConvexHull:
+ debug.nospace() << "ConvexHull";
+ break;
+ case NVRenderPathCoverMode::Enum::BoundingBox:
+ debug.nospace() << "BoundingBox";
+ break;
+ case NVRenderPathCoverMode::Enum::BoundingBoxOfBoundingBox:
+ debug.nospace() << "BoundingBoxOfBoundingBox";
+ break;
+ case NVRenderPathCoverMode::Enum::PathFillCover:
+ debug.nospace() << "PathFillCover";
+ break;
+ case NVRenderPathCoverMode::Enum::PathStrokeCover:
+ debug.nospace() << "PathStrokeCover";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderPathTransformType::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderPathTransformType::Enum::NoTransform:
+ debug.nospace() << "NoTransform";
+ break;
+ case NVRenderPathTransformType::Enum::TranslateX:
+ debug.nospace() << "TranslateX";
+ break;
+ case NVRenderPathTransformType::Enum::TranslateY:
+ debug.nospace() << "TranslateY";
+ break;
+ case NVRenderPathTransformType::Enum::Translate2D:
+ debug.nospace() << "Translate2D";
+ break;
+ case NVRenderPathTransformType::Enum::Translate3D:
+ debug.nospace() << "Translate3D";
+ break;
+ case NVRenderPathTransformType::Enum::Affine2D:
+ debug.nospace() << "Affine2D";
+ break;
+ case NVRenderPathTransformType::Enum::Affine3D:
+ debug.nospace() << "Affine3D";
+ break;
+ case NVRenderPathTransformType::Enum::TransposeAffine2D:
+ debug.nospace() << "TransposeAffine2D";
+ break;
+ case NVRenderPathTransformType::Enum::TransposeAffine3D:
+ debug.nospace() << "TransposeAffine3D";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderWinding::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderWinding::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderState::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderState::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderSrcBlendFunc::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderSrcBlendFunc::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderDstBlendFunc::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderDstBlendFunc::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBlendEquation::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderBlendEquation::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderFaces::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderFaces::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVReadFaces::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVReadFaces::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBoolOp::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderBoolOp::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderStencilOp::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderStencilOp::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBlendFunctionArgument &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderBlendFunctionArgument(SrcRGB:" << value.m_SrcRGB
+ << ", DstRGB:" << value.m_DstRGB
+ << ", SrcAlpha:" << value.m_SrcAlpha
+ << ", DstAlpha:" << value.m_DstAlpha
+ << ')';
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderBlendEquationArgument &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderBlendEquationArgument(RGBEquation:" << value.m_RGBEquation
+ << ", AlphaEquation:" << value.m_AlphaEquation
+ << ')';
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderStencilOperationArgument &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderStencilOperationArgument(StencilFail:" << value.m_StencilFail
+ << ", DepthFail:" << value.m_DepthFail
+ << ", DepthPass:" << value.m_DepthPass
+ << ')';
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderStencilFunctionArgument &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderStencilFunctionArgument(Function:" << value.m_Function
+ << ", ReferenceValue:" << value.m_ReferenceValue
+ << ", Mask:" << value.m_Mask
+ << ')';
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderRect &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderRect(x:" << value.m_X
+ << ", y:" << value.m_Y
+ << ", width:" << value.m_Width
+ << ", height:" << value.m_Height
+ << ')';
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderRectF &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "NVRenderRectF(x:" << value.m_X
+ << ", y:" << value.m_Y
+ << ", width:" << value.m_Width
+ << ", height:" << value.m_Height
+ << ')';
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderShaderDataTypes::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(x) \
+ case NVRenderShaderDataTypes::Enum::x: \
+ debug.nospace() << #x; \
+ break;
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+ #undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderShaderTypeValue::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+ case NVRenderShaderTypeValue::Enum::Vertex:
+ debug.nospace() << "Vertex";
+ break;
+ case NVRenderShaderTypeValue::Enum::Fragment:
+ debug.nospace() << "Fragment";
+ break;
+ case NVRenderShaderTypeValue::Enum::TessControl:
+ debug.nospace() << "TessControl";
+ break;
+ case NVRenderShaderTypeValue::Enum::TessEvaluation:
+ debug.nospace() << "TessEvaluation";
+ break;
+ case NVRenderShaderTypeValue::Enum::Geometry:
+ debug.nospace() << "Geometry";
+ break;
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderTextureTypeValue::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << NVRenderTextureTypeValue::toString(value);
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const NVRenderReadPixelFormats::Enum value)
+{
+ QDebugStateSaver saver(debug);
+ switch (value) {
+#define HANDLE_QT3DS_READ_PIXEL_FORMAT(x) \
+ case NVRenderReadPixelFormats::Enum::x: \
+ debug.nospace() << #x; \
+ break;
+ ITERATE_QT3DS_READ_PIXEL_FORMATS
+ #undef HANDLE_QT3DS_READ_PIXEL_FORMAT
+ default:
+ debug.nospace() << "Unknown";
+ }
+ return debug;
+}
+}
+}
diff --git a/src/render/Qt3DSRenderBaseTypes.h b/src/render/Qt3DSRenderBaseTypes.h
new file mode 100644
index 0000000..fa5e6fc
--- /dev/null
+++ b/src/render/Qt3DSRenderBaseTypes.h
@@ -0,0 +1,2103 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_TYPES_H
+#define QT3DS_RENDER_QT3DS_RENDER_TYPES_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSMath.h"
+#include "foundation/Qt3DSVec2.h"
+
+namespace qt3ds {
+
+namespace render {
+using namespace foundation;
+
+#define QT3DS_RENDER_ITERATE_COMPONENT_TYPES \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSU8) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSI8) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSU16) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSI16) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSU32) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSI32) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSU64) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSI64) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSF16) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSF32) \
+ QT3DS_RENDER_HANDLE_COMPONENT_TYPE(QT3DSF64)
+
+struct NVRenderComponentTypes
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_COMPONENT_TYPE(x) x,
+ QT3DS_RENDER_ITERATE_COMPONENT_TYPES
+#undef QT3DS_RENDER_HANDLE_COMPONENT_TYPE
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_COMPONENT_TYPE(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_COMPONENT_TYPES
+ #undef QT3DS_RENDER_HANDLE_COMPONENT_TYPE
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+
+ static qt3ds::QT3DSU32 getSizeofType(Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_COMPONENT_TYPE(x) \
+ case x: \
+ return sizeof(qt3ds::x);
+ QT3DS_RENDER_ITERATE_COMPONENT_TYPES
+ #undef QT3DS_RENDER_HANDLE_COMPONENT_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+};
+
+/**
+ Define a set of compile-time trait classes that map the enumerations
+ to actual compile time types and sizeof so we can deal with the enumeration
+ in generic ways.
+ */
+template <NVRenderComponentTypes::Enum TraitType>
+struct NVRenderComponentTraits
+{
+ bool force_compile_error;
+};
+
+/**
+ Define a compile time mapping from datatype to enumeration. Not that if you
+ use this with a type that isn't a component type you will get a compilation
+ error.
+ */
+template <typename TDataType>
+struct NVRenderComponentTypeToTypeMap
+{
+ bool force_compile_error;
+};
+
+#define QT3DS_RENDER_HANDLE_COMPONENT_TYPE(x) \
+ template <> \
+ struct NVRenderComponentTraits<NVRenderComponentTypes::x> \
+{ \
+ typedef x TComponentType; \
+ QT3DSU8 mComponentSize; \
+ NVRenderComponentTraits<NVRenderComponentTypes::x>() \
+ : mComponentSize(sizeof(x)) \
+{ \
+} \
+}; \
+ template <> \
+ struct NVRenderComponentTypeToTypeMap<x> \
+{ \
+ NVRenderComponentTypes::Enum m_ComponentType; \
+ NVRenderComponentTypeToTypeMap<x>() \
+ : m_ComponentType(NVRenderComponentTypes::x) \
+{ \
+} \
+};
+
+QT3DS_RENDER_ITERATE_COMPONENT_TYPES;
+
+#undef QT3DS_RENDER_HANDLE_COMPONENT_TYPE
+
+// Map at compile time from component type to datatype;
+template <typename TDataType>
+inline NVRenderComponentTypes::Enum getComponentTypeForType()
+{
+ return NVRenderComponentTypeToTypeMap<TDataType>().m_ComponentType;
+}
+
+struct NVRenderContextValues
+{
+ enum Enum {
+ GLES2 = 1 << 0,
+ GL2 = 1 << 1,
+ GLES3 = 1 << 2,
+ GL3 = 1 << 3,
+ GLES3PLUS = 1 << 4,
+ GL4 = 1 << 5,
+ NullContext = 1 << 6,
+ };
+};
+
+typedef NVFlags<NVRenderContextValues::Enum, QT3DSU32> NVRenderContextType;
+
+struct NVRenderClearValues
+{
+ enum Enum {
+ Color = 1 << 0,
+ Depth = 1 << 1,
+ Stencil = 1 << 3,
+ Coverage = 1 << 4,
+ };
+};
+
+typedef NVFlags<NVRenderClearValues::Enum, QT3DSU32> NVRenderClearFlags;
+
+struct NVRenderQueryType
+{
+ enum Enum {
+ Unknown = 0,
+ Samples, ///< samples query object
+ Timer, ///< timer query object
+ };
+};
+
+struct NVRenderQueryResultType
+{
+ enum Enum {
+ Unknown = 0,
+ ResultAvailable, ///< Check if query result is available
+ Result, ///< Get actual result
+ };
+};
+
+struct NVRenderSyncType
+{
+ enum Enum {
+ Unknown = 0,
+ GpuCommandsComplete, ///< sync to Gpu commands finished
+ };
+};
+
+struct NVRenderSyncValues
+{
+ enum Enum {
+ Unknown = 0, ///< for future usage
+ };
+};
+
+typedef NVFlags<NVRenderSyncValues::Enum, QT3DSU32> NVRenderSyncFlags;
+
+struct NVRenderCommandFlushValues
+{
+ enum Enum {
+ SyncFlushCommands = 0, ///< sync for flushing command
+ };
+};
+
+typedef NVFlags<NVRenderCommandFlushValues::Enum, QT3DSU32> NVRenderCommandFlushFlags;
+
+struct NVRenderBufferBindValues
+{
+ enum Enum {
+ Unknown = 0,
+ Vertex = 1 << 0, ///< Bind as vertex buffer
+ Index = 1 << 1, ///< Bind as index buffer
+ Constant = 1 << 2, ///< Bind as constant buffer
+ Storage = 1 << 3, ///< Bind as shader storage buffer
+ Atomic_Counter = 1 << 4, ///< Bind as atomic counter buffer
+ Draw_Indirect = 1 << 5, ///< Bind as draw indirect buffer
+ };
+};
+
+typedef NVFlags<NVRenderBufferBindValues::Enum, QT3DSU32> NVRenderBufferBindFlags;
+
+struct NVRenderBufferUsageType
+{
+ enum Enum {
+ Unknown = 0,
+ Static, ///< Rarely updated
+ Dynamic, ///< Most likely updated every frame
+ };
+};
+
+struct NVRenderImageAccessType
+{
+ enum Enum {
+ Unknown = 0,
+ Read, ///< Read only access
+ Write, ///< Write only access
+ ReadWrite, ///< Read and write access
+ };
+};
+
+struct NVRenderBufferAccessTypeValues
+{
+ enum Enum {
+ Unknown = 0,
+ Read = 1 << 0, ///< Read access
+ Write = 1 << 1, ///< Write access
+ Invalid = 1 << 2, ///< No sync
+ InvalidRange = 1 << 3, ///< No sync
+
+ };
+};
+
+typedef NVFlags<NVRenderBufferAccessTypeValues::Enum, QT3DSU32> NVRenderBufferAccessFlags;
+
+///< defines a barrier of ordering the memory transactions to a command relative to those issued
+///before the barrier
+struct NVRenderBufferBarrierValues
+{
+ enum Enum {
+ Unknown = 0,
+ VertexAttribArray = 1 << 0, ///< Barrier for vertex attributes sourced from a buffer
+ ElementArray = 1 << 1, ///< Barrier for indices sourced from a buffer
+ UniformBuffer = 1 << 2, ///< Barrier for shader uniforms sourced from a buffer
+ TextureFetch = 1 << 3, ///< Barrier for texture fetches within shaders
+ ShaderImageAccess = 1 << 4, ///< Barrier for image access using load / store
+ CommandBuffer = 1 << 5, ///< Barrier for indirect drawing
+ PixelBuffer = 1 << 6, ///< Barrier for pixel buffer access
+ TextureUpdate = 1 << 7, ///< Barrier for texture writes
+ BufferUpdate = 1 << 8, ///< Barrier for buffer writes
+ Framebuffer = 1 << 9, ///< Barrier for framebuffer writes
+ TransformFeedback = 1 << 10, ///< Barrier for transform feedback writes
+ AtomicCounter = 1 << 11, ///< Barrier for atomic counter writes
+ ShaderStorage = 1 << 12, ///< Barrier for shader storage blocks writes
+ All = 0xFFFF, ///< Barrier for all of the above
+ };
+};
+
+typedef NVFlags<NVRenderBufferBarrierValues::Enum, QT3DSU32> NVRenderBufferBarrierFlags;
+
+#define QT3DS_RENDER_ITERATE_RENDERBUFFER_FORMATS \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(RGBA4) \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(RGB565) \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(RGBA5551) \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(Depth16) \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(Depth24) \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(Depth32) \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(StencilIndex8) \
+ QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(CoverageNV)
+
+struct NVRenderRenderBufferFormats
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(x) x,
+ QT3DS_RENDER_ITERATE_RENDERBUFFER_FORMATS
+#undef QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_RENDERBUFFER_FORMATS
+ #undef QT3DS_RENDER_HANDLE_RENDERBUFFER_FORMAT
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_TEXTURE_FORMATS \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R16) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R16F) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R32I) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R32UI) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R32F) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RG8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGBA8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGB8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(SRGB8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(SRGB8A8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGB565) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGBA5551) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(Alpha8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(Luminance8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(Luminance16) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(LuminanceAlpha8) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGBA16F) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RG16F) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RG32F) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGB32F) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGBA32F) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(R11G11B10) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(RGB9E5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_DXT1) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB_DXT1) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_DXT3) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_DXT5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB8_ETC1) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB8_ETC2) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_ETC2) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB8_PunchThrough_Alpha1_ETC2) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_PunchThrough_Alpha1_ETC2) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(R11_EAC_UNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(R11_EAC_SNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RG11_EAC_UNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RG11_EAC_SNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA8_ETC2_EAC) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ETC2_EAC) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(R_ATI1N_UNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(R_ATI1N_SNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RG_ATI2N_UNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RG_ATI2N_SNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB_BP_UNSIGNED_FLOAT) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB_BP_SIGNED_FLOAT) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGB_BP_UNorm) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_4x4) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_5x4) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_5x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_6x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_6x6) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_8x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_8x6) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_8x8) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_10x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_10x6) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_10x8) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_10x10) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_12x10) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(RGBA_ASTC_12x12) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_4x4) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_5x4) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_5x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_6x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_6x6) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_8x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_8x6) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_8x8) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_10x5) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_10x6) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_10x8) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_10x10) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_12x10) \
+ QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(SRGB8_Alpha8_ASTC_12x12) \
+ QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(Depth16) \
+ QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(Depth24) \
+ QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(Depth32) \
+ QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(Depth24Stencil8)
+
+struct NVRenderTextureFormats
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(x) x,
+#define QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(x) x,
+#define QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(x) x,
+ QT3DS_RENDER_ITERATE_TEXTURE_FORMATS
+#undef QT3DS_RENDER_HANDLE_TEXTURE_FORMAT
+#undef QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT
+#undef QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT
+ };
+
+ static bool isUncompressedTextureFormat(NVRenderTextureFormats::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(x) \
+ case NVRenderTextureFormats::x: \
+ return true;
+#define QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(x)
+#define QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(x)
+ QT3DS_RENDER_ITERATE_TEXTURE_FORMATS
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_GL_QT3DS_DEPTH_TEXTURE_FORMAT
+ default:
+ break;
+ }
+ return false;
+ }
+
+ static bool isCompressedTextureFormat(NVRenderTextureFormats::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(x)
+#define QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(x) \
+ case NVRenderTextureFormats::x: \
+ return true;
+#define QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(x)
+ QT3DS_RENDER_ITERATE_TEXTURE_FORMATS
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_GL_QT3DS_DEPTH_TEXTURE_FORMAT
+ default:
+ break;
+ }
+ return false;
+ }
+
+ static bool isDepthTextureFormat(NVRenderTextureFormats::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(x)
+#define QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(x)
+#define QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(x) \
+ case NVRenderTextureFormats::x: \
+ return true;
+ QT3DS_RENDER_ITERATE_TEXTURE_FORMATS
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_GL_QT3DS_DEPTH_TEXTURE_FORMAT
+ default:
+ break;
+ }
+ return false;
+ }
+
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_TEXTURE_FORMAT(x) \
+ case x: \
+ return #x;
+#define QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT(x) \
+ case x: \
+ return #x;
+#define QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_TEXTURE_FORMATS
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_COMPRESSED_TEXTURE_FORMAT
+ #undef QT3DS_RENDER_HANDLE_DEPTH_TEXTURE_FORMAT
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+
+ static QT3DSU32 getSizeofFormat(Enum value)
+ {
+ switch (value) {
+ case R8:
+ return 1;
+ case R16F:
+ return 2;
+ case R16:
+ return 2;
+ case R32I:
+ return 4;
+ case R32F:
+ return 4;
+ case RGBA8:
+ return 4;
+ case RGB8:
+ return 3;
+ case RGB565:
+ return 2;
+ case RGBA5551:
+ return 2;
+ case Alpha8:
+ return 1;
+ case Luminance8:
+ return 1;
+ case LuminanceAlpha8:
+ return 1;
+ case Depth16:
+ return 2;
+ case Depth24:
+ return 3;
+ case Depth32:
+ return 4;
+ case Depth24Stencil8:
+ return 4;
+ case RGB9E5:
+ return 4;
+ case SRGB8:
+ return 3;
+ case SRGB8A8:
+ return 4;
+ case RGBA16F:
+ return 8;
+ case RG16F:
+ return 4;
+ case RG32F:
+ return 8;
+ case RGBA32F:
+ return 16;
+ case RGB32F:
+ return 12;
+ case R11G11B10:
+ return 4;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static QT3DSU32 getNumberOfComponent(Enum value)
+ {
+ switch (value) {
+ case R8:
+ return 1;
+ case R16F:
+ return 1;
+ case R16:
+ return 1;
+ case R32I:
+ return 1;
+ case R32F:
+ return 1;
+ case RGBA8:
+ return 4;
+ case RGB8:
+ return 3;
+ case RGB565:
+ return 3;
+ case RGBA5551:
+ return 4;
+ case Alpha8:
+ return 1;
+ case Luminance8:
+ return 1;
+ case LuminanceAlpha8:
+ return 2;
+ case Depth16:
+ return 1;
+ case Depth24:
+ return 1;
+ case Depth32:
+ return 1;
+ case Depth24Stencil8:
+ return 2;
+ case RGB9E5:
+ return 3;
+ case SRGB8:
+ return 3;
+ case SRGB8A8:
+ return 4;
+ case RGBA16F:
+ return 4;
+ case RG16F:
+ return 2;
+ case RG32F:
+ return 2;
+ case RGBA32F:
+ return 4;
+ case RGB32F:
+ return 3;
+ case R11G11B10:
+ return 3;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static void decodeToFloat(void *inPtr, QT3DSU32 byteOfs, float *outPtr,
+ NVRenderTextureFormats::Enum inFmt)
+ {
+ outPtr[0] = 0.0f;
+ outPtr[1] = 0.0f;
+ outPtr[2] = 0.0f;
+ outPtr[3] = 0.0f;
+ QT3DSU8 *src = reinterpret_cast<QT3DSU8 *>(inPtr);
+ // float divisor; // If we want to support RGBD?
+ switch (inFmt) {
+ case Alpha8:
+ outPtr[0] = ((float)src[byteOfs]) / 255.0f;
+ break;
+
+ case Luminance8:
+ case LuminanceAlpha8:
+ case R8:
+ case RG8:
+ case RGB8:
+ case RGBA8:
+ case SRGB8:
+ case SRGB8A8:
+ // NOTE : RGBD Hack here for reference. Not meant for installation.
+ // divisor = (NVRenderTextureFormats::getSizeofFormat(inFmt) == 4) ?
+ // ((float)src[byteOfs+3]) / 255.0f : 1.0f;
+ for (QT3DSU32 i = 0; i < NVRenderTextureFormats::getSizeofFormat(inFmt); ++i) {
+ float val = ((float)src[byteOfs + i]) / 255.0f;
+ outPtr[i] = (i < 3) ? powf(val, 0.4545454545f) : val;
+ // Assuming RGBA8 actually means RGBD (which is stupid, I know)
+ // if ( NVRenderTextureFormats::getSizeofFormat(inFmt) == 4 ) { outPtr[i] /=
+ // divisor; }
+ }
+ // outPtr[3] = divisor;
+ break;
+
+ case R32F:
+ outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
+ break;
+ case RG32F:
+ outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
+ outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1];
+ break;
+ case RGBA32F:
+ outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
+ outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1];
+ outPtr[2] = reinterpret_cast<float *>(src + byteOfs)[2];
+ outPtr[3] = reinterpret_cast<float *>(src + byteOfs)[3];
+ break;
+ case RGB32F:
+ outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
+ outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1];
+ outPtr[2] = reinterpret_cast<float *>(src + byteOfs)[2];
+ break;
+
+ case R16F:
+ case RG16F:
+ case RGBA16F:
+ for (QT3DSU32 i = 0; i < (NVRenderTextureFormats::getSizeofFormat(inFmt) >> 1); ++i) {
+ // NOTE : This only works on the assumption that we don't have any denormals,
+ // Infs or NaNs.
+ // Every pixel in our source image should be "regular"
+ QT3DSU16 h = reinterpret_cast<QT3DSU16 *>(src + byteOfs)[i];
+ QT3DSU32 sign = (h & 0x8000) << 16;
+ QT3DSU32 exponent = (((((h & 0x7c00) >> 10) - 15) + 127) << 23);
+ QT3DSU32 mantissa = ((h & 0x3ff) << 13);
+ QT3DSU32 result = sign | exponent | mantissa;
+
+ if (h == 0 || h == 0x8000) {
+ result = 0;
+ } // Special case for zero and negative zero
+ qt3ds::intrinsics::memCopy(reinterpret_cast<QT3DSU32 *>(outPtr) + i, &result, 4);
+ }
+ break;
+
+ case R11G11B10:
+ // place holder
+ QT3DS_ASSERT(false);
+ break;
+
+ default:
+ outPtr[0] = 0.0f;
+ outPtr[1] = 0.0f;
+ outPtr[2] = 0.0f;
+ outPtr[3] = 0.0f;
+ break;
+ }
+ }
+
+ static void encodeToPixel(float *inPtr, void *outPtr, QT3DSU32 byteOfs,
+ NVRenderTextureFormats::Enum inFmt)
+ {
+ QT3DSU8 *dest = reinterpret_cast<QT3DSU8 *>(outPtr);
+ switch (inFmt) {
+ case NVRenderTextureFormats::Alpha8:
+ dest[byteOfs] = QT3DSU8(inPtr[0] * 255.0f);
+ break;
+
+ case Luminance8:
+ case LuminanceAlpha8:
+ case R8:
+ case RG8:
+ case RGB8:
+ case RGBA8:
+ case SRGB8:
+ case SRGB8A8:
+ for (QT3DSU32 i = 0; i < NVRenderTextureFormats::getSizeofFormat(inFmt); ++i) {
+ inPtr[i] = (inPtr[i] > 1.0f) ? 1.0f : inPtr[i];
+ if (i < 3)
+ dest[byteOfs + i] = QT3DSU8(powf(inPtr[i], 2.2f) * 255.0f);
+ else
+ dest[byteOfs + i] = QT3DSU8(inPtr[i] * 255.0f);
+ }
+ break;
+
+ case R32F:
+ reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
+ break;
+ case RG32F:
+ reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
+ reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1];
+ break;
+ case RGBA32F:
+ reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
+ reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1];
+ reinterpret_cast<float *>(dest + byteOfs)[2] = inPtr[2];
+ reinterpret_cast<float *>(dest + byteOfs)[3] = inPtr[3];
+ break;
+ case RGB32F:
+ reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
+ reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1];
+ reinterpret_cast<float *>(dest + byteOfs)[2] = inPtr[2];
+ break;
+
+ case R16F:
+ case RG16F:
+ case RGBA16F:
+ for (QT3DSU32 i = 0; i < (NVRenderTextureFormats::getSizeofFormat(inFmt) >> 1); ++i) {
+ // NOTE : This also has the limitation of not handling infs, NaNs and
+ // denormals, but it should be
+ // sufficient for our purposes.
+ if (inPtr[i] > 65519.0f) {
+ inPtr[i] = 65519.0f;
+ }
+ if (fabs(inPtr[i]) < 6.10352E-5f) {
+ inPtr[i] = 0.0f;
+ }
+ QT3DSU32 f = reinterpret_cast<QT3DSU32 *>(inPtr)[i];
+ QT3DSU32 sign = (f & 0x80000000) >> 16;
+ QT3DSI32 exponent = (f & 0x7f800000) >> 23;
+ QT3DSU32 mantissa = (f >> 13) & 0x3ff;
+ exponent = exponent - 112;
+ if (exponent > 31) {
+ exponent = 31;
+ }
+ if (exponent < 0) {
+ exponent = 0;
+ }
+ exponent = exponent << 10;
+ reinterpret_cast<QT3DSU16 *>(dest + byteOfs)[i] =
+ QT3DSU16(sign | exponent | mantissa);
+ }
+ break;
+
+ case R11G11B10:
+ // place holder
+ QT3DS_ASSERT(false);
+ break;
+
+ default:
+ dest[byteOfs] = 0;
+ dest[byteOfs + 1] = 0;
+ dest[byteOfs + 2] = 0;
+ dest[byteOfs + 3] = 0;
+ break;
+ }
+ }
+};
+
+struct NVRenderTextureTargetType
+{
+ enum Enum {
+ Unknown = 0,
+ Texture2D,
+ Texture2D_MS,
+ Texture2D_Array,
+ TextureCube,
+ TextureCubePosX,
+ TextureCubeNegX,
+ TextureCubePosY,
+ TextureCubeNegY,
+ TextureCubePosZ,
+ TextureCubeNegZ,
+ };
+};
+
+struct NVRenderTextureUnit
+{
+ enum Enum {
+ TextureUnit_0 = 0,
+ TextureUnit_1,
+ TextureUnit_2,
+ TextureUnit_3,
+ TextureUnit_4,
+ TextureUnit_5,
+ TextureUnit_6,
+ TextureUnit_7,
+ TextureUnit_8,
+ TextureUnit_9,
+ TextureUnit_10,
+ TextureUnit_11,
+ TextureUnit_12,
+ TextureUnit_13,
+ TextureUnit_14,
+ TextureUnit_15,
+ TextureUnit_16,
+ TextureUnit_17,
+ TextureUnit_18,
+ TextureUnit_19,
+ TextureUnit_20,
+ TextureUnit_21,
+ TextureUnit_22,
+ TextureUnit_23,
+ TextureUnit_24,
+ TextureUnit_25,
+ TextureUnit_26,
+ TextureUnit_27,
+ TextureUnit_28,
+ TextureUnit_29,
+ TextureUnit_30,
+ TextureUnit_31
+ };
+};
+
+struct NVRenderTextureCompareMode
+{
+ enum Enum { Unknown = 0, NoCompare, CompareToRef };
+};
+
+struct NVRenderTextureSwizzleMode
+{
+ enum Enum { NoSwizzle = 0, L8toR8, A8toR8, L8A8toRG8, L16toR16 };
+};
+
+#define QT3DS_RENDER_ITERATE_BOOL_OP \
+ QT3DS_RENDER_HANDLE_BOOL_OP(Never) \
+ QT3DS_RENDER_HANDLE_BOOL_OP(Less) \
+ QT3DS_RENDER_HANDLE_BOOL_OP(LessThanOrEqual) \
+ QT3DS_RENDER_HANDLE_BOOL_OP(Equal) \
+ QT3DS_RENDER_HANDLE_BOOL_OP(NotEqual) \
+ QT3DS_RENDER_HANDLE_BOOL_OP(Greater) \
+ QT3DS_RENDER_HANDLE_BOOL_OP(GreaterThanOrEqual) \
+ QT3DS_RENDER_HANDLE_BOOL_OP(AlwaysTrue)
+
+struct NVRenderTextureCompareOp
+{
+ enum Enum {
+#define QT3DS_RENDER_HANDLE_BOOL_OP(x) x,
+ QT3DS_RENDER_ITERATE_BOOL_OP
+#undef QT3DS_RENDER_HANDLE_BOOL_OP
+ };
+};
+
+#define QT3DS_RENDER_ITERATE_TEXTURE_FILTER_OP \
+ QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP(Nearest) \
+ QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP(Linear) \
+ QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(NearestMipmapNearest) \
+ QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(LinearMipmapNearest) \
+ QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(NearestMipmapLinear) \
+ QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(LinearMipmapLinear)
+
+struct NVRenderTextureMinifyingOp
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP(x) x,
+#define QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(x) x,
+ QT3DS_RENDER_ITERATE_TEXTURE_FILTER_OP
+#undef QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP
+#undef QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP
+ };
+
+ static const char *toString(const NVRenderTextureMinifyingOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP(x) \
+ case x: \
+ return #x;
+#define QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_TEXTURE_FILTER_OP
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+struct NVRenderTextureMagnifyingOp
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP(x) x,
+#define QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(x)
+ QT3DS_RENDER_ITERATE_TEXTURE_FILTER_OP
+#undef QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP
+#undef QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP
+ };
+ static const char *toString(const NVRenderTextureMagnifyingOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP(x) \
+ case x: \
+ return #x;
+#define QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP(x)
+ QT3DS_RENDER_ITERATE_TEXTURE_FILTER_OP
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_MINIFYING_OP
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_FILTER_OP
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_TEXTURE_WRAP_OP \
+ QT3DS_RENDER_HANDLE_TEXTURE_WRAP_OP(ClampToEdge) \
+ QT3DS_RENDER_HANDLE_TEXTURE_WRAP_OP(MirroredRepeat) \
+ QT3DS_RENDER_HANDLE_TEXTURE_WRAP_OP(Repeat)
+
+struct NVRenderTextureCoordOp
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_TEXTURE_WRAP_OP(x) x,
+ QT3DS_RENDER_ITERATE_TEXTURE_WRAP_OP
+#undef QT3DS_RENDER_HANDLE_TEXTURE_WRAP_OP
+ };
+
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_TEXTURE_WRAP_OP(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_TEXTURE_WRAP_OP
+ #undef QT3DS_RENDER_HANDLE_TEXTURE_WRAP_OP
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_HINT \
+ QT3DS_RENDER_HANDLE_HINT(Fastest) \
+ QT3DS_RENDER_HANDLE_HINT(Nicest) \
+ QT3DS_RENDER_HANDLE_HINT(Unspecified)
+
+struct NVRenderHint
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_HINT(x) x,
+ QT3DS_RENDER_ITERATE_HINT
+#undef QT3DS_RENDER_HANDLE_HINT
+ };
+
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_HINT(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_HINT
+ #undef QT3DS_RENDER_HANDLE_HINT
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+class NVRenderImplemented
+{
+protected:
+ virtual ~NVRenderImplemented() {}
+public:
+ // Get the handle that binds us to the implementation.
+ // For instance, return the GLuint that came back from
+ // glGenTextures.
+ virtual const void *GetImplementationHandle() const = 0;
+};
+
+struct NVRenderVertexBufferEntry
+{
+ const char *m_Name;
+ /** Datatype of the this entry points to in the buffer */
+ NVRenderComponentTypes::Enum m_ComponentType;
+ /** Number of components of each data member. 1,2,3, or 4. Don't be stupid.*/
+ QT3DSU32 m_NumComponents;
+ /** Offset from the beginning of the buffer of the first item */
+ QT3DSU32 m_FirstItemOffset;
+ /** Attribute input slot used for this entry*/
+ QT3DSU32 m_InputSlot;
+
+ NVRenderVertexBufferEntry(const char *nm, NVRenderComponentTypes::Enum type,
+ QT3DSU32 numComponents, QT3DSU32 firstItemOffset = 0,
+ QT3DSU32 inputSlot = 0)
+ : m_Name(nm)
+ , m_ComponentType(type)
+ , m_NumComponents(numComponents)
+ , m_FirstItemOffset(firstItemOffset)
+ , m_InputSlot(inputSlot)
+ {
+ }
+
+ NVRenderVertexBufferEntry()
+ : m_Name(NULL)
+ , m_ComponentType(NVRenderComponentTypes::Unknown)
+ , m_NumComponents(0)
+ , m_FirstItemOffset(0)
+ , m_InputSlot(0)
+ {
+ }
+
+ NVRenderVertexBufferEntry(const NVRenderVertexBufferEntry &inOther)
+ : m_Name(inOther.m_Name)
+ , m_ComponentType(inOther.m_ComponentType)
+ , m_NumComponents(inOther.m_NumComponents)
+ , m_FirstItemOffset(inOther.m_FirstItemOffset)
+ , m_InputSlot(inOther.m_InputSlot)
+ {
+ }
+
+ NVRenderVertexBufferEntry &operator=(const NVRenderVertexBufferEntry &inOther)
+ {
+ if (this != &inOther) {
+ m_Name = inOther.m_Name;
+ m_ComponentType = inOther.m_ComponentType;
+ m_NumComponents = inOther.m_NumComponents;
+ m_FirstItemOffset = inOther.m_FirstItemOffset;
+ m_InputSlot = inOther.m_InputSlot;
+ }
+ return *this;
+ }
+};
+
+class NVRenderShaderProgram;
+
+typedef NVConstDataRef<QT3DSI8> TConstI8Ref;
+
+struct NVRenderVertFragCompilationResult
+{
+ const char *mShaderName;
+
+ NVRenderShaderProgram *mShader; ///< contains the program
+
+ NVRenderVertFragCompilationResult()
+ : mShaderName("")
+ , mShader(NULL)
+ {
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_FRAMEBUFFER_ATTACHMENTS \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color0) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color1) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color2) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color3) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color4) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color5) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color6) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Color7) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Depth) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(Stencil) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(DepthStencil) \
+ QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(CoverageNV)
+
+struct NVRenderFrameBufferAttachments
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT(x) x,
+ QT3DS_RENDER_ITERATE_FRAMEBUFFER_ATTACHMENTS
+#undef QT3DS_RENDER_HANDLE_FRAMEBUFFER_ATTACHMENT
+ LastAttachment,
+ };
+};
+
+struct NVRenderDrawMode
+{
+ enum Enum {
+ Unknown = 0,
+ Points,
+ LineStrip,
+ LineLoop,
+ Lines,
+ TriangleStrip,
+ TriangleFan,
+ Triangles,
+ Patches,
+ };
+};
+
+struct NVRenderTextureCubeFaces
+{
+ enum Enum {
+ InvalidFace = 0,
+ CubePosX = 1,
+ CubeNegX,
+ CubePosY,
+ CubeNegY,
+ CubePosZ,
+ CubeNegZ,
+ };
+};
+
+// enums match the NV path extensions
+struct NVRenderPathCommands
+{
+ enum Enum {
+ Close = 0,
+ MoveTo = 2,
+ CubicCurveTo = 12,
+ };
+};
+
+struct NVRenderPathFontTarget
+{
+ enum Enum {
+ StandardFont = 0,
+ SystemFont = 1,
+ FileFont = 2,
+ };
+};
+
+struct NVRenderPathMissingGlyphs
+{
+ enum Enum {
+ SkipMissing = 0,
+ UseMissing = 1,
+ };
+};
+
+struct NVRenderPathFontStyleValues
+{
+ enum Enum {
+ Bold = 1 << 0,
+ Italic = 1 << 1,
+ };
+};
+
+typedef NVFlags<NVRenderPathFontStyleValues::Enum, QT3DSU32> NVRenderPathFontStyleFlags;
+
+struct NVRenderPathReturnValues
+{
+ enum Enum {
+ FontGlypsAvailable = 0,
+ FontTargetUnavailable = 1,
+ FontUnavailable = 2,
+ FontUnintelligible = 3,
+ InvalidEnum = 4,
+ OutOfMemory = 5,
+ };
+};
+
+struct NVRenderPathFormatType
+{
+ enum Enum {
+ Byte = 1,
+ UByte,
+ Short,
+ UShort,
+ Int,
+ Uint,
+ Float,
+ Utf8,
+ Utf16,
+ Bytes2,
+ Bytes3,
+ Bytes4,
+ };
+};
+
+struct NVRenderPathGlyphFontMetricValues
+{
+ enum Enum {
+ GlyphWidth = 1 << 0,
+ GlyphHeight = 1 << 1,
+ GlyphHorizontalBearingX = 1 << 2,
+ GlyphHorizontalBearingY = 1 << 3,
+ GlyphHorizontalBearingAdvance = 1 << 4,
+ GlyphVerticalBearingX = 1 << 5,
+ GlyphVerticalBearingY = 1 << 6,
+ GlyphVerticalBearingAdvance = 1 << 7,
+ GlyphHasKerning = 1 << 8,
+
+ FontXMinBounds = 1 << 9,
+ FontYMinBounds = 1 << 10,
+ FontXMaxBounds = 1 << 11,
+ FontYMaxBounds = 1 << 12,
+ FontUnitsPerEm = 1 << 13,
+ FontAscender = 1 << 14,
+ FontDescender = 1 << 15,
+ FontHeight = 1 << 16,
+ FontMaxAdvanceWidth = 1 << 17,
+ FontMaxAdvanceHeight = 1 << 18,
+ FontUnderlinePosition = 1 << 19,
+ FontUnderlineThickness = 1 << 20,
+ FontHasKerning = 1 << 21,
+ FontNumGlyphIndices = 1 << 22,
+ };
+};
+
+typedef NVFlags<NVRenderPathGlyphFontMetricValues::Enum, QT3DSU32>
+NVRenderPathGlyphFontMetricFlags;
+
+struct NVRenderPathListMode
+{
+ enum Enum {
+ AccumAdjacentPairs = 1,
+ AdjacentPairs,
+ FirstToRest,
+ };
+};
+
+struct NVRenderPathFillMode
+{
+ enum Enum {
+ Fill = 1,
+ CountUp,
+ CountDown,
+ Invert,
+ };
+};
+
+struct NVRenderPathCoverMode
+{
+ enum Enum {
+ ConvexHull = 1,
+ BoundingBox,
+ BoundingBoxOfBoundingBox,
+ PathFillCover,
+ PathStrokeCover,
+ };
+};
+
+struct NVRenderPathTransformType
+{
+ enum Enum {
+ NoTransform = 0,
+ TranslateX,
+ TranslateY,
+ Translate2D,
+ Translate3D,
+ Affine2D,
+ Affine3D,
+ TransposeAffine2D,
+ TransposeAffine3D,
+ };
+};
+
+#define QT3DS_RENDER_ITERATE_WINDING \
+ QT3DS_RENDER_HANDLE_WINDING(Clockwise) \
+ QT3DS_RENDER_HANDLE_WINDING(CounterClockwise)
+
+struct NVRenderWinding
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_WINDING(x) x,
+ QT3DS_RENDER_ITERATE_WINDING
+#undef QT3DS_RENDER_HANDLE_WINDING
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_WINDING(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_WINDING
+ #undef QT3DS_RENDER_HANDLE_WINDING
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_RENDER_STATE \
+ QT3DS_RENDER_HANDLE_RENDER_STATE(Blend) \
+ QT3DS_RENDER_HANDLE_RENDER_STATE(CullFace) \
+ QT3DS_RENDER_HANDLE_RENDER_STATE(DepthTest) \
+ QT3DS_RENDER_HANDLE_RENDER_STATE(StencilTest) \
+ QT3DS_RENDER_HANDLE_RENDER_STATE(ScissorTest) \
+ QT3DS_RENDER_HANDLE_RENDER_STATE(DepthWrite) \
+ QT3DS_RENDER_HANDLE_RENDER_STATE(Multisample)
+
+struct NVRenderState
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_RENDER_STATE(x) x,
+ QT3DS_RENDER_ITERATE_RENDER_STATE
+#undef QT3DS_RENDER_HANDLE_RENDER_STATE
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_RENDER_STATE(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_RENDER_STATE
+ #undef QT3DS_RENDER_HANDLE_RENDER_STATE
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_BLEND_FUNC \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(Zero) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(One) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(SrcColor) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(OneMinusSrcColor) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(DstColor) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(OneMinusDstColor) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(SrcAlpha) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(OneMinusSrcAlpha) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(DstAlpha) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(OneMinusDstAlpha) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(ConstantColor) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(OneMinusConstantColor) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(ConstantAlpha) \
+ QT3DS_RENDER_HANDLE_BLEND_FUNC(OneMinusConstantAlpha) \
+ QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC(SrcAlphaSaturate)
+
+struct NVRenderSrcBlendFunc
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_BLEND_FUNC(x) x,
+#define QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC(x) x,
+ QT3DS_RENDER_ITERATE_BLEND_FUNC
+#undef QT3DS_RENDER_HANDLE_BLEND_FUNC
+#undef QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC
+ };
+
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_BLEND_FUNC(x) \
+ case x: \
+ return #x;
+#define QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_BLEND_FUNC
+ #undef QT3DS_RENDER_HANDLE_BLEND_FUNC
+ #undef QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+struct NVRenderDstBlendFunc
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_BLEND_FUNC(x) x,
+#define QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC(x)
+ QT3DS_RENDER_ITERATE_BLEND_FUNC
+#undef QT3DS_RENDER_HANDLE_BLEND_FUNC
+#undef QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC
+ };
+
+ static const char *toString(const Enum value)
+ {
+ return NVRenderSrcBlendFunc::toString((NVRenderSrcBlendFunc::Enum)value);
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_BLEND_EQUATION \
+ QT3DS_RENDER_HANDLE_BLEND_EQUATION(Add) \
+ QT3DS_RENDER_HANDLE_BLEND_EQUATION(Subtract) \
+ QT3DS_RENDER_HANDLE_BLEND_EQUATION(ReverseSubtract) \
+ QT3DS_RENDER_HANDLE_BLEND_EQUATION(Overlay) \
+ QT3DS_RENDER_HANDLE_BLEND_EQUATION(ColorBurn) \
+ QT3DS_RENDER_HANDLE_BLEND_EQUATION(ColorDodge)
+
+struct NVRenderBlendEquation
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_BLEND_EQUATION(x) x,
+ QT3DS_RENDER_ITERATE_BLEND_EQUATION
+#undef QT3DS_RENDER_HANDLE_BLEND_EQUATION
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_BLEND_EQUATION(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_BLEND_EQUATION
+ #undef QT3DS_RENDER_HANDLE_BLEND_EQUATION
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_FACES \
+ QT3DS_RENDER_HANDLE_FACES(Front) \
+ QT3DS_RENDER_HANDLE_FACES(Back) \
+ QT3DS_RENDER_HANDLE_FACES(FrontAndBack)
+
+struct NVRenderFaces
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_FACES(x) x,
+ QT3DS_RENDER_ITERATE_FACES
+#undef QT3DS_RENDER_HANDLE_FACES
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_FACES(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_FACES
+ #undef QT3DS_RENDER_HANDLE_FACES
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_READ_FACES \
+ QT3DS_RENDER_HANDLE_READ_FACES(Front) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Back) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color0) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color1) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color2) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color3) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color4) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color5) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color6) \
+ QT3DS_RENDER_HANDLE_READ_FACES(Color7)
+
+struct NVReadFaces
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_READ_FACES(x) x,
+ QT3DS_RENDER_ITERATE_READ_FACES
+#undef QT3DS_RENDER_HANDLE_READ_FACES
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_READ_FACES(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_READ_FACES
+ #undef QT3DS_RENDER_HANDLE_READ_FACES
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+struct NVRenderBoolOp
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_BOOL_OP(x) x,
+ QT3DS_RENDER_ITERATE_BOOL_OP
+#undef QT3DS_RENDER_HANDLE_BOOL_OP
+ };
+
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_BOOL_OP(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_BOOL_OP
+ #undef QT3DS_RENDER_HANDLE_BOOL_OP
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+#define QT3DS_RENDER_ITERATE_STENCIL_OP \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(Keep) \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(Zero) \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(Replace) \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(Increment) \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(IncrementWrap) \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(Decrement) \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(DecrementWrap) \
+ QT3DS_RENDER_HANDLE_STENCIL_OP(Invert)
+
+struct NVRenderStencilOp
+{
+ enum Enum {
+ Unknown = 0,
+#define QT3DS_RENDER_HANDLE_STENCIL_OP(x) x,
+ QT3DS_RENDER_ITERATE_STENCIL_OP
+#undef QT3DS_RENDER_HANDLE_STENCIL_OP
+ };
+ static const char *toString(const Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_STENCIL_OP(x) \
+ case x: \
+ return #x;
+ QT3DS_RENDER_ITERATE_STENCIL_OP
+ #undef QT3DS_RENDER_HANDLE_STENCIL_OP
+ default:
+ break;
+ }
+ return "Unknown";
+ }
+};
+
+struct NVRenderBlendFunctionArgument
+{
+ NVRenderSrcBlendFunc::Enum m_SrcRGB;
+ NVRenderDstBlendFunc::Enum m_DstRGB;
+ NVRenderSrcBlendFunc::Enum m_SrcAlpha;
+ NVRenderDstBlendFunc::Enum m_DstAlpha;
+
+ NVRenderBlendFunctionArgument(NVRenderSrcBlendFunc::Enum srcRGB,
+ NVRenderDstBlendFunc::Enum dstRGB,
+ NVRenderSrcBlendFunc::Enum srcAlpha,
+ NVRenderDstBlendFunc::Enum dstAlpha)
+ : m_SrcRGB(srcRGB)
+ , m_DstRGB(dstRGB)
+ , m_SrcAlpha(srcAlpha)
+ , m_DstAlpha(dstAlpha)
+ {
+ }
+
+ // Default blend system premultiplies values.
+ NVRenderBlendFunctionArgument()
+ : m_SrcRGB(NVRenderSrcBlendFunc::SrcAlpha)
+ , m_DstRGB(NVRenderDstBlendFunc::OneMinusSrcAlpha)
+ , m_SrcAlpha(NVRenderSrcBlendFunc::One)
+ , m_DstAlpha(NVRenderDstBlendFunc::OneMinusSrcAlpha)
+ {
+ }
+};
+
+struct NVRenderBlendEquationArgument
+{
+ NVRenderBlendEquation::Enum m_RGBEquation;
+ NVRenderBlendEquation::Enum m_AlphaEquation;
+
+ NVRenderBlendEquationArgument(NVRenderBlendEquation::Enum rgb,
+ NVRenderBlendEquation::Enum alpha)
+ : m_RGBEquation(rgb)
+ , m_AlphaEquation(alpha)
+ {
+ }
+ NVRenderBlendEquationArgument()
+ : m_RGBEquation(NVRenderBlendEquation::Add)
+ , m_AlphaEquation(NVRenderBlendEquation::Add)
+ {
+ }
+};
+
+struct NVRenderStencilOperationArgument
+{
+ NVRenderStencilOp::Enum m_StencilFail; // What happens when stencil test fails.
+ // These values assume the stencil passed
+ NVRenderStencilOp::Enum
+ m_DepthFail; // What happens when the stencil passes but depth test fail.
+ NVRenderStencilOp::Enum m_DepthPass; // What happens when the stencil and depth tests pass.
+
+ NVRenderStencilOperationArgument(NVRenderStencilOp::Enum fail,
+ NVRenderStencilOp::Enum depthFail,
+ NVRenderStencilOp::Enum depthPass)
+ : m_StencilFail(fail)
+ , m_DepthFail(depthFail)
+ , m_DepthPass(depthPass)
+ {
+ }
+ NVRenderStencilOperationArgument()
+ : m_StencilFail(NVRenderStencilOp::Keep)
+ , m_DepthFail(NVRenderStencilOp::Keep)
+ , m_DepthPass(NVRenderStencilOp::Keep)
+ {
+ }
+ NVRenderStencilOperationArgument(const NVRenderStencilOperationArgument &StencilOp)
+ : m_StencilFail(StencilOp.m_StencilFail)
+ , m_DepthFail(StencilOp.m_DepthFail)
+ , m_DepthPass(StencilOp.m_DepthPass)
+ {
+ }
+
+ NVRenderStencilOperationArgument &operator=(const NVRenderStencilOperationArgument &rhs)
+ {
+ // Check for self-assignment!
+ if (this == &rhs)
+ return *this;
+
+ m_StencilFail = rhs.m_StencilFail;
+ m_DepthFail = rhs.m_DepthFail;
+ m_DepthPass = rhs.m_DepthPass;
+
+ return *this;
+ }
+
+ bool operator==(const NVRenderStencilOperationArgument &other) const
+ {
+ return (m_StencilFail == other.m_StencilFail && m_DepthFail == other.m_DepthFail
+ && m_DepthPass == other.m_DepthPass);
+ }
+};
+
+// see glStencilFuncSeparate
+struct NVRenderStencilFunctionArgument
+{
+ NVRenderBoolOp::Enum m_Function;
+ QT3DSU32 m_ReferenceValue;
+ QT3DSU32 m_Mask;
+
+ NVRenderStencilFunctionArgument(NVRenderBoolOp::Enum function, QT3DSU32 referenceValue,
+ QT3DSU32 mask)
+ : m_Function(function)
+ , m_ReferenceValue(referenceValue)
+ , m_Mask(mask)
+ {
+ }
+ NVRenderStencilFunctionArgument()
+ : m_Function(NVRenderBoolOp::AlwaysTrue)
+ , m_ReferenceValue(0)
+ , m_Mask((QT3DSU32)-1)
+ {
+ }
+ NVRenderStencilFunctionArgument(const NVRenderStencilFunctionArgument &StencilFunc)
+ : m_Function(StencilFunc.m_Function)
+ , m_ReferenceValue(StencilFunc.m_ReferenceValue)
+ , m_Mask(StencilFunc.m_Mask)
+ {
+ }
+
+ NVRenderStencilFunctionArgument &operator=(const NVRenderStencilFunctionArgument &rhs)
+ {
+ // Check for self-assignment!
+ if (this == &rhs)
+ return *this;
+
+ m_Function = rhs.m_Function;
+ m_ReferenceValue = rhs.m_ReferenceValue;
+ m_Mask = rhs.m_Mask;
+
+ return *this;
+ }
+
+ bool operator==(const NVRenderStencilFunctionArgument &other) const
+ {
+ return (m_Function == other.m_Function && m_ReferenceValue == other.m_ReferenceValue
+ && m_Mask == other.m_Mask);
+ }
+};
+
+class NVRenderFrameBuffer;
+class NVRenderVertexBuffer;
+class NVRenderIndexBuffer;
+class NVRenderShaderProgram;
+class NVRenderProgramPipeline;
+class NVRenderTextureBase;
+class NVRenderTexture2D;
+class NVRenderTexture2DArray;
+class NVRenderTextureCube;
+class NVRenderImage2D;
+class NVRenderDataBuffer;
+class NVRenderAttribLayout;
+class NVRenderInputAssembler;
+
+typedef NVRenderFrameBuffer *NVRenderFrameBufferPtr;
+typedef NVRenderVertexBuffer *NVRenderVertexBufferPtr;
+typedef NVRenderIndexBuffer *NVRenderIndexBufferPtr;
+typedef NVRenderTexture2D *NVRenderTexture2DPtr;
+typedef NVRenderTexture2DPtr *NVRenderTexture2DHandle;
+typedef NVRenderTexture2DArray *NVRenderTexture2DArrayPtr;
+typedef NVRenderTextureCube *NVRenderTextureCubePtr;
+typedef NVRenderTextureCubePtr *NVRenderTextureCubeHandle;
+typedef NVRenderImage2D *NVRenderImage2DPtr;
+typedef NVRenderDataBuffer *NVRenderDataBufferPtr;
+typedef const char *NVRenderConstCharPtr;
+typedef bool QT3DSRenderBool;
+typedef NVRenderShaderProgram *NVRenderShaderProgramPtr;
+typedef NVDataRef<QT3DSU32> NVU32List;
+typedef NVDataRef<const char *> NVConstCharPtrList;
+
+template <typename TDataType>
+struct NVRenderRectT
+{
+ typedef TDataType TRectType;
+ TDataType m_X;
+ TDataType m_Y;
+ TDataType m_Width;
+ TDataType m_Height;
+ NVRenderRectT(TDataType x, TDataType y, TDataType w, TDataType h)
+ : m_X(x)
+ , m_Y(y)
+ , m_Width(w)
+ , m_Height(h)
+ {
+ }
+ NVRenderRectT()
+ : m_X(0)
+ , m_Y(0)
+ , m_Width(0)
+ , m_Height(0)
+ {
+ }
+ bool operator==(const NVRenderRectT<TDataType> &inOther) const
+ {
+ return m_X == inOther.m_X && m_Y == inOther.m_Y && m_Width == inOther.m_Width
+ && m_Height == inOther.m_Height;
+ }
+ bool operator!=(const NVRenderRectT<TDataType> &inOther) const
+ {
+ return !(*this == inOther);
+ }
+ TDataType GetRightExtent() const { return m_X + m_Width; }
+ TDataType GetBottomExtent() const { return m_Y + m_Height; }
+ // Ensure this rect is inside the bounds of the other rect
+ void EnsureInBounds(const NVRenderRectT<TDataType> &inOther)
+ {
+ TDataType rightExtent = qt3ds::NVMin(GetRightExtent(), inOther.GetRightExtent());
+ TDataType bottomExtent = qt3ds::NVMin(GetBottomExtent(), inOther.GetBottomExtent());
+ m_X = qt3ds::NVMax(m_X, inOther.m_X);
+ m_Y = qt3ds::NVMax(m_Y, inOther.m_Y);
+ m_Width = NVMax(static_cast<TDataType>(0), rightExtent - m_X);
+ m_Height = NVMax(static_cast<TDataType>(0), bottomExtent - m_Y);
+ }
+};
+
+// Render rects are setup to be in the coordinate space of the gl viewport,
+// so x, y are left, bottom with increasing units going to the right and
+// up respectively.
+struct NVRenderRect : public NVRenderRectT<QT3DSI32>
+{
+ typedef NVRenderRectT<QT3DSI32> TBase;
+ NVRenderRect(QT3DSI32 x, QT3DSI32 y, QT3DSI32 w, QT3DSI32 h)
+ : TBase(x, y, w, h)
+ {
+ }
+ NVRenderRect()
+ : TBase()
+ {
+ }
+};
+
+struct NVRenderRectF : public NVRenderRectT<QT3DSF32>
+{
+ typedef NVRenderRectT<QT3DSF32> TBase;
+ NVRenderRectF(QT3DSF32 x, QT3DSF32 y, QT3DSF32 w, QT3DSF32 h)
+ : TBase(x, y, w, h)
+ {
+ }
+ NVRenderRectF()
+ : TBase()
+ {
+ }
+ NVRenderRectF(const NVRenderRect &inRect)
+ : TBase((QT3DSF32)inRect.m_X, (QT3DSF32)inRect.m_Y, (QT3DSF32)inRect.m_Width,
+ (QT3DSF32)inRect.m_Height)
+ {
+ }
+ NVRenderRect ToIntegerRect() const
+ {
+ return NVRenderRect((QT3DSI32)m_X, (QT3DSI32)m_Y, (QT3DSU32)(m_Width + .5f),
+ (QT3DSU32)(m_Height + .5f));
+ }
+ QT3DSVec2 BottomLeft() const { return QT3DSVec2(m_X, m_Y); }
+ QT3DSVec2 Center() const
+ {
+ QT3DSVec2 halfDims = HalfDims();
+ return QT3DSVec2(m_X + halfDims.x, m_Y + halfDims.y);
+ }
+ QT3DSVec2 HalfDims() const { return QT3DSVec2(m_Width / 2.0f, m_Height / 2.0f); }
+ // Normalized coordinates are in the range of -1,1 where -1 is the left, bottom edges
+ // and 1 is the top,right edges.
+ QT3DSVec2 AbsoluteToNormalizedCoordinates(QT3DSVec2 absoluteCoordinates) const
+ {
+ QT3DSVec2 relativeCoords(ToRectRelative(absoluteCoordinates));
+ return RelativeToNormalizedCoordinates(relativeCoords);
+ };
+
+ QT3DSVec2 RelativeToNormalizedCoordinates(QT3DSVec2 rectRelativeCoords) const
+ {
+ QT3DSVec2 halfDims(HalfDims());
+ QT3DSVec2 retval((rectRelativeCoords.x / halfDims.x) - 1.0f,
+ (rectRelativeCoords.y / halfDims.y) - 1.0f);
+ return retval;
+ }
+
+ // Take coordinates in global space and move local space where 0,0 is the center
+ // of the rect but return value in pixels, not in normalized -1,1 range
+ QT3DSVec2 ToNormalizedRectRelative(QT3DSVec2 absoluteCoordinates) const
+ {
+ // normalize them
+ QT3DSVec2 relativeCoords(ToRectRelative(absoluteCoordinates));
+ QT3DSVec2 halfDims(HalfDims());
+ QT3DSVec2 normalized((relativeCoords.x / halfDims.x) - 1.0f,
+ (relativeCoords.y / halfDims.y) - 1.0f);
+ return QT3DSVec2(normalized.x * halfDims.x, normalized.y * halfDims.y);
+ }
+
+ // Return coordinates in pixels but relative to this rect.
+ QT3DSVec2 ToRectRelative(QT3DSVec2 absoluteCoordinates) const
+ {
+ return QT3DSVec2(absoluteCoordinates.x - m_X, absoluteCoordinates.y - m_Y);
+ }
+
+ QT3DSVec2 ToAbsoluteCoords(QT3DSVec2 inRelativeCoords) const
+ {
+ return QT3DSVec2(inRelativeCoords.x + m_X, inRelativeCoords.y + m_Y);
+ }
+};
+
+template <typename TDataType>
+struct NVRenderGenericVec2
+{
+ TDataType x;
+ TDataType y;
+ NVRenderGenericVec2(TDataType _x, TDataType _y)
+ : x(_x)
+ , y(_y)
+ {
+ }
+ NVRenderGenericVec2() {}
+ bool operator==(const NVRenderGenericVec2 &inOther) const
+ {
+ return x == inOther.x && y == inOther.y;
+ }
+};
+
+template <typename TDataType>
+struct NVRenderGenericVec3
+{
+ TDataType x;
+ TDataType y;
+ TDataType z;
+ NVRenderGenericVec3(TDataType _x, TDataType _y, TDataType _z)
+ : x(_x)
+ , y(_y)
+ , z(_z)
+ {
+ }
+ NVRenderGenericVec3() {}
+ bool operator==(const NVRenderGenericVec3 &inOther) const
+ {
+ return x == inOther.x && y == inOther.y && z == inOther.z;
+ }
+};
+
+template <typename TDataType>
+struct NVRenderGenericVec4
+{
+ TDataType x;
+ TDataType y;
+ TDataType z;
+ TDataType w;
+ NVRenderGenericVec4(TDataType _x, TDataType _y, TDataType _z, TDataType _w)
+ : x(_x)
+ , y(_y)
+ , z(_z)
+ , w(_w)
+ {
+ }
+ NVRenderGenericVec4() {}
+ bool operator==(const NVRenderGenericVec4 &inOther) const
+ {
+ return x == inOther.x && y == inOther.y && z == inOther.z && w == inOther.w;
+ }
+};
+
+#define DECLARE_GENERIC_VECTOR_TYPE(type, numElems) \
+ typedef NVRenderGenericVec##numElems<type> type##_##numElems
+DECLARE_GENERIC_VECTOR_TYPE(bool, 2);
+DECLARE_GENERIC_VECTOR_TYPE(bool, 3);
+DECLARE_GENERIC_VECTOR_TYPE(bool, 4);
+DECLARE_GENERIC_VECTOR_TYPE(QT3DSU32, 2);
+DECLARE_GENERIC_VECTOR_TYPE(QT3DSU32, 3);
+DECLARE_GENERIC_VECTOR_TYPE(QT3DSU32, 4);
+DECLARE_GENERIC_VECTOR_TYPE(QT3DSI32, 2);
+DECLARE_GENERIC_VECTOR_TYPE(QT3DSI32, 3);
+DECLARE_GENERIC_VECTOR_TYPE(QT3DSI32, 4);
+
+#define ITERATE_QT3DS_SHADER_DATA_TYPES \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSI32) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSI32_2) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSI32_3) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSI32_4) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSRenderBool) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(bool_2) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(bool_3) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(bool_4) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSF32) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSVec2) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSVec3) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSVec4) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSU32) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSU32_2) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSU32_3) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSU32_4) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSMat33) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(QT3DSMat44) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(NVRenderTexture2DPtr) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(NVRenderTexture2DHandle) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(NVRenderTexture2DArrayPtr) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(NVRenderTextureCubePtr) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(NVRenderTextureCubeHandle) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(NVRenderImage2DPtr) \
+ HANDLE_QT3DS_SHADER_DATA_TYPE(NVRenderDataBufferPtr)
+
+struct NVRenderShaderDataTypes
+{
+ enum Enum {
+ Unknown = 0,
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(type) type,
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ };
+};
+
+template <typename TDataType>
+struct NVDataTypeToShaderDataTypeMap
+{
+};
+
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(type) \
+ template <> \
+ struct NVDataTypeToShaderDataTypeMap<type> \
+{ \
+ static NVRenderShaderDataTypes::Enum GetType() { return NVRenderShaderDataTypes::type; } \
+};
+ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+
+template <>
+struct NVDataTypeToShaderDataTypeMap<NVConstDataRef<QT3DSMat44>>
+{
+ static NVRenderShaderDataTypes::Enum GetType() { return NVRenderShaderDataTypes::QT3DSMat44; }
+};
+
+struct NVRenderShaderTypeValue
+{
+ enum Enum {
+ Unknown = 1 << 0,
+ Vertex = 1 << 1,
+ Fragment = 1 << 2,
+ TessControl = 1 << 3,
+ TessEvaluation = 1 << 4,
+ Geometry = 1 << 5
+ };
+};
+
+typedef NVFlags<NVRenderShaderTypeValue::Enum, QT3DSU32> NVRenderShaderTypeFlags;
+
+struct NVRenderTextureTypeValue
+{
+ enum Enum {
+ Unknown = 0,
+ Diffuse,
+ Specular,
+ Environment,
+ Bump,
+ Normal,
+ Displace,
+ Emissive,
+ Emissive2,
+ Anisotropy,
+ Translucent,
+ LightmapIndirect,
+ LightmapRadiosity,
+ LightmapShadow
+ };
+
+ static const char *toString(const NVRenderTextureTypeValue::Enum value)
+ {
+ switch (value) {
+ case Unknown:
+ return "Unknown";
+ case Diffuse:
+ return "Diffuse";
+ case Specular:
+ return "Specular";
+ case Environment:
+ return "Environment";
+ case Bump:
+ return "Bump";
+ case Normal:
+ return "Normal";
+ case Displace:
+ return "Displace";
+ case Emissive:
+ return "Emissive";
+ case Emissive2:
+ return "Emissive2";
+ case Anisotropy:
+ return "Anisotropy";
+ case Translucent:
+ return "Translucent";
+ case LightmapIndirect:
+ return "LightmapIndirect";
+ case LightmapRadiosity:
+ return "LightmapRadiosity";
+ case LightmapShadow:
+ return "LightmapShadow";
+ default:
+ return "Unknown";
+ }
+ }
+};
+
+#define ITERATE_QT3DS_READ_PIXEL_FORMATS \
+ HANDLE_QT3DS_READ_PIXEL_FORMAT(Alpha8) \
+ HANDLE_QT3DS_READ_PIXEL_FORMAT(RGB565) \
+ HANDLE_QT3DS_READ_PIXEL_FORMAT(RGB8) \
+ HANDLE_QT3DS_READ_PIXEL_FORMAT(RGBA4444) \
+ HANDLE_QT3DS_READ_PIXEL_FORMAT(RGBA5551) \
+ HANDLE_QT3DS_READ_PIXEL_FORMAT(RGBA8)
+
+struct NVRenderReadPixelFormats
+{
+ enum Enum {
+ Unknown = 0,
+#define HANDLE_QT3DS_READ_PIXEL_FORMAT(format) format,
+ ITERATE_QT3DS_READ_PIXEL_FORMATS
+#undef HANDLE_QT3DS_READ_PIXEL_FORMAT
+ };
+};
+
+// Now for scoped property access.
+template <typename TBaseType, typename TDataType>
+struct NVRenderGenericScopedProperty
+{
+ typedef void (TBaseType::*TSetter)(TDataType inType);
+ typedef TDataType (TBaseType::*TGetter)() const;
+
+ TBaseType &m_Context;
+ TSetter m_Setter;
+ TDataType m_InitialValue;
+ NVRenderGenericScopedProperty(TBaseType &ctx, TGetter getter, TSetter setter)
+ : m_Context(ctx)
+ , m_Setter(setter)
+ , m_InitialValue(((ctx).*getter)())
+ {
+ }
+ NVRenderGenericScopedProperty(TBaseType &ctx, TGetter getter, TSetter setter,
+ const TDataType &inNewValue)
+ : m_Context(ctx)
+ , m_Setter(setter)
+ , m_InitialValue(((ctx).*getter)())
+ {
+ ((m_Context).*m_Setter)(inNewValue);
+ }
+ ~NVRenderGenericScopedProperty() { ((m_Context).*m_Setter)(m_InitialValue); }
+};
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderComputeShader.cpp b/src/render/Qt3DSRenderComputeShader.cpp
new file mode 100644
index 0000000..01aef47
--- /dev/null
+++ b/src/render/Qt3DSRenderComputeShader.cpp
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderComputeShader.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderComputeShader::NVRenderComputeShader(NVRenderContextImpl &context,
+ NVFoundationBase &fnd, NVConstDataRef<QT3DSI8> source,
+ bool binaryProgram)
+ : NVRenderShader(context, fnd, source, binaryProgram)
+ , m_ShaderHandle(NULL)
+ {
+ m_ShaderHandle = m_Backend->CreateComputeShader(source, m_ErrorMessage, binaryProgram);
+ }
+
+ NVRenderComputeShader::~NVRenderComputeShader()
+ {
+ if (m_ShaderHandle) {
+ m_Backend->ReleaseComputeShader(m_ShaderHandle);
+ }
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderComputeShader.h b/src/render/Qt3DSRenderComputeShader.h
new file mode 100644
index 0000000..1ab36bc
--- /dev/null
+++ b/src/render/Qt3DSRenderComputeShader.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_COMPUTE_SHADER_H
+#define QT3DS_RENDER_COMPUTE_SHADER_H
+
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderShader.h"
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+
+ ///< This class represents a compute shader
+ class NVRenderComputeShader : public NVRenderShader
+ {
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] source Pointer to shader source code
+ * @param[in] binaryProgram true if this is a binary program
+ *
+ * @return No return.
+ */
+ NVRenderComputeShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram);
+
+ /// @brief destructor
+ ~NVRenderComputeShader();
+
+ /**
+ * @brief Query if shader compiled succesfuly
+ *
+ * @return True if shader is valid.
+ */
+ bool IsValid() override { return (m_ShaderHandle != NULL); }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendComputeShaderObject GetShaderHandle()
+ {
+ return m_ShaderHandle;
+ }
+
+ private:
+ NVRenderBackend::NVRenderBackendComputeShaderObject
+ m_ShaderHandle; ///< opaque backend handle
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderConstantBuffer.cpp b/src/render/Qt3DSRenderConstantBuffer.cpp
new file mode 100644
index 0000000..1b3c43a
--- /dev/null
+++ b/src/render/Qt3DSRenderConstantBuffer.cpp
@@ -0,0 +1,421 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderConstantBuffer.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+namespace qt3ds {
+namespace render {
+
+ ///< struct handling a constant buffer entry
+ class ConstantBufferParamEntry
+ {
+ public:
+ CRegisteredString m_Name; ///< parameter Name
+ NVRenderShaderDataTypes::Enum m_Type; ///< parameter type
+ QT3DSI32 m_Count; ///< one or array size
+ QT3DSI32 m_Offset; ///< offset into the memory buffer
+
+ ConstantBufferParamEntry(CRegisteredString name, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 count, QT3DSI32 offset)
+ : m_Name(name)
+ , m_Type(type)
+ , m_Count(count)
+ , m_Offset(offset)
+ {
+ }
+ };
+
+ NVRenderConstantBuffer::NVRenderConstantBuffer(NVRenderContextImpl &context,
+ CRegisteredString bufferName, size_t size,
+ NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data)
+ : NVRenderDataBuffer(context, context.GetFoundation(), size,
+ NVRenderBufferBindValues::Constant, usageType, NVDataRef<QT3DSU8>())
+ , m_Name(bufferName)
+ , m_ConstantBufferEntryMap(m_Foundation.getAllocator(),
+ "NVRenderConstantBuffer::m_ConstantBufferEntryMap")
+ , m_CurrentOffset(0)
+ , m_CurrentSize(0)
+ , m_HWBufferInitialized(false)
+ , m_Dirty(true)
+ , m_RangeStart(0)
+ , m_RangeEnd(0)
+ , m_MaxBlockSize(0)
+ {
+ QT3DS_ASSERT(context.GetConstantBufferSupport());
+
+ m_Backend->GetRenderBackendValue(
+ NVRenderBackend::NVRenderBackendQuery::MaxConstantBufferBlockSize, &m_MaxBlockSize);
+
+ if (size && data.size() && size == data.size()) {
+ QT3DS_ASSERT(size < (QT3DSU32)m_MaxBlockSize);
+ if (allocateShadowBuffer(data.size())) {
+ memcpy(m_ShadowCopy.begin(), data.begin(), data.size());
+ }
+ }
+ }
+
+ NVRenderConstantBuffer::~NVRenderConstantBuffer()
+ {
+ // check if we should release memory
+ if (m_ShadowCopy.size()) {
+ m_Foundation.getAllocator().deallocate(m_ShadowCopy.begin());
+ }
+
+ m_ShadowCopy = NVDataRef<QT3DSU8>();
+
+ for (TRenderConstantBufferEntryMap::iterator iter = m_ConstantBufferEntryMap.begin(),
+ end = m_ConstantBufferEntryMap.end();
+ iter != end; ++iter) {
+ NVDelete(m_Foundation.getAllocator(), iter->second);
+ }
+
+ m_ConstantBufferEntryMap.clear();
+
+ m_Context.BufferDestroyed(*this);
+ }
+
+ void NVRenderConstantBuffer::Bind()
+ {
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to Bind a locked buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ m_Backend->BindBuffer(m_BufferHandle, m_BindFlags);
+ }
+
+ void NVRenderConstantBuffer::BindToShaderProgram(NVRenderShaderProgram *inShader,
+ QT3DSU32 blockIndex, QT3DSU32 binding)
+ {
+ if ((QT3DSI32)binding == -1) {
+ binding = m_Context.GetNextConstantBufferUnit();
+ m_Backend->ProgramSetConstantBlock(inShader->GetShaderProgramHandle(), blockIndex,
+ binding);
+ }
+
+ m_Backend->ProgramSetConstantBuffer(binding, m_BufferHandle);
+ }
+
+ bool NVRenderConstantBuffer::SetupBuffer(NVRenderShaderProgram *pProgram, QT3DSI32 index,
+ QT3DSI32 bufSize, QT3DSI32 paramCount)
+ {
+ bool bSuccess = false;
+
+ if (!m_HWBufferInitialized) {
+ // allocate shadow buffer
+ QT3DSU8 *newMem = (QT3DSU8 *)m_Foundation.getAllocator().allocate(
+ bufSize, "NVRenderConstantBuffer", __FILE__, __LINE__);
+ if (!newMem)
+ return false;
+
+ // allocate temp buffers to hold constant buffer information
+ QT3DSI32 *theIndices = NULL, *theTypes = NULL, *theSizes = NULL, *theOffsets = NULL;
+ theIndices = (QT3DSI32 *)QT3DS_ALLOC(m_Foundation.getAllocator(), paramCount * sizeof(QT3DSI32),
+ "NVRenderConstantBuffer");
+ if (!theIndices)
+ goto fail;
+ theTypes = (QT3DSI32 *)QT3DS_ALLOC(m_Foundation.getAllocator(), paramCount * sizeof(QT3DSI32),
+ "NVRenderConstantBuffer");
+ if (!theTypes)
+ goto fail;
+ theSizes = (QT3DSI32 *)QT3DS_ALLOC(m_Foundation.getAllocator(), paramCount * sizeof(QT3DSI32),
+ "NVRenderConstantBuffer");
+ if (!theSizes)
+ goto fail;
+ theOffsets = (QT3DSI32 *)QT3DS_ALLOC(m_Foundation.getAllocator(), paramCount * sizeof(QT3DSI32),
+ "NVRenderConstantBuffer");
+ if (!theOffsets)
+ goto fail;
+
+ bSuccess = true;
+
+ // get indices for the individal constant buffer entries
+ m_Backend->GetConstantBufferParamIndices(pProgram->GetShaderProgramHandle(), index,
+ theIndices);
+
+ // get constant buffer uniform information
+ m_Backend->GetConstantBufferParamInfoByIndices(pProgram->GetShaderProgramHandle(),
+ paramCount, (QT3DSU32 *)theIndices,
+ theTypes, theSizes, theOffsets);
+
+ // get the names of the uniforms
+ char nameBuf[512];
+ QT3DSI32 elementCount, binding;
+ NVRenderShaderDataTypes::Enum type;
+
+ QT3DS_FOREACH(idx, paramCount)
+ {
+ m_Backend->GetConstantInfoByID(pProgram->GetShaderProgramHandle(), theIndices[idx],
+ 512, &elementCount, &type, &binding, nameBuf);
+ // check if we already have this entry
+ CRegisteredString theName(m_Context.GetStringTable().RegisterStr(nameBuf));
+ TRenderConstantBufferEntryMap::iterator entry =
+ m_ConstantBufferEntryMap.find(theName);
+ if (entry != m_ConstantBufferEntryMap.end()) {
+ ConstantBufferParamEntry *pParam = entry->second;
+ // copy content
+ if (m_ShadowCopy.size())
+ memcpy(newMem + theOffsets[idx],
+ m_ShadowCopy.begin() + entry->second->m_Offset,
+ entry->second->m_Count * getUniformTypeSize(pParam->m_Type));
+
+ pParam->m_Offset = theOffsets[idx];
+ QT3DS_ASSERT(type == pParam->m_Type);
+ QT3DS_ASSERT(elementCount == pParam->m_Count);
+ } else {
+ // create one
+ m_ConstantBufferEntryMap.insert(eastl::make_pair(
+ theName,
+ createParamEntry(theName, (NVRenderShaderDataTypes::Enum)theTypes[idx],
+ theSizes[idx], theOffsets[idx])));
+ }
+ }
+
+ // release previous one
+ if (m_ShadowCopy.size()) {
+ m_Foundation.getAllocator().deallocate(m_ShadowCopy.begin());
+ }
+ // set new one
+ m_ShadowCopy = NVDataRef<QT3DSU8>(newMem, bufSize);
+
+ m_HWBufferInitialized = true;
+
+ fail:
+ if (theIndices)
+ QT3DS_FREE(m_Foundation.getAllocator(), theIndices);
+ if (theTypes)
+ QT3DS_FREE(m_Foundation.getAllocator(), theTypes);
+ if (theSizes)
+ QT3DS_FREE(m_Foundation.getAllocator(), theSizes);
+ if (theOffsets)
+ QT3DS_FREE(m_Foundation.getAllocator(), theOffsets);
+
+ } else {
+ // some sanity checks
+ bSuccess = true;
+ bSuccess &= (m_ShadowCopy.size() <= (QT3DSU32)bufSize);
+ }
+
+ return bSuccess;
+ }
+
+ void NVRenderConstantBuffer::Update()
+ {
+ // we only update the buffer if the buffer is already on hardware
+ // and if it is dirty
+ if (m_Dirty && m_HWBufferInitialized) {
+ if (m_RangeEnd == 0)
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, m_ShadowCopy.size(),
+ m_UsageType, m_ShadowCopy.begin());
+ else
+ UpdateRange();
+
+ m_Dirty = false;
+ m_RangeStart = m_RangeEnd = 0;
+ }
+ }
+
+ void NVRenderConstantBuffer::UpdateRange()
+ {
+ if ((m_RangeStart + m_RangeEnd) > m_ShadowCopy.size()) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ m_Backend->UpdateBufferRange(m_BufferHandle, m_BindFlags, m_RangeStart,
+ m_RangeEnd - m_RangeStart,
+ m_ShadowCopy.begin() + m_RangeStart);
+ }
+
+ void NVRenderConstantBuffer::AddParam(CRegisteredString name,
+ NVRenderShaderDataTypes::Enum type, QT3DSI32 count)
+ {
+ if (m_ConstantBufferEntryMap.find(name) == m_ConstantBufferEntryMap.end()) {
+ ConstantBufferParamEntry *newEntry =
+ QT3DS_NEW(m_Foundation.getAllocator(), ConstantBufferParamEntry)(name, type, count,
+ m_CurrentOffset);
+
+ if (newEntry)
+ m_ConstantBufferEntryMap.insert(eastl::make_pair(name, newEntry));
+ } else {
+ // no duplicated entries
+ return;
+ }
+
+ // compute new current buffer size and offset
+ QT3DSI32 constantSize = getUniformTypeSize(type) * count;
+ m_CurrentSize += constantSize;
+ m_CurrentOffset += constantSize;
+ }
+
+ void NVRenderConstantBuffer::UpdateParam(const char *inName, NVDataRef<QT3DSU8> value)
+ {
+ // allocate space if not done yet
+ // NOTE this gets reallocated once we get the real constant buffer size from a program
+ if (!m_ShadowCopy.size()) {
+ // allocate shadow buffer
+ if (!allocateShadowBuffer(m_CurrentSize))
+ return;
+ }
+
+ CRegisteredString theName(m_Context.GetStringTable().RegisterStr(inName));
+ TRenderConstantBufferEntryMap::iterator entry = m_ConstantBufferEntryMap.find(theName);
+ if (entry != m_ConstantBufferEntryMap.end()) {
+ if (!memcmp(m_ShadowCopy.begin() + entry->second->m_Offset, value.begin(),
+ entry->second->m_Count * getUniformTypeSize(entry->second->m_Type))) {
+ return;
+ }
+ memcpy(m_ShadowCopy.begin() + entry->second->m_Offset, value.begin(),
+ entry->second->m_Count * getUniformTypeSize(entry->second->m_Type));
+ m_Dirty = true;
+ }
+ }
+
+ void NVRenderConstantBuffer::UpdateRaw(QT3DSI32 offset, NVDataRef<QT3DSU8> data)
+ {
+ // allocate space if yet done
+ if (!m_ShadowCopy.size()) {
+ // allocate shadow buffer
+ if (!allocateShadowBuffer(data.size()))
+ return;
+ }
+
+ QT3DS_ASSERT((offset + data.size()) < (QT3DSU32)m_MaxBlockSize);
+
+ // we do not initialize anything when this is used
+ m_HWBufferInitialized = true;
+
+ // we do not allow resize once allocated
+ if ((offset + data.size()) > m_ShadowCopy.size())
+ return;
+
+ // copy data
+ if (!memcmp(m_ShadowCopy.begin() + offset, data.begin(), data.size())) {
+ return;
+ }
+ memcpy(m_ShadowCopy.begin() + offset, data.begin(), data.size());
+
+ // update start
+ m_RangeStart = (m_Dirty) ? (m_RangeStart > (QT3DSU32)offset) ? offset : m_RangeStart : offset;
+ m_RangeEnd = (offset + data.size() > m_RangeEnd) ? offset + data.size() : m_RangeEnd;
+
+ m_Dirty = true;
+ }
+
+ ConstantBufferParamEntry *NVRenderConstantBuffer::createParamEntry(
+ CRegisteredString name, NVRenderShaderDataTypes::Enum type, QT3DSI32 count, QT3DSI32 offset)
+ {
+ ConstantBufferParamEntry *newEntry = QT3DS_NEW(
+ m_Foundation.getAllocator(), ConstantBufferParamEntry)(name, type, count, offset);
+
+ return newEntry;
+ }
+
+ QT3DSI32
+ NVRenderConstantBuffer::getUniformTypeSize(NVRenderShaderDataTypes::Enum type)
+ {
+ switch (type) {
+ case NVRenderShaderDataTypes::QT3DSF32:
+ return sizeof(QT3DSF32);
+ case NVRenderShaderDataTypes::QT3DSI32:
+ return sizeof(QT3DSI32);
+ case NVRenderShaderDataTypes::QT3DSI32_2:
+ return sizeof(QT3DSI32) * 2;
+ case NVRenderShaderDataTypes::QT3DSI32_3:
+ return sizeof(QT3DSI32) * 3;
+ case NVRenderShaderDataTypes::QT3DSI32_4:
+ return sizeof(QT3DSI32) * 4;
+ case NVRenderShaderDataTypes::QT3DSU32:
+ return sizeof(QT3DSU32);
+ case NVRenderShaderDataTypes::QT3DSU32_2:
+ return sizeof(QT3DSU32) * 2;
+ case NVRenderShaderDataTypes::QT3DSU32_3:
+ return sizeof(QT3DSU32) * 3;
+ case NVRenderShaderDataTypes::QT3DSU32_4:
+ return sizeof(QT3DSU32) * 4;
+ case NVRenderShaderDataTypes::QT3DSVec2:
+ return sizeof(QT3DSF32) * 2;
+ case NVRenderShaderDataTypes::QT3DSVec3:
+ return sizeof(QT3DSF32) * 3;
+ case NVRenderShaderDataTypes::QT3DSVec4:
+ return sizeof(QT3DSF32) * 4;
+ case NVRenderShaderDataTypes::QT3DSMat33:
+ return sizeof(QT3DSF32) * 9;
+ case NVRenderShaderDataTypes::QT3DSMat44:
+ return sizeof(QT3DSF32) * 16;
+ default:
+ QT3DS_ASSERT(!"Unhandled type in NVRenderConstantBuffer::getUniformTypeSize");
+ break;
+ }
+
+ return 0;
+ }
+
+ bool NVRenderConstantBuffer::allocateShadowBuffer(QT3DSU32 size)
+ {
+ // allocate shadow buffer
+ QT3DSU8 *newMem = (QT3DSU8 *)m_Foundation.getAllocator().allocate(size, "NVRenderConstantBuffer",
+ __FILE__, __LINE__);
+ if (!newMem)
+ return false;
+
+ m_ShadowCopy = NVDataRef<QT3DSU8>(newMem, size);
+
+ m_BufferCapacity = size;
+
+ return true;
+ }
+
+ NVRenderConstantBuffer *NVRenderConstantBuffer::Create(NVRenderContextImpl &context,
+ const char *bufferName,
+ NVRenderBufferUsageType::Enum usageType,
+ size_t size,
+ NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVFoundationBase &fnd(context.GetFoundation());
+ NVRenderConstantBuffer *retval = NULL;
+
+ if (context.GetConstantBufferSupport()) {
+ CRegisteredString theBufferName(context.GetStringTable().RegisterStr(bufferName));
+ QT3DSU32 cbufSize = sizeof(NVRenderConstantBuffer);
+ QT3DSU8 *newMem = (QT3DSU8 *)QT3DS_ALLOC(fnd.getAllocator(), cbufSize, "ConstantBuffer");
+ retval = new (newMem) NVRenderConstantBuffer(
+ context, theBufferName, size, usageType,
+ toDataRef(const_cast<QT3DSU8 *>(bufferData.begin()), bufferData.size()));
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderConstantBuffer.h b/src/render/Qt3DSRenderConstantBuffer.h
new file mode 100644
index 0000000..5ede23b
--- /dev/null
+++ b/src/render/Qt3DSRenderConstantBuffer.h
@@ -0,0 +1,248 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_CONSTANT_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_CONSTANT_BUFFER_H
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Utils.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderDataBuffer.h"
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ // forward declaration
+ class NVRenderContextImpl;
+ class ConstantBufferParamEntry;
+ class NVRenderShaderProgram;
+
+ typedef nvhash_map<CRegisteredString, ConstantBufferParamEntry *> TRenderConstantBufferEntryMap;
+
+ ///< Constant (uniform) buffer representation
+ class QT3DS_AUTOTEST_EXPORT NVRenderConstantBuffer : public NVRenderDataBuffer
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] bufferName Name of the buffer. Must match the name used in programs
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return.
+ */
+ NVRenderConstantBuffer(NVRenderContextImpl &context, CRegisteredString bufferName,
+ size_t size, NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data);
+
+ ///< destructor
+ virtual ~NVRenderConstantBuffer();
+
+ /**
+ * @brief bind the buffer bypasses the context state
+ *
+ * @return no return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief bind the buffer to a shader program
+ *
+ * @param[in] inShader Pointer to active program
+ * @param[in] blockIndex Index of the constant block within the program
+ * @param[in] binding Binding point of constant buffer
+ *
+ * @return no return.
+ */
+ virtual void BindToShaderProgram(NVRenderShaderProgram *inShader, QT3DSU32 blockIndex,
+ QT3DSU32 binding);
+
+ /**
+ * @brief update the buffer to hardware
+ *
+ * @return no return.
+ */
+ virtual void Update();
+
+ /**
+ * @brief setup constant buffer
+ *
+ * @param[in] pProgram Pointer to the shader program
+ * @param[in] index Index of the constant buffer within the program
+ * @param[in] bufSize Size of the constant buffer
+ * @param[in] paramCount Parameter entry count of the constant buffer
+ *
+ * @return return if successful
+ */
+ bool SetupBuffer(NVRenderShaderProgram *pProgram, QT3DSI32 index, QT3DSI32 bufSize,
+ QT3DSI32 paramCount);
+
+ /**
+ * @brief add a parameter to the constant buffer
+ *
+ * @param[in] name Name of the parameter (must match the name in the shader
+ * program)
+ * @param[in] type Type of the parameter like Mat44
+ * @param[in] count One or size of array
+ *
+ * @return no return
+ */
+ void AddParam(CRegisteredString name, NVRenderShaderDataTypes::Enum type, QT3DSI32 count);
+
+ /**
+ * @brief update a parameter in the constant buffer
+ *
+ * @param[in] name Name of the parameter (must match the name in the shader
+ * program)
+ * @param[in] value New value
+ *
+ * @return no return
+ */
+ void UpdateParam(const char *name, NVDataRef<QT3DSU8> value);
+
+ /**
+ * @brief update a piece of memory directly within the constant buffer
+ *
+ * Note: When you use this function you should know what you are doing.
+ * The memory layout within C++ must exactly match the memory layout in the
+ *shader.
+ * We use std140 layout which guarantees a specific layout behavior across all
+ *HW vendors.
+ * How the memory layout is computed can be found in the GL spec.
+ *
+ * @param[in] offset offset into constant buffer
+ * @param[in] data pointer to new data
+ *
+ * @return no return
+ */
+ void UpdateRaw(QT3DSI32 offset, NVDataRef<QT3DSU8> data);
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendBufferObject GetBuffertHandle() const override
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_BufferHandle);
+ }
+
+ /**
+ * @brief create a NVRenderConstantBuffer object
+ *
+ * @param[in] context Pointer to context
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return the backend object handle.
+ */
+ static NVRenderConstantBuffer *Create(NVRenderContextImpl &context, const char *bufferName,
+ NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData);
+
+ /**
+ * @brief get the buffer name
+ *
+ * @return the buffer name
+ */
+ CRegisteredString GetBufferName() const { return m_Name; }
+
+ private:
+ /**
+ * @brief Create a parameter entry
+ *
+ * @param[in] name Name of the parameter (must match the name in the shader
+ * program)
+ * @param[in] type Type of the parameter like Mat44
+ * @param[in] count One or size of array
+ * @param[in] offset Offset of the parameter in the memory buffer
+ *
+ * @return return new Entry
+ */
+ ConstantBufferParamEntry *createParamEntry(CRegisteredString name,
+ NVRenderShaderDataTypes::Enum type, QT3DSI32 count,
+ QT3DSI32 offset);
+
+ /**
+ * @brief get size of a uniform type
+ *
+ * @param[in] type type of uniform
+ *
+ * @return return uniform size
+ */
+ QT3DSI32
+ getUniformTypeSize(NVRenderShaderDataTypes::Enum type);
+
+ /**
+ * @brief allocate the shadow buffer
+ *
+ * @param[in] size size of buffer
+ *
+ * @return return true on success
+ */
+ bool allocateShadowBuffer(QT3DSU32 size);
+
+ /**
+ * @brief update a certain range of the buffer to hardware
+ *
+ * @return no return.
+ */
+ virtual void UpdateRange();
+
+ private:
+ CRegisteredString m_Name; ///< buffer name
+ TRenderConstantBufferEntryMap
+ m_ConstantBufferEntryMap; ///< holds the entries of a constant buffer
+ QT3DSU32 m_CurrentOffset; ///< holds the current offset
+ QT3DSU32 m_CurrentSize; ///< holds the current size
+ bool m_HWBufferInitialized; ///< true if the hardware version of the buffer is initialized
+ bool m_Dirty; ///< true if buffer is dirty
+ QT3DSU32 m_RangeStart; ///< start offset of the range to update
+ QT3DSU32 m_RangeEnd; ///< size of the range to update
+ QT3DSI32 m_MaxBlockSize; ///< maximum size for a single constant buffer
+ NVDataRef<QT3DSU8> m_ShadowCopy; ///< host copy of the data in the GPU
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderContext.cpp b/src/render/Qt3DSRenderContext.cpp
new file mode 100644
index 0000000..aa2cb30
--- /dev/null
+++ b/src/render/Qt3DSRenderContext.cpp
@@ -0,0 +1,1107 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSMat44.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Utils.h"
+#include "EASTL/set.h"
+#include "EASTL/utility.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace eastl;
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderContextImpl::NVRenderContextImpl(NVFoundationBase &fnd, NVRenderBackend &inBackend,
+ IStringTable &inStrTable)
+ : m_backend(inBackend)
+ , m_DirtyFlags(0)
+ , m_DefaultOffscreenRenderTarget((NVRenderBackend::NVRenderBackendRenderTargetObject)NULL)
+ , m_DephBits(16)
+ , m_StencilBits(8)
+ , mRefCount(0)
+ , m_Foundation(fnd)
+ , m_StringTable(inStrTable)
+ , m_VertToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_VertToImpMap")
+ , m_IndexToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_IndexToImpMap")
+ , m_ConstantToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_ConstantToImpMap")
+ , m_StorageToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_StorageToImpMap")
+ , m_AtomicCounterToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_AtomicCounterToImpMap")
+ , m_DrawIndirectToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_DrawIndirectToImpMap")
+ , m_DepthStencilStateToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_DepthStencilStateToImpMap")
+ , m_RasterizerStateToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_RasterizerStateToImpMap")
+ , m_PathFontSpecToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_RasterizerStateToImpMap")
+ , m_Tex2DToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_Tex2DToImpMap")
+ , m_Tex2DArrayToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_Tex2DArrayToImpMap")
+ , m_TexCubeToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_TexCubeToImpMap")
+ , m_Image2DtoImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_Image2DtoImpMap")
+ , m_ShaderToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_ShaderToImpMap")
+ , m_RenderBufferToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_RenderBufferToImpMap")
+ , m_FrameBufferToImpMap(m_Foundation.getAllocator(),
+ "NVRenderContextImpl::m_FrameBufferToImpMap")
+ , m_NextTextureUnit(1)
+ , m_NextConstantBufferUnit(1)
+ , m_PropertyStack(m_Foundation.getAllocator(), "NVRenderContextImpl::m_PropertyStack")
+ {
+
+ m_StringTable.addRef();
+
+ m_MaxTextureUnits = m_backend->GetMaxCombinedTextureUnits();
+ m_MaxConstantBufferUnits = 16; // need backend query
+
+ // get initial state
+ memZero(&m_HardwarePropertyContext, sizeof(m_HardwarePropertyContext));
+
+ // get default blending functions
+ m_backend->GetBlendFunc(&m_HardwarePropertyContext.m_BlendFunction);
+ // set default blend euqation
+ m_HardwarePropertyContext.m_BlendEquation.m_RGBEquation = NVRenderBlendEquation::Add;
+ m_HardwarePropertyContext.m_BlendEquation.m_AlphaEquation = NVRenderBlendEquation::Add;
+ // default state
+ m_HardwarePropertyContext.m_CullingEnabled =
+ m_backend->GetRenderState(NVRenderState::CullFace);
+ m_HardwarePropertyContext.m_DepthFunction = m_backend->GetDepthFunc();
+ m_HardwarePropertyContext.m_BlendingEnabled =
+ m_backend->GetRenderState(NVRenderState::Blend);
+ m_HardwarePropertyContext.m_DepthWriteEnabled = m_backend->GetDepthWrite();
+ m_HardwarePropertyContext.m_DepthTestEnabled =
+ m_backend->GetRenderState(NVRenderState::DepthTest);
+ m_HardwarePropertyContext.m_ScissorTestEnabled =
+ m_backend->GetRenderState(NVRenderState::ScissorTest);
+ m_backend->GetScissorRect(&m_HardwarePropertyContext.m_ScissorRect);
+ m_backend->GetViewportRect(&m_HardwarePropertyContext.m_Viewport);
+
+ DoSetClearColor(m_HardwarePropertyContext.m_ClearColor);
+ }
+
+ NVRenderContextImpl::~NVRenderContextImpl()
+ {
+ m_StringTable.release();
+ QT3DS_ASSERT(m_VertToImpMap.size() == 0);
+ m_VertToImpMap.clear();
+ QT3DS_ASSERT(m_IndexToImpMap.size() == 0);
+ m_IndexToImpMap.clear();
+ QT3DS_ASSERT(m_ConstantToImpMap.size() == 0);
+ m_ConstantToImpMap.clear();
+ QT3DS_ASSERT(m_StorageToImpMap.size() == 0);
+ m_StorageToImpMap.clear();
+ QT3DS_ASSERT(m_DepthStencilStateToImpMap.size() == 0);
+ m_DepthStencilStateToImpMap.clear();
+ QT3DS_ASSERT(m_RasterizerStateToImpMap.size() == 0);
+ m_RasterizerStateToImpMap.clear();
+ QT3DS_ASSERT(m_PathFontSpecToImpMap.size() == 0);
+ m_PathFontSpecToImpMap.clear();
+ QT3DS_ASSERT(m_Tex2DToImpMap.size() == 0);
+ m_Tex2DToImpMap.clear();
+ QT3DS_ASSERT(m_Tex2DArrayToImpMap.size() == 0);
+ m_Tex2DArrayToImpMap.clear();
+ QT3DS_ASSERT(m_Image2DtoImpMap.size() == 0);
+ m_Image2DtoImpMap.clear();
+ QT3DS_ASSERT(m_ShaderToImpMap.size() == 0);
+ m_ShaderToImpMap.clear();
+ QT3DS_ASSERT(m_RenderBufferToImpMap.size() == 0);
+ m_RenderBufferToImpMap.clear();
+ QT3DS_ASSERT(m_FrameBufferToImpMap.size() == 0);
+ m_FrameBufferToImpMap.clear();
+
+ m_backend = NULL;
+ }
+
+ void NVRenderContextImpl::getMaxTextureSize(QT3DSU32 &oWidth, QT3DSU32 &oHeight)
+ {
+ QT3DSI32 theMaxTextureSize = 0;
+ m_backend->GetRenderBackendValue(NVRenderBackend::NVRenderBackendQuery::MaxTextureSize,
+ &theMaxTextureSize);
+
+ oWidth = (QT3DSU32)theMaxTextureSize;
+ oHeight = (QT3DSU32)theMaxTextureSize;
+ }
+
+ NVRenderDepthStencilState *NVRenderContextImpl::CreateDepthStencilState(
+ bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc, bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack)
+ {
+ NVRenderDepthStencilState *state = NVRenderDepthStencilState::Create(
+ *this, enableDepth, depthMask, depthFunc, enableStencil, stencilFuncFront,
+ stencilFuncBack, depthStencilOpFront, depthStencilOpBack);
+ if (state)
+ m_DepthStencilStateToImpMap.insert(
+ make_pair(state->GetDepthStencilObjectHandle(), state));
+
+ return state;
+ }
+
+ void NVRenderContextImpl::SetDepthStencilState(NVRenderDepthStencilState *inDepthStencilState)
+ {
+ if (inDepthStencilState) {
+ m_backend->SetDepthStencilState(inDepthStencilState->GetDepthStencilObjectHandle());
+ // currently we have a mixture therefore we need to update the context state
+ SetDepthFunction(inDepthStencilState->GetDepthFunc());
+ SetDepthWriteEnabled(inDepthStencilState->GetDepthMask());
+ SetDepthTestEnabled(inDepthStencilState->GetDepthEnabled());
+ SetStencilTestEnabled(inDepthStencilState->GetStencilEnabled());
+ }
+ }
+
+ void NVRenderContextImpl::StateDestroyed(NVRenderDepthStencilState &state)
+ {
+ m_DepthStencilStateToImpMap.erase(state.GetDepthStencilObjectHandle());
+ }
+
+ NVRenderRasterizerState *
+ NVRenderContextImpl::CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace)
+ {
+ NVRenderRasterizerState *state =
+ NVRenderRasterizerState::Create(*this, depthBias, depthScale, cullFace);
+ if (state)
+ m_RasterizerStateToImpMap.insert(make_pair(state->GetRasterizerObjectHandle(), state));
+
+ return state;
+ }
+
+ void NVRenderContextImpl::SetRasterizerState(NVRenderRasterizerState *inRasterizerState)
+ {
+ if (inRasterizerState)
+ m_backend->SetRasterizerState(inRasterizerState->GetRasterizerObjectHandle());
+ }
+
+ void NVRenderContextImpl::StateDestroyed(NVRenderRasterizerState &state)
+ {
+ m_RasterizerStateToImpMap.erase(state.GetRasterizerObjectHandle());
+ }
+
+ NVRenderVertexBuffer *
+ NVRenderContextImpl::CreateVertexBuffer(NVRenderBufferUsageType::Enum usageType, size_t size,
+ QT3DSU32 stride, NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVRenderVertexBuffer *buffer =
+ NVRenderVertexBuffer::Create(*this, usageType, size, stride, bufferData);
+ if (buffer)
+ m_VertToImpMap.insert(make_pair(buffer->GetImplementationHandle(), buffer));
+ return buffer;
+ }
+
+ NVRenderVertexBuffer *NVRenderContextImpl::GetVertexBuffer(const void *implementationHandle)
+ {
+ nvhash_map<const void *, NVRenderVertexBuffer *>::const_iterator entry =
+ m_VertToImpMap.find(implementationHandle);
+ if (entry != m_VertToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::BufferDestroyed(NVRenderVertexBuffer &buffer)
+ {
+ m_VertToImpMap.erase(buffer.GetImplementationHandle());
+ }
+
+ NVRenderIndexBuffer *
+ NVRenderContextImpl::CreateIndexBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType,
+ qt3ds::render::NVRenderComponentTypes::Enum componentType,
+ size_t size, NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVRenderIndexBuffer *buffer =
+ NVRenderIndexBuffer::Create(*this, usageType, componentType, size, bufferData);
+
+ if (buffer) {
+ m_IndexToImpMap.insert(make_pair(buffer->GetImplementationHandle(), buffer));
+ }
+
+ return buffer;
+ }
+
+ NVRenderIndexBuffer *NVRenderContextImpl::GetIndexBuffer(const void *implementationHandle)
+ {
+ const nvhash_map<const void *, NVRenderIndexBuffer *>::iterator entry =
+ m_IndexToImpMap.find(implementationHandle);
+ if (entry != m_IndexToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::BufferDestroyed(NVRenderIndexBuffer &buffer)
+ {
+ m_IndexToImpMap.erase(buffer.GetImplementationHandle());
+ }
+
+ NVRenderConstantBuffer *
+ NVRenderContextImpl::CreateConstantBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType,
+ size_t size, NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVRenderConstantBuffer *buffer =
+ NVRenderConstantBuffer::Create(*this, bufferName, usageType, size, bufferData);
+
+ if (buffer) {
+ m_ConstantToImpMap.insert(make_pair(buffer->GetBufferName(), buffer));
+ }
+
+ return buffer;
+ }
+
+ NVRenderConstantBuffer *NVRenderContextImpl::GetConstantBuffer(CRegisteredString bufferName)
+ {
+ TContextConstantBufferMap::iterator entry = m_ConstantToImpMap.find(bufferName);
+ if (entry != m_ConstantToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::BufferDestroyed(NVRenderConstantBuffer &buffer)
+ {
+ m_ConstantToImpMap.erase(buffer.GetBufferName());
+ }
+
+ QT3DSU32 NVRenderContextImpl::GetNextConstantBufferUnit()
+ {
+ QT3DSU32 retval = m_NextConstantBufferUnit;
+ ++m_NextConstantBufferUnit;
+ // Too many texture units for a single draw call.
+ if (retval >= m_MaxConstantBufferUnits) {
+ QT3DS_ASSERT(false);
+ retval = retval % m_MaxConstantBufferUnits;
+ }
+ return retval;
+ }
+
+ NVRenderStorageBuffer *NVRenderContextImpl::CreateStorageBuffer(
+ const char *bufferName, qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData, NVRenderDataBuffer *pBuffer)
+ {
+ NVRenderStorageBuffer *buffer =
+ NVRenderStorageBuffer::Create(*this, bufferName, usageType, size, bufferData, pBuffer);
+
+ if (buffer) {
+ m_StorageToImpMap.insert(make_pair(buffer->GetBufferName(), buffer));
+ }
+
+ return buffer;
+ }
+
+ NVRenderStorageBuffer *NVRenderContextImpl::GetStorageBuffer(CRegisteredString bufferName)
+ {
+ TContextStorageBufferMap::iterator entry = m_StorageToImpMap.find(bufferName);
+ if (entry != m_StorageToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::BufferDestroyed(NVRenderStorageBuffer &buffer)
+ {
+ m_StorageToImpMap.erase(buffer.GetBufferName());
+ }
+
+ NVRenderAtomicCounterBuffer *NVRenderContextImpl::CreateAtomicCounterBuffer(
+ const char *bufferName, qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVRenderAtomicCounterBuffer *buffer =
+ NVRenderAtomicCounterBuffer::Create(*this, bufferName, usageType, size, bufferData);
+
+ if (buffer) {
+ m_AtomicCounterToImpMap.insert(make_pair(buffer->GetBufferName(), buffer));
+ }
+
+ return buffer;
+ }
+
+ NVRenderAtomicCounterBuffer *
+ NVRenderContextImpl::GetAtomicCounterBuffer(CRegisteredString bufferName)
+ {
+ TContextAtomicCounterBufferMap::iterator entry = m_AtomicCounterToImpMap.find(bufferName);
+ if (entry != m_AtomicCounterToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ NVRenderAtomicCounterBuffer *
+ NVRenderContextImpl::GetAtomicCounterBufferByParam(CRegisteredString paramName)
+ {
+ // iterate through all atomic counter buffers
+ for (TContextAtomicCounterBufferMap::iterator iter = m_AtomicCounterToImpMap.begin(),
+ end = m_AtomicCounterToImpMap.end();
+ iter != end; ++iter) {
+ if (iter->second && iter->second->ContainsParam(paramName))
+ return iter->second;
+ }
+
+ return NULL;
+ }
+
+ void NVRenderContextImpl::BufferDestroyed(NVRenderAtomicCounterBuffer &buffer)
+ {
+ m_AtomicCounterToImpMap.erase(buffer.GetBufferName());
+ }
+
+ NVRenderDrawIndirectBuffer *NVRenderContextImpl::CreateDrawIndirectBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVRenderDrawIndirectBuffer *buffer =
+ NVRenderDrawIndirectBuffer::Create(*this, usageType, size, bufferData);
+
+ if (buffer) {
+ m_DrawIndirectToImpMap.insert(make_pair(buffer->GetBuffertHandle(), buffer));
+ }
+
+ return buffer;
+ }
+
+ NVRenderDrawIndirectBuffer *NVRenderContextImpl::GetDrawIndirectBuffer(
+ NVRenderBackend::NVRenderBackendBufferObject implementationHandle)
+ {
+ TContextDrawIndirectBufferMap::iterator entry =
+ m_DrawIndirectToImpMap.find(implementationHandle);
+ if (entry != m_DrawIndirectToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::BufferDestroyed(NVRenderDrawIndirectBuffer &buffer)
+ {
+ m_DrawIndirectToImpMap.erase(buffer.GetBuffertHandle());
+ }
+
+ void NVRenderContextImpl::SetMemoryBarrier(NVRenderBufferBarrierFlags barriers)
+ {
+ m_backend->SetMemoryBarrier(barriers);
+ }
+
+ NVRenderOcclusionQuery *NVRenderContextImpl::CreateOcclusionQuery()
+ {
+ NVRenderOcclusionQuery *theQuery = NVRenderOcclusionQuery::Create(*this);
+
+ return theQuery;
+ }
+
+ NVRenderTimerQuery *NVRenderContextImpl::CreateTimerQuery()
+ {
+ NVRenderTimerQuery *theQuery = NVRenderTimerQuery::Create(*this);
+
+ return theQuery;
+ }
+
+ NVRenderSync *NVRenderContextImpl::CreateSync()
+ {
+ NVRenderSync *theSync = NVRenderSync::Create(*this);
+
+ return theSync;
+ }
+
+ NVRenderTexture2D *NVRenderContextImpl::CreateTexture2D()
+ {
+ NVRenderTexture2D *retval = NVRenderTexture2D::Create(*this);
+ if (retval)
+ m_Tex2DToImpMap.insert(make_pair(retval->GetImplementationHandle(), retval));
+ return retval;
+ }
+
+ NVRenderTexture2DArray *NVRenderContextImpl::CreateTexture2DArray()
+ {
+ NVRenderTexture2DArray *retval = NVRenderTexture2DArray::Create(*this);
+ if (retval)
+ m_Tex2DArrayToImpMap.insert(make_pair(retval->GetTextureObjectHandle(), retval));
+
+ return retval;
+ }
+
+ NVRenderTextureCube *NVRenderContextImpl::CreateTextureCube()
+ {
+ NVRenderTextureCube *retval = NVRenderTextureCube::Create(*this);
+ if (retval)
+ m_TexCubeToImpMap.insert(make_pair(retval->GetTextureObjectHandle(), retval));
+
+ return retval;
+ }
+
+ NVRenderTexture2D *NVRenderContextImpl::GetTexture2D(const void *implementationHandle)
+ {
+ const nvhash_map<const void *, NVRenderTexture2D *>::iterator entry =
+ m_Tex2DToImpMap.find(implementationHandle);
+ if (entry != m_Tex2DToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::TextureDestroyed(NVRenderTexture2D &buffer)
+ {
+ m_Tex2DToImpMap.erase(buffer.GetImplementationHandle());
+ // We would like to find and catch any situations where this texture is being used
+ // but that would require some real work that we don't want to do right now.
+ }
+
+ void NVRenderContextImpl::TextureDestroyed(NVRenderTexture2DArray &buffer)
+ {
+ m_Tex2DArrayToImpMap.erase(buffer.GetTextureObjectHandle());
+ }
+
+ void NVRenderContextImpl::TextureDestroyed(NVRenderTextureCube &buffer)
+ {
+ m_TexCubeToImpMap.erase(buffer.GetTextureObjectHandle());
+ }
+
+ NVRenderImage2D *NVRenderContextImpl::CreateImage2D(NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess)
+ {
+ NVRenderImage2D *retval = NVRenderImage2D::Create(*this, inTexture, inAccess);
+ if (retval)
+ m_Image2DtoImpMap.insert(make_pair(retval->GetTextureObjectHandle(), retval));
+
+ return retval;
+ }
+
+ void NVRenderContextImpl::ImageDestroyed(NVRenderImage2D &image)
+ {
+ m_Image2DtoImpMap.erase(image.GetTextureObjectHandle());
+ }
+
+ // IF this texture isn't on a texture unit, put it on one.
+ // If it is on a texture unit, mark it as the most recently used texture.
+ QT3DSU32 NVRenderContextImpl::GetNextTextureUnit()
+ {
+ QT3DSU32 retval = m_NextTextureUnit;
+ ++m_NextTextureUnit;
+ // Too many texture units for a single draw call.
+ if (retval >= m_MaxTextureUnits) {
+ QT3DS_ASSERT(false);
+ retval = retval % m_MaxTextureUnits;
+ }
+ return retval;
+ }
+
+ NVRenderRenderBuffer *
+ NVRenderContextImpl::CreateRenderBuffer(NVRenderRenderBufferFormats::Enum bufferFormat,
+ QT3DSU32 width, QT3DSU32 height)
+ {
+ NVRenderRenderBuffer *retval =
+ NVRenderRenderBuffer::Create(*this, bufferFormat, width, height);
+ if (retval != NULL)
+ m_RenderBufferToImpMap.insert(make_pair(retval->GetImplementationHandle(), retval));
+ return retval;
+ }
+
+ NVRenderRenderBuffer *NVRenderContextImpl::GetRenderBuffer(const void *implementationHandle)
+ {
+ const nvhash_map<const void *, NVRenderRenderBuffer *>::iterator entry =
+ m_RenderBufferToImpMap.find(implementationHandle);
+ if (entry != m_RenderBufferToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::RenderBufferDestroyed(NVRenderRenderBuffer &buffer)
+ {
+ m_RenderBufferToImpMap.erase(buffer.GetImplementationHandle());
+ }
+
+ NVRenderFrameBuffer *NVRenderContextImpl::CreateFrameBuffer()
+ {
+ NVRenderFrameBuffer *retval = NVRenderFrameBuffer::Create(*this);
+ if (retval != NULL)
+ m_FrameBufferToImpMap.insert(make_pair(retval->GetImplementationHandle(), retval));
+ return retval;
+ }
+
+ NVRenderFrameBuffer *NVRenderContextImpl::GetFrameBuffer(const void *implementationHandle)
+ {
+ const nvhash_map<const void *, NVRenderFrameBuffer *>::iterator entry =
+ m_FrameBufferToImpMap.find(implementationHandle);
+ if (entry != m_FrameBufferToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::FrameBufferDestroyed(NVRenderFrameBuffer &fb)
+ {
+ m_FrameBufferToImpMap.erase(fb.GetImplementationHandle());
+ if (m_HardwarePropertyContext.m_FrameBuffer == &fb)
+ m_HardwarePropertyContext.m_FrameBuffer = NULL;
+ }
+
+ NVRenderAttribLayout *
+ NVRenderContextImpl::CreateAttributeLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs)
+ {
+ return QT3DS_NEW(GetFoundation().getAllocator(), NVRenderAttribLayout)(*this, attribs);
+ }
+
+ NVRenderInputAssembler *NVRenderContextImpl::CreateInputAssembler(
+ NVRenderAttribLayout *attribLayout, NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer, NVConstDataRef<QT3DSU32> strides,
+ NVConstDataRef<QT3DSU32> offsets, NVRenderDrawMode::Enum primType, QT3DSU32 patchVertexCount)
+ {
+ return QT3DS_NEW(GetFoundation().getAllocator(),
+ NVRenderInputAssembler)(*this, attribLayout, buffers, indexBuffer, strides,
+ offsets, primType, patchVertexCount);
+ }
+
+ void NVRenderContextImpl::SetInputAssembler(NVRenderInputAssembler *inputAssembler)
+ {
+ if (m_HardwarePropertyContext.m_InputAssembler != inputAssembler) {
+ DoSetInputAssembler(inputAssembler);
+ }
+ }
+
+ NVRenderVertFragCompilationResult NVRenderContextImpl::CompileSource(
+ const char *shaderName, NVConstDataRef<QT3DSI8> vertShader, NVConstDataRef<QT3DSI8> fragShader,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource,
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource, NVConstDataRef<QT3DSI8> geometryShaderSource,
+ bool separateProgram, NVRenderShaderProgramBinaryType::Enum type, bool binaryProgram)
+ {
+ NVRenderVertFragCompilationResult result = NVRenderShaderProgram::Create(
+ *this, shaderName, vertShader, fragShader, tessControlShaderSource,
+ tessEvaluationShaderSource, geometryShaderSource, separateProgram, type, binaryProgram);
+
+ if (result.mShader != NULL)
+ m_ShaderToImpMap.insert(
+ make_pair(result.mShader->GetShaderProgramHandle(), result.mShader));
+
+ return result;
+ }
+
+ NVRenderVertFragCompilationResult NVRenderContextImpl::CompileBinary(
+ const char *shaderName, NVRenderShaderProgramBinaryType::Enum type,
+ NVDataRef<QT3DSI8> vertShader, NVDataRef<QT3DSI8> fragShader,
+ NVDataRef<QT3DSI8> tessControlShaderSource, NVDataRef<QT3DSI8> tessEvaluationShaderSource,
+ NVConstDataRef<QT3DSI8> geometryShaderSource)
+ {
+#ifndef _MACOSX
+ NVRenderVertFragCompilationResult result = NVRenderShaderProgram::Create(
+ *this, shaderName, vertShader, fragShader, tessControlShaderSource,
+ tessEvaluationShaderSource, geometryShaderSource, false, type, true);
+
+ if (result.mShader != NULL)
+ m_ShaderToImpMap.insert(
+ make_pair(result.mShader->GetShaderProgramHandle(), result.mShader));
+
+ return result;
+#else
+ QT3DS_ASSERT(false);
+ return NVRenderVertFragCompilationResult();
+#endif
+ }
+
+ NVRenderVertFragCompilationResult
+ NVRenderContextImpl::CompileComputeSource(const char *shaderName,
+ NVConstDataRef<QT3DSI8> computeShaderSource)
+ {
+ NVRenderVertFragCompilationResult result =
+ NVRenderShaderProgram::CreateCompute(*this, shaderName, computeShaderSource);
+
+ if (result.mShader != NULL)
+ m_ShaderToImpMap.insert(
+ make_pair(result.mShader->GetShaderProgramHandle(), result.mShader));
+
+ return result;
+ }
+
+ NVRenderShaderProgram *NVRenderContextImpl::GetShaderProgram(const void *implementationHandle)
+ {
+ const nvhash_map<const void *, NVRenderShaderProgram *>::iterator entry =
+ m_ShaderToImpMap.find(implementationHandle);
+ if (entry != m_ShaderToImpMap.end())
+ return entry->second;
+ return NULL;
+ }
+
+ void NVRenderContextImpl::ShaderDestroyed(NVRenderShaderProgram &shader)
+ {
+ m_ShaderToImpMap.erase(shader.GetShaderProgramHandle());
+ if (m_HardwarePropertyContext.m_ActiveShader == &shader)
+ SetActiveShader(NULL);
+ }
+
+ NVRenderProgramPipeline *NVRenderContextImpl::CreateProgramPipeline()
+ {
+ return QT3DS_NEW(GetFoundation().getAllocator(), NVRenderProgramPipeline)(*this,
+ GetFoundation());
+ }
+
+ NVRenderPathSpecification *NVRenderContextImpl::CreatePathSpecification()
+ {
+ return NVRenderPathSpecification::CreatePathSpecification(*this);
+ }
+
+ NVRenderPathRender *NVRenderContextImpl::CreatePathRender(size_t range)
+ {
+ return NVRenderPathRender::Create(*this, range);
+ }
+
+ void NVRenderContextImpl::SetPathProjectionMatrix(const QT3DSMat44 inPathProjection)
+ {
+ m_backend->SetPathProjectionMatrix(inPathProjection);
+ }
+
+ void NVRenderContextImpl::SetPathModelViewMatrix(const QT3DSMat44 inPathModelview)
+ {
+ m_backend->SetPathModelViewMatrix(inPathModelview);
+ }
+
+ void NVRenderContextImpl::SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias)
+ {
+ m_backend->SetPathStencilDepthOffset(inSlope, inBias);
+ }
+ void NVRenderContextImpl::SetPathCoverDepthFunc(NVRenderBoolOp::Enum inFunc)
+ {
+ m_backend->SetPathCoverDepthFunc(inFunc);
+ }
+
+ NVRenderPathFontSpecification *
+ NVRenderContextImpl::CreatePathFontSpecification(CRegisteredString fontName)
+ {
+ // first check if it already exists
+ nvhash_map<CRegisteredString, NVRenderPathFontSpecification *>::const_iterator entry =
+ m_PathFontSpecToImpMap.find(fontName);
+ if (entry != m_PathFontSpecToImpMap.end())
+ return entry->second;
+
+ // if not create new one
+ NVRenderPathFontSpecification *pPathFontSpec =
+ NVRenderPathFontSpecification::CreatePathFontSpecification(*this, fontName);
+
+ if (pPathFontSpec)
+ m_PathFontSpecToImpMap.insert(make_pair(fontName, pPathFontSpec));
+
+ return pPathFontSpec;
+ }
+
+ void
+ NVRenderContextImpl::ReleasePathFontSpecification(NVRenderPathFontSpecification &inPathSpec)
+ {
+ m_PathFontSpecToImpMap.erase(inPathSpec.GetFontName());
+ }
+
+ NVRenderPathFontItem *NVRenderContextImpl::CreatePathFontItem()
+ {
+ // if not create new one
+ return NVRenderPathFontItem::CreatePathFontItem(*this);
+ }
+
+ void NVRenderContextImpl::SetClearColor(QT3DSVec4 inClearColor)
+ {
+ if (m_HardwarePropertyContext.m_ClearColor != inClearColor)
+ DoSetClearColor(inClearColor);
+ }
+
+ void NVRenderContextImpl::SetBlendFunction(NVRenderBlendFunctionArgument inFunctions)
+ {
+ if (memcmp(&inFunctions, &m_HardwarePropertyContext.m_BlendFunction,
+ sizeof(NVRenderBlendFunctionArgument))) {
+ DoSetBlendFunction(inFunctions);
+ }
+ }
+
+ void NVRenderContextImpl::SetBlendEquation(NVRenderBlendEquationArgument inEquations)
+ {
+ if (memcmp(&inEquations, &m_HardwarePropertyContext.m_BlendEquation,
+ sizeof(NVRenderBlendEquationArgument))) {
+ DoSetBlendEquation(inEquations);
+ }
+ }
+
+ void NVRenderContextImpl::SetCullingEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_CullingEnabled) {
+ DoSetCullingEnabled(inEnabled);
+ }
+ }
+
+ void NVRenderContextImpl::SetDepthFunction(qt3ds::render::NVRenderBoolOp::Enum inFunction)
+ {
+ if (inFunction != m_HardwarePropertyContext.m_DepthFunction) {
+ DoSetDepthFunction(inFunction);
+ }
+ }
+
+ void NVRenderContextImpl::SetBlendingEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_BlendingEnabled) {
+ DoSetBlendingEnabled(inEnabled);
+ }
+ }
+
+ void NVRenderContextImpl::SetColorWritesEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_ColorWritesEnabled) {
+ DoSetColorWritesEnabled(inEnabled);
+ }
+ }
+
+ void NVRenderContextImpl::SetDepthWriteEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_DepthWriteEnabled) {
+ m_HardwarePropertyContext.m_DepthWriteEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::DepthWrite);
+ }
+ }
+
+ void NVRenderContextImpl::SetDepthTestEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_DepthTestEnabled) {
+ DoSetDepthTestEnabled(inEnabled);
+ }
+ }
+
+ void NVRenderContextImpl::SetMultisampleEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_MultisampleEnabled) {
+ DoSetMultisampleEnabled(inEnabled);
+ }
+ }
+
+ void NVRenderContextImpl::SetStencilTestEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_StencilTestEnabled) {
+ DoSetStencilTestEnabled(inEnabled);
+ }
+ }
+
+ void NVRenderContextImpl::SetScissorTestEnabled(bool inEnabled)
+ {
+ if (inEnabled != m_HardwarePropertyContext.m_ScissorTestEnabled) {
+ DoSetScissorTestEnabled(inEnabled);
+ }
+ }
+
+ void NVRenderContextImpl::SetScissorRect(NVRenderRect inRect)
+ {
+ if (memcmp(&inRect, &m_HardwarePropertyContext.m_ScissorRect, sizeof(NVRenderRect))) {
+ DoSetScissorRect(inRect);
+ }
+ }
+
+ void NVRenderContextImpl::SetViewport(NVRenderRect inViewport)
+ {
+ if (memcmp(&inViewport, &m_HardwarePropertyContext.m_Viewport, sizeof(NVRenderRect))) {
+ DoSetViewport(inViewport);
+ }
+ }
+
+ void NVRenderContextImpl::SetActiveShader(NVRenderShaderProgram *inShader)
+ {
+ if (inShader != m_HardwarePropertyContext.m_ActiveShader)
+ DoSetActiveShader(inShader);
+ }
+
+ void NVRenderContextImpl::SetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline)
+ {
+ if (inProgramPipeline != m_HardwarePropertyContext.m_ActiveProgramPipeline)
+ DoSetActiveProgramPipeline(inProgramPipeline);
+ }
+
+ void NVRenderContextImpl::DispatchCompute(NVRenderShaderProgram *inShader, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ)
+ {
+ QT3DS_ASSERT(inShader);
+
+ if (inShader != m_HardwarePropertyContext.m_ActiveShader)
+ DoSetActiveShader(inShader);
+
+ m_backend->DispatchCompute(inShader->GetShaderProgramHandle(), numGroupsX, numGroupsY,
+ numGroupsZ);
+
+ OnPostDraw();
+ }
+
+ void NVRenderContextImpl::SetDrawBuffers(NVConstDataRef<QT3DSI32> inDrawBufferSet)
+ {
+ m_backend->SetDrawBuffers(
+ (m_HardwarePropertyContext.m_FrameBuffer)
+ ? m_HardwarePropertyContext.m_FrameBuffer->GetFrameBuffertHandle()
+ : NULL,
+ inDrawBufferSet);
+ }
+
+ void NVRenderContextImpl::SetReadBuffer(NVReadFaces::Enum inReadFace)
+ {
+ // currently NULL which means the read target must be set with setReadTarget
+ m_backend->SetReadBuffer(NULL, inReadFace);
+ }
+
+ void NVRenderContextImpl::ReadPixels(NVRenderRect inRect,
+ NVRenderReadPixelFormats::Enum inFormat,
+ NVDataRef<QT3DSU8> inWriteBuffer)
+ {
+ // NULL means read from current render target
+ m_backend->ReadPixel(NULL, inRect.m_X, inRect.m_Y, inRect.m_Width, inRect.m_Height,
+ inFormat, (void *)inWriteBuffer.begin());
+ }
+
+ void NVRenderContextImpl::SetRenderTarget(NVRenderFrameBuffer *inBuffer)
+ {
+ if (inBuffer != m_HardwarePropertyContext.m_FrameBuffer) {
+ DoSetRenderTarget(inBuffer);
+ }
+ }
+
+ void NVRenderContextImpl::SetReadTarget(NVRenderFrameBuffer *inBuffer)
+ {
+ if (inBuffer != m_HardwarePropertyContext.m_FrameBuffer) {
+ DoSetReadTarget(inBuffer);
+ }
+ }
+
+ void NVRenderContextImpl::ResetBlendState()
+ {
+ QT3DSI32_4 values;
+
+ m_backend->SetRenderState(m_HardwarePropertyContext.m_BlendingEnabled,
+ NVRenderState::Blend);
+ const NVRenderBlendFunctionArgument &theBlendArg(m_HardwarePropertyContext.m_BlendFunction);
+ m_backend->SetBlendFunc(theBlendArg);
+ }
+
+ // Pop the entire set of properties, potentially forcing the values
+ // to opengl.
+ void NVRenderContextImpl::PopPropertySet(bool inForceSetProperties)
+ {
+ if (!m_PropertyStack.empty()) {
+ SNVGLHardPropertyContext &theTopContext(m_PropertyStack.back());
+ if (inForceSetProperties) {
+#define HANDLE_CONTEXT_HARDWARE_PROPERTY(setterName, propName) \
+ DoSet##setterName(theTopContext.m_##propName);
+
+ ITERATE_HARDWARE_CONTEXT_PROPERTIES
+
+#undef HANDLE_CONTEXT_HARDWARE_PROPERTY
+ } else {
+#define HANDLE_CONTEXT_HARDWARE_PROPERTY(setterName, propName) \
+ Set##setterName(theTopContext.m_##propName);
+
+ ITERATE_HARDWARE_CONTEXT_PROPERTIES
+
+#undef HANDLE_CONTEXT_HARDWARE_PROPERTY
+ }
+ m_PropertyStack.pop_back();
+ }
+ }
+
+ void NVRenderContextImpl::Clear(NVRenderClearFlags flags)
+ {
+ if ((flags & NVRenderClearValues::Depth)
+ && m_HardwarePropertyContext.m_DepthWriteEnabled == false) {
+ QT3DS_ASSERT(false);
+ SetDepthWriteEnabled(true);
+ }
+ m_backend->Clear(flags);
+ }
+
+ void NVRenderContextImpl::Clear(NVRenderFrameBuffer &fb, NVRenderClearFlags flags)
+ {
+ NVRenderFrameBuffer *previous = m_HardwarePropertyContext.m_FrameBuffer;
+ if (previous != &fb)
+ SetRenderTarget(&fb);
+
+ Clear(flags);
+
+ if (previous != &fb)
+ SetRenderTarget(previous);
+ }
+
+ void NVRenderContextImpl::BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter)
+ {
+ m_backend->BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, flags,
+ filter);
+ }
+
+ bool
+ NVRenderContextImpl::BindShaderToInputAssembler(const NVRenderInputAssembler *inputAssembler,
+ NVRenderShaderProgram *shader)
+ {
+ // setup the input assembler object
+ return m_backend->SetInputAssembler(inputAssembler->GetInputAssemblerHandle(),
+ shader->GetShaderProgramHandle());
+ }
+
+ bool NVRenderContextImpl::ApplyPreDrawProperties()
+ {
+ // Get the currently bound vertex and shader
+ NVRenderInputAssembler *inputAssembler = this->m_HardwarePropertyContext.m_InputAssembler;
+ NVRenderShaderProgram *shader = this->m_HardwarePropertyContext.m_ActiveShader;
+
+ // we could render through a program pipline
+ if (shader == NULL && this->m_HardwarePropertyContext.m_ActiveProgramPipeline)
+ shader = this->m_HardwarePropertyContext.m_ActiveProgramPipeline->GetVertexStage();
+
+ if (inputAssembler == NULL || shader == NULL) {
+ qCCritical(INVALID_OPERATION,
+ "Attempting to render no valid shader or input assembler setup");
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ return BindShaderToInputAssembler(inputAssembler, shader);
+ }
+
+ void NVRenderContextImpl::OnPostDraw()
+ {
+ // reset input assembler binding
+ m_backend->SetInputAssembler(NULL, 0);
+ // Texture unit 0 is used for setting up and loading textures.
+ // Bugs happen if we load a texture then setup the sampler.
+ // Then we load another texture. Because when loading we use texture unit 0,
+ // the render bindings for the first texture are blown away.
+ // Again, for this reason, texture unit 0 is reserved for loading textures.
+ m_NextTextureUnit = 1;
+ m_NextConstantBufferUnit = 0;
+ }
+
+ void NVRenderContextImpl::Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset)
+ {
+ if (!ApplyPreDrawProperties())
+ return;
+
+ NVRenderIndexBuffer *theIndexBuffer = const_cast<NVRenderIndexBuffer *>(
+ m_HardwarePropertyContext.m_InputAssembler->GetIndexBuffer());
+ if (theIndexBuffer == NULL)
+ m_backend->Draw(drawMode, offset, count);
+ else
+ theIndexBuffer->Draw(drawMode, count, offset);
+
+ OnPostDraw();
+ }
+
+ void NVRenderContextImpl::DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset)
+ {
+ if (!ApplyPreDrawProperties())
+ return;
+
+ NVRenderIndexBuffer *theIndexBuffer = const_cast<NVRenderIndexBuffer *>(
+ m_HardwarePropertyContext.m_InputAssembler->GetIndexBuffer());
+ if (theIndexBuffer == NULL)
+ m_backend->DrawIndirect(drawMode, (const void *)offset);
+ else
+ theIndexBuffer->DrawIndirect(drawMode, offset);
+
+ OnPostDraw();
+ }
+
+ QT3DSMat44
+ NVRenderContext::ApplyVirtualViewportToProjectionMatrix(const QT3DSMat44 &inProjection,
+ const NVRenderRectF &inViewport,
+ const NVRenderRectF &inVirtualViewport)
+ {
+ if (inVirtualViewport == inViewport)
+ return inProjection;
+ // Run conversion to floating point once.
+ NVRenderRectF theVirtualViewport(inVirtualViewport);
+ NVRenderRectF theViewport(inViewport);
+ if (theVirtualViewport.m_Width == 0 || theVirtualViewport.m_Height == 0
+ || theViewport.m_Width == 0 || theViewport.m_Height == 0) {
+ QT3DS_ASSERT(false);
+ return inProjection;
+ }
+ QT3DSMat44 theScaleTransMat(QT3DSMat44::createIdentity());
+ QT3DSF32 theHeightDiff = theViewport.m_Height - theVirtualViewport.m_Height;
+ QT3DSF32 theViewportOffY = theVirtualViewport.m_Y - theViewport.m_Y;
+ QT3DSVec2 theCameraOffsets = QT3DSVec2(theVirtualViewport.m_Width - theViewport.m_Width
+ + (theVirtualViewport.m_X - theViewport.m_X) * 2.0f,
+ theHeightDiff + (theViewportOffY - theHeightDiff) * 2.0f);
+ QT3DSVec2 theCameraScale = QT3DSVec2(theVirtualViewport.m_Width / theViewport.m_Width,
+ theVirtualViewport.m_Height / theViewport.m_Height);
+
+ QT3DSVec3 theTranslation(theCameraOffsets.x / theViewport.m_Width,
+ theCameraOffsets.y / theViewport.m_Height, 0);
+ theScaleTransMat.column3[0] = theTranslation.x;
+ theScaleTransMat.column3[1] = theTranslation.y;
+ theScaleTransMat.column0[0] = theCameraScale.x;
+ theScaleTransMat.column1[1] = theCameraScale.y;
+
+ return theScaleTransMat * inProjection;
+ }
+
+ NVRenderVertFragCompilationResult NVRenderContext::CompileSource(
+ const char *shaderName, const char *vertShader, QT3DSU32 inVertLen, const char *fragShader,
+ QT3DSU32 inFragLen, const char *tessControlShaderSource, QT3DSU32 inTCLen,
+ const char *tessEvaluationShaderSource, QT3DSU32 inTELen, const char *geometryShaderSource,
+ QT3DSU32 inGSLen, bool separableProgram)
+ {
+ return CompileSource(
+ shaderName, NVConstDataRef<QT3DSI8>((const QT3DSI8 *)vertShader, inVertLen),
+ NVConstDataRef<QT3DSI8>((const QT3DSI8 *)fragShader, inFragLen),
+ NVConstDataRef<QT3DSI8>((const QT3DSI8 *)tessControlShaderSource, inTCLen),
+ NVConstDataRef<QT3DSI8>((const QT3DSI8 *)tessEvaluationShaderSource, inTELen),
+ NVConstDataRef<QT3DSI8>((const QT3DSI8 *)geometryShaderSource, inGSLen), separableProgram);
+ }
+
+ void NVRenderContextImpl::DoSetActiveShader(NVRenderShaderProgram *inShader)
+ {
+ m_HardwarePropertyContext.m_ActiveShader = NULL;
+ if (inShader)
+ m_backend->SetActiveProgram(inShader->GetShaderProgramHandle());
+ else {
+ m_backend->SetActiveProgram(NULL);
+ }
+ m_HardwarePropertyContext.m_ActiveShader = inShader;
+ }
+
+ void NVRenderContextImpl::DoSetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline)
+ {
+ if (inProgramPipeline) {
+ // invalid any bound shader
+ DoSetActiveShader(NULL);
+ inProgramPipeline->Bind();
+ } else
+ m_backend->SetActiveProgramPipeline(NULL);
+
+ m_HardwarePropertyContext.m_ActiveProgramPipeline = inProgramPipeline;
+ }
+
+ NVRenderContext &NVRenderContext::CreateNULL(NVFoundationBase &foundation,
+ IStringTable &inStringTable)
+ {
+ NVRenderContext *retval = NULL;
+
+ // create backend
+ NVScopedRefCounted<IStringTable> theStringTable(inStringTable);
+ NVScopedRefCounted<NVRenderBackend> theBackend =
+ NVRenderBackendNULL::CreateBackend(foundation);
+ retval = QT3DS_NEW(foundation.getAllocator(), NVRenderContextImpl)(foundation, *theBackend,
+ *theStringTable);
+ return *retval;
+ }
+}
+} // end namespace
diff --git a/src/render/Qt3DSRenderContext.h b/src/render/Qt3DSRenderContext.h
new file mode 100644
index 0000000..dfaf1bb
--- /dev/null
+++ b/src/render/Qt3DSRenderContext.h
@@ -0,0 +1,1075 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CONTEXT_H
+#define QT3DS_RENDER_CONTEXT_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "render/glg/Qt3DSGLImplObjects.h"
+#include "render/backends/gl/Q3DSRenderBackendGLES2.h"
+#include "render/backends/gl/Qt3DSRenderBackendGL3.h"
+#include "render/backends/gl/Qt3DSRenderBackendGL4.h"
+#include "render/backends/software/Qt3DSRenderBackendNULL.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "render/Qt3DSRenderConstantBuffer.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "render/Qt3DSRenderDepthStencilState.h"
+#include "render/Qt3DSRenderRasterizerState.h"
+#include "render/Qt3DSRenderDrawable.h"
+#include "render/Qt3DSRenderInputAssembler.h"
+#include "render/Qt3DSRenderAttribLayout.h"
+#include "render/Qt3DSRenderImageTexture.h"
+#include "render/Qt3DSRenderOcclusionQuery.h"
+#include "render/Qt3DSRenderTimerQuery.h"
+#include "render/Qt3DSRenderSync.h"
+#include "render/Qt3DSRenderTexture2DArray.h"
+#include "render/Qt3DSRenderTextureCube.h"
+#include "render/Qt3DSRenderStorageBuffer.h"
+#include "render/Qt3DSRenderAtomicCounterBuffer.h"
+#include "render/Qt3DSRenderDrawIndirectBuffer.h"
+#include "render/Qt3DSRenderProgramPipeline.h"
+#include "render/Qt3DSRenderPathRender.h"
+#include "render/Qt3DSRenderPathSpecification.h"
+#include "render/Qt3DSRenderPathFontSpecification.h"
+#include "render/Qt3DSRenderPathFontText.h"
+
+#include <QSurfaceFormat>
+
+// When SW fallback is defined we can support (some) object/layer advanced blend modes. If defined,
+// the HW implementation is still preperred if available through extensions. SW fallback can't be
+// used in custom shaders.
+#define ADVANCED_BLEND_SW_FALLBACK
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ struct NVRenderShaderProgramBinaryType
+ {
+ enum Enum {
+ Unknown = 0,
+ NVBinary = 1,
+ };
+ };
+
+ // context dirty flags
+ struct NVRenderContextDirtyValues
+ {
+ enum Enum {
+ InputAssembler = 1 << 0,
+ };
+ };
+
+ typedef NVFlags<NVRenderContextDirtyValues::Enum, QT3DSU32> NVRenderContextDirtyFlags;
+ typedef nvhash_map<CRegisteredString, NVRenderConstantBuffer *> TContextConstantBufferMap;
+ typedef nvhash_map<CRegisteredString, NVRenderStorageBuffer *> TContextStorageBufferMap;
+ typedef nvhash_map<CRegisteredString, NVRenderAtomicCounterBuffer *>
+ TContextAtomicCounterBufferMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendBufferObject, NVRenderDrawIndirectBuffer *>
+ TContextDrawIndirectBufferMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendDepthStencilStateObject,
+ NVRenderDepthStencilState *>
+ TContextDepthStencilStateMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendRasterizerStateObject,
+ NVRenderRasterizerState *>
+ TContextRasterizerStateMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendTextureObject, NVRenderTexture2DArray *>
+ TContextTex2DArrayToImpMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendTextureObject, NVRenderTextureCube *>
+ TContextTexCubeToImpMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendTextureObject, NVRenderImage2D *>
+ TContextImage2DToImpMap;
+ typedef nvhash_map<CRegisteredString, NVRenderPathFontSpecification *>
+ TContextPathFontSpecificationMap;
+
+ class QT3DS_AUTOTEST_EXPORT NVRenderContext : public NVRefCounted, public NVRenderDrawable
+ {
+ public:
+ virtual NVRenderContextType GetRenderContextType() const = 0;
+ virtual bool AreMultisampleTexturesSupported() const = 0;
+ virtual bool GetConstantBufferSupport() const = 0;
+ virtual void getMaxTextureSize(QT3DSU32 &oWidth, QT3DSU32 &oHeight) = 0;
+ virtual const char *GetShadingLanguageVersion() = 0;
+ // Get the bit depth of the currently bound depth buffer.
+ virtual QT3DSU32 GetDepthBits() const = 0;
+ virtual QT3DSU32 GetStencilBits() const = 0;
+ virtual bool
+ GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Enum inCap) const = 0;
+ virtual bool AreDXTImagesSupported() const = 0;
+ virtual bool IsDepthStencilSupported() const = 0;
+ virtual bool IsFpRenderTargetSupported() const = 0;
+ virtual bool IsTessellationSupported() const = 0;
+ virtual bool IsGeometryStageSupported() const = 0;
+ virtual bool IsComputeSupported() const = 0;
+ virtual bool IsSampleQuerySupported() const = 0;
+ virtual bool IsTimerQuerySupported() const = 0;
+ virtual bool IsCommandSyncSupported() const = 0;
+ virtual bool IsTextureArraySupported() const = 0;
+ virtual bool IsStorageBufferSupported() const = 0;
+ virtual bool IsAtomicCounterBufferSupported() const = 0;
+ virtual bool IsShaderImageLoadStoreSupported() const = 0;
+ virtual bool IsProgramPipelineSupported() const = 0;
+ virtual bool IsPathRenderingSupported() const = 0;
+ virtual bool IsBlendCoherencySupported() const = 0;
+ virtual bool IsAdvancedBlendHwSupported() const = 0;
+ virtual bool IsAdvancedBlendHwSupportedKHR() const = 0;
+ virtual bool IsStandardDerivativesSupported() const = 0;
+ virtual bool IsTextureLodSupported() const = 0;
+ virtual bool isSceneCameraView() const = 0;
+
+ virtual void SetDefaultRenderTarget(QT3DSU64 targetID) = 0;
+ virtual void SetDefaultDepthBufferBitCount(QT3DSI32 depthBits) = 0;
+ virtual void setIsSceneCameraView(bool sceneCameraView) = 0;
+
+ virtual NVRenderDepthStencilState *
+ CreateDepthStencilState(bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack) = 0;
+
+ virtual NVRenderRasterizerState *CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace) = 0;
+
+ virtual NVRenderVertexBuffer *
+ CreateVertexBuffer(NVRenderBufferUsageType::Enum usageType, size_t size, QT3DSU32 stride = 0,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) = 0;
+ virtual NVRenderVertexBuffer *GetVertexBuffer(const void *implementationHandle) = 0;
+
+ virtual NVRenderIndexBuffer *
+ CreateIndexBuffer(NVRenderBufferUsageType::Enum usageType,
+ NVRenderComponentTypes::Enum componentType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) = 0;
+ virtual NVRenderIndexBuffer *GetIndexBuffer(const void *implementationHandle) = 0;
+
+ virtual NVRenderConstantBuffer *
+ CreateConstantBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) = 0;
+ virtual NVRenderConstantBuffer *GetConstantBuffer(CRegisteredString bufferName) = 0;
+
+ virtual NVRenderStorageBuffer *
+ CreateStorageBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData, NVRenderDataBuffer *pBuffer) = 0;
+ virtual NVRenderStorageBuffer *GetStorageBuffer(CRegisteredString bufferName) = 0;
+
+ virtual NVRenderAtomicCounterBuffer *
+ CreateAtomicCounterBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) = 0;
+ virtual NVRenderAtomicCounterBuffer *
+ GetAtomicCounterBuffer(CRegisteredString bufferName) = 0;
+ virtual NVRenderAtomicCounterBuffer *
+ GetAtomicCounterBufferByParam(CRegisteredString paramName) = 0;
+
+ virtual NVRenderDrawIndirectBuffer *
+ CreateDrawIndirectBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) = 0;
+ virtual NVRenderDrawIndirectBuffer *GetDrawIndirectBuffer(
+ NVRenderBackend::NVRenderBackendBufferObject implementationHandle) = 0;
+
+ virtual void SetMemoryBarrier(NVRenderBufferBarrierFlags barriers) = 0;
+
+ virtual NVRenderOcclusionQuery *CreateOcclusionQuery() = 0;
+ virtual NVRenderTimerQuery *CreateTimerQuery() = 0;
+ virtual NVRenderSync *CreateSync() = 0;
+
+ virtual NVRenderTexture2D *CreateTexture2D() = 0;
+ virtual NVRenderTexture2D *GetTexture2D(const void *implementationHandle) = 0;
+ virtual NVRenderBackend *GetBackend() = 0;
+
+ virtual NVRenderTexture2DArray *CreateTexture2DArray() = 0;
+
+ virtual NVRenderTextureCube *CreateTextureCube() = 0;
+
+ virtual NVRenderImage2D *CreateImage2D(NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess) = 0;
+
+ virtual NVRenderRenderBuffer *
+ CreateRenderBuffer(NVRenderRenderBufferFormats::Enum bufferFormat, QT3DSU32 width,
+ QT3DSU32 height) = 0;
+ virtual NVRenderRenderBuffer *GetRenderBuffer(const void *implementationHandle) = 0;
+ // Create a new frame buffer and set the current render target to that frame buffer.
+ virtual NVRenderFrameBuffer *CreateFrameBuffer() = 0;
+ virtual NVRenderFrameBuffer *GetFrameBuffer(const void *implementationHandle) = 0;
+
+ virtual NVRenderAttribLayout *
+ CreateAttributeLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs) = 0;
+
+ virtual NVRenderInputAssembler *
+ CreateInputAssembler(NVRenderAttribLayout *attribLayout,
+ NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer, NVConstDataRef<QT3DSU32> strides,
+ NVConstDataRef<QT3DSU32> offsets,
+ NVRenderDrawMode::Enum primType = NVRenderDrawMode::Triangles,
+ QT3DSU32 patchVertexCount = 1) = 0;
+ virtual void SetInputAssembler(NVRenderInputAssembler *inputAssembler) = 0;
+
+ virtual NVRenderVertFragCompilationResult CompileSource(
+ const char *shaderName, NVConstDataRef<QT3DSI8> vertShader,
+ NVConstDataRef<QT3DSI8> fragShader,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>(),
+ bool separateProgram = false,
+ NVRenderShaderProgramBinaryType::Enum type = NVRenderShaderProgramBinaryType::Unknown,
+ bool binaryProgram = false) = 0;
+
+ // You must figure out inVertLen and inFragLen yourself, this object doesn't do that.
+ NVRenderVertFragCompilationResult
+ CompileSource(const char *shaderName, const char *vertShader, QT3DSU32 inVertLen,
+ const char *fragShader, QT3DSU32 inFragLen, const char * = NULL,
+ QT3DSU32 inTCLen = 0, const char *tessEvaluationShaderSource = NULL,
+ QT3DSU32 inTELen = 0, const char *geometryShaderSource = NULL, QT3DSU32 inGSLen = 0,
+ bool separableProgram = false);
+
+ virtual NVRenderVertFragCompilationResult
+ CompileBinary(const char *shaderName, NVRenderShaderProgramBinaryType::Enum type,
+ NVDataRef<QT3DSI8> vertShader, NVDataRef<QT3DSI8> fragShader,
+ NVDataRef<QT3DSI8> tessControlShaderSource = NVDataRef<QT3DSI8>(),
+ NVDataRef<QT3DSI8> tessEvaluationShaderSource = NVDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>()) = 0;
+
+ virtual NVRenderVertFragCompilationResult
+ CompileComputeSource(const char *shaderName, NVConstDataRef<QT3DSI8> computeShaderSource) = 0;
+
+ virtual NVRenderShaderProgram *GetShaderProgram(const void *implementationHandle) = 0;
+
+ virtual NVRenderProgramPipeline *CreateProgramPipeline() = 0;
+
+ virtual NVRenderPathSpecification *CreatePathSpecification() = 0;
+ virtual NVRenderPathRender *CreatePathRender(size_t range = 1) = 0;
+ virtual void SetPathProjectionMatrix(const QT3DSMat44 inPathProjection) = 0;
+ virtual void SetPathModelViewMatrix(const QT3DSMat44 inPathModelview) = 0;
+ virtual void SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias) = 0;
+ virtual void SetPathCoverDepthFunc(NVRenderBoolOp::Enum inFunc) = 0;
+
+ virtual NVRenderPathFontSpecification *
+ CreatePathFontSpecification(CRegisteredString fontName) = 0;
+ virtual NVRenderPathFontItem *CreatePathFontItem() = 0;
+
+ // Specific setters for the guaranteed-to-exist context properties to set them as fast as
+ // possible.
+ // Note that this bypasses the property manage so push/pop will have no effect (unless you
+ // set these already
+ // once after a push using the property manager.
+ virtual void SetClearColor(QT3DSVec4 inClearColor) = 0;
+ virtual QT3DSVec4 GetClearColor() const = 0;
+
+ virtual void SetBlendFunction(NVRenderBlendFunctionArgument inFunctions) = 0;
+ virtual NVRenderBlendFunctionArgument GetBlendFunction() const = 0;
+
+ virtual void SetBlendEquation(NVRenderBlendEquationArgument inEquations) = 0;
+ virtual NVRenderBlendEquationArgument GetBlendEquation() const = 0;
+
+ virtual void SetCullingEnabled(bool inEnabled) = 0;
+ virtual bool IsCullingEnabled() const = 0;
+
+ virtual void SetDepthFunction(NVRenderBoolOp::Enum inFunction) = 0;
+ virtual qt3ds::render::NVRenderBoolOp::Enum GetDepthFunction() const = 0;
+
+ virtual void SetBlendingEnabled(bool inEnabled) = 0;
+ virtual bool IsBlendingEnabled() const = 0;
+
+ virtual void SetDepthWriteEnabled(bool inEnabled) = 0;
+ virtual bool IsDepthWriteEnabled() const = 0;
+
+ virtual void SetDepthTestEnabled(bool inEnabled) = 0;
+ virtual bool IsDepthTestEnabled() const = 0;
+
+ virtual void SetDepthStencilState(NVRenderDepthStencilState *inDepthStencilState) = 0;
+ virtual void SetStencilTestEnabled(bool inEnabled) = 0;
+ virtual bool IsStencilTestEnabled() const = 0;
+
+ virtual void SetRasterizerState(NVRenderRasterizerState *inRasterizerState) = 0;
+
+ virtual void SetScissorTestEnabled(bool inEnabled) = 0;
+ virtual bool IsScissorTestEnabled() const = 0;
+
+ virtual void SetScissorRect(NVRenderRect inRect) = 0;
+ virtual NVRenderRect GetScissorRect() const = 0;
+
+ virtual void SetViewport(NVRenderRect inViewport) = 0;
+ virtual NVRenderRect GetViewport() const = 0;
+
+ virtual void SetColorWritesEnabled(bool inEnabled) = 0;
+ virtual bool IsColorWritesEnabled() const = 0;
+
+ virtual void SetMultisampleEnabled(bool inEnabled) = 0;
+ virtual bool IsMultisampleEnabled() const = 0;
+
+ // Used during layer rendering because we can't set the *actual* viewport to what it should
+ // be due to hardware problems.
+ // Set during begin render.
+ static QT3DSMat44
+ ApplyVirtualViewportToProjectionMatrix(const QT3DSMat44 &inProjection,
+ const NVRenderRectF &inViewport,
+ const NVRenderRectF &inVirtualViewport);
+
+ virtual void SetRenderTarget(NVRenderFrameBuffer *inBuffer) = 0;
+ virtual void SetReadTarget(NVRenderFrameBuffer *inBuffer) = 0;
+ virtual NVRenderFrameBuffer *GetRenderTarget() const = 0;
+
+ virtual void SetActiveShader(NVRenderShaderProgram *inShader) = 0;
+ virtual NVRenderShaderProgram *GetActiveShader() const = 0;
+
+ virtual void SetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline) = 0;
+ virtual NVRenderProgramPipeline *GetActiveProgramPipeline() const = 0;
+
+ virtual void DispatchCompute(NVRenderShaderProgram *inShader, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ) = 0;
+
+ // Push the entire set of properties.
+ virtual void PushPropertySet() = 0;
+ // Pop the entire set of properties, potentially forcing the values
+ // to opengl. Will set the hardware state to whatever at the time of push.
+ virtual void PopPropertySet(bool inForceSetProperties) = 0;
+
+ // Ensure the hardware state matches the state we expect.
+ virtual void ResetBlendState() = 0;
+
+ // Draw buffers are what the system will render to.. Applies to the current render context.
+ //-1 means none, else the integer is assumed to be an index past the draw buffer index.
+ // This applies only to the currently bound framebuffer.
+ virtual void SetDrawBuffers(NVConstDataRef<QT3DSI32> inDrawBufferSet) = 0;
+ virtual void SetReadBuffer(NVReadFaces::Enum inReadFace) = 0;
+
+ virtual void ReadPixels(NVRenderRect inRect, NVRenderReadPixelFormats::Enum inFormat,
+ NVDataRef<QT3DSU8> inWriteBuffer) = 0;
+
+ // Return the property manager for this render context
+ // virtual NVRenderPropertyManager& GetPropertyManager() = 0;
+ // Clear the current render target
+ virtual void Clear(NVRenderClearFlags flags) = 0;
+ // Clear this framebuffer without changing the active frame buffer
+ virtual void Clear(NVRenderFrameBuffer &framebuffer, NVRenderClearFlags flags) = 0;
+ // copy framebuffer content between read target and render target
+ virtual void BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter) = 0;
+
+ // Render, applying these immediate property values just before render. The hardware
+ // properties are tracked for push/pop
+ // but the shader properties are just set on the active shader *after* the hardware
+ // properties have been set. The shader properties are not tracked for push/pop.
+ // This call is meant to come directly before each draw call to setup the last bit of state
+ // before the draw operation. Note that there isn't another way to set the immedate
+ // property values for a given shader because it isn't clear which shader is active
+ // when the properties are getting set.
+ void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset) override = 0;
+
+ /**
+ * @brief Draw the current active vertex buffer using an indirect buffer
+ * This means the setup of the draw call is stored in a buffer bound to
+ * NVRenderBufferBindValues::Draw_Indirect
+ *
+ * @param[in] drawMode Draw mode (Triangles, ....)
+ * @param[in] indirect Offset into a indirect drawing setup buffer
+ *
+ * @return no return.
+ */
+ virtual void DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset) = 0;
+
+ virtual NVFoundationBase &GetFoundation() = 0;
+ virtual qt3ds::foundation::IStringTable &GetStringTable() = 0;
+ virtual NVAllocatorCallback &GetAllocator() = 0;
+
+ virtual QSurfaceFormat format() const = 0;
+
+ virtual void resetStates() = 0;
+
+ static NVRenderContext &CreateGL(NVFoundationBase &foundation, IStringTable &inStringTable,
+ const QSurfaceFormat &format);
+
+ static NVRenderContext &CreateNULL(NVFoundationBase &foundation,
+ IStringTable &inStringTable);
+ };
+
+ // Now for scoped property access.
+ template <typename TDataType>
+ struct NVRenderContextScopedProperty
+ : public NVRenderGenericScopedProperty<NVRenderContext, TDataType>
+ {
+ typedef typename NVRenderGenericScopedProperty<NVRenderContext, TDataType>::TGetter TGetter;
+ typedef typename NVRenderGenericScopedProperty<NVRenderContext, TDataType>::TSetter TSetter;
+ NVRenderContextScopedProperty(NVRenderContext &ctx, TGetter getter, TSetter setter)
+ : NVRenderGenericScopedProperty<NVRenderContext, TDataType>(ctx, getter, setter)
+ {
+ }
+ NVRenderContextScopedProperty(NVRenderContext &ctx, TGetter getter, TSetter setter,
+ const TDataType &inNewValue)
+ : NVRenderGenericScopedProperty<NVRenderContext, TDataType>(ctx, getter, setter,
+ inNewValue)
+ {
+ }
+ };
+
+/**
+ * A Render Context implementation class
+ *
+ */
+
+#define ITERATE_HARDWARE_CONTEXT_PROPERTIES \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(RenderTarget, FrameBuffer) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ActiveShader, ActiveShader) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ActiveProgramPipeline, ActiveProgramPipeline) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(InputAssembler, InputAssembler) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(BlendFunction, BlendFunction) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(CullingEnabled, CullingEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(DepthFunction, DepthFunction) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(BlendingEnabled, BlendingEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(DepthWriteEnabled, DepthWriteEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(DepthTestEnabled, DepthTestEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(StencilTestEnabled, StencilTestEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ScissorTestEnabled, ScissorTestEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ScissorRect, ScissorRect) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(Viewport, Viewport) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ClearColor, ClearColor)
+
+ // forward declarations
+
+ class NVRenderContextImpl : public NVRenderContext, public NoCopy
+ {
+ public:
+ // these variables represent the current hardware state of the render context.
+ SNVGLHardPropertyContext m_HardwarePropertyContext;
+
+ private:
+ NVScopedRefCounted<NVRenderBackend> m_backend; ///< pointer to our render backend
+ NVRenderContextDirtyFlags m_DirtyFlags; ///< context dirty flags
+
+ NVRenderBackend::NVRenderBackendRenderTargetObject
+ m_DefaultOffscreenRenderTarget; ///< this is a special target set from outside if we
+ ///never render to a window directly (GL only)
+ QT3DSI32 m_DephBits; ///< this is the depth bits count of the default window render target
+ QT3DSI32 m_StencilBits; ///< this is the stencil bits count of the default window render target
+ bool m_isSceneCameraView = true; ///< true in viewer and in editor when in scene camera view mode
+
+ protected:
+ volatile QT3DSI32 mRefCount;
+ NVFoundationBase &m_Foundation;
+ qt3ds::foundation::IStringTable &m_StringTable;
+
+ nvhash_map<const void *, NVRenderVertexBuffer *> m_VertToImpMap;
+ nvhash_map<const void *, NVRenderIndexBuffer *> m_IndexToImpMap;
+ TContextConstantBufferMap m_ConstantToImpMap;
+ TContextStorageBufferMap m_StorageToImpMap;
+ TContextAtomicCounterBufferMap m_AtomicCounterToImpMap;
+ TContextDrawIndirectBufferMap m_DrawIndirectToImpMap;
+ TContextDepthStencilStateMap m_DepthStencilStateToImpMap;
+ TContextRasterizerStateMap m_RasterizerStateToImpMap;
+ TContextPathFontSpecificationMap m_PathFontSpecToImpMap;
+
+ nvhash_map<const void *, NVRenderTexture2D *> m_Tex2DToImpMap;
+ TContextTex2DArrayToImpMap m_Tex2DArrayToImpMap;
+ TContextTexCubeToImpMap m_TexCubeToImpMap;
+ TContextImage2DToImpMap m_Image2DtoImpMap;
+ nvhash_map<const void *, NVRenderShaderProgram *> m_ShaderToImpMap;
+ nvhash_map<const void *, NVRenderRenderBuffer *> m_RenderBufferToImpMap;
+ nvhash_map<const void *, NVRenderFrameBuffer *> m_FrameBufferToImpMap;
+ QT3DSU32 m_MaxTextureUnits;
+ QT3DSU32 m_NextTextureUnit;
+ QT3DSU32 m_MaxConstantBufferUnits;
+ QT3DSU32 m_NextConstantBufferUnit;
+
+ nvvector<SNVGLHardPropertyContext> m_PropertyStack;
+
+ void DoSetClearColor(QT3DSVec4 inClearColor)
+ {
+ m_HardwarePropertyContext.m_ClearColor = inClearColor;
+ m_backend->SetClearColor(&inClearColor);
+ }
+
+ void DoSetBlendFunction(NVRenderBlendFunctionArgument inFunctions)
+ {
+ QT3DSI32_4 values;
+ m_HardwarePropertyContext.m_BlendFunction = inFunctions;
+
+ m_backend->SetBlendFunc(inFunctions);
+ }
+
+ void DoSetBlendEquation(NVRenderBlendEquationArgument inEquations)
+ {
+ QT3DSI32_4 values;
+ m_HardwarePropertyContext.m_BlendEquation = inEquations;
+
+ m_backend->SetBlendEquation(inEquations);
+ }
+
+ void DoSetCullingEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_CullingEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::CullFace);
+ }
+
+ void DoSetDepthFunction(qt3ds::render::NVRenderBoolOp::Enum inFunction)
+ {
+ m_HardwarePropertyContext.m_DepthFunction = inFunction;
+ m_backend->SetDepthFunc(inFunction);
+ }
+
+ void DoSetBlendingEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_BlendingEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::Blend);
+ }
+
+ void DoSetColorWritesEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_ColorWritesEnabled = inEnabled;
+ m_backend->SetColorWrites(inEnabled, inEnabled, inEnabled, inEnabled);
+ }
+
+ void DoSetMultisampleEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_MultisampleEnabled = inEnabled;
+ m_backend->SetMultisample(inEnabled);
+ }
+
+ void DoSetDepthWriteEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_DepthWriteEnabled = inEnabled;
+ m_backend->SetDepthWrite(inEnabled);
+ }
+
+ void DoSetDepthTestEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_DepthTestEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::DepthTest);
+ }
+
+ void DoSetStencilTestEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_StencilTestEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::StencilTest);
+ }
+
+ void DoSetScissorTestEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_ScissorTestEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::ScissorTest);
+ }
+
+ void DoSetScissorRect(NVRenderRect inRect)
+ {
+ m_HardwarePropertyContext.m_ScissorRect = inRect;
+ m_backend->SetScissorRect(inRect);
+ }
+
+ void DoSetViewport(NVRenderRect inViewport)
+ {
+ m_HardwarePropertyContext.m_Viewport = inViewport;
+ m_backend->SetViewportRect(inViewport);
+ }
+
+ // Circular dependencies between shader constants and shader programs preclude
+ // implementation in header
+ void DoSetActiveShader(NVRenderShaderProgram *inShader);
+ void DoSetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline);
+
+ void DoSetInputAssembler(NVRenderInputAssembler *inAssembler)
+ {
+ m_HardwarePropertyContext.m_InputAssembler = inAssembler;
+ m_DirtyFlags |= NVRenderContextDirtyValues::InputAssembler;
+ }
+
+ void DoSetRenderTarget(NVRenderFrameBuffer *inBuffer)
+ {
+ if (inBuffer)
+ m_backend->SetRenderTarget(inBuffer->GetFrameBuffertHandle());
+ else
+ m_backend->SetRenderTarget(m_DefaultOffscreenRenderTarget);
+
+ m_HardwarePropertyContext.m_FrameBuffer = inBuffer;
+ }
+
+ void DoSetReadTarget(NVRenderFrameBuffer *inBuffer)
+ {
+ if (inBuffer)
+ m_backend->SetReadTarget(inBuffer->GetFrameBuffertHandle());
+ else
+ m_backend->SetReadTarget(NVRenderBackend::NVRenderBackendRenderTargetObject(NULL));
+ }
+
+ bool BindShaderToInputAssembler(const NVRenderInputAssembler *inputAssembler,
+ NVRenderShaderProgram *shader);
+ bool ApplyPreDrawProperties();
+ void OnPostDraw();
+
+ public:
+ NVRenderContextImpl(NVFoundationBase &fnd, NVRenderBackend &inBackend,
+ IStringTable &inStrTable);
+ virtual ~NVRenderContextImpl();
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation);
+
+ NVRenderBackend *GetBackend() override { return m_backend; }
+
+ void getMaxTextureSize(QT3DSU32 &oWidth, QT3DSU32 &oHeight) override;
+
+ const char *GetShadingLanguageVersion() override
+ {
+ return m_backend->GetShadingLanguageVersion();
+ }
+
+ NVRenderContextType GetRenderContextType() const override
+ {
+ return m_backend->GetRenderContextType();
+ }
+
+ QT3DSU32 GetDepthBits() const override
+ {
+ // only query this if a framebuffer is bound
+ if (m_HardwarePropertyContext.m_FrameBuffer)
+ return m_backend->GetDepthBits();
+ else
+ return m_DephBits;
+ }
+
+ QT3DSU32 GetStencilBits() const override
+ {
+ // only query this if a framebuffer is bound
+ if (m_HardwarePropertyContext.m_FrameBuffer)
+ return m_backend->GetStencilBits();
+ else
+ return m_StencilBits;
+ }
+
+ bool GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Enum inCap) const override
+ {
+ return m_backend->GetRenderBackendCap(inCap);
+ }
+
+ bool AreMultisampleTexturesSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::MsTexture);
+ }
+
+ bool GetConstantBufferSupport() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::ConstantBuffer);
+ }
+
+ bool AreDXTImagesSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::DxtImages);
+ }
+
+ bool IsDepthStencilSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::DepthStencilTexture);
+ }
+
+ bool IsFpRenderTargetSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::FpRenderTarget);
+ }
+
+ bool IsTessellationSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Tessellation);
+ }
+
+ bool IsGeometryStageSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Geometry);
+ }
+
+ bool IsComputeSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Compute);
+ }
+
+ bool IsSampleQuerySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::SampleQuery);
+ }
+
+ bool IsTimerQuerySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::TimerQuery);
+ }
+
+ bool IsCommandSyncSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::CommandSync);
+ }
+ bool IsTextureArraySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::TextureArray);
+ }
+ bool IsStorageBufferSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::StorageBuffer);
+ }
+ bool IsAtomicCounterBufferSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::AtomicCounterBuffer);
+ }
+ bool IsShaderImageLoadStoreSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::ShaderImageLoadStore);
+ }
+ bool IsProgramPipelineSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::ProgramPipeline);
+ }
+ bool IsPathRenderingSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::PathRendering);
+ }
+ // Are blend modes really supported in HW?
+ bool IsAdvancedBlendHwSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::AdvancedBlend);
+ }
+ bool IsAdvancedBlendHwSupportedKHR() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::AdvancedBlendKHR);
+ }
+ bool IsBlendCoherencySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::BlendCoherency);
+ }
+ bool IsStandardDerivativesSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::StandardDerivatives);
+ }
+ bool IsTextureLodSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::TextureLod);
+ }
+
+ bool isSceneCameraView() const override
+ {
+ return m_isSceneCameraView;
+ }
+
+ void SetDefaultRenderTarget(QT3DSU64 targetID) override
+ {
+ m_DefaultOffscreenRenderTarget =
+ (NVRenderBackend::NVRenderBackendRenderTargetObject)targetID;
+ }
+
+ void SetDefaultDepthBufferBitCount(QT3DSI32 depthBits) override { m_DephBits = depthBits; }
+
+ void setIsSceneCameraView(bool sceneCameraView) override {
+ m_isSceneCameraView = sceneCameraView;
+ }
+
+ virtual NVRenderDepthStencilState *
+ CreateDepthStencilState(bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack) override;
+ void SetDepthStencilState(NVRenderDepthStencilState *inDepthStencilState) override;
+ virtual void StateDestroyed(NVRenderDepthStencilState &state);
+
+ NVRenderRasterizerState *CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace) override;
+ void SetRasterizerState(NVRenderRasterizerState *inRasterizerState) override;
+ virtual void StateDestroyed(NVRenderRasterizerState &state);
+
+ NVRenderVertexBuffer *CreateVertexBuffer(NVRenderBufferUsageType::Enum usageType,
+ size_t size, QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderVertexBuffer *GetVertexBuffer(const void *implementationHandle) override;
+ virtual void BufferDestroyed(NVRenderVertexBuffer &buffer);
+
+ virtual NVRenderIndexBuffer *
+ CreateIndexBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType,
+ qt3ds::render::NVRenderComponentTypes::Enum componentType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderIndexBuffer *GetIndexBuffer(const void *implementationHandle) override;
+ virtual void BufferDestroyed(NVRenderIndexBuffer &buffer);
+
+ virtual NVRenderConstantBuffer *
+ CreateConstantBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderConstantBuffer *GetConstantBuffer(CRegisteredString bufferName) override;
+ virtual void BufferDestroyed(NVRenderConstantBuffer &buffer);
+
+ virtual QT3DSU32 GetNextConstantBufferUnit();
+
+ virtual NVRenderStorageBuffer *
+ CreateStorageBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData, NVRenderDataBuffer *pBuffer) override;
+ NVRenderStorageBuffer *GetStorageBuffer(CRegisteredString bufferName) override;
+ virtual void BufferDestroyed(NVRenderStorageBuffer &buffer);
+
+ virtual NVRenderAtomicCounterBuffer *
+ CreateAtomicCounterBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderAtomicCounterBuffer *GetAtomicCounterBuffer(CRegisteredString bufferName) override;
+ virtual NVRenderAtomicCounterBuffer *
+ GetAtomicCounterBufferByParam(CRegisteredString paramName) override;
+ virtual void BufferDestroyed(NVRenderAtomicCounterBuffer &buffer);
+
+ virtual NVRenderDrawIndirectBuffer *
+ CreateDrawIndirectBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ virtual NVRenderDrawIndirectBuffer *
+ GetDrawIndirectBuffer(NVRenderBackend::NVRenderBackendBufferObject implementationHandle) override;
+ virtual void BufferDestroyed(NVRenderDrawIndirectBuffer &buffer);
+
+ void SetMemoryBarrier(NVRenderBufferBarrierFlags barriers) override;
+
+ NVRenderOcclusionQuery *CreateOcclusionQuery() override;
+ NVRenderTimerQuery *CreateTimerQuery() override;
+ NVRenderSync *CreateSync() override;
+
+ NVRenderTexture2D *CreateTexture2D() override;
+ NVRenderTexture2D *GetTexture2D(const void *implementationHandle) override;
+ virtual void TextureDestroyed(NVRenderTexture2D &buffer);
+
+ NVRenderTexture2DArray *CreateTexture2DArray() override;
+ virtual void TextureDestroyed(NVRenderTexture2DArray &buffer);
+
+ NVRenderTextureCube *CreateTextureCube() override;
+ virtual void TextureDestroyed(NVRenderTextureCube &buffer);
+
+ virtual QT3DSU32 GetNextTextureUnit();
+
+ NVRenderImage2D *CreateImage2D(NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess) override;
+ virtual void ImageDestroyed(NVRenderImage2D &buffer);
+
+ virtual NVRenderRenderBuffer *
+ CreateRenderBuffer(NVRenderRenderBufferFormats::Enum bufferFormat, QT3DSU32 width,
+ QT3DSU32 height) override;
+ NVRenderRenderBuffer *GetRenderBuffer(const void *implementationHandle) override;
+ virtual void RenderBufferDestroyed(NVRenderRenderBuffer &buffer);
+
+ NVRenderFrameBuffer *CreateFrameBuffer() override;
+ NVRenderFrameBuffer *GetFrameBuffer(const void *implementationHandle) override;
+ virtual void FrameBufferDestroyed(NVRenderFrameBuffer &fb);
+
+ virtual NVRenderAttribLayout *
+ CreateAttributeLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs) override;
+ NVRenderInputAssembler *CreateInputAssembler(
+ NVRenderAttribLayout *attribLayout, NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer, NVConstDataRef<QT3DSU32> strides,
+ NVConstDataRef<QT3DSU32> offsets, NVRenderDrawMode::Enum primType, QT3DSU32 patchVertexCount) override;
+ void SetInputAssembler(NVRenderInputAssembler *inputAssembler) override;
+
+ NVRenderVertFragCompilationResult CompileSource(
+ const char *shaderName, NVConstDataRef<QT3DSI8> vertShader,
+ NVConstDataRef<QT3DSI8> fragShader,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>(),
+ bool separateProgram = false,
+ NVRenderShaderProgramBinaryType::Enum type = NVRenderShaderProgramBinaryType::Unknown,
+ bool binaryProgram = false) override;
+
+ virtual NVRenderVertFragCompilationResult
+ CompileBinary(const char *shaderName, NVRenderShaderProgramBinaryType::Enum type,
+ NVDataRef<QT3DSI8> vertShader, NVDataRef<QT3DSI8> fragShader,
+ NVDataRef<QT3DSI8> tessControlShaderSource = NVDataRef<QT3DSI8>(),
+ NVDataRef<QT3DSI8> tessEvaluationShaderSource = NVDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>()) override;
+
+ virtual NVRenderVertFragCompilationResult
+ CompileComputeSource(const char *shaderName, NVConstDataRef<QT3DSI8> computeShaderSource) override;
+
+ NVRenderShaderProgram *GetShaderProgram(const void *implementationHandle) override;
+ virtual void ShaderDestroyed(NVRenderShaderProgram &shader);
+
+ NVRenderProgramPipeline *CreateProgramPipeline() override;
+ NVRenderPathSpecification *CreatePathSpecification() override;
+ NVRenderPathRender *CreatePathRender(size_t range = 1) override;
+ void SetPathProjectionMatrix(const QT3DSMat44 inPathProjection) override;
+ void SetPathModelViewMatrix(const QT3DSMat44 inPathModelview) override;
+ void SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias) override;
+ void SetPathCoverDepthFunc(NVRenderBoolOp::Enum inFunc) override;
+
+ virtual NVRenderPathFontSpecification *
+ CreatePathFontSpecification(CRegisteredString fontName) override;
+ virtual void ReleasePathFontSpecification(NVRenderPathFontSpecification &inPathSpec);
+ NVRenderPathFontItem *CreatePathFontItem() override;
+
+ void SetClearColor(QT3DSVec4 inClearColor) override;
+ QT3DSVec4 GetClearColor() const override { return m_HardwarePropertyContext.m_ClearColor; }
+
+ void SetBlendFunction(NVRenderBlendFunctionArgument inFunctions) override;
+ NVRenderBlendFunctionArgument GetBlendFunction() const override
+ {
+ return m_HardwarePropertyContext.m_BlendFunction;
+ }
+
+ void SetBlendEquation(NVRenderBlendEquationArgument inEquations) override;
+ NVRenderBlendEquationArgument GetBlendEquation() const override
+ {
+ return m_HardwarePropertyContext.m_BlendEquation;
+ };
+
+ void SetCullingEnabled(bool inEnabled) override;
+ bool IsCullingEnabled() const override { return m_HardwarePropertyContext.m_CullingEnabled; }
+
+ void SetDepthFunction(qt3ds::render::NVRenderBoolOp::Enum inFunction) override;
+ qt3ds::render::NVRenderBoolOp::Enum GetDepthFunction() const override
+ {
+ return m_HardwarePropertyContext.m_DepthFunction;
+ }
+
+ void SetBlendingEnabled(bool inEnabled) override;
+ bool IsBlendingEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_BlendingEnabled;
+ }
+
+ void SetDepthWriteEnabled(bool inEnabled) override;
+ bool IsDepthWriteEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_DepthWriteEnabled;
+ }
+ void SetDepthTestEnabled(bool inEnabled) override;
+ bool IsDepthTestEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_DepthTestEnabled;
+ }
+
+ void SetStencilTestEnabled(bool inEnabled) override;
+ bool IsStencilTestEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_StencilTestEnabled;
+ }
+
+ void SetScissorTestEnabled(bool inEnabled) override;
+ bool IsScissorTestEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_ScissorTestEnabled;
+ }
+ void SetScissorRect(NVRenderRect inRect) override;
+ NVRenderRect GetScissorRect() const override
+ {
+ return m_HardwarePropertyContext.m_ScissorRect;
+ }
+
+ void SetViewport(NVRenderRect inViewport) override;
+ NVRenderRect GetViewport() const override { return m_HardwarePropertyContext.m_Viewport; }
+
+ void SetColorWritesEnabled(bool inEnabled) override;
+ bool IsColorWritesEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_ColorWritesEnabled;
+ }
+
+ void SetMultisampleEnabled(bool inEnabled) override;
+ bool IsMultisampleEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_MultisampleEnabled;
+ }
+
+ void SetActiveShader(NVRenderShaderProgram *inShader) override;
+ NVRenderShaderProgram *GetActiveShader() const override
+ {
+ return m_HardwarePropertyContext.m_ActiveShader;
+ }
+
+ void SetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline) override;
+ NVRenderProgramPipeline *GetActiveProgramPipeline() const override
+ {
+ return m_HardwarePropertyContext.m_ActiveProgramPipeline;
+ }
+
+ void DispatchCompute(NVRenderShaderProgram *inShader, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ) override;
+
+ void SetDrawBuffers(NVConstDataRef<QT3DSI32> inDrawBufferSet) override;
+ void SetReadBuffer(NVReadFaces::Enum inReadFace) override;
+
+ void ReadPixels(NVRenderRect inRect, NVRenderReadPixelFormats::Enum inFormat,
+ NVDataRef<QT3DSU8> inWriteBuffer) override;
+
+ void SetRenderTarget(NVRenderFrameBuffer *inBuffer) override;
+ void SetReadTarget(NVRenderFrameBuffer *inBuffer) override;
+ NVRenderFrameBuffer *GetRenderTarget() const override
+ {
+ return m_HardwarePropertyContext.m_FrameBuffer;
+ }
+
+ void ResetBlendState() override;
+
+ // Push the entire set of properties.
+ void PushPropertySet() override { m_PropertyStack.push_back(m_HardwarePropertyContext); }
+
+ // Pop the entire set of properties, potentially forcing the values
+ // to opengl.
+ void PopPropertySet(bool inForceSetProperties) override;
+
+ // clear current bound render target
+ void Clear(NVRenderClearFlags flags) override;
+ // clear passed in rendertarget
+ void Clear(NVRenderFrameBuffer &fb, NVRenderClearFlags flags) override;
+
+ // copy framebuffer content between read target and render target
+ void BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter) override;
+
+ void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset) override;
+ void DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset) override;
+
+ NVFoundationBase &GetFoundation() override { return m_Foundation; }
+ qt3ds::foundation::IStringTable &GetStringTable() override { return m_StringTable; }
+ NVAllocatorCallback &GetAllocator() override { return m_Foundation.getAllocator(); }
+ QSurfaceFormat format() const override
+ {
+ return m_backend->format();
+ }
+ virtual void resetStates()
+ {
+ PushPropertySet();
+ PopPropertySet(true);
+ }
+ };
+}
+}
+#endif
diff --git a/src/render/Qt3DSRenderDataBuffer.cpp b/src/render/Qt3DSRenderDataBuffer.cpp
new file mode 100644
index 0000000..b00b0af
--- /dev/null
+++ b/src/render/Qt3DSRenderDataBuffer.cpp
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderDataBuffer.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSFoundation.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderDataBuffer::NVRenderDataBuffer(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ size_t size, NVRenderBufferBindFlags bindFlags,
+ NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_UsageType(usageType)
+ , m_BindFlags(bindFlags)
+ , m_BufferData(data)
+ , m_BufferCapacity(data.size())
+ , m_BufferSize(size)
+ , m_OwnsData(false)
+ , m_Mapped(false)
+ {
+ m_BufferHandle =
+ m_Backend->CreateBuffer(size, bindFlags, usageType, (const void *)m_BufferData.begin());
+ }
+
+ NVRenderDataBuffer::~NVRenderDataBuffer()
+ {
+ if (m_BufferHandle) {
+ m_Backend->ReleaseBuffer(m_BufferHandle);
+ }
+ m_BufferHandle = 0;
+
+ releaseMemory();
+ }
+
+ void NVRenderDataBuffer::releaseMemory()
+ {
+ // chekc if we should release memory
+ if (m_BufferData.size() && m_OwnsData) {
+ m_Foundation.getAllocator().deallocate(m_BufferData.begin());
+ }
+
+ m_BufferData = NVDataRef<QT3DSU8>();
+ m_OwnsData = false;
+ }
+
+ NVDataRef<QT3DSU8> NVRenderDataBuffer::MapBuffer()
+ {
+ // don't map twice
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to map a mapped buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ QT3DSU8 *pData = (QT3DSU8 *)m_Backend->MapBuffer(
+ m_BufferHandle, m_BindFlags, 0, m_BufferSize,
+ NVRenderBufferAccessFlags(NVRenderBufferAccessTypeValues::Read
+ | NVRenderBufferAccessTypeValues::Write));
+
+ releaseMemory();
+ m_BufferData = toDataRef(const_cast<QT3DSU8 *>(pData), (QT3DSU32)m_BufferSize);
+ m_BufferCapacity = (QT3DSU32)m_BufferSize;
+ m_OwnsData = false;
+
+ // currently we return a reference to the system memory
+ m_Mapped = true;
+ return m_BufferData;
+ }
+
+ NVDataRef<QT3DSU8> NVRenderDataBuffer::MapBufferRange(size_t offset, size_t size,
+ NVRenderBufferAccessFlags flags)
+ {
+ // don't map twice
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to map a mapped buffer");
+ QT3DS_ASSERT(false);
+ }
+ // don't map out of range
+ if ((m_BufferSize < (offset + size)) || (size == 0)) {
+ qCCritical(INVALID_OPERATION, "Attempting to map out of buffer range");
+ QT3DS_ASSERT(false);
+ }
+
+ QT3DSU8 *pData =
+ (QT3DSU8 *)m_Backend->MapBuffer(m_BufferHandle, m_BindFlags, offset, size, flags);
+
+ releaseMemory();
+ m_BufferData = toDataRef(const_cast<QT3DSU8 *>(pData), (QT3DSU32)size);
+ m_BufferCapacity = (QT3DSU32)size;
+ m_OwnsData = false;
+
+ // currently we return a reference to the system memory
+ m_Mapped = true;
+ return m_BufferData;
+ }
+
+ void NVRenderDataBuffer::UnmapBuffer()
+ {
+ if (m_Mapped) {
+ // update hardware
+ m_Backend->UnmapBuffer(m_BufferHandle, m_BindFlags);
+ m_Mapped = false;
+ releaseMemory();
+ }
+ }
+
+ void NVRenderDataBuffer::UpdateBuffer(NVConstDataRef<QT3DSU8> data, bool ownsMemory)
+ {
+ // don't update a mapped buffer
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to update a mapped buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ releaseMemory();
+
+ m_BufferData = toDataRef(const_cast<QT3DSU8 *>(data.begin()), data.size());
+ m_BufferCapacity = data.mSize;
+ m_OwnsData = ownsMemory;
+ // update hardware
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, m_BufferCapacity, m_UsageType,
+ (const void *)m_BufferData.begin());
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderDataBuffer.h b/src/render/Qt3DSRenderDataBuffer.h
new file mode 100644
index 0000000..579e236
--- /dev/null
+++ b/src/render/Qt3DSRenderDataBuffer.h
@@ -0,0 +1,188 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_DATA_BUFFER_H
+#define QT3DS_RENDER_DATA_BUFFER_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ // forward declaration
+ class NVRenderContextImpl;
+ class NVRenderBackend;
+
+ ///< Base class
+ class NVRenderDataBuffer : public NVRefCounted, public NVRenderImplemented
+ {
+ protected:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderBufferUsageType::Enum m_UsageType; ///< usage type
+ NVRenderBufferBindFlags m_BindFlags; ///< bind flags
+ NVDataRef<QT3DSU8> m_BufferData; ///< buffer data pointer
+ QT3DSU32 m_BufferCapacity; ///< size of internal backup buffer (m_BufferData)
+ size_t m_BufferSize; ///< size of buffer
+ bool m_OwnsData; ///< true when we own m_BufferData
+ bool m_Mapped; ///< true when locked for reading or writing to m_BufferData
+ NVRenderBackend::NVRenderBackendBufferObject m_BufferHandle; ///< opaque backend handle
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] size Size of the buffer
+ * @param[in] bindFlags Where to binf this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ *application.
+ *
+ * @return No return.
+ */
+ NVRenderDataBuffer(NVRenderContextImpl &context, NVFoundationBase &fnd, size_t size,
+ NVRenderBufferBindFlags bindFlags,
+ NVRenderBufferUsageType::Enum usageType, NVDataRef<QT3DSU8> data);
+
+ virtual ~NVRenderDataBuffer();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ /**
+ * @brief Get Buffer usage type
+ *
+ * @return Return usage tyoe
+ */
+ virtual NVRenderBufferUsageType::Enum GetBufferUsageType() const
+ {
+ return m_UsageType;
+ }
+
+ /**
+ * @brief Get Buffer usage type
+ * Should be overwritten
+ *
+ * @return Return usage tyoe
+ */
+ virtual NVRenderBufferBindFlags GetBufferBindings() const { return m_BindFlags; }
+
+ /**
+ * @brief Return buffer size in byte
+ *
+ * @return Return size
+ */
+ virtual QT3DSU32 Size() { return (QT3DSU32)m_BufferSize; }
+
+ /**
+ * @brief Get a pointer to the foundation
+ *
+ * @return pointer to foundation
+ */
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ /**
+ * @brief bind the buffer bypasses the context state
+ *
+ * @return no return.
+ */
+ virtual void Bind() = 0;
+
+ /**
+ * @brief Map the buffer
+ * Mapped buffers cannot be used for rendering
+ *
+ * @return Return mapped pointer to data
+ */
+ virtual NVDataRef<QT3DSU8> MapBuffer();
+
+ /**
+ * @brief Map a range of a buffer
+ * Mapped buffers cannot be used for rendering
+ *
+ * @param[in] offset Offset in bytes into the buffer
+ * @param[in] size Range in bytes to map
+ * @param[in] flags Buffer access flags
+ *
+ * @return Return mapped pointer to data
+ */
+ virtual NVDataRef<QT3DSU8> MapBufferRange(size_t offset, size_t size,
+ NVRenderBufferAccessFlags flags);
+
+ /**
+ * @brief Unmap the buffer
+ * This updates the data to the hardware
+ *
+ * @return no return
+ */
+ virtual void UnmapBuffer();
+
+ /**
+ * @brief constructor
+ *
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ * @param[in] ownsMemory If true data will be owned by this object and can therefore be
+ * released
+ *
+ * @return No return.
+ */
+ virtual void UpdateBuffer(NVConstDataRef<QT3DSU8> data, bool ownsMemory = false);
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendBufferObject GetBuffertHandle() const = 0;
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override = 0;
+
+ private:
+ void releaseMemory();
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderDepthStencilState.cpp b/src/render/Qt3DSRenderDepthStencilState.cpp
new file mode 100644
index 0000000..3ea47e2
--- /dev/null
+++ b/src/render/Qt3DSRenderDepthStencilState.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/vector.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderDepthStencilState.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderDepthStencilState::NVRenderDepthStencilState(
+ NVRenderContextImpl &context, NVFoundationBase &fnd, bool enableDepth, bool depthMask,
+ NVRenderBoolOp::Enum depthFunc, bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_DepthEnabled(enableDepth)
+ , m_DepthMask(depthMask)
+ , m_DepthFunc(depthFunc)
+ , m_StencilEnabled(enableStencil)
+ , m_StencilFuncFront(stencilFuncFront)
+ , m_StencilFuncBack(stencilFuncBack)
+ , m_DepthStencilOpFront(depthStencilOpFront)
+ , m_DepthStencilOpBack(depthStencilOpBack)
+ {
+ // create backend handle
+ m_StateHandle = m_Backend->CreateDepthStencilState(
+ enableDepth, depthMask, depthFunc, enableStencil, stencilFuncFront, stencilFuncBack,
+ depthStencilOpFront, depthStencilOpBack);
+ }
+
+ NVRenderDepthStencilState::~NVRenderDepthStencilState()
+ {
+ if (m_StateHandle) {
+ m_Context.StateDestroyed(*this);
+ m_Backend->ReleaseDepthStencilState(m_StateHandle);
+ }
+ }
+
+ NVRenderDepthStencilState *
+ NVRenderDepthStencilState::Create(NVRenderContextImpl &context, bool enableDepth,
+ bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack)
+ {
+ return QT3DS_NEW(context.GetFoundation().getAllocator(), NVRenderDepthStencilState)(
+ context, context.GetFoundation(), enableDepth, depthMask, depthFunc, enableStencil,
+ stencilFuncFront, stencilFuncBack, depthStencilOpFront, depthStencilOpBack);
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderDepthStencilState.h b/src/render/Qt3DSRenderDepthStencilState.h
new file mode 100644
index 0000000..e6b3198
--- /dev/null
+++ b/src/render/Qt3DSRenderDepthStencilState.h
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_DEPTH_STENCIL_STATE_H
+#define QT3DS_RENDER_DEPTH_STENCIL_STATE_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+
+ // currently this handles only stencil state
+ class NVRenderDepthStencilState : public NVRefCounted
+ {
+
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderBackend::NVRenderBackendDepthStencilStateObject
+ m_StateHandle; ///< opaque backend handle
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] enableDepth enable depth test
+ * @param[in] depthMask enable depth writes
+ * @param[in] depthFunc depth compare function
+ * @param[in] enableStencil enable stencil test
+ * @param[in] stencilFuncFront stencil setup front faces
+ * @param[in] stencilFuncBack stencil setup back faces
+ * @param[in] depthStencilOpFront depth/stencil operations front faces
+ * @param[in] depthStencilOpBack depth/stencil operations back faces
+ *
+ * @return No return.
+ */
+ NVRenderDepthStencilState(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack);
+
+ virtual ~NVRenderDepthStencilState();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ ///< various get functions
+ const NVRenderStencilFunctionArgument GetStencilFunc(NVRenderFaces::Enum face) const
+ {
+ return (face == NVRenderFaces::Back) ? m_StencilFuncBack : m_StencilFuncFront;
+ }
+ const NVRenderStencilOperationArgument GetStencilOp(NVRenderFaces::Enum face) const
+ {
+ return (face == NVRenderFaces::Back) ? m_DepthStencilOpBack : m_DepthStencilOpFront;
+ }
+ NVRenderBoolOp::Enum GetDepthFunc() const { return m_DepthFunc; }
+ bool GetDepthEnabled() const { return m_DepthEnabled; }
+ bool GetStencilEnabled() const { return m_StencilEnabled; }
+ bool GetDepthMask() const { return m_DepthMask; }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendDepthStencilStateObject
+ GetDepthStencilObjectHandle()
+ {
+ return m_StateHandle;
+ }
+
+ static NVRenderDepthStencilState *
+ Create(NVRenderContextImpl &context, bool enableDepth, bool depthMask,
+ NVRenderBoolOp::Enum depthFunc, bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack);
+
+ private:
+ bool m_DepthEnabled; ///< depth test enabled
+ bool m_DepthMask; ///< depth writes enabled
+ NVRenderBoolOp::Enum m_DepthFunc; ///< depth comparison func
+ bool m_StencilEnabled; ///< stencil test enabled
+ NVRenderStencilFunctionArgument m_StencilFuncFront; ///< stencil setup front faces
+ NVRenderStencilFunctionArgument m_StencilFuncBack; ///< stencil setup back faces
+ NVRenderStencilOperationArgument
+ m_DepthStencilOpFront; ///< depth stencil operation front faces
+ NVRenderStencilOperationArgument
+ m_DepthStencilOpBack; ///< depth stencil operation back faces
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderDrawIndirectBuffer.cpp b/src/render/Qt3DSRenderDrawIndirectBuffer.cpp
new file mode 100644
index 0000000..9940003
--- /dev/null
+++ b/src/render/Qt3DSRenderDrawIndirectBuffer.cpp
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderDrawIndirectBuffer.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderDrawIndirectBuffer::NVRenderDrawIndirectBuffer(NVRenderContextImpl &context,
+ size_t size,
+ NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data)
+ : NVRenderDataBuffer(context, context.GetFoundation(), size,
+ NVRenderBufferBindValues::Draw_Indirect, usageType, data)
+ , m_Dirty(true)
+ {
+ }
+
+ NVRenderDrawIndirectBuffer::~NVRenderDrawIndirectBuffer() { m_Context.BufferDestroyed(*this); }
+
+ void NVRenderDrawIndirectBuffer::Bind()
+ {
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to Bind a locked buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ m_Backend->BindBuffer(m_BufferHandle, m_BindFlags);
+ }
+
+ void NVRenderDrawIndirectBuffer::Update()
+ {
+ // we only update the buffer if it is dirty and we actually have some data
+ if (m_Dirty && m_BufferData.size()) {
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, m_BufferData.size(), m_UsageType,
+ m_BufferData.begin());
+ m_Dirty = false;
+ }
+ }
+
+ void NVRenderDrawIndirectBuffer::UpdateData(QT3DSI32 offset, NVDataRef<QT3DSU8> data)
+ {
+ // we only update the buffer if we something
+ if (data.size())
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, data.size(), m_UsageType,
+ data.begin() + offset);
+ }
+
+ NVRenderDrawIndirectBuffer *
+ NVRenderDrawIndirectBuffer::Create(NVRenderContextImpl &context,
+ NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVFoundationBase &fnd(context.GetFoundation());
+ NVRenderDrawIndirectBuffer *retval = NULL;
+
+ // these are the context flags which do not support this drawing mode
+ NVRenderContextType noDrawIndirectSupported(
+ NVRenderContextValues::GL2 | NVRenderContextValues::GLES2 | NVRenderContextValues::GL3
+ | NVRenderContextValues::GLES3);
+ NVRenderContextType ctxType = context.GetRenderContextType();
+
+ if (!(ctxType & noDrawIndirectSupported)) {
+ QT3DSU32 bufSize = sizeof(NVRenderDrawIndirectBuffer);
+ QT3DSU8 *newMem = (QT3DSU8 *)QT3DS_ALLOC(fnd.getAllocator(), bufSize, "DrawIndirectBuffer");
+ retval = new (newMem) NVRenderDrawIndirectBuffer(
+ context, size, usageType,
+ toDataRef(const_cast<QT3DSU8 *>(bufferData.begin()), bufferData.size()));
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderDrawIndirectBuffer.h b/src/render/Qt3DSRenderDrawIndirectBuffer.h
new file mode 100644
index 0000000..81cd59d
--- /dev/null
+++ b/src/render/Qt3DSRenderDrawIndirectBuffer.h
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_DRAW_INDIRECT_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_DRAW_INDIRECT_BUFFER_H
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Utils.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderDataBuffer.h"
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ // forward declaration
+ class NVRenderContextImpl;
+
+ struct DrawArraysIndirectCommand
+ {
+ QT3DSU32 count;
+ QT3DSU32 primCount;
+ QT3DSU32 first;
+ QT3DSU32 baseInstance;
+ };
+
+ struct DrawElementsIndirectCommand
+ {
+ QT3DSU32 count;
+ QT3DSU32 primCount;
+ QT3DSU32 firstIndex;
+ QT3DSU32 baseVertex;
+ QT3DSU32 baseInstance;
+ };
+
+ ///< Constant (uniform) buffer representation
+ class NVRenderDrawIndirectBuffer : public NVRenderDataBuffer
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return.
+ */
+ NVRenderDrawIndirectBuffer(NVRenderContextImpl &context, size_t size,
+ NVRenderBufferUsageType::Enum usageType, NVDataRef<QT3DSU8> data);
+
+ ///< destructor
+ virtual ~NVRenderDrawIndirectBuffer();
+
+ /**
+ * @brief bind the buffer bypasses the context state
+ *
+ * @return no return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief update the buffer to hardware
+ *
+ * @return no return.
+ */
+ virtual void Update();
+
+ /**
+ * @brief update a piece of memory directly within the storage buffer
+ *
+ * Note: When you use this function you should know what you are doing.
+ * The memory layout within C++ must exactly match the memory layout in the
+ *shader.
+ * We use std140 (430) layout which guarantees a specific layout behavior across
+ *all HW vendors.
+ * How the memory layout is computed can be found in the GL spec.
+ *
+ * @param[in] offset offset into storage buffer
+ * @param[in] data pointer to data
+ *
+ * @return no return
+ */
+ void UpdateData(QT3DSI32 offset, NVDataRef<QT3DSU8> data);
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendBufferObject GetBuffertHandle() const override
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_BufferHandle);
+ }
+
+ /**
+ * @brief create a NVRenderDrawIndirectBuffer object
+ *
+ * @param[in] context Pointer to context
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return the buffer object or NULL
+ */
+ static NVRenderDrawIndirectBuffer *Create(NVRenderContextImpl &context,
+ NVRenderBufferUsageType::Enum usageType,
+ size_t size, NVConstDataRef<QT3DSU8> bufferData);
+
+ private:
+ bool m_Dirty; ///< true if buffer is dirty
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderDrawable.h b/src/render/Qt3DSRenderDrawable.h
new file mode 100644
index 0000000..0f78aac
--- /dev/null
+++ b/src/render/Qt3DSRenderDrawable.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_DRAWABLE_H
+#define QT3DS_RENDER_QT3DS_RENDER_DRAWABLE_H
+#include "Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+ class NVRenderDrawable
+ {
+ protected:
+ virtual ~NVRenderDrawable() {}
+
+ public:
+ /**
+ * Draw using this object.
+ * offset is in num elements, not in number of bytes
+ * because the various different draw functions differ in what datatype
+ * offset is (gl drawarrays vs gl drawindexedarras).
+ */
+ virtual void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset) = 0;
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderFragmentShader.cpp b/src/render/Qt3DSRenderFragmentShader.cpp
new file mode 100644
index 0000000..e2f31f1
--- /dev/null
+++ b/src/render/Qt3DSRenderFragmentShader.cpp
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderFragmentShader.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderFragmentShader::NVRenderFragmentShader(NVRenderContextImpl &context,
+ NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram)
+ : NVRenderShader(context, fnd, source, binaryProgram)
+ , m_ShaderHandle(NULL)
+ {
+ m_ShaderHandle = m_Backend->CreateFragmentShader(source, m_ErrorMessage, binaryProgram);
+ }
+
+ NVRenderFragmentShader::~NVRenderFragmentShader()
+ {
+ if (m_ShaderHandle) {
+ m_Backend->ReleaseFragmentShader(m_ShaderHandle);
+ }
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderFragmentShader.h b/src/render/Qt3DSRenderFragmentShader.h
new file mode 100644
index 0000000..f661605
--- /dev/null
+++ b/src/render/Qt3DSRenderFragmentShader.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_FRAGMENT_SHADER_H
+#define QT3DS_RENDER_FRAGMENT_SHADER_H
+
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderShader.h"
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+
+ ///< This class represents a fragment shader
+ class NVRenderFragmentShader : public NVRenderShader
+ {
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] source Pointer to shader source code
+ * @param[in] binaryProgram true if this is a binary program
+ *
+ * @return No return.
+ */
+ NVRenderFragmentShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram);
+
+ /// @brief destructor
+ ~NVRenderFragmentShader();
+
+ /**
+ * @brief Query if shader compiled succesfuly
+ *
+ * @return True if shader is valid.
+ */
+ bool IsValid() override { return (m_ShaderHandle != NULL); }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendFragmentShaderObject GetShaderHandle()
+ {
+ return m_ShaderHandle;
+ }
+
+ private:
+ NVRenderBackend::NVRenderBackendFragmentShaderObject
+ m_ShaderHandle; ///< opaque backend handle
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderFrameBuffer.cpp b/src/render/Qt3DSRenderFrameBuffer.cpp
new file mode 100644
index 0000000..0ab3842
--- /dev/null
+++ b/src/render/Qt3DSRenderFrameBuffer.cpp
@@ -0,0 +1,300 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderFrameBuffer::NVRenderFrameBuffer(NVRenderContextImpl &context, NVFoundationBase &fnd)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_BufferHandle(NULL)
+ , m_AttachmentBits(0)
+ {
+ m_BufferHandle = m_Backend->CreateRenderTarget();
+ QT3DS_ASSERT(m_BufferHandle);
+ }
+
+ NVRenderFrameBuffer::~NVRenderFrameBuffer()
+ {
+ m_Context.FrameBufferDestroyed(*this);
+ m_Backend->ReleaseRenderTarget(m_BufferHandle);
+ m_BufferHandle = 0;
+ m_AttachmentBits = 0;
+
+ // release attachments
+ QT3DS_FOREACH(idx, (QT3DSU32)NVRenderFrameBufferAttachments::LastAttachment)
+ {
+ if ((NVRenderFrameBufferAttachments::Enum)idx
+ != NVRenderFrameBufferAttachments::DepthStencil
+ || m_Context.IsDepthStencilSupported())
+ releaseAttachment((NVRenderFrameBufferAttachments::Enum)idx);
+ }
+ }
+
+ inline void CheckAttachment(NVRenderContext &ctx,
+ NVRenderFrameBufferAttachments::Enum attachment)
+ {
+#ifdef _DEBUG
+ QT3DS_ASSERT(attachment != NVRenderFrameBufferAttachments::DepthStencil
+ || ctx.IsDepthStencilSupported());
+#endif
+ (void)ctx;
+ (void)attachment;
+ }
+
+ NVRenderTextureTargetType::Enum
+ NVRenderFrameBuffer::releaseAttachment(NVRenderFrameBufferAttachments::Enum idx)
+ {
+ NVRenderTextureTargetType::Enum target = NVRenderTextureTargetType::Unknown;
+
+ NVRenderTextureOrRenderBuffer Attach = m_Attachments[idx];
+ if (Attach.HasTexture2D()) {
+ target = (Attach.GetTexture2D()->IsMultisampleTexture())
+ ? NVRenderTextureTargetType::Texture2D_MS
+ : NVRenderTextureTargetType::Texture2D;
+ Attach.GetTexture2D()->release();
+ } else if (Attach.HasTexture2DArray()) {
+ target = (Attach.GetTexture2DArray()->IsMultisampleTexture())
+ ? NVRenderTextureTargetType::Texture2D_MS
+ : NVRenderTextureTargetType::Texture2D_Array;
+ Attach.GetTexture2DArray()->release();
+ } else if (Attach.HasTextureCube()) {
+ target = (Attach.GetTextureCube()->IsMultisampleTexture())
+ ? NVRenderTextureTargetType::Texture2D_MS
+ : NVRenderTextureTargetType::TextureCube;
+ Attach.GetTextureCube()->release();
+ } else if (Attach.HasRenderBuffer())
+ Attach.GetRenderBuffer()->release();
+
+ CheckAttachment(m_Context, idx);
+ m_Attachments[idx] = NVRenderTextureOrRenderBuffer();
+
+ m_AttachmentBits &= ~(1 << idx);
+
+ return target;
+ }
+
+ NVRenderTextureOrRenderBuffer
+ NVRenderFrameBuffer::GetAttachment(NVRenderFrameBufferAttachments::Enum attachment)
+ {
+ if (attachment == NVRenderFrameBufferAttachments::Unknown
+ || attachment > NVRenderFrameBufferAttachments::LastAttachment) {
+ qCCritical(INVALID_PARAMETER, "Attachment out of range");
+ return NVRenderTextureOrRenderBuffer();
+ }
+ CheckAttachment(m_Context, attachment);
+ return m_Attachments[attachment];
+ }
+
+ void NVRenderFrameBuffer::Attach(NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderTextureOrRenderBuffer buffer,
+ NVRenderTextureTargetType::Enum target)
+ {
+ if (attachment == NVRenderFrameBufferAttachments::Unknown
+ || attachment > NVRenderFrameBufferAttachments::LastAttachment) {
+ qCCritical(INVALID_PARAMETER, "Attachment out of range");
+ return;
+ }
+
+ // early out
+ // if there is nothing to detach
+ if (!buffer.HasTexture2D() && !buffer.HasRenderBuffer() && !buffer.HasTexture2DArray()
+ && !(m_AttachmentBits & (1 << attachment)))
+ return;
+
+ CheckAttachment(m_Context, attachment);
+ // Ensure we are the bound framebuffer
+ m_Context.SetRenderTarget(this);
+
+ // release previous attachments
+ NVRenderTextureTargetType::Enum theRelTarget = releaseAttachment(attachment);
+
+ if (buffer.HasTexture2D()) {
+ // On the same attachment point there could be a something attached with a different
+ // target MSAA <--> NoMSAA
+ if (theRelTarget != NVRenderTextureTargetType::Unknown && theRelTarget != target)
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ NVRenderBackend::NVRenderBackendTextureObject(NULL),
+ theRelTarget);
+
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ buffer.GetTexture2D()->GetTextureObjectHandle(), target);
+ buffer.GetTexture2D()->addRef();
+ m_AttachmentBits |= (1 << attachment);
+ } else if (buffer.HasTexture2DArray()) {
+ // On the same attachment point there could be a something attached with a different
+ // target MSAA <--> NoMSAA
+ if (theRelTarget != NVRenderTextureTargetType::Unknown && theRelTarget != target)
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ NVRenderBackend::NVRenderBackendTextureObject(NULL),
+ theRelTarget);
+
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ buffer.GetTexture2D()->GetTextureObjectHandle(), target);
+ buffer.GetTexture2DArray()->addRef();
+ m_AttachmentBits |= (1 << attachment);
+ } else if (buffer.HasRenderBuffer()) {
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ buffer.GetRenderBuffer()->GetRenderBuffertHandle());
+ buffer.GetRenderBuffer()->addRef();
+ m_AttachmentBits |= (1 << attachment);
+ } else if (theRelTarget == NVRenderTextureTargetType::Unknown) {
+ // detach renderbuffer
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ NVRenderBackend::NVRenderBackendRenderbufferObject(NULL));
+ } else {
+ // detach texture
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ NVRenderBackend::NVRenderBackendTextureObject(NULL),
+ theRelTarget);
+ }
+ m_Attachments[attachment] = buffer;
+ }
+
+ void NVRenderFrameBuffer::AttachLayer(NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderTextureOrRenderBuffer buffer, QT3DSI32 layer,
+ QT3DSI32 level)
+ {
+ if (attachment == NVRenderFrameBufferAttachments::Unknown
+ || attachment > NVRenderFrameBufferAttachments::LastAttachment) {
+ qCCritical(INVALID_PARAMETER, "Attachment out of range");
+ return;
+ }
+
+ // This function is only used for attaching a layer
+ // If texture exists probably something is wrong
+ if (!buffer.HasTexture2DArray()) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ CheckAttachment(m_Context, attachment);
+ // Ensure we are the bound framebuffer
+ m_Context.SetRenderTarget(this);
+
+ // release previous attachments
+ NVRenderTextureTargetType::Enum theRelTarget = releaseAttachment(attachment);
+
+ // On the same attachment point there could be a something attached with a different target
+ // MSAA <--> NoMSAA
+ if (theRelTarget != NVRenderTextureTargetType::Unknown
+ && theRelTarget != NVRenderTextureTargetType::Texture2D_Array)
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ NVRenderBackend::NVRenderBackendTextureObject(NULL),
+ theRelTarget);
+
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ buffer.GetTexture2DArray()->GetTextureObjectHandle(), level,
+ layer);
+ buffer.GetTexture2DArray()->addRef();
+ m_AttachmentBits |= (1 << attachment);
+
+ m_Attachments[attachment] = buffer;
+ }
+
+ void NVRenderFrameBuffer::AttachFace(NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderTextureOrRenderBuffer buffer,
+ NVRenderTextureCubeFaces::Enum face)
+ {
+ if (attachment == NVRenderFrameBufferAttachments::Unknown
+ || attachment > NVRenderFrameBufferAttachments::LastAttachment) {
+ qCCritical(INVALID_PARAMETER, "Attachment out of range");
+ return;
+ }
+
+ if (face == NVRenderTextureCubeFaces::InvalidFace) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ CheckAttachment(m_Context, attachment);
+ // Ensure we are the bound framebuffer
+ m_Context.SetRenderTarget(this);
+
+ // release previous attachments
+ NVRenderTextureTargetType::Enum attachTarget = static_cast<NVRenderTextureTargetType::Enum>(
+ (int)NVRenderTextureTargetType::TextureCube + (int)face);
+ NVRenderTextureTargetType::Enum theRelTarget = releaseAttachment(attachment);
+
+ // If buffer has no texture cube, this call is used to detach faces.
+ // If release target is not cube, there is something else attached to that
+ // attachment point, so we want to release that first. E.g (MSAA <--> NoMSAA)
+ if (theRelTarget == NVRenderTextureTargetType::TextureCube && !buffer.HasTextureCube()) {
+ theRelTarget = attachTarget;
+ attachTarget = NVRenderTextureTargetType::Unknown;
+ } else if (theRelTarget == NVRenderTextureTargetType::TextureCube) {
+ theRelTarget = NVRenderTextureTargetType::Unknown;
+ }
+ if (theRelTarget != NVRenderTextureTargetType::Unknown) {
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ NVRenderBackend::NVRenderBackendTextureObject(NULL),
+ theRelTarget);
+ }
+
+ if (attachTarget != NVRenderTextureTargetType::Unknown) {
+ m_Backend->RenderTargetAttach(m_BufferHandle, attachment,
+ buffer.GetTextureCube()->GetTextureObjectHandle(),
+ attachTarget);
+ buffer.GetTextureCube()->addRef();
+ m_AttachmentBits |= (1 << attachment);
+ }
+
+ m_Attachments[attachment] = buffer;
+ }
+
+ bool NVRenderFrameBuffer::IsComplete()
+ {
+ // Ensure we are the bound framebuffer
+ m_Context.SetRenderTarget(this);
+
+ return m_Backend->RenderTargetIsValid(m_BufferHandle);
+ }
+}
+}
+
+qt3ds::render::NVRenderFrameBuffer *
+qt3ds::render::NVRenderFrameBuffer::Create(NVRenderContextImpl &context)
+{
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderFrameBuffer)(context, context.GetFoundation());
+}
diff --git a/src/render/Qt3DSRenderFrameBuffer.h b/src/render/Qt3DSRenderFrameBuffer.h
new file mode 100644
index 0000000..1882a27
--- /dev/null
+++ b/src/render/Qt3DSRenderFrameBuffer.h
@@ -0,0 +1,277 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_FRAME_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_FRAME_BUFFER_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAssert.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+ class NVRenderTexture2D;
+ class NVRenderRenderBuffer;
+ class NVRenderTexture2DArray;
+ class NVRenderTextureCube;
+
+ class NVRenderTextureOrRenderBuffer
+ {
+ NVRenderTexture2D *m_Texture2D;
+ NVRenderTexture2DArray *m_Texture2DArray;
+ NVRenderTextureCube *m_TextureCube;
+ NVRenderRenderBuffer *m_RenderBuffer;
+
+ public:
+ NVRenderTextureOrRenderBuffer(NVRenderTexture2D &texture)
+ : m_Texture2D(&texture)
+ , m_Texture2DArray(NULL)
+ , m_TextureCube(NULL)
+ , m_RenderBuffer(NULL)
+ {
+ }
+ NVRenderTextureOrRenderBuffer(NVRenderRenderBuffer &render)
+ : m_Texture2D(NULL)
+ , m_Texture2DArray(NULL)
+ , m_TextureCube(NULL)
+ , m_RenderBuffer(&render)
+ {
+ }
+ NVRenderTextureOrRenderBuffer(NVRenderTexture2DArray &textureArray)
+ : m_Texture2D(NULL)
+ , m_Texture2DArray(&textureArray)
+ , m_TextureCube(NULL)
+ , m_RenderBuffer(NULL)
+ {
+ }
+ NVRenderTextureOrRenderBuffer(NVRenderTextureCube &textureCube)
+ : m_Texture2D(NULL)
+ , m_Texture2DArray(NULL)
+ , m_TextureCube(&textureCube)
+ , m_RenderBuffer(NULL)
+ {
+ }
+ NVRenderTextureOrRenderBuffer()
+ : m_Texture2D(NULL)
+ , m_Texture2DArray(NULL)
+ , m_TextureCube(NULL)
+ , m_RenderBuffer(NULL)
+ {
+ }
+ NVRenderTextureOrRenderBuffer(const NVRenderTextureOrRenderBuffer &other)
+ : m_Texture2D(other.m_Texture2D)
+ , m_Texture2DArray(other.m_Texture2DArray)
+ , m_TextureCube(other.m_TextureCube)
+ , m_RenderBuffer(other.m_RenderBuffer)
+ {
+ }
+ NVRenderTextureOrRenderBuffer &operator=(const NVRenderTextureOrRenderBuffer &other)
+ {
+ if (this != &other) {
+ m_Texture2D = const_cast<NVRenderTexture2D *>(other.m_Texture2D);
+ m_Texture2DArray = const_cast<NVRenderTexture2DArray *>(other.m_Texture2DArray);
+ m_RenderBuffer = const_cast<NVRenderRenderBuffer *>(other.m_RenderBuffer);
+ m_TextureCube = const_cast<NVRenderTextureCube *>(other.m_TextureCube);
+ }
+ return *this;
+ }
+
+ bool HasTexture2D() const { return m_Texture2D != NULL; }
+ bool HasTexture2DArray() const { return m_Texture2DArray != NULL; }
+ bool HasTextureCube() const { return m_TextureCube != NULL; }
+ bool HasRenderBuffer() const { return m_RenderBuffer != NULL; }
+
+ NVRenderTexture2D *GetTexture2D() const
+ {
+ QT3DS_ASSERT(HasTexture2D());
+ return m_Texture2D;
+ }
+ NVRenderTexture2DArray *GetTexture2DArray() const
+ {
+ QT3DS_ASSERT(HasTexture2DArray());
+ return m_Texture2DArray;
+ }
+ NVRenderTextureCube *GetTextureCube() const
+ {
+ QT3DS_ASSERT(HasTextureCube());
+ return m_TextureCube;
+ }
+ NVRenderRenderBuffer *GetRenderBuffer() const
+ {
+ QT3DS_ASSERT(HasRenderBuffer());
+ return m_RenderBuffer;
+ }
+ };
+
+ class NVRenderFrameBuffer : public NVRefCounted, public NVRenderImplemented
+ {
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+
+ NVRenderTextureOrRenderBuffer
+ m_Attachments[NVRenderFrameBufferAttachments::LastAttachment]; ///< attachments array
+ NVRenderBackend::NVRenderBackendRenderTargetObject
+ m_BufferHandle; ///< opaque backend handle
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderFrameBuffer(NVRenderContextImpl &context, NVFoundationBase &fnd);
+
+ /// destructor
+ virtual ~NVRenderFrameBuffer();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ /**
+ * @brief query attachment
+ *
+ *
+ * @return buffer format
+ */
+ virtual NVRenderTextureOrRenderBuffer
+ GetAttachment(NVRenderFrameBufferAttachments::Enum attachment);
+
+ /**
+ * @brief Attach a render or texture buffer to a render target
+ * For texture attachments we use always level 0
+ *
+ * @param[in] attachment Attachment point (e.g. COLOR0, DEPTH...)
+ * @param[in] buffer Contains a pointer to the attachment
+ * @param[in] target Attachment texture target
+ *
+ * @return no return
+ */
+ virtual void
+ Attach(NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderTextureOrRenderBuffer buffer,
+ NVRenderTextureTargetType::Enum target = NVRenderTextureTargetType::Texture2D);
+
+ /**
+ * @brief Attach a particular layer of the texture 2D array to a render target
+ *
+ * @param[in] attachment Attachment point (e.g. COLOR0, DEPTH...)
+ * @param[in] buffer Pointer to the Texture Array which contains the
+ * layers
+ * @param[in] layer The index to the layer that will be attached to the
+ * target
+ * @param[in] level Mip level of the texture that will be attached
+ * (default 0)
+ *
+ * @return no return
+ */
+ virtual void AttachLayer(NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderTextureOrRenderBuffer buffer, QT3DSI32 layer,
+ QT3DSI32 level = 0);
+
+ /**
+ * @brief Attach a particular face of the texture cubemap to a render target
+ *
+ * @param[in] attachment Attachment point (e.g. COLOR0, DEPTH...)
+ * @param[in] buffer Pointer to the Texture Array which contains the
+ * layers
+ * @param[in] face The face of the cubemap that will be attached to the
+ * target
+ * @param[in] level Mip level of the texture that will be attached
+ * (default 0)
+ *
+ * @return no return
+ */
+ virtual void AttachFace(NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderTextureOrRenderBuffer buffer,
+ NVRenderTextureCubeFaces::Enum face);
+
+ /**
+ * @brief Check that this framebuffer is complete and can be rendered to.
+ *
+ *
+ * @return true if complete
+ */
+ virtual bool IsComplete();
+
+ /**
+ * @brief query if framebuffer has any attachment
+ *
+ * @return true if any attachment
+ */
+ virtual bool HasAnyAttachment() { return (m_AttachmentBits != 0); }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendRenderTargetObject GetFrameBuffertHandle()
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<const void *>(m_BufferHandle);
+ }
+
+ /**
+ * @brief static creator function
+ *
+ * @param[in] context Pointer to context
+ *
+ * @return a pointer to framebuffer object.
+ */
+ static NVRenderFrameBuffer *Create(NVRenderContextImpl &context);
+
+ private:
+ /**
+ * @brief releaes an attached object
+ *
+ * @return which target we released
+ */
+ NVRenderTextureTargetType::Enum releaseAttachment(NVRenderFrameBufferAttachments::Enum idx);
+
+ QT3DSU32 m_AttachmentBits; ///< holds flags for current attached buffers
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderGeometryShader.cpp b/src/render/Qt3DSRenderGeometryShader.cpp
new file mode 100644
index 0000000..5056728
--- /dev/null
+++ b/src/render/Qt3DSRenderGeometryShader.cpp
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderGeometryShader.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderGeometryShader::NVRenderGeometryShader(NVRenderContextImpl &context,
+ NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram)
+ : NVRenderShader(context, fnd, source, binaryProgram)
+ , m_ShaderHandle(NULL)
+ {
+ m_ShaderHandle = m_Backend->CreateGeometryShader(source, m_ErrorMessage, binaryProgram);
+ }
+
+ NVRenderGeometryShader::~NVRenderGeometryShader()
+ {
+ if (m_ShaderHandle) {
+ m_Backend->ReleaseGeometryShader(m_ShaderHandle);
+ }
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderGeometryShader.h b/src/render/Qt3DSRenderGeometryShader.h
new file mode 100644
index 0000000..2a643cf
--- /dev/null
+++ b/src/render/Qt3DSRenderGeometryShader.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_GEOMETRY_SHADER_H
+#define QT3DS_RENDER_GEOMETRY_SHADER_H
+
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderShader.h"
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+
+ ///< This class represents a vertex shader
+ class NVRenderGeometryShader : public NVRenderShader
+ {
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] source Pointer to shader source code
+ * @param[in] binaryProgram true if this is a binary program
+ *
+ * @return No return.
+ */
+ NVRenderGeometryShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram);
+
+ /// @brief destructor
+ ~NVRenderGeometryShader();
+
+ /**
+ * @brief Query if shader compiled succesfuly
+ *
+ * @return True if shader is valid.
+ */
+ bool IsValid() override { return (m_ShaderHandle != NULL); }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendGeometryShaderObject GetShaderHandle()
+ {
+ return m_ShaderHandle;
+ }
+
+ private:
+ NVRenderBackend::NVRenderBackendGeometryShaderObject
+ m_ShaderHandle; ///< opaque backend handle
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderImageTexture.cpp b/src/render/Qt3DSRenderImageTexture.cpp
new file mode 100644
index 0000000..e987cc3
--- /dev/null
+++ b/src/render/Qt3DSRenderImageTexture.cpp
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/vector.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderImageTexture.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderImage2D::NVRenderImage2D(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_Texture2D(inTexture)
+ , m_TextureUnit(QT3DS_MAX_U32)
+ , m_AccessType(inAccess)
+ , m_TextureLevel(0)
+ {
+ inTexture->addRef();
+ }
+
+ NVRenderImage2D::~NVRenderImage2D()
+ {
+ m_Context.ImageDestroyed(*this);
+ m_Texture2D->release();
+ }
+
+ void NVRenderImage2D::SetTextureLevel(QT3DSI32 inLevel)
+ {
+ if (m_Texture2D && m_Texture2D->GetNumMipmaps() >= (QT3DSU32)inLevel) {
+ m_TextureLevel = inLevel;
+ }
+ }
+
+ void NVRenderImage2D::Bind(QT3DSU32 unit)
+ {
+ if (unit == -1)
+ m_TextureUnit = m_Context.GetNextTextureUnit();
+ else
+ m_TextureUnit = unit;
+
+ STextureDetails theDetails(m_Texture2D->GetTextureDetails());
+
+ // note it is the callers responsibility that the texture format is supported by the compute
+ // shader
+ m_Backend->BindImageTexture(m_Texture2D->GetTextureObjectHandle(), m_TextureUnit,
+ m_TextureLevel, false, 0, m_AccessType, theDetails.m_Format);
+ }
+
+ NVRenderBackend::NVRenderBackendTextureObject NVRenderImage2D::GetTextureObjectHandle()
+ {
+ return m_Texture2D->GetTextureObjectHandle();
+ }
+
+ NVRenderImage2D *NVRenderImage2D::Create(NVRenderContextImpl &context,
+ NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess)
+ {
+ if (inTexture)
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderImage2D)(context, context.GetFoundation(), inTexture, inAccess);
+ else
+ return NULL;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderImageTexture.h b/src/render/Qt3DSRenderImageTexture.h
new file mode 100644
index 0000000..8b3469b
--- /dev/null
+++ b/src/render/Qt3DSRenderImageTexture.h
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_IMAGE_TEXTURE_H
+#define QT3DS_RENDER_QT3DS_RENDER_IMAGE_TEXTURE_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+ class NVRenderTexture2D;
+
+ // a wrapper class for NVRenderTexture2D
+ // to use with compute shaders and load / store image shaders
+
+ class NVRenderImage2D : public NVRefCounted
+ {
+
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderTexture2D *m_Texture2D; ///< pointer to texture
+ QT3DSI32 m_TextureUnit; ///< texture unit this texture should use
+ NVRenderImageAccessType::Enum
+ m_AccessType; ///< texture / image access type ( read, write, read_write )
+ QT3DSU32 m_TextureLevel; ///< texture level we use for this image
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] inTexture Pointer to a NVRenderTexture2D object
+ * @param[in] inAccess Image access type ( read, write, read_write )
+ *
+ * @return No return.
+ */
+ NVRenderImage2D(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTexture2D *inTexture, NVRenderImageAccessType::Enum inAccess);
+
+ virtual ~NVRenderImage2D();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief Set the access rights within the shader.
+ * Can be read, write or read_write.
+ *
+ * @param[in] inAccess Image access type ( read, write, read_write )
+ *
+ * @return No return.
+ */
+ virtual void SetAccessType(NVRenderImageAccessType::Enum inAccess)
+ {
+ m_AccessType = inAccess;
+ }
+
+ /**
+ * @brief Set the texture level we use for this image
+ *
+ * @param[in] inLevel texture level ( must be in range of max levels )
+ *
+ * @return No return.
+ */
+ virtual void SetTextureLevel(QT3DSI32 inLevel);
+
+ /**
+ * @brief Get texture unit used
+ *
+ *
+ * @return texture unit bound to.
+ */
+ virtual QT3DSU32 GetTextureUnit() const { return m_TextureUnit; }
+
+ /**
+ * @brief Bind a texture for shader access
+ *
+ * @param[in] unit The binding point
+ *
+ * @return No return.
+ */
+ virtual void Bind(QT3DSU32 unit);
+
+ /**
+ * @brief get the backend object handle
+ * here we return the handle from the wrapped texture
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendTextureObject GetTextureObjectHandle();
+
+ /**
+ * @brief static creation function
+ *
+ * @param[in] context Pointer to context
+ * @param[in] inTexture Pointer to a NVRenderTexture2D object
+ * @param[in] inAccess Image access type ( read, write, read_write )
+ *
+ * @return No return.
+ */
+ static NVRenderImage2D *Create(NVRenderContextImpl &context, NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess);
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderIndexBuffer.cpp b/src/render/Qt3DSRenderIndexBuffer.cpp
new file mode 100644
index 0000000..37f56bd
--- /dev/null
+++ b/src/render/Qt3DSRenderIndexBuffer.cpp
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderIndexBuffer::NVRenderIndexBuffer(NVRenderContextImpl &context, size_t size,
+ NVRenderComponentTypes::Enum componentType,
+ NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data)
+ : NVRenderDataBuffer(context, context.GetFoundation(), size,
+ NVRenderBufferBindValues::Index, usageType, data)
+ , m_ComponentType(componentType)
+ {
+ }
+
+ NVRenderIndexBuffer::~NVRenderIndexBuffer() { m_Context.BufferDestroyed(*this); }
+
+ QT3DSU32 NVRenderIndexBuffer::GetNumIndices() const
+ {
+ QT3DSU32 dtypeSize = NVRenderComponentTypes::getSizeofType(m_ComponentType);
+ return m_BufferCapacity / dtypeSize;
+ }
+
+ void NVRenderIndexBuffer::Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset)
+ {
+ m_Backend->DrawIndexed(
+ drawMode, count, m_ComponentType,
+ (const void *)(offset * NVRenderComponentTypes::getSizeofType(m_ComponentType)));
+ }
+
+ void NVRenderIndexBuffer::DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset)
+ {
+ m_Backend->DrawIndexedIndirect(drawMode, m_ComponentType, (const void *)offset);
+ }
+
+ void NVRenderIndexBuffer::Bind()
+ {
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to Bind a locked buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ m_Backend->BindBuffer(m_BufferHandle, m_BindFlags);
+ }
+
+ NVRenderIndexBuffer *NVRenderIndexBuffer::Create(NVRenderContextImpl &context,
+ NVRenderBufferUsageType::Enum usageType,
+ NVRenderComponentTypes::Enum componentType,
+ size_t size, NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVFoundationBase &fnd(context.GetFoundation());
+ if (componentType != NVRenderComponentTypes::QT3DSU32
+ && componentType != NVRenderComponentTypes::QT3DSU16
+ && componentType != NVRenderComponentTypes::QT3DSU8) {
+ qCCritical(INVALID_PARAMETER, "Invalid component type for index buffer");
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ QT3DSU32 ibufSize = sizeof(NVRenderIndexBuffer);
+ QT3DSU8 *baseMem = (QT3DSU8 *)QT3DS_ALLOC(fnd.getAllocator(), ibufSize, "IndexBuffer");
+ NVRenderIndexBuffer *retval = new (baseMem) NVRenderIndexBuffer(
+ context, size, componentType, usageType,
+ toDataRef(const_cast<QT3DSU8 *>(bufferData.begin()), bufferData.size()));
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderIndexBuffer.h b/src/render/Qt3DSRenderIndexBuffer.h
new file mode 100644
index 0000000..6b9c471
--- /dev/null
+++ b/src/render/Qt3DSRenderIndexBuffer.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_INDEX_BUFFER_H
+#define QT3DS_RENDER_INDEX_BUFFER_H
+#include "render/Qt3DSRenderDataBuffer.h"
+#include "render/Qt3DSRenderDrawable.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ // forward declaration
+ class NVRenderContextImpl;
+
+ class NVRenderIndexBuffer : public NVRenderDataBuffer, public NVRenderDrawable
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] size Size of the buffer
+ * @param[in] componentType Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return.
+ */
+ NVRenderIndexBuffer(NVRenderContextImpl &context, size_t size,
+ NVRenderComponentTypes::Enum componentType,
+ NVRenderBufferUsageType::Enum usageType, NVDataRef<QT3DSU8> data);
+
+ ///< destruvtor
+ ~NVRenderIndexBuffer();
+
+ /**
+ * @brief get the component type (QT3DSU8, QT3DSU16)
+ *
+ * @return the component type
+ */
+ virtual NVRenderComponentTypes::Enum GetComponentType() const { return m_ComponentType; }
+
+ /**
+ * @brief get the index count
+ *
+ * @return actual index count
+ */
+ virtual QT3DSU32 GetNumIndices() const;
+
+ /**
+ * @brief bind the buffer bypasses the context state
+ *
+ * @return no return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief draw the buffer
+ *
+ * @param[in] drawMode draw mode (e.g Triangles...)
+ * @param[in] count vertex count
+ * @param[in] offset start offset in byte
+ *
+ * @return no return.
+ */
+ void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset) override;
+
+ /**
+ * @brief draw the buffer via indirec draw buffer setup
+ *
+ * @param[in] drawMode draw mode (e.g Triangles...)
+ * @param[in] offset byte offset into the bound drawIndirectBuffer see
+ * NVRenderDrawIndirectBuffer
+ *
+ * @return no return.
+ */
+ virtual void DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset);
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendBufferObject GetBuffertHandle() const override
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_BufferHandle);
+ }
+
+ static NVRenderIndexBuffer *Create(NVRenderContextImpl &context,
+ NVRenderBufferUsageType::Enum usageType,
+ NVRenderComponentTypes::Enum componentType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData);
+
+ private:
+ NVRenderComponentTypes::Enum m_ComponentType; ///< component type (QT3DSU8, QT3DSU16)
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderInputAssembler.cpp b/src/render/Qt3DSRenderInputAssembler.cpp
new file mode 100644
index 0000000..e4d38b9
--- /dev/null
+++ b/src/render/Qt3DSRenderInputAssembler.cpp
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderInputAssembler.h"
+#include "render/Qt3DSRenderAttribLayout.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ ///< constructor
+ NVRenderInputAssembler::NVRenderInputAssembler(
+ NVRenderContextImpl &context, NVRenderAttribLayout *attribLayout,
+ NVConstDataRef<NVRenderVertexBuffer *> buffers, const NVRenderIndexBuffer *indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets,
+ NVRenderDrawMode::Enum primType, QT3DSU32 patchVertexCount)
+ : m_Context(context)
+ , m_Foundation(context.GetFoundation())
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_AttribLayout(attribLayout)
+ , m_VertexBuffers(context.GetAllocator(), "m_VertexBuffers")
+ , m_IndexBuffer(indexBuffer)
+ , m_PrimitiveType(primType)
+ , m_PatchVertexCount(patchVertexCount)
+ {
+ // we cannot currently attach more than 16 vertex buffers
+ QT3DS_ASSERT(buffers.size() < 16);
+ // if primitive is "Patch" we need a patch per vertex count > 0
+ QT3DS_ASSERT(m_PrimitiveType != NVRenderDrawMode::Patches || m_PatchVertexCount > 1);
+
+ QT3DSU32 entrySize = sizeof(NVRenderBackend::NVRenderBackendBufferObject) * buffers.size();
+ NVRenderBackend::NVRenderBackendBufferObject *bufferHandle =
+ (NVRenderBackend::NVRenderBackendBufferObject *)QT3DS_ALLOC(
+ m_Foundation.getAllocator(), entrySize, "NVRenderInputAssembler");
+ // setup vertex buffer backend handle array
+ QT3DS_FOREACH(idx, buffers.size())
+ {
+ m_VertexBuffers.push_back(buffers.mData[idx]);
+ bufferHandle[idx] = buffers.mData[idx]->GetBuffertHandle();
+ };
+
+ m_VertexbufferHandles = toConstDataRef(bufferHandle, buffers.size());
+
+ m_InputAssemblertHandle = m_Backend->CreateInputAssembler(
+ m_AttribLayout->GetAttribLayoutHandle(), m_VertexbufferHandles,
+ (m_IndexBuffer) ? m_IndexBuffer->GetBuffertHandle() : NULL, strides, offsets,
+ patchVertexCount);
+
+ attribLayout->addRef();
+ }
+
+ ///< destructor
+ NVRenderInputAssembler::~NVRenderInputAssembler()
+ {
+ m_AttribLayout->release();
+
+ if (m_InputAssemblertHandle) {
+ m_Backend->ReleaseInputAssembler(m_InputAssemblertHandle);
+ }
+
+ QT3DS_FREE(m_Foundation.getAllocator(), (void *)m_VertexbufferHandles.mData);
+ }
+
+ QT3DSU32 NVRenderInputAssembler::GetIndexCount() const
+ {
+ return (m_IndexBuffer) ? m_IndexBuffer->GetNumIndices() : 0;
+ }
+
+ QT3DSU32 NVRenderInputAssembler::GetVertexCount() const
+ {
+ // makes only sense if we have a single vertex buffer
+ QT3DS_ASSERT(m_VertexBuffers.size() == 1);
+
+ return m_VertexBuffers[0]->GetNumVertexes();
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderInputAssembler.h b/src/render/Qt3DSRenderInputAssembler.h
new file mode 100644
index 0000000..adac4c4
--- /dev/null
+++ b/src/render/Qt3DSRenderInputAssembler.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_INPUT_ASSEMBLER_H
+#define QT3DS_RENDER_INPUT_ASSEMBLER_H
+
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Utils.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ // forward declarations
+ class NVRenderContextImpl;
+ class NVRenderBackend;
+ class NVRenderAttribLayout;
+
+ ///< this class handles the vertex attribute layout setup
+ class NVRenderInputAssembler : public NVRefCounted
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * NOTE: The limit for buffers count is currently 16
+ *
+ * @param[in] context Pointer to context
+ * @param[in] attribLayout Pointer to NVRenderAttribLayout object
+ * @param[in] buffers list of vertex buffers
+ * @param[in] indexBuffer pointer to index buffer. Can be NULL
+ * @param[in] strides list of strides of the buffer
+ * @param[in] offsets list of offsets into the buffer
+ * @param[in] primType primitive type used for drawing
+ * @param[in] patchVertexCount if primitive is "Patch" this is the vertex count for a
+ *single patch
+ *
+ * @return No return.
+ */
+ NVRenderInputAssembler(NVRenderContextImpl &context, NVRenderAttribLayout *attribLayout,
+ NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets,
+ NVRenderDrawMode::Enum primType = NVRenderDrawMode::Triangles,
+ QT3DSU32 patchVertexCount = 1);
+ ///< destructor
+ ~NVRenderInputAssembler();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendInputAssemblerObject GetInputAssemblerHandle() const
+ {
+ return m_InputAssemblertHandle;
+ }
+
+ /**
+ * @brief get the attached index buffer
+ *
+ * @return the index buffer
+ */
+ const NVRenderIndexBuffer *GetIndexBuffer() { return m_IndexBuffer; }
+
+ /**
+ * @brief get the index count of the attached index buffer (if any)
+ *
+ * @return the index buffer count
+ */
+ QT3DSU32 GetIndexCount() const;
+
+ /**
+ * @brief get the vertex count of the buffer
+ * Note this makes only sense if we have a single
+ * interleaved buffer
+ *
+ * @return the vertex buffer count
+ */
+ QT3DSU32 GetVertexCount() const;
+
+ /**
+ * @brief get the primitive type used for drawing
+ *
+ * @return primitive type
+ */
+ NVRenderDrawMode::Enum GetPrimitiveType() const { return m_PrimitiveType; }
+
+ /**
+ * @brief set the per vertex patch count
+ *
+ * @return none
+ */
+ void SetPatchVertexCount(QT3DSU32 count)
+ {
+ if (count != m_PatchVertexCount) {
+ // clamp to 1;
+ m_PatchVertexCount = (count == 0) ? 1 : count;
+ ;
+ m_Backend->SetPatchVertexCount(m_InputAssemblertHandle, m_PatchVertexCount);
+ }
+ }
+
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+
+ NVRenderAttribLayout *m_AttribLayout; ///< pointer to attribute layout
+ nvvector<NVRenderVertexBuffer *> m_VertexBuffers; ///< vertex buffers
+ const NVRenderIndexBuffer *m_IndexBuffer; ///< index buffer
+ NVConstDataRef<NVRenderBackend::NVRenderBackendBufferObject>
+ m_VertexbufferHandles; ///< opaque vertex buffer backend handles
+
+ NVRenderBackend::NVRenderBackendInputAssemblerObject
+ m_InputAssemblertHandle; ///< opaque backend handle
+ NVRenderDrawMode::Enum m_PrimitiveType; ///< primitive type used for drawing
+ QT3DSU32 m_PatchVertexCount; ///< vertex count if primitive type is patch
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderOcclusionQuery.cpp b/src/render/Qt3DSRenderOcclusionQuery.cpp
new file mode 100644
index 0000000..d1b62d4
--- /dev/null
+++ b/src/render/Qt3DSRenderOcclusionQuery.cpp
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderOcclusionQuery.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderOcclusionQuery::NVRenderOcclusionQuery(NVRenderContextImpl &context,
+ NVFoundationBase &fnd)
+ : NVRenderQueryBase(context, fnd)
+ {
+ }
+
+ NVRenderOcclusionQuery::~NVRenderOcclusionQuery() {}
+
+ void NVRenderOcclusionQuery::Begin()
+ {
+ m_Backend->BeginQuery(m_QueryHandle, NVRenderQueryType::Samples);
+ }
+
+ void NVRenderOcclusionQuery::End()
+ {
+ m_Backend->EndQuery(m_QueryHandle, NVRenderQueryType::Samples);
+ }
+
+ void NVRenderOcclusionQuery::GetResult(QT3DSU32 *params)
+ {
+ m_Backend->GetQueryResult(m_QueryHandle, NVRenderQueryResultType::Result, params);
+ }
+
+ bool NVRenderOcclusionQuery::GetResultAvailable()
+ {
+ QT3DSU32 param;
+
+ m_Backend->GetQueryResult(m_QueryHandle, NVRenderQueryResultType::ResultAvailable, &param);
+
+ return (param == 1);
+ }
+
+ NVRenderOcclusionQuery *NVRenderOcclusionQuery::Create(NVRenderContextImpl &context)
+ {
+ if (!context.IsSampleQuerySupported())
+ return NULL;
+
+ NVRenderOcclusionQuery *retval =
+ QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderOcclusionQuery)(context, context.GetFoundation());
+
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderOcclusionQuery.h b/src/render/Qt3DSRenderOcclusionQuery.h
new file mode 100644
index 0000000..04f64e9
--- /dev/null
+++ b/src/render/Qt3DSRenderOcclusionQuery.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_OCCLUSION_QUERY_H
+#define QT3DS_RENDER_OCCLUSION_QUERY_H
+
+#include "render/Qt3DSRenderQueryBase.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ // forward declaration
+ class NVRenderContextImpl;
+
+ class NVRenderOcclusionQuery : public NVRenderQueryBase
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderOcclusionQuery(NVRenderContextImpl &context, NVFoundationBase &fnd);
+
+ ///< destructor
+ ~NVRenderOcclusionQuery();
+
+ /**
+ * @brief Get query type
+ *
+ * @return Return query type
+ */
+ NVRenderQueryType::Enum GetQueryType() const override
+ {
+ return NVRenderQueryType::Samples;
+ }
+
+ /**
+ * @brief Get a pointer to the foundation
+ *
+ * @return pointer to foundation
+ */
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ /**
+ * @brief begin a query
+ *
+ * @return no return.
+ */
+ void Begin() override;
+
+ /**
+ * @brief end a query
+ *
+ * @return no return.
+ */
+ void End() override;
+
+ /**
+ * @brief Get the result of a query
+ *
+ * @param[out] params Contains result of query regarding query type
+ *
+ * @return no return.
+ */
+ void GetResult(QT3DSU32 *params) override;
+
+ /**
+ * @brief query if a result is available
+ *
+ *
+ * @return true if available.
+ */
+ virtual bool GetResultAvailable();
+
+ /*
+ * @brief static creation function
+ *
+ * * @return a occlusion query object on success
+ */
+ static NVRenderOcclusionQuery *Create(NVRenderContextImpl &context);
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderPathFontSpecification.cpp b/src/render/Qt3DSRenderPathFontSpecification.cpp
new file mode 100644
index 0000000..3e9276a
--- /dev/null
+++ b/src/render/Qt3DSRenderPathFontSpecification.cpp
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderPathFontSpecification.h"
+#include "render/Qt3DSRenderPathFontText.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderPathFontSpecification::NVRenderPathFontSpecification(NVRenderContextImpl &context,
+ NVFoundationBase &fnd,
+ CRegisteredString fontName)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , m_Backend(context.GetBackend())
+ , mRefCount(0)
+ , m_NumFontGlyphs(0)
+ , m_EmScale(2048) // 2048 is default true type scale
+ , m_Type(NVRenderPathFormatType::UByte)
+ , m_TransformType(NVRenderPathTransformType::Translate2D)
+ , m_FontName(fontName)
+ {
+ }
+
+ NVRenderPathFontSpecification::~NVRenderPathFontSpecification()
+ {
+ m_Context.ReleasePathFontSpecification(*this);
+ }
+
+ void NVRenderPathFontSpecification::LoadPathGlyphs(const char *fontName,
+ NVRenderPathFormatType::Enum type)
+ {
+ // check if we already created it
+ if (m_NumFontGlyphs)
+ return;
+
+ m_Type = type;
+
+ // create fonts based on the input
+ m_PathRenderHandle = m_Backend->LoadPathGlyphsIndexedRange(
+ NVRenderPathFontTarget::FileFont, fontName, NVRenderPathFontStyleFlags(), 0, m_EmScale,
+ &m_NumFontGlyphs);
+
+ // Fallback in case the previuos call fails
+ // This is a no-op if the previous call succeeds
+ // Note that sans is an inbuild driver font
+ if (!m_PathRenderHandle) {
+ m_PathRenderHandle = m_Backend->LoadPathGlyphsIndexedRange(
+ NVRenderPathFontTarget::SystemFont, "Arial", NVRenderPathFontStyleFlags(), 0,
+ m_EmScale, &m_NumFontGlyphs);
+ }
+
+ // we should have some glyphs
+ QT3DS_ASSERT(m_NumFontGlyphs);
+ }
+
+ void
+ NVRenderPathFontSpecification::StencilFillPathInstanced(NVRenderPathFontItem &inPathFontItem)
+ {
+ const void *glyphIDs = inPathFontItem.GetGlyphIDs();
+ const QT3DSF32 *spacing = inPathFontItem.GetSpacing();
+ if (!glyphIDs || !spacing || !inPathFontItem.GetGlyphsCount()) {
+ QT3DS_ASSERT(false || !inPathFontItem.GetGlyphsCount());
+ return;
+ }
+
+ m_Backend->StencilFillPathInstanced(m_PathRenderHandle, inPathFontItem.GetGlyphsCount(),
+ m_Type, glyphIDs, NVRenderPathFillMode::Fill, 0xFF,
+ m_TransformType, spacing);
+ }
+
+ void NVRenderPathFontSpecification::CoverFillPathInstanced(NVRenderPathFontItem &inPathFontItem)
+ {
+ const void *glyphIDs = inPathFontItem.GetGlyphIDs();
+ const QT3DSF32 *spacing = inPathFontItem.GetSpacing();
+ if (!glyphIDs || !spacing || !inPathFontItem.GetGlyphsCount()) {
+ QT3DS_ASSERT(false || !inPathFontItem.GetGlyphsCount());
+ return;
+ }
+
+ m_Backend->CoverFillPathInstanced(
+ m_PathRenderHandle, inPathFontItem.GetGlyphsCount(), m_Type, glyphIDs,
+ NVRenderPathCoverMode::BoundingBoxOfBoundingBox, m_TransformType, spacing);
+ }
+
+ QT3DSU32
+ NVRenderPathFontSpecification::getSizeofType(NVRenderPathFormatType::Enum type)
+ {
+ switch (type) {
+ case NVRenderPathFormatType::Byte:
+ return sizeof(QT3DSI8);
+ case NVRenderPathFormatType::UByte:
+ return sizeof(QT3DSU8);
+ case NVRenderPathFormatType::Bytes2:
+ return sizeof(QT3DSU16);
+ case NVRenderPathFormatType::Uint:
+ return sizeof(QT3DSU32);
+ case NVRenderPathFormatType::Utf8:
+ return sizeof(QT3DSU32);
+ default:
+ QT3DS_ASSERT(false);
+ return 1;
+ }
+ }
+
+ NVRenderPathFontSpecification *
+ NVRenderPathFontSpecification::CreatePathFontSpecification(NVRenderContextImpl &context,
+ CRegisteredString fontName)
+ {
+ QT3DS_ASSERT(context.IsPathRenderingSupported());
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderPathFontSpecification)(context, context.GetFoundation(), fontName);
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderPathFontSpecification.h b/src/render/Qt3DSRenderPathFontSpecification.h
new file mode 100644
index 0000000..dad3f6b
--- /dev/null
+++ b/src/render/Qt3DSRenderPathFontSpecification.h
@@ -0,0 +1,165 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/ #pragma once
+#ifndef QT3DS_RENDER_PATH_FONT_SPECIFICATION_H
+#define QT3DS_RENDER_PATH_FONT_SPECIFICATION_H
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/StringTable.h"
+#include "EASTL/string.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+ namespace qt3ds
+{
+ namespace render {
+
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+ class NVRenderPathRender;
+ class NVRenderPathFontItem;
+
+ class NVRenderPathFontSpecification : public NVRefCounted
+ {
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ volatile QT3DSI32
+ mRefCount; ///< Using foundations' naming convention to ease implementation
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] fontName Name of font ( may include path
+ * )
+ *
+ * @return No return.
+ */
+ NVRenderPathFontSpecification(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ CRegisteredString fontName);
+
+ /// @NVRenderPathSpecification destructor
+ ~NVRenderPathFontSpecification();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief Load numGlyphs glyphs from specified font file
+ *
+ * @param[in] pathBase Base of path objects
+ * @param[in] fontName Name of font ( may include path
+ * )
+ * @param[in] numGlyphs Glyph count
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes character string
+ *
+ * @return No return
+ */
+ virtual void LoadPathGlyphs(const char *fontName, NVRenderPathFormatType::Enum type);
+
+ /**
+ * @brief Render a stencil fill pass for fonts
+ *
+ * @param[in] inPathFontSpec Pointer to NVRenderPathFontSpecification
+ *
+ * @return no return
+ */
+ void StencilFillPathInstanced(NVRenderPathFontItem &inPathFontItem);
+
+ /**
+ * @brief Render a cover fill pass for fonts
+ *
+ * @param[in] inPathFontSpec Pointer to NVRenderPathFontSpecification
+ *
+ * @return no return
+ */
+ void CoverFillPathInstanced(NVRenderPathFontItem &inPathFontItem);
+
+ /**
+ * @brief get type for font path set
+ *
+ * @return path font type
+ */
+ NVRenderPathFormatType::Enum GetPathFontType() { return m_Type; }
+
+ /**
+ * @brief get font glyph count
+ *
+ * @return get glyph count
+ */
+ QT3DSU32 GetFontGlyphsCount() { return m_NumFontGlyphs; }
+
+ /**
+ * @brief get spacing for char set
+ *
+ * @return spacing array
+ */
+ QT3DSF32 GetEmScale() const { return m_EmScale; }
+
+ /**
+ * @brief Get font name
+ *
+ * @return name set
+ */
+ CRegisteredString GetFontName() const { return m_FontName; }
+
+ private:
+ QT3DSU32 m_NumFontGlyphs; ///< glyph count of the entire font set
+ QT3DSF32 m_EmScale; ///< true type scale
+ NVRenderPathFormatType::Enum m_Type; ///< type ( byte, int,... )
+ NVRenderPathTransformType::Enum m_TransformType; ///< transform type default 2D
+ CRegisteredString m_FontName; ///< Name of Font
+ NVRenderBackend::NVRenderBackendPathObject
+ m_PathRenderHandle; ///< opaque backend handle
+
+ private:
+ /**
+ * @brief Get size of type
+ *
+ * @param[in] type type ( byte, int,... )
+ *
+ * @return true if successful
+ */
+ QT3DSU32 getSizeofType(NVRenderPathFormatType::Enum type);
+
+ public:
+ static NVRenderPathFontSpecification *
+ CreatePathFontSpecification(NVRenderContextImpl &context, CRegisteredString fontName);
+ };
+ }
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderPathFontText.cpp b/src/render/Qt3DSRenderPathFontText.cpp
new file mode 100644
index 0000000..aeaad13
--- /dev/null
+++ b/src/render/Qt3DSRenderPathFontText.cpp
@@ -0,0 +1,191 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderPathFontText.h"
+#include "render/Qt3DSRenderPathFontSpecification.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderPathRender.h"
+
+namespace qt3ds {
+namespace render {
+
+ // see NVprSDK for explanation
+ // Math from page 54-56 of "Digital Image Warping" by George Wolberg,
+ // though credited to Paul Heckert's "Fundamentals of Texture
+ // Mapping and Image Warping" 1989 Master's thesis.
+ static QT3DSMat33 mapSquareToQuad(QT3DSVec2 inSquare[4])
+ {
+ QT3DSMat33 ret;
+
+ QT3DSVec2 d1(inSquare[1] - inSquare[2]);
+ QT3DSVec2 d2(inSquare[3] - inSquare[2]);
+ QT3DSVec2 d3(inSquare[0] - inSquare[1] + inSquare[2] - inSquare[3]);
+
+ QT3DSF32 denom = d1.x * d2.y - d2.x * d1.y;
+ if (denom == 0.0) {
+ return QT3DSMat33::createIdentity();
+ }
+
+ ret[2][0] = (d3.x * d2.y - d2.x * d3.y) / denom;
+ ret[2][1] = (d1.x * d3.y - d3.x * d1.y) / denom;
+ ret[2][2] = 1.0;
+ ret[0][0] = inSquare[1].x - inSquare[0].x + ret[2][0] * inSquare[1].x;
+ ret[1][0] = inSquare[1].y - inSquare[0].y + ret[2][0] * inSquare[1].y;
+ ret[0][1] = inSquare[3].x - inSquare[0].x + ret[2][1] * inSquare[3].x;
+ ret[1][1] = inSquare[3].y - inSquare[0].y + ret[2][1] * inSquare[3].y;
+ ret[0][2] = inSquare[0].x;
+ ret[1][2] = inSquare[0].y;
+
+ return ret;
+ }
+
+ static QT3DSMat33 mapQuadToSquare(QT3DSVec2 inSquare[4])
+ {
+ return mapSquareToQuad(inSquare).getInverse();
+ }
+
+ static QT3DSMat33 mapQuadToQuad(QT3DSVec2 fromSquare[4], QT3DSVec2 toSquare[4])
+ {
+ return (mapSquareToQuad(toSquare) * mapQuadToSquare(fromSquare));
+ }
+
+ static QT3DSMat44 mapBoxToQuad(QT3DSVec4 inBox, QT3DSVec2 inSquare[4])
+ {
+ QT3DSVec2 fromSquare[4] = { QT3DSVec2(inBox.x, inBox.y), QT3DSVec2(inBox.z, inBox.y),
+ QT3DSVec2(inBox.z, inBox.w), QT3DSVec2(inBox.x, inBox.w) };
+
+ QT3DSMat33 ret = mapQuadToQuad(fromSquare, inSquare);
+
+ return QT3DSMat44(ret.column0, ret.column1, ret.column2, QT3DSVec3(0.0, 0.0, 0.0));
+ }
+
+ NVRenderPathFontItem::NVRenderPathFontItem(NVFoundationBase &fnd)
+ : m_Foundation(fnd)
+ , mRefCount(0)
+ , m_NumGlyphs(0)
+ , m_GlyphIDs(NULL)
+ , m_TranslateXY(NULL)
+ {
+ }
+
+ NVRenderPathFontItem::~NVRenderPathFontItem()
+ {
+ if (m_TranslateXY)
+ QT3DS_FREE(m_Foundation.getAllocator(), m_TranslateXY);
+ if (m_GlyphIDs)
+ QT3DS_FREE(m_Foundation.getAllocator(), m_GlyphIDs);
+ }
+
+ void NVRenderPathFontItem::InitTextItem(size_t glyphCount, const QT3DSU32 *glyphIDs,
+ NVRenderPathFormatType::Enum type, QT3DSF32 *posArray,
+ QT3DSVec2 pixelBound, QT3DSVec2 logicalBound, QT3DSF32 emScale)
+ {
+ m_NumGlyphs = glyphCount;
+
+ // allocate glyphs array
+ if (m_GlyphIDs)
+ QT3DS_FREE(m_Foundation.getAllocator(), m_GlyphIDs);
+
+ // allocate position array
+ if (m_TranslateXY)
+ QT3DS_FREE(m_Foundation.getAllocator(), m_TranslateXY);
+
+ m_GlyphIDs = (QT3DSU32 *)QT3DS_ALLOC(m_Foundation.getAllocator(),
+ glyphCount * getSizeofType(type), "NVRenderPathFontItem");
+ m_TranslateXY =
+ (QT3DSF32 *)QT3DS_ALLOC(m_Foundation.getAllocator(), 2 * (glyphCount + 1) * sizeof(QT3DSF32),
+ "NVRenderPathFontItem");
+
+ if (!m_GlyphIDs || !m_TranslateXY)
+ return;
+
+ QT3DSU32 *pTheGlyphIDs = (QT3DSU32 *)m_GlyphIDs;
+ QT3DSU32 *pInGlyphs = (QT3DSU32 *)glyphIDs;
+
+ /// copy glyphs array
+ for (size_t i = 0; i < glyphCount; i++) {
+ pTheGlyphIDs[i] = pInGlyphs[i];
+ }
+
+ // copy position array
+ // we copy what we got from our layout system
+ if (posArray != NULL) {
+ for (size_t i = 0, k = 0; i < glyphCount * 2; i += 2, k++) {
+ m_TranslateXY[i] = posArray[i] * emScale;
+ m_TranslateXY[i + 1] = posArray[i + 1] * emScale;
+ }
+ }
+
+ // setup transform
+ QT3DSVec2 square[4] = { QT3DSVec2(0.0, 0.0), QT3DSVec2(pixelBound.x, 0.0),
+ QT3DSVec2(pixelBound.x, pixelBound.y), QT3DSVec2(0.0, pixelBound.y) };
+ QT3DSVec4 box(0.0, 0.0, logicalBound.x * emScale, logicalBound.y * emScale);
+
+ m_ModelMatrix = mapBoxToQuad(box, square);
+ }
+
+ const QT3DSMat44 NVRenderPathFontItem::GetTransform()
+ {
+ return QT3DSMat44(QT3DSVec4(m_ModelMatrix[0][0], m_ModelMatrix[1][0], 0.0, m_ModelMatrix[2][0]),
+ QT3DSVec4(m_ModelMatrix[0][1], m_ModelMatrix[1][1], 0.0, m_ModelMatrix[2][1]),
+ QT3DSVec4(0.0, 0.0, 1.0, 0.0),
+ QT3DSVec4(m_ModelMatrix[0][2], m_ModelMatrix[1][2], 0.0, m_ModelMatrix[2][2]));
+ }
+
+ QT3DSU32
+ NVRenderPathFontItem::getSizeofType(NVRenderPathFormatType::Enum type)
+ {
+ switch (type) {
+ case NVRenderPathFormatType::Byte:
+ return sizeof(QT3DSI8);
+ case NVRenderPathFormatType::UByte:
+ return sizeof(QT3DSU8);
+ case NVRenderPathFormatType::Bytes2:
+ return sizeof(QT3DSU16);
+ case NVRenderPathFormatType::Uint:
+ return sizeof(QT3DSU32);
+ case NVRenderPathFormatType::Utf8:
+ return sizeof(QT3DSU32);
+ default:
+ QT3DS_ASSERT(false);
+ return 1;
+ }
+ }
+
+ NVRenderPathFontItem *NVRenderPathFontItem::CreatePathFontItem(NVRenderContextImpl &context)
+ {
+ QT3DS_ASSERT(context.IsPathRenderingSupported());
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderPathFontItem)(context.GetFoundation());
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderPathFontText.h b/src/render/Qt3DSRenderPathFontText.h
new file mode 100644
index 0000000..a1d103a
--- /dev/null
+++ b/src/render/Qt3DSRenderPathFontText.h
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/ #pragma once
+#ifndef QT3DS_RENDER_PATH_FONT_TEXT_H
+#define QT3DS_RENDER_PATH_FONT_TEXT_H
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "EASTL/string.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+ namespace qt3ds
+{
+ namespace render {
+
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+ class NVRenderPathFontSpecification;
+
+ class NVRenderPathFontItem : public NVRefCounted
+ {
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32
+ mRefCount; ///< Using foundations' naming convention to ease implementation
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderPathFontItem(NVFoundationBase &fnd);
+
+ /// @NVRenderPathFontItem destructor
+ ~NVRenderPathFontItem();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief Setup text
+ *
+ * @param[in] glyphCount number of glyphs
+ * @param[in] glyphIDs array of glyhp ID's
+ * @param[in] type type ( byte, int,... )
+ * @param[in] posArray array of glyhp positions
+ * @param[in] pixelBound pixel boundary
+ * @param[in] logicalBound logical boundary
+ * @param[in] emScale true type scale
+ *
+ * @return No return.
+ */
+ void InitTextItem(size_t glyphCount, const QT3DSU32 *glyphIDs,
+ NVRenderPathFormatType::Enum type, QT3DSF32 *posArray, QT3DSVec2 pixelBound,
+ QT3DSVec2 logicalBound, QT3DSF32 emScale);
+
+ /**
+ * @brief get glyph count
+ *
+ * @return get glyph count
+ */
+ size_t GetGlyphsCount() { return m_NumGlyphs; }
+
+ /**
+ * @brief get spacing for char set
+ *
+ * @return spacing array
+ */
+ const QT3DSF32 *GetSpacing() { return m_TranslateXY; }
+
+ /**
+ * @brief get name set
+ *
+ * @return name set
+ */
+ const void *GetGlyphIDs() { return (void *)m_GlyphIDs; }
+
+ /**
+ * @brief Get Y bound of font metric
+ *
+ * @return transform matrix
+ */
+ const QT3DSMat44 GetTransform();
+
+ private:
+ /**
+ * @brief Get size of type
+ *
+ * @param[in] type type ( byte, int,... )
+ *
+ * @return true if successful
+ */
+ QT3DSU32 getSizeofType(NVRenderPathFormatType::Enum type);
+
+ private:
+ size_t m_NumGlyphs; ///< glyph count
+ QT3DSU32 *m_GlyphIDs; ///< array glyph ID's
+ QT3DSF32 *
+ m_TranslateXY; ///< pointer to arrray for character advance information like kerning
+ QT3DSMat44 m_ModelMatrix; ///< Matrix which converts from font space to box space
+
+ public:
+ static NVRenderPathFontItem *CreatePathFontItem(NVRenderContextImpl &context);
+ };
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/src/render/Qt3DSRenderPathRender.cpp b/src/render/Qt3DSRenderPathRender.cpp
new file mode 100644
index 0000000..4298249
--- /dev/null
+++ b/src/render/Qt3DSRenderPathRender.cpp
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderPathRender.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderPathSpecification.h"
+#include "render/Qt3DSRenderPathFontSpecification.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderPathRender::NVRenderPathRender(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ size_t range)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , m_Backend(context.GetBackend())
+ , mRefCount(0)
+ , m_StrokeWidth(0.0f)
+ {
+ m_Range = range;
+ m_PathRenderHandle = m_Backend->CreatePathNVObject(range);
+ }
+
+ NVRenderPathRender::~NVRenderPathRender()
+ {
+ if (m_PathRenderHandle) {
+ m_Backend->ReleasePathNVObject(m_PathRenderHandle, m_Range);
+ }
+ }
+
+ void NVRenderPathRender::SetPathSpecification(NVRenderPathSpecification &inCommandBuffer)
+ {
+ m_Backend->SetPathSpecification(m_PathRenderHandle, inCommandBuffer.GetPathCommands(),
+ inCommandBuffer.GetPathCoords());
+ }
+
+ NVBounds3 NVRenderPathRender::GetPathObjectBoundingBox()
+ {
+ return m_Backend->GetPathObjectBoundingBox(m_PathRenderHandle);
+ }
+
+ NVBounds3 NVRenderPathRender::GetPathObjectFillBox()
+ {
+ return m_Backend->GetPathObjectFillBox(m_PathRenderHandle);
+ }
+
+ NVBounds3 NVRenderPathRender::GetPathObjectStrokeBox()
+ {
+ return m_Backend->GetPathObjectStrokeBox(m_PathRenderHandle);
+ }
+
+ void NVRenderPathRender::SetStrokeWidth(QT3DSF32 inStrokeWidth)
+ {
+ if (inStrokeWidth != m_StrokeWidth) {
+ m_StrokeWidth = inStrokeWidth;
+ m_Backend->SetStrokeWidth(m_PathRenderHandle, inStrokeWidth);
+ }
+ }
+
+ QT3DSF32 NVRenderPathRender::GetStrokeWidth() const { return m_StrokeWidth; }
+
+ void NVRenderPathRender::StencilStroke() { m_Backend->StencilStrokePath(m_PathRenderHandle); }
+
+ void NVRenderPathRender::StencilFill() { m_Backend->StencilFillPath(m_PathRenderHandle); }
+
+ NVRenderPathRender *NVRenderPathRender::Create(NVRenderContextImpl &context, size_t range)
+ {
+ if (!context.IsPathRenderingSupported())
+ return NULL;
+
+ NVRenderPathRender *retval =
+ QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderPathRender)(context, context.GetFoundation(), range);
+
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderPathRender.h b/src/render/Qt3DSRenderPathRender.h
new file mode 100644
index 0000000..c261ca3
--- /dev/null
+++ b/src/render/Qt3DSRenderPathRender.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PATH_RENDER_H
+#define QT3DS_RENDER_PATH_RENDER_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "foundation/Qt3DSBounds3.h"
+#include <EASTL/string.h>
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+ class NVRenderPathSpecification;
+ class NVRenderPathFontSpecification;
+
+ ///< A program pipeline is a collection of a multiple programs (vertex, fragment, geometry,....)
+ class NVRenderPathRender : public NVRefCounted
+ {
+ protected:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] range Number of internal objects
+ *
+ * @return No return.
+ */
+ NVRenderPathRender(NVRenderContextImpl &context, NVFoundationBase &fnd, size_t range);
+
+ /// @brief destructor
+ ~NVRenderPathRender();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendPathObject GetPathHandle() { return m_PathRenderHandle; }
+
+ // The render context can create a path specification object.
+ void SetPathSpecification(NVRenderPathSpecification &inCommandBuffer);
+
+ NVBounds3 GetPathObjectBoundingBox();
+ NVBounds3 GetPathObjectFillBox();
+ NVBounds3 GetPathObjectStrokeBox();
+
+ void SetStrokeWidth(QT3DSF32 inStrokeWidth);
+ QT3DSF32 GetStrokeWidth() const;
+
+ void StencilStroke();
+ void StencilFill();
+
+ /**
+ * @brief static create function
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] range Number of internal objects
+ *
+ * @return the backend object handle.
+ */
+ static NVRenderPathRender *Create(NVRenderContextImpl &context, size_t range);
+
+ private:
+ NVRenderBackend::NVRenderBackendPathObject m_PathRenderHandle; ///< opaque backend handle
+ size_t m_Range; ///< range of internal objects
+ QT3DSF32 m_StrokeWidth;
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderPathSpecification.cpp b/src/render/Qt3DSRenderPathSpecification.cpp
new file mode 100644
index 0000000..f4b26f1
--- /dev/null
+++ b/src/render/Qt3DSRenderPathSpecification.cpp
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderPathSpecification.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderPathSpecification::NVRenderPathSpecification(NVRenderContextImpl &context,
+ NVFoundationBase &fnd)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , m_Backend(context.GetBackend())
+ , mRefCount(0)
+ , m_PathCommands(fnd.getAllocator(), "m_PathCommands")
+ , m_PathCoords(fnd.getAllocator(), "m_PathCoords")
+ {
+ }
+
+ NVRenderPathSpecification::~NVRenderPathSpecification() {}
+
+ void NVRenderPathSpecification::Reset()
+ {
+ m_PathCommands.clear();
+ m_PathCoords.clear();
+ }
+
+ void NVRenderPathSpecification::P(QT3DSVec2 inData)
+ {
+ m_PathCoords.push_back(inData.x);
+ m_PathCoords.push_back(inData.y);
+ }
+
+ void NVRenderPathSpecification::MoveTo(QT3DSVec2 inPoint)
+ {
+ // we should actually query the backend for command converesion
+ // but will we support any other pather render system than nv path?
+ StaticAssert<NVRenderPathCommands::MoveTo == 0x02>::valid_expression();
+
+ m_PathCommands.push_back(NVRenderPathCommands::MoveTo);
+ P(inPoint);
+ }
+
+ void NVRenderPathSpecification::CubicCurveTo(QT3DSVec2 inC1, QT3DSVec2 inC2, QT3DSVec2 inDest)
+ {
+ // we should actually query the backend for command converesion
+ // but will we support any other pather render system than nv path?
+ StaticAssert<NVRenderPathCommands::CubicCurveTo == 0x0C>::valid_expression();
+
+ m_PathCommands.push_back(NVRenderPathCommands::CubicCurveTo);
+ P(inC1);
+ P(inC2);
+ P(inDest);
+ }
+
+ void NVRenderPathSpecification::ClosePath()
+ {
+ // we should actually query the backend for command converesion
+ // but will we support any other pather render system than nv path?
+ StaticAssert<NVRenderPathCommands::Close == 0x00>::valid_expression();
+
+ m_PathCommands.push_back(NVRenderPathCommands::Close);
+ }
+
+ NVRenderPathSpecification *
+ NVRenderPathSpecification::CreatePathSpecification(NVRenderContextImpl &context)
+ {
+ QT3DS_ASSERT(context.IsPathRenderingSupported());
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderPathSpecification)(context, context.GetFoundation());
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderPathSpecification.h b/src/render/Qt3DSRenderPathSpecification.h
new file mode 100644
index 0000000..7c6faed
--- /dev/null
+++ b/src/render/Qt3DSRenderPathSpecification.h
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PATH_SPECIFICATION_H
+#define QT3DS_RENDER_PATH_SPECIFICATION_H
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+
+ class NVRenderPathSpecification : public NVRefCounted
+ {
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderPathSpecification(NVRenderContextImpl &context, NVFoundationBase &fnd);
+
+ /// @NVRenderPathSpecification destructor
+ ~NVRenderPathSpecification();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief reset commands and coordiantes
+ *
+ * @return No return.
+ */
+ virtual void Reset();
+
+ /**
+ * @brief add new move to command
+ *
+ * @param[in] inPoint Coordinate
+ *
+ * @return No return.
+ */
+ virtual void MoveTo(QT3DSVec2 inPoint);
+
+ /**
+ * @brief add new cubic curve command
+ *
+ * @param[in] inC1 control point 1
+ * @param[in] inC2 control point 2
+ * @param[in] inDest final point
+ *
+ * @return No return.
+ */
+ virtual void CubicCurveTo(QT3DSVec2 inC1, QT3DSVec2 inC2, QT3DSVec2 inDest);
+
+ /**
+ * @brief add new close command
+ *
+ *
+ * @return No return.
+ */
+ virtual void ClosePath();
+
+ /**
+ * @brief Get path command list
+ *
+ *
+ * @return path commands
+ */
+ virtual NVConstDataRef<QT3DSU8> GetPathCommands() { return m_PathCommands; }
+
+ /**
+ * @brief Get path coordinates list
+ *
+ *
+ * @return path coordinates
+ */
+ virtual NVConstDataRef<QT3DSF32> GetPathCoords() { return m_PathCoords; }
+
+ private:
+ nvvector<QT3DSU8> m_PathCommands;
+ nvvector<QT3DSF32> m_PathCoords;
+
+ /**
+ * @brief add a new point to the coordinates
+ *
+ * @param[in] inPoint Coordinate
+ *
+ * @return No return.
+ */
+ void P(QT3DSVec2 inData);
+
+ public:
+ static NVRenderPathSpecification *CreatePathSpecification(NVRenderContextImpl &context);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/render/Qt3DSRenderProgramPipeline.cpp b/src/render/Qt3DSRenderProgramPipeline.cpp
new file mode 100644
index 0000000..b0a9f27
--- /dev/null
+++ b/src/render/Qt3DSRenderProgramPipeline.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderProgramPipeline.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderProgramPipeline::NVRenderProgramPipeline(NVRenderContextImpl &context,
+ NVFoundationBase &fnd)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , m_Backend(context.GetBackend())
+ , mRefCount(0)
+ , m_Program(NULL)
+ , m_VertexProgram(NULL)
+ , m_FragmentProgram(NULL)
+ , m_TessControlProgram(NULL)
+ , m_TessEvalProgram(NULL)
+ , m_GeometryProgram(NULL)
+ , m_ComputProgram(NULL)
+ {
+ m_ProgramPipelineHandle = m_Backend->CreateProgramPipeline();
+ }
+
+ NVRenderProgramPipeline::~NVRenderProgramPipeline()
+ {
+ if (m_ProgramPipelineHandle) {
+ m_Backend->ReleaseProgramPipeline(m_ProgramPipelineHandle);
+ }
+
+ if (m_VertexProgram)
+ m_VertexProgram->release();
+ if (m_FragmentProgram)
+ m_FragmentProgram->release();
+ if (m_TessControlProgram)
+ m_TessControlProgram->release();
+ if (m_TessEvalProgram)
+ m_TessEvalProgram->release();
+ if (m_GeometryProgram)
+ m_GeometryProgram->release();
+ }
+
+ bool NVRenderProgramPipeline::IsValid() { return (m_ProgramPipelineHandle != NULL); }
+
+ void NVRenderProgramPipeline::SetProgramStages(NVRenderShaderProgram *inProgram,
+ NVRenderShaderTypeFlags flags)
+ {
+ bool bDirty = false;
+
+ if (flags & NVRenderShaderTypeValue::Vertex && inProgram != m_VertexProgram) {
+ if (m_VertexProgram)
+ m_VertexProgram->release();
+ if (inProgram)
+ inProgram->addRef();
+ m_VertexProgram = inProgram;
+ bDirty = true;
+ }
+ if (flags & NVRenderShaderTypeValue::Fragment && inProgram != m_FragmentProgram) {
+ if (m_FragmentProgram)
+ m_FragmentProgram->release();
+ if (inProgram)
+ inProgram->addRef();
+ m_FragmentProgram = inProgram;
+ bDirty = true;
+ }
+ if (flags & NVRenderShaderTypeValue::TessControl && inProgram != m_TessControlProgram) {
+ if (m_TessControlProgram)
+ m_TessControlProgram->release();
+ if (inProgram)
+ inProgram->addRef();
+ m_TessControlProgram = inProgram;
+ bDirty = true;
+ }
+ if (flags & NVRenderShaderTypeValue::TessEvaluation && inProgram != m_TessEvalProgram) {
+ if (m_TessEvalProgram)
+ m_TessEvalProgram->release();
+ if (inProgram)
+ inProgram->addRef();
+ m_TessEvalProgram = inProgram;
+ bDirty = true;
+ }
+ if (flags & NVRenderShaderTypeValue::Geometry && inProgram != m_GeometryProgram) {
+ if (m_GeometryProgram)
+ m_GeometryProgram->release();
+ if (inProgram)
+ inProgram->addRef();
+ m_GeometryProgram = inProgram;
+ bDirty = true;
+ }
+
+ if (bDirty) {
+ m_Backend->SetProgramStages(m_ProgramPipelineHandle, flags,
+ (inProgram) ? inProgram->GetShaderProgramHandle() : NULL);
+ }
+ }
+
+ void NVRenderProgramPipeline::Bind()
+ {
+ m_Backend->SetActiveProgramPipeline(m_ProgramPipelineHandle);
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderProgramPipeline.h b/src/render/Qt3DSRenderProgramPipeline.h
new file mode 100644
index 0000000..ce47146
--- /dev/null
+++ b/src/render/Qt3DSRenderProgramPipeline.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PROGRAM_PIPLINE_H
+#define QT3DS_RENDER_PROGRAM_PIPLINE_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include <EASTL/string.h>
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+ class NVRenderShaderProgram;
+
+ ///< A program pipeline is a collection of a multiple programs (vertex, fragment, geometry,....)
+ class QT3DS_AUTOTEST_EXPORT NVRenderProgramPipeline : public NVRefCounted
+ {
+ protected:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderProgramPipeline(NVRenderContextImpl &context, NVFoundationBase &fnd);
+
+ /// @brief destructor
+ ~NVRenderProgramPipeline();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief Query if pipeline is valid
+ *
+ * @return True if valid.
+ */
+ bool IsValid();
+
+ /**
+ * @brief enable / disable a program stage in the pipeline
+ *
+ * @param[in] pProgram Pointer to program. If NULL stage will be disabled
+ * @param[in] flags Flags to which stage this program is bound to. Can more than
+ * one stage
+ *
+ * @return no return.
+ */
+ void SetProgramStages(NVRenderShaderProgram *pProgram, NVRenderShaderTypeFlags flags);
+
+ /**
+ * @brief Make the program pipeline active
+ *
+ * @return True if valid.
+ */
+ void Bind();
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendProgramPipeline GetShaderHandle()
+ {
+ return m_ProgramPipelineHandle;
+ }
+
+ /**
+ * @brief get the vertex stage program
+ *
+ * @return the backend object handle.
+ */
+ NVRenderShaderProgram *GetVertexStage() { return m_VertexProgram; }
+
+ private:
+ NVRenderBackend::NVRenderBackendProgramPipeline
+ m_ProgramPipelineHandle; ///< opaque backend handle
+
+ NVRenderShaderProgram
+ *m_Program; ///< for non separable programs this contains the entire program
+ NVRenderShaderProgram
+ *m_VertexProgram; ///< for separable programs this contains the vertex program
+ NVRenderShaderProgram
+ *m_FragmentProgram; ///< for separable programs this contains the fragment program
+ NVRenderShaderProgram *m_TessControlProgram; ///< for separable programs this contains the
+ ///tessellation control program
+ NVRenderShaderProgram *m_TessEvalProgram; ///< for separable programs this contains the
+ ///tessellation evaluation program
+ NVRenderShaderProgram
+ *m_GeometryProgram; ///< for separable programs this contains the geometry program
+ NVRenderShaderProgram
+ *m_ComputProgram; ///< for separable programs this contains the compute program
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderQueryBase.cpp b/src/render/Qt3DSRenderQueryBase.cpp
new file mode 100644
index 0000000..f13bc49
--- /dev/null
+++ b/src/render/Qt3DSRenderQueryBase.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderQueryBase.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSFoundation.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderQueryBase::NVRenderQueryBase(NVRenderContextImpl &context, NVFoundationBase &fnd)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ {
+ m_QueryHandle = m_Backend->CreateQuery();
+ }
+
+ NVRenderQueryBase::~NVRenderQueryBase()
+ {
+ if (m_QueryHandle)
+ m_Backend->ReleaseQuery(m_QueryHandle);
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderQueryBase.h b/src/render/Qt3DSRenderQueryBase.h
new file mode 100644
index 0000000..7a7ead8
--- /dev/null
+++ b/src/render/Qt3DSRenderQueryBase.h
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QUERY_BASE_H
+#define QT3DS_RENDER_QUERY_BASE_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ // forward declaration
+ class NVRenderContextImpl;
+ class NVRenderBackend;
+
+ ///< Base class
+ class NVRenderQueryBase : public NVRefCounted
+ {
+ protected:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderBackend::NVRenderBackendQueryObject m_QueryHandle; ///< opaque backend handle
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderQueryBase(NVRenderContextImpl &context, NVFoundationBase &fnd);
+
+ virtual ~NVRenderQueryBase();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief Get query type
+ *
+ * @return Return query type
+ */
+ virtual NVRenderQueryType::Enum GetQueryType() const = 0;
+
+ /**
+ * @brief Get a pointer to the foundation
+ *
+ * @return pointer to foundation
+ */
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ /**
+ * @brief begin a query
+ *
+ * @return no return.
+ */
+ virtual void Begin() = 0;
+
+ /**
+ * @brief end a query
+ *
+ * @return no return.
+ */
+ virtual void End() = 0;
+
+ /**
+ * @brief Get the result of a query
+ *
+ * @param[out] params Contains result of query regarding query type
+ *
+ * @return no return.
+ */
+ virtual void GetResult(QT3DSU32 *params) = 0;
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendQueryObject GetQuerytHandle() const
+ {
+ return m_QueryHandle;
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderRasterizerState.cpp b/src/render/Qt3DSRenderRasterizerState.cpp
new file mode 100644
index 0000000..e7daf7f
--- /dev/null
+++ b/src/render/Qt3DSRenderRasterizerState.cpp
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/vector.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderRasterizerState.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderRasterizerState::NVRenderRasterizerState(NVRenderContextImpl &context,
+ NVFoundationBase &fnd, QT3DSF32 depthBias,
+ QT3DSF32 depthScale, NVRenderFaces::Enum cullFace)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ {
+ // create backend handle
+ m_StateHandle = m_Backend->CreateRasterizerState(depthBias, depthScale, cullFace);
+ }
+
+ NVRenderRasterizerState::~NVRenderRasterizerState()
+ {
+ if (m_StateHandle) {
+ m_Backend->ReleaseRasterizerState(m_StateHandle);
+ m_Context.StateDestroyed(*this);
+ }
+ }
+
+ NVRenderRasterizerState *NVRenderRasterizerState::Create(NVRenderContextImpl &context,
+ QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace)
+ {
+ return QT3DS_NEW(context.GetFoundation().getAllocator(), NVRenderRasterizerState)(
+ context, context.GetFoundation(), depthBias, depthScale, cullFace);
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderRasterizerState.h b/src/render/Qt3DSRenderRasterizerState.h
new file mode 100644
index 0000000..9b71ae4
--- /dev/null
+++ b/src/render/Qt3DSRenderRasterizerState.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_RASTERIZER_STATE_H
+#define QT3DS_RENDER_RASTERIZER_STATE_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+
+ // currently this handles only stencil state
+ class NVRenderRasterizerState : public NVRefCounted
+ {
+
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderBackend::NVRenderBackendRasterizerStateObject
+ m_StateHandle; ///< opaque backend handle
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] depthBias depth bias
+ * @param[in] depthScale depth multiplicator
+ * @param[in] cullFace which face to cull front or back
+ *
+ * @return No return.
+ */
+ NVRenderRasterizerState(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ QT3DSF32 depthBias, QT3DSF32 depthScale, NVRenderFaces::Enum cullFace);
+
+ virtual ~NVRenderRasterizerState();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendRasterizerStateObject GetRasterizerObjectHandle()
+ {
+ return m_StateHandle;
+ }
+
+ static NVRenderRasterizerState *Create(NVRenderContextImpl &context, QT3DSF32 depthBias,
+ QT3DSF32 depthScale, NVRenderFaces::Enum cullFace);
+
+ private:
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderRenderBuffer.cpp b/src/render/Qt3DSRenderRenderBuffer.cpp
new file mode 100644
index 0000000..b682bc1
--- /dev/null
+++ b/src/render/Qt3DSRenderRenderBuffer.cpp
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSFoundation.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderRenderBuffer::NVRenderRenderBuffer(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderRenderBufferFormats::Enum format,
+ QT3DSU32 width, QT3DSU32 height)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_Width(width)
+ , m_Height(height)
+ , m_StorageFormat(format)
+ , m_BufferHandle(NULL)
+ {
+ SetDimensions(NVRenderRenderBufferDimensions(width, height));
+ }
+
+ NVRenderRenderBuffer::~NVRenderRenderBuffer()
+ {
+ m_Context.RenderBufferDestroyed(*this);
+ m_Backend->ReleaseRenderbuffer(m_BufferHandle);
+ m_BufferHandle = 0;
+ }
+
+ void NVRenderRenderBuffer::SetDimensions(const NVRenderRenderBufferDimensions &inDimensions)
+ {
+ QT3DSU32 maxWidth, maxHeight;
+ m_Width = inDimensions.m_Width;
+ m_Height = inDimensions.m_Height;
+
+ // get max size and clamp to max value
+ m_Context.getMaxTextureSize(maxWidth, maxHeight);
+ if (m_Width > maxWidth || m_Height > maxHeight) {
+ qCCritical(INVALID_OPERATION, "Width or height is greater than max texture size (%d, %d)",
+ maxWidth, maxHeight);
+ m_Width = NVMin(m_Width, maxWidth);
+ m_Height = NVMin(m_Height, maxHeight);
+ }
+
+ bool success = true;
+
+ if (m_BufferHandle == NULL)
+ m_BufferHandle = m_Backend->CreateRenderbuffer(m_StorageFormat, m_Width, m_Height);
+ else
+ success =
+ m_Backend->ResizeRenderbuffer(m_BufferHandle, m_StorageFormat, m_Width, m_Height);
+
+ if (m_BufferHandle == NULL || !success) {
+ // We could try smaller sizes
+ QT3DS_ASSERT(false);
+ qCCritical(INTERNAL_ERROR, "Unable to create render buffer %s, %dx%d",
+ NVRenderRenderBufferFormats::toString(m_StorageFormat), m_Width,
+ m_Height);
+ }
+ }
+}
+}
+
+qt3ds::render::NVRenderRenderBuffer *
+qt3ds::render::NVRenderRenderBuffer::Create(NVRenderContextImpl &context,
+ NVRenderRenderBufferFormats::Enum format, QT3DSU32 width,
+ QT3DSU32 height)
+{
+ NVRenderRenderBuffer *retval = NULL;
+ if (width == 0 || height == 0) {
+ qCCritical(INVALID_PARAMETER, "Invalid renderbuffer width or height");
+ return retval;
+ }
+
+ retval = QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderRenderBuffer)(context, context.GetFoundation(), format, width, height);
+
+ return retval;
+}
diff --git a/src/render/Qt3DSRenderRenderBuffer.h b/src/render/Qt3DSRenderRenderBuffer.h
new file mode 100644
index 0000000..41f4068
--- /dev/null
+++ b/src/render/Qt3DSRenderRenderBuffer.h
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_RENDER_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_RENDER_BUFFER_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+ class NVRenderContextImpl;
+
+ struct NVRenderRenderBufferDimensions
+ {
+ QT3DSU32 m_Width; ///< buffer width
+ QT3DSU32 m_Height; ///< buffer height
+
+ NVRenderRenderBufferDimensions(QT3DSU32 w, QT3DSU32 h)
+ : m_Width(w)
+ , m_Height(h)
+ {
+ }
+ NVRenderRenderBufferDimensions()
+ : m_Width(0)
+ , m_Height(0)
+ {
+ }
+ };
+
+ class NVRenderRenderBuffer : public NVRefCounted, public NVRenderImplemented
+ {
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ QT3DSU32 m_Width; ///< buffer width
+ QT3DSU32 m_Height; ///< buffer height
+ NVRenderRenderBufferFormats::Enum m_StorageFormat; ///< buffer storage format
+
+ NVRenderBackend::NVRenderBackendRenderbufferObject
+ m_BufferHandle; ///< opaque backend handle
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] format Renderbuffer format
+ * @param[in] width Renderbuffer width
+ * @param[in] height Renderbuffer height
+ *
+ * @return No return.
+ */
+ NVRenderRenderBuffer(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderRenderBufferFormats::Enum format, QT3DSU32 width, QT3DSU32 height);
+
+ /// destructor
+ virtual ~NVRenderRenderBuffer();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ /**
+ * @brief query buffer format
+ *
+ *
+ * @return buffer format
+ */
+ virtual NVRenderRenderBufferFormats::Enum GetStorageFormat() const
+ {
+ return m_StorageFormat;
+ }
+
+ /**
+ * @brief query buffer dimension
+ *
+ *
+ * @return NVRenderRenderBufferDimensions object
+ */
+ virtual NVRenderRenderBufferDimensions GetDimensions() const
+ {
+ return NVRenderRenderBufferDimensions(m_Width, m_Height);
+ }
+
+ /**
+ * @brief constructor
+ *
+ * @param[in] inDimensions A dimension object
+ *
+ * @return buffer format
+ */
+ virtual void SetDimensions(const NVRenderRenderBufferDimensions &inDimensions);
+
+ /**
+ * @brief static creator function
+ *
+ * @param[in] context Pointer to context
+ * @param[in] format Renderbuffer format
+ * @param[in] width Renderbuffer width
+ * @param[in] height Renderbuffer height
+ *
+ * @return No return.
+ */
+ static NVRenderRenderBuffer *Create(NVRenderContextImpl &context,
+ NVRenderRenderBufferFormats::Enum format, QT3DSU32 width,
+ QT3DSU32 height);
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendRenderbufferObject GetRenderBuffertHandle()
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_BufferHandle);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderSampler.cpp b/src/render/Qt3DSRenderSampler.cpp
new file mode 100644
index 0000000..b02fc61
--- /dev/null
+++ b/src/render/Qt3DSRenderSampler.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderSampler.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderTextureSampler::NVRenderTextureSampler(
+ NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureMinifyingOp::Enum minFilter, NVRenderTextureMagnifyingOp::Enum magFilter,
+ NVRenderTextureCoordOp::Enum wrapS, NVRenderTextureCoordOp::Enum wrapT,
+ NVRenderTextureCoordOp::Enum wrapR, NVRenderTextureSwizzleMode::Enum swizzleMode,
+ QT3DSF32 minLod, QT3DSF32 maxLod, QT3DSF32 lodBias, NVRenderTextureCompareMode::Enum compareMode,
+ NVRenderTextureCompareOp::Enum compareFunc, QT3DSF32 anisotropy, QT3DSF32 *borderColor)
+ : m_MinFilter(minFilter)
+ , m_MagFilter(magFilter)
+ , m_WrapS(wrapS)
+ , m_WrapT(wrapT)
+ , m_WrapR(wrapR)
+ , m_SwizzleMode(swizzleMode)
+ , m_MinLod(minLod)
+ , m_MaxLod(maxLod)
+ , m_LodBias(lodBias)
+ , m_CompareMode(compareMode)
+ , m_CompareOp(compareFunc)
+ , m_Anisotropy(anisotropy)
+ , m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_SamplerHandle(NULL)
+ {
+ // create backend handle
+ m_SamplerHandle = m_Backend->CreateSampler();
+
+ if (borderColor) {
+ m_BorderColor[0] = borderColor[0];
+ m_BorderColor[1] = borderColor[1];
+ m_BorderColor[2] = borderColor[2];
+ m_BorderColor[3] = borderColor[3];
+ }
+ }
+
+ NVRenderTextureSampler::~NVRenderTextureSampler()
+ {
+ if (m_SamplerHandle)
+ m_Backend->ReleaseSampler(m_SamplerHandle);
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderSampler.h b/src/render/Qt3DSRenderSampler.h
new file mode 100644
index 0000000..77d3f00
--- /dev/null
+++ b/src/render/Qt3DSRenderSampler.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_SAMPLER_H
+#define QT3DS_RENDER_QT3DS_RENDER_SAMPLER_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+
+ class NVRenderTextureSampler
+ {
+ public:
+ NVRenderTextureMinifyingOp::Enum m_MinFilter;
+ NVRenderTextureMagnifyingOp::Enum m_MagFilter;
+ NVRenderTextureCoordOp::Enum m_WrapS;
+ NVRenderTextureCoordOp::Enum m_WrapT;
+ NVRenderTextureCoordOp::Enum m_WrapR;
+ NVRenderTextureSwizzleMode::Enum m_SwizzleMode;
+ QT3DSF32 m_MinLod;
+ QT3DSF32 m_MaxLod;
+ QT3DSF32 m_LodBias;
+ NVRenderTextureCompareMode::Enum m_CompareMode;
+ NVRenderTextureCompareOp::Enum m_CompareOp;
+ QT3DSF32 m_Anisotropy;
+ QT3DSF32 m_BorderColor[4];
+
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] minFilter Texture min filter
+ * @param[in] magFilter Texture mag filter
+ * @param[in] wrapS Texture coord generation for S
+ * @param[in] wrapT Texture coord generation for T
+ * @param[in] wrapR Texture coord generation for R
+ * @param[in] swizzleMode Texture swizzle mode
+ * @param[in] minLod Texture min level of detail
+ * @param[in] maxLod Texture max level of detail
+ * @param[in] lodBias Texture level of detail bias (unused)
+ * @param[in] compareMode Texture compare mode
+ * @param[in] compareFunc Texture compare function
+ * @param[in] anisoFilter Aniso filter value [1.0, 16.0]
+ * @param[in] borderColor Texture border color float[4] (unused)
+ *
+ * @return No return.
+ */
+ NVRenderTextureSampler(
+ NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureMinifyingOp::Enum minFilter = NVRenderTextureMinifyingOp::Linear,
+ NVRenderTextureMagnifyingOp::Enum magFilter = NVRenderTextureMagnifyingOp::Linear,
+ NVRenderTextureCoordOp::Enum wrapS = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapT = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapR = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle,
+ QT3DSF32 minLod = -1000.0, QT3DSF32 maxLod = 1000.0, QT3DSF32 lodBias = 0.0,
+ NVRenderTextureCompareMode::Enum compareMode = NVRenderTextureCompareMode::NoCompare,
+ NVRenderTextureCompareOp::Enum compareFunc = NVRenderTextureCompareOp::LessThanOrEqual,
+ QT3DSF32 anisotropy = 1.0, QT3DSF32 *borderColor = NULL);
+
+ /**
+ * @brief destructor
+ *
+ */
+ virtual ~NVRenderTextureSampler();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendSamplerObject GetSamplerHandle() const
+ {
+ return m_SamplerHandle;
+ }
+
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderBackend::NVRenderBackendSamplerObject m_SamplerHandle; ///< opaque backend handle
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderShader.h b/src/render/Qt3DSRenderShader.h
new file mode 100644
index 0000000..8d0a62c
--- /dev/null
+++ b/src/render/Qt3DSRenderShader.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_H
+#define QT3DS_RENDER_SHADER_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include <EASTL/string.h>
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+
+ ///< A shader program is an object composed of a multiple shaders (vertex, fragment,
+ ///geometry,....)
+ class NVRenderShader
+ {
+ protected:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVConstDataRef<QT3DSI8> m_Source; ///< shader source code
+ bool m_Binary; ///< true for binary programs
+ eastl::string m_ErrorMessage; ///< contains the error message if linking fails
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , m_Backend(context.GetBackend())
+ , m_Source(source)
+ , m_Binary(binaryProgram)
+ {
+ }
+
+ /// @brief destructor
+ ~NVRenderShader(){}
+
+ /**
+ * @brief Query if shader compiled succesfuly
+ *
+ * @return True if shader is valid.
+ */
+ virtual bool IsValid() = 0;
+
+ /**
+ * @brief Get Error Message
+ *
+ * @param[out] messageLength Pointer to error string
+ * @param[out] messageLength Size of error meesage
+ *
+ * @return no return
+ */
+ virtual void GetErrorMessage(QT3DSI32 *messageLength, const char *errorMessage)
+ {
+ // Since we do not have any error message just generate a generic one
+ if (m_Binary)
+ m_ErrorMessage = "Binary shader compilation failed";
+
+ *messageLength = m_ErrorMessage.size();
+ errorMessage = m_ErrorMessage.c_str();
+ }
+
+ /**
+ * @brief Get Error Message
+ *
+ *
+ * @return error message.
+ */
+ virtual const char *GetErrorMessage()
+ {
+ if (m_Binary)
+ m_ErrorMessage = "Binary shader compilation failed";
+
+ return m_ErrorMessage.c_str();
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderShaderConstant.h b/src/render/Qt3DSRenderShaderConstant.h
new file mode 100644
index 0000000..7fb57ff
--- /dev/null
+++ b/src/render/Qt3DSRenderShaderConstant.h
@@ -0,0 +1,448 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_CONSTANT_H
+#define QT3DS_RENDER_SHADER_CONSTANT_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSMat33.h"
+#include "foundation/Qt3DSMat44.h"
+#include "EASTL/string.h"
+#include "EASTL/utility.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ ///< forward declarations
+ class NVRenderContextImpl;
+ class NVRenderConstantBuffer;
+
+ ///< A shader constant belongs to a program
+ class QT3DS_AUTOTEST_EXPORT NVRenderShaderConstantBase
+ {
+ public:
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ CRegisteredString m_Name; ///< register constant name
+ QT3DSI32 m_Location; ///< constant index
+ QT3DSI32 m_ElementCount; ///< constant element count for arrays
+ NVRenderShaderDataTypes::Enum m_Type; ///< constant type
+ QT3DSI32 m_Binding; ///< sampler/imnage binding point
+
+ public:
+ NVRenderShaderConstantBase(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding)
+ : m_Backend(backend)
+ , m_Name(name)
+ , m_Location(location)
+ , m_ElementCount(elementCount)
+ , m_Type(type)
+ , m_Binding(binding)
+ {
+ }
+
+ NVRenderShaderDataTypes::Enum GetShaderConstantType() const { return m_Type; }
+
+ virtual void Release() = 0;
+ };
+
+ ///< A general class for shader types
+ template <typename TDataType>
+ class NVRenderShaderConstant : public NVRenderShaderConstantBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ TDataType m_Value; ///< constant value
+
+ public:
+ NVRenderShaderConstant(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding, NVFoundationBase &allocator)
+ : NVRenderShaderConstantBase(backend, name, location, elementCount, type, binding)
+ , m_Foundation(allocator)
+ {
+ memset(&m_Value, 0, sizeof(TDataType));
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override { NVDelete(GetFoundation().getAllocator(), this); }
+ };
+
+ ///< A specialized class for textures
+ template <>
+ class NVRenderShaderConstant<NVRenderTexture2DPtr> : public NVRenderShaderConstantBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QT3DSU32 m_Value; ///< constant value
+
+ public:
+ NVRenderShaderConstant(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding, NVFoundationBase &allocator)
+ : NVRenderShaderConstantBase(backend, name, location, elementCount, type, binding)
+ , m_Foundation(allocator)
+ {
+ m_Value = QT3DS_MAX_U32;
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override { NVDelete(GetFoundation().getAllocator(), this); }
+ };
+
+ ///< A specialized class for textures
+ template <>
+ class NVRenderShaderConstant<NVRenderTexture2DHandle> : public NVRenderShaderConstantBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QVector<QT3DSU32> m_Value; ///< constant value
+
+ public:
+ NVRenderShaderConstant(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding, NVFoundationBase &allocator)
+ : NVRenderShaderConstantBase(backend, name, location, elementCount, type, binding)
+ , m_Foundation(allocator)
+ {
+ m_Value.resize(elementCount);
+ m_Value.fill(QT3DS_MAX_U32);
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override { NVDelete(GetFoundation().getAllocator(), this); }
+ };
+
+ ///< A specialized class for texture arrays
+ template <>
+ class NVRenderShaderConstant<NVRenderTexture2DArrayPtr> : public NVRenderShaderConstantBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QT3DSU32 m_Value; ///< constant value
+
+ public:
+ NVRenderShaderConstant(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding, NVFoundationBase &allocator)
+ : NVRenderShaderConstantBase(backend, name, location, elementCount, type, binding)
+ , m_Foundation(allocator)
+ {
+ m_Value = QT3DS_MAX_U32;
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override { NVDelete(GetFoundation().getAllocator(), this); }
+ };
+
+ ///< A specialized class for cubemap textures
+ template <>
+ class NVRenderShaderConstant<NVRenderTextureCubePtr> : public NVRenderShaderConstantBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QT3DSU32 m_Value; ///< constant value
+
+ public:
+ NVRenderShaderConstant(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding, NVFoundationBase &allocator)
+ : NVRenderShaderConstantBase(backend, name, location, elementCount, type, binding)
+ , m_Foundation(allocator)
+ {
+ m_Value = QT3DS_MAX_U32;
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override { NVDelete(GetFoundation().getAllocator(), this); }
+ };
+
+ ///< A specialized class for cubemap textures
+ template <>
+ class NVRenderShaderConstant<NVRenderTextureCubeHandle> : public NVRenderShaderConstantBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QVector<QT3DSU32> m_Value; ///< constant value
+
+ public:
+ NVRenderShaderConstant(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding, NVFoundationBase &allocator)
+ : NVRenderShaderConstantBase(backend, name, location, elementCount, type, binding)
+ , m_Foundation(allocator)
+ {
+ m_Value.resize(elementCount);
+ m_Value.fill(QT3DS_MAX_U32);
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override { NVDelete(GetFoundation().getAllocator(), this); }
+ };
+
+ ///< A specialized class for texture image buffer
+ template <>
+ class NVRenderShaderConstant<NVRenderImage2DPtr> : public NVRenderShaderConstantBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QT3DSU32 m_Value; ///< constant value
+
+ public:
+ NVRenderShaderConstant(NVRenderBackend *backend, CRegisteredString name, QT3DSI32 location,
+ QT3DSI32 elementCount, NVRenderShaderDataTypes::Enum type,
+ QT3DSI32 binding, NVFoundationBase &allocator)
+ : NVRenderShaderConstantBase(backend, name, location, elementCount, type, binding)
+ , m_Foundation(allocator)
+ {
+ m_Value = QT3DS_MAX_U32;
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override { NVDelete(GetFoundation().getAllocator(), this); }
+ };
+
+ ///< Base for any buffer ( constant, texture, ... ) which is used by this program
+ class NVRenderShaderBufferBase
+ {
+ public:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ CRegisteredString m_Name; ///< buffer name
+ QT3DSU32 m_Location; ///< program buffer block location
+ QT3DSU32 m_Binding; ///< program buffer binding
+ QT3DSI32 m_Size; ///< buffer size
+
+ public:
+ NVRenderShaderBufferBase(NVRenderContextImpl &context, CRegisteredString name,
+ QT3DSI32 location, QT3DSI32 binding, QT3DSI32 size)
+ : m_Context(context)
+ , m_Name(name)
+ , m_Location(location)
+ , m_Binding(binding)
+ , m_Size(size)
+ {
+ }
+
+ virtual void Release() = 0;
+
+ virtual void Validate(NVRenderShaderProgram *inShader) = 0;
+ virtual void BindToProgram(NVRenderShaderProgram *inShader) = 0;
+ virtual void Update() = 0;
+ };
+
+ class NVRenderShaderConstantBuffer : public NVRenderShaderBufferBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QT3DSI32 m_ParamCount; ///< count of parameters contained in the constant buffer
+ NVRenderConstantBuffer *m_pCB; ///< pointer to constant buffer
+
+ public:
+ NVRenderShaderConstantBuffer(NVRenderContextImpl &context, CRegisteredString name,
+ QT3DSU32 location, QT3DSI32 binding, QT3DSI32 size, QT3DSI32 count,
+ NVRenderConstantBuffer *pCB, NVFoundationBase &allocator)
+ : NVRenderShaderBufferBase(context, name, location, binding, size)
+ , m_Foundation(allocator)
+ , m_ParamCount(count)
+ , m_pCB(pCB)
+ {
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override
+ {
+ if (m_pCB)
+ m_pCB->release();
+
+ NVDelete(GetFoundation().getAllocator(), this);
+ }
+
+ void Validate(NVRenderShaderProgram *inShader) override
+ {
+ // A constant buffer might not be set at first call
+ // due to the fact that they are compiled from a cache file
+ // Now it must exists.
+ if (m_pCB)
+ return;
+
+ NVRenderConstantBuffer *cb = m_Context.GetConstantBuffer(m_Name);
+ if (cb) {
+ cb->SetupBuffer(inShader, m_Location, m_Size, m_ParamCount);
+ cb->addRef();
+ m_pCB = cb;
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void Update() override
+ {
+ if (m_pCB)
+ m_pCB->Update();
+ }
+
+ void BindToProgram(NVRenderShaderProgram *inShader) override
+ {
+ if (m_pCB)
+ m_pCB->BindToShaderProgram(inShader, m_Location, m_Binding);
+ }
+ };
+
+ class NVRenderShaderStorageBuffer : public NVRenderShaderBufferBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QT3DSI32 m_ParamCount; ///< count of parameters contained in the constant buffer
+ NVRenderStorageBuffer *m_pSB; ///< pointer to storage buffer
+
+ public:
+ NVRenderShaderStorageBuffer(NVRenderContextImpl &context, CRegisteredString name,
+ QT3DSU32 location, QT3DSI32 binding, QT3DSI32 size, QT3DSI32 count,
+ NVRenderStorageBuffer *pSB, NVFoundationBase &allocator)
+ : NVRenderShaderBufferBase(context, name, location, binding, size)
+ , m_Foundation(allocator)
+ , m_ParamCount(count)
+ , m_pSB(pSB)
+ {
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override
+ {
+ if (m_pSB)
+ m_pSB->release();
+
+ NVDelete(GetFoundation().getAllocator(), this);
+ }
+
+ void Validate(NVRenderShaderProgram * /*inShader*/) override
+ {
+ // A constant buffer might not be set at first call
+ // due to the fact that they are compile from a cache file
+ // Now it must exists.
+ if (m_pSB)
+ return;
+
+ NVRenderStorageBuffer *sb = m_Context.GetStorageBuffer(m_Name);
+ if (sb) {
+ sb->addRef();
+ m_pSB = sb;
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void Update() override
+ {
+ if (m_pSB)
+ m_pSB->Update();
+ }
+
+ void BindToProgram(NVRenderShaderProgram * /*inShader*/) override
+ {
+ if (m_pSB)
+ m_pSB->BindToShaderProgram(m_Location);
+ }
+ };
+
+ class NVRenderShaderAtomicCounterBuffer : public NVRenderShaderBufferBase
+ {
+ public:
+ NVFoundationBase &m_Foundation; ///< allocator
+ QT3DSI32 m_ParamCount; ///< count of parameters contained in the constant buffer
+ NVRenderAtomicCounterBuffer *m_pAcB; ///< pointer to atomic counter buffer
+
+ public:
+ NVRenderShaderAtomicCounterBuffer(NVRenderContextImpl &context, CRegisteredString name,
+ QT3DSU32 location, QT3DSI32 binding, QT3DSI32 size, QT3DSI32 count,
+ NVRenderAtomicCounterBuffer *pAcB,
+ NVFoundationBase &allocator)
+ : NVRenderShaderBufferBase(context, name, location, binding, size)
+ , m_Foundation(allocator)
+ , m_ParamCount(count)
+ , m_pAcB(pAcB)
+ {
+ }
+
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ void Release() override
+ {
+ if (m_pAcB)
+ m_pAcB->release();
+
+ NVDelete(GetFoundation().getAllocator(), this);
+ }
+
+ void Validate(NVRenderShaderProgram * /*inShader*/) override
+ {
+ // A constant buffer might not be set at first call
+ // due to the fact that they are compile from a cache file
+ // Now it must exists.
+ if (m_pAcB)
+ return;
+
+ NVRenderAtomicCounterBuffer *acb = m_Context.GetAtomicCounterBuffer(m_Name);
+ if (acb) {
+ acb->addRef();
+ m_pAcB = acb;
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void Update() override
+ {
+ if (m_pAcB)
+ m_pAcB->Update();
+ }
+
+ void BindToProgram(NVRenderShaderProgram * /*inShader*/) override
+ {
+ if (m_pAcB)
+ m_pAcB->BindToShaderProgram(m_Location);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderShaderProgram.cpp b/src/render/Qt3DSRenderShaderProgram.cpp
new file mode 100644
index 0000000..09f1094
--- /dev/null
+++ b/src/render/Qt3DSRenderShaderProgram.cpp
@@ -0,0 +1,1248 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "render/Qt3DSRenderVertexShader.h"
+#include "render/Qt3DSRenderFragmentShader.h"
+#include "render/Qt3DSRenderTessellationShader.h"
+#include "render/Qt3DSRenderGeometryShader.h"
+#include "render/Qt3DSRenderComputeShader.h"
+#include "render/Qt3DSRenderImageTexture.h"
+
+namespace qt3ds {
+namespace render {
+
+ template <typename TDataType>
+ struct ShaderConstantApplier
+ {
+ bool force_compile_error;
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSI32>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSI32 &inValue,
+ QT3DSI32 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSI32_2>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSI32_2 &inValue,
+ QT3DSI32_2 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue.x);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSI32_3>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSI32_3 &inValue,
+ QT3DSI32_3 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue.x);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSI32_4>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSI32_4 &inValue,
+ QT3DSI32_4 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue.x);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSRenderBool>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ const QT3DSRenderBool inValue, QT3DSRenderBool &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<bool_2>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const bool_2 &inValue,
+ bool_2 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<bool_3>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const bool_3 &inValue,
+ bool_3 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<bool_4>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const bool_4 &inValue,
+ bool_4 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSF32>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSF32 &inValue,
+ QT3DSF32 &oldValue)
+ {
+ if (count > 1 || !(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSVec2>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSVec2 &inValue,
+ QT3DSVec2 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSVec3>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSVec3 &inValue,
+ QT3DSVec3 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSVec4>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSVec4 &inValue,
+ QT3DSVec4 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSU32>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSU32 &inValue,
+ QT3DSU32 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSU32_2>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSU32_2 &inValue,
+ QT3DSU32_2 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue.x);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSU32_3>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSU32_3 &inValue,
+ QT3DSU32_3 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue.x);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSU32_4>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSU32_4 &inValue,
+ QT3DSU32_4 &oldValue)
+ {
+ if (!(inValue == oldValue)) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ &inValue.x);
+ oldValue = inValue;
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSMat33>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSMat33 inValue,
+ QT3DSMat33 &, bool inTranspose)
+ {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ inValue.front(), inTranspose);
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<QT3DSMat44>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type, const QT3DSMat44 inValue,
+ QT3DSMat44 &, bool inTranspose)
+ {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ inValue.front(), inTranspose);
+ }
+
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ NVConstDataRef<QT3DSMat44> inValue, QT3DSMat44 &, bool inTranspose)
+ {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type, count,
+ reinterpret_cast<const GLfloat *>(inValue.begin()),
+ inTranspose);
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<NVRenderTexture2DPtr>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ NVRenderTexture2DPtr inValue, QT3DSU32 &oldValue)
+ {
+ if (inValue) {
+ NVRenderTexture2D *texObj = reinterpret_cast<NVRenderTexture2D *>(inValue);
+ texObj->Bind();
+ QT3DSU32 texUnit = texObj->GetTextureUnit();
+ if (texUnit != oldValue) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type,
+ count, &texUnit);
+ oldValue = texUnit;
+ }
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<NVRenderTexture2DHandle>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend,
+ QT3DSI32 location, QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ NVRenderTexture2DHandle inValue, QVector<QT3DSU32> &oldValue)
+ {
+ Q_UNUSED(type)
+ if (inValue) {
+ bool update = false;
+ for (int i = 0; i < count; i++) {
+ NVRenderTexture2D *texObj = reinterpret_cast<NVRenderTexture2D *>(inValue[i]);
+ QT3DSU32 texUnit = QT3DS_MAX_U32;
+ if (texObj) {
+ texObj->Bind();
+ texUnit = texObj->GetTextureUnit();
+ }
+ if (texUnit != oldValue[i]) {
+ update = true;
+ oldValue[i] = texUnit;
+ }
+ }
+ if (update)
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location,
+ NVRenderShaderDataTypes::NVRenderTexture2DPtr,
+ count, oldValue.data());
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<NVRenderTexture2DArrayPtr>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ NVRenderTexture2DArrayPtr inValue, QT3DSU32 &oldValue)
+ {
+ if (inValue) {
+ NVRenderTexture2DArray *texObj =
+ reinterpret_cast<NVRenderTexture2DArray *>(inValue);
+ texObj->Bind();
+ QT3DSU32 texUnit = texObj->GetTextureUnit();
+ if (texUnit != oldValue) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type,
+ count, &texUnit);
+ oldValue = texUnit;
+ }
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<NVRenderTextureCubePtr>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ NVRenderTextureCubePtr inValue, QT3DSU32 &oldValue)
+ {
+ if (inValue) {
+ NVRenderTextureCube *texObj = reinterpret_cast<NVRenderTextureCube *>(inValue);
+ texObj->Bind();
+ QT3DSU32 texUnit = texObj->GetTextureUnit();
+ if (texUnit != oldValue) {
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type,
+ count, &texUnit);
+ oldValue = texUnit;
+ }
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<NVRenderTextureCubeHandle>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend,
+ QT3DSI32 location, QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ NVRenderTextureCubeHandle inValue, QVector<QT3DSU32> &oldValue)
+ {
+ Q_UNUSED(type)
+ if (inValue) {
+ bool update = false;
+ for (int i = 0; i < count; i++) {
+ NVRenderTextureCube *texObj = reinterpret_cast<NVRenderTextureCube *>(inValue[i]);
+ QT3DSU32 texUnit = QT3DS_MAX_U32;
+ if (texObj) {
+ texObj->Bind();
+ texUnit = texObj->GetTextureUnit();
+ }
+ if (texUnit != oldValue[i]) {
+ update = true;
+ oldValue[i] = texUnit;
+ }
+ }
+ if (update)
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location,
+ NVRenderShaderDataTypes::NVRenderTextureCubePtr,
+ count, oldValue.data());
+ }
+ }
+ };
+
+ template <>
+ struct ShaderConstantApplier<NVRenderImage2DPtr>
+ {
+ void ApplyConstant(NVRenderShaderProgram *program, NVRenderBackend *backend, QT3DSI32 location,
+ QT3DSI32 count, NVRenderShaderDataTypes::Enum type,
+ NVRenderImage2DPtr inValue, QT3DSU32 &oldValue, QT3DSI32 binding)
+ {
+ if (inValue) {
+ NVRenderImage2D *imgObj = reinterpret_cast<NVRenderImage2D *>(inValue);
+ imgObj->Bind(binding);
+ QT3DSU32 texUnit = imgObj->GetTextureUnit();
+ if (texUnit != oldValue) {
+ // on ES we need a explicit binding value
+ QT3DS_ASSERT(backend->GetRenderContextType() != NVRenderContextValues::GLES3PLUS
+ || binding != -1);
+ // this is not allowed on ES 3+ for image types
+ if (backend->GetRenderContextType() != NVRenderContextValues::GLES3PLUS)
+ backend->SetConstantValue(program->GetShaderProgramHandle(), location, type,
+ count, &texUnit);
+
+ oldValue = texUnit;
+ }
+ }
+ }
+ };
+
+ NVRenderShaderProgram::NVRenderShaderProgram(NVRenderContextImpl &context,
+ NVFoundationBase &fnd, const char *programName,
+ bool separableProgram)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_ProgramName(programName)
+ , m_ProgramHandle(NULL)
+ , m_Constants(context.GetFoundation().getAllocator(), "NVRenderShaderProgram::m_Constants")
+ , m_ShaderBuffers(context.GetFoundation().getAllocator(),
+ "NVRenderShaderProgram::m_ShaderBuffers")
+ , m_ProgramType(ProgramType::Graphics)
+ {
+ m_ProgramHandle = m_Backend->CreateShaderProgram(separableProgram);
+
+ QT3DS_ASSERT(m_ProgramHandle);
+ }
+
+ NVRenderShaderProgram::~NVRenderShaderProgram()
+ {
+ m_Context.ShaderDestroyed(*this);
+
+ if (m_ProgramHandle)
+ m_Backend->ReleaseShaderProgram(m_ProgramHandle);
+
+ for (TShaderConstantMap::iterator iter = m_Constants.begin(), end = m_Constants.end();
+ iter != end; ++iter) {
+ iter->second->Release();
+ }
+
+ m_Constants.clear();
+
+ for (TShaderBufferMap::iterator iter = m_ShaderBuffers.begin(), end = m_ShaderBuffers.end();
+ iter != end; ++iter) {
+ iter->second->Release();
+ }
+
+ m_ShaderBuffers.clear();
+
+ m_ProgramHandle = NULL;
+ }
+
+ template <typename TShaderObject>
+ void NVRenderShaderProgram::Attach(TShaderObject *pShader)
+ {
+ m_Backend->AttachShader(m_ProgramHandle, pShader->GetShaderHandle());
+ }
+
+ template <typename TShaderObject>
+ void NVRenderShaderProgram::Detach(TShaderObject *pShader)
+ {
+ m_Backend->DetachShader(m_ProgramHandle, pShader->GetShaderHandle());
+ }
+
+ static NVRenderShaderConstantBase *
+ ShaderConstantFactory(NVRenderBackend *backend, CRegisteredString inName,
+ NVFoundationBase &alloc, QT3DSI32 uniLoc, QT3DSI32 elementCount,
+ NVRenderShaderDataTypes::Enum inConstantType, QT3DSI32 binding)
+ {
+ switch (inConstantType) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(nv) \
+ case NVRenderShaderDataTypes::nv: \
+ return QT3DS_NEW(alloc.getAllocator(), NVRenderShaderConstant<nv>)( \
+ backend, inName, uniLoc, elementCount, inConstantType, binding, alloc);
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ template <typename TShaderBufferType, typename TBufferDataType>
+ static NVRenderShaderBufferBase *
+ ShaderBufferFactory(NVRenderContextImpl &context, CRegisteredString inName,
+ NVFoundationBase &alloc, QT3DSI32 cbLoc, QT3DSI32 cbBinding, QT3DSI32 cbSize,
+ QT3DSI32 cbCount, TBufferDataType *pBuffer)
+ {
+ return QT3DS_NEW(alloc.getAllocator(), TShaderBufferType)(context, inName, cbLoc, cbBinding,
+ cbSize, cbCount, pBuffer, alloc);
+ }
+
+ bool NVRenderShaderProgram::Link()
+ {
+ bool success = m_Backend->LinkProgram(m_ProgramHandle, m_ErrorMessage);
+
+ if (success) {
+ char nameBuf[512];
+ QT3DSI32 location, elementCount, binding;
+ NVRenderShaderDataTypes::Enum type;
+
+ QT3DSI32 constantCount = m_Backend->GetConstantCount(m_ProgramHandle);
+
+ QT3DS_FOREACH(idx, constantCount)
+ {
+ location = m_Backend->GetConstantInfoByID(m_ProgramHandle, idx, 512, &elementCount,
+ &type, &binding, nameBuf);
+
+ // sampler arrays have different type
+ if (type == NVRenderShaderDataTypes::NVRenderTexture2DPtr && elementCount > 1) {
+ type = NVRenderShaderDataTypes::NVRenderTexture2DHandle;
+ } else if (type == NVRenderShaderDataTypes::NVRenderTextureCubePtr
+ && elementCount > 1) {
+ type = NVRenderShaderDataTypes::NVRenderTextureCubeHandle;
+ }
+ if (location != -1) {
+ CRegisteredString theName(m_Context.GetStringTable().RegisterStr(nameBuf));
+ m_Constants.insert(eastl::make_pair(
+ theName,
+ ShaderConstantFactory(m_Backend, theName, m_Context.GetFoundation(),
+ location, elementCount, type, binding)));
+ }
+ }
+
+ // next query constant buffers info
+ QT3DSI32 length, bufferSize, paramCount;
+ QT3DSI32 constantBufferCount = m_Backend->GetConstantBufferCount(m_ProgramHandle);
+ QT3DS_FOREACH(idx, constantBufferCount)
+ {
+ location = m_Backend->GetConstantBufferInfoByID(
+ m_ProgramHandle, idx, 512, &paramCount, &bufferSize, &length, nameBuf);
+
+ if (location != -1) {
+ CRegisteredString theName(m_Context.GetStringTable().RegisterStr(nameBuf));
+
+ // find constant buffer in our DB
+ NVRenderConstantBuffer *cb = m_Context.GetConstantBuffer(theName);
+ if (cb) {
+ cb->SetupBuffer(this, location, bufferSize, paramCount);
+ cb->addRef();
+ }
+
+ m_ShaderBuffers.insert(eastl::make_pair(
+ theName,
+ ShaderBufferFactory<NVRenderShaderConstantBuffer, NVRenderConstantBuffer>(
+ m_Context, theName, m_Context.GetFoundation(), location, -1, bufferSize,
+ paramCount, cb)));
+ }
+ }
+
+ // next query storage buffers
+ QT3DSI32 storageBufferCount = m_Backend->GetStorageBufferCount(m_ProgramHandle);
+ QT3DS_FOREACH(idx, storageBufferCount)
+ {
+ location = m_Backend->GetStorageBufferInfoByID(
+ m_ProgramHandle, idx, 512, &paramCount, &bufferSize, &length, nameBuf);
+
+ if (location != -1) {
+ CRegisteredString theName(m_Context.GetStringTable().RegisterStr(nameBuf));
+
+ // find constant buffer in our DB
+ NVRenderStorageBuffer *sb = m_Context.GetStorageBuffer(theName);
+ if (sb) {
+ sb->addRef();
+ }
+
+ m_ShaderBuffers.insert(eastl::make_pair(
+ theName,
+ ShaderBufferFactory<NVRenderShaderStorageBuffer, NVRenderStorageBuffer>(
+ m_Context, theName, m_Context.GetFoundation(), location, -1, bufferSize,
+ paramCount, sb)));
+ }
+ }
+
+ // next query atomic counter buffers
+ QT3DSI32 atomicBufferCount = m_Backend->GetAtomicCounterBufferCount(m_ProgramHandle);
+ QT3DS_FOREACH(idx, atomicBufferCount)
+ {
+ location = m_Backend->GetAtomicCounterBufferInfoByID(
+ m_ProgramHandle, idx, 512, &paramCount, &bufferSize, &length, nameBuf);
+
+ if (location != -1) {
+ CRegisteredString theName(m_Context.GetStringTable().RegisterStr(nameBuf));
+
+ // find atomic counter buffer in our DB
+ // The buffer itself is not used in the program itself.
+ // Instead uniform variables are used but the interface to set the value is like
+ // for buffers.
+ // This is a bit insane but that is how it is.
+ // The theName variable contains the uniform name associated with an atomic
+ // counter buffer.
+ // We get the actual buffer name by searching for this uniform name
+ // See NVRenderTestAtomicCounterBuffer.cpp how the setup works
+ NVRenderAtomicCounterBuffer *acb =
+ m_Context.GetAtomicCounterBufferByParam(theName);
+ if (acb) {
+ acb->addRef();
+
+ m_ShaderBuffers.insert(eastl::make_pair(
+ acb->GetBufferName(),
+ ShaderBufferFactory<NVRenderShaderAtomicCounterBuffer,
+ NVRenderAtomicCounterBuffer>(
+ m_Context, acb->GetBufferName(), m_Context.GetFoundation(),
+ location, -1, bufferSize, paramCount, acb)));
+ }
+ }
+ }
+ }
+
+ return success;
+ }
+
+ void NVRenderShaderProgram::GetErrorMessage(QT3DSI32 *messageLength, const char *errorMessage)
+ {
+ *messageLength = m_ErrorMessage.size();
+ errorMessage = m_ErrorMessage.c_str();
+ }
+
+ const char *NVRenderShaderProgram::GetErrorMessage() { return m_ErrorMessage.c_str(); }
+
+ NVRenderShaderConstantBase *NVRenderShaderProgram::GetShaderConstant(const char *constantName)
+ {
+ TShaderConstantMap::iterator theIter =
+ m_Constants.find(m_Context.GetStringTable().RegisterStr(constantName));
+
+ if (theIter != m_Constants.end()) {
+ NVRenderShaderConstantBase *theConstant =
+ static_cast<NVRenderShaderConstantBase *>(theIter->second);
+ return theConstant;
+ }
+
+ return NULL;
+ }
+
+ NVRenderShaderBufferBase *NVRenderShaderProgram::GetShaderBuffer(const char *bufferName)
+ {
+ TShaderBufferMap::iterator theIter =
+ m_ShaderBuffers.find(m_Context.GetStringTable().RegisterStr(bufferName));
+
+ if (theIter != m_ShaderBuffers.end()) {
+ return theIter->second;
+ }
+
+ return NULL;
+ }
+
+ NVRenderContextImpl &NVRenderShaderProgram::GetRenderContext() { return m_Context; }
+
+ template <typename TDataType>
+ void SetConstantValueOfType(NVRenderShaderProgram *program,
+ NVRenderShaderConstantBase *inConstantBase,
+ const TDataType &inValue, const QT3DSI32 inCount)
+ {
+ if (inConstantBase == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ QT3DS_ASSERT(inConstantBase->m_ElementCount >= inCount);
+
+ if (inConstantBase->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType>::GetType()) {
+ NVRenderShaderConstant<TDataType> *inConstant =
+ static_cast<NVRenderShaderConstant<TDataType> *>(inConstantBase);
+ ShaderConstantApplier<TDataType>().ApplyConstant(
+ program, inConstant->m_Backend, inConstant->m_Location, inCount, inConstant->m_Type,
+ inValue, inConstant->m_Value);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ template <typename TDataType>
+ void SetSamplerConstantValueOfType(NVRenderShaderProgram *program,
+ NVRenderShaderConstantBase *inConstantBase,
+ const TDataType &inValue, const QT3DSI32 inCount)
+ {
+ if (inConstantBase == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ QT3DS_ASSERT(inConstantBase->m_ElementCount >= inCount);
+
+ if (inConstantBase->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType>::GetType()) {
+ NVRenderShaderConstant<TDataType> *inConstant =
+ static_cast<NVRenderShaderConstant<TDataType> *>(inConstantBase);
+ ShaderConstantApplier<TDataType>().ApplyConstant(
+ program, inConstant->m_Backend, inConstant->m_Location, inCount, inConstant->m_Type,
+ inValue, inConstant->m_Value, inConstant->m_Binding);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ template <typename TDataType>
+ void SetMatrixConstantValueOfType(NVRenderShaderProgram *program,
+ NVRenderShaderConstantBase *inConstantBase,
+ const TDataType &inValue, const QT3DSI32 inCount,
+ bool inTranspose)
+ {
+ if (inConstantBase == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ QT3DS_ASSERT(inConstantBase->m_ElementCount >= inCount);
+
+ if (inConstantBase->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType>::GetType()) {
+ NVRenderShaderConstant<TDataType> *inConstant =
+ static_cast<NVRenderShaderConstant<TDataType> *>(inConstantBase);
+ ShaderConstantApplier<TDataType>().ApplyConstant(
+ program, inConstant->m_Backend, inConstant->m_Location, inCount, inConstant->m_Type,
+ inValue, inConstant->m_Value, inTranspose);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ template <typename TDataType>
+ void SetMatrixConstantValueOfType(NVRenderShaderProgram *program,
+ NVRenderShaderConstantBase *inConstantBase,
+ const NVConstDataRef<TDataType> inValue,
+ const QT3DSI32 /*inCount*/, bool inTranspose)
+ {
+ if (inConstantBase == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ QT3DS_ASSERT(inConstantBase->m_ElementCount >= (QT3DSI32)inValue.size());
+
+ if (inConstantBase->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType>::GetType()) {
+ NVRenderShaderConstant<TDataType> *inConstant =
+ static_cast<NVRenderShaderConstant<TDataType> *>(inConstantBase);
+ ShaderConstantApplier<TDataType>().ApplyConstant(
+ program, inConstant->m_Backend, inConstant->m_Location, inValue.size(),
+ inConstant->m_Type, inValue, inConstant->m_Value, inTranspose);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ QT3DSI32 inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSI32_2 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSI32_3 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSI32_4 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ QT3DSRenderBool inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const bool_2 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const bool_3 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const bool_4 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSF32 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSVec2 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSVec3 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSVec4 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSU32 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSU32_2 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSU32_3 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSU32_4 &inValue, const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSMat33 &inValue, const QT3DSI32 inCount,
+ bool inTranspose)
+ {
+ SetMatrixConstantValueOfType(this, inConstant, inValue, inCount, inTranspose);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const QT3DSMat44 &inValue, const QT3DSI32 inCount,
+ bool inTranspose)
+ {
+ SetMatrixConstantValueOfType(this, inConstant, inValue, inCount, inTranspose);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const NVConstDataRef<QT3DSMat44> inValue,
+ const QT3DSI32 inCount)
+ {
+ SetMatrixConstantValueOfType(this, inConstant, inValue, inCount, false);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ NVRenderTexture2D *inValue, const QT3DSI32 inCount)
+ {
+ Q_UNUSED(inCount)
+ SetConstantValueOfType(this, inConstant, inValue, 1);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ NVRenderTexture2D **inValue,
+ const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ NVRenderTexture2DArray *inValue,
+ const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ NVRenderTextureCube *inValue, const QT3DSI32 inCount)
+ {
+ Q_UNUSED(inCount)
+ SetConstantValueOfType(this, inConstant, inValue, 1);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ NVRenderTextureCube **inValue,
+ const QT3DSI32 inCount)
+ {
+ SetConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ NVRenderImage2D *inValue, const QT3DSI32 inCount)
+ {
+ SetSamplerConstantValueOfType(this, inConstant, inValue, inCount);
+ }
+ void NVRenderShaderProgram::SetConstantValue(NVRenderShaderConstantBase *, NVRenderDataBuffer *,
+ const QT3DSI32)
+ {
+ // this is merely a dummy right now
+ }
+
+ void NVRenderShaderProgram::BindComputeInput(NVRenderDataBuffer *inBuffer, QT3DSU32 inIndex)
+ {
+ NVRenderBackend::NVRenderBackendBufferObject obj(NULL);
+ if (inBuffer)
+ obj = inBuffer->GetBuffertHandle();
+ m_Backend->ProgramSetStorageBuffer(inIndex, obj);
+ }
+
+ namespace {
+ void WriteErrorMessage(NVFoundationBase &fnd, const char *tag, const char *message)
+ {
+ Q_UNUSED(fnd)
+ eastl::string messageData(nonNull(message));
+ eastl::vector<eastl::string> lines;
+ for (eastl::string::size_type pos = messageData.find('\n'); pos != eastl::string::npos;
+ pos = messageData.find('\n')) {
+ eastl::string line = messageData.substr(0, pos);
+ messageData.erase(messageData.begin(), messageData.begin() + pos + 1);
+ if (line.size())
+ qCCritical(INVALID_OPERATION, "%s: %s", tag, line.c_str());
+ }
+ }
+ }
+
+ Option<NVRenderVertexShader *> NVRenderShaderProgram::createVertexShader(
+ NVRenderContextImpl &context, NVConstDataRef<QT3DSI8> vertexShaderSource, bool binaryProgram)
+ {
+ if (vertexShaderSource.size() == 0)
+ return Empty();
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderVertexShader(context, context.GetFoundation(), vertexShaderSource,
+ binaryProgram));
+ }
+
+ Option<NVRenderFragmentShader *> NVRenderShaderProgram::createFragmentShader(
+ NVRenderContextImpl &context, NVConstDataRef<QT3DSI8> fragmentShaderSource, bool binaryProgram)
+ {
+ if (fragmentShaderSource.size() == 0)
+ return Empty();
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderFragmentShader(context, context.GetFoundation(), fragmentShaderSource,
+ binaryProgram));
+ }
+
+ Option<NVRenderTessControlShader *>
+ NVRenderShaderProgram::createTessControlShader(NVRenderContextImpl &context,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource,
+ bool binaryProgram)
+ {
+ if (tessControlShaderSource.size() == 0)
+ return Empty();
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderTessControlShader(context, context.GetFoundation(),
+ tessControlShaderSource, binaryProgram));
+ }
+
+ Option<NVRenderTessEvaluationShader *>
+ NVRenderShaderProgram::createTessEvaluationShader(NVRenderContextImpl &context,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource,
+ bool binaryProgram)
+ {
+ if (tessControlShaderSource.size() == 0)
+ return Empty();
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderTessEvaluationShader(context, context.GetFoundation(),
+ tessControlShaderSource, binaryProgram));
+ }
+
+ Option<NVRenderGeometryShader *> NVRenderShaderProgram::createGeometryShader(
+ NVRenderContextImpl &context, NVConstDataRef<QT3DSI8> geometryShaderSource, bool binaryProgram)
+ {
+ if (geometryShaderSource.size() == 0)
+ return Empty();
+
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderGeometryShader(context, context.GetFoundation(), geometryShaderSource,
+ binaryProgram));
+ }
+
+ NVRenderVertFragCompilationResult NVRenderShaderProgram::Create(
+ NVRenderContextImpl &context, const char *programName,
+ NVConstDataRef<QT3DSI8> vertShaderSource, NVConstDataRef<QT3DSI8> fragShaderSource,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource,
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource, NVConstDataRef<QT3DSI8> geometryShaderSource,
+ bool separateProgram, NVRenderShaderProgramBinaryType::Enum type, bool binaryProgram)
+ {
+ NVRenderVertFragCompilationResult result;
+ NVRenderShaderProgram *pProgram = NULL;
+ bool bProgramIsValid = false;
+
+ result.mShaderName = programName;
+
+ // our minimum requirement is a vertex and a fragment shader or geometry shader
+ // if we should treat it as a separate program we don't care
+ if (!separateProgram
+ && (vertShaderSource.size() == 0
+ || (fragShaderSource.size() == 0 && geometryShaderSource.size() == 0))) {
+ qCCritical(INVALID_PARAMETER,
+ "Vertex or fragment (geometry) source have 0 length");
+ QT3DS_ASSERT(false);
+ return result;
+ }
+
+ if (binaryProgram && type != NVRenderShaderProgramBinaryType::NVBinary) {
+ qCCritical(INVALID_PARAMETER, "Unrecoginzed binary format");
+ QT3DS_ASSERT(false);
+ return result;
+ }
+
+ // first create and compile shader
+ Option<NVRenderVertexShader *> vtxShader =
+ createVertexShader(context, vertShaderSource, binaryProgram);
+ Option<NVRenderFragmentShader *> fragShader =
+ createFragmentShader(context, fragShaderSource, binaryProgram);
+ Option<NVRenderTessControlShader *> tcShader =
+ createTessControlShader(context, tessControlShaderSource, binaryProgram);
+ Option<NVRenderTessEvaluationShader *> teShader =
+ createTessEvaluationShader(context, tessEvaluationShaderSource, binaryProgram);
+ Option<NVRenderGeometryShader *> geShader =
+ createGeometryShader(context, geometryShaderSource, binaryProgram);
+
+ bool vertexValid = (vtxShader.hasValue()) ? vtxShader.getValue()->IsValid() : true;
+ bool fragValid = (fragShader.hasValue()) ? fragShader.getValue()->IsValid() : true;
+ bool tcValid = (tcShader.hasValue()) ? tcShader.getValue()->IsValid() : true;
+ bool teValid = (teShader.hasValue()) ? teShader.getValue()->IsValid() : true;
+ bool geValid = (geShader.hasValue()) ? geShader.getValue()->IsValid() : true;
+
+ if (vertexValid && fragValid && tcValid && teValid && geValid) {
+ // shaders were succesfuly created
+ pProgram = QT3DS_NEW(context.GetFoundation().getAllocator(), NVRenderShaderProgram)(
+ context, context.GetFoundation(), programName, separateProgram);
+
+ if (pProgram) {
+ // attach programs
+ if (vtxShader.hasValue() && vtxShader.getValue()->IsValid())
+ pProgram->Attach(vtxShader.getValue());
+ if (fragShader.hasValue() && fragShader.getValue()->IsValid())
+ pProgram->Attach(fragShader.getValue());
+ if (tcShader.hasValue() && tcShader.getValue()->IsValid())
+ pProgram->Attach(tcShader.getValue());
+ if (teShader.hasValue() && teShader.getValue()->IsValid())
+ pProgram->Attach(teShader.getValue());
+ if (geShader.hasValue() && geShader.getValue()->IsValid())
+ pProgram->Attach(geShader.getValue());
+
+ // link program
+ bProgramIsValid = pProgram->Link();
+ }
+ }
+
+ // if anything went wrong print out
+ if (!vertexValid || !fragValid || !tcValid || !teValid || !geValid || !bProgramIsValid) {
+ NVFoundationBase &foundation(context.GetFoundation());
+
+ if (!vertexValid) {
+ qCCritical(INTERNAL_ERROR, "Failed to generate vertex shader!!");
+ qCCritical(INTERNAL_ERROR, "Vertex source:\n%s",
+ nonNull((const char *)vertShaderSource.begin()));
+ WriteErrorMessage(foundation, "Vertex compilation output:",
+ vtxShader.getValue()->GetErrorMessage());
+ }
+
+ if (!fragValid) {
+ qCCritical(INTERNAL_ERROR, "Failed to generate fragment shader!!");
+ qCCritical(INTERNAL_ERROR, "Fragment source:\n%s",
+ nonNull((const char *)fragShaderSource.begin()));
+ WriteErrorMessage(foundation, "Fragment compilation output:",
+ fragShader.getValue()->GetErrorMessage());
+ }
+
+ if (!tcValid) {
+ qCCritical(INTERNAL_ERROR,
+ "Failed to generate tessellation control shader!!");
+ qCCritical(INTERNAL_ERROR, "Tessellation control source:\n%s",
+ nonNull((const char *)tessControlShaderSource.begin()));
+ WriteErrorMessage(foundation, "Tessellation control compilation output:",
+ tcShader.getValue()->GetErrorMessage());
+ }
+
+ if (!teValid) {
+ qCCritical(INTERNAL_ERROR,
+ "Failed to generate tessellation evaluation shader!!");
+ qCCritical(INTERNAL_ERROR, "Tessellation evaluation source:\n%s",
+ nonNull((const char *)tessEvaluationShaderSource.begin()));
+ WriteErrorMessage(foundation, "Tessellation evaluation compilation output:",
+ teShader.getValue()->GetErrorMessage());
+ }
+
+ if (!geValid) {
+ qCCritical(INTERNAL_ERROR, "Failed to generate geometry shader!!");
+ qCCritical(INTERNAL_ERROR, "Geometry source:\n%s",
+ nonNull((const char *)geometryShaderSource.begin()));
+ WriteErrorMessage(foundation, "Geometry compilation output:",
+ geShader.getValue()->GetErrorMessage());
+ }
+
+ if (!bProgramIsValid && pProgram) {
+ qCCritical(INTERNAL_ERROR, "Failed to link program!!");
+ WriteErrorMessage(foundation, "Program link output:", pProgram->GetErrorMessage());
+
+ // delete program
+ QT3DS_FREE(context.GetFoundation().getAllocator(), pProgram);
+ pProgram = NULL;
+ }
+ }
+
+ // clean up
+ if (vtxShader.hasValue()) {
+ if (bProgramIsValid && vtxShader.getValue()->IsValid())
+ pProgram->Detach(vtxShader.getValue());
+ QT3DS_FREE(context.GetFoundation().getAllocator(), vtxShader.getValue());
+ }
+ if (fragShader.hasValue()) {
+ if (bProgramIsValid && fragShader.getValue()->IsValid())
+ pProgram->Detach(fragShader.getValue());
+ QT3DS_FREE(context.GetFoundation().getAllocator(), fragShader.getValue());
+ }
+ if (tcShader.hasValue()) {
+ if (bProgramIsValid && tcShader.getValue()->IsValid())
+ pProgram->Detach(tcShader.getValue());
+ QT3DS_FREE(context.GetFoundation().getAllocator(), tcShader.getValue());
+ }
+ if (teShader.hasValue()) {
+ if (bProgramIsValid && teShader.getValue()->IsValid())
+ pProgram->Detach(teShader.getValue());
+ QT3DS_FREE(context.GetFoundation().getAllocator(), teShader.getValue());
+ }
+ if (geShader.hasValue()) {
+ if (bProgramIsValid && geShader.getValue()->IsValid())
+ pProgram->Detach(geShader.getValue());
+ QT3DS_FREE(context.GetFoundation().getAllocator(), geShader.getValue());
+ }
+
+ // set program
+ result.mShader = pProgram;
+
+ return result;
+ }
+
+ NVRenderVertFragCompilationResult
+ NVRenderShaderProgram::CreateCompute(NVRenderContextImpl &context, const char *programName,
+ NVConstDataRef<QT3DSI8> computeShaderSource)
+ {
+ NVRenderVertFragCompilationResult result;
+ NVRenderShaderProgram *pProgram = NULL;
+ bool bProgramIsValid = true;
+
+ result.mShaderName = programName;
+
+ // check source
+ if (computeShaderSource.size() == 0) {
+ qCCritical(INVALID_PARAMETER, "compute source has 0 length");
+ QT3DS_ASSERT(false);
+ return result;
+ }
+
+ NVRenderComputeShader computeShader(context, context.GetFoundation(), computeShaderSource,
+ false);
+
+ if (computeShader.IsValid()) {
+ // shaders were succesfuly created
+ pProgram = QT3DS_NEW(context.GetFoundation().getAllocator(), NVRenderShaderProgram)(
+ context, context.GetFoundation(), programName, false);
+
+ if (pProgram) {
+ // attach programs
+ pProgram->Attach(&computeShader);
+
+ // link program
+ bProgramIsValid = pProgram->Link();
+
+ // set program type
+ pProgram->SetProgramType(ProgramType::Compute);
+ }
+ }
+
+ // if anything went wrong print out
+ if (!computeShader.IsValid() || !bProgramIsValid) {
+ NVFoundationBase &foundation(context.GetFoundation());
+
+ if (!computeShader.IsValid()) {
+ qCCritical(INTERNAL_ERROR, "Failed to generate compute shader!!");
+ qCCritical(INTERNAL_ERROR, "Vertex source:\n%s",
+ nonNull((const char *)computeShaderSource.begin()));
+ WriteErrorMessage(foundation, "Compute shader compilation output:",
+ computeShader.GetErrorMessage());
+ }
+ }
+
+ // set program
+ result.mShader = pProgram;
+
+ return result;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderShaderProgram.h b/src/render/Qt3DSRenderShaderProgram.h
new file mode 100644
index 0000000..054db64
--- /dev/null
+++ b/src/render/Qt3DSRenderShaderProgram.h
@@ -0,0 +1,540 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_PROGRAM_H
+#define QT3DS_RENDER_SHADER_PROGRAM_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderShaderConstant.h"
+#include "EASTL/string.h"
+#include "EASTL/utility.h"
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ ///< forward declarations
+ class NVRenderContextImpl;
+ class NVRenderVertexShader;
+ class NVRenderFragmentShader;
+ class NVRenderTessControlShader;
+ class NVRenderTessEvaluationShader;
+ class NVRenderGeometryShader;
+ class NVRenderShaderConstantBase;
+ class NVRenderShaderBufferBase;
+ class NVRenderComputeShader;
+
+ typedef nvhash_map<CRegisteredString, NVRenderShaderConstantBase *> TShaderConstantMap;
+ typedef nvhash_map<CRegisteredString, NVRenderShaderBufferBase *> TShaderBufferMap;
+
+ ///< A shader program is an object composed of a multiple shaders (vertex, fragment,
+ ///geometry,....)
+ class QT3DS_AUTOTEST_EXPORT NVRenderShaderProgram : public NVRefCounted
+ {
+ public:
+ struct ProgramType
+ {
+ enum Enum { Graphics, Compute };
+ };
+
+ private:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ const char *m_ProgramName; /// Name of the program
+ NVRenderBackend::NVRenderBackendShaderProgramObject
+ m_ProgramHandle; ///< opaque backend handle
+ TShaderConstantMap m_Constants; ///< map of shader constants
+ TShaderBufferMap m_ShaderBuffers; ///< map of shader buffers
+ ProgramType::Enum m_ProgramType; ///< shader type
+ eastl::string m_ErrorMessage; ///< contains the error message if linking fails
+
+ /**
+ * @brief create vertex shader
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] vertexShaderSource Fragment shader source code
+ * @param[in] binaryProgram True if binary program
+ *
+ * @return pointer to vertex shader object
+ */
+ static Option<NVRenderVertexShader *>
+ createVertexShader(NVRenderContextImpl &context, NVConstDataRef<QT3DSI8> vertexShaderSource,
+ bool binaryProgram = false);
+
+ /**
+ * @brief create fragment shader
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fragmentShaderSource Fragment shader source code
+ * @param[in] binaryProgram True if binary program
+ *
+ * @return pointer to fragment shader object
+ */
+ static Option<NVRenderFragmentShader *>
+ createFragmentShader(NVRenderContextImpl &context,
+ NVConstDataRef<QT3DSI8> fragmentShaderSource, bool binaryProgram = false);
+
+ /**
+ * @brief create tesselation control shader
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] tessControlShaderSource Tessellation control shader source code
+ * @param[in] binaryProgram True if binary program
+ *
+ * @return pointer to tessellation control shader
+ */
+ static Option<NVRenderTessControlShader *>
+ createTessControlShader(NVRenderContextImpl &context,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource,
+ bool binaryProgram = false);
+
+ /**
+ * @brief create tesselation evaluation shader
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] tessEvaluationShaderSource Tessellation evaluation shader source code
+ * @param[in] binaryProgram True if binary program
+ *
+ * @return pointer to tessellation evaluation shader
+ */
+ static Option<NVRenderTessEvaluationShader *>
+ createTessEvaluationShader(NVRenderContextImpl &context,
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource,
+ bool binaryProgram = false);
+
+ /**
+ * @brief create geometry shader
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] geometryShaderSource Geometry shader source code
+ * @param[in] binaryProgram True if binary program
+ *
+ * @return pointer to geometry shader
+ */
+ static Option<NVRenderGeometryShader *>
+ createGeometryShader(NVRenderContextImpl &context,
+ NVConstDataRef<QT3DSI8> geometryShaderSource, bool binaryProgram = false);
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] programName Pointer to string of program name
+ * @param[in] separableProgram True if this is a separable program
+ *
+ * @return No return.
+ */
+ NVRenderShaderProgram(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ const char *programName, bool separableProgram);
+
+ /// destructor
+ ~NVRenderShaderProgram();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief attach a shader to the program
+ *
+ * @param[in] pShader Pointer to shader object
+ *
+ * @return No return.
+ */
+ template <typename TShaderObject>
+ void Attach(TShaderObject *pShader);
+
+ /**
+ * @brief detach a shader from the program
+ *
+ * @param[in] pShader Pointer to shader object
+ *
+ * @return No return.
+ */
+ template <typename TShaderObject>
+ void Detach(TShaderObject *pShader);
+
+ /**
+ * @brief link a program
+ *
+ *
+ * @return true if succesfuly linked.
+ */
+ bool Link();
+
+ /**
+ * @brief set a shader type
+ *
+ * @param[in] type shader type ( graphics or compute )
+ *
+ * @return No return.
+ */
+ void SetProgramType(ProgramType::Enum type) { m_ProgramType = type; }
+ ProgramType::Enum GetProgramType() const { return m_ProgramType; }
+
+ /**
+ * @brief Get Error Message
+ *
+ * @param[out] messageLength Pointer to error string
+ * @param[out] messageLength Size of error meesage
+ *
+ * @return no return.
+ */
+ void GetErrorMessage(QT3DSI32 *messageLength, const char *errorMessage);
+
+ /**
+ * @brief Get Error Message
+ *
+ *
+ * @return error message.
+ */
+ const char *GetErrorMessage();
+
+ /**
+ * @brief Query constant class
+ *
+ * @param[in] constantName Pointer to constant name
+ *
+ * @return return a pointer to a constant class.
+ */
+ NVRenderShaderConstantBase *GetShaderConstant(const char *constantName);
+
+ /**
+ * @brief Query a shader buffer (constant, ... )
+ *
+ * @param[in] bufferName Pointer to constant name
+ *
+ * @return return a pointer to a constant class.
+ */
+ NVRenderShaderBufferBase *GetShaderBuffer(const char *bufferName);
+
+ // concrete set functions
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, QT3DSI32 inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSI32_2 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSI32_3 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSI32_4 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, QT3DSRenderBool inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const bool_2 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const bool_3 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const bool_4 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSF32 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSVec2 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSVec3 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSVec4 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSU32 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSU32_2 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSU32_3 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSU32_4 &inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSMat33 &inValue,
+ const QT3DSI32 inCount, bool inTranspose = false);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, const QT3DSMat44 &inValue,
+ const QT3DSI32 inCount, bool inTranspose = false);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ const NVConstDataRef<QT3DSMat44> inValue, const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, NVRenderTexture2D *inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, NVRenderTexture2D **inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant,
+ NVRenderTexture2DArray *inValue, const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, NVRenderTextureCube *inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, NVRenderTextureCube **inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, NVRenderImage2D *inValue,
+ const QT3DSI32 inCount);
+ void SetConstantValue(NVRenderShaderConstantBase *inConstant, NVRenderDataBuffer *inValue,
+ const QT3DSI32 inCount);
+
+ /**
+ * @brief Template to set constant value via name
+ *
+ * @param[in] inConstantName Pointer to constant name
+ * @param[in] inValue Pointer to data
+ * @param[in] inCount Number of elements (array count)
+ *
+ * @return return a pointer to a constant class.
+ */
+ template <typename TDataType>
+ void SetPropertyValue(const char *inConstantName, const TDataType &inValue,
+ const QT3DSI32 inCount = 1)
+ {
+ NVRenderShaderConstantBase *theConstant = GetShaderConstant(inConstantName);
+
+ if (theConstant) {
+ if (theConstant->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType>::GetType()) {
+ SetConstantValue(theConstant, inValue, inCount);
+ } else {
+ // Types don't match or property not found
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ /**
+ * @brief Template to set constant value shader constant object
+ *
+ * @param[in] inConstant Pointer shader constant object
+ * @param[in] inValue Pointer to data
+ * @param[in] inCount Number of elements (array count)
+ *
+ * @return return a pointer to a constant class.
+ */
+ template <typename TDataType>
+ void SetPropertyValue(NVRenderShaderConstantBase *inConstant, const TDataType &inValue,
+ const QT3DSI32 inCount = 1)
+ {
+ if (inConstant) {
+ if (inConstant->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType>::GetType()) {
+ SetConstantValue(inConstant, inValue, inCount);
+ } else {
+ // Types don't match or property not found
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ virtual void BindComputeInput(NVRenderDataBuffer *inBuffer, QT3DSU32 inIndex);
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendShaderProgramObject GetShaderProgramHandle() const
+ {
+ return m_ProgramHandle;
+ }
+
+ /**
+ * @brief get the context object
+ *
+ * @return context which this shader belongs to.
+ */
+ NVRenderContextImpl &GetRenderContext();
+
+ /**
+ * @brief Create a shader program
+ *
+ * @param[in] context Pointer to context
+ * @param[in] programName Name of the program
+ * @param[in] vertShaderSource Vertex shader source code
+ * @param[in] fragShaderSource Fragment shader source code
+ * @param[in] tessControlShaderSource tessellation control shader source code
+ * @param[in] tessEvaluationShaderSource tessellation evaluation shader source code
+ * @param[in] separateProgram True if this will we a separate
+ * program
+ * @param[in] type Binary program type
+ * @param[in] binaryProgram True if program is binary
+ *
+ * @return a render result
+ */
+ static NVRenderVertFragCompilationResult Create(
+ NVRenderContextImpl &context, const char *programName,
+ NVConstDataRef<QT3DSI8> vertShaderSource, NVConstDataRef<QT3DSI8> fragShaderSource,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>(),
+ bool separateProgram = false,
+ NVRenderShaderProgramBinaryType::Enum type = NVRenderShaderProgramBinaryType::Unknown,
+ bool binaryProgram = false);
+
+ /**
+ * @brief Create a compute shader program
+ *
+ * @param[in] context Pointer to context
+ * @param[in] programName Name of the program
+ * @param[in] computeShaderSource Compute shader source code
+ *
+ * @return a render result
+ */
+ static NVRenderVertFragCompilationResult
+ CreateCompute(NVRenderContextImpl &context, const char *programName,
+ NVConstDataRef<QT3DSI8> computeShaderSource);
+ };
+
+ // Helper class to cache the lookup of shader properties and apply them quickly in a typesafe
+ // way.
+ template <typename TDataType>
+ struct NVRenderCachedShaderProperty
+ {
+ NVRenderShaderProgram *m_Shader; ///< pointer to shader program
+ NVRenderShaderConstantBase *m_Constant; ///< poiner to shader constant object
+
+ NVRenderCachedShaderProperty(const QString &inConstantName, NVRenderShaderProgram &inShader)
+ : NVRenderCachedShaderProperty(qPrintable(inConstantName), inShader)
+ {
+ }
+
+ NVRenderCachedShaderProperty(const char *inConstantName, NVRenderShaderProgram &inShader)
+ : m_Shader(&inShader)
+ , m_Constant(NULL)
+ {
+ NVRenderShaderConstantBase *theConstant = inShader.GetShaderConstant(inConstantName);
+ if (theConstant) {
+ if (theConstant->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType>::GetType()) {
+ m_Constant = theConstant;
+ } else {
+ // Property types do not match, this probably indicates that the shader changed
+ // while the
+ // code creating this object did not change.
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ NVRenderCachedShaderProperty()
+ : m_Shader(NULL)
+ , m_Constant(NULL)
+ {
+ }
+
+ void Set(const TDataType &inValue)
+ {
+ if (m_Constant)
+ m_Shader->SetPropertyValue(m_Constant, inValue);
+ }
+
+ bool IsValid() const { return m_Constant != 0; }
+ };
+
+ template <typename TDataType, int size>
+ struct NVRenderCachedShaderPropertyArray
+ {
+ NVRenderShaderProgram *m_Shader; ///< pointer to shader program
+ NVRenderShaderConstantBase *m_Constant; ///< poiner to shader constant object
+ TDataType m_array[size];
+
+ NVRenderCachedShaderPropertyArray(const QString &inConstantName,
+ NVRenderShaderProgram &inShader)
+ : NVRenderCachedShaderPropertyArray(qPrintable(inConstantName), inShader)
+ {
+
+ }
+
+ NVRenderCachedShaderPropertyArray(const char *inConstantName,
+ NVRenderShaderProgram &inShader)
+ : m_Shader(&inShader)
+ , m_Constant(nullptr)
+ {
+ memset(m_array, 0, sizeof(m_array));
+ NVRenderShaderConstantBase *theConstant = inShader.GetShaderConstant(inConstantName);
+ if (theConstant) {
+ if (theConstant->m_ElementCount > 1 && theConstant->m_ElementCount <= size &&
+ theConstant->GetShaderConstantType()
+ == NVDataTypeToShaderDataTypeMap<TDataType*>::GetType()) {
+ m_Constant = theConstant;
+ } else {
+ // Property types do not match, this probably indicates that the shader changed
+ // while the code creating this object did not change.
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ NVRenderCachedShaderPropertyArray()
+ : m_Shader(nullptr)
+ , m_Constant(nullptr)
+ {
+ memset(m_array, 0, sizeof(m_array));
+ }
+
+ void Set(int count)
+ {
+ if (m_Constant)
+ m_Shader->SetPropertyValue(m_Constant, (TDataType*)m_array, qMin(size, count));
+ }
+
+ bool IsValid() const { return m_Constant != 0; }
+ };
+
+ // Helper class to cache the lookup of shader properties and apply them quickly in a typesafe
+ // way.
+ template <typename TDataType>
+ struct NVRenderCachedShaderBuffer
+ {
+ NVRenderShaderProgram *m_Shader; ///< pointer to shader program
+ TDataType m_ShaderBuffer; ///< poiner to shader buffer object
+
+ NVRenderCachedShaderBuffer(const char *inShaderBufferName, NVRenderShaderProgram &inShader)
+ : m_Shader(&inShader)
+ , m_ShaderBuffer(NULL)
+ {
+ TDataType theShaderBuffer =
+ static_cast<TDataType>(inShader.GetShaderBuffer(inShaderBufferName));
+ if (theShaderBuffer) {
+ m_ShaderBuffer = theShaderBuffer;
+ }
+ }
+ NVRenderCachedShaderBuffer()
+ : m_Shader(NULL)
+ , m_ShaderBuffer(NULL)
+ {
+ }
+
+ void Set()
+ {
+ if (m_ShaderBuffer) {
+ m_ShaderBuffer->Validate(m_Shader);
+ m_ShaderBuffer->Update();
+ m_ShaderBuffer->BindToProgram(m_Shader);
+ }
+ }
+
+ bool IsValid() const { return m_ShaderBuffer != 0; }
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderStorageBuffer.cpp b/src/render/Qt3DSRenderStorageBuffer.cpp
new file mode 100644
index 0000000..ab63218
--- /dev/null
+++ b/src/render/Qt3DSRenderStorageBuffer.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderStorageBuffer.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderStorageBuffer::NVRenderStorageBuffer(NVRenderContextImpl &context,
+ CRegisteredString bufferName, size_t size,
+ NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data, NVRenderDataBuffer *pBuffer)
+ : NVRenderDataBuffer(context, context.GetFoundation(), size,
+ NVRenderBufferBindValues::Storage, usageType, data)
+ , m_Name(bufferName)
+ , m_WrappedBuffer(pBuffer)
+ , m_Dirty(true)
+ {
+ QT3DS_ASSERT(context.IsStorageBufferSupported());
+
+ if (pBuffer)
+ pBuffer->addRef();
+ }
+
+ NVRenderStorageBuffer::~NVRenderStorageBuffer()
+ {
+ if (m_WrappedBuffer)
+ m_WrappedBuffer->release();
+
+ m_Context.BufferDestroyed(*this);
+ }
+
+ void NVRenderStorageBuffer::Bind()
+ {
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to Bind a locked buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ if (m_WrappedBuffer)
+ m_WrappedBuffer->Bind();
+ else
+ m_Backend->BindBuffer(m_BufferHandle, m_BindFlags);
+ }
+
+ void NVRenderStorageBuffer::BindToShaderProgram(QT3DSU32 index)
+ {
+ m_Backend->ProgramSetStorageBuffer(
+ index, (m_WrappedBuffer) ? m_WrappedBuffer->GetBuffertHandle() : m_BufferHandle);
+ }
+
+ void NVRenderStorageBuffer::Update()
+ {
+ // we only update the buffer if it is dirty and we actually have some data
+ if (m_Dirty && m_BufferData.size()) {
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, m_BufferData.size(), m_UsageType,
+ m_BufferData.begin());
+ m_Dirty = false;
+ }
+ }
+
+ void NVRenderStorageBuffer::UpdateData(QT3DSI32 offset, NVDataRef<QT3DSU8> data)
+ {
+ // we only update the buffer if it is not just a wrapper
+ if (!m_WrappedBuffer)
+ m_Backend->UpdateBuffer(m_BufferHandle, m_BindFlags, data.size(), m_UsageType,
+ data.begin() + offset);
+ }
+
+ NVRenderStorageBuffer *
+ NVRenderStorageBuffer::Create(NVRenderContextImpl &context, const char *bufferName,
+ NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData, NVRenderDataBuffer *pBuffer)
+ {
+ NVFoundationBase &fnd(context.GetFoundation());
+ NVRenderStorageBuffer *retval = NULL;
+
+ if (context.IsStorageBufferSupported()) {
+ CRegisteredString theBufferName(context.GetStringTable().RegisterStr(bufferName));
+ QT3DSU32 cbufSize = sizeof(NVRenderStorageBuffer);
+ QT3DSU8 *newMem = (QT3DSU8 *)QT3DS_ALLOC(fnd.getAllocator(), cbufSize, "StorageBuffer");
+ retval = new (newMem) NVRenderStorageBuffer(
+ context, theBufferName, size, usageType,
+ toDataRef(const_cast<QT3DSU8 *>(bufferData.begin()), bufferData.size()), pBuffer);
+ } else {
+ QString errorMsg = QObject::tr("Shader storage buffers are not supported: %1")
+ .arg(bufferName);
+ qCCritical(INVALID_OPERATION) << errorMsg;
+ QT3DS_ALWAYS_ASSERT_MESSAGE(errorMsg.toUtf8());
+ }
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderStorageBuffer.h b/src/render/Qt3DSRenderStorageBuffer.h
new file mode 100644
index 0000000..fefe6b0
--- /dev/null
+++ b/src/render/Qt3DSRenderStorageBuffer.h
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_STORAGE_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_STORAGE_BUFFER_H
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Utils.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderDataBuffer.h"
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ // forward declaration
+ class NVRenderContextImpl;
+ class NVRenderVertexBuffer;
+
+ ///< Constant (uniform) buffer representation
+ class NVRenderStorageBuffer : public NVRenderDataBuffer
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] bufferName Name of the buffer. Must match the name used in programs
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ * @param[in] pBuffer Pointer to the buffer
+ *
+ * @return No return.
+ */
+ NVRenderStorageBuffer(NVRenderContextImpl &context, CRegisteredString bufferName,
+ size_t size, NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data, NVRenderDataBuffer *pBuffer = NULL);
+
+ ///< destructor
+ virtual ~NVRenderStorageBuffer();
+
+ /**
+ * @brief bind the buffer bypasses the context state
+ *
+ * @return no return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief bind the buffer to a shader program
+ *
+ * @param[in] index Index of the constant buffer within the program
+ *
+ * @return no return.
+ */
+ virtual void BindToShaderProgram(QT3DSU32 index);
+
+ /**
+ * @brief update the buffer to hardware
+ *
+ * @return no return.
+ */
+ virtual void Update();
+
+ /**
+ * @brief update a piece of memory directly within the storage buffer
+ *
+ * Note: When you use this function you should know what you are doing.
+ * The memory layout within C++ must exactly match the memory layout in the
+ *shader.
+ * We use std140 (430) layout which guarantees a specific layout behavior across
+ *all HW vendors.
+ * How the memory layout is computed can be found in the GL spec.
+ *
+ * @param[in] offset offset into storage buffer
+ * @param[in] data pointer to data
+ *
+ * @return no return
+ */
+ void UpdateData(QT3DSI32 offset, NVDataRef<QT3DSU8> data);
+
+ /**
+ * @brief get the buffer name
+ *
+ * @return the buffer name
+ */
+ CRegisteredString GetBufferName() const { return m_Name; }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendBufferObject GetBuffertHandle() const override
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_BufferHandle);
+ }
+
+ /**
+ * @brief create a NVRenderStorageBuffer object
+ *
+ * @param[in] context Pointer to context
+ * @param[in] size Size of the buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return the buffer object or NULL
+ */
+ static NVRenderStorageBuffer *Create(NVRenderContextImpl &context, const char *bufferName,
+ NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData,
+ NVRenderDataBuffer *pBuffer);
+
+ private:
+ CRegisteredString m_Name; ///< buffer name
+ NVRenderDataBuffer *m_WrappedBuffer; ///< pointer to wrapped buffer
+ bool m_Dirty; ///< true if buffer is dirty
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderSync.cpp b/src/render/Qt3DSRenderSync.cpp
new file mode 100644
index 0000000..02d153a
--- /dev/null
+++ b/src/render/Qt3DSRenderSync.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderSync.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSFoundation.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderSync::NVRenderSync(NVRenderContextImpl &context, NVFoundationBase &fnd)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_SyncHandle(NULL)
+ {
+ }
+
+ NVRenderSync::~NVRenderSync()
+ {
+ if (m_SyncHandle)
+ m_Backend->ReleaseSync(m_SyncHandle);
+ }
+
+ void NVRenderSync::Sync()
+ {
+ // On every sync call we need to create a new sync object
+ // A sync object can only be used once
+
+ // First delete the old object
+ // We can safely do this because it is actually not deleted until
+ // it is unused
+ if (m_SyncHandle)
+ m_Backend->ReleaseSync(m_SyncHandle);
+
+ m_SyncHandle =
+ m_Backend->CreateSync(NVRenderSyncType::GpuCommandsComplete, NVRenderSyncFlags());
+ }
+
+ void NVRenderSync::Wait()
+ {
+ // wait until the sync object is signaled or a timeout happens
+ if (m_SyncHandle)
+ m_Backend->WaitSync(m_SyncHandle, NVRenderCommandFlushFlags(), 0);
+ }
+
+ NVRenderSync *NVRenderSync::Create(NVRenderContextImpl &context)
+ {
+ if (!context.IsCommandSyncSupported())
+ return NULL;
+
+ NVRenderSync *retval = QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderSync)(context, context.GetFoundation());
+
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderSync.h b/src/render/Qt3DSRenderSync.h
new file mode 100644
index 0000000..9dfeb28
--- /dev/null
+++ b/src/render/Qt3DSRenderSync.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SYNC_H
+#define QT3DS_RENDER_SYNC_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ // forward declaration
+ class NVRenderContextImpl;
+ class NVRenderBackend;
+
+ ///< Base class
+ class NVRenderSync : public NVRefCounted
+ {
+ protected:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderBackend::NVRenderBackendSyncObject m_SyncHandle; ///< opaque backend handle
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderSync(NVRenderContextImpl &context, NVFoundationBase &fnd);
+
+ virtual ~NVRenderSync();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ /**
+ * @brief Get sync type
+ *
+ * @return Return query type
+ */
+ virtual NVRenderSyncType::Enum GetSyncType() const
+ {
+ return NVRenderSyncType::GpuCommandsComplete;
+ }
+
+ /**
+ * @brief Get a pointer to the foundation
+ *
+ * @return pointer to foundation
+ */
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ /**
+ * @brief Create a sync object and place it in command stream.
+ * Note every syncobject can only be used once.
+ * This function creates a new sync object on ever call
+ * and deletes the previous one
+ *
+ * @return no return.
+ */
+ virtual void Sync();
+
+ /**
+ * @brief Wait for a sync to be signaled
+ * Note this blocks until the sync is signaled
+ *
+ * @return no return.
+ */
+ virtual void Wait();
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendSyncObject GetSyncHandle() const
+ {
+ return m_SyncHandle;
+ }
+
+ /*
+ * @brief static creation function
+ *
+ * @return a sync object on success
+ */
+ static NVRenderSync *Create(NVRenderContextImpl &context);
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderTessellationShader.cpp b/src/render/Qt3DSRenderTessellationShader.cpp
new file mode 100644
index 0000000..7a0fd89
--- /dev/null
+++ b/src/render/Qt3DSRenderTessellationShader.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderTessellationShader.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderTessControlShader::NVRenderTessControlShader(NVRenderContextImpl &context,
+ NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source,
+ bool binaryProgram)
+ : NVRenderShader(context, fnd, source, binaryProgram)
+ , m_ShaderHandle(NULL)
+ {
+ m_ShaderHandle = m_Backend->CreateTessControlShader(source, m_ErrorMessage, binaryProgram);
+ }
+
+ NVRenderTessControlShader::~NVRenderTessControlShader()
+ {
+ if (m_ShaderHandle) {
+ m_Backend->ReleaseTessControlShader(m_ShaderHandle);
+ }
+ }
+
+ NVRenderTessEvaluationShader::NVRenderTessEvaluationShader(NVRenderContextImpl &context,
+ NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source,
+ bool binaryProgram)
+ : NVRenderShader(context, fnd, source, binaryProgram)
+ , m_ShaderHandle(NULL)
+ {
+ m_ShaderHandle =
+ m_Backend->CreateTessEvaluationShader(source, m_ErrorMessage, binaryProgram);
+ }
+
+ NVRenderTessEvaluationShader::~NVRenderTessEvaluationShader()
+ {
+ if (m_ShaderHandle) {
+ m_Backend->ReleaseTessEvaluationShader(m_ShaderHandle);
+ }
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderTessellationShader.h b/src/render/Qt3DSRenderTessellationShader.h
new file mode 100644
index 0000000..b69e56b
--- /dev/null
+++ b/src/render/Qt3DSRenderTessellationShader.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TESSELLATION_SHADER_H
+#define QT3DS_RENDER_TESSELLATION_SHADER_H
+
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderShader.h"
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+
+ ///< This class represents a tessellation control shader
+ class NVRenderTessControlShader : public NVRenderShader
+ {
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] source Pointer to shader source code
+ * @param[in] binaryProgram true if this is a binary program
+ *
+ * @return No return.
+ */
+ NVRenderTessControlShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram);
+
+ /// @brief destructor
+ ~NVRenderTessControlShader();
+
+ /**
+ * @brief Query if shader compiled succesfuly
+ *
+ * @return True if shader is valid.
+ */
+ bool IsValid() override { return (m_ShaderHandle != NULL); }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendTessControlShaderObject GetShaderHandle()
+ {
+ return m_ShaderHandle;
+ }
+
+ private:
+ NVRenderBackend::NVRenderBackendTessControlShaderObject
+ m_ShaderHandle; ///< opaque backend handle
+ };
+
+ ///< This class represents a tessellation evaluation shader
+ class NVRenderTessEvaluationShader : public NVRenderShader
+ {
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] source Pointer to shader source code
+ * @param[in] binaryProgram true if this is a binary program
+ *
+ * @return No return.
+ */
+ NVRenderTessEvaluationShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram);
+
+ /// @brief destructor
+ ~NVRenderTessEvaluationShader();
+
+ /**
+ * @brief Query if shader compiled succesfuly
+ *
+ * @return True if shader is valid.
+ */
+ bool IsValid() override { return (m_ShaderHandle != NULL); }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendTessEvaluationShaderObject GetShaderHandle()
+ {
+ return m_ShaderHandle;
+ }
+
+ private:
+ NVRenderBackend::NVRenderBackendTessEvaluationShaderObject
+ m_ShaderHandle; ///< opaque backend handle
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderTexture2D.cpp b/src/render/Qt3DSRenderTexture2D.cpp
new file mode 100644
index 0000000..c5ea475
--- /dev/null
+++ b/src/render/Qt3DSRenderTexture2D.cpp
@@ -0,0 +1,263 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/vector.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderSampler.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderTexture2D::NVRenderTexture2D(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget)
+ : NVRenderTextureBase(context, fnd, texTarget)
+ , m_Width(0)
+ , m_Height(0)
+ {
+ }
+
+ NVRenderTexture2D::~NVRenderTexture2D() { m_Context.TextureDestroyed(*this); }
+
+ STextureDetails NVRenderTexture2D::GetTextureDetails() const
+ {
+ return STextureDetails(m_Width, m_Height, 0, m_SampleCount, m_Format);
+ }
+
+ void NVRenderTexture2D::SetTextureData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel, QT3DSU32 width,
+ QT3DSU32 height, NVRenderTextureFormats::Enum format,
+ NVRenderTextureFormats::Enum formatDest)
+ {
+ QT3DS_ASSERT(m_TextureHandle);
+
+ // check if we should compress this texture
+
+ if (inMipLevel == 0) {
+ m_Width = width;
+ m_Height = height;
+ m_Format = format;
+
+ // We re-use textures and this might have been a MSAA texture before
+ // for resue we must completely destroy the texture object and create a new one
+ // The same is true for immutable textures
+ if (m_TexTarget == NVRenderTextureTargetType::Texture2D_MS || m_Immutable) {
+ m_Backend->ReleaseTexture(m_TextureHandle);
+ m_TexTarget = NVRenderTextureTargetType::Texture2D;
+ m_SampleCount = 1;
+ m_TextureHandle = m_Backend->CreateTexture();
+ }
+
+ if (NVRenderTextureFormats::isCompressedTextureFormat(formatDest)) {
+ bool compress = NVRenderTextureFormats::isUncompressedTextureFormat(format);
+ bool appropriateSizes = ((width % 4) || (height % 4)) == false;
+
+ // we only compress multiple of 4 textures
+ if (compress && !appropriateSizes)
+ compress = false;
+
+ if (compress) {
+ // This seems like a very dubious line here. If we are compressing then the
+ // image
+ // is really 1/4 the width and height? - CN
+ m_Width = width / 4;
+ m_Height = height / 4;
+ m_Format = formatDest;
+ }
+ } else if (NVRenderTextureFormats::isUncompressedTextureFormat(formatDest)) {
+ m_Format = formatDest;
+ }
+ }
+
+ if (m_MaxMipLevel < inMipLevel) {
+ m_MaxMipLevel = inMipLevel;
+ }
+
+ // get max size and check value
+ QT3DSU32 maxWidth, maxHeight;
+ m_Context.getMaxTextureSize(maxWidth, maxHeight);
+ if (width > maxWidth || height > maxHeight) {
+ qCCritical(INVALID_OPERATION, "Width or height is greater than max texture size (%d, %d)",
+ maxWidth, maxHeight);
+ }
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(format)
+ || NVRenderTextureFormats::isDepthTextureFormat(format)) {
+ m_Backend->SetTextureData2D(m_TextureHandle, m_TexTarget, inMipLevel, m_Format, width,
+ height, 0, format, newBuffer.begin());
+ } else if (NVRenderTextureFormats::isCompressedTextureFormat(format)) {
+ m_Backend->SetCompressedTextureData2D(m_TextureHandle, m_TexTarget, inMipLevel, format,
+ width, height, 0, newBuffer.size(),
+ newBuffer.begin());
+ }
+ // Set our texture parameters to a default that will look the best
+ if (inMipLevel > 0)
+ SetMinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear);
+ }
+
+ void NVRenderTexture2D::SetTextureStorage(QT3DSU32 inLevels, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum formaInternal,
+ NVRenderTextureFormats::Enum format,
+ NVDataRef<QT3DSU8> dataBuffer)
+ {
+ QT3DS_ASSERT(m_TextureHandle);
+
+ if (!m_Context.IsShaderImageLoadStoreSupported()) {
+ qCCritical(INVALID_OPERATION, "The extension Shader_Image_Load_Store is not supported");
+ return;
+ }
+
+ m_Width = width;
+ m_Height = height;
+ m_Format = formaInternal;
+ if (format == NVRenderTextureFormats::Unknown)
+ format = formaInternal;
+
+ // get max size and check value
+ QT3DSU32 maxWidth, maxHeight;
+ m_Context.getMaxTextureSize(maxWidth, maxHeight);
+ if (width > maxWidth || height > maxHeight) {
+ qCCritical(INVALID_OPERATION, "Width or height is greater than max texture size (%d, %d)",
+ maxWidth, maxHeight);
+ }
+
+ if (inLevels < 1) {
+ qCCritical(INVALID_PARAMETER, "inLevels is less than 1 (%d)", inLevels);
+ }
+
+ m_MaxMipLevel = inLevels - 1; // we count from 0
+
+ // only uncompressed formats are supported and no depth
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(formaInternal)) {
+ m_Backend->CreateTextureStorage2D(m_TextureHandle, m_TexTarget, inLevels, formaInternal,
+ width, height);
+
+ m_Immutable = true;
+ m_TexTarget = NVRenderTextureTargetType::Texture2D;
+
+ if (dataBuffer.size() > 0)
+ m_Backend->SetTextureSubData2D(m_TextureHandle, m_TexTarget, 0, 0, 0, width, height,
+ format, dataBuffer.begin());
+
+ if (inLevels > 1)
+ SetMinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear);
+ }
+ }
+
+ void NVRenderTexture2D::SetTextureDataMultisample(QT3DSU32 sampleCount, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum format)
+ {
+ QT3DS_ASSERT(m_TextureHandle);
+ QT3DS_ASSERT(m_MaxMipLevel == 0);
+
+ m_TexTarget = NVRenderTextureTargetType::Texture2D_MS;
+
+ QT3DSU32 maxWidth, maxHeight;
+ m_Context.getMaxTextureSize(maxWidth, maxHeight);
+ if (width > maxWidth || height > maxHeight) {
+ qCCritical(INVALID_OPERATION, "Width or height is greater than max texture size (%d, %d)",
+ maxWidth, maxHeight);
+ }
+
+ QT3DS_ASSERT(NVRenderTextureFormats::isUncompressedTextureFormat(format)
+ || NVRenderTextureFormats::isDepthTextureFormat(format));
+
+ m_Backend->SetMultisampledTextureData2D(m_TextureHandle, m_TexTarget, sampleCount, format,
+ width, height, true);
+
+ m_Width = width;
+ m_Height = height;
+ m_SampleCount = sampleCount;
+ m_Format = format;
+ }
+
+ void NVRenderTexture2D::SetTextureSubData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel,
+ QT3DSU32 inXOffset, QT3DSU32 inYOffset, QT3DSU32 width,
+ QT3DSU32 height, NVRenderTextureFormats::Enum format)
+ {
+ QT3DS_ASSERT(m_TextureHandle);
+
+ if (!NVRenderTextureFormats::isUncompressedTextureFormat(format)) {
+ qCCritical(INVALID_PARAMETER, "Cannot set sub data for depth or compressed formats");
+ QT3DS_ASSERT(false);
+ return;
+ }
+ QT3DSU32 subRectStride = width * NVRenderTextureFormats::getSizeofFormat(format);
+ if (newBuffer.size() < subRectStride * height) {
+ qCCritical(INVALID_PARAMETER, "Invalid sub rect buffer size");
+ QT3DS_ASSERT(false);
+ return;
+ }
+ // nop
+ if (width == 0 || height == 0)
+ return;
+
+ if (inXOffset + width > m_Width || inYOffset + height > m_Height) {
+ qCCritical(INVALID_PARAMETER, "Sub rect outside existing image bounds");
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ // not handled yet
+ QT3DS_ASSERT(!NVRenderTextureFormats::isDepthTextureFormat(format));
+
+ m_Backend->SetTextureSubData2D(m_TextureHandle, m_TexTarget, inMipLevel, inXOffset,
+ inYOffset, width, height, format, newBuffer.begin());
+ }
+
+ void NVRenderTexture2D::GenerateMipmaps(NVRenderHint::Enum genType)
+ {
+ applyTexParams();
+ m_Backend->GenerateMipMaps(m_TextureHandle, m_TexTarget, genType);
+ QT3DSU32 maxDim = (m_Width >= m_Height) ? m_Width : m_Height;
+ m_MaxMipLevel = static_cast<QT3DSU32>(logf((float)maxDim) / logf(2.0f));
+ // we never create more level than m_MaxLevel
+ m_MaxMipLevel = qt3ds::NVMin(m_MaxMipLevel, (QT3DSU32)m_MaxLevel);
+ }
+
+ void NVRenderTexture2D::Bind()
+ {
+ m_TextureUnit = m_Context.GetNextTextureUnit();
+
+ m_Backend->BindTexture(m_TextureHandle, m_TexTarget, m_TextureUnit);
+
+ applyTexParams();
+ applyTexSwizzle();
+ }
+
+ NVRenderTexture2D *NVRenderTexture2D::Create(NVRenderContextImpl &context)
+ {
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderTexture2D)(context, context.GetFoundation());
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderTexture2D.h b/src/render/Qt3DSRenderTexture2D.h
new file mode 100644
index 0000000..29c7c1b
--- /dev/null
+++ b/src/render/Qt3DSRenderTexture2D.h
@@ -0,0 +1,165 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_TEXTURE_2D_H
+#define QT3DS_RENDER_QT3DS_RENDER_TEXTURE_2D_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "render/Qt3DSRenderTextureBase.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+ class NVRenderTextureSampler;
+
+ class NVRenderTexture2D : public NVRenderTextureBase, public NVRenderImplemented
+ {
+
+ private:
+ QT3DSU32 m_Width; ///< texture width
+ QT3DSU32 m_Height; ///< texture height
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] texTarget Texture target
+ *
+ * @return No return.
+ */
+ NVRenderTexture2D(
+ NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget = NVRenderTextureTargetType::Texture2D);
+
+ virtual ~NVRenderTexture2D();
+
+ // Get the texture details for mipmap level 0 if it was set.
+ STextureDetails GetTextureDetails() const override;
+
+ /**
+ * @brief Create GL texture object and upload data
+ *
+ * @param[in] newBuffer Texture data for level 0
+ * @param[in] inMipLevel Texture level count
+ * @param[in] width Texture width
+ * @param[in] height Texture height
+ * @param[in] format Texture data format
+ * @param[in] formaInternal Texture internal format
+ *
+ * @return No return.
+ */
+ virtual void SetTextureData(
+ NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum format,
+ NVRenderTextureFormats::Enum formaInternal = NVRenderTextureFormats::Unknown);
+
+ /**
+ * @brief Create memory storage for a texture object
+ * This create a texture storage which is immutable in size and format
+ * Use this for textures used within compute shaders
+ *
+ * @param[in] inLevels Texture level count
+ * @param[in] width Texture width
+ * @param[in] height Texture height
+ * @param[in] formaInternal Texture internal format
+ * @param[in] format Texture data format of dataBuffer
+ * @param[in] dataBuffer Texture data for level 0
+ *
+ * @return No return.
+ */
+ virtual void
+ SetTextureStorage(QT3DSU32 inLevels, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum formaInternal,
+ NVRenderTextureFormats::Enum format = NVRenderTextureFormats::Unknown,
+ NVDataRef<QT3DSU8> dataBuffer = NVDataRef<QT3DSU8>());
+
+ virtual void SetTextureDataMultisample(QT3DSU32 sampleCount, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum format);
+
+ bool IsMultisampleTexture() const override
+ {
+ return (m_TexTarget == NVRenderTextureTargetType::Texture2D_MS);
+ }
+ QT3DSU32 GetSampleCount() const override { return m_SampleCount; }
+ bool IsImmutableTexture() const override { return m_Immutable; }
+
+ // Update a sub-rect of the image. newBuffer is expected to be a continguous subrect of the
+ // image.
+ virtual void SetTextureSubData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel, QT3DSU32 inXOffset,
+ QT3DSU32 inYOffset, QT3DSU32 inSubImageWidth,
+ QT3DSU32 inSubImageHeight, NVRenderTextureFormats::Enum format);
+ // Generate a set of mipmaps from mipLevel( 0 ). Uses the graphis layer to do this if
+ // possible
+ // glGenerateMipmap
+ virtual void GenerateMipmaps(NVRenderHint::Enum genType = NVRenderHint::Nicest);
+
+ /**
+ * @brief Bind a texture for shader access
+ *
+ *
+ * @return No return.
+ */
+ void Bind() override;
+
+ QT3DSU32 GetNumMipmaps() override { return m_MaxMipLevel; }
+
+ /**
+ * @brief Query if texture needs coordinate swizzle
+ *
+ * @return texture swizzle mode
+ */
+ NVRenderTextureSwizzleMode::Enum GetTextureSwizzleMode() override
+ {
+ // if our backend supports hardware texture swizzle then there is no need for a shader
+ // swizzle
+ return (m_Backend->GetRenderBackendCap(
+ NVRenderBackend::NVRenderBackendCaps::TexSwizzle))
+ ? NVRenderTextureSwizzleMode::NoSwizzle
+ : m_Backend->GetTextureSwizzleMode(m_Format);
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_TextureHandle);
+ }
+
+ static NVRenderTexture2D *Create(NVRenderContextImpl &context);
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderTexture2DArray.cpp b/src/render/Qt3DSRenderTexture2DArray.cpp
new file mode 100644
index 0000000..fc0dfa4
--- /dev/null
+++ b/src/render/Qt3DSRenderTexture2DArray.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/vector.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderSampler.h"
+#include "render/Qt3DSRenderTexture2DArray.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderTexture2DArray::NVRenderTexture2DArray(NVRenderContextImpl &context,
+ NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget)
+ : NVRenderTextureBase(context, fnd, texTarget)
+ , m_Width(0)
+ , m_Height(0)
+ , m_Slices(0)
+ {
+ }
+
+ NVRenderTexture2DArray::~NVRenderTexture2DArray() { m_Context.TextureDestroyed(*this); }
+
+ void NVRenderTexture2DArray::SetTextureData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel,
+ QT3DSU32 width, QT3DSU32 height, QT3DSU32 slices,
+ NVRenderTextureFormats::Enum format)
+ {
+ QT3DS_ASSERT(m_TextureHandle);
+
+ if (inMipLevel == 0) {
+ m_Width = width;
+ m_Height = height;
+ m_Slices = slices;
+ m_Format = format;
+ m_MaxMipLevel = inMipLevel;
+ }
+
+ if (m_MaxMipLevel < inMipLevel) {
+ m_MaxMipLevel = inMipLevel;
+ }
+
+ // get max size and check value
+ QT3DSI32 theMaxLayerSize, theMaxSize;
+ m_Backend->GetRenderBackendValue(NVRenderBackend::NVRenderBackendQuery::MaxTextureSize,
+ &theMaxSize);
+ m_Backend->GetRenderBackendValue(
+ NVRenderBackend::NVRenderBackendQuery::MaxTextureArrayLayers, &theMaxLayerSize);
+ if (width > (QT3DSU32)theMaxSize || height > (QT3DSU32)theMaxSize
+ || slices > (QT3DSU32)theMaxLayerSize) {
+ qCCritical(INVALID_OPERATION,
+ "Width or height or Slices is greater than max texture size (%d, %d, %d)",
+ theMaxSize, theMaxSize, theMaxLayerSize);
+ }
+
+ // currently we do not support compressed texture arrays
+ QT3DS_ASSERT(NVRenderTextureFormats::isUncompressedTextureFormat(format)
+ || NVRenderTextureFormats::isDepthTextureFormat(format));
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(format)
+ || NVRenderTextureFormats::isDepthTextureFormat(format)) {
+ m_Backend->SetTextureData3D(m_TextureHandle, m_TexTarget, inMipLevel, m_Format, width,
+ height, slices, 0, format, newBuffer.begin());
+ }
+
+ // Set our texture parameters to a default that will look the best
+ if (inMipLevel > 0)
+ SetMinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear);
+ }
+
+ STextureDetails NVRenderTexture2DArray::GetTextureDetails() const
+ {
+ return STextureDetails(m_Width, m_Height, m_Slices, m_SampleCount, m_Format);
+ }
+
+ void NVRenderTexture2DArray::Bind()
+ {
+ m_TextureUnit = m_Context.GetNextTextureUnit();
+
+ m_Backend->BindTexture(m_TextureHandle, m_TexTarget, m_TextureUnit);
+
+ applyTexParams();
+ applyTexSwizzle();
+ }
+
+ NVRenderTexture2DArray *NVRenderTexture2DArray::Create(NVRenderContextImpl &context)
+ {
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderTexture2DArray)(context, context.GetFoundation());
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderTexture2DArray.h b/src/render/Qt3DSRenderTexture2DArray.h
new file mode 100644
index 0000000..30ed6db
--- /dev/null
+++ b/src/render/Qt3DSRenderTexture2DArray.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_TEXTURE_2D_ARRAY_H
+#define QT3DS_RENDER_QT3DS_RENDER_TEXTURE_2D_ARRAY_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "render/Qt3DSRenderTextureBase.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+ class NVRenderTextureSampler;
+
+ class QT3DS_AUTOTEST_EXPORT NVRenderTexture2DArray : public NVRenderTextureBase
+ {
+ private:
+ QT3DSU32 m_Width; ///< texture width
+ QT3DSU32 m_Height; ///< texture height
+ QT3DSU32 m_Slices; ///< texture slices
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] texTarget Texture target
+ *
+ * @return No return.
+ */
+ NVRenderTexture2DArray(
+ NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget = NVRenderTextureTargetType::Texture2D_Array);
+
+ virtual ~NVRenderTexture2DArray();
+
+ /**
+ * @brief constructor
+ *
+ * @param[in] newBuffer Pointer to pixel buffer
+ * @param[in] inMipLevel Pointer to foundation
+ * @param[in] width Texture target
+ * @param[in] height Texture target
+ * @param[in] slices Texture target
+ * @param[in] format Texture target
+ *
+ * @return No return.
+ */
+ void SetTextureData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel, QT3DSU32 width, QT3DSU32 height,
+ QT3DSU32 slices, NVRenderTextureFormats::Enum format);
+
+ // Get the texture details for mipmap level 0 if it was set.
+ STextureDetails GetTextureDetails() const override;
+
+ /**
+ * @brief Bind a texture for shader access
+ *
+ *
+ * @return No return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief create a texture array object
+ *
+ *
+ * @ return a texture array object
+ */
+ static NVRenderTexture2DArray *Create(NVRenderContextImpl &context);
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderTextureBase.cpp b/src/render/Qt3DSRenderTextureBase.cpp
new file mode 100644
index 0000000..c1c3e97
--- /dev/null
+++ b/src/render/Qt3DSRenderTextureBase.cpp
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/vector.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderSampler.h"
+#include "render/Qt3DSRenderTextureBase.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderTextureBase::NVRenderTextureBase(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget)
+ : m_Context(context)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ , m_Backend(context.GetBackend())
+ , m_TextureHandle(NULL)
+ , m_TextureUnit(QT3DS_MAX_U32)
+ , m_SamplerParamsDirty(true)
+ , m_TexStateDirty(false)
+ , m_SampleCount(1)
+ , m_Format(NVRenderTextureFormats::Unknown)
+ , m_TexTarget(texTarget)
+ , m_BaseLevel(0)
+ , m_MaxLevel(1000)
+ , m_MaxMipLevel(0)
+ , m_Immutable(false)
+ {
+ m_TextureHandle = m_Backend->CreateTexture();
+ m_Sampler = QT3DS_NEW(m_Context.GetFoundation().getAllocator(),
+ NVRenderTextureSampler)(context, context.GetFoundation());
+ }
+
+ NVRenderTextureBase::~NVRenderTextureBase()
+ {
+ if (m_Sampler)
+ QT3DS_FREE(m_Context.GetFoundation().getAllocator(), m_Sampler);
+ if (m_TextureHandle)
+ m_Backend->ReleaseTexture(m_TextureHandle);
+ }
+
+ void NVRenderTextureBase::SetBaseLevel(QT3DSI32 value)
+ {
+ if (m_BaseLevel != value) {
+ m_BaseLevel = value;
+ m_TexStateDirty = true;
+ }
+ }
+
+ void NVRenderTextureBase::SetMaxLevel(QT3DSI32 value)
+ {
+ if (m_MaxLevel != value) {
+ m_MaxLevel = value;
+ m_TexStateDirty = true;
+ }
+ }
+
+ void NVRenderTextureBase::SetMinFilter(NVRenderTextureMinifyingOp::Enum value)
+ {
+ if (m_Sampler->m_MinFilter != value) {
+ m_Sampler->m_MinFilter = value;
+ m_SamplerParamsDirty = true;
+ }
+ }
+
+ void NVRenderTextureBase::SetMagFilter(NVRenderTextureMagnifyingOp::Enum value)
+ {
+ if (m_Sampler->m_MagFilter != value) {
+ m_Sampler->m_MagFilter = value;
+ m_SamplerParamsDirty = true;
+ }
+ }
+
+ void NVRenderTextureBase::SetTextureWrapS(NVRenderTextureCoordOp::Enum value)
+ {
+ if (m_Sampler->m_WrapS != value) {
+ m_Sampler->m_WrapS = value;
+ m_SamplerParamsDirty = true;
+ }
+ }
+
+ void NVRenderTextureBase::SetTextureWrapT(NVRenderTextureCoordOp::Enum value)
+ {
+ if (m_Sampler->m_WrapT != value) {
+ m_Sampler->m_WrapT = value;
+ m_SamplerParamsDirty = true;
+ }
+ }
+
+ void NVRenderTextureBase::SetTextureCompareMode(NVRenderTextureCompareMode::Enum value)
+ {
+ if (m_Sampler->m_CompareMode != value) {
+ m_Sampler->m_CompareMode = value;
+ m_SamplerParamsDirty = true;
+ }
+ }
+
+ void NVRenderTextureBase::SetTextureCompareFunc(NVRenderTextureCompareOp::Enum value)
+ {
+ if (m_Sampler->m_CompareOp != value) {
+ m_Sampler->m_CompareOp = value;
+ m_SamplerParamsDirty = true;
+ }
+ }
+
+ static GLfloat getMaxAnisotropy()
+ {
+ static GLfloat val = (GLfloat)qEnvironmentVariableIntValue("QT3DS_ANISOTROPIC_VALUE");
+ return val > 0 ? val : 1.0f;
+ }
+
+ void NVRenderTextureBase::applyTexParams()
+ {
+ if (m_SamplerParamsDirty) {
+ m_Backend->UpdateSampler(m_Sampler->GetSamplerHandle(), m_TexTarget,
+ m_Sampler->m_MinFilter, m_Sampler->m_MagFilter,
+ m_Sampler->m_WrapS, m_Sampler->m_WrapT, m_Sampler->m_WrapR,
+ m_Sampler->m_MinLod, m_Sampler->m_MaxLod, m_Sampler->m_LodBias,
+ m_Sampler->m_CompareMode, m_Sampler->m_CompareOp,
+ getMaxAnisotropy());
+
+ m_SamplerParamsDirty = false;
+ }
+
+ if (m_TexStateDirty) {
+ m_Backend->UpdateTextureObject(m_TextureHandle, m_TexTarget, m_BaseLevel, m_MaxLevel);
+ m_TexStateDirty = false;
+ }
+ }
+
+ void NVRenderTextureBase::applyTexSwizzle()
+ {
+ NVRenderTextureSwizzleMode::Enum theSwizzleMode =
+ m_Backend->GetTextureSwizzleMode(m_Format);
+ if (theSwizzleMode != m_Sampler->m_SwizzleMode) {
+ m_Sampler->m_SwizzleMode = theSwizzleMode;
+ m_Backend->UpdateTextureSwizzle(m_TextureHandle, m_TexTarget, theSwizzleMode);
+ }
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderTextureBase.h b/src/render/Qt3DSRenderTextureBase.h
new file mode 100644
index 0000000..872a634
--- /dev/null
+++ b/src/render/Qt3DSRenderTextureBase.h
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_TEXTURE_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_TEXTURE_BUFFER_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+ class NVRenderTextureSampler;
+
+ struct STextureDetails
+ {
+ QT3DSU32 m_Width;
+ QT3DSU32 m_Height;
+ QT3DSU32 m_Depth;
+ QT3DSU32 m_SampleCount;
+ NVRenderTextureFormats::Enum m_Format;
+
+ STextureDetails(QT3DSU32 w, QT3DSU32 h, QT3DSU32 d, QT3DSU32 samples, NVRenderTextureFormats::Enum f)
+ : m_Width(w)
+ , m_Height(h)
+ , m_Depth(d)
+ , m_SampleCount(samples)
+ , m_Format(f)
+ {
+ }
+ STextureDetails()
+ : m_Width(0)
+ , m_Height(0)
+ , m_Depth(0)
+ , m_SampleCount(1)
+ , m_Format(NVRenderTextureFormats::Unknown)
+ {
+ }
+ };
+
+ class NVRenderTextureBase : public NVRefCounted
+ {
+
+ protected:
+ NVRenderContextImpl &m_Context; ///< pointer to context
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ volatile QT3DSI32 mRefCount; ///< Using foundations' naming convention to ease implementation
+ NVRenderBackend *m_Backend; ///< pointer to backend
+ NVRenderBackend::NVRenderBackendTextureObject m_TextureHandle; ///< opaque backend handle
+ QT3DSU32 m_TextureUnit; ///< texture unit this texture should use
+ bool m_SamplerParamsDirty; ///< true if sampler state is dirty
+ bool m_TexStateDirty; ///< true if texture object state is dirty
+ QT3DSU32 m_SampleCount; ///< texture height
+ NVRenderTextureFormats::Enum m_Format; ///< texture format
+ NVRenderTextureTargetType::Enum m_TexTarget; ///< texture target
+ NVRenderTextureSampler *m_Sampler; ///< current texture sampler state
+ QT3DSI32 m_BaseLevel; ///< minimum lod specified
+ QT3DSI32 m_MaxLevel; ///< maximum lod specified
+ QT3DSU32 m_MaxMipLevel; ///< highest mip level
+ bool m_Immutable; ///< true if this is a immutable texture ( size and format )
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] texTarget Texture target
+ *
+ * @return No return.
+ */
+ NVRenderTextureBase(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget);
+
+ virtual ~NVRenderTextureBase();
+
+ // define refcount functions
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation)
+
+ virtual void SetMinFilter(NVRenderTextureMinifyingOp::Enum value);
+ virtual void SetMagFilter(NVRenderTextureMagnifyingOp::Enum value);
+
+ virtual void SetBaseLevel(QT3DSI32 value);
+ virtual void SetMaxLevel(QT3DSI32 value);
+
+ virtual void SetTextureWrapS(NVRenderTextureCoordOp::Enum value);
+ virtual void SetTextureWrapT(NVRenderTextureCoordOp::Enum value);
+
+ virtual void SetTextureCompareMode(NVRenderTextureCompareMode::Enum value);
+ virtual void SetTextureCompareFunc(NVRenderTextureCompareOp::Enum value);
+
+ virtual void SetTextureUnit(QT3DSU32 unit) { m_TextureUnit = unit; }
+ virtual QT3DSU32 GetTextureUnit() const { return m_TextureUnit; }
+
+ // Get the texture details for mipmap level 0 if it was set.
+ virtual STextureDetails GetTextureDetails() const = 0;
+
+ virtual bool IsMultisampleTexture() const
+ {
+ return (m_TexTarget == NVRenderTextureTargetType::Texture2D_MS);
+ }
+ virtual QT3DSU32 GetSampleCount() const { return m_SampleCount; }
+ virtual bool IsImmutableTexture() const { return m_Immutable; }
+
+ /**
+ * @brief Bind a texture for shader access
+ *
+ *
+ * @return No return.
+ */
+ virtual void Bind() = 0;
+
+ virtual QT3DSU32 GetNumMipmaps() { return m_MaxMipLevel; }
+
+ /**
+ * @brief Query if texture needs coordinate swizzle
+ *
+ * @return texture swizzle mode
+ */
+ virtual NVRenderTextureSwizzleMode::Enum GetTextureSwizzleMode()
+ {
+ // if our backend supports hardware texture swizzle then there is no need for a shader
+ // swizzle
+ return (m_Backend->GetRenderBackendCap(
+ NVRenderBackend::NVRenderBackendCaps::TexSwizzle))
+ ? NVRenderTextureSwizzleMode::NoSwizzle
+ : m_Backend->GetTextureSwizzleMode(m_Format);
+ }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendTextureObject GetTextureObjectHandle()
+ {
+ return m_TextureHandle;
+ }
+
+ protected:
+ void applyTexParams();
+ void applyTexSwizzle();
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderTextureCube.cpp b/src/render/Qt3DSRenderTextureCube.cpp
new file mode 100644
index 0000000..0919daf
--- /dev/null
+++ b/src/render/Qt3DSRenderTextureCube.cpp
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/vector.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderSampler.h"
+#include "render/Qt3DSRenderTextureCube.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderTextureCube::NVRenderTextureCube(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget)
+ : NVRenderTextureBase(context, fnd, texTarget)
+ , m_Width(0)
+ , m_Height(0)
+ {
+ }
+
+ NVRenderTextureCube::~NVRenderTextureCube() { m_Context.TextureDestroyed(*this); }
+
+ void NVRenderTextureCube::SetTextureData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel,
+ NVRenderTextureCubeFaces::Enum inFace, QT3DSU32 width,
+ QT3DSU32 height, NVRenderTextureFormats::Enum format)
+ {
+ QT3DS_ASSERT(m_TextureHandle);
+ QT3DS_ASSERT(inFace != NVRenderTextureCubeFaces::InvalidFace);
+
+ if (inMipLevel == 0) {
+ m_Width = width;
+ m_Height = height;
+ m_Format = format;
+ m_MaxMipLevel = inMipLevel;
+ }
+
+ if (m_MaxMipLevel < inMipLevel) {
+ m_MaxMipLevel = inMipLevel;
+ }
+
+ // get max size and check value
+ QT3DSI32 theMaxSize;
+ m_Backend->GetRenderBackendValue(NVRenderBackend::NVRenderBackendQuery::MaxTextureSize,
+ &theMaxSize);
+ if (width > (QT3DSU32)theMaxSize || height > (QT3DSU32)theMaxSize) {
+ qCCritical(INVALID_OPERATION, "Width or height is greater than max texture size (%d, %d)",
+ theMaxSize, theMaxSize);
+ }
+
+ NVRenderTextureTargetType::Enum outTarget =
+ static_cast<NVRenderTextureTargetType::Enum>((int)m_TexTarget + (int)inFace);
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(format)
+ || NVRenderTextureFormats::isDepthTextureFormat(format)) {
+ m_Backend->SetTextureDataCubeFace(m_TextureHandle, outTarget, inMipLevel, format, width,
+ height, 0, format, newBuffer.begin());
+ } else if (NVRenderTextureFormats::isCompressedTextureFormat(format)) {
+ m_Backend->SetCompressedTextureDataCubeFace(m_TextureHandle, outTarget, inMipLevel,
+ format, width, height, 0, newBuffer.size(),
+ newBuffer.begin());
+ }
+
+ // Set our texture parameters to a default that will look the best
+ if (inMipLevel > 0)
+ SetMinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear);
+ }
+
+ STextureDetails NVRenderTextureCube::GetTextureDetails() const
+ {
+ return STextureDetails(m_Width, m_Height, 6, m_SampleCount, m_Format);
+ }
+
+ void NVRenderTextureCube::Bind()
+ {
+ m_TextureUnit = m_Context.GetNextTextureUnit();
+
+ m_Backend->BindTexture(m_TextureHandle, m_TexTarget, m_TextureUnit);
+
+ applyTexParams();
+ applyTexSwizzle();
+ }
+
+ NVRenderTextureCube *NVRenderTextureCube::Create(NVRenderContextImpl &context)
+ {
+ return QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderTextureCube)(context, context.GetFoundation());
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderTextureCube.h b/src/render/Qt3DSRenderTextureCube.h
new file mode 100644
index 0000000..7310d44
--- /dev/null
+++ b/src/render/Qt3DSRenderTextureCube.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_TEXTURE_CUBE_H
+#define QT3DS_RENDER_QT3DS_RENDER_TEXTURE_CUBE_H
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "render/Qt3DSRenderTextureBase.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderContextImpl;
+ class NVRenderTextureSampler;
+
+ class NVRenderTextureCube : public NVRenderTextureBase
+ {
+ private:
+ QT3DSU32 m_Width; ///< texture width (per face)
+ QT3DSU32 m_Height; ///< texture height (per face)
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] texTarget Texture target
+ *
+ * @return No return.
+ */
+ NVRenderTextureCube(
+ NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVRenderTextureTargetType::Enum texTarget = NVRenderTextureTargetType::TextureCube);
+
+ virtual ~NVRenderTextureCube();
+
+ /**
+ * @brief constructor
+ *
+ * @param[in] newBuffer Pointer to pixel buffer
+ * @param[in] inMipLevel Pointer to foundation
+ * @param[in] width Texture target
+ * @param[in] height Texture target
+ * @param[in] slices Texture target
+ * @param[in] format Texture target
+ *
+ * @return No return.
+ */
+ void SetTextureData(NVDataRef<QT3DSU8> newBuffer, QT3DSU8 inMipLevel,
+ NVRenderTextureCubeFaces::Enum inFace, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum format);
+
+ // Get the texture details for mipmap level 0 if it was set.
+ STextureDetails GetTextureDetails() const override;
+
+ /**
+ * @brief Bind a texture for shader access
+ *
+ *
+ * @return No return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief create a texture array object
+ *
+ *
+ * @ return a texture array object
+ */
+ static NVRenderTextureCube *Create(NVRenderContextImpl &context);
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderTimerQuery.cpp b/src/render/Qt3DSRenderTimerQuery.cpp
new file mode 100644
index 0000000..4184436
--- /dev/null
+++ b/src/render/Qt3DSRenderTimerQuery.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderTimerQuery.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderTimerQuery::NVRenderTimerQuery(NVRenderContextImpl &context, NVFoundationBase &fnd)
+ : NVRenderQueryBase(context, fnd)
+ {
+ }
+
+ NVRenderTimerQuery::~NVRenderTimerQuery() {}
+
+ void NVRenderTimerQuery::Begin()
+ {
+ m_Backend->BeginQuery(m_QueryHandle, NVRenderQueryType::Timer);
+ }
+
+ void NVRenderTimerQuery::End() { m_Backend->EndQuery(m_QueryHandle, NVRenderQueryType::Timer); }
+
+ void NVRenderTimerQuery::GetResult(QT3DSU32 *params)
+ {
+ m_Backend->GetQueryResult(m_QueryHandle, NVRenderQueryResultType::Result, params);
+ }
+
+ void NVRenderTimerQuery::GetResult(QT3DSU64 *params)
+ {
+ m_Backend->GetQueryResult(m_QueryHandle, NVRenderQueryResultType::Result, params);
+ }
+
+ void NVRenderTimerQuery::SetTimerQuery() { m_Backend->SetQueryTimer(m_QueryHandle); }
+
+ NVRenderTimerQuery *NVRenderTimerQuery::Create(NVRenderContextImpl &context)
+ {
+ if (!context.IsTimerQuerySupported())
+ return NULL;
+
+ NVRenderTimerQuery *retval = QT3DS_NEW(context.GetFoundation().getAllocator(),
+ NVRenderTimerQuery)(context, context.GetFoundation());
+
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderTimerQuery.h b/src/render/Qt3DSRenderTimerQuery.h
new file mode 100644
index 0000000..f909f37
--- /dev/null
+++ b/src/render/Qt3DSRenderTimerQuery.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TIMER_QUERY_H
+#define QT3DS_RENDER_TIMER_QUERY_H
+
+#include "render/Qt3DSRenderQueryBase.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ // forward declaration
+ class NVRenderContextImpl;
+
+ class NVRenderTimerQuery : public NVRenderQueryBase
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] fnd Pointer to foundation
+ *
+ * @return No return.
+ */
+ NVRenderTimerQuery(NVRenderContextImpl &context, NVFoundationBase &fnd);
+
+ ///< destructor
+ ~NVRenderTimerQuery();
+
+ /**
+ * @brief Get query type
+ *
+ * @return Return query type
+ */
+ NVRenderQueryType::Enum GetQueryType() const override
+ {
+ return NVRenderQueryType::Timer;
+ }
+
+ /**
+ * @brief Get a pointer to the foundation
+ *
+ * @return pointer to foundation
+ */
+ NVFoundationBase &GetFoundation() { return m_Foundation; }
+
+ /**
+ * @brief begin a query
+ *
+ * @return no return.
+ */
+ void Begin() override;
+
+ /**
+ * @brief end a query
+ *
+ * @return no return.
+ */
+ void End() override;
+
+ /**
+ * @brief Get the result of a query
+ *
+ * @param[out] params Contains result of query regarding query type
+ *
+ * @return no return.
+ */
+ void GetResult(QT3DSU32 *params) override;
+
+ /**
+ * @brief Get the result of a query
+ *
+ * @param[out] params Contains result of query regarding query type
+ *
+ * @return no return.
+ */
+ virtual void GetResult(QT3DSU64 *params);
+
+ /**
+ * @brief Places an absolute timer query into the render queue
+ * The result can be queried with GetResult
+ *
+ * @return no return.
+ */
+ virtual void SetTimerQuery();
+
+ /*
+ * @brief static creation function
+ *
+ * * @return a timer query object on success
+ */
+ static NVRenderTimerQuery *Create(NVRenderContextImpl &context);
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderVertexBuffer.cpp b/src/render/Qt3DSRenderVertexBuffer.cpp
new file mode 100644
index 0000000..89d6204
--- /dev/null
+++ b/src/render/Qt3DSRenderVertexBuffer.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderVertexBuffer::NVRenderVertexBuffer(NVRenderContextImpl &context, size_t size,
+ QT3DSU32 stride, NVRenderBufferBindFlags bindFlags,
+ NVRenderBufferUsageType::Enum usageType,
+ NVDataRef<QT3DSU8> data)
+ : NVRenderDataBuffer(context, context.GetFoundation(), size, bindFlags, usageType, data)
+ , m_Stride(stride)
+ {
+ QT3DS_ASSERT(m_Stride);
+ }
+
+ NVRenderVertexBuffer::~NVRenderVertexBuffer() { m_Context.BufferDestroyed(*this); }
+
+ void NVRenderVertexBuffer::Bind()
+ {
+ if (m_Mapped) {
+ qCCritical(INVALID_OPERATION, "Attempting to Bind a locked buffer");
+ QT3DS_ASSERT(false);
+ }
+
+ m_Backend->BindBuffer(m_BufferHandle, m_BindFlags);
+ }
+
+ NVRenderVertexBuffer *NVRenderVertexBuffer::Create(NVRenderContextImpl &context,
+ NVRenderBufferUsageType::Enum usageType,
+ size_t size, QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVFoundationBase &fnd(context.GetFoundation());
+
+ QT3DSU32 vbufSize = sizeof(NVRenderVertexBuffer);
+ QT3DSU8 *newMem = (QT3DSU8 *)QT3DS_ALLOC(fnd.getAllocator(), vbufSize, "VertexBuffer");
+ NVRenderVertexBuffer *retval = new (newMem) NVRenderVertexBuffer(
+ context, size, stride, NVRenderBufferBindValues::Vertex, usageType,
+ toDataRef(const_cast<QT3DSU8 *>(bufferData.begin()), bufferData.size()));
+ return retval;
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderVertexBuffer.h b/src/render/Qt3DSRenderVertexBuffer.h
new file mode 100644
index 0000000..914afe2
--- /dev/null
+++ b/src/render/Qt3DSRenderVertexBuffer.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_QT3DS_RENDER_VERTEX_BUFFER_H
+#define QT3DS_RENDER_QT3DS_RENDER_VERTEX_BUFFER_H
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Utils.h"
+#include "render/Qt3DSRenderDrawable.h"
+#include "render/Qt3DSRenderDataBuffer.h"
+
+namespace qt3ds {
+namespace render {
+
+ // forward declaration
+ class NVRenderContextImpl;
+
+ ///< Vertex buffer representation
+ class NVRenderVertexBuffer : public NVRenderDataBuffer
+ {
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to context
+ * @param[in] entries Vertex buffer attribute layout entries
+ * @param[in] size Size of the buffer
+ * @param[in] bindFlags Where to binf this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ *application.
+ *
+ * @return No return.
+ */
+ NVRenderVertexBuffer(NVRenderContextImpl &context, size_t size, QT3DSU32 stride,
+ NVRenderBufferBindFlags bindFlags,
+ NVRenderBufferUsageType::Enum usageType, NVDataRef<QT3DSU8> data);
+
+ ///< destructor
+ virtual ~NVRenderVertexBuffer();
+
+ /**
+ * @brief return vertex data stride
+ *
+ * @return data stride.
+ */
+ virtual QT3DSU32 GetStride() const { return m_Stride; }
+
+ /**
+ * @brief get vertex count
+ *
+ * @return vertex count
+ */
+ virtual QT3DSU32 GetNumVertexes() const
+ {
+ QT3DS_ASSERT((m_BufferCapacity % m_Stride) == 0);
+ return m_BufferCapacity / m_Stride;
+ }
+
+ /**
+ * @brief bind the buffer bypasses the context state
+ *
+ * @return no return.
+ */
+ void Bind() override;
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ NVRenderBackend::NVRenderBackendBufferObject GetBuffertHandle() const override
+ {
+ return m_BufferHandle;
+ }
+
+ // this will be obsolete
+ const void *GetImplementationHandle() const override
+ {
+ return reinterpret_cast<void *>(m_BufferHandle);
+ }
+
+ // No stride means that stride is calculated from the size of last entry found via entry
+ // offset
+ // Leaves this buffer temporarily bound.
+ static NVRenderVertexBuffer *Create(NVRenderContextImpl &context,
+ NVRenderBufferUsageType::Enum usageType, size_t size,
+ QT3DSU32 stride, NVConstDataRef<QT3DSU8> bufferData);
+
+ private:
+ QT3DSU32 m_Stride; ///< veretex data stride
+ };
+}
+}
+
+#endif
diff --git a/src/render/Qt3DSRenderVertexShader.cpp b/src/render/Qt3DSRenderVertexShader.cpp
new file mode 100644
index 0000000..3a53ad5
--- /dev/null
+++ b/src/render/Qt3DSRenderVertexShader.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderVertexShader.h"
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderVertexShader::NVRenderVertexShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram)
+ : NVRenderShader(context, fnd, source, binaryProgram)
+ , m_ShaderHandle(NULL)
+ {
+ m_ShaderHandle = m_Backend->CreateVertexShader(source, m_ErrorMessage, binaryProgram);
+ }
+
+ NVRenderVertexShader::~NVRenderVertexShader()
+ {
+ if (m_ShaderHandle) {
+ m_Backend->ReleaseVertexShader(m_ShaderHandle);
+ }
+ }
+}
+}
diff --git a/src/render/Qt3DSRenderVertexShader.h b/src/render/Qt3DSRenderVertexShader.h
new file mode 100644
index 0000000..0a96045
--- /dev/null
+++ b/src/render/Qt3DSRenderVertexShader.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_VERTEX_SHADER_H
+#define QT3DS_RENDER_VERTEX_SHADER_H
+
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderShader.h"
+
+namespace qt3ds {
+namespace render {
+ using namespace foundation;
+
+ class NVRenderContextImpl;
+
+ ///< This class represents a vertex shader
+ class NVRenderVertexShader : public NVRenderShader
+ {
+
+ public:
+ /**
+ * @brief constructor
+ *
+ * @param[in] context Pointer to render context
+ * @param[in] fnd Pointer to foundation
+ * @param[in] source Pointer to shader source code
+ * @param[in] binaryProgram true if this is a binary program
+ *
+ * @return No return.
+ */
+ NVRenderVertexShader(NVRenderContextImpl &context, NVFoundationBase &fnd,
+ NVConstDataRef<QT3DSI8> source, bool binaryProgram);
+
+ /// @brief destructor
+ ~NVRenderVertexShader();
+
+ /**
+ * @brief Query if shader compiled succesfuly
+ *
+ * @return True if shader is valid.
+ */
+ bool IsValid() override { return (m_ShaderHandle != NULL); }
+
+ /**
+ * @brief get the backend object handle
+ *
+ * @return the backend object handle.
+ */
+ virtual NVRenderBackend::NVRenderBackendVertexShaderObject GetShaderHandle()
+ {
+ return m_ShaderHandle;
+ }
+
+ private:
+ NVRenderBackend::NVRenderBackendVertexShaderObject
+ m_ShaderHandle; ///< opaque backend handle
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/Qt3DSRenderBackend.h b/src/render/backends/Qt3DSRenderBackend.h
new file mode 100644
index 0000000..12de5d8
--- /dev/null
+++ b/src/render/backends/Qt3DSRenderBackend.h
@@ -0,0 +1,2245 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_H
+#define QT3DS_RENDER_BACKEND_H
+
+/// @file Qt3DSRenderBackend.h
+/// NVRender backend definition.
+
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Qt3DSNoCopy.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSBounds3.h"
+#include <EASTL/string.h>
+
+#include <QtGui/qsurfaceformat.h>
+
+namespace qt3ds {
+namespace render {
+
+#define HandleToID_cast(staticType, dynamicType, handle) \
+ static_cast<staticType>(reinterpret_cast<dynamicType>(handle))
+
+ class NVRenderBackend : public NVRefCounted, public NoCopy
+ {
+
+ public:
+ /// opaque buffer object handle
+ typedef struct _NVRenderBackendBufferObject *NVRenderBackendBufferObject;
+ /// opaque attribute layout object handle
+ typedef struct _NVRenderBackendAttribLayoutObject *NVRenderBackendAttribLayoutObject;
+ /// opaque input assembler object handle
+ typedef struct _NVRenderBackendInputAssemblerObject *NVRenderBackendInputAssemblerObject;
+ /// opaque texture object handle
+ typedef struct _NVRenderBackendTextureObject *NVRenderBackendTextureObject;
+ /// opaque sampler object handle
+ typedef struct _NVRenderBackendSamplerObject *NVRenderBackendSamplerObject;
+ /// opaque renderbuffer object handle
+ typedef struct _NVRenderBackendRenderbufferObject *NVRenderBackendRenderbufferObject;
+ /// opaque framebuffer object handle
+ typedef struct _NVRenderBackendRenderTargetObject *NVRenderBackendRenderTargetObject;
+ /// opaque vertex shader object handle
+ typedef struct _NVRenderBackendVertexShaderObject *NVRenderBackendVertexShaderObject;
+ /// opaque fragment shader object handle
+ typedef struct _NVRenderBackendFragmentShaderObject *NVRenderBackendFragmentShaderObject;
+ /// opaque tesselation control shader object handle
+ typedef struct _NVRenderBackendTessControlShaderObject
+ *NVRenderBackendTessControlShaderObject;
+ /// opaque tesselation evaluation shader object handle
+ typedef struct _NVRenderBackendTessEvaluationShaderObject
+ *NVRenderBackendTessEvaluationShaderObject;
+ /// opaque geometry shader object handle
+ typedef struct _NVRenderBackendGeometryShaderObject *NVRenderBackendGeometryShaderObject;
+ /// opaque compute shader object handle
+ typedef struct _NVRenderBackendComputeShaderObject *NVRenderBackendComputeShaderObject;
+ /// opaque shader program object handle
+ typedef struct _NVRenderBackendShaderProgramObject *NVRenderBackendShaderProgramObject;
+ /// opaque depth stencil state object handle
+ typedef struct _NVRenderBackendDepthStencilStateObject
+ *NVRenderBackendDepthStencilStateObject;
+ /// opaque rasterizer state object handle
+ typedef struct _NVRenderBackendRasterizerStateObject *NVRenderBackendRasterizerStateObject;
+ /// opaque query object handle
+ typedef struct _NVRenderBackendQueryObject *NVRenderBackendQueryObject;
+ /// opaque sync object handle
+ typedef struct _NVRenderBackendSyncObject *NVRenderBackendSyncObject;
+ /// opaque sync object handle
+ typedef struct _NVRenderBackendProgramPipeline *NVRenderBackendProgramPipeline;
+ /// opaque sync object handle
+ typedef struct _NVRenderBackendPathObject *NVRenderBackendPathObject;
+
+ // backend capability caps
+ typedef struct
+ {
+ enum Enum {
+ ConstantBuffer, ///< Constant buffer support query
+ DepthStencilTexture, ///< depth stencil texture format suport query
+ DxtImages, ///< DXT image support query
+ FpRenderTarget, ///< render to floating point target support query
+ MsTexture, ///< Multisample texture support query
+ TexSwizzle, ///< Texture swizzle support query
+ FastBlits, ///< Hardware supports fast blits
+ Tessellation, ///< Hardware supports tessellation
+ Compute, ///< Hardware supports compute shader
+ Geometry, ///< Hardware supports geometry shader
+ SampleQuery, ///< Hardware supports query calls of type samples
+ TimerQuery, ///< Hardware supports query calls of type timer
+ CommandSync, ///< Hardware supports command sync object
+ TextureArray, ///< Hardware supports texture arrays
+ StorageBuffer, ///< Hardware supports shader storage buffers
+ AtomicCounterBuffer, ///< Hardware supports atomic counter buffers
+ ShaderImageLoadStore, ///< Hardware supports shader image load store operations
+ ProgramPipeline, ///< Driver supports separate programs
+ PathRendering, ///< Driver support path rendering
+ AdvancedBlend, ///< Driver supports advanced blend modes
+ BlendCoherency, ///< Hardware supports blend coherency
+ gpuShader5, // for high precision sampling
+ AdvancedBlendKHR, ///< Driver supports advanced blend modes
+ VertexArrayObject,
+ StandardDerivatives,
+ TextureLod
+ };
+ } NVRenderBackendCaps;
+
+ // backend queries
+ typedef struct
+ {
+ enum Enum {
+ MaxTextureSize, ///< Return max supported texture size
+ MaxTextureArrayLayers, ///< Return max supported layer count for texture arrays
+ MaxConstantBufferSlots, ///< Return max supported constant buffe slots for a single
+ ///shader stage
+ MaxConstantBufferBlockSize ///< Return max supported size for a single constant
+ ///buffer block
+ };
+ } NVRenderBackendQuery;
+
+ /// backend interface
+
+ /**
+ * @brief get the backend type
+ *
+ * @return true backend type
+ */
+ virtual NVRenderContextType GetRenderContextType() const = 0;
+
+ /**
+ * @brief get the version of the shading language
+ * @return version string, must be copied by clients to be retained.
+ */
+ virtual const char *GetShadingLanguageVersion() = 0;
+
+ /**
+ * @brief get maximum supported texture image units that
+ * can be used to access texture maps from the vertex shader and the fragment processor
+ *combined.
+ *
+ * @return max texture size
+ */
+ virtual QT3DSU32 GetMaxCombinedTextureUnits() = 0;
+
+ /**
+ * @brief query Backend capabilities
+ *
+ * @param[in] inCap CAPS flag to query
+ * @ConstantBuffer, @DepthStencilTexture, ...
+ *
+ * @return true if supported
+ */
+ virtual bool GetRenderBackendCap(NVRenderBackendCaps::Enum inCap) const = 0;
+
+ /**
+ * @brief query Backend values
+ *
+ * @param[in] inQuery Query flag to get value for
+ * @MaxTextureSize, @MaxTextureArrayLayers,
+ *...
+ * @param[in/out] params the query result is stored here
+ *
+ * @return no return
+ */
+ virtual void GetRenderBackendValue(NVRenderBackendQuery::Enum inQuery,
+ QT3DSI32 *params) const = 0;
+
+ /**
+ * @brief query for bit depth of the depth buffer
+ *
+ * @return depth buffer bitplanes
+ */
+ virtual QT3DSU32 GetDepthBits() const = 0;
+
+ /**
+ * @brief query for bit depth of the stencil buffer
+ *
+ * @return stencil buffer bitplanes
+ */
+ virtual QT3DSU32 GetStencilBits() const = 0;
+
+ /*
+ * @brief set a backend rende state
+ *
+ * @param[in] bEnable enable/disable state
+ * @param[in] value type of state
+ *
+ * @return no return
+ */
+ virtual void SetRenderState(bool bEnable, const NVRenderState::Enum value) = 0;
+
+ /**
+ * @brief get a backend rende state
+ *
+ * @param[in] value type of state
+ *
+ * @return true if state enabled otherwise false
+ */
+ virtual bool GetRenderState(const NVRenderState::Enum value) = 0;
+
+ /**
+ * @brief get current depth function
+ *
+ * @return active depth function
+ */
+ virtual NVRenderBoolOp::Enum GetDepthFunc() = 0;
+
+ /**
+ * @brief create a depth stencil state object
+ *
+ * @param[in] enableDepth enable depth test
+ * @param[in] depthMask enable depth writes
+ * @param[in] depthFunc depth compare function
+ * @param[in] enableStencil enable stencil test
+ * @param[in] stencilFuncFront stencil setup front faces
+ * @param[in] stencilFuncBack stencil setup back faces
+ * @param[in] depthStencilOpFront depth/stencil operations front faces
+ * @param[in] depthStencilOpBack depth/stencil operations back faces
+ *
+ * @return opaque handle to state object
+ */
+ virtual NVRenderBackendDepthStencilStateObject
+ CreateDepthStencilState(bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack) = 0;
+
+ /**
+ * @brief release a depth stencil state object
+ *
+ * @param[in] depthStencilState pointer to state object
+ *
+ * @return none
+ */
+ virtual void
+ ReleaseDepthStencilState(NVRenderBackendDepthStencilStateObject depthStencilState) = 0;
+
+ /**
+ * @brief create a rasterizer state object
+ *
+ * @param[in] depthBias any othe value than 0 enables depth bias
+ * @param[in] depthScale any othe value than 0 enables depth scale
+ * @param[in] cullFace select face to cull front or back
+ *
+ * @return opaque handle to state object
+ */
+ virtual NVRenderBackendRasterizerStateObject
+ CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale, NVRenderFaces::Enum cullFace) = 0;
+
+ /**
+ * @brief release a rasterizer state object
+ *
+ * @param[in] rasterizerState pointer to state object
+ *
+ * @return none
+ */
+ virtual void
+ ReleaseRasterizerState(NVRenderBackendRasterizerStateObject rasterizerState) = 0;
+
+ /**
+ * @brief set depth stencil state
+ *
+ * @param[in] depthStencilState pointer to state object
+ *
+ * @return none
+ */
+ virtual void
+ SetDepthStencilState(NVRenderBackendDepthStencilStateObject depthStencilState) = 0;
+
+ /**
+ * @brief set rasterizer state
+ *
+ * @param[in] rasterizerState pointer to state object
+ *
+ * @return none
+ */
+ virtual void SetRasterizerState(NVRenderBackendRasterizerStateObject rasterizerState) = 0;
+
+ /**
+ * @brief set current depth function
+ *
+ * @param[in] func type of function
+ *
+ * @return no return
+ */
+ virtual void SetDepthFunc(const NVRenderBoolOp::Enum func) = 0;
+
+ /**
+ * @brief query if depth write is enabled
+ *
+ * @return true if enabled
+ */
+ virtual bool GetDepthWrite() = 0;
+
+ /**
+ * @brief enable / disable depth writes
+ *
+ * @param[in] bEnable true for enable
+ *
+ * @return no return
+ */
+ virtual void SetDepthWrite(bool bEnable) = 0;
+
+ /**
+ * @brief enable / disable color channel writes
+ *
+ * @param[in] bRed true for enable red channel
+ * @param[in] bGreen true for enable green channel
+ * @param[in] bBlue true for enable blue channel
+ * @param[in] bAlpha true for enable alpha channel
+ *
+ * @return no return
+ */
+ virtual void SetColorWrites(bool bRed, bool bGreen, bool bBlue, bool bAlpha) = 0;
+
+ /**
+ * @brief enable / disable multisample rendering
+ *
+ * @param[in] bEnable true for enable
+ *
+ * @return no return
+ */
+ virtual void SetMultisample(bool bEnable) = 0;
+
+ /**
+ * @brief query blend functions
+ *
+ * @param[out] pBlendFuncArg blending functions
+ *
+ * @return no return
+ */
+ virtual void GetBlendFunc(NVRenderBlendFunctionArgument *pBlendFuncArg) = 0;
+
+ /**
+ * @brief set blend functions
+ *
+ * @param[in] pBlendFuncArg blending functions
+ *
+ * @return no return
+ */
+ virtual void SetBlendFunc(const NVRenderBlendFunctionArgument &blendFuncArg) = 0;
+
+ /**
+ * @brief set blend equation
+ *
+ * @param[in] pBlendEquArg blending equation
+ *
+ * @return no return
+ */
+ virtual void SetBlendEquation(const NVRenderBlendEquationArgument &pBlendEquArg) = 0;
+
+ /**
+ * @brief guarantee blend coherency
+ *
+ *
+ * @return no return
+ */
+ virtual void SetBlendBarrier(void) = 0;
+
+ /**
+ * @brief query scissor rectangle
+ *
+ * @param[out] pRect contains scissor rect
+ *
+ * @return no return
+ */
+ virtual void GetScissorRect(NVRenderRect *pRect) = 0;
+
+ /**
+ * @brief set scissor rectangle
+ *
+ * @param[out] pRect contains scissor rect
+ *
+ * @return no return
+ */
+ virtual void SetScissorRect(const NVRenderRect &rect) = 0;
+
+ /**
+ * @brief query viewport rectangle
+ *
+ * @param[out] pRect contains viewport rect
+ *
+ * @return no return
+ */
+ virtual void GetViewportRect(NVRenderRect *pRect) = 0;
+
+ /**
+ * @brief set viewport rectangle
+ *
+ * @param[out] pRect contains viewport rect
+ *
+ * @return no return
+ */
+ virtual void SetViewportRect(const NVRenderRect &rect) = 0;
+
+ /**
+ * @brief query viewport rectangle
+ *
+ * @param[in] clearColor clear color
+ *
+ * @return no return
+ */
+ virtual void SetClearColor(const QT3DSVec4 *pClearColor) = 0;
+
+ /**
+ * @brief query viewport rectangle
+ *
+ * @param[in] flags clear flags
+ *
+ * @return no return
+ */
+ virtual void Clear(NVRenderClearFlags flags) = 0;
+
+ /**
+ * @brief create a buffer object
+ *
+ * @param[in] size Size of the buffer
+ * @param[in] bindFlags Where to bind this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ *application.
+ *
+ * @return The created buffer object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendBufferObject CreateBuffer(size_t size,
+ NVRenderBufferBindFlags bindFlags,
+ NVRenderBufferUsageType::Enum usage,
+ const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief bind a buffer object
+ *
+ * @param[in] bo Pointer to buffer object
+ * @param[in] bindFlags Where to bind this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ *
+ * @return no return.
+ */
+ virtual void BindBuffer(NVRenderBackendBufferObject bo,
+ NVRenderBufferBindFlags bindFlags) = 0;
+
+ /**
+ * @brief Release a single buffer object
+ *
+ * @param[in] bo Pointer to buffer object
+ *
+ * @return no return.
+ */
+ virtual void ReleaseBuffer(NVRenderBackendBufferObject bo) = 0;
+
+ /**
+ * @brief update a whole buffer object
+ *
+ * @param[in] bo Pointer to buffer object
+ * @param[in] bindFlags Where to bind this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ * @param[in] size Size of the data buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ *application.
+ *
+ * @return no return.
+ */
+ virtual void UpdateBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags,
+ size_t size, NVRenderBufferUsageType::Enum usage,
+ const void *data) = 0;
+
+ /**
+ * @brief update a range of a buffer object
+ *
+ * @param[in] bo Pointer to buffer object
+ * @param[in] bindFlags Where to bind this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ * @param[in] size Size of the data buffer
+ * @param[in] usage Usage of the buffer (e.g. static, dynamic...)
+ * @param[in] data A pointer to the buffer data that is allocated by the
+ *application.
+ *
+ * @return no return.
+ */
+ virtual void UpdateBufferRange(NVRenderBackendBufferObject bo,
+ NVRenderBufferBindFlags bindFlags, size_t offset,
+ size_t size, const void *data) = 0;
+
+ /**
+ * @brief Get a pointer to the buffer data ( GL(ES) >= 3 only )
+ *
+ * @param[in] bo Pointer to buffer object
+ * @param[in] bindFlags Where to bind this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ * @param[in] offset Byte offset into the data buffer
+ * @param[in] length Byte length of mapping size
+ * @param[in] access Access of the buffer (e.g. read, write, ...)
+ *
+ * @return pointer to mapped data or null.
+ */
+ virtual void *MapBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags,
+ size_t offset, size_t length,
+ NVRenderBufferAccessFlags accessFlags) = 0;
+
+ /**
+ * @brief Unmap a previously mapped buffer ( GL(ES) >= 3 only )
+ * This functions transfers the content to the hardware buffer
+ *
+ * @param[in] bo Pointer to buffer object
+ * @param[in] bindFlags Where to bind this buffer (e.g. vertex, index, ...)
+ * For OpenGL this should be a single
+ *value
+ *
+ * @return true if successful
+ */
+ virtual bool UnmapBuffer(NVRenderBackendBufferObject bo,
+ NVRenderBufferBindFlags bindFlags) = 0;
+
+ /**
+ * @brief Set a memory barrier
+ *
+ * @param[in] barriers Flags for barriers
+ *
+ * @return no return.
+ */
+ virtual void SetMemoryBarrier(NVRenderBufferBarrierFlags barriers) = 0;
+
+ /**
+ * @brief create a query object
+ *
+ * @return The created query object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendQueryObject CreateQuery() = 0;
+
+ /**
+ * @brief delete query objects
+ *
+ * @param[in] qo Handle to query object
+ *
+ * @return no return
+ */
+ virtual void ReleaseQuery(NVRenderBackendQueryObject qo) = 0;
+
+ /**
+ * @brief Start query recording
+ *
+ * @param[in] qo Handle to query object
+ * @param[in] type Type of query
+ *
+ * @return no return
+ */
+ virtual void BeginQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) = 0;
+
+ /**
+ * @brief End query recording
+ *
+ * @param[in] qo Handle to query object
+ * @param[in] type Type of query
+ *
+ * @return no return
+ */
+ virtual void EndQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) = 0;
+
+ /**
+ * @brief Get a query result
+ *
+ * @param[in] qo Handle to query object
+ * @param[in] type Type of query
+ * @param[out] params Contains result of query regarding query type
+ *
+ * @return no return
+ */
+ virtual void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU32 *params) = 0;
+
+ /**
+ * @brief Get a query result
+ *
+ * @param[in] qo Handle to query object
+ * @param[in] type Type of query
+ * @param[out] params Contains result of query regarding query type 64 bit returns
+ *
+ * @return no return
+ */
+ virtual void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU64 *params) = 0;
+
+ /**
+ * @brief Record the GPU time using the query object
+ *
+ * @param[in] qo Handle to query object
+ *
+ * @return no return
+ */
+ virtual void SetQueryTimer(NVRenderBackendQueryObject qo) = 0;
+
+ /**
+ * @brief create a sync object and place it in the command queue
+ *
+ * @param[in] tpye Type to sync
+ * @param[in] syncFlags Currently unused
+ *
+ * @return The created sync object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendSyncObject CreateSync(NVRenderSyncType::Enum tpye,
+ NVRenderSyncFlags syncFlags) = 0;
+
+ /**
+ * @brief delete sync object
+ *
+ * @param[in] so Handle to sync object
+ *
+ * @return no return
+ */
+ virtual void ReleaseSync(NVRenderBackendSyncObject so) = 0;
+
+ /**
+ * @brief wait for sync object to be signaled
+ *
+ * @param[in] so Handle to sync object
+ * @param[in] syncFlags Currently unused
+ * @param[in] timeout Currently ignored
+ *
+ * @return no return
+ */
+ virtual void WaitSync(NVRenderBackendSyncObject so, NVRenderCommandFlushFlags syncFlags,
+ QT3DSU64 timeout) = 0;
+
+ /**
+ * @brief create a render target object
+ *
+ *
+ * @return The created render target object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendRenderTargetObject CreateRenderTarget() = 0;
+
+ /**
+ * @brief Release a single render target object
+ *
+ * @param[in] rto Pointer to render target object
+ *
+ * @return no return.
+ */
+ virtual void ReleaseRenderTarget(NVRenderBackendRenderTargetObject rto) = 0;
+
+ /**
+ * @brief Attach a renderbuffer object to the framebuffer
+ *
+ * @param[in] rto Pointer to render target object
+ * @param[in] attachment Attachment point (e.g COLOR0, DEPTH)
+ * @param[in] rbo Pointer to renderbuffer object
+ *
+ * @return no return.
+ */
+ virtual void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendRenderbufferObject rbo) = 0;
+
+ /**
+ * @brief Attach a texture object to the render target
+ *
+ * @param[in] rto Pointer to render target object
+ * @param[in] attachment Attachment point (e.g COLOR0, DEPTH)
+ * @param[in] to Pointer to texture object
+ * @param[in] target Attachment texture target
+ *
+ * @return no return.
+ */
+ virtual void RenderTargetAttach(
+ NVRenderBackendRenderTargetObject rto, NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target = NVRenderTextureTargetType::Texture2D) = 0;
+
+ /**
+ * @brief Attach a texture object to the render target
+ *
+ * @param[in] rto Pointer to render target object
+ * @param[in] attachment Attachment point (e.g COLOR0, DEPTH)
+ * @param[in] to Pointer to texture object
+ * @param[in] level Texture mip level
+ * @param[in] layer Texture layer or slice
+ *
+ * @return no return.
+ */
+ virtual void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to, QT3DSI32 level,
+ QT3DSI32 layer) = 0;
+
+ /**
+ * @brief Make a render target active
+ *
+ * @param[in] rto Pointer to render target object
+ *
+ * @return no return.
+ */
+ virtual void SetRenderTarget(NVRenderBackendRenderTargetObject rto) = 0;
+
+ /**
+ * @brief Check if a render target is ready for render
+ *
+ * @param[in] rto Pointer to render target object
+ *
+ * @return true if usable.
+ */
+ virtual bool RenderTargetIsValid(NVRenderBackendRenderTargetObject rto) = 0;
+
+ /**
+ * @brief Make a render target active for reading
+ *
+ * @param[in] rto Pointer to render target object
+ *
+ * @return no return.
+ */
+ virtual void SetReadTarget(NVRenderBackendRenderTargetObject rto) = 0;
+
+ /**
+ * @brief Set active buffers for drawing
+ *
+ * @param[in] rto Pointer to render target object
+ * @param[in] inDrawBufferSet Pointer to array of enabled render targets
+ *
+ * @return no return.
+ */
+ virtual void SetDrawBuffers(NVRenderBackendRenderTargetObject rto,
+ NVConstDataRef<QT3DSI32> inDrawBufferSet) = 0;
+
+ /**
+ * @brief Set active buffer for reading
+ *
+ * @param[in] rto Pointer to render target object
+ * @param[in] inReadFace Buffer to read from
+ *
+ * @return no return.
+ */
+ virtual void SetReadBuffer(NVRenderBackendRenderTargetObject rto,
+ NVReadFaces::Enum inReadFace) = 0;
+
+ /**
+ * @brief Copy framebuffer attachments. Source is set with SetReadTarget dest with
+ * SetRenderTarget
+ *
+ * @param[in] srcX0 Lower left X coord of source rectangle
+ * @param[in] srcY0 Lower left Y coord of source rectangle
+ * @param[in] srcX1 Upper right X coord of source rectangle
+ * @param[in] srcY1 Upper right Y coord of source rectangle
+ * @param[in] dstX0 Lower left X coord of dest rectangle
+ * @param[in] dstY0 Lower left Y coord of dest rectangle
+ * @param[in] dstX1 Upper right X coord of dest rectangle
+ * @param[in] dstY1 Upper right Y coord of dest rectangle
+ * @param[in] inDrawBufferSet pointer to array of enabled render targets
+ * @param[in] filter Copy filter method (NEAREST or LINEAR)
+ *
+ * @return no return.
+ */
+ virtual void BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter) = 0;
+
+ /**
+ * @brief create a render buffer object
+ *
+ * @param[in] storageFormat Format of the buffer
+ * @param[in] width Buffer with
+ * @param[in] height Buffer height
+ *
+ * @return The created render buffer object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendRenderbufferObject
+ CreateRenderbuffer(NVRenderRenderBufferFormats::Enum storageFormat, size_t width,
+ size_t height) = 0;
+
+ /**
+ * @brief Release a single renderbuffer object
+ *
+ * @param[in] bo Pointer to renderbuffer object
+ *
+ * @return no return.
+ */
+ virtual void ReleaseRenderbuffer(NVRenderBackendRenderbufferObject rbo) = 0;
+
+ /**
+ * @brief resize a render buffer object
+ *
+ * @param[in] storageFormat Format of the buffer
+ * @param[in] width Buffer with
+ * @param[in] height Buffer height
+ *
+ * @return True on success
+ */
+ virtual bool ResizeRenderbuffer(NVRenderBackendRenderbufferObject rbo,
+ NVRenderRenderBufferFormats::Enum storageFormat,
+ size_t width, size_t height) = 0;
+
+ /**
+ * @brief create a texture object
+ *
+ * @return The created texture object or NULL if the creation failed..
+ */
+ virtual NVRenderBackendTextureObject CreateTexture() = 0;
+
+ /**
+ * @brief set texture data for a 2D texture
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] level Texture mip level
+ * @param[in] internalFormat format of the texture
+ * @param[in] width texture width
+ * @param[in] height texture height
+ * @param[in] border border
+ * @param[in] format format of provided pixel data
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return
+ */
+ virtual void SetTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width,
+ size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief set texture data for the face of a Cube map
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target face
+ * @param[in] level Texture mip level
+ * @param[in] internalFormat format of the texture
+ * @param[in] width texture width
+ * @param[in] height texture height
+ * @param[in] border border
+ * @param[in] format format of provided pixel data
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return
+ */
+ virtual void SetTextureDataCubeFace(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief create a storage for a 2D texture including mip levels
+ * Note that this makes texture immutable in size and format
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] levels Texture mip level count
+ * @param[in] internalFormat format of the texture
+ * @param[in] width texture width
+ * @param[in] height texture height
+ *
+ * @return No return
+ */
+ virtual void CreateTextureStorage2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 levels,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height) = 0;
+
+ /**
+ * @brief set texture sub data for a 2D texture
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] level Texture mip level
+ * @param[in] xOffset Texture x offset
+ * @param[in] yOffset Texture y offset
+ * @param[in] width Texture width
+ * @param[in] height Texture height
+ * @param[in] border border
+ * @param[in] format format of texture
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return
+ */
+ virtual void SetTextureSubData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ QT3DSI32 xOffset, QT3DSI32 yOffset, size_t width, size_t height,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief set compressed texture data for a 2D texture
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] level Texture mip level
+ * @param[in] internalFormat format of the texture
+ * @param[in] width texture width
+ * @param[in] height texture height
+ * @param[in] border border
+ * @param[in] imageSize image size in bytes located at hostPtr
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return
+ */
+ virtual void SetCompressedTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height, QT3DSI32 border,
+ size_t imageSize, const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief set compressed texture data for a Cubemap face
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] level Texture mip level
+ * @param[in] internalFormat format of the texture
+ * @param[in] width texture width
+ * @param[in] height texture height
+ * @param[in] border border
+ * @param[in] imageSize image size in bytes located at hostPtr
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return
+ */
+ virtual void SetCompressedTextureDataCubeFace(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ size_t imageSize, const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief set compressed texture sub data for a 2D texture
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] level Texture mip level
+ * @param[in] xOffset Texture x offset
+ * @param[in] yOffset Texture y offset
+ * @param[in] width texture width
+ * @param[in] height texture height
+ * @param[in] format format of provided pixel data
+ * @param[in] imageSize image size in bytes located at hostPtr
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return
+ */
+ virtual void SetCompressedTextureSubData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ QT3DSI32 xOffset, QT3DSI32 yOffset, size_t width, size_t height,
+ NVRenderTextureFormats::Enum format, size_t imageSize, const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief establish a multisampled 2D texture
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D MS
+ * @param[in] samples Textures sample count
+ * @param[in] internalFormat Format of the texture
+ * @param[in] width Texture width
+ * @param[in] height Texture height
+ * @param[in] bool Fixed sample locations
+ *
+ * @return No return
+ */
+ virtual void SetMultisampledTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ size_t samples,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height,
+ bool fixedsamplelocations) = 0;
+
+ /**
+ * @brief set texture data for a 3D texture or 2D texture array
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] level Texture mip level
+ * @param[in] internalFormat format of the texture
+ * @param[in] width texture width
+ * @param[in] height texture height
+ * @param[in] depth texture depth or slice count
+ * @param[in] border border
+ * @param[in] format format of provided pixel data
+ * @param[in] hostPtr A pointer to the buffer data that is allocated by the
+ * application.
+ *
+ * @return No return
+ */
+ virtual void SetTextureData3D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width,
+ size_t height, size_t depth, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) = 0;
+
+ /**
+ * @brief generate mipmap levels
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Texture target 2D,...
+ * @param[in] hint How to generate mips (Nicest)
+ *
+ * @return No return
+ */
+ virtual void GenerateMipMaps(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderHint::Enum genType) = 0;
+
+ /**
+ * @brief bind a texture object
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] target Where to bind this texture (e.g. 2D, 3D, ...)
+ * @param[in] unit Which unit to bind this texture
+ *
+ * @return no return.
+ */
+ virtual void BindTexture(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 unit) = 0;
+
+ /**
+ * @brief bind a image/texture object
+ *
+ * @param[in] to Pointer to texture object
+ * @param[in] unit Which unit to bind this texture
+ * @param[in] level Which level to bind
+ * @param[in] layered Bind layered texture (cube map, array,... )
+ * @param[in] level Specify layer. Only valid of layered=false.
+ * @param[in] access Access mode ( read, write, read-write )
+ * @param[in] format Texture format must be compatible with Image format
+ *
+ * @return no return.
+ */
+ virtual void BindImageTexture(NVRenderBackendTextureObject to, QT3DSU32 unit, QT3DSI32 level,
+ bool layered, QT3DSI32 layer,
+ NVRenderImageAccessType::Enum accessFlags,
+ NVRenderTextureFormats::Enum format) = 0;
+
+ /**
+ * @brief Release a single texture object
+ *
+ * @param[in] to Pointer to buffer object
+ *
+ * @return no return.
+ */
+ virtual void ReleaseTexture(NVRenderBackendTextureObject to) = 0;
+
+ /**
+ * @brief query texture swizzle mode
+ * This is mainly for luminance, alpha replacement with R8 formats
+ *
+ * @param[in] inFormat input texture format to check
+ *
+ * @return texture swizzle mode
+ */
+ virtual NVRenderTextureSwizzleMode::Enum
+ GetTextureSwizzleMode(const NVRenderTextureFormats::Enum inFormat) const = 0;
+
+ /**
+ * @ brief create a sampler
+ *
+ * @param[in] minFilter Texture min filter
+ * @param[in] magFilter Texture mag filter
+ * @param[in] wrapS Texture coord generation for S
+ * @param[in] wrapT Texture coord generation for T
+ * @param[in] wrapR Texture coord generation for R
+ * @param[in] minLod Texture min level of detail
+ * @param[in] maxLod Texture max level of detail
+ * @param[in] lodBias Texture level of detail example
+ * @param[in] compareMode Texture compare mode
+ * @param[in] compareFunc Texture compare function
+ * @param[in] anisoFilter Aniso filter value [1.0, 16.0]
+ * @param[in] borderColor Texture border color float[4]
+ *
+ * @return The created sampler object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendSamplerObject CreateSampler(
+ NVRenderTextureMinifyingOp::Enum minFilter = NVRenderTextureMinifyingOp::Linear,
+ NVRenderTextureMagnifyingOp::Enum magFilter = NVRenderTextureMagnifyingOp::Linear,
+ NVRenderTextureCoordOp::Enum wrapS = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapT = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapR = NVRenderTextureCoordOp::ClampToEdge,
+ QT3DSI32 minLod = -1000, QT3DSI32 maxLod = 1000, QT3DSF32 lodBias = 0.0,
+ NVRenderTextureCompareMode::Enum compareMode = NVRenderTextureCompareMode::NoCompare,
+ NVRenderTextureCompareOp::Enum compareFunc = NVRenderTextureCompareOp::LessThanOrEqual,
+ QT3DSF32 anisotropy = 1.0, QT3DSF32 *borderColor = NULL) = 0;
+
+ /**
+ * @ brief update a sampler
+ *
+ * @param[in] so Pointer to sampler object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] minFilter Texture min filter
+ * @param[in] magFilter Texture mag filter
+ * @param[in] wrapS Texture coord generation for S
+ * @param[in] wrapT Texture coord generation for T
+ * @param[in] wrapR Texture coord generation for R
+ * @param[in] minLod Texture min level of detail
+ * @param[in] maxLod Texture max level of detail
+ * @param[in] lodBias Texture level of detail bias (unused)
+ * @param[in] compareMode Texture compare mode
+ * @param[in] compareFunc Texture compare function
+ * @param[in] anisoFilter Aniso filter value [1.0, 16.0]
+ * @param[in] borderColor Texture border color float[4] (unused)
+ *
+ * @return No return
+ */
+ virtual void UpdateSampler(
+ NVRenderBackendSamplerObject so, NVRenderTextureTargetType::Enum target,
+ NVRenderTextureMinifyingOp::Enum minFilter = NVRenderTextureMinifyingOp::Linear,
+ NVRenderTextureMagnifyingOp::Enum magFilter = NVRenderTextureMagnifyingOp::Linear,
+ NVRenderTextureCoordOp::Enum wrapS = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapT = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapR = NVRenderTextureCoordOp::ClampToEdge,
+ QT3DSF32 minLod = -1000.0, QT3DSF32 maxLod = 1000.0, QT3DSF32 lodBias = 0.0,
+ NVRenderTextureCompareMode::Enum compareMode = NVRenderTextureCompareMode::NoCompare,
+ NVRenderTextureCompareOp::Enum compareFunc = NVRenderTextureCompareOp::LessThanOrEqual,
+ QT3DSF32 anisotropy = 1.0, QT3DSF32 *borderColor = NULL) = 0;
+
+ /**
+ * @ brief Update a textures swizzle mode
+ *
+ * @param[in] so Pointer to texture object
+ * @param[in] target Texture target 2D, 3D
+ * @param[in] swizzleMode Texture swizzle mode
+ *
+ * @return No return
+ */
+ virtual void UpdateTextureSwizzle(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderTextureSwizzleMode::Enum swizzleMode) = 0;
+
+ /**
+ * @ brief Update state belonging to a texture object
+ *
+ * @param[in] so Pointer to texture object
+ * @param[in] target Texture target 2D, 3D, Cube
+ * @param[in] baseLevel Texture base level
+ * @param[in] maxLevel Texture max level
+ *
+ * @return No return
+ */
+ virtual void UpdateTextureObject(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSI32 baseLevel,
+ QT3DSI32 maxLevel) = 0;
+
+ /**
+ * @brief Release a single sampler object
+ *
+ * @param[in] so Pointer to sampler object
+ *
+ * @return no return.
+ */
+ virtual void ReleaseSampler(NVRenderBackendSamplerObject so) = 0;
+
+ /**
+ * @brief create a attribute layout object
+ *
+ * @param[in] attribs Array off vertex attributes.
+ *
+ * @return The created attribute layout object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendAttribLayoutObject
+ CreateAttribLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs) = 0;
+
+ /**
+ * @brief Release a attribute layoutr object
+ *
+ * @param[in] ao Pointer to attribute layout object
+ *
+ * @return no return.
+ */
+ virtual void ReleaseAttribLayout(NVRenderBackendAttribLayoutObject ao) = 0;
+
+ /**
+ * @brief create a input assembler object
+ *
+ * @param[in] attribLayout Pointer to NVRenderBackendAttribLayoutObject object
+ * @param[in] buffers list of vertex buffers
+ * @param[in] indexBuffer index buffer object
+ * @param[in] strides list of strides of the buffer
+ * @param[in] offsets list of offsets into the buffer
+ * @param[in] patchVertexCount vertext count for a patch. Only valid for patch primitives
+ *
+ * @return The created input assembler object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendInputAssemblerObject
+ CreateInputAssembler(NVRenderBackendAttribLayoutObject attribLayout,
+ NVConstDataRef<NVRenderBackendBufferObject> buffers,
+ const NVRenderBackendBufferObject indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets,
+ QT3DSU32 patchVertexCount) = 0;
+
+ /**
+ * @brief Release a input assembler object
+ *
+ * @param[in] iao Pointer to attribute layout object
+ *
+ * @return no return.
+ */
+ virtual void ReleaseInputAssembler(NVRenderBackendInputAssemblerObject iao) = 0;
+
+ /**
+ * @brief Set a input assembler object.
+ * This setup the render engine vertex assmebly
+ *
+ * @param[in] iao Pointer to attribute layout object
+ * @param[in] po Pointer program object
+ *
+ * @return false if it fails.
+ */
+ virtual bool SetInputAssembler(NVRenderBackendInputAssemblerObject iao,
+ NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief Set the per patch vertex count
+ *
+ * @param[in] iao Pointer to attribute layout object
+ * @param[in] count Count of vertices per patch
+ *
+ * @return false if it fails.
+ */
+ virtual void SetPatchVertexCount(NVRenderBackendInputAssemblerObject iao, QT3DSU32 count) = 0;
+
+ /**
+ * @brief create a vertex shader object
+ *
+ * @param[in] source Pointer to shader source
+ * @param[in/out] errorMessage Pointer to copy the error message
+ * @param[in] binary True if the source is actually a binary program
+ *
+ * @return The created vertex shader object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendVertexShaderObject CreateVertexShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage,
+ bool binary) = 0;
+
+ /**
+ * @brief release a vertex shader object
+ *
+ * @param[in] vso Pointer to vertex shader object
+ *
+ * @return No Return.
+ */
+ virtual void ReleaseVertexShader(NVRenderBackendVertexShaderObject vso) = 0;
+
+ /**
+ * @brief create a fragment shader object
+ *
+ * @param[in] source Pointer to shader source
+ * @param[in/out] errorMessage Pointer to copy the error message
+ * @param[in] binary True if the source is actually a binary program
+ *
+ * @return The created vertex shader object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendFragmentShaderObject
+ CreateFragmentShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) = 0;
+
+ /**
+ * @brief release a fragment shader object
+ *
+ * @param[in] vso Pointer to fragment shader object
+ *
+ * @return No Return.
+ */
+ virtual void ReleaseFragmentShader(NVRenderBackendFragmentShaderObject fso) = 0;
+
+ /**
+ * @brief create a tessellation control shader object
+ *
+ * @param[in] source Pointer to shader source
+ * @param[in/out] errorMessage Pointer to copy the error message
+ * @param[in] binary True if the source is actually a binary program
+ *
+ * @return The created tessellation control shader object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendTessControlShaderObject
+ CreateTessControlShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) = 0;
+
+ /**
+ * @brief release a tessellation control shader object
+ *
+ * @param[in] tcso Pointer to tessellation control shader object
+ *
+ * @return No Return.
+ */
+ virtual void ReleaseTessControlShader(NVRenderBackendTessControlShaderObject tcso) = 0;
+
+ /**
+ * @brief create a tessellation evaluation shader object
+ *
+ * @param[in] source Pointer to shader source
+ * @param[in/out] errorMessage Pointer to copy the error message
+ * @param[in] binary True if the source is actually a binary program
+ *
+ * @return The created tessellation evaluation shader object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendTessEvaluationShaderObject
+ CreateTessEvaluationShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) = 0;
+
+ /**
+ * @brief release a tessellation evaluation shader object
+ *
+ * @param[in] tcso Pointer to tessellation evaluation shader object
+ *
+ * @return No Return.
+ */
+ virtual void
+ ReleaseTessEvaluationShader(NVRenderBackendTessEvaluationShaderObject teso) = 0;
+
+ /**
+ * @brief create a geometry shader object
+ *
+ * @param[in] source Pointer to shader source
+ * @param[in/out] errorMessage Pointer to copy the error message
+ * @param[in] binary True if the source is actually a binary program
+ *
+ * @return The created geometry shader object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendGeometryShaderObject
+ CreateGeometryShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) = 0;
+
+ /**
+ * @brief release a geometry shader object
+ *
+ * @param[in] tcso Pointer to geometry shader object
+ *
+ * @return No Return.
+ */
+ virtual void ReleaseGeometryShader(NVRenderBackendGeometryShaderObject gso) = 0;
+
+ /**
+ * @brief create a compute shader object
+ *
+ * @param[in] source Pointer to shader source
+ * @param[in/out] errorMessage Pointer to copy the error message
+ * @param[in] binary True if the source is actually a binary program
+ *
+ * @return The created compute shader object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendComputeShaderObject CreateComputeShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage,
+ bool binary) = 0;
+
+ /**
+ * @brief release a compute shader object
+ *
+ * @param[in] cso Pointer to compute shader object
+ *
+ * @return No Return.
+ */
+ virtual void ReleaseComputeShader(NVRenderBackendComputeShaderObject cso) = 0;
+
+ /**
+ * @brief attach a vertex shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] vso Pointer to vertex shader object
+ *
+ * @return No Return.
+ */
+ virtual void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendVertexShaderObject vso) = 0;
+
+ /**
+ * @brief detach a vertex shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] vso Pointer to vertex shader object
+ *
+ * @return No Return.
+ */
+ virtual void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendVertexShaderObject vso) = 0;
+
+ /**
+ * @brief attach a fragment shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] fso Pointer to fragment shader object
+ *
+ * @return No Return.
+ */
+ virtual void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendFragmentShaderObject fso) = 0;
+
+ /**
+ * @brief detach a fragment shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] fso Pointer to fragment shader object
+ *
+ * @return No Return.
+ */
+ virtual void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendFragmentShaderObject fso) = 0;
+
+ /**
+ * @brief attach a tessellation control shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] tcso Pointer to tessellation control shader object
+ *
+ * @return No Return.
+ */
+ virtual void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessControlShaderObject tcso) = 0;
+
+ /**
+ * @brief detach a tessellation control shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] tcso Pointer to tessellation control shader object
+ *
+ * @return No Return.
+ */
+ virtual void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessControlShaderObject tcso) = 0;
+
+ /**
+ * @brief attach a tessellation evaluation shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] teso Pointer to tessellation evaluation shader object
+ *
+ * @return No Return.
+ */
+ virtual void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessEvaluationShaderObject teso) = 0;
+
+ /**
+ * @brief detach a tessellation evaluation shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] teso Pointer to tessellation evaluation shader object
+ *
+ * @return No Return.
+ */
+ virtual void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessEvaluationShaderObject teso) = 0;
+
+ /**
+ * @brief attach a geometry shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] teso Pointer to geometry shader object
+ *
+ * @return No Return.
+ */
+ virtual void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendGeometryShaderObject gso) = 0;
+
+ /**
+ * @brief detach a geometry shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] teso Pointer to geometry shader object
+ *
+ * @return No Return.
+ */
+ virtual void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendGeometryShaderObject gso) = 0;
+
+ /**
+ * @brief attach a compute shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] cso Pointer to compute shader object
+ *
+ * @return No Return.
+ */
+ virtual void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendComputeShaderObject cso) = 0;
+
+ /**
+ * @brief detach a compute shader object to a program object
+ *
+ * @param[in] po Pointer to program object
+ * @param[in] cso Pointer to compute shader object
+ *
+ * @return No Return.
+ */
+ virtual void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendComputeShaderObject cso) = 0;
+
+ /**
+ * @brief create a shader program object
+ *
+ * @param[in] isSeparable Tell the backend that this program is separable
+ *
+ * @return The created shader program object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendShaderProgramObject CreateShaderProgram(bool isSeparable) = 0;
+
+ /**
+ * @brief release a shader program object
+ *
+ * @param[in] po Pointer to shader program object
+ *
+ * @return No Return.
+ */
+ virtual void ReleaseShaderProgram(NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief link a shader program object
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in/out] errorMessage Pointer to copy the error message
+ *
+ * @return True if program is succesful linked.
+ */
+ virtual bool LinkProgram(NVRenderBackendShaderProgramObject po,
+ eastl::string &errorMessage) = 0;
+
+ /**
+ * @brief Make a program current
+ *
+ * @param[in] po Pointer to shader program object
+ *
+ * @return No return
+ */
+ virtual void SetActiveProgram(NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief create a program pipeline object
+ *
+ *
+ * @return The created program pipeline object or NULL if the creation failed.
+ */
+ virtual NVRenderBackendProgramPipeline CreateProgramPipeline() = 0;
+
+ /**
+ * @brief release a program pipeline object
+ *
+ * @param[in] ppo Pointer to program pipeline object
+ *
+ * @return No Return.
+ */
+ virtual void ReleaseProgramPipeline(NVRenderBackendProgramPipeline ppo) = 0;
+
+ /**
+ * @brief Make a program pipeline current
+ *
+ * @param[in] ppo Pointer to program pipeline object
+ *
+ * @return No return
+ */
+ virtual void SetActiveProgramPipeline(NVRenderBackendProgramPipeline ppo) = 0;
+
+ /**
+ * @brief Make a program stage active for this pipeline
+ *
+ * @param[in] ppo Pointer to program pipeline object
+ * @param[in] flags Shader stage flags to which this po is bound to
+ * @param[in] po Pointer to shader program object
+ *
+ * @return No return
+ */
+ virtual void SetProgramStages(NVRenderBackendProgramPipeline ppo,
+ NVRenderShaderTypeFlags flags,
+ NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief Runs a compute program
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] numGroupsX The number of work groups to be launched in the X
+ * dimension
+ * @param[in] numGroupsY The number of work groups to be launched in the Y
+ * dimension
+ * @param[in] numGroupsZ The number of work groups to be launched in the Z
+ * dimension
+ *
+ * @return No return
+ */
+ virtual void DispatchCompute(NVRenderBackendShaderProgramObject po, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ) = 0;
+
+ /**
+ * @brief Query constant count for a program object
+ *
+ * @param[in] po Pointer to shader program object
+ *
+ * @return Return active constant count
+ */
+ virtual QT3DSI32 GetConstantCount(NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief Query constant buffer count for a program object
+ *
+ * @param[in] po Pointer to shader program object
+ *
+ * @return Return active constant buffer count
+ */
+ virtual QT3DSI32 GetConstantBufferCount(NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief Query constant information by ID
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] id Constant ID
+ * @param[in] bufSize Max char for nameBuf
+ * @param[out] numElem Usually one unless for arrays
+ * @param[out] type Constant data type (QT3DSVec4, QT3DSVec3,...)
+ * @param[out] binding Unit binding point for samplers and images
+ * @param[out] nameBuf Name of the constant
+ *
+ * @return Return current constant location or -1 if not found
+ */
+ virtual QT3DSI32 GetConstantInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 bufSize, QT3DSI32 *numElem,
+ NVRenderShaderDataTypes::Enum *type, QT3DSI32 *binding,
+ char *nameBuf) = 0;
+
+ /**
+ * @brief Query constant buffer information by ID
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] id Constant buffer ID
+ * @param[in] nameBufSize Size of nameBuf
+ * @param[out] paramCount Count ot parameter contained in the buffer
+ * @param[out] bufferSize Data size of the constant buffer
+ * @param[out] length Actual characters written
+ * @param[out] nameBuf Receives the name of the buffer
+ *
+ * @return Return current constant buffer location or -1 if not found
+ */
+ virtual QT3DSI32 GetConstantBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length,
+ char *nameBuf) = 0;
+
+ /**
+ * @brief Query constant buffer param indices
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] id Constant buffer ID
+ * @param[out] indices Receives the indices of the uniforms within the
+ * constant buffer
+ *
+ * @return no return value
+ */
+ virtual void GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSI32 *indices) = 0;
+
+ /**
+ * @brief Query constant buffer param info by indices
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] count Number of indices
+ * @param[in] indices The indices of the uniforms within the constant
+ * buffer
+ * @param[out] type Array of param types ( float ,int, ...)
+ * @param[out] size Array of param size
+ * @param[out] offset Array of param offsets within the constant buffer
+ *
+ * @return no return value
+ */
+ virtual void GetConstantBufferParamInfoByIndices(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 count, QT3DSU32 *indices, QT3DSI32 *type,
+ QT3DSI32 *size, QT3DSI32 *offset) = 0;
+
+ /**
+ * @brief Bind program constant block
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] blockIndex Constant block index returned by
+ * GetConstantBufferInfoByID
+ * @param[in] binding Block binding location which should be the same as index
+ * in ProgramSetConstantBlock
+ *
+ * @return No return
+ */
+ virtual void ProgramSetConstantBlock(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 blockIndex, QT3DSU32 binding) = 0;
+
+ /**
+ * @brief Bind constant buffer for usage in the current active shader program
+ *
+ * @param[in] index Constant ID
+ * @param[in] bo Pointer to constant buffer object
+ *
+ * @return No return
+ */
+ virtual void ProgramSetConstantBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) = 0;
+
+ /**
+ * @brief Query storage buffer count for a program object
+ *
+ * @param[in] po Pointer to shader program object
+ *
+ * @return Return active storage buffer count
+ */
+ virtual QT3DSI32 GetStorageBufferCount(NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief Query storage buffer information by ID
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] id Storage buffer ID
+ * @param[in] nameBufSize Size of nameBuf
+ * @param[out] paramCount Count of parameter contained in the buffer
+ * @param[out] bufferSize Data size of the constant buffer
+ * @param[out] length Actual characters written
+ * @param[out] nameBuf Receives the name of the buffer
+ *
+ * @return Return current storage buffer binding or -1 if not found
+ */
+ virtual QT3DSI32 GetStorageBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length, char *nameBuf) = 0;
+
+ /**
+ * @brief Bind a storage buffer for usage in the current active shader program
+ *
+ * @param[in] index Constant ID
+ * @param[in] bo Pointer to storage buffer object
+ *
+ * @return No return
+ */
+ virtual void ProgramSetStorageBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) = 0;
+
+ /**
+ * @brief Query atomic counter buffer count for a program object
+ *
+ * @param[in] po Pointer to shader program object
+ *
+ * @return Return active atomic buffer count
+ */
+ virtual QT3DSI32 GetAtomicCounterBufferCount(NVRenderBackendShaderProgramObject po) = 0;
+
+ /**
+ * @brief Query atomic counter buffer information by ID
+ *
+ * @param[in] po Pointer to shader program object
+ * @param[in] id Storage buffer ID
+ * @param[in] nameBufSize Size of nameBuf
+ * @param[out] paramCount Count of parameter contained in the buffer
+ * @param[out] bufferSize Data size of the constant buffer
+ * @param[out] length Actual characters written
+ * @param[out] nameBuf Receives the name of the buffer
+ *
+ * @return Return current storage buffer binding or -1 if not found
+ */
+ virtual QT3DSI32 GetAtomicCounterBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length,
+ char *nameBuf) = 0;
+
+ /**
+ * @brief Bind a atomic counter buffer for usage in the current active shader program
+ *
+ * @param[in] index Constant ID
+ * @param[in] bo Pointer to atomic counter buffer object
+ *
+ * @return No return
+ */
+ virtual void ProgramSetAtomicCounterBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) = 0;
+
+ /**
+ * @brief Set constant value
+ *
+ * @param[in] po Pointer program object
+ * @param[in] id Constant ID
+ * @param[in] type Constant data type (QT3DSVec4, QT3DSVec3,...)
+ * @param[in] count Element count
+ * @param[in] value Pointer to constant value
+ * @param[in] transpose Transpose a matrix
+ *
+ * @return No return
+ */
+ virtual void SetConstantValue(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ NVRenderShaderDataTypes::Enum type, QT3DSI32 count,
+ const void *value, bool transpose = false) = 0;
+
+ /**
+ * @brief Draw the current active vertex buffer
+ *
+ * @param[in] drawMode Draw mode (Triangles, ....)
+ * @param[in] start Start vertex
+ * @param[in] count Vertex count
+ *
+ * @return no return.
+ */
+ virtual void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 start, QT3DSU32 count) = 0;
+
+ /**
+ * @brief Draw the current active vertex buffer using an indirect buffer
+ * This means the setup of the draw call is stored in a buffer bound to
+ * NVRenderBufferBindValues::Draw_Indirect
+ *
+ * @param[in] drawMode Draw mode (Triangles, ....)
+ * @param[in] indirect Offset into a indirect drawing setup buffer
+ *
+ * @return no return.
+ */
+ virtual void DrawIndirect(NVRenderDrawMode::Enum drawMode, const void *indirect) = 0;
+
+ /**
+ * @brief Draw the current active index buffer
+ *
+ * @param[in] drawMode Draw mode (Triangles, ....)
+ * @param[in] count Index count
+ * @param[in] type Index type (QT3DSU16, QT3DSU8)
+ * @param[in] indices Pointer to index buffer. In the case of buffer objects
+ * this is an offset into the active index buffer
+ *object.
+ *
+ * @return no return.
+ */
+ virtual void DrawIndexed(NVRenderDrawMode::Enum drawMode, QT3DSU32 count,
+ NVRenderComponentTypes::Enum type, const void *indices) = 0;
+
+ /**
+ * @brief Draw the current active index buffer using an indirect buffer
+ * This means the setup of the draw call is stored in a buffer bound to
+ * NVRenderBufferBindValues::Draw_Indirect
+ *
+ * @param[in] drawMode Draw mode (Triangles, ....)
+ * @param[in] type Index type (QT3DSU16, QT3DSU8)
+ * @param[in] indices Offset into a indirect drawing setup buffer
+ *
+ * @return no return.
+ */
+ virtual void DrawIndexedIndirect(NVRenderDrawMode::Enum drawMode,
+ NVRenderComponentTypes::Enum type,
+ const void *indirect) = 0;
+
+ /**
+ * @brief Read a pixel rectangle from render target (from bottom left)
+ *
+ * @param[in] rto Pointer to render target object
+ * @param[in] x Windows X start coord
+ * @param[in] y Windows Y start coord
+ * @param[in] width Read width dim
+ * @param[in] height Read height dim
+ * @param[out] pixels Returned pixel data
+ *
+ * @return No return
+ */
+ virtual void ReadPixel(NVRenderBackendRenderTargetObject rto, QT3DSI32 x, QT3DSI32 y, QT3DSI32 width,
+ QT3DSI32 height, NVRenderReadPixelFormats::Enum inFormat,
+ void *pixels) = 0;
+
+ /**
+ * @brief Create a NV path render object
+ *
+ * @param[in] range Number of internal objects
+ *
+ * @return return path object on success or NULL
+ */
+ virtual NVRenderBackendPathObject CreatePathNVObject(size_t range) = 0;
+
+ /**
+ * @brief Relase a NV path render object
+ *
+ * @param[in] po Created path object
+ * @param[in] range Number of internal objects
+ *
+ * @return return path object on success or NULL
+ */
+ virtual void ReleasePathNVObject(NVRenderBackendPathObject po, size_t range) = 0;
+
+ /**
+ * @brief Set the path commands and data.
+ *
+ * @param[in] inPathObject Pointer to NV path object
+ * @param[in] inPathCommands vector of path commands ( moveTo,... )
+ * @param[in] inPathCoords vector of path coords
+ *
+ * @return No return
+ */
+ virtual void SetPathSpecification(NVRenderBackendPathObject inPathObject,
+ NVConstDataRef<QT3DSU8> inPathCommands,
+ NVConstDataRef<QT3DSF32> inPathCoords) = 0;
+
+ /**
+ * @brief Get Bounds of the path object
+ *
+ * @param[in] inPathObject Pointer to NV path object
+ *
+ * @return return bounds
+ */
+ virtual NVBounds3 GetPathObjectBoundingBox(NVRenderBackendPathObject inPathObject) = 0;
+ virtual NVBounds3 GetPathObjectFillBox(NVRenderBackendPathObject inPathObject) = 0;
+ virtual NVBounds3 GetPathObjectStrokeBox(NVRenderBackendPathObject inPathObject) = 0;
+
+ /**
+ * @brief Set stroke width. Defaults to 0 if unset.
+ *
+ * @param[in] inPathObject Pointer to NV path object
+ *
+ * @return No return
+ */
+ virtual void SetStrokeWidth(NVRenderBackendPathObject inPathObject,
+ QT3DSF32 inStrokeWidth) = 0;
+
+ /**
+ * @brief Path transform commands
+ *
+ * @param[in] inPathObject Pointer to NV path object
+ *
+ * @return No return
+ */
+ virtual void SetPathProjectionMatrix(const QT3DSMat44 inPathProjection) = 0;
+ virtual void SetPathModelViewMatrix(const QT3DSMat44 inPathModelview) = 0;
+
+ /**
+ * @brief Path stencil pass operations
+ *
+ * @param[in] inPathObject Pointer to NV path object
+ *
+ * @return No return
+ */
+ virtual void StencilStrokePath(NVRenderBackendPathObject inPathObject) = 0;
+ virtual void StencilFillPath(NVRenderBackendPathObject inPathObject) = 0;
+
+ /**
+ * @brief Does a instanced stencil fill pass
+ *
+ * @param[in] po Base of path objects
+ * @param[in] numPaths Number path objects
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes charachter string
+ * @param[in] fillMode Fille mode
+ * @param[in] stencilMask Stencil mask
+ * @param[in] transformType Transforming glyphs
+ * @param[in] transformValues Pointer to array of transforms
+ *
+ * @return No return
+ */
+ virtual void StencilFillPathInstanced(
+ NVRenderBackendPathObject po, size_t numPaths, NVRenderPathFormatType::Enum type,
+ const void *charCodes, NVRenderPathFillMode::Enum fillMode, QT3DSU32 stencilMask,
+ NVRenderPathTransformType::Enum transformType, const QT3DSF32 *transformValues) = 0;
+
+ /**
+ * @brief Does a instanced stencil stroke pass
+ *
+ * @param[in] po Base of path objects
+ * @param[in] numPaths Number path objects
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes charachter string
+ * @param[in] stencilRef Stencil reference
+ * @param[in] stencilMask Stencil mask
+ * @param[in] transformType Transforming glyphs
+ * @param[in] transformValues Pointer to array of transforms
+ *
+ * @return No return
+ */
+ virtual void StencilStrokePathInstancedN(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathFormatType::Enum type,
+ const void *charCodes, QT3DSI32 stencilRef,
+ QT3DSU32 stencilMask,
+ NVRenderPathTransformType::Enum transformType,
+ const QT3DSF32 *transformValues) = 0;
+
+ /**
+ * @brief Does a instanced cover fill pass
+ *
+ * @param[in] po Base of path objects
+ * @param[in] numPaths Number path objects
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes charachter string
+ * @param[in] coverMode Cover mode
+ * @param[in] transformType Transforming glyphs
+ * @param[in] transformValues Pointer to array of transforms
+ *
+ * @return No return
+ */
+ virtual void CoverFillPathInstanced(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathFormatType::Enum type,
+ const void *charCodes,
+ NVRenderPathCoverMode::Enum coverMode,
+ NVRenderPathTransformType::Enum transformType,
+ const QT3DSF32 *transformValues) = 0;
+
+ /**
+ * @brief Does a instanced cover stroke pass
+ *
+ * @param[in] po Base of path objects
+ * @param[in] numPaths Number path objects
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes charachter string
+ * @param[in] coverMode Cover mode
+ * @param[in] transformType Transforming glyphs
+ * @param[in] transformValues Pointer to array of transforms
+ *
+ * @return No return
+ */
+ virtual void CoverStrokePathInstanced(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathFormatType::Enum type,
+ const void *charCodes,
+ NVRenderPathCoverMode::Enum coverMode,
+ NVRenderPathTransformType::Enum transformType,
+ const QT3DSF32 *transformValues) = 0;
+
+ /**
+ * @brief Path stencil and depth offset
+ *
+ * @param[in] inSlope slope
+ * @param[in] inBias bias
+ *
+ * @return No return
+ */
+ virtual void SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias) = 0;
+
+ /**
+ * @brief Path cover function
+ *
+ * @param[in] inDepthFunction depth function
+ *
+ * @return No return
+ */
+ virtual void SetPathCoverDepthFunc(NVRenderBoolOp::Enum inDepthFunction) = 0;
+
+ /**
+ * @brief Load glyphs
+ *
+ * @param[in] po Base of path objects
+ * @param[in] fontTarget System font, or application font,...
+ * @param[in] fontName Name of font ( may include path )
+ * @param[in] fontStyle Bold or italic
+ * @param[in] numGlyphs Glyph count
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes charachter string
+ * @param[in] handleMissingGlyphs skip or use
+ * @param[in] pathParameterTemplate template
+ * @param[in] emScale scale ( true type scale e.g. 2048 )
+ *
+ * @return No return
+ */
+ virtual void LoadPathGlyphs(NVRenderBackendPathObject po,
+ NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle, size_t numGlyphs,
+ NVRenderPathFormatType::Enum type, const void *charCodes,
+ NVRenderPathMissingGlyphs::Enum handleMissingGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate,
+ QT3DSF32 emScale) = 0;
+
+ /**
+ * @brief Load indexed font set
+ *
+ * @param[in] po Base of path objects
+ * @param[in] fontTarget System font, or application font,...
+ * @param[in] fontName Name of font ( may include path )
+ * @param[in] fontStyle Bold or italic
+ * @param[in] firstGlyphIndex First glyph
+ * @param[in] numGlyphs Glyph count
+ * @param[in] pathParameterTemplate template
+ * @param[in] emScale scale ( true type scale e.g. 2048 )
+ *
+ * @return return load status
+ */
+ virtual NVRenderPathReturnValues::Enum
+ LoadPathGlyphsIndexed(NVRenderBackendPathObject po, NVRenderPathFontTarget::Enum fontTarget,
+ const void *fontName, NVRenderPathFontStyleFlags fontStyle,
+ QT3DSU32 firstGlyphIndex, size_t numGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale) = 0;
+
+ /**
+ * @brief Load indexed font set
+ *
+ * @param[in] fontTarget System font, or application font,...
+ * @param[in] fontName Name of font ( may include path )
+ * @param[in] fontStyle Bold or italic
+ * @param[in] pathParameterTemplate template
+ * @param[in] emScale scale ( true type scale e.g. 2048 )
+ * @param[out] po contains glyph count
+ *
+ * @return returnr base path object
+ */
+ virtual NVRenderBackendPathObject
+ LoadPathGlyphsIndexedRange(NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale,
+ QT3DSU32 *count) = 0;
+
+ /**
+ * @brief Load font set
+ *
+ * @param[in] po Base of path objects
+ * @param[in] fontTarget System font, or application font,...
+ * @param[in] fontName Name of font ( may include path )
+ * @param[in] fontStyle Bold or italic
+ * @param[in] firstGlyph First glyph
+ * @param[in] numGlyphs Glyph count
+ * @param[in] handleMissingGlyphs skip or use
+ * @param[in] pathParameterTemplate template
+ * @param[in] emScale scale ( true type scale e.g. 2048 )
+ *
+ * @return No return
+ */
+ virtual void LoadPathGlyphRange(NVRenderBackendPathObject po,
+ NVRenderPathFontTarget::Enum fontTarget,
+ const void *fontName, NVRenderPathFontStyleFlags fontStyle,
+ QT3DSU32 firstGlyph, size_t numGlyphs,
+ NVRenderPathMissingGlyphs::Enum handleMissingGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate,
+ QT3DSF32 emScale) = 0;
+
+ /**
+ * @brief Query font metrics
+ *
+ * @param[in] po Base of path objects
+ * @param[in] numPaths Number path objects
+ * @param[in] metricQueryMask Qeury bit mask
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes charachter string
+ * @param[in] stride scale ( true type scale e.g. 2048 )
+ * @param[out] metrics Filled with font metric values
+ *
+ * @return No return
+ */
+ virtual void GetPathMetrics(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathGlyphFontMetricFlags metricQueryMask,
+ NVRenderPathFormatType::Enum type, const void *charCodes,
+ size_t stride, QT3DSF32 *metrics) = 0;
+
+ /**
+ * @brief Query font metrics
+ *
+ * @param[in] po Base of path objects
+ * @param[in] numPaths Number path objects
+ * @param[in] metricQueryMask Qeury bit mask
+ * @param[in] stride scale ( true type scale e.g. 2048 )
+ * @param[out] metrics Filled with font metric values
+ *
+ * @return No return
+ */
+ virtual void GetPathMetricsRange(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathGlyphFontMetricFlags metricQueryMask,
+ size_t stride, QT3DSF32 *metrics) = 0;
+
+ /**
+ * @brief Query path spacing
+ *
+ * @param[in] po Base of path objects
+ * @param[in] numPaths Number path objects
+ * @param[in] pathListMode How to compute spacing
+ * @param[in] type type ( byte, int,... )
+ * @param[in] charCodes charachter string
+ * @param[in] advanceScale
+ * @param[in] kerningScale
+ * @param[in] transformType
+ * @param[out] metrics Filled with font metric values
+ *
+ * @return No return
+ */
+ virtual void GetPathSpacing(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathListMode::Enum pathListMode,
+ NVRenderPathFormatType::Enum type, const void *charCodes,
+ QT3DSF32 advanceScale, QT3DSF32 kerningScale,
+ NVRenderPathTransformType::Enum transformType,
+ QT3DSF32 *spacing) = 0;
+
+ virtual QSurfaceFormat format() const = 0;
+
+ protected:
+ /// struct for what the backend supports
+ typedef struct NVRenderBackendSupport
+ {
+ union {
+ struct
+ {
+ bool bDXTImagesSupported : 1; ///< compressed images supported
+ bool bAnistropySupported : 1; ///< anistropic filtering supported
+ bool bTextureSwizzleSupported : 1; ///< texture swizzle supported
+ bool bDepthStencilSupported : 1; ///< depth stencil textures are supported
+ bool bFPRenderTargetsSupported : 1; ///< floating point render targets are
+ ///supported
+ bool bConstantBufferSupported : 1; ///< Constant (uniform) buffers are supported
+ bool bMsTextureSupported : 1; ///< Multisample textures are esupported
+ bool bFastBlitsSupported : 1; ///< The hardware supports fast memor blits
+ bool bTessellationSupported : 1; ///< Hardware supports tessellation
+ bool bComputeSupported : 1; ///< Hardware supports compute shader
+ bool bGeometrySupported : 1; ///< Hardware supports geometry shader
+ bool bTimerQuerySupported : 1; ///< Hardware supports timer queries
+ bool bProgramInterfaceSupported : 1; ///< API supports program interface queries
+ bool bStorageBufferSupported : 1; ///< Shader storage buffers are supported
+ bool bAtomicCounterBufferSupported : 1; ///< Atomic counter buffers are
+ /// supported
+ bool bShaderImageLoadStoreSupported : 1; ///< Shader image load / store
+ ///operations are supported
+ bool bProgramPipelineSupported : 1; ///< Driver supports separate programs
+ bool bNVPathRenderingSupported : 1; ///< Driver NV path rendering
+ bool bNVAdvancedBlendSupported : 1; ///< Advanced blend modes supported
+ bool bNVBlendCoherenceSupported : 1; ///< Advanced blend done coherently
+ ///supported
+ bool bGPUShader5ExtensionSupported : 1;
+ bool bKHRAdvancedBlendSupported : 1; ///< Advanced blend modes supported
+ bool bKHRBlendCoherenceSupported : 1; ///< Advanced blend done coherently
+ bool bVertexArrayObjectSupported : 1;
+ bool bStandardDerivativesSupported : 1;
+ bool bTextureLodSupported : 1;
+ } bits;
+
+ QT3DSU32 u32Values;
+ } caps;
+ } NVRenderBackendSupportBits;
+
+ NVRenderBackendSupportBits m_backendSupport; ///< holds the backend support bits
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Q3DSRenderBackendGLES2.cpp b/src/render/backends/gl/Q3DSRenderBackendGLES2.cpp
new file mode 100644
index 0000000..ac5b992
--- /dev/null
+++ b/src/render/backends/gl/Q3DSRenderBackendGLES2.cpp
@@ -0,0 +1,902 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/backends/gl/Q3DSRenderBackendGLES2.h"
+#include "render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h"
+#include "render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h"
+#include "render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h"
+
+#include <QtGui/qopenglcontext.h>
+
+#ifdef RENDER_BACKEND_LOG_GL_ERRORS
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError(#x, __FILE__, __LINE__)
+#else
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError()
+#endif
+
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+#define GL_CALL_TIMER_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_TESSELATION_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_MULTISAMPLE_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_EXTRA_FUNCTION(x) m_glExtraFunctions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_EXTENSION_FUNCTION(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#else
+#define GL_CALL_TIMER_EXT(x)
+#define GL_CALL_TESSELATION_EXT(x)
+#define GL_CALL_MULTISAMPLE_EXT(x)
+#define GL_CALL_EXTRA_FUNCTION(x) m_glExtraFunctions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_EXTENSION_FUNCTION(x)
+#endif
+
+#ifndef GL_DEPTH_STENCIL_OES
+#define GL_DEPTH_STENCIL_OES 0x84F9
+#endif
+
+namespace qt3ds {
+namespace render {
+
+/// constructor
+NVRenderBackendGLES2Impl::NVRenderBackendGLES2Impl(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format)
+ : NVRenderBackendGLBase(fnd, stringTable, format)
+{
+ QString exts3tc = QStringLiteral("GL_EXT_texture_compression_s3tc");
+ QString extsdxt = QStringLiteral("GL_EXT_texture_compression_dxt1");
+ QString extsAniso = QStringLiteral("GL_EXT_texture_filter_anisotropic");
+ QString extsTexSwizzle = QStringLiteral("GL_ARB_texture_swizzle");
+ QString extsFPRenderTarget = QStringLiteral("GL_EXT_color_buffer_float");
+ QString extsTimerQuery = QStringLiteral("GL_EXT_timer_query");
+ QString extsGpuShader5 = QStringLiteral("EXT_gpu_shader5");
+ QString extDepthTexture = QStringLiteral("GL_OES_packed_depth_stencil");
+ QString extvao = QStringLiteral("GL_OES_vertex_array_object");
+ QString extStdDd = QStringLiteral("GL_OES_standard_derivatives");
+ QString extTexLod = QStringLiteral("GL_EXT_shader_texture_lod");
+
+ const char *languageVersion = GetShadingLanguageVersion();
+ qCInfo(TRACE_INFO, "GLSL version: %s", languageVersion);
+
+ eastl::string apiVersion(getVersionString());
+ qCInfo(TRACE_INFO, "GL version: %s", apiVersion.c_str());
+
+ eastl::string apiVendor(getVendorString());
+ qCInfo(TRACE_INFO, "HW vendor: %s", apiVendor.c_str());
+
+ eastl::string apiRenderer(getRendererString());
+ qCInfo(TRACE_INFO, "Vendor renderer: %s", apiRenderer.c_str());
+
+ // clear support bits
+ m_backendSupport.caps.u32Values = 0;
+
+ const char *extensions = getExtensionString();
+ m_extensions = QString::fromLocal8Bit(extensions).split(" ");
+
+ // get extension count
+ GLint numExtensions = m_extensions.size();
+
+ for (QT3DSI32 i = 0; i < numExtensions; i++) {
+
+ const QString &extensionString = m_extensions.at(i);
+
+ // search for extension
+ if (!m_backendSupport.caps.bits.bDXTImagesSupported
+ && (exts3tc.compare(extensionString) == 0 || extsdxt.compare(extensionString) == 0)) {
+ m_backendSupport.caps.bits.bDXTImagesSupported = true;
+ } else if (!m_backendSupport.caps.bits.bAnistropySupported
+ && extsAniso.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bAnistropySupported = true;
+ } else if (!m_backendSupport.caps.bits.bFPRenderTargetsSupported
+ && extsFPRenderTarget.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bFPRenderTargetsSupported = true;
+ } else if (!m_backendSupport.caps.bits.bTimerQuerySupported
+ && extsTimerQuery.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bTimerQuerySupported = true;
+ } else if (!m_backendSupport.caps.bits.bGPUShader5ExtensionSupported
+ && extsGpuShader5.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bGPUShader5ExtensionSupported = true;
+ } else if (!m_backendSupport.caps.bits.bTextureSwizzleSupported
+ && extsTexSwizzle.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bTextureSwizzleSupported = true;
+ } else if (!m_backendSupport.caps.bits.bDepthStencilSupported
+ && extDepthTexture.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bDepthStencilSupported = true;
+ } else if (!m_backendSupport.caps.bits.bVertexArrayObjectSupported
+ && extvao.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bVertexArrayObjectSupported = true;
+ } else if (!m_backendSupport.caps.bits.bStandardDerivativesSupported
+ && extStdDd.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bStandardDerivativesSupported = true;
+ } else if (!m_backendSupport.caps.bits.bTextureLodSupported
+ && extTexLod.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bTextureLodSupported = true;
+ }
+ }
+
+ qCInfo(TRACE_INFO, "OpenGL extensions: %s", extensions);
+
+ // constant buffers support is always not true
+ m_backendSupport.caps.bits.bConstantBufferSupported = false;
+
+ // query hardware
+ GL_CALL_EXTRA_FUNCTION(glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &m_MaxAttribCount));
+
+ // internal state tracker
+ m_pCurrentMiscState = QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendMiscStateGL)();
+
+ // finally setup caps based on device
+ setAndInspectHardwareCaps();
+
+ // Initialize extensions
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+ m_qt3dsExtensions = new Qt3DSOpenGLES2Extensions;
+ m_qt3dsExtensions->initializeOpenGLFunctions();
+#endif
+}
+/// destructor
+NVRenderBackendGLES2Impl::~NVRenderBackendGLES2Impl()
+{
+ if (m_pCurrentMiscState)
+ NVDelete(m_Foundation.getAllocator(), m_pCurrentMiscState);
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+ if (m_qt3dsExtensions)
+ delete m_qt3dsExtensions;
+#endif
+}
+
+void NVRenderBackendGLES2Impl::SetMultisampledTextureData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, size_t samples,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height,
+ bool fixedsamplelocations)
+{
+ NVRENDER_BACKEND_UNUSED(to);
+ NVRENDER_BACKEND_UNUSED(target);
+ NVRENDER_BACKEND_UNUSED(samples);
+ NVRENDER_BACKEND_UNUSED(internalFormat);
+ NVRENDER_BACKEND_UNUSED(width);
+ NVRENDER_BACKEND_UNUSED(height);
+ NVRENDER_BACKEND_UNUSED(fixedsamplelocations);
+}
+
+void NVRenderBackendGLES2Impl::SetTextureData3D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, size_t depth,
+ QT3DSI32 border, NVRenderTextureFormats::Enum format, const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+ bool conversionRequired = format != internalFormat;
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
+ internalFormat, swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat)) {
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+ }
+
+ if (conversionRequired) {
+ GLenum dummy;
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, dummy);
+ } else if (NVRenderTextureFormats::isCompressedTextureFormat(internalFormat)) {
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ glInternalFormat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
+ } else if (NVRenderTextureFormats::isDepthTextureFormat(format)) {
+ m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ }
+
+ GL_CALL_EXTRA_FUNCTION(glTexImage3D(glTarget, level, glInternalFormat, (GLsizei)width,
+ (GLsizei)height, (GLsizei)depth, border, glformat,
+ gltype, hostPtr));
+
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+void NVRenderBackendGLES2Impl::SetTextureData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format, const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+ bool conversionRequired = format != internalFormat;
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
+ internalFormat, swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat)) {
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+ glInternalFormat = glformat;
+ }
+
+ if (conversionRequired) {
+ GLenum dummy;
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, dummy);
+ } else if (NVRenderTextureFormats::isCompressedTextureFormat(internalFormat)) {
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ glInternalFormat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
+ } else if (NVRenderTextureFormats::isDepthTextureFormat(format)) {
+ m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ if (format == NVRenderTextureFormats::Depth24Stencil8) {
+ glformat = GL_DEPTH_STENCIL_OES;
+ gltype = GL_UNSIGNED_INT_24_8;
+ }
+ glInternalFormat = glformat;
+ }
+
+ Q_ASSERT(glformat == glInternalFormat);
+ GL_CALL_EXTRA_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width,
+ (GLsizei)height, border, glformat, gltype, hostPtr));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+void NVRenderBackendGLES2Impl::UpdateSampler(
+ NVRenderBackendSamplerObject /* so */, NVRenderTextureTargetType::Enum target,
+ NVRenderTextureMinifyingOp::Enum minFilter, NVRenderTextureMagnifyingOp::Enum magFilter,
+ NVRenderTextureCoordOp::Enum wrapS, NVRenderTextureCoordOp::Enum wrapT,
+ NVRenderTextureCoordOp::Enum wrapR, QT3DSF32 minLod, QT3DSF32 maxLod, QT3DSF32 lodBias,
+ NVRenderTextureCompareMode::Enum compareMode, NVRenderTextureCompareOp::Enum compareFunc,
+ QT3DSF32 anisotropy, QT3DSF32 *borderColor)
+{
+
+ // Satisfy the compiler
+ // These are not available in GLES 3 and we don't use them right now
+ QT3DS_ASSERT(lodBias == 0.0);
+ QT3DS_ASSERT(!borderColor);
+ NVRENDER_BACKEND_UNUSED(lodBias);
+ NVRENDER_BACKEND_UNUSED(borderColor);
+ NVRENDER_BACKEND_UNUSED(wrapR);
+ NVRENDER_BACKEND_UNUSED(minLod);
+ NVRENDER_BACKEND_UNUSED(maxLod);
+ NVRENDER_BACKEND_UNUSED(compareMode);
+ NVRENDER_BACKEND_UNUSED(compareFunc);
+
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MIN_FILTER,
+ m_Conversion.fromTextureMinifyingOpToGL(minFilter)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MAG_FILTER,
+ m_Conversion.fromTextureMagnifyingOpToGL(magFilter)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_S,
+ m_Conversion.fromTextureCoordOpToGL(wrapS)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_T,
+ m_Conversion.fromTextureCoordOpToGL(wrapT)));
+
+ if (m_backendSupport.caps.bits.bAnistropySupported) {
+ GL_CALL_EXTRA_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ anisotropy));
+ }
+}
+
+void NVRenderBackendGLES2Impl::UpdateTextureObject(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ QT3DSI32 baseLevel, QT3DSI32 maxLevel)
+{
+ NVRENDER_BACKEND_UNUSED(to);
+
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_BASE_LEVEL, baseLevel));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MAX_LEVEL, maxLevel));
+}
+
+void NVRenderBackendGLES2Impl::UpdateTextureSwizzle(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderTextureSwizzleMode::Enum swizzleMode)
+{
+ NVRENDER_BACKEND_UNUSED(to);
+ NVRENDER_BACKEND_UNUSED(target);
+ NVRENDER_BACKEND_UNUSED(swizzleMode);
+#if defined(QT_OPENGL_ES)
+ if (m_backendSupport.caps.bits.bTextureSwizzleSupported) {
+ GLint glSwizzle[4];
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ m_Conversion.NVRenderConvertSwizzleModeToGL(swizzleMode, glSwizzle);
+
+ // since ES3 spec has no GL_TEXTURE_SWIZZLE_RGBA set it separately
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_R, glSwizzle[0]));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_G, glSwizzle[1]));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_B, glSwizzle[2]));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_A, glSwizzle[3]));
+
+ }
+#endif
+}
+
+QT3DSU32
+NVRenderBackendGLES2Impl::GetDepthBits() const
+{
+ QT3DSI32 depthBits;
+ GL_CALL_EXTRA_FUNCTION(
+ glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+ GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, &depthBits));
+
+ return depthBits;
+}
+
+QT3DSU32
+NVRenderBackendGLES2Impl::GetStencilBits() const
+{
+ QT3DSI32 stencilBits;
+ GL_CALL_EXTRA_FUNCTION(
+ glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER,
+ GL_DEPTH_ATTACHMENT,
+ GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,
+ &stencilBits));
+
+ return stencilBits;
+}
+
+void NVRenderBackendGLES2Impl::GenerateMipMaps(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderHint::Enum /*genType*/)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+ GL_CALL_EXTRA_FUNCTION(glGenerateMipmap(glTarget));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+bool NVRenderBackendGLES2Impl::SetInputAssembler(NVRenderBackendInputAssemblerObject iao,
+ NVRenderBackendShaderProgramObject po)
+{
+ if (iao == nullptr) {
+ // unbind and return;
+ GL_CALL_EXTENSION_FUNCTION(glBindVertexArrayOES(0));
+ return true;
+ }
+
+ NVRenderBackendInputAssemblerGL *inputAssembler = (NVRenderBackendInputAssemblerGL *)iao;
+ NVRenderBackendAttributeLayoutGL *attribLayout = inputAssembler->m_attribLayout;
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+ NVDataRef<NVRenderBackendShaderInputEntryGL> shaderAttribBuffer;
+ if (pProgram->m_shaderInput)
+ shaderAttribBuffer = pProgram->m_shaderInput->m_ShaderInputEntries;
+
+ if ((attribLayout->m_LayoutAttribEntries.size() < shaderAttribBuffer.size())
+ || (inputAssembler->m_VertexbufferHandles.size() <= attribLayout->m_MaxInputSlot)) {
+ return false;
+ }
+
+ if (inputAssembler->m_VaoID == 0) {
+ // generate vao
+ GL_CALL_EXTENSION_FUNCTION(glGenVertexArraysOES(1, &inputAssembler->m_VaoID));
+ QT3DS_ASSERT(inputAssembler->m_VaoID);
+ }
+
+ if (inputAssembler->m_cachedShaderHandle != programID) {
+ GL_CALL_EXTENSION_FUNCTION(glBindVertexArrayOES(inputAssembler->m_VaoID));
+ inputAssembler->m_cachedShaderHandle = programID;
+
+ QT3DS_FOREACH(idx, shaderAttribBuffer.size())
+ {
+ const NVRenderBackendShaderInputEntryGL &attrib(shaderAttribBuffer[idx]);
+ NVRenderBackendLayoutEntryGL *entry =
+ attribLayout->getEntryByName(attrib.m_AttribName);
+
+ if (entry) {
+ NVRenderBackendLayoutEntryGL &entryData(*entry);
+ if (entryData.m_Type != attrib.m_Type
+ || entryData.m_NumComponents != attrib.m_NumComponents) {
+ qCCritical(INVALID_OPERATION, "Attrib %s dn't match vertex layout",
+ attrib.m_AttribName.c_str());
+ QT3DS_ASSERT(false);
+ return false;
+ } else {
+ entryData.m_AttribIndex = attrib.m_AttribLocation;
+ }
+ } else {
+ qCWarning(WARNING, "Failed to Bind attribute %s", attrib.m_AttribName.c_str());
+ }
+ }
+
+ // disable max possible used first
+ // this is currently sufficient since we always re-arrange input attributes from 0
+ for (QT3DSU32 i = 0; i < attribLayout->m_LayoutAttribEntries.size(); i++)
+ GL_CALL_EXTRA_FUNCTION(glDisableVertexAttribArray(i));
+
+ // setup all attribs
+ QT3DS_FOREACH(idx, shaderAttribBuffer.size())
+ {
+ NVRenderBackendLayoutEntryGL *entry =
+ attribLayout->getEntryByName(shaderAttribBuffer[idx].m_AttribName);
+ if (entry) {
+ const NVRenderBackendLayoutEntryGL &entryData(*entry);
+ GLuint id = HandleToID_cast(
+ GLuint, size_t,
+ inputAssembler->m_VertexbufferHandles.mData[entryData.m_InputSlot]);
+ GL_CALL_EXTRA_FUNCTION(glBindBuffer(GL_ARRAY_BUFFER, id));
+ GL_CALL_EXTRA_FUNCTION(glEnableVertexAttribArray(entryData.m_AttribIndex));
+ GLuint offset = inputAssembler->m_offsets[entryData.m_InputSlot];
+ GLuint stride = inputAssembler->m_strides[entryData.m_InputSlot];
+ GL_CALL_EXTRA_FUNCTION(glVertexAttribPointer(
+ entryData.m_AttribIndex, entryData.m_NumComponents, GL_FLOAT, GL_FALSE,
+ stride, (const void *)(entryData.m_Offset + offset)));
+
+ } else {
+ GL_CALL_EXTRA_FUNCTION(glDisableVertexAttribArray(idx));
+ }
+ }
+
+ // setup index buffer.
+ if (inputAssembler->m_IndexbufferHandle) {
+ GL_CALL_EXTRA_FUNCTION(glBindBuffer(
+ GL_ELEMENT_ARRAY_BUFFER,
+ HandleToID_cast(GLuint, size_t, inputAssembler->m_IndexbufferHandle)));
+ } else {
+ GL_CALL_EXTRA_FUNCTION(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+ }
+ } else {
+ GL_CALL_EXTENSION_FUNCTION(glBindVertexArrayOES(inputAssembler->m_VaoID));
+ }
+#ifdef _DEBUG
+ if (inputAssembler->m_VaoID) {
+ QT3DS_FOREACH(idx, shaderAttribBuffer.size())
+ {
+ const NVRenderBackendShaderInputEntryGL &attrib(shaderAttribBuffer[idx]);
+ NVRenderBackendLayoutEntryGL *entry =
+ attribLayout->getEntryByName(attrib.m_AttribName);
+
+ if (entry) {
+ NVRenderBackendLayoutEntryGL &entryData(*entry);
+ if (entryData.m_Type != attrib.m_Type
+ || entryData.m_NumComponents != attrib.m_NumComponents
+ || entryData.m_AttribIndex != attrib.m_AttribLocation) {
+ qCCritical(INVALID_OPERATION, "Attrib %s dn't match vertex layout",
+ attrib.m_AttribName.c_str());
+ QT3DS_ASSERT(false);
+ }
+ } else {
+ qCWarning(WARNING, "Failed to Bind attribute %s", attrib.m_AttribName.c_str());
+ }
+ }
+ }
+#endif // _DEBUG
+
+ return true;
+}
+
+void NVRenderBackendGLES2Impl::ReleaseInputAssembler(
+ NVRenderBackend::NVRenderBackendInputAssemblerObject iao)
+{
+ NVRenderBackendInputAssemblerGL *inputAssembler = (NVRenderBackendInputAssemblerGL *)iao;
+ if (inputAssembler->m_VaoID)
+ GL_CALL_EXTENSION_FUNCTION(glDeleteVertexArraysOES(1, &inputAssembler->m_VaoID));
+ NVDelete(m_Foundation.getAllocator(), inputAssembler);
+}
+
+void NVRenderBackendGLES2Impl::SetDrawBuffers(NVRenderBackendRenderTargetObject rto,
+ NVConstDataRef<QT3DSI32> inDrawBufferSet)
+{
+ NVRENDER_BACKEND_UNUSED(rto);
+
+ m_DrawBuffersArray.clear();
+
+ for (QT3DSU32 idx = 0, end = inDrawBufferSet.size(); idx < end; ++idx) {
+ if (inDrawBufferSet[idx] < 0)
+ m_DrawBuffersArray.push_back(GL_NONE);
+ else
+ m_DrawBuffersArray.push_back(GL_COLOR_ATTACHMENT0 + inDrawBufferSet[idx]);
+ }
+
+ GL_CALL_EXTRA_FUNCTION(glDrawBuffers((int)m_DrawBuffersArray.size(),
+ m_DrawBuffersArray.data()));
+}
+
+void NVRenderBackendGLES2Impl::SetReadBuffer(NVRenderBackendRenderTargetObject rto,
+ NVReadFaces::Enum inReadFace)
+{
+ NVRENDER_BACKEND_UNUSED(rto);
+ NVRENDER_BACKEND_UNUSED(inReadFace);
+}
+
+void NVRenderBackendGLES2Impl::RenderTargetAttach(NVRenderBackendRenderTargetObject,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to, QT3DSI32 level,
+ QT3DSI32 layer)
+{
+ NVRENDER_BACKEND_UNUSED(attachment);
+ NVRENDER_BACKEND_UNUSED(to);
+ NVRENDER_BACKEND_UNUSED(level);
+ NVRENDER_BACKEND_UNUSED(layer);
+ Q_ASSERT(false);
+}
+
+void NVRenderBackendGLES2Impl::BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1,
+ QT3DSI32 srcY1, QT3DSI32 dstX0, QT3DSI32 dstY0,
+ QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter)
+{
+ GL_CALL_EXTRA_FUNCTION(glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1,
+ dstY1,
+ m_Conversion.fromClearFlagsToGL(flags),
+ m_Conversion.fromTextureMagnifyingOpToGL(filter)));
+}
+
+
+NVRenderBackend::NVRenderBackendRenderTargetObject NVRenderBackendGLES2Impl::CreateRenderTarget()
+{
+ GLuint fboID = 0;
+ GL_CALL_EXTRA_FUNCTION(glGenFramebuffers(1, &fboID));
+ return (NVRenderBackend::NVRenderBackendRenderTargetObject)fboID;
+}
+
+void NVRenderBackendGLES2Impl::ReleaseRenderTarget(NVRenderBackendRenderTargetObject rto)
+{
+ GLuint fboID = HandleToID_cast(GLuint, size_t, rto);
+
+ if (fboID)
+ GL_CALL_EXTRA_FUNCTION(glDeleteFramebuffers(1, &fboID));
+}
+
+void NVRenderBackendGLES2Impl::RenderTargetAttach(NVRenderBackendRenderTargetObject /* rto */,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendRenderbufferObject rbo)
+{
+ // rto must be the current render target
+ GLuint rbID = HandleToID_cast(GLuint, size_t, rbo);
+
+ GLenum glAttach = GLConversion::fromFramebufferAttachmentsToGL(attachment);
+
+ GL_CALL_EXTRA_FUNCTION(glFramebufferRenderbuffer(GL_FRAMEBUFFER, glAttach, GL_RENDERBUFFER,
+ rbID));
+}
+
+void NVRenderBackendGLES2Impl::RenderTargetAttach(NVRenderBackendRenderTargetObject /* rto */,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target)
+{
+ // rto must be the current render target
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+
+ QT3DS_ASSERT(target == NVRenderTextureTargetType::Texture2D
+ || m_backendSupport.caps.bits.bMsTextureSupported);
+
+ GLenum glAttach = GLConversion::fromFramebufferAttachmentsToGL(attachment);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+
+ if (attachment == NVRenderFrameBufferAttachments::DepthStencil) {
+ GL_CALL_EXTRA_FUNCTION(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+ glTarget, texID, 0));
+ GL_CALL_EXTRA_FUNCTION(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
+ glTarget, texID, 0));
+ } else {
+ GL_CALL_EXTRA_FUNCTION(glFramebufferTexture2D(GL_FRAMEBUFFER, glAttach, glTarget, texID,
+ 0));
+ }
+}
+
+void NVRenderBackendGLES2Impl::SetRenderTarget(NVRenderBackendRenderTargetObject rto)
+{
+ GLuint fboID = HandleToID_cast(GLuint, size_t, rto);
+ if (!fboID)
+ fboID = QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext()->defaultFramebufferObject();
+
+ GL_CALL_EXTRA_FUNCTION(glBindFramebuffer(GL_FRAMEBUFFER, fboID));
+}
+
+void NVRenderBackendGLES2Impl::SetReadTarget(NVRenderBackendRenderTargetObject rto)
+{
+ GLuint fboID = HandleToID_cast(GLuint, size_t, rto);
+ if (!fboID)
+ fboID = QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext()->defaultFramebufferObject();
+
+ GL_CALL_EXTRA_FUNCTION(glBindFramebuffer(GL_READ_FRAMEBUFFER, fboID));
+}
+
+bool NVRenderBackendGLES2Impl::RenderTargetIsValid(NVRenderBackendRenderTargetObject /* rto */)
+{
+ GLenum completeStatus = GL_CALL_EXTRA_FUNCTION(glCheckFramebufferStatus(GL_FRAMEBUFFER));
+ switch (completeStatus) {
+#define HANDLE_INCOMPLETE_STATUS(x) \
+ case x: \
+ qCCritical(INTERNAL_ERROR, "Framebuffer is not complete: %s", #x); \
+ return false;
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS)
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_UNSUPPORTED)
+ #undef HANDLE_INCOMPLETE_STATUS
+ }
+ return true;
+}
+
+NVRenderBackend::NVRenderBackendRenderbufferObject
+NVRenderBackendGLES2Impl::CreateRenderbuffer(NVRenderRenderBufferFormats::Enum storageFormat,
+ size_t width, size_t height)
+{
+ GLuint bufID = 0;
+
+ GL_CALL_EXTRA_FUNCTION(glGenRenderbuffers(1, &bufID));
+ GL_CALL_EXTRA_FUNCTION(glBindRenderbuffer(GL_RENDERBUFFER, bufID));
+ GL_CALL_EXTRA_FUNCTION(glRenderbufferStorage(GL_RENDERBUFFER,
+ GLConversion::fromRenderBufferFormatsToRenderBufferGL(storageFormat),
+ (GLsizei)width, (GLsizei)height));
+
+ // check for error
+ GLenum error = m_glFunctions->glGetError();
+ if (error != GL_NO_ERROR) {
+ qCCritical(GL_ERROR, GLConversion::processGLError(error));
+ QT3DS_ASSERT(false);
+ GL_CALL_EXTRA_FUNCTION(glDeleteRenderbuffers(1, &bufID));
+ bufID = 0;
+ }
+
+ GL_CALL_EXTRA_FUNCTION(glBindRenderbuffer(GL_RENDERBUFFER, 0));
+
+ return (NVRenderBackend::NVRenderBackendRenderbufferObject)bufID;
+}
+
+void NVRenderBackendGLES2Impl::ReleaseRenderbuffer(NVRenderBackendRenderbufferObject rbo)
+{
+ GLuint bufID = HandleToID_cast(GLuint, size_t, rbo);
+
+ if (bufID)
+ GL_CALL_EXTRA_FUNCTION(glDeleteRenderbuffers(1, &bufID));
+}
+
+bool NVRenderBackendGLES2Impl::ResizeRenderbuffer(NVRenderBackendRenderbufferObject rbo,
+ NVRenderRenderBufferFormats::Enum storageFormat,
+ size_t width, size_t height)
+{
+ bool success = true;
+ GLuint bufID = HandleToID_cast(GLuint, size_t, rbo);
+
+ QT3DS_ASSERT(bufID);
+
+ GL_CALL_EXTRA_FUNCTION(glBindRenderbuffer(GL_RENDERBUFFER, bufID));
+ GL_CALL_EXTRA_FUNCTION(glRenderbufferStorage(GL_RENDERBUFFER,
+ GLConversion::fromRenderBufferFormatsToRenderBufferGL(storageFormat),
+ (GLsizei)width, (GLsizei)height));
+
+ // check for error
+ GLenum error = m_glFunctions->glGetError();
+ if (error != GL_NO_ERROR) {
+ qCCritical(GL_ERROR, GLConversion::processGLError(error));
+ QT3DS_ASSERT(false);
+ success = false;
+ }
+
+ return success;
+}
+
+void *NVRenderBackendGLES2Impl::MapBuffer(NVRenderBackendBufferObject,
+ NVRenderBufferBindFlags bindFlags, size_t offset,
+ size_t length, NVRenderBufferAccessFlags accessFlags)
+{
+ void *ret = nullptr;
+ ret = GL_CALL_EXTRA_FUNCTION(
+ glMapBufferRange(m_Conversion.fromBindBufferFlagsToGL(bindFlags), offset,
+ length, m_Conversion.fromBufferAccessBitToGL(accessFlags)));
+
+ return ret;
+}
+
+bool NVRenderBackendGLES2Impl::UnmapBuffer(NVRenderBackendBufferObject,
+ NVRenderBufferBindFlags bindFlags)
+{
+ GLboolean ret;
+
+ ret = GL_CALL_EXTRA_FUNCTION(glUnmapBuffer(m_Conversion.fromBindBufferFlagsToGL(bindFlags)));
+
+ return (ret) ? true : false;
+}
+
+QT3DSI32 NVRenderBackendGLES2Impl::GetConstantBufferCount(NVRenderBackendShaderProgramObject po)
+{
+ QT3DS_ASSERT(po);
+ GLint numUniformBuffers = 0;
+ if (GetRenderBackendCap(NVRenderBackendCaps::ConstantBuffer)) {
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GL_CALL_EXTRA_FUNCTION(glGetProgramiv(programID, GL_ACTIVE_UNIFORM_BLOCKS,
+ &numUniformBuffers));
+ }
+ return numUniformBuffers;
+}
+
+QT3DSI32 NVRenderBackendGLES2Impl::GetConstantBufferInfoByID(
+ NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize,
+ QT3DSI32 *paramCount, QT3DSI32 *bufferSize,
+ QT3DSI32 *length, char *nameBuf)
+{
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(length);
+ QT3DS_ASSERT(nameBuf);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+ GLuint blockIndex = GL_INVALID_INDEX;
+
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockName(programID, id, nameBufSize, length,
+ nameBuf));
+
+ if (*length > 0) {
+ blockIndex = GL_CALL_EXTRA_FUNCTION(glGetUniformBlockIndex(programID, nameBuf));
+ if (blockIndex != GL_INVALID_INDEX) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockiv(programID, blockIndex,
+ GL_UNIFORM_BLOCK_DATA_SIZE, bufferSize));
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockiv(programID, blockIndex,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, paramCount));
+ }
+ }
+
+ return blockIndex;
+}
+
+void NVRenderBackendGLES2Impl::GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSI32 *indices)
+{
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(indices);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ if (indices) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockiv(programID, id,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES,
+ indices));
+ }
+}
+
+void NVRenderBackendGLES2Impl::GetConstantBufferParamInfoByIndices(
+ NVRenderBackendShaderProgramObject po, QT3DSU32 count, QT3DSU32 *indices, QT3DSI32 *type,
+ QT3DSI32 *size, QT3DSI32 *offset)
+{
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(count);
+ QT3DS_ASSERT(indices);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ if (count && indices) {
+ if (type) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformsiv(programID, count, indices,
+ GL_UNIFORM_TYPE, type));
+ // convert to UIC types
+ QT3DS_FOREACH(idx, count)
+ {
+ type[idx] = m_Conversion.fromShaderGLToPropertyDataTypes(type[idx]);
+ }
+ }
+ if (size) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformsiv(programID, count, indices,
+ GL_UNIFORM_SIZE, size));
+ }
+ if (offset) {
+ GL_CALL_EXTRA_FUNCTION(
+ glGetActiveUniformsiv(programID, count, indices, GL_UNIFORM_OFFSET, offset));
+ }
+ }
+}
+
+void NVRenderBackendGLES2Impl::ProgramSetConstantBlock(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 blockIndex, QT3DSU32 binding)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GL_CALL_EXTRA_FUNCTION(glUniformBlockBinding(programID, blockIndex, binding));
+}
+
+void NVRenderBackendGLES2Impl::ProgramSetConstantBuffer(QT3DSU32 index,
+ NVRenderBackendBufferObject bo)
+{
+ QT3DS_ASSERT(bo);
+
+ GLuint bufID = HandleToID_cast(GLuint, size_t, bo);
+ GL_CALL_EXTRA_FUNCTION(glBindBufferBase(GL_UNIFORM_BUFFER, index, bufID));
+}
+
+NVRenderBackend::NVRenderBackendQueryObject NVRenderBackendGLES2Impl::CreateQuery()
+{
+ QT3DSU32 glQueryID = 0;
+
+ return (NVRenderBackendQueryObject)glQueryID;
+}
+
+void NVRenderBackendGLES2Impl::ReleaseQuery(NVRenderBackendQueryObject)
+{
+
+}
+
+void NVRenderBackendGLES2Impl::BeginQuery(NVRenderBackendQueryObject,
+ NVRenderQueryType::Enum)
+{
+
+}
+
+void NVRenderBackendGLES2Impl::EndQuery(NVRenderBackendQueryObject, NVRenderQueryType::Enum)
+{
+
+}
+
+void NVRenderBackendGLES2Impl::GetQueryResult(NVRenderBackendQueryObject,
+ NVRenderQueryResultType::Enum,
+ QT3DSU32 *)
+{
+
+}
+
+void NVRenderBackendGLES2Impl::GetQueryResult(NVRenderBackendQueryObject,
+ NVRenderQueryResultType::Enum,
+ QT3DSU64 *)
+{
+
+}
+
+void NVRenderBackendGLES2Impl::SetQueryTimer(NVRenderBackendQueryObject)
+{
+
+}
+
+NVRenderBackend::NVRenderBackendSyncObject
+NVRenderBackendGLES2Impl::CreateSync(NVRenderSyncType::Enum, NVRenderSyncFlags)
+{
+ GLsync syncID = 0;
+ return NVRenderBackendSyncObject(syncID);
+}
+
+void NVRenderBackendGLES2Impl::ReleaseSync(NVRenderBackendSyncObject)
+{
+
+}
+
+void NVRenderBackendGLES2Impl::WaitSync(NVRenderBackendSyncObject, NVRenderCommandFlushFlags,
+ QT3DSU64)
+{
+
+}
+}
+}
diff --git a/src/render/backends/gl/Q3DSRenderBackendGLES2.h b/src/render/backends/gl/Q3DSRenderBackendGLES2.h
new file mode 100644
index 0000000..2c7a355
--- /dev/null
+++ b/src/render/backends/gl/Q3DSRenderBackendGLES2.h
@@ -0,0 +1,195 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_RENDER_BACKEND_GLES2_H
+#define QT3DS_RENDER_BACKEND_GLES2_H
+
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/gl/Qt3DSRenderBackendGLBase.h"
+#include "render/backends/gl/Qt3DSOpenGLExtensions.h"
+
+#include <QtGui/qopenglextrafunctions.h>
+#include <QtOpenGLExtensions/QtOpenGLExtensions>
+
+namespace qt3ds {
+namespace render {
+
+ ///< forward declaration
+ class NVRenderBackendMiscStateGL;
+
+ using namespace foundation;
+
+ class NVRenderBackendGLES2Impl : public NVRenderBackendGLBase
+ {
+ public:
+ /// constructor
+ NVRenderBackendGLES2Impl(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format);
+ /// destructor
+ virtual ~NVRenderBackendGLES2Impl();
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ public:
+ QT3DSU32 GetDepthBits() const override;
+ QT3DSU32 GetStencilBits() const override;
+ void GenerateMipMaps(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderHint::Enum genType) override;
+
+ void SetMultisampledTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ size_t samples,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height,
+ bool fixedsamplelocations) override;
+
+ void SetTextureData3D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width,
+ size_t height, size_t depth, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = nullptr) override;
+
+ void SetTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width,
+ size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = nullptr) override;
+
+ void UpdateSampler(
+ NVRenderBackendSamplerObject so, NVRenderTextureTargetType::Enum target,
+ NVRenderTextureMinifyingOp::Enum minFilter = NVRenderTextureMinifyingOp::Linear,
+ NVRenderTextureMagnifyingOp::Enum magFilter = NVRenderTextureMagnifyingOp::Linear,
+ NVRenderTextureCoordOp::Enum wrapS = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapT = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapR = NVRenderTextureCoordOp::ClampToEdge,
+ QT3DSF32 minLod = -1000.0f, QT3DSF32 maxLod = 1000.0f, QT3DSF32 lodBias = 0.0f,
+ NVRenderTextureCompareMode::Enum compareMode = NVRenderTextureCompareMode::NoCompare,
+ NVRenderTextureCompareOp::Enum compareFunc = NVRenderTextureCompareOp::LessThanOrEqual,
+ QT3DSF32 anisotropy = 1.0f, QT3DSF32 *borderColor = nullptr) override;
+
+ void UpdateTextureObject(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSI32 baseLevel,
+ QT3DSI32 maxLevel) override;
+
+ void UpdateTextureSwizzle(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderTextureSwizzleMode::Enum swizzleMode) override;
+
+ bool SetInputAssembler(NVRenderBackendInputAssemblerObject iao,
+ NVRenderBackendShaderProgramObject po) override;
+
+ void ReleaseInputAssembler(NVRenderBackendInputAssemblerObject iao) override;
+
+ void SetDrawBuffers(NVRenderBackendRenderTargetObject rto,
+ NVConstDataRef<QT3DSI32> inDrawBufferSet) override;
+ void SetReadBuffer(NVRenderBackendRenderTargetObject rto,
+ NVReadFaces::Enum inReadFace) override;
+
+ void BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter) override;
+
+
+ NVRenderBackendRenderTargetObject CreateRenderTarget() override;
+ void ReleaseRenderTarget(NVRenderBackendRenderTargetObject rto) override;
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendRenderbufferObject rbo) override;
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target
+ = NVRenderTextureTargetType::Texture2D) override;
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to, QT3DSI32 level,
+ QT3DSI32 layer) override;
+ void SetRenderTarget(NVRenderBackendRenderTargetObject rto) override;
+ bool RenderTargetIsValid(NVRenderBackendRenderTargetObject rto) override;
+
+ virtual NVRenderBackendRenderbufferObject
+ CreateRenderbuffer(NVRenderRenderBufferFormats::Enum storageFormat, size_t width,
+ size_t height) override;
+ void SetReadTarget(NVRenderBackendRenderTargetObject rto) override;
+ void ReleaseRenderbuffer(NVRenderBackendRenderbufferObject rbo) override;
+ bool ResizeRenderbuffer(NVRenderBackendRenderbufferObject rbo,
+ NVRenderRenderBufferFormats::Enum storageFormat,
+ size_t width, size_t height) override;
+
+ void *MapBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags,
+ size_t offset, size_t length,
+ NVRenderBufferAccessFlags accessFlags) override;
+ bool UnmapBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags) override;
+
+ QT3DSI32 GetConstantBufferCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetConstantBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length,
+ char *nameBuf) override;
+ void GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSI32 *indices) override;
+ void GetConstantBufferParamInfoByIndices(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 count, QT3DSU32 *indices,
+ QT3DSI32 *type,
+ QT3DSI32 *size, QT3DSI32 *offset) override;
+ void ProgramSetConstantBlock(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 blockIndex, QT3DSU32 binding) override;
+ void ProgramSetConstantBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) override;
+
+ NVRenderBackendQueryObject CreateQuery() override;
+ void ReleaseQuery(NVRenderBackendQueryObject qo) override;
+ void BeginQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) override;
+ void EndQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) override;
+ void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU32 *params) override;
+ void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU64 *params) override;
+ void SetQueryTimer(NVRenderBackendQueryObject qo) override;
+
+ NVRenderBackendSyncObject CreateSync(NVRenderSyncType::Enum tpye,
+ NVRenderSyncFlags syncFlags) override;
+ void ReleaseSync(NVRenderBackendSyncObject so) override;
+ void WaitSync(NVRenderBackendSyncObject so, NVRenderCommandFlushFlags syncFlags,
+ QT3DSU64 timeout) override;
+
+ protected:
+ NVRenderBackendMiscStateGL *m_pCurrentMiscState; ///< this holds the current misc state
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+ Qt3DSOpenGLES2Extensions *m_qt3dsExtensions;
+#endif
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Qt3DSOpenGLExtensions.cpp b/src/render/backends/gl/Qt3DSOpenGLExtensions.cpp
new file mode 100644
index 0000000..564ecd5
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSOpenGLExtensions.cpp
@@ -0,0 +1,170 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/backends/gl/Qt3DSOpenGLExtensions.h"
+
+Qt3DSOpenGLExtensions::Qt3DSOpenGLExtensions()
+ : QAbstractOpenGLExtension(*(new Qt3DSOpenGLExtensionsPrivate))
+{
+}
+
+bool Qt3DSOpenGLExtensions::initializeOpenGLFunctions()
+{
+ if (isInitialized())
+ return true;
+
+ QT_PREPEND_NAMESPACE(QOpenGLContext) *context =
+ QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext();
+ if (!context) {
+ qWarning("A current OpenGL context is required to resolve functions");
+ return false;
+ }
+
+ Q_D(Qt3DSOpenGLExtensions);
+
+ d->BlendBarrierNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)()>(
+ context->getProcAddress("glBlendBarrierNV"));
+ d->PathGlyphIndexArrayNV = reinterpret_cast<GLenum (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum, const void*, GLbitfield, GLuint, GLsizei, GLuint,
+ GLfloat)>(
+ context->getProcAddress("glPathGlyphIndexArrayNV"));
+ d->PathGlyphIndexRangeNV = reinterpret_cast<GLenum (QOPENGLF_APIENTRYP)(
+ GLenum, const void*, GLbitfield, GLuint, GLfloat, GLuint[2])>(
+ context->getProcAddress("glPathGlyphIndexRangeNV"));
+ QAbstractOpenGLExtension::initializeOpenGLFunctions();
+ return true;
+}
+
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+Qt3DSOpenGLES2Extensions::Qt3DSOpenGLES2Extensions()
+{
+}
+
+bool Qt3DSOpenGLES2Extensions::initializeOpenGLFunctions()
+{
+ if (isInitialized())
+ return true;
+
+ QT_PREPEND_NAMESPACE(QOpenGLContext) *context =
+ QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext();
+ if (!context) {
+ qWarning("A current OpenGL context is required to resolve functions");
+ return false;
+ }
+
+ Q_D(Qt3DSOpenGLExtensions);
+
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+ d->PatchParameteriEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLenum, GLint)>(
+ context->getProcAddress("glPatchParameteriEXT"));
+ d->QueryCounterEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum)>(
+ context->getProcAddress("glQueryCounterEXT"));
+ d->GetQueryObjectui64vEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum, GLuint64 *)>(
+ context->getProcAddress("glGetQueryObjectui64vEXT"));
+ d->GenPathsNV = reinterpret_cast<GLuint (QOPENGLF_APIENTRYP)(
+ GLsizei)>(
+ context->getProcAddress("glGenPathsNV"));
+ d->DeletePathsNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLsizei)>(
+ context->getProcAddress("glDeletePathsNV"));
+ d->PathCommandsNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLsizei, const GLubyte *, GLsizei, GLenum, const void *)>(
+ context->getProcAddress("glPathCommandsNV"));
+ d->PathGlyphsNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum, const void *, GLbitfield, GLsizei, GLenum, const void *,
+ GLenum, GLuint, GLfloat)>(
+ context->getProcAddress("glPathGlyphsNV"));
+ d->PathGlyphRangeNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum, const void *, GLbitfield, GLuint, GLsizei, GLenum,
+ GLuint, GLfloat)>(
+ context->getProcAddress("glPathGlyphRangeNV"));
+ d->PathParameterfNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum, GLfloat)>(
+ context->getProcAddress("glPathParameterfNV"));
+ d->PathStencilDepthOffsetNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLfloat, GLfloat)>(
+ context->getProcAddress("glPathStencilDepthOffsetNV"));
+ d->StencilFillPathNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum, GLuint)>(
+ context->getProcAddress("glStencilFillPathNV"));
+ d->StencilStrokePathNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLint, GLuint)>(
+ context->getProcAddress("glStencilStrokePathNV"));
+ d->StencilFillPathInstancedNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLsizei, GLenum, const void *, GLuint, GLenum, GLuint, GLenum,
+ const GLfloat *)>(
+ context->getProcAddress("glStencilFillPathInstancedNV"));
+ d->StencilStrokePathInstancedNV
+ = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei, GLenum,
+ const void *, GLuint, GLint, GLuint, GLenum, const GLfloat *)>(
+ context->getProcAddress("glStencilStrokePathInstancedNV"));
+ d->PathCoverDepthFuncNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLenum func)>(
+ context->getProcAddress("glPathCoverDepthFuncNV"));
+ d->CoverFillPathInstancedNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLsizei, GLenum, const void *, GLuint, GLenum, GLenum,
+ const GLfloat *)>(
+ context->getProcAddress("glCoverFillPathInstancedNV"));
+ d->CoverStrokePathInstancedNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLsizei, GLenum, const void *, GLuint, GLenum, GLenum,
+ const GLfloat *)>(
+ context->getProcAddress("glCoverStrokePathInstancedNV"));
+ d->GetPathParameterfvNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLuint, GLenum, GLfloat *)>(
+ context->getProcAddress("glGetPathParameterfvNV"));
+ d->GetPathMetricsNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLbitfield, GLsizei, GLenum, const void *, GLuint, GLsizei, GLfloat *)>(
+ context->getProcAddress("glGetPathMetricsNV"));
+ d->GetPathMetricRangeNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLbitfield, GLuint, GLsizei, GLsizei, GLfloat *)>(
+ context->getProcAddress("glGetPathMetricRangeNV"));
+ d->GetPathSpacingNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(
+ GLenum, GLsizei, GLenum, const void *, GLuint, GLfloat, GLfloat, GLenum,
+ GLfloat *)>(
+ context->getProcAddress("glGetPathSpacingNV"));
+ d->BindVertexArrayOES = reinterpret_cast<void (QOPENGLF_APIENTRYP)
+ (GLuint)>(
+ context->getProcAddress("glBindVertexArrayOES"));
+ d->DeleteVertexArraysOES = reinterpret_cast<void (QOPENGLF_APIENTRYP)
+ (GLsizei, const GLuint *)>(
+ context->getProcAddress("glDeleteVertexArraysOES"));
+ d->GenVertexArraysOES = reinterpret_cast<void (QOPENGLF_APIENTRYP)
+ (GLsizei, GLuint *)>(
+ context->getProcAddress("glGenVertexArraysOES"));
+ d->IsVertexArrayOES = reinterpret_cast<GLboolean (QOPENGLF_APIENTRYP)
+ (GLuint)>(
+ context->getProcAddress("glIsVertexArrayOES"));
+#endif
+ Qt3DSOpenGLExtensions::initializeOpenGLFunctions();
+ return true;
+}
+#endif // QT_OPENGL_ES
diff --git a/src/render/backends/gl/Qt3DSOpenGLExtensions.h b/src/render/backends/gl/Qt3DSOpenGLExtensions.h
new file mode 100644
index 0000000..c9ba76a
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSOpenGLExtensions.h
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DSOPENGLEXTENSIONS_H
+#define QT3DSOPENGLEXTENSIONS_H
+
+#include <QtOpenGLExtensions/QtOpenGLExtensions>
+
+/* Some OpenGL extensions that are not (yet) found in Qt's OpenGL extensions.
+ * These should be auto-generated and added to QtOpenGLExtensions module */
+class Qt3DSOpenGLExtensionsPrivate : public QAbstractOpenGLExtensionPrivate
+{
+public:
+ void (QOPENGLF_APIENTRYP BlendBarrierNV)();
+ GLenum (QOPENGLF_APIENTRYP PathGlyphIndexArrayNV)(
+ GLuint, GLenum, const void*, GLbitfield, GLuint, GLsizei, GLuint,
+ GLfloat);
+ GLenum (QOPENGLF_APIENTRYP PathGlyphIndexRangeNV)(
+ GLenum, const void*, GLbitfield, GLuint, GLfloat, GLuint[2]);
+
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+ void (QOPENGLF_APIENTRYP PatchParameteriEXT)(GLenum, GLint);
+ void (QOPENGLF_APIENTRYP QueryCounterEXT)(GLuint, GLenum);
+ void (QOPENGLF_APIENTRYP GetQueryObjectui64vEXT)(GLuint, GLenum,
+ GLuint64 *);
+ GLuint (QOPENGLF_APIENTRYP GenPathsNV)(GLsizei);
+ void (QOPENGLF_APIENTRYP DeletePathsNV)(GLuint, GLsizei);
+ void (QOPENGLF_APIENTRYP PathCommandsNV)(GLuint, GLsizei, const GLubyte *,
+ GLsizei, GLenum, const void *);
+ void (QOPENGLF_APIENTRYP PathGlyphsNV)(GLuint, GLenum, const void *,
+ GLbitfield, GLsizei, GLenum, const void *, GLenum, GLuint, GLfloat);
+ void (QOPENGLF_APIENTRYP PathGlyphRangeNV)(GLuint, GLenum, const void *,
+ GLbitfield, GLuint, GLsizei, GLenum, GLuint, GLfloat);
+ void (QOPENGLF_APIENTRYP PathParameterfNV)(GLuint, GLenum, GLfloat);
+ void (QOPENGLF_APIENTRYP PathStencilDepthOffsetNV)(GLfloat, GLfloat);
+ void (QOPENGLF_APIENTRYP StencilFillPathNV)(GLuint, GLenum, GLuint);
+ void (QOPENGLF_APIENTRYP StencilStrokePathNV)(GLuint, GLint, GLuint);
+ void (QOPENGLF_APIENTRYP StencilFillPathInstancedNV)(GLsizei, GLenum,
+ const void *, GLuint, GLenum, GLuint, GLenum, const GLfloat *);
+ void (QOPENGLF_APIENTRYP StencilStrokePathInstancedNV)(GLsizei, GLenum,
+ const void *, GLuint, GLint, GLuint, GLenum, const GLfloat *);
+ void (QOPENGLF_APIENTRYP PathCoverDepthFuncNV)(GLenum);
+ void (QOPENGLF_APIENTRYP CoverFillPathInstancedNV)(GLsizei, GLenum,
+ const void *, GLuint, GLenum, GLenum, const GLfloat *);
+ void (QOPENGLF_APIENTRYP CoverStrokePathInstancedNV)(GLsizei, GLenum,
+ const void *, GLuint, GLenum, GLenum, const GLfloat *);
+ void (QOPENGLF_APIENTRYP GetPathParameterfvNV)(GLuint, GLenum, GLfloat *);
+ void (QOPENGLF_APIENTRYP GetPathMetricsNV)(GLbitfield, GLsizei, GLenum,
+ const void *, GLuint, GLsizei, GLfloat *);
+ void (QOPENGLF_APIENTRYP GetPathMetricRangeNV)(GLbitfield, GLuint, GLsizei,
+ GLsizei, GLfloat *);
+ void (QOPENGLF_APIENTRYP GetPathSpacingNV)(GLenum, GLsizei, GLenum,
+ const void *, GLuint, GLfloat, GLfloat, GLenum, GLfloat *);
+ void (QOPENGLF_APIENTRYP BindVertexArrayOES) (GLuint array);
+ void (QOPENGLF_APIENTRYP DeleteVertexArraysOES) (GLsizei n, const GLuint *arrays);
+ void (QOPENGLF_APIENTRYP GenVertexArraysOES) (GLsizei n, GLuint *arrays);
+ GLboolean (QOPENGLF_APIENTRYP IsVertexArrayOES) (GLuint array);
+#endif
+};
+
+class Qt3DSOpenGLExtensions : public QAbstractOpenGLExtension
+{
+public:
+ Qt3DSOpenGLExtensions();
+
+ bool initializeOpenGLFunctions() override;
+
+ void glBlendBarrierNV();
+ GLenum glPathGlyphIndexArrayNV(GLuint firstPathName, GLenum fontTarget,
+ const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex,
+ GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale);
+ GLenum glPathGlyphIndexRangeNV(GLenum fontTarget, const void *fontName,
+ GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale,
+ GLuint baseAndCount[2]);
+
+protected:
+ Q_DECLARE_PRIVATE(Qt3DSOpenGLExtensions)
+};
+
+inline void Qt3DSOpenGLExtensions::glBlendBarrierNV()
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->BlendBarrierNV();
+}
+
+inline GLenum Qt3DSOpenGLExtensions::glPathGlyphIndexArrayNV(
+ GLuint firstPathName, GLenum fontTarget, const void *fontName,
+ GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs,
+ GLuint pathParameterTemplate, GLfloat emScale)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ return d->PathGlyphIndexArrayNV(firstPathName, fontTarget, fontName,
+ fontStyle, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale);
+}
+
+inline GLenum Qt3DSOpenGLExtensions::glPathGlyphIndexRangeNV(GLenum fontTarget,
+ const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate,
+ GLfloat emScale, GLuint baseAndCount[2])
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ return d->PathGlyphIndexRangeNV(fontTarget, fontName, fontStyle,
+ pathParameterTemplate, emScale, baseAndCount);
+}
+
+#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE)
+class Qt3DSOpenGLES2Extensions : public Qt3DSOpenGLExtensions
+{
+public:
+ Qt3DSOpenGLES2Extensions();
+
+ // tesselation shader
+ void glPatchParameteriEXT(GLenum pname, GLint value);
+
+ // timer
+ void glQueryCounterEXT(GLuint id, GLenum target);
+ void glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64 *params);
+
+ // nv paths
+
+ GLuint glGenPathsNV(GLsizei range);
+ void glDeletePathsNV(GLuint path, GLsizei range);
+ void glPathCommandsNV(GLuint path, GLsizei numCommands,
+ const GLubyte *commands, GLsizei numCoords, GLenum coordType,
+ const void *coords);
+ void glPathGlyphsNV(GLuint firstPathName, GLenum fontTarget,
+ const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs,
+ GLenum type, const void *charcodes, GLenum handleMissingGlyphs,
+ GLuint pathParameterTemplate, GLfloat emScale);
+ void glPathGlyphRangeNV(GLuint firstPathName, GLenum fontTarget,
+ const void *fontName, GLbitfield fontStyle, GLuint firstGlyph,
+ GLsizei numGlyphs, GLenum handleMissingGlyphs,
+ GLuint pathParameterTemplate, GLfloat emScale);
+ void glPathParameterfNV(GLuint path, GLenum pname, GLfloat value);
+ void glPathStencilDepthOffsetNV(GLfloat factor, GLfloat units);
+ void glStencilFillPathNV(GLuint path, GLenum fillMode, GLuint mask);
+ void glStencilStrokePathNV(GLuint path, GLint reference, GLuint mask);
+ void glStencilFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType,
+ const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask,
+ GLenum transformType, const GLfloat *transformValues);
+ void glStencilStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType,
+ const void *paths, GLuint pathBase, GLint reference, GLuint mask,
+ GLenum transformType, const GLfloat *transformValues);
+ void glPathCoverDepthFuncNV(GLenum func);
+ void glCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType,
+ const void *paths, GLuint pathBase, GLenum coverMode,
+ GLenum transformType, const GLfloat *transformValues);
+ void glCoverStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType,
+ const void *paths, GLuint pathBase, GLenum coverMode,
+ GLenum transformType, const GLfloat *transformValues);
+ void glGetPathParameterfvNV(GLuint path, GLenum pname, GLfloat *value);
+ void glGetPathMetricsNV(GLbitfield metricQueryMask, GLsizei numPaths,
+ GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride,
+ GLfloat *metrics);
+ void glGetPathMetricRangeNV(GLbitfield metricQueryMask,
+ GLuint firstPathName, GLsizei numPaths, GLsizei stride,
+ GLfloat *metrics);
+ void glGetPathSpacingNV(GLenum pathListMode, GLsizei numPaths,
+ GLenum pathNameType, const void *paths, GLuint pathBase,
+ GLfloat advanceScale, GLfloat kerningScale, GLenum transformType,
+ GLfloat *returnedSpacing);
+ void glBindVertexArrayOES(GLuint array);
+ void glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays);
+ void glGenVertexArraysOES(GLsizei n, GLuint *arrays);
+ GLboolean glIsVertexArrayOES(GLuint array);
+
+ bool initializeOpenGLFunctions() Q_DECL_FINAL;
+};
+
+inline void Qt3DSOpenGLES2Extensions::glPatchParameteriEXT(GLenum pname,
+ GLint value)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->PatchParameteriEXT(pname, value);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glQueryCounterEXT(GLuint id,
+ GLenum target)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->QueryCounterEXT(id, target);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glGetQueryObjectui64vEXT(GLuint id,
+ GLenum pname, GLuint64 *params)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->GetQueryObjectui64vEXT(id, pname, params);
+}
+
+inline GLuint Qt3DSOpenGLES2Extensions::glGenPathsNV(GLsizei range)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ return d->GenPathsNV(range);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glDeletePathsNV(GLuint path,
+ GLsizei range)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->DeletePathsNV(path, range);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glPathCommandsNV(GLuint path,
+ GLsizei numCommands, const GLubyte *commands, GLsizei numCoords,
+ GLenum coordType, const void *coords)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->PathCommandsNV(path, numCommands, commands, numCoords, coordType,
+ coords);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glPathGlyphsNV(GLuint firstPathName,
+ GLenum fontTarget, const void *fontName, GLbitfield fontStyle,
+ GLsizei numGlyphs, GLenum type, const void *charcodes,
+ GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->PathGlyphsNV(firstPathName, fontTarget, fontName, fontStyle, numGlyphs,
+ type, charcodes, handleMissingGlyphs, pathParameterTemplate, emScale);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glPathGlyphRangeNV(GLuint firstPathName,
+ GLenum fontTarget, const void *fontName, GLbitfield fontStyle,
+ GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs,
+ GLuint pathParameterTemplate, GLfloat emScale)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->PathGlyphRangeNV(firstPathName, fontTarget, fontName, fontStyle,
+ firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate,
+ emScale);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glPathParameterfNV(GLuint path,
+ GLenum pname, GLfloat value)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->PathParameterfNV(path, pname, value);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glPathStencilDepthOffsetNV(GLfloat factor,
+ GLfloat units)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->PathStencilDepthOffsetNV(factor, units);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glStencilFillPathNV(GLuint path,
+ GLenum fillMode, GLuint mask)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->StencilFillPathNV(path, fillMode, mask);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glStencilStrokePathNV(GLuint path,
+ GLint reference, GLuint mask)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->StencilStrokePathNV(path, reference, mask);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glStencilFillPathInstancedNV(
+ GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase,
+ GLenum fillMode, GLuint mask, GLenum transformType,
+ const GLfloat *transformValues)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->StencilFillPathInstancedNV(numPaths, pathNameType, paths, pathBase,
+ fillMode, mask, transformType, transformValues);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glStencilStrokePathInstancedNV(
+ GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase,
+ GLint reference, GLuint mask, GLenum transformType,
+ const GLfloat *transformValues)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->StencilStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase,
+ reference, mask, transformType, transformValues);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glPathCoverDepthFuncNV(GLenum func)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->PathCoverDepthFuncNV(func);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glCoverFillPathInstancedNV(
+ GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase,
+ GLenum coverMode, GLenum transformType, const GLfloat *transformValues)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->CoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase,
+ coverMode, transformType, transformValues);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glCoverStrokePathInstancedNV(
+ GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase,
+ GLenum coverMode, GLenum transformType, const GLfloat *transformValues)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->CoverStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase,
+ coverMode, transformType, transformValues);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glGetPathParameterfvNV(GLuint path,
+ GLenum pname, GLfloat *value)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->GetPathParameterfvNV(path, pname, value);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glGetPathMetricsNV(
+ GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType,
+ const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->GetPathMetricsNV(metricQueryMask, numPaths, pathNameType, paths,
+ pathBase, stride, metrics);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glGetPathMetricRangeNV(
+ GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths,
+ GLsizei stride, GLfloat *metrics)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->GetPathMetricRangeNV(metricQueryMask, firstPathName, numPaths, stride,
+ metrics);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glGetPathSpacingNV(GLenum pathListMode,
+ GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase,
+ GLfloat advanceScale, GLfloat kerningScale, GLenum transformType,
+ GLfloat *returnedSpacing)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->GetPathSpacingNV(pathListMode, numPaths, pathNameType, paths, pathBase,
+ advanceScale, kerningScale, transformType, returnedSpacing);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glBindVertexArrayOES(GLuint array)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->BindVertexArrayOES(array);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->DeleteVertexArraysOES(n, arrays);
+}
+
+inline void Qt3DSOpenGLES2Extensions::glGenVertexArraysOES(GLsizei n, GLuint *arrays)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ d->GenVertexArraysOES(n, arrays);
+}
+
+inline GLboolean Qt3DSOpenGLES2Extensions::glIsVertexArrayOES(GLuint array)
+{
+ Q_D(Qt3DSOpenGLExtensions);
+ return d->IsVertexArrayOES(array);
+}
+
+#endif // QT_OPENGL_ES
+
+#endif // QT3DSOPENGLEXTENSIONS_H
diff --git a/src/render/backends/gl/Qt3DSOpenGLPrefix.h b/src/render/backends/gl/Qt3DSOpenGLPrefix.h
new file mode 100644
index 0000000..0e6dc6d
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSOpenGLPrefix.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DSOPENGLPREFIX_H
+#define QT3DSOPENGLPREFIX_H
+
+#include <QtGui/qtguiglobal.h>
+#if defined(QT_OPENGL_ES)
+#define GL_GLEXT_PROTOTYPES
+#if defined(QT_OPENGL_ES_3_2)
+#include <GLES3/gl32.h>
+#else
+#include <GLES2/gl2.h>
+#include <GLES3/gl3.h>
+#endif
+
+// Adding this to ensure that platform version of gl2ext.h is included
+// before Qt's qopengles2ext.h which is missing symbols we need
+#include <GLES2/gl2ext.h>
+#endif
+
+#endif // QT3DSOPENGLPREFIX_H
diff --git a/src/render/backends/gl/Qt3DSOpenGLTokens.h b/src/render/backends/gl/Qt3DSOpenGLTokens.h
new file mode 100644
index 0000000..882e276
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSOpenGLTokens.h
@@ -0,0 +1,408 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DSOPENGLTOKENS_H
+#define QT3DSOPENGLTOKENS_H
+
+/**
+ * This is our general internal to GL type conversion routines
+ * Add defines which are not in standard GL(ext) header but in GL2(ext)
+ * The define are the same with different names
+ * Expectation is the NVIDIA defines (need for compile)
+ */
+#ifndef GL_NVIDIA_PLATFORM_BINARY_NV
+#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B
+#endif
+#ifndef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT
+#endif
+
+#if defined(__APPLE__) || defined(ANDROID) || defined(__INTEGRITY)
+#ifndef GL_DEPTH_COMPONENT24
+#define GL_DEPTH_COMPONENT24 GL_DEPTH_COMPONENT24_OES
+#endif
+#ifndef GL_DEPTH_COMPONENT32
+#define GL_DEPTH_COMPONENT32 GL_DEPTH_COMPONENT32_OES
+#endif
+
+/**
+_* tessellation_shader defines
+ */
+#ifndef GL_TESS_EVALUATION_SHADER
+#define GL_TESS_EVALUATION_SHADER GL_TESS_EVALUATION_SHADER_EXT
+#endif
+#ifndef GL_TESS_CONTROL_SHADER
+#define GL_TESS_CONTROL_SHADER GL_TESS_CONTROL_SHADER_EXT
+#endif
+#ifndef GL_PATCHES
+#define GL_PATCHES GL_PATCHES_EXT
+#endif
+#ifndef GL_PATCH_VERTICES
+#define GL_PATCH_VERTICES GL_PATCH_VERTICES_EXT
+#endif
+#ifndef GL_TESS_CONTROL_SHADER_BIT
+#define GL_TESS_CONTROL_SHADER_BIT GL_TESS_CONTROL_SHADER_BIT_EXT
+#endif
+#ifndef GL_TESS_EVALUATION_SHADER_BIT
+#define GL_TESS_EVALUATION_SHADER_BIT GL_TESS_EVALUATION_SHADER_BIT_EXT
+#endif
+#ifndef GL_VERTEX_SHADER_BIT
+#define GL_VERTEX_SHADER_BIT GL_VERTEX_SHADER_BIT_EXT
+#endif
+#ifndef GL_FRAGMENT_SHADER_BIT
+#define GL_FRAGMENT_SHADER_BIT GL_FRAGMENT_SHADER_BIT_EXT
+#endif
+#ifndef GL_GEOMETRY_SHADER_BIT
+#define GL_GEOMETRY_SHADER_BIT GL_GEOMETRY_SHADER_BIT_EXT
+#endif
+
+
+/**
+ * sample shading extension
+ */
+#ifndef GL_SAMPLE_SHADING
+#define GL_SAMPLE_SHADING GL_SAMPLE_SHADING_OES
+#endif
+#ifndef GL_MIN_SAMPLE_SHADING_VALUE
+#define GL_MIN_SAMPLE_SHADING_VALUE GL_MIN_SAMPLE_SHADING_VALUE_OES
+#endif
+
+/**
+ * Timer query extension
+ */
+#ifndef GL_TIME_ELAPSED
+#define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT
+#endif
+#ifndef GL_TIMESTAMP
+#define GL_TIMESTAMP GL_TIMESTAMP_EXT
+#endif
+
+/**
+ * compute shader
+ */
+#ifndef GL_IMAGE_2D
+#define GL_IMAGE_2D 0x904D
+#endif
+
+/**
+ * texture formats ( make build happy )
+ */
+#ifndef GL_R16
+#define GL_R16 0x822A
+#endif
+
+#endif // __APPLE__ || ANDROID || __INTEGRITY
+
+#if defined(__APPLE__) || defined(ANDROID)
+
+#ifndef GL_NV_blend_equation_advanced
+#define GL_NV_blend_equation_advanced 1
+#define GL_BLEND_OVERLAP_NV 0x9281
+#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280
+#define GL_BLUE_NV 0x1905
+#define GL_COLORBURN_NV 0x929A
+#define GL_COLORDODGE_NV 0x9299
+#define GL_CONJOINT_NV 0x9284
+#define GL_CONTRAST_NV 0x92A1
+#define GL_DARKEN_NV 0x9297
+#define GL_DIFFERENCE_NV 0x929E
+#define GL_DISJOINT_NV 0x9283
+#define GL_DST_ATOP_NV 0x928F
+#define GL_DST_IN_NV 0x928B
+#define GL_DST_NV 0x9287
+#define GL_DST_OUT_NV 0x928D
+#define GL_DST_OVER_NV 0x9289
+#define GL_EXCLUSION_NV 0x92A0
+#define GL_GREEN_NV 0x1904
+#define GL_HARDLIGHT_NV 0x929B
+#define GL_HARDMIX_NV 0x92A9
+#define GL_HSL_COLOR_NV 0x92AF
+#define GL_HSL_HUE_NV 0x92AD
+#define GL_HSL_LUMINOSITY_NV 0x92B0
+#define GL_HSL_SATURATION_NV 0x92AE
+#define GL_INVERT_OVG_NV 0x92B4
+#define GL_INVERT_RGB_NV 0x92A3
+#define GL_LIGHTEN_NV 0x9298
+#define GL_LINEARBURN_NV 0x92A5
+#define GL_LINEARDODGE_NV 0x92A4
+#define GL_LINEARLIGHT_NV 0x92A7
+#define GL_MINUS_CLAMPED_NV 0x92B3
+#define GL_MINUS_NV 0x929F
+#define GL_MULTIPLY_NV 0x9294
+#define GL_OVERLAY_NV 0x9296
+#define GL_PINLIGHT_NV 0x92A8
+#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2
+#define GL_PLUS_CLAMPED_NV 0x92B1
+#define GL_PLUS_DARKER_NV 0x9292
+#define GL_PLUS_NV 0x9291
+#define GL_RED_NV 0x1903
+#define GL_SCREEN_NV 0x9295
+#define GL_SOFTLIGHT_NV 0x929C
+#define GL_SRC_ATOP_NV 0x928E
+#define GL_SRC_IN_NV 0x928A
+#define GL_SRC_NV 0x9286
+#define GL_SRC_OUT_NV 0x928C
+#define GL_SRC_OVER_NV 0x9288
+#define GL_UNCORRELATED_NV 0x9282
+#define GL_VIVIDLIGHT_NV 0x92A6
+#define GL_XOR_NV 0x1506
+#endif /* GL_NV_blend_equation_advanced */
+
+#ifndef GL_SHADER_STORAGE_BUFFER
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#endif
+
+#ifndef GL_ATOMIC_COUNTER_BUFFER
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#endif
+
+#ifndef GL_ALL_BARRIER_BITS
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
+#define GL_COMMAND_BARRIER_BIT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000
+#define GL_ALL_BARRIER_BITS 0xFFFFFFFF
+#endif
+
+#ifndef GL_SHADER_STORAGE_BARRIER_BIT
+#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
+#endif
+
+#ifndef GL_UNSIGNED_INT_ATOMIC_COUNTER
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#endif
+
+#ifndef GL_UNSIGNED_INT_IMAGE_2D
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#endif
+
+
+
+#ifndef GL_NV_path_rendering
+#define GL_NV_path_rendering 1
+#define GL_PATH_FORMAT_SVG_NV 0x9070
+#define GL_PATH_FORMAT_PS_NV 0x9071
+#define GL_STANDARD_FONT_NAME_NV 0x9072
+#define GL_SYSTEM_FONT_NAME_NV 0x9073
+#define GL_FILE_NAME_NV 0x9074
+#define GL_PATH_STROKE_WIDTH_NV 0x9075
+#define GL_PATH_END_CAPS_NV 0x9076
+#define GL_PATH_INITIAL_END_CAP_NV 0x9077
+#define GL_PATH_TERMINAL_END_CAP_NV 0x9078
+#define GL_PATH_JOIN_STYLE_NV 0x9079
+#define GL_PATH_MITER_LIMIT_NV 0x907A
+#define GL_PATH_DASH_CAPS_NV 0x907B
+#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C
+#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D
+#define GL_PATH_DASH_OFFSET_NV 0x907E
+#define GL_PATH_CLIENT_LENGTH_NV 0x907F
+#define GL_PATH_FILL_MODE_NV 0x9080
+#define GL_PATH_FILL_MASK_NV 0x9081
+#define GL_PATH_FILL_COVER_MODE_NV 0x9082
+#define GL_PATH_STROKE_COVER_MODE_NV 0x9083
+#define GL_PATH_STROKE_MASK_NV 0x9084
+#define GL_COUNT_UP_NV 0x9088
+#define GL_COUNT_DOWN_NV 0x9089
+#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A
+#define GL_CONVEX_HULL_NV 0x908B
+#define GL_BOUNDING_BOX_NV 0x908D
+#define GL_TRANSLATE_X_NV 0x908E
+#define GL_TRANSLATE_Y_NV 0x908F
+#define GL_TRANSLATE_2D_NV 0x9090
+#define GL_TRANSLATE_3D_NV 0x9091
+#define GL_AFFINE_2D_NV 0x9092
+#define GL_AFFINE_3D_NV 0x9094
+#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096
+#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098
+#define GL_UTF8_NV 0x909A
+#define GL_UTF16_NV 0x909B
+#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C
+#define GL_PATH_COMMAND_COUNT_NV 0x909D
+#define GL_PATH_COORD_COUNT_NV 0x909E
+#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F
+#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0
+#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1
+#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2
+#define GL_SQUARE_NV 0x90A3
+#define GL_ROUND_NV 0x90A4
+#define GL_TRIANGULAR_NV 0x90A5
+#define GL_BEVEL_NV 0x90A6
+#define GL_MITER_REVERT_NV 0x90A7
+#define GL_MITER_TRUNCATE_NV 0x90A8
+#define GL_SKIP_MISSING_GLYPH_NV 0x90A9
+#define GL_USE_MISSING_GLYPH_NV 0x90AA
+#define GL_PATH_ERROR_POSITION_NV 0x90AB
+#define GL_PATH_FOG_GEN_MODE_NV 0x90AC
+#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD
+#define GL_ADJACENT_PAIRS_NV 0x90AE
+#define GL_FIRST_TO_REST_NV 0x90AF
+#define GL_PATH_GEN_MODE_NV 0x90B0
+#define GL_PATH_GEN_COEFF_NV 0x90B1
+#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2
+#define GL_PATH_GEN_COMPONENTS_NV 0x90B3
+#define GL_PATH_STENCIL_FUNC_NV 0x90B7
+#define GL_PATH_STENCIL_REF_NV 0x90B8
+#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9
+#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD
+#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE
+#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF
+#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4
+#define GL_MOVE_TO_RESETS_NV 0x90B5
+#define GL_MOVE_TO_CONTINUES_NV 0x90B6
+#define GL_CLOSE_PATH_NV 0x00
+#define GL_MOVE_TO_NV 0x02
+#define GL_RELATIVE_MOVE_TO_NV 0x03
+#define GL_LINE_TO_NV 0x04
+#define GL_RELATIVE_LINE_TO_NV 0x05
+#define GL_HORIZONTAL_LINE_TO_NV 0x06
+#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07
+#define GL_VERTICAL_LINE_TO_NV 0x08
+#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09
+#define GL_QUADRATIC_CURVE_TO_NV 0x0A
+#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B
+#define GL_CUBIC_CURVE_TO_NV 0x0C
+#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D
+#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E
+#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F
+#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10
+#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11
+#define GL_SMALL_CCW_ARC_TO_NV 0x12
+#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13
+#define GL_SMALL_CW_ARC_TO_NV 0x14
+#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15
+#define GL_LARGE_CCW_ARC_TO_NV 0x16
+#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17
+#define GL_LARGE_CW_ARC_TO_NV 0x18
+#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19
+#define GL_RESTART_PATH_NV 0xF0
+#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2
+#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4
+#define GL_RECT_NV 0xF6
+#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8
+#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA
+#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC
+#define GL_ARC_TO_NV 0xFE
+#define GL_RELATIVE_ARC_TO_NV 0xFF
+#define GL_BOLD_BIT_NV 0x01
+#define GL_ITALIC_BIT_NV 0x02
+#define GL_GLYPH_WIDTH_BIT_NV 0x01
+#define GL_GLYPH_HEIGHT_BIT_NV 0x02
+#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04
+#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08
+#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10
+#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20
+#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40
+#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80
+#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100
+#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000
+#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000
+#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000
+#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000
+#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000
+#define GL_FONT_ASCENDER_BIT_NV 0x00200000
+#define GL_FONT_DESCENDER_BIT_NV 0x00400000
+#define GL_FONT_HEIGHT_BIT_NV 0x00800000
+#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000
+#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000
+#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000
+#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000
+#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000
+#define GL_PRIMARY_COLOR_NV 0x852C
+#define GL_SECONDARY_COLOR_NV 0x852D
+#define GL_ROUNDED_RECT_NV 0xE8
+#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9
+#define GL_ROUNDED_RECT2_NV 0xEA
+#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB
+#define GL_ROUNDED_RECT4_NV 0xEC
+#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED
+#define GL_ROUNDED_RECT8_NV 0xEE
+#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF
+#define GL_RELATIVE_RECT_NV 0xF7
+#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368
+#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369
+#define GL_FONT_UNAVAILABLE_NV 0x936A
+#define GL_FONT_UNINTELLIGIBLE_NV 0x936B
+#define GL_CONIC_CURVE_TO_NV 0x1A
+#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B
+#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000
+#define GL_STANDARD_FONT_FORMAT_NV 0x936C
+#define GL_2_BYTES_NV 0x1407
+#define GL_3_BYTES_NV 0x1408
+#define GL_4_BYTES_NV 0x1409
+#define GL_EYE_LINEAR_NV 0x2400
+#define GL_OBJECT_LINEAR_NV 0x2401
+#define GL_CONSTANT_NV 0x8576
+#define GL_PATH_PROJECTION_NV 0x1701
+#define GL_PATH_MODELVIEW_NV 0x1700
+#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3
+#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6
+#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36
+#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3
+#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4
+#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7
+#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38
+#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4
+#define GL_FRAGMENT_INPUT_NV 0x936D
+#endif /* GL_NV_path_rendering */
+
+#ifndef GL_SHADER_STORAGE_BLOCK
+#define GL_SHADER_STORAGE_BLOCK 0x92E6
+#endif
+
+#ifndef GL_ACTIVE_RESOURCES
+#define GL_ACTIVE_RESOURCES 0x92F5
+#endif
+
+#ifndef GL_BUFFER_BINDING
+#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301
+#define GL_BUFFER_BINDING 0x9302
+#define GL_BUFFER_DATA_SIZE 0x9303
+#define GL_NUM_ACTIVE_VARIABLES 0x9304
+#define GL_ACTIVE_VARIABLES 0x9305
+#endif
+
+#ifndef GL_UNIFORM
+#define GL_UNIFORM 0x92E1
+#endif
+
+#ifndef GL_COMPUTE_SHADER
+#define GL_COMPUTE_SHADER 0x91B9
+#endif
+
+#endif // __APPLE__ || ANDROID
+
+#endif // QT3DSOPENGLTOKENS_H
diff --git a/src/render/backends/gl/Qt3DSOpenGLUtil.h b/src/render/backends/gl/Qt3DSOpenGLUtil.h
new file mode 100644
index 0000000..32f7dad
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSOpenGLUtil.h
@@ -0,0 +1,2201 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DSOPENGLUTIL_H
+#define QT3DSOPENGLUTIL_H
+
+#include "render/backends/gl/Qt3DSOpenGLPrefix.h"
+#include "render/backends/gl/Qt3DSOpenGLTokens.h"
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLExtraFunctions>
+
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSVec4.h"
+#include "foundation/Qt3DSFoundation.h"
+
+// The actual binding to the hardware the does some minor conversions between gles and
+// the nv render enumeration types
+namespace qt3ds {
+namespace render {
+
+#ifndef GL_TEXTURE_2D_MULTISAMPLE
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#endif
+
+#ifndef GL_IMAGE_2D
+#define GL_IMAGE_2D 0x904D
+#endif
+
+#ifndef GL_MULTISAMPLE_EXT
+#define GL_MULTISAMPLE_EXT 0x809D
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT1
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#endif
+
+#ifndef GL_RED
+#define GL_RED 0x1903
+#define GL_GREEN 0x1904
+#define GL_BLUE 0x1905
+#endif
+
+#ifndef GL_PATCHES
+#define GL_PATCHES 0x000E
+#endif
+
+#ifndef GL_READ_ONLY
+#define GL_READ_ONLY 0x88B8
+#define GL_WRITE_ONLY 0x88B9
+#define GL_READ_WRITE 0x88BA
+#endif
+
+#ifndef GL_SHADER_STORAGE_BUFFER
+#define GL_SHADER_STORAGE_BUFFER 0x90D2
+#endif
+
+#ifndef GL_ATOMIC_COUNTER_BUFFER
+#define GL_ATOMIC_COUNTER_BUFFER 0x92C0
+#endif
+
+#ifndef GL_DRAW_INDIRECT_BUFFER
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#endif
+
+#ifndef GL_VERTEX_SHADER_BIT
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#endif
+
+#ifndef GL_FRAGMENT_SHADER_BIT
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#endif
+
+#ifndef GL_GEOMETRY_SHADER_BIT
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#endif
+
+#ifndef GL_TESS_CONTROL_SHADER_BIT
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#endif
+
+#ifndef GL_TESS_EVALUATION_SHADER_BIT
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#endif
+
+#ifndef GL_ETC1_RGB8_OES
+#define GL_ETC1_RGB8_OES 0x8D64
+#endif
+
+#ifndef GL_COMPRESSED_RED_RGTC1
+#define GL_COMPRESSED_RED_RGTC1 0x8DBB
+#endif
+
+#ifndef GL_COMPRESSED_SIGNED_RED_RGTC1
+#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC
+#endif
+
+#ifndef GL_COMPRESSED_RG_RGTC2
+#define GL_COMPRESSED_RG_RGTC2 0x8DBD
+#endif
+
+#ifndef GL_COMPRESSED_SIGNED_RG_RGTC2
+#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE
+#endif
+
+#ifndef GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
+#endif
+
+#ifndef GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
+#endif
+
+#ifndef GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
+#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
+#endif
+
+#ifndef GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
+#endif
+
+#ifndef GL_COMPRESSED_RGB8_ETC2
+#define GL_COMPRESSED_RGB8_ETC2 0x9274
+#endif
+
+#ifndef GL_COMPRESSED_SRGB8_ETC2
+#define GL_COMPRESSED_SRGB8_ETC2 0x9275
+#endif
+
+#ifndef GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#endif
+
+#ifndef GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#endif
+
+#ifndef GL_COMPRESSED_RGBA8_ETC2_EAC
+#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
+#endif
+
+#ifndef GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#endif
+
+#ifndef GL_COMPRESSED_R11_EAC
+#define GL_COMPRESSED_R11_EAC 0x9270
+#endif
+
+#ifndef GL_COMPRESSED_SIGNED_R11_EAC
+#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271
+#endif
+
+#ifndef GL_COMPRESSED_RG11_EAC
+#define GL_COMPRESSED_RG11_EAC 0x9272
+#endif
+
+#ifndef GL_COMPRESSED_SIGNED_RG11_EAC
+#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273
+#endif
+
+#define QT3DS_RENDER_ITERATE_QT3DS_GL_COLOR_FUNC \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ZERO, Zero) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ONE, One) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_SRC_COLOR, SrcColor) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ONE_MINUS_SRC_COLOR, OneMinusSrcColor) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_DST_COLOR, DstColor) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ONE_MINUS_DST_COLOR, OneMinusDstColor) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_SRC_ALPHA, SrcAlpha) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ONE_MINUS_SRC_ALPHA, OneMinusSrcAlpha) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_DST_ALPHA, DstAlpha) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ONE_MINUS_DST_ALPHA, OneMinusDstAlpha) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_CONSTANT_COLOR, ConstantColor) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ONE_MINUS_CONSTANT_COLOR, OneMinusConstantColor) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_CONSTANT_ALPHA, ConstantAlpha) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(GL_ONE_MINUS_CONSTANT_ALPHA, OneMinusConstantAlpha) \
+ QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY(GL_SRC_ALPHA_SATURATE, SrcAlphaSaturate)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_RENDER_FACE \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_FACE(GL_FRONT, Front) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_FACE(GL_BACK, Back) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_FACE(GL_FRONT_AND_BACK, FrontAndBack)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_RENDER_WINDING \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_WINDING(GL_CW, Clockwise) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_WINDING(GL_CCW, CounterClockwise)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_BOOL_OP \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_NEVER, Never) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_LESS, Less) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_EQUAL, Equal) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_LEQUAL, LessThanOrEqual) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_GREATER, Greater) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_NOTEQUAL, NotEqual) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_GEQUAL, GreaterThanOrEqual) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(GL_ALWAYS, AlwaysTrue)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_HINT \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_HINT(GL_FASTEST, Fastest) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_HINT(GL_NICEST, Nicest) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_HINT(GL_DONT_CARE, Unspecified)
+
+#define QT3DS_RENDER_ITERATE_QT3DS_GL_STENCIL_OP \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_KEEP, Keep) \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_ZERO, Zero) \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_REPLACE, Replace) \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_INCR, Increment) \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_INCR_WRAP, IncrementWrap) \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_DECR, Decrement) \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_DECR_WRAP, DecrementWrap) \
+ QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(GL_INVERT, Invert)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_BUFFER_COMPONENT_TYPES \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(GL_UNSIGNED_BYTE, QT3DSU8) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(GL_BYTE, QT3DSI8) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(GL_UNSIGNED_SHORT, QT3DSU16) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(GL_SHORT, QT3DSI16) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(GL_UNSIGNED_INT, QT3DSU32) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE_ALIAS(GL_INT, QT3DSI32) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(GL_FLOAT, QT3DSF32)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_BUFFER_USAGE_TYPE \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BUFFER_USAGE_TYPE(GL_STATIC_DRAW, Static) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_BUFFER_USAGE_TYPE(GL_DYNAMIC_DRAW, Dynamic)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_SCALE_OP \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP(GL_NEAREST, Nearest) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP(GL_LINEAR, Linear) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(GL_NEAREST_MIPMAP_NEAREST, NearestMipmapNearest) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(GL_LINEAR_MIPMAP_NEAREST, LinearMipmapNearest) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(GL_NEAREST_MIPMAP_LINEAR, NearestMipmapLinear) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(GL_LINEAR_MIPMAP_LINEAR, LinearMipmapLinear)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_WRAP_OP \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_WRAP_OP(GL_CLAMP_TO_EDGE, ClampToEdge) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_WRAP_OP(GL_MIRRORED_REPEAT, MirroredRepeat) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_WRAP_OP(GL_REPEAT, Repeat)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_SHADER_UNIFORM_TYPES \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_FLOAT, QT3DSF32) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_FLOAT_VEC2, QT3DSVec2) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_FLOAT_VEC3, QT3DSVec3) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_FLOAT_VEC4, QT3DSVec4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_INT, QT3DSI32) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_INT_VEC2, QT3DSI32_2) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_INT_VEC3, QT3DSI32_3) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_INT_VEC4, QT3DSI32_4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_BOOL, QT3DSRenderBool) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_BOOL_VEC2, bool_2) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_BOOL_VEC3, bool_3) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_BOOL_VEC4, bool_4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_UNSIGNED_INT, QT3DSU32) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_UNSIGNED_INT_VEC2, QT3DSU32_2) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_UNSIGNED_INT_VEC3, QT3DSU32_3) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_UNSIGNED_INT_VEC4, QT3DSU32_4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_FLOAT_MAT3, QT3DSMat33) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_FLOAT_MAT4, QT3DSMat44) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_SAMPLER_2D, NVRenderTexture2DPtr) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_SAMPLER_2D_ARRAY, NVRenderTexture2DArrayPtr) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_SAMPLER_CUBE, NVRenderTextureCubePtr) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(GL_IMAGE_2D, NVRenderImage2DPtr)
+// cube Sampler and mat22 unsupported
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_SHADER_ATTRIB_TYPES \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(GL_FLOAT, QT3DSF32, 1) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(GL_FLOAT_VEC2, QT3DSF32, 2) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(GL_FLOAT_VEC3, QT3DSF32, 3) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(GL_FLOAT_VEC4, QT3DSF32, 4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(GL_FLOAT_MAT2, QT3DSF32, 4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(GL_FLOAT_MAT3, QT3DSF32, 9) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(GL_FLOAT_MAT4, QT3DSF32, 16)
+#if defined(GL_DEPTH_COMPONENT32)
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_RENDERBUFFER_FORMATS \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_RGBA4, RGBA4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_RGB565, RGB565) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_RGB5_A1, RGBA5551) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_DEPTH_COMPONENT16, Depth16) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_DEPTH_COMPONENT24, Depth24) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_DEPTH_COMPONENT32, Depth32) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_STENCIL_INDEX8, StencilIndex8)
+#else
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_RENDERBUFFER_FORMATS \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_RGBA4, RGBA4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_RGB565, RGB565) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_RGB5_A1, RGBA5551) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_DEPTH_COMPONENT16, Depth16) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_DEPTH_COMPONENT24, Depth24) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(GL_STENCIL_INDEX8, StencilIndex8)
+#endif
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_FRAMEBUFFER_ATTACHMENTS \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color0, 0) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color1, 1) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color2, 2) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color3, 3) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color4, 4) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color5, 5) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color6, 6) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(Color7, 7) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_ATTACHMENT(GL_DEPTH_ATTACHMENT, Depth) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_ATTACHMENT(GL_STENCIL_ATTACHMENT, Stencil) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_ATTACHMENT(GL_DEPTH_STENCIL_ATTACHMENT, DepthStencil)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_CLEAR_FLAGS \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_CLEAR_FLAGS(GL_COLOR_BUFFER_BIT, Color) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_CLEAR_FLAGS(GL_DEPTH_BUFFER_BIT, Depth) \
+ QT3DS_RENDER_HANDLE_GL_QT3DS_CLEAR_FLAGS(GL_STENCIL_BUFFER_BIT, Stencil)
+
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_RENDERBUFFER_COVERAGE_FORMATS
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_FRAMEBUFFER_COVERAGE_ATTACHMENTS
+#define QT3DS_RENDER_ITERATE_GL_QT3DS_CLEAR_COVERAGE_FLAGS
+
+ static bool IsGlEsContext(NVRenderContextType inContextType)
+ {
+ NVRenderContextType esContextTypes(NVRenderContextValues::GLES2
+ | NVRenderContextValues::GLES3
+ | NVRenderContextValues::GLES3PLUS);
+
+ if ((inContextType & esContextTypes))
+ return true;
+
+ return false;
+ }
+
+ struct GLConversion
+ {
+ GLConversion()
+ { }
+
+ static const char *processGLError(GLenum error)
+ {
+ const char *errorString = "";
+ switch (error) {
+#define stringiseError(error) \
+ case error: \
+ errorString = #error; \
+ break
+ stringiseError(GL_NO_ERROR);
+ stringiseError(GL_INVALID_ENUM);
+ stringiseError(GL_INVALID_VALUE);
+ stringiseError(GL_INVALID_OPERATION);
+ stringiseError(GL_INVALID_FRAMEBUFFER_OPERATION);
+ stringiseError(GL_OUT_OF_MEMORY);
+#undef stringiseError
+ default:
+ errorString = "Unknown GL error";
+ break;
+ }
+ return errorString;
+ }
+
+ static NVRenderSrcBlendFunc::Enum fromGLToSrcBlendFunc(QT3DSI32 value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(srcVal, enumVal) \
+ case srcVal: \
+ return NVRenderSrcBlendFunc::enumVal;
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY(srcVal, enumVal) \
+ case srcVal: \
+ return NVRenderSrcBlendFunc::enumVal;
+ QT3DS_RENDER_ITERATE_QT3DS_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY
+ default:
+ QT3DS_ASSERT(false);
+ return NVRenderSrcBlendFunc::Unknown;
+ }
+ }
+
+ static GLenum fromSrcBlendFuncToGL(NVRenderSrcBlendFunc::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(srcVal, enumVal) \
+ case NVRenderSrcBlendFunc::enumVal: \
+ return srcVal;
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY(srcVal, enumVal) \
+ case NVRenderSrcBlendFunc::enumVal: \
+ return srcVal;
+ QT3DS_RENDER_ITERATE_QT3DS_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY
+ default:
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ }
+
+ static NVRenderDstBlendFunc::Enum fromGLToDstBlendFunc(QT3DSI32 value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(srcVal, enumVal) \
+ case srcVal: \
+ return NVRenderDstBlendFunc::enumVal;
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY(srcVal, enumVal)
+ QT3DS_RENDER_ITERATE_QT3DS_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY
+ default:
+ QT3DS_ASSERT(false);
+ return NVRenderDstBlendFunc::Unknown;
+ }
+ }
+
+ static GLenum fromDstBlendFuncToGL(NVRenderDstBlendFunc::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC(srcVal, enumVal) \
+ case NVRenderDstBlendFunc::enumVal: \
+ return srcVal;
+#define QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY(srcVal, enumVal)
+ QT3DS_RENDER_ITERATE_QT3DS_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC
+#undef QT3DS_RENDER_HANDLE_GL_COLOR_FUNC_SRC_ONLY
+ default:
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ }
+
+ static GLenum fromBlendEquationToGL(NVRenderBlendEquation::Enum value,
+ bool nvAdvancedBlendSupported,
+ bool khrAdvancedBlendSupported)
+ {
+ switch (value) {
+ case NVRenderBlendEquation::Add:
+ return GL_FUNC_ADD;
+ case NVRenderBlendEquation::Subtract:
+ return GL_FUNC_SUBTRACT;
+ case NVRenderBlendEquation::ReverseSubtract:
+ return GL_FUNC_REVERSE_SUBTRACT;
+ default:
+ QT3DS_ASSERT(nvAdvancedBlendSupported || khrAdvancedBlendSupported);
+ break;
+ }
+
+ if (nvAdvancedBlendSupported) {
+ switch (value) {
+ case NVRenderBlendEquation::Overlay:
+ return GL_OVERLAY_NV;
+ case NVRenderBlendEquation::ColorBurn:
+ return GL_COLORBURN_NV;
+ case NVRenderBlendEquation::ColorDodge:
+ return GL_COLORDODGE_NV;
+ default:
+ break;
+ }
+ }
+
+#if defined(GL_KHR_blend_equation_advanced)
+ if (khrAdvancedBlendSupported) {
+ switch (value) {
+ case NVRenderBlendEquation::Overlay:
+ return GL_OVERLAY_KHR;
+ case NVRenderBlendEquation::ColorBurn:
+ return GL_COLORBURN_KHR;
+ case NVRenderBlendEquation::ColorDodge:
+ return GL_COLORDODGE_KHR;
+ default:
+ break;
+ }
+ }
+#endif
+
+ QT3DS_ASSERT(false);
+ return GL_FUNC_ADD;
+ }
+
+ static NVRenderFaces::Enum fromGLToFaces(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_FACE(x, y) \
+ case x: \
+ return NVRenderFaces::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDER_FACE
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_FACE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderFaces::Unknown;
+ }
+
+ static GLenum fromFacesToGL(NVRenderFaces::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_FACE(x, y) \
+ case NVRenderFaces::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDER_FACE
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_FACE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVReadFaces::Enum fromGLToReadFaces(GLenum value)
+ {
+ switch (value) {
+ case GL_FRONT:
+ return NVReadFaces::Front;
+ case GL_BACK:
+ return NVReadFaces::Back;
+ case GL_COLOR_ATTACHMENT0:
+ return NVReadFaces::Color0;
+ case GL_COLOR_ATTACHMENT1:
+ return NVReadFaces::Color1;
+ case GL_COLOR_ATTACHMENT2:
+ return NVReadFaces::Color2;
+ case GL_COLOR_ATTACHMENT3:
+ return NVReadFaces::Color3;
+ case GL_COLOR_ATTACHMENT4:
+ return NVReadFaces::Color4;
+ case GL_COLOR_ATTACHMENT5:
+ return NVReadFaces::Color5;
+ case GL_COLOR_ATTACHMENT6:
+ return NVReadFaces::Color6;
+ case GL_COLOR_ATTACHMENT7:
+ return NVReadFaces::Color7;
+
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVReadFaces::Unknown;
+ }
+
+ static GLenum fromReadFacesToGL(NVReadFaces::Enum value)
+ {
+ switch (value) {
+ case NVReadFaces::Front:
+ return GL_FRONT;
+ case NVReadFaces::Back:
+ return GL_BACK;
+ case NVReadFaces::Color0:
+ return GL_COLOR_ATTACHMENT0;
+ case NVReadFaces::Color1:
+ return GL_COLOR_ATTACHMENT1;
+ case NVReadFaces::Color2:
+ return GL_COLOR_ATTACHMENT2;
+ case NVReadFaces::Color3:
+ return GL_COLOR_ATTACHMENT3;
+ case NVReadFaces::Color4:
+ return GL_COLOR_ATTACHMENT4;
+ case NVReadFaces::Color5:
+ return GL_COLOR_ATTACHMENT5;
+ case NVReadFaces::Color6:
+ return GL_COLOR_ATTACHMENT6;
+ case NVReadFaces::Color7:
+ return GL_COLOR_ATTACHMENT7;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderWinding::Enum fromGLToWinding(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_WINDING(x, y) \
+ case x: \
+ return NVRenderWinding::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDER_WINDING
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_WINDING
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderWinding::Unknown;
+ }
+
+ static GLenum fromWindingToGL(NVRenderWinding::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_WINDING(x, y) \
+ case NVRenderWinding::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDER_WINDING
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_RENDER_WINDING
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderBoolOp::Enum fromGLToBoolOp(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(x, y) \
+ case x: \
+ return NVRenderBoolOp::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_BOOL_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderBoolOp::Unknown;
+ }
+
+ static GLenum fromBoolOpToGL(NVRenderBoolOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(x, y) \
+ case NVRenderBoolOp::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_BOOL_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderHint::Enum fromGLToHint(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_HINT(x, y) \
+ case x: \
+ return NVRenderHint::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_HINT
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_HINT
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderHint::Unknown;
+ }
+
+ static GLenum fromHintToGL(NVRenderHint::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_HINT(x, y) \
+ case NVRenderHint::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_HINT
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_HINT
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderStencilOp::Enum fromGLToStencilOp(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(x, y) \
+ case x: \
+ return NVRenderStencilOp::y;
+ QT3DS_RENDER_ITERATE_QT3DS_GL_STENCIL_OP
+#undef QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return NVRenderStencilOp::Unknown;
+ }
+
+ static GLenum fromStencilOpToGL(NVRenderStencilOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP(x, y) \
+ case NVRenderStencilOp::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_QT3DS_GL_STENCIL_OP
+#undef QT3DS_RENDER_HANDLE_QT3DS_GL_STENCIL_OP
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderComponentTypes::Enum fromGLToBufferComponentTypes(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(x, y) \
+ case x: \
+ return NVRenderComponentTypes::y;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE_ALIAS(x, y)
+ QT3DS_RENDER_ITERATE_GL_QT3DS_BUFFER_COMPONENT_TYPES
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE_ALIAS
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderComponentTypes::Unknown;
+ }
+
+ static GLenum fromBufferComponentTypesToGL(NVRenderComponentTypes::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE(x, y) \
+ case NVRenderComponentTypes::y: \
+ return x;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE_ALIAS(x, y) \
+ case NVRenderComponentTypes::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_BUFFER_COMPONENT_TYPES
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_COMPONENT_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static GLenum fromIndexBufferComponentsTypesToGL(NVRenderComponentTypes::Enum value)
+ {
+ switch (value) {
+ case NVRenderComponentTypes::QT3DSU8:
+ return GL_UNSIGNED_BYTE;
+ case NVRenderComponentTypes::QT3DSU16:
+ return GL_UNSIGNED_SHORT;
+ case NVRenderComponentTypes::QT3DSU32:
+ return GL_UNSIGNED_INT;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static GLenum fromBindBufferFlagsToGL(NVRenderBufferBindFlags flags)
+ {
+ QT3DSU32 value = flags;
+ GLenum retval = GL_INVALID_ENUM;
+ if (value & NVRenderBufferBindValues::Vertex)
+ retval = GL_ARRAY_BUFFER;
+ else if (value & NVRenderBufferBindValues::Index)
+ retval = GL_ELEMENT_ARRAY_BUFFER;
+ else if (value & NVRenderBufferBindValues::Constant)
+ retval = GL_UNIFORM_BUFFER;
+ else if (value & NVRenderBufferBindValues::Storage)
+ retval = GL_SHADER_STORAGE_BUFFER;
+ else if (value & NVRenderBufferBindValues::Atomic_Counter)
+ retval = GL_ATOMIC_COUNTER_BUFFER;
+ else if (value & NVRenderBufferBindValues::Draw_Indirect)
+ retval = GL_DRAW_INDIRECT_BUFFER;
+ else
+ QT3DS_ASSERT(false);
+
+ return retval;
+ }
+
+ static NVRenderBufferBindFlags fromGLToBindBufferFlags(GLenum value)
+ {
+ QT3DSU32 retval = 0;
+
+ if (value == GL_ARRAY_BUFFER)
+ retval |= NVRenderBufferBindValues::Vertex;
+ else if (value == GL_ELEMENT_ARRAY_BUFFER)
+ retval |= NVRenderBufferBindValues::Index;
+ else if (value == GL_UNIFORM_BUFFER)
+ retval |= NVRenderBufferBindValues::Constant;
+ else if (value == GL_SHADER_STORAGE_BUFFER)
+ retval |= NVRenderBufferBindValues::Storage;
+ else if (value == GL_ATOMIC_COUNTER_BUFFER)
+ retval |= NVRenderBufferBindValues::Atomic_Counter;
+ else if (value == GL_DRAW_INDIRECT_BUFFER)
+ retval |= NVRenderBufferBindValues::Draw_Indirect;
+ else
+ QT3DS_ASSERT(false);
+
+ return NVRenderBufferBindFlags(retval);
+ }
+
+ static NVRenderBufferUsageType::Enum fromGLToBufferUsageType(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_BUFFER_USAGE_TYPE(x, y) \
+ case x: \
+ return NVRenderBufferUsageType::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_BUFFER_USAGE_TYPE
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_BUFFER_USAGE_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderBufferUsageType::Unknown;
+ }
+
+ static GLenum fromBufferUsageTypeToGL(NVRenderBufferUsageType::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_BUFFER_USAGE_TYPE(x, y) \
+ case NVRenderBufferUsageType::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_BUFFER_USAGE_TYPE
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_BUFFER_USAGE_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static GLenum fromQueryTypeToGL(NVRenderQueryType::Enum type)
+ {
+ GLenum retval = GL_INVALID_ENUM;
+ if (type == NVRenderQueryType::Samples)
+ retval = GL_ANY_SAMPLES_PASSED;
+#if defined(GL_TIME_ELAPSED)
+ else if (type == NVRenderQueryType::Timer)
+ retval = GL_TIME_ELAPSED;
+#elif defined(GL_TIME_ELAPSED_EXT)
+ else if (type == NVRenderQueryType::Timer)
+ retval = GL_TIME_ELAPSED_EXT;
+#endif
+ else
+ QT3DS_ASSERT(false);
+
+ return retval;
+ }
+
+ static GLenum fromQueryResultTypeToGL(NVRenderQueryResultType::Enum type)
+ {
+ GLenum retval = GL_INVALID_ENUM;
+ if (type == NVRenderQueryResultType::ResultAvailable)
+ retval = GL_QUERY_RESULT_AVAILABLE;
+ else if (type == NVRenderQueryResultType::Result)
+ retval = GL_QUERY_RESULT;
+ else
+ QT3DS_ASSERT(false);
+
+ return retval;
+ }
+
+ static GLenum fromSyncTypeToGL(NVRenderSyncType::Enum type)
+ {
+ GLenum retval = GL_INVALID_ENUM;
+ if (type == NVRenderSyncType::GpuCommandsComplete)
+ retval = GL_SYNC_GPU_COMMANDS_COMPLETE;
+ else
+ QT3DS_ASSERT(false);
+
+ return retval;
+ }
+
+ static NVRenderTextureFormats::Enum
+ replaceDeprecatedTextureFormat(NVRenderContextType type, NVRenderTextureFormats::Enum value,
+ NVRenderTextureSwizzleMode::Enum &swizzleMode)
+ {
+ NVRenderContextType deprecatedContextFlags(NVRenderContextValues::GL2
+ | NVRenderContextValues::GLES2);
+ NVRenderTextureFormats::Enum newValue = value;
+ swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+
+ if (!(type & deprecatedContextFlags)) {
+ switch (value) {
+ case NVRenderTextureFormats::Luminance8:
+ newValue = NVRenderTextureFormats::R8;
+ swizzleMode = NVRenderTextureSwizzleMode::L8toR8;
+ break;
+ case NVRenderTextureFormats::LuminanceAlpha8:
+ newValue = NVRenderTextureFormats::RG8;
+ swizzleMode = NVRenderTextureSwizzleMode::L8A8toRG8;
+ break;
+ case NVRenderTextureFormats::Alpha8:
+ newValue = NVRenderTextureFormats::R8;
+ swizzleMode = NVRenderTextureSwizzleMode::A8toR8;
+ break;
+ case NVRenderTextureFormats::Luminance16:
+ newValue = NVRenderTextureFormats::R16;
+ swizzleMode = NVRenderTextureSwizzleMode::L16toR16;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return newValue;
+ }
+
+ static void
+ NVRenderConvertSwizzleModeToGL(const NVRenderTextureSwizzleMode::Enum swizzleMode,
+ GLint glSwizzle[4])
+ {
+ switch (swizzleMode) {
+ case NVRenderTextureSwizzleMode::L16toR16:
+ case NVRenderTextureSwizzleMode::L8toR8:
+ glSwizzle[0] = GL_RED;
+ glSwizzle[1] = GL_RED;
+ glSwizzle[2] = GL_RED;
+ glSwizzle[3] = GL_ONE;
+ break;
+ case NVRenderTextureSwizzleMode::L8A8toRG8:
+ glSwizzle[0] = GL_RED;
+ glSwizzle[1] = GL_RED;
+ glSwizzle[2] = GL_RED;
+ glSwizzle[3] = GL_GREEN;
+ break;
+ case NVRenderTextureSwizzleMode::A8toR8:
+ glSwizzle[0] = GL_ZERO;
+ glSwizzle[1] = GL_ZERO;
+ glSwizzle[2] = GL_ZERO;
+ glSwizzle[3] = GL_RED;
+ break;
+ case NVRenderTextureSwizzleMode::NoSwizzle:
+ default:
+ glSwizzle[0] = GL_RED;
+ glSwizzle[1] = GL_GREEN;
+ glSwizzle[2] = GL_BLUE;
+ glSwizzle[3] = GL_ALPHA;
+ break;
+ }
+ }
+
+ static bool fromUncompressedTextureFormatToGL(NVRenderContextType type,
+ NVRenderTextureFormats::Enum value,
+ GLenum &outFormat, GLenum &outDataType,
+ GLenum &outInternalFormat)
+ {
+ switch (value) {
+ case NVRenderTextureFormats::R8:
+ if (type == NVRenderContextValues::GLES2) {
+ outFormat = GL_ALPHA;
+ outInternalFormat = GL_ALPHA;
+ } else {
+ outFormat = GL_RED;
+ outInternalFormat = GL_R8;
+ }
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::RG8:
+ outFormat = GL_RG;
+ outInternalFormat = GL_RG8;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::RGBA8:
+ outFormat = GL_RGBA;
+ outInternalFormat = GL_RGBA8;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::RGB8:
+ outFormat = GL_RGB;
+ outInternalFormat = GL_RGB8;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::RGB565:
+ outFormat = GL_RGB;
+ outInternalFormat = GL_RGB8;
+ outDataType = GL_UNSIGNED_SHORT_5_6_5;
+ return true;
+ case NVRenderTextureFormats::RGBA5551:
+ outFormat = GL_RGBA;
+ outInternalFormat = GL_RGBA8;
+ outDataType = GL_UNSIGNED_SHORT_5_5_5_1;
+ return true;
+ case NVRenderTextureFormats::Alpha8:
+ outFormat = GL_ALPHA;
+ outInternalFormat = GL_ALPHA;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::Luminance8:
+ outFormat = GL_LUMINANCE;
+ outInternalFormat = GL_LUMINANCE;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::LuminanceAlpha8:
+ outFormat = GL_LUMINANCE_ALPHA;
+ outInternalFormat = GL_LUMINANCE_ALPHA;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::Luminance16:
+#if defined(QT_OPENGL_ES)
+ outFormat = GL_LUMINANCE16F_EXT;
+ outInternalFormat = GL_LUMINANCE16F_EXT;
+#else
+ outFormat = GL_LUMINANCE;
+ outInternalFormat = GL_LUMINANCE;
+#endif
+ outDataType = GL_UNSIGNED_INT;
+ return true;
+ default:
+ break;
+ }
+
+ NVRenderContextType contextFlags(NVRenderContextValues::GL2
+ | NVRenderContextValues::GLES2);
+ // check extented texture formats
+ if (!(type & contextFlags)) {
+ switch (value) {
+#if !defined(QT_OPENGL_ES)
+ case NVRenderTextureFormats::R16: {
+ if (IsGlEsContext(type)) {
+ outFormat = GL_RED_INTEGER;
+ outInternalFormat = GL_R16UI;
+ } else {
+ outFormat = GL_RED;
+ outInternalFormat = GL_R16;
+ }
+ outDataType = GL_UNSIGNED_SHORT;
+ return true;
+ }
+#endif
+ case NVRenderTextureFormats::R16F:
+ outFormat = GL_RED;
+ outInternalFormat = GL_R16F;
+ outDataType = GL_HALF_FLOAT;
+ return true;
+ case NVRenderTextureFormats::R32UI:
+ outFormat = GL_RED_INTEGER;
+ outInternalFormat = GL_R32UI;
+ outDataType = GL_UNSIGNED_INT;
+ return true;
+ case NVRenderTextureFormats::R32F:
+ outFormat = GL_RED;
+ outInternalFormat = GL_R32F;
+ outDataType = GL_FLOAT;
+ return true;
+ case NVRenderTextureFormats::RGBA16F:
+ outFormat = GL_RGBA;
+ outInternalFormat = GL_RGBA16F;
+ outDataType = GL_HALF_FLOAT;
+ return true;
+ case NVRenderTextureFormats::RG16F:
+ outFormat = GL_RG;
+ outInternalFormat = GL_RG16F;
+ outDataType = GL_HALF_FLOAT;
+ return true;
+ case NVRenderTextureFormats::RG32F:
+ outFormat = GL_RG;
+ outInternalFormat = GL_RG32F;
+ outDataType = GL_FLOAT;
+ return true;
+ case NVRenderTextureFormats::RGBA32F:
+ outFormat = GL_RGBA;
+ outInternalFormat = GL_RGBA32F;
+ outDataType = GL_FLOAT;
+ return true;
+ case NVRenderTextureFormats::RGB32F:
+ outFormat = GL_RGB;
+ outInternalFormat = GL_RGB32F;
+ outDataType = GL_FLOAT;
+ return true;
+ case NVRenderTextureFormats::R11G11B10:
+ outFormat = GL_RGB;
+ outInternalFormat = GL_R11F_G11F_B10F;
+ outDataType = GL_UNSIGNED_INT_10F_11F_11F_REV;
+ return true;
+ case NVRenderTextureFormats::RGB9E5:
+ outFormat = GL_RGB;
+ outInternalFormat = GL_RGB9_E5;
+ outDataType = GL_UNSIGNED_INT_5_9_9_9_REV;
+ return true;
+ case NVRenderTextureFormats::SRGB8:
+ outFormat = GL_RGB;
+ outInternalFormat = GL_SRGB8;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ case NVRenderTextureFormats::SRGB8A8:
+ outFormat = GL_RGBA;
+ outInternalFormat = GL_SRGB8_ALPHA8;
+ outDataType = GL_UNSIGNED_BYTE;
+ return true;
+ default:
+ break;
+ }
+ }
+
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ static GLenum fromCompressedTextureFormatToGL(NVRenderTextureFormats::Enum value)
+ {
+ switch (value) {
+ case NVRenderTextureFormats::RGBA_DXT1:
+ return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+ case NVRenderTextureFormats::RGB_DXT1:
+ return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
+ case NVRenderTextureFormats::RGBA_DXT3:
+ return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
+ case NVRenderTextureFormats::RGBA_DXT5:
+ return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
+ case NVRenderTextureFormats::R_ATI1N_UNorm:
+ return GL_COMPRESSED_RED_RGTC1;
+ case NVRenderTextureFormats::R_ATI1N_SNorm:
+ return GL_COMPRESSED_SIGNED_RED_RGTC1;
+ case NVRenderTextureFormats::RG_ATI2N_UNorm:
+ return GL_COMPRESSED_RG_RGTC2;
+ case NVRenderTextureFormats::RG_ATI2N_SNorm:
+ return GL_COMPRESSED_SIGNED_RG_RGTC2;
+ case NVRenderTextureFormats::RGB_BP_UNSIGNED_FLOAT:
+ return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB;
+ case NVRenderTextureFormats::RGB_BP_SIGNED_FLOAT:
+ return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB;
+ case NVRenderTextureFormats::RGB_BP_UNorm:
+ return GL_COMPRESSED_RGBA_BPTC_UNORM_ARB;
+ case NVRenderTextureFormats::R11_EAC_UNorm:
+ return GL_COMPRESSED_R11_EAC;
+ case NVRenderTextureFormats::R11_EAC_SNorm:
+ return GL_COMPRESSED_SIGNED_R11_EAC;
+ case NVRenderTextureFormats::RG11_EAC_UNorm:
+ return GL_COMPRESSED_RG11_EAC;
+ case NVRenderTextureFormats::RG11_EAC_SNorm:
+ return GL_COMPRESSED_SIGNED_RG11_EAC;
+ case NVRenderTextureFormats::RGB8_ETC2:
+ return GL_COMPRESSED_RGB8_ETC2;
+ case NVRenderTextureFormats::SRGB8_ETC2:
+ return GL_COMPRESSED_SRGB8_ETC2;
+ case NVRenderTextureFormats::RGB8_PunchThrough_Alpha1_ETC2:
+ return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+ case NVRenderTextureFormats::SRGB8_PunchThrough_Alpha1_ETC2:
+ return GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+ case NVRenderTextureFormats::RGBA8_ETC2_EAC:
+ return GL_COMPRESSED_RGBA8_ETC2_EAC;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ETC2_EAC:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
+ case NVRenderTextureFormats::RGB8_ETC1:
+ return GL_ETC1_RGB8_OES;
+#ifdef GL_KHR_texture_compression_astc_hdr
+ case NVRenderTextureFormats::RGBA_ASTC_4x4:
+ return GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_5x4:
+ return GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_5x5:
+ return GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_6x5:
+ return GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_6x6:
+ return GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_8x5:
+ return GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_8x6:
+ return GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_8x8:
+ return GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_10x5:
+ return GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_10x6:
+ return GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_10x8:
+ return GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_10x10:
+ return GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_12x10:
+ return GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
+ case NVRenderTextureFormats::RGBA_ASTC_12x12:
+ return GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_4x4:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_5x4:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_5x5:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_6x5:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_6x6:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_8x5:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_8x6:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_8x8:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x5:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x6:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x8:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_10x10:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_12x10:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
+ case NVRenderTextureFormats::SRGB8_Alpha8_ASTC_12x12:
+ return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
+#endif // GL_KHR_texture_compression_astc_hdr
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static bool fromDepthTextureFormatToGL(NVRenderContextType type,
+ NVRenderTextureFormats::Enum value,
+ GLenum &outFormat, GLenum &outDataType,
+ GLenum &outInternalFormat)
+ {
+ NVRenderContextType theContextFlags(NVRenderContextValues::GLES2
+ | NVRenderContextValues::GL2);
+
+ bool supportDepth24 = !(type & theContextFlags);
+ bool supportDepth32f = !(type & theContextFlags);
+ bool supportDepth24Stencil8 = !(type & theContextFlags);
+
+ switch (value) {
+ case NVRenderTextureFormats::Depth16:
+ outFormat = GL_DEPTH_COMPONENT;
+ outInternalFormat = GL_DEPTH_COMPONENT16;
+ outDataType = GL_UNSIGNED_SHORT;
+ return true;
+ case NVRenderTextureFormats::Depth24:
+ outFormat = GL_DEPTH_COMPONENT;
+ outInternalFormat = (supportDepth24) ? GL_DEPTH_COMPONENT24 : GL_DEPTH_COMPONENT16;
+ outDataType = (supportDepth24) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
+ return true;
+ case NVRenderTextureFormats::Depth32:
+ outFormat = GL_DEPTH_COMPONENT;
+ outInternalFormat =
+ (supportDepth32f) ? GL_DEPTH_COMPONENT32F : GL_DEPTH_COMPONENT16;
+ outDataType = (supportDepth32f) ? GL_FLOAT : GL_UNSIGNED_SHORT;
+ return true;
+ case NVRenderTextureFormats::Depth24Stencil8:
+ outFormat = (supportDepth24Stencil8) ? GL_DEPTH_STENCIL : GL_DEPTH_COMPONENT;
+ outInternalFormat =
+ (supportDepth24Stencil8) ? GL_DEPTH24_STENCIL8 : GL_DEPTH_COMPONENT16;
+ outDataType = (supportDepth24Stencil8) ? GL_UNSIGNED_INT_24_8 : GL_UNSIGNED_SHORT;
+ return true;
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ static GLenum fromTextureTargetToGL(NVRenderTextureTargetType::Enum value)
+ {
+ GLenum retval = 0;
+ if (value == NVRenderTextureTargetType::Texture2D)
+ retval = GL_TEXTURE_2D;
+ else if (value == NVRenderTextureTargetType::Texture2D_MS)
+ retval = GL_TEXTURE_2D_MULTISAMPLE;
+ else if (value == NVRenderTextureTargetType::Texture2D_Array)
+ retval = GL_TEXTURE_2D_ARRAY;
+ else if (value == NVRenderTextureTargetType::TextureCube)
+ retval = GL_TEXTURE_CUBE_MAP;
+ else if (value == NVRenderTextureTargetType::TextureCubeNegX)
+ retval = GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
+ else if (value == NVRenderTextureTargetType::TextureCubePosX)
+ retval = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
+ else if (value == NVRenderTextureTargetType::TextureCubeNegY)
+ retval = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
+ else if (value == NVRenderTextureTargetType::TextureCubePosY)
+ retval = GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
+ else if (value == NVRenderTextureTargetType::TextureCubeNegZ)
+ retval = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
+ else if (value == NVRenderTextureTargetType::TextureCubePosZ)
+ retval = GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
+ else
+ QT3DS_ASSERT(false);
+
+ return retval;
+ }
+
+ static NVRenderTextureTargetType::Enum fromGLToTextureTarget(GLenum value)
+ {
+ NVRenderTextureTargetType::Enum retval = NVRenderTextureTargetType::Unknown;
+
+ if (value == GL_TEXTURE_2D)
+ retval = NVRenderTextureTargetType::Texture2D;
+ else if (value == GL_TEXTURE_2D_MULTISAMPLE)
+ retval = NVRenderTextureTargetType::Texture2D_MS;
+ else
+ QT3DS_ASSERT(false);
+
+ return retval;
+ }
+
+ static GLenum fromTextureUnitToGL(NVRenderTextureUnit::Enum value)
+ {
+ QT3DSU32 v = value;
+ GLenum retval = GL_TEXTURE0;
+ retval = GL_TEXTURE0 + v;
+
+ return retval;
+ }
+
+ static GLenum fromGLToTextureUnit(GLenum value)
+ {
+ QT3DS_ASSERT(value > GL_TEXTURE0);
+
+ QT3DSU32 v = value - GL_TEXTURE0;
+ NVRenderTextureUnit::Enum retval =
+ NVRenderTextureUnit::Enum(NVRenderTextureUnit::TextureUnit_0 + v);
+
+ return retval;
+ }
+
+ static GLenum fromTextureMinifyingOpToGL(NVRenderTextureMinifyingOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP(x, y) \
+ case NVRenderTextureMinifyingOp::y: \
+ return x;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(x, y) \
+ case NVRenderTextureMinifyingOp::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderTextureMinifyingOp::Enum fromGLToTextureMinifyingOp(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP(x, y) \
+ case x: \
+ return NVRenderTextureMinifyingOp::y;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(x, y) \
+ case x: \
+ return NVRenderTextureMinifyingOp::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderTextureMinifyingOp::Unknown;
+ }
+
+ static GLenum fromTextureMagnifyingOpToGL(NVRenderTextureMagnifyingOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP(x, y) \
+ case NVRenderTextureMagnifyingOp::y: \
+ return x;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(x, y)
+ QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderTextureMagnifyingOp::Enum fromGLToTextureMagnifyingOp(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP(x, y) \
+ case x: \
+ return NVRenderTextureMagnifyingOp::y;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP(x, y)
+ QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_SCALE_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_MINIFYING_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderTextureMagnifyingOp::Unknown;
+ }
+
+ static GLenum fromTextureCoordOpToGL(NVRenderTextureCoordOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_WRAP_OP(x, y) \
+ case NVRenderTextureCoordOp::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_WRAP_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_WRAP_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderTextureCoordOp::Enum fromGLToTextureCoordOp(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_WRAP_OP(x, y) \
+ case x: \
+ return NVRenderTextureCoordOp::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_TEXTURE_WRAP_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_TEXTURE_WRAP_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderTextureCoordOp::Unknown;
+ }
+
+ static GLenum fromTextureCompareModeToGL(NVRenderTextureCompareMode::Enum value)
+ {
+ switch (value) {
+ case NVRenderTextureCompareMode::NoCompare:
+ return GL_NONE;
+ case NVRenderTextureCompareMode::CompareToRef:
+ return GL_COMPARE_REF_TO_TEXTURE;
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return NVRenderTextureCompareMode::Unknown;
+ }
+
+ static GLenum fromGLToTextureCompareMode(GLenum value)
+ {
+ switch (value) {
+ case GL_NONE:
+ return NVRenderTextureCompareMode::NoCompare;
+ case GL_COMPARE_REF_TO_TEXTURE:
+ return NVRenderTextureCompareMode::CompareToRef;
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return GL_INVALID_ENUM;
+ }
+
+ static GLenum fromTextureCompareFuncToGL(NVRenderTextureCompareOp::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP(x, y) \
+ case NVRenderTextureCompareOp::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_BOOL_OP
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_BOOL_OP
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static GLenum fromImageFormatToGL(NVRenderTextureFormats::Enum value)
+ {
+ switch (value) {
+ case NVRenderTextureFormats::R8:
+ return GL_R8;
+ case NVRenderTextureFormats::R32I:
+ return GL_R32I;
+ case NVRenderTextureFormats::R32UI:
+ return GL_R32UI;
+ case NVRenderTextureFormats::R32F:
+ return GL_R32F;
+ case NVRenderTextureFormats::RGBA8:
+ return GL_RGBA8;
+ case NVRenderTextureFormats::SRGB8A8:
+ return GL_RGBA8_SNORM;
+ case NVRenderTextureFormats::RG16F:
+ return GL_RG16F;
+ case NVRenderTextureFormats::RGBA16F:
+ return GL_RGBA16F;
+ case NVRenderTextureFormats::RGBA32F:
+ return GL_RGBA32F;
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return GL_INVALID_ENUM;
+ }
+
+
+ static GLenum fromImageAccessToGL(NVRenderImageAccessType::Enum value)
+ {
+ switch (value) {
+ case NVRenderImageAccessType::Read:
+ return GL_READ_ONLY;
+ case NVRenderImageAccessType::Write:
+ return GL_WRITE_ONLY;
+ case NVRenderImageAccessType::ReadWrite:
+ return GL_READ_WRITE;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return GL_INVALID_ENUM;
+ }
+
+ static GLbitfield fromBufferAccessBitToGL(NVRenderBufferAccessFlags flags)
+ {
+ QT3DSU32 value = flags;
+ GLbitfield retval = 0;
+
+ if (value & NVRenderBufferAccessTypeValues::Read)
+ retval |= GL_MAP_READ_BIT;
+ if (value & NVRenderBufferAccessTypeValues::Write)
+ retval |= GL_MAP_WRITE_BIT;
+ if (value & NVRenderBufferAccessTypeValues::Invalid)
+ retval |= GL_MAP_INVALIDATE_BUFFER_BIT;
+ if (value & NVRenderBufferAccessTypeValues::InvalidRange)
+ retval |= GL_MAP_INVALIDATE_RANGE_BIT;
+
+ QT3DS_ASSERT(retval);
+ return retval;
+ }
+
+ static GLbitfield fromMemoryBarrierFlagsToGL(NVRenderBufferBarrierFlags flags)
+ {
+ QT3DSU32 value = flags;
+ GLbitfield retval = 0;
+#if !defined(QT_OPENGL_ES)
+ if (value & NVRenderBufferBarrierValues::AtomicCounter)
+ retval |= GL_ATOMIC_COUNTER_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::BufferUpdate)
+ retval |= GL_BUFFER_UPDATE_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::CommandBuffer)
+ retval |= GL_COMMAND_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::ElementArray)
+ retval |= GL_ELEMENT_ARRAY_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::Framebuffer)
+ retval |= GL_FRAMEBUFFER_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::PixelBuffer)
+ retval |= GL_PIXEL_BUFFER_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::ShaderImageAccess)
+ retval |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::ShaderStorage)
+ retval |= GL_SHADER_STORAGE_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::TextureFetch)
+ retval |= GL_TEXTURE_FETCH_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::TextureUpdate)
+ retval |= GL_TEXTURE_UPDATE_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::TransformFeedback)
+ retval |= GL_TRANSFORM_FEEDBACK_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::UniformBuffer)
+ retval |= GL_UNIFORM_BARRIER_BIT;
+ if (value & NVRenderBufferBarrierValues::VertexAttribArray)
+ retval |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
+#endif
+ QT3DS_ASSERT(retval);
+ return retval;
+ }
+
+ static GLbitfield fromShaderTypeFlagsToGL(NVRenderShaderTypeFlags flags)
+ {
+ QT3DSU32 value = flags;
+ GLbitfield retval = 0;
+ if (value & NVRenderShaderTypeValue::Vertex)
+ retval |= GL_VERTEX_SHADER_BIT;
+ if (value & NVRenderShaderTypeValue::Fragment)
+ retval |= GL_FRAGMENT_SHADER_BIT;
+ if (value & NVRenderShaderTypeValue::TessControl)
+ retval |= GL_TESS_CONTROL_SHADER_BIT;
+ if (value & NVRenderShaderTypeValue::TessEvaluation)
+ retval |= GL_TESS_EVALUATION_SHADER_BIT;
+ if (value & NVRenderShaderTypeValue::Geometry)
+#if defined(QT_OPENGL_ES_3_1)
+ retval |= GL_GEOMETRY_SHADER_BIT_EXT;
+#else
+ retval |= GL_GEOMETRY_SHADER_BIT;
+#endif
+ QT3DS_ASSERT(retval || !value);
+ return retval;
+ }
+
+ static GLenum fromPropertyDataTypesToShaderGL(NVRenderShaderDataTypes::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(gl, nv) \
+ case NVRenderShaderDataTypes::nv: \
+ return gl;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_SHADER_UNIFORM_TYPES
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderShaderDataTypes::Enum fromShaderGLToPropertyDataTypes(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES(gl, nv) \
+ case gl: \
+ return NVRenderShaderDataTypes::nv;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_SHADER_UNIFORM_TYPES
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_UNIFORM_TYPES
+ case GL_SAMPLER_2D_SHADOW:
+ return NVRenderShaderDataTypes::NVRenderTexture2DPtr;
+#if !defined(QT_OPENGL_ES)
+ case GL_UNSIGNED_INT_ATOMIC_COUNTER:
+ return NVRenderShaderDataTypes::QT3DSU32;
+ case GL_UNSIGNED_INT_IMAGE_2D:
+ return NVRenderShaderDataTypes::NVRenderImage2DPtr;
+#endif
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderShaderDataTypes::Unknown;
+ }
+
+ static GLenum fromComponentTypeAndNumCompsToAttribGL(NVRenderComponentTypes::Enum compType,
+ QT3DSU32 numComps)
+ {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(gl, ct, nc) \
+ if (compType == NVRenderComponentTypes::ct && numComps == nc) \
+ return gl;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_SHADER_ATTRIB_TYPES
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static void fromAttribGLToComponentTypeAndNumComps(
+ GLenum enumVal, NVRenderComponentTypes::Enum &outCompType, QT3DSU32 &outNumComps)
+ {
+ switch (enumVal) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES(gl, ct, nc) \
+ case gl: \
+ outCompType = NVRenderComponentTypes::ct; \
+ outNumComps = nc; \
+ return;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_SHADER_ATTRIB_TYPES
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_SHADER_ATTRIB_TYPES
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ outCompType = NVRenderComponentTypes::Unknown;
+ outNumComps = 0;
+ }
+
+ static GLenum
+ fromRenderBufferFormatsToRenderBufferGL(NVRenderRenderBufferFormats::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(gl, nv) \
+ case NVRenderRenderBufferFormats::nv: \
+ return gl;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDERBUFFER_FORMATS
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDERBUFFER_COVERAGE_FORMATS
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderRenderBufferFormats::Enum
+ fromRenderBufferGLToRenderBufferFormats(GLenum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT(gl, nv) \
+ case gl: \
+ return NVRenderRenderBufferFormats::nv;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDERBUFFER_FORMATS
+ QT3DS_RENDER_ITERATE_GL_QT3DS_RENDERBUFFER_COVERAGE_FORMATS
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_RENDERBUFFER_FORMAT
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderRenderBufferFormats::Unknown;
+ }
+
+ static GLenum fromFramebufferAttachmentsToGL(NVRenderFrameBufferAttachments::Enum value)
+ {
+ switch (value) {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(x, idx) \
+ case NVRenderFrameBufferAttachments::x: \
+ return GL_COLOR_ATTACHMENT0 + idx;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_ATTACHMENT(x, y) \
+ case NVRenderFrameBufferAttachments::y: \
+ return x;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_FRAMEBUFFER_ATTACHMENTS
+ QT3DS_RENDER_ITERATE_GL_QT3DS_FRAMEBUFFER_COVERAGE_ATTACHMENTS
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_ATTACHMENT
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderFrameBufferAttachments::Unknown;
+ }
+
+ static NVRenderFrameBufferAttachments::Enum fromGLToFramebufferAttachments(GLenum value)
+ {
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT(x, idx) \
+ if (value == GL_COLOR_ATTACHMENT0 + idx) \
+ return NVRenderFrameBufferAttachments::x;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_ATTACHMENT(x, y) \
+ if (value == x) \
+ return NVRenderFrameBufferAttachments::y;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_FRAMEBUFFER_ATTACHMENTS
+ QT3DS_RENDER_ITERATE_GL_QT3DS_FRAMEBUFFER_COVERAGE_ATTACHMENTS
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_COLOR_ATTACHMENT
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_FRAMEBUFFER_ATTACHMENT
+ QT3DS_ASSERT(false);
+ return NVRenderFrameBufferAttachments::Unknown;
+ }
+
+ static GLbitfield fromClearFlagsToGL(NVRenderClearFlags flags)
+ {
+ QT3DSU32 value = flags;
+ GLbitfield retval = 0;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_CLEAR_FLAGS(gl, nv) \
+ if ((value & NVRenderClearValues::nv)) \
+ retval |= gl;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_CLEAR_FLAGS
+ QT3DS_RENDER_ITERATE_GL_QT3DS_CLEAR_COVERAGE_FLAGS
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_CLEAR_FLAGS
+ return retval;
+ }
+
+ static NVRenderClearFlags fromGLToClearFlags(GLbitfield value)
+ {
+ QT3DSU32 retval = 0;
+#define QT3DS_RENDER_HANDLE_GL_QT3DS_CLEAR_FLAGS(gl, nv) \
+ if ((value & gl)) \
+ retval |= NVRenderClearValues::nv;
+ QT3DS_RENDER_ITERATE_GL_QT3DS_CLEAR_FLAGS
+ QT3DS_RENDER_ITERATE_GL_QT3DS_CLEAR_COVERAGE_FLAGS
+#undef QT3DS_RENDER_HANDLE_GL_QT3DS_CLEAR_FLAGS
+ return NVRenderClearFlags(retval);
+ }
+
+ static GLenum fromDrawModeToGL(NVRenderDrawMode::Enum value, bool inTesselationSupported)
+ {
+ switch (value) {
+ case NVRenderDrawMode::Points:
+ return GL_POINTS;
+ case NVRenderDrawMode::Lines:
+ return GL_LINES;
+ case NVRenderDrawMode::LineStrip:
+ return GL_LINE_STRIP;
+ case NVRenderDrawMode::LineLoop:
+ return GL_LINE_LOOP;
+ case NVRenderDrawMode::TriangleStrip:
+ return GL_TRIANGLE_STRIP;
+ case NVRenderDrawMode::TriangleFan:
+ return GL_TRIANGLE_FAN;
+ case NVRenderDrawMode::Triangles:
+ return GL_TRIANGLES;
+ case NVRenderDrawMode::Patches:
+ return (inTesselationSupported) ? GL_PATCHES : GL_TRIANGLES;
+ default:
+ break;
+ }
+
+ QT3DS_ASSERT(false);
+ return GL_INVALID_ENUM;
+ }
+
+ static NVRenderDrawMode::Enum fromGLToDrawMode(GLenum value)
+ {
+ switch (value) {
+ case GL_POINTS:
+ return NVRenderDrawMode::Points;
+ case GL_LINES:
+ return NVRenderDrawMode::Lines;
+ case GL_LINE_STRIP:
+ return NVRenderDrawMode::LineStrip;
+ case GL_LINE_LOOP:
+ return NVRenderDrawMode::LineLoop;
+ case GL_TRIANGLE_STRIP:
+ return NVRenderDrawMode::TriangleStrip;
+ case GL_TRIANGLE_FAN:
+ return NVRenderDrawMode::TriangleFan;
+ case GL_TRIANGLES:
+ return NVRenderDrawMode::Triangles;
+ case GL_PATCHES:
+ return NVRenderDrawMode::Patches;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderDrawMode::Unknown;
+ }
+
+ static GLenum fromRenderStateToGL(NVRenderState::Enum value)
+ {
+ switch (value) {
+ case NVRenderState::Blend:
+ return GL_BLEND;
+ case NVRenderState::CullFace:
+ return GL_CULL_FACE;
+ case NVRenderState::DepthTest:
+ return GL_DEPTH_TEST;
+ case NVRenderState::Multisample:
+#if defined(QT_OPENGL_ES)
+ return GL_MULTISAMPLE_EXT;
+#else
+ return GL_MULTISAMPLE;
+#endif
+ case NVRenderState::StencilTest:
+ return GL_STENCIL_TEST;
+ case NVRenderState::ScissorTest:
+ return GL_SCISSOR_TEST;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ static NVRenderState::Enum fromGLToRenderState(GLenum value)
+ {
+ switch (value) {
+ case GL_BLEND:
+ return NVRenderState::Blend;
+ case GL_CULL_FACE:
+ return NVRenderState::CullFace;
+ case GL_DEPTH_TEST:
+ return NVRenderState::DepthTest;
+#if defined(QT_OPENGL_ES)
+ case GL_MULTISAMPLE_EXT:
+#else
+ case GL_MULTISAMPLE:
+#endif
+ return NVRenderState::Multisample;
+ case GL_STENCIL_TEST:
+ return NVRenderState::StencilTest;
+ case GL_SCISSOR_TEST:
+ return NVRenderState::ScissorTest;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return NVRenderState::Unknown;
+ }
+
+ static bool fromReadPixelsToGlFormatAndType(NVRenderReadPixelFormats::Enum inReadPixels,
+ GLuint *outFormat, GLuint *outType)
+ {
+ switch (inReadPixels) {
+ case NVRenderReadPixelFormats::Alpha8:
+ *outFormat = GL_ALPHA;
+ *outType = GL_UNSIGNED_BYTE;
+ break;
+ case NVRenderReadPixelFormats::RGB565:
+ *outFormat = GL_RGB;
+ *outType = GL_UNSIGNED_SHORT_5_6_5;
+ case NVRenderReadPixelFormats::RGB8:
+ *outFormat = GL_RGB;
+ *outType = GL_UNSIGNED_BYTE;
+ break;
+ case NVRenderReadPixelFormats::RGBA4444:
+ *outFormat = GL_RGBA;
+ *outType = GL_UNSIGNED_SHORT_4_4_4_4;
+ break;
+ case NVRenderReadPixelFormats::RGBA5551:
+ *outFormat = GL_RGBA;
+ *outType = GL_UNSIGNED_SHORT_5_5_5_1;
+ break;
+ case NVRenderReadPixelFormats::RGBA8:
+ *outFormat = GL_RGBA;
+ *outType = GL_UNSIGNED_BYTE;
+ break;
+ default:
+ *outFormat = 0;
+ *outType = 0;
+ QT3DS_ASSERT(false);
+ return false;
+ };
+
+ return true;
+ }
+
+ static GLenum fromPathFillModeToGL(NVRenderPathFillMode::Enum inMode)
+ {
+ GLenum glFillMode;
+
+ switch (inMode) {
+#if !defined(QT_OPENGL_ES)
+ case NVRenderPathFillMode::Fill:
+ glFillMode = GL_PATH_FILL_MODE_NV;
+ break;
+ case NVRenderPathFillMode::CountUp:
+ glFillMode = GL_COUNT_UP_NV;
+ break;
+ case NVRenderPathFillMode::CountDown:
+ glFillMode = GL_COUNT_DOWN_NV;
+ break;
+ case NVRenderPathFillMode::Invert:
+ glFillMode = GL_INVERT;
+ break;
+#endif
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ return glFillMode;
+ }
+
+ static GLenum fromPathFontTargetToGL(NVRenderPathFontTarget::Enum inFontTarget)
+ {
+ GLenum glFontTarget;
+
+ switch (inFontTarget) {
+#if !defined(QT_OPENGL_ES)
+ case NVRenderPathFontTarget::StandardFont:
+ glFontTarget = GL_STANDARD_FONT_NAME_NV;
+ break;
+ case NVRenderPathFontTarget::SystemFont:
+ glFontTarget = GL_SYSTEM_FONT_NAME_NV;
+ break;
+ case NVRenderPathFontTarget::FileFont:
+ glFontTarget = GL_FILE_NAME_NV;
+ break;
+#endif
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ return glFontTarget;
+ }
+
+ static NVRenderPathReturnValues::Enum fromGLToPathFontReturn(GLenum inReturnValue)
+ {
+ NVRenderPathReturnValues::Enum returnValue;
+
+ switch (inReturnValue) {
+#if !defined(QT_OPENGL_ES)
+ case GL_FONT_GLYPHS_AVAILABLE_NV:
+ returnValue = NVRenderPathReturnValues::FontGlypsAvailable;
+ break;
+ case GL_FONT_TARGET_UNAVAILABLE_NV:
+ returnValue = NVRenderPathReturnValues::FontTargetUnavailable;
+ break;
+ case GL_FONT_UNAVAILABLE_NV:
+ returnValue = NVRenderPathReturnValues::FontUnavailable;
+ break;
+ case GL_FONT_UNINTELLIGIBLE_NV:
+ returnValue = NVRenderPathReturnValues::FontUnintelligible;
+ break;
+#endif
+ case GL_INVALID_ENUM:
+ case GL_INVALID_VALUE:
+ returnValue = NVRenderPathReturnValues::InvalidEnum;
+ break;
+ case GL_OUT_OF_MEMORY:
+ returnValue = NVRenderPathReturnValues::OutOfMemory;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ returnValue = NVRenderPathReturnValues::FontTargetUnavailable;
+ break;
+ }
+
+ return returnValue;
+ }
+
+ static GLenum fromPathMissingGlyphsToGL(NVRenderPathMissingGlyphs::Enum inHandleGlyphs)
+ {
+ GLenum glMissingGlyphs;
+
+ switch (inHandleGlyphs) {
+#if !defined(QT_OPENGL_ES)
+ case NVRenderPathMissingGlyphs::SkipMissing:
+ glMissingGlyphs = GL_SKIP_MISSING_GLYPH_NV;
+ break;
+ case NVRenderPathMissingGlyphs::UseMissing:
+ glMissingGlyphs = GL_USE_MISSING_GLYPH_NV;
+ break;
+#endif
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ return glMissingGlyphs;
+ }
+
+ static GLenum fromPathListModeToGL(NVRenderPathListMode::Enum inListMode)
+ {
+ GLenum glListMode;
+
+ switch (inListMode) {
+#if !defined(QT_OPENGL_ES)
+ case NVRenderPathListMode::AccumAdjacentPairs:
+ glListMode = GL_ACCUM_ADJACENT_PAIRS_NV;
+ break;
+ case NVRenderPathListMode::AdjacentPairs:
+ glListMode = GL_ADJACENT_PAIRS_NV;
+ break;
+ case NVRenderPathListMode::FirstToRest:
+ glListMode = GL_FIRST_TO_REST_NV;
+ break;
+#endif
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ return glListMode;
+ }
+
+ static GLenum fromPathCoverModeToGL(NVRenderPathCoverMode::Enum inMode)
+ {
+ GLenum glCoverMode;
+
+ switch (inMode) {
+#if !defined(QT_OPENGL_ES)
+ case NVRenderPathCoverMode::ConvexHull:
+ glCoverMode = GL_CONVEX_HULL_NV;
+ break;
+ case NVRenderPathCoverMode::BoundingBox:
+ glCoverMode = GL_BOUNDING_BOX_NV;
+ break;
+ case NVRenderPathCoverMode::BoundingBoxOfBoundingBox:
+ glCoverMode = GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV;
+ break;
+ case NVRenderPathCoverMode::PathFillCover:
+ glCoverMode = GL_PATH_FILL_COVER_MODE_NV;
+ break;
+ case NVRenderPathCoverMode::PathStrokeCover:
+ glCoverMode = GL_PATH_STROKE_COVER_MODE_NV;
+ break;
+#endif
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ return glCoverMode;
+ }
+
+ static GLenum fromPathTypeToGL(NVRenderPathFormatType::Enum value)
+ {
+ switch (value) {
+ case NVRenderPathFormatType::Byte:
+ return GL_BYTE;
+ case NVRenderPathFormatType::UByte:
+ return GL_UNSIGNED_BYTE;
+ case NVRenderPathFormatType::Short:
+ return GL_SHORT;
+ case NVRenderPathFormatType::UShort:
+ return GL_UNSIGNED_SHORT;
+ case NVRenderPathFormatType::Int:
+ return GL_INT;
+ case NVRenderPathFormatType::Uint:
+ return GL_UNSIGNED_INT;
+#if !defined(QT_OPENGL_ES)
+ case NVRenderPathFormatType::Bytes2:
+ return GL_2_BYTES_NV;
+ case NVRenderPathFormatType::Bytes3:
+ return GL_3_BYTES_NV;
+ case NVRenderPathFormatType::Bytes4:
+ return GL_4_BYTES_NV;
+ case NVRenderPathFormatType::Utf8:
+ return GL_UTF8_NV;
+ case NVRenderPathFormatType::Utf16:
+ return GL_UTF16_NV;
+#endif
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return GL_UNSIGNED_BYTE;
+ }
+
+ static GLbitfield fromPathFontStyleToGL(NVRenderPathFontStyleFlags flags)
+ {
+ QT3DSU32 value = flags;
+ GLbitfield retval = 0;
+#if !defined(QT_OPENGL_ES)
+ if (value & NVRenderPathFontStyleValues::Bold)
+ retval |= GL_BOLD_BIT_NV;
+ if (value & NVRenderPathFontStyleValues::Italic)
+ retval |= GL_ITALIC_BIT_NV;
+#endif
+ QT3DS_ASSERT(retval || !value);
+ return retval;
+ }
+
+ static GLenum fromPathTransformToGL(NVRenderPathTransformType::Enum value)
+ {
+ switch (value) {
+ case NVRenderPathTransformType::NoTransform:
+ return GL_NONE;
+#if !defined(QT_OPENGL_ES)
+ case NVRenderPathTransformType::TranslateX:
+ return GL_TRANSLATE_X_NV;
+ case NVRenderPathTransformType::TranslateY:
+ return GL_TRANSLATE_Y_NV;
+ case NVRenderPathTransformType::Translate2D:
+ return GL_TRANSLATE_2D_NV;
+ case NVRenderPathTransformType::Translate3D:
+ return GL_TRANSLATE_3D_NV;
+ case NVRenderPathTransformType::Affine2D:
+ return GL_AFFINE_2D_NV;
+ case NVRenderPathTransformType::Affine3D:
+ return GL_AFFINE_3D_NV;
+ case NVRenderPathTransformType::TransposeAffine2D:
+ return GL_TRANSPOSE_AFFINE_2D_NV;
+ case NVRenderPathTransformType::TransposeAffine3D:
+ return GL_TRANSPOSE_AFFINE_3D_NV;
+#endif
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return GL_UNSIGNED_BYTE;
+ }
+
+ static GLbitfield fromPathMetricQueryFlagsToGL(NVRenderPathGlyphFontMetricFlags flags)
+ {
+ QT3DSU32 value = flags;
+ GLbitfield retval = 0;
+#if !defined(QT_OPENGL_ES)
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphWidth)
+ retval |= GL_GLYPH_WIDTH_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphHeight)
+ retval |= GL_GLYPH_HEIGHT_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphHorizontalBearingX)
+ retval |= GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphHorizontalBearingY)
+ retval |= GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphHorizontalBearingAdvance)
+ retval |= GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphVerticalBearingX)
+ retval |= GL_GLYPH_VERTICAL_BEARING_X_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphVerticalBearingY)
+ retval |= GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphVerticalBearingAdvance)
+ retval |= GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::GlyphHasKerning)
+ retval |= GL_GLYPH_HAS_KERNING_BIT_NV;
+
+ if (value & NVRenderPathGlyphFontMetricValues::FontXMinBounds)
+ retval |= GL_FONT_X_MIN_BOUNDS_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontYMinBounds)
+ retval |= GL_FONT_Y_MIN_BOUNDS_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontXMaxBounds)
+ retval |= GL_FONT_X_MAX_BOUNDS_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontYMaxBounds)
+ retval |= GL_FONT_Y_MAX_BOUNDS_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontUnitsPerEm)
+ retval |= GL_FONT_UNITS_PER_EM_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontAscender)
+ retval |= GL_FONT_ASCENDER_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontDescender)
+ retval |= GL_FONT_DESCENDER_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontHeight)
+ retval |= GL_FONT_HEIGHT_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontMaxAdvanceWidth)
+ retval |= GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontMaxAdvanceHeight)
+ retval |= GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontUnderlinePosition)
+ retval |= GL_FONT_UNDERLINE_POSITION_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontMaxAdvanceWidth)
+ retval |= GL_FONT_UNDERLINE_THICKNESS_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontHasKerning)
+ retval |= GL_FONT_HAS_KERNING_BIT_NV;
+ if (value & NVRenderPathGlyphFontMetricValues::FontNumGlyphIndices)
+ retval |= GL_FONT_NUM_GLYPH_INDICES_BIT_NV;
+#endif
+ QT3DS_ASSERT(retval || !value);
+ return retval;
+ }
+ };
+}
+}
+
+#endif // QT3DSOPENGLUTIL_H
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGL3.cpp b/src/render/backends/gl/Qt3DSRenderBackendGL3.cpp
new file mode 100644
index 0000000..c4d8b64
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendGL3.cpp
@@ -0,0 +1,796 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/backends/gl/Qt3DSRenderBackendGL3.h"
+#include "render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h"
+#include "render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h"
+#include "render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h"
+
+#ifdef RENDER_BACKEND_LOG_GL_ERRORS
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError(#x, __FILE__, __LINE__)
+#else
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError()
+#endif
+
+#define GL_CALL_EXTRA_FUNCTION(x) m_glExtraFunctions->x; RENDER_LOG_ERROR_PARAMS(x);
+
+#if defined(QT_OPENGL_ES)
+#define GL_CALL_TIMER_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_TESSELATION_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#else
+#define GL_CALL_TIMER_EXT(x) m_timerExtension->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_TESSELATION_EXT(x) m_tessellationShader->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_MULTISAMPLE_EXT(x) m_multiSample->x; RENDER_LOG_ERROR_PARAMS(x);
+#endif
+
+namespace qt3ds {
+namespace render {
+
+#ifndef GL_PATCH_VERTICES
+#define GL_PATCH_VERTICES 0x8E72
+#endif
+
+ /// constructor
+ NVRenderBackendGL3Impl::NVRenderBackendGL3Impl(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format)
+ : NVRenderBackendGLBase(fnd, stringTable, format)
+ {
+ eastl::string exts3tc("GL_EXT_texture_compression_s3tc");
+ eastl::string extsdxt("GL_EXT_texture_compression_dxt1");
+ eastl::string extsAniso("GL_EXT_texture_filter_anisotropic");
+ eastl::string extsTexSwizzle("GL_ARB_texture_swizzle");
+ eastl::string extsAstcHDR("GL_KHR_texture_compression_astc_hdr");
+ eastl::string extsAstcLDR("GL_KHR_texture_compression_astc_ldr");
+ eastl::string extsFPRenderTarget("GL_EXT_color_buffer_float");
+ eastl::string extsTimerQuery("GL_EXT_timer_query");
+ eastl::string extsGpuShader5("EXT_gpu_shader5");
+
+ const char *languageVersion = GetShadingLanguageVersion();
+ qCInfo(TRACE_INFO, "GLSL version: %s", languageVersion);
+
+ eastl::string apiVersion(getVersionString());
+ qCInfo(TRACE_INFO, "GL version: %s", apiVersion.c_str());
+
+ eastl::string apiVendor(getVendorString());
+ qCInfo(TRACE_INFO, "HW vendor: %s", apiVendor.c_str());
+
+ eastl::string apiRenderer(getRendererString());
+ qCInfo(TRACE_INFO, "Vendor renderer: %s", apiRenderer.c_str());
+
+ // clear support bits
+ m_backendSupport.caps.u32Values = 0;
+
+ // get extension count
+ GLint numExtensions = 0;
+ GL_CALL_EXTRA_FUNCTION(glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions));
+
+ eastl::string extensionBuffer;
+
+ for (QT3DSI32 i = 0; i < numExtensions; i++) {
+ char *extensionString = (char *)GL_CALL_EXTRA_FUNCTION(glGetStringi(GL_EXTENSIONS, i));
+
+ m_extensions.push_back(QString::fromLocal8Bit(extensionString));
+
+ if (extensionBuffer.size())
+ extensionBuffer.append(" ");
+ extensionBuffer.append(extensionString);
+
+ // search for extension
+ if (!m_backendSupport.caps.bits.bDXTImagesSupported
+ && (exts3tc.compare(extensionString) == 0 || extsdxt.compare(extensionString) == 0)) {
+ m_backendSupport.caps.bits.bDXTImagesSupported = true;
+ } else if (!m_backendSupport.caps.bits.bAnistropySupported
+ && extsAniso.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bAnistropySupported = true;
+ } else if (!m_backendSupport.caps.bits.bFPRenderTargetsSupported
+ && extsFPRenderTarget.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bFPRenderTargetsSupported = true;
+ } else if (!m_backendSupport.caps.bits.bTimerQuerySupported
+ && extsTimerQuery.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bTimerQuerySupported = true;
+ } else if (!m_backendSupport.caps.bits.bGPUShader5ExtensionSupported
+ && extsGpuShader5.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bGPUShader5ExtensionSupported = true;
+ }
+
+ }
+
+ qCInfo(TRACE_INFO, "OpenGL extensions: %s", extensionBuffer.c_str());
+
+ // texture swizzle is always true
+ m_backendSupport.caps.bits.bTextureSwizzleSupported = true;
+ // depthstencil renderbuffer support is always true
+ m_backendSupport.caps.bits.bDepthStencilSupported = true;
+ // constant buffers support is always true
+ m_backendSupport.caps.bits.bConstantBufferSupported = true;
+ m_backendSupport.caps.bits.bStandardDerivativesSupported = true;
+ m_backendSupport.caps.bits.bVertexArrayObjectSupported = true;
+ m_backendSupport.caps.bits.bTextureLodSupported = true;
+
+ if (!isESCompatible()) {
+ // render to float textures is always supported on none ES systems which support >=GL3
+ m_backendSupport.caps.bits.bFPRenderTargetsSupported = true;
+ // multisampled texture is always supported on none ES systems which support >=GL3
+ m_backendSupport.caps.bits.bMsTextureSupported = true;
+ // timer queries are always supported on none ES systems which support >=GL3
+ m_backendSupport.caps.bits.bTimerQuerySupported = true;
+ }
+
+ // query hardware
+ GL_CALL_EXTRA_FUNCTION(glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &m_MaxAttribCount));
+
+ // internal state tracker
+ m_pCurrentMiscState = QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendMiscStateGL)();
+
+ // finally setup caps based on device
+ setAndInspectHardwareCaps();
+
+ // Initialize extensions
+#if defined(QT_OPENGL_ES_2)
+ m_qt3dsExtensions = new Qt3DSOpenGLES2Extensions;
+ m_qt3dsExtensions->initializeOpenGLFunctions();
+#else
+ m_timerExtension = new QOpenGLExtension_ARB_timer_query;
+ m_timerExtension->initializeOpenGLFunctions();
+ m_tessellationShader = new QOpenGLExtension_ARB_tessellation_shader;
+ m_tessellationShader->initializeOpenGLFunctions();
+ m_multiSample = new QOpenGLExtension_ARB_texture_multisample;
+ m_multiSample->initializeOpenGLFunctions();
+ m_qt3dsExtensions = new Qt3DSOpenGLExtensions;
+ m_qt3dsExtensions->initializeOpenGLFunctions();
+#endif
+ }
+ /// destructor
+ NVRenderBackendGL3Impl::~NVRenderBackendGL3Impl()
+ {
+ if (m_pCurrentMiscState)
+ NVDelete(m_Foundation.getAllocator(), m_pCurrentMiscState);
+#if !defined(QT_OPENGL_ES_2)
+ if (m_timerExtension)
+ delete m_timerExtension;
+ if (m_tessellationShader)
+ delete m_tessellationShader;
+ if (m_multiSample)
+ delete m_multiSample;
+#endif
+ if (m_qt3dsExtensions)
+ delete m_qt3dsExtensions;
+ }
+
+ void NVRenderBackendGL3Impl::SetMultisampledTextureData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, size_t samples,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height,
+ bool fixedsamplelocations)
+ {
+// Not supported by ES 3 yet
+#if defined(QT_OPENGL_ES)
+ NVRENDER_BACKEND_UNUSED(to);
+ NVRENDER_BACKEND_UNUSED(target);
+ NVRENDER_BACKEND_UNUSED(samples);
+ NVRENDER_BACKEND_UNUSED(internalFormat);
+ NVRENDER_BACKEND_UNUSED(width);
+ NVRENDER_BACKEND_UNUSED(height);
+ NVRENDER_BACKEND_UNUSED(fixedsamplelocations);
+#else
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
+ internalFormat, swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat))
+ GLConversion::fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+ else if (NVRenderTextureFormats::isDepthTextureFormat(internalFormat))
+ m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+
+ GL_CALL_MULTISAMPLE_EXT(glTexImage2DMultisample(glTarget, (GLsizei)samples, glInternalFormat,
+ (GLsizei)width, (GLsizei)height, fixedsamplelocations));
+
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+#endif
+ }
+
+ void NVRenderBackendGL3Impl::SetTextureData3D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, size_t depth,
+ QT3DSI32 border, NVRenderTextureFormats::Enum format, const void *hostPtr)
+ {
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+ bool conversionRequired = format != internalFormat;
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
+ internalFormat, swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat))
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+
+ if (conversionRequired) {
+ GLenum dummy;
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, dummy);
+ } else if (NVRenderTextureFormats::isCompressedTextureFormat(internalFormat)) {
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ glInternalFormat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
+ } else if (NVRenderTextureFormats::isDepthTextureFormat(format))
+ m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+
+ GL_CALL_EXTRA_FUNCTION(glTexImage3D(glTarget, level, glInternalFormat, (GLsizei)width, (GLsizei)height,
+ (GLsizei)depth, border, glformat, gltype, hostPtr));
+
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+ }
+
+ void NVRenderBackendGL3Impl::UpdateSampler(
+ NVRenderBackendSamplerObject /* so */, NVRenderTextureTargetType::Enum target,
+ NVRenderTextureMinifyingOp::Enum minFilter, NVRenderTextureMagnifyingOp::Enum magFilter,
+ NVRenderTextureCoordOp::Enum wrapS, NVRenderTextureCoordOp::Enum wrapT,
+ NVRenderTextureCoordOp::Enum wrapR, QT3DSF32 minLod, QT3DSF32 maxLod, QT3DSF32 lodBias,
+ NVRenderTextureCompareMode::Enum compareMode, NVRenderTextureCompareOp::Enum compareFunc,
+ QT3DSF32 anisotropy, QT3DSF32 *borderColor)
+ {
+
+ // Satisfy the compiler
+ // These are not available in GLES 3 and we don't use them right now
+ QT3DS_ASSERT(lodBias == 0.0);
+ QT3DS_ASSERT(!borderColor);
+ NVRENDER_BACKEND_UNUSED(lodBias);
+ NVRENDER_BACKEND_UNUSED(borderColor);
+
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MIN_FILTER,
+ m_Conversion.fromTextureMinifyingOpToGL(minFilter)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MAG_FILTER,
+ m_Conversion.fromTextureMagnifyingOpToGL(magFilter)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_S,
+ m_Conversion.fromTextureCoordOpToGL(wrapS)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_T,
+ m_Conversion.fromTextureCoordOpToGL(wrapT)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_R,
+ m_Conversion.fromTextureCoordOpToGL(wrapR)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MIN_LOD, minLod));
+ GL_CALL_EXTRA_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_LOD, maxLod));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_COMPARE_MODE,
+ m_Conversion.fromTextureCompareModeToGL(compareMode)));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_COMPARE_FUNC,
+ m_Conversion.fromTextureCompareFuncToGL(compareFunc)));
+
+ if (m_backendSupport.caps.bits.bAnistropySupported) {
+ GL_CALL_EXTRA_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ qMin(anisotropy, m_maxAnisotropy)));
+ }
+ }
+
+ void NVRenderBackendGL3Impl::UpdateTextureObject(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ QT3DSI32 baseLevel, QT3DSI32 maxLevel)
+ {
+ NVRENDER_BACKEND_UNUSED(to);
+
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_BASE_LEVEL, baseLevel));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MAX_LEVEL, maxLevel));
+ }
+
+ void NVRenderBackendGL3Impl::UpdateTextureSwizzle(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderTextureSwizzleMode::Enum swizzleMode)
+ {
+ NVRENDER_BACKEND_UNUSED(to);
+ if (m_backendSupport.caps.bits.bTextureSwizzleSupported) {
+ GLint glSwizzle[4];
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ m_Conversion.NVRenderConvertSwizzleModeToGL(swizzleMode, glSwizzle);
+#if defined(QT_OPENGL_ES)
+ // since ES3 spec has no GL_TEXTURE_SWIZZLE_RGBA set it separately
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_R, glSwizzle[0]));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_G, glSwizzle[1]));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_B, glSwizzle[2]));
+ GL_CALL_EXTRA_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_SWIZZLE_A, glSwizzle[3]));
+#else
+ GL_CALL_EXTRA_FUNCTION(glTexParameteriv(glTarget, GL_TEXTURE_SWIZZLE_RGBA, glSwizzle));
+#endif
+ }
+ }
+
+ QT3DSU32
+ NVRenderBackendGL3Impl::GetDepthBits() const
+ {
+ QT3DSI32 depthBits;
+ GL_CALL_EXTRA_FUNCTION(glGetFramebufferAttachmentParameteriv(
+ GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, &depthBits));
+
+ return depthBits;
+ }
+
+ QT3DSU32
+ NVRenderBackendGL3Impl::GetStencilBits() const
+ {
+ QT3DSI32 stencilBits;
+ GL_CALL_EXTRA_FUNCTION(glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+ GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,
+ &stencilBits));
+
+ return stencilBits;
+ }
+
+ void NVRenderBackendGL3Impl::GenerateMipMaps(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderHint::Enum /*genType*/)
+ {
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+ GL_CALL_EXTRA_FUNCTION(glGenerateMipmap(glTarget));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+ }
+
+ bool NVRenderBackendGL3Impl::SetInputAssembler(NVRenderBackendInputAssemblerObject iao,
+ NVRenderBackendShaderProgramObject po)
+ {
+ if (iao == NULL) {
+ // unbind and return;
+ GL_CALL_EXTRA_FUNCTION(glBindVertexArray(0));
+ return true;
+ }
+
+ NVRenderBackendInputAssemblerGL *inputAssembler = (NVRenderBackendInputAssemblerGL *)iao;
+ NVRenderBackendAttributeLayoutGL *attribLayout = inputAssembler->m_attribLayout;
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+ NVDataRef<NVRenderBackendShaderInputEntryGL> shaderAttribBuffer;
+ if (pProgram->m_shaderInput)
+ shaderAttribBuffer = pProgram->m_shaderInput->m_ShaderInputEntries;
+
+ if (attribLayout->m_LayoutAttribEntries.size() < shaderAttribBuffer.size())
+ return false;
+
+ if (inputAssembler->m_VertexbufferHandles.size() <= attribLayout->m_MaxInputSlot) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ if (inputAssembler->m_VaoID == 0) {
+ // generate vao
+ GL_CALL_EXTRA_FUNCTION(glGenVertexArrays(1, &inputAssembler->m_VaoID));
+ QT3DS_ASSERT(inputAssembler->m_VaoID);
+ }
+
+ // set patch parameter count if changed
+ if (m_backendSupport.caps.bits.bTessellationSupported
+ && m_pCurrentMiscState->m_PatchVertexCount != inputAssembler->m_PatchVertexCount) {
+ m_pCurrentMiscState->m_PatchVertexCount = inputAssembler->m_PatchVertexCount;
+#if defined(QT_OPENGL_ES)
+ GL_CALL_TESSELATION_EXT(glPatchParameteriEXT(GL_PATCH_VERTICES, inputAssembler->m_PatchVertexCount));
+#else
+ GL_CALL_TESSELATION_EXT(glPatchParameteri(GL_PATCH_VERTICES, inputAssembler->m_PatchVertexCount));
+#endif
+ }
+
+ if (inputAssembler->m_cachedShaderHandle != programID) {
+ GL_CALL_EXTRA_FUNCTION(glBindVertexArray(inputAssembler->m_VaoID));
+ inputAssembler->m_cachedShaderHandle = programID;
+
+ QT3DS_FOREACH(idx, shaderAttribBuffer.size())
+ {
+ const NVRenderBackendShaderInputEntryGL &attrib(shaderAttribBuffer[idx]);
+ NVRenderBackendLayoutEntryGL *entry =
+ attribLayout->getEntryByName(attrib.m_AttribName);
+
+ if (entry) {
+ NVRenderBackendLayoutEntryGL &entryData(*entry);
+ if (entryData.m_Type != attrib.m_Type
+ || entryData.m_NumComponents != attrib.m_NumComponents) {
+ qCCritical(INVALID_OPERATION, "Attrib %s doesn't match vertex layout",
+ attrib.m_AttribName.c_str());
+ QT3DS_ASSERT(false);
+ return false;
+ } else {
+ entryData.m_AttribIndex = attrib.m_AttribLocation;
+ }
+ } else {
+ qCWarning(WARNING, "Failed to Bind attribute %s", attrib.m_AttribName.c_str());
+ }
+ }
+
+ // disable max possible used first
+ // this is currently sufficient since we always re-arrange input attributes from 0
+ for (QT3DSU32 i = 0; i < attribLayout->m_LayoutAttribEntries.size(); i++) {
+ GL_CALL_EXTRA_FUNCTION(glDisableVertexAttribArray(i));
+ }
+
+ // setup all attribs
+ QT3DS_FOREACH(idx, shaderAttribBuffer.size())
+ {
+ NVRenderBackendLayoutEntryGL *entry =
+ attribLayout->getEntryByName(shaderAttribBuffer[idx].m_AttribName);
+ if (entry) {
+ const NVRenderBackendLayoutEntryGL &entryData(*entry);
+ GLuint id = HandleToID_cast(
+ GLuint, size_t,
+ inputAssembler->m_VertexbufferHandles.mData[entryData.m_InputSlot]);
+ GL_CALL_EXTRA_FUNCTION(glBindBuffer(GL_ARRAY_BUFFER, id));
+ GL_CALL_EXTRA_FUNCTION(glEnableVertexAttribArray(entryData.m_AttribIndex));
+ GLuint offset = inputAssembler->m_offsets[entryData.m_InputSlot];
+ GLuint stride = inputAssembler->m_strides[entryData.m_InputSlot];
+ GL_CALL_EXTRA_FUNCTION(glVertexAttribPointer(
+ entryData.m_AttribIndex, entryData.m_NumComponents, GL_FLOAT, GL_FALSE,
+ stride, (const void *)(entryData.m_Offset + offset)));
+
+ } else {
+ GL_CALL_EXTRA_FUNCTION(glDisableVertexAttribArray(idx));
+ }
+ }
+
+ // setup index buffer.
+ if (inputAssembler->m_IndexbufferHandle) {
+ GL_CALL_EXTRA_FUNCTION(glBindBuffer(
+ GL_ELEMENT_ARRAY_BUFFER,
+ HandleToID_cast(GLuint, size_t, inputAssembler->m_IndexbufferHandle)));
+ } else {
+ GL_CALL_EXTRA_FUNCTION(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+ }
+ } else {
+ GL_CALL_EXTRA_FUNCTION(glBindVertexArray(inputAssembler->m_VaoID));
+ }
+#ifdef _DEBUG
+ if (inputAssembler->m_VaoID) {
+ QT3DS_FOREACH(idx, shaderAttribBuffer.size())
+ {
+ const NVRenderBackendShaderInputEntryGL &attrib(shaderAttribBuffer[idx]);
+ NVRenderBackendLayoutEntryGL *entry =
+ attribLayout->getEntryByName(attrib.m_AttribName);
+
+ if (entry) {
+ NVRenderBackendLayoutEntryGL &entryData(*entry);
+ if (entryData.m_Type != attrib.m_Type
+ || entryData.m_NumComponents != attrib.m_NumComponents
+ || entryData.m_AttribIndex != attrib.m_AttribLocation) {
+ qCCritical(INVALID_OPERATION, "Attrib %s doesn't match vertex layout",
+ attrib.m_AttribName.c_str());
+ QT3DS_ASSERT(false);
+ }
+ } else {
+ qCWarning(WARNING, "Failed to Bind attribute %s", attrib.m_AttribName.c_str());
+ }
+ }
+ }
+#endif // _DEBUG
+
+ return true;
+ }
+
+ void NVRenderBackendGL3Impl::ReleaseInputAssembler(
+ NVRenderBackend::NVRenderBackendInputAssemblerObject iao)
+ {
+ NVRenderBackendInputAssemblerGL *inputAssembler = (NVRenderBackendInputAssemblerGL *)iao;
+ if (inputAssembler->m_VaoID)
+ GL_CALL_EXTRA_FUNCTION(glDeleteVertexArrays(1, &inputAssembler->m_VaoID));
+ NVDelete(m_Foundation.getAllocator(), inputAssembler);
+ }
+
+ void NVRenderBackendGL3Impl::SetDrawBuffers(NVRenderBackendRenderTargetObject rto,
+ NVConstDataRef<QT3DSI32> inDrawBufferSet)
+ {
+ NVRENDER_BACKEND_UNUSED(rto);
+
+ m_DrawBuffersArray.clear();
+
+ for (QT3DSU32 idx = 0, end = inDrawBufferSet.size(); idx < end; ++idx) {
+ if (inDrawBufferSet[idx] < 0)
+ m_DrawBuffersArray.push_back(GL_NONE);
+ else
+ m_DrawBuffersArray.push_back(GL_COLOR_ATTACHMENT0 + inDrawBufferSet[idx]);
+ }
+
+ GL_CALL_EXTRA_FUNCTION(glDrawBuffers((int)m_DrawBuffersArray.size(), m_DrawBuffersArray.data()));
+ }
+
+ void NVRenderBackendGL3Impl::SetReadBuffer(NVRenderBackendRenderTargetObject rto,
+ NVReadFaces::Enum inReadFace)
+ {
+ NVRENDER_BACKEND_UNUSED(rto);
+
+ GL_CALL_EXTRA_FUNCTION(glReadBuffer(m_Conversion.fromReadFacesToGL(inReadFace)));
+ }
+
+ void NVRenderBackendGL3Impl::RenderTargetAttach(NVRenderBackendRenderTargetObject,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to, QT3DSI32 level,
+ QT3DSI32 layer)
+ {
+ // rto must be the current render target
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+
+ GLenum glAttach = GLConversion::fromFramebufferAttachmentsToGL(attachment);
+
+ GL_CALL_EXTRA_FUNCTION(glFramebufferTextureLayer(GL_FRAMEBUFFER, glAttach, texID, level, layer))
+ }
+
+ void NVRenderBackendGL3Impl::SetReadTarget(NVRenderBackendRenderTargetObject rto)
+ {
+ GLuint fboID = HandleToID_cast(GLuint, size_t, rto);
+ if (!fboID)
+ fboID = QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext()->defaultFramebufferObject();
+
+ GL_CALL_EXTRA_FUNCTION(glBindFramebuffer(GL_READ_FRAMEBUFFER, fboID));
+ }
+
+ void NVRenderBackendGL3Impl::BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter)
+ {
+ GL_CALL_EXTRA_FUNCTION(glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
+ m_Conversion.fromClearFlagsToGL(flags),
+ m_Conversion.fromTextureMagnifyingOpToGL(filter)));
+ }
+
+ void *NVRenderBackendGL3Impl::MapBuffer(NVRenderBackendBufferObject,
+ NVRenderBufferBindFlags bindFlags, size_t offset,
+ size_t length, NVRenderBufferAccessFlags accessFlags)
+ {
+ void *ret = NULL;
+ ret = GL_CALL_EXTRA_FUNCTION(glMapBufferRange(m_Conversion.fromBindBufferFlagsToGL(bindFlags), offset,
+ length, m_Conversion.fromBufferAccessBitToGL(accessFlags)));
+
+ return ret;
+ }
+
+ bool NVRenderBackendGL3Impl::UnmapBuffer(NVRenderBackendBufferObject,
+ NVRenderBufferBindFlags bindFlags)
+ {
+ GLboolean ret;
+
+ ret = GL_CALL_EXTRA_FUNCTION(glUnmapBuffer(m_Conversion.fromBindBufferFlagsToGL(bindFlags)));
+
+ return (ret) ? true : false;
+ }
+
+ QT3DSI32 NVRenderBackendGL3Impl::GetConstantBufferCount(NVRenderBackendShaderProgramObject po)
+ {
+ QT3DS_ASSERT(po);
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GLint numUniformBuffers;
+ GL_CALL_EXTRA_FUNCTION(glGetProgramiv(programID, GL_ACTIVE_UNIFORM_BLOCKS, &numUniformBuffers));
+
+ return numUniformBuffers;
+ }
+
+ QT3DSI32
+ NVRenderBackendGL3Impl::GetConstantBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize,
+ QT3DSI32 *paramCount, QT3DSI32 *bufferSize,
+ QT3DSI32 *length, char *nameBuf)
+ {
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(length);
+ QT3DS_ASSERT(nameBuf);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+ GLuint blockIndex = GL_INVALID_INDEX;
+
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockName(programID, id, nameBufSize, length, nameBuf));
+
+ if (*length > 0) {
+ blockIndex = GL_CALL_EXTRA_FUNCTION(glGetUniformBlockIndex(programID, nameBuf));
+ if (blockIndex != GL_INVALID_INDEX) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockiv(programID, blockIndex,
+ GL_UNIFORM_BLOCK_DATA_SIZE, bufferSize));
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockiv(programID, blockIndex,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, paramCount));
+ }
+ }
+
+ return blockIndex;
+ }
+
+ void
+ NVRenderBackendGL3Impl::GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSI32 *indices)
+ {
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(indices);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ if (indices) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformBlockiv(programID, id,
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, indices));
+ }
+ }
+
+ void NVRenderBackendGL3Impl::GetConstantBufferParamInfoByIndices(
+ NVRenderBackendShaderProgramObject po, QT3DSU32 count, QT3DSU32 *indices, QT3DSI32 *type,
+ QT3DSI32 *size, QT3DSI32 *offset)
+ {
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(count);
+ QT3DS_ASSERT(indices);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ if (count && indices) {
+ if (type) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformsiv(programID, count, indices, GL_UNIFORM_TYPE, type));
+ // convert to UIC types
+ QT3DS_FOREACH(idx, count)
+ {
+ type[idx] = m_Conversion.fromShaderGLToPropertyDataTypes(type[idx]);
+ }
+ }
+ if (size) {
+ GL_CALL_EXTRA_FUNCTION(glGetActiveUniformsiv(programID, count, indices, GL_UNIFORM_SIZE, size));
+ }
+ if (offset) {
+ GL_CALL_EXTRA_FUNCTION(
+ glGetActiveUniformsiv(programID, count, indices, GL_UNIFORM_OFFSET, offset));
+ }
+ }
+ }
+
+ void NVRenderBackendGL3Impl::ProgramSetConstantBlock(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 blockIndex, QT3DSU32 binding)
+ {
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GL_CALL_EXTRA_FUNCTION(glUniformBlockBinding(programID, blockIndex, binding));
+ }
+
+ void NVRenderBackendGL3Impl::ProgramSetConstantBuffer(QT3DSU32 index,
+ NVRenderBackendBufferObject bo)
+ {
+ QT3DS_ASSERT(bo);
+
+ GLuint bufID = HandleToID_cast(GLuint, size_t, bo);
+ GL_CALL_EXTRA_FUNCTION(glBindBufferBase(GL_UNIFORM_BUFFER, index, bufID));
+ }
+
+ NVRenderBackend::NVRenderBackendQueryObject NVRenderBackendGL3Impl::CreateQuery()
+ {
+ QT3DSU32 glQueryID = 0;
+
+ GL_CALL_EXTRA_FUNCTION(glGenQueries(1, &glQueryID));
+
+ return (NVRenderBackendQueryObject)glQueryID;
+ }
+
+ void NVRenderBackendGL3Impl::ReleaseQuery(NVRenderBackendQueryObject qo)
+ {
+ GLuint queryID = HandleToID_cast(GLuint, size_t, qo);
+
+ GL_CALL_EXTRA_FUNCTION(glDeleteQueries(1, &queryID));
+ }
+
+ void NVRenderBackendGL3Impl::BeginQuery(NVRenderBackendQueryObject qo,
+ NVRenderQueryType::Enum type)
+ {
+ GLuint queryID = HandleToID_cast(GLuint, size_t, qo);
+
+ GL_CALL_EXTRA_FUNCTION(glBeginQuery(m_Conversion.fromQueryTypeToGL(type), queryID));
+ }
+
+ void NVRenderBackendGL3Impl::EndQuery(NVRenderBackendQueryObject, NVRenderQueryType::Enum type)
+ {
+ GL_CALL_EXTRA_FUNCTION(glEndQuery(m_Conversion.fromQueryTypeToGL(type)));
+ }
+
+ void NVRenderBackendGL3Impl::GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType,
+ QT3DSU32 *params)
+ {
+ GLuint queryID = HandleToID_cast(GLuint, size_t, qo);
+
+ if (params)
+ GL_CALL_EXTRA_FUNCTION(glGetQueryObjectuiv(
+ queryID, m_Conversion.fromQueryResultTypeToGL(resultType), params));
+ }
+
+ void NVRenderBackendGL3Impl::GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType,
+ QT3DSU64 *params)
+ {
+ if (m_backendSupport.caps.bits.bTimerQuerySupported) {
+ GLuint queryID = HandleToID_cast(GLuint, size_t, qo);
+
+ if (params)
+#if defined(QT_OPENGL_ES)
+ GL_CALL_TIMER_EXT(glGetQueryObjectui64vEXT(
+ queryID, m_Conversion.fromQueryResultTypeToGL(resultType), params));
+#else
+ GL_CALL_TIMER_EXT(glGetQueryObjectui64v(
+ queryID, m_Conversion.fromQueryResultTypeToGL(resultType), params));
+#endif
+ }
+ }
+
+ void NVRenderBackendGL3Impl::SetQueryTimer(NVRenderBackendQueryObject qo)
+ {
+ if (m_backendSupport.caps.bits.bTimerQuerySupported) {
+ GLuint queryID = HandleToID_cast(GLuint, size_t, qo);
+#if defined(QT_OPENGL_ES)
+ GL_CALL_TIMER_EXT(glQueryCounterEXT(queryID, GL_TIMESTAMP_EXT));
+#else
+ GL_CALL_TIMER_EXT(glQueryCounter(queryID, GL_TIMESTAMP));
+#endif
+ }
+ }
+
+ NVRenderBackend::NVRenderBackendSyncObject
+ NVRenderBackendGL3Impl::CreateSync(NVRenderSyncType::Enum syncType, NVRenderSyncFlags)
+ {
+ GLsync syncID = 0;
+
+ syncID = GL_CALL_EXTRA_FUNCTION(glFenceSync(m_Conversion.fromSyncTypeToGL(syncType), 0));
+
+ return NVRenderBackendSyncObject(syncID);
+ }
+
+ void NVRenderBackendGL3Impl::ReleaseSync(NVRenderBackendSyncObject so)
+ {
+ GLsync syncID = (GLsync)so;
+
+ GL_CALL_EXTRA_FUNCTION(glDeleteSync(syncID));
+ }
+
+ void NVRenderBackendGL3Impl::WaitSync(NVRenderBackendSyncObject so, NVRenderCommandFlushFlags,
+ QT3DSU64)
+ {
+ GLsync syncID = (GLsync)so;
+
+ GL_CALL_EXTRA_FUNCTION(glWaitSync(syncID, 0, GL_TIMEOUT_IGNORED));
+ }
+}
+}
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGL3.h b/src/render/backends/gl/Qt3DSRenderBackendGL3.h
new file mode 100644
index 0000000..ea77270
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendGL3.h
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_GL3_H
+#define QT3DS_RENDER_BACKEND_GL3_H
+
+/// @file Qt3DSRenderBackendGL3.h
+/// NVRender OpenGL 3 backend definition.
+
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/gl/Qt3DSRenderBackendGLBase.h"
+#include "render/backends/gl/Qt3DSOpenGLExtensions.h"
+
+#include <QtGui/QOpenGLExtraFunctions>
+#include <QtOpenGLExtensions/QtOpenGLExtensions>
+
+namespace qt3ds {
+namespace render {
+
+ ///< forward declaration
+ class NVRenderBackendMiscStateGL;
+
+ using namespace foundation;
+
+ class NVRenderBackendGL3Impl : public NVRenderBackendGLBase
+ {
+ public:
+ /// constructor
+ NVRenderBackendGL3Impl(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format);
+ /// destructor
+ virtual ~NVRenderBackendGL3Impl();
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ public:
+ QT3DSU32 GetDepthBits() const override;
+ QT3DSU32 GetStencilBits() const override;
+ void GenerateMipMaps(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderHint::Enum genType) override;
+
+ void SetMultisampledTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ size_t samples,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height,
+ bool fixedsamplelocations) override;
+
+ void SetTextureData3D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width,
+ size_t height, size_t depth, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) override;
+
+ void UpdateSampler(
+ NVRenderBackendSamplerObject so, NVRenderTextureTargetType::Enum target,
+ NVRenderTextureMinifyingOp::Enum minFilter = NVRenderTextureMinifyingOp::Linear,
+ NVRenderTextureMagnifyingOp::Enum magFilter = NVRenderTextureMagnifyingOp::Linear,
+ NVRenderTextureCoordOp::Enum wrapS = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapT = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapR = NVRenderTextureCoordOp::ClampToEdge,
+ QT3DSF32 minLod = -1000.0, QT3DSF32 maxLod = 1000.0, QT3DSF32 lodBias = 0.0,
+ NVRenderTextureCompareMode::Enum compareMode = NVRenderTextureCompareMode::NoCompare,
+ NVRenderTextureCompareOp::Enum compareFunc = NVRenderTextureCompareOp::LessThanOrEqual,
+ QT3DSF32 anisotropy = 1.0, QT3DSF32 *borderColor = NULL) override;
+
+ void UpdateTextureObject(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSI32 baseLevel,
+ QT3DSI32 maxLevel) override;
+
+ void UpdateTextureSwizzle(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderTextureSwizzleMode::Enum swizzleMode) override;
+
+ bool SetInputAssembler(NVRenderBackendInputAssemblerObject iao,
+ NVRenderBackendShaderProgramObject po) override;
+
+ void ReleaseInputAssembler(NVRenderBackendInputAssemblerObject iao) override;
+
+ void SetDrawBuffers(NVRenderBackendRenderTargetObject rto,
+ NVConstDataRef<QT3DSI32> inDrawBufferSet) override;
+ void SetReadBuffer(NVRenderBackendRenderTargetObject rto,
+ NVReadFaces::Enum inReadFace) override;
+
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to, QT3DSI32 level, QT3DSI32 layer) override;
+ void SetReadTarget(NVRenderBackendRenderTargetObject rto) override;
+
+ void BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter) override;
+
+ void *MapBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags,
+ size_t offset, size_t length,
+ NVRenderBufferAccessFlags accessFlags) override;
+ bool UnmapBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags) override;
+
+ QT3DSI32 GetConstantBufferCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetConstantBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length, char *nameBuf) override;
+ void GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSI32 *indices) override;
+ void GetConstantBufferParamInfoByIndices(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 count, QT3DSU32 *indices, QT3DSI32 *type,
+ QT3DSI32 *size, QT3DSI32 *offset) override;
+ void ProgramSetConstantBlock(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 blockIndex, QT3DSU32 binding) override;
+ void ProgramSetConstantBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) override;
+
+ NVRenderBackendQueryObject CreateQuery() override;
+ void ReleaseQuery(NVRenderBackendQueryObject qo) override;
+ void BeginQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) override;
+ void EndQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) override;
+ void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU32 *params) override;
+ void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU64 *params) override;
+ void SetQueryTimer(NVRenderBackendQueryObject qo) override;
+
+ NVRenderBackendSyncObject CreateSync(NVRenderSyncType::Enum tpye,
+ NVRenderSyncFlags syncFlags) override;
+ void ReleaseSync(NVRenderBackendSyncObject so) override;
+ void WaitSync(NVRenderBackendSyncObject so, NVRenderCommandFlushFlags syncFlags,
+ QT3DSU64 timeout) override;
+
+ protected:
+ NVRenderBackendMiscStateGL *m_pCurrentMiscState; ///< this holds the current misc state
+#if defined(QT_OPENGL_ES_2)
+ Qt3DSOpenGLES2Extensions *m_qt3dsExtensions;
+#else
+ QOpenGLExtension_ARB_timer_query *m_timerExtension;
+ QOpenGLExtension_ARB_tessellation_shader *m_tessellationShader;
+ QOpenGLExtension_ARB_texture_multisample *m_multiSample;
+ Qt3DSOpenGLExtensions *m_qt3dsExtensions;
+#endif
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGL4.cpp b/src/render/backends/gl/Qt3DSRenderBackendGL4.cpp
new file mode 100644
index 0000000..083fc35
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendGL4.cpp
@@ -0,0 +1,875 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/backends/gl/Qt3DSRenderBackendGL4.h"
+#include "render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h"
+#include "render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h"
+
+#define NVRENDER_BACKEND_UNUSED(arg) (void)arg;
+
+#ifdef RENDER_BACKEND_LOG_GL_ERRORS
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError(#x, __FILE__, __LINE__)
+#else
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError()
+#endif
+
+#define GL_CALL_EXTRA_FUNCTION(x) m_glExtraFunctions->x; RENDER_LOG_ERROR_PARAMS(x);
+
+#if defined(QT_OPENGL_ES)
+#define GL_CALL_NVPATH_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_QT3DS_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#else
+#define GL_CALL_NVPATH_EXT(x) m_nvPathRendering->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_DIRECTSTATE_EXT(x) m_directStateAccess->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_QT3DS_EXT(x) m_qt3dsExtensions->x; RENDER_LOG_ERROR_PARAMS(x);
+#endif
+
+#ifndef GL_GEOMETRY_SHADER_EXT
+#define GL_GEOMETRY_SHADER_EXT 0x8DD9
+#endif
+
+namespace qt3ds {
+namespace render {
+
+ /// constructor
+ NVRenderBackendGL4Impl::NVRenderBackendGL4Impl(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format)
+ : NVRenderBackendGL3Impl(fnd, stringTable, format)
+ {
+ eastl::string extTess("GL_ARB_tessellation_shader");
+ eastl::string extGeometry("GL_EXT_geometry_shader4");
+ eastl::string arbCompute("GL_ARB_compute_shader");
+ eastl::string arbStorageBuffer("GL_ARB_shader_storage_buffer_object");
+ eastl::string arbAtomicCounterBuffer("GL_ARB_shader_atomic_counters");
+ eastl::string arbProgInterface("GL_ARB_program_interface_query");
+ eastl::string arbShaderImageLoadStore("GL_ARB_shader_image_load_store");
+ eastl::string nvPathRendering("GL_NV_path_rendering");
+ eastl::string nvBlendAdvanced("GL_NV_blend_equation_advanced");
+ eastl::string khrBlendAdvanced("GL_KHR_blend_equation_advanced");
+ eastl::string nvBlendAdvancedCoherent("GL_NV_blend_equation_advanced_coherent");
+ eastl::string khrBlendAdvancedCoherent("GL_KHR_blend_equation_advanced_coherent");
+
+ eastl::string apiVersion(getVersionString());
+ qCInfo(TRACE_INFO, "GL version: %s", apiVersion.c_str());
+
+ // get extension count
+ GLint numExtensions = 0;
+ GL_CALL_EXTRA_FUNCTION(glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions));
+
+ for (QT3DSI32 i = 0; i < numExtensions; i++) {
+ char *extensionString = (char *)GL_CALL_EXTRA_FUNCTION(glGetStringi(GL_EXTENSIONS, i));
+
+ // search for extension
+ if (!m_backendSupport.caps.bits.bTessellationSupported
+ && extTess.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bTessellationSupported = true;
+ } else if (!m_backendSupport.caps.bits.bComputeSupported
+ && arbCompute.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bComputeSupported = true;
+ } else if (!m_backendSupport.caps.bits.bGeometrySupported
+ && extGeometry.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bGeometrySupported = true;
+ } else if (!m_backendSupport.caps.bits.bStorageBufferSupported
+ && arbStorageBuffer.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bStorageBufferSupported = true;
+ } else if (!m_backendSupport.caps.bits.bAtomicCounterBufferSupported
+ && arbAtomicCounterBuffer.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bAtomicCounterBufferSupported = true;
+ } else if (!m_backendSupport.caps.bits.bProgramInterfaceSupported
+ && arbProgInterface.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bProgramInterfaceSupported = true;
+ } else if (!m_backendSupport.caps.bits.bShaderImageLoadStoreSupported
+ && arbShaderImageLoadStore.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bShaderImageLoadStoreSupported = true;
+ } else if (!m_backendSupport.caps.bits.bNVPathRenderingSupported
+ && nvPathRendering.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bNVPathRenderingSupported = true;
+ } else if (!m_backendSupport.caps.bits.bNVAdvancedBlendSupported
+ && nvBlendAdvanced.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bNVAdvancedBlendSupported = true;
+ } else if (!m_backendSupport.caps.bits.bNVBlendCoherenceSupported
+ && nvBlendAdvancedCoherent.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bNVBlendCoherenceSupported = true;
+ } else if (!m_backendSupport.caps.bits.bKHRAdvancedBlendSupported
+ && khrBlendAdvanced.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bKHRAdvancedBlendSupported = true;
+ } else if (!m_backendSupport.caps.bits.bKHRBlendCoherenceSupported
+ && khrBlendAdvancedCoherent.compare(extensionString) == 0) {
+ m_backendSupport.caps.bits.bKHRBlendCoherenceSupported = true;
+ }
+ }
+
+ // always true for GL4.1 and GLES 3.1 devices
+ m_backendSupport.caps.bits.bMsTextureSupported = true;
+ m_backendSupport.caps.bits.bProgramPipelineSupported = true;
+
+ if (!isESCompatible()) {
+ // TODO: investigate GL 4.0 support
+ // we expect minimum GL 4.1 context anything beyond is handeled via extensions
+ // Tessellation is always supported on none ES systems which support >=GL4
+ m_backendSupport.caps.bits.bTessellationSupported = true;
+ // geometry shader is always supported on none ES systems which support >=GL4 ( actually
+ // 3.2 already )
+ m_backendSupport.caps.bits.bGeometrySupported = true;
+ } else {
+ // always true for GLES 3.1 devices
+ m_backendSupport.caps.bits.bComputeSupported = true;
+ m_backendSupport.caps.bits.bProgramInterfaceSupported = true;
+ m_backendSupport.caps.bits.bStorageBufferSupported = true;
+ m_backendSupport.caps.bits.bAtomicCounterBufferSupported = true;
+ m_backendSupport.caps.bits.bShaderImageLoadStoreSupported = true;
+ }
+
+#if !defined(QT_OPENGL_ES)
+ // Initialize extensions
+ m_nvPathRendering = QT3DS_NEW(m_Foundation.getAllocator(), QOpenGLExtension_NV_path_rendering)();
+ m_nvPathRendering->initializeOpenGLFunctions();
+ m_directStateAccess = QT3DS_NEW(m_Foundation.getAllocator(), QOpenGLExtension_EXT_direct_state_access)();
+ m_directStateAccess->initializeOpenGLFunctions();
+#endif
+ }
+
+ /// destructor
+ NVRenderBackendGL4Impl::~NVRenderBackendGL4Impl()
+ {
+#if !defined(QT_OPENGL_ES)
+ if (m_nvPathRendering)
+ NVDelete(m_Foundation.getAllocator(), m_nvPathRendering);
+ if (m_directStateAccess)
+ NVDelete(m_Foundation.getAllocator(), m_directStateAccess);
+#endif
+ }
+
+ void NVRenderBackendGL4Impl::DrawIndirect(NVRenderDrawMode::Enum drawMode, const void *indirect)
+ {
+ GL_CALL_EXTRA_FUNCTION(
+ glDrawArraysIndirect(m_Conversion.fromDrawModeToGL(
+ drawMode, m_backendSupport.caps.bits.bTessellationSupported),
+ indirect));
+ }
+
+ void NVRenderBackendGL4Impl::DrawIndexedIndirect(NVRenderDrawMode::Enum drawMode,
+ NVRenderComponentTypes::Enum type,
+ const void *indirect)
+ {
+ GL_CALL_EXTRA_FUNCTION(glDrawElementsIndirect(
+ m_Conversion.fromDrawModeToGL(drawMode,
+ m_backendSupport.caps.bits.bTessellationSupported),
+ m_Conversion.fromIndexBufferComponentsTypesToGL(type), indirect));
+ }
+
+ void NVRenderBackendGL4Impl::CreateTextureStorage2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ QT3DSU32 levels,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height)
+ {
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+
+ // up to now compressed is not supported
+ QT3DS_ASSERT(NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat));
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+ GLConversion::fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+
+ GL_CALL_EXTRA_FUNCTION(
+ glTexStorage2D(glTarget, levels, glInternalFormat, (GLsizei)width, (GLsizei)height));
+
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+ }
+
+ void NVRenderBackendGL4Impl::SetMultisampledTextureData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, size_t samples,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height,
+ bool fixedsamplelocations)
+ {
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_EXTRA_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, texID));
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
+ internalFormat, swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat))
+ GLConversion::fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+ else if (NVRenderTextureFormats::isDepthTextureFormat(internalFormat))
+ m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+ GL_CALL_EXTRA_FUNCTION(glTexStorage2DMultisample(glTarget, (GLsizei)samples, glInternalFormat,
+ (GLsizei)width, (GLsizei)height,
+ fixedsamplelocations));
+
+ GL_CALL_EXTRA_FUNCTION(glBindTexture(glTarget, 0));
+ }
+
+ NVRenderBackend::NVRenderBackendTessControlShaderObject
+ NVRenderBackendGL4Impl::CreateTessControlShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+ {
+#if !defined(QT_OPENGL_ES)
+ GLuint shaderID = GL_CALL_EXTRA_FUNCTION(glCreateShader(GL_TESS_CONTROL_SHADER));
+#else
+ GLuint shaderID = 0;
+#endif
+ if (shaderID && !compileSource(shaderID, source, errorMessage, binary)) {
+ GL_CALL_EXTRA_FUNCTION(glDeleteShader(shaderID));
+ shaderID = 0;
+ }
+
+ return (NVRenderBackend::NVRenderBackendTessControlShaderObject)shaderID;
+ }
+
+ NVRenderBackend::NVRenderBackendTessEvaluationShaderObject
+ NVRenderBackendGL4Impl::CreateTessEvaluationShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+ {
+#if !defined(QT_OPENGL_ES)
+ GLuint shaderID = GL_CALL_EXTRA_FUNCTION(glCreateShader(GL_TESS_EVALUATION_SHADER));
+#else
+ GLuint shaderID = 0;
+#endif
+
+ if (shaderID && !compileSource(shaderID, source, errorMessage, binary)) {
+ GL_CALL_EXTRA_FUNCTION(glDeleteShader(shaderID));
+ shaderID = 0;
+ }
+
+ return (NVRenderBackend::NVRenderBackendTessEvaluationShaderObject)shaderID;
+ }
+
+ NVRenderBackend::NVRenderBackendGeometryShaderObject
+ NVRenderBackendGL4Impl::CreateGeometryShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+ {
+#if defined(QT_OPENGL_ES)
+ GLuint shaderID = GL_CALL_EXTRA_FUNCTION(glCreateShader(GL_GEOMETRY_SHADER_EXT));
+#else
+ GLuint shaderID = GL_CALL_EXTRA_FUNCTION(glCreateShader(GL_GEOMETRY_SHADER));
+#endif
+ if (shaderID && !compileSource(shaderID, source, errorMessage, binary)) {
+ GL_CALL_EXTRA_FUNCTION(glDeleteShader(shaderID));
+ shaderID = 0;
+ }
+
+ return (NVRenderBackend::NVRenderBackendGeometryShaderObject)shaderID;
+ }
+
+ void NVRenderBackendGL4Impl::SetPatchVertexCount(NVRenderBackendInputAssemblerObject iao,
+ QT3DSU32 count)
+ {
+ QT3DS_ASSERT(iao);
+ QT3DS_ASSERT(count);
+ NVRenderBackendInputAssemblerGL *inputAssembler = (NVRenderBackendInputAssemblerGL *)iao;
+ inputAssembler->m_PatchVertexCount = count;
+ }
+
+ void NVRenderBackendGL4Impl::SetMemoryBarrier(NVRenderBufferBarrierFlags barriers)
+ {
+ GL_CALL_EXTRA_FUNCTION(glMemoryBarrier(m_Conversion.fromMemoryBarrierFlagsToGL(barriers)));
+ }
+
+ void NVRenderBackendGL4Impl::BindImageTexture(NVRenderBackendTextureObject to, QT3DSU32 unit,
+ QT3DSI32 level, bool layered, QT3DSI32 layer,
+ NVRenderImageAccessType::Enum access,
+ NVRenderTextureFormats::Enum format)
+ {
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+
+ GL_CALL_EXTRA_FUNCTION(glBindImageTexture(unit, texID, level, layered, layer,
+ m_Conversion.fromImageAccessToGL(access),
+ m_Conversion.fromImageFormatToGL(format)));
+ }
+
+ QT3DSI32 NVRenderBackendGL4Impl::GetStorageBufferCount(NVRenderBackendShaderProgramObject po)
+ {
+ GLint numStorageBuffers = 0;
+ QT3DS_ASSERT(po);
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+#if defined(GL_VERSION_4_3) || defined (QT_OPENGL_ES_3_1)
+ if (m_backendSupport.caps.bits.bProgramInterfaceSupported)
+ GL_CALL_EXTRA_FUNCTION(glGetProgramInterfaceiv(programID, GL_SHADER_STORAGE_BLOCK,
+ GL_ACTIVE_RESOURCES, &numStorageBuffers));
+#endif
+ return numStorageBuffers;
+ }
+
+ QT3DSI32
+ NVRenderBackendGL4Impl::GetStorageBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length,
+ char *nameBuf)
+ {
+ GLint bufferIndex = GL_INVALID_INDEX;
+
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(length);
+ QT3DS_ASSERT(nameBuf);
+ QT3DS_ASSERT(bufferSize);
+ QT3DS_ASSERT(paramCount);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+#if defined(GL_VERSION_4_3) || defined (QT_OPENGL_ES_3_1)
+ if (m_backendSupport.caps.bits.bProgramInterfaceSupported) {
+ GL_CALL_EXTRA_FUNCTION(glGetProgramResourceName(programID, GL_SHADER_STORAGE_BLOCK, id, nameBufSize,
+ length, nameBuf));
+
+ if (*length > 0) {
+#define QUERY_COUNT 3
+ GLsizei actualCount;
+ GLenum props[QUERY_COUNT] = { GL_BUFFER_BINDING, GL_BUFFER_DATA_SIZE,
+ GL_NUM_ACTIVE_VARIABLES };
+ GLint params[QUERY_COUNT];
+ GL_CALL_EXTRA_FUNCTION(glGetProgramResourceiv(programID, GL_SHADER_STORAGE_BLOCK, id,
+ QUERY_COUNT, props, QUERY_COUNT, &actualCount,
+ params));
+
+ QT3DS_ASSERT(actualCount == QUERY_COUNT);
+
+ bufferIndex = params[0];
+ *bufferSize = params[1];
+ *paramCount = params[2];
+ }
+ }
+#endif
+ return bufferIndex;
+ }
+
+ void NVRenderBackendGL4Impl::ProgramSetStorageBuffer(QT3DSU32 index,
+ NVRenderBackendBufferObject bo)
+ {
+#if defined(GL_VERSION_4_3) || defined (QT_OPENGL_ES_3_1)
+ GL_CALL_EXTRA_FUNCTION(
+ glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, HandleToID_cast(GLuint, size_t, bo)));
+#endif
+ }
+
+ QT3DSI32 NVRenderBackendGL4Impl::GetAtomicCounterBufferCount(NVRenderBackendShaderProgramObject po)
+ {
+ GLint numAtomicCounterBuffers = 0;
+ QT3DS_ASSERT(po);
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+#if defined(GL_VERSION_4_3) || defined (QT_OPENGL_ES_3_1)
+ if (m_backendSupport.caps.bits.bProgramInterfaceSupported)
+ GL_CALL_EXTRA_FUNCTION(glGetProgramInterfaceiv(programID, GL_ATOMIC_COUNTER_BUFFER,
+ GL_ACTIVE_RESOURCES, &numAtomicCounterBuffers));
+#endif
+ return numAtomicCounterBuffers;
+ }
+
+ QT3DSI32
+ NVRenderBackendGL4Impl::GetAtomicCounterBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize,
+ QT3DSI32 *paramCount, QT3DSI32 *bufferSize,
+ QT3DSI32 *length, char *nameBuf)
+ {
+ GLint bufferIndex = GL_INVALID_INDEX;
+
+ QT3DS_ASSERT(po);
+ QT3DS_ASSERT(length);
+ QT3DS_ASSERT(nameBuf);
+ QT3DS_ASSERT(bufferSize);
+ QT3DS_ASSERT(paramCount);
+
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+#if defined(GL_VERSION_4_3) || defined (QT_OPENGL_ES_3_1)
+ if (m_backendSupport.caps.bits.bProgramInterfaceSupported) {
+ {
+#define QUERY_COUNT 3
+ GLsizei actualCount;
+ GLenum props[QUERY_COUNT] = { GL_BUFFER_BINDING, GL_BUFFER_DATA_SIZE,
+ GL_NUM_ACTIVE_VARIABLES };
+ GLint params[QUERY_COUNT];
+ GL_CALL_EXTRA_FUNCTION(glGetProgramResourceiv(programID, GL_ATOMIC_COUNTER_BUFFER, id,
+ QUERY_COUNT, props, QUERY_COUNT, &actualCount,
+ params));
+
+ QT3DS_ASSERT(actualCount == QUERY_COUNT);
+
+ bufferIndex = params[0];
+ *bufferSize = params[1];
+ *paramCount = params[2];
+
+ GLenum props1[1] = { GL_ATOMIC_COUNTER_BUFFER_INDEX };
+ GL_CALL_EXTRA_FUNCTION(glGetProgramResourceiv(programID, GL_UNIFORM, id, 1, props1, 1,
+ &actualCount, params));
+
+ QT3DS_ASSERT(actualCount == 1);
+
+ *nameBuf = '\0';
+ GL_CALL_EXTRA_FUNCTION(glGetProgramResourceName(programID, GL_UNIFORM, params[0], nameBufSize,
+ length, nameBuf));
+ }
+ }
+#endif
+ return bufferIndex;
+ }
+
+ void NVRenderBackendGL4Impl::ProgramSetAtomicCounterBuffer(QT3DSU32 index,
+ NVRenderBackendBufferObject bo)
+ {
+#if defined(GL_VERSION_4_3) || defined (QT_OPENGL_ES_3_1)
+ GL_CALL_EXTRA_FUNCTION(
+ glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, index, HandleToID_cast(GLuint, size_t, bo)));
+#endif
+ }
+
+ void NVRenderBackendGL4Impl::SetConstantValue(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ NVRenderShaderDataTypes::Enum type, QT3DSI32 count,
+ const void *value, bool transpose)
+ {
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GLenum glType = m_Conversion.fromPropertyDataTypesToShaderGL(type);
+
+ switch (glType) {
+ case GL_FLOAT:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform1fv(programID, id, count, (GLfloat *)value));
+ break;
+ case GL_FLOAT_VEC2:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform2fv(programID, id, count, (GLfloat *)value));
+ break;
+ case GL_FLOAT_VEC3:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform3fv(programID, id, count, (GLfloat *)value));
+ break;
+ case GL_FLOAT_VEC4:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform4fv(programID, id, count, (GLfloat *)value));
+ break;
+ case GL_INT:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform1iv(programID, id, count, (GLint *)value));
+ break;
+ case GL_BOOL:
+ {
+ GLint boolValue = *(GLboolean *)value;
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform1iv(programID, id, count, &boolValue));
+ }
+ break;
+ case GL_INT_VEC2:
+ case GL_BOOL_VEC2:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform2iv(programID, id, count, (GLint *)value));
+ break;
+ case GL_INT_VEC3:
+ case GL_BOOL_VEC3:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform3iv(programID, id, count, (GLint *)value));
+ break;
+ case GL_INT_VEC4:
+ case GL_BOOL_VEC4:
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform4iv(programID, id, count, (GLint *)value));
+ break;
+ case GL_FLOAT_MAT3:
+ GL_CALL_EXTRA_FUNCTION(
+ glProgramUniformMatrix3fv(programID, id, count, transpose, (GLfloat *)value));
+ break;
+ case GL_FLOAT_MAT4:
+ GL_CALL_EXTRA_FUNCTION(
+ glProgramUniformMatrix4fv(programID, id, count, transpose, (GLfloat *)value));
+ break;
+ case GL_IMAGE_2D:
+ case GL_SAMPLER_2D:
+ case GL_SAMPLER_2D_ARRAY:
+ case GL_SAMPLER_2D_SHADOW:
+ case GL_SAMPLER_CUBE: {
+ if (count <= 1) {
+ GLint sampler = *(GLint *)value;
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform1i(programID, id, sampler));
+ } else {
+ GLint *sampler = (GLint *)value;
+ GL_CALL_EXTRA_FUNCTION(glProgramUniform1iv(programID, id, count, sampler));
+ }
+ } break;
+ default:
+ qCCritical(INTERNAL_ERROR, "Unknown shader type format %d", type);
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ NVRenderBackend::NVRenderBackendComputeShaderObject
+ NVRenderBackendGL4Impl::CreateComputeShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+ {
+ GLuint shaderID = 0;
+#if defined(GL_COMPUTE_SHADER)
+ shaderID = m_glExtraFunctions->glCreateShader(GL_COMPUTE_SHADER);
+
+ if (shaderID && !compileSource(shaderID, source, errorMessage, binary)) {
+ GL_CALL_EXTRA_FUNCTION(glDeleteShader(shaderID));
+ shaderID = 0;
+ }
+#endif
+ return (NVRenderBackend::NVRenderBackendComputeShaderObject)shaderID;
+ }
+
+ void NVRenderBackendGL4Impl::DispatchCompute(NVRenderBackendShaderProgramObject,
+ QT3DSU32 numGroupsX, QT3DSU32 numGroupsY,
+ QT3DSU32 numGroupsZ)
+ {
+ GL_CALL_EXTRA_FUNCTION(glDispatchCompute(numGroupsX, numGroupsY, numGroupsZ));
+ }
+
+ NVRenderBackend::NVRenderBackendProgramPipeline NVRenderBackendGL4Impl::CreateProgramPipeline()
+ {
+ GLuint pipeline;
+ GL_CALL_EXTRA_FUNCTION(glGenProgramPipelines(1, &pipeline));
+
+ return NVRenderBackend::NVRenderBackendProgramPipeline(pipeline);
+ }
+
+ void NVRenderBackendGL4Impl::ReleaseProgramPipeline(NVRenderBackendProgramPipeline ppo)
+ {
+ GLuint pipeline = HandleToID_cast(GLuint, size_t, ppo);
+ GL_CALL_EXTRA_FUNCTION(glDeleteProgramPipelines(1, &pipeline));
+ }
+
+ void NVRenderBackendGL4Impl::SetActiveProgramPipeline(NVRenderBackendProgramPipeline ppo)
+ {
+ GLuint pipeline = HandleToID_cast(GLuint, size_t, ppo);
+
+ GL_CALL_EXTRA_FUNCTION(glBindProgramPipeline(pipeline));
+ }
+
+ void NVRenderBackendGL4Impl::SetProgramStages(NVRenderBackendProgramPipeline ppo,
+ NVRenderShaderTypeFlags flags,
+ NVRenderBackendShaderProgramObject po)
+ {
+ GLuint pipeline = HandleToID_cast(GLuint, size_t, ppo);
+ GLuint programID = 0;
+
+ if (po) {
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ programID = static_cast<GLuint>(pProgram->m_ProgramID);
+ }
+
+ GL_CALL_EXTRA_FUNCTION(
+ glUseProgramStages(pipeline, m_Conversion.fromShaderTypeFlagsToGL(flags), programID));
+ }
+
+ void NVRenderBackendGL4Impl::SetBlendEquation(const NVRenderBlendEquationArgument &pBlendEquArg)
+ {
+ if (m_backendSupport.caps.bits.bNVAdvancedBlendSupported ||
+ m_backendSupport.caps.bits.bKHRAdvancedBlendSupported)
+ GL_CALL_EXTRA_FUNCTION(glBlendEquation(m_Conversion.fromBlendEquationToGL(
+ pBlendEquArg.m_RGBEquation, m_backendSupport.caps.bits.bNVAdvancedBlendSupported,
+ m_backendSupport.caps.bits.bKHRAdvancedBlendSupported)));
+ }
+
+ void NVRenderBackendGL4Impl::SetBlendBarrier(void)
+ {
+ if (m_backendSupport.caps.bits.bNVAdvancedBlendSupported)
+ GL_CALL_QT3DS_EXT(glBlendBarrierNV());
+ }
+
+ NVRenderBackend::NVRenderBackendPathObject
+ NVRenderBackendGL4Impl::CreatePathNVObject(size_t range)
+ {
+ GLuint pathID = GL_CALL_NVPATH_EXT(glGenPathsNV((GLsizei)range));
+
+ return NVRenderBackend::NVRenderBackendPathObject(pathID);
+ }
+ void NVRenderBackendGL4Impl::SetPathSpecification(NVRenderBackendPathObject inPathObject,
+ NVConstDataRef<QT3DSU8> inPathCommands,
+ NVConstDataRef<QT3DSF32> inPathCoords)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, inPathObject);
+ GL_CALL_NVPATH_EXT(glPathCommandsNV(pathID, inPathCommands.size(), inPathCommands.begin(),
+ inPathCoords.size(), GL_FLOAT, inPathCoords.begin()));
+ }
+
+ NVBounds3
+ NVRenderBackendGL4Impl::GetPathObjectBoundingBox(NVRenderBackendPathObject inPathObject)
+ {
+ float data[4];
+#if defined(GL_NV_path_rendering)
+ GL_CALL_NVPATH_EXT(glGetPathParameterfvNV(
+ HandleToID_cast(GLuint, size_t, inPathObject),
+ GL_PATH_OBJECT_BOUNDING_BOX_NV, data));
+#endif
+ return NVBounds3(QT3DSVec3(data[0], data[1], 0.0f), QT3DSVec3(data[2], data[3], 0.0f));
+ }
+
+ NVBounds3 NVRenderBackendGL4Impl::GetPathObjectFillBox(NVRenderBackendPathObject inPathObject)
+ {
+ float data[4];
+#if defined(GL_NV_path_rendering)
+ GL_CALL_NVPATH_EXT(glGetPathParameterfvNV(
+ HandleToID_cast(GLuint, size_t, inPathObject),
+ GL_PATH_FILL_BOUNDING_BOX_NV, data));
+#endif
+ return NVBounds3(QT3DSVec3(data[0], data[1], 0.0f), QT3DSVec3(data[2], data[3], 0.0f));
+ }
+
+ NVBounds3 NVRenderBackendGL4Impl::GetPathObjectStrokeBox(NVRenderBackendPathObject inPathObject)
+ {
+ float data[4];
+#if defined(GL_NV_path_rendering)
+ GL_CALL_NVPATH_EXT(glGetPathParameterfvNV(
+ HandleToID_cast(GLuint, size_t, inPathObject),
+ GL_PATH_STROKE_BOUNDING_BOX_NV, data));
+#endif
+ return NVBounds3(QT3DSVec3(data[0], data[1], 0.0f), QT3DSVec3(data[2], data[3], 0.0f));
+ }
+
+ void NVRenderBackendGL4Impl::SetStrokeWidth(NVRenderBackendPathObject inPathObject,
+ QT3DSF32 inStrokeWidth)
+ {
+#if defined(GL_NV_path_rendering)
+ GL_CALL_NVPATH_EXT(glPathParameterfNV(HandleToID_cast(GLuint, size_t, inPathObject),
+ GL_PATH_STROKE_WIDTH_NV, inStrokeWidth));
+#endif
+ }
+
+ void NVRenderBackendGL4Impl::SetPathProjectionMatrix(const QT3DSMat44 inPathProjection)
+ {
+#if defined(QT_OPENGL_ES)
+ NVRENDER_BACKEND_UNUSED(inPathProjection);
+#else
+ GL_CALL_DIRECTSTATE_EXT(glMatrixLoadfEXT(GL_PROJECTION, inPathProjection.front()));
+#endif
+ }
+
+ void NVRenderBackendGL4Impl::SetPathModelViewMatrix(const QT3DSMat44 inPathModelview)
+ {
+#if defined(QT_OPENGL_ES)
+ NVRENDER_BACKEND_UNUSED(inPathModelview);
+#else
+ GL_CALL_DIRECTSTATE_EXT(glMatrixLoadfEXT(GL_MODELVIEW, inPathModelview.front()));
+#endif
+ }
+
+ void NVRenderBackendGL4Impl::SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias)
+ {
+ GL_CALL_NVPATH_EXT(glPathStencilDepthOffsetNV(inSlope, inBias));
+ }
+
+ void NVRenderBackendGL4Impl::SetPathCoverDepthFunc(NVRenderBoolOp::Enum inDepthFunction)
+ {
+ GL_CALL_NVPATH_EXT(glPathCoverDepthFuncNV(m_Conversion.fromBoolOpToGL(inDepthFunction)));
+ }
+
+ void NVRenderBackendGL4Impl::StencilStrokePath(NVRenderBackendPathObject inPathObject)
+ {
+ GL_CALL_NVPATH_EXT(glStencilStrokePathNV(HandleToID_cast(GLuint, size_t, inPathObject), 0x1, (GLuint)~0));
+ }
+
+ void NVRenderBackendGL4Impl::StencilFillPath(NVRenderBackendPathObject inPathObject)
+ {
+#if defined(GL_NV_path_rendering)
+ GL_CALL_NVPATH_EXT(glStencilFillPathNV(HandleToID_cast(GLuint, size_t, inPathObject),
+ GL_COUNT_UP_NV, (GLuint)~0));
+#endif
+ }
+
+ void NVRenderBackendGL4Impl::ReleasePathNVObject(NVRenderBackendPathObject po, size_t range)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glDeletePathsNV(pathID, (GLsizei)range));
+ }
+
+ void NVRenderBackendGL4Impl::StencilFillPathInstanced(
+ NVRenderBackendPathObject po, size_t numPaths, NVRenderPathFormatType::Enum type,
+ const void *charCodes, NVRenderPathFillMode::Enum fillMode, QT3DSU32 stencilMask,
+ NVRenderPathTransformType::Enum transformType, const QT3DSF32 *transformValues)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glStencilFillPathInstancedNV(
+ (GLsizei)numPaths, m_Conversion.fromPathTypeToGL(type), charCodes, pathID,
+ m_Conversion.fromPathFillModeToGL(fillMode), stencilMask,
+ m_Conversion.fromPathTransformToGL(transformType), transformValues));
+ }
+
+ void NVRenderBackendGL4Impl::StencilStrokePathInstancedN(
+ NVRenderBackendPathObject po, size_t numPaths, NVRenderPathFormatType::Enum type,
+ const void *charCodes, QT3DSI32 stencilRef, QT3DSU32 stencilMask,
+ NVRenderPathTransformType::Enum transformType, const QT3DSF32 *transformValues)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glStencilStrokePathInstancedNV(
+ (GLsizei)numPaths, m_Conversion.fromPathTypeToGL(type), charCodes, pathID, stencilRef,
+ stencilMask, m_Conversion.fromPathTransformToGL(transformType), transformValues));
+ }
+
+ void NVRenderBackendGL4Impl::CoverFillPathInstanced(
+ NVRenderBackendPathObject po, size_t numPaths, NVRenderPathFormatType::Enum type,
+ const void *charCodes, NVRenderPathCoverMode::Enum coverMode,
+ NVRenderPathTransformType::Enum transformType, const QT3DSF32 *transformValues)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glCoverFillPathInstancedNV(
+ (GLsizei)numPaths, m_Conversion.fromPathTypeToGL(type), charCodes, pathID,
+ m_Conversion.fromPathCoverModeToGL(coverMode),
+ m_Conversion.fromPathTransformToGL(transformType), transformValues));
+ }
+
+ void NVRenderBackendGL4Impl::CoverStrokePathInstanced(
+ NVRenderBackendPathObject po, size_t numPaths, NVRenderPathFormatType::Enum type,
+ const void *charCodes, NVRenderPathCoverMode::Enum coverMode,
+ NVRenderPathTransformType::Enum transformType, const QT3DSF32 *transformValues)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glCoverStrokePathInstancedNV(
+ (GLsizei)numPaths, m_Conversion.fromPathTypeToGL(type), charCodes, pathID,
+ m_Conversion.fromPathCoverModeToGL(coverMode),
+ m_Conversion.fromPathTransformToGL(transformType), transformValues));
+ }
+
+ void NVRenderBackendGL4Impl::LoadPathGlyphs(
+ NVRenderBackendPathObject po, NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle, size_t numGlyphs, NVRenderPathFormatType::Enum type,
+ const void *charCodes, NVRenderPathMissingGlyphs::Enum handleMissingGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+ GLuint pathTemplateID = (pathParameterTemplate == NULL)
+ ? ~0
+ : HandleToID_cast(GLuint, size_t, pathParameterTemplate);
+
+ GL_CALL_NVPATH_EXT(glPathGlyphsNV(pathID, m_Conversion.fromPathFontTargetToGL(fontTarget), fontName,
+ m_Conversion.fromPathFontStyleToGL(fontStyle), (GLsizei)numGlyphs,
+ m_Conversion.fromPathTypeToGL(type), charCodes,
+ m_Conversion.fromPathMissingGlyphsToGL(handleMissingGlyphs),
+ pathTemplateID, emScale));
+ }
+
+ NVRenderPathReturnValues::Enum NVRenderBackendGL4Impl::LoadPathGlyphsIndexed(
+ NVRenderBackendPathObject po, NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle, QT3DSU32 firstGlyphIndex, size_t numGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+ GLuint pathTemplateID = (pathParameterTemplate == NULL)
+ ? ~0
+ : HandleToID_cast(GLuint, size_t, pathParameterTemplate);
+ GLenum glRet = 0;
+
+ glRet = GL_CALL_QT3DS_EXT(glPathGlyphIndexArrayNV(
+ pathID, m_Conversion.fromPathFontTargetToGL(fontTarget), fontName,
+ m_Conversion.fromPathFontStyleToGL(fontStyle), firstGlyphIndex,
+ (GLsizei)numGlyphs, pathTemplateID, emScale));
+
+ return m_Conversion.fromGLToPathFontReturn(glRet);
+ }
+
+ NVRenderBackend::NVRenderBackendPathObject NVRenderBackendGL4Impl::LoadPathGlyphsIndexedRange(
+ NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle, NVRenderBackendPathObject pathParameterTemplate,
+ QT3DSF32 emScale, QT3DSU32 *count)
+ {
+ GLuint pathTemplateID = (pathParameterTemplate == NULL)
+ ? ~0
+ : HandleToID_cast(GLuint, size_t, pathParameterTemplate);
+ GLenum glRet = 0;
+ GLuint baseAndCount[2] = { 0, 0 };
+
+ glRet = GL_CALL_QT3DS_EXT(glPathGlyphIndexRangeNV(m_Conversion.fromPathFontTargetToGL(fontTarget),
+ fontName,
+ m_Conversion.fromPathFontStyleToGL(fontStyle),
+ pathTemplateID, emScale, baseAndCount));
+
+ if (count)
+ *count = baseAndCount[1];
+
+ return NVRenderBackend::NVRenderBackendPathObject(baseAndCount[0]);
+ }
+
+ void NVRenderBackendGL4Impl::LoadPathGlyphRange(
+ NVRenderBackendPathObject po, NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle, QT3DSU32 firstGlyph, size_t numGlyphs,
+ NVRenderPathMissingGlyphs::Enum handleMissingGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+ GLuint pathTemplateID = (pathParameterTemplate == NULL)
+ ? ~0
+ : HandleToID_cast(GLuint, size_t, pathParameterTemplate);
+
+ GL_CALL_NVPATH_EXT(glPathGlyphRangeNV(
+ pathID, m_Conversion.fromPathFontTargetToGL(fontTarget), fontName,
+ m_Conversion.fromPathFontStyleToGL(fontStyle), firstGlyph, (GLsizei)numGlyphs,
+ m_Conversion.fromPathMissingGlyphsToGL(handleMissingGlyphs), pathTemplateID, emScale));
+ }
+
+ void NVRenderBackendGL4Impl::GetPathMetrics(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathGlyphFontMetricFlags metricQueryMask,
+ NVRenderPathFormatType::Enum type,
+ const void *charCodes, size_t stride,
+ QT3DSF32 *metrics)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glGetPathMetricsNV(m_Conversion.fromPathMetricQueryFlagsToGL(metricQueryMask),
+ (GLsizei)numPaths, m_Conversion.fromPathTypeToGL(type),
+ charCodes, pathID, (GLsizei)stride, metrics));
+ }
+
+ void
+ NVRenderBackendGL4Impl::GetPathMetricsRange(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathGlyphFontMetricFlags metricQueryMask,
+ size_t stride, QT3DSF32 *metrics)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glGetPathMetricRangeNV(m_Conversion.fromPathMetricQueryFlagsToGL(metricQueryMask),
+ pathID, (GLsizei)numPaths, (GLsizei)stride, metrics));
+ }
+
+ void NVRenderBackendGL4Impl::GetPathSpacing(
+ NVRenderBackendPathObject po, size_t numPaths, NVRenderPathListMode::Enum pathListMode,
+ NVRenderPathFormatType::Enum type, const void *charCodes, QT3DSF32 advanceScale,
+ QT3DSF32 kerningScale, NVRenderPathTransformType::Enum transformType, QT3DSF32 *spacing)
+ {
+ GLuint pathID = HandleToID_cast(GLuint, size_t, po);
+
+ GL_CALL_NVPATH_EXT(glGetPathSpacingNV(m_Conversion.fromPathListModeToGL(pathListMode),
+ (GLsizei)numPaths, m_Conversion.fromPathTypeToGL(type),
+ charCodes, pathID, advanceScale, kerningScale,
+ m_Conversion.fromPathTransformToGL(transformType), spacing));
+ }
+}
+}
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGL4.h b/src/render/backends/gl/Qt3DSRenderBackendGL4.h
new file mode 100644
index 0000000..bfdc03b
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendGL4.h
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_GL4_H
+#define QT3DS_RENDER_BACKEND_GL4_H
+
+/// @file Qt3DSRenderBackendGL4.h
+/// NVRender OpenGL 4 backend definition.
+
+#include "foundation/Qt3DSAtomic.h"
+#include "render/backends/gl/Qt3DSRenderBackendGL3.h"
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ class NVRenderBackendGL4Impl : public NVRenderBackendGL3Impl
+ {
+ public:
+ /// constructor
+ NVRenderBackendGL4Impl(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format);
+ /// destructor
+ virtual ~NVRenderBackendGL4Impl();
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ public:
+ void DrawIndirect(NVRenderDrawMode::Enum drawMode, const void *indirect) override;
+ void DrawIndexedIndirect(NVRenderDrawMode::Enum drawMode,
+ NVRenderComponentTypes::Enum type, const void *indirect) override;
+
+ void CreateTextureStorage2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 levels,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height) override;
+
+ void SetMultisampledTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ size_t samples,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height,
+ bool fixedsamplelocations) override;
+
+ void SetConstantValue(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ NVRenderShaderDataTypes::Enum type, QT3DSI32 count, const void *value,
+ bool transpose) override;
+
+ void SetPatchVertexCount(NVRenderBackendInputAssemblerObject iao, QT3DSU32 count) override;
+ virtual NVRenderBackendTessControlShaderObject
+ CreateTessControlShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) override;
+ virtual NVRenderBackendTessEvaluationShaderObject
+ CreateTessEvaluationShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) override;
+ virtual NVRenderBackendGeometryShaderObject
+ CreateGeometryShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage, bool binary) override;
+
+ QT3DSI32 GetStorageBufferCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetStorageBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length, char *nameBuf) override;
+ void ProgramSetStorageBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) override;
+
+ QT3DSI32 GetAtomicCounterBufferCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetAtomicCounterBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length,
+ char *nameBuf) override;
+ void ProgramSetAtomicCounterBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) override;
+
+ void SetMemoryBarrier(NVRenderBufferBarrierFlags barriers) override;
+ void BindImageTexture(NVRenderBackendTextureObject to, QT3DSU32 unit, QT3DSI32 level,
+ bool layered, QT3DSI32 layer,
+ NVRenderImageAccessType::Enum access,
+ NVRenderTextureFormats::Enum format) override;
+
+ virtual NVRenderBackendComputeShaderObject
+ CreateComputeShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage, bool binary) override;
+ void DispatchCompute(NVRenderBackendShaderProgramObject po, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ) override;
+
+ NVRenderBackendProgramPipeline CreateProgramPipeline() override;
+ void ReleaseProgramPipeline(NVRenderBackendProgramPipeline ppo) override;
+ void SetActiveProgramPipeline(NVRenderBackendProgramPipeline ppo) override;
+ void SetProgramStages(NVRenderBackendProgramPipeline ppo,
+ NVRenderShaderTypeFlags flags,
+ NVRenderBackendShaderProgramObject po) override;
+
+ void SetBlendEquation(const NVRenderBlendEquationArgument &pBlendEquArg) override;
+ void SetBlendBarrier(void) override;
+
+ NVRenderBackendPathObject CreatePathNVObject(size_t range) override;
+ void SetPathSpecification(NVRenderBackendPathObject inPathObject,
+ NVConstDataRef<QT3DSU8> inPathCommands,
+ NVConstDataRef<QT3DSF32> inPathCoords) override;
+ NVBounds3 GetPathObjectBoundingBox(NVRenderBackendPathObject inPathObject) override;
+ NVBounds3 GetPathObjectFillBox(NVRenderBackendPathObject inPathObject) override;
+ NVBounds3 GetPathObjectStrokeBox(NVRenderBackendPathObject inPathObject) override;
+ void SetStrokeWidth(NVRenderBackendPathObject inPathObject, QT3DSF32 inStrokeWidth) override;
+
+ void SetPathProjectionMatrix(const QT3DSMat44 inPathProjection) override;
+ void SetPathModelViewMatrix(const QT3DSMat44 inPathModelview) override;
+ void SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias) override;
+ void SetPathCoverDepthFunc(NVRenderBoolOp::Enum inDepthFunction) override;
+ void StencilStrokePath(NVRenderBackendPathObject inPathObject) override;
+ void StencilFillPath(NVRenderBackendPathObject inPathObject) override;
+ void ReleasePathNVObject(NVRenderBackendPathObject po, size_t range) override;
+
+ void StencilFillPathInstanced(
+ NVRenderBackendPathObject po, size_t numPaths, NVRenderPathFormatType::Enum type,
+ const void *charCodes, NVRenderPathFillMode::Enum fillMode, QT3DSU32 stencilMask,
+ NVRenderPathTransformType::Enum transformType, const QT3DSF32 *transformValues) override;
+ void StencilStrokePathInstancedN(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathFormatType::Enum type,
+ const void *charCodes, QT3DSI32 stencilRef,
+ QT3DSU32 stencilMask,
+ NVRenderPathTransformType::Enum transformType,
+ const QT3DSF32 *transformValues) override;
+ void CoverFillPathInstanced(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathFormatType::Enum type,
+ const void *charCodes,
+ NVRenderPathCoverMode::Enum coverMode,
+ NVRenderPathTransformType::Enum transformType,
+ const QT3DSF32 *transformValues) override;
+ void CoverStrokePathInstanced(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathFormatType::Enum type,
+ const void *charCodes,
+ NVRenderPathCoverMode::Enum coverMode,
+ NVRenderPathTransformType::Enum transformType,
+ const QT3DSF32 *transformValues) override;
+ void LoadPathGlyphs(NVRenderBackendPathObject po,
+ NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle, size_t numGlyphs,
+ NVRenderPathFormatType::Enum type, const void *charCodes,
+ NVRenderPathMissingGlyphs::Enum handleMissingGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale) override;
+ virtual NVRenderPathReturnValues::Enum
+ LoadPathGlyphsIndexed(NVRenderBackendPathObject po, NVRenderPathFontTarget::Enum fontTarget,
+ const void *fontName, NVRenderPathFontStyleFlags fontStyle,
+ QT3DSU32 firstGlyphIndex, size_t numGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale) override;
+ virtual NVRenderBackendPathObject
+ LoadPathGlyphsIndexedRange(NVRenderPathFontTarget::Enum fontTarget, const void *fontName,
+ NVRenderPathFontStyleFlags fontStyle,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale,
+ QT3DSU32 *count) override;
+ void LoadPathGlyphRange(NVRenderBackendPathObject po,
+ NVRenderPathFontTarget::Enum fontTarget,
+ const void *fontName, NVRenderPathFontStyleFlags fontStyle,
+ QT3DSU32 firstGlyph, size_t numGlyphs,
+ NVRenderPathMissingGlyphs::Enum handleMissingGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate,
+ QT3DSF32 emScale) override;
+ void GetPathMetrics(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathGlyphFontMetricFlags metricQueryMask,
+ NVRenderPathFormatType::Enum type, const void *charCodes,
+ size_t stride, QT3DSF32 *metrics) override;
+ void GetPathMetricsRange(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathGlyphFontMetricFlags metricQueryMask,
+ size_t stride, QT3DSF32 *metrics) override;
+ void GetPathSpacing(NVRenderBackendPathObject po, size_t numPaths,
+ NVRenderPathListMode::Enum pathListMode,
+ NVRenderPathFormatType::Enum type, const void *charCodes,
+ QT3DSF32 advanceScale, QT3DSF32 kerningScale,
+ NVRenderPathTransformType::Enum transformType, QT3DSF32 *spacing) override;
+ private:
+#if !defined(QT_OPENGL_ES)
+ QOpenGLExtension_NV_path_rendering *m_nvPathRendering;
+ QOpenGLExtension_EXT_direct_state_access *m_directStateAccess;
+#endif
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp b/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
new file mode 100644
index 0000000..0fe6e0f
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
@@ -0,0 +1,2230 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "render/backends/gl/Qt3DSRenderBackendGLBase.h"
+#include "render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h"
+#include "render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h"
+#include "render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h"
+#include "foundation/StringTable.h"
+
+#ifdef RENDER_BACKEND_LOG_GL_ERRORS
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError(#x, __FILE__, __LINE__)
+#else
+#define RENDER_LOG_ERROR_PARAMS(x) checkGLError()
+#endif
+
+#define GL_CALL_FUNCTION(x) m_glFunctions->x; RENDER_LOG_ERROR_PARAMS(x);
+#define GL_CALL_EXTRA_FUNCTION(x) m_glExtraFunctions->x; RENDER_LOG_ERROR_PARAMS(x);
+
+namespace qt3ds {
+namespace render {
+
+#ifndef GL_PROGRAM_SEPARABLE
+#define GL_PROGRAM_SEPARABLE 0x8258
+#endif
+
+#ifndef GL_UNSIGNED_INT_IMAGE_2D
+#define GL_UNSIGNED_INT_IMAGE_2D 0x9063
+#endif
+
+#ifndef GL_UNSIGNED_INT_ATOMIC_COUNTER
+#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB
+#endif
+
+/// constructor
+NVRenderBackendGLBase::NVRenderBackendGLBase(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format)
+ : mRefCount(0)
+ , m_Foundation(fnd)
+ , m_StringTable(stringTable)
+ , m_Conversion()
+ , m_MaxAttribCount(0)
+ , m_DrawBuffersArray(m_Foundation.getAllocator(),
+ "NVRenderBackendGLBase::m_DrawBuffersArray")
+ , m_format(format)
+{
+ m_glFunctions = new QOpenGLFunctions;
+ m_glFunctions->initializeOpenGLFunctions();
+ m_glExtraFunctions = new QOpenGLExtraFunctions;
+ m_glExtraFunctions->initializeOpenGLFunctions();
+
+ // internal state tracker
+ m_pCurrentRasterizerState =
+ QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendRasterizerStateGL)();
+ m_pCurrentDepthStencilState =
+ QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendDepthStencilStateGL)();
+
+ m_glFunctions->glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_maxAnisotropy);
+}
+/// destructor
+NVRenderBackendGLBase::~NVRenderBackendGLBase()
+{
+ if (m_pCurrentRasterizerState)
+ NVDelete(m_Foundation.getAllocator(), m_pCurrentRasterizerState);
+ if (m_pCurrentDepthStencilState)
+ NVDelete(m_Foundation.getAllocator(), m_pCurrentDepthStencilState);
+ if (m_glFunctions)
+ delete m_glFunctions;
+ if (m_glExtraFunctions)
+ delete m_glExtraFunctions;
+}
+
+NVRenderContextType NVRenderBackendGLBase::GetRenderContextType() const
+{
+ if (m_format.renderableType() == QSurfaceFormat::OpenGLES) {
+ if (m_format.majorVersion() == 2)
+ return NVRenderContextValues::GLES2;
+
+ if (m_format.majorVersion() == 3) {
+ if (m_format.minorVersion() >= 1)
+ return NVRenderContextValues::GLES3PLUS;
+ else
+ return NVRenderContextValues::GLES3;
+ }
+ } else if (m_format.majorVersion() == 2) {
+ return NVRenderContextValues::GL2;
+ } else if (m_format.majorVersion() == 3) {
+ return NVRenderContextValues::GL3;
+ } else if (m_format.majorVersion() == 4) {
+ return NVRenderContextValues::GL4;
+ }
+
+ return NVRenderContextValues::NullContext;
+}
+
+bool NVRenderBackendGLBase::isESCompatible() const
+{
+ return m_format.renderableType() == QSurfaceFormat::OpenGLES;
+}
+
+const char *NVRenderBackendGLBase::GetShadingLanguageVersion()
+{
+ const char *retval = (const char *)GL_CALL_FUNCTION(
+ glGetString(GL_SHADING_LANGUAGE_VERSION));
+ if (retval == nullptr)
+ return "";
+
+ return retval;
+}
+
+QT3DSU32
+NVRenderBackendGLBase::GetMaxCombinedTextureUnits()
+{
+ QT3DSI32 maxUnits;
+ GL_CALL_FUNCTION(glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxUnits));
+ return maxUnits;
+}
+
+bool NVRenderBackendGLBase::GetRenderBackendCap(
+ NVRenderBackend::NVRenderBackendCaps::Enum inCap) const
+{
+ bool bSupported = false;
+
+ switch (inCap) {
+ case NVRenderBackendCaps::FpRenderTarget:
+ bSupported = m_backendSupport.caps.bits.bFPRenderTargetsSupported;
+ break;
+ case NVRenderBackendCaps::DepthStencilTexture:
+ bSupported = m_backendSupport.caps.bits.bDepthStencilSupported;
+ break;
+ case NVRenderBackendCaps::ConstantBuffer:
+ bSupported = m_backendSupport.caps.bits.bConstantBufferSupported;
+ break;
+ case NVRenderBackendCaps::DxtImages:
+ bSupported = m_backendSupport.caps.bits.bDXTImagesSupported;
+ break;
+ case NVRenderBackendCaps::MsTexture:
+ bSupported = m_backendSupport.caps.bits.bMsTextureSupported;
+ break;
+ case NVRenderBackendCaps::TexSwizzle:
+ bSupported = m_backendSupport.caps.bits.bTextureSwizzleSupported;
+ break;
+ case NVRenderBackendCaps::FastBlits:
+ bSupported = m_backendSupport.caps.bits.bFastBlitsSupported;
+ break;
+ case NVRenderBackendCaps::Tessellation:
+ bSupported = m_backendSupport.caps.bits.bTessellationSupported;
+ break;
+ case NVRenderBackendCaps::Compute:
+ bSupported = m_backendSupport.caps.bits.bComputeSupported;
+ break;
+ case NVRenderBackendCaps::Geometry:
+ bSupported = m_backendSupport.caps.bits.bGeometrySupported;
+ break;
+ case NVRenderBackendCaps::SampleQuery: {
+ // On the following context sample query is not supported
+ NVRenderContextType noSamplesQuerySupportedContextFlags(NVRenderContextValues::GL2
+ | NVRenderContextValues::GLES2);
+ NVRenderContextType ctxType = GetRenderContextType();
+ bSupported = !(ctxType & noSamplesQuerySupportedContextFlags);
+ } break;
+ case NVRenderBackendCaps::TimerQuery:
+ bSupported = m_backendSupport.caps.bits.bTimerQuerySupported;
+ break;
+ case NVRenderBackendCaps::CommandSync: {
+ // On the following context sync objects are not supported
+ NVRenderContextType noSyncObjectSupportedContextFlags(NVRenderContextValues::GL2
+ | NVRenderContextValues::GLES2);
+ NVRenderContextType ctxType = GetRenderContextType();
+ bSupported = !(ctxType & noSyncObjectSupportedContextFlags);
+ } break;
+ case NVRenderBackendCaps::TextureArray: {
+ // On the following context texture arrays are not supported
+ NVRenderContextType noTextureArraySupportedContextFlags(NVRenderContextValues::GL2
+ | NVRenderContextValues::GLES2);
+ NVRenderContextType ctxType = GetRenderContextType();
+ bSupported = !(ctxType & noTextureArraySupportedContextFlags);
+ } break;
+ case NVRenderBackendCaps::StorageBuffer:
+ bSupported = m_backendSupport.caps.bits.bStorageBufferSupported;
+ break;
+ case NVRenderBackendCaps::AtomicCounterBuffer:
+ bSupported = m_backendSupport.caps.bits.bAtomicCounterBufferSupported;
+ break;
+ case NVRenderBackendCaps::ShaderImageLoadStore:
+ bSupported = m_backendSupport.caps.bits.bShaderImageLoadStoreSupported;
+ break;
+ case NVRenderBackendCaps::ProgramPipeline:
+ bSupported = m_backendSupport.caps.bits.bProgramPipelineSupported;
+ break;
+ case NVRenderBackendCaps::PathRendering:
+ bSupported = m_backendSupport.caps.bits.bNVPathRenderingSupported;
+ break;
+ case NVRenderBackendCaps::AdvancedBlend:
+ bSupported = m_backendSupport.caps.bits.bNVAdvancedBlendSupported |
+ m_backendSupport.caps.bits.bKHRAdvancedBlendSupported;
+ break;
+ case NVRenderBackendCaps::AdvancedBlendKHR:
+ bSupported = m_backendSupport.caps.bits.bKHRAdvancedBlendSupported;
+ break;
+ case NVRenderBackendCaps::BlendCoherency:
+ bSupported = m_backendSupport.caps.bits.bNVBlendCoherenceSupported |
+ m_backendSupport.caps.bits.bKHRBlendCoherenceSupported;
+ break;
+ case NVRenderBackendCaps::gpuShader5:
+ bSupported = m_backendSupport.caps.bits.bGPUShader5ExtensionSupported;
+ break;
+ case NVRenderBackendCaps::VertexArrayObject:
+ bSupported = m_backendSupport.caps.bits.bVertexArrayObjectSupported;
+ break;
+ case NVRenderBackendCaps::StandardDerivatives:
+ bSupported = m_backendSupport.caps.bits.bStandardDerivativesSupported;
+ break;
+ case NVRenderBackendCaps::TextureLod:
+ bSupported = m_backendSupport.caps.bits.bTextureLodSupported;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ bSupported = false;
+ break;
+ }
+
+ return bSupported;
+}
+
+void NVRenderBackendGLBase::GetRenderBackendValue(NVRenderBackendQuery::Enum inQuery,
+ QT3DSI32 *params) const
+{
+ if (!params)
+ return;
+ switch (inQuery) {
+ case NVRenderBackendQuery::MaxTextureSize:
+ GL_CALL_FUNCTION(glGetIntegerv(GL_MAX_TEXTURE_SIZE, params));
+ break;
+ case NVRenderBackendQuery::MaxTextureArrayLayers: {
+ NVRenderContextType noTextureArraySupportedContextFlags(
+ NVRenderContextValues::GL2 | NVRenderContextValues::GLES2);
+ NVRenderContextType ctxType = GetRenderContextType();
+ if (!(ctxType & noTextureArraySupportedContextFlags)) {
+ GL_CALL_FUNCTION(glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, params));
+ } else {
+ *params = 0;
+ }
+ } break;
+ case NVRenderBackendQuery::MaxConstantBufferSlots: {
+ NVRenderContextType noConstantBufferSupportedContextFlags(
+ NVRenderContextValues::GL2 | NVRenderContextValues::GLES2);
+ NVRenderContextType ctxType = GetRenderContextType();
+ if (!(ctxType & noConstantBufferSupportedContextFlags)) {
+ GL_CALL_FUNCTION(glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, params));
+ } else {
+ *params = 0;
+ }
+ } break;
+ case NVRenderBackendQuery::MaxConstantBufferBlockSize: {
+ NVRenderContextType noConstantBufferSupportedContextFlags(
+ NVRenderContextValues::GL2 | NVRenderContextValues::GLES2);
+ NVRenderContextType ctxType = GetRenderContextType();
+ if (!(ctxType & noConstantBufferSupportedContextFlags)) {
+ GL_CALL_FUNCTION(glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, params));
+ } else {
+ *params = 0;
+ }
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ *params = 0;
+ break;
+ }
+}
+
+QT3DSU32
+NVRenderBackendGLBase::GetDepthBits() const
+{
+ QT3DSI32 depthBits;
+ GL_CALL_FUNCTION(glGetIntegerv(GL_DEPTH_BITS, &depthBits));
+ return depthBits;
+}
+
+QT3DSU32
+NVRenderBackendGLBase::GetStencilBits() const
+{
+ QT3DSI32 stencilBits;
+ GL_CALL_FUNCTION(glGetIntegerv(GL_STENCIL_BITS, &stencilBits));
+ return stencilBits;
+}
+
+void NVRenderBackendGLBase::SetMultisample(bool bEnable)
+{
+ QT3DS_ASSERT(m_backendSupport.caps.bits.bMsTextureSupported || !bEnable);
+ // For GL ES explicit multisample enabling is not needed
+ // and does not exist
+ NVRenderContextType noMsaaEnableContextFlags(NVRenderContextValues::GLES2
+ | NVRenderContextValues::GLES3
+ | NVRenderContextValues::GLES3PLUS);
+ NVRenderContextType ctxType = GetRenderContextType();
+ if (!(ctxType & noMsaaEnableContextFlags)) {
+ SetRenderState(bEnable, NVRenderState::Multisample);
+ }
+}
+
+void NVRenderBackendGLBase::SetRenderState(bool bEnable, const NVRenderState::Enum value)
+{
+ if (value == NVRenderState::DepthWrite) {
+ GL_CALL_FUNCTION(glDepthMask(bEnable));
+ } else {
+ if (bEnable) {
+ GL_CALL_FUNCTION(glEnable(m_Conversion.fromRenderStateToGL(value)));
+ } else {
+ GL_CALL_FUNCTION(glDisable(m_Conversion.fromRenderStateToGL(value)));
+ }
+ }
+}
+
+NVRenderBackend::NVRenderBackendDepthStencilStateObject
+NVRenderBackendGLBase::CreateDepthStencilState(
+ bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc, bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack)
+{
+ NVRenderBackendDepthStencilStateGL *retval =
+ QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendDepthStencilStateGL)(
+ enableDepth, depthMask, depthFunc, enableStencil, stencilFuncFront, stencilFuncBack,
+ depthStencilOpFront, depthStencilOpBack);
+
+ return (NVRenderBackend::NVRenderBackendDepthStencilStateObject)retval;
+}
+
+void NVRenderBackendGLBase::ReleaseDepthStencilState(
+ NVRenderBackendDepthStencilStateObject inDepthStencilState)
+{
+ NVRenderBackendDepthStencilStateGL *inputState =
+ (NVRenderBackendDepthStencilStateGL *)inDepthStencilState;
+ if (inputState)
+ NVDelete(m_Foundation.getAllocator(), inputState);
+}
+
+NVRenderBackend::NVRenderBackendRasterizerStateObject
+NVRenderBackendGLBase::CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace)
+{
+ NVRenderBackendRasterizerStateGL *retval =
+ QT3DS_NEW(m_Foundation.getAllocator(),
+ NVRenderBackendRasterizerStateGL)(depthBias, depthScale, cullFace);
+
+ return (NVRenderBackend::NVRenderBackendRasterizerStateObject)retval;
+}
+
+void NVRenderBackendGLBase::ReleaseRasterizerState(
+ NVRenderBackendRasterizerStateObject rasterizerState)
+{
+ NVRenderBackendRasterizerStateGL *inputState =
+ (NVRenderBackendRasterizerStateGL *)rasterizerState;
+ if (inputState)
+ NVDelete(m_Foundation.getAllocator(), inputState);
+}
+
+void NVRenderBackendGLBase::SetDepthStencilState(
+ NVRenderBackendDepthStencilStateObject inDepthStencilState)
+{
+ NVRenderBackendDepthStencilStateGL *inputState =
+ (NVRenderBackendDepthStencilStateGL *)inDepthStencilState;
+ if (inputState && !(*m_pCurrentDepthStencilState == *inputState)) {
+ // we check on a per single state base
+ if (inputState->m_DepthEnable != m_pCurrentDepthStencilState->m_DepthEnable) {
+ SetRenderState(inputState->m_DepthEnable, NVRenderState::DepthTest);
+ m_pCurrentDepthStencilState->m_DepthEnable = inputState->m_DepthEnable;
+ }
+ if (inputState->m_StencilEnable != m_pCurrentDepthStencilState->m_StencilEnable) {
+ SetRenderState(inputState->m_StencilEnable, NVRenderState::StencilTest);
+ m_pCurrentDepthStencilState->m_StencilEnable = inputState->m_StencilEnable;
+ }
+
+ if (inputState->m_DepthMask != m_pCurrentDepthStencilState->m_DepthMask) {
+ GL_CALL_FUNCTION(glDepthMask(inputState->m_DepthMask));
+ m_pCurrentDepthStencilState->m_DepthMask = inputState->m_DepthMask;
+ }
+
+ if (inputState->m_DepthFunc != m_pCurrentDepthStencilState->m_DepthFunc) {
+ GL_CALL_FUNCTION(glDepthFunc(m_Conversion.fromBoolOpToGL(inputState->m_DepthFunc)));
+ m_pCurrentDepthStencilState->m_DepthFunc = inputState->m_DepthFunc;
+ }
+
+ if (!(inputState->m_DepthStencilOpFront
+ == m_pCurrentDepthStencilState->m_DepthStencilOpFront)) {
+ GL_CALL_FUNCTION(glStencilOpSeparate(
+ GL_FRONT,
+ m_Conversion.fromStencilOpToGL(inputState->m_DepthStencilOpFront.m_StencilFail),
+ m_Conversion.fromStencilOpToGL(inputState->m_DepthStencilOpFront.m_DepthFail),
+ m_Conversion.fromStencilOpToGL(inputState->m_DepthStencilOpFront.m_DepthPass)));
+ m_pCurrentDepthStencilState->m_DepthStencilOpFront =
+ inputState->m_DepthStencilOpFront;
+ }
+
+ if (!(inputState->m_DepthStencilOpBack
+ == m_pCurrentDepthStencilState->m_DepthStencilOpBack)) {
+ GL_CALL_FUNCTION(glStencilOpSeparate(
+ GL_BACK,
+ m_Conversion.fromStencilOpToGL(inputState->m_DepthStencilOpBack.m_StencilFail),
+ m_Conversion.fromStencilOpToGL(inputState->m_DepthStencilOpBack.m_DepthFail),
+ m_Conversion.fromStencilOpToGL(inputState->m_DepthStencilOpBack.m_DepthPass)));
+ m_pCurrentDepthStencilState->m_DepthStencilOpBack =
+ inputState->m_DepthStencilOpBack;
+ }
+
+ if (!(inputState->m_StencilFuncFront
+ == m_pCurrentDepthStencilState->m_StencilFuncFront)) {
+ GL_CALL_FUNCTION(glStencilFuncSeparate(
+ GL_FRONT,
+ m_Conversion.fromBoolOpToGL(inputState->m_StencilFuncFront.m_Function),
+ inputState->m_StencilFuncFront.m_ReferenceValue,
+ inputState->m_StencilFuncFront.m_Mask));
+ m_pCurrentDepthStencilState->m_StencilFuncFront = inputState->m_StencilFuncFront;
+ }
+
+ if (!(inputState->m_StencilFuncBack
+ == m_pCurrentDepthStencilState->m_StencilFuncBack)) {
+ GL_CALL_FUNCTION(glStencilFuncSeparate(
+ GL_BACK, m_Conversion.fromBoolOpToGL(inputState->m_StencilFuncBack.m_Function),
+ inputState->m_StencilFuncBack.m_ReferenceValue,
+ inputState->m_StencilFuncBack.m_Mask));
+ m_pCurrentDepthStencilState->m_StencilFuncBack = inputState->m_StencilFuncBack;
+ }
+ }
+}
+
+void
+NVRenderBackendGLBase::SetRasterizerState(NVRenderBackendRasterizerStateObject rasterizerState)
+{
+ NVRenderBackendRasterizerStateGL *inputState =
+ (NVRenderBackendRasterizerStateGL *)rasterizerState;
+ if (inputState && !(*m_pCurrentRasterizerState == *inputState)) {
+ // store current state
+ *m_pCurrentRasterizerState = *inputState;
+
+ if (m_pCurrentRasterizerState->m_DepthBias != 0.0
+ || m_pCurrentRasterizerState->m_DepthScale != 0.0) {
+ GL_CALL_FUNCTION(glEnable(GL_POLYGON_OFFSET_FILL));
+ } else {
+ GL_CALL_FUNCTION(glDisable(GL_POLYGON_OFFSET_FILL));
+ }
+
+ GL_CALL_FUNCTION(glPolygonOffset(m_pCurrentRasterizerState->m_DepthBias,
+ m_pCurrentRasterizerState->m_DepthScale));
+
+ GL_CALL_FUNCTION(
+ glCullFace(m_Conversion.fromFacesToGL(m_pCurrentRasterizerState->m_CullFace)));
+ }
+}
+
+bool NVRenderBackendGLBase::GetRenderState(const NVRenderState::Enum value)
+{
+ bool enabled = GL_CALL_FUNCTION(glIsEnabled(m_Conversion.fromRenderStateToGL(value)));
+ return enabled;
+}
+
+NVRenderBoolOp::Enum NVRenderBackendGLBase::GetDepthFunc()
+{
+ QT3DSI32 value;
+ GL_CALL_FUNCTION(glGetIntegerv(GL_DEPTH_FUNC, &value));
+ return m_Conversion.fromGLToBoolOp(value);
+}
+
+void NVRenderBackendGLBase::SetDepthFunc(const NVRenderBoolOp::Enum func)
+{
+ GL_CALL_FUNCTION(glDepthFunc(m_Conversion.fromBoolOpToGL(func)));
+}
+
+bool NVRenderBackendGLBase::GetDepthWrite()
+{
+ QT3DSI32 value;
+ GL_CALL_FUNCTION(glGetIntegerv(GL_DEPTH_WRITEMASK, (GLint *)&value));
+ return value ? true : false;
+}
+
+void NVRenderBackendGLBase::SetDepthWrite(bool bEnable)
+{
+ GL_CALL_FUNCTION(glDepthMask(bEnable));
+}
+
+void NVRenderBackendGLBase::SetColorWrites(bool bRed, bool bGreen, bool bBlue, bool bAlpha)
+{
+ GL_CALL_FUNCTION(glColorMask(bRed, bGreen, bBlue, bAlpha));
+}
+
+void NVRenderBackendGLBase::GetBlendFunc(NVRenderBlendFunctionArgument *pBlendFuncArg)
+{
+ QT3DS_ASSERT(pBlendFuncArg);
+ QT3DSI32_4 values;
+
+ GL_CALL_FUNCTION(glGetIntegerv(GL_BLEND_SRC_RGB, (GLint *)&values.x));
+ GL_CALL_FUNCTION(glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint *)&values.y));
+ GL_CALL_FUNCTION(glGetIntegerv(GL_BLEND_DST_RGB, (GLint *)&values.z));
+ GL_CALL_FUNCTION(glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint *)&values.w));
+
+ pBlendFuncArg->m_SrcRGB = m_Conversion.fromGLToSrcBlendFunc(values.x);
+ pBlendFuncArg->m_SrcAlpha = m_Conversion.fromGLToSrcBlendFunc(values.y);
+ pBlendFuncArg->m_DstRGB = m_Conversion.fromGLToDstBlendFunc(values.z);
+ pBlendFuncArg->m_DstAlpha = m_Conversion.fromGLToDstBlendFunc(values.w);
+}
+
+void NVRenderBackendGLBase::SetBlendFunc(const NVRenderBlendFunctionArgument &blendFuncArg)
+{
+ QT3DSI32_4 values;
+
+ values.x = m_Conversion.fromSrcBlendFuncToGL(blendFuncArg.m_SrcRGB);
+ values.y = m_Conversion.fromDstBlendFuncToGL(blendFuncArg.m_DstRGB);
+ values.z = m_Conversion.fromSrcBlendFuncToGL(blendFuncArg.m_SrcAlpha);
+ values.w = m_Conversion.fromDstBlendFuncToGL(blendFuncArg.m_DstAlpha);
+
+ GL_CALL_FUNCTION(glBlendFuncSeparate(values.x, values.y, values.z, values.w));
+}
+
+void NVRenderBackendGLBase::SetBlendEquation(const NVRenderBlendEquationArgument &)
+{
+ // needs GL4 / GLES 3.1
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::SetBlendBarrier()
+{
+ // needs GL4 / GLES 3.1
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::GetScissorRect(NVRenderRect *pRect)
+{
+ QT3DS_ASSERT(pRect);
+ GL_CALL_FUNCTION(glGetIntegerv(GL_SCISSOR_BOX, (GLint *)pRect));
+}
+
+void NVRenderBackendGLBase::SetScissorRect(const NVRenderRect &rect)
+{
+ GL_CALL_FUNCTION(glScissor(rect.m_X, rect.m_Y, rect.m_Width, rect.m_Height));
+}
+
+void NVRenderBackendGLBase::GetViewportRect(NVRenderRect *pRect)
+{
+ QT3DS_ASSERT(pRect);
+ GL_CALL_FUNCTION(glGetIntegerv(GL_VIEWPORT, (GLint *)pRect));
+}
+
+void NVRenderBackendGLBase::SetViewportRect(const NVRenderRect &rect)
+{
+ GL_CALL_FUNCTION(glViewport(rect.m_X, rect.m_Y, rect.m_Width, rect.m_Height););
+}
+
+void NVRenderBackendGLBase::SetClearColor(const QT3DSVec4 *pClearColor)
+{
+ QT3DS_ASSERT(pClearColor);
+
+ GL_CALL_FUNCTION(glClearColor(pClearColor->x, pClearColor->y,
+ pClearColor->z, pClearColor->w));
+}
+
+void NVRenderBackendGLBase::Clear(NVRenderClearFlags flags)
+{
+ GL_CALL_FUNCTION(glClear(m_Conversion.fromClearFlagsToGL(flags)));
+}
+
+NVRenderBackend::NVRenderBackendBufferObject
+NVRenderBackendGLBase::CreateBuffer(size_t size, NVRenderBufferBindFlags bindFlags,
+ NVRenderBufferUsageType::Enum usage, const void *hostPtr)
+{
+ GLuint bufID = 0;
+
+ GL_CALL_FUNCTION(glGenBuffers(1, &bufID));
+
+ if (bufID && size) {
+ GLenum target = m_Conversion.fromBindBufferFlagsToGL(bindFlags);
+ if (target != GL_INVALID_ENUM) {
+ GL_CALL_FUNCTION(glBindBuffer(target, bufID));
+ GL_CALL_FUNCTION(glBufferData(target, size, hostPtr,
+ m_Conversion.fromBufferUsageTypeToGL(usage)));
+ } else {
+ GL_CALL_FUNCTION(glDeleteBuffers(1, &bufID));
+ bufID = 0;
+ qCCritical(GL_ERROR, GLConversion::processGLError(target));
+ }
+ }
+
+ return (NVRenderBackend::NVRenderBackendBufferObject)bufID;
+}
+
+void NVRenderBackendGLBase::BindBuffer(NVRenderBackendBufferObject bo,
+ NVRenderBufferBindFlags bindFlags)
+{
+ GLuint bufID = HandleToID_cast(GLuint, size_t, bo);
+ GL_CALL_FUNCTION(glBindBuffer(m_Conversion.fromBindBufferFlagsToGL(bindFlags), bufID));
+}
+
+void NVRenderBackendGLBase::ReleaseBuffer(NVRenderBackendBufferObject bo)
+{
+ GLuint bufID = HandleToID_cast(GLuint, size_t, bo);
+ GL_CALL_FUNCTION(glDeleteBuffers(1, &bufID));
+}
+
+void NVRenderBackendGLBase::UpdateBuffer(NVRenderBackendBufferObject bo,
+ NVRenderBufferBindFlags bindFlags, size_t size,
+ NVRenderBufferUsageType::Enum usage, const void *data)
+{
+ GLuint bufID = HandleToID_cast(GLuint, size_t, bo);
+ GLenum target = m_Conversion.fromBindBufferFlagsToGL(bindFlags);
+ GL_CALL_FUNCTION(glBindBuffer(target, bufID));
+ GL_CALL_FUNCTION(glBufferData(target, size, data, m_Conversion.fromBufferUsageTypeToGL(usage)));
+}
+
+void NVRenderBackendGLBase::UpdateBufferRange(NVRenderBackendBufferObject bo,
+ NVRenderBufferBindFlags bindFlags, size_t offset,
+ size_t size, const void *data)
+{
+ GLuint bufID = HandleToID_cast(GLuint, size_t, bo);
+ GLenum target = m_Conversion.fromBindBufferFlagsToGL(bindFlags);
+ GL_CALL_FUNCTION(glBindBuffer(target, bufID));
+ GL_CALL_FUNCTION(glBufferSubData(target, offset, size, data));
+}
+
+void *NVRenderBackendGLBase::MapBuffer(NVRenderBackendBufferObject, NVRenderBufferBindFlags,
+ size_t, size_t, NVRenderBufferAccessFlags)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return nullptr;
+}
+
+bool NVRenderBackendGLBase::UnmapBuffer(NVRenderBackendBufferObject, NVRenderBufferBindFlags)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return true;
+}
+
+void NVRenderBackendGLBase::SetMemoryBarrier(NVRenderBufferBarrierFlags)
+{
+ // needs GL 4 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+NVRenderBackend::NVRenderBackendQueryObject NVRenderBackendGLBase::CreateQuery()
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return NVRenderBackendQueryObject(0);
+}
+
+void NVRenderBackendGLBase::ReleaseQuery(NVRenderBackendQueryObject)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::BeginQuery(NVRenderBackendQueryObject, NVRenderQueryType::Enum)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::EndQuery(NVRenderBackendQueryObject, NVRenderQueryType::Enum)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::GetQueryResult(NVRenderBackendQueryObject,
+ NVRenderQueryResultType::Enum, QT3DSU32 *)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::GetQueryResult(NVRenderBackendQueryObject,
+ NVRenderQueryResultType::Enum, QT3DSU64 *)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::SetQueryTimer(NVRenderBackendQueryObject)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+NVRenderBackend::NVRenderBackendSyncObject
+ NVRenderBackendGLBase::CreateSync(NVRenderSyncType::Enum, NVRenderSyncFlags)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return NVRenderBackendSyncObject(0);
+}
+
+void NVRenderBackendGLBase::ReleaseSync(NVRenderBackendSyncObject)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::WaitSync(NVRenderBackendSyncObject, NVRenderCommandFlushFlags,
+ QT3DSU64)
+{
+ // needs GL 3 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+NVRenderBackend::NVRenderBackendRenderTargetObject NVRenderBackendGLBase::CreateRenderTarget()
+{
+ GLuint fboID = 0;
+
+ GL_CALL_FUNCTION(glGenFramebuffers(1, &fboID));
+
+ return (NVRenderBackend::NVRenderBackendRenderTargetObject)fboID;
+}
+
+void NVRenderBackendGLBase::ReleaseRenderTarget(NVRenderBackendRenderTargetObject rto)
+{
+ GLuint fboID = HandleToID_cast(GLuint, size_t, rto);
+
+ if (fboID) {
+ GL_CALL_FUNCTION(glDeleteFramebuffers(1, &fboID));
+ }
+}
+
+void NVRenderBackendGLBase::RenderTargetAttach(NVRenderBackendRenderTargetObject /* rto */,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendRenderbufferObject rbo)
+{
+ // rto must be the current render target
+ GLuint rbID = HandleToID_cast(GLuint, size_t, rbo);
+
+ GLenum glAttach = GLConversion::fromFramebufferAttachmentsToGL(attachment);
+
+ GL_CALL_FUNCTION(glFramebufferRenderbuffer(GL_FRAMEBUFFER, glAttach, GL_RENDERBUFFER, rbID));
+}
+
+void NVRenderBackendGLBase::RenderTargetAttach(NVRenderBackendRenderTargetObject /* rto */,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target)
+{
+ // rto must be the current render target
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+
+ QT3DS_ASSERT(target == NVRenderTextureTargetType::Texture2D
+ || m_backendSupport.caps.bits.bMsTextureSupported);
+
+ GLenum glAttach = GLConversion::fromFramebufferAttachmentsToGL(attachment);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+
+ GL_CALL_FUNCTION(glFramebufferTexture2D(GL_FRAMEBUFFER, glAttach, glTarget, texID, 0))
+}
+
+void NVRenderBackendGLBase::RenderTargetAttach(NVRenderBackendRenderTargetObject,
+ NVRenderFrameBufferAttachments::Enum,
+ NVRenderBackendTextureObject, QT3DSI32, QT3DSI32)
+{
+ // Needs GL3 or GLES 3
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::SetRenderTarget(NVRenderBackendRenderTargetObject rto)
+{
+ GLuint fboID = HandleToID_cast(GLuint, size_t, rto);
+ if (!fboID)
+ fboID = QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext()->defaultFramebufferObject();
+
+ GL_CALL_FUNCTION(glBindFramebuffer(GL_FRAMEBUFFER, fboID));
+}
+
+bool NVRenderBackendGLBase::RenderTargetIsValid(NVRenderBackendRenderTargetObject /* rto */)
+{
+ // rto must be the current render target
+ GLenum completeStatus = GL_CALL_FUNCTION(glCheckFramebufferStatus(GL_FRAMEBUFFER));
+ switch (completeStatus) {
+#define HANDLE_INCOMPLETE_STATUS(x) \
+case x: \
+ qCCritical(INTERNAL_ERROR, "Framebuffer is not complete: %s", #x); \
+ return false;
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS)
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
+ HANDLE_INCOMPLETE_STATUS(GL_FRAMEBUFFER_UNSUPPORTED)
+#undef HANDLE_INCOMPLETE_STATUS
+ }
+ return true;
+}
+
+NVRenderBackend::NVRenderBackendRenderbufferObject
+NVRenderBackendGLBase::CreateRenderbuffer(NVRenderRenderBufferFormats::Enum storageFormat,
+ size_t width, size_t height)
+{
+ GLuint bufID = 0;
+
+ GL_CALL_FUNCTION(glGenRenderbuffers(1, &bufID));
+ GL_CALL_FUNCTION(glBindRenderbuffer(GL_RENDERBUFFER, bufID));
+ GL_CALL_FUNCTION(glRenderbufferStorage(GL_RENDERBUFFER,
+ GLConversion::fromRenderBufferFormatsToRenderBufferGL(storageFormat),
+ (GLsizei)width, (GLsizei)height));
+
+ // check for error
+ GLenum error = m_glFunctions->glGetError();
+ if (error != GL_NO_ERROR) {
+ qCCritical(GL_ERROR, GLConversion::processGLError(error));
+ QT3DS_ASSERT(false);
+ GL_CALL_FUNCTION(glDeleteRenderbuffers(1, &bufID));
+ bufID = 0;
+ }
+
+ GL_CALL_FUNCTION(glBindRenderbuffer(GL_RENDERBUFFER, 0));
+
+ return (NVRenderBackend::NVRenderBackendRenderbufferObject)bufID;
+}
+
+void NVRenderBackendGLBase::ReleaseRenderbuffer(NVRenderBackendRenderbufferObject rbo)
+{
+ GLuint bufID = HandleToID_cast(GLuint, size_t, rbo);
+
+ if (bufID) {
+ GL_CALL_FUNCTION(glDeleteRenderbuffers(1, &bufID));
+ }
+}
+
+bool NVRenderBackendGLBase::ResizeRenderbuffer(NVRenderBackendRenderbufferObject rbo,
+ NVRenderRenderBufferFormats::Enum storageFormat,
+ size_t width, size_t height)
+{
+ bool success = true;
+ GLuint bufID = HandleToID_cast(GLuint, size_t, rbo);
+
+ QT3DS_ASSERT(bufID);
+
+ GL_CALL_FUNCTION(glBindRenderbuffer(GL_RENDERBUFFER, bufID));
+ GL_CALL_FUNCTION(glRenderbufferStorage(GL_RENDERBUFFER,
+ GLConversion::fromRenderBufferFormatsToRenderBufferGL(storageFormat),
+ (GLsizei)width, (GLsizei)height));
+
+ // check for error
+ GLenum error = m_glFunctions->glGetError();
+ if (error != GL_NO_ERROR) {
+ qCCritical(GL_ERROR, GLConversion::processGLError(error));
+ QT3DS_ASSERT(false);
+ success = false;
+ }
+
+ return success;
+}
+
+NVRenderBackend::NVRenderBackendTextureObject NVRenderBackendGLBase::CreateTexture()
+{
+ GLuint texID = 0;
+
+ GL_CALL_FUNCTION(glGenTextures(1, &texID));
+ return (NVRenderBackend::NVRenderBackendTextureObject)texID;
+}
+
+void NVRenderBackendGLBase::BindTexture(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 unit)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0 + unit));
+ GL_CALL_FUNCTION(glBindTexture(m_Conversion.fromTextureTargetToGL(target), texID));
+}
+
+void NVRenderBackendGLBase::BindImageTexture(NVRenderBackendTextureObject, QT3DSU32, QT3DSI32, bool,
+ QT3DSI32, NVRenderImageAccessType::Enum,
+ NVRenderTextureFormats::Enum)
+{
+ // needs GL 4 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::ReleaseTexture(NVRenderBackendTextureObject to)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GL_CALL_FUNCTION(glDeleteTextures(1, &texID));
+}
+
+void NVRenderBackendGLBase::SetTextureData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format, const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_FUNCTION(glBindTexture(glTarget, texID));
+ bool conversionRequired = format != internalFormat;
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
+ internalFormat, swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat))
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+
+ if (conversionRequired) {
+ GLenum dummy;
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, dummy);
+ } else if (NVRenderTextureFormats::isCompressedTextureFormat(internalFormat)) {
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ glInternalFormat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
+ } else if (NVRenderTextureFormats::isDepthTextureFormat(format))
+ m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+
+ GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width, (GLsizei)height,
+ border, glformat, gltype, hostPtr));
+
+ GL_CALL_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+// This will look very SetTextureData2D, but the target for glBindTexture will be different from
+// the target for
+// glTexImage2D.
+void NVRenderBackendGLBase::SetTextureDataCubeFace(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format, const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GLenum glTexTarget =
+ m_Conversion.fromTextureTargetToGL(NVRenderTextureTargetType::TextureCube);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_FUNCTION(glBindTexture(glTexTarget, texID));
+ bool conversionRequired = format != internalFormat;
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
+ internalFormat, swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat))
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
+ glformat, gltype, glInternalFormat);
+
+
+ if (conversionRequired) {
+ GLenum dummy;
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, dummy);
+ } else if (NVRenderTextureFormats::isCompressedTextureFormat(internalFormat)) {
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ glInternalFormat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
+ } else if (NVRenderTextureFormats::isDepthTextureFormat(format))
+ m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+
+ // for es2 internal format must be same as format
+ if (GetRenderContextType() == NVRenderContextValues::GLES2)
+ glInternalFormat = glformat;
+
+ GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width, (GLsizei)height,
+ border, glformat, gltype, hostPtr));
+
+ GL_CALL_FUNCTION(glBindTexture(glTexTarget, 0));
+}
+
+void NVRenderBackendGLBase::CreateTextureStorage2D(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, QT3DSU32,
+ NVRenderTextureFormats::Enum, size_t, size_t)
+{
+ // you need GL 4.2 or GLES 3.1
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::SetTextureSubData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ QT3DSU32 level, QT3DSI32 xOffset, QT3DSI32 yOffset,
+ size_t width, size_t height,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_FUNCTION(glBindTexture(glTarget, texID));
+
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ format = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(), format,
+ swizzleMode);
+
+ GLenum glformat = 0, glInternalFormat = 0, gltype = 0;
+ m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
+ gltype, glInternalFormat);
+ GL_CALL_FUNCTION(glTexSubImage2D(glTarget, level, xOffset, yOffset, (GLsizei)width,
+ (GLsizei)height, glformat, gltype, hostPtr));
+
+ GL_CALL_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+void NVRenderBackendGLBase::SetCompressedTextureData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ size_t imageSize, const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_FUNCTION(glBindTexture(glTarget, texID));
+
+ GLenum glformat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
+ GL_CALL_FUNCTION(glCompressedTexImage2D(glTarget, level, glformat, (GLsizei)width,
+ (GLsizei)height, border, (GLsizei)imageSize, hostPtr));
+
+ GL_CALL_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+void NVRenderBackendGLBase::SetCompressedTextureDataCubeFace(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ size_t imageSize, const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GLenum glTexTarget =
+ m_Conversion.fromTextureTargetToGL(NVRenderTextureTargetType::TextureCube);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_FUNCTION(glBindTexture(glTexTarget, texID));
+
+ GLenum glformat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
+ GL_CALL_FUNCTION(glCompressedTexImage2D(glTarget, level, glformat, (GLsizei)width,
+ (GLsizei)height, border, (GLsizei)imageSize, hostPtr));
+
+ GL_CALL_FUNCTION(glBindTexture(glTexTarget, 0));
+}
+
+void NVRenderBackendGLBase::SetCompressedTextureSubData2D(
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ QT3DSI32 xOffset, QT3DSI32 yOffset, size_t width, size_t height,
+ NVRenderTextureFormats::Enum format, size_t imageSize, const void *hostPtr)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_FUNCTION(glBindTexture(glTarget, texID));
+
+ GLenum glformat = m_Conversion.fromCompressedTextureFormatToGL(format);
+ GL_CALL_FUNCTION(glCompressedTexSubImage2D(glTarget, level, xOffset, yOffset, (GLsizei)width,
+ (GLsizei)height, glformat, (GLsizei)imageSize,
+ hostPtr));
+
+ GL_CALL_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+void NVRenderBackendGLBase::SetTextureData3D(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, QT3DSU32,
+ NVRenderTextureFormats::Enum, size_t, size_t,
+ size_t, QT3DSI32, NVRenderTextureFormats::Enum,
+ const void *)
+{
+ // needs GL3 or GLES3
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::GenerateMipMaps(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderHint::Enum genType)
+{
+ GLuint texID = HandleToID_cast(GLuint, size_t, to);
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+ GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
+ GL_CALL_FUNCTION(glBindTexture(glTarget, texID));
+
+ GLenum glValue = GLConversion::fromHintToGL(genType);
+ GL_CALL_FUNCTION(glHint(GL_GENERATE_MIPMAP_HINT, glValue));
+ GL_CALL_FUNCTION(glGenerateMipmap(glTarget));
+
+ GL_CALL_FUNCTION(glBindTexture(glTarget, 0));
+}
+
+NVRenderTextureSwizzleMode::Enum
+NVRenderBackendGLBase::GetTextureSwizzleMode(const NVRenderTextureFormats::Enum inFormat) const
+{
+ NVRenderTextureSwizzleMode::Enum swizzleMode = NVRenderTextureSwizzleMode::NoSwizzle;
+ m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(), inFormat, swizzleMode);
+
+ return swizzleMode;
+}
+
+NVRenderBackend::NVRenderBackendSamplerObject NVRenderBackendGLBase::CreateSampler(
+ NVRenderTextureMinifyingOp::Enum minFilter, NVRenderTextureMagnifyingOp::Enum magFilter,
+ NVRenderTextureCoordOp::Enum wrapS, NVRenderTextureCoordOp::Enum wrapT,
+ NVRenderTextureCoordOp::Enum wrapR, QT3DSI32 minLod, QT3DSI32 maxLod, QT3DSF32 lodBias,
+ NVRenderTextureCompareMode::Enum compareMode, NVRenderTextureCompareOp::Enum compareFunc,
+ QT3DSF32 anisotropy, QT3DSF32 *borderColor)
+{
+ // Satisfy the compiler
+ // We don"t setup the state here for GL
+ // but we need to pass on the variables here
+ // to satisfy the interface
+ NVRENDER_BACKEND_UNUSED(minFilter);
+ NVRENDER_BACKEND_UNUSED(magFilter);
+ NVRENDER_BACKEND_UNUSED(wrapS);
+ NVRENDER_BACKEND_UNUSED(wrapT);
+ NVRENDER_BACKEND_UNUSED(wrapR);
+ NVRENDER_BACKEND_UNUSED(minLod);
+ NVRENDER_BACKEND_UNUSED(maxLod);
+ NVRENDER_BACKEND_UNUSED(lodBias);
+ NVRENDER_BACKEND_UNUSED(compareMode);
+ NVRENDER_BACKEND_UNUSED(compareFunc);
+ NVRENDER_BACKEND_UNUSED(anisotropy);
+ NVRENDER_BACKEND_UNUSED(borderColor);
+
+ // return a dummy handle
+ return (NVRenderBackend::NVRenderBackendSamplerObject)0x0001;
+}
+
+void NVRenderBackendGLBase::UpdateSampler(
+ NVRenderBackendSamplerObject /* so */, NVRenderTextureTargetType::Enum target,
+ NVRenderTextureMinifyingOp::Enum minFilter, NVRenderTextureMagnifyingOp::Enum magFilter,
+ NVRenderTextureCoordOp::Enum wrapS, NVRenderTextureCoordOp::Enum wrapT,
+ NVRenderTextureCoordOp::Enum wrapR, QT3DSF32 minLod, QT3DSF32 maxLod, QT3DSF32 lodBias,
+ NVRenderTextureCompareMode::Enum compareMode, NVRenderTextureCompareOp::Enum compareFunc,
+ QT3DSF32 anisotropy, QT3DSF32 *borderColor)
+{
+ // Satisfy the compiler
+ // These are not available in GLES 2 and we don't use them right now
+ NVRENDER_BACKEND_UNUSED(wrapR);
+ NVRENDER_BACKEND_UNUSED(lodBias);
+ NVRENDER_BACKEND_UNUSED(minLod);
+ NVRENDER_BACKEND_UNUSED(maxLod);
+ NVRENDER_BACKEND_UNUSED(compareMode);
+ NVRENDER_BACKEND_UNUSED(compareFunc);
+ NVRENDER_BACKEND_UNUSED(borderColor);
+
+ GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
+
+ GL_CALL_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MIN_FILTER,
+ m_Conversion.fromTextureMinifyingOpToGL(minFilter)));
+ GL_CALL_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_MAG_FILTER,
+ m_Conversion.fromTextureMagnifyingOpToGL(magFilter)));
+ GL_CALL_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_S,
+ m_Conversion.fromTextureCoordOpToGL(wrapS)));
+ GL_CALL_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_T,
+ m_Conversion.fromTextureCoordOpToGL(wrapT)));
+ if (m_backendSupport.caps.bits.bAnistropySupported) {
+ GL_CALL_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ qMin(m_maxAnisotropy, anisotropy)));
+ }
+}
+
+void NVRenderBackendGLBase::UpdateTextureObject(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ QT3DSI32 baseLevel, QT3DSI32 maxLevel)
+{
+ NVRENDER_BACKEND_UNUSED(to);
+ NVRENDER_BACKEND_UNUSED(target);
+ NVRENDER_BACKEND_UNUSED(baseLevel);
+ NVRENDER_BACKEND_UNUSED(maxLevel);
+}
+
+void NVRenderBackendGLBase::UpdateTextureSwizzle(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderTextureSwizzleMode::Enum swizzleMode)
+{
+ NVRENDER_BACKEND_UNUSED(to);
+ NVRENDER_BACKEND_UNUSED(target);
+
+ // Nothing to do here still might be called
+ QT3DS_ASSERT(swizzleMode == NVRenderTextureSwizzleMode::NoSwizzle);
+
+ NVRENDER_BACKEND_UNUSED(swizzleMode);
+}
+
+void NVRenderBackendGLBase::ReleaseSampler(NVRenderBackendSamplerObject so)
+{
+ GLuint samplerID = HandleToID_cast(GLuint, size_t, so);
+ if (!samplerID)
+ return;
+ // otherwise nothing to do
+}
+
+NVRenderBackend::NVRenderBackendAttribLayoutObject
+NVRenderBackendGLBase::CreateAttribLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs)
+{
+ QT3DSU32 attribLayoutSize = sizeof(NVRenderBackendAttributeLayoutGL);
+ QT3DSU32 entrySize = sizeof(NVRenderBackendLayoutEntryGL) * attribs.size();
+ QT3DSU8 *newMem = (QT3DSU8 *)QT3DS_ALLOC(m_Foundation.getAllocator(),
+ attribLayoutSize + entrySize,
+ "BackendAttributeLayoutGL");
+ NVDataRef<NVRenderBackendLayoutEntryGL> entryRef =
+ PtrAtOffset<NVRenderBackendLayoutEntryGL>(newMem, attribLayoutSize, entrySize);
+ QT3DSU32 maxInputSlot = 0;
+
+ // copy data
+ QT3DS_FOREACH(idx, attribs.size())
+ {
+ entryRef[idx].m_AttribName = m_StringTable->RegisterStr(attribs.mData[idx].m_Name);
+ entryRef[idx].m_Normalize = 0;
+ entryRef[idx].m_AttribIndex = 0; // will be set later
+ entryRef[idx].m_Type = m_Conversion.fromComponentTypeAndNumCompsToAttribGL(
+ attribs.mData[idx].m_ComponentType, attribs.mData[idx].m_NumComponents);
+ entryRef[idx].m_NumComponents = attribs.mData[idx].m_NumComponents;
+ entryRef[idx].m_InputSlot = attribs.mData[idx].m_InputSlot;
+ entryRef[idx].m_Offset = attribs.mData[idx].m_FirstItemOffset;
+
+ if (maxInputSlot < entryRef[idx].m_InputSlot)
+ maxInputSlot = entryRef[idx].m_InputSlot;
+ }
+
+ NVRenderBackendAttributeLayoutGL *retval =
+ new (newMem) NVRenderBackendAttributeLayoutGL(entryRef, maxInputSlot);
+
+ return (NVRenderBackend::NVRenderBackendAttribLayoutObject)retval;
+}
+
+void NVRenderBackendGLBase::ReleaseAttribLayout(NVRenderBackendAttribLayoutObject ao)
+{
+ NVRenderBackendAttributeLayoutGL *attribLayout = (NVRenderBackendAttributeLayoutGL *)ao;
+
+ NVDelete(m_Foundation.getAllocator(), attribLayout);
+};
+
+NVRenderBackend::NVRenderBackendInputAssemblerObject
+NVRenderBackendGLBase::CreateInputAssembler(NVRenderBackendAttribLayoutObject attribLayout,
+ NVConstDataRef<NVRenderBackendBufferObject> buffers,
+ const NVRenderBackendBufferObject indexBuffer,
+ NVConstDataRef<QT3DSU32> strides,
+ NVConstDataRef<QT3DSU32> offsets,
+ QT3DSU32 patchVertexCount)
+{
+ NVRenderBackendAttributeLayoutGL *attribLayoutGL =
+ (NVRenderBackendAttributeLayoutGL *)attribLayout;
+
+ NVRenderBackendInputAssemblerGL *retval = QT3DS_NEW(m_Foundation.getAllocator(),
+ NVRenderBackendInputAssemblerGL)(
+ m_Foundation, attribLayoutGL, buffers, indexBuffer, strides, offsets, patchVertexCount);
+
+ return (NVRenderBackend::NVRenderBackendInputAssemblerObject)retval;
+}
+
+void NVRenderBackendGLBase::ReleaseInputAssembler(NVRenderBackendInputAssemblerObject iao)
+{
+ NVRenderBackendInputAssemblerGL *inputAssembler = (NVRenderBackendInputAssemblerGL *)iao;
+ NVDelete(m_Foundation.getAllocator(), inputAssembler);
+}
+
+bool NVRenderBackendGLBase::compileSource(GLuint shaderID, NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+{
+ GLint shaderSourceSize = static_cast<GLint>(source.size());
+ const char *shaderSourceData = (const char *)source.begin();
+ GLint shaderStatus = GL_TRUE;
+
+ if (!binary) {
+
+ GL_CALL_FUNCTION(glShaderSource(shaderID, 1, &shaderSourceData, &shaderSourceSize));
+ GL_CALL_FUNCTION(glCompileShader(shaderID));
+
+ GLint logLen;
+ GL_CALL_FUNCTION(glGetShaderiv(shaderID, GL_COMPILE_STATUS, &shaderStatus));
+ GL_CALL_FUNCTION(glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &logLen));
+
+ // Check if some log exists. We also write warnings here
+ // Should at least contain more than the null termination
+ if (logLen > 2) {
+ errorMessage.resize(logLen + 1);
+
+ GLint lenWithoutNull;
+ GL_CALL_FUNCTION(glGetShaderInfoLog(shaderID, logLen, &lenWithoutNull,
+ (char *)errorMessage.c_str()));
+ }
+ } else {
+ GL_CALL_FUNCTION(glShaderBinary(1, &shaderID, GL_NVIDIA_PLATFORM_BINARY_NV, shaderSourceData,
+ shaderSourceSize));
+ GLenum binaryError = m_glFunctions->glGetError();
+ if (binaryError != GL_NO_ERROR) {
+ shaderStatus = GL_FALSE;
+ qCCritical(GL_ERROR, GLConversion::processGLError(binaryError));
+ }
+ }
+
+ return (shaderStatus == GL_TRUE);
+}
+
+NVRenderBackend::NVRenderBackendVertexShaderObject
+NVRenderBackendGLBase::CreateVertexShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+{
+ GLuint shaderID = GL_CALL_FUNCTION(glCreateShader(GL_VERTEX_SHADER));
+
+ if (shaderID && !compileSource(shaderID, source, errorMessage, binary)) {
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+ shaderID = 0;
+ }
+
+ return (NVRenderBackend::NVRenderBackendVertexShaderObject)shaderID;
+}
+
+NVRenderBackend::NVRenderBackendFragmentShaderObject
+NVRenderBackendGLBase::CreateFragmentShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+{
+ GLuint shaderID = GL_CALL_FUNCTION(glCreateShader(GL_FRAGMENT_SHADER));
+
+ if (shaderID && !compileSource(shaderID, source, errorMessage, binary)) {
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+ shaderID = 0;
+ }
+
+ return (NVRenderBackend::NVRenderBackendFragmentShaderObject)shaderID;
+}
+
+NVRenderBackend::NVRenderBackendTessControlShaderObject
+NVRenderBackendGLBase::CreateTessControlShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+{
+ // needs GL 4 or GLES EXT_tessellation_shader support
+ NVRENDER_BACKEND_UNUSED(source);
+ NVRENDER_BACKEND_UNUSED(errorMessage);
+ NVRENDER_BACKEND_UNUSED(binary);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return (NVRenderBackend::NVRenderBackendTessControlShaderObject)0;
+}
+
+NVRenderBackend::NVRenderBackendTessEvaluationShaderObject
+NVRenderBackendGLBase::CreateTessEvaluationShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+{
+ // needs GL 4 or GLES EXT_tessellation_shader support
+ NVRENDER_BACKEND_UNUSED(source);
+ NVRENDER_BACKEND_UNUSED(errorMessage);
+ NVRENDER_BACKEND_UNUSED(binary);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return (NVRenderBackend::NVRenderBackendTessEvaluationShaderObject)0;
+}
+
+NVRenderBackend::NVRenderBackendGeometryShaderObject
+NVRenderBackendGLBase::CreateGeometryShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+{
+ // needs GL 4 or GLES EXT_geometry_shader support
+ NVRENDER_BACKEND_UNUSED(source);
+ NVRENDER_BACKEND_UNUSED(errorMessage);
+ NVRENDER_BACKEND_UNUSED(binary);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return (NVRenderBackend::NVRenderBackendGeometryShaderObject)0;
+}
+
+NVRenderBackend::NVRenderBackendComputeShaderObject
+NVRenderBackendGLBase::CreateComputeShader(NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary)
+{
+ // needs GL 4.3 or GLES3.1 support
+ NVRENDER_BACKEND_UNUSED(source);
+ NVRENDER_BACKEND_UNUSED(errorMessage);
+ NVRENDER_BACKEND_UNUSED(binary);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return (NVRenderBackend::NVRenderBackendComputeShaderObject)0;
+}
+
+void NVRenderBackendGLBase::ReleaseVertexShader(NVRenderBackendVertexShaderObject vso)
+{
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, vso);
+
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+}
+
+void NVRenderBackendGLBase::ReleaseFragmentShader(NVRenderBackendFragmentShaderObject fso)
+{
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, fso);
+
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+}
+
+void
+NVRenderBackendGLBase::ReleaseTessControlShader(NVRenderBackendTessControlShaderObject tcso)
+{
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, tcso);
+
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+}
+
+void NVRenderBackendGLBase::ReleaseTessEvaluationShader(
+ NVRenderBackendTessEvaluationShaderObject teso)
+{
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, teso);
+
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+}
+
+void NVRenderBackendGLBase::ReleaseGeometryShader(NVRenderBackendGeometryShaderObject gso)
+{
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, gso);
+
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+}
+
+void NVRenderBackendGLBase::ReleaseComputeShader(NVRenderBackendComputeShaderObject cso)
+{
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, cso);
+
+ GL_CALL_FUNCTION(glDeleteShader(shaderID));
+}
+
+void NVRenderBackendGLBase::AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendVertexShaderObject vso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, vso);
+
+ GL_CALL_FUNCTION(glAttachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendFragmentShaderObject fso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, fso);
+
+ GL_CALL_FUNCTION(glAttachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessControlShaderObject tcso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, tcso);
+
+ GL_CALL_FUNCTION(glAttachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessEvaluationShaderObject teso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, teso);
+
+ GL_CALL_FUNCTION(glAttachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendGeometryShaderObject gso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, gso);
+
+ GL_CALL_FUNCTION(glAttachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendComputeShaderObject cso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, cso);
+
+ GL_CALL_FUNCTION(glAttachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendVertexShaderObject vso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, vso);
+
+ GL_CALL_FUNCTION(glDetachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendFragmentShaderObject fso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, fso);
+
+ GL_CALL_FUNCTION(glDetachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessControlShaderObject tcso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, tcso);
+
+ GL_CALL_FUNCTION(glDetachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessEvaluationShaderObject teso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, teso);
+
+ GL_CALL_FUNCTION(glDetachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendGeometryShaderObject gso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, gso);
+
+ GL_CALL_FUNCTION(glDetachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+void NVRenderBackendGLBase::DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendComputeShaderObject cso)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint shaderID = HandleToID_cast(GLuint, size_t, cso);
+
+ GL_CALL_FUNCTION(glDetachShader(static_cast<GLuint>(pProgram->m_ProgramID), shaderID));
+}
+
+NVRenderBackend::NVRenderBackendShaderProgramObject
+NVRenderBackendGLBase::CreateShaderProgram(bool isSeparable)
+{
+ NVRenderBackendShaderProgramGL *theProgram = nullptr;
+ GLuint programID = GL_CALL_FUNCTION(glCreateProgram());
+
+ if (programID) {
+ theProgram =
+ QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendShaderProgramGL)(programID);
+
+ if (!theProgram) {
+ GL_CALL_FUNCTION(glDeleteProgram(programID));
+ } else if (isSeparable && m_backendSupport.caps.bits.bProgramPipelineSupported) {
+ GL_CALL_EXTRA_FUNCTION(glProgramParameteri(programID, GL_PROGRAM_SEPARABLE, GL_TRUE));
+ }
+ }
+
+ return (NVRenderBackend::NVRenderBackendShaderProgramObject)theProgram;
+}
+
+void NVRenderBackendGLBase::ReleaseShaderProgram(NVRenderBackendShaderProgramObject po)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GL_CALL_FUNCTION(glDeleteProgram(programID));
+
+ if (pProgram->m_shaderInput) {
+ NVDelete(m_Foundation.getAllocator(), pProgram->m_shaderInput);
+ pProgram->m_shaderInput = nullptr;
+ }
+
+ NVDelete(m_Foundation.getAllocator(), pProgram);
+}
+
+bool NVRenderBackendGLBase::LinkProgram(NVRenderBackendShaderProgramObject po,
+ eastl::string &errorMessage)
+{
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GL_CALL_FUNCTION(glLinkProgram(programID));
+
+ GLint linkStatus, logLen;
+ GL_CALL_FUNCTION(glGetProgramiv(programID, GL_LINK_STATUS, &linkStatus));
+ GL_CALL_FUNCTION(glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &logLen));
+
+ // if successfully linked get the attribute information
+ if (linkStatus) {
+ // release old stuff
+ if (pProgram->m_shaderInput) {
+ NVDelete(m_Foundation.getAllocator(), pProgram->m_shaderInput);
+ pProgram->m_shaderInput = nullptr;
+ }
+
+ GLint numAttribs;
+ GL_CALL_FUNCTION(glGetProgramiv(programID, GL_ACTIVE_ATTRIBUTES, &numAttribs));
+
+ if (numAttribs) {
+ NVRenderBackendShaderInputEntryGL *tempShaderInputEntry =
+ (NVRenderBackendShaderInputEntryGL *)QT3DS_ALLOC(
+ m_Foundation.getAllocator(),
+ sizeof(NVRenderBackendShaderInputEntryGL) * m_MaxAttribCount,
+ "BackendShaderInputEntryGL");
+
+ GLint maxLength;
+ GL_CALL_FUNCTION(glGetProgramiv(programID, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxLength));
+ QT3DSI8 *nameBuf =
+ (QT3DSI8 *)QT3DS_ALLOC(m_Foundation.getAllocator(), maxLength, "LinkProgram");
+
+ // fill in data
+ QT3DSU32 count = 0;
+ QT3DS_FOREACH(idx, numAttribs)
+ {
+ GLint size = 0;
+ GLenum glType;
+ NVRenderComponentTypes::Enum compType = NVRenderComponentTypes::Unknown;
+ QT3DSU32 numComps = 0;
+
+ GL_CALL_FUNCTION(glGetActiveAttrib(programID, idx, maxLength, nullptr, &size,
+ &glType, (char *)nameBuf));
+ // Skip anything named with gl_
+ if (memcmp(nameBuf, "gl_", 3) == 0)
+ continue;
+
+ m_Conversion.fromAttribGLToComponentTypeAndNumComps(glType, compType, numComps);
+
+ tempShaderInputEntry[count].m_AttribName =
+ m_StringTable->RegisterStr((char *)nameBuf);
+ tempShaderInputEntry[count].m_AttribLocation =
+ GL_CALL_FUNCTION(glGetAttribLocation(programID, (char *)nameBuf));
+ tempShaderInputEntry[count].m_Type = glType;
+ tempShaderInputEntry[count].m_NumComponents = numComps;
+
+ ++count;
+ }
+
+ // Now allocate space for the actuall entries
+ QT3DSU32 shaderInputSize = sizeof(NVRenderBackendShaderInputGL);
+ QT3DSU32 entrySize = sizeof(NVRenderBackendShaderInputEntryGL) * count;
+ QT3DSU8 *newMem =
+ (QT3DSU8 *)QT3DS_ALLOC(m_Foundation.getAllocator(), shaderInputSize + entrySize,
+ "BackendShaderInputEntryGL");
+ NVDataRef<NVRenderBackendShaderInputEntryGL> entryRef =
+ PtrAtOffset<NVRenderBackendShaderInputEntryGL>(newMem, shaderInputSize,
+ entrySize);
+ // fill data
+ QT3DS_FOREACH(idx, count)
+ {
+ entryRef[idx].m_AttribName = tempShaderInputEntry[idx].m_AttribName;
+ entryRef[idx].m_AttribLocation = tempShaderInputEntry[idx].m_AttribLocation;
+ entryRef[idx].m_Type = tempShaderInputEntry[idx].m_Type;
+ entryRef[idx].m_NumComponents = tempShaderInputEntry[idx].m_NumComponents;
+ }
+
+ // placement new
+ NVRenderBackendShaderInputGL *shaderInput =
+ new (newMem) NVRenderBackendShaderInputGL(entryRef);
+ // set the pointer
+ pProgram->m_shaderInput = shaderInput;
+
+ QT3DS_FREE(m_Foundation.getAllocator(), nameBuf);
+ QT3DS_FREE(m_Foundation.getAllocator(), tempShaderInputEntry);
+ }
+ }
+
+ // Check if some log exists. We also write warnings here
+ // Should at least contain more than the null termination
+ if (logLen > 2) {
+ errorMessage.resize(logLen + 1);
+
+ GLint lenWithoutNull;
+ GL_CALL_FUNCTION(glGetProgramInfoLog(programID, logLen, &lenWithoutNull,
+ (char *)errorMessage.c_str()));
+ }
+
+ return (linkStatus == GL_TRUE);
+}
+
+void NVRenderBackendGLBase::SetActiveProgram(NVRenderBackendShaderProgramObject po)
+{
+ GLuint programID = 0;
+
+ if (po) {
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ programID = static_cast<GLuint>(pProgram->m_ProgramID);
+ }
+
+ GL_CALL_FUNCTION(glUseProgram(programID));
+}
+
+NVRenderBackend::NVRenderBackendProgramPipeline NVRenderBackendGLBase::CreateProgramPipeline()
+{
+ // needs GL 4 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+ return NVRenderBackend::NVRenderBackendProgramPipeline(0);
+}
+
+void NVRenderBackendGLBase::ReleaseProgramPipeline(NVRenderBackendProgramPipeline)
+{
+ // needs GL 4 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::SetActiveProgramPipeline(NVRenderBackendProgramPipeline)
+{
+ // needs GL 4 context
+ //TODO: should be fixed?
+ // QT3DS_ASSERT(false);
+}
+
+void NVRenderBackendGLBase::SetProgramStages(NVRenderBackendProgramPipeline,
+ NVRenderShaderTypeFlags,
+ NVRenderBackendShaderProgramObject)
+{
+ // needs GL 4 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::DispatchCompute(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSU32,
+ QT3DSU32)
+{
+ // needs GL 4 context
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+QT3DSI32 NVRenderBackendGLBase::GetConstantCount(NVRenderBackendShaderProgramObject po)
+{
+ QT3DS_ASSERT(po);
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GLint numUniforms;
+ GL_CALL_FUNCTION(glGetProgramiv(programID, GL_ACTIVE_UNIFORMS, &numUniforms));
+
+ return numUniforms;
+}
+
+QT3DSI32 NVRenderBackendGLBase::GetConstantBufferCount(NVRenderBackendShaderProgramObject po)
+{
+ // needs GL3 and above
+ NVRENDER_BACKEND_UNUSED(po);
+
+ return 0;
+}
+
+QT3DSI32
+NVRenderBackendGLBase::GetConstantInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 bufSize, QT3DSI32 *numElem,
+ NVRenderShaderDataTypes::Enum *type, QT3DSI32 *binding,
+ char *nameBuf)
+{
+ QT3DS_ASSERT(po);
+ NVRenderBackendShaderProgramGL *pProgram = (NVRenderBackendShaderProgramGL *)po;
+ GLuint programID = static_cast<GLuint>(pProgram->m_ProgramID);
+
+ GLenum glType;
+ GL_CALL_FUNCTION(glGetActiveUniform(programID, id, bufSize, nullptr, numElem, &glType, nameBuf));
+ *type = m_Conversion.fromShaderGLToPropertyDataTypes(glType);
+
+ QT3DSI32 uniformLoc = GL_CALL_FUNCTION(glGetUniformLocation(programID, nameBuf));
+
+ // get unit binding point
+ *binding = -1;
+ if (uniformLoc != -1 && (glType == GL_IMAGE_2D || glType == GL_UNSIGNED_INT_IMAGE_2D
+ || glType == GL_UNSIGNED_INT_ATOMIC_COUNTER)) {
+ GL_CALL_FUNCTION(glGetUniformiv(programID, uniformLoc, binding));
+ }
+
+ return uniformLoc;
+}
+
+QT3DSI32
+NVRenderBackendGLBase::GetConstantBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize,
+ QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length,
+ char *nameBuf)
+{
+ // needs GL3 and above
+ NVRENDER_BACKEND_UNUSED(po);
+ NVRENDER_BACKEND_UNUSED(id);
+ NVRENDER_BACKEND_UNUSED(nameBufSize);
+ NVRENDER_BACKEND_UNUSED(paramCount);
+ NVRENDER_BACKEND_UNUSED(bufferSize);
+ NVRENDER_BACKEND_UNUSED(length);
+ NVRENDER_BACKEND_UNUSED(nameBuf);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return -1;
+}
+
+void NVRenderBackendGLBase::GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSI32 *indices)
+{
+ // needs GL3 and above
+ NVRENDER_BACKEND_UNUSED(po);
+ NVRENDER_BACKEND_UNUSED(id);
+ NVRENDER_BACKEND_UNUSED(indices);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::GetConstantBufferParamInfoByIndices(
+ NVRenderBackendShaderProgramObject po, QT3DSU32 count, QT3DSU32 *indices, QT3DSI32 *type,
+ QT3DSI32 *size, QT3DSI32 *offset)
+{
+ // needs GL3 and above
+ NVRENDER_BACKEND_UNUSED(po);
+ NVRENDER_BACKEND_UNUSED(count);
+ NVRENDER_BACKEND_UNUSED(indices);
+ NVRENDER_BACKEND_UNUSED(type);
+ NVRENDER_BACKEND_UNUSED(size);
+ NVRENDER_BACKEND_UNUSED(offset);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::ProgramSetConstantBlock(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 blockIndex, QT3DSU32 binding)
+{
+ // needs GL3 and above
+ NVRENDER_BACKEND_UNUSED(po);
+ NVRENDER_BACKEND_UNUSED(blockIndex);
+ NVRENDER_BACKEND_UNUSED(binding);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::ProgramSetConstantBuffer(QT3DSU32 index,
+ NVRenderBackendBufferObject bo)
+{
+ // needs GL3 and above
+ NVRENDER_BACKEND_UNUSED(index);
+ NVRENDER_BACKEND_UNUSED(bo);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+QT3DSI32 NVRenderBackendGLBase::GetStorageBufferCount(NVRenderBackendShaderProgramObject po)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(po);
+
+ return 0;
+}
+
+QT3DSI32
+NVRenderBackendGLBase::GetStorageBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length, char *nameBuf)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(po);
+ NVRENDER_BACKEND_UNUSED(id);
+ NVRENDER_BACKEND_UNUSED(nameBufSize);
+ NVRENDER_BACKEND_UNUSED(paramCount);
+ NVRENDER_BACKEND_UNUSED(bufferSize);
+ NVRENDER_BACKEND_UNUSED(length);
+ NVRENDER_BACKEND_UNUSED(nameBuf);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return -1;
+}
+
+void NVRenderBackendGLBase::ProgramSetStorageBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(index);
+ NVRENDER_BACKEND_UNUSED(bo);
+}
+
+QT3DSI32 NVRenderBackendGLBase::GetAtomicCounterBufferCount(NVRenderBackendShaderProgramObject po)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(po);
+
+ return 0;
+}
+
+QT3DSI32
+NVRenderBackendGLBase::GetAtomicCounterBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize,
+ QT3DSI32 *paramCount, QT3DSI32 *bufferSize,
+ QT3DSI32 *length, char *nameBuf)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(po);
+ NVRENDER_BACKEND_UNUSED(id);
+ NVRENDER_BACKEND_UNUSED(nameBufSize);
+ NVRENDER_BACKEND_UNUSED(paramCount);
+ NVRENDER_BACKEND_UNUSED(bufferSize);
+ NVRENDER_BACKEND_UNUSED(length);
+ NVRENDER_BACKEND_UNUSED(nameBuf);
+
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return -1;
+}
+
+void NVRenderBackendGLBase::ProgramSetAtomicCounterBuffer(QT3DSU32 index,
+ NVRenderBackendBufferObject bo)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(index);
+ NVRENDER_BACKEND_UNUSED(bo);
+}
+
+void NVRenderBackendGLBase::SetConstantValue(NVRenderBackendShaderProgramObject, QT3DSU32 id,
+ NVRenderShaderDataTypes::Enum type, QT3DSI32 count,
+ const void *value, bool transpose)
+{
+ GLenum glType = m_Conversion.fromPropertyDataTypesToShaderGL(type);
+
+ switch (glType) {
+ case GL_FLOAT:
+ GL_CALL_FUNCTION(glUniform1fv(id, count, (GLfloat *)value));
+ break;
+ case GL_FLOAT_VEC2:
+ GL_CALL_FUNCTION(glUniform2fv(id, count, (GLfloat *)value));
+ break;
+ case GL_FLOAT_VEC3:
+ GL_CALL_FUNCTION(glUniform3fv(id, count, (GLfloat *)value));
+ break;
+ case GL_FLOAT_VEC4:
+ GL_CALL_FUNCTION(glUniform4fv(id, count, (GLfloat *)value));
+ break;
+ case GL_INT:
+ GL_CALL_FUNCTION(glUniform1iv(id, count, (GLint *)value));
+ break;
+ case GL_BOOL:
+ {
+ GLint boolValue = *(GLboolean *)value;
+ GL_CALL_FUNCTION(glUniform1iv(id, count, &boolValue));
+ }
+ break;
+ case GL_INT_VEC2:
+ case GL_BOOL_VEC2:
+ GL_CALL_FUNCTION(glUniform2iv(id, count, (GLint *)value));
+ break;
+ case GL_INT_VEC3:
+ case GL_BOOL_VEC3:
+ GL_CALL_FUNCTION(glUniform3iv(id, count, (GLint *)value));
+ break;
+ case GL_INT_VEC4:
+ case GL_BOOL_VEC4:
+ GL_CALL_FUNCTION(glUniform4iv(id, count, (GLint *)value));
+ break;
+ case GL_FLOAT_MAT3:
+ GL_CALL_FUNCTION(glUniformMatrix3fv(id, count, transpose, (GLfloat *)value));
+ break;
+ case GL_FLOAT_MAT4:
+ GL_CALL_FUNCTION(glUniformMatrix4fv(id, count, transpose, (GLfloat *)value));
+ break;
+ case GL_IMAGE_2D:
+ case GL_SAMPLER_2D:
+ case GL_SAMPLER_2D_ARRAY:
+ case GL_SAMPLER_2D_SHADOW:
+ case GL_SAMPLER_CUBE: {
+ if (count > 1) {
+ GLint *sampler = (GLint *)value;
+ GL_CALL_FUNCTION(glUniform1iv(id, count, sampler));
+ } else {
+ GLint sampler = *(GLint *)value;
+ GL_CALL_FUNCTION(glUniform1i(id, sampler));
+ }
+ } break;
+ default:
+ qCCritical(INTERNAL_ERROR, "Unknown shader type format %d", type);
+ QT3DS_ASSERT(false);
+ break;
+ }
+}
+
+void NVRenderBackendGLBase::Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 start, QT3DSU32 count)
+{
+ GL_CALL_FUNCTION(glDrawArrays(m_Conversion.fromDrawModeToGL(
+ drawMode, m_backendSupport.caps.bits.bTessellationSupported),
+ start, count));
+}
+
+void NVRenderBackendGLBase::DrawIndirect(NVRenderDrawMode::Enum drawMode, const void *indirect)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(drawMode);
+ NVRENDER_BACKEND_UNUSED(indirect);
+}
+
+void NVRenderBackendGLBase::DrawIndexed(NVRenderDrawMode::Enum drawMode, QT3DSU32 count,
+ NVRenderComponentTypes::Enum type, const void *indices)
+{
+ GL_CALL_FUNCTION(glDrawElements(m_Conversion.fromDrawModeToGL(
+ drawMode, m_backendSupport.caps.bits.bTessellationSupported),
+ count, m_Conversion.fromIndexBufferComponentsTypesToGL(type),
+ indices));
+}
+
+void NVRenderBackendGLBase::DrawIndexedIndirect(NVRenderDrawMode::Enum drawMode,
+ NVRenderComponentTypes::Enum type,
+ const void *indirect)
+{
+ // needs GL4 and above
+ NVRENDER_BACKEND_UNUSED(drawMode);
+ NVRENDER_BACKEND_UNUSED(type);
+ NVRENDER_BACKEND_UNUSED(indirect);
+}
+
+void NVRenderBackendGLBase::ReadPixel(NVRenderBackendRenderTargetObject /* rto */, QT3DSI32 x,
+ QT3DSI32 y, QT3DSI32 width, QT3DSI32 height,
+ NVRenderReadPixelFormats::Enum inFormat, void *pixels)
+{
+ GLuint glFormat;
+ GLuint glType;
+ if (m_Conversion.fromReadPixelsToGlFormatAndType(inFormat, &glFormat, &glType)) {
+ GL_CALL_FUNCTION(glReadPixels(x, y, width, height, glFormat, glType, pixels));
+ }
+}
+
+NVRenderBackend::NVRenderBackendPathObject NVRenderBackendGLBase::CreatePathNVObject(size_t)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return NVRenderBackend::NVRenderBackendPathObject(0);
+}
+
+void NVRenderBackendGLBase::ReleasePathNVObject(NVRenderBackendPathObject, size_t)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::LoadPathGlyphs(NVRenderBackendPathObject,
+ NVRenderPathFontTarget::Enum, const void *,
+ NVRenderPathFontStyleFlags, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathMissingGlyphs::Enum,
+ NVRenderBackendPathObject, QT3DSF32)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::LoadPathGlyphRange(NVRenderBackendPathObject,
+ NVRenderPathFontTarget::Enum, const void *,
+ NVRenderPathFontStyleFlags, QT3DSU32, size_t,
+ NVRenderPathMissingGlyphs::Enum,
+ NVRenderBackendPathObject, QT3DSF32)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+NVRenderPathReturnValues::Enum NVRenderBackendGLBase::LoadPathGlyphsIndexed(
+ NVRenderBackendPathObject, NVRenderPathFontTarget::Enum, const void *,
+ NVRenderPathFontStyleFlags, QT3DSU32, size_t, NVRenderBackendPathObject, QT3DSF32)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+
+ return NVRenderPathReturnValues::FontUnavailable;
+}
+
+NVRenderBackend::NVRenderBackendPathObject NVRenderBackendGLBase::LoadPathGlyphsIndexedRange(
+ NVRenderPathFontTarget::Enum, const void *, NVRenderPathFontStyleFlags,
+ NVRenderBackend::NVRenderBackendPathObject, QT3DSF32, QT3DSU32 *)
+{
+ return NVRenderBackendPathObject(0);
+}
+
+void NVRenderBackendGLBase::GetPathMetrics(NVRenderBackendPathObject, size_t,
+ NVRenderPathGlyphFontMetricFlags,
+ NVRenderPathFormatType::Enum, const void *, size_t,
+ QT3DSF32 *)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::GetPathMetricsRange(NVRenderBackendPathObject, size_t,
+ NVRenderPathGlyphFontMetricFlags, size_t,
+ QT3DSF32 *)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::GetPathSpacing(NVRenderBackendPathObject, size_t,
+ NVRenderPathListMode::Enum,
+ NVRenderPathFormatType::Enum, const void *, QT3DSF32,
+ QT3DSF32, NVRenderPathTransformType::Enum, QT3DSF32 *)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::StencilFillPathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathFillMode::Enum, QT3DSU32,
+ NVRenderPathTransformType::Enum,
+ const QT3DSF32 *)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::StencilStrokePathInstancedN(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum,
+ const void *, QT3DSI32, QT3DSU32,
+ NVRenderPathTransformType::Enum,
+ const QT3DSF32 *)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::CoverFillPathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathCoverMode::Enum,
+ NVRenderPathTransformType::Enum,
+ const QT3DSF32 *)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+void NVRenderBackendGLBase::CoverStrokePathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathCoverMode::Enum,
+ NVRenderPathTransformType::Enum,
+ const QT3DSF32 *)
+{
+ // Needs GL 4 backend
+ qCCritical(INVALID_OPERATION) << QObject::tr("Unsupported method: ") << __FUNCTION__;
+}
+
+///< private calls
+const char *NVRenderBackendGLBase::getVersionString()
+{
+ const char *retval = (const char *)GL_CALL_FUNCTION(glGetString(GL_VERSION));
+ if (retval == nullptr)
+ return "";
+
+ return retval;
+}
+
+const char *NVRenderBackendGLBase::getVendorString()
+{
+ const char *retval = (const char *)GL_CALL_FUNCTION(glGetString(GL_VENDOR));
+ if (retval == nullptr)
+ return "";
+
+ return retval;
+}
+
+const char *NVRenderBackendGLBase::getRendererString()
+{
+ const char *retval = (const char *)GL_CALL_FUNCTION(glGetString(GL_RENDERER));
+ if (retval == nullptr)
+ return "";
+
+ return retval;
+}
+
+const char *NVRenderBackendGLBase::getExtensionString()
+{
+ const char *retval = (const char *)GL_CALL_FUNCTION(glGetString(GL_EXTENSIONS));
+ if (retval == nullptr)
+ return "";
+
+ return retval;
+}
+
+/**
+ * @brief This function inspects the various strings to setup
+ * HW capabilities of the device.
+ * We can do a lot of smart things here based on GL version
+ * renderer string and vendor.
+ *
+ * @return No return
+ */
+void NVRenderBackendGLBase::setAndInspectHardwareCaps()
+{
+ eastl::string apiVersion(getVersionString());
+ qCInfo(TRACE_INFO, "GL version: %s", apiVersion.c_str());
+
+ // we assume all GLES versions running on mobile with shared memory
+ // this means framebuffer blits are slow and should be optimized or avoided
+ if (apiVersion.find("OpenGL ES") == eastl::string::npos) {
+ // no ES device
+ m_backendSupport.caps.bits.bFastBlitsSupported = true;
+ }
+}
+
+#ifdef RENDER_BACKEND_LOG_GL_ERRORS
+void NVRenderBackendGLBase::checkGLError(const char *function, const char *file,
+ const unsigned int line) const
+{
+ GLenum error = m_glFunctions->glGetError();
+ if (error != GL_NO_ERROR) {
+ qCCritical(GL_ERROR) << GLConversion::processGLError(error) << " "
+ << function << " " << file << " " << line;
+ }
+}
+#else
+void NVRenderBackendGLBase::checkGLError() const
+{
+#if !defined(NDEBUG) || defined(_DEBUG)
+ GLenum error = m_glFunctions->glGetError();
+ if (error != GL_NO_ERROR)
+ qCCritical(GL_ERROR) << GLConversion::processGLError(error);
+#endif
+}
+#endif
+
+}
+}
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGLBase.h b/src/render/backends/gl/Qt3DSRenderBackendGLBase.h
new file mode 100644
index 0000000..28e4dbb
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendGLBase.h
@@ -0,0 +1,531 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_GL_BASE_H
+#define QT3DS_RENDER_BACKEND_GL_BASE_H
+
+/// @file Qt3DSRenderBackendGLBase.h
+/// NVRender OpenGL Core backend definition.
+
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/StringTable.h"
+#include "render/backends/Qt3DSRenderBackend.h"
+#include "render/backends/gl/Qt3DSOpenGLUtil.h"
+#include <EASTL/string.h>
+
+#include <QtGui/QSurfaceFormat>
+#include <QtGui/QOpenGLFunctions>
+#include <QtOpenGLExtensions/QtOpenGLExtensions>
+
+#define NVRENDER_BACKEND_UNUSED(arg) (void)arg;
+
+// Enable this to log opengl errors instead of an assert
+//#define RENDER_BACKEND_LOG_GL_ERRORS
+
+namespace qt3ds {
+namespace render {
+
+ ///< forward declaration
+ class NVRenderBackendRasterizerStateGL;
+ class NVRenderBackendDepthStencilStateGL;
+
+ using namespace foundation;
+
+ typedef eastl::basic_string<char8_t, ForwardingAllocator> TContextStr;
+
+ class NVRenderBackendGLBase : public NVRenderBackend
+ {
+ public:
+ /// constructor
+ NVRenderBackendGLBase(NVFoundationBase &fnd,
+ qt3ds::foundation::IStringTable &stringTable,
+ const QSurfaceFormat &format);
+ /// destructor
+ virtual ~NVRenderBackendGLBase();
+
+ public:
+ /// API Interface
+ NVRenderContextType GetRenderContextType() const override;
+ bool isESCompatible() const;
+
+ const char *GetShadingLanguageVersion() override;
+ /// get implementation depended values
+ QT3DSU32 GetMaxCombinedTextureUnits() override;
+ bool GetRenderBackendCap(NVRenderBackendCaps::Enum inCap) const override;
+ QT3DSU32 GetDepthBits() const override;
+ QT3DSU32 GetStencilBits() const override;
+ void GetRenderBackendValue(NVRenderBackendQuery::Enum inQuery, QT3DSI32 *params) const override;
+
+ /// state get/set functions
+ void SetRenderState(bool bEnable, const NVRenderState::Enum value) override;
+ bool GetRenderState(const NVRenderState::Enum value) override;
+ virtual NVRenderBackendDepthStencilStateObject
+ CreateDepthStencilState(bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack) override;
+ virtual void
+ ReleaseDepthStencilState(NVRenderBackendDepthStencilStateObject inDepthStencilState) override;
+ virtual NVRenderBackendRasterizerStateObject
+ CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale, NVRenderFaces::Enum cullFace) override;
+ void ReleaseRasterizerState(NVRenderBackendRasterizerStateObject rasterizerState) override;
+ virtual void
+ SetDepthStencilState(NVRenderBackendDepthStencilStateObject inDepthStencilState) override;
+ void SetRasterizerState(NVRenderBackendRasterizerStateObject rasterizerState) override;
+ NVRenderBoolOp::Enum GetDepthFunc() override;
+ void SetDepthFunc(const NVRenderBoolOp::Enum func) override;
+ bool GetDepthWrite() override;
+ void SetDepthWrite(bool bEnable) override;
+ void SetColorWrites(bool bRed, bool bGreen, bool bBlue, bool bAlpha) override;
+ void SetMultisample(bool bEnable) override;
+ void GetBlendFunc(NVRenderBlendFunctionArgument *pBlendFuncArg) override;
+ void SetBlendFunc(const NVRenderBlendFunctionArgument &blendFuncArg) override;
+ void SetBlendEquation(const NVRenderBlendEquationArgument &pBlendEquArg) override;
+ void SetBlendBarrier(void) override;
+ void GetScissorRect(NVRenderRect *pRect) override;
+ void SetScissorRect(const NVRenderRect &rect) override;
+ void GetViewportRect(NVRenderRect *pRect) override;
+ void SetViewportRect(const NVRenderRect &rect) override;
+
+ void SetClearColor(const QT3DSVec4 *pClearColor) override;
+ void Clear(NVRenderClearFlags flags) override;
+
+ /// resource handling
+ NVRenderBackendBufferObject CreateBuffer(size_t size,
+ NVRenderBufferBindFlags bindFlags,
+ NVRenderBufferUsageType::Enum usage,
+ const void *hostPtr = NULL) override;
+ void BindBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags) override;
+ void ReleaseBuffer(NVRenderBackendBufferObject bo) override;
+ void UpdateBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags,
+ size_t size, NVRenderBufferUsageType::Enum usage,
+ const void *data) override;
+ void UpdateBufferRange(NVRenderBackendBufferObject bo,
+ NVRenderBufferBindFlags bindFlags, size_t offset,
+ size_t size, const void *data) override;
+ void *MapBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags,
+ size_t offset, size_t length,
+ NVRenderBufferAccessFlags accessFlags) override;
+ bool UnmapBuffer(NVRenderBackendBufferObject bo, NVRenderBufferBindFlags bindFlags) override;
+ void SetMemoryBarrier(NVRenderBufferBarrierFlags barriers) override;
+
+ NVRenderBackendQueryObject CreateQuery() override;
+ void ReleaseQuery(NVRenderBackendQueryObject qo) override;
+ void BeginQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) override;
+ void EndQuery(NVRenderBackendQueryObject qo, NVRenderQueryType::Enum type) override;
+ void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU32 *params) override;
+ void GetQueryResult(NVRenderBackendQueryObject qo,
+ NVRenderQueryResultType::Enum resultType, QT3DSU64 *params) override;
+ void SetQueryTimer(NVRenderBackendQueryObject qo) override;
+
+ NVRenderBackendSyncObject CreateSync(NVRenderSyncType::Enum tpye,
+ NVRenderSyncFlags syncFlags) override;
+ void ReleaseSync(NVRenderBackendSyncObject so) override;
+ void WaitSync(NVRenderBackendSyncObject so, NVRenderCommandFlushFlags syncFlags,
+ QT3DSU64 timeout) override;
+
+ NVRenderBackendRenderTargetObject CreateRenderTarget() override;
+ void ReleaseRenderTarget(NVRenderBackendRenderTargetObject rto) override;
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendRenderbufferObject rbo) override;
+ void RenderTargetAttach(
+ NVRenderBackendRenderTargetObject rto, NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target = NVRenderTextureTargetType::Texture2D) override;
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject rto,
+ NVRenderFrameBufferAttachments::Enum attachment,
+ NVRenderBackendTextureObject to, QT3DSI32 level, QT3DSI32 layer) override;
+ void SetRenderTarget(NVRenderBackendRenderTargetObject rto) override;
+ bool RenderTargetIsValid(NVRenderBackendRenderTargetObject rto) override;
+
+ virtual NVRenderBackendRenderbufferObject
+ CreateRenderbuffer(NVRenderRenderBufferFormats::Enum storageFormat, size_t width,
+ size_t height) override;
+ void ReleaseRenderbuffer(NVRenderBackendRenderbufferObject rbo) override;
+ bool ResizeRenderbuffer(NVRenderBackendRenderbufferObject rbo,
+ NVRenderRenderBufferFormats::Enum storageFormat,
+ size_t width, size_t height) override;
+
+ NVRenderBackendTextureObject CreateTexture() override;
+ void BindTexture(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 unit) override;
+ void BindImageTexture(NVRenderBackendTextureObject to, QT3DSU32 unit, QT3DSI32 level,
+ bool layered, QT3DSI32 layer,
+ NVRenderImageAccessType::Enum access,
+ NVRenderTextureFormats::Enum format) override;
+ void ReleaseTexture(NVRenderBackendTextureObject to) override;
+ void SetTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width,
+ size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) override;
+ void SetTextureDataCubeFace(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) override;
+ void CreateTextureStorage2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 levels,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height) override;
+ void SetTextureSubData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ QT3DSI32 xOffset, QT3DSI32 yOffset, size_t width, size_t height,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) override;
+ void SetCompressedTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height, QT3DSI32 border,
+ size_t imageSize, const void *hostPtr = NULL) override;
+ void SetCompressedTextureDataCubeFace(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height, QT3DSI32 border,
+ size_t imageSize, const void *hostPtr = NULL) override;
+ void SetCompressedTextureSubData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ QT3DSU32 level, QT3DSI32 xOffset, QT3DSI32 yOffset,
+ size_t width, size_t height,
+ NVRenderTextureFormats::Enum format,
+ size_t imageSize, const void *hostPtr = NULL) override;
+ void SetMultisampledTextureData2D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ size_t samples,
+ NVRenderTextureFormats::Enum internalFormat,
+ size_t width, size_t height,
+ bool fixedsamplelocations) override = 0;
+
+ void SetTextureData3D(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width,
+ size_t height, size_t depth, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format,
+ const void *hostPtr = NULL) override;
+
+ void GenerateMipMaps(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderHint::Enum genType) override;
+
+ virtual NVRenderTextureSwizzleMode::Enum
+ GetTextureSwizzleMode(const NVRenderTextureFormats::Enum inFormat) const override;
+
+ NVRenderBackendSamplerObject CreateSampler(
+ NVRenderTextureMinifyingOp::Enum minFilter = NVRenderTextureMinifyingOp::Linear,
+ NVRenderTextureMagnifyingOp::Enum magFilter = NVRenderTextureMagnifyingOp::Linear,
+ NVRenderTextureCoordOp::Enum wrapS = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapT = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapR = NVRenderTextureCoordOp::ClampToEdge,
+ QT3DSI32 minLod = -1000, QT3DSI32 maxLod = 1000, QT3DSF32 lodBias = 0.0,
+ NVRenderTextureCompareMode::Enum compareMode = NVRenderTextureCompareMode::NoCompare,
+ NVRenderTextureCompareOp::Enum compareFunc = NVRenderTextureCompareOp::LessThanOrEqual,
+ QT3DSF32 anisotropy = 1.0, QT3DSF32 *borderColor = NULL) override;
+
+ void UpdateSampler(
+ NVRenderBackendSamplerObject so, NVRenderTextureTargetType::Enum target,
+ NVRenderTextureMinifyingOp::Enum minFilter = NVRenderTextureMinifyingOp::Linear,
+ NVRenderTextureMagnifyingOp::Enum magFilter = NVRenderTextureMagnifyingOp::Linear,
+ NVRenderTextureCoordOp::Enum wrapS = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapT = NVRenderTextureCoordOp::ClampToEdge,
+ NVRenderTextureCoordOp::Enum wrapR = NVRenderTextureCoordOp::ClampToEdge,
+ QT3DSF32 minLod = -1000.0, QT3DSF32 maxLod = 1000.0, QT3DSF32 lodBias = 0.0,
+ NVRenderTextureCompareMode::Enum compareMode = NVRenderTextureCompareMode::NoCompare,
+ NVRenderTextureCompareOp::Enum compareFunc = NVRenderTextureCompareOp::LessThanOrEqual,
+ QT3DSF32 anisotropy = 1.0, QT3DSF32 *borderColor = NULL) override;
+
+ void UpdateTextureObject(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target, QT3DSI32 baseLevel,
+ QT3DSI32 maxLevel) override;
+
+ void UpdateTextureSwizzle(NVRenderBackendTextureObject to,
+ NVRenderTextureTargetType::Enum target,
+ NVRenderTextureSwizzleMode::Enum swizzleMode) override;
+
+ void ReleaseSampler(NVRenderBackendSamplerObject so) override;
+
+ virtual NVRenderBackendAttribLayoutObject
+ CreateAttribLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs) override;
+ void ReleaseAttribLayout(NVRenderBackendAttribLayoutObject ao) override;
+
+ virtual NVRenderBackendInputAssemblerObject
+ CreateInputAssembler(NVRenderBackendAttribLayoutObject attribLayout,
+ NVConstDataRef<NVRenderBackendBufferObject> buffers,
+ const NVRenderBackendBufferObject indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets,
+ QT3DSU32 patchVertexCount) override;
+ void ReleaseInputAssembler(NVRenderBackendInputAssemblerObject iao) override;
+
+ bool SetInputAssembler(NVRenderBackendInputAssemblerObject iao,
+ NVRenderBackendShaderProgramObject po) override = 0;
+ void SetPatchVertexCount(NVRenderBackendInputAssemblerObject, QT3DSU32) override
+ {
+ QT3DS_ASSERT(false);
+ }
+
+ // shader
+ virtual NVRenderBackendVertexShaderObject
+ CreateVertexShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage, bool binary) override;
+ virtual NVRenderBackendFragmentShaderObject
+ CreateFragmentShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage, bool binary) override;
+ virtual NVRenderBackendTessControlShaderObject
+ CreateTessControlShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) override;
+ virtual NVRenderBackendTessEvaluationShaderObject
+ CreateTessEvaluationShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage,
+ bool binary) override;
+ virtual NVRenderBackendGeometryShaderObject
+ CreateGeometryShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage, bool binary) override;
+ virtual NVRenderBackendComputeShaderObject
+ CreateComputeShader(NVConstDataRef<QT3DSI8> source, eastl::string &errorMessage, bool binary) override;
+ void ReleaseVertexShader(NVRenderBackendVertexShaderObject vso) override;
+ void ReleaseFragmentShader(NVRenderBackendFragmentShaderObject fso) override;
+ void ReleaseTessControlShader(NVRenderBackendTessControlShaderObject tcso) override;
+ void ReleaseTessEvaluationShader(NVRenderBackendTessEvaluationShaderObject teso) override;
+ void ReleaseGeometryShader(NVRenderBackendGeometryShaderObject gso) override;
+ void ReleaseComputeShader(NVRenderBackendComputeShaderObject cso) override;
+ void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendVertexShaderObject vso) override;
+ void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendFragmentShaderObject fso) override;
+ void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessControlShaderObject tcso) override;
+ void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessEvaluationShaderObject teso) override;
+ void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendGeometryShaderObject gso) override;
+ void AttachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendComputeShaderObject cso) override;
+ void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendVertexShaderObject vso) override;
+ void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendFragmentShaderObject fso) override;
+ void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessControlShaderObject tcso) override;
+ void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendTessEvaluationShaderObject teso) override;
+ void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendGeometryShaderObject gso) override;
+ void DetachShader(NVRenderBackendShaderProgramObject po,
+ NVRenderBackendComputeShaderObject cso) override;
+ NVRenderBackendShaderProgramObject CreateShaderProgram(bool isSeparable) override;
+ void ReleaseShaderProgram(NVRenderBackendShaderProgramObject po) override;
+ bool LinkProgram(NVRenderBackendShaderProgramObject po,
+ eastl::string &errorMessage) override;
+ void SetActiveProgram(NVRenderBackendShaderProgramObject po) override;
+ void DispatchCompute(NVRenderBackendShaderProgramObject po, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ) override;
+ NVRenderBackendProgramPipeline CreateProgramPipeline() override;
+ void ReleaseProgramPipeline(NVRenderBackendProgramPipeline po) override;
+ void SetActiveProgramPipeline(NVRenderBackendProgramPipeline po) override;
+ void SetProgramStages(NVRenderBackendProgramPipeline ppo,
+ NVRenderShaderTypeFlags flags,
+ NVRenderBackendShaderProgramObject po) override;
+
+ // uniforms
+ QT3DSI32 GetConstantCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetConstantInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 bufSize, QT3DSI32 *numElem,
+ NVRenderShaderDataTypes::Enum *type, QT3DSI32 *binding,
+ char *nameBuf) override;
+ void SetConstantValue(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ NVRenderShaderDataTypes::Enum type, QT3DSI32 count,
+ const void *value, bool transpose) override;
+
+ // uniform buffers
+ QT3DSI32 GetConstantBufferCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetConstantBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length, char *nameBuf) override;
+ void GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSI32 *indices) override;
+ void GetConstantBufferParamInfoByIndices(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 count, QT3DSU32 *indices, QT3DSI32 *type,
+ QT3DSI32 *size, QT3DSI32 *offset) override;
+ void ProgramSetConstantBlock(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 blockIndex, QT3DSU32 binding) override;
+ void ProgramSetConstantBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) override;
+
+ // storage buffers
+ QT3DSI32 GetStorageBufferCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetStorageBufferInfoByID(NVRenderBackendShaderProgramObject po, QT3DSU32 id,
+ QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length, char *nameBuf) override;
+ void ProgramSetStorageBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) override;
+
+ // atomic counter buffers
+ QT3DSI32 GetAtomicCounterBufferCount(NVRenderBackendShaderProgramObject po) override;
+ QT3DSI32 GetAtomicCounterBufferInfoByID(NVRenderBackendShaderProgramObject po,
+ QT3DSU32 id, QT3DSU32 nameBufSize, QT3DSI32 *paramCount,
+ QT3DSI32 *bufferSize, QT3DSI32 *length,
+ char *nameBuf) override;
+ void ProgramSetAtomicCounterBuffer(QT3DSU32 index, NVRenderBackendBufferObject bo) override;
+
+ /// draw calls
+ void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 start, QT3DSU32 count) override;
+ void DrawIndirect(NVRenderDrawMode::Enum drawMode, const void *indirect) override;
+ void DrawIndexed(NVRenderDrawMode::Enum drawMode, QT3DSU32 count,
+ NVRenderComponentTypes::Enum type, const void *indices) override;
+ void DrawIndexedIndirect(NVRenderDrawMode::Enum drawMode,
+ NVRenderComponentTypes::Enum type, const void *indirect) override;
+
+ // read calls
+ void ReadPixel(NVRenderBackendRenderTargetObject rto, QT3DSI32 x, QT3DSI32 y, QT3DSI32 width,
+ QT3DSI32 height, NVRenderReadPixelFormats::Enum inFormat, void *pixels) override;
+
+ // NV path rendering
+ NVRenderBackendPathObject CreatePathNVObject(size_t range) override;
+ // Pathing requires gl4 backend.
+ void SetPathSpecification(NVRenderBackendPathObject, NVConstDataRef<QT3DSU8>,
+ NVConstDataRef<QT3DSF32>) override
+ {
+ }
+
+ ///< Bounds of the fill and stroke
+ NVBounds3 GetPathObjectBoundingBox(NVRenderBackendPathObject /*inPathObject*/) override
+ {
+ return NVBounds3();
+ }
+ NVBounds3 GetPathObjectFillBox(NVRenderBackendPathObject /*inPathObject*/) override
+ {
+ return NVBounds3();
+ }
+ NVBounds3 GetPathObjectStrokeBox(NVRenderBackendPathObject /*inPathObject*/) override
+ {
+ return NVBounds3();
+ }
+
+ /**
+ * Defaults to 0 if unset.
+ */
+ void SetStrokeWidth(NVRenderBackendPathObject /*inPathObject*/, QT3DSF32) override {}
+ void SetPathProjectionMatrix(const QT3DSMat44 /*inPathProjection*/) override {}
+ void SetPathModelViewMatrix(const QT3DSMat44 /*inPathModelview*/) override {}
+ void SetPathStencilDepthOffset(QT3DSF32 /*inSlope*/, QT3DSF32 /*inBias*/) override {}
+ void SetPathCoverDepthFunc(NVRenderBoolOp::Enum /*inDepthFunction*/) override {}
+ void StencilStrokePath(NVRenderBackendPathObject /*inPathObject*/) override {}
+ void StencilFillPath(NVRenderBackendPathObject /*inPathObject*/) override {}
+ void ReleasePathNVObject(NVRenderBackendPathObject po, size_t range) override;
+
+ void LoadPathGlyphs(NVRenderBackendPathObject, NVRenderPathFontTarget::Enum,
+ const void *, NVRenderPathFontStyleFlags, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathMissingGlyphs::Enum, NVRenderBackendPathObject,
+ QT3DSF32) override;
+ virtual NVRenderPathReturnValues::Enum
+ LoadPathGlyphsIndexed(NVRenderBackendPathObject po, NVRenderPathFontTarget::Enum fontTarget,
+ const void *fontName, NVRenderPathFontStyleFlags fontStyle,
+ QT3DSU32 firstGlyphIndex, size_t numGlyphs,
+ NVRenderBackendPathObject pathParameterTemplate, QT3DSF32 emScale) override;
+ virtual NVRenderBackendPathObject
+ LoadPathGlyphsIndexedRange(NVRenderPathFontTarget::Enum, const void *,
+ NVRenderPathFontStyleFlags,
+ NVRenderBackend::NVRenderBackendPathObject, QT3DSF32, QT3DSU32 *) override;
+ void LoadPathGlyphRange(NVRenderBackendPathObject, NVRenderPathFontTarget::Enum,
+ const void *, NVRenderPathFontStyleFlags, QT3DSU32, size_t,
+ NVRenderPathMissingGlyphs::Enum, NVRenderBackendPathObject,
+ QT3DSF32) override;
+ void GetPathMetrics(NVRenderBackendPathObject, size_t,
+ NVRenderPathGlyphFontMetricFlags, NVRenderPathFormatType::Enum,
+ const void *, size_t, QT3DSF32 *) override;
+ void GetPathMetricsRange(NVRenderBackendPathObject, size_t,
+ NVRenderPathGlyphFontMetricFlags, size_t, QT3DSF32 *) override;
+ void GetPathSpacing(NVRenderBackendPathObject, size_t, NVRenderPathListMode::Enum,
+ NVRenderPathFormatType::Enum, const void *, QT3DSF32, QT3DSF32,
+ NVRenderPathTransformType::Enum, QT3DSF32 *) override;
+
+ void StencilFillPathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathFillMode::Enum, QT3DSU32,
+ NVRenderPathTransformType::Enum, const QT3DSF32 *) override;
+ void StencilStrokePathInstancedN(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *, QT3DSI32,
+ QT3DSU32, NVRenderPathTransformType::Enum,
+ const QT3DSF32 *) override;
+ void CoverFillPathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathCoverMode::Enum,
+ NVRenderPathTransformType::Enum, const QT3DSF32 *) override;
+ void CoverStrokePathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathCoverMode::Enum,
+ NVRenderPathTransformType::Enum, const QT3DSF32 *) override;
+
+ QSurfaceFormat format() const override
+ {
+ return m_format;
+ }
+
+ protected:
+ virtual NVFoundationBase &GetFoundation() { return m_Foundation; }
+ virtual bool compileSource(GLuint shaderID, NVConstDataRef<QT3DSI8> source,
+ eastl::string &errorMessage, bool binary);
+ virtual const char *getVersionString();
+ virtual const char *getVendorString();
+ virtual const char *getRendererString();
+ virtual const char *getExtensionString();
+
+ virtual void setAndInspectHardwareCaps();
+
+ protected:
+ volatile QT3DSI32 mRefCount; ///< reference count
+ NVFoundationBase &m_Foundation; ///< Foundation class for allocations and other base things
+ NVScopedRefCounted<qt3ds::foundation::IStringTable>
+ m_StringTable; ///< pointer to a string table
+ GLConversion m_Conversion; ///< Class for conversion from base type to GL types
+ QStringList m_extensions; ///< contains the OpenGL extension string
+ QT3DSI32 m_MaxAttribCount; ///< Maximum attributes which can be used
+ nvvector<GLenum> m_DrawBuffersArray; ///< Contains the drawbuffer enums
+ QSurfaceFormat m_format;
+
+ NVRenderBackendRasterizerStateGL
+ *m_pCurrentRasterizerState; ///< this holds the current rasterizer state
+ NVRenderBackendDepthStencilStateGL
+ *m_pCurrentDepthStencilState; ///< this holds the current depth stencil state
+
+#ifdef RENDER_BACKEND_LOG_GL_ERRORS
+ void checkGLError(const char *function, const char *file, const unsigned int line) const;
+#else
+ void checkGLError() const;
+#endif
+ QOpenGLFunctions *m_glFunctions;
+ QOpenGLExtraFunctions *m_glExtraFunctions;
+ GLfloat m_maxAnisotropy;
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h b/src/render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h
new file mode 100644
index 0000000..e14111a
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendInputAssemblerGL.h
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_INPUT_ASSEMBLER_GL_H
+#define QT3DS_RENDER_BACKEND_INPUT_ASSEMBLER_GL_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/StringTable.h"
+#include "foundation/Utils.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct NVRenderBackendLayoutEntryGL
+ {
+ CRegisteredString m_AttribName; ///< must be the same name as used in the vertex shader
+ QT3DSU8 m_Normalize; ///< normalize parameter
+ QT3DSU32 m_AttribIndex; ///< attribute index
+ QT3DSU32 m_Type; ///< GL vertex format type @sa GL_FLOAT, GL_INT
+ QT3DSU32 m_NumComponents; ///< component count. max 4
+ QT3DSU32 m_InputSlot; ///< Input slot where to fetch the data from
+ QT3DSU32 m_Offset; ///< offset in byte
+ };
+
+ ///< this class handles the vertex attribute layout setup
+ class NVRenderBackendAttributeLayoutGL
+ {
+ public:
+ ///< constructor
+ NVRenderBackendAttributeLayoutGL(NVDataRef<NVRenderBackendLayoutEntryGL> entries,
+ QT3DSU32 maxInputSlot)
+ : m_LayoutAttribEntries(entries)
+ , m_MaxInputSlot(maxInputSlot)
+ {
+ }
+ ///< destructor
+ ~NVRenderBackendAttributeLayoutGL(){}
+
+ NVRenderBackendLayoutEntryGL *getEntryByName(CRegisteredString entryName) const
+ {
+ QT3DS_FOREACH(idx, m_LayoutAttribEntries.size())
+ {
+ if (m_LayoutAttribEntries[idx].m_AttribName == entryName)
+ return &m_LayoutAttribEntries.mData[idx];
+ }
+ return NULL;
+ }
+
+ Option<NVRenderBackendLayoutEntryGL> getEntryByAttribIndex(QT3DSU32 attribIndex) const
+ {
+ QT3DS_FOREACH(idx, m_LayoutAttribEntries.size())
+ {
+ if (m_LayoutAttribEntries[idx].m_AttribIndex == attribIndex)
+ return m_LayoutAttribEntries[idx];
+ }
+ return Empty();
+ }
+
+ NVDataRef<NVRenderBackendLayoutEntryGL>
+ m_LayoutAttribEntries; ///< vertex attribute layout entries
+ QT3DSU32 m_MaxInputSlot; ///< max used input slot
+ };
+
+ ///< this class handles the input assembler setup
+ class NVRenderBackendInputAssemblerGL
+ {
+ public:
+ ///< constructor
+ NVRenderBackendInputAssemblerGL(
+ NVFoundationBase &fnd, NVRenderBackendAttributeLayoutGL *attribLayout,
+ NVConstDataRef<NVRenderBackend::NVRenderBackendBufferObject> buffers,
+ const NVRenderBackend::NVRenderBackendBufferObject indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets, QT3DSU32 patchVertexCount)
+ : m_Foundation(fnd)
+ , m_attribLayout(attribLayout)
+ , m_VertexbufferHandles(buffers)
+ , m_IndexbufferHandle(indexBuffer)
+ , m_VaoID(0)
+ , m_cachedShaderHandle(0)
+ , m_PatchVertexCount(patchVertexCount)
+ {
+ QT3DSU32 *strideMem = (QT3DSU32 *)QT3DS_ALLOC(fnd.getAllocator(), strides.mSize * sizeof(QT3DSU32),
+ "BackendAttributeLayoutGL:m_strides");
+ QT3DSU32 *offsetMem = (QT3DSU32 *)QT3DS_ALLOC(fnd.getAllocator(), strides.mSize * sizeof(QT3DSU32),
+ "BackendAttributeLayoutGL:m_strides");
+ // copy offsets and strides
+ QT3DS_FOREACH(idx, strides.size())
+ {
+ strideMem[idx] = strides.mData[idx];
+ offsetMem[idx] = offsets.mData[idx];
+ }
+
+ m_strides = toDataRef(strideMem, strides.size());
+ m_offsets = toDataRef(offsetMem, offsets.size());
+ }
+ ///< destructor
+ ~NVRenderBackendInputAssemblerGL()
+ {
+ QT3DS_FREE(m_Foundation.getAllocator(), m_strides.mData);
+ QT3DS_FREE(m_Foundation.getAllocator(), m_offsets.mData);
+ };
+
+ NVFoundationBase &m_Foundation; ///< pointer to foundation
+ NVRenderBackendAttributeLayoutGL *m_attribLayout; ///< pointer to attribute layout
+ NVConstDataRef<NVRenderBackend::NVRenderBackendBufferObject>
+ m_VertexbufferHandles; ///< opaque vertex buffer backend handles
+ NVRenderBackend::NVRenderBackendBufferObject
+ m_IndexbufferHandle; ///< opaque index buffer backend handles
+ QT3DSU32 m_VaoID; ///< this is only used if GL version is greater or equal 3
+ QT3DSU32 m_cachedShaderHandle; ///< this is the shader id which was last used with this object
+ QT3DSU32 m_PatchVertexCount; ///< vertex count for a single patch primitive
+ NVDataRef<QT3DSU32> m_strides; ///< buffer strides
+ NVDataRef<QT3DSU32> m_offsets; ///< buffer offsets
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h b/src/render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h
new file mode 100644
index 0000000..3a74a8e
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendRenderStatesGL.h
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_RENDER_STATE_OBJECTS_GL_H
+#define QT3DS_RENDER_BACKEND_RENDER_STATE_OBJECTS_GL_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Utils.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ ///< this class handles the shader input variables
+ class NVRenderBackendDepthStencilStateGL
+ {
+ public:
+ ///< constructor
+ NVRenderBackendDepthStencilStateGL(bool enableDepth, bool depthMask,
+ NVRenderBoolOp::Enum depthFunc, bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack)
+ : m_DepthEnable(enableDepth)
+ , m_DepthMask(depthMask)
+ , m_DepthFunc(depthFunc)
+ , m_StencilEnable(enableStencil)
+ , m_StencilFuncFront(stencilFuncFront)
+ , m_StencilFuncBack(stencilFuncBack)
+ , m_DepthStencilOpFront(depthStencilOpFront)
+ , m_DepthStencilOpBack(depthStencilOpBack)
+ {
+ }
+
+ ///< constructor
+ NVRenderBackendDepthStencilStateGL()
+ : m_DepthEnable(true)
+ , m_DepthMask(true)
+ , m_DepthFunc(NVRenderBoolOp::LessThanOrEqual)
+ , m_StencilEnable(false)
+ {
+ }
+
+ ///< destructor
+ ~NVRenderBackendDepthStencilStateGL(){}
+
+ ///< assignement
+ NVRenderBackendDepthStencilStateGL &operator=(const NVRenderBackendDepthStencilStateGL &rhs)
+ {
+ // Check for self-assignment!
+ if (this == &rhs)
+ return *this;
+
+ m_DepthEnable = rhs.m_DepthEnable;
+ m_DepthMask = rhs.m_DepthMask;
+ m_DepthFunc = rhs.m_DepthFunc;
+ m_StencilEnable = rhs.m_StencilEnable;
+ m_StencilFuncFront = rhs.m_StencilFuncFront;
+ m_StencilFuncBack = rhs.m_StencilFuncBack;
+ m_DepthStencilOpFront = rhs.m_DepthStencilOpFront;
+ m_DepthStencilOpBack = rhs.m_DepthStencilOpBack;
+
+ return *this;
+ }
+
+ bool operator==(const NVRenderBackendDepthStencilStateGL &other) const
+ {
+ return (m_DepthEnable == other.m_DepthEnable && m_DepthMask == other.m_DepthMask
+ && m_DepthFunc == other.m_DepthFunc && m_StencilEnable == other.m_StencilEnable
+ && m_StencilFuncFront == other.m_StencilFuncFront
+ && m_StencilFuncBack == other.m_StencilFuncBack
+ && m_DepthStencilOpFront == other.m_DepthStencilOpFront
+ && m_DepthStencilOpBack == other.m_DepthStencilOpBack);
+ }
+
+ bool m_DepthEnable; ///< depth test enabled
+ bool m_DepthMask; ///< enable / disable depth writes
+ NVRenderBoolOp::Enum m_DepthFunc; ///< depth comparison func
+ bool m_StencilEnable; ///< enable disable stencil test
+ NVRenderStencilFunctionArgument m_StencilFuncFront; ///< stencil setup for front faces
+ NVRenderStencilFunctionArgument m_StencilFuncBack; ///< stencil setup for back faces
+ NVRenderStencilOperationArgument
+ m_DepthStencilOpFront; ///< depth stencil operation for front faces
+ NVRenderStencilOperationArgument
+ m_DepthStencilOpBack; ///< depth stencil operation for back faces
+ };
+
+ class NVRenderBackendMiscStateGL
+ {
+ public:
+ ///< constructor
+ NVRenderBackendMiscStateGL()
+ : m_PatchVertexCount(1)
+ {
+ }
+
+ QT3DSU32 m_PatchVertexCount; ///< vertex count for a single patch primitive
+ };
+
+ class NVRenderBackendRasterizerStateGL
+ {
+ public:
+ ///< constructor
+ NVRenderBackendRasterizerStateGL(QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace)
+ : m_DepthBias(depthBias)
+ , m_DepthScale(depthScale)
+ , m_CullFace(cullFace)
+ {
+ }
+ ///< constructor
+ NVRenderBackendRasterizerStateGL()
+ : m_DepthBias(0.0)
+ , m_DepthScale(0.0)
+ , m_CullFace(NVRenderFaces::Back)
+ {
+ }
+
+ NVRenderBackendRasterizerStateGL &operator=(const NVRenderBackendRasterizerStateGL &rhs)
+ {
+ // Check for self-assignment!
+ if (this == &rhs)
+ return *this;
+
+ m_DepthBias = rhs.m_DepthBias;
+ m_DepthScale = rhs.m_DepthScale;
+ m_CullFace = rhs.m_CullFace;
+
+ return *this;
+ }
+
+ bool operator==(const NVRenderBackendRasterizerStateGL &other) const
+ {
+ return (m_DepthBias == other.m_DepthBias && m_DepthScale == other.m_DepthScale
+ && m_CullFace == other.m_CullFace);
+ }
+
+ QT3DSF32 m_DepthBias; ///< depth bias
+ QT3DSF32 m_DepthScale; ///< mulitply constant
+ NVRenderFaces::Enum m_CullFace; ///< cull face front or back
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h b/src/render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h
new file mode 100644
index 0000000..f7caffd
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderBackendShaderProgramGL.h
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_SHADER_PROGRAM_GL_H
+#define QT3DS_RENDER_BACKEND_SHADER_PROGRAM_GL_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Utils.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct NVRenderBackendShaderInputEntryGL
+ {
+ CRegisteredString m_AttribName; ///< must be the same name as used in the vertex shader
+ QT3DSU32 m_AttribLocation; ///< attribute index
+ QT3DSU32 m_Type; ///< GL vertex format type @sa GL_FLOAT, GL_INT
+ QT3DSU32 m_NumComponents; ///< component count. max 4
+ };
+
+ ///< this class handles the shader input variables
+ class NVRenderBackendShaderInputGL
+ {
+ public:
+ ///< constructor
+ NVRenderBackendShaderInputGL(NVDataRef<NVRenderBackendShaderInputEntryGL> entries)
+ : m_ShaderInputEntries(entries)
+ {
+ }
+ ///< destructor
+ ~NVRenderBackendShaderInputGL(){}
+
+ NVRenderBackendShaderInputEntryGL *getEntryByName(CRegisteredString entryName) const
+ {
+ QT3DS_FOREACH(idx, m_ShaderInputEntries.size())
+ {
+ if (m_ShaderInputEntries[idx].m_AttribName == entryName)
+ return &m_ShaderInputEntries.mData[idx];
+ }
+ return NULL;
+ }
+
+ Option<NVRenderBackendShaderInputEntryGL>
+ getEntryByAttribLocation(QT3DSU32 attribLocation) const
+ {
+ QT3DS_FOREACH(idx, m_ShaderInputEntries.size())
+ {
+ if (m_ShaderInputEntries[idx].m_AttribLocation == attribLocation)
+ return m_ShaderInputEntries[idx];
+ }
+ return Empty();
+ }
+
+ NVDataRef<NVRenderBackendShaderInputEntryGL> m_ShaderInputEntries; ///< shader input entries
+ };
+
+ ///< this class represents the internals of a GL program
+ class NVRenderBackendShaderProgramGL
+ {
+ public:
+ ///< constructor
+ NVRenderBackendShaderProgramGL(QT3DSU32 programID)
+ : m_ProgramID(programID)
+ , m_shaderInput(NULL)
+ {
+ }
+
+ ///< destructor
+ ~NVRenderBackendShaderProgramGL(){}
+
+ QT3DSU32 m_ProgramID; ///< this is the OpenGL object ID
+ NVRenderBackendShaderInputGL *m_shaderInput; ///< pointer to shader input object
+ };
+}
+}
+
+#endif
diff --git a/src/render/backends/gl/Qt3DSRenderContextGL.cpp b/src/render/backends/gl/Qt3DSRenderContextGL.cpp
new file mode 100644
index 0000000..88670ef
--- /dev/null
+++ b/src/render/backends/gl/Qt3DSRenderContextGL.cpp
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSMat44.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Utils.h"
+#include "EASTL/set.h"
+#include "EASTL/utility.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace eastl;
+
+namespace qt3ds {
+namespace render {
+
+ NVRenderContext &NVRenderContext::CreateGL(NVFoundationBase &foundation,
+ IStringTable &inStringTable,
+ const QSurfaceFormat &format)
+ {
+ NVRenderContext *retval = NULL;
+
+ QT3DS_ASSERT(format.majorVersion() >= 2);
+
+ // create backend
+ NVScopedRefCounted<IStringTable> theStringTable(inStringTable);
+ NVScopedRefCounted<NVRenderBackend> theBackend;
+ bool isES = format.renderableType() == QSurfaceFormat::OpenGLES;
+ if (isES && (format.majorVersion() == 2
+ || (format.majorVersion() == 3 && format.minorVersion() == 0))) {
+ theBackend = QT3DS_NEW(foundation.getAllocator(), NVRenderBackendGLES2Impl)(foundation,
+ *theStringTable,
+ format);
+ } else if (format.majorVersion() == 3 && format.minorVersion() >= 1 && !isES) {
+ theBackend = QT3DS_NEW(foundation.getAllocator(), NVRenderBackendGL3Impl)(foundation,
+ *theStringTable,
+ format);
+ } else if (format.majorVersion() == 4
+ || (isES && format.majorVersion() == 3 && format.minorVersion() >= 1)) {
+#ifdef Q_OS_MACOS
+ // TODO: macOS crashes with glTextStorage2DMultisample, so fall back to OpenGL3
+ // for now (QT3DS-590)
+ theBackend = QT3DS_NEW(foundation.getAllocator(), NVRenderBackendGL3Impl)(foundation,
+ *theStringTable,
+ format);
+#else
+ theBackend = QT3DS_NEW(foundation.getAllocator(), NVRenderBackendGL4Impl)(foundation,
+ *theStringTable,
+ format);
+#endif
+ } else {
+ QT3DS_ASSERT(false);
+ qCCritical(INTERNAL_ERROR) << "Can't find a suitable OpenGL version for" << format;
+ }
+
+
+ retval = QT3DS_NEW(foundation.getAllocator(), NVRenderContextImpl)(foundation, *theBackend,
+ *theStringTable);
+
+ return *retval;
+ }
+}
+}
diff --git a/src/render/backends/software/Qt3DSRenderBackendNULL.cpp b/src/render/backends/software/Qt3DSRenderBackendNULL.cpp
new file mode 100644
index 0000000..af93e92
--- /dev/null
+++ b/src/render/backends/software/Qt3DSRenderBackendNULL.cpp
@@ -0,0 +1,588 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "render/backends/software/Qt3DSRenderBackendNULL.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+
+#include <QSurfaceFormat>
+
+using namespace qt3ds::render;
+using namespace qt3ds::foundation;
+using namespace qt3ds;
+
+namespace {
+struct SNullBackend : public NVRenderBackend
+{
+ NVFoundationBase &m_Foundation;
+ QT3DSI32 mRefCount;
+
+ SNullBackend(NVFoundationBase &fnd)
+ : m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ /// backend interface
+
+ NVRenderContextType GetRenderContextType() const override
+ {
+ return NVRenderContextValues::NullContext;
+ }
+ const char *GetShadingLanguageVersion() override { return ""; }
+ QT3DSU32 GetMaxCombinedTextureUnits() override { return 32; }
+ bool GetRenderBackendCap(NVRenderBackendCaps::Enum) const override { return false; }
+ void GetRenderBackendValue(NVRenderBackendQuery::Enum inQuery, QT3DSI32 *params) const override
+ {
+ if (params) {
+ switch (inQuery) {
+ case NVRenderBackendQuery::MaxTextureSize:
+ *params = 4096;
+ break;
+ case NVRenderBackendQuery::MaxTextureArrayLayers:
+ *params = 0;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ *params = 0;
+ break;
+ }
+ }
+ }
+ QT3DSU32 GetDepthBits() const override { return 16; }
+ QT3DSU32 GetStencilBits() const override { return 0; }
+ void SetRenderState(bool, const NVRenderState::Enum) override {}
+ bool GetRenderState(const NVRenderState::Enum) override { return false; }
+ virtual NVRenderBackendDepthStencilStateObject
+ CreateDepthStencilState(bool, bool, NVRenderBoolOp::Enum, bool,
+ NVRenderStencilFunctionArgument &, NVRenderStencilFunctionArgument &,
+ NVRenderStencilOperationArgument &, NVRenderStencilOperationArgument &) override
+ {
+ return NVRenderBackendDepthStencilStateObject(1);
+ }
+ void ReleaseDepthStencilState(NVRenderBackendDepthStencilStateObject) override {}
+ NVRenderBackendRasterizerStateObject CreateRasterizerState(QT3DSF32, QT3DSF32,
+ NVRenderFaces::Enum) override
+ {
+ return NVRenderBackendRasterizerStateObject(1);
+ }
+ void ReleaseRasterizerState(NVRenderBackendRasterizerStateObject) override {}
+ void SetDepthStencilState(NVRenderBackendDepthStencilStateObject) override {}
+ void SetRasterizerState(NVRenderBackendRasterizerStateObject) override {}
+ NVRenderBoolOp::Enum GetDepthFunc() override { return NVRenderBoolOp::Equal; }
+ void SetDepthFunc(const NVRenderBoolOp::Enum) override {}
+ bool GetDepthWrite() override { return false; }
+
+ void SetDepthWrite(bool) override {}
+ void SetColorWrites(bool, bool, bool, bool) override {}
+ void SetMultisample(bool) override {}
+ void GetBlendFunc(NVRenderBlendFunctionArgument *) override {}
+ void SetBlendFunc(const NVRenderBlendFunctionArgument &) override {}
+ void SetBlendEquation(const NVRenderBlendEquationArgument &) override {}
+ void SetBlendBarrier(void) override {}
+ void GetScissorRect(NVRenderRect *) override {}
+ void SetScissorRect(const NVRenderRect &) override {}
+ void GetViewportRect(NVRenderRect *) override {}
+ void SetViewportRect(const NVRenderRect &) override {}
+ void SetClearColor(const QT3DSVec4 *) override {}
+ void Clear(NVRenderClearFlags) override {}
+ NVRenderBackendBufferObject CreateBuffer(size_t, NVRenderBufferBindFlags,
+ NVRenderBufferUsageType::Enum, const void *) override
+ {
+ return NVRenderBackendBufferObject(1);
+ }
+ void BindBuffer(NVRenderBackendBufferObject, NVRenderBufferBindFlags) override {}
+ void ReleaseBuffer(NVRenderBackendBufferObject) override {}
+
+ void UpdateBuffer(NVRenderBackendBufferObject, NVRenderBufferBindFlags, size_t,
+ NVRenderBufferUsageType::Enum, const void *) override
+ {
+ }
+ void UpdateBufferRange(NVRenderBackendBufferObject, NVRenderBufferBindFlags, size_t, size_t,
+ const void *) override
+ {
+ }
+ void *MapBuffer(NVRenderBackendBufferObject, NVRenderBufferBindFlags, size_t, size_t,
+ NVRenderBufferAccessFlags) override
+ {
+ return NULL;
+ }
+ bool UnmapBuffer(NVRenderBackendBufferObject, NVRenderBufferBindFlags) override { return true; }
+ void SetMemoryBarrier(NVRenderBufferBarrierFlags) override {}
+ NVRenderBackendQueryObject CreateQuery() override { return NVRenderBackendQueryObject(1); }
+ void ReleaseQuery(NVRenderBackendQueryObject) override {}
+ void BeginQuery(NVRenderBackendQueryObject, NVRenderQueryType::Enum) override {}
+ void EndQuery(NVRenderBackendQueryObject, NVRenderQueryType::Enum) override {}
+ void GetQueryResult(NVRenderBackendQueryObject, NVRenderQueryResultType::Enum,
+ QT3DSU32 *) override {}
+ void GetQueryResult(NVRenderBackendQueryObject, NVRenderQueryResultType::Enum,
+ QT3DSU64 *) override {}
+ void SetQueryTimer(NVRenderBackendQueryObject) override {}
+ NVRenderBackendSyncObject CreateSync(NVRenderSyncType::Enum, NVRenderSyncFlags) override
+ {
+ return NVRenderBackendSyncObject(1);
+ };
+ void ReleaseSync(NVRenderBackendSyncObject) override {}
+ void WaitSync(NVRenderBackendSyncObject, NVRenderCommandFlushFlags, QT3DSU64) override {}
+ NVRenderBackendRenderTargetObject CreateRenderTarget() override
+ {
+ return NVRenderBackendRenderTargetObject(1);
+ }
+ void ReleaseRenderTarget(NVRenderBackendRenderTargetObject) override {}
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject,
+ NVRenderFrameBufferAttachments::Enum,
+ NVRenderBackendRenderbufferObject) override
+ {
+ }
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject,
+ NVRenderFrameBufferAttachments::Enum,
+ NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum) override
+ {
+ }
+ void RenderTargetAttach(NVRenderBackendRenderTargetObject,
+ NVRenderFrameBufferAttachments::Enum,
+ NVRenderBackendTextureObject, QT3DSI32, QT3DSI32) override
+ {
+ }
+ void SetRenderTarget(NVRenderBackendRenderTargetObject) override {}
+ bool RenderTargetIsValid(NVRenderBackendRenderTargetObject) override { return false; }
+ void SetReadTarget(NVRenderBackendRenderTargetObject) override {}
+ void SetDrawBuffers(NVRenderBackendRenderTargetObject, NVConstDataRef<QT3DSI32>) override {}
+ void SetReadBuffer(NVRenderBackendRenderTargetObject, NVReadFaces::Enum) override {}
+
+ void BlitFramebuffer(QT3DSI32, QT3DSI32, QT3DSI32, QT3DSI32, QT3DSI32, QT3DSI32, QT3DSI32, QT3DSI32,
+ NVRenderClearFlags, NVRenderTextureMagnifyingOp::Enum) override
+ {
+ }
+ NVRenderBackendRenderbufferObject CreateRenderbuffer(NVRenderRenderBufferFormats::Enum,
+ size_t, size_t) override
+ {
+ return NVRenderBackendRenderbufferObject(1);
+ }
+ void ReleaseRenderbuffer(NVRenderBackendRenderbufferObject) override {}
+
+ bool ResizeRenderbuffer(NVRenderBackendRenderbufferObject,
+ NVRenderRenderBufferFormats::Enum, size_t, size_t) override
+ {
+ return false;
+ }
+ NVRenderBackendTextureObject CreateTexture() override { return NVRenderBackendTextureObject(1); }
+
+ void SetTextureData2D(NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum,
+ QT3DSU32, NVRenderTextureFormats::Enum, size_t, size_t, QT3DSI32,
+ NVRenderTextureFormats::Enum, const void *) override
+ {
+ }
+ void SetTextureDataCubeFace(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, QT3DSU32,
+ NVRenderTextureFormats::Enum, size_t, size_t, QT3DSI32,
+ NVRenderTextureFormats::Enum, const void *) override
+ {
+ }
+ void CreateTextureStorage2D(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, QT3DSU32,
+ NVRenderTextureFormats::Enum, size_t, size_t) override
+ {
+ }
+ void SetTextureSubData2D(NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum,
+ QT3DSU32, QT3DSI32, QT3DSI32, size_t, size_t,
+ NVRenderTextureFormats::Enum, const void *) override
+ {
+ }
+ void SetCompressedTextureData2D(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, QT3DSU32,
+ NVRenderTextureFormats::Enum, size_t, size_t, QT3DSI32,
+ size_t, const void *) override
+ {
+ }
+ void SetCompressedTextureDataCubeFace(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, QT3DSU32,
+ NVRenderTextureFormats::Enum, size_t, size_t,
+ QT3DSI32, size_t, const void *) override
+ {
+ }
+ void SetCompressedTextureSubData2D(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, QT3DSU32, QT3DSI32, QT3DSI32,
+ size_t, size_t, NVRenderTextureFormats::Enum, size_t,
+ const void *) override
+ {
+ }
+ void SetMultisampledTextureData2D(NVRenderBackendTextureObject,
+ NVRenderTextureTargetType::Enum, size_t,
+ NVRenderTextureFormats::Enum, size_t, size_t, bool) override
+ {
+ }
+ void SetTextureData3D(NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum,
+ QT3DSU32, NVRenderTextureFormats::Enum, size_t, size_t, size_t,
+ QT3DSI32, NVRenderTextureFormats::Enum, const void *) override
+ {
+ }
+ void GenerateMipMaps(NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum,
+ NVRenderHint::Enum) override
+ {
+ }
+ void BindTexture(NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum, QT3DSU32) override
+ {
+ }
+ void BindImageTexture(NVRenderBackendTextureObject, QT3DSU32, QT3DSI32, bool, QT3DSI32,
+ NVRenderImageAccessType::Enum, NVRenderTextureFormats::Enum) override
+ {
+ }
+ void ReleaseTexture(NVRenderBackendTextureObject) override {}
+
+ virtual NVRenderTextureSwizzleMode::Enum
+ GetTextureSwizzleMode(const NVRenderTextureFormats::Enum) const override
+ {
+ return NVRenderTextureSwizzleMode::NoSwizzle;
+ }
+
+ virtual NVRenderBackendSamplerObject
+ CreateSampler(NVRenderTextureMinifyingOp::Enum, NVRenderTextureMagnifyingOp::Enum,
+ NVRenderTextureCoordOp::Enum, NVRenderTextureCoordOp::Enum,
+ NVRenderTextureCoordOp::Enum, QT3DSI32, QT3DSI32, QT3DSF32,
+ NVRenderTextureCompareMode::Enum, NVRenderTextureCompareOp::Enum, QT3DSF32, QT3DSF32 *) override
+ {
+ return NVRenderBackendSamplerObject(1);
+ }
+
+ void UpdateSampler(NVRenderBackendSamplerObject, NVRenderTextureTargetType::Enum,
+ NVRenderTextureMinifyingOp::Enum, NVRenderTextureMagnifyingOp::Enum,
+ NVRenderTextureCoordOp::Enum, NVRenderTextureCoordOp::Enum,
+ NVRenderTextureCoordOp::Enum, QT3DSF32, QT3DSF32, QT3DSF32,
+ NVRenderTextureCompareMode::Enum, NVRenderTextureCompareOp::Enum,
+ QT3DSF32, QT3DSF32 *) override
+ {
+ }
+
+ void UpdateTextureObject(NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum,
+ QT3DSI32, QT3DSI32) override
+ {
+ }
+
+ void UpdateTextureSwizzle(NVRenderBackendTextureObject, NVRenderTextureTargetType::Enum,
+ NVRenderTextureSwizzleMode::Enum) override
+ {
+ }
+
+ void ReleaseSampler(NVRenderBackendSamplerObject) override {}
+
+ virtual NVRenderBackendAttribLayoutObject
+ CreateAttribLayout(NVConstDataRef<NVRenderVertexBufferEntry>) override
+ {
+ return NVRenderBackendAttribLayoutObject(1);
+ }
+
+ void ReleaseAttribLayout(NVRenderBackendAttribLayoutObject) override {}
+
+ NVRenderBackendInputAssemblerObject CreateInputAssembler(
+ NVRenderBackendAttribLayoutObject, NVConstDataRef<NVRenderBackendBufferObject>,
+ const NVRenderBackendBufferObject, NVConstDataRef<QT3DSU32>, NVConstDataRef<QT3DSU32>, QT3DSU32) override
+ {
+ return NVRenderBackendInputAssemblerObject(1);
+ }
+ void ReleaseInputAssembler(NVRenderBackendInputAssemblerObject) override {}
+ bool SetInputAssembler(NVRenderBackendInputAssemblerObject,
+ NVRenderBackendShaderProgramObject) override
+ {
+ return false;
+ }
+ void SetPatchVertexCount(NVRenderBackendInputAssemblerObject, QT3DSU32) override {}
+ NVRenderBackendVertexShaderObject CreateVertexShader(NVConstDataRef<QT3DSI8>,
+ eastl::string &, bool) override
+ {
+ return NVRenderBackendVertexShaderObject(1);
+ }
+ void ReleaseVertexShader(NVRenderBackendVertexShaderObject) override {}
+ NVRenderBackendFragmentShaderObject CreateFragmentShader(NVConstDataRef<QT3DSI8>,
+ eastl::string &, bool) override
+ {
+ return NVRenderBackendFragmentShaderObject(1);
+ }
+ void ReleaseFragmentShader(NVRenderBackendFragmentShaderObject) override {}
+ NVRenderBackendTessControlShaderObject CreateTessControlShader(NVConstDataRef<QT3DSI8>,
+ eastl::string &, bool) override
+ {
+ return NVRenderBackendTessControlShaderObject(1);
+ }
+ void ReleaseTessControlShader(NVRenderBackendTessControlShaderObject) override {}
+ virtual NVRenderBackendTessEvaluationShaderObject
+ CreateTessEvaluationShader(NVConstDataRef<QT3DSI8>, eastl::string &, bool) override
+ {
+ return NVRenderBackendTessEvaluationShaderObject(1);
+ }
+ void ReleaseTessEvaluationShader(NVRenderBackendTessEvaluationShaderObject) override {}
+ NVRenderBackendGeometryShaderObject CreateGeometryShader(NVConstDataRef<QT3DSI8>,
+ eastl::string &, bool) override
+ {
+ return NVRenderBackendGeometryShaderObject(1);
+ }
+ void ReleaseGeometryShader(NVRenderBackendGeometryShaderObject) override {}
+ NVRenderBackendComputeShaderObject CreateComputeShader(NVConstDataRef<QT3DSI8>,
+ eastl::string &, bool) override
+ {
+ return NVRenderBackendComputeShaderObject(1);
+ }
+ void ReleaseComputeShader(NVRenderBackendComputeShaderObject) override {}
+ void AttachShader(NVRenderBackendShaderProgramObject, NVRenderBackendVertexShaderObject) override
+ {
+ }
+ void AttachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendFragmentShaderObject) override
+ {
+ }
+ void AttachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendTessControlShaderObject) override
+ {
+ }
+ void AttachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendTessEvaluationShaderObject) override
+ {
+ }
+ void AttachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendGeometryShaderObject) override
+ {
+ }
+ void AttachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendComputeShaderObject) override
+ {
+ }
+ void DetachShader(NVRenderBackendShaderProgramObject, NVRenderBackendVertexShaderObject) override
+ {
+ }
+ void DetachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendFragmentShaderObject) override
+ {
+ }
+ void DetachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendTessControlShaderObject) override
+ {
+ }
+ void DetachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendTessEvaluationShaderObject) override
+ {
+ }
+ void DetachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendGeometryShaderObject) override
+ {
+ }
+ void DetachShader(NVRenderBackendShaderProgramObject,
+ NVRenderBackendComputeShaderObject) override
+ {
+ }
+ NVRenderBackendShaderProgramObject CreateShaderProgram(bool) override
+ {
+ return NVRenderBackendShaderProgramObject(1);
+ }
+ void ReleaseShaderProgram(NVRenderBackendShaderProgramObject) override {}
+ NVRenderBackendProgramPipeline CreateProgramPipeline() override
+ {
+ return NVRenderBackendProgramPipeline(1);
+ }
+ void ReleaseProgramPipeline(NVRenderBackendProgramPipeline) override {}
+
+ bool LinkProgram(NVRenderBackendShaderProgramObject, eastl::string &) override { return false; }
+ void SetActiveProgram(NVRenderBackendShaderProgramObject) override {}
+ void SetActiveProgramPipeline(NVRenderBackendProgramPipeline) override {}
+ void SetProgramStages(NVRenderBackendProgramPipeline, NVRenderShaderTypeFlags,
+ NVRenderBackendShaderProgramObject) override {}
+ void DispatchCompute(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSU32, QT3DSU32) override {}
+ QT3DSI32 GetConstantCount(NVRenderBackendShaderProgramObject) override { return 0; }
+ QT3DSI32 GetConstantBufferCount(NVRenderBackendShaderProgramObject) override { return 0; }
+ QT3DSI32 GetConstantInfoByID(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSU32, QT3DSI32 *,
+ NVRenderShaderDataTypes::Enum *, QT3DSI32 *, char *) override
+ {
+ return 0;
+ }
+
+ QT3DSI32 GetConstantBufferInfoByID(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSU32,
+ QT3DSI32 *, QT3DSI32 *, QT3DSI32 *, char *) override
+ {
+ return 0;
+ }
+
+ void GetConstantBufferParamIndices(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSI32 *) override
+ {
+ }
+ void GetConstantBufferParamInfoByIndices(NVRenderBackendShaderProgramObject, QT3DSU32,
+ QT3DSU32 *, QT3DSI32 *, QT3DSI32 *, QT3DSI32 *) override {}
+ void ProgramSetConstantBlock(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSU32) override {}
+ void ProgramSetConstantBuffer(QT3DSU32, NVRenderBackendBufferObject) override {}
+
+ QT3DSI32 GetStorageBufferCount(NVRenderBackendShaderProgramObject) override { return 0; };
+ QT3DSI32 GetStorageBufferInfoByID(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSU32,
+ QT3DSI32 *, QT3DSI32 *, QT3DSI32 *, char *) override
+ {
+ return -1;
+ }
+ void ProgramSetStorageBuffer(QT3DSU32, NVRenderBackendBufferObject) override {}
+
+ QT3DSI32 GetAtomicCounterBufferCount(NVRenderBackendShaderProgramObject) override { return 0; }
+ QT3DSI32 GetAtomicCounterBufferInfoByID(NVRenderBackendShaderProgramObject, QT3DSU32, QT3DSU32,
+ QT3DSI32 *, QT3DSI32 *, QT3DSI32 *, char *) override
+ {
+ return -1;
+ };
+ void ProgramSetAtomicCounterBuffer(QT3DSU32, NVRenderBackendBufferObject) override {}
+
+ void SetConstantValue(NVRenderBackendShaderProgramObject, QT3DSU32,
+ NVRenderShaderDataTypes::Enum, QT3DSI32, const void *, bool) override
+ {
+ }
+
+ void Draw(NVRenderDrawMode::Enum, QT3DSU32, QT3DSU32) override {}
+ void DrawIndirect(NVRenderDrawMode::Enum, const void *) override {}
+
+ void DrawIndexed(NVRenderDrawMode::Enum, QT3DSU32, NVRenderComponentTypes::Enum,
+ const void *) override
+ {
+ }
+ void DrawIndexedIndirect(NVRenderDrawMode::Enum, NVRenderComponentTypes::Enum,
+ const void *) override
+ {
+ }
+
+ void ReadPixel(NVRenderBackendRenderTargetObject, QT3DSI32, QT3DSI32, QT3DSI32, QT3DSI32,
+ NVRenderReadPixelFormats::Enum, void *) override
+ {
+ }
+
+ NVRenderBackendPathObject CreatePathNVObject(size_t) override
+ {
+ return NVRenderBackendPathObject(1);
+ };
+ void SetPathSpecification(NVRenderBackendPathObject, NVConstDataRef<QT3DSU8>,
+ NVConstDataRef<QT3DSF32>) override
+ {
+ }
+
+ ///< Bounds of the fill and stroke
+ NVBounds3 GetPathObjectBoundingBox(NVRenderBackendPathObject /*inPathObject*/) override
+ {
+ return NVBounds3();
+ }
+ NVBounds3 GetPathObjectFillBox(NVRenderBackendPathObject /*inPathObject*/) override
+ {
+ return NVBounds3();
+ }
+ NVBounds3 GetPathObjectStrokeBox(NVRenderBackendPathObject /*inPathObject*/) override
+ {
+ return NVBounds3();
+ }
+
+ /**
+ * Defaults to 0 if unset.
+ */
+ void SetStrokeWidth(NVRenderBackendPathObject /*inPathObject*/, QT3DSF32) override {}
+ void SetPathProjectionMatrix(const QT3DSMat44 /*inPathProjection*/) override {}
+ void SetPathModelViewMatrix(const QT3DSMat44 /*inPathModelview*/) override {}
+
+ void SetPathStencilDepthOffset(QT3DSF32 /*inSlope*/, QT3DSF32 /*inBias*/) override {}
+ void SetPathCoverDepthFunc(NVRenderBoolOp::Enum /*inDepthFunction*/) override {}
+ void StencilStrokePath(NVRenderBackendPathObject /*inPathObject*/) override {}
+ void StencilFillPath(NVRenderBackendPathObject /*inPathObject*/) override {}
+ void ReleasePathNVObject(NVRenderBackendPathObject, size_t) override {}
+
+ void LoadPathGlyphs(NVRenderBackendPathObject, NVRenderPathFontTarget::Enum,
+ const void *, NVRenderPathFontStyleFlags, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathMissingGlyphs::Enum, NVRenderBackendPathObject, QT3DSF32) override
+ {
+ }
+ virtual NVRenderPathReturnValues::Enum
+ LoadPathGlyphsIndexed(NVRenderBackendPathObject, NVRenderPathFontTarget::Enum, const void *,
+ NVRenderPathFontStyleFlags, QT3DSU32, size_t, NVRenderBackendPathObject,
+ QT3DSF32) override
+ {
+ return NVRenderPathReturnValues::FontUnavailable;
+ }
+ NVRenderBackendPathObject LoadPathGlyphsIndexedRange(NVRenderPathFontTarget::Enum,
+ const void *,
+ NVRenderPathFontStyleFlags,
+ NVRenderBackendPathObject, QT3DSF32,
+ QT3DSU32 *) override
+ {
+ return NVRenderBackendPathObject(1);
+ }
+ void LoadPathGlyphRange(NVRenderBackendPathObject, NVRenderPathFontTarget::Enum,
+ const void *, NVRenderPathFontStyleFlags, QT3DSU32, size_t,
+ NVRenderPathMissingGlyphs::Enum, NVRenderBackendPathObject,
+ QT3DSF32) override
+ {
+ }
+ void GetPathMetrics(NVRenderBackendPathObject, size_t, NVRenderPathGlyphFontMetricFlags,
+ NVRenderPathFormatType::Enum, const void *, size_t, QT3DSF32 *) override
+ {
+ }
+ void GetPathMetricsRange(NVRenderBackendPathObject, size_t,
+ NVRenderPathGlyphFontMetricFlags, size_t, QT3DSF32 *) override
+ {
+ }
+ void GetPathSpacing(NVRenderBackendPathObject, size_t, NVRenderPathListMode::Enum,
+ NVRenderPathFormatType::Enum, const void *, QT3DSF32, QT3DSF32,
+ NVRenderPathTransformType::Enum, QT3DSF32 *) override
+ {
+ }
+
+ void StencilFillPathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathFillMode::Enum, QT3DSU32,
+ NVRenderPathTransformType::Enum, const QT3DSF32 *) override
+ {
+ }
+ void StencilStrokePathInstancedN(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *, QT3DSI32,
+ QT3DSU32, NVRenderPathTransformType::Enum, const QT3DSF32 *) override
+ {
+ }
+ void CoverFillPathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathCoverMode::Enum,
+ NVRenderPathTransformType::Enum, const QT3DSF32 *) override
+ {
+ }
+ void CoverStrokePathInstanced(NVRenderBackendPathObject, size_t,
+ NVRenderPathFormatType::Enum, const void *,
+ NVRenderPathCoverMode::Enum,
+ NVRenderPathTransformType::Enum, const QT3DSF32 *) override
+ {
+ }
+ QSurfaceFormat format() const override
+ {
+ return QSurfaceFormat();
+ }
+};
+}
+
+NVRenderBackend &NVRenderBackendNULL::CreateBackend(NVFoundationBase &foundation)
+{
+ return *QT3DS_NEW(foundation.getAllocator(), SNullBackend)(foundation);
+}
diff --git a/src/render/backends/software/Qt3DSRenderBackendNULL.h b/src/render/backends/software/Qt3DSRenderBackendNULL.h
new file mode 100644
index 0000000..397ecfb
--- /dev/null
+++ b/src/render/backends/software/Qt3DSRenderBackendNULL.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BACKEND_NULL_H
+#define QT3DS_RENDER_BACKEND_NULL_H
+#include "render/backends/Qt3DSRenderBackend.h"
+
+namespace qt3ds {
+namespace render {
+
+ class NVRenderBackendNULL : public NVRenderBackend
+ {
+ public:
+ static NVRenderBackend &CreateBackend(NVFoundationBase &foundation);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/render/glg/Qt3DSGLImplObjects.h b/src/render/glg/Qt3DSGLImplObjects.h
new file mode 100644
index 0000000..28f246f
--- /dev/null
+++ b/src/render/glg/Qt3DSGLImplObjects.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_GL_IMPL_OBJECTS_H
+#define QT3DS_RENDER_GL_IMPL_OBJECTS_H
+#include "render/backends/gl/Qt3DSOpenGLUtil.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSContainers.h"
+
+namespace qt3ds {
+namespace render {
+
+ // The set of all properties as they are currently set in hardware.
+ struct SNVGLHardPropertyContext
+ {
+ NVRenderFrameBuffer *m_FrameBuffer;
+ NVRenderShaderProgram *m_ActiveShader;
+ NVRenderProgramPipeline *m_ActiveProgramPipeline;
+ NVRenderInputAssembler *m_InputAssembler;
+ NVRenderBlendFunctionArgument m_BlendFunction;
+ NVRenderBlendEquationArgument m_BlendEquation;
+ bool m_CullingEnabled;
+ NVRenderBoolOp::Enum m_DepthFunction;
+ bool m_BlendingEnabled;
+ bool m_DepthWriteEnabled;
+ bool m_DepthTestEnabled;
+ bool m_StencilTestEnabled;
+ bool m_ScissorTestEnabled;
+ bool m_ColorWritesEnabled;
+ bool m_MultisampleEnabled;
+ NVRenderRect m_ScissorRect;
+ NVRenderRect m_Viewport;
+ QT3DSVec4 m_ClearColor;
+
+ SNVGLHardPropertyContext()
+ : m_FrameBuffer(NULL)
+ , m_ActiveShader(NULL)
+ , m_ActiveProgramPipeline(NULL)
+ , m_InputAssembler(NULL)
+ , m_CullingEnabled(true)
+ , m_DepthFunction(NVRenderBoolOp::Less)
+ , m_BlendingEnabled(true)
+ , m_DepthWriteEnabled(true)
+ , m_DepthTestEnabled(true)
+ , m_StencilTestEnabled(false)
+ , m_ScissorTestEnabled(true)
+ , m_ColorWritesEnabled(true)
+ , m_MultisampleEnabled(false)
+ , m_ClearColor(0, 0, 0, 1)
+ {
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtime/Qt3DSActivationManager.cpp b/src/runtime/Qt3DSActivationManager.cpp
new file mode 100644
index 0000000..3d05274
--- /dev/null
+++ b/src/runtime/Qt3DSActivationManager.cpp
@@ -0,0 +1,1027 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "RuntimePrefix.h"
+#include "Qt3DSActivationManager.h"
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSComponentManager.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSInvasiveSet.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/StringTable.h"
+#include "EASTL/sort.h"
+#include "Qt3DSAttributeHashes.h"
+#include "Qt3DSPresentation.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSSync.h"
+#include "Qt3DSRenderThreadPool.h"
+
+using namespace qt3ds::runtime;
+using namespace qt3ds::runtime::element;
+using qt3ds::render::IThreadPool;
+using qt3ds::foundation::Time;
+
+namespace {
+
+typedef nvvector<TElementAndSortKey> TElementAndSortKeyList;
+
+struct STimeEvent
+{
+ enum Type {
+ Start = 0,
+ Stop,
+ };
+
+ Type m_Type;
+ TTimeUnit m_Time;
+ nvvector<SElement *> m_AffectedNodes;
+
+ STimeEvent(Type inType, NVAllocatorCallback &alloc, TTimeUnit inTime)
+ : m_Type(inType)
+ , m_Time(inTime)
+ , m_AffectedNodes(alloc, "TimeEvent")
+ {
+ }
+
+ void Reset()
+ {
+ m_Time = 0;
+ m_AffectedNodes.clear();
+ }
+};
+
+struct STimeEventGreaterThan
+{
+ bool operator()(const STimeEvent *lhs, const STimeEvent *rhs) const
+ {
+ if (lhs->m_Time == rhs->m_Time)
+ return lhs->m_Type > rhs->m_Type;
+
+ return lhs->m_Time > rhs->m_Time;
+ }
+};
+
+struct STimeEventLessThan
+{
+ bool operator()(const STimeEvent *lhs, const STimeEvent *rhs) const
+ {
+ if (lhs->m_Time == rhs->m_Time)
+ return lhs->m_Type < rhs->m_Type;
+
+ return lhs->m_Time < rhs->m_Time;
+ }
+};
+
+typedef nvvector<STimeEvent *> TTimeEventList;
+struct STimeContext;
+typedef NVDataRef<NVScopedRefCounted<STimeContext>> TTimeContextSet;
+
+// Tree navigation
+
+SElement *GetElementNodeFirstChild(SElement &inNode)
+{
+ return inNode.m_Child;
+}
+SElement *GetElementNodeNextSibling(SElement &inNode)
+{
+ return inNode.m_Sibling;
+}
+SElement *GetElementNodeParent(SElement &inNode)
+{
+ return inNode.m_Parent;
+}
+
+struct SScanBufferEntry
+{
+ SElement *m_Node;
+ QT3DSU32 m_StartTime;
+ QT3DSU32 m_EndTime;
+
+ SScanBufferEntry()
+ : m_Node(NULL)
+ , m_StartTime(0)
+ , m_EndTime(QT3DS_MAX_U32)
+ {
+ }
+ SScanBufferEntry(SElement *inNode)
+ : m_Node(inNode)
+ , m_StartTime(0)
+ , m_EndTime(QT3DS_MAX_U32)
+ {
+ }
+ SScanBufferEntry(SElement *inNode, QT3DSU32 start, QT3DSU32 end)
+ : m_Node(inNode)
+ , m_StartTime(start)
+ , m_EndTime(end)
+ {
+ }
+
+ SScanBufferEntry(SElement *inNode, bool inParentActive)
+ : m_Node(inNode)
+ , m_StartTime(inParentActive ? 1 : 0)
+ , m_EndTime(0)
+ {
+ }
+
+ bool IsParentActive() const { return m_StartTime ? true : false; }
+};
+
+typedef nvvector<SScanBufferEntry> TScanBuffer;
+typedef nvvector<SElement *> TElementNodePtrList;
+
+struct SElementIndexPairSorter
+{
+ bool operator()(const eastl::pair<element::SElement *, QT3DSU32> &lhs,
+ const eastl::pair<element::SElement *, QT3DSU32> &rhs) const
+ {
+ return lhs.second < rhs.second;
+ }
+};
+
+struct SElementPtrSort
+{
+ bool operator()(const SElement *lhs, const SElement *rhs)
+ {
+ return lhs->Depth() < rhs->Depth();
+ }
+};
+
+DEFINE_INVASIVE_SINGLE_LIST(TimeContext);
+
+struct STimeContext
+{
+ NVAllocatorCallback &m_Allocator;
+ SComponent &m_Component;
+ CTimePolicy m_TimePolicy;
+ SComponentTimePolicyOverride *m_TimePolicyOverride;
+ TTimeUnit m_CurrentTime;
+ TElementNodePtrList m_Elements;
+ TTimeEventList m_TimeEventBackingStore;
+ TTimeEventList m_TimeEvents;
+ SActivationManagerNodeDirtyList m_DirtyList;
+ QT3DSU32 m_TimeEventBackingStoreIndex;
+ QT3DSI32 mRefCount;
+ STimeContext *m_NextSibling;
+ TTimeContextList m_Children;
+ Mutex &m_ElementAccessMutex;
+ bool m_AllNodesDirty;
+ bool m_TimeDataNeedsUpdate;
+
+ STimeContext(NVAllocatorCallback &alloc, SComponent &inComponent, Mutex &inElementAccessMutex)
+ : m_Allocator(alloc)
+ , m_Component(inComponent)
+ , m_TimePolicyOverride(NULL)
+ , m_CurrentTime(-1)
+ , m_Elements(alloc, "m_Elements")
+ , m_TimeEventBackingStore(alloc, "TimeEventBackingStore")
+ , m_TimeEvents(alloc, "TimeEvents")
+ , m_DirtyList(alloc)
+ , m_TimeEventBackingStoreIndex(0)
+ , mRefCount(0)
+ , m_NextSibling(NULL)
+ , m_ElementAccessMutex(inElementAccessMutex)
+ , m_AllNodesDirty(true)
+ , m_TimeDataNeedsUpdate(true)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Allocator)
+ ~STimeContext()
+ {
+ Reset();
+ for (TTimeEventList::iterator iter = m_TimeEventBackingStore.begin(),
+ end = m_TimeEventBackingStore.end();
+ iter != end; ++iter) {
+ NVDelete(m_Allocator, *iter);
+ }
+
+ m_TimeEventBackingStore.clear();
+ RemoveOverride();
+ }
+
+ void Reset()
+ {
+ for (TTimeEventList::iterator iter = m_TimeEvents.begin(), end = m_TimeEvents.end();
+ iter != end; ++iter)
+ (*iter)->Reset();
+
+ m_TimeEvents.clear();
+ m_TimeEventBackingStoreIndex = 0;
+ m_CurrentTime = -1;
+ m_DirtyList.clear();
+ m_AllNodesDirty = true;
+ m_TimeDataNeedsUpdate = true;
+ }
+
+ STimeEvent &GetTimeEventForTime(TTimeUnit inTime, STimeEvent::Type inType)
+ {
+ TTimeEventList::iterator inserter = m_TimeEvents.end();
+ for (TTimeEventList::iterator iter = m_TimeEvents.begin(), end = m_TimeEvents.end();
+ iter != end && inserter == end; ++iter) {
+ if ((*iter)->m_Time == inTime) {
+ if ((*iter)->m_Type == inType)
+ return **iter;
+ // Start comes before stop
+ if ((*iter)->m_Type == STimeEvent::Stop)
+ inserter = iter;
+ }
+
+ if ((*iter)->m_Time > inTime)
+ inserter = iter;
+ }
+
+ if (m_TimeEventBackingStoreIndex == m_TimeEventBackingStore.size())
+ m_TimeEventBackingStore.push_back(
+ QT3DS_NEW(m_Allocator, STimeEvent)(inType, m_Allocator, inTime));
+
+ STimeEvent *newEvent = m_TimeEventBackingStore[m_TimeEventBackingStoreIndex];
+ ++m_TimeEventBackingStoreIndex;
+
+ newEvent->m_Time = inTime;
+ newEvent->m_Type = inType;
+ newEvent->m_AffectedNodes.clear();
+
+ if (inserter == m_TimeEvents.end())
+ m_TimeEvents.push_back(newEvent);
+ else
+ m_TimeEvents.insert(inserter, newEvent);
+
+ return *newEvent;
+ };
+
+ void UpdateNodeList(nvvector<SElement *> &inList, bool timeActive)
+ {
+ for (QT3DSU32 elemIdx = 0, endIdx = inList.size(); elemIdx < endIdx; ++elemIdx) {
+ SActivationManagerNode &theNode = inList[elemIdx]->m_ActivationManagerNode;
+ if (timeActive != theNode.m_Flags.IsTimeActive()) {
+ theNode.m_Flags.SetTimeActive(timeActive);
+ SetElementDirty(*inList[elemIdx]);
+ }
+ }
+ }
+
+ // Returns true if we have reached the end time.
+ bool CalculateNewTime(TTimeUnit inGlobalTime)
+ {
+ Option<TTimeUnit> theNewTime;
+ if (m_TimePolicyOverride) {
+ SComponentTimePolicyOverride *theOverride = m_TimePolicyOverride;
+ eastl::pair<Q3DStudio::BOOL, TTimeUnit> theEvalResult =
+ theOverride->ComputeLocalTime(m_TimePolicy, inGlobalTime);
+ if (theEvalResult.first && theOverride->m_TimeCallback) {
+ Mutex::ScopedLock __locker(m_ElementAccessMutex);
+ theOverride->m_TimeCallback->OnTimeFinished();
+ theOverride->m_TimeCallback->Release();
+ theOverride->m_TimeCallback = NULL;
+ }
+ return false;
+ } else {
+ Q3DStudio::BOOL theReachedEndTime = m_TimePolicy.ComputeTime(inGlobalTime);
+ if (theReachedEndTime)
+ return true;
+
+ return false;
+ }
+ }
+
+ // There are four conditions this happens:
+ // 1. This object is getting destroyed
+ // 2. A new override is being set.
+ // 3. The compoent switched slides.
+ // 4. The component was deactivated.
+ void RemoveOverride()
+ {
+ if (m_TimePolicyOverride) {
+ if (m_TimePolicyOverride->m_TimeCallback) {
+ Mutex::ScopedLock __locker(m_ElementAccessMutex);
+ m_TimePolicyOverride->m_TimeCallback->Release();
+ m_TimePolicyOverride->m_TimeCallback = NULL;
+ }
+
+ NVDelete(m_Allocator, m_TimePolicyOverride);
+ m_TimePolicyOverride = NULL;
+ }
+ }
+
+ void UpdateLocalTime(TTimeUnit inNewTime, TScanBuffer &inScanBuffer, IActivityZone &inZone)
+ {
+ if (m_TimeDataNeedsUpdate) {
+ BuildTimeContext(inScanBuffer, inZone);
+ }
+
+ TTimeUnit newTime = inNewTime;
+ if (newTime != m_CurrentTime) {
+ SComponent &myNode = m_Component;
+ {
+ Mutex::ScopedLock __locker(m_ElementAccessMutex);
+ myNode.SetDirty();
+ }
+ STimeEvent searchEvent(STimeEvent::Start, m_Allocator, m_CurrentTime);
+ bool forward = newTime > m_CurrentTime;
+ m_CurrentTime = NVMax((TTimeUnit)0, newTime);
+
+ if (forward) {
+ TTimeEventList::iterator iter = eastl::lower_bound(
+ m_TimeEvents.begin(), m_TimeEvents.end(), &searchEvent, STimeEventLessThan());
+
+ for (TTimeEventList::iterator end = m_TimeEvents.end();
+ iter != end && (*iter)->m_Time <= newTime; ++iter) {
+ // Stop only works if the time is greater.
+ // start works if the time is equal.
+ bool isActive = true;
+ if ((*iter)->m_Type == STimeEvent::Stop)
+ isActive = newTime <= (*iter)->m_Time;
+
+ UpdateNodeList((*iter)->m_AffectedNodes, isActive);
+ }
+ } else {
+ searchEvent.m_Type = STimeEvent::Stop;
+ TTimeEventList::reverse_iterator iter =
+ eastl::lower_bound(m_TimeEvents.rbegin(), m_TimeEvents.rend(), &searchEvent,
+ STimeEventGreaterThan());
+
+ for (TTimeEventList::reverse_iterator end = m_TimeEvents.rend();
+ iter != end && (*iter)->m_Time >= newTime; ++iter) {
+ bool isActive = true;
+ if ((*iter)->m_Type == STimeEvent::Start)
+ isActive = newTime >= (*iter)->m_Time;
+
+ UpdateNodeList((*iter)->m_AffectedNodes, isActive);
+ }
+ }
+ }
+ }
+
+ void UpdateNodeElementInformation(SElement &inNode)
+ {
+ Q3DStudio::UVariant attValue;
+ if (inNode.GetAttribute(Q3DStudio::ATTRIBUTE_STARTTIME, attValue))
+ inNode.m_ActivationManagerNode.m_StartTime = (QT3DSU32)attValue.m_INT32;
+
+ if (inNode.GetAttribute(Q3DStudio::ATTRIBUTE_ENDTIME, attValue))
+ inNode.m_ActivationManagerNode.m_StopTime = (QT3DSU32)attValue.m_INT32;
+
+ inNode.m_ActivationManagerNode.m_Flags.SetTimeActive(false);
+ // Note that we don't set the script information here. The reason is that this requires the
+ // script list
+ // and we don't have access to it. Plus it can't change when a slide changes so it is kind
+ // of irrelevant.
+ }
+
+ bool BuildTimeContextElementNode(SElement &inNode, QT3DSU32 inGlobalMin, QT3DSU32 inGlobalMax)
+ {
+ // Note that just because a node itself does not participate in the time graph,
+ // this does not mean that its children do not participate in the time graph.
+ if (inNode.DoesParticipateInTimeGraph()) {
+ UpdateNodeElementInformation(inNode);
+ if (inNode.IsUserActive()) {
+ inGlobalMin = NVMax(inNode.m_ActivationManagerNode.m_StartTime, inGlobalMin);
+ inGlobalMax = NVMin(inNode.m_ActivationManagerNode.m_StopTime, inGlobalMax);
+ if (inGlobalMin < inGlobalMax) {
+ GetTimeEventForTime(inGlobalMin, STimeEvent::Start)
+ .m_AffectedNodes.push_back(&inNode);
+ GetTimeEventForTime(inGlobalMax, STimeEvent::Stop)
+ .m_AffectedNodes.push_back(&inNode);
+ }
+ }
+ } else {
+ inNode.m_ActivationManagerNode.m_Flags.SetTimeActive(true);
+ // Carry global min/max information down so children get setup correctly.
+ inNode.m_ActivationManagerNode.m_StartTime = inGlobalMin;
+ inNode.m_ActivationManagerNode.m_StopTime = inGlobalMax;
+ }
+ // Is it worth looking at children at all
+ return inNode.IsUserActive();
+ }
+
+ void BuildTimeContext(TScanBuffer &inScanBuffer, IActivityZone &inZone)
+ {
+ Mutex::ScopedLock __locker(m_ElementAccessMutex);
+ QT3DS_ASSERT(m_TimeDataNeedsUpdate);
+ m_TimeDataNeedsUpdate = false;
+ SComponent &myNode = m_Component;
+ SElement *theChild = myNode.m_Child;
+ if (theChild == NULL) {
+ return;
+ }
+ inScanBuffer.clear();
+ for (SElement *theChild = myNode.m_Child; theChild; theChild = theChild->m_Sibling) {
+ inScanBuffer.push_back(theChild);
+ }
+ for (QT3DSU32 idx = 0, end = (QT3DSU32)inScanBuffer.size(); idx < end; ++idx) {
+ SScanBufferEntry theEntry(inScanBuffer[idx]);
+ bool careAboutChildren = BuildTimeContextElementNode(
+ *theEntry.m_Node, theEntry.m_StartTime, theEntry.m_EndTime);
+ if (careAboutChildren && theEntry.m_Node->IsComponent() == false) {
+ for (SElement *theChild = theEntry.m_Node->m_Child; theChild;
+ theChild = theChild->m_Sibling) {
+ inScanBuffer.push_back(SScanBufferEntry(
+ theChild, theEntry.m_Node->m_ActivationManagerNode.m_StartTime,
+ theEntry.m_Node->m_ActivationManagerNode.m_StopTime));
+ }
+ end = (QT3DSU32)inScanBuffer.size();
+ }
+ if (theEntry.m_Node->IsComponent())
+ inZone.AddActivityItems(*theEntry.m_Node);
+ }
+ }
+
+ void SetElementDirty(SElement &inNode)
+ {
+ SElement *theComponentParent = &inNode.GetComponentParent();
+ if (inNode.IsComponent() && inNode.m_Parent)
+ theComponentParent = &inNode.m_Parent->GetComponentParent();
+
+ QT3DS_ASSERT(theComponentParent == &m_Component);
+ if (m_AllNodesDirty == false) {
+ // We check independent items every frame anyway so it isn't worth setting them dirty
+ // here.
+ if (inNode.IsIndependent() == false) {
+ m_DirtyList.insert(inNode);
+ }
+
+ // Dirty to root time context. This ensures that if we run an activate scan starting at
+ // a parent
+ // we won't have to re-run the scan at this node because it will not be dirty.
+ // This also makes sure that if we mark all nodes dirty we continue the activate scan
+ // till we hit at least
+ // this node.
+ SElement *theParent = inNode.m_Parent;
+ while (theParent) {
+ if (theParent->IsComponent()
+ || theParent->m_ActivationManagerNode.m_Flags.IsChildDirty())
+ theParent = NULL;
+ else {
+ SActivationManagerNode &theNode = theParent->m_ActivationManagerNode;
+ theNode.m_Flags.SetChildDirty();
+ theParent = theParent->m_Parent;
+ }
+ }
+ }
+ }
+
+ static void UpdateItemScriptStatus(SElement &inNode, bool activeAndHasScript,
+ TElementAndSortKeyList &scriptBuffer)
+ {
+ QT3DSU32 theIndex = inNode.Depth();
+ eastl::pair<element::SElement *, QT3DSU32> theInsertedItem(&inNode, theIndex);
+ if (activeAndHasScript) {
+ if (inNode.m_ActivationManagerNode.m_Flags.HasScript() == false) {
+ scriptBuffer.push_back(theInsertedItem);
+ inNode.m_ActivationManagerNode.m_Flags.SetHasScript(true);
+ }
+ } else {
+ if (inNode.m_ActivationManagerNode.m_Flags.HasScript() == true) {
+ TElementAndSortKeyList::iterator theFind =
+ eastl::find(scriptBuffer.begin(), scriptBuffer.end(), theInsertedItem);
+ if (theFind != scriptBuffer.end())
+ scriptBuffer.erase(theFind);
+ inNode.m_ActivationManagerNode.m_Flags.SetHasScript(false);
+ }
+ }
+ }
+
+ static void HandleActivationChange(SElement &inNode, TElementAndSortKeyList &activateBuffer,
+ TElementAndSortKeyList &deactivateBuffer,
+ TElementAndSortKeyList &scriptBuffer,
+ Mutex &inElementAccessMutex, bool &scriptBufferRequiresSort,
+ bool inIsActive)
+ {
+ Mutex::ScopedLock __locker(inElementAccessMutex);
+ TElementAndSortKey theKey(&inNode, inNode.Depth());
+ if (inIsActive) {
+ activateBuffer.push_back(TElementAndSortKey(theKey));
+ } else {
+ deactivateBuffer.push_back(theKey);
+ }
+
+ if (inNode.Flags().HasScriptCallbacks()) {
+ UpdateItemScriptStatus(inNode, inIsActive, scriptBuffer);
+ scriptBufferRequiresSort = true;
+ }
+ inNode.SetGlobalActive(inIsActive);
+ }
+
+ // Runs once we notice that the item's global active status has changed.
+ // Note we explicitly do not update independent items because those are updated
+ // as the first step of each time context update itself.
+ // We do, however, remove them from the dirty list here.
+ static void RunActivateScan(SElement &inNode, TScanBuffer &inScanBuffer,
+ TElementAndSortKeyList &activateBuffer,
+ TElementAndSortKeyList &deactivateBuffer,
+ TElementAndSortKeyList &scriptBuffer, Mutex &inElementAccessMutex,
+ bool &scriptBufferRequiresSort, bool inRunFullScan)
+ {
+ inScanBuffer.clear();
+
+ // Block used to hide variables to avoid an error.
+ {
+ bool parentActive = true;
+ SElement *theParent = inNode.m_Parent;
+ if (theParent != NULL)
+ parentActive = theParent->IsGlobalActive();
+
+ inScanBuffer.push_back(SScanBufferEntry(&inNode, parentActive));
+ }
+
+ for (QT3DSU32 idx = 0, end = inScanBuffer.size(); idx < end; ++idx) {
+ SScanBufferEntry theEntry(inScanBuffer[idx]);
+ SElement *theScanNode = theEntry.m_Node;
+ QT3DS_ASSERT(theScanNode->IsIndependent() == false);
+ bool parentActive = theEntry.IsParentActive();
+ bool wasActive = theScanNode->IsGlobalActive();
+ bool isActive = theScanNode->IsGlobalActive(parentActive);
+ bool wasChildDirty = theScanNode->m_ActivationManagerNode.m_Flags.IsChildDirty();
+ theScanNode->m_ActivationManagerNode.m_Flags.ClearChildDirty();
+ bool activateChange = isActive != wasActive;
+ bool checkChildren = activateChange || (isActive && (wasChildDirty || inRunFullScan));
+ if (activateChange) {
+ HandleActivationChange(*theScanNode, activateBuffer, deactivateBuffer, scriptBuffer,
+ inElementAccessMutex, scriptBufferRequiresSort, isActive);
+ }
+
+ if (checkChildren && theScanNode->m_Child) {
+ for (SElement *theScanNodeChild = theScanNode->m_Child; theScanNodeChild;
+ theScanNodeChild = theScanNodeChild->m_Sibling) {
+ if (theScanNodeChild->IsIndependent() == false)
+ inScanBuffer.push_back(SScanBufferEntry(theScanNodeChild, isActive));
+ }
+ end = inScanBuffer.size();
+ }
+ }
+ }
+
+ void RunDirtyScan(TScanBuffer &inScanBuffer, TElementNodePtrList &inTempDirtyList,
+ TElementAndSortKeyList &activateBuffer,
+ TElementAndSortKeyList &deactivateBuffer,
+ TElementAndSortKeyList &scriptBuffer, bool &scriptBufferRequiresSort)
+ {
+ if (m_AllNodesDirty == true) {
+ inTempDirtyList.clear();
+ SComponent &myNode = m_Component;
+ for (SElement *theChild = myNode.m_Child; theChild; theChild = theChild->m_Sibling) {
+ // Independent nodes don't need to be in the dirty list.
+ if (theChild->IsIndependent() == false)
+ inTempDirtyList.push_back(theChild);
+ }
+ } else {
+ inTempDirtyList.assign(m_DirtyList.begin(), m_DirtyList.end());
+ // Reset nodes that are dirty to *not* be dirty.
+ m_DirtyList.clear();
+ // We have to sort the dirty list because it may have nodes out of order and the active
+ // algorithm requires parents before children. We use the depth member variable to
+ // achieve this.
+ eastl::sort(inTempDirtyList.begin(), inTempDirtyList.end(), SElementPtrSort());
+ }
+ for (QT3DSU32 idx = 0, end = (QT3DSU32)inTempDirtyList.size(); idx < end; ++idx) {
+ SElement &dirtyNode(*inTempDirtyList[idx]);
+ // This is slightly inefficient in the case where a both a child and parent are in the
+ // dirty list.
+ // This case has got to be extremely rare in practice, however.
+ RunActivateScan(dirtyNode, inScanBuffer, activateBuffer, deactivateBuffer, scriptBuffer,
+ m_ElementAccessMutex, scriptBufferRequiresSort, m_AllNodesDirty);
+ }
+ // Set at end so while debugging you can see if all nodes were dirty on method entry.
+ m_AllNodesDirty = false;
+ }
+
+ bool Update(TTimeUnit inGlobalTime, TScanBuffer &inScanBuffer,
+ TElementNodePtrList &inTempDirtyList, TElementAndSortKeyList &activateBuffer,
+ TElementAndSortKeyList &deactivateBuffer, TElementAndSortKeyList &scriptBuffer,
+ bool &scriptBufferRequiresSort, Q3DStudio::CComponentManager &inComponentManager,
+ IPerfTimer &inPerfTimer, IActivityZone &inZone)
+ {
+ QT3DSU64 start = qt3ds::foundation::Time::getCurrentCounterValue();
+ SComponent &theContextNode = m_Component;
+ bool parentActive = true;
+ SElement *theParent = theContextNode.m_Parent;
+ if (theParent != NULL)
+ parentActive = theParent->IsGlobalActive();
+
+ bool wasActive = theContextNode.IsGlobalActive();
+ bool isActive = theContextNode.IsGlobalActive(parentActive);
+ bool activationChange = isActive != wasActive;
+ inPerfTimer.Update("ActivationManager - Update Initial Vars",
+ qt3ds::foundation::Time::getCurrentCounterValue() - start);
+ if (activationChange) {
+ SStackPerfTimer __timer(inPerfTimer, "ActivationManager - Activation Change");
+ HandleActivationChange(theContextNode, activateBuffer, deactivateBuffer, scriptBuffer,
+ m_ElementAccessMutex, scriptBufferRequiresSort, isActive);
+ m_DirtyList.clear();
+ m_AllNodesDirty = true;
+ if (isActive) {
+ Mutex::ScopedLock __locker(m_ElementAccessMutex);
+ inComponentManager.GotoSlideIndex(&theContextNode, 1, false);
+ } else
+ RemoveOverride();
+ }
+ if (isActive) {
+ SStackPerfTimer __timer(inPerfTimer, "ActivationManager - Update Local Time");
+ bool atEndOfTime = CalculateNewTime(inGlobalTime);
+ if (atEndOfTime) {
+ Mutex::ScopedLock __locker(m_ElementAccessMutex);
+ if (theContextNode.IsPlayThrough())
+ inComponentManager.PlaythroughToSlide(&theContextNode);
+ }
+ // Note the slide may have changed here and thus updated our time policy.
+ // Set time active flags based on time.
+ UpdateLocalTime(m_TimePolicy.GetTime(), inScanBuffer, inZone);
+ }
+ if (isActive || activationChange) {
+ if (m_AllNodesDirty || m_DirtyList.size()) {
+ SStackPerfTimer __timer(inPerfTimer, "ActivationManager - Dirty Scan");
+ RunDirtyScan(inScanBuffer, inTempDirtyList, activateBuffer, deactivateBuffer,
+ scriptBuffer, scriptBufferRequiresSort);
+ }
+ }
+ return isActive || activationChange;
+ }
+
+ void GoToTime(TTimeUnit inTime)
+ {
+ if (m_TimePolicyOverride) {
+ m_TimePolicyOverride->SetTime(m_TimePolicy, inTime);
+ } else {
+ m_TimePolicy.SetTime(inTime);
+ }
+ }
+};
+
+IMPLEMENT_INVASIVE_SINGLE_LIST(TimeContext, m_NextSibling);
+
+struct SActivityZone : public IActivityZone
+{
+ typedef nvhash_map<SElement *, NVScopedRefCounted<STimeContext>> TComponentTimeContextMap;
+ NVFoundationBase &m_Foundation;
+ Q3DStudio::CPresentation &m_Presentation;
+ IStringTable &m_StringTable;
+ nvvector<SElement *> m_RootElements;
+ TComponentTimeContextMap m_TimeContexts;
+ // These could potentially not be sorted but for 7.5 and TZ3 I don't want to risk the
+ // bugs assocated with not producing the exact same output as the original algorithm.
+ TElementAndSortKeyList m_ActivatedItems;
+ TElementAndSortKeyList m_DeactivatedItems;
+
+ // This will always need to be sorted because it is maintained across update calls
+ TElementAndSortKeyList m_ScriptItems;
+
+ // Temporaries used while scanning nodes for various features.
+ TScanBuffer m_ScanBuffer;
+ TElementNodePtrList m_TempDirtyList;
+ nvvector<STimeContext *> m_TimeContextScanBuffer;
+
+ TTimeContextList m_RootContexts;
+ Mutex &m_ElementAccessMutex;
+ Mutex m_UpdateCheckMutex;
+ Sync m_UpdateSync;
+ TTimeUnit m_GlobalTime;
+ IPerfTimer *m_PerfTimer;
+ STypeDesc m_DummyTypeDesc;
+ SComponent m_DummyComponent;
+ STimeContext m_DummyContext;
+ bool m_Active;
+ // True if m_ScriptItems needs to be resorted.
+ bool m_ScriptRequiresSort;
+ bool m_Updating;
+
+ QT3DSI32 mRefCount;
+
+ SActivityZone(NVFoundationBase &inFnd, Q3DStudio::CPresentation &inPres,
+ IStringTable &inStrTable, Mutex &inElementAccessMutex)
+ : m_Foundation(inFnd)
+ , m_Presentation(inPres)
+ , m_StringTable(inStrTable)
+ , m_RootElements(inFnd.getAllocator(), "Elements")
+ , m_TimeContexts(inFnd.getAllocator(), "TimeContexts")
+ , m_ActivatedItems(inFnd.getAllocator(), "m_ActivatedItems")
+ , m_DeactivatedItems(inFnd.getAllocator(), "m_DeactivatedItems")
+ , m_ScriptItems(inFnd.getAllocator(), "m_ScriptItems")
+ , m_ScanBuffer(inFnd.getAllocator(), "m_ScanBuffer")
+ , m_TempDirtyList(inFnd.getAllocator(), "m_TempDirtyList")
+ , m_TimeContextScanBuffer(inFnd.getAllocator(), "m_TimeContextScanBuffer")
+ , m_ElementAccessMutex(inElementAccessMutex)
+ , m_UpdateCheckMutex(inFnd.getAllocator())
+ , m_UpdateSync(inFnd.getAllocator())
+ , m_GlobalTime(0)
+ , m_PerfTimer(NULL)
+ , m_DummyComponent(m_DummyTypeDesc)
+ , m_DummyContext(m_Foundation.getAllocator(), m_DummyComponent, m_ElementAccessMutex)
+ , m_Active(true)
+ , m_ScriptRequiresSort(true)
+ , m_Updating(false)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ Q3DStudio::CPresentation &GetPresentation() override { return m_Presentation; }
+
+ static void SortElementBuffer(nvvector<eastl::pair<element::SElement *, QT3DSU32>> &inBuffer)
+ {
+ eastl::sort(inBuffer.begin(), inBuffer.end(), SElementIndexPairSorter());
+ }
+
+ static void AddElementNodeToBuffer(nvvector<eastl::pair<element::SElement *, QT3DSU32>> &inBuffer,
+ SElement &inNode)
+ {
+ eastl::pair<element::SElement *, QT3DSU32> insertItem(&inNode, inNode.Depth());
+ QT3DS_ASSERT(eastl::find(inBuffer.begin(), inBuffer.end(), insertItem) == inBuffer.end());
+ inBuffer.push_back(insertItem);
+ }
+
+ TActivityItemBuffer GetActivatedItems() override { return m_ActivatedItems; }
+
+ TActivityItemBuffer GetDeactivatedItems() override { return m_DeactivatedItems; }
+ // All active items that are script enabled.
+ TActivityItemBuffer GetScriptItems() override
+ {
+ // Created in a delayed way.
+ if (m_ScriptRequiresSort) {
+ m_ScriptRequiresSort = false;
+ SortElementBuffer(m_ScriptItems);
+ }
+ return m_ScriptItems;
+ }
+
+ void SetZoneActive(bool inActive) override { m_Active = inActive; }
+ bool IsZoneActive() override { return m_Active; }
+
+ SActivationManagerNode *GetElementNodeForElement(TActivityItem item)
+ {
+ return &item.m_ActivationManagerNode;
+ }
+
+ STimeContext &GetItemTimeContext(SElement &inNode)
+ {
+ SElement &theComponent = inNode.GetComponentParent();
+ if (!theComponent.IsComponent()) {
+ QT3DS_ASSERT(false);
+ return m_DummyContext;
+ }
+
+ eastl::pair<TComponentTimeContextMap::iterator, bool> inserter = m_TimeContexts.insert(
+ eastl::make_pair(&theComponent, NVScopedRefCounted<STimeContext>()));
+ if (inserter.second) {
+ inserter.first->second = QT3DS_NEW(m_Foundation.getAllocator(), STimeContext)(
+ m_Foundation.getAllocator(), static_cast<SComponent &>(theComponent),
+ m_ElementAccessMutex);
+ STimeContext &theNewContext = *inserter.first->second;
+ if (theComponent.m_Parent == NULL)
+ m_RootContexts.push_back(theNewContext);
+ else {
+ STimeContext &parentContext = GetItemTimeContext(*theComponent.m_Parent);
+ parentContext.m_Children.push_back(theNewContext);
+ }
+ }
+ return *inserter.first->second.mPtr;
+ }
+
+ void AddActivityItems(TActivityItem inNode) override
+ {
+ if (inNode.m_Parent == NULL)
+ m_RootElements.push_back(&inNode);
+
+ GetItemTimeContext(inNode);
+ }
+
+ CTimePolicy *GetOwnedTimePolicy(TActivityItem item) override
+ {
+ return &GetItemTimeContext(item).m_TimePolicy;
+ }
+
+ virtual SComponentTimePolicyOverride *
+ GetOrCreateItemComponentOverride(TActivityItem item, float inMultiplier, TTimeUnit inEndTime,
+ IComponentTimeOverrideFinishedCallback *inCallback) override
+ {
+ STimeContext &theContext = GetItemTimeContext(item);
+
+ theContext.RemoveOverride();
+ theContext.m_TimePolicyOverride =
+ QT3DS_NEW(m_Foundation.getAllocator(),
+ SComponentTimePolicyOverride)(&item, inMultiplier, inEndTime, inCallback);
+ theContext.m_TimePolicy.SetPaused(false);
+
+ return theContext.m_TimePolicyOverride;
+ }
+
+ // If I am independent, then I am my own time parent.
+ // else travel up the chain till you find an indpendent node.
+ SElement &GetItemTimeParentNode(SElement &inNode)
+ {
+ if (inNode.m_Parent != NULL) {
+ SElement &theParent = *inNode.m_Parent;
+ if (theParent.IsIndependent())
+ return theParent;
+ return GetItemTimeParentNode(theParent);
+ }
+ // All roots are time independent by definition.
+ return inNode;
+ }
+
+ TActivityItemPtr GetItemTimeParent(SElement &inNode) override
+ {
+ return &GetItemTimeParentNode(inNode);
+ }
+
+ void InsertIntoAppropriateDirtyList(SElement &inNode)
+ {
+ // This may need to be faster at some point...
+ GetItemTimeContext(inNode).SetElementDirty(inNode);
+ }
+
+ bool GetItemUserActive(TActivityItem item) override { return item.IsExplicitActive(); }
+
+ void UpdateItemScriptStatus(TActivityItem item) override
+ {
+ if (item.IsGlobalActive()) {
+ STimeContext::UpdateItemScriptStatus(item, item.Flags().HasScriptCallbacks(),
+ m_ScriptItems);
+ m_ScriptRequiresSort = true;
+ }
+ }
+
+ void UpdateItemInfo(TActivityItem item) override { GetItemTimeContext(item).Reset(); }
+
+ // Order of events will be:
+ // 1. On Slide Change
+ // 2. Time Update
+ // 3. On Slide Change
+ // 4. Update Local Time
+ void OnSlideChange(TActivityItem item) override
+ {
+ STimeContext &theContext = GetItemTimeContext(item);
+ // Rebuilding the context sets all the elements dirty.
+ // This takes care of everything *but* the script item changes.
+ theContext.Reset();
+ theContext.RemoveOverride();
+ }
+
+ bool GetItemTimeActive(TActivityItem item) override
+ {
+ SActivationManagerNode *theNode = GetElementNodeForElement(item);
+ if (theNode)
+ return theNode->m_Flags.IsTimeActive();
+ return false;
+ }
+
+ TTimeUnit GetItemLocalTime(TActivityItem item) override
+ {
+ SElement *theElem = &item.GetComponentParent();
+ if (item.IsComponent() && item.m_Parent)
+ theElem = &item.m_Parent->GetComponentParent();
+
+ return GetItemTimeContext(*theElem).m_CurrentTime;
+ }
+
+ TTimeUnit GetItemComponentTime(TActivityItem item) override
+ {
+ return GetItemTimeContext(item).m_CurrentTime;
+ }
+
+ bool IsUpdating() override
+ {
+ Mutex::ScopedLock __locker(m_UpdateCheckMutex);
+ return m_Updating;
+ }
+
+ void EndUpdate() override
+ {
+ m_UpdateSync.reset();
+ while (IsUpdating())
+ m_UpdateSync.wait();
+ }
+
+ void DoUpdate()
+ {
+ SStackPerfTimer __timer(m_PerfTimer, "ActivationManager - DoUpdate");
+ if (m_Active) {
+ // We know that parent elements are added before children.
+ // So we know the time contexts are in an appropriate order, assuming they completely
+ // resolve their results before the next time context runs.
+ Q3DStudio::CComponentManager &theManager =
+ static_cast<Q3DStudio::CComponentManager &>(m_Presentation.GetComponentManager());
+ m_TimeContextScanBuffer.clear();
+
+ for (TTimeContextList::iterator iter = m_RootContexts.begin(),
+ end = m_RootContexts.end();
+ iter != end; ++iter)
+ m_TimeContextScanBuffer.push_back(&(*iter));
+
+ for (QT3DSU32 idx = 0, end = m_TimeContextScanBuffer.size(); idx < end; ++idx) {
+ STimeContext &theContext = *m_TimeContextScanBuffer[idx];
+ bool checkChildren =
+ theContext.Update(m_GlobalTime, m_ScanBuffer, m_TempDirtyList, m_ActivatedItems,
+ m_DeactivatedItems, m_ScriptItems, m_ScriptRequiresSort,
+ theManager, *m_PerfTimer, *this);
+ if (checkChildren) {
+ for (TTimeContextList::iterator timeIter = theContext.m_Children.begin(),
+ timeEnd = theContext.m_Children.end();
+ timeIter != timeEnd; ++timeIter) {
+ m_TimeContextScanBuffer.push_back(&(*timeIter));
+ }
+ end = m_TimeContextScanBuffer.size();
+ }
+ }
+ }
+
+ eastl::sort(m_ActivatedItems.begin(), m_ActivatedItems.end(), SElementIndexPairSorter());
+ eastl::sort(m_DeactivatedItems.begin(), m_DeactivatedItems.end(),
+ SElementIndexPairSorter());
+ Mutex::ScopedLock __locker(m_UpdateCheckMutex);
+ {
+ m_Updating = false;
+ m_UpdateSync.set();
+ }
+ }
+
+ static void UpdateCallback(void *data)
+ {
+ SActivityZone *theZone = reinterpret_cast<SActivityZone *>(data);
+ theZone->DoUpdate();
+ }
+
+ void BeginUpdate(TTimeUnit inGlobalTime, IPerfTimer &inPerfTimer,
+ IThreadPool &inThreadPool) override
+ {
+ // It is expected that an update is not running.
+ m_ActivatedItems.clear();
+ m_DeactivatedItems.clear();
+ m_GlobalTime = inGlobalTime;
+ m_PerfTimer = &inPerfTimer;
+ m_Updating = true;
+ inThreadPool.AddTask(this, UpdateCallback, NULL);
+ }
+
+ void GoToTime(TActivityItem inItem, TTimeUnit inTime) override
+ {
+ GetItemTimeContext(inItem).GoToTime(inTime);
+ }
+};
+
+struct SActivityZoneManager : public IActivityZoneManager
+{
+ NVFoundationBase &m_Foundation;
+ IStringTable &m_StringTable;
+ // Zones may access the element mutex on destruction *so* it is important that
+ // it is destroyed *after* the zone list.
+ Mutex m_ElementAccessMutex;
+ nvvector<NVScopedRefCounted<SActivityZone>> m_Zones;
+ QT3DSI32 mRefCount;
+
+ SActivityZoneManager(NVFoundationBase &fnd, IStringTable &inStrTable)
+ : m_Foundation(fnd)
+ , m_StringTable(inStrTable)
+ , m_ElementAccessMutex(m_Foundation.getAllocator())
+ , m_Zones(m_Foundation.getAllocator(), "m_Zones")
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ IActivityZone &CreateActivityZone(Q3DStudio::CPresentation &inPresentation) override
+ {
+ m_Zones.push_back(QT3DS_NEW(m_Foundation.getAllocator(), SActivityZone)(
+ m_Foundation, inPresentation, m_StringTable, m_ElementAccessMutex));
+ return *m_Zones.back().mPtr;
+ }
+};
+}
+
+IActivityZoneManager &
+IActivityZoneManager::CreateActivityZoneManager(NVFoundationBase &inFoundation,
+ IStringTable &inStrTable)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), SActivityZoneManager)(inFoundation, inStrTable);
+}
diff --git a/src/runtime/Qt3DSActivationManager.h b/src/runtime/Qt3DSActivationManager.h
new file mode 100644
index 0000000..f343ac9
--- /dev/null
+++ b/src/runtime/Qt3DSActivationManager.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_ACTIVATION_MANAGER_H
+#define QT3DS_ACTIVATION_MANAGER_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Utils.h"
+#include "Qt3DSKernelTypes.h"
+#include "Qt3DSMetadata.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "Qt3DSTimePolicy.h"
+
+namespace Q3DStudio {
+struct IComponentTimeOverrideFinishedCallback;
+struct SComponentTimePolicyOverride;
+class CPresentation;
+}
+
+namespace qt3ds {
+namespace foundation {
+ class IPerfTimer;
+}
+}
+
+namespace qt3ds {
+namespace render {
+ class IThreadPool;
+}
+}
+
+namespace qt3ds {
+namespace runtime {
+ using namespace qt3ds::foundation;
+ using namespace qt3ds;
+ using Q3DStudio::CTimePolicy;
+ using Q3DStudio::SComponentTimePolicyOverride;
+ using Q3DStudio::IComponentTimeOverrideFinishedCallback;
+ using Q3DStudio::CPresentation;
+ using Q3DStudio::TTimeUnit;
+ using qt3ds::render::IThreadPool;
+
+ class IActivationManager;
+
+ typedef element::SElement &TActivityItem;
+ typedef element::SElement *TActivityItemPtr;
+
+ typedef eastl::pair<element::SElement *, QT3DSU32> TElementAndSortKey;
+
+ typedef NVConstDataRef<TElementAndSortKey> TActivityItemBuffer;
+
+ // Items can have user active and time active. Time active is controlled by this object
+ // but user active can be set. An item is only active if it both actives are true.
+ // Inactive items have completely inactive children.
+ class IActivityZone
+ {
+ protected:
+ virtual ~IActivityZone() {}
+ public:
+ virtual Q3DStudio::CPresentation &GetPresentation() = 0;
+
+ // Items activated this cycle
+ virtual TActivityItemBuffer GetActivatedItems() = 0;
+ // Items deactivated this cycle
+ virtual TActivityItemBuffer GetDeactivatedItems() = 0;
+ // All active items that are script enabled.
+ virtual TActivityItemBuffer GetScriptItems() = 0;
+
+ // Inactive zones don't update their item lists when the manager updates.
+ virtual void SetZoneActive(bool inActive) = 0;
+ virtual bool IsZoneActive() = 0;
+
+ virtual void AddActivityItems(TActivityItem root) = 0;
+
+ // Get the time policy that is owned by this element.
+ virtual CTimePolicy *GetOwnedTimePolicy(TActivityItem item) = 0;
+ // Get the local time for this element. This is the time the animation system should see
+ virtual TTimeUnit GetItemLocalTime(TActivityItem item) = 0;
+ // Get the local time if this isn't independent, else get the time context time for the
+ // component.
+ virtual TTimeUnit GetItemComponentTime(TActivityItem item) = 0;
+
+ virtual SComponentTimePolicyOverride *
+ GetOrCreateItemComponentOverride(TActivityItem item, float inMultiplier,
+ TTimeUnit inEndTime,
+ IComponentTimeOverrideFinishedCallback *inCallback) = 0;
+
+ // If this item is independent, return this item.
+ // else get time parent of my parent.
+ virtual TActivityItemPtr GetItemTimeParent(TActivityItem item) = 0;
+
+ bool IsIndependent(TActivityItem item) { return GetOwnedTimePolicy(item) != NULL; }
+
+ // Any time the item has script flag changes after its initial creation.
+ // Note that this flag cannot change due to slide changes, it can only change due
+ // to something that had a script error and thus is disabled.
+ virtual void UpdateItemScriptStatus(TActivityItem item) = 0;
+
+ // If the start, end, or explicit active flags change *outside* of a slide change.
+ virtual void UpdateItemInfo(TActivityItem item) = 0;
+ virtual bool GetItemUserActive(TActivityItem item) = 0;
+
+ // Callback when the slide changes, the time context needs to be rebuilt in this case.
+ virtual void OnSlideChange(TActivityItem item) = 0;
+
+ virtual bool GetItemTimeActive(TActivityItem item) = 0;
+
+ virtual void BeginUpdate(QT3DSI64 inGlobalTime, IPerfTimer &inPerfTimer,
+ IThreadPool &inThreadPool) = 0;
+ virtual bool IsUpdating() = 0;
+ virtual void EndUpdate() = 0;
+
+ virtual void GoToTime(TActivityItem item, TTimeUnit inTime) = 0;
+ };
+
+ class IActivityZoneManager : public NVRefCounted
+ {
+ protected:
+ virtual ~IActivityZoneManager() {}
+ public:
+ virtual IActivityZone &CreateActivityZone(Q3DStudio::CPresentation &inPresentation) = 0;
+
+ static IActivityZoneManager &CreateActivityZoneManager(NVFoundationBase &inFoundation,
+ IStringTable &inStrTable);
+ };
+}
+}
+#endif
diff --git a/src/runtime/Qt3DSAnimationSystem.cpp b/src/runtime/Qt3DSAnimationSystem.cpp
new file mode 100644
index 0000000..84d1c6d
--- /dev/null
+++ b/src/runtime/Qt3DSAnimationSystem.cpp
@@ -0,0 +1,432 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "RuntimePrefix.h"
+#include "Qt3DSTypes.h"
+#include "Qt3DSAnimationSystem.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSInvasiveSet.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSPool.h"
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSCubicRoots.h"
+#include "Qt3DSBezierEval.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/IOStreams.h"
+#include "EASTL/sort.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSIndexableLinkedList.h"
+
+using namespace qt3ds::runtime;
+using namespace qt3ds::runtime::element;
+
+namespace {
+
+struct SAnimationKey
+{
+ QT3DSF32 m_Time; ///< Time
+ QT3DSF32 m_Value; ///< Value
+ QT3DSF32 m_C1Time; ///< Control 1 time
+ QT3DSF32 m_C1Value; ///< Control 1 value
+ QT3DSF32 m_C2Time; ///< Control 2 time
+ QT3DSF32 m_C2Value; ///< Control 2 value
+ SAnimationKey()
+ : m_Time(0)
+ , m_Value(0)
+ , m_C1Time(0)
+ , m_C1Value(0)
+ , m_C2Time(0)
+ , m_C2Value(0)
+ {
+ }
+
+ SAnimationKey(float time, float val, float c1time, float c1value, float c2time, float c2value)
+ : m_Time(time)
+ , m_Value(val)
+ , m_C1Time(c1time)
+ , m_C1Value(c1value)
+ , m_C2Time(c2time)
+ , m_C2Value(c2value)
+ {
+ }
+};
+
+struct SAnimationKeyNode
+{
+ enum {
+ AnimationKeyArraySize = 4,
+ };
+
+ SAnimationKey m_Data[AnimationKeyArraySize];
+ SAnimationKeyNode *m_NextNode;
+ SAnimationKeyNode()
+ : m_NextNode(NULL)
+ {
+ }
+};
+
+typedef IndexableLinkedList<SAnimationKeyNode, SAnimationKey,
+ SAnimationKeyNode::AnimationKeyArraySize>
+ TAnimationKeyNodeList;
+
+struct SAnimationTrack
+{
+ SElement *m_Element;
+ QT3DSI32 m_Id;
+ QT3DSU32 m_PropertyIndex;
+ QT3DSU32 m_KeyCount;
+ SAnimationKeyNode *m_Keys;
+ QT3DSU32 m_ActiveSetIndex;
+ bool m_Dynamic;
+
+ SAnimationTrack()
+ : m_Element(NULL)
+ , m_Id(0)
+ , m_PropertyIndex(0)
+ , m_KeyCount(0)
+ , m_Keys(NULL)
+ , m_ActiveSetIndex(QT3DS_MAX_U32)
+ , m_Dynamic(false)
+ {
+ }
+ SAnimationTrack(SElement &inElement, QT3DSI32 inId, QT3DSU32 inPropertyIndex, bool inIsDynamic)
+ : m_Element(&inElement)
+ , m_Id(inId)
+ , m_PropertyIndex(inPropertyIndex)
+ , m_KeyCount(0)
+ , m_Keys(NULL)
+ , m_ActiveSetIndex(QT3DS_MAX_U32)
+ , m_Dynamic(inIsDynamic)
+ {
+ }
+};
+
+struct GetAnimationTrackActiveSetIndex
+{
+ QT3DSU32 operator()(const SAnimationTrack &inTrack) const { return inTrack.m_ActiveSetIndex; }
+};
+
+struct SetAnimationTrackActiveSetIndex
+{
+ void operator()(SAnimationTrack &inTrack, QT3DSU32 inIdx) { inTrack.m_ActiveSetIndex = inIdx; }
+};
+
+typedef InvasiveSet<SAnimationTrack, GetAnimationTrackActiveSetIndex,
+ SetAnimationTrackActiveSetIndex>
+ TAnimationTrackActiveSet;
+
+struct SAnimationTrackComparator
+{
+ bool operator()(SAnimationTrack *lhs, SAnimationTrack *rhs) const
+ {
+ return lhs->m_Id < rhs->m_Id;
+ }
+};
+
+struct SAnimSystem : public IAnimationSystem
+{
+ typedef nvhash_map<QT3DSI32, SAnimationTrack *> TAnimationTrackHash;
+
+ NVFoundationBase &m_Foundation;
+ Pool<SAnimationTrack, ForwardingAllocator> m_AnimationTrackPool;
+ Pool<SAnimationKeyNode, ForwardingAllocator> m_AnimationKeyNodePool;
+ TAnimationTrackHash m_Tracks;
+ SAnimationTrack *m_LastInsertedTrack;
+ TAnimationTrackActiveSet m_ActiveSet;
+ NVDataRef<QT3DSU8> m_LoadData;
+ QT3DSI32 m_NextTrackId;
+ QT3DSI32 m_RefCount;
+
+ SAnimSystem(NVFoundationBase &inFoundation)
+ : m_Foundation(inFoundation)
+ , m_AnimationTrackPool(
+ ForwardingAllocator(inFoundation.getAllocator(), "AnimationTrackPool"))
+ , m_AnimationKeyNodePool(
+ ForwardingAllocator(inFoundation.getAllocator(), "AnimationKeyNodePool"))
+ , m_Tracks(inFoundation.getAllocator(), "m_Tracks")
+ , m_LastInsertedTrack(NULL)
+ , m_ActiveSet(inFoundation.getAllocator(), "m_ActiveSet")
+ , m_NextTrackId(1)
+ , m_RefCount(0)
+ {
+ }
+
+ static QT3DSI32 IncrementTrackId(QT3DSI32 inTrackId)
+ {
+ ++inTrackId;
+ if (!inTrackId)
+ ++inTrackId;
+ return inTrackId;
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc = m_Foundation.getAllocator();
+ NVDelete(alloc, this);
+ }
+ }
+
+ QT3DSI32 CreateAnimationTrack(element::SElement &inElement, QT3DSU32 inPropertyName,
+ bool inDynamic) override
+ {
+ // first, make sure we can find the property.
+ Option<QT3DSU32> theIndex = inElement.FindPropertyIndex(inPropertyName);
+ Option<TPropertyDescAndValuePtr> theProperty;
+ if (theIndex.hasValue())
+ theProperty = inElement.GetPropertyByIndex(*theIndex);
+
+ if (theProperty.hasValue() == false
+ || theProperty->first.m_Type != Q3DStudio::ATTRIBUTETYPE_FLOAT) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ eastl::pair<TAnimationTrackHash::iterator, bool> inserter;
+ // Find unused track id.
+ for (inserter = m_Tracks.insert(eastl::make_pair(m_NextTrackId, (SAnimationTrack *)NULL));
+ inserter.second == false; m_NextTrackId = IncrementTrackId(m_NextTrackId)) {
+ }
+
+ SAnimationTrack *theNewTrack =
+ reinterpret_cast<SAnimationTrack *>(m_AnimationTrackPool.allocate(__FILE__, __LINE__));
+ new (theNewTrack) SAnimationTrack(inElement, inserter.first->first, *theIndex, inDynamic);
+ inserter.first->second = theNewTrack;
+ m_LastInsertedTrack = theNewTrack;
+ ++m_NextTrackId;
+ return inserter.first->first;
+ }
+
+ SAnimationKey *GetKeyByIndex(QT3DSU32 inIndex, SAnimationTrack &inTrack)
+ {
+ if (inIndex >= inTrack.m_KeyCount)
+ return 0;
+
+ return &TAnimationKeyNodeList::GetObjAtIdx(inTrack.m_Keys, inIndex);
+ }
+
+ SAnimationKey &GetOrCreateKeyByIndex(QT3DSU32 inIndex, SAnimationTrack &inTrack)
+ {
+ if (inIndex < inTrack.m_KeyCount)
+ return *GetKeyByIndex(inIndex, inTrack);
+
+ return TAnimationKeyNodeList::Create(inTrack.m_Keys, inTrack.m_KeyCount,
+ m_AnimationKeyNodePool);
+ }
+
+ void AddKey(QT3DSF32 inTime, QT3DSF32 inValue, QT3DSF32 inC1Time, QT3DSF32 inC1Value,
+ QT3DSF32 inC2Time, QT3DSF32 inC2Value) override
+ {
+ if (m_LastInsertedTrack == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SAnimationKey &theNewKey =
+ GetOrCreateKeyByIndex(m_LastInsertedTrack->m_KeyCount, *m_LastInsertedTrack);
+ theNewKey = SAnimationKey(inTime, inValue, inC1Time, inC1Value, inC2Time, inC2Value);
+ }
+
+ SAnimationTrack *GetAnimationTrack(QT3DSI32 inTrackId)
+ {
+ TAnimationTrackHash::iterator iter = m_Tracks.find(inTrackId);
+ if (iter != m_Tracks.end())
+ return iter->second;
+ return NULL;
+ }
+
+ struct SNextKeyRetVal
+ {
+ SAnimationKeyNode *m_Node;
+ SAnimationKey *m_Start;
+ SAnimationKey *m_End;
+
+ SNextKeyRetVal(SAnimationKeyNode &inNode)
+ : m_Node(&inNode)
+ , m_Start(NULL)
+ , m_End(NULL)
+ {
+ }
+ SNextKeyRetVal(SAnimationKeyNode &inNode, SAnimationKey &inLastKey)
+ : m_Node(&inNode)
+ , m_Start(NULL)
+ , m_End(&inLastKey)
+ {
+ }
+ SNextKeyRetVal(SAnimationKeyNode &inNode, SAnimationKey &inStart, SAnimationKey &inLastKey)
+ : m_Node(&inNode)
+ , m_Start(&inStart)
+ , m_End(&inLastKey)
+ {
+ }
+ SNextKeyRetVal()
+ : m_Node(NULL)
+ , m_Start(NULL)
+ , m_End(NULL)
+ {
+ }
+ };
+
+ SNextKeyRetVal NextKeyIsGreaterThan(TAnimationKeyNodeList::iterator iter, QT3DSF32 inTime)
+ {
+ SAnimationKey *theStartKey = &(*iter);
+ QT3DSU32 nextIdx = iter.m_Idx + 1;
+ if (nextIdx == iter.m_Count)
+ return SNextKeyRetVal(*iter.m_Node, *theStartKey);
+
+ TAnimationKeyNodeList::iterator next = iter;
+ ++next;
+
+ SAnimationKey &nextKey = *next;
+
+ if (nextKey.m_Time >= inTime)
+ return SNextKeyRetVal(*iter.m_Node, *theStartKey, nextKey);
+ return SNextKeyRetVal(*iter.m_Node);
+ }
+
+ QT3DSF32 Evaluate(SAnimationTrack &inTrack, QT3DSF32 inTime)
+ {
+ if (inTrack.m_KeyCount < 2) {
+ if (inTrack.m_KeyCount == 1)
+ return GetKeyByIndex(0, inTrack)->m_Value;
+ return 0.0f;
+ }
+
+ TAnimationKeyNodeList::iterator iter =
+ TAnimationKeyNodeList::begin(inTrack.m_Keys, inTrack.m_KeyCount);
+
+ if ((*iter).m_Time >= inTime) {
+ return (*iter).m_Value;
+ }
+
+ // We know it isn't the first key.
+ SNextKeyRetVal theKeyData;
+ for (theKeyData = NextKeyIsGreaterThan(iter, inTime); theKeyData.m_End == NULL;
+ ++iter, theKeyData = NextKeyIsGreaterThan(iter, inTime)) {
+ }
+
+ if (theKeyData.m_Node == NULL && theKeyData.m_End == NULL) {
+ QT3DS_ASSERT(false);
+ return 0.0f;
+ }
+
+ if (theKeyData.m_Start != NULL) {
+ SAnimationKey &start(*theKeyData.m_Start);
+ SAnimationKey &end(*theKeyData.m_End);
+ return Q3DStudio::EvaluateBezierKeyframe(
+ inTime, start.m_Time, start.m_Value, start.m_C1Time, start.m_C1Value,
+ start.m_C2Time, start.m_C2Value, end.m_Time, end.m_Value);
+ }
+ return theKeyData.m_End->m_Value;
+ }
+
+ void Update() override
+ {
+ for (QT3DSU32 idx = 0, end = m_ActiveSet.size(); idx < end; ++idx) {
+ SAnimationTrack &theTrack = *m_ActiveSet[idx];
+ SElement &theElement = *theTrack.m_Element;
+ QT3DSF32 theTime = static_cast<QT3DSF32>(theElement.GetOuterTime());
+ TPropertyDescAndValuePtr theProperty =
+ *theElement.GetPropertyByIndex(theTrack.m_PropertyIndex);
+ Q3DStudio::UVariant &theValue(*theProperty.second);
+ QT3DSF32 newValue = Evaluate(theTrack, theTime);
+ if (fabs(theValue.m_FLOAT - newValue) > SElement::SmallestDifference()) {
+ theValue.m_FLOAT = newValue;
+ theElement.SetDirty();
+ }
+ }
+ }
+
+ void SetActive(QT3DSI32 inTrackId, bool inActive) override
+ {
+ SAnimationTrack *theTrack = GetAnimationTrack(inTrackId);
+ if (theTrack) {
+ if (inActive)
+ m_ActiveSet.insert(*theTrack);
+ else
+ m_ActiveSet.remove(*theTrack);
+ }
+ }
+ //==============================================================================
+ /**
+ * Recomputes control point values for Studio animation based off of new start
+ * value.
+ * @param inNewStartValue new start value for the keyframe
+ * @param inKeyStart start index of the keyframes
+ */
+ void RecomputeControlPoints(QT3DSF32 inNewStartValue, SAnimationTrack &inTrack)
+ {
+ SAnimationKey &theFirstKey = *GetKeyByIndex(0, inTrack);
+ SAnimationKey &theSecondKey = *GetKeyByIndex(1, inTrack);
+
+ // Determine original control point ratios
+ Q3DStudio::FLOAT theOriginalInterval =
+ (theSecondKey.m_Value - theFirstKey.m_Value) * (1.0f / 3.0f);
+ Q3DStudio::FLOAT theEaseOutRatio = theOriginalInterval != 0.0f
+ ? (theFirstKey.m_C1Value - theFirstKey.m_Value) / theOriginalInterval
+ : 0.0f;
+ Q3DStudio::FLOAT theEaseInRatio = theOriginalInterval != 0.0f
+ ? (theSecondKey.m_Value - theFirstKey.m_C2Value) / theOriginalInterval
+ : 0.0f;
+
+ // Apply ratios based off new start value
+ Q3DStudio::FLOAT theNewInterval = (theSecondKey.m_Value - inNewStartValue) * (1.0f / 3.0f);
+ theFirstKey.m_C1Value = inNewStartValue + (theNewInterval * theEaseOutRatio);
+ theFirstKey.m_C2Value = theSecondKey.m_Value - (theNewInterval * theEaseInRatio);
+ }
+
+ void UpdateDynamicKey(QT3DSI32 inTrackId) override
+ {
+ SAnimationTrack *theTrack = GetAnimationTrack(inTrackId);
+ if (theTrack && theTrack->m_Dynamic) {
+ SAnimationKey *theFirstKey = GetKeyByIndex(0, *theTrack);
+ if (theFirstKey) {
+ Q3DStudio::UVariant *thePropData =
+ theTrack->m_Element->GetPropertyByIndex(theTrack->m_PropertyIndex)->second;
+
+ // Recompute interpolation
+ if (theTrack->m_KeyCount > 1)
+ RecomputeControlPoints(thePropData->m_FLOAT, *theTrack);
+
+ // Update start value
+ theFirstKey->m_Value = thePropData->m_FLOAT;
+ }
+ }
+ }
+};
+}
+
+IAnimationSystem &IAnimationSystem::CreateAnimationSystem(NVFoundationBase &inFoundation)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), SAnimSystem)(inFoundation);
+}
diff --git a/src/runtime/Qt3DSAnimationSystem.h b/src/runtime/Qt3DSAnimationSystem.h
new file mode 100644
index 0000000..24542ad
--- /dev/null
+++ b/src/runtime/Qt3DSAnimationSystem.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_ANIMATION_SYSTEM_H
+#define QT3DS_ANIMATION_SYSTEM_H
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSRefCounted.h"
+
+#pragma once
+namespace qt3ds {
+namespace foundation {
+ class IOutStream;
+}
+}
+
+namespace qt3ds {
+namespace runtime {
+ using namespace qt3ds;
+ using namespace qt3ds::foundation;
+
+ namespace element {
+ struct SElement;
+ }
+ class IElementAllocator;
+
+ class IAnimationSystem : public NVRefCounted
+ {
+ public:
+ virtual QT3DSI32 CreateAnimationTrack(element::SElement &inElement, QT3DSU32 inPropertyName,
+ bool inDynamic) = 0;
+ virtual void AddKey(QT3DSF32 inTime, QT3DSF32 inValue, QT3DSF32 inC1Time, QT3DSF32 inC1Value,
+ QT3DSF32 inC2Time, QT3DSF32 inC2Value) = 0;
+ virtual void Update() = 0;
+ virtual void SetActive(QT3DSI32 inTrackId, bool inActive) = 0;
+ virtual void UpdateDynamicKey(QT3DSI32 inTrackId) = 0;
+
+ static IAnimationSystem &CreateAnimationSystem(NVFoundationBase &inFoundation);
+ };
+}
+}
+
+#endif
diff --git a/src/runtime/Qt3DSApplication.cpp b/src/runtime/Qt3DSApplication.cpp
new file mode 100644
index 0000000..baa94dd
--- /dev/null
+++ b/src/runtime/Qt3DSApplication.cpp
@@ -0,0 +1,2180 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+// We need a Qt header first here because Qt's metatype system insists that Bool
+// can not be defined first before Qt headers are included and the includes below
+// define Bool by way of Xll/XLib.h via khronos -> egl -> X11
+#include <QImage>
+
+#include "RuntimePrefix.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSApplicationValues.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSMemory.h"
+#include "Qt3DSRuntimeFactory.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSIScriptBridge.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/XML.h"
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSContainers.h"
+#include "EASTL/hash_map.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSInputEventTypes.h"
+#include "Qt3DSSceneManager.h"
+#include "Qt3DSIScene.h"
+#include "Qt3DSInputEngine.h"
+#include "Qt3DSMetadata.h"
+#include "Qt3DSUIPParser.h"
+#include "foundation/Socket.h"
+#include "EventPollingSystem.h"
+#include "Qt3DSRenderContextCore.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/SerializationTypes.h"
+#include "EASTL/sort.h"
+#include "Qt3DSRenderBufferLoader.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSSync.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderThreadPool.h"
+#include "foundation/StringConversionImpl.h"
+#include "Qt3DSRenderLoadedTexture.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSActivationManager.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSAudioPlayer.h"
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSSlideSystem.h"
+#include "Qt3DSQmlElementHelper.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderRenderList.h"
+#include "Qt3DSRenderImageBatchLoader.h"
+#include <QtCore/qlibraryinfo.h>
+#include <QtCore/qpair.h>
+#include <QtCore/qdir.h>
+#include "q3dsvariantconfig_p.h"
+
+using namespace qt3ds;
+using namespace qt3ds::runtime;
+using namespace qt3ds::render;
+using namespace Q3DStudio;
+
+namespace qt3ds {
+namespace foundation {
+template <>
+struct StringConversion<QT3DSVec2>
+{
+ void StrTo(const char8_t *buffer, QT3DSVec2 &item)
+ {
+ char *endPtr = NULL;
+ item.x = (float)strtod(buffer, &endPtr);
+ if (endPtr)
+ item.y = (float)strtod(endPtr, NULL);
+ }
+};
+}
+}
+
+bool qt3ds::runtime::isImagePath(const QString &path)
+{
+ int index = path.lastIndexOf(QLatin1Char('.'));
+ if (index < 0)
+ return false;
+ const QString ext = path.right(path.length() - index - 1);
+ return (ext == QLatin1String("jpg") || ext == QLatin1String("jpeg")
+ || ext == QLatin1String("png") || ext == QLatin1String("hdr")
+ || ext == QLatin1String("dds") || ext == QLatin1String("ktx"));
+}
+
+struct SFrameTimer
+{
+ int m_FrameCount;
+ QT3DSU64 m_FrameTime;
+ SFrameTimer(QT3DSU64 fc = 0)
+ : m_FrameCount(fc)
+ , m_FrameTime(qt3ds::foundation::Time::getCurrentCounterValue())
+ {
+ }
+
+ QT3DSF32 GetElapsedSeconds(QT3DSU64 currentTime) const
+ {
+ QT3DSU64 diff = currentTime - m_FrameTime;
+ QT3DSF32 diffNanos
+ = static_cast<QT3DSF32>(qt3ds::foundation::Time::sCounterFreq.toTensOfNanos(diff));
+ return diffNanos / qt3ds::foundation::Time::sNumTensOfNanoSecondsInASecond;
+ }
+
+ QT3DSF32 GetElapsedSeconds() const
+ {
+ return GetElapsedSeconds(qt3ds::foundation::Time::getCurrentCounterValue());
+ }
+
+ QPair<QT3DSF32, int> GetFPS(int updateFC)
+ {
+ int elapsedFrames = updateFC - m_FrameCount;
+ QT3DSU64 currentTime = qt3ds::foundation::Time::getCurrentCounterValue();
+ QT3DSF32 elapsedSeconds = GetElapsedSeconds(currentTime);
+ QT3DSF32 retval = elapsedFrames / elapsedSeconds;
+ m_FrameCount = updateFC;
+ m_FrameTime = currentTime;
+ return qMakePair(retval, elapsedFrames);
+ }
+};
+
+struct SRefCountedAssetValue : public SAssetValue
+{
+ NVFoundationBase &m_Foundation;
+ QT3DSI32 mRefCount;
+ SRefCountedAssetValue(NVFoundationBase &fnd)
+ : SAssetValue()
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+
+ SRefCountedAssetValue(NVFoundationBase &fnd, const SAssetValue &asset)
+ : SAssetValue(asset)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+
+ SRefCountedAssetValue(NVFoundationBase &fnd, const SPresentationAsset &asset)
+ : SAssetValue(asset)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+
+ SRefCountedAssetValue(NVFoundationBase &fnd, const SBehaviorAsset &asset)
+ : SAssetValue(asset)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+
+ SRefCountedAssetValue(NVFoundationBase &fnd, const SRenderPluginAsset &asset)
+ : SAssetValue(asset)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+
+ SRefCountedAssetValue(NVFoundationBase &fnd, const SSCXMLAsset &asset)
+ : SAssetValue(asset)
+ , m_Foundation(fnd)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+};
+
+typedef nvhash_map<CRegisteredString, NVScopedRefCounted<SRefCountedAssetValue>> TIdAssetMap;
+typedef nvhash_map<THashValue, CRegisteredString> THashStrMap;
+typedef nvvector<eastl::pair<CRegisteredString, NVScopedRefCounted<SRefCountedAssetValue>>>
+TIdAssetList;
+typedef eastl::pair<QT3DSU32, TElement *> THandleElementPair;
+typedef NVConstDataRef<THandleElementPair> THandleElementDataBuffer;
+typedef nvvector<THandleElementDataBuffer> THandleElementDataBufferList;
+typedef nvhash_map<QT3DSU32, TElement *> THandleElementMap;
+
+struct SHandleElementPairComparator
+{
+ bool operator()(const THandleElementPair &lhs, const THandleElementPair &rhs) const
+ {
+ return lhs.first < rhs.first;
+ }
+};
+
+struct SSlideResourceCounter
+{
+ QHash<QString, int> counters;
+ QSet<QString> createSet;
+ QSet<QString> deleteSet;
+
+ QVector<QString> loadedSlides;
+
+ void increment(const QSet<QString> &set)
+ {
+ for (auto &r : set) {
+ if (counters.value(r, 0) == 0)
+ createSet.insert(r);
+ counters[r]++;
+ }
+ }
+ void decrement(const QSet<QString> &set)
+ {
+ for (auto &r : set) {
+ if (counters.contains(r)) {
+ int count = qMax(counters[r] - 1, 0);
+ if (count == 0)
+ deleteSet.insert(r);
+ counters[r] = count;
+ }
+ }
+ }
+ void begin()
+ {
+ createSet.clear();
+ deleteSet.clear();
+ }
+ void reset()
+ {
+ loadedSlides.clear();
+ counters.clear();
+ begin();
+ }
+ QSet<QString> toImageSet(const QVector<QString> &vec)
+ {
+ QSet<QString> s;
+ for (const auto &x : vec) {
+ if (isImagePath(x))
+ s.insert(x);
+ }
+ return s;
+ }
+ void handleLoadSlide(const QString &slide, SSlideKey key, ISlideSystem &slideSystem)
+ {
+ if (loadedSlides.contains(slide))
+ return;
+ loadedSlides.push_back(slide);
+ begin();
+ increment(toImageSet(slideSystem.GetSourcePaths(key)));
+ print();
+ }
+ void handleUnloadSlide(const QString &slide, SSlideKey key, ISlideSystem &slideSystem)
+ {
+ if (!loadedSlides.contains(slide))
+ return;
+ loadedSlides.removeOne(slide);
+ begin();
+ decrement(toImageSet(slideSystem.GetSourcePaths(key)));
+ print();
+ }
+ void print()
+ {
+ static const bool debugging = qEnvironmentVariableIntValue("QT3DS_DEBUG") >= 1;
+ if (debugging) {
+ qDebug() << "SlideResourceCounter resources:";
+ const auto keys = counters.keys();
+ for (auto &x : keys)
+ qDebug() << x << ": " << counters[x];
+ if (createSet.size()) {
+ qDebug() << "New resources: ";
+ for (auto y : qAsConst(createSet))
+ qDebug() << y;
+ }
+ if (deleteSet.size()) {
+ qDebug() << "Deleted resources: ";
+ for (auto y : qAsConst(deleteSet))
+ qDebug() << y;
+ }
+ }
+ }
+};
+
+struct STextureUploadRenderTask : public IRenderTask, public IImageLoadListener
+{
+ IImageBatchLoader &m_batchLoader;
+ IBufferManager &m_bufferManager;
+ NVRenderContextType m_type;
+ bool m_preferKtx;
+ QSet<QString> m_uploadSet;
+ QSet<QString> m_uploadWaitSet;
+ QSet<QString> m_deleteSet;
+ QMutex m_updateMutex;
+ QHash<QT3DSU32, QSet<QString>> m_batches;
+ volatile QT3DSI32 mRefCount;
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_bufferManager.GetStringTable()
+ .GetAllocator())
+
+ STextureUploadRenderTask(IImageBatchLoader &loader, IBufferManager &mgr,
+ NVRenderContextType type, bool preferKtx)
+ : m_batchLoader(loader), m_bufferManager(mgr), m_type(type), m_preferKtx(preferKtx),
+ mRefCount(0)
+ {
+
+ }
+ void Run() override
+ {
+ QMutexLocker loc(&m_updateMutex);
+ if (!m_uploadSet.isEmpty()) {
+ nvvector<CRegisteredString> sourcePaths(m_bufferManager.GetStringTable().GetAllocator(),
+ "TempSourcePathList");
+ for (auto &s : qAsConst(m_uploadSet))
+ sourcePaths.push_back(m_bufferManager.GetStringTable().RegisterStr(s));
+ QT3DSU32 id = m_batchLoader.LoadImageBatch(sourcePaths, CRegisteredString(),
+ this, m_type, m_preferKtx, false);
+ if (id)
+ m_batches[id] = m_uploadSet;
+ }
+ if (!m_uploadWaitSet.isEmpty()) {
+ nvvector<CRegisteredString> sourcePaths(m_bufferManager.GetStringTable().GetAllocator(),
+ "TempSourcePathList");
+ for (auto &s : qAsConst(m_uploadWaitSet))
+ sourcePaths.push_back(m_bufferManager.GetStringTable().RegisterStr(s));
+ QT3DSU32 id = m_batchLoader.LoadImageBatch(sourcePaths, CRegisteredString(),
+ this, m_type, m_preferKtx, false);
+ if (id) {
+ m_batchLoader.BlockUntilLoaded(id);
+ m_bufferManager.loadSet(m_uploadWaitSet);
+ }
+ }
+ m_bufferManager.unloadSet(m_deleteSet);
+ }
+ void add(const QSet<QString> &set, bool wait)
+ {
+ QMutexLocker loc(&m_updateMutex);
+ if (wait)
+ m_uploadWaitSet.unite(set);
+ else
+ m_uploadSet.unite(set);
+ m_deleteSet.subtract(set);
+ }
+ void remove(const QSet<QString> &set)
+ {
+ QMutexLocker loc(&m_updateMutex);
+ m_uploadSet.subtract(set);
+ m_uploadWaitSet.subtract(set);
+ m_deleteSet.unite(set);
+ }
+ bool persistent() const override
+ {
+ return true;
+ }
+ void OnImageLoadComplete(CRegisteredString inPath, ImageLoadResult::Enum inResult) override
+ {
+ Q_UNUSED(inPath);
+ Q_UNUSED(inResult);
+ }
+ void OnImageBatchComplete(QT3DSU64 inBatch) override
+ {
+ m_bufferManager.loadSet(m_batches[inBatch]);
+ }
+};
+
+struct SApp;
+
+class IAppLoadContext : public NVRefCounted
+{
+public:
+ virtual void EndLoad() = 0;
+ virtual bool OnGraphicsInitialized(IRuntimeFactory &inFactory) = 0;
+ virtual bool HasCompletedLoading() = 0;
+ static IAppLoadContext &CreateXMLLoadContext(
+ SApp &inApp, const char8_t *inScaleMode);
+};
+
+inline float Clamp(float val, float inMin = 0.0f, float inMax = 1.0f)
+{
+ if (val < inMin)
+ return inMin;
+ if (val > inMax)
+ return inMax;
+ return val;
+}
+
+// A set of common settings that may come from the UIA or from the command line.
+// command line settings always override uia settings.
+struct SApplicationSettings
+{
+ Option<bool> m_LayerCacheEnabled;
+ Option<bool> m_LayerGpuProfilingEnabled;
+ Option<bool> m_ShaderCachePersistenceEnabled;
+
+ SApplicationSettings() {}
+
+ template <typename TDataType>
+ static Option<TDataType> Choose(const Option<TDataType> &inCommandLine,
+ const Option<TDataType> &inUIAFile)
+ {
+ if (inCommandLine.hasValue())
+ return inCommandLine;
+ return inUIAFile;
+ }
+
+ SApplicationSettings(const SApplicationSettings &inCommandLine,
+ const SApplicationSettings &inUIAFileSettings)
+ : m_LayerCacheEnabled(
+ Choose(inCommandLine.m_LayerCacheEnabled, inUIAFileSettings.m_LayerCacheEnabled))
+ , m_LayerGpuProfilingEnabled(Choose(inCommandLine.m_LayerGpuProfilingEnabled,
+ inUIAFileSettings.m_LayerGpuProfilingEnabled))
+ , m_ShaderCachePersistenceEnabled(Choose(inCommandLine.m_ShaderCachePersistenceEnabled,
+ inUIAFileSettings.m_ShaderCachePersistenceEnabled))
+ {
+ }
+
+ static const char8_t *LayerCacheName() { return "layer-caching"; }
+ static const char8_t *LayerGpuProfilerName() { return "layer-gpu-profiling"; }
+ static const char8_t *ShaderCacheName() { return "shader-cache-persistence"; }
+
+ void ParseBoolEnableDisableItem(const IDOMReader &inReader, const char8_t *itemName,
+ Option<bool> &itemValue)
+ {
+ const char8_t *inItem;
+ if (const_cast<IDOMReader &>(inReader).UnregisteredAtt(itemName, inItem)) {
+ if (AreEqualCaseless(inItem, "disabled"))
+ itemValue = false;
+ else
+ itemValue = true;
+ }
+ }
+
+ void ParseBoolEnableDisableItem(const eastl::vector<eastl::string> &inCommandLine,
+ const char8_t *itemName, Option<bool> &itemValue)
+ {
+ eastl::string temp;
+ temp.assign("-");
+ temp.append(itemName);
+ for (QT3DSU32 idx = 0, end = inCommandLine.size(); idx < end; ++idx) {
+ if (inCommandLine[idx].find(temp) == 0) {
+ if (inCommandLine[idx].length() == temp.size()) {
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "Unable to parse parameter %s. Please pass =enable|disable as "
+ << "part of the parameter. " << temp.c_str();
+ } else {
+ temp = inCommandLine[idx].substr(temp.size() + 1);
+ eastl::string::size_type start = temp.find_first_of("'\"");
+ if (start != eastl::string::npos)
+ temp.erase(0, start);
+
+ eastl::string::size_type end = temp.find_first_of("'\"");
+ if (end != eastl::string::npos)
+ temp.erase(end);
+ if (AreEqualCaseless(temp.c_str(), "disabled"))
+ itemValue = false;
+ else
+ itemValue = true;
+ qCInfo(qt3ds::INVALID_OPERATION)
+ << "Item " << itemName
+ << (itemValue ? " enabled" : " disabled");
+ }
+ }
+ }
+ }
+
+ template <typename TReaderType>
+ void ParseItems(const TReaderType &inReader)
+ {
+ ParseBoolEnableDisableItem(inReader, LayerCacheName(), m_LayerCacheEnabled);
+ ParseBoolEnableDisableItem(inReader, LayerGpuProfilerName(), m_LayerGpuProfilingEnabled);
+ ParseBoolEnableDisableItem(inReader, ShaderCacheName(), m_ShaderCachePersistenceEnabled);
+ }
+
+ void Parse(IDOMReader &inReader) { ParseItems(inReader); }
+
+ void Parse(const eastl::vector<eastl::string> &inCommandLine) { ParseItems(inCommandLine); }
+
+ struct SOptionSerializer
+ {
+ bool m_HasValue;
+ bool m_Value;
+ QT3DSU8 m_Padding[2];
+ SOptionSerializer(const Option<bool> &inValue = Empty())
+ : m_HasValue(inValue.hasValue())
+ , m_Value(inValue.hasValue() ? *inValue : false)
+ {
+ m_Padding[0] = 0;
+ m_Padding[1] = 0;
+ }
+
+ operator Option<bool>() const
+ {
+ if (m_HasValue)
+ return m_Value;
+ return Empty();
+ }
+ };
+
+ void Save(IOutStream &outStream) const
+ {
+ outStream.Write(SOptionSerializer(m_LayerCacheEnabled));
+ outStream.Write(SOptionSerializer(m_LayerGpuProfilingEnabled));
+ outStream.Write(SOptionSerializer(m_ShaderCachePersistenceEnabled));
+ }
+
+ void Load(IInStream &inStream)
+ {
+ SOptionSerializer s;
+ inStream.Read(s);
+ m_LayerCacheEnabled = s;
+ inStream.Read(s);
+ m_LayerGpuProfilingEnabled = s;
+ inStream.Read(s);
+ m_ShaderCachePersistenceEnabled = s;
+ }
+};
+
+struct SDummyAudioPlayer : public IAudioPlayer
+{
+ virtual ~SDummyAudioPlayer() {}
+ bool PlaySoundFile(const char *inFilePath) override
+ {
+ (void *)inFilePath;
+ qCWarning(qt3ds::TRACE_INFO)
+ << "Qt3DSTegraApplication: Unimplemented method IAudioPlayer::PlaySoundFile";
+ return false;
+ }
+} g_DummyAudioPlayer;
+
+struct SAudioPlayerWrapper : public IAudioPlayer
+{
+private:
+ IApplication *m_Application;
+ IAudioPlayer *m_RealPlayer;
+
+public:
+ SAudioPlayerWrapper()
+ : m_Application(0)
+ , m_RealPlayer(&g_DummyAudioPlayer)
+ {
+ }
+ virtual ~SAudioPlayerWrapper() {}
+
+ void SetApplication(IApplication &inApplication) { m_Application = &inApplication; }
+
+ void SetPlayer(IAudioPlayer *inPlayer)
+ {
+ if (inPlayer)
+ m_RealPlayer = inPlayer;
+ else
+ m_RealPlayer = &g_DummyAudioPlayer;
+ }
+
+ bool PlaySoundFile(const char *inFilePath) override
+ {
+ eastl::string theFilePath(nonNull(inFilePath));
+ if (m_RealPlayer != &g_DummyAudioPlayer) {
+ qt3ds::foundation::CFileTools::CombineBaseAndRelative(
+ m_Application->GetProjectDirectory().c_str(), inFilePath, theFilePath);
+ }
+ return m_RealPlayer->PlaySoundFile(theFilePath.c_str());
+ }
+};
+
+struct SApp : public IApplication
+{
+ NVScopedRefCounted<Q3DStudio::IRuntimeFactoryCore> m_CoreFactory;
+ NVScopedRefCounted<Q3DStudio::IRuntimeFactory> m_RuntimeFactory;
+
+ Q3DStudio::CInputEngine *m_InputEnginePtr;
+ CAppStr m_ApplicationDir;
+ CAppStr m_ProjectDir;
+ CAppStr m_PresentationId;
+ CAppStr m_DLLDirectory;
+ TIdAssetMap m_AssetMap;
+ // Keep the assets ordered. This enables the uia order to mean something.
+ TIdAssetList m_OrderedAssets;
+ SPickFrame m_PickFrame;
+ SPickFrame m_MousePickCache;
+ SPickFrame m_MouseOverCache;
+ THashStrMap m_HashStrMap;
+ CTimer m_Timer;
+ Q3DStudio::INT64 m_ManualTime;
+ SFrameTimer m_FrameTimer;
+ Q3DStudio::INT32 m_FrameCount;
+ // the name of the file without extension.
+ eastl::string m_Filename;
+ Q3DSVariantConfig m_variantConfig;
+ NVScopedRefCounted<STextureUploadRenderTask> m_uploadRenderTask;
+
+ qt3ds::foundation::NVScopedReleasable<IRuntimeMetaData> m_MetaData;
+ nvvector<eastl::pair<SBehaviorAsset, bool>> m_Behaviors;
+ NVScopedRefCounted<SocketSystem> m_SocketSystem;
+ NVScopedRefCounted<SocketStream> m_ServerStream;
+ NVScopedRefCounted<IActivityZoneManager> m_ActivityZoneManager;
+ NVScopedRefCounted<IElementAllocator> m_ElementAllocator;
+
+ // Handles are loaded sorted but only added to the handle map when needed.
+ nvvector<char8_t> m_LoadBuffer;
+ nvvector<CPresentation *> m_PresentationBuffer;
+ Mutex m_RunnableMutex;
+ nvvector<NVScopedRefCounted<IAppRunnable>> m_ThreadRunnables;
+ nvvector<NVScopedRefCounted<IAppRunnable>> m_MainThreadRunnables;
+ NVScopedRefCounted<IAppLoadContext> m_AppLoadContext;
+ bool m_DisableState;
+ bool m_ProfileLogging;
+ bool m_LastRenderWasDirty;
+ QT3DSU64 m_LastFrameStartTime;
+ QT3DSU64 m_ThisFrameStartTime;
+ double m_MillisecondsSinceLastFrame;
+ // We get odd oscillations if we do are too quick to report that the frame wasn't dirty
+ // after input.
+ int m_DirtyCountdown;
+ SApplicationSettings m_UIAFileSettings;
+ eastl::pair<NVDataRef<Q3DStudio::TElement *>, size_t> m_ElementLoadResult;
+
+ SAudioPlayerWrapper m_AudioPlayer;
+
+ Qt3DSAssetVisitor *m_visitor;
+
+ bool m_createSuccessful;
+
+ DataInputMap m_dataInputDefs;
+ DataOutputMap m_dataOutputDefs;
+
+ bool m_initialFrame = true;
+
+ SSlideResourceCounter m_resourceCounter;
+ QSet<QString> m_createSet;
+
+ QT3DSI32 mRefCount;
+ SApp(Q3DStudio::IRuntimeFactoryCore &inFactory, const char8_t *inAppDir)
+ : m_CoreFactory(inFactory)
+ , m_InputEnginePtr(NULL)
+ , m_ApplicationDir(inFactory.GetFoundation().getAllocator())
+ , m_ProjectDir(inFactory.GetFoundation().getAllocator())
+ , m_PresentationId(inFactory.GetFoundation().getAllocator())
+ , m_DLLDirectory(inFactory.GetFoundation().getAllocator())
+ , m_AssetMap(inFactory.GetFoundation().getAllocator(), "SApp::m_AssetMap")
+ , m_OrderedAssets(inFactory.GetFoundation().getAllocator(), "SApp::m_OrderedAssets")
+ , m_HashStrMap(inFactory.GetFoundation().getAllocator(), "SApp::m_HashStrMap")
+ , m_Timer(inFactory.GetTimeProvider())
+ , m_ManualTime(0)
+ , m_FrameCount(0)
+ , m_Behaviors(inFactory.GetFoundation().getAllocator(), "SApp::m_Behaviors")
+ , m_ActivityZoneManager(IActivityZoneManager::CreateActivityZoneManager(
+ inFactory.GetFoundation(), inFactory.GetStringTable()))
+ , m_ElementAllocator(IElementAllocator::CreateElementAllocator(inFactory.GetFoundation(),
+ inFactory.GetStringTable()))
+ , m_LoadBuffer(inFactory.GetFoundation().getAllocator(), "SApp::m_LoadBuffer")
+ , m_PresentationBuffer(inFactory.GetFoundation().getAllocator(),
+ "SApp::m_PresentationBuffer")
+ , m_RunnableMutex(inFactory.GetFoundation().getAllocator())
+ , m_ThreadRunnables(inFactory.GetFoundation().getAllocator(), "SApp::m_ThreadRunnables")
+ , m_MainThreadRunnables(inFactory.GetFoundation().getAllocator(),
+ "SApp::m_MainThreadRunnables")
+ , m_DisableState(true)
+ , m_ProfileLogging(false)
+ , m_LastRenderWasDirty(true)
+ , m_LastFrameStartTime(0)
+ , m_ThisFrameStartTime(0)
+ , m_MillisecondsSinceLastFrame(0)
+ , m_DirtyCountdown(5)
+ , m_visitor(nullptr)
+ , m_createSuccessful(false)
+ , mRefCount(0)
+ {
+ m_PresentationId.append("__initial");
+ m_AudioPlayer.SetApplication(*this);
+ eastl::string tempStr(inAppDir);
+ CFileTools::NormalizePath(tempStr);
+ m_ApplicationDir.assign(tempStr.c_str());
+
+ Q3DStudio_memset(&m_PickFrame, 0, sizeof(SPickFrame));
+ Q3DStudio_memset(&m_MousePickCache, 0, sizeof(SPickFrame));
+ Q3DStudio_memset(&m_MouseOverCache, 0, sizeof(SPickFrame));
+
+ m_Timer.Start();
+
+ m_CoreFactory->SetApplicationCore(this);
+ m_CoreFactory->GetScriptEngineQml().SetApplicationCore(*this);
+
+ m_CoreFactory->AddSearchPath(tempStr.c_str());
+ }
+
+ ~SApp()
+ {
+ EndLoad();
+ {
+ Mutex::ScopedLock __locker(m_RunnableMutex);
+ m_ThreadRunnables.clear();
+ }
+ // Ensure we stop the timer.
+ HasCompletedLoading();
+ m_AppLoadContext = NULL;
+
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ SAssetValue &theAsset = *m_OrderedAssets[idx].second;
+ if (theAsset.getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &thePresAsset = *theAsset.getDataPtr<SPresentationAsset>();
+ if (thePresAsset.m_Presentation) {
+ Q3DStudio_delete(thePresAsset.m_Presentation, CPresentation);
+ thePresAsset.m_Presentation = NULL;
+ }
+ }
+ }
+ }
+
+ void setPresentationId(const QString &id) override
+ {
+ QString oldId = QString::fromLocal8Bit(m_PresentationId.c_str());
+ if (oldId == id)
+ return;
+
+ CRegisteredString idStr = m_CoreFactory->GetStringTable().RegisterStr(id);
+ // Update id key in m_AssetMap
+ TIdAssetMap::iterator iter
+ = m_AssetMap.find(m_CoreFactory->GetStringTable().RegisterStr(oldId));
+ if (iter != m_AssetMap.end()
+ && iter->second->getType() == AssetValueTypes::Presentation) {
+ m_AssetMap.insert(eastl::make_pair(idStr, iter->second));
+ m_AssetMap.erase(iter);
+ }
+ for (unsigned i = 0; i < m_OrderedAssets.size(); i++) {
+ auto &asset = m_OrderedAssets[i];
+ if (oldId == asset.first.c_str()) {
+ asset.first = idStr;
+ break;
+ }
+ }
+
+ m_PresentationId.assign(qPrintable(id));
+ }
+
+ void setAssetVisitor(qt3ds::Qt3DSAssetVisitor *v) override
+ {
+ m_visitor = v;
+ }
+
+ NVDataRef<CPresentation *> GetPresentations()
+ {
+ if (m_PresentationBuffer.empty()) {
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ SAssetValue &theAsset = *m_OrderedAssets[idx].second;
+ if (theAsset.getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &thePresAsset = *theAsset.getDataPtr<SPresentationAsset>();
+ if (thePresAsset.m_Presentation)
+ m_PresentationBuffer.push_back(thePresAsset.m_Presentation);
+ }
+ }
+ }
+ return m_PresentationBuffer;
+ }
+ QVector<CPresentation *> getPresentations()
+ {
+ QVector<CPresentation *> presentations;
+ if (m_PresentationBuffer.empty()) {
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ SAssetValue &theAsset = *m_OrderedAssets[idx].second;
+ if (theAsset.getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &thePresAsset = *theAsset.getDataPtr<SPresentationAsset>();
+ if (thePresAsset.m_Presentation)
+ presentations.push_back(thePresAsset.m_Presentation);
+ }
+ }
+ }
+ return presentations;
+ }
+
+ void addRef() override { atomicIncrement(&mRefCount); }
+
+ void release() override
+ {
+ atomicDecrement(&mRefCount);
+ if (mRefCount <= 0)
+ NVDelete(m_CoreFactory->GetFoundation().getAllocator(), this);
+ }
+
+ void QueueForMainThread(IAppRunnable &inRunnable) override
+ {
+ Mutex::ScopedLock __locker(m_RunnableMutex);
+ m_ThreadRunnables.push_back(inRunnable);
+ }
+
+ virtual void EnableProfileLogging()
+ {
+ m_ProfileLogging = true;
+ if (m_RuntimeFactory)
+ m_RuntimeFactory->GetScriptEngineQml().EnableProfiling();
+ }
+
+ // Verbose logging is disabled by default.
+ virtual void SetVerboseLogging(bool inEnableVerboseLogging)
+ {
+
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Update rhythm implementations
+ ////////////////////////////////////////////////////////////////////////////
+
+ void SetPickFrame(const SPickFrame &inPickFrame)
+ {
+ // The model has changed, fire enter and exit mouse events
+ if (inPickFrame.m_Model != m_PickFrame.m_Model) {
+ // For determining onGroupedMouseOver/Out:
+ // arg1 = the original onMouseOut model and arg2 = the original onMouseOver model
+ UVariant theMouseOutModel;
+ UVariant theMouseOverModel;
+ theMouseOutModel.m_VoidPointer = m_PickFrame.m_Model;
+ theMouseOverModel.m_VoidPointer = inPickFrame.m_Model;
+
+ // It seems like you would want to 'onMouseOut' before you 'onMouseOver' something new?
+ if (m_PickFrame.m_Model) {
+ m_PickFrame.m_Model->GetBelongedPresentation()->FireEvent(
+ ON_MOUSEOUT, m_PickFrame.m_Model, &theMouseOutModel, &theMouseOverModel,
+ ATTRIBUTETYPE_POINTER, ATTRIBUTETYPE_POINTER);
+ }
+ if (inPickFrame.m_Model) {
+ inPickFrame.m_Model->GetBelongedPresentation()->FireEvent(
+ ON_MOUSEOVER, inPickFrame.m_Model, &theMouseOutModel, &theMouseOverModel,
+ ATTRIBUTETYPE_POINTER, ATTRIBUTETYPE_POINTER);
+ m_MouseOverCache = inPickFrame;
+ }
+ }
+
+ const TEventCommandHash *theEventArray[] = { &ON_MOUSEDOWN, &ON_MOUSEUP,
+ &ON_MIDDLEMOUSEDOWN, &ON_MIDDLEMOUSEUP,
+ &ON_RIGHTMOUSEDOWN, &ON_RIGHTMOUSEUP };
+ const TEventCommandHash *theClickEventArray[] = { &ON_MOUSECLICK, &ON_MIDDLEMOUSECLICK,
+ &ON_RIGHTMOUSECLICK };
+
+ // Click events...
+ // NOTE: This is a fancy way to iterate programatically over all the handled mouse inputs
+ // handled (declared in AKPickFrame.h for now)
+ // we iterate to INPUTBUTTONCOUNT (see comment in AKPickFrame.h) * 2, because we handle
+ // mouse down and up
+ for (QT3DSI32 theMouseEvtIter = 0; theMouseEvtIter < MOUSEBUTTONCOUNT - 1;
+ theMouseEvtIter++) {
+ // we effectively iterate to MOUSEBUTTONCOUNT * 2 (see comment in AKPickFrame.h) to
+ // handle mouse down and up
+ QT3DSI32 theMouseDownFlag = 1 << (theMouseEvtIter * 2);
+ QT3DSI32 theMouseUpFlag = 1 << (theMouseEvtIter * 2 + 1);
+
+ // on*MouseDown
+ // if this frame, the mouse button is down, and last frame it wasn't (new down click)
+ if (inPickFrame.m_Model && inPickFrame.m_InputFrame.m_MouseFlags & theMouseDownFlag
+ && !(m_PickFrame.m_InputFrame.m_MouseFlags & theMouseDownFlag)) {
+ // fire the 'on*MouseDown' event - which is at the even indices since the down
+ // events for each button are before the up
+ inPickFrame.m_Model->GetBelongedPresentation()->FireEvent(
+ *theEventArray[theMouseEvtIter * 2], inPickFrame.m_Model);
+
+ // cache this as the last item we 'onMouseDown' on
+ m_MousePickCache = inPickFrame;
+ }
+
+ // on*MouseUp
+ // if we mouse up on anything, send the event
+ if (inPickFrame.m_InputFrame.m_MouseFlags & theMouseUpFlag) {
+ // fire the 'on*MouseUp' event - odd indices (1,3,5 etc)
+ if (m_MousePickCache.m_Model) {
+ m_MousePickCache.m_Model->GetBelongedPresentation()->FireEvent(
+ *theEventArray[theMouseEvtIter * 2 + 1], m_MousePickCache.m_Model);
+ }
+
+ // on*MouseClick
+ // if we had a up click on the same item we were mouse down on last frame ... we had
+ // a click
+ if (inPickFrame.m_Model && inPickFrame.m_Model == m_MousePickCache.m_Model) {
+ inPickFrame.m_Model->GetBelongedPresentation()->FireEvent(
+ *theClickEventArray[theMouseEvtIter], inPickFrame.m_Model);
+ }
+
+ // clear the stored 'last mouse down' since we just got a mouse up
+ Q3DStudio_memset(&m_MousePickCache, 0, sizeof(SPickFrame));
+ }
+
+ // on*MouseDblClick
+ }
+
+ if (m_MouseOverCache.m_Model) {
+
+ if (inPickFrame.m_InputFrame.m_MouseFlags & VSCROLLWHEEL) {
+ UVariant theScrollValue;
+ theScrollValue.m_INT32 = inPickFrame.m_InputFrame.m_ScrollValue;
+ m_MouseOverCache.m_Model->GetBelongedPresentation()->FireEvent(
+ ON_VERTICALSCROLLWHEEL, m_MouseOverCache.m_Model, &theScrollValue,
+ NULL, ATTRIBUTETYPE_INT32);
+ } else if (inPickFrame.m_InputFrame.m_MouseFlags & HSCROLLWHEEL) {
+ UVariant theScrollValue;
+ theScrollValue.m_INT32 = inPickFrame.m_InputFrame.m_ScrollValue;
+ m_MouseOverCache.m_Model->GetBelongedPresentation()->FireEvent(
+ ON_HORIZONTALSCROLLWHEEL, m_MouseOverCache.m_Model, &theScrollValue,
+ NULL, ATTRIBUTETYPE_INT32);
+ }
+ }
+
+ // Do this last
+ m_PickFrame = inPickFrame;
+ }
+
+ void ClearPresentationDirtyLists()
+ {
+ NVDataRef<CPresentation *> thePresentations(GetPresentations());
+ for (QT3DSU32 idx = 0, end = thePresentations.size(); idx < end; ++idx)
+ thePresentations[idx]->ClearDirtyList();
+ }
+
+ void UpdatePresentations()
+ {
+ SStackPerfTimer __updateTimer(m_RuntimeFactory->GetPerfTimer(), "UpdatePresentations");
+ // Transfer the input frame to the kernel for pick processing
+ // the scene manager now handles the picking on each of its scenes
+ SetPickFrame(m_RuntimeFactory->GetSceneManager().AdvancePickFrame(
+ m_InputEnginePtr->GetInputFrame()));
+ // clear up mouse flag for horizontal and vertical scroll
+ m_InputEnginePtr->GetInputFrame().m_MouseFlags &= !(HSCROLLWHEEL | VSCROLLWHEEL);
+
+ // Update all the presentations.
+ // Animations are advanced based on m_Timer by default, but this can be overridden via
+ // SetTimeMilliSecs().
+ Q3DStudio::INT64 globalTime(GetTimeMilliSecs());
+
+ NVDataRef<CPresentation *> thePresentations(GetPresentations());
+
+ {
+ SStackPerfTimer __updateTimer(m_RuntimeFactory->GetPerfTimer(),
+ "UpdatePresentations - pre update");
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ if (m_OrderedAssets[idx].second->getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &theAsset(
+ *m_OrderedAssets[idx].second->getDataPtr<SPresentationAsset>());
+ CPresentation *thePresentation = theAsset.m_Presentation;
+ if (thePresentation && thePresentation->GetActive())
+ thePresentation->PreUpdate(globalTime);
+ }
+ }
+ }
+ {
+ SStackPerfTimer __updateTimer(m_RuntimeFactory->GetPerfTimer(),
+ "UpdatePresentations - begin update");
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ if (m_OrderedAssets[idx].second->getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &theAsset(
+ *m_OrderedAssets[idx].second->getDataPtr<SPresentationAsset>());
+ CPresentation *thePresentation = theAsset.m_Presentation;
+ if (thePresentation && thePresentation->GetActive())
+ thePresentation->BeginUpdate();
+ }
+ }
+ }
+ {
+ SStackPerfTimer __updateTimer(m_RuntimeFactory->GetPerfTimer(),
+ "UpdatePresentations - end update");
+
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ if (m_OrderedAssets[idx].second->getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &theAsset(
+ *m_OrderedAssets[idx].second->getDataPtr<SPresentationAsset>());
+ CPresentation *thePresentation = theAsset.m_Presentation;
+ // allow EndUpdate also for inactive presentations so that we can
+ // activate it
+ if (thePresentation)
+ thePresentation->EndUpdate();
+ }
+ }
+ }
+ {
+ SStackPerfTimer __updateTimer(m_RuntimeFactory->GetPerfTimer(),
+ "UpdatePresentations - postupdate");
+
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ if (m_OrderedAssets[idx].second->getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &theAsset(
+ *m_OrderedAssets[idx].second->getDataPtr<SPresentationAsset>());
+ CPresentation *thePresentation = theAsset.m_Presentation;
+ // allow PostUpdate also for inactive presentations so that we can
+ // activate it
+ if (thePresentation)
+ thePresentation->PostUpdate(globalTime);
+ }
+ }
+ }
+
+ // Run the garbage collection
+ m_CoreFactory->GetScriptEngineQml().StepGC();
+ }
+
+ void NotifyDataOutputs()
+ {
+ {
+ SStackPerfTimer __updateTimer(m_RuntimeFactory->GetPerfTimer(),
+ "NotifyDataOutputs");
+
+ // Allow presentations to notify of registered data output changes
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ if (m_OrderedAssets[idx].second->getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &asset(
+ *m_OrderedAssets[idx].second->getDataPtr<SPresentationAsset>());
+ CPresentation *presentation = asset.m_Presentation;
+ // allow PostUpdate also for inactive presentations so that we can
+ // activate it
+ if (presentation)
+ presentation->NotifyDataOutputs();
+ }
+ }
+
+ // Notify @timeline attribute changes and store latest value to notified DataOutputDef
+ QMutableMapIterator<QString, DataOutputDef> iter(m_dataOutputDefs);
+ while (iter.hasNext()) {
+ iter.next();
+ DataOutputDef &outDef = iter.value();
+ if (outDef.observedAttribute.propertyType == ATTRIBUTETYPE_DATAINPUT_TIMELINE
+ && outDef.timelineComponent) {
+ qreal newValue = outDef.timelineComponent->GetTimePolicy().GetTime();
+ qreal timelineEndTime
+ = outDef.timelineComponent->GetTimePolicy().GetLoopingDuration();
+
+ // Normalize the value to dataOutput range (if defined)
+ if (outDef.min < outDef.max && timelineEndTime != 0.0) {
+ newValue = (newValue/timelineEndTime) * qreal(outDef.max - outDef.min);
+ newValue += qreal(outDef.min);
+ } else {
+ // Normalize to milliseconds
+ newValue *= 1000.0;
+ }
+
+ if (!outDef.value.isValid() || newValue != outDef.value.toReal()) {
+ outDef.value.setValue(newValue);;
+ GetPrimaryPresentation()->signalProxy()->SigDataOutputValueUpdated(
+ outDef.name, outDef.value);
+ }
+ }
+ }
+ } // End SStackPerfTimer scope
+ }
+
+ void UpdateScenes() { m_RuntimeFactory->GetSceneManager().Update(); }
+
+ void Render()
+ {
+ SStackPerfTimer __updateTimer(m_RuntimeFactory->GetPerfTimer(), "Render");
+ CPresentation *pres = GetPrimaryPresentation();
+ if (pres) {
+ m_LastRenderWasDirty = m_RuntimeFactory->GetSceneManager()
+ .RenderPresentation(pres, m_initialFrame);
+ m_initialFrame = false;
+ }
+ }
+
+ void ResetDirtyCounter() { m_DirtyCountdown = 5; }
+
+ // Update all the presentations and render them.
+ void UpdateAndRender() override
+ {
+ QT3DS_ASSERT(m_AppLoadContext.mPtr == NULL);
+ m_ThisFrameStartTime = qt3ds::foundation::Time::getCurrentCounterValue();
+ if (m_LastFrameStartTime) {
+ QT3DSU64 durationSinceLastFrame = m_ThisFrameStartTime - m_LastFrameStartTime;
+ m_MillisecondsSinceLastFrame =
+ qt3ds::foundation::Time::sCounterFreq.toTensOfNanos(durationSinceLastFrame)
+ * (1.0 / 100000.0);
+ } else {
+ m_MillisecondsSinceLastFrame = 0;
+ }
+
+ ++m_FrameCount;
+
+ // First off, update any application level behaviors.
+ IScriptBridge &theScriptEngine = m_CoreFactory->GetScriptEngineQml();
+ for (QT3DSU32 idx = 0, end = m_Behaviors.size(); idx < end; ++idx) {
+ eastl::pair<SBehaviorAsset, bool> &entry(m_Behaviors[idx]);
+ if (!entry.second) {
+ entry.second = true;
+ theScriptEngine.ExecuteApplicationScriptFunction(entry.first.m_Handle,
+ "onInitialize");
+ }
+ }
+
+ // TODO: Initialize presentations
+
+ for (QT3DSU32 idx = 0, end = m_Behaviors.size(); idx < end; ++idx) {
+ eastl::pair<SBehaviorAsset, bool> &entry(m_Behaviors[idx]);
+ theScriptEngine.ExecuteApplicationScriptFunction(entry.first.m_Handle, "onUpdate");
+ }
+
+ UpdatePresentations();
+
+ UpdateScenes();
+
+ Render();
+
+ m_InputEnginePtr->ClearInputFrame();
+
+ NotifyDataOutputs();
+
+ ClearPresentationDirtyLists();
+
+ if (!m_CoreFactory->GetEventSystem().GetAndClearEventFetchedFlag())
+ m_CoreFactory->GetEventSystem().PurgeEvents(); // GetNextEvents of event system has not
+ // been called in this round, so clear
+ // events to avoid events to be piled up
+
+ m_RuntimeFactory->GetQt3DSRenderContext().SetFrameTime(m_MillisecondsSinceLastFrame);
+ if (floor(m_FrameTimer.GetElapsedSeconds()) > 0.0f) {
+ QPair<QT3DSF32, int> fps = m_FrameTimer.GetFPS(m_FrameCount);
+ m_RuntimeFactory->GetQt3DSRenderContext().SetFPS(fps);
+ if (m_ProfileLogging) {
+ qCInfo(PERF_INFO, "Render Statistics: %3.2ffps, frame count %d",
+ fps.first, fps.second);
+ }
+ }
+
+ m_CoreFactory->GetPerfTimer().ResetTimerData();
+
+ fflush(stdout);
+ m_LastFrameStartTime = m_ThisFrameStartTime;
+ if (m_LastRenderWasDirty)
+ ResetDirtyCounter();
+ else
+ m_DirtyCountdown = NVMax(0, m_DirtyCountdown - 1);
+ }
+
+ // hook this up to -layer-caching.
+ // otherwise it might be hard to measure performance
+ bool IsApplicationDirty() override
+ {
+ return (m_DirtyCountdown > 0);
+ }
+
+ double GetMillisecondsSinceLastFrame() override { return m_MillisecondsSinceLastFrame; }
+
+ void MarkApplicationDirty() override { ResetDirtyCounter(); }
+
+ Q3DStudio::IAudioPlayer &GetAudioPlayer() override { return m_AudioPlayer; }
+ ////////////////////////////////////////////////////////////////////////////////
+ // Generalized save/load
+ ////////////////////////////////////////////////////////////////////////////////
+
+ void loadComponentSlideResources(TElement *component, CPresentation *presentation, int index,
+ const QString slideName, bool wait)
+ {
+ if (m_RuntimeFactory->GetQt3DSRenderContext().GetBufferManager()
+ .isReloadableResourcesEnabled()) {
+ auto &slidesystem = presentation->GetSlideSystem();
+ SSlideKey key;
+ key.m_Component = component;
+ key.m_Index = index;
+ slidesystem.setUnloadSlide(key, false);
+ const QString completeName = presentation->GetName() + QLatin1Char(':')
+ + QString::fromUtf8(key.m_Component->m_Name) + QLatin1Char(':') + slideName;
+ qCInfo(PERF_INFO) << "Load component slide resources: " << completeName;
+ m_resourceCounter.handleLoadSlide(completeName, key, slidesystem);
+ if (m_uploadRenderTask)
+ m_uploadRenderTask->add(m_resourceCounter.createSet, wait);
+ else
+ m_createSet.unite(m_resourceCounter.createSet);
+ }
+ }
+
+ void unloadComponentSlideResources(TElement *component, CPresentation *presentation, int index,
+ const QString slideName)
+ {
+ if (m_RuntimeFactory->GetQt3DSRenderContext().GetBufferManager()
+ .isReloadableResourcesEnabled()) {
+ auto &slidesystem = presentation->GetSlideSystem();
+ SSlideKey key;
+ key.m_Component = component;
+ key.m_Index = index;
+ slidesystem.setUnloadSlide(key, true);
+ if (!slidesystem.isActiveSlide(key)) {
+ const QString completeName = presentation->GetName() + QLatin1Char(':')
+ + QString::fromUtf8(key.m_Component->m_Name) + QLatin1Char(':') + slideName;
+ qCInfo(PERF_INFO) << "Unload component slide resources: " << completeName;
+ m_resourceCounter.handleUnloadSlide(completeName, key, slidesystem);
+
+ if (m_uploadRenderTask)
+ m_uploadRenderTask->remove(m_resourceCounter.deleteSet);
+ }
+ }
+ }
+
+ bool LoadUIP(SPresentationAsset &inAsset,
+ NVConstDataRef<SElementAttributeReference> inExternalReferences)
+ {
+ GetMetaData();
+ eastl::string theFile;
+ CFileTools::CombineBaseAndRelative(GetProjectDirectory().c_str(), inAsset.m_Src.c_str(),
+ theFile);
+ // Check if the file event exists
+ eastl::string fullPath;
+ NVScopedRefCounted<qt3ds::render::IRefCountedInputStream> theStream
+ = m_CoreFactory->GetRenderContextCore().GetInputStreamFactory().GetStreamForFile(
+ theFile.c_str());
+ if (theStream) {
+ theStream = NULL;
+ CPresentation *thePresentation
+ = Q3DStudio_new(CPresentation) CPresentation(inAsset.m_Id.c_str(),
+ GetProjectDirectory().c_str(),
+ this);
+ inAsset.m_Presentation = thePresentation;
+ thePresentation->SetFilePath(theFile.c_str());
+ NVScopedReleasable<IUIPParser> theUIPParser(IUIPParser::Create(
+ theFile.c_str(), *m_MetaData,
+ m_CoreFactory->GetInputStreamFactory(),
+ m_CoreFactory->GetStringTable()));
+ Q3DStudio::IScene *newScene = NULL;
+ m_PresentationBuffer.clear();
+ if (theUIPParser->Load(*thePresentation, inExternalReferences)) {
+ // Load the scene graph portion of the scene.
+ newScene = m_RuntimeFactory->GetSceneManager().LoadScene(
+ thePresentation, theUIPParser.mPtr,
+ m_CoreFactory->GetScriptEngineQml(),
+ m_variantConfig);
+ }
+
+ if (newScene == NULL) {
+ Q3DStudio_delete(thePresentation, CPresentation);
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "Unable to load presentation " << theFile.c_str();
+ inAsset.m_Presentation = NULL;
+ return false;
+ } else {
+ if (inAsset.m_Id.IsValid() && m_PresentationId.empty())
+ m_PresentationId.assign(inAsset.m_Id);
+
+ if (inAsset.m_Id.IsValid())
+ newScene->RegisterOffscreenRenderer(inAsset.m_Id);
+
+ QVector<TElement *> components;
+ thePresentation->GetRoot()->findComponents(components);
+ for (auto &component : qAsConst(components))
+ loadComponentSlideResources(component, thePresentation, 0, "Master", true);
+
+ return true;
+ }
+ }
+ qCWarning(qt3ds::INVALID_OPERATION) << "Unable to load presentation " << theFile.c_str();
+ return false;
+ }
+
+ bool LoadUIA(IDOMReader &inReader, NVFoundationBase &fnd)
+ {
+ IDOMReader::Scope __preparseScope(inReader);
+ {
+ m_UIAFileSettings.Parse(inReader);
+ }
+ {
+ IDOMReader::Scope __assetsScope(inReader);
+ if (!inReader.MoveToFirstChild("assets")) {
+ qCCritical(INVALID_OPERATION,
+ "UIA input xml doesn't contain <assets> tag; load failed");
+ return false;
+ }
+
+ eastl::string pathString;
+
+ const char8_t *initialItem = "";
+ inReader.UnregisteredAtt("initial", initialItem);
+ m_PresentationId.clear();
+ if (!isTrivial(initialItem)) {
+ if (initialItem[0] == '#')
+ ++initialItem;
+
+ m_PresentationId.assign(initialItem);
+ }
+ eastl::vector<SElementAttributeReference> theUIPReferences;
+ eastl::string tempString;
+
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ IDOMReader::Scope __assetScope(inReader);
+ const char8_t *itemId("");
+ inReader.UnregisteredAtt("id", itemId);
+ const char8_t *src = "";
+ inReader.UnregisteredAtt("src", src);
+ pathString.clear();
+ if (!isTrivial(src))
+ CFileTools::CombineBaseAndRelative(m_ProjectDir.c_str(), src, pathString);
+
+ const char8_t *assetName = inReader.GetElementName();
+ if (AreEqual(assetName, "presentation")) {
+ SPresentationAsset theAsset(RegisterStr(itemId), RegisterStr(src));
+ bool activeFlag;
+ if (inReader.Att("active", activeFlag))
+ theAsset.m_Active = activeFlag;
+ RegisterAsset(theAsset);
+ } else if (AreEqual(assetName, "dataInput")) {
+ DataInputDef diDef;
+ const char8_t *name = "";
+ const char8_t *type = "";
+ const char8_t *evaluator = "";
+ const char8_t *metadataStr = "";
+ diDef.value = QVariant::Invalid;
+ inReader.UnregisteredAtt("name", name);
+ inReader.UnregisteredAtt("type", type);
+ inReader.Att("min", diDef.min);
+ inReader.Att("max", diDef.max);
+ inReader.UnregisteredAtt("evaluator", evaluator);
+ if (AreEqual(type, "Ranged Number"))
+ diDef.type = DataInOutTypeRangedNumber;
+ else if (AreEqual(type, "String"))
+ diDef.type = DataInOutTypeString;
+ else if (AreEqual(type, "Float"))
+ diDef.type = DataInOutTypeFloat;
+ else if (AreEqual(type, "Vector4"))
+ diDef.type = DataInOutTypeVector4;
+ else if (AreEqual(type, "Vector3"))
+ diDef.type = DataInOutTypeVector3;
+ else if (AreEqual(type, "Vector2"))
+ diDef.type = DataInOutTypeVector2;
+ else if (AreEqual(type, "Boolean"))
+ diDef.type = DataInOutTypeBoolean;
+ else if (AreEqual(type, "Variant"))
+ diDef.type = DataInOutTypeVariant;
+
+ if (AreEqual(type, "Evaluator")) {
+ diDef.type = DataInOutTypeEvaluator;
+ diDef.evaluator = QString::fromUtf8(evaluator);
+ }
+
+ inReader.UnregisteredAtt("metadata", metadataStr);
+ QString metaData = QString(metadataStr);
+ if (!metaData.isEmpty()) {
+ auto metadataList = metaData.split(QLatin1Char('$'));
+
+ if (metadataList.size() & 1) {
+ qWarning("Malformed datainput metadata for datainput %s, cannot"
+ "parse key - value pairs. Stop parsing metadata.",
+ qUtf8Printable(name));
+ } else {
+ for (int i = 0; i < metadataList.size(); i += 2) {
+ if (metadataList[i].isEmpty()) {
+ qWarning("Malformed datainput metadata for datainput %s "
+ "- metadata key empty. Stop parsing metadata.",
+ qUtf8Printable(name));
+ break;
+ }
+ diDef.metadata.insert(metadataList[i], metadataList[i+1]);
+ }
+ }
+ }
+ m_dataInputDefs.insert(QString::fromUtf8(name), diDef);
+// #TODO Remove below once QT3DS-3510 task has been completed.
+ // By default data inputs should not have data outputs, but this is needed
+ // until editor can support configuring data nodes as in/out/in-out types
+ DataOutputDef outDef;
+ outDef.type = diDef.type;
+ outDef.value = diDef.value;
+ outDef.name = QString::fromUtf8(name);
+ m_dataOutputDefs.insert(QString::fromUtf8(name), outDef);
+// #TODO Remove above once QT3DS-3510 UI change has been done
+ } else if (AreEqual(assetName, "dataOutput")) {
+ DataOutputDef outDef;
+ const char8_t *name = "";
+ const char8_t *type = "";
+ outDef.value = QVariant::Invalid;
+ inReader.UnregisteredAtt("name", name);
+ inReader.UnregisteredAtt("type", type);
+ inReader.Att("min", outDef.min);
+ inReader.Att("max", outDef.max);
+ if (type) {
+ if (AreEqual(type, "Ranged Number"))
+ outDef.type = DataInOutTypeRangedNumber;
+ else if (AreEqual(type, "String"))
+ outDef.type = DataInOutTypeString;
+ else if (AreEqual(type, "Float"))
+ outDef.type = DataInOutTypeFloat;
+ else if (AreEqual(type, "Vector4"))
+ outDef.type = DataInOutTypeVector4;
+ else if (AreEqual(type, "Vector3"))
+ outDef.type = DataInOutTypeVector3;
+ else if (AreEqual(type, "Vector2"))
+ outDef.type = DataInOutTypeVector2;
+ else if (AreEqual(type, "Boolean"))
+ outDef.type = DataInOutTypeBoolean;
+ else if (AreEqual(type, "Variant"))
+ outDef.type = DataInOutTypeVariant;
+ }
+
+ outDef.name = QString::fromUtf8(name);
+ m_dataOutputDefs.insert(QString::fromUtf8(name), outDef);
+ } else if (AreEqual(assetName, "renderplugin")) {
+ const char8_t *pluginArgs = "";
+ inReader.UnregisteredAtt("args", pluginArgs);
+ RegisterAsset(SRenderPluginAsset(RegisterStr(itemId), RegisterStr(src),
+ RegisterStr(pluginArgs)));
+ } else if (AreEqual(assetName, "behavior")) {
+ SBehaviorAsset theAsset(RegisterStr(itemId), RegisterStr(src), 0);
+ RegisterAsset(theAsset);
+ } else if (AreEqual(assetName, "presentation-qml")) {
+ const char8_t *args = "";
+ inReader.UnregisteredAtt("args", args);
+ RegisterAsset(SQmlPresentationAsset(RegisterStr(itemId), RegisterStr(src),
+ RegisterStr(args)));
+ } else {
+ qCWarning(WARNING, "Unrecognized <assets> child %s", assetName);
+ }
+ }
+ } // end assets scope
+ const char8_t *initialScaleMode = "";
+ inReader.UnregisteredAtt("scalemode", initialScaleMode);
+
+ m_AppLoadContext
+ = IAppLoadContext::CreateXMLLoadContext(*this,
+ initialScaleMode);
+ return true;
+ }
+
+ DataInputMap &dataInputMap() override
+ {
+ return m_dataInputDefs;
+ }
+
+ DataOutputMap &dataOutputMap() override
+ {
+ return m_dataOutputDefs;
+ }
+
+ QList<QString> dataInputs() const override
+ {
+ return m_dataInputDefs.keys();
+ }
+
+ QList<QString> dataOutputs() const override
+ {
+ return m_dataOutputDefs.keys();
+ }
+
+ float dataInputMax(const QString &name) const override
+ {
+ return m_dataInputDefs[name].max;
+ }
+
+ float dataInputMin(const QString &name) const override
+ {
+ return m_dataInputDefs[name].min;
+ }
+
+ QHash<QString, QString> dataInputMetadata(const QString &name) const override
+ {
+ return m_dataInputDefs[name].metadata;
+ }
+
+ struct SAppXMLErrorHandler : public qt3ds::foundation::CXmlErrorHandler
+ {
+ NVFoundationBase &m_Foundation;
+ const char8_t *m_FilePath;
+ SAppXMLErrorHandler(NVFoundationBase &fnd, const char8_t *filePath)
+ : m_Foundation(fnd)
+ , m_FilePath(filePath)
+ {
+ }
+
+ void OnXmlError(TXMLCharPtr errorName, int line, int /*column*/) override
+ {
+ qCWarning(INVALID_OPERATION, m_FilePath, line, "%s", errorName);
+ }
+ };
+
+ bool BeginLoad(const QString &sourcePath, const QStringList &variantList) override
+ {
+ SStackPerfTimer __loadTimer(m_CoreFactory->GetPerfTimer(), "Application: Begin Load");
+ eastl::string directory;
+ eastl::string filename;
+ eastl::string extension;
+ CFileTools::Split(sourcePath.toUtf8().constData(), directory, filename, extension);
+ eastl::string projectDirectory(directory);
+
+ m_ProjectDir.assign(projectDirectory.c_str());
+ m_CoreFactory->AddSearchPath(projectDirectory.c_str());
+
+ // add additional search path
+ QString projectDir = CFileTools::NormalizePathForQtUsage(projectDirectory.c_str());
+ if (!projectDir.startsWith(QStringLiteral(":"))) {
+ eastl::string relativeProjectDir;
+ CFileTools::CombineBaseAndRelative(m_ApplicationDir.c_str(), projectDirectory.c_str(),
+ relativeProjectDir);
+ m_CoreFactory->AddSearchPath(relativeProjectDir.c_str());
+ }
+
+ // For QT3DS-3353 assume project fonts are in a subdirectory relative to project.
+ eastl::string projectFontDirectory = projectDirectory + "/fonts";
+
+ NVFoundationBase &fnd(m_CoreFactory->GetFoundation());
+
+ if (m_CoreFactory->GetRenderContextCore().getDistanceFieldRenderer()) {
+ m_CoreFactory->GetRenderContextCore().getDistanceFieldRenderer()
+ ->AddProjectFontDirectory(projectFontDirectory.c_str());
+ }
+
+ if (m_CoreFactory->GetRenderContextCore().GetTextRendererCore()) {
+ m_CoreFactory->GetRenderContextCore().GetTextRendererCore()->AddProjectFontDirectory(
+ projectFontDirectory.c_str());
+ m_CoreFactory->GetRenderContextCore().GetTextRendererCore()->BeginPreloadFonts(
+ m_CoreFactory->GetRenderContextCore().GetThreadPool(),
+ m_CoreFactory->GetRenderContextCore().GetPerfTimer());
+ }
+ m_Filename = filename;
+ m_variantConfig.setVariantList(variantList);
+ bool retval = false;
+ if (extension.comparei("uip") == 0) {
+ m_PresentationId.assign("__initial");
+ eastl::string relativePath = "./";
+ relativePath.append(filename);
+ relativePath.append(".");
+ relativePath.append("uip");
+ RegisterAsset(SPresentationAsset(RegisterStr(m_PresentationId.c_str()),
+ RegisterStr(relativePath.c_str())));
+ m_AppLoadContext = IAppLoadContext::CreateXMLLoadContext(*this, "");
+
+ retval = true;
+ } else if (extension.comparei("uia") == 0) {
+ CFileSeekableIOStream inputStream(sourcePath, FileReadFlags());
+ if (inputStream.IsOpen()) {
+ NVScopedRefCounted<IStringTable> strTable(
+ IStringTable::CreateStringTable(fnd.getAllocator()));
+ NVScopedRefCounted<IDOMFactory> domFactory(
+ IDOMFactory::CreateDOMFactory(fnd.getAllocator(), strTable));
+ SAppXMLErrorHandler errorHandler(fnd, sourcePath.toUtf8().constData());
+ eastl::pair<SNamespacePairNode *, SDOMElement *> readResult =
+ CDOMSerializer::Read(*domFactory, inputStream, &errorHandler);
+ if (!readResult.second) {
+ qCCritical(INVALID_PARAMETER, "%s doesn't appear to be valid xml",
+ sourcePath.toUtf8().constData());
+ } else {
+ NVScopedRefCounted<IDOMReader> domReader = IDOMReader::CreateDOMReader(
+ fnd.getAllocator(), *readResult.second, strTable, domFactory);
+ if (m_visitor)
+ m_visitor->visit(sourcePath.toUtf8().constData());
+ retval = LoadUIA(*domReader, fnd);
+ }
+ } else {
+ qCCritical(INVALID_PARAMETER, "Unable to open input file %s",
+ sourcePath.toUtf8().constData());
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return retval;
+ }
+
+ void EndLoad() override
+ {
+ if (m_AppLoadContext)
+ m_AppLoadContext->EndLoad();
+ }
+
+ void RunAllRunnables()
+ {
+ {
+ Mutex::ScopedLock __locker(m_RunnableMutex);
+ m_MainThreadRunnables = m_ThreadRunnables;
+ m_ThreadRunnables.clear();
+ }
+ for (QT3DSU32 idx = 0, end = m_MainThreadRunnables.size(); idx < end; ++idx)
+ m_MainThreadRunnables[idx]->Run();
+ m_MainThreadRunnables.clear();
+ }
+
+ bool HasCompletedLoading() override
+ {
+ RunAllRunnables();
+ if (m_AppLoadContext)
+ return m_AppLoadContext->HasCompletedLoading();
+
+ return true;
+ }
+
+ bool createSuccessful() override
+ {
+ return m_createSuccessful;
+ }
+
+ bool presentationComponentSlide(const QString &elementPath,
+ Q3DStudio::CPresentation *&presentation,
+ TElement *&component,
+ QString &slideName,
+ int &index)
+ {
+ presentation = GetPrimaryPresentation();
+ slideName = elementPath;
+ QString componentName;
+ if (elementPath.contains(QLatin1Char(':'))) {
+ // presentation : component : slide
+ QStringList splits = elementPath.split(QLatin1Char(':'));
+ if (splits.size() == 3) {
+ presentation = GetPresentationById(qPrintable(splits[0]));
+ componentName = splits[1];
+ slideName = splits[2];
+ } else {
+ componentName = splits[0];
+ slideName = splits[1];
+ }
+ // else assume main presentation and component:slide
+ }
+ component = presentation->GetRoot();
+ if (!componentName.isNull() && componentName != component->m_Name)
+ component = component->FindChild(CHash::HashString(qPrintable(componentName)));
+ if (!component) {
+ qCWarning(WARNING) << "Could not find slide: " << elementPath;
+ return false;
+ }
+ ISlideSystem &s = presentation->GetSlideSystem();
+ index = s.FindSlide(*component, qPrintable(slideName));
+ return true;
+ }
+
+ void preloadSlide(const QString &slide) override
+ {
+ CPresentation *pres = nullptr;
+ TElement *component = nullptr;
+ QString slideName;
+ int index;
+ if (presentationComponentSlide(slide, pres, component, slideName, index))
+ loadComponentSlideResources(component, pres, index, slideName, false);
+ }
+
+ void unloadSlide(const QString &slide) override
+ {
+ CPresentation *pres = nullptr;
+ TElement *component = nullptr;
+ QString slideName;
+ int index;
+ if (presentationComponentSlide(slide, pres, component, slideName, index))
+ unloadComponentSlideResources(component, pres, index, slideName);
+ }
+
+ void setDelayedLoading(bool enable)
+ {
+ m_RuntimeFactory->GetQt3DSRenderContext().GetBufferManager()
+ .enableReloadableResources(enable);
+ }
+
+ void ComponentSlideEntered(Q3DStudio::CPresentation *presentation,
+ Q3DStudio::TElement *component,
+ const QString &elementPath, int slideIndex,
+ const QString &slideName) override
+ {
+ loadComponentSlideResources(component, presentation, slideIndex, slideName, true);
+ }
+
+ void ComponentSlideExited(Q3DStudio::CPresentation *presentation,
+ Q3DStudio::TElement *component,
+ const QString &elementPath, int slideIndex,
+ const QString &slideName) override
+ {
+ unloadComponentSlideResources(component, presentation, slideIndex, slideName);
+ }
+
+ // will force loading to end if endLoad hasn't been called yet. Will fire off loading
+ // of resources that need to be uploaded to opengl. Maintains reference to runtime factory
+ IApplication &CreateApplication(Q3DStudio::CInputEngine &inInputEngine,
+ Q3DStudio::IAudioPlayer *inAudioPlayer,
+ Q3DStudio::IRuntimeFactory &inFactory) override
+ {
+ {
+ SStackPerfTimer __loadTimer(m_CoreFactory->GetPerfTimer(),
+ "Application: Initialize Graphics");
+
+ {
+ SStackPerfTimer __timer(m_CoreFactory->GetPerfTimer(), "Application: EndLoad");
+ EndLoad();
+ }
+ m_InputEnginePtr = &inInputEngine;
+ m_RuntimeFactory = inFactory;
+
+ {
+ SStackPerfTimer __timer(m_CoreFactory->GetPerfTimer(),
+ "Application: Load Context Graphics Initialized");
+ if (m_AppLoadContext)
+ m_createSuccessful = m_AppLoadContext->OnGraphicsInitialized(inFactory);
+ // Guarantees the end of the multithreaded access to the various components
+ m_AppLoadContext = NULL;
+ if (!m_createSuccessful)
+ return *this;
+ }
+
+ {
+ SStackPerfTimer __loadTimer(m_CoreFactory->GetPerfTimer(),
+ "Application: End Font Preload");
+ if (m_CoreFactory->GetRenderContextCore().GetTextRendererCore())
+ m_CoreFactory->GetRenderContextCore()
+ .GetTextRendererCore()
+ ->EndPreloadFonts();
+ }
+
+ RunAllRunnables();
+ // Moving set application to the end ensures that the application load context is not
+ // accessing
+ // the lua state in another thread while we are calling set application. This
+ // apparently may cause
+ // the call to set application to fail miserably.
+ m_RuntimeFactory->SetApplication(this);
+ m_RuntimeFactory->GetStringTable().DisableMultithreadedAccess();
+
+ for (QT3DSU32 idx = 0, end = m_OrderedAssets.size(); idx < end; ++idx) {
+ if (m_OrderedAssets[idx].second->getType() == AssetValueTypes::Presentation) {
+ SPresentationAsset &theAsset(
+ *m_OrderedAssets[idx].second->getDataPtr<SPresentationAsset>());
+ CPresentation *thePresentation = theAsset.m_Presentation;
+ if (thePresentation) {
+ SStackPerfTimer __loadTimer(m_CoreFactory->GetPerfTimer(),
+ "Application: SetActivityZone");
+ thePresentation->SetActivityZone(
+ &m_ActivityZoneManager->CreateActivityZone(*thePresentation));
+ thePresentation->SetActive(theAsset.m_Active);
+ }
+ }
+ }
+
+ inInputEngine.SetApplication(this);
+ }
+ SApplicationSettings finalSettings(/*m_CommandLineSettings, */m_UIAFileSettings);
+ if (finalSettings.m_LayerCacheEnabled.hasValue()) {
+ inFactory.GetQt3DSRenderContext().GetRenderer().EnableLayerCaching(
+ *finalSettings.m_LayerCacheEnabled);
+ }
+
+ m_CoreFactory->GetPerfTimer().OutputTimerData();
+
+ m_AudioPlayer.SetPlayer(inAudioPlayer);
+
+ auto &rc = m_RuntimeFactory->GetQt3DSRenderContext();
+ m_uploadRenderTask = QT3DS_NEW(m_CoreFactory->GetFoundation().getAllocator(),
+ STextureUploadRenderTask(rc.GetImageBatchLoader(),
+ rc.GetBufferManager(),
+ rc.GetRenderContext().GetRenderContextType(),
+ GetPrimaryPresentation()->GetScene()->preferKtx()));
+ m_uploadRenderTask->add(m_createSet, true);
+ m_RuntimeFactory->GetQt3DSRenderContext().GetRenderList()
+ .AddRenderTask(*m_uploadRenderTask);
+ m_createSet.clear();
+ return *this;
+ }
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////
+ // Getters/Setters
+ //////////////////////////////////////////////////////////////////////////////////////////////////////
+ CRegisteredString RegisterStr(const char8_t *inStr)
+ {
+ return m_CoreFactory->GetStringTable().RegisterStr(inStr);
+ }
+
+ // The directory that contains the executable and the root resource path
+ CRegisteredString GetApplicationDirectory() const override
+ {
+ return const_cast<SApp &>(*this).m_CoreFactory->GetStringTable().RegisterStr(
+ m_ApplicationDir.c_str());
+ }
+ // Directory that contained the XIF file.
+ CRegisteredString GetProjectDirectory() const override
+ {
+ QT3DS_ASSERT(m_ProjectDir.size());
+ return const_cast<SApp &>(*this).m_CoreFactory->GetStringTable().RegisterStr(
+ m_ProjectDir.c_str());
+ }
+
+ CRegisteredString GetDllDir() const override
+ {
+ if (m_DLLDirectory.size()) {
+ return const_cast<SApp &>(*this).m_CoreFactory->GetStringTable().RegisterStr(
+ m_DLLDirectory.c_str());
+ }
+ return CRegisteredString();
+ }
+
+ void SetDllDir(const char *inDllDir) override
+ {
+ m_DLLDirectory.assign(nonNull(inDllDir));
+ m_CoreFactory->SetDllDir(inDllDir);
+ }
+
+ Q3DStudio::IRuntimeFactory &GetRuntimeFactory() const override { return *m_RuntimeFactory.mPtr; }
+ Q3DStudio::IRuntimeFactoryCore &GetRuntimeFactoryCore() override { return *m_CoreFactory; }
+
+ Q3DStudio::CPresentation *GetPrimaryPresentation() override
+ {
+ return GetPresentationById(m_PresentationId.c_str());
+ }
+
+ Q3DStudio::CPresentation *GetPresentationById(const char8_t *inId) override
+ {
+ if (!isTrivial(inId)) {
+ TIdAssetMap::iterator iter
+ = m_AssetMap.find(m_CoreFactory->GetStringTable().RegisterStr(inId));
+ if (iter != m_AssetMap.end()
+ && iter->second->getType() == AssetValueTypes::Presentation) {
+ return iter->second->getData<SPresentationAsset>().m_Presentation;
+ }
+ }
+ return NULL;
+ }
+
+ // Returns a list of all presentations in the application
+ // The primary presentation is returned at index 0
+ QList<Q3DStudio::CPresentation *> GetPresentationList() override
+ {
+ QList<Q3DStudio::CPresentation *> list;
+ for (TIdAssetMap::iterator iter = m_AssetMap.begin(); iter != m_AssetMap.end(); ++iter) {
+ if (iter->second->getType() == AssetValueTypes::Presentation) {
+ Q3DStudio::CPresentation *presentation
+ = iter->second->getData<SPresentationAsset>().m_Presentation;
+ if (presentation) {
+ if (iter->first == m_PresentationId)
+ list.prepend(presentation);
+ else
+ list.append(presentation);
+ }
+ }
+ }
+ return list;
+ }
+
+ template <typename TAssetType>
+ void RegisterAsset(const TAssetType &inAsset)
+ {
+ NVScopedRefCounted<SRefCountedAssetValue> theValue(
+ QT3DS_NEW(m_CoreFactory->GetFoundation().getAllocator(),
+ SRefCountedAssetValue(m_CoreFactory->GetFoundation(), inAsset)));
+ if (inAsset.m_Id.IsValid())
+ m_AssetMap.insert(eastl::make_pair(inAsset.m_Id, theValue));
+
+ m_OrderedAssets.push_back(eastl::make_pair(inAsset.m_Id, theValue));
+
+ if (m_visitor) {
+ m_visitor->visit(inAsset.Type(), inAsset.m_Id.c_str(), inAsset.m_Src.c_str(),
+ inAsset.m_Args.c_str());
+ }
+ }
+
+ THashValue HashString(const char *inStr) override
+ {
+ if (inStr == NULL)
+ inStr = "";
+ THashValue retval = CHash::HashString(inStr);
+ eastl::pair<THashStrMap::iterator, bool> insertResult
+ = m_HashStrMap.insert(eastl::make_pair(retval, CRegisteredString()));
+ if (insertResult.second)
+ insertResult.first->second = m_CoreFactory->GetStringTable().RegisterStr(inStr);
+ return retval;
+ }
+
+ const char *ReverseHash(THashValue theValue) override
+ {
+ THashStrMap::iterator find = m_HashStrMap.find(theValue);
+ if (find != m_HashStrMap.end())
+ return find->second.c_str();
+ return "";
+ }
+
+ void SetFrameCount(Q3DStudio::INT32 inFrameCount) override { m_FrameCount = inFrameCount; }
+
+ Q3DStudio::INT32 GetFrameCount() override { return m_FrameCount; }
+
+ void SetTimeMilliSecs(Q3DStudio::INT64 inMilliSecs) override { m_ManualTime = inMilliSecs; }
+
+ Q3DStudio::INT64 GetTimeMilliSecs() override
+ {
+ return m_ManualTime == 0 ? m_Timer.GetTimeMilliSecs() : m_ManualTime;
+ }
+
+ void ResetTime() override
+ {
+ m_Timer.Reset();
+ m_ManualTime = 0;
+ }
+
+ Q3DStudio::CInputEngine &GetInputEngine() override
+ {
+ QT3DS_ASSERT(m_InputEnginePtr);
+ return *m_InputEnginePtr;
+ }
+
+ Q3DStudio::IRuntimeMetaData &GetMetaData() override
+ {
+ if (!m_MetaData) {
+ m_MetaData = &IRuntimeMetaData::Create(m_CoreFactory->GetInputStreamFactory());
+ if (!m_MetaData) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "IRuntimeMetaData::Create: Failed to create meta data";
+ }
+ }
+ return *m_MetaData;
+ }
+
+ IActivityZoneManager &GetActivityZoneManager() override { return *m_ActivityZoneManager; }
+
+ IElementAllocator &GetElementAllocator() override { return *m_ElementAllocator; }
+
+ Q3DStudio::UINT32 GetHandleForElement(Q3DStudio::TElement *inElement) override
+ {
+ return inElement->GetHandle();
+ }
+
+ Q3DStudio::TElement *GetElementByHandle(Q3DStudio::UINT32 inHandle) override
+ {
+ return GetElementAllocator().FindElementByHandle(inHandle);
+ }
+};
+
+struct SXMLLoader : public IAppLoadContext
+{
+ SApp &m_App;
+ eastl::string m_ScaleMode;
+ QT3DSI32 mRefCount;
+
+ SXMLLoader(SApp &inApp, const char8_t *sc)
+ : m_App(inApp)
+ , m_ScaleMode(nonNull(sc))
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_App.m_CoreFactory->GetFoundation().getAllocator())
+
+ void EndLoad() override {}
+
+ bool HasCompletedLoading() override { return true; }
+
+ bool OnGraphicsInitialized(IRuntimeFactory &inFactory) override
+ {
+ eastl::vector<SElementAttributeReference> theUIPReferences;
+ eastl::string tempString;
+ for (QT3DSU32 idx = 0, end = m_App.m_OrderedAssets.size(); idx < end; ++idx) {
+ SAssetValue &theAsset = *m_App.m_OrderedAssets[idx].second;
+ eastl::string thePathStr;
+
+ CFileTools::CombineBaseAndRelative(m_App.GetProjectDirectory().c_str(),
+ theAsset.GetSource(), thePathStr);
+ switch (theAsset.getType()) {
+ case AssetValueTypes::Presentation: {
+ QDir::addSearchPath(QStringLiteral("qt3dstudio"),
+ QFileInfo(QString(thePathStr.c_str()))
+ .absoluteDir().absolutePath());
+ SPresentationAsset &thePresentationAsset
+ = *theAsset.getDataPtr<SPresentationAsset>();
+ theUIPReferences.clear();
+
+ if (!m_App.LoadUIP(thePresentationAsset,
+ toConstDataRef(theUIPReferences.data(),
+ (QT3DSU32)theUIPReferences.size()))) {
+ qCCritical(INVALID_OPERATION, "Unable to load presentation %s",
+ thePathStr.c_str());
+ }
+ } break;
+ case AssetValueTypes::Behavior: {
+ SBehaviorAsset &theBehaviorAsset = *theAsset.getDataPtr<SBehaviorAsset>();
+ Q3DStudio::INT32 scriptId
+ = m_App.m_CoreFactory->GetScriptEngineQml().InitializeApplicationBehavior(
+ theBehaviorAsset.m_Src);
+ if (scriptId == 0) {
+ qCCritical(INVALID_OPERATION, "Unable to load application behavior %s",
+ theBehaviorAsset.m_Src.c_str());
+ } else {
+ theBehaviorAsset.m_Handle = scriptId;
+ m_App.m_Behaviors.push_back(eastl::make_pair(theBehaviorAsset, false));
+ }
+ } break;
+ case AssetValueTypes::RenderPlugin: {
+ SRenderPluginAsset &thePluginAsset = *theAsset.getDataPtr<SRenderPluginAsset>();
+
+ inFactory.GetSceneManager().LoadRenderPlugin(
+ thePluginAsset.m_Id, thePathStr.c_str(), thePluginAsset.m_Args);
+ } break;
+
+ case AssetValueTypes::QmlPresentation: {
+ SQmlPresentationAsset &asset = *theAsset.getDataPtr<SQmlPresentationAsset>();
+ inFactory.GetSceneManager().LoadQmlStreamerPlugin(asset.m_Id);
+ } break;
+ // SCXML, NoAssetValue do not need processing here
+ default:
+ break;
+ }
+ }
+ if (m_ScaleMode.empty() == false) {
+ const char8_t *initialScaleMode(m_ScaleMode.c_str());
+ // Force loading to finish here, just like used to happen.
+ if (AreEqual(initialScaleMode, "center")) {
+ inFactory.GetQt3DSRenderContext().SetScaleMode(qt3ds::render::ScaleModes::ExactSize);
+ } else if (AreEqual(initialScaleMode, "fit")) {
+ inFactory.GetQt3DSRenderContext().SetScaleMode(qt3ds::render::ScaleModes::ScaleToFit);
+ } else if (AreEqual(initialScaleMode, "fill")) {
+ inFactory.GetQt3DSRenderContext().SetScaleMode(qt3ds::render::ScaleModes::ScaleToFill);
+ } else {
+ qCCritical(INVALID_PARAMETER, "Unrecognized scale mode attribute value: ",
+ initialScaleMode);
+ }
+ }
+ return true;
+ }
+
+ virtual void OnFirstRender() {}
+};
+
+IAppLoadContext &IAppLoadContext::CreateXMLLoadContext(
+ SApp &inApp, const char8_t *inScaleMode)
+{
+ return *QT3DS_NEW(inApp.m_CoreFactory->GetFoundation().getAllocator(),
+ SXMLLoader)(inApp, inScaleMode);
+}
+
+CAppStr::CAppStr(NVAllocatorCallback &alloc, const char8_t *inStr)
+ : TBase(inStr, ForwardingAllocator(alloc, "CAppStr"))
+{
+}
+
+CAppStr::CAppStr(const CAppStr &inOther)
+ : TBase(inOther)
+{
+}
+
+CAppStr::CAppStr()
+ : TBase()
+{
+}
+
+CAppStr &CAppStr::operator=(const CAppStr &inOther)
+{
+ TBase::operator=(inOther);
+ return *this;
+}
+
+IApplication &IApplication::CreateApplicationCore(Q3DStudio::IRuntimeFactoryCore &inFactory,
+ const char8_t *inApplicationDirectory)
+{
+ return *QT3DS_NEW(inFactory.GetFoundation().getAllocator(), SApp)(inFactory,
+ inApplicationDirectory);
+}
+
+// Checks if the event is one that can cause picking
+bool IApplication::isPickingEvent(TEventCommandHash event)
+{
+ return (event == ON_MOUSEDOWN
+ || event == ON_MOUSEUP
+ || event == ON_MIDDLEMOUSEDOWN
+ || event == ON_MIDDLEMOUSEUP
+ || event == ON_RIGHTMOUSEDOWN
+ || event == ON_RIGHTMOUSEUP
+ || event == ON_MOUSECLICK
+ || event == ON_MIDDLEMOUSECLICK
+ || event == ON_RIGHTMOUSECLICK
+ || event == ON_MOUSEOVER
+ || event == ON_MOUSEOUT
+ || event == ON_GROUPEDMOUSEOVER
+ || event == ON_GROUPEDMOUSEOUT);
+}
+
+QDebug operator<<(QDebug debug, const DataInOutAttribute &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "DataInOutAttribute(";
+ debug.nospace() << "elementPath:" << value.elementPath;
+ debug.nospace() << ", attributeNames: {";
+ for (auto name : value.attributeName)
+ debug << QString::fromUtf8(name);
+
+ debug.nospace() << "}, propertyType:" << value.propertyType;
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const DataInOutType &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "DataInOutType::";
+ switch (value) {
+ case DataInOutType::DataInOutTypeInvalid:
+ debug.nospace() << "DataInOutTypeInvalid";
+ break;
+ case DataInOutType::DataInOutTypeRangedNumber:
+ debug.nospace() << "DataInOutTypeRangedNumber";
+ break;
+ case DataInOutType::DataInOutTypeString:
+ debug.nospace() << "DataInOutTypeString";
+ break;
+ case DataInOutType::DataInOutTypeFloat:
+ debug.nospace() << "DataInOutTypeFloat";
+ break;
+ case DataInOutType::DataInOutTypeEvaluator:
+ debug.nospace() << "DataInOutTypeEvaluator";
+ break;
+ case DataInOutType::DataInOutTypeBoolean:
+ debug.nospace() << "DataInOutTypeBoolean";
+ break;
+ case DataInOutType::DataInOutTypeVector4:
+ debug.nospace() << "DataInOutTypeVector4";
+ break;
+ case DataInOutType::DataInOutTypeVector3:
+ debug.nospace() << "DataInOutTypeVector3";
+ break;
+ case DataInOutType::DataInOutTypeVector2:
+ debug.nospace() << "DataInOutTypeVector2";
+ break;
+ case DataInOutType::DataInOutTypeVariant:
+ debug.nospace() << "DataInOutTypeVariant";
+ break;
+ default:
+ debug.nospace() << "UNKNOWN";
+ }
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const DataInputValueRole &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "DataInputValueRole::";
+ switch (value) {
+ case DataInputValueRole::Value:
+ debug.nospace() << "Value";
+ break;
+ case DataInputValueRole::Min:
+ debug.nospace() << "Min";
+ break;
+ case DataInputValueRole::Max:
+ debug.nospace() << "Max";
+ break;
+ default:
+ debug.nospace() << "UNKNOWN";
+ }
+ return debug;
+}
+
+// TODO: optionally print out also metadata, but note that it is not
+// relevant for any runtime or editor -side code debugging (strictly user-side
+// information).
+QDebug operator<<(QDebug debug, const DataInputDef &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "DataInputDef(";
+ debug.nospace() << "type:" << value.type;
+ debug.nospace() << ", controlledAttributes: {";
+ for (auto attr : value.controlledAttributes)
+ debug << attr;
+
+ debug.nospace() << "}, min:" << value.min;
+ debug.nospace() << ", min:" << value.min << ", max:" << value.max;
+ debug.nospace() << ", evaluator:" << value.evaluator;
+ debug.nospace() << ", value:" << value.value;
+ debug.nospace() << ", dependents:{";
+ for (auto dep : value.dependents)
+ debug << dep;
+
+ debug.nospace() << "})";
+ return debug;
+}
+
+QDebug operator<<(QDebug debug, const DataOutputDef &value)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "DataOutputDef(";
+ debug.nospace() << "name:" << value.name << ", type:" << value.type;
+ debug.nospace() << ", observedHandle:" << value.observedHandle;
+ debug.nospace() << ", min:" << value.min << ", max:" << value.max;
+ debug.nospace() << ", timelineComponent:" << value.timelineComponent << ")";
+ return debug;
+}
diff --git a/src/runtime/Qt3DSApplication.h b/src/runtime/Qt3DSApplication.h
new file mode 100644
index 0000000..f38b182
--- /dev/null
+++ b/src/runtime/Qt3DSApplication.h
@@ -0,0 +1,261 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_APPLICATION_H
+#define QT3DS_APPLICATION_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Utils.h"
+#include "Qt3DSKernelTypes.h"
+#include "Qt3DSMetadata.h"
+#include "QtQml/qjsengine.h"
+
+namespace Q3DStudio {
+class IRuntimeFactory;
+class IRuntimeFactoryCore;
+class CRuntime;
+class CPresentation;
+class CInputEngine;
+class IAudioPlayer;
+}
+
+namespace qt3ds {
+namespace state {
+namespace debugger {
+class IDebugger;
+class ISceneGraphRuntimeDebugger;
+}
+}
+}
+
+namespace qt3ds {
+class Qt3DSAssetVisitor;
+namespace runtime {
+using namespace qt3ds::foundation;
+using namespace qt3ds;
+
+class IElementAllocator;
+class IActivityZoneManager;
+
+class CAppStr : public eastl::basic_string<char8_t, ForwardingAllocator>
+{
+ typedef eastl::basic_string<char8_t, ForwardingAllocator> TBase;
+
+public:
+ CAppStr(NVAllocatorCallback &alloc, const char8_t *inStr = NULL);
+ CAppStr(const CAppStr &inOther);
+ CAppStr();
+ CAppStr &operator=(const CAppStr &inOther);
+};
+
+class IApplication;
+
+class IAppRunnable : public NVRefCounted
+{
+public:
+ virtual void Run() = 0;
+};
+
+struct DataInOutAttribute
+{
+ QByteArray elementPath;
+ QVector<QByteArray> attributeName;
+ Q3DStudio::EAttributeType propertyType = Q3DStudio::ATTRIBUTETYPE_NONE;
+};
+
+enum DataInOutType {
+ DataInOutTypeInvalid = 0,
+ DataInOutTypeRangedNumber,
+ DataInOutTypeString,
+ DataInOutTypeFloat,
+ DataInOutTypeEvaluator,
+ DataInOutTypeBoolean,
+ DataInOutTypeVector4,
+ DataInOutTypeVector3,
+ DataInOutTypeVector2,
+ DataInOutTypeVariant
+};
+
+// Duplicated from Q3DSDataInput class on viewer side
+enum class DataInputValueRole {
+ Value = 0,
+ Min = 1,
+ Max = 2
+};
+
+struct DataInputDef
+{
+ QVector<DataInOutAttribute> controlledAttributes;
+ DataInOutType type = DataInOutTypeInvalid;
+ float min = 0.0f;
+ float max = 0.0f;
+ QString evaluator;
+ QJSValue evalFunc; // keep both evaluator string and JS function
+ // to avoid having to evaluate string several times
+ QVariant value; // most recently set value
+ // evaluator datainputs that need to re-evaluate when this datainput changes value
+ QVector<QString> dependents;
+ QHash<QString, QString> metadata;
+};
+
+struct DataOutputDef
+{
+ DataInOutAttribute observedAttribute;
+ DataInOutType type = DataInOutTypeInvalid;
+ QVariant value; // most recently notified value
+ QString name;
+ QT3DSU32 observedHandle;
+ float min = 0.0f;
+ float max = 0.0f;
+ Q3DStudio::TComponent *timelineComponent; // Valid only for @timeline
+};
+
+typedef QMap<QString, DataInputDef> DataInputMap;
+typedef QMap<QString, DataOutputDef> DataOutputMap;
+
+class QT3DS_AUTOTEST_EXPORT IApplication : public NVRefCounted
+{
+public:
+ virtual Q3DStudio::IRuntimeFactory &GetRuntimeFactory() const = 0;
+
+ virtual void SetFrameCount(Q3DStudio::INT32 inFrameCount) = 0;
+ virtual Q3DStudio::INT32 GetFrameCount() = 0;
+
+ // Allow overriding the global wall time. This way animations can be
+ // advanced at an arbitrary rate when rendering offscreen. Set to 0 to
+ // disable (the default).
+ virtual void SetTimeMilliSecs(Q3DStudio::INT64 inMilliSecs) = 0;
+
+ virtual Q3DStudio::INT64 GetTimeMilliSecs() = 0;
+ virtual void ResetTime() = 0;
+
+ // Setup during UpdateAndRender. Returns 0 for first frame.
+ virtual double GetMillisecondsSinceLastFrame() = 0;
+
+ virtual Q3DStudio::CInputEngine &GetInputEngine() = 0;
+
+ virtual Q3DStudio::CPresentation *GetPrimaryPresentation() = 0;
+
+ virtual Q3DStudio::CPresentation *GetPresentationById(const char8_t *inId) = 0;
+
+ virtual QList<Q3DStudio::CPresentation *> GetPresentationList() = 0;
+
+ // Update all the presentations and render them. Called exactly once per frame.
+ virtual void UpdateAndRender() = 0;
+
+ virtual bool IsApplicationDirty() = 0;
+
+ virtual void MarkApplicationDirty() = 0;
+
+ virtual Q3DStudio::IAudioPlayer &GetAudioPlayer() = 0;
+
+ virtual bool createSuccessful() = 0;
+
+ virtual DataInputMap &dataInputMap() = 0;
+ virtual DataOutputMap &dataOutputMap() = 0;
+
+ virtual QList<QString> dataInputs() const = 0;
+ virtual QList<QString> dataOutputs() const = 0;
+
+ virtual float dataInputMax(const QString &name) const = 0;
+ virtual float dataInputMin(const QString &name) const = 0;
+ virtual QHash<QString, QString> dataInputMetadata(const QString &name) const = 0;
+
+ virtual void setPresentationId(const QString &id) = 0;
+
+ virtual void preloadSlide(const QString &slide) = 0;
+ virtual void unloadSlide(const QString &slide) = 0;
+ virtual void setDelayedLoading(bool enable) = 0;
+
+ // threadsafe call.
+ virtual void QueueForMainThread(IAppRunnable &inRunnable) = 0;
+
+ // The directory that contains the executable and the root resource path
+ virtual CRegisteredString GetApplicationDirectory() const = 0;
+ // Directory that contained the UIA file.
+ virtual CRegisteredString GetProjectDirectory() const = 0;
+ // Directory where we will copy shared object files to before we load them.
+ // This is specifically for android and the case where the place where the project exists
+ // is not always the place where we can load the project.
+ virtual CRegisteredString GetDllDir() const = 0;
+ virtual void SetDllDir(const char *inDllDir) = 0;
+ virtual Q3DStudio::THashValue HashString(const char *inStr) = 0;
+ virtual const char *ReverseHash(Q3DStudio::THashValue theValue) = 0;
+
+ virtual Q3DStudio::IRuntimeMetaData &GetMetaData() = 0;
+ // Element handles are unique across all presentations.
+ virtual Q3DStudio::TElement *GetElementByHandle(Q3DStudio::UINT32 inHandle) = 0;
+ // Passing in NULL gets you zero as the return handle.
+ virtual Q3DStudio::UINT32 GetHandleForElement(Q3DStudio::TElement *inElement) = 0;
+
+ virtual Q3DStudio::IRuntimeFactoryCore &GetRuntimeFactoryCore() = 0;
+
+ virtual IActivityZoneManager &GetActivityZoneManager() = 0;
+ virtual IElementAllocator &GetElementAllocator() = 0;
+
+ // nonblocking call to begin loading, loads uia file alone and returns.
+ virtual bool BeginLoad(const QString &sourcePath, const QStringList &variantList) = 0;
+ // blocking call to end all loading threads and such/wait till finished
+ virtual void EndLoad() = 0;
+ // Will EndLoad cause nontrivial blocking.
+ // Runs any queued runnables.
+ virtual bool HasCompletedLoading() = 0;
+
+ virtual void setAssetVisitor(qt3ds::Qt3DSAssetVisitor *) = 0;
+
+ virtual void ComponentSlideEntered(Q3DStudio::CPresentation *presentation,
+ Q3DStudio::TElement *component,
+ const QString &elementPath, int slideIndex,
+ const QString &slideName) = 0;
+ virtual void ComponentSlideExited(Q3DStudio::CPresentation *presentation,
+ Q3DStudio::TElement *component,
+ const QString &elementPath, int slideIndex,
+ const QString &slideName) = 0;
+
+ // will force loading to end if endLoad hasn't been called yet. Will fire off loading
+ // of resources that need to be uploaded to opengl. Maintains reference to runtime factory
+ virtual IApplication &CreateApplication(Q3DStudio::CInputEngine &inInputEngine,
+ Q3DStudio::IAudioPlayer *inAudioPlayer,
+ Q3DStudio::IRuntimeFactory &inFactory) = 0;
+
+ // maintains reference to runtime factory core. AppDir is where the executable is located;
+ // the system will expect res directory
+ // next to executable.
+ static IApplication &CreateApplicationCore(Q3DStudio::IRuntimeFactoryCore &inFactory,
+ const char8_t *inApplicationDirectory);
+ static bool isPickingEvent(Q3DStudio::TEventCommandHash event);
+};
+
+bool isImagePath(const QString &path);
+}
+}
+
+#endif
diff --git a/src/runtime/Qt3DSApplicationValues.h b/src/runtime/Qt3DSApplicationValues.h
new file mode 100644
index 0000000..80e8f73
--- /dev/null
+++ b/src/runtime/Qt3DSApplicationValues.h
@@ -0,0 +1,369 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#include "Qt3DSApplication.h"
+#include "foundation/Qt3DSDiscriminatedUnion.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+
+class Qt3DSAssetVisitor
+{
+public:
+ virtual void visit(const char *path) = 0;
+ virtual void visit(const char *type, const char *id, const char *src, const char *args) = 0;
+};
+
+namespace runtime {
+
+ using qt3ds::foundation::CRegisteredString;
+
+ struct AssetValueTypes
+ {
+ enum Enum {
+ NoAssetValue = 0,
+ Presentation,
+ SCXML,
+ RenderPlugin,
+ Behavior,
+ QmlPresentation,
+ };
+ };
+ struct SAssetBase
+ {
+ CRegisteredString m_Id;
+ CRegisteredString m_Src;
+ CRegisteredString m_Args;
+ SAssetBase(CRegisteredString inId = CRegisteredString(),
+ CRegisteredString inSrc = CRegisteredString(),
+ CRegisteredString inArgs = CRegisteredString())
+ : m_Id(inId)
+ , m_Src(inSrc)
+ , m_Args(inArgs)
+ {
+ }
+ bool operator==(const SAssetBase &inOther) const
+ {
+ return m_Id == inOther.m_Id && m_Src == inOther.m_Src
+ && m_Args == inOther.m_Args;
+ }
+ template <typename TRemapper>
+ void Remap(TRemapper &item)
+ {
+ item.Remap(m_Id);
+ item.Remap(m_Src);
+ item.Remap(m_Args);
+ }
+ virtual const char *Type() const
+ {
+ return nullptr;
+ }
+ };
+
+ struct SPresentationAsset : public SAssetBase
+ {
+ Q3DStudio::CPresentation *m_Presentation;
+ bool m_Active;
+
+ SPresentationAsset(CRegisteredString inId = CRegisteredString(),
+ CRegisteredString inRelPath = CRegisteredString(),
+ Q3DStudio::CPresentation *inPresentation = NULL)
+ : SAssetBase(inId, inRelPath, CRegisteredString())
+ , m_Presentation(inPresentation)
+ , m_Active(true)
+ {
+ }
+
+ bool operator==(const SPresentationAsset &inOther) const
+ {
+ return SAssetBase::operator==(inOther) && m_Presentation == inOther.m_Presentation
+ && m_Active == inOther.m_Active;
+ }
+
+ template <typename TRemapper>
+ void Remap(TRemapper &item)
+ {
+ m_Presentation = NULL;
+ SAssetBase::Remap(item);
+ }
+ const char *Type() const override
+ {
+ return "presentation";
+ }
+ };
+
+ struct SSCXMLAsset : public SAssetBase
+ {
+ CRegisteredString m_Datamodel;
+ SSCXMLAsset(CRegisteredString inId = CRegisteredString(),
+ CRegisteredString inRelPath = CRegisteredString(),
+ CRegisteredString inDatamodel = CRegisteredString())
+ : SAssetBase(inId, inRelPath, CRegisteredString())
+ , m_Datamodel(inDatamodel)
+ {
+ }
+ bool operator==(const SSCXMLAsset &inOther) const
+ {
+ return SAssetBase::operator==(inOther) && m_Datamodel == inOther.m_Datamodel;
+ }
+ template <typename TRemapper>
+ void Remap(TRemapper &item)
+ {
+ SAssetBase::Remap(item);
+ item.Remap(m_Datamodel);
+ }
+ const char *Type() const override
+ {
+ return "scxml";
+ }
+ };
+
+ struct SRenderPluginAsset : public SAssetBase
+ {
+ SRenderPluginAsset(CRegisteredString inId = CRegisteredString(),
+ CRegisteredString inRelPath = CRegisteredString(),
+ CRegisteredString inArgs = CRegisteredString())
+ : SAssetBase(inId, inRelPath, inArgs)
+ {
+ }
+ const char *Type() const override
+ {
+ return "renderplugin";
+ }
+ };
+
+ struct SQmlPresentationAsset : public SAssetBase
+ {
+ SQmlPresentationAsset(CRegisteredString inId = CRegisteredString(),
+ CRegisteredString inRelPath = CRegisteredString(),
+ CRegisteredString inArgs = CRegisteredString())
+ : SAssetBase(inId, inRelPath, inArgs)
+ {
+ }
+ const char *Type() const override
+ {
+ return "presentation-qml";
+ }
+ };
+
+ struct SBehaviorAsset : public SAssetBase
+ {
+ Q3DStudio::INT32 m_Handle;
+ SBehaviorAsset(CRegisteredString inId = CRegisteredString(),
+ CRegisteredString inRelPath = CRegisteredString(),
+ Q3DStudio::INT32 inHandle = 0)
+ : SAssetBase(inId, inRelPath, CRegisteredString())
+ , m_Handle(inHandle)
+ {
+ }
+ bool operator==(const SBehaviorAsset &inOther) const
+ {
+ return SAssetBase::operator==(inOther) && m_Handle == inOther.m_Handle;
+ }
+ template <typename TRemapper>
+ void Remap(TRemapper &item)
+ {
+ m_Handle = -1;
+ SAssetBase::Remap(item);
+ }
+ const char *Type() const override
+ {
+ return "behaviour";
+ }
+ };
+}
+}
+
+namespace qt3ds {
+namespace foundation {
+ template <>
+ struct DestructTraits<qt3ds::runtime::SPresentationAsset>
+ {
+ void destruct(qt3ds::runtime::SPresentationAsset &) {}
+ };
+ template <>
+ struct DestructTraits<qt3ds::runtime::SSCXMLAsset>
+ {
+ void destruct(qt3ds::runtime::SSCXMLAsset &) {}
+ };
+ template <>
+ struct DestructTraits<qt3ds::runtime::SRenderPluginAsset>
+ {
+ void destruct(qt3ds::runtime::SRenderPluginAsset &) {}
+ };
+ template <>
+ struct DestructTraits<qt3ds::runtime::SBehaviorAsset>
+ {
+ void destruct(qt3ds::runtime::SBehaviorAsset &) {}
+ };
+}
+}
+
+namespace qt3ds {
+namespace runtime {
+
+ // Force compile error if unsupported datatype requested
+ template <typename TDataType>
+ struct SAssetValueTypeMap
+ {
+ };
+
+ template <>
+ struct SAssetValueTypeMap<SPresentationAsset>
+ {
+ static AssetValueTypes::Enum GetType() { return AssetValueTypes::Presentation; }
+ };
+ template <>
+ struct SAssetValueTypeMap<SSCXMLAsset>
+ {
+ static AssetValueTypes::Enum GetType() { return AssetValueTypes::SCXML; }
+ };
+ template <>
+ struct SAssetValueTypeMap<SRenderPluginAsset>
+ {
+ static AssetValueTypes::Enum GetType() { return AssetValueTypes::RenderPlugin; }
+ };
+ template <>
+ struct SAssetValueTypeMap<SQmlPresentationAsset>
+ {
+ static AssetValueTypes::Enum GetType() { return AssetValueTypes::QmlPresentation; }
+ };
+ template <>
+ struct SAssetValueTypeMap<SBehaviorAsset>
+ {
+ static AssetValueTypes::Enum GetType() { return AssetValueTypes::Behavior; }
+ };
+
+ struct SAssetValueUnionTraits
+ {
+ typedef AssetValueTypes::Enum TIdType;
+ enum {
+ TBufferSize = sizeof(SPresentationAsset),
+ };
+
+ static TIdType getNoDataId() { return AssetValueTypes::NoAssetValue; }
+
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return SAssetValueTypeMap<TDataType>().GetType();
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case AssetValueTypes::Presentation:
+ return inVisitor(*NVUnionCast<SPresentationAsset *>(inData));
+ case AssetValueTypes::SCXML:
+ return inVisitor(*NVUnionCast<SSCXMLAsset *>(inData));
+ case AssetValueTypes::RenderPlugin:
+ return inVisitor(*NVUnionCast<SRenderPluginAsset *>(inData));
+ case AssetValueTypes::Behavior:
+ return inVisitor(*NVUnionCast<SBehaviorAsset *>(inData));
+ case AssetValueTypes::QmlPresentation:
+ return inVisitor(*NVUnionCast<SQmlPresentationAsset*>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case AssetValueTypes::NoAssetValue:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case AssetValueTypes::Presentation:
+ return inVisitor(*NVUnionCast<const SPresentationAsset *>(inData));
+ case AssetValueTypes::SCXML:
+ return inVisitor(*NVUnionCast<const SSCXMLAsset *>(inData));
+ case AssetValueTypes::RenderPlugin:
+ return inVisitor(*NVUnionCast<const SRenderPluginAsset *>(inData));
+ case AssetValueTypes::Behavior:
+ return inVisitor(*NVUnionCast<const SBehaviorAsset *>(inData));
+ case AssetValueTypes::QmlPresentation:
+ return inVisitor(*NVUnionCast<const SQmlPresentationAsset *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case AssetValueTypes::NoAssetValue:
+ return inVisitor();
+ }
+ }
+ };
+
+ typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<SAssetValueUnionTraits,
+ SAssetValueUnionTraits::TBufferSize>,
+ SAssetValueUnionTraits::TBufferSize>
+ TAssetValueUnionType;
+
+ struct SAssetValue : public TAssetValueUnionType
+ {
+ SAssetValue() {}
+
+ SAssetValue(const SAssetValue &inOther)
+ : TAssetValueUnionType(static_cast<const TAssetValueUnionType &>(inOther))
+ {
+ }
+
+ template <typename TDataType>
+ SAssetValue(const TDataType &inDt)
+ : TAssetValueUnionType(inDt)
+ {
+ }
+
+ SAssetValue &operator=(const SAssetValue &inOther)
+ {
+ TAssetValueUnionType::operator=(inOther);
+ return *this;
+ }
+
+ bool operator==(const SAssetValue &inOther) const
+ {
+ return TAssetValueUnionType::operator==(inOther);
+ }
+ bool operator!=(const SAssetValue &inOther) const
+ {
+ return TAssetValueUnionType::operator!=(inOther);
+ }
+
+ bool empty() const { return getType() == AssetValueTypes::NoAssetValue; }
+
+ CRegisteredString GetSource()
+ {
+ if (empty())
+ return CRegisteredString();
+ return reinterpret_cast<SAssetBase *>(m_Data)->m_Src;
+ }
+ };
+}
+}
diff --git a/src/runtime/Qt3DSAttributeHashes.cpp b/src/runtime/Qt3DSAttributeHashes.cpp
new file mode 100644
index 0000000..1daddc1
--- /dev/null
+++ b/src/runtime/Qt3DSAttributeHashes.cpp
@@ -0,0 +1,296 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSAttributeHashes.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+// !!!!! AUTOGENERATED CODE - DO NOT MODIFY MANUALLY !!!!!
+
+// Run the AttributeHashes project to regenerate this file from Attributehashes.txt list
+
+
+
+/// Function providing reverse hash lookup
+const char *GetAttributeString(const EAttribute inAttribute)
+{
+ switch (inAttribute) {
+ case ATTRIBUTE_NAME: return "name";
+ case ATTRIBUTE_TYPE: return "type";
+ case ATTRIBUTE_OPACITY: return "opacity";
+ case ATTRIBUTE_STARTTIME: return "starttime";
+ case ATTRIBUTE_ENDTIME: return "endtime";
+ case ATTRIBUTE_SOURCEPATH: return "sourcepath";
+ case ATTRIBUTE_IMPORTID: return "importid";
+ case ATTRIBUTE_EYEBALL: return "eyeball";
+ case ATTRIBUTE_POSITION: return "position";
+ case ATTRIBUTE_POSITION_X: return "position.x";
+ case ATTRIBUTE_POSITION_Y: return "position.y";
+ case ATTRIBUTE_POSITION_Z: return "position.z";
+ case ATTRIBUTE_ROTATION: return "rotation";
+ case ATTRIBUTE_ROTATION_X: return "rotation.x";
+ case ATTRIBUTE_ROTATION_Y: return "rotation.y";
+ case ATTRIBUTE_ROTATION_Z: return "rotation.z";
+ case ATTRIBUTE_SCALE: return "scale";
+ case ATTRIBUTE_SCALE_X: return "scale.x";
+ case ATTRIBUTE_SCALE_Y: return "scale.y";
+ case ATTRIBUTE_SCALE_Z: return "scale.z";
+ case ATTRIBUTE_PIVOT: return "pivot";
+ case ATTRIBUTE_PIVOT_X: return "pivot.x";
+ case ATTRIBUTE_PIVOT_Y: return "pivot.y";
+ case ATTRIBUTE_PIVOT_Z: return "pivot.z";
+ case ATTRIBUTE_ROTATIONORDER: return "rotationorder";
+ case ATTRIBUTE_ORIENTATION: return "orientation";
+ case ATTRIBUTE_SHADOWCASTER: return "shadowcaster";
+ case ATTRIBUTE_TESSELLATION: return "tessellation";
+ case ATTRIBUTE_EDGETESS: return "edgetess";
+ case ATTRIBUTE_INNERTESS: return "innertess";
+ case ATTRIBUTE_ORTHOGRAPHIC: return "orthographic";
+ case ATTRIBUTE_CLIPNEAR: return "clipnear";
+ case ATTRIBUTE_CLIPFAR: return "clipfar";
+ case ATTRIBUTE_FOV: return "fov";
+ case ATTRIBUTE_FOVHORIZONTAL: return "fovhorizontal";
+ case ATTRIBUTE_SCALEMODE: return "scalemode";
+ case ATTRIBUTE_SCALEANCHOR: return "scaleanchor";
+ case ATTRIBUTE_BRIGHTNESS: return "brightness";
+ case ATTRIBUTE_LINEARFADE: return "linearfade";
+ case ATTRIBUTE_EXPFADE: return "expfade";
+ case ATTRIBUTE_LIGHTTYPE: return "lighttype";
+ case ATTRIBUTE_SCOPE: return "scope";
+ case ATTRIBUTE_LIGHTDIFFUSE: return "lightdiffuse";
+ case ATTRIBUTE_LIGHTDIFFUSE_R: return "lightdiffuse.r";
+ case ATTRIBUTE_LIGHTDIFFUSE_G: return "lightdiffuse.g";
+ case ATTRIBUTE_LIGHTDIFFUSE_B: return "lightdiffuse.b";
+ case ATTRIBUTE_LIGHTDIFFUSE_A: return "lightdiffuse.a";
+ case ATTRIBUTE_LIGHTAMBIENT: return "lightambient";
+ case ATTRIBUTE_LIGHTAMBIENT_R: return "lightambient.r";
+ case ATTRIBUTE_LIGHTAMBIENT_G: return "lightambient.g";
+ case ATTRIBUTE_LIGHTAMBIENT_B: return "lightambient.b";
+ case ATTRIBUTE_LIGHTAMBIENT_A: return "lightambient.a";
+ case ATTRIBUTE_LIGHTSPECULAR: return "lightspecular";
+ case ATTRIBUTE_LIGHTSPECULAR_R: return "lightspecular.r";
+ case ATTRIBUTE_LIGHTSPECULAR_G: return "lightspecular.g";
+ case ATTRIBUTE_LIGHTSPECULAR_B: return "lightspecular.b";
+ case ATTRIBUTE_LIGHTSPECULAR_A: return "lightspecular.a";
+ case ATTRIBUTE_AREAWIDTH: return "areawidth";
+ case ATTRIBUTE_AREAHEIGHT: return "areaheight";
+ case ATTRIBUTE_CASTSHADOW: return "castshadow";
+ case ATTRIBUTE_SHDWBIAS: return "shdwbias";
+ case ATTRIBUTE_SHDWFACTOR: return "shdwfactor";
+ case ATTRIBUTE_SHDWMAPRES: return "shdwmapres";
+ case ATTRIBUTE_SHDWMAPFAR: return "shdwmapfar";
+ case ATTRIBUTE_SHDWMAPFOV: return "shdwmapfov";
+ case ATTRIBUTE_SHDWFILTER: return "shdwfilter";
+ case ATTRIBUTE_LIGHTMAPINDIRECT: return "lightmapindirect";
+ case ATTRIBUTE_LIGHTMAPRADIOSITY: return "lightmapradiosity";
+ case ATTRIBUTE_LIGHTMAPSHADOW: return "lightmapshadow";
+ case ATTRIBUTE_IBLPROBE: return "iblprobe";
+ case ATTRIBUTE_SHADERLIGHTING: return "shaderlighting";
+ case ATTRIBUTE_EMISSIVEPOWER: return "emissivepower";
+ case ATTRIBUTE_EMISSIVECOLOR: return "emissivecolor";
+ case ATTRIBUTE_EMISSIVECOLOR_R: return "emissivecolor.r";
+ case ATTRIBUTE_EMISSIVECOLOR_G: return "emissivecolor.g";
+ case ATTRIBUTE_EMISSIVECOLOR_B: return "emissivecolor.b";
+ case ATTRIBUTE_EMISSIVECOLOR_A: return "emissivecolor.a";
+ case ATTRIBUTE_DIFFUSE: return "diffuse";
+ case ATTRIBUTE_DIFFUSE_R: return "diffuse.r";
+ case ATTRIBUTE_DIFFUSE_G: return "diffuse.g";
+ case ATTRIBUTE_DIFFUSE_B: return "diffuse.b";
+ case ATTRIBUTE_DIFFUSE_A: return "diffuse.a";
+ case ATTRIBUTE_SPECULARMAP: return "specularmap";
+ case ATTRIBUTE_SPECULARMODEL: return "specularmodel";
+ case ATTRIBUTE_SPECULARTINT: return "speculartint";
+ case ATTRIBUTE_SPECULARTINT_R: return "speculartint.r";
+ case ATTRIBUTE_SPECULARTINT_G: return "speculartint.g";
+ case ATTRIBUTE_SPECULARTINT_B: return "speculartint.b";
+ case ATTRIBUTE_SPECULARTINT_A: return "speculartint.a";
+ case ATTRIBUTE_IOR: return "ior";
+ case ATTRIBUTE_FRESNELPOWER: return "fresnelPower";
+ case ATTRIBUTE_SPECULARAMOUNT: return "specularamount";
+ case ATTRIBUTE_SPECULARROUGHNESS: return "specularroughness";
+ case ATTRIBUTE_ROUGHNESSMAP: return "roughnessmap";
+ case ATTRIBUTE_BLENDMODE: return "blendmode";
+ case ATTRIBUTE_CULLING: return "culling";
+ case ATTRIBUTE_ZBUFFERWRITE: return "zbufferwrite";
+ case ATTRIBUTE_DIFFUSEMAP: return "diffusemap";
+ case ATTRIBUTE_DIFFUSEMAP2: return "diffusemap2";
+ case ATTRIBUTE_DIFFUSEMAP3: return "diffusemap3";
+ case ATTRIBUTE_SPECULARREFLECTION: return "specularreflection";
+ case ATTRIBUTE_OPACITYMAP: return "opacitymap";
+ case ATTRIBUTE_EMISSIVEMAP: return "emissivemap";
+ case ATTRIBUTE_EMISSIVEMAP2: return "emissivemap2";
+ case ATTRIBUTE_BUMPMAP: return "bumpmap";
+ case ATTRIBUTE_BUMPAMOUNT: return "bumpamount";
+ case ATTRIBUTE_NORMALMAP: return "normalmap";
+ case ATTRIBUTE_DISPLACEMENTMAP: return "displacementmap";
+ case ATTRIBUTE_DISPLACEAMOUNT: return "displaceamount";
+ case ATTRIBUTE_TRANSLUCENCYMAP: return "translucencymap";
+ case ATTRIBUTE_TRANSLUCENTFALLOFF: return "translucentfalloff";
+ case ATTRIBUTE_DIFFUSELIGHTWRAP: return "diffuselightwrap";
+ case ATTRIBUTE_REFERENCEDMATERIAL: return "referencedmaterial";
+ case ATTRIBUTE_VERTEXCOLORS: return "vertexcolors";
+ case ATTRIBUTE_ROTATIONUV: return "rotationuv";
+ case ATTRIBUTE_POSITIONU: return "positionu";
+ case ATTRIBUTE_POSITIONV: return "positionv";
+ case ATTRIBUTE_SCALEU: return "scaleu";
+ case ATTRIBUTE_SCALEV: return "scalev";
+ case ATTRIBUTE_PIVOTU: return "pivotu";
+ case ATTRIBUTE_PIVOTV: return "pivotv";
+ case ATTRIBUTE_TILINGMODEHORZ: return "tilingmodehorz";
+ case ATTRIBUTE_TILINGMODEVERT: return "tilingmodevert";
+ case ATTRIBUTE_MAPPINGTYPE: return "mappingtype";
+ case ATTRIBUTE_MAPPINGMODE: return "mappingmode";
+ case ATTRIBUTE_SUBPRESENTATION: return "subpresentation";
+ case ATTRIBUTE_URI: return "uri";
+ case ATTRIBUTE_TRANSPARENT: return "transparent";
+ case ATTRIBUTE_PROGRESSIVEAA: return "progressiveaa";
+ case ATTRIBUTE_MULTISAMPLEAA: return "multisampleaa";
+ case ATTRIBUTE_TEMPORALAA: return "temporalaa";
+ case ATTRIBUTE_BLENDTYPE: return "blendtype";
+ case ATTRIBUTE_HORZFIELDS: return "horzfields";
+ case ATTRIBUTE_LEFT: return "left";
+ case ATTRIBUTE_LEFTUNITS: return "leftunits";
+ case ATTRIBUTE_WIDTH: return "width";
+ case ATTRIBUTE_WIDTHUNITS: return "widthunits";
+ case ATTRIBUTE_RIGHT: return "right";
+ case ATTRIBUTE_RIGHTUNITS: return "rightunits";
+ case ATTRIBUTE_VERTFIELDS: return "vertfields";
+ case ATTRIBUTE_TOP: return "top";
+ case ATTRIBUTE_TOPUNITS: return "topunits";
+ case ATTRIBUTE_HEIGHT: return "height";
+ case ATTRIBUTE_HEIGHTUNITS: return "heightunits";
+ case ATTRIBUTE_BOTTOM: return "bottom";
+ case ATTRIBUTE_BOTTOMUNITS: return "bottomunits";
+ case ATTRIBUTE_AOSTRENGTH: return "aostrength";
+ case ATTRIBUTE_AODISTANCE: return "aodistance";
+ case ATTRIBUTE_AOSOFTNESS: return "aosoftness";
+ case ATTRIBUTE_AOBIAS: return "aobias";
+ case ATTRIBUTE_AOSAMPLERATE: return "aosamplerate";
+ case ATTRIBUTE_AODITHER: return "aodither";
+ case ATTRIBUTE_SHADOWSTRENGTH: return "shadowstrength";
+ case ATTRIBUTE_SHADOWDIST: return "shadowdist";
+ case ATTRIBUTE_SHADOWSOFTNESS: return "shadowsoftness";
+ case ATTRIBUTE_SHADOWBIAS: return "shadowbias";
+ case ATTRIBUTE_LIGHTPROBE: return "lightprobe";
+ case ATTRIBUTE_PROBEBRIGHT: return "probebright";
+ case ATTRIBUTE_FASTIBL: return "fastibl";
+ case ATTRIBUTE_PROBEHORIZON: return "probehorizon";
+ case ATTRIBUTE_PROBEFOV: return "probefov";
+ case ATTRIBUTE_LIGHTPROBE2: return "lightprobe2";
+ case ATTRIBUTE_PROBE2FADE: return "probe2fade";
+ case ATTRIBUTE_PROBE2WINDOW: return "probe2window";
+ case ATTRIBUTE_PROBE2POS: return "probe2pos";
+ case ATTRIBUTE_DISABLEDEPTHTEST: return "disabledepthtest";
+ case ATTRIBUTE_DISABLEDEPTHPREPASS: return "disabledepthprepass";
+ case ATTRIBUTE_TEXTCOLOR: return "textcolor";
+ case ATTRIBUTE_TEXTCOLOR_R: return "textcolor.r";
+ case ATTRIBUTE_TEXTCOLOR_G: return "textcolor.g";
+ case ATTRIBUTE_TEXTCOLOR_B: return "textcolor.b";
+ case ATTRIBUTE_TEXTCOLOR_A: return "textcolor.a";
+ case ATTRIBUTE_SIZE: return "size";
+ case ATTRIBUTE_FONT: return "font";
+ case ATTRIBUTE_DROPSHADOW: return "dropshadow";
+ case ATTRIBUTE_DROPSHADOWSTRENGTH: return "dropshadowstrength";
+ case ATTRIBUTE_DROPSHADOWOFFSETX: return "dropshadowoffsetx";
+ case ATTRIBUTE_DROPSHADOWOFFSETY: return "dropshadowoffsety";
+ case ATTRIBUTE_BOUNDINGBOX: return "boundingbox";
+ case ATTRIBUTE_BOUNDINGBOX_X: return "boundingbox.x";
+ case ATTRIBUTE_BOUNDINGBOX_Y: return "boundingbox.y";
+ case ATTRIBUTE_ELIDE: return "elide";
+ case ATTRIBUTE_TRACKING: return "tracking";
+ case ATTRIBUTE_LEADING: return "leading";
+ case ATTRIBUTE_RENDERSTYLE: return "renderstyle";
+ case ATTRIBUTE_TEXTSTRING: return "textstring";
+ case ATTRIBUTE_BACKCOLOR_R: return "backcolor.r";
+ case ATTRIBUTE_BACKCOLOR_G: return "backcolor.g";
+ case ATTRIBUTE_BACKCOLOR_B: return "backcolor.b";
+ case ATTRIBUTE_BACKCOLOR_A: return "backcolor.a";
+ case ATTRIBUTE_TEXTTYPE: return "texttype";
+ case ATTRIBUTE_USEBACKCOLOR: return "usebackcolor";
+ case ATTRIBUTE_WORDWRAP: return "wordwrap";
+ case ATTRIBUTE_HORZSCROLL: return "horzscroll";
+ case ATTRIBUTE_HORZALIGN: return "horzalign";
+ case ATTRIBUTE_VERTSCROLL: return "vertscroll";
+ case ATTRIBUTE_VERTALIGN: return "vertalign";
+ case ATTRIBUTE_BOXHEIGHT: return "boxheight";
+ case ATTRIBUTE_BOXWIDTH: return "boxwidth";
+ case ATTRIBUTE_REMOTESTRINGSOURCE: return "remotestringsource";
+ case ATTRIBUTE_CACHEDTEXTSTRING: return "cachedtextstring";
+ case ATTRIBUTE_ENABLEACCELERATEDFONT: return "enableacceleratedfont";
+ case ATTRIBUTE_BEHAVIORSCRIPTS: return "BehaviorScripts";
+ case ATTRIBUTE_UICCUSTOMOBJTYPE: return "UICCustomObjType";
+ case ATTRIBUTE_BGCOLORENABLE: return "bgcolorenable";
+ case ATTRIBUTE_BACKGROUND: return "background";
+ case ATTRIBUTE_BACKGROUNDCOLOR_R: return "backgroundcolor.r";
+ case ATTRIBUTE_BACKGROUNDCOLOR_G: return "backgroundcolor.g";
+ case ATTRIBUTE_BACKGROUNDCOLOR_B: return "backgroundcolor.b";
+ case ATTRIBUTE_BACKGROUNDCOLOR_A: return "backgroundcolor.a";
+ case ATTRIBUTE_PATHTYPE: return "pathtype";
+ case ATTRIBUTE_LINEARERROR: return "linearerror";
+ case ATTRIBUTE_EDGETESSAMOUNT: return "edgetessamount";
+ case ATTRIBUTE_INNERTESSAMOUNT: return "innertessamount";
+ case ATTRIBUTE_BEGINCAP: return "begincap";
+ case ATTRIBUTE_BEGINCAPOFFSET: return "begincapoffset";
+ case ATTRIBUTE_BEGINCAPOPACITY: return "begincapopacity";
+ case ATTRIBUTE_BEGINCAPWIDTH: return "begincapwidth";
+ case ATTRIBUTE_ENDCAP: return "endcap";
+ case ATTRIBUTE_ENDCAPOFFSET: return "endcapoffset";
+ case ATTRIBUTE_ENDCAPOPACITY: return "endcapopacity";
+ case ATTRIBUTE_ENDCAPWIDTH: return "endcapwidth";
+ case ATTRIBUTE_PAINTSTYLE: return "paintstyle";
+ case ATTRIBUTE_CLOSED: return "closed";
+ case ATTRIBUTE_INCOMINGANGLE: return "incomingangle";
+ case ATTRIBUTE_INCOMINGDISTANCE: return "incomingdistance";
+ case ATTRIBUTE_OUTGOINGDISTANCE: return "outgoingdistance";
+ case ATTRIBUTE_PARTICLETYPE: return "particletype";
+ case ATTRIBUTE_MAXPARTICLES: return "maxparticles";
+ case ATTRIBUTE_PARTICLESIZE: return "particlesize";
+ case ATTRIBUTE_LIFETIME: return "lifetime";
+ case ATTRIBUTE_CONTROLLEDPROPERTY: return "controlledproperty";
+ case ATTRIBUTE_OBSERVEDPROPERTY: return "observedproperty";
+ case ATTRIBUTE_QT_IO: return "qt.io";
+ default: {
+ static char s_UnknownHash[16];
+ sprintf(s_UnknownHash, "(0x%08X)", inAttribute);
+ return s_UnknownHash;
+ }
+ }
+}
+
+} // namespace Q3DStudio
+
diff --git a/src/runtime/Qt3DSAttributeHashes.h b/src/runtime/Qt3DSAttributeHashes.h
new file mode 100644
index 0000000..1f712a8
--- /dev/null
+++ b/src/runtime/Qt3DSAttributeHashes.h
@@ -0,0 +1,286 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+// !!!!! AUTOGENERATED CODE - DO NOT MODIFY MANUALLY !!!!!
+
+// Run the AttributeHashes project to regenerate this file from Attributehashes.txt list
+
+/// Key for the CElement attribute-value pair
+enum EAttribute {
+ ATTRIBUTE_NAME = 0x02B79D95, // name
+ ATTRIBUTE_TYPE = 0x005F9806, // type
+ ATTRIBUTE_OPACITY = 0x0191C315, // opacity
+ ATTRIBUTE_STARTTIME = 0x010A57B1, // starttime
+ ATTRIBUTE_ENDTIME = 0x003BF5F8, // endtime
+ ATTRIBUTE_SOURCEPATH = 0x0009EA60, // sourcepath
+ ATTRIBUTE_IMPORTID = 0x008F7900, // importid
+ ATTRIBUTE_EYEBALL = 0x02F454F0, // eyeball
+ ATTRIBUTE_POSITION = 0x00E9B7D7, // position
+ ATTRIBUTE_POSITION_X = 0x027C230D, // position.x
+ ATTRIBUTE_POSITION_Y = 0x027D234C, // position.y
+ ATTRIBUTE_POSITION_Z = 0x027E238B, // position.z
+ ATTRIBUTE_ROTATION = 0x03E51862, // rotation
+ ATTRIBUTE_ROTATION_X = 0x0239EE18, // rotation.x
+ ATTRIBUTE_ROTATION_Y = 0x023AEE57, // rotation.y
+ ATTRIBUTE_ROTATION_Z = 0x023BEE96, // rotation.z
+ ATTRIBUTE_SCALE = 0x01012856, // scale
+ ATTRIBUTE_SCALE_X = 0x0065440C, // scale.x
+ ATTRIBUTE_SCALE_Y = 0x0066444B, // scale.y
+ ATTRIBUTE_SCALE_Z = 0x0067448A, // scale.z
+ ATTRIBUTE_PIVOT = 0x009E907E, // pivot
+ ATTRIBUTE_PIVOT_X = 0x03811834, // pivot.x
+ ATTRIBUTE_PIVOT_Y = 0x03821873, // pivot.y
+ ATTRIBUTE_PIVOT_Z = 0x038318B2, // pivot.z
+ ATTRIBUTE_ROTATIONORDER = 0x03CE5F70, // rotationorder
+ ATTRIBUTE_ORIENTATION = 0x001A90B0, // orientation
+ ATTRIBUTE_SHADOWCASTER = 0x0363F874, // shadowcaster
+ ATTRIBUTE_TESSELLATION = 0x0335861F, // tessellation
+ ATTRIBUTE_EDGETESS = 0x023933D2, // edgetess
+ ATTRIBUTE_INNERTESS = 0x01529259, // innertess
+ ATTRIBUTE_ORTHOGRAPHIC = 0x0244BB70, // orthographic
+ ATTRIBUTE_CLIPNEAR = 0x0068FF28, // clipnear
+ ATTRIBUTE_CLIPFAR = 0x037EF699, // clipfar
+ ATTRIBUTE_FOV = 0x00D60213, // fov
+ ATTRIBUTE_FOVHORIZONTAL = 0x01BDB34F, // fovhorizontal
+ ATTRIBUTE_SCALEMODE = 0x01FD2FD3, // scalemode
+ ATTRIBUTE_SCALEANCHOR = 0x02CFCF41, // scaleanchor
+ ATTRIBUTE_BRIGHTNESS = 0x0230D3AF, // brightness
+ ATTRIBUTE_LINEARFADE = 0x0104E9FF, // linearfade
+ ATTRIBUTE_EXPFADE = 0x006B9267, // expfade
+ ATTRIBUTE_LIGHTTYPE = 0x0033F1D0, // lighttype
+ ATTRIBUTE_SCOPE = 0x0258D0CC, // scope
+ ATTRIBUTE_LIGHTDIFFUSE = 0x01246FD4, // lightdiffuse
+ ATTRIBUTE_LIGHTDIFFUSE_R = 0x035AAB10, // lightdiffuse.r
+ ATTRIBUTE_LIGHTDIFFUSE_G = 0x034FA85B, // lightdiffuse.g
+ ATTRIBUTE_LIGHTDIFFUSE_B = 0x034AA720, // lightdiffuse.b
+ ATTRIBUTE_LIGHTDIFFUSE_A = 0x0349A6E1, // lightdiffuse.a
+ ATTRIBUTE_LIGHTAMBIENT = 0x00DA56DE, // lightambient
+ ATTRIBUTE_LIGHTAMBIENT_R = 0x0179AD1A, // lightambient.r
+ ATTRIBUTE_LIGHTAMBIENT_G = 0x016EAA65, // lightambient.g
+ ATTRIBUTE_LIGHTAMBIENT_B = 0x0169A92A, // lightambient.b
+ ATTRIBUTE_LIGHTAMBIENT_A = 0x0168A8EB, // lightambient.a
+ ATTRIBUTE_LIGHTSPECULAR = 0x03E39A07, // lightspecular
+ ATTRIBUTE_LIGHTSPECULAR_R = 0x0241EBC3, // lightspecular.r
+ ATTRIBUTE_LIGHTSPECULAR_G = 0x0236E90E, // lightspecular.g
+ ATTRIBUTE_LIGHTSPECULAR_B = 0x0231E7D3, // lightspecular.b
+ ATTRIBUTE_LIGHTSPECULAR_A = 0x0230E794, // lightspecular.a
+ ATTRIBUTE_AREAWIDTH = 0x005A8BE7, // areawidth
+ ATTRIBUTE_AREAHEIGHT = 0x00334D2C, // areaheight
+ ATTRIBUTE_CASTSHADOW = 0x0335FD81, // castshadow
+ ATTRIBUTE_SHDWBIAS = 0x0125E79F, // shdwbias
+ ATTRIBUTE_SHDWFACTOR = 0x01B11BE9, // shdwfactor
+ ATTRIBUTE_SHDWMAPRES = 0x01E53834, // shdwmapres
+ ATTRIBUTE_SHDWMAPFAR = 0x019A30FD, // shdwmapfar
+ ATTRIBUTE_SHDWMAPFOV = 0x00830B07, // shdwmapfov
+ ATTRIBUTE_SHDWFILTER = 0x0176E1E0, // shdwfilter
+ ATTRIBUTE_LIGHTMAPINDIRECT = 0x004F1D6C, // lightmapindirect
+ ATTRIBUTE_LIGHTMAPRADIOSITY = 0x00AC7C50, // lightmapradiosity
+ ATTRIBUTE_LIGHTMAPSHADOW = 0x00191F3A, // lightmapshadow
+ ATTRIBUTE_IBLPROBE = 0x0039FD03, // iblprobe
+ ATTRIBUTE_SHADERLIGHTING = 0x0068A84F, // shaderlighting
+ ATTRIBUTE_EMISSIVEPOWER = 0x03D6F9F2, // emissivepower
+ ATTRIBUTE_EMISSIVECOLOR = 0x00B7AC94, // emissivecolor
+ ATTRIBUTE_EMISSIVECOLOR_R = 0x039B87D0, // emissivecolor.r
+ ATTRIBUTE_EMISSIVECOLOR_G = 0x0390851B, // emissivecolor.g
+ ATTRIBUTE_EMISSIVECOLOR_B = 0x038B83E0, // emissivecolor.b
+ ATTRIBUTE_EMISSIVECOLOR_A = 0x038A83A1, // emissivecolor.a
+ ATTRIBUTE_DIFFUSE = 0x0105521E, // diffuse
+ ATTRIBUTE_DIFFUSE_R = 0x015B085A, // diffuse.r
+ ATTRIBUTE_DIFFUSE_G = 0x015005A5, // diffuse.g
+ ATTRIBUTE_DIFFUSE_B = 0x014B046A, // diffuse.b
+ ATTRIBUTE_DIFFUSE_A = 0x014A042B, // diffuse.a
+ ATTRIBUTE_SPECULARMAP = 0x034CD047, // specularmap
+ ATTRIBUTE_SPECULARMODEL = 0x039EBE5A, // specularmodel
+ ATTRIBUTE_SPECULARTINT = 0x03535E02, // speculartint
+ ATTRIBUTE_SPECULARTINT_R = 0x0399623E, // speculartint.r
+ ATTRIBUTE_SPECULARTINT_G = 0x038E5F89, // speculartint.g
+ ATTRIBUTE_SPECULARTINT_B = 0x03895E4E, // speculartint.b
+ ATTRIBUTE_SPECULARTINT_A = 0x03885E0F, // speculartint.a
+ ATTRIBUTE_IOR = 0x00667354, // ior
+ ATTRIBUTE_FRESNELPOWER = 0x022178B6, // fresnelPower
+ ATTRIBUTE_SPECULARAMOUNT = 0x01144425, // specularamount
+ ATTRIBUTE_SPECULARROUGHNESS = 0x03925653, // specularroughness
+ ATTRIBUTE_ROUGHNESSMAP = 0x01088174, // roughnessmap
+ ATTRIBUTE_BLENDMODE = 0x01923A6C, // blendmode
+ ATTRIBUTE_CULLING = 0x03C539F0, // culling
+ ATTRIBUTE_ZBUFFERWRITE = 0x03E19B3B, // zbufferwrite
+ ATTRIBUTE_DIFFUSEMAP = 0x00FF8126, // diffusemap
+ ATTRIBUTE_DIFFUSEMAP2 = 0x0038D4A8, // diffusemap2
+ ATTRIBUTE_DIFFUSEMAP3 = 0x0039D4E7, // diffusemap3
+ ATTRIBUTE_SPECULARREFLECTION = 0x006B4C12, // specularreflection
+ ATTRIBUTE_OPACITYMAP = 0x00DA796F, // opacitymap
+ ATTRIBUTE_EMISSIVEMAP = 0x00F6427B, // emissivemap
+ ATTRIBUTE_EMISSIVEMAP2 = 0x03476893, // emissivemap2
+ ATTRIBUTE_BUMPMAP = 0x024EE11A, // bumpmap
+ ATTRIBUTE_BUMPAMOUNT = 0x01BC4192, // bumpamount
+ ATTRIBUTE_NORMALMAP = 0x03BD578B, // normalmap
+ ATTRIBUTE_DISPLACEMENTMAP = 0x01BCD1FB, // displacementmap
+ ATTRIBUTE_DISPLACEAMOUNT = 0x01EC1EAF, // displaceamount
+ ATTRIBUTE_TRANSLUCENCYMAP = 0x01D8F015, // translucencymap
+ ATTRIBUTE_TRANSLUCENTFALLOFF = 0x0097E985, // translucentfalloff
+ ATTRIBUTE_DIFFUSELIGHTWRAP = 0x038F6522, // diffuselightwrap
+ ATTRIBUTE_REFERENCEDMATERIAL = 0x035FDA80, // referencedmaterial
+ ATTRIBUTE_VERTEXCOLORS = 0x000814EC, // vertexcolors
+ ATTRIBUTE_ROTATIONUV = 0x012E3A61, // rotationuv
+ ATTRIBUTE_POSITIONU = 0x01D05AB4, // positionu
+ ATTRIBUTE_POSITIONV = 0x01D15AF3, // positionv
+ ATTRIBUTE_SCALEU = 0x001409F5, // scaleu
+ ATTRIBUTE_SCALEV = 0x00150A34, // scalev
+ ATTRIBUTE_PIVOTU = 0x03F8ABCD, // pivotu
+ ATTRIBUTE_PIVOTV = 0x03F9AC0C, // pivotv
+ ATTRIBUTE_TILINGMODEHORZ = 0x02562203, // tilingmodehorz
+ ATTRIBUTE_TILINGMODEVERT = 0x03F92B21, // tilingmodevert
+ ATTRIBUTE_MAPPINGTYPE = 0x02CA9058, // mappingtype
+ ATTRIBUTE_MAPPINGMODE = 0x002715CF, // mappingmode
+ ATTRIBUTE_SUBPRESENTATION = 0x03CA7426, // subpresentation
+ ATTRIBUTE_URI = 0x00296894, // uri
+ ATTRIBUTE_TRANSPARENT = 0x0316BA2E, // transparent
+ ATTRIBUTE_PROGRESSIVEAA = 0x019F1955, // progressiveaa
+ ATTRIBUTE_MULTISAMPLEAA = 0x013D29FD, // multisampleaa
+ ATTRIBUTE_TEMPORALAA = 0x00212AFE, // temporalaa
+ ATTRIBUTE_BLENDTYPE = 0x0035B4F5, // blendtype
+ ATTRIBUTE_HORZFIELDS = 0x02B8A818, // horzfields
+ ATTRIBUTE_LEFT = 0x0196B9B9, // left
+ ATTRIBUTE_LEFTUNITS = 0x02F9D2D8, // leftunits
+ ATTRIBUTE_WIDTH = 0x00C4D65A, // width
+ ATTRIBUTE_WIDTHUNITS = 0x01D7DF77, // widthunits
+ ATTRIBUTE_RIGHT = 0x039EAB44, // right
+ ATTRIBUTE_RIGHTUNITS = 0x0357EF0D, // rightunits
+ ATTRIBUTE_VERTFIELDS = 0x03462436, // vertfields
+ ATTRIBUTE_TOP = 0x002F6B0B, // top
+ ATTRIBUTE_TOPUNITS = 0x03D58806, // topunits
+ ATTRIBUTE_HEIGHT = 0x00CE9F79, // height
+ ATTRIBUTE_HEIGHTUNITS = 0x00C91D18, // heightunits
+ ATTRIBUTE_BOTTOM = 0x00F4EE75, // bottom
+ ATTRIBUTE_BOTTOMUNITS = 0x0174091C, // bottomunits
+ ATTRIBUTE_AOSTRENGTH = 0x010F7ED1, // aostrength
+ ATTRIBUTE_AODISTANCE = 0x01DC349D, // aodistance
+ ATTRIBUTE_AOSOFTNESS = 0x02CCDC71, // aosoftness
+ ATTRIBUTE_AOBIAS = 0x01818219, // aobias
+ ATTRIBUTE_AOSAMPLERATE = 0x0039B568, // aosamplerate
+ ATTRIBUTE_AODITHER = 0x0274316C, // aodither
+ ATTRIBUTE_SHADOWSTRENGTH = 0x0039ED5F, // shadowstrength
+ ATTRIBUTE_SHADOWDIST = 0x038213FA, // shadowdist
+ ATTRIBUTE_SHADOWSOFTNESS = 0x01F74AFF, // shadowsoftness
+ ATTRIBUTE_SHADOWBIAS = 0x02CB3EA7, // shadowbias
+ ATTRIBUTE_LIGHTPROBE = 0x02D47DC6, // lightprobe
+ ATTRIBUTE_PROBEBRIGHT = 0x029DC5B6, // probebright
+ ATTRIBUTE_FASTIBL = 0x02559509, // fastibl
+ ATTRIBUTE_PROBEHORIZON = 0x014DAAF5, // probehorizon
+ ATTRIBUTE_PROBEFOV = 0x03D66903, // probefov
+ ATTRIBUTE_LIGHTPROBE2 = 0x00430008, // lightprobe2
+ ATTRIBUTE_PROBE2FADE = 0x02ED0742, // probe2fade
+ ATTRIBUTE_PROBE2WINDOW = 0x016B224E, // probe2window
+ ATTRIBUTE_PROBE2POS = 0x024B0C0E, // probe2pos
+ ATTRIBUTE_DISABLEDEPTHTEST = 0x000B8353, // disabledepthtest
+ ATTRIBUTE_DISABLEDEPTHPREPASS = 0x02AE1EA7, // disabledepthprepass
+ ATTRIBUTE_TEXTCOLOR = 0x02D9114A, // textcolor
+ ATTRIBUTE_TEXTCOLOR_R = 0x00E9F186, // textcolor.r
+ ATTRIBUTE_TEXTCOLOR_G = 0x00DEEED1, // textcolor.g
+ ATTRIBUTE_TEXTCOLOR_B = 0x00D9ED96, // textcolor.b
+ ATTRIBUTE_TEXTCOLOR_A = 0x00D8ED57, // textcolor.a
+ ATTRIBUTE_SIZE = 0x00F2C81F, // size
+ ATTRIBUTE_FONT = 0x03412331, // font
+ ATTRIBUTE_DROPSHADOW = 0x03E3F231, // dropshadow
+ ATTRIBUTE_DROPSHADOWSTRENGTH = 0x03F8B7D0, // dropshadowstrength
+ ATTRIBUTE_DROPSHADOWOFFSETX = 0x013298AA, // dropshadowoffsetx
+ ATTRIBUTE_DROPSHADOWOFFSETY = 0x013398E9, // dropshadowoffsety
+ ATTRIBUTE_BOUNDINGBOX = 0x02F3B6D9, // boundingbox
+ ATTRIBUTE_BOUNDINGBOX_X = 0x0272C10F, // boundingbox.x
+ ATTRIBUTE_BOUNDINGBOX_Y = 0x0273C14E, // boundingbox.y
+ ATTRIBUTE_ELIDE = 0x022937DD, // elide
+ ATTRIBUTE_TRACKING = 0x02A25049, // tracking
+ ATTRIBUTE_LEADING = 0x016A6BDA, // leading
+ ATTRIBUTE_RENDERSTYLE = 0x03567B85, // renderstyle
+ ATTRIBUTE_TEXTSTRING = 0x01124062, // textstring
+ ATTRIBUTE_BACKCOLOR_R = 0x0290CCE0, // backcolor.r
+ ATTRIBUTE_BACKCOLOR_G = 0x0285CA2B, // backcolor.g
+ ATTRIBUTE_BACKCOLOR_B = 0x0280C8F0, // backcolor.b
+ ATTRIBUTE_BACKCOLOR_A = 0x027FC8B1, // backcolor.a
+ ATTRIBUTE_TEXTTYPE = 0x0240ADD9, // texttype
+ ATTRIBUTE_USEBACKCOLOR = 0x0243BACB, // usebackcolor
+ ATTRIBUTE_WORDWRAP = 0x0134B04C, // wordwrap
+ ATTRIBUTE_HORZSCROLL = 0x005B3CC4, // horzscroll
+ ATTRIBUTE_HORZALIGN = 0x00BA002A, // horzalign
+ ATTRIBUTE_VERTSCROLL = 0x00E8B8E2, // vertscroll
+ ATTRIBUTE_VERTALIGN = 0x03759C8C, // vertalign
+ ATTRIBUTE_BOXHEIGHT = 0x0079AF8E, // boxheight
+ ATTRIBUTE_BOXWIDTH = 0x016B7105, // boxwidth
+ ATTRIBUTE_REMOTESTRINGSOURCE = 0x025DFEEE, // remotestringsource
+ ATTRIBUTE_CACHEDTEXTSTRING = 0x0095DBA0, // cachedtextstring
+ ATTRIBUTE_ENABLEACCELERATEDFONT = 0x0053A92D, // enableacceleratedfont
+ ATTRIBUTE_BEHAVIORSCRIPTS = 0x01DF916A, // BehaviorScripts
+ ATTRIBUTE_UICCUSTOMOBJTYPE = 0x029F1BCF, // UICCustomObjType
+ ATTRIBUTE_BGCOLORENABLE = 0x0021EE1F, // bgcolorenable
+ ATTRIBUTE_BACKGROUND = 0x006AA932, // background
+ ATTRIBUTE_BACKGROUNDCOLOR_R = 0x02AF0767, // backgroundcolor.r
+ ATTRIBUTE_BACKGROUNDCOLOR_G = 0x02A404B2, // backgroundcolor.g
+ ATTRIBUTE_BACKGROUNDCOLOR_B = 0x029F0377, // backgroundcolor.b
+ ATTRIBUTE_BACKGROUNDCOLOR_A = 0x029E0338, // backgroundcolor.a
+ ATTRIBUTE_PATHTYPE = 0x02D2A5E1, // pathtype
+ ATTRIBUTE_LINEARERROR = 0x0378A51D, // linearerror
+ ATTRIBUTE_EDGETESSAMOUNT = 0x02577E3A, // edgetessamount
+ ATTRIBUTE_INNERTESSAMOUNT = 0x0027A241, // innertessamount
+ ATTRIBUTE_BEGINCAP = 0x03373D37, // begincap
+ ATTRIBUTE_BEGINCAPOFFSET = 0x01FEFE64, // begincapoffset
+ ATTRIBUTE_BEGINCAPOPACITY = 0x02C2761E, // begincapopacity
+ ATTRIBUTE_BEGINCAPWIDTH = 0x0102BDE3, // begincapwidth
+ ATTRIBUTE_ENDCAP = 0x00ADB3A9, // endcap
+ ATTRIBUTE_ENDCAPOFFSET = 0x0382A9D6, // endcapoffset
+ ATTRIBUTE_ENDCAPOPACITY = 0x019BA72C, // endcapopacity
+ ATTRIBUTE_ENDCAPWIDTH = 0x03A315F1, // endcapwidth
+ ATTRIBUTE_PAINTSTYLE = 0x03ADEC8D, // paintstyle
+ ATTRIBUTE_CLOSED = 0x01807034, // closed
+ ATTRIBUTE_INCOMINGANGLE = 0x03890AB3, // incomingangle
+ ATTRIBUTE_INCOMINGDISTANCE = 0x005EB2A5, // incomingdistance
+ ATTRIBUTE_OUTGOINGDISTANCE = 0x017C597F, // outgoingdistance
+ ATTRIBUTE_PARTICLETYPE = 0x01C01260, // particletype
+ ATTRIBUTE_MAXPARTICLES = 0x00BE66B7, // maxparticles
+ ATTRIBUTE_PARTICLESIZE = 0x02534279, // particlesize
+ ATTRIBUTE_LIFETIME = 0x0033D297, // lifetime
+ ATTRIBUTE_CONTROLLEDPROPERTY = 0x022C0A1D, // controlledproperty
+ ATTRIBUTE_OBSERVEDPROPERTY = 0x02D1CE03, // observedproperty
+ ATTRIBUTE_QT_IO = 0x010EF2CF, // qt.io
+}; // enum EAttribute
+
+#define AK_STRING_QT_IO "qt.io"
+
+/// Function providing reverse hash lookup
+const char *GetAttributeString(const EAttribute inAttribute);
+
+} // namespace Q3DStudio
+
diff --git a/src/runtime/Qt3DSAttributeHashes.txt b/src/runtime/Qt3DSAttributeHashes.txt
new file mode 100644
index 0000000..4168bbd
--- /dev/null
+++ b/src/runtime/Qt3DSAttributeHashes.txt
@@ -0,0 +1,249 @@
+name
+type
+opacity
+
+starttime
+endtime
+
+sourcepath
+importid
+eyeball
+position
+position.x
+position.y
+position.z
+rotation
+rotation.x
+rotation.y
+rotation.z
+scale
+scale.x
+scale.y
+scale.z
+pivot
+pivot.x
+pivot.y
+pivot.z
+rotationorder
+orientation
+shadowcaster
+tessellation
+edgetess
+innertess
+
+orthographic
+clipnear
+clipfar
+fov
+fovhorizontal
+scalemode
+scaleanchor
+
+brightness
+linearfade
+expfade
+lighttype
+scope
+lightdiffuse
+lightdiffuse.r
+lightdiffuse.g
+lightdiffuse.b
+lightdiffuse.a
+lightambient
+lightambient.r
+lightambient.g
+lightambient.b
+lightambient.a
+lightspecular
+lightspecular.r
+lightspecular.g
+lightspecular.b
+lightspecular.a
+areawidth
+areaheight
+castshadow
+shdwbias
+shdwfactor
+shdwmapres
+shdwmapfar
+shdwmapfov
+shdwfilter
+
+lightmapindirect
+lightmapradiosity
+lightmapshadow
+
+iblprobe
+
+shaderlighting
+emissivepower
+emissivecolor
+emissivecolor.r
+emissivecolor.g
+emissivecolor.b
+emissivecolor.a
+diffuse
+diffuse.r
+diffuse.g
+diffuse.b
+diffuse.a
+specularmap
+specularmodel
+speculartint
+speculartint.r
+speculartint.g
+speculartint.b
+speculartint.a
+ior
+fresnelPower
+specularamount
+specularroughness
+roughnessmap
+blendmode
+culling
+zbufferwrite
+diffusemap
+diffusemap2
+diffusemap3
+specularreflection
+opacitymap
+emissivemap
+emissivemap2
+bumpmap
+bumpamount
+normalmap
+displacementmap
+displaceamount
+translucencymap
+translucentfalloff
+diffuselightwrap
+referencedmaterial
+vertexcolors
+
+rotationuv
+positionu
+positionv
+scaleu
+scalev
+pivotu
+pivotv
+tilingmodehorz
+tilingmodevert
+mappingtype
+mappingmode
+subpresentation
+uri
+
+transparent
+progressiveaa
+multisampleaa
+temporalaa
+blendtype
+horzfields
+left
+leftunits
+width
+widthunits
+right
+rightunits
+vertfields
+top
+topunits
+height
+heightunits
+bottom
+bottomunits
+aostrength
+aodistance
+aosoftness
+aobias
+aosamplerate
+aodither
+shadowstrength
+shadowdist
+shadowsoftness
+shadowbias
+lightprobe
+probebright
+fastibl
+probehorizon
+probefov
+lightprobe2
+probe2fade
+probe2window
+probe2pos
+disabledepthtest
+disabledepthprepass
+
+textcolor
+textcolor.r
+textcolor.g
+textcolor.b
+textcolor.a
+size
+font
+dropshadow
+dropshadowstrength
+dropshadowoffsetx
+dropshadowoffsety
+boundingbox
+boundingbox.x
+boundingbox.y
+elide
+tracking
+leading
+renderstyle
+textstring
+backcolor.r
+backcolor.g
+backcolor.b
+backcolor.a
+texttype
+usebackcolor
+wordwrap
+horzscroll
+horzalign
+vertscroll
+vertalign
+boxheight
+boxwidth
+remotestringsource
+cachedtextstring
+enableacceleratedfont
+
+BehaviorScripts
+UICCustomObjType
+
+bgcolorenable
+background
+backgroundcolor.r
+backgroundcolor.g
+backgroundcolor.b
+backgroundcolor.a
+
+pathtype
+linearerror
+edgetessamount
+innertessamount
+begincap
+begincapoffset
+begincapopacity
+begincapwidth
+endcap
+endcapoffset
+endcapopacity
+endcapwidth
+paintstyle
+closed
+
+incomingangle
+incomingdistance
+outgoingdistance
+
+particletype
+maxparticles
+particlesize
+lifetime
+
+controlledproperty
+observedproperty
diff --git a/src/runtime/Qt3DSCommandEventTypes.h b/src/runtime/Qt3DSCommandEventTypes.h
new file mode 100644
index 0000000..01a12b4
--- /dev/null
+++ b/src/runtime/Qt3DSCommandEventTypes.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSHash.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Commands
+//==============================================================================
+
+// Command types are 31-bit hash instead of 32-bit
+// The 1 bit flag is being used to differentiate between a Command and an Event
+// Commands trigger execution, both commands and events can trigger logic
+
+// Asset
+const TEventCommandHash COMMAND_SETPROPERTY = CHash::HashEventCommand("COMMAND_SETPROPERTY");
+const TEventCommandHash COMMAND_FIREEVENT = CHash::HashEventCommand("COMMAND_FIREEVENT");
+const TEventCommandHash COMMAND_SCRIPTLET = CHash::HashEventCommand("COMMAND_SCRIPTLET");
+const TEventCommandHash COMMAND_PLAYSOUND = CHash::HashEventCommand("COMMAND_PLAYSOUND");
+const TEventCommandHash COMMAND_EMITSIGNAL = CHash::HashEventCommand("COMMAND_EMITSIGNAL");
+
+// Time
+const TEventCommandHash COMMAND_PLAY = CHash::HashEventCommand("COMMAND_PLAY");
+const TEventCommandHash COMMAND_PAUSE = CHash::HashEventCommand("COMMAND_PAUSE");
+const TEventCommandHash COMMAND_GOTOTIME = CHash::HashEventCommand("COMMAND_GOTOTIME");
+const TEventCommandHash COMMAND_GOTOTIMELABEL = CHash::HashEventCommand("COMMAND_GOTOTIMELABEL");
+
+// Slide
+const TEventCommandHash COMMAND_GOTOSLIDE = CHash::HashEventCommand("COMMAND_GOTOSLIDE");
+const TEventCommandHash COMMAND_GOTOSLIDENAME = CHash::HashEventCommand("COMMAND_GOTOSLIDENAME");
+const TEventCommandHash COMMAND_GOTONEXTSLIDE = CHash::HashEventCommand("COMMAND_GOTONEXTSLIDE");
+const TEventCommandHash COMMAND_GOTOPREVIOUSSLIDE =
+ CHash::HashEventCommand("COMMAND_GOTOPREVIOUSSLIDE");
+const TEventCommandHash COMMAND_BACKSLIDE = CHash::HashEventCommand("COMMAND_BACKSLIDE");
+
+// Behavior
+const TEventCommandHash COMMAND_CUSTOMACTION = CHash::HashEventCommand("COMMAND_CUSTOMACTION");
+const TEventCommandHash COMMAND_CUSTOMCALLBACK = CHash::HashEventCommand("COMMAND_CALLBACK");
+//==============================================================================
+// Events
+//==============================================================================
+
+// Slide Events
+const TEventCommandHash EVENT_ONSLIDEENTER = CHash::HashEventCommand("onSlideEnter");
+const TEventCommandHash EVENT_ONSLIDEEXIT = CHash::HashEventCommand("onSlideExit");
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSCommandHelper.cpp b/src/runtime/Qt3DSCommandHelper.cpp
new file mode 100644
index 0000000..53c7648
--- /dev/null
+++ b/src/runtime/Qt3DSCommandHelper.cpp
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+#include "Qt3DSCommandHelper.h"
+#include "Qt3DSCommandEventTypes.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSSlideSystem.h"
+
+namespace Q3DStudio {
+
+CCommandHelper::CCommandHelper()
+{
+}
+
+CCommandHelper::~CCommandHelper()
+{
+}
+
+static Option<Q3DStudio::UINT8> FindSlide(TElement &inElement, const char *slideName)
+{
+ IPresentation *thePresentation = inElement.GetBelongedPresentation();
+
+ int theSlideHashName = thePresentation->GetApplication().HashString(slideName);
+ TComponent *theComponent = thePresentation->GetComponentManager().GetComponent(&inElement);
+ UINT8 theSlideIndex =
+ thePresentation->GetSlideSystem().FindSlide(*theComponent, theSlideHashName);
+ if (theSlideIndex >= theComponent->GetSlideCount()) {
+ qt3ds::foundation::CRegisteredString elemPath = thePresentation->GetElementPath(inElement);
+ if (elemPath.IsValid()) {
+ qCCritical(qt3ds::INVALID_PARAMETER)
+ << "CCommandHelper: FindSlide: Unable to find slide "
+ << slideName << " on element " << elemPath.c_str();
+ } else {
+ qCCritical(qt3ds::INVALID_PARAMETER)
+ << "CCommandHelper: FindSlide: Unable to find slide " << slideName;
+ }
+ return Empty();
+ }
+
+ return theSlideIndex;
+}
+
+bool CCommandHelper::SetupGotoSlideCommand(TElement &inElement, Q3DStudio::INT32 inSlideIndex,
+ const SScriptEngineGotoSlideArgs &inArgs)
+{
+ IPresentation *thePresentation = inElement.GetBelongedPresentation();
+ TElement *theTarget = GetComponentParent(&inElement);
+ SComponentGotoSlideData theSlideData(inSlideIndex);
+ theSlideData.m_Mode = inArgs.m_Mode;
+ theSlideData.m_Paused = inArgs.m_Paused;
+ theSlideData.m_Rate = inArgs.m_Rate;
+ theSlideData.m_Reverse = inArgs.m_Reverse;
+ theSlideData.m_StartTime = inArgs.m_StartTime;
+ // Resolve playthroughto if it has a valid value.
+ if (!isTrivial(inArgs.m_PlaythroughTo)) {
+ if (AreEqual(inArgs.m_PlaythroughTo, "next"))
+ theSlideData.m_PlaythroughTo = -1;
+ else if (AreEqual(inArgs.m_PlaythroughTo, "previous"))
+ theSlideData.m_PlaythroughTo = -2;
+ else {
+ // Find the slide if possible. If not, then just error leave things as they are.
+
+ Option<UINT8> theSlideIndex = FindSlide(inElement, inArgs.m_PlaythroughTo);
+ if (theSlideIndex.hasValue())
+ theSlideData.m_PlaythroughTo = *theSlideIndex;
+ }
+ }
+ thePresentation->GetComponentManager().SetupComponentGotoSlideCommand(theTarget, theSlideData);
+ UVariant theArg1;
+ UVariant theArg2;
+ qt3ds::intrinsics::memZero(&theArg1, sizeof(UVariant));
+ qt3ds::intrinsics::memZero(&theArg2, sizeof(UVariant));
+ thePresentation->FireCommand(COMMAND_GOTOSLIDE, theTarget, &theArg1, &theArg2);
+ return true;
+}
+
+bool CCommandHelper::SetupGotoSlideCommand(TElement &inElement, const char *slideName,
+ const SScriptEngineGotoSlideArgs &inArgs)
+{
+ Option<UINT8> theSlideIndex = FindSlide(inElement, slideName);
+ if (theSlideIndex.hasValue())
+ return SetupGotoSlideCommand(inElement, *theSlideIndex, inArgs);
+ return false;
+}
+
+//==============================================================================
+/**
+ * Checks if the given element is a component. If it isn't walks up the tree and looks for one.
+ * @param inElementManager the object that manages the elements in the presentation
+ * @param inElement the element to check if it's a component
+ * @return the component
+ */
+TElement *CCommandHelper::GetComponentParent(TElement *inElement)
+{
+ Q3DStudio_ASSERT(inElement);
+ return &inElement->GetComponentParent();
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSCommandHelper.h b/src/runtime/Qt3DSCommandHelper.h
new file mode 100644
index 0000000..412a51a
--- /dev/null
+++ b/src/runtime/Qt3DSCommandHelper.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "Qt3DSIScriptBridge.h"
+
+namespace Q3DStudio {
+
+class CCommandHelper
+{
+private:
+ CCommandHelper();
+ CCommandHelper(const CCommandHelper &);
+ CCommandHelper &operator=(const CCommandHelper &);
+ virtual ~CCommandHelper();
+
+public:
+ static bool SetupGotoSlideCommand(TElement &inElement, const char *slideName,
+ const SScriptEngineGotoSlideArgs &inArgs);
+ static bool SetupGotoSlideCommand(TElement &inElement, Q3DStudio::INT32 inSlide,
+ const SScriptEngineGotoSlideArgs &inArgs);
+
+public:
+ static TElement *GetComponentParent(TElement *inParent);
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSComponentManager.cpp b/src/runtime/Qt3DSComponentManager.cpp
new file mode 100644
index 0000000..d7ce0b6
--- /dev/null
+++ b/src/runtime/Qt3DSComponentManager.cpp
@@ -0,0 +1,487 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSComponentManager.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSSlideSystem.h"
+#include "Qt3DSCommandEventTypes.h"
+#include "Qt3DSPresentationFrameData.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSActivationManager.h"
+#include "Qt3DSPresentation.h"
+
+using qt3ds::runtime::SSlideKey;
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ * @param inPresentation reference to its presentation
+ */
+CComponentManager::CComponentManager(IPresentation &inPresentation)
+ : m_Presentation(static_cast<CPresentation &>(inPresentation))
+{
+}
+
+//==============================================================================
+/**
+ * Enforces the contract that slide switching requires a reset to the master
+ * slide (slide 0) before switching to the desired slide index.
+ * Also updates the TComponent's current slide number.
+ * @param inComponent TComponent to set slide on
+ * @param inSlideIndex relative index of the slide to switch to
+ * @param inSlideExit true if exiting the slide, false otherwise
+ */
+void CComponentManager::GotoSlideIndex(TElement *inComponent,
+ const SComponentGotoSlideData &inGotoData,
+ BOOL inSlideExit /*= true*/)
+{
+ TComponent *theComponent = GetComponent(inComponent);
+
+ if (theComponent == NULL) {
+ return;
+ }
+
+ if (inGotoData.m_Slide < 1 || inGotoData.m_Slide >= theComponent->GetSlideCount()) {
+ qCCritical(qt3ds::INVALID_PARAMETER)
+ << "GotoSlide: Index out of range: Index " << inGotoData.m_Slide
+ << " SlideCount: "<< theComponent->GetSlideCount();
+ return;
+ }
+
+ if (theComponent->GetActive() == false) {
+ m_ComponentInitialSlideMap[inComponent] = inGotoData;
+ return;
+ }
+
+ SComponentGotoSlideData theGotoSlideData(inGotoData);
+
+ TComponentGotoSlideDataMap::iterator iter = m_ComponentInitialSlideMap.find(inComponent);
+ if (iter != m_ComponentInitialSlideMap.end()) {
+ theGotoSlideData = iter->second;
+ m_ComponentInitialSlideMap.erase(iter);
+ }
+
+ const UINT8 theCurrentSlideIndex = theComponent->GetCurrentSlide();
+
+ QString elementPath = QString::fromUtf8(inComponent->m_Path.c_str());
+
+ if (inSlideExit) {
+ SEventCommand theEvent = { inComponent, EVENT_ONSLIDEEXIT };
+ theEvent.m_IsEvent = true;
+ m_Presentation.ProcessEvent(theEvent);
+
+ m_Presentation.GetApplication().ComponentSlideExited(&m_Presentation, inComponent,
+ elementPath, theCurrentSlideIndex,
+ GetCurrentSlideName(inComponent));
+
+ // Signal previous slide change
+ m_Presentation.signalProxy()->SigSlideExited(elementPath, theCurrentSlideIndex,
+ GetCurrentSlideName(inComponent));
+
+ // m_Presentation.FireEvent(EVENT_ONSLIDEEXIT, inComponent);
+ // m_Presentation.FlushEventCommandQueue();
+ }
+
+ // Update dynamic keys to use current values before slide switching, with the exception of
+ // master slides because playback only starts from non-master slides.
+ if (theCurrentSlideIndex > 0) {
+ m_Presentation.GetSlideSystem().InitializeDynamicKeys(
+ SSlideKey(*theComponent, (qt3ds::QT3DSU8)theGotoSlideData.m_Slide),
+ m_Presentation.GetAnimationSystem());
+ // deactivate actions and animation tracks on the current slide.
+ m_Presentation.GetSlideSystem().RollbackSlide(
+ SSlideKey(*inComponent, (qt3ds::QT3DSU8)theCurrentSlideIndex),
+ m_Presentation.GetAnimationSystem(), m_Presentation.GetLogicSystem());
+ } else {
+ m_Presentation.GetSlideSystem().ExecuteSlide(SSlideKey(*inComponent, 0),
+ m_Presentation.GetAnimationSystem(),
+ m_Presentation.GetLogicSystem());
+ }
+ // Execute new slide.
+ m_Presentation.GetSlideSystem().ExecuteSlide(
+ SSlideKey(*inComponent, (qt3ds::QT3DSU8)theGotoSlideData.m_Slide),
+ m_Presentation.GetAnimationSystem(), m_Presentation.GetLogicSystem());
+ CTimePolicy &thePolicy(theComponent->GetTimePolicy());
+ TTimeUnit theLoopingDuration = thePolicy.GetLoopingDuration();
+ if (theGotoSlideData.m_Mode.hasValue()) {
+ inComponent->SetPlayThrough(false);
+ switch (*theGotoSlideData.m_Mode) {
+ case TimePolicyModes::Looping:
+ thePolicy.Initialize(theLoopingDuration, 0, false);
+ break;
+ case TimePolicyModes::PingPong:
+ thePolicy.Initialize(theLoopingDuration, 0, true);
+ break;
+ case TimePolicyModes::StopAtEnd:
+ thePolicy.Initialize(theLoopingDuration, 1, false);
+ break;
+ case TimePolicyModes::Ping:
+ thePolicy.Initialize(theLoopingDuration, 1, true);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ // Update the current index which also updates the back index
+ theComponent->SetCurrentSlide(static_cast<UINT8>(theGotoSlideData.m_Slide));
+ m_PlaythroughOverrideMap.erase(inComponent);
+ if (theGotoSlideData.m_PlaythroughTo.hasValue()) {
+ m_PlaythroughOverrideMap.insert(
+ eastl::make_pair(inComponent, *theGotoSlideData.m_PlaythroughTo));
+ theComponent->SetPlayThrough(true);
+ }
+
+ // Reset time for component to 0
+
+ if (theGotoSlideData.m_Paused.hasValue())
+ thePolicy.SetPaused(*theGotoSlideData.m_Paused);
+
+ thePolicy.SetRate(theGotoSlideData.m_Rate);
+ thePolicy.SetReverse(theGotoSlideData.m_Reverse);
+
+ if (theGotoSlideData.m_StartTime.hasValue())
+ thePolicy.SetTime(*theGotoSlideData.m_StartTime);
+
+ inComponent->SetDirty();
+ m_Presentation.FireEvent(EVENT_ONSLIDEENTER, inComponent);
+ qt3ds::runtime::IActivityZone *theZone = m_Presentation.GetActivityZone();
+ if (theZone)
+ theZone->OnSlideChange(*inComponent);
+
+ m_Presentation.GetApplication().ComponentSlideEntered(&m_Presentation, inComponent,
+ elementPath, theGotoSlideData.m_Slide,
+ GetCurrentSlideName(inComponent));
+ // Signal current slide change
+ m_Presentation.signalProxy()->SigSlideEntered(elementPath, GetCurrentSlide(inComponent),
+ GetCurrentSlideName(inComponent));
+}
+
+//==============================================================================
+/**
+ * Sets a component to a specified slide using the slide name hash.
+ * Performs a switch to Slide 0 (master) first, before switching to the
+ * required slide.
+ * @param inComponent reference to the TComponent
+ * @param inSlideHashName hash of the slide to switch to
+ */
+void CComponentManager::GotoSlideName(TElement *inComponent, const TStringHash inSlideHashName)
+{
+ TComponent *theComponent = GetComponent(inComponent);
+ UINT8 theSlideIndex = m_Presentation.GetSlideSystem().FindSlide(*theComponent, inSlideHashName);
+
+ if (theSlideIndex < 1 || theSlideIndex >= theComponent->GetSlideCount()) {
+ const char *slideName = m_Presentation.GetApplication().ReverseHash(inSlideHashName);
+ if (slideName && *slideName)
+ qCCritical(qt3ds::INVALID_PARAMETER) << "GotoSlide: Name not found: " << slideName;
+ else
+ qCCritical(qt3ds::INVALID_PARAMETER) << "GotoSlide: Name not found: " << inSlideHashName;
+
+ } else
+ GotoSlideIndex(inComponent, theSlideIndex);
+}
+
+//==============================================================================
+/**
+ * Return the index of the current slide of the component.
+ * @param inComponent reference to the TComponent
+ * @return the index of current slide
+ */
+UINT8 CComponentManager::GetCurrentSlide(TElement *inComponent)
+{
+ return GetComponent(inComponent)->GetCurrentSlide();
+}
+
+//==============================================================================
+/**
+ * Return the number of slides on a component.
+ * @param inComponent reference to the TComponent
+ * @return the number of slides
+ */
+UINT8 CComponentManager::GetSlideCount(TElement *inComponent)
+{
+ return GetComponent(inComponent)->GetSlideCount();
+}
+
+//==============================================================================
+/**
+ * Performs a switch to the slide following the current slide (current slide + 1).
+ * @param inComponent reference to the TComponent
+ * @param inIncrement slide increment offset
+ */
+void CComponentManager::GoToNextSlide(TElement *inComponent, const INT32 inIncrement)
+{
+ TComponent *theComponent = GetComponent(inComponent);
+ INT32 theNewIndex = Q3DStudio_clamp<INT32>(inIncrement + theComponent->GetCurrentSlide(), 1L,
+ theComponent->GetSlideCount() - 1);
+
+ // Trigger goto to slide only if the next slide is not the current
+ if (theComponent->GetActive()) {
+ if (theNewIndex != theComponent->GetCurrentSlide())
+ GotoSlideIndex(inComponent, theNewIndex);
+ } else {
+ qCCritical(qt3ds::INVALID_PARAMETER)
+ << "Runtime: Attempt to goto slide on an inactive component!";
+ }
+}
+
+//==============================================================================
+/**
+ * Performs a switch to the slide following the current slide (current slide - 1).
+ * @param inComponent reference to the TComponent
+ * @param inDecrement slide decrement offset
+ */
+void CComponentManager::GoToPreviousSlide(TElement *inComponent, const INT32 inDecrement)
+{
+ TComponent *theComponent = GetComponent(inComponent);
+ INT32 theNewIndex = Q3DStudio_clamp<INT32>(theComponent->GetCurrentSlide() - inDecrement, 1L,
+ theComponent->GetSlideCount() - 1);
+
+ // Trigger goto to slide only if the next slide is not the current
+ if (theNewIndex != theComponent->GetCurrentSlide())
+ GotoSlideIndex(inComponent, theNewIndex);
+}
+
+//==============================================================================
+/**
+ * Playthrough to the next slide that is specified.
+ * @param inComponent reference to the TComponent
+ */
+void CComponentManager::PlaythroughToSlide(TElement *inComponent)
+{
+ TComponent *theComponent = GetComponent(inComponent);
+ TComponentIntMap::iterator iter = m_PlaythroughOverrideMap.find(inComponent);
+ INT32 thePlaythroughTo = 0;
+ if (iter != m_PlaythroughOverrideMap.end()) {
+ thePlaythroughTo = iter->second;
+ m_PlaythroughOverrideMap.erase(iter);
+ } else {
+ thePlaythroughTo = m_Presentation.GetSlideSystem().GetPlaythroughToSlideIndex(
+ SSlideKey(*theComponent, (qt3ds::QT3DSU8)theComponent->GetCurrentSlide()));
+ if (thePlaythroughTo == -1) {
+ qCCritical(qt3ds::INVALID_OPERATION) << "Missing slide to play through to";
+ inComponent->SetPlayThrough(
+ false); // clear this flag, so that this is equivalent to a "Stop At End"
+ }
+ }
+
+ if (thePlaythroughTo == -2) {
+ GoToPreviousSlide(inComponent, 1);
+ } else if (thePlaythroughTo == -1) {
+ GoToNextSlide(inComponent, 1);
+ } else {
+ GotoSlideIndex(inComponent, thePlaythroughTo);
+ }
+}
+
+//==============================================================================
+/**
+ * Performs a switch to the previous slide.
+ * @param inComponent reference to the TComponent
+ */
+void CComponentManager::GoToBackSlide(TElement *inComponent)
+{
+ TComponent *theComponent = GetComponent(inComponent);
+ GotoSlideIndex(theComponent, theComponent->GetPreviousSlide());
+}
+
+//==============================================================================
+/**
+ * Set the component's local time using the supplied time.
+ * @param inComponent reference to the TComponent
+ * @param inTime supplied time
+ */
+void CComponentManager::GoToTime(TElement *inComponent, const TTimeUnit inTime)
+{
+ if (inComponent == NULL)
+ return;
+ if (inComponent->GetActive() == false) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Runtime: Attempt to goto time on inactive component!";
+ return;
+ }
+ m_Presentation.GetActivityZone()->GoToTime(*inComponent, inTime);
+ inComponent->SetDirty();
+}
+
+//==============================================================================
+/**
+ * Get the component's playback state
+ * @param inComponent reference to the TComponent
+ * @return true if it's paused, false if it's playing
+ */
+BOOL CComponentManager::GetPause(TElement *inComponent)
+{
+ CTimePolicy &theTimePolicy = GetComponent(inComponent)->GetTimePolicy();
+ return theTimePolicy.GetPaused();
+}
+
+//==============================================================================
+/**
+ * Get the component's ping pong direction
+ * @param inComponent reference to the TComponent
+ * @return true if it's pingponging forward, false if it's pingponging backwards
+ */
+BOOL CComponentManager::GetPlayBackDirection(TElement *inComponent)
+{
+ return GetComponent(inComponent)->GetPlayBackDirection();
+}
+
+//==============================================================================
+/**
+ * Update time policy of the component during each slide execution
+ * @param inComponent reference to the TComponent
+ * @param inLoopDuration loop duration of component at that slide
+ * @param inRepetitions number of repetitions
+ * @param inPingPong if true the component will move with respect to reverse time
+ *sequence
+ * @param inPlayThrough if true the component will continue to execute next slide
+ */
+void CComponentManager::SetTimePolicy(TElement *inComponent, const TTimeUnit inLoopDuration,
+ const UINT32 inRepetitions, const BOOL inPingPong,
+ const BOOL inPlayThrough)
+{
+ CTimePolicy &theTimePolicy = GetComponent(inComponent)->GetTimePolicy();
+ theTimePolicy.Initialize(inLoopDuration, inRepetitions, inPingPong);
+ inComponent->SetPlayThrough(inPlayThrough);
+}
+
+//==============================================================================
+/**
+ * Set the component's playback to either play or pause
+ * @param inComponent reference to the TComponent
+ * @param inPause true = pause, false = play
+ */
+void CComponentManager::SetPause(TElement *inComponent, const BOOL inPause)
+{
+ CTimePolicy &theTimePolicy = GetComponent(inComponent)->GetTimePolicy();
+ BOOL wasPaused = theTimePolicy.GetPaused();
+ theTimePolicy.SetPaused(inPause);
+ if (wasPaused != inPause)
+ inComponent->SetDirty();
+}
+
+//==============================================================================
+/**
+ * Promote from TElement* to TComponent.
+ * @param inElement TElement pointer to be recast as TComponent
+ * @return pointer to the component
+ */
+TComponent *CComponentManager::GetComponent(TElement *inElement)
+{
+ Q3DStudio_ASSERT(inElement->IsComponent());
+ return static_cast<TComponent *>(inElement);
+}
+
+//==============================================================================
+/**
+ * Gets the string name of the current slide.
+ * @param inComponent the component to query for it's current slide name
+ * @return the char buffer storing the name
+ */
+const CHAR *CComponentManager::GetCurrentSlideName(TElement *inComponent)
+{
+ TComponent *theComponent = GetComponent(inComponent);
+ return m_Presentation.GetSlideSystem().GetSlideName(
+ SSlideKey(*theComponent, (qt3ds::QT3DSU8)theComponent->GetCurrentSlide()));
+}
+
+void CComponentManager::OnElementDeactivated(TElement *)
+{
+}
+
+void CComponentManager::SetComponentTimeOverride(TElement *inElement, TTimeUnit inEndTime,
+ FLOAT inInterpolation,
+ IComponentTimeOverrideFinishedCallback *inCallback)
+{
+ if (inElement->IsComponent()) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "ComponentManager: SetComponentTimeOverride called on object that "
+ << "wasn't an element";
+ if (inCallback)
+ inCallback->Release();
+ Q3DStudio_ASSERT(false);
+ return;
+ }
+ // sanitize end time.
+ CTimePolicy &theTimePolicy = GetComponent(inElement)->GetTimePolicy();
+ if (inEndTime < 0)
+ inEndTime = 0;
+ if (inEndTime > theTimePolicy.GetLoopingDuration())
+ inEndTime = theTimePolicy.GetLoopingDuration();
+ m_Presentation.GetActivityZone()->GetOrCreateItemComponentOverride(*inElement, inInterpolation,
+ inEndTime, inCallback);
+
+ // Force the time policy object to respect its own time. If we played through till the end and
+ // sat there for a while
+ // we need the actual time will travel further and further from the time policy's local time.
+ // If we then play backward we
+ // will jump until the offset is synchronized with the actual time.
+ theTimePolicy.SetTime(theTimePolicy.GetTime());
+ inElement->SetDirty();
+}
+
+void CComponentManager::SetupComponentGotoSlideCommand(TElement *inElement,
+ const SComponentGotoSlideData &inSlide)
+{
+ m_ComponentGotoSlideMap[inElement] = inSlide;
+}
+
+bool CComponentManager::HasComponentGotoSlideCommand(TElement *inElement)
+{
+ return m_ComponentGotoSlideMap.find(inElement) != m_ComponentGotoSlideMap.end();
+}
+
+SComponentGotoSlideData CComponentManager::GetComponentGotoSlideCommand(TElement *inElement)
+{
+ TComponentGotoSlideDataMap::iterator iter = m_ComponentGotoSlideMap.find(inElement);
+ if (iter != m_ComponentGotoSlideMap.end())
+ return iter->second;
+ return -1;
+}
+
+void CComponentManager::ReleaseComponentGotoSlideCommand(TElement *inElement)
+{
+ TComponentGotoSlideDataMap::iterator iter = m_ComponentGotoSlideMap.find(inElement);
+ if (iter != m_ComponentGotoSlideMap.end())
+ m_ComponentGotoSlideMap.erase(iter);
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSComponentManager.h b/src/runtime/Qt3DSComponentManager.h
new file mode 100644
index 0000000..865b8aa
--- /dev/null
+++ b/src/runtime/Qt3DSComponentManager.h
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSIComponentManager.h"
+#include "EASTL/hash_map.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+class CTimePolicy;
+class CPresentation;
+struct SComponentTimePolicyOverride
+{
+ TElement *m_Element;
+ FLOAT m_TimeMultiplier;
+ TTimeUnit m_EndTime;
+ IComponentTimeOverrideFinishedCallback *m_TimeCallback;
+ SComponentTimePolicyOverride(TElement *inElement, FLOAT inMultiplier, TTimeUnit inEndTime,
+ IComponentTimeOverrideFinishedCallback *inCallback)
+ : m_Element(inElement)
+ , m_TimeMultiplier(inMultiplier)
+ , m_EndTime(inEndTime)
+ , m_TimeCallback(inCallback)
+ {
+ }
+ // Returns the local time and a boolean indicating if we have reached the end.
+ // Implemented in UICTimePolicy.cpp so that I can compare the CTimePolicy::ComputeTime method
+ // with
+ // SComponentTimePolicyOverride::ComputLocalTime method
+ eastl::pair<BOOL, TTimeUnit> ComputeLocalTime(CTimePolicy &inTimePolicy,
+ TTimeUnit inGlobalTime);
+ // Implemented in UICTimePolicy.cpp
+ void SetTime(CTimePolicy &inTimePolicy, TTimeUnit inLocalTime);
+};
+
+typedef eastl::hash_map<TElement *, SComponentGotoSlideData> TComponentGotoSlideDataMap;
+typedef eastl::hash_map<TElement *, Q3DStudio::INT32> TComponentIntMap;
+
+//==============================================================================
+/**
+ * The Component Manager is a factory and container of all components
+ * within the presentation.
+ */
+class CComponentManager : public IComponentManager
+{
+ CPresentation &m_Presentation;
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CComponentManager(IPresentation &inPresentation);
+
+public: // Slide
+ void GotoSlideIndex(TElement *inComponent, const SComponentGotoSlideData &inGotoData,
+ BOOL inSlideExit = true) override;
+ void GotoSlideName(TElement *inComponent, const TStringHash inSlideHashName) override;
+ void GoToBackSlide(TElement *inComponent) override;
+ void GoToNextSlide(TElement *inComponent, const INT32 inDecrement = 1) override;
+ void GoToPreviousSlide(TElement *inComponent, const INT32 inDecrement = 1) override;
+ void PlaythroughToSlide(TElement *inComponent);
+
+ UINT8 GetSlideCount(TElement *inComponent) override;
+ UINT8 GetCurrentSlide(TElement *inComponent) override;
+ const CHAR *GetCurrentSlideName(TElement *inComponent) override;
+
+ void OnElementDeactivated(TElement *inElement) override;
+
+ void SetComponentTimeOverride(TElement *inElement, TTimeUnit inEndTime, FLOAT inInterpolation,
+ IComponentTimeOverrideFinishedCallback *inCallback) override;
+
+ // Allows multiple gotoslide command operating on the same element to work correctly.
+ // This API is meant to fix a scenario where gotoslide is called multiple times in a frame
+ // on the same component. This isn't avoidable in some cases without very complex scene logic.
+
+ // later calls override earlier calls
+ void SetupComponentGotoSlideCommand(TElement *inElement,
+ const SComponentGotoSlideData &inSlide) override;
+ bool HasComponentGotoSlideCommand(TElement *inElement) override;
+ SComponentGotoSlideData GetComponentGotoSlideCommand(TElement *inElement) override;
+ void ReleaseComponentGotoSlideCommand(TElement *inElement) override;
+
+public: // Time
+ void GoToTime(TElement *inComponent, const TTimeUnit inTime) override;
+ void SetPause(TElement *inComponent, const BOOL inPause) override;
+ void SetTimePolicy(TElement *inComponent, const TTimeUnit inLoopDuration,
+ const UINT32 inRepetitions, const BOOL inPingPong, const BOOL inPlayThrough) override;
+
+ TTimeUnit ComputeComponentLocalTime(TElement *inComponent, const TTimeUnit inGlobalTime);
+ BOOL GetPause(TElement *inComponent) override;
+ BOOL GetPlayBackDirection(TElement *inComponent) override;
+
+protected: // Promotion
+ TComponent *GetComponent(TElement *inElement) override;
+
+private:
+ // Disabled Copy Construction
+ CComponentManager(const CComponentManager &);
+ CComponentManager &operator=(const CComponentManager &);
+
+ TComponentGotoSlideDataMap m_ComponentInitialSlideMap;
+ TComponentGotoSlideDataMap m_ComponentGotoSlideMap;
+ TComponentIntMap m_PlaythroughOverrideMap;
+
+ //==============================================================================
+ // Friends
+ //==============================================================================
+ friend class CSlideBuilder;
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSElementHelper.cpp b/src/runtime/Qt3DSElementHelper.cpp
new file mode 100644
index 0000000..acf8849
--- /dev/null
+++ b/src/runtime/Qt3DSElementHelper.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+#include "Qt3DSElementHelper.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSCommandEventTypes.h"
+
+using namespace qt3ds;
+
+namespace Q3DStudio {
+
+const char PRESENTATION_DELIMITER = ':';
+const char NODE_DELIMITER = '.';
+const TStringHash RESERVED_THIS = CHash::HashString("this");
+const TStringHash RESERVED_PARENT = CHash::HashString("parent");
+const TStringHash RESERVED_SCENE = CHash::HashString("Scene");
+
+CElementHelper::CElementHelper()
+{
+}
+
+CElementHelper::~CElementHelper()
+{
+}
+
+TElement *CElementHelper::GetElement(qt3ds::runtime::IApplication &inApplication,
+ IPresentation *inDefaultPresentation, const char *inPath,
+ TElement *inStartElement)
+{
+ if (!inPath || *inPath == 0)
+ return nullptr;
+ const char *thePath(inPath);
+ const char *theSubPath = nullptr;
+ IPresentation *thePresentation = nullptr;
+ size_t thePathLength = ::strlen(thePath) + 1;
+ char *theToken = Q3DStudio_allocate_desc(CHAR, thePathLength, "Token:TempPath");
+ // Try to get the specified presentation
+ theSubPath = ::strchr(thePath, PRESENTATION_DELIMITER);
+ TElement *theElement = inStartElement;
+ if (theSubPath) {
+ UINT32 theSubPathLength = static_cast<UINT32>(theSubPath - thePath);
+
+ ::strncpy(theToken, thePath, theSubPathLength);
+ theToken[theSubPathLength] = '\0';
+
+ thePath = theSubPath + 1;
+
+ const CHAR *thePresentationName = theToken;
+
+ thePresentation = inApplication.GetPresentationById(thePresentationName);
+ }
+
+ if (!thePresentation)
+ thePresentation = inDefaultPresentation;
+
+ // Return nil if the inStartElement is not in the specified presentation
+ if (theElement
+ && (!theSubPath && theElement->GetBelongedPresentation() != thePresentation)) {
+ thePresentation = theElement->GetBelongedPresentation();
+ }
+
+ if (!thePresentation)
+ return nullptr;
+
+ TStringHash theName;
+ INT32 theParseCounter = 0;
+
+ while (thePath && thePath[0] != '\0') {
+ ++theParseCounter;
+
+ // Do some strtok() work here
+ theSubPath = ::strchr(thePath, NODE_DELIMITER);
+ if (theSubPath) {
+ UINT32 theSubPathLength = static_cast<UINT32>(theSubPath - thePath);
+ Q3DStudio_ASSERT(theSubPathLength < thePathLength);
+
+ ::strncpy(theToken, thePath, theSubPathLength);
+ theToken[theSubPathLength] = '\0';
+
+ thePath = theSubPath + 1;
+ } else {
+ ::strcpy(theToken, thePath);
+ thePath = nullptr;
+ }
+
+ // Hash the token and do some element searching
+ theName = CHash::HashString(theToken);
+
+ if (theName == RESERVED_PARENT) {
+ if (theElement)
+ theElement = theElement->GetParent();
+ } else if (theName == RESERVED_THIS) {
+ ;
+ } else {
+ if (theName == RESERVED_SCENE && theParseCounter == 1) {
+ // theElement is nullptr, so using absolute path
+ theElement = thePresentation->GetRoot();
+ } else if (theElement) {
+ // Using relative path
+ theElement = theElement->FindChild(theName);
+ }
+ }
+
+ if (!theElement)
+ thePath = nullptr;
+ } // while
+
+ Q3DStudio_free(theToken, CHAR, thePathLength);
+ return theElement;
+}
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSElementHelper.h b/src/runtime/Qt3DSElementHelper.h
new file mode 100644
index 0000000..df2afdd
--- /dev/null
+++ b/src/runtime/Qt3DSElementHelper.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+namespace qt3ds {
+namespace runtime {
+ class IApplication;
+}
+}
+
+namespace Q3DStudio {
+
+class IPresentation;
+
+class CElementHelper
+{
+private:
+ CElementHelper();
+ CElementHelper(const CElementHelper &);
+ CElementHelper &operator=(const CElementHelper &);
+ virtual ~CElementHelper();
+
+public:
+ static TElement *GetElement(qt3ds::runtime::IApplication &inApplication,
+ IPresentation *inDefaultPresentation, const char *inPath,
+ TElement *inStartElement = nullptr);
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSElementSystem.cpp b/src/runtime/Qt3DSElementSystem.cpp
new file mode 100644
index 0000000..d8e1833
--- /dev/null
+++ b/src/runtime/Qt3DSElementSystem.cpp
@@ -0,0 +1,855 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "RuntimePrefix.h"
+#include "Qt3DSElementSystem.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/AutoDeallocatorAllocator.h"
+#include "EASTL/sort.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "Qt3DSHash.h"
+#include "Qt3DSActivationManager.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSPresentationFrameData.h"
+#include "Qt3DSAttributeHashes.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSIndexableLinkedList.h"
+
+using namespace qt3ds::runtime::element;
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using namespace qt3ds::intrinsics;
+namespace eastl {
+template <>
+struct hash<STypeDesc>
+{
+ size_t operator()(const STypeDesc &inDesc) const { return inDesc.HashCode(); }
+};
+}
+
+namespace {
+typedef IndexableLinkedList<SPropertyValueGroup, Q3DStudio::UVariant,
+ SPropertyValueGroup::NumValues>
+ TElementPropertyList;
+struct SPropertyDescSorter
+{
+ bool operator()(const TPropertyDescAndValue &lhs, const TPropertyDescAndValue &rhs) const
+ {
+ return strcmp(lhs.first.m_Name.c_str(), rhs.first.m_Name.c_str()) < 0;
+ }
+};
+QT3DSU32 GetNumValueAllocations(const STypeDesc &inTypeDesc)
+{
+ return ((inTypeDesc.m_Properties.size() + SPropertyValueGroup::NumValues - 1)
+ / SPropertyValueGroup::NumValues);
+}
+struct SElementAllocator : public qt3ds::runtime::IElementAllocator
+{
+ typedef Pool<SElement, ForwardingAllocator> TElementPool;
+ typedef Pool<SComponent, ForwardingAllocator> TComponentPool;
+ typedef TElementPropertyList::TPoolType TValuePool;
+ typedef nvhash_map<QT3DSU32, SElement *> THandleElementMap;
+ typedef nvhash_map<SElement *, QT3DSU32> TElementOffsetMap;
+ typedef nvhash_set<STypeDesc> TTypeDescSet;
+ typedef nvhash_map<const STypeDesc *, QT3DSU32> TTypeDescOffsetMap;
+ typedef nvhash_map<QT3DSU32, const STypeDesc *> TOffsetTypeDescMap;
+ typedef nvvector<NVDataRef<QT3DSU8>> TLoadBufferList;
+
+ NVFoundationBase &m_Foundation;
+ IStringTable &m_StringTable;
+ TElementPool m_Elements;
+ TComponentPool m_Components;
+ TValuePool m_Values;
+ THandleElementMap m_HandleToElements;
+ TElementOffsetMap m_ElementOffsets;
+ TTypeDescOffsetMap m_TypeDescOffsets;
+ TOffsetTypeDescMap m_OffsetsToTypeDescs;
+ TTypeDescSet m_TypeDescriptors;
+ nvvector<TPropertyDescAndValue> m_TempPropertyDescsAndValues;
+ nvvector<SPropertyDesc> m_TempPropertyDescs;
+ nvvector<CRegisteredString> m_IgnoredProperties;
+ // Upon load we allocate a set of buffers
+ nvvector<QT3DSU8> m_LoadBuffer;
+ TLoadBufferList m_AllocatedBuffers;
+ SSAutoDeallocatorAllocator m_AutoAllocator;
+ nvvector<SElement *> m_LoadElements;
+
+ QT3DSU32 m_NextElementHandle;
+
+ eastl::string m_Workspace;
+ eastl::string m_WorkspaceExt;
+
+ QT3DSI32 m_RefCount;
+
+ SElementAllocator(NVFoundationBase &inFoundation, IStringTable &inStrTable)
+ : m_Foundation(inFoundation)
+ , m_StringTable(inStrTable)
+ , m_Elements(ForwardingAllocator(m_Foundation.getAllocator(), "m_Elements"))
+ , m_Components(ForwardingAllocator(m_Foundation.getAllocator(), "m_Components"))
+ , m_Values(ForwardingAllocator(m_Foundation.getAllocator(), "m_Values"))
+ , m_HandleToElements(m_Foundation.getAllocator(), "m_HandleToElements")
+ , m_ElementOffsets(m_Foundation.getAllocator(), "m_ElementOffsets")
+ , m_TypeDescOffsets(m_Foundation.getAllocator(), "m_TypeDescOffsets")
+ , m_OffsetsToTypeDescs(m_Foundation.getAllocator(), "m_OffsetsToTypeDescs")
+ , m_TypeDescriptors(m_Foundation.getAllocator(), "m_TypeDescriptors")
+ , m_TempPropertyDescsAndValues(m_Foundation.getAllocator(), "m_TempPropertyDescsAndValues")
+ , m_TempPropertyDescs(m_Foundation.getAllocator(), "m_TempPropertyDescs")
+ , m_IgnoredProperties(m_Foundation.getAllocator(), "m_IgnoredProperties")
+ , m_LoadBuffer(m_Foundation.getAllocator(), "m_LoadBuffer")
+ , m_AllocatedBuffers(m_Foundation.getAllocator(), "m_AllocatedBuffers")
+ , m_AutoAllocator(inFoundation)
+ , m_LoadElements(inFoundation.getAllocator(), "m_LoadElements")
+ , m_NextElementHandle(1)
+ , m_RefCount(0)
+ {
+ }
+
+ ~SElementAllocator() {}
+
+ void GetIgnoredProperties()
+ {
+ if (m_IgnoredProperties.empty())
+ m_IgnoredProperties.push_back(m_StringTable.RegisterStr("name"));
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Foundation.getAllocator());
+ NVDelete(alloc, this);
+ }
+ }
+
+ SElement &CreateElement(CRegisteredString inName, CRegisteredString inType,
+ CRegisteredString inSubType,
+ NVConstDataRef<TPropertyDescAndValue> inPropertyDescriptions,
+ Q3DStudio::IPresentation *inPresentation, SElement *inParent,
+ bool inIsComponent) override
+ {
+ m_TempPropertyDescsAndValues.clear();
+ m_TempPropertyDescs.clear();
+ bool participatesInTimeGraph = false;
+ GetIgnoredProperties();
+ for (QT3DSU32 idx = 0, end = inPropertyDescriptions.size(); idx < end; ++idx) {
+ QT3DSU32 nameHash = inPropertyDescriptions[idx].first.GetNameHash();
+ if (nameHash == Q3DStudio::ATTRIBUTE_STARTTIME
+ || nameHash == Q3DStudio::ATTRIBUTE_ENDTIME)
+ participatesInTimeGraph = true;
+ if (eastl::find(m_IgnoredProperties.begin(), m_IgnoredProperties.end(),
+ inPropertyDescriptions[idx].first.m_Name)
+ == m_IgnoredProperties.end()) {
+ m_TempPropertyDescsAndValues.push_back(inPropertyDescriptions[idx]);
+ }
+ }
+ eastl::sort(m_TempPropertyDescsAndValues.begin(), m_TempPropertyDescsAndValues.end(),
+ SPropertyDescSorter());
+
+ for (QT3DSU32 idx = 0, end = m_TempPropertyDescsAndValues.size(); idx < end; ++idx) {
+ m_TempPropertyDescs.push_back(m_TempPropertyDescsAndValues[idx].first);
+ }
+
+ STypeDesc theDesc;
+ theDesc.m_TypeName = inType;
+ theDesc.m_SubtypeName = inSubType;
+ theDesc.m_Properties = m_TempPropertyDescs;
+ theDesc.SetHashValue();
+ eastl::pair<TTypeDescSet::iterator, bool> inserter = m_TypeDescriptors.insert(theDesc);
+
+ const STypeDesc &theTypeDesc = *inserter.first;
+ if (inserter.second) {
+ size_t allocSize = theDesc.m_Properties.size() * sizeof(SPropertyDesc);
+ if (allocSize) {
+ SPropertyDesc *newProps = (SPropertyDesc *)m_AutoAllocator.allocate(
+ allocSize, "TypeDescData", __FILE__, __LINE__, 0);
+ memCopy(newProps, theDesc.m_Properties.begin(), (QT3DSU32)allocSize);
+ // Note that this does not change the hash value.
+ const_cast<STypeDesc &>(theTypeDesc).m_Properties =
+ toConstDataRef(newProps, theDesc.m_Properties.size());
+ }
+ }
+
+ SElement *retval = inIsComponent ? m_Components.construct(theTypeDesc, __FILE__, __LINE__)
+ : m_Elements.construct(theTypeDesc, __FILE__, __LINE__);
+ retval->m_BelongedPresentation = inPresentation;
+ retval->m_Name = inName;
+ // children
+ if (inParent) {
+ retval->m_Parent = inParent;
+ if (inParent->m_Child == NULL) {
+ inParent->m_Child = retval;
+ } else {
+ SElement *lastChild = inParent->m_Child;
+ while (lastChild->m_Sibling)
+ lastChild = lastChild->m_Sibling;
+ lastChild->m_Sibling = retval;
+ }
+ }
+ while (FindElementByHandle(m_NextElementHandle)) {
+ ++m_NextElementHandle;
+ if (!m_NextElementHandle)
+ ++m_NextElementHandle;
+ }
+
+ // required flags
+ retval->m_Handle = m_NextElementHandle;
+ if (inIsComponent)
+ retval->Flags().clearOrSet(true, Q3DStudio::ELEMENTFLAG_COMPONENT);
+
+ if (participatesInTimeGraph)
+ retval->Flags().clearOrSet(true, Q3DStudio::ELEMENTFLAG_TIMELINE);
+
+ retval->Flags().clearOrSet(true, Q3DStudio::ELEMENTFLAG_EXPLICITACTIVE);
+
+ retval->SetDepth();
+
+ retval->SetDirty();
+
+ m_HandleToElements.insert(eastl::make_pair(retval->m_Handle, retval));
+
+ // property values;
+ QT3DSU32 propIdx = 0;
+ TElementPropertyList::CreateAll(retval->m_PropertyValues, theTypeDesc.m_Properties.size(),
+ m_Values);
+ for (TElementPropertyList::iterator
+ iter = TElementPropertyList::begin(retval->m_PropertyValues,
+ theTypeDesc.m_Properties.size()),
+ end = TElementPropertyList::end(retval->m_PropertyValues,
+ theTypeDesc.m_Properties.size());
+ iter != end; ++iter, ++propIdx) {
+ (*iter) = m_TempPropertyDescsAndValues[propIdx].second;
+ }
+
+ return *retval;
+ }
+
+ void ReleaseElement(SElement &inElement, bool inRecurse) override
+ {
+ if (inRecurse) {
+ while (inElement.m_Child)
+ ReleaseElement(*inElement.m_Child, true);
+ }
+ // Trim out the element.
+ if (inElement.m_Parent) {
+ SElement *theParent = inElement.m_Parent;
+ if (theParent->m_Child == &inElement)
+ theParent->m_Child = inElement.m_Sibling;
+ else {
+ SElement *thePreviousChild = NULL;
+ // Empty loop to find the previous child
+ for (thePreviousChild = theParent->m_Child;
+ thePreviousChild->m_Sibling != &inElement && thePreviousChild;
+ thePreviousChild = thePreviousChild->m_Sibling) {
+ }
+ if (thePreviousChild)
+ thePreviousChild->m_Sibling = inElement.m_Sibling;
+ }
+ }
+
+ m_HandleToElements.erase(inElement.m_Handle);
+
+ QT3DSU8 *elemAddr = reinterpret_cast<QT3DSU8 *>(&inElement);
+ for (QT3DSU32 idx = 0, end = m_AllocatedBuffers.size(); idx < end; ++idx) {
+ NVDataRef<QT3DSU8> theBuffer(m_AllocatedBuffers[idx]);
+ // Preloaded element, do not release back to element pools
+ if (elemAddr >= theBuffer.begin() && elemAddr < theBuffer.end())
+ return;
+ }
+
+ SPropertyValueGroup *theValueGroup = inElement.m_PropertyValues;
+ while (theValueGroup) {
+ SPropertyValueGroup *currentGroup = theValueGroup;
+ theValueGroup = theValueGroup->m_NextNode;
+ m_Values.deallocate(currentGroup);
+ }
+
+ if (inElement.IsComponent())
+ m_Components.deallocate(&inElement);
+ else
+ m_Elements.deallocate(&inElement);
+ }
+
+ QT3DSI32 GetExtensionIndex(eastl::string &inExt)
+ {
+ QT3DSI32 retVal = 0;
+
+ if (!inExt.compare(".x") || !inExt.compare(".r"))
+ retVal = 0;
+ else if (!inExt.compare(".y") || !inExt.compare(".g"))
+ retVal = 1;
+ if (!inExt.compare(".z") || !inExt.compare(".b"))
+ retVal = 2;
+
+ return retVal;
+ }
+
+ virtual Option<TPropertyDescAndValuePtr>
+ CreateDynamicProperty(Q3DStudio::IRuntimeMetaData &theMetaData, SElement &element,
+ CRegisteredString inName) override
+ {
+ SPropertyDesc *newProp = NULL;
+ m_TempPropertyDescsAndValues.clear();
+ m_TempPropertyDescs.clear();
+
+ // create dynamic descriptor
+ if (!element.m_DynamicTypeDescription) {
+ STypeDesc *theDesc;
+ theDesc = (STypeDesc *)m_AutoAllocator.allocate(sizeof(STypeDesc), "TypeDescData",
+ __FILE__, __LINE__, 0);
+ theDesc->m_TypeName = element.m_TypeDescription->m_TypeName;
+ theDesc->m_SubtypeName = element.m_TypeDescription->m_SubtypeName;
+ theDesc->m_Properties = m_TempPropertyDescs;
+ theDesc->SetHashValue();
+ // we need this palcement new here
+ ::new (theDesc) STypeDesc();
+ element.m_DynamicTypeDescription = const_cast<STypeDesc *>(theDesc);
+ }
+
+ STypeDesc *theTypeDesc = element.m_DynamicTypeDescription;
+
+ // remove the extension that we can find the property
+ QT3DSI32 extIndex = 0;
+ m_Workspace.assign(inName.c_str());
+ eastl::string::size_type theCharPos = m_Workspace.rfind('.');
+ if (theCharPos != eastl::string::npos) {
+ m_WorkspaceExt.assign(m_Workspace, theCharPos, m_Workspace.length());
+ m_Workspace.resize(theCharPos);
+ extIndex = GetExtensionIndex(m_WorkspaceExt);
+ }
+
+ CRegisteredString theWorkSpaceString = m_StringTable.RegisterStr(m_Workspace.c_str());
+ Q3DStudio::ERuntimeDataModelDataType thePropertyType =
+ theMetaData.GetPropertyType(element.m_TypeDescription->m_TypeName, theWorkSpaceString,
+ element.m_TypeDescription->m_SubtypeName);
+
+ // using separate properties
+ bool separateProperties = theCharPos != eastl::string::npos;
+
+ // single property
+ size_t allocSize = sizeof(SPropertyDesc);
+ if (allocSize) {
+ newProp = (SPropertyDesc *)m_AutoAllocator.allocate(allocSize, "SPropertyDesc",
+ __FILE__, __LINE__, 0);
+
+ newProp->m_Name = inName;
+
+ // convert to appropriate type
+ if (thePropertyType == Q3DStudio::ERuntimeDataModelDataTypeFloat) {
+ float value = theMetaData.GetPropertyValueFloat(
+ element.m_TypeDescription->m_TypeName, theWorkSpaceString,
+ element.m_TypeDescription->m_SubtypeName);
+
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_FLOAT;
+
+ Q3DStudio::UVariant theValue;
+ theValue.m_FLOAT = value;
+ m_TempPropertyDescsAndValues.push_back(eastl::make_pair(
+ SPropertyDesc(theWorkSpaceString, Q3DStudio::ATTRIBUTETYPE_FLOAT), theValue));
+
+ theTypeDesc->m_DynamicProperties.push_back(*newProp);
+ } else if (thePropertyType == Q3DStudio::ERuntimeDataModelDataTypeFloat2) {
+ qt3ds::QT3DSVec2 value = theMetaData.GetPropertyValueVector2(
+ element.m_TypeDescription->m_TypeName, theWorkSpaceString,
+ element.m_TypeDescription->m_SubtypeName);
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_FLOAT;
+
+ Q3DStudio::UVariant theVarValue;
+ theVarValue.m_FLOAT = value[extIndex];
+ m_TempPropertyDescsAndValues.push_back(eastl::make_pair(
+ SPropertyDesc(theWorkSpaceString, Q3DStudio::ATTRIBUTETYPE_FLOAT),
+ theVarValue));
+
+ theTypeDesc->m_DynamicProperties.push_back(*newProp);
+ } else if (thePropertyType == Q3DStudio::ERuntimeDataModelDataTypeFloat3) {
+ qt3ds::QT3DSVec3 value = theMetaData.GetPropertyValueVector3(
+ element.m_TypeDescription->m_TypeName, theWorkSpaceString,
+ element.m_TypeDescription->m_SubtypeName);
+
+ if (separateProperties) {
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_FLOAT;
+
+ Q3DStudio::UVariant theVarValue;
+ theVarValue.m_FLOAT = value[extIndex];
+ m_TempPropertyDescsAndValues.push_back(eastl::make_pair(
+ SPropertyDesc(theWorkSpaceString, Q3DStudio::ATTRIBUTETYPE_FLOAT),
+ theVarValue));
+ } else {
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_FLOAT3;
+
+ Q3DStudio::UVariant theVarValue;
+ theVarValue.m_FLOAT3[0] = value[0];
+ theVarValue.m_FLOAT3[1] = value[1];
+ theVarValue.m_FLOAT3[2] = value[2];
+ m_TempPropertyDescsAndValues.push_back(eastl::make_pair(
+ SPropertyDesc(theWorkSpaceString, Q3DStudio::ATTRIBUTETYPE_FLOAT3),
+ theVarValue));
+ }
+
+ theTypeDesc->m_DynamicProperties.push_back(*newProp);
+ } else if (thePropertyType == Q3DStudio::ERuntimeDataModelDataTypeLong) {
+ QT3DSI32 value = (QT3DSI32)theMetaData.GetPropertyValueLong(
+ element.m_TypeDescription->m_TypeName, theWorkSpaceString,
+ element.m_TypeDescription->m_SubtypeName);
+
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_INT32;
+
+ Q3DStudio::UVariant theVarValue;
+ theVarValue.m_INT32 = value;
+ m_TempPropertyDescsAndValues.push_back(eastl::make_pair(
+ SPropertyDesc(theWorkSpaceString, Q3DStudio::ATTRIBUTETYPE_INT32),
+ theVarValue));
+
+ theTypeDesc->m_DynamicProperties.push_back(*newProp);
+ } else if (thePropertyType == Q3DStudio::ERuntimeDataModelDataTypeBool) {
+ bool value = theMetaData.GetPropertyValueBool(
+ element.m_TypeDescription->m_TypeName, theWorkSpaceString,
+ element.m_TypeDescription->m_SubtypeName);
+
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_BOOL;
+
+ Q3DStudio::UVariant theVarValue;
+ theVarValue.m_INT32 = value;
+ m_TempPropertyDescsAndValues.push_back(eastl::make_pair(
+ SPropertyDesc(theWorkSpaceString, Q3DStudio::ATTRIBUTETYPE_BOOL), theVarValue));
+
+ theTypeDesc->m_DynamicProperties.push_back(*newProp);
+ } else if (thePropertyType == Q3DStudio::ERuntimeDataModelDataTypeString) {
+ Option<eastl::string> theRuntimeStr = theMetaData.GetPropertyValueString(
+ element.m_TypeDescription->m_TypeName, theWorkSpaceString,
+ element.m_TypeDescription->m_SubtypeName);
+
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_STRING;
+
+ CStringHandle theString = m_StringTable.GetHandle(theRuntimeStr->c_str());
+ Q3DStudio::UVariant theVarValue;
+ theVarValue.m_StringHandle = theString.handle();
+ m_TempPropertyDescsAndValues.push_back(eastl::make_pair(
+ SPropertyDesc(theWorkSpaceString, Q3DStudio::ATTRIBUTETYPE_STRING),
+ theVarValue));
+
+ theTypeDesc->m_DynamicProperties.push_back(*newProp);
+ } else {
+ newProp->m_Type = Q3DStudio::ATTRIBUTETYPE_FLOAT;
+
+ theTypeDesc->m_DynamicProperties.push_back(*newProp);
+ }
+ }
+
+ // property values;
+ QT3DSU32 newListSize = theTypeDesc->m_DynamicProperties.size() - 1;
+ TElementPropertyList::Create(element.m_DynamicPropertyValues, newListSize, m_Values);
+
+ Q3DStudio::UVariant &propertyValue =
+ TElementPropertyList::GetObjAtIdx(element.m_DynamicPropertyValues, newListSize - 1);
+ propertyValue = m_TempPropertyDescsAndValues[0].second;
+
+ return eastl::make_pair(
+ element.m_DynamicTypeDescription->m_DynamicProperties[newListSize - 1],
+ &TElementPropertyList::GetObjAtIdx(element.m_DynamicPropertyValues, newListSize - 1));
+ }
+
+ SElement *FindElementByHandle(QT3DSU32 inElementHandle) override
+ {
+ THandleElementMap::iterator theFind = m_HandleToElements.find(inElementHandle);
+ if (theFind != m_HandleToElements.end())
+ return theFind->second;
+ return NULL;
+ }
+
+ // Returns an element pointer that when added to the return value of load will be a valid
+ // element.
+ SElement *GetRemappedElementAddress(SElement *inElement) const override
+ {
+ if (inElement == NULL)
+ return NULL;
+ TElementOffsetMap::const_iterator iter = m_ElementOffsets.find(inElement);
+ if (iter != m_ElementOffsets.end())
+ return reinterpret_cast<SElement *>(iter->second);
+ return NULL;
+ }
+
+ const STypeDesc *GetRemappedTypeDescAddress(const STypeDesc *inTypeDesc) const override
+ {
+ TTypeDescOffsetMap::const_iterator iter = m_TypeDescOffsets.find((STypeDesc *)inTypeDesc);
+ if (iter != m_TypeDescOffsets.end())
+ return reinterpret_cast<STypeDesc *>(iter->second);
+ return NULL;
+ }
+ const STypeDesc *RemapTypeDesc(const STypeDesc *inOffset)
+ {
+ size_t memoryOffset = reinterpret_cast<size_t>(inOffset);
+ TOffsetTypeDescMap::iterator iter =
+ m_OffsetsToTypeDescs.find(static_cast<QT3DSU32>(memoryOffset));
+ if (iter != m_OffsetsToTypeDescs.end())
+ return iter->second;
+ return NULL;
+ }
+
+ SElement *RemapElement(SElement *inElem, size_t memoryOffset)
+ {
+ if (inElem)
+ return reinterpret_cast<SElement *>(reinterpret_cast<size_t>(inElem) + memoryOffset);
+ return NULL;
+ }
+};
+}
+
+bool STypeDesc::operator==(const STypeDesc &inOther) const
+{
+ if (m_TypeName == inOther.m_TypeName && m_SubtypeName == inOther.m_SubtypeName
+ && m_Properties.size() == inOther.m_Properties.size()) {
+ for (QT3DSU32 idx = 0, end = m_Properties.size(); idx < end; ++idx) {
+ const SPropertyDesc &lhs = m_Properties[idx];
+ const SPropertyDesc &rhs = inOther.m_Properties[idx];
+ if (lhs.m_Name != rhs.m_Name || lhs.m_Type != rhs.m_Type)
+ return false;
+ }
+ return true;
+ }
+ return false;
+}
+
+Option<QT3DSU32> STypeDesc::FindProperty(QT3DSU32 inNameHash) const
+{
+ for (QT3DSU32 idx = 0, end = m_Properties.size(); idx < end; ++idx) {
+ const SPropertyDesc &theDesc = m_Properties[idx];
+ if (Q3DStudio::CHash::HashAttribute(theDesc.m_Name) == inNameHash)
+ return idx;
+ }
+ return Empty();
+}
+
+Option<QT3DSU32> STypeDesc::FindProperty(CRegisteredString inName) const
+{
+ for (QT3DSU32 idx = 0, end = m_Properties.size(); idx < end; ++idx) {
+ const SPropertyDesc &theDesc = m_Properties[idx];
+ if (theDesc.m_Name == inName)
+ return idx;
+ }
+ return Empty();
+}
+
+Option<QT3DSU32> STypeDesc::FindDynamicProperty(QT3DSU32 inNameHash) const
+{
+ for (QT3DSU32 idx = 0, end = m_DynamicProperties.size(); idx < end; ++idx) {
+ const SPropertyDesc &theDesc = m_DynamicProperties[idx];
+ if (Q3DStudio::CHash::HashAttribute(theDesc.m_Name) == inNameHash)
+ return idx;
+ }
+ return Empty();
+}
+
+void STypeDesc::SetHashValue()
+{
+ size_t typeDescHash = m_TypeName.hash() ^ m_SubtypeName.hash();
+ for (QT3DSU32 idx = 0, end = m_Properties.size(); idx < end; ++idx) {
+ typeDescHash = typeDescHash ^ m_Properties[idx].m_Name.hash();
+ typeDescHash = typeDescHash ^ eastl::hash<QT3DSU32>()(m_Properties[idx].m_Type);
+ }
+ // TODO check 64 bit compatibility
+ m_HashValue = (QT3DSU32)typeDescHash;
+}
+
+QT3DSU32 SPropertyDesc::GetNameHash() const
+{
+ return Q3DStudio::CHash::HashAttribute(m_Name.c_str());
+}
+
+Q3DStudio::SAttributeKey SPropertyDesc::GetAttributeKey() const
+{
+ Q3DStudio::SAttributeKey retval;
+ memZero(&retval, sizeof(retval));
+ retval.m_Type = m_Type;
+ retval.m_Hash = GetNameHash();
+ return retval;
+}
+
+bool SElement::IsUserActive() const
+{
+ return m_Flags.IsExplicitActive();
+}
+
+bool SElement::IsIndependent() const
+{
+ return IsComponent();
+}
+
+bool SElement::IsGlobalActive() const
+{
+ return GetActive();
+}
+// This may require a mutex to be held.
+void SElement::SetGlobalActive(bool active)
+{
+ SetActive(active);
+}
+
+bool SElement::GetAttribute(QT3DSU32 inHashName, Q3DStudio::UVariant &outValue) const
+{
+ if (inHashName == Q3DStudio::ATTRIBUTE_NAME) {
+ outValue.m_StringHandle = m_BelongedPresentation->GetStringTable().GetHandle(m_Name);
+ return true;
+ }
+ if (inHashName == Q3DStudio::CHash::HashAttribute("path")) {
+ outValue.m_StringHandle = m_BelongedPresentation->GetStringTable().GetHandle(m_Path);
+ return true;
+ }
+ const Q3DStudio::UVariant *valPtr = FindPropertyValue(inHashName);
+ if (valPtr) {
+ outValue = *valPtr;
+ return true;
+ }
+ return false;
+}
+
+void SElement::SetAttribute(const Q3DStudio::TAttributeHash inKey,
+ const Q3DStudio::UVariant inValue)
+{
+ Option<TPropertyDescAndValuePtr> existing = FindProperty(inKey);
+ if (existing.hasValue() == false)
+ return;
+ SetAttribute(*existing, inValue);
+}
+
+void SElement::SetAttribute(TPropertyDescAndValuePtr inKey, const Q3DStudio::UVariant inValue)
+{
+ Q3DStudio::EAttributeType theType = inKey.first.m_Type;
+ Q3DStudio::UVariant *currentValue = inKey.second;
+ QT3DSU32 attHash = inKey.first.GetNameHash();
+ switch (theType) {
+ case Q3DStudio::ATTRIBUTETYPE_FLOAT: // Early return
+ if (fabs(currentValue->m_FLOAT - inValue.m_FLOAT) < SmallestDifference())
+ return;
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_FLOAT3: // Early return
+ if (fabs(currentValue->m_FLOAT3[0] - inValue.m_FLOAT3[0]) < SmallestDifference()
+ && fabs(currentValue->m_FLOAT3[1] - inValue.m_FLOAT3[1]) < SmallestDifference()
+ && fabs(currentValue->m_FLOAT3[2] - inValue.m_FLOAT3[2]) < SmallestDifference()) {
+ return;
+ }
+ break;
+ case Q3DStudio::ATTRIBUTETYPE_STRING:
+ if (currentValue->m_StringHandle == inValue.m_StringHandle)
+ return;
+ break;
+ default: // Early return
+ if (currentValue->m_INT32 == inValue.m_INT32)
+ return;
+ break;
+ }
+ *currentValue = inValue;
+
+ if (Q3DStudio::ATTRIBUTE_EYEBALL == attHash)
+ SetFlag(Q3DStudio::ELEMENTFLAG_EXPLICITACTIVE, inValue.m_INT32 ? true : false);
+
+ if (Q3DStudio::ATTRIBUTE_STARTTIME == attHash || Q3DStudio::ATTRIBUTE_ENDTIME == attHash)
+ GetActivityZone().UpdateItemInfo(*this);
+
+ /*
+ if ( inElement->m_Flags & ELEMENTFLAG_REGISTEREDFORATTRIBUTECHANGE )
+ m_AttributeChangeCallbacks.FireCallbacks( inElement, theAttribute->m_Key,
+ thePreviousValue, inValue );
+ */
+ SetDirty();
+}
+
+// SElement implementation
+QT3DSU32 SElement::GetNameHash() const
+{
+ return Q3DStudio::CHash::HashString(m_Name.c_str());
+}
+
+// Q3DStudio::CHash::HashAttribute
+Option<QT3DSU32> SElement::FindPropertyIndex(QT3DSU32 inNameHash) const
+{
+ return m_TypeDescription->FindProperty(inNameHash);
+}
+
+Option<QT3DSU32> SElement::FindPropertyIndex(CRegisteredString inName) const
+{
+ return m_TypeDescription->FindProperty(inName);
+}
+
+Option<QT3DSU32> SElement::FindDynamicPropertyIndex(QT3DSU32 inNameHash) const
+{
+ if (m_DynamicTypeDescription)
+ return m_DynamicTypeDescription->FindDynamicProperty(inNameHash);
+ else
+ return Empty();
+}
+
+QT3DSU32 SElement::GetNumProperties() const
+{
+ return m_TypeDescription->m_Properties.size();
+}
+
+QT3DSU32 SElement::GetNumDynamicProperties() const
+{
+ if (m_DynamicTypeDescription)
+ return m_DynamicTypeDescription->m_DynamicProperties.size();
+ else
+ return 0;
+}
+
+Option<TPropertyDescAndValuePtr> SElement::GetPropertyByIndex(QT3DSU32 inIdx)
+{
+ if (inIdx < this->m_TypeDescription->m_Properties.size())
+ return eastl::make_pair(m_TypeDescription->m_Properties[inIdx],
+ &TElementPropertyList::GetObjAtIdx(m_PropertyValues, inIdx));
+
+ return Empty();
+}
+
+Option<TPropertyDescAndValuePtr> SElement::GetDynamicPropertyByIndex(QT3DSU32 inIdx)
+{
+ if (inIdx < this->m_DynamicTypeDescription->m_DynamicProperties.size())
+ return eastl::make_pair(m_DynamicTypeDescription->m_DynamicProperties[inIdx],
+ &TElementPropertyList::GetObjAtIdx(m_DynamicPropertyValues, inIdx));
+
+ return Empty();
+}
+
+Option<TPropertyDescAndConstValuePtr> SElement::GetPropertyByIndex(QT3DSU32 inIdx) const
+{
+ Option<TPropertyDescAndValuePtr> retval =
+ const_cast<SElement &>(*this).GetPropertyByIndex(inIdx);
+ if (retval.hasValue())
+ return TPropertyDescAndConstValuePtr(*retval);
+ return Empty();
+}
+
+void SElement::SetDirty()
+{
+ if (!m_Flags.IsDirty()) {
+ m_Flags.SetDirty(true);
+ // The element is dirty, so place it on the frame data dirty list
+ m_BelongedPresentation->GetFrameData().GetDirtyList().Push(this);
+ m_Flags.SetDirty(true);
+ }
+}
+
+void SElement::SetFlag(Q3DStudio::EElementFlag inFlag, bool inValue)
+{
+ bool existing = m_Flags & inFlag;
+ if (existing != inValue && HasActivityZone()) {
+ m_Flags.clearOrSet(inValue, inFlag);
+ if (inFlag == Q3DStudio::ELEMENTFLAG_EXPLICITACTIVE)
+ GetActivityZone().UpdateItemInfo(*this);
+ else if (inFlag == Q3DStudio::ELEMENTFLAG_SCRIPTCALLBACKS)
+ GetActivityZone().UpdateItemScriptStatus(*this);
+ SetDirty();
+ }
+}
+
+bool SElement::HasActivityZone() const
+{
+ return m_BelongedPresentation->GetActivityZone() != NULL;
+}
+
+qt3ds::runtime::IActivityZone &SElement::GetActivityZone() const
+{
+ return *m_BelongedPresentation->GetActivityZone();
+}
+
+SElement &SElement::GetComponentParent()
+{
+ if (IsComponent())
+ return *this;
+
+ SElement *theParent = GetActivityZone().GetItemTimeParent(*this);
+ if (theParent)
+ return *theParent;
+ QT3DS_ASSERT(false);
+ return *this;
+}
+
+const SElement &SElement::GetComponentParent() const
+{
+ return const_cast<SElement *>(this)->GetComponentParent();
+}
+
+SElement *SElement::FindChild(QT3DSU32 inNameHash)
+{
+ for (SElement *theChild = m_Child; theChild; theChild = theChild->m_Sibling) {
+ if (theChild->GetNameHash() == inNameHash)
+ return theChild;
+ }
+ return NULL;
+}
+
+Q3DStudio::TTimeUnit SElement::GetInnerTime() const
+{
+ return GetActivityZone().GetItemComponentTime(const_cast<SElement &>(*this));
+}
+// Get the time I am animating at.
+Q3DStudio::TTimeUnit SElement::GetOuterTime() const
+{
+ return GetActivityZone().GetItemLocalTime(const_cast<SElement &>(*this));
+}
+
+bool SElement::IsDescendent(SElement &inPossibleParent) const
+{
+ if (m_Parent == NULL)
+ return false;
+ if (m_Parent == &inPossibleParent)
+ return true;
+ return m_Parent->IsDescendent(inPossibleParent);
+}
+
+bool SComponent::GetPaused() const
+{
+ return GetTimePolicy().GetPaused();
+}
+
+bool SComponent::GetPlayBackDirection() const
+{
+ return GetTimePolicy().GetPlayBackDirection();
+}
+
+Q3DStudio::CTimePolicy &SComponent::GetTimePolicy()
+{
+ return *GetActivityZone().GetOwnedTimePolicy(*this);
+}
+
+const Q3DStudio::CTimePolicy &SComponent::GetTimePolicy() const
+{
+ return const_cast<SComponent *>(this)->GetTimePolicy();
+}
+
+qt3ds::runtime::IElementAllocator &
+qt3ds::runtime::IElementAllocator::CreateElementAllocator(NVFoundationBase &inFoundation,
+ IStringTable &inStringTable)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), SElementAllocator)(inFoundation, inStringTable);
+}
diff --git a/src/runtime/Qt3DSElementSystem.h b/src/runtime/Qt3DSElementSystem.h
new file mode 100644
index 0000000..12ebebd
--- /dev/null
+++ b/src/runtime/Qt3DSElementSystem.h
@@ -0,0 +1,616 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef QT3DS_ELEMENT_SYSTEM_H
+#define QT3DS_ELEMENT_SYSTEM_H
+#include "foundation/Qt3DSRefCounted.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "foundation/Utils.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSKernelTypes.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSInvasiveSet.h"
+#include "Qt3DSMetadata.h"
+
+// The qt3ds runtime element system contains the element graph and the data in the element
+// graph.
+
+namespace Q3DStudio {
+// class CPresentation;
+class IPresentation;
+class CTimePolicy;
+}
+
+namespace qt3ds {
+namespace foundation {
+ class IInStream;
+ class IOutStream;
+}
+}
+
+namespace qt3ds {
+namespace runtime {
+ using namespace qt3ds::foundation;
+ using namespace qt3ds;
+ class IActivityZone;
+ namespace element {
+ struct SPropertyDesc
+ {
+ CRegisteredString m_Name;
+ Q3DStudio::EAttributeType m_Type;
+ SPropertyDesc()
+ : m_Type(Q3DStudio::ATTRIBUTETYPE_NONE)
+ {
+ }
+ SPropertyDesc(CRegisteredString inStr, Q3DStudio::EAttributeType inType)
+ : m_Name(inStr)
+ , m_Type(inType)
+ {
+ }
+ QT3DSU32 GetNameHash() const; // CHash::HashAttribute
+ Q3DStudio::SAttributeKey GetAttributeKey() const;
+ };
+
+ struct STypeDesc
+ {
+ CRegisteredString m_TypeName;
+ CRegisteredString m_SubtypeName;
+ // Properties are sorted so that we can quickly create new type descriptions
+ // when necessary.
+ NVConstDataRef<SPropertyDesc> m_Properties;
+ eastl::vector<SPropertyDesc> m_DynamicProperties;
+
+ private:
+ QT3DSU32 m_HashValue; // Cached hash value for this type descriptor
+ public:
+ STypeDesc()
+ : m_HashValue(0)
+ {
+ }
+ bool operator==(const STypeDesc &inOther) const;
+ // Q3DStudio::CHash::HashAttribute
+ Option<QT3DSU32> FindProperty(QT3DSU32 inNameHash) const;
+ Option<QT3DSU32> FindProperty(CRegisteredString inName) const;
+ Option<QT3DSU32> FindDynamicProperty(QT3DSU32 inNameHash) const;
+ void SetHashValue();
+ QT3DSU32 HashCode() const { return m_HashValue; }
+ };
+
+ struct SActivationManagerNodeFlagValues
+ {
+ enum Enum {
+ TimeActive = 1 << 1,
+ TempTimeActive = 1 << 4,
+ ParticipatesInTimeGraph = 1 << 5,
+ Script = 1 << 6,
+ ChildDirty = 1 << 7,
+ };
+ };
+
+ struct SActivationManagerNodeFlags : public NVFlags<SActivationManagerNodeFlagValues::Enum>
+ {
+ bool IsTimeActive() const
+ {
+ return operator&(SActivationManagerNodeFlagValues::TimeActive);
+ }
+ void SetTimeActive(bool active)
+ {
+ clearOrSet(active, SActivationManagerNodeFlagValues::TimeActive);
+ }
+
+ bool IsTempTimeActive() const
+ {
+ return operator&(SActivationManagerNodeFlagValues::TempTimeActive);
+ }
+ void SetTempTimeActive(bool value)
+ {
+ clearOrSet(value, SActivationManagerNodeFlagValues::TempTimeActive);
+ }
+
+ // Is this item in the activation manager's scripts list.
+ bool HasScript() const { return operator&(SActivationManagerNodeFlagValues::Script); }
+ void SetHasScript(bool value)
+ {
+ clearOrSet(value, SActivationManagerNodeFlagValues::Script);
+ }
+
+ bool IsChildDirty() const
+ {
+ return operator&(SActivationManagerNodeFlagValues::ChildDirty);
+ }
+ void SetChildDirty() { clearOrSet(true, SActivationManagerNodeFlagValues::ChildDirty); }
+ void ClearChildDirty()
+ {
+ clearOrSet(false, SActivationManagerNodeFlagValues::ChildDirty);
+ }
+ };
+
+ struct SElement;
+
+ struct SActivationManagerNode
+ {
+ // IT may seem wasteful to always have start,end time on the node. We need to do this
+ // however
+ // in order to transmit information down the timeline at times. Furthermore the
+ // activation manager
+ // is free to mangle these times as it sees fit; unlike the attribute start,end time.
+ QT3DSU32 m_StartTime;
+ QT3DSU32 m_StopTime;
+ // Used by the activation manager specifically.
+ QT3DSU32 m_DirtyIndex;
+
+ // If m_Flags.IsIndependent(), first child is implicitly zero and instead
+ // this records the time context index assocated with this element node.
+ // Else this records the first child index.
+ // These could perhaps be moved to the element flags except it breaks some isolation and
+ // it just doesn't seem worth it.
+ SActivationManagerNodeFlags m_Flags;
+
+ SActivationManagerNode()
+ : m_StartTime(QT3DS_MAX_U32)
+ , m_StopTime(QT3DS_MAX_U32)
+ , m_DirtyIndex(QT3DS_MAX_U32)
+ {
+ }
+ };
+
+ struct SElementFlag : public NVFlags<Q3DStudio::EElementFlag, QT3DSU16>
+ {
+ void SetDirty(bool inDirty) { clearOrSet(inDirty, Q3DStudio::ELEMENTFLAG_DIRTY); }
+ bool IsDirty() const { return this->operator&(Q3DStudio::ELEMENTFLAG_DIRTY); }
+
+ bool IsComponent() const { return this->operator&(Q3DStudio::ELEMENTFLAG_COMPONENT); }
+
+ void SetExplicitActive(bool inValue)
+ {
+ clearOrSet(inValue, Q3DStudio::ELEMENTFLAG_EXPLICITACTIVE);
+ }
+ bool IsExplicitActive() const
+ {
+ return this->operator&(Q3DStudio::ELEMENTFLAG_EXPLICITACTIVE);
+ }
+
+ void SetActive(bool inValue)
+ {
+ clearOrSet(inValue, Q3DStudio::ELEMENTFLAG_GLOBALACTIVE);
+ }
+ bool IsActive() const { return this->operator&(Q3DStudio::ELEMENTFLAG_GLOBALACTIVE); }
+
+ void SetPickEnabled(bool inValue)
+ {
+ clearOrSet(inValue, Q3DStudio::ELEMENTFLAG_PICKENABLED);
+ }
+ bool IsPickEnabled() const
+ {
+ return this->operator&(Q3DStudio::ELEMENTFLAG_PICKENABLED);
+ }
+
+ void SetPlayThrough(bool inValue)
+ {
+ clearOrSet(inValue, Q3DStudio::ELEMENTFLAG_PLAYTHROUGH);
+ }
+ bool IsPlayThrough() const
+ {
+ return this->operator&(Q3DStudio::ELEMENTFLAG_PLAYTHROUGH);
+ }
+
+ void SetScriptCallbacks(bool inValue)
+ {
+ clearOrSet(inValue, Q3DStudio::ELEMENTFLAG_SCRIPTCALLBACKS);
+ }
+ bool HasScriptCallbacks() const
+ {
+ return this->operator&(Q3DStudio::ELEMENTFLAG_SCRIPTCALLBACKS);
+ }
+
+ bool HasStartEndTime() const
+ {
+ return this->operator&(Q3DStudio::ELEMENTFLAG_TIMELINE);
+ }
+ };
+
+ typedef eastl::pair<SPropertyDesc, Q3DStudio::UVariant *> TPropertyDescAndValuePtr;
+ typedef eastl::pair<SPropertyDesc, const Q3DStudio::UVariant *>
+ TPropertyDescAndConstValuePtr;
+ typedef eastl::pair<SPropertyDesc, Q3DStudio::UVariant> TPropertyDescAndValue;
+ // There is probably some balance here between number of values in a group
+ // and number of groups. A heuristic of a large application would tell you
+ // the optimum number of values to groups.
+ struct SPropertyValueGroup
+ {
+ enum {
+ NumValues = 4,
+ };
+ Q3DStudio::UVariant m_Data[4];
+ SPropertyValueGroup *m_NextNode;
+ SPropertyValueGroup()
+ : m_NextNode(NULL)
+ {
+ for (QT3DSU32 idx = 0; idx < NumValues; ++idx)
+ m_Data[idx].m_INT32 = 0;
+ }
+ };
+
+ struct SElement
+ {
+ CRegisteredString m_Name; // const, do not set after creation.
+ CRegisteredString m_Path;
+ const STypeDesc *m_TypeDescription; ///< static information created on load time
+ // The property values are in order described in the type description.
+ SPropertyValueGroup *m_PropertyValues;
+ // dynamic section
+ STypeDesc *m_DynamicTypeDescription; ///< we may create this on the fly
+ SPropertyValueGroup *m_DynamicPropertyValues;
+
+ protected:
+ SElementFlag m_Flags; // Setting these changes things.
+ public:
+ QT3DSU32 m_Handle;
+ QT3DSU32 m_ScriptID; ///< Superfluous, could use handle to link to script representation
+ QT3DSU32 m_Depth; ///< Distance from this node to the root of the graph.
+ SElement *m_Parent; ///< Parent element in activity graph
+ SElement *m_Sibling; ///< Next sibling element in activity graph
+ SElement *m_Child; ///< First child element in activity graph
+ void *m_Association; ///< Link to associated asset in scene
+ Q3DStudio::IPresentation *m_BelongedPresentation;
+ SActivationManagerNode m_ActivationManagerNode;
+
+ SElement(const STypeDesc &inDesc)
+ : m_TypeDescription(&inDesc)
+ , m_PropertyValues(NULL)
+ , m_DynamicTypeDescription(NULL)
+ , m_DynamicPropertyValues(NULL)
+ , m_Handle(0)
+ , m_ScriptID(0)
+ , m_Depth(0)
+ , m_Parent(NULL)
+ , m_Sibling(NULL)
+ , m_Child(NULL)
+ , m_Association(NULL)
+ , m_BelongedPresentation(NULL)
+ {
+ }
+ QT3DSU32 GetHandle() const { return m_Handle; }
+ const STypeDesc &GetTypeDescription() const { return *m_TypeDescription; }
+ void SetTypeDescription(const STypeDesc *inDesc) { m_TypeDescription = inDesc; }
+ // Q3DStudio::CHash::HashString
+ QT3DSU32 GetNameHash() const;
+ const SPropertyValueGroup *GetFirstPropertyGroup() const { return m_PropertyValues; }
+ void SetFirstPropertyGroup(SPropertyValueGroup *inGroup) { m_PropertyValues = inGroup; }
+
+ SPropertyValueGroup *&UnsafeGetFirstPropertyGroup() { return m_PropertyValues; }
+
+ // In general, use these accessors for attributes, especially setting values.
+ // The other accessors are fast paths that do not:
+ // 1. Set dirty flags
+ // 2. Notify the activation zone of changes if setting start,end time.
+ // 3. Notify any other subsystems.
+ bool GetAttribute(QT3DSU32 inHashName, Q3DStudio::UVariant &outValue) const;
+ // Triggers updating various subcomponents based on attribute key.
+ void SetAttribute(const Q3DStudio::TAttributeHash inKey,
+ const Q3DStudio::UVariant inValue);
+ // Triggers updating various subcomponents without requiring a new property lookup.
+ void SetAttribute(TPropertyDescAndValuePtr inKey, const Q3DStudio::UVariant inNewValue);
+
+ // Q3DStudio::CHash::HashAttribute
+ Option<QT3DSU32> FindPropertyIndex(QT3DSU32 inNameHash) const;
+ Option<QT3DSU32> FindPropertyIndex(CRegisteredString inName) const;
+
+ Option<QT3DSU32> FindDynamicPropertyIndex(QT3DSU32 inNameHash) const;
+
+ QT3DSU32 GetNumProperties() const;
+ QT3DSU32 GetAttributeCount() const { return GetNumProperties(); }
+
+ QT3DSU32 GetNumDynamicProperties() const;
+ QT3DSU32 GetDynamicAttributeCount() const { return GetNumDynamicProperties(); }
+
+ // Note that if you set a value then this object is dirty.
+ // Bypasses special checks in setAttribute. In general, use setAttribute.
+ Option<TPropertyDescAndValuePtr> GetPropertyByIndex(QT3DSU32 inIdx);
+ Option<TPropertyDescAndConstValuePtr> GetPropertyByIndex(QT3DSU32 inIdx) const;
+
+ Option<TPropertyDescAndValuePtr> GetDynamicPropertyByIndex(QT3DSU32 inIdx);
+
+ Q3DStudio::UVariant *FindPropertyValue(QT3DSU32 inNameHash)
+ {
+ Option<QT3DSU32> idx = FindPropertyIndex(inNameHash);
+ if (idx.hasValue()) {
+ Option<TPropertyDescAndValuePtr> theVal = GetPropertyByIndex(idx);
+ if (theVal.hasValue())
+ return theVal->second;
+ }
+ return NULL;
+ }
+ const Q3DStudio::UVariant *FindPropertyValue(QT3DSU32 inNameHash) const
+ {
+ Option<QT3DSU32> idx = FindPropertyIndex(inNameHash);
+ if (idx.hasValue()) {
+ Option<TPropertyDescAndConstValuePtr> theVal = GetPropertyByIndex(idx);
+ if (theVal.hasValue())
+ return theVal->second;
+ }
+ return NULL;
+ }
+ Q3DStudio::UVariant *FindPropertyValue(CRegisteredString inNameHash)
+ {
+ Option<QT3DSU32> idx = FindPropertyIndex(inNameHash);
+ if (idx.hasValue()) {
+ Option<TPropertyDescAndValuePtr> theVal = GetPropertyByIndex(idx);
+ if (theVal.hasValue())
+ return theVal->second;
+ }
+ return NULL;
+ }
+
+ const Q3DStudio::UVariant *FindPropertyValue(CRegisteredString inNameHash) const
+ {
+ Option<QT3DSU32> idx = FindPropertyIndex(inNameHash);
+ if (idx.hasValue()) {
+ Option<TPropertyDescAndConstValuePtr> theVal = GetPropertyByIndex(idx);
+ if (theVal.hasValue())
+ return theVal->second;
+ }
+ return NULL;
+ }
+
+ Option<TPropertyDescAndValuePtr> FindProperty(QT3DSU32 inNameHash)
+ {
+ Option<QT3DSU32> idx = FindPropertyIndex(inNameHash);
+ if (idx.hasValue())
+ return GetPropertyByIndex(*idx);
+ return Empty();
+ }
+
+ Option<TPropertyDescAndValuePtr> FindDynamicProperty(QT3DSU32 inNameHash)
+ {
+ Option<QT3DSU32> idx = FindDynamicPropertyIndex(inNameHash);
+ if (idx.hasValue())
+ return GetDynamicPropertyByIndex(*idx);
+
+ return Empty();
+ }
+
+ SElement *GetParent() { return m_Parent; }
+ const SElement *GetParent() const { return m_Parent; }
+ SElement *GetSibling() { return m_Sibling; }
+ const SElement *GetSibling() const { return m_Sibling; }
+ SElement *GetChild() { return m_Child; }
+ const SElement *GetChild() const { return m_Child; }
+ CRegisteredString GetType() const { return m_TypeDescription->m_TypeName; }
+ bool IsComponent() const { return m_Flags.IsComponent(); }
+
+ Q3DStudio::IPresentation *GetBelongedPresentation() { return m_BelongedPresentation; }
+ void SetBelongedPresentation(Q3DStudio::IPresentation &inPresentation)
+ {
+ m_BelongedPresentation = &inPresentation;
+ }
+
+ // Set flags bypassing the dirty system *and* updates to the activity zone.
+ // do not do this unless you are sure you do not want any side effects.
+ SElementFlag &Flags() { return m_Flags; }
+
+ // User flag that is set and is persistent
+ void SetExplicitActive(bool inValue)
+ {
+ SetFlag(Q3DStudio::ELEMENTFLAG_EXPLICITACTIVE, inValue);
+ }
+ bool IsExplicitActive() const { return m_Flags.IsExplicitActive(); }
+
+ // Flag set by the activity manager.
+ void SetActive(bool inValue) { SetFlag(Q3DStudio::ELEMENTFLAG_GLOBALACTIVE, inValue); }
+ bool GetActive() const { return m_Flags.IsActive(); }
+
+ void SetPickEnabled(bool inValue)
+ {
+ SetFlag(Q3DStudio::ELEMENTFLAG_PICKENABLED, inValue);
+ }
+ bool IsPickEnabled() const { return m_Flags.IsPickEnabled(); }
+
+ void SetPlayThrough(bool inValue)
+ {
+ SetFlag(Q3DStudio::ELEMENTFLAG_PLAYTHROUGH, inValue);
+ }
+ bool IsPlayThrough() const { return m_Flags.IsPlayThrough(); }
+
+ void SetScriptCallbacks(bool inValue)
+ {
+ SetFlag(Q3DStudio::ELEMENTFLAG_SCRIPTCALLBACKS, inValue);
+ }
+ bool HasScriptCallbacks() const { return m_Flags.HasScriptCallbacks(); }
+
+ bool IsDirty() const { return m_Flags.IsDirty(); }
+
+ bool GetFlag(Q3DStudio::EElementFlag inFlag) const { return m_Flags.operator&(inFlag); }
+
+ void SetDirty();
+ void SetFlag(Q3DStudio::EElementFlag inFlag, bool inValue);
+ void SetFlag(Q3DStudio::EElementFlag inFlag, int inValue)
+ {
+ SetFlag(inFlag, inValue ? true : false);
+ }
+ qt3ds::runtime::IActivityZone &GetActivityZone() const;
+ bool HasActivityZone() const;
+ // Floating point number differences above this trigger a setDirty call.
+ static float SmallestDifference() { return 0.000001f; }
+ SElement &GetComponentParent();
+ const SElement &GetComponentParent() const;
+ SElement *FindChild(QT3DSU32 inNameHash);
+ // Get the time of my first noncomponent child or
+ // my time if I am not a component.
+ Q3DStudio::TTimeUnit GetInnerTime() const;
+ // Get the time I am animating at.
+ Q3DStudio::TTimeUnit GetOuterTime() const;
+ bool IsDescendent(SElement &inPossibleParent) const;
+ void *GetAssociation() const { return m_Association; }
+ void SetAssociation(void *inAssoc) { m_Association = inAssoc; }
+ QT3DSU32 GetUncachedDepth() const
+ {
+ if (m_Parent)
+ return m_Parent->GetUncachedDepth() + 1;
+ return 0;
+ }
+ void SetDepth() { m_Depth = GetUncachedDepth(); }
+ QT3DSU32 Depth() const { return m_Depth; }
+
+ bool IsUserActive() const;
+
+ bool IsIndependent() const;
+
+ bool IsGlobalActive() const;
+ // This may require a mutex to be held.
+ void SetGlobalActive(bool active);
+
+ bool IsTimeActive() const
+ {
+ if (m_Parent != NULL)
+ return m_ActivationManagerNode.m_Flags.IsTimeActive();
+ return true;
+ }
+
+ bool DoesParticipateInTimeGraph() const { return m_Flags.HasStartEndTime(); }
+
+ bool IsGlobalActive(bool inParentActive) const
+ {
+ bool ta = IsTimeActive();
+ bool ua = IsUserActive();
+
+ return ta && ua && inParentActive;
+ }
+ void findComponents(QVector<SElement *> &components)
+ {
+ if (IsComponent())
+ components.push_back(this);
+ SElement *child = m_Child;
+ while (child) {
+ child->findComponents(components);
+ child = child->m_Sibling;
+ }
+ }
+ };
+
+ struct SGetElementNodeDirtyIndex
+ {
+ QT3DSU32 operator()(const SElement &inNode)
+ {
+ return inNode.m_ActivationManagerNode.m_DirtyIndex;
+ }
+ };
+ struct SSetElementNodeDirtyIndex
+ {
+ void operator()(SElement &inNode, QT3DSU32 val)
+ {
+ inNode.m_ActivationManagerNode.m_DirtyIndex = val;
+ }
+ };
+
+ struct SActivationManagerNodeDirtyList
+ : public InvasiveSet<SElement, SGetElementNodeDirtyIndex, SSetElementNodeDirtyIndex>
+ {
+ typedef InvasiveSet<SElement, SGetElementNodeDirtyIndex, SSetElementNodeDirtyIndex>
+ TBaseType;
+ SActivationManagerNodeDirtyList(NVAllocatorCallback &callback)
+ : TBaseType(callback, "SActivationManagerNodeDirtyList")
+ {
+ }
+ };
+
+ struct SComponent : public SElement
+ {
+ Q3DStudio::SAlignedTimeUnit m_BeginTime;
+ Q3DStudio::SAlignedTimeUnit m_Duration;
+
+ // Slide related
+ QT3DSU8 m_SlideCount; ///< Number of slides starting from base index
+ QT3DSU8 m_CurrentSlide; ///< Current slide number
+ QT3DSU8 m_PreviousSlide; ///< Previous slide number
+ SComponent(const STypeDesc &inDesc)
+ : SElement(inDesc)
+ , m_SlideCount(0)
+ , m_CurrentSlide(0)
+ , m_PreviousSlide(0)
+ {
+ }
+
+ QT3DSU8 GetCurrentSlide() const { return m_CurrentSlide; }
+ void SetCurrentSlide(QT3DSU8 inSlide)
+ {
+ m_PreviousSlide = m_CurrentSlide;
+ m_CurrentSlide = inSlide;
+ }
+ QT3DSU8 GetSlideCount() const { return m_SlideCount; }
+ QT3DSU8 GetPreviousSlide() const { return m_PreviousSlide; }
+ bool GetPaused() const;
+ bool GetPlayBackDirection() const;
+ Q3DStudio::CTimePolicy &GetTimePolicy();
+ const Q3DStudio::CTimePolicy &GetTimePolicy() const;
+ };
+ }
+ // Global store of all elements, values.
+ class IElementAllocator : public NVRefCounted
+ {
+ public:
+ // Performs coalesing of element types so that there are the least number of type
+ // descriptions
+ // Certain properties, like name, eyeball, are never in the property description.
+ virtual element::SElement &
+ CreateElement(CRegisteredString inName, CRegisteredString inType,
+ CRegisteredString inSubType,
+ NVConstDataRef<element::TPropertyDescAndValue> inPropertyDescriptions,
+ Q3DStudio::IPresentation *inPresentation, element::SElement *inParent,
+ bool inIsComponent) = 0;
+
+ virtual void ReleaseElement(element::SElement &inElement, bool inRecurse) = 0;
+
+ virtual Option<element::TPropertyDescAndValuePtr>
+ CreateDynamicProperty(Q3DStudio::IRuntimeMetaData &theMetaData, element::SElement &element,
+ CRegisteredString inName) = 0;
+
+ virtual element::SElement *FindElementByHandle(QT3DSU32 inElementHandle) = 0;
+ // Returns an element pointer that when added to the return value of load will be a valid
+ // element.
+ virtual element::SElement *
+ GetRemappedElementAddress(element::SElement *inElement) const = 0;
+ virtual const element::STypeDesc *
+ GetRemappedTypeDescAddress(const element::STypeDesc *inTypeDesc) const = 0;
+ // If load is successful, then returns an address that can be added to elements and the root
+ // element.
+
+ static IElementAllocator &CreateElementAllocator(NVFoundationBase &inFoundation,
+ IStringTable &inStringTable);
+ };
+}
+}
+
+#endif
diff --git a/src/runtime/Qt3DSEvent.h b/src/runtime/Qt3DSEvent.h
new file mode 100644
index 0000000..aef317a
--- /dev/null
+++ b/src/runtime/Qt3DSEvent.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSKernelTypes.h"
+#include "Qt3DSElementSystem.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+/// Common structure used as both Events and Commands
+struct SEventCommand
+{
+ TElement *m_Target; ///< The target of this action
+ TEventCommandHash m_Type; ///< Type of action to perform
+ UVariant m_Arg1; ///< Argument 1
+ UVariant m_Arg2; ///< Argument 2
+ UINT8 m_Arg1Type; ///< EAttributeType for arg1 variant
+ UINT8 m_Arg2Type; ///< EAttributeType for arg2 variant
+
+ BOOL m_IsEvent : 1; ///< This is an Event or Command
+ BOOL m_BubbleUp : 1; ///< Bubble up to scene parent (2.4.2: theEvent:stopPropagation)
+ BOOL m_BubbleDown : 1; ///< Bubble down to scene children (2.4.2: theEvent:stopPropagation)
+ BOOL m_Done : 1; ///< Stop further handling (2.4.3: theEvent:stopImmediatePropagation)
+
+ UINT8 m_Unused; ///< (padding)
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSEventCallbacks.cpp b/src/runtime/Qt3DSEventCallbacks.cpp
new file mode 100644
index 0000000..25d720e
--- /dev/null
+++ b/src/runtime/Qt3DSEventCallbacks.cpp
@@ -0,0 +1,258 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSEventCallbacks.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ */
+CEventCallbacks::CEventCallbacks()
+ : m_EventCallbacksList(0, 0, "EventCallbacksList")
+ , m_CallbackList(0, 0, "CallbackList")
+{
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CEventCallbacks::~CEventCallbacks()
+{
+ UnregisterAllCallbacks();
+}
+
+//==============================================================================
+/**
+ * Registers a callback to be triggered when a specific event is fired on an
+ * element.
+ * @param inElement element to monitor
+ * @param inEventHash event hash to monitor
+ * @param inCallback static callback function
+ * @param inContextData arbitary data pointer
+ */
+void CEventCallbacks::RegisterCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData)
+{
+ TEventCallbacksList *theEventCallbackList = NULL;
+
+ // Look for the list of callbacks for this element
+ FOR_ARRAY(SElementCallbackEntry *, theEntry, m_EventCallbacksList)
+ {
+ if (inElement == (*theEntry)->m_Element) {
+ theEventCallbackList = &(*theEntry)->m_EventEntries;
+ break;
+ }
+ }
+
+ // Create a new list of callbacks if it does not already exist
+ if (!theEventCallbackList) {
+ SElementCallbackEntry *theElementCallbackEntry =
+ Q3DStudio_new(SElementCallbackEntry) SElementCallbackEntry();
+ theElementCallbackEntry->m_Element = inElement;
+ m_EventCallbacksList.Push(theElementCallbackEntry);
+ theEventCallbackList = &m_EventCallbacksList.Top()->m_EventEntries;
+ }
+
+ TCallbackList *theElementCallbackList = NULL;
+
+ // Look for the list of callbacks for this event
+ FOR_ARRAY(SEventCallbackEntry *, theEntry, (*theEventCallbackList))
+ {
+ if (inEventHash == (*theEntry)->m_EventHash) {
+ theElementCallbackList = &(*theEntry)->m_Callbacks;
+ break;
+ }
+ }
+
+ // Create a new list of callbacks if it does not already exist
+ if (!theElementCallbackList) {
+ SEventCallbackEntry *theEventCallbackEntry =
+ Q3DStudio_new(SEventCallbackEntry) SEventCallbackEntry();
+ theEventCallbackEntry->m_EventHash = inEventHash;
+ theEventCallbackList->Push(theEventCallbackEntry);
+ theElementCallbackList = &theEventCallbackList->Top()->m_Callbacks;
+ }
+
+ // Insert callback
+ SCallbackEntry theCallbackEntry = { inCallback, inContextData };
+ theElementCallbackList->Push(theCallbackEntry);
+}
+
+//==============================================================================
+/**
+ * Unregisters an event callback.
+ * @param inElement element to monitor
+ * @param inEventHash event hash to monitor
+ * @param inCallback static callback function
+ * @param inContextData arbitary data pointer
+ * @param outLast indicates if element no longer has callbacks registered
+ * @return BOOL true if callback is unregistered successfully
+ */
+BOOL CEventCallbacks::UnregisterCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData,
+ BOOL &outLast)
+{
+ outLast = false;
+
+ TEventCallbacksList *theEventCallbackList = NULL;
+
+ INT32 theEventListIndex = 0;
+ SElementCallbackEntry *theFoundEntry = NULL;
+ FOR_ARRAY(SElementCallbackEntry *, theEntry, m_EventCallbacksList)
+ {
+ if (inElement == (*theEntry)->m_Element) {
+ theFoundEntry = *theEntry;
+ theEventCallbackList = &(*theEntry)->m_EventEntries;
+ break;
+ }
+ ++theEventListIndex;
+ }
+
+ if (!theEventCallbackList)
+ return false;
+
+ TCallbackList *theElementCallbackList = NULL;
+
+ INT32 theElementListIndex = 0;
+ SEventCallbackEntry *theEventCallbackEntry = NULL;
+ FOR_ARRAY(SEventCallbackEntry *, theEntry, (*theEventCallbackList))
+ {
+ if (inEventHash == (*theEntry)->m_EventHash) {
+ theEventCallbackEntry = *theEntry;
+ theElementCallbackList = &(*theEntry)->m_Callbacks;
+ break;
+ }
+ ++theElementListIndex;
+ }
+
+ if (!theElementCallbackList)
+ return false;
+
+ INT32 theCallbackIndex = 0;
+ FOR_ARRAY(SCallbackEntry, theEntry, (*theElementCallbackList))
+ {
+ if (inCallback == theEntry->m_Function && inContextData == theEntry->m_ContextData) {
+ theElementCallbackList->Remove(theCallbackIndex);
+
+ if (theElementCallbackList->GetCount() == 0) {
+ Q3DStudio_delete(theEventCallbackEntry, SEventCallbackEntry);
+ theEventCallbackList->Remove(theElementListIndex);
+ }
+
+ if (theEventCallbackList->GetCount() == 0) {
+ Q3DStudio_delete(theFoundEntry, SElementCallbackEntry);
+ m_EventCallbacksList.Remove(theEventListIndex);
+ outLast = true;
+ }
+
+ return true;
+ }
+ ++theCallbackIndex;
+ }
+
+ return false;
+}
+
+//==============================================================================
+/**
+ * Unregisters all callbacks.
+ */
+void CEventCallbacks::UnregisterAllCallbacks()
+{
+ FOR_ARRAY(SElementCallbackEntry *, theEntry, m_EventCallbacksList)
+ Q3DStudio_delete(*theEntry, SElementCallbackEntry);
+ m_EventCallbacksList.Clear();
+}
+
+//==============================================================================
+/**
+ * Fires event callbacks
+ * @param ioEvent the event that was fired
+ */
+void CEventCallbacks::FireCallbacks(SEventCommand &ioEvent)
+{
+ TEventCallbacksList *theEventCallbackList = NULL;
+
+ // Look for the list of callbacks for this element
+ FOR_ARRAY(SElementCallbackEntry *, theEntry, m_EventCallbacksList)
+ {
+ if (ioEvent.m_Target == (*theEntry)->m_Element) {
+ theEventCallbackList = &(*theEntry)->m_EventEntries;
+ break;
+ }
+ }
+
+ if (!theEventCallbackList)
+ return;
+
+ // Look for the list of callbacks for this event
+ FOR_ARRAY(SEventCallbackEntry *, theEntry, (*theEventCallbackList))
+ {
+ if (ioEvent.m_Type == (*theEntry)->m_EventHash) {
+ PerformCallbacks((*theEntry)->m_Callbacks, ioEvent);
+ break;
+ }
+ }
+}
+
+//==============================================================================
+/**
+ * Executing a list of callbacks
+ * @param inCallbackList the list of callbacks to invoke
+ * @param ioEvent the event to pass to the callbacks
+ */
+void CEventCallbacks::PerformCallbacks(TCallbackList &inCallbackList, SEventCommand &ioEvent)
+{
+ // As the callbacks can potentially do a register/unregister that would alter the call list,
+ // it is safer to get a clean copy of the call list to iterate through.
+
+ // Clumsy way to do a m_CallbackList = inCallbackList
+ m_CallbackList.Clear(false);
+ m_CallbackList.Reserve(inCallbackList.GetCount());
+ FOR_ARRAY(SCallbackEntry, theEntry, inCallbackList)
+ m_CallbackList.Push(*theEntry);
+
+ // Invoking the callbacks
+ FOR_ARRAY(SCallbackEntry, theEntry, m_CallbackList)
+ theEntry->m_Function(theEntry->m_ContextData, ioEvent);
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSEventCallbacks.h b/src/runtime/Qt3DSEventCallbacks.h
new file mode 100644
index 0000000..5c17477
--- /dev/null
+++ b/src/runtime/Qt3DSEventCallbacks.h
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "Qt3DSEvent.h"
+#include "Qt3DSMemory.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Typedefs
+//==============================================================================
+typedef void (*TEventCallback)(void *inContextData, SEventCommand &ioEvent);
+
+//==============================================================================
+/**
+ * Manages the various events callbacks in the system. It fires the
+ * registered callbacks when an event was triggered.
+ */
+class CEventCallbacks
+{
+ //==============================================================================
+ // Structs
+ //==============================================================================
+protected:
+ struct SCallbackEntry
+ {
+ TEventCallback m_Function; ///< Callback function pointer
+ void *m_ContextData; ///< User data
+ };
+ typedef CArray<SCallbackEntry> TCallbackList; ///< Array of callbacks regisgtered
+
+ struct SEventCallbackEntry
+ {
+ SEventCallbackEntry()
+ : m_EventHash(0)
+ {
+ }
+ ~SEventCallbackEntry() {}
+
+ TEventCommandHash m_EventHash; ///< The event of interest
+ TCallbackList m_Callbacks; ///< List of callbacks listening to this event
+
+ private: // Disabled Copy Construction
+ SEventCallbackEntry(const SEventCallbackEntry &);
+ SEventCallbackEntry &operator=(const SEventCallbackEntry &);
+ };
+ typedef CArray<SEventCallbackEntry *> TEventCallbacksList; ///< Array of events with callback
+
+ struct SElementCallbackEntry
+ {
+ SElementCallbackEntry()
+ : m_Element(NULL)
+ {
+ }
+ ~SElementCallbackEntry()
+ {
+ FOR_ARRAY(SEventCallbackEntry *, theEntry, m_EventEntries)
+ Q3DStudio_delete(*theEntry, SEventCallbackEntry);
+ }
+
+ TElement *m_Element; ///< Element to monitor for event
+ TEventCallbacksList m_EventEntries; ///< List of events listened on this element
+
+ private: // Disabled Copy Construction
+ SElementCallbackEntry(const SElementCallbackEntry &);
+ SElementCallbackEntry &operator=(const SElementCallbackEntry &);
+ };
+ typedef CArray<SElementCallbackEntry *>
+ TElementCallbacksList; ///< Array of elements with callbacks
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ TElementCallbacksList m_EventCallbacksList; ///< List of event callbacks
+ TCallbackList m_CallbackList;
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CEventCallbacks();
+ ~CEventCallbacks();
+
+public: // Registration
+ void RegisterCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData);
+ BOOL UnregisterCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData, BOOL &outLast);
+ void UnregisterAllCallbacks();
+
+public: // Operation
+ void FireCallbacks(SEventCommand &ioEvent);
+
+protected:
+ void PerformCallbacks(TCallbackList &inCallbackList, SEventCommand &ioEvent);
+
+private: // Disabled Copy Construction
+ CEventCallbacks(const CEventCallbacks &);
+ CEventCallbacks &operator=(const CEventCallbacks &);
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSFrameworkTypes.h b/src/runtime/Qt3DSFrameworkTypes.h
new file mode 100644
index 0000000..8cb5c3b
--- /dev/null
+++ b/src/runtime/Qt3DSFrameworkTypes.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTypes.h"
+#include "Qt3DSArray.h"
+#include "Qt3DSVector3.h"
+#include "Qt3DSMatrix.h"
+#include "Qt3DSBoundingBox.h"
+#include "Qt3DSKernelTypes.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSIComponentManager.h b/src/runtime/Qt3DSIComponentManager.h
new file mode 100644
index 0000000..8185da2
--- /dev/null
+++ b/src/runtime/Qt3DSIComponentManager.h
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "Qt3DSTimePolicy.h"
+#include "foundation/Qt3DSOption.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+
+namespace qt3ds {
+namespace runtime {
+ namespace element {
+ struct TElement;
+ struct TComponent;
+ }
+}
+}
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+struct IComponentTimeOverrideFinishedCallback
+{
+protected:
+ virtual ~IComponentTimeOverrideFinishedCallback() {}
+public:
+ virtual void OnTimeFinished() = 0;
+ virtual void Release() = 0;
+};
+
+typedef qt3ds::foundation::Option<TimePolicyModes::Enum> TTimePolicyModeOption;
+typedef qt3ds::foundation::Option<INT32> TInt32Option;
+typedef qt3ds::foundation::Option<unsigned long> TULongOption;
+typedef qt3ds::foundation::Option<bool> TBoolOption;
+
+struct SComponentGotoSlideData
+{
+ INT32 m_Slide;
+ TTimePolicyModeOption m_Mode;
+ //-2 means previous, -1 means next, 1-N means slide
+ TInt32Option m_PlaythroughTo;
+ TULongOption m_StartTime;
+ FLOAT m_Rate;
+ bool m_Reverse;
+ TBoolOption m_Paused;
+
+ // No mode means use the mode in the slide data.
+ SComponentGotoSlideData(INT32 inSlide = 0,
+ TTimePolicyModeOption inMode = TTimePolicyModeOption(),
+ TInt32Option inPlayThrough = TInt32Option(),
+ TULongOption inStartTime = TULongOption(), FLOAT inRate = 1.0f,
+ bool inReverse = false, TBoolOption inPaused = TBoolOption())
+ : m_Slide(inSlide)
+ , m_Mode(inMode)
+ , m_PlaythroughTo(inPlayThrough)
+ , m_StartTime(inStartTime)
+ , m_Rate(inRate)
+ , m_Reverse(inReverse)
+ , m_Paused(inPaused)
+ {
+ }
+};
+
+//==============================================================================
+/**
+ * @interface IComponentManager
+ * Base interface of the container of all the components in the presentation.
+ * This specify the basic operations required to implement a Component manager
+ * object that works well with the kernel.
+ */
+class IComponentManager
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ virtual ~IComponentManager() {}
+
+public: // Promotion
+ virtual TComponent *GetComponent(TElement *inElement) = 0;
+
+public: // Slides
+ virtual void GotoSlideIndex(TElement *inComponent, const SComponentGotoSlideData &inGotoData,
+ BOOL inSlideExit = true) = 0;
+ virtual void GotoSlideName(TElement *inComponent, const TStringHash inSlideHashName) = 0;
+ virtual void GoToBackSlide(TElement *inComponent) = 0;
+ virtual void GoToNextSlide(TElement *inComponent, const INT32 inDecrement = 1) = 0;
+ virtual void GoToPreviousSlide(TElement *inComponent, const INT32 inDecrement = 1) = 0;
+
+ virtual UINT8 GetSlideCount(TElement *inComponent) = 0;
+ virtual UINT8 GetCurrentSlide(TElement *inComponent) = 0;
+ virtual const CHAR *GetCurrentSlideName(TElement *inComponent) = 0;
+
+ virtual void OnElementDeactivated(TElement *inElement) = 0;
+
+ virtual void SetComponentTimeOverride(TElement *inElement, TTimeUnit inEndTime,
+ FLOAT inInterpolation,
+ IComponentTimeOverrideFinishedCallback *inCallback) = 0;
+
+ virtual void SetupComponentGotoSlideCommand(TElement *inElement,
+ const SComponentGotoSlideData &inGotoSlideData) = 0;
+ virtual bool HasComponentGotoSlideCommand(TElement *inElement) = 0;
+ virtual SComponentGotoSlideData GetComponentGotoSlideCommand(TElement *inElement) = 0;
+ virtual void ReleaseComponentGotoSlideCommand(TElement *inElement) = 0;
+
+public: // Time
+ virtual void GoToTime(TElement *inComponent, const TTimeUnit inTime) = 0;
+ virtual void SetPause(TElement *inComponent, const BOOL inPause) = 0;
+ virtual void SetTimePolicy(TElement *inComponent, const TTimeUnit inLoopDuration,
+ const UINT32 inRepetitions, const BOOL inPingPong,
+ const BOOL inPlayThrough) = 0;
+
+ virtual BOOL GetPause(TElement *inComponent) = 0;
+ virtual BOOL GetPlayBackDirection(TElement *inComponent) = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSIInputSystem.h b/src/runtime/Qt3DSIInputSystem.h
new file mode 100644
index 0000000..6cd201f
--- /dev/null
+++ b/src/runtime/Qt3DSIInputSystem.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "Qt3DSInputEngine.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Input system interface
+ */
+class IInputSystem : public CInputEngine
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ virtual ~IInputSystem() {}
+
+public: // Processing
+ virtual void UpdateInput() = 0;
+ virtual void ProcessInput() = 0;
+
+protected: // Input System handler
+ virtual void CheckMouseEvent() = 0;
+ virtual void CheckKeyboardEvent() = 0;
+ virtual void CheckJoystickEvent() = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSIScene.h b/src/runtime/Qt3DSIScene.h
new file mode 100644
index 0000000..421fe9c
--- /dev/null
+++ b/src/runtime/Qt3DSIScene.h
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "Qt3DSBoundingBox.h"
+namespace qt3ds {
+namespace render {
+ class IImageLoadListener;
+}
+ class NVAllocatorCallback;
+}
+
+namespace Q3DStudio {
+
+class IPresentation;
+class RuntimeMatrix;
+struct SPickFrame;
+
+/**
+* @interface IScene
+*
+* Runtime interface to the renderer's representation of a presentation. Scenes are
+* created by the SceneManager and rendered via a lower level rendering system.
+*/
+struct STextSizes
+{
+ INT32 m_Width;
+ INT32 m_Height;
+ STextSizes()
+ : m_Width(0)
+ , m_Height(0)
+ {
+ }
+ STextSizes(INT32 w, INT32 h)
+ : m_Width(w)
+ , m_Height(h)
+ {
+ }
+};
+
+struct SMousePosition
+{
+ INT32 m_X;
+ INT32 m_Y;
+ SMousePosition(INT32 x, INT32 y)
+ : m_X(x)
+ , m_Y(y)
+ {
+ }
+ SMousePosition()
+ : m_X(0)
+ , m_Y(0)
+ {
+ }
+};
+
+struct SCameraRect
+{
+ float m_Left;
+ float m_Top;
+ float m_Right;
+ float m_Bottom;
+ SCameraRect(float l = 0.0f, float t = 0.0f, float r = 0.0f, float b = 0.0f)
+ : m_Left(l)
+ , m_Top(t)
+ , m_Right(r)
+ , m_Bottom(b)
+ {
+ }
+
+ bool IsValid() const { return fabs(m_Right - m_Left) > 0.0f; }
+};
+
+class IScene
+{
+protected:
+ virtual ~IScene() {}
+
+public: // Base Interface
+ virtual IPresentation &GetPresentation() = 0;
+
+ virtual void SetUserData(void *inUserData) = 0;
+ virtual void *GetUserData() = 0;
+
+ virtual void CalculateGlobalTransform(TElement *inElement, RuntimeMatrix &outTransform) = 0;
+ virtual void SetLocalTransformMatrix(TElement *inElement, const RuntimeMatrix &inTransform) = 0;
+ // Get bounding box in global space
+ virtual CBoundingBox GetBoundingBox(TElement *inElement, bool inSelfOnly) = 0;
+ // Get bounding box in local space.
+ virtual CBoundingBox GetLocalBoundingBox(TElement *inElement, bool inSelfOnly) = 0;
+
+ // The final argument, inHasTransparency has 3 possible values,
+ // 0 for no transparency, 1 for hasTransparency, -1 for unknown
+ virtual void SetTextureData(TElement *inElement, const unsigned char *inBuffer,
+ INT32 inBufferLength, INT32 inWidth, INT32 inHeight,
+ qt3ds::render::NVRenderTextureFormats::Enum inFormat,
+ INT32 inHasTransparency = -1) = 0;
+
+ virtual bool CreateOrSetMeshData(const char *inPathStr, unsigned char *vertData,
+ unsigned int numVerts, unsigned int vertStride,
+ unsigned int *indexData, unsigned int numIndices,
+ qt3ds::NVBounds3 &objBounds) = 0;
+
+ virtual STextSizes MeasureText(TElement *inElement, const char *inTextStr) = 0;
+
+ virtual STextSizes GetPresentationDesignDimensions() = 0;
+ // If the rect's right - left == 0.0, this method failed. Possibly because the layer is just
+ // direct-rendering a sub-presentation.
+ virtual SCameraRect GetCameraBounds(TElement &inElement) = 0;
+
+ virtual void PositionToScreen(TElement &inElement, qt3ds::QT3DSVec3 &inPos,
+ qt3ds::QT3DSVec3 &outScreen) = 0;
+ virtual void ScreenToPosition(TElement &inElement, qt3ds::QT3DSVec3 &inScreen,
+ qt3ds::QT3DSVec3 &outPos) = 0;
+
+ virtual qt3ds::foundation::CRegisteredString RegisterStr(const char *inStr) = 0;
+
+ virtual SMousePosition WindowToPresentation(const SMousePosition &inWindowPos) = 0;
+
+ virtual void RegisterOffscreenRenderer(const char *inKey) = 0;
+
+ virtual void Release() = 0;
+
+ virtual bool preferKtx() const = 0;
+
+ virtual qt3ds::NVAllocatorCallback &allocator() = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSIScriptBridge.h b/src/runtime/Qt3DSIScriptBridge.h
new file mode 100644
index 0000000..889968d
--- /dev/null
+++ b/src/runtime/Qt3DSIScriptBridge.h
@@ -0,0 +1,206 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "Qt3DSIComponentManager.h"
+#include "EASTL/vector.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSApplication.h"
+
+#include <QtCore/qvariant.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qstringlist.h>
+
+namespace qt3dsimp {
+ struct Mesh;
+}
+
+namespace qt3ds {
+namespace runtime {
+ class IApplication;
+}
+}
+namespace qt3ds {
+namespace state {
+ namespace debugger {
+ class IMultiProtocolSocket;
+ }
+}
+}
+namespace qt3ds {
+namespace render {
+ class IThreadPool;
+ class IQt3DSRenderer;
+ class ICustomMaterialSystem;
+ class IDynamicObjectSystem;
+ class IBufferManager;
+}
+}
+
+struct script_State;
+
+namespace Q3DStudio {
+
+struct SEventCommand;
+class IPresentation;
+
+/**
+ * @interface IScriptBridge
+ * @brief Callback and load interface for a script engine.
+ */
+
+class IScriptTableProvider
+{
+protected:
+ virtual ~IScriptTableProvider() {}
+public:
+ virtual void CreateTable(script_State *inState) = 0;
+};
+
+struct SScriptEngineGotoSlideArgs
+{
+ TTimePolicyModeOption m_Mode;
+ //-2 means previous, -1 means next, 1-N means slide
+ const char *m_PlaythroughTo;
+ TULongOption m_StartTime;
+ float m_Rate;
+ bool m_Reverse;
+ TBoolOption m_Paused;
+ SScriptEngineGotoSlideArgs()
+ : m_PlaythroughTo(NULL)
+ , m_Rate(1.0f)
+ , m_Reverse(false)
+ {
+ }
+};
+
+class CScriptEngineCallFunctionArgRetriever
+{
+public:
+ CScriptEngineCallFunctionArgRetriever(const char *inArguments)
+ : m_ArgumentString(inArguments)
+ {
+ }
+ virtual ~CScriptEngineCallFunctionArgRetriever() {}
+ // Retrieve argument
+ // Return value: -1 error; otherwise it indicates argument count
+ virtual int RetrieveArgument(script_State *inState);
+ virtual eastl::string GetArgDescription();
+
+protected:
+ const char *m_ArgumentString;
+};
+
+class IScriptBridge : public qt3ds::foundation::NVRefCounted
+{
+public:
+ virtual ~IScriptBridge() {}
+
+public: // thread
+ // After this call all public functions are protected by a mutex
+ virtual void EnableMultithreadedAccess() = 0;
+ // After this call all public functions are not threadsafe.
+ virtual void DisableMultithreadedAccess() = 0;
+
+public: // Settings
+ virtual void SetApplicationCore(qt3ds::runtime::IApplication &inApplication) = 0;
+ virtual void SetApplication(qt3ds::runtime::IApplication &inApplication) = 0;
+
+public: // Scripts
+ // Both loads script, create an self table -> scriptIndex in a behaviors table
+ // LoadScript goes further by registering scriptIndex->inPresentation, and inOwner->m_ScriptID=
+ // scriptIndex
+ virtual void LoadScript(IPresentation *inPresentation, TElement *inOwner,
+ const CHAR *inName) = 0;
+ virtual Q3DStudio::INT32 InitializeApplicationBehavior(const char *inProjectRelativePath) = 0;
+
+public: // Script functions and Callbacks
+ virtual void ProcessFrameCallbacks(IPresentation *inPresentation) = 0;
+ // Call a member function inFnName from self table whose script index is given by inApp
+ virtual void ExecuteApplicationScriptFunction(Q3DStudio::INT32 inApp, const char *inFnName) = 0;
+ virtual void CallFunction(const char *behavior, const char *handler,
+ CScriptEngineCallFunctionArgRetriever &inArgRetriever) = 0;
+
+public: // Custom Actions
+ virtual void ProcessSignal(IPresentation *inPresentation,
+ const SEventCommand &inCommand) = 0;
+ virtual void ProcessCustomActions(IPresentation *inPresentation,
+ const SEventCommand &inCommand) = 0;
+ virtual void ProcessCustomCallback(IPresentation *inPresentation,
+ const SEventCommand &inCommand) = 0;
+
+public: // Elements
+ // Use inProvider to create a new table and associate with inElement: currently a render plugin
+ // element this mimics render plugin as an behavior element
+ virtual void SetTableForElement(TElement &inElement, IScriptTableProvider &inProvider) = 0;
+ virtual void SetAttribute(TElement *element, const char *attName, const char *value) = 0;
+ virtual void SetAttribute(const char *element, const char *attName, const char *value) = 0;
+ virtual void FireEvent(const char *element, const char *evtName) = 0;
+ virtual void SetDataInputValue(
+ const QString &name, const QVariant &value,
+ qt3ds::runtime::DataInputValueRole property
+ = qt3ds::runtime::DataInputValueRole::Value) = 0;
+ virtual void createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties,
+ qt3ds::render::IQt3DSRenderer *renderer) = 0;
+ virtual void deleteElements(const QStringList &elementPath,
+ qt3ds::render::IQt3DSRenderer *renderer) = 0;
+ virtual void createMaterials(const QString &subPresId, const QStringList &materialDefinitions,
+ qt3ds::render::ICustomMaterialSystem *customMaterialSystem,
+ qt3ds::render::IDynamicObjectSystem *dynamicObjectSystem,
+ qt3ds::render::IQt3DSRenderer *renderer) = 0;
+ virtual void deleteMaterials(const QStringList &materialNames,
+ qt3ds::render::IQt3DSRenderer *renderer) = 0;
+ virtual void createMesh(const QString &name, qt3dsimp::Mesh *mesh,
+ qt3ds::render::IBufferManager *bufferManager) = 0;
+ virtual void deleteMeshes(const QStringList &elementPath,
+ qt3ds::render::IBufferManager *bufferManager) = 0;
+
+public: // Components
+ virtual void GotoSlide(const char *component, const char *slideName,
+ const SScriptEngineGotoSlideArgs &inArgs) = 0;
+ virtual void GotoSlideRelative(const char *component, bool inNextSlide, bool inWrap,
+ const SScriptEngineGotoSlideArgs &inArgs) = 0;
+
+public: // Presentation
+ virtual void SetPresentationAttribute(const char *presId, const char *attName,
+ const char *attValue) = 0;
+
+public: // Multimedia
+ virtual bool PlaySoundFile(const char *soundPath) = 0;
+
+public: // Miscellaneous
+ virtual void EnableDebugging(qt3ds::state::debugger::IMultiProtocolSocket &socket) = 0;
+ virtual void EnableProfiling() = 0;
+ virtual void StepGC() = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSIStateful.h b/src/runtime/Qt3DSIStateful.h
new file mode 100644
index 0000000..0eca293
--- /dev/null
+++ b/src/runtime/Qt3DSIStateful.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSArray.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+class IStatefulStackBase
+{
+public:
+ virtual void PushState() = 0;
+ virtual void PopState() = 0;
+};
+
+template <typename T>
+class IStatefulStack : public IStatefulStackBase
+{
+public:
+ IStatefulStack(T &inStateProperty)
+ : m_StateProperty(inStateProperty)
+ {
+ }
+
+ virtual ~IStatefulStack(){};
+
+public:
+ virtual void PushState() { m_States.Push(m_StateProperty); }
+ virtual void PopState() { m_StateProperty = m_States.Pop(); }
+
+protected:
+ T &m_StateProperty;
+ CArray<T> m_States;
+};
+
+} // namespace Q3DStudio \ No newline at end of file
diff --git a/src/runtime/Qt3DSIText.h b/src/runtime/Qt3DSIText.h
new file mode 100644
index 0000000..c4694fe
--- /dev/null
+++ b/src/runtime/Qt3DSIText.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class CWorld;
+class CRenderStateManager;
+
+class IText
+{
+public: // Text update
+ virtual void Update(CWorld &inWorld, CVector3 &outBoxMin, CVector3 &outBoxMax) = 0;
+ virtual void Apply(CRenderStateManager &inRenderStateManager) = 0;
+ static IText *GetIText(INT32 inAssociation);
+};
+
+} // namespace Q3DStudio \ No newline at end of file
diff --git a/src/runtime/Qt3DSInputDefs.h b/src/runtime/Qt3DSInputDefs.h
new file mode 100644
index 0000000..447e424
--- /dev/null
+++ b/src/runtime/Qt3DSInputDefs.h
@@ -0,0 +1,413 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Mouse button state flags
+ * There is some discrepancy between mouse state and mouse events.
+ *
+ * Mouse button state refers to the actual state of the button as captured
+ * by the input engine. The logical states are: up, pressed, down and released.
+ *
+ * Mouse events are generated by Kernel (in CKernel::SetPickFrame), and current
+ * support is only for pressed and released. This translates to the respective
+ * MOUSE_DOWN and MOUSE_UP.
+ *
+ * Therefore, a mapping would be:
+ * STATE_MOUSE_PRESSED -> EVENT_MOUSE_DOWN
+ * STATE_MOUSE_RELEASED -> EVENT_MOUSE_UP
+ * STATE_MOUSE_UP -> No corresponding event
+ * STATE_MOUSE_DOWN -> No corresponding event
+ *
+ */
+enum EMouseInputFlags {
+ NO_INPUT = 0,
+ //
+ LMOUSE_PRESSED = 1 << 0,
+ LMOUSE_RELEASED = 1 << 1,
+ MMOUSE_PRESSED = 1 << 2,
+ MMOUSE_RELEASED = 1 << 3,
+ RMOUSE_PRESSED = 1 << 4,
+ RMOUSE_RELEASED = 1 << 5,
+ //
+ LMOUSE_DOWN = 1 << 6,
+ LMOUSE_UP = 1 << 7,
+ MMOUSE_DOWN = 1 << 8,
+ MMOUSE_UP = 1 << 9,
+ RMOUSE_DOWN = 1 << 10,
+ RMOUSE_UP = 1 << 11,
+ MOUSEBUTTONCOUNT = 3, // left, middle, right - could potentially have more mouse buttons
+
+ HSCROLLWHEEL = 1 << 12,
+ VSCROLLWHEEL = 1 << 13,
+};
+
+//==============================================================================
+/**
+ * Key code/index to SInputFrame::m_KeyStates
+ */
+// enum EKeyCode
+//{
+// KEY_NOKEY = 0x00,
+// KEY_ESCAPE,
+// KEY_1,
+// KEY_2,
+// KEY_3,
+// KEY_4,
+// KEY_5,
+// KEY_6,
+// KEY_7,
+// KEY_8,
+// KEY_9,
+// KEY_0,
+// KEY_MINUS, /* - on main keyboard */
+// KEY_EQUALS,
+// KEY_BACK, /* backspace */
+// KEY_TAB,
+// KEY_Q,
+// KEY_W,
+// KEY_E,
+// KEY_R,
+// KEY_T,
+// KEY_Y,
+// KEY_U,
+// KEY_I,
+// KEY_O,
+// KEY_P,
+// KEY_LBRACKET,
+// KEY_RBRACKET,
+// KEY_RETURN, /* Enter on main keyboard */
+// KEY_LCONTROL,
+// KEY_A,
+// KEY_S,
+// KEY_D,
+// KEY_F,
+// KEY_G,
+// KEY_H,
+// KEY_J,
+// KEY_K,
+// KEY_L,
+// KEY_SEMICOLON,
+// KEY_APOSTROPHE,
+// KEY_GRAVE, /* accent grave */
+// KEY_LSHIFT,
+// KEY_BACKSLASH,
+// KEY_Z,
+// KEY_X,
+// KEY_C,
+// KEY_V,
+// KEY_B,
+// KEY_N,
+// KEY_M,
+// KEY_COMMA,
+// KEY_PERIOD, /* . on main keyboard */
+// KEY_SLASH, /* / on main keyboard */
+// KEY_RSHIFT,
+// KEY_MULTIPLY, /* * on numeric keypad */
+// KEY_LMENU, /* left Alt */
+// KEY_SPACE,
+// KEY_CAPITAL,
+// KEY_F1,
+// KEY_F2,
+// KEY_F3,
+// KEY_F4,
+// KEY_F5,
+// KEY_F6,
+// KEY_F7,
+// KEY_F8,
+// KEY_F9,
+// KEY_F10,
+// KEY_NUMLOCK,
+// KEY_SCROLL, /* Scroll Lock */
+// KEY_NUMPAD7,
+// KEY_NUMPAD8,
+// KEY_NUMPAD9,
+// KEY_SUBTRACT, /* - on numeric keypad */
+// KEY_NUMPAD4,
+// KEY_NUMPAD5,
+// KEY_NUMPAD6,
+// KEY_ADD, /* + on numeric keypad */
+// KEY_NUMPAD1,
+// KEY_NUMPAD2,
+// KEY_NUMPAD3,
+// KEY_NUMPAD0,
+// KEY_DECIMAL, /* . on numeric keypad */
+// KEY_OEM_102, /* <> or \| on RT 102-key keyboard (Non-U.S.) */
+// KEY_F11,
+// KEY_F12,
+// KEY_F13, /* (NEC PC98) */
+// KEY_F14, /* (NEC PC98) */
+// KEY_F15, /* (NEC PC98) */
+// KEY_KANA, /* (Japanese keyboard) */
+// KEY_ABNT_C1, /* /? on Brazilian keyboard */
+// KEY_CONVERT, /* (Japanese keyboard) */
+// KEY_NOCONVERT, /* (Japanese keyboard) */
+// KEY_YEN, /* (Japanese keyboard) */
+// KEY_ABNT_C2, /* Numpad . on Brazilian keyboard */
+// KEY_NUMPADEQUALS, /* = on numeric keypad (NEC PC98) */
+// KEY_PREVTRACK, /* Previous Track
+// (DIK_CIRCUMFLEX on Japanese keyboard) */
+// KEY_AT, /* (NEC PC98) */
+// KEY_COLON, /* (NEC PC98) */
+// KEY_UNDERLINE, /* (NEC PC98) */
+// KEY_KANJI, /* (Japanese keyboard) */
+// KEY_STOP, /* (NEC PC98) */
+// KEY_AX, /* (Japan AX) */
+// KEY_UNLABELED, /* (J3100) */
+// KEY_NEXTTRACK, /* Next Track */
+// KEY_NUMPADENTER, /* Enter on numeric keypad */
+// KEY_RCONTROL,
+// KEY_MUTE, /* Mute */
+// KEY_CALCULATOR, /* Calculator */
+// KEY_PLAYPAUSE, /* Play / Pause */
+// KEY_MEDIASTOP, /* Media Stop */
+// KEY_VOLUMEDOWN, /* Volume - */
+// KEY_VOLUMEUP, /* Volume + */
+// KEY_WEBHOME, /* Web home */
+// KEY_NUMPADPERIOD, /* . on numeric keypad (NEC PC98) */
+// KEY_DIVIDE, /* / on numeric keypad */
+// KEY_SYSRQ,
+// KEY_RMENU, /* right Alt */
+// KEY_PAUSE, /* Pause */
+// KEY_HOME, /* Home on arrow keypad */
+// KEY_UP, /* UpArrow on arrow keypad */
+// KEY_PRIOR, /* PgUp on arrow keypad */
+// KEY_LEFT, /* LeftArrow on arrow keypad */
+// KEY_RIGHT, /* RightArrow on arrow keypad */
+// KEY_END, /* End on arrow keypad */
+// KEY_DOWN, /* DownArrow on arrow keypad */
+// KEY_NEXT, /* PgDn on arrow keypad */
+// KEY_INSERT, /* Insert on arrow keypad */
+// KEY_DELETE, /* Delete on arrow keypad */
+// KEY_LWIN, /* Left Windows key */
+// KEY_RWIN, /* Right Windows key */
+// KEY_APPS, /* AppMenu key */
+// KEY_POWER, /* System Power */
+// KEY_SLEEP, /* System Sleep */
+// KEY_WAKE, /* System Wake */
+// KEY_WEBSEARCH, /* Web Search */
+// KEY_WEBFAVORITES, /* Web Favorites */
+// KEY_WEBREFRESH, /* Web Refresh */
+// KEY_WEBSTOP, /* Web Stop */
+// KEY_WEBFORWARD, /* Web Forward */
+// KEY_WEBBACK, /* Web Back */
+// KEY_MYCOMPUTER, /* My Computer */
+// KEY_MAIL, /* Mail */
+// KEY_MEDIASELECT, /* Media Select */
+// //
+// KEY_TOTAL_COUNT
+//};
+
+typedef enum _EKeyCode {
+ KEY_NOKEY = 0,
+ KEY_ESCAPE,
+ KEY_1,
+ KEY_2,
+ KEY_3,
+ KEY_4,
+ KEY_5,
+ KEY_6,
+ KEY_7,
+ KEY_8,
+ KEY_9,
+ KEY_0,
+ KEY_SUBTRACT,
+ KEY_EQUALS,
+ KEY_BACK,
+ KEY_TAB,
+ KEY_Q,
+ KEY_W,
+ KEY_E,
+ KEY_R,
+ KEY_T,
+ KEY_Y,
+ KEY_U,
+ KEY_I,
+ KEY_O,
+ KEY_P,
+ KEY_LBRACKET,
+ KEY_RBRACKET,
+ KEY_RETURN,
+ KEY_LCONTROL,
+ KEY_A, // 30
+ KEY_S,
+ KEY_D,
+ KEY_F,
+ KEY_G,
+ KEY_H,
+ KEY_J,
+ KEY_K,
+ KEY_L,
+ KEY_SEMICOLON,
+ KEY_APOSTROPHE, // 40
+ KEY_GRAVE,
+ KEY_LSHIFT,
+ KEY_BACKSLASH,
+ KEY_Z,
+ KEY_X,
+ KEY_C,
+ KEY_V,
+ KEY_B,
+ KEY_N,
+ KEY_M,
+ KEY_COMMA,
+ KEY_PERIOD,
+ KEY_SLASH,
+ KEY_RSHIFT,
+ KEY_MULTIPLY,
+ KEY_LALT,
+ KEY_SPACE,
+ KEY_CAPITAL,
+ KEY_F1,
+ KEY_F2, // 60
+ KEY_F3,
+ KEY_F4,
+ KEY_F5,
+ KEY_F6,
+ KEY_F7,
+ KEY_F8,
+ KEY_F9,
+ KEY_F10,
+ KEY_NUMLOCK,
+ KEY_SCROLL, // 70
+ KEY_NUMPAD7,
+ KEY_NUMPAD8,
+ KEY_NUMPAD9,
+ KEY_NUMPADSUBTRACT,
+ KEY_NUMPAD4,
+ KEY_NUMPAD5,
+ KEY_NUMPAD6,
+ KEY_NUMPADADD,
+ KEY_NUMPAD1,
+ KEY_NUMPAD2, // 80
+ KEY_NUMPAD3,
+ KEY_NUMPAD0,
+ KEY_NUMPADDECIMAL,
+ KEY_NOOP,
+ KEY_ZENKAKUHANKAKU,
+ KEY_102ND,
+ KEY_F11,
+ KEY_F12,
+ KEY_F13,
+ KEY_F14, // 90
+ KEY_HIRAGANA,
+ KEY_HENKAN,
+ KEY_KATAKANAHIRAGANA,
+ KEY_MUHENKAN,
+ KEY_KPJPCOMMA,
+ KEY_NUMPADENTER,
+ KEY_RCONTROL,
+ KEY_NUMPADDIVIDE,
+ KEY_PRINTSCREEN,
+ KEY_RALT, // 100
+ KEY_LINEFEED,
+ KEY_HOME,
+ KEY_UP,
+ KEY_PGUP,
+ KEY_LEFT,
+ KEY_RIGHT,
+ KEY_END,
+ KEY_DOWN,
+ KEY_PGDN,
+ KEY_INSERT, // 110
+ KEY_DELETE,
+ KEY_MACRO,
+ KEY_MUTE,
+ KEY_VOLUMEDOWN,
+ KEY_VOLUMEUP,
+ KEY_POWER,
+ KEY_KPEQUAL,
+ KEY_KPPLUSMINUS,
+ KEY_PAUSE,
+ KEY_SCALE,
+ KEY_TOTAL_COUNT
+} EKeyCode;
+
+//==============================================================================
+/**
+ * Keyboard modifier flags
+ */
+enum EKeyboardModifierFlags {
+ MODIFIER_NONE = 0,
+ MODIFIER_SHIFT = 1 << 0,
+ MODIFIER_CTRL = 1 << 1,
+ MODIFIER_ALT = 1 << 2,
+ MODIFIER_KEYDOWN = 1 << 3, ///< One or more key is down
+};
+
+//==============================================================================
+/**
+ * Button codes
+ */
+enum EButtonCodes {
+ BUTTON_A = 0,
+ BUTTON_B,
+ BUTTON_X,
+ BUTTON_Y,
+ BUTTON_L1,
+ BUTTON_R1,
+ BUTTON_THUMBL,
+ BUTTON_THUMBR,
+ BUTTON_SELECT,
+ BUTTON_START,
+ BUTTON_MODE,
+ BUTTON_UP,
+ BUTTON_DOWN,
+ BUTTON_LEFT,
+ BUTTON_RIGHT,
+ BUTTON_CENTER,
+ BUTTON_ENTER,
+ BUTTON_TOTAL_COUNT
+};
+
+//==============================================================================
+/**
+ * Axis codes
+ */
+enum EAxisCodes {
+ AXIS_X = 0,
+ AXIS_Y,
+ AXIS_Z,
+ AXIS_RZ,
+ AXIS_HAT_X,
+ AXIS_HAT_Y,
+ AXIS_LTRIGGER,
+ AXIS_RTRIGGER,
+ AXIS_TOTAL_COUNT
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSInputEngine.cpp b/src/runtime/Qt3DSInputEngine.cpp
new file mode 100644
index 0000000..d3cbe42
--- /dev/null
+++ b/src/runtime/Qt3DSInputEngine.cpp
@@ -0,0 +1,849 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+#include <EASTL/list.h>
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSInputEngine.h"
+#include "Qt3DSSceneManager.h"
+#include "Qt3DSInputEventTypes.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSRuntimeFactory.h"
+#include "EventPollingSystem.h"
+#include "foundation/Qt3DSAssert.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+class CInputEventProvider : public qt3ds::evt::IEventProvider
+{
+ int m_RefCount;
+
+public:
+ CInputEventProvider()
+ : m_RefCount(0)
+ {
+ }
+ ~CInputEventProvider()
+ {
+ while (!m_Events.empty()) {
+ delete m_Events.front();
+ m_Events.pop_front();
+ }
+ }
+ struct SEvent
+ {
+ enum EType { TYPE_NONE = 0, TYPE_KEYBOARD, TYPE_BUTTON, TYPE_COUNT };
+ SEvent(EType inType)
+ : m_Type(inType)
+ {
+ }
+ EType m_Type;
+
+ virtual SEvent *Clone() const = 0;
+ virtual Qt3DSEventSystemEvent *GenEventSystemEvent(qt3ds::evt::IEventFactory &inFactory) = 0;
+ };
+ struct SKeyboardEvent : public SEvent
+ {
+ SKeyboardEvent()
+ : SEvent(TYPE_KEYBOARD)
+ , m_KeyCode(KEY_NOKEY)
+ , m_KeyEvent(0)
+ {
+ }
+ SKeyboardEvent(INT32 inKeyCode, UINT32 inKeyEvent)
+ : SEvent(TYPE_KEYBOARD)
+ , m_KeyCode(inKeyCode)
+ , m_KeyEvent(inKeyEvent)
+ {
+ }
+ SEvent *Clone() const override
+ {
+ return new SKeyboardEvent(this->m_KeyCode, this->m_KeyEvent);
+ }
+ Qt3DSEventSystemEvent *GenEventSystemEvent(qt3ds::evt::IEventFactory &inFactory) override
+ {
+ if (m_KeyEvent == ON_KEYDOWN || m_KeyEvent == ON_KEYUP || m_KeyEvent == ON_KEYREPEAT) {
+ Qt3DSEventSystemEvent &theEvent = inFactory.CreateEvent(3);
+ int theIndex = 0;
+ theEvent.m_Data[theIndex].m_Name = inFactory.RegisterStr("category");
+ theEvent.m_Data[theIndex].m_Value.m_Type = QT3DSEventSystemEventTypesString;
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("kb");
+ ++theIndex;
+ theEvent.m_Data[theIndex].m_Name = inFactory.RegisterStr("code");
+ theEvent.m_Data[theIndex].m_Value.m_Type = QT3DSEventSystemEventTypesNumber;
+ theEvent.m_Data[theIndex].m_Value.m_Number = m_KeyCode;
+ ++theIndex;
+ theEvent.m_Data[theIndex].m_Name = inFactory.RegisterStr("action");
+ theEvent.m_Data[theIndex].m_Value.m_Type = QT3DSEventSystemEventTypesString;
+ if (m_KeyEvent == ON_KEYDOWN)
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("down");
+ else if (m_KeyEvent == ON_KEYUP)
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("up");
+ else if (m_KeyEvent == ON_KEYREPEAT)
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("repeat");
+ ++theIndex;
+ return &theEvent;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ INT32 m_KeyCode;
+ UINT32 m_KeyEvent;
+ };
+ struct SButtonEvent : public SEvent
+ {
+ SButtonEvent()
+ : SEvent(TYPE_BUTTON)
+ , m_ButtonCode(BUTTON_TOTAL_COUNT)
+ , m_ButtonEvent(0)
+ {
+ }
+ SButtonEvent(INT32 inButtonCode, UINT32 inButtonEvent)
+ : SEvent(TYPE_BUTTON)
+ , m_ButtonCode(inButtonCode)
+ , m_ButtonEvent(inButtonEvent)
+ {
+ }
+ SEvent *Clone() const override
+ {
+ return new SKeyboardEvent(this->m_ButtonCode, this->m_ButtonEvent);
+ }
+ Qt3DSEventSystemEvent *GenEventSystemEvent(qt3ds::evt::IEventFactory &inFactory) override
+ {
+ if (m_ButtonEvent == ON_BUTTONDOWN || m_ButtonEvent == ON_BUTTONUP
+ || m_ButtonEvent == ON_BUTTONREPEAT) {
+ Qt3DSEventSystemEvent &theEvent = inFactory.CreateEvent(3);
+ int theIndex = 0;
+ theEvent.m_Data[theIndex].m_Name = inFactory.RegisterStr("category");
+ theEvent.m_Data[theIndex].m_Value.m_Type = QT3DSEventSystemEventTypesString;
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("button");
+ ++theIndex;
+ theEvent.m_Data[theIndex].m_Name = inFactory.RegisterStr("code");
+ theEvent.m_Data[theIndex].m_Value.m_Type = QT3DSEventSystemEventTypesNumber;
+ theEvent.m_Data[theIndex].m_Value.m_Number = m_ButtonCode;
+ ++theIndex;
+ theEvent.m_Data[theIndex].m_Name = inFactory.RegisterStr("action");
+ theEvent.m_Data[theIndex].m_Value.m_Type = QT3DSEventSystemEventTypesString;
+ if (m_ButtonEvent == ON_BUTTONDOWN)
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("down");
+ else if (m_ButtonEvent == ON_BUTTONUP)
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("up");
+ else if (m_ButtonEvent == ON_BUTTONREPEAT)
+ theEvent.m_Data[theIndex].m_Value.m_String = inFactory.AllocateStr("repeat");
+ ++theIndex;
+ return &theEvent;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ INT32 m_ButtonCode;
+ UINT32 m_ButtonEvent;
+ };
+ size_t GetNextEvents(qt3ds::evt::IEventFactory &inFactory, Qt3DSEventSystemEvent **outBuffer,
+ size_t inBufLenInEvent) override
+ {
+ size_t theEventCount = 0;
+ while (!m_Events.empty() && inBufLenInEvent--) {
+ SEvent *theBufferedEvent = m_Events.front();
+ Qt3DSEventSystemEvent *theEventSystemEvent =
+ theBufferedEvent->GenEventSystemEvent(inFactory);
+ if (theEventSystemEvent)
+ outBuffer[theEventCount++] = theEventSystemEvent;
+ m_Events.pop_front();
+ }
+ return theEventCount;
+ }
+
+ void addRef() { ++m_RefCount; }
+
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0)
+ delete this;
+ }
+
+ void Release() override { release(); }
+
+ void AddEvent(const SEvent &inEvent)
+ {
+ SEvent *theEvent = inEvent.Clone();
+ if (theEvent)
+ m_Events.push_back(theEvent);
+ else
+ QT3DS_ASSERT(false);
+ }
+
+private:
+ eastl::list<SEvent *> m_Events;
+};
+
+//==============================================================================
+/**
+ * Constructor
+ */
+CInputEngine::CInputEngine()
+ : m_BeginPickInput(false)
+ , m_Application(NULL)
+ , m_InputEventProvider(NULL)
+{
+ m_InputFrame.m_PickValid = false;
+ m_InputFrame.m_PickX = 0;
+ m_InputFrame.m_PickY = 0;
+
+ // TODO: SK - To quickly restore functionality, but this is should be in tegra-specific project.
+ m_InputFrame.m_DeltaX = 0;
+ m_InputFrame.m_DeltaY = 0;
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CInputEngine::~CInputEngine()
+{
+}
+
+//==============================================================================
+/**
+ * Set the top-level interface of the Runtime object
+ * @param inRuntime the top-level interface of the Runtime object
+ */
+void CInputEngine::SetApplication(qt3ds::runtime::IApplication *inApplication)
+{
+ m_Application = inApplication;
+ // Create this here. If we die before the application does, then the system will crash unless
+ // the application event system is reponsibe for the keyboard provider. Since the provider
+ // never
+ // access back to this object, this is the most sensible relationship. Furthermore if we have
+ // never been given an application, it doesn't make sense to have a keyboard event provider.
+ // In reality, this entire system should be ref counted.
+ m_InputEventProvider = new CInputEventProvider();
+
+ // Add a ref for the event system because it does not add its own ref.
+ m_InputEventProvider->addRef();
+ m_Application->GetRuntimeFactory().GetEventSystem().AddProvider(*m_InputEventProvider);
+ MarkApplicationDirty();
+}
+
+//==============================================================================
+/**
+ * Get the input information for the current frame
+ * @return the SInputFrame that defines the current frame input information
+ */
+SInputFrame &CInputEngine::GetInputFrame()
+{
+ return m_InputFrame;
+}
+
+//==============================================================================
+/**
+ * Return the key input portion of the input frame.
+ */
+SKeyInputFrame &CInputEngine::GetKeyInputFrame()
+{
+ return m_InputFrame.m_KeyInputFrame;
+}
+
+void CInputEngine::BeginPickInput()
+{
+ m_PickInput.clear();
+ m_BeginPickInput = true;
+}
+
+//==============================================================================
+/**
+ * Set the pick information the the input frame structure
+ * @param inX the X value of the pick position
+ * @param inY the Y value of the pick position
+ * @param inValid whether the X and Y value are valid
+ */
+void CInputEngine::SetPickInput(FLOAT inX, FLOAT inY, BOOL inValid /*= true*/)
+{
+ m_InputFrame.m_PickValid = inValid;
+ m_InputFrame.m_PickX = inX;
+ m_InputFrame.m_PickY = inY;
+ m_InputFrame.m_MouseFlags = 0;
+ MarkApplicationDirty();
+ if (m_BeginPickInput && m_PickInput.size() < 1000)
+ m_PickInput.push_back(eastl::make_pair(inX, inY));
+}
+
+void CInputEngine::EndPickInput()
+{
+ m_BeginPickInput = false;
+}
+
+CInputEngine::TPickInputList CInputEngine::GetPickInput() const
+{
+ return qt3ds::foundation::toDataRef(m_PickInput.data(), m_PickInput.size());
+}
+
+//==============================================================================
+/**
+ * Set the mouse button state flag
+ * @param inFlags the current mouse state
+ */
+void CInputEngine::SetPickFlags(INT32 inFlags)
+{
+ m_InputFrame.m_MouseFlags |= inFlags;
+}
+
+//==============================================================================
+/**
+ * Set the keyboard status
+ * @param inKeyCode the identifier of the key
+ * @param inDown identify whether the key is down
+ */
+void CInputEngine::SetKeyState(INT32 inKeyCode, BOOL inDown)
+{
+ if (!inDown)
+ m_InputFrame.m_KeyInputFrame.m_KeyStates.erase(inKeyCode);
+ else {
+ SKeyInputFrame::MAP_KEYCODE_COUNT::iterator theIter =
+ m_InputFrame.m_KeyInputFrame.m_KeyStates.find(inKeyCode);
+ if (theIter == m_InputFrame.m_KeyInputFrame.m_KeyStates.end())
+ m_InputFrame.m_KeyInputFrame.m_KeyStates.insert(
+ eastl::make_pair<INT32, UINT16>(inKeyCode, 1));
+ else if (theIter->second < 255)
+ ++theIter->second;
+ }
+ MarkApplicationDirty();
+}
+
+//==============================================================================
+/**
+ * Set the button status
+ * @param inButtonCode the identifier of the button
+ * @param inDown identify whether the button is down
+ */
+void CInputEngine::SetButtonState(INT32 inButtonCode, BOOL inDown)
+{
+ if (!inDown)
+ m_InputFrame.m_ButtonStates.erase(inButtonCode);
+ else {
+ SInputFrame::MAP_BUTTONCODE_COUNT::iterator theIter =
+ m_InputFrame.m_ButtonStates.find(inButtonCode);
+ if (theIter == m_InputFrame.m_ButtonStates.end())
+ m_InputFrame.m_ButtonStates.insert(eastl::make_pair<INT32, UINT16>(inButtonCode, 1));
+ else if (theIter->second < 255)
+ ++theIter->second;
+ }
+ MarkApplicationDirty();
+}
+
+//==============================================================================
+/**
+ * Set the scroll value
+ * @param inMouseFlag flag to indicate whether this is a vertical or horizontal
+ *scroll
+ * @param inValue value of scroll performed
+ */
+void CInputEngine::SetScrollValue(INT32 inMouseFlag, INT16 inValue)
+{
+ m_InputFrame.m_MouseFlags = inMouseFlag;
+ m_InputFrame.m_ScrollValue = inValue;
+ MarkApplicationDirty();
+}
+//==============================================================================
+/**
+ * Set whether the keyboard is modified
+ * @param inFlag true if the keyboard status is modified
+ */
+void CInputEngine::SetModifierFlag(INT32 inFlag)
+{
+ m_InputFrame.m_KeyInputFrame.m_ModifierFlags |= inFlag;
+}
+
+// Currently unused
+//==============================================================================
+/**
+ * Converts KeyCode in index format to ASCII format.
+ * This will translate upper/lower-case letters too.
+ * @param inKeyCode the index format keycode
+ * @param inShift whether the shift button is pressed
+ * @return the ASCII format keycode
+ */
+// INT32 CInputEngine::ConvertKeyCode( INT32 inKeyCode, BOOL inShift )
+//{
+// static INT32 s_ASCIILowerCase[] =
+// {
+// 0,//KEY_NOKEY = 0x00,
+// 27,//KEY_ESCAPE,
+// '1',//KEY_1,
+// '2',//KEY_2,
+// '3',//KEY_3,
+// '4',//KEY_4,
+// '5',//KEY_5,
+// '6',//KEY_6,
+// '7',//KEY_7,
+// '8',//KEY_8,
+// '9',//KEY_9,
+// '0',//KEY_0,
+// '-',//KEY_MINUS, /* - on main keyboard */
+// '=',//KEY_EQUALS,
+// 8,//KEY_BACK, /* backspace */
+// '\t',//KEY_TAB,
+// 'q',//KEY_Q,
+// 'w',//KEY_W,
+// 'e',//KEY_E,
+// 'r',//KEY_R,
+// 't',//KEY_T,
+// 'y',//KEY_Y,
+// 'u',//KEY_U,
+// 'i',//KEY_I,
+// 'o',//KEY_O,
+// 'p',//KEY_P,
+// '[',//KEY_LBRACKET,
+// ']',//KEY_RBRACKET,
+// '\n',//KEY_RETURN, /* Enter on main keyboard */
+// 0,//KEY_LCONTROL,
+// 'a',//KEY_A,
+// 's',//KEY_S,
+// 'd',//KEY_D,
+// 'f',//KEY_F,
+// 'g',//KEY_G,
+// 'h',//KEY_H,
+// 'j',//KEY_J,
+// 'k',//KEY_K,
+// 'l',//KEY_L,
+// ';',//KEY_SEMICOLON,
+// '\'',//KEY_APOSTROPHE,
+// '`',//KEY_GRAVE, /* accent grave */
+// 0,//KEY_LSHIFT,
+// '\\',//KEY_BACKSLASH,
+// 'z',//KEY_Z,
+// 'x',//KEY_X,
+// 'c',//KEY_C,
+// 'v',//KEY_V,
+// 'b',//KEY_B,
+// 'n',//KEY_N,
+// 'm',//KEY_M,
+// ',',//KEY_COMMA,
+// '.',//KEY_PERIOD, /* . on main keyboard */
+// '/',//KEY_SLASH, /* / on main keyboard */
+// 0,//KEY_RSHIFT,
+// '*',//KEY_MULTIPLY, /* * on numeric keypad */
+// 0,//KEY_LMENU, /* left Alt */
+// ' ',//KEY_SPACE,
+// 0,//KEY_CAPITAL,
+// 0,//KEY_F1,
+// 0,//KEY_F2,
+// 0,//KEY_F3,
+// 0,//KEY_F4,
+// 0,//KEY_F5,
+// 0,//KEY_F6,
+// 0,//KEY_F7,
+// 0,//KEY_F8,
+// 0,//KEY_F9,
+// 0,//KEY_F10,
+// 0,//KEY_NUMLOCK,
+// 0,//KEY_SCROLL, /* Scroll Lock */
+// '7',//KEY_NUMPAD7,
+// '8',//KEY_NUMPAD8,
+// '9',//KEY_NUMPAD9,
+// '-',//KEY_SUBTRACT, /* - on numeric keypad */
+// '4',//KEY_NUMPAD4,
+// '5',//KEY_NUMPAD5,
+// '6',//KEY_NUMPAD6,
+// '+',//KEY_ADD, /* + on numeric keypad */
+// '1',//KEY_NUMPAD1,
+// '2',//KEY_NUMPAD2,
+// '3',//KEY_NUMPAD3,
+// '0',//KEY_NUMPAD0,
+// '.',//KEY_DECIMAL, /* . on numeric keypad */
+// 0,//KEY_OEM_102, /* <> or \| on RT 102-key keyboard (Non-U.S.) */
+// 0,//KEY_F11,
+// 0,//KEY_F12,
+// 0,//KEY_F13, /* (NEC PC98) */
+// 0,//KEY_F14, /* (NEC PC98) */
+// 0,//KEY_F15, /* (NEC PC98) */
+// 0,//KEY_KANA, /* (Japanese keyboard) */
+// 0,//KEY_ABNT_C1, /* /? on Brazilian keyboard */
+// 0,//KEY_CONVERT, /* (Japanese keyboard) */
+// 0,//KEY_NOCONVERT, /* (Japanese keyboard) */
+// 0,//KEY_YEN, /* (Japanese keyboard) */
+// 0,//KEY_ABNT_C2, /* Numpad . on Brazilian keyboard */
+// 0,//KEY_NUMPADEQUALS, /* = on numeric keypad (NEC PC98) */
+// 0,//KEY_PREVTRACK, /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */
+// 0,//KEY_AT, /* (NEC PC98) */
+// 0,//KEY_COLON, /* (NEC PC98) */
+// 0,//KEY_UNDERLINE, /* (NEC PC98) */
+// 0,//KEY_KANJI, /* (Japanese keyboard) */
+// 0,//KEY_STOP, /* (NEC PC98) */
+// 0,//KEY_AX, /* (Japan AX) */
+// 0,//KEY_UNLABELED, /* (J3100) */
+// 0,//KEY_NEXTTRACK, /* Next Track */
+// 0,//KEY_NUMPADENTER, /* Enter on numeric keypad */
+// 0,//KEY_RCONTROL,
+// 0,//KEY_MUTE, /* Mute */
+// 0,//KEY_CALCULATOR, /* Calculator */
+// 0,//KEY_PLAYPAUSE, /* Play / Pause */
+// 0,//KEY_MEDIASTOP, /* Media Stop */
+// 0,//KEY_VOLUMEDOWN, /* Volume - */
+// 0,//KEY_VOLUMEUP, /* Volume + */
+// 0,//KEY_WEBHOME, /* Web home */
+// 0,//KEY_NUMPADCOMMA, /* , on numeric keypad (NEC PC98) */
+// 0,//KEY_DIVIDE, /* / on numeric keypad */
+// 0,//KEY_SYSRQ,
+// 0,//KEY_RMENU, /* right Alt */
+// 0,//KEY_PAUSE, /* Pause */
+// 0,//KEY_HOME, /* Home on arrow keypad */
+// 0,//KEY_UP, /* UpArrow on arrow keypad */
+// 0,//KEY_PRIOR, /* PgUp on arrow keypad */
+// 0,//KEY_LEFT, /* LeftArrow on arrow keypad */
+// 0,//KEY_RIGHT, /* RightArrow on arrow keypad */
+// 0,//KEY_END, /* End on arrow keypad */
+// 0,//KEY_DOWN, /* DownArrow on arrow keypad */
+// 0,//KEY_NEXT, /* PgDn on arrow keypad */
+// 0,//KEY_INSERT, /* Insert on arrow keypad */
+// 127,//KEY_DELETE, /* Delete on arrow keypad */
+// 0,//KEY_LWIN, /* Left Windows key */
+// 0,//KEY_RWIN, /* Right Windows key */
+// 0,//KEY_APPS, /* AppMenu key */
+// 0,//KEY_POWER, /* System Power */
+// 0,//KEY_SLEEP, /* System Sleep */
+// 0,//KEY_WAKE, /* System Wake */
+// 0,//KEY_WEBSEARCH, /* Web Search */
+// 0,//KEY_WEBFAVORITES, /* Web Favorites */
+// 0,//KEY_WEBREFRESH, /* Web Refresh */
+// 0,//KEY_WEBSTOP, /* Web Stop */
+// 0,//KEY_WEBFORWARD, /* Web Forward */
+// 0,//KEY_WEBBACK, /* Web Back */
+// 0,//KEY_MYCOMPUTER, /* My Computer */
+// 0,//KEY_MAIL, /* Mail */
+// 0//KEY_MEDIASELECT, /* Media Select */
+// };
+//
+// static INT32 s_ASCIIUpperCase[] =
+// {
+// 0,//KEY_NOKEY = 0x00,
+// 27,//KEY_ESCAPE,
+// '!',//KEY_1,
+// '@',//KEY_2,
+// '#',//KEY_3,
+// '$',//KEY_4,
+// '%',//KEY_5,
+// '^',//KEY_6,
+// '&',//KEY_7,
+// '*',//KEY_8,
+// '(',//KEY_9,
+// ')',//KEY_0,
+// '_',//KEY_MINUS, /* - on main keyboard */
+// '+',//KEY_EQUALS,
+// 8,//KEY_BACK, /* backspace */
+// '\t',//KEY_TAB,
+// 'Q',//KEY_Q,
+// 'W',//KEY_W,
+// 'E',//KEY_E,
+// 'R',//KEY_R,
+// 'T',//KEY_T,
+// 'Y',//KEY_Y,
+// 'U',//KEY_U,
+// 'I',//KEY_I,
+// 'O',//KEY_O,
+// 'P',//KEY_P,
+// '{',//KEY_LBRACKET,
+// '}',//KEY_RBRACKET,
+// '\n',//KEY_RETURN, /* Enter on main keyboard */
+// 0,//KEY_LCONTROL,
+// 'A',//KEY_A,
+// 'S',//KEY_S,
+// 'D',//KEY_D,
+// 'F',//KEY_F,
+// 'G',//KEY_G,
+// 'H',//KEY_H,
+// 'J',//KEY_J,
+// 'K',//KEY_K,
+// 'L',//KEY_L,
+// ':',//KEY_SEMICOLON,
+// '\"',//KEY_APOSTROPHE,
+// '~',//KEY_GRAVE, /* accent grave */
+// 0,//KEY_LSHIFT,
+// '|',//KEY_BACKSLASH,
+// 'Z',//KEY_Z,
+// 'X',//KEY_X,
+// 'C',//KEY_C,
+// 'V',//KEY_V,
+// 'B',//KEY_B,
+// 'N',//KEY_N,
+// 'M',//KEY_M,
+// '<',//KEY_COMMA,
+// '>',//KEY_PERIOD, /* . on main keyboard */
+// '?',//KEY_SLASH, /* / on main keyboard */
+// 0,//KEY_RSHIFT,
+// '*',//KEY_MULTIPLY, /* * on numeric keypad */
+// 0,//KEY_LMENU, /* left Alt */
+// ' ',//KEY_SPACE,
+// 0,//KEY_CAPITAL,
+// 0,//KEY_F1,
+// 0,//KEY_F2,
+// 0,//KEY_F3,
+// 0,//KEY_F4,
+// 0,//KEY_F5,
+// 0,//KEY_F6,
+// 0,//KEY_F7,
+// 0,//KEY_F8,
+// 0,//KEY_F9,
+// 0,//KEY_F10,
+// 0,//KEY_NUMLOCK,
+// 0,//KEY_SCROLL, /* Scroll Lock */
+// '7',//KEY_NUMPAD7,
+// '8',//KEY_NUMPAD8,
+// '9',//KEY_NUMPAD9,
+// '-',//KEY_SUBTRACT, /* - on numeric keypad */
+// '4',//KEY_NUMPAD4,
+// '5',//KEY_NUMPAD5,
+// '6',//KEY_NUMPAD6,
+// '+',//KEY_ADD, /* + on numeric keypad */
+// '1',//KEY_NUMPAD1,
+// '2',//KEY_NUMPAD2,
+// '3',//KEY_NUMPAD3,
+// '0',//KEY_NUMPAD0,
+// '.',//KEY_DECIMAL, /* . on numeric keypad */
+// 0,//KEY_OEM_102, /* <> or \| on RT 102-key keyboard (Non-U.S.) */
+// 0,//KEY_F11,
+// 0,//KEY_F12,
+// 0,//KEY_F13, /* (NEC PC98) */
+// 0,//KEY_F14, /* (NEC PC98) */
+// 0,//KEY_F15, /* (NEC PC98) */
+// 0,//KEY_KANA, /* (Japanese keyboard) */
+// 0,//KEY_ABNT_C1, /* /? on Brazilian keyboard */
+// 0,//KEY_CONVERT, /* (Japanese keyboard) */
+// 0,//KEY_NOCONVERT, /* (Japanese keyboard) */
+// 0,//KEY_YEN, /* (Japanese keyboard) */
+// 0,//KEY_ABNT_C2, /* Numpad . on Brazilian keyboard */
+// 0,//KEY_NUMPADEQUALS, /* = on numeric keypad (NEC PC98) */
+// 0,//KEY_PREVTRACK, /* Previous Track (DIK_CIRCUMFLEX on Japanese keyboard) */
+// 0,//KEY_AT, /* (NEC PC98) */
+// 0,//KEY_COLON, /* (NEC PC98) */
+// 0,//KEY_UNDERLINE, /* (NEC PC98) */
+// 0,//KEY_KANJI, /* (Japanese keyboard) */
+// 0,//KEY_STOP, /* (NEC PC98) */
+// 0,//KEY_AX, /* (Japan AX) */
+// 0,//KEY_UNLABELED, /* (J3100) */
+// 0,//KEY_NEXTTRACK, /* Next Track */
+// 0,//KEY_NUMPADENTER, /* Enter on numeric keypad */
+// 0,//KEY_RCONTROL,
+// 0,//KEY_MUTE, /* Mute */
+// 0,//KEY_CALCULATOR, /* Calculator */
+// 0,//KEY_PLAYPAUSE, /* Play / Pause */
+// 0,//KEY_MEDIASTOP, /* Media Stop */
+// 0,//KEY_VOLUMEDOWN, /* Volume - */
+// 0,//KEY_VOLUMEUP, /* Volume + */
+// 0,//KEY_WEBHOME, /* Web home */
+// 0,//KEY_NUMPADCOMMA, /* , on numeric keypad (NEC PC98) */
+// 0,//KEY_DIVIDE, /* / on numeric keypad */
+// 0,//KEY_SYSRQ,
+// 0,//KEY_RMENU, /* right Alt */
+// 0,//KEY_PAUSE, /* Pause */
+// 0,//KEY_HOME, /* Home on arrow keypad */
+// 0,//KEY_UP, /* UpArrow on arrow keypad */
+// 0,//KEY_PRIOR, /* PgUp on arrow keypad */
+// 0,//KEY_LEFT, /* LeftArrow on arrow keypad */
+// 0,//KEY_RIGHT, /* RightArrow on arrow keypad */
+// 0,//KEY_END, /* End on arrow keypad */
+// 0,//KEY_DOWN, /* DownArrow on arrow keypad */
+// 0,//KEY_NEXT, /* PgDn on arrow keypad */
+// 0,//KEY_INSERT, /* Insert on arrow keypad */
+// 127,//KEY_DELETE, /* Delete on arrow keypad */
+// 0,//KEY_LWIN, /* Left Windows key */
+// 0,//KEY_RWIN, /* Right Windows key */
+// 0,//KEY_APPS, /* AppMenu key */
+// 0,//KEY_POWER, /* System Power */
+// 0,//KEY_SLEEP, /* System Sleep */
+// 0,//KEY_WAKE, /* System Wake */
+// 0,//KEY_WEBSEARCH, /* Web Search */
+// 0,//KEY_WEBFAVORITES, /* Web Favorites */
+// 0,//KEY_WEBREFRESH, /* Web Refresh */
+// 0,//KEY_WEBSTOP, /* Web Stop */
+// 0,//KEY_WEBFORWARD, /* Web Forward */
+// 0,//KEY_WEBBACK, /* Web Back */
+// 0,//KEY_MYCOMPUTER, /* My Computer */
+// 0,//KEY_MAIL, /* Mail */
+// 0//KEY_MEDIASELECT, /* Media Select */
+// };
+//
+// if ( inKeyCode < 0 || inKeyCode > KEY_TOTAL_COUNT )
+// return 0;
+//
+// if ( inShift )
+// return s_ASCIIUpperCase[inKeyCode];
+//
+// return s_ASCIILowerCase[inKeyCode];
+//}
+
+//==============================================================================
+/**
+ * Clear the current input frame data, typically after the event has been processed.
+ */
+void CInputEngine::ClearInputFrame()
+{
+ // TODO: SK - To quickly restore functionality, but this is should be in tegra-specific project.
+ m_InputFrame.m_PickValid = false;
+}
+
+//==============================================================================
+/**
+ * Can be more appropriately named and perhaps moved to a COutputEngine class.
+ * to translate event triggered from script back to a "device" event
+ * e.g to simulate clicking on Home button.
+ *
+ * Base class does nothing.
+ */
+BOOL CInputEngine::TranslateEvent(const CHAR *inEvent)
+{
+ Q3DStudio_UNREFERENCED_PARAMETER(inEvent);
+ return false;
+}
+
+//==============================================================================
+/**
+ * Handle firing of keyboard events when a scancode is received.
+ */
+void CInputEngine::HandleKeyboard(INT32 inKeyCode, INT32 inPressed, INT32 inRepeat)
+{
+ if (inKeyCode >= KEY_TOTAL_COUNT || inKeyCode <= KEY_NOKEY) {
+ qCDebug(qt3ds::TRACE_INFO)
+ << "Input: Key input out of range. key code: " << inKeyCode
+ << " pressed: " << inPressed << " repeat: " << inRepeat;
+ }
+ if (m_Application == NULL)
+ return;
+ MarkApplicationDirty();
+
+ SetKeyState(inKeyCode, inPressed ? true : false);
+
+ CPresentation *theActivePresentation(m_Application->GetPrimaryPresentation());
+ if (theActivePresentation) {
+ TElement *theScene = theActivePresentation->GetRoot();
+ UVariant theKeycode;
+ theKeycode.m_INT32 = inKeyCode;
+
+ TEventCommandHash theEvent;
+ if (inPressed) {
+ UINT16 theKeyCount = m_InputFrame.m_KeyInputFrame.GetKeyCount(inKeyCode);
+ QT3DS_ASSERT(theKeyCount >= 1);
+ if (theKeyCount == 1 && inRepeat == 0)
+ theEvent = ON_KEYDOWN;
+ else
+ theEvent = ON_KEYREPEAT;
+ } else {
+ theEvent = ON_KEYUP;
+ }
+
+ theActivePresentation->FireEvent(theEvent, theScene, &theKeycode, NULL, ATTRIBUTETYPE_INT32,
+ ATTRIBUTETYPE_NONE);
+ if (m_InputEventProvider)
+ m_InputEventProvider->AddEvent(
+ CInputEventProvider::SKeyboardEvent(theKeycode.m_INT32, theEvent));
+ }
+}
+
+//==============================================================================
+/**
+ * Handle button events.
+ */
+void CInputEngine::HandleButton(INT32 inButtonCode, INT32 inPressed, INT32 inRepeat)
+{
+ if (inButtonCode >= BUTTON_TOTAL_COUNT || inButtonCode < 0) {
+ qCDebug(qt3ds::TRACE_INFO)
+ << "Input: Key input out of range. key code: " << inButtonCode
+ << " pressed: " << inPressed << " repeat: " << inRepeat;
+ }
+ if (m_Application == NULL)
+ return;
+ MarkApplicationDirty();
+
+ SetButtonState(inButtonCode, inPressed ? true : false);
+
+ CPresentation *theActivePresentation(m_Application->GetPrimaryPresentation());
+ if (theActivePresentation) {
+ TElement *theScene = theActivePresentation->GetRoot();
+ UVariant theButtonCode;
+ theButtonCode.m_INT32 = inButtonCode;
+
+ TEventCommandHash theEvent;
+ if (inPressed) {
+ if (inRepeat == 0)
+ theEvent = ON_BUTTONDOWN;
+ else
+ theEvent = ON_BUTTONREPEAT;
+ } else {
+ theEvent = ON_BUTTONUP;
+ }
+
+ theActivePresentation->FireEvent(theEvent, theScene, &theButtonCode, NULL,
+ ATTRIBUTETYPE_INT32, ATTRIBUTETYPE_NONE);
+ if (m_InputEventProvider)
+ m_InputEventProvider->AddEvent(
+ CInputEventProvider::SButtonEvent(theButtonCode.m_INT32, theEvent));
+ }
+}
+
+//==============================================================================
+/**
+ * Handle joystick events.
+ */
+void CInputEngine::HandleAxis(INT32 inAxisCode, FLOAT inValue)
+{
+ if (m_Application == NULL)
+ return;
+ MarkApplicationDirty();
+ if (m_InputFrame.m_AxisStates[inAxisCode] != inValue) {
+ m_InputFrame.m_AxisStates[inAxisCode] = inValue;
+
+ CPresentation *theActivePresentation(m_Application->GetPrimaryPresentation());
+ if (theActivePresentation) {
+ TElement *theScene = theActivePresentation->GetRoot();
+ UVariant theAxisCode;
+ theAxisCode.m_INT32 = inAxisCode;
+ UVariant theValue;
+ theValue.m_FLOAT = inValue;
+
+ theActivePresentation->FireEvent(ON_AXISMOVED, theScene, &theAxisCode, &theValue,
+ ATTRIBUTETYPE_INT32, ATTRIBUTETYPE_FLOAT);
+ }
+ }
+}
+
+void CInputEngine::MarkApplicationDirty()
+{
+ if (m_Application)
+ m_Application->MarkApplicationDirty();
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSInputEngine.h b/src/runtime/Qt3DSInputEngine.h
new file mode 100644
index 0000000..bf75e5a
--- /dev/null
+++ b/src/runtime/Qt3DSInputEngine.h
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSKernelTypes.h"
+#include "Qt3DSPickFrame.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "EASTL/vector.h"
+#include "foundation/Qt3DSDataRef.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace qt3ds {
+namespace runtime {
+ class IApplication;
+}
+}
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class CRuntime;
+union UVariant;
+class CInputEventProvider;
+
+//==============================================================================
+/**
+* @class CInputEngine
+* @brief The basic input engine
+*/
+class CInputEngine
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ SInputFrame m_InputFrame; ///< The data describing the input state
+ eastl::vector<eastl::pair<float, float>> m_PickInput;
+ bool m_BeginPickInput;
+ qt3ds::runtime::IApplication *m_Application; ///< The Runtime object
+ qt3ds::foundation::NVScopedRefCounted<CInputEventProvider>
+ m_InputEventProvider; ///< The event provider for keyboard
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ typedef qt3ds::foundation::NVConstDataRef<const eastl::pair<float, float>> TPickInputList;
+ CInputEngine();
+ virtual ~CInputEngine();
+
+public: // Runtime interfaces
+ void SetApplication(qt3ds::runtime::IApplication *inApplication);
+
+public:
+ // Access
+ virtual SInputFrame &GetInputFrame();
+ virtual SKeyInputFrame &GetKeyInputFrame();
+
+ // Setters
+ // Multitouch is handled by using BeginPickInput, SetPickInput (several times), and EndPickInput
+ // pairs.
+ // The assumption here is that the pick input is static until changed. So to clear it you need
+ // a
+ // begin, end pair without any other pieces.
+ virtual void BeginPickInput();
+ virtual void SetPickInput(FLOAT inX, FLOAT inY, BOOL inValid = true);
+ virtual void EndPickInput();
+ virtual TPickInputList GetPickInput() const;
+ virtual void SetPickFlags(INT32 inFlags);
+ virtual void SetKeyState(INT32 inKeyCode, BOOL inDown);
+ virtual void SetButtonState(INT32 inButtonCode, BOOL inDown);
+ virtual void SetScrollValue(INT32 inFlags, INT16 value);
+ virtual void SetModifierFlag(INT32 inFlag);
+
+ // Keyboard hook
+ virtual void HandleKeyboard(INT32 inKeyCode, INT32 inPressed, INT32 inRepeat = 0);
+
+ // Other input
+ virtual void HandleButton(INT32 inButtonCode, INT32 inPressed, INT32 inRepeat = 0);
+ virtual void HandleAxis(INT32 inAxisCode, FLOAT inValue);
+
+ // Helpers
+ // virtual INT32 ConvertKeyCode( INT32 inKeyCode, BOOL inShift );
+ // TODO: SK - To quickly restore functionality, but this is should be in tegra-specific project.
+ virtual void ClearInputFrame();
+ virtual BOOL TranslateEvent(const CHAR *inEvent);
+
+ void MarkApplicationDirty();
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSInputEventTypes.h b/src/runtime/Qt3DSInputEventTypes.h
new file mode 100644
index 0000000..0b3c398
--- /dev/null
+++ b/src/runtime/Qt3DSInputEventTypes.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSHash.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+// Mouse events
+const TEventCommandHash ON_MOUSEOVER = CHash::HashEventCommand("onMouseOver");
+const TEventCommandHash ON_MOUSEOUT = CHash::HashEventCommand("onMouseOut");
+const TEventCommandHash ON_GROUPEDMOUSEOVER = CHash::HashEventCommand("onGroupedMouseOver");
+const TEventCommandHash ON_GROUPEDMOUSEOUT = CHash::HashEventCommand("onGroupedMouseOut");
+
+// Crude hack to pretend mouse events are gesture events, since gesture events are all you
+// can specify in studio.
+// TODO: Fix properly, preferably by bringing back gesture support
+const TEventCommandHash ON_MOUSEDOWN = CHash::HashEventCommand("onPressureDown");
+const TEventCommandHash ON_MOUSEUP = CHash::HashEventCommand("onPressureUp");
+const TEventCommandHash ON_MOUSECLICK = CHash::HashEventCommand("onTap");
+const TEventCommandHash ON_MOUSEDBLCLICK = CHash::HashEventCommand("onDoubleTap");
+//const TEventCommandHash ON_MOUSEDOWN = CHash::HashEventCommand("onMouseDown");
+//const TEventCommandHash ON_MOUSEUP = CHash::HashEventCommand("onMouseUp");
+//const TEventCommandHash ON_MOUSECLICK = CHash::HashEventCommand("onMouseClick");
+//const TEventCommandHash ON_MOUSEDBLCLICK = CHash::HashEventCommand("onMouseDblClick");
+
+const TEventCommandHash ON_MIDDLEMOUSEDOWN = CHash::HashEventCommand("onMiddleMouseDown");
+const TEventCommandHash ON_MIDDLEMOUSEUP = CHash::HashEventCommand("onMiddleMouseUp");
+const TEventCommandHash ON_MIDDLEMOUSECLICK = CHash::HashEventCommand("onMiddleMouseClick");
+const TEventCommandHash ON_MIDDLEDBLMOUSECLICK = CHash::HashEventCommand("onMiddleMouseDblClick");
+
+const TEventCommandHash ON_RIGHTMOUSEDOWN = CHash::HashEventCommand("onRightMouseDown");
+const TEventCommandHash ON_RIGHTMOUSEUP = CHash::HashEventCommand("onRightMouseUp");
+const TEventCommandHash ON_RIGHTMOUSECLICK = CHash::HashEventCommand("onRightMouseClick");
+const TEventCommandHash ON_RIGHTDBLMOUSECLICK = CHash::HashEventCommand("onRightMouseDblClick");
+
+const TEventCommandHash ON_HORIZONTALSCROLLWHEEL =
+ CHash::HashEventCommand("onHorizontalScrollWheel");
+const TEventCommandHash ON_VERTICALSCROLLWHEEL = CHash::HashEventCommand("onVerticalScrollWheel");
+
+const TEventCommandHash ON_KEYUP =
+ CHash::HashEventCommand("onKeyUp"); ///< Studio's keyboard event string
+const TEventCommandHash ON_KEYDOWN =
+ CHash::HashEventCommand("onKeyDown"); ///< Studio's keyboard event string
+const TEventCommandHash ON_KEYREPEAT =
+ CHash::HashEventCommand("onKeyRepeat"); ///< Studio's keyboard event string
+
+const TEventCommandHash ON_BUTTONUP = CHash::HashEventCommand("onButtonUp");
+const TEventCommandHash ON_BUTTONDOWN = CHash::HashEventCommand("onButtonDown");
+const TEventCommandHash ON_BUTTONREPEAT = CHash::HashEventCommand("onButtonRepeat");
+
+const TEventCommandHash ON_AXISMOVED = CHash::HashEventCommand("onAxisMoved");
+
+// Used by UIContract
+const TEventCommandHash ON_LEFT = CHash::HashEventCommand("onLeft");
+const TEventCommandHash ON_RIGHT = CHash::HashEventCommand("onRight");
+const TEventCommandHash ON_UP = CHash::HashEventCommand("onUp");
+const TEventCommandHash ON_DOWN = CHash::HashEventCommand("onDown");
+const TEventCommandHash ON_BACK = CHash::HashEventCommand("onBack");
+const TEventCommandHash ON_SELECT = CHash::HashEventCommand("onSelect");
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSInputFrame.h b/src/runtime/Qt3DSInputFrame.h
new file mode 100644
index 0000000..f80f3eb
--- /dev/null
+++ b/src/runtime/Qt3DSInputFrame.h
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSPlatformSpecific.h"
+#include "Qt3DSInputDefs.h"
+
+#include <EASTL/map.h>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Input structure defining the values for keyboard input
+ */
+struct SKeyInputFrame
+{
+ UINT16 m_ModifierFlags; ///< Keyboard modifier state flags
+ typedef eastl::map<INT32, UINT16> MAP_KEYCODE_COUNT;
+ MAP_KEYCODE_COUNT
+ m_KeyStates; ///< Keycode map representing number of frames since the keys are down
+ ///< 0 - up, 255 - down for more than 254 frames
+
+ SKeyInputFrame()
+ : m_ModifierFlags(MODIFIER_NONE)
+ {
+ }
+
+ UINT16 GetKeyCount(INT32 inKeyCode)
+ {
+ MAP_KEYCODE_COUNT::iterator theIter = m_KeyStates.find(inKeyCode);
+ return theIter != m_KeyStates.end() ? theIter->second : 0;
+ }
+};
+
+//==============================================================================
+/**
+ * Input structure defining the values fed into input processing
+ */
+struct SInputFrame
+{
+ SKeyInputFrame m_KeyInputFrame; ///< Data for keyboard input
+
+ typedef eastl::map<INT32, UINT16> MAP_BUTTONCODE_COUNT;
+ MAP_BUTTONCODE_COUNT m_ButtonStates;
+
+ FLOAT m_AxisStates[AXIS_TOTAL_COUNT];
+
+ FLOAT m_PickX; ///< Horizontal screen location
+ FLOAT m_PickY; ///< Vertical screen location
+
+ INT32 m_MouseFlags; ///< Mouse button state flags
+
+ // SK - gesture-specific variables should NOT be in core runtime, its tegra-specific
+ INT32 m_GestureID; ///< a running counter/unique-id
+ INT32 m_GestureKind; ///< Gesture state flags
+
+ /* different gestures will interpret as different values. could be:
+ * DRAG: delta position
+ * FLICK: velocities
+ * ZOOM: second finger or quantized delta */
+ INT16 m_DeltaX;
+ INT16 m_DeltaY;
+
+ BOOL m_PickValid; ///< X and Y are valid inputs
+ INT16 m_ScrollValue; //< Value of scrollwheel scrolled
+
+ CHAR m_Padding[1];
+
+ SInputFrame()
+ : m_PickX(0)
+ , m_PickY(0)
+ , m_MouseFlags(NO_INPUT)
+ , m_GestureID(0)
+ , m_GestureKind(0)
+ , m_DeltaX(0)
+ , m_DeltaY(0)
+ , m_PickValid(false)
+ {
+ Q3DStudio_memset(m_AxisStates, 0, sizeof(m_AxisStates));
+ }
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSKernelTypes.h b/src/runtime/Qt3DSKernelTypes.h
new file mode 100644
index 0000000..0ad4ec6
--- /dev/null
+++ b/src/runtime/Qt3DSKernelTypes.h
@@ -0,0 +1,225 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSArray.h"
+
+namespace qt3ds {
+namespace runtime {
+ namespace element {
+ struct SElement;
+ struct SComponent;
+ }
+}
+}
+
+namespace Q3DStudio {
+typedef qt3ds::runtime::element::SElement TElement;
+typedef qt3ds::runtime::element::SComponent TComponent;
+}
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class CString;
+
+//==============================================================================
+// Typedefs
+//==============================================================================
+typedef CArray<TElement *> TElementList; ///< Dynamic list of CElements
+typedef CArray<const CString *> TEventList; ///< Dynamic list of CStrings
+typedef CArray<INT32> TAssociationList; ///< Dynamic list of IDs used for the association process
+
+typedef UINT32 TEventCommandHash; ///< Value from CHash::Hash31
+typedef UINT32 TStringHash; ///< Value from CHash::Hash
+typedef UINT32 TAttributeHash; ///< Value from CHash::Hash27
+typedef UINT32 THashValue; ///< 32 bit value indicating a hash
+
+//==============================================================================
+// Enumerations
+//==============================================================================
+
+/// Each attribute knows the type of its value and uses 4 bits for this enum
+enum EAttributeType {
+ ATTRIBUTETYPE_NONE = 0,
+ ATTRIBUTETYPE_INT32,
+ ATTRIBUTETYPE_HASH,
+ ATTRIBUTETYPE_FLOAT,
+ ATTRIBUTETYPE_BOOL,
+ ATTRIBUTETYPE_STRING,
+ ATTRIBUTETYPE_POINTER,
+ ATTRIBUTETYPE_ELEMENTREF,
+ ATTRIBUTETYPE_DATADRIVEN_PARENT,
+ ATTRIBUTETYPE_DATADRIVEN_CHILD,
+ ATTRIBUTETYPE_FLOAT4,
+ ATTRIBUTETYPE_FLOAT3,
+ ATTRIBUTETYPE_FLOAT2,
+ ATTRIBUTETYPE_DATAINPUT_TIMELINE,
+ ATTRIBUTETYPE_DATAINPUT_SLIDE,
+ ATTRIBUTETYPECOUNT
+};
+
+/// Elements represent various types of objects
+enum EElementType {
+ ELEMENTTYPE_UNKNOWN = 0,
+ ELEMENTTYPE_NODE,
+ ELEMENTTYPE_CAMERA,
+ ELEMENTTYPE_LIGHT,
+ ELEMENTTYPE_TEXT,
+ ELEMENTTYPE_MATERIAL,
+ ELEMENTTYPE_TEXTURE,
+ ELEMENTTYPE_COMPONENT,
+ ELEMENTTYPE_BEHAVIOR,
+ ELEMENTTYPE_PATH,
+ ELEMENTTYPE_PATHANCHORPOINT,
+ ELEMENTTYPE_SUBPATH,
+ ELEMENTTYPECOUNT
+};
+
+//==============================================================================
+// Enumerations
+//==============================================================================
+
+/// Various bit flags packed into a single 16bit space.
+enum EElementFlag {
+ // Persistent flags (set only at creation)
+ ELEMENTFLAG_COMPONENT = 1, ///< Element is a component
+ ELEMENTFLAG_TIMELINE = 1 << 1, ///< Element has start time and duration attributes
+ ELEMENTFLAG_CLONE = 1 << 2, ///< Element is a clone
+ ELEMENTFLAG_ATTRIBUTELOCK =
+ 1 << 3, ///< No more attributes can be added (always true during runtime)
+
+ // Configuration flags (seldom changed)
+ ELEMENTFLAG_SCRIPTCALLBACKS = 1
+ << 4, ///< At least one script has requested notify on onActivate, onDeactivate, onUpdate
+ ELEMENTFLAG_SCRIPTINITIALIZE = 1
+ << 5, ///< At least one script has requested notify on onInitialize
+ ELEMENTFLAG_REGISTEREDFORATTRIBUTECHANGE = 1 << 6, ///< Element monitored for attribute change
+ ELEMENTFLAG_REGISTEREDFOREVENTCALLBACK = 1 << 7, ///< Element registered for event callbacks
+ ELEMENTFLAG_PICKENABLED = 1 << 8, ///< At least one script or action has registered for mouse
+ ///events based on this element
+
+ // Runtime flags
+ ELEMENTFLAG_GLOBALACTIVE =
+ 1 << 9, ///< Combination active flag based on explicit, time and parent active
+ ELEMENTFLAG_EXPLICITACTIVE = 1 << 10, ///< Explicit On/Off switch on each element
+ ELEMENTFLAG_PLAYTHROUGH = 1 << 11, ///< Playthrough slides enabled if this is a component
+ ELEMENTFLAG_DIRTY = 1 << 12, ///< Attributes or user visible flags have changed
+
+ // Flags used by the activation manager
+ ELEMENTFLAG_AMGR_TIMEACTIVE = 1 << 13, ///< Is the element alive according to time information
+};
+
+// Four byte aligned time unit structure.
+struct SAlignedTimeUnit
+{
+ UINT32 m_LowWord;
+ UINT32 m_HighWord;
+
+ SAlignedTimeUnit() {}
+ SAlignedTimeUnit(const TTimeUnit &inUnit);
+ SAlignedTimeUnit(const SAlignedTimeUnit &inOther)
+ : m_LowWord(inOther.m_LowWord)
+ , m_HighWord(inOther.m_HighWord)
+ {
+ }
+ SAlignedTimeUnit &operator=(const SAlignedTimeUnit &inOther)
+ {
+ m_LowWord = inOther.m_LowWord;
+ m_HighWord = inOther.m_HighWord;
+ return *this;
+ }
+ operator TTimeUnit() const;
+
+ void operator-=(const TTimeUnit &inTime);
+ void operator%=(const TTimeUnit &inTime);
+};
+
+//==============================================================================
+// Defines
+//==============================================================================
+#define Q3DStudio_ATTRIBUTEKEYBITS 26 /* Number of bits to store attributes index */
+#define Q3DStudio_ATTRIBUTEKEYMASK 0x03ffffff /* Bit mask covering 26 bits */
+
+//==============================================================================
+// Structs
+//==============================================================================
+
+/// Each element has a number of attributes associated with it - This is the key.
+struct SAttributeKey
+{
+ TAttributeHash m_Hash : Q3DStudio_ATTRIBUTEKEYBITS; ///< hash of attribute name
+ TAttributeHash m_Type : 4; ///< Attribute type such as INT32, FLOAT, STRING
+ TAttributeHash m_Dirty : 1; ///< Dirty bit signalling that the attribute value has been modified
+ TAttributeHash
+ m_DontOptimize : 1; ///< Used by the exporter/optimizer to flag attributes as un-optimizable
+
+ void Convert(const UINT32 &inKey)
+ {
+ m_Hash = inKey & Q3DStudio_ATTRIBUTEKEYMASK;
+ m_Type = (inKey & 0x3c000000) >> Q3DStudio_ATTRIBUTEKEYBITS;
+ m_Dirty = (inKey & 0x40000000) >> (Q3DStudio_ATTRIBUTEKEYBITS + 4);
+ m_DontOptimize = (inKey & 0x80000000) >> (Q3DStudio_ATTRIBUTEKEYBITS + 5);
+ }
+};
+
+/// The structure to store a memory pool for clones.
+/// The actual data pool will start at the address after these 8 bytes.
+struct SClone
+{
+ SClone *m_Next; ///< Pointer to the next block of memory
+ UINT32 m_Size; ///< Size of the current block of memory
+};
+
+//==============================================================================
+// Unions
+//==============================================================================
+
+/// Each element has a number of attributes associated with it - This is the value.
+union UVariant {
+ INT32 m_INT32; // Integer representation
+ FLOAT m_FLOAT; // Float representation
+ THashValue m_Hash; // Explicit hash representation
+ UINT32 m_StringHandle; // Handle into the IStringTable member of the presentation
+ void *m_VoidPointer; // Generic data Pointer
+ UINT32 m_ElementHandle; // Element handle. Resolve using IApplication object.
+ FLOAT m_FLOAT3[3]; // Vector 3 representation
+ FLOAT m_FLOAT4[4]; // Vector 4 representation
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSLogicSystem.cpp b/src/runtime/Qt3DSLogicSystem.cpp
new file mode 100644
index 0000000..4a8341b
--- /dev/null
+++ b/src/runtime/Qt3DSLogicSystem.cpp
@@ -0,0 +1,293 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "RuntimePrefix.h"
+#include "Qt3DSLogicSystem.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSApplication.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/IOStreams.h"
+
+using namespace qt3ds::runtime;
+using namespace qt3ds::foundation;
+using namespace qt3ds;
+using namespace qt3ds::runtime::element;
+
+namespace {
+struct SLogicKey
+{
+ QT3DSU32 m_ElementHandle;
+ Q3DStudio::TEventCommandHash m_CommandHash;
+ SLogicKey(QT3DSU32 hdl = 0, Q3DStudio::TEventCommandHash hash = 0)
+ : m_ElementHandle(hdl)
+ , m_CommandHash(hash)
+ {
+ }
+
+ bool operator==(const SLogicKey &other) const
+ {
+ return m_ElementHandle == other.m_ElementHandle && m_CommandHash == other.m_CommandHash;
+ }
+ size_t hash() const
+ {
+ return eastl::hash<QT3DSU32>()(m_ElementHandle) ^ eastl::hash<QT3DSU32>()((QT3DSU32)m_CommandHash);
+ }
+};
+
+struct SLogicData
+{
+ SLogicData *m_NextLogicData;
+ QT3DSU32 m_Owner;
+ QT3DSU32 m_Target;
+ Q3DStudio::TEventCommandHash m_Type;
+ Q3DStudio::UVariant m_Arg1;
+ Q3DStudio::UVariant m_Arg2;
+ QT3DSI32 m_Id;
+ bool m_Active;
+
+ SLogicData()
+ : m_NextLogicData(NULL)
+ , m_Owner(0)
+ , m_Target(0)
+ , m_Type(0)
+ , m_Id(0)
+ , m_Active(false)
+ {
+ m_Arg1.m_INT32 = 0;
+ m_Arg2.m_INT32 = 0;
+ }
+
+ SLogicData(QT3DSU32 owner, QT3DSU32 target, Q3DStudio::TEventCommandHash type, Q3DStudio::UVariant a1,
+ Q3DStudio::UVariant a2, bool active, QT3DSI32 inId)
+ : m_NextLogicData(NULL)
+ , m_Owner(owner)
+ , m_Target(target)
+ , m_Type(type)
+ , m_Arg1(a1)
+ , m_Arg2(a2)
+ , m_Id(inId)
+ , m_Active(active)
+ {
+ }
+};
+
+DEFINE_INVASIVE_SINGLE_LIST(LogicData);
+IMPLEMENT_INVASIVE_SINGLE_LIST(LogicData, m_NextLogicData);
+}
+
+namespace eastl {
+template <>
+struct hash<SLogicKey>
+{
+ size_t operator()(const SLogicKey &inKey) const { return inKey.hash(); }
+};
+}
+
+namespace {
+
+struct SLogicSystem : public ILogicSystem
+{
+ typedef nvhash_map<SLogicKey, TLogicDataList> TLogicKeyHash;
+ typedef nvhash_map<QT3DSI32, SLogicKey> TIdLogicKeyHash;
+ typedef Pool<SLogicData, ForwardingAllocator> TLogicDataPool;
+
+ NVFoundationBase &m_Foundation;
+
+ TLogicKeyHash m_LogicKeys;
+ TIdLogicKeyHash m_IdToLogicKeys;
+ TLogicDataPool m_LogicDataPool;
+ QT3DSI32 m_NextId;
+ NVDataRef<QT3DSU8> m_LoadData;
+
+ QT3DSI32 m_RefCount;
+
+ SLogicSystem(NVFoundationBase &inFoundation)
+ : m_Foundation(inFoundation)
+ , m_LogicKeys(inFoundation.getAllocator(), "m_LogicKeys")
+ , m_IdToLogicKeys(inFoundation.getAllocator(), "m_IdToLogicKeys")
+ , m_LogicDataPool(ForwardingAllocator(inFoundation.getAllocator(), "m_LogicDataPool"))
+ , m_NextId(1)
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Foundation.getAllocator());
+ NVDelete(alloc, this);
+ }
+ }
+ void IncrementNextId()
+ {
+ ++m_NextId;
+ if (m_NextId == 0)
+ ++m_NextId;
+ }
+ static QT3DSU32 GetHandle(element::SElement *elem)
+ {
+ if (elem)
+ return elem->GetHandle();
+ return 0;
+ }
+ // returns the action id
+ QT3DSI32 AddAction(element::SElement &inTrigger,
+ Q3DStudio::TEventCommandHash inEventNameHash,
+ element::SElement *inTarget, element::SElement *inOwner,
+ Q3DStudio::TEventCommandHash inType, Q3DStudio::UVariant inArg1,
+ Q3DStudio::UVariant inArg2, bool inActive) override
+ {
+ SLogicKey theKey(inTrigger.GetHandle(), inEventNameHash);
+ eastl::pair<TLogicKeyHash::iterator, bool> inserter =
+ m_LogicKeys.insert(eastl::make_pair(theKey, TLogicDataList()));
+
+ eastl::pair<TIdLogicKeyHash::iterator, bool> idInserter;
+ for (idInserter = m_IdToLogicKeys.insert(eastl::make_pair(m_NextId, theKey));
+ idInserter.second == false;
+ idInserter = m_IdToLogicKeys.insert(eastl::make_pair(m_NextId, theKey))) {
+ IncrementNextId();
+ }
+ IncrementNextId();
+
+ SLogicData *theData = m_LogicDataPool.construct(__FILE__, __LINE__);
+ *theData = SLogicData(GetHandle(inOwner), GetHandle(inTarget), inType, inArg1, inArg2,
+ inActive, idInserter.first->first);
+ inserter.first->second.push_back(*theData);
+ return idInserter.first->first;
+ }
+
+ void OnEvent(Q3DStudio::TEventCommandHash inEventName, element::SElement &inTarget,
+ Q3DStudio::IPresentation &inPresentation) const override
+ {
+ SLogicKey theKey(inTarget.GetHandle(), inEventName);
+ TLogicKeyHash::const_iterator iter = m_LogicKeys.find(theKey);
+ if (iter != m_LogicKeys.end()) {
+ qt3ds::runtime::IApplication &theApplication = inPresentation.GetApplication();
+ qt3ds::runtime::IElementAllocator &theElemAllocator =
+ theApplication.GetElementAllocator();
+ for (TLogicDataList::const_iterator listIter = iter->second.begin(),
+ endIter = iter->second.end();
+ listIter != endIter; ++listIter) {
+ if (listIter->m_Active) {
+ inPresentation.FireCommand(
+ listIter->m_Type, theElemAllocator.FindElementByHandle(listIter->m_Target),
+ &listIter->m_Arg1, &listIter->m_Arg2);
+ }
+ }
+ }
+ }
+
+ void SetActive(QT3DSI32 inActionIndex, bool inActive, IElementAllocator &inElemAllocator) override
+ {
+ TIdLogicKeyHash::iterator iter = m_IdToLogicKeys.find(inActionIndex);
+ if (iter != m_IdToLogicKeys.end()) {
+ TLogicKeyHash::iterator logicIter = m_LogicKeys.find(iter->second);
+ if (logicIter != m_LogicKeys.end()) {
+ for (TLogicDataList::iterator listIter = logicIter->second.begin(),
+ listEnd = logicIter->second.end();
+ listIter != listEnd; ++listIter)
+ if (listIter->m_Id == inActionIndex) {
+ listIter->m_Active = inActive;
+ if (IApplication::isPickingEvent(logicIter->first.m_CommandHash)) {
+ SElement *theElement = inElemAllocator.FindElementByHandle(
+ logicIter->first.m_ElementHandle);
+ if (theElement && inActive)
+ theElement->SetFlag(Q3DStudio::ELEMENTFLAG_PICKENABLED, true);
+ }
+ }
+ }
+ }
+ }
+
+ void SaveBinaryData(qt3ds::foundation::IOutStream &ioStream) override
+ {
+ qt3ds::foundation::SWriteBuffer theWriter(m_Foundation.getAllocator(), "WriteBuffer");
+ theWriter.write(m_NextId);
+ theWriter.write((QT3DSU32)m_LogicKeys.size());
+ for (TLogicKeyHash::iterator iter = m_LogicKeys.begin(), end = m_LogicKeys.end();
+ iter != end; ++iter) {
+ if (iter->second.m_Head == NULL)
+ continue;
+
+ theWriter.write(iter->first);
+ QT3DSU32 datumOffset = theWriter.size();
+ theWriter.write((QT3DSU32)0);
+ QT3DSU32 datumCount = 0;
+ for (SLogicData *theDatum = iter->second.m_Head; theDatum;
+ theDatum = theDatum->m_NextLogicData, ++datumCount) {
+ theWriter.write(*theDatum);
+ }
+ QT3DSU32 *countPtr = reinterpret_cast<QT3DSU32 *>(theWriter.begin() + datumOffset);
+ *countPtr = datumCount;
+ }
+ ioStream.Write(theWriter.begin(), theWriter.size());
+ }
+
+ void LoadBinaryData(NVDataRef<QT3DSU8> inLoadData) override
+ {
+ m_LoadData = inLoadData;
+ SDataReader theReader(inLoadData.begin(), inLoadData.end());
+ m_NextId = *theReader.Load<QT3DSI32>();
+ QT3DSU32 numKeys = *theReader.Load<QT3DSU32>();
+ for (QT3DSU32 idx = 0, end = numKeys; idx < end; ++idx) {
+ SLogicKey theKey = *theReader.Load<SLogicKey>();
+ QT3DSU32 numActions = *theReader.Load<QT3DSU32>();
+ if (numActions == 0)
+ continue;
+
+ TLogicKeyHash::iterator inserter =
+ m_LogicKeys.insert(eastl::make_pair(theKey, TLogicDataList())).first;
+ SLogicData *lastDatum = NULL;
+ for (QT3DSU32 actIdx = 0, actEnd = numActions; actIdx < actEnd; ++actIdx) {
+ SLogicData *nextDatum = theReader.Load<SLogicData>();
+ if (lastDatum == NULL)
+ inserter->second.m_Head = nextDatum;
+ else
+ lastDatum->m_NextLogicData = nextDatum;
+ lastDatum = nextDatum;
+ m_IdToLogicKeys.insert(eastl::make_pair(nextDatum->m_Id, theKey));
+ }
+ if (lastDatum)
+ lastDatum->m_NextLogicData = NULL;
+ }
+ }
+};
+}
+
+ILogicSystem &ILogicSystem::CreateLogicSystem(NVFoundationBase &inFnd)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), SLogicSystem)(inFnd);
+}
diff --git a/src/runtime/Qt3DSLogicSystem.h b/src/runtime/Qt3DSLogicSystem.h
new file mode 100644
index 0000000..af13c91
--- /dev/null
+++ b/src/runtime/Qt3DSLogicSystem.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_LOGIC_SYSTEM_H
+#define QT3DS_LOGIC_SYSTEM_H
+#include "Qt3DSElementSystem.h"
+
+namespace qt3ds {
+namespace runtime {
+
+ class ILogicSystem : public NVRefCounted
+ {
+ public:
+ // returns the action id
+ virtual QT3DSI32 AddAction(element::SElement &inTrigger,
+ Q3DStudio::TEventCommandHash inEventNameHash,
+ element::SElement *inTarget, element::SElement *inOwner,
+ Q3DStudio::TEventCommandHash inType, Q3DStudio::UVariant inArg1,
+ Q3DStudio::UVariant inArg2, bool inActive) = 0;
+
+ virtual void OnEvent(Q3DStudio::TEventCommandHash inEventName, element::SElement &inTarget,
+ Q3DStudio::IPresentation &inPresentation) const = 0;
+ virtual void SetActive(QT3DSI32 inActionIndex, bool inActive,
+ IElementAllocator &inElemAllocator) = 0;
+
+ virtual void SaveBinaryData(qt3ds::foundation::IOutStream &ioStream) = 0;
+ virtual void LoadBinaryData(NVDataRef<QT3DSU8> inLoadData) = 0;
+
+ static ILogicSystem &CreateLogicSystem(NVFoundationBase &inFnd);
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/runtime/Qt3DSOutputMemoryStream.cpp b/src/runtime/Qt3DSOutputMemoryStream.cpp
new file mode 100644
index 0000000..06d0eee
--- /dev/null
+++ b/src/runtime/Qt3DSOutputMemoryStream.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSOutputMemoryStream.h"
+#include "Qt3DSHash.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * XXX
+ */
+COutputMemoryStream::COutputMemoryStream()
+{
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+COutputMemoryStream::~COutputMemoryStream()
+{
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+void COutputMemoryStream::Reset()
+{
+ m_Data.clear();
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+COutputMemoryStream &COutputMemoryStream::operator<<(const COutputMemoryStream &inStream)
+{
+ size_t theSize = inStream.m_Data.size();
+ for (size_t theCount = 0; theCount < theSize; ++theCount)
+ m_Data.push_back(inStream.m_Data[theCount]);
+ return *this;
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+void COutputMemoryStream::WriteStringHash(const CHAR *inItem)
+{
+ TStringHash theHash = CHash::HashString(inItem);
+ // DEBUG
+ //{FILE*fp=fopen("hashed.txt","a");if(fp){fprintf(fp,"%ul %s\n",theHash,inItem);fclose(fp);}}
+ operator<<(theHash);
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+void COutputMemoryStream::WriteEventCommandHash(const CHAR *inItem)
+{
+ TStringHash theHash = CHash::HashEventCommand(inItem);
+ // DEBUG
+ //{FILE*fp=fopen("hashed.txt","a");if(fp){fprintf(fp,"%ul %s\n",theHash,inItem);fclose(fp);}}
+ operator<<(theHash);
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+COutputMemoryStream &COutputMemoryStream::operator<<(const std::string &inString)
+{
+ const UINT8 *thePtr = reinterpret_cast<const UINT8 *>(inString.c_str());
+ for (size_t theCounter = 0; theCounter < inString.size(); ++theCounter) {
+ m_Data.push_back(*thePtr);
+ ++thePtr;
+ }
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+COutputMemoryStream &COutputMemoryStream::operator<<(const EAttributeType inType)
+{
+ UINT8 theType = static_cast<UINT8>(inType);
+ m_Data.push_back(theType);
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+UINT32 COutputMemoryStream::GetSize() const
+{
+ return static_cast<UINT32>(m_Data.size());
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+const UINT8 *COutputMemoryStream::GetData() const
+{
+ return &m_Data[0];
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSOutputMemoryStream.h b/src/runtime/Qt3DSOutputMemoryStream.h
new file mode 100644
index 0000000..da28245
--- /dev/null
+++ b/src/runtime/Qt3DSOutputMemoryStream.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSHash.h"
+#ifdef _WIN32
+#pragma warning(push)
+#pragma warning(disable : 4820) // X bytes padding added after data member
+#pragma warning( \
+ disable : 4061) // enumerator X in switch of enum Y is not explicitly handled by a case label
+#pragma warning(disable : 4062) // enumerator X in switch of enum Y is not handled
+#pragma warning(disable : 4548) // xlocale warnings
+#pragma warning( \
+ disable : 4738) // storing 32-bit float result in memory, possible loss of performance
+#endif
+#include <vector>
+#include <map>
+#include <set>
+#include <string>
+
+#ifdef _WIN32
+#pragma warning(pop)
+#endif
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Class
+//==============================================================================
+class COutputMemoryStream
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+public:
+ std::vector<UINT8> m_Data;
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ COutputMemoryStream();
+ virtual ~COutputMemoryStream();
+
+public: // Access
+ void Reset();
+ UINT32 GetSize() const;
+ const UINT8 *GetData() const;
+
+public: // Output
+ void WriteStringHash(const CHAR *inItem);
+ void WriteEventCommandHash(const CHAR *inItem);
+
+public: // Operators
+ COutputMemoryStream &operator<<(const COutputMemoryStream &inStream);
+ COutputMemoryStream &operator<<(const std::string &inString);
+ COutputMemoryStream &operator<<(const EAttributeType inType);
+
+ //==============================================================================
+ // Template Methods
+ //==============================================================================
+public:
+ template <typename T>
+ COutputMemoryStream &operator<<(const T &inItem)
+ {
+ size_t theSize = sizeof(T);
+ const UINT8 *thePtr = reinterpret_cast<const UINT8 *>(&inItem);
+ for (size_t theCounter = 0; theCounter < theSize; ++theCounter) {
+ m_Data.push_back(*thePtr);
+ ++thePtr;
+ }
+ return *this;
+ }
+
+ template <typename T>
+ void SetData(const T &inItem, UINT32 inByteOffset)
+ {
+ UINT8 *theSourcePtr = &m_Data[inByteOffset];
+ size_t theSize = sizeof(T);
+ const UINT8 *thePtr = reinterpret_cast<const UINT8 *>(&inItem);
+ for (size_t theCounter = 0; theCounter < theSize; ++theCounter) {
+ *theSourcePtr = *thePtr;
+ ++thePtr;
+ ++theSourcePtr;
+ }
+ }
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSParametersSystem.cpp b/src/runtime/Qt3DSParametersSystem.cpp
new file mode 100644
index 0000000..84b642c
--- /dev/null
+++ b/src/runtime/Qt3DSParametersSystem.cpp
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+#include "Qt3DSParametersSystem.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSIndexableLinkedList.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/IOStreams.h"
+
+using namespace qt3ds::runtime;
+
+namespace {
+
+struct SParameterGroup
+{
+ enum {
+ NumParametersPerGroup = 4,
+ };
+ TIdValuePair m_Data[NumParametersPerGroup];
+ SParameterGroup *m_NextNode;
+
+ SParameterGroup()
+ : m_NextNode(NULL)
+ {
+ }
+};
+
+struct SParameterGroupEntry
+{
+ QT3DSU32 m_ParameterCount;
+ SParameterGroup *m_FirstGroup;
+ SParameterGroupEntry()
+ : m_ParameterCount(0)
+ , m_FirstGroup(NULL)
+ {
+ }
+};
+
+typedef IndexableLinkedList<SParameterGroup, TIdValuePair, SParameterGroup::NumParametersPerGroup>
+ TParametersList;
+
+struct SParamSystem : public IParametersSystem
+{
+ typedef nvhash_map<QT3DSI32, SParameterGroupEntry> TIdGroupHash;
+
+ NVFoundationBase &m_Foundation;
+ TParametersList::TPoolType m_ParametersPool;
+ TIdGroupHash m_Groups;
+ QT3DSI32 m_NextId;
+ NVDataRef<QT3DSU8> m_LoadData;
+ QT3DSI32 m_RefCount;
+
+ SParamSystem(NVFoundationBase &fnd)
+ : m_Foundation(fnd)
+ , m_ParametersPool(ForwardingAllocator(fnd.getAllocator(), "ParametersPool"))
+ , m_Groups(fnd.getAllocator(), "m_Groups")
+ , m_NextId(1)
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc = m_Foundation.getAllocator();
+ NVDelete(alloc, this);
+ }
+ }
+
+ void IncrementId()
+ {
+ ++m_NextId;
+ if (!m_NextId)
+ ++m_NextId;
+ }
+
+ QT3DSI32 CreateParameterGroup() override
+ {
+ eastl::pair<TIdGroupHash::iterator, bool> inserter =
+ m_Groups.insert(eastl::make_pair(m_NextId, SParameterGroupEntry()));
+ while (inserter.second == false) {
+ IncrementId();
+ inserter = m_Groups.insert(eastl::make_pair(m_NextId, SParameterGroupEntry()));
+ }
+ return inserter.first->first;
+ }
+
+ void AddParameter(QT3DSI32 inGroup, QT3DSU32 inNameHash, Q3DStudio::UVariant inParam) override
+ {
+ TIdGroupHash::iterator iter = m_Groups.find(inGroup);
+ if (iter == m_Groups.end()) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ SParameterGroupEntry &theEntry(iter->second);
+ TIdValuePair &thePair = TParametersList::Create(
+ theEntry.m_FirstGroup, theEntry.m_ParameterCount, m_ParametersPool);
+ thePair = eastl::make_pair(inNameHash, inParam);
+ }
+
+ QT3DSU32 GetNumParameters(QT3DSI32 inGroup) const override
+ {
+ TIdGroupHash::const_iterator iter = m_Groups.find(inGroup);
+ if (iter == m_Groups.end()) {
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ const SParameterGroupEntry &theEntry(iter->second);
+ return theEntry.m_ParameterCount;
+ }
+ TIdValuePair GetParameter(QT3DSI32 inGroup, QT3DSU32 inIndex) const override
+ {
+ Q3DStudio::UVariant dummyValue;
+ dummyValue.m_INT32 = 0;
+ TIdValuePair retval = TIdValuePair(0, dummyValue);
+
+ TIdGroupHash::const_iterator iter = m_Groups.find(inGroup);
+ if (iter == m_Groups.end()) {
+ QT3DS_ASSERT(false);
+ return retval;
+ }
+
+ const SParameterGroupEntry &theEntry(iter->second);
+
+ if (inIndex < theEntry.m_ParameterCount)
+ return TParametersList::GetObjAtIdx(theEntry.m_FirstGroup, inIndex);
+
+ QT3DS_ASSERT(false);
+ return retval;
+ }
+};
+}
+
+IParametersSystem &IParametersSystem::CreateParametersSystem(NVFoundationBase &fnd)
+{
+ return *QT3DS_NEW(fnd.getAllocator(), SParamSystem)(fnd);
+}
diff --git a/src/runtime/Qt3DSParametersSystem.h b/src/runtime/Qt3DSParametersSystem.h
new file mode 100644
index 0000000..50a4652
--- /dev/null
+++ b/src/runtime/Qt3DSParametersSystem.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_PARAMETERS_SYSTEM_H
+#define QT3DS_PARAMETERS_SYSTEM_H
+#pragma once
+#include "Qt3DSKernelTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "EASTL/utility.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace foundation {
+ class IOutStream;
+}
+}
+
+namespace qt3ds {
+namespace runtime {
+ using namespace qt3ds;
+ using namespace qt3ds::foundation;
+
+ typedef eastl::pair<QT3DSU32, Q3DStudio::UVariant> TIdValuePair;
+
+ class IParametersSystem : public NVRefCounted
+ {
+ public:
+ virtual QT3DSI32 CreateParameterGroup() = 0;
+ virtual void AddParameter(QT3DSI32 inGroup, QT3DSU32 inNameHash, Q3DStudio::UVariant inParam) = 0;
+
+ virtual QT3DSU32 GetNumParameters(QT3DSI32 inGroupId) const = 0;
+ virtual TIdValuePair GetParameter(QT3DSI32 inGroupId, QT3DSU32 inIndex) const = 0;
+
+ static IParametersSystem &CreateParametersSystem(NVFoundationBase &inFoundation);
+ };
+}
+}
+
+#endif
diff --git a/src/runtime/Qt3DSPickFrame.h b/src/runtime/Qt3DSPickFrame.h
new file mode 100644
index 0000000..15da72c
--- /dev/null
+++ b/src/runtime/Qt3DSPickFrame.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSInputFrame.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class IPresentation;
+
+//==============================================================================
+/**
+ * Reporting structure describing a complete mouse pick including initial
+ * mouse XY screen position, which element was hit, UV point of hit, global
+ * intersection point and more.
+ */
+struct SPickFrame
+{
+ SInputFrame m_InputFrame; ///< Input values to process
+
+ FLOAT m_PickOrigin[3]; ///< 3D pick ray start
+ FLOAT m_PickDirection[3]; ///< 3D pick ray direction
+
+ FLOAT m_LocalHit[2]; ///< 2D pick ray intersection
+ FLOAT m_SquaredDistance; ///< Distance from camera to intersection
+ TElement *m_Model; ///< Element picked
+ // IPresentation* m_SubPresentation; ///< The picked element has a subpresentation
+
+ BOOL m_ResultValid; ///< Model found - Whole structure is valid
+ INT8 m_Unused[3]; ///< Padding
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSPresentation.cpp b/src/runtime/Qt3DSPresentation.cpp
new file mode 100644
index 0000000..0792119
--- /dev/null
+++ b/src/runtime/Qt3DSPresentation.cpp
@@ -0,0 +1,841 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSPresentation.h"
+#include "Qt3DSCommandEventTypes.h"
+#include "Qt3DSIScriptBridge.h"
+#include "Qt3DSInputEventTypes.h"
+#include "Qt3DSDataLogger.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSRuntimeFactory.h"
+#include "Qt3DSCommandHelper.h"
+#include "Qt3DSActivationManager.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSComponentManager.h"
+#include "Qt3DSRenderBufferLoader.h"
+#include "Qt3DSSlideSystem.h"
+#include "Qt3DSLogicSystem.h"
+#include "Qt3DSParametersSystem.h"
+#include "Qt3DSApplication.h"
+
+#include <QtCore/qfileinfo.h>
+#include <QtGui/qvector4d.h>
+#include <QtGui/qvector3d.h>
+#include <QtGui/qvector2d.h>
+
+namespace Q3DStudio {
+
+// Maximum number of Event/Command that can be queued in an Update cycle
+const INT32 Q3DStudio_EVENTCOMMANDQUEUECAPACITY = 512;
+
+// Limit to prevent infinite loop during queue processing
+const INT32 Q3DStudio_MAXEVENTCOMMANDLOOPCOUNT = Q3DStudio_EVENTCOMMANDQUEUECAPACITY * 10;
+
+#ifdef WIN32
+#pragma warning(push)
+#pragma warning(disable : 4355)
+#endif
+
+CPresentation::CPresentation(const QString &inName, const QString &projectPath,
+ qt3ds::runtime::IApplication *inApplication)
+ : m_Name(inName)
+ , m_Application(inApplication)
+ , m_Scene(nullptr)
+ , m_ActivityZone(nullptr)
+ , m_RootElement(nullptr)
+ , m_EventCommandQueue(Q3DStudio_EVENTCOMMANDQUEUECAPACITY, "EventCommandQueue")
+ , m_IsProcessingEventCommandQueue(false)
+ , m_ComponentManager(*this)
+ , m_Offset(0)
+ , m_LocalTime(0)
+ , m_PreviousGlobalTime(-1)
+ , m_Paused(false)
+ , m_OffsetInvalid(true)
+ , m_Active(true)
+{
+ m_projectPath = QFileInfo(projectPath).absoluteFilePath();
+ m_Size.m_Width = 0;
+ m_Size.m_Height = 0;
+ m_Size.m_ScaleMode = SCALEMODE_UNKNOWN;
+ m_AnimationSystem = IAnimationSystem::CreateAnimationSystem(
+ inApplication->GetRuntimeFactoryCore().GetFoundation());
+ m_SlideSystem =
+ ISlideSystem::CreateSlideSystem(inApplication->GetRuntimeFactoryCore().GetFoundation(),
+ inApplication->GetRuntimeFactoryCore().GetStringTable(),
+ inApplication->GetElementAllocator());
+ m_LogicSystem =
+ ILogicSystem::CreateLogicSystem(inApplication->GetRuntimeFactoryCore().GetFoundation());
+ m_ParametersSystem = IParametersSystem::CreateParametersSystem(
+ inApplication->GetRuntimeFactoryCore().GetFoundation());
+}
+#ifdef _WIN32
+#pragma warning(pop)
+#endif
+
+CPresentation::~CPresentation()
+{
+}
+
+/**
+ * Registers an element for notification when events fired on it.
+ * @param inElement target element to monitor
+ * @param inEventHash event hash to register for
+ * @param inCallback static callback function
+ * @param inContextData arbitrary data pointer
+ */
+void CPresentation::RegisterEventCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData)
+{
+ m_EventCallbacks.RegisterCallback(inElement, inEventHash, inCallback, inContextData);
+ inElement->SetFlag(ELEMENTFLAG_REGISTEREDFOREVENTCALLBACK, true);
+
+ if (qt3ds::runtime::IApplication::isPickingEvent(inEventHash))
+ inElement->SetFlag(ELEMENTFLAG_PICKENABLED, true);
+}
+
+/**
+ * Unregisters a previously registered event callback.
+ * @param inElement target element to monitor
+ * @param inEventHash event hash to register for
+ * @param inCallback static callback function
+ * @param inContextData arbitrary data pointer
+ */
+BOOL CPresentation::UnregisterEventCallback(TElement *inElement,
+ const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData)
+{
+ BOOL theLast = false;
+ BOOL theResult = m_EventCallbacks.UnregisterCallback(inElement, inEventHash, inCallback,
+ inContextData, theLast);
+
+ // Unflag element if there are no longer any callbacks on it
+ if (theLast)
+ inElement->SetFlag(ELEMENTFLAG_REGISTEREDFOREVENTCALLBACK, false);
+
+ if (qt3ds::runtime::IApplication::isPickingEvent(inEventHash))
+ inElement->SetFlag(ELEMENTFLAG_PICKENABLED, false);
+
+ return theResult;
+}
+
+void CPresentation::ClearDirtyList()
+{
+ FOR_ARRAY(TElement *, theElement, GetFrameData().GetDirtyList())
+ {
+ (*theElement)->Flags().SetDirty(false);
+ }
+ GetFrameData().Reset();
+}
+
+inline void ConvertActivityZoneBufferToElementList(qt3ds::runtime::TActivityItemBuffer inSource,
+ TElementList &outResult)
+{
+ for (qt3ds::QT3DSU32 idx = 0, end = inSource.size(); idx < end; ++idx)
+ outResult.Push(inSource[idx].first);
+}
+
+void CPresentation::PreUpdate(const TTimeUnit inGlobalTime)
+{
+ if (m_OffsetInvalid || m_Paused) {
+ m_OffsetInvalid = false;
+ m_Offset = m_LocalTime - inGlobalTime;
+ } else
+ m_LocalTime = inGlobalTime + m_Offset;
+
+ // Event/Command Processing Stage
+ ProcessEventCommandQueue();
+}
+
+/**
+ * Update the presentation to the current time. This will start triggering the
+ * various stages of the presentation frame rhythm
+ * @param inGlobalTime time at which to update each presentation
+ * @return true if there were events to be processed.
+ */
+void CPresentation::BeginUpdate()
+{
+ // Active Scan Stage
+ if (m_ActivityZone) {
+ m_ActivityZone->BeginUpdate(
+ m_LocalTime, m_Application->GetRuntimeFactory().GetPerfTimer(),
+ m_Application->GetRuntimeFactory().GetQt3DSRenderContext().GetThreadPool());
+ }
+}
+
+void CPresentation::EndUpdate()
+{
+ if (m_ActivityZone) {
+ m_ActivityZone->EndUpdate();
+ CPresentationFrameData &theFrameData = GetFrameData();
+ ConvertActivityZoneBufferToElementList(m_ActivityZone->GetActivatedItems(),
+ theFrameData.GetActivationList());
+ ConvertActivityZoneBufferToElementList(m_ActivityZone->GetDeactivatedItems(),
+ theFrameData.GetDeactivationList());
+ ConvertActivityZoneBufferToElementList(m_ActivityZone->GetScriptItems(),
+ theFrameData.GetScriptsList());
+ }
+
+ if (!m_Paused) {
+ // Animation Track Evaluation Stage
+ m_AnimationSystem->Update();
+ }
+ // Presentation is considered ready to accept external commands when the first frame property
+ // updates are done.
+ if (!m_presentationReady) {
+ m_SignalProxy.SigPresentationReady();
+ m_presentationReady = true;
+ }
+}
+
+void CPresentation::PostUpdate(const TTimeUnit inGlobalTime)
+{
+ if (!m_Paused) {
+ // Callback Stage
+ if (m_Application && m_PreviousGlobalTime != inGlobalTime)
+ m_Application->GetRuntimeFactoryCore().GetScriptEngineQml().ProcessFrameCallbacks(this);
+ }
+
+ m_PreviousGlobalTime = inGlobalTime;
+}
+
+void CPresentation::NotifyDataOutputs()
+{
+ if (m_pathToDataOutMap.size() == 0)
+ return;
+
+ // Based on the dirty list, check if we need to fire DataOutput notifications
+ Q3DStudio::TElementList &dirtyList = GetFrameData().GetDirtyList();
+ for (int idx = 0, end = dirtyList.GetCount(); idx < end; ++idx) {
+ Q3DStudio::TElement &element = *dirtyList[idx];
+ if (m_pathToDataOutMap.contains(element.m_Path)) {
+ auto outDefIter = m_pathToDataOutMap.find(element.m_Path);
+
+ while (outDefIter != m_pathToDataOutMap.end() && outDefIter.key() == element.m_Path) {
+ qt3ds::runtime::DataOutputDef &outDef = outDefIter.value();
+
+ // Get current value
+ Q3DStudio::UVariant value;
+ qt3ds::QT3DSU32 attribHash
+ = CHash::HashAttribute(outDef.observedAttribute.attributeName[0]);
+ element.GetAttribute(attribHash, value);
+ QVariant qvar;
+ switch (outDef.observedAttribute.propertyType) {
+ case ATTRIBUTETYPE_INT32:
+ qvar.setValue(value.m_INT32);
+ break;
+ case ATTRIBUTETYPE_FLOAT:
+ qvar.setValue(value.m_FLOAT);
+ break;
+ case ATTRIBUTETYPE_BOOL:
+ qvar.setValue(value.m_INT32);
+ break;
+ case ATTRIBUTETYPE_STRING:
+ qvar.setValue(QString::fromUtf8(
+ GetStringTable().HandleToStr(value.m_StringHandle).c_str()));
+ break;
+ case ATTRIBUTETYPE_FLOAT4: {
+ QVector4D qvalue(value.m_FLOAT4[0], value.m_FLOAT4[1],
+ value.m_FLOAT4[2], value.m_FLOAT4[3]);
+ qvar.setValue(qvalue);
+ }
+ break;
+ case ATTRIBUTETYPE_FLOAT3: {
+ QVector3D qvalue(value.m_FLOAT3[0], value.m_FLOAT3[1], value.m_FLOAT3[2]);
+ qvar.setValue(qvalue);
+ }
+ break;
+ case ATTRIBUTETYPE_FLOAT2: {
+ QVector2D qvalue(value.m_FLOAT3[0], value.m_FLOAT3[1]);
+ qvar.setValue(qvalue);
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (qvar.isValid() && (outDef.value != qvar)) {
+ outDef.value.setValue(qvar);
+ m_SignalProxy.SigDataOutputValueUpdated(outDef.name, outDef.value);
+ }
+
+ ++outDefIter;
+ }
+ }
+ }
+}
+
+void CPresentation::AddToDataOutputMap(const QHash<qt3ds::foundation::CRegisteredString,
+ qt3ds::runtime::DataOutputDef> &doMap)
+{
+ if (doMap.size() > 0)
+ m_pathToDataOutMap.unite(doMap);
+}
+
+/**
+ * Process the Event/Command queue completely
+ * PostEventCommand is the method that will add new Event/Command to the queue.
+ *
+ * The contract for Event/Command processing:
+ * 1. If an Event or Command is posted during the processing stage, it will be added
+ * to the end of the queue and is guaranteed to be processed in the current cycle.
+ * For example, if an Event (which is processed) triggers a Command to set a model to red,
+ * the model will turn red in the current frame.
+ *
+ * 2. If an Event or Command is posted after the processing stage, such as during the
+ * Callback stage, it will only be processed on the next Update cycle.
+ * For example, if the "turn mode to red" Command is posted in a script callback, the
+ * model will turn red in the next frame.
+ *
+ * 3. If an Event or Command is posted before the processing stage, for example an
+ * external Event posted just before the Update cycle, it will be processed in the current
+ *cycle.
+ * For example, if the "turn mode to red" Command is posted from the game engine prior to
+ * the Update cycle, the model will turn red in the current frame.
+ *
+ * @see PostEventCommand
+ * @return true if there were events that were processed.
+ */
+BOOL CPresentation::ProcessEventCommandQueue()
+{
+ PerfLogGeneralEvent2(DATALOGGER_PROCESSEVENTS);
+
+ m_IsProcessingEventCommandQueue = true;
+
+ BOOL theResult = !m_EventCommandQueue.IsEmpty();
+ INT32 theEventProcessedCount = 0;
+ while (!m_EventCommandQueue.IsEmpty()) {
+ SEventCommand &theEventCommand = m_EventCommandQueue.Top();
+ if (theEventCommand.m_IsEvent)
+ ProcessEvent(theEventCommand, theEventProcessedCount);
+ else
+ ProcessCommand(theEventCommand);
+
+ // Infinite-loop check
+ if (theEventProcessedCount > Q3DStudio_MAXEVENTCOMMANDLOOPCOUNT) {
+ // Breakout policy: Dump remaining Event/Commands
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "ProcessEventCommandQueue exceeded maximum loop count"
+ << "Remaining Event/Commands will be cleared. Event count: "
+ << theEventProcessedCount << "Limit: " << Q3DStudio_MAXEVENTCOMMANDLOOPCOUNT;
+ m_EventCommandQueue.Clear();
+ } else {
+ m_EventCommandQueue.Pop();
+ }
+ }
+
+ m_IsProcessingEventCommandQueue = false;
+
+ return theResult;
+}
+
+/**
+ * Pass incoming event to event consumers immediately
+ * @param ioEvent the incoming event
+ */
+void CPresentation::ProcessEvent(SEventCommand &ioEvent, INT32 &ioEventCount)
+{
+ if (ioEventCount < Q3DStudio_MAXEVENTCOMMANDLOOPCOUNT) {
+ ++ioEventCount;
+ PerfLogPresentationEvent1(DATALOGGER_PROCESSEVENT);
+
+ // Callbacks can change ioEvent's bubbling flags
+ if (ioEvent.m_Target->GetFlag(ELEMENTFLAG_REGISTEREDFOREVENTCALLBACK)) {
+ m_EventCallbacks.FireCallbacks(ioEvent);
+ }
+
+ // Do an early return if callback do a "stopImmediatePropagation"
+ if (ioEvent.m_Done)
+ return;
+
+ if (ioEvent.m_Target) {
+ // Logic should not be able to change ioEvent's bubbling flags
+ // ...or can it?
+ m_LogicSystem->OnEvent(ioEvent.m_Type, *ioEvent.m_Target, *this);
+ }
+
+ ProcessEventBubbling(ioEvent, ioEventCount);
+ }
+}
+
+/**
+ * Handle event bubbling
+ * @param ioEvent the incoming event
+ */
+void CPresentation::ProcessEventBubbling(SEventCommand &ioEvent, INT32 &ioEventCount)
+{
+ PerfLogPresentationEvent1(DATALOGGER_PROCESSEVENTBUBBLING);
+
+ // Check for onGroupedMouseOver/Out
+ // arg1 = the original onMouseOut model and arg2 = the original onMouseOver model
+ if (ioEvent.m_Type == ON_MOUSEOUT) {
+ // If original onMouseOver model is nullptr or not a descendent, fire onGroupedMouseOut
+ TElement *theMouseOverModel = static_cast<TElement *>(ioEvent.m_Arg2.m_VoidPointer);
+ if (!theMouseOverModel || !ioEvent.m_Target->IsDescendent(*theMouseOverModel)) {
+ SEventCommand theEvent = ioEvent;
+ theEvent.m_Type = ON_GROUPEDMOUSEOUT;
+ theEvent.m_BubbleUp = 0; // no bubbling
+ theEvent.m_BubbleDown = 0;
+ FireEvent(theEvent);
+ }
+ // set the original onMouseOver model to the target to make IsDescendent queries less
+ // expensive
+ else if (theMouseOverModel) {
+ ioEvent.m_Arg2.m_VoidPointer = ioEvent.m_Target;
+ }
+ } else if (ioEvent.m_Type == ON_MOUSEOVER) {
+ // If original onMouseOut model is nullptr or not a descendent, fire onGroupedMouseOver
+ TElement *theMouseOutModel = static_cast<TElement *>(ioEvent.m_Arg1.m_VoidPointer);
+ if (!theMouseOutModel || !ioEvent.m_Target->IsDescendent(*theMouseOutModel)) {
+ SEventCommand theEvent = ioEvent;
+ theEvent.m_Type = ON_GROUPEDMOUSEOVER;
+ theEvent.m_BubbleUp = 0; // no bubbling
+ theEvent.m_BubbleDown = 0;
+ FireEvent(theEvent);
+ }
+ // set the original onMouseOut model to the target to make IsDescendent queries less
+ // expensive
+ else if (theMouseOutModel) {
+ ioEvent.m_Arg1.m_VoidPointer = ioEvent.m_Target;
+ }
+ }
+
+ // Do NOT bubble up onSlideEnter and onSlideExit events from current component to its parent
+ // scene
+ // since each component has its own slides.
+ if (ioEvent.m_BubbleUp && (ioEvent.m_Target->Flags() & ELEMENTFLAG_COMPONENT)
+ && (ioEvent.m_Type == EVENT_ONSLIDEENTER || ioEvent.m_Type == EVENT_ONSLIDEEXIT)) {
+ ioEvent.m_BubbleUp = FALSE;
+ }
+
+ // Event bubbling
+ if (ioEvent.m_BubbleUp) {
+ TElement *theParent = ioEvent.m_Target->m_Parent;
+ if (theParent) {
+ ioEvent.m_Target = theParent;
+ ProcessEvent(ioEvent, ioEventCount);
+ }
+ }
+}
+
+/**
+ * Execute command immediately
+ * @param inCommand incoming command structure
+ */
+void CPresentation::ProcessCommand(const SEventCommand &inCommand)
+{
+ PerfLogPresentationEvent1(DATALOGGER_PROCESSCOMMAND);
+
+ // Attributes (Arg1 = key, Arg2 = value)
+ if (inCommand.m_Type == COMMAND_SETPROPERTY) {
+ SAttributeKey theAttributeKey;
+ UINT32 theHash = static_cast<UINT32>(inCommand.m_Arg1.m_Hash);
+ theAttributeKey.Convert(
+ theHash); // Need this conversion to prevent problems arising due to endianess
+ inCommand.m_Target->SetAttribute(theAttributeKey.m_Hash, inCommand.m_Arg2);
+
+ // Events (Arg1 = hashed event name)
+ } else if (inCommand.m_Type == COMMAND_FIREEVENT) {
+ FireEvent(inCommand.m_Arg1.m_Hash, inCommand.m_Target);
+
+ // Time (Arg1 = time)
+ } else if (inCommand.m_Type == COMMAND_PLAY) {
+ GetComponentManager().SetPause(inCommand.m_Target, false);
+ } else if (inCommand.m_Type == COMMAND_PAUSE) {
+ GetComponentManager().SetPause(inCommand.m_Target, true);
+ } else if (inCommand.m_Type == COMMAND_GOTOTIME) {
+ GetComponentManager().GoToTime(inCommand.m_Target, inCommand.m_Arg1.m_INT32);
+
+ // Slide (Arg1 = slide index or slide name)
+ } else if (inCommand.m_Type == COMMAND_GOTOSLIDE) {
+ // Goto slide commands are handled differently.
+ IComponentManager &theManager(GetComponentManager());
+ Q3DStudio::SComponentGotoSlideData theGotoSlideData =
+ theManager.GetComponentGotoSlideCommand(inCommand.m_Target);
+ if (theGotoSlideData.m_Slide > 0)
+ theManager.GotoSlideIndex(inCommand.m_Target, theGotoSlideData);
+
+ theManager.ReleaseComponentGotoSlideCommand(inCommand.m_Target);
+ } else if (inCommand.m_Type == COMMAND_GOTOSLIDENAME) {
+ GetComponentManager().GotoSlideName(inCommand.m_Target, inCommand.m_Arg1.m_Hash);
+ } else if (inCommand.m_Type == COMMAND_GOTONEXTSLIDE) {
+ GetComponentManager().GoToNextSlide(inCommand.m_Target);
+ } else if (inCommand.m_Type == COMMAND_GOTOPREVIOUSSLIDE) {
+ GetComponentManager().GoToPreviousSlide(inCommand.m_Target);
+ } else if (inCommand.m_Type == COMMAND_BACKSLIDE) {
+ GetComponentManager().GoToBackSlide(inCommand.m_Target);
+
+ // Behavior
+ } else if (inCommand.m_Type == COMMAND_CUSTOMACTION) {
+ m_Application->GetRuntimeFactoryCore().GetScriptEngineQml()
+ .ProcessCustomActions(this, inCommand);
+ } else if (inCommand.m_Type == COMMAND_CUSTOMCALLBACK) {
+ m_Application->GetRuntimeFactoryCore().GetScriptEngineQml().ProcessCustomCallback(
+ this, inCommand);
+ } else if (inCommand.m_Type == COMMAND_PLAYSOUND) {
+ CRegisteredString theSoundPathReg = GetStringTable().HandleToStr(inCommand.m_Arg1.m_INT32);
+ if (theSoundPathReg.IsValid()) {
+ const char *theSoundPath = theSoundPathReg.c_str();
+ if (strlen(theSoundPath) > 0) {
+ m_Application->GetRuntimeFactoryCore().GetScriptEngineQml().PlaySoundFile(
+ theSoundPath);
+ }
+ }
+ } else if (inCommand.m_Type == COMMAND_EMITSIGNAL) {
+ CRegisteredString nameStr = GetStringTable().HandleToStr(inCommand.m_Arg1.m_INT32);
+ m_Application->GetRuntimeFactoryCore().GetScriptEngineQml().ProcessSignal(this, inCommand);
+ QString path = QString::fromLatin1(inCommand.m_Target->m_Path.c_str());
+ QString name = QString::fromLatin1(nameStr.c_str());
+ signalProxy()->SigCustomSignal(path, name);
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION) << "Command not implemented: " << inCommand.m_Type;
+ }
+}
+
+/**
+ * Put an Event in the queue to be processed later during the Event/Command
+ * processing stage in Update
+ * This method is used by Event-bubbling during ProcessEvent
+ *
+ * @param inEvent the incoming event
+ * @see PostEvent
+ */
+void CPresentation::FireEvent(const SEventCommand &inEvent)
+{
+ SEventCommand &theEventCommand = m_EventCommandQueue.NewEntry();
+
+ theEventCommand = inEvent;
+
+ theEventCommand.m_IsEvent = true;
+}
+
+/**
+ * Put an Event in the queue to be processed later during the Event/Command
+ * processing stage in Update See ProcessEventCommandQueue for more
+ * information on the contract for Event/Command processing.
+ *
+ * @param inEventType the incoming event type
+ * @param inTarget the target for the event
+ * @param inArg1 optional argument #1
+ * @param inArg2 optional argument #2
+ * @param inType1 optional type for argument #1
+ * @param inType2 optional type for argument #2
+ * @see ProcessEventCommandQueue
+ * @see PostEventCommand
+ */
+void CPresentation::FireEvent(const TEventCommandHash inEventType, TElement *inTarget,
+ const UVariant *inArg1, const UVariant *inArg2,
+ const EAttributeType inType1, const EAttributeType inType2)
+{
+
+ SEventCommand theEvent = { inTarget, inEventType };
+
+ theEvent.m_IsEvent = true;
+ theEvent.m_BubbleUp = true;
+
+ theEvent.m_Arg1Type = static_cast<UINT8>(inType1);
+ theEvent.m_Arg2Type = static_cast<UINT8>(inType2);
+
+ if (inArg1)
+ theEvent.m_Arg1 = *inArg1;
+ if (inArg2)
+ theEvent.m_Arg2 = *inArg2;
+
+ m_EventCommandQueue.NewEntry() = theEvent;
+}
+
+/**
+ * Put a Command in the queue to be processed later during the Event/Command
+ * processing stage in Update. See ProcessEventCommandQueue for more information
+ * on the contract for Event/Command processing.
+ *
+ * For cases where the Commands need to be synchronized with the Frame-Rhythm
+ * An example would be calling "SetSlide" in scripts.
+ *
+ * @see ProcessEventCommandQueue
+ * @see PostEventCommand
+ * @param inEventType the incoming command type
+ * @param inTarget the target for the command
+ * @param inArg1 optional argument #1
+ * @param inArg2 optional argument #2
+ * @param inType1 optional type for argument #1
+ * @param inType2 optional type for argument #2
+ */
+void CPresentation::FireCommand(const TEventCommandHash inEventType, TElement *inTarget,
+ const UVariant *inArg1, const UVariant *inArg2,
+ const EAttributeType inType1, const EAttributeType inType2)
+{
+ // Pre-filter gotoslidename commands.
+ if (inEventType == COMMAND_GOTOSLIDENAME) {
+ int theSlideHashName = inArg1->m_INT32;
+ TComponent *theComponent = GetComponentManager().GetComponent(inTarget);
+ UINT8 theSlideIndex = GetSlideSystem().FindSlide(*theComponent, theSlideHashName);
+ // Translate into a slide index command.
+ CCommandHelper::SetupGotoSlideCommand(*inTarget, theSlideIndex,
+ SScriptEngineGotoSlideArgs());
+ } else {
+ SEventCommand theCommand = { inTarget, inEventType };
+
+ theCommand.m_Arg1Type = static_cast<UINT8>(inType1);
+ theCommand.m_Arg2Type = static_cast<UINT8>(inType2);
+
+ if (inArg1)
+ theCommand.m_Arg1 = *inArg1;
+ if (inArg2)
+ theCommand.m_Arg2 = *inArg2;
+
+ m_EventCommandQueue.NewEntry() = theCommand;
+ }
+}
+
+void CPresentation::FlushEventCommandQueue(void)
+{
+ if (!m_IsProcessingEventCommandQueue)
+ ProcessEventCommandQueue();
+}
+
+void CPresentation::ProcessEvent(SEventCommand &inEvent)
+{
+ INT32 theEventProcessedCount = 0;
+ ProcessEvent(inEvent, theEventProcessedCount);
+}
+
+/**
+ * This method is triggered after the presentation is streamed in. At this point,
+ * all the stores will be loaded up.
+ */
+void CPresentation::OnPresentationLoaded()
+{
+ m_FrameData.Reserve(1000 /*m_ElementManager.GetElementCount( )*/);
+}
+
+/**
+ * Set the full path for this presentation. This can be used by anyone who
+ * knows the presentation to form relative paths.
+ * @param inPath the path to which to set.
+ */
+void CPresentation::SetFilePath(const CHAR *inPath)
+{
+ m_FilePath = QFileInfo(inPath).absoluteFilePath();
+}
+
+/**
+ * Gets the full file path for this presentation. This can be used by anyone who
+ * knows the presentation to form relative correct paths.
+ */
+QString CPresentation::GetFilePath() const
+{
+ return m_FilePath;
+}
+
+/**
+ * Gets the absolute file path for the project that owns this presentation.
+ */
+QString CPresentation::getProjectPath() const
+{
+ return m_projectPath;
+}
+
+/**
+ * Gets the pause state
+ * @return true if the presentation is paused, false if otherwise
+ */
+BOOL CPresentation::GetPause() const
+{
+ return m_Paused;
+}
+
+/**
+ * Sets the pause state
+ * @param inPause set true to pause, set false if otherwise
+ */
+void CPresentation::SetPause(const BOOL inPause)
+{
+ m_Paused = inPause ? true : false;
+}
+
+/**
+ * Simple manager access: Scene
+ */
+void CPresentation::SetScene(IScene *inScene)
+{
+ m_Scene = inScene;
+}
+
+void CPresentation::SetActivityZone(qt3ds::runtime::IActivityZone *inZone)
+{
+ m_ActivityZone = inZone;
+ m_ActivityZone->SetZoneActive(m_Active);
+ TElement *theSceneElement = m_RootElement;
+ qt3ds::runtime::IActivityZone &theZone(*GetActivityZone());
+ // The activity zone requires elements described to it in breadth first search order.
+ theZone.AddActivityItems(*theSceneElement);
+}
+
+void CPresentation::SetActive(bool inValue)
+{
+ m_Active = inValue;
+ m_ActivityZone->SetZoneActive(m_Active);
+}
+
+bool CPresentation::GetActive() const
+{
+ return m_Active;
+}
+
+/**
+ * Simple manager access: Scene
+ */
+IScene *CPresentation::GetScene() const
+{
+ return m_Scene;
+}
+
+/**
+* Simple manager access: Script Bridge Qml
+*/
+IScriptBridge *CPresentation::GetScriptBridgeQml()
+{
+ if (m_Application)
+ return &m_Application->GetRuntimeFactoryCore().GetScriptEngineQml();
+
+ return nullptr;
+}
+
+/**
+ * Simple manager access: Component Manager
+ */
+IComponentManager &CPresentation::GetComponentManager()
+{
+ return m_ComponentManager;
+}
+
+/**
+ * Simple manager access: Slide Manager
+ */
+ISlideSystem &CPresentation::GetSlideSystem()
+{
+ return *m_SlideSystem;
+}
+
+/**
+ * Simple manager access: Animation Manager
+ */
+qt3ds::runtime::IAnimationSystem &CPresentation::GetAnimationSystem()
+{
+ return *m_AnimationSystem;
+}
+
+/**
+ * Simple manager access: Logic Manager
+ */
+ILogicSystem &CPresentation::GetLogicSystem()
+{
+ return *m_LogicSystem;
+}
+
+/**
+ * Simple manager access: Params Manager
+ */
+IParametersSystem &CPresentation::GetParametersSystem()
+{
+ return *m_ParametersSystem;
+}
+
+void CPresentation::SetElementPath(TElement &inElement, const char8_t *inPath)
+{
+ CRegisteredString str;
+ if (m_Application)
+ str = m_Application->GetRuntimeFactoryCore().GetStringTable().RegisterStr(
+ qt3ds::foundation::nonNull(inPath));
+
+ if (str.IsValid())
+ m_ElementPathMap.insert(eastl::make_pair(&inElement, str));
+}
+
+qt3ds::foundation::CRegisteredString CPresentation::GetElementPath(TElement &inElement)
+{
+ TElemStringMap::iterator iter = m_ElementPathMap.find(&inElement);
+ if (iter != m_ElementPathMap.end())
+ return iter->second;
+
+ return qt3ds::foundation::CRegisteredString();
+}
+
+qt3ds::foundation::IStringTable &CPresentation::GetStringTable()
+{
+ return GetApplication().GetRuntimeFactoryCore().GetStringTable();
+}
+
+/**
+ * Current frame data stores traversal lists for use later
+ */
+CPresentationFrameData &CPresentation::GetFrameData()
+{
+ return m_FrameData;
+}
+
+void CPresentation::SetLoadedBuffer(qt3ds::render::ILoadedBuffer &inBuffer)
+{
+ m_LoadedBuffer = inBuffer;
+}
+
+/**
+ * Retrieve the name of the presentation. This is actually the file path.
+ * @return the name of this presentation
+ */
+const QByteArray CPresentation::GetName() const
+{
+ return m_Name.toLatin1();
+}
+
+/**
+ * Retrieve the size of the presentation in Studio
+ * @return the size of this presentation
+ */
+SPresentationSize CPresentation::GetSize() const
+{
+ return m_Size;
+}
+
+/**
+ * Set the size of the presentation as reflected in Studio
+ * @param inSize size of presentation ( width, height, scale mode ) in Studio
+ */
+void CPresentation::SetSize(const SPresentationSize &inSize)
+{
+ m_Size = inSize;
+}
+
+QPresentationSignalProxy *CPresentation::signalProxy()
+{
+ return &m_SignalProxy;
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSPresentation.h b/src/runtime/Qt3DSPresentation.h
new file mode 100644
index 0000000..76b0a6e
--- /dev/null
+++ b/src/runtime/Qt3DSPresentation.h
@@ -0,0 +1,231 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "RuntimePrefix.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSPresentationFrameData.h"
+#include "Qt3DSAnimationSystem.h"
+#include "Qt3DSCircularArray.h"
+#include "Qt3DSEventCallbacks.h"
+#include "Qt3DSTimePolicy.h"
+#include "EASTL/hash_map.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSComponentManager.h"
+
+#include <QObject>
+
+class QPresentationSignalProxy : public QObject
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void SigSlideEntered(const QString &elementPath, unsigned int index, const QString &name);
+ void SigSlideExited(const QString &elementPath, unsigned int index, const QString &name);
+ void SigCustomSignal(const QString &elementPath, const QString &name);
+ void SigPresentationReady();
+ void SigElementsCreated(const QStringList &elementPaths, const QString &error);
+ void SigMaterialsCreated(const QStringList &materialNames, const QString &error);
+ void SigDataOutputValueUpdated(const QString &name, const QVariant &value);
+};
+
+namespace qt3ds {
+namespace runtime {
+ class IApplication;
+ class IActivityZone;
+ struct DataOutputDef;
+}
+}
+
+namespace qt3ds {
+namespace render {
+ class ILoadedBuffer;
+}
+}
+
+namespace Q3DStudio {
+
+/**
+ * Intelligent representation of a Studio presentation.
+ */
+class CPresentation : public IPresentation
+{
+protected:
+ QString m_Name; // Name of this presentation
+ QString m_FilePath; // Absolute path to this presentation
+ QString m_projectPath; // Absolute path to the project root
+ qt3ds::runtime::IApplication *m_Application; // Runtime object
+ IScene *m_Scene; // Connection to the associated scene (render) for this presentation
+ qt3ds::runtime::IActivityZone *m_ActivityZone; // Controls element active status
+ TElement *m_RootElement;
+
+ CPresentationFrameData m_FrameData; // Storage of data of the current frame
+ CCircularArray<SEventCommand> m_EventCommandQueue; // The Event/Command integrated queue
+ bool m_IsProcessingEventCommandQueue;
+ CEventCallbacks m_EventCallbacks; // Handles event callbacks on registered elements
+ SPresentationSize m_Size; // Native width, height and mode exported from Studio
+
+ qt3ds::foundation::NVScopedRefCounted<qt3ds::render::ILoadedBuffer>
+ m_LoadedBuffer; // Reference to loaded data when loading from binary
+
+ CComponentManager m_ComponentManager;
+ qt3ds::foundation::NVScopedRefCounted<ISlideSystem>
+ m_SlideSystem; // Container and factory of all slides
+ qt3ds::foundation::NVScopedRefCounted<ILogicSystem>
+ m_LogicSystem; // Container and factory of all logics
+ qt3ds::foundation::NVScopedRefCounted<IAnimationSystem>
+ m_AnimationSystem; // Container and factory of all animation tracks
+ qt3ds::foundation::NVScopedRefCounted<IParametersSystem>
+ m_ParametersSystem; // Container and factory of all custom actions
+
+ TTimeUnit m_Offset;
+ TTimeUnit m_LocalTime;
+ TTimeUnit m_PreviousGlobalTime;
+ bool m_Paused;
+ bool m_OffsetInvalid;
+ bool m_Active;
+ bool m_presentationReady = false;
+
+ typedef eastl::hash_map<TElement *, qt3ds::foundation::CRegisteredString> TElemStringMap;
+ TElemStringMap m_ElementPathMap;
+
+public: // Construction
+ CPresentation(const QString &inName, const QString &projectPath,
+ qt3ds::runtime::IApplication *inRuntime);
+ virtual ~CPresentation() override;
+
+public: // Execution
+ void Initialize();
+ // Clear dirty elements
+ void ClearDirtyList() override;
+ // Run events
+ void PreUpdate(const TTimeUnit inGlobalTime) override;
+ // update element graph
+ void BeginUpdate() override;
+ // end update element graph
+ void EndUpdate() override;
+ // Run behaviors.
+ void PostUpdate(const TTimeUnit inGlobalTime) override;
+ // Notify DataUpdates if any are registered to this presentation
+ void NotifyDataOutputs();
+
+public: // Bridge Control
+ IScene *GetScene() const override;
+ IScriptBridge *GetScriptBridgeQml() override;
+ void SetScene(IScene *inScene) override;
+
+ void SetActivityZone(qt3ds::runtime::IActivityZone *inZone);
+ qt3ds::runtime::IActivityZone *GetActivityZone() override { return m_ActivityZone; }
+ void SetActive(bool inValue);
+ bool GetActive() const;
+ TElement *GetRoot() override { return m_RootElement; }
+ void SetRoot(TElement &inRoot) override { m_RootElement = &inRoot; }
+
+public: // Commands and Events
+ void FireEvent(const SEventCommand &inEvent);
+ void FireEvent(const TEventCommandHash inEventType, TElement *inTarget,
+ const UVariant *inArg1 = nullptr, const UVariant *inArg2 = nullptr,
+ const EAttributeType inType1 = ATTRIBUTETYPE_NONE,
+ const EAttributeType inType2 = ATTRIBUTETYPE_NONE) override;
+ void FireCommand(const TEventCommandHash inCommandType, TElement *inTarget,
+ const UVariant *inArg1 = nullptr, const UVariant *inArg2 = nullptr,
+ const EAttributeType inType1 = ATTRIBUTETYPE_NONE,
+ const EAttributeType inType2 = ATTRIBUTETYPE_NONE) override;
+ void FlushEventCommandQueue(void) override;
+ void ProcessEvent(SEventCommand &inEvent) override;
+
+ QPresentationSignalProxy *signalProxy();
+
+public: // Data Output
+ void AddToDataOutputMap(const QHash<qt3ds::foundation::CRegisteredString,
+ qt3ds::runtime::DataOutputDef> &doMap);
+
+public: // Event Callbacks
+ void RegisterEventCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData) override;
+ BOOL UnregisterEventCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData) override;
+
+protected: // Execution Helper Methods
+ void ProcessAllCallbacks();
+ BOOL ProcessEventCommandQueue();
+ void ProcessEvent(SEventCommand &ioEvent, INT32 &ioEventCount);
+ void ProcessEventBubbling(SEventCommand &ioEvent, INT32 &ioEventCount);
+ void ProcessCommand(const SEventCommand &inCommand);
+
+public: // Managers
+ IComponentManager &GetComponentManager() override;
+ ISlideSystem &GetSlideSystem() override;
+ IAnimationSystem &GetAnimationSystem() override;
+ ILogicSystem &GetLogicSystem() override;
+ IParametersSystem &GetParametersSystem() override;
+ qt3ds::foundation::IStringTable &GetStringTable() override;
+ qt3ds::runtime::IApplication &GetApplication() override
+ {
+ QT3DS_ASSERT(m_Application);
+ return *m_Application;
+ }
+ void SetLoadedBuffer(qt3ds::render::ILoadedBuffer &inBuffer);
+
+ void SetElementPath(TElement &inElement, const char8_t *inPath) override;
+ qt3ds::foundation::CRegisteredString GetElementPath(TElement &inElement) override;
+
+public: // Helpers
+ CPresentationFrameData &GetFrameData() override;
+ TTimeUnit GetTime() { return m_LocalTime; }
+
+public: // Hooks and callbacks
+ void OnPresentationLoaded() override;
+
+public: // Configuration access
+ SPresentationSize GetSize() const override;
+ BOOL GetPause() const;
+ const QByteArray GetName() const;
+
+ void SetSize(const SPresentationSize &inSize) override;
+ void SetPause(const BOOL inPause);
+ void SetHide(const BOOL inHide);
+ void SetUpdateLock(const BOOL inLockUpdate);
+ void SetVCAA(const BOOL inVCAA);
+
+public: // Full file paths
+ void SetFilePath(const CHAR *inPath) override;
+ QString GetFilePath() const override;
+ QString getProjectPath() const override;
+
+private: // Disabled Copy Construction
+ CPresentation(CPresentation &);
+ CPresentation &operator=(const CPresentation &);
+private:
+ QPresentationSignalProxy m_SignalProxy;
+ QHash<qt3ds::foundation::CRegisteredString, qt3ds::runtime::DataOutputDef> m_pathToDataOutMap;
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSPresentationFrameData.cpp b/src/runtime/Qt3DSPresentationFrameData.cpp
new file mode 100644
index 0000000..649462a
--- /dev/null
+++ b/src/runtime/Qt3DSPresentationFrameData.cpp
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSPresentationFrameData.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Constants
+//==============================================================================
+const FLOAT DIRTY_STORE_RATIO = 0.1f;
+const FLOAT TRAVERSAL_STORE_RATIO = 0.5f;
+const FLOAT ACTIVATION_STORE_RATIO = 0.3f;
+const FLOAT DEACTIVATION_STORE_RATIO = 0.3f;
+
+//==============================================================================
+/**
+ * Constructor
+ */
+CPresentationFrameData::CPresentationFrameData()
+ : m_DirtyList(0, 0, "Frame:DirtyList")
+ , m_TraversalList(0, 0, "Frame:TraversalList")
+ , m_ScriptsList(0, 0, "Frame:ScriptsList")
+ , m_ActivationList(0, 0, "Frame:ActivationList")
+ , m_DeactivationList(0, 0, "Frame:DeactivationList") /*,*/
+// m_SlideExitList( 0, 0, "Frame:SlideExitList" ),
+// m_SlideEnterList( 0, 0, "Frame:SlideEnterList" )
+{
+}
+
+//==============================================================================
+/**
+ * Reserve memory from the memory subsytem to store the various arrays.
+ * @param inElementCount the number of elements loaded
+ */
+void CPresentationFrameData::Reserve(const INT32 /*inElementCount*/)
+{
+}
+
+//==============================================================================
+/**
+ * Clean up the data. This is usually called at the start of the frame rhythm to
+ * clean up the data from previous frame
+ * Memory allocation should be clear by default.
+ * Previous list could be a lot longer than current or future list which means
+ * the appliation is using more memory than needed. The heuristics of both
+ * initialization and runtime freeing is dependent on the presentation.
+ */
+void CPresentationFrameData::Reset()
+{
+ // Keep the capacity of these lists every frame since they have consistent
+ // sizes from frame to frame
+ m_TraversalList.Clear(false);
+ m_ScriptsList.Clear(false);
+
+ // These lists are more sporatic (slide changes) for now, clear them as
+ // above but potential memory saving could occur by calling Clear( true ) instead
+ m_ActivationList.Clear(false);
+ m_DeactivationList.Clear(false);
+
+ // NOTE: When we clear the dirty list, we also must ensure that the elements
+ // themselves are un-dirtied to prepare for the next frame. This is done
+ // by the caller of "CPresentationFrameData::Reset"
+ m_DirtyList.Clear(false);
+
+ // m_SlideExitList.Clear( false );
+ // m_SlideEnterList.Clear( false );
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSPresentationFrameData.h b/src/runtime/Qt3DSPresentationFrameData.h
new file mode 100644
index 0000000..332cc84
--- /dev/null
+++ b/src/runtime/Qt3DSPresentationFrameData.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Presentation update cycle data storage class.
+ *
+ * This is the data collected from the Presentation on each frame. Other subsystems
+ * or external system uses these data to perform their specific operation
+ */
+class CPresentationFrameData
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ TElementList m_DirtyList; ///< List of elements with modified attributes
+ TElementList m_TraversalList; ///< List of active elements
+ TElementList m_ScriptsList; ///< List of elements where scripts are active
+ TElementList
+ m_ActivationList; ///< List of elements whose global active flips from false to true
+ TElementList
+ m_DeactivationList; ///< List of elements whose global active flops from true to false
+ // TElementList m_SlideExitList; ///< List of components that exits their
+ // slides
+ // TElementList m_SlideEnterList; ///< List of components that enters their
+ // slides
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CPresentationFrameData();
+ void Reserve(const INT32 inElementCount);
+
+public: // Data Management
+ void Reset();
+
+ TElementList &GetDirtyList() { return m_DirtyList; }
+ TElementList &GetTraversalList() { return m_TraversalList; }
+ TElementList &GetScriptsList() { return m_ScriptsList; }
+ TElementList &GetActivationList() { return m_ActivationList; }
+ TElementList &GetDeactivationList() { return m_DeactivationList; }
+ // TElementList& GetSlideExitList( ) { return m_SlideExitList;
+ // }
+ // TElementList& GetSlideEnterList( ) { return m_SlideEnterList; }
+
+private: // Disabled Copy Construction
+ CPresentationFrameData(const CPresentationFrameData &);
+ CPresentationFrameData &operator=(const CPresentationFrameData &);
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSQmlElementHelper.cpp b/src/runtime/Qt3DSQmlElementHelper.cpp
new file mode 100644
index 0000000..9b58a73
--- /dev/null
+++ b/src/runtime/Qt3DSQmlElementHelper.cpp
@@ -0,0 +1,323 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSQmlElementHelper.h"
+#include "Qt3DSCommandEventTypes.h"
+#include "Qt3DSHash.h"
+#include "Qt3DSAttributeHashes.h"
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSRuntimeFactory.h"
+#include "qmath.h"
+
+using namespace Q3DStudio;
+using namespace qt3ds;
+
+//==============================================================================
+// Constants
+//==============================================================================
+const char PRESENTATION_DELIMITER = ':';
+const char NODE_DELIMITER = '.';
+const TStringHash RESERVED_THIS = CHash::HashString("this");
+const TStringHash RESERVED_PARENT = CHash::HashString("parent");
+const TStringHash RESERVED_SCENE = CHash::HashString("Scene");
+
+//==============================================================================
+/**
+* Constructor
+*/
+CQmlElementHelper::CQmlElementHelper()
+{
+}
+
+//==============================================================================
+/**
+* Destructor
+*/
+CQmlElementHelper::~CQmlElementHelper()
+{
+}
+
+TElement *CQmlElementHelper::GetElement(qt3ds::runtime::IApplication &inApplication,
+ IPresentation *inDefaultPresentation, const char *inPath,
+ TElement *inStartElement)
+{
+ if (inPath == nullptr || *inPath == 0)
+ return nullptr;
+ const char *thePath(inPath);
+ const char *theSubPath = nullptr;
+ IPresentation *thePresentation = nullptr;
+ size_t thePathLength = ::strlen(thePath) + 1;
+ char *theToken =
+ Q3DStudio_allocate_desc(CHAR, thePathLength, "Token:TempPath"); // Temporary token storage
+ // Try to get the specified presentation
+ theSubPath = ::strchr(thePath, PRESENTATION_DELIMITER);
+ TElement *theElement = inStartElement;
+ if (theSubPath != nullptr) {
+ UINT32 theSubPathLength = static_cast<UINT32>(theSubPath - thePath);
+
+ ::strncpy(theToken, thePath, theSubPathLength);
+ theToken[theSubPathLength] = '\0';
+
+ thePath = theSubPath + 1;
+
+ const CHAR *thePresentationName = theToken;
+
+ thePresentation = inApplication.GetPresentationById(thePresentationName);
+ }
+ if (thePresentation == nullptr)
+ thePresentation = inDefaultPresentation;
+
+ // Return nil if the inStartElement is not in the specified presentation
+ if (theElement != nullptr
+ && (theSubPath == nullptr && theElement->GetBelongedPresentation() != thePresentation)) {
+ thePresentation = theElement->GetBelongedPresentation();
+ }
+
+ if (thePresentation == nullptr)
+ return nullptr;
+
+ TStringHash theName;
+ INT32 theParseCounter = 0;
+
+ while (thePath != nullptr && thePath[0] != '\0') {
+ ++theParseCounter;
+
+ // Do some strtok() work here
+ theSubPath = ::strchr(thePath, NODE_DELIMITER);
+ if (theSubPath) {
+ UINT32 theSubPathLength = static_cast<UINT32>(theSubPath - thePath);
+ Q3DStudio_ASSERT(theSubPathLength < thePathLength);
+
+ ::strncpy(theToken, thePath, theSubPathLength);
+ theToken[theSubPathLength] = '\0';
+
+ thePath = theSubPath + 1;
+ } else {
+ ::strcpy(theToken, thePath);
+ thePath = nullptr;
+ }
+
+ // Hash the token and do some element searching
+ theName = CHash::HashString(theToken);
+
+ if (theName == RESERVED_PARENT) {
+ if (theElement)
+ theElement = theElement->GetParent();
+ } else if (theName == RESERVED_THIS) {
+ //Keep the original element if "this" wanted
+ } else {
+ if (theName == RESERVED_SCENE && theParseCounter == 1)
+ theElement =
+ thePresentation->GetRoot(); // theElement is nullptr, so using absolute path
+
+ else if (theElement)
+ theElement = theElement->FindChild(theName); // Using relative path
+ }
+
+ if (!theElement)
+ thePath = nullptr;
+ } // while
+
+ Q3DStudio_free(theToken, CHAR, thePathLength);
+ return theElement;
+}
+
+bool CQmlElementHelper::SetAttribute(TElement *theElement, const char *theAttName,
+ const void *value, bool inDelay)
+{
+ SAttributeKey theAttributeKey;
+ theAttributeKey.m_Hash = CHash::HashAttribute(theAttName);
+
+ // Early out for our single 'read only' attribute
+ if (ATTRIBUTE_URI == theAttributeKey.m_Hash) {
+ // we didn't push anything onto the stack
+ return false;
+ }
+
+ // first search if it is a static property
+ Option<qt3ds::runtime::element::TPropertyDescAndValuePtr> thePropertyInfo =
+ theElement->FindProperty(theAttributeKey.m_Hash);
+
+ if (!thePropertyInfo.hasValue()) {
+ // if not search in the dynamic properties
+ thePropertyInfo = theElement->FindDynamicProperty(theAttributeKey.m_Hash);
+ if (!thePropertyInfo.hasValue()) {
+ // create a new dynamic porperty
+ qt3ds::runtime::IElementAllocator &theElemAllocator(
+ theElement->GetBelongedPresentation()->GetApplication().GetElementAllocator());
+ qt3ds::foundation::IStringTable &theStringTable(
+ theElement->GetBelongedPresentation()->GetStringTable());
+ IRuntimeMetaData &theMetaData =
+ theElement->GetBelongedPresentation()->GetApplication().GetMetaData();
+ thePropertyInfo = theElemAllocator.CreateDynamicProperty(
+ theMetaData, *theElement, theStringTable.RegisterStr(theAttName));
+ }
+ }
+
+ if (thePropertyInfo.hasValue()) {
+ UVariant theNewValue;
+ QString name(thePropertyInfo->first.m_Name.c_str());
+ EAttributeType theAttributeType = thePropertyInfo->first.m_Type;
+ switch (theAttributeType) {
+ case ATTRIBUTETYPE_INT32:
+ case ATTRIBUTETYPE_HASH:
+ theNewValue.m_INT32 = *(INT32 *)value;
+ break;
+
+ case ATTRIBUTETYPE_FLOAT:
+ theNewValue.m_FLOAT = *(FLOAT *)value;
+ if (name.startsWith(QLatin1String("rotation.")))
+ theNewValue.m_FLOAT = qDegreesToRadians(theNewValue.m_FLOAT);
+ break;
+
+ case ATTRIBUTETYPE_BOOL:
+ theNewValue.m_INT32 = *(INT32 *)value;
+ break;
+
+ case ATTRIBUTETYPE_STRING:
+ theNewValue.m_StringHandle =
+ theElement->GetBelongedPresentation()->GetStringTable().GetHandle(
+ (const char *)value);
+ break;
+
+ case ATTRIBUTETYPE_POINTER:
+ qCCritical(INVALID_OPERATION, "setAttribute: pointer attributes not handled.");
+ return false;
+ break;
+
+ case ATTRIBUTETYPE_ELEMENTREF:
+ qCCritical(INVALID_OPERATION, "setAttribute: ElementRef attributes are read only.");
+ return false;
+ break;
+
+ case ATTRIBUTETYPE_FLOAT3: {
+ FLOAT *vec3 = (FLOAT *)value;
+ theNewValue.m_FLOAT3[0] = vec3[0];
+ theNewValue.m_FLOAT3[1] = vec3[1];
+ theNewValue.m_FLOAT3[2] = vec3[2];
+ if (name == QLatin1String("rotation")) {
+ theNewValue.m_FLOAT3[0]= qDegreesToRadians(theNewValue.m_FLOAT3[0]);
+ theNewValue.m_FLOAT3[1]= qDegreesToRadians(theNewValue.m_FLOAT3[1]);
+ theNewValue.m_FLOAT3[2]= qDegreesToRadians(theNewValue.m_FLOAT3[2]);
+ }
+ } break;
+
+ case ATTRIBUTETYPE_NONE:
+ case ATTRIBUTETYPE_DATADRIVEN_PARENT:
+ case ATTRIBUTETYPE_DATADRIVEN_CHILD:
+ case ATTRIBUTETYPECOUNT:
+ default:
+ qCCritical(INVALID_OPERATION, "setAttribute: Attribute has no type!");
+ return false;
+ break;
+ }
+
+ if (inDelay) {
+ UVariant arg1;
+ arg1.m_INT32 = theAttributeKey.m_Hash;
+ theElement->GetBelongedPresentation()->FireCommand(
+ COMMAND_SETPROPERTY, theElement, &arg1, &theNewValue, ATTRIBUTETYPE_HASH,
+ theAttributeType);
+ } else {
+ theElement->SetAttribute(*thePropertyInfo, theNewValue);
+ }
+ } else {
+ return false;
+ }
+ return true;
+}
+
+bool CQmlElementHelper::GetAttribute(TElement *inElement, const char *inAttribute, void *value)
+{
+ SAttributeKey theAttributeKey;
+ theAttributeKey.m_Hash = CHash::HashAttribute(inAttribute);
+
+ // first search if it is a static property
+ Option<qt3ds::runtime::element::TPropertyDescAndValuePtr> thePropertyInfo =
+ inElement->FindProperty(theAttributeKey.m_Hash);
+
+ if (!thePropertyInfo.hasValue())
+ thePropertyInfo = inElement->FindDynamicProperty(theAttributeKey.m_Hash);
+
+ if (thePropertyInfo.hasValue()) {
+ UVariant *theValuePtr = thePropertyInfo->second;
+ EAttributeType theAttributeType = thePropertyInfo->first.m_Type;
+ switch (theAttributeType) {
+ case ATTRIBUTETYPE_INT32:
+ case ATTRIBUTETYPE_HASH:
+ *(INT32 *)value = theValuePtr->m_INT32;
+ break;
+
+ case ATTRIBUTETYPE_FLOAT:
+ *(FLOAT *)value = theValuePtr->m_FLOAT;
+ break;
+
+ case ATTRIBUTETYPE_BOOL:
+ *(INT32 *)value = (theValuePtr->m_INT32 != 0);
+ break;
+
+ case ATTRIBUTETYPE_STRING:
+ *(char *)value = *inElement->GetBelongedPresentation()
+ ->GetStringTable()
+ .HandleToStr(theValuePtr->m_StringHandle)
+ .c_str();
+ break;
+
+ case ATTRIBUTETYPE_POINTER:
+ qCCritical(INVALID_OPERATION, "getAttribute: pointer attributes not handled.");
+ return false;
+ break;
+
+ case ATTRIBUTETYPE_ELEMENTREF:
+ qCCritical(INVALID_OPERATION, "getAttribute: ElementRef attributes are read only.");
+ return false;
+ break;
+
+ case ATTRIBUTETYPE_FLOAT3: {
+ FLOAT *vec3 = (FLOAT *)value;
+ vec3[0] = theValuePtr->m_FLOAT3[0];
+ vec3[1] = theValuePtr->m_FLOAT3[1];
+ vec3[2] = theValuePtr->m_FLOAT3[2];
+ } break;
+
+ case ATTRIBUTETYPE_NONE:
+ case ATTRIBUTETYPE_DATADRIVEN_PARENT:
+ case ATTRIBUTETYPE_DATADRIVEN_CHILD:
+ case ATTRIBUTETYPECOUNT:
+ default:
+ qCCritical(INVALID_OPERATION, "getAttribute: Attribute has no type!");
+ return false;
+ break;
+ }
+ } else {
+ return false;
+ }
+ return true;
+}
diff --git a/src/runtime/Qt3DSQmlElementHelper.h b/src/runtime/Qt3DSQmlElementHelper.h
new file mode 100644
index 0000000..ec36c8e
--- /dev/null
+++ b/src/runtime/Qt3DSQmlElementHelper.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_QML_ELEMENT_HELPER_H
+#define QT3DS_QML_ELEMENT_HELPER_H
+
+#include "Qt3DSApplication.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSKernelTypes.h"
+
+namespace Q3DStudio {
+
+class CQmlElementHelper
+{
+private:
+ CQmlElementHelper();
+ virtual ~CQmlElementHelper();
+
+public:
+ static TElement *GetElement(qt3ds::runtime::IApplication &inApplication,
+ IPresentation *inDefaultPresentation, const char *inPath,
+ TElement *inStartElement = NULL);
+
+ static bool SetAttribute(TElement *inElement, const char *inAttribute, const void *value,
+ bool inDelay);
+ static bool GetAttribute(TElement *inElement, const char *inAttribute, void *value);
+};
+}
+
+#endif // QT3DS_QML_ELEMENT_HELPER_H
diff --git a/src/runtime/Qt3DSQmlEngine.cpp b/src/runtime/Qt3DSQmlEngine.cpp
new file mode 100644
index 0000000..ac958ea
--- /dev/null
+++ b/src/runtime/Qt3DSQmlEngine.cpp
@@ -0,0 +1,2690 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSQmlEngine.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSInputEngine.h"
+#include "Qt3DSSceneManager.h"
+#include "Qt3DSVector3.h"
+#include "Qt3DSColor.h"
+#include "Qt3DSAttributeHashes.h"
+#include "Qt3DSFileStream.h"
+#include "Qt3DSDataLogger.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/FileTools.h"
+#include "foundation/Qt3DSSystem.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSSlideSystem.h"
+#include "Qt3DSRenderModel.h"
+
+#include "EASTL/vector.h"
+#include "EASTL/list.h"
+#include <sys/stat.h>
+#include "Qt3DSCommandEventTypes.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSRuntimeFactory.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "Qt3DSRenderThreadPool.h"
+#include "Qt3DSRenderImageBatchLoader.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSAudioPlayer.h"
+#include "Qt3DSActivationManager.h"
+#include "Qt3DSParametersSystem.h"
+#include "Qt3DSQmlElementHelper.h"
+#include "q3dsqmlscript.h"
+#include "Qt3DSRenderRuntimeBindingImpl.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSImportMesh.h"
+#include "Qt3DSRenderer.h"
+#include "q3dsmaterialdefinitionparser.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "Qt3DSRenderMaterialHelpers.h"
+#include "Qt3DSRenderUIPLoader.h"
+#include "Qt3DSDMMetaData.h"
+#include "Qt3DSRenderUIPSharedTranslation.h"
+
+#include <QtQml/qqmlengine.h>
+#include <QtQml/qqmlcontext.h>
+#include <QtQml/qqmlcomponent.h>
+#include <QtQml/qjsengine.h>
+#include <QtCore/qnumeric.h>
+#include <QtCore/qfileinfo.h>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+#if defined(_DEBUG) || (_PROFILE)
+#define Q3DStudio_LOG_EVENT(S) // something
+#else
+#define Q3DStudio_LOG_EVENT(S)
+#endif
+
+using qt3ds::runtime::IApplication;
+using namespace qt3ds;
+
+namespace __SQmlEngineImpl_Basic_Structs__ {
+ struct QmlScopedLock
+ {
+ qt3ds::foundation::Mutex *m_Mutex;
+
+ QmlScopedLock(qt3ds::foundation::Mutex *mtx)
+ : m_Mutex(mtx)
+ {
+ if (m_Mutex)
+ m_Mutex->lock();
+ }
+
+ ~QmlScopedLock()
+ {
+ if (m_Mutex)
+ m_Mutex->unlock();
+ }
+ };
+}
+
+using namespace __SQmlEngineImpl_Basic_Structs__;
+#define QML_ENGINE_MULTITHREAD_PROTECT_METHOD QmlScopedLock __locker(m_MultithreadedMutex);
+
+//==============================================================================
+// Callback handling
+/**
+* Constructor
+*/
+CScriptCallbacks::CScriptCallbacks()
+ : m_CallbackList(0, 0, "CallbackList")
+{
+}
+
+/**
+* Destructor
+*/
+CScriptCallbacks::~CScriptCallbacks()
+{
+ FOR_ARRAY(SFrameCallbackEntry *, theEntry, m_CallbackList)
+ Q3DStudio_delete(*theEntry, SFrameCallbackEntry);
+
+ m_CallbackList.Clear();
+}
+
+bool CScriptCallbacks::RegisterCallback(Q3DStudio::UINT32 callbackType,
+ const TScriptCallback inCallback, void *inUserData)
+{
+ // currently we only support these two types of callbacks
+ if (callbackType != SCRIPT_ON_INITIALIZE && callbackType != SCRIPT_ON_UPDATE) {
+ return false;
+ }
+
+ SFrameCallbackEntry *theFrameCallbackEntry = NULL;
+
+ try {
+ // note we don't care if someone registers the same function twice.
+ theFrameCallbackEntry = Q3DStudio_new(SFrameCallbackEntry) SFrameCallbackEntry();
+
+ if (!theFrameCallbackEntry) {
+ throw "failed to allocated SFrameCallbackEntry";
+ }
+
+ SScriptCallbackEntry *theScriptCallbackEntry =
+ Q3DStudio_new(SScriptCallbackEntry) SScriptCallbackEntry();
+ if (!theScriptCallbackEntry) {
+ throw "failed to allocated SScriptCallbackEntry";
+ }
+
+ theScriptCallbackEntry->m_CallbackType = callbackType;
+ theScriptCallbackEntry->m_Function = inCallback;
+ theScriptCallbackEntry->m_UserData = inUserData;
+ theScriptCallbackEntry->m_Processed = false;
+
+ theFrameCallbackEntry->m_Callbacks.Push(theScriptCallbackEntry);
+
+ m_CallbackList.Push(theFrameCallbackEntry);
+
+ } catch (const char *) {
+ if (theFrameCallbackEntry)
+ Q3DStudio_delete(theFrameCallbackEntry, SFrameCallbackEntry);
+
+ return false;
+ }
+
+ return true;
+}
+
+void CScriptCallbacks::UnregisterCallback(Q3DStudio::UINT32, const TScriptCallback)
+{
+ // not used so far
+}
+
+void CScriptCallbacks::ProcessCallbacks()
+{
+ // Call onInitialize function
+ FOR_ARRAY(SFrameCallbackEntry *, theFrameEntry, m_CallbackList)
+ {
+ FOR_ARRAY(SScriptCallbackEntry *, theEntry, (*theFrameEntry)->m_Callbacks)
+ {
+ if (((*theEntry)->m_CallbackType == SCRIPT_ON_INITIALIZE) && !(*theEntry)->m_Processed
+ && (*theEntry)->m_Function) {
+ (*theEntry)->m_Function((*theEntry)->m_UserData);
+ (*theEntry)->m_Processed = true;
+ }
+ }
+ }
+
+ // Call onUpdate functions
+ FOR_ARRAY(SFrameCallbackEntry *, theFrameEntry, m_CallbackList)
+ {
+ FOR_ARRAY(SScriptCallbackEntry *, theEntry, (*theFrameEntry)->m_Callbacks)
+ {
+ // int type = (*theEntry)->m_CallbackType;
+ if ((*theEntry)->m_CallbackType == SCRIPT_ON_UPDATE && (*theEntry)->m_Function) {
+ (*theEntry)->m_Function((*theEntry)->m_UserData);
+ }
+ }
+ }
+}
+
+//==============================================================================
+//* End of helper class handling element operations
+//==============================================================================
+
+//==============================================================================
+/**
+* Helper class handling command operations
+*/
+class CQmlCommandHelper
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+private: // Constructors
+ CQmlCommandHelper();
+ virtual ~CQmlCommandHelper();
+
+public: // static Functions
+ static bool SetupGotoSlideCommand(TElement &inElement, const char *slideName,
+ const SScriptEngineGotoSlideArgs &inArgs);
+ static bool SetupGotoSlideCommand(TElement &inElement, Q3DStudio::INT32 inSlideIndex,
+ const SScriptEngineGotoSlideArgs &inArgs);
+
+protected: // Static Hidden Helpers
+ // static TElement* FireCommand(TEventCommandHash inCommand);
+
+public: // Static Helpers
+ static TElement *GetComponentParent(TElement *inParent);
+};
+
+//==============================================================================
+/**
+* Constructor
+*/
+CQmlCommandHelper::CQmlCommandHelper()
+{
+}
+
+//==============================================================================
+/**
+* Destructor
+*/
+CQmlCommandHelper::~CQmlCommandHelper()
+{
+}
+
+static Option<Q3DStudio::UINT8> FindSlide(TElement &inElement, const char *slideName)
+{
+ IPresentation *thePresentation = inElement.GetBelongedPresentation();
+
+ int theSlideHashName = thePresentation->GetApplication().HashString(slideName);
+ TComponent *theComponent = thePresentation->GetComponentManager().GetComponent(&inElement);
+ UINT8 theSlideIndex =
+ thePresentation->GetSlideSystem().FindSlide(*theComponent, theSlideHashName);
+ if (theSlideIndex >= theComponent->GetSlideCount()) {
+ qt3ds::foundation::CRegisteredString elemPath = thePresentation->GetElementPath(inElement);
+ if (elemPath.IsValid()) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "QMLCommandHelper: goToSlide: Unable to find slide "
+ << slideName <<"on element " << elemPath.c_str();
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "QMLCommandHelper: goToSlide: Unable to find slide "
+ << slideName;
+ }
+ return Empty();
+ }
+
+ return theSlideIndex;
+}
+
+TElement *CQmlCommandHelper::GetComponentParent(TElement *inElement)
+{
+ Q3DStudio_ASSERT(inElement);
+ return &inElement->GetComponentParent();
+}
+
+bool CQmlCommandHelper::SetupGotoSlideCommand(TElement &inElement, Q3DStudio::INT32 inSlideIndex,
+ const SScriptEngineGotoSlideArgs &inArgs)
+{
+ IPresentation *thePresentation = inElement.GetBelongedPresentation();
+ TElement *theTarget = GetComponentParent(&inElement);
+ SComponentGotoSlideData theSlideData(inSlideIndex);
+ theSlideData.m_Mode = inArgs.m_Mode;
+ theSlideData.m_Paused = inArgs.m_Paused;
+ theSlideData.m_Rate = inArgs.m_Rate;
+ theSlideData.m_Reverse = inArgs.m_Reverse;
+ theSlideData.m_StartTime = inArgs.m_StartTime;
+ // Resolve playthroughto if it has a valid value.
+ if (!isTrivial(inArgs.m_PlaythroughTo)) {
+ if (AreEqual(inArgs.m_PlaythroughTo, "next"))
+ theSlideData.m_PlaythroughTo = -1;
+ else if (AreEqual(inArgs.m_PlaythroughTo, "previous"))
+ theSlideData.m_PlaythroughTo = -2;
+ else {
+ // Find the slide if possible. If not, then just error leave things as they are.
+
+ Option<UINT8> theSlideIndex = FindSlide(inElement, inArgs.m_PlaythroughTo);
+ if (theSlideIndex.hasValue())
+ theSlideData.m_PlaythroughTo = *theSlideIndex;
+ }
+ }
+ thePresentation->GetComponentManager().SetupComponentGotoSlideCommand(theTarget, theSlideData);
+ UVariant theArg1;
+ UVariant theArg2;
+ qt3ds::intrinsics::memZero(&theArg1, sizeof(UVariant));
+ qt3ds::intrinsics::memZero(&theArg2, sizeof(UVariant));
+ thePresentation->FireCommand(COMMAND_GOTOSLIDE, theTarget, &theArg1, &theArg2);
+ return true;
+}
+
+bool CQmlCommandHelper::SetupGotoSlideCommand(TElement &inElement, const char *slideName,
+ const SScriptEngineGotoSlideArgs &inArgs)
+{
+ Option<UINT8> theSlideIndex = FindSlide(inElement, slideName);
+ if (theSlideIndex.hasValue())
+ return SetupGotoSlideCommand(inElement, *theSlideIndex, inArgs);
+
+ return false;
+}
+
+//==============================================================================
+//* End of helper class handling command operations
+//==============================================================================
+
+struct SEmitSignalData : public NVRefCounted
+{
+ NVAllocatorCallback &m_Alloc;
+ volatile QT3DSI32 mRefCount;
+ INT32 m_SignalNameHandler; ///< The name of the signal to emit
+ TElement *m_TargetElement; ///< The source element where the event is going to occur
+
+ SEmitSignalData(NVAllocatorCallback &alloc, INT32 inSignalName, TElement *inElement)
+ : m_Alloc(alloc)
+ , mRefCount(0)
+ , m_SignalNameHandler(inSignalName)
+ , m_TargetElement(inElement)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Alloc)
+};
+
+class CQmlEngineImpl : public CQmlEngine
+{
+ using TEmitSignalPtr = NVScopedRefCounted<SEmitSignalData>;
+ using TEmitSignalQueue = eastl::list<TEmitSignalPtr, ForwardingAllocator>;
+ using TPropertyDescAndValueList = eastl::vector<qt3ds::runtime::element::TPropertyDescAndValue>;
+ using TPropertyDesc = qt3ds::runtime::element::SPropertyDesc;
+
+ static const int MAX_ACTION_QUEUE_SIZE = 100;
+
+private:
+ qt3ds::NVFoundationBase &m_Foundation;
+ IApplication *m_Application;
+ IApplication *m_ApplicationCore;
+ qt3ds::foundation::Mutex m_PreloadMutex;
+ qt3ds::foundation::Mutex *m_MultithreadedMutex;
+
+ TEmitSignalQueue m_EmitSignalDataList;
+
+ QT3DSI32 mRefCount;
+
+ CScriptCallbacks m_ScriptCallbacks;
+
+ QQmlEngine m_engine;
+ QMap<QString, QQmlComponent *> m_components;
+ QVector<Q3DSQmlScript *> m_scripts;
+
+public:
+ CQmlEngineImpl(NVFoundationBase &fnd, ITimeProvider &inTimeProvider);
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ // functions from IScriptBridge
+ void EnableMultithreadedAccess() override;
+ void DisableMultithreadedAccess() override;
+
+ void SetApplicationCore(qt3ds::runtime::IApplication &inApplication) override;
+ void SetApplication(qt3ds::runtime::IApplication &inApplication) override;
+ qt3ds::runtime::IApplication *GetApplication() override;
+ void Initialize() override;
+
+ void LoadScript(IPresentation *presentation, TElement *element, const CHAR *path) override;
+ Q3DStudio::INT32 InitializeApplicationBehavior(const char *) override
+ {
+ return -1;
+ }
+
+ void ProcessFrameCallbacks(IPresentation *) override;
+ void ExecuteApplicationScriptFunction(Q3DStudio::INT32, const char *) override {}
+ void CallFunction(const char *, const char *,
+ CScriptEngineCallFunctionArgRetriever &) override {}
+
+ void ProcessSignal(IPresentation *inPresentation,
+ const SEventCommand &inCommand) override;
+ void ProcessCustomActions(IPresentation *inPresentation,
+ const SEventCommand &inCommand) override;
+ void ProcessCustomCallback(IPresentation *, const SEventCommand &) override {}
+
+ void SetTableForElement(TElement &, IScriptTableProvider &) override {}
+ void SetAttribute(TElement *target, const char *attName, const char *value) override;
+ void SetAttribute(const char *element, const char *attName, const char *value) override;
+ bool GetAttribute(TElement *target, const char *attName, char *value) override;
+ bool GetAttribute(const char *element, const char *attName, char *value) override;
+ void FireEvent(const char *element, const char *evtName) override;
+ void SetDataInputValue(const QString &name, const QVariant &value,
+ qt3ds::runtime::DataInputValueRole valueRole) override;
+ void createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties,
+ qt3ds::render::IQt3DSRenderer *renderer) override;
+ void deleteElements(const QStringList &elementPaths,
+ qt3ds::render::IQt3DSRenderer *renderer) override;
+ void createMaterials(const QString &subPresId, const QStringList &materialDefinitions,
+ qt3ds::render::ICustomMaterialSystem *customMaterialSystem,
+ IDynamicObjectSystem *dynamicObjectSystem,
+ qt3ds::render::IQt3DSRenderer *renderer) override;
+ void deleteMaterials(const QStringList &materialNames,
+ qt3ds::render::IQt3DSRenderer *renderer) override;
+ void createMesh(const QString &name, qt3dsimp::Mesh *mesh,
+ qt3ds::render::IBufferManager *bufferManager) override;
+ void deleteMeshes(const QStringList &meshNames,
+ qt3ds::render::IBufferManager *bufferManager) override;
+
+ void GotoSlide(const char *component, const char *slideName,
+ const SScriptEngineGotoSlideArgs &inArgs) override;
+ void GotoSlideRelative(const char *, bool, bool, const SScriptEngineGotoSlideArgs &) override;
+
+ void SetPresentationAttribute(const char *, const char *, const char *) override;
+
+ // No need to implement here, as sound playing is done in Qt3DSViewerApp
+ bool PlaySoundFile(const char *) override { return false; }
+
+ void EnableDebugging(qt3ds::state::debugger::IMultiProtocolSocket &) override {}
+ void EnableProfiling() override {}
+ void StepGC() override {}
+
+ // functions from CQMLEngine
+ bool PeekSignal(TElement *&outElement, char *&outName) override;
+ void GotoSlideIndex(const char *component, const Q3DStudio::INT32 slideIndex,
+ const SScriptEngineGotoSlideArgs &inArgs) override;
+ bool GetSlideInfo(const char *elementPath, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName) override;
+ void GotoTime(const char *component, const Q3DStudio::FLOAT time) override;
+ bool RegisterCallback(Q3DStudio::UINT32 callbackType, const TScriptCallback inCallback,
+ void *inUserData) override;
+ void Shutdown(qt3ds::NVFoundationBase &inFoundation) override;
+
+private:
+ TElement *createMaterialContainer(TElement *parent, CPresentation *presentation);
+ void createComponent(QQmlComponent *component, TElement *element);
+ TElement *getTarget(const char *component);
+ void listAllElements(TElement *root, QList<TElement *> &elements);
+ void initializeDataInputsInPresentation(CPresentation &presentation, bool isPrimary,
+ QList<TElement *> inElements = QList<TElement *>());
+ void initializeDataOutputsInPresentation(CPresentation &presentation, bool isPrimary);
+ // Splits down vector attributes to components as Runtime does not really
+ // handle vectors at this level anymore
+ bool getAttributeVector3(QVector<QByteArray> &outAttVec, const QByteArray &attName,
+ TElement *elem);
+ bool getAttributeVector2(QVector<QByteArray> &outAttVec, const QByteArray &attName,
+ TElement *elem);
+ // build and evaluate Evaluator datainput type expression
+ QJSValue buildJSFunc(const QString &userFunc);
+ // pass controller name for error reporting purposes
+ QVariant callJSFunc(const QString &controllerName, qt3ds::runtime::DataInputDef &diDef,
+ const QVariant::Type type);
+ // matches all numeric datatypes so we do not get datatype mismatch when JS
+ // decides to change result datatype (f.ex from double to int when result
+ // fractional part for specific input values happens to be exactly zero)
+ bool isMatchingDatatype(QVariant::Type resultType, QVariant::Type propertyType);
+ // find out which datainputs are used in the expression
+ QVector<QString> resolveDependentDatainputs(const QString &expression,
+ const QString &controllerName);
+
+ // Methods to add element attributes to list for element creation
+ void addStringAttribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QString &inAttName, const QString &inValue);
+ void addIntAttribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QString &inAttName, int inValue);
+ void addBoolAttribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QString &inAttName, bool inValue);
+ void addFloatAttribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QString &inAttName, float inValue);
+ void addFloat2Attribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QStringList &inAttNames, const QVector2D &inValue);
+ void addFloat3Attribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QStringList &inAttNames, const QVector3D &inValue);
+ void addFloat4Attribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QStringList &inAttNames, const QVector4D &inValue);
+ void addElementRefAttribute(qt3ds::foundation::IStringTable &strTable,
+ TPropertyDescAndValueList &list,
+ const QString &inAttName, TElement *element);
+ template <typename TDataType>
+ void setDynamicObjectProperty(qt3ds::render::SDynamicObject &material,
+ const qt3ds::render::dynamic::SPropertyDefinition &propDesc,
+ const TDataType &propValue);
+ QVector2D parseFloat2Property(const QString &propValue);
+ QVector3D parseFloat3Property(const QString &propValue);
+ QVector4D parseFloat4Property(const QString &propValue);
+
+ void notifyElementCreation(const QStringList &elementNames, const QString &error);
+ void notifyMaterialCreation(const QStringList &materialNames, const QString &error);
+ void deleteElements(const QVector<TElement *> &elements,
+ qt3ds::render::IQt3DSRenderer *renderer);
+};
+
+CQmlEngineImpl::CQmlEngineImpl(NVFoundationBase &fnd, ITimeProvider &)
+ : m_Foundation(fnd)
+ , m_Application(NULL)
+ , m_ApplicationCore(NULL)
+ , m_PreloadMutex(fnd.getAllocator())
+ , m_MultithreadedMutex(NULL)
+ , m_EmitSignalDataList(
+ ForwardingAllocator(fnd.getAllocator(), "CQmlEngineImpl::m_EmitSignalDataList"))
+ , mRefCount(0)
+{
+ qmlRegisterType<Q3DSQmlBehavior>("QtStudio3D.Behavior", 1, 0, "Behavior");
+ qmlRegisterType<Q3DSQmlBehavior, 1>("QtStudio3D.Behavior", 1, 1, "Behavior");
+}
+
+void CQmlEngineImpl::Shutdown(qt3ds::NVFoundationBase &inFoundation)
+{
+}
+
+void CQmlEngineImpl::EnableMultithreadedAccess()
+{
+ m_MultithreadedMutex = &m_PreloadMutex;
+}
+
+void CQmlEngineImpl::DisableMultithreadedAccess()
+{
+ m_MultithreadedMutex = NULL;
+}
+
+void CQmlEngineImpl::SetApplicationCore(runtime::IApplication &inApplication)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+ m_ApplicationCore = &inApplication;
+}
+
+void CQmlEngineImpl::SetApplication(qt3ds::runtime::IApplication &inApplication)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+ m_Application = &inApplication;
+}
+
+qt3ds::runtime::IApplication *CQmlEngineImpl::GetApplication()
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+ return m_Application;
+}
+
+void CQmlEngineImpl::Initialize()
+{
+ // Gather data input controlled properties
+ QList<CPresentation *> presentations = m_Application->GetPresentationList();
+
+ for (int i = 0; i < presentations.size(); ++i) {
+ initializeDataInputsInPresentation(*presentations[i], i == 0);
+ initializeDataOutputsInPresentation(*presentations[i], i == 0);
+ }
+}
+
+void CQmlEngineImpl::SetAttribute(TElement *target, const char *attName, const char *value)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+ if (target) {
+ bool success = CQmlElementHelper::SetAttribute(target, attName, value, false);
+ if (!success) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::SetAttribute: "
+ << "failed to set attribute on element"
+ << target << ":" << attName << ":" << value;
+ }
+ }
+}
+
+void CQmlEngineImpl::SetAttribute(const char *element, const char *attName, const char *value)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+
+ TElement *theTarget = getTarget(element);
+ if (theTarget) {
+ bool success = CQmlElementHelper::SetAttribute(theTarget, attName, value, false);
+ if (!success) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::SetAttribute: "
+ << "failed to set attribute on element"
+ << element << ":" << attName << ":" << value;
+ }
+ }
+}
+
+bool CQmlEngineImpl::GetAttribute(TElement *target, const char *attName, char *value)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+
+ if (target) {
+ bool success = CQmlElementHelper::GetAttribute(target, attName, value);
+ if (!success) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::GetAttribute: "
+ << "failed to get attribute on element"
+ << target << ":" << attName << ":" << value;
+ }
+ return success;
+ }
+
+ return false;
+}
+
+bool CQmlEngineImpl::GetAttribute(const char *element, const char *attName, char *value)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+
+ TElement *theTarget = getTarget(element);
+ if (theTarget) {
+ bool success = CQmlElementHelper::GetAttribute(theTarget, attName, value);
+ if (!success) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::GetAttribute: "
+ << "failed to get attribute on element"
+ << element << ":" << attName << ":" << value;
+ }
+ return success;
+ }
+
+ return false;
+}
+
+void CQmlEngineImpl::LoadScript(IPresentation *presentation, TElement *element, const CHAR *path)
+{
+ QString presPath = QFileInfo(presentation->GetFilePath()).absolutePath();
+
+ QString sourcePath(presPath + QLatin1Char('/') + path);
+ sourcePath.replace(QLatin1Char('\\'), QLatin1Char('/'));
+
+ TElement *parent = element->GetParent();
+ if (!parent)
+ return;
+
+ if (!m_components.contains(sourcePath)) {
+ m_components[sourcePath] = new QQmlComponent(&m_engine, QUrl::fromLocalFile(sourcePath),
+ &m_engine);
+ }
+
+ QQmlComponent *component = m_components[sourcePath];
+ if (component->status() == QQmlComponent::Ready) {
+ createComponent(component, element);
+ } else if (component->status() == QQmlComponent::Error) {
+ qWarning() << "Error while loading script"
+ << component->url().toString()
+ << ":" << component->errorString();
+ } else {
+ QObject::connect(component, &QQmlComponent::statusChanged,
+ [this, component, element] (QQmlComponent::Status status) {
+ if (status == QQmlComponent::Ready) {
+ createComponent(component, element);
+ } else {
+ qWarning() << "Error while loading script"
+ << component->url().toString()
+ << ":" << component->errorString();
+ }
+ }
+ );
+ }
+}
+
+void CQmlEngineImpl::FireEvent(const char *element, const char *evtName)
+{
+ TElement *theElement = getTarget(element);
+ if (theElement && theElement->GetActive() == true) {
+ IPresentation *thePresentation = theElement->GetBelongedPresentation();
+ thePresentation->FireEvent(CHash::HashEventCommand(evtName), theElement);
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::FireEvent: "
+ << "failed to find element: "
+ << element << " " << evtName;
+ }
+}
+
+void CQmlEngineImpl::SetDataInputValue(
+ const QString &name, const QVariant &value,
+ qt3ds::runtime::DataInputValueRole valueRole = qt3ds::runtime::DataInputValueRole::Value)
+{
+ qt3ds::runtime::DataInputMap &diMap = m_Application->dataInputMap();
+ if (diMap.contains(name)) {
+ qt3ds::runtime::DataInputDef &diDef = diMap[name];
+ switch (valueRole) {
+ case qt3ds::runtime::DataInputValueRole::Value: { // switch (valueRole)
+ diDef.value = value;
+ const QVector<qt3ds::runtime::DataInOutAttribute> &ctrlAtt
+ = diDef.controlledAttributes;
+ for (const qt3ds::runtime::DataInOutAttribute &ctrlElem : ctrlAtt) {
+ switch (ctrlElem.propertyType) {
+ case ATTRIBUTETYPE_DATAINPUT_TIMELINE: {
+ // Quietly ignore other than number type data inputs when adjusting timeline
+ if (diDef.type == qt3ds::runtime::DataInOutTypeRangedNumber) {
+ TTimeUnit endTime = 0;
+ TElement *element = getTarget(ctrlElem.elementPath.constData());
+ TComponent *component = static_cast<TComponent *>(element);
+ endTime = component->GetTimePolicy().GetLoopingDuration();
+
+ // Normalize the value to dataInput range
+ qreal newTime = qreal(endTime) * (qreal(value.toFloat() - diDef.min)
+ / qreal(diDef.max - diDef.min));
+ GotoTime(ctrlElem.elementPath.constData(), float(newTime / 1000.0));
+ }
+ break;
+ }
+ case ATTRIBUTETYPE_DATAINPUT_SLIDE: {
+ // Quietly ignore other than string type when adjusting slide
+ if (diDef.type == qt3ds::runtime::DataInOutTypeString) {
+ const QByteArray valueStr = value.toString().toUtf8();
+ GotoSlide(ctrlElem.elementPath.constData(), valueStr.constData(),
+ SScriptEngineGotoSlideArgs());
+ }
+ break;
+ }
+ // Silently ignore invalid incoming type if it does not
+ // match with the datainput type except with type Variant, for which
+ // the incoming value is cast to target property type without checking.
+ // Caveat emptor.
+
+ // For Evaluator, typecheck the JS evaluation result to see if it
+ // matches with the target property.
+
+ // Handle ranged number similarly to generic float
+ // if it is bound to properties other
+ // than timeline animation i.e. disregard range min and max
+ case ATTRIBUTETYPE_FLOAT: {
+ float valueFloat;
+ if (diDef.type == qt3ds::runtime::DataInOutTypeFloat
+ || diDef.type == qt3ds::runtime::DataInOutTypeRangedNumber
+ || diDef.type == qt3ds::runtime::DataInOutTypeVariant) {
+ valueFloat = value.toFloat();
+ } else if (diDef.type == qt3ds::runtime::DataInOutTypeEvaluator) {
+ valueFloat = callJSFunc(name, diDef, QVariant::Type::Double).toFloat();
+ } else {
+ qWarning() << __FUNCTION__ << "Property type "
+ << ctrlElem.propertyType
+ << " not matching with Datainput " << name
+ << " data type "
+ << diDef.type;
+ break;
+ }
+
+ SetAttribute(ctrlElem.elementPath.constData(),
+ ctrlElem.attributeName.first().constData(),
+ reinterpret_cast<const char *>(&valueFloat));
+ break;
+ }
+ case ATTRIBUTETYPE_FLOAT4: {
+ QVector4D valueVec;
+ if (diDef.type == qt3ds::runtime::DataInOutTypeVector4) {
+ valueVec = value.value<QVector4D>();
+ } else {
+ qWarning() << __FUNCTION__ << "Property type "
+ << ctrlElem.propertyType
+ << " not matching with Datainput " << name
+ << " data type "
+ << diDef.type;
+ break;
+ }
+ // Set the values of vector attribute components separately
+ for (int i = 0; i < 4; i++) {
+ const float val = valueVec[i];
+ SetAttribute(ctrlElem.elementPath.constData(),
+ ctrlElem.attributeName[i].constData(),
+ reinterpret_cast<const char *>(&val));
+ }
+ break;
+ }
+ case ATTRIBUTETYPE_FLOAT3: {
+ QVector3D valueVec;
+ if (diDef.type == qt3ds::runtime::DataInOutTypeVector3
+ || diDef.type == qt3ds::runtime::DataInOutTypeVariant) {
+ valueVec = value.value<QVector3D>();
+ } else if (diDef.type == qt3ds::runtime::DataInOutTypeEvaluator) {
+ const QVariant res = callJSFunc(name, diDef, QVariant::Type::Vector3D);
+ valueVec = res.value<QVector3D>();
+ } else {
+ qWarning() << __FUNCTION__ << "Property type "
+ << ctrlElem.propertyType
+ << " not matching with Datainput " << name
+ << " data type "
+ << diDef.type;
+ break;
+ }
+ // Set the values of vector attribute components separately
+ for (int i = 0; i < 3; i++) {
+ const float val = valueVec[i];
+ SetAttribute(ctrlElem.elementPath.constData(),
+ ctrlElem.attributeName[i].constData(),
+ reinterpret_cast<const char *>(&val));
+ }
+ break;
+ }
+ case ATTRIBUTETYPE_FLOAT2:
+ {
+ QVector2D valueVec;
+ if (diDef.type == qt3ds::runtime::DataInOutTypeVector2
+ || diDef.type == qt3ds::runtime::DataInOutTypeVariant) {
+ valueVec = value.value<QVector2D>();
+ } else if (diDef.type == qt3ds::runtime::DataInOutTypeEvaluator) {
+ const QVariant res = callJSFunc(name, diDef, QVariant::Type::Vector2D);
+ valueVec = res.value<QVector2D>();
+ } else {
+ qWarning() << __FUNCTION__ << "Property type "
+ << ctrlElem.propertyType
+ << " not matching with Datainput " << name
+ << " data type "
+ << diDef.type;
+ break;
+ }
+ // Set the values of vector attribute components separately
+ for (int i = 0; i < 2; i++) {
+ const float val = valueVec[i];
+ SetAttribute(ctrlElem.elementPath.constData(),
+ ctrlElem.attributeName[i].constData(),
+ reinterpret_cast<const char *>(&val));
+ }
+ break;
+ }
+ case ATTRIBUTETYPE_BOOL: {
+ uint valueBool; // SetAttribute requires at least 32-bit variable
+ if (diDef.type == qt3ds::runtime::DataInOutTypeBoolean
+ || diDef.type == qt3ds::runtime::DataInOutTypeVariant) {
+ valueBool = value.toBool();
+ } else if (diDef.type == qt3ds::runtime::DataInOutTypeEvaluator) {
+ valueBool = callJSFunc(name, diDef, QVariant::Type::Bool).toBool();
+ } else {
+ qWarning() << __FUNCTION__ << "Property type "
+ << ctrlElem.propertyType
+ << " not matching with Datainput " << name
+ << " data type "
+ << diDef.type;
+ break;
+ }
+
+ SetAttribute(ctrlElem.elementPath.constData(),
+ ctrlElem.attributeName.first().constData(),
+ reinterpret_cast<const char *>(&valueBool));
+ break;
+ }
+ case ATTRIBUTETYPE_STRING: {
+ QByteArray valueStr;
+ // Allow scalar number types also as inputs to string attribute
+ if (diDef.type == qt3ds::runtime::DataInOutTypeString
+ || diDef.type == qt3ds::runtime::DataInOutTypeRangedNumber
+ || diDef.type == qt3ds::runtime::DataInOutTypeFloat
+ || diDef.type == qt3ds::runtime::DataInOutTypeVariant) {
+ valueStr = value.toString().toUtf8();
+ } else if (diDef.type == qt3ds::runtime::DataInOutTypeEvaluator) {
+ valueStr = callJSFunc(name, diDef, QVariant::Type::String)
+ .toString().toUtf8();
+ } else {
+ qWarning() << __FUNCTION__ << "Property type "
+ << ctrlElem.propertyType
+ << " not matching with Datainput " << name
+ << " data type "
+ << diDef.type;
+ break;
+ }
+
+ SetAttribute(ctrlElem.elementPath.constData(),
+ ctrlElem.attributeName.first().constData(),
+ valueStr.constData());
+ break;
+ }
+ default:
+ QT3DS_ALWAYS_ASSERT_MESSAGE("Unexpected data input type");
+ break;
+ }
+ }
+
+ // Trigger re-evaluation of Evaluator datainputs that use this datainput
+ // as source data. Do this by calling setDataInputValue for evaluator
+ // with the current set value of the Evaluator (_not_ the evaluator result)
+ for (auto dependent : diDef.dependents) {
+ // Dependent list also contains the name of this datainput if
+ // the value of this datainput is used as source data. In this case
+ // obviously do not cause infinite recursion.
+ if (dependent != name)
+ SetDataInputValue(dependent, diMap[dependent].value);
+ }
+ break;
+ }
+ case qt3ds::runtime::DataInputValueRole::Max: { // switch (valueRole)
+ diDef.max = value.toFloat();
+ break;
+ }
+ case qt3ds::runtime::DataInputValueRole::Min: { // switch (valueRole)
+ diDef.min = value.toFloat();
+ break;
+ }
+ }
+ }
+}
+
+static int _idCounter = 0;
+
+void CQmlEngineImpl::createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties,
+ qt3ds::render::IQt3DSRenderer *renderer)
+{
+ using namespace qt3ds::render;
+
+ int elementIndex = -1;
+ QString error;
+ CPresentation *presentation = nullptr;
+ QStringList elementPaths;
+ elementPaths.reserve(properties.size());
+ QVector<QHash<QString, QVariant>> theProperties = properties;
+ const QString namePropName = QStringLiteral("name");
+
+ for (int i = 0; i < theProperties.size(); ++i) {
+ auto &props = theProperties[i];
+ QString newElementName = props.value(namePropName).toString();
+ if (newElementName.isEmpty()) {
+ // The id number on generated name will match generated graph object identifiers
+ newElementName = QStringLiteral("NewElement_%1").arg(_idCounter + i + 1);
+ props.insert(namePropName, newElementName);
+ }
+ elementPaths << parentElementPath + QLatin1Char('.') + newElementName;
+ }
+ QVector<TElement *> createdElements;
+ TElement *parentElement = nullptr;
+
+ auto handleError = [&]() {
+ if (!error.isEmpty())
+ deleteElements(createdElements, renderer);
+ notifyElementCreation(elementPaths, error);
+ };
+
+ // Resolve parent element
+ QByteArray theParentPath = parentElementPath.toUtf8();
+ parentElement = getTarget(theParentPath.constData());
+
+ if (!parentElement) {
+ error = QObject::tr("Invalid parent element: '%1'").arg(parentElementPath);
+ handleError();
+ return;
+ }
+
+ auto parentTranslator = static_cast<Qt3DSTranslator *>(parentElement->GetAssociation());
+
+ if (!parentTranslator || !GraphObjectTypes::IsNodeType(
+ parentTranslator->GetUIPType())) {
+ error = QObject::tr("Parent element is not a valid node: '%1'").arg(parentElementPath);
+ handleError();
+ return;
+ }
+
+ TElement &component = parentElement->GetComponentParent();
+ auto &parentObject = static_cast<SNode &>(parentTranslator->RenderObject());
+ presentation = static_cast<CPresentation *>(parentElement->GetBelongedPresentation());
+
+ // Resolve slide
+ QByteArray theSlideName = slideName.toUtf8();
+ ISlideSystem &slideSystem = presentation->GetSlideSystem();
+ int slideIndex = slideSystem.FindSlide(component, theSlideName.constData());
+ int currentSlide = static_cast<TComponent &>(component).GetCurrentSlide();
+ if (slideIndex == 0xff) {
+ error = QObject::tr("Invalid slide name for time context: '%1'").arg(slideName);
+ handleError();
+ return;
+ }
+
+ auto &strTable = presentation->GetStringTable();
+
+ const QString sourcePathPropName = QStringLiteral("sourcepath");
+ const QString startTimePropName = QStringLiteral("starttime");
+ const QString endTimePropName = QStringLiteral("endtime");
+ const QString eyeBallPropName = QStringLiteral("eyeball");
+ const QString typePropName = QStringLiteral("type");
+
+ Q3DStudio::UVariant attValue;
+ parentElement->GetAttribute(Q3DStudio::ATTRIBUTE_STARTTIME, attValue);
+ const int parentStartTime = int(attValue.m_INT32);
+ parentElement->GetAttribute(Q3DStudio::ATTRIBUTE_ENDTIME, attValue);
+ const int parentEndTime = int(attValue.m_INT32);
+
+ for (const auto &currentProps : qAsConst(theProperties)) {
+ ++_idCounter;
+ ++elementIndex;
+
+ // Remove properties requiring custom handling
+ QHash<QString, QVariant> fixedProps = currentProps;
+ QString newElementName = fixedProps.take(namePropName).toString();
+ QByteArray newElementNameBa = newElementName.toUtf8();
+
+ QString refMatName = fixedProps.take(QStringLiteral("material")).toString();
+ int colonIndex = refMatName.indexOf(QLatin1Char(':'));
+ if (colonIndex != -1)
+ refMatName = refMatName.mid(colonIndex + 1);
+ if (refMatName.startsWith(QLatin1Char('#'))) // Absolute reference
+ refMatName = refMatName.mid(1);
+ else if (!refMatName.isEmpty() && !refMatName.contains(QLatin1Char('/')))
+ refMatName = QStringLiteral("/") + refMatName;
+
+ // Make sure the name is not duplicate
+ TElement *existingChild
+ = parentElement->FindChild(CHash::HashString(newElementNameBa.constData()));
+ if (existingChild) {
+ error = QObject::tr("Element already exists: '%1'").arg(elementPaths[elementIndex]);
+ handleError();
+ return;
+ }
+
+ const CRegisteredString regName = strTable.RegisterStr(newElementNameBa);
+ TPropertyDescAndValueList elementProperties;
+ CRegisteredString metaType;
+ const CRegisteredString elementSubType;
+ GraphObjectTypes::Enum objectType = GraphObjectTypes::Unknown;
+
+ QString typeStr = fixedProps.take(typePropName).toString();
+ if (typeStr.isEmpty() || typeStr.compare(QLatin1String("model"),
+ Qt::CaseInsensitive) == 0) {
+ metaType = strTable.RegisterStr("Model");
+ objectType = GraphObjectTypes::Model;
+ } else if (typeStr.compare(QLatin1String("group"), Qt::CaseInsensitive) == 0) {
+ metaType = strTable.RegisterStr("Group");
+ objectType = GraphObjectTypes::Node;
+ }
+
+ // Set default values for missing mandatory properties
+ bool eyeBall = true;
+ fixedProps.value(eyeBallPropName, true).toBool();
+ if (objectType == GraphObjectTypes::Model && !fixedProps.contains(sourcePathPropName)) {
+ addStringAttribute(strTable, elementProperties, sourcePathPropName,
+ QStringLiteral("#Cube"));
+ }
+ if (!fixedProps.contains(startTimePropName))
+ addIntAttribute(strTable, elementProperties, startTimePropName, parentStartTime);
+ if (!fixedProps.contains(endTimePropName))
+ addIntAttribute(strTable, elementProperties, endTimePropName, parentEndTime);
+ if (!fixedProps.contains(eyeBallPropName))
+ addBoolAttribute(strTable, elementProperties, eyeBallPropName, true);
+ else
+ eyeBall = fixedProps.value(eyeBallPropName).toBool();
+
+ QHashIterator<QString, QVariant> it(fixedProps);
+ while (it.hasNext()) {
+ it.next();
+ switch (it.value().type()) {
+ case QVariant::Double:
+ addFloatAttribute(strTable, elementProperties, it.key(), it.value().toFloat());
+ break;
+ case QVariant::Bool:
+ addBoolAttribute(strTable, elementProperties, it.key(), it.value().toBool());
+ break;
+ case QVariant::Int:
+ addIntAttribute(strTable, elementProperties, it.key(), it.value().toInt());
+ break;
+ case QVariant::String:
+ addStringAttribute(strTable, elementProperties, it.key(), it.value().toString());
+ break;
+ case QVariant::Vector3D: {
+ QVector3D vec = it.value().value<QVector3D>();
+ if (it.key() == QLatin1String("rotation")) {
+ vec.setX(qDegreesToRadians(vec.x()));
+ vec.setY(qDegreesToRadians(vec.y()));
+ vec.setZ(qDegreesToRadians(vec.z()));
+ }
+ // TODO: Need to support also colors if non-model elements what need colors are
+ // TODO: supported (QT3DS-3381)
+ QStringList atts;
+ atts << (it.key() + QLatin1String(".x"))
+ << (it.key() + QLatin1String(".y"))
+ << (it.key() + QLatin1String(".z"));
+ addFloat3Attribute(strTable, elementProperties, atts, vec);
+ break;
+ }
+ default:
+ error = QObject::tr("Unsupported property type for: '%1'").arg(it.key());
+ handleError();
+ return;
+ }
+ }
+
+ // Create new element
+ QString localElementPath = elementPaths[elementIndex];
+ colonIndex = localElementPath.indexOf(QLatin1Char(':'));
+ if (colonIndex != -1)
+ localElementPath = localElementPath.mid(colonIndex + 1);
+ TElement &newElem = m_Application->GetElementAllocator().CreateElement(
+ regName, metaType, elementSubType,
+ toConstDataRef(elementProperties.data(), QT3DSU32(elementProperties.size())),
+ presentation, parentElement, false);
+ newElem.m_Path = strTable.RegisterStr(localElementPath);
+
+ // Insert the new element into the correct slide
+ if (!slideSystem.addSlideElement(component, slideIndex, newElem, eyeBall)) {
+ // Delete created element if adding to slide failed
+ m_Application->GetElementAllocator().ReleaseElement(newElem, true);
+ error = QObject::tr("Failed to add the new element to a slide");
+ handleError();
+ return;
+ }
+
+ SGraphObject *referencedMaterial = nullptr;
+ if (objectType == GraphObjectTypes::Model) {
+ // Create material element
+ const CRegisteredString matName = strTable.RegisterStr("refmat");
+ const CRegisteredString matType = strTable.RegisterStr("ReferencedMaterial");
+ TPropertyDescAndValueList matProperties;
+ TElement &newMatElem = m_Application->GetElementAllocator().CreateElement(
+ matName, matType, elementSubType,
+ toConstDataRef(matProperties.data(), QT3DSU32(matProperties.size())),
+ presentation, &newElem, false);
+
+ QString matElemPath = localElementPath + QLatin1String(".refmat");
+ newMatElem.m_Path = strTable.RegisterStr(matElemPath);
+
+ if (!slideSystem.addSlideElement(component, slideIndex, newMatElem, eyeBall)) {
+ // Delete created element and material element if adding to slide failed
+ m_Application->GetElementAllocator().ReleaseElement(newElem, true);
+ error = QObject::tr("Failed to add the new material element to a slide");
+ handleError();
+ return;
+ }
+ // First check if we can resolve the referenced material before creating any objects
+ // Find a match in material container
+ // If the specified material is not available in original presentation, or was not
+ // specified, use the first material found as placeholder
+ TElement *rootElement = presentation->GetRoot();
+ TElement *container = rootElement->FindChild(CHash::HashString("__Container"));
+ TElement *firstChild = nullptr;
+ if (container) {
+ TElement *nextChild = container->GetChild();
+ firstChild = nextChild;
+ while (nextChild) {
+ QString childName = QString::fromUtf8(nextChild->m_Name);
+ if (childName.endsWith(refMatName)) {
+ auto tr = static_cast<Qt3DSTranslator *>(
+ nextChild->GetAssociation());
+ referencedMaterial = static_cast<SGraphObject *>(
+ &tr->RenderObject());
+ break;
+ }
+ nextChild = nextChild->GetSibling();
+ }
+ }
+
+ if (!referencedMaterial) {
+ // Empty material is assumed to be deliberate, so don't warn in that case
+ if (!refMatName.isEmpty()) {
+ qWarning() << __FUNCTION__ << "Requested material" << refMatName
+ << "was not found. Trying to find a fallback material.";
+ }
+ if (firstChild) {
+ auto tr = static_cast<Qt3DSTranslator *>(firstChild->GetAssociation());
+ referencedMaterial = static_cast<SGraphObject *>(&tr->RenderObject());
+ }
+ if (!referencedMaterial) {
+ // We could create default material into the container in case there is
+ // no materials in there, but it is unlikely that such a presentation would
+ // be used in practice.
+ m_Application->GetElementAllocator().ReleaseElement(newElem, true);
+ error = QObject::tr("Unable to resolve a fallback material");
+ handleError();
+ return;
+ }
+ }
+ }
+
+ // Create model SGraphObject
+ NVAllocatorCallback &allocator = presentation->GetScene()->allocator();
+ SModel *newObject = QT3DS_NEW(allocator, SModel)();
+ newObject->m_Id = strTable.RegisterStr((QByteArrayLiteral("__newObj_")
+ + QByteArray::number(_idCounter)).constData());
+ parentObject.AddChild(*newObject);
+
+ Qt3DSTranslator::CreateTranslatorForElement(newElem, *newObject, allocator);
+
+ if (referencedMaterial) {
+ // Create material SGraphObject
+ SReferencedMaterial *newMaterial = QT3DS_NEW(allocator, SReferencedMaterial)();
+ newMaterial->m_Id = strTable.RegisterStr(
+ (QByteArrayLiteral("__newMat_")
+ + QByteArray::number(_idCounter)).constData());
+ newMaterial->m_ReferencedMaterial = referencedMaterial;
+ newObject->AddMaterial(*newMaterial);
+ }
+
+ // Determine if element should be active based on start/end times
+ TTimeUnit startTime = 0;
+ TTimeUnit stopTime = 0;
+ if (newElem.GetAttribute(Q3DStudio::ATTRIBUTE_STARTTIME, attValue))
+ startTime = TTimeUnit(attValue.m_INT32);
+ if (newElem.GetAttribute(Q3DStudio::ATTRIBUTE_ENDTIME, attValue))
+ stopTime = TTimeUnit(attValue.m_INT32);
+ TTimeUnit localTime = newElem.GetActivityZone().GetItemLocalTime(newElem);
+
+ bool isActiveRightNow = eyeBall && localTime >= startTime && localTime <= stopTime
+ && currentSlide == slideIndex;
+
+ newElem.SetActive(isActiveRightNow);
+ newObject->m_Flags.SetActive(isActiveRightNow);
+ if (eyeBall)
+ newElem.GetActivityZone().UpdateItemInfo(newElem);
+
+ createdElements << &newElem;
+ }
+
+ bool isPrimary = presentation == m_Application->GetPrimaryPresentation() ? true : false;
+ initializeDataInputsInPresentation(*presentation, isPrimary, createdElements.toList());
+
+ renderer->ChildrenUpdated(parentObject);
+
+ handleError();
+}
+
+// Only supports deleting element types that can be added via createElement.
+void CQmlEngineImpl::deleteElements(const QStringList &elementPaths,
+ qt3ds::render::IQt3DSRenderer *renderer)
+{
+ QVector<TElement *> elements;
+ // Convert the path list to set for quicker lookups
+ QSet<QString> pathSet = elementPaths.toSet();
+
+ for (auto &elementPath : elementPaths) {
+ // Check that parent is not already included in the deleted elements
+ int idx = elementPath.lastIndexOf(QLatin1Char('.'));
+ bool parentFound = false;
+ while (idx != -1) {
+ QString parentPath = elementPath.left(idx);
+ if (pathSet.contains(parentPath)) {
+ parentFound = true;
+ break;
+ }
+ idx = parentPath.lastIndexOf(QLatin1Char('.'));
+ }
+ if (!parentFound) {
+ // Resolve element
+ QByteArray thePath = elementPath.toUtf8();
+ TElement *element = getTarget(thePath.constData());
+ if (element)
+ elements << element;
+ }
+ }
+ deleteElements(elements, renderer);
+}
+
+TElement *CQmlEngineImpl::createMaterialContainer(TElement *parent, CPresentation *presentation)
+{
+ TPropertyDescAndValueList prop;
+ auto &strTable = presentation->GetStringTable();
+ const auto matName = strTable.RegisterStr(QStringLiteral("__Container"));
+ const auto matType = strTable.RegisterStr(QStringLiteral("Material"));
+ const auto matClass = CRegisteredString();
+ TElement &element = m_Application->GetElementAllocator().CreateElement(
+ matName, matType, matClass,
+ toConstDataRef(prop.data(), prop.size()),
+ presentation, parent, false);
+ return &element;
+}
+
+/**
+ Creates material into material container of the specified subpresentation.
+ The materialDefinition parameter can contain a .materialdef file path or
+ the entire material definition in the .materialdef format.
+*/
+void CQmlEngineImpl::createMaterials(const QString &subPresId,
+ const QStringList &materialDefinitions,
+ ICustomMaterialSystem *customMaterialSystem,
+ IDynamicObjectSystem *dynamicObjectSystem,
+ qt3ds::render::IQt3DSRenderer *renderer)
+{
+ CPresentation *presentation = nullptr;
+ QString error;
+ QString presPath;
+ QString projPath;
+ struct MaterialInfo {
+ QString materialDefinition;
+ QString materialName;
+ QMap<QString, QString> materialProps;
+ QMap<QString, QMap<QString, QString>> textureProps;
+ };
+ QVector<MaterialInfo *> materialInfos;
+ QVector<TElement *> createdElements;
+
+ auto handleError = [&]() {
+ if (!error.isEmpty())
+ deleteElements(createdElements, renderer);
+ QStringList materialNames;
+ QString prefix;
+ if (!subPresId.isEmpty())
+ prefix = subPresId + QLatin1Char(':');
+ for (auto &materialInfo : materialInfos)
+ materialNames << prefix + materialInfo->materialName;
+ qDeleteAll(materialInfos);
+ notifyMaterialCreation(materialNames, error);
+ };
+
+ auto getMaterialInfos = [&]() {
+ for (auto &materialDefinition : materialDefinitions) {
+ MaterialInfo *info = new MaterialInfo;
+ info->materialDefinition = materialDefinition;
+ Q3DSMaterialDefinitionParser::getMaterialInfo(materialDefinition, projPath, presPath,
+ info->materialName, info->materialProps,
+ info->textureProps);
+ materialInfos << info;
+ }
+ };
+
+ QByteArray theSubPresId = subPresId.toUtf8();
+ if (theSubPresId.isEmpty())
+ presentation = m_Application->GetPrimaryPresentation();
+ else
+ presentation = m_Application->GetPresentationById(theSubPresId.constData());
+
+ if (!presentation) {
+ error = QObject::tr("Invalid presentation ID: '%1'").arg(subPresId);
+ presentation = m_Application->GetPrimaryPresentation();
+ presPath = QFileInfo(presentation->GetFilePath()).absolutePath();
+ projPath = presentation->getProjectPath();
+ getMaterialInfos();
+ handleError();
+ return;
+ }
+
+ presPath = QFileInfo(presentation->GetFilePath()).absolutePath();
+ projPath = presentation->getProjectPath();
+ getMaterialInfos();
+
+ // Find material container
+ auto &strTable = presentation->GetStringTable();
+ NVAllocatorCallback &allocator = presentation->GetScene()->allocator();
+ TElement *rootElement = presentation->GetRoot();
+ const auto containerName = strTable.RegisterStr("__Container");
+ TElement *container = rootElement->FindChild(CHash::HashString(containerName.c_str()));
+ if (!container)
+ container = createMaterialContainer(rootElement, presentation);
+
+ for (auto &materialInfo : materialInfos) {
+ if (materialInfo->materialName.isEmpty() || materialInfo->materialProps.isEmpty()) {
+ error = QObject::tr("Invalid material definition: '%1'")
+ .arg(materialInfo->materialDefinition);
+ handleError();
+ return;
+ }
+
+ // We don't care about the path parameter
+ const QString pathStr = QStringLiteral("path");
+ if (materialInfo->materialProps.contains(pathStr))
+ materialInfo->materialProps.remove(pathStr);
+
+ // Check that the material doesn't already exist in container
+ TElement *firstChild = nullptr;
+ TElement *nextChild = container->GetChild();
+ firstChild = nextChild;
+ while (nextChild) {
+ QString childName = QString::fromUtf8(nextChild->m_Name);
+ if (childName == materialInfo->materialName) {
+ error = QObject::tr("Material already exists in material container");
+ handleError();
+ return;
+ }
+ nextChild = nextChild->GetSibling();
+ }
+
+ // Create material element in the container based on the material definition
+ auto &metaData = m_Application->GetMetaData();
+ const auto matName = strTable.RegisterStr(materialInfo->materialName);
+ const bool isCustomMaterial = (materialInfo->materialProps.value(QStringLiteral("type"))
+ == QLatin1String("CustomMaterial"));
+ CRegisteredString matType;
+ CRegisteredString matClass;
+ QHash<QString, qt3ds::render::dynamic::SPropertyDefinition> dynPropDefs;
+
+ if (isCustomMaterial) {
+ CRegisteredString sourcePath
+ = strTable.RegisterStr(materialInfo->materialProps.value(
+ QStringLiteral("sourcepath")).toUtf8());
+ matType = strTable.RegisterStr("CustomMaterial");
+ matClass = sourcePath; // Create just one class per shader
+ if (sourcePath.IsValid()) {
+ Option<qt3dsdm::SMetaDataCustomMaterial> matMetaData =
+ metaData.GetMaterialMetaDataBySourcePath(sourcePath.c_str());
+ if (!matMetaData.hasValue()) {
+ metaData.LoadMaterialXMLFile(matType.c_str(), matClass.c_str(), matName.c_str(),
+ sourcePath.c_str());
+ matMetaData = metaData.GetMaterialMetaDataBySourcePath(sourcePath.c_str());
+ }
+ if (matMetaData.hasValue()) {
+ qt3ds::render::IUIPLoader::CreateMaterialClassFromMetaMaterial(
+ matClass, m_Foundation, *customMaterialSystem, matMetaData,
+ strTable);
+ NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> customProperties;
+ customProperties = dynamicObjectSystem->GetProperties(matClass);
+ for (QT3DSU32 i = 0, end = customProperties.size(); i < end; ++i) {
+ QString propName = QString::fromUtf8(customProperties[i].m_Name.c_str());
+ if (materialInfo->materialProps.contains(propName))
+ dynPropDefs.insert(propName, customProperties[i]);
+ }
+ } else {
+ error = QObject::tr("Could not resolve properties for CustomMaterial");
+ handleError();
+ return;
+ }
+ } else {
+ error = QObject::tr("Missing sourcepath in definition of CustomMaterial");
+ handleError();
+ return;
+ }
+ } else {
+ matType = strTable.RegisterStr("Material");
+ }
+
+ auto createElementPropsFromDefProps = [&](const QMap<QString, QString> &defProps,
+ TPropertyDescAndValueList &elementProps,
+ const CRegisteredString &elementType) {
+ QMapIterator<QString, QString> propIter(defProps);
+ while (propIter.hasNext()) {
+ propIter.next();
+ if (dynPropDefs.contains(propIter.key()))
+ continue; // Dynamic properties are added directly to graph objects later
+
+ auto propName = strTable.RegisterStr(propIter.key());
+ ERuntimeDataModelDataType dataType;
+ ERuntimeAdditionalMetaDataType additionalType;
+ dataType = metaData.GetPropertyType(elementType, propName);
+ additionalType = metaData.GetAdditionalType(elementType, propName);
+
+ switch (dataType) {
+ case ERuntimeDataModelDataTypeLong: {
+ addIntAttribute(strTable, elementProps, propIter.key(),
+ propIter.value().toInt());
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat: {
+ addFloatAttribute(strTable, elementProps, propIter.key(),
+ propIter.value().toFloat());
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat2: {
+ QVector2D vec = parseFloat2Property(propIter.value());
+ QStringList atts;
+ atts << (propIter.key() + QLatin1String(".x"))
+ << (propIter.key() + QLatin1String(".y"));
+ addFloat2Attribute(strTable, elementProps, atts, vec);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat3: {
+ QVector3D vec = parseFloat3Property(propIter.value());
+ if (additionalType == ERuntimeAdditionalMetaDataTypeRotation) {
+ vec.setX(qDegreesToRadians(vec.x()));
+ vec.setY(qDegreesToRadians(vec.y()));
+ vec.setZ(qDegreesToRadians(vec.z()));
+ }
+ QStringList atts;
+ atts << (propIter.key() + QLatin1String(".x"))
+ << (propIter.key() + QLatin1String(".y"))
+ << (propIter.key() + QLatin1String(".z"));
+ addFloat3Attribute(strTable, elementProps, atts, vec);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat4: {
+ QVector4D vec = parseFloat4Property(propIter.value());
+ QStringList atts;
+ if (additionalType == ERuntimeAdditionalMetaDataTypeColor) {
+ atts << (propIter.key() + QLatin1String(".r"))
+ << (propIter.key() + QLatin1String(".g"))
+ << (propIter.key() + QLatin1String(".b"))
+ << (propIter.key() + QLatin1String(".a"));
+ } else {
+ atts << (propIter.key() + QLatin1String(".x"))
+ << (propIter.key() + QLatin1String(".y"))
+ << (propIter.key() + QLatin1String(".z"))
+ << (propIter.key() + QLatin1String(".w"));
+ }
+ addFloat4Attribute(strTable, elementProps, atts, vec);
+ break;
+ }
+ case ERuntimeDataModelDataTypeBool: {
+ bool boolValue = propIter.value().compare(QLatin1String("true"),
+ Qt::CaseInsensitive) == 0;
+ addBoolAttribute(strTable, elementProps, propIter.key(), boolValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeStringRef:
+ case ERuntimeDataModelDataTypeString: {
+ addStringAttribute(strTable, elementProps, propIter.key(), propIter.value());
+ break;
+ }
+ case ERuntimeDataModelDataTypeLong4: {
+ if (additionalType == ERuntimeAdditionalMetaDataTypeImage) {
+ // Insert placeholder for now, will be patched later
+ addElementRefAttribute(strTable, elementProps, propIter.key(), nullptr);
+ }
+ break;
+ }
+ default:
+ error = QObject::tr("Unsupported material property type for property: '%1'")
+ .arg(propIter.key());
+ return;
+ }
+ }
+ };
+
+ TPropertyDescAndValueList elementProps;
+ createElementPropsFromDefProps(materialInfo->materialProps, elementProps, matType);
+ if (!error.isEmpty()) {
+ handleError();
+ return;
+ }
+
+ TElement &newMatElem = m_Application->GetElementAllocator().CreateElement(
+ matName, matType, matClass,
+ toConstDataRef(elementProps.data(), QT3DSU32(elementProps.size())),
+ presentation, container, false);
+ newMatElem.SetActive(true);
+
+ // Create image elements
+ CRegisteredString imageType = strTable.RegisterStr("Image");
+ QMapIterator<QString, QMap<QString, QString>> texIter(materialInfo->textureProps);
+ QHash<QString, TElement *> imageElementMap;
+ while (texIter.hasNext()) {
+ texIter.next();
+ elementProps.clear();
+ createElementPropsFromDefProps(texIter.value(), elementProps, imageType);
+ if (!error.isEmpty()) {
+ m_Application->GetElementAllocator().ReleaseElement(newMatElem, true);
+ handleError();
+ return;
+ }
+ CRegisteredString imageName = strTable.RegisterStr(texIter.key());
+
+ TElement &newImageElem = m_Application->GetElementAllocator().CreateElement(
+ imageName, imageType, CRegisteredString(),
+ toConstDataRef(elementProps.data(), QT3DSU32(elementProps.size())),
+ presentation, &newMatElem, false);
+ imageElementMap.insert(texIter.key(), &newImageElem);
+ newImageElem.SetActive(true);
+ }
+
+ // Create render object for the material
+ qt3ds::render::SGraphObject *newMaterial = nullptr;
+ CRegisteredString newMatId = strTable.RegisterStr(
+ (QByteArrayLiteral("__newMat_") + QByteArray::number(++_idCounter))
+ .constData());
+ if (isCustomMaterial) {
+ newMaterial = customMaterialSystem->CreateCustomMaterial(matClass, allocator);
+ newMaterial->m_Id = newMatId;
+ auto dynObj = static_cast<qt3ds::render::SDynamicObject *>(newMaterial);
+
+ QHashIterator<QString, qt3ds::render::dynamic::SPropertyDefinition>
+ dynPropIter(dynPropDefs);
+ while (dynPropIter.hasNext()) {
+ dynPropIter.next();
+ QByteArray propValStr = materialInfo->materialProps.value(
+ dynPropIter.key()).toUtf8();
+ const auto propDesc = dynPropIter.value();
+ switch (propDesc.m_DataType) {
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool: {
+ bool boolValue = propValStr.compare(QByteArrayLiteral("true"),
+ Qt::CaseInsensitive) == 0;
+ setDynamicObjectProperty(*dynObj, propDesc, boolValue);
+ break;
+ }
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSF32:
+ setDynamicObjectProperty(*dynObj, propDesc, propValStr.toFloat());
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSI32:
+ if (!propDesc.m_IsEnumProperty) {
+ setDynamicObjectProperty(*dynObj, propDesc, propValStr.toInt());
+ } else {
+ const NVConstDataRef<CRegisteredString> &enumNames
+ = propDesc.m_EnumValueNames;
+ for (QT3DSU32 i = 0, end = enumNames.size(); i < end; ++i) {
+ if (propValStr.compare(enumNames[i].c_str()) == 0) {
+ setDynamicObjectProperty(*dynObj, propDesc, i);
+ break;
+ }
+ }
+ }
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec2:
+ setDynamicObjectProperty(*dynObj, propDesc, parseFloat2Property(propValStr));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec3:
+ setDynamicObjectProperty(*dynObj, propDesc, parseFloat3Property(propValStr));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4:
+ setDynamicObjectProperty(*dynObj, propDesc, parseFloat4Property(propValStr));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr:
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderImage2DPtr: {
+ CRegisteredString regStr;
+ regStr = strTable.RegisterStr(propValStr);
+ setDynamicObjectProperty(*dynObj, propDesc, regStr);
+ break;
+ }
+ default:
+ error = QObject::tr("Unsupported custom material property type for '%1'")
+ .arg(dynPropIter.key());
+ m_Application->GetElementAllocator().ReleaseElement(newMatElem, true);
+ handleError();
+ return;
+ }
+ }
+ } else {
+ newMaterial = QT3DS_NEW(allocator, qt3ds::render::SDefaultMaterial)();
+ newMaterial->m_Id = newMatId;
+
+ // Update element refs for image elements and create graph objects & translators
+ QHashIterator<QString, TElement *> imageIter(imageElementMap);
+ while (imageIter.hasNext()) {
+ imageIter.next();
+ TElement *imageElem = imageIter.value();
+ UVariant *propValue = newMatElem.FindPropertyValue(imageElem->m_Name);
+ if (propValue) {
+ propValue->m_ElementHandle = imageIter.value()->GetHandle();
+
+ qt3ds::render::SImage *newImageObj
+ = QT3DS_NEW(allocator, qt3ds::render::SImage)();
+ newImageObj->m_Id = strTable.RegisterStr(
+ (QByteArrayLiteral("__newImage_")
+ + QByteArray::number(++_idCounter)).constData());
+ qt3ds::render::Qt3DSTranslator::CreateTranslatorForElement(
+ *imageElem, *newImageObj, allocator);
+ }
+ }
+ createdElements << &newMatElem;
+ }
+
+ qt3ds::render::Qt3DSTranslator::CreateTranslatorForElement(newMatElem, *newMaterial,
+ allocator);
+ }
+
+ handleError();
+}
+
+void CQmlEngineImpl::deleteMaterials(const QStringList &materialNames, IQt3DSRenderer *renderer)
+{
+ // Material class (i.e. the shader) is not deleted as those can be shared between materials,
+ // so we just delete the material elements from the container and the related render objects
+
+ // Sort materials to presentations
+ QMultiHash<QString, QString> presMaterialMap;
+ QSet<QString> presIds;
+ for (const auto &matName : materialNames) {
+ QString presId;
+ QString localName = matName;
+ int index = matName.indexOf(QLatin1Char(':'));
+ if (index != -1) {
+ presId = matName.left(index);
+ localName = matName.mid(index + 1);
+ }
+ presMaterialMap.insert(presId, localName);
+ presIds.insert(presId);
+ }
+ for (const auto &presId : qAsConst(presIds)) {
+ QByteArray theId = presId.toUtf8();
+ CPresentation *presentation = nullptr;
+ if (presId.isEmpty())
+ presentation = m_Application->GetPrimaryPresentation();
+ else
+ presentation = m_Application->GetPresentationById(theId.constData());
+
+ if (presentation) {
+ // Find material container
+ auto &strTable = presentation->GetStringTable();
+ TElement *rootElement = presentation->GetRoot();
+ const auto containerName = strTable.RegisterStr("__Container");
+ TElement *container = rootElement->FindChild(CHash::HashString(containerName.c_str()));
+ Q_ASSERT_X(container, __FUNCTION__,
+ QStringLiteral("No material container found for presentation: '%1'")
+ .arg(presId).toUtf8());
+
+ QVector<TElement *> elementsToDelete;
+ const QList<QString> matNames = presMaterialMap.values(presId);
+ for (const auto &materialName : matNames) {
+ TElement *firstChild = nullptr;
+ TElement *nextChild = container->GetChild();
+ firstChild = nextChild;
+ bool added = false;
+ while (nextChild) {
+ QString childName = QString::fromUtf8(nextChild->m_Name);
+ if (childName == materialName) {
+ elementsToDelete << nextChild;
+ added = true;
+ break;
+ }
+ nextChild = nextChild->GetSibling();
+ }
+ if (!added) {
+ if (presId.isEmpty()) {
+ qWarning() << __FUNCTION__
+ << QStringLiteral("Could not find material '%1'")
+ .arg(materialName);
+ } else {
+ qWarning() << __FUNCTION__
+ << QStringLiteral("Could not find material '%1' in '%2'")
+ .arg(materialName).arg(presId);
+ }
+ }
+ }
+ deleteElements(elementsToDelete, renderer);
+ } else {
+ qWarning() << __FUNCTION__ << "Warning: Presentation ID could not be resolved:"
+ << presId;
+ }
+ }
+}
+
+void CQmlEngineImpl::createMesh(const QString &name, qt3dsimp::Mesh *mesh,
+ qt3ds::render::IBufferManager *bufferManager)
+{
+ // Add the custom meshes to buffer manager.
+ bufferManager->loadCustomMesh(name, mesh);
+}
+
+void CQmlEngineImpl::deleteMeshes(const QStringList &meshNames,
+ qt3ds::render::IBufferManager *bufferManager)
+{
+ for (const auto &meshName : meshNames) {
+ if (!meshName.isEmpty()) {
+ CRegisteredString regName = bufferManager->GetStringTable().RegisterStr(meshName);
+ bufferManager->InvalidateBuffer(regName);
+ }
+ }
+}
+
+void CQmlEngineImpl::GotoSlide(const char *component, const char *slideName,
+ const SScriptEngineGotoSlideArgs &inArgs)
+{
+ TElement *theTarget = getTarget(component);
+ if (theTarget) {
+ CQmlCommandHelper::SetupGotoSlideCommand(*theTarget, slideName, inArgs);
+ } else {
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::GotoSlide: Unable to find component " << component;
+ }
+}
+
+void CQmlEngineImpl::GotoSlideRelative(const char *component, bool inNextSlide, bool inWrap,
+ const SScriptEngineGotoSlideArgs &inArgs)
+{
+ TElement *theTarget = getTarget(component);
+ if (theTarget) {
+ theTarget = &theTarget->GetComponentParent();
+ if (theTarget && theTarget->GetActive()) {
+ TComponent *theComponent = static_cast<TComponent *>(theTarget);
+ Q3DStudio::INT32 theSlide = theComponent->GetCurrentSlide();
+ Q3DStudio::INT32 theSlideCount = theComponent->GetSlideCount();
+ theSlide = inNextSlide ? theSlide + 1 : theSlide - 1;
+ if (theSlide < 1) {
+ if (inWrap)
+ theSlide = theSlideCount - 1;
+ else
+ theSlide = 1;
+ } else if (theSlide == theSlideCount) {
+ if (inWrap)
+ theSlide = 1;
+ else
+ theSlide = theSlideCount - 1;
+ }
+ if (theSlide != theComponent->GetCurrentSlide()) {
+ CQmlCommandHelper::SetupGotoSlideCommand(*theTarget, theSlide, inArgs);
+ }
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "QmlEngine::GotoSlideRelative: Component is not active: " << component;
+ }
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "QmlEngine::GotoSlideRelative: failed to find component: " << component;
+ }
+}
+
+void CQmlEngineImpl::SetPresentationAttribute(const char *presId, const char *, const char *value)
+{
+ if (isTrivial(presId))
+ return;
+ if (presId[0] == '#')
+ ++presId;
+ CPresentation *thePresentation = m_Application->GetPresentationById(presId);
+ if (thePresentation) {
+ bool active = AreEqualCaseless(nonNull(value), "True");
+ thePresentation->SetActive(active);
+ }
+}
+
+void CQmlEngineImpl::GotoSlideIndex(const char *component, const Q3DStudio::INT32 slideIndex,
+ const SScriptEngineGotoSlideArgs &inArgs)
+{
+ TElement *theTarget = getTarget(component);
+ if (theTarget) {
+ CQmlCommandHelper::SetupGotoSlideCommand(*theTarget, slideIndex, inArgs);
+ } else {
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::GotoSlide: Unable to find component " << component;
+ }
+}
+
+bool CQmlEngineImpl::GetSlideInfo(const char *element, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+
+ TElement *theTarget = getTarget(element);
+ if (theTarget && theTarget->IsComponent()) {
+ IPresentation *thePresentation = theTarget->GetBelongedPresentation();
+ TComponent *theComponent = thePresentation->GetComponentManager().GetComponent(theTarget);
+ currentIndex = int(theComponent->GetCurrentSlide());
+ previousIndex = int(theComponent->GetPreviousSlide());
+ if (currentIndex > 0) {
+ currentName = QString::fromLocal8Bit(
+ thePresentation->GetSlideSystem().GetSlideName(
+ qt3ds::runtime::SSlideKey(*theComponent, QT3DSU32(currentIndex))));
+ } else {
+ currentName.clear();
+ }
+ if (previousIndex > 0) {
+ previousName = QString::fromLocal8Bit(
+ thePresentation->GetSlideSystem().GetSlideName(
+ qt3ds::runtime::SSlideKey(*theComponent, QT3DSU32(previousIndex))));
+ } else {
+ previousName.clear();
+ }
+ return true;
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::GetSlideInfo: Supplied element is not a component " << element;
+ }
+ return false;
+}
+
+void CQmlEngineImpl::GotoTime(const char *component, const Q3DStudio::FLOAT time)
+{
+ TElement *theTarget = getTarget(component);
+ if (theTarget && theTarget->GetActive()) {
+ UVariant theArg1;
+ UVariant theArg2;
+
+ IPresentation *thePresentation = theTarget->GetBelongedPresentation();
+
+ theArg1.m_INT32 = static_cast<INT32>(time * 1000);
+
+ TElement *theParentTarget = &theTarget->GetComponentParent();
+
+ thePresentation->FireCommand(COMMAND_GOTOTIME, theParentTarget, &theArg1, &theArg2);
+ }
+}
+
+bool CQmlEngineImpl::RegisterCallback(Q3DStudio::UINT32 callbackType,
+ const TScriptCallback inCallback, void *inUserData)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+ return m_ScriptCallbacks.RegisterCallback(callbackType, inCallback, inUserData);
+}
+
+void CQmlEngineImpl::ProcessFrameCallbacks(IPresentation *)
+{
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+ m_ScriptCallbacks.ProcessCallbacks();
+
+ for (Q3DSQmlScript *script : m_scripts)
+ script->update();
+}
+
+void CQmlEngineImpl::ProcessSignal(IPresentation *inPresentation,
+ const SEventCommand &inCommand)
+{
+ using qt3ds::runtime::TIdValuePair;
+ QML_ENGINE_MULTITHREAD_PROTECT_METHOD;
+ TElement *theElement = inCommand.m_Target; // the element that is a behavior
+
+ CPresentation *thePresentation = (CPresentation *)inPresentation;
+ // IParametersSystem& theParametersManager = thePresentation->GetParametersSystem();
+ qt3ds::foundation::IStringTable &theStrTable(thePresentation->GetStringTable());
+
+ CRegisteredString theSignal = theStrTable.HandleToStr(inCommand.m_Arg1.m_INT32);
+
+ if (!theSignal.IsValid() || m_EmitSignalDataList.size() > CQmlEngineImpl::MAX_ACTION_QUEUE_SIZE)
+ return;
+
+ TEmitSignalPtr theTemp = QT3DS_NEW(m_Foundation.getAllocator(), SEmitSignalData)(
+ m_Foundation.getAllocator(), inCommand.m_Arg1.m_INT32, theElement);
+ m_EmitSignalDataList.push_back(theTemp);
+}
+
+
+//==============================================================================
+/**
+* Handle custom actions
+* @param inCommand carrier of command and parameter information
+*/
+void CQmlEngineImpl::ProcessCustomActions(IPresentation *presentation,
+ const SEventCommand &command)
+{
+ TElement *element = command.m_Target;
+ for (Q3DSQmlScript *script : m_scripts) {
+ if (script->hasBehavior(element)) {
+ IParametersSystem &parametersManager
+ = static_cast<CPresentation *>(presentation)->GetParametersSystem();
+ INT32 groupId = command.m_Arg1.m_INT32;
+ UINT32 numParams = parametersManager.GetNumParameters(groupId);
+ if (numParams == 0) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ qt3ds::runtime::TIdValuePair tempData = parametersManager.GetParameter(groupId, 0);
+ if (tempData.first != CHash::HashString("string")) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ CRegisteredString functionName = presentation->GetStringTable().HandleToStr(
+ tempData.second.m_StringHandle);
+ script->call(functionName.c_str());
+ return;
+ }
+ }
+}
+
+bool CQmlEngineImpl::PeekSignal(TElement *&outElement, char *&outName)
+{
+ if (m_EmitSignalDataList.empty())
+ return false;
+
+ NVScopedRefCounted<SEmitSignalData> theAction = m_EmitSignalDataList.front();
+ m_EmitSignalDataList.pop_front();
+
+ outElement = theAction->m_TargetElement;
+ if (outElement) {
+ IPresentation *thePresentation = outElement->GetBelongedPresentation();
+ qt3ds::foundation::IStringTable &theStrTable(thePresentation->GetStringTable());
+ CRegisteredString theSignal = theStrTable.HandleToStr(theAction->m_SignalNameHandler);
+ outName = (char *)theSignal.c_str();
+ } else {
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "CQmlEngineImpl::PeekCustomAction: Unable to find element: EmitSignal queue error";
+ outName = NULL;
+ }
+
+ return true;
+}
+
+void CQmlEngineImpl::createComponent(QQmlComponent *component, TElement *element)
+{
+ TElement *parent = element->GetParent();
+ if (!parent)
+ return;
+
+ QQmlContext *context = new QQmlContext(&m_engine, &m_engine);
+ QObject *obj = component->beginCreate(context);
+ if (!obj) {
+ context->deleteLater();
+ return;
+ }
+ Q3DSQmlBehavior *behaviorObject = qobject_cast<Q3DSQmlBehavior *>(obj);
+ if (behaviorObject == nullptr) {
+ obj->deleteLater();
+ context->deleteLater();
+ return;
+ }
+
+ auto script = new Q3DSQmlScript(*this, *behaviorObject, *element, *parent);
+ component->completeCreate();
+ behaviorObject->setScript(script);
+
+ script->setParent(component);
+ obj->setParent(script);
+ m_scripts.push_back(script);
+}
+
+TElement *CQmlEngineImpl::getTarget(const char *component) {
+ TElement *target = NULL;
+ QStringList split = QString(component).split(":");
+ if (split.size() > 1) {
+ target = CQmlElementHelper::GetElement(
+ *m_Application,
+ m_Application->GetPresentationById(split.at(0).toStdString().c_str()),
+ split.at(1).toStdString().c_str(), NULL);
+ } else {
+ target = CQmlElementHelper::GetElement(
+ *m_Application,
+ m_Application->GetPrimaryPresentation(),
+ split.at(0).toStdString().c_str(), NULL);
+ }
+ return target;
+}
+
+void CQmlEngineImpl::listAllElements(TElement *root, QList<TElement *> &elements)
+{
+ elements.append(root);
+ TElement *nextChild = root->GetChild();
+ while (nextChild) {
+ listAllElements(nextChild, elements);
+ nextChild = nextChild->GetSibling();
+ }
+}
+
+// Initializes datainput bindings in the presentation starting by default from the root element.
+// If inElements is specified, only parses the specified elements.
+void CQmlEngineImpl::initializeDataInputsInPresentation(CPresentation &presentation,
+ bool isPrimary,
+ QList<TElement *> inElements)
+{
+ QList<TElement *> elements;
+ if (!inElements.empty()) {
+ elements = inElements;
+ } else {
+ TElement *parent = presentation.GetRoot();
+ listAllElements(parent, elements);
+ }
+ qt3ds::runtime::DataInputMap &diMap = m_Application->dataInputMap();
+
+// #TODO: Remove below once QT3DS-3510 has been implemented in the editor
+ qt3ds::runtime::DataOutputMap &doMap = m_Application->dataOutputMap();
+// #TODO: Remove above once QT3DS-3510 has been implemented in the editor
+
+ qt3ds::foundation::IStringTable &strTable(presentation.GetStringTable());
+ QHash<CRegisteredString, qt3ds::runtime::DataOutputDef> elementPathToDataOutputDefMap;
+ for (TElement *element : qAsConst(elements)) {
+ Option<QT3DSU32> ctrlIndex = element->FindPropertyIndex(ATTRIBUTE_CONTROLLEDPROPERTY);
+ if (ctrlIndex.hasValue()) {
+ Option<qt3ds::runtime::element::TPropertyDescAndValuePtr> propertyInfo =
+ element->GetPropertyByIndex(*ctrlIndex);
+ UVariant *valuePtr = propertyInfo->second;
+ QString valueStr =
+ QString::fromUtf8(strTable.HandleToStr(valuePtr->m_StringHandle));
+ if (!valueStr.isEmpty()) {
+ QStringList splitValues = valueStr.split(QChar(' '));
+ for (int i = 1; i < splitValues.size(); i += 2) {
+ QString controllerName = splitValues[i - 1];
+ // remove datainput name prefix "$"
+ controllerName.remove(0, 1);
+ if (diMap.contains(controllerName)) {
+ qt3ds::runtime::DataInOutAttribute ctrlElem;
+ if (!isPrimary) {
+ // Prepend presentation id to element path
+ ctrlElem.elementPath = presentation.GetName();
+ ctrlElem.elementPath.append(QByteArrayLiteral(":"));
+ }
+ ctrlElem.attributeName.append(splitValues[i].toUtf8());
+ if (ctrlElem.attributeName.first() == QByteArrayLiteral("@timeline")) {
+ ctrlElem.propertyType = ATTRIBUTETYPE_DATAINPUT_TIMELINE;
+ TElement *component = &element->GetComponentParent();
+ ctrlElem.elementPath.append(component->m_Path);
+ } else if (ctrlElem.attributeName.first() == QByteArrayLiteral("@slide")) {
+ ctrlElem.propertyType = ATTRIBUTETYPE_DATAINPUT_SLIDE;
+ TElement *component = &element->GetComponentParent();
+ ctrlElem.elementPath.append(component->m_Path);
+ } else if (diMap[controllerName].type
+ == qt3ds::runtime::DataInOutTypeVector3) {
+ // special handling for vector datatype to handle
+ // expansion from <propertyname> to <propertyname>.x .y .z
+ QVector<QByteArray> attVec;
+ bool success = getAttributeVector3(
+ attVec, ctrlElem.attributeName.first().constData(),
+ element);
+ if (!attVec.empty() && success) {
+ ctrlElem.attributeName = attVec;
+ ctrlElem.elementPath.append(element->m_Path);
+ ctrlElem.propertyType = ATTRIBUTETYPE_FLOAT3;
+ } else {
+ qWarning() << __FUNCTION__ << "Property "
+ << ctrlElem.attributeName.first()
+ << " was not expanded to vector";
+ ctrlElem.propertyType = ATTRIBUTETYPE_NONE;
+ }
+ } else if (diMap[controllerName].type
+ == qt3ds::runtime::DataInOutTypeVector2) {
+ // special handling for vector datatype to handle
+ // expansion from <propertyname> to <propertyname>.x .y
+ QVector<QByteArray> attVec;
+ bool success = getAttributeVector2(
+ attVec, ctrlElem.attributeName.first().constData(),
+ element);
+ if (!attVec.empty() && success) {
+ ctrlElem.attributeName = attVec;
+ ctrlElem.elementPath.append(element->m_Path);
+ ctrlElem.propertyType = ATTRIBUTETYPE_FLOAT2;
+ } else {
+ qWarning() << __FUNCTION__ << "Property "
+ << ctrlElem.attributeName.first()
+ << " was not expanded to vector";
+ ctrlElem.propertyType = ATTRIBUTETYPE_NONE;
+ }
+ } else if (diMap[controllerName].type
+ == qt3ds::runtime::DataInOutTypeEvaluator) {
+ diMap[controllerName].evalFunc
+ = buildJSFunc(diMap[controllerName].evaluator);
+ auto referencedDIs = resolveDependentDatainputs(
+ diMap[controllerName].evaluator, controllerName);
+ // add this evaluator datainput to the dependent list
+ // for those datainputs that are used in the expression
+ // for this evaluator
+ for (auto ref : referencedDIs)
+ diMap[ref].dependents.append(controllerName);
+
+ ctrlElem.elementPath.append(element->m_Path);
+ TStringHash attHash = CHash::HashAttribute(
+ ctrlElem.attributeName.first().constData());
+ Option<qt3ds::runtime::element::TPropertyDescAndValuePtr> attInfo
+ = element->FindProperty(attHash);
+ if (attInfo.hasValue())
+ ctrlElem.propertyType = attInfo->first.m_Type;
+ } else {
+ // all other scalar datatypes
+ ctrlElem.elementPath.append(element->m_Path);
+ TStringHash attHash = CHash::HashAttribute(
+ ctrlElem.attributeName.first().constData());
+ Option<qt3ds::runtime::element::TPropertyDescAndValuePtr> attInfo
+ = element->FindProperty(attHash);
+ if (attInfo.hasValue()) {
+ ctrlElem.propertyType = attInfo->first.m_Type;
+ } else {
+ ctrlElem.propertyType = ATTRIBUTETYPE_NONE;
+ qWarning() << __FUNCTION__ << "Property "
+ << ctrlElem.attributeName.first() << " not existing!";
+ }
+ }
+ qt3ds::runtime::DataInputDef &diDef = diMap[controllerName];
+ diDef.controlledAttributes.append(ctrlElem);
+
+// #TODO: Remove below once QT3DS-3510 has been implemented in the editor
+ // Note, in this temp implementation only the LAST of multiple attributes
+ // will be notified from the object under the DataInput name..
+ qt3ds::runtime::DataInputDef inDef = diMap[controllerName];
+ qt3ds::runtime::DataOutputDef &doDef = doMap[controllerName];
+ doDef.observedAttribute = ctrlElem;
+ doDef.type = inDef.type;
+ doDef.min = inDef.min;
+ doDef.max = inDef.max;
+
+ if (ctrlElem.propertyType == ATTRIBUTETYPE_DATAINPUT_TIMELINE) {
+ // Find the TElement for the @timeline attrib
+ TElement *target = nullptr;
+ QStringList split
+ = QString(ctrlElem.elementPath).split(QLatin1Char(':'));
+ if (split.size() > 1) {
+ target = CQmlElementHelper::GetElement(
+ *m_Application,
+ m_Application->GetPresentationById(
+ split.at(0).toStdString().c_str()),
+ split.at(1).toStdString().c_str(), nullptr);
+ } else {
+ target = CQmlElementHelper::GetElement(
+ *m_Application,
+ m_Application->GetPrimaryPresentation(),
+ split.at(0).toStdString().c_str(), nullptr);
+ }
+
+ doDef.timelineComponent = static_cast<TComponent *>(target);
+ } else if (ctrlElem.propertyType == ATTRIBUTETYPE_DATAINPUT_SLIDE) {
+ // Slide notifications are already done with separate signal
+ // No need to process
+ } else {
+ // Other than slide or timeline attributes are handled by CPresentation
+ CRegisteredString rString = strTable.RegisterStr(ctrlElem.elementPath);
+ elementPathToDataOutputDefMap.insertMulti(rString, doDef);
+ }
+// #TODO: Remove above once QT3DS-3510 has been implemented in the editor
+ }
+ }
+ }
+ }
+ }
+
+// #TODO: Remove below once QT3DS-3510 has been implemented in the editor
+ presentation.AddToDataOutputMap(elementPathToDataOutputDefMap);
+// #TODO: Remove above once QT3DS-3510 has been implemented in the editor
+}
+
+void CQmlEngineImpl::initializeDataOutputsInPresentation(CPresentation &presentation,
+ bool isPrimary)
+{
+ TElement *parent = presentation.GetRoot();
+ QList<TElement *> elements;
+ listAllElements(parent, elements);
+ qt3ds::runtime::DataOutputMap &doMap = m_Application->dataOutputMap();
+
+ qt3ds::foundation::IStringTable &strTable(presentation.GetStringTable());
+ QHash<CRegisteredString, qt3ds::runtime::DataOutputDef> elementPathToDataOutputDefMap;
+ for (TElement *element : qAsConst(elements)) {
+ Option<QT3DSU32> ctrlIndex = element->FindPropertyIndex(ATTRIBUTE_OBSERVEDPROPERTY);
+ if (ctrlIndex.hasValue()) {
+ Option<qt3ds::runtime::element::TPropertyDescAndValuePtr> propertyInfo =
+ element->GetPropertyByIndex(*ctrlIndex);
+ UVariant *valuePtr = propertyInfo->second;
+ QString valueStr =
+ QString::fromUtf8(strTable.HandleToStr(valuePtr->m_StringHandle));
+
+ if (!valueStr.isEmpty()) {
+ QStringList splitValues = valueStr.split(QLatin1Char(' '));
+
+ // Single value pair expected for DataOutputs
+ QString observerName = splitValues[0];
+ QString observedAttribute = splitValues[1];
+ // Remove DataOutput name prefix "$"
+ observerName.remove(0, 1);
+ qt3ds::runtime::DataOutputDef &doDef = doMap[observerName];
+
+ if (doMap.contains(observerName)) {
+ qt3ds::runtime::DataInOutAttribute obsElem;
+ if (!isPrimary) {
+ // Prepend presentation id to element path
+ obsElem.elementPath = presentation.GetName();
+ obsElem.elementPath.append(QByteArrayLiteral(":"));
+ }
+
+ obsElem.attributeName.append(observedAttribute.toUtf8());
+
+ if (obsElem.attributeName.first() == QByteArrayLiteral("@timeline")) {
+ // Timeline requires special additional handling
+ obsElem.propertyType = ATTRIBUTETYPE_DATAINPUT_TIMELINE;
+ TElement *component = &element->GetComponentParent();
+ obsElem.elementPath.append(component->m_Path);
+
+ // Find the TElement for the @timeline attrib
+ TElement *target = nullptr;
+ QStringList split = QString(obsElem.elementPath).split(QLatin1Char(':'));
+ if (split.size() > 1) {
+ target = CQmlElementHelper::GetElement(
+ *m_Application,
+ m_Application->GetPresentationById(
+ split.at(0).toStdString().c_str()),
+ split.at(1).toStdString().c_str(), nullptr);
+ } else {
+ target = CQmlElementHelper::GetElement(
+ *m_Application,
+ m_Application->GetPrimaryPresentation(),
+ split.at(0).toStdString().c_str(), nullptr);
+ }
+ doDef.timelineComponent = static_cast<TComponent *>(target);
+ } else if (obsElem.attributeName.first() == QByteArrayLiteral("@slide")) {
+ // Slides are ignored if set as we have separate signal in the API for
+ // slide transitions
+ } else {
+ // Every other type is handled by CPresentation
+ obsElem.elementPath.append(element->m_Path);
+ TStringHash attHash = CHash::HashAttribute(
+ obsElem.attributeName.first().constData());
+ Option<qt3ds::runtime::element::TPropertyDescAndValuePtr> attInfo
+ = element->FindProperty(attHash);
+ if (attInfo.hasValue()) {
+ obsElem.propertyType = attInfo->first.m_Type;
+ } else {
+ obsElem.propertyType = ATTRIBUTETYPE_NONE;
+ qWarning() << __FUNCTION__ << "Property"
+ << obsElem.attributeName.first() << "not existing!";
+ }
+
+ doDef.observedAttribute = obsElem;
+ CRegisteredString rString = strTable.RegisterStr(obsElem.elementPath);
+ elementPathToDataOutputDefMap.insertMulti(rString, doDef);
+ }
+ }
+ }
+ }
+ }
+
+ // Inform the presentation of the ready data output defs
+ presentation.AddToDataOutputMap(elementPathToDataOutputDefMap);
+}
+
+// Bit clumsy way of getting from "position" to "position .x .y .z" and enabling datainput
+// support for vectorized types. UIP parser has already thrown away all vector
+// type attributes and at this point we are operating with scalar components only.
+// We check if this element has a property attName.x or attName.r to find out it
+// we should expand property attName to XYZ or RGB vector
+bool CQmlEngineImpl::getAttributeVector3(QVector<QByteArray> &outAttVec,
+ const QByteArray &attName,
+ TElement *elem)
+{
+ auto hashName = Q3DStudio::CHash::HashAttribute(attName + ".x");
+
+ if (!elem->FindProperty(hashName).isEmpty()) {
+ outAttVec.append(attName + ".x");
+ outAttVec.append(attName + ".y");
+ outAttVec.append(attName + ".z");
+ return true;
+ }
+ hashName = Q3DStudio::CHash::HashAttribute(attName + ".r");
+ if (!elem->FindProperty(hashName).isEmpty()) {
+ outAttVec.append(attName + ".r");
+ outAttVec.append(attName + ".g");
+ outAttVec.append(attName + ".b");
+ return true;
+ }
+ return false;
+}
+
+bool CQmlEngineImpl::getAttributeVector2(QVector<QByteArray> &outAttVec,
+ const QByteArray &attName,
+ TElement *elem)
+{
+ auto hashName = Q3DStudio::CHash::HashAttribute(attName + ".x");
+
+ if (!elem->FindProperty(hashName).isEmpty()) {
+ outAttVec.append(attName + ".x");
+ outAttVec.append(attName + ".y");
+ return true;
+ }
+
+ hashName = Q3DStudio::CHash::HashAttribute(attName + ".u");
+ if (!elem->FindProperty(hashName).isEmpty()) {
+ outAttVec.append(attName + ".u");
+ outAttVec.append(attName + ".v");
+ return true;
+ }
+ return false;
+}
+
+QJSValue CQmlEngineImpl::buildJSFunc(const QString &userFunc)
+{
+ auto res = this->m_engine.evaluate(userFunc);
+ if (res.isError()) {
+ qWarning() << __FUNCTION__
+ << "Uncaught exception during datainput evaluation. Evaluator function" << userFunc;
+ }
+ return res;
+}
+
+QVariant CQmlEngineImpl::callJSFunc(const QString &controllerName,
+ qt3ds::runtime::DataInputDef &diDef,
+ const QVariant::Type type)
+{
+ qt3ds::runtime::DataInputMap &diMap = m_Application->dataInputMap();
+ QJSValueList args;
+ QVector<QString> sourceDIs = resolveDependentDatainputs(diDef.evaluator, controllerName);
+
+ // get the most recent set values for datainput sources (arguments) in the expression
+ for (auto diVal : sourceDIs)
+ args << this->m_engine.toScriptValue(diMap[diVal].value);
+
+ if (diDef.evalFunc.isCallable()) {
+ QJSValue res = diDef.evalFunc.call(args);
+ if (res.isError()) {
+ qWarning() << __FUNCTION__ << "Error during datainput" << controllerName
+ << "evaluator call:" << res.toString() << "\nEvaluator function"
+ << diDef.evaluator;
+ return QVariant::Invalid;
+ }
+
+ QVariant ret = res.toVariant();
+ if (ret.isValid() && isMatchingDatatype(ret.type(), type)) {
+ // further check if the result is valid number
+ if (ret.type() == QVariant::Double && qIsNaN(res.toNumber())) {
+ qWarning() << __FUNCTION__ << "Datainput" << controllerName << "evaluator"
+ << "result not a number (NaN)."
+ << "\nEvaluator function" << diDef.evaluator;
+ return QVariant::Invalid;
+ } else {
+ return ret;
+ }
+ } else {
+ qWarning() << __FUNCTION__ << "Datainput" << controllerName << "evaluator"
+ << "result not valid or matching with target attribute type. Result type"
+ << QVariant::typeToName(ret.type()) << " target attribute type "
+ << QVariant::typeToName(type) << "\nEvaluator function" << diDef.evaluator;
+ }
+ } else {
+ qWarning() << __FUNCTION__ << "Datainput" << controllerName << "evaluator"
+ << diDef.evaluator << " not valid callable";
+ }
+ return QVariant::Invalid;
+}
+
+bool CQmlEngineImpl::isMatchingDatatype(QVariant::Type resultType, QVariant::Type propertyType)
+{
+ if (resultType == propertyType)
+ return true;
+ // Allow binding from numeric datainput to string target
+ if ((resultType == QVariant::Double || resultType == QVariant::Int
+ || resultType == QVariant::LongLong)
+ && (propertyType == QVariant::Double || propertyType == QVariant::Int
+ || propertyType == QVariant::LongLong || propertyType == QVariant::String)) {
+ return true;
+ }
+ return false;
+}
+
+QVector<QString> CQmlEngineImpl::resolveDependentDatainputs(const QString &expression,
+ const QString &controllerName)
+{
+ QVector<QString> ret;
+ qt3ds::runtime::DataInputMap &diMap = m_Application->dataInputMap();
+ if (!expression.contains("function", Qt::CaseInsensitive)) {
+ qWarning() << __FUNCTION__ << "Function keyword not found in datainput"
+ << controllerName << "evaluator";
+ return QVector<QString>();
+ }
+
+ int argListStart = expression.indexOf("function(") + 9;
+ int argListStop = expression.indexOf(')', argListStart);
+ QString argstr = expression.mid(argListStart , argListStop - argListStart);
+ QStringList args = argstr.split(',');
+
+ for (auto di : args) {
+ auto diTrim = di.trimmed();
+ if (diMap.contains(diTrim)) {
+ if (diMap[diTrim].type == qt3ds::runtime::DataInOutTypeEvaluator
+ && diTrim != controllerName) {
+ qWarning() << __FUNCTION__ << "Invalid evaluator function in" << controllerName
+ << ". Another evaluator is used as source data.";
+ } else {
+ ret.append(diTrim);
+ }
+ } else {
+ qWarning() << __FUNCTION__ << "Evaluator in" << controllerName << "evaluator"
+ << "is using unknown datainput" << diTrim << " as input argument name";
+ }
+ }
+ return ret;
+}
+
+void CQmlEngineImpl::addStringAttribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QString &inAttName, const QString &inValue)
+{
+ QByteArray valueBa = inValue.toUtf8();
+ qt3ds::foundation::CStringHandle strHandle = strTable.GetHandle(valueBa.constData());
+ UVariant theValue;
+ theValue.m_StringHandle = strHandle.handle();
+ const CRegisteredString attStr = strTable.RegisterStr(inAttName);
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_STRING), theValue));
+}
+
+void CQmlEngineImpl::addIntAttribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QString &inAttName, int inValue)
+{
+ UVariant theValue;
+ theValue.m_INT32 = inValue;
+ const CRegisteredString attStr = strTable.RegisterStr(inAttName);
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_INT32), theValue));
+}
+
+void CQmlEngineImpl::addBoolAttribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QString &inAttName, bool inValue)
+{
+ UVariant theValue;
+ theValue.m_INT32 = int(inValue);
+ const CRegisteredString attStr = strTable.RegisterStr(inAttName);
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_BOOL), theValue));
+}
+
+void CQmlEngineImpl::addFloatAttribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QString &inAttName, float inValue)
+{
+ UVariant theValue;
+ theValue.m_FLOAT = inValue;
+ const CRegisteredString attStr = strTable.RegisterStr(inAttName);
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_FLOAT), theValue));
+}
+
+void CQmlEngineImpl::addFloat2Attribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QStringList &inAttNames, const QVector2D &inValue)
+{
+ for (int i = 0; i < 2; ++i) {
+ UVariant theValue;
+ theValue.m_FLOAT = inValue[i];
+ const CRegisteredString attStr = strTable.RegisterStr(inAttNames.at(i));
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_FLOAT), theValue));
+ }
+}
+
+void CQmlEngineImpl::addFloat3Attribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QStringList &inAttNames, const QVector3D &inValue)
+{
+ for (int i = 0; i < 3; ++i) {
+ UVariant theValue;
+ theValue.m_FLOAT = inValue[i];
+ const CRegisteredString attStr = strTable.RegisterStr(inAttNames.at(i));
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_FLOAT), theValue));
+ }
+}
+
+void CQmlEngineImpl::addFloat4Attribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QStringList &inAttNames, const QVector4D &inValue)
+{
+ for (int i = 0; i < 4; ++i) {
+ UVariant theValue;
+ theValue.m_FLOAT = inValue[i];
+ const CRegisteredString attStr = strTable.RegisterStr(inAttNames.at(i));
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_FLOAT), theValue));
+ }
+}
+
+void CQmlEngineImpl::addElementRefAttribute(IStringTable &strTable,
+ CQmlEngineImpl::TPropertyDescAndValueList &list,
+ const QString &inAttName, TElement *element)
+{
+ UVariant theValue;
+ if (element) {
+ theValue.m_ElementHandle = element->GetHandle();
+ QT3DS_ASSERT(theValue.m_ElementHandle);
+ } else {
+ theValue.m_ElementHandle = 0;
+ }
+ const CRegisteredString attStr = strTable.RegisterStr(inAttName);
+ list.push_back(eastl::make_pair(TPropertyDesc(attStr, ATTRIBUTETYPE_ELEMENTREF), theValue));
+}
+
+QVector2D CQmlEngineImpl::parseFloat2Property(const QString &propValue)
+{
+ QVector<QStringRef> values = propValue.splitRef(QLatin1Char(' '));
+ QVector2D retVal;
+ for (int i = 0; i < values.size() && i < 2; ++i)
+ retVal[i] = values[i].toFloat();
+ return retVal;
+}
+
+QVector3D CQmlEngineImpl::parseFloat3Property(const QString &propValue)
+{
+ QVector<QStringRef> values = propValue.splitRef(QLatin1Char(' '));
+ QVector3D retVal;
+ for (int i = 0; i < values.size() && i < 3; ++i)
+ retVal[i] = values[i].toFloat();
+ return retVal;
+}
+
+QVector4D CQmlEngineImpl::parseFloat4Property(const QString &propValue)
+{
+ QVector<QStringRef> values = propValue.splitRef(QLatin1Char(' '));
+ QVector4D retVal;
+ for (int i = 0; i < values.size() && i < 4; ++i)
+ retVal[i] = values[i].toFloat();
+ return retVal;
+}
+
+void CQmlEngineImpl::notifyElementCreation(const QStringList &elementNames, const QString &error)
+{
+ // Notify presentation asynchronously to give renderer time to initialize the elements properly
+ if (!error.isEmpty()) {
+ qWarning() << "Warning: Element creation failed:" << error;
+ QT3DS_ASSERT(false);
+ }
+ QTimer::singleShot(0, [this, elementNames, error]() {
+ m_Application->GetPrimaryPresentation()->signalProxy()
+ ->SigElementsCreated(elementNames, error);
+ });
+}
+
+void CQmlEngineImpl::notifyMaterialCreation(const QStringList &materialNames, const QString &error)
+{
+ // Notify presentation asynchronously to give renderer time to initialize the materials properly
+ if (!error.isEmpty()) {
+ qWarning() << "Warning: Material creation failed:" << materialNames << error;
+ QT3DS_ASSERT(false);
+ }
+ QTimer::singleShot(0, [this, materialNames, error]() {
+ m_Application->GetPrimaryPresentation()->signalProxy()
+ ->SigMaterialsCreated(materialNames, error);
+ });
+}
+
+void CQmlEngineImpl::deleteElements(const QVector<TElement *> &elements,
+ IQt3DSRenderer *renderer)
+{
+ TElement *lastParent = nullptr;
+ IPresentation *presentation = nullptr;
+ TElement *component = nullptr;
+ ISlideSystem *slideSystem = nullptr;
+ QSet<qt3ds::render::SNode *> parentNodes;
+ for (auto element : elements) {
+ TElement *parentElement = element->GetParent();
+ if (parentElement != lastParent) {
+ lastParent = parentElement;
+ presentation = element->GetBelongedPresentation();
+ component = &element->GetComponentParent();
+ slideSystem = &presentation->GetSlideSystem();
+ }
+ // Remove element recursively from slide system
+ slideSystem->removeElement(*component, *element);
+
+ Q_ASSERT(parentElement);
+
+ NVAllocatorCallback &allocator = presentation->GetScene()->allocator();
+
+ // Recursive deleter for translators and graph objects
+ std::function<void(TElement *)> deleteRenderObjects;
+ deleteRenderObjects = [&](TElement *elem) {
+ TElement *child = elem->m_Child;
+ while (child) {
+ TElement *sibling = child->m_Sibling;
+ deleteRenderObjects(child);
+ child = sibling;
+ }
+
+ auto translator = static_cast<qt3ds::render::Qt3DSTranslator *>(elem->GetAssociation());
+ if (translator) {
+ qt3ds::render::GraphObjectTypes::Enum type = translator->GetUIPType();
+ if (type == qt3ds::render::GraphObjectTypes::Model) {
+ auto model = static_cast<qt3ds::render::SModel *>(&translator->RenderObject());
+ // Delete material
+ if (model->m_FirstMaterial) {
+ auto material = static_cast<qt3ds::render::SReferencedMaterial *>(
+ model->m_FirstMaterial);
+ QT3DS_FREE(allocator, material);
+ }
+ }
+ QT3DS_FREE(allocator, &translator->RenderObject());
+ QT3DS_FREE(allocator, translator);
+ }
+ };
+
+ qt3ds::render::SNode *node = nullptr;
+ qt3ds::render::SNode *parentNode = nullptr;
+ auto translator = static_cast<qt3ds::render::Qt3DSTranslator *>(element->GetAssociation());
+
+ if (translator) {
+ if (qt3ds::render::GraphObjectTypes::IsNodeType(translator->GetUIPType())) {
+ node = &static_cast<qt3ds::render::SNode &>(translator->RenderObject());
+ auto parentTranslator = static_cast<qt3ds::render::Qt3DSTranslator *>(
+ parentElement->GetAssociation());
+ if (parentTranslator) {
+ parentNode = &static_cast<qt3ds::render::SNode &>(
+ parentTranslator->RenderObject());
+ parentNode->RemoveChild(*node);
+ parentNodes.insert(parentNode);
+ }
+ }
+ // Release child element graph objects/translators
+ deleteRenderObjects(element);
+ }
+
+ // Remove element recursively
+ m_Application->GetElementAllocator().ReleaseElement(*element, true);
+ }
+ for (auto parentNode : qAsConst(parentNodes))
+ renderer->ChildrenUpdated(*parentNode);
+}
+
+template<typename TDataType>
+void CQmlEngineImpl::setDynamicObjectProperty(qt3ds::render::SDynamicObject &material,
+ const dynamic::SPropertyDefinition &propDesc,
+ const TDataType &propValue)
+{
+ memCopy(material.GetDataSectionBegin() + propDesc.m_Offset, &propValue, sizeof(TDataType));
+}
+
+/**
+* @brief Create QML engine
+*
+* @param[in] inFoundation Pointer to foundation
+* @param[in] inTimeProvider Pointer to time provider
+*
+* @return no return
+*/
+CQmlEngine *CQmlEngine::Create(qt3ds::NVFoundationBase &inFoundation, ITimeProvider &inTimeProvider)
+{
+ return QT3DS_NEW(inFoundation.getAllocator(), CQmlEngineImpl)(inFoundation, inTimeProvider);
+}
+
+}
diff --git a/src/runtime/Qt3DSQmlEngine.h b/src/runtime/Qt3DSQmlEngine.h
new file mode 100644
index 0000000..a5ad382
--- /dev/null
+++ b/src/runtime/Qt3DSQmlEngine.h
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-20016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef QT3DS_QML_ENGINE_H
+#define QT3DS_QML_ENGINE_H
+
+#include "Qt3DSIScriptBridge.h"
+#include "Qt3DSIComponentManager.h"
+#include "EASTL/vector.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSMutex.h"
+#include "Qt3DSTimer.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+
+namespace Q3DStudio {
+//==============================================================================
+// Typedefs
+//==============================================================================
+typedef void (*TScriptCallback)(void *inUserData);
+
+//==============================================================================
+// Defines
+//==============================================================================
+#define SCRIPT_ON_INITIALIZE 1
+#define SCRIPT_ON_UPDATE 2
+
+//==============================================================================
+// Forwards
+//==============================================================================
+struct SEventCommand;
+class IPresentation;
+
+//==============================================================================
+/**
+* Manages the various events callbacks in the system. It fires the
+* registered callbacks when an event was triggered.
+*/
+class CScriptCallbacks
+{
+ //==============================================================================
+ // Structs
+ //==============================================================================
+protected:
+ struct SScriptCallbackEntry
+ {
+ SScriptCallbackEntry() {}
+ ~SScriptCallbackEntry() {}
+
+ TScriptCallback m_Function; ///< Callback function pointer
+ void *m_UserData; ///< User data
+ Q3DStudio::UINT32
+ m_CallbackType; ///< callback type. determines when and/or how often it is called
+ bool m_Processed; ///< Only used if the callback is of
+
+ private: // Disabled Copy Construction
+ SScriptCallbackEntry(const SScriptCallbackEntry &);
+ SScriptCallbackEntry &operator=(const SScriptCallbackEntry &);
+ };
+ typedef CArray<SScriptCallbackEntry *> TCallbackList; ///< Array of callbacks regisgtered
+
+ struct SFrameCallbackEntry
+ {
+ SFrameCallbackEntry() {}
+ ~SFrameCallbackEntry()
+ {
+ FOR_ARRAY(SScriptCallbackEntry *, theEntry, m_Callbacks)
+ Q3DStudio_delete(*theEntry, SScriptCallbackEntry);
+ }
+
+ TCallbackList m_Callbacks; ///< List of callbacks listening to this event
+
+ private: // Disabled Copy Construction
+ SFrameCallbackEntry(const SFrameCallbackEntry &);
+ SFrameCallbackEntry &operator=(const SFrameCallbackEntry &);
+ };
+
+ typedef CArray<SFrameCallbackEntry *> TFrameCallbacksList; ///< Array of frame callbacks
+
+public: // Construction
+ CScriptCallbacks();
+ ~CScriptCallbacks();
+
+ bool RegisterCallback(Q3DStudio::UINT32 callbackType, const TScriptCallback inCallback,
+ void *inUserData);
+ void UnregisterCallback(Q3DStudio::UINT32 callbackType, const TScriptCallback inCallback);
+
+ void ProcessCallbacks();
+
+private:
+ TFrameCallbacksList m_CallbackList;
+
+private: // Disabled Copy Construction
+ CScriptCallbacks(const CScriptCallbacks &);
+ CScriptCallbacks &operator=(const CScriptCallbacks &);
+};
+
+class CQmlEngine : public IScriptBridge
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ virtual ~CQmlEngine() {}
+
+public: // Public functions but not functions on the script bridge
+ /**
+ * @brief Peek a custom action from the queue
+ *
+ * @param[out] outElement Target Element
+ * @param[out] outSignal Signal Name
+ *
+ * @return true if signal available
+ */
+ virtual bool PeekSignal(TElement *&outElement, char *&outName) = 0;
+
+ /**
+ * @brief Select a slide by index
+ *
+ * @param[in] component Component Name
+ * @param[in] slideIndex Slide index
+ * @param[in] inArgs Arguemnts for slide switch
+ *
+ * @return none
+ */
+ virtual void GotoSlideIndex(const char *component, const Q3DStudio::INT32 slideIndex,
+ const SScriptEngineGotoSlideArgs &inArgs) = 0;
+
+ virtual bool GetSlideInfo(const char *elementPath, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName) = 0;
+
+ /**
+ * @brief Go to specified time
+ *
+ * @param[in] component Component Name
+ * @param[in] time New time
+ *
+ * @return none
+ */
+ virtual void GotoTime(const char *component, const Q3DStudio::FLOAT time) = 0;
+
+ /**
+ * @brief Return values of an attribute
+ *
+ * @param[in] element Element Name
+ * @param[in] attName Attribute name
+ * @param[out] value Attribute value
+ *
+ * @return none
+ */
+ virtual bool GetAttribute(const char *element, const char *attName, char *value) = 0;
+ virtual bool GetAttribute(TElement *target, const char *attName, char *value) = 0;
+
+ /**
+ * @brief Register a callback
+ *
+ * @param[in] callbackType callback type
+* @param[in] inCallback pointer to callback
+* @param[in] inUserData pointer to user data
+ *
+ * @return true on success
+ */
+ virtual bool RegisterCallback(Q3DStudio::UINT32 callbackType, const TScriptCallback inCallback,
+ void *inUserData) = 0;
+
+ /**
+ * @brief Shutdown QML engine
+ *
+ * @param[in] inFoundation Pointer to foundation
+ *
+ * @return no return
+ */
+ virtual void Shutdown(qt3ds::NVFoundationBase &inFoundation) = 0;
+
+ virtual qt3ds::runtime::IApplication *GetApplication() = 0;
+
+ virtual void Initialize() = 0;
+
+public:
+ /**
+ * @brief Create QML engine
+ *
+ * @param[in] inFoundation Pointer to foundation
+ * @param[in] inTimeProvider Pointer to time provider
+ *
+ * @return no return
+ */
+ static CQmlEngine *Create(qt3ds::NVFoundationBase &inFoundation, ITimeProvider &inTimeProvider);
+};
+
+} // namespace Q3DStudio
+
+#endif
diff --git a/src/runtime/Qt3DSRuntimeFactory.h b/src/runtime/Qt3DSRuntimeFactory.h
new file mode 100644
index 0000000..fb46240
--- /dev/null
+++ b/src/runtime/Qt3DSRuntimeFactory.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "Qt3DSTimer.h"
+#include "foundation/Qt3DSRefCounted.h"
+
+namespace qt3ds {
+namespace render {
+ class IInputStreamFactory;
+ class IQt3DSRenderContext;
+ class IQt3DSRenderContextCore;
+}
+}
+
+namespace qt3ds {
+namespace runtime {
+ class IApplication;
+}
+}
+
+namespace qt3ds {
+namespace evt {
+ class IEventSystem;
+}
+}
+
+namespace qt3ds {
+class NVFoundationBase;
+namespace foundation {
+ class IStringTable;
+ class IPerfTimer;
+}
+}
+
+namespace Q3DStudio {
+
+class IScene;
+class CRenderEngine;
+class ISceneManager;
+class IRender;
+class CInputEngine;
+class IScriptBridge;
+class CPresentation;
+class IPresentation;
+class ITimeProvider;
+class ISceneBinaryLoader;
+
+// All of the interfaces available without opengl initialized.
+class IRuntimeFactoryCore : public qt3ds::foundation::NVRefCounted
+{
+public:
+ virtual ISceneBinaryLoader &GetSceneLoader() = 0;
+ virtual IScriptBridge &GetScriptEngineQml() = 0;
+ virtual qt3ds::render::IQt3DSRenderContextCore &GetRenderContextCore() = 0;
+ virtual qt3ds::render::IInputStreamFactory &GetInputStreamFactory() = 0;
+ virtual qt3ds::evt::IEventSystem &GetEventSystem() = 0;
+ virtual ITimeProvider &GetTimeProvider() = 0;
+ virtual qt3ds::NVFoundationBase &GetFoundation() = 0;
+ virtual qt3ds::foundation::IPerfTimer &GetPerfTimer() = 0;
+ virtual qt3ds::foundation::IStringTable &GetStringTable() = 0;
+ virtual void AddSearchPath(const char8_t *inFile) = 0;
+ virtual void SetDllDir(const char *inDir) = 0;
+ virtual qt3ds::runtime::IApplication *GetApplicationCore() = 0;
+ virtual void SetApplicationCore(qt3ds::runtime::IApplication *app) = 0;
+};
+
+class IRuntimeFactory : public IRuntimeFactoryCore
+{
+protected:
+ virtual ~IRuntimeFactory() {}
+
+public:
+ virtual ISceneManager &GetSceneManager() = 0;
+ virtual qt3ds::render::IQt3DSRenderContext &GetQt3DSRenderContext() = 0;
+ virtual qt3ds::runtime::IApplication *GetApplication() = 0;
+ virtual void SetApplication(qt3ds::runtime::IApplication *app) = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSSceneManager.h b/src/runtime/Qt3DSSceneManager.h
new file mode 100644
index 0000000..7d8297f
--- /dev/null
+++ b/src/runtime/Qt3DSSceneManager.h
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSPickFrame.h"
+#include "Qt3DSIStateful.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSIScene.h"
+
+namespace qt3ds {
+namespace foundation {
+ class IInStream;
+ class IOutStream;
+ class Mutex;
+}
+}
+
+namespace qt3ds {
+class Q3DSVariantConfig;
+namespace render {
+ class IQt3DSRenderContextCore;
+ class ILoadedBuffer;
+}
+}
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class IScene;
+class IPresentation;
+class CRenderEngine;
+class CRenderEngine;
+class IUIPParser;
+class CFileStream;
+class IRuntimeFactory;
+class IScriptBridge;
+class ISceneManager;
+
+class ISceneBinaryLoader : public qt3ds::foundation::NVRefCounted
+{
+protected:
+ virtual ~ISceneBinaryLoader() {}
+
+public:
+ virtual qt3ds::foundation::NVDataRef<qt3ds::QT3DSU8>
+ BinaryLoadManagerData(qt3ds::foundation::IInStream &inStream, const char *inBinaryDir) = 0;
+
+ // threadsafe
+ // Can be called from any thread
+ virtual bool GetBinaryLoadFileName(eastl::string &inPresentationFilename,
+ eastl::string &outResult) = 0;
+
+ // threadsafe
+ // returns a handle to the loaded object. Return value of zero means error.
+ virtual qt3ds::QT3DSU32 LoadSceneStage1(qt3ds::foundation::CRegisteredString inPresentationDirectory,
+ qt3ds::render::ILoadedBuffer &inData) = 0;
+
+ // threadsafe
+ // still does not require openGL context but has dependency on a few other things.
+ virtual void LoadSceneStage2(qt3ds::QT3DSU32 inSceneHandle, IPresentation &inPresentation,
+ size_t inElementMemoryOffset, IScriptBridge &inBridge) = 0;
+};
+struct FacePositionPlanes
+{
+ enum Enum { XY = 0, YZ, XZ };
+};
+
+//==============================================================================
+/**
+* @class ISceneManager
+* @brief Container class that creates and manages all the Scenes.
+*/
+class ISceneManager : public qt3ds::foundation::NVRefCounted
+{
+protected:
+ virtual ~ISceneManager(){}
+
+public: // Presentations
+ //==============================================================================
+ /**
+ * Load a new scene based on an existing presentation. This will create a new
+ * CScene-based class from the factory method at "CreateScene". To supply
+ * your own class, simply set "CreateScene" to the desired factory method.
+ * After creating the new scene, a load will be triggered.
+ * @param inPresentation the current presentation loaded
+ */
+ virtual IScene *LoadScene(IPresentation *inPresentation, IUIPParser *inParser,
+ IScriptBridge &inBridge,
+ const qt3ds::Q3DSVariantConfig &variantConfig) = 0;
+ virtual void LoadRenderPlugin(const CHAR *inAssetIDString, const CHAR *inPath,
+ const CHAR *inArgs) = 0;
+
+ virtual void LoadQmlStreamerPlugin(const CHAR *inAssetIDString) = 0;
+
+ virtual void BinarySaveManagerData(qt3ds::foundation::IOutStream &inStream,
+ const char *inBinaryDir) = 0;
+ // Loading flow data needs to return the string table memory block. This allows
+ // other systems to use remap their string table strings assuming they had mapped them before
+ // serialization. In general this is a horrible hack and abstraction leak but assuming you have
+ // a string
+ // table I guess it isn't too bad.
+ virtual qt3ds::foundation::NVDataRef<qt3ds::QT3DSU8>
+ BinaryLoadManagerData(qt3ds::foundation::IInStream &inStream, const char *inBinaryDir) = 0;
+
+ virtual void BinarySave(Q3DStudio::IScene &inScene) = 0;
+
+public: // Update Cycle
+ virtual BOOL Update() = 0;
+ virtual BOOL RenderPresentation(IPresentation *inPresentation, bool firstFrame) = 0;
+ virtual void OnViewResize(INT32 inViewWidth, INT32 inViewHeight) = 0;
+ virtual void GetViewSize(INT32 &outWidth, INT32 &outHeight) = 0;
+
+ virtual STextSizes GetDisplayDimensions(Q3DStudio::IPresentation *inPrimaryPresentation) = 0;
+
+public: // Picking
+ virtual Q3DStudio::TElement *UserPick(float mouseX, float mouseY) = 0;
+ virtual SPickFrame AdvancePickFrame(const SInputFrame &inInputFrame) = 0;
+ // Get the relative UV coord position of an element. This matches how mouse picking works where
+ // we pick out
+ virtual qt3ds::foundation::Option<qt3ds::QT3DSVec2>
+ FacePosition(Q3DStudio::TElement &inElement, float mouseX, float mouseY,
+ qt3ds::foundation::NVDataRef<Q3DStudio::TElement *> inMapperElements,
+ FacePositionPlanes::Enum inPlane) = 0;
+
+ virtual void Release() = 0;
+
+ static ISceneManager &Create(IRuntimeFactory &inFactory, CRenderEngine &inRenderEngine);
+};
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSSlideSystem.cpp b/src/runtime/Qt3DSSlideSystem.cpp
new file mode 100644
index 0000000..33c7544
--- /dev/null
+++ b/src/runtime/Qt3DSSlideSystem.cpp
@@ -0,0 +1,675 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "RuntimePrefix.h"
+#include "Qt3DSSlideSystem.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSAnimationSystem.h"
+#include "Qt3DSLogicSystem.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/IOStreams.h"
+#include "Qt3DSHash.h"
+#include "Qt3DSTimePolicy.h"
+#include "foundation/Qt3DSIndexableLinkedList.h"
+
+using namespace qt3ds::runtime;
+using namespace qt3ds::runtime::element;
+
+namespace {
+struct SSlideAttribute
+{
+ QT3DSU32 m_Index = 0;
+ Q3DStudio::UVariant m_Value;
+ SSlideAttribute()
+ {
+ m_Value.m_INT32 = 0;
+ }
+ SSlideAttribute(QT3DSU32 idx, Q3DStudio::UVariant val)
+ : m_Index(idx)
+ , m_Value(val)
+ {
+ }
+};
+
+struct SSlideAttributeNode
+{
+ enum {
+ AttributeCount = 8,
+ };
+
+ SSlideAttribute m_Data[AttributeCount];
+ SSlideAttributeNode *m_NextNode = nullptr;
+};
+
+typedef IndexableLinkedList<SSlideAttributeNode, SSlideAttribute,
+ SSlideAttributeNode::AttributeCount>
+ TSlideAttributeNodeList;
+
+struct SSlideElement
+{
+ QT3DSU32 m_ElementHandle = 0;
+ QT3DSU32 m_AttributeCount : 31;
+ QT3DSU32 m_Active : 1;
+ SSlideElement *m_NextElement = nullptr;
+ SSlideAttributeNode *m_AttributeNodes = nullptr;
+
+ SSlideElement()
+ : m_AttributeCount(0)
+ , m_Active(false)
+ {
+ }
+};
+
+struct SSlideAnimActionNode
+{
+ enum {
+ AnimActionCount = 8,
+ };
+ SSlideAnimAction m_Data[AnimActionCount];
+ SSlideAnimActionNode *m_NextNode = nullptr;
+};
+
+typedef IndexableLinkedList<SSlideAnimActionNode, SSlideAnimAction,
+ SSlideAnimActionNode::AnimActionCount>
+ TSlideAnimActionNodeList;
+
+struct SSlide
+{
+ SSlide *m_NextSlide = nullptr;
+ CRegisteredString m_Name;
+ QT3DSU32 m_PlayMode : 3;
+ QT3DSU32 m_PlayThroughTo : 8; // OXFF means no playthrough
+ QT3DSU32 m_Paused : 1;
+ QT3DSU32 m_StartTime = 0;
+ QT3DSU32 m_EndTime = 0;
+ QT3DSU32 m_AnimActionCount = 0;
+ SSlideElement *m_FirstElement = nullptr;
+ SSlideElement *m_lastElement = nullptr;
+ SSlideAnimActionNode *m_FirstAnimActionNode = nullptr;
+ bool m_activeSlide = false;
+ bool m_unloadSlide = false;
+ QVector<QString> m_sourcePaths;
+
+ SSlide()
+ : m_PlayMode(PlayMode::StopAtEnd)
+ , m_PlayThroughTo(0xFF)
+ , m_Paused(false)
+ {
+ }
+
+ void Initialize(CRegisteredString inName, PlayMode::Enum inMode, QT3DSU8 inPlayThrough,
+ bool inPaused, QT3DSU32 inStartTime, QT3DSU32 inEndTime)
+ {
+ m_Name = inName;
+ m_PlayMode = inMode;
+ m_PlayThroughTo = inPlayThrough;
+ m_Paused = inPaused;
+ m_StartTime = inStartTime;
+ m_EndTime = inEndTime;
+ }
+};
+
+struct SSlideSystem : public ISlideSystem
+{
+ typedef nvhash_map<SElement *, SSlide *> TComponentSlideHash;
+ typedef Pool<SSlideAttributeNode, ForwardingAllocator> TAttributeNodePool;
+ typedef Pool<SSlideAnimActionNode, ForwardingAllocator> TSlideAnimActionPool;
+ typedef Pool<SSlideElement, ForwardingAllocator> TSlideElementPool;
+ typedef Pool<SSlide, ForwardingAllocator> TSlidePool;
+
+ NVFoundationBase &m_Foundation;
+ IStringTable &m_StringTable;
+ IElementAllocator &m_ElementSystem;
+ TAttributeNodePool m_AttributeNodePool;
+ TSlideAnimActionPool m_AnimActionPool;
+ TSlidePool m_SlidePool;
+ TSlideElementPool m_SlideElements;
+ TComponentSlideHash m_Slides;
+
+ SSlide *m_CurrentSlide = nullptr;
+ SSlideElement *m_CurrentSlideElement = nullptr;
+
+ NVDataRef<QT3DSU8> m_LoadData;
+
+ QT3DSI32 m_RefCount;
+
+ SSlideSystem(NVFoundationBase &inFnd, IStringTable &inStrTable, IElementAllocator &inAllocator)
+ : m_Foundation(inFnd)
+ , m_StringTable(inStrTable)
+ , m_ElementSystem(inAllocator)
+ , m_AttributeNodePool(ForwardingAllocator(inFnd.getAllocator(), "m_AttributeNodePool"))
+ , m_AnimActionPool(ForwardingAllocator(inFnd.getAllocator(), "m_AnimActionPool"))
+ , m_SlidePool(ForwardingAllocator(inFnd.getAllocator(), "m_SlidePool"))
+ , m_SlideElements(ForwardingAllocator(inFnd.getAllocator(), "m_SlideElements"))
+ , m_Slides(inFnd.getAllocator(), "m_Slides")
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Foundation.getAllocator());
+ NVDelete(alloc, this);
+ }
+ }
+
+ QT3DSU32 AddSlide(element::SElement &inComponent, const char8_t *inName,
+ PlayMode::Enum inPlayMode, bool inPaused, QT3DSU8 inPlayThroughTo,
+ QT3DSU32 inMinTime, QT3DSU32 inMaxTime) override
+ {
+ eastl::pair<TComponentSlideHash::iterator, bool> inserter =
+ m_Slides.insert(eastl::make_pair(&inComponent, static_cast<SSlide *>(nullptr)));
+ SSlide *newSlide = m_SlidePool.construct(__FILE__, __LINE__);
+ QT3DSU32 slideIndex = 0;
+ if (!inserter.first->second) {
+ inserter.first->second = newSlide;
+ } else {
+ SSlide *theSlide = nullptr;
+ for (theSlide = inserter.first->second; theSlide->m_NextSlide;
+ theSlide = theSlide->m_NextSlide) {
+ ++slideIndex;
+ }
+ theSlide->m_NextSlide = newSlide;
+ }
+ m_CurrentSlide = newSlide;
+ newSlide->Initialize(m_StringTable.RegisterStr(inName), inPlayMode, inPlayThroughTo,
+ inPaused, inMinTime, inMaxTime);
+ m_CurrentSlideElement = nullptr;
+ if (inComponent.IsComponent()) {
+ SComponent &theComponent = static_cast<SComponent &>(inComponent);
+ theComponent.m_SlideCount++;
+ }
+ return slideIndex;
+ }
+
+ void AddSourcePath(const char8_t *path) override
+ {
+ if (m_CurrentSlide)
+ m_CurrentSlide->m_sourcePaths.push_back(QString::fromUtf8(path));
+ }
+
+ QVector<QString> GetSourcePaths(SSlideKey inKey) override
+ {
+ auto slide = FindSlide(inKey);
+ if (slide)
+ return slide->m_sourcePaths;
+ return {};
+ }
+
+ void SetSlideMaxTime(QT3DSU32 inMaxTime) override
+ {
+ if (m_CurrentSlide)
+ m_CurrentSlide->m_EndTime = inMaxTime;
+ }
+
+ void AddSlideElement(element::SElement &inElement, bool inActive) override
+ {
+ if (m_CurrentSlide) {
+ SSlideElement *lastSlideElement = m_CurrentSlideElement;
+ m_CurrentSlideElement = m_SlideElements.construct(__FILE__, __LINE__);
+ m_CurrentSlideElement->m_Active = inActive;
+ m_CurrentSlideElement->m_ElementHandle = inElement.GetHandle();
+ if (!lastSlideElement) {
+ QT3DS_ASSERT(!m_CurrentSlide->m_FirstElement);
+ m_CurrentSlide->m_FirstElement = m_CurrentSlideElement;
+ } else {
+ lastSlideElement->m_NextElement = m_CurrentSlideElement;
+ }
+ m_CurrentSlide->m_lastElement = m_CurrentSlideElement;
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ // The parent element must be found from target slide.
+ // Elements cannot be added to the master slide.
+ bool addSlideElement(element::SElement &inComponent, int slideIndex,
+ element::SElement &inElement, bool eyeBall) override
+ {
+ // Note: Slide 0 contains all loaded items in the graph with m_active set to false.
+ // Other slides contain all master slide items and slide specific items with m_active
+ // set to eyeball. We shouldn't need to care about slide 0 here as it won't be
+ // executed/rolled back after initial loading of the scene.
+
+ Q_ASSERT(slideIndex > 0);
+
+ TComponentSlideHash::const_iterator theFindResult = m_Slides.find(&inComponent);
+ element::SElement *parentElement = inElement.GetParent();
+ if (theFindResult == m_Slides.end()) {
+ qWarning() << __FUNCTION__ << "Could not find slides for component";
+ return false;
+ }
+ if (!parentElement) {
+ qWarning() << __FUNCTION__ << "Element has no parent";
+ return false;
+ }
+
+ int parentFound = false;
+ SSlide *slide = theFindResult->second;
+ SSlide *targetSlide = nullptr;
+ for (int idx = 0; slide && !targetSlide; slide = slide->m_NextSlide, ++idx) {
+ if (slideIndex == idx) {
+ targetSlide = slide;
+ SSlideElement *slideElement = slide->m_FirstElement;
+ while (slideElement) {
+ if (slideElement->m_ElementHandle == parentElement->m_Handle) {
+ parentFound = true;
+ break;
+ }
+ slideElement = slideElement->m_NextElement;
+ }
+ }
+ }
+
+ if (!parentFound) {
+ qWarning() << __FUNCTION__ << "Parent element could not be found from target slide";
+ return false;
+ }
+
+ m_CurrentSlide = targetSlide;
+ m_CurrentSlideElement = m_CurrentSlide->m_lastElement;
+
+ // Explicit active state is based solely on the slide and eyeball
+ int activeSlideIndex = static_cast<SComponent &>(inComponent).GetCurrentSlide();
+ bool isActive = activeSlideIndex == slideIndex && eyeBall;
+ inElement.Flags().SetExplicitActive(isActive);
+
+ AddSlideElement(inElement, eyeBall);
+
+ return true;
+ }
+
+ void removeElementRecursive(SSlide *slide, element::SElement &inElement)
+ {
+ element::SElement *child = inElement.m_Child;
+ while (child) {
+ removeElementRecursive(slide, *child);
+ child = child->m_Sibling;
+ }
+
+ SSlideElement *slideElement = slide->m_FirstElement;
+ SSlideElement *previousElement = nullptr;
+ while (slideElement) {
+ if (slideElement->m_ElementHandle == inElement.m_Handle) {
+ if (slide->m_FirstElement == slideElement)
+ slide->m_FirstElement = slideElement->m_NextElement;
+ if (slide->m_lastElement == slideElement)
+ slide->m_lastElement = previousElement;
+ if (previousElement)
+ previousElement->m_NextElement = slideElement->m_NextElement;
+ m_SlideElements.deallocate(slideElement);
+ break;
+ }
+ previousElement = slideElement;
+ slideElement = slideElement->m_NextElement;
+ }
+ }
+
+ // Removes element and its children from all slides
+ void removeElement(element::SElement &inComponent, element::SElement &inElement) override
+ {
+ TComponentSlideHash::const_iterator theFindResult = m_Slides.find(&inComponent);
+ if (theFindResult == m_Slides.end()) {
+ qWarning() << __FUNCTION__ << "Could not find slides for component";
+ return;
+ }
+
+ SSlide *slide = theFindResult->second;
+ for (; slide; slide = slide->m_NextSlide)
+ removeElementRecursive(slide, inElement);
+ }
+
+ void AddSlideAttribute(Q3DStudio::SAttributeKey inKey, Q3DStudio::UVariant inValue) override
+ {
+ if (m_CurrentSlideElement) {
+ SElement *theElement =
+ m_ElementSystem.FindElementByHandle(m_CurrentSlideElement->m_ElementHandle);
+ Option<QT3DSU32> theIdx = theElement->FindPropertyIndex(inKey.m_Hash);
+ if (theIdx.hasValue() == false) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ QT3DSU32 count = m_CurrentSlideElement->m_AttributeCount;
+ TSlideAttributeNodeList::Create(m_CurrentSlideElement->m_AttributeNodes, count,
+ m_AttributeNodePool) =
+ SSlideAttribute(*theIdx, inValue);
+ m_CurrentSlideElement->m_AttributeCount = count;
+ }
+ }
+
+ SSlideAnimAction *AddSlideAnimAction(bool inAnimation, QT3DSI32 inId, bool inActive) override
+ {
+ if (m_CurrentSlide) {
+ SSlideAnimAction &theAnimAction = TSlideAnimActionNodeList::Create(
+ m_CurrentSlide->m_FirstAnimActionNode, m_CurrentSlide->m_AnimActionCount,
+ m_AnimActionPool);
+ theAnimAction = SSlideAnimAction(QT3DSI32(inId), inActive, inAnimation);
+ return &theAnimAction;
+ }
+
+ return nullptr;
+ }
+
+ const SSlide *FindSlide(SSlideKey inKey) const
+ {
+ TComponentSlideHash::const_iterator iter = m_Slides.find(inKey.m_Component);
+ if (iter == m_Slides.end())
+ return nullptr;
+
+ SSlide *theSlide = iter->second;
+ for (QT3DSU32 idx = inKey.m_Index; idx; --idx) {
+ if (theSlide)
+ theSlide = theSlide->m_NextSlide;
+ }
+
+ return theSlide;
+ }
+
+ SSlide *FindSlide(SSlideKey inKey)
+ {
+ TComponentSlideHash::const_iterator iter = m_Slides.find(inKey.m_Component);
+ if (iter == m_Slides.end())
+ return nullptr;
+
+ SSlide *theSlide = iter->second;
+ for (QT3DSU32 idx = inKey.m_Index; idx; --idx) {
+ if (theSlide)
+ theSlide = theSlide->m_NextSlide;
+ }
+
+ return theSlide;
+ }
+
+ template <typename TOperator>
+ static void IterateSlideAnimActions(const SSlide &inSlide, TOperator inOp)
+ {
+ for (TSlideAnimActionNodeList::const_iterator
+ iter = TSlideAnimActionNodeList::begin(inSlide.m_FirstAnimActionNode,
+ inSlide.m_AnimActionCount),
+ end = TSlideAnimActionNodeList::end(inSlide.m_FirstAnimActionNode,
+ inSlide.m_AnimActionCount);
+ iter != end; ++iter) {
+ inOp(*iter);
+ }
+ }
+
+ template <typename TOperator>
+ static void IterateSlideElementAttributes(const SSlide &inSlide, TOperator inOp,
+ IElementAllocator &inAlloc)
+ {
+ for (SSlideElement *theElement = inSlide.m_FirstElement; theElement;
+ theElement = theElement->m_NextElement) {
+ SElement *theElem = inAlloc.FindElementByHandle(theElement->m_ElementHandle);
+ if (!theElem) {
+ QT3DS_ASSERT(false);
+ } else {
+ if (inOp.handleElementActive(*theElem, theElement->m_Active)) {
+ for (TSlideAttributeNodeList::const_iterator
+ iter = TSlideAttributeNodeList::begin(theElement->m_AttributeNodes,
+ theElement->m_AttributeCount),
+ end = TSlideAttributeNodeList::end(theElement->m_AttributeNodes,
+ theElement->m_AttributeCount);
+ iter != end; ++iter) {
+ inOp.handleElementAttribute(*theElem, *iter);
+ }
+ }
+ }
+ }
+ }
+
+ struct SDynamicKeyOperator
+ {
+ IAnimationSystem &m_AnimationSystem;
+ SDynamicKeyOperator(IAnimationSystem &anim)
+ : m_AnimationSystem(anim)
+ {
+ }
+ void operator()(const SSlideAnimAction &theAction)
+ {
+ if (theAction.m_IsAnimation && theAction.m_Active)
+ m_AnimationSystem.UpdateDynamicKey(theAction.m_Id);
+ }
+ };
+
+ struct SExecuteAnimActionOperator
+ {
+ IElementAllocator &m_ElementAllocator;
+ IAnimationSystem &m_AnimationSystem;
+ ILogicSystem &m_LogicManager;
+ bool m_Invert;
+
+ SExecuteAnimActionOperator(IElementAllocator &inElemAllocator, IAnimationSystem &anim,
+ ILogicSystem &logic, bool inInvert = false)
+ : m_ElementAllocator(inElemAllocator)
+ , m_AnimationSystem(anim)
+ , m_LogicManager(logic)
+ , m_Invert(inInvert)
+ {
+ }
+
+ void operator()(const SSlideAnimAction &theAction)
+ {
+ bool active = theAction.m_Active;
+ if (m_Invert)
+ active = !active;
+ if (theAction.m_IsAnimation)
+ m_AnimationSystem.SetActive(theAction.m_Id, active);
+ else
+ m_LogicManager.SetActive(theAction.m_Id, active, m_ElementAllocator);
+ }
+ };
+
+ struct SElementOperator
+ {
+ bool m_InvertActive;
+ SElementOperator(bool inInvert = false)
+ : m_InvertActive(inInvert)
+ {
+ }
+ bool handleElementActive(SElement &inElement, bool inActive)
+ {
+ if (m_InvertActive && inElement.Flags().IsExplicitActive())
+ inActive = !inActive;
+ inElement.Flags().SetExplicitActive(inActive);
+
+ if (m_InvertActive)
+ return false;
+
+ return inActive;
+ }
+
+ void handleElementAttribute(SElement &inElement, const SSlideAttribute &inAttribute)
+ {
+ Option<TPropertyDescAndValuePtr> theProperty =
+ inElement.GetPropertyByIndex(inAttribute.m_Index);
+ if (theProperty.hasValue()) {
+ inElement.SetAttribute(*theProperty, inAttribute.m_Value);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ };
+
+ void InitializeDynamicKeys(SSlideKey inKey, IAnimationSystem &inAnimationSystem) const override
+ {
+ const SSlide *theSlide = FindSlide(inKey);
+ if (theSlide) {
+ IterateSlideAnimActions(*theSlide, SDynamicKeyOperator(inAnimationSystem));
+ }
+ }
+
+ void ExecuteSlide(SSlideKey inKey, IAnimationSystem &inAnimationSystem,
+ ILogicSystem &inLogicManager) override
+ {
+ SSlide *theSlide = FindSlide(inKey);
+ if (!theSlide) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (inKey.m_Component->IsComponent()) {
+ Q3DStudio::TTimeUnit theLoopDuration = theSlide->m_EndTime - theSlide->m_StartTime;
+ SComponent &theComponent = static_cast<SComponent &>(*inKey.m_Component);
+ Q3DStudio::CTimePolicy &thePolicy = theComponent.GetTimePolicy();
+ Q3DStudio::TimePolicyModes::Enum theMode = Q3DStudio::TimePolicyModes::StopAtEnd;
+ switch (theSlide->m_PlayMode) {
+ case PlayMode::Looping:
+ theMode = Q3DStudio::TimePolicyModes::Looping;
+ break;
+ case PlayMode::PingPong:
+ theMode = Q3DStudio::TimePolicyModes::PingPong;
+ break;
+ case PlayMode::Ping:
+ theMode = Q3DStudio::TimePolicyModes::Ping;
+ break;
+
+ case PlayMode::StopAtEnd:
+ case PlayMode::PlayThroughTo:
+ default:
+ theMode = Q3DStudio::TimePolicyModes::StopAtEnd;
+ break;
+ }
+ thePolicy.Initialize(theLoopDuration, theMode);
+ thePolicy.SetPaused(theSlide->m_Paused);
+
+ theComponent.SetPlayThrough(theSlide->m_PlayMode == PlayMode::PlayThroughTo);
+ }
+ theSlide->m_activeSlide = true;
+ IterateSlideElementAttributes(*theSlide, SElementOperator(false), m_ElementSystem);
+ IterateSlideAnimActions(*theSlide, SExecuteAnimActionOperator(
+ m_ElementSystem, inAnimationSystem, inLogicManager));
+ }
+
+ void RollbackSlide(SSlideKey inKey, IAnimationSystem &inAnimationSystem,
+ ILogicSystem &inLogicManager) override
+ {
+ SSlide *theSlide = FindSlide(inKey);
+
+ if (!theSlide) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ theSlide->m_activeSlide = false;
+ IterateSlideElementAttributes(*theSlide, SElementOperator(true), m_ElementSystem);
+ IterateSlideAnimActions(
+ *theSlide,
+ SExecuteAnimActionOperator(m_ElementSystem, inAnimationSystem, inLogicManager, true));
+ }
+
+ QT3DSU8 FindSlide(element::SElement &inComponent, const char8_t *inSlideName) const override
+ {
+ TComponentSlideHash::const_iterator theFindResult = m_Slides.find(&inComponent);
+ if (theFindResult == m_Slides.end()) {
+ QT3DS_ASSERT(false);
+ return 0xFF;
+ }
+ CRegisteredString theRegName = m_StringTable.RegisterStr(inSlideName);
+ QT3DSU8 idx = 0;
+ for (const SSlide *theSlide = theFindResult->second; theSlide;
+ theSlide = theSlide->m_NextSlide, ++idx) {
+ if (theSlide->m_Name == theRegName)
+ return idx;
+ }
+ return 0xFF;
+ }
+
+ QT3DSU8 FindSlide(element::SElement &inComponent, QT3DSU32 inSlideHashName) const override
+ {
+ TComponentSlideHash::const_iterator theFindResult = m_Slides.find(&inComponent);
+ if (theFindResult == m_Slides.end()) {
+ QT3DS_ASSERT(false);
+ return 0xFF;
+ }
+
+ QT3DSU8 idx = 0;
+ for (const SSlide *theSlide = theFindResult->second; theSlide;
+ theSlide = theSlide->m_NextSlide, ++idx) {
+ if (Q3DStudio::CHash::HashString(theSlide->m_Name) == inSlideHashName)
+ return idx;
+ }
+ return 0xFF;
+ }
+
+ const char8_t *GetSlideName(SSlideKey inKey) const override
+ {
+ const SSlide *theSlide = FindSlide(inKey);
+ if (theSlide)
+ return theSlide->m_Name.c_str();
+ QT3DS_ASSERT(false);
+ return "";
+ }
+
+ QT3DSU8 GetPlaythroughToSlideIndex(SSlideKey inKey) const override
+ {
+ const SSlide *theSlide = FindSlide(inKey);
+ if (theSlide)
+ return theSlide->m_PlayThroughTo;
+ QT3DS_ASSERT(false);
+ return 0xFF;
+ }
+
+ bool isActiveSlide(SSlideKey inKey) const override
+ {
+ const SSlide *theSlide = FindSlide(inKey);
+ return theSlide->m_activeSlide;
+ }
+
+ void setUnloadSlide(SSlideKey inKey, bool unload) override
+ {
+ SSlide *theSlide = FindSlide(inKey);
+ theSlide->m_unloadSlide = unload;
+ }
+
+ bool isUnloadSlideSet(SSlideKey inKey) const override
+ {
+ const SSlide *theSlide = FindSlide(inKey);
+ return theSlide->m_unloadSlide;
+ }
+
+ void setIsActiveSlide(SSlideKey inKey, bool active) override
+ {
+ SSlide *theSlide = FindSlide(inKey);
+ theSlide->m_activeSlide = active;
+ }
+};
+}
+
+ISlideSystem &ISlideSystem::CreateSlideSystem(NVFoundationBase &inFnd, IStringTable &inStrTable,
+ IElementAllocator &inElemAllocator)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), SSlideSystem)(inFnd, inStrTable, inElemAllocator);
+}
diff --git a/src/runtime/Qt3DSSlideSystem.h b/src/runtime/Qt3DSSlideSystem.h
new file mode 100644
index 0000000..d3accbd
--- /dev/null
+++ b/src/runtime/Qt3DSSlideSystem.h
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "Qt3DSElementSystem.h"
+
+namespace Q3DStudio {
+class ILogicManager;
+}
+
+namespace qt3ds {
+namespace runtime {
+ class ILogicSystem;
+ class IAnimationSystem;
+
+ struct SSlideKey
+ {
+ element::SElement *m_Component;
+ QT3DSU32 m_Index;
+ SSlideKey()
+ : m_Component(NULL)
+ , m_Index(0)
+ {
+ }
+ SSlideKey(element::SElement &inElem, QT3DSU32 inIdx)
+ : m_Component(&inElem)
+ , m_Index(inIdx)
+ {
+ }
+
+ bool IsValid() const { return m_Component != NULL; }
+
+ bool operator==(const SSlideKey &inOther) const
+ {
+ return m_Component == inOther.m_Component && m_Index == inOther.m_Index;
+ }
+ };
+
+ struct PlayMode
+ {
+ enum Enum {
+ Looping = 0,
+ StopAtEnd,
+ PingPong,
+ Ping,
+ PlayThroughTo,
+ };
+ };
+
+ struct SSlidePlayInformation
+ {
+ PlayMode::Enum m_PlayMode;
+ bool m_Paused;
+ QT3DSU8 m_PlayThroughTo;
+
+ SSlidePlayInformation()
+ : m_PlayMode(PlayMode::Looping)
+ , m_Paused(false)
+ , m_PlayThroughTo(0xFF)
+ {
+ }
+ };
+
+ struct SSlideAnimAction
+ {
+ QT3DSI32 m_Id;
+ bool m_Active;
+ bool m_IsAnimation;
+ SSlideAnimAction()
+ : m_Id(0)
+ , m_Active(false)
+ , m_IsAnimation(false)
+ {
+ }
+ SSlideAnimAction(QT3DSI32 inId, bool inActive, bool inAnimation)
+ : m_Id(inId)
+ , m_Active(inActive)
+ , m_IsAnimation(inAnimation)
+ {
+ }
+ };
+
+ // Throughout this object, a slide index of 0xFF means invalid slide index.
+ class ISlideSystem : public NVRefCounted
+ {
+ public:
+ static QT3DSU8 InvalidSlideIndex() { return 0xFF; }
+ // Building out a dataset.
+ // Returns the index
+ // This slide is now the active cursor. The rest of the building functions will implicitly
+ // refer
+ // to the last added slide
+ // Playthroughto is either an index of the new slide or -1 meaning no playthough value.
+ virtual QT3DSU32 AddSlide(element::SElement &inComponent, const char8_t *inName,
+ PlayMode::Enum inPlayMode = PlayMode::Looping, bool inPaused = false,
+ QT3DSU8 inPlaythroughTo = InvalidSlideIndex(), QT3DSU32 inMinTime = 0,
+ QT3DSU32 inMaxTime = 0) = 0;
+
+ virtual void SetSlideMaxTime(QT3DSU32 inMaxTime) = 0;
+ virtual void AddSlideElement(element::SElement &inElement, bool inActive) = 0;
+ virtual bool addSlideElement(element::SElement &inComponent, int slideIndex,
+ element::SElement &inElement, bool eyeBall) = 0;
+ virtual void removeElement(element::SElement &inComponent,
+ element::SElement &inElement) = 0;
+ virtual void AddSlideAttribute(Q3DStudio::SAttributeKey inKey,
+ Q3DStudio::UVariant inValue) = 0;
+ virtual SSlideAnimAction *AddSlideAnimAction(bool inAnimation, QT3DSI32 inIndex,
+ bool inActive) = 0;
+ virtual void AddSourcePath(const char8_t *path) = 0;
+ virtual QVector<QString> GetSourcePaths(SSlideKey inKey) = 0;
+ virtual void setIsActiveSlide(SSlideKey inKey, bool active) = 0;
+ virtual bool isActiveSlide(SSlideKey inKey) const = 0;
+ virtual void setUnloadSlide(SSlideKey inKey, bool unload) = 0;
+ virtual bool isUnloadSlideSet(SSlideKey inKey) const = 0;
+
+ // Using the dataset
+ virtual void InitializeDynamicKeys(SSlideKey inKey,
+ IAnimationSystem &inAnimationSystem) const = 0;
+ virtual void ExecuteSlide(SSlideKey inKey, IAnimationSystem &inAnimationSystem,
+ ILogicSystem &inLogicManager) = 0;
+ virtual void RollbackSlide(SSlideKey inKey, IAnimationSystem &inAnimationSystem,
+ ILogicSystem &inLogicManager) = 0;
+ virtual QT3DSU8 FindSlide(element::SElement &inComponent,
+ const char8_t *inSlideName) const = 0;
+ virtual QT3DSU8 FindSlide(element::SElement &inComponent, QT3DSU32 inSlideHashName) const = 0;
+ virtual const char8_t *GetSlideName(SSlideKey inKey) const = 0;
+ virtual QT3DSU8 GetPlaythroughToSlideIndex(SSlideKey inKey) const = 0;
+
+ static ISlideSystem &CreateSlideSystem(NVFoundationBase &inFnd, IStringTable &inStrTable,
+ IElementAllocator &inElemAllocator);
+ };
+}
+}
diff --git a/src/runtime/Qt3DSTimePolicy.cpp b/src/runtime/Qt3DSTimePolicy.cpp
new file mode 100644
index 0000000..e1efb8e
--- /dev/null
+++ b/src/runtime/Qt3DSTimePolicy.cpp
@@ -0,0 +1,407 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTimePolicy.h"
+#include "foundation/Qt3DSUnionCast.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "Qt3DSComponentManager.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Constants
+//==============================================================================
+const TTimeUnit CTimePolicy::FOREVER = 0;
+
+SAlignedTimeUnit::SAlignedTimeUnit(const TTimeUnit &inUnit)
+{
+ StaticAssert<sizeof(SAlignedTimeUnit) == sizeof(TTimeUnit)>::valid_expression();
+ qt3ds::intrinsics::memCopy(this, &inUnit, sizeof(TTimeUnit));
+}
+
+SAlignedTimeUnit::operator TTimeUnit() const
+{
+ TTimeUnit retval;
+ qt3ds::intrinsics::memCopy(&retval, this, sizeof(TTimeUnit));
+ return retval;
+}
+
+void SAlignedTimeUnit::operator-=(const TTimeUnit &inTime)
+{
+ TTimeUnit theThis(*this);
+ theThis -= inTime;
+ *this = SAlignedTimeUnit(theThis);
+}
+
+void SAlignedTimeUnit::operator%=(const TTimeUnit &inTime)
+{
+ TTimeUnit theThis(*this);
+ theThis %= inTime;
+ *this = SAlignedTimeUnit(theThis);
+}
+
+//==============================================================================
+/**
+ * Initialization
+ */
+
+void CTimePolicy::Initialize(const TTimeUnit inLoopingDuration, TimePolicyModes::Enum inMode)
+{
+ m_LocalTime = 0;
+ m_LoopingDuration = (unsigned long)inLoopingDuration;
+ m_TimePolicyMode = inMode;
+ m_Offset = 0;
+ m_Paused = false;
+ m_OffsetInvalid = 1;
+ m_Backward = 0;
+ m_Rate = 1.0f;
+}
+
+void CTimePolicy::Initialize(const TTimeUnit inLoopingDuration /*= FOREVER*/,
+ UINT32 inRepetitions /*= 1*/, BOOL inPingPong /*= false*/)
+{
+ // UINT8 m_Repetitions : 2; ///< Number of traversal ( 0 = forever, 1 = stop at end, 2 =
+ // ping )
+ TimePolicyModes::Enum theMode = TimePolicyModes::StopAtEnd;
+ if (inRepetitions == 1)
+ theMode = TimePolicyModes::StopAtEnd;
+ else if (inRepetitions == 0) {
+ if (inPingPong)
+ theMode = TimePolicyModes::PingPong;
+ else
+ theMode = TimePolicyModes::Looping;
+ } else
+ theMode = TimePolicyModes::Ping;
+
+ Initialize(inLoopingDuration, theMode);
+}
+
+//==============================================================================
+/**
+ * Return the last computed time. This is subjected to playmodes.
+ * @return local time
+ */
+TTimeUnit CTimePolicy::InternalGetTime() const
+{
+ if (m_LocalTime < m_LoopingDuration)
+ return m_LocalTime;
+ else {
+ if (m_LoopingDuration == 0)
+ return m_LocalTime;
+
+ switch (m_TimePolicyMode) {
+ case TimePolicyModes::StopAtEnd:
+ return m_LoopingDuration;
+ case TimePolicyModes::Looping:
+ return m_LocalTime % m_LoopingDuration;
+ case TimePolicyModes::Ping: {
+ unsigned long interval = m_LocalTime / m_LoopingDuration;
+ unsigned long leftover = m_LocalTime % m_LoopingDuration;
+ if (interval == 1)
+ return m_LoopingDuration - leftover;
+ return 0;
+ }
+ case TimePolicyModes::PingPong: {
+ unsigned long interval = m_LocalTime / m_LoopingDuration;
+ unsigned long leftover = m_LocalTime % m_LoopingDuration;
+ if (interval % 2)
+ return m_LoopingDuration - leftover;
+ return leftover;
+ }
+ default:
+ QT3DS_ASSERT(false);
+ return 0;
+ break;
+ }
+ }
+}
+
+TTimeUnit CTimePolicy::GetTime() const
+{
+ TTimeUnit retval = InternalGetTime();
+ // Apply direction and rate.
+ bool isPlayingBack = m_Backward;
+ if (m_Rate < 0)
+ isPlayingBack = !isPlayingBack;
+
+ if (isPlayingBack)
+ retval = m_LoopingDuration - retval;
+ return retval;
+}
+
+static unsigned long clampTime(long inTime, unsigned long inDuration)
+{
+ if (inTime < 0)
+ return 0;
+ if (inTime > (long)inDuration)
+ return inDuration;
+ return (unsigned long)inTime;
+}
+
+//==============================================================================
+/**
+ * Trigger the policy to return inTime next GetTime is called.
+ * This is tricky math and the m_Offset field is being used both normally to
+ * simply change the time and here to calibrate itself next time ComputeTime
+ * is called.
+ * @param inTime time to be returned next ComputeTime
+ */
+void CTimePolicy::SetTime(TTimeUnit inTime)
+{
+
+ bool isPlayingBack = m_Backward;
+ if (m_Rate < 0)
+ isPlayingBack = !isPlayingBack;
+
+ if (isPlayingBack)
+ inTime = m_LoopingDuration - inTime;
+
+ m_OffsetInvalid = 1;
+
+ // Setup m_LocalTime such that it reflects intime.
+ if (m_LoopingDuration == 0) {
+ m_LocalTime = (unsigned long)inTime;
+ return;
+ }
+
+ switch (m_TimePolicyMode) {
+ case TimePolicyModes::StopAtEnd:
+ m_LocalTime = clampTime((long)inTime, m_LoopingDuration);
+ break;
+ case TimePolicyModes::Looping: {
+ long input = (long)inTime;
+ while (input < 0)
+ input += (long)m_LoopingDuration;
+ m_LocalTime = ((unsigned long)input) % m_LoopingDuration;
+ } break;
+ case TimePolicyModes::Ping: {
+ long input = (long)inTime;
+ if (input < 0)
+ input = 0;
+
+ long totalInterval = (long)(m_LoopingDuration * 2);
+ if (input > totalInterval)
+ m_LocalTime = (unsigned long)totalInterval;
+ else
+ m_LocalTime = (unsigned long)input;
+ } break;
+ case TimePolicyModes::PingPong: {
+ long totalInterval = (long)(m_LoopingDuration * 2);
+ long input = (long)inTime;
+ while (input < 0)
+ input += totalInterval;
+ m_LocalTime = (unsigned long)(input % totalInterval);
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ }
+}
+
+//==============================================================================
+/**
+ * Retrieves the looping duration.
+ * @see CTimePolicy::SetLoopingDuration( )
+ * @return TTimeUnit looping duration
+ */
+TTimeUnit CTimePolicy::GetLoopingDuration() const
+{
+ return m_LoopingDuration;
+}
+
+//==============================================================================
+/**
+ * Set the looping duration.
+ * Looping duration is defined as the time it takes before stopping, pinging or
+ * looping.
+ * @param inTime looping duration
+ */
+void CTimePolicy::SetLoopingDuration(const TTimeUnit inTime)
+{
+ m_LoopingDuration = (unsigned long)inTime;
+}
+
+//==============================================================================
+/**
+ * Return the paused state.
+ * @return BOOL pause state
+ */
+BOOL CTimePolicy::GetPaused() const
+{
+ return m_Paused;
+}
+
+BOOL CTimePolicy::GetPlayBackDirection() const
+{
+ bool reversePlaybackDirection = m_Backward;
+ if (m_Rate < 0)
+ reversePlaybackDirection = !reversePlaybackDirection;
+
+ bool retval = m_LocalTime < m_LoopingDuration;
+
+ if (reversePlaybackDirection)
+ retval = !retval;
+ return retval;
+}
+
+//==============================================================================
+/**
+ * Sets the paused state
+ * @param inPaused pause state
+ */
+void CTimePolicy::SetPaused(const BOOL inPaused)
+{
+ m_Paused = static_cast<UINT8>(inPaused);
+}
+
+BOOL CTimePolicy::UpdateTime(const TTimeUnit inTime)
+{
+ if (fabs(m_Rate) > .001f)
+ m_LocalTime =
+ static_cast<unsigned long>(((unsigned long)(inTime + m_Offset)) * fabs(m_Rate));
+ // else we are effectively stopped and we can't update the time.
+
+ if (m_LoopingDuration == 0)
+ return FALSE;
+
+ unsigned long maxUsefulDuration = m_LoopingDuration * 2;
+ BOOL retval = 0;
+ switch (m_TimePolicyMode) {
+ case TimePolicyModes::StopAtEnd:
+ if (m_LocalTime > m_LoopingDuration) {
+ retval = 1;
+ m_LocalTime = m_LoopingDuration;
+ }
+ break;
+ case TimePolicyModes::Looping:
+ m_LocalTime = m_LocalTime % m_LoopingDuration;
+ break;
+ case TimePolicyModes::Ping:
+ if (m_LocalTime > maxUsefulDuration) {
+ retval = 1;
+ m_LocalTime = maxUsefulDuration;
+ }
+ break;
+ case TimePolicyModes::PingPong:
+ m_LocalTime = m_LocalTime % maxUsefulDuration;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ return retval;
+}
+//==============================================================================
+/**
+ * Compute the local time based off the current global time and the settings
+ * such as duration, repetitions and ping-pong.
+ * @param inTime global time being fed
+ * @return BOOL true if policy has reached it's end time
+ */
+BOOL CTimePolicy::ComputeTime(const TTimeUnit inTime)
+{
+ // Return the last computed time if paused
+ if (m_Paused || m_OffsetInvalid) {
+ // m_LocalTime = inTime + m_Offset;
+ if (fabs(m_Rate) > .001)
+ m_Offset = (TTimeUnit)(m_LocalTime / fabs(m_Rate)) - inTime;
+ else // rate is zero, this should not happen.
+ m_Offset = (TTimeUnit)(m_LocalTime)-inTime;
+ m_OffsetInvalid = 0;
+ return false;
+ }
+ return UpdateTime(inTime);
+}
+
+eastl::pair<BOOL, TTimeUnit>
+SComponentTimePolicyOverride::ComputeLocalTime(CTimePolicy &inTimePolicy, TTimeUnit inGlobalTime)
+{
+ TTimeUnit retval = 0;
+ BOOL finished = FALSE;
+ if (inTimePolicy.m_Paused || inTimePolicy.m_OffsetInvalid) {
+ finished = inTimePolicy.ComputeTime(inGlobalTime);
+ } else {
+ Q3DStudio_ASSERT(m_EndTime <= inTimePolicy.GetLoopingDuration());
+ unsigned long newLocalTime = (unsigned long)(inGlobalTime + inTimePolicy.m_Offset);
+
+ float diff = static_cast<float>(newLocalTime - inTimePolicy.GetTime());
+ diff *= m_TimeMultiplier;
+ float updatedLocalTime = static_cast<float>(inTimePolicy.m_LocalTime) + diff;
+
+ if (updatedLocalTime < 0.0f)
+ updatedLocalTime = 0.0f;
+
+ inTimePolicy.m_LocalTime = static_cast<unsigned long>(updatedLocalTime);
+
+ bool runningBackwards = m_TimeMultiplier < 0;
+
+ if (runningBackwards) {
+ if (inTimePolicy.m_LocalTime <= m_EndTime) {
+ finished = TRUE;
+ inTimePolicy.m_LocalTime = (unsigned long)m_EndTime;
+ }
+ } else // running forwards
+ {
+ if (inTimePolicy.m_LocalTime >= m_EndTime) {
+ finished = TRUE;
+ inTimePolicy.m_LocalTime = (unsigned long)m_EndTime;
+ }
+ }
+ inTimePolicy.m_Offset = inTimePolicy.m_LocalTime - inGlobalTime;
+ }
+ retval = inTimePolicy.GetTime();
+ return eastl::make_pair(finished, retval);
+}
+
+void SComponentTimePolicyOverride::SetTime(CTimePolicy &inTimePolicy, TTimeUnit inLocalTime)
+{
+ if (inLocalTime < 0)
+ inLocalTime = 0;
+ if (m_TimeMultiplier < 0) {
+ if (inLocalTime <= m_EndTime) {
+ inLocalTime = m_EndTime;
+ }
+ } else // running forwards
+ {
+ if (inLocalTime >= m_EndTime) {
+ inLocalTime = m_EndTime;
+ }
+ }
+ inTimePolicy.SetTime(inLocalTime);
+}
+
+} // namespace Q3DStudio
diff --git a/src/runtime/Qt3DSTimePolicy.h b/src/runtime/Qt3DSTimePolicy.h
new file mode 100644
index 0000000..6a13719
--- /dev/null
+++ b/src/runtime/Qt3DSTimePolicy.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "foundation/Qt3DSOption.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+struct TimePolicyModes
+{
+ enum Enum {
+ StopAtEnd = 0,
+ Looping,
+ PingPong,
+ Ping,
+ };
+};
+
+//==============================================================================
+/**
+ * Filter time based of parameters such as loop, duration, ping-pong etc.
+ *
+ * The time policy is an agnostic class that transforms time units based on
+ * internal settings and times given to it. Think of it as the minimal
+ * intelligence needed to support the time playback modes we use. It is simply
+ * a function that takes in a source time variable, adjusts it accordingly,
+ * and returns a filtered version.
+ */
+
+QT3DS_ALIGN_PREFIX(4) class CTimePolicy
+{
+ //==============================================================================
+ // Fields and Constants
+ //==============================================================================
+public:
+ const static TTimeUnit FOREVER; ///< Forever repetitions means loop forever, Forever duration
+ ///means infinite duration
+ friend struct SComponentTimePolicyOverride; ///< This class needs to mangle some of our internal
+ ///members to keep everything consistent
+
+protected:
+ // Time policy related ( 20 bytes )
+ unsigned long m_LocalTime; ///< Component current local time; transformed by playmodes
+ unsigned long m_LoopingDuration; ///< Looping duration
+ SAlignedTimeUnit m_Offset; ///< Subtraction modifier
+ FLOAT m_Rate; ///< Time policy rate
+ UINT8 m_TimePadding[12]; ///< Padding to keep the size of the time policy the same.
+
+ UINT8
+ m_TimePolicyMode : 2; ///< Number of durations before halting - FOREVER means infinite reps
+ UINT8 m_Paused : 1; ///< Paused or playing
+ UINT8 m_OffsetInvalid : 1; ///< True if we need to reset our offset
+ UINT8 m_Backward : 1; ///< True if are in 'reverse' mode
+
+ UINT8 m_Unused[3]; ///< (Padding 3 bytes)
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ void Initialize(const TTimeUnit inLoopingDuration = FOREVER,
+ TimePolicyModes::Enum inMode = TimePolicyModes::StopAtEnd);
+ void Initialize(const TTimeUnit inLoopingDuration, UINT32 inRepetitions, BOOL inPingPong);
+
+public: // Access Methods
+ FLOAT GetRate() const { return m_Rate; }
+ void SetRate(float inRate) { m_Rate = inRate; }
+
+ bool IsReverse() const { return m_Backward; }
+ void SetReverse(bool inIsReverse) { m_Backward = inIsReverse ? 1 : 0; }
+
+ TTimeUnit GetTime() const;
+ void SetTime(TTimeUnit inTime);
+
+ TTimeUnit GetLoopingDuration() const;
+ void SetLoopingDuration(const TTimeUnit inTime);
+
+ BOOL GetPaused() const;
+ void SetPaused(const BOOL inPaused);
+
+ BOOL GetPlayBackDirection() const;
+
+public: // Time update
+ // The addendum contains extra parameters used that can be specified in a goto-slide command
+ // in the uia file.
+ BOOL ComputeTime(const TTimeUnit inTime);
+
+private:
+ TTimeUnit InternalGetTime() const;
+
+ BOOL UpdateTime(const TTimeUnit inTime);
+} QT3DS_ALIGN_SUFFIX(4);
+
+} // namespace Q3DStudio
diff --git a/src/runtime/RuntimePrefix.h b/src/runtime/RuntimePrefix.h
new file mode 100644
index 0000000..bf729eb
--- /dev/null
+++ b/src/runtime/RuntimePrefix.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "render/backends/gl/Qt3DSOpenGLPrefix.h"
+
+#ifdef _WIN32
+//==============================================================================
+// DISABLED WARNINGS
+//
+// Note that most of these warnings are tuned off by default by the compiler
+// even at warning level 4. Using option /Wall turns on all warnings and makes
+// even standard Microsoft include files cry. We had to turn off these or
+// turn off warnings individually for each standard include file which was
+// too much work. Point is that /Wall is like Warning Level 5 and this brings
+// it down to about Warning level 4.5, still way above /W4.
+//#pragma warning( disable : 4189 ) // local variable is initialized but not referenced
+#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
+#pragma warning(disable : 4511) // copy constructor could not be generated
+#pragma warning(disable : 4512) // assignment operator could not be generated
+#pragma warning(disable : 4514) // unreferenced inline function has been removed
+#pragma warning(disable : 4619) // #pragma warning : there is no warning number '4619' (in string.h)
+#pragma warning(disable : 4625) // copy constructor could not be generated because a base class copy
+ // constructor is inaccessible
+#pragma warning(disable : 4626) // assignment operator could not be generated because a base class
+ // assignment operator is inaccessible
+#pragma warning( \
+ disable : 4668) // not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
+#pragma warning(disable : 4826) // Conversion from 'const void *' to 'void *' is sign-extended
+#pragma warning(disable : 4996) // _snprintf' was declared deprecated
+#pragma warning(disable : 4711) // function selected for automatic inline expansion
+#pragma warning(disable : 4710) // function not inlined
+#pragma warning( \
+ disable : 4738) // storing 32-bit float result in memory, possible loss of performance
+
+#pragma warning(disable : 4640) // construction of local static object is not thread-safe
+#pragma warning(disable : 4127) // conditional expression is constant
+
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#endif //_WIN32
+
+//==============================================================================
+// STD INCLUDES - Standard includes MUST come first
+#include <stdlib.h> // Standard functions
+#include <stdio.h> // File and IO
+#ifndef _INTEGRITYPLATFORM
+#include <memory.h> // memset, memcpy
+#endif
+#include <string.h> // strlen
+
+#if defined(_LINUXPLATFORM) || defined(_INTEGRITYPLATFORM)
+#include <stdint.h>
+
+#define UNREFERENCED_PARAMETER(theParam) theParam;
+#endif
+
+//==============================================================================
+// ROOT INCLUDES FOR FRAMEWORK
+//==============================================================================
+#include "Qt3DSTypes.h"
+#include "Qt3DSPlatformSpecific.h"
+#include "Qt3DSAssert.h"
+#include "Qt3DSMacros.h"
+#include "Qt3DSConfig.h"
+#include "Qt3DSMemorySettings.h"
+#include "Qt3DSMemory.h"
+#include "Qt3DSFrameworkTypes.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTimer.h"
+#include "Qt3DSIScene.h"
+#include "foundation/Qt3DSRefCounted.h" //scoped releasable auto ptr.
+#include "EASTL/hash_map.h"
+#include "EASTL/string.h"
diff --git a/src/runtime/q3dsmaterialdefinitionparser.cpp b/src/runtime/q3dsmaterialdefinitionparser.cpp
new file mode 100644
index 0000000..913a24e
--- /dev/null
+++ b/src/runtime/q3dsmaterialdefinitionparser.cpp
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsmaterialdefinitionparser.h"
+
+#include <QtCore/qfile.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qxmlstream.h>
+#include <QtCore/qtextstream.h>
+#include <QtCore/qdebug.h>
+
+namespace Q3DStudio {
+
+void Q3DSMaterialDefinitionParser::getMaterialInfo(const QString &materialDefinition,
+ const QString &projPath, const QString &presPath,
+ QString &outName, QMap<QString, QString> &outValues,
+ QMap<QString, QMap<QString, QString>> &outTextureValues)
+{
+ // materialDefinition can be the .materialdef file name or its content
+ QString matDef;
+ if (materialDefinition.endsWith(QLatin1String(".materialdef"), Qt::CaseInsensitive)) {
+ QFile file(materialDefinition);
+ if (!file.open(QFile::Text | QFile::ReadOnly)) {
+ qWarning() << __FUNCTION__ << "Failed to open material definition file:"
+ << file.errorString();
+ return;
+ }
+ QTextStream stream(&file);
+ matDef = stream.readAll();
+ } else {
+ matDef = materialDefinition;
+ }
+
+ QXmlStreamReader reader(matDef);
+ reader.setNamespaceProcessing(false);
+
+ const QDir docDir(presPath);
+ const QDir projDir(projPath);
+ QString textureName;
+ QString propertyName;
+ QString propertyType;
+ QString propertyValue;
+ QMap<QString, QString> textureProperties;
+
+ const QString matDataVersion = QStringLiteral("1.0");
+ const QString sourcePathStr = QStringLiteral("sourcepath");
+ const QString nameStr = QStringLiteral("name");
+ const QString typeStr = QStringLiteral("type");
+ const QString versionStr = QStringLiteral("version");
+
+ while (!reader.atEnd()) {
+ reader.readNext();
+ if (reader.tokenType() == QXmlStreamReader::StartElement) {
+ if (reader.name() == QLatin1String("TextureData")) {
+ textureName = reader.attributes().value(nameStr).toString();
+ textureProperties.clear();
+ } else if (reader.name() == QLatin1String("Property")) {
+ propertyName = reader.attributes().value(nameStr).toString();
+ propertyType = reader.attributes().value(typeStr).toString();
+ propertyValue.clear();
+ } else if (reader.name() == QLatin1String("MaterialData")) {
+ QString version = reader.attributes().value(versionStr).toString();
+ if (version != matDataVersion) {
+ qWarning() << __FUNCTION__ << "Invalid MaterialData version; expected '"
+ << matDataVersion << "', got '" << version << "'";
+ outName.clear();
+ outValues.clear();
+ outTextureValues.clear();
+ return;
+ }
+ }
+ } else if (reader.tokenType() == QXmlStreamReader::EndElement) {
+ if (reader.name() == QLatin1String("TextureData")) {
+ outTextureValues[textureName] = textureProperties;
+ textureName.clear();
+ } else if (reader.name() == QLatin1String("Property")) {
+ if (textureName.isEmpty()) {
+ outValues[propertyName] = propertyValue;
+ if (propertyName == nameStr)
+ outName = propertyValue;
+ } else {
+ textureProperties[propertyName] = propertyValue;
+ }
+ propertyName.clear();
+ propertyType.clear();
+ }
+ } else if (reader.tokenType() == QXmlStreamReader::Characters) {
+ if (!propertyName.isEmpty()) {
+ propertyValue = reader.text().toString();
+ if (propertyName == sourcePathStr) {
+ // Check that the referenced file exists
+ const auto absSourcePath = projDir.absoluteFilePath(propertyValue);
+ if (!QFileInfo(absSourcePath).exists()) {
+ qWarning() << __FUNCTION__ << "Referenced file doesn't exist:"
+ << propertyValue;
+ outName.clear();
+ outValues.clear();
+ outTextureValues.clear();
+ return;
+ }
+ }
+ if (!propertyValue.isEmpty() && (propertyType == QLatin1String("Texture")
+ || propertyName == sourcePathStr)) {
+ propertyValue = docDir.relativeFilePath(
+ projDir.absoluteFilePath(propertyValue));
+ }
+ }
+ }
+ }
+}
+
+}
diff --git a/src/runtime/q3dsmaterialdefinitionparser.h b/src/runtime/q3dsmaterialdefinitionparser.h
new file mode 100644
index 0000000..f6d98bb
--- /dev/null
+++ b/src/runtime/q3dsmaterialdefinitionparser.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSMATERIALDEFINITIONPARSER_H
+#define Q3DSMATERIALDEFINITIONPARSER_H
+
+#include <QtCore/qstring.h>
+#include <QtCore/qmap.h>
+
+namespace Q3DStudio {
+
+class Q3DSMaterialDefinitionParser
+{
+public:
+ static void getMaterialInfo(const QString &materialDefinition,
+ const QString &projPath, const QString &presPath,
+ QString &outName, QMap<QString, QString> &outValues,
+ QMap<QString, QMap<QString, QString>> &outTextureValues);
+};
+
+}
+
+#endif
diff --git a/src/runtime/q3dsqmlbehavior.cpp b/src/runtime/q3dsqmlbehavior.cpp
new file mode 100644
index 0000000..83b706e
--- /dev/null
+++ b/src/runtime/q3dsqmlbehavior.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlbehavior.h"
+#include "q3dsqmlscript.h"
+
+namespace Q3DStudio {
+
+Q3DSQmlBehavior::Q3DSQmlBehavior(QObject *parent)
+ : QObject(parent), m_script(nullptr)
+{
+
+}
+
+void Q3DSQmlBehavior::setScript(Q3DSQmlScript *script)
+{
+ m_script = script;
+}
+
+float Q3DSQmlBehavior::getDeltaTime()
+{
+ return m_script->getDeltaTime();
+}
+
+float Q3DSQmlBehavior::getAttribute(const QString &attribute)
+{
+ return m_script->getAttribute(attribute);
+}
+
+void Q3DSQmlBehavior::setAttribute(const QString &attribute, const QVariant &value)
+{
+ m_script->setAttribute(attribute, value);
+}
+
+void Q3DSQmlBehavior::setAttribute(const QString &handle, const QString &attribute,
+ const QVariant &value)
+{
+ m_script->setAttribute(handle, attribute, value);
+}
+
+void Q3DSQmlBehavior::fireEvent(const QString &event)
+{
+ m_script->fireEvent(event);
+}
+
+void Q3DSQmlBehavior::registerForEvent(const QString &event, const QJSValue &function)
+{
+ m_script->registerForEvent(event, function);
+}
+
+void Q3DSQmlBehavior::registerForEvent(const QString &handle, const QString &event,
+ const QJSValue &function)
+{
+ m_script->registerForEvent(handle, event, function);
+}
+
+void Q3DSQmlBehavior::unregisterForEvent(const QString &event)
+{
+ m_script->unregisterForEvent(event);
+}
+
+void Q3DSQmlBehavior::unregisterForEvent(const QString &handle, const QString &event)
+{
+ m_script->unregisterForEvent(handle, event);
+}
+
+QVector2D Q3DSQmlBehavior::getMousePosition()
+{
+ return m_script->getMousePosition();
+}
+
+QMatrix4x4 Q3DSQmlBehavior::calculateGlobalTransform(const QString &handle)
+{
+ return m_script->calculateGlobalTransform(handle);
+}
+
+QVector3D Q3DSQmlBehavior::lookAt(const QVector3D &target)
+{
+ return m_script->lookAt(target);
+}
+
+QVector3D Q3DSQmlBehavior::matrixToEuler(const QMatrix4x4 &matrix)
+{
+ return m_script->matrixToEuler(matrix);
+}
+
+QString Q3DSQmlBehavior::getParent(const QString &handle)
+{
+ return m_script->getParent(handle);
+}
+
+void Q3DSQmlBehavior::setDataInputValue(const QString &name, const QVariant &value)
+{
+ return m_script->setDataInputValue(name, value);
+}
+
+}
diff --git a/src/runtime/q3dsqmlbehavior.h b/src/runtime/q3dsqmlbehavior.h
new file mode 100644
index 0000000..76f4a4a
--- /dev/null
+++ b/src/runtime/q3dsqmlbehavior.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSQMLBEHAVIOR_H
+#define Q3DSQMLBEHAVIOR_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qvariant.h>
+#include <QtQml/qjsvalue.h>
+#include <QtGui/qvector2d.h>
+#include <QtGui/qvector3d.h>
+#include <QtGui/qmatrix4x4.h>
+
+namespace Q3DStudio {
+
+class Q3DSQmlScript;
+
+class Q3DSQmlBehavior : public QObject
+{
+ Q_OBJECT
+public:
+ Q3DSQmlBehavior(QObject *parent = nullptr);
+
+ void setScript(Q3DSQmlScript *script);
+
+ Q_INVOKABLE float getDeltaTime();
+ Q_INVOKABLE float getAttribute(const QString &attribute);
+ Q_INVOKABLE void setAttribute(const QString &attribute, const QVariant &value);
+ Q_INVOKABLE void setAttribute(const QString &handle, const QString &attribute,
+ const QVariant &value);
+ Q_INVOKABLE void fireEvent(const QString &event);
+ Q_INVOKABLE void registerForEvent(const QString &event, const QJSValue &function);
+ Q_INVOKABLE void registerForEvent(const QString &handle, const QString &event,
+ const QJSValue &function);
+ Q_INVOKABLE void unregisterForEvent(const QString &event);
+ Q_INVOKABLE void unregisterForEvent(const QString &handle, const QString &event);
+ Q_INVOKABLE QVector2D getMousePosition();
+ Q_INVOKABLE QMatrix4x4 calculateGlobalTransform(const QString &handle = QString());
+ Q_INVOKABLE QVector3D lookAt(const QVector3D &target);
+ Q_INVOKABLE QVector3D matrixToEuler(const QMatrix4x4 &matrix);
+ Q_INVOKABLE QString getParent(const QString &handle = QString());
+ Q_REVISION(1) Q_INVOKABLE void setDataInputValue(const QString &name, const QVariant &value);
+
+
+Q_SIGNALS:
+ void initialize();
+ void activate();
+ void update();
+ void deactivate();
+
+private:
+ Q3DSQmlScript *m_script;
+};
+
+}
+
+#endif
diff --git a/src/runtime/q3dsqmlscript.cpp b/src/runtime/q3dsqmlscript.cpp
new file mode 100644
index 0000000..725c752
--- /dev/null
+++ b/src/runtime/q3dsqmlscript.cpp
@@ -0,0 +1,742 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlscript.h"
+
+#include "Qt3DSQmlEngine.h"
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSPresentation.h"
+#include "Qt3DSInputEngine.h"
+#include "Qt3DSInputFrame.h"
+#include "Qt3DSQmlElementHelper.h"
+#include "Qt3DSHash.h"
+#include "Qt3DSEulerAngles.h"
+#include "Qt3DSMathUtils.h"
+
+#include <QMetaProperty>
+
+using namespace Q3DStudio;
+using namespace qt3ds::runtime;
+
+QJSValue argToQJSValue(qt3ds::foundation::IStringTable &strTable,
+ Q3DStudio::UINT8 type, const UVariant &value) {
+ switch (type) {
+ case ATTRIBUTETYPE_INT32:
+ case ATTRIBUTETYPE_HASH:
+ return QJSValue(value.m_INT32);
+ case ATTRIBUTETYPE_FLOAT:
+ return QJSValue(value.m_FLOAT);
+ case ATTRIBUTETYPE_BOOL:
+ return QJSValue(value.m_INT32 != 0);
+ case ATTRIBUTETYPE_STRING:
+ return QJSValue(strTable.HandleToStr(value.m_StringHandle));
+ case ATTRIBUTETYPE_NONE:
+ return QJSValue();
+ default:
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Pushed event argument value of unknown type: "<< type;
+ }
+ return QJSValue();
+}
+
+void eventCallback(void *contextData, SEventCommand &event)
+{
+ auto data = static_cast<Q3DSQmlScript::EventData *>(contextData);
+ qt3ds::foundation::IStringTable &strTable(
+ event.m_Target->GetBelongedPresentation()->GetStringTable());
+ QJSValue arg1 = argToQJSValue(strTable, event.m_Arg1Type, event.m_Arg1);
+ QJSValue arg2 = argToQJSValue(strTable, event.m_Arg2Type, event.m_Arg2);
+ data->function.call({arg1, arg2});
+}
+
+Q3DSQmlScript::Q3DSQmlScript(CQmlEngine &api, Q3DSQmlBehavior &object,
+ TElement &behavior, TElement &owner)
+ : QObject(nullptr)
+ , m_api(api)
+ , m_object(object)
+ , m_behavior(behavior)
+ , m_owner(owner)
+ , m_initialized(false)
+ , m_lastActivationState(false)
+ , m_deltaTime(0.0f)
+ , m_lastTime(0)
+{
+ qt3ds::foundation::IStringTable &strTable
+ = m_behavior.GetBelongedPresentation()->GetStringTable();
+ const QMetaObject *meta = object.metaObject();
+ for (int i = 0; i < meta->propertyCount(); ++i) {
+ QMetaProperty property = meta->property(i);
+ QVariant::Type t = property.type();
+ if (static_cast<QMetaType::Type>(t) == QMetaType::QVariant) {
+ // detect type from behavior property
+ auto nameHash = CHash::HashAttribute(property.name());
+ Option<element::TPropertyDescAndValuePtr> value = behavior.FindProperty(nameHash);
+ if (value.hasValue()) {
+ switch (value->first.m_Type) {
+ case ATTRIBUTETYPE_INT32:
+ case ATTRIBUTETYPE_HASH:
+ t = QVariant::Int;
+ break;
+ case ATTRIBUTETYPE_FLOAT:
+ t = QVariant::Double;
+ break;
+ case ATTRIBUTETYPE_BOOL:
+ t = QVariant::Bool;
+ break;
+ case ATTRIBUTETYPE_STRING:
+ t = QVariant::String;
+ break;
+ case ATTRIBUTETYPE_FLOAT4:
+ t = QVariant::Vector4D;
+ break;
+ case ATTRIBUTETYPE_FLOAT3:
+ t = QVariant::Vector3D;
+ break;
+ case ATTRIBUTETYPE_FLOAT2:
+ t = QVariant::Vector2D;
+ break;
+ default:
+ break;
+ }
+ } else {
+ // detect vectors
+ QByteArray name(property.name());
+ QByteArray xname = name + QByteArrayLiteral(".x");
+ Option<element::TPropertyDescAndValuePtr> xvalue
+ = behavior.FindProperty(CHash::HashAttribute(xname.data()));
+ QByteArray rname = name + QByteArrayLiteral(".r");
+ Option<element::TPropertyDescAndValuePtr> rvalue
+ = behavior.FindProperty(CHash::HashAttribute(rname.data()));
+ if (xvalue.hasValue()) {
+ QByteArray yname = name + QByteArrayLiteral(".y");
+ QByteArray zname = name + QByteArrayLiteral(".z");
+ QByteArray wname = name + QByteArrayLiteral(".w");
+
+ Option<element::TPropertyDescAndValuePtr> yvalue
+ = behavior.FindProperty(CHash::HashAttribute(yname.data()));
+ Option<element::TPropertyDescAndValuePtr> zvalue
+ = behavior.FindProperty(CHash::HashAttribute(zname.data()));
+ Option<element::TPropertyDescAndValuePtr> wvalue
+ = behavior.FindProperty(CHash::HashAttribute(wname.data()));
+ int count = 1;
+ count += yvalue.hasValue() ? 1 : 0;
+ count += zvalue.hasValue() ? 1 : 0;
+ count += wvalue.hasValue() ? 1 : 0;
+ if (count == 2)
+ t = QVariant::Vector2D;
+ else if (count == 3)
+ t = QVariant::Vector3D;
+ else if (count == 4)
+ t = QVariant::Vector4D;
+ } else if (rvalue.hasValue()) {
+ QByteArray gname = name + QByteArrayLiteral(".g");
+ QByteArray bname = name + QByteArrayLiteral(".b");
+ QByteArray aname = name + QByteArrayLiteral(".a");
+ Option<element::TPropertyDescAndValuePtr> gvalue
+ = behavior.FindProperty(CHash::HashAttribute(gname.data()));
+ Option<element::TPropertyDescAndValuePtr> bvalue
+ = behavior.FindProperty(CHash::HashAttribute(bname.data()));
+ Option<element::TPropertyDescAndValuePtr> avalue
+ = behavior.FindProperty(CHash::HashAttribute(aname.data()));
+ int count = 1;
+ count += gvalue.hasValue() ? 1 : 0;
+ count += bvalue.hasValue() ? 1 : 0;
+ count += avalue.hasValue() ? 1 : 0;
+ if (count == 2)
+ t = QVariant::Vector2D;
+ else if (count == 3)
+ t = QVariant::Vector3D;
+ else if (count == 4)
+ t = QVariant::Vector4D;
+ }
+ }
+ }
+ switch (t) {
+ case QVariant::Bool: {
+ const char *name = property.name();
+ auto nameHash = CHash::HashAttribute(name);
+ Option<element::TPropertyDescAndValuePtr> value = behavior.FindProperty(nameHash);
+ if (value.hasValue()) {
+ std::function<void()> mapper = [&object, property, value]() -> void {
+ Q3DStudio::UVariant *val = value->second;
+ property.write(&object, QVariant::fromValue<bool>(val->m_INT32 > 0));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ } break;
+ case QVariant::Int:
+ case QVariant::UInt:
+ case QVariant::LongLong:
+ case QVariant::ULongLong: {
+ const char *name = property.name();
+ auto nameHash = CHash::HashAttribute(name);
+ Option<element::TPropertyDescAndValuePtr> value = behavior.FindProperty(nameHash);
+ if (value.hasValue()) {
+ std::function<void()> mapper = [&object, property, value]() {
+ Q3DStudio::UVariant *val = value->second;
+ property.write(&object, QVariant::fromValue(val->m_INT32));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ } break;
+ case QVariant::Double: {
+ const char *name = property.name();
+ auto nameHash = CHash::HashAttribute(name);
+ Option<element::TPropertyDescAndValuePtr> value = behavior.FindProperty(nameHash);
+ if (value.hasValue()) {
+ std::function<void()> mapper = [&object, property, value]() {
+ Q3DStudio::UVariant *val = value->second;
+ property.write(&object, QVariant::fromValue(val->m_FLOAT));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ } break;
+ case QVariant::String: {
+ const char *name = property.name();
+ auto nameHash = CHash::HashAttribute(name);
+ Option<element::TPropertyDescAndValuePtr> value = behavior.FindProperty(nameHash);
+ if (value.hasValue()) {
+ std::function<void()> mapper = [&object, property, value, &strTable]() {
+ Q3DStudio::UVariant *val = value->second;
+ property.write(&object, QVariant::fromValue(
+ QString::fromUtf8(strTable.HandleToStr(val->m_StringHandle).c_str())));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ } break;
+ case QVariant::Vector2D: {
+ std::function<void()> mapper;
+ auto nameHash = CHash::HashAttribute(property.name());
+ Option<element::TPropertyDescAndValuePtr> prop = behavior.FindProperty(nameHash);
+ if (prop.hasValue() && prop->first.m_Type == Q3DStudio::ATTRIBUTETYPE_FLOAT2) {
+ mapper = [&object, property, prop]() {
+ QVector2D vec;
+ Q3DStudio::UVariant *value = prop->second;
+ vec.setX(value->m_FLOAT3[0]);
+ vec.setY(value->m_FLOAT3[1]);
+ property.write(&object, QVariant::fromValue(vec));
+ };
+ m_mappedProperties.push_back(mapper);
+ } else {
+ QByteArray name(property.name());
+ QByteArray cname = name + QByteArrayLiteral(".x");
+ auto nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> xvalue = behavior.FindProperty(nameHash);
+ if (xvalue.hasValue()) {
+ cname = name + QByteArrayLiteral(".y");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> yvalue
+ = behavior.FindProperty(nameHash);
+
+ if (xvalue.hasValue() && yvalue.hasValue()) {
+ mapper = [&object, property, xvalue, yvalue]() {
+ QVector2D vec;
+ vec.setX(xvalue->second->m_FLOAT);
+ vec.setY(yvalue->second->m_FLOAT);
+ property.write(&object, QVariant::fromValue(vec));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ }
+ }
+ } break;
+ case QVariant::Vector3D: {
+ std::function<void()> mapper;
+ auto nameHash = CHash::HashAttribute(property.name());
+ Option<element::TPropertyDescAndValuePtr> prop = behavior.FindProperty(nameHash);
+ if (prop.hasValue() && prop->first.m_Type == Q3DStudio::ATTRIBUTETYPE_FLOAT3) {
+ mapper = [&object, property, prop]() {
+ QVector3D vec;
+ Q3DStudio::UVariant *value = prop->second;
+ vec.setX(value->m_FLOAT3[0]);
+ vec.setY(value->m_FLOAT3[1]);
+ vec.setZ(value->m_FLOAT3[2]);
+ property.write(&object, QVariant::fromValue(vec));
+ };
+ m_mappedProperties.push_back(mapper);
+ } else {
+ QByteArray name(property.name());
+ QByteArray cname = name + QByteArrayLiteral(".x");
+ auto nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> xvalue = behavior.FindProperty(nameHash);
+ if (xvalue.hasValue()) {
+ cname = name + QByteArrayLiteral(".y");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> yvalue
+ = behavior.FindProperty(nameHash);
+ cname = name + QByteArrayLiteral(".z");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> zvalue
+ = behavior.FindProperty(nameHash);
+
+ if (xvalue.hasValue() && yvalue.hasValue() && zvalue.hasValue()) {
+ mapper = [&object, property, xvalue, yvalue, zvalue]() {
+ QVector3D vec;
+ vec.setX(xvalue->second->m_FLOAT);
+ vec.setY(yvalue->second->m_FLOAT);
+ vec.setZ(zvalue->second->m_FLOAT);
+ property.write(&object, QVariant::fromValue(vec));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ }
+ }
+ } break;
+ case QVariant::Color:
+ case QVariant::Vector4D: {
+ std::function<void()> mapper;
+ auto nameHash = CHash::HashAttribute(property.name());
+ Option<element::TPropertyDescAndValuePtr> prop = behavior.FindProperty(nameHash);
+ if (prop.hasValue() && prop->first.m_Type == Q3DStudio::ATTRIBUTETYPE_FLOAT4) {
+ mapper = [&object, property, prop]() {
+ QVector4D vec;
+ Q3DStudio::UVariant *value = prop->second;
+ vec.setX(value->m_FLOAT4[0]);
+ vec.setY(value->m_FLOAT4[1]);
+ vec.setZ(value->m_FLOAT4[2]);
+ vec.setW(value->m_FLOAT4[3]);
+ property.write(&object, QVariant::fromValue(vec));
+ };
+ m_mappedProperties.push_back(mapper);
+ } else {
+ QByteArray name(property.name());
+ QByteArray cname = name + QByteArrayLiteral(".x");
+ auto nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> xvalue = behavior.FindProperty(nameHash);
+ if (xvalue.hasValue()) {
+ cname = name + QByteArrayLiteral(".y");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> yvalue
+ = behavior.FindProperty(nameHash);
+ cname = name + QByteArrayLiteral(".z");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> zvalue
+ = behavior.FindProperty(nameHash);
+ cname = name + QByteArrayLiteral(".w");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> wvalue
+ = behavior.FindProperty(nameHash);
+
+ if (xvalue.hasValue() && yvalue.hasValue() && zvalue.hasValue()
+ && wvalue.hasValue()) {
+ mapper = [&object, property, xvalue, yvalue, zvalue, wvalue]() {
+ QVector4D vec;
+ vec.setX(xvalue->second->m_FLOAT);
+ vec.setY(yvalue->second->m_FLOAT);
+ vec.setZ(zvalue->second->m_FLOAT);
+ vec.setW(wvalue->second->m_FLOAT);
+ property.write(&object, QVariant::fromValue(vec));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ } else {
+ cname = name + QByteArrayLiteral(".r");
+ auto nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> rvalue
+ = behavior.FindProperty(nameHash);
+ if (rvalue.hasValue()) {
+ cname = name + QByteArrayLiteral(".g");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> gvalue
+ = behavior.FindProperty(nameHash);
+ cname = name + QByteArrayLiteral(".b");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> bvalue
+ = behavior.FindProperty(nameHash);
+ cname = name + QByteArrayLiteral(".a");
+ nameHash = CHash::HashAttribute(cname.data());
+ Option<element::TPropertyDescAndValuePtr> avalue
+ = behavior.FindProperty(nameHash);
+
+ if (rvalue.hasValue() && gvalue.hasValue() && bvalue.hasValue()
+ && avalue.hasValue()) {
+ mapper = [&object, property, rvalue, gvalue, bvalue, avalue]() {
+ QVector4D vec;
+ vec.setX(rvalue->second->m_FLOAT);
+ vec.setY(gvalue->second->m_FLOAT);
+ vec.setZ(bvalue->second->m_FLOAT);
+ vec.setW(avalue->second->m_FLOAT);
+ property.write(&object, QVariant::fromValue(vec));
+ };
+ m_mappedProperties.push_back(mapper);
+ }
+ }
+ }
+ }
+ } break;
+ default:
+ break;
+ }
+ }
+}
+
+Q3DSQmlScript::~Q3DSQmlScript()
+{
+ for (const EventCallbackInfo &callback : m_eventCallbacks)
+ delete callback.data;
+}
+
+void Q3DSQmlScript::update()
+{
+ updateProperties();
+
+ bool active = m_behavior.GetActive();
+
+ if (active && !m_initialized) {
+ m_initialized = true;
+ Q_EMIT m_object.initialize();
+ }
+
+ TTimeUnit time = static_cast<CPresentation *>(m_behavior.GetBelongedPresentation())->GetTime();
+ m_deltaTime = (time - m_lastTime) / 1000.0f;
+ m_lastTime = time;
+
+ if (m_lastActivationState != active) {
+ if (active)
+ Q_EMIT m_object.activate();
+ else
+ Q_EMIT m_object.deactivate();
+ }
+ m_lastActivationState = active;
+ if (active)
+ Q_EMIT m_object.update();
+}
+
+void Q3DSQmlScript::call(const QString &function)
+{
+ const QMetaObject *meta = m_object.metaObject();
+ const QString normalized = function + "()";
+ if (meta->indexOfMethod(normalized.toUtf8().constData()) != -1)
+ QMetaObject::invokeMethod(&m_object, function.toUtf8().constData());
+}
+
+void Q3DSQmlScript::updateProperties()
+{
+ using namespace qt3ds::foundation;
+ using namespace qt3ds::runtime::element;
+
+ if (!m_behavior.GetActive() || !m_behavior.IsDirty())
+ return;
+
+ for (auto m : qAsConst(m_mappedProperties))
+ m();
+}
+
+bool Q3DSQmlScript::hasBehavior(const TElement *behavior)
+{
+ return &m_behavior == behavior;
+}
+
+float Q3DSQmlScript::getDeltaTime()
+{
+ return m_deltaTime;
+}
+
+float Q3DSQmlScript::getAttribute(const QString &attribute)
+{
+ if (!m_behavior.GetActive())
+ return 0;
+
+ float floatValue = 0;
+ m_api.GetAttribute(&m_owner,
+ attribute.toUtf8().constData(),
+ (char *)&floatValue);
+ return floatValue;
+}
+
+void Q3DSQmlScript::setAttribute(const QString &attribute, const QVariant &value)
+{
+ setAttribute("", attribute, value);
+}
+
+void Q3DSQmlScript::setAttribute(const QString &handle, const QString &attribute,
+ const QVariant &value)
+{
+ if (!m_behavior.GetActive())
+ return;
+
+ TElement *element = &m_owner;
+ if (!handle.isEmpty())
+ element = getElementByPath(handle);
+ if (!element)
+ return;
+
+ QByteArray valueStr;
+ float valueFloat;
+
+ const char *valuePtr = nullptr;
+ switch (static_cast<QMetaType::Type>(value.type())) {
+ case QMetaType::Bool:
+ case QMetaType::Int:
+ case QMetaType::Double:
+ case QMetaType::Float:
+ valueFloat = value.toFloat();
+ valuePtr = reinterpret_cast<const char *>(&valueFloat);
+ break;
+ case QMetaType::QVector2D: {
+ QVector2D vec = value.value<QVector2D>();
+ float val[2];
+ val[0] = vec.x();
+ val[1] = vec.y();
+ const QByteArray name = attribute.toUtf8();
+ QByteArray cname = name + QByteArrayLiteral(".x");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val));
+ cname = name + QByteArrayLiteral(".y");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val + 1));
+ return;
+ }
+ case QMetaType::QVector3D: {
+ QVector3D vec = value.value<QVector3D>();
+ float val[3];
+ val[0] = vec.x();
+ val[1] = vec.y();
+ val[2] = vec.z();
+ const QByteArray name = attribute.toUtf8();
+ QByteArray cname = name + QByteArrayLiteral(".x");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val));
+ cname = name + QByteArrayLiteral(".y");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val + 1));
+ cname = name + QByteArrayLiteral(".z");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val + 2));
+ return;
+ }
+ case QMetaType::QColor:
+ case QMetaType::QVector4D: {
+ QVector4D vec = value.value<QVector4D>();
+ float val[4];
+ val[0] = vec.x();
+ val[1] = vec.y();
+ val[2] = vec.z();
+ val[3] = vec.w();
+ const QByteArray name = attribute.toUtf8();
+ QByteArray cname = name + QByteArrayLiteral(".x");
+ if (m_api.GetAttribute(element, cname.constData(), reinterpret_cast<char *>(&valueFloat))) {
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val));
+ cname = name + QByteArrayLiteral(".y");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val + 1));
+ cname = name + QByteArrayLiteral(".z");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val + 2));
+ cname = name + QByteArrayLiteral(".w");
+ m_api.SetAttribute(element, cname.constData(), reinterpret_cast<const char *>(val + 3));
+ } else {
+ QByteArray cname = name + QByteArrayLiteral(".r");
+ if (m_api.GetAttribute(element, cname.constData(),
+ reinterpret_cast<char *>(&valueFloat))) {
+ m_api.SetAttribute(element, cname.constData(),
+ reinterpret_cast<const char *>(val));
+ cname = name + QByteArrayLiteral(".g");
+ m_api.SetAttribute(element, cname.constData(),
+ reinterpret_cast<const char *>(val + 1));
+ cname = name + QByteArrayLiteral(".b");
+ m_api.SetAttribute(element, cname.constData(),
+ reinterpret_cast<const char *>(val + 2));
+ cname = name + QByteArrayLiteral(".a");
+ m_api.SetAttribute(element, cname.constData(),
+ reinterpret_cast<const char *>(val + 3));
+ }
+ }
+ return;
+ }
+ case QMetaType::QString:
+ default:
+ valueStr = value.toString().toUtf8();
+ valuePtr = valueStr.constData();
+ break;
+ }
+
+ m_api.SetAttribute(element, attribute.toUtf8().constData(), valuePtr);
+}
+
+void Q3DSQmlScript::fireEvent(const QString &event)
+{
+ if (!m_behavior.GetActive())
+ return;
+ m_api.FireEvent(m_behavior.m_Path, event.toUtf8().constData());
+}
+
+void Q3DSQmlScript::registerForEvent(const QString &event, const QJSValue &function)
+{
+ registerForEvent("", event, function);
+}
+
+void Q3DSQmlScript::registerForEvent(const QString &handle, const QString &event,
+ const QJSValue &function)
+{
+ if (!m_behavior.GetActive())
+ return;
+
+ TElement *element = &m_owner;
+ if (!handle.isEmpty())
+ element = getElementByPath(handle);
+ if (!element)
+ return;
+
+ if (!function.isCallable())
+ return;
+
+ CPresentation *presentation
+ = static_cast<CPresentation *>(m_behavior.GetBelongedPresentation());
+ TEventCommandHash eventHash = CHash::HashEventCommand(event.toUtf8().constData());
+
+ for (auto &&callback : m_eventCallbacks) {
+ if (callback.element == element && callback.eventHash == eventHash)
+ return;
+ }
+
+ EventData *data = new EventData();
+ data->function = function;
+
+ m_eventCallbacks.push_back({element, eventHash, data});
+
+ presentation->RegisterEventCallback(element, eventHash, &eventCallback, data);
+}
+
+void Q3DSQmlScript::unregisterForEvent(const QString &event)
+{
+ unregisterForEvent("", event);
+}
+
+void Q3DSQmlScript::unregisterForEvent(const QString &handle, const QString &event)
+{
+ if (!m_behavior.GetActive())
+ return;
+
+ TElement *element = &m_owner;
+ if (!handle.isEmpty())
+ element = getElementByPath(handle);
+ if (!element)
+ return;
+
+ CPresentation *presentation
+ = static_cast<CPresentation *>(m_behavior.GetBelongedPresentation());
+ TEventCommandHash eventHash = CHash::HashEventCommand(event.toUtf8().constData());
+ EventData *data = nullptr;
+
+ for (int i = 0; i < m_eventCallbacks.size(); ++i) {
+ if (m_eventCallbacks[i].element == element && m_eventCallbacks[i].eventHash == eventHash) {
+ data = m_eventCallbacks[i].data;
+ m_eventCallbacks.erase(m_eventCallbacks.begin() + i);
+ break;
+ }
+ }
+
+ if (data) {
+ presentation->UnregisterEventCallback(element, eventHash, &eventCallback, data);
+ delete data;
+ }
+}
+
+QVector2D Q3DSQmlScript::getMousePosition()
+{
+ CPresentation *presentation
+ = static_cast<CPresentation *>(m_behavior.GetBelongedPresentation());
+ qt3ds::runtime::IApplication &app = presentation->GetApplication();
+
+ SInputFrame input = app.GetInputEngine().GetInputFrame();
+ if (app.GetPrimaryPresentation()) {
+ Q3DStudio::SMousePosition position =
+ app.GetPrimaryPresentation()->GetScene()->WindowToPresentation(
+ Q3DStudio::SMousePosition(static_cast<INT32>(input.m_PickX),
+ static_cast<INT32>(input.m_PickY)));
+
+ return QVector2D(position.m_X, position.m_Y);
+ }
+ return QVector2D(0, 0);
+}
+
+QMatrix4x4 Q3DSQmlScript::calculateGlobalTransform(const QString &handle)
+{
+ TElement *element = &m_owner;
+ if (!handle.isEmpty())
+ element = getElementByPath(handle);
+ if (!element)
+ return QMatrix4x4();
+
+ RuntimeMatrix transform;
+ IScene *scene = element->GetBelongedPresentation()->GetScene();
+ scene->CalculateGlobalTransform(element, transform);
+ transform.FlipCoordinateSystem();
+
+ return QMatrix4x4(&transform.m_Data[0][0]);
+}
+
+QVector3D Q3DSQmlScript::lookAt(const QVector3D &target)
+{
+ FLOAT theMag = ::sqrtf(target.x() * target.x() + target.z() * target.z());
+ FLOAT thePitch = -::atan2f(target.y(), theMag);
+ FLOAT theYaw = ::atan2f(target.x(), target.z());
+
+ return QVector3D(radToDeg(thePitch), radToDeg(theYaw), 0.0f);
+}
+
+QVector3D Q3DSQmlScript::matrixToEuler(const QMatrix4x4 &matrix)
+{
+ CEulerAngleConverter converter;
+ const float *qMatrix = matrix.constData();
+ HMatrix hHatrix;
+ for (int i = 0; i < 4; ++i) {
+ for (int j = 0; j < 4; ++j)
+ hHatrix[i][j] = qMatrix[j * 4 + i];
+ }
+ EulerAngles eulerAngles = converter.Eul_FromHMatrix(hHatrix, EulOrdYXZs);
+ return QVector3D(-eulerAngles.y, -eulerAngles.x, -eulerAngles.z);
+}
+
+QString Q3DSQmlScript::getParent(const QString &handle)
+{
+ TElement *element = &m_owner;
+ if (!handle.isEmpty())
+ element = getElementByPath(handle);
+ if (!element)
+ return "";
+
+ TElement *parent = element->GetParent();
+ if (!parent)
+ return "";
+ return parent->m_Path.c_str();
+}
+
+void Q3DSQmlScript::setDataInputValue(const QString &name, const QVariant &value,
+ qt3ds::runtime::DataInputValueRole valueRole)
+{
+ m_api.SetDataInputValue(name, value, valueRole);
+}
+
+TElement *Q3DSQmlScript::getElementByPath(const QString &path)
+{
+ if (!m_api.GetApplication())
+ return nullptr;
+
+ TElement *element = CQmlElementHelper::GetElement(
+ *m_api.GetApplication(),
+ m_api.GetApplication()->GetPrimaryPresentation(),
+ path.toUtf8().constData(), &m_owner);
+ return element;
+}
diff --git a/src/runtime/q3dsqmlscript.h b/src/runtime/q3dsqmlscript.h
new file mode 100644
index 0000000..3ad1118
--- /dev/null
+++ b/src/runtime/q3dsqmlscript.h
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSQMLSCRIPT_H
+#define Q3DSQMLSCRIPT_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qvariant.h>
+#include <QtQml/qjsvalue.h>
+#include <QtGui/qvector2d.h>
+#include <QtGui/qvector3d.h>
+#include <QtGui/qmatrix4x4.h>
+
+#include "Qt3DSTypes.h"
+#include "Qt3DSKernelTypes.h"
+#include "Qt3DSEvent.h"
+#include "q3dsqmlbehavior.h"
+#include "Qt3DSApplication.h"
+
+namespace Q3DStudio {
+class CQmlEngine;
+
+class Q3DSQmlScript : public QObject
+{
+ Q_OBJECT
+public:
+ Q3DSQmlScript(CQmlEngine &api, Q3DSQmlBehavior &object, TElement &element, TElement &parent);
+ ~Q3DSQmlScript();
+
+ void update();
+ void call(const QString &function);
+ void updateProperties();
+ bool hasBehavior(const TElement *behavior);
+
+ float getDeltaTime();
+ float getAttribute(const QString &attribute);
+ void setAttribute(const QString &attribute, const QVariant &value);
+ void setAttribute(const QString &handle, const QString &attribute,
+ const QVariant &value);
+ void fireEvent(const QString &event);
+ void registerForEvent(const QString &event, const QJSValue &function);
+ void registerForEvent(const QString &handle, const QString &event,
+ const QJSValue &function);
+ void unregisterForEvent(const QString &event);
+ void unregisterForEvent(const QString &handle, const QString &event);
+ QVector2D getMousePosition();
+ QMatrix4x4 calculateGlobalTransform(const QString &handle);
+ QVector3D lookAt(const QVector3D &target);
+ QVector3D matrixToEuler(const QMatrix4x4 &matrix);
+ QString getParent(const QString &handle);
+ void setDataInputValue(const QString &name, const QVariant &value,
+ qt3ds::runtime::DataInputValueRole valueRole
+ = qt3ds::runtime::DataInputValueRole::Value);
+
+ struct EventData {
+ QJSValue function;
+ };
+
+private:
+ TElement *getElementByPath(const QString &path);
+
+ CQmlEngine &m_api;
+ Q3DSQmlBehavior &m_object;
+ TElement &m_behavior;
+ TElement &m_owner;
+
+ bool m_initialized;
+ bool m_lastActivationState;
+
+ float m_deltaTime;
+ TTimeUnit m_lastTime;
+ struct EventCallbackInfo {
+ TElement *element;
+ TEventCommandHash eventHash;
+ EventData *data;
+ };
+
+ QVector<std::function<void()>> m_mappedProperties;
+ QVector<EventCallbackInfo> m_eventCallbacks;
+};
+}
+
+#endif // Q3DSQMLSCRIPT_H
diff --git a/src/runtime/q3dsvariantconfig.cpp b/src/runtime/q3dsvariantconfig.cpp
new file mode 100644
index 0000000..e1fa04c
--- /dev/null
+++ b/src/runtime/q3dsvariantconfig.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "q3dsvariantconfig_p.h"
+
+namespace qt3ds {
+
+Q3DSVariantConfig::Q3DSVariantConfig()
+{
+
+}
+
+Q3DSVariantConfig::~Q3DSVariantConfig()
+{
+ for (auto str : qAsConst(m_internalVariantList))
+ delete str;
+ m_internalVariantList.clear();
+}
+
+void Q3DSVariantConfig::setVariantList(const QStringList &variantList)
+{
+ // Store the QStringList to be returned from the API
+ m_variantList = variantList;
+
+ for (auto str : qAsConst(m_internalVariantList))
+ delete str;
+ m_internalVariantList.clear();
+
+ // Build a fixed (in mem location) list of the variant strings
+ for (auto tag : variantList)
+ m_internalVariantList.append(new QString(tag));
+
+ // Parse the variantGroup:variant list to map using the fixed list
+ m_variantFilter.clear();
+ for (auto tag : qAsConst(m_internalVariantList)) {
+ QStringRef refTag = QStringRef(tag);
+ int separatorIdx = refTag.indexOf(QLatin1Char(':'));
+ QStringRef group = refTag.left(separatorIdx);
+ QStringRef variant = refTag.mid(separatorIdx + 1);
+ m_variantFilter[group].append(variant);
+ }
+}
+
+bool Q3DSVariantConfig::isPartOfConfig(const QStringRef &variantAttributes) const
+{
+ // Variant filter is ignored when it's not defined
+ // or if the object has no variant attributes
+ if (m_variantFilter.isEmpty() || variantAttributes.isEmpty())
+ return true;
+
+ // Collect all variant tags per group from the element
+ QHash<QStringRef, QVector<QStringRef>> groupToVariants;
+ const QVector<QStringRef> variantTags = variantAttributes.split(
+ QLatin1Char(','),
+ QString::SkipEmptyParts);
+
+ for (auto tag : variantTags) {
+ // Break each variantGroup:value to group and value strings
+ int groupSeparatorIdx = tag.indexOf(QLatin1Char(':'));
+ QStringRef group = tag.left(groupSeparatorIdx);
+
+ // Only collect variant tags that are relevant to variant filtering
+ if (m_variantFilter.contains(group)) {
+ QStringRef variant = tag.mid(groupSeparatorIdx + 1);
+ groupToVariants[group].append(variant);
+ }
+ }
+
+ // If no relevant variant tags found in element, load the element
+ if (groupToVariants.isEmpty())
+ return true;
+
+ // Verify that the element matches the variant filtering per group.
+ // To match the element must either:
+ // - Have no variant tag defined for the group
+ // - Have a matching tag for the group
+ bool isLoaded = true;
+ const auto filteredGroups = m_variantFilter.keys();
+ for (auto group : filteredGroups) {
+ const QVector<QStringRef> variants = groupToVariants[group];
+ const QVector<QStringRef> filteredVariants = m_variantFilter[group];
+
+ if (variants.size() > 0) {
+ // Check if ANY of the variant values of the element matches ANY
+ // of the included variants in the filter for this variant group
+ bool matchesFilter = false;
+ for (auto variant : variants)
+ matchesFilter |= filteredVariants.contains(variant);
+
+ isLoaded &= matchesFilter;
+ }
+ }
+
+ return isLoaded;
+}
+
+}
diff --git a/src/runtime/q3dsvariantconfig_p.h b/src/runtime/q3dsvariantconfig_p.h
new file mode 100644
index 0000000..1905f44
--- /dev/null
+++ b/src/runtime/q3dsvariantconfig_p.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef Q3DSVARIANTCONFIG_P_H
+#define Q3DSVARIANTCONFIG_P_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qhash.h>
+#include <QtCore/qvector.h>
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of a number of Qt sources files. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+namespace qt3ds {
+
+class Q3DSVariantConfig
+{
+public:
+ Q3DSVariantConfig();
+ ~Q3DSVariantConfig();
+
+ inline bool operator==(const Q3DSVariantConfig &other) const
+ {
+ return (this->m_variantList == other.m_variantList);
+ }
+
+ inline bool operator!=(const Q3DSVariantConfig &other) const
+ {
+ return (this->m_variantList != other.m_variantList);
+ }
+
+ inline bool isEmpty() const { return m_variantList.isEmpty(); }
+
+ void setVariantList(const QStringList &variantList);
+
+ bool isPartOfConfig(const QStringRef &variantAttributes) const;
+
+ inline const QStringList &variantList() const { return m_variantList; }
+
+private:
+ QStringList m_variantList;
+ QList<QString *> m_internalVariantList;
+ QHash<QStringRef, QVector<QStringRef>> m_variantFilter;
+};
+
+};
+#endif // Q3DSVARIANTCONFIG_P_H
diff --git a/src/runtimerender/Qt3DSDistanceFieldGlyphCache.cpp b/src/runtimerender/Qt3DSDistanceFieldGlyphCache.cpp
new file mode 100644
index 0000000..e945335
--- /dev/null
+++ b/src/runtimerender/Qt3DSDistanceFieldGlyphCache.cpp
@@ -0,0 +1,518 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSDistanceFieldGlyphCache_p.h"
+
+#include <QtQuick/private/qsgareaallocator_p.h>
+
+#include <QtCore/qmath.h>
+#include <QtCore/qendian.h>
+#include <QtGui/qimage.h>
+
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "foundation/Qt3DSAllocator.h"
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+QT_BEGIN_NAMESPACE
+
+// Should work on most hardware. Used as stop gap until Qt 3D provides a
+// way to retrieve the system value
+#ifndef Q3DSDISTANCEFIELDGLYPHCACHE_MAXIMUM_TEXURE_SIZE
+# define Q3DSDISTANCEFIELDGLYPHCACHE_MAXIMUM_TEXURE_SIZE 2048
+#endif
+
+#if !defined(Q3DSDISTANCEFIELDGLYPHCACHE_PADDING)
+# define Q3DSDISTANCEFIELDGLYPHCACHE_PADDING 2
+#endif
+
+Q3DSDistanceFieldGlyphCache::Q3DSDistanceFieldGlyphCache(
+ const QRawFont &font, qt3ds::render::IQt3DSRenderContext &context)
+ : QSGDistanceFieldGlyphCache(font)
+ , m_context(context)
+{
+ m_maxTextureSize = Q3DSDISTANCEFIELDGLYPHCACHE_MAXIMUM_TEXURE_SIZE;
+
+ loadPregeneratedCache(font);
+}
+
+Q3DSDistanceFieldGlyphCache::~Q3DSDistanceFieldGlyphCache()
+{
+ for (auto &texture : m_textures)
+ qt3ds::foundation::NVDelete(m_context.GetAllocator(), texture.texture);
+ delete m_areaAllocator;
+}
+
+int Q3DSDistanceFieldGlyphCache::maxTextureSize() const
+{
+ return m_maxTextureSize;
+}
+
+Q3DSDistanceFieldGlyphCache::TextureInfo *Q3DSDistanceFieldGlyphCache::textureInfo(int index) const
+{
+ while (index >= m_textures.size())
+ m_textures.append(TextureInfo());
+ return &m_textures[index];
+}
+
+void Q3DSDistanceFieldGlyphCache::referenceGlyphs(const QSet<glyph_t> &glyphs)
+{
+ m_unusedGlyphs -= glyphs;
+}
+
+void Q3DSDistanceFieldGlyphCache::releaseGlyphs(const QSet<glyph_t> &glyphs)
+{
+ m_unusedGlyphs += glyphs;
+}
+
+void Q3DSDistanceFieldGlyphCache::setTextureData(qt3ds::render::NVRenderTexture2D *texture,
+ QImage &image)
+{
+ bool isGLES2 = m_context.GetRenderContext().GetRenderContextType()
+ == qt3ds::render::NVRenderContextValues::GLES2;
+ texture->SetTextureData(qt3ds::render::toU8DataRef(image.bits(), image.byteCount()),
+ 0, image.width(), image.height(),
+ isGLES2 ? qt3ds::render::NVRenderTextureFormats::Alpha8
+ : qt3ds::render::NVRenderTextureFormats::R8);
+}
+
+void Q3DSDistanceFieldGlyphCache::resizeTexture(TextureInfo *info, int width, int height)
+{
+ QImage &image = info->copy;
+ if (info->texture == nullptr) {
+ info->texture = m_context.GetRenderContext().CreateTexture2D();
+ info->texture->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Enum::Linear);
+ info->texture->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Enum::Linear);
+ setTextureData(info->texture, image);
+ }
+
+ qt3ds::render::STextureDetails textureDetails = info->texture->GetTextureDetails();
+ if (int(textureDetails.m_Width) != width || int(textureDetails.m_Height) != height)
+ setTextureData(info->texture, image);
+
+ if (info->copy.width() != width || info->copy.height() != height) {
+ QImage newImage(width, height, QImage::Format_Alpha8);
+
+ for (int y = 0; y < info->copy.height(); ++y) {
+ uchar *dest = newImage.scanLine(y);
+ const uchar *src = info->copy.scanLine(y);
+ ::memcpy(dest, src, size_t(info->copy.width()));
+ }
+
+ info->copy = newImage;
+
+ setTextureData(info->texture, image);
+ }
+}
+
+void Q3DSDistanceFieldGlyphCache::storeGlyphs(const QList<QDistanceField> &glyphs)
+{
+ using GlyphTextureHash = QHash<TextureInfo *, QVector<glyph_t> >;
+ using GlyphTextureHashConstIt = GlyphTextureHash::const_iterator;
+
+ GlyphTextureHash glyphTextures;
+ for (int i = 0; i < glyphs.size(); ++i) {
+ QDistanceField glyph = glyphs.at(i);
+ glyph_t glyphIndex = glyph.glyph();
+ TexCoord c = glyphTexCoord(glyphIndex);
+ TextureInfo *texInfo = m_glyphsTexture.value(glyphIndex);
+
+ resizeTexture(texInfo, maxTextureSize(), texInfo->allocatedArea.height());
+
+ Q_ASSERT(!glyphTextures[texInfo].contains(glyphIndex));
+ glyphTextures[texInfo].append(glyphIndex);
+
+ int padding = texInfo->padding;
+ int expectedWidth = qCeil(c.width + c.xMargin * 2);
+ glyph = glyph.copy(-padding, -padding,
+ expectedWidth + padding * 2, glyph.height() + padding * 2);
+
+ for (int y = 0; y < glyph.height(); ++y) {
+ const uchar *src = glyph.scanLine(y);
+ uchar *dest = texInfo->copy.scanLine(int(c.y) + y - padding) + (int(c.x) - padding);
+ ::memcpy(dest, src, size_t(glyph.width()));
+ }
+ }
+
+ for (GlyphTextureHashConstIt i = glyphTextures.constBegin(),
+ cend = glyphTextures.constEnd(); i != cend; ++i) {
+ Texture t;
+ // 0 == empty texture, (i - 1) == index into m_textures
+ t.textureId = uint(i.key() - m_textures.constData()) + 1;
+ qt3ds::render::STextureDetails textureDetails = i.key()->texture->GetTextureDetails();
+ t.size = QSize(textureDetails.m_Width, textureDetails.m_Height);
+ setGlyphsTexture(i.value(), t);
+
+ QImage &image = i.key()->copy;
+
+ setTextureData(i.key()->texture, image);
+ }
+}
+
+void Q3DSDistanceFieldGlyphCache::requestGlyphs(const QSet<glyph_t> &glyphs)
+{
+ // Note: Most of this is copy-pasted from QSGDefaultDistanceFieldGlyphCache in Qt Quick.
+ // All of this can probably be shared as a default implementation, since it does not
+ // actually create any textures, but it might have to be either templated or based
+ // on void*. For now we will just live with the duplication.
+
+ QList<GlyphPosition> glyphPositions;
+ QVector<glyph_t> glyphsToRender;
+
+ if (m_areaAllocator == nullptr) {
+ m_areaAllocator = new QSGAreaAllocator(QSize(maxTextureSize(),
+ m_maxTextureCount * maxTextureSize()));
+ }
+
+ for (QSet<glyph_t>::const_iterator it = glyphs.constBegin(); it != glyphs.constEnd() ; ++it) {
+ glyph_t glyphIndex = *it;
+
+ int padding = Q3DSDISTANCEFIELDGLYPHCACHE_PADDING;
+ QRectF boundingRect = glyphData(glyphIndex).boundingRect;
+ int glyphWidth = qCeil(boundingRect.width()) + distanceFieldRadius() * 2;
+ int glyphHeight = qCeil(boundingRect.height()) + distanceFieldRadius() * 2;
+ QSize glyphSize(glyphWidth + padding * 2, glyphHeight + padding * 2);
+ QRect alloc = m_areaAllocator->allocate(glyphSize);
+
+ if (alloc.isNull()) {
+ // Unallocate unused glyphs until we can allocated the new glyph
+ while (alloc.isNull() && !m_unusedGlyphs.isEmpty()) {
+ glyph_t unusedGlyph = *m_unusedGlyphs.constBegin();
+
+ TexCoord unusedCoord = glyphTexCoord(unusedGlyph);
+ QRectF unusedGlyphBoundingRect = glyphData(unusedGlyph).boundingRect;
+ int unusedGlyphWidth = qCeil(unusedGlyphBoundingRect.width())
+ + distanceFieldRadius() * 2;
+ int unusedGlyphHeight = qCeil(unusedGlyphBoundingRect.height())
+ + distanceFieldRadius() * 2;
+ m_areaAllocator->deallocate(QRect(int(unusedCoord.x) - padding,
+ int(unusedCoord.y) - padding,
+ padding * 2 + unusedGlyphWidth,
+ padding * 2 + unusedGlyphHeight));
+
+ m_unusedGlyphs.remove(unusedGlyph);
+ m_glyphsTexture.remove(unusedGlyph);
+ removeGlyph(unusedGlyph);
+
+ alloc = m_areaAllocator->allocate(glyphSize);
+ }
+
+ // Not enough space left for this glyph... skip to the next one
+ if (alloc.isNull())
+ continue;
+ }
+
+ TextureInfo *tex = textureInfo(alloc.y() / maxTextureSize());
+ alloc = QRect(alloc.x(), alloc.y() % maxTextureSize(), alloc.width(), alloc.height());
+
+ tex->allocatedArea |= alloc;
+ Q_ASSERT(tex->padding == padding || tex->padding < 0);
+ tex->padding = padding;
+
+ GlyphPosition p;
+ p.glyph = glyphIndex;
+ p.position = alloc.topLeft() + QPoint(padding, padding);
+
+ glyphPositions.append(p);
+ glyphsToRender.append(glyphIndex);
+ m_glyphsTexture.insert(glyphIndex, tex);
+ }
+
+ setGlyphsPosition(glyphPositions);
+ markGlyphsToRender(glyphsToRender);
+}
+
+void Q3DSDistanceFieldGlyphCache::processPendingGlyphs()
+{
+ update();
+}
+
+Q3DSDistanceFieldGlyphCache::TextureInfo *Q3DSDistanceFieldGlyphCache::textureInfoById(
+ uint id) const
+{
+ Q_ASSERT(id > 0);
+ return textureInfo(id - 1);
+}
+
+// This is all copy-pasted from Qt Quick, as sharing it would require some refactoring, and we
+// need to work with Qt 5.12.2 at the moment.
+namespace {
+ struct Qtdf {
+ // We need these structs to be tightly packed, but some compilers we use do not
+ // support #pragma pack(1), so we need to hardcode the offsets/sizes in the
+ // file format
+ enum TableSize {
+ HeaderSize = 14,
+ GlyphRecordSize = 46,
+ TextureRecordSize = 17
+ };
+
+ enum Offset {
+ // Header
+ majorVersion = 0,
+ minorVersion = 1,
+ pixelSize = 2,
+ textureSize = 4,
+ flags = 8,
+ headerPadding = 9,
+ numGlyphs = 10,
+
+ // Glyph record
+ glyphIndex = 0,
+ textureOffsetX = 4,
+ textureOffsetY = 8,
+ textureWidth = 12,
+ textureHeight = 16,
+ xMargin = 20,
+ yMargin = 24,
+ boundingRectX = 28,
+ boundingRectY = 32,
+ boundingRectWidth = 36,
+ boundingRectHeight = 40,
+ textureIndex = 44,
+
+ // Texture record
+ allocatedX = 0,
+ allocatedY = 4,
+ allocatedWidth = 8,
+ allocatedHeight = 12,
+ texturePadding = 16
+
+ };
+
+ template <typename T>
+ static inline T fetch(const char *data, Offset offset)
+ {
+ return qFromBigEndian<T>(data + int(offset));
+ }
+ };
+}
+
+qreal Q3DSDistanceFieldGlyphCache::fontSize() const
+{
+ return QT_DISTANCEFIELD_BASEFONTSIZE(m_doubleGlyphResolution);
+}
+
+bool Q3DSDistanceFieldGlyphCache::loadPregeneratedCache(const QRawFont &font)
+{
+ // The pregenerated data must be loaded first, otherwise the area allocator
+ // will be wrong
+ if (m_areaAllocator != nullptr) {
+ qWarning("Font cache must be loaded before cache is used");
+ return false;
+ }
+
+ QByteArray qtdfTable = font.fontTable("qtdf");
+ if (qtdfTable.isEmpty())
+ return false;
+
+ using GlyphTextureHash = QHash<TextureInfo *, QVector<glyph_t> >;
+
+ GlyphTextureHash glyphTextures;
+
+ if (uint(qtdfTable.size()) < Qtdf::HeaderSize) {
+ qWarning("Invalid qtdf table in font '%s'",
+ qPrintable(font.familyName()));
+ return false;
+ }
+
+ const char *qtdfTableStart = qtdfTable.constData();
+ const char *qtdfTableEnd = qtdfTableStart + qtdfTable.size();
+
+ int padding = 0;
+ int textureCount = 0;
+ {
+ quint8 majorVersion = Qtdf::fetch<quint8>(qtdfTableStart, Qtdf::majorVersion);
+ quint8 minorVersion = Qtdf::fetch<quint8>(qtdfTableStart, Qtdf::minorVersion);
+ if (majorVersion != 5 || minorVersion != 12) {
+ qWarning("Invalid version of qtdf table %d.%d in font '%s'",
+ majorVersion,
+ minorVersion,
+ qPrintable(font.familyName()));
+ return false;
+ }
+
+ qreal pixelSize = qreal(Qtdf::fetch<quint16>(qtdfTableStart, Qtdf::pixelSize));
+ m_maxTextureSize = int(Qtdf::fetch<quint32>(qtdfTableStart, Qtdf::textureSize));
+ m_doubleGlyphResolution = Qtdf::fetch<quint8>(qtdfTableStart, Qtdf::flags) == 1;
+ padding = Qtdf::fetch<quint8>(qtdfTableStart, Qtdf::headerPadding);
+
+ if (pixelSize <= 0.0) {
+ qWarning("Invalid pixel size in '%s'", qPrintable(font.familyName()));
+ return false;
+ }
+
+ if (m_maxTextureSize <= 0) {
+ qWarning("Invalid texture size in '%s'", qPrintable(font.familyName()));
+ return false;
+ }
+
+ if (padding != Q3DSDISTANCEFIELDGLYPHCACHE_PADDING) {
+ qWarning("Padding mismatch in '%s'. Font requires %d, but Qt is compiled with %d.",
+ qPrintable(font.familyName()),
+ padding,
+ Q3DSDISTANCEFIELDGLYPHCACHE_PADDING);
+ }
+
+ m_referenceFont.setPixelSize(pixelSize);
+
+ quint32 glyphCount = Qtdf::fetch<quint32>(qtdfTableStart, Qtdf::numGlyphs);
+ m_unusedGlyphs.reserve(int(glyphCount));
+
+ const char *allocatorData = qtdfTableStart + Qtdf::HeaderSize;
+ {
+ m_areaAllocator = new QSGAreaAllocator(QSize(0, 0));
+ allocatorData = m_areaAllocator->deserialize(allocatorData,
+ qtdfTableEnd - allocatorData);
+ if (allocatorData == nullptr)
+ return false;
+ }
+
+ if (m_areaAllocator->size().height() % m_maxTextureSize != 0) {
+ qWarning("Area allocator size mismatch in '%s'", qPrintable(font.familyName()));
+ return false;
+ }
+
+ textureCount = m_areaAllocator->size().height() / m_maxTextureSize;
+ m_maxTextureCount = qMax(m_maxTextureCount, textureCount);
+
+ const char *textureRecord = allocatorData;
+ for (int i = 0; i < textureCount; ++i, textureRecord += Qtdf::TextureRecordSize) {
+ if (textureRecord + Qtdf::TextureRecordSize > qtdfTableEnd) {
+ qWarning("qtdf table too small in font '%s'.",
+ qPrintable(font.familyName()));
+ return false;
+ }
+
+ TextureInfo *tex = textureInfo(i);
+ tex->allocatedArea.setX(int(Qtdf::fetch<quint32>(textureRecord, Qtdf::allocatedX)));
+ tex->allocatedArea.setY(int(Qtdf::fetch<quint32>(textureRecord, Qtdf::allocatedY)));
+ tex->allocatedArea.setWidth(int(Qtdf::fetch<quint32>(textureRecord,
+ Qtdf::allocatedWidth)));
+ tex->allocatedArea.setHeight(int(Qtdf::fetch<quint32>(textureRecord,
+ Qtdf::allocatedHeight)));
+ tex->padding = Qtdf::fetch<quint8>(textureRecord, Qtdf::texturePadding);
+ }
+
+ const char *glyphRecord = textureRecord;
+ for (quint32 i = 0; i < glyphCount; ++i, glyphRecord += Qtdf::GlyphRecordSize) {
+ if (glyphRecord + Qtdf::GlyphRecordSize > qtdfTableEnd) {
+ qWarning("qtdf table too small in font '%s'.",
+ qPrintable(font.familyName()));
+ return false;
+ }
+
+ glyph_t glyph = Qtdf::fetch<quint32>(glyphRecord, Qtdf::glyphIndex);
+ m_unusedGlyphs.insert(glyph);
+
+ GlyphData &glyphData = emptyData(glyph);
+
+#define FROM_FIXED_POINT(value) (qreal(value)/qreal(65536))
+
+ glyphData.texCoord.x
+ = FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord, Qtdf::textureOffsetX));
+ glyphData.texCoord.y
+ = FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord, Qtdf::textureOffsetY));
+ glyphData.texCoord.width
+ = FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord, Qtdf::textureWidth));
+ glyphData.texCoord.height
+ = FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord, Qtdf::textureHeight));
+ glyphData.texCoord.xMargin
+ = FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord, Qtdf::xMargin));
+ glyphData.texCoord.yMargin
+ = FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord, Qtdf::yMargin));
+ glyphData.boundingRect.setX(
+ FROM_FIXED_POINT(Qtdf::fetch<qint32>(glyphRecord, Qtdf::boundingRectX)));
+ glyphData.boundingRect.setY(
+ FROM_FIXED_POINT(Qtdf::fetch<qint32>(glyphRecord, Qtdf::boundingRectY)));
+ glyphData.boundingRect.setWidth(
+ FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord,
+ Qtdf::boundingRectWidth)));
+ glyphData.boundingRect.setHeight(
+ FROM_FIXED_POINT(Qtdf::fetch<quint32>(glyphRecord,
+ Qtdf::boundingRectHeight)));
+
+#undef FROM_FIXED_POINT
+
+ int textureIndex = Qtdf::fetch<quint16>(glyphRecord, Qtdf::textureIndex);
+ if (textureIndex < 0 || textureIndex >= textureCount) {
+ qWarning("Invalid texture index %d (texture count == %d) in '%s'",
+ textureIndex,
+ textureCount,
+ qPrintable(font.familyName()));
+ return false;
+ }
+
+
+ TextureInfo *texInfo = textureInfo(textureIndex);
+ m_glyphsTexture.insert(glyph, texInfo);
+
+ glyphTextures[texInfo].append(glyph);
+ }
+
+ const uchar *textureData = reinterpret_cast<const uchar *>(glyphRecord);
+ for (int i = 0; i < textureCount; ++i) {
+
+ TextureInfo *texInfo = textureInfo(i);
+
+ int width = texInfo->allocatedArea.width();
+ int height = texInfo->allocatedArea.height();
+ qint64 size = width * height;
+ if (reinterpret_cast<const char *>(textureData + size) > qtdfTableEnd) {
+ qWarning("qtdf table too small in font '%s'.",
+ qPrintable(font.familyName()));
+ return false;
+ }
+
+ resizeTexture(texInfo, width, height);
+
+ memcpy(texInfo->copy.bits(), textureData, size);
+ textureData += size;
+
+ QImage &image = texInfo->copy;
+ setTextureData(texInfo->texture, image);
+
+ QVector<glyph_t> glyphs = glyphTextures.value(texInfo);
+
+ Texture t;
+ t.textureId = uint(i + 1);
+ t.size = texInfo->copy.size();
+
+ setGlyphsTexture(glyphs, t);
+ }
+ }
+
+ return true;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_VERSION >= QT_VERSION_CHECK(5,12,2)
diff --git a/src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager.cpp b/src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager.cpp
new file mode 100644
index 0000000..750301d
--- /dev/null
+++ b/src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSDistanceFieldGlyphCacheManager_p.h"
+#include "Qt3DSDistanceFieldGlyphCache_p.h"
+
+#include <QtQuick/private/qsgdefaultrendercontext_p.h>
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+QT_BEGIN_NAMESPACE
+
+namespace {
+ class FontKeyAccessor : public QSGDefaultRenderContext
+ {
+ public:
+ static QString fontKey(const QRawFont &font)
+ {
+ return QSGDefaultRenderContext::fontKey(font);
+ }
+ };
+}
+
+Q3DSDistanceFieldGlyphCacheManager::~Q3DSDistanceFieldGlyphCacheManager()
+{
+ for (auto &cache : qAsConst(m_glyphCaches))
+ delete cache;
+}
+
+Q3DSDistanceFieldGlyphCache *Q3DSDistanceFieldGlyphCacheManager::glyphCache(const QRawFont &font)
+{
+ QString key = FontKeyAccessor::fontKey(font);
+ Q3DSDistanceFieldGlyphCache *cache = m_glyphCaches.value(key);
+ if (cache == nullptr) {
+ cache = new Q3DSDistanceFieldGlyphCache(font, *m_context);
+ m_glyphCaches.insert(key, cache);
+ }
+
+ return cache;
+}
+
+void Q3DSDistanceFieldGlyphCacheManager::setContext(qt3ds::render::IQt3DSRenderContext &context)
+{
+ m_context = &context;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_VERSION >= QT_VERSION_CHECK(5,12,2)
diff --git a/src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager_p.h b/src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager_p.h
new file mode 100644
index 0000000..19d3c08
--- /dev/null
+++ b/src/runtimerender/Qt3DSDistanceFieldGlyphCacheManager_p.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSDISTANCEFIELDGLYPHCACHEMANAGER_P_H
+#define Q3DSDISTANCEFIELDGLYPHCACHEMANAGER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qhash.h>
+#include <QtGui/qrawfont.h>
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+namespace qt3ds {
+namespace render {
+class IQt3DSRenderContext;
+}
+}
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSDistanceFieldGlyphCache;
+class Q3DSDistanceFieldGlyphCacheManager
+{
+public:
+ ~Q3DSDistanceFieldGlyphCacheManager();
+ Q3DSDistanceFieldGlyphCache *glyphCache(const QRawFont &font);
+ void setContext(qt3ds::render::IQt3DSRenderContext &context);
+
+private:
+ QHash<QString, Q3DSDistanceFieldGlyphCache *> m_glyphCaches;
+ qt3ds::render::IQt3DSRenderContext *m_context;
+
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+#endif // Q3DSDISTANCEFIELDGLYPHCACHEMANAGER_P_H
diff --git a/src/runtimerender/Qt3DSDistanceFieldGlyphCache_p.h b/src/runtimerender/Qt3DSDistanceFieldGlyphCache_p.h
new file mode 100644
index 0000000..679d3ad
--- /dev/null
+++ b/src/runtimerender/Qt3DSDistanceFieldGlyphCache_p.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSDISTANCEFIELDGLYPHCACHE_P_H
+#define Q3DSDISTANCEFIELDGLYPHCACHE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtQuick/private/qsgadaptationlayer_p.h>
+#include "render/Qt3DSRenderTexture2D.h"
+#include "Qt3DSRenderContextCore.h"
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+QT_BEGIN_NAMESPACE
+
+class QSGAreaAllocator;
+class Q3DSDistanceFieldGlyphCache : public QSGDistanceFieldGlyphCache
+{
+public:
+ struct TextureInfo {
+ qt3ds::render::NVRenderTexture2D *texture;
+ int padding = -1;
+
+ QRect allocatedArea;
+ QImage copy;
+ };
+
+ Q3DSDistanceFieldGlyphCache(const QRawFont &font,
+ qt3ds::render::IQt3DSRenderContext &context);
+ ~Q3DSDistanceFieldGlyphCache() override;
+
+ void requestGlyphs(const QSet<glyph_t> &glyphs) override;
+ void storeGlyphs(const QList<QDistanceField> &glyphs) override;
+ void referenceGlyphs(const QSet<glyph_t> &glyphs) override;
+ void releaseGlyphs(const QSet<glyph_t> &glyphs) override;
+
+ void processPendingGlyphs() override;
+
+ TextureInfo *textureInfoById(uint textureId) const;
+
+ qreal fontSize() const;
+
+private:
+ bool loadPregeneratedCache(const QRawFont &font);
+ TextureInfo *textureInfo(int index) const;
+
+ int maxTextureSize() const;
+ void resizeTexture(TextureInfo *info, int width, int height);
+ void setTextureData(qt3ds::render::NVRenderTexture2D *texture, QImage &image);
+
+ QSGAreaAllocator *m_areaAllocator = nullptr;
+ int m_maxTextureSize = 0;
+ int m_maxTextureCount = 3;
+
+ mutable QVector<TextureInfo> m_textures;
+ QHash<glyph_t, TextureInfo *> m_glyphsTexture;
+ QSet<glyph_t> m_unusedGlyphs;
+ qt3ds::render::IQt3DSRenderContext &m_context;
+};
+
+QT_END_NAMESPACE
+
+#endif // Q3DSDISTANCEFIELDGLYPHCACHE_P_H
+
+#endif // QT_VERSION >= QT_VERSION_CHECK(5,12,2)
diff --git a/src/runtimerender/Qt3DSDistanceFieldRenderer.cpp b/src/runtimerender/Qt3DSDistanceFieldRenderer.cpp
new file mode 100644
index 0000000..8c1b28a
--- /dev/null
+++ b/src/runtimerender/Qt3DSDistanceFieldRenderer.cpp
@@ -0,0 +1,1067 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSDistanceFieldRenderer.h"
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderContext.h"
+#include "qmath.h"
+#include "foundation/Qt3DSAllocator.h"
+
+using namespace qt3ds::render;
+
+Q3DSDistanceFieldRenderer::Q3DSDistanceFieldRenderer(NVFoundationBase &foundation)
+ : m_foundation(foundation)
+{
+ const QWindowList list = QGuiApplication::topLevelWindows();
+ if (list.size() > 0)
+ m_pixelRatio = list[0]->devicePixelRatio();
+}
+
+Q3DSDistanceFieldRenderer::~Q3DSDistanceFieldRenderer()
+{
+ NVAllocatorCallback &alloc = m_context->GetAllocator();
+
+ QHash<size_t, Q3DSDistanceFieldMesh>::const_iterator it;
+ for (it = m_meshCache.constBegin(); it != m_meshCache.constEnd(); ++it) {
+ const Q3DSDistanceFieldMesh &mesh = it.value();
+ NVDelete(alloc, mesh.vertexBuffer);
+ NVDelete(alloc, mesh.indexBuffer);
+ NVDelete(alloc, mesh.inputAssembler);
+ }
+}
+
+void Q3DSDistanceFieldRenderer::AddSystemFontDirectory(const char8_t *dir)
+{
+ QString systemDir(dir);
+ m_systemDirs += systemDir;
+ m_fontDatabase.registerFonts({ systemDir });
+}
+
+void Q3DSDistanceFieldRenderer::AddProjectFontDirectory(const char8_t *dir)
+{
+ QString projectDir(dir);
+ m_projectDirs += projectDir;
+ m_fontDatabase.registerFonts({ projectDir });
+}
+
+void Q3DSDistanceFieldRenderer::ClearProjectFontDirectories()
+{
+ m_fontDatabase.unregisterFonts(m_projectDirs);
+ m_projectDirs.clear();
+}
+
+ITextRenderer &Q3DSDistanceFieldRenderer::GetTextRenderer(NVRenderContext &)
+{
+ return *this;
+}
+
+void Q3DSDistanceFieldRenderer::EndFrame()
+{
+ // Remove meshes for glyphs that weren't rendered last frame
+ NVAllocatorCallback &alloc = m_context->GetAllocator();
+
+ QHash<size_t, Q3DSDistanceFieldMesh>::const_iterator it = m_meshCache.constBegin();
+ while (it != m_meshCache.constEnd()) {
+ const size_t glyphHash = it.key();
+ const Q3DSDistanceFieldMesh &mesh = it.value();
+ if (!m_renderedGlyphs.contains(glyphHash)) {
+ NVDelete(alloc, mesh.vertexBuffer);
+ NVDelete(alloc, mesh.indexBuffer);
+ NVDelete(alloc, mesh.inputAssembler);
+ m_meshCache.erase(it++);
+ } else {
+ it++;
+ }
+ }
+ m_renderedGlyphs.clear();
+}
+
+QHash<Q3DSDistanceFieldGlyphCache::TextureInfo *, GlyphInfo>
+Q3DSDistanceFieldRenderer::buildGlyphsPerTexture(const SText &textInfo)
+{
+ if (textInfo.m_BoundingBox.x < 0 || textInfo.m_BoundingBox.y < 0)
+ return QHash<Q3DSDistanceFieldGlyphCache::TextureInfo *, GlyphInfo>();
+
+ QVector2D boundingBox = QVector2D(textInfo.m_BoundingBox.x, textInfo.m_BoundingBox.y);
+ const float halfWidth = boundingBox.x() / 2.0f;
+ const float halfHeight = boundingBox.y() / 2.0f;
+ bool hasValidBoundingBox = boundingBox.x() > 0 || boundingBox.y() > 0;
+
+ QRawFont font = m_fontDatabase.findFont(textInfo.m_Font.c_str());
+ qreal scaleFactor = font.pixelSize() / qreal(textInfo.m_FontSize);
+
+ const qreal maximumWidth = boundingBox.isNull() ? qreal(0x01000000)
+ : qreal(boundingBox.x()) * scaleFactor;
+ const qreal maximumHeight = boundingBox.isNull() ? qreal(0x01000000)
+ : qreal(boundingBox.y()) * scaleFactor;
+
+ QTextLayout layout;
+ QTextOption option = layout.textOption();
+
+ QTextOption::WrapMode wrapMode;
+ switch (textInfo.m_WordWrap) {
+ case TextWordWrap::Clip:
+ wrapMode = QTextOption::ManualWrap;
+ break;
+ case TextWordWrap::WrapWord:
+ wrapMode = QTextOption::WrapAtWordBoundaryOrAnywhere;
+ break;
+ case TextWordWrap::WrapAnywhere:
+ wrapMode = QTextOption::WrapAnywhere;
+ break;
+ case TextWordWrap::Unknown:
+ wrapMode = QTextOption::ManualWrap;
+ Q_ASSERT(0);
+ };
+ option.setWrapMode(wrapMode);
+ option.setUseDesignMetrics(true);
+
+ layout.setTextOption(option);
+ layout.setRawFont(font);
+
+ QString text = textInfo.m_Text.c_str();
+ text.replace(QLatin1Char('\n'), QChar::LineSeparator);
+
+ qreal width;
+ qreal height;
+ bool needsElide;
+ do {
+ needsElide = false;
+
+ layout.clearLayout();
+
+ qreal leading = qreal(textInfo.m_Leading) * scaleFactor;
+ width = 0.0;
+ height = -leading;
+
+ QVector<QTextLayout::FormatRange> formatRanges;
+
+ QTextLayout::FormatRange formatRange;
+ formatRange.start = 0;
+ formatRange.length = text.length();
+ formatRange.format.setFontLetterSpacingType(QFont::AbsoluteSpacing);
+ formatRange.format.setFontLetterSpacing(qreal(textInfo.m_Tracking) * scaleFactor);
+ formatRanges.append(formatRange);
+ layout.setFormats(formatRanges);
+
+ layout.setText(text);
+ layout.beginLayout();
+
+ QTextLine previousLine;
+ forever {
+ QTextLine line = layout.createLine();
+ if (!line.isValid())
+ break;
+
+ line.setLineWidth(maximumWidth);
+ height += leading;
+ height = qCeil(height);
+
+ qreal textWidth = line.naturalTextWidth();
+ line.setPosition(QPointF(0.0, height));
+
+ width = qMin(maximumWidth, qMax(width, textWidth));
+ height += layout.engine()->lines[line.lineNumber()].height().toReal();
+
+ // Fast path for right elide
+ if (textInfo.m_Elide == TextElide::ElideRight
+ && previousLine.isValid()
+ && height > maximumHeight) {
+ break;
+ }
+
+ previousLine = line;
+ }
+ layout.endLayout();
+
+ if (textInfo.m_Elide != TextElide::ElideNone && height > maximumHeight) {
+ needsElide = true;
+
+ QString elidedText;
+ switch (textInfo.m_Elide) {
+ case TextElide::ElideRight:
+ if (previousLine.textStart() > 0)
+ elidedText = text.left(previousLine.textStart());
+
+ elidedText += layout.engine()->elidedText(
+ Qt::ElideRight, QFixed::fromReal(width), 0, previousLine.textStart(),
+ text.length() - previousLine.textStart());
+ break;
+ case TextElide::ElideLeft:
+ {
+ height = 0.0;
+ previousLine = QTextLine();
+ for (int i = layout.lineCount() - 1; i >= 0; --i) {
+ qreal lineHeight = layout.lineAt(i).height();
+ if (i < layout.lineCount() - 1 && height + lineHeight > maximumHeight)
+ break;
+ height += lineHeight;
+ previousLine = layout.lineAt(i);
+ }
+
+ Q_ASSERT(previousLine.isValid());
+ elidedText += layout.engine()->elidedText(
+ Qt::ElideLeft, QFixed::fromReal(width), 0, 0,
+ previousLine.textStart() + previousLine.textLength());
+
+ int nextPosition = (previousLine.textStart() + previousLine.textLength());
+ if (nextPosition < text.length())
+ elidedText += text.mid(nextPosition);
+ break;
+ }
+ case TextElide::ElideMiddle:
+ {
+ height = 0.0;
+ QTextLine lastLineBefore;
+ QTextLine firstLineAfter;
+ for (int i = 0; i < (layout.lineCount() / 2) + (layout.lineCount() % 2); ++i) {
+ qreal lineHeight = 3 * layout.lineAt(i).height();
+ if (height + lineHeight > maximumHeight)
+ break;
+ height += lineHeight;
+
+ lastLineBefore = layout.lineAt(i);
+ firstLineAfter = layout.lineAt(layout.lineCount() - i - 1);
+ }
+
+ int nextPosition = 0;
+ if (lastLineBefore.isValid()) {
+ elidedText += text.left(lastLineBefore.textStart()
+ + lastLineBefore.textLength());
+ nextPosition = lastLineBefore.textStart() + lastLineBefore.textLength();
+ }
+
+ QString suffix;
+ int length = text.length() - nextPosition;
+ if (firstLineAfter.isValid()) {
+ length = firstLineAfter.textStart() - nextPosition;
+ suffix = text.mid(firstLineAfter.textStart());
+ }
+
+ elidedText += layout.engine()->elidedText(
+ Qt::ElideMiddle, QFixed::fromReal(width), 0, nextPosition, length);
+
+ elidedText += suffix;
+ break;
+ }
+ case TextElide::ElideNone:
+ Q_UNREACHABLE();
+ };
+
+ // Failsafe
+ if (elidedText.isEmpty() || elidedText == text)
+ needsElide = false;
+ else
+ text = elidedText;
+ }
+ } while (needsElide);
+
+ QHash<Q3DSDistanceFieldGlyphCache::TextureInfo *, GlyphInfo> glyphsPerTexture;
+
+ float originY = float(height) / 2.0f;
+ if (textInfo.m_VerticalAlignment == TextVerticalAlignment::Bottom)
+ originY = float(height);
+ else if (textInfo.m_VerticalAlignment == TextVerticalAlignment::Top)
+ originY = 0.0;
+
+ float originX = float(width) / 2.0f;
+ if (textInfo.m_HorizontalAlignment == TextHorizontalAlignment::Right)
+ originX = float(width);
+ else if (textInfo.m_HorizontalAlignment == TextHorizontalAlignment::Left)
+ originX = 0.0;
+
+ float offsetY = -originY;
+
+ QT3DSVec3 minimum(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), 0);
+ QT3DSVec3 maximum(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max(), 0);
+
+ // To match the original behavior of the sources, we don't actually align to
+ // the bounding box. This is only used for word wrapping and elide. Keeping the
+ // code here in case this was a mistake or we for some other reason want to change
+ // it.
+#if 0
+ // If there is no bounding box, then alignmentHeight == height, so we skip it
+ if (!boundingBox.isNull() && text3DS->verticalAlignment() == Q3DSTextNode::Bottom)
+ offsetY += float(maximumHeight - height);
+ else if (!boundingBox.isNull() && text3DS->verticalAlignment() == Q3DSTextNode::Middle)
+ offsetY += float(maximumHeight / 2.0 - height / 2.0);
+ float alignmentWidth = boundingBox.isNull() ? float(width) : float(maximumWidth);
+#else
+ float alignmentWidth = float(width);
+#endif
+
+ for (int j = 0; j < layout.lineCount(); ++j) {
+ QTextLine line = layout.lineAt(j);
+
+ float offsetX = -originX;
+ if (textInfo.m_HorizontalAlignment == TextHorizontalAlignment::Right)
+ offsetX += alignmentWidth - float(line.naturalTextWidth());
+ else if (textInfo.m_HorizontalAlignment == TextHorizontalAlignment::Center)
+ offsetX += alignmentWidth / 2.0f - float(line.naturalTextWidth()) / 2.0f;
+
+ const QList<QGlyphRun> glyphRuns = line.glyphRuns();
+ for (const QGlyphRun &glyphRun : glyphRuns) {
+ const QVector<quint32> glyphIndexes = glyphRun.glyphIndexes();
+ const QVector<QPointF> glyphPositions = glyphRun.positions();
+
+ Q3DSDistanceFieldGlyphCache *cache = m_glyphCacheManager.glyphCache(
+ glyphRun.rawFont());
+ cache->populate(glyphRun.glyphIndexes());
+ cache->processPendingGlyphs();
+
+ qreal fontPixelSize = glyphRun.rawFont().pixelSize();
+
+ qreal shadowOffsetX = qreal(cache->fontSize())
+ * qreal(textInfo.m_DropShadowOffsetX) / 1000.0;
+ qreal shadowOffsetY = qreal(cache->fontSize())
+ * qreal(textInfo.m_DropShadowOffsetY) / 1000.0;
+
+ qreal maxTexMargin = cache->distanceFieldRadius();
+ qreal fontScale = cache->fontScale(fontPixelSize);
+ qreal margin = 2;
+ qreal texMargin = margin / fontScale;
+ if (texMargin > maxTexMargin) {
+ texMargin = maxTexMargin;
+ margin = maxTexMargin * fontScale;
+ }
+
+ for (int i = 0; i < glyphIndexes.size(); ++i) {
+ quint32 glyphIndex = glyphIndexes.at(i);
+ QPointF position = glyphPositions.at(i);
+
+ QSGDistanceFieldGlyphCache::TexCoord c = cache->glyphTexCoord(glyphIndex);
+ if (c.isNull())
+ continue;
+
+ QSGDistanceFieldGlyphCache::Metrics metrics = cache->glyphMetrics(glyphIndex,
+ fontPixelSize);
+ if (metrics.isNull())
+ continue;
+
+ metrics.width += margin * 2;
+ metrics.height += margin * 2;
+ metrics.baselineX -= margin;
+ metrics.baselineY += margin;
+ c.xMargin -= texMargin;
+ c.yMargin -= texMargin;
+ c.width += texMargin * 2;
+ c.height += texMargin * 2;
+
+ float cx1 = float(position.x() + metrics.baselineX) + offsetX;
+ float cx2 = cx1 + float(metrics.width);
+ float cy1 = float(position.y() - metrics.baselineY) + offsetY;
+ float cy2 = cy1 + float(metrics.height);
+
+ cx1 /= float(scaleFactor);
+ cy1 /= float(scaleFactor);
+ cx2 /= float(scaleFactor);
+ cy2 /= float(scaleFactor);
+
+ if (textInfo.m_DropShadow) {
+ if (shadowOffsetX < 0.0)
+ cx1 += float(shadowOffsetX * fontScale);
+ else
+ cx2 += float(shadowOffsetX * fontScale);
+
+ if (shadowOffsetY < 0.0)
+ cy1 += float(shadowOffsetY * fontScale);
+ else
+ cy2 += float(shadowOffsetY * fontScale);
+ }
+
+ float x1Clip = 1.0f;
+ float x2Clip = 1.0f;
+ float y1Clip = 1.0f;
+ float y2Clip = 1.0f;
+
+ if (hasValidBoundingBox) {
+ if ((cx1 < -halfWidth && cx2 < -halfWidth)
+ || (cx1 > halfWidth && cx2 > halfWidth)
+ || (cy1 < -halfHeight && cy2 < -halfHeight)
+ || (cy1 > halfHeight && cy2 > halfHeight)) {
+ continue;
+ }
+
+ float xDiff = qAbs(cx1 - cx2);
+ float yDiff = qAbs(cy1 - cy2);
+
+ if (cx1 < -halfWidth) {
+ x1Clip = 1.0f - qAbs(cx1 - (-halfWidth)) / xDiff;
+ cx1 = -halfWidth;
+ }
+
+ if (cx2 > halfWidth) {
+ x2Clip = 1.0f - qAbs(cx2 - halfWidth) / xDiff;
+ cx2 = halfWidth;
+ }
+
+ if (cy1 < -halfHeight) {
+ y1Clip = 1.0f - qAbs(cy1 - (-halfHeight)) / yDiff;
+ cy1 = -halfHeight;
+ }
+
+ if (cy2 > halfHeight) {
+ y2Clip = 1.0f - qAbs(cy2 - halfHeight) / yDiff;
+ cy2 = halfHeight;
+ }
+ }
+
+ cy1 = -cy1;
+ cy2 = -cy2;
+
+ if (cx1 < minimum.x)
+ minimum.x = cx1;
+ else if (cx1 > maximum.x)
+ maximum.x = cx1;
+
+ if (cx2 < minimum.x)
+ minimum.x = cx2;
+ else if (cx2 > maximum.x)
+ maximum.x = cx2;
+
+ if (cy1 < minimum.y)
+ minimum.y = cy1;
+ else if (cy1 > maximum.y)
+ maximum.y = cy1;
+
+ if (cy2 < minimum.y)
+ minimum.y = cy2;
+ else if (cy2 > maximum.y)
+ maximum.y = cy2;
+
+ if (hasValidBoundingBox) {
+ if (maximum.x < halfWidth)
+ maximum.x = halfWidth;
+ if (minimum.x > -halfWidth)
+ minimum.x = -halfWidth;
+ if (maximum.y < halfHeight)
+ maximum.y = halfHeight;
+ if (minimum.y > -halfHeight)
+ minimum.y = -halfHeight;
+ }
+
+ float tx1 = float(c.x + c.xMargin);
+ float tx2 = tx1 + float(c.width);
+ float ty1 = float(c.y + c.yMargin);
+ float ty2 = ty1 + float(c.height);
+
+ // Preserve original bounds of glyphs
+ float ttx1 = tx1;
+ float tty1 = ty1;
+ float ttx2 = tx2;
+ float tty2 = ty2;
+
+ if (textInfo.m_DropShadow) {
+ if (shadowOffsetX < 0.0)
+ tx1 += float(c.width * shadowOffsetX * fontScale) / float(metrics.width);
+ else
+ tx2 += float(c.width * shadowOffsetX * fontScale) / float(metrics.width);
+
+ if (shadowOffsetY < 0.0)
+ ty1 += float(c.height * shadowOffsetY * fontScale) / float(metrics.height);
+ else
+ ty2 += float(c.height * shadowOffsetY * fontScale) / float(metrics.height);
+ }
+
+ if (hasValidBoundingBox) {
+ float tx1Orig = tx1;
+ float tx2Orig = tx2;
+ float ty1Orig = ty1;
+ float ty2Orig = ty2;
+
+ float xDiff = qAbs(tx1 - tx2);
+ tx1 = tx2Orig - xDiff * x1Clip;
+ tx2 = tx1Orig + xDiff * x2Clip;
+
+ float yDiff = qAbs(ty1 - ty2);
+ ty1 = ty2Orig - yDiff * y1Clip;
+ ty2 = ty1Orig + yDiff * y2Clip;
+ }
+
+ const QSGDistanceFieldGlyphCache::Texture *texture
+ = cache->glyphTexture(glyphIndex);
+ if (texture->textureId == 0) {
+ qWarning() << "Empty texture for glyph" << glyphIndex;
+ continue;
+ }
+
+ Q3DSDistanceFieldGlyphCache::TextureInfo *textureInfo = cache->textureInfoById(
+ texture->textureId);
+
+ GlyphInfo &glyphInfo = glyphsPerTexture[textureInfo];
+ glyphInfo.fontScale = float(fontScale);
+ glyphInfo.shadowOffsetX = float(shadowOffsetX);
+ glyphInfo.shadowOffsetY = float(shadowOffsetY);
+ glyphInfo.bounds = NVBounds3(minimum, maximum);
+
+ QVector<float> &vertexes = glyphInfo.vertexes;
+ vertexes.reserve(vertexes.size() + 20 + (textInfo.m_DropShadow ? 16 : 0));
+
+ vertexes.append(cx1);
+ vertexes.append(cy1);
+ vertexes.append(0.0);
+ vertexes.append(tx1);
+ vertexes.append(ty1);
+
+ if (textInfo.m_DropShadow) {
+ vertexes.append(ttx1);
+ vertexes.append(tty1);
+ vertexes.append(ttx2);
+ vertexes.append(tty2);
+ }
+
+ vertexes.append(cx2);
+ vertexes.append(cy1);
+ vertexes.append(0.0);
+ vertexes.append(tx2);
+ vertexes.append(ty1);
+
+ if (textInfo.m_DropShadow) {
+ vertexes.append(ttx1);
+ vertexes.append(tty1);
+ vertexes.append(ttx2);
+ vertexes.append(tty2);
+ }
+
+ vertexes.append(cx2);
+ vertexes.append(cy2);
+ vertexes.append(0.0);
+ vertexes.append(tx2);
+ vertexes.append(ty2);
+
+ if (textInfo.m_DropShadow) {
+ vertexes.append(ttx1);
+ vertexes.append(tty1);
+ vertexes.append(ttx2);
+ vertexes.append(tty2);
+ }
+
+ vertexes.append(cx1);
+ vertexes.append(cy2);
+ vertexes.append(0.0);
+ vertexes.append(tx1);
+ vertexes.append(ty2);
+
+ if (textInfo.m_DropShadow) {
+ vertexes.append(ttx1);
+ vertexes.append(tty1);
+ vertexes.append(ttx2);
+ vertexes.append(tty2);
+ }
+ }
+ }
+ }
+
+ return glyphsPerTexture;
+}
+
+template <typename T>
+static QVector<T> fillIndexBuffer(uint quadCount)
+{
+ QVector<T> indexes;
+
+ const uint triangleCount = 2 * quadCount;
+ indexes.resize(3 * int(triangleCount));
+
+ Q_ASSERT(indexes.size() % 6 == 0);
+
+ for (uint i = 0; i < quadCount; i ++) {
+ indexes[int(i * 6 + 0)] = T(i * 4 + 0);
+ indexes[int(i * 6 + 1)] = T(i * 4 + 3);
+ indexes[int(i * 6 + 2)] = T(i * 4 + 1);
+
+ indexes[int(i * 6 + 3)] = T(i * 4 + 1);
+ indexes[int(i * 6 + 4)] = T(i * 4 + 3);
+ indexes[int(i * 6 + 5)] = T(i * 4 + 2);
+ }
+
+ return indexes;
+}
+
+void Q3DSDistanceFieldRenderer::buildShaders()
+{
+ IShaderProgramGenerator &gen = m_context->GetShaderProgramGenerator();
+ gen.BeginProgram();
+ IShaderStageGenerator &vertexGenerator(*gen.GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(*gen.GetStage(ShaderGeneratorStages::Fragment));
+
+ if (m_context->GetRenderContext().GetRenderContextType() == NVRenderContextValues::GLES2) {
+ vertexGenerator.AddInclude("distancefieldtext.vert");
+ fragmentGenerator.AddInclude("distancefieldtext.frag");
+ } else {
+ vertexGenerator.AddInclude("distancefieldtext_core.vert");
+ fragmentGenerator.AddInclude("distancefieldtext_core.frag");
+ }
+
+ m_shader.program = gen.CompileGeneratedShader("distancefieldtext",
+ SShaderCacheProgramFlags(),
+ TShaderFeatureSet(), false);
+
+ if (m_shader.program) {
+ m_shader.mvp = NVRenderCachedShaderProperty<QT3DSMat44>(
+ "mvp", *m_shader.program);
+ m_shader.textureWidth = NVRenderCachedShaderProperty<QT3DSI32>(
+ "textureWidth", *m_shader.program);
+ m_shader.textureHeight = NVRenderCachedShaderProperty<QT3DSI32>(
+ "textureHeight", *m_shader.program);
+ m_shader.fontScale = NVRenderCachedShaderProperty<QT3DSF32>(
+ "fontScale", *m_shader.program);
+ m_shader.texture = NVRenderCachedShaderProperty<NVRenderTexture2D *>(
+ "_qt_texture", *m_shader.program);
+ m_shader.color = NVRenderCachedShaderProperty<QT3DSVec4>(
+ "color", *m_shader.program);
+ }
+
+ gen.BeginProgram();
+ vertexGenerator = *gen.GetStage(ShaderGeneratorStages::Vertex);
+ fragmentGenerator = *gen.GetStage(ShaderGeneratorStages::Fragment);
+
+ if (m_context->GetRenderContext().GetRenderContextType() == NVRenderContextValues::GLES2) {
+ vertexGenerator.AddInclude("distancefieldtext_dropshadow.vert");
+ fragmentGenerator.AddInclude("distancefieldtext_dropshadow.frag");
+ } else {
+ vertexGenerator.AddInclude("distancefieldtext_dropshadow_core.vert");
+ fragmentGenerator.AddInclude("distancefieldtext_dropshadow_core.frag");
+ }
+
+ m_dropShadowShader.program = gen.CompileGeneratedShader("distancefieldtext_dropshadow",
+ SShaderCacheProgramFlags(),
+ TShaderFeatureSet(), false);
+
+ if (m_dropShadowShader.program) {
+ m_dropShadowShader.mvp = NVRenderCachedShaderProperty<QT3DSMat44>(
+ "mvp", *m_dropShadowShader.program);
+ m_dropShadowShader.textureWidth = NVRenderCachedShaderProperty<QT3DSI32>(
+ "textureWidth", *m_dropShadowShader.program);
+ m_dropShadowShader.textureHeight = NVRenderCachedShaderProperty<QT3DSI32>(
+ "textureHeight", *m_dropShadowShader.program);
+ m_dropShadowShader.fontScale = NVRenderCachedShaderProperty<QT3DSF32>(
+ "fontScale", *m_dropShadowShader.program);
+ m_dropShadowShader.shadowOffset = NVRenderCachedShaderProperty<QT3DSVec2>(
+ "shadowOffset", *m_dropShadowShader.program);
+ m_dropShadowShader.texture = NVRenderCachedShaderProperty<NVRenderTexture2D *>(
+ "_qt_texture", *m_dropShadowShader.program);
+ m_dropShadowShader.color = NVRenderCachedShaderProperty<QT3DSVec4>(
+ "color", *m_dropShadowShader.program);
+ m_dropShadowShader.shadowColor = NVRenderCachedShaderProperty<QT3DSVec4>(
+ "shadowColor", *m_dropShadowShader.program);
+ }
+}
+
+Q3DSDistanceFieldMesh Q3DSDistanceFieldRenderer::buildMesh(const GlyphInfo &glyphInfo,
+ bool shadow)
+{
+ static NVRenderVertexBufferEntry entries[] = {
+ NVRenderVertexBufferEntry("vCoord", NVRenderComponentTypes::QT3DSF32, 3),
+ NVRenderVertexBufferEntry("tCoord", NVRenderComponentTypes::QT3DSF32, 2, 3 * sizeof(float))
+ };
+
+ static NVRenderVertexBufferEntry shadowEntries[] = {
+ NVRenderVertexBufferEntry("vCoord", NVRenderComponentTypes::QT3DSF32, 3),
+ NVRenderVertexBufferEntry("tCoord", NVRenderComponentTypes::QT3DSF32, 2,
+ 3 * sizeof(float)),
+ NVRenderVertexBufferEntry("textureBounds", NVRenderComponentTypes::QT3DSF32, 4,
+ 5 * sizeof(float))
+ };
+
+ const uint floatsPerVertex = 3 + 2 + (shadow ? 4 : 0);
+ const uint stride = floatsPerVertex * sizeof(float);
+ const uint offset = 0;
+
+ NVRenderContext &renderContext = m_context->GetRenderContext();
+ QVector<float> vertexes = glyphInfo.vertexes;
+
+ Q_ASSERT(uint(vertexes.size()) % floatsPerVertex == 0);
+ const uint vertexCount = uint(vertexes.size()) / floatsPerVertex;
+
+ Q_ASSERT(vertexCount % 4 == 0);
+ const uint quadCount = vertexCount / 4;
+
+ Q3DSDistanceFieldMesh mesh;
+
+ mesh.attribLayout = renderContext.CreateAttributeLayout(
+ toConstDataRef(shadow ? shadowEntries : entries, shadow ? 3 : 2));
+ mesh.vertexBuffer = renderContext.CreateVertexBuffer(
+ NVRenderBufferUsageType::Static, size_t(vertexes.size()) * sizeof(float), stride,
+ toU8DataRef(vertexes.begin(), QT3DSU32(vertexes.size())));
+
+ if (vertexCount <= 0xffff) {
+ QVector<QT3DSU16> indexes = fillIndexBuffer<QT3DSU16>(quadCount);
+ mesh.indexBuffer = renderContext.CreateIndexBuffer(
+ NVRenderBufferUsageType::Static, NVRenderComponentTypes::QT3DSU16,
+ size_t(indexes.size()) * sizeof(QT3DSU16),
+ toU8DataRef(indexes.begin(), QT3DSU32(indexes.size())));
+ } else {
+ QVector<QT3DSU32> indexes = fillIndexBuffer<QT3DSU32>(quadCount);
+ mesh.indexBuffer = renderContext.CreateIndexBuffer(
+ NVRenderBufferUsageType::Static, NVRenderComponentTypes::QT3DSU32,
+ size_t(indexes.size()) * sizeof(QT3DSU32),
+ toU8DataRef(indexes.begin(), QT3DSU32(indexes.size())));
+ }
+
+ mesh.inputAssembler = renderContext.CreateInputAssembler(
+ mesh.attribLayout, toConstDataRef(&mesh.vertexBuffer, 1), mesh.indexBuffer,
+ toConstDataRef(&stride, 1), toConstDataRef(&offset, 1));
+
+ return mesh;
+}
+
+void Q3DSDistanceFieldRenderer::renderMesh(
+ NVRenderInputAssembler *inputAssembler, NVRenderTexture2D *texture, const QT3DSMat44 &mvp,
+ QT3DSI32 textureWidth, QT3DSI32 textureHeight, QT3DSF32 fontScale, QT3DSVec4 color)
+{
+ NVRenderContext &renderContext = m_context->GetRenderContext();
+ renderContext.SetCullingEnabled(false);
+
+ renderContext.SetBlendFunction(NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::One,
+ NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One,
+ NVRenderDstBlendFunc::OneMinusSrcAlpha));
+ renderContext.SetBlendEquation(NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add));
+
+ renderContext.SetActiveShader(m_shader.program);
+ m_shader.mvp.Set(mvp);
+ m_shader.textureWidth.Set(textureWidth);
+ m_shader.textureHeight.Set(textureHeight);
+ m_shader.fontScale.Set(fontScale);
+ m_shader.texture.Set(texture);
+ m_shader.color.Set(color);
+
+ renderContext.SetInputAssembler(inputAssembler);
+ renderContext.Draw(NVRenderDrawMode::Triangles, inputAssembler->GetIndexCount(), 0);
+}
+
+void Q3DSDistanceFieldRenderer::renderMeshWithDropShadow(
+ NVRenderInputAssembler *inputAssembler, NVRenderTexture2D *texture, const QT3DSMat44 &mvp,
+ QT3DSI32 textureWidth, QT3DSI32 textureHeight, QT3DSF32 fontScale, QT3DSVec2 shadowOffset,
+ QT3DSVec4 color, QT3DSVec4 shadowColor)
+{
+ NVRenderContext &renderContext = m_context->GetRenderContext();
+ renderContext.SetCullingEnabled(false);
+
+ renderContext.SetBlendFunction(NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::One,
+ NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One,
+ NVRenderDstBlendFunc::OneMinusSrcAlpha));
+ renderContext.SetBlendEquation(NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add));
+
+ renderContext.SetActiveShader(m_dropShadowShader.program);
+ m_dropShadowShader.mvp.Set(mvp);
+ m_dropShadowShader.textureWidth.Set(textureWidth);
+ m_dropShadowShader.textureHeight.Set(textureHeight);
+ m_dropShadowShader.fontScale.Set(fontScale);
+ m_dropShadowShader.shadowOffset.Set(shadowOffset);
+ m_dropShadowShader.texture.Set(texture);
+ m_dropShadowShader.color.Set(color);
+ m_dropShadowShader.shadowColor.Set(shadowColor);
+
+ renderContext.SetInputAssembler(inputAssembler);
+ renderContext.Draw(NVRenderDrawMode::Triangles, inputAssembler->GetIndexCount(), 0);
+}
+
+namespace std {
+template<class T>
+struct hash<QVector<T>>
+{
+ size_t operator()(const QVector<T> &s) const
+ {
+ return qHash(s);
+ }
+};
+
+template<>
+struct hash<TextHorizontalAlignment::Enum>
+{
+ size_t operator()(const TextHorizontalAlignment::Enum& s) const
+ {
+ return qHash(s);
+ }
+};
+
+template<>
+struct hash<TextVerticalAlignment::Enum>
+{
+ size_t operator()(const TextVerticalAlignment::Enum& s) const
+ {
+ return qHash(s);
+ }
+};
+
+template<>
+struct hash<TextElide::Enum>
+{
+ size_t operator()(const TextElide::Enum& s) const
+ {
+ return qHash(s);
+ }
+};
+
+template<>
+struct hash<TextWordWrap::Enum>
+{
+ size_t operator()(const TextWordWrap::Enum& s) const
+ {
+ return qHash(s);
+ }
+};
+}
+
+// Copied from boost
+template <class T>
+inline void hashCombine(std::size_t &seed, const T &v)
+{
+ std::hash<T> hasher;
+ seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+}
+
+size_t getTextHashValue(const SText &text)
+{
+ size_t hashValue = 0;
+ hashCombine(hashValue, text.m_TextColor.x);
+ hashCombine(hashValue, text.m_TextColor.y);
+ hashCombine(hashValue, text.m_TextColor.z);
+ hashCombine(hashValue, text.m_TextColor.w);
+ hashCombine(hashValue, std::string(text.m_Font.c_str()));
+ hashCombine(hashValue, std::string(text.m_Text.c_str()));
+ hashCombine(hashValue, text.m_Elide);
+ hashCombine(hashValue, text.m_Leading);
+ hashCombine(hashValue, text.m_FontSize);
+ hashCombine(hashValue, text.m_Tracking);
+ hashCombine(hashValue, text.m_WordWrap);
+ hashCombine(hashValue, text.m_DropShadow);
+ hashCombine(hashValue, text.m_BoundingBox.x);
+ hashCombine(hashValue, text.m_BoundingBox.y);
+ hashCombine(hashValue, text.m_DropShadowOffsetX);
+ hashCombine(hashValue, text.m_DropShadowOffsetY);
+ hashCombine(hashValue, text.m_DropShadowStrength);
+ hashCombine(hashValue, text.m_VerticalAlignment);
+ hashCombine(hashValue, text.m_HorizontalAlignment);
+ return hashValue;
+}
+
+size_t getGlyphHashValue(const GlyphInfo &glyph)
+{
+ size_t hashValue = 0;
+ hashCombine(hashValue, glyph.vertexes);
+ hashCombine(hashValue, glyph.glyphIndexes);
+ hashCombine(hashValue, glyph.fontScale);
+ hashCombine(hashValue, glyph.shadowOffsetX);
+ hashCombine(hashValue, glyph.shadowOffsetY);
+ return hashValue;
+}
+
+void Q3DSDistanceFieldRenderer::renderText(SText &text, const QT3DSMat44 &mvp)
+{
+ if (!m_shader.program)
+ buildShaders();
+
+ float alpha = text.m_GlobalOpacity * text.m_TextColor.w;
+ QT3DSVec4 textColor = QT3DSVec4(text.m_TextColor.getXYZ() * alpha, alpha);
+ int shadowRgb = int(100 - int(text.m_DropShadowStrength));
+ QT3DSVec4 shadowColor(shadowRgb * 0.01f * alpha, shadowRgb * 0.01f * alpha,
+ shadowRgb * 0.01f * alpha, alpha);
+
+ size_t textHashValue = getTextHashValue(text);
+ if (!m_glyphCache.contains(textHashValue))
+ m_glyphCache[textHashValue] = buildGlyphsPerTexture(text);
+
+ QHash<Q3DSDistanceFieldGlyphCache::TextureInfo *, GlyphInfo> &glyphsPerTexture
+ = m_glyphCache[textHashValue];
+
+ QT3DSVec3 minimum(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), 0);
+ QT3DSVec3 maximum(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max(), 0);
+
+ QHash<Q3DSDistanceFieldGlyphCache::TextureInfo *, GlyphInfo>::const_iterator it;
+ for (it = glyphsPerTexture.constBegin(); it != glyphsPerTexture.constEnd(); ++it) {
+ const GlyphInfo &glyphInfo = it.value();
+
+ if (glyphInfo.bounds.minimum.x < minimum.x)
+ minimum.x = glyphInfo.bounds.minimum.x;
+ if (glyphInfo.bounds.minimum.y < minimum.y)
+ minimum.y = glyphInfo.bounds.minimum.y;
+ if (glyphInfo.bounds.minimum.z < minimum.z)
+ minimum.z = glyphInfo.bounds.minimum.z;
+
+ if (glyphInfo.bounds.maximum.x > maximum.x)
+ maximum.x = glyphInfo.bounds.maximum.x;
+ if (glyphInfo.bounds.maximum.y > maximum.y)
+ maximum.y = glyphInfo.bounds.maximum.y;
+ if (glyphInfo.bounds.maximum.z > maximum.z)
+ maximum.z = glyphInfo.bounds.maximum.z;
+
+ size_t glyphHashValue = getGlyphHashValue(glyphInfo);
+
+ if (!m_meshCache.contains(glyphHashValue))
+ m_meshCache[glyphHashValue] = buildMesh(glyphInfo, text.m_DropShadow);
+
+ Q3DSDistanceFieldMesh &mesh = m_meshCache[glyphHashValue];
+
+ STextureDetails textureDetails = it.key()->texture->GetTextureDetails();
+
+ if (text.m_DropShadow) {
+ renderMeshWithDropShadow(mesh.inputAssembler, it.key()->texture, mvp,
+ int(textureDetails.m_Width), int(textureDetails.m_Height),
+ glyphInfo.fontScale * float(m_pixelRatio),
+ QT3DSVec2(glyphInfo.shadowOffsetX, glyphInfo.shadowOffsetY),
+ textColor, shadowColor);
+ } else {
+ renderMesh(mesh.inputAssembler, it.key()->texture, mvp,
+ int(textureDetails.m_Width), int(textureDetails.m_Height),
+ glyphInfo.fontScale * float(m_pixelRatio), textColor);
+ }
+
+ m_renderedGlyphs += glyphHashValue;
+ }
+
+ text.m_Bounds = NVBounds3(minimum, maximum);
+}
+
+void Q3DSDistanceFieldRenderer::renderTextDepth(SText &text, const QT3DSMat44 &mvp)
+{
+ // TODO: Create a depth pass shader for distance field text
+ renderText(text, mvp);
+}
+
+void Q3DSDistanceFieldRenderer::setContext(IQt3DSRenderContext &context)
+{
+ m_context = &context;
+ m_glyphCacheManager.setContext(context);
+ buildShaders();
+}
+
+ITextRendererCore &ITextRendererCore::createDistanceFieldRenderer(NVFoundationBase &fnd)
+{
+ return *QT3DS_NEW(fnd.getAllocator(), Q3DSDistanceFieldRenderer)(fnd);
+}
+
+// Unused methods:
+
+void Q3DSDistanceFieldRenderer::PreloadFonts()
+{
+ Q_ASSERT(false);
+}
+
+void Q3DSDistanceFieldRenderer::BeginPreloadFonts(IThreadPool &, IPerfTimer &)
+{
+ Q_ASSERT(false);
+}
+
+void Q3DSDistanceFieldRenderer::EndPreloadFonts()
+{
+ Q_ASSERT(false);
+}
+
+void Q3DSDistanceFieldRenderer::ReloadFonts()
+{
+ Q_ASSERT(false);
+}
+
+NVConstDataRef<SRendererFontEntry> Q3DSDistanceFieldRenderer::GetProjectFontList()
+{
+ Q_ASSERT(false);
+ return NVConstDataRef<SRendererFontEntry>();
+}
+
+Option<CRegisteredString> Q3DSDistanceFieldRenderer::GetFontNameForFont(CRegisteredString)
+{
+ Q_ASSERT(false);
+ return Option<CRegisteredString>();
+}
+
+Option<CRegisteredString> Q3DSDistanceFieldRenderer::GetFontNameForFont(const char8_t *)
+{
+ Q_ASSERT(false);
+ return Option<CRegisteredString>();
+}
+
+STextDimensions Q3DSDistanceFieldRenderer::MeasureText(const STextRenderInfo &, QT3DSF32,
+ const char8_t *)
+{
+ Q_ASSERT(false);
+ return STextDimensions();
+}
+
+STextTextureDetails Q3DSDistanceFieldRenderer::RenderText(const STextRenderInfo &,
+ NVRenderTexture2D &)
+{
+ Q_ASSERT(false);
+ return STextTextureDetails();
+}
+
+STextTextureDetails Q3DSDistanceFieldRenderer::RenderText(
+ const STextRenderInfo &, NVRenderPathFontItem &, NVRenderPathFontSpecification &)
+{
+ Q_ASSERT(false);
+ return STextTextureDetails();
+}
+
+SRenderTextureAtlasDetails Q3DSDistanceFieldRenderer::RenderText(const STextRenderInfo &)
+{
+ Q_ASSERT(false);
+ return SRenderTextureAtlasDetails();
+}
+
+void Q3DSDistanceFieldRenderer::BeginFrame()
+{
+ Q_ASSERT(false);
+}
+
+QT3DSI32 Q3DSDistanceFieldRenderer::CreateTextureAtlas()
+{
+ Q_ASSERT(false);
+ return 0;
+}
+
+STextTextureAtlasEntryDetails Q3DSDistanceFieldRenderer::RenderAtlasEntry(QT3DSU32,
+ NVRenderTexture2D &)
+{
+ Q_ASSERT(false);
+ return STextTextureAtlasEntryDetails();
+}
+
+bool Q3DSDistanceFieldRenderer::checkAndBuildGlyphs(SText &text)
+{
+ auto hashVal = getTextHashValue(text);
+ if (!m_glyphCache.contains(hashVal)) {
+ m_glyphCache[hashVal] = buildGlyphsPerTexture(text);
+ return true;
+ }
+
+ return false;
+}
+#endif
diff --git a/src/runtimerender/Qt3DSDistanceFieldRenderer.h b/src/runtimerender/Qt3DSDistanceFieldRenderer.h
new file mode 100644
index 0000000..3af19a9
--- /dev/null
+++ b/src/runtimerender/Qt3DSDistanceFieldRenderer.h
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DSDISTANCEFIELDRENDERER_H
+#define QT3DSDISTANCEFIELDRENDERER_H
+
+#include "Qt3DSFontDatabase_p.h"
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderText.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+#include "Qt3DSDistanceFieldGlyphCacheManager_p.h"
+#include "Qt3DSDistanceFieldGlyphCache_p.h"
+
+namespace qt3ds {
+namespace render {
+
+struct GlyphInfo {
+ QVector<float> vertexes;
+ QVector<quint32> glyphIndexes;
+ Q3DSDistanceFieldGlyphCache *cache;
+ float fontScale;
+ float shadowOffsetX;
+ float shadowOffsetY;
+ NVBounds3 bounds;
+};
+
+struct Q3DSDistanceFieldShader {
+ NVRenderShaderProgram *program = nullptr;
+ NVRenderCachedShaderProperty<QT3DSMat44> mvp;
+ NVRenderCachedShaderProperty<QT3DSI32> textureWidth;
+ NVRenderCachedShaderProperty<QT3DSI32> textureHeight;
+ NVRenderCachedShaderProperty<QT3DSF32> fontScale;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> texture;
+ NVRenderCachedShaderProperty<QT3DSVec4> color;
+};
+
+struct Q3DSDistanceFieldDropShadowShader {
+ NVRenderShaderProgram *program = nullptr;
+ NVRenderCachedShaderProperty<QT3DSMat44> mvp;
+ NVRenderCachedShaderProperty<QT3DSI32> textureWidth;
+ NVRenderCachedShaderProperty<QT3DSI32> textureHeight;
+ NVRenderCachedShaderProperty<QT3DSF32> fontScale;
+ NVRenderCachedShaderProperty<QT3DSVec2> shadowOffset;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> texture;
+ NVRenderCachedShaderProperty<QT3DSVec4> color;
+ NVRenderCachedShaderProperty<QT3DSVec4> shadowColor;
+};
+
+struct Q3DSDistanceFieldMesh
+{
+ NVRenderAttribLayout *attribLayout = nullptr;
+ NVRenderVertexBuffer *vertexBuffer = nullptr;
+ NVRenderIndexBuffer *indexBuffer = nullptr;
+ NVRenderInputAssembler *inputAssembler = nullptr;
+};
+
+class Q3DSDistanceFieldRenderer : public ITextRenderer
+{
+public:
+ Q3DSDistanceFieldRenderer(NVFoundationBase &foundation);
+ ~Q3DSDistanceFieldRenderer() override;
+ QHash<Q3DSDistanceFieldGlyphCache::TextureInfo *, GlyphInfo> buildGlyphsPerTexture(
+ const SText &textInfo);
+ void buildShaders();
+ Q3DSDistanceFieldMesh buildMesh(const GlyphInfo &glyphInfo, bool shadow);
+ void renderMesh(NVRenderInputAssembler *inputAssembler, NVRenderTexture2D *texture,
+ const QT3DSMat44 &mvp, QT3DSI32 textureWidth, QT3DSI32 textureHeight,
+ QT3DSF32 fontScale, QT3DSVec4 color);
+ void renderMeshWithDropShadow(NVRenderInputAssembler *inputAssembler,
+ NVRenderTexture2D *texture, const QT3DSMat44 &mvp,
+ QT3DSI32 textureWidth, QT3DSI32 textureHeight,
+ QT3DSF32 fontScale, QT3DSVec2 shadowOffset,
+ QT3DSVec4 color, QT3DSVec4 shadowColor);
+ void renderText(SText &text, const QT3DSMat44 &mvp);
+ void renderTextDepth(SText &text, const QT3DSMat44 &mvp);
+ void setContext(IQt3DSRenderContext &context);
+
+ bool checkAndBuildGlyphs(SText &text);
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_foundation.getAllocator())
+
+ void AddSystemFontDirectory(const char8_t *dir) override;
+ void AddProjectFontDirectory(const char8_t *dir) override;
+ void ClearProjectFontDirectories() override;
+ ITextRenderer &GetTextRenderer(NVRenderContext &) override;
+ void EndFrame() override;
+
+ // Unused methods:
+ void PreloadFonts() override;
+ void BeginPreloadFonts(IThreadPool &, IPerfTimer &) override;
+ void EndPreloadFonts() override;
+ void ReloadFonts() override;
+
+ NVConstDataRef<SRendererFontEntry> GetProjectFontList() override;
+
+ Option<CRegisteredString> GetFontNameForFont(CRegisteredString) override;
+ Option<CRegisteredString> GetFontNameForFont(const char8_t *) override;
+
+ STextDimensions MeasureText(const STextRenderInfo &, QT3DSF32,
+ const char8_t *) override;
+
+ STextTextureDetails RenderText(const STextRenderInfo &,
+ NVRenderTexture2D &) override;
+
+ STextTextureDetails RenderText(const STextRenderInfo &, NVRenderPathFontItem &,
+ NVRenderPathFontSpecification &) override;
+
+ SRenderTextureAtlasDetails RenderText(const STextRenderInfo &) override;
+
+ void BeginFrame() override;
+
+ QT3DSI32 CreateTextureAtlas() override;
+ STextTextureAtlasEntryDetails RenderAtlasEntry(QT3DSU32, NVRenderTexture2D &) override;
+
+private:
+ IQt3DSRenderContext *m_context = nullptr;
+ QHash<size_t, QHash<Q3DSDistanceFieldGlyphCache::TextureInfo *, GlyphInfo>> m_glyphCache;
+ QHash<size_t, Q3DSDistanceFieldMesh> m_meshCache;
+
+ Q3DSFontDatabase m_fontDatabase;
+ Q3DSDistanceFieldGlyphCacheManager m_glyphCacheManager;
+
+ Q3DSDistanceFieldShader m_shader;
+ Q3DSDistanceFieldDropShadowShader m_dropShadowShader;
+ QVector<size_t> m_renderedGlyphs;
+
+ QStringList m_systemDirs;
+ QStringList m_projectDirs;
+
+ qreal m_pixelRatio = 0.0;
+
+ NVFoundationBase &m_foundation;
+ volatile QT3DSI32 mRefCount = 0;
+};
+
+}
+}
+
+#endif // Qt version check
+
+#endif // QT3DSDISTANCEFIELDRENDERER_H
diff --git a/src/runtimerender/Qt3DSFontDatabase.cpp b/src/runtimerender/Qt3DSFontDatabase.cpp
new file mode 100644
index 0000000..b44cdbd
--- /dev/null
+++ b/src/runtimerender/Qt3DSFontDatabase.cpp
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSFontDatabase_p.h"
+
+#include <QtCore/qdir.h>
+#include "qloggingcategory.h"
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+QT_BEGIN_NAMESPACE
+
+Q3DSFontDatabase::Q3DSFontDatabase()
+{
+}
+
+void Q3DSFontDatabase::registerFonts(const QStringList &directories)
+{
+ const QStringList nameFilters = { QStringLiteral("*.ttf"), QStringLiteral("*.otf") };
+ for (const QString &directory : directories) {
+ QDir fontDir(directory);
+ if (!fontDir.exists()) {
+ qWarning("Attempted to register invalid font directory: %s",
+ qPrintable(directory));
+ continue;
+ }
+
+ const QFileInfoList entryInfoList = fontDir.entryInfoList(nameFilters);
+ for (const QFileInfo &entryInfo : entryInfoList) {
+ QRawFont font(entryInfo.absoluteFilePath(), 16);
+ if (!font.isValid()) {
+ qWarning("Invalid font file: %s", qPrintable(entryInfo.absoluteFilePath()));
+ continue;
+ }
+
+ // ### Only support scalable fonts
+
+ QString fontId = entryInfo.baseName();
+ if (std::find_if(m_fonts.constBegin(), m_fonts.constEnd(),
+ [fontId](const Font &f) { return f.fontId == fontId; })
+ != m_fonts.constEnd()) {
+ // already registered
+ continue;
+ }
+
+ m_fonts.append(Font(fontId, entryInfo.absoluteFilePath()));
+ }
+ }
+}
+
+void Q3DSFontDatabase::unregisterFonts(const QStringList &directories)
+{
+ for (const QString &directory : directories) {
+ QDir dir(directory);
+ QVector<Font>::iterator it = m_fonts.begin();
+ while (it != m_fonts.end()) {
+ if (dir == QDir(QFileInfo(it->filePath).absolutePath()))
+ it = m_fonts.erase(it);
+ else
+ ++it;
+ }
+ }
+}
+
+QRawFont Q3DSFontDatabase::findFont(const QString &fontId)
+{
+ for (Font &font : m_fonts) {
+ if (font.fontId == fontId) {
+ if (!font.rawFont.isValid())
+ font.rawFont = QRawFont(font.filePath, 16);
+ return font.rawFont;
+ }
+ }
+
+ return QRawFont::fromFont(QFont());
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_VERSION >= QT_VERSION_CHECK(5,12,2)
diff --git a/src/runtimerender/Qt3DSFontDatabase_p.h b/src/runtimerender/Qt3DSFontDatabase_p.h
new file mode 100644
index 0000000..73e0362
--- /dev/null
+++ b/src/runtimerender/Qt3DSFontDatabase_p.h
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef Q3DSFONTDATABASE_P_H
+#define Q3DSFONTDATABASE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of a number of Qt sources files. This header file may change from
+// version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qvector.h>
+#include <QtGui/qrawfont.h>
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+QT_BEGIN_NAMESPACE
+
+class Q3DSSceneManager;
+class Q3DSFontDatabase
+{
+public:
+ Q3DSFontDatabase();
+
+ void registerFonts(const QStringList &directories);
+ void unregisterFonts(const QStringList &directories);
+
+ QRawFont findFont(const QString &fontId);
+
+private:
+ struct Font {
+ Font() = default;
+ Font(const QString &id, const QString &path)
+ : fontId(id)
+ , filePath(path)
+ {}
+
+ QString fontId;
+ QString filePath;
+ QRawFont rawFont;
+ };
+
+ QVector<Font> m_fonts;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+
+#endif // Q3DSFONTDATABASE_P_H
diff --git a/src/runtimerender/Qt3DSOffscreenRenderKey.h b/src/runtimerender/Qt3DSOffscreenRenderKey.h
new file mode 100644
index 0000000..555c268
--- /dev/null
+++ b/src/runtimerender/Qt3DSOffscreenRenderKey.h
@@ -0,0 +1,153 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_OFFSCREEN_RENDER_KEY_H
+#define QT3DS_OFFSCREEN_RENDER_KEY_H
+#include "Qt3DSRender.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSDiscriminatedUnion.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <>
+ struct DestructTraits<CRegisteredString>
+ {
+ void destruct(CRegisteredString &) {}
+ };
+}
+}
+
+namespace qt3ds {
+namespace render {
+ struct OffscreenRendererKeyTypes
+ {
+ enum Enum {
+ NoOffscreenRendererKey = 0,
+ RegisteredString,
+ VoidPtr,
+ };
+ };
+
+ template <typename TDType>
+ struct SOffscreenRendererKeyTypeMap
+ {
+ };
+ template <>
+ struct SOffscreenRendererKeyTypeMap<CRegisteredString>
+ {
+ enum { KeyType = OffscreenRendererKeyTypes::RegisteredString };
+ };
+ template <>
+ struct SOffscreenRendererKeyTypeMap<void *>
+ {
+ enum { KeyType = OffscreenRendererKeyTypes::VoidPtr };
+ };
+
+ struct SOffscreenRendererKeyUnionTraits
+ {
+ typedef OffscreenRendererKeyTypes::Enum TIdType;
+ enum {
+ TBufferSize = sizeof(CRegisteredString),
+ };
+
+ static TIdType getNoDataId() { return OffscreenRendererKeyTypes::NoOffscreenRendererKey; }
+
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return (TIdType)SOffscreenRendererKeyTypeMap<TDataType>::KeyType;
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case OffscreenRendererKeyTypes::RegisteredString:
+ return inVisitor(*NVUnionCast<CRegisteredString *>(inData));
+ case OffscreenRendererKeyTypes::VoidPtr:
+ return inVisitor(*NVUnionCast<void **>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case OffscreenRendererKeyTypes::NoOffscreenRendererKey:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case OffscreenRendererKeyTypes::RegisteredString:
+ return inVisitor(*NVUnionCast<const CRegisteredString *>(inData));
+ case OffscreenRendererKeyTypes::VoidPtr:
+ return inVisitor(*NVUnionCast<const void **>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case OffscreenRendererKeyTypes::NoOffscreenRendererKey:
+ return inVisitor();
+ }
+ }
+ };
+
+ typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<SOffscreenRendererKeyUnionTraits,
+ SOffscreenRendererKeyUnionTraits::
+ TBufferSize>,
+ SOffscreenRendererKeyUnionTraits::TBufferSize>
+ TOffscreenRendererKeyUnionType;
+
+ struct SOffscreenRendererKey : public TOffscreenRendererKeyUnionType
+ {
+ typedef TOffscreenRendererKeyUnionType TBase;
+ SOffscreenRendererKey() {}
+ SOffscreenRendererKey(const CRegisteredString &str)
+ : TBase(str)
+ {
+ }
+ SOffscreenRendererKey(void *key)
+ : TBase(key)
+ {
+ }
+ SOffscreenRendererKey(const SOffscreenRendererKey &other)
+ : TBase(static_cast<const TBase &>(other))
+ {
+ }
+ SOffscreenRendererKey &operator=(const SOffscreenRendererKey &other)
+ {
+ TBase::operator=(other);
+ return *this;
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSOffscreenRenderManager.cpp b/src/runtimerender/Qt3DSOffscreenRenderManager.cpp
new file mode 100644
index 0000000..7d66c7a
--- /dev/null
+++ b/src/runtimerender/Qt3DSOffscreenRenderManager.cpp
@@ -0,0 +1,498 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSOffscreenRenderManager.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSOffscreenRenderKey.h"
+#include "foundation/FastAllocator.h"
+#include "Qt3DSRenderRenderList.h"
+#include "Qt3DSRenderResourceTexture2D.h"
+#include "Qt3DSRenderResourceBufferObjects.h"
+#include "Qt3DSRendererUtil.h"
+
+using namespace qt3ds::render;
+
+namespace eastl {
+template <>
+struct hash<SOffscreenRendererKey>
+{
+ size_t operator()(const SOffscreenRendererKey &key) const
+ {
+ switch (key.getType()) {
+ case OffscreenRendererKeyTypes::RegisteredString:
+ return hash<CRegisteredString>()(key.getData<CRegisteredString>());
+ case OffscreenRendererKeyTypes::VoidPtr:
+ return hash<size_t>()(reinterpret_cast<size_t>(key.getData<void *>()));
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+ bool operator()(const SOffscreenRendererKey &lhs, const SOffscreenRendererKey &rhs) const
+ {
+ return lhs == rhs;
+ }
+};
+}
+
+namespace {
+
+using eastl::pair;
+using eastl::make_pair;
+
+struct SRendererData : SOffscreenRenderResult
+{
+ NVAllocatorCallback &m_Allocator;
+ IResourceManager &m_ResourceManager;
+ QT3DSU32 m_FrameCount;
+ bool m_Rendering;
+
+ SRendererData(NVAllocatorCallback &inAllocator, IResourceManager &inResourceManager)
+ : m_Allocator(inAllocator)
+ , m_ResourceManager(inResourceManager)
+ , m_FrameCount(QT3DS_MAX_U32)
+ , m_Rendering(false)
+ {
+ }
+ ~SRendererData()
+ {
+ if (m_Texture)
+ m_ResourceManager.Release(*m_Texture);
+ m_Texture = NULL;
+ }
+ void Release() { NVDelete(m_Allocator, this); }
+};
+
+struct SScopedRenderDataRenderMarker
+{
+ SRendererData &m_Data;
+ SScopedRenderDataRenderMarker(SRendererData &d)
+ : m_Data(d)
+ {
+ QT3DS_ASSERT(m_Data.m_Rendering == false);
+ m_Data.m_Rendering = true;
+ }
+ ~SScopedRenderDataRenderMarker() { m_Data.m_Rendering = false; }
+};
+
+struct SRenderDataReleaser
+{
+ SRendererData *mPtr;
+ SRenderDataReleaser(SRendererData *inItem)
+ : mPtr(inItem)
+ {
+ }
+ // Transfer ownership
+ SRenderDataReleaser(const SRenderDataReleaser &inOther)
+ : mPtr(inOther.mPtr)
+ {
+ const_cast<SRenderDataReleaser &>(inOther).mPtr = NULL;
+ }
+
+ ~SRenderDataReleaser()
+ {
+ if (mPtr)
+ mPtr->Release();
+ }
+};
+struct SOffscreenRenderManager;
+
+struct SOffscreenRunnable : public IRenderTask
+{
+ SOffscreenRenderManager &m_RenderManager;
+ SRendererData &m_Data;
+ SOffscreenRendererEnvironment m_DesiredEnvironment;
+ SOffscreenRunnable(SOffscreenRenderManager &rm, SRendererData &data,
+ SOffscreenRendererEnvironment env)
+ : m_RenderManager(rm)
+ , m_Data(data)
+ , m_DesiredEnvironment(env)
+ {
+ }
+ void Run() override;
+};
+
+struct SOffscreenRenderManager : public IOffscreenRenderManager
+{
+ typedef nvhash_map<SOffscreenRendererKey, SRenderDataReleaser> TRendererMap;
+ IQt3DSRenderContext &m_Context;
+ NVAllocatorCallback &m_Allocator;
+ NVScopedRefCounted<IStringTable> m_StringTable;
+ NVScopedRefCounted<IResourceManager> m_ResourceManager;
+ TRendererMap m_Renderers;
+ SFastAllocator<> m_PerFrameAllocator;
+ QT3DSU32 m_FrameCount; // cheap per-
+
+ volatile QT3DSI32 mRefCount;
+
+ SOffscreenRenderManager(NVAllocatorCallback &inCallback, IStringTable &inStringTable,
+ IResourceManager &inManager, IQt3DSRenderContext &inContext)
+ : m_Context(inContext)
+ , m_Allocator(inCallback)
+ , m_StringTable(inStringTable)
+ , m_ResourceManager(inManager)
+ , m_Renderers(inCallback, "SOffscreenRenderManager::m_Renderers")
+ , m_PerFrameAllocator(inCallback, "m_PerFrameAllocator")
+ , m_FrameCount(0)
+ , mRefCount(0)
+ {
+ }
+
+ virtual ~SOffscreenRenderManager() {}
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Allocator)
+
+ Option<bool> MaybeRegisterOffscreenRenderer(const SOffscreenRendererKey &inKey,
+ IOffscreenRenderer &inRenderer) override
+ {
+ TRendererMap::iterator theIter = m_Renderers.find(inKey);
+ if (theIter != m_Renderers.end()) {
+ SRendererData &theData = *(theIter->second.mPtr);
+ if (theData.m_Renderer != &inRenderer) {
+ if (inKey.getType() == OffscreenRendererKeyTypes::RegisteredString) {
+ qCCritical(INVALID_OPERATION, "Different renderers registered under same key: %s",
+ inKey.getData<CRegisteredString>().c_str());
+ }
+ QT3DS_ASSERT(false);
+ return Empty();
+ }
+ return false;
+ }
+ RegisterOffscreenRenderer(inKey, inRenderer);
+ return true;
+ }
+
+ void RegisterOffscreenRenderer(const SOffscreenRendererKey &inKey,
+ IOffscreenRenderer &inRenderer) override
+ {
+ pair<TRendererMap::iterator, bool> theInsert = m_Renderers.insert(
+ make_pair(inKey, QT3DS_NEW(m_Allocator, SRendererData)(m_Allocator, *m_ResourceManager)));
+ QT3DS_ASSERT(theInsert.second);
+ SRendererData &theData = *(theInsert.first->second.mPtr);
+ theData.m_Renderer = &inRenderer;
+ }
+
+ bool HasOffscreenRenderer(const SOffscreenRendererKey &inKey) override
+ {
+ return m_Renderers.find(inKey) != m_Renderers.end();
+ }
+
+ IOffscreenRenderer *GetOffscreenRenderer(const SOffscreenRendererKey &inKey) override
+ {
+ TRendererMap::iterator theRenderer = m_Renderers.find(inKey);
+ if (theRenderer != m_Renderers.end()) {
+ SRendererData &theData = *theRenderer->second.mPtr;
+ return theData.m_Renderer;
+ }
+ return NULL;
+ }
+ void ReleaseOffscreenRenderer(const SOffscreenRendererKey &inKey) override
+ {
+ m_Renderers.erase(inKey);
+ }
+
+ void RenderItem(SRendererData &theData, SOffscreenRendererEnvironment theDesiredEnvironment)
+ {
+ NVRenderContext &theContext = m_ResourceManager->GetRenderContext();
+ QT3DSVec2 thePresScaleFactor = m_Context.GetPresentationScaleFactor();
+ SOffscreenRendererEnvironment theOriginalDesiredEnvironment(theDesiredEnvironment);
+ // Ensure that our overall render context comes back no matter what the client does.
+ qt3ds::render::NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
+ theContext, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor,
+ QT3DSVec4(0, 0, 0, 0));
+ qt3ds::render::NVRenderContextScopedProperty<bool> __scissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled, false);
+ qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __scissorRect(
+ theContext, &NVRenderContext::GetScissorRect, &NVRenderContext::SetScissorRect);
+ qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __viewportRect(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport);
+ qt3ds::render::NVRenderContextScopedProperty<bool> __depthWrite(
+ theContext, &NVRenderContext::IsDepthWriteEnabled,
+ &NVRenderContext::SetDepthWriteEnabled, false);
+ qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBoolOp::Enum> __depthFunction(
+ theContext, &NVRenderContext::GetDepthFunction, &NVRenderContext::SetDepthFunction,
+ qt3ds::render::NVRenderBoolOp::Less);
+ qt3ds::render::NVRenderContextScopedProperty<bool> __blendEnabled(
+ theContext, &NVRenderContext::IsBlendingEnabled, &NVRenderContext::SetBlendingEnabled,
+ false);
+ qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBlendFunctionArgument>
+ __blendFunction(theContext, &NVRenderContext::GetBlendFunction,
+ &NVRenderContext::SetBlendFunction,
+ qt3ds::render::NVRenderBlendFunctionArgument());
+ qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBlendEquationArgument>
+ __blendEquation(theContext, &NVRenderContext::GetBlendEquation,
+ &NVRenderContext::SetBlendEquation,
+ qt3ds::render::NVRenderBlendEquationArgument());
+ qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderFrameBufferPtr>
+ __rendertarget(theContext, &NVRenderContext::GetRenderTarget,
+ &NVRenderContext::SetRenderTarget);
+
+ QT3DSU32 theSampleCount = 1;
+ bool isMultisamplePass = false;
+ if (theDesiredEnvironment.m_MSAAMode != AAModeValues::NoAA) {
+ switch (theDesiredEnvironment.m_MSAAMode) {
+ case AAModeValues::SSAA:
+ theSampleCount = 1;
+ isMultisamplePass = true;
+ break;
+ case AAModeValues::X2:
+ theSampleCount = 2;
+ isMultisamplePass = true;
+ break;
+ case AAModeValues::X4:
+ theSampleCount = 4;
+ isMultisamplePass = true;
+ break;
+ case AAModeValues::X8:
+ theSampleCount = 8;
+ isMultisamplePass = true;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ };
+
+ // adjust render size for SSAA
+ if (theDesiredEnvironment.m_MSAAMode == AAModeValues::SSAA) {
+ CRendererUtil::GetSSAARenderSize(
+ theOriginalDesiredEnvironment.m_Width, theOriginalDesiredEnvironment.m_Height,
+ theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height);
+ }
+ }
+ CResourceFrameBuffer theFrameBuffer(*m_ResourceManager);
+ theFrameBuffer.EnsureFrameBuffer();
+ NVRenderTexture2D *renderTargetTexture(theData.m_Texture);
+ qt3ds::render::NVRenderTextureTargetType::Enum fboAttachmentType =
+ qt3ds::render::NVRenderTextureTargetType::Texture2D;
+ if (isMultisamplePass) {
+ renderTargetTexture = NULL;
+ if (theSampleCount > 1)
+ fboAttachmentType = qt3ds::render::NVRenderTextureTargetType::Texture2D_MS;
+ }
+
+ CResourceTexture2D renderColorTexture(*m_ResourceManager, renderTargetTexture);
+
+ CResourceTexture2D renderDepthStencilTexture(*m_ResourceManager);
+
+ if (theSampleCount > 1)
+ m_Context.GetRenderContext().SetMultisampleEnabled(true);
+
+ qt3ds::render::NVRenderClearFlags theClearFlags;
+ NVRenderTextureFormats::Enum theDepthStencilTextureFormat(NVRenderTextureFormats::Unknown);
+ NVRenderFrameBufferAttachments::Enum theAttachmentLocation(
+ NVRenderFrameBufferAttachments::Unknown);
+ if (theDesiredEnvironment.m_Stencil) {
+ theDepthStencilTextureFormat = NVRenderTextureFormats::Depth24Stencil8;
+ theAttachmentLocation = NVRenderFrameBufferAttachments::DepthStencil;
+ } else if (theDesiredEnvironment.m_Depth != OffscreenRendererDepthValues::NoDepthBuffer) {
+ theAttachmentLocation = NVRenderFrameBufferAttachments::Depth;
+ switch (theDesiredEnvironment.m_Depth) {
+ case OffscreenRendererDepthValues::Depth16:
+ theDepthStencilTextureFormat = NVRenderTextureFormats::Depth16;
+ break;
+ case OffscreenRendererDepthValues::Depth24:
+ theDepthStencilTextureFormat = NVRenderTextureFormats::Depth24;
+ break;
+ case OffscreenRendererDepthValues::Depth32:
+ theDepthStencilTextureFormat = NVRenderTextureFormats::Depth32;
+ break;
+ default:
+ theAttachmentLocation = NVRenderFrameBufferAttachments::Unknown;
+ theDepthStencilTextureFormat = NVRenderTextureFormats::Unknown;
+ break;
+ }
+ }
+ renderColorTexture.EnsureTexture(theDesiredEnvironment.m_Width,
+ theDesiredEnvironment.m_Height,
+ theDesiredEnvironment.m_Format, theSampleCount);
+ theFrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0, *renderColorTexture,
+ fboAttachmentType);
+
+ if (theDepthStencilTextureFormat != NVRenderTextureFormats::Unknown) {
+ renderDepthStencilTexture.EnsureTexture(theDesiredEnvironment.m_Width,
+ theDesiredEnvironment.m_Height,
+ theDepthStencilTextureFormat, theSampleCount);
+ theFrameBuffer->Attach(theAttachmentLocation, *renderDepthStencilTexture,
+ fboAttachmentType);
+ }
+ // IsComplete check takes a really long time so I am not going to worry about it for now.
+
+ theContext.SetRenderTarget(theFrameBuffer);
+ theContext.SetViewport(
+ NVRenderRect(0, 0, theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height));
+ theContext.SetScissorTestEnabled(false);
+
+ theContext.SetBlendingEnabled(false);
+ theData.m_Renderer->Render(theDesiredEnvironment, theContext, thePresScaleFactor,
+ SScene::AlwaysClear, this);
+
+ if (theSampleCount > 1) {
+ CResourceTexture2D theResult(*m_ResourceManager, theData.m_Texture);
+
+ if (theDesiredEnvironment.m_MSAAMode != AAModeValues::SSAA) {
+ // Have to downsample the FBO.
+ CRendererUtil::ResolveMutisampleFBOColorOnly(
+ *m_ResourceManager, theResult, m_Context.GetRenderContext(),
+ theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height,
+ theDesiredEnvironment.m_Format, *theFrameBuffer);
+
+ m_Context.GetRenderContext().SetMultisampleEnabled(false);
+ } else {
+ // Resolve the FBO to the layer texture
+ CRendererUtil::ResolveSSAAFBOColorOnly(
+ *m_ResourceManager, theResult, theOriginalDesiredEnvironment.m_Width,
+ theOriginalDesiredEnvironment.m_Height, m_Context.GetRenderContext(),
+ theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height,
+ theDesiredEnvironment.m_Format, *theFrameBuffer);
+ }
+
+ QT3DS_ASSERT(theData.m_Texture == theResult.GetTexture());
+ theResult.ForgetTexture();
+ } else {
+ renderColorTexture.ForgetTexture();
+ }
+ theFrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer(), fboAttachmentType);
+ if (theAttachmentLocation != NVRenderFrameBufferAttachments::Unknown)
+ theFrameBuffer->Attach(theAttachmentLocation, NVRenderTextureOrRenderBuffer(),
+ fboAttachmentType);
+ }
+
+ SOffscreenRenderResult GetRenderedItem(const SOffscreenRendererKey &inKey) override
+ {
+ TRendererMap::iterator theRenderer = m_Renderers.find(inKey);
+ QT3DSVec2 thePresScaleFactor = m_Context.GetPresentationScaleFactor();
+ if (theRenderer != m_Renderers.end() && theRenderer->second.mPtr->m_Rendering == false) {
+ SRendererData &theData = *theRenderer->second.mPtr;
+ SScopedRenderDataRenderMarker __renderMarker(theData);
+
+ bool renderedThisFrame = theData.m_Texture && theData.m_FrameCount == m_FrameCount;
+ theData.m_FrameCount = m_FrameCount;
+ // Two different quick-out pathways.
+ if (renderedThisFrame)
+ return theData;
+
+ SOffscreenRendererEnvironment theDesiredEnvironment =
+ theData.m_Renderer->GetDesiredEnvironment(thePresScaleFactor);
+ // Ensure we get a valid width and height
+ theDesiredEnvironment.m_Width =
+ ITextRenderer::NextMultipleOf4(theDesiredEnvironment.m_Width);
+ theDesiredEnvironment.m_Height =
+ ITextRenderer::NextMultipleOf4(theDesiredEnvironment.m_Height);
+ if (theDesiredEnvironment.m_Width == 0 || theDesiredEnvironment.m_Height == 0) {
+ return SOffscreenRenderResult();
+ }
+
+ NVRenderRect theViewport(0, 0, theDesiredEnvironment.m_Width,
+ theDesiredEnvironment.m_Height);
+ IRenderList &theRenderList(m_Context.GetRenderList());
+ NVRenderContext &theContext(m_Context.GetRenderContext());
+ // This happens here because if there are any fancy render steps
+ SRenderListScopedProperty<bool> _scissor(theRenderList,
+ &IRenderList::IsScissorTestEnabled,
+ &IRenderList::SetScissorTestEnabled, false);
+ SRenderListScopedProperty<NVRenderRect> _viewport(
+ theRenderList, &IRenderList::GetViewport, &IRenderList::SetViewport, theViewport);
+ // Some plugins don't use the render list so they need the actual gl context setup.
+ qt3ds::render::NVRenderContextScopedProperty<bool> __scissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled, false);
+ qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __viewportRect(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport,
+ theViewport);
+
+ QT3DSU32 taskId = m_Context.GetRenderList().AddRenderTask(
+ *QT3DS_NEW(m_Context.GetPerFrameAllocator(),
+ SOffscreenRunnable)(*this, theData, theDesiredEnvironment));
+
+ SOffscreenRenderFlags theFlags =
+ theData.m_Renderer->NeedsRender(theDesiredEnvironment, thePresScaleFactor, this);
+ theData.m_HasTransparency = theFlags.m_HasTransparency;
+ theData.m_HasChangedSinceLastFrame = theFlags.m_HasChangedSinceLastFrame;
+ if (theData.m_Texture) {
+ // Quick-out if the renderer doesn't need to render itself.
+ if (theData.m_HasChangedSinceLastFrame == false) {
+ m_Context.GetRenderList().DiscardRenderTask(taskId);
+ return theData;
+ }
+ } else
+ theData.m_HasChangedSinceLastFrame = true;
+
+ // Release existing texture if it doesn't match latest environment request.
+ if (theData.m_Texture) {
+ STextureDetails theDetails = theData.m_Texture->GetTextureDetails();
+ if (theDesiredEnvironment.m_Width != theDetails.m_Width
+ || theDesiredEnvironment.m_Height != theDetails.m_Height
+ || theDesiredEnvironment.m_Format != theDetails.m_Format) {
+ m_ResourceManager->Release(*theData.m_Texture);
+ theData.m_Texture = NULL;
+ }
+ }
+
+ if (theData.m_Texture == NULL)
+ theData.m_Texture = m_ResourceManager->AllocateTexture2D(
+ theDesiredEnvironment.m_Width, theDesiredEnvironment.m_Height,
+ theDesiredEnvironment.m_Format);
+
+ // Add the node to the graph and get on with it.
+
+ return theData;
+ }
+ return SOffscreenRenderResult();
+ }
+
+ void BeginFrame() override { m_PerFrameAllocator.reset(); }
+ void EndFrame() override { ++m_FrameCount; }
+};
+
+void SOffscreenRunnable::Run()
+{
+ m_RenderManager.RenderItem(m_Data, m_DesiredEnvironment);
+}
+}
+
+IOffscreenRenderManager &IOffscreenRenderManager::CreateOffscreenRenderManager(
+ NVAllocatorCallback &inCallback, IStringTable &inStringTable, IResourceManager &inManager,
+ IQt3DSRenderContext &inContext)
+{
+ return *QT3DS_NEW(inCallback, SOffscreenRenderManager)(inCallback, inStringTable, inManager,
+ inContext);
+}
diff --git a/src/runtimerender/Qt3DSOffscreenRenderManager.h b/src/runtimerender/Qt3DSOffscreenRenderManager.h
new file mode 100644
index 0000000..6d82162
--- /dev/null
+++ b/src/runtimerender/Qt3DSOffscreenRenderManager.h
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_OFFSCREEN_RENDER_MANAGER_H
+#define QT3DS_OFFSCREEN_RENDER_MANAGER_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSOption.h"
+#include "Qt3DSRenderScene.h"
+#include "Qt3DSRenderLayer.h"
+
+namespace qt3ds {
+namespace render {
+ class IResourceManager;
+ struct Qt3DSRenderPickResult;
+ class IGraphObjectPickQuery;
+ struct OffscreenRendererDepthValues
+ {
+ enum Enum {
+ NoDepthBuffer = 0,
+ Depth16, // 16 bit depth buffer
+ Depth24, // 24 bit depth buffer
+ Depth32, // 32 bit depth buffer
+ Depth24Stencil8 // 24 bit depth buffer 8 bit stencil buffer
+ };
+ };
+
+ struct SOffscreenRendererEnvironment
+ {
+ QT3DSU32 m_Width;
+ QT3DSU32 m_Height;
+ NVRenderTextureFormats::Enum m_Format;
+ OffscreenRendererDepthValues::Enum m_Depth;
+ bool m_Stencil;
+ AAModeValues::Enum m_MSAAMode;
+
+ SOffscreenRendererEnvironment()
+ : m_Width(0)
+ , m_Height(0)
+ , m_Format(NVRenderTextureFormats::Unknown)
+ , m_Depth(OffscreenRendererDepthValues::NoDepthBuffer)
+ , m_Stencil(false)
+ , m_MSAAMode(AAModeValues::NoAA)
+ {
+ }
+
+ SOffscreenRendererEnvironment(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inFormat)
+ : m_Width(inWidth)
+ , m_Height(inHeight)
+ , m_Format(inFormat)
+ , m_Depth(OffscreenRendererDepthValues::Depth16)
+ , m_Stencil(false)
+ , m_MSAAMode(AAModeValues::NoAA)
+ {
+ }
+
+ SOffscreenRendererEnvironment(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inFormat,
+ OffscreenRendererDepthValues::Enum inDepth, bool inStencil,
+ AAModeValues::Enum inAAMode)
+ : m_Width(inWidth)
+ , m_Height(inHeight)
+ , m_Format(inFormat)
+ , m_Depth(inDepth)
+ , m_Stencil(inStencil)
+ , m_MSAAMode(inAAMode)
+ {
+ }
+
+ SOffscreenRendererEnvironment(const SOffscreenRendererEnvironment &inOther)
+ : m_Width(inOther.m_Width)
+ , m_Height(inOther.m_Height)
+ , m_Format(inOther.m_Format)
+ , m_Depth(inOther.m_Depth)
+ , m_Stencil(inOther.m_Stencil)
+ , m_MSAAMode(inOther.m_MSAAMode)
+ {
+ }
+ };
+
+ struct SOffscreenRenderFlags
+ {
+ bool m_HasTransparency;
+ bool m_HasChangedSinceLastFrame;
+ SOffscreenRenderFlags()
+ : m_HasTransparency(false)
+ , m_HasChangedSinceLastFrame(false)
+ {
+ }
+
+ SOffscreenRenderFlags(bool transparency, bool hasChanged)
+ : m_HasTransparency(transparency)
+ , m_HasChangedSinceLastFrame(hasChanged)
+ {
+ }
+ };
+
+ typedef void *SRenderInstanceId;
+
+ class IOffscreenRenderer : public NVRefCounted
+ {
+ public:
+ class IOffscreenRendererCallback
+ {
+ public:
+ virtual void onOffscreenRendererInitialized(const QString &id) = 0;
+ virtual void onOffscreenRendererFrame(const QString &id) = 0;
+ protected:
+ virtual ~IOffscreenRendererCallback() {}
+ };
+
+ protected:
+ virtual ~IOffscreenRenderer() {}
+ public:
+ virtual void addCallback(IOffscreenRendererCallback *cb) = 0;
+ // Arbitrary const char* returned to indicate the type of this renderer
+ // Can be overloaded to form the basis of an RTTI type system.
+ // Not currently used by the rendering system.
+ virtual CRegisteredString GetOffscreenRendererType() = 0;
+ virtual SOffscreenRendererEnvironment
+ GetDesiredEnvironment(QT3DSVec2 inPresentationScaleFactor) = 0;
+ // Returns true of this object needs to be rendered, false if this object is not dirty
+ virtual SOffscreenRenderFlags
+ NeedsRender(const SOffscreenRendererEnvironment &inEnvironment,
+ QT3DSVec2 inPresentationScaleFactor,
+ const SRenderInstanceId instanceId) = 0;
+ // Returns true if the rendered result image has transparency, or false
+ // if it should be treated as a completely opaque image.
+ // It is the IOffscreenRenderer's job to clear any buffers (color, depth, stencil) that it
+ // needs to. It should not assume that it's buffers are clear;
+ // Sometimes we scale the width and height of the main presentation in order to fit a
+ // window.
+ // If we do so, the scale factor tells the subpresentation renderer how much the system has
+ // scaled.
+ virtual void Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ const SRenderInstanceId instanceId) = 0;
+ virtual void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ QT3DSVec4 inclearColor,
+ const SRenderInstanceId instanceId) = 0;
+
+ // Implementors should implement one of the two interfaces below.
+
+ // If this renderer supports picking that can return graph objects
+ // then return an interface here.
+ virtual IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId instanceId) = 0;
+
+ // If you *don't* support the GraphObjectPickIterator interface, then you should implement
+ // this interface
+ // The system will just ask you to pick.
+ // If you return true, then we will assume that you swallowed the pick and will continue no
+ // further.
+ // else we will assume you did not and will continue the picking algorithm.
+ virtual bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions,
+ const SRenderInstanceId instanceId) = 0;
+ };
+
+ struct SOffscreenRenderResult
+ {
+ NVScopedRefCounted<IOffscreenRenderer> m_Renderer;
+ NVRenderTexture2D *m_Texture;
+ bool m_HasTransparency;
+ bool m_HasChangedSinceLastFrame;
+
+ SOffscreenRenderResult(IOffscreenRenderer &inRenderer, NVRenderTexture2D &inTexture,
+ bool inTrans, bool inDirty)
+ : m_Renderer(&inRenderer)
+ , m_Texture(&inTexture)
+ , m_HasTransparency(inTrans)
+ , m_HasChangedSinceLastFrame(inDirty)
+ {
+ }
+ SOffscreenRenderResult()
+ : m_Renderer(NULL)
+ , m_Texture(NULL)
+ , m_HasTransparency(false)
+ , m_HasChangedSinceLastFrame(false)
+ {
+ }
+ };
+
+ struct SOffscreenRendererKey;
+
+ /**
+ * The offscreen render manager attempts to satisfy requests for a given image under a given
+ *key.
+ * Renderers are throttled such that they render at most once per frame and potentially less
+ *than
+ * that if they don't require a new render.
+ */
+ class IOffscreenRenderManager : public NVRefCounted
+ {
+ protected:
+ virtual ~IOffscreenRenderManager() {}
+ public:
+ // returns true if the renderer has not been registered.
+ // No return value means there was an error registering this id.
+ virtual Option<bool> MaybeRegisterOffscreenRenderer(const SOffscreenRendererKey &inKey,
+ IOffscreenRenderer &inRenderer) = 0;
+ virtual void RegisterOffscreenRenderer(const SOffscreenRendererKey &inKey,
+ IOffscreenRenderer &inRenderer) = 0;
+ virtual bool HasOffscreenRenderer(const SOffscreenRendererKey &inKey) = 0;
+ virtual IOffscreenRenderer *GetOffscreenRenderer(const SOffscreenRendererKey &inKey) = 0;
+ virtual void ReleaseOffscreenRenderer(const SOffscreenRendererKey &inKey) = 0;
+
+ // This doesn't trigger rendering right away. A node is added to the render graph that
+ // points to this item.
+ // Thus rendering is deffered until the graph is run but we promise to render to this
+ // resource.
+ virtual SOffscreenRenderResult GetRenderedItem(const SOffscreenRendererKey &inKey) = 0;
+ // Called by the UICRenderContext, clients don't need to call this.
+ virtual void BeginFrame() = 0;
+ virtual void EndFrame() = 0;
+
+ static IOffscreenRenderManager &
+ CreateOffscreenRenderManager(NVAllocatorCallback &inCallback, IStringTable &inStringTable,
+ IResourceManager &inManager, IQt3DSRenderContext &inContext);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSOldNBustedRenderPlugin.cpp b/src/runtimerender/Qt3DSOldNBustedRenderPlugin.cpp
new file mode 100644
index 0000000..4028373
--- /dev/null
+++ b/src/runtimerender/Qt3DSOldNBustedRenderPlugin.cpp
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSOldNBustedRenderPlugin.h"
+#include "SystemPrefix.h"
+#include "Qt3DSDLLManager.h"
+#include "render/Qt3DSRenderContext.h"
+
+#ifdef WIN32
+#pragma warning(disable : 4355) // this used in initializer list. I have never seen this result in
+ // a physical error
+#endif
+
+namespace qt3ds {
+namespace render {
+
+ COldNBustedPluginRenderer::COldNBustedPluginRenderer(IQt3DSRenderContext &inRenderContext,
+ long inDLLHandle)
+ : m_RenderContext(inRenderContext)
+ , m_DLLHandle(inDLLHandle)
+ , mRefCount(0)
+ , m_OffscreenRendererType(inRenderContext.GetStringTable().RegisterStr(GetRendererName()))
+ {
+ if (m_DLLHandle != -1) {
+ Q3DStudio::CDLLManager &theManager = Q3DStudio::CDLLManager::GetDLLManager();
+
+ // Grab function procs
+ m_GetTextureSizeProc = reinterpret_cast<PROC_GetDesiredTextureSize>(
+ theManager.GetProc("GetDesiredTextureSize", m_DLLHandle));
+ Q3DStudio_ASSERT(m_GetTextureSizeProc);
+
+ m_RenderProc = reinterpret_cast<PROC_Render>(theManager.GetProc("Render", m_DLLHandle));
+ Q3DStudio_ASSERT(m_RenderProc);
+ }
+ }
+
+ NVRenderTextureFormats::Enum convertTextureFormat(ETEXTUREFORMAT fmt)
+ {
+ NVRenderTextureFormats::Enum ret = NVRenderTextureFormats::RGBA8;
+ switch (fmt) {
+
+ case ETEXTUREFORMAT_RGBA8:
+ break;
+
+ case ETEXTUREFORMAT_RGB8:
+ ret = NVRenderTextureFormats::RGB8;
+ break;
+
+ default:
+ break;
+
+ }
+ return ret;
+ }
+
+ SOffscreenRendererEnvironment
+ COldNBustedPluginRenderer::GetDesiredEnvironment(QT3DSVec2 inPresScale)
+ {
+ long width, height;
+ ETEXTUREFORMAT format;
+
+ m_GetTextureSizeProc(&width, &height, &format);
+
+ return SOffscreenRendererEnvironment(
+ (QT3DSU32)(width * inPresScale.x), (QT3DSU32)(height * inPresScale.y),
+ convertTextureFormat(format), OffscreenRendererDepthValues::Depth24, false,
+ AAModeValues::NoAA);
+ }
+
+ SOffscreenRenderFlags
+ COldNBustedPluginRenderer::NeedsRender(const SOffscreenRendererEnvironment & /*inEnvironment*/,
+ QT3DSVec2 /*inPresScale*/,
+ const SRenderInstanceId)
+ {
+ return SOffscreenRenderFlags(true, true);
+ }
+
+ // Returns true if the rendered result image has transparency, or false
+ // if it should be treated as a completely opaque image.
+ void COldNBustedPluginRenderer::Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 /*inPresScale*/,
+ SScene::RenderClearCommand /*inClearColorBuffer*/,
+ const SRenderInstanceId)
+ {
+ inRenderContext.PushPropertySet();
+
+ m_RenderProc(inEnvironment.m_Width, inEnvironment.m_Height, 1);
+
+ inRenderContext.PopPropertySet(true);
+ }
+}
+}
diff --git a/src/runtimerender/Qt3DSOldNBustedRenderPlugin.h b/src/runtimerender/Qt3DSOldNBustedRenderPlugin.h
new file mode 100644
index 0000000..2753bac
--- /dev/null
+++ b/src/runtimerender/Qt3DSOldNBustedRenderPlugin.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_OLD_N_BUSTED_RENDER_PLUGIN_H
+#define QT3DS_OLD_N_BUSTED_RENDER_PLUGIN_H
+
+#include "Qt3DSOffscreenRenderManager.h"
+#include "Qt3DSRenderContextCore.h"
+#include "foundation/Qt3DSVec4.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "Qt3DSPluginDLL.h"
+
+namespace qt3ds {
+namespace render {
+
+ class COldNBustedPluginRenderer;
+
+ class COldNBustedPluginRenderer : public IOffscreenRenderer
+ {
+ public:
+ IQt3DSRenderContext &m_RenderContext;
+ long m_DLLHandle;
+ volatile QT3DSI32 mRefCount;
+ SOffscreenRendererEnvironment m_LastRenderedEnvironment;
+ CRegisteredString m_OffscreenRendererType;
+
+ PROC_GetDesiredTextureSize m_GetTextureSizeProc;
+ PROC_Render m_RenderProc;
+
+ COldNBustedPluginRenderer(IQt3DSRenderContext &inRenderContext, long inDLLHandle);
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext.GetAllocator())
+
+ SOffscreenRendererEnvironment GetDesiredEnvironment(QT3DSVec2 inPresScale) override;
+ virtual SOffscreenRenderFlags
+ NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, QT3DSVec2 inPresScale,
+ const SRenderInstanceId instanceId) override;
+ void Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext & /*inRenderContext*/,
+ QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer,
+ const SRenderInstanceId instanceId) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &/*inEnvironment*/,
+ NVRenderContext &/*inRenderContext*/,
+ QT3DSVec2 /*inPresentationScaleFactor*/,
+ SScene::RenderClearCommand /*inColorBufferNeedsClear*/,
+ QT3DSVec4 /*inclearColor*/,
+ const SRenderInstanceId /*instanceId*/) override {}
+ IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId instanceId) override
+ {
+ Q_UNUSED(instanceId);
+ return NULL;
+ }
+ bool Pick(const QT3DSVec2 & /*inMouseCoords*/, const QT3DSVec2 & /*inViewportDimensions*/,
+ const SRenderInstanceId instanceId) override
+ {
+ Q_UNUSED(instanceId);
+ return false;
+ }
+ void addCallback(IOffscreenRendererCallback *cb) override
+ {
+
+ }
+ // Used for RTTI purposes so we can safely static-cast an offscreen renderer to a
+ // CPluginRenderer
+ static const char *GetRendererName() { return "Plugin"; }
+ CRegisteredString GetOffscreenRendererType() override { return m_OffscreenRendererType; }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSOnscreenTextRenderer.cpp b/src/runtimerender/Qt3DSOnscreenTextRenderer.cpp
new file mode 100644
index 0000000..4b74c51
--- /dev/null
+++ b/src/runtimerender/Qt3DSOnscreenTextRenderer.cpp
@@ -0,0 +1,421 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#define QT3DS_RENDER_ONSCREEN_TEXT
+#ifdef QT3DS_RENDER_ONSCREEN_TEXT
+
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderTextureAtlas.h"
+
+#include "EASTL/string.h"
+#include "EASTL/hash_set.h"
+
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/StrConvertUTF.h"
+
+#include "render/Qt3DSRenderContext.h"
+
+#include <QtGui/qpainter.h>
+#include <QtGui/qimage.h>
+#include <QtGui/qrawfont.h>
+#include <QtCore/qfile.h>
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct STextureAtlasFontEntry
+{
+ STextureAtlasFontEntry()
+ : m_x(0)
+ , m_y(0)
+ , m_width(0)
+ , m_height(0)
+ , m_xOffset(0)
+ , m_yOffset(0)
+ , m_advance(0)
+ , m_s(0)
+ , m_t(0)
+ , m_s1(0)
+ , m_t1(0)
+ {
+ }
+
+ STextureAtlasFontEntry(float x, float y, float width, float height, float xoffset,
+ float yoffset, float advance, float s, float t, float s1, float t1)
+ : m_x(x)
+ , m_y(y)
+ , m_width(width)
+ , m_height(height)
+ , m_xOffset(xoffset)
+ , m_yOffset(yoffset)
+ , m_advance(advance)
+ , m_s(s)
+ , m_t(t)
+ , m_s1(s1)
+ , m_t1(t1)
+ {
+ }
+
+ QT3DSF32 m_x;
+ QT3DSF32 m_y;
+ QT3DSF32 m_width;
+ QT3DSF32 m_height;
+ QT3DSF32 m_xOffset;
+ QT3DSF32 m_yOffset;
+ QT3DSF32 m_advance;
+
+ QT3DSF32 m_s;
+ QT3DSF32 m_t;
+ QT3DSF32 m_s1;
+ QT3DSF32 m_t1;
+};
+
+typedef eastl::basic_string<char8_t, ForwardingAllocator> TStrType;
+typedef nvhash_map<wchar_t, STextureAtlasFontEntry> TTextureAtlasMap;
+
+struct STextAtlasFont
+{
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+ QT3DSU32 m_FontSize;
+ TTextureAtlasMap m_AtlasEntries; ///< our entries in the atlas
+
+ STextAtlasFont(NVFoundationBase &inFoundation, QT3DSU32 fontSize)
+ : m_Foundation(inFoundation)
+ , mRefCount(0)
+ , m_FontSize(fontSize)
+ , m_AtlasEntries(inFoundation.getAllocator(),
+ "Qt3DSOnscreenRenderer::STextAtlasFont::m_AtlasEntrys")
+ {
+ }
+
+ ~STextAtlasFont() { m_AtlasEntries.clear(); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ static STextAtlasFont &CreateTextureAtlasFont(NVFoundationBase &inFnd, QT3DSU32 fontSize)
+ {
+ return *QT3DS_NEW(inFnd.getAllocator(), STextAtlasFont)(inFnd, fontSize);
+ }
+};
+
+// This class is only for rendering 2D screen aligned text
+// it uses a predefined true type font and character set with various sizes
+struct Qt3DSOnscreenTextRenderer : public ITextRenderer
+{
+
+ static const QT3DSI32 TEXTURE_ATLAS_DIM =
+ 256; // if you change this you need to adjust STextTextureAtlas size as well
+
+private:
+ NVFoundationBase &m_Foundation;
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+ volatile QT3DSI32 mRefCount;
+ bool m_TextureAtlasInitialized; ///< true if atlas is setup
+ NVScopedRefCounted<ITextureAtlas> m_TextTextureAtlas;
+ NVScopedRefCounted<STextAtlasFont> m_TextFont;
+ QRawFont *m_font;
+public:
+ Qt3DSOnscreenTextRenderer(NVFoundationBase &inFoundation)
+ : m_Foundation(inFoundation)
+ , mRefCount(0)
+ , m_TextureAtlasInitialized(false)
+ , m_font(nullptr)
+ {
+ }
+
+ virtual ~Qt3DSOnscreenTextRenderer()
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ void AddSystemFontDirectory(const char8_t *) override {}
+
+ virtual void AddProjectFontDirectory(CRegisteredString)
+ {
+ // We always render using the default font with on-screen renderer,
+ // so no need to care about font directories
+ }
+
+ void AddProjectFontDirectory(const char8_t *inProjectDirectory) override
+ {
+ if (m_RenderContext)
+ AddProjectFontDirectory(
+ m_RenderContext->GetStringTable().RegisterStr(inProjectDirectory));
+ }
+
+ void loadFont()
+ {
+ // Ensure font. We can only render text of single size at the moment.
+ // Add a size map of fonts if it ever becomes necessary to render multiple font sizes.
+ if (!m_font)
+ m_font = new QRawFont(QStringLiteral(":res/Font/TitilliumWeb-Regular.ttf"), 20.0);
+
+ // setup texture atlas
+ m_TextTextureAtlas =
+ ITextureAtlas::CreateTextureAtlas(m_RenderContext->GetFoundation(), *m_RenderContext,
+ TEXTURE_ATLAS_DIM, TEXTURE_ATLAS_DIM);
+
+ // our list of predefined cached characters
+ QString cache = QStringLiteral(" !\"#$%&'()*+,-./0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+ "`abcdefghijklmnopqrstuvwxyz{|}~");
+
+ m_TextFont = STextAtlasFont::CreateTextureAtlasFont(m_Foundation, 20);
+ CreateTextureAtlasEntries(m_font, *m_TextFont, cache);
+ m_TextureAtlasInitialized = true;
+ }
+
+ void CreateTextureAtlasEntries(QRawFont *rawFont, STextAtlasFont &font, const QString &cache)
+ {
+ if (m_TextureAtlasInitialized || !m_TextTextureAtlas || !rawFont)
+ return;
+
+ STextureAtlasRect theAtlasRect;
+
+ QVector<quint32> glyphIndices = rawFont->glyphIndexesForString(cache);
+ QVector<QPointF> glyphAdvances = rawFont->advancesForGlyphIndexes(glyphIndices);
+
+ for (int i = 0; i < glyphIndices.size(); i++) {
+ quint32 index = glyphIndices[i];
+ QImage glyphImage;
+
+ // blank char is not contained in a true type font
+ if (cache.at(i) != QChar(' '))
+ glyphImage = rawFont->alphaMapForGlyph(index, QRawFont::PixelAntialiasing);
+
+ QRectF rect = rawFont->boundingRect(index);
+ NVConstDataRef<QT3DSU8> bufferData(static_cast<const QT3DSU8 *>(glyphImage.bits()),
+ glyphImage.byteCount());
+
+ theAtlasRect = m_TextTextureAtlas->AddAtlasEntry(
+ glyphImage.width(), glyphImage.height(),
+ glyphImage.bytesPerLine(), glyphImage.width(), bufferData);
+
+ if (theAtlasRect.m_Width != 0) {
+ font.m_AtlasEntries.insert(
+ eastl::make_pair(
+ cache.at(i).unicode(), STextureAtlasFontEntry(
+ (QT3DSF32)theAtlasRect.m_X, (QT3DSF32)theAtlasRect.m_Y,
+ (QT3DSF32)theAtlasRect.m_Width, (QT3DSF32)theAtlasRect.m_Height,
+ (QT3DSF32)rect.x(), (QT3DSF32)(0.0 - rect.height() - rect.y()),
+ glyphAdvances[i].x(),
+ theAtlasRect.m_NormX, theAtlasRect.m_NormY,
+ theAtlasRect.m_NormX + theAtlasRect.m_NormWidth,
+ theAtlasRect.m_NormY + theAtlasRect.m_NormHeight)));
+ }
+ }
+ }
+
+ void ClearProjectFontDirectories() override {}
+
+ ITextRenderer &GetTextRenderer(NVRenderContext &inRenderContext) override
+ {
+ m_RenderContext = inRenderContext;
+ return *this;
+ }
+
+ void PreloadFonts() override {}
+ void ReloadFonts() override {}
+
+ // unused
+ NVConstDataRef<SRendererFontEntry> GetProjectFontList() override
+ {
+ Q_ASSERT(false);
+ return NVConstDataRef<SRendererFontEntry>();
+ }
+
+ // unused
+ Option<CRegisteredString> GetFontNameForFont(CRegisteredString) override
+ {
+ Q_ASSERT(false);
+ return Empty();
+ }
+
+ // unused
+ Option<CRegisteredString> GetFontNameForFont(const char8_t *) override
+ {
+ Q_ASSERT(false);
+ return Empty();
+ }
+
+ // unused
+ STextDimensions MeasureText(const STextRenderInfo &, QT3DSF32, const char8_t *) override
+ {
+ Q_ASSERT(false);
+ return STextDimensions(0, 0);
+ }
+
+ // unused
+ STextTextureDetails RenderText(const STextRenderInfo &, NVRenderTexture2D &) override
+ {
+ QT3DS_ASSERT(false);
+ return STextTextureDetails();
+ }
+
+ // unused
+ STextTextureDetails RenderText(const STextRenderInfo &, NVRenderPathFontItem &,
+ NVRenderPathFontSpecification &) override
+ {
+ QT3DS_ASSERT(false);
+ return STextTextureDetails();
+ }
+
+ SRenderTextureAtlasDetails RenderText(const STextRenderInfo &inText) override
+ {
+ qt3ds::foundation::IStringTable &theStringTable(m_RenderContext->GetStringTable());
+
+ const wchar_t *wText = theStringTable.GetWideStr(inText.m_Text);
+ QT3DSU32 length = (QT3DSU32)wcslen(wText);
+
+ if (length) {
+ STextAtlasFont *pFont = m_TextFont;
+ const STextureAtlasFontEntry *pEntry;
+ QT3DSF32 x1, y1, x2, y2;
+ QT3DSF32 s, t, s1, t1;
+ QT3DSF32 advance = 0.0;
+ // allocate buffer for all the vertex data we need
+ // we construct triangles here
+ // which means character count x 6 vertices x 5 floats
+ QT3DSF32 *vertexData =
+ (QT3DSF32 *)QT3DS_ALLOC(m_Foundation.getAllocator(),
+ length * 6 * 5 * sizeof(QT3DSF32),
+ "Qt3DSOnscreenTextRenderer");
+ QT3DSF32 *bufPtr = vertexData;
+ if (vertexData) {
+ for (size_t i = 0; i < length; ++i) {
+ pEntry = &pFont->m_AtlasEntries.find(wText[i])->second;
+
+ if (pEntry) {
+ x1 = advance + pEntry->m_xOffset;
+ x2 = x1 + pEntry->m_width * inText.m_ScaleX;
+ y1 = pEntry->m_yOffset;
+ y2 = y1 + pEntry->m_height * inText.m_ScaleY;
+
+ s = pEntry->m_s;
+ s1 = pEntry->m_s1;
+ t = pEntry->m_t;
+ t1 = pEntry->m_t1;
+ // store vertex data
+ bufPtr[0] = x1;
+ bufPtr[1] = y1;
+ bufPtr[2] = 0.0;
+ bufPtr[3] = s;
+ bufPtr[4] = t;
+ bufPtr[5] = x2;
+ bufPtr[6] = y1;
+ bufPtr[7] = 0.0;
+ bufPtr[8] = s1;
+ bufPtr[9] = t;
+ bufPtr[10] = x2;
+ bufPtr[11] = y2;
+ bufPtr[12] = 0.0;
+ bufPtr[13] = s1;
+ bufPtr[14] = t1;
+
+ bufPtr[15] = x1;
+ bufPtr[16] = y1;
+ bufPtr[17] = 0.0;
+ bufPtr[18] = s;
+ bufPtr[19] = t;
+ bufPtr[20] = x2;
+ bufPtr[21] = y2;
+ bufPtr[22] = 0.0;
+ bufPtr[23] = s1;
+ bufPtr[24] = t1;
+ bufPtr[25] = x1;
+ bufPtr[26] = y2;
+ bufPtr[27] = 0.0;
+ bufPtr[28] = s;
+ bufPtr[29] = t1;
+
+ advance += pEntry->m_advance * inText.m_ScaleX;
+
+ bufPtr += 30;
+ }
+ }
+
+ m_TextTextureAtlas->RelaseEntries();
+
+ return SRenderTextureAtlasDetails(length * 6,
+ toU8DataRef(vertexData, length * 6 * 5));
+ }
+ }
+
+ return SRenderTextureAtlasDetails();
+ }
+
+ STextTextureAtlasEntryDetails RenderAtlasEntry(QT3DSU32 index,
+ NVRenderTexture2D &inTexture) override
+ {
+ if (m_TextTextureAtlas) {
+ TTextureAtlasEntryAndBuffer theEntry = m_TextTextureAtlas->GetAtlasEntryByIndex(index);
+ if (theEntry.first.m_Width) {
+ inTexture.SetTextureData(theEntry.second, 0, theEntry.first.m_Width,
+ theEntry.first.m_Height, NVRenderTextureFormats::Alpha8);
+ inTexture.SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ inTexture.SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ inTexture.SetTextureWrapS(qt3ds::render::NVRenderTextureCoordOp::ClampToEdge);
+ inTexture.SetTextureWrapT(qt3ds::render::NVRenderTextureCoordOp::ClampToEdge);
+ STextureDetails theTextureDetails = inTexture.GetTextureDetails();
+ return STextTextureAtlasEntryDetails(theTextureDetails.m_Width,
+ theTextureDetails.m_Height, theEntry.first.m_X,
+ theEntry.first.m_Y);
+ }
+ }
+
+ return STextTextureAtlasEntryDetails();
+ }
+ QT3DSI32 CreateTextureAtlas() override
+ {
+ loadFont();
+
+ QT3DSI32 count = 0;
+ if (m_TextTextureAtlas)
+ count = m_TextTextureAtlas->GetAtlasEntryCount();
+
+ return count;
+ }
+
+ void BeginFrame() override {}
+ void EndFrame() override {}
+ void BeginPreloadFonts(IThreadPool &, IPerfTimer &) override {}
+ void EndPreloadFonts() override {}
+};
+}
+
+ITextRendererCore &ITextRendererCore::CreateOnscreenTextRenderer(NVFoundationBase &inFnd)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), Qt3DSOnscreenTextRenderer)(inFnd);
+}
+
+#endif // QT3DS_RENDER_ONSCREEN_TEXT
diff --git a/src/runtimerender/Qt3DSQtTextRenderer.cpp b/src/runtimerender/Qt3DSQtTextRenderer.cpp
new file mode 100644
index 0000000..029ccea
--- /dev/null
+++ b/src/runtimerender/Qt3DSQtTextRenderer.cpp
@@ -0,0 +1,655 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderText.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/FileTools.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSContainers.h"
+#include "Qt3DSRenderThreadPool.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "EASTL/set.h"
+#include "EASTL/list.h"
+
+#include <QPainter>
+#include <QImage>
+#include <QFontDatabase>
+#include <QDir>
+#include <QDebug>
+#include <QHash>
+#include <QGuiApplication>
+#include <QtMath>
+#include <QRawFont>
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct Qt3DSQtTextRenderer : public ITextRenderer
+{
+ struct FontInfo
+ {
+ QString fontFileName;
+ QString fontName;
+ QString fontFamily;
+ int fontId;
+ QFont font;
+
+ FontInfo() :
+ fontId(-1)
+ {}
+
+ FontInfo(const QString &fileName, const QString &name, const QString &family, int id) :
+ fontFileName(fileName)
+ , fontName(name)
+ , fontFamily(family)
+ , fontId(id)
+ {
+ font.setFamily(fontFamily);
+ }
+
+ FontInfo(const FontInfo &other) :
+ fontFileName(other.fontFileName)
+ , fontName(other.fontName)
+ , fontFamily(other.fontFamily)
+ , fontId(other.fontId)
+ , font(other.font)
+ {}
+
+ FontInfo &operator=(const FontInfo &other)
+ {
+ fontFileName = other.fontFileName;
+ fontName = other.fontName;
+ fontFamily = other.fontFamily;
+ fontId = other.fontId;
+ font = other.font;
+
+ return *this;
+ }
+ };
+
+ typedef eastl::string TStrType;
+ typedef eastl::set<TStrType> TStringSet;
+ typedef QHash<QString, FontInfo> TFontInfoHash;
+
+ NVFoundationBase &m_foundation;
+ NVScopedRefCounted<IStringTable> m_stringTable;
+ NVScopedRefCounted<NVRenderContext> m_renderContext;
+ NVScopedRefCounted<IPerfTimer> m_perfTimer;
+ volatile QT3DSI32 mRefCount;
+ nvvector<SRendererFontEntry> m_installedFonts;
+
+ Sync m_PreloadSync;
+
+ TStringSet m_systemFontDirs;
+ TStringSet m_projectFontDirs;
+ TFontInfoHash m_projectFontInfos;
+ TFontInfoHash m_systemFontInfos;
+ TStrType m_workspace;
+
+ bool m_systemFontsInitialized;
+ bool m_projectFontsInitialized;
+ bool m_PreloadingFonts;
+
+ QStringList m_nameFilters;
+ qreal m_pixelRatio;
+
+ Qt3DSQtTextRenderer(NVFoundationBase &inFoundation, IStringTable &inStrTable)
+ : m_foundation(inFoundation)
+ , m_stringTable(inStrTable)
+ , mRefCount(0)
+ , m_installedFonts(inFoundation.getAllocator(), "Qt3DSQtTextRenderer::m_installedFonts")
+ , m_PreloadSync(inFoundation.getAllocator())
+ , m_systemFontsInitialized(false)
+ , m_projectFontsInitialized(false)
+ , m_PreloadingFonts(false)
+ , m_pixelRatio(1.0)
+ {
+ const QWindowList list = QGuiApplication::topLevelWindows();
+ if (list.size() > 0)
+ m_pixelRatio = list[0]->devicePixelRatio();
+
+ m_nameFilters << QStringLiteral("*.ttf");
+ m_nameFilters << QStringLiteral("*.otf");
+ }
+ virtual ~Qt3DSQtTextRenderer()
+ {
+ QFontDatabase::removeAllApplicationFonts();
+ }
+
+ QString stringToQString(const CRegisteredString &str)
+ {
+ return QString::fromUtf8(str.c_str());
+ }
+
+ QString stringToQString(const eastl::string &str)
+ {
+ return QString::fromUtf8(str.c_str());
+ }
+
+ QString stringToQString(const char8_t *str)
+ {
+ return QString::fromUtf8(str);
+ }
+
+ CRegisteredString QStringToRegisteredString(const QString &str)
+ {
+ return m_stringTable->RegisterStr(str.toUtf8().constData());
+ }
+
+ void unregisterProjectFonts()
+ {
+ for (FontInfo &fi : m_projectFontInfos.values())
+ QFontDatabase::removeApplicationFont(fi.fontId);
+ m_projectFontsInitialized = false;
+ m_installedFonts.clear();
+ m_projectFontInfos.clear();
+ }
+
+ QString getFileStem(const QString &fileName)
+ {
+ QString retVal;
+ int dotPos = fileName.lastIndexOf(QChar('.'));
+ if (dotPos < 0)
+ return retVal;
+ int slashPos = fileName.lastIndexOf(QChar('/'));
+ retVal = fileName.mid(slashPos + 1);
+ retVal.chop(fileName.length() - dotPos);
+ return retVal;
+ }
+
+ void registerFonts(TStringSet dirSet, TFontInfoHash *fontInfos = nullptr)
+ {
+ for (TStringSet::const_iterator theIter = dirSet.begin(),
+ theEnd = dirSet.end();
+ theIter != theEnd; ++theIter) {
+ QString localDir = CFileTools::NormalizePathForQtUsage(stringToQString(*theIter));
+ QDir dir(localDir);
+ if (!dir.exists()) {
+ qWarning("Attempted to register invalid font directory: %s",
+ qPrintable(localDir));
+ continue;
+ }
+ QStringList entryList = dir.entryList(m_nameFilters);
+ for (QString entry : entryList) {
+ entry = dir.absoluteFilePath(entry);
+ QFile file(entry);
+ if (file.open(QIODevice::ReadOnly)) {
+ QByteArray rawData = file.readAll();
+ int fontId = QFontDatabase::addApplicationFontFromData(rawData);
+ if (fontId < 0) {
+ qCWarning(WARNING, "Failed to register font: %s",
+ entry.toStdString().c_str());
+ } else if (fontInfos) {
+ QString fontName = getFileStem(entry);
+ QString fontFamily;
+ QStringList families = QFontDatabase::applicationFontFamilies(fontId);
+ if (families.size() > 0)
+ fontFamily = families.at(0);
+ FontInfo fi(entry, fontName, fontFamily, fontId);
+ // Detect font style and weight using a dummy QRawFont
+ QRawFont rawFont(rawData, 16);
+ if (rawFont.isValid()) {
+ if (rawFont.style() != QFont::StyleOblique) {
+ fi.font.setStyle(rawFont.style());
+ fi.font.setWeight(rawFont.weight());
+ }
+ } else {
+ qCWarning(WARNING, "Failed to determine font style: %s",
+ entry.toStdString().c_str());
+ }
+ fontInfos->insert(fontName, fi);
+ }
+ } else {
+ qCWarning(WARNING, "Failed to load font: %s",
+ entry.toStdString().c_str());
+ }
+ }
+ }
+ }
+
+ void projectCleanup()
+ {
+ m_projectFontsInitialized = false;
+ unregisterProjectFonts();
+ m_projectFontDirs.clear();
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_foundation.getAllocator())
+
+ eastl::pair<TStrType, bool> AddFontDirectory(const TStrType &inDirectory, TStringSet &inDirSet)
+ {
+ if (inDirectory.empty()) {
+ m_workspace.assign("./");
+ } else {
+ m_workspace.clear();
+ for (const char8_t *item = inDirectory.c_str(); item && *item; ++item) {
+ if (*item == '\\')
+ m_workspace.append(1, '/');
+ else
+ m_workspace.append(1, static_cast<char8_t>(*item));
+ }
+ if (m_workspace.back() != '/')
+ m_workspace.append(1, '/');
+ }
+
+ return eastl::make_pair(m_workspace, inDirSet.insert(m_workspace).second);
+ }
+
+ // You can have several standard font directories and these will be persistent
+ void AddSystemFontDirectory(const char8_t *inDirectory) override
+ {
+ AddFontDirectory(inDirectory, m_systemFontDirs);
+ }
+
+ void AddProjectFontDirectory(const char8_t *inProjectDirectory) override
+ {
+ eastl::pair<TStrType, bool> theAddResult =
+ AddFontDirectory(inProjectDirectory, m_projectFontDirs);
+ if (theAddResult.second && m_projectFontsInitialized)
+ ReloadFonts();
+ }
+
+ void ReloadFonts() override
+ {
+ unregisterProjectFonts();
+ PreloadFonts();
+ }
+
+ void PreloadFonts() override
+ {
+ if (!m_systemFontsInitialized) {
+ m_systemFontsInitialized = true;
+ registerFonts(m_systemFontDirs, &m_systemFontInfos);
+ }
+
+ if (!m_projectFontsInitialized) {
+ m_projectFontsInitialized = true;
+ registerFonts(m_projectFontDirs, &m_projectFontInfos);
+ }
+ }
+
+ void ClearProjectFontDirectories() override
+ {
+ projectCleanup();
+ }
+
+ static void PreloadThreadCallback(void *inData)
+ {
+ Qt3DSQtTextRenderer *theRenderer(reinterpret_cast<Qt3DSQtTextRenderer *>(inData));
+ theRenderer->PreloadFonts();
+ theRenderer->m_PreloadSync.set();
+ }
+
+ void BeginPreloadFonts(IThreadPool &inThreadPool, IPerfTimer &inTimer) override
+ {
+ m_PreloadingFonts = true;
+
+ m_PreloadSync.reset();
+ m_perfTimer = inTimer;
+
+ inThreadPool.AddTask(this, PreloadThreadCallback, NULL);
+ }
+
+ void EndPreloadFonts() override
+ {
+ if (m_PreloadingFonts) {
+ {
+ SStackPerfTimer __perfTimer(*m_perfTimer, "QtText: Wait till font preloading completed");
+ m_PreloadSync.wait();
+ }
+ }
+ m_PreloadingFonts = false;
+ }
+
+ // Get the list of project fonts. These are the only fonts that can be displayed.
+ NVConstDataRef<SRendererFontEntry> GetProjectFontList() override
+ {
+ PreloadFonts();
+ if (m_installedFonts.empty()) {
+ m_installedFonts.reserve(m_projectFontInfos.size());
+ for (FontInfo &fi : m_projectFontInfos.values()) {
+ m_installedFonts.push_back(SRendererFontEntry(
+ fi.fontName,
+ fi.fontFileName));
+ }
+
+ }
+ return m_installedFonts;
+ }
+
+ Option<CRegisteredString> GetFontNameForFont(CRegisteredString inFontname) override
+ {
+ // This function is there to support legacy font names.
+
+ QString inStr = stringToQString(inFontname);
+ if (m_projectFontInfos.keys().contains(inStr))
+ return inFontname;
+
+ // Fall back for family name detection if not found by font name
+ for (FontInfo &fi : m_projectFontInfos.values()) {
+ if (inStr == fi.fontFamily)
+ return QStringToRegisteredString(fi.fontName);
+ }
+
+ return Empty();
+ }
+
+ Option<CRegisteredString> GetFontNameForFont(const char8_t *inFontname) override
+ {
+ return GetFontNameForFont(m_stringTable->RegisterStr(inFontname));
+ }
+
+ ITextRenderer &GetTextRenderer(NVRenderContext &inRenderContext) override
+ {
+ m_renderContext = inRenderContext;
+ return *this;
+ }
+
+ FontInfo &fontInfoForName(const CRegisteredString &fontName)
+ {
+ PreloadFonts();
+ QString qtFontName = stringToQString(fontName);
+ if (m_projectFontInfos.contains(qtFontName))
+ return m_projectFontInfos[qtFontName];
+
+ if (m_systemFontInfos.contains(qtFontName))
+ return m_systemFontInfos[qtFontName];
+
+ // Unknown font, create a system font for it
+ FontInfo fi("", qtFontName, qtFontName, -1);
+ m_systemFontInfos.insert(qtFontName, fi);
+
+ return m_systemFontInfos[qtFontName];
+ }
+
+ void updateFontInfo(FontInfo &fi, const STextRenderInfo &inText,
+ QT3DSF32 inTextScaleFactor = 1.0f)
+ {
+ qreal pixelSize = inText.m_FontSize;
+ fi.font.setPixelSize(pixelSize * inTextScaleFactor);
+ fi.font.setLetterSpacing(QFont::AbsoluteSpacing, qreal(inText.m_Tracking));
+ }
+
+ QStringList splitText(const char8_t *theText)
+ {
+ // Split the text into lines
+ int lines = 1;
+ int lineLen = 0;
+ QStringList lineList;
+ const char8_t *lineStartItem = nullptr;
+ for (const char8_t *item = theText; item && *item; ++item) {
+ if (!lineLen)
+ lineStartItem = item;
+ ++lineLen;
+ if (*item == '\n') {
+ int chopAmount = 1;
+ if (lineLen > 1 && *(item - 1) == '\r')
+ ++chopAmount;
+
+ ++lines;
+ lineList.append(QString::fromUtf8(lineStartItem, lineLen - chopAmount));
+ lineLen = 0;
+ }
+ }
+ if (lineStartItem)
+ lineList.append(QString::fromUtf8(lineStartItem, lineLen));
+
+ return lineList;
+ }
+
+ QRectF textBoundingBox(const STextRenderInfo &inText,
+ const QFontMetricsF &fm, QStringList &lineList,
+ QVector<qreal> &lineWidths, const char8_t *inTextOverride = nullptr)
+ {
+ const char8_t *theText = inTextOverride ? inTextOverride : inText.m_Text.c_str();
+ lineList = splitText(theText);
+
+ QRectF boundingBox;
+ boundingBox.setHeight(lineList.size() * fm.height() + qCeil(qreal(lineList.size() - 1) * qreal(inText.m_Leading)));
+
+ lineWidths.resize(lineList.size());
+
+ for (int i = 0; i < lineList.size(); ++i) {
+ // For italicized fonts the bounding box right is the correct method
+ // to measure since the left offset may extend, but for
+ // non-italicized fonts we need the width method to meausure
+ // otherwise the resultant text will be clipped.
+ QString line = lineList.at(i);
+ qreal width = fm.width(line);
+ qreal right = fm.boundingRect(line).right();
+ // For hdpi displays, fontmetrics doesn't always calculate enough space for fonts, so
+ // we add the pixel ratio to all widths to avoid clipping
+ qreal lineWidth = qMax(width, right) + m_pixelRatio;
+ lineWidths[i] = lineWidth;
+ if (boundingBox.width() < lineWidth)
+ boundingBox.setWidth(lineWidth);
+ }
+
+ // We don't want extra letter spacing on the last glyph, so let's remove it
+ boundingBox.setRight(qMax(boundingBox.left(), boundingBox.right() - qFloor(inText.m_Tracking)));
+
+ return boundingBox;
+ }
+
+ STextDimensions MeasureText(const STextRenderInfo &inText, QT3DSF32 inTextScaleFactor,
+ const char8_t *inTextOverride) override
+ {
+ FontInfo &fi = fontInfoForName(inText.m_Font);
+ updateFontInfo(fi, inText, inTextScaleFactor);
+ QFontMetricsF fm(fi.font);
+ QStringList dummyList;
+ QVector<qreal> dummyWidth;
+ QRectF boundingBox = textBoundingBox(inText, fm, dummyList, dummyWidth, inTextOverride);
+ return STextDimensions(boundingBox.width(), boundingBox.height());
+ }
+
+ int alignToQtAlign(TextVerticalAlignment::Enum va)
+ {
+ int qtAlign(0);
+ switch (va) {
+ case TextVerticalAlignment::Top:
+ qtAlign = Qt::AlignTop;
+ break;
+ case TextVerticalAlignment::Bottom:
+ qtAlign = Qt::AlignBottom;
+ break;
+ default:
+ qtAlign = Qt::AlignVCenter;
+ }
+
+ return qtAlign;
+ }
+
+ STextTextureDetails RenderText(const STextRenderInfo &inSrcText,
+ NVRenderTexture2D &inTexture) override
+ {
+ FontInfo &fi = fontInfoForName(inSrcText.m_Font);
+ updateFontInfo(fi, inSrcText);
+ QFontMetricsF fm(fi.font);
+ int horizontalAlignmentFlag = Qt::AlignLeft;
+
+ int shadowRgb = int(2.55f * (100 - int(inSrcText.m_DropShadowStrength)));
+ QStringList lineList;
+ QVector<qreal> lineWidths;
+ QRectF boundingBox;
+ const bool dynamicTextArea = inSrcText.m_BoundingBox.isZero();
+
+ if (dynamicTextArea) {
+ boundingBox = textBoundingBox(inSrcText, fm, lineList, lineWidths);
+ } else {
+ lineList << inSrcText.m_Text.c_str();
+ lineWidths << inSrcText.m_BoundingBox.x;
+ boundingBox = QRectF(0, 0, inSrcText.m_BoundingBox.x, inSrcText.m_BoundingBox.y);
+ }
+
+ if (boundingBox.width() <= 0 || boundingBox.height() <= 0) {
+ return ITextRenderer::UploadData(toU8DataRef((char *)nullptr, 0), inTexture, 4, 4,
+ 0, 0,
+ NVRenderTextureFormats::RGBA8, true);
+ }
+
+ int finalWidth = NextMultipleOf4(boundingBox.width());
+ int finalHeight = NextMultipleOf4(boundingBox.height());
+
+ QImage image(finalWidth, finalHeight, QImage::Format_ARGB32);
+ image.fill(0);
+ QPainter painter(&image);
+ painter.setPen(Qt::white);
+ painter.setFont(fi.font);
+
+ // Translate painter to remove the extra spacing of the last letter
+ qreal tracking = 0.0;
+ switch (inSrcText.m_HorizontalAlignment) {
+ case TextHorizontalAlignment::Center:
+ horizontalAlignmentFlag = Qt::AlignHCenter;
+ tracking += qreal(inSrcText.m_Tracking / 2.0f);
+ break;
+ case TextHorizontalAlignment::Right:
+ horizontalAlignmentFlag = Qt::AlignRight;
+ tracking += qreal(inSrcText.m_Tracking);
+ break;
+ default:
+ break; // Do nothing
+ }
+
+ int wordWrapFlags = 0;
+ if (dynamicTextArea) {
+ wordWrapFlags = Qt::TextDontClip;
+ } else {
+ switch (inSrcText.m_WordWrap) {
+ case TextWordWrap::WrapWord:
+ wordWrapFlags = Qt::TextWordWrap | Qt::TextDontClip;
+ break;
+ case TextWordWrap::WrapAnywhere:
+ wordWrapFlags = Qt::TextWrapAnywhere | Qt::TextDontClip;
+ break;
+ case TextWordWrap::Clip:
+ default:
+ break;
+ }
+ }
+
+ int lineHeight = dynamicTextArea ? fm.height() : finalHeight;
+ QT3DSF32 nextHeight = 0;
+ for (int i = 0; i < lineList.size(); ++i) {
+ const QString &line = lineList.at(i);
+ qreal xTranslation = tracking;
+ switch (inSrcText.m_HorizontalAlignment) {
+ case TextHorizontalAlignment::Center:
+ xTranslation += qreal(boundingBox.width() - lineWidths.at(i)) / 2.0;
+ break;
+ case TextHorizontalAlignment::Right:
+ xTranslation += qreal(boundingBox.width() - lineWidths.at(i));
+ break;
+ default:
+ break; // Do nothing
+ }
+ QRectF bound(xTranslation, qreal(nextHeight), lineWidths.at(i), lineHeight);
+ QRectF actualBound;
+ if (inSrcText.m_DropShadow) {
+ qreal shadowOffsetX = qreal(inSrcText.m_FontSize * inSrcText.m_DropShadowOffsetX)
+ / 1000.;
+ qreal shadowOffsetY = qreal(inSrcText.m_FontSize * inSrcText.m_DropShadowOffsetY)
+ / 1000.;
+ QRectF boundShadow(xTranslation + shadowOffsetX, nextHeight + shadowOffsetY,
+ qreal(lineWidths.at(i)), lineHeight);
+ // shadow is a darker shade of the given font color
+ painter.setPen(QColor(shadowRgb, shadowRgb, shadowRgb));
+ painter.drawText(boundShadow,
+ alignToQtAlign(inSrcText.m_VerticalAlignment) | wordWrapFlags
+ | horizontalAlignmentFlag, line, &actualBound);
+ painter.setPen(Qt::white); // coloring is done in the shader
+ }
+ painter.drawText(bound,
+ alignToQtAlign(inSrcText.m_VerticalAlignment) | wordWrapFlags
+ | horizontalAlignmentFlag, line, &actualBound);
+
+ nextHeight += QT3DSF32(lineHeight) + inSrcText.m_Leading;
+ }
+
+ return ITextRenderer::UploadData(toU8DataRef(image.bits(), image.byteCount()), inTexture,
+ image.width(), image.height(),
+ image.width(), image.height(),
+ NVRenderTextureFormats::RGBA8, true);
+ }
+
+ STextTextureDetails RenderText(const STextRenderInfo &inText,
+ NVRenderPathFontItem &inPathFontItem,
+ NVRenderPathFontSpecification &inFontPathSpec) override
+ {
+ Q_UNUSED(inText);
+ Q_UNUSED(inPathFontItem);
+ Q_UNUSED(inFontPathSpec);
+ QT3DS_ASSERT(m_renderContext->IsPathRenderingSupported());
+
+ // We do not support HW accelerated fonts (yet?)
+ QT3DS_ASSERT(false);
+
+ return STextTextureDetails();
+ }
+
+ void BeginFrame() override
+ {
+ // Nothing to do
+ }
+
+ void EndFrame() override
+ {
+ // Nothing to do
+ }
+
+ // unused for text rendering via texture atlas
+ STextTextureAtlasEntryDetails RenderAtlasEntry(QT3DSU32, NVRenderTexture2D &) override
+ {
+ return STextTextureAtlasEntryDetails();
+ }
+ QT3DSI32 CreateTextureAtlas() override
+ {
+ return 0;
+ }
+ SRenderTextureAtlasDetails RenderText(const STextRenderInfo &) override
+ {
+ return SRenderTextureAtlasDetails();
+ }
+};
+}
+
+ITextRendererCore &ITextRendererCore::CreateQtTextRenderer(NVFoundationBase &inFnd,
+ IStringTable &inStrTable)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), Qt3DSQtTextRenderer)(inFnd, inStrTable);
+}
diff --git a/src/runtimerender/Qt3DSRender.h b/src/runtimerender/Qt3DSRender.h
new file mode 100644
index 0000000..e07dc6e
--- /dev/null
+++ b/src/runtimerender/Qt3DSRender.h
@@ -0,0 +1,257 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_H
+#define QT3DS_RENDER_H
+
+namespace qt3ds {
+class NVAllocatorCallback;
+class NVFoundationBase;
+namespace foundation {
+ class CRegisteredString;
+ class IStringTable;
+ class CStrTableOrDataRef;
+ struct SStrRemapMap;
+ struct SWriteBuffer;
+ struct SDataReader;
+ struct SPtrOffsetMap;
+ class IPerfTimer;
+ class Qt3DSString;
+ class Qt3DSStringUtils;
+}
+namespace intrinsics {
+}
+namespace render {
+ class NVRenderTexture2D;
+ class NVRenderTexture2DArray;
+ class NVRenderTextureCube;
+ class NVRenderImage2D;
+ class NVRenderFrameBuffer;
+ class NVRenderRenderBuffer;
+ class NVRenderVertexBuffer;
+ class NVRenderIndexBuffer;
+ class NVRenderDrawIndirectBuffer;
+ class NVRenderInputAssembler;
+ class NVRenderAttribLayout;
+ class NVRenderDepthStencilState;
+ class NVRenderContext;
+ class NVRenderConstantBuffer;
+ class NVRenderShaderProgram;
+ class NVRenderShaderConstantBase;
+ struct NVRenderDrawMode;
+ struct NVRenderWinding;
+ struct NVRenderSrcBlendFunc;
+ struct NVRenderBlendEquation;
+ struct NVRenderState;
+ struct NVRenderTextureCoordOp;
+ struct NVRenderTextureMagnifyingOp;
+ struct NVRenderDstBlendFunc;
+ struct NVRenderContextValues;
+ struct NVRenderClearValues;
+ struct NVRenderRect;
+ struct NVRenderRectF;
+ struct NVRenderRenderBufferFormats;
+ struct NVRenderTextureFormats;
+ struct NVRenderTextureSwizzleMode;
+ struct NVRenderFrameBufferAttachments;
+ struct NVRenderRect;
+ struct NVRenderTextureCubeFaces;
+ struct STextureDetails;
+ struct NVRenderShaderDataTypes;
+ class NVRenderTextureOrRenderBuffer;
+ struct NVRenderTextureMinifyingOp;
+ struct NVReadFaces;
+ struct NVRenderVertexBufferEntry;
+ struct NVRenderPtrPtrMap;
+ class NVRenderComputeShader;
+ class NVRenderAttribLayout;
+ struct NVRenderBufferAccessTypeValues;
+ struct NVRenderImageAccessType;
+ struct NVRenderBufferBindValues;
+ struct DrawArraysIndirectCommand;
+ struct NVRenderShaderTypeValue;
+ class NVRenderPathRender;
+ class NVRenderPathSpecification;
+ class NVRenderPathFontSpecification;
+ class NVRenderPathFontItem;
+ struct NVRenderTextureTypeValue;
+ class NVRenderProgramPipeline;
+}
+class NVPlane;
+}
+
+namespace eastl {
+}
+
+namespace qt3ds {
+
+namespace render {
+ using namespace qt3ds;
+ using namespace qt3ds::foundation;
+ using namespace qt3ds::intrinsics;
+ using qt3ds::render::NVRenderTexture2D;
+ using qt3ds::render::NVRenderTexture2DArray;
+ using qt3ds::render::NVRenderTextureCube;
+ using qt3ds::render::NVRenderImage2D;
+ using qt3ds::render::NVRenderFrameBuffer;
+ using qt3ds::render::NVRenderRenderBuffer;
+ using qt3ds::render::NVRenderVertexBuffer;
+ using qt3ds::render::NVRenderIndexBuffer;
+ using qt3ds::render::NVRenderDrawIndirectBuffer;
+ using qt3ds::render::NVRenderInputAssembler;
+ using qt3ds::render::NVRenderAttribLayout;
+ using qt3ds::render::NVRenderDepthStencilState;
+ using qt3ds::render::NVRenderContext;
+ using qt3ds::render::NVRenderConstantBuffer;
+ using qt3ds::render::NVRenderShaderProgram;
+ using qt3ds::render::NVRenderShaderConstantBase;
+ using qt3ds::render::NVRenderDrawMode;
+ using qt3ds::render::NVRenderWinding;
+ using qt3ds::foundation::CRegisteredString;
+ using qt3ds::foundation::IStringTable;
+ using qt3ds::render::NVRenderSrcBlendFunc;
+ using qt3ds::render::NVRenderBlendEquation;
+ using qt3ds::render::NVRenderState;
+ using qt3ds::foundation::IStringTable;
+ using qt3ds::foundation::CRegisteredString;
+ using qt3ds::render::NVRenderTextureCoordOp;
+ using qt3ds::render::NVRenderDstBlendFunc;
+ using qt3ds::render::NVRenderRect;
+ using qt3ds::render::NVRenderRectF;
+ using qt3ds::render::NVRenderRenderBufferFormats;
+ using qt3ds::render::NVRenderTextureFormats;
+ using qt3ds::render::NVRenderTextureSwizzleMode;
+ using qt3ds::render::NVRenderFrameBufferAttachments;
+ using qt3ds::render::NVRenderRect;
+ using qt3ds::render::NVRenderContextValues;
+ using qt3ds::render::NVRenderClearValues;
+ using qt3ds::render::STextureDetails;
+ using qt3ds::render::NVRenderShaderDataTypes;
+ using qt3ds::render::NVRenderTextureMagnifyingOp;
+ using qt3ds::render::NVRenderTextureOrRenderBuffer;
+ using qt3ds::render::NVRenderTextureMinifyingOp;
+ using qt3ds::render::NVReadFaces;
+ using qt3ds::render::NVRenderTextureCubeFaces;
+ using qt3ds::foundation::SStrRemapMap;
+ using qt3ds::foundation::SWriteBuffer;
+ using qt3ds::foundation::SDataReader;
+ using qt3ds::foundation::Qt3DSString;
+ using qt3ds::foundation::Qt3DSStringUtils;
+ using qt3ds::render::NVRenderPtrPtrMap;
+ using qt3ds::foundation::CStrTableOrDataRef;
+ using qt3ds::foundation::SPtrOffsetMap;
+ using qt3ds::foundation::IPerfTimer;
+ using qt3ds::render::NVRenderVertexBufferEntry;
+ using qt3ds::render::NVRenderComputeShader;
+ using qt3ds::render::NVRenderAttribLayout;
+ using qt3ds::render::NVRenderBufferAccessTypeValues;
+ using qt3ds::render::NVRenderImageAccessType;
+ using qt3ds::render::NVRenderBufferBindValues;
+ using qt3ds::render::DrawArraysIndirectCommand;
+ using qt3ds::render::NVRenderShaderTypeValue;
+ using qt3ds::render::NVRenderPathRender;
+ using qt3ds::render::NVRenderPathSpecification;
+ using qt3ds::render::NVRenderPathFontSpecification;
+ using qt3ds::render::NVRenderPathFontItem;
+ using qt3ds::render::NVRenderTextureTypeValue;
+ using qt3ds::render::NVRenderProgramPipeline;
+
+ class IQt3DSRenderContextCore;
+ class IQt3DSRenderContext;
+ class IQt3DSRenderer;
+ class IBufferManager;
+ struct SRenderMesh;
+ class IRenderableObject;
+ class IQt3DSRenderer;
+ class IBufferManager;
+ class IResourceManager;
+ class IOffscreenRenderManager;
+ struct SNode;
+ struct SGraphObject;
+ class ITextRenderer;
+ class ITextRendererCore;
+ class IInputStreamFactory;
+ class IRefCountedInputStream;
+ class IEffectSystem;
+ class IEffectSystemCore;
+ class IShaderCache;
+ class IQt3DSRenderNodeFilter;
+ class IRenderWidget;
+ class IRenderWidgetContext;
+ struct SShaderVertexCodeGenerator;
+ struct SShaderFragmentCodeGenerator;
+ class IThreadPool;
+ struct SRenderMesh;
+ struct SLoadedTexture;
+ class IImageBatchLoader;
+ class ITextTextureCache;
+ class ITextTextureAtlas;
+ class IRenderPluginInstance;
+ class IRenderPluginClass;
+ class IRenderPluginManager;
+ class IRenderPluginManagerCore;
+ struct SRenderPlugin;
+ class IDynamicObjectSystemCore;
+ class IDynamicObjectSystem;
+ class IDynamicObjectClass;
+ struct SRenderSubset;
+ struct SModel;
+ namespace dynamic {
+ struct SPropertyDefinition;
+ }
+ struct SLight;
+ struct SCamera;
+ struct SCustomMaterial;
+ class ICustomMaterialSystem;
+ class ICustomMaterialSystemCore;
+ struct SLayer;
+ struct SReferencedMaterial;
+ struct SPGGraphObject;
+ class IPixelGraphicsRenderer;
+ class IBufferLoader;
+ struct SEffect;
+ class IRenderList;
+ class IRenderTask;
+ class CResourceTexture2D;
+ class IPathManagerCore;
+ class IPathManager;
+ struct SPath;
+ struct SPathSubPath;
+ class IShaderProgramGenerator;
+ class IShaderStageGenerator;
+ class IDefaultMaterialShaderGenerator;
+ class ICustomMaterialShaderGenerator;
+ struct SRenderableImage;
+ class Qt3DSShadowMap;
+ struct SLightmaps;
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderClippingFrustum.cpp b/src/runtimerender/Qt3DSRenderClippingFrustum.cpp
new file mode 100644
index 0000000..8637556
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderClippingFrustum.cpp
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderClippingFrustum.h"
+
+using namespace qt3ds::render;
+
+SClippingFrustum::SClippingFrustum(const QT3DSMat44 &modelviewprojection, SClipPlane nearPlane)
+{
+ SClipPlane *_cullingPlanes = mPlanes;
+ const QT3DSMat44 &modelViewProjectionMat(modelviewprojection);
+ const QT3DSF32 *modelviewProjection = modelViewProjectionMat.front();
+
+// update planes (http://read.pudn.com/downloads128/doc/542641/Frustum.pdf)
+// Google for Gribb plane extraction if that link doesn't work.
+// http://www.google.com/search?q=ravensoft+plane+extraction
+#define M(_x, _y) modelviewProjection[(4 * (_y)) + (_x)]
+ // left plane
+ _cullingPlanes[0].normal.x = M(3, 0) + M(0, 0);
+ _cullingPlanes[0].normal.y = M(3, 1) + M(0, 1);
+ _cullingPlanes[0].normal.z = M(3, 2) + M(0, 2);
+ _cullingPlanes[0].d = M(3, 3) + M(0, 3);
+ _cullingPlanes[0].d /= _cullingPlanes[0].normal.normalize();
+
+ // right plane
+ _cullingPlanes[1].normal.x = M(3, 0) - M(0, 0);
+ _cullingPlanes[1].normal.y = M(3, 1) - M(0, 1);
+ _cullingPlanes[1].normal.z = M(3, 2) - M(0, 2);
+ _cullingPlanes[1].d = M(3, 3) - M(0, 3);
+ _cullingPlanes[1].d /= _cullingPlanes[1].normal.normalize();
+
+ // far plane
+ _cullingPlanes[2].normal.x = M(3, 0) - M(2, 0);
+ _cullingPlanes[2].normal.y = M(3, 1) - M(2, 1);
+ _cullingPlanes[2].normal.z = M(3, 2) - M(2, 2);
+ _cullingPlanes[2].d = M(3, 3) - M(2, 3);
+ _cullingPlanes[2].d /= _cullingPlanes[2].normal.normalize();
+
+ // bottom plane
+ _cullingPlanes[3].normal.x = M(3, 0) + M(1, 0);
+ _cullingPlanes[3].normal.y = M(3, 1) + M(1, 1);
+ _cullingPlanes[3].normal.z = M(3, 2) + M(1, 2);
+ _cullingPlanes[3].d = M(3, 3) + M(1, 3);
+ _cullingPlanes[3].d /= _cullingPlanes[3].normal.normalize();
+
+ // top plane
+ _cullingPlanes[4].normal.x = M(3, 0) - M(1, 0);
+ _cullingPlanes[4].normal.y = M(3, 1) - M(1, 1);
+ _cullingPlanes[4].normal.z = M(3, 2) - M(1, 2);
+ _cullingPlanes[4].d = M(3, 3) - M(1, 3);
+ _cullingPlanes[4].d /= _cullingPlanes[4].normal.normalize();
+#undef M
+ _cullingPlanes[5] = nearPlane;
+ // http://www.openscenegraph.org/projects/osg/browser/OpenSceneGraph/trunk/include/osg/Plane?rev=5328
+ // setup the edges of the plane that we will clip against an axis-aligned bounding box.
+ for (QT3DSU32 idx = 0; idx < 6; ++idx) {
+ _cullingPlanes[idx].calculateBBoxEdges();
+ }
+}
diff --git a/src/runtimerender/Qt3DSRenderClippingFrustum.h b/src/runtimerender/Qt3DSRenderClippingFrustum.h
new file mode 100644
index 0000000..b788ad2
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderClippingFrustum.h
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CLIPPING_PLANE_H
+#define QT3DS_RENDER_CLIPPING_PLANE_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSPlane.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/Qt3DSBounds3.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct BoxEdgeFlagValues
+ {
+ enum Enum {
+ xMax = 1,
+ yMax = 1 << 1,
+ zMax = 1 << 2,
+ };
+ };
+
+ typedef NVFlags<BoxEdgeFlagValues::Enum, QT3DSU8> TRenderBoxEdge;
+
+ // For an intesection test, we only need two points of the bounding box.
+ // There will be a point nearest to the plane, and a point furthest from the plane.
+ // We can derive these points from the plane normal equation.
+ struct SPlaneBoxEdge
+ {
+ TRenderBoxEdge lowerEdge;
+ TRenderBoxEdge upperEdge;
+ };
+
+ struct SClipPlane
+ {
+ QT3DSVec3 normal;
+ QT3DSF32 d;
+ SPlaneBoxEdge mEdges;
+
+ // For intersection tests, we only need to know if the numerator is greater than, equal to,
+ // or less than zero.
+ inline QT3DSF32 distance(const QT3DSVec3 &pt) const { return normal.dot(pt) + d; }
+
+ // Only works if p0 is above the line and p1 is below the plane.
+ inline QT3DSVec3 intersectWithLine(const QT3DSVec3 &p0, const QT3DSVec3 &p1) const
+ {
+ QT3DSVec3 dir = p1 - p0;
+ QT3DSVec3 pointOnPlane = normal * (-d);
+#ifdef _DEBUG
+ QT3DSF32 distanceOfPoint = distance(pointOnPlane);
+ QT3DS_ASSERT(NVAbs(distanceOfPoint) < 0.0001f);
+#endif
+ QT3DSF32 numerator = (pointOnPlane - p0).dot(normal);
+ QT3DSF32 denominator = dir.dot(normal);
+
+ QT3DS_ASSERT(NVAbs(denominator) > .0001f);
+ QT3DSF32 t = (numerator / denominator);
+ QT3DSVec3 retval = p0 + dir * t;
+#ifdef _DEBUG
+ QT3DSF32 retvalDistance = distance(retval);
+ QT3DS_ASSERT(NVAbs(retvalDistance) < .0001f);
+#endif
+ return retval;
+ }
+
+ static inline QT3DSVec3 corner(const NVBounds3 &bounds, TRenderBoxEdge edge)
+ {
+ return QT3DSVec3((edge & BoxEdgeFlagValues::xMax) ? bounds.maximum[0] : bounds.minimum[0],
+ (edge & BoxEdgeFlagValues::yMax) ? bounds.maximum[1] : bounds.minimum[1],
+ (edge & BoxEdgeFlagValues::zMax) ? bounds.maximum[2] : bounds.minimum[2]);
+ }
+
+ // dividing the distance numerator
+
+ // I got this code from osg, but it is in graphics gems
+ // as well.
+ /** intersection test between plane and bounding sphere.
+ return 1 if the bs is completely above plane,
+ return 0 if the bs intersects the plane,
+ return -1 if the bs is completely below the plane.*/
+ inline int intersect(const NVBounds3 &bounds) const
+ {
+ // if lowest point above plane than all above.
+ if (distance(corner(bounds, mEdges.lowerEdge)) > 0.0f)
+ return 1;
+
+ // if highest point is below plane then all below.
+ if (distance(corner(bounds, mEdges.upperEdge)) < 0.0f)
+ return -1;
+
+ // d_lower<=0.0f && d_upper>=0.0f
+ // therefore must be crossing plane.
+ return 0;
+ }
+
+ inline void calculateBBoxEdges()
+ {
+ mEdges.upperEdge = TRenderBoxEdge(
+ static_cast<QT3DSU8>((normal[0] >= 0.0f ? BoxEdgeFlagValues::xMax : 0)
+ | (normal[1] >= 0.0f ? BoxEdgeFlagValues::yMax : 0)
+ | (normal[2] >= 0.0f ? BoxEdgeFlagValues::zMax : 0)));
+
+ mEdges.lowerEdge = TRenderBoxEdge((~((QT3DSU8)mEdges.upperEdge)) & 7);
+ }
+ };
+
+ struct SClippingFrustum
+ {
+ SClipPlane mPlanes[6];
+
+ SClippingFrustum() {}
+
+ SClippingFrustum(const QT3DSMat44 &modelviewprojection, SClipPlane nearPlane);
+
+ bool intersectsWith(const NVBounds3 &bounds) const
+ {
+ for (QT3DSU32 idx = 0; idx < 6; ++idx)
+ if (mPlanes[idx].intersect(bounds) < 0)
+ return false;
+ return true;
+ }
+
+ bool intersectsWith(const QT3DSVec3 &point, QT3DSF32 radius = 0.0f) const
+ {
+ for (QT3DSU32 idx = 0; idx < 6; ++idx)
+ if (mPlanes[idx].distance(point) < radius)
+ return false;
+ return true;
+ }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderContextCore.cpp b/src/runtimerender/Qt3DSRenderContextCore.cpp
new file mode 100644
index 0000000..33e1bf6
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderContextCore.cpp
@@ -0,0 +1,858 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRender.h"
+#include "EABase/eabase.h" //char16_t definition
+#include "Qt3DSRenderContextCore.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderNode.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "Qt3DSRenderCamera.h"
+#include "foundation/Qt3DSContainers.h"
+#include "Qt3DSRenderThreadPool.h"
+#include "Qt3DSRenderImageBatchLoader.h"
+#include "Qt3DSRenderTextTextureCache.h"
+#include "Qt3DSRenderTextTextureAtlas.h"
+#include "Qt3DSRenderPlugin.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderPixelGraphicsRenderer.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "Qt3DSRenderBufferLoader.h"
+#include "foundation/FastAllocator.h"
+#include "foundation/AutoDeallocatorAllocator.h"
+#include "Qt3DSRenderRenderList.h"
+#include "Qt3DSRenderPathManager.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+#include "Qt3DSRenderCustomMaterialShaderGenerator.h"
+#include "Qt3DSDistanceFieldRenderer.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct SRenderContextCore : public IQt3DSRenderContextCore
+{
+ NVFoundationBase &m_Foundation;
+ NVScopedRefCounted<IStringTable> m_StringTable;
+ NVScopedRefCounted<IPerfTimer> m_PerfTimer;
+ NVScopedRefCounted<IInputStreamFactory> m_InputStreamFactory;
+ NVScopedRefCounted<IThreadPool> m_ThreadPool;
+ NVScopedRefCounted<IDynamicObjectSystemCore> m_DynamicObjectSystem;
+ NVScopedRefCounted<ICustomMaterialSystemCore> m_MaterialSystem;
+ NVScopedRefCounted<IEffectSystemCore> m_EffectSystem;
+ NVScopedRefCounted<IBufferLoader> m_BufferLoader;
+ NVScopedRefCounted<IRenderPluginManagerCore> m_RenderPluginManagerCore;
+ NVScopedRefCounted<ITextRendererCore> m_TextRenderer;
+ NVScopedRefCounted<ITextRendererCore> m_OnscreenTexRenderer;
+ NVScopedRefCounted<IPathManagerCore> m_PathManagerCore;
+ NVScopedRefCounted<ITextRendererCore> m_distanceFieldRenderer;
+
+ QT3DSI32 mRefCount;
+ SRenderContextCore(NVFoundationBase &fnd, IStringTable &strTable)
+ : m_Foundation(fnd)
+ , m_StringTable(strTable)
+ , m_PerfTimer(IPerfTimer::CreatePerfTimer(fnd))
+ , m_InputStreamFactory(IInputStreamFactory::Create(fnd))
+ , m_ThreadPool(IThreadPool::CreateThreadPool(fnd, 4))
+ , mRefCount(0)
+ {
+ m_DynamicObjectSystem = IDynamicObjectSystemCore::CreateDynamicSystemCore(*this);
+ m_MaterialSystem = ICustomMaterialSystemCore::CreateCustomMaterialSystemCore(*this);
+ m_EffectSystem = IEffectSystemCore::CreateEffectSystemCore(*this);
+ m_RenderPluginManagerCore =
+ IRenderPluginManagerCore::Create(fnd, strTable, *m_InputStreamFactory);
+ m_BufferLoader = IBufferLoader::Create(m_Foundation, *m_InputStreamFactory, *m_ThreadPool);
+ m_PathManagerCore = IPathManagerCore::CreatePathManagerCore(*this);
+ }
+
+ virtual ~SRenderContextCore() {}
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ IStringTable &GetStringTable() override { return *m_StringTable; }
+ NVFoundationBase &GetFoundation() override { return m_Foundation; }
+ NVAllocatorCallback &GetAllocator() override { return m_Foundation.getAllocator(); }
+ IInputStreamFactory &GetInputStreamFactory() override { return *m_InputStreamFactory; }
+ IThreadPool &GetThreadPool() override { return *m_ThreadPool; }
+ IDynamicObjectSystemCore &GetDynamicObjectSystemCore() override
+ {
+ return *m_DynamicObjectSystem;
+ }
+ ICustomMaterialSystemCore &GetMaterialSystemCore() override { return *m_MaterialSystem; }
+ IEffectSystemCore &GetEffectSystemCore() override { return *m_EffectSystem; }
+ IPerfTimer &GetPerfTimer() override { return *m_PerfTimer; }
+ IBufferLoader &GetBufferLoader() override { return *m_BufferLoader; }
+ IRenderPluginManagerCore &GetRenderPluginCore() override { return *m_RenderPluginManagerCore; }
+ IPathManagerCore &GetPathManagerCore() override { return *m_PathManagerCore; }
+ IQt3DSRenderContext &CreateRenderContext(NVRenderContext &inContext,
+ const char8_t *inPrimitivesDirectory,
+ bool delayedLoading) override;
+ void SetTextRendererCore(ITextRendererCore &inRenderer) override { m_TextRenderer = inRenderer; }
+ ITextRendererCore *GetTextRendererCore() override { return m_TextRenderer.mPtr; }
+ void setDistanceFieldRenderer(ITextRendererCore &inRenderer) override
+ {
+ m_distanceFieldRenderer = inRenderer;
+ }
+ ITextRendererCore *getDistanceFieldRenderer() override { return m_distanceFieldRenderer.mPtr; }
+ void SetOnscreenTextRendererCore(ITextRendererCore &inRenderer) override
+ {
+ m_OnscreenTexRenderer = inRenderer;
+ }
+ ITextRendererCore *GetOnscreenTextRendererCore() override { return m_OnscreenTexRenderer.mPtr; }
+};
+
+inline float Clamp(float val, float inMin = 0.0f, float inMax = 1.0f)
+{
+ if (val < inMin)
+ return inMin;
+ if (val > inMax)
+ return inMax;
+ return val;
+}
+
+struct SPerFrameAllocator : public NVAllocatorCallback
+{
+ SFastAllocator<> m_FastAllocator;
+ SSAutoDeallocatorAllocator m_LargeAllocator;
+
+ SPerFrameAllocator(NVAllocatorCallback &baseAllocator)
+ : m_FastAllocator(baseAllocator, "PerFrameAllocation")
+ , m_LargeAllocator(baseAllocator)
+ {
+ }
+
+ inline void *allocate(size_t inSize, const char *inFile, int inLine)
+ {
+ if (inSize < 8192)
+ return m_FastAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0);
+ else
+ return m_LargeAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0);
+ }
+
+ inline void *allocate(size_t inSize, const char *inFile, int inLine, int, int)
+ {
+ if (inSize < 8192)
+ return m_FastAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0);
+ else
+ return m_LargeAllocator.allocate(inSize, "PerFrameAllocation", inFile, inLine, 0);
+ }
+
+ inline void deallocate(void *, size_t) {}
+
+ void reset()
+ {
+ m_FastAllocator.reset();
+ m_LargeAllocator.deallocateAllAllocations();
+ }
+
+ void *allocate(size_t inSize, const char *typeName, const char *inFile, int inLine,
+ int flags = 0) override
+ {
+ if (inSize < SFastAllocator<>::SlabSize)
+ return m_FastAllocator.allocate(inSize, typeName, inFile, inLine, flags);
+ else
+ return m_LargeAllocator.allocate(inSize, typeName, inFile, inLine, flags);
+ }
+
+ void *allocate(size_t inSize, const char *typeName, const char *inFile, int inLine,
+ size_t alignment, size_t alignmentOffset) override
+ {
+ if (inSize < SFastAllocator<>::SlabSize)
+ return m_FastAllocator.allocate(inSize, typeName, inFile, inLine, alignment,
+ alignmentOffset);
+ else
+ return m_LargeAllocator.allocate(inSize, typeName, inFile, inLine, alignment,
+ alignmentOffset);
+ }
+
+ void deallocate(void *) override {}
+};
+
+struct SRenderContext : public IQt3DSRenderContext
+{
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+ NVScopedRefCounted<IQt3DSRenderContextCore> m_CoreContext;
+ NVScopedRefCounted<IStringTable> m_StringTable;
+ NVScopedRefCounted<IPerfTimer> m_PerfTimer;
+ NVScopedRefCounted<IInputStreamFactory> m_InputStreamFactory;
+ NVScopedRefCounted<IBufferManager> m_BufferManager;
+ NVScopedRefCounted<IResourceManager> m_ResourceManager;
+ NVScopedRefCounted<IOffscreenRenderManager> m_OffscreenRenderManager;
+ NVScopedRefCounted<IQt3DSRenderer> m_Renderer;
+ NVScopedRefCounted<ITextRenderer> m_TextRenderer;
+ NVScopedRefCounted<ITextRenderer> m_distanceFieldRenderer;
+ NVScopedRefCounted<ITextRenderer> m_OnscreenTextRenderer;
+ NVScopedRefCounted<ITextTextureCache> m_TextTextureCache;
+ NVScopedRefCounted<ITextTextureAtlas> m_TextTextureAtlas;
+ NVScopedRefCounted<IDynamicObjectSystem> m_DynamicObjectSystem;
+ NVScopedRefCounted<IEffectSystem> m_EffectSystem;
+ NVScopedRefCounted<IShaderCache> m_ShaderCache;
+ NVScopedRefCounted<IThreadPool> m_ThreadPool;
+ NVScopedRefCounted<IImageBatchLoader> m_ImageBatchLoader;
+ NVScopedRefCounted<IRenderPluginManager> m_RenderPluginManager;
+ NVScopedRefCounted<ICustomMaterialSystem> m_CustomMaterialSystem;
+ NVScopedRefCounted<IPixelGraphicsRenderer> m_PixelGraphicsRenderer;
+ NVScopedRefCounted<IPathManager> m_PathManager;
+ NVScopedRefCounted<IShaderProgramGenerator> m_ShaderProgramGenerator;
+ NVScopedRefCounted<IDefaultMaterialShaderGenerator> m_DefaultMaterialShaderGenerator;
+ NVScopedRefCounted<ICustomMaterialShaderGenerator> m_CustomMaterialShaderGenerator;
+ SPerFrameAllocator m_PerFrameAllocator;
+ NVScopedRefCounted<IRenderList> m_RenderList;
+ QT3DSU32 m_FrameCount;
+ volatile QT3DSI32 mRefCount;
+ // Viewport that this render context should use
+ Option<NVRenderRect> m_Viewport;
+ QSize m_WindowDimensions;
+ ScaleModes::Enum m_ScaleMode;
+ bool m_WireframeMode;
+ bool m_IsInSubPresentation;
+ Option<QT3DSVec4> m_SceneColor;
+ Option<QT3DSVec4> m_MatteColor;
+ RenderRotationValues::Enum m_Rotation;
+ NVScopedRefCounted<NVRenderFrameBuffer> m_RotationFBO;
+ NVScopedRefCounted<NVRenderTexture2D> m_RotationTexture;
+ NVScopedRefCounted<NVRenderRenderBuffer> m_RotationDepthBuffer;
+ NVRenderFrameBuffer *m_ContextRenderTarget;
+ NVRenderRect m_PresentationViewport;
+ QSize m_PresentationDimensions;
+ QSize m_RenderPresentationDimensions;
+ QSize m_PreRenderPresentationDimensions;
+ QT3DSVec2 m_PresentationScale;
+ NVRenderRect m_VirtualViewport;
+ QPair<QT3DSF32, int> m_FPS;
+ bool m_AuthoringMode;
+ QVector<QT3DSF32> m_frameTimes;
+
+ SRenderContext(NVRenderContext &ctx, IQt3DSRenderContextCore &inCore,
+ const char8_t *inApplicationDirectory, bool delayedLoading)
+ : m_RenderContext(ctx)
+ , m_CoreContext(inCore)
+ , m_StringTable(ctx.GetStringTable())
+ , m_PerfTimer(inCore.GetPerfTimer())
+ , m_InputStreamFactory(inCore.GetInputStreamFactory())
+ , m_BufferManager(
+ IBufferManager::Create(ctx, *m_StringTable, *m_InputStreamFactory, *m_PerfTimer))
+ , m_ResourceManager(IResourceManager::CreateResourceManager(ctx))
+ , m_ShaderCache(IShaderCache::CreateShaderCache(ctx, *m_InputStreamFactory, *m_PerfTimer))
+ , m_ThreadPool(inCore.GetThreadPool())
+ , m_RenderList(IRenderList::CreateRenderList(ctx.GetFoundation()))
+ , m_PerFrameAllocator(ctx.GetAllocator())
+ , m_FrameCount(0)
+ , mRefCount(0)
+ , m_WindowDimensions(800, 480)
+ , m_ScaleMode(ScaleModes::ExactSize)
+ , m_WireframeMode(false)
+ , m_IsInSubPresentation(false)
+ , m_Rotation(RenderRotationValues::NoRotation)
+ , m_ContextRenderTarget(NULL)
+ , m_PresentationScale(0, 0)
+ , m_FPS(qMakePair(0.0, 0))
+ , m_AuthoringMode(false)
+ {
+ m_BufferManager->enableReloadableResources(delayedLoading);
+ m_OffscreenRenderManager = IOffscreenRenderManager::CreateOffscreenRenderManager(
+ ctx.GetAllocator(), *m_StringTable, *m_ResourceManager, *this);
+ m_Renderer = IQt3DSRenderer::CreateRenderer(*this);
+ if (inApplicationDirectory && *inApplicationDirectory)
+ m_InputStreamFactory->AddSearchDirectory(inApplicationDirectory);
+
+ m_ImageBatchLoader =
+ IImageBatchLoader::CreateBatchLoader(ctx.GetFoundation(), *m_InputStreamFactory,
+ *m_BufferManager, *m_ThreadPool, *m_PerfTimer);
+ m_RenderPluginManager = inCore.GetRenderPluginCore().GetRenderPluginManager(ctx);
+ m_DynamicObjectSystem = inCore.GetDynamicObjectSystemCore().CreateDynamicSystem(*this);
+ m_EffectSystem = inCore.GetEffectSystemCore().GetEffectSystem(*this);
+ m_CustomMaterialSystem = inCore.GetMaterialSystemCore().GetCustomMaterialSystem(*this);
+ // as does the custom material system
+ m_PixelGraphicsRenderer = IPixelGraphicsRenderer::CreateRenderer(*this, *m_StringTable);
+ ITextRendererCore *theTextCore = inCore.GetTextRendererCore();
+ m_ShaderProgramGenerator = IShaderProgramGenerator::CreateProgramGenerator(*this);
+ m_DefaultMaterialShaderGenerator =
+ IDefaultMaterialShaderGenerator::CreateDefaultMaterialShaderGenerator(*this);
+ m_CustomMaterialShaderGenerator =
+ ICustomMaterialShaderGenerator::CreateCustomMaterialShaderGenerator(*this);
+ if (theTextCore) {
+ m_TextRenderer = theTextCore->GetTextRenderer(ctx);
+ m_TextTextureCache = ITextTextureCache::CreateTextureCache(
+ m_RenderContext->GetFoundation(), *m_TextRenderer, *m_RenderContext);
+ }
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ ITextRendererCore *distanceFieldRenderer = inCore.getDistanceFieldRenderer();
+ if (distanceFieldRenderer) {
+ m_distanceFieldRenderer = distanceFieldRenderer->GetTextRenderer(ctx);
+ static_cast<Q3DSDistanceFieldRenderer *>(m_distanceFieldRenderer.mPtr)
+ ->setContext(*this);
+ }
+#endif
+
+ ITextRendererCore *theOnscreenTextCore = inCore.GetOnscreenTextRendererCore();
+ if (theOnscreenTextCore) {
+ m_OnscreenTextRenderer = theOnscreenTextCore->GetTextRenderer(ctx);
+ m_TextTextureAtlas = ITextTextureAtlas::CreateTextureAtlas(
+ m_RenderContext->GetFoundation(), *m_OnscreenTextRenderer, *m_RenderContext);
+ }
+ m_PathManager = inCore.GetPathManagerCore().OnRenderSystemInitialize(*this);
+
+#if defined (QT3DS_SHADER_PLATFORM_LIBRARY_DIR)
+ const QString platformDirectory;
+#if defined(_WIN32)
+ platformDirectory = QStringLiteral("res/platform/win");
+#elif defined(_LINUX)
+ platformDirectory = QStringLiteral("res/platform/linux");
+#elif defined(_MACOSX)
+ platformDirectory = QStringLiteral("res/platform/macos");
+#endif
+ GetDynamicObjectSystem().setShaderCodeLibraryPlatformDirectory(platformDirectory);
+#endif
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext->GetAllocator());
+
+ IStringTable &GetStringTable() override { return *m_StringTable; }
+ NVFoundationBase &GetFoundation() override { return m_RenderContext->GetFoundation(); }
+ NVAllocatorCallback &GetAllocator() override { return m_RenderContext->GetAllocator(); }
+ IQt3DSRenderer &GetRenderer() override { return *m_Renderer; }
+ IBufferManager &GetBufferManager() override { return *m_BufferManager; }
+ IResourceManager &GetResourceManager() override { return *m_ResourceManager; }
+ NVRenderContext &GetRenderContext() override { return *m_RenderContext; }
+ IOffscreenRenderManager &GetOffscreenRenderManager() override
+ {
+ return *m_OffscreenRenderManager;
+ }
+ IInputStreamFactory &GetInputStreamFactory() override { return *m_InputStreamFactory; }
+ IEffectSystem &GetEffectSystem() override { return *m_EffectSystem; }
+ IShaderCache &GetShaderCache() override { return *m_ShaderCache; }
+ IThreadPool &GetThreadPool() override { return *m_ThreadPool; }
+ IImageBatchLoader &GetImageBatchLoader() override { return *m_ImageBatchLoader; }
+ ITextTextureCache *GetTextureCache() override { return m_TextTextureCache.mPtr; }
+ ITextTextureAtlas *GetTextureAtlas() override { return m_TextTextureAtlas.mPtr; }
+ IRenderPluginManager &GetRenderPluginManager() override { return *m_RenderPluginManager; }
+ IDynamicObjectSystem &GetDynamicObjectSystem() override { return *m_DynamicObjectSystem; }
+ ICustomMaterialSystem &GetCustomMaterialSystem() override { return *m_CustomMaterialSystem; }
+ IPixelGraphicsRenderer &GetPixelGraphicsRenderer() override { return *m_PixelGraphicsRenderer; }
+ IPerfTimer &GetPerfTimer() override { return *m_PerfTimer; }
+ IRenderList &GetRenderList() override { return *m_RenderList; }
+ IPathManager &GetPathManager() override { return *m_PathManager; }
+ IShaderProgramGenerator &GetShaderProgramGenerator() override
+ {
+ return *m_ShaderProgramGenerator;
+ }
+ IDefaultMaterialShaderGenerator &GetDefaultMaterialShaderGenerator() override
+ {
+ return *m_DefaultMaterialShaderGenerator;
+ }
+ ICustomMaterialShaderGenerator &GetCustomMaterialShaderGenerator() override
+ {
+ return *m_CustomMaterialShaderGenerator;
+ }
+ NVAllocatorCallback &GetPerFrameAllocator() override { return m_PerFrameAllocator; }
+
+ QT3DSU32 GetFrameCount() override { return m_FrameCount; }
+ void SetFPS(QPair<QT3DSF32, int> inFPS) override { m_FPS = inFPS; }
+ QPair<QT3DSF32, int> GetFPS(void) override { return m_FPS; }
+
+ void SetFrameTime(QT3DSF32 time) override
+ {
+ m_frameTimes.push_front(time);
+ // Store only one value for now. This can be increased once we have proper graph for
+ // the frame times.
+ if (m_frameTimes.size() > 1)
+ m_frameTimes.pop_back();
+ }
+ QVector<QT3DSF32> GetFrameTimes() const override
+ {
+ return m_frameTimes;
+ }
+
+ bool IsAuthoringMode() override { return m_AuthoringMode; }
+ void SetAuthoringMode(bool inMode) override { m_AuthoringMode = inMode; }
+
+ bool IsInSubPresentation() override { return m_IsInSubPresentation; }
+ void SetInSubPresentation(bool inValue) override { m_IsInSubPresentation = inValue; }
+
+ ITextRenderer *GetTextRenderer() override { return m_TextRenderer; }
+
+ ITextRenderer *getDistanceFieldRenderer() override { return m_distanceFieldRenderer; }
+
+ ITextRenderer *GetOnscreenTextRenderer() override { return m_OnscreenTextRenderer; }
+
+ void SetSceneColor(Option<QT3DSVec4> inSceneColor) override { m_SceneColor = inSceneColor; }
+ void SetMatteColor(Option<QT3DSVec4> inMatteColor) override { m_MatteColor = inMatteColor; }
+
+ void SetWindowDimensions(const QSize &inWindowDimensions) override
+ {
+ m_WindowDimensions = inWindowDimensions;
+ }
+
+ QSize GetWindowDimensions() override { return m_WindowDimensions; }
+
+ void SetScaleMode(ScaleModes::Enum inMode) override { m_ScaleMode = inMode; }
+
+ ScaleModes::Enum GetScaleMode() override { return m_ScaleMode; }
+
+ void SetWireframeMode(bool inEnable) override { m_WireframeMode = inEnable; }
+
+ bool GetWireframeMode() override { return m_WireframeMode; }
+
+ void SetViewport(Option<NVRenderRect> inViewport) override { m_Viewport = inViewport; }
+ Option<NVRenderRect> GetViewport() const override { return m_Viewport; }
+
+ IRenderWidgetContext &GetRenderWidgetContext() override
+ {
+ return m_Renderer->GetRenderWidgetContext();
+ }
+
+ eastl::pair<NVRenderRect, NVRenderRect> GetPresentationViewportAndOuterViewport() const
+ {
+ QSize thePresentationDimensions(m_PresentationDimensions);
+ NVRenderRect theOuterViewport(GetContextViewport());
+ if (m_Rotation == RenderRotationValues::Clockwise90
+ || m_Rotation == RenderRotationValues::Clockwise270) {
+ eastl::swap(theOuterViewport.m_Width, theOuterViewport.m_Height);
+ eastl::swap(theOuterViewport.m_X, theOuterViewport.m_Y);
+ }
+ // Calculate the presentation viewport perhaps with the window width and height swapped.
+ return eastl::make_pair(
+ GetPresentationViewport(theOuterViewport, m_ScaleMode, thePresentationDimensions),
+ theOuterViewport);
+ }
+
+ NVRenderRectF GetDisplayViewport() const override
+ {
+ return GetPresentationViewportAndOuterViewport().first;
+ }
+
+ void SetPresentationDimensions(const QSize &inPresentationDimensions) override
+ {
+ m_PresentationDimensions = inPresentationDimensions;
+ }
+ QSize GetCurrentPresentationDimensions() const override
+ {
+ return m_PresentationDimensions;
+ }
+
+ void SetRenderRotation(RenderRotationValues::Enum inRotation) override
+ {
+ m_Rotation = inRotation;
+ }
+
+ RenderRotationValues::Enum GetRenderRotation() const override { return m_Rotation; }
+ QT3DSVec2 GetMousePickViewport() const override
+ {
+ bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation;
+ if (renderOffscreen)
+ return QT3DSVec2((QT3DSF32)m_PresentationViewport.m_Width,
+ (QT3DSF32)m_PresentationViewport.m_Height);
+ else
+ return QT3DSVec2((QT3DSF32)m_WindowDimensions.width(), (QT3DSF32)m_WindowDimensions.height());
+ }
+ NVRenderRect GetContextViewport() const override
+ {
+ NVRenderRect retval;
+ if (m_Viewport.hasValue())
+ retval = *m_Viewport;
+ else
+ retval = NVRenderRect(0, 0, m_WindowDimensions.width(), m_WindowDimensions.height());
+
+ return retval;
+ }
+
+ QT3DSVec2 GetMousePickMouseCoords(const QT3DSVec2 &inMouseCoords) const override
+ {
+ bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation;
+ if (renderOffscreen) {
+ QSize thePresentationDimensions(m_RenderPresentationDimensions);
+ NVRenderRect theViewport(GetContextViewport());
+ // Calculate the presentation viewport perhaps with the presentation width and height
+ // swapped.
+ NVRenderRect thePresentationViewport =
+ GetPresentationViewport(theViewport, m_ScaleMode, thePresentationDimensions);
+ // Translate pick into presentation space without rotations or anything else.
+ QT3DSF32 YHeightDiff = (QT3DSF32)((QT3DSF32)m_WindowDimensions.height()
+ - (QT3DSF32)thePresentationViewport.m_Height);
+ QT3DSVec2 theLocalMouse((inMouseCoords.x - thePresentationViewport.m_X),
+ (inMouseCoords.y - YHeightDiff + thePresentationViewport.m_Y));
+ switch (m_Rotation) {
+ default:
+ case RenderRotationValues::NoRotation:
+ QT3DS_ASSERT(false);
+ break;
+ case RenderRotationValues::Clockwise90:
+ eastl::swap(theLocalMouse.x, theLocalMouse.y);
+ theLocalMouse.y = thePresentationViewport.m_Width - theLocalMouse.y;
+ break;
+ case RenderRotationValues::Clockwise180:
+ theLocalMouse.y = thePresentationViewport.m_Height - theLocalMouse.y;
+ theLocalMouse.x = thePresentationViewport.m_Width - theLocalMouse.x;
+ break;
+ case RenderRotationValues::Clockwise270:
+ eastl::swap(theLocalMouse.x, theLocalMouse.y);
+ theLocalMouse.x = thePresentationViewport.m_Height - theLocalMouse.x;
+ break;
+ }
+ return theLocalMouse;
+ }
+ return inMouseCoords;
+ }
+
+ NVRenderRect GetPresentationViewport(const NVRenderRect &inViewerViewport,
+ ScaleModes::Enum inScaleToFit,
+ const QSize &inPresDimensions) const
+ {
+ NVRenderRect retval;
+ QT3DSI32 theWidth = inViewerViewport.m_Width;
+ QT3DSI32 theHeight = inViewerViewport.m_Height;
+ if (inPresDimensions.width() == 0 || inPresDimensions.height() == 0)
+ return NVRenderRect(0, 0, 0, 0);
+ // Setup presentation viewport. This may or may not match the physical viewport that we
+ // want to setup.
+ // Avoiding scaling keeps things as sharp as possible.
+ if (inScaleToFit == ScaleModes::ExactSize) {
+ retval.m_Width = inPresDimensions.width();
+ retval.m_Height = inPresDimensions.height();
+ retval.m_X = (theWidth - (QT3DSI32)inPresDimensions.width()) / 2;
+ retval.m_Y = (theHeight - (QT3DSI32)inPresDimensions.height()) / 2;
+ } else if (inScaleToFit == ScaleModes::ScaleToFit
+ || inScaleToFit == ScaleModes::FitSelected) {
+ // Scale down in such a way to preserve aspect ratio.
+ float screenAspect = (float)theWidth / (float)theHeight;
+ float thePresentationAspect =
+ (float)inPresDimensions.width() / (float)inPresDimensions.height();
+ if (screenAspect >= thePresentationAspect) {
+ // if the screen height is the limiting factor
+ retval.m_Y = 0;
+ retval.m_Height = theHeight;
+ retval.m_Width = (QT3DSI32)(thePresentationAspect * retval.m_Height);
+ retval.m_X = (theWidth - retval.m_Width) / 2;
+ } else {
+ retval.m_X = 0;
+ retval.m_Width = theWidth;
+ retval.m_Height = (QT3DSI32)(retval.m_Width / thePresentationAspect);
+ retval.m_Y = (theHeight - retval.m_Height) / 2;
+ }
+ } else {
+ // Setup the viewport for everything and let the presentations figure it out.
+ retval.m_X = 0;
+ retval.m_Y = 0;
+ retval.m_Width = theWidth;
+ retval.m_Height = theHeight;
+ }
+ retval.m_X += inViewerViewport.m_X;
+ retval.m_Y += inViewerViewport.m_Y;
+ return retval;
+ }
+
+ void RenderText2D(QT3DSF32 x, QT3DSF32 y, qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor,
+ const char *text) override
+ {
+ m_Renderer->RenderText2D(x, y, inColor, text);
+ }
+
+ void RenderGpuProfilerStats(QT3DSF32 x, QT3DSF32 y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor) override
+ {
+ m_Renderer->RenderGpuProfilerStats(x, y, inColor);
+ }
+
+ NVRenderRect GetPresentationViewport() const override { return m_PresentationViewport; }
+ struct SBeginFrameResult
+ {
+ bool m_RenderOffscreen;
+ QSize m_PresentationDimensions;
+ bool m_ScissorTestEnabled;
+ NVRenderRect m_ScissorRect;
+ NVRenderRect m_Viewport;
+ QSize m_FBODimensions;
+ SBeginFrameResult(bool ro, QSize presDims, bool scissorEnabled,
+ NVRenderRect scissorRect, NVRenderRect viewport,
+ QSize fboDims)
+ : m_RenderOffscreen(ro)
+ , m_PresentationDimensions(presDims)
+ , m_ScissorTestEnabled(scissorEnabled)
+ , m_ScissorRect(scissorRect)
+ , m_Viewport(viewport)
+ , m_FBODimensions(fboDims)
+ {
+ }
+ SBeginFrameResult() {}
+ };
+
+ // Calculated values passed from beginframe to setupRenderTarget.
+ // Trying to avoid duplicate code as much as possible.
+ SBeginFrameResult m_BeginFrameResult;
+
+ void BeginFrame(bool firstFrame) override
+ {
+ m_PreRenderPresentationDimensions = m_PresentationDimensions;
+ QSize thePresentationDimensions(m_PreRenderPresentationDimensions);
+ NVRenderRect theContextViewport(GetContextViewport());
+ m_PerFrameAllocator.reset();
+ IRenderList &theRenderList(*m_RenderList);
+ theRenderList.BeginFrame();
+ if (m_Viewport.hasValue()) {
+ theRenderList.SetScissorTestEnabled(true);
+ theRenderList.SetScissorRect(theContextViewport);
+ } else {
+ theRenderList.SetScissorTestEnabled(false);
+ }
+ bool renderOffscreen = m_Rotation != RenderRotationValues::NoRotation;
+ eastl::pair<NVRenderRect, NVRenderRect> thePresViewportAndOuterViewport =
+ GetPresentationViewportAndOuterViewport();
+ NVRenderRect theOuterViewport = thePresViewportAndOuterViewport.second;
+ // Calculate the presentation viewport perhaps with the window width and height swapped.
+ NVRenderRect thePresentationViewport = thePresViewportAndOuterViewport.first;
+ m_PresentationViewport = thePresentationViewport;
+ m_PresentationScale = QT3DSVec2(
+ (QT3DSF32)thePresentationViewport.m_Width / (QT3DSF32)thePresentationDimensions.width(),
+ (QT3DSF32)thePresentationViewport.m_Height / (QT3DSF32)thePresentationDimensions.height());
+ QSize fboDimensions;
+ if (thePresentationViewport.m_Width > 0 && thePresentationViewport.m_Height > 0) {
+ if (renderOffscreen == false) {
+ m_PresentationDimensions = QSize(thePresentationViewport.m_Width,
+ thePresentationViewport.m_Height);
+ m_RenderList->SetViewport(thePresentationViewport);
+ if (thePresentationViewport.m_X || thePresentationViewport.m_Y
+ || thePresentationViewport.m_Width != (QT3DSI32)theOuterViewport.m_Width
+ || thePresentationViewport.m_Height != (QT3DSI32)theOuterViewport.m_Height) {
+ m_RenderList->SetScissorRect(thePresentationViewport);
+ m_RenderList->SetScissorTestEnabled(true);
+ }
+ } else {
+ QT3DSU32 imageWidth = ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Width);
+ QT3DSU32 imageHeight =
+ ITextRenderer::NextMultipleOf4(thePresentationViewport.m_Height);
+ fboDimensions = QSize(imageWidth, imageHeight);
+ m_PresentationDimensions = QSize(thePresentationViewport.m_Width,
+ thePresentationViewport.m_Height);
+ NVRenderRect theSceneViewport = NVRenderRect(0, 0, imageWidth, imageHeight);
+ m_RenderList->SetScissorTestEnabled(false);
+ m_RenderList->SetViewport(theSceneViewport);
+ }
+ }
+
+ m_BeginFrameResult = SBeginFrameResult(
+ renderOffscreen, m_PresentationDimensions, m_RenderList->IsScissorTestEnabled(),
+ m_RenderList->GetScissor(), m_RenderList->GetViewport(), fboDimensions);
+
+ m_Renderer->BeginFrame();
+ m_OffscreenRenderManager->BeginFrame();
+ if (m_TextRenderer)
+ m_TextRenderer->BeginFrame();
+ if (m_TextTextureCache)
+ m_TextTextureCache->BeginFrame();
+ m_ImageBatchLoader->BeginFrame(firstFrame);
+ }
+
+ QT3DSVec2 GetPresentationScaleFactor() const override { return m_PresentationScale; }
+
+ virtual void SetupRenderTarget()
+ {
+ NVRenderRect theContextViewport(GetContextViewport());
+ if (m_Viewport.hasValue()) {
+ m_RenderContext->SetScissorTestEnabled(true);
+ m_RenderContext->SetScissorRect(theContextViewport);
+ } else {
+ m_RenderContext->SetScissorTestEnabled(false);
+ }
+ {
+ QT3DSVec4 theClearColor;
+ if (m_MatteColor.hasValue())
+ theClearColor = m_MatteColor;
+ else
+ theClearColor = m_SceneColor;
+ m_RenderContext->SetClearColor(theClearColor);
+ m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
+ }
+ bool renderOffscreen = m_BeginFrameResult.m_RenderOffscreen;
+ m_RenderContext->SetViewport(m_BeginFrameResult.m_Viewport);
+ m_RenderContext->SetScissorRect(m_BeginFrameResult.m_ScissorRect);
+ m_RenderContext->SetScissorTestEnabled(m_BeginFrameResult.m_ScissorTestEnabled);
+
+ if (m_PresentationViewport.m_Width > 0 && m_PresentationViewport.m_Height > 0) {
+ if (renderOffscreen == false) {
+ if (m_RotationFBO != NULL) {
+ m_ResourceManager->Release(*m_RotationFBO);
+ m_ResourceManager->Release(*m_RotationTexture);
+ m_ResourceManager->Release(*m_RotationDepthBuffer);
+ m_RotationFBO = NULL;
+ m_RotationTexture = NULL;
+ m_RotationDepthBuffer = NULL;
+ }
+ if (m_SceneColor.hasValue() && m_SceneColor.getValue().w != 0.0f) {
+ m_RenderContext->SetClearColor(m_SceneColor);
+ m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
+ }
+ } else {
+ QT3DSU32 imageWidth = m_BeginFrameResult.m_FBODimensions.width();
+ QT3DSU32 imageHeight = m_BeginFrameResult.m_FBODimensions.height();
+ NVRenderTextureFormats::Enum theColorBufferFormat = NVRenderTextureFormats::RGBA8;
+ NVRenderRenderBufferFormats::Enum theDepthBufferFormat =
+ NVRenderRenderBufferFormats::Depth16;
+ m_ContextRenderTarget = m_RenderContext->GetRenderTarget();
+ if (m_RotationFBO == NULL) {
+ m_RotationFBO = m_ResourceManager->AllocateFrameBuffer();
+ m_RotationTexture = m_ResourceManager->AllocateTexture2D(
+ imageWidth, imageHeight, theColorBufferFormat);
+ m_RotationDepthBuffer = m_ResourceManager->AllocateRenderBuffer(
+ imageWidth, imageHeight, theDepthBufferFormat);
+ m_RotationFBO->Attach(NVRenderFrameBufferAttachments::Color0,
+ *m_RotationTexture);
+ m_RotationFBO->Attach(NVRenderFrameBufferAttachments::Depth,
+ *m_RotationDepthBuffer);
+ } else {
+ STextureDetails theDetails = m_RotationTexture->GetTextureDetails();
+ if (theDetails.m_Width != imageWidth || theDetails.m_Height != imageHeight) {
+ m_RotationTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, imageWidth,
+ imageHeight, theColorBufferFormat);
+ m_RotationDepthBuffer->SetDimensions(
+ qt3ds::render::NVRenderRenderBufferDimensions(imageWidth, imageHeight));
+ }
+ }
+ m_RenderContext->SetRenderTarget(m_RotationFBO);
+ if (m_SceneColor.hasValue()) {
+ m_RenderContext->SetClearColor(m_SceneColor);
+ m_RenderContext->Clear(qt3ds::render::NVRenderClearValues::Color);
+ }
+ }
+ }
+ }
+
+ void RunRenderTasks() override
+ {
+ m_RenderList->RunRenderTasks();
+ SetupRenderTarget();
+ }
+
+ // Note this runs before EndFrame
+ virtual void TeardownRenderTarget()
+ {
+ if (m_RotationFBO) {
+ ScaleModes::Enum theScaleToFit = m_ScaleMode;
+ NVRenderRect theOuterViewport(GetContextViewport());
+ m_RenderContext->SetRenderTarget(m_ContextRenderTarget);
+ QSize thePresentationDimensions = GetCurrentPresentationDimensions();
+ if (m_Rotation == RenderRotationValues::Clockwise90
+ || m_Rotation == RenderRotationValues::Clockwise270) {
+ thePresentationDimensions = QSize(thePresentationDimensions.height(),
+ thePresentationDimensions.width());
+ }
+ m_RenderPresentationDimensions = thePresentationDimensions;
+ // Calculate the presentation viewport perhaps with the presentation width and height
+ // swapped.
+ NVRenderRect thePresentationViewport =
+ GetPresentationViewport(theOuterViewport, theScaleToFit, thePresentationDimensions);
+ SCamera theCamera;
+ switch (m_Rotation) {
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ case RenderRotationValues::Clockwise90:
+ theCamera.m_Rotation.z = 90;
+ break;
+ case RenderRotationValues::Clockwise180:
+ theCamera.m_Rotation.z = 180;
+ break;
+ case RenderRotationValues::Clockwise270:
+ theCamera.m_Rotation.z = 270;
+ break;
+ }
+ TORAD(theCamera.m_Rotation.z);
+ theCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ theCamera.m_Flags.SetOrthographic(true);
+ m_RenderContext->SetViewport(thePresentationViewport);
+ QT3DSVec2 theCameraDimensions((QT3DSF32)thePresentationViewport.m_Width,
+ (QT3DSF32)thePresentationViewport.m_Height);
+ theCamera.CalculateGlobalVariables(
+ NVRenderRect(0, 0, (QT3DSU32)thePresentationViewport.m_Width,
+ (QT3DSU32)thePresentationViewport.m_Height),
+ theCameraDimensions);
+ QT3DSMat44 theVP;
+ theCamera.CalculateViewProjectionMatrix(theVP);
+ SNode theTempNode;
+ theTempNode.CalculateGlobalVariables();
+ QT3DSMat44 theMVP;
+ QT3DSMat33 theNormalMat;
+ theTempNode.CalculateMVPAndNormalMatrix(theVP, theMVP, theNormalMat);
+ m_RenderContext->SetCullingEnabled(false);
+ m_RenderContext->SetBlendingEnabled(false);
+ m_RenderContext->SetDepthTestEnabled(false);
+ m_Renderer->RenderQuad(QT3DSVec2((QT3DSF32)m_PresentationViewport.m_Width,
+ (QT3DSF32)m_PresentationViewport.m_Height),
+ theMVP, *m_RotationTexture);
+ }
+ }
+
+ void EndFrame() override
+ {
+ TeardownRenderTarget();
+ m_ImageBatchLoader->EndFrame();
+ if (m_TextTextureCache)
+ m_TextTextureCache->EndFrame();
+ if (m_TextRenderer)
+ m_TextRenderer->EndFrame();
+ if (m_distanceFieldRenderer)
+ m_distanceFieldRenderer->EndFrame();
+ m_OffscreenRenderManager->EndFrame();
+ m_Renderer->EndFrame();
+ m_CustomMaterialSystem->EndFrame();
+ m_PresentationDimensions = m_PreRenderPresentationDimensions;
+ ++m_FrameCount;
+ }
+};
+
+IQt3DSRenderContext &SRenderContextCore::CreateRenderContext(NVRenderContext &inContext,
+ const char8_t *inPrimitivesDirectory,
+ bool delayedLoading)
+{
+ return *QT3DS_NEW(m_Foundation.getAllocator(), SRenderContext)(inContext, *this,
+ inPrimitivesDirectory,
+ delayedLoading);
+}
+}
+
+IQt3DSRenderContextCore &IQt3DSRenderContextCore::Create(NVFoundationBase &fnd, IStringTable &strt)
+{
+ return *QT3DS_NEW(fnd.getAllocator(), SRenderContextCore)(fnd, strt);
+}
diff --git a/src/runtimerender/Qt3DSRenderContextCore.h b/src/runtimerender/Qt3DSRenderContextCore.h
new file mode 100644
index 0000000..302571d
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderContextCore.h
@@ -0,0 +1,223 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CONTEXT_CORE_H
+#define QT3DS_RENDER_CONTEXT_CORE_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderPresentation.h"
+
+#include <QtCore/qpair.h>
+#include <QtCore/qsize.h>
+
+namespace qt3ds {
+namespace render {
+ struct ScaleModes
+ {
+ enum Enum {
+ ExactSize = 0, // Ensure the viewport is exactly same size as application
+ ScaleToFit = 1, // Resize viewport keeping aspect ratio
+ ScaleToFill = 2, // Resize viewport to entire window
+ FitSelected = 3, // Resize presentation to fit into viewport
+ };
+ };
+
+ // Part of render context that does not require the render system.
+ class IQt3DSRenderContextCore : public NVRefCounted
+ {
+ public:
+ virtual IStringTable &GetStringTable() = 0;
+ virtual NVFoundationBase &GetFoundation() = 0;
+ virtual NVAllocatorCallback &GetAllocator() = 0;
+ virtual IInputStreamFactory &GetInputStreamFactory() = 0;
+ virtual IThreadPool &GetThreadPool() = 0;
+ virtual IDynamicObjectSystemCore &GetDynamicObjectSystemCore() = 0;
+ virtual ICustomMaterialSystemCore &GetMaterialSystemCore() = 0;
+ virtual IEffectSystemCore &GetEffectSystemCore() = 0;
+ virtual IPerfTimer &GetPerfTimer() = 0;
+ virtual IBufferLoader &GetBufferLoader() = 0;
+ virtual IRenderPluginManagerCore &GetRenderPluginCore() = 0;
+ virtual IPathManagerCore &GetPathManagerCore() = 0;
+ // Text renderers may be provided by clients at runtime.
+ virtual void SetTextRendererCore(ITextRendererCore &inRenderer) = 0;
+ virtual ITextRendererCore *GetTextRendererCore() = 0;
+ virtual void setDistanceFieldRenderer(ITextRendererCore &inRenderer) = 0;
+ virtual ITextRendererCore *getDistanceFieldRenderer() = 0;
+ // this is our default 2D text onscreen renderer
+ virtual void SetOnscreenTextRendererCore(ITextRendererCore &inRenderer) = 0;
+ virtual ITextRendererCore *GetOnscreenTextRendererCore() = 0;
+ // The render context maintains a reference to this object.
+ virtual IQt3DSRenderContext &CreateRenderContext(NVRenderContext &inContext,
+ const char8_t *inPrimitivesDirectory,
+ bool delayedLoading) = 0;
+
+ static IQt3DSRenderContextCore &Create(NVFoundationBase &fnd, IStringTable &strt);
+ };
+
+ class IQt3DSRenderContext : public NVRefCounted
+ {
+ protected:
+ virtual ~IQt3DSRenderContext() {}
+ public:
+ virtual IStringTable &GetStringTable() = 0;
+ virtual NVFoundationBase &GetFoundation() = 0;
+ virtual NVAllocatorCallback &GetAllocator() = 0;
+ virtual IQt3DSRenderer &GetRenderer() = 0;
+ virtual IRenderWidgetContext &GetRenderWidgetContext() = 0;
+ virtual IBufferManager &GetBufferManager() = 0;
+ virtual IResourceManager &GetResourceManager() = 0;
+ virtual NVRenderContext &GetRenderContext() = 0;
+ virtual IOffscreenRenderManager &GetOffscreenRenderManager() = 0;
+ virtual IInputStreamFactory &GetInputStreamFactory() = 0;
+ virtual IEffectSystem &GetEffectSystem() = 0;
+ virtual IShaderCache &GetShaderCache() = 0;
+ virtual IThreadPool &GetThreadPool() = 0;
+ virtual IImageBatchLoader &GetImageBatchLoader() = 0;
+ virtual IRenderPluginManager &GetRenderPluginManager() = 0;
+ virtual IDynamicObjectSystem &GetDynamicObjectSystem() = 0;
+ virtual ICustomMaterialSystem &GetCustomMaterialSystem() = 0;
+ virtual IPixelGraphicsRenderer &GetPixelGraphicsRenderer() = 0;
+ virtual IPerfTimer &GetPerfTimer() = 0;
+ virtual ITextTextureCache *GetTextureCache() = 0;
+ virtual ITextRenderer *GetTextRenderer() = 0;
+ virtual ITextRenderer *getDistanceFieldRenderer() = 0;
+ virtual IRenderList &GetRenderList() = 0;
+ virtual IPathManager &GetPathManager() = 0;
+ virtual IShaderProgramGenerator &GetShaderProgramGenerator() = 0;
+ virtual IDefaultMaterialShaderGenerator &GetDefaultMaterialShaderGenerator() = 0;
+ virtual ICustomMaterialShaderGenerator &GetCustomMaterialShaderGenerator() = 0;
+ // The memory used for the per frame allocator is released as the first step in BeginFrame.
+ // This is useful for short lived objects and datastructures.
+ virtual NVAllocatorCallback &GetPerFrameAllocator() = 0;
+ // Get the number of times EndFrame has been called
+ virtual QT3DSU32 GetFrameCount() = 0;
+
+ // Get fps
+ virtual QPair<QT3DSF32, int> GetFPS() = 0;
+ // Set fps by higher level, etc application
+ virtual void SetFPS(QPair<QT3DSF32, int> inFPS) = 0;
+ virtual void SetFrameTime(QT3DSF32 time) = 0;
+ virtual QVector<QT3DSF32> GetFrameTimes() const = 0;
+
+ // Currently there are a few things that need to work differently
+ // in authoring mode vs. runtime. The particle effects, for instance
+ // need to be framerate-independent at runtime but framerate-dependent during
+ // authoring time assuming virtual 16 ms frames.
+ // Defaults to falst.
+ virtual bool IsAuthoringMode() = 0;
+ virtual void SetAuthoringMode(bool inMode) = 0;
+
+ // This one is setup by the runtime binding
+ virtual ITextRenderer *GetOnscreenTextRenderer() = 0;
+ virtual ITextTextureAtlas *GetTextureAtlas() = 0;
+
+ // Sub presentations change the rendering somewhat.
+ virtual bool IsInSubPresentation() = 0;
+ virtual void SetInSubPresentation(bool inValue) = 0;
+ virtual void SetSceneColor(Option<QT3DSVec4> inSceneColor) = 0;
+ virtual void SetMatteColor(Option<QT3DSVec4> inMatteColor) = 0;
+
+ // Render screen aligned 2D text at x,y
+ virtual void RenderText2D(QT3DSF32 x, QT3DSF32 y, qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor,
+ const char *text) = 0;
+ // render Gpu profiler values
+ virtual void RenderGpuProfilerStats(QT3DSF32 x, QT3DSF32 y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor) = 0;
+
+ // The reason you can set both window dimensions and an overall viewport is that the mouse
+ // needs to be inverted
+ // which requires the window height, and then the rest of the system really requires the
+ // viewport.
+ virtual void SetWindowDimensions(const QSize &inWindowDimensions) = 0;
+ virtual QSize GetWindowDimensions() = 0;
+
+ // In addition to the window dimensions which really have to be set, you can optionally
+ // set the viewport which will force the entire viewer to render specifically to this
+ // viewport.
+ virtual void SetViewport(Option<NVRenderRect> inViewport) = 0;
+ virtual Option<NVRenderRect> GetViewport() const = 0;
+ virtual NVRenderRect GetContextViewport() const = 0;
+ // Only valid between calls to Begin,End.
+ virtual NVRenderRect GetPresentationViewport() const = 0;
+
+ virtual void SetScaleMode(ScaleModes::Enum inMode) = 0;
+ virtual ScaleModes::Enum GetScaleMode() = 0;
+
+ virtual void SetWireframeMode(bool inEnable) = 0;
+ virtual bool GetWireframeMode() = 0;
+
+ // Return the viewport the system is using to render data to. This gives the the dimensions
+ // of the rendered system. It is dependent on but not equal to the viewport.
+ virtual NVRenderRectF GetDisplayViewport() const = 0;
+
+ // Layers require the current presentation dimensions in order to render.
+ virtual void
+ SetPresentationDimensions(const QSize &inPresentationDimensions) = 0;
+ virtual QSize GetCurrentPresentationDimensions() const = 0;
+
+ virtual void SetRenderRotation(RenderRotationValues::Enum inRotation) = 0;
+ virtual RenderRotationValues::Enum GetRenderRotation() const = 0;
+
+ virtual QT3DSVec2 GetMousePickViewport() const = 0;
+ virtual QT3DSVec2 GetMousePickMouseCoords(const QT3DSVec2 &inMouseCoords) const = 0;
+
+ // Valid during and just after prepare for render.
+ virtual QT3DSVec2 GetPresentationScaleFactor() const = 0;
+
+ // Steps needed to render:
+ // 1. BeginFrame - sets up new target in render graph
+ // 2. Add everything you need to the render graph
+ // 3. RunRenderGraph - runs the graph, rendering things to main render target
+ // 4. Render any additional stuff to main render target on top of previously rendered
+ // information
+ // 5. EndFrame
+
+ // Clients need to call this every frame in order for various subsystems to release
+ // temporary per-frame allocated objects.
+ // Also sets up the viewport according to SetViewportInfo
+ // and the topmost presentation dimensions. Expects there to be exactly one presentation
+ // dimension pushed at this point.
+ // This also starts a render target in the render graph.
+ virtual void BeginFrame(bool firstFrame) = 0;
+
+ // This runs through the added tasks in reverse order. This is used to render dependencies
+ // before rendering to the main render target.
+ virtual void RunRenderTasks() = 0;
+ // Now you can render to the main render target if you want to render over the top
+ // of everything.
+ // Next call end frame.
+ virtual void EndFrame() = 0;
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialRenderContext.h b/src/runtimerender/Qt3DSRenderCustomMaterialRenderContext.h
new file mode 100644
index 0000000..5283660
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderCustomMaterialRenderContext.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CUSTOM_MATERIAL_RENDER_CONTEXT_H
+#define QT3DS_RENDER_CUSTOM_MATERIAL_RENDER_CONTEXT_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSMat44.h"
+#include "foundation/Qt3DSMat33.h"
+#include "Qt3DSRenderShaderKeys.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SLayerRenderData;
+
+ struct SCustomMaterialRenderContext
+ {
+ // The lights and camera will not change per layer,
+ // so that information can be set once for all the shaders.
+ const SLayer &m_Layer;
+ const SLayerRenderData &m_LayerData;
+ NVDataRef<SLight *> m_Lights;
+ const SCamera &m_Camera;
+
+ // Per-object information.
+ const SModel &m_Model;
+ const SRenderSubset &m_Subset;
+ const QT3DSMat44 &m_ModelViewProjection;
+ const QT3DSMat44 &m_ModelMatrix; ///< model to world transformation
+ const QT3DSMat33 &m_NormalMatrix;
+ const SCustomMaterial &m_Material;
+ const NVRenderTexture2D *m_DepthTexture;
+ const NVRenderTexture2D *m_AOTexture;
+ SShaderDefaultMaterialKey m_MaterialKey;
+ SRenderableImage *m_FirstImage;
+ QT3DSF32 m_Opacity;
+
+ SCustomMaterialRenderContext(
+ const SLayer &layer, const SLayerRenderData &data, NVDataRef<SLight *> lights,
+ const SCamera &cam, const SModel &m, const SRenderSubset &subset, const QT3DSMat44 &mvp,
+ const QT3DSMat44 &world, const QT3DSMat33 &nm, const SCustomMaterial &material,
+ const NVRenderTexture2D *depthTex, const NVRenderTexture2D *aoTex,
+ SShaderDefaultMaterialKey inMaterialKey, SRenderableImage *inFirstImage = NULL,
+ QT3DSF32 opacity = 1.0)
+ : m_Layer(layer)
+ , m_LayerData(data)
+ , m_Lights(lights)
+ , m_Camera(cam)
+ , m_Model(m)
+ , m_Subset(subset)
+ , m_ModelViewProjection(mvp)
+ , m_ModelMatrix(world)
+ , m_NormalMatrix(nm)
+ , m_Material(material)
+ , m_DepthTexture(depthTex)
+ , m_AOTexture(aoTex)
+ , m_MaterialKey(inMaterialKey)
+ , m_FirstImage(inFirstImage)
+ , m_Opacity(opacity)
+ {
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp
new file mode 100644
index 0000000..62205ec
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp
@@ -0,0 +1,1265 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderCustomMaterialShaderGenerator.h"
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "Qt3DSRenderableImage.h"
+#include "Qt3DSRenderImage.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSRenderLight.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderShadowMap.h"
+#include "Qt3DSRenderCustomMaterial.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderLightConstantProperties.h"
+
+using namespace qt3ds::render;
+using qt3ds::render::NVRenderCachedShaderProperty;
+using qt3ds::render::NVRenderCachedShaderBuffer;
+
+namespace {
+struct SShaderLightProperties
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ RenderLightTypes::Enum m_LightType;
+ SLightSourceShader m_LightData;
+ volatile QT3DSI32 mRefCount;
+
+ SShaderLightProperties(NVRenderShaderProgram &inShader)
+ : m_Shader(inShader)
+ , m_LightType(RenderLightTypes::Directional)
+ , mRefCount(0)
+ {
+ }
+
+ void Set(const SLight *inLight)
+ {
+ QT3DSVec3 dir(0, 0, 1);
+ if (inLight->m_LightType == RenderLightTypes::Directional) {
+ dir = inLight->GetScalingCorrectDirection();
+ // we lit in world sapce
+ dir *= -1;
+ m_LightData.m_position = QT3DSVec4(dir, 0.0);
+ } else if (inLight->m_LightType == RenderLightTypes::Area) {
+ dir = inLight->GetScalingCorrectDirection();
+ m_LightData.m_position = QT3DSVec4(inLight->GetGlobalPos(), 1.0);
+ } else {
+ dir = inLight->GetGlobalPos();
+ m_LightData.m_position = QT3DSVec4(dir, 1.0);
+ }
+
+ m_LightType = inLight->m_LightType;
+
+ m_LightData.m_direction = QT3DSVec4(dir, 0.0);
+
+ float normalizedBrightness = inLight->m_Brightness / 100.0f;
+ m_LightData.m_diffuse = QT3DSVec4(inLight->m_DiffuseColor.getXYZ() * normalizedBrightness,
+ inLight->m_DiffuseColor.w);
+ m_LightData.m_specular = QT3DSVec4(inLight->m_SpecularColor.getXYZ() * normalizedBrightness,
+ inLight->m_DiffuseColor.w);
+
+ if (inLight->m_LightType == RenderLightTypes::Area) {
+ m_LightData.m_width = inLight->m_AreaWidth;
+ m_LightData.m_height = inLight->m_AreaWidth;
+
+ QT3DSMat33 theDirMatrix(inLight->m_GlobalTransform.getUpper3x3());
+ m_LightData.m_right =
+ QT3DSVec4(theDirMatrix.transform(QT3DSVec3(1, 0, 0)), inLight->m_AreaWidth);
+ m_LightData.m_up =
+ QT3DSVec4(theDirMatrix.transform(QT3DSVec3(0, 1, 0)), inLight->m_AreaHeight);
+ } else {
+ m_LightData.m_width = 0.0;
+ m_LightData.m_height = 0.0;
+ m_LightData.m_right = QT3DSVec4(0.0f);
+ m_LightData.m_up = QT3DSVec4(0.0f);
+
+ // These components only apply to CG lights
+ m_LightData.m_ambient = inLight->m_AmbientColor;
+
+ m_LightData.m_constantAttenuation = 1.0;
+ m_LightData.m_linearAttenuation = inLight->m_LinearFade;
+ m_LightData.m_quadraticAttenuation = inLight->m_ExponentialFade;
+ m_LightData.m_spotCutoff = 180.0;
+ }
+
+ if (m_LightType == RenderLightTypes::Point) {
+ m_LightData.m_shadowView = QT3DSMat44::createIdentity();
+ } else {
+ m_LightData.m_shadowView = inLight->m_GlobalTransform;
+ }
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+
+ static SShaderLightProperties CreateLightEntry(NVRenderShaderProgram &inShader)
+ {
+ return SShaderLightProperties(inShader);
+ }
+};
+
+/**
+ * Cached texture property lookups, used one per texture so a shader generator for N
+ * textures will have an array of N of these lookup objects.
+ */
+struct SShaderTextureProperties
+{
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_Offsets;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_Rotations;
+ SShaderTextureProperties(const char *sampName, const char *offName, const char *rotName,
+ NVRenderShaderProgram &inShader)
+ : m_Sampler(sampName, inShader)
+ , m_Offsets(offName, inShader)
+ , m_Rotations(rotName, inShader)
+ {
+ }
+ SShaderTextureProperties() {}
+};
+
+/* We setup some shared state on the custom material shaders */
+struct SShaderGeneratorGeneratedShader
+{
+ typedef nvhash_map<QT3DSU32, SShaderTextureProperties> TCustomMaterialImagMap;
+
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ // Specific properties we know the shader has to have.
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ModelMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewProjMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat33> m_NormalMatrix;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraPos;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ProjMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewportMatrix;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CamProperties;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_DepthTexture;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_AOTexture;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LightProbe;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeProps;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeOpts;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeRot;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeOfs;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LightProbe2;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbe2Props;
+ NVRenderCachedShaderProperty<QT3DSI32> m_LightCount;
+ NVRenderCachedShaderProperty<QT3DSI32> m_AreaLightCount;
+ NVRenderCachedShaderProperty<QT3DSI32> m_ShadowMapCount;
+ NVRenderCachedShaderProperty<QT3DSI32> m_ShadowCubeCount;
+ NVRenderCachedShaderProperty<QT3DSF32> m_Opacity;
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_AoShadowParams;
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_LightsBuffer;
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_AreaLightsBuffer;
+
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *m_lightsProperties;
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *m_areaLightsProperties;
+
+ typedef NVRenderCachedShaderPropertyArray<NVRenderTexture2D *,
+ QT3DS_MAX_NUM_SHADOWS> ShadowMapPropertyArray;
+ typedef NVRenderCachedShaderPropertyArray<NVRenderTextureCube *,
+ QT3DS_MAX_NUM_SHADOWS> ShadowCubePropertyArray;
+
+ ShadowMapPropertyArray m_shadowMaps;
+ ShadowCubePropertyArray m_shadowCubes;
+
+ // Cache the image property name lookups
+ TCustomMaterialImagMap m_Images; // Images external to custom material usage
+ volatile QT3DSI32 m_RefCount;
+
+ SShaderGeneratorGeneratedShader(NVRenderShaderProgram &inShader, NVRenderContext &inContext)
+ : m_Allocator(inContext.GetAllocator())
+ , m_Shader(inShader)
+ , m_ModelMatrix("model_matrix", inShader)
+ , m_ViewProjMatrix("model_view_projection", inShader)
+ , m_ViewMatrix("view_matrix", inShader)
+ , m_NormalMatrix("normal_matrix", inShader)
+ , m_CameraPos("camera_position", inShader)
+ , m_ProjMatrix("view_projection_matrix", inShader)
+ , m_ViewportMatrix("viewport_matrix", inShader)
+ , m_CamProperties("camera_properties", inShader)
+ , m_DepthTexture("depth_sampler", inShader)
+ , m_AOTexture("ao_sampler", inShader)
+ , m_LightProbe("light_probe", inShader)
+ , m_LightProbeProps("light_probe_props", inShader)
+ , m_LightProbeOpts("light_probe_opts", inShader)
+ , m_LightProbeRot("light_probe_rotation", inShader)
+ , m_LightProbeOfs("light_probe_offset", inShader)
+ , m_LightProbe2("light_probe2", inShader)
+ , m_LightProbe2Props("light_probe2_props", inShader)
+ , m_LightCount("uNumLights", inShader)
+ , m_AreaLightCount("uNumAreaLights", inShader)
+ , m_ShadowMapCount("uNumShadowMaps", inShader)
+ , m_ShadowCubeCount("uNumShadowCubes", inShader)
+ , m_Opacity("object_opacity", inShader)
+ , m_AoShadowParams("cbAoShadow", inShader)
+ , m_LightsBuffer("cbBufferLights", inShader)
+ , m_AreaLightsBuffer("cbBufferAreaLights", inShader)
+ , m_lightsProperties(nullptr)
+ , m_areaLightsProperties(nullptr)
+ , m_shadowMaps("shadowMaps[0]", inShader)
+ , m_shadowCubes("shadowCubes[0]", inShader)
+ , m_Images(inContext.GetAllocator(), "SShaderGeneratorGeneratedShader::m_Images")
+ , m_RefCount(0)
+ {
+ m_Shader.addRef();
+ }
+
+ ~SShaderGeneratorGeneratedShader()
+ {
+ m_Shader.release();
+ delete m_lightsProperties;
+ delete m_areaLightsProperties;
+ }
+
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Allocator);
+ NVDelete(alloc, this);
+ }
+ }
+
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *GetLightProperties(int count)
+ {
+ if (!m_lightsProperties || m_areaLightsProperties->m_lightCountInt < count) {
+ if (m_lightsProperties)
+ delete m_lightsProperties;
+ m_lightsProperties = new SLightConstantProperties<SShaderGeneratorGeneratedShader>
+ ("lights", "uNumLights", *this, false, count);
+ }
+ return m_lightsProperties;
+ }
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *GetAreaLightProperties(int count)
+ {
+ if (!m_areaLightsProperties || m_areaLightsProperties->m_lightCountInt < count) {
+ if (m_areaLightsProperties)
+ delete m_areaLightsProperties;
+ m_areaLightsProperties = new SLightConstantProperties<SShaderGeneratorGeneratedShader>
+ ("areaLights", "uNumAreaLights", *this, false, count);
+ }
+ return m_areaLightsProperties;
+ }
+};
+
+struct SShaderGenerator : public ICustomMaterialShaderGenerator
+{
+ typedef Qt3DSString TStrType;
+ typedef nvhash_map<NVRenderShaderProgram *, NVScopedRefCounted<SShaderGeneratorGeneratedShader>>
+ TProgramToShaderMap;
+ typedef eastl::pair<size_t, NVScopedRefCounted<SShaderLightProperties>>
+ TCustomMaterialLightEntry;
+ typedef eastl::pair<size_t, NVRenderCachedShaderProperty<NVRenderTexture2D *>> TShadowMapEntry;
+ typedef eastl::pair<size_t, NVRenderCachedShaderProperty<NVRenderTextureCube *>>
+ TShadowCubeEntry;
+ typedef qt3ds::foundation::nvhash_map<CRegisteredString,
+ NVScopedRefCounted<qt3ds::render::NVRenderConstantBuffer>>
+ TStrConstanBufMap;
+
+ IQt3DSRenderContext &m_RenderContext;
+ IShaderProgramGenerator &m_ProgramGenerator;
+
+ const SCustomMaterial *m_CurrentMaterial;
+ SShaderDefaultMaterialKey *m_CurrentKey;
+ IDefaultMaterialVertexPipeline *m_CurrentPipeline;
+ TShaderFeatureSet m_CurrentFeatureSet;
+ NVDataRef<SLight *> m_Lights;
+ SRenderableImage *m_FirstImage;
+ bool m_HasTransparency;
+
+ TStrType m_ImageStem;
+ TStrType m_ImageSampler;
+ TStrType m_ImageFragCoords;
+ TStrType m_ImageRotScale;
+ TStrType m_ImageOffset;
+
+ eastl::string m_GeneratedShaderString;
+
+ SShaderDefaultMaterialKeyProperties m_DefaultMaterialShaderKeyProperties;
+ TProgramToShaderMap m_ProgramToShaderMap;
+
+ nvvector<TCustomMaterialLightEntry> m_LightEntries;
+
+ TStrConstanBufMap m_ConstantBuffers; ///< store all constants buffers
+
+ QT3DSI32 m_RefCount;
+
+ SShaderGenerator(IQt3DSRenderContext &inRc)
+ : m_RenderContext(inRc)
+ , m_ProgramGenerator(m_RenderContext.GetShaderProgramGenerator())
+ , m_CurrentMaterial(NULL)
+ , m_CurrentKey(NULL)
+ , m_CurrentPipeline(NULL)
+ , m_FirstImage(NULL)
+ , m_HasTransparency(false)
+ , m_ProgramToShaderMap(inRc.GetAllocator(), "m_ProgramToShaderMap")
+ , m_LightEntries(inRc.GetAllocator(), "m_LightEntries")
+ , m_ConstantBuffers(inRc.GetAllocator(), "m_ConstantBuffers")
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ m_ConstantBuffers.clear();
+ NVDelete(m_RenderContext.GetAllocator(), this);
+ }
+ }
+
+ IShaderProgramGenerator &ProgramGenerator() { return m_ProgramGenerator; }
+ IDefaultMaterialVertexPipeline &VertexGenerator() { return *m_CurrentPipeline; }
+ IShaderStageGenerator &FragmentGenerator()
+ {
+ return *m_ProgramGenerator.GetStage(ShaderGeneratorStages::Fragment);
+ }
+ SShaderDefaultMaterialKey &Key() { return *m_CurrentKey; }
+ const SCustomMaterial &Material() { return *m_CurrentMaterial; }
+ TShaderFeatureSet FeatureSet() { return m_CurrentFeatureSet; }
+ bool HasTransparency() { return m_HasTransparency; }
+
+ QT3DSU32
+ ConvertTextureTypeValue(ImageMapTypes::Enum inType)
+ {
+ NVRenderTextureTypeValue::Enum retVal = NVRenderTextureTypeValue::Unknown;
+
+ switch (inType) {
+ case ImageMapTypes::LightmapIndirect:
+ retVal = NVRenderTextureTypeValue::LightmapIndirect;
+ break;
+ case ImageMapTypes::LightmapRadiosity:
+ retVal = NVRenderTextureTypeValue::LightmapRadiosity;
+ break;
+ case ImageMapTypes::LightmapShadow:
+ retVal = NVRenderTextureTypeValue::LightmapShadow;
+ break;
+ case ImageMapTypes::Bump:
+ retVal = NVRenderTextureTypeValue::Bump;
+ break;
+ case ImageMapTypes::Diffuse:
+ retVal = NVRenderTextureTypeValue::Diffuse;
+ break;
+ case ImageMapTypes::Displacement:
+ retVal = NVRenderTextureTypeValue::Displace;
+ break;
+ default:
+ retVal = NVRenderTextureTypeValue::Unknown;
+ break;
+ }
+
+ QT3DS_ASSERT(retVal != NVRenderTextureTypeValue::Unknown);
+
+ return (QT3DSU32)retVal;
+ }
+
+ SImageVariableNames GetImageVariableNames(QT3DSU32 imageIdx) override
+ {
+ // convert to NVRenderTextureTypeValue
+ NVRenderTextureTypeValue::Enum texType = (NVRenderTextureTypeValue::Enum)imageIdx;
+ m_ImageStem.assign(NVRenderTextureTypeValue::toString(texType));
+ m_ImageStem.append("_");
+ m_ImageSampler = m_ImageStem;
+ m_ImageSampler.append("sampler");
+ m_ImageFragCoords = m_ImageStem;
+ m_ImageFragCoords.append("uv_coords");
+ m_ImageRotScale = m_ImageStem;
+ m_ImageRotScale.append("rot_scale");
+ m_ImageOffset = m_ImageStem;
+ m_ImageOffset.append("offset");
+
+ SImageVariableNames retVal;
+ retVal.m_ImageSampler = m_ImageSampler.c_str();
+ retVal.m_ImageFragCoords = m_ImageFragCoords.c_str();
+ return retVal;
+ }
+
+ void SetImageShaderVariables(SShaderGeneratorGeneratedShader &inShader,
+ SRenderableImage &inImage)
+ {
+ // skip displacement and emissive mask maps which are handled differently
+ if (inImage.m_MapType == ImageMapTypes::Displacement
+ || inImage.m_MapType == ImageMapTypes::Emissive)
+ return;
+
+ SShaderGeneratorGeneratedShader::TCustomMaterialImagMap::iterator iter =
+ inShader.m_Images.find(inImage.m_MapType);
+ if (iter == inShader.m_Images.end()) {
+ SImageVariableNames names =
+ GetImageVariableNames(ConvertTextureTypeValue(inImage.m_MapType));
+ inShader.m_Images.insert(eastl::make_pair(
+ (QT3DSU32)inImage.m_MapType,
+ SShaderTextureProperties(names.m_ImageSampler, m_ImageOffset.c_str(),
+ m_ImageRotScale.c_str(), inShader.m_Shader)));
+ iter = inShader.m_Images.find(inImage.m_MapType);
+ }
+
+ SShaderTextureProperties &theShaderProps = iter->second;
+ const QT3DSMat44 &textureTransform = inImage.m_Image.m_TextureTransform;
+ const QT3DSF32 *dataPtr(textureTransform.front());
+ QT3DSVec3 offsets(dataPtr[12], dataPtr[13], 0.0f);
+ // Grab just the upper 2x2 rotation matrix from the larger matrix.
+ QT3DSVec4 rotations(dataPtr[0], dataPtr[4], dataPtr[1], dataPtr[5]);
+
+ // The image horizontal and vertical tiling modes need to be set here, before we set texture
+ // on the shader.
+ // because setting the image on the texture forces the textue to bind and immediately apply
+ // any tex params.
+ inImage.m_Image.m_TextureData.m_Texture->SetTextureWrapS(
+ inImage.m_Image.m_HorizontalTilingMode);
+ inImage.m_Image.m_TextureData.m_Texture->SetTextureWrapT(
+ inImage.m_Image.m_VerticalTilingMode);
+
+ theShaderProps.m_Sampler.Set(inImage.m_Image.m_TextureData.m_Texture);
+ theShaderProps.m_Offsets.Set(offsets);
+ theShaderProps.m_Rotations.Set(rotations);
+ }
+
+ void GenerateImageUVCoordinates(IShaderStageGenerator &, QT3DSU32, QT3DSU32, SRenderableImage &) override {}
+
+ ///< get the light constant buffer and generate if necessary
+ NVRenderConstantBuffer *GetLightConstantBuffer(const char *name, QT3DSU32 inLightCount)
+ {
+ NVRenderContext &theContext(m_RenderContext.GetRenderContext());
+
+ // we assume constant buffer support
+ QT3DS_ASSERT(theContext.GetConstantBufferSupport());
+ // we only create if if we have lights
+ if (!inLightCount || !theContext.GetConstantBufferSupport())
+ return NULL;
+
+ CRegisteredString theName = theContext.GetStringTable().RegisterStr(name);
+ NVRenderConstantBuffer *pCB = theContext.GetConstantBuffer(theName);
+
+ if (!pCB) {
+ // create with size of all structures + int for light count
+ SLightSourceShader s[QT3DS_MAX_NUM_LIGHTS];
+ NVDataRef<QT3DSU8> cBuffer((QT3DSU8 *)&s, (sizeof(SLightSourceShader) * QT3DS_MAX_NUM_LIGHTS)
+ + (4 * sizeof(QT3DSI32)));
+ pCB = theContext.CreateConstantBuffer(
+ name, qt3ds::render::NVRenderBufferUsageType::Static,
+ (sizeof(SLightSourceShader) * QT3DS_MAX_NUM_LIGHTS) + (4 * sizeof(QT3DSI32)), cBuffer);
+ if (!pCB) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ // init first set
+ memset(&s[0], 0x0, sizeof(SLightSourceShader) * QT3DS_MAX_NUM_LIGHTS);
+ QT3DSI32 cgLights[4] = {0, 0, 0, 0};
+ pCB->UpdateRaw(0, NVDataRef<QT3DSU8>((QT3DSU8 *)&cgLights, sizeof(QT3DSI32) * 4));
+ pCB->UpdateRaw(4 * sizeof(QT3DSI32),
+ NVDataRef<QT3DSU8>((QT3DSU8 *)&s[0],
+ sizeof(SLightSourceShader) * QT3DS_MAX_NUM_LIGHTS));
+ pCB->Update(); // update to hardware
+
+ m_ConstantBuffers.insert(eastl::make_pair(theName, pCB));
+ }
+
+ return pCB;
+ }
+
+ bool GenerateVertexShader(SShaderDefaultMaterialKey &, const char8_t *inShaderPathName)
+ {
+ qt3ds::render::IDynamicObjectSystem &theDynamicSystem(
+ m_RenderContext.GetDynamicObjectSystem());
+ Qt3DSString theShaderBuffer;
+ theDynamicSystem.GetShaderSource(
+ m_RenderContext.GetStringTable().RegisterStr(inShaderPathName), theShaderBuffer);
+
+ eastl::string srcString(theShaderBuffer.c_str());
+
+ // Check if the vertex shader portion already contains a main function
+ // The same string contains both the vertex and the fragment shader
+ // The last "#ifdef FRAGMENT_SHADER" should mark the start of the fragment shader
+ eastl_size_t fragmentDefStart = srcString.find("#ifdef FRAGMENT_SHADER");
+ eastl_size_t nextIndex = fragmentDefStart;
+ while (nextIndex != eastl::string::npos) {
+ nextIndex = srcString.find("#ifdef FRAGMENT_SHADER", nextIndex + 1);
+ if (nextIndex != eastl::string::npos)
+ fragmentDefStart = nextIndex;
+ }
+ eastl_size_t mainStart = srcString.find("void main()");
+
+ if (mainStart != eastl::string::npos && (fragmentDefStart == eastl::string::npos
+ || mainStart < fragmentDefStart)) {
+ TShaderGeneratorStageFlags stages(IShaderProgramGenerator::DefaultFlags());
+ ProgramGenerator().BeginProgram(stages);
+ IDefaultMaterialVertexPipeline &vertexShader(VertexGenerator());
+ vertexShader << "#define VERTEX_SHADER\n\n";
+ vertexShader << srcString.data() << Endl;
+ return true;
+ }
+
+ // vertex displacement
+ QT3DSU32 imageIdx = 0;
+ SRenderableImage *displacementImage = NULL;
+ QT3DSU32 displacementImageIdx = 0;
+
+ for (SRenderableImage *img = m_FirstImage; img != NULL;
+ img = img->m_NextImage, ++imageIdx) {
+ if (img->m_MapType == ImageMapTypes::Displacement) {
+ displacementImage = img;
+ displacementImageIdx = imageIdx;
+ break;
+ }
+ }
+
+ // the pipeline opens/closes up the shaders stages
+ VertexGenerator().BeginVertexGeneration(displacementImageIdx, displacementImage);
+ return false;
+ }
+
+ SShaderGeneratorGeneratedShader &GetShaderForProgram(NVRenderShaderProgram &inProgram)
+ {
+ eastl::pair<TProgramToShaderMap::iterator, bool> inserter =
+ m_ProgramToShaderMap.insert(eastl::make_pair(
+ &inProgram, NVScopedRefCounted<SShaderGeneratorGeneratedShader>(NULL)));
+ if (inserter.second) {
+ NVAllocatorCallback &alloc(m_RenderContext.GetRenderContext().GetAllocator());
+ inserter.first->second = QT3DS_NEW(alloc, SShaderGeneratorGeneratedShader)(
+ inProgram, m_RenderContext.GetRenderContext());
+ }
+ return *inserter.first->second;
+ }
+
+ virtual SShaderLightProperties *SetLight(NVRenderShaderProgram &inShader, size_t lightIdx,
+ size_t shadeIdx, const SLight *inLight,
+ SShadowMapEntry *inShadow, QT3DSI32 shadowIdx,
+ QT3DSF32 shadowDist)
+ {
+ SShaderLightProperties *theLightEntry(NULL);
+ for (QT3DSU32 idx = 0, end = m_LightEntries.size(); idx < end && theLightEntry == NULL;
+ ++idx) {
+ if (m_LightEntries[idx].first == lightIdx
+ && m_LightEntries[idx].second->m_Shader.mPtr == &inShader
+ && m_LightEntries[idx].second->m_LightType == inLight->m_LightType) {
+ theLightEntry = m_LightEntries[idx].second;
+ }
+ }
+ if (theLightEntry == NULL) {
+ // create a new name
+ eastl::string lightName;
+ if (inLight->m_LightType == RenderLightTypes::Area)
+ lightName = "arealights";
+ else
+ lightName = "lights";
+ char buf[16];
+ _snprintf(buf, 16, "[%d]", int(shadeIdx));
+ lightName.append(buf);
+
+ NVScopedRefCounted<SShaderLightProperties> theNewEntry =
+ QT3DS_NEW(m_RenderContext.GetAllocator(),
+ SShaderLightProperties)(SShaderLightProperties::CreateLightEntry(inShader));
+ m_LightEntries.push_back(eastl::make_pair(lightIdx, theNewEntry));
+ theLightEntry = theNewEntry.mPtr;
+ }
+ theLightEntry->Set(inLight);
+ theLightEntry->m_LightData.m_shadowControls =
+ QT3DSVec4(inLight->m_ShadowBias, inLight->m_ShadowFactor, shadowDist, 0.0);
+ theLightEntry->m_LightData.m_shadowIdx = (inShadow) ? shadowIdx : -1;
+
+ return theLightEntry;
+ }
+
+ void SetShadowMaps(NVRenderShaderProgram &inProgram, SShadowMapEntry *inShadow,
+ QT3DSI32 &numShadowMaps, QT3DSI32 &numShadowCubes, bool shadowMap,
+ SShaderGeneratorGeneratedShader::ShadowMapPropertyArray &shadowMaps,
+ SShaderGeneratorGeneratedShader::ShadowCubePropertyArray &shadowCubes)
+ {
+ Q_UNUSED(inProgram)
+ if (inShadow) {
+ if (shadowMap == false && inShadow->m_DepthCube
+ && (numShadowCubes < QT3DS_MAX_NUM_SHADOWS)) {
+ shadowCubes.m_array[numShadowCubes] = inShadow->m_DepthCube.mPtr;
+ ++numShadowCubes;
+ } else if (shadowMap && inShadow->m_DepthMap
+ && (numShadowMaps < QT3DS_MAX_NUM_SHADOWS)) {
+ shadowMaps.m_array[numShadowMaps] = inShadow->m_DepthMap.mPtr;
+ ++numShadowMaps;
+ }
+ }
+ }
+
+ void SetGlobalProperties(NVRenderShaderProgram &inProgram, const SLayer & /*inLayer*/
+ ,
+ SCamera &inCamera, QT3DSVec3, NVDataRef<SLight *> inLights,
+ NVDataRef<QT3DSVec3>, Qt3DSShadowMap *inShadowMaps)
+ {
+ SShaderGeneratorGeneratedShader &theShader(GetShaderForProgram(inProgram));
+ m_RenderContext.GetRenderContext().SetActiveShader(&inProgram);
+
+ SCamera &theCamera(inCamera);
+
+ QT3DSVec2 camProps(theCamera.m_ClipNear, theCamera.m_ClipFar);
+ theShader.m_CamProperties.Set(camProps);
+ theShader.m_CameraPos.Set(theCamera.GetGlobalPos());
+
+ if (theShader.m_ViewMatrix.IsValid())
+ theShader.m_ViewMatrix.Set(theCamera.m_GlobalTransform.getInverse());
+
+ if (theShader.m_ProjMatrix.IsValid()) {
+ QT3DSMat44 vProjMat;
+ inCamera.CalculateViewProjectionMatrix(vProjMat);
+ theShader.m_ProjMatrix.Set(vProjMat);
+ }
+
+ // set lights separate for area lights
+ QT3DSI32 cgLights = 0, areaLights = 0;
+ QT3DSI32 numShadowMaps = 0, numShadowCubes = 0;
+
+ // this call setup the constant buffer for ambient occlusion and shadow
+ theShader.m_AoShadowParams.Set();
+
+ if (m_RenderContext.GetRenderContext().GetConstantBufferSupport()) {
+ NVRenderConstantBuffer *pLightCb =
+ GetLightConstantBuffer("cbBufferLights", inLights.size());
+ NVRenderConstantBuffer *pAreaLightCb =
+ GetLightConstantBuffer("cbBufferAreaLights", inLights.size());
+
+ // Split the count between CG lights and area lights
+ for (QT3DSU32 lightIdx = 0; lightIdx < inLights.size() && pLightCb; ++lightIdx) {
+ SShadowMapEntry *theShadow = NULL;
+ if (inShadowMaps && inLights[lightIdx]->m_CastShadow)
+ theShadow = inShadowMaps->GetShadowMapEntry(lightIdx);
+
+ QT3DSI32 shdwIdx = (inLights[lightIdx]->m_LightType
+ != RenderLightTypes::Directional)
+ ? numShadowCubes
+ : numShadowMaps;
+ SetShadowMaps(inProgram, theShadow, numShadowMaps, numShadowCubes,
+ inLights[lightIdx]->m_LightType == RenderLightTypes::Directional,
+ theShader.m_shadowMaps, theShader.m_shadowCubes);
+
+ if (inLights[lightIdx]->m_LightType == RenderLightTypes::Area) {
+ SShaderLightProperties *theAreaLightEntry =
+ SetLight(inProgram, lightIdx, areaLights, inLights[lightIdx], theShadow,
+ shdwIdx, inCamera.m_ClipFar);
+
+ if (theAreaLightEntry && pAreaLightCb) {
+ pAreaLightCb->UpdateRaw(
+ areaLights * sizeof(SLightSourceShader) + (4 * sizeof(QT3DSI32)),
+ NVDataRef<QT3DSU8>((QT3DSU8 *)&theAreaLightEntry->m_LightData,
+ sizeof(SLightSourceShader)));
+ }
+
+ areaLights++;
+ } else {
+ SShaderLightProperties *theLightEntry =
+ SetLight(inProgram, lightIdx, cgLights, inLights[lightIdx], theShadow,
+ shdwIdx, inCamera.m_ClipFar);
+
+ if (theLightEntry && pLightCb) {
+ pLightCb->UpdateRaw(
+ cgLights * sizeof(SLightSourceShader) + (4 * sizeof(QT3DSI32)),
+ NVDataRef<QT3DSU8>((QT3DSU8 *)&theLightEntry->m_LightData,
+ sizeof(SLightSourceShader)));
+ }
+
+ cgLights++;
+ }
+ }
+
+ if (pLightCb) {
+ pLightCb->UpdateRaw(0, NVDataRef<QT3DSU8>((QT3DSU8 *)&cgLights, sizeof(QT3DSI32)));
+ theShader.m_LightsBuffer.Set();
+ }
+ if (pAreaLightCb) {
+ pAreaLightCb->UpdateRaw(0, NVDataRef<QT3DSU8>((QT3DSU8 *)&areaLights,
+ sizeof(QT3DSI32)));
+ theShader.m_AreaLightsBuffer.Set();
+ }
+
+ theShader.m_LightCount.Set(cgLights);
+ theShader.m_AreaLightCount.Set(areaLights);
+ } else {
+ QVector<SShaderLightProperties *> lprop;
+ QVector<SShaderLightProperties *> alprop;
+ for (QT3DSU32 lightIdx = 0; lightIdx < inLights.size(); ++lightIdx) {
+
+ SShadowMapEntry *theShadow = NULL;
+ if (inShadowMaps && inLights[lightIdx]->m_CastShadow)
+ theShadow = inShadowMaps->GetShadowMapEntry(lightIdx);
+
+ QT3DSI32 shdwIdx = (inLights[lightIdx]->m_LightType
+ != RenderLightTypes::Directional)
+ ? numShadowCubes
+ : numShadowMaps;
+ SetShadowMaps(inProgram, theShadow, numShadowMaps, numShadowCubes,
+ inLights[lightIdx]->m_LightType == RenderLightTypes::Directional,
+ theShader.m_shadowMaps, theShader.m_shadowCubes);
+
+ SShaderLightProperties *p = SetLight(inProgram, lightIdx, areaLights,
+ inLights[lightIdx], theShadow,
+ shdwIdx, inCamera.m_ClipFar);
+ if (inLights[lightIdx]->m_LightType == RenderLightTypes::Area)
+ alprop.push_back(p);
+ else
+ lprop.push_back(p);
+ }
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *lightProperties
+ = theShader.GetLightProperties(lprop.size());
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *areaLightProperties
+ = theShader.GetAreaLightProperties(alprop.size());
+
+ lightProperties->updateLights(lprop);
+ areaLightProperties->updateLights(alprop);
+
+ theShader.m_LightCount.Set(lprop.size());
+ theShader.m_AreaLightCount.Set(alprop.size());
+ }
+ for (int i = numShadowMaps; i < QT3DS_MAX_NUM_SHADOWS; ++i)
+ theShader.m_shadowMaps.m_array[i] = NULL;
+ for (int i = numShadowCubes; i < QT3DS_MAX_NUM_SHADOWS; ++i)
+ theShader.m_shadowCubes.m_array[i] = NULL;
+ theShader.m_shadowMaps.Set(numShadowMaps);
+ theShader.m_shadowCubes.Set(numShadowCubes);
+ theShader.m_ShadowMapCount.Set(numShadowMaps);
+ theShader.m_ShadowCubeCount.Set(numShadowCubes);
+ }
+
+ void SetMaterialProperties(NVRenderShaderProgram &inProgram, const SCustomMaterial &inMaterial,
+ const QT3DSVec2 &, const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix, const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ NVRenderTexture2D *inDepthTexture, NVRenderTexture2D *inSSaoTexture,
+ SImage *inLightProbe, SImage *inLightProbe2, QT3DSF32 inProbeHorizon,
+ QT3DSF32 inProbeBright, QT3DSF32 inProbe2Window, QT3DSF32 inProbe2Pos,
+ QT3DSF32 inProbe2Fade, QT3DSF32 inProbeFOV)
+ {
+ ICustomMaterialSystem &theMaterialSystem(m_RenderContext.GetCustomMaterialSystem());
+ SShaderGeneratorGeneratedShader &theShader(GetShaderForProgram(inProgram));
+
+ theShader.m_ViewProjMatrix.Set(inModelViewProjection);
+ theShader.m_NormalMatrix.Set(inNormalMatrix);
+ theShader.m_ModelMatrix.Set(inGlobalTransform);
+
+ theShader.m_DepthTexture.Set(inDepthTexture);
+ theShader.m_AOTexture.Set(inSSaoTexture);
+
+ theShader.m_Opacity.Set(inOpacity);
+
+ qt3ds::render::SImage *theLightProbe = inLightProbe;
+ qt3ds::render::SImage *theLightProbe2 = inLightProbe2;
+
+ if (inMaterial.m_IblProbe && inMaterial.m_IblProbe->m_TextureData.m_Texture) {
+ theLightProbe = inMaterial.m_IblProbe;
+ }
+
+ if (theLightProbe) {
+ if (theLightProbe->m_TextureData.m_Texture) {
+ NVRenderTextureCoordOp::Enum theHorzLightProbeTilingMode =
+ theLightProbe->m_HorizontalTilingMode;
+ NVRenderTextureCoordOp::Enum theVertLightProbeTilingMode =
+ theLightProbe->m_VerticalTilingMode;
+ theLightProbe->m_TextureData.m_Texture->SetTextureWrapS(
+ theHorzLightProbeTilingMode);
+ theLightProbe->m_TextureData.m_Texture->SetTextureWrapT(
+ theVertLightProbeTilingMode);
+
+ const QT3DSMat44 &textureTransform = theLightProbe->m_TextureTransform;
+ // We separate rotational information from offset information so that just maybe the
+ // shader
+ // will attempt to push less information to the card.
+ const QT3DSF32 *dataPtr(textureTransform.front());
+ // The third member of the offsets contains a flag indicating if the texture was
+ // premultiplied or not.
+ // We use this to mix the texture alpha.
+ // light_probe_offsets.w is now no longer being used to enable/disable fast IBL,
+ // (it's now the only option)
+ // So now, it's storing the number of mip levels in the IBL image.
+ QT3DSVec4 offsets(dataPtr[12], dataPtr[13],
+ theLightProbe->m_TextureData.m_TextureFlags.IsPreMultiplied() ? 1.0f
+ : 0.0f,
+ (float)theLightProbe->m_TextureData.m_Texture->GetNumMipmaps());
+ // Fast IBL is always on;
+ // inRenderContext.m_Layer.m_FastIbl ? 1.0f : 0.0f );
+ // Grab just the upper 2x2 rotation matrix from the larger matrix.
+ QT3DSVec4 rotations(dataPtr[0], dataPtr[4], dataPtr[1], dataPtr[5]);
+
+ theShader.m_LightProbeRot.Set(rotations);
+ theShader.m_LightProbeOfs.Set(offsets);
+
+ if ((!inMaterial.m_IblProbe) && (inProbeFOV < 180.f)) {
+ theShader.m_LightProbeOpts.Set(
+ QT3DSVec4(0.01745329251994329547f * inProbeFOV, 0.0f, 0.0f, 0.0f));
+ }
+
+ // Also make sure to add the secondary texture, but it should only be added if the
+ // primary
+ // (i.e. background) texture is also there.
+ if (theLightProbe2 && theLightProbe2->m_TextureData.m_Texture) {
+ theLightProbe2->m_TextureData.m_Texture->SetTextureWrapS(
+ theHorzLightProbeTilingMode);
+ theLightProbe2->m_TextureData.m_Texture->SetTextureWrapT(
+ theVertLightProbeTilingMode);
+ theShader.m_LightProbe2.Set(theLightProbe2->m_TextureData.m_Texture);
+ theShader.m_LightProbe2Props.Set(
+ QT3DSVec4(inProbe2Window, inProbe2Pos, inProbe2Fade, 1.0f));
+
+ const QT3DSMat44 &xform2 = theLightProbe2->m_TextureTransform;
+ const QT3DSF32 *dataPtr(xform2.front());
+
+ theShader.m_LightProbeProps.Set(
+ QT3DSVec4(dataPtr[12], dataPtr[13], inProbeHorizon, inProbeBright * 0.01f));
+ } else {
+ theShader.m_LightProbe2Props.Set(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+ theShader.m_LightProbeProps.Set(
+ QT3DSVec4(0.0f, 0.0f, inProbeHorizon, inProbeBright * 0.01f));
+ }
+ } else {
+ theShader.m_LightProbeProps.Set(QT3DSVec4(0.0f, 0.0f, -1.0f, 0.0f));
+ theShader.m_LightProbe2Props.Set(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+ }
+
+ theShader.m_LightProbe.Set(theLightProbe->m_TextureData.m_Texture);
+
+ } else {
+ theShader.m_LightProbeProps.Set(QT3DSVec4(0.0f, 0.0f, -1.0f, 0.0f));
+ theShader.m_LightProbe2Props.Set(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+ }
+
+ // finally apply custom material shader properties
+ theMaterialSystem.ApplyShaderPropertyValues(inMaterial, inProgram);
+
+ // additional textures
+ for (SRenderableImage *theImage = inFirstImage; theImage; theImage = theImage->m_NextImage)
+ SetImageShaderVariables(theShader, *theImage);
+ }
+
+ void SetMaterialProperties(NVRenderShaderProgram &inProgram,
+ const SGraphObject &inMaterial, const QT3DSVec2 &inCameraVec,
+ const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix,
+ const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ SLayerGlobalRenderProperties inRenderProperties) override
+ {
+ const SCustomMaterial &theCustomMaterial(
+ reinterpret_cast<const SCustomMaterial &>(inMaterial));
+ QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::CustomMaterial);
+
+ SetGlobalProperties(inProgram, inRenderProperties.m_Layer, inRenderProperties.m_Camera,
+ inRenderProperties.m_CameraDirection, inRenderProperties.m_Lights,
+ inRenderProperties.m_LightDirections,
+ inRenderProperties.m_ShadowMapManager);
+
+ SetMaterialProperties(inProgram, theCustomMaterial, inCameraVec, inModelViewProjection,
+ inNormalMatrix, inGlobalTransform, inFirstImage, inOpacity,
+ inRenderProperties.m_DepthTexture, inRenderProperties.m_SSaoTexture,
+ inRenderProperties.m_LightProbe, inRenderProperties.m_LightProbe2,
+ inRenderProperties.m_ProbeHorizon, inRenderProperties.m_ProbeBright,
+ inRenderProperties.m_Probe2Window, inRenderProperties.m_Probe2Pos,
+ inRenderProperties.m_Probe2Fade, inRenderProperties.m_ProbeFOV);
+ }
+
+ void GenerateLightmapIndirectFunc(IShaderStageGenerator &inFragmentShader,
+ SImage *pEmissiveLightmap)
+ {
+ inFragmentShader << "\n";
+ inFragmentShader << "vec3 computeMaterialLightmapIndirect()\n{\n";
+ inFragmentShader << " vec4 indirect = vec4( 0.0, 0.0, 0.0, 0.0 );\n";
+ if (pEmissiveLightmap) {
+ SImageVariableNames names =
+ GetImageVariableNames(ConvertTextureTypeValue(ImageMapTypes::LightmapIndirect));
+ inFragmentShader.AddUniform(names.m_ImageSampler, "sampler2D");
+ inFragmentShader.AddUniform(m_ImageOffset, "vec3");
+ inFragmentShader.AddUniform(m_ImageRotScale, "vec4");
+
+ inFragmentShader << "\n indirect = evalIndirectLightmap( " << m_ImageSampler
+ << ", varTexCoord1, ";
+ inFragmentShader << m_ImageRotScale << ", ";
+ inFragmentShader << m_ImageOffset << " );\n\n";
+ }
+
+ inFragmentShader << " return indirect.rgb;\n";
+ inFragmentShader << "}\n\n";
+ }
+
+ void GenerateLightmapRadiosityFunc(IShaderStageGenerator &inFragmentShader,
+ SImage *pRadiosityLightmap)
+ {
+ inFragmentShader << "\n";
+ inFragmentShader << "vec3 computeMaterialLightmapRadiosity()\n{\n";
+ inFragmentShader << " vec4 radiosity = vec4( 1.0, 1.0, 1.0, 1.0 );\n";
+ if (pRadiosityLightmap) {
+ SImageVariableNames names =
+ GetImageVariableNames(ConvertTextureTypeValue(ImageMapTypes::LightmapRadiosity));
+ inFragmentShader.AddUniform(names.m_ImageSampler, "sampler2D");
+ inFragmentShader.AddUniform(m_ImageOffset, "vec3");
+ inFragmentShader.AddUniform(m_ImageRotScale, "vec4");
+
+ inFragmentShader << "\n radiosity = evalRadiosityLightmap( " << m_ImageSampler
+ << ", varTexCoord1, ";
+ inFragmentShader << m_ImageRotScale << ", ";
+ inFragmentShader << m_ImageOffset << " );\n\n";
+ }
+
+ inFragmentShader << " return radiosity.rgb;\n";
+ inFragmentShader << "}\n\n";
+ }
+
+ void GenerateLightmapShadowFunc(IShaderStageGenerator &inFragmentShader,
+ SImage *pBakedShadowMap)
+ {
+ inFragmentShader << "\n";
+ inFragmentShader << "vec4 computeMaterialLightmapShadow()\n{\n";
+ inFragmentShader << " vec4 shadowMask = vec4( 1.0, 1.0, 1.0, 1.0 );\n";
+ if (pBakedShadowMap) {
+ SImageVariableNames names =
+ GetImageVariableNames((QT3DSU32)NVRenderTextureTypeValue::LightmapShadow);
+ // Add uniforms
+ inFragmentShader.AddUniform(names.m_ImageSampler, "sampler2D");
+ inFragmentShader.AddUniform(m_ImageOffset, "vec3");
+ inFragmentShader.AddUniform(m_ImageRotScale, "vec4");
+
+ inFragmentShader << "\n shadowMask = evalShadowLightmap( " << m_ImageSampler
+ << ", texCoord0, ";
+ inFragmentShader << m_ImageRotScale << ", ";
+ inFragmentShader << m_ImageOffset << " );\n\n";
+ }
+
+ inFragmentShader << " return shadowMask;\n";
+ inFragmentShader << "}\n\n";
+ }
+
+ void GenerateLightmapIndirectSetupCode(IShaderStageGenerator &inFragmentShader,
+ SRenderableImage *pIndirectLightmap,
+ SRenderableImage *pRadiosityLightmap)
+ {
+ if (!pIndirectLightmap && !pRadiosityLightmap)
+ return;
+
+ eastl::string finalValue;
+
+ inFragmentShader << "\n";
+ inFragmentShader << "void initializeLayerVariablesWithLightmap(void)\n{\n";
+ if (pIndirectLightmap) {
+ inFragmentShader
+ << " vec3 lightmapIndirectValue = computeMaterialLightmapIndirect( );\n";
+ finalValue.append("vec4(lightmapIndirectValue, 1.0)");
+ }
+ if (pRadiosityLightmap) {
+ inFragmentShader
+ << " vec3 lightmapRadisoityValue = computeMaterialLightmapRadiosity( );\n";
+ if (finalValue.empty())
+ finalValue.append("vec4(lightmapRadisoityValue, 1.0)");
+ else
+ finalValue.append(" + vec4(lightmapRadisoityValue, 1.0)");
+ }
+
+ finalValue.append(";\n");
+
+ char buf[16];
+ for (QT3DSU32 idx = 0; idx < Material().m_LayerCount; idx++) {
+ _snprintf(buf, 16, "[%d]", idx);
+ inFragmentShader << " layers" << buf << ".base += " << finalValue.c_str();
+ inFragmentShader << " layers" << buf << ".layer += " << finalValue.c_str();
+ }
+
+ inFragmentShader << "}\n\n";
+ }
+
+ void GenerateLightmapShadowCode(IShaderStageGenerator &inFragmentShader,
+ SRenderableImage *pBakedShadowMap)
+ {
+ if (pBakedShadowMap) {
+ inFragmentShader << " tmpShadowTerm *= computeMaterialLightmapShadow( );\n\n";
+ }
+ }
+
+ void ApplyEmissiveMask(IShaderStageGenerator &inFragmentShader, SImage *pEmissiveMaskMap)
+ {
+ inFragmentShader << "\n";
+ inFragmentShader << "vec3 computeMaterialEmissiveMask()\n{\n";
+ inFragmentShader << " vec3 emissiveMask = vec3( 1.0, 1.0, 1.0 );\n";
+ if (pEmissiveMaskMap) {
+ inFragmentShader << " texture_coordinate_info tci;\n";
+ inFragmentShader << " texture_coordinate_info transformed_tci;\n";
+ inFragmentShader << " tci = textureCoordinateInfo( texCoord0, tangent, binormal );\n";
+ inFragmentShader << " transformed_tci = transformCoordinate( "
+ "rotationTranslationScale( vec3( 0.000000, 0.000000, 0.000000 ), ";
+ inFragmentShader << "vec3( 0.000000, 0.000000, 0.000000 ), vec3( 1.000000, 1.000000, "
+ "1.000000 ) ), tci );\n";
+ inFragmentShader << " emissiveMask = fileTexture( "
+ << pEmissiveMaskMap->m_ImageShaderName.c_str()
+ << ", vec3( 0, 0, 0 ), vec3( 1, 1, 1 ), mono_alpha, transformed_tci, ";
+ inFragmentShader << "vec2( 0.000000, 1.000000 ), vec2( 0.000000, 1.000000 ), "
+ "wrap_repeat, wrap_repeat, gamma_default ).tint;\n";
+ }
+
+ inFragmentShader << " return emissiveMask;\n";
+ inFragmentShader << "}\n\n";
+ }
+
+ // Returns true if custom shader provides main function
+ bool GenerateFragmentShader(SShaderDefaultMaterialKey &, const char8_t *inShaderPathName,
+ bool hasCustomVertexShader)
+ {
+ qt3ds::render::IDynamicObjectSystem &theDynamicSystem(
+ m_RenderContext.GetDynamicObjectSystem());
+ Qt3DSString theShaderBuffer;
+ theDynamicSystem.GetShaderSource(
+ m_RenderContext.GetStringTable().RegisterStr(inShaderPathName), theShaderBuffer);
+
+ QT3DS_ASSERT(theShaderBuffer.size() > 0);
+
+ // light maps
+ bool hasLightmaps = false;
+ SRenderableImage *lightmapShadowImage = NULL;
+ SRenderableImage *lightmapIndirectImage = NULL;
+ SRenderableImage *lightmapRadisoityImage = NULL;
+
+ for (SRenderableImage *img = m_FirstImage; img != NULL; img = img->m_NextImage) {
+ if (img->m_MapType == ImageMapTypes::LightmapIndirect) {
+ lightmapIndirectImage = img;
+ hasLightmaps = true;
+ } else if (img->m_MapType == ImageMapTypes::LightmapRadiosity) {
+ lightmapRadisoityImage = img;
+ hasLightmaps = true;
+ } else if (img->m_MapType == ImageMapTypes::LightmapShadow) {
+ lightmapShadowImage = img;
+ }
+ }
+
+ if (!hasCustomVertexShader) {
+ VertexGenerator().GenerateUVCoords(0);
+ // for lightmaps we expect a second set of uv coordinates
+ if (hasLightmaps)
+ VertexGenerator().GenerateUVCoords(1);
+ }
+
+ IDefaultMaterialVertexPipeline &vertexShader(VertexGenerator());
+ IShaderStageGenerator &fragmentShader(FragmentGenerator());
+
+ eastl::string srcString(theShaderBuffer.c_str());
+
+ if (m_RenderContext.GetRenderContext().GetRenderContextType()
+ == NVRenderContextValues::GLES2) {
+ eastl::string::size_type pos = 0;
+ while ((pos = srcString.find("out vec4 fragColor", pos)) != eastl::string::npos) {
+ srcString.insert(pos, "//");
+ pos += int(strlen("//out vec4 fragColor"));
+ }
+ }
+
+ fragmentShader << "#define FRAGMENT_SHADER\n\n";
+
+ // Check if the fragment shader portion already contains a main function
+ // The same string contains both the vertex and the fragment shader
+ // The last "#ifdef FRAGMENT_SHADER" should mark the start of the fragment shader
+ eastl_size_t fragmentDefStart = srcString.find("#ifdef FRAGMENT_SHADER");
+ eastl_size_t nextIndex = fragmentDefStart;
+ while (nextIndex != eastl::string::npos) {
+ nextIndex = srcString.find("#ifdef FRAGMENT_SHADER", nextIndex + 1);
+ if (nextIndex != eastl::string::npos)
+ fragmentDefStart = nextIndex;
+ }
+ if (fragmentDefStart == eastl::string::npos)
+ return false;
+
+ eastl_size_t mainStart = srcString.find("void main()");
+ if (mainStart != eastl::string::npos && mainStart < fragmentDefStart)
+ mainStart = srcString.find("void main()", mainStart + 1);
+
+ bool hasCustomFragmentShader = mainStart != eastl::string::npos;
+
+ if (!hasCustomFragmentShader)
+ fragmentShader.AddInclude("evalLightmaps.glsllib");
+
+ // check dielectric materials
+ if (!Material().IsDielectric())
+ fragmentShader << "#define MATERIAL_IS_NON_DIELECTRIC 1\n\n";
+ else
+ fragmentShader << "#define MATERIAL_IS_NON_DIELECTRIC 0\n\n";
+
+ fragmentShader << "#define QT3DS_ENABLE_RNM 0\n\n";
+
+ fragmentShader << srcString.data() << Endl;
+
+ if (hasCustomFragmentShader) {
+ fragmentShader << "#define FRAGMENT_SHADER\n\n";
+ if (!hasCustomVertexShader) {
+ vertexShader.GenerateWorldNormal();
+ vertexShader.GenerateVarTangentAndBinormal();
+ vertexShader.GenerateWorldPosition();
+
+ vertexShader.GenerateViewVector();
+ }
+ return true;
+ }
+
+ if (Material().HasLighting() && lightmapIndirectImage) {
+ GenerateLightmapIndirectFunc(fragmentShader, &lightmapIndirectImage->m_Image);
+ }
+ if (Material().HasLighting() && lightmapRadisoityImage) {
+ GenerateLightmapRadiosityFunc(fragmentShader, &lightmapRadisoityImage->m_Image);
+ }
+ if (Material().HasLighting() && lightmapShadowImage) {
+ GenerateLightmapShadowFunc(fragmentShader, &lightmapShadowImage->m_Image);
+ }
+
+ if (Material().HasLighting() && (lightmapIndirectImage || lightmapRadisoityImage))
+ GenerateLightmapIndirectSetupCode(fragmentShader, lightmapIndirectImage,
+ lightmapRadisoityImage);
+
+ if (Material().HasLighting()) {
+ ApplyEmissiveMask(fragmentShader, Material().m_EmissiveMap2);
+ }
+
+ // setup main
+ VertexGenerator().BeginFragmentGeneration();
+
+ // since we do pixel lighting we always need this if lighting is enabled
+ // We write this here because the functions below may also write to
+ // the fragment shader
+ if (Material().HasLighting()) {
+ vertexShader.GenerateWorldNormal();
+ vertexShader.GenerateVarTangentAndBinormal();
+ vertexShader.GenerateWorldPosition();
+
+ if (Material().IsSpecularEnabled())
+ vertexShader.GenerateViewVector();
+ }
+
+ fragmentShader << " initializeBaseFragmentVariables();" << Endl;
+ fragmentShader << " computeTemporaries();" << Endl;
+ fragmentShader << " normal = normalize( computeNormal() );" << Endl;
+ fragmentShader << " initializeLayerVariables();" << Endl;
+ fragmentShader << " float alpha = clamp( evalCutout(), 0.0, 1.0 );" << Endl;
+
+ if (Material().IsCutOutEnabled()) {
+ fragmentShader << " if ( alpha <= 0.0f )" << Endl;
+ fragmentShader << " discard;" << Endl;
+ }
+
+ // indirect / direct lightmap init
+ if (Material().HasLighting() && (lightmapIndirectImage || lightmapRadisoityImage))
+ fragmentShader << " initializeLayerVariablesWithLightmap();" << Endl;
+
+ // shadow map
+ GenerateLightmapShadowCode(fragmentShader, lightmapShadowImage);
+
+ // main Body
+ fragmentShader << "#include \"customMaterialFragBodyAO.glsllib\"" << Endl;
+
+ // for us right now transparency means we render a glass style material
+ if (m_HasTransparency && !Material().IsTransmissive())
+ fragmentShader << " rgba = computeGlass( normal, materialIOR, alpha, rgba );" << Endl;
+ if (Material().IsTransmissive())
+ fragmentShader << " rgba = computeOpacity( rgba );" << Endl;
+
+ if (VertexGenerator().HasActiveWireframe()) {
+ fragmentShader.Append("vec3 edgeDistance = varEdgeDistance * gl_FragCoord.w;");
+ fragmentShader.Append(
+ "\tfloat d = min(min(edgeDistance.x, edgeDistance.y), edgeDistance.z);");
+ fragmentShader.Append("\tfloat mixVal = smoothstep(0.0, 1.0, d);"); // line width 1.0
+
+ fragmentShader.Append("\trgba = mix( vec4(0.0, 1.0, 0.0, 1.0), rgba, mixVal);");
+ }
+ fragmentShader << " rgba.a *= object_opacity;" << Endl;
+ if (m_RenderContext.GetRenderContext().GetRenderContextType()
+ == NVRenderContextValues::GLES2)
+ fragmentShader << " gl_FragColor = rgba;" << Endl;
+ else
+ fragmentShader << " fragColor = rgba;" << Endl;
+ return false;
+ }
+
+ NVRenderShaderProgram *GenerateCustomMaterialShader(const char8_t *inShaderPrefix,
+ const char8_t *inCustomMaterialName)
+ {
+ // build a string that allows us to print out the shader we are generating to the log.
+ // This is time consuming but I feel like it doesn't happen all that often and is very
+ // useful to users
+ // looking at the log file.
+ m_GeneratedShaderString.clear();
+ m_GeneratedShaderString.assign(nonNull(inShaderPrefix));
+ m_GeneratedShaderString.append(inCustomMaterialName);
+ SShaderDefaultMaterialKey theKey(Key());
+ theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties);
+
+ bool hasCustomVertexShader = GenerateVertexShader(theKey, inCustomMaterialName);
+ bool hasCustomFragmentShader = GenerateFragmentShader(theKey, inCustomMaterialName,
+ hasCustomVertexShader);
+
+ VertexGenerator().EndVertexGeneration(hasCustomVertexShader);
+ VertexGenerator().EndFragmentGeneration(hasCustomFragmentShader);
+
+ NVRenderShaderProgram *program = ProgramGenerator().CompileGeneratedShader(
+ m_GeneratedShaderString.c_str(), SShaderCacheProgramFlags(), FeatureSet());
+ if (program && hasCustomVertexShader) {
+ // Change uniforms names to match runtime 2.x uniforms
+ SShaderGeneratorGeneratedShader &shader(GetShaderForProgram(*program));
+ shader.m_ModelMatrix = NVRenderCachedShaderProperty<QT3DSMat44>("modelMatrix",
+ *program);
+ shader.m_ViewProjMatrix = NVRenderCachedShaderProperty<QT3DSMat44>(
+ "modelViewProjection", *program);
+ shader.m_ViewMatrix = NVRenderCachedShaderProperty<QT3DSMat44>("viewMatrix", *program);
+ shader.m_NormalMatrix = NVRenderCachedShaderProperty<QT3DSMat33>("modelNormalMatrix",
+ *program);
+ shader.m_ProjMatrix = NVRenderCachedShaderProperty<QT3DSMat44>("viewProjectionMatrix",
+ *program);
+ shader.m_ViewportMatrix = NVRenderCachedShaderProperty<QT3DSMat44>("viewportMatrix",
+ *program);
+ shader.m_CameraPos = NVRenderCachedShaderProperty<QT3DSVec3>("eyePosition", *program);
+ }
+ return program;
+ }
+
+ virtual NVRenderShaderProgram *
+ GenerateShader(const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ NVDataRef<SLight *> inLights, SRenderableImage *inFirstImage,
+ bool inHasTransparency, const char8_t *inShaderPrefix,
+ const char8_t *inCustomMaterialName) override
+ {
+ QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::CustomMaterial);
+ m_CurrentMaterial = reinterpret_cast<const SCustomMaterial *>(&inMaterial);
+ m_CurrentKey = &inShaderDescription;
+ m_CurrentPipeline = static_cast<IDefaultMaterialVertexPipeline *>(&inVertexPipeline);
+ m_CurrentFeatureSet = inFeatureSet;
+ m_Lights = inLights;
+ m_FirstImage = inFirstImage;
+ m_HasTransparency = inHasTransparency;
+
+ return GenerateCustomMaterialShader(inShaderPrefix, inCustomMaterialName);
+ }
+};
+}
+
+ICustomMaterialShaderGenerator &
+ICustomMaterialShaderGenerator::CreateCustomMaterialShaderGenerator(IQt3DSRenderContext &inRc)
+{
+ return *QT3DS_NEW(inRc.GetAllocator(), SShaderGenerator)(inRc);
+}
diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.h b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.h
new file mode 100644
index 0000000..44e2c06
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CUSTOM_MATERIAL_SHADER_GENERATOR_H
+#define QT3DS_RENDER_CUSTOM_MATERIAL_SHADER_GENERATOR_H
+#include "Qt3DSRenderMaterialShaderGenerator.h"
+
+namespace qt3ds {
+namespace render {
+
+ class Qt3DSShadowMap;
+
+ class ICustomMaterialShaderGenerator : public IMaterialShaderGenerator
+ {
+ public:
+ SImageVariableNames GetImageVariableNames(QT3DSU32 inIdx) override = 0;
+ void GenerateImageUVCoordinates(IShaderStageGenerator &inVertexPipeline, QT3DSU32 idx,
+ QT3DSU32 uvSet, SRenderableImage &image) override = 0;
+
+ // inPipelineName needs to be unique else the shader cache will just return shaders from
+ // different pipelines.
+ NVRenderShaderProgram *GenerateShader(
+ const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ NVDataRef<SLight *> inLights, SRenderableImage *inFirstImage, bool inHasTransparency,
+ const char8_t *inVertexPipelineName, const char8_t *inCustomMaterialName = "") override = 0;
+
+ // Also sets the blend function on the render context.
+ virtual void
+ SetMaterialProperties(NVRenderShaderProgram &inProgram, const SGraphObject &inMaterial,
+ const QT3DSVec2 &inCameraVec, const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix, const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ SLayerGlobalRenderProperties inRenderProperties) override = 0;
+
+ static ICustomMaterialShaderGenerator &
+ CreateCustomMaterialShaderGenerator(IQt3DSRenderContext &inRenderContext);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
new file mode 100644
index 0000000..aaf799f
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.cpp
@@ -0,0 +1,2131 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderCustomMaterialRenderContext.h"
+#include "Qt3DSRenderContextCore.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSRenderCustomMaterial.h"
+#include "Qt3DSRenderDynamicObjectSystemCommands.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "Qt3DSRenderMesh.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderLayer.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "render/Qt3DSRenderComputeShader.h"
+#include "foundation/PreAllocatedAllocator.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/Qt3DSTime.h"
+#include "Qt3DSRenderDynamicObjectSystemUtil.h"
+#include "Qt3DSRenderableImage.h"
+#include "rendererimpl/Qt3DSVertexPipelineImpl.h"
+#include "rendererimpl/Qt3DSRendererImplLayerRenderData.h"
+#include "Qt3DSRenderCustomMaterialShaderGenerator.h"
+#include "Qt3DSRenderModel.h"
+#include "Qt3DSOffscreenRenderKey.h"
+
+using namespace qt3ds::render;
+using namespace qt3ds::render::dynamic;
+using qt3ds::render::NVRenderContextScopedProperty;
+using qt3ds::render::NVRenderCachedShaderProperty;
+using qt3ds::render::NVRenderCachedShaderBuffer;
+
+SCustomMaterialVertexPipeline::SCustomMaterialVertexPipeline(IQt3DSRenderContext *inContext,
+ TessModeValues::Enum inTessMode)
+ : SVertexPipelineImpl(
+ inContext->GetAllocator(), inContext->GetCustomMaterialShaderGenerator(),
+ inContext->GetShaderProgramGenerator(), inContext->GetStringTable(), false)
+ , m_Context(inContext)
+ , m_TessMode(TessModeValues::NoTess)
+{
+ if (m_Context->GetRenderContext().IsTessellationSupported()) {
+ m_TessMode = inTessMode;
+ }
+
+ if (m_Context->GetRenderContext().IsGeometryStageSupported()
+ && m_TessMode != TessModeValues::NoTess) {
+ m_Wireframe = inContext->GetWireframeMode();
+ }
+}
+
+void SCustomMaterialVertexPipeline::InitializeTessControlShader()
+{
+ if (m_TessMode == TessModeValues::NoTess
+ || ProgramGenerator().GetStage(ShaderGeneratorStages::TessControl) == NULL) {
+ return;
+ }
+
+ IShaderStageGenerator &tessCtrlShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+
+ SetupTessIncludes(ShaderGeneratorStages::TessControl, m_TessMode);
+
+ tessCtrlShader.Append("void main() {\n");
+
+ tessCtrlShader.Append("\tctWorldPos[0] = varWorldPos[0];");
+ tessCtrlShader.Append("\tctWorldPos[1] = varWorldPos[1];");
+ tessCtrlShader.Append("\tctWorldPos[2] = varWorldPos[2];");
+
+ if (m_TessMode == TessModeValues::TessPhong || m_TessMode == TessModeValues::TessNPatch) {
+ tessCtrlShader.Append("\tctNorm[0] = varObjectNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = varObjectNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = varObjectNormal[2];");
+ }
+ if (m_TessMode == TessModeValues::TessNPatch) {
+ tessCtrlShader.Append("\tctTangent[0] = varObjTangent[0];");
+ tessCtrlShader.Append("\tctTangent[1] = varObjTangent[1];");
+ tessCtrlShader.Append("\tctTangent[2] = varObjTangent[2];");
+ }
+
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+}
+
+void SCustomMaterialVertexPipeline::InitializeTessEvaluationShader()
+{
+ if (m_TessMode == TessModeValues::NoTess
+ || ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval) == NULL) {
+ return;
+ }
+
+ IShaderStageGenerator &tessEvalShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddUniform("normal_matrix", "mat3");
+
+ SetupTessIncludes(ShaderGeneratorStages::TessEval, m_TessMode);
+
+ if (m_TessMode == TessModeValues::TessLinear && m_DisplacementImage) {
+ tessEvalShader.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+ tessEvalShader.AddUniform("model_matrix", "mat4");
+ tessEvalShader.AddUniform("displace_tiling", "vec3");
+ tessEvalShader.AddUniform("displaceAmount", "float");
+ tessEvalShader.AddUniform(m_DisplacementImage->m_Image.m_ImageShaderName.c_str(),
+ "sampler2D");
+ }
+
+ tessEvalShader.Append("void main() {");
+
+ if (m_TessMode == TessModeValues::TessNPatch) {
+ tessEvalShader.Append("\tctNorm[0] = varObjectNormalTC[0];");
+ tessEvalShader.Append("\tctNorm[1] = varObjectNormalTC[1];");
+ tessEvalShader.Append("\tctNorm[2] = varObjectNormalTC[2];");
+
+ tessEvalShader.Append("\tctTangent[0] = varTangentTC[0];");
+ tessEvalShader.Append("\tctTangent[1] = varTangentTC[1];");
+ tessEvalShader.Append("\tctTangent[2] = varTangentTC[2];");
+ }
+
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+}
+
+void SCustomMaterialVertexPipeline::FinalizeTessControlShader()
+{
+ IShaderStageGenerator &tessCtrlShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ // add varyings we must pass through
+ typedef TStrTableStrMap::const_iterator TParamIter;
+ for (TParamIter iter = m_InterpolationParameters.begin(),
+ end = m_InterpolationParameters.end();
+ iter != end; ++iter) {
+ tessCtrlShader << "\t" << iter->first.c_str()
+ << "TC[gl_InvocationID] = " << iter->first.c_str()
+ << "[gl_InvocationID];\n";
+ }
+}
+
+void SCustomMaterialVertexPipeline::FinalizeTessEvaluationShader()
+{
+ IShaderStageGenerator &tessEvalShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+
+ eastl::string outExt("");
+ if (ProgramGenerator().GetEnabledStages() & ShaderGeneratorStages::Geometry)
+ outExt = "TE";
+
+ // add varyings we must pass through
+ typedef TStrTableStrMap::const_iterator TParamIter;
+ if (m_TessMode == TessModeValues::TessNPatch) {
+ for (TParamIter iter = m_InterpolationParameters.begin(),
+ end = m_InterpolationParameters.end();
+ iter != end; ++iter) {
+ tessEvalShader << "\t" << iter->first.c_str() << outExt.c_str()
+ << " = gl_TessCoord.z * " << iter->first.c_str() << "TC[0] + ";
+ tessEvalShader << "gl_TessCoord.x * " << iter->first.c_str() << "TC[1] + ";
+ tessEvalShader << "gl_TessCoord.y * " << iter->first.c_str() << "TC[2];\n";
+ }
+
+ // transform the normal
+ if (m_GenerationFlags & GenerationFlagValues::WorldNormal)
+ tessEvalShader << "\n\tvarNormal" << outExt.c_str()
+ << " = normalize(normal_matrix * teNorm);\n";
+ // transform the tangent
+ if (m_GenerationFlags & GenerationFlagValues::TangentBinormal) {
+ tessEvalShader << "\n\tvarTangent" << outExt.c_str()
+ << " = normalize(normal_matrix * teTangent);\n";
+ // transform the binormal
+ tessEvalShader << "\n\tvarBinormal" << outExt.c_str()
+ << " = normalize(normal_matrix * teBinormal);\n";
+ }
+ } else {
+ for (TParamIter iter = m_InterpolationParameters.begin(),
+ end = m_InterpolationParameters.end();
+ iter != end; ++iter) {
+ tessEvalShader << "\t" << iter->first.c_str() << outExt.c_str()
+ << " = gl_TessCoord.x * " << iter->first.c_str() << "TC[0] + ";
+ tessEvalShader << "gl_TessCoord.y * " << iter->first.c_str() << "TC[1] + ";
+ tessEvalShader << "gl_TessCoord.z * " << iter->first.c_str() << "TC[2];\n";
+ }
+
+ // displacement mapping makes only sense with linear tessellation
+ if (m_TessMode == TessModeValues::TessLinear && m_DisplacementImage) {
+ tessEvalShader
+ << "\ttexture_coordinate_info tmp = textureCoordinateInfo( varTexCoord0"
+ << outExt.c_str() << ", varTangent" << outExt.c_str() << ", varBinormal"
+ << outExt.c_str() << " );" << Endl;
+ tessEvalShader << "\ttmp = transformCoordinate( rotationTranslationScale( vec3( "
+ "0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, "
+ "0.000000 ), displace_tiling ), tmp);"
+ << Endl;
+
+ tessEvalShader << "\tpos.xyz = defaultMaterialFileDisplacementTexture( "
+ << m_DisplacementImage->m_Image.m_ImageShaderName.c_str()
+ << ", displaceAmount, "
+ << "tmp.position.xy";
+ tessEvalShader << ", varObjectNormal" << outExt.c_str() << ", pos.xyz );" << Endl;
+ tessEvalShader << "\tvarWorldPos" << outExt.c_str() << "= (model_matrix * pos).xyz;"
+ << Endl;
+ }
+
+ // transform the normal
+ tessEvalShader << "\n\tvarNormal" << outExt.c_str()
+ << " = normalize(normal_matrix * varObjectNormal" << outExt.c_str()
+ << ");\n";
+ }
+
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;\n");
+}
+
+// Responsible for beginning all vertex and fragment generation (void main() { etc).
+void SCustomMaterialVertexPipeline::BeginVertexGeneration(QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage)
+{
+ m_DisplacementIdx = displacementImageIdx;
+ m_DisplacementImage = displacementImage;
+
+ TShaderGeneratorStageFlags theStages(IShaderProgramGenerator::DefaultFlags());
+
+ if (m_TessMode != TessModeValues::NoTess) {
+ theStages |= ShaderGeneratorStages::TessControl;
+ theStages |= ShaderGeneratorStages::TessEval;
+ }
+ if (m_Wireframe) {
+ theStages |= ShaderGeneratorStages::Geometry;
+ }
+
+ ProgramGenerator().BeginProgram(theStages);
+
+ if (m_TessMode != TessModeValues::NoTess) {
+ InitializeTessControlShader();
+ InitializeTessEvaluationShader();
+ }
+ if (m_Wireframe) {
+ InitializeWireframeGeometryShader();
+ }
+
+ IShaderStageGenerator &vertexShader(Vertex());
+
+ // thinks we need
+ vertexShader.AddInclude("viewProperties.glsllib");
+ vertexShader.AddInclude("customMaterial.glsllib");
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader << "void main()" << Endl << "{" << Endl;
+
+ if (displacementImage) {
+ GenerateUVCoords(0);
+ if (!HasTessellation()) {
+ vertexShader.AddUniform("displaceAmount", "float");
+ vertexShader.AddUniform("displace_tiling", "vec3");
+ // we create the world position setup here
+ // because it will be replaced with the displaced position
+ SetCode(GenerationFlagValues::WorldPosition);
+ vertexShader.AddUniform("model_matrix", "mat4");
+
+ vertexShader.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+ vertexShader.AddUniform(displacementImage->m_Image.m_ImageShaderName.c_str(),
+ "sampler2D");
+
+ vertexShader << "\ttexture_coordinate_info tmp = textureCoordinateInfo( texCoord0, "
+ "varTangent, varBinormal );"
+ << Endl;
+ vertexShader << "\ttmp = transformCoordinate( rotationTranslationScale( vec3( "
+ "0.000000, 0.000000, 0.000000 ), vec3( 0.000000, 0.000000, "
+ "0.000000 ), displace_tiling ), tmp);"
+ << Endl;
+
+ vertexShader << "\tvec3 displacedPos = defaultMaterialFileDisplacementTexture( "
+ << displacementImage->m_Image.m_ImageShaderName.c_str()
+ << ", displaceAmount, "
+ << "tmp.position.xy"
+ << ", attr_norm, attr_pos );" << Endl;
+
+ AddInterpolationParameter("varWorldPos", "vec3");
+ vertexShader.Append("\tvec3 local_model_world_position = (model_matrix * "
+ "vec4(displacedPos, 1.0)).xyz;");
+ AssignOutput("varWorldPos", "local_model_world_position");
+ }
+ }
+
+ if (HasTessellation()) {
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ } else {
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ if (displacementImage)
+ vertexShader.Append(
+ "\tgl_Position = model_view_projection * vec4(displacedPos, 1.0);");
+ else
+ vertexShader.Append("\tgl_Position = model_view_projection * vec4(attr_pos, 1.0);");
+ }
+
+ if (HasTessellation()) {
+ GenerateWorldPosition();
+ GenerateWorldNormal();
+ GenerateObjectNormal();
+ GenerateVarTangentAndBinormal();
+ }
+}
+
+void SCustomMaterialVertexPipeline::BeginFragmentGeneration()
+{
+ Fragment().AddUniform("object_opacity", "float");
+ Fragment() << "void main()" << Endl << "{" << Endl;
+}
+
+void SCustomMaterialVertexPipeline::AssignOutput(const char8_t *inVarName,
+ const char8_t *inVarValue)
+{
+ Vertex() << "\t" << inVarName << " = " << inVarValue << ";\n";
+}
+
+void SCustomMaterialVertexPipeline::GenerateUVCoords(QT3DSU32 inUVSet)
+{
+ if (inUVSet == 0 && SetCode(GenerationFlagValues::UVCoords))
+ return;
+ if (inUVSet == 1 && SetCode(GenerationFlagValues::UVCoords1))
+ return;
+
+ QT3DS_ASSERT(inUVSet == 0 || inUVSet == 1);
+
+ if (inUVSet == 0)
+ AddInterpolationParameter("varTexCoord0", "vec3");
+ else if (inUVSet == 1)
+ AddInterpolationParameter("varTexCoord1", "vec3");
+
+ DoGenerateUVCoords(inUVSet);
+}
+
+void SCustomMaterialVertexPipeline::GenerateWorldNormal()
+{
+ if (SetCode(GenerationFlagValues::WorldNormal))
+ return;
+ AddInterpolationParameter("varNormal", "vec3");
+ DoGenerateWorldNormal();
+}
+
+void SCustomMaterialVertexPipeline::GenerateObjectNormal()
+{
+ if (SetCode(GenerationFlagValues::ObjectNormal))
+ return;
+ DoGenerateObjectNormal();
+}
+
+void SCustomMaterialVertexPipeline::GenerateVarTangentAndBinormal()
+{
+ if (SetCode(GenerationFlagValues::TangentBinormal))
+ return;
+ AddInterpolationParameter("varTangent", "vec3");
+ AddInterpolationParameter("varBinormal", "vec3");
+ AddInterpolationParameter("varObjTangent", "vec3");
+ AddInterpolationParameter("varObjBinormal", "vec3");
+ DoGenerateVarTangentAndBinormal();
+}
+
+void SCustomMaterialVertexPipeline::GenerateWorldPosition()
+{
+ if (SetCode(GenerationFlagValues::WorldPosition))
+ return;
+
+ ActiveStage().AddUniform("model_matrix", "mat4");
+ AddInterpolationParameter("varWorldPos", "vec3");
+ AddInterpolationParameter("varObjPos", "vec3");
+ DoGenerateWorldPosition();
+}
+
+// responsible for closing all vertex and fragment generation
+void SCustomMaterialVertexPipeline::EndVertexGeneration(bool customShader)
+{
+ if (HasTessellation()) {
+ // finalize tess control shader
+ FinalizeTessControlShader();
+ // finalize tess evaluation shader
+ FinalizeTessEvaluationShader();
+
+ TessControl().Append("}");
+ TessEval().Append("}");
+
+ if (m_Wireframe) {
+ // finalize geometry shader
+ FinalizeWireframeGeometryShader();
+ Geometry().Append("}");
+ }
+ }
+
+ if (!customShader)
+ Vertex().Append("}");
+}
+
+void SCustomMaterialVertexPipeline::EndFragmentGeneration(bool customShader)
+{
+ if (!customShader)
+ Fragment().Append("}");
+}
+
+IShaderStageGenerator &SCustomMaterialVertexPipeline::ActiveStage()
+{
+ return Vertex();
+}
+
+void SCustomMaterialVertexPipeline::AddInterpolationParameter(const char8_t *inName,
+ const char8_t *inType)
+{
+ m_InterpolationParameters.insert(eastl::make_pair(Str(inName), Str(inType)));
+ Vertex().AddOutgoing(inName, inType);
+ Fragment().AddIncoming(inName, inType);
+
+ if (HasTessellation()) {
+ eastl::string nameBuilder(inName);
+ nameBuilder.append("TC");
+ TessControl().AddOutgoing(nameBuilder.c_str(), inType);
+
+ nameBuilder.assign(inName);
+ if (ProgramGenerator().GetEnabledStages() & ShaderGeneratorStages::Geometry) {
+ nameBuilder.append("TE");
+ Geometry().AddOutgoing(inName, inType);
+ }
+ TessEval().AddOutgoing(nameBuilder.c_str(), inType);
+ }
+}
+
+void SCustomMaterialVertexPipeline::DoGenerateUVCoords(QT3DSU32 inUVSet)
+{
+ QT3DS_ASSERT(inUVSet == 0 || inUVSet == 1);
+
+ if (inUVSet == 0) {
+ Vertex().AddIncoming("attr_uv0", "vec2");
+ Vertex() << "\tvec3 texCoord0 = vec3( attr_uv0, 0.0 );" << Endl;
+ AssignOutput("varTexCoord0", "texCoord0");
+ } else if (inUVSet == 1) {
+ Vertex().AddIncoming("attr_uv1", "vec2");
+ Vertex() << "\tvec3 texCoord1 = vec3( attr_uv1, 1.0 );" << Endl;
+ AssignOutput("varTexCoord1", "texCoord1");
+ }
+}
+
+void SCustomMaterialVertexPipeline::DoGenerateWorldNormal()
+{
+ IShaderStageGenerator &vertexGenerator(Vertex());
+ vertexGenerator.AddIncoming("attr_norm", "vec3");
+ vertexGenerator.AddUniform("normal_matrix", "mat3");
+
+ if (HasTessellation() == false) {
+ Vertex().Append("\tvarNormal = normalize( normal_matrix * attr_norm );");
+ }
+}
+
+void SCustomMaterialVertexPipeline::DoGenerateObjectNormal()
+{
+ AddInterpolationParameter("varObjectNormal", "vec3");
+ Vertex().Append("\tvarObjectNormal = attr_norm;");
+}
+
+void SCustomMaterialVertexPipeline::DoGenerateWorldPosition()
+{
+ Vertex().Append("\tvarObjPos = attr_pos;");
+ Vertex().Append("\tvec4 worldPos = (model_matrix * vec4(attr_pos, 1.0));");
+ AssignOutput("varWorldPos", "worldPos.xyz");
+}
+
+void SCustomMaterialVertexPipeline::DoGenerateVarTangentAndBinormal()
+{
+ Vertex().AddIncoming("attr_textan", "vec3");
+ Vertex().AddIncoming("attr_binormal", "vec3");
+
+ Vertex() << "\tvarTangent = normal_matrix * attr_textan;" << Endl
+ << "\tvarBinormal = normal_matrix * attr_binormal;" << Endl;
+
+ Vertex() << "\tvarObjTangent = attr_textan;" << Endl << "\tvarObjBinormal = attr_binormal;"
+ << Endl;
+}
+
+void SCustomMaterialVertexPipeline::DoGenerateVertexColor()
+{
+ Vertex().AddIncoming("attr_color", "vec3");
+ Vertex().Append("\tvarColor = attr_color;");
+}
+
+
+struct SMaterialClass
+{
+ NVAllocatorCallback *m_Allocator;
+ IDynamicObjectClass *m_Class;
+ bool m_HasTransparency;
+ bool m_HasRefraction;
+ bool m_HasDisplacement;
+ bool m_AlwaysDirty;
+ QT3DSU32 m_ShaderKey;
+ QT3DSU32 m_LayerCount;
+ QT3DSI32 mRefCount;
+ SMaterialClass(NVAllocatorCallback &alloc, IDynamicObjectClass &inCls)
+ : m_Allocator(&alloc)
+ , m_Class(&inCls)
+ , m_HasTransparency(false)
+ , m_HasRefraction(false)
+ , m_HasDisplacement(false)
+ , m_AlwaysDirty(false)
+ , m_ShaderKey(0)
+ , m_LayerCount(0)
+ , mRefCount(0)
+ {
+ }
+
+ ~SMaterialClass() {}
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(*m_Allocator)
+
+ void AfterWrite()
+ {
+ m_Allocator = NULL;
+ m_Class = NULL;
+ mRefCount = 0;
+ }
+
+ void AfterRead(NVAllocatorCallback &alloc, IDynamicObjectClass &inCls)
+ {
+ m_Allocator = &alloc;
+ m_Class = &inCls;
+ mRefCount = 0;
+ }
+};
+
+typedef nvhash_map<CRegisteredString, NVScopedRefCounted<SMaterialClass>> TStringMaterialMap;
+typedef eastl::pair<CRegisteredString, CRegisteredString> TStrStrPair;
+
+namespace eastl {
+template <>
+struct hash<TStrStrPair>
+{
+ size_t operator()(const TStrStrPair &item) const
+ {
+ return hash<CRegisteredString>()(item.first) ^ hash<CRegisteredString>()(item.second);
+ }
+};
+}
+
+struct SShaderMapKey
+{
+ TStrStrPair m_Name;
+ eastl::vector<SShaderPreprocessorFeature> m_Features;
+ TessModeValues::Enum m_TessMode;
+ bool m_WireframeMode;
+ SShaderDefaultMaterialKey m_MaterialKey;
+ size_t m_HashCode;
+ SShaderMapKey(TStrStrPair inName, TShaderFeatureSet inFeatures, TessModeValues::Enum inTessMode,
+ bool inWireframeMode, SShaderDefaultMaterialKey inMaterialKey)
+ : m_Name(inName)
+ , m_Features(inFeatures.begin(), inFeatures.end())
+ , m_TessMode(inTessMode)
+ , m_WireframeMode(inWireframeMode)
+ , m_MaterialKey(inMaterialKey)
+ {
+ m_HashCode = eastl::hash<TStrStrPair>()(m_Name)
+ ^ HashShaderFeatureSet(toDataRef(m_Features.data(), (QT3DSU32)m_Features.size()))
+ ^ eastl::hash<QT3DSU32>()(m_TessMode) ^ eastl::hash<bool>()(m_WireframeMode)
+ ^ eastl::hash<size_t>()(inMaterialKey.hash());
+ }
+ bool operator==(const SShaderMapKey &inKey) const
+ {
+ return m_Name == inKey.m_Name && m_Features == inKey.m_Features
+ && m_TessMode == inKey.m_TessMode && m_WireframeMode == inKey.m_WireframeMode
+ && m_MaterialKey == inKey.m_MaterialKey;
+ }
+};
+
+namespace eastl {
+template <>
+struct hash<SShaderMapKey>
+{
+ size_t operator()(const SShaderMapKey &inKey) const { return inKey.m_HashCode; }
+};
+}
+
+namespace {
+
+struct SCustomMaterialTextureData
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ qt3ds::render::NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
+ qt3ds::render::NVRenderTexture2D *m_Texture;
+ bool m_needsMips;
+ volatile QT3DSI32 mRefCount;
+
+ SCustomMaterialTextureData(NVRenderShaderProgram &inShader, NVRenderTexture2D *inTexture,
+ const char *inTexName, bool needMips)
+ : m_Shader(inShader)
+ , m_Sampler(inTexName, inShader)
+ , m_Texture(inTexture)
+ , m_needsMips(needMips)
+ , mRefCount(0)
+ {
+ }
+
+ void Set(const SPropertyDefinition *inDefinition)
+ {
+ if (m_Texture && inDefinition) {
+ m_Texture->SetMagFilter(inDefinition->m_MagFilterOp);
+ m_Texture->SetMinFilter(inDefinition->m_MinFilterOp);
+ m_Texture->SetTextureWrapS(inDefinition->m_CoordOp);
+ m_Texture->SetTextureWrapT(inDefinition->m_CoordOp);
+ } else if (m_Texture) {
+ // set some defaults
+ m_Texture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ m_Texture->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ m_Texture->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+ }
+
+ if ((m_Texture->GetNumMipmaps() == 0) && m_needsMips)
+ m_Texture->GenerateMipmaps();
+
+ m_Sampler.Set(m_Texture);
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+
+ static SCustomMaterialTextureData CreateTextureEntry(NVRenderShaderProgram &inShader,
+ NVRenderTexture2D *inTexture,
+ const char *inTexName, bool needMips)
+ {
+ return SCustomMaterialTextureData(inShader, inTexture, inTexName, needMips);
+ }
+};
+
+typedef eastl::pair<CRegisteredString, NVScopedRefCounted<SCustomMaterialTextureData>>
+ TCustomMaterialTextureEntry;
+
+/**
+ * Cached tessellation property lookups this is on a per mesh base
+ */
+struct SCustomMaterialsTessellationProperties
+{
+ NVRenderCachedShaderProperty<QT3DSF32> m_EdgeTessLevel; ///< tesselation value for the edges
+ NVRenderCachedShaderProperty<QT3DSF32> m_InsideTessLevel; ///< tesselation value for the inside
+ NVRenderCachedShaderProperty<QT3DSF32>
+ m_PhongBlend; ///< blending between linear and phong component
+ NVRenderCachedShaderProperty<QT3DSVec2>
+ m_DistanceRange; ///< distance range for min and max tess level
+ NVRenderCachedShaderProperty<QT3DSF32> m_DisableCulling; ///< if set to 1.0 this disables backface
+ ///culling optimization in the tess shader
+
+ SCustomMaterialsTessellationProperties() {}
+ SCustomMaterialsTessellationProperties(NVRenderShaderProgram &inShader)
+ : m_EdgeTessLevel("tessLevelOuter", inShader)
+ , m_InsideTessLevel("tessLevelInner", inShader)
+ , m_PhongBlend("phongBlend", inShader)
+ , m_DistanceRange("distanceRange", inShader)
+ , m_DisableCulling("disableCulling", inShader)
+ {
+ }
+};
+
+/* We setup some shared state on the custom material shaders */
+struct SCustomMaterialShader
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ModelMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewProjMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat33> m_NormalMatrix;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraPos;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ProjMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewportMatrix;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CamProperties;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_DepthTexture;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_AOTexture;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LightProbe;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeProps;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeOpts;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeRot;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeOfs;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LightProbe2;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbe2Props;
+ NVRenderCachedShaderProperty<QT3DSI32> m_LightCount;
+ NVRenderCachedShaderProperty<QT3DSI32> m_AreaLightCount;
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_AoShadowParams;
+ SCustomMaterialsTessellationProperties m_Tessellation;
+ SDynamicShaderProgramFlags m_ProgramFlags;
+ volatile QT3DSI32 mRefCount;
+ SCustomMaterialShader(NVRenderShaderProgram &inShader, SDynamicShaderProgramFlags inFlags)
+ : m_Shader(inShader)
+ , m_ModelMatrix("model_matrix", inShader)
+ , m_ViewProjMatrix("model_view_projection", inShader)
+ , m_ViewMatrix("view_matrix", inShader)
+ , m_NormalMatrix("normal_matrix", inShader)
+ , m_CameraPos("camera_position", inShader)
+ , m_ProjMatrix("view_projection_matrix", inShader)
+ , m_ViewportMatrix("viewport_matrix", inShader)
+ , m_CamProperties("camera_properties", inShader)
+ , m_DepthTexture("depth_sampler", inShader)
+ , m_AOTexture("ao_sampler", inShader)
+ , m_LightProbe("light_probe", inShader)
+ , m_LightProbeProps("light_probe_props", inShader)
+ , m_LightProbeOpts("light_probe_opts", inShader)
+ , m_LightProbeRot("light_probe_rotation", inShader)
+ , m_LightProbeOfs("light_probe_offset", inShader)
+ , m_LightProbe2("light_probe2", inShader)
+ , m_LightProbe2Props("light_probe2_props", inShader)
+ , m_LightCount("uNumLights", inShader)
+ , m_AreaLightCount("uNumAreaLights", inShader)
+ , m_AoShadowParams("cbAoShadow", inShader)
+ , m_Tessellation(inShader)
+ , m_ProgramFlags(inFlags)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+};
+
+struct SMaterialOrComputeShader
+{
+ SCustomMaterialShader *m_MaterialShader;
+ NVRenderShaderProgram *m_ComputeShader;
+ SMaterialOrComputeShader()
+ : m_MaterialShader(NULL)
+ , m_ComputeShader(NULL)
+ {
+ }
+ SMaterialOrComputeShader(SCustomMaterialShader &inMaterialShader)
+ : m_MaterialShader(&inMaterialShader)
+ , m_ComputeShader(NULL)
+ {
+ }
+ SMaterialOrComputeShader(NVRenderShaderProgram &inComputeShader)
+ : m_MaterialShader(NULL)
+ , m_ComputeShader(&inComputeShader)
+ {
+ QT3DS_ASSERT(inComputeShader.GetProgramType() == NVRenderShaderProgram::ProgramType::Compute);
+ }
+ bool IsValid() const { return m_MaterialShader || m_ComputeShader; }
+ bool IsComputeShader() const { return m_ComputeShader != NULL; }
+ bool IsMaterialShader() const { return m_MaterialShader != NULL; }
+ SCustomMaterialShader &MaterialShader()
+ {
+ QT3DS_ASSERT(IsMaterialShader());
+ return *m_MaterialShader;
+ }
+ NVRenderShaderProgram &ComputeShader()
+ {
+ QT3DS_ASSERT(IsComputeShader());
+ return *m_ComputeShader;
+ }
+};
+
+struct SCustomMaterialBuffer
+{
+ CRegisteredString m_Name;
+ NVScopedRefCounted<NVRenderFrameBuffer> m_FrameBuffer;
+ NVScopedRefCounted<NVRenderTexture2D> m_Texture;
+ SAllocateBufferFlags m_Flags;
+
+ SCustomMaterialBuffer(CRegisteredString inName, NVRenderFrameBuffer &inFb,
+ NVRenderTexture2D &inTexture, SAllocateBufferFlags inFlags)
+ : m_Name(inName)
+ , m_FrameBuffer(&inFb)
+ , m_Texture(&inTexture)
+ , m_Flags(inFlags)
+ {
+ }
+ SCustomMaterialBuffer() {}
+};
+
+struct SMaterialSystem;
+typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderVertexBuffer>>
+ TStringVertexBufferMap;
+typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderInputAssembler>>
+ TStringAssemblerMap;
+
+struct SStringMemoryBarrierFlagMap
+{
+ const char8_t *m_Name;
+ qt3ds::render::NVRenderBufferBarrierValues::Enum m_Value;
+ SStringMemoryBarrierFlagMap(const char8_t *nm,
+ qt3ds::render::NVRenderBufferBarrierValues::Enum val)
+ : m_Name(nm)
+ , m_Value(val)
+ {
+ }
+};
+
+SStringMemoryBarrierFlagMap g_StringMemoryFlagMap[] = {
+ SStringMemoryBarrierFlagMap("vertex_attribute",
+ qt3ds::render::NVRenderBufferBarrierValues::VertexAttribArray),
+ SStringMemoryBarrierFlagMap("element_array",
+ qt3ds::render::NVRenderBufferBarrierValues::ElementArray),
+ SStringMemoryBarrierFlagMap("uniform_buffer",
+ qt3ds::render::NVRenderBufferBarrierValues::UniformBuffer),
+ SStringMemoryBarrierFlagMap("texture_fetch",
+ qt3ds::render::NVRenderBufferBarrierValues::TextureFetch),
+ SStringMemoryBarrierFlagMap("shader_image_access",
+ qt3ds::render::NVRenderBufferBarrierValues::ShaderImageAccess),
+ SStringMemoryBarrierFlagMap("command_buffer",
+ qt3ds::render::NVRenderBufferBarrierValues::CommandBuffer),
+ SStringMemoryBarrierFlagMap("pixel_buffer",
+ qt3ds::render::NVRenderBufferBarrierValues::PixelBuffer),
+ SStringMemoryBarrierFlagMap("texture_update",
+ qt3ds::render::NVRenderBufferBarrierValues::TextureUpdate),
+ SStringMemoryBarrierFlagMap("buffer_update",
+ qt3ds::render::NVRenderBufferBarrierValues::BufferUpdate),
+ SStringMemoryBarrierFlagMap("frame_buffer",
+ qt3ds::render::NVRenderBufferBarrierValues::Framebuffer),
+ SStringMemoryBarrierFlagMap("transform_feedback",
+ qt3ds::render::NVRenderBufferBarrierValues::TransformFeedback),
+ SStringMemoryBarrierFlagMap("atomic_counter",
+ qt3ds::render::NVRenderBufferBarrierValues::AtomicCounter),
+ SStringMemoryBarrierFlagMap("shader_storage",
+ qt3ds::render::NVRenderBufferBarrierValues::ShaderStorage),
+};
+
+struct SStringBlendFuncMap
+{
+ const char8_t *m_Name;
+ qt3ds::render::NVRenderSrcBlendFunc::Enum m_Value;
+ SStringBlendFuncMap(const char8_t *nm, qt3ds::render::NVRenderSrcBlendFunc::Enum val)
+ : m_Name(nm)
+ , m_Value(val)
+ {
+ }
+};
+
+SStringBlendFuncMap g_BlendFuncMap[] = {
+#define QT3DS_RENDER_HANDLE_BLEND_FUNC(nm) \
+ SStringBlendFuncMap(#nm, qt3ds::render::NVRenderSrcBlendFunc::nm),
+#define QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC(nm) \
+ SStringBlendFuncMap(#nm, qt3ds::render::NVRenderSrcBlendFunc::nm),
+ QT3DS_RENDER_ITERATE_BLEND_FUNC
+#undef QT3DS_RENDER_HANDLE_BLEND_FUNC
+#undef QT3DS_RENDER_HANDLE_SRC_BLEND_FUNC
+};
+
+struct SMaterialSystem : public ICustomMaterialSystem
+{
+ typedef nvhash_map<SShaderMapKey, NVScopedRefCounted<SCustomMaterialShader>> TShaderMap;
+ typedef eastl::pair<CRegisteredString, SImage *> TAllocatedImageEntry;
+
+ IQt3DSRenderContextCore &m_CoreContext;
+ IQt3DSRenderContext *m_Context;
+ mutable qt3ds::render::SPreAllocatedAllocator m_Allocator;
+ TStringMaterialMap m_StringMaterialMap;
+ TShaderMap m_ShaderMap;
+ nvvector<TCustomMaterialTextureEntry> m_TextureEntries;
+ nvvector<SCustomMaterialBuffer> m_AllocatedBuffers;
+ nvvector<TAllocatedImageEntry> m_AllocatedImages;
+ bool m_UseFastBlits;
+ eastl::string m_ShaderNameBuilder;
+ QT3DSU64 m_LastFrameTime;
+ QT3DSF32 m_MillisecondsSinceLastFrame;
+ QT3DSI32 mRefCount;
+
+ SMaterialSystem(IQt3DSRenderContextCore &ct)
+ : m_CoreContext(ct)
+ , m_Context(NULL)
+ , m_Allocator(ct.GetAllocator())
+ , m_StringMaterialMap(ct.GetAllocator(), "SMaterialSystem::m_StringMaterialMap")
+ , m_ShaderMap(ct.GetAllocator(), "SMaterialSystem::m_ShaderMap")
+ , m_TextureEntries(ct.GetAllocator(), "SMaterialSystem::m_TextureEntries")
+ , m_AllocatedBuffers(ct.GetAllocator(), "SMaterialSystem::m_AllocatedBuffers")
+ , m_AllocatedImages(ct.GetAllocator(), "SMaterialSystem::m_AllocatedImages")
+ , m_UseFastBlits(true)
+ , m_LastFrameTime(0)
+ , m_MillisecondsSinceLastFrame(0)
+ , mRefCount(0)
+ {
+ }
+
+ ~SMaterialSystem()
+ {
+ while (m_AllocatedBuffers.size())
+ m_AllocatedBuffers.replace_with_last(0);
+
+ for (QT3DSU32 idx = 0; idx < m_AllocatedImages.size(); ++idx) {
+ SImage *pImage = m_AllocatedImages[idx].second;
+ QT3DS_FREE(m_CoreContext.GetAllocator(), pImage);
+ }
+ m_AllocatedImages.clear();
+ }
+
+ void ReleaseBuffer(QT3DSU32 inIdx)
+ {
+ // Don't call this on MaterialSystem destroy.
+ // This causes issues for scene liftime buffers
+ // because the resource manager is destroyed before
+ IResourceManager &theManager(m_Context->GetResourceManager());
+ SCustomMaterialBuffer &theEntry(m_AllocatedBuffers[inIdx]);
+ theEntry.m_FrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer());
+
+ theManager.Release(*theEntry.m_FrameBuffer);
+ theManager.Release(*theEntry.m_Texture);
+ m_AllocatedBuffers.replace_with_last(inIdx);
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_CoreContext.GetAllocator())
+
+ bool IsMaterialRegistered(CRegisteredString inStr) override
+ {
+ return m_StringMaterialMap.find(inStr) != m_StringMaterialMap.end();
+ }
+
+ bool RegisterMaterialClass(CRegisteredString inName,
+ NVConstDataRef<dynamic::SPropertyDeclaration> inProperties) override
+ {
+ if (IsMaterialRegistered(inName))
+ return false;
+ m_CoreContext.GetDynamicObjectSystemCore().Register(
+ inName, inProperties, sizeof(SCustomMaterial), GraphObjectTypes::CustomMaterial);
+ IDynamicObjectClass *theClass =
+ m_CoreContext.GetDynamicObjectSystemCore().GetDynamicObjectClass(inName);
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ SMaterialClass *theNewClass = QT3DS_NEW(m_Allocator, SMaterialClass)(m_Allocator, *theClass);
+ m_StringMaterialMap.insert(eastl::make_pair(inName, theNewClass));
+ return true;
+ }
+
+ SMaterialClass *GetMaterialClass(CRegisteredString inStr)
+ {
+ TStringMaterialMap::iterator theIter = m_StringMaterialMap.find(inStr);
+ if (theIter != m_StringMaterialMap.end())
+ return theIter->second;
+ return NULL;
+ }
+
+ const SMaterialClass *GetMaterialClass(CRegisteredString inStr) const
+ {
+ return const_cast<SMaterialSystem *>(this)->GetMaterialClass(inStr);
+ }
+
+ virtual NVConstDataRef<SPropertyDefinition>
+ GetCustomMaterialProperties(CRegisteredString inCustomMaterialName) const override
+ {
+ IDynamicObjectClass *theMaterialClass =
+ m_CoreContext.GetDynamicObjectSystemCore().GetDynamicObjectClass(inCustomMaterialName);
+
+ if (theMaterialClass)
+ return theMaterialClass->GetProperties();
+
+ return NVConstDataRef<SPropertyDefinition>();
+ }
+
+ virtual QT3DSU32 FindBuffer(CRegisteredString inName)
+ {
+ for (QT3DSU32 idx = 0, end = m_AllocatedBuffers.size(); idx < end; ++idx)
+ if (m_AllocatedBuffers[idx].m_Name == inName)
+ return idx;
+ return m_AllocatedBuffers.size();
+ }
+
+ virtual QT3DSU32 FindAllocatedImage(CRegisteredString inName)
+ {
+ for (QT3DSU32 idx = 0, end = m_AllocatedImages.size(); idx < end; ++idx)
+ if (m_AllocatedImages[idx].first == inName)
+ return idx;
+ return QT3DSU32(-1);
+ }
+
+ virtual bool TextureNeedsMips(const SPropertyDefinition *inPropDec,
+ qt3ds::render::NVRenderTexture2D *inTexture)
+ {
+ if (inPropDec && inTexture) {
+ return bool((inPropDec->m_MinFilterOp == NVRenderTextureMinifyingOp::LinearMipmapLinear)
+ && (inTexture->GetNumMipmaps() == 0));
+ }
+
+ return false;
+ }
+
+ virtual void SetTexture(NVRenderShaderProgram &inShader, CRegisteredString inPropName,
+ NVRenderTexture2D *inTexture,
+ const SPropertyDefinition *inPropDec = NULL, bool needMips = false)
+ {
+ SCustomMaterialTextureData *theTextureEntry(NULL);
+ for (QT3DSU32 idx = 0, end = m_TextureEntries.size(); idx < end && theTextureEntry == NULL;
+ ++idx) {
+ if (m_TextureEntries[idx].first == inPropName
+ && m_TextureEntries[idx].second->m_Shader.mPtr == &inShader
+ && m_TextureEntries[idx].second->m_Texture == inTexture) {
+ theTextureEntry = m_TextureEntries[idx].second;
+ break;
+ }
+ }
+ if (theTextureEntry == NULL) {
+ NVScopedRefCounted<SCustomMaterialTextureData> theNewEntry =
+ QT3DS_NEW(m_CoreContext.GetAllocator(), SCustomMaterialTextureData)(
+ SCustomMaterialTextureData::CreateTextureEntry(inShader, inTexture, inPropName,
+ needMips));
+ m_TextureEntries.push_back(eastl::make_pair(inPropName, theNewEntry));
+ theTextureEntry = theNewEntry.mPtr;
+ }
+ theTextureEntry->Set(inPropDec);
+ }
+
+ void SetSubpresentation(NVRenderShaderProgram &inShader, CRegisteredString inPropName,
+ NVRenderTexture2D *inTexture,
+ const SPropertyDefinition *inPropDec)
+ {
+ SPropertyDefinition propDef = *inPropDec;
+ propDef.m_MinFilterOp = NVRenderTextureMinifyingOp::Linear;
+ propDef.m_MagFilterOp = NVRenderTextureMagnifyingOp::Linear;
+ SCustomMaterialTextureData::CreateTextureEntry(inShader, inTexture, inPropName, false)
+ .Set(&propDef);
+ }
+
+ void SetPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName,
+ NVConstDataRef<CRegisteredString> inNames) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetPropertyEnumNames(inName, inPropName,
+ inNames);
+ }
+
+ void SetPropertyTextureSettings(CRegisteredString inName, CRegisteredString inPropName,
+ CRegisteredString inPropPath,
+ NVRenderTextureTypeValue::Enum inTexType,
+ NVRenderTextureCoordOp::Enum inCoordOp,
+ NVRenderTextureMagnifyingOp::Enum inMagFilterOp,
+ NVRenderTextureMinifyingOp::Enum inMinFilterOp) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inName);
+ if (theClass && inTexType == NVRenderTextureTypeValue::Displace) {
+ theClass->m_HasDisplacement = true;
+ }
+ m_CoreContext.GetDynamicObjectSystemCore().SetPropertyTextureSettings(
+ inName, inPropName, inPropPath, inTexType, inCoordOp, inMagFilterOp, inMinFilterOp);
+ }
+
+ void SetMaterialClassShader(CRegisteredString inName, const char8_t *inShaderType,
+ const char8_t *inShaderVersion, const char8_t *inShaderData,
+ bool inHasGeomShader, bool inIsComputeShader) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetShaderData(inName, inShaderData, inShaderType,
+ inShaderVersion, inHasGeomShader,
+ inIsComputeShader);
+ }
+
+ SCustomMaterial *CreateCustomMaterial(CRegisteredString inName,
+ NVAllocatorCallback &inSceneGraphAllocator) override
+ {
+ SCustomMaterial *theMaterial = static_cast<SCustomMaterial *>(
+ m_CoreContext.GetDynamicObjectSystemCore().CreateInstance(inName,
+ inSceneGraphAllocator));
+ SMaterialClass *theClass = GetMaterialClass(inName);
+
+ if (theMaterial) {
+ QT3DSU32 key = 0, count = 0;
+ if (theClass) {
+ key = theClass->m_ShaderKey;
+ count = theClass->m_LayerCount;
+ }
+ theMaterial->Initialize(key, count);
+ }
+
+ return theMaterial;
+ }
+
+ void SetCustomMaterialTransparency(CRegisteredString inName, bool inHasTransparency) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inName);
+
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ theClass->m_HasTransparency = inHasTransparency;
+ }
+
+ void SetCustomMaterialRefraction(CRegisteredString inName, bool inHasRefraction) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inName);
+
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ theClass->m_HasRefraction = inHasRefraction;
+ }
+
+ void SetCustomMaterialAlwaysDirty(CRegisteredString inName, bool inIsAlwaysDirty) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inName);
+
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ theClass->m_AlwaysDirty = inIsAlwaysDirty;
+ }
+
+ void SetCustomMaterialShaderKey(CRegisteredString inName, QT3DSU32 inShaderKey) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inName);
+
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ theClass->m_ShaderKey = inShaderKey;
+ }
+
+ void SetCustomMaterialLayerCount(CRegisteredString inName, QT3DSU32 inLayerCount) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inName);
+
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ theClass->m_LayerCount = inLayerCount;
+ }
+
+ void SetCustomMaterialCommands(CRegisteredString inName,
+ NVConstDataRef<dynamic::SCommand *> inCommands) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetRenderCommands(inName, inCommands);
+ }
+
+ CRegisteredString GetShaderCacheKey(Qt3DSString &inShaderKeyBuffer, const char8_t *inId,
+ const char8_t *inProgramMacro,
+ const dynamic::SDynamicShaderProgramFlags &inFlags)
+ {
+ inShaderKeyBuffer.assign(inId);
+ if (inProgramMacro && *inProgramMacro) {
+ inShaderKeyBuffer.append("#");
+ inShaderKeyBuffer.append(inProgramMacro);
+ }
+ if (inFlags.IsTessellationEnabled()) {
+ inShaderKeyBuffer.append("#");
+ inShaderKeyBuffer.append(TessModeValues::toString(inFlags.m_TessMode));
+ }
+ if (inFlags.IsGeometryShaderEnabled() && inFlags.m_WireframeMode) {
+ inShaderKeyBuffer.append("#");
+ inShaderKeyBuffer.append(inFlags.wireframeToString(inFlags.m_WireframeMode));
+ }
+
+ return m_CoreContext.GetStringTable().RegisterStr(inShaderKeyBuffer.c_str());
+ }
+
+ NVRenderShaderProgram *GetShader(SCustomMaterialRenderContext &inRenderContext,
+ const SCustomMaterial &inMaterial,
+ const SBindShader &inCommand, TShaderFeatureSet inFeatureSet,
+ const dynamic::SDynamicShaderProgramFlags &inFlags)
+ {
+ ICustomMaterialShaderGenerator &theMaterialGenerator(
+ m_Context->GetCustomMaterialShaderGenerator());
+
+ // generate key
+ Qt3DSString theShaderKeyBuffer;
+ CRegisteredString theKey = GetShaderCacheKey(theShaderKeyBuffer, inCommand.m_ShaderPath,
+ inCommand.m_ShaderDefine, inFlags);
+
+ SCustomMaterialVertexPipeline thePipeline(m_Context,
+ inRenderContext.m_Model.m_TessellationMode);
+
+ NVRenderShaderProgram *theProgram = theMaterialGenerator.GenerateShader(
+ inMaterial, inRenderContext.m_MaterialKey, thePipeline, inFeatureSet,
+ inRenderContext.m_Lights, inRenderContext.m_FirstImage,
+ (inMaterial.m_hasTransparency || inMaterial.m_hasRefraction),
+ "custom material pipeline-- ", inCommand.m_ShaderPath.c_str());
+
+ return theProgram;
+ }
+
+ SMaterialOrComputeShader BindShader(SCustomMaterialRenderContext &inRenderContext,
+ const SCustomMaterial &inMaterial,
+ const SBindShader &inCommand,
+ TShaderFeatureSet inFeatureSet)
+ {
+ NVRenderShaderProgram *theProgram = NULL;
+ eastl::vector<SShaderPreprocessorFeature> features;
+ for (int i = 0; i < inFeatureSet.size(); ++i)
+ features.push_back(inFeatureSet.mData[i]);
+ features.push_back(SShaderPreprocessorFeature(m_Context->GetStringTable()
+ .RegisterStr("NO_FRAG_OUTPUT"), true));
+ TShaderFeatureSet featureSet(features.data(), features.size());
+
+ SDynamicShaderProgramFlags theFlags(inRenderContext.m_Model.m_TessellationMode,
+ inRenderContext.m_Subset.m_WireframeMode);
+ theFlags.SetTessellationEnabled(inRenderContext.m_Model.m_TessellationMode
+ != TessModeValues::NoTess);
+ theFlags.SetGeometryShaderEnabled(inRenderContext.m_Subset.m_WireframeMode);
+
+ SShaderMapKey skey = SShaderMapKey(
+ TStrStrPair(inCommand.m_ShaderPath, inCommand.m_ShaderDefine), featureSet,
+ theFlags.m_TessMode, theFlags.m_WireframeMode, inRenderContext.m_MaterialKey);
+ eastl::pair<TShaderMap::iterator, bool> theInsertResult(m_ShaderMap.insert(
+ eastl::make_pair(skey, NVScopedRefCounted<SCustomMaterialShader>(NULL))));
+
+ if (theInsertResult.second) {
+ theProgram = GetShader(inRenderContext, inMaterial, inCommand, featureSet, theFlags);
+
+ if (theProgram) {
+ theInsertResult.first->second =
+ QT3DS_NEW(m_Allocator, SCustomMaterialShader)(*theProgram, theFlags);
+ }
+ } else if (theInsertResult.first->second)
+ theProgram = theInsertResult.first->second->m_Shader;
+
+ if (theProgram) {
+ if (theProgram->GetProgramType() == NVRenderShaderProgram::ProgramType::Graphics) {
+ if (theInsertResult.first->second) {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ theContext.SetActiveShader(theInsertResult.first->second->m_Shader);
+ }
+
+ return *theInsertResult.first->second;
+ } else {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ theContext.SetActiveShader(theProgram);
+ return *(static_cast<NVRenderShaderProgram *>(theProgram));
+ }
+ }
+ return SMaterialOrComputeShader();
+ }
+
+ void DoApplyInstanceValue(SCustomMaterial & /* inMaterial */, QT3DSU8 *inDataPtr,
+ CRegisteredString inPropertyName,
+ NVRenderShaderDataTypes::Enum inPropertyType,
+ NVRenderShaderProgram &inShader,
+ const SPropertyDefinition &inDefinition)
+ {
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(inPropertyName);
+ using namespace qt3ds::render;
+ if (theConstant) {
+ if (theConstant->GetShaderConstantType() == inPropertyType) {
+ if (inPropertyType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ StaticAssert<sizeof(CRegisteredString)
+ == sizeof(NVRenderTexture2DPtr)>::valid_expression();
+ CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(inDataPtr);
+ IBufferManager &theBufferManager(m_Context->GetBufferManager());
+ IOffscreenRenderManager &theOffscreenRenderer(
+ m_Context->GetOffscreenRenderManager());
+ NVRenderTexture2D *theTexture = nullptr;
+
+ if (theStrPtr->IsValid()) {
+ if (theOffscreenRenderer.HasOffscreenRenderer(*theStrPtr)) {
+ SOffscreenRenderResult theResult
+ = theOffscreenRenderer.GetRenderedItem(*theStrPtr);
+ theTexture = theResult.m_Texture;
+ if (theTexture) {
+ SetSubpresentation(inShader, inPropertyName, theTexture,
+ &inDefinition);
+ }
+ } else {
+ SImageTextureData theTextureData
+ = theBufferManager.LoadRenderImage(*theStrPtr);
+ theTexture = theTextureData.m_Texture;
+ if (theTexture) {
+ SetTexture(inShader, inPropertyName, theTexture, &inDefinition,
+ TextureNeedsMips(&inDefinition, theTexture));
+ }
+ }
+ }
+ } else {
+ switch (inPropertyType) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(type) \
+ case NVRenderShaderDataTypes::type: \
+ inShader.SetPropertyValue(theConstant, *(reinterpret_cast<type *>(inDataPtr))); \
+ break;
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ } else {
+ qCCritical(INVALID_OPERATION,
+ "CustomMaterial ApplyInstanceValue command datatype and "
+ "shader datatypes differ for property %s",
+ inPropertyName.c_str());
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ void ApplyInstanceValue(SCustomMaterial &inMaterial, SMaterialClass &inClass,
+ NVRenderShaderProgram &inShader, const SApplyInstanceValue &inCommand)
+ {
+ // sanity check
+ if (inCommand.m_PropertyName.IsValid()) {
+ bool canGetData =
+ inCommand.m_ValueOffset + getSizeofShaderDataType(inCommand.m_ValueType)
+ <= inMaterial.m_DataSectionByteSize;
+ if (canGetData == false) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ QT3DSU8 *dataPtr = inMaterial.GetDataSectionBegin() + inCommand.m_ValueOffset;
+ const SPropertyDefinition *theDefinition =
+ inClass.m_Class->FindPropertyByName(inCommand.m_PropertyName);
+ if (theDefinition)
+ DoApplyInstanceValue(inMaterial, dataPtr, inCommand.m_PropertyName,
+ inCommand.m_ValueType, inShader, *theDefinition);
+ } else {
+ NVConstDataRef<SPropertyDefinition> theDefs = inClass.m_Class->GetProperties();
+ for (QT3DSU32 idx = 0, end = theDefs.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(theDefs[idx]);
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(theDefinition.m_Name);
+
+ // This is fine, the property wasn't found and we continue, no problem.
+ if (!theConstant)
+ continue;
+ QT3DSU8 *dataPtr = inMaterial.GetDataSectionBegin() + theDefinition.m_Offset;
+ DoApplyInstanceValue(inMaterial, dataPtr, theDefinition.m_Name,
+ theDefinition.m_DataType, inShader, theDefinition);
+ }
+ }
+ }
+
+ void ApplyBlending(const SApplyBlending &inCommand)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+
+ theContext.SetBlendingEnabled(true);
+
+ qt3ds::render::NVRenderBlendFunctionArgument blendFunc =
+ qt3ds::render::NVRenderBlendFunctionArgument(
+ inCommand.m_SrcBlendFunc, inCommand.m_DstBlendFunc, inCommand.m_SrcBlendFunc,
+ inCommand.m_DstBlendFunc);
+
+ qt3ds::render::NVRenderBlendEquationArgument blendEqu(NVRenderBlendEquation::Add,
+ NVRenderBlendEquation::Add);
+
+ theContext.SetBlendFunction(blendFunc);
+ theContext.SetBlendEquation(blendEqu);
+ }
+
+ // we currently only bind a source texture
+ const NVRenderTexture2D *ApplyBufferValue(const SCustomMaterial &inMaterial,
+ NVRenderShaderProgram &inShader,
+ const SApplyBufferValue &inCommand,
+ const NVRenderTexture2D *inSourceTexture)
+ {
+ const NVRenderTexture2D *theTexture = NULL;
+
+ if (inCommand.m_BufferName.IsValid()) {
+ QT3DSU32 bufferIdx = FindBuffer(inCommand.m_BufferName);
+ if (bufferIdx < m_AllocatedBuffers.size()) {
+ SCustomMaterialBuffer &theEntry(m_AllocatedBuffers[bufferIdx]);
+ theTexture = theEntry.m_Texture;
+ } else {
+ // we must have allocated the read target before
+ qCCritical(INTERNAL_ERROR,
+ "CustomMaterial: ApplyBufferValue: Failed to setup read target");
+ QT3DS_ASSERT(false);
+ }
+ } else
+ theTexture = inSourceTexture;
+
+ if (inCommand.m_ParamName.IsValid()) {
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(inCommand.m_ParamName);
+
+ if (theConstant) {
+ if (theConstant->GetShaderConstantType()
+ != NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ qCCritical(INVALID_OPERATION,
+ "CustomMaterial %s: Binding buffer to parameter %s that is not a texture",
+ inMaterial.m_ClassName.c_str(), inCommand.m_ParamName.c_str());
+ QT3DS_ASSERT(false);
+ } else {
+ SetTexture(inShader, inCommand.m_ParamName,
+ const_cast<NVRenderTexture2D *>(theTexture));
+ }
+ }
+ }
+
+ return theTexture;
+ }
+
+ void AllocateBuffer(const SAllocateBuffer &inCommand, NVRenderFrameBuffer *inTarget)
+ {
+ STextureDetails theSourceTextureDetails;
+ NVRenderTexture2D *theTexture = NULL;
+ // get color attachment we always assume at location 0
+ if (inTarget) {
+ NVRenderTextureOrRenderBuffer theSourceTexture =
+ inTarget->GetAttachment(NVRenderFrameBufferAttachments::Color0);
+ // we need a texture
+ if (theSourceTexture.HasTexture2D()) {
+ theSourceTextureDetails = theSourceTexture.GetTexture2D()->GetTextureDetails();
+ } else {
+ qCCritical(INVALID_OPERATION, "CustomMaterial %s: Invalid source texture",
+ inCommand.m_Name.c_str());
+ QT3DS_ASSERT(false);
+ return;
+ }
+ } else {
+ NVRenderContext &theContext = m_Context->GetRenderContext();
+ // if we allocate a buffer based on the default target use viewport to get the dimension
+ NVRenderRect theViewport(theContext.GetViewport());
+ theSourceTextureDetails.m_Height = theViewport.m_Height;
+ theSourceTextureDetails.m_Width = theViewport.m_Width;
+ }
+
+ QT3DSU32 theWidth = (QT3DSU32)(theSourceTextureDetails.m_Width * inCommand.m_SizeMultiplier);
+ QT3DSU32 theHeight = (QT3DSU32)(theSourceTextureDetails.m_Height * inCommand.m_SizeMultiplier);
+ NVRenderTextureFormats::Enum theFormat = inCommand.m_Format;
+ if (theFormat == NVRenderTextureFormats::Unknown)
+ theFormat = theSourceTextureDetails.m_Format;
+ IResourceManager &theResourceManager(m_Context->GetResourceManager());
+ // size intentionally requiried every loop;
+ QT3DSU32 bufferIdx = FindBuffer(inCommand.m_Name);
+ if (bufferIdx < m_AllocatedBuffers.size()) {
+ SCustomMaterialBuffer &theEntry(m_AllocatedBuffers[bufferIdx]);
+ STextureDetails theDetails = theEntry.m_Texture->GetTextureDetails();
+ if (theDetails.m_Width == theWidth && theDetails.m_Height == theHeight
+ && theDetails.m_Format == theFormat) {
+ theTexture = theEntry.m_Texture;
+ } else {
+ ReleaseBuffer(bufferIdx);
+ }
+ }
+
+ if (theTexture == NULL) {
+ NVRenderFrameBuffer *theFB(theResourceManager.AllocateFrameBuffer());
+ NVRenderTexture2D *theTexture(
+ theResourceManager.AllocateTexture2D(theWidth, theHeight, theFormat));
+ theTexture->SetMagFilter(inCommand.m_FilterOp);
+ theTexture->SetMinFilter(
+ static_cast<NVRenderTextureMinifyingOp::Enum>(inCommand.m_FilterOp));
+ theTexture->SetTextureWrapS(inCommand.m_TexCoordOp);
+ theTexture->SetTextureWrapT(inCommand.m_TexCoordOp);
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0, *theTexture);
+ m_AllocatedBuffers.push_back(SCustomMaterialBuffer(
+ inCommand.m_Name, *theFB, *theTexture, inCommand.m_BufferFlags));
+ }
+ }
+
+ NVRenderFrameBuffer *BindBuffer(const SCustomMaterial &inMaterial, const SBindBuffer &inCommand,
+ bool &outClearTarget, QT3DSVec2 &outDestSize)
+ {
+ NVRenderFrameBuffer *theBuffer = NULL;
+ NVRenderTexture2D *theTexture = NULL;
+
+ // search for the buffer
+ QT3DSU32 bufferIdx = FindBuffer(inCommand.m_BufferName);
+ if (bufferIdx < m_AllocatedBuffers.size()) {
+ theBuffer = m_AllocatedBuffers[bufferIdx].m_FrameBuffer;
+ theTexture = m_AllocatedBuffers[bufferIdx].m_Texture;
+ }
+
+ if (theBuffer == NULL) {
+ qCCritical(INVALID_OPERATION, "Effect %s: Failed to find buffer %s for bind",
+ inMaterial.m_ClassName.c_str(), inCommand.m_BufferName.c_str());
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ if (theTexture) {
+ STextureDetails theDetails(theTexture->GetTextureDetails());
+ m_Context->GetRenderContext().SetViewport(
+ NVRenderRect(0, 0, (QT3DSU32)theDetails.m_Width, (QT3DSU32)theDetails.m_Height));
+ outDestSize = QT3DSVec2((QT3DSF32)theDetails.m_Width, (QT3DSF32)theDetails.m_Height);
+ outClearTarget = inCommand.m_NeedsClear;
+ }
+
+ return theBuffer;
+ }
+
+ void computeScreenCoverage(SCustomMaterialRenderContext &inRenderContext, QT3DSI32 *xMin,
+ QT3DSI32 *yMin, QT3DSI32 *xMax, QT3DSI32 *yMax)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ TNVBounds2BoxPoints outPoints;
+ QT3DSVec4 projMin(QT3DS_MAX_REAL);
+ QT3DSVec4 projMax(-QT3DS_MAX_REAL);
+
+ // get points
+ inRenderContext.m_Subset.m_Bounds.expand(outPoints);
+ for (QT3DSU32 idx = 0; idx < 8; ++idx) {
+ QT3DSVec4 homPoint(outPoints[idx], 1.0);
+ QT3DSVec4 projPoint = inRenderContext.m_ModelViewProjection.transform(homPoint);
+ projPoint /= projPoint.w;
+
+ if (projMin.x > projPoint.x)
+ projMin.x = projPoint.x;
+ if (projMin.y > projPoint.y)
+ projMin.y = projPoint.y;
+ if (projMin.z > projPoint.z)
+ projMin.z = projPoint.z;
+
+ if (projMax.x < projPoint.x)
+ projMax.x = projPoint.x;
+ if (projMax.y < projPoint.y)
+ projMax.y = projPoint.y;
+ if (projMax.z < projPoint.z)
+ projMax.z = projPoint.z;
+ }
+
+ NVRenderRect theViewport(theContext.GetViewport());
+ QT3DSI32 x1 = QT3DSI32(projMax.x * (theViewport.m_Width / 2)
+ + (theViewport.m_X + (theViewport.m_Width / 2)));
+ QT3DSI32 y1 = QT3DSI32(projMax.y * (theViewport.m_Height / 2)
+ + (theViewport.m_Y + (theViewport.m_Height / 2)));
+
+ QT3DSI32 x2 = QT3DSI32(projMin.x * (theViewport.m_Width / 2)
+ + (theViewport.m_X + (theViewport.m_Width / 2)));
+ QT3DSI32 y2 = QT3DSI32(projMin.y * (theViewport.m_Height / 2)
+ + (theViewport.m_Y + (theViewport.m_Height / 2)));
+
+ if (x1 > x2) {
+ *xMin = x2;
+ *xMax = x1;
+ } else {
+ *xMin = x1;
+ *xMax = x2;
+ }
+ if (y1 > y2) {
+ *yMin = y2;
+ *yMax = y1;
+ } else {
+ *yMin = y1;
+ *yMax = y2;
+ }
+ }
+
+ void BlitFramebuffer(SCustomMaterialRenderContext &inRenderContext,
+ const SApplyBlitFramebuffer &inCommand, NVRenderFrameBuffer *inTarget)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ // we change the read/render targets here
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __framebuffer(
+ theContext, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+ // we may alter scissor
+ NVRenderContextScopedProperty<bool> theScissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled);
+
+ if (inCommand.m_DestBufferName.IsValid()) {
+ QT3DSU32 bufferIdx = FindBuffer(inCommand.m_DestBufferName);
+ if (bufferIdx < m_AllocatedBuffers.size()) {
+ SCustomMaterialBuffer &theEntry(m_AllocatedBuffers[bufferIdx]);
+ theContext.SetRenderTarget(theEntry.m_FrameBuffer);
+ } else {
+ // we must have allocated the read target before
+ qCCritical(INTERNAL_ERROR,
+ "CustomMaterial: BlitFramebuffer: Failed to setup render target");
+ QT3DS_ASSERT(false);
+ }
+ } else {
+ // our dest is the default render target
+ theContext.SetRenderTarget(inTarget);
+ }
+
+ if (inCommand.m_SourceBufferName.IsValid()) {
+ QT3DSU32 bufferIdx = FindBuffer(inCommand.m_SourceBufferName);
+ if (bufferIdx < m_AllocatedBuffers.size()) {
+ SCustomMaterialBuffer &theEntry(m_AllocatedBuffers[bufferIdx]);
+ theContext.SetReadTarget(theEntry.m_FrameBuffer);
+ theContext.SetReadBuffer(NVReadFaces::Color0);
+ } else {
+ // we must have allocated the read target before
+ qCCritical(INTERNAL_ERROR,
+ "CustomMaterial: BlitFramebuffer: Failed to setup read target");
+ QT3DS_ASSERT(false);
+ }
+ } else {
+ // our source is the default read target
+ // depending on what we render we assume color0 or back
+ theContext.SetReadTarget(inTarget);
+ NVReadFaces::Enum value = (inTarget) ? NVReadFaces::Color0 : NVReadFaces::Back;
+ theContext.SetReadBuffer(value);
+ }
+
+ NVRenderRect theViewport(theContext.GetViewport());
+ theContext.SetScissorTestEnabled(false);
+
+ if (!m_UseFastBlits) {
+ // only copy sreen amount of pixels
+ QT3DSI32 xMin, yMin, xMax, yMax;
+ computeScreenCoverage(inRenderContext, &xMin, &yMin, &xMax, &yMax);
+
+ // same dimension
+ theContext.BlitFramebuffer(xMin, yMin, xMax, yMax, xMin, yMin, xMax, yMax,
+ NVRenderClearValues::Color,
+ NVRenderTextureMagnifyingOp::Nearest);
+ } else {
+ // same dimension
+ theContext.BlitFramebuffer(
+ theViewport.m_X, theViewport.m_Y, theViewport.m_X + theViewport.m_Width,
+ theViewport.m_Y + theViewport.m_Height, theViewport.m_X, theViewport.m_Y,
+ theViewport.m_X + theViewport.m_Width, theViewport.m_Y + theViewport.m_Height,
+ NVRenderClearValues::Color, NVRenderTextureMagnifyingOp::Nearest);
+ }
+ }
+
+ SLayerGlobalRenderProperties
+ GetLayerGlobalRenderProperties(SCustomMaterialRenderContext &inRenderContext)
+ {
+ const SLayer &theLayer = inRenderContext.m_Layer;
+ const SLayerRenderData &theData = inRenderContext.m_LayerData;
+
+ return SLayerGlobalRenderProperties(
+ theLayer, const_cast<SCamera &>(inRenderContext.m_Camera), theData.m_CameraDirection,
+ inRenderContext.m_Lights, NVDataRef<QT3DSVec3>(), theData.m_ShadowMapManager.mPtr,
+ const_cast<NVRenderTexture2D *>(inRenderContext.m_DepthTexture),
+ const_cast<NVRenderTexture2D *>(inRenderContext.m_AOTexture), theLayer.m_LightProbe,
+ theLayer.m_LightProbe2, theLayer.m_ProbeHorizon, theLayer.m_ProbeBright,
+ theLayer.m_Probe2Window, theLayer.m_Probe2Pos, theLayer.m_Probe2Fade,
+ theLayer.m_ProbeFov);
+ }
+
+ void RenderPass(SCustomMaterialRenderContext &inRenderContext, SCustomMaterialShader &inShader,
+ NVRenderTexture2D * /* inSourceTexture */
+ ,
+ NVRenderFrameBuffer *inFrameBuffer, bool inRenderTargetNeedsClear,
+ NVRenderInputAssembler &inAssembler, QT3DSU32 inCount, QT3DSU32 inOffset)
+ {
+ ICustomMaterialShaderGenerator &theMaterialGenerator(
+ m_Context->GetCustomMaterialShaderGenerator());
+
+ theMaterialGenerator.SetMaterialProperties(
+ *inShader.m_Shader, inRenderContext.m_Material, QT3DSVec2(1.0, 1.0),
+ inRenderContext.m_ModelViewProjection, inRenderContext.m_NormalMatrix,
+ inRenderContext.m_ModelMatrix, inRenderContext.m_FirstImage, inRenderContext.m_Opacity,
+ GetLayerGlobalRenderProperties(inRenderContext));
+
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ theContext.SetRenderTarget(inFrameBuffer);
+
+ QT3DSVec4 clearColor(0.0);
+ NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
+ theContext, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor,
+ clearColor);
+ if (inRenderTargetNeedsClear) {
+ theContext.Clear(qt3ds::render::NVRenderClearValues::Color);
+ }
+
+ // I think the prim type should always be fetched from the
+ // current mesh subset setup because there you get the actual draw mode
+ // for this frame
+ NVRenderDrawMode::Enum theDrawMode = inAssembler.GetPrimitiveType();
+
+ // tesselation
+ if (inRenderContext.m_Subset.m_PrimitiveType == NVRenderDrawMode::Patches) {
+ QT3DSVec2 camProps(inRenderContext.m_Camera.m_ClipNear,
+ inRenderContext.m_Camera.m_ClipFar);
+ theDrawMode = inRenderContext.m_Subset.m_PrimitiveType;
+ inShader.m_Tessellation.m_EdgeTessLevel.Set(inRenderContext.m_Subset.m_EdgeTessFactor);
+ inShader.m_Tessellation.m_InsideTessLevel.Set(
+ inRenderContext.m_Subset.m_InnerTessFactor);
+ // the blend value is hardcoded
+ inShader.m_Tessellation.m_PhongBlend.Set(0.75);
+ // this should finally be based on some user input
+ inShader.m_Tessellation.m_DistanceRange.Set(camProps);
+ // enable culling
+ inShader.m_Tessellation.m_DisableCulling.Set(0.0);
+ }
+
+ if (inRenderContext.m_Subset.m_WireframeMode) {
+ NVRenderRect theViewport(theContext.GetViewport());
+ QT3DSMat44 vpMatrix;
+ vpMatrix.column0 = QT3DSVec4((float)theViewport.m_Width / 2.0f, 0.0, 0.0, 0.0);
+ vpMatrix.column1 = QT3DSVec4(0.0, (float)theViewport.m_Height / 2.0f, 0.0, 0.0);
+ vpMatrix.column2 = QT3DSVec4(0.0, 0.0, 1.0, 0.0);
+ vpMatrix.column3 =
+ QT3DSVec4((float)theViewport.m_Width / 2.0f + (float)theViewport.m_X,
+ (float)theViewport.m_Height / 2.0f + (float)theViewport.m_Y, 0.0, 1.0);
+
+ inShader.m_ViewportMatrix.Set(vpMatrix);
+ }
+
+ theContext.SetInputAssembler(&inAssembler);
+
+ theContext.SetCullingEnabled(true);
+ QT3DSU32 count = inCount;
+ QT3DSU32 offset = inOffset;
+
+ theContext.Draw(theDrawMode, count, offset);
+ }
+
+ void DoRenderCustomMaterial(SCustomMaterialRenderContext &inRenderContext,
+ const SCustomMaterial &inMaterial, SMaterialClass &inClass,
+ NVRenderFrameBuffer *inTarget, TShaderFeatureSet inFeatureSet)
+ {
+ NVRenderContext &theContext = m_Context->GetRenderContext();
+ SCustomMaterialShader *theCurrentShader(NULL);
+
+ NVRenderFrameBuffer *theCurrentRenderTarget(inTarget);
+ NVRenderRect theOriginalViewport(theContext.GetViewport());
+ NVRenderTexture2D *theCurrentSourceTexture = 0;
+
+ // for refrative materials we come from the transparent render path
+ // but we do not want to do blending
+ bool wasBlendingEnabled = theContext.IsBlendingEnabled();
+ if (inMaterial.m_hasRefraction)
+ theContext.SetBlendingEnabled(false);
+
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __framebuffer(
+ theContext, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport);
+
+ QT3DSVec2 theDestSize;
+ bool theRenderTargetNeedsClear = false;
+
+ NVConstDataRef<dynamic::SCommand *> theCommands(inClass.m_Class->GetRenderCommands());
+ for (QT3DSU32 commandIdx = 0, commandEnd = theCommands.size(); commandIdx < commandEnd;
+ ++commandIdx) {
+ const SCommand &theCommand(*theCommands[commandIdx]);
+
+ switch (theCommand.m_Type) {
+ case CommandTypes::AllocateBuffer:
+ AllocateBuffer(static_cast<const SAllocateBuffer &>(theCommand), inTarget);
+ break;
+ case CommandTypes::BindBuffer:
+ theCurrentRenderTarget =
+ BindBuffer(inMaterial, static_cast<const SBindBuffer &>(theCommand),
+ theRenderTargetNeedsClear, theDestSize);
+ break;
+ case CommandTypes::BindTarget:
+ // Restore the previous render target and info.
+ theCurrentRenderTarget = inTarget;
+ theContext.SetViewport(theOriginalViewport);
+ break;
+ case CommandTypes::BindShader: {
+ theCurrentShader = NULL;
+ SMaterialOrComputeShader theBindResult =
+ BindShader(inRenderContext, inMaterial,
+ static_cast<const SBindShader &>(theCommand), inFeatureSet);
+ if (theBindResult.IsMaterialShader())
+ theCurrentShader = &theBindResult.MaterialShader();
+ } break;
+ case CommandTypes::ApplyInstanceValue:
+ // we apply the property update explicitly at the render pass
+ break;
+ case CommandTypes::Render:
+ if (theCurrentShader) {
+ RenderPass(inRenderContext, *theCurrentShader, theCurrentSourceTexture,
+ theCurrentRenderTarget, theRenderTargetNeedsClear,
+ *inRenderContext.m_Subset.m_InputAssembler,
+ inRenderContext.m_Subset.m_Count, inRenderContext.m_Subset.m_Offset);
+ }
+ // reset
+ theRenderTargetNeedsClear = false;
+ break;
+ case CommandTypes::ApplyBlending:
+ ApplyBlending(static_cast<const SApplyBlending &>(theCommand));
+ break;
+ case CommandTypes::ApplyBufferValue:
+ if (theCurrentShader)
+ ApplyBufferValue(inMaterial, *theCurrentShader->m_Shader,
+ static_cast<const SApplyBufferValue &>(theCommand),
+ theCurrentSourceTexture);
+ break;
+ case CommandTypes::ApplyBlitFramebuffer:
+ BlitFramebuffer(inRenderContext,
+ static_cast<const SApplyBlitFramebuffer &>(theCommand), inTarget);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ if (inMaterial.m_hasRefraction)
+ theContext.SetBlendingEnabled(wasBlendingEnabled);
+
+ // Release any per-frame buffers
+ for (QT3DSU32 idx = 0; idx < m_AllocatedBuffers.size(); ++idx) {
+ if (m_AllocatedBuffers[idx].m_Flags.IsSceneLifetime() == false) {
+ ReleaseBuffer(idx);
+ --idx;
+ }
+ }
+ }
+
+ const char *GetShaderName(const SCustomMaterial &inMaterial) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inMaterial.m_ClassName);
+ if (!theClass)
+ return NULL;
+
+ NVConstDataRef<dynamic::SCommand *> theCommands = theClass->m_Class->GetRenderCommands();
+ TShaderAndFlags thePrepassShader;
+ for (QT3DSU32 idx = 0, end = theCommands.size();
+ idx < end && thePrepassShader.first.mPtr == NULL; ++idx) {
+ const SCommand &theCommand = *theCommands[idx];
+ if (theCommand.m_Type == CommandTypes::BindShader) {
+ const SBindShader &theBindCommand = static_cast<const SBindShader &>(theCommand);
+ return theBindCommand.m_ShaderPath.c_str();
+ }
+ }
+
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ void ApplyShaderPropertyValues(const SCustomMaterial &inMaterial,
+ NVRenderShaderProgram &inProgram) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inMaterial.m_ClassName);
+ if (!theClass)
+ return;
+
+ SApplyInstanceValue applier;
+ ApplyInstanceValue(const_cast<SCustomMaterial &>(inMaterial), *theClass, inProgram,
+ applier);
+ }
+
+ void renderSubpresentations(SCustomMaterial &inMaterial) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inMaterial.m_ClassName);
+ if (!theClass)
+ return;
+
+ NVConstDataRef<SPropertyDefinition> theDefs = theClass->m_Class->GetProperties();
+ for (QT3DSU32 idx = 0, end = theDefs.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(theDefs[idx]);
+ if (theDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ QT3DSU8 *dataPtr = inMaterial.GetDataSectionBegin() + theDefinition.m_Offset;
+ StaticAssert<sizeof(CRegisteredString)
+ == sizeof(NVRenderTexture2DPtr)>::valid_expression();
+ CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(dataPtr);
+ IOffscreenRenderManager &theOffscreenRenderer(
+ m_Context->GetOffscreenRenderManager());
+
+ if (theStrPtr->IsValid()) {
+ if (theOffscreenRenderer.HasOffscreenRenderer(*theStrPtr))
+ theOffscreenRenderer.GetRenderedItem(*theStrPtr);
+ }
+ }
+ }
+ }
+
+ virtual void PrepareTextureForRender(SMaterialClass &inClass, SCustomMaterial &inMaterial)
+ {
+ NVConstDataRef<SPropertyDefinition> thePropDefs = inClass.m_Class->GetProperties();
+ for (QT3DSU32 idx = 0, end = thePropDefs.size(); idx < end; ++idx) {
+ if (thePropDefs[idx].m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ if (thePropDefs[idx].m_TexUsageType == NVRenderTextureTypeValue::Displace) {
+ SImage *pImage = NULL;
+
+ // we only do this to not miss if "None" is selected
+ CRegisteredString theStrPtr = *reinterpret_cast<CRegisteredString *>(
+ inMaterial.GetDataSectionBegin() + thePropDefs[idx].m_Offset);
+
+ if (theStrPtr.IsValid()) {
+
+ QT3DSU32 index = FindAllocatedImage(thePropDefs[idx].m_ImagePath);
+ if (index == QT3DSU32(-1)) {
+ pImage = QT3DS_NEW(m_CoreContext.GetAllocator(), SImage)();
+ m_AllocatedImages.push_back(
+ eastl::make_pair(thePropDefs[idx].m_ImagePath, pImage));
+ } else
+ pImage = m_AllocatedImages[index].second;
+
+ if (inMaterial.m_DisplacementMap != pImage) {
+ inMaterial.m_DisplacementMap = pImage;
+ inMaterial.m_DisplacementMap->m_ImagePath =
+ thePropDefs[idx].m_ImagePath;
+ inMaterial.m_DisplacementMap->m_ImageShaderName =
+ thePropDefs[idx].m_Name; // this is our name in the shader
+ inMaterial.m_DisplacementMap->m_VerticalTilingMode =
+ thePropDefs[idx].m_CoordOp;
+ inMaterial.m_DisplacementMap->m_HorizontalTilingMode =
+ thePropDefs[idx].m_CoordOp;
+ }
+ } else {
+ inMaterial.m_DisplacementMap = NULL;
+ }
+ } else if (thePropDefs[idx].m_TexUsageType == NVRenderTextureTypeValue::Emissive2) {
+ SImage *pImage = NULL;
+
+ // we only do this to not miss if "None" is selected
+ CRegisteredString theStrPtr = *reinterpret_cast<CRegisteredString *>(
+ inMaterial.GetDataSectionBegin() + thePropDefs[idx].m_Offset);
+
+ if (theStrPtr.IsValid()) {
+ QT3DSU32 index = FindAllocatedImage(thePropDefs[idx].m_ImagePath);
+ if (index == QT3DSU32(-1)) {
+ pImage = QT3DS_NEW(m_CoreContext.GetAllocator(), SImage)();
+ m_AllocatedImages.push_back(
+ eastl::make_pair(thePropDefs[idx].m_ImagePath, pImage));
+ } else
+ pImage = m_AllocatedImages[index].second;
+
+ if (inMaterial.m_EmissiveMap2 != pImage) {
+ inMaterial.m_EmissiveMap2 = pImage;
+ inMaterial.m_EmissiveMap2->m_ImagePath = thePropDefs[idx].m_ImagePath;
+ inMaterial.m_EmissiveMap2->m_ImageShaderName =
+ thePropDefs[idx].m_Name; // this is our name in the shader
+ inMaterial.m_EmissiveMap2->m_VerticalTilingMode =
+ thePropDefs[idx].m_CoordOp;
+ inMaterial.m_EmissiveMap2->m_HorizontalTilingMode =
+ thePropDefs[idx].m_CoordOp;
+ }
+ } else {
+ inMaterial.m_EmissiveMap2 = NULL;
+ }
+ }
+ }
+ }
+ }
+
+ virtual void PrepareDisplacementForRender(SMaterialClass &inClass, SCustomMaterial &inMaterial)
+ {
+ if (inMaterial.m_DisplacementMap == NULL)
+ return;
+
+ // our displacement mappin in MDL has fixed naming
+ NVConstDataRef<SPropertyDefinition> thePropDefs = inClass.m_Class->GetProperties();
+ for (QT3DSU32 idx = 0, end = thePropDefs.size(); idx < end; ++idx) {
+ if (thePropDefs[idx].m_DataType == NVRenderShaderDataTypes::QT3DSF32
+ && AreEqual(thePropDefs[idx].m_Name.c_str(), "displaceAmount")) {
+ QT3DSF32 theValue = *reinterpret_cast<const QT3DSF32 *>(inMaterial.GetDataSectionBegin()
+ + thePropDefs[idx].m_Offset);
+ inMaterial.m_DisplaceAmount = theValue;
+ } else if (thePropDefs[idx].m_DataType == NVRenderShaderDataTypes::QT3DSVec3
+ && AreEqual(thePropDefs[idx].m_Name.c_str(), "displace_tiling")) {
+ QT3DSVec3 theValue = *reinterpret_cast<const QT3DSVec3 *>(inMaterial.GetDataSectionBegin()
+ + thePropDefs[idx].m_Offset);
+ if (theValue.x != inMaterial.m_DisplacementMap->m_Scale.x
+ || theValue.y != inMaterial.m_DisplacementMap->m_Scale.y) {
+ inMaterial.m_DisplacementMap->m_Scale = QT3DSVec2(theValue.x, theValue.y);
+ inMaterial.m_DisplacementMap->m_Flags.SetTransformDirty(true);
+ }
+ }
+ }
+ }
+
+ void PrepareMaterialForRender(SMaterialClass &inClass, SCustomMaterial &inMaterial)
+ {
+ PrepareTextureForRender(inClass, inMaterial);
+
+ if (inClass.m_HasDisplacement)
+ PrepareDisplacementForRender(inClass, inMaterial);
+ }
+
+ // Returns true if the material is dirty and thus will produce a different render result
+ // than previously. This effects things like progressive AA.
+ // TODO - return more information, specifically about transparency (object is transparent,
+ // object is completely transparent
+ bool PrepareForRender(const SModel & /*inModel*/, const SRenderSubset & /*inSubset*/,
+ SCustomMaterial &inMaterial, bool clearMaterialDirtyFlags) override
+ {
+ SMaterialClass *theMaterialClass = GetMaterialClass(inMaterial.m_ClassName);
+ if (theMaterialClass == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ PrepareMaterialForRender(*theMaterialClass, inMaterial);
+
+ inMaterial.m_hasTransparency = theMaterialClass->m_HasTransparency;
+ inMaterial.m_hasRefraction = theMaterialClass->m_HasRefraction;
+ inMaterial.m_hasVolumetricDF = false;
+
+ bool wasDirty = inMaterial.IsDirty() || theMaterialClass->m_AlwaysDirty;
+ if (clearMaterialDirtyFlags)
+ inMaterial.UpdateDirtyForFrame();
+
+ return wasDirty;
+ }
+
+ // TODO - handle UIC specific features such as vertex offsets for prog-aa and opacity.
+ void RenderSubset(SCustomMaterialRenderContext &inRenderContext,
+ TShaderFeatureSet inFeatureSet) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inRenderContext.m_Material.m_ClassName);
+
+ // Ensure that our overall render context comes back no matter what the client does.
+ qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBlendFunctionArgument>
+ __blendFunction(m_Context->GetRenderContext(), &NVRenderContext::GetBlendFunction,
+ &NVRenderContext::SetBlendFunction,
+ qt3ds::render::NVRenderBlendFunctionArgument());
+ qt3ds::render::NVRenderContextScopedProperty<qt3ds::render::NVRenderBlendEquationArgument>
+ __blendEquation(m_Context->GetRenderContext(), &NVRenderContext::GetBlendEquation,
+ &NVRenderContext::SetBlendEquation,
+ qt3ds::render::NVRenderBlendEquationArgument());
+
+ NVRenderContextScopedProperty<bool> theBlendEnabled(m_Context->GetRenderContext(),
+ &NVRenderContext::IsBlendingEnabled,
+ &NVRenderContext::SetBlendingEnabled);
+
+ DoRenderCustomMaterial(inRenderContext, inRenderContext.m_Material, *theClass,
+ m_Context->GetRenderContext().GetRenderTarget(), inFeatureSet);
+ }
+
+ bool RenderDepthPrepass(const QT3DSMat44 &inMVP, const SCustomMaterial &inMaterial,
+ const SRenderSubset &inSubset) override
+ {
+ SMaterialClass *theClass = GetMaterialClass(inMaterial.m_ClassName);
+ NVConstDataRef<dynamic::SCommand *> theCommands = theClass->m_Class->GetRenderCommands();
+ TShaderAndFlags thePrepassShader;
+ for (QT3DSU32 idx = 0, end = theCommands.size();
+ idx < end && thePrepassShader.first.mPtr == NULL; ++idx) {
+ const SCommand &theCommand = *theCommands[idx];
+ if (theCommand.m_Type == CommandTypes::BindShader) {
+ const SBindShader &theBindCommand = static_cast<const SBindShader &>(theCommand);
+ thePrepassShader = m_Context->GetDynamicObjectSystem().GetDepthPrepassShader(
+ theBindCommand.m_ShaderPath, CRegisteredString(), TShaderFeatureSet());
+ }
+ }
+
+ if (thePrepassShader.first.mPtr == NULL)
+ return false;
+
+ NVRenderContext &theContext = m_Context->GetRenderContext();
+ NVRenderShaderProgram &theProgram = *thePrepassShader.first;
+ theContext.SetActiveShader(&theProgram);
+ theProgram.SetPropertyValue("model_view_projection", inMVP);
+ theContext.SetInputAssembler(inSubset.m_InputAssemblerPoints);
+ theContext.Draw(NVRenderDrawMode::Lines, inSubset.m_PosVertexBuffer->GetNumVertexes(), 0);
+ return true;
+ }
+
+ void OnMaterialActivationChange(const SCustomMaterial &inMaterial, bool inActive) override
+ {
+ Q_UNUSED(inMaterial)
+ Q_UNUSED(inActive)
+ }
+
+ void EndFrame() override
+ {
+ QT3DSU64 currentFrameTime = qt3ds::foundation::Time::getCurrentTimeInTensOfNanoSeconds();
+ if (m_LastFrameTime) {
+ QT3DSU64 timePassed = currentFrameTime - m_LastFrameTime;
+ m_MillisecondsSinceLastFrame = static_cast<QT3DSF32>(timePassed / 100000.0);
+ }
+ m_LastFrameTime = currentFrameTime;
+ }
+
+ void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap,
+ const char8_t * /*inProjectDir*/) const override
+ {
+ QT3DSU32 offset = ioBuffer.size();
+ ioBuffer.write((QT3DSU32)m_StringMaterialMap.size());
+ for (TStringMaterialMap::const_iterator iter = m_StringMaterialMap.begin(),
+ end = m_StringMaterialMap.end();
+ iter != end; ++iter) {
+ size_t nameOffset = ioBuffer.size() - offset;
+ (void)nameOffset;
+ CRegisteredString materialName(iter->first);
+ materialName.Remap(inRemapMap);
+ ioBuffer.write(materialName);
+ const SMaterialClass *materialClass = iter->second.mPtr;
+ QT3DSU32 offset = ioBuffer.size();
+ ioBuffer.write(*materialClass);
+ QT3DSU8 *materialOffset = ioBuffer.begin() + offset;
+ SMaterialClass *writtenClass = (SMaterialClass *)materialOffset;
+ writtenClass->AfterWrite();
+ ioBuffer.align(4);
+ }
+ }
+
+ void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t * /*inProjectDir*/) override
+ {
+ m_Allocator.m_PreAllocatedBlock = inData;
+ m_Allocator.m_OwnsMemory = false;
+ qt3ds::render::SDataReader theReader(inData.begin(), inData.end());
+ QT3DSU32 numMaterialClasses = theReader.LoadRef<QT3DSU32>();
+ for (QT3DSU32 idx = 0; idx < numMaterialClasses; ++idx) {
+ CRegisteredString clsName = theReader.LoadRef<CRegisteredString>();
+ clsName.Remap(inStrDataBlock);
+ IDynamicObjectClass *theDynamicCls =
+ m_CoreContext.GetDynamicObjectSystemCore().GetDynamicObjectClass(clsName);
+ SMaterialClass *theReadClass = theReader.Load<SMaterialClass>();
+ theReader.Align(4);
+ if (theDynamicCls) {
+ theReadClass->AfterRead(m_Allocator, *theDynamicCls);
+ m_StringMaterialMap.insert(eastl::make_pair(clsName, theReadClass));
+ }
+ }
+ }
+
+ ICustomMaterialSystem &GetCustomMaterialSystem(IQt3DSRenderContext &inContext) override
+ {
+ m_Context = &inContext;
+
+ // check for fast blits
+ NVRenderContext &theContext = m_Context->GetRenderContext();
+ m_UseFastBlits = theContext.GetRenderBackendCap(
+ qt3ds::render::NVRenderBackend::NVRenderBackendCaps::FastBlits);
+
+ return *this;
+ }
+};
+}
+
+ICustomMaterialSystemCore &
+ICustomMaterialSystemCore::CreateCustomMaterialSystemCore(IQt3DSRenderContextCore &ctx)
+{
+ return *QT3DS_NEW(ctx.GetAllocator(), SMaterialSystem)(ctx);
+}
+
diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialSystem.h b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.h
new file mode 100644
index 0000000..6fe522f
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderCustomMaterialSystem.h
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CUSTOM_MATERIAL_SYSTEM_H
+#define QT3DS_RENDER_CUSTOM_MATERIAL_SYSTEM_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "rendererimpl/Qt3DSVertexPipelineImpl.h"
+
+namespace qt3ds {
+namespace render {
+
+ namespace dynamic {
+ struct SCommand; // UICRenderEffectCommands.h
+ }
+
+ struct SCustomMaterialRenderContext;
+
+ class ICustomMaterialSystemCore : public NVRefCounted
+ {
+ public:
+ virtual bool IsMaterialRegistered(CRegisteredString inStr) = 0;
+
+ virtual bool
+ RegisterMaterialClass(CRegisteredString inName,
+ NVConstDataRef<dynamic::SPropertyDeclaration> inProperties) = 0;
+
+ virtual NVConstDataRef<dynamic::SPropertyDefinition>
+ GetCustomMaterialProperties(CRegisteredString inCustomMaterialName) const = 0;
+
+ virtual void SetCustomMaterialRefraction(CRegisteredString inName,
+ bool inHasRefraction) = 0;
+ virtual void SetCustomMaterialTransparency(CRegisteredString inName,
+ bool inHasTransparency) = 0;
+ virtual void SetCustomMaterialAlwaysDirty(CRegisteredString inName,
+ bool inIsAlwaysDirty) = 0;
+ virtual void SetCustomMaterialShaderKey(CRegisteredString inName, QT3DSU32 inShaderKey) = 0;
+ virtual void SetCustomMaterialLayerCount(CRegisteredString inName, QT3DSU32 inLayerCount) = 0;
+ // The custom material commands are the actual commands that run for a given material
+ // effect. The tell the system exactly
+ // explicitly things like bind this shader, bind this render target, apply this property,
+ // run this shader
+ // See UICRenderEffectCommands.h for the list of commands.
+ // These commands are copied into the effect.
+ virtual void SetCustomMaterialCommands(CRegisteredString inName,
+ NVConstDataRef<dynamic::SCommand *> inCommands) = 0;
+
+ virtual void SetMaterialClassShader(CRegisteredString inName, const char8_t *inShaderType,
+ const char8_t *inShaderVersion,
+ const char8_t *inShaderData, bool inHasGeomShader,
+ bool inIsComputeShader) = 0;
+
+ virtual SCustomMaterial *
+ CreateCustomMaterial(CRegisteredString inName,
+ NVAllocatorCallback &inSceneGraphAllocator) = 0;
+
+ virtual void SetPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName,
+ NVConstDataRef<CRegisteredString> inNames) = 0;
+
+ virtual void SetPropertyTextureSettings(CRegisteredString inEffectName,
+ CRegisteredString inPropName,
+ CRegisteredString inPropPath,
+ NVRenderTextureTypeValue::Enum inTexType,
+ NVRenderTextureCoordOp::Enum inCoordOp,
+ NVRenderTextureMagnifyingOp::Enum inMagFilterOp,
+ NVRenderTextureMinifyingOp::Enum inMinFilterOp) = 0;
+
+ virtual void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap,
+ const char8_t *inProjectDir) const = 0;
+ virtual void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t *inProjectDir) = 0;
+
+ virtual ICustomMaterialSystem &GetCustomMaterialSystem(IQt3DSRenderContext &inContext) = 0;
+
+ static ICustomMaterialSystemCore &
+ CreateCustomMaterialSystemCore(IQt3DSRenderContextCore &inContext);
+ };
+ // How to handle blend modes?
+ class ICustomMaterialSystem : public ICustomMaterialSystemCore
+ {
+ public:
+ // Returns true if the material is dirty and thus will produce a different render result
+ // than previously. This effects things like progressive AA.
+ virtual bool PrepareForRender(const SModel &inModel, const SRenderSubset &inSubset,
+ SCustomMaterial &inMaterial, bool inClearDirty) = 0;
+
+ virtual bool RenderDepthPrepass(const QT3DSMat44 &inMVP, const SCustomMaterial &inMaterial,
+ const SRenderSubset &inSubset) = 0;
+ virtual void RenderSubset(SCustomMaterialRenderContext &inRenderContext,
+ TShaderFeatureSet inFeatureSet) = 0;
+ virtual void OnMaterialActivationChange(const SCustomMaterial &inMaterial,
+ bool inActive) = 0;
+
+ // get shader name
+ virtual const char *GetShaderName(const SCustomMaterial &inMaterial) = 0;
+ // apply property values
+ virtual void ApplyShaderPropertyValues(const SCustomMaterial &inMaterial,
+ NVRenderShaderProgram &inProgram) = 0;
+ virtual void renderSubpresentations(SCustomMaterial &inMaterial) = 0;
+ // Called by the uiccontext so this system can clear any per-frame render information.
+ virtual void EndFrame() = 0;
+ };
+
+ struct QT3DS_AUTOTEST_EXPORT SCustomMaterialVertexPipeline : public SVertexPipelineImpl
+ {
+ IQt3DSRenderContext *m_Context;
+ TessModeValues::Enum m_TessMode;
+
+ SCustomMaterialVertexPipeline(IQt3DSRenderContext *inContext, TessModeValues::Enum inTessMode);
+ void InitializeTessControlShader();
+ void InitializeTessEvaluationShader();
+ void FinalizeTessControlShader();
+ void FinalizeTessEvaluationShader();
+
+ // Responsible for beginning all vertex and fragment generation (void main() { etc).
+ virtual void BeginVertexGeneration(QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) override;
+ // The fragment shader expects a floating point constant, object_opacity to be defined
+ // post this method.
+ virtual void BeginFragmentGeneration() override;
+ // Output variables may be mangled in some circumstances so the shader generation
+ // system needs an abstraction mechanism around this.
+ virtual void AssignOutput(const char8_t *inVarName, const char8_t *inVarValue) override;
+ virtual void GenerateEnvMapReflection() override {}
+ virtual void GenerateViewVector() override {}
+ virtual void GenerateUVCoords(QT3DSU32 inUVSet) override;
+ virtual void GenerateWorldNormal() override;
+ virtual void GenerateObjectNormal() override;
+ virtual void GenerateVarTangentAndBinormal() override;
+ virtual void GenerateWorldPosition() override;
+ // responsible for closing all vertex and fragment generation
+ virtual void EndVertexGeneration(bool customShader) override;
+ virtual void EndFragmentGeneration(bool customShader) override;
+ virtual IShaderStageGenerator &ActiveStage() override;
+ virtual void AddInterpolationParameter(const char8_t *inName, const char8_t *inType) override;
+ virtual void DoGenerateUVCoords(QT3DSU32 inUVSet) override;
+ virtual void DoGenerateWorldNormal() override;
+ virtual void DoGenerateObjectNormal() override;
+ virtual void DoGenerateWorldPosition() override;
+ virtual void DoGenerateVarTangentAndBinormal() override;
+ virtual void DoGenerateVertexColor() override;
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp
new file mode 100644
index 0000000..221f329
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp
@@ -0,0 +1,1931 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "Qt3DSRenderableImage.h"
+#include "Qt3DSRenderImage.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSRenderLight.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderShadowMap.h"
+#include "Qt3DSRenderCustomMaterial.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderLightConstantProperties.h"
+
+using namespace qt3ds::render;
+using qt3ds::render::NVRenderCachedShaderProperty;
+using qt3ds::render::NVRenderCachedShaderBuffer;
+
+namespace {
+
+const QT3DSF32 MINATTENUATION = 0;
+const QT3DSF32 MAXATTENUATION = 1000;
+
+QT3DSF32 ClampFloat(QT3DSF32 value, QT3DSF32 min, QT3DSF32 max)
+{
+ return value < min ? min : ((value > max) ? max : value);
+}
+
+QT3DSF32 TranslateConstantAttenuation(QT3DSF32 attenuation)
+{
+ return attenuation * .01f;
+}
+
+QT3DSF32 TranslateLinearAttenuation(QT3DSF32 attenuation)
+{
+ attenuation = ClampFloat(attenuation, MINATTENUATION, MAXATTENUATION);
+ return attenuation * 0.0001f;
+}
+
+QT3DSF32 TranslateQuadraticAttenuation(QT3DSF32 attenuation)
+{
+ attenuation = ClampFloat(attenuation, MINATTENUATION, MAXATTENUATION);
+ return attenuation * 0.0000001f;
+}
+
+/**
+ * Cached texture property lookups, used one per texture so a shader generator for N
+ * textures will have an array of N of these lookup objects.
+ */
+struct SShaderTextureProperties
+{
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_Offsets;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_Rotations;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_Size;
+ SShaderTextureProperties(const char *sampName, const char *offName, const char *rotName,
+ const char *sizeName,
+ NVRenderShaderProgram &inShader)
+ : m_Sampler(sampName, inShader)
+ , m_Offsets(offName, inShader)
+ , m_Rotations(rotName, inShader)
+ , m_Size(sizeName, inShader)
+ {
+ }
+ SShaderTextureProperties() {}
+};
+
+/**
+ * Cached light property lookups, used one per light so a shader generator for N
+ * lights will have an array of N of these lookup objects.
+ */
+struct SShaderLightProperties
+{
+ // Color of the light
+ QT3DSVec4 m_LightColor;
+ SLightSourceShader m_LightData;
+
+ SShaderLightProperties() {}
+};
+
+struct SShadowMapProperties
+{
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_ShadowmapTexture; ///< shadow texture
+ NVRenderCachedShaderProperty<NVRenderTextureCube *> m_ShadowCubeTexture; ///< shadow cubemap
+ NVRenderCachedShaderProperty<QT3DSMat44>
+ m_ShadowmapMatrix; ///< world to ligh space transform matrix
+ NVRenderCachedShaderProperty<QT3DSVec4> m_ShadowmapSettings; ///< shadow rendering settings
+
+ SShadowMapProperties() {}
+ SShadowMapProperties(const char *shadowmapTextureName, const char *shadowcubeTextureName,
+ const char *shadowmapMatrixName, const char *shadowmapSettingsName,
+ NVRenderShaderProgram &inShader)
+ : m_ShadowmapTexture(shadowmapTextureName, inShader)
+ , m_ShadowCubeTexture(shadowcubeTextureName, inShader)
+ , m_ShadowmapMatrix(shadowmapMatrixName, inShader)
+ , m_ShadowmapSettings(shadowmapSettingsName, inShader)
+ {
+ }
+};
+
+/**
+ * The results of generating a shader. Caches all possible variable names into
+ * typesafe objects.
+ */
+struct SShaderGeneratorGeneratedShader
+{
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ // Specific properties we know the shader has to have.
+ NVRenderCachedShaderProperty<QT3DSMat44> m_MVP;
+ NVRenderCachedShaderProperty<QT3DSMat33> m_NormalMatrix;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_GlobalTransform;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewProj;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewMatrix;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_MaterialDiffuse;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_MaterialProperties;
+ // tint, ior
+ NVRenderCachedShaderProperty<QT3DSVec4> m_MaterialSpecular;
+ NVRenderCachedShaderProperty<QT3DSF32> m_BumpAmount;
+ NVRenderCachedShaderProperty<QT3DSF32> m_DisplaceAmount;
+ NVRenderCachedShaderProperty<QT3DSF32> m_TranslucentFalloff;
+ NVRenderCachedShaderProperty<QT3DSF32> m_DiffuseLightWrap;
+ NVRenderCachedShaderProperty<QT3DSF32> m_FresnelPower;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_DiffuseColor;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraPosition;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraDirection;
+ QT3DSVec3 m_LightAmbientTotal;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_MaterialDiffuseLightAmbientTotal;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraProperties;
+
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_DepthTexture;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_AOTexture;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LightProbe;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeProps;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeOpts;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeRot;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbeOfs;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_LightProbeSize;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LightProbe2;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbe2Props;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_LightProbe2Size;
+
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_AoShadowParams;
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_LightsBuffer;
+
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *m_lightConstantProperties;
+
+ // Cache the image property name lookups
+ nvvector<SShaderTextureProperties> m_Images;
+ nvvector<SShaderLightProperties> m_Lights;
+ // Cache shadow map properties
+ nvvector<SShadowMapProperties> m_ShadowMaps;
+
+ QT3DSI32 m_RefCount;
+
+ SShaderGeneratorGeneratedShader(NVRenderShaderProgram &inShader, NVRenderContext &inContext)
+ : m_Allocator(inContext.GetAllocator())
+ , m_Shader(inShader)
+ , m_MVP("model_view_projection", inShader)
+ , m_NormalMatrix("normal_matrix", inShader)
+ , m_GlobalTransform("model_matrix", inShader)
+ , m_ViewProj("view_projection_matrix", inShader)
+ , m_ViewMatrix("view_matrix", inShader)
+ , m_MaterialDiffuse("material_diffuse", inShader)
+ , m_MaterialProperties("material_properties", inShader)
+ , m_MaterialSpecular("material_specular", inShader)
+ , m_BumpAmount("bumpAmount", inShader)
+ , m_DisplaceAmount("displaceAmount", inShader)
+ , m_TranslucentFalloff("translucentFalloff", inShader)
+ , m_DiffuseLightWrap("diffuseLightWrap", inShader)
+ , m_FresnelPower("fresnelPower", inShader)
+ , m_DiffuseColor("diffuse_color", inShader)
+ , m_CameraPosition("camera_position", inShader)
+ , m_CameraDirection("camera_direction", inShader)
+ , m_MaterialDiffuseLightAmbientTotal("light_ambient_total", inShader)
+ , m_CameraProperties("camera_properties", inShader)
+ , m_DepthTexture("depth_sampler", inShader)
+ , m_AOTexture("ao_sampler", inShader)
+ , m_LightProbe("light_probe", inShader)
+ , m_LightProbeProps("light_probe_props", inShader)
+ , m_LightProbeOpts("light_probe_opts", inShader)
+ , m_LightProbeRot("light_probe_rotation", inShader)
+ , m_LightProbeOfs("light_probe_offset", inShader)
+ , m_LightProbeSize("light_probe_size", inShader)
+ , m_LightProbe2("light_probe2", inShader)
+ , m_LightProbe2Props("light_probe2_props", inShader)
+ , m_LightProbe2Size("light_probe2_size", inShader)
+ , m_AoShadowParams("cbAoShadow", inShader)
+ , m_LightsBuffer("cbBufferLights", inShader)
+ , m_lightConstantProperties(NULL)
+ , m_Images(inContext.GetAllocator(), "SShaderGeneratorGeneratedShader::m_Images")
+ , m_Lights(inContext.GetAllocator(), "SShaderGeneratorGeneratedShader::m_Lights")
+ , m_ShadowMaps(inContext.GetAllocator(), "SShaderGeneratorGeneratedShader::m_ShadowMaps")
+ , m_RefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ ~SShaderGeneratorGeneratedShader()
+ {
+ if (m_lightConstantProperties)
+ delete m_lightConstantProperties;
+ m_Shader.release();
+ }
+
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Allocator);
+ NVDelete(alloc, this);
+ }
+ }
+};
+
+
+#ifndef EA_PLATFORM_WINDOWS
+#define _snprintf snprintf
+#endif
+
+struct SShaderGenerator : public IDefaultMaterialShaderGenerator
+{
+ typedef Qt3DSString TStrType;
+ typedef nvhash_map<NVRenderShaderProgram *, NVScopedRefCounted<SShaderGeneratorGeneratedShader>>
+ TProgramToShaderMap;
+ typedef qt3ds::foundation::nvhash_map<CRegisteredString,
+ NVScopedRefCounted<qt3ds::render::NVRenderConstantBuffer>>
+ TStrConstanBufMap;
+
+ IQt3DSRenderContext &m_RenderContext;
+ IShaderProgramGenerator &m_ProgramGenerator;
+
+ const SDefaultMaterial *m_CurrentMaterial;
+ SShaderDefaultMaterialKey *m_CurrentKey;
+ Qt3DSShadowMap *m_ShadowMapManager;
+ IDefaultMaterialVertexPipeline *m_CurrentPipeline;
+ TShaderFeatureSet m_CurrentFeatureSet;
+ NVDataRef<SLight *> m_Lights;
+ SRenderableImage *m_FirstImage;
+ bool m_HasTransparency;
+ bool m_LightsAsSeparateUniforms;
+
+ TStrType m_ImageStem;
+ TStrType m_ImageSampler;
+ TStrType m_ImageOffsets;
+ TStrType m_ImageRotations;
+ TStrType m_ImageFragCoords;
+ TStrType m_ImageTemp;
+ TStrType m_ImageSamplerSize;
+
+ TStrType m_TexCoordTemp;
+
+ TStrType m_LightStem;
+ TStrType m_LightColor;
+ TStrType m_LightSpecularColor;
+ TStrType m_LightAttenuation;
+ TStrType m_LightConstantAttenuation;
+ TStrType m_LightLinearAttenuation;
+ TStrType m_LightQuadraticAttenuation;
+ TStrType m_NormalizedDirection;
+ TStrType m_LightDirection;
+ TStrType m_LightPos;
+ TStrType m_LightUp;
+ TStrType m_LightRt;
+ TStrType m_RelativeDistance;
+ TStrType m_RelativeDirection;
+
+ TStrType m_ShadowMapStem;
+ TStrType m_ShadowCubeStem;
+ TStrType m_ShadowMatrixStem;
+ TStrType m_ShadowCoordStem;
+ TStrType m_ShadowControlStem;
+
+ TStrType m_TempStr;
+
+ eastl::string m_GeneratedShaderString;
+
+ SShaderDefaultMaterialKeyProperties m_DefaultMaterialShaderKeyProperties;
+ TProgramToShaderMap m_ProgramToShaderMap;
+
+ TStrConstanBufMap m_ConstantBuffers; ///< store all constants buffers
+
+ QT3DSI32 m_RefCount;
+
+ SShaderGenerator(IQt3DSRenderContext &inRc)
+ : m_RenderContext(inRc)
+ , m_ProgramGenerator(m_RenderContext.GetShaderProgramGenerator())
+ , m_CurrentMaterial(NULL)
+ , m_CurrentKey(NULL)
+ , m_ShadowMapManager(NULL)
+ , m_CurrentPipeline(NULL)
+ , m_FirstImage(NULL)
+ , m_LightsAsSeparateUniforms(false)
+ , m_ProgramToShaderMap(inRc.GetAllocator(), "m_ProgramToShaderMap")
+ , m_ConstantBuffers(inRc.GetAllocator(), "m_ConstantBuffers")
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ m_ConstantBuffers.clear();
+ NVDelete(m_RenderContext.GetAllocator(), this);
+ }
+ }
+ IShaderProgramGenerator &ProgramGenerator() { return m_ProgramGenerator; }
+ IDefaultMaterialVertexPipeline &VertexGenerator() { return *m_CurrentPipeline; }
+ IShaderStageGenerator &FragmentGenerator()
+ {
+ return *m_ProgramGenerator.GetStage(ShaderGeneratorStages::Fragment);
+ }
+ SShaderDefaultMaterialKey &Key() { return *m_CurrentKey; }
+ const SDefaultMaterial &Material() { return *m_CurrentMaterial; }
+ TShaderFeatureSet FeatureSet() { return m_CurrentFeatureSet; }
+ bool HasTransparency() { return m_HasTransparency; }
+
+ void addFunction(IShaderStageGenerator &generator, QString functionName)
+ {
+ generator.AddFunction(functionName);
+ }
+
+ void SetupImageVariableNames(size_t imageIdx)
+ {
+ m_ImageStem = "image";
+ char buf[16];
+ _snprintf(buf, 16, "%d", int(imageIdx));
+ m_ImageStem.append(buf);
+ m_ImageStem.append("_");
+
+ m_ImageSampler = m_ImageStem;
+ m_ImageSampler.append("sampler");
+ m_ImageOffsets = m_ImageStem;
+ m_ImageOffsets.append("offsets");
+ m_ImageRotations = m_ImageStem;
+ m_ImageRotations.append("rotations");
+ m_ImageFragCoords = m_ImageStem;
+ m_ImageFragCoords.append("uv_coords");
+ m_ImageSamplerSize = m_ImageStem;
+ m_ImageSamplerSize.append("size");
+ }
+
+ void SetupTexCoordVariableName(size_t uvSet)
+ {
+ m_TexCoordTemp = "varTexCoord";
+ char buf[16];
+ _snprintf(buf, 16, "%d", int(uvSet));
+ m_TexCoordTemp.append(buf);
+ }
+
+ SImageVariableNames GetImageVariableNames(QT3DSU32 inIdx) override
+ {
+ SetupImageVariableNames(inIdx);
+ SImageVariableNames retval;
+ retval.m_ImageSampler = m_ImageSampler.c_str();
+ retval.m_ImageFragCoords = m_ImageFragCoords.c_str();
+ return retval;
+ }
+
+ void AddLocalVariable(IShaderStageGenerator &inGenerator, const char8_t *inName,
+ const char8_t *inType)
+ {
+ inGenerator << "\t" << inType << " " << inName << ";" << Endl;
+ }
+
+ void AddLocalVariable(IShaderStageGenerator &inGenerator, const TStrType &inName,
+ const char8_t *inType)
+ {
+ AddLocalVariable(inGenerator, inName.c_str(), inType);
+ }
+
+ void GenerateImageUVCoordinates(IShaderStageGenerator &inVertexPipeline, QT3DSU32 idx, QT3DSU32 uvSet,
+ SRenderableImage &image) override
+ {
+ IDefaultMaterialVertexPipeline &vertexShader(
+ static_cast<IDefaultMaterialVertexPipeline &>(inVertexPipeline));
+ IShaderStageGenerator &fragmentShader(FragmentGenerator());
+ SetupImageVariableNames(idx);
+ SetupTexCoordVariableName(uvSet);
+ fragmentShader.AddUniform(m_ImageSampler, "sampler2D");
+ vertexShader.AddUniform(m_ImageOffsets, "vec3");
+ fragmentShader.AddUniform(m_ImageOffsets, "vec3");
+ vertexShader.AddUniform(m_ImageRotations, "vec4");
+ fragmentShader.AddUniform(m_ImageRotations, "vec4");
+
+ if (image.m_Image.m_MappingMode == ImageMappingModes::Normal) {
+ vertexShader << "\tuTransform = vec3( " << m_ImageRotations << ".x, "
+ << m_ImageRotations << ".y, " << m_ImageOffsets << ".x );" << Endl;
+ vertexShader << "\tvTransform = vec3( " << m_ImageRotations << ".z, "
+ << m_ImageRotations << ".w, " << m_ImageOffsets << ".y );" << Endl;
+ vertexShader.AddOutgoing(m_ImageFragCoords, "vec2");
+ addFunction(vertexShader, "getTransformedUVCoords");
+ vertexShader.GenerateUVCoords(uvSet);
+ m_ImageTemp = m_ImageFragCoords;
+ m_ImageTemp.append("temp");
+ vertexShader << "\tvec2 " << m_ImageTemp << " = getTransformedUVCoords( vec3( "
+ << m_TexCoordTemp << ", 1.0), uTransform, vTransform );" << Endl;
+ if (image.m_Image.m_TextureData.m_TextureFlags.IsInvertUVCoords())
+ vertexShader << "\t" << m_ImageTemp << ".y = 1.0 - " << m_ImageFragCoords << ".y;"
+ << Endl;
+
+ vertexShader.AssignOutput(m_ImageFragCoords.c_str(), m_ImageTemp.c_str());
+ } else {
+ fragmentShader << "\tuTransform = vec3( " << m_ImageRotations << ".x, "
+ << m_ImageRotations << ".y, " << m_ImageOffsets << ".x );" << Endl;
+ fragmentShader << "\tvTransform = vec3( " << m_ImageRotations << ".z, "
+ << m_ImageRotations << ".w, " << m_ImageOffsets << ".y );" << Endl;
+ vertexShader.GenerateEnvMapReflection();
+ addFunction(fragmentShader, "getTransformedUVCoords");
+ fragmentShader << "\tvec2 " << m_ImageFragCoords
+ << " = getTransformedUVCoords( environment_map_reflection, uTransform, "
+ "vTransform );"
+ << Endl;
+ if (image.m_Image.m_TextureData.m_TextureFlags.IsInvertUVCoords())
+ fragmentShader << "\t" << m_ImageFragCoords << ".y = 1.0 - " << m_ImageFragCoords
+ << ".y;" << Endl;
+ }
+ }
+
+ void GenerateImageUVCoordinates(QT3DSU32 idx, SRenderableImage &image, QT3DSU32 uvSet = 0)
+ {
+ GenerateImageUVCoordinates(VertexGenerator(), idx, uvSet, image);
+ }
+
+ void GenerateImageUVCoordinates(QT3DSU32 idx, SRenderableImage &image,
+ IDefaultMaterialVertexPipeline &inShader)
+ {
+ if (image.m_Image.m_MappingMode == ImageMappingModes::Normal) {
+ SetupImageVariableNames(idx);
+ inShader.AddUniform(m_ImageSampler, "sampler2D");
+ inShader.AddUniform(m_ImageOffsets, "vec3");
+ inShader.AddUniform(m_ImageRotations, "vec4");
+
+ inShader << "\tuTransform = vec3( " << m_ImageRotations << ".x, " << m_ImageRotations
+ << ".y, " << m_ImageOffsets << ".x );" << Endl;
+ inShader << "\tvTransform = vec3( " << m_ImageRotations << ".z, " << m_ImageRotations
+ << ".w, " << m_ImageOffsets << ".y );" << Endl;
+ inShader << "\tvec2 " << m_ImageFragCoords << ";" << Endl;
+ addFunction(inShader, "getTransformedUVCoords");
+ inShader.GenerateUVCoords();
+ inShader
+ << "\t" << m_ImageFragCoords
+ << " = getTransformedUVCoords( vec3( varTexCoord0, 1.0), uTransform, vTransform );"
+ << Endl;
+ if (image.m_Image.m_TextureData.m_TextureFlags.IsInvertUVCoords())
+ inShader << "\t" << m_ImageFragCoords << ".y = 1.0 - " << m_ImageFragCoords << ".y;"
+ << Endl;
+ }
+ }
+
+ void OutputSpecularEquation(DefaultMaterialSpecularModel::Enum inSpecularModel,
+ IShaderStageGenerator &fragmentShader, const char *inLightDir,
+ const char *inLightSpecColor)
+ {
+ switch (inSpecularModel) {
+ case DefaultMaterialSpecularModel::KGGX: {
+ fragmentShader.AddInclude("defaultMaterialPhysGlossyBSDF.glsllib");
+ fragmentShader.AddUniform("material_specular", "vec4");
+ fragmentShader << "\tglobal_specular_light.rgb += lightAttenuation * specularAmount * "
+ "specularColor * kggxGlossyDefaultMtl( "
+ << "world_normal, tangent, -" << inLightDir << ".xyz, view_vector, "
+ << inLightSpecColor
+ << ".rgb, vec3(material_specular.xyz), roughnessAmount, "
+ "roughnessAmount ).rgb;"
+ << Endl;
+ } break;
+ case DefaultMaterialSpecularModel::KWard: {
+ fragmentShader.AddInclude("defaultMaterialPhysGlossyBSDF.glsllib");
+ fragmentShader.AddUniform("material_specular", "vec4");
+ fragmentShader << "\tglobal_specular_light.rgb += lightAttenuation * specularAmount * "
+ "specularColor * wardGlossyDefaultMtl( "
+ << "world_normal, tangent, -" << inLightDir << ".xyz, view_vector, "
+ << inLightSpecColor
+ << ".rgb, vec3(material_specular.xyz), roughnessAmount, "
+ "roughnessAmount ).rgb;"
+ << Endl;
+ } break;
+ default:
+ addFunction(fragmentShader, "specularBSDF");
+ fragmentShader << "\tglobal_specular_light.rgb += lightAttenuation * specularAmount * "
+ "specularColor * specularBSDF( "
+ << "world_normal, -" << inLightDir << ".xyz, view_vector, "
+ << inLightSpecColor << ".rgb, 1.0, 2.56 / (roughnessAmount + "
+ "0.01), vec3(1.0), scatter_reflect ).rgb;"
+ << Endl;
+ break;
+ }
+ }
+
+ void OutputDiffuseAreaLighting(IShaderStageGenerator &infragmentShader, const char *inPos,
+ TStrType inLightPrefix)
+ {
+ m_NormalizedDirection = inLightPrefix + "_areaDir";
+ AddLocalVariable(infragmentShader, m_NormalizedDirection, "vec3");
+ infragmentShader << "\tlightAttenuation = calculateDiffuseAreaOld( " << m_LightDirection
+ << ".xyz, " << m_LightPos << ".xyz, " << m_LightUp << ", " << m_LightRt
+ << ", " << inPos << ", " << m_NormalizedDirection << " );" << Endl;
+ }
+
+ void OutputSpecularAreaLighting(IShaderStageGenerator &infragmentShader, const char *inPos,
+ const char *inView, const char *inLightSpecColor)
+ {
+ addFunction(infragmentShader, "sampleAreaGlossyDefault");
+ infragmentShader.AddUniform("material_specular", "vec4");
+ infragmentShader << "global_specular_light.rgb += " << inLightSpecColor
+ << ".rgb * lightAttenuation * shadowFac * material_specular.rgb * "
+ "specularAmount * sampleAreaGlossyDefault( tanFrame, "
+ << inPos << ", " << m_NormalizedDirection << ", " << m_LightPos << ".xyz, "
+ << m_LightRt << ".w, " << m_LightUp << ".w, " << inView
+ << ", roughnessAmount, roughnessAmount ).rgb;" << Endl;
+ }
+
+ void AddTranslucencyIrradiance(IShaderStageGenerator &infragmentShader, SRenderableImage *image,
+ TStrType inLightPrefix, bool areaLight)
+ {
+ if (image == NULL)
+ return;
+
+ addFunction(infragmentShader, "diffuseReflectionWrapBSDF");
+ if (areaLight) {
+ infragmentShader << "\tglobal_diffuse_light.rgb += lightAttenuation * "
+ "translucent_thickness_exp * diffuseReflectionWrapBSDF( "
+ "-world_normal, "
+ << m_NormalizedDirection << ", " << m_LightColor
+ << ".rgb, diffuseLightWrap ).rgb;" << Endl;
+ } else {
+ infragmentShader << "\tglobal_diffuse_light.rgb += lightAttenuation * "
+ "translucent_thickness_exp * diffuseReflectionWrapBSDF( "
+ "-world_normal, "
+ << "-" << m_NormalizedDirection << ", " << m_LightColor
+ << ".rgb, diffuseLightWrap ).rgb;" << Endl;
+ }
+ }
+
+ void SetupShadowMapVariableNames(size_t lightIdx)
+ {
+ m_ShadowMapStem = "shadowmap";
+ m_ShadowCubeStem = "shadowcube";
+ char buf[16];
+ _snprintf(buf, 16, "%d", int(lightIdx));
+ m_ShadowMapStem.append(buf);
+ m_ShadowCubeStem.append(buf);
+ m_ShadowMatrixStem = m_ShadowMapStem;
+ m_ShadowMatrixStem.append("_matrix");
+ m_ShadowCoordStem = m_ShadowMapStem;
+ m_ShadowCoordStem.append("_coord");
+ m_ShadowControlStem = m_ShadowMapStem;
+ m_ShadowControlStem.append("_control");
+ }
+
+ void AddShadowMapContribution(IShaderStageGenerator &inLightShader, QT3DSU32 lightIndex,
+ RenderLightTypes::Enum inType)
+ {
+ SetupShadowMapVariableNames(lightIndex);
+
+ inLightShader.AddInclude("shadowMapping.glsllib");
+ if (inType == RenderLightTypes::Directional) {
+ inLightShader.AddUniform(m_ShadowMapStem, "sampler2D");
+ } else {
+ inLightShader.AddUniform(m_ShadowCubeStem, "samplerCube");
+ }
+ inLightShader.AddUniform(m_ShadowControlStem, "vec4");
+ inLightShader.AddUniform(m_ShadowMatrixStem, "mat4");
+
+ /*
+ if ( inType == RenderLightTypes::Area )
+ {
+ inLightShader << "vec2 " << m_ShadowCoordStem << ";" << Endl;
+ inLightShader << "\tshadow_map_occl = sampleParaboloid( " << m_ShadowMapStem << ", "
+ << m_ShadowControlStem << ", "
+ <<
+ m_ShadowMatrixStem << ", varWorldPos, vec2(1.0, " << m_ShadowControlStem << ".z), "
+ << m_ShadowCoordStem
+ << " );" << Endl;
+ }
+ else */
+ if (inType != RenderLightTypes::Directional) {
+ inLightShader << "\tshadow_map_occl = sampleCubemap( " << m_ShadowCubeStem << ", "
+ << m_ShadowControlStem << ", " << m_ShadowMatrixStem << ", " << m_LightPos
+ << ".xyz, varWorldPos, vec2(1.0, " << m_ShadowControlStem << ".z) );"
+ << Endl;
+ } else
+ inLightShader << "\tshadow_map_occl = sampleOrthographic( " << m_ShadowMapStem << ", "
+ << m_ShadowControlStem << ", " << m_ShadowMatrixStem
+ << ", varWorldPos, vec2(1.0, " << m_ShadowControlStem << ".z) );" << Endl;
+ }
+
+ void AddDisplacementMappingForDepthPass(IShaderStageGenerator &inShader) override
+ {
+ inShader.AddIncoming("attr_uv0", "vec2");
+ inShader.AddIncoming("attr_norm", "vec3");
+ inShader.AddUniform("displacementSampler", "sampler2D");
+ inShader.AddUniform("displaceAmount", "float");
+ inShader.AddUniform("displacementMap_rot", "vec4");
+ inShader.AddUniform("displacementMap_offset", "vec3");
+ inShader.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+
+ inShader.Append("\tvec3 uTransform = vec3( displacementMap_rot.x, displacementMap_rot.y, "
+ "displacementMap_offset.x );");
+ inShader.Append("\tvec3 vTransform = vec3( displacementMap_rot.z, displacementMap_rot.w, "
+ "displacementMap_offset.y );");
+ addFunction(inShader, "getTransformedUVCoords");
+ inShader.Append("\tvec2 uv_coords = attr_uv0;");
+ inShader << "\tuv_coords = getTransformedUVCoords( vec3( uv_coords, 1.0), uTransform, "
+ "vTransform );\n";
+ inShader << "\tvec3 displacedPos = defaultMaterialFileDisplacementTexture( "
+ "displacementSampler , displaceAmount, uv_coords , attr_norm, attr_pos );"
+ << Endl;
+ inShader.Append("\tgl_Position = model_view_projection * vec4(displacedPos, 1.0);");
+ }
+
+ void AddDisplacementImageUniforms(IShaderStageGenerator &inGenerator,
+ QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) override
+ {
+ if (displacementImage) {
+ SetupImageVariableNames(displacementImageIdx);
+ inGenerator.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+ inGenerator.AddUniform("model_matrix", "mat4");
+ inGenerator.AddUniform("camera_position", "vec3");
+ inGenerator.AddUniform("displaceAmount", "float");
+ inGenerator.AddUniform(m_ImageSampler, "sampler2D");
+ }
+ }
+
+ bool MaybeAddMaterialFresnel(IShaderStageGenerator &fragmentShader, NVConstDataRef<QT3DSU32> inKey,
+ bool inFragmentHasSpecularAmount)
+ {
+ if (m_DefaultMaterialShaderKeyProperties.m_FresnelEnabled.GetValue(inKey)) {
+ if (inFragmentHasSpecularAmount == false)
+ fragmentShader << "\tfloat specularAmount = 1.0;" << Endl;
+ inFragmentHasSpecularAmount = true;
+ fragmentShader.AddInclude("defaultMaterialFresnel.glsllib");
+ fragmentShader.AddUniform("fresnelPower", "float");
+ fragmentShader.AddUniform("material_specular", "vec4");
+ fragmentShader << "\tfloat fresnelRatio = defaultMaterialSimpleFresnel( world_normal, "
+ "view_vector, material_specular.w, fresnelPower );"
+ << Endl;
+ fragmentShader << "\tspecularAmount *= fresnelRatio;" << Endl;
+ }
+ return inFragmentHasSpecularAmount;
+ }
+ void SetupLightVariableNames(size_t lightIdx, SLight &inLight)
+ {
+ if (m_LightsAsSeparateUniforms) {
+ char buf[16];
+ _snprintf(buf, 16, "light_%d", int(lightIdx));
+ m_LightStem = buf;
+ m_LightColor = m_LightStem;
+ m_LightColor.append("_diffuse");
+ m_LightDirection = m_LightStem;
+ m_LightDirection.append("_direction");
+ m_LightSpecularColor = m_LightStem;
+ m_LightSpecularColor.append("_specular");
+ if (inLight.m_LightType == RenderLightTypes::Point) {
+ m_LightPos = m_LightStem;
+ m_LightPos.append("_position");
+ m_LightAttenuation = m_LightStem;
+ m_LightAttenuation.append("_attenuation");
+ } else if (inLight.m_LightType == RenderLightTypes::Area) {
+ m_LightPos = m_LightStem;
+ m_LightPos.append("_position");
+ m_LightUp = m_LightStem;
+ m_LightUp.append("_up");
+ m_LightRt = m_LightStem;
+ m_LightRt.append("_right");
+ }
+ } else {
+ m_LightStem = "lights";
+ char buf[16];
+ _snprintf(buf, 16, "[%d].", int(lightIdx));
+ m_LightStem.append(buf);
+
+ m_LightColor = m_LightStem;
+ m_LightColor.append("diffuse");
+ m_LightDirection = m_LightStem;
+ m_LightDirection.append("direction");
+ m_LightSpecularColor = m_LightStem;
+ m_LightSpecularColor.append("specular");
+ if (inLight.m_LightType == RenderLightTypes::Point) {
+ m_LightPos = m_LightStem;
+ m_LightPos.append("position");
+ m_LightConstantAttenuation = m_LightStem;
+ m_LightConstantAttenuation.append("constantAttenuation");
+ m_LightLinearAttenuation = m_LightStem;
+ m_LightLinearAttenuation.append("linearAttenuation");
+ m_LightQuadraticAttenuation = m_LightStem;
+ m_LightQuadraticAttenuation.append("quadraticAttenuation");
+ } else if (inLight.m_LightType == RenderLightTypes::Area) {
+ m_LightPos = m_LightStem;
+ m_LightPos.append("position");
+ m_LightUp = m_LightStem;
+ m_LightUp.append("up");
+ m_LightRt = m_LightStem;
+ m_LightRt.append("right");
+ }
+ }
+ }
+
+ void addDisplacementMapping(IDefaultMaterialVertexPipeline &inShader)
+ {
+ inShader.AddIncoming("attr_uv0", "vec2");
+ inShader.AddIncoming("attr_norm", "vec3");
+ inShader.AddUniform("displacementSampler", "sampler2D");
+ inShader.AddUniform("displaceAmount", "float");
+ inShader.AddUniform("displacementMap_rot", "vec4");
+ inShader.AddUniform("displacementMap_offset", "vec3");
+ inShader.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+
+ inShader.Append("\tvec3 uTransform = vec3( displacementMap_rot.x, displacementMap_rot.y, "
+ "displacementMap_offset.x );");
+ inShader.Append("\tvec3 vTransform = vec3( displacementMap_rot.z, displacementMap_rot.w, "
+ "displacementMap_offset.y );");
+ addFunction(inShader, "getTransformedUVCoords");
+ inShader.GenerateUVCoords();
+ inShader << "\tvarTexCoord0 = getTransformedUVCoords( vec3( varTexCoord0, 1.0), "
+ "uTransform, vTransform );\n";
+ inShader << "\tvec3 displacedPos = defaultMaterialFileDisplacementTexture( "
+ "displacementSampler , displaceAmount, varTexCoord0 , attr_norm, attr_pos );"
+ << Endl;
+ inShader.Append("\tgl_Position = model_view_projection * vec4(displacedPos, 1.0);");
+ }
+
+ void GenerateTextureSwizzle(NVRenderTextureSwizzleMode::Enum swizzleMode,
+ eastl::basic_string<char8_t> &texSwizzle,
+ eastl::basic_string<char8_t> &lookupSwizzle)
+ {
+ qt3ds::render::NVRenderContextType deprecatedContextFlags(NVRenderContextValues::GL2
+ | NVRenderContextValues::GLES2);
+
+ if (!(m_RenderContext.GetRenderContext().GetRenderContextType() & deprecatedContextFlags)) {
+ switch (swizzleMode) {
+ case NVRenderTextureSwizzleMode::L8toR8:
+ case NVRenderTextureSwizzleMode::L16toR16:
+ texSwizzle.append(".rgb");
+ lookupSwizzle.append(".rrr");
+ break;
+ case NVRenderTextureSwizzleMode::L8A8toRG8:
+ texSwizzle.append(".rgba");
+ lookupSwizzle.append(".rrrg");
+ break;
+ case NVRenderTextureSwizzleMode::A8toR8:
+ texSwizzle.append(".a");
+ lookupSwizzle.append(".r");
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ ///< get the light constant buffer and generate if necessary
+ NVRenderConstantBuffer *GetLightConstantBuffer(QT3DSU32 inLightCount)
+ {
+ NVRenderContext &theContext(m_RenderContext.GetRenderContext());
+
+ // we assume constant buffer support
+ QT3DS_ASSERT(theContext.GetConstantBufferSupport());
+
+ // we only create if if we have lights
+ if (!inLightCount || !theContext.GetConstantBufferSupport())
+ return NULL;
+
+ CRegisteredString theName = theContext.GetStringTable().RegisterStr("cbBufferLights");
+ NVRenderConstantBuffer *pCB = theContext.GetConstantBuffer(theName);
+
+ if (!pCB) {
+ // create
+ SLightSourceShader s[QT3DS_MAX_NUM_LIGHTS];
+ NVDataRef<QT3DSU8> cBuffer((QT3DSU8 *)&s, (sizeof(SLightSourceShader) * QT3DS_MAX_NUM_LIGHTS)
+ + (4 * sizeof(QT3DSI32)));
+ pCB = theContext.CreateConstantBuffer(
+ theName, qt3ds::render::NVRenderBufferUsageType::Static,
+ (sizeof(SLightSourceShader) * QT3DS_MAX_NUM_LIGHTS) + (4 * sizeof(QT3DSI32)), cBuffer);
+ if (!pCB) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ // init first set
+ memset(&s[0], 0x0, sizeof(SLightSourceShader));
+ QT3DSI32 cgLights = 0;
+ pCB->UpdateRaw(0, NVDataRef<QT3DSU8>((QT3DSU8 *)&cgLights, sizeof(QT3DSI32)));
+ pCB->UpdateRaw(4 * sizeof(QT3DSI32),
+ NVDataRef<QT3DSU8>((QT3DSU8 *)&s[0], sizeof(SLightSourceShader)));
+ pCB->Update(); // update to hardware
+
+ m_ConstantBuffers.insert(eastl::make_pair(theName, pCB));
+ }
+
+ return pCB;
+ }
+
+ void SetImageShaderVariables(SShaderGeneratorGeneratedShader &inShader,
+ SRenderableImage &inImage, QT3DSU32 idx)
+ {
+ size_t numImageVariables = inShader.m_Images.size();
+ for (size_t namesIdx = numImageVariables; namesIdx <= idx; ++namesIdx) {
+ SetupImageVariableNames(idx);
+ inShader.m_Images.push_back(
+ SShaderTextureProperties(m_ImageSampler.c_str(), m_ImageOffsets.c_str(),
+ m_ImageRotations.c_str(), m_ImageSamplerSize.c_str(),
+ inShader.m_Shader));
+ }
+ SShaderTextureProperties &theShaderProps = inShader.m_Images[idx];
+ const QT3DSMat44 &textureTransform = inImage.m_Image.m_TextureTransform;
+ // We separate rotational information from offset information so that just maybe the shader
+ // will attempt to push less information to the card.
+ const QT3DSF32 *dataPtr(textureTransform.front());
+ // The third member of the offsets contains a flag indicating if the texture was
+ // premultiplied or not.
+ // We use this to mix the texture alpha.
+ QT3DSVec3 offsets(dataPtr[12], dataPtr[13],
+ inImage.m_Image.m_TextureData.m_TextureFlags.IsPreMultiplied() ? 1.0f
+ : 0.0f);
+ // Grab just the upper 2x2 rotation matrix from the larger matrix.
+ QT3DSVec4 rotations(dataPtr[0], dataPtr[4], dataPtr[1], dataPtr[5]);
+
+ // The image horizontal and vertical tiling modes need to be set here, before we set texture
+ // on the shader.
+ // because setting the image on the texture forces the textue to bind and immediately apply
+ // any tex params.
+ NVRenderTexture2D *imageTexture = inImage.m_Image.m_TextureData.m_Texture;
+ inImage.m_Image.m_TextureData.m_Texture->SetTextureWrapS(
+ inImage.m_Image.m_HorizontalTilingMode);
+ inImage.m_Image.m_TextureData.m_Texture->SetTextureWrapT(
+ inImage.m_Image.m_VerticalTilingMode);
+ theShaderProps.m_Sampler.Set(imageTexture);
+ theShaderProps.m_Offsets.Set(offsets);
+ theShaderProps.m_Rotations.Set(rotations);
+ theShaderProps.m_Size.Set(QT3DSVec2(imageTexture->GetTextureDetails().m_Width,
+ imageTexture->GetTextureDetails().m_Height));
+ }
+
+ void GenerateShadowMapOcclusion(QT3DSU32 lightIdx, bool inShadowEnabled,
+ RenderLightTypes::Enum inType)
+ {
+ if (inShadowEnabled) {
+ VertexGenerator().GenerateWorldPosition();
+ AddShadowMapContribution(FragmentGenerator(), lightIdx, inType);
+ /*
+ VertexGenerator().AddUniform( m_ShadowMatrixStem, "mat4" );
+ VertexGenerator().AddOutgoing( m_ShadowCoordStem, "vec4" );
+ VertexGenerator() << "\tvec4 local_" << m_ShadowCoordStem << " = " << m_ShadowMatrixStem
+ << " * vec4(local_model_world_position, 1.0);" << Endl;
+ m_TempStr.assign( "local_" );
+ m_TempStr.append( m_ShadowCoordStem );
+ VertexGenerator().AssignOutput( m_ShadowCoordStem.c_str(), m_TempStr.c_str() );
+ */
+ } else {
+ FragmentGenerator() << "\tshadow_map_occl = 1.0;" << Endl;
+ }
+ }
+
+ void GenerateVertexShader()
+ {
+ // vertex displacement
+ QT3DSU32 imageIdx = 0;
+ SRenderableImage *displacementImage = NULL;
+ QT3DSU32 displacementImageIdx = 0;
+
+ for (SRenderableImage *img = m_FirstImage; img != NULL;
+ img = img->m_NextImage, ++imageIdx) {
+ if (img->m_MapType == ImageMapTypes::Displacement) {
+ displacementImage = img;
+ displacementImageIdx = imageIdx;
+ break;
+ }
+ }
+
+ // the pipeline opens/closes up the shaders stages
+ VertexGenerator().BeginVertexGeneration(displacementImageIdx, displacementImage);
+ }
+
+ void GenerateFragmentShader(SShaderDefaultMaterialKey &inKey)
+ {
+ bool specularEnabled = Material().IsSpecularEnabled();
+ bool vertexColorsEnabled = Material().IsVertexColorsEnabled();
+
+ bool hasLighting = Material().HasLighting();
+ bool hasImage = m_FirstImage != NULL;
+
+ bool hasIblProbe = m_DefaultMaterialShaderKeyProperties.m_HasIbl.GetValue(inKey);
+ bool hasSpecMap = false;
+ bool hasEnvMap = false;
+ bool hasEmissiveMap = false;
+ bool hasLightmaps = false;
+ // Pull the bump out as
+ SRenderableImage *bumpImage = NULL;
+ QT3DSU32 imageIdx = 0;
+ QT3DSU32 bumpImageIdx = 0;
+ SRenderableImage *specularAmountImage = NULL;
+ QT3DSU32 specularAmountImageIdx = 0;
+ SRenderableImage *roughnessImage = NULL;
+ QT3DSU32 roughnessImageIdx = 0;
+ // normal mapping
+ SRenderableImage *normalImage = NULL;
+ QT3DSU32 normalImageIdx = 0;
+ // translucency map
+ SRenderableImage *translucencyImage = NULL;
+ QT3DSU32 translucencyImageIdx = 0;
+ // lightmaps
+ SRenderableImage *lightmapIndirectImage = NULL;
+ QT3DSU32 lightmapIndirectImageIdx = 0;
+ SRenderableImage *lightmapRadiosityImage = NULL;
+ QT3DSU32 lightmapRadiosityImageIdx = 0;
+ SRenderableImage *lightmapShadowImage = NULL;
+ QT3DSU32 lightmapShadowImageIdx = 0;
+ const bool supportStandardDerivatives
+ = m_RenderContext.GetRenderContext().IsStandardDerivativesSupported();
+
+ for (SRenderableImage *img = m_FirstImage; img != NULL;
+ img = img->m_NextImage, ++imageIdx) {
+ hasSpecMap = img->m_MapType == ImageMapTypes::Specular;
+ if (img->m_MapType == ImageMapTypes::Bump) {
+ bumpImage = img;
+ bumpImageIdx = imageIdx;
+ } else if (img->m_MapType == ImageMapTypes::SpecularAmountMap) {
+ specularAmountImage = img;
+ specularAmountImageIdx = imageIdx;
+ } else if (img->m_MapType == ImageMapTypes::Roughness) {
+ roughnessImage = img;
+ roughnessImageIdx = imageIdx;
+ } else if (img->m_MapType == ImageMapTypes::Normal) {
+ normalImage = img;
+ normalImageIdx = imageIdx;
+ } else if (img->m_Image.m_MappingMode == ImageMappingModes::Environment) {
+ hasEnvMap = true;
+ } else if (img->m_MapType == ImageMapTypes::Translucency) {
+ translucencyImage = img;
+ translucencyImageIdx = imageIdx;
+ } else if (img->m_MapType == ImageMapTypes::Emissive) {
+ hasEmissiveMap = true;
+ } else if (img->m_MapType == ImageMapTypes::LightmapIndirect) {
+ lightmapIndirectImage = img;
+ lightmapIndirectImageIdx = imageIdx;
+ hasLightmaps = true;
+ } else if (img->m_MapType == ImageMapTypes::LightmapRadiosity) {
+ lightmapRadiosityImage = img;
+ lightmapRadiosityImageIdx = imageIdx;
+ hasLightmaps = true;
+ } else if (img->m_MapType == ImageMapTypes::LightmapShadow) {
+ lightmapShadowImage = img;
+ lightmapShadowImageIdx = imageIdx;
+ hasLightmaps = true;
+ }
+ }
+
+ bool enableFresnel = m_DefaultMaterialShaderKeyProperties.m_FresnelEnabled.GetValue(inKey);
+ bool enableSSAO = false;
+ bool enableSSDO = false;
+ bool enableShadowMaps = false;
+ bool enableBumpNormal = normalImage || bumpImage;
+
+ for (QT3DSU32 idx = 0; idx < FeatureSet().size(); ++idx) {
+ eastl::string name(FeatureSet()[idx].m_Name.c_str());
+ if (name == "QT3DS_ENABLE_SSAO")
+ enableSSAO = FeatureSet()[idx].m_Enabled;
+ else if (name == "QT3DS_ENABLE_SSDO")
+ enableSSDO = FeatureSet()[idx].m_Enabled;
+ else if (name == "QT3DS_ENABLE_SSM")
+ enableShadowMaps = FeatureSet()[idx].m_Enabled;
+ }
+
+ bool includeSSAOSSDOVars = enableSSAO || enableSSDO || enableShadowMaps;
+
+ VertexGenerator().BeginFragmentGeneration();
+ IShaderStageGenerator &fragmentShader(FragmentGenerator());
+ IDefaultMaterialVertexPipeline &vertexShader(VertexGenerator());
+
+ // The fragment or vertex shaders may not use the material_properties or diffuse
+ // uniforms in all cases but it is simpler to just add them and let the linker strip them.
+ fragmentShader.AddUniform("material_diffuse", "vec4");
+ fragmentShader.AddUniform("diffuse_color", "vec3");
+ fragmentShader.AddUniform("material_properties", "vec4");
+
+ // All these are needed for SSAO
+ if (includeSSAOSSDOVars) {
+ fragmentShader.AddInclude("SSAOCustomMaterial.glsllib");
+ // fragmentShader.AddUniform( "ao_sampler", "sampler2D" );
+ }
+
+ if (hasIblProbe && hasLighting) {
+ fragmentShader.AddInclude("sampleProbe.glsllib");
+ }
+
+ if (hasLighting) {
+ if (!m_LightsAsSeparateUniforms)
+ addFunction(fragmentShader, "sampleLightVars");
+ addFunction(fragmentShader, "diffuseReflectionBSDF");
+ }
+
+ if (hasLighting && hasLightmaps) {
+ fragmentShader.AddInclude("evalLightmaps.glsllib");
+ }
+
+ // view_vector, varWorldPos, world_normal are all used if there is a specular map
+ // in addition to if there is specular lighting. So they are lifted up here, always
+ // generated.
+ // we rely on the linker to strip out what isn't necessary instead of explicitly stripping
+ // it for code simplicity.
+ if (hasImage) {
+ fragmentShader.Append("\tvec3 uTransform;");
+ fragmentShader.Append("\tvec3 vTransform;");
+ }
+
+ if (includeSSAOSSDOVars || hasSpecMap || hasLighting || hasEnvMap || enableFresnel
+ || hasIblProbe || enableBumpNormal) {
+ vertexShader.GenerateViewVector();
+ vertexShader.GenerateWorldNormal();
+ vertexShader.GenerateWorldPosition();
+ }
+ if (includeSSAOSSDOVars || specularEnabled || hasIblProbe || enableBumpNormal)
+ vertexShader.GenerateVarTangentAndBinormal();
+
+ if (vertexColorsEnabled)
+ vertexShader.GenerateVertexColor();
+ else
+ fragmentShader.Append("\tvec3 vertColor = vec3(1.0);");
+
+ // You do bump or normal mapping but not both
+ if (bumpImage != NULL) {
+ GenerateImageUVCoordinates(bumpImageIdx, *bumpImage);
+ fragmentShader.AddUniform("bumpAmount", "float");
+
+ fragmentShader.AddUniform(m_ImageSamplerSize, "vec2");
+ fragmentShader.AddInclude("defaultMaterialBumpNoLod.glsllib");
+ fragmentShader << "\tworld_normal = defaultMaterialBumpNoLod( " << m_ImageSampler
+ << ", bumpAmount, " << m_ImageFragCoords
+ << ", tangent, binormal, world_normal, "
+ << m_ImageSamplerSize << ");" << Endl;
+ // Do gram schmidt
+ fragmentShader << "\tbinormal = normalize(cross(world_normal, tangent) );\n";
+ fragmentShader << "\ttangent = normalize(cross(binormal, world_normal) );\n";
+
+ } else if (normalImage != NULL) {
+ GenerateImageUVCoordinates(normalImageIdx, *normalImage);
+
+ fragmentShader.AddInclude("defaultMaterialFileNormalTexture.glsllib");
+ fragmentShader.AddUniform("bumpAmount", "float");
+
+ fragmentShader << "\tworld_normal = defaultMaterialFileNormalTexture( "
+ << m_ImageSampler << ", bumpAmount, " << m_ImageFragCoords
+ << ", tangent, binormal );" << Endl;
+ }
+
+ if (includeSSAOSSDOVars || specularEnabled || hasIblProbe || enableBumpNormal)
+ fragmentShader << "\tmat3 tanFrame = mat3(tangent, binormal, world_normal);" << Endl;
+
+ bool fragmentHasSpecularAmount = false;
+
+ if (hasEmissiveMap) {
+ fragmentShader.Append("\tvec3 global_emission = material_diffuse.rgb;");
+ }
+
+ if (hasLighting) {
+ fragmentShader.AddUniform("light_ambient_total", "vec3");
+
+ fragmentShader.Append(
+ "\tvec4 global_diffuse_light = vec4(light_ambient_total.xyz, 1.0);");
+ fragmentShader.Append("\tvec3 global_specular_light = vec3(0.0, 0.0, 0.0);");
+ fragmentShader.Append("\tfloat shadow_map_occl = 1.0;");
+
+ if (specularEnabled) {
+ vertexShader.GenerateViewVector();
+ fragmentShader.AddUniform("material_properties", "vec4");
+ }
+
+ if (lightmapIndirectImage != NULL) {
+ GenerateImageUVCoordinates(lightmapIndirectImageIdx, *lightmapIndirectImage, 1);
+ fragmentShader << "\tvec4 indirect_light = texture2D( " << m_ImageSampler << ", "
+ << m_ImageFragCoords << ");" << Endl;
+ fragmentShader << "\tglobal_diffuse_light += indirect_light;" << Endl;
+ if (specularEnabled) {
+ fragmentShader
+ << "\tglobal_specular_light += indirect_light.rgb * material_properties.x;"
+ << Endl;
+ }
+ }
+
+ if (lightmapRadiosityImage != NULL) {
+ GenerateImageUVCoordinates(lightmapRadiosityImageIdx, *lightmapRadiosityImage, 1);
+ fragmentShader << "\tvec4 direct_light = texture2D( " << m_ImageSampler << ", "
+ << m_ImageFragCoords << ");" << Endl;
+ fragmentShader << "\tglobal_diffuse_light += direct_light;" << Endl;
+ if (specularEnabled) {
+ fragmentShader
+ << "\tglobal_specular_light += direct_light.rgb * material_properties.x;"
+ << Endl;
+ }
+ }
+
+ if (translucencyImage != NULL) {
+ fragmentShader.AddUniform("translucentFalloff", "float");
+ fragmentShader.AddUniform("diffuseLightWrap", "float");
+
+ GenerateImageUVCoordinates(translucencyImageIdx, *translucencyImage);
+
+ fragmentShader << "\tvec4 translucent_depth_range = texture2D( " << m_ImageSampler
+ << ", " << m_ImageFragCoords << ");" << Endl;
+ fragmentShader << "\tfloat translucent_thickness = translucent_depth_range.r * "
+ "translucent_depth_range.r;"
+ << Endl;
+ fragmentShader << "\tfloat translucent_thickness_exp = exp( translucent_thickness "
+ "* translucentFalloff);"
+ << Endl;
+ }
+
+ fragmentShader.Append("\tfloat lightAttenuation = 1.0;");
+
+ AddLocalVariable(fragmentShader, "aoFactor", "float");
+
+ if (hasLighting && enableSSAO)
+ fragmentShader.Append("\taoFactor = customMaterialAO();");
+ else
+ fragmentShader.Append("\taoFactor = 1.0;");
+
+ AddLocalVariable(fragmentShader, "shadowFac", "float");
+
+ if (specularEnabled) {
+ fragmentShader << "\tfloat specularAmount = material_properties.x;" << Endl;
+ fragmentHasSpecularAmount = true;
+ }
+ // Fragment lighting means we can perhaps attenuate the specular amount by a texture
+ // lookup.
+
+ fragmentShader << "\tvec3 specularColor = vec3(1.0);" << Endl;
+ if (specularAmountImage) {
+ if (!specularEnabled)
+ fragmentShader << "\tfloat specularAmount = 1.0;" << Endl;
+ GenerateImageUVCoordinates(specularAmountImageIdx, *specularAmountImage);
+ fragmentShader << "\tspecularColor = texture2D( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << " ).xyz;" << Endl;
+ fragmentHasSpecularAmount = true;
+ }
+
+ fragmentShader << "\tfloat roughnessAmount = material_properties.y;" << Endl;
+ if (roughnessImage) {
+ GenerateImageUVCoordinates(roughnessImageIdx, *roughnessImage);
+ fragmentShader << "\tfloat sampledRoughness = texture2D( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << " ).x;" << Endl;
+ //The roughness sampled from roughness textures is Disney roughness
+ //which has to be squared to get the proper value
+ fragmentShader << "\troughnessAmount = roughnessAmount * "
+ << "sampledRoughness * sampledRoughness;" << Endl;
+ }
+
+ fragmentHasSpecularAmount =
+ MaybeAddMaterialFresnel(fragmentShader, inKey, fragmentHasSpecularAmount);
+
+ // Iterate through all lights
+ for (QT3DSU32 lightIdx = 0; lightIdx < m_Lights.size(); ++lightIdx) {
+ SLight *lightNode = m_Lights[lightIdx];
+ SetupLightVariableNames(lightIdx, *lightNode);
+ bool isDirectional = lightNode->m_LightType == RenderLightTypes::Directional;
+ bool isArea = lightNode->m_LightType == RenderLightTypes::Area;
+ bool isShadow = enableShadowMaps && lightNode->m_CastShadow;
+
+ fragmentShader.Append("");
+ char buf[10];
+ sprintf(buf, "%d", lightIdx);
+
+ m_TempStr.assign("light");
+ m_TempStr.append(buf);
+
+ fragmentShader << "\t//Light " << buf << Endl;
+ fragmentShader << "\tlightAttenuation = 1.0;" << Endl;
+ if (isDirectional) {
+
+ if (m_LightsAsSeparateUniforms) {
+ fragmentShader.AddUniform(m_LightDirection, "vec4");
+ fragmentShader.AddUniform(m_LightColor, "vec4");
+ }
+
+ if (enableSSDO) {
+ fragmentShader << "\tshadowFac = customMaterialShadow( " << m_LightDirection
+ << ".xyz, varWorldPos );" << Endl;
+ } else {
+ fragmentShader << "\tshadowFac = 1.0;" << Endl;
+ }
+
+ GenerateShadowMapOcclusion(lightIdx, enableShadowMaps && isShadow,
+ lightNode->m_LightType);
+
+ if (specularEnabled && enableShadowMaps && isShadow)
+ fragmentShader << "\tlightAttenuation *= shadow_map_occl;" << Endl;
+
+ fragmentShader << "\tglobal_diffuse_light.rgb += shadowFac * shadow_map_occl * "
+ "diffuseReflectionBSDF( world_normal, "
+ << "-" << m_LightDirection << ".xyz, view_vector, "
+ << m_LightColor << ".rgb, 0.0 ).rgb;" << Endl;
+
+ if (specularEnabled) {
+ if (m_LightsAsSeparateUniforms)
+ fragmentShader.AddUniform(m_LightSpecularColor, "vec4");
+ OutputSpecularEquation(Material().m_SpecularModel, fragmentShader,
+ m_LightDirection.c_str(),
+ m_LightSpecularColor.c_str());
+ }
+ } else if (isArea) {
+ if (m_LightsAsSeparateUniforms) {
+ fragmentShader.AddUniform(m_LightColor, "vec4");
+ fragmentShader.AddUniform(m_LightPos, "vec4");
+ fragmentShader.AddUniform(m_LightDirection, "vec4");
+ fragmentShader.AddUniform(m_LightUp, "vec4");
+ fragmentShader.AddUniform(m_LightRt, "vec4");
+ } else {
+ addFunction(fragmentShader, "areaLightVars");
+ }
+ addFunction(fragmentShader, "calculateDiffuseAreaOld");
+ vertexShader.GenerateWorldPosition();
+ GenerateShadowMapOcclusion(lightIdx, enableShadowMaps && isShadow,
+ lightNode->m_LightType);
+
+ // Debug measure to make sure paraboloid sampling was projecting to the right
+ // location
+ // fragmentShader << "\tglobal_diffuse_light.rg += " << m_ShadowCoordStem << ";"
+ // << Endl;
+ m_NormalizedDirection = m_TempStr;
+ m_NormalizedDirection.append("_Frame");
+
+ AddLocalVariable(fragmentShader, m_NormalizedDirection, "mat3");
+ fragmentShader << m_NormalizedDirection << " = mat3( " << m_LightRt << ".xyz, "
+ << m_LightUp << ".xyz, -" << m_LightDirection << ".xyz );"
+ << Endl;
+
+ if (enableSSDO) {
+ fragmentShader << "\tshadowFac = shadow_map_occl * customMaterialShadow( "
+ << m_LightDirection << ".xyz, varWorldPos );" << Endl;
+ } else {
+ fragmentShader << "\tshadowFac = shadow_map_occl;" << Endl;
+ }
+
+ if (specularEnabled) {
+ vertexShader.GenerateViewVector();
+ if (m_LightsAsSeparateUniforms)
+ fragmentShader.AddUniform(m_LightSpecularColor, "vec4");
+ OutputSpecularAreaLighting(fragmentShader, "varWorldPos", "view_vector",
+ m_LightSpecularColor.c_str());
+ }
+
+ OutputDiffuseAreaLighting(fragmentShader, "varWorldPos", m_TempStr);
+ fragmentShader << "\tlightAttenuation *= shadowFac;" << Endl;
+
+ AddTranslucencyIrradiance(fragmentShader, translucencyImage, m_TempStr, true);
+
+ fragmentShader << "\tglobal_diffuse_light.rgb += lightAttenuation * "
+ "diffuseReflectionBSDF( world_normal, "
+ << m_NormalizedDirection << ", view_vector, " << m_LightColor
+ << ".rgb, 0.0 ).rgb;" << Endl;
+ } else {
+
+ vertexShader.GenerateWorldPosition();
+ GenerateShadowMapOcclusion(lightIdx, enableShadowMaps && isShadow,
+ lightNode->m_LightType);
+
+ if (m_LightsAsSeparateUniforms) {
+ fragmentShader.AddUniform(m_LightColor, "vec4");
+ fragmentShader.AddUniform(m_LightPos, "vec4");
+ }
+
+ m_RelativeDirection = m_TempStr;
+ m_RelativeDirection.append("_relativeDirection");
+
+ m_NormalizedDirection = m_RelativeDirection;
+ m_NormalizedDirection.append("_normalized");
+
+ m_RelativeDistance = m_TempStr;
+ m_RelativeDistance.append("_distance");
+
+ fragmentShader << "\tvec3 " << m_RelativeDirection << " = varWorldPos - "
+ << m_LightPos << ".xyz;" << Endl;
+ fragmentShader << "\tfloat " << m_RelativeDistance << " = length( "
+ << m_RelativeDirection << " );" << Endl;
+ fragmentShader << "\tvec3 " << m_NormalizedDirection << " = "
+ << m_RelativeDirection << " / " << m_RelativeDistance << ";"
+ << Endl;
+
+ if (enableSSDO) {
+ fragmentShader << "\tshadowFac = shadow_map_occl * customMaterialShadow( "
+ << m_NormalizedDirection << ", varWorldPos );" << Endl;
+ } else {
+ fragmentShader << "\tshadowFac = shadow_map_occl;" << Endl;
+ }
+
+ addFunction(fragmentShader, "calculatePointLightAttenuation");
+
+ if (m_LightsAsSeparateUniforms) {
+ fragmentShader.AddUniform(m_LightAttenuation, "vec3");
+ fragmentShader
+ << "\tlightAttenuation = shadowFac * calculatePointLightAttenuation("
+ << "vec3( " << m_LightAttenuation << ".x, " << m_LightAttenuation
+ << ".y, " << m_LightAttenuation << ".z), " << m_RelativeDistance
+ << ");" << Endl;
+ } else {
+ fragmentShader
+ << "\tlightAttenuation = shadowFac * calculatePointLightAttenuation("
+ << "vec3( " << m_LightConstantAttenuation << ", "
+ << m_LightLinearAttenuation << ", " << m_LightQuadraticAttenuation
+ << "), " << m_RelativeDistance << ");"
+ << Endl;
+ }
+
+
+
+ AddTranslucencyIrradiance(fragmentShader, translucencyImage, m_TempStr, false);
+
+ fragmentShader << "\tglobal_diffuse_light.rgb += lightAttenuation * "
+ "diffuseReflectionBSDF( world_normal, "
+ << "-" << m_NormalizedDirection << ", view_vector, "
+ << m_LightColor << ".rgb, 0.0 ).rgb;" << Endl;
+
+ if (specularEnabled) {
+ if (m_LightsAsSeparateUniforms)
+ fragmentShader.AddUniform(m_LightSpecularColor, "vec4");
+ OutputSpecularEquation(Material().m_SpecularModel, fragmentShader,
+ m_NormalizedDirection.c_str(),
+ m_LightSpecularColor.c_str());
+ }
+ }
+ }
+
+ // This may be confusing but the light colors are already modulated by the base
+ // material color.
+ // Thus material color is the base material color * material emissive.
+ // Except material_color.a *is* the actual opacity factor.
+ // Furthermore object_opacity is something that may come from the vertex pipeline or
+ // somewhere else.
+ // We leave it up to the vertex pipeline to figure it out.
+ fragmentShader << "\tglobal_diffuse_light = vec4(global_diffuse_light.xyz * aoFactor, "
+ "object_opacity);"
+ << Endl << "\tglobal_specular_light = vec3(global_specular_light.xyz);"
+ << Endl;
+ } else // no lighting.
+ {
+ fragmentShader << "\tvec4 global_diffuse_light = vec4(0.0, 0.0, 0.0, object_opacity);"
+ << Endl << "\tvec3 global_specular_light = vec3(0.0, 0.0, 0.0);" << Endl;
+
+ // We still have specular maps and such that could potentially use the fresnel variable.
+ fragmentHasSpecularAmount =
+ MaybeAddMaterialFresnel(fragmentShader, inKey, fragmentHasSpecularAmount);
+ }
+
+ if (!hasEmissiveMap)
+ fragmentShader
+ << "\tglobal_diffuse_light.rgb += diffuse_color.rgb * material_diffuse.rgb;"
+ << Endl;
+
+ // since we already modulate our material diffuse color
+ // into the light color we will miss it entirely if no IBL
+ // or light is used
+ if (hasLightmaps && !(m_Lights.size() || hasIblProbe))
+ fragmentShader << "\tglobal_diffuse_light.rgb *= diffuse_color.rgb;" << Endl;
+
+ if (hasLighting && hasIblProbe) {
+ vertexShader.GenerateWorldNormal();
+
+ fragmentShader << "\tglobal_diffuse_light.rgb += diffuse_color.rgb * aoFactor * "
+ "sampleDiffuse( tanFrame ).xyz;"
+ << Endl;
+
+ if (specularEnabled) {
+
+ fragmentShader.AddUniform("material_specular", "vec4");
+
+ fragmentShader << "\tglobal_specular_light.xyz += specularAmount * specularColor * "
+ "vec3(material_specular.xyz) * sampleGlossy( tanFrame, "
+ "view_vector, roughnessAmount ).xyz;"
+ << Endl;
+ }
+ }
+
+ if (hasImage) {
+ fragmentShader.Append("\tvec4 texture_color;");
+ QT3DSU32 idx = 0;
+ for (SRenderableImage *image = m_FirstImage; image; image = image->m_NextImage, ++idx) {
+ // Various maps are handled on a different locations
+ if (image->m_MapType == ImageMapTypes::Bump
+ || image->m_MapType == ImageMapTypes::Normal
+ || image->m_MapType == ImageMapTypes::Displacement
+ || image->m_MapType == ImageMapTypes::SpecularAmountMap
+ || image->m_MapType == ImageMapTypes::Roughness
+ || image->m_MapType == ImageMapTypes::Translucency
+ || image->m_MapType == ImageMapTypes::LightmapIndirect
+ || image->m_MapType == ImageMapTypes::LightmapRadiosity) {
+ continue;
+ }
+
+ eastl::basic_string<char8_t> texSwizzle, lookupSwizzle, texLodStr;
+
+ GenerateImageUVCoordinates(idx, *image, 0);
+
+ GenerateTextureSwizzle(
+ image->m_Image.m_TextureData.m_Texture->GetTextureSwizzleMode(), texSwizzle,
+ lookupSwizzle);
+
+ if (texLodStr.empty()) {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << " = texture2D( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ")"
+ << lookupSwizzle.c_str() << ";" << Endl;
+ } else {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << "= textureLod( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ", "
+ << texLodStr.c_str() << " )" << lookupSwizzle.c_str() << ";"
+ << Endl;
+ }
+
+ if (image->m_Image.m_TextureData.m_TextureFlags.IsPreMultiplied() == true)
+ fragmentShader << "\ttexture_color.rgb = texture_color.a > 0.0 ? "
+ "texture_color.rgb / texture_color.a : vec3( 0, 0, 0 );"
+ << Endl;
+
+ // These mapping types honestly don't make a whole ton of sense to me.
+ switch (image->m_MapType) {
+ case ImageMapTypes::Diffuse: // assume images are premultiplied.
+ case ImageMapTypes::LightmapShadow:
+ // We use image offsets.z to switch between incoming premultiplied textures or
+ // not premultiplied textures.
+ // If Z is 1, then we assume the incoming texture is already premultiplied, else
+ // we just read the rgb value.
+ fragmentShader.Append("\tglobal_diffuse_light *= texture_color;");
+ break;
+ case ImageMapTypes::Specular:
+
+ fragmentShader.AddUniform("material_specular", "vec4");
+ if (fragmentHasSpecularAmount) {
+ fragmentShader.Append("\tglobal_specular_light.xyz += specularAmount * "
+ "specularColor * texture_color.xyz * "
+ "material_specular.xyz;");
+ } else {
+ fragmentShader.Append("\tglobal_specular_light.xyz += texture_color.xyz * "
+ "material_specular.xyz;");
+ }
+ fragmentShader.Append("\tglobal_diffuse_light.a *= texture_color.a;");
+ break;
+ case ImageMapTypes::Opacity:
+ fragmentShader.Append("\tglobal_diffuse_light.a *= texture_color.a;");
+ break;
+ case ImageMapTypes::Emissive:
+ fragmentShader.Append(
+ "\tglobal_emission *= texture_color.xyz * texture_color.a;");
+ break;
+ default:
+ QT3DS_ASSERT(false); // fallthrough intentional
+ }
+ }
+ }
+
+ if (hasEmissiveMap) {
+ fragmentShader.Append("\tglobal_diffuse_light.rgb += global_emission.rgb;");
+ }
+
+ // Ensure the rgb colors are in range.
+ fragmentShader.Append("\tfragOutput = vec4( clamp( vertColor * global_diffuse_light.xyz + "
+ "global_specular_light.xyz, 0.0, 65519.0 ), global_diffuse_light.a "
+ ");");
+
+ if (VertexGenerator().HasActiveWireframe()) {
+ fragmentShader.Append("vec3 edgeDistance = varEdgeDistance * gl_FragCoord.w;");
+ fragmentShader.Append(
+ "\tfloat d = min(min(edgeDistance.x, edgeDistance.y), edgeDistance.z);");
+ fragmentShader.Append("\tfloat mixVal = smoothstep(0.0, 1.0, d);"); // line width 1.0
+
+ fragmentShader.Append(
+ "\tfragOutput = mix( vec4(0.0, 1.0, 0.0, 1.0), fragOutput, mixVal);");
+ }
+ }
+
+ NVRenderShaderProgram *GenerateMaterialShader(const char8_t *inShaderPrefix)
+ {
+ // build a string that allows us to print out the shader we are generating to the log.
+ // This is time consuming but I feel like it doesn't happen all that often and is very
+ // useful to users
+ // looking at the log file.
+
+ m_GeneratedShaderString.clear();
+ m_GeneratedShaderString.assign(nonNull(inShaderPrefix));
+
+ SShaderDefaultMaterialKey theKey(Key());
+ theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties);
+
+ m_LightsAsSeparateUniforms = !m_RenderContext.GetRenderContext().GetConstantBufferSupport();
+
+ GenerateVertexShader();
+ GenerateFragmentShader(theKey);
+
+ VertexGenerator().EndVertexGeneration(false);
+ VertexGenerator().EndFragmentGeneration(false);
+
+ return ProgramGenerator().CompileGeneratedShader(m_GeneratedShaderString.c_str(),
+ SShaderCacheProgramFlags(), FeatureSet());
+ }
+
+ virtual NVRenderShaderProgram *
+ GenerateShader(const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ NVDataRef<SLight *> inLights, SRenderableImage *inFirstImage,
+ bool inHasTransparency, const char8_t *inVertexPipelineName, const char8_t *) override
+ {
+ QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::DefaultMaterial);
+ m_CurrentMaterial = static_cast<const SDefaultMaterial *>(&inMaterial);
+ m_CurrentKey = &inShaderDescription;
+ m_CurrentPipeline = static_cast<IDefaultMaterialVertexPipeline *>(&inVertexPipeline);
+ m_CurrentFeatureSet = inFeatureSet;
+ m_Lights = inLights;
+ m_FirstImage = inFirstImage;
+ m_HasTransparency = inHasTransparency;
+
+ return GenerateMaterialShader(inVertexPipelineName);
+ }
+
+ SShaderGeneratorGeneratedShader &GetShaderForProgram(NVRenderShaderProgram &inProgram)
+ {
+ eastl::pair<TProgramToShaderMap::iterator, bool> inserter =
+ m_ProgramToShaderMap.insert(eastl::make_pair(
+ &inProgram, NVScopedRefCounted<SShaderGeneratorGeneratedShader>(NULL)));
+ if (inserter.second) {
+ NVAllocatorCallback &alloc(m_RenderContext.GetRenderContext().GetAllocator());
+ inserter.first->second = QT3DS_NEW(alloc, SShaderGeneratorGeneratedShader)(
+ inProgram, m_RenderContext.GetRenderContext());
+ }
+ return *inserter.first->second;
+ }
+
+ void SetGlobalProperties(NVRenderShaderProgram &inProgram, const SLayer & /*inLayer*/
+ ,
+ SCamera &inCamera, QT3DSVec3 inCameraDirection,
+ NVDataRef<SLight *> inLights, NVDataRef<QT3DSVec3> inLightDirections,
+ Qt3DSShadowMap *inShadowMapManager)
+ {
+ SShaderGeneratorGeneratedShader &shader(GetShaderForProgram(inProgram));
+ m_RenderContext.GetRenderContext().SetActiveShader(&inProgram);
+
+ m_ShadowMapManager = inShadowMapManager;
+
+ SCamera &theCamera(inCamera);
+ shader.m_CameraPosition.Set(theCamera.GetGlobalPos());
+ shader.m_CameraDirection.Set(inCameraDirection);
+
+ QT3DSMat44 viewProj;
+ if (shader.m_ViewProj.IsValid()) {
+ theCamera.CalculateViewProjectionMatrix(viewProj);
+ shader.m_ViewProj.Set(viewProj);
+ }
+
+ if (shader.m_ViewMatrix.IsValid()) {
+ viewProj = theCamera.m_GlobalTransform.getInverse();
+ shader.m_ViewMatrix.Set(viewProj);
+ }
+
+ // update the constant buffer
+ shader.m_AoShadowParams.Set();
+ // We can't cache light properties because they can change per object.
+ QT3DSVec4 theLightAmbientTotal = QT3DSVec4(0, 0, 0, 1);
+ size_t numShaderLights = shader.m_Lights.size();
+ size_t numShadowLights = shader.m_ShadowMaps.size();
+ for (QT3DSU32 lightIdx = 0, shadowMapIdx = 0, lightEnd = inLights.size();
+ lightIdx < lightEnd && lightIdx < QT3DS_MAX_NUM_LIGHTS; ++lightIdx) {
+ SLight *theLight(inLights[lightIdx]);
+ if (lightIdx >= numShaderLights) {
+ shader.m_Lights.push_back(SShaderLightProperties());
+ ++numShaderLights;
+ }
+ if (shadowMapIdx >= numShadowLights && numShadowLights < QT3DS_MAX_NUM_SHADOWS) {
+ if (theLight->m_Scope == NULL && theLight->m_CastShadow) {
+ // PKC TODO : Fix multiple shadow issues.
+ // Need to know when the list of lights changes order, and clear shadow maps
+ // when that happens.
+ SetupShadowMapVariableNames(lightIdx);
+ shader.m_ShadowMaps.push_back(SShadowMapProperties(
+ m_ShadowMapStem.c_str(), m_ShadowCubeStem.c_str(),
+ m_ShadowMatrixStem.c_str(), m_ShadowControlStem.c_str(), inProgram));
+ }
+ }
+ QT3DS_ASSERT(lightIdx < numShaderLights);
+ SShaderLightProperties &theLightProperties(shader.m_Lights[lightIdx]);
+ float brightness = TranslateConstantAttenuation(theLight->m_Brightness);
+
+ // setup light data
+ theLightProperties.m_LightColor =
+ QT3DSVec4(theLight->m_DiffuseColor.getXYZ() * brightness, 1.0);
+ theLightProperties.m_LightData.m_specular =
+ QT3DSVec4(theLight->m_SpecularColor.getXYZ() * brightness, 1.0);
+ theLightProperties.m_LightData.m_direction = QT3DSVec4(inLightDirections[lightIdx], 1.0);
+
+ // TODO : This does potentially mean that we can create more shadow map entries than
+ // we can actually use at once.
+ if ((theLight->m_Scope == NULL) && (theLight->m_CastShadow && inShadowMapManager)) {
+ SShadowMapProperties &theShadowMapProperties(shader.m_ShadowMaps[shadowMapIdx++]);
+ SShadowMapEntry *pEntry = inShadowMapManager->GetShadowMapEntry(lightIdx);
+ if (pEntry) {
+ // add fixed scale bias matrix
+ QT3DSMat44 bias(QT3DSVec4(0.5, 0.0, 0.0, 0.0), QT3DSVec4(0.0, 0.5, 0.0, 0.0),
+ QT3DSVec4(0.0, 0.0, 0.5, 0.0), QT3DSVec4(0.5, 0.5, 0.5, 1.0));
+
+ if (theLight->m_LightType != RenderLightTypes::Directional) {
+ theShadowMapProperties.m_ShadowCubeTexture.Set(pEntry->m_DepthCube);
+ theShadowMapProperties.m_ShadowmapMatrix.Set(pEntry->m_LightView);
+ } else {
+ theShadowMapProperties.m_ShadowmapTexture.Set(pEntry->m_DepthMap);
+ theShadowMapProperties.m_ShadowmapMatrix.Set(bias * pEntry->m_LightVP);
+ }
+
+ theShadowMapProperties.m_ShadowmapSettings.Set(
+ QT3DSVec4(theLight->m_ShadowBias, theLight->m_ShadowFactor,
+ theLight->m_ShadowMapFar, 0.0f));
+ } else {
+ // if we have a light casting shadow we should find an entry
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ if (theLight->m_LightType == RenderLightTypes::Point) {
+ theLightProperties.m_LightData.m_position = QT3DSVec4(theLight->GetGlobalPos(), 1.0);
+ theLightProperties.m_LightData.m_constantAttenuation = 1.0;
+ theLightProperties.m_LightData.m_linearAttenuation =
+ TranslateLinearAttenuation(theLight->m_LinearFade);
+ theLightProperties.m_LightData.m_quadraticAttenuation =
+ TranslateQuadraticAttenuation(theLight->m_ExponentialFade);
+ } else if (theLight->m_LightType == RenderLightTypes::Area) {
+ theLightProperties.m_LightData.m_position = QT3DSVec4(theLight->GetGlobalPos(), 1.0);
+
+ QT3DSVec3 upDir = theLight->m_GlobalTransform.getUpper3x3().transform(QT3DSVec3(0, 1, 0));
+ QT3DSVec3 rtDir = theLight->m_GlobalTransform.getUpper3x3().transform(QT3DSVec3(1, 0, 0));
+
+ theLightProperties.m_LightData.m_up = QT3DSVec4(upDir, theLight->m_AreaHeight);
+ theLightProperties.m_LightData.m_right = QT3DSVec4(rtDir, theLight->m_AreaWidth);
+ }
+ theLightAmbientTotal += theLight->m_AmbientColor;
+ }
+ shader.m_LightAmbientTotal = theLightAmbientTotal.getXYZ();
+ }
+
+ // Also sets the blend function on the render context.
+ void SetMaterialProperties(NVRenderShaderProgram &inProgram, const SDefaultMaterial &inMaterial,
+ const QT3DSVec2 &inCameraVec, const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix, const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ NVRenderTexture2D *inDepthTexture, NVRenderTexture2D *inSSaoTexture,
+ SImage *inLightProbe, SImage *inLightProbe2, QT3DSF32 inProbeHorizon,
+ QT3DSF32 inProbeBright, QT3DSF32 inProbe2Window, QT3DSF32 inProbe2Pos,
+ QT3DSF32 inProbe2Fade, QT3DSF32 inProbeFOV)
+ {
+
+ NVRenderContext &context(m_RenderContext.GetRenderContext());
+ SShaderGeneratorGeneratedShader &shader(GetShaderForProgram(inProgram));
+ shader.m_MVP.Set(inModelViewProjection);
+ shader.m_NormalMatrix.Set(inNormalMatrix);
+ shader.m_GlobalTransform.Set(inGlobalTransform);
+ shader.m_DepthTexture.Set(inDepthTexture);
+
+ shader.m_AOTexture.Set(inSSaoTexture);
+
+ qt3ds::render::SImage *theLightProbe = inLightProbe;
+ qt3ds::render::SImage *theLightProbe2 = inLightProbe2;
+
+ // If the material has its own IBL Override, we should use that image instead.
+ if ((inMaterial.m_IblProbe) && (inMaterial.m_IblProbe->m_TextureData.m_Texture)) {
+ theLightProbe = inMaterial.m_IblProbe;
+ }
+
+ if (theLightProbe) {
+ if (theLightProbe->m_TextureData.m_Texture) {
+ NVRenderTextureCoordOp::Enum theHorzLightProbeTilingMode =
+ theLightProbe->m_HorizontalTilingMode;
+ NVRenderTextureCoordOp::Enum theVertLightProbeTilingMode =
+ theLightProbe->m_VerticalTilingMode;
+ theLightProbe->m_TextureData.m_Texture->SetTextureWrapS(
+ theHorzLightProbeTilingMode);
+ theLightProbe->m_TextureData.m_Texture->SetTextureWrapT(
+ theVertLightProbeTilingMode);
+ const QT3DSMat44 &textureTransform = theLightProbe->m_TextureTransform;
+ // We separate rotational information from offset information so that just maybe the
+ // shader
+ // will attempt to push less information to the card.
+ const QT3DSF32 *dataPtr(textureTransform.front());
+ // The third member of the offsets contains a flag indicating if the texture was
+ // premultiplied or not.
+ // We use this to mix the texture alpha.
+ QT3DSVec4 offsets(dataPtr[12], dataPtr[13],
+ theLightProbe->m_TextureData.m_TextureFlags.IsPreMultiplied() ? 1.0f
+ : 0.0f,
+ (float)theLightProbe->m_TextureData.m_Texture->GetNumMipmaps());
+
+ // Grab just the upper 2x2 rotation matrix from the larger matrix.
+ QT3DSVec4 rotations(dataPtr[0], dataPtr[4], dataPtr[1], dataPtr[5]);
+
+ shader.m_LightProbeRot.Set(rotations);
+ shader.m_LightProbeOfs.Set(offsets);
+
+ if ((!inMaterial.m_IblProbe) && (inProbeFOV < 180.f)) {
+ shader.m_LightProbeOpts.Set(
+ QT3DSVec4(0.01745329251994329547f * inProbeFOV, 0.0f, 0.0f, 0.0f));
+ }
+
+ // Also make sure to add the secondary texture, but it should only be added if the
+ // primary
+ // (i.e. background) texture is also there.
+ if (theLightProbe2 && theLightProbe2->m_TextureData.m_Texture) {
+ theLightProbe2->m_TextureData.m_Texture->SetTextureWrapS(
+ theHorzLightProbeTilingMode);
+ theLightProbe2->m_TextureData.m_Texture->SetTextureWrapT(
+ theVertLightProbeTilingMode);
+ shader.m_LightProbe2.Set(theLightProbe2->m_TextureData.m_Texture);
+ shader.m_LightProbe2Props.Set(
+ QT3DSVec4(inProbe2Window, inProbe2Pos, inProbe2Fade, 1.0f));
+
+ const QT3DSMat44 &xform2 = theLightProbe2->m_TextureTransform;
+ const QT3DSF32 *dataPtr(xform2.front());
+ shader.m_LightProbeProps.Set(
+ QT3DSVec4(dataPtr[12], dataPtr[13], inProbeHorizon, inProbeBright * 0.01f));
+ } else {
+ shader.m_LightProbe2Props.Set(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+ shader.m_LightProbeProps.Set(
+ QT3DSVec4(0.0f, 0.0f, inProbeHorizon, inProbeBright * 0.01f));
+ }
+ NVRenderTexture2D *textureImage = theLightProbe->m_TextureData.m_Texture;
+ shader.m_LightProbe.Set(textureImage);
+ shader.m_LightProbeSize.Set(QT3DSVec2(textureImage->GetTextureDetails().m_Width,
+ textureImage->GetTextureDetails().m_Height));
+ } else {
+ shader.m_LightProbeProps.Set(QT3DSVec4(0.0f, 0.0f, -1.0f, 0.0f));
+ shader.m_LightProbe2Props.Set(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+ }
+ } else {
+ shader.m_LightProbeProps.Set(QT3DSVec4(0.0f, 0.0f, -1.0f, 0.0f));
+ shader.m_LightProbe2Props.Set(QT3DSVec4(0.0f, 0.0f, 0.0f, 0.0f));
+ }
+
+ QT3DSF32 emissivePower = 1.0;
+
+ QT3DSU32 hasLighting = inMaterial.m_Lighting != DefaultMaterialLighting::NoLighting;
+ if (hasLighting)
+ emissivePower = inMaterial.m_EmissivePower / 100.0f;
+
+ QT3DSVec4 material_diffuse = QT3DSVec4(inMaterial.m_EmissiveColor[0] * emissivePower,
+ inMaterial.m_EmissiveColor[1] * emissivePower,
+ inMaterial.m_EmissiveColor[2] * emissivePower, inOpacity);
+ shader.m_MaterialDiffuse.Set(material_diffuse);
+ shader.m_DiffuseColor.Set(inMaterial.m_DiffuseColor.getXYZ());
+ QT3DSVec4 material_specular =
+ QT3DSVec4(inMaterial.m_SpecularTint[0], inMaterial.m_SpecularTint[1],
+ inMaterial.m_SpecularTint[2], inMaterial.m_IOR);
+ shader.m_MaterialSpecular.Set(material_specular);
+ shader.m_CameraProperties.Set(inCameraVec);
+ shader.m_FresnelPower.Set(inMaterial.m_FresnelPower);
+
+ if (context.GetConstantBufferSupport()) {
+ NVRenderConstantBuffer *pLightCb = GetLightConstantBuffer(shader.m_Lights.size());
+ // if we have lights we need a light buffer
+ QT3DS_ASSERT(shader.m_Lights.size() == 0 || pLightCb);
+
+ for (QT3DSU32 idx = 0, end = shader.m_Lights.size(); idx < end && pLightCb; ++idx) {
+ shader.m_Lights[idx].m_LightData.m_diffuse =
+ QT3DSVec4(shader.m_Lights[idx].m_LightColor.x * inMaterial.m_DiffuseColor.x,
+ shader.m_Lights[idx].m_LightColor.y * inMaterial.m_DiffuseColor.y,
+ shader.m_Lights[idx].m_LightColor.z * inMaterial.m_DiffuseColor.z, 1.0);
+
+ // this is our final change update memory
+ pLightCb->UpdateRaw(idx * sizeof(SLightSourceShader) + (4 * sizeof(QT3DSI32)),
+ NVDataRef<QT3DSU8>((QT3DSU8 *)&shader.m_Lights[idx].m_LightData,
+ sizeof(SLightSourceShader)));
+ }
+ // update light buffer to hardware
+ if (pLightCb) {
+ QT3DSI32 cgLights = shader.m_Lights.size();
+ pLightCb->UpdateRaw(0, NVDataRef<QT3DSU8>((QT3DSU8 *)&cgLights, sizeof(QT3DSI32)));
+ shader.m_LightsBuffer.Set();
+ }
+ } else {
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *pLightConstants
+ = GetLightConstantProperties(shader);
+
+ // if we have lights we need a light buffer
+ QT3DS_ASSERT(shader.m_Lights.size() == 0 || pLightConstants);
+
+ for (QT3DSU32 idx = 0, end = shader.m_Lights.size();
+ idx < end && pLightConstants; ++idx) {
+ shader.m_Lights[idx].m_LightData.m_diffuse =
+ QT3DSVec4(shader.m_Lights[idx].m_LightColor.x * inMaterial.m_DiffuseColor.x,
+ shader.m_Lights[idx].m_LightColor.y * inMaterial.m_DiffuseColor.y,
+ shader.m_Lights[idx].m_LightColor.z * inMaterial.m_DiffuseColor.z, 1.0);
+ }
+ // update light buffer to hardware
+ if (pLightConstants)
+ pLightConstants->updateLights(shader);
+ }
+
+ shader.m_MaterialDiffuseLightAmbientTotal.Set(
+ QT3DSVec3(shader.m_LightAmbientTotal.x * inMaterial.m_DiffuseColor[0],
+ shader.m_LightAmbientTotal.y * inMaterial.m_DiffuseColor[1],
+ shader.m_LightAmbientTotal.z * inMaterial.m_DiffuseColor[2]));
+
+ shader.m_MaterialProperties.Set(QT3DSVec4(
+ inMaterial.m_SpecularAmount, inMaterial.m_SpecularRoughness, emissivePower, 0.0f));
+ shader.m_BumpAmount.Set(inMaterial.m_BumpAmount);
+ shader.m_DisplaceAmount.Set(inMaterial.m_DisplaceAmount);
+ shader.m_TranslucentFalloff.Set(inMaterial.m_TranslucentFalloff);
+ shader.m_DiffuseLightWrap.Set(inMaterial.m_DiffuseLightWrap);
+ QT3DSU32 imageIdx = 0;
+ for (SRenderableImage *theImage = inFirstImage; theImage;
+ theImage = theImage->m_NextImage, ++imageIdx)
+ SetImageShaderVariables(shader, *theImage, imageIdx);
+
+ qt3ds::render::NVRenderBlendFunctionArgument blendFunc;
+ qt3ds::render::NVRenderBlendEquationArgument blendEqua(NVRenderBlendEquation::Add,
+ NVRenderBlendEquation::Add);
+ // The blend function goes:
+ // src op
+ // dst op
+ // src alpha op
+ // dst alpha op
+ // All of our shaders produce non-premultiplied values.
+ switch (inMaterial.m_BlendMode) {
+ case DefaultMaterialBlendMode::Screen:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::SrcAlpha, NVRenderDstBlendFunc::One,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One);
+ break;
+ case DefaultMaterialBlendMode::Multiply:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::DstColor, NVRenderDstBlendFunc::Zero,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One);
+ break;
+ case DefaultMaterialBlendMode::Overlay:
+ // SW fallback is not using blend equation
+ // note blend func is not used here anymore
+ if (context.IsAdvancedBlendHwSupported() || context.IsAdvancedBlendHwSupportedKHR())
+ blendEqua = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Overlay, NVRenderBlendEquation::Overlay);
+ break;
+ case DefaultMaterialBlendMode::ColorBurn:
+ // SW fallback is not using blend equation
+ // note blend func is not used here anymore
+ if (context.IsAdvancedBlendHwSupported() || context.IsAdvancedBlendHwSupportedKHR())
+ blendEqua = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::ColorBurn, NVRenderBlendEquation::ColorBurn);
+ break;
+ case DefaultMaterialBlendMode::ColorDodge:
+ // SW fallback is not using blend equation
+ // note blend func is not used here anymore
+ if (context.IsAdvancedBlendHwSupported() || context.IsAdvancedBlendHwSupportedKHR())
+ blendEqua = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::ColorDodge, NVRenderBlendEquation::ColorDodge);
+ break;
+ default:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::SrcAlpha, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha);
+ break;
+ }
+ context.SetBlendFunction(blendFunc);
+ context.SetBlendEquation(blendEqua);
+ }
+ void SetMaterialProperties(NVRenderShaderProgram &inProgram,
+ const SGraphObject &inMaterial, const QT3DSVec2 &inCameraVec,
+ const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix,
+ const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ SLayerGlobalRenderProperties inRenderProperties) override
+ {
+ const SDefaultMaterial &theMaterial(static_cast<const SDefaultMaterial &>(inMaterial));
+ QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::DefaultMaterial);
+
+ SetGlobalProperties(inProgram, inRenderProperties.m_Layer, inRenderProperties.m_Camera,
+ inRenderProperties.m_CameraDirection, inRenderProperties.m_Lights,
+ inRenderProperties.m_LightDirections,
+ inRenderProperties.m_ShadowMapManager);
+ SetMaterialProperties(inProgram, theMaterial, inCameraVec, inModelViewProjection,
+ inNormalMatrix, inGlobalTransform, inFirstImage, inOpacity,
+ inRenderProperties.m_DepthTexture, inRenderProperties.m_SSaoTexture,
+ inRenderProperties.m_LightProbe, inRenderProperties.m_LightProbe2,
+ inRenderProperties.m_ProbeHorizon, inRenderProperties.m_ProbeBright,
+ inRenderProperties.m_Probe2Window, inRenderProperties.m_Probe2Pos,
+ inRenderProperties.m_Probe2Fade, inRenderProperties.m_ProbeFOV);
+ }
+
+ SLightConstantProperties<SShaderGeneratorGeneratedShader> *GetLightConstantProperties(SShaderGeneratorGeneratedShader &shader)
+ {
+ if (!shader.m_lightConstantProperties
+ || int(shader.m_Lights.size())
+ > shader.m_lightConstantProperties->m_constants.size()) {
+ if (shader.m_lightConstantProperties)
+ delete shader.m_lightConstantProperties;
+ shader.m_lightConstantProperties
+ = new SLightConstantProperties<SShaderGeneratorGeneratedShader>(
+ shader, m_LightsAsSeparateUniforms);
+ }
+ return shader.m_lightConstantProperties;
+ }
+};
+}
+
+IDefaultMaterialShaderGenerator &
+IDefaultMaterialShaderGenerator::CreateDefaultMaterialShaderGenerator(IQt3DSRenderContext &inRc)
+{
+ return *QT3DS_NEW(inRc.GetAllocator(), SShaderGenerator)(inRc);
+}
diff --git a/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.h b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.h
new file mode 100644
index 0000000..7453e1d
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_DEFAULT_MATERIAL_SHADER_GENERATOR_H
+#define QT3DS_RENDER_DEFAULT_MATERIAL_SHADER_GENERATOR_H
+#include "Qt3DSRenderMaterialShaderGenerator.h"
+#include "Qt3DSRenderLightConstantProperties.h"
+
+namespace qt3ds {
+namespace render {
+
+ class Qt3DSShadowMap;
+ struct SShaderGeneratorGeneratedShader;
+
+ class IDefaultMaterialVertexPipeline : public IShaderStageGenerator
+ {
+ protected:
+ virtual ~IDefaultMaterialVertexPipeline() {}
+ public:
+ // Responsible for beginning all vertex and fragment generation (void main() { etc).
+ virtual void BeginVertexGeneration(QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) = 0;
+ // The fragment shader expects a floating point constant, object_opacity to be defined
+ // post this method.
+ virtual void BeginFragmentGeneration() = 0;
+ // Output variables may be mangled in some circumstances so the shader generation system
+ // needs an abstraction
+ // mechanism around this.
+ virtual void AssignOutput(const char8_t *inVarName, const char8_t *inVarValueExpr) = 0;
+
+ /**
+ * @brief Generates UV coordinates in shader code
+ *
+ * @param[in] inUVSet index of UV data set
+ *
+ * @return no return
+ */
+ virtual void GenerateUVCoords(QT3DSU32 inUVSet = 0) = 0;
+
+ virtual void GenerateEnvMapReflection() = 0;
+ virtual void GenerateViewVector() = 0;
+
+ // fragment shader expects varying vertex normal
+ // lighting in vertex pipeline expects world_normal
+ virtual void GenerateWorldNormal() = 0; // world_normal in both vert and frag shader
+ virtual void GenerateObjectNormal() = 0; // object_normal in both vert and frag shader
+ virtual void
+ GenerateWorldPosition() = 0; // model_world_position in both vert and frag shader
+ virtual void GenerateVarTangentAndBinormal() = 0;
+ virtual void GenerateVertexColor() = 0;
+
+ virtual bool HasActiveWireframe() = 0; // varEdgeDistance is a valid entity
+
+ // responsible for closing all vertex and fragment generation
+ virtual void EndVertexGeneration(bool customShader) = 0;
+ virtual void EndFragmentGeneration(bool customShader) = 0;
+ };
+
+ class IDefaultMaterialShaderGenerator : public IMaterialShaderGenerator
+ {
+ public:
+ virtual void AddDisplacementImageUniforms(IShaderStageGenerator &inGenerator,
+ QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) = 0;
+ SImageVariableNames GetImageVariableNames(QT3DSU32 inIdx) override = 0;
+ void GenerateImageUVCoordinates(IShaderStageGenerator &inVertexPipeline, QT3DSU32 idx,
+ QT3DSU32 uvSet, SRenderableImage &image) override = 0;
+ // Transforms attr_pos, attr_norm, and attr_uv0.
+ virtual void AddDisplacementMappingForDepthPass(IShaderStageGenerator &inShader) = 0;
+
+ // inPipelineName needs to be unique else the shader cache will just return shaders from
+ // different pipelines.
+ NVRenderShaderProgram *GenerateShader(
+ const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ NVDataRef<SLight *> inLights, SRenderableImage *inFirstImage, bool inHasTransparency,
+ const char8_t *inVertexPipelineName, const char8_t *inCustomMaterialName = "") override = 0;
+
+ // Also sets the blend function on the render context.
+ virtual void
+ SetMaterialProperties(NVRenderShaderProgram &inProgram, const SGraphObject &inMaterial,
+ const QT3DSVec2 &inCameraVec, const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix, const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ SLayerGlobalRenderProperties inRenderProperties) override = 0;
+
+ static IDefaultMaterialShaderGenerator &
+ CreateDefaultMaterialShaderGenerator(IQt3DSRenderContext &inRenderContext);
+
+ SLightConstantProperties<SShaderGeneratorGeneratedShader>
+ *GetLightConstantProperties(SShaderGeneratorGeneratedShader &shader);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp
new file mode 100644
index 0000000..92c337a
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.cpp
@@ -0,0 +1,1532 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSContainers.h"
+#include "Qt3DSRenderContextCore.h"
+#include "render/Qt3DSRenderShaderConstant.h"
+#include "Qt3DSRenderDynamicObject.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/FileTools.h"
+#include "foundation/PreAllocatedAllocator.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "StringTools.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRenderDynamicObjectSystemCommands.h"
+#include "Qt3DSRenderDynamicObjectSystemUtil.h"
+#include "Qt3DSRenderShaderCodeGenerator.h"
+#include "foundation/Qt3DSMutex.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace qt3ds::render::dynamic;
+
+namespace {
+typedef eastl::pair<CRegisteredString, CRegisteredString> TStrStrPair;
+}
+
+namespace eastl {
+template <>
+struct hash<TStrStrPair>
+{
+ size_t operator()(const TStrStrPair &item) const
+ {
+ return hash<CRegisteredString>()(item.first) ^ hash<CRegisteredString>()(item.second);
+ }
+};
+}
+
+namespace qt3ds {
+namespace render {
+ namespace dynamic {
+
+ QT3DSU32 SCommand::GetSizeofCommand(const SCommand &inCommand)
+ {
+ switch (inCommand.m_Type) {
+ case CommandTypes::AllocateBuffer:
+ return sizeof(SAllocateBuffer);
+ case CommandTypes::BindBuffer:
+ return sizeof(SBindBuffer);
+ case CommandTypes::BindTarget:
+ return sizeof(SBindTarget);
+ case CommandTypes::BindShader:
+ return sizeof(SBindShader);
+ case CommandTypes::Render:
+ return sizeof(SRender);
+ case CommandTypes::ApplyBufferValue:
+ return sizeof(SApplyBufferValue);
+ case CommandTypes::ApplyDepthValue:
+ return sizeof(SApplyDepthValue);
+ case CommandTypes::ApplyInstanceValue:
+ return sizeof(SApplyInstanceValue);
+ case CommandTypes::ApplyBlending:
+ return sizeof(SApplyBlending);
+ case CommandTypes::ApplyRenderState:
+ return sizeof(SApplyRenderState);
+ case CommandTypes::ApplyBlitFramebuffer:
+ return sizeof(SApplyBlitFramebuffer);
+ case CommandTypes::ApplyValue:
+ return sizeof(SApplyValue)
+ + static_cast<const SApplyValue &>(inCommand).m_Value.mSize;
+ case CommandTypes::DepthStencil:
+ return sizeof(SDepthStencil);
+ case CommandTypes::AllocateImage:
+ return sizeof(SAllocateImage);
+ case CommandTypes::ApplyImageValue:
+ return sizeof(SApplyImageValue);
+ case CommandTypes::AllocateDataBuffer:
+ return sizeof(SAllocateDataBuffer);
+ case CommandTypes::ApplyDataBufferValue:
+ return sizeof(SApplyDataBufferValue);
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ template <typename TCommandType>
+ inline void CopyConstructCommandT(QT3DSU8 *inDataBuffer, const SCommand &inCommand,
+ IStringTable &inStrTable)
+ {
+ TCommandType *theCommand = (TCommandType *)inDataBuffer;
+ theCommand = new (theCommand)
+ TCommandType(static_cast<const TCommandType &>(inCommand), inStrTable);
+ }
+
+ void SCommand::CopyConstructCommand(QT3DSU8 *inDataBuffer, const SCommand &inCommand,
+ IStringTable &inStrTable)
+ {
+ switch (inCommand.m_Type) {
+ case CommandTypes::AllocateBuffer:
+ CopyConstructCommandT<SAllocateBuffer>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::BindBuffer:
+ CopyConstructCommandT<SBindBuffer>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::BindTarget:
+ CopyConstructCommandT<SBindTarget>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::BindShader:
+ CopyConstructCommandT<SBindShader>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::Render:
+ CopyConstructCommandT<SRender>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyBufferValue:
+ CopyConstructCommandT<SApplyBufferValue>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyDepthValue:
+ CopyConstructCommandT<SApplyDepthValue>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyInstanceValue:
+ CopyConstructCommandT<SApplyInstanceValue>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyBlending:
+ CopyConstructCommandT<SApplyBlending>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyRenderState:
+ CopyConstructCommandT<SApplyRenderState>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyBlitFramebuffer:
+ CopyConstructCommandT<SApplyBlitFramebuffer>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyValue: {
+ CopyConstructCommandT<SApplyValue>(inDataBuffer, inCommand, inStrTable);
+ SApplyValue &dest = *reinterpret_cast<SApplyValue *>(inDataBuffer);
+ QT3DSU8 *destMem = inDataBuffer + sizeof(SApplyValue);
+ const SApplyValue &src = static_cast<const SApplyValue &>(inCommand);
+ memcpy(destMem, src.m_Value.mData, src.m_Value.mSize);
+ dest.m_Value.mData = destMem;
+ break;
+ }
+ case CommandTypes::DepthStencil:
+ CopyConstructCommandT<SDepthStencil>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::AllocateImage:
+ CopyConstructCommandT<SAllocateImage>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyImageValue:
+ CopyConstructCommandT<SApplyImageValue>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::AllocateDataBuffer:
+ CopyConstructCommandT<SAllocateDataBuffer>(inDataBuffer, inCommand, inStrTable);
+ break;
+ case CommandTypes::ApplyDataBufferValue:
+ CopyConstructCommandT<SApplyDataBufferValue>(inDataBuffer, inCommand, inStrTable);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ }
+}
+}
+
+namespace {
+
+template <typename TCommandType>
+struct SCommandRemapping
+{
+ template <typename TRemapper>
+ static void RemapCommandData(TCommandType &, TRemapper &)
+ {
+ }
+};
+
+template <>
+struct SCommandRemapping<SAllocateBuffer>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SAllocateBuffer &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_Name);
+ }
+};
+
+template <>
+struct SCommandRemapping<SAllocateImage>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SAllocateImage &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_Name);
+ }
+};
+
+template <>
+struct SCommandRemapping<SAllocateDataBuffer>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SAllocateDataBuffer &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_Name);
+ if (cmd.m_WrapName)
+ remapper.Remap(cmd.m_WrapName);
+ }
+};
+
+template <>
+struct SCommandRemapping<SBindBuffer>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SBindBuffer &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_BufferName);
+ }
+};
+template <>
+struct SCommandRemapping<SBindShader>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SBindShader &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_ShaderPath);
+ remapper.Remap(cmd.m_ShaderDefine);
+ }
+};
+template <>
+struct SCommandRemapping<SApplyInstanceValue>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SApplyInstanceValue &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_PropertyName);
+ }
+};
+template <>
+struct SCommandRemapping<SApplyBufferValue>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SApplyBufferValue &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_BufferName);
+ remapper.Remap(cmd.m_ParamName);
+ }
+};
+
+template <>
+struct SCommandRemapping<SApplyDepthValue>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SApplyDepthValue &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_ParamName);
+ }
+};
+
+template <>
+struct SCommandRemapping<SApplyBlitFramebuffer>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SApplyBlitFramebuffer &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_SourceBufferName);
+ remapper.Remap(cmd.m_DestBufferName);
+ }
+};
+
+template <>
+struct SCommandRemapping<SApplyValue>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SApplyValue &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_PropertyName);
+ }
+};
+
+template <>
+struct SCommandRemapping<SApplyDataBufferValue>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SApplyDataBufferValue &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_ParamName);
+ }
+};
+
+template <>
+struct SCommandRemapping<SDepthStencil>
+{
+ template <typename TRemapper>
+ static void RemapCommandData(SDepthStencil &cmd, TRemapper &remapper)
+ {
+ remapper.Remap(cmd.m_BufferName);
+ }
+};
+
+QT3DSU32 Align(QT3DSU32 inValue)
+{
+ if (inValue % 4)
+ return inValue + (4 - (inValue % 4));
+ return inValue;
+}
+
+QT3DSU32 Align8(QT3DSU32 inValue)
+{
+ if (inValue % 8)
+ return inValue + (8 - (inValue % 8));
+ return inValue;
+}
+
+inline const char *GetShaderDatatypeName(NVRenderShaderDataTypes::Enum inValue)
+{
+ switch (inValue) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(type) \
+ case NVRenderShaderDataTypes::type: \
+ return #type;
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return "";
+}
+
+inline qt3ds::QT3DSU32 getSizeofShaderDataType(NVRenderShaderDataTypes::Enum value)
+{
+ using namespace qt3ds;
+ using namespace qt3ds::render;
+ switch (value) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(x) \
+ case NVRenderShaderDataTypes::x: \
+ return sizeof(x);
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+}
+
+struct SDynamicObjectShaderInfo
+{
+ CRegisteredString m_Type; ///< shader type (GLSL or HLSL)
+ CRegisteredString m_Version; ///< shader version (e.g. 330 vor GLSL)
+ bool m_HasGeomShader;
+ bool m_IsComputeShader;
+
+ SDynamicObjectShaderInfo()
+ : m_HasGeomShader(false)
+ , m_IsComputeShader(false)
+ {
+ }
+ SDynamicObjectShaderInfo(CRegisteredString inType, CRegisteredString inVersion,
+ bool inHasGeomShader, bool inIsComputeShader)
+ : m_Type(inType)
+ , m_Version(inVersion)
+ , m_HasGeomShader(inHasGeomShader)
+ , m_IsComputeShader(inIsComputeShader)
+ {
+ }
+};
+
+struct SDynamicObjClassImpl : public IDynamicObjectClass
+{
+ NVAllocatorCallback *m_Allocator;
+ CRegisteredString m_Id;
+ NVConstDataRef<SPropertyDefinition> m_PropertyDefinitions;
+ QT3DSU32 m_PropertySectionByteSize;
+ QT3DSU32 m_BaseObjectSize;
+ GraphObjectTypes::Enum m_GraphObjectType;
+ QT3DSU8 *m_PropertyDefaultData;
+ NVConstDataRef<SCommand *> m_RenderCommands;
+ volatile QT3DSI32 mRefCount;
+ bool m_RequiresDepthTexture;
+ bool m_RequiresCompilation;
+ NVRenderTextureFormats::Enum m_OutputFormat;
+
+ SDynamicObjClassImpl(
+ NVAllocatorCallback &alloc, CRegisteredString id,
+ NVConstDataRef<SPropertyDefinition> definitions, QT3DSU32 propertySectionByteSize,
+ QT3DSU32 baseObjectSize, GraphObjectTypes::Enum objectType, QT3DSU8 *propDefaultData,
+ bool inRequiresDepthTexture = false,
+ NVRenderTextureFormats::Enum inOutputFormat = NVRenderTextureFormats::RGBA8)
+ : m_Allocator(&alloc)
+ , m_Id(id)
+ , m_PropertyDefinitions(definitions)
+ , m_PropertySectionByteSize(propertySectionByteSize)
+ , m_BaseObjectSize(baseObjectSize)
+ , m_GraphObjectType(objectType)
+ , m_PropertyDefaultData(propDefaultData)
+ , mRefCount(0)
+ , m_RequiresDepthTexture(inRequiresDepthTexture)
+ , m_RequiresCompilation(false)
+ , m_OutputFormat(inOutputFormat)
+ {
+ }
+
+ ~SDynamicObjClassImpl()
+ {
+ if (m_PropertyDefinitions.size()) {
+ for (QT3DSU32 idx = 0, end = m_PropertyDefinitions.size(); idx < end; ++idx) {
+ if (m_PropertyDefinitions[idx].m_EnumValueNames.size())
+ m_Allocator->deallocate(
+ (void *)m_PropertyDefinitions[idx].m_EnumValueNames.begin());
+ }
+ }
+ ReleaseCommands();
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(*m_Allocator)
+
+ template <typename TRemapperType>
+ static void RemapCommand(SCommand &inCommand, TRemapperType &inRemapper)
+ {
+ switch (inCommand.m_Type) {
+#define QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(type) \
+ case CommandTypes::type: \
+ SCommandRemapping<S##type>::RemapCommandData(static_cast<S##type &>(inCommand), \
+ inRemapper); \
+ break;
+ QT3DS_RENDER_EFFECTS_ITERATE_COMMAND_TYPES
+#undef QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ template <typename TRemapper>
+ void SetupThisObjectFromMemory(NVAllocatorCallback &inAlloc, TRemapper &inRemapper,
+ QT3DSU8 *inCommandStart, QT3DSU32 numEffectCommands)
+ {
+ m_Allocator = &inAlloc;
+ mRefCount = 0;
+ QT3DSU8 *theCommandPtrBegin = inCommandStart;
+ QT3DSU32 theCommandOffset = 0;
+ for (QT3DSU32 idx = 0; idx < numEffectCommands; ++idx) {
+ SCommand *theCommand = reinterpret_cast<SCommand *>(inCommandStart + theCommandOffset);
+ theCommandOffset += SCommand::GetSizeofCommand(*theCommand);
+ }
+ SCommand **theCommandPtrStart =
+ reinterpret_cast<SCommand **>(theCommandPtrBegin + theCommandOffset);
+ m_RenderCommands = NVConstDataRef<SCommand *>(theCommandPtrStart, numEffectCommands);
+ // Now run through the commands, fixup strings and setup the command ptrs
+ theCommandOffset = 0;
+ for (QT3DSU32 idx = 0; idx < numEffectCommands; ++idx) {
+ SCommand *theCommand =
+ reinterpret_cast<SCommand *>(theCommandPtrBegin + theCommandOffset);
+ theCommandPtrStart[idx] = theCommand;
+ RemapCommand(*theCommand, inRemapper);
+ theCommandOffset += SCommand::GetSizeofCommand(*theCommand);
+ }
+ }
+
+ void ReleaseCommands()
+ {
+ if (m_RenderCommands.size()) {
+ m_Allocator->deallocate(const_cast<SCommand *>(*m_RenderCommands.begin()));
+ m_RenderCommands = NVConstDataRef<SCommand *>();
+ }
+ }
+
+ CRegisteredString GetId() const override { return m_Id; }
+ NVConstDataRef<SPropertyDefinition> GetProperties() const override
+ {
+ return m_PropertyDefinitions;
+ }
+ QT3DSU32 GetPropertySectionByteSize() const override { return m_PropertySectionByteSize; }
+ const QT3DSU8 *GetDefaultValueBuffer() const override { return m_PropertyDefaultData; }
+ QT3DSU32 GetBaseObjectSize() const override { return m_BaseObjectSize; }
+ GraphObjectTypes::Enum GraphObjectType() const override { return m_GraphObjectType; }
+ const SPropertyDefinition *FindDefinition(CRegisteredString &str) const
+ {
+ for (QT3DSU32 idx = 0, end = m_PropertyDefinitions.size(); idx < end; ++idx) {
+ const SPropertyDefinition &def(m_PropertyDefinitions[idx]);
+ if (def.m_Name == str)
+ return &def;
+ }
+ return NULL;
+ }
+ const SPropertyDefinition *FindPropertyByName(CRegisteredString inName) const override
+ {
+ return FindDefinition(inName);
+ }
+ NVConstDataRef<dynamic::SCommand *> GetRenderCommands() const override
+ {
+ return m_RenderCommands;
+ }
+ bool RequiresDepthTexture() const override { return m_RequiresDepthTexture; }
+ void SetRequiresDepthTexture(bool inVal) override { m_RequiresDepthTexture = inVal; }
+ virtual bool RequiresCompilation() const override { return m_RequiresCompilation; }
+ virtual void SetRequiresCompilation(bool inVal) override { m_RequiresCompilation = inVal; }
+ NVRenderTextureFormats::Enum GetOutputTextureFormat() const override { return m_OutputFormat; }
+};
+
+struct SDataRemapper
+{
+ template <typename TRemapper>
+ void Remap(QT3DSU8 *inData, SPropertyDefinition &item, TRemapper &remapper)
+ {
+ switch (item.m_DataType) {
+ default:
+ break; // no remapping necessary
+ case NVRenderShaderDataTypes::NVRenderTexture2DPtr:
+ CRegisteredString *realData = reinterpret_cast<CRegisteredString *>(inData);
+ remapper.Remap(*realData);
+ break;
+ }
+ }
+};
+
+struct SShaderMapKey
+{
+ TStrStrPair m_Name;
+ eastl::vector<SShaderPreprocessorFeature> m_Features;
+ TessModeValues::Enum m_TessMode;
+ bool m_WireframeMode;
+ size_t m_HashCode;
+ SShaderMapKey(TStrStrPair inName, TShaderFeatureSet inFeatures, TessModeValues::Enum inTessMode,
+ bool inWireframeMode)
+ : m_Name(inName)
+ , m_Features(inFeatures.begin(), inFeatures.end())
+ , m_TessMode(inTessMode)
+ , m_WireframeMode(inWireframeMode)
+ {
+ m_HashCode = eastl::hash<TStrStrPair>()(m_Name)
+ ^ HashShaderFeatureSet(toDataRef(m_Features.data(), (QT3DSU32)m_Features.size()))
+ ^ eastl::hash<QT3DSU32>()(m_TessMode) ^ eastl::hash<bool>()(m_WireframeMode);
+ }
+ bool operator==(const SShaderMapKey &inKey) const
+ {
+ return m_Name == inKey.m_Name && m_Features == inKey.m_Features
+ && m_TessMode == inKey.m_TessMode && m_WireframeMode == inKey.m_WireframeMode;
+ }
+};
+}
+
+namespace eastl {
+template <>
+struct hash<SShaderMapKey>
+{
+ size_t operator()(const SShaderMapKey &inKey) const { return inKey.m_HashCode; }
+};
+}
+
+namespace {
+
+typedef nvhash_map<CRegisteredString, NVScopedRefCounted<SDynamicObjClassImpl>> TStringClassMap;
+typedef nvhash_map<CRegisteredString, char8_t *> TPathDataMap;
+typedef nvhash_map<CRegisteredString, SDynamicObjectShaderInfo> TShaderInfoMap;
+typedef nvhash_set<CRegisteredString> TPathSet;
+typedef nvhash_map<SShaderMapKey, TShaderAndFlags> TShaderMap;
+
+struct SDynamicObjectSystemCoreImpl : public IDynamicObjectSystem
+{
+};
+
+struct SDynamicObjectSystemImpl : public IDynamicObjectSystem
+{
+ NVFoundationBase &m_Foundation;
+ mutable qt3ds::render::SPreAllocatedAllocator m_Allocator;
+ IQt3DSRenderContextCore &m_CoreContext;
+ IQt3DSRenderContext *m_Context;
+ TStringClassMap m_Classes;
+ TPathDataMap m_ExpandedFiles;
+ Qt3DSString m_ShaderKeyBuilder;
+ TShaderMap m_ShaderMap;
+ TShaderInfoMap m_ShaderInfoMap;
+ Qt3DSString m_IncludePath;
+ Qt3DSString m_IncludeSearch;
+ Qt3DSString m_VertShader;
+ Qt3DSString m_FragShader;
+ Qt3DSString m_GeometryShader;
+ QString m_shaderLibraryVersion;
+ QString m_shaderLibraryPlatformDirectory;
+ mutable Mutex m_PropertyLoadMutex;
+ QT3DSI32 mRefCount;
+
+ SDynamicObjectSystemImpl(IQt3DSRenderContextCore &inCore)
+ : m_Foundation(inCore.GetFoundation())
+ , m_Allocator(inCore.GetAllocator())
+ , m_CoreContext(inCore)
+ , m_Context(NULL)
+ , m_Classes(inCore.GetAllocator(), "Classes")
+ , m_ExpandedFiles(inCore.GetAllocator(), "ExpandedShaderFiles")
+ , m_ShaderMap(inCore.GetAllocator(), "ShaderMap")
+ , m_ShaderInfoMap(inCore.GetAllocator(), "ShaderInfoMap")
+ , m_PropertyLoadMutex(inCore.GetAllocator())
+ , mRefCount(0)
+ {
+ m_IncludeSearch = "#include \"";
+ }
+
+ virtual ~SDynamicObjectSystemImpl()
+ {
+ for (TPathDataMap::iterator iter = m_ExpandedFiles.begin(), end = m_ExpandedFiles.end();
+ iter != end; ++iter)
+ m_Allocator.deallocate(iter->second);
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ bool IsRegistered(CRegisteredString inStr) override
+ {
+ return m_Classes.find(inStr) != m_Classes.end();
+ }
+
+ bool Register(CRegisteredString inName,
+ NVConstDataRef<SPropertyDeclaration> inProperties, QT3DSU32 inBaseObjectSize,
+ GraphObjectTypes::Enum inGraphObjectType) override
+ {
+ if (IsRegistered(inName)) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ nvvector<SPropertyDefinition> definitions(m_Foundation.getAllocator(),
+ "PropertyDefinitions");
+ QT3DSU32 theCurrentOffset = 0;
+ for (QT3DSU32 idx = 0, end = inProperties.size(); idx < end; ++idx) {
+ const SPropertyDeclaration &thePropDec = inProperties[idx];
+ CRegisteredString thePropName(
+ m_CoreContext.GetStringTable().RegisterStr(thePropDec.m_Name));
+ QT3DSU32 propSize = getSizeofShaderDataType(thePropDec.m_DataType);
+ definitions.push_back(SPropertyDefinition(thePropName, thePropDec.m_DataType,
+ theCurrentOffset, propSize));
+ theCurrentOffset += propSize;
+ theCurrentOffset = Align(theCurrentOffset);
+ }
+ QT3DSU32 dataSectionSize = theCurrentOffset;
+ QT3DSU32 clsSize = Align(sizeof(SDynamicObjClassImpl));
+ QT3DSU32 defSize = Align(sizeof(SPropertyDefinition) * inProperties.size());
+ QT3DSU32 defaultSize = dataSectionSize;
+ QT3DSU32 allocSize = clsSize + defSize + defaultSize;
+ QT3DSU8 *allocData = reinterpret_cast<QT3DSU8 *>(
+ m_Allocator.allocate(allocSize, "SDynamicObjClassImpl", __FILE__, __LINE__));
+ QT3DSU8 *defData = allocData + clsSize;
+ QT3DSU8 *defaultData = defData + defSize;
+ SPropertyDefinition *defPtr = reinterpret_cast<SPropertyDefinition *>(defData);
+ if (defSize)
+ memCopy(defPtr, definitions.data(), defSize);
+ if (defaultSize)
+ memZero(defaultData, defaultSize);
+ SDynamicObjClassImpl *theClass = new (allocData)
+ SDynamicObjClassImpl(m_Allocator, inName, toDataRef(defPtr, inProperties.size()),
+ dataSectionSize, inBaseObjectSize, inGraphObjectType, defaultData);
+ m_Classes.insert(eastl::make_pair(inName, theClass));
+ return true;
+ }
+
+ bool Unregister(CRegisteredString inName) override {
+ if (!IsRegistered(inName)) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ TStringClassMap::iterator iter = m_Classes.find(inName);
+ if (iter != m_Classes.end())
+ m_Classes.erase(iter);
+ return true;
+ }
+
+ SDynamicObjClassImpl *FindClass(CRegisteredString inName)
+ {
+ TStringClassMap::iterator iter = m_Classes.find(inName);
+ if (iter != m_Classes.end())
+ return iter->second.mPtr;
+ return NULL;
+ }
+
+ eastl::pair<const SPropertyDefinition *, SDynamicObjClassImpl *>
+ FindProperty(CRegisteredString inName, CRegisteredString inPropName)
+ {
+ SDynamicObjClassImpl *cls = FindClass(inName);
+ if (cls) {
+ const SPropertyDefinition *def = cls->FindDefinition(inPropName);
+ if (def)
+ return eastl::make_pair(def, cls);
+ }
+ return eastl::pair<const SPropertyDefinition *, SDynamicObjClassImpl *>(NULL, NULL);
+ }
+
+ void SetPropertyDefaultValue(CRegisteredString inName, CRegisteredString inPropName,
+ NVConstDataRef<QT3DSU8> inDefaultData) override
+ {
+ eastl::pair<const SPropertyDefinition *, SDynamicObjClassImpl *> def =
+ FindProperty(inName, inPropName);
+ if (def.first && inDefaultData.size() >= def.first->m_ByteSize) {
+ memCopy(def.second->m_PropertyDefaultData + def.first->m_Offset, inDefaultData.begin(),
+ def.first->m_ByteSize);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void SetPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName,
+ NVConstDataRef<CRegisteredString> inNames) override
+ {
+
+ eastl::pair<const SPropertyDefinition *, SDynamicObjClassImpl *> def =
+ FindProperty(inName, inPropName);
+ SPropertyDefinition *theDefinitionPtr = const_cast<SPropertyDefinition *>(def.first);
+ if (theDefinitionPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (theDefinitionPtr->m_EnumValueNames.size()) {
+ m_Foundation.getAllocator().deallocate(
+ (void *)theDefinitionPtr->m_EnumValueNames.begin());
+ theDefinitionPtr->m_EnumValueNames = NVConstDataRef<CRegisteredString>();
+ }
+ theDefinitionPtr->m_IsEnumProperty = true;
+ if (inNames.size()) {
+ CRegisteredString *theNameValues = (CRegisteredString *)m_Allocator.allocate(
+ inNames.size() * sizeof(CRegisteredString), "PropertyEnumNames", __FILE__,
+ __LINE__);
+
+ memCopy(theNameValues, inNames.begin(), inNames.size() * sizeof(CRegisteredString));
+ theDefinitionPtr->m_EnumValueNames =
+ NVConstDataRef<CRegisteredString>(theNameValues, inNames.size());
+ }
+ }
+
+ virtual NVConstDataRef<CRegisteredString>
+ GetPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName) const override
+ {
+ eastl::pair<const SPropertyDefinition *, SDynamicObjClassImpl *> def =
+ const_cast<SDynamicObjectSystemImpl &>(*this).FindProperty(inName, inPropName);
+ if (def.first)
+ return def.first->m_EnumValueNames;
+ return NVConstDataRef<CRegisteredString>();
+ }
+
+ // Called during loading which is pretty heavily multithreaded.
+ virtual NVConstDataRef<dynamic::SPropertyDefinition>
+ GetProperties(CRegisteredString inName) const override
+ {
+ Mutex::ScopedLock __locker(m_PropertyLoadMutex);
+ SDynamicObjClassImpl *cls = const_cast<SDynamicObjectSystemImpl &>(*this).FindClass(inName);
+ if (cls)
+ return cls->m_PropertyDefinitions;
+ return NVConstDataRef<dynamic::SPropertyDefinition>();
+ }
+
+ void SetPropertyTextureSettings(CRegisteredString inName, CRegisteredString inPropName,
+ CRegisteredString inPropPath,
+ NVRenderTextureTypeValue::Enum inTexType,
+ NVRenderTextureCoordOp::Enum inCoordOp,
+ NVRenderTextureMagnifyingOp::Enum inMagFilterOp,
+ NVRenderTextureMinifyingOp::Enum inMinFilterOp) override
+ {
+ eastl::pair<const SPropertyDefinition *, SDynamicObjClassImpl *> def =
+ FindProperty(inName, inPropName);
+ SPropertyDefinition *theDefinitionPtr = const_cast<SPropertyDefinition *>(def.first);
+ if (theDefinitionPtr == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ theDefinitionPtr->m_ImagePath = inPropPath;
+ theDefinitionPtr->m_TexUsageType = inTexType;
+ theDefinitionPtr->m_CoordOp = inCoordOp;
+ theDefinitionPtr->m_MagFilterOp = inMagFilterOp;
+ theDefinitionPtr->m_MinFilterOp = inMinFilterOp;
+ }
+
+ IDynamicObjectClass *GetDynamicObjectClass(CRegisteredString inName) override
+ {
+ return FindClass(inName);
+ }
+
+ void SetRenderCommands(CRegisteredString inClassName,
+ NVConstDataRef<dynamic::SCommand *> inCommands) override
+ {
+ SDynamicObjClassImpl *theClass =
+ const_cast<SDynamicObjectSystemImpl &>(*this).FindClass(inClassName);
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ theClass->ReleaseCommands();
+ QT3DSU32 commandAllocationSize = 0;
+ for (QT3DSU32 idx = 0, end = inCommands.size(); idx < end; ++idx) {
+ QT3DSU32 commandSize = Align(SCommand::GetSizeofCommand(*inCommands[idx]));
+ commandAllocationSize += commandSize;
+ }
+ QT3DSU32 commandPtrSize = inCommands.size() * sizeof(SCommand *);
+ QT3DSU32 totalAllocationSize = Align8(commandAllocationSize) + commandPtrSize;
+ QT3DSU8 *theCommandDataBegin = (QT3DSU8 *)m_Allocator.allocate(
+ totalAllocationSize, "dynamic::SCommand", __FILE__, __LINE__);
+ QT3DSU8 *theCurrentCommandData(theCommandDataBegin);
+ SCommand **theCommandPtrBegin =
+ reinterpret_cast<SCommand **>(theCommandDataBegin + Align8(commandAllocationSize));
+ SCommand **theCurrentCommandPtr = theCommandPtrBegin;
+ memZero(theCommandDataBegin, totalAllocationSize);
+
+ theClass->m_RequiresDepthTexture = false;
+ for (QT3DSU32 idx = 0, end = inCommands.size(); idx < end; ++idx) {
+ SCommand &theCommand(*inCommands[idx]);
+ QT3DSU32 theCommandSize = SCommand::GetSizeofCommand(theCommand);
+ SCommand::CopyConstructCommand(theCurrentCommandData, theCommand,
+ m_CoreContext.GetStringTable());
+ if (theCommand.m_Type == CommandTypes::ApplyDepthValue)
+ theClass->m_RequiresDepthTexture = true;
+ if (theCommand.m_Type == CommandTypes::BindTarget) {
+ SBindTarget *bt = reinterpret_cast<SBindTarget *>(&theCommand);
+ theClass->m_OutputFormat = bt->m_OutputFormat;
+ }
+
+ *theCurrentCommandPtr = reinterpret_cast<SCommand *>(theCurrentCommandData);
+ ++theCurrentCommandPtr;
+ theCurrentCommandData += Align(theCommandSize);
+ }
+ QT3DS_ASSERT(theCurrentCommandData - theCommandDataBegin == (int)commandAllocationSize);
+ QT3DS_ASSERT((QT3DSU8 *)theCurrentCommandPtr - theCommandDataBegin == (int)totalAllocationSize);
+ theClass->m_RenderCommands =
+ NVConstDataRef<SCommand *>(theCommandPtrBegin, inCommands.size());
+ }
+
+ virtual NVConstDataRef<dynamic::SCommand *>
+ GetRenderCommands(CRegisteredString inClassName) const override
+ {
+ SDynamicObjClassImpl *cls =
+ const_cast<SDynamicObjectSystemImpl &>(*this).FindClass(inClassName);
+ if (cls)
+ return cls->m_RenderCommands;
+ return NVConstDataRef<dynamic::SCommand *>();
+ }
+
+ SDynamicObject *CreateInstance(CRegisteredString inClassName,
+ NVAllocatorCallback &inSceneGraphAllocator) override
+ {
+ SDynamicObjClassImpl *theClass = FindClass(inClassName);
+ if (!theClass) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ QT3DSU32 totalObjectSize = theClass->m_BaseObjectSize + theClass->m_PropertySectionByteSize;
+ SDynamicObject *retval = reinterpret_cast<SDynamicObject *>(inSceneGraphAllocator.allocate(
+ totalObjectSize, inClassName.c_str(), __FILE__, __LINE__));
+ new (retval)
+ SDynamicObject(theClass->m_GraphObjectType, inClassName,
+ theClass->m_PropertySectionByteSize, theClass->m_BaseObjectSize);
+ memCopy(retval->GetDataSectionBegin(), theClass->m_PropertyDefaultData,
+ theClass->m_PropertySectionByteSize);
+ return retval;
+ }
+
+ void SetShaderData(CRegisteredString inPath, const char8_t *inData,
+ const char8_t *inShaderType, const char8_t *inShaderVersion,
+ bool inHasGeomShader, bool inIsComputeShader) override
+ {
+ inData = inData ? inData : "";
+ eastl::pair<TPathDataMap::iterator, bool> theInserter =
+ m_ExpandedFiles.insert(eastl::make_pair(inPath, (char8_t *)""));
+ if (theInserter.second == false) {
+ // Delete the existing entry.
+ m_Allocator.deallocate(theInserter.first->second);
+ }
+ QT3DSU32 theLen = (QT3DSU32)strlen(inData) + 1;
+ char8_t *newData = (char8_t *)m_Allocator.allocate(
+ theLen, "SDynamicObjectSystem::SetShaderData", __FILE__, __LINE__);
+ memCopy(newData, inData, theLen);
+ theInserter.first->second = newData;
+
+ // set shader type and version if available
+ if (inShaderType || inShaderVersion || inHasGeomShader || inIsComputeShader) {
+ // UdoL TODO: Add this to the load / save setction
+ // In addition we should merge the source code into SDynamicObjectShaderInfo as well
+ SDynamicObjectShaderInfo &theShaderInfo =
+ m_ShaderInfoMap.insert(eastl::make_pair(inPath, SDynamicObjectShaderInfo()))
+ .first->second;
+ IStringTable &theStringTable(m_CoreContext.GetStringTable());
+ theShaderInfo.m_Type = theStringTable.RegisterStr(nonNull(inShaderType));
+ theShaderInfo.m_Version = theStringTable.RegisterStr(nonNull(inShaderVersion));
+ theShaderInfo.m_HasGeomShader = inHasGeomShader;
+ theShaderInfo.m_IsComputeShader = inIsComputeShader;
+ }
+
+ return;
+ }
+
+ CRegisteredString GetShaderCacheKey(const char8_t *inId, const char8_t *inProgramMacro,
+ const dynamic::SDynamicShaderProgramFlags &inFlags)
+ {
+ m_ShaderKeyBuilder.assign(inId);
+ if (inProgramMacro && *inProgramMacro) {
+ m_ShaderKeyBuilder.append("#");
+ m_ShaderKeyBuilder.append(inProgramMacro);
+ }
+ if (inFlags.IsTessellationEnabled()) {
+ m_ShaderKeyBuilder.append("#");
+ m_ShaderKeyBuilder.append(TessModeValues::toString(inFlags.m_TessMode));
+ }
+ if (inFlags.IsGeometryShaderEnabled() && inFlags.m_WireframeMode) {
+ m_ShaderKeyBuilder.append("#");
+ m_ShaderKeyBuilder.append(inFlags.wireframeToString(inFlags.m_WireframeMode));
+ }
+
+ return m_CoreContext.GetStringTable().RegisterStr(m_ShaderKeyBuilder.c_str());
+ }
+
+ void InsertShaderHeaderInformation(Qt3DSString &theReadBuffer,
+ const char8_t *inPathToEffect) override
+ {
+ DoInsertShaderHeaderInformation(theReadBuffer, inPathToEffect);
+ }
+
+ void DoInsertShaderHeaderInformation(Qt3DSString &theReadBuffer,
+ const char8_t *inPathToEffect)
+ {
+ // Now do search and replace for the headers
+ for (Qt3DSString::size_type thePos = theReadBuffer.indexOf(m_IncludeSearch);
+ thePos != Qt3DSString::npos;
+ thePos = theReadBuffer.indexOf(m_IncludeSearch, thePos + 1)) {
+ Qt3DSString::size_type theEndQuote =
+ theReadBuffer.indexOf(QLatin1Char('\"'), thePos + m_IncludeSearch.size() + 1);
+
+ // Indicates an unterminated include file.
+ if (theEndQuote == Qt3DSString::npos) {
+ qCCritical(INVALID_OPERATION, "Unterminated include in file: %s", inPathToEffect);
+ theReadBuffer.clear();
+ break;
+ }
+ Qt3DSString::size_type theActualBegin = thePos + m_IncludeSearch.size();
+ Qt3DSString::iterator theIncludeBegin = theReadBuffer.begin() + theActualBegin;
+ Qt3DSString::iterator theIncludeEnd = theReadBuffer.begin() + theEndQuote;
+ m_IncludePath.clear();
+ m_IncludePath.append(theIncludeBegin, theIncludeEnd);
+ // If we haven't included the file yet this round
+ Qt3DSString theIncludeBuffer;
+ DoLoadShader(m_IncludePath.c_str(), theIncludeBuffer);
+ theReadBuffer =
+ theReadBuffer.replace(theReadBuffer.begin() + thePos,
+ theReadBuffer.begin() + theEndQuote + 1,
+ theIncludeBuffer);
+ }
+ }
+
+ void DoLoadShader(const char8_t *inPathToEffect, Qt3DSString &outShaderData)
+ {
+ eastl::pair<TPathDataMap::iterator, bool> theInsert =
+ m_ExpandedFiles.insert(eastl::make_pair(
+ m_CoreContext.GetStringTable().RegisterStr(inPathToEffect), (char8_t *)""));
+
+ if (theInsert.second) {
+
+ const QString defaultDir = m_Context->GetDynamicObjectSystem()
+ .GetShaderCodeLibraryDirectory();
+ const QString platformDir = m_Context->GetDynamicObjectSystem()
+ .shaderCodeLibraryPlatformDirectory();
+
+ QString fullPath;
+ NVScopedRefCounted<IRefCountedInputStream> theStream;
+ if (!platformDir.isEmpty()) {
+ QTextStream stream(&fullPath);
+ stream << platformDir << QLatin1Char('/') << inPathToEffect;
+ theStream = m_CoreContext.GetInputStreamFactory()
+ .GetStreamForFile(fullPath.toLatin1().data());
+ }
+
+ if (theStream.mPtr == NULL) {
+ fullPath.clear();
+ QTextStream stream(&fullPath);
+ stream << defaultDir << QLatin1Char('/') << inPathToEffect;
+ theStream = m_CoreContext.GetInputStreamFactory()
+ .GetStreamForFile(fullPath);
+ if (theStream.mPtr == NULL) {
+ fullPath.clear();
+ QTextStream stream(&fullPath);
+ stream << defaultDir << QLatin1Char('/') << inPathToEffect;
+ theStream = m_CoreContext.GetInputStreamFactory()
+ .GetStreamForFile(fullPath);
+ }
+ }
+ if (theStream.mPtr != NULL) {
+ QT3DSU8 readBuf[1024];
+ QT3DSU32 amountRead = 0;
+ do {
+ amountRead = theStream->Read(NVDataRef<QT3DSU8>(readBuf, 1024));
+ if (amountRead)
+ outShaderData.append((const char8_t *)readBuf, amountRead);
+ } while (amountRead);
+ } else {
+ qCCritical(INVALID_OPERATION, "Failed to find include file %s", inPathToEffect);
+ QT3DS_ASSERT(false);
+ }
+ theInsert.first->second = (char8_t *)m_Allocator.allocate(
+ outShaderData.size() + 1, "SDynamicObjectSystem::DoLoadShader", __FILE__, __LINE__);
+ memCopy(theInsert.first->second, outShaderData.c_str(),
+ QT3DSU32(outShaderData.size()) + 1);
+ } else {
+ outShaderData.assign(theInsert.first->second);
+ }
+
+ DoInsertShaderHeaderInformation(outShaderData, inPathToEffect);
+ }
+
+ void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap, const char8_t *inProjectDir) const override
+ {
+ QT3DSU32 startOffset = ioBuffer.size();
+ ioBuffer.write((QT3DSU32)m_ExpandedFiles.size());
+ for (TPathDataMap::const_iterator theIter = m_ExpandedFiles.begin();
+ theIter != m_ExpandedFiles.end(); ++theIter) {
+ CRegisteredString thePath(theIter->first);
+ char8_t *theData = theIter->second;
+ theData = theData ? theData : (char8_t *)"";
+ QT3DSU32 theLen = (QT3DSU32)strlen(theData);
+ thePath.Remap(inRemapMap);
+ ioBuffer.write(thePath);
+ ioBuffer.write(theLen + 1);
+ ioBuffer.write(theData, theLen + 1);
+ ioBuffer.align(sizeof(void *));
+ }
+ ioBuffer.write((QT3DSU32)m_Classes.size());
+ SStringSaveRemapper theRemapper(m_Allocator, inRemapMap, inProjectDir,
+ m_CoreContext.GetStringTable());
+ for (TStringClassMap::const_iterator iter = m_Classes.begin(), end = m_Classes.end();
+ iter != end; ++iter) {
+ const SDynamicObjClassImpl *theClass = iter->second;
+ ioBuffer.align(4);
+ QT3DSU32 objOffset = ioBuffer.size();
+ QT3DSU32 classOffset = objOffset - startOffset;
+ (void)classOffset;
+ QT3DSU32 defOffset = objOffset + sizeof(SDynamicObjClassImpl);
+ QT3DSU32 dataOffset =
+ defOffset + theClass->m_PropertyDefinitions.size() * sizeof(SPropertyDefinition);
+ QT3DSU32 dataEnd = dataOffset + theClass->m_PropertySectionByteSize;
+ QT3DSU32 writeAmount = dataEnd - objOffset;
+ ioBuffer.write((const QT3DSU8 *)theClass, writeAmount);
+ ioBuffer.align(4);
+ QT3DSU32 cmdOffset = 0;
+ QT3DSU8 *writeCommandStart = NULL;
+ if (theClass->m_RenderCommands.size()) {
+ // We know commands are allocated in a block.
+ const SCommand &firstCommand = *theClass->m_RenderCommands[0];
+ const QT3DSU8 *commandStart = reinterpret_cast<const QT3DSU8 *>(&firstCommand);
+ const SCommand &lastCommand(
+ *theClass->m_RenderCommands[theClass->m_RenderCommands.size() - 1]);
+ const QT3DSU8 *commandEnd = reinterpret_cast<const QT3DSU8 *>(&lastCommand)
+ + SCommand::GetSizeofCommand(lastCommand);
+ cmdOffset = ioBuffer.size();
+ ioBuffer.write(commandStart, (QT3DSU32)(commandEnd - commandStart));
+ // Write location of the actual storage for the command ptr array.
+ ioBuffer.writeZeros(theClass->m_RenderCommands.size() * sizeof(SCommand **));
+ }
+ ioBuffer.align(4);
+ if (cmdOffset)
+ writeCommandStart = ioBuffer.begin() + cmdOffset;
+
+ SDynamicObjClassImpl *writeClass =
+ (SDynamicObjClassImpl *)(ioBuffer.begin() + objOffset);
+ writeClass->m_Id.Remap(inRemapMap);
+ writeClass->SetupThisObjectFromMemory(m_Allocator, theRemapper, writeCommandStart,
+ theClass->m_RenderCommands.size());
+ for (QT3DSU32 idx = 0, end = theClass->m_PropertyDefinitions.size(); idx < end; ++idx) {
+ // Moved into the loop because writing the enumerations may resize the data buffer.
+ SPropertyDefinition *theDefinitions =
+ (SPropertyDefinition *)(ioBuffer.begin() + defOffset);
+ theDefinitions[idx].m_Name.Remap(inRemapMap);
+ const SPropertyDefinition &theDefinition(theClass->m_PropertyDefinitions[idx]);
+ if (theDefinitions[idx].m_EnumValueNames.size()) {
+ QT3DSU32 enumOffset = ioBuffer.size();
+ ioBuffer.write(theDefinition.m_EnumValueNames.begin(),
+ theDefinition.m_EnumValueNames.size()
+ * sizeof(CRegisteredString));
+ CRegisteredString *strPtr =
+ (CRegisteredString *)(ioBuffer.begin() + enumOffset);
+ for (QT3DSU32 enumIdx = 0, enumEnd = theDefinition.m_EnumValueNames.size();
+ enumIdx < enumEnd; ++enumIdx)
+ strPtr[enumIdx].Remap(inRemapMap);
+ }
+ if (theDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ QT3DSU8 *theDataPtr = ioBuffer.begin() + dataOffset;
+ CRegisteredString *realData =
+ reinterpret_cast<CRegisteredString *>(theDataPtr + theDefinition.m_Offset);
+ realData->Remap(inRemapMap);
+ }
+ }
+ }
+
+ // Write out meta information about the shader system
+ QT3DSU32 numShaderInfos = (QT3DSU32)m_ShaderInfoMap.size();
+ ioBuffer.write(numShaderInfos);
+ for (TShaderInfoMap::const_iterator iter = m_ShaderInfoMap.begin(),
+ end = m_ShaderInfoMap.end();
+ iter != end; ++iter) {
+ CRegisteredString infoName = iter->first;
+ infoName.Remap(inRemapMap);
+ ioBuffer.write(infoName);
+ const SDynamicObjectShaderInfo &theInfo = iter->second;
+ CRegisteredString infoType(theInfo.m_Type);
+ CRegisteredString infoVersion(theInfo.m_Version);
+ infoType.Remap(inRemapMap);
+ infoVersion.Remap(inRemapMap);
+ ioBuffer.write(infoType);
+ ioBuffer.write(infoVersion);
+ }
+ }
+
+ void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t *inProjectDir) override
+ {
+ m_Allocator.m_PreAllocatedBlock = inData;
+ m_Allocator.m_OwnsMemory = false;
+ TStr workspaceStr(ForwardingAllocator(m_Foundation.getAllocator(), "ProjPath"));
+ qt3ds::render::SDataReader theReader(inData.begin(), inData.end());
+ QT3DSU32 numMappedPaths = theReader.LoadRef<QT3DSU32>();
+ for (QT3DSU32 idx = 0, end = numMappedPaths; idx < end; ++idx) {
+ CRegisteredString theStr(theReader.LoadRef<CRegisteredString>());
+ QT3DSU32 theCharLen = theReader.LoadRef<QT3DSU32>();
+ char8_t *thePathData = reinterpret_cast<char8_t *>(theReader.m_CurrentPtr);
+ theReader.m_CurrentPtr += theCharLen;
+ theReader.Align();
+ theStr.Remap(inStrDataBlock);
+ m_ExpandedFiles.insert(eastl::make_pair(theStr, thePathData));
+ }
+ SStringLoadRemapper theRemapper(m_Allocator, inStrDataBlock, inProjectDir,
+ m_CoreContext.GetStringTable());
+ QT3DSU32 numClasses = theReader.LoadRef<QT3DSU32>();
+ for (QT3DSU32 idx = 0, end = numClasses; idx < end; ++idx) {
+ theReader.Align(4);
+ size_t classOffset = static_cast<QT3DSU32>(theReader.m_CurrentPtr - inData.mData);
+ (void)classOffset;
+ SDynamicObjClassImpl *theClass = (SDynamicObjClassImpl *)theReader.m_CurrentPtr;
+ theClass->m_Allocator = &m_Allocator;
+ theReader.m_CurrentPtr += sizeof(SDynamicObjClassImpl);
+ SPropertyDefinition *theDefinitions = (SPropertyDefinition *)theReader.m_CurrentPtr;
+ theReader.m_CurrentPtr +=
+ theClass->m_PropertyDefinitions.size() * sizeof(SPropertyDefinition);
+ QT3DSU8 *theDataBuffer = theReader.m_CurrentPtr;
+ theReader.m_CurrentPtr += theClass->m_PropertySectionByteSize;
+ theClass->m_Id.Remap(inStrDataBlock);
+ theClass->m_PropertyDefinitions = NVConstDataRef<SPropertyDefinition>(
+ theDefinitions, theClass->m_PropertyDefinitions.size());
+ theClass->m_PropertyDefaultData = theDataBuffer;
+ theReader.Align(4);
+ QT3DSU8 *theCommandStart = theReader.m_CurrentPtr;
+
+ QT3DSU32 numRenderCommands = theClass->m_RenderCommands.size();
+ new (theClass) SDynamicObjClassImpl(
+ m_Allocator, theClass->m_Id, theClass->m_PropertyDefinitions,
+ theClass->m_PropertySectionByteSize, theClass->m_BaseObjectSize,
+ theClass->m_GraphObjectType, theClass->m_PropertyDefaultData,
+ theClass->m_RequiresDepthTexture, theClass->m_OutputFormat);
+
+ theClass->SetupThisObjectFromMemory(m_Allocator, theRemapper, theCommandStart,
+ numRenderCommands);
+
+ if (theClass->m_RenderCommands.size()) {
+ const SCommand &theLastCommand =
+ *theClass->m_RenderCommands[theClass->m_RenderCommands.size() - 1];
+ const QT3DSU8 *theCommandEnd = reinterpret_cast<const QT3DSU8 *>(&theLastCommand)
+ + SCommand::GetSizeofCommand(theLastCommand);
+ theReader.m_CurrentPtr = const_cast<QT3DSU8 *>(theCommandEnd);
+ theReader.m_CurrentPtr += theClass->m_RenderCommands.size() * sizeof(SCommand **);
+ }
+ theReader.Align(4);
+
+ for (QT3DSU32 defIdx = 0, defEnd = theClass->m_PropertyDefinitions.size(); defIdx < defEnd;
+ ++defIdx) {
+ SPropertyDefinition &theDef(theDefinitions[defIdx]);
+ theDef.m_Name.Remap(inStrDataBlock);
+ if (theDef.m_EnumValueNames.size()) {
+ CRegisteredString *theNames = (CRegisteredString *)theReader.m_CurrentPtr;
+ theReader.m_CurrentPtr +=
+ theDef.m_EnumValueNames.size() * sizeof(CRegisteredString);
+ theDef.m_EnumValueNames =
+ NVDataRef<CRegisteredString>(theNames, theDef.m_EnumValueNames.size());
+ for (QT3DSU32 enumIdx = 0, enumEnd = theDef.m_EnumValueNames.size();
+ enumIdx < enumEnd; ++enumIdx)
+ theNames[enumIdx].Remap(inStrDataBlock);
+ }
+ if (theDef.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ CRegisteredString *realData =
+ reinterpret_cast<CRegisteredString *>(theDataBuffer + theDef.m_Offset);
+ realData->Remap(inStrDataBlock);
+ }
+ }
+ m_Classes.insert(eastl::make_pair(theClass->m_Id, theClass));
+ }
+ QT3DSU32 theNumShaderInfos = theReader.LoadRef<QT3DSU32>();
+ for (QT3DSU32 idx = 0, end = theNumShaderInfos; idx < end; ++idx) {
+ CRegisteredString name, type, version;
+ name = theReader.LoadRef<CRegisteredString>();
+ type = theReader.LoadRef<CRegisteredString>();
+ version = theReader.LoadRef<CRegisteredString>();
+ name.Remap(inStrDataBlock);
+ type.Remap(inStrDataBlock);
+ version.Remap(inStrDataBlock);
+ SDynamicObjectShaderInfo &theInfo =
+ m_ShaderInfoMap.insert(eastl::make_pair(name, SDynamicObjectShaderInfo()))
+ .first->second;
+ theInfo.m_Type = type;
+ theInfo.m_Version = version;
+ }
+ }
+
+ IDynamicObjectSystem &CreateDynamicSystem(IQt3DSRenderContext &rc) override
+ {
+ m_Context = &rc;
+ return *this;
+ }
+
+ QStringList getParameters(const QString &str, int begin, int end)
+ {
+ const QString s = str.mid(begin, end - begin + 1);
+ return s.split(",");
+ }
+
+ void insertSnapperDirectives(QString &str)
+ {
+ int beginIndex = 0;
+ // Snapper macros:
+ // #define SNAPPER_SAMPLER2D(propName, propNiceName, texFilter, texWrap, showUI ) \
+ // uniform sampler2D propName; \
+ // uniform int flag##propName; \
+ // uniform vec4 propName##Info; \
+ // vec4 texture2D_##propName(vec2 uv) \
+ // { \
+ // return GetTextureValue( propName, uv, propName##Info.z ); \
+ // }
+ //
+ // #define SNAPPER_SAMPLER2DWITHDEFAULT(propName, propNiceName, texFilter, texWrap, defaultPath, showUI ) \
+ // SNAPPER_SAMPLER2D( propName, propNiceName, texFilter, texWrap, showUI )
+ //
+ // #define SNAPPER_SAMPLERCUBE(propName, propNiceName, texFilter, texWrap ) \
+ // uniform samplerCube propName; \
+ // uniform vec2 propName##UVRange; \
+ // uniform int flag##propName; \
+ // uniform vec2 propName##Size;
+ QString snapperSampler = QStringLiteral("SNAPPER_SAMPLER2D(");
+ QString snapperSamplerDefault = QStringLiteral("SNAPPER_SAMPLER2DWITHDEFAULT(");
+ QString snapperSamplerCube = QStringLiteral("SNAPPER_SAMPLERCUBE(");
+ QString endingBracket = QStringLiteral(")");
+
+ while ((beginIndex = str.indexOf(snapperSampler, beginIndex)) >= 0) {
+ int endIndex = str.indexOf(endingBracket, beginIndex);
+ const QStringList list = getParameters(str, beginIndex + snapperSampler.length(),
+ endIndex);
+ str.remove(beginIndex, endIndex - beginIndex + 1);
+ if (list.size() == 5) {
+ QString insertStr;
+ QTextStream stream(&insertStr);
+ stream << "uniform sampler2D " << list[0] << ";\n";
+ stream << "uniform int flag" << list[0] << ";\n";
+ stream << "vec4 " << list[0] << "Info;\n";
+ stream << "vec4 texture2D_" << list[0] << "(vec2 uv) "
+ << "{ return GetTextureValue( " << list[0] << ", uv, "
+ << list[0] <<"Info.z ); }\n";
+ str.insert(beginIndex, insertStr);
+ }
+ }
+ beginIndex = 0;
+ while ((beginIndex = str.indexOf(snapperSamplerDefault, beginIndex)) >= 0) {
+ int endIndex = str.indexOf(endingBracket, beginIndex);
+ const QStringList list = getParameters(str, beginIndex + snapperSamplerDefault.length(),
+ endIndex);
+ str.remove(beginIndex, endIndex - beginIndex + 1);
+ if (list.size() == 5) {
+ QString insertStr;
+ QTextStream stream(&insertStr);
+ stream << "uniform sampler2D " << list[0] << ";\n";
+ stream << "uniform int flag" << list[0] << ";\n";
+ stream << "vec4 " << list[0] << "Info;\n";
+ stream << "vec4 texture2D_" << list[0] << "(vec2 uv) "
+ << "{ return GetTextureValue( " << list[0] << ", uv, "
+ << list[0] <<"Info.z ); }\n";
+ str.insert(beginIndex, insertStr);
+ }
+ }
+ beginIndex = 0;
+ while ((beginIndex = str.indexOf(snapperSamplerCube, beginIndex)) >= 0) {
+ int endIndex = str.indexOf(endingBracket, beginIndex);
+ const QStringList list = getParameters(str, beginIndex + snapperSamplerCube.length(),
+ endIndex);
+ str.remove(beginIndex, endIndex - beginIndex + 1);
+ if (list.size() == 4) {
+ QString insertStr;
+ QTextStream stream(&insertStr);
+ stream << "uniform samplerCube " << list[0] << ";\n";
+ stream << "uniform vec2 "<< list[0] << "UVRange;\n";
+ stream << "uniform int flag" << list[0] << ";\n";
+ stream << "uniform vec2 "<< list[0] << "Size;\n";
+ str.insert(beginIndex, insertStr);
+ }
+ }
+ }
+
+ NVRenderShaderProgram *CompileShader(CRegisteredString inId, const char8_t *inProgramSource,
+ const char8_t *inGeomSource,
+ CRegisteredString inProgramMacroName,
+ TShaderFeatureSet inFeatureSet,
+ const dynamic::SDynamicShaderProgramFlags &inFlags,
+ bool inForceCompilation = false)
+ {
+ m_VertShader.clear();
+ m_FragShader.clear();
+ m_GeometryShader.clear();
+ SShaderCacheProgramFlags theFlags;
+
+ m_VertShader.append("#define VERTEX_SHADER\n");
+ m_FragShader.append("#define FRAGMENT_SHADER\n");
+
+ if (inProgramMacroName.IsValid()) {
+ m_VertShader.append("#define ");
+ m_VertShader.append(inProgramMacroName.c_str());
+ m_VertShader.append("\n");
+
+ m_FragShader.append("#define ");
+ m_FragShader.append(inProgramMacroName.c_str());
+ m_FragShader.append("\n");
+ }
+
+ if (inGeomSource && inFlags.IsGeometryShaderEnabled()) {
+ theFlags.SetGeometryShaderEnabled(true);
+
+ m_GeometryShader.append("#define GEOMETRY_SHADER 1\n");
+ m_GeometryShader.append(inGeomSource);
+
+ m_VertShader.append("#define GEOMETRY_SHADER 1\n");
+ } else if (inFlags.IsGeometryShaderEnabled()) {
+ theFlags.SetGeometryShaderEnabled(true);
+ m_GeometryShader.append("#define USER_GEOMETRY_SHADER 1\n");
+ m_GeometryShader.append(inProgramSource);
+ m_VertShader.append("#define GEOMETRY_SHADER 0\n");
+ m_FragShader.append("#define GEOMETRY_WIREFRAME_SHADER 0\n");
+ } else {
+ m_VertShader.append("#define GEOMETRY_SHADER 0\n");
+ m_FragShader.append("#define GEOMETRY_WIREFRAME_SHADER 0\n");
+ }
+
+ if (strstr(inProgramSource, "SNAPPER_SAMPLER")) {
+ QString programSource(inProgramSource);
+ insertSnapperDirectives(programSource);
+ QByteArray data = programSource.toLatin1();
+ const char *source = data.constData();
+
+ m_VertShader.append(source);
+ m_FragShader.append(source);
+ } else {
+ m_VertShader.append(inProgramSource);
+ m_FragShader.append(inProgramSource);
+ }
+
+ IShaderCache &theShaderCache = m_Context->GetShaderCache();
+
+ CRegisteredString theKey = m_Context->GetStringTable().RegisterStr(
+ GetShaderCacheKey(inId, inProgramMacroName, inFlags));
+
+ if (inForceCompilation) {
+ return theShaderCache.ForceCompileProgram(theKey, m_VertShader.c_str(),
+ m_FragShader.c_str(), NULL, NULL,
+ m_GeometryShader.c_str(), theFlags,
+ inFeatureSet, false);
+ }
+ return theShaderCache.CompileProgram(theKey, m_VertShader.c_str(), m_FragShader.c_str(),
+ NULL, NULL, m_GeometryShader.c_str(), theFlags,
+ inFeatureSet);
+ }
+
+ // This just returns the custom material shader source without compiling
+ void GetShaderSource(CRegisteredString inPath, Qt3DSString &outBuffer) override
+ {
+ outBuffer.clear();
+ outBuffer.append("#define FRAGMENT_SHADER\n");
+
+ Qt3DSString source;
+ DoLoadShader(inPath, outBuffer);
+ }
+
+ TShaderAndFlags GetShaderProgram(CRegisteredString inPath,
+ CRegisteredString inProgramMacro,
+ TShaderFeatureSet inFeatureSet,
+ const SDynamicShaderProgramFlags &inFlags,
+ bool inForceCompilation) override
+ {
+ eastl::pair<const SShaderMapKey, TShaderAndFlags> theInserter(
+ SShaderMapKey(TStrStrPair(inPath, inProgramMacro), inFeatureSet, inFlags.m_TessMode,
+ inFlags.m_WireframeMode),
+ TShaderAndFlags());
+ eastl::pair<TShaderMap::iterator, bool> theInsertResult(m_ShaderMap.insert(theInserter));
+ if (theInsertResult.second || inForceCompilation) {
+ NVRenderShaderProgram *theProgram = m_Context->GetShaderCache().GetProgram(
+ GetShaderCacheKey(inPath, inProgramMacro, inFlags), inFeatureSet);
+ SDynamicShaderProgramFlags theFlags(inFlags);
+ if (!theProgram || inForceCompilation) {
+ SDynamicObjectShaderInfo &theShaderInfo =
+ m_ShaderInfoMap.insert(eastl::make_pair(inPath, SDynamicObjectShaderInfo()))
+ .first->second;
+ if (theShaderInfo.m_IsComputeShader == false) {
+ Qt3DSString theShaderBuffer;
+ DoLoadShader(inPath, theShaderBuffer);
+ if (theShaderInfo.m_HasGeomShader)
+ theFlags.SetGeometryShaderEnabled(true);
+ theProgram = CompileShader(inPath, theShaderBuffer.c_str(), NULL, inProgramMacro,
+ inFeatureSet, theFlags, inForceCompilation);
+ } else {
+ Qt3DSString theShaderBuffer;
+ const char8_t *shaderVersionStr = "#version 430\n";
+ if ((QT3DSU32)m_Context->GetRenderContext().GetRenderContextType()
+ == NVRenderContextValues::GLES3PLUS)
+ shaderVersionStr = "#version 310 es\n";
+ DoLoadShader(inPath, theShaderBuffer);
+ theShaderBuffer.insert(0, shaderVersionStr);
+ const char8_t *programSource = theShaderBuffer.c_str();
+ QT3DSU32 len = (QT3DSU32)strlen(nonNull(programSource)) + 1;
+ theProgram =
+ m_Context->GetRenderContext()
+ .CompileComputeSource(inPath.c_str(),
+ NVConstDataRef<QT3DSI8>((QT3DSI8 *)programSource, len))
+ .mShader;
+ }
+ }
+ theInsertResult.first->second = TShaderAndFlags(theProgram, theFlags);
+ }
+ return theInsertResult.first->second;
+ }
+
+ TShaderAndFlags GetDepthPrepassShader(CRegisteredString inPath,
+ CRegisteredString inPMacro,
+ TShaderFeatureSet inFeatureSet) override
+ {
+ SDynamicObjectShaderInfo &theShaderInfo =
+ m_ShaderInfoMap.insert(eastl::make_pair(inPath, SDynamicObjectShaderInfo()))
+ .first->second;
+ if (theShaderInfo.m_HasGeomShader == false)
+ return TShaderAndFlags();
+ // else, here we go...
+ SDynamicShaderProgramFlags theFlags;
+ m_ShaderKeyBuilder.assign(inPMacro.c_str());
+ m_ShaderKeyBuilder.append("depthprepass");
+
+ CRegisteredString theProgramMacro =
+ m_Context->GetStringTable().RegisterStr(m_ShaderKeyBuilder.c_str());
+
+ eastl::pair<const SShaderMapKey, TShaderAndFlags> theInserter(
+ SShaderMapKey(TStrStrPair(inPath, theProgramMacro), inFeatureSet, theFlags.m_TessMode,
+ theFlags.m_WireframeMode),
+ TShaderAndFlags());
+ eastl::pair<TShaderMap::iterator, bool> theInsertResult(m_ShaderMap.insert(theInserter));
+ if (theInsertResult.second) {
+ NVRenderShaderProgram *theProgram = m_Context->GetShaderCache().GetProgram(
+ GetShaderCacheKey(inPath, theProgramMacro, theFlags), inFeatureSet);
+ SDynamicShaderProgramFlags flags(theFlags);
+ if (!theProgram) {
+ Qt3DSString theShaderBuffer;
+ DoLoadShader(inPath, theShaderBuffer);
+ SShaderVertexCodeGenerator vertexShader(
+ m_Context->GetStringTable(), m_Allocator,
+ m_Context->GetRenderContext().GetRenderContextType());
+ SShaderFragmentCodeGenerator fragmentShader(
+ vertexShader, m_Allocator,
+ m_Context->GetRenderContext().GetRenderContextType());
+
+ vertexShader.AddAttribute("attr_pos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = model_view_projection * vec4(attr_pos, 1.0);");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfragOutput = vec4(0.0, 0.0, 0.0, 0.0);");
+ fragmentShader.Append("}");
+ const char8_t *vertexSource = vertexShader.BuildShaderSource();
+ const char8_t *fragmentSource = fragmentShader.BuildShaderSource();
+
+ Qt3DSString programBuffer;
+ programBuffer.assign("#ifdef VERTEX_SHADER\n");
+ programBuffer.append(vertexSource);
+ programBuffer.append("\n#endif\n");
+ programBuffer.append("\n#ifdef FRAGMENT_SHADER\n");
+ programBuffer.append(fragmentSource);
+ programBuffer.append("\n#endif");
+ flags.SetGeometryShaderEnabled(true);
+ theProgram = CompileShader(inPath, programBuffer.c_str(), theShaderBuffer.c_str(),
+ theProgramMacro, inFeatureSet, flags);
+ }
+ theInsertResult.first->second = TShaderAndFlags(theProgram, flags);
+ }
+ return theInsertResult.first->second;
+ }
+
+ virtual void setShaderCodeLibraryPlatformDirectory(const QString &directory) override
+ {
+ m_shaderLibraryPlatformDirectory = directory;
+ }
+
+ virtual QString shaderCodeLibraryPlatformDirectory() override
+ {
+ return m_shaderLibraryPlatformDirectory;
+ }
+};
+}
+
+IDynamicObjectSystemCore &
+IDynamicObjectSystemCore::CreateDynamicSystemCore(IQt3DSRenderContextCore &rc)
+{
+ return *QT3DS_NEW(rc.GetAllocator(), SDynamicObjectSystemImpl)(rc);
+}
diff --git a/src/runtimerender/Qt3DSRenderDynamicObjectSystem.h b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.h
new file mode 100644
index 0000000..cfe022e
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderDynamicObjectSystem.h
@@ -0,0 +1,286 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_DYNAMIC_OBJECT_SYSTEM_H
+#define QT3DS_RENDER_DYNAMIC_OBJECT_SYSTEM_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSVec2.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderTessModeValues.h"
+#include "Qt3DSRenderGraphObjectTypes.h"
+#include "EASTL/utility.h"
+
+#include <QtCore/qstring.h>
+
+namespace qt3ds {
+namespace render {
+ struct SDynamicObject;
+
+ namespace dynamic {
+
+ struct SCommand;
+
+ struct SPropertyDeclaration
+ {
+ const char8_t *m_Name;
+ // The datatypes map directly to the obvious types *except*
+ // for NVRenderTexture2DPtr. This type will be interpreted as a
+ // CRegisteredString (they are the same binary size)
+ // and will be used to lookup the texture from the buffer manager.
+ NVRenderShaderDataTypes::Enum m_DataType;
+
+ SPropertyDeclaration(const char8_t *inName, NVRenderShaderDataTypes::Enum inDtype)
+ : m_Name(inName)
+ , m_DataType(inDtype)
+ {
+ }
+ SPropertyDeclaration()
+ : m_Name("")
+ , m_DataType(NVRenderShaderDataTypes::Unknown)
+ {
+ }
+ };
+
+ struct SPropertyDefinition
+ {
+ CRegisteredString m_Name;
+
+ //*not* relative to the presentation directory
+ CRegisteredString m_ImagePath;
+ // The datatypes map directly to the obvious types *except*
+ // for NVRenderTexture2DPtr. This type will be interpreted as a
+ // CRegisteredString and will be used to lookup the texture
+ // from the buffer manager.
+ NVRenderShaderDataTypes::Enum m_DataType;
+ // All offsets are relative to the beginning of the SEffect
+ // and are aligned to 4 byte boundaries.
+ QT3DSU32 m_Offset;
+ // Sizeof this datatype.
+ QT3DSU32 m_ByteSize;
+ NVConstDataRef<CRegisteredString> m_EnumValueNames;
+
+ NVRenderTextureTypeValue::Enum
+ m_TexUsageType; ///< texture usage type like diffuse, specular, ...
+ // Applies to both s,t
+ NVRenderTextureCoordOp::Enum m_CoordOp;
+ // Set mag Filter
+ NVRenderTextureMagnifyingOp::Enum m_MagFilterOp;
+ // Set min Filter
+ NVRenderTextureMinifyingOp::Enum m_MinFilterOp;
+ bool m_IsEnumProperty;
+ SPropertyDefinition()
+ : m_DataType(NVRenderShaderDataTypes::Unknown)
+ , m_Offset(0)
+ , m_ByteSize(0)
+ , m_TexUsageType(NVRenderTextureTypeValue::Unknown)
+ , m_CoordOp(NVRenderTextureCoordOp::ClampToEdge)
+ , m_MagFilterOp(NVRenderTextureMagnifyingOp::Linear)
+ , m_MinFilterOp(NVRenderTextureMinifyingOp::Linear)
+ , m_IsEnumProperty(false)
+ {
+ }
+ SPropertyDefinition(CRegisteredString inName, NVRenderShaderDataTypes::Enum inType,
+ QT3DSU32 inOffset, QT3DSU32 inByteSize)
+ : m_Name(inName)
+ , m_DataType(inType)
+ , m_Offset(inOffset)
+ , m_ByteSize(inByteSize)
+ , m_TexUsageType(NVRenderTextureTypeValue::Unknown)
+ , m_CoordOp(NVRenderTextureCoordOp::ClampToEdge)
+ , m_MagFilterOp(NVRenderTextureMagnifyingOp::Linear)
+ , m_MinFilterOp(NVRenderTextureMinifyingOp::Linear)
+ , m_IsEnumProperty(false)
+ {
+ }
+ };
+
+ struct SDynamicShaderProgramFlags : public SShaderCacheProgramFlags
+ {
+ TessModeValues::Enum m_TessMode;
+ bool m_WireframeMode;
+
+ SDynamicShaderProgramFlags()
+ : m_TessMode(TessModeValues::NoTess)
+ , m_WireframeMode(false)
+ {
+ }
+
+ SDynamicShaderProgramFlags(TessModeValues::Enum inTessMode, bool inWireframeMode)
+ : m_TessMode(inTessMode)
+ , m_WireframeMode(inWireframeMode)
+ {
+ }
+
+ static const char *wireframeToString(bool inEnable)
+ {
+ if (inEnable)
+ return "wireframeMode:true";
+ else
+ return "wireframeMode:false";
+ }
+ };
+ }
+
+ class IDynamicObjectClass
+ {
+ protected:
+ virtual ~IDynamicObjectClass() {}
+ public:
+ virtual CRegisteredString GetId() const = 0;
+ virtual NVConstDataRef<dynamic::SPropertyDefinition> GetProperties() const = 0;
+ virtual QT3DSU32 GetPropertySectionByteSize() const = 0;
+ virtual const QT3DSU8 *GetDefaultValueBuffer() const = 0;
+ virtual QT3DSU32 GetBaseObjectSize() const = 0;
+ virtual GraphObjectTypes::Enum GraphObjectType() const = 0;
+ virtual const dynamic::SPropertyDefinition *
+ FindPropertyByName(CRegisteredString inName) const = 0;
+ virtual NVConstDataRef<dynamic::SCommand *> GetRenderCommands() const = 0;
+ virtual bool RequiresDepthTexture() const = 0;
+ virtual void SetRequiresDepthTexture(bool inRequires) = 0;
+ virtual bool RequiresCompilation() const = 0;
+ virtual void SetRequiresCompilation(bool inRequires) = 0;
+ virtual NVRenderTextureFormats::Enum GetOutputTextureFormat() const = 0;
+ };
+
+ class IDynamicObjectSystemCore : public NVRefCounted
+ {
+ protected:
+ virtual ~IDynamicObjectSystemCore() {}
+ public:
+ virtual bool IsRegistered(CRegisteredString inStr) = 0;
+
+ virtual bool Register(CRegisteredString inName,
+ NVConstDataRef<dynamic::SPropertyDeclaration> inProperties,
+ QT3DSU32 inBaseObjectSize, GraphObjectTypes::Enum inGraphObjectType) = 0;
+
+ virtual bool Unregister(CRegisteredString inName) = 0;
+
+ // Set the default value. THis is unnecessary if the default is zero as that is what it is
+ // assumed to be.
+ virtual void SetPropertyDefaultValue(CRegisteredString inName, CRegisteredString inPropName,
+ NVConstDataRef<QT3DSU8> inDefaultData) = 0;
+
+ virtual void SetPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName,
+ NVConstDataRef<CRegisteredString> inNames) = 0;
+
+ virtual NVConstDataRef<CRegisteredString>
+ GetPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName) const = 0;
+
+ virtual NVConstDataRef<dynamic::SPropertyDefinition>
+ GetProperties(CRegisteredString inName) const = 0;
+
+ virtual void SetPropertyTextureSettings(CRegisteredString inName,
+ CRegisteredString inPropName,
+ CRegisteredString inPropPath,
+ NVRenderTextureTypeValue::Enum inTexType,
+ NVRenderTextureCoordOp::Enum inCoordOp,
+ NVRenderTextureMagnifyingOp::Enum inMagFilterOp,
+ NVRenderTextureMinifyingOp::Enum inMinFilterOp) = 0;
+
+ virtual IDynamicObjectClass *GetDynamicObjectClass(CRegisteredString inName) = 0;
+
+ // The effect commands are the actual commands that run for a given effect. The tell the
+ // system exactly
+ // explicitly things like bind this shader, bind this render target, apply this property,
+ // run this shader
+ // See UICRenderEffectCommands.h for the list of commands.
+ // These commands are copied into the effect.
+ virtual void SetRenderCommands(CRegisteredString inClassName,
+ NVConstDataRef<dynamic::SCommand *> inCommands) = 0;
+ virtual NVConstDataRef<dynamic::SCommand *>
+ GetRenderCommands(CRegisteredString inClassName) const = 0;
+
+ virtual SDynamicObject *CreateInstance(CRegisteredString inClassName,
+ NVAllocatorCallback &inSceneGraphAllocator) = 0;
+
+ // scan shader for #includes and insert any found"
+ virtual void InsertShaderHeaderInformation(Qt3DSString &inShader,
+ const char *inLogPath) = 0;
+
+ // Set the shader data for a given path. Used when a path doesn't correspond to a file but
+ // the data has been
+ // auto-generated. The system will look for data under this path key during the BindShader
+ // effect command.
+ virtual void SetShaderData(CRegisteredString inPath, const char8_t *inData,
+ const char8_t *inShaderType = NULL,
+ const char8_t *inShaderVersion = NULL,
+ bool inHasGeomShader = false,
+ bool inIsComputeShader = false) = 0;
+
+ // Overall save functions for saving the class information out to the binary file.
+ virtual void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap,
+ const char8_t *inProjectDir) const = 0;
+ virtual void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t *inProjectDir) = 0;
+
+ virtual IDynamicObjectSystem &CreateDynamicSystem(IQt3DSRenderContext &rc) = 0;
+
+ static IDynamicObjectSystemCore &CreateDynamicSystemCore(IQt3DSRenderContextCore &rc);
+ };
+
+ typedef eastl::pair<NVScopedRefCounted<NVRenderShaderProgram>,
+ dynamic::SDynamicShaderProgramFlags>
+ TShaderAndFlags;
+
+ class IDynamicObjectSystem : public IDynamicObjectSystemCore
+ {
+ protected:
+ virtual ~IDynamicObjectSystem() {}
+
+ public:
+ virtual TShaderAndFlags
+ GetShaderProgram(CRegisteredString inPath, CRegisteredString inProgramMacro,
+ TShaderFeatureSet inFeatureSet,
+ const dynamic::SDynamicShaderProgramFlags &inFlags,
+ bool inForceCompilation = false) = 0;
+
+ virtual void GetShaderSource(CRegisteredString inPath, Qt3DSString &outSource) = 0;
+
+ // Will return null in the case where a custom prepass shader isn't needed for this object
+ // If no geom shader, then no depth prepass shader.
+ virtual TShaderAndFlags GetDepthPrepassShader(CRegisteredString inPath,
+ CRegisteredString inProgramMacro,
+ TShaderFeatureSet inFeatureSet) = 0;
+
+ virtual void setShaderCodeLibraryPlatformDirectory(const QString &directory) = 0;
+ virtual QString shaderCodeLibraryPlatformDirectory() = 0;
+
+ static QString GetShaderCodeLibraryDirectory() { return QStringLiteral("res/effectlib"); }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h b/src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h
new file mode 100644
index 0000000..857dfa9
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderDynamicObjectSystemCommands.h
@@ -0,0 +1,622 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_EFFECT_SYSTEM_COMMANDS_H
+#define QT3DS_RENDER_EFFECT_SYSTEM_COMMANDS_H
+#include "Qt3DSRender.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSFlags.h"
+
+namespace qt3ds {
+namespace render {
+ namespace dynamic {
+ using qt3ds::render::NVRenderBufferBarrierFlags;
+
+ struct CommandTypes
+ {
+ enum Enum {
+ Unknown = 0,
+ AllocateBuffer,
+ BindTarget,
+ BindBuffer,
+ BindShader,
+ ApplyInstanceValue,
+ ApplyBufferValue,
+ // Apply the depth buffer as an input texture.
+ ApplyDepthValue,
+ Render, // Render to current FBO
+ ApplyBlending,
+ ApplyRenderState, // apply a render state
+ ApplyBlitFramebuffer,
+ ApplyValue,
+ DepthStencil,
+ AllocateImage,
+ ApplyImageValue,
+ AllocateDataBuffer,
+ ApplyDataBufferValue,
+ };
+ };
+
+#define QT3DS_RENDER_EFFECTS_ITERATE_COMMAND_TYPES \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(AllocateBuffer) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(BindTarget) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(BindBuffer) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(BindShader) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyInstanceValue) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyBufferValue) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyDepthValue) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(Render) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyBlending) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyRenderState) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyBlitFramebuffer) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyValue) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(DepthStencil) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(AllocateImage) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyImageValue) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(AllocateDataBuffer) \
+ QT3DS_RENDER_EFFECTS_HANDLE_COMMAND_TYPES(ApplyDataBufferValue)
+
+ // All commands need at least two constructors. One for when they are created that should
+ // setup all their member variables and one for when we are copying commands from an outside
+ // entity into the effect system. We have to re-register strings in that case because we
+ // can't assume the outside entity was using the same string table we are...
+ struct SCommand
+ {
+ CommandTypes::Enum m_Type;
+ SCommand(CommandTypes::Enum inType)
+ : m_Type(inType)
+ {
+ }
+ SCommand()
+ : m_Type(CommandTypes::Unknown)
+ {
+ }
+ // Implemented in UICRenderEffectSystem.cpp
+ static QT3DSU32 GetSizeofCommand(const SCommand &inCommand);
+ static void CopyConstructCommand(QT3DSU8 *inDataBuffer, const SCommand &inCommand,
+ IStringTable &inStrTable);
+ };
+
+ struct AllocateBufferFlagValues
+ {
+ enum Enum {
+ SceneLifetime = 1,
+ };
+ };
+
+ struct SAllocateBufferFlags : public NVFlags<AllocateBufferFlagValues::Enum, QT3DSU32>
+ {
+ SAllocateBufferFlags(QT3DSU32 inValues)
+ : NVFlags<AllocateBufferFlagValues::Enum, QT3DSU32>(inValues)
+ {
+ }
+ SAllocateBufferFlags() {}
+ void SetSceneLifetime(bool inValue)
+ {
+ clearOrSet(inValue, AllocateBufferFlagValues::SceneLifetime);
+ }
+ // If isSceneLifetime is unset the buffer is assumed to be frame lifetime and will be
+ // released after this render operation.
+ bool IsSceneLifetime() const
+ {
+ return this->operator&(AllocateBufferFlagValues::SceneLifetime);
+ }
+ };
+
+ struct SAllocateBuffer : public SCommand
+ {
+ CRegisteredString m_Name;
+ NVRenderTextureFormats::Enum m_Format;
+ NVRenderTextureMagnifyingOp::Enum m_FilterOp;
+ NVRenderTextureCoordOp::Enum m_TexCoordOp;
+ QT3DSF32 m_SizeMultiplier;
+ SAllocateBufferFlags m_BufferFlags;
+ SAllocateBuffer()
+ : SCommand(CommandTypes::AllocateBuffer)
+ , m_Format(NVRenderTextureFormats::RGBA8)
+ , m_FilterOp(NVRenderTextureMagnifyingOp::Linear)
+ , m_TexCoordOp(NVRenderTextureCoordOp::ClampToEdge)
+ , m_SizeMultiplier(1.0f)
+ {
+ }
+ SAllocateBuffer(CRegisteredString inName, NVRenderTextureFormats::Enum inFormat,
+ NVRenderTextureMagnifyingOp::Enum inFilterOp,
+ NVRenderTextureCoordOp::Enum inCoordOp, QT3DSF32 inMultiplier,
+ SAllocateBufferFlags inFlags)
+ : SCommand(CommandTypes::AllocateBuffer)
+ , m_Name(inName)
+ , m_Format(inFormat)
+ , m_FilterOp(inFilterOp)
+ , m_TexCoordOp(inCoordOp)
+ , m_SizeMultiplier(inMultiplier)
+ , m_BufferFlags(inFlags)
+ {
+ }
+ SAllocateBuffer(const SAllocateBuffer &inOther, IStringTable &inStrTable)
+ : SCommand(CommandTypes::AllocateBuffer)
+ , m_Name(inStrTable.RegisterStr(inOther.m_Name))
+ , m_Format(inOther.m_Format)
+ , m_FilterOp(inOther.m_FilterOp)
+ , m_TexCoordOp(inOther.m_TexCoordOp)
+ , m_SizeMultiplier(inOther.m_SizeMultiplier)
+ , m_BufferFlags(inOther.m_BufferFlags)
+ {
+ }
+ };
+
+ struct SAllocateImage : public SAllocateBuffer
+ {
+ NVRenderImageAccessType::Enum m_Access;
+
+ SAllocateImage()
+ : SAllocateBuffer()
+ , m_Access(NVRenderImageAccessType::ReadWrite)
+ {
+ m_Type = CommandTypes::AllocateImage;
+ }
+ SAllocateImage(CRegisteredString inName, NVRenderTextureFormats::Enum inFormat,
+ NVRenderTextureMagnifyingOp::Enum inFilterOp,
+ NVRenderTextureCoordOp::Enum inCoordOp, QT3DSF32 inMultiplier,
+ SAllocateBufferFlags inFlags, NVRenderImageAccessType::Enum inAccess)
+ : SAllocateBuffer(inName, inFormat, inFilterOp, inCoordOp, inMultiplier, inFlags)
+ , m_Access(inAccess)
+ {
+ m_Type = CommandTypes::AllocateImage;
+ }
+
+ SAllocateImage(const SAllocateImage &inOther, IStringTable &inStrTable)
+ : SAllocateBuffer(inStrTable.RegisterStr(inOther.m_Name), inOther.m_Format,
+ inOther.m_FilterOp, inOther.m_TexCoordOp,
+ inOther.m_SizeMultiplier, inOther.m_BufferFlags)
+ , m_Access(inOther.m_Access)
+ {
+ m_Type = CommandTypes::AllocateImage;
+ }
+ };
+
+ struct SAllocateDataBuffer : public SCommand
+ {
+ CRegisteredString m_Name;
+ NVRenderBufferBindValues::Enum m_DataBufferType;
+ CRegisteredString m_WrapName;
+ NVRenderBufferBindValues::Enum m_DataBufferWrapType;
+ QT3DSF32 m_Size;
+ SAllocateBufferFlags m_BufferFlags;
+
+ SAllocateDataBuffer()
+ : SCommand(CommandTypes::AllocateDataBuffer)
+ {
+ }
+
+ SAllocateDataBuffer(CRegisteredString inName,
+ NVRenderBufferBindValues::Enum inBufferType,
+ CRegisteredString inWrapName,
+ NVRenderBufferBindValues::Enum inBufferWrapType, QT3DSF32 inSize,
+ SAllocateBufferFlags inFlags)
+ : SCommand(CommandTypes::AllocateDataBuffer)
+ , m_Name(inName)
+ , m_DataBufferType(inBufferType)
+ , m_WrapName(inWrapName)
+ , m_DataBufferWrapType(inBufferWrapType)
+ , m_Size(inSize)
+ , m_BufferFlags(inFlags)
+ {
+ }
+
+ SAllocateDataBuffer(const SAllocateDataBuffer &inOther, IStringTable &inStrTable)
+ : SCommand(CommandTypes::AllocateDataBuffer)
+ , m_Name(inStrTable.RegisterStr(inOther.m_Name))
+ , m_DataBufferType(inOther.m_DataBufferType)
+ , m_WrapName(inStrTable.RegisterStr(inOther.m_WrapName))
+ , m_DataBufferWrapType(inOther.m_DataBufferWrapType)
+ , m_Size(inOther.m_Size)
+ , m_BufferFlags(inOther.m_BufferFlags)
+ {
+ }
+ };
+
+ struct SBindTarget : public SCommand
+ {
+ NVRenderTextureFormats::Enum m_OutputFormat;
+
+ SBindTarget(NVRenderTextureFormats::Enum inFormat = NVRenderTextureFormats::RGBA8)
+ : SCommand(CommandTypes::BindTarget)
+ , m_OutputFormat(inFormat)
+ {
+ }
+ SBindTarget(const SBindTarget &inOther, IStringTable &)
+ : SCommand(CommandTypes::BindTarget)
+ , m_OutputFormat(inOther.m_OutputFormat)
+ {
+ }
+ };
+
+ struct SBindBuffer : public SCommand
+ {
+ CRegisteredString m_BufferName;
+ bool m_NeedsClear;
+ SBindBuffer(CRegisteredString inBufName, bool inNeedsClear)
+ : SCommand(CommandTypes::BindBuffer)
+ , m_BufferName(inBufName)
+ , m_NeedsClear(inNeedsClear)
+ {
+ }
+ SBindBuffer(const SBindBuffer &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::BindBuffer)
+ , m_BufferName(inTable.RegisterStr(inOther.m_BufferName))
+ , m_NeedsClear(inOther.m_NeedsClear)
+ {
+ }
+ };
+
+ struct SBindShader : public SCommand
+ {
+ CRegisteredString m_ShaderPath;
+ // One GLSL file can hold multiple shaders in the case of multipass effects.
+ // This makes it significantly easier for authors to reason about the shader
+ // but it means we need to #define a preprocessor token to indicate which
+ // effect we intend to compile at this point.
+ CRegisteredString m_ShaderDefine;
+ SBindShader(CRegisteredString inShaderPath,
+ CRegisteredString inShaderDefine = CRegisteredString())
+ : SCommand(CommandTypes::BindShader)
+ , m_ShaderPath(inShaderPath)
+ , m_ShaderDefine(inShaderDefine)
+ {
+ }
+ SBindShader()
+ : SCommand(CommandTypes::BindShader)
+ {
+ }
+ SBindShader(const SBindShader &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::BindShader)
+ , m_ShaderPath(inTable.RegisterStr(inOther.m_ShaderPath))
+ , m_ShaderDefine(inTable.RegisterStr(inOther.m_ShaderDefine))
+ {
+ }
+ };
+
+ // The value sits immediately after the 'this' object
+ // in memory.
+ // If propertyName is not valid then we attempt to apply all of the effect property values
+ // to the shader, ignoring ones that don't match up.
+ struct SApplyInstanceValue : public SCommand
+ {
+ // Name of value to apply in shader
+ CRegisteredString m_PropertyName;
+ // type of value
+ NVRenderShaderDataTypes::Enum m_ValueType;
+ // offset in the effect data section of value.
+ QT3DSU32 m_ValueOffset;
+ SApplyInstanceValue(CRegisteredString inName, NVRenderShaderDataTypes::Enum inValueType,
+ QT3DSU32 inValueOffset)
+ : SCommand(CommandTypes::ApplyInstanceValue)
+ , m_PropertyName(inName)
+ , m_ValueType(inValueType)
+ , m_ValueOffset(inValueOffset)
+ {
+ }
+ // Default will attempt to apply all effect values to the currently bound shader
+ SApplyInstanceValue()
+ : SCommand(CommandTypes::ApplyInstanceValue)
+ , m_ValueType(NVRenderShaderDataTypes::Unknown)
+ , m_ValueOffset(0)
+ {
+ }
+ SApplyInstanceValue(const SApplyInstanceValue &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::ApplyInstanceValue)
+ , m_PropertyName(inTable.RegisterStr(inOther.m_PropertyName))
+ , m_ValueType(inOther.m_ValueType)
+ , m_ValueOffset(inOther.m_ValueOffset)
+ {
+ }
+ };
+
+ struct SApplyValue : public SCommand
+ {
+ CRegisteredString m_PropertyName;
+ NVRenderShaderDataTypes::Enum m_ValueType;
+ NVDataRef<QT3DSU8> m_Value;
+ SApplyValue(CRegisteredString inName, NVRenderShaderDataTypes::Enum inValueType)
+ : SCommand(CommandTypes::ApplyValue)
+ , m_PropertyName(inName)
+ , m_ValueType(inValueType)
+ {
+ }
+ // Default will attempt to apply all effect values to the currently bound shader
+ SApplyValue()
+ : SCommand(CommandTypes::ApplyValue)
+ , m_ValueType(NVRenderShaderDataTypes::Unknown)
+ {
+ }
+
+ SApplyValue(const SApplyValue &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::ApplyValue)
+ , m_PropertyName(inTable.RegisterStr(inOther.m_PropertyName))
+ , m_ValueType(inOther.m_ValueType)
+ , m_Value(inOther.m_Value)
+ {
+ }
+ };
+
+ // bind a buffer to a given shader parameter.
+ struct SApplyBufferValue : public SCommand
+ {
+ // If no buffer name is given then the special buffer [source]
+ // is assumed.
+ CRegisteredString m_BufferName;
+ // If no param name is given, the buffer is bound to the
+ // input texture parameter (texture0).
+ CRegisteredString m_ParamName;
+
+ SApplyBufferValue(CRegisteredString bufferName, CRegisteredString shaderParam)
+ : SCommand(CommandTypes::ApplyBufferValue)
+ , m_BufferName(bufferName)
+ , m_ParamName(shaderParam)
+ {
+ }
+ SApplyBufferValue(const SApplyBufferValue &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::ApplyBufferValue)
+ , m_BufferName(inTable.RegisterStr(inOther.m_BufferName))
+ , m_ParamName(inTable.RegisterStr(inOther.m_ParamName))
+ {
+ }
+ };
+
+ // bind a buffer to a given shader parameter.
+ struct SApplyImageValue : public SCommand
+ {
+ CRegisteredString m_ImageName; ///< name which the image was allocated
+ CRegisteredString m_ParamName; ///< must match the name in the shader
+ bool m_BindAsTexture; ///< bind image as texture
+ bool m_NeedSync; ///< if true we add a memory barrier before usage
+
+ SApplyImageValue(CRegisteredString bufferName, CRegisteredString shaderParam,
+ bool inBindAsTexture, bool inNeedSync)
+ : SCommand(CommandTypes::ApplyImageValue)
+ , m_ImageName(bufferName)
+ , m_ParamName(shaderParam)
+ , m_BindAsTexture(inBindAsTexture)
+ , m_NeedSync(inNeedSync)
+ {
+ }
+ SApplyImageValue(const SApplyImageValue &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::ApplyImageValue)
+ , m_ImageName(inTable.RegisterStr(inOther.m_ImageName))
+ , m_ParamName(inTable.RegisterStr(inOther.m_ParamName))
+ , m_BindAsTexture(inOther.m_BindAsTexture)
+ , m_NeedSync(inOther.m_NeedSync)
+ {
+ }
+ };
+
+ // bind a buffer to a given shader parameter.
+ struct SApplyDataBufferValue : public SCommand
+ {
+ CRegisteredString m_ParamName; ///< must match the name in the shader
+ NVRenderBufferBindValues::Enum m_BindAs; ///< to which target we bind this buffer
+
+ SApplyDataBufferValue(CRegisteredString inShaderParam,
+ NVRenderBufferBindValues::Enum inBufferType)
+ : SCommand(CommandTypes::ApplyDataBufferValue)
+ , m_ParamName(inShaderParam)
+ , m_BindAs(inBufferType)
+ {
+ }
+ SApplyDataBufferValue(const SApplyDataBufferValue &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::ApplyDataBufferValue)
+ , m_ParamName(inTable.RegisterStr(inOther.m_ParamName))
+ , m_BindAs(inOther.m_BindAs)
+ {
+ }
+ };
+
+ struct SApplyDepthValue : public SCommand
+ {
+ // If no param name is given, the buffer is bound to the
+ // input texture parameter (texture0).
+ CRegisteredString m_ParamName;
+ SApplyDepthValue(CRegisteredString param)
+ : SCommand(CommandTypes::ApplyDepthValue)
+ , m_ParamName(param)
+ {
+ }
+ SApplyDepthValue(const SApplyDepthValue &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::ApplyDepthValue)
+ , m_ParamName(inTable.RegisterStr(inOther.m_ParamName))
+ {
+ }
+ };
+
+ struct SRender : public SCommand
+ {
+ bool m_DrawIndirect;
+ SRender(bool inDrawIndirect)
+ : SCommand(CommandTypes::Render)
+ , m_DrawIndirect(inDrawIndirect)
+ {
+ }
+
+ SRender(const SRender &inOther, IStringTable &)
+ : SCommand(CommandTypes::Render)
+ , m_DrawIndirect(inOther.m_DrawIndirect)
+ {
+ }
+ };
+
+ struct SApplyBlending : public SCommand
+ {
+ NVRenderSrcBlendFunc::Enum m_SrcBlendFunc;
+ NVRenderDstBlendFunc::Enum m_DstBlendFunc;
+
+ SApplyBlending(NVRenderSrcBlendFunc::Enum inSrcBlendFunc,
+ NVRenderDstBlendFunc::Enum inDstBlendFunc)
+ : SCommand(CommandTypes::ApplyBlending)
+ , m_SrcBlendFunc(inSrcBlendFunc)
+ , m_DstBlendFunc(inDstBlendFunc)
+ {
+ }
+
+ SApplyBlending(const SApplyBlending &inOther, IStringTable &)
+ : SCommand(CommandTypes::ApplyBlending)
+ , m_SrcBlendFunc(inOther.m_SrcBlendFunc)
+ , m_DstBlendFunc(inOther.m_DstBlendFunc)
+ {
+ }
+ };
+
+ struct SApplyRenderState : public SCommand
+ {
+ NVRenderState::Enum m_RenderState;
+ bool m_Enabled;
+
+ SApplyRenderState(qt3ds::render::NVRenderState::Enum inRenderStateValue, bool inEnabled)
+ : SCommand(CommandTypes::ApplyRenderState)
+ , m_RenderState(inRenderStateValue)
+ , m_Enabled(inEnabled)
+ {
+ }
+
+ SApplyRenderState(const SApplyRenderState &inOther, IStringTable &)
+ : SCommand(CommandTypes::ApplyRenderState)
+ , m_RenderState(inOther.m_RenderState)
+ , m_Enabled(inOther.m_Enabled)
+ {
+ }
+ };
+
+ struct SApplyBlitFramebuffer : public SCommand
+ {
+ // If no buffer name is given then the special buffer [source]
+ // is assumed. Which is the default render target
+ CRegisteredString m_SourceBufferName;
+ // If no buffer name is given then the special buffer [dest]
+ // is assumed. Which is the default render target
+ CRegisteredString m_DestBufferName;
+
+ SApplyBlitFramebuffer(CRegisteredString inSourceBufferName,
+ CRegisteredString inDestBufferName)
+ : SCommand(CommandTypes::ApplyBlitFramebuffer)
+ , m_SourceBufferName(inSourceBufferName)
+ , m_DestBufferName(inDestBufferName)
+ {
+ }
+
+ SApplyBlitFramebuffer(const SApplyBlitFramebuffer &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::ApplyBlitFramebuffer)
+ , m_SourceBufferName(inTable.RegisterStr(inOther.m_SourceBufferName))
+ , m_DestBufferName(inTable.RegisterStr(inOther.m_DestBufferName))
+ {
+ }
+ };
+
+ struct DepthStencilFlagValues
+ {
+ enum Enum {
+ NoFlagValue = 0,
+ ClearStencil = 1 << 0,
+ ClearDepth = 1 << 1,
+ };
+ };
+
+ struct SDepthStencilFlags : public NVFlags<DepthStencilFlagValues::Enum>
+ {
+ bool HasClearStencil() const { return operator&(DepthStencilFlagValues::ClearStencil); }
+ void SetClearStencil(bool value)
+ {
+ clearOrSet(value, DepthStencilFlagValues::ClearStencil);
+ }
+
+ bool HasClearDepth() const { return operator&(DepthStencilFlagValues::ClearDepth); }
+ void SetClearDepth(bool value)
+ {
+ clearOrSet(value, DepthStencilFlagValues::ClearDepth);
+ }
+ };
+
+ struct SDepthStencil : public SCommand
+ {
+ CRegisteredString m_BufferName;
+ SDepthStencilFlags m_Flags;
+ qt3ds::render::NVRenderStencilOp::Enum m_StencilFailOperation;
+ qt3ds::render::NVRenderStencilOp::Enum m_DepthPassOperation;
+ qt3ds::render::NVRenderStencilOp::Enum m_DepthFailOperation;
+ qt3ds::render::NVRenderBoolOp::Enum m_StencilFunction;
+ QT3DSU32 m_Reference;
+ QT3DSU32 m_Mask;
+
+ SDepthStencil()
+ : SCommand(CommandTypes::DepthStencil)
+ , m_StencilFailOperation(qt3ds::render::NVRenderStencilOp::Keep)
+ , m_DepthPassOperation(qt3ds::render::NVRenderStencilOp::Keep)
+ , m_DepthFailOperation(qt3ds::render::NVRenderStencilOp::Keep)
+ , m_StencilFunction(qt3ds::render::NVRenderBoolOp::Equal)
+ , m_Reference(0)
+ , m_Mask(QT3DS_MAX_U32)
+ {
+ }
+
+ SDepthStencil(CRegisteredString bufName, SDepthStencilFlags flags,
+ qt3ds::render::NVRenderStencilOp::Enum inStencilOp,
+ qt3ds::render::NVRenderStencilOp::Enum inDepthPassOp,
+ qt3ds::render::NVRenderStencilOp::Enum inDepthFailOp,
+ qt3ds::render::NVRenderBoolOp::Enum inStencilFunc, QT3DSU32 value, QT3DSU32 mask)
+ : SCommand(CommandTypes::DepthStencil)
+ , m_BufferName(bufName)
+ , m_Flags(flags)
+ , m_StencilFailOperation(inStencilOp)
+ , m_DepthPassOperation(inDepthPassOp)
+ , m_DepthFailOperation(inDepthFailOp)
+ , m_StencilFunction(inStencilFunc)
+ , m_Reference(value)
+ , m_Mask(mask)
+ {
+ }
+
+ SDepthStencil(const SDepthStencil &inOther, IStringTable &inTable)
+ : SCommand(CommandTypes::DepthStencil)
+ , m_BufferName(inTable.RegisterStr(inOther.m_BufferName))
+ , m_Flags(inOther.m_Flags)
+ , m_StencilFailOperation(inOther.m_StencilFailOperation)
+ , m_DepthPassOperation(inOther.m_DepthPassOperation)
+ , m_DepthFailOperation(inOther.m_DepthFailOperation)
+ , m_StencilFunction(inOther.m_StencilFunction)
+ , m_Reference(inOther.m_Reference)
+ , m_Mask(inOther.m_Mask)
+ {
+ }
+ };
+ }
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderDynamicObjectSystemUtil.h b/src/runtimerender/Qt3DSRenderDynamicObjectSystemUtil.h
new file mode 100644
index 0000000..b00b996
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderDynamicObjectSystemUtil.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_DYNAMIC_OBJECT_SYSTEM_UTIL_H
+#define QT3DS_RENDER_DYNAMIC_OBJECT_SYSTEM_UTIL_H
+#include "Qt3DSRender.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "StringTools.h"
+
+namespace qt3ds {
+namespace render {
+ namespace dynamic {
+
+ struct SStringLoadRemapper
+ {
+ CStrTableOrDataRef m_StrData;
+ IStringTable &m_StringTable;
+ Qt3DSString m_PathMapper;
+ const char8_t *m_ProjectDir;
+ SStringLoadRemapper(NVAllocatorCallback &alloc, CStrTableOrDataRef inData,
+ const char8_t *inProjectDir, IStringTable &inStrTable)
+ : m_StrData(inData)
+ , m_StringTable(inStrTable)
+ , m_ProjectDir(inProjectDir)
+ {
+ Q_UNUSED(alloc)
+ }
+ void Remap(CRegisteredString &inStr) { inStr.Remap(m_StrData); }
+ };
+
+ struct SStringSaveRemapper
+ {
+ const qt3ds::render::SStrRemapMap &m_Map;
+ Qt3DSString m_RelativeBuffer;
+ Qt3DSString m_ProjectDir;
+ Qt3DSString m_FinalBuffer;
+ IStringTable &m_StringTable;
+ SStringSaveRemapper(NVAllocatorCallback &alloc, const qt3ds::render::SStrRemapMap &map,
+ const char8_t *inProjectDir, IStringTable &inStrTable)
+ : m_Map(map)
+ , m_StringTable(inStrTable)
+ {
+ Q_UNUSED(alloc)
+ m_ProjectDir.assign(inProjectDir);
+ }
+ void Remap(CRegisteredString &inStr) { inStr.Remap(m_Map); }
+ };
+
+ inline QT3DSU32 Align(QT3DSU32 inValue)
+ {
+ if (inValue % 4)
+ return inValue + (4 - (inValue % 4));
+ return inValue;
+ }
+
+ inline QT3DSU32 Align8(QT3DSU32 inValue)
+ {
+ if (inValue % 8)
+ return inValue + (8 - (inValue % 8));
+ return inValue;
+ }
+
+ inline qt3ds::QT3DSU32 getSizeofShaderDataType(NVRenderShaderDataTypes::Enum value)
+ {
+ using namespace qt3ds;
+ using namespace qt3ds::render;
+ switch (value) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(x) \
+ case NVRenderShaderDataTypes::x: \
+ return sizeof(x);
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ inline const char *GetShaderDatatypeName(NVRenderShaderDataTypes::Enum inValue)
+ {
+ switch (inValue) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(type) \
+ case NVRenderShaderDataTypes::type: \
+ return #type;
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return "";
+ }
+ }
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.cpp b/src/runtimerender/Qt3DSRenderEffectSystem.cpp
new file mode 100644
index 0000000..65f52a6
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderEffectSystem.cpp
@@ -0,0 +1,1872 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderEffectSystem.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSContainers.h"
+#include "StringTools.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSRenderEffect.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "Qt3DSRenderDynamicObjectSystemCommands.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderShaderConstant.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "foundation/PreAllocatedAllocator.h"
+#include "foundation/SerializationTypes.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSOffscreenRenderKey.h"
+#include "Qt3DSRenderDynamicObjectSystemUtil.h"
+
+using namespace qt3ds::render;
+using namespace qt3ds::render::dynamic;
+using qt3ds::render::NVRenderContextScopedProperty;
+using qt3ds::render::NVRenderCachedShaderProperty;
+using qt3ds::render::NVRenderCachedShaderBuffer;
+
+// None of this code will work if the size of void* changes because that would mean that
+// the alignment of some of the objects isn't 4 bytes but would be 8 bytes.
+
+typedef eastl::pair<CRegisteredString, CRegisteredString> TStrStrPair;
+
+namespace eastl {
+template <>
+struct hash<TStrStrPair>
+{
+ size_t operator()(const TStrStrPair &item) const
+ {
+ return hash<CRegisteredString>()(item.first) ^ hash<CRegisteredString>()(item.second);
+ }
+};
+}
+
+namespace {
+
+/*
+ ApplyBufferValue,
+ //Apply the depth buffer as an input texture.
+ ApplyDepthValue,
+ Render, //Render to current FBO
+ */
+
+struct SEffectClass
+{
+ NVAllocatorCallback *m_Allocator;
+ IDynamicObjectClass *m_DynamicClass;
+ volatile QT3DSI32 mRefCount;
+
+ SEffectClass(NVAllocatorCallback &inFnd, IDynamicObjectClass &dynClass)
+ : m_Allocator(&inFnd)
+ , m_DynamicClass(&dynClass)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(*m_Allocator)
+
+ void SetupThisObjectFromMemory(NVAllocatorCallback &inAlloc, IDynamicObjectClass &inClass)
+ {
+ m_Allocator = &inAlloc;
+ m_DynamicClass = &inClass;
+ mRefCount = 0;
+ }
+};
+
+struct SAllocatedBufferEntry
+{
+ CRegisteredString m_Name;
+ NVScopedRefCounted<NVRenderFrameBuffer> m_FrameBuffer;
+ NVScopedRefCounted<NVRenderTexture2D> m_Texture;
+ SAllocateBufferFlags m_Flags;
+ bool m_NeedsClear;
+
+ SAllocatedBufferEntry(CRegisteredString inName, NVRenderFrameBuffer &inFb,
+ NVRenderTexture2D &inTexture, SAllocateBufferFlags inFlags)
+ : m_Name(inName)
+ , m_FrameBuffer(&inFb)
+ , m_Texture(&inTexture)
+ , m_Flags(inFlags)
+ , m_NeedsClear(true)
+ {
+ }
+ SAllocatedBufferEntry() {}
+};
+
+struct SAllocatedImageEntry
+{
+ CRegisteredString m_Name;
+ NVScopedRefCounted<NVRenderImage2D> m_Image;
+ NVScopedRefCounted<NVRenderTexture2D> m_Texture;
+ SAllocateBufferFlags m_Flags;
+
+ SAllocatedImageEntry(CRegisteredString inName, NVRenderImage2D &inImage,
+ NVRenderTexture2D &inTexture, SAllocateBufferFlags inFlags)
+ : m_Name(inName)
+ , m_Image(&inImage)
+ , m_Texture(&inTexture)
+ , m_Flags(inFlags)
+ {
+ }
+ SAllocatedImageEntry() {}
+};
+
+struct SImageEntry
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ NVRenderCachedShaderProperty<NVRenderImage2D *> m_Image;
+ volatile QT3DSI32 mRefCount;
+
+ SImageEntry(NVRenderShaderProgram &inShader, const char *inImageName)
+ : m_Shader(inShader)
+ , m_Image(inImageName, inShader)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+
+ void Set(NVRenderImage2D *inImage) { m_Image.Set(inImage); }
+
+ static SImageEntry CreateImageEntry(NVRenderShaderProgram &inShader, const char *inStem)
+ {
+ return SImageEntry(inShader, inStem);
+ }
+};
+
+struct SAllocatedDataBufferEntry
+{
+ CRegisteredString m_Name;
+ NVScopedRefCounted<qt3ds::render::NVRenderDataBuffer> m_DataBuffer;
+ NVRenderBufferBindValues::Enum m_BufferType;
+ NVDataRef<QT3DSU8> m_BufferData;
+ SAllocateBufferFlags m_Flags;
+ bool m_NeedsClear;
+
+ SAllocatedDataBufferEntry(CRegisteredString inName,
+ qt3ds::render::NVRenderDataBuffer &inDataBuffer,
+ NVRenderBufferBindValues::Enum inType, NVDataRef<QT3DSU8> data,
+ SAllocateBufferFlags inFlags)
+ : m_Name(inName)
+ , m_DataBuffer(&inDataBuffer)
+ , m_BufferType(inType)
+ , m_BufferData(data)
+ , m_Flags(inFlags)
+ , m_NeedsClear(false)
+ {
+ }
+ SAllocatedDataBufferEntry() {}
+};
+
+struct SDataBufferEntry
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderBufferBase *> m_DataBuffer;
+ volatile QT3DSI32 mRefCount;
+
+ SDataBufferEntry(NVRenderShaderProgram &inShader, const char *inBufferName)
+ : m_Shader(inShader)
+ , m_DataBuffer(inBufferName, inShader)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+
+ void Set(qt3ds::render::NVRenderDataBuffer *inBuffer)
+ {
+ if (inBuffer)
+ inBuffer->Bind();
+
+ m_DataBuffer.Set();
+ }
+
+ static SDataBufferEntry CreateDataBufferEntry(NVRenderShaderProgram &inShader,
+ const char *inStem)
+ {
+ return SDataBufferEntry(inShader, inStem);
+ }
+};
+
+struct SEffectTextureData
+{
+ NVRenderTexture2D *m_Texture;
+ bool m_NeedsAlphaMultiply;
+ SEffectTextureData(NVRenderTexture2D *inTexture, bool inNeedsMultiply)
+ : m_Texture(inTexture)
+ , m_NeedsAlphaMultiply(inNeedsMultiply)
+ {
+ }
+ SEffectTextureData()
+ : m_Texture(NULL)
+ , m_NeedsAlphaMultiply(false)
+ {
+ }
+};
+
+struct STextureEntry
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Texture;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_TextureData;
+ NVRenderCachedShaderProperty<QT3DSI32> m_TextureFlags;
+ volatile QT3DSI32 mRefCount;
+
+ STextureEntry(NVRenderShaderProgram &inShader, const char *inTexName, const char *inDataName,
+ const char *inFlagName)
+ : m_Shader(inShader)
+ , m_Texture(inTexName, inShader)
+ , m_TextureData(inDataName, inShader)
+ , m_TextureFlags(inFlagName, inShader)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+
+ void Set(NVRenderTexture2D *inTexture, bool inNeedsAlphaMultiply,
+ const SPropertyDefinition *inDefinition)
+ {
+ QT3DSF32 theMixValue(inNeedsAlphaMultiply ? 0.0f : 1.0f);
+ if (inTexture && inDefinition) {
+ inTexture->SetMagFilter(inDefinition->m_MagFilterOp);
+ inTexture->SetMinFilter(
+ static_cast<NVRenderTextureMinifyingOp::Enum>(inDefinition->m_MagFilterOp));
+ inTexture->SetTextureWrapS(inDefinition->m_CoordOp);
+ inTexture->SetTextureWrapT(inDefinition->m_CoordOp);
+ }
+ m_Texture.Set(inTexture);
+ if (inTexture) {
+ STextureDetails theDetails(inTexture->GetTextureDetails());
+ m_TextureData.Set(
+ QT3DSVec4((QT3DSF32)theDetails.m_Width, (QT3DSF32)theDetails.m_Height, theMixValue, 0.0f));
+ // I have no idea what these flags do.
+ m_TextureFlags.Set(1);
+ } else
+ m_TextureFlags.Set(0);
+ }
+
+ static STextureEntry CreateTextureEntry(NVRenderShaderProgram &inShader, const char *inStem,
+ Qt3DSString &inBuilder, Qt3DSString &inBuilder2)
+ {
+ inBuilder.assign(inStem);
+ inBuilder.append("Info");
+ inBuilder2.assign("flag");
+ inBuilder2.append(inStem);
+ return STextureEntry(inShader, inStem, inBuilder.c_str(), inBuilder2.c_str());
+ }
+};
+
+typedef eastl::pair<CRegisteredString, NVScopedRefCounted<STextureEntry>> TNamedTextureEntry;
+typedef eastl::pair<CRegisteredString, NVScopedRefCounted<SImageEntry>> TNamedImageEntry;
+typedef eastl::pair<CRegisteredString, NVScopedRefCounted<SDataBufferEntry>> TNamedDataBufferEntry;
+}
+
+namespace qt3ds {
+namespace render {
+
+ struct SEffectContext
+ {
+ CRegisteredString m_ClassName;
+ IQt3DSRenderContext &m_Context;
+ IResourceManager *m_ResourceManager;
+ nvvector<SAllocatedBufferEntry> m_AllocatedBuffers;
+ nvvector<SAllocatedImageEntry> m_AllocatedImages;
+ nvvector<SAllocatedDataBufferEntry> m_AllocatedDataBuffers;
+ nvvector<TNamedTextureEntry> m_TextureEntries;
+ nvvector<TNamedImageEntry> m_ImageEntries;
+ nvvector<TNamedDataBufferEntry> m_DataBufferEntries;
+
+ SEffectContext(CRegisteredString inName, IQt3DSRenderContext &ctx, IResourceManager *inManager)
+ : m_ClassName(inName)
+ , m_Context(ctx)
+ , m_ResourceManager(inManager)
+ , m_AllocatedBuffers(ctx.GetAllocator(), "SEffectContext::m_AllocatedBuffers")
+ , m_AllocatedImages(ctx.GetAllocator(), "SEffectContext::m_AllocatedImages")
+ , m_AllocatedDataBuffers(ctx.GetAllocator(), "SEffectContext::m_AllocatedDataBuffers")
+ , m_TextureEntries(ctx.GetAllocator(), "SEffectContext::m_TextureEntries")
+ , m_ImageEntries(ctx.GetAllocator(), "SEffectContext::m_ImageEntries")
+ , m_DataBufferEntries(ctx.GetAllocator(), "SEffectContext::m_DataBufferEntries")
+ {
+ }
+
+ ~SEffectContext()
+ {
+ while (m_AllocatedBuffers.size())
+ ReleaseBuffer(0);
+
+ while (m_AllocatedImages.size())
+ ReleaseImage(0);
+
+ while (m_AllocatedDataBuffers.size())
+ ReleaseDataBuffer(0);
+ }
+
+ void ReleaseBuffer(QT3DSU32 inIdx)
+ {
+ SAllocatedBufferEntry &theEntry(m_AllocatedBuffers[inIdx]);
+ theEntry.m_FrameBuffer->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer());
+ m_ResourceManager->Release(*theEntry.m_FrameBuffer);
+ m_ResourceManager->Release(*theEntry.m_Texture);
+ m_AllocatedBuffers.replace_with_last(inIdx);
+ }
+
+ void ReleaseImage(QT3DSU32 inIdx)
+ {
+ SAllocatedImageEntry &theEntry(m_AllocatedImages[inIdx]);
+ m_ResourceManager->Release(*theEntry.m_Image);
+ m_ResourceManager->Release(*theEntry.m_Texture);
+ m_AllocatedImages.replace_with_last(inIdx);
+ }
+
+ void ReleaseDataBuffer(QT3DSU32 inIdx)
+ {
+ SAllocatedDataBufferEntry &theEntry(m_AllocatedDataBuffers[inIdx]);
+ m_Context.GetAllocator().deallocate(theEntry.m_BufferData.begin());
+
+ m_AllocatedDataBuffers.replace_with_last(inIdx);
+ }
+
+ QT3DSU32 FindBuffer(CRegisteredString inName)
+ {
+ for (QT3DSU32 idx = 0, end = m_AllocatedBuffers.size(); idx < end; ++idx)
+ if (m_AllocatedBuffers[idx].m_Name == inName)
+ return idx;
+ return m_AllocatedBuffers.size();
+ }
+
+ QT3DSU32 FindImage(CRegisteredString inName)
+ {
+ for (QT3DSU32 idx = 0, end = m_AllocatedImages.size(); idx < end; ++idx)
+ if (m_AllocatedImages[idx].m_Name == inName)
+ return idx;
+
+ return m_AllocatedImages.size();
+ }
+
+ QT3DSU32 FindDataBuffer(CRegisteredString inName)
+ {
+ for (QT3DSU32 idx = 0, end = m_AllocatedDataBuffers.size(); idx < end; ++idx) {
+ if (m_AllocatedDataBuffers[idx].m_Name == inName)
+ return idx;
+ }
+
+ return m_AllocatedDataBuffers.size();
+ }
+
+ void SetTexture(NVRenderShaderProgram &inShader, CRegisteredString inPropName,
+ NVRenderTexture2D *inTexture, bool inNeedsMultiply,
+ Qt3DSString &inStringBuilder, Qt3DSString &inStringBuilder2,
+ const SPropertyDefinition *inPropDec = NULL)
+ {
+ STextureEntry *theTextureEntry(NULL);
+ for (QT3DSU32 idx = 0, end = m_TextureEntries.size(); idx < end && theTextureEntry == NULL;
+ ++idx) {
+ if (m_TextureEntries[idx].first == inPropName
+ && m_TextureEntries[idx].second->m_Shader.mPtr == &inShader)
+ theTextureEntry = m_TextureEntries[idx].second;
+ }
+ if (theTextureEntry == NULL) {
+ NVScopedRefCounted<STextureEntry> theNewEntry = QT3DS_NEW(
+ m_Context.GetAllocator(), STextureEntry)(STextureEntry::CreateTextureEntry(
+ inShader, inPropName, inStringBuilder, inStringBuilder2));
+ m_TextureEntries.push_back(eastl::make_pair(inPropName, theNewEntry));
+ theTextureEntry = theNewEntry.mPtr;
+ }
+ theTextureEntry->Set(inTexture, inNeedsMultiply, inPropDec);
+ }
+
+ void SetImage(NVRenderShaderProgram &inShader, CRegisteredString inPropName,
+ NVRenderImage2D *inImage)
+ {
+ SImageEntry *theImageEntry(NULL);
+ for (QT3DSU32 idx = 0, end = m_ImageEntries.size(); idx < end && theImageEntry == NULL;
+ ++idx) {
+ if (m_ImageEntries[idx].first == inPropName
+ && m_ImageEntries[idx].second->m_Shader.mPtr == &inShader)
+ theImageEntry = m_ImageEntries[idx].second;
+ }
+ if (theImageEntry == NULL) {
+ NVScopedRefCounted<SImageEntry> theNewEntry =
+ QT3DS_NEW(m_Context.GetAllocator(),
+ SImageEntry)(SImageEntry::CreateImageEntry(inShader, inPropName));
+ m_ImageEntries.push_back(eastl::make_pair(inPropName, theNewEntry));
+ theImageEntry = theNewEntry.mPtr;
+ }
+
+ theImageEntry->Set(inImage);
+ }
+
+ void SetDataBuffer(NVRenderShaderProgram &inShader, CRegisteredString inPropName,
+ qt3ds::render::NVRenderDataBuffer *inBuffer)
+ {
+ SDataBufferEntry *theDataBufferEntry(NULL);
+ for (QT3DSU32 idx = 0, end = m_DataBufferEntries.size();
+ idx < end && theDataBufferEntry == NULL; ++idx) {
+ if (m_DataBufferEntries[idx].first == inPropName
+ && m_DataBufferEntries[idx].second->m_Shader.mPtr == &inShader)
+ theDataBufferEntry = m_DataBufferEntries[idx].second;
+ }
+ if (theDataBufferEntry == NULL) {
+ NVScopedRefCounted<SDataBufferEntry> theNewEntry =
+ QT3DS_NEW(m_Context.GetAllocator(), SDataBufferEntry)(
+ SDataBufferEntry::CreateDataBufferEntry(inShader, inPropName));
+ m_DataBufferEntries.push_back(eastl::make_pair(inPropName, theNewEntry));
+ theDataBufferEntry = theNewEntry.mPtr;
+ }
+
+ theDataBufferEntry->Set(inBuffer);
+ }
+ };
+}
+}
+
+namespace {
+
+using qt3ds::render::NVRenderCachedShaderProperty;
+/* We setup some shared state on the effect shaders */
+struct SEffectShader
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_MVP;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_FragColorAlphaSettings;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_DestSize;
+ NVRenderCachedShaderProperty<QT3DSF32> m_AppFrame;
+ NVRenderCachedShaderProperty<QT3DSF32> m_FPS;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraClipRange;
+ STextureEntry m_TextureEntry;
+ volatile QT3DSI32 mRefCount;
+ SEffectShader(NVRenderShaderProgram &inShader)
+ : m_Shader(inShader)
+ , m_MVP("ModelViewProjectionMatrix", inShader)
+ , m_FragColorAlphaSettings("FragColorAlphaSettings", inShader)
+ , m_DestSize("DestSize", inShader)
+ , m_AppFrame("AppFrame", inShader)
+ , m_FPS("FPS", inShader)
+ , m_CameraClipRange("CameraClipRange", inShader)
+ , m_TextureEntry(inShader, "Texture0", "Texture0Info", "Texture0Flags")
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+};
+
+struct SEffectSystem : public IEffectSystem
+{
+ typedef nvhash_map<CRegisteredString, char8_t *> TPathDataMap;
+ typedef nvhash_set<CRegisteredString> TPathSet;
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<SEffectClass>> TEffectClassMap;
+ typedef nvhash_map<TStrStrPair, NVScopedRefCounted<SEffectShader>> TShaderMap;
+ typedef nvvector<SEffectContext *> TContextList;
+
+ IQt3DSRenderContextCore &m_CoreContext;
+ IQt3DSRenderContext *m_Context;
+ NVScopedRefCounted<IResourceManager> m_ResourceManager;
+ mutable qt3ds::render::SPreAllocatedAllocator m_Allocator;
+ // Keep from dual-including headers.
+ TEffectClassMap m_EffectClasses;
+ nvvector<CRegisteredString> m_EffectList;
+ TContextList m_Contexts;
+ Qt3DSString m_TextureStringBuilder;
+ Qt3DSString m_TextureStringBuilder2;
+ TShaderMap m_ShaderMap;
+ NVScopedRefCounted<NVRenderDepthStencilState> m_DefaultStencilState;
+ nvvector<NVScopedRefCounted<NVRenderDepthStencilState>> m_DepthStencilStates;
+ volatile QT3DSI32 mRefCount;
+
+ SEffectSystem(IQt3DSRenderContextCore &inContext)
+ : m_CoreContext(inContext)
+ , m_Context(NULL)
+ , m_Allocator(inContext.GetAllocator())
+ , m_EffectClasses(inContext.GetAllocator(), "SEffectSystem::m_EffectClasses")
+ , m_EffectList(inContext.GetAllocator(), "SEffectSystem::m_EffectList")
+ , m_Contexts(inContext.GetAllocator(), "SEffectSystem::m_Contexts")
+ , m_ShaderMap(inContext.GetAllocator(), "SEffectSystem::m_ShaderMap")
+ , m_DepthStencilStates(inContext.GetAllocator(), "SEffectSystem::m_DepthStencilStates")
+ , mRefCount(0)
+ {
+ }
+
+ ~SEffectSystem()
+ {
+ for (QT3DSU32 idx = 0, end = m_Contexts.size(); idx < end; ++idx)
+ NVDelete(m_Allocator, m_Contexts[idx]);
+ m_Contexts.clear();
+ }
+
+ SEffectContext &GetEffectContext(SEffect &inEffect)
+ {
+ if (inEffect.m_Context == NULL) {
+ inEffect.m_Context =
+ QT3DS_NEW(m_Allocator, SEffectContext)(inEffect.m_ClassName,
+ *m_Context, m_ResourceManager);
+ m_Contexts.push_back(inEffect.m_Context);
+ }
+ return *inEffect.m_Context;
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_CoreContext.GetAllocator());
+
+ SEffectClass *GetEffectClass(CRegisteredString inStr)
+ {
+ TEffectClassMap::iterator theIter = m_EffectClasses.find(inStr);
+ if (theIter != m_EffectClasses.end())
+ return theIter->second;
+ return NULL;
+ }
+ const SEffectClass *GetEffectClass(CRegisteredString inStr) const
+ {
+ return const_cast<SEffectSystem *>(this)->GetEffectClass(inStr);
+ }
+
+ bool IsEffectRegistered(CRegisteredString inStr) override
+ {
+ return GetEffectClass(inStr) != NULL;
+ }
+ NVConstDataRef<CRegisteredString> GetRegisteredEffects() override
+ {
+ m_EffectList.clear();
+ for (TEffectClassMap::iterator theIter = m_EffectClasses.begin(),
+ theEnd = m_EffectClasses.end();
+ theIter != theEnd; ++theIter)
+ m_EffectList.push_back(theIter->first);
+ return m_EffectList;
+ }
+
+ // Registers an effect that runs via a single GLSL file.
+ bool RegisterGLSLEffect(CRegisteredString inName, const char8_t *inPathToEffect,
+ NVConstDataRef<SPropertyDeclaration> inProperties) override
+ {
+ if (IsEffectRegistered(inName))
+ return false;
+
+ m_CoreContext.GetDynamicObjectSystemCore().Register(inName, inProperties, sizeof(SEffect),
+ GraphObjectTypes::Effect);
+ IDynamicObjectClass &theClass =
+ *m_CoreContext.GetDynamicObjectSystemCore().GetDynamicObjectClass(inName);
+
+ SEffectClass *theEffect = QT3DS_NEW(m_Allocator, SEffectClass)(m_Allocator, theClass);
+ m_EffectClasses.insert(eastl::make_pair(inName, theEffect));
+
+ // Setup the commands required to run this effect
+ StaticAssert<(sizeof(SBindShader) % 4 == 0)>::valid_expression();
+ StaticAssert<(sizeof(SApplyInstanceValue) % 4 == 0)>::valid_expression();
+ StaticAssert<(sizeof(SRender) % 4 == 0)>::valid_expression();
+
+ QT3DSU32 commandAllocationSize = sizeof(SBindTarget);
+ commandAllocationSize += sizeof(SBindShader);
+ commandAllocationSize += sizeof(SApplyInstanceValue) * inProperties.size();
+ commandAllocationSize += sizeof(SRender);
+
+ QT3DSU32 commandCount = 3 + inProperties.size();
+ QT3DSU32 commandPtrAllocationSize = commandCount * sizeof(SCommand *);
+ QT3DSU32 allocationSize = Align8(commandAllocationSize) + commandPtrAllocationSize;
+ QT3DSU8 *startBuffer =
+ (QT3DSU8 *)m_Allocator.allocate(allocationSize, "dynamic::SCommand", __FILE__, __LINE__);
+ QT3DSU8 *dataBuffer = startBuffer;
+ // Setup the command buffer such that the ptrs to the commands and the commands themselves
+ // are
+ // all in the same block of memory. This enables quicker iteration (trivially quicker, most
+ // likely)
+ // but it also enables simpler memory management (single free).
+ // Furthermore, for a single glsl file the effect properties map precisely into the
+ // glsl file itself.
+ SCommand **theFirstCommandPtr =
+ (reinterpret_cast<SCommand **>(dataBuffer + Align8(commandAllocationSize)));
+ SCommand **theCommandPtr = theFirstCommandPtr;
+ memZero(dataBuffer, commandAllocationSize);
+
+ new (dataBuffer) SBindTarget();
+ *theCommandPtr = (SCommand *)dataBuffer;
+ ++theCommandPtr;
+ dataBuffer += sizeof(SBindTarget);
+
+ new (dataBuffer) SBindShader(m_CoreContext.GetStringTable().RegisterStr(inPathToEffect));
+ *theCommandPtr = (SCommand *)dataBuffer;
+ ++theCommandPtr;
+ dataBuffer += sizeof(SBindShader);
+
+ for (QT3DSU32 idx = 0, end = inProperties.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(
+ theEffect->m_DynamicClass->GetProperties()[idx]);
+ new (dataBuffer) SApplyInstanceValue(theDefinition.m_Name, theDefinition.m_DataType,
+ theDefinition.m_Offset);
+ *theCommandPtr = (SCommand *)dataBuffer;
+ ++theCommandPtr;
+ dataBuffer += sizeof(SApplyInstanceValue);
+ }
+ new (dataBuffer) SRender(false);
+ *theCommandPtr = (SCommand *)dataBuffer;
+ ++theCommandPtr;
+ dataBuffer += sizeof(SRender);
+ // Ensure we end up *exactly* where we expected to.
+ QT3DS_ASSERT(dataBuffer == startBuffer + commandAllocationSize);
+ QT3DS_ASSERT(theCommandPtr - theFirstCommandPtr == (int)inProperties.size() + 3);
+ m_CoreContext.GetDynamicObjectSystemCore().SetRenderCommands(
+ inName, NVConstDataRef<SCommand *>(theFirstCommandPtr, commandCount));
+ m_Allocator.deallocate(startBuffer);
+ return true;
+ }
+
+ void SetEffectPropertyDefaultValue(CRegisteredString inName,
+ CRegisteredString inPropName,
+ NVConstDataRef<QT3DSU8> inDefaultData) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetPropertyDefaultValue(inName, inPropName,
+ inDefaultData);
+ }
+
+ void SetEffectPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName,
+ NVConstDataRef<CRegisteredString> inNames) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetPropertyEnumNames(inName, inPropName,
+ inNames);
+ }
+
+ bool RegisterEffect(CRegisteredString inName,
+ NVConstDataRef<SPropertyDeclaration> inProperties) override
+ {
+ if (IsEffectRegistered(inName))
+ return false;
+ m_CoreContext.GetDynamicObjectSystemCore().Register(inName, inProperties, sizeof(SEffect),
+ GraphObjectTypes::Effect);
+ IDynamicObjectClass &theClass =
+ *m_CoreContext.GetDynamicObjectSystemCore().GetDynamicObjectClass(inName);
+ SEffectClass *theEffect = QT3DS_NEW(m_Allocator, SEffectClass)(m_Allocator, theClass);
+ m_EffectClasses.insert(eastl::make_pair(inName, theEffect));
+ return true;
+ }
+
+ bool UnregisterEffect(CRegisteredString inName) override
+ {
+ if (!IsEffectRegistered(inName))
+ return false;
+
+ m_CoreContext.GetDynamicObjectSystemCore().Unregister(inName);
+
+ TEffectClassMap::iterator iter = m_EffectClasses.find(inName);
+ if (iter != m_EffectClasses.end())
+ m_EffectClasses.erase(iter);
+
+ for (QT3DSU32 idx = 0, end = m_Contexts.size(); idx < end; ++idx) {
+ if (m_Contexts[idx]->m_ClassName == inName)
+ ReleaseEffectContext(m_Contexts[idx]);
+ }
+ return true;
+ }
+
+ virtual NVConstDataRef<CRegisteredString>
+ GetEffectPropertyEnumNames(CRegisteredString inName, CRegisteredString inPropName) const override
+ {
+ const SEffectClass *theClass = GetEffectClass(inName);
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ NVConstDataRef<CRegisteredString>();
+ }
+ const SPropertyDefinition *theDefinitionPtr =
+ theClass->m_DynamicClass->FindPropertyByName(inPropName);
+ if (theDefinitionPtr)
+ return theDefinitionPtr->m_EnumValueNames;
+ return NVConstDataRef<CRegisteredString>();
+ }
+
+ virtual NVConstDataRef<SPropertyDefinition>
+ GetEffectProperties(CRegisteredString inEffectName) const override
+ {
+ const SEffectClass *theClass = GetEffectClass(inEffectName);
+ if (theClass)
+ return theClass->m_DynamicClass->GetProperties();
+ return NVConstDataRef<SPropertyDefinition>();
+ }
+
+ void SetEffectPropertyTextureSettings(CRegisteredString inName,
+ CRegisteredString inPropName,
+ CRegisteredString inPropPath,
+ NVRenderTextureTypeValue::Enum inTexType,
+ NVRenderTextureCoordOp::Enum inCoordOp,
+ NVRenderTextureMagnifyingOp::Enum inMagFilterOp,
+ NVRenderTextureMinifyingOp::Enum inMinFilterOp) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetPropertyTextureSettings(
+ inName, inPropName, inPropPath, inTexType, inCoordOp, inMagFilterOp, inMinFilterOp);
+ }
+
+ void SetEffectRequiresDepthTexture(CRegisteredString inEffectName, bool inValue) override
+ {
+ SEffectClass *theClass = GetEffectClass(inEffectName);
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ theClass->m_DynamicClass->SetRequiresDepthTexture(inValue);
+ }
+
+ bool DoesEffectRequireDepthTexture(CRegisteredString inEffectName) const override
+ {
+ const SEffectClass *theClass = GetEffectClass(inEffectName);
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ return theClass->m_DynamicClass->RequiresDepthTexture();
+ }
+
+ void SetEffectRequiresCompilation(CRegisteredString inEffectName, bool inValue) override
+ {
+ SEffectClass *theClass = GetEffectClass(inEffectName);
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ theClass->m_DynamicClass->SetRequiresCompilation(inValue);
+ }
+
+ bool DoesEffectRequireCompilation(CRegisteredString inEffectName) const override
+ {
+ const SEffectClass *theClass = GetEffectClass(inEffectName);
+ if (theClass == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ return theClass->m_DynamicClass->RequiresCompilation();
+ }
+
+ void SetEffectCommands(CRegisteredString inEffectName,
+ NVConstDataRef<dynamic::SCommand *> inCommands) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetRenderCommands(inEffectName, inCommands);
+ }
+
+ virtual NVConstDataRef<dynamic::SCommand *>
+ GetEffectCommands(CRegisteredString inEffectName) const override
+ {
+ return m_CoreContext.GetDynamicObjectSystemCore().GetRenderCommands(inEffectName);
+ }
+
+ SEffect *CreateEffectInstance(CRegisteredString inEffectName,
+ NVAllocatorCallback &inSceneGraphAllocator) override
+ {
+ SEffectClass *theClass = GetEffectClass(inEffectName);
+ if (theClass == NULL)
+ return NULL;
+ StaticAssert<(sizeof(SEffect) % 4 == 0)>::valid_expression();
+
+ SEffect *theEffect = (SEffect *)m_CoreContext.GetDynamicObjectSystemCore().CreateInstance(
+ inEffectName, inSceneGraphAllocator);
+ theEffect->Initialize();
+ return theEffect;
+ }
+
+ void AllocateBuffer(SEffect &inEffect, const SAllocateBuffer &inCommand, QT3DSU32 inFinalWidth,
+ QT3DSU32 inFinalHeight, NVRenderTextureFormats::Enum inSourceTextureFormat)
+ {
+ // Check to see if it is already allocated and if it is, is it the correct size. If both of
+ // these assumptions hold, then we are good.
+ NVRenderTexture2D *theBufferTexture = NULL;
+ QT3DSU32 theWidth =
+ ITextRenderer::NextMultipleOf4((QT3DSU32)(inFinalWidth * inCommand.m_SizeMultiplier));
+ QT3DSU32 theHeight =
+ ITextRenderer::NextMultipleOf4((QT3DSU32)(inFinalHeight * inCommand.m_SizeMultiplier));
+ NVRenderTextureFormats::Enum resultFormat = inCommand.m_Format;
+ if (resultFormat == NVRenderTextureFormats::Unknown)
+ resultFormat = inSourceTextureFormat;
+
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ // size intentionally requiried every loop;
+ QT3DSU32 bufferIdx = theContext.FindBuffer(inCommand.m_Name);
+ if (bufferIdx < theContext.m_AllocatedBuffers.size()) {
+ SAllocatedBufferEntry &theEntry(theContext.m_AllocatedBuffers[bufferIdx]);
+ STextureDetails theDetails = theEntry.m_Texture->GetTextureDetails();
+ if (theDetails.m_Width == theWidth && theDetails.m_Height == theHeight
+ && theDetails.m_Format == resultFormat) {
+ theBufferTexture = theEntry.m_Texture;
+ } else {
+ theContext.ReleaseBuffer(bufferIdx);
+ }
+ }
+ }
+ if (theBufferTexture == NULL) {
+ SEffectContext &theContext(GetEffectContext(inEffect));
+ NVRenderFrameBuffer *theFB(m_ResourceManager->AllocateFrameBuffer());
+ NVRenderTexture2D *theTexture(
+ m_ResourceManager->AllocateTexture2D(theWidth, theHeight, resultFormat));
+ theTexture->SetMagFilter(inCommand.m_FilterOp);
+ theTexture->SetMinFilter(
+ static_cast<NVRenderTextureMinifyingOp::Enum>(inCommand.m_FilterOp));
+ theTexture->SetTextureWrapS(inCommand.m_TexCoordOp);
+ theTexture->SetTextureWrapT(inCommand.m_TexCoordOp);
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0, *theTexture);
+ theContext.m_AllocatedBuffers.push_back(SAllocatedBufferEntry(
+ inCommand.m_Name, *theFB, *theTexture, inCommand.m_BufferFlags));
+ theBufferTexture = theTexture;
+ }
+ }
+
+ void AllocateImage(SEffect &inEffect, const SAllocateImage &inCommand, QT3DSU32 inFinalWidth,
+ QT3DSU32 inFinalHeight)
+ {
+ NVRenderImage2D *theImage = NULL;
+ QT3DSU32 theWidth =
+ ITextRenderer::NextMultipleOf4((QT3DSU32)(inFinalWidth * inCommand.m_SizeMultiplier));
+ QT3DSU32 theHeight =
+ ITextRenderer::NextMultipleOf4((QT3DSU32)(inFinalHeight * inCommand.m_SizeMultiplier));
+
+ QT3DS_ASSERT(inCommand.m_Format != NVRenderTextureFormats::Unknown);
+
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ // size intentionally requiried every loop;
+ QT3DSU32 imageIdx = theContext.FindImage(inCommand.m_Name);
+ if (imageIdx < theContext.m_AllocatedImages.size()) {
+ SAllocatedImageEntry &theEntry(theContext.m_AllocatedImages[imageIdx]);
+ STextureDetails theDetails = theEntry.m_Texture->GetTextureDetails();
+ if (theDetails.m_Width == theWidth && theDetails.m_Height == theHeight
+ && theDetails.m_Format == inCommand.m_Format) {
+ theImage = theEntry.m_Image;
+ } else {
+ theContext.ReleaseImage(imageIdx);
+ }
+ }
+ }
+
+ if (theImage == NULL) {
+ SEffectContext &theContext(GetEffectContext(inEffect));
+ // allocate an immutable texture
+ NVRenderTexture2D *theTexture(m_ResourceManager->AllocateTexture2D(
+ theWidth, theHeight, inCommand.m_Format, 1, true));
+ theTexture->SetMagFilter(inCommand.m_FilterOp);
+ theTexture->SetMinFilter(
+ static_cast<NVRenderTextureMinifyingOp::Enum>(inCommand.m_FilterOp));
+ theTexture->SetTextureWrapS(inCommand.m_TexCoordOp);
+ theTexture->SetTextureWrapT(inCommand.m_TexCoordOp);
+ NVRenderImage2D *theImage =
+ (m_ResourceManager->AllocateImage2D(theTexture, inCommand.m_Access));
+ theContext.m_AllocatedImages.push_back(SAllocatedImageEntry(
+ inCommand.m_Name, *theImage, *theTexture, inCommand.m_BufferFlags));
+ }
+ }
+
+ void AllocateDataBuffer(SEffect &inEffect, const SAllocateDataBuffer &inCommand)
+ {
+ QT3DSU32 theBufferSize = (QT3DSU32)inCommand.m_Size;
+ QT3DS_ASSERT(theBufferSize);
+ qt3ds::render::NVRenderDataBuffer *theDataBuffer = NULL;
+ qt3ds::render::NVRenderDataBuffer *theDataWrapBuffer = NULL;
+
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ // size intentionally requiried every loop;
+ QT3DSU32 bufferIdx = theContext.FindDataBuffer(inCommand.m_Name);
+ if (bufferIdx < theContext.m_AllocatedDataBuffers.size()) {
+ SAllocatedDataBufferEntry &theEntry(theContext.m_AllocatedDataBuffers[bufferIdx]);
+ if (theEntry.m_BufferType == inCommand.m_DataBufferType
+ && theEntry.m_BufferData.size() == theBufferSize) {
+ theDataBuffer = theEntry.m_DataBuffer;
+ } else {
+ // if type and size don't match something is wrong
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ if (theDataBuffer == NULL) {
+ SEffectContext &theContext(GetEffectContext(inEffect));
+ NVRenderContext &theRenderContext(m_Context->GetRenderContext());
+ QT3DSU8 *initialData = (QT3DSU8 *)theContext.m_Context.GetAllocator().allocate(
+ theBufferSize, "SEffectContext::AllocateDataBuffer", __FILE__, __LINE__);
+ NVDataRef<QT3DSU8> data((QT3DSU8 *)initialData, theBufferSize);
+ memset(initialData, 0x0L, theBufferSize);
+ if (inCommand.m_DataBufferType == NVRenderBufferBindValues::Storage) {
+ theDataBuffer = theRenderContext.CreateStorageBuffer(
+ inCommand.m_Name, qt3ds::render::NVRenderBufferUsageType::Dynamic, theBufferSize,
+ data, NULL);
+ } else if (inCommand.m_DataBufferType == NVRenderBufferBindValues::Draw_Indirect) {
+ QT3DS_ASSERT(theBufferSize == sizeof(qt3ds::render::DrawArraysIndirectCommand));
+ // init a draw call
+ QT3DSU32 *pIndirectDrawCall = (QT3DSU32 *)initialData;
+ // vertex count we draw points right now only
+ // the rest we fill in by GPU
+ pIndirectDrawCall[0] = 1;
+ theDataBuffer = theRenderContext.CreateDrawIndirectBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Dynamic, theBufferSize, data);
+ } else
+ QT3DS_ASSERT(false);
+
+ theContext.m_AllocatedDataBuffers.push_back(SAllocatedDataBufferEntry(
+ inCommand.m_Name, *theDataBuffer, inCommand.m_DataBufferType, data,
+ inCommand.m_BufferFlags));
+
+ // create wrapper buffer
+ if (inCommand.m_DataBufferWrapType == NVRenderBufferBindValues::Storage
+ && inCommand.m_WrapName && theDataBuffer) {
+ theDataWrapBuffer = theRenderContext.CreateStorageBuffer(
+ inCommand.m_WrapName, qt3ds::render::NVRenderBufferUsageType::Dynamic,
+ theBufferSize, data, theDataBuffer);
+ theContext.m_AllocatedDataBuffers.push_back(SAllocatedDataBufferEntry(
+ inCommand.m_WrapName, *theDataWrapBuffer, inCommand.m_DataBufferWrapType,
+ NVDataRef<QT3DSU8>(), inCommand.m_BufferFlags));
+ }
+ }
+ }
+
+ NVRenderTexture2D *FindTexture(SEffect &inEffect, CRegisteredString inName)
+ {
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ QT3DSU32 bufferIdx = theContext.FindBuffer(inName);
+ if (bufferIdx < theContext.m_AllocatedBuffers.size()) {
+ return theContext.m_AllocatedBuffers[bufferIdx].m_Texture;
+ }
+ }
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ NVRenderFrameBuffer *BindBuffer(SEffect &inEffect, const SBindBuffer &inCommand,
+ QT3DSMat44 &outMVP, QT3DSVec2 &outDestSize)
+ {
+ NVRenderFrameBuffer *theBuffer = NULL;
+ NVRenderTexture2D *theTexture = NULL;
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ QT3DSU32 bufferIdx = theContext.FindBuffer(inCommand.m_BufferName);
+ if (bufferIdx < theContext.m_AllocatedBuffers.size()) {
+ theBuffer = theContext.m_AllocatedBuffers[bufferIdx].m_FrameBuffer;
+ theTexture = theContext.m_AllocatedBuffers[bufferIdx].m_Texture;
+ theContext.m_AllocatedBuffers[bufferIdx].m_NeedsClear = false;
+ }
+ }
+ if (theBuffer == NULL) {
+ qCCritical(INVALID_OPERATION, "Effect %s: Failed to find buffer %s for bind",
+ inEffect.m_ClassName.c_str(), inCommand.m_BufferName.c_str());
+ QString errorMsg = QObject::tr("Failed to compile \"%1\" effect.\nConsider"
+ " removing it from the presentation.")
+ .arg(inEffect.m_ClassName.c_str());
+ QT3DS_ALWAYS_ASSERT_MESSAGE(errorMsg.toUtf8());
+ outMVP = QT3DSMat44::createIdentity();
+ return NULL;
+ }
+
+ if (theTexture) {
+ SCamera::SetupOrthographicCameraForOffscreenRender(*theTexture, outMVP);
+ STextureDetails theDetails(theTexture->GetTextureDetails());
+ m_Context->GetRenderContext().SetViewport(
+ NVRenderRect(0, 0, (QT3DSU32)theDetails.m_Width, (QT3DSU32)theDetails.m_Height));
+ outDestSize = QT3DSVec2((QT3DSF32)theDetails.m_Width, (QT3DSF32)theDetails.m_Height);
+ }
+
+ return theBuffer;
+ }
+
+ SEffectShader *BindShader(CRegisteredString &inEffectId, const SBindShader &inCommand)
+ {
+ SEffectClass *theClass = GetEffectClass(inEffectId);
+ if (!theClass) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ bool forceCompilation = theClass->m_DynamicClass->RequiresCompilation();
+
+ eastl::pair<const TStrStrPair, NVScopedRefCounted<SEffectShader>> theInserter(
+ TStrStrPair(inCommand.m_ShaderPath, inCommand.m_ShaderDefine),
+ NVScopedRefCounted<SEffectShader>());
+ eastl::pair<TShaderMap::iterator, bool> theInsertResult(m_ShaderMap.insert(theInserter));
+
+ if (theInsertResult.second || forceCompilation) {
+ NVRenderShaderProgram *theProgram =
+ m_Context->GetDynamicObjectSystem()
+ .GetShaderProgram(inCommand.m_ShaderPath, inCommand.m_ShaderDefine,
+ TShaderFeatureSet(), SDynamicShaderProgramFlags(),
+ forceCompilation).first;
+ if (theProgram)
+ theInsertResult.first->second = QT3DS_NEW(m_Allocator, SEffectShader)(*theProgram);
+ }
+ if (theInsertResult.first->second) {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ theContext.SetActiveShader(theInsertResult.first->second->m_Shader);
+ }
+
+ return theInsertResult.first->second;
+ }
+
+ void DoApplyInstanceValue(SEffect &inEffect, QT3DSU8 *inDataPtr, CRegisteredString inPropertyName,
+ NVRenderShaderDataTypes::Enum inPropertyType,
+ NVRenderShaderProgram &inShader,
+ const SPropertyDefinition &inDefinition)
+ {
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(inPropertyName);
+ using namespace qt3ds::render;
+ if (theConstant) {
+ if (theConstant->GetShaderConstantType() == inPropertyType) {
+ if (inPropertyType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ StaticAssert<sizeof(CRegisteredString)
+ == sizeof(NVRenderTexture2DPtr)>::valid_expression();
+ CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(inDataPtr);
+ IBufferManager &theBufferManager(m_Context->GetBufferManager());
+ IOffscreenRenderManager &theOffscreenRenderer(
+ m_Context->GetOffscreenRenderManager());
+ bool needsAlphaMultiply = true;
+ NVRenderTexture2D *theTexture = nullptr;
+ if (theStrPtr->IsValid()) {
+ if (theOffscreenRenderer.HasOffscreenRenderer(*theStrPtr)) {
+ SOffscreenRenderResult theResult
+ = theOffscreenRenderer.GetRenderedItem(*theStrPtr);
+ needsAlphaMultiply = false;
+ theTexture = theResult.m_Texture;
+ } else {
+ SImageTextureData theTextureData
+ = theBufferManager.LoadRenderImage(*theStrPtr);
+ needsAlphaMultiply = true;
+ theTexture = theTextureData.m_Texture;
+ }
+ }
+ GetEffectContext(inEffect).SetTexture(
+ inShader, inPropertyName, theTexture, needsAlphaMultiply,
+ m_TextureStringBuilder, m_TextureStringBuilder2, &inDefinition);
+ } else if (inPropertyType == NVRenderShaderDataTypes::NVRenderImage2DPtr) {
+ StaticAssert<sizeof(CRegisteredString)
+ == sizeof(NVRenderTexture2DPtr)>::valid_expression();
+ NVRenderImage2D *theImage = NULL;
+ GetEffectContext(inEffect).SetImage(inShader, inPropertyName, theImage);
+ } else if (inPropertyType == NVRenderShaderDataTypes::NVRenderDataBufferPtr) {
+ // we don't handle this here
+ } else {
+ switch (inPropertyType) {
+#define HANDLE_QT3DS_SHADER_DATA_TYPE(type) \
+ case NVRenderShaderDataTypes::type: \
+ inShader.SetPropertyValue(theConstant, *(reinterpret_cast<type *>(inDataPtr))); \
+ break;
+ ITERATE_QT3DS_SHADER_DATA_TYPES
+#undef HANDLE_QT3DS_SHADER_DATA_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ } else {
+ qCCritical(INVALID_OPERATION,
+ "Effect ApplyInstanceValue command datatype "
+ "and shader datatypes differ for property %s",
+ inPropertyName.c_str());
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ void ApplyInstanceValue(SEffect &inEffect, SEffectClass &inClass,
+ NVRenderShaderProgram &inShader, const SApplyInstanceValue &inCommand)
+ {
+ // sanity check
+ if (inCommand.m_PropertyName.IsValid()) {
+ bool canGetData =
+ inCommand.m_ValueOffset + getSizeofShaderDataType(inCommand.m_ValueType)
+ <= inEffect.m_DataSectionByteSize;
+ if (canGetData == false) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ QT3DSU8 *dataPtr = inEffect.GetDataSectionBegin() + inCommand.m_ValueOffset;
+ const SPropertyDefinition *theDefinition =
+ inClass.m_DynamicClass->FindPropertyByName(inCommand.m_PropertyName);
+ if (theDefinition)
+ DoApplyInstanceValue(inEffect, dataPtr, inCommand.m_PropertyName,
+ inCommand.m_ValueType, inShader, *theDefinition);
+ } else {
+ NVConstDataRef<SPropertyDefinition> theDefs = inClass.m_DynamicClass->GetProperties();
+ for (QT3DSU32 idx = 0, end = theDefs.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(theDefs[idx]);
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(theDefinition.m_Name);
+
+ // This is fine, the property wasn't found and we continue, no problem.
+ if (!theConstant)
+ continue;
+ QT3DSU8 *dataPtr = inEffect.GetDataSectionBegin() + theDefinition.m_Offset;
+ DoApplyInstanceValue(inEffect, dataPtr, theDefinition.m_Name,
+ theDefinition.m_DataType, inShader, theDefinition);
+ }
+ }
+ }
+
+ void ApplyValue(SEffect &inEffect, SEffectClass &inClass, NVRenderShaderProgram &inShader,
+ const SApplyValue &inCommand)
+ {
+ if (inCommand.m_PropertyName.IsValid()) {
+ QT3DSU8 *dataPtr = inCommand.m_Value.mData;
+ const SPropertyDefinition *theDefinition =
+ inClass.m_DynamicClass->FindPropertyByName(inCommand.m_PropertyName);
+ if (theDefinition)
+ DoApplyInstanceValue(inEffect, dataPtr, inCommand.m_PropertyName,
+ inCommand.m_ValueType, inShader, *theDefinition);
+ }
+ }
+
+ bool ApplyBlending(const SApplyBlending &inCommand)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+
+ theContext.SetBlendingEnabled(true);
+
+ qt3ds::render::NVRenderBlendFunctionArgument blendFunc =
+ qt3ds::render::NVRenderBlendFunctionArgument(
+ inCommand.m_SrcBlendFunc, inCommand.m_DstBlendFunc, inCommand.m_SrcBlendFunc,
+ inCommand.m_DstBlendFunc);
+
+ qt3ds::render::NVRenderBlendEquationArgument blendEqu(NVRenderBlendEquation::Add,
+ NVRenderBlendEquation::Add);
+
+ theContext.SetBlendFunction(blendFunc);
+ theContext.SetBlendEquation(blendEqu);
+
+ return true;
+ }
+
+ // This has the potential to change the source texture for the current render pass
+ SEffectTextureData ApplyBufferValue(SEffect &inEffect, NVRenderShaderProgram &inShader,
+ const SApplyBufferValue &inCommand,
+ NVRenderTexture2D &inSourceTexture,
+ SEffectTextureData inCurrentSourceTexture)
+ {
+ SEffectTextureData theTextureToBind;
+ if (inCommand.m_BufferName.IsValid()) {
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ QT3DSU32 bufferIdx = theContext.FindBuffer(inCommand.m_BufferName);
+ if (bufferIdx < theContext.m_AllocatedBuffers.size()) {
+ SAllocatedBufferEntry &theEntry(theContext.m_AllocatedBuffers[bufferIdx]);
+ if (theEntry.m_NeedsClear) {
+ NVRenderContext &theRenderContext(m_Context->GetRenderContext());
+
+ theRenderContext.SetRenderTarget(theEntry.m_FrameBuffer);
+ // Note that depth/stencil buffers need an explicit clear in their bind
+ // commands in order to ensure
+ // we clear the least amount of information possible.
+
+ if (theEntry.m_Texture) {
+ NVRenderTextureFormats::Enum theTextureFormat =
+ theEntry.m_Texture->GetTextureDetails().m_Format;
+ if (theTextureFormat != NVRenderTextureFormats::Depth16
+ && theTextureFormat != NVRenderTextureFormats::Depth24
+ && theTextureFormat != NVRenderTextureFormats::Depth32
+ && theTextureFormat != NVRenderTextureFormats::Depth24Stencil8) {
+ NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
+ theRenderContext, &NVRenderContext::GetClearColor,
+ &NVRenderContext::SetClearColor, QT3DSVec4(0.0f));
+ theRenderContext.Clear(qt3ds::render::NVRenderClearValues::Color);
+ }
+ }
+ theEntry.m_NeedsClear = false;
+ }
+ theTextureToBind = SEffectTextureData(theEntry.m_Texture, false);
+ }
+ }
+ if (theTextureToBind.m_Texture == NULL) {
+ QT3DS_ASSERT(false);
+ qCCritical(INVALID_OPERATION, "Effect %s: Failed to find buffer %s for bind",
+ inEffect.m_ClassName.c_str(), inCommand.m_BufferName.c_str());
+ QT3DS_ASSERT(false);
+ }
+ } else // no name means bind the source
+ theTextureToBind = SEffectTextureData(&inSourceTexture, false);
+
+ if (inCommand.m_ParamName.IsValid()) {
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(inCommand.m_ParamName);
+
+ if (theConstant) {
+ if (theConstant->GetShaderConstantType()
+ != NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ qCCritical(INVALID_OPERATION,
+ "Effect %s: Binding buffer to parameter %s that is not a texture",
+ inEffect.m_ClassName.c_str(), inCommand.m_ParamName.c_str());
+ QT3DS_ASSERT(false);
+ } else {
+ GetEffectContext(inEffect).SetTexture(
+ inShader, inCommand.m_ParamName, theTextureToBind.m_Texture,
+ theTextureToBind.m_NeedsAlphaMultiply, m_TextureStringBuilder,
+ m_TextureStringBuilder2);
+ }
+ }
+ return inCurrentSourceTexture;
+ } else {
+ return theTextureToBind;
+ }
+ }
+
+ void ApplyDepthValue(SEffect &inEffect, NVRenderShaderProgram &inShader,
+ const SApplyDepthValue &inCommand, NVRenderTexture2D *inTexture)
+ {
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(inCommand.m_ParamName);
+
+ if (theConstant) {
+ if (theConstant->GetShaderConstantType()
+ != NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ qCCritical(INVALID_OPERATION,
+ "Effect %s: Binding buffer to parameter %s that is not a texture",
+ inEffect.m_ClassName.c_str(), inCommand.m_ParamName.c_str());
+ QT3DS_ASSERT(false);
+ } else {
+ GetEffectContext(inEffect).SetTexture(inShader, inCommand.m_ParamName, inTexture,
+ false, m_TextureStringBuilder,
+ m_TextureStringBuilder2);
+ }
+ }
+ }
+
+ void ApplyImageValue(SEffect &inEffect, NVRenderShaderProgram &inShader,
+ const SApplyImageValue &inCommand)
+ {
+ SAllocatedImageEntry theImageToBind;
+ if (inCommand.m_ImageName.IsValid()) {
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ QT3DSU32 bufferIdx = theContext.FindImage(inCommand.m_ImageName);
+ if (bufferIdx < theContext.m_AllocatedImages.size()) {
+ theImageToBind = SAllocatedImageEntry(theContext.m_AllocatedImages[bufferIdx]);
+ }
+ }
+ }
+
+ if (theImageToBind.m_Image == NULL) {
+ qCCritical(INVALID_OPERATION, "Effect %s: Failed to find image %s for bind",
+ inEffect.m_ClassName.c_str(), inCommand.m_ImageName.c_str());
+ QT3DS_ASSERT(false);
+ }
+
+ if (inCommand.m_ParamName.IsValid()) {
+ qt3ds::render::NVRenderShaderConstantBase *theConstant =
+ inShader.GetShaderConstant(inCommand.m_ParamName);
+
+ if (theConstant) {
+ if (inCommand.m_NeedSync) {
+ NVRenderBufferBarrierFlags flags(
+ qt3ds::render::NVRenderBufferBarrierValues::TextureFetch
+ | qt3ds::render::NVRenderBufferBarrierValues::TextureUpdate);
+ inShader.GetRenderContext().SetMemoryBarrier(flags);
+ }
+
+ if (theConstant->GetShaderConstantType()
+ == NVRenderShaderDataTypes::NVRenderImage2DPtr
+ && !inCommand.m_BindAsTexture) {
+ GetEffectContext(inEffect).SetImage(inShader, inCommand.m_ParamName,
+ theImageToBind.m_Image);
+ } else if (theConstant->GetShaderConstantType()
+ == NVRenderShaderDataTypes::NVRenderTexture2DPtr
+ && inCommand.m_BindAsTexture) {
+ GetEffectContext(inEffect).SetTexture(
+ inShader, inCommand.m_ParamName, theImageToBind.m_Texture, false,
+ m_TextureStringBuilder, m_TextureStringBuilder2);
+ } else {
+ qCCritical(INVALID_OPERATION,
+ "Effect %s: Binding buffer to parameter %s that is not a texture",
+ inEffect.m_ClassName.c_str(), inCommand.m_ParamName.c_str());
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ }
+
+ void ApplyDataBufferValue(SEffect &inEffect, NVRenderShaderProgram &inShader,
+ const SApplyDataBufferValue &inCommand)
+ {
+ SAllocatedDataBufferEntry theBufferToBind;
+ if (inCommand.m_ParamName.IsValid()) {
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ QT3DSU32 bufferIdx = theContext.FindDataBuffer(inCommand.m_ParamName);
+ if (bufferIdx < theContext.m_AllocatedDataBuffers.size()) {
+ theBufferToBind =
+ SAllocatedDataBufferEntry(theContext.m_AllocatedDataBuffers[bufferIdx]);
+ if (theBufferToBind.m_NeedsClear) {
+ NVDataRef<QT3DSU8> pData = theBufferToBind.m_DataBuffer->MapBuffer();
+ memset(pData.begin(), 0x0L, theBufferToBind.m_BufferData.size());
+ theBufferToBind.m_DataBuffer->UnmapBuffer();
+ theBufferToBind.m_NeedsClear = false;
+ }
+ }
+ }
+
+ if (theBufferToBind.m_DataBuffer == NULL) {
+ qCCritical(INVALID_OPERATION, "Effect %s: Failed to find buffer %s for bind",
+ inEffect.m_ClassName.c_str(), inCommand.m_ParamName.c_str());
+ QT3DS_ASSERT(false);
+ }
+
+ qt3ds::render::NVRenderShaderBufferBase *theConstant =
+ inShader.GetShaderBuffer(inCommand.m_ParamName);
+
+ if (theConstant) {
+ GetEffectContext(inEffect).SetDataBuffer(inShader, inCommand.m_ParamName,
+ theBufferToBind.m_DataBuffer);
+ } else if (theBufferToBind.m_BufferType
+ == qt3ds::render::NVRenderBufferBindValues::Draw_Indirect) {
+ // since we filled part of this buffer on the GPU we need a sync before usage
+ NVRenderBufferBarrierFlags flags(
+ qt3ds::render::NVRenderBufferBarrierValues::CommandBuffer);
+ inShader.GetRenderContext().SetMemoryBarrier(flags);
+ }
+ }
+ }
+
+ void ApplyRenderStateValue(NVRenderFrameBuffer *inTarget,
+ NVRenderTexture2D *inDepthStencilTexture,
+ const SApplyRenderState &theCommand)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ QT3DSU32 inState = (QT3DSU32)theCommand.m_RenderState;
+ bool inEnable = theCommand.m_Enabled;
+
+ switch (inState) {
+ case NVRenderState::StencilTest: {
+ if (inEnable && inTarget) {
+ inTarget->Attach(NVRenderFrameBufferAttachments::DepthStencil,
+ *inDepthStencilTexture);
+ } else if (inTarget) {
+ inTarget->Attach(NVRenderFrameBufferAttachments::DepthStencil,
+ NVRenderTextureOrRenderBuffer());
+ }
+
+ theContext.SetStencilTestEnabled(inEnable);
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ static bool CompareDepthStencilState(NVRenderDepthStencilState &inState,
+ SDepthStencil &inStencil)
+ {
+ qt3ds::render::NVRenderStencilFunctionArgument theFunction =
+ inState.GetStencilFunc(qt3ds::render::NVRenderFaces::Front);
+ qt3ds::render::NVRenderStencilOperationArgument theOperation =
+ inState.GetStencilOp(qt3ds::render::NVRenderFaces::Front);
+
+ return theFunction.m_Function == inStencil.m_StencilFunction
+ && theFunction.m_Mask == inStencil.m_Mask
+ && theFunction.m_ReferenceValue == inStencil.m_Reference
+ && theOperation.m_StencilFail == inStencil.m_StencilFailOperation
+ && theOperation.m_DepthFail == inStencil.m_DepthFailOperation
+ && theOperation.m_DepthPass == inStencil.m_DepthPassOperation;
+ }
+
+ void RenderPass(SEffectShader &inShader, const QT3DSMat44 &inMVP,
+ SEffectTextureData inSourceTexture, NVRenderFrameBuffer *inFrameBuffer,
+ QT3DSVec2 &inDestSize, const QT3DSVec2 &inCameraClipRange,
+ NVRenderTexture2D *inDepthStencil, Option<SDepthStencil> inDepthStencilCommand,
+ bool drawIndirect)
+ {
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ theContext.SetRenderTarget(inFrameBuffer);
+ if (inDepthStencil && inFrameBuffer) {
+ inFrameBuffer->Attach(NVRenderFrameBufferAttachments::DepthStencil, *inDepthStencil);
+ if (inDepthStencilCommand.hasValue()) {
+ SDepthStencil &theDepthStencil(*inDepthStencilCommand);
+ QT3DSU32 clearFlags = 0;
+ if (theDepthStencil.m_Flags.HasClearStencil())
+ clearFlags |= NVRenderClearValues::Stencil;
+ if (theDepthStencil.m_Flags.HasClearDepth())
+ clearFlags |= NVRenderClearValues::Depth;
+
+ if (clearFlags)
+ theContext.Clear(qt3ds::render::NVRenderClearFlags(clearFlags));
+
+ NVRenderDepthStencilState *targetState = NULL;
+ for (QT3DSU32 idx = 0, end = m_DepthStencilStates.size();
+ idx < end && targetState == NULL; ++idx) {
+ NVRenderDepthStencilState &theState = *m_DepthStencilStates[idx];
+ if (CompareDepthStencilState(theState, theDepthStencil))
+ targetState = &theState;
+ }
+ if (targetState == NULL) {
+ qt3ds::render::NVRenderStencilFunctionArgument theFunctionArg(
+ theDepthStencil.m_StencilFunction, theDepthStencil.m_Reference,
+ theDepthStencil.m_Mask);
+ qt3ds::render::NVRenderStencilOperationArgument theOpArg(
+ theDepthStencil.m_StencilFailOperation,
+ theDepthStencil.m_DepthFailOperation, theDepthStencil.m_DepthPassOperation);
+ targetState = theContext.CreateDepthStencilState(
+ theContext.IsDepthTestEnabled(), theContext.IsDepthWriteEnabled(),
+ theContext.GetDepthFunction(), true, theFunctionArg, theFunctionArg,
+ theOpArg, theOpArg);
+ m_DepthStencilStates.push_back(targetState);
+ }
+ theContext.SetDepthStencilState(targetState);
+ }
+ }
+
+ theContext.SetActiveShader(inShader.m_Shader);
+ inShader.m_MVP.Set(inMVP);
+ if (inSourceTexture.m_Texture) {
+ inShader.m_TextureEntry.Set(inSourceTexture.m_Texture,
+ inSourceTexture.m_NeedsAlphaMultiply, NULL);
+ } else {
+ qCCritical(INTERNAL_ERROR, "Failed to setup pass due to null source texture");
+ QT3DS_ASSERT(false);
+ }
+ inShader.m_FragColorAlphaSettings.Set(QT3DSVec2(1.0f, 0.0f));
+ inShader.m_DestSize.Set(inDestSize);
+ if (inShader.m_AppFrame.IsValid())
+ inShader.m_AppFrame.Set((QT3DSF32)m_Context->GetFrameCount());
+ if (inShader.m_FPS.IsValid())
+ inShader.m_FPS.Set((QT3DSF32)m_Context->GetFPS().first);
+ if (inShader.m_CameraClipRange.IsValid())
+ inShader.m_CameraClipRange.Set(inCameraClipRange);
+
+ if (!drawIndirect)
+ m_Context->GetRenderer().RenderQuad();
+ else
+ m_Context->GetRenderer().RenderPointsIndirect();
+
+ if (inDepthStencil && inFrameBuffer) {
+ inFrameBuffer->Attach(NVRenderFrameBufferAttachments::DepthStencil,
+ NVRenderTextureOrRenderBuffer());
+ theContext.SetDepthStencilState(m_DefaultStencilState);
+ }
+ }
+
+ void DoRenderEffect(SEffect &inEffect, SEffectClass &inClass,
+ NVRenderTexture2D &inSourceTexture, QT3DSMat44 &inMVP,
+ NVRenderFrameBuffer *inTarget, bool inEnableBlendWhenRenderToTarget,
+ NVRenderTexture2D *inDepthTexture, NVRenderTexture2D *inDepthStencilTexture,
+ const QT3DSVec2 inCameraClipRange)
+ {
+ // Run through the effect commands and render the effect.
+ // NVRenderTexture2D* theCurrentTexture(&inSourceTexture);
+ NVRenderContext &theContext = m_Context->GetRenderContext();
+
+ // Context variables that are updated during the course of a pass.
+ SEffectTextureData theCurrentSourceTexture(&inSourceTexture, false);
+ NVRenderTexture2D *theCurrentDepthStencilTexture = NULL;
+ NVRenderFrameBuffer *theCurrentRenderTarget(inTarget);
+ SEffectShader *theCurrentShader(NULL);
+ NVRenderRect theOriginalViewport(theContext.GetViewport());
+ bool wasScissorEnabled = theContext.IsScissorTestEnabled();
+ bool wasBlendingEnabled = theContext.IsBlendingEnabled();
+ // save current blending setup
+ qt3ds::render::NVRenderBlendFunctionArgument theBlendFunc = theContext.GetBlendFunction();
+ qt3ds::render::NVRenderBlendEquationArgument theBlendEqu = theContext.GetBlendEquation();
+ bool intermediateBlendingEnabled = false;
+ STextureDetails theDetails(inSourceTexture.GetTextureDetails());
+ QT3DSU32 theFinalWidth = (QT3DSU32)(theDetails.m_Width);
+ QT3DSU32 theFinalHeight = (QT3DSU32)(theDetails.m_Height);
+ QT3DSVec2 theDestSize;
+ {
+ // Ensure no matter the command run goes we replace the rendering system to some
+ // semblance of the approprate
+ // setting.
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __framebuffer(
+ theContext, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport);
+ NVRenderContextScopedProperty<bool> __scissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled);
+ NVRenderContextScopedProperty<bool> __stencilTest(
+ theContext, &NVRenderContext::IsStencilTestEnabled,
+ &NVRenderContext::SetStencilTestEnabled);
+ NVRenderContextScopedProperty<qt3ds::render::NVRenderBoolOp::Enum> __depthFunction(
+ theContext, &NVRenderContext::GetDepthFunction, &NVRenderContext::SetDepthFunction);
+ Option<SDepthStencil> theCurrentDepthStencil;
+
+ theContext.SetScissorTestEnabled(false);
+ theContext.SetBlendingEnabled(false);
+ theContext.SetCullingEnabled(false);
+ theContext.SetDepthTestEnabled(false);
+ theContext.SetDepthWriteEnabled(false);
+
+ QT3DSMat44 theMVP(QT3DSMat44::createIdentity());
+ NVConstDataRef<dynamic::SCommand *> theCommands =
+ inClass.m_DynamicClass->GetRenderCommands();
+ for (QT3DSU32 commandIdx = 0, commandEnd = theCommands.size(); commandIdx < commandEnd;
+ ++commandIdx) {
+ const SCommand &theCommand(*theCommands[commandIdx]);
+ switch (theCommand.m_Type) {
+ case CommandTypes::AllocateBuffer:
+ AllocateBuffer(inEffect, static_cast<const SAllocateBuffer &>(theCommand),
+ theFinalWidth, theFinalHeight, theDetails.m_Format);
+ break;
+
+ case CommandTypes::AllocateImage:
+ AllocateImage(inEffect, static_cast<const SAllocateImage &>(theCommand),
+ theFinalWidth, theFinalHeight);
+ break;
+
+ case CommandTypes::AllocateDataBuffer:
+ AllocateDataBuffer(inEffect,
+ static_cast<const SAllocateDataBuffer &>(theCommand));
+ break;
+
+ case CommandTypes::BindBuffer:
+ theCurrentRenderTarget =
+ BindBuffer(inEffect, static_cast<const SBindBuffer &>(theCommand), theMVP,
+ theDestSize);
+ break;
+
+ case CommandTypes::BindTarget: {
+ m_Context->GetRenderContext().SetRenderTarget(inTarget);
+ theCurrentRenderTarget = inTarget;
+ theMVP = inMVP;
+ theContext.SetViewport(theOriginalViewport);
+ theDestSize = QT3DSVec2((QT3DSF32)theFinalWidth, (QT3DSF32)theFinalHeight);
+ // This isn't necessary if we are rendering to an offscreen buffer and not
+ // compositing
+ // with other objects.
+ if (inEnableBlendWhenRenderToTarget) {
+ theContext.SetBlendingEnabled(wasBlendingEnabled);
+ theContext.SetScissorTestEnabled(wasScissorEnabled);
+ // The blending setup was done before we apply the effect
+ theContext.SetBlendFunction(theBlendFunc);
+ theContext.SetBlendEquation(theBlendEqu);
+ }
+ } break;
+ case CommandTypes::BindShader:
+ theCurrentShader = BindShader(inEffect.m_ClassName,
+ static_cast<const SBindShader &>(theCommand));
+ break;
+ case CommandTypes::ApplyInstanceValue:
+ if (theCurrentShader)
+ ApplyInstanceValue(inEffect, inClass, *theCurrentShader->m_Shader,
+ static_cast<const SApplyInstanceValue &>(theCommand));
+ break;
+ case CommandTypes::ApplyValue:
+ if (theCurrentShader)
+ ApplyValue(inEffect, inClass, *theCurrentShader->m_Shader,
+ static_cast<const SApplyValue &>(theCommand));
+ break;
+ case CommandTypes::ApplyBlending:
+ intermediateBlendingEnabled =
+ ApplyBlending(static_cast<const SApplyBlending &>(theCommand));
+ break;
+ case CommandTypes::ApplyBufferValue:
+ if (theCurrentShader)
+ theCurrentSourceTexture =
+ ApplyBufferValue(inEffect, *theCurrentShader->m_Shader,
+ static_cast<const SApplyBufferValue &>(theCommand),
+ inSourceTexture, theCurrentSourceTexture);
+ break;
+ case CommandTypes::ApplyDepthValue:
+ if (theCurrentShader)
+ ApplyDepthValue(inEffect, *theCurrentShader->m_Shader,
+ static_cast<const SApplyDepthValue &>(theCommand),
+ inDepthTexture);
+ if (!inDepthTexture) {
+ qCCritical(INVALID_OPERATION,
+ "Depth value command detected but no "
+ "depth buffer provided for effect %s",
+ inEffect.m_ClassName.c_str());
+ QT3DS_ASSERT(false);
+ }
+ break;
+ case CommandTypes::ApplyImageValue:
+ if (theCurrentShader)
+ ApplyImageValue(inEffect, *theCurrentShader->m_Shader,
+ static_cast<const SApplyImageValue &>(theCommand));
+ break;
+ case CommandTypes::ApplyDataBufferValue:
+ if (theCurrentShader)
+ ApplyDataBufferValue(
+ inEffect, *theCurrentShader->m_Shader,
+ static_cast<const SApplyDataBufferValue &>(theCommand));
+ break;
+ case CommandTypes::DepthStencil: {
+ const SDepthStencil &theDepthStencil =
+ static_cast<const SDepthStencil &>(theCommand);
+ theCurrentDepthStencilTexture =
+ FindTexture(inEffect, theDepthStencil.m_BufferName);
+ if (theCurrentDepthStencilTexture)
+ theCurrentDepthStencil = theDepthStencil;
+ } break;
+ case CommandTypes::Render:
+ if (theCurrentShader && theCurrentSourceTexture.m_Texture) {
+ RenderPass(*theCurrentShader, theMVP, theCurrentSourceTexture,
+ theCurrentRenderTarget, theDestSize, inCameraClipRange,
+ theCurrentDepthStencilTexture, theCurrentDepthStencil,
+ static_cast<const SRender &>(theCommand).m_DrawIndirect);
+ }
+ // Reset the source texture regardless
+ theCurrentSourceTexture = SEffectTextureData(&inSourceTexture, false);
+ theCurrentDepthStencilTexture = NULL;
+ theCurrentDepthStencil = Option<SDepthStencil>();
+ // reset intermediate blending state
+ if (intermediateBlendingEnabled) {
+ theContext.SetBlendingEnabled(false);
+ intermediateBlendingEnabled = false;
+ }
+ break;
+ case CommandTypes::ApplyRenderState:
+ ApplyRenderStateValue(theCurrentRenderTarget, inDepthStencilTexture,
+ static_cast<const SApplyRenderState &>(theCommand));
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ SetEffectRequiresCompilation(inEffect.m_ClassName, false);
+
+ // reset to default stencil state
+ if (inDepthStencilTexture) {
+ theContext.SetDepthStencilState(m_DefaultStencilState);
+ }
+
+ // Release any per-frame buffers
+ if (inEffect.m_Context) {
+ SEffectContext &theContext(*inEffect.m_Context);
+ // Query for size on every loop intentional
+ for (QT3DSU32 idx = 0; idx < theContext.m_AllocatedBuffers.size(); ++idx) {
+ if (theContext.m_AllocatedBuffers[idx].m_Flags.IsSceneLifetime() == false) {
+ theContext.ReleaseBuffer(idx);
+ --idx;
+ }
+ }
+ for (QT3DSU32 idx = 0; idx < theContext.m_AllocatedImages.size(); ++idx) {
+ if (theContext.m_AllocatedImages[idx].m_Flags.IsSceneLifetime() == false) {
+ theContext.ReleaseImage(idx);
+ --idx;
+ }
+ }
+ }
+ }
+ }
+
+ NVRenderTexture2D *RenderEffect(SEffectRenderArgument inRenderArgument) override
+ {
+ SEffectClass *theClass = GetEffectClass(inRenderArgument.m_Effect.m_ClassName);
+ if (!theClass) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ QT3DSMat44 theMVP;
+ SCamera::SetupOrthographicCameraForOffscreenRender(inRenderArgument.m_ColorBuffer, theMVP);
+ // setup a render target
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+ IResourceManager &theManager(m_Context->GetResourceManager());
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __framebuffer(
+ theContext, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+ STextureDetails theDetails(inRenderArgument.m_ColorBuffer.GetTextureDetails());
+ QT3DSU32 theFinalWidth = ITextRenderer::NextMultipleOf4((QT3DSU32)(theDetails.m_Width));
+ QT3DSU32 theFinalHeight = ITextRenderer::NextMultipleOf4((QT3DSU32)(theDetails.m_Height));
+ NVRenderFrameBuffer *theBuffer = theManager.AllocateFrameBuffer();
+ // UdoL Some Effects may need to run before HDR tonemap. This means we need to keep the
+ // input format
+ NVRenderTextureFormats::Enum theOutputFormat = NVRenderTextureFormats::RGBA8;
+ if (theClass->m_DynamicClass->GetOutputTextureFormat() == NVRenderTextureFormats::Unknown)
+ theOutputFormat = theDetails.m_Format;
+ NVRenderTexture2D *theTargetTexture =
+ theManager.AllocateTexture2D(theFinalWidth, theFinalHeight, theOutputFormat);
+ theBuffer->Attach(NVRenderFrameBufferAttachments::Color0, *theTargetTexture);
+ theContext.SetRenderTarget(theBuffer);
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport,
+ NVRenderRect(0, 0, theFinalWidth, theFinalHeight));
+
+ NVRenderContextScopedProperty<bool> __scissorEnable(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled, false);
+
+ DoRenderEffect(inRenderArgument.m_Effect, *theClass, inRenderArgument.m_ColorBuffer, theMVP,
+ m_Context->GetRenderContext().GetRenderTarget(), false,
+ inRenderArgument.m_DepthTexture, inRenderArgument.m_DepthStencilBuffer,
+ inRenderArgument.m_CameraClipRange);
+
+ theBuffer->Attach(NVRenderFrameBufferAttachments::Color0, NVRenderTextureOrRenderBuffer());
+ theManager.Release(*theBuffer);
+ return theTargetTexture;
+ }
+
+ // Render the effect to the currently bound render target using this MVP
+ bool RenderEffect(SEffectRenderArgument inRenderArgument, QT3DSMat44 &inMVP,
+ bool inEnableBlendWhenRenderToTarget) override
+ {
+ SEffectClass *theClass = GetEffectClass(inRenderArgument.m_Effect.m_ClassName);
+ if (!theClass) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ DoRenderEffect(inRenderArgument.m_Effect, *theClass, inRenderArgument.m_ColorBuffer, inMVP,
+ m_Context->GetRenderContext().GetRenderTarget(),
+ inEnableBlendWhenRenderToTarget, inRenderArgument.m_DepthTexture,
+ inRenderArgument.m_DepthStencilBuffer, inRenderArgument.m_CameraClipRange);
+ return true;
+ }
+
+ void ReleaseEffectContext(SEffectContext *inContext) override
+ {
+ if (inContext == NULL)
+ return;
+ for (QT3DSU32 idx = 0, end = m_Contexts.size(); idx < end; ++idx) {
+ if (m_Contexts[idx] == inContext) {
+ m_Contexts.replace_with_last(idx);
+ NVDelete(m_Allocator, inContext);
+ }
+ }
+ }
+
+ void ResetEffectFrameData(SEffectContext &inContext) override
+ { // Query for size on every loop intentional
+ for (QT3DSU32 idx = 0; idx < inContext.m_AllocatedBuffers.size(); ++idx) {
+ SAllocatedBufferEntry &theBuffer(inContext.m_AllocatedBuffers[idx]);
+ if (theBuffer.m_Flags.IsSceneLifetime() == true)
+ theBuffer.m_NeedsClear = true;
+ }
+ for (QT3DSU32 idx = 0; idx < inContext.m_AllocatedDataBuffers.size(); ++idx) {
+ SAllocatedDataBufferEntry &theDataBuffer(inContext.m_AllocatedDataBuffers[idx]);
+ if (theDataBuffer.m_Flags.IsSceneLifetime() == true)
+ theDataBuffer.m_NeedsClear = true;
+ }
+ }
+
+ void SetShaderData(CRegisteredString path, const char8_t *data,
+ const char8_t *inShaderType, const char8_t *inShaderVersion,
+ bool inHasGeomShader, bool inIsComputeShader) override
+ {
+ m_CoreContext.GetDynamicObjectSystemCore().SetShaderData(
+ path, data, inShaderType, inShaderVersion, inHasGeomShader, inIsComputeShader);
+ }
+
+ void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap, const char8_t *inProjectDir) const override
+ {
+ ioBuffer.write((QT3DSU32)m_EffectClasses.size());
+ SStringSaveRemapper theRemapper(m_Allocator, inRemapMap, inProjectDir,
+ m_CoreContext.GetStringTable());
+ for (TEffectClassMap::const_iterator theIter = m_EffectClasses.begin(),
+ end = m_EffectClasses.end();
+ theIter != end; ++theIter) {
+ const SEffectClass &theClass = *theIter->second;
+ CRegisteredString theClassName = theClass.m_DynamicClass->GetId();
+ theClassName.Remap(inRemapMap);
+ ioBuffer.write(theClassName);
+ // Effect classes do not store any additional data from the dynamic object class.
+ ioBuffer.write(theClass);
+ }
+ }
+
+ void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t *inProjectDir) override
+ {
+ m_Allocator.m_PreAllocatedBlock = inData;
+ m_Allocator.m_OwnsMemory = false;
+ qt3ds::render::SDataReader theReader(inData.begin(), inData.end());
+ QT3DSU32 numEffectClasses = theReader.LoadRef<QT3DSU32>();
+ SStringLoadRemapper theRemapper(m_Allocator, inStrDataBlock, inProjectDir,
+ m_CoreContext.GetStringTable());
+ for (QT3DSU32 idx = 0, end = numEffectClasses; idx < end; ++idx) {
+ CRegisteredString theClassName = theReader.LoadRef<CRegisteredString>();
+ theClassName.Remap(inStrDataBlock);
+ IDynamicObjectClass *theBaseClass =
+ m_CoreContext.GetDynamicObjectSystemCore().GetDynamicObjectClass(theClassName);
+ if (theBaseClass == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SEffectClass *theClass = theReader.Load<SEffectClass>();
+ theClass->SetupThisObjectFromMemory(m_Allocator, *theBaseClass);
+ NVScopedRefCounted<SEffectClass> theClassPtr(theClass);
+ m_EffectClasses.insert(eastl::make_pair(theBaseClass->GetId(), theClassPtr));
+ }
+ }
+
+ IEffectSystem &GetEffectSystem(IQt3DSRenderContext &context) override
+ {
+ m_Context = &context;
+
+ NVRenderContext &theContext(m_Context->GetRenderContext());
+
+ m_ResourceManager = &IResourceManager::CreateResourceManager(theContext);
+
+ // create default stencil state
+ qt3ds::render::NVRenderStencilFunctionArgument stencilDefaultFunc(
+ qt3ds::render::NVRenderBoolOp::AlwaysTrue, 0x0, 0xFF);
+ qt3ds::render::NVRenderStencilOperationArgument stencilDefaultOp(
+ qt3ds::render::NVRenderStencilOp::Keep, qt3ds::render::NVRenderStencilOp::Keep,
+ qt3ds::render::NVRenderStencilOp::Keep);
+ m_DefaultStencilState = theContext.CreateDepthStencilState(
+ theContext.IsDepthTestEnabled(), theContext.IsDepthWriteEnabled(),
+ theContext.GetDepthFunction(), theContext.IsStencilTestEnabled(), stencilDefaultFunc,
+ stencilDefaultFunc, stencilDefaultOp, stencilDefaultOp);
+
+ return *this;
+ }
+
+ IResourceManager &GetResourceManager() override
+ {
+ return *m_ResourceManager;
+ }
+
+ void renderSubpresentations(SEffect &inEffect) override
+ {
+ SEffectClass *theClass = GetEffectClass(inEffect.m_ClassName);
+ if (!theClass)
+ return;
+
+ NVConstDataRef<SPropertyDefinition> theDefs = theClass->m_DynamicClass->GetProperties();
+ for (QT3DSU32 idx = 0, end = theDefs.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(theDefs[idx]);
+ if (theDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ QT3DSU8 *dataPtr = inEffect.GetDataSectionBegin() + theDefinition.m_Offset;
+ StaticAssert<sizeof(CRegisteredString)
+ == sizeof(NVRenderTexture2DPtr)>::valid_expression();
+ CRegisteredString *theStrPtr = reinterpret_cast<CRegisteredString *>(dataPtr);
+ IOffscreenRenderManager &theOffscreenRenderer(
+ m_Context->GetOffscreenRenderManager());
+
+ if (theStrPtr->IsValid()) {
+ if (theOffscreenRenderer.HasOffscreenRenderer(*theStrPtr))
+ theOffscreenRenderer.GetRenderedItem(*theStrPtr);
+ }
+ }
+ }
+ }
+};
+}
+
+IEffectSystemCore &IEffectSystemCore::CreateEffectSystemCore(IQt3DSRenderContextCore &inContext)
+{
+ return *QT3DS_NEW(inContext.GetAllocator(), SEffectSystem)(inContext);
+}
diff --git a/src/runtimerender/Qt3DSRenderEffectSystem.h b/src/runtimerender/Qt3DSRenderEffectSystem.h
new file mode 100644
index 0000000..879addc
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderEffectSystem.h
@@ -0,0 +1,209 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_EFFECT_SYSTEM_H
+#define QT3DS_RENDER_EFFECT_SYSTEM_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSVec2.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+
+namespace qt3ds {
+namespace render {
+ struct SEffect;
+ struct SEffectContext;
+ namespace dynamic {
+ struct SCommand; // UICRenderEffectCommands.h
+ }
+
+ struct SEffectRenderArgument
+ {
+ SEffect &m_Effect;
+ NVRenderTexture2D &m_ColorBuffer;
+ // Some effects need the camera near and far ranges.
+ QT3DSVec2 m_CameraClipRange;
+ // Some effects require the depth buffer from the rendering of thelayer
+ // most do not.
+ NVRenderTexture2D *m_DepthTexture;
+ // this is a depth preapass texture we need for some effects like bloom
+ // actually we need the stencil values
+ NVRenderTexture2D *m_DepthStencilBuffer;
+
+ SEffectRenderArgument(SEffect &inEffect, NVRenderTexture2D &inColorBuffer,
+ const QT3DSVec2 &inCameraClipRange,
+ NVRenderTexture2D *inDepthTexture = NULL,
+ NVRenderTexture2D *inDepthBuffer = NULL)
+ : m_Effect(inEffect)
+ , m_ColorBuffer(inColorBuffer)
+ , m_CameraClipRange(inCameraClipRange)
+ , m_DepthTexture(inDepthTexture)
+ , m_DepthStencilBuffer(inDepthBuffer)
+ {
+ }
+ };
+
+ class IEffectSystemCore : public NVRefCounted
+ {
+ public:
+ virtual bool IsEffectRegistered(CRegisteredString inStr) = 0;
+ virtual NVConstDataRef<CRegisteredString> GetRegisteredEffects() = 0;
+ // Register an effect class that uses exactly these commands to render.
+ // Effect properties cannot change after the effect is created because that would invalidate
+ // existing effect instances.
+ // Effect commands, which are stored on the effect class, can change.
+ virtual bool RegisterEffect(CRegisteredString inName,
+ NVConstDataRef<dynamic::SPropertyDeclaration> inProperties) = 0;
+
+ virtual bool UnregisterEffect(CRegisteredString inName) = 0;
+
+ // Shorthand method that creates an effect and auto-generates the effect commands like such:
+ // BindShader(inPathToEffect)
+ // foreach( propdec in inProperties ) ApplyValue( propDecType )
+ // ApplyShader()
+ virtual bool
+ RegisterGLSLEffect(CRegisteredString inName, const char8_t *inPathToEffect,
+ NVConstDataRef<dynamic::SPropertyDeclaration> inProperties) = 0;
+ // Set the default value. THis is unnecessary if the default is zero as that is what it is
+ // assumed to be.
+ virtual void SetEffectPropertyDefaultValue(CRegisteredString inName,
+ CRegisteredString inPropName,
+ NVConstDataRef<QT3DSU8> inDefaultData) = 0;
+ virtual void SetEffectPropertyEnumNames(CRegisteredString inName,
+ CRegisteredString inPropName,
+ NVConstDataRef<CRegisteredString> inNames) = 0;
+ virtual NVConstDataRef<CRegisteredString>
+ GetEffectPropertyEnumNames(CRegisteredString inName,
+ CRegisteredString inPropName) const = 0;
+
+ virtual NVConstDataRef<dynamic::SPropertyDefinition>
+ GetEffectProperties(CRegisteredString inEffectName) const = 0;
+
+ virtual void SetEffectPropertyTextureSettings(
+ CRegisteredString inEffectName, CRegisteredString inPropName,
+ CRegisteredString inPropPath, NVRenderTextureTypeValue::Enum inTexType,
+ NVRenderTextureCoordOp::Enum inCoordOp, NVRenderTextureMagnifyingOp::Enum inMagFilterOp,
+ NVRenderTextureMinifyingOp::Enum inMinFilterOp) = 0;
+
+ // Setting the effect commands also sets this as if there isn't a specific "apply depth
+ // value"
+ // command then this effect does not require the depth texture.
+ // So the setter here is completely optional.
+ virtual void SetEffectRequiresDepthTexture(CRegisteredString inEffectName,
+ bool inValue) = 0;
+ virtual bool DoesEffectRequireDepthTexture(CRegisteredString inEffectName) const = 0;
+
+ virtual void SetEffectRequiresCompilation(CRegisteredString inEffectName,
+ bool inValue) = 0;
+ virtual bool DoesEffectRequireCompilation(CRegisteredString inEffectName) const = 0;
+
+ // The effect commands are the actual commands that run for a given effect. The tell the
+ // system exactly
+ // explicitly things like bind this shader, bind this render target, apply this property,
+ // run this shader
+ // See UICRenderEffectCommands.h for the list of commands.
+ // These commands are copied into the effect.
+ virtual void SetEffectCommands(CRegisteredString inEffectName,
+ NVConstDataRef<dynamic::SCommand *> inCommands) = 0;
+ virtual NVConstDataRef<dynamic::SCommand *>
+ GetEffectCommands(CRegisteredString inEffectName) const = 0;
+
+ // Set the shader data for a given path. Used when a path doesn't correspond to a file but
+ // the data has been
+ // auto-generated. The system will look for data under this path key during the BindShader
+ // effect command.
+ virtual void SetShaderData(CRegisteredString inPath, const char8_t *inData,
+ const char8_t *inShaderType = NULL,
+ const char8_t *inShaderVersion = NULL,
+ bool inHasGeomShader = false,
+ bool inIsComputeShader = false) = 0;
+
+ // An effect instance is just a property bag along with the name of the effect to run.
+ // This instance is what is placed into the object graph.
+ virtual SEffect *CreateEffectInstance(CRegisteredString inEffectName,
+ NVAllocatorCallback &inSceneGraphAllocator) = 0;
+
+ virtual void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap,
+ const char8_t *inProjectDir) const = 0;
+ virtual void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t *inProjectDir) = 0;
+
+ virtual IEffectSystem &GetEffectSystem(IQt3DSRenderContext &context) = 0;
+
+ virtual IResourceManager &GetResourceManager() = 0;
+
+ static IEffectSystemCore &CreateEffectSystemCore(IQt3DSRenderContextCore &context);
+ };
+
+ /**
+ * An effect is essentially a function that takes a image and produces a new image. The source
+ *and dest images
+ * aren't guaranteed to be the same size, the effect may enlarge or shrink the result.
+ * A specialization is when you want the effect to render to the final render target instead of
+ *to a separate image.
+ * In this case the effect cannot enlarge or shrink the final target and it will render to the
+ *destination buffer
+ * using the given MVP.
+ */
+ class IEffectSystem : public IEffectSystemCore
+ {
+ protected:
+ virtual ~IEffectSystem() {}
+
+ public:
+ // Calling release effect context with no context results in no problems.
+ virtual void ReleaseEffectContext(SEffectContext *inEffect) = 0;
+
+ // If the effect has a context you can call this to clear persistent buffers back to their
+ // original value.
+ virtual void ResetEffectFrameData(SEffectContext &inContext) = 0;
+
+ // Render this effect. Returns false in the case the effect wasn't rendered and the render
+ // state
+ // is guaranteed to be the same as before.
+ // The texture returned is allocated using the resource manager, and it is up to the caller
+ // to deallocate it or return it to the temporary pool if items when necessary
+ // Pass in true if you want the result image premultiplied. Most of the functions in the
+ // system
+ // assume non-premultiplied color for images so probably this is false.
+ virtual NVRenderTexture2D *RenderEffect(SEffectRenderArgument inRenderArgument) = 0;
+
+ // Render the effect to the currently bound render target using this MVP and optionally
+ // enabling blending when rendering to the target
+ virtual bool RenderEffect(SEffectRenderArgument inRenderArgument, QT3DSMat44 &inMVP,
+ bool inEnableBlendWhenRenderToTarget) = 0;
+
+ virtual void renderSubpresentations(SEffect &inEffect) = 0;
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderEulerAngles.cpp b/src/runtimerender/Qt3DSRenderEulerAngles.cpp
new file mode 100644
index 0000000..2732f03
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderEulerAngles.cpp
@@ -0,0 +1,383 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//==============================================================================
+// Includes
+//==============================================================================
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdio.h>
+#include "Qt3DSRenderEulerAngles.h"
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4365) // warnings on conversion from unsigned int to int
+#endif
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace qt3ds {
+namespace render {
+
+ //==============================================================================
+ /**
+ * Constructor
+ */
+ CEulerAngleConverter::CEulerAngleConverter() { m_OrderInfoBuffer[0] = '\0'; }
+
+ //==============================================================================
+ /**
+ * Destructor
+ */
+ CEulerAngleConverter::~CEulerAngleConverter() {}
+
+ //==============================================================================
+ /**
+ * Constructs a Euler angle & holds it in a EulerAngles struct
+ * @param theI x rotation ( radians )
+ * @param theJ y rotation ( radians )
+ * @param theH z rotation ( radians )
+ * @param theOrder the order this angle is in namely XYZ( static ), etc.
+ * use the EulOrd**** macros to generate values
+ * 0 to 23 is valid
+ * @return the euler angle
+ */
+ EulerAngles CEulerAngleConverter::Eul_(float theI, float theJ, float theH, int theOrder)
+ {
+ EulerAngles theEulerAngle;
+ theEulerAngle.x = theI;
+ theEulerAngle.y = theJ;
+ theEulerAngle.z = theH;
+ theEulerAngle.w = (float)theOrder;
+ return theEulerAngle;
+ }
+
+ //==============================================================================
+ /**
+ * Construct quaternion from Euler angles (in radians).
+ * @param theEulerAngle incoming angle( radians )
+ * @return the Quaternion
+ */
+ Quat CEulerAngleConverter::Eul_ToQuat(EulerAngles theEulerAngle)
+ {
+ Quat theQuaternion;
+ double a[3], ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
+ int i, j, k, h, n, s, f;
+
+ EulGetOrd((unsigned int)theEulerAngle.w, i, j, k, h, n, s, f);
+ if (f == EulFrmR) {
+ float t = theEulerAngle.x;
+ theEulerAngle.x = theEulerAngle.z;
+ theEulerAngle.z = t;
+ }
+
+ if (n == EulParOdd)
+ theEulerAngle.y = -theEulerAngle.y;
+
+ ti = theEulerAngle.x * 0.5;
+ tj = theEulerAngle.y * 0.5;
+ th = theEulerAngle.z * 0.5;
+
+ ci = cos(ti);
+ cj = cos(tj);
+ ch = cos(th);
+
+ si = sin(ti);
+ sj = sin(tj);
+ sh = sin(th);
+
+ cc = ci * ch;
+ cs = ci * sh;
+ sc = si * ch;
+ ss = si * sh;
+
+ if (s == EulRepYes) {
+ a[i] = cj * (cs + sc); /* Could speed up with */
+ a[j] = sj * (cc + ss); /* trig identities. */
+ a[k] = sj * (cs - sc);
+ theQuaternion.w = (float)(cj * (cc - ss));
+ } else {
+ a[i] = cj * sc - sj * cs;
+ a[j] = cj * ss + sj * cc;
+ a[k] = cj * cs - sj * sc;
+ theQuaternion.w = (float)(cj * cc + sj * ss);
+ }
+ if (n == EulParOdd)
+ a[j] = -a[j];
+
+ theQuaternion.x = (float)a[X];
+ theQuaternion.y = (float)a[Y];
+ theQuaternion.z = (float)a[Z];
+ return theQuaternion;
+ }
+
+ //==============================================================================
+ /**
+ * Construct matrix from Euler angles (in radians).
+ * @param theEulerAngle incoming angle
+ * @param theMatrix outgoing matrix
+ */
+ void CEulerAngleConverter::Eul_ToHMatrix(EulerAngles theEulerAngle, HMatrix theMatrix)
+ {
+ double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
+ int i, j, k, h, n, s, f;
+ EulGetOrd((unsigned int)theEulerAngle.w, i, j, k, h, n, s, f);
+
+ if (f == EulFrmR) {
+ float t = theEulerAngle.x;
+ theEulerAngle.x = theEulerAngle.z;
+ theEulerAngle.z = t;
+ }
+
+ if (n == EulParOdd) {
+ theEulerAngle.x = -theEulerAngle.x;
+ theEulerAngle.y = -theEulerAngle.y;
+ theEulerAngle.z = -theEulerAngle.z;
+ }
+
+ ti = theEulerAngle.x;
+ tj = theEulerAngle.y;
+ th = theEulerAngle.z;
+
+ ci = cos(ti);
+ cj = cos(tj);
+ ch = cos(th);
+
+ si = sin(ti);
+ sj = sin(tj);
+ sh = sin(th);
+
+ cc = ci * ch;
+ cs = ci * sh;
+ sc = si * ch;
+ ss = si * sh;
+
+ if (s == EulRepYes) {
+ theMatrix[i][i] = (float)cj;
+ theMatrix[i][j] = (float)(sj * si);
+ theMatrix[i][k] = (float)(sj * ci);
+ theMatrix[j][i] = (float)(sj * sh);
+ theMatrix[j][j] = (float)(-cj * ss + cc);
+ theMatrix[j][k] = (float)(-cj * cs - sc);
+ theMatrix[k][i] = (float)(-sj * ch);
+ theMatrix[k][j] = (float)(cj * sc + cs);
+ theMatrix[k][k] = (float)(cj * cc - ss);
+ } else {
+ theMatrix[i][i] = (float)(cj * ch);
+ theMatrix[i][j] = (float)(sj * sc - cs);
+ theMatrix[i][k] = (float)(sj * cc + ss);
+ theMatrix[j][i] = (float)(cj * sh);
+ theMatrix[j][j] = (float)(sj * ss + cc);
+ theMatrix[j][k] = (float)(sj * cs - sc);
+ theMatrix[k][i] = (float)(-sj);
+ theMatrix[k][j] = (float)(cj * si);
+ theMatrix[k][k] = (float)(cj * ci);
+ }
+
+ theMatrix[W][X] = 0.0;
+ theMatrix[W][Y] = 0.0;
+ theMatrix[W][Z] = 0.0;
+ theMatrix[X][W] = 0.0;
+ theMatrix[Y][W] = 0.0;
+ theMatrix[Z][W] = 0.0;
+ theMatrix[W][W] = 1.0;
+ }
+
+ //==============================================================================
+ /**
+ * Convert matrix to Euler angles (in radians).
+ * @param theMatrix incoming matrix
+ * @param theOrder 0-23, use EulOrd**** to generate this value
+ * @return a set of angles in radians!!!!
+ */
+ EulerAngles CEulerAngleConverter::Eul_FromHMatrix(HMatrix theMatrix, int theOrder)
+ {
+ EulerAngles theEulerAngle;
+ int i, j, k, h, n, s, f;
+
+ EulGetOrd(theOrder, i, j, k, h, n, s, f);
+ if (s == EulRepYes) {
+ double sy = sqrt(theMatrix[i][j] * theMatrix[i][j] + theMatrix[i][k] * theMatrix[i][k]);
+ if (sy > 16 * FLT_EPSILON) {
+ theEulerAngle.x = (float)(atan2((double)theMatrix[i][j], (double)theMatrix[i][k]));
+ theEulerAngle.y = (float)(atan2((double)sy, (double)theMatrix[i][i]));
+ theEulerAngle.z = (float)(atan2((double)theMatrix[j][i], -(double)theMatrix[k][i]));
+ } else {
+ theEulerAngle.x = (float)(atan2(-(double)theMatrix[j][k], (double)theMatrix[j][j]));
+ theEulerAngle.y = (float)(atan2((double)sy, (double)theMatrix[i][i]));
+ theEulerAngle.z = 0;
+ }
+ } else {
+ double cy = sqrt(theMatrix[i][i] * theMatrix[i][i] + theMatrix[j][i] * theMatrix[j][i]);
+ if (cy > 16 * FLT_EPSILON) {
+ theEulerAngle.x = (float)(atan2((double)theMatrix[k][j], (double)theMatrix[k][k]));
+ theEulerAngle.y = (float)(atan2(-(double)theMatrix[k][i], (double)cy));
+ theEulerAngle.z = (float)(atan2((double)theMatrix[j][i], (double)theMatrix[i][i]));
+ } else {
+ theEulerAngle.x = (float)(atan2(-(double)theMatrix[j][k], (double)theMatrix[j][j]));
+ theEulerAngle.y = (float)(atan2(-(double)theMatrix[k][i], (double)cy));
+ theEulerAngle.z = 0;
+ }
+ }
+
+ if (n == EulParOdd) {
+ theEulerAngle.x = -theEulerAngle.x;
+ theEulerAngle.y = -theEulerAngle.y;
+ theEulerAngle.z = -theEulerAngle.z;
+ }
+
+ if (f == EulFrmR) {
+ float t = theEulerAngle.x;
+ theEulerAngle.x = theEulerAngle.z;
+ theEulerAngle.z = t;
+ }
+ theEulerAngle.w = (float)theOrder;
+ return theEulerAngle;
+ }
+
+ //==============================================================================
+ /**
+ * Convert quaternion to Euler angles (in radians).
+ * @param theQuaternion incoming quaternion
+ * @param theOrder 0-23, use EulOrd**** to generate this value
+ * @return the generated angles ( radians )
+ */
+ EulerAngles CEulerAngleConverter::Eul_FromQuat(Quat theQuaternion, int theOrder)
+ {
+ HMatrix theMatrix;
+ double Nq = theQuaternion.x * theQuaternion.x + theQuaternion.y * theQuaternion.y
+ + theQuaternion.z * theQuaternion.z + theQuaternion.w * theQuaternion.w;
+ double s = (Nq > 0.0) ? (2.0 / Nq) : 0.0;
+ double xs = theQuaternion.x * s;
+ double ys = theQuaternion.y * s;
+ double zs = theQuaternion.z * s;
+ double wx = theQuaternion.w * xs;
+ double wy = theQuaternion.w * ys;
+ double wz = theQuaternion.w * zs;
+ double xx = theQuaternion.x * xs;
+ double xy = theQuaternion.x * ys;
+ double xz = theQuaternion.x * zs;
+ double yy = theQuaternion.y * ys;
+ double yz = theQuaternion.y * zs;
+ double zz = theQuaternion.z * zs;
+
+ theMatrix[X][X] = (float)(1.0 - (yy + zz));
+ theMatrix[X][Y] = (float)(xy - wz);
+ theMatrix[X][Z] = (float)(xz + wy);
+ theMatrix[Y][X] = (float)(xy + wz);
+ theMatrix[Y][Y] = (float)(1.0 - (xx + zz));
+ theMatrix[Y][Z] = (float)(yz - wx);
+ theMatrix[Z][X] = (float)(xz - wy);
+ theMatrix[Z][Y] = (float)(yz + wx);
+ theMatrix[Z][Z] = (float)(1.0 - (xx + yy));
+ theMatrix[W][X] = 0.0;
+ theMatrix[W][Y] = 0.0;
+ theMatrix[W][Z] = 0.0;
+ theMatrix[X][W] = 0.0;
+ theMatrix[Y][W] = 0.0;
+ theMatrix[Z][W] = 0.0;
+ theMatrix[W][W] = 1.0;
+
+ return Eul_FromHMatrix(theMatrix, theOrder);
+ }
+
+ //==============================================================================
+ /**
+ * Dump the Order information
+ */
+ const char *CEulerAngleConverter::DumpOrderInfo()
+ {
+ long theCount = 0;
+ long theOrder[24];
+ char theOrderStr[24][16];
+
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXZr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXZr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYZr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYZr");
+
+ theCount = 0;
+ theOrder[theCount++] = EulOrdXYZs;
+ theOrder[theCount++] = EulOrdXYXs;
+ theOrder[theCount++] = EulOrdXZYs;
+ theOrder[theCount++] = EulOrdXZXs;
+ theOrder[theCount++] = EulOrdYZXs;
+ theOrder[theCount++] = EulOrdYZYs;
+ theOrder[theCount++] = EulOrdYXZs;
+ theOrder[theCount++] = EulOrdYXYs;
+ theOrder[theCount++] = EulOrdZXYs;
+ theOrder[theCount++] = EulOrdZXZs;
+ theOrder[theCount++] = EulOrdZYXs;
+ theOrder[theCount++] = EulOrdZYZs;
+
+ theOrder[theCount++] = EulOrdZYXr;
+ theOrder[theCount++] = EulOrdXYXr;
+ theOrder[theCount++] = EulOrdYZXr;
+ theOrder[theCount++] = EulOrdXZXr;
+ theOrder[theCount++] = EulOrdXZYr;
+ theOrder[theCount++] = EulOrdYZYr;
+ theOrder[theCount++] = EulOrdZXYr;
+ theOrder[theCount++] = EulOrdYXYr;
+ theOrder[theCount++] = EulOrdYXZr;
+ theOrder[theCount++] = EulOrdZXZr;
+ theOrder[theCount++] = EulOrdXYZr;
+ theOrder[theCount++] = EulOrdZYZr;
+
+ char theSubBuf[256];
+ m_OrderInfoBuffer[0] = '\0';
+ for (long theIndex = 0; theIndex < 24; ++theIndex) {
+ ::sprintf(theSubBuf, " %16s - %ld\n ", theOrderStr[theIndex], theOrder[theIndex]);
+ ::strcat(m_OrderInfoBuffer, theSubBuf);
+ }
+
+ return m_OrderInfoBuffer;
+ }
+}
+} // namespace Q3DStudio
diff --git a/src/runtimerender/Qt3DSRenderEulerAngles.h b/src/runtimerender/Qt3DSRenderEulerAngles.h
new file mode 100644
index 0000000..bf271e2
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderEulerAngles.h
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include <qmath.h>
+
+namespace qt3ds {
+namespace render {
+ //==============================================================================
+ // Description
+ //==============================================================================
+ // QuatTypes.h - Basic type declarations
+ // by Ken Shoemake, shoemake@graphics.cis.upenn.edu
+ // in "Graphics Gems IV", Academic Press, 1994
+ typedef struct
+ {
+ float x, y, z, w;
+ } Quat; /* Quaternion */
+ typedef float HMatrix[4][4]; /* Right-handed, for column vectors */
+ enum QuatPart { X, Y, Z, W };
+ typedef Quat EulerAngles; /* (x,y,z)=ang 1,2,3, w=order code */
+
+#define EulFrmS 0
+#define EulFrmR 1
+#define EulFrm(ord) ((unsigned)(ord)&1)
+#define EulRepNo 0
+#define EulRepYes 1
+#define EulRep(ord) (((unsigned)(ord) >> 1) & 1)
+#define EulParEven 0
+#define EulParOdd 1
+#define EulPar(ord) (((unsigned)(ord) >> 2) & 1)
+#define EulSafe "\000\001\002\000"
+#define EulNext "\001\002\000\001"
+#define EulAxI(ord) ((int)(EulSafe[(((unsigned)(ord) >> 3) & 3)]))
+#define EulAxJ(ord) ((int)(EulNext[EulAxI(ord) + (EulPar(ord) == EulParOdd)]))
+#define EulAxK(ord) ((int)(EulNext[EulAxI(ord) + (EulPar(ord) != EulParOdd)]))
+#define EulAxH(ord) ((EulRep(ord) == EulRepNo) ? EulAxK(ord) : EulAxI(ord))
+
+// EulGetOrd unpacks all useful information about order simultaneously.
+#define EulGetOrd(ord, i, j, k, h, n, s, f) \
+ { \
+ unsigned o = ord; \
+ f = o & 1; \
+ o = o >> 1; \
+ s = o & 1; \
+ o = o >> 1; \
+ n = o & 1; \
+ o = o >> 1; \
+ i = EulSafe[o & 3]; \
+ j = EulNext[i + n]; \
+ k = EulNext[i + 1 - n]; \
+ h = s ? k : i; \
+ }
+
+// EulOrd creates an order value between 0 and 23 from 4-tuple choices.
+#define EulOrd(i, p, r, f) (((((((i) << 1) + (p)) << 1) + (r)) << 1) + (f))
+
+// Static axes
+// X = 0, Y = 1, Z = 2 ref QuatPart
+#define EulOrdXYZs EulOrd(0, EulParEven, EulRepNo, EulFrmS)
+#define EulOrdXYXs EulOrd(0, EulParEven, EulRepYes, EulFrmS)
+#define EulOrdXZYs EulOrd(0, EulParOdd, EulRepNo, EulFrmS)
+#define EulOrdXZXs EulOrd(0, EulParOdd, EulRepYes, EulFrmS)
+#define EulOrdYZXs EulOrd(1, EulParEven, EulRepNo, EulFrmS)
+#define EulOrdYZYs EulOrd(1, EulParEven, EulRepYes, EulFrmS)
+#define EulOrdYXZs EulOrd(1, EulParOdd, EulRepNo, EulFrmS)
+#define EulOrdYXYs EulOrd(1, EulParOdd, EulRepYes, EulFrmS)
+#define EulOrdZXYs EulOrd(2, EulParEven, EulRepNo, EulFrmS)
+#define EulOrdZXZs EulOrd(2, EulParEven, EulRepYes, EulFrmS)
+#define EulOrdZYXs EulOrd(2, EulParOdd, EulRepNo, EulFrmS)
+#define EulOrdZYZs EulOrd(2, EulParOdd, EulRepYes, EulFrmS)
+
+// Rotating axes
+#define EulOrdZYXr EulOrd(0, EulParEven, EulRepNo, EulFrmR)
+#define EulOrdXYXr EulOrd(0, EulParEven, EulRepYes, EulFrmR)
+#define EulOrdYZXr EulOrd(0, EulParOdd, EulRepNo, EulFrmR)
+#define EulOrdXZXr EulOrd(0, EulParOdd, EulRepYes, EulFrmR)
+#define EulOrdXZYr EulOrd(1, EulParEven, EulRepNo, EulFrmR)
+#define EulOrdYZYr EulOrd(1, EulParEven, EulRepYes, EulFrmR)
+#define EulOrdZXYr EulOrd(1, EulParOdd, EulRepNo, EulFrmR)
+#define EulOrdYXYr EulOrd(1, EulParOdd, EulRepYes, EulFrmR)
+#define EulOrdYXZr EulOrd(2, EulParEven, EulRepNo, EulFrmR)
+#define EulOrdZXZr EulOrd(2, EulParEven, EulRepYes, EulFrmR)
+#define EulOrdXYZr EulOrd(2, EulParOdd, EulRepNo, EulFrmR)
+#define EulOrdZYZr EulOrd(2, EulParOdd, EulRepYes, EulFrmR)
+
+#ifndef M_PI
+#define M_PI 3.1415926535898
+#endif
+
+#define TODEG(x) x = (float)(x * 180 / M_PI);
+#define TORAD(x) x = (float)(x / 180 * M_PI);
+
+ class CEulerAngleConverter
+ {
+ private:
+ char m_OrderInfoBuffer[1024];
+
+ public:
+ CEulerAngleConverter();
+ virtual ~CEulerAngleConverter();
+
+ public:
+ EulerAngles Eul_(float ai, float aj, float ah, int order);
+ Quat Eul_ToQuat(EulerAngles ea);
+ void Eul_ToHMatrix(EulerAngles ea, HMatrix M);
+ EulerAngles Eul_FromHMatrix(HMatrix M, int order);
+ EulerAngles Eul_FromQuat(Quat q, int order);
+
+ // Debug Stuff
+ const char *DumpOrderInfo();
+ };
+}
+} // namespace Q3DStudio
diff --git a/src/runtimerender/Qt3DSRenderGpuProfiler.cpp b/src/runtimerender/Qt3DSRenderGpuProfiler.cpp
new file mode 100644
index 0000000..740d8a7
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderGpuProfiler.cpp
@@ -0,0 +1,284 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderProfiler.h"
+
+#include "EASTL/string.h"
+#include "EASTL/hash_map.h"
+
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSFoundation.h"
+
+#include "Qt3DSRenderContextCore.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderTimerQuery.h"
+#include "render/Qt3DSRenderSync.h"
+
+#define RECORDED_FRAME_DELAY 3
+#define RECORDED_FRAME_DELAY_MASK 0x0003
+
+using namespace qt3ds::render;
+
+namespace {
+
+using eastl::make_pair;
+
+struct SGpuTimerInfo
+{
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+ bool m_AbsoluteTime;
+ QT3DSU16 m_WriteID;
+ QT3DSU16 m_ReadID;
+ QT3DSU16 m_AverageTimeWriteID;
+ QT3DSU64 m_AverageTime[10];
+ QT3DSU32 m_FrameID[RECORDED_FRAME_DELAY];
+ NVScopedRefCounted<NVRenderTimerQuery> m_TimerStartQueryObjects[RECORDED_FRAME_DELAY];
+ NVScopedRefCounted<NVRenderTimerQuery> m_TimerEndQueryObjects[RECORDED_FRAME_DELAY];
+ NVScopedRefCounted<NVRenderSync> m_TimerSyncObjects[RECORDED_FRAME_DELAY];
+
+ SGpuTimerInfo(NVFoundationBase &inFoundation)
+ : m_Foundation(inFoundation)
+ , mRefCount(0)
+ , m_AbsoluteTime(false)
+ , m_WriteID(0)
+ , m_ReadID(0)
+ , m_AverageTimeWriteID(0)
+ {
+ memset(m_AverageTime, 0x0, 10 * sizeof(QT3DSU64));
+ }
+
+ ~SGpuTimerInfo() {}
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ void IncrementWriteCounter()
+ {
+ m_WriteID++;
+ m_WriteID %= RECORDED_FRAME_DELAY_MASK;
+ }
+
+ void IncrementReadCounter()
+ {
+ m_ReadID++;
+ m_ReadID %= RECORDED_FRAME_DELAY_MASK;
+ }
+
+ void IncrementAveragedWriteCounter()
+ {
+ m_AverageTimeWriteID++;
+ m_AverageTimeWriteID %= 10;
+ }
+
+ void StartTimerQuery(QT3DSU32 frameID)
+ {
+ m_FrameID[m_WriteID] = frameID;
+
+ if (m_AbsoluteTime)
+ m_TimerStartQueryObjects[m_WriteID]->SetTimerQuery();
+ else
+ m_TimerStartQueryObjects[m_WriteID]->Begin();
+ }
+
+ void EndTimerQuery()
+ {
+ if (m_AbsoluteTime)
+ m_TimerEndQueryObjects[m_WriteID]->SetTimerQuery();
+ else
+ m_TimerStartQueryObjects[m_WriteID]->End();
+
+ IncrementWriteCounter();
+ }
+
+ void AddSync()
+ {
+ m_TimerSyncObjects[m_WriteID]->Sync();
+ m_TimerSyncObjects[m_WriteID]->Wait();
+ }
+
+ QT3DSF64 GetAveragedElapsedTimeInMs()
+ {
+ QT3DSF64 time =
+ QT3DSF64(((m_AverageTime[0] + m_AverageTime[1] + m_AverageTime[2] + m_AverageTime[3]
+ + m_AverageTime[4] + m_AverageTime[5] + m_AverageTime[6] + m_AverageTime[7]
+ + m_AverageTime[8] + m_AverageTime[9])
+ / 10)
+ / 1e06);
+
+ return time;
+ }
+
+ QT3DSF64 GetElapsedTimeInMs(QT3DSU32 frameID)
+ {
+ QT3DSF64 time = 0;
+
+ if (((frameID - m_FrameID[m_ReadID]) < 2) || (m_ReadID == m_WriteID))
+ return time;
+
+ if (m_AbsoluteTime) {
+ QT3DSU64 startTime, endTime;
+
+ m_TimerStartQueryObjects[m_ReadID]->GetResult(&startTime);
+ m_TimerEndQueryObjects[m_ReadID]->GetResult(&endTime);
+
+ m_AverageTime[m_AverageTimeWriteID] = endTime - startTime;
+ } else {
+ QT3DSU64 elapsedTime;
+
+ m_TimerStartQueryObjects[m_ReadID]->GetResult(&elapsedTime);
+
+ m_AverageTime[m_AverageTimeWriteID] = elapsedTime;
+ }
+
+ IncrementReadCounter();
+ IncrementAveragedWriteCounter();
+
+ return GetAveragedElapsedTimeInMs();
+ }
+};
+
+class Qt3DSCRenderGpuProfiler : public IRenderProfiler
+{
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<SGpuTimerInfo>> TStrGpuTimerInfoMap;
+
+private:
+ NVFoundationBase &m_Foundation;
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+ IQt3DSRenderContext &m_Context;
+ volatile QT3DSI32 mRefCount;
+
+ TStrGpuTimerInfoMap m_StrToGpuTimerMap;
+ IRenderProfiler::TStrIDVec m_StrToIDVec;
+ mutable QT3DSU32 m_VertexCount;
+
+public:
+ Qt3DSCRenderGpuProfiler(NVFoundationBase &inFoundation, IQt3DSRenderContext &inContext,
+ NVRenderContext &inRenderContext)
+ : m_Foundation(inFoundation)
+ , m_RenderContext(inRenderContext)
+ , m_Context(inContext)
+ , mRefCount(0)
+ , m_StrToGpuTimerMap(inContext.GetAllocator(), "Qt3DSRenderGpuProfiler::m_StrToGpuTimerMap")
+ , m_StrToIDVec(inContext.GetAllocator(), "Qt3DSRenderGpuProfiler::m_StrToIDVec")
+ , m_VertexCount(0)
+ {
+ }
+
+ virtual ~Qt3DSCRenderGpuProfiler() { m_StrToGpuTimerMap.clear(); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ void StartTimer(CRegisteredString &nameID, bool absoluteTime, bool sync) override
+ {
+ SGpuTimerInfo *theGpuTimerData = GetOrCreateGpuTimerInfo(nameID);
+
+ if (theGpuTimerData) {
+ if (sync)
+ theGpuTimerData->AddSync();
+
+ theGpuTimerData->m_AbsoluteTime = absoluteTime;
+ theGpuTimerData->StartTimerQuery(m_Context.GetFrameCount());
+ }
+ }
+
+ void EndTimer(CRegisteredString &nameID) override
+ {
+ SGpuTimerInfo *theGpuTimerData = GetOrCreateGpuTimerInfo(nameID);
+
+ if (theGpuTimerData) {
+ theGpuTimerData->EndTimerQuery();
+ }
+ }
+
+ QT3DSF64 GetElapsedTime(const CRegisteredString &nameID) const override
+ {
+ QT3DSF64 time = 0;
+ SGpuTimerInfo *theGpuTimerData = GetGpuTimerInfo(nameID);
+
+ if (theGpuTimerData) {
+ time = theGpuTimerData->GetElapsedTimeInMs(m_Context.GetFrameCount());
+ }
+
+ return time;
+ }
+
+ const TStrIDVec &GetTimerIDs() const override { return m_StrToIDVec; }
+
+ void AddVertexCount(QT3DSU32 count) override { m_VertexCount += count; }
+
+ QT3DSU32 GetAndResetTriangleCount() const override
+ {
+ QT3DSU32 tris = m_VertexCount / 3;
+ m_VertexCount = 0;
+ return tris;
+ }
+
+private:
+ SGpuTimerInfo *GetOrCreateGpuTimerInfo(CRegisteredString &nameID)
+ {
+ TStrGpuTimerInfoMap::const_iterator theIter = m_StrToGpuTimerMap.find(nameID);
+ if (theIter != m_StrToGpuTimerMap.end())
+ return const_cast<SGpuTimerInfo *>(theIter->second.mPtr);
+
+ SGpuTimerInfo *theGpuTimerData =
+ QT3DS_NEW(m_Context.GetAllocator(), SGpuTimerInfo)(m_Foundation);
+
+ if (theGpuTimerData) {
+ // create queries
+ for (QT3DSU32 i = 0; i < RECORDED_FRAME_DELAY; i++) {
+ theGpuTimerData->m_TimerStartQueryObjects[i] = m_RenderContext->CreateTimerQuery();
+ theGpuTimerData->m_TimerEndQueryObjects[i] = m_RenderContext->CreateTimerQuery();
+ theGpuTimerData->m_TimerSyncObjects[i] = m_RenderContext->CreateSync();
+ theGpuTimerData->m_FrameID[i] = 0;
+ }
+ m_StrToGpuTimerMap.insert(make_pair(nameID, theGpuTimerData));
+ m_StrToIDVec.push_back(nameID);
+ }
+
+ return theGpuTimerData;
+ }
+
+ SGpuTimerInfo *GetGpuTimerInfo(const CRegisteredString &nameID) const
+ {
+ TStrGpuTimerInfoMap::const_iterator theIter = m_StrToGpuTimerMap.find(nameID);
+ if (theIter != m_StrToGpuTimerMap.end())
+ return const_cast<SGpuTimerInfo *>(theIter->second.mPtr);
+
+ return NULL;
+ }
+};
+}
+
+IRenderProfiler &IRenderProfiler::CreateGpuProfiler(NVFoundationBase &inFnd,
+ IQt3DSRenderContext &inContext,
+ NVRenderContext &inRenderContext)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), Qt3DSCRenderGpuProfiler)(inFnd, inContext, inRenderContext);
+}
diff --git a/src/runtimerender/Qt3DSRenderGraphObjectPickQuery.h b/src/runtimerender/Qt3DSRenderGraphObjectPickQuery.h
new file mode 100644
index 0000000..e63cad3
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderGraphObjectPickQuery.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_GRAPH_OBJECT_PICK_QUERY_H
+#define QT3DS_RENDER_GRAPH_OBJECT_PICK_QUERY_H
+
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSMat44.h"
+#include "Qt3DSRenderImage.h"
+
+namespace qt3ds {
+namespace render {
+
+ class IOffscreenRenderer;
+
+ struct Qt3DSRenderPickSubResult
+ {
+ IOffscreenRenderer *m_SubRenderer;
+ QT3DSMat44 m_TextureMatrix;
+ NVRenderTextureCoordOp::Enum m_HorizontalTilingMode;
+ NVRenderTextureCoordOp::Enum m_VerticalTilingMode;
+ QT3DSU32 m_ViewportWidth;
+ QT3DSU32 m_ViewportHeight;
+ Qt3DSRenderPickSubResult *m_NextSibling;
+
+ Qt3DSRenderPickSubResult()
+ : m_SubRenderer(NULL)
+ , m_NextSibling(NULL)
+ {
+ }
+ Qt3DSRenderPickSubResult(IOffscreenRenderer &inSubRenderer, QT3DSMat44 inTextureMatrix,
+ NVRenderTextureCoordOp::Enum inHorizontalTilingMode,
+ NVRenderTextureCoordOp::Enum inVerticalTilingMode, QT3DSU32 width,
+ QT3DSU32 height)
+ : m_SubRenderer(&inSubRenderer)
+ , m_TextureMatrix(inTextureMatrix)
+ , m_HorizontalTilingMode(inHorizontalTilingMode)
+ , m_VerticalTilingMode(inVerticalTilingMode)
+ , m_ViewportWidth(width)
+ , m_ViewportHeight(height)
+ , m_NextSibling(NULL)
+ {
+ }
+ };
+
+ struct Qt3DSRenderPickResult
+ {
+ const SGraphObject *m_HitObject;
+ QT3DSF32 m_CameraDistanceSq;
+ // The local coordinates in X,Y UV space where the hit occured
+ QT3DSVec2 m_LocalUVCoords;
+ // The local mouse coordinates will be the same on all of the sub objects.
+ Qt3DSRenderPickSubResult *m_FirstSubObject;
+ // The offscreen renderer that was used to render the scene graph this result was produced
+ // from.
+ IOffscreenRenderer *m_OffscreenRenderer;
+
+ Qt3DSRenderPickResult(const SGraphObject &inHitObject, QT3DSF32 inCameraDistance,
+ const QT3DSVec2 &inLocalUVCoords)
+ : m_HitObject(&inHitObject)
+ , m_CameraDistanceSq(inCameraDistance)
+ , m_LocalUVCoords(inLocalUVCoords)
+ , m_FirstSubObject(NULL)
+ , m_OffscreenRenderer(NULL)
+ {
+ }
+ Qt3DSRenderPickResult()
+ : m_HitObject(NULL)
+ , m_CameraDistanceSq(QT3DS_MAX_F32)
+ , m_LocalUVCoords(0, 0)
+ , m_FirstSubObject(NULL)
+ , m_OffscreenRenderer(NULL)
+ {
+ }
+ };
+
+ class IGraphObjectPickQuery
+ {
+ protected:
+ virtual ~IGraphObjectPickQuery() {}
+
+ public:
+ // Implementors have the option of batching the results to allow fewer virtual calls
+ // or returning one item each pick.
+ // Results are guaranteed to be returned nearest to furthest
+ // If the return value has size of zero then we assume nothing more can be picked and the
+ // pick
+ // is finished.
+ virtual Qt3DSRenderPickResult Pick(const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool inPickEverything) = 0;
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderGraphObjectSerializer.cpp b/src/runtimerender/Qt3DSRenderGraphObjectSerializer.cpp
new file mode 100644
index 0000000..358c5aa
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderGraphObjectSerializer.cpp
@@ -0,0 +1,670 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderGraphObjectSerializer.h"
+#include "Qt3DSRenderPresentation.h"
+#include "Qt3DSRenderNode.h"
+#include "Qt3DSRenderScene.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderModel.h"
+#include "Qt3DSRenderText.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSRenderEffect.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderCustomMaterial.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSContainers.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "foundation/SerializationTypes.h"
+#include "StringTools.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSRenderPluginGraphObject.h"
+#include "Qt3DSRenderReferencedMaterial.h"
+#include "Qt3DSRenderPath.h"
+#include "Qt3DSRenderPathSubPath.h"
+#include "Qt3DSRenderPathManager.h"
+
+using namespace qt3ds::render;
+using namespace qt3ds::render::dynamic;
+
+namespace {
+typedef nvhash_set<void *> TPtrSet;
+
+void Align(MemoryBuffer<> &inBuffer)
+{
+ inBuffer.align(sizeof(void *));
+}
+typedef nvvector<eastl::pair<GraphObjectTypes::Enum, QT3DSU32>> TObjectFileStatList;
+typedef SPtrOffsetMap TPtrOffsetMap;
+
+struct SSerializerWriteContext
+{
+ SPtrOffsetMap &m_OffsetMap;
+ SWriteBuffer &m_MemoryBuffer;
+ const SStrRemapMap &m_StrRemapMap;
+ QT3DSU32 m_DataBlockStart;
+ IDynamicObjectSystem &m_DynamicObjectSystem;
+ IPathManager &m_PathManager;
+ TObjectFileStatList &m_FileSizeStats;
+ Qt3DSString m_PathMapper;
+ Qt3DSString m_BasePath;
+ Qt3DSString m_RelativePath;
+ IStringTable &m_StringTable;
+ SSerializerWriteContext(SPtrOffsetMap &inOffsetMap, SWriteBuffer &inWriteBuffer,
+ const SStrRemapMap &inStrMap, QT3DSU32 inDataBlockStart,
+ IDynamicObjectSystem &inDynamicObjectSystem,
+ IPathManager &inPathManager, TObjectFileStatList &inStats,
+ NVAllocatorCallback &inAllocator, const char8_t *inProjectDirectory,
+ IStringTable &inStringTable)
+ : m_OffsetMap(inOffsetMap)
+ , m_MemoryBuffer(inWriteBuffer)
+ , m_StrRemapMap(inStrMap)
+ , m_DataBlockStart(inDataBlockStart)
+ , m_DynamicObjectSystem(inDynamicObjectSystem)
+ , m_PathManager(inPathManager)
+ , m_FileSizeStats(inStats)
+ , m_StringTable(inStringTable)
+ {
+ Q_UNUSED(inAllocator)
+ m_BasePath.assign(inProjectDirectory);
+ }
+
+ bool HasWrittenObject(const void *inObject) { return m_OffsetMap.contains(inObject); }
+
+ QT3DSU32 &GetStatEntry(GraphObjectTypes::Enum inType) const
+ {
+ for (QT3DSU32 idx = 0, end = m_FileSizeStats.size(); idx < end; ++idx)
+ if (m_FileSizeStats[idx].first == inType)
+ return m_FileSizeStats[idx].second;
+ m_FileSizeStats.push_back(eastl::make_pair(inType, (QT3DSU32)0));
+ return m_FileSizeStats.back().second;
+ }
+
+ template <typename TObjType>
+ void AddPtrOffset(const TObjType *inObject)
+ {
+ QT3DSU32 objOffset = m_MemoryBuffer.size() - m_DataBlockStart;
+ m_OffsetMap.insert(eastl::make_pair(inObject, objOffset));
+// In debug we keep stats on how much each type of object
+// contributes to the file size.
+#ifdef _DEBUG
+ GetStatEntry(inObject->m_Type) += sizeof(TObjType);
+#endif
+ }
+
+ void Remap(CRegisteredString &inStr) { inStr.Remap(m_StrRemapMap); }
+
+ template <typename TObjType>
+ void Remap(TObjType *&inPtr)
+ {
+ if (inPtr) {
+ TPtrOffsetMap::iterator theIter = m_OffsetMap.find(inPtr);
+ if (theIter != m_OffsetMap.end())
+ inPtr = reinterpret_cast<TObjType *>(theIter->second);
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ void RemapMaterial(SGraphObject *&inPtr) { Remap(inPtr); }
+
+ template <typename TObjType>
+ void NullPtr(TObjType *&inPtr)
+ {
+ inPtr = NULL;
+ }
+};
+
+///////////////////////////////////////////////////////////////////////
+// --** Reading the scene graph is heavily threaded when we are loading
+// multiple presentations in one application --**
+///////////////////////////////////////////////////////////////////////
+struct SSerializerReadContext : public SDataReader
+{
+ IPathManagerCore &m_PathManager;
+ IDynamicObjectSystemCore &m_DynamicObjectSystem;
+ NVDataRef<QT3DSU8> m_DataBlock;
+ NVDataRef<QT3DSU8> m_StrTableBlock;
+ Qt3DSString m_PathMapper;
+ const char8_t *m_ProjectDirectory;
+
+ SSerializerReadContext(IPathManagerCore &inPathManager, IDynamicObjectSystemCore &inDynSystem,
+ NVDataRef<QT3DSU8> inDataBlock, NVDataRef<QT3DSU8> inStrTable,
+ NVAllocatorCallback &inAllocator, const char8_t *inProjectDirectory)
+ : SDataReader(inDataBlock.begin(), inDataBlock.end())
+ , m_PathManager(inPathManager)
+ , m_DynamicObjectSystem(inDynSystem)
+ , m_DataBlock(inDataBlock)
+ , m_StrTableBlock(inStrTable)
+ , m_ProjectDirectory(inProjectDirectory)
+ {
+ Q_UNUSED(inAllocator)
+ }
+ void Remap(CRegisteredString &inStr) { inStr.Remap(m_StrTableBlock); }
+ template <typename TObjType>
+ void Remap(TObjType *&inPtr)
+ {
+ if (inPtr) {
+ TObjType *purePtr = inPtr;
+ size_t ptrValue = reinterpret_cast<size_t>(purePtr);
+ if (ptrValue < m_DataBlock.size())
+ inPtr = reinterpret_cast<TObjType *>(m_DataBlock.begin() + ptrValue);
+ else {
+ QT3DS_ASSERT(false);
+ inPtr = NULL;
+ }
+ }
+ }
+ void RemapMaterial(SGraphObject *&inPtr) { Remap(inPtr); }
+ // Nulling out pointers was done on write, so we don't do it here.
+ template <typename TObjType>
+ void NullPtr(TObjType *&)
+ {
+ }
+};
+
+template <typename TObjType>
+struct SGraphObjectSerializerImpl
+{
+ static TObjType *Write(const TObjType &ioObject, SSerializerWriteContext &outSavedBuffer);
+ static void Remap(TObjType &inObject, SSerializerWriteContext &inRemapContext);
+ static TObjType *Read(SSerializerReadContext &inReadContext);
+};
+
+struct SWriteRemapper
+{
+ SSerializerWriteContext &m_WriteBuffer;
+ SWriteRemapper(SSerializerWriteContext &buf)
+ : m_WriteBuffer(buf)
+ {
+ }
+ // This will happen later
+ void Remap(const CRegisteredString &) {}
+ void RemapPath(const CRegisteredString &) {}
+
+ // We ignore objects that are saved out explicitly below.
+ void Remap(const SScene *) {}
+
+ void Remap(const SLayer *) {}
+ // Nodes are ignored because we save them out *not* in depth first order,
+ // with models, text, lights and camera saved out contiguously for in-memory
+ // traversal.
+ void Remap(const SNode *) {}
+#ifdef _INTEGRITYPLATFORM
+ // explicit specialization of class "<unnamed>::SGraphObjectSerializerImpl<qt3ds::render::SCustomMaterial>"
+ // must precede its first use struct SGraphObjectSerializerImpl<SCustomMaterial>
+ template <typename TObjType>
+ void Remap(const TObjType *inObj);
+#else
+ template <typename TObjType>
+ void Remap(const TObjType *inObj)
+ {
+ if (inObj)
+ SGraphObjectSerializerImpl<TObjType>::Write(*inObj, m_WriteBuffer);
+ }
+#endif
+
+ void RemapMaterial(const SGraphObject *inObj)
+ {
+ if (inObj) {
+ if (inObj->m_Type == GraphObjectTypes::DefaultMaterial)
+ Remap(static_cast<const SDefaultMaterial *>(inObj));
+ else if (inObj->m_Type == GraphObjectTypes::CustomMaterial)
+ Remap(static_cast<const SCustomMaterial *>(inObj));
+ else if (inObj->m_Type == GraphObjectTypes::ReferencedMaterial)
+ Remap(static_cast<const SReferencedMaterial *>(inObj));
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ template <typename TObjType>
+ void NullPtr(const TObjType *)
+ {
+ }
+};
+
+void PrepareFirstPass(const SNode &inNode, nvvector<const SNode *> &ioLightCameras,
+ nvvector<const SNode *> &ioRenderable)
+{
+ if (GraphObjectTypes::IsRenderableType(inNode.m_Type))
+ ioRenderable.push_back(&inNode);
+ else if (GraphObjectTypes::IsLightCameraType(inNode.m_Type))
+ ioLightCameras.push_back(&inNode);
+
+ for (const SNode *theChild = inNode.m_FirstChild; theChild; theChild = theChild->m_NextSibling)
+ PrepareFirstPass(*theChild, ioLightCameras, ioRenderable);
+}
+
+template <typename TObject>
+TObject *WriteGenericGraphObjectNoRemap(const TObject &ioObject,
+ SSerializerWriteContext &outSavedBuffer)
+{
+ if (outSavedBuffer.HasWrittenObject(&ioObject))
+ return NULL;
+
+ outSavedBuffer.AddPtrOffset(&ioObject);
+ QT3DSU32 theOffset = outSavedBuffer.m_MemoryBuffer.size();
+ outSavedBuffer.m_MemoryBuffer.write(ioObject);
+ // Probably the buffer stays aligned but we want to work to keep it that way.
+ Align(outSavedBuffer.m_MemoryBuffer);
+ return reinterpret_cast<TObject *>(outSavedBuffer.m_MemoryBuffer.begin() + theOffset);
+}
+
+template <typename TObject>
+TObject *WriteGenericGraphObject(const TObject &ioObject, SSerializerWriteContext &outSavedBuffer)
+{
+ TObject *theObject = WriteGenericGraphObjectNoRemap(ioObject, outSavedBuffer);
+ if (theObject) // The object may have already been written.
+ {
+ // Write mappers just follow pointers and ensure all the associated objects
+ // are written out.
+ SWriteRemapper theWriteRemapper(outSavedBuffer);
+ const_cast<TObject &>(ioObject).Remap(theWriteRemapper);
+ }
+ return theObject;
+}
+
+template <typename TObject>
+TObject *ReadGenericGraphObject(SSerializerReadContext &inReadContext)
+{
+ TObject *retval = inReadContext.Load<TObject>();
+ inReadContext.Align();
+ if (retval) {
+ retval->Remap(inReadContext);
+ }
+ return retval;
+}
+
+template <typename TObjType>
+TObjType *SGraphObjectSerializerImpl<TObjType>::Write(const TObjType &ioObject,
+ SSerializerWriteContext &outSavedBuffer)
+{
+ return WriteGenericGraphObject(ioObject, outSavedBuffer);
+}
+template <typename TObjType>
+void SGraphObjectSerializerImpl<TObjType>::Remap(TObjType &ioObject,
+ SSerializerWriteContext &inRemapContext)
+{
+ return ioObject.Remap(inRemapContext);
+}
+
+template <typename TObjType>
+TObjType *SGraphObjectSerializerImpl<TObjType>::Read(SSerializerReadContext &inReadContext)
+{
+ return ReadGenericGraphObject<TObjType>(inReadContext);
+}
+
+void RemapProperties(SDynamicObject &ioObject, SSerializerWriteContext &outSavedBuffer,
+ CRegisteredString inClassName)
+{
+ NVConstDataRef<SPropertyDefinition> theObjectProps =
+ outSavedBuffer.m_DynamicObjectSystem.GetProperties(inClassName);
+ for (QT3DSU32 idx = 0, end = theObjectProps.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDef(theObjectProps[idx]);
+ if (theDef.m_DataType == qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ CRegisteredString *theStr = reinterpret_cast<CRegisteredString *>(
+ ioObject.GetDataSectionBegin() + theDef.m_Offset);
+ outSavedBuffer.Remap(*theStr);
+ }
+ }
+}
+
+void RemapProperties(SDynamicObject &ioObject, SSerializerReadContext &inReadContext)
+{
+ // CN - !!Note this call is done on multiple threads simultaneously. I added a mutex just to be
+ // sure even though
+ // this is a read-only call; I am not certain how good the arm memory locking is when it is
+ // completely unprotected.
+ NVConstDataRef<SPropertyDefinition> theProperties =
+ inReadContext.m_DynamicObjectSystem.GetProperties(ioObject.m_ClassName);
+ for (QT3DSU32 idx = 0, end = theProperties.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(theProperties[idx]);
+ if (theDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ CRegisteredString *theString = reinterpret_cast<CRegisteredString *>(
+ ioObject.GetDataSectionBegin() + theDefinition.m_Offset);
+ inReadContext.Remap(*theString);
+ }
+ }
+}
+
+template <>
+struct SGraphObjectSerializerImpl<SEffect>
+{
+ static SGraphObject *Write(const SEffect &ioObject, SSerializerWriteContext &outSavedBuffer)
+ {
+ size_t itemOffset = outSavedBuffer.m_MemoryBuffer.size();
+ SEffect *theNewEffect =
+ static_cast<SEffect *>(WriteGenericGraphObjectNoRemap(ioObject, outSavedBuffer));
+ if (theNewEffect) {
+ theNewEffect->m_Context = NULL;
+ // Writing it out is easy. Reading it back in means we have to have a correctly setup
+ // IEffectManager so we
+ // can remap strings.
+ outSavedBuffer.m_MemoryBuffer.write(ioObject.GetDataSectionBegin(),
+ ioObject.m_DataSectionByteSize);
+ Align(outSavedBuffer.m_MemoryBuffer);
+ SWriteRemapper theWriteRemapper(outSavedBuffer);
+ // Write any connected objects.
+ theNewEffect =
+ reinterpret_cast<SEffect *>(outSavedBuffer.m_MemoryBuffer.begin() + itemOffset);
+ theNewEffect->Remap(theWriteRemapper);
+ }
+ return theNewEffect;
+ }
+
+ static void Remap(SEffect &ioObject, SSerializerWriteContext &outSavedBuffer)
+ {
+ CRegisteredString theClassName = ioObject.m_ClassName;
+ ioObject.Remap(outSavedBuffer);
+ RemapProperties(ioObject, outSavedBuffer, theClassName);
+ }
+
+ static SEffect *Read(SSerializerReadContext &inReadContext)
+ {
+ SEffect *theEffect = ReadGenericGraphObject<SEffect>(inReadContext);
+ if (theEffect) {
+ inReadContext.m_CurrentPtr += theEffect->m_DataSectionByteSize;
+ inReadContext.Align();
+ RemapProperties(*theEffect, inReadContext);
+ }
+ return theEffect;
+ }
+};
+
+template <>
+struct SGraphObjectSerializerImpl<SCustomMaterial>
+{
+ static SGraphObject *Write(const SCustomMaterial &ioObject,
+ SSerializerWriteContext &outSavedBuffer)
+ {
+ size_t itemOffset = outSavedBuffer.m_MemoryBuffer.size();
+ SCustomMaterial *theNewObject = static_cast<SCustomMaterial *>(
+ WriteGenericGraphObjectNoRemap(ioObject, outSavedBuffer));
+ if (theNewObject) {
+ // Writing it out is easy. Reading it back in means we have to have a correctly setup
+ // IEffectManager so we
+ // can remap strings.
+ outSavedBuffer.m_MemoryBuffer.write(ioObject.GetDataSectionBegin(),
+ ioObject.m_DataSectionByteSize);
+ Align(outSavedBuffer.m_MemoryBuffer);
+ theNewObject = reinterpret_cast<SCustomMaterial *>(outSavedBuffer.m_MemoryBuffer.begin()
+ + itemOffset);
+ SWriteRemapper theWriteRemapper(outSavedBuffer);
+ // Write any connected objects.
+ theNewObject->Remap(theWriteRemapper);
+ }
+ return theNewObject;
+ }
+
+ static void Remap(SCustomMaterial &ioObject, SSerializerWriteContext &outSavedBuffer)
+ {
+ CRegisteredString theClassName(ioObject.m_ClassName);
+ ioObject.Remap(outSavedBuffer);
+ RemapProperties(ioObject, outSavedBuffer, theClassName);
+ }
+
+ static SCustomMaterial *Read(SSerializerReadContext &inReadContext)
+ {
+ SCustomMaterial *theMaterial = ReadGenericGraphObject<SCustomMaterial>(inReadContext);
+ if (theMaterial) {
+ inReadContext.m_CurrentPtr += theMaterial->m_DataSectionByteSize;
+ inReadContext.Align();
+ RemapProperties(*theMaterial, inReadContext);
+ }
+ return theMaterial;
+ }
+};
+
+#ifdef _INTEGRITYPLATFORM
+ template <typename TObjType>
+ void SWriteRemapper::Remap(const TObjType *inObj)
+ {
+ if (inObj)
+ SGraphObjectSerializerImpl<TObjType>::Write(*inObj, m_WriteBuffer);
+ }
+#endif
+
+template <>
+struct SGraphObjectSerializerImpl<SPathSubPath>
+{
+ static SGraphObject *Write(const SPathSubPath &ioObject,
+ SSerializerWriteContext &outSavedBuffer)
+ {
+ SPathSubPath *theObject = WriteGenericGraphObjectNoRemap(ioObject, outSavedBuffer);
+ if (theObject) // The object may have already been written.
+ {
+ NVConstDataRef<SPathAnchorPoint> thePoints =
+ outSavedBuffer.m_PathManager.GetPathSubPathBuffer(ioObject);
+ outSavedBuffer.m_MemoryBuffer.write((QT3DSU32)thePoints.size());
+ outSavedBuffer.m_MemoryBuffer.write(thePoints.begin(), thePoints.size());
+ // Write mappers just follow pointers and ensure all the associated objects
+ // are written out.
+ SWriteRemapper theWriteRemapper(outSavedBuffer);
+ const_cast<SPathSubPath &>(ioObject).Remap(theWriteRemapper);
+ }
+ return theObject;
+ }
+
+ static void Remap(SPathSubPath &ioObject, SSerializerWriteContext &outSavedBuffer)
+ {
+ ioObject.Remap(outSavedBuffer);
+ }
+
+ static SPathSubPath *Read(SSerializerReadContext &inReadContext)
+ {
+ SPathSubPath *theSubPath = ReadGenericGraphObject<SPathSubPath>(inReadContext);
+ if (theSubPath) {
+ QT3DSU32 numPoints = *inReadContext.Load<QT3DSU32>();
+ SPathAnchorPoint *theAnchorPointBuffer =
+ reinterpret_cast<qt3ds::render::SPathAnchorPoint *>(inReadContext.m_CurrentPtr);
+ inReadContext.m_CurrentPtr += sizeof(SPathAnchorPoint) * numPoints;
+
+ // CN - !!Note this call is done on multiple threads simultaneously. I added a mutex to
+ // the path manager object
+ // so this exact call is always protected. This absolutely caused crashing when it was
+ // not protected approriately.
+ inReadContext.m_PathManager.SetPathSubPathData(
+ *theSubPath, toConstDataRef(theAnchorPointBuffer, numPoints));
+ }
+ return theSubPath;
+ }
+};
+
+void WriteGraphObject(const SGraphObject &inObject, SSerializerWriteContext &outSavedBuffer)
+{
+ SGraphObject *newObject = NULL;
+ switch (inObject.m_Type) {
+#define QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(type) \
+ case GraphObjectTypes::type: \
+ newObject = SGraphObjectSerializerImpl<S##type>::Write( \
+ static_cast<const S##type &>(inObject), outSavedBuffer); \
+ break;
+ QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES
+#undef QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+}
+
+void WriteNodeList(nvvector<const SNode *> &inList, SSerializerWriteContext &outSavedBuffer)
+{
+ for (QT3DSU32 idx = 0, end = inList.size(); idx < end; ++idx)
+ WriteGraphObject(*inList[idx], outSavedBuffer);
+}
+
+// Now write everything you haven't written so far, skip writing renderables or cameras or lights
+void WriteNonRenderableNonCLNode(const SNode &inNode, SSerializerWriteContext &outSavedBuffer)
+{
+ if (GraphObjectTypes::IsLightCameraType(inNode.m_Type) == false
+ && GraphObjectTypes::IsRenderableType(inNode.m_Type) == false) {
+ WriteGraphObject(inNode, outSavedBuffer);
+ }
+ for (const SNode *theChild = inNode.m_FirstChild; theChild; theChild = theChild->m_NextSibling)
+ WriteNonRenderableNonCLNode(*theChild, outSavedBuffer);
+}
+
+SGraphObject *ReadGraphObject(SSerializerReadContext &inContext)
+{
+ if (inContext.m_CurrentPtr + sizeof(SGraphObject) < inContext.m_EndPtr) {
+ SGraphObject *theObject = reinterpret_cast<SGraphObject *>(inContext.m_CurrentPtr);
+ switch (theObject->m_Type) {
+#define QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(type) \
+ case GraphObjectTypes::type: \
+ SGraphObjectSerializerImpl<S##type>::Read(inContext); \
+ break;
+ QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES
+#undef QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ theObject = NULL;
+ break;
+ }
+ return theObject;
+ }
+ return NULL;
+}
+}
+
+void SGraphObjectSerializer::Save(NVFoundationBase &inFoundation,
+ const SPresentation &inPresentation,
+ qt3ds::render::SWriteBuffer &outSavedData,
+ IDynamicObjectSystem &inDynamicObjectSystem,
+ IPathManager &inPathManager, SPtrOffsetMap &outSceneGraphOffsets,
+ IStringTable &inStringTable,
+ NVDataRef<SGraphObject *> inExtraGraphObjects)
+{
+ using namespace qt3ds::foundation;
+ nvvector<const SNode *> theLightCameraList(inFoundation.getAllocator(),
+ "SGraphObjectSerializer::theLightCameraList");
+ nvvector<const SNode *> theRenderableList(inFoundation.getAllocator(),
+ "SGraphObjectSerializer::theRenderableList");
+ TObjectFileStatList theStatList(inFoundation.getAllocator(),
+ "SGraphObjectSerializer::FileSizeStats");
+ // We want to save out the scene graph in the order we are going to traverse it normally.
+ // This is reverse depth first for the lights, cameras, and renderables and depth first for
+ // everything else so we go
+ // in two passes per layer.
+ // We expect the incoming data buffer to be aligned already.
+ QT3DS_ASSERT(outSavedData.size() % 4 == 0);
+ if (inPresentation.m_Scene) {
+ QT3DSU32 theDataSectionStart = outSavedData.size();
+ outSavedData.writeZeros(4);
+ SSerializerWriteContext theWriteContext(
+ outSceneGraphOffsets, outSavedData, inStringTable.GetRemapMap(), theDataSectionStart,
+ inDynamicObjectSystem, inPathManager, theStatList, inFoundation.getAllocator(),
+ inPresentation.m_PresentationDirectory, inStringTable);
+ // First pass, just write out the data.
+ WriteGraphObject(inPresentation, theWriteContext);
+ WriteGraphObject(*inPresentation.m_Scene, theWriteContext);
+ for (const SLayer *theLayer = inPresentation.m_Scene->m_FirstChild; theLayer;
+ theLayer = static_cast<const SLayer *>(theLayer->m_NextSibling)) {
+ theLightCameraList.clear();
+ theRenderableList.clear();
+ PrepareFirstPass(*theLayer, theLightCameraList, theRenderableList);
+ eastl::reverse(theLightCameraList.begin(), theLightCameraList.end());
+ eastl::reverse(theRenderableList.begin(), theRenderableList.end());
+ WriteNodeList(theLightCameraList, theWriteContext);
+ WriteNodeList(theRenderableList, theWriteContext);
+ }
+ // Now just write everything *but* renderable objects and cameras.
+ for (const SLayer *theLayer = inPresentation.m_Scene->m_FirstChild; theLayer;
+ theLayer = static_cast<const SLayer *>(theLayer->m_NextSibling)) {
+ WriteNonRenderableNonCLNode(*theLayer, theWriteContext);
+ }
+ // Write out any extra objects we haven't covered yet.
+ for (QT3DSU32 idx = 0, end = inExtraGraphObjects.size(); idx < end; ++idx)
+ WriteGraphObject(*inExtraGraphObjects[idx], theWriteContext);
+
+ QT3DSU32 theNumObjects = theWriteContext.m_OffsetMap.size();
+ QT3DSU32 *theCountPtr = reinterpret_cast<QT3DSU32 *>(outSavedData.begin() + theDataSectionStart);
+ *theCountPtr = theNumObjects;
+
+ // Second pass, perform remapping on all the objects to change their pointers to offsets
+ for (SPtrOffsetMap::iterator theIter = outSceneGraphOffsets.begin(),
+ theEnd = outSceneGraphOffsets.end();
+ theIter != theEnd; ++theIter) {
+ QT3DSU8 *theDataPtr = outSavedData.begin() + theDataSectionStart + theIter->second;
+ SGraphObject *theGraphObj = reinterpret_cast<SGraphObject *>(theDataPtr);
+ switch (theGraphObj->m_Type) {
+#define QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(type) \
+ case GraphObjectTypes::type: \
+ SGraphObjectSerializerImpl<S##type>::Remap(static_cast<S##type &>(*theGraphObj), \
+ theWriteContext); \
+ break;
+ QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES
+#undef QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ }
+#ifdef _DEBUG
+ qCDebug(TRACE_INFO, "--File size stats:");
+ // Tell the users how much space is used in the file based on object type:
+ for (QT3DSU32 idx = 0, end = theStatList.size(); idx < end; ++idx) {
+ const char *theObjType = GraphObjectTypes::GetObjectTypeName(theStatList[idx].first);
+ qCDebug(TRACE_INFO, "%s - %d bytes:", theObjType, theStatList[idx].second);
+ }
+ qCDebug(TRACE_INFO, "--End file size stats:");
+#endif
+};
+
+SPresentation *SGraphObjectSerializer::Load(NVDataRef<QT3DSU8> inData, NVDataRef<QT3DSU8> inStrDataBlock,
+ IDynamicObjectSystemCore &inDynamicObjectSystem,
+ IPathManagerCore &inPathManager,
+ NVAllocatorCallback &inAllocator,
+ const char8_t *inProjectDirectory)
+{
+ SSerializerReadContext theReadContext(inPathManager, inDynamicObjectSystem, inData,
+ inStrDataBlock, inAllocator, inProjectDirectory);
+ SPresentation *retval = NULL;
+ if (inData.size() < 4) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ QT3DSU32 theNumObjects = theReadContext.LoadRef<QT3DSU32>();
+ for (QT3DSU32 idx = 0, end = theNumObjects; idx < end; ++idx) {
+ SGraphObject *theObject = ReadGraphObject(theReadContext);
+ if (theObject) {
+ if (theObject->m_Type == GraphObjectTypes::Presentation)
+ retval = static_cast<SPresentation *>(theObject);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ return retval;
+}
diff --git a/src/runtimerender/Qt3DSRenderGraphObjectSerializer.h b/src/runtimerender/Qt3DSRenderGraphObjectSerializer.h
new file mode 100644
index 0000000..8f8420c
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderGraphObjectSerializer.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_GRAPH_OBJECT_SERIALZER_H
+#define QT3DS_RENDER_GRAPH_OBJECT_SERIALZER_H
+
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+ struct SPresentation;
+ class IEffectSystem;
+
+ struct SGraphObjectSerializer
+ {
+ // This will save the tree as it exists but clients may wish to save out extra objects in
+ // addtion
+ static void
+ Save(NVFoundationBase &inFoundation, const SPresentation &inPresentation,
+ SWriteBuffer &outSavedData, IDynamicObjectSystem &inDynamicObjectSystem,
+ IPathManager &inPathManager, SPtrOffsetMap &outSceneGraphOffsets,
+ IStringTable &inStringTable,
+ NVDataRef<SGraphObject *> inExtraGraphObjects = NVDataRef<SGraphObject *>());
+
+ // Loading requires a correctly setup effect system because the effects have arbitrary data
+ // and the strings embedded in that data will
+ // require string remapping.
+ static SPresentation *Load(NVDataRef<QT3DSU8> inData, NVDataRef<QT3DSU8> inStrDataBlock,
+ IDynamicObjectSystemCore &inDynamicObjectSystem,
+ IPathManagerCore &inPathManager,
+ NVAllocatorCallback &inAllocator,
+ const char8_t *inProjectDirectory);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderGraphObjectTypes.h b/src/runtimerender/Qt3DSRenderGraphObjectTypes.h
new file mode 100644
index 0000000..620f6c5
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderGraphObjectTypes.h
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_GRAPH_OBJECT_TYPES_H
+#define QT3DS_RENDER_GRAPH_OBJECT_TYPES_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSAssert.h"
+
+namespace qt3ds {
+namespace render {
+
+// If you need a generic switch statement, then these macros will ensure
+// you get all the types the first time.
+#define QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Presentation) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Scene) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Node) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Layer) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Light) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Camera) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Model) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(DefaultMaterial) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Image) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Text) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Effect) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(RenderPlugin) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(CustomMaterial) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(ReferencedMaterial) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(Path) \
+ QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(PathSubPath)
+
+ struct GraphObjectTypes
+ {
+ enum Enum {
+ Unknown = 0,
+ Presentation,
+ Scene,
+ Node,
+ Layer,
+ Light,
+ Camera,
+ Model,
+ DefaultMaterial,
+ Image,
+ Text,
+ Effect,
+ CustomMaterial,
+ RenderPlugin,
+ ReferencedMaterial,
+ Path,
+ PathSubPath,
+ Lightmaps,
+ LastKnownGraphObjectType,
+ };
+
+ static bool IsMaterialType(Enum type)
+ {
+ switch (type) {
+ case ReferencedMaterial:
+ case CustomMaterial:
+ case DefaultMaterial:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ static bool IsLightmapType(Enum type)
+ {
+ switch (type) {
+ case Lightmaps:
+ case DefaultMaterial:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ static bool IsNodeType(Enum type)
+ {
+ switch (type) {
+ case Node:
+ case Layer:
+ case Light:
+ case Camera:
+ case Model:
+ case Text:
+ case Path:
+ return true;
+
+ default:
+ break;
+ }
+ return false;
+ }
+
+ static bool IsRenderableType(Enum type)
+ {
+ switch (type) {
+ case Model:
+ case Text:
+ case Path:
+ return true;
+ default:
+ break;
+ }
+ return false;
+ }
+
+ static bool IsLightCameraType(Enum type)
+ {
+ switch (type) {
+ case Camera:
+ case Light:
+ return true;
+ default:
+ break;
+ }
+ return false;
+ }
+ static const char *GetObjectTypeName(Enum inType)
+ {
+ switch (inType) {
+#define QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE(type) \
+ case type: \
+ return #type;
+ QT3DS_RENDER_ITERATE_GRAPH_OBJECT_TYPES
+#undef QT3DS_RENDER_HANDL_GRAPH_OBJECT_TYPE
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return "";
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderImageScaler.cpp b/src/runtimerender/Qt3DSRenderImageScaler.cpp
new file mode 100644
index 0000000..d699179
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderImageScaler.cpp
@@ -0,0 +1,883 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2001 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSMath.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "Qt3DSRenderImageScaler.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+
+using namespace qt3ds::render;
+//==============================================================================
+// Namespace
+//==============================================================================
+CImageScaler::CImageScaler(NVAllocatorCallback &inAlloc)
+ : m_Allocator(inAlloc)
+{
+}
+//==============================================================================
+/**
+ * Scales the given image by the given scale factor.
+ *
+ * This method creates a new image based on the parameters given.
+ *
+ * @param inScaleMethod type of scaling operation
+ * @param inOldBuffer points to the old picture
+ * @param inOldWidth width of the old picture
+ * @param inOldHeight height of the old picture
+ * @param inNewBuffer will point to the scaled picture
+ * @param inNewWidth width of the new picture
+ * @param inNewHeight height of the new picture
+ * @param inPlanes number of planes (1 for greyscale, 3 for rgb, etc)
+ * also equivalent to the return value of the CTextureType::PixelSize method.
+ */
+void CImageScaler::Scale(EScaleMethod inScaleMethod, unsigned char *inOldBuffer,
+ unsigned long inOldWidth, unsigned long inOldHeight,
+ unsigned char *&outNewBuffer, unsigned long inNewWidth,
+ unsigned long inNewHeight, unsigned long inPlanes)
+{
+ switch (inScaleMethod) {
+ case SCALEMETHOD_CROP:
+ CImageScaler::Crop(inOldBuffer, inOldWidth, inOldHeight, outNewBuffer, inNewWidth,
+ inNewHeight, inPlanes);
+ break;
+
+ case SCALEMETHOD_BILINEAR:
+ CImageScaler::Bilinear(inOldBuffer, inOldWidth, inOldHeight, outNewBuffer, inNewWidth,
+ inNewHeight, inPlanes);
+ break;
+
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+}
+
+//==============================================================================
+/**
+ * Scales the given image by the given scale factor.
+ *
+ * This method creates a new image based on the parameters given.
+ *
+ * @param inScaleMethod type of scaling operation
+ * @param inOldBuffer points to the old picture
+ * @param inOldWidth width of the old picture
+ * @param inOldHeight height of the old picture
+ * @param inNewBuffer will point to the scaled picture
+ * @param inNewWidth width of the new picture
+ * @param inNewHeight height of the new picture
+ * @param inPlanes number of planes (1 for greyscale, 3 for rgb, etc)
+ * also equivalent to the return value of the CTextureType::PixelSize method.
+ */
+void CImageScaler::FastScale(EScaleMethod inScaleMethod, unsigned char *inOldBuffer,
+ unsigned long inOldWidth, unsigned long inOldHeight,
+ unsigned char *&outNewBuffer, unsigned long inNewWidth,
+ unsigned long inNewHeight, unsigned long inPlanes)
+{
+ switch (inScaleMethod) {
+ case SCALEMETHOD_CROP:
+ CImageScaler::Crop(inOldBuffer, inOldWidth, inOldHeight, outNewBuffer, inNewWidth,
+ inNewHeight, inPlanes);
+ break;
+
+ case SCALEMETHOD_POINTSAMPLE:
+ CImageScaler::FastPointSample(inOldBuffer, inOldWidth, inOldHeight, outNewBuffer,
+ inNewWidth, inNewHeight, inPlanes);
+ break;
+
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+}
+
+//==============================================================================
+/**
+ * Debug method that simply crops the picture instead of scaling.
+ *
+ * Not for use in production. This is a test method to exercise the framework.
+ *
+ * @param inOldBuffer points to the old picture
+ * @param inOldWidth width of the old picture
+ * @param inOldHeight height of the old picture
+ * @param inNewBuffer will point to the scaled picture
+ * @param inNewWidth width of the new picture
+ * @param inNewHeight height of the new picture
+ * @param inPlanes number of planes (1 for greyscale, 3 for rgb, etc)
+ * also equivalent to the return value of the CTextureType::PixelSize method.
+*/
+void CImageScaler::Crop(unsigned char *inOldBuffer, unsigned long inOldWidth,
+ unsigned long inOldHeight, unsigned char *&outNewBuffer,
+ unsigned long inNewWidth, unsigned long inNewHeight, unsigned long inPlanes)
+{
+ Q_UNUSED(inOldHeight);
+
+ QT3DS_ASSERT(inNewWidth <= inOldWidth);
+ QT3DS_ASSERT(inNewHeight <= inOldHeight);
+
+ long theMinWidth = NVMin(inOldWidth, inNewWidth);
+
+ outNewBuffer = new unsigned char[inNewWidth * inNewHeight * inPlanes];
+ ::memset(outNewBuffer, 0, inNewWidth * inNewHeight * inPlanes);
+
+ for (unsigned long theRow = 0; theRow < inNewHeight; ++theRow) {
+ ::memcpy(outNewBuffer + theRow * inNewWidth * inPlanes,
+ inOldBuffer + theRow * inOldWidth * inPlanes, theMinWidth * inPlanes);
+ }
+}
+
+//==============================================================================
+/**
+ * Plain scaling.
+ *
+ * Code adopted from http://www.codeguru.com/bitmap/SmoothBitmapResizing.html
+ * Preliminary formatting completed but still needs work.
+ *
+ * @param inOldBuffer points to the old picture
+ * @param inOldWidth width of the old picture
+ * @param inOldHeight height of the old picture
+ * @param inNewBuffer will point to the scaled picture
+ * @param inNewWidth width of the new picture
+ * @param inNewHeight height of the new picture
+ * @param inPlanes number of planes (1 for greyscale, 3 for rgb, etc)
+ * also equivalent to the return value of the CTextureType::PixelSize method.
+*/
+void CImageScaler::Bilinear(unsigned char *inOldBuffer, unsigned long inOldWidth,
+ unsigned long inOldHeight, unsigned char *&outNewBuffer,
+ unsigned long inNewWidth, unsigned long inNewHeight,
+ unsigned long inPlanes)
+{
+ QT3DS_ASSERT(inPlanes > 0);
+
+ outNewBuffer = new unsigned char[inNewWidth * inNewHeight * inPlanes];
+ CImageScaler::Resize(inOldBuffer, inOldWidth, inOldHeight, outNewBuffer, inNewWidth,
+ inNewHeight, inPlanes);
+}
+
+//==============================================================================
+/**
+ * Fast removal of selected pixels.
+ *
+ * Really fast scanning of every n-th pixel. This algorithm works basically by
+ * adding a fraction to the source pointer for each pixel destination, using
+ * fixed point arithmetic.
+ *
+ * @param inOldBuffer points to the old picture
+ * @param inOldWidth width of the old picture
+ * @param inOldHeight height of the old picture
+ * @param inNewBuffer will point to the scaled picture
+ * @param inNewWidth width of the new picture
+ * @param inNewHeight height of the new picture
+ * @param inPlanes number of planes (1 for greyscale, 3 for rgb, etc)
+ * also equivalent to the return value of the CTextureType::PixelSize method.
+*/
+void CImageScaler::FastPointSample(unsigned char *inOldBuffer, unsigned long inOldWidth,
+ unsigned long inOldHeight, unsigned char *&outNewBuffer,
+ unsigned long inNewWidth, unsigned long inNewHeight,
+ unsigned long inPlanes)
+{
+ unsigned long theXAccum;
+ unsigned long theYAccum;
+ unsigned long theXConst;
+ unsigned long theYConst;
+ unsigned long theRow;
+ unsigned long theColumn;
+ unsigned long theAdd;
+ unsigned long theSrcIndex;
+ outNewBuffer = new unsigned char[inNewWidth * inNewHeight * inPlanes];
+
+ // *** Debug ***
+ // char dMessage[100];
+ //::sprintf( dMessage, "PointSample: %ldx%ld to %ldx%ld\n",inOldInfo.m_Width, inOldInfo.m_Height, outNewInfo.m_Width, outNewInfo.m_Height );
+ //::OutputDebugString( dMessage );
+
+ switch (inPlanes) {
+ case 4: {
+ long *theSrc;
+ long *theDst;
+ theSrc = reinterpret_cast<long *>(inOldBuffer);
+ theDst = reinterpret_cast<long *>(outNewBuffer);
+ theYAccum = 0;
+ theXConst = (inOldWidth << 16) / inNewWidth;
+ theYConst = (inOldHeight << 16) / inNewHeight;
+ unsigned long theAdd;
+ for (theRow = 0; theRow < inNewHeight; theRow++) {
+ theXAccum = 0;
+ theSrcIndex = 0;
+ for (theColumn = 0; theColumn < inNewWidth; theColumn++) {
+
+ theXAccum += theXConst;
+ theAdd = theXAccum >> 16;
+ *theDst = theSrc[theSrcIndex];
+ theDst++;
+ theSrcIndex += theAdd;
+ // Clear out the integer portion of the accumulator.
+ theXAccum = theXAccum & 0xFFFF;
+ }
+
+ theYAccum += theYConst;
+ theAdd = (theYAccum) >> 16;
+ theSrc += theAdd * inOldWidth;
+ // Clear out the integer portion of the accumulator.
+ theYAccum = theYAccum & 0xFFFF;
+ }
+ } break;
+
+ case 3: {
+ unsigned char *theDest;
+ unsigned char *theSource;
+ theDest = reinterpret_cast<unsigned char *>(outNewBuffer);
+ theSource = reinterpret_cast<unsigned char *>(inOldBuffer);
+ theYAccum = 0;
+ theXConst = (inOldWidth << 16) / inNewWidth;
+ theYConst = (inOldHeight << 16) / inNewHeight;
+ for (theRow = 0; theRow < inNewHeight; ++theRow) {
+ theXAccum = 0;
+ theSrcIndex = 0;
+ for (theColumn = 0; theColumn < inNewWidth; ++theColumn) {
+ theDest[0] = theSource[0];
+ theDest[1] = theSource[1];
+ theDest[2] = theSource[2];
+ theDest += 3;
+ theSrcIndex += 3 * (theXAccum) >> 16;
+ theXAccum = theXAccum & 0xFFFF;
+ }
+ theYAccum += theYConst;
+ theAdd = (theYAccum) >> 16;
+ theSource += theAdd * inOldWidth * 3;
+ theYAccum = theYAccum & 0xFFFF;
+ }
+ } break;
+
+ case 2: {
+ short *theDest;
+ short *theSource;
+ theDest = reinterpret_cast<short *>(outNewBuffer);
+ theSource = reinterpret_cast<short *>(inOldBuffer);
+ theYAccum = 0;
+ theXConst = (inOldWidth << 16) / inNewWidth;
+ theYConst = (inOldHeight << 16) / inNewHeight;
+ for (unsigned long theY = 0; theY < inNewHeight; ++theY) {
+ theXAccum = 0;
+ theSrcIndex = 0;
+ for (unsigned long theX = 0; theX < inNewWidth; ++theX) {
+ *theDest = *theSource;
+ ++theDest;
+ theXAccum += theXConst;
+ theSrcIndex += (theXAccum) >> 16;
+ theXAccum = theXAccum & 0xFFFF;
+ }
+ theYAccum += theYConst;
+ theAdd = (theYAccum) >> 16;
+ theSource += theAdd * inOldWidth;
+ theYAccum = theYAccum & 0xFFFF;
+ }
+ } break;
+
+ case 1: {
+ unsigned char *theDest;
+ unsigned char *theSource;
+ theDest = reinterpret_cast<unsigned char *>(outNewBuffer);
+ theSource = reinterpret_cast<unsigned char *>(inOldBuffer);
+ theYAccum = 0;
+ theXConst = (inOldWidth << 16) / inNewWidth;
+ theYConst = (inOldHeight << 16) / inNewHeight;
+ for (unsigned long theY = 0; theY < inNewHeight; ++theY) {
+ theXAccum = 0;
+ theSrcIndex = 0;
+ for (unsigned long theX = 0; theX < inNewWidth; ++theX) {
+ *theDest = *theSource;
+ ++theDest;
+ theXAccum += theXConst;
+ theSrcIndex += (theXAccum) >> 16;
+ theXAccum = theXAccum & 0xFFFF;
+ }
+ theYAccum += theYConst;
+ theAdd = (theYAccum) >> 16;
+ theSource += theAdd * inOldWidth;
+ theYAccum = theYAccum & 0xFFFF;
+ }
+ } break;
+
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+}
+
+//==============================================================================
+/**
+ * @param inWidth
+ * @param inHeight
+ * @return unsigned char*
+ */
+unsigned char *CImageScaler::AllocateBuffer(long inWidth, long inHeight)
+{
+ unsigned char *theBuffer = new unsigned char[inHeight * inWidth * 4];
+ return theBuffer;
+}
+
+//==============================================================================
+/**
+ * @param ioBuffer the buffer to release
+ */
+void CImageScaler::ReleaseBuffer(unsigned char *&ioBuffer)
+{
+ delete[] ioBuffer;
+ ioBuffer = NULL;
+}
+
+//==============================================================================
+/**
+ * @param inOldBuffer points to the old picture
+ * @param inOldWidth width of the old picture
+ * @param inOldHeight height of the old picture
+ * @param inNewBuffer will point to the scaled picture
+ * @param inNewWidth width of the new picture
+ * @param inNewHeight height of the new picture
+ * @param inPlanes number of planes (1 for greyscale, 3 for rgb, etc)
+ * also equivalent to the return value of the CTextureType::PixelSize method.
+ */
+void CImageScaler::Resize(unsigned char *inOldBuffer, unsigned long inOldWidth,
+ unsigned long inOldHeight, unsigned char *&outNewBuffer,
+ unsigned long inNewWidth, unsigned long inNewHeight,
+ unsigned long inPlanes)
+{
+ QT3DS_ASSERT(inPlanes == 4);
+
+ // only do the temporary allocation if necessary
+ if (inOldWidth < inNewWidth || inOldHeight < inNewHeight) {
+ CImageScaler::ExpandRowsAndColumns(inOldBuffer, inOldWidth, inOldHeight, outNewBuffer,
+ inNewWidth, inNewHeight, inPlanes);
+ return;
+ } else {
+ // The downsampling algorithms *do* assume four planes.
+ if (inOldWidth > inNewWidth && inOldHeight > inNewHeight) {
+ MemoryBuffer<> theBuffer(ForwardingAllocator(m_Allocator, "ImageScaler::TempBuffer"));
+ theBuffer.reserve(inNewWidth * inOldHeight * 4);
+ unsigned char *theTempBuffer = theBuffer.begin();
+ CImageScaler::ReduceCols(inOldBuffer, inOldWidth, inOldHeight, theTempBuffer,
+ inNewWidth);
+ CImageScaler::ReduceRows(theTempBuffer, inNewWidth, inOldHeight, outNewBuffer,
+ inNewHeight);
+ } else if (inOldWidth > inNewWidth) {
+ CImageScaler::ReduceCols(inOldBuffer, inOldWidth, inOldHeight, outNewBuffer,
+ inNewWidth);
+ } else if (inOldHeight > inNewHeight) {
+ CImageScaler::ReduceRows(inOldBuffer, inNewWidth, inOldHeight, outNewBuffer,
+ inNewHeight);
+ }
+ }
+}
+
+void CImageScaler::ExpandRowsAndColumns(unsigned char *inBuffer, unsigned long inWidth,
+ unsigned long inHeight, unsigned char *outBuffer,
+ unsigned long inDstWidth, unsigned long inDstHeight,
+ unsigned long inPlanes)
+{
+ if (inDstWidth < inWidth || inDstHeight < inHeight) {
+ return;
+ }
+ /*if( inPlanes == 4 )
+ {
+ FastExpandRowsAndColumns( inBuffer, inWidth, inHeight,
+ outBuffer, inDstWidth, inDstHeight );
+ return;
+ }*/
+ unsigned long theYPosition;
+ unsigned short theYRatio;
+ unsigned short theYInvRatio;
+ unsigned long theXPosition;
+ unsigned short theXRatio;
+ unsigned short theXInvRatio;
+
+ unsigned long theRow;
+ unsigned long theColumn;
+ unsigned long theSrcIndex;
+ unsigned long theDstIndex;
+ unsigned long theSrcLineLength;
+ unsigned long theTemp;
+ unsigned long thePixel;
+
+ theDstIndex = 0;
+ theSrcIndex = 0;
+ theSrcLineLength = inWidth * inPlanes;
+ theYPosition = inDstHeight;
+ theYRatio = 1 << 8;
+ theYInvRatio = 0;
+ theXInvRatio = 0;
+ // Here we go....
+ // This algorithm will be quite a bit hairy, if you want
+ // to understand it, then look at the two expand alogorithms above
+ // and realize the this is just the logical combination of the two
+ for (theRow = 0; theRow < inDstHeight; theRow++) {
+ // Run through all the rows, multiplying if necessary the two ratio's together
+ theXPosition = inDstWidth;
+ if (theYPosition < inHeight) {
+ // We have crossed a row boundary
+ theYRatio = (unsigned short)((theYPosition << 8) / inHeight);
+ theYInvRatio = (unsigned short)((1 << 8) - theYRatio);
+
+ for (theColumn = 0; theColumn < inDstWidth; theColumn++) {
+ if (theXPosition < inWidth) {
+ theXRatio = (unsigned short)((theXPosition << 8) / inWidth);
+ theXInvRatio = (unsigned short)((1 << 8) - theXRatio);
+
+ // The combination of both the x and y ratio's
+ unsigned long theLeftRatio = (theXRatio * theYRatio) >> 8;
+ unsigned long theRightRatio = (theXInvRatio * theYRatio) >> 8;
+ unsigned long theLowLeftRatio = (theXRatio * theYInvRatio) >> 8;
+ unsigned long theLowRightRatio = (theXInvRatio * theYInvRatio) >> 8;
+ // We are on a row and column boundary, thus each pixel here is the
+ // combination of four pixels (left right, low left, low right)
+ for (thePixel = 0; thePixel < inPlanes; thePixel++) {
+ // Left side first
+ theTemp = (theLeftRatio * inBuffer[theSrcIndex]);
+ theTemp += (theRightRatio * inBuffer[theSrcIndex + inPlanes]);
+ theTemp += (theLowLeftRatio * inBuffer[theSrcIndex + theSrcLineLength]);
+ theTemp += (theLowRightRatio
+ * inBuffer[theSrcIndex + theSrcLineLength + inPlanes]);
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 8);
+ theDstIndex++;
+ theSrcIndex++;
+ }
+ // Reset our position calculation
+ theXPosition = inDstWidth - inWidth + theXPosition;
+ } else {
+ for (thePixel = 0; thePixel < inPlanes; thePixel++) {
+ theTemp = theYRatio * inBuffer[theSrcIndex + thePixel];
+ theTemp +=
+ theYInvRatio * inBuffer[theSrcIndex + theSrcLineLength + thePixel];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 8);
+ theDstIndex++;
+ }
+ // Reset our position calculation
+ theXPosition -= inWidth;
+ }
+ }
+ // Reset our position calculation
+ theYPosition = inDstHeight - inHeight + theYPosition;
+ // Make the src index point to the next line
+ theSrcIndex += inPlanes;
+ } // Ends the if to check if we are crossing a row boundary
+ // Else we are not crossing a row boundary
+ else {
+ for (theColumn = 0; theColumn < inDstWidth; theColumn++) {
+ // If we are crossing a column boundary
+ if (theXPosition < inWidth) {
+ theXRatio = (unsigned short)((theXPosition << 8) / inWidth);
+ theXInvRatio = (unsigned short)((1 << 8) - theXRatio);
+ for (thePixel = 0; thePixel < inPlanes; thePixel++) {
+ theTemp = theXRatio * inBuffer[theSrcIndex];
+ theTemp += theXInvRatio * inBuffer[theSrcIndex + inPlanes];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 8);
+ theSrcIndex++;
+ theDstIndex++;
+ }
+
+ theXPosition = inDstWidth - inWidth + theXPosition;
+ }
+ // Else we are not crossing a column boundary
+ else {
+ for (thePixel = 0; thePixel < inPlanes; thePixel++) {
+ outBuffer[theDstIndex] = inBuffer[theSrcIndex + thePixel];
+ theDstIndex++;
+ }
+ theXPosition -= inWidth;
+ }
+ }
+ // reset our y position indicator
+ theYPosition -= inHeight;
+ // reset the src index to the beginning the next line
+ theSrcIndex += inPlanes;
+ // reset src index to the beginning of this line
+ theSrcIndex -= theSrcLineLength;
+ } // End of else for row boundary
+ } // End of for loop for iterating through all rows
+}
+
+// Assuming the number of planes is four
+
+void CImageScaler::FastExpandRowsAndColumns(unsigned char *inBuffer, unsigned long inWidth,
+ unsigned long inHeight, unsigned char *outBuffer,
+ unsigned long inDstWidth, unsigned long inDstHeight)
+{
+
+ if (inDstWidth < inWidth || inDstHeight < inHeight) {
+ return;
+ }
+ unsigned long theYPosition;
+ unsigned short theYRatio;
+ unsigned short theYInvRatio;
+ unsigned long theXPosition;
+ unsigned short theXRatio;
+ unsigned short theXInvRatio;
+ // The combination of both the x and y ratio's
+ unsigned long theLeftRatio;
+ unsigned long theRightRatio;
+ unsigned long theLowLeftRatio;
+ unsigned long theLowRightRatio;
+
+ unsigned long theRow;
+ unsigned long theColumn;
+ unsigned long theSrcIndex;
+ unsigned long theDstIndex;
+ unsigned long theSrcLineLength;
+ unsigned long theTemp;
+
+ theDstIndex = 0;
+ theSrcIndex = 0;
+ theSrcLineLength = inWidth * 4;
+ theYPosition = inDstHeight;
+ theYInvRatio = 0;
+ theXInvRatio = 0;
+ // Here we go....
+ // This algorithm will be quite a bit hairy, if you want
+ // to understand it, then look at the two expand alogorithms above
+ // and realize the this is just the logical combination of the two
+ for (theRow = 0; theRow < inDstHeight; theRow++) {
+ // Run through all the rows, multiplying if necessary the two ratio's together
+ theXPosition = inDstWidth;
+ if (theYPosition < inHeight) {
+ // We have crossed a row boundary
+ theYRatio = (unsigned short)((theYPosition << 8) / inHeight);
+ theYInvRatio = (unsigned short)((1 << 8) - theYRatio);
+
+ for (theColumn = 0; theColumn < inDstWidth; theColumn++) {
+ if (theXPosition < inWidth) {
+ theXRatio = (unsigned short)((theXPosition << 8) / inWidth);
+ theXInvRatio = (unsigned short)((1 << 8) - theXRatio);
+ theLeftRatio = (theXRatio * theYRatio) >> 8;
+ theRightRatio = (theXInvRatio * theYRatio) >> 8;
+ theLowLeftRatio = (theXRatio * theYInvRatio) >> 8;
+ theLowRightRatio = (theXInvRatio * theYInvRatio) >> 8;
+ // We are on a row and column boundary, thus each pixel here is the
+ // combination of four pixels (left right, low left, low right)
+
+ // Left side first
+ theTemp = (inBuffer[theSrcIndex]);
+ theTemp += (inBuffer[theSrcIndex + 4]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength + 4]);
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 2);
+ theDstIndex++;
+ theSrcIndex++;
+ // Left side first
+ theTemp = (inBuffer[theSrcIndex]);
+ theTemp += (inBuffer[theSrcIndex + 4]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength + 4]);
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 2);
+ theDstIndex++;
+ theSrcIndex++;
+ // Left side first
+ theTemp = (inBuffer[theSrcIndex]);
+ theTemp += (inBuffer[theSrcIndex + 4]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength + 4]);
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 2);
+ theDstIndex++;
+ theSrcIndex++;
+ // Left side first
+ theTemp = (inBuffer[theSrcIndex]);
+ theTemp += (inBuffer[theSrcIndex + 4]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength]);
+ theTemp += (inBuffer[theSrcIndex + theSrcLineLength + 4]);
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 2);
+ theDstIndex++;
+ theSrcIndex++;
+ // Reset our position calculation
+ theXPosition = inDstWidth - inWidth + theXPosition;
+ } else {
+
+ theTemp = inBuffer[theSrcIndex];
+ theTemp += inBuffer[theSrcIndex + theSrcLineLength];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theDstIndex++;
+ theTemp = inBuffer[theSrcIndex + 1];
+ theTemp += inBuffer[theSrcIndex + theSrcLineLength + 1];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theDstIndex++;
+ theTemp = inBuffer[theSrcIndex + 2];
+ theTemp += inBuffer[theSrcIndex + theSrcLineLength + 2];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theDstIndex++;
+ theTemp = inBuffer[theSrcIndex + 3];
+ theTemp += inBuffer[theSrcIndex + theSrcLineLength + 3];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theDstIndex++;
+ // Reset our position calculation
+ theXPosition -= inWidth;
+ }
+ }
+ // Reset our position calculation
+ theYPosition = inDstHeight - inHeight + theYPosition;
+ // Make the src index point to the next line
+ theSrcIndex += 4;
+ } // Ends the if to check if we are crossing a row boundary
+ // Else we are not crossing a row boundary
+ else {
+ for (theColumn = 0; theColumn < inDstWidth; theColumn++) {
+ // If we are crossing a column boundary
+ if (theXPosition < inWidth) {
+ theXRatio = (unsigned short)((theXPosition << 8) / inWidth);
+ theXInvRatio = (unsigned short)((1 << 8) - theXRatio);
+
+ theTemp = inBuffer[theSrcIndex];
+ theTemp += inBuffer[theSrcIndex + 4];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theSrcIndex++;
+ theDstIndex++;
+ theTemp = inBuffer[theSrcIndex];
+ theTemp += inBuffer[theSrcIndex + 4];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theSrcIndex++;
+ theDstIndex++;
+ theTemp = inBuffer[theSrcIndex];
+ theTemp += inBuffer[theSrcIndex + 4];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theSrcIndex++;
+ theDstIndex++;
+ theTemp = inBuffer[theSrcIndex];
+ theTemp += inBuffer[theSrcIndex + 4];
+ outBuffer[theDstIndex] = (unsigned char)(theTemp >> 1);
+ theSrcIndex++;
+ theDstIndex++;
+
+ theXPosition = inDstWidth - inWidth + theXPosition;
+ }
+ // Else we are not crossing a column boundary
+ else {
+ *((long *)(outBuffer + theDstIndex)) = *((long *)(inBuffer + theSrcIndex));
+ theDstIndex += 4;
+ theXPosition -= inWidth;
+ }
+ }
+ // reset our y position indicator
+ theYPosition -= inHeight;
+ // reset the src index to the beginning the next line
+ theSrcIndex += 4;
+ // reset src index to the beginning of this line
+ theSrcIndex -= theSrcLineLength;
+ } // End of else for row boundary
+ } // End of for loop for iterating through all rows
+}
+
+//==============================================================================
+/**
+ * @param inSrcBuffer
+ */
+void CImageScaler::ReduceCols(unsigned char *inSrcBuffer, long inSrcWidth, long inSrcHeight,
+ unsigned char *&outDstBuffer, long inDstWidth)
+{
+ long theDDAConst = static_cast<long>(1024.0 * inDstWidth / inSrcWidth);
+ long theDDAAccum = 0L;
+ long thePixelCount;
+
+ long theSrcRow;
+ long theSrcCol;
+ long theDstCol;
+
+ long theRedAccum;
+ long theGreenAccum;
+ long theBlueAccum;
+ long theAlphaAccum;
+
+ unsigned char *theDstPointer = outDstBuffer;
+ unsigned char *theSrcPointer = inSrcBuffer;
+ unsigned char *theSrcRowPointer;
+ unsigned char *theDstRowPointer;
+
+ long theSrcStepSize = 4;
+ long theDstStepSize = 4;
+
+ for (theSrcRow = 0; theSrcRow < inSrcHeight; ++theSrcRow) {
+
+ theSrcRowPointer = theSrcPointer + (theSrcRow * inSrcWidth * theSrcStepSize);
+ theDstRowPointer = theDstPointer + (theSrcRow * inDstWidth * theDstStepSize);
+
+ theSrcCol = 0L;
+ theDstCol = 0L;
+ theRedAccum = 0L;
+ theGreenAccum = 0L;
+ theBlueAccum = 0L;
+ theAlphaAccum = 0L;
+ thePixelCount = 0L;
+ theDDAAccum = 0L;
+
+ while (theSrcCol < inSrcWidth) {
+ while ((theDDAAccum < 1024L) && (theSrcCol < inSrcWidth)) {
+ theRedAccum += 1024L * theSrcRowPointer[(theSrcCol * theSrcStepSize) + 0];
+ theGreenAccum += 1024L * theSrcRowPointer[(theSrcCol * theSrcStepSize) + 1];
+ theBlueAccum += 1024L * theSrcRowPointer[(theSrcCol * theSrcStepSize) + 2];
+ theAlphaAccum += 1024L * theSrcRowPointer[(theSrcCol * theSrcStepSize) + 3];
+
+ theDDAAccum += theDDAConst;
+ thePixelCount += 1024L;
+ ++theSrcCol;
+ }
+
+ theDDAAccum = (theSrcCol < inSrcWidth) ? (theDDAAccum - 1024L) : (0L);
+ thePixelCount -= theDDAAccum;
+
+ theRedAccum -=
+ theDDAAccum * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 0];
+ theGreenAccum -=
+ theDDAAccum * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 1];
+ theBlueAccum -=
+ theDDAAccum * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 2];
+ theAlphaAccum -=
+ theDDAAccum * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 3];
+
+ theDstRowPointer[(theDstCol * theDstStepSize) + 0] =
+ (unsigned char)(theRedAccum / thePixelCount);
+ theDstRowPointer[(theDstCol * theDstStepSize) + 1] =
+ (unsigned char)(theGreenAccum / thePixelCount);
+ theDstRowPointer[(theDstCol * theDstStepSize) + 2] =
+ (unsigned char)(theBlueAccum / thePixelCount);
+ theDstRowPointer[(theDstCol * theDstStepSize) + 3] =
+ (unsigned char)(theAlphaAccum / thePixelCount);
+
+ thePixelCount = 1024L - theDDAAccum;
+ ++theDstCol;
+
+ if (theDstCol >= inDstWidth) {
+ break;
+ }
+
+ theRedAccum =
+ thePixelCount * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 0];
+ theGreenAccum =
+ thePixelCount * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 1];
+ theBlueAccum =
+ thePixelCount * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 2];
+ theAlphaAccum =
+ thePixelCount * (long)theSrcRowPointer[((theSrcCol - 1) * theSrcStepSize) + 3];
+ }
+ }
+}
+
+//==============================================================================
+/**
+ * @param inSrcBuffer
+ */
+void CImageScaler::ReduceRows(unsigned char *inSrcBuffer, long inSrcWidth, long inSrcHeight,
+ unsigned char *&outDstBuffer, long inDstHeight)
+{
+ long theDDAConst = static_cast<long>(1024.0 * inDstHeight / inSrcHeight);
+ long theDDAAccum = 0;
+ long thePixelCount;
+
+ long theSrcRow;
+ long theSrcCol;
+ long theDstRow;
+
+ long theRedAccum;
+ long theGreenAccum;
+ long theBlueAccum;
+ long theAlphaAccum;
+
+ unsigned char *theDstPointer = outDstBuffer;
+ unsigned char *theSrcPointer = inSrcBuffer;
+ unsigned char *theSrcColPointer = NULL;
+ unsigned char *theDstColPointer = NULL;
+
+ long theStepSize = 4;
+ long theSrcStride = 4 * inSrcWidth;
+ long theDstStride = 4 * inSrcWidth;
+
+ for (theSrcCol = 0; theSrcCol < inSrcWidth; ++theSrcCol) {
+ theSrcColPointer = theSrcPointer + (theSrcCol * theStepSize);
+ theDstColPointer = theDstPointer + (theSrcCol * theStepSize);
+
+ theSrcRow = 0L;
+ theDstRow = 0L;
+ theRedAccum = 0L;
+ theGreenAccum = 0L;
+ theBlueAccum = 0L;
+ theAlphaAccum = 0L;
+ thePixelCount = 0L;
+
+ theDDAAccum = 0L;
+
+ while (theSrcRow < inSrcHeight) {
+ while ((theDDAAccum < 1024L) && (theSrcRow < inSrcHeight)) {
+ theRedAccum += 1024L * theSrcColPointer[(theSrcRow * theSrcStride) + 0];
+ theGreenAccum += 1024L * theSrcColPointer[(theSrcRow * theSrcStride) + 1];
+ theBlueAccum += 1024L * theSrcColPointer[(theSrcRow * theSrcStride) + 2];
+ theAlphaAccum += 1024L * theSrcColPointer[(theSrcRow * theSrcStride) + 3];
+
+ theDDAAccum += theDDAConst;
+ thePixelCount += 1024L;
+ ++theSrcRow;
+ }
+
+ theDDAAccum = (theSrcRow < inSrcHeight) ? (theDDAAccum - 1024L) : (0L);
+ thePixelCount -= theDDAAccum;
+
+ theRedAccum -=
+ theDDAAccum * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 0];
+ theGreenAccum -=
+ theDDAAccum * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 1];
+ theBlueAccum -=
+ theDDAAccum * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 2];
+ theAlphaAccum -=
+ theDDAAccum * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 3];
+
+ theDstColPointer[(theDstRow * theDstStride) + 0] =
+ (unsigned char)(theRedAccum / thePixelCount);
+ theDstColPointer[(theDstRow * theDstStride) + 1] =
+ (unsigned char)(theGreenAccum / thePixelCount);
+ theDstColPointer[(theDstRow * theDstStride) + 2] =
+ (unsigned char)(theBlueAccum / thePixelCount);
+ theDstColPointer[(theDstRow * theDstStride) + 3] =
+ (unsigned char)(theAlphaAccum / thePixelCount);
+
+ thePixelCount = 1024L - theDDAAccum;
+ ++theDstRow;
+
+ if (theDstRow >= inDstHeight) {
+ break;
+ }
+
+ theRedAccum =
+ thePixelCount * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 0];
+ theGreenAccum =
+ thePixelCount * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 1];
+ theBlueAccum =
+ thePixelCount * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 2];
+ theAlphaAccum =
+ thePixelCount * (long)theSrcColPointer[((theSrcRow - 1) * theSrcStride) + 3];
+ }
+ }
+}
diff --git a/src/runtimerender/Qt3DSRenderImageScaler.h b/src/runtimerender/Qt3DSRenderImageScaler.h
new file mode 100644
index 0000000..27b5177
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderImageScaler.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2001 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Prefix
+//==============================================================================
+#ifndef __IMAGESCALER_H_
+#define __IMAGESCALER_H_
+#include "Qt3DSRender.h"
+
+namespace qt3ds {
+namespace render {
+ //==============================================================================
+ // Class
+ //==============================================================================
+ //==============================================================================
+ /**
+ * @class CImageScaler
+ */
+ //==============================================================================
+ class CImageScaler
+ {
+ NVAllocatorCallback &m_Allocator;
+
+ public:
+ //==============================================================================
+ // Methods
+ //==============================================================================
+ enum EScaleMethod {
+ SCALEMETHOD_CROP = -1, // Debug only, not a scaler
+ SCALEMETHOD_POINTSAMPLE = 0,
+ SCALEMETHOD_BILINEAR = 1,
+ };
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+
+ // Access
+
+ public:
+ CImageScaler(NVAllocatorCallback &inAlloc);
+
+ void Scale(EScaleMethod inScaleMethod, unsigned char *inOldBuffer, unsigned long inOldWidth,
+ unsigned long inOldHeight, unsigned char *&outNewBuffer,
+ unsigned long inNewWidth, unsigned long inNewHeight, unsigned long inChannels);
+
+ void FastScale(EScaleMethod inScaleMethod, unsigned char *inOldBuffer,
+ unsigned long inOldWidth, unsigned long inOldHeight,
+ unsigned char *&outNewBuffer, unsigned long inNewWidth,
+ unsigned long inNewHeight, unsigned long inChannels);
+
+ void Crop(unsigned char *inOldBuffer, unsigned long inOldWidth, unsigned long inOldHeight,
+ unsigned char *&outNewBuffer, unsigned long inNewWidth, unsigned long inNewHeight,
+ unsigned long inPlanes);
+
+ void Bilinear(unsigned char *inOldBuffer, unsigned long inOldWidth,
+ unsigned long inOldHeight, unsigned char *&outNewBuffer,
+ unsigned long inNewWidth, unsigned long inNewHeight, unsigned long inPlanes);
+
+ void FastPointSample(unsigned char *inOldBuffer, unsigned long inOldWidth,
+ unsigned long inOldHeight, unsigned char *&outNewBuffer,
+ unsigned long inNewWidth, unsigned long inNewHeight,
+ unsigned long inPlanes);
+
+ unsigned char *AllocateBuffer(long inWidth, long inHeight);
+ void ReleaseBuffer(unsigned char *&ioBuffer);
+ void Resize(unsigned char *inOldBuffer, unsigned long inOldWidth, unsigned long inOldHeight,
+ unsigned char *&outNewBuffer, unsigned long inNewWidth,
+ unsigned long inNewHeight, unsigned long inPlanes);
+
+ // variable numbers of planes, i.e. greyscale, rb, rbg, and rgba or argb
+ // Bilinear algorithms, good for quality
+ void ExpandRowsAndColumns(unsigned char *inBuffer, unsigned long inWidth,
+ unsigned long inHeight, unsigned char *outBuffer,
+ unsigned long inDstWidth, unsigned long inDstHeight,
+ unsigned long inPlanes);
+
+ // The method implemented above, but with some optimizations
+ // specifically, fixed the number of planes at 4
+ // eliminated the new/delete allocations
+ void FastExpandRowsAndColumns(unsigned char *inBuffer, unsigned long inWidth,
+ unsigned long inHeight, unsigned char *outBuffer,
+ unsigned long inDstWidth, unsigned long inDstHeight);
+
+ void ReduceCols(unsigned char *inSrcBuffer, long inSrcWidth, long inSrcHeight,
+ unsigned char *&outDstBuffer, long inDstWidth);
+ void ReduceRows(unsigned char *inSrcBuffer, long inSrcWidth, long inSrcHeight,
+ unsigned char *&outDstBuffer, long inDstHeight);
+ };
+}
+}
+
+#endif // !defined(__IMAGESCALER_H_)
diff --git a/src/runtimerender/Qt3DSRenderImageTextureData.h b/src/runtimerender/Qt3DSRenderImageTextureData.h
new file mode 100644
index 0000000..aaa73d7
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderImageTextureData.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_IMAGE_TEXTURE_DATA_H
+#define QT3DS_RENDER_IMAGE_TEXTURE_DATA_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSFlags.h"
+
+#include <QtCore/qsharedpointer.h>
+#include <QtCore/qvector.h>
+
+namespace qt3ds {
+namespace render {
+
+ // forward declararion
+ class Qt3DSRenderPrefilterTexture;
+
+ struct ImageTextureFlagValues
+ {
+ enum Enum {
+ HasTransparency = 1,
+ InvertUVCoords = 1 << 1,
+ PreMultiplied = 1 << 2,
+ };
+ };
+
+ struct SImageTextureFlags : public NVFlags<ImageTextureFlagValues::Enum, QT3DSU32>
+ {
+ bool HasTransparency() const
+ {
+ return this->operator&(ImageTextureFlagValues::HasTransparency);
+ }
+ void SetHasTransparency(bool inValue)
+ {
+ clearOrSet(inValue, ImageTextureFlagValues::HasTransparency);
+ }
+
+ bool IsInvertUVCoords() const
+ {
+ return this->operator&(ImageTextureFlagValues::InvertUVCoords);
+ }
+ void SetInvertUVCoords(bool inValue)
+ {
+ clearOrSet(inValue, ImageTextureFlagValues::InvertUVCoords);
+ }
+
+ bool IsPreMultiplied() const
+ {
+ return this->operator&(ImageTextureFlagValues::PreMultiplied);
+ }
+ void SetPreMultiplied(bool inValue)
+ {
+ clearOrSet(inValue, ImageTextureFlagValues::PreMultiplied);
+ }
+ };
+
+ struct SImageTextureData
+ {
+ NVRenderTexture2D *m_Texture;
+ SImageTextureFlags m_TextureFlags;
+ Qt3DSRenderPrefilterTexture *m_BSDFMipMap;
+
+ SImageTextureData()
+ : m_Texture(nullptr)
+ , m_BSDFMipMap(nullptr)
+ {
+ }
+
+ SImageTextureData(const SImageTextureData& data)
+ : m_Texture(data.m_Texture), m_TextureFlags(data.m_TextureFlags)
+ , m_BSDFMipMap(data.m_BSDFMipMap)
+ {
+
+ }
+
+ bool operator!=(const SImageTextureData &inOther)
+ {
+ return m_Texture != inOther.m_Texture || m_TextureFlags != inOther.m_TextureFlags
+ || m_BSDFMipMap != inOther.m_BSDFMipMap;
+ }
+ };
+
+ struct IReloadableCallback
+ {
+ virtual ~IReloadableCallback() {}
+ virtual void onLoad() = 0;
+ virtual void onUnload() = 0;
+ };
+
+ struct SImage;
+ struct SReloadableImageTextureData : public SImageTextureData
+ {
+ QString m_path;
+ bool m_loaded;
+ bool m_scanTransparency;
+ bool m_bsdfMipmap;
+ bool m_initialized;
+ QVector<SImage *> m_callbacks;
+
+ SReloadableImageTextureData()
+ : SImageTextureData()
+ , m_loaded(false), m_scanTransparency(false), m_bsdfMipmap(false), m_initialized(false)
+ {
+ }
+ };
+
+ typedef QSharedPointer<SReloadableImageTextureData> ReloadableTexturePtr;
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderInputStreamFactory.cpp b/src/runtimerender/Qt3DSRenderInputStreamFactory.cpp
new file mode 100644
index 0000000..1a418b1
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderInputStreamFactory.cpp
@@ -0,0 +1,214 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderInputStreamFactory.h"
+
+#include "stdio.h"
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/string.h"
+#include "EASTL/vector.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/FileTools.h"
+#include "foundation/Qt3DSMutex.h"
+
+#include <QDir>
+#include <QDirIterator>
+#include <QFile>
+#include <QFileInfo>
+#include <QUrl>
+
+using namespace qt3ds::render;
+
+namespace {
+struct SInputStream : public IRefCountedInputStream
+{
+ NVFoundationBase &m_Foundation;
+ QString m_Path;
+ QFile m_File;
+ volatile QT3DSI32 mRefCount;
+
+ SInputStream(NVFoundationBase &inFoundation, const QString &inPath)
+ : m_Foundation(inFoundation)
+ , m_Path(inPath)
+ , m_File(inPath)
+ , mRefCount(0)
+ {
+ m_File.open(QIODevice::ReadOnly);
+ }
+ virtual ~SInputStream()
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ QT3DSU32 Read(NVDataRef<QT3DSU8> data) override
+ {
+ return m_File.read((char *)data.begin(), data.size());
+ }
+
+ bool Write(NVConstDataRef<QT3DSU8> /*data*/) override
+ {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ void SetPosition(QT3DSI64 inOffset, qt3ds::foundation::SeekPosition::Enum inEnum) override
+ {
+ if (inOffset > QT3DS_MAX_I32 || inOffset < QT3DS_MIN_I32) {
+ qCCritical(INVALID_OPERATION, "Attempt to seek further than platform allows");
+ QT3DS_ASSERT(false);
+ return;
+ } else {
+ CFileTools::SetStreamPosition(m_File, inOffset, inEnum);
+ }
+ }
+ QT3DSI64 GetPosition() const override
+ {
+ return m_File.pos();
+ }
+
+ static SInputStream *OpenFile(const QString &inPath, NVFoundationBase &inFoundation)
+ {
+ return QT3DS_NEW(inFoundation.getAllocator(), SInputStream)(inFoundation, inPath);
+ }
+};
+
+typedef eastl::basic_string<char8_t, ForwardingAllocator> TStrType;
+struct SFactory : public IInputStreamFactory
+{
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+
+ Mutex m_Mutex;
+ typedef Mutex::ScopedLock TScopedLock;
+
+ const QString QT3DSTUDIO_TAG = QStringLiteral("qt3dstudio");
+
+ SFactory(NVFoundationBase &inFoundation)
+ : m_Foundation(inFoundation)
+ , mRefCount(0)
+ , m_Mutex(inFoundation.getAllocator())
+ {
+ // Add the top-level qrc directory
+ if (!QDir::searchPaths(QT3DSTUDIO_TAG).contains(QLatin1String(":/")))
+ QDir::addSearchPath(QT3DSTUDIO_TAG, QStringLiteral(":/"));
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ QFileInfo matchCaseInsensitiveFile(const QString& file, bool inQuiet)
+ {
+ if (!inQuiet) {
+ // Some assets are searched for in several levels in the project structure,
+ // we don't want to alert user of things that can't be fixed in the presentation
+ // itself.
+ qCWarning(WARNING, PERF_INFO, "Case-insensitive matching with file: %s",
+ file.toLatin1().constData());
+ }
+ const QStringList searchDirectories = QDir::searchPaths(QT3DSTUDIO_TAG);
+ for (const auto &directoryPath : searchDirectories) {
+ QFileInfo fileInfo(file);
+ QDirIterator it(directoryPath, {fileInfo.fileName()}, QDir::NoFilter,
+ QDirIterator::Subdirectories);
+ while (it.hasNext()) {
+ QString filePath = it.next();
+ if (filePath.compare(QDir::cleanPath(directoryPath + '/' + file),
+ Qt::CaseInsensitive) == 0) {
+ return QFileInfo(filePath);
+ }
+ }
+ }
+
+ return QFileInfo();
+ }
+
+ void AddSearchDirectory(const char8_t *inDirectory) override
+ {
+ TScopedLock __factoryLocker(m_Mutex);
+ QString localDir = CFileTools::NormalizePathForQtUsage(inDirectory);
+ QDir directory(localDir);
+ if (!directory.exists()) {
+ qCCritical(INTERNAL_ERROR, "Adding search directory: %s", inDirectory);
+ return;
+ }
+
+ if (!QDir::searchPaths(QT3DSTUDIO_TAG).contains(localDir))
+ QDir::addSearchPath(QT3DSTUDIO_TAG, localDir);
+ }
+
+
+ IRefCountedInputStream *GetStreamForFile(const QString &inFilename, bool inQuiet) override
+ {
+ TScopedLock __factoryLocker(m_Mutex);
+ QString localFile = CFileTools::NormalizePathForQtUsage(inFilename);
+ QFileInfo fileInfo = QFileInfo(localFile);
+ SInputStream *inputStream = nullptr;
+ // Try to match the file with the search paths
+ if (!fileInfo.exists())
+ fileInfo.setFile(QStringLiteral("qt3dstudio:") + localFile);
+
+ // Try to match the case-insensitive file with the given search paths
+ if (!fileInfo.exists())
+ fileInfo = matchCaseInsensitiveFile(localFile, inQuiet);
+
+ if (fileInfo.exists())
+ inputStream = SInputStream::OpenFile(fileInfo.absoluteFilePath(), m_Foundation);
+
+ if (!inputStream && !inQuiet) {
+ // Print extensive debugging information.
+ qCCritical(INTERNAL_ERROR, "Failed to find file: %s", localFile.toLatin1().constData());
+ qCCritical(INTERNAL_ERROR, "Searched path: %s",
+ QDir::searchPaths(QT3DSTUDIO_TAG).join(',').toLatin1().constData());
+ }
+ return inputStream;
+ }
+
+ bool GetPathForFile(const QString &inFilename, QString &outFile,
+ bool inQuiet = false) override
+ {
+ NVScopedRefCounted<IRefCountedInputStream> theStream =
+ GetStreamForFile(inFilename, inQuiet);
+ if (theStream) {
+ SInputStream *theRealStream = static_cast<SInputStream *>(theStream.mPtr);
+ outFile = theRealStream->m_Path;
+ return true;
+ }
+ return false;
+ }
+};
+}
+
+IInputStreamFactory &IInputStreamFactory::Create(NVFoundationBase &inFoundation)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), SFactory)(inFoundation);
+}
diff --git a/src/runtimerender/Qt3DSRenderInputStreamFactory.h b/src/runtimerender/Qt3DSRenderInputStreamFactory.h
new file mode 100644
index 0000000..e82134b
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderInputStreamFactory.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_INPUT_STREAM_FACTORY_H
+#define QT3DS_RENDER_INPUT_STREAM_FACTORY_H
+#include "Qt3DSRender.h"
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "EASTL/string.h"
+
+namespace qt3ds {
+namespace render {
+ class IRefCountedInputStream : public qt3ds::foundation::ISeekableIOStream, public NVRefCounted
+ {
+ protected:
+ virtual ~IRefCountedInputStream() {}
+ };
+ // This class is threadsafe.
+ class IInputStreamFactory : public NVRefCounted
+ {
+ protected:
+ virtual ~IInputStreamFactory() {}
+ public:
+ // These directories must have a '/' on them
+ virtual void AddSearchDirectory(const char8_t *inDirectory) = 0;
+ virtual IRefCountedInputStream *GetStreamForFile(const QString &inFilename,
+ bool inQuiet = false) = 0;
+ // Return a path for this file. Returns true if GetStreamForFile would return a valid
+ // stream.
+ // else returns false
+ virtual bool GetPathForFile(const QString &inFilename, QString &outFile,
+ bool inQuiet = false) = 0;
+
+ // Create an input stream factory using this foundation and an platform-optional app
+ // directory
+ // on android the app directory has no effect; use use the assets bundled with the APK file.
+ static IInputStreamFactory &Create(NVFoundationBase &inFoundation);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderLightConstantProperties.h b/src/runtimerender/Qt3DSRenderLightConstantProperties.h
new file mode 100644
index 0000000..4dcd62c
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderLightConstantProperties.h
@@ -0,0 +1,198 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_RENDER_LIGHT_CONSTANT_PROPERTIES
+#define QT3DS_RENDER_LIGHT_CONSTANT_PROPERTIES
+
+#include "render/Qt3DSRenderShaderProgram.h"
+
+namespace qt3ds {
+namespace render {
+
+static const QStringList lconstantnames = {
+ QStringLiteral("position"),
+ QStringLiteral("direction"),
+ QStringLiteral("up"),
+ QStringLiteral("right"),
+ QStringLiteral("diffuse"),
+ QStringLiteral("ambient"),
+ QStringLiteral("specular"),
+ QStringLiteral("spotExponent"),
+ QStringLiteral("spotCutoff"),
+ QStringLiteral("constantAttenuation"),
+ QStringLiteral("linearAttenuation"),
+ QStringLiteral("quadraticAttenuation"),
+ QStringLiteral("range"),
+ QStringLiteral("width"),
+ QStringLiteral("height"),
+ QStringLiteral("shadowControls"),
+ QStringLiteral("shadowView"),
+ QStringLiteral("shadowIdx"),
+ QStringLiteral("attenuation")
+};
+
+#define LCSEED QStringLiteral("%1%2")
+
+template <typename GeneratedShader>
+struct SLightConstantProperties
+{
+ struct LightConstants
+ {
+ NVRenderCachedShaderProperty<QT3DSVec4> m_position;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_direction;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_up;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_right;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_diffuse;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_ambient;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_specular;
+ NVRenderCachedShaderProperty<QT3DSF32> m_spotExponent;
+ NVRenderCachedShaderProperty<QT3DSF32> m_spotCutoff;
+ NVRenderCachedShaderProperty<QT3DSF32> m_constantAttenuation;
+ NVRenderCachedShaderProperty<QT3DSF32> m_linearAttenuation;
+ NVRenderCachedShaderProperty<QT3DSF32> m_quadraticAttenuation;
+ NVRenderCachedShaderProperty<QT3DSF32> m_range;
+ NVRenderCachedShaderProperty<QT3DSF32> m_width;
+ NVRenderCachedShaderProperty<QT3DSF32> m_height;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_shadowControls;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_shadowView;
+ NVRenderCachedShaderProperty<QT3DSI32> m_shadowIdx;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_attenuation;
+
+ LightConstants(const QString &lightRef, render::NVRenderShaderProgram &shader)
+ : m_position(LCSEED.arg(lightRef, lconstantnames[0]), shader)
+ , m_direction(LCSEED.arg(lightRef).arg(lconstantnames[1]), shader)
+ , m_up(LCSEED.arg(lightRef, lconstantnames[2]), shader)
+ , m_right(LCSEED.arg(lightRef, lconstantnames[3]), shader)
+ , m_diffuse(LCSEED.arg(lightRef, lconstantnames[4]), shader)
+ , m_ambient(LCSEED.arg(lightRef, lconstantnames[5]), shader)
+ , m_specular(LCSEED.arg(lightRef, lconstantnames[6]), shader)
+ , m_spotExponent(LCSEED.arg(lightRef, lconstantnames[7]), shader)
+ , m_spotCutoff(LCSEED.arg(lightRef, lconstantnames[8]), shader)
+ , m_constantAttenuation(LCSEED.arg(lightRef, lconstantnames[9]), shader)
+ , m_linearAttenuation(LCSEED.arg(lightRef, lconstantnames[10]), shader)
+ , m_quadraticAttenuation(LCSEED.arg(lightRef, lconstantnames[11]), shader)
+ , m_range(LCSEED.arg(lightRef, lconstantnames[12]), shader)
+ , m_width(LCSEED.arg(lightRef, lconstantnames[13]), shader)
+ , m_height(LCSEED.arg(lightRef, lconstantnames[14]), shader)
+ , m_shadowControls(LCSEED.arg(lightRef, lconstantnames[15]), shader)
+ , m_shadowView(LCSEED.arg(lightRef, lconstantnames[16]), shader)
+ , m_shadowIdx(LCSEED.arg(lightRef, lconstantnames[17]), shader)
+ , m_attenuation(LCSEED.arg(lightRef, lconstantnames[18]), shader)
+ {
+
+ }
+
+ template <typename LightProps>
+ void updateLights(LightProps &props)
+ {
+ m_position.Set(props.m_position);
+ m_direction.Set(props.m_direction);
+ m_up.Set(props.m_up);
+ m_right.Set(props.m_right);
+ m_diffuse.Set(props.m_diffuse);
+ m_ambient.Set(props.m_ambient);
+ m_specular.Set(props.m_specular);
+ m_spotExponent.Set(props.m_spotExponent);
+ m_spotCutoff.Set(props.m_spotCutoff);
+ m_constantAttenuation.Set(props.m_constantAttenuation);
+ m_linearAttenuation.Set(props.m_linearAttenuation);
+ m_quadraticAttenuation.Set(props.m_quadraticAttenuation);
+ m_range.Set(props.m_range);
+ m_width.Set(props.m_width);
+ m_height.Set(props.m_height);
+ m_shadowControls.Set(props.m_shadowControls);
+ m_shadowView.Set(props.m_shadowView);
+ m_shadowIdx.Set(props.m_shadowIdx);
+ m_attenuation.Set(QT3DSVec3(props.m_constantAttenuation,
+ props.m_linearAttenuation,
+ props.m_quadraticAttenuation));
+ }
+ };
+
+ SLightConstantProperties(GeneratedShader &shader, bool packed)
+ : m_lightCount("uNumLights", shader.m_Shader)
+ {
+ m_constants.resize(shader.m_Lights.size());
+ for (unsigned int i = 0; i < shader.m_Lights.size(); ++i) {
+ QString lref;
+ if (packed)
+ lref = QStringLiteral("light_%1_");
+ else
+ lref = QStringLiteral("lights[%1].");
+ lref = lref.arg(i);
+ m_constants[i] = new LightConstants(lref, shader.m_Shader);
+ }
+ m_lightCount.Set(shader.m_Lights.size());
+ m_lightCountInt = shader.m_Lights.size();
+ }
+
+ SLightConstantProperties(const QString &lseed, const QString &lcount,
+ GeneratedShader &shader, bool packed, int count)
+ : m_lightCount(lcount, shader.m_Shader)
+ {
+ m_constants.resize(count);
+ for (int i = 0; i < count; ++i) {
+ QString lref;
+ if (packed)
+ lref = lseed + QStringLiteral("_%1_");
+ else
+ lref = lseed + QStringLiteral("[%1].");
+ lref = lref.arg(i);
+ m_constants[i] = new LightConstants(lref, shader.m_Shader);
+ }
+ m_lightCount.Set(count);
+ m_lightCountInt = count;
+ }
+
+ ~SLightConstantProperties()
+ {
+ qDeleteAll(m_constants);
+ }
+
+ void updateLights(GeneratedShader &shader)
+ {
+ for (int i = 0; i < m_constants.size(); ++i)
+ m_constants[i]->updateLights(shader.m_Lights[i].m_LightData);
+ }
+ template <typename LightProps>
+ void updateLights(const QVector<LightProps*> &props)
+ {
+ for (int i = 0; i < m_constants.size(); ++i)
+ m_constants[i]->updateLights(props[i]->m_LightData);
+ }
+
+ QVector<LightConstants *> m_constants;
+ NVRenderCachedShaderProperty<QT3DSI32> m_lightCount;
+ int m_lightCountInt;
+};
+
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderMaterialHelpers.h b/src/runtimerender/Qt3DSRenderMaterialHelpers.h
new file mode 100644
index 0000000..afb799e
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderMaterialHelpers.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_MATERIAL_HELPERS_H
+#define QT3DS_RENDER_MATERIAL_HELPERS_H
+#include "Qt3DSRenderCustomMaterial.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "Qt3DSRenderReferencedMaterial.h"
+
+namespace qt3ds {
+namespace render {
+
+ inline bool IsMaterial(SGraphObject &obj)
+ {
+ return obj.m_Type == GraphObjectTypes::CustomMaterial
+ || obj.m_Type == GraphObjectTypes::DefaultMaterial
+ || obj.m_Type == GraphObjectTypes::ReferencedMaterial;
+ }
+
+ inline bool IsMaterial(SGraphObject *obj)
+ {
+ if (obj)
+ return IsMaterial(*obj);
+ return false;
+ }
+
+ inline bool IsImage(SGraphObject &obj) { return obj.m_Type == GraphObjectTypes::Image; }
+
+ inline bool IsImage(SGraphObject *obj)
+ {
+ if (obj)
+ return IsImage(*obj);
+ return false;
+ }
+
+ inline SGraphObject *GetNextMaterialSibling(SGraphObject *obj)
+ {
+ if (obj == NULL)
+ return NULL;
+ if (IsMaterial(obj) == false) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ if (obj->m_Type == GraphObjectTypes::CustomMaterial)
+ return static_cast<SCustomMaterial *>(obj)->m_NextSibling;
+ else if (obj->m_Type == GraphObjectTypes::DefaultMaterial)
+ return static_cast<SDefaultMaterial *>(obj)->m_NextSibling;
+ else
+ return static_cast<SReferencedMaterial *>(obj)->m_NextSibling;
+ }
+
+ inline void SetNextMaterialSibling(SGraphObject &obj, SGraphObject *sibling)
+ {
+ if (IsMaterial(obj) == false) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ if (obj.m_Type == GraphObjectTypes::CustomMaterial)
+ static_cast<SCustomMaterial *>(&obj)->m_NextSibling = sibling;
+ else if (obj.m_Type == GraphObjectTypes::DefaultMaterial)
+ static_cast<SDefaultMaterial *>(&obj)->m_NextSibling = sibling;
+ else
+ static_cast<SReferencedMaterial *>(&obj)->m_NextSibling = sibling;
+ }
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h b/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h
new file mode 100644
index 0000000..e8b9880
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_MATERIAL_SHADER_GENERATOR_H
+#define QT3DS_RENDER_MATERIAL_SHADER_GENERATOR_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSRenderShaderKeys.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+
+namespace qt3ds {
+namespace render {
+
+// these are our current shader limits
+#define QT3DS_MAX_NUM_LIGHTS 16
+#define QT3DS_MAX_NUM_SHADOWS 8
+
+ // note this struct must exactly match the memory layout of the
+ // struct sampleLight.glsllib and sampleArea.glsllib. If you make changes here you need
+ // to adjust the code in sampleLight.glsllib and sampleArea.glsllib as well
+ struct SLightSourceShader
+ {
+ QT3DSVec4 m_position;
+ QT3DSVec4 m_direction; // Specifies the light direction in world coordinates.
+ QT3DSVec4 m_up;
+ QT3DSVec4 m_right;
+ QT3DSVec4 m_diffuse;
+ QT3DSVec4 m_ambient;
+ QT3DSVec4 m_specular;
+ QT3DSF32 m_spotExponent; // Specifies the intensity distribution of the light.
+ QT3DSF32 m_spotCutoff; // Specifies the maximum spread angle of the light.
+ QT3DSF32 m_constantAttenuation; // Specifies the constant light attenuation factor.
+ QT3DSF32 m_linearAttenuation; // Specifies the linear light attenuation factor.
+ QT3DSF32 m_quadraticAttenuation; // Specifies the quadratic light attenuation factor.
+ QT3DSF32 m_range; // Specifies the maximum distance of the light influence
+ QT3DSF32 m_width; // Specifies the width of the area light surface.
+ QT3DSF32 m_height; // Specifies the height of the area light surface;
+ QT3DSVec4 m_shadowControls;
+ QT3DSMat44 m_shadowView;
+ QT3DSI32 m_shadowIdx;
+ QT3DSF32 m_padding1[3];
+ };
+
+ struct SLayerGlobalRenderProperties
+ {
+ const SLayer &m_Layer;
+ SCamera &m_Camera;
+ QT3DSVec3 m_CameraDirection;
+ NVDataRef<SLight *> m_Lights;
+ NVDataRef<QT3DSVec3> m_LightDirections;
+ Qt3DSShadowMap *m_ShadowMapManager;
+ NVRenderTexture2D *m_DepthTexture;
+ NVRenderTexture2D *m_SSaoTexture;
+ SImage *m_LightProbe;
+ SImage *m_LightProbe2;
+ QT3DSF32 m_ProbeHorizon;
+ QT3DSF32 m_ProbeBright;
+ QT3DSF32 m_Probe2Window;
+ QT3DSF32 m_Probe2Pos;
+ QT3DSF32 m_Probe2Fade;
+ QT3DSF32 m_ProbeFOV;
+
+ SLayerGlobalRenderProperties(const SLayer &inLayer, SCamera &inCamera,
+ QT3DSVec3 inCameraDirection, NVDataRef<SLight *> inLights,
+ NVDataRef<QT3DSVec3> inLightDirections,
+ Qt3DSShadowMap *inShadowMapManager,
+ NVRenderTexture2D *inDepthTexture,
+ NVRenderTexture2D *inSSaoTexture, SImage *inLightProbe,
+ SImage *inLightProbe2, QT3DSF32 inProbeHorizon,
+ QT3DSF32 inProbeBright, QT3DSF32 inProbe2Window, QT3DSF32 inProbe2Pos,
+ QT3DSF32 inProbe2Fade, QT3DSF32 inProbeFOV)
+ : m_Layer(inLayer)
+ , m_Camera(inCamera)
+ , m_CameraDirection(inCameraDirection)
+ , m_Lights(inLights)
+ , m_LightDirections(inLightDirections)
+ , m_ShadowMapManager(inShadowMapManager)
+ , m_DepthTexture(inDepthTexture)
+ , m_SSaoTexture(inSSaoTexture)
+ , m_LightProbe(inLightProbe)
+ , m_LightProbe2(inLightProbe2)
+ , m_ProbeHorizon(inProbeHorizon)
+ , m_ProbeBright(inProbeBright)
+ , m_Probe2Window(inProbe2Window)
+ , m_Probe2Pos(inProbe2Pos)
+ , m_Probe2Fade(inProbe2Fade)
+ , m_ProbeFOV(inProbeFOV)
+ {
+ }
+ };
+
+ class IMaterialShaderGenerator : public NVRefCounted
+ {
+ public:
+ struct SImageVariableNames
+ {
+ const char8_t *m_ImageSampler;
+ const char8_t *m_ImageFragCoords;
+ };
+
+ virtual SImageVariableNames GetImageVariableNames(QT3DSU32 inIdx) = 0;
+ virtual void GenerateImageUVCoordinates(IShaderStageGenerator &inVertexPipeline, QT3DSU32 idx,
+ QT3DSU32 uvSet, SRenderableImage &image) = 0;
+
+ // inPipelineName needs to be unique else the shader cache will just return shaders from
+ // different pipelines.
+ virtual NVRenderShaderProgram *GenerateShader(
+ const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ NVDataRef<SLight *> inLights, SRenderableImage *inFirstImage, bool inHasTransparency,
+ const char8_t *inVertexPipelineName, const char8_t *inCustomMaterialName = "") = 0;
+
+ // Also sets the blend function on the render context.
+ virtual void
+ SetMaterialProperties(NVRenderShaderProgram &inProgram, const SGraphObject &inMaterial,
+ const QT3DSVec2 &inCameraVec, const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix, const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ SLayerGlobalRenderProperties inRenderProperties) = 0;
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderMesh.h b/src/runtimerender/Qt3DSRenderMesh.h
new file mode 100644
index 0000000..d6959ec
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderMesh.h
@@ -0,0 +1,187 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_MESH_H
+#define QT3DS_RENDER_MESH_H
+#include "Qt3DSRender.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "render/Qt3DSRenderInputAssembler.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSNoCopy.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SRenderSubsetBase
+ {
+ QT3DSU32 m_Count;
+ QT3DSU32 m_Offset;
+ NVBounds3 m_Bounds; // Vertex buffer bounds
+ SRenderSubsetBase() {}
+ SRenderSubsetBase(const SRenderSubsetBase &inOther)
+ : m_Count(inOther.m_Count)
+ , m_Offset(inOther.m_Offset)
+ , m_Bounds(inOther.m_Bounds)
+ {
+ }
+
+ SRenderSubsetBase &operator=(const SRenderSubsetBase &inOther)
+ {
+ m_Count = inOther.m_Count;
+ m_Offset = inOther.m_Offset;
+ m_Bounds = inOther.m_Bounds;
+ return *this;
+ }
+ };
+
+ struct SRenderJoint
+ {
+ QT3DSI32 m_JointID;
+ QT3DSI32 m_ParentID;
+ QT3DSF32 m_invBindPose[16];
+ QT3DSF32 m_localToGlobalBoneSpace[16];
+ };
+
+ struct SRenderSubset : public SRenderSubsetBase
+ {
+ NVRenderInputAssembler *m_InputAssembler;
+ NVRenderInputAssembler *m_InputAssemblerDepth;
+ NVRenderInputAssembler
+ *m_InputAssemblerPoints; ///< similar to depth but ignores index buffer.
+ NVRenderVertexBuffer *m_VertexBuffer;
+ NVRenderVertexBuffer
+ *m_PosVertexBuffer; ///< separate position buffer for fast depth path rendering
+ NVRenderIndexBuffer *m_IndexBuffer;
+ NVRenderDrawMode::Enum m_PrimitiveType; ///< primitive type used for drawing
+ QT3DSF32 m_EdgeTessFactor; ///< edge tessellation amount used for tessellation shaders
+ QT3DSF32 m_InnerTessFactor; ///< inner tessellation amount used for tessellation shaders
+ bool m_WireframeMode; ///< true if we should draw the object as wireframe ( currently ony if
+ ///tessellation is enabled )
+ NVConstDataRef<SRenderJoint> m_Joints;
+ CRegisteredString m_Name;
+ nvvector<SRenderSubsetBase> m_SubSubsets;
+
+ SRenderSubset(NVAllocatorCallback &alloc)
+ : m_InputAssembler(NULL)
+ , m_InputAssemblerDepth(NULL)
+ , m_InputAssemblerPoints(NULL)
+ , m_VertexBuffer(NULL)
+ , m_PosVertexBuffer(NULL)
+ , m_IndexBuffer(NULL)
+ , m_PrimitiveType(NVRenderDrawMode::Triangles)
+ , m_EdgeTessFactor(1.0)
+ , m_InnerTessFactor(1.0)
+ , m_WireframeMode(false)
+ , m_SubSubsets(alloc, "SRenderSubset::m_SubSubsets")
+ {
+ }
+ SRenderSubset(const SRenderSubset &inOther)
+ : SRenderSubsetBase(inOther)
+ , m_InputAssembler(inOther.m_InputAssembler)
+ , m_InputAssemblerDepth(inOther.m_InputAssemblerDepth)
+ , m_InputAssemblerPoints(inOther.m_InputAssemblerPoints)
+ , m_VertexBuffer(inOther.m_VertexBuffer)
+ , m_PosVertexBuffer(inOther.m_PosVertexBuffer)
+ , m_IndexBuffer(inOther.m_IndexBuffer)
+ , m_PrimitiveType(inOther.m_PrimitiveType)
+ , m_EdgeTessFactor(inOther.m_EdgeTessFactor)
+ , m_InnerTessFactor(inOther.m_InnerTessFactor)
+ , m_WireframeMode(inOther.m_WireframeMode)
+ , m_Joints(inOther.m_Joints)
+ , m_Name(inOther.m_Name)
+ , m_SubSubsets(inOther.m_SubSubsets)
+ {
+ }
+ // Note that subSubsets is *not* copied.
+ SRenderSubset(NVAllocatorCallback &alloc, const SRenderSubset &inOther,
+ const SRenderSubsetBase &inBase)
+ : SRenderSubsetBase(inBase)
+ , m_InputAssembler(inOther.m_InputAssembler)
+ , m_InputAssemblerDepth(inOther.m_InputAssemblerDepth)
+ , m_InputAssemblerPoints(inOther.m_InputAssemblerPoints)
+ , m_VertexBuffer(inOther.m_VertexBuffer)
+ , m_PosVertexBuffer(inOther.m_PosVertexBuffer)
+ , m_IndexBuffer(inOther.m_IndexBuffer)
+ , m_PrimitiveType(inOther.m_PrimitiveType)
+ , m_EdgeTessFactor(inOther.m_EdgeTessFactor)
+ , m_InnerTessFactor(inOther.m_InnerTessFactor)
+ , m_WireframeMode(inOther.m_WireframeMode)
+ , m_Name(inOther.m_Name)
+ , m_SubSubsets(alloc, "SRenderSubset::m_SubSubsets")
+ {
+ }
+
+ SRenderSubset &operator=(const SRenderSubset &inOther)
+ {
+ if (this != &inOther) {
+ SRenderSubsetBase::operator=(inOther);
+ m_InputAssembler = inOther.m_InputAssembler;
+ m_InputAssemblerDepth = inOther.m_InputAssemblerDepth;
+ m_VertexBuffer = inOther.m_VertexBuffer;
+ m_PosVertexBuffer = inOther.m_PosVertexBuffer;
+ m_IndexBuffer = inOther.m_IndexBuffer;
+ m_PrimitiveType = inOther.m_PrimitiveType;
+ m_EdgeTessFactor = inOther.m_EdgeTessFactor;
+ m_InnerTessFactor = inOther.m_InnerTessFactor;
+ m_WireframeMode = inOther.m_WireframeMode;
+ m_Joints = inOther.m_Joints;
+ m_Name = inOther.m_Name;
+ m_SubSubsets = inOther.m_SubSubsets;
+ }
+ return *this;
+ }
+ };
+
+ struct SRenderMesh : public NoCopy
+ {
+ nvvector<SRenderSubset> m_Subsets;
+ nvvector<SRenderJoint> m_Joints;
+ NVRenderDrawMode::Enum m_DrawMode;
+ NVRenderWinding::Enum m_Winding; // counterclockwise
+ QT3DSU32 m_MeshId; // Id from the file of this mesh.
+
+ SRenderMesh(NVRenderDrawMode::Enum inDrawMode, NVRenderWinding::Enum inWinding,
+ QT3DSU32 inMeshId, NVAllocatorCallback &alloc)
+ : m_Subsets(alloc, "SRenderMesh::m_Subsets")
+ , m_Joints(alloc, "SRenderMesh::Joints")
+ , m_DrawMode(inDrawMode)
+ , m_Winding(inWinding)
+ , m_MeshId(inMeshId)
+ {
+ }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderPathManager.cpp b/src/runtimerender/Qt3DSRenderPathManager.cpp
new file mode 100644
index 0000000..5b2c51d
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPathManager.cpp
@@ -0,0 +1,1964 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderPathManager.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSContainers.h"
+#include "EASTL/string.h"
+#include "Qt3DSRenderContextCore.h"
+#include "foundation/Utils.h"
+#include "foundation/StringConversionImpl.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderInputAssembler.h"
+#include "Qt3DSRenderPath.h"
+#include "EASTL/sort.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderShaderCodeGenerator.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderPathRenderContext.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+#include "Qt3DSRenderCustomMaterialShaderGenerator.h"
+#include "Qt3DSRenderCustomMaterial.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "rendererimpl/Qt3DSVertexPipelineImpl.h"
+#include "foundation/Qt3DSMathUtils.h"
+#include "render/Qt3DSRenderPathRender.h"
+#include "render/Qt3DSRenderPathSpecification.h"
+#include "Qt3DSRenderPathSubPath.h"
+#include "Qt3DSImportPath.h"
+#include "Qt3DSRenderPathMath.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "foundation/Qt3DSMutex.h"
+
+using namespace qt3ds::render;
+using qt3ds::render::NVRenderCachedShaderProperty;
+using qt3ds::render::NVRenderCachedShaderBuffer;
+using qt3ds::render::NVRenderStencilFunctionArgument;
+using qt3ds::render::NVRenderBoolOp;
+using qt3ds::render::NVRenderStencilOperationArgument;
+using qt3ds::render::NVRenderStencilOp;
+
+typedef qt3dsimp::SPathBuffer TImportPathBuffer;
+using namespace qt3ds::render::path;
+
+typedef eastl::pair<CRegisteredString, CRegisteredString> TStrStrPair;
+
+namespace eastl {
+template <>
+struct hash<TStrStrPair>
+{
+ size_t operator()(const TStrStrPair &item) const
+ {
+ return eastl::hash<CRegisteredString>()(item.first)
+ ^ eastl::hash<CRegisteredString>()(item.second);
+ }
+};
+}
+
+struct SPathShaderMapKey
+{
+ CRegisteredString m_Name;
+ SShaderDefaultMaterialKey m_MaterialKey;
+ size_t m_HashCode;
+ SPathShaderMapKey(CRegisteredString inName, SShaderDefaultMaterialKey inKey)
+ : m_Name(inName)
+ , m_MaterialKey(inKey)
+ {
+ m_HashCode = eastl::hash<TStrStrPair>()(m_Name) ^ m_MaterialKey.hash();
+ }
+ bool operator==(const SPathShaderMapKey &inKey) const
+ {
+ return m_Name == inKey.m_Name && m_MaterialKey == inKey.m_MaterialKey;
+ }
+};
+
+namespace eastl {
+template <>
+struct hash<SPathShaderMapKey>
+{
+ size_t operator()(const SPathShaderMapKey &inKey) const { return inKey.m_HashCode; }
+};
+}
+
+namespace {
+
+struct SPathSubPathBuffer
+{
+ NVAllocatorCallback &m_Allocator;
+ nvvector<SPathAnchorPoint> m_SourceData;
+ SPathDirtyFlags m_Flags;
+ SPathSubPath &m_SubPath;
+ bool m_Closed;
+
+ QT3DSI32 m_RefCount;
+
+ SPathSubPathBuffer(NVAllocatorCallback &alloc, SPathSubPath &inSubPath)
+ : m_Allocator(alloc)
+ , m_SourceData(alloc, "m_SourceData")
+ , m_SubPath(inSubPath)
+ , m_Closed(false)
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() { atomicIncrement(&m_RefCount); }
+ void release()
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Allocator);
+ NVDelete(alloc, this);
+ }
+ }
+};
+
+struct SImportPathWrapper
+{
+ NVAllocatorCallback &m_Alloc;
+ qt3dsimp::SPathBuffer *m_Path;
+ QT3DSI32 m_RefCount;
+
+ SImportPathWrapper(NVAllocatorCallback &inAlloc, qt3dsimp::SPathBuffer &inPath)
+ : m_Alloc(inAlloc)
+ , m_Path(&inPath)
+ , m_RefCount(0)
+ {
+ }
+
+ ~SImportPathWrapper() { m_Path->Free(m_Alloc); }
+
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Alloc);
+ NVDelete(alloc, this);
+ }
+ }
+};
+
+typedef NVScopedRefCounted<SImportPathWrapper> TPathBufferPtr;
+
+struct SPathBuffer
+{
+ NVAllocatorCallback &m_Allocator;
+ nvvector<NVScopedRefCounted<SPathSubPathBuffer>> m_SubPaths;
+ TPathBufferPtr m_PathBuffer;
+
+ NVScopedRefCounted<NVRenderVertexBuffer> m_PatchData;
+ NVScopedRefCounted<NVRenderInputAssembler> m_InputAssembler;
+ NVScopedRefCounted<NVRenderPathRender> m_PathRender;
+
+ QT3DSVec2 m_BeginTaperData;
+ QT3DSVec2 m_EndTaperData;
+ QT3DSU32 m_NumVertexes;
+ PathTypes::Enum m_PathType;
+ QT3DSF32 m_Width;
+ QT3DSF32 m_CPUError;
+ NVBounds3 m_Bounds;
+ Option<STaperInformation> m_BeginTaper;
+ Option<STaperInformation> m_EndTaper;
+ CRegisteredString m_SourcePath;
+
+ // Cached data for geometry paths
+
+ SPathDirtyFlags m_Flags;
+
+ QT3DSI32 m_RefCount;
+
+ SPathBuffer(NVAllocatorCallback &alloc)
+ : m_Allocator(alloc)
+ , m_SubPaths(alloc, "m_SubPaths")
+ , m_NumVertexes(0)
+ , m_PathType(PathTypes::Geometry)
+ , m_Width(0.0f)
+ , m_CPUError(0.0f)
+ , m_Bounds(NVBounds3::empty())
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() { atomicIncrement(&m_RefCount); }
+ void release()
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(m_Allocator);
+ NVDelete(alloc, this);
+ }
+ }
+
+ void ClearGeometryPathData()
+ {
+ m_PatchData = NULL;
+ m_InputAssembler = NULL;
+ }
+
+ void ClearPaintedPathData() { m_PathRender = NULL; }
+
+ qt3dsimp::SPathBuffer GetPathData(qt3dsimp::IPathBufferBuilder &inSpec)
+ {
+ if (m_SubPaths.size()) {
+ inSpec.Clear();
+ for (QT3DSU32 idx = 0, end = m_SubPaths.size(); idx < end; ++idx) {
+ const SPathSubPathBuffer &theSubPathBuffer(*m_SubPaths[idx]);
+ for (QT3DSU32 equationIdx = 0, equationEnd = theSubPathBuffer.m_SourceData.size();
+ equationIdx < equationEnd; ++equationIdx) {
+ const SPathAnchorPoint &thePoint = theSubPathBuffer.m_SourceData[equationIdx];
+ if (equationIdx == 0) {
+ inSpec.MoveTo(thePoint.m_Position);
+ } else {
+ const SPathAnchorPoint &thePrevPoint =
+ theSubPathBuffer.m_SourceData[equationIdx - 1];
+ QT3DSVec2 c1 = IPathManager::GetControlPointFromAngleDistance(
+ thePrevPoint.m_Position, thePrevPoint.m_OutgoingAngle,
+ thePrevPoint.m_OutgoingDistance);
+ QT3DSVec2 c2 = IPathManager::GetControlPointFromAngleDistance(
+ thePoint.m_Position, thePoint.m_IncomingAngle,
+ thePoint.m_IncomingDistance);
+ QT3DSVec2 p2 = thePoint.m_Position;
+ inSpec.CubicCurveTo(c1, c2, p2);
+ }
+ }
+ if (theSubPathBuffer.m_Closed)
+ inSpec.Close();
+ }
+ return inSpec.GetPathBuffer();
+ } else if (m_PathBuffer.mPtr)
+ return *m_PathBuffer.mPtr->m_Path;
+ return qt3dsimp::SPathBuffer();
+ }
+
+ void SetPathType(PathTypes::Enum inPathType)
+ {
+ if (inPathType != m_PathType) {
+ switch (m_PathType) {
+ case PathTypes::Geometry:
+ ClearGeometryPathData();
+ break;
+ case PathTypes::Painted:
+ ClearPaintedPathData();
+ break;
+ default:
+ QT3DS_ALWAYS_ASSERT_MESSAGE("Unexpected path type");
+ // No further processing for unexpected path type
+ return;
+ }
+ m_Flags.clearOrSet(true, PathDirtyFlagValues::PathType);
+ }
+ m_PathType = inPathType;
+ }
+
+ static Option<STaperInformation> ToTaperInfo(PathCapping::Enum capping, QT3DSF32 capOffset,
+ QT3DSF32 capOpacity, QT3DSF32 capWidth)
+ {
+ if (capping == PathCapping::Noner)
+ return Empty();
+
+ return STaperInformation(capOffset, capOpacity, capWidth);
+ }
+
+ void SetBeginTaperInfo(PathCapping::Enum capping, QT3DSF32 capOffset, QT3DSF32 capOpacity,
+ QT3DSF32 capWidth)
+ {
+ Option<STaperInformation> newBeginInfo =
+ ToTaperInfo(capping, capOffset, capOpacity, capWidth);
+ if (!OptionEquals(newBeginInfo, m_BeginTaper)) {
+ m_BeginTaper = newBeginInfo;
+ m_Flags.clearOrSet(true, PathDirtyFlagValues::BeginTaper);
+ }
+ }
+
+ void SetEndTaperInfo(PathCapping::Enum capping, QT3DSF32 capOffset, QT3DSF32 capOpacity,
+ QT3DSF32 capWidth)
+ {
+ Option<STaperInformation> newEndInfo =
+ ToTaperInfo(capping, capOffset, capOpacity, capWidth);
+ if (!OptionEquals(newEndInfo, m_EndTaper)) {
+ m_EndTaper = newEndInfo;
+ m_Flags.clearOrSet(true, PathDirtyFlagValues::EndTaper);
+ }
+ }
+
+ void SetWidth(QT3DSF32 inWidth)
+ {
+ if (inWidth != m_Width) {
+ m_Width = inWidth;
+ m_Flags.clearOrSet(true, PathDirtyFlagValues::Width);
+ }
+ }
+
+ void SetCPUError(QT3DSF32 inError)
+ {
+ if (inError != m_CPUError) {
+ m_CPUError = inError;
+ m_Flags.clearOrSet(true, PathDirtyFlagValues::CPUError);
+ }
+ }
+};
+
+struct SPathGeneratedShader
+{
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSF32> m_Width;
+ NVRenderCachedShaderProperty<QT3DSF32> m_InnerTessAmount;
+ NVRenderCachedShaderProperty<QT3DSF32> m_EdgeTessAmount;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_BeginTaperData;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_EndTaperData;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_WireframeViewMatrix;
+
+ QT3DSI32 m_RefCount;
+
+ SPathGeneratedShader(NVRenderShaderProgram &sh, NVAllocatorCallback &alloc)
+ : m_Allocator(alloc)
+ , m_Shader(sh)
+ , m_Width("pathWidth", sh)
+ , m_InnerTessAmount("tessInnerLevel", sh)
+ , m_EdgeTessAmount("tessEdgeLevel", sh)
+ , m_BeginTaperData("beginTaperInfo", sh)
+ , m_EndTaperData("endTaperInfo", sh)
+ , m_WireframeViewMatrix("viewport_matrix", sh)
+ , m_RefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ ~SPathGeneratedShader() { m_Shader.release(); }
+
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &allocator(m_Allocator);
+ NVDelete(allocator, this);
+ }
+ }
+};
+
+struct SPathVertexPipeline : public SVertexPipelineImpl
+{
+
+ SPathVertexPipeline(IShaderProgramGenerator &inProgGenerator,
+ IMaterialShaderGenerator &inMaterialGenerator, NVAllocatorCallback &inAlloc,
+ IStringTable &inStringTable, bool inWireframe)
+ : SVertexPipelineImpl(inAlloc, inMaterialGenerator, inProgGenerator, inStringTable,
+ inWireframe)
+ {
+ }
+
+ // Trues true if the code was *not* set.
+ bool SetCode(GenerationFlagValues::Enum inCode)
+ {
+ if (((QT3DSU32)m_GenerationFlags & inCode) != 0)
+ return true;
+ m_GenerationFlags |= inCode;
+ return false;
+ }
+
+ void AssignTessEvalVarying(const char8_t *inVarName, const char8_t *inVarValueExpr)
+ {
+ const char8_t *ext = "";
+ if (ProgramGenerator().GetEnabledStages() & ShaderGeneratorStages::Geometry)
+ ext = "TE";
+ TessEval() << "\t" << inVarName << ext << " = " << inVarValueExpr << ";" << Endl;
+ }
+
+ void AssignOutput(const char8_t *inVarName, const char8_t *inVarValueExpr) override
+ {
+ AssignTessEvalVarying(inVarName, inVarValueExpr);
+ }
+
+ void InitializeTessShaders()
+ {
+ IShaderStageGenerator &theTessControl(TessControl());
+ IShaderStageGenerator &theTessEval(TessEval());
+
+ // first setup tessellation control shader
+ theTessControl.AddUniform("tessEdgeLevel", "float");
+ theTessControl.AddUniform("tessInnerLevel", "float");
+
+ theTessControl.AddInclude("tessellationPath.glsllib");
+
+ theTessControl.Append("void main() {\n");
+ theTessControl.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ theTessControl.Append("\ttessShader( tessEdgeLevel, tessInnerLevel );\n");
+
+ bool hasGeometryShader =
+ ProgramGenerator().GetStage(ShaderGeneratorStages::Geometry) != NULL;
+
+ // second setup tessellation control shader
+ eastl::string outExt("");
+ if (hasGeometryShader)
+ outExt = "TE";
+
+ theTessEval.AddInclude("tessellationPath.glsllib");
+ theTessEval.AddUniform("normal_matrix", "mat3");
+ theTessEval.AddUniform("model_view_projection", "mat4");
+ theTessEval.AddUniform("pathWidth", "float");
+ theTessEval.AddUniform("material_diffuse", "vec4");
+ AddInterpolationParameter("varTexCoord0", "vec2");
+ AddInterpolationParameter("varTessOpacity", "float");
+
+ theTessEval.Append("void main() {\n");
+ theTessEval.Append("\tSTessShaderResult shaderResult = tessShader( pathWidth );\n");
+ theTessEval.Append("\tvec3 pos = shaderResult.m_Position;\n");
+ AssignTessEvalVarying("varTessOpacity", "shaderResult.m_Opacity");
+ AssignTessEvalVarying("varTexCoord0", "shaderResult.m_TexCoord.xy");
+ if (hasGeometryShader)
+ theTessEval << "\tvec2 varTexCoord0 = shaderResult.m_TexCoord.xy;\n";
+
+ theTessEval << "\tvec3 object_normal = vec3(0.0, 0.0, 1.0);\n";
+ theTessEval << "\tvec3 world_normal = normal_matrix * object_normal;\n";
+ theTessEval << "\tvec3 tangent = vec3( shaderResult.m_Tangent, 0.0 );\n";
+ theTessEval << "\tvec3 binormal = vec3( shaderResult.m_Binormal, 0.0 );\n";
+
+ // These are necessary for texture generation.
+ theTessEval << "\tvec3 uTransform;" << Endl;
+ theTessEval << "\tvec3 vTransform;" << Endl;
+
+ if (m_DisplacementImage) {
+ MaterialGenerator().GenerateImageUVCoordinates(*this, m_DisplacementIdx, 0,
+ *m_DisplacementImage);
+ theTessEval.AddUniform("displaceAmount", "float");
+ theTessEval.AddUniform("model_matrix", "mat4");
+ theTessEval.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+ IDefaultMaterialShaderGenerator::SImageVariableNames theVarNames =
+ MaterialGenerator().GetImageVariableNames(m_DisplacementIdx);
+
+ theTessEval.AddUniform(theVarNames.m_ImageSampler, "sampler2D");
+ IDefaultMaterialShaderGenerator::SImageVariableNames theNames =
+ MaterialGenerator().GetImageVariableNames(m_DisplacementIdx);
+ theTessEval << "\tpos = defaultMaterialFileDisplacementTexture( "
+ << theNames.m_ImageSampler << ", displaceAmount, "
+ << theNames.m_ImageFragCoords << outExt.c_str() << ", vec3( 0.0, 0.0, 1.0 )"
+ << ", pos.xyz );" << Endl;
+ }
+ }
+ void FinalizeTessControlShader() {}
+
+ void FinalizeTessEvaluationShader()
+ {
+ eastl::string outExt("");
+ if (ProgramGenerator().GetEnabledStages() & ShaderGeneratorStages::Geometry)
+ outExt = "TE";
+
+ IShaderStageGenerator &tessEvalShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ tessEvalShader.Append("\tgl_Position = model_view_projection * vec4( pos, 1.0 );\n");
+ }
+
+ void BeginVertexGeneration(QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) override
+ {
+ SetupDisplacement(displacementImageIdx, displacementImage);
+
+ TShaderGeneratorStageFlags theStages(IShaderProgramGenerator::DefaultFlags());
+ theStages |= ShaderGeneratorStages::TessControl;
+ theStages |= ShaderGeneratorStages::TessEval;
+ if (m_Wireframe) {
+ theStages |= ShaderGeneratorStages::Geometry;
+ }
+ ProgramGenerator().BeginProgram(theStages);
+ InitializeTessShaders();
+ if (m_Wireframe) {
+ InitializeWireframeGeometryShader();
+ }
+ // Open up each stage.
+ IShaderStageGenerator &vertexShader(Vertex());
+
+ vertexShader.AddIncoming("attr_pos", "vec4");
+
+ // useless vert shader because real work is done in TES.
+ vertexShader << "void main()\n"
+ "{\n";
+ vertexShader << "\tgl_Position = attr_pos;\n"; // if tessellation is enabled pass down
+ // object coordinates;
+ vertexShader << "}\n";
+ }
+
+ void BeginFragmentGeneration() override
+ {
+ Fragment().AddUniform("material_diffuse", "vec4");
+ Fragment() << "void main()" << Endl << "{" << Endl;
+ // We do not pass object opacity through the pipeline.
+ Fragment() << "\tfloat object_opacity = varTessOpacity * material_diffuse.a;" << Endl;
+ }
+ void DoGenerateUVCoords(QT3DSU32) override
+ {
+ // these are always generated regardless
+ }
+
+ // fragment shader expects varying vertex normal
+ // lighting in vertex pipeline expects world_normal
+ void DoGenerateWorldNormal() override { AssignTessEvalVarying("varNormal", "world_normal"); }
+ void DoGenerateObjectNormal() override
+ {
+ AssignTessEvalVarying("varObjectNormal", "object_normal");
+ }
+ void DoGenerateWorldPosition() override
+ {
+ TessEval().AddUniform("model_matrix", "mat4");
+ TessEval()
+ << "\tvec3 local_model_world_position = vec3((model_matrix * vec4(pos, 1.0)).xyz);\n";
+ }
+ void DoGenerateVarTangentAndBinormal() override
+ {
+ TessEval().AddUniform("normal_matrix", "mat3");
+ AssignOutput("varTangent", "normal_matrix * tangent");
+ AssignOutput("varBinormal", "normal_matrix * binormal");
+ }
+
+ void DoGenerateVertexColor() override
+ {
+ Vertex().AddIncoming("attr_color", "vec3");
+ Vertex() << "\tvarColor = attr_color;" << Endl;
+ }
+
+ void EndVertexGeneration(bool) override
+ {
+
+ if (HasTessellation()) {
+ // finalize tess control shader
+ FinalizeTessControlShader();
+ // finalize tess evaluation shader
+ FinalizeTessEvaluationShader();
+
+ TessControl().Append("}");
+ TessEval().Append("}");
+ }
+ if (m_Wireframe) {
+ // finalize geometry shader
+ FinalizeWireframeGeometryShader();
+ Geometry().Append("}");
+ }
+ }
+
+ void EndFragmentGeneration(bool) override { Fragment().Append("}"); }
+
+ void AddInterpolationParameter(const char8_t *inName, const char8_t *inType) override
+ {
+ m_InterpolationParameters.insert(eastl::make_pair(Str(inName), Str(inType)));
+ Fragment().AddIncoming(inName, inType);
+ if (HasTessellation()) {
+ eastl::string nameBuilder;
+ nameBuilder.assign(inName);
+ if (ProgramGenerator().GetEnabledStages() & ShaderGeneratorStages::Geometry)
+ nameBuilder.append("TE");
+
+ TessEval().AddOutgoing(nameBuilder.c_str(), inType);
+ }
+ }
+
+ IShaderStageGenerator &ActiveStage() override { return TessEval(); }
+};
+
+struct SPathXYGeneratedShader
+{
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_RectDimensions;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ModelMatrix;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraPosition;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraProperties;
+ QT3DSI32 m_RefCount;
+
+ SPathXYGeneratedShader(NVRenderShaderProgram &sh, NVAllocatorCallback &alloc)
+ : m_Allocator(alloc)
+ , m_Shader(sh)
+ , m_RectDimensions("uni_rect_dimensions", sh)
+ , m_ModelMatrix("model_matrix", sh)
+ , m_CameraPosition("camera_position", sh)
+ , m_CameraProperties("camera_properties", sh)
+ , m_RefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ virtual ~SPathXYGeneratedShader() { m_Shader.release(); }
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &allocator(m_Allocator);
+ NVDelete(allocator, this);
+ }
+ }
+};
+
+// Helper implements the vertex pipeline for mesh subsets when bound to the default material.
+// Should be completely possible to use for custom materials with a bit of refactoring.
+struct SXYRectVertexPipeline : public SVertexPipelineImpl
+{
+
+ SXYRectVertexPipeline(IShaderProgramGenerator &inProgGenerator,
+ IMaterialShaderGenerator &inMaterialGenerator,
+ NVAllocatorCallback &inAlloc, IStringTable &inStringTable)
+ : SVertexPipelineImpl(inAlloc, inMaterialGenerator, inProgGenerator, inStringTable, false)
+ {
+ }
+
+ void BeginVertexGeneration(QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) override
+ {
+ m_DisplacementIdx = displacementImageIdx;
+ m_DisplacementImage = displacementImage;
+
+ TShaderGeneratorStageFlags theStages(IShaderProgramGenerator::DefaultFlags());
+ ProgramGenerator().BeginProgram(theStages);
+ // Open up each stage.
+ IShaderStageGenerator &vertexShader(Vertex());
+ vertexShader.AddIncoming("attr_pos", "vec2");
+ vertexShader.AddUniform("uni_rect_dimensions", "vec4");
+
+ vertexShader << "void main()" << Endl << "{" << Endl;
+ vertexShader << "\tvec3 uTransform;" << Endl;
+ vertexShader << "\tvec3 vTransform;" << Endl;
+
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader
+ << "\tfloat posX = mix( uni_rect_dimensions.x, uni_rect_dimensions.z, attr_pos.x );"
+ << Endl;
+ vertexShader
+ << "\tfloat posY = mix( uni_rect_dimensions.y, uni_rect_dimensions.w, attr_pos.y );"
+ << Endl;
+ vertexShader << "\tvec3 pos = vec3(posX, posY, 0.0 );" << Endl;
+ vertexShader.Append("\tgl_Position = model_view_projection * vec4(pos, 1.0);");
+ }
+
+ void OutputParaboloidDepthShaders()
+ {
+ TShaderGeneratorStageFlags theStages(IShaderProgramGenerator::DefaultFlags());
+ ProgramGenerator().BeginProgram(theStages);
+ IShaderStageGenerator &vertexShader(Vertex());
+ vertexShader.AddIncoming("attr_pos", "vec2");
+ vertexShader.AddUniform("uni_rect_dimensions", "vec4");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader << "void main()" << Endl << "{" << Endl;
+ vertexShader
+ << "\tfloat posX = mix( uni_rect_dimensions.x, uni_rect_dimensions.z, attr_pos.x );"
+ << Endl;
+ vertexShader
+ << "\tfloat posY = mix( uni_rect_dimensions.y, uni_rect_dimensions.w, attr_pos.y );"
+ << Endl;
+ vertexShader << "\tvec3 pos = vec3(posX, posY, 0.0 );" << Endl;
+ IShaderProgramGenerator::OutputParaboloidDepthTessEval(vertexShader);
+ vertexShader << "}" << Endl;
+
+ IShaderProgramGenerator::OutputParaboloidDepthFragment(Fragment());
+ }
+
+ void OutputCubeFaceDepthShaders()
+ {
+ TShaderGeneratorStageFlags theStages(IShaderProgramGenerator::DefaultFlags());
+ ProgramGenerator().BeginProgram(theStages);
+ IShaderStageGenerator &vertexShader(Vertex());
+ IShaderStageGenerator &fragmentShader(Fragment());
+ vertexShader.AddIncoming("attr_pos", "vec2");
+ vertexShader.AddUniform("uni_rect_dimensions", "vec4");
+ vertexShader.AddUniform("model_matrix", "mat4");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.AddOutgoing("world_pos", "vec4");
+ vertexShader.Append("void main() {");
+ vertexShader.Append(
+ " float posX = mix( uni_rect_dimensions.x, uni_rect_dimensions.z, attr_pos.x );");
+ vertexShader.Append(
+ " float posY = mix( uni_rect_dimensions.y, uni_rect_dimensions.w, attr_pos.y );");
+ vertexShader.Append(" world_pos = model_matrix * vec4( posX, posY, 0.0, 1.0 );");
+ vertexShader.Append(" world_pos /= world_pos.w;");
+ vertexShader.Append(
+ " gl_Position = model_view_projection * vec4( posX, posY, 0.0, 1.0 );");
+ vertexShader.Append("}");
+
+ fragmentShader.AddUniform("camera_position", "vec3");
+ fragmentShader.AddUniform("camera_properties", "vec2");
+
+ BeginFragmentGeneration();
+ fragmentShader.Append(
+ "\tfloat dist = 0.5 * length( world_pos.xyz - camera_position );"); // Why?
+ fragmentShader.Append(
+ "\tdist = (dist - camera_properties.x) / (camera_properties.y - camera_properties.x);");
+ fragmentShader.Append("\tfragOutput = vec4(dist);");
+ fragmentShader.Append("}");
+ }
+
+ void BeginFragmentGeneration() override
+ {
+ Fragment().AddUniform("material_diffuse", "vec4");
+ Fragment() << "void main()" << Endl << "{" << Endl;
+ // We do not pass object opacity through the pipeline.
+ Fragment() << "\tfloat object_opacity = material_diffuse.a;" << Endl;
+ }
+
+ void AssignOutput(const char8_t *inVarName, const char8_t *inVarValue) override
+ {
+ Vertex() << "\t" << inVarName << " = " << inVarValue << ";\n";
+ }
+ void DoGenerateUVCoords(QT3DSU32) override { Vertex() << "\tvarTexCoord0 = attr_pos;" << Endl; }
+
+ // fragment shader expects varying vertex normal
+ // lighting in vertex pipeline expects world_normal
+ void DoGenerateWorldNormal() override
+ {
+ IShaderStageGenerator &vertexGenerator(Vertex());
+ vertexGenerator.AddUniform("normal_matrix", "mat3");
+ vertexGenerator.Append(
+ "\tvec3 world_normal = normalize(normal_matrix * vec3( 0.0, 0.0, 1.0) ).xyz;");
+ vertexGenerator.Append("\tvarNormal = world_normal;");
+ }
+
+ void DoGenerateObjectNormal() override
+ {
+ AddInterpolationParameter("varObjectNormal", "vec3");
+ Vertex().Append("\tvarObjectNormal = vec3(0.0, 0.0, 1.0 );");
+ }
+
+ void DoGenerateWorldPosition() override
+ {
+ Vertex().Append("\tvec3 local_model_world_position = (model_matrix * vec4(pos, 1.0)).xyz;");
+ AssignOutput("varWorldPos", "local_model_world_position");
+ }
+
+ void DoGenerateVarTangentAndBinormal() override
+ {
+ Vertex().AddIncoming("attr_textan", "vec3");
+ Vertex().AddIncoming("attr_binormal", "vec3");
+ Vertex() << "\tvarTangent = normal_matrix * vec3(1.0, 0.0, 0.0);" << Endl
+ << "\tvarBinormal = normal_matrix * vec3(0.0, 1.0, 0.0);" << Endl;
+ }
+
+ void DoGenerateVertexColor() override
+ {
+ Vertex().AddIncoming("attr_color", "vec3");
+ Vertex() << "\tvarColor = attr_color;" << Endl;
+ }
+
+ void EndVertexGeneration(bool) override { Vertex().Append("}"); }
+
+ void EndFragmentGeneration(bool) override { Fragment().Append("}"); }
+
+ void AddInterpolationParameter(const char8_t *inName, const char8_t *inType) override
+ {
+ m_InterpolationParameters.insert(eastl::make_pair(Str(inName), Str(inType)));
+ Vertex().AddOutgoing(inName, inType);
+ Fragment().AddIncoming(inName, inType);
+ }
+
+ IShaderStageGenerator &ActiveStage() override { return Vertex(); }
+};
+
+struct SPathManager : public IPathManager
+{
+ typedef nvhash_map<SPath *, NVScopedRefCounted<SPathBuffer>> TPathBufferHash;
+ typedef nvhash_map<SPathSubPath *, NVScopedRefCounted<SPathSubPathBuffer>>
+ TPathSubPathBufferHash;
+ typedef nvhash_map<SPathShaderMapKey, NVScopedRefCounted<SPathGeneratedShader>> TShaderMap;
+ typedef nvhash_map<SPathShaderMapKey, NVScopedRefCounted<SPathXYGeneratedShader>>
+ TPaintedShaderMap;
+ typedef nvhash_map<CRegisteredString, TPathBufferPtr> TStringPathBufferMap;
+
+ IQt3DSRenderContextCore &m_CoreContext;
+ IQt3DSRenderContext *m_RenderContext;
+ eastl::string m_IdBuilder;
+ TPathSubPathBufferHash m_SubPathBuffers;
+ TPathBufferHash m_Buffers;
+ nvvector<SResultCubic> m_SubdivResult;
+ nvvector<QT3DSF32> m_KeyPointVec;
+ nvvector<QT3DSVec4> m_PatchBuffer;
+ TShaderMap m_PathGeometryShaders;
+ TPaintedShaderMap m_PathPaintedShaders;
+ TStringPathBufferMap m_SourcePathBufferMap;
+ Mutex m_PathBufferMutex;
+
+ NVScopedRefCounted<SPathGeneratedShader> m_DepthShader;
+ NVScopedRefCounted<SPathGeneratedShader> m_DepthDisplacementShader;
+ NVScopedRefCounted<SPathGeneratedShader> m_GeometryShadowShader;
+ NVScopedRefCounted<SPathGeneratedShader> m_GeometryCubeShadowShader;
+ NVScopedRefCounted<SPathGeneratedShader> m_GeometryDisplacementShadowShader;
+
+ NVScopedRefCounted<SPathXYGeneratedShader> m_PaintedDepthShader;
+ NVScopedRefCounted<SPathXYGeneratedShader> m_PaintedShadowShader;
+ NVScopedRefCounted<SPathXYGeneratedShader> m_PaintedCubeShadowShader;
+ NVScopedRefCounted<NVRenderInputAssembler> m_PaintedRectInputAssembler;
+ NVScopedRefCounted<NVRenderVertexBuffer> m_PaintedRectVertexBuffer;
+ NVScopedRefCounted<NVRenderIndexBuffer> m_PaintedRectIndexBuffer;
+
+ nvvector<NVScopedRefCounted<NVRenderDepthStencilState>> m_DepthStencilStates;
+
+ NVScopedRefCounted<NVRenderPathSpecification> m_PathSpecification;
+ NVScopedRefCounted<qt3dsimp::IPathBufferBuilder> m_PathBuilder;
+
+ QT3DSI32 m_RefCount;
+
+ SPathManager(IQt3DSRenderContextCore &inRC)
+ : m_CoreContext(inRC)
+ , m_RenderContext(NULL)
+ , m_SubPathBuffers(inRC.GetAllocator(), "m_SubPathBuffers")
+ , m_Buffers(inRC.GetAllocator(), "m_Buffers")
+ , m_SubdivResult(inRC.GetAllocator(), "m_SubdivResult")
+ , m_KeyPointVec(inRC.GetAllocator(), "m_KeyPointVec")
+ , m_PatchBuffer(inRC.GetAllocator(), "m_QuadStrip")
+ , m_PathGeometryShaders(inRC.GetAllocator(), "m_PathGeometryShaders")
+ , m_PathPaintedShaders(inRC.GetAllocator(), "m_PathPaintedShaders")
+ , m_SourcePathBufferMap(inRC.GetAllocator(), "m_SourcePathBufferMap")
+ , m_PathBufferMutex(inRC.GetAllocator())
+ , m_DepthStencilStates(inRC.GetAllocator(), "m_DepthStencilStates")
+ , m_RefCount(0)
+ {
+ }
+
+ virtual ~SPathManager() { m_PaintedRectInputAssembler = NULL; }
+
+ NVAllocatorCallback &GetAllocator() { return m_CoreContext.GetAllocator(); }
+ IStringTable &GetStringTable() { return m_CoreContext.GetStringTable(); }
+ NVFoundationBase &GetFoundation() { return m_CoreContext.GetFoundation(); }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVAllocatorCallback &alloc(GetAllocator());
+ NVDelete(alloc, this);
+ }
+ }
+ // Called during binary load which is heavily threaded.
+ void SetPathSubPathData(const SPathSubPath &inPath,
+ NVConstDataRef<SPathAnchorPoint> inPathCubicCurves) override
+ {
+ Mutex::ScopedLock __locker(m_PathBufferMutex);
+ eastl::pair<TPathSubPathBufferHash::iterator, bool> inserter =
+ m_SubPathBuffers.insert(eastl::make_pair((SPathSubPath *)&inPath,
+ NVScopedRefCounted<SPathSubPathBuffer>(NULL)));
+ if (!inserter.first->second)
+ inserter.first->second = QT3DS_NEW(GetAllocator(), SPathSubPathBuffer)(
+ GetAllocator(), const_cast<SPathSubPath &>(inPath));
+ SPathSubPathBuffer &theBuffer = *inserter.first->second.mPtr;
+ theBuffer.m_SourceData.assign(inPathCubicCurves.begin(), inPathCubicCurves.end());
+ theBuffer.m_Flags.clearOrSet(true, PathDirtyFlagValues::SourceData);
+ }
+
+ SPathBuffer *GetPathBufferObject(const SPath &inPath)
+ {
+ eastl::pair<TPathBufferHash::iterator, bool> inserter = m_Buffers.insert(
+ eastl::make_pair((SPath *)&inPath, NVScopedRefCounted<SPathBuffer>(NULL)));
+ if (inserter.second) {
+ inserter.first->second = QT3DS_NEW(GetAllocator(), SPathBuffer)(GetAllocator());
+ }
+ return inserter.first->second.mPtr;
+ }
+
+ SPathSubPathBuffer *GetPathBufferObject(const SPathSubPath &inSubPath)
+ {
+ TPathSubPathBufferHash::iterator iter = m_SubPathBuffers.find((SPathSubPath *)&inSubPath);
+ if (iter != m_SubPathBuffers.end())
+ return iter->second.mPtr;
+ return NULL;
+ }
+
+ NVDataRef<SPathAnchorPoint> GetPathSubPathBuffer(const SPathSubPath &inPath) override
+ {
+ SPathSubPathBuffer *theBuffer = GetPathBufferObject(inPath);
+ if (theBuffer)
+ return toDataRef(theBuffer->m_SourceData.data(), (QT3DSU32)theBuffer->m_SourceData.size());
+ return NVDataRef<SPathAnchorPoint>();
+ }
+
+ NVDataRef<SPathAnchorPoint> ResizePathSubPathBuffer(const SPathSubPath &inPath,
+ QT3DSU32 inNumAnchors) override
+ {
+ SPathSubPathBuffer *theBuffer = GetPathBufferObject(inPath);
+ if (theBuffer == NULL)
+ SetPathSubPathData(inPath, NVConstDataRef<SPathAnchorPoint>());
+ theBuffer = GetPathBufferObject(inPath);
+ theBuffer->m_SourceData.resize(inNumAnchors);
+ theBuffer->m_Flags.clearOrSet(true, PathDirtyFlagValues::SourceData);
+ return toDataRef(theBuffer->m_SourceData.data(), (QT3DSU32)theBuffer->m_SourceData.size());
+ }
+
+ // This needs to be done using roots of the first derivative.
+ NVBounds3 GetBounds(const SPath &inPath) override
+ {
+ NVBounds3 retval(NVBounds3::empty());
+
+ SPathBuffer *thePathBuffer = GetPathBufferObject(inPath);
+ if (thePathBuffer) {
+ SPathDirtyFlags geomDirtyFlags(
+ PathDirtyFlagValues::SourceData | PathDirtyFlagValues::BeginTaper
+ | PathDirtyFlagValues::EndTaper | PathDirtyFlagValues::Width
+ | PathDirtyFlagValues::CPUError);
+
+ if ((((QT3DSU32)thePathBuffer->m_Flags) & (QT3DSU32)geomDirtyFlags) == 0) {
+ return thePathBuffer->m_Bounds;
+ }
+ }
+
+ for (SPathSubPath *theSubPath = inPath.m_FirstSubPath; theSubPath;
+ theSubPath = theSubPath->m_NextSubPath) {
+ SPathSubPathBuffer *theBuffer = GetPathBufferObject(*theSubPath);
+ if (!theBuffer)
+ continue;
+
+ QT3DSU32 numAnchors = theBuffer->m_SourceData.size();
+ for (QT3DSU32 idx = 0, end = numAnchors; idx < end; ++idx) {
+ const SPathAnchorPoint &thePoint(theBuffer->m_SourceData[idx]);
+ QT3DSVec2 position(thePoint.m_Position);
+ retval.include(QT3DSVec3(position.x, position.y, 0.0f));
+ if (idx) {
+ QT3DSVec2 incoming(IPathManagerCore::GetControlPointFromAngleDistance(
+ thePoint.m_Position, thePoint.m_IncomingAngle,
+ thePoint.m_IncomingDistance));
+ retval.include(QT3DSVec3(incoming.x, incoming.y, 0.0f));
+ }
+
+ if (idx < (numAnchors - 1)) {
+ QT3DSVec2 outgoing(IPathManagerCore::GetControlPointFromAngleDistance(
+ thePoint.m_Position, thePoint.m_OutgoingAngle,
+ thePoint.m_OutgoingDistance));
+ retval.include(QT3DSVec3(outgoing.x, outgoing.y, 0.0f));
+ }
+ }
+ }
+
+ return retval;
+ }
+
+ IPathManager &OnRenderSystemInitialize(IQt3DSRenderContext &context) override
+ {
+ m_RenderContext = &context;
+ return *this;
+ }
+
+ // find a point that will join these two curves *if* they are not first derivative continuous
+ static Option<QT3DSVec2> GetAdjoiningPoint(QT3DSVec2 prevC2, QT3DSVec2 point, QT3DSVec2 C1, QT3DSF32 pathWidth)
+ {
+ QT3DSVec2 incomingDxDy = (point - prevC2);
+ QT3DSVec2 outgoingDxDy = (C1 - point);
+ incomingDxDy.normalize();
+ outgoingDxDy.normalize();
+ float determinant = (incomingDxDy.x * outgoingDxDy.y) - (incomingDxDy.y * outgoingDxDy.x);
+ if (fabs(determinant) > .001f) {
+ float mult = determinant > 0.0f ? 1.0f : -1.0f;
+ QT3DSVec2 incomingNormal(incomingDxDy.y, -incomingDxDy.x);
+ QT3DSVec2 outgoingNormal(outgoingDxDy.y, -outgoingDxDy.x);
+
+ QT3DSVec2 leftEdge = point + mult * incomingNormal * pathWidth;
+ QT3DSVec2 rightEdge = point + mult * outgoingNormal * pathWidth;
+
+ return (leftEdge + rightEdge) / 2.0f;
+ }
+ return Empty();
+ }
+
+ Option<eastl::pair<QT3DSU32, QT3DSF32>> FindBreakEquation(QT3DSF32 inTaperStart)
+ {
+ QT3DSF32 lengthTotal = 0;
+ for (QT3DSU32 idx = 0, end = m_SubdivResult.size(); idx < end; ++idx) {
+ if (lengthTotal + m_SubdivResult[idx].m_Length > inTaperStart) {
+ QT3DSF32 breakTValue = (inTaperStart - lengthTotal) / m_SubdivResult[idx].m_Length;
+ nvvector<SResultCubic>::iterator breakIter = m_SubdivResult.begin() + idx;
+ SCubicBezierCurve theCurve(breakIter->m_P1, breakIter->m_C1, breakIter->m_C2,
+ breakIter->m_P2);
+ eastl::pair<SCubicBezierCurve, SCubicBezierCurve> subdivCurve =
+ theCurve.SplitCubicBezierCurve(breakTValue);
+ QT3DSF32 originalBreakT =
+ breakIter->m_TStart + (breakIter->m_TStop - breakIter->m_TStart) * breakTValue;
+ // Update the existing item to point to the second equation
+ breakIter->m_P1 = subdivCurve.second.m_Points[0];
+ breakIter->m_C1 = subdivCurve.second.m_Points[1];
+ breakIter->m_C2 = subdivCurve.second.m_Points[2];
+ breakIter->m_P2 = subdivCurve.second.m_Points[3];
+ QT3DSF32 originalLength = breakIter->m_Length;
+ QT3DSF32 originalStart = breakIter->m_TStart;
+ breakIter->m_Length *= (1.0f - breakTValue);
+ breakIter->m_TStart = originalBreakT;
+ SResultCubic newCubic(subdivCurve.first.m_Points[0], subdivCurve.first.m_Points[1],
+ subdivCurve.first.m_Points[2], subdivCurve.first.m_Points[3],
+ breakIter->m_EquationIndex, originalStart, originalBreakT,
+ originalLength * breakTValue);
+
+ m_SubdivResult.insert(breakIter, newCubic);
+ return eastl::make_pair(idx, breakTValue);
+ }
+ lengthTotal += m_SubdivResult[idx].m_Length;
+ }
+ return Empty();
+ }
+
+ bool PrepareGeometryPathForRender(const SPath &inPath, SPathBuffer &inPathBuffer)
+ {
+
+ m_SubdivResult.clear();
+ m_KeyPointVec.clear();
+ const SPath &thePath(inPath);
+
+ inPathBuffer.SetBeginTaperInfo(thePath.m_BeginCapping, thePath.m_BeginCapOffset,
+ thePath.m_BeginCapOpacity, thePath.m_BeginCapWidth);
+ inPathBuffer.SetEndTaperInfo(thePath.m_EndCapping, thePath.m_EndCapOffset,
+ thePath.m_EndCapOpacity, thePath.m_EndCapWidth);
+ inPathBuffer.SetWidth(inPath.m_Width);
+ inPathBuffer.SetCPUError(inPath.m_LinearError);
+
+ SPathDirtyFlags geomDirtyFlags(PathDirtyFlagValues::SourceData
+ | PathDirtyFlagValues::BeginTaper
+ | PathDirtyFlagValues::EndTaper | PathDirtyFlagValues::Width
+ | PathDirtyFlagValues::CPUError);
+
+ bool retval = false;
+ if (!inPathBuffer.m_PatchData
+ || (((QT3DSU32)inPathBuffer.m_Flags) & (QT3DSU32)geomDirtyFlags) != 0) {
+ qt3dsimp::SPathBuffer thePathData = inPathBuffer.GetPathData(*m_PathBuilder);
+
+ QT3DSU32 dataIdx = 0;
+ QT3DSVec2 prevPoint(0, 0);
+ QT3DSU32 equationIdx = 0;
+ for (QT3DSU32 commandIdx = 0, commandEnd = thePathData.m_Commands.size();
+ commandIdx < commandEnd; ++commandIdx) {
+ switch (thePathData.m_Commands[commandIdx]) {
+ case qt3dsimp::PathCommand::MoveTo:
+ prevPoint =
+ QT3DSVec2(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]);
+ dataIdx += 2;
+ break;
+ case qt3dsimp::PathCommand::CubicCurveTo: {
+ QT3DSVec2 c1(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]);
+ dataIdx += 2;
+ QT3DSVec2 c2(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]);
+ dataIdx += 2;
+ QT3DSVec2 p2(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]);
+ dataIdx += 2;
+ OuterAdaptiveSubdivideBezierCurve(
+ m_SubdivResult, m_KeyPointVec, SCubicBezierCurve(prevPoint, c1, c2, p2),
+ NVMax(inPath.m_LinearError, 1.0f), equationIdx);
+ ++equationIdx;
+ prevPoint = p2;
+ } break;
+ case qt3dsimp::PathCommand::Close:
+ break;
+
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ QT3DSF32 theLocalWidth = inPath.m_Width / 2.0f;
+
+ QT3DSVec2 theBeginTaperData(theLocalWidth, thePath.m_GlobalOpacity);
+ QT3DSVec2 theEndTaperData(theLocalWidth, thePath.m_GlobalOpacity);
+
+ QT3DSF32 pathLength = 0.0f;
+ for (QT3DSU32 idx = 0, end = m_SubdivResult.size(); idx < end; ++idx)
+ pathLength += m_SubdivResult[idx].m_Length;
+
+ if (thePath.m_BeginCapping == PathCapping::Taper
+ || thePath.m_EndCapping == PathCapping::Taper) {
+ QT3DSF32 maxTaperStart = pathLength / 2.0f;
+ if (thePath.m_BeginCapping == PathCapping::Taper) {
+ // Can't start more than halfway across the path.
+ QT3DSF32 taperStart = NVMin(thePath.m_BeginCapOffset, maxTaperStart);
+ QT3DSF32 endTaperWidth = thePath.m_BeginCapWidth;
+ QT3DSF32 endTaperOpacity = thePath.m_GlobalOpacity * thePath.m_BeginCapOpacity;
+ theBeginTaperData = QT3DSVec2(endTaperWidth, endTaperOpacity);
+ // Find where we need to break the current equations.
+ Option<eastl::pair<QT3DSU32, QT3DSF32>> breakEquationAndT(
+ FindBreakEquation(taperStart));
+ if (breakEquationAndT.hasValue()) {
+ QT3DSU32 breakEquation = breakEquationAndT->first;
+
+ QT3DSF32 lengthTotal = 0;
+ for (QT3DSU32 idx = 0, end = breakEquation; idx <= end; ++idx) {
+ SResultCubic &theCubic = m_SubdivResult[idx];
+ theCubic.m_Mode = SResultCubic::BeginTaper;
+
+ theCubic.m_TaperMultiplier[0] = lengthTotal / taperStart;
+ lengthTotal += theCubic.m_Length;
+ theCubic.m_TaperMultiplier[1] = lengthTotal / taperStart;
+ }
+ }
+ }
+ if (thePath.m_EndCapping == PathCapping::Taper) {
+ QT3DSF32 taperStart = NVMin(thePath.m_EndCapOffset, maxTaperStart);
+ QT3DSF32 endTaperWidth = thePath.m_EndCapWidth;
+ QT3DSF32 endTaperOpacity = thePath.m_GlobalOpacity * thePath.m_EndCapOpacity;
+ theEndTaperData = QT3DSVec2(endTaperWidth, endTaperOpacity);
+ // Invert taper start so that the forward search works.
+ Option<eastl::pair<QT3DSU32, QT3DSF32>> breakEquationAndT(
+ FindBreakEquation(pathLength - taperStart));
+
+ if (breakEquationAndT.hasValue()) {
+ QT3DSU32 breakEquation = breakEquationAndT->first;
+ ++breakEquation;
+
+ QT3DSF32 lengthTotal = 0;
+ for (QT3DSU32 idx = breakEquation, end = m_SubdivResult.size(); idx < end;
+ ++idx) {
+ SResultCubic &theCubic = m_SubdivResult[idx];
+ theCubic.m_Mode = SResultCubic::EndTaper;
+
+ theCubic.m_TaperMultiplier[0] = 1.0f - (lengthTotal / taperStart);
+ lengthTotal += theCubic.m_Length;
+ theCubic.m_TaperMultiplier[1] = 1.0f - (lengthTotal / taperStart);
+ }
+ }
+ }
+ }
+
+ NVRenderContext &theRenderContext(m_RenderContext->GetRenderContext());
+ // Create quads out of each point.
+ if (m_SubdivResult.empty())
+ return false;
+
+ // Generate patches.
+ m_PatchBuffer.clear();
+ QT3DSF32 pathWidth = thePath.m_Width / 2.0f;
+ // texture coords
+ float texCoordU = 0.0;
+
+ for (QT3DSU32 idx = 0, end = m_SubdivResult.size(); idx < end; ++idx) {
+ // create patches
+ SResultCubic thePoint(m_SubdivResult[idx]);
+
+ m_PatchBuffer.push_back(CreateVec4(thePoint.m_P1, thePoint.m_C1));
+ m_PatchBuffer.push_back(CreateVec4(thePoint.m_C2, thePoint.m_P2));
+
+ // Now we need to take care of cases where the control points of the adjoining
+ // SubPaths
+ // do not line up; i.e. there is a discontinuity of the 1st derivative
+ // The simplest way to do this is to move the edge vertex to a halfway point
+ // between a line bisecting the two control lines
+ QT3DSVec2 incomingAdjoining(thePoint.m_P1);
+ QT3DSVec2 outgoingAdjoining(thePoint.m_P2);
+ if (idx) {
+ SResultCubic previousCurve = m_SubdivResult[idx - 1];
+ if (previousCurve.m_EquationIndex != thePoint.m_EquationIndex) {
+ QT3DSF32 anchorWidth =
+ thePoint.GetP1Width(pathWidth, theBeginTaperData.x, theEndTaperData.x);
+ Option<QT3DSVec2> adjoining = GetAdjoiningPoint(
+ previousCurve.m_C2, thePoint.m_P1, thePoint.m_C1, anchorWidth);
+ if (adjoining.hasValue())
+ incomingAdjoining = *adjoining;
+ }
+ }
+ if (idx < (end - 1)) {
+ SResultCubic nextCurve = m_SubdivResult[idx + 1];
+ if (nextCurve.m_EquationIndex != thePoint.m_EquationIndex) {
+ QT3DSF32 anchorWidth =
+ thePoint.GetP2Width(pathWidth, theBeginTaperData.x, theEndTaperData.x);
+ Option<QT3DSVec2> adjoining = GetAdjoiningPoint(thePoint.m_C2, thePoint.m_P2,
+ nextCurve.m_C1, anchorWidth);
+ if (adjoining.hasValue())
+ outgoingAdjoining = *adjoining;
+ }
+ }
+ m_PatchBuffer.push_back(CreateVec4(incomingAdjoining, outgoingAdjoining));
+
+ QT3DSVec4 taperData(0.0f);
+ taperData.x = thePoint.m_TaperMultiplier.x;
+ taperData.y = thePoint.m_TaperMultiplier.y;
+ // Note we could put a *lot* more data into this thing.
+ taperData.z = (QT3DSF32)thePoint.m_Mode;
+ m_PatchBuffer.push_back(taperData);
+
+ // texture coord generation
+ // note we only generate u here. v is generated in the tess shader
+ // u coord for P1 and C1
+ QT3DSVec2 udata(texCoordU, texCoordU + (thePoint.m_Length / pathLength));
+ texCoordU = udata.y;
+ m_PatchBuffer.push_back(QT3DSVec4(udata.x, udata.y, 0.0, 0.0));
+ }
+
+ // buffer size is 3.0*4.0*bufSize
+ QT3DSU32 bufSize = (QT3DSU32)m_PatchBuffer.size() * sizeof(QT3DSVec4);
+ QT3DSU32 stride = sizeof(QT3DSVec4);
+
+ if ((!inPathBuffer.m_PatchData) || inPathBuffer.m_PatchData->Size() < bufSize) {
+ inPathBuffer.m_PatchData = theRenderContext.CreateVertexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Dynamic, bufSize, stride,
+ toU8DataRef(m_PatchBuffer.data(), (QT3DSU32)m_PatchBuffer.size()));
+ inPathBuffer.m_NumVertexes = (QT3DSU32)m_PatchBuffer.size();
+ inPathBuffer.m_InputAssembler = NULL;
+ } else {
+ QT3DS_ASSERT(inPathBuffer.m_PatchData->Size() >= bufSize);
+ inPathBuffer.m_PatchData->UpdateBuffer(
+ toU8DataRef(m_PatchBuffer.data(), (QT3DSU32)m_PatchBuffer.size()));
+ }
+
+ if (!inPathBuffer.m_InputAssembler) {
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry(
+ "attr_pos", qt3ds::render::NVRenderComponentTypes::QT3DSF32, 4),
+ };
+
+ NVRenderDrawMode::Enum primType = NVRenderDrawMode::Patches;
+
+ NVRenderAttribLayout *theLayout =
+ theRenderContext.CreateAttributeLayout(toConstDataRef(theEntries, 1));
+ // How many vertices the TCS shader has access to in order to produce its output
+ // array of vertices.
+ const QT3DSU32 inputPatchVertexCount = 5;
+ inPathBuffer.m_InputAssembler = theRenderContext.CreateInputAssembler(
+ theLayout, toConstDataRef(inPathBuffer.m_PatchData.mPtr), NULL,
+ toConstDataRef(stride), toConstDataRef((QT3DSU32)0), primType,
+ inputPatchVertexCount);
+ }
+ inPathBuffer.m_BeginTaperData = theBeginTaperData;
+ inPathBuffer.m_EndTaperData = theEndTaperData;
+
+ // cache bounds
+ NVBounds3 bounds = GetBounds(inPath);
+ inPathBuffer.m_Bounds.minimum = bounds.minimum;
+ inPathBuffer.m_Bounds.maximum = bounds.maximum;
+ }
+
+ return retval;
+ }
+
+ IMaterialShaderGenerator *GetMaterialShaderGenertator(SPathRenderContext &inRenderContext)
+ {
+ bool isDefaultMaterial =
+ (inRenderContext.m_Material.m_Type == GraphObjectTypes::DefaultMaterial);
+
+ IMaterialShaderGenerator *theMaterialGenerator = NULL;
+ if (isDefaultMaterial)
+ theMaterialGenerator = &m_RenderContext->GetDefaultMaterialShaderGenerator();
+ else
+ theMaterialGenerator = &m_RenderContext->GetCustomMaterialShaderGenerator();
+
+ return theMaterialGenerator;
+ }
+
+ CRegisteredString GetMaterialNameForKey(SPathRenderContext &inRenderContext)
+ {
+ bool isDefaultMaterial =
+ (inRenderContext.m_Material.m_Type == GraphObjectTypes::DefaultMaterial);
+
+ if (!isDefaultMaterial) {
+ ICustomMaterialSystem &theMaterialSystem(m_RenderContext->GetCustomMaterialSystem());
+ const SCustomMaterial &theCustomMaterial(
+ reinterpret_cast<const SCustomMaterial &>(inRenderContext.m_Material));
+
+ return m_RenderContext->GetStringTable().RegisterStr(
+ theMaterialSystem.GetShaderName(theCustomMaterial));
+ }
+
+ return m_RenderContext->GetStringTable().RegisterStr("");
+ }
+
+ bool PreparePaintedPathForRender(const SPath &inPath, SPathBuffer &inPathBuffer)
+ {
+ NVRenderContext &theContext(this->m_RenderContext->GetRenderContext());
+ if (!inPathBuffer.m_PathRender
+ || (((QT3DSU32)inPathBuffer.m_Flags) & PathDirtyFlagValues::SourceData)) {
+ if (!inPathBuffer.m_PathRender) {
+ inPathBuffer.m_PathRender = theContext.CreatePathRender();
+ }
+
+ if (inPathBuffer.m_PathRender == NULL || m_PathSpecification == NULL) {
+ // QT3DS_ASSERT( false );
+ return false;
+ }
+
+ m_PathSpecification->Reset();
+ qt3dsimp::SPathBuffer thePathData = inPathBuffer.GetPathData(*m_PathBuilder);
+
+ QT3DSU32 dataIdx = 0;
+ for (QT3DSU32 commandIdx = 0, commandEnd = thePathData.m_Commands.size();
+ commandIdx < commandEnd; ++commandIdx) {
+
+ switch (thePathData.m_Commands[commandIdx]) {
+ case qt3dsimp::PathCommand::MoveTo:
+ m_PathSpecification->MoveTo(
+ QT3DSVec2(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]));
+ dataIdx += 2;
+ break;
+ case qt3dsimp::PathCommand::CubicCurveTo: {
+ QT3DSVec2 c1(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]);
+ dataIdx += 2;
+ QT3DSVec2 c2(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]);
+ dataIdx += 2;
+ QT3DSVec2 p2(thePathData.m_Data[dataIdx], thePathData.m_Data[dataIdx + 1]);
+ dataIdx += 2;
+ m_PathSpecification->CubicCurveTo(c1, c2, p2);
+ } break;
+ case qt3dsimp::PathCommand::Close:
+ m_PathSpecification->ClosePath();
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ inPathBuffer.m_PathRender->SetPathSpecification(*m_PathSpecification);
+
+ // cache bounds
+ NVBounds3 bounds = GetBounds(inPath);
+ inPathBuffer.m_Bounds.minimum = bounds.minimum;
+ inPathBuffer.m_Bounds.maximum = bounds.maximum;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ bool PrepareForRender(const SPath &inPath) override
+ {
+ SPathBuffer *thePathBuffer = GetPathBufferObject(inPath);
+ if (!thePathBuffer) {
+ return false;
+ }
+ NVRenderContext &theContext(this->m_RenderContext->GetRenderContext());
+ if (!m_PathSpecification)
+ m_PathSpecification = theContext.CreatePathSpecification();
+ if (!m_PathSpecification)
+ return false;
+ if (!m_PathBuilder)
+ m_PathBuilder = qt3dsimp::IPathBufferBuilder::CreateBuilder(GetFoundation());
+
+ thePathBuffer->SetPathType(inPath.m_PathType);
+ bool retval = false;
+ if (inPath.m_PathBuffer.IsValid() == false) {
+ thePathBuffer->m_PathBuffer = NULL;
+ // Ensure the SubPath list is identical and clear, percolating any dirty flags up to the
+ // path buffer.
+ QT3DSU32 SubPathIdx = 0;
+ for (const SPathSubPath *theSubPath = inPath.m_FirstSubPath; theSubPath;
+ theSubPath = theSubPath->m_NextSubPath, ++SubPathIdx) {
+ SPathSubPathBuffer *theSubPathBuffer = GetPathBufferObject(*theSubPath);
+ if (theSubPathBuffer == NULL)
+ continue;
+ thePathBuffer->m_Flags =
+ (QT3DSU32)(thePathBuffer->m_Flags | theSubPathBuffer->m_Flags);
+
+ if (theSubPathBuffer->m_Closed != theSubPath->m_Closed) {
+ thePathBuffer->m_Flags.clearOrSet(true, PathDirtyFlagValues::SourceData);
+ theSubPathBuffer->m_Closed = theSubPath->m_Closed;
+ }
+
+ if (thePathBuffer->m_SubPaths.size() <= SubPathIdx
+ || thePathBuffer->m_SubPaths[SubPathIdx] != theSubPathBuffer) {
+ thePathBuffer->m_Flags.clearOrSet(true, PathDirtyFlagValues::SourceData);
+ if (thePathBuffer->m_SubPaths.size() <= SubPathIdx)
+ thePathBuffer->m_SubPaths.push_back(theSubPathBuffer);
+ else
+ thePathBuffer->m_SubPaths[SubPathIdx] = theSubPathBuffer;
+ }
+
+ theSubPathBuffer->m_Flags.Clear();
+ }
+
+ if (SubPathIdx != thePathBuffer->m_SubPaths.size()) {
+ thePathBuffer->m_SubPaths.resize(SubPathIdx);
+ thePathBuffer->m_Flags.clearOrSet(true, PathDirtyFlagValues::SourceData);
+ }
+ } else {
+ thePathBuffer->m_SubPaths.clear();
+ eastl::pair<TStringPathBufferMap::iterator, bool> inserter =
+ m_SourcePathBufferMap.insert(
+ eastl::make_pair(inPath.m_PathBuffer, TPathBufferPtr()));
+ if (inserter.second) {
+ NVScopedRefCounted<IRefCountedInputStream> theStream =
+ m_CoreContext.GetInputStreamFactory().GetStreamForFile(
+ inPath.m_PathBuffer.c_str());
+ if (theStream) {
+ qt3dsimp::SPathBuffer *theNewBuffer =
+ qt3dsimp::SPathBuffer::Load(*theStream, GetFoundation());
+ if (theNewBuffer)
+ inserter.first->second = QT3DS_NEW(GetAllocator(), SImportPathWrapper)(
+ GetAllocator(), *theNewBuffer);
+ }
+ }
+ if (thePathBuffer->m_PathBuffer != inserter.first->second) {
+ thePathBuffer->m_PathBuffer = inserter.first->second;
+ thePathBuffer->m_Flags.clearOrSet(true, PathDirtyFlagValues::SourceData);
+ }
+ }
+
+ if (inPath.m_PathType == PathTypes::Geometry)
+ retval = PrepareGeometryPathForRender(inPath, *thePathBuffer);
+ else
+ retval = PreparePaintedPathForRender(inPath, *thePathBuffer);
+ thePathBuffer->m_Flags.Clear();
+ return retval;
+ }
+
+ void SetMaterialProperties(NVRenderShaderProgram &inShader, SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties &inRenderProperties)
+ {
+ IMaterialShaderGenerator *theMaterialGenerator =
+ GetMaterialShaderGenertator(inRenderContext);
+ NVRenderContext &theRenderContext(m_RenderContext->GetRenderContext());
+ theRenderContext.SetActiveShader(&inShader);
+
+ theMaterialGenerator->SetMaterialProperties(
+ inShader, inRenderContext.m_Material, inRenderContext.m_CameraVec,
+ inRenderContext.m_ModelViewProjection, inRenderContext.m_NormalMatrix,
+ inRenderContext.m_Path.m_GlobalTransform, inRenderContext.m_FirstImage,
+ inRenderContext.m_Opacity, inRenderProperties);
+ }
+
+ void DoRenderGeometryPath(SPathGeneratedShader &inShader, SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties &inRenderProperties,
+ SPathBuffer &inPathBuffer)
+ {
+ if (inPathBuffer.m_InputAssembler == NULL)
+ return;
+
+ SetMaterialProperties(inShader.m_Shader, inRenderContext, inRenderProperties);
+ NVRenderContext &theRenderContext(m_RenderContext->GetRenderContext());
+
+ inShader.m_BeginTaperData.Set(inPathBuffer.m_BeginTaperData);
+ inShader.m_EndTaperData.Set(inPathBuffer.m_EndTaperData);
+ if (inRenderContext.m_EnableWireframe) {
+ // we need the viewport matrix
+ NVRenderRect theViewport(theRenderContext.GetViewport());
+ QT3DSMat44 vpMatrix;
+ vpMatrix.column0 = QT3DSVec4((float)theViewport.m_Width / 2.0f, 0.0, 0.0, 0.0);
+ vpMatrix.column1 = QT3DSVec4(0.0, (float)theViewport.m_Height / 2.0f, 0.0, 0.0);
+ vpMatrix.column2 = QT3DSVec4(0.0, 0.0, 1.0, 0.0);
+ vpMatrix.column3 =
+ QT3DSVec4((float)theViewport.m_Width / 2.0f + (float)theViewport.m_X,
+ (float)theViewport.m_Height / 2.0f + (float)theViewport.m_Y, 0.0, 1.0);
+
+ inShader.m_WireframeViewMatrix.Set(vpMatrix);
+ }
+
+ QT3DSF32 tessEdgeValue = NVMin(64.0f, NVMax(1.0f, inRenderContext.m_Path.m_EdgeTessAmount));
+ QT3DSF32 tessInnerValue = NVMin(64.0f, NVMax(1.0f, inRenderContext.m_Path.m_InnerTessAmount));
+ inShader.m_EdgeTessAmount.Set(tessEdgeValue);
+ inShader.m_InnerTessAmount.Set(tessInnerValue);
+ inShader.m_Width.Set(inRenderContext.m_Path.m_Width / 2.0f);
+ theRenderContext.SetInputAssembler(inPathBuffer.m_InputAssembler);
+ theRenderContext.SetCullingEnabled(false);
+ NVRenderDrawMode::Enum primType = NVRenderDrawMode::Patches;
+ theRenderContext.Draw(primType, (QT3DSU32)inPathBuffer.m_NumVertexes, 0);
+ }
+
+ NVRenderDepthStencilState *GetDepthStencilState()
+ {
+ NVRenderContext &theRenderContext(m_RenderContext->GetRenderContext());
+ NVRenderBoolOp::Enum theDepthFunction = theRenderContext.GetDepthFunction();
+ bool isDepthEnabled = theRenderContext.IsDepthTestEnabled();
+ bool isStencilEnabled = theRenderContext.IsStencilTestEnabled();
+ bool isDepthWriteEnabled = theRenderContext.IsDepthWriteEnabled();
+ for (QT3DSU32 idx = 0, end = m_DepthStencilStates.size(); idx < end; ++idx) {
+ NVRenderDepthStencilState &theState = *m_DepthStencilStates[idx];
+ if (theState.GetDepthFunc() == theDepthFunction
+ && theState.GetDepthEnabled() == isDepthEnabled
+ && theState.GetDepthMask() == isDepthWriteEnabled)
+ return &theState;
+ }
+ NVRenderStencilFunctionArgument theArg(NVRenderBoolOp::NotEqual, 0, 0xFF);
+ NVRenderStencilOperationArgument theOpArg(NVRenderStencilOp::Keep, NVRenderStencilOp::Keep,
+ NVRenderStencilOp::Zero);
+ m_DepthStencilStates.push_back(theRenderContext.CreateDepthStencilState(
+ isDepthEnabled, isDepthWriteEnabled, theDepthFunction, isStencilEnabled, theArg, theArg,
+ theOpArg, theOpArg));
+ return m_DepthStencilStates.back();
+ }
+
+ static void DoSetCorrectiveScale(const QT3DSMat44 &mvp, QT3DSMat44 &outScale, NVBounds3 pathBounds)
+ {
+ // Compute the projected locations for the paraboloid and regular projection
+ // and thereby set the appropriate scaling factor.
+ QT3DSVec3 points[4];
+ QT3DSVec3 projReg[4], projParab[4];
+ points[0] = pathBounds.minimum;
+ points[1] = QT3DSVec3(pathBounds.maximum.x, pathBounds.minimum.y, pathBounds.minimum.z);
+ points[2] = pathBounds.maximum;
+ points[3] = QT3DSVec3(pathBounds.minimum.x, pathBounds.maximum.y, pathBounds.maximum.z);
+
+ // Do the two different projections.
+ for (int i = 0; i < 4; ++i) {
+ QT3DSVec4 tmp;
+ tmp = mvp.transform(QT3DSVec4(points[i], 1.0f));
+ tmp /= tmp.w;
+ projReg[i] = tmp.getXYZ();
+ projParab[i] = tmp.getXYZ().getNormalized();
+ projParab[i] /= projParab[i].z + 1.0f;
+ }
+
+ NVBounds3 boundsA, boundsB;
+ for (int i = 0; i < 4; ++i) {
+ boundsA.include(projReg[i]);
+ boundsB.include(projParab[i]);
+ }
+ QT3DSF32 xscale =
+ (boundsB.maximum.x - boundsB.minimum.x) / (boundsA.maximum.x - boundsA.minimum.x);
+ QT3DSF32 yscale =
+ (boundsB.maximum.y - boundsB.minimum.y) / (boundsA.maximum.y - boundsA.minimum.y);
+ QT3DSF32 zscale = (boundsB.maximum - boundsB.minimum).magnitudeSquared()
+ / (boundsA.maximum - boundsA.minimum).magnitudeSquared();
+ // The default minimum here is just a stupid figure that looks good on our content because
+ // we'd
+ // been using it for a little while before. Just for demo.
+ xscale = NVMin<QT3DSF32>(0.5333333f, NVMin<QT3DSF32>(xscale, yscale));
+ yscale = NVMin<QT3DSF32>(0.5333333f, NVMin<QT3DSF32>(xscale, yscale));
+ outScale.scale(QT3DSVec4(xscale, yscale, zscale, 1.0f));
+ }
+
+ void DoRenderPaintedPath(SPathXYGeneratedShader &inShader, SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties &inRenderProperties,
+ SPathBuffer &inPathBuffer, bool isParaboloidPass = false)
+ {
+ if (!inPathBuffer.m_PathRender)
+ return;
+ NVRenderContext &theRenderContext(m_RenderContext->GetRenderContext());
+ if (!m_PaintedRectInputAssembler) {
+ QT3DSVec2 vertexes[] = {
+ QT3DSVec2(0.0, 0.0), QT3DSVec2(1.0, 0.0), QT3DSVec2(1.0, 1.0), QT3DSVec2(0.0, 1.0),
+ };
+
+ QT3DSU8 indexes[] = {
+ 0, 1, 2, 2, 3, 0,
+ };
+
+ QT3DSU32 stride = sizeof(QT3DSVec2);
+
+ NVRenderVertexBufferEntry theBufferEntries[] = { NVRenderVertexBufferEntry(
+ "attr_pos", qt3ds::render::NVRenderComponentTypes::QT3DSF32, 2, 0) };
+
+ m_PaintedRectVertexBuffer = theRenderContext.CreateVertexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static, 4 * sizeof(QT3DSVec2), sizeof(QT3DSVec2),
+ toU8DataRef(vertexes, 4));
+ m_PaintedRectIndexBuffer = theRenderContext.CreateIndexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static,
+ qt3ds::render::NVRenderComponentTypes::QT3DSU8, 6, toU8DataRef(indexes, 6));
+ NVRenderAttribLayout *theAttribLayout =
+ theRenderContext.CreateAttributeLayout(toConstDataRef(theBufferEntries, 1));
+ m_PaintedRectInputAssembler = theRenderContext.CreateInputAssembler(
+ theAttribLayout, toConstDataRef(m_PaintedRectVertexBuffer.mPtr),
+ m_PaintedRectIndexBuffer.mPtr, toConstDataRef(stride), toConstDataRef((QT3DSU32)0),
+ qt3ds::render::NVRenderDrawMode::Triangles);
+ }
+
+ // our current render target needs stencil
+ QT3DS_ASSERT(theRenderContext.GetStencilBits() > 0);
+
+ theRenderContext.SetDepthStencilState(GetDepthStencilState());
+
+ // http://developer.download.nvidia.com/assets/gamedev/files/Mixing_Path_Rendering_and_3D.pdf
+ theRenderContext.SetPathStencilDepthOffset(-.05f, -1.0f);
+
+ // Stencil out the geometry.
+ QT3DSMat44 pathMdlView = QT3DSMat44::createIdentity();
+ // Why is this happening? Well, it's because the painted-on path rendering is always
+ // a flat splatted 2D object. This is bad because a paraboloid projection demands a very
+ // different
+ // non-linear space into which we must draw. Path Rendering does not allow this sort of
+ // spatial
+ // warping internally, and all we end up passing in as a simple perspective projection.
+ // So for the fix, I'm scaling the actual "object" size so that it fits into the correctly
+ // projected
+ // polygon inside the paraboloid depth pass. Obviously, this scaling factor is wrong, and
+ // not generic
+ // enough to cover cases like polygons covering a large spread of the FOV and so on. It's
+ // really
+ // just a filthy awful, morally deplorable HACK. But it's basically the quickest fix at
+ // hand.
+ // This is also about the only possible approach that *could* work short of rendering the
+ // paths in
+ // a render-to-texture pass and splatting that texture on a sufficiently tessellated quad.
+ // Unless
+ // there's a way to program NVPR's internal projection scheme, that is.
+ // Geometry-based paths will work out better, I think, because they're actually creating
+ // geometry.
+ // This is essentially a 2D painting process inside a quad where the actual rendered region
+ // isn't
+ // exactly where NVPR thinks it should be because they're not projecting points the same
+ // way.
+ if (isParaboloidPass) {
+ DoSetCorrectiveScale(inRenderContext.m_ModelViewProjection, pathMdlView,
+ inPathBuffer.m_PathRender->GetPathObjectStrokeBox());
+ }
+
+ bool isStencilEnabled = theRenderContext.IsStencilTestEnabled();
+ theRenderContext.SetStencilTestEnabled(true);
+ theRenderContext.SetPathProjectionMatrix(inRenderContext.m_ModelViewProjection);
+ theRenderContext.SetPathModelViewMatrix(pathMdlView);
+
+ if (inRenderContext.m_IsStroke) {
+ inPathBuffer.m_PathRender->SetStrokeWidth(inRenderContext.m_Path.m_Width);
+ inPathBuffer.m_PathRender->StencilStroke();
+ } else
+ inPathBuffer.m_PathRender->StencilFill();
+
+ // The stencil buffer will dictate whether this object renders or not. So we need to ignore
+ // the depth test result.
+ NVRenderBoolOp::Enum theDepthFunc = theRenderContext.GetDepthFunction();
+ theRenderContext.SetDepthFunction(NVRenderBoolOp::AlwaysTrue);
+ // Now render the path; this resets the stencil buffer.
+ SetMaterialProperties(inShader.m_Shader, inRenderContext, inRenderProperties);
+ NVBounds3 rectBounds = inPathBuffer.m_PathRender->GetPathObjectStrokeBox();
+ if (isParaboloidPass) {
+ rectBounds.scale(1.570796326795f);
+ } // PKC : More of the same ugly hack.
+ inShader.m_RectDimensions.Set(QT3DSVec4(rectBounds.minimum.x, rectBounds.minimum.y,
+ rectBounds.maximum.x, rectBounds.maximum.y));
+ theRenderContext.SetInputAssembler(m_PaintedRectInputAssembler);
+ theRenderContext.SetCullingEnabled(false);
+ // Render exactly two triangles
+ theRenderContext.Draw(NVRenderDrawMode::Triangles, 6, 0);
+ theRenderContext.SetStencilTestEnabled(isStencilEnabled);
+ theRenderContext.SetDepthFunction(theDepthFunc);
+ }
+
+ void RenderDepthPrepass(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) override
+ {
+ SPathBuffer *thePathBuffer = GetPathBufferObject(inRenderContext.m_Path);
+ if (!thePathBuffer) {
+ return;
+ }
+
+ if (thePathBuffer->m_PathType == PathTypes::Geometry) {
+ QT3DSU32 displacementIdx = 0;
+ QT3DSU32 imageIdx = 0;
+ SRenderableImage *displacementImage = 0;
+
+ for (SRenderableImage *theImage = inRenderContext.m_FirstImage;
+ theImage != NULL && displacementImage == NULL;
+ theImage = theImage->m_NextImage, ++imageIdx) {
+ if (theImage->m_MapType == ImageMapTypes::Displacement) {
+ displacementIdx = imageIdx;
+ displacementImage = theImage;
+ }
+ }
+
+ NVScopedRefCounted<SPathGeneratedShader> &theDesiredDepthShader =
+ displacementImage == NULL ? m_DepthShader : m_DepthDisplacementShader;
+
+ if (!theDesiredDepthShader) {
+ IDefaultMaterialShaderGenerator &theMaterialGenerator(
+ m_RenderContext->GetDefaultMaterialShaderGenerator());
+ SPathVertexPipeline thePipeline(
+ m_RenderContext->GetShaderProgramGenerator(), theMaterialGenerator,
+ m_RenderContext->GetAllocator(), m_RenderContext->GetStringTable(), false);
+ thePipeline.BeginVertexGeneration(displacementIdx, displacementImage);
+ thePipeline.BeginFragmentGeneration();
+ thePipeline.Fragment().Append("\tfragOutput = vec4(1.0, 1.0, 1.0, 1.0);");
+ thePipeline.EndVertexGeneration(false);
+ thePipeline.EndFragmentGeneration(false);
+ const char8_t *shaderName = "path depth";
+ if (displacementImage)
+ shaderName = "path depth displacement";
+
+ SShaderCacheProgramFlags theFlags;
+ NVRenderShaderProgram *theProgram =
+ thePipeline.ProgramGenerator().CompileGeneratedShader(shaderName, theFlags,
+ inFeatureSet);
+ if (theProgram) {
+ theDesiredDepthShader =
+ QT3DS_NEW(m_RenderContext->GetAllocator(),
+ SPathGeneratedShader)(*theProgram, m_RenderContext->GetAllocator());
+ }
+ }
+ if (theDesiredDepthShader) {
+ DoRenderGeometryPath(*theDesiredDepthShader, inRenderContext, inRenderProperties,
+ *thePathBuffer);
+ }
+ } else {
+ // painted path, go stroke route for now.
+ if (!m_PaintedDepthShader) {
+ IDefaultMaterialShaderGenerator &theMaterialGenerator(
+ m_RenderContext->GetDefaultMaterialShaderGenerator());
+ SXYRectVertexPipeline thePipeline(
+ m_RenderContext->GetShaderProgramGenerator(), theMaterialGenerator,
+ m_RenderContext->GetAllocator(), m_RenderContext->GetStringTable());
+ thePipeline.BeginVertexGeneration(0, NULL);
+ thePipeline.BeginFragmentGeneration();
+ thePipeline.Fragment().Append("\tfragOutput = vec4(1.0, 1.0, 1.0, 1.0);");
+ thePipeline.EndVertexGeneration(false);
+ thePipeline.EndFragmentGeneration(false);
+ const char8_t *shaderName = "path painted depth";
+ SShaderCacheProgramFlags theFlags;
+ NVRenderShaderProgram *theProgram =
+ thePipeline.ProgramGenerator().CompileGeneratedShader(shaderName, theFlags,
+ inFeatureSet);
+ if (theProgram) {
+ m_PaintedDepthShader =
+ QT3DS_NEW(m_RenderContext->GetAllocator(), SPathXYGeneratedShader)(
+ *theProgram, m_RenderContext->GetAllocator());
+ }
+ }
+ if (m_PaintedDepthShader) {
+
+ DoRenderPaintedPath(*m_PaintedDepthShader, inRenderContext, inRenderProperties,
+ *thePathBuffer);
+ }
+ }
+ }
+
+ void RenderShadowMapPass(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) override
+ {
+ SPathBuffer *thePathBuffer = GetPathBufferObject(inRenderContext.m_Path);
+ if (!thePathBuffer) {
+ return;
+ }
+
+ if (inRenderContext.m_Material.m_Type != GraphObjectTypes::DefaultMaterial)
+ return;
+
+ if (thePathBuffer->m_PathType == PathTypes::Painted) {
+ // painted path, go stroke route for now.
+ if (!m_PaintedShadowShader) {
+ IDefaultMaterialShaderGenerator &theMaterialGenerator(
+ m_RenderContext->GetDefaultMaterialShaderGenerator());
+ SXYRectVertexPipeline thePipeline(
+ m_RenderContext->GetShaderProgramGenerator(), theMaterialGenerator,
+ m_RenderContext->GetAllocator(), m_RenderContext->GetStringTable());
+ thePipeline.OutputParaboloidDepthShaders();
+ const char8_t *shaderName = "path painted paraboloid depth";
+ SShaderCacheProgramFlags theFlags;
+ NVRenderShaderProgram *theProgram =
+ thePipeline.ProgramGenerator().CompileGeneratedShader(shaderName, theFlags,
+ inFeatureSet);
+ if (theProgram) {
+ m_PaintedShadowShader =
+ QT3DS_NEW(m_RenderContext->GetAllocator(), SPathXYGeneratedShader)(
+ *theProgram, m_RenderContext->GetAllocator());
+ }
+ }
+ if (m_PaintedShadowShader) {
+ // Setup the shader paraboloid information.
+ NVRenderContext &theRenderContext(m_RenderContext->GetRenderContext());
+ theRenderContext.SetActiveShader(&m_PaintedShadowShader->m_Shader);
+
+ DoRenderPaintedPath(*m_PaintedShadowShader, inRenderContext, inRenderProperties,
+ *thePathBuffer, true);
+ }
+ } else {
+ // Until we've also got a proper path render path for this, we'll call the old-fashioned
+ // stuff.
+ RenderDepthPrepass(inRenderContext, inRenderProperties, inFeatureSet);
+ // QT3DS_ASSERT( false );
+ }
+ }
+
+ void RenderCubeFaceShadowPass(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) override
+ {
+ SPathBuffer *thePathBuffer = GetPathBufferObject(inRenderContext.m_Path);
+ if (!thePathBuffer) {
+ return;
+ }
+
+ if (inRenderContext.m_Material.m_Type != GraphObjectTypes::DefaultMaterial)
+ return;
+
+ if (thePathBuffer->m_PathType == PathTypes::Painted) {
+ if (!m_PaintedCubeShadowShader) {
+ IDefaultMaterialShaderGenerator &theMaterialGenerator(
+ m_RenderContext->GetDefaultMaterialShaderGenerator());
+ SXYRectVertexPipeline thePipeline(
+ m_RenderContext->GetShaderProgramGenerator(), theMaterialGenerator,
+ m_RenderContext->GetAllocator(), m_RenderContext->GetStringTable());
+ thePipeline.OutputCubeFaceDepthShaders();
+ const char8_t *shaderName = "path painted cube face depth";
+ SShaderCacheProgramFlags theFlags;
+ NVRenderShaderProgram *theProgram =
+ thePipeline.ProgramGenerator().CompileGeneratedShader(shaderName, theFlags,
+ inFeatureSet);
+ if (theProgram) {
+ m_PaintedCubeShadowShader =
+ QT3DS_NEW(m_RenderContext->GetAllocator(), SPathXYGeneratedShader)(
+ *theProgram, m_RenderContext->GetAllocator());
+ }
+ }
+ if (m_PaintedCubeShadowShader) {
+ // Setup the shader information.
+ NVRenderContext &theRenderContext(m_RenderContext->GetRenderContext());
+ theRenderContext.SetActiveShader(&m_PaintedCubeShadowShader->m_Shader);
+
+ m_PaintedCubeShadowShader->m_CameraPosition.Set(
+ inRenderContext.m_Camera.GetGlobalPos());
+ m_PaintedCubeShadowShader->m_CameraProperties.Set(
+ QT3DSVec2(1.0f, inRenderContext.m_Camera.m_ClipFar));
+ m_PaintedCubeShadowShader->m_ModelMatrix.Set(inRenderContext.m_ModelMatrix);
+
+ DoRenderPaintedPath(*m_PaintedCubeShadowShader, inRenderContext, inRenderProperties,
+ *thePathBuffer, false);
+ }
+ } else {
+ // Until we've also got a proper path render path for this, we'll call the old-fashioned
+ // stuff.
+ RenderDepthPrepass(inRenderContext, inRenderProperties, inFeatureSet);
+ }
+ }
+
+ void RenderPath(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) override
+ {
+ SPathBuffer *thePathBuffer = GetPathBufferObject(inRenderContext.m_Path);
+ if (!thePathBuffer) {
+ return;
+ }
+
+ bool isDefaultMaterial =
+ (inRenderContext.m_Material.m_Type == GraphObjectTypes::DefaultMaterial);
+
+ if (thePathBuffer->m_PathType == PathTypes::Geometry) {
+ IMaterialShaderGenerator *theMaterialGenerator =
+ GetMaterialShaderGenertator(inRenderContext);
+
+ // we need a more evolved key her for custom materials
+ // the same key can still need a different shader
+ SPathShaderMapKey sPathkey = SPathShaderMapKey(GetMaterialNameForKey(inRenderContext),
+ inRenderContext.m_MaterialKey);
+ eastl::pair<TShaderMap::iterator, bool> inserter = m_PathGeometryShaders.insert(
+ eastl::make_pair(sPathkey, NVScopedRefCounted<SPathGeneratedShader>(NULL)));
+ if (inserter.second) {
+ SPathVertexPipeline thePipeline(
+ m_RenderContext->GetShaderProgramGenerator(), *theMaterialGenerator,
+ m_RenderContext->GetAllocator(), m_RenderContext->GetStringTable(),
+ m_RenderContext->GetWireframeMode());
+
+ NVRenderShaderProgram *theProgram = NULL;
+
+ if (isDefaultMaterial) {
+ theProgram = theMaterialGenerator->GenerateShader(
+ inRenderContext.m_Material, inRenderContext.m_MaterialKey, thePipeline,
+ inFeatureSet, inRenderProperties.m_Lights, inRenderContext.m_FirstImage,
+ inRenderContext.m_Opacity < 1.0, "path geometry pipeline-- ");
+ } else {
+ ICustomMaterialSystem &theMaterialSystem(
+ m_RenderContext->GetCustomMaterialSystem());
+ const SCustomMaterial &theCustomMaterial(
+ reinterpret_cast<const SCustomMaterial &>(inRenderContext.m_Material));
+
+ theProgram = theMaterialGenerator->GenerateShader(
+ inRenderContext.m_Material, inRenderContext.m_MaterialKey, thePipeline,
+ inFeatureSet, inRenderProperties.m_Lights, inRenderContext.m_FirstImage,
+ inRenderContext.m_Opacity < 1.0, "path geometry pipeline-- ",
+ theMaterialSystem.GetShaderName(theCustomMaterial));
+ }
+
+ if (theProgram)
+ inserter.first->second =
+ QT3DS_NEW(m_RenderContext->GetAllocator(),
+ SPathGeneratedShader)(*theProgram, m_RenderContext->GetAllocator());
+ }
+ if (!inserter.first->second)
+ return;
+
+ DoRenderGeometryPath(*inserter.first->second.mPtr, inRenderContext, inRenderProperties,
+ *thePathBuffer);
+ } else {
+ IMaterialShaderGenerator *theMaterialGenerator =
+ GetMaterialShaderGenertator(inRenderContext);
+
+ // we need a more evolved key her for custom materials
+ // the same key can still need a different shader
+ SPathShaderMapKey sPathkey = SPathShaderMapKey(GetMaterialNameForKey(inRenderContext),
+ inRenderContext.m_MaterialKey);
+ eastl::pair<TPaintedShaderMap::iterator, bool> inserter = m_PathPaintedShaders.insert(
+ eastl::make_pair(sPathkey, NVScopedRefCounted<SPathXYGeneratedShader>(NULL)));
+
+ if (inserter.second) {
+ SXYRectVertexPipeline thePipeline(
+ m_RenderContext->GetShaderProgramGenerator(), *theMaterialGenerator,
+ m_RenderContext->GetAllocator(), m_RenderContext->GetStringTable());
+
+ NVRenderShaderProgram *theProgram = NULL;
+
+ if (isDefaultMaterial) {
+ theProgram = theMaterialGenerator->GenerateShader(
+ inRenderContext.m_Material, inRenderContext.m_MaterialKey, thePipeline,
+ inFeatureSet, inRenderProperties.m_Lights, inRenderContext.m_FirstImage,
+ inRenderContext.m_Opacity < 1.0, "path painted pipeline-- ");
+ } else {
+ ICustomMaterialSystem &theMaterialSystem(
+ m_RenderContext->GetCustomMaterialSystem());
+ const SCustomMaterial &theCustomMaterial(
+ reinterpret_cast<const SCustomMaterial &>(inRenderContext.m_Material));
+
+ theProgram = theMaterialGenerator->GenerateShader(
+ inRenderContext.m_Material, inRenderContext.m_MaterialKey, thePipeline,
+ inFeatureSet, inRenderProperties.m_Lights, inRenderContext.m_FirstImage,
+ inRenderContext.m_Opacity < 1.0, "path painted pipeline-- ",
+ theMaterialSystem.GetShaderName(theCustomMaterial));
+ }
+
+ if (theProgram)
+ inserter.first->second =
+ QT3DS_NEW(m_RenderContext->GetAllocator(), SPathXYGeneratedShader)(
+ *theProgram, m_RenderContext->GetAllocator());
+ }
+ if (!inserter.first->second)
+ return;
+
+ DoRenderPaintedPath(*inserter.first->second.mPtr, inRenderContext, inRenderProperties,
+ *thePathBuffer);
+ }
+ }
+};
+}
+
+QT3DSVec2 IPathManagerCore::GetControlPointFromAngleDistance(QT3DSVec2 inPosition, float inIncomingAngle,
+ float inIncomingDistance)
+{
+ if (inIncomingDistance == 0.0f)
+ return inPosition;
+ float angleRad = degToRad(inIncomingAngle);
+ float angleSin = NVSin(angleRad);
+ float angleCos = NVCos(angleRad);
+ QT3DSVec2 relativeAngles = QT3DSVec2(angleCos * inIncomingDistance, angleSin * inIncomingDistance);
+ return inPosition + relativeAngles;
+}
+
+QT3DSVec2 IPathManagerCore::GetAngleDistanceFromControlPoint(QT3DSVec2 inPosition, QT3DSVec2 inControlPoint)
+{
+ QT3DSVec2 relative = inControlPoint - inPosition;
+ float angleRad = atan2(relative.y, relative.x);
+ float distance = relative.magnitude();
+ return QT3DSVec2(radToDeg(angleRad), distance);
+}
+
+IPathManagerCore &IPathManagerCore::CreatePathManagerCore(IQt3DSRenderContextCore &ctx)
+{
+ return *QT3DS_NEW(ctx.GetAllocator(), SPathManager)(ctx);
+}
diff --git a/src/runtimerender/Qt3DSRenderPathManager.h b/src/runtimerender/Qt3DSRenderPathManager.h
new file mode 100644
index 0000000..fc7e05f
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPathManager.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PATH_MANAGER_H
+#define QT3DS_RENDER_PATH_MANAGER_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderShaderCache.h" //TShaderFeatureSet
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSBounds3.h"
+//#include "Qt3DSRenderDefaultMaterialShaderGenerator.h" //SLayerGlobalRenderProperties
+
+namespace qt3ds {
+namespace render {
+
+ struct SLayerGlobalRenderProperties;
+
+ struct SPathAnchorPoint
+ {
+ QT3DSVec2 m_Position;
+ QT3DSF32 m_IncomingAngle;
+ QT3DSF32 m_OutgoingAngle;
+ QT3DSF32 m_IncomingDistance;
+ QT3DSF32 m_OutgoingDistance;
+ SPathAnchorPoint() {}
+ SPathAnchorPoint(QT3DSVec2 inPos, QT3DSF32 inAngle, QT3DSF32 outAngle, QT3DSF32 inDis, QT3DSF32 outDis)
+ : m_Position(inPos)
+ , m_IncomingAngle(inAngle)
+ , m_OutgoingAngle(outAngle)
+ , m_IncomingDistance(inDis)
+ , m_OutgoingDistance(outDis)
+ {
+ }
+ };
+
+ class IPathManagerCore : public NVRefCounted
+ {
+ public:
+ // returns the path buffer id
+ //!! Note this call is made from multiple threads simultaneously during binary load.
+ //!! - see UICRenderGraphObjectSerializer.cpp
+ virtual void
+ SetPathSubPathData(const SPathSubPath &inPathSubPath,
+ NVConstDataRef<SPathAnchorPoint> inPathSubPathAnchorPoints) = 0;
+
+ virtual NVDataRef<SPathAnchorPoint>
+ GetPathSubPathBuffer(const SPathSubPath &inPathSubPath) = 0;
+ // Marks the PathSubPath anchor points as dirty. This will mean rebuilding any PathSubPath
+ // context required to render the PathSubPath.
+ virtual NVDataRef<SPathAnchorPoint>
+ ResizePathSubPathBuffer(const SPathSubPath &inPathSubPath, QT3DSU32 inNumAnchors) = 0;
+ virtual NVBounds3 GetBounds(const SPath &inPath) = 0;
+
+ // Helper functions used in various locations
+ // Angles here are in degrees because that is how they are represented in the data.
+ static QT3DSVec2 GetControlPointFromAngleDistance(QT3DSVec2 inPosition, float inAngle,
+ float inDistance);
+
+ // Returns angle in x, distance in y.
+ static QT3DSVec2 GetAngleDistanceFromControlPoint(QT3DSVec2 inPosition, QT3DSVec2 inControlPoint);
+
+ virtual IPathManager &OnRenderSystemInitialize(IQt3DSRenderContext &context) = 0;
+
+ static IPathManagerCore &CreatePathManagerCore(IQt3DSRenderContextCore &inContext);
+ };
+
+ struct SPathRenderContext; // UICRenderPathRenderContext.h
+
+ class IPathManager : public IPathManagerCore
+ {
+ public:
+ // The path segments are next expected to change after this call; changes will be ignored.
+ virtual bool PrepareForRender(const SPath &inPath) = 0;
+
+ virtual void RenderDepthPrepass(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) = 0;
+
+ virtual void RenderShadowMapPass(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) = 0;
+
+ virtual void RenderCubeFaceShadowPass(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) = 0;
+
+ virtual void RenderPath(SPathRenderContext &inRenderContext,
+ SLayerGlobalRenderProperties inRenderProperties,
+ TShaderFeatureSet inFeatureSet) = 0;
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderPathMath.h b/src/runtimerender/Qt3DSRenderPathMath.h
new file mode 100644
index 0000000..e9eb222
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPathMath.h
@@ -0,0 +1,713 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_RENDER_PATH_MATH_H
+#define QT3DS_RENDER_PATH_MATH_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSVec3.h"
+namespace qt3ds {
+namespace render {
+namespace path {
+// Solve quadratic equation in with a templated real number system.
+template <typename REAL>
+
+int quadratic(REAL b, REAL c, REAL rts[2])
+{
+ int nquad;
+ REAL dis;
+ REAL rtdis;
+
+ dis = b * b - 4 * c;
+ rts[0] = 0;
+ rts[1] = 0;
+ if (b == 0) {
+ if (c == 0) {
+ nquad = 2;
+ } else {
+ if (c < 0) {
+ nquad = 2;
+ rts[0] = sqrt(-c);
+ rts[1] = -rts[0];
+ } else {
+ nquad = 0;
+ }
+ }
+ } else if (c == 0) {
+ nquad = 2;
+ rts[0] = -b;
+ } else if (dis >= 0) {
+ nquad = 2;
+ rtdis = sqrt(dis);
+ if (b > 0)
+ rts[0] = (-b - rtdis) * (1 / REAL(2));
+ else
+ rts[0] = (-b + rtdis) * (1 / REAL(2));
+ if (rts[0] == 0)
+ rts[1] = -b;
+ else
+ rts[1] = c / rts[0];
+ } else {
+ nquad = 0;
+ }
+
+ return (nquad);
+} /* quadratic */
+
+float interest_range[2] = {0, 1};
+
+void cubicInflectionPoint(const QT3DSVec2 cp[4], nvvector<QT3DSF32> &key_point)
+{
+ // Convert control points to cubic monomial polynomial coefficients
+ const QT3DSVec2 A = cp[3] - cp[0] + (cp[1] - cp[2]) * 3.0;
+ const QT3DSVec2 B = (cp[0] - cp[1] * 2.0 + cp[2]) * 3.0, C = (cp[1] - cp[0]) * 3.0;
+ const QT3DSVec2 D = cp[0];
+
+ double a = 3 * (B.x * A.y - A.x * B.y);
+ double b = 3 * (C.x * A.y - C.y * A.x);
+ double c = C.x * B.y - C.y * B.x;
+
+ double roots[2];
+ int solutions;
+ // Is the quadratic really a degenerate line?
+ if (a == 0) {
+ // Is the line really a degenerate point?
+ if (b == 0) {
+ solutions = 0;
+ } else {
+ solutions = 1;
+ roots[0] = c / b;
+ }
+ } else {
+ solutions = quadratic(b / a, c / a, roots);
+ }
+ for (int i = 0; i < solutions; i++) {
+ QT3DSF32 t = static_cast<QT3DSF32>(roots[i]);
+
+ QT3DSVec2 p = ((A * t + B) * t + C) * t + D;
+ if (t >= interest_range[0] && t <= interest_range[1])
+ key_point.push_back(t);
+ // else; Outside range of interest, ignore.
+ }
+}
+
+typedef enum {
+ CT_POINT,
+ CT_LINE,
+ CT_QUADRATIC,
+ CT_CUSP,
+ CT_LOOP,
+ CT_SERPENTINE
+} CurveType;
+
+static inline bool isZero(double v)
+{
+#if 0
+ const double eps = 6e-008;
+
+ if (fabs(v) < eps)
+ return true;
+ else
+ return false;
+#else
+ return v == 0.0;
+#endif
+}
+
+inline QT3DSVec3 crossv1(const QT3DSVec2 &a, const QT3DSVec2 &b)
+{
+ return QT3DSVec3(a[1] - b[1], b[0] - a[0], a[0] * b[1] - a[1] * b[0]);
+}
+
+inline bool sameVertex(const QT3DSVec2 &a, const QT3DSVec2 &b)
+{
+ return (a.x == b.x && a.y == b.y);
+}
+
+inline bool sameVertex(const QT3DSVec3 &a, const QT3DSVec3 &b)
+{
+ return (a.x == b.x && a.y == b.y && a.z == b.z);
+}
+
+// This function "normalizes" the input vector so the larger of its components
+// is in the range [512,1024]. Exploit integer math on the exponent bits to
+// do this without expensive DP exponentiation.
+inline void scaleTo512To1024(QT3DSVec2 &d, int e)
+{
+ union {
+ QT3DSU64 u64;
+ double f64;
+ } x;
+ int ie = 10 - (int)e + 1023;
+ QT3DS_ASSERT(ie > 0);
+ x.u64 = ((QT3DSU64)ie) << 52;
+ d *= static_cast<QT3DSF32>(x.f64);
+}
+
+inline double fastfrexp(double d, int *exponent)
+{
+ union {
+ QT3DSU64 u64;
+ double f64;
+ } x;
+ x.f64 = d;
+ *exponent = (((int)(x.u64 >> 52)) & 0x7ff) - 0x3ff;
+ x.u64 &= (1ULL << 63) - (1ULL << 52);
+ x.u64 |= (0x3ffULL << 52);
+ return x.f64;
+}
+
+QT3DSVec3 CreateVec3(QT3DSVec2 xy, float z)
+{
+ return QT3DSVec3(xy.x, xy.y, z);
+}
+
+QT3DSVec2 GetXY(const QT3DSVec3 &data)
+{
+ return QT3DSVec2(data.x, data.y);
+}
+
+CurveType cubicDoublePoint(const QT3DSVec2 points[4], nvvector<QT3DSF32> &key_point)
+{
+#if 0
+ const QT3DSVec2 AA = points[3] - points[0] + (points[1] - points[2]) * 3.0;
+ const QT3DSVec3 BB = (points[0] - points[1] * 2.0 + points[2]) * 3.0;
+ const QT3DSVec3 CC = (points[1] - points[0]) * 3.0, DD = points[0];
+#endif
+
+ // Assume control points of the cubic curve are A, B, C, and D.
+ const QT3DSVec3 A = CreateVec3(points[0], 1);
+ const QT3DSVec3 B = CreateVec3(points[1], 1);
+ const QT3DSVec3 C = CreateVec3(points[2], 1);
+ const QT3DSVec3 D = CreateVec3(points[3], 1);
+
+ // Compute the discriminant of the roots of
+ // H(s,t) = -36*(d1^2*s^2 - d1*d2*s*t + (d2^2 - d1*d3)*t^2)
+ // where H is the Hessian (the square matrix of second-order
+ // partial derivatives of a function) of I(s,t)
+ // where I(s,t) determine the inflection points of the cubic
+ // Bezier curve C(s,t).
+ //
+ // d1, d2, and d3 functions of the determinants constructed
+ // from the cubic control points.
+ //
+ // Recall dot(a,cross(b,c)) is determinant of a 3x3 matrix
+ // with a, b, c the rows of the matrix.
+ const QT3DSVec3 DC = crossv1(GetXY(D), GetXY(C));
+ const QT3DSVec3 AD = crossv1(GetXY(A), GetXY(D));
+ const QT3DSVec3 BA = crossv1(GetXY(B), GetXY(A));
+
+ const double a1 = A.dot(DC);
+ const double a2 = B.dot(AD);
+ const double a3 = C.dot(BA);
+ const double d1 = a1 - 2 * a2 + 3 * a3;
+ const double d2 = -a2 + 3 * a3;
+ const double d3 = 3 * a3;
+ const double discriminant = (3 * d2 * d2 - 4 * d1 * d3);
+
+ // The sign of the discriminant of I classifies the curbic curve
+ // C into one of 6 classifications:
+ // 1) discriminant>0 ==> serpentine
+ // 2) discriminant=0 ==> cusp
+ // 3) discriminant<0 ==> loop
+
+ // If the discriminant or d1 are almost but not exactly zero, the
+ // result is really noisy unacceptable (k,l,m) interpolation.
+ // If it looks almost like a quadratic or linear case, treat it that way.
+ if (isZero(discriminant) && isZero(d1)) {
+ // Cusp case
+
+ if (isZero(d2)) {
+ // degenerate cases (points, lines, quadratics)...
+ if (isZero(d3)) {
+ if (sameVertex(A, B) && sameVertex(A, C) && sameVertex(A, D))
+ return CT_POINT;
+ else
+ return CT_LINE;
+ } else {
+ return CT_QUADRATIC;
+ }
+ } else {
+ return CT_CUSP;
+ }
+ } else if (discriminant < 0) {
+ // Loop case
+
+ const QT3DSF32 t = static_cast<QT3DSF32>(d2 + sqrt(-discriminant));
+ QT3DSVec2 d = QT3DSVec2(t, static_cast<QT3DSF32>(2 * d1));
+ QT3DSVec2 e = QT3DSVec2(static_cast<QT3DSF32>(2 * (d2 * d2 - d1 * d3)),
+ static_cast<QT3DSF32>(d1 * t));
+
+ // There is the situation where r2=c/t results in division by zero, but
+ // in this case, the two roots represent a double root at zero so
+ // subsitute l for (the otherwise NaN) m in this case.
+ //
+ // This situation can occur when the 1st and 2nd (or 3rd and 4th?)
+ // control point of a cubic Bezier path SubPath are identical.
+ if (e.x == 0 && e.y == 0)
+ e = d;
+
+ // d, e, or both could be very large values. To mitigate the risk of
+ // floating-point overflow in subsequent calculations
+ // scale both vectors to be in the range [768,1024] since their relative
+ // scale of their x & y components is irrelevant.
+
+ // Be careful to divide by a power-of-two to disturb mantissa bits.
+
+ double d_max_mag = NVMax(fabs(d.x), fabs(d.y));
+ int exponent;
+ fastfrexp(d_max_mag, &exponent);
+ scaleTo512To1024(d, exponent);
+
+ double e_max_mag = NVMax(fabs(e.x), fabs(e.y));
+ fastfrexp(e_max_mag, &exponent);
+ scaleTo512To1024(e, exponent);
+
+ const QT3DSVec2 roots = QT3DSVec2(d.x / d.y, e.x / e.y);
+
+ double tt;
+#if 0
+ tt = roots[0];
+ if (tt >= interest_range[0] && tt <= interest_range[1])
+ // key_point.push_back(tt);
+ tt = roots[1];
+ if (tt >= interest_range[0] && tt <= interest_range[1])
+ // key_point.push_back(tt);
+#endif
+ tt = (roots[0] + roots[1]) / 2;
+ if (tt >= interest_range[0] && tt <= interest_range[1])
+ key_point.push_back(static_cast<QT3DSF32>(tt));
+
+ return CT_LOOP;
+ } else {
+ QT3DS_ASSERT(discriminant >= 0);
+ cubicInflectionPoint(points, key_point);
+ if (discriminant > 0) {
+ // Serpentine case
+ return CT_SERPENTINE;
+ } else {
+ // Cusp with inflection at infinity (treat like serpentine)
+ return CT_CUSP;
+ }
+ }
+}
+
+QT3DSVec4 CreateVec4(QT3DSVec2 p1, QT3DSVec2 p2)
+{
+ return QT3DSVec4(p1.x, p1.y, p2.x, p2.y);
+}
+
+QT3DSVec2 lerp(QT3DSVec2 p1, QT3DSVec2 p2, QT3DSF32 distance)
+{
+ return p1 + (p2 - p1) * distance;
+}
+
+QT3DSF32 lerp(QT3DSF32 p1, QT3DSF32 p2, QT3DSF32 distance)
+{
+ return p1 + (p2 - p1) * distance;
+}
+
+// Using first derivative to get tangent.
+// If this equation does not make immediate sense consider that it is the first derivative
+// of the de Casteljau bezier expansion, not the polynomial expansion.
+float TangentAt(float inT, float p1, float c1, float c2, float p2)
+{
+ float a = c1 - p1;
+ float b = c2 - c1 - a;
+ float c = p2 - c2 - a - (2.0f * b);
+ float retval = 3.0f * (a + (2.0f * b * inT) + (c * inT * inT));
+ return retval;
+}
+
+QT3DSVec2 midpoint(QT3DSVec2 p1, QT3DSVec2 p2)
+{
+ return lerp(p1, p2, .5f);
+}
+
+QT3DSF32 LineLength(QT3DSVec2 inStart, QT3DSVec2 inStop)
+{
+ return (inStop - inStart).magnitude();
+}
+
+struct SCubicBezierCurve
+{
+ QT3DSVec2 m_Points[4];
+ SCubicBezierCurve(QT3DSVec2 a1, QT3DSVec2 c1, QT3DSVec2 c2, QT3DSVec2 a2)
+ {
+ m_Points[0] = a1;
+ m_Points[1] = c1;
+ m_Points[2] = c2;
+ m_Points[3] = a2;
+ }
+
+ // Normal is of course orthogonal to the tangent.
+ QT3DSVec2 NormalAt(float inT) const
+ {
+ QT3DSVec2 tangent = QT3DSVec2(
+ TangentAt(inT, m_Points[0].x, m_Points[1].x, m_Points[2].x, m_Points[3].x),
+ TangentAt(inT, m_Points[0].y, m_Points[1].y, m_Points[2].y, m_Points[3].y));
+
+ QT3DSVec2 result(tangent.y, -tangent.x);
+ result.normalize();
+ return result;
+ }
+
+ eastl::pair<SCubicBezierCurve, SCubicBezierCurve> SplitCubicBezierCurve(float inT)
+ {
+ // compute point on curve based on inT
+ // using de Casteljau algorithm
+ QT3DSVec2 p12 = lerp(m_Points[0], m_Points[1], inT);
+ QT3DSVec2 p23 = lerp(m_Points[1], m_Points[2], inT);
+ QT3DSVec2 p34 = lerp(m_Points[2], m_Points[3], inT);
+ QT3DSVec2 p123 = lerp(p12, p23, inT);
+ QT3DSVec2 p234 = lerp(p23, p34, inT);
+ QT3DSVec2 p1234 = lerp(p123, p234, inT);
+
+ return eastl::make_pair(SCubicBezierCurve(m_Points[0], p12, p123, p1234),
+ SCubicBezierCurve(p1234, p234, p34, m_Points[3]));
+ }
+};
+
+#if 0
+ static QT3DSVec2 NormalToLine( QT3DSVec2 startPoint, QT3DSVec2 endPoint )
+ {
+ QT3DSVec2 lineDxDy = endPoint - startPoint;
+ QT3DSVec2 result( lineDxDy.y, -lineDxDy.x );
+ result.normalize();
+ return result;
+ }
+#endif
+
+struct SResultCubic
+{
+ enum Mode {
+ Normal = 0,
+ BeginTaper = 1,
+ EndTaper = 2,
+ };
+ QT3DSVec2 m_P1;
+ QT3DSVec2 m_C1;
+ QT3DSVec2 m_C2;
+ QT3DSVec2 m_P2;
+ // Location in the original data where this cubic is taken from
+ QT3DSU32 m_EquationIndex;
+ QT3DSF32 m_TStart;
+ QT3DSF32 m_TStop;
+ QT3DSF32 m_Length;
+ QT3DSVec2 m_TaperMultiplier; // normally 1, goes to zero at very end of taper if any taper.
+ Mode m_Mode;
+
+ SResultCubic(QT3DSVec2 inP1, QT3DSVec2 inC1, QT3DSVec2 inC2, QT3DSVec2 inP2,
+ QT3DSU32 equationIndex, QT3DSF32 tStart, QT3DSF32 tStop, QT3DSF32 length)
+ : m_P1(inP1)
+ , m_C1(inC1)
+ , m_C2(inC2)
+ , m_P2(inP2)
+ , m_EquationIndex(equationIndex)
+ , m_TStart(tStart)
+ , m_TStop(tStop)
+ , m_Length(length)
+ , m_TaperMultiplier(1.0f, 1.0f)
+ , m_Mode(Normal)
+ {
+ }
+ // Note the vec2 items are *not* initialized in any way here.
+ SResultCubic() {}
+ QT3DSF32 GetP1Width(QT3DSF32 inPathWidth, QT3DSF32 beginTaperWidth, QT3DSF32 endTaperWidth)
+ {
+ return GetPathWidth(inPathWidth, beginTaperWidth, endTaperWidth, 0);
+ }
+
+ QT3DSF32 GetP2Width(QT3DSF32 inPathWidth, QT3DSF32 beginTaperWidth, QT3DSF32 endTaperWidth)
+ {
+ return GetPathWidth(inPathWidth, beginTaperWidth, endTaperWidth, 1);
+ }
+
+ QT3DSF32 GetPathWidth(QT3DSF32 inPathWidth, QT3DSF32 beginTaperWidth, QT3DSF32 endTaperWidth,
+ QT3DSU32 inTaperIndex)
+ {
+ QT3DSF32 retval = inPathWidth;
+ switch (m_Mode) {
+ case BeginTaper:
+ retval = beginTaperWidth * m_TaperMultiplier[inTaperIndex];
+ break;
+ case EndTaper:
+ retval = endTaperWidth * m_TaperMultiplier[inTaperIndex];
+ break;
+ default:
+ break;
+ }
+ return retval;
+ }
+};
+
+void PushLine(nvvector<SResultCubic> &ioResultVec, QT3DSVec2 inStart, QT3DSVec2 inStop,
+ QT3DSU32 inEquationIndex)
+{
+ QT3DSVec2 range = inStop - inStart;
+ ioResultVec.push_back(SResultCubic(inStart, inStart + range * .333f,
+ inStart + range * .666f, inStop, inEquationIndex,
+ 0.0f, 1.0f, LineLength(inStart, inStop)));
+}
+
+struct PathDirtyFlagValues
+{
+ enum Enum {
+ SourceData = 1,
+ PathType = 1 << 1,
+ Width = 1 << 2,
+ BeginTaper = 1 << 3,
+ EndTaper = 1 << 4,
+ CPUError = 1 << 5,
+ };
+};
+
+struct SPathDirtyFlags : public NVFlags<PathDirtyFlagValues::Enum>
+{
+ typedef NVFlags<PathDirtyFlagValues::Enum> TBase;
+ SPathDirtyFlags() {}
+ SPathDirtyFlags(int inFlags)
+ : TBase(static_cast<PathDirtyFlagValues::Enum>(inFlags))
+ {
+ }
+ void Clear()
+ {
+ *this = SPathDirtyFlags();
+ }
+};
+
+struct STaperInformation
+{
+ QT3DSF32 m_CapOffset;
+ QT3DSF32 m_CapOpacity;
+ QT3DSF32 m_CapWidth;
+
+ STaperInformation()
+ : m_CapOffset(0)
+ , m_CapOpacity(0)
+ , m_CapWidth(0)
+ {
+ }
+ STaperInformation(QT3DSF32 capOffset, QT3DSF32 capOpacity, QT3DSF32 capWidth)
+ : m_CapOffset(capOffset)
+ , m_CapOpacity(capOpacity)
+ , m_CapWidth(capWidth)
+ {
+ }
+
+ bool operator==(const STaperInformation &inOther) const
+ {
+ return m_CapOffset == inOther.m_CapOffset && m_CapOpacity == inOther.m_CapOpacity
+ && m_CapWidth == inOther.m_CapWidth;
+ }
+};
+
+template <typename TOptData>
+bool OptionEquals(const Option<TOptData> &lhs, const Option<TOptData> &rhs)
+{
+ if (lhs.hasValue() != rhs.hasValue())
+ return false;
+ if (lhs.hasValue())
+ return lhs.getValue() == rhs.getValue();
+ return true;
+}
+void OuterAdaptiveSubdivideBezierCurve(nvvector<SResultCubic> &ioResultVec,
+ nvvector<QT3DSF32> &keyPointVec,
+ SCubicBezierCurve inCurve, QT3DSF32 inLinearError,
+ QT3DSU32 inEquationIndex);
+
+void AdaptiveSubdivideBezierCurve(nvvector<SResultCubic> &ioResultVec,
+ SCubicBezierCurve &inCurve, QT3DSF32 inLinearError,
+ QT3DSU32 inEquationIndex, QT3DSF32 inTStart, QT3DSF32 inTStop);
+
+// Adaptively subdivide source data to produce m_PatchData.
+void AdaptiveSubdivideSourceData(NVConstDataRef<SPathAnchorPoint> inSourceData,
+ nvvector<SResultCubic> &ioResultVec,
+ nvvector<QT3DSF32> &keyPointVec, QT3DSF32 inLinearError)
+{
+ ioResultVec.clear();
+ if (inSourceData.size() < 2)
+ return;
+ // Assuming no attributes in the source data.
+ QT3DSU32 numEquations = (inSourceData.size() - 1);
+ for (QT3DSU32 idx = 0, end = numEquations; idx < end; ++idx) {
+ const SPathAnchorPoint &beginAnchor = inSourceData[idx];
+ const SPathAnchorPoint &endAnchor = inSourceData[idx + 1];
+
+ QT3DSVec2 anchor1(beginAnchor.m_Position);
+ QT3DSVec2 control1(IPathManagerCore::GetControlPointFromAngleDistance(
+ beginAnchor.m_Position, beginAnchor.m_OutgoingAngle,
+ beginAnchor.m_OutgoingDistance));
+
+ QT3DSVec2 control2(IPathManagerCore::GetControlPointFromAngleDistance(
+ endAnchor.m_Position, endAnchor.m_IncomingAngle,
+ endAnchor.m_IncomingDistance));
+ QT3DSVec2 anchor2(endAnchor.m_Position);
+
+ OuterAdaptiveSubdivideBezierCurve(
+ ioResultVec, keyPointVec,
+ SCubicBezierCurve(anchor1, control1, control2, anchor2), inLinearError, idx);
+ }
+}
+
+// The outer subdivide function topologically analyzes the curve to ensure that
+// the sign of the second derivative does not change, no inflection points.
+// Once that condition is held, then we proceed with a simple adaptive subdivision algorithm
+// until the curve is accurately approximated by a straight line.
+void OuterAdaptiveSubdivideBezierCurve(nvvector<SResultCubic> &ioResultVec,
+ nvvector<QT3DSF32> &keyPointVec,
+ SCubicBezierCurve inCurve, QT3DSF32 inLinearError,
+ QT3DSU32 inEquationIndex)
+{
+ // Step 1, find what type of curve we are dealing with and the inflection points.
+ keyPointVec.clear();
+ CurveType theCurveType = cubicDoublePoint(inCurve.m_Points, keyPointVec);
+
+ QT3DSF32 tStart = 0;
+ switch (theCurveType) {
+ case CT_POINT:
+ ioResultVec.push_back(SResultCubic(inCurve.m_Points[0], inCurve.m_Points[0],
+ inCurve.m_Points[0], inCurve.m_Points[0],
+ inEquationIndex, 0.0f, 1.0f, 0.0f));
+ return; // don't allow further recursion
+ case CT_LINE:
+ PushLine(ioResultVec, inCurve.m_Points[0], inCurve.m_Points[3], inEquationIndex);
+ return; // don't allow further recursion
+ case CT_CUSP:
+ case CT_LOOP:
+ case CT_SERPENTINE: {
+ // Break the curve at the inflection points if there is one. If there aren't
+ // inflection points
+ // the treat as linear (degenerate case that should not happen except in limiting
+ // ranges of floating point accuracy)
+ if (!keyPointVec.empty()) {
+ // It is not clear that the code results in a sorted vector,
+ // or a vector where all values are within the range of 0-1
+ if (keyPointVec.size() > 1)
+ eastl::sort(keyPointVec.begin(), keyPointVec.end());
+ for (QT3DSU32 idx = 0, end = (QT3DSU32)keyPointVec.size();
+ idx < end && keyPointVec[idx] < 1.0f; ++idx) {
+ // We have a list of T values I believe sorted from beginning to end, we
+ // will create a set of bezier curves
+ // Since we split the curves, tValue is relative to tSTart, not 0.
+ QT3DSF32 range = 1.0f - tStart;
+ QT3DSF32 splitPoint = keyPointVec[idx] - tStart;
+ QT3DSF32 tValue = splitPoint / range;
+ if (tValue > 0.0f) {
+ eastl::pair<SCubicBezierCurve, SCubicBezierCurve> newCurves
+ = inCurve.SplitCubicBezierCurve(tValue);
+ AdaptiveSubdivideBezierCurve(ioResultVec, newCurves.first,
+ inLinearError, inEquationIndex, tStart,
+ splitPoint);
+ inCurve = newCurves.second;
+ tStart = splitPoint;
+ }
+ }
+ }
+ }
+ // fallthrough intentional
+ break;
+ // fallthrough intentional
+ case CT_QUADRATIC:
+ break;
+ }
+ AdaptiveSubdivideBezierCurve(ioResultVec, inCurve, inLinearError, inEquationIndex,
+ tStart, 1.0f);
+}
+
+static QT3DSF32 DistanceFromPointToLine(QT3DSVec2 inLineDxDy, QT3DSVec2 lineStart, QT3DSVec2 point)
+{
+ QT3DSVec2 pointToLineStart = lineStart - point;
+ return fabs((inLineDxDy.x * pointToLineStart.y) - (inLineDxDy.y * pointToLineStart.x));
+}
+
+// There are two options here. The first is to just subdivide below a given error
+// tolerance.
+// The second is to fit a quadratic to the curve and then precisely find the length of the
+// quadratic.
+// Obviously we are choosing the subdivide method at this moment but I think the fitting
+// method is probably more robust.
+QT3DSF32 LengthOfBezierCurve(SCubicBezierCurve &inCurve)
+{
+ // Find distance of control points from line. Note that both control points should be
+ // on same side of line else we have a serpentine which should have been removed by topological
+ // analysis.
+ QT3DSVec2 lineDxDy = inCurve.m_Points[3] - inCurve.m_Points[0];
+ QT3DSF32 c1Distance = DistanceFromPointToLine(
+ lineDxDy, inCurve.m_Points[0], inCurve.m_Points[1]);
+ QT3DSF32 c2Distance = DistanceFromPointToLine(
+ lineDxDy, inCurve.m_Points[0], inCurve.m_Points[2]);
+ const float lineTolerance = 100.0f; // error in world coordinates, squared.
+ if (c1Distance > lineTolerance || c2Distance > lineTolerance) {
+ eastl::pair<SCubicBezierCurve, SCubicBezierCurve> subdivCurve
+ = inCurve.SplitCubicBezierCurve(.5f);
+ return LengthOfBezierCurve(subdivCurve.first)
+ + LengthOfBezierCurve(subdivCurve.second);
+ } else {
+ return LineLength(inCurve.m_Points[0], inCurve.m_Points[3]);
+ }
+}
+
+// The assumption here is the the curve type is not cusp, loop, or serpentine.
+// It is either linear or it is a constant curve meaning we can use very simple means to
+// figure out the curvature. There is a possibility to use some math to figure out the point of
+// maximum curvature, where the second derivative will have a max value. This is probably not
+// necessary.
+void AdaptiveSubdivideBezierCurve(nvvector<SResultCubic> &ioResultVec,
+ SCubicBezierCurve &inCurve, QT3DSF32 inLinearError,
+ QT3DSU32 inEquationIndex, QT3DSF32 inTStart, QT3DSF32 inTStop)
+{
+ // Find distance of control points from line. Note that both control points should be
+ // on same side of line else we have a serpentine which should have been removed by topological
+ // analysis.
+ QT3DSVec2 lineDxDy = inCurve.m_Points[3] - inCurve.m_Points[0];
+ QT3DSF32 c1Distance = DistanceFromPointToLine(lineDxDy, inCurve.m_Points[0],
+ inCurve.m_Points[1]);
+ QT3DSF32 c2Distance = DistanceFromPointToLine(lineDxDy, inCurve.m_Points[0],
+ inCurve.m_Points[2]);
+ const float lineTolerance = inLinearError * inLinearError; // error in world coordinates
+ if (c1Distance > lineTolerance || c2Distance > lineTolerance) {
+ eastl::pair<SCubicBezierCurve, SCubicBezierCurve> subdivCurve
+ = inCurve.SplitCubicBezierCurve(.5f);
+ QT3DSF32 halfway = lerp(inTStart, inTStop, .5f);
+ AdaptiveSubdivideBezierCurve(ioResultVec, subdivCurve.first, inLinearError,
+ inEquationIndex, inTStart, halfway);
+ AdaptiveSubdivideBezierCurve(ioResultVec, subdivCurve.second, inLinearError,
+ inEquationIndex, halfway, inTStop);
+ } else {
+ ioResultVec.push_back(SResultCubic(inCurve.m_Points[0], inCurve.m_Points[1],
+ inCurve.m_Points[2], inCurve.m_Points[3],
+ inEquationIndex, inTStart, inTStop,
+ LengthOfBezierCurve(inCurve)));
+ }
+}
+}
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderPathRenderContext.h b/src/runtimerender/Qt3DSRenderPathRenderContext.h
new file mode 100644
index 0000000..deeea28
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPathRenderContext.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PATH_RENDER_CONTEXT_H
+#define QT3DS_RENDER_PATH_RENDER_CONTEXT_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderShaderCache.h" //TShaderFeatureSet
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "Qt3DSRenderShaderKeys.h"
+#include "Qt3DSRenderableImage.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SPathRenderContext
+ {
+ // The lights and camera will not change per layer,
+ // so that information can be set once for all the shaders.
+ NVConstDataRef<SLight *> m_Lights;
+ const SCamera &m_Camera;
+
+ // Per-object information.
+ const SPath &m_Path;
+ const QT3DSMat44 &m_ModelViewProjection;
+ const QT3DSMat44 &m_ModelMatrix; ///< model to world transformation
+ const QT3DSMat33 &m_NormalMatrix;
+
+ QT3DSF32 m_Opacity;
+ const SGraphObject &m_Material;
+ SShaderDefaultMaterialKey m_MaterialKey;
+ SRenderableImage *m_FirstImage;
+ QT3DSVec2 m_CameraVec;
+
+ bool m_EnableWireframe;
+ bool m_HasTransparency;
+ bool m_IsStroke;
+
+ SPathRenderContext(NVConstDataRef<SLight *> lights, const SCamera &cam, const SPath &p,
+ const QT3DSMat44 &mvp, const QT3DSMat44 &world, const QT3DSMat33 &nm,
+ QT3DSF32 inOpacity, const SGraphObject &inMaterial,
+ SShaderDefaultMaterialKey inMaterialKey, SRenderableImage *inFirstImage,
+ bool inWireframe, QT3DSVec2 inCameraVec, bool inHasTransparency,
+ bool inIsStroke)
+
+ : m_Lights(lights)
+ , m_Camera(cam)
+ , m_Path(p)
+ , m_ModelViewProjection(mvp)
+ , m_ModelMatrix(world)
+ , m_NormalMatrix(nm)
+ , m_Opacity(inOpacity)
+ , m_Material(inMaterial)
+ , m_MaterialKey(inMaterialKey)
+ , m_FirstImage(inFirstImage)
+ , m_CameraVec(inCameraVec)
+ , m_EnableWireframe(inWireframe)
+ , m_HasTransparency(inHasTransparency)
+ , m_IsStroke(inIsStroke)
+ {
+ }
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.cpp b/src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.cpp
new file mode 100644
index 0000000..43f7c0b
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.cpp
@@ -0,0 +1,311 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderPixelGraphicsRenderer.h"
+#include "Qt3DSRenderPixelGraphicsTypes.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderShaderCodeGenerator.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderShaderCache.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+
+namespace {
+
+struct SPGRectShader
+{
+ NVScopedRefCounted<NVRenderShaderProgram> m_RectShader;
+ NVRenderShaderConstantBase *mvp;
+ NVRenderShaderConstantBase *rectColor;
+ NVRenderShaderConstantBase *leftright;
+ NVRenderShaderConstantBase *bottomtop;
+
+ SPGRectShader()
+ : mvp(NULL)
+ , rectColor(NULL)
+ , leftright(NULL)
+ , bottomtop(NULL)
+ {
+ }
+ void SetShader(NVRenderShaderProgram *program)
+ {
+ m_RectShader = program;
+ if (program) {
+ mvp = program->GetShaderConstant("model_view_projection");
+ rectColor = program->GetShaderConstant("rect_color");
+ leftright = program->GetShaderConstant("leftright[0]");
+ bottomtop = program->GetShaderConstant("bottomtop[0]");
+ }
+ }
+
+ void Apply(QT3DSMat44 &inVP, const SPGRect &inObject)
+ {
+ if (mvp)
+ m_RectShader->SetConstantValue(mvp, toConstDataRef(inVP), 1);
+ if (rectColor)
+ m_RectShader->SetConstantValue(rectColor, inObject.m_FillColor, 1);
+ if (leftright) {
+ QT3DSF32 theData[] = { inObject.m_Left, inObject.m_Right };
+ m_RectShader->SetConstantValue(leftright, *theData, 2);
+ }
+ if (bottomtop) {
+ QT3DSF32 theData[] = { inObject.m_Bottom, inObject.m_Top };
+ m_RectShader->SetConstantValue(bottomtop, *theData, 2);
+ }
+ }
+
+ operator bool() { return m_RectShader.mPtr != NULL; }
+};
+
+struct SPGRenderer : public IPixelGraphicsRenderer
+{
+ IQt3DSRenderContext &m_RenderContext;
+ IStringTable &m_StringTable;
+ NVScopedRefCounted<NVRenderVertexBuffer> m_QuadVertexBuffer;
+ NVScopedRefCounted<NVRenderIndexBuffer> m_QuadIndexBuffer;
+ NVScopedRefCounted<NVRenderInputAssembler> m_QuadInputAssembler;
+ NVScopedRefCounted<NVRenderAttribLayout> m_QuadAttribLayout;
+ SShaderVertexCodeGenerator m_VertexGenerator;
+ SShaderFragmentCodeGenerator m_FragmentGenerator;
+ SPGRectShader m_RectShader;
+ QT3DSI32 mRefCount;
+
+ SPGRenderer(IQt3DSRenderContext &ctx, IStringTable &strt)
+ : m_RenderContext(ctx)
+ , m_StringTable(strt)
+ , m_VertexGenerator(m_StringTable, ctx.GetAllocator(),
+ m_RenderContext.GetRenderContext().GetRenderContextType())
+ , m_FragmentGenerator(m_VertexGenerator, ctx.GetAllocator(),
+ m_RenderContext.GetRenderContext().GetRenderContextType())
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext.GetAllocator())
+ void GetRectShaderProgram()
+ {
+ if (!m_RectShader) {
+ m_VertexGenerator.Begin();
+ m_FragmentGenerator.Begin();
+ m_VertexGenerator.AddAttribute("attr_pos", "vec2");
+ m_VertexGenerator.AddUniform("model_view_projection", "mat4");
+ m_VertexGenerator.AddUniform("leftright[2]", "float");
+ m_VertexGenerator.AddUniform("bottomtop[2]", "float");
+ m_FragmentGenerator.AddVarying("rect_uvs", "vec2");
+ m_FragmentGenerator.AddUniform("rect_color", "vec4");
+ m_VertexGenerator << "void main() {" << Endl
+ << "\tgl_Position = model_view_projection * vec4( "
+ "leftright[int(attr_pos.x)], bottomtop[int(attr_pos.y)], 0.0, 1.0 "
+ ");"
+ << Endl << "\trect_uvs = attr_pos;" << Endl << "}" << Endl;
+
+ m_FragmentGenerator << "void main() {" << Endl << "\tfragOutput = rect_color;" << Endl
+ << "}" << Endl;
+
+ m_VertexGenerator.BuildShaderSource();
+ m_FragmentGenerator.BuildShaderSource();
+
+ m_RectShader.SetShader(m_RenderContext.GetShaderCache().CompileProgram(
+ m_StringTable.RegisterStr("PixelRectShader"),
+ m_VertexGenerator.m_FinalShaderBuilder.c_str(),
+ m_FragmentGenerator.m_FinalShaderBuilder.c_str(), NULL // no tess control shader
+ ,
+ NULL // no tess eval shader
+ ,
+ NULL // no geometry shader
+ ,
+ SShaderCacheProgramFlags(), ShaderCacheNoFeatures()));
+ }
+ }
+ void GenerateXYQuad()
+ {
+ NVRenderContext &theRenderContext(m_RenderContext.GetRenderContext());
+
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 2),
+ };
+
+ QT3DSVec2 pos[] = { QT3DSVec2(0, 0), QT3DSVec2(0, 1), QT3DSVec2(1, 1), QT3DSVec2(1, 0) };
+
+ if (m_QuadVertexBuffer == NULL) {
+ size_t bufSize = sizeof(pos);
+ m_QuadVertexBuffer = theRenderContext.CreateVertexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static, bufSize, 2 * sizeof(QT3DSF32),
+ toU8DataRef(pos, 4));
+ }
+
+ if (m_QuadIndexBuffer == NULL) {
+ QT3DSU8 indexData[] = {
+ 0, 1, 2, 0, 2, 3,
+ };
+ m_QuadIndexBuffer = theRenderContext.CreateIndexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static,
+ qt3ds::render::NVRenderComponentTypes::QT3DSU8, sizeof(indexData),
+ toU8DataRef(indexData, sizeof(indexData)));
+ }
+
+ if (m_QuadAttribLayout == NULL) {
+ // create our attribute layout
+ m_QuadAttribLayout =
+ theRenderContext.CreateAttributeLayout(toConstDataRef(theEntries, 1));
+ }
+
+ if (m_QuadInputAssembler == NULL) {
+
+ // create input assembler object
+ QT3DSU32 strides = m_QuadVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ m_QuadInputAssembler = theRenderContext.CreateInputAssembler(
+ m_QuadAttribLayout, toConstDataRef(&m_QuadVertexBuffer.mPtr, 1), m_QuadIndexBuffer,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+ }
+ }
+
+ void RenderPixelObject(QT3DSMat44 &inProjection, const SPGRect &inObject)
+ {
+ GenerateXYQuad();
+ GetRectShaderProgram();
+ if (m_RectShader) {
+ m_RenderContext.GetRenderContext().SetActiveShader(m_RectShader.m_RectShader.mPtr);
+ m_RectShader.Apply(inProjection, inObject);
+
+ m_RenderContext.GetRenderContext().SetInputAssembler(m_QuadInputAssembler.mPtr);
+ m_RenderContext.GetRenderContext().Draw(NVRenderDrawMode::Triangles,
+ m_QuadInputAssembler->GetIndexCount(), 0);
+ }
+ }
+
+ void RenderPixelObject(QT3DSMat44 &inProjection, const SPGVertLine &inObject)
+ {
+ // lines are really just rects, but they grow in width in a sort of odd way.
+ // specifically, they grow the increasing coordinate on even boundaries and centered on odd
+ // boundaries.
+ SPGRect theRect;
+ theRect.m_Top = inObject.m_Top;
+ theRect.m_Bottom = inObject.m_Bottom;
+ theRect.m_FillColor = inObject.m_LineColor;
+ theRect.m_Left = inObject.m_X;
+ theRect.m_Right = theRect.m_Left + 1.0f;
+ RenderPixelObject(inProjection, theRect);
+ }
+
+ void RenderPixelObject(QT3DSMat44 &inProjection, const SPGHorzLine &inObject)
+ {
+ SPGRect theRect;
+ theRect.m_Right = inObject.m_Right;
+ theRect.m_Left = inObject.m_Left;
+ theRect.m_FillColor = inObject.m_LineColor;
+ theRect.m_Bottom = inObject.m_Y;
+ theRect.m_Top = theRect.m_Bottom + 1.0f;
+ RenderPixelObject(inProjection, theRect);
+ }
+
+ void Render(NVConstDataRef<SPGGraphObject *> inObjects) override
+ {
+ NVRenderContext &theRenderContext(m_RenderContext.GetRenderContext());
+ theRenderContext.PushPropertySet();
+ // Setup an orthographic camera that places the center at the
+ // lower left of the viewport.
+ NVRenderRectF theViewport = theRenderContext.GetViewport();
+ // With no projection at all, we are going to get a square view box
+ // with boundaries from -1,1 in all dimensions. This is close to what we want.
+ theRenderContext.SetDepthTestEnabled(false);
+ theRenderContext.SetDepthWriteEnabled(false);
+ theRenderContext.SetScissorTestEnabled(false);
+ theRenderContext.SetBlendingEnabled(true);
+ theRenderContext.SetCullingEnabled(false);
+ // Colors are expected to be non-premultiplied, so we premultiply alpha into them at this
+ // point.
+ theRenderContext.SetBlendFunction(qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::SrcAlpha, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha));
+ theRenderContext.SetBlendEquation(qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add));
+
+ SCamera theCamera;
+ theCamera.m_Position.z = -5;
+ theCamera.m_ClipNear = 1.0f;
+ theCamera.m_ClipFar = 10.0f;
+ theCamera.m_Flags.SetOrthographic(true);
+ // Setup camera projection
+ theCamera.ComputeFrustumOrtho(theViewport,
+ QT3DSVec2(theViewport.m_Width, theViewport.m_Height));
+ // Translate such that 0, 0 is lower left of screen.
+ NVRenderRectF theIdealViewport = theViewport;
+ theIdealViewport.m_X -= theViewport.m_Width / 2.0f;
+ theIdealViewport.m_Y -= theViewport.m_Height / 2.0f;
+ QT3DSMat44 theProjectionMatrix = NVRenderContext::ApplyVirtualViewportToProjectionMatrix(
+ theCamera.m_Projection, theViewport, theIdealViewport);
+ theCamera.m_Projection = theProjectionMatrix;
+ // Explicitly call the node's calculate global variables so that the camera doesn't attempt
+ // to change the projection we setup.
+ static_cast<SNode &>(theCamera).CalculateGlobalVariables();
+ QT3DSMat44 theVPMatrix(QT3DSMat44::createIdentity());
+ theCamera.CalculateViewProjectionMatrix(theVPMatrix);
+
+ QT3DSVec4 theTest(60, 200, 0, 1);
+ QT3DSVec4 theResult = theVPMatrix.transform(theTest);
+
+ (void)theTest;
+ (void)theResult;
+
+ for (QT3DSU32 idx = 0, end = inObjects.size(); idx < end; ++idx) {
+ const SPGGraphObject &theObject(*inObjects[idx]);
+
+ switch (theObject.m_Type) {
+ case SGTypes::VertLine:
+ RenderPixelObject(theVPMatrix, static_cast<const SPGVertLine &>(theObject));
+ break;
+ case SGTypes::HorzLine:
+ RenderPixelObject(theVPMatrix, static_cast<const SPGHorzLine &>(theObject));
+ break;
+ case SGTypes::Rect:
+ RenderPixelObject(theVPMatrix, static_cast<const SPGRect &>(theObject));
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ theRenderContext.PopPropertySet(false);
+ }
+};
+}
+
+IPixelGraphicsRenderer &IPixelGraphicsRenderer::CreateRenderer(IQt3DSRenderContext &ctx,
+ IStringTable &strt)
+{
+ return *QT3DS_NEW(ctx.GetAllocator(), SPGRenderer)(ctx, strt);
+}
diff --git a/src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.h b/src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.h
new file mode 100644
index 0000000..b37cb26
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPixelGraphicsRenderer.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PIXEL_GRAPHICS_RENDERER_H
+#define QT3DS_RENDER_PIXEL_GRAPHICS_RENDERER_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSDataRef.h"
+
+namespace qt3ds {
+namespace render {
+
+ // Pixel graphics are graphics described in pixels.
+ // Colors are expected to be non-premultiplied, we use ROP
+ // hardware to do the alpha multiply into the color.
+ class IPixelGraphicsRenderer : public NVRefCounted
+ {
+ public:
+ // Renders the node to the current viewport.
+ virtual void Render(NVConstDataRef<SPGGraphObject *> inObjects) = 0;
+
+ static IPixelGraphicsRenderer &CreateRenderer(IQt3DSRenderContext &ctx, IStringTable &strt);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderPixelGraphicsTypes.cpp b/src/runtimerender/Qt3DSRenderPixelGraphicsTypes.cpp
new file mode 100644
index 0000000..fe32437
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPixelGraphicsTypes.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderPixelGraphicsTypes.h"
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+
+SPGGraphObject::SPGGraphObject(SGTypes::Enum inType)
+ : m_Type(inType)
+{
+}
+
+SPGRect::SPGRect()
+ : SPGGraphObject(SGTypes::Rect)
+ , m_Left(0)
+ , m_Top(0)
+ , m_Right(0)
+ , m_Bottom(0)
+ , m_FillColor(0, 0, 0, 0)
+{
+}
+
+SPGVertLine::SPGVertLine()
+ : SPGGraphObject(SGTypes::VertLine)
+ , m_X(0)
+ , m_Top(0)
+ , m_Bottom(0)
+ , m_LineColor(0, 0, 0, 0)
+{
+}
+
+SPGHorzLine::SPGHorzLine()
+ : SPGGraphObject(SGTypes::HorzLine)
+ , m_Y(0)
+ , m_Left(0)
+ , m_Right(0)
+ , m_LineColor(0, 0, 0, 0)
+{
+}
diff --git a/src/runtimerender/Qt3DSRenderPixelGraphicsTypes.h b/src/runtimerender/Qt3DSRenderPixelGraphicsTypes.h
new file mode 100644
index 0000000..2c154c1
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPixelGraphicsTypes.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PIXEL_GRAPHICS_TYPES_H
+#define QT3DS_RENDER_PIXEL_GRAPHICS_TYPES_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSVec4.h"
+#include "foundation/Qt3DSMat33.h"
+#include "foundation/Qt3DSOption.h"
+
+namespace qt3ds {
+namespace render {
+
+ // Vector graphics with no scaling are pixel aligned with 0,0 being the bottom,left of the
+ // screen
+ // with coordinates increasing to the right and up. This is opposite most window systems but it
+ // preserves the normal openGL assumptions about viewports and positive Y going up in general.
+ struct SGTypes
+ {
+ enum Enum {
+ UnknownVGType = 0,
+ Layer,
+ Rect,
+ VertLine,
+ HorzLine,
+ };
+ };
+
+ struct SPGGraphObject
+ {
+ SGTypes::Enum m_Type;
+ SPGGraphObject(SGTypes::Enum inType);
+ };
+
+ struct SPGRect : public SPGGraphObject
+ {
+ QT3DSF32 m_Left;
+ QT3DSF32 m_Top;
+ QT3DSF32 m_Right;
+ QT3DSF32 m_Bottom;
+
+ QT3DSVec4 m_FillColor;
+
+ SPGRect();
+ };
+
+ struct SPGVertLine : public SPGGraphObject
+ {
+ QT3DSF32 m_X;
+ QT3DSF32 m_Top;
+ QT3DSF32 m_Bottom;
+ QT3DSVec4 m_LineColor;
+ void SetPosition(QT3DSF32 val) { m_X = val; }
+ void SetStart(QT3DSF32 val) { m_Bottom = val; }
+ void SetStop(QT3DSF32 val) { m_Top = val; }
+
+ SPGVertLine();
+ };
+
+ struct SPGHorzLine : public SPGGraphObject
+ {
+ QT3DSF32 m_Y;
+ QT3DSF32 m_Left;
+ QT3DSF32 m_Right;
+ QT3DSVec4 m_LineColor;
+ void SetPosition(QT3DSF32 val) { m_Y = val; }
+ void SetStart(QT3DSF32 val) { m_Left = val; }
+ void SetStop(QT3DSF32 val) { m_Right = val; }
+
+ SPGHorzLine();
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderPlugin.cpp b/src/runtimerender/Qt3DSRenderPlugin.cpp
new file mode 100644
index 0000000..e4e821f
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPlugin.cpp
@@ -0,0 +1,936 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderPlugin.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/SerializationTypes.h"
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSSystem.h"
+#include "foundation/FileTools.h"
+#include "render/Qt3DSRenderContext.h"
+#include "StringTools.h"
+#include "Qt3DSRenderPluginPropertyValue.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+
+#if defined(QT3DS_WINDOWS)
+#include "windows/DynamicLibLoader.h"
+#elif defined(QT3DS_ANDROID)
+#include "android/DynamicLibLoader.h"
+#elif defined(QT3DS_LINUX)
+#include "linux/DynamicLibLoader.h"
+#elif defined(QT3DS_APPLE)
+#include "macos/DynamicLibLoader.h"
+#elif defined(QT3DS_QNX)
+#include "qnx/DynamicLibLoader.h"
+#else
+#error "Must define an operating system type (QT3DS_WINDOWS, QT3DS_ANDROID, QT3DS_LINUX, QT3DS_APPLE, QT3DS_QNX)"
+#endif
+
+using namespace qt3ds::render;
+
+namespace {
+// Legacy definitions...
+// API version 1 definitions
+typedef struct _RenderPluginSurfaceDescriptionV1
+{
+ long m_Width;
+ long m_Height;
+ enum QT3DSRenderPluginDepthTypes m_DepthBuffer;
+ enum QT3DSRenderPluginTextureTypes m_ColorBuffer;
+ TBool m_HasStencilBuffer;
+} TRenderPluginSurfaceDescriptionV1;
+
+typedef TNeedsRenderResult (*TNeedsRenderFunctionV1)(TRenderPluginClassPtr cls,
+ TRenderPluginInstancePtr instance,
+ TRenderPluginSurfaceDescriptionV1 surface,
+ TVec2 presScaleFactor);
+
+typedef void (*TRenderFunctionV1)(TRenderPluginClassPtr cls, TRenderPluginInstancePtr instance,
+ TRenderPluginSurfaceDescriptionV1 surface,
+ TVec2 presScaleFactor,
+ QT3DSRenderPluginColorClearState inClearColorBuffer);
+
+// End API version 1 definitions
+
+TRenderPluginSurfaceDescription ToCInterface(const SOffscreenRendererEnvironment &env)
+{
+ TRenderPluginSurfaceDescription retval;
+ retval.m_Width = (long)env.m_Width;
+ retval.m_Height = (long)env.m_Height;
+ retval.m_ColorBuffer = static_cast<QT3DSRenderPluginTextureTypes>(env.m_Format);
+ retval.m_DepthBuffer = static_cast<QT3DSRenderPluginDepthTypes>(env.m_Depth);
+ retval.m_HasStencilBuffer = env.m_Stencil ? TTRUE : TFALSE;
+ retval.m_MSAALevel = QT3DSRenderPluginMSAALevelNoMSAA;
+ // note no supersampling AA support for plugins
+ // we fall back to 4xMSAA
+ switch (env.m_MSAAMode) {
+ case AAModeValues::X2:
+ retval.m_MSAALevel = QT3DSRenderPluginMSAALevelTwo;
+ break;
+ case AAModeValues::SSAA:
+ case AAModeValues::X4:
+ retval.m_MSAALevel = QT3DSRenderPluginMSAALevelFour;
+ break;
+ case AAModeValues::X8:
+ retval.m_MSAALevel = QT3DSRenderPluginMSAALevelEight;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ // fallthrough intentional.
+ case AAModeValues::NoAA:
+ break;
+ };
+ return retval;
+}
+
+TRenderPluginSurfaceDescriptionV1 ToCInterfaceV1(const SOffscreenRendererEnvironment &env)
+{
+ TRenderPluginSurfaceDescriptionV1 retval;
+ retval.m_Width = (long)env.m_Width;
+ retval.m_Height = (long)env.m_Height;
+ retval.m_ColorBuffer = static_cast<QT3DSRenderPluginTextureTypes>(env.m_Format);
+ retval.m_DepthBuffer = static_cast<QT3DSRenderPluginDepthTypes>(env.m_Depth);
+ retval.m_HasStencilBuffer = env.m_Stencil ? TTRUE : TFALSE;
+ return retval;
+}
+
+TVec2 ToCInterface(const QT3DSVec2 &item)
+{
+ TVec2 retval = { item.x, item.y };
+ return retval;
+}
+
+QT3DSRenderPluginColorClearState ToCInterface(SScene::RenderClearCommand inClearCommand)
+{
+ switch (inClearCommand) {
+ case SScene::DoNotClear:
+ return QT3DSRenderPluginColorClearStateDoNotClear;
+ case SScene::AlwaysClear:
+ return QT3DSRenderPluginColorClearStateAlwaysClear;
+ default:
+ QT3DS_ASSERT(false); // fallthrough intentional
+ case SScene::ClearIsOptional:
+ return QT3DSRenderPluginColorClearStateClearIsOptional;
+ };
+}
+
+class SRenderPluginPropertyData
+{
+ SRenderPluginPropertyValue m_Value;
+ bool m_Dirty;
+
+public:
+ SRenderPluginPropertyData()
+ : m_Dirty(false)
+ {
+ }
+ SRenderPluginPropertyData(const SRenderPluginPropertyData &other)
+ : m_Value(other.m_Value)
+ , m_Dirty(other.m_Dirty)
+ {
+ }
+ SRenderPluginPropertyData &operator=(const SRenderPluginPropertyData &other)
+ {
+ m_Value = other.m_Value;
+ m_Dirty = other.m_Dirty;
+ return *this;
+ }
+
+ bool IsDirty() const
+ {
+ return m_Value.getType() != RenderPluginPropertyValueTypes::NoRenderPluginPropertyValue
+ && m_Dirty;
+ }
+ void SetValue(const SRenderPluginPropertyValue &value)
+ {
+ m_Value = value;
+ m_Dirty = true;
+ }
+
+ TRenderPluginPropertyUpdate ClearDirty(CRegisteredString inPropName)
+ {
+ m_Dirty = false;
+ TRenderPluginPropertyUpdate retval;
+ memset(&retval, 0, sizeof(TRenderPluginPropertyUpdate));
+ retval.m_PropName = inPropName.c_str();
+ switch (m_Value.getType()) {
+ case RenderPluginPropertyValueTypes::Long: {
+ retval.m_PropertyType = QT3DSRenderPluginPropertyTypeLong;
+ long temp = (long)m_Value.getData<QT3DSI32>();
+ retval.m_PropertyValue = *reinterpret_cast<void **>(&temp);
+ } break;
+ case RenderPluginPropertyValueTypes::Float: {
+ retval.m_PropertyType = QT3DSRenderPluginPropertyTypeFloat;
+ float temp = m_Value.getData<QT3DSF32>();
+ retval.m_PropertyValue = *reinterpret_cast<void **>(&temp);
+ } break;
+ case RenderPluginPropertyValueTypes::Boolean: {
+ retval.m_PropertyType = QT3DSRenderPluginPropertyTypeLong;
+ long temp = m_Value.getData<bool>() ? TTRUE : TFALSE;
+ retval.m_PropertyValue = *reinterpret_cast<void **>(&temp);
+ } break;
+ case RenderPluginPropertyValueTypes::String: {
+ retval.m_PropertyType = QT3DSRenderPluginPropertyTypeCharPtr;
+ const char *temp = m_Value.getData<CRegisteredString>().c_str();
+ retval.m_PropertyValue = reinterpret_cast<void *>(const_cast<char *>(temp));
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ }
+ return retval;
+ }
+};
+
+typedef nvvector<SRenderPluginPropertyData> TPropertyValueList;
+
+struct IInternalPluginClass : public IRenderPluginClass
+{
+ virtual void PushUpdates(TRenderPluginInstancePtr instance,
+ TPropertyValueList &propertyValues) = 0;
+ virtual void Update(NVConstDataRef<SRenderPropertyValueUpdate> updateBuffer,
+ TPropertyValueList &propertyValues) = 0;
+ virtual QT3DSI32 GetAPIVersion() = 0;
+};
+
+static NVRenderTextureFormats::Enum ToTextureFormat(QT3DSRenderPluginTextureTypes inTextureType)
+{
+ switch (inTextureType) {
+ default:
+ case QT3DSRenderPluginTextureTypeRGBA8:
+ return NVRenderTextureFormats::RGBA8;
+ case QT3DSRenderPluginTextureTypeRGB8:
+ return NVRenderTextureFormats::RGB8;
+ case QT3DSRenderPluginTextureTypeRGB565:
+ return NVRenderTextureFormats::RGB565;
+ case QT3DSRenderPluginTextureTypeRGBA5551:
+ return NVRenderTextureFormats::RGBA5551;
+ }
+}
+
+static OffscreenRendererDepthValues::Enum ToDepthValue(QT3DSRenderPluginDepthTypes inType)
+{
+ switch (inType) {
+ default:
+ case QT3DSRenderPluginDepthTypeDepth16:
+ return OffscreenRendererDepthValues::Depth16;
+ case QT3DSRenderPluginDepthTypeDepth24:
+ return OffscreenRendererDepthValues::Depth24;
+ case QT3DSRenderPluginDepthTypeDepth32:
+ return OffscreenRendererDepthValues::Depth32;
+ }
+}
+
+static AAModeValues::Enum ToAAMode(QT3DSRenderPluginMSAALevel inMode)
+{
+ switch (inMode) {
+ case QT3DSRenderPluginMSAALevelTwo:
+ return AAModeValues::X2;
+ case QT3DSRenderPluginMSAALevelFour:
+ return AAModeValues::X4;
+ case QT3DSRenderPluginMSAALevelEight:
+ return AAModeValues::X8;
+ default:
+ QT3DS_ASSERT(false); // fallthrough intentional
+ case QT3DSRenderPluginMSAALevelNoMSAA:
+ return AAModeValues::NoAA;
+ }
+}
+
+struct InstanceImpl : public IRenderPluginInstance
+{
+ NVFoundationBase &m_Foundation;
+ TRenderPluginInstancePtr m_Instance;
+ TRenderPluginClass m_Class;
+ NVScopedRefCounted<IInternalPluginClass> m_Owner;
+ CRegisteredString m_RendererType;
+ // Backing store of property values
+ nvvector<SRenderPluginPropertyData> m_PropertyValues;
+ bool m_Dirty;
+ NVRenderContext *m_RenderContext;
+ QT3DSI32 mRefCount;
+
+ InstanceImpl(NVFoundationBase &fnd, TRenderPluginInstancePtr instance, TRenderPluginClass cls,
+ IInternalPluginClass &owner, IStringTable &strTable)
+ : m_Foundation(fnd)
+ , m_Instance(instance)
+ , m_Class(cls)
+ , m_Owner(owner)
+ , m_RendererType(
+ strTable.RegisterStr(IRenderPluginInstance::IRenderPluginOffscreenRendererType()))
+ , m_PropertyValues(m_Foundation.getAllocator(), "InstanceImpl::m_PropertyValues")
+ , m_Dirty(false)
+ , m_RenderContext(NULL)
+ , mRefCount(0)
+ {
+ }
+
+ virtual ~InstanceImpl() { m_Class.ReleaseInstance(m_Class.m_Class, m_Instance); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ void addCallback(IOffscreenRendererCallback *cb) override
+ {
+
+ }
+ void CreateScriptProxy(script_State *state) override
+ {
+ if (m_Class.CreateInstanceScriptProxy)
+ m_Class.CreateInstanceScriptProxy(m_Class.m_Class, m_Instance, state);
+ }
+
+ // Arbitrary const char* returned to indicate the type of this renderer
+ // Can be overloaded to form the basis of an RTTI type system.
+ // Not currently used by the rendering system.
+ CRegisteredString GetOffscreenRendererType() override { return m_RendererType; }
+
+ SOffscreenRendererEnvironment GetDesiredEnvironment(QT3DSVec2 inPresentationScaleFactor) override
+ {
+ if (m_Class.QueryInstanceRenderSurface) {
+ QT3DSRenderPluginMSAALevel theLevel = QT3DSRenderPluginMSAALevelNoMSAA;
+ TRenderPluginSurfaceDescription desc = m_Class.QueryInstanceRenderSurface(
+ m_Class.m_Class, m_Instance, ToCInterface(inPresentationScaleFactor));
+ if (m_Owner->GetAPIVersion() > 1)
+ theLevel = desc.m_MSAALevel;
+
+ return SOffscreenRendererEnvironment(
+ (QT3DSU32)desc.m_Width, (QT3DSU32)desc.m_Height, ToTextureFormat(desc.m_ColorBuffer),
+ ToDepthValue(desc.m_DepthBuffer), desc.m_HasStencilBuffer ? true : false,
+ ToAAMode(theLevel));
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return SOffscreenRendererEnvironment();
+ }
+
+ // Returns true of this object needs to be rendered, false if this object is not dirty
+ SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment,
+ QT3DSVec2 inPresentationScaleFactor,
+ const SRenderInstanceId instanceId) override
+ {
+ if (m_Dirty) {
+ m_Dirty = false;
+ m_Owner->PushUpdates(m_Instance, m_PropertyValues);
+ }
+ if (m_Class.NeedsRenderFunction) {
+ if (m_Owner->GetAPIVersion() > 1) {
+ TNeedsRenderResult result = m_Class.NeedsRenderFunction(
+ m_Class.m_Class, m_Instance, ToCInterface(inEnvironment),
+ ToCInterface(inPresentationScaleFactor));
+ return SOffscreenRenderFlags(result.HasTransparency ? true : false,
+ result.HasChangedSinceLastFrame ? true : false);
+ } else {
+ TNeedsRenderFunctionV1 theV1Function =
+ reinterpret_cast<TNeedsRenderFunctionV1>(m_Class.NeedsRenderFunction);
+
+ TNeedsRenderResult result =
+ theV1Function(m_Class.m_Class, m_Instance, ToCInterfaceV1(inEnvironment),
+ ToCInterface(inPresentationScaleFactor));
+ return SOffscreenRenderFlags(result.HasTransparency ? true : false,
+ result.HasChangedSinceLastFrame ? true : false);
+ }
+ }
+ return SOffscreenRenderFlags(true, true);
+ }
+ // Returns true if the rendered result image has transparency, or false
+ // if it should be treated as a completely opaque image.
+ // It is the IOffscreenRenderer's job to clear any buffers (color, depth, stencil) that it
+ // needs to. It should not assume that it's buffers are clear;
+ // Sometimes we scale the width and height of the main presentation in order to fit a window.
+ // If we do so, the scale factor tells the subpresentation renderer how much the system has
+ // scaled.
+ void Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ const SRenderInstanceId instanceId) override
+ {
+ m_RenderContext = &inRenderContext;
+ if (m_Class.RenderInstance) {
+ inRenderContext.PushPropertySet();
+ if (m_Owner->GetAPIVersion() > 1) {
+ m_Class.RenderInstance(m_Class.m_Class, m_Instance, ToCInterface(inEnvironment),
+ ToCInterface(inPresentationScaleFactor),
+ ToCInterface(inColorBufferNeedsClear));
+ } else {
+ TRenderFunctionV1 theV1Function =
+ reinterpret_cast<TRenderFunctionV1>(m_Class.RenderInstance);
+ theV1Function(m_Class.m_Class, m_Instance, ToCInterfaceV1(inEnvironment),
+ ToCInterface(inPresentationScaleFactor),
+ ToCInterface(inColorBufferNeedsClear));
+ }
+
+ inRenderContext.PopPropertySet(true);
+ }
+ }
+
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec4 inClearColor,
+ const SRenderInstanceId id)
+ {
+ Q_ASSERT(false);
+ }
+
+ // Implementors should implement one of the two interfaces below.
+
+ // If this renderer supports picking that can return graph objects
+ // then return an interface here.
+ IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId) override { return NULL; }
+
+ // If you *don't* support the GraphObjectPickIterator interface, then you should implement this
+ // interface
+ // The system will just ask you to pick.
+ // If you return true, then we will assume that you swallowed the pick and will continue no
+ // further.
+ // else we will assume you did not and will continue the picking algorithm.
+ bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions,
+ const SRenderInstanceId instanceId) override
+ {
+ if (m_Class.Pick) {
+ if (m_RenderContext) {
+ m_RenderContext->PushPropertySet();
+ bool retval = m_Class.Pick(m_Class.m_Class, m_Instance, ToCInterface(inMouseCoords),
+ ToCInterface(inViewportDimensions))
+ ? true
+ : false;
+ m_RenderContext->PopPropertySet(true);
+ return retval;
+ }
+ }
+ return false;
+ }
+
+ TRenderPluginInstancePtr GetRenderPluginInstance() override { return m_Instance; }
+ void Update(NVConstDataRef<SRenderPropertyValueUpdate> updateBuffer) override
+ {
+ m_Dirty = true;
+ m_Owner->Update(updateBuffer, m_PropertyValues);
+ }
+ IRenderPluginClass &GetPluginClass() override { return *m_Owner; }
+};
+
+typedef eastl::pair<CRegisteredString, RenderPluginPropertyValueTypes::Enum> TStringTypePair;
+
+struct PluginClassImpl : public IInternalPluginClass
+{
+ typedef nvhash_map<CRegisteredString, QT3DSU32> TStringIndexMap;
+ NVFoundationBase &m_Foundation;
+ IStringTable &m_StringTable;
+ TRenderPluginClass m_Class;
+ CRegisteredString m_Type;
+ CLoadedDynamicLibrary *m_DynamicLibrary;
+ nvvector<SRenderPluginPropertyDeclaration> m_RegisteredProperties;
+ TStringIndexMap m_ComponentNameToComponentIndexMap;
+ nvvector<TStringTypePair> m_FullPropertyList;
+ nvvector<TRenderPluginPropertyUpdate> m_UpdateBuffer;
+ Qt3DSString m_TempString;
+ QT3DSI32 m_APIVersion;
+
+ QT3DSI32 mRefCount;
+
+ PluginClassImpl(NVFoundationBase &fnd, IStringTable &strTable, TRenderPluginClass inClass,
+ CRegisteredString inType, CLoadedDynamicLibrary *inLibrary)
+ : m_Foundation(fnd)
+ , m_StringTable(strTable)
+ , m_Class(inClass)
+ , m_Type(inType)
+ , m_DynamicLibrary(inLibrary)
+ , m_RegisteredProperties(m_Foundation.getAllocator(),
+ "PluginClassImpl::m_RegisteredProperties")
+ , m_ComponentNameToComponentIndexMap(m_Foundation.getAllocator(),
+ "PluginClassImpl::m_ComponentNameToComponentIndexMap")
+ , m_FullPropertyList(m_Foundation.getAllocator(), "PluginClassImpl::m_FullPropertyList")
+ , m_UpdateBuffer(m_Foundation.getAllocator(), "PluginClassImpl::m_UpdateBuffer")
+ , m_APIVersion(m_Class.GetRenderPluginAPIVersion(m_Class.m_Class))
+ , mRefCount(0)
+ {
+ }
+ ~PluginClassImpl()
+ {
+ if (m_Class.ReleaseClass)
+ m_Class.ReleaseClass(m_Class.m_Class);
+ if (m_DynamicLibrary)
+ NVDelete(m_Foundation.getAllocator(), m_DynamicLibrary);
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ NVScopedRefCounted<IRenderPluginInstance> CreateInstance() override
+ {
+ if (m_Class.CreateInstance) {
+ TRenderPluginInstancePtr instance =
+ m_Class.CreateInstance(m_Class.m_Class, m_Type.c_str());
+ if (instance) {
+ InstanceImpl *retval = QT3DS_NEW(m_Foundation.getAllocator(), InstanceImpl)(
+ m_Foundation, instance, m_Class, *this, m_StringTable);
+ return retval;
+ }
+ }
+ return NVScopedRefCounted<IRenderPluginInstance>();
+ }
+
+ QT3DSI32 GetAPIVersion() override { return m_APIVersion; }
+
+ void AddFullPropertyType(const char *name, RenderPluginPropertyValueTypes::Enum inType)
+ {
+ QT3DSU32 itemIndex = (QT3DSU32)m_FullPropertyList.size();
+ CRegisteredString regName = m_StringTable.RegisterStr(name);
+ bool inserted =
+ m_ComponentNameToComponentIndexMap.insert(eastl::make_pair(regName, itemIndex)).second;
+ if (inserted) {
+ m_FullPropertyList.push_back(eastl::make_pair(regName, inType));
+ } else {
+ // Duplicate property declaration.
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void AddFullPropertyType(const char *name, const char *extension,
+ RenderPluginPropertyValueTypes::Enum inType)
+ {
+ m_TempString.assign(name);
+ if (!isTrivial(extension)) {
+ m_TempString.append(".");
+ m_TempString.append(extension);
+ }
+ AddFullPropertyType(m_TempString.c_str(), inType);
+ }
+
+ void RegisterProperty(const SRenderPluginPropertyDeclaration &dec) override
+ {
+ QT3DSU32 startOffset = (QT3DSU32)m_FullPropertyList.size();
+
+ switch (dec.m_Type) {
+
+ case SRenderPluginPropertyTypes::Vector2:
+ AddFullPropertyType(dec.m_Name, "x", RenderPluginPropertyValueTypes::Float);
+ AddFullPropertyType(dec.m_Name, "y", RenderPluginPropertyValueTypes::Float);
+ break;
+ case SRenderPluginPropertyTypes::Color:
+ AddFullPropertyType(dec.m_Name, "r", RenderPluginPropertyValueTypes::Float);
+ AddFullPropertyType(dec.m_Name, "g", RenderPluginPropertyValueTypes::Float);
+ AddFullPropertyType(dec.m_Name, "b", RenderPluginPropertyValueTypes::Float);
+ break;
+ case SRenderPluginPropertyTypes::Vector3:
+ AddFullPropertyType(dec.m_Name, "x", RenderPluginPropertyValueTypes::Float);
+ AddFullPropertyType(dec.m_Name, "y", RenderPluginPropertyValueTypes::Float);
+ AddFullPropertyType(dec.m_Name, "z", RenderPluginPropertyValueTypes::Float);
+ break;
+ case SRenderPluginPropertyTypes::Boolean:
+ AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::Boolean);
+ break;
+ case SRenderPluginPropertyTypes::Float:
+ AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::Float);
+ break;
+ case SRenderPluginPropertyTypes::Long:
+ AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::Long);
+ break;
+ case SRenderPluginPropertyTypes::String:
+ AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::String);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ m_RegisteredProperties.push_back(dec);
+ m_RegisteredProperties.back().m_StartOffset = startOffset;
+ }
+
+ NVConstDataRef<SRenderPluginPropertyDeclaration> GetRegisteredProperties() override
+ {
+ return m_RegisteredProperties;
+ }
+
+ SRenderPluginPropertyDeclaration GetPropertyDeclaration(CRegisteredString inPropName) override
+ {
+ for (QT3DSU32 idx = 0, end = m_RegisteredProperties.size(); idx < end; ++idx) {
+ if (m_RegisteredProperties[idx].m_Name == inPropName)
+ return m_RegisteredProperties[idx];
+ }
+ QT3DS_ASSERT(false);
+ return SRenderPluginPropertyDeclaration();
+ }
+
+ // From which you can get the property name breakdown
+ virtual eastl::pair<CRegisteredString, RenderPluginPropertyValueTypes::Enum>
+ GetPropertyValueInfo(QT3DSU32 inIndex) override
+ {
+ if (inIndex < m_FullPropertyList.size())
+ return m_FullPropertyList[inIndex];
+ QT3DS_ASSERT(false);
+ return eastl::pair<CRegisteredString, RenderPluginPropertyValueTypes::Enum>(
+ CRegisteredString(), RenderPluginPropertyValueTypes::NoRenderPluginPropertyValue);
+ }
+
+ void PushUpdates(TRenderPluginInstancePtr instance, TPropertyValueList &propertyValues) override
+ {
+ m_UpdateBuffer.clear();
+ for (QT3DSU32 idx = 0, end = propertyValues.size(); idx < end; ++idx) {
+ SRenderPluginPropertyData &theData(propertyValues[idx]);
+ if (theData.IsDirty())
+ m_UpdateBuffer.push_back(theData.ClearDirty(m_FullPropertyList[idx].first));
+ }
+ if (m_Class.UpdateInstance)
+ m_Class.UpdateInstance(m_Class.m_Class, instance, m_UpdateBuffer.data(),
+ (long)m_UpdateBuffer.size());
+ }
+
+ void Update(NVConstDataRef<SRenderPropertyValueUpdate> updateBuffer,
+ TPropertyValueList &propertyValues) override
+ {
+ for (QT3DSU32 idx = 0, end = updateBuffer.size(); idx < end; ++idx) {
+ const SRenderPropertyValueUpdate &update = updateBuffer[idx];
+ TStringIndexMap::iterator iter =
+ m_ComponentNameToComponentIndexMap.find(update.m_PropertyName);
+ if (iter == m_ComponentNameToComponentIndexMap.end()) {
+ QT3DS_ASSERT(false);
+ continue;
+ }
+
+ QT3DSU32 propIndex = iter->second;
+ if (update.m_Value.getType() != m_FullPropertyList[propIndex].second) {
+ QT3DS_ASSERT(false);
+ continue;
+ }
+ if (propIndex >= propertyValues.size())
+ propertyValues.resize(propIndex + 1);
+ propertyValues[propIndex].SetValue(update.m_Value);
+ }
+ }
+};
+
+struct PluginInstanceKey
+{
+ CRegisteredString m_Path;
+ void *m_InstanceKey;
+ PluginInstanceKey(CRegisteredString p, void *ik)
+ : m_Path(p)
+ , m_InstanceKey(ik)
+ {
+ }
+ bool operator==(const PluginInstanceKey &rhs) const
+ {
+ return m_Path == rhs.m_Path && m_InstanceKey == rhs.m_InstanceKey;
+ }
+};
+}
+
+namespace eastl {
+template <>
+struct hash<PluginInstanceKey>
+{
+ size_t operator()(const PluginInstanceKey &k) const
+ {
+ return hash<CRegisteredString>()(k.m_Path)
+ ^ hash<size_t>()(reinterpret_cast<size_t>(k.m_InstanceKey));
+ }
+ bool operator()(const PluginInstanceKey &lhs, const PluginInstanceKey &rhs) const
+ {
+ return lhs.m_Path == rhs.m_Path && lhs.m_InstanceKey == rhs.m_InstanceKey;
+ }
+};
+}
+
+namespace {
+
+struct SLoadedPluginData
+{
+ CRegisteredString m_PluginPath;
+ eastl::vector<SRenderPluginPropertyDeclaration> m_Properties;
+};
+
+typedef eastl::vector<SLoadedPluginData> TLoadedPluginDataList;
+
+struct PluginManagerImpl : public IRenderPluginManager, public IRenderPluginManagerCore
+{
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<IRenderPluginClass>> TLoadedClassMap;
+ typedef nvhash_map<PluginInstanceKey, NVScopedRefCounted<IRenderPluginInstance>> TInstanceMap;
+ NVFoundationBase &m_Foundation;
+ IStringTable &m_StringTable;
+ TLoadedClassMap m_LoadedClasses;
+ TInstanceMap m_Instances;
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+ IInputStreamFactory &m_InputStreamFactory;
+ QT3DSI32 mRefCount;
+ TStr m_DllDir;
+ TLoadedPluginDataList m_LoadedPluginData;
+
+ PluginManagerImpl(NVFoundationBase &fnd, IStringTable &st, IInputStreamFactory &inFactory)
+ : m_Foundation(fnd)
+ , m_StringTable(st)
+ , m_LoadedClasses(fnd.getAllocator(), "PluginManagerImpl::m_LoadedClasses")
+ , m_Instances(fnd.getAllocator(), "PluginManagerImpl::m_Instances")
+ , m_InputStreamFactory(inFactory)
+ , mRefCount(0)
+ , m_DllDir(ForwardingAllocator(fnd.getAllocator(), "PluginManagerImpl::m_DllDir"))
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ IRenderPluginClass *GetRenderPlugin(CRegisteredString inRelativePath) override
+ {
+ TLoadedClassMap::iterator iter = m_LoadedClasses.find(inRelativePath);
+ if (iter != m_LoadedClasses.end())
+ return iter->second;
+
+ return NVScopedRefCounted<IRenderPluginClass>();
+ }
+
+ IRenderPluginClass *GetOrCreateRenderPlugin(CRegisteredString inRelativePath) override
+ {
+ TLoadedClassMap::iterator iter = m_LoadedClasses.find(inRelativePath);
+ if (iter != m_LoadedClasses.end()) {
+ return iter->second;
+ }
+
+ // We insert right here to keep us from going down this path potentially for every instance.
+ iter =
+ m_LoadedClasses
+ .insert(eastl::make_pair(inRelativePath, NVScopedRefCounted<IRenderPluginClass>()))
+ .first;
+ eastl::string xmlDir, fname, extension;
+
+ CFileTools::Split(inRelativePath.c_str(), xmlDir, fname, extension);
+
+ eastl::string sharedLibrary(xmlDir);
+ eastl::string subdir(qt3ds::foundation::System::getPlatformGLStr());
+ eastl::string libdir;
+ eastl::string libpath;
+
+ CFileTools::CombineBaseAndRelative(xmlDir.c_str(), subdir.c_str(), libdir);
+ CFileTools::CombineBaseAndRelative(libdir.c_str(), fname.c_str(), libpath);
+#ifdef _DEBUG
+ libpath.append("d");
+#endif
+ libpath.append(qt3ds::foundation::System::g_DLLExtension);
+ eastl::string loadPath;
+ if (m_DllDir.size()) {
+ // Then we have to copy the dll to the dll directory before loading because the
+ // filesystem
+ // the plugin is on may not be executable.
+ eastl::string targetFile;
+ CFileTools::CombineBaseAndRelative(m_DllDir.c_str(), fname.c_str(), targetFile);
+#ifdef _DEBUG
+ targetFile.append("d");
+#endif
+ targetFile.append(qt3ds::foundation::System::g_DLLExtension);
+
+ qCInfo(TRACE_INFO, "Copying plugin shared library from %s to %s",
+ libpath.c_str(), targetFile.c_str());
+
+ // try to open the library.
+ NVScopedRefCounted<IRefCountedInputStream> theStream =
+ m_InputStreamFactory.GetStreamForFile(libpath.c_str());
+ if (!theStream) {
+ qCCritical(INVALID_OPERATION, "Failed to load render plugin %s",
+ libpath.c_str());
+ return NULL;
+ }
+ CFileSeekableIOStream outStream(targetFile.c_str(), FileWriteFlags());
+ if (!outStream.IsOpen()) {
+ qCCritical(INVALID_OPERATION, "Failed to load render plugin %s",
+ targetFile.c_str());
+ return NULL;
+ }
+
+ QT3DSU8 buf[1024] = { 0 };
+ for (QT3DSU32 len = theStream->Read(toDataRef(buf, 1024)); len;
+ len = theStream->Read(toDataRef(buf, 1024))) {
+ outStream.Write(toDataRef(buf, len));
+ }
+ loadPath = targetFile;
+ } else {
+ QString path;
+ m_InputStreamFactory.GetPathForFile(libpath.c_str(), path);
+ loadPath = path.toUtf8().data();
+ }
+ CLoadedDynamicLibrary *library = NULL;
+ TRenderPluginClass newPluginClass;
+ memSet(&newPluginClass, 0, sizeof(newPluginClass));
+
+ // Do not load plugin dlls during compilation steps or when we don't have a valid render
+ // context.
+ // They may try opengl access at some point and that would end in disaster during binary
+ // save steps.
+ if ((QT3DSU32)m_RenderContext->GetRenderContextType() != NVRenderContextValues::NullContext) {
+ library = CLoadedDynamicLibrary::Create(loadPath.c_str(), m_Foundation);
+ if (!library) {
+ // try loading it from the system instead of from this specific path. This means do
+ // not use any extensions or any special
+ // sauce.
+ loadPath = fname;
+#ifdef _DEBUG
+ loadPath.append("d");
+#endif
+ library = CLoadedDynamicLibrary::Create(loadPath.c_str(), m_Foundation);
+ }
+ }
+
+ if (library) {
+ TCreateRenderPluginClassFunction CreateClass =
+ reinterpret_cast<TCreateRenderPluginClassFunction>(
+ library->FindFunction("CreateRenderPlugin"));
+ if (CreateClass) {
+ newPluginClass = CreateClass(fname.c_str());
+ if (newPluginClass.m_Class) {
+ // Check that the required functions are there.
+ if (newPluginClass.CreateInstance == NULL
+ || newPluginClass.QueryInstanceRenderSurface == NULL
+ || newPluginClass.RenderInstance == NULL
+ || newPluginClass.ReleaseInstance == NULL
+ || newPluginClass.ReleaseClass == NULL) {
+ if (newPluginClass.ReleaseClass)
+ newPluginClass.ReleaseClass(newPluginClass.m_Class);
+ qCCritical(INVALID_OPERATION,
+ "Failed to load render plugin: %s, required functions "
+ "missing. Required functions are:"
+ "CreateInstance, QueryInstanceRenderSurface, "
+ "RenderInstance, ReleaseInstance, ReleaseClass",
+ inRelativePath.c_str());
+ NVDelete(m_Foundation.getAllocator(), library);
+ memSet(&newPluginClass, 0, sizeof(newPluginClass));
+ }
+ }
+ }
+ }
+ if (newPluginClass.m_Class) {
+ PluginClassImpl *retval = QT3DS_NEW(m_Foundation.getAllocator(), PluginClassImpl)(
+ m_Foundation, m_StringTable, newPluginClass,
+ m_StringTable.RegisterStr(fname.c_str()), library);
+
+ iter->second = retval;
+ if (newPluginClass.InitializeClassGLResources) {
+ m_RenderContext->PushPropertySet();
+ newPluginClass.InitializeClassGLResources(newPluginClass.m_Class, loadPath.c_str());
+ m_RenderContext->PopPropertySet(true);
+ }
+ return iter->second;
+ }
+ return NULL;
+ }
+
+ void SetDllDir(const char *inDllDir) override { m_DllDir.assign(nonNull(inDllDir)); }
+
+ IRenderPluginInstance *GetOrCreateRenderPluginInstance(CRegisteredString inRelativePath,
+ void *inKey) override
+ {
+ PluginInstanceKey theKey(inRelativePath, inKey);
+ TInstanceMap::iterator iter = m_Instances.find(theKey);
+ if (iter == m_Instances.end()) {
+ IRenderPluginClass *theClass = GetOrCreateRenderPlugin(inRelativePath);
+ NVScopedRefCounted<IRenderPluginInstance> theInstance;
+ if (theClass)
+ theInstance = theClass->CreateInstance();
+
+ iter = m_Instances.insert(eastl::make_pair(theKey, theInstance)).first;
+ }
+ return iter->second.mPtr;
+ }
+
+ void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap,
+ const char8_t * /*inProjectDir*/) const override
+ {
+ QT3DSU32 numClasses = m_LoadedClasses.size();
+ ioBuffer.write(numClasses);
+ for (TLoadedClassMap::const_iterator iter = m_LoadedClasses.begin(),
+ end = m_LoadedClasses.end();
+ iter != end; ++iter) {
+ CRegisteredString saveStr = iter->first;
+ saveStr.Remap(inRemapMap);
+ ioBuffer.write(saveStr);
+ if (iter->second) {
+ NVConstDataRef<SRenderPluginPropertyDeclaration> theProperties =
+ const_cast<IRenderPluginClass &>((*iter->second)).GetRegisteredProperties();
+ ioBuffer.write(theProperties.size());
+ for (QT3DSU32 idx = 0, end = theProperties.size(); idx < end; ++idx) {
+ SRenderPluginPropertyDeclaration theDec(theProperties[idx]);
+ theDec.m_Name.Remap(inRemapMap);
+ ioBuffer.write(theDec);
+ }
+ } else
+ ioBuffer.write((QT3DSU32)0);
+ }
+ }
+
+ void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t * /*inProjectDir*/) override
+ {
+ qt3ds::render::SDataReader theReader(inData.begin(), inData.end());
+ QT3DSU32 numClasses = theReader.LoadRef<QT3DSU32>();
+ ForwardingAllocator alloc(m_Foundation.getAllocator(), "tempstrings");
+ qt3ds::foundation::TStr workStr(alloc);
+ nvvector<SRenderPluginPropertyDeclaration> propertyBuffer(m_Foundation.getAllocator(),
+ "tempprops");
+ for (QT3DSU32 classIdx = 0; classIdx < numClasses; ++classIdx) {
+ CRegisteredString classPath = theReader.LoadRef<CRegisteredString>();
+ classPath.Remap(inStrDataBlock);
+ QT3DSU32 numProperties = theReader.LoadRef<QT3DSU32>();
+ propertyBuffer.clear();
+ for (QT3DSU32 propIdx = 0; propIdx < numProperties; ++propIdx) {
+ propertyBuffer.push_back(theReader.LoadRef<SRenderPluginPropertyDeclaration>());
+ propertyBuffer.back().m_Name.Remap(inStrDataBlock);
+ }
+ m_LoadedPluginData.push_back(SLoadedPluginData());
+ m_LoadedPluginData.back().m_PluginPath = classPath;
+ m_LoadedPluginData.back().m_Properties.assign(propertyBuffer.begin(),
+ propertyBuffer.end());
+ }
+ }
+ IRenderPluginManager &GetRenderPluginManager(NVRenderContext &rc) override
+ {
+ m_RenderContext = rc;
+ for (QT3DSU32 idx = 0, end = m_LoadedPluginData.size(); idx < end; ++idx) {
+ // Now we can attempt to load the class.
+ IRenderPluginClass *theClass =
+ GetOrCreateRenderPlugin(m_LoadedPluginData[idx].m_PluginPath);
+ if (theClass) {
+ eastl::vector<SRenderPluginPropertyDeclaration> &propertyBuffer(
+ m_LoadedPluginData[idx].m_Properties);
+ for (QT3DSU32 propIdx = 0, propEnd = propertyBuffer.size(); propIdx < propEnd;
+ ++propIdx) {
+ theClass->RegisterProperty(propertyBuffer[propIdx]);
+ }
+ }
+ }
+ m_LoadedPluginData.clear();
+ return *this;
+ }
+};
+}
+
+IRenderPluginManagerCore &IRenderPluginManagerCore::Create(NVFoundationBase &inFoundation,
+ IStringTable &strTable,
+ IInputStreamFactory &inFactory)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), PluginManagerImpl)(inFoundation, strTable,
+ inFactory);
+}
diff --git a/src/runtimerender/Qt3DSRenderPlugin.h b/src/runtimerender/Qt3DSRenderPlugin.h
new file mode 100644
index 0000000..eb71f84
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPlugin.h
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PLUGIN_H
+#define QT3DS_RENDER_PLUGIN_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderPluginCInterface.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "EASTL/utility.h"
+
+namespace qt3ds {
+namespace render {
+
+ // UICRenderPluginPropertyValue.h
+ struct SRenderPropertyValueUpdate;
+
+ class IRenderPluginInstance : public IOffscreenRenderer
+ {
+ protected:
+ virtual ~IRenderPluginInstance() {}
+ public:
+ static const char *IRenderPluginOffscreenRendererType() { return "IRenderPluginInstance"; }
+ // If this render plugin has an instance ptr, get it.
+ virtual TRenderPluginInstancePtr GetRenderPluginInstance() = 0;
+ virtual void Update(NVConstDataRef<SRenderPropertyValueUpdate> updateBuffer) = 0;
+ virtual IRenderPluginClass &GetPluginClass() = 0;
+ virtual void CreateScriptProxy(script_State *state) = 0;
+ };
+ struct RenderPluginPropertyValueTypes
+ {
+ enum Enum {
+ NoRenderPluginPropertyValue = 0,
+ Boolean,
+ Long,
+ Float,
+ String,
+ };
+ };
+
+ struct SRenderPluginPropertyTypes
+ {
+ enum Enum {
+ UnknownRenderPluginPropertyType = 0,
+ Float,
+ Vector3,
+ Vector2,
+ Color,
+ Boolean,
+ Long,
+ String,
+ };
+ };
+
+ struct SRenderPluginPropertyDeclaration
+ {
+ CRegisteredString m_Name;
+ SRenderPluginPropertyTypes::Enum m_Type;
+ // Filled in by the class, ignored if set on registered property
+ QT3DSU32 m_StartOffset;
+ SRenderPluginPropertyDeclaration()
+ : m_Type(SRenderPluginPropertyTypes::UnknownRenderPluginPropertyType)
+ {
+ }
+ SRenderPluginPropertyDeclaration(CRegisteredString n, SRenderPluginPropertyTypes::Enum t)
+ : m_Name(n)
+ , m_Type(t)
+ , m_StartOffset(0)
+ {
+ }
+ };
+
+ class IRenderPluginClass : public NVRefCounted
+ {
+ protected:
+ virtual ~IRenderPluginClass() {}
+ public:
+ virtual NVScopedRefCounted<IRenderPluginInstance> CreateInstance() = 0;
+ virtual void RegisterProperty(const SRenderPluginPropertyDeclaration &dec) = 0;
+ virtual NVConstDataRef<SRenderPluginPropertyDeclaration> GetRegisteredProperties() = 0;
+ // The declaration contains an offset
+ virtual SRenderPluginPropertyDeclaration
+ GetPropertyDeclaration(CRegisteredString inPropName) = 0;
+ // From which you can get the property name breakdown
+ virtual eastl::pair<CRegisteredString, RenderPluginPropertyValueTypes::Enum>
+ GetPropertyValueInfo(QT3DSU32 inIndex) = 0;
+ };
+
+ class IRenderPluginManager;
+
+ class IRenderPluginManagerCore : public NVRefCounted
+ {
+ public:
+ virtual void SetDllDir(const char *inDllDir) = 0;
+ virtual void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
+ const char8_t *inProjectDir) = 0;
+ virtual IRenderPluginManager &GetRenderPluginManager(NVRenderContext &rc) = 0;
+
+ static IRenderPluginManagerCore &Create(NVFoundationBase &inFoundation,
+ IStringTable &strTable,
+ IInputStreamFactory &inFactory);
+ };
+
+ class IRenderPluginManager : public NVRefCounted
+ {
+ public:
+ virtual IRenderPluginClass *GetRenderPlugin(CRegisteredString inRelativePath) = 0;
+ virtual IRenderPluginClass *GetOrCreateRenderPlugin(CRegisteredString inRelativePath) = 0;
+ // Map a render plugin instance to this key. The instance's lifetime is managed by the
+ // manager so a client does not
+ // need to manage it.
+ virtual IRenderPluginInstance *
+ GetOrCreateRenderPluginInstance(CRegisteredString inRelativePath, void *inKey) = 0;
+
+ virtual void Save(qt3ds::render::SWriteBuffer &ioBuffer,
+ const qt3ds::render::SStrRemapMap &inRemapMap,
+ const char8_t *inProjectDir) const = 0;
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderPluginCInterface.h b/src/runtimerender/Qt3DSRenderPluginCInterface.h
new file mode 100644
index 0000000..ec7481a
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPluginCInterface.h
@@ -0,0 +1,330 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_OBJECT_RENDER_PLUGIN_H
+#define QT3DS_OBJECT_RENDER_PLUGIN_H
+
+/*
+ * Below are the definitions required in order to write a render plugin for UIComposer.
+ * Please note that calling anything related to opengl is explicitly not allowed except
+ * during either the class gl resource initialization function or during render. Calling into
+ * openGL and especially changing GL state during any other function may produce corrupt
+ *rendering.
+ */
+
+#ifdef _cplusplus
+#extern "C" {
+#endif
+
+enum QT3DSRenderPluginPropertyTypes {
+ QT3DSRenderPluginPropertyTypeNone = 0,
+ QT3DSRenderPluginPropertyTypeLong = 1,
+ QT3DSRenderPluginPropertyTypeFloat = 2,
+ QT3DSRenderPluginPropertyTypeCharPtr = 3,
+};
+
+enum QT3DSRenderPluginDepthTypes {
+ QT3DSRenderPluginDepthTypeNoDepthBuffer = 0,
+ QT3DSRenderPluginDepthTypeDepth16, // 16 bit depth buffer
+ QT3DSRenderPluginDepthTypeDepth24, // 24 bit depth buffer
+ QT3DSRenderPluginDepthTypeDepth32, // 32 bit depth buffer
+};
+
+enum QT3DSRenderPluginTextureTypes {
+ QT3DSRenderPluginTextureTypeNoTexture = 0,
+ QT3DSRenderPluginTextureTypeRGBA8, // 32 bit format
+ QT3DSRenderPluginTextureTypeRGB8, // 24 bit format
+ QT3DSRenderPluginTextureTypeRGB565, // 16 bit format
+ QT3DSRenderPluginTextureTypeRGBA5551, // 16 bit format
+};
+
+enum QT3DSRenderPluginColorClearState {
+ QT3DSRenderPluginColorClearStateClearIsOptional = 0,
+ QT3DSRenderPluginColorClearStateDoNotClear,
+ QT3DSRenderPluginColorClearStateAlwaysClear,
+};
+
+enum QT3DSRenderPluginMSAALevel {
+ QT3DSRenderPluginMSAALevelNoMSAA = 0, // no MSAA, one also works.
+ QT3DSRenderPluginMSAALevelTwo = 2, // 2 samples
+ QT3DSRenderPluginMSAALevelFour = 4, // 4 samples
+ QT3DSRenderPluginMSAALevelEight = 8, // 8 samples
+};
+
+typedef long TBool;
+#define TTRUE 1
+#define TFALSE 0
+
+#define QT3DS_CURRENT_RENDER_PLUGIN_API_VERSION 2
+
+typedef void *TRenderPluginInstancePtr;
+typedef void *TRenderPluginClassPtr;
+
+// We will pass the componentized properties to the instance ptr.
+typedef struct _RenderPluginPropertyUpdate
+{
+ const char *m_PropName;
+ enum QT3DSRenderPluginPropertyTypes m_PropertyType;
+
+ // Is either a float or a long or a const char* depending on the property type.
+ // for specify types of properties, example code would be:
+ // float value = *((float*)&update.m_PropertyValue)
+ // long value = *((long*)&update.m_PropertyValue)
+ // char* value = (char*)update.m_PropertyValue
+ void *m_PropertyValue;
+} TRenderPluginPropertyUpdate;
+
+typedef struct _RenderPluginSurfaceDescription
+{
+ long m_Width;
+ long m_Height;
+ enum QT3DSRenderPluginDepthTypes m_DepthBuffer;
+ enum QT3DSRenderPluginTextureTypes m_ColorBuffer;
+ TBool m_HasStencilBuffer;
+ QT3DSRenderPluginMSAALevel m_MSAALevel;
+} TRenderPluginSurfaceDescription;
+
+typedef struct _TVec2
+{
+ float x;
+ float y;
+} TVec2;
+
+typedef struct _NeedsRenderResult
+{
+ TBool HasChangedSinceLastFrame;
+ TBool HasTransparency;
+} TNeedsRenderResult;
+
+struct script_State;
+
+/*
+ * Create a new instance object. Typename is the name of the plugin file, so for example
+ * gears.plugin generates 'gears' as a type name.
+ *
+ * Required API function.
+ *
+ */
+typedef TRenderPluginInstancePtr (*TCreateInstanceFunction)(TRenderPluginClassPtr cls,
+ const char *inTypeName);
+
+typedef void (*TCreateInstanceScriptProxy)(TRenderPluginClassPtr cls,
+ TRenderPluginInstancePtr insPtr,
+ struct script_State *state);
+
+/*
+ * Update the plugin instance with a list of property updates. Properties are broken down by
+ *component so for example
+ * a color property named leftColor will be broken down into 'leftColor.r', 'leftColor.g',
+ *'leftColor.b'. Vector
+ * properties are broken down into x,y,z components. The property string has a void* member
+ *that is the actual value
+ * or in a charPtr property's case it is the char*.
+ * Please see the comments for m_PropertyValue member of TRenderPluginPropertyUpdate struct.
+ *
+ * Optional API function.
+ */
+typedef void (*TUpdateInstanceFunction)(TRenderPluginClassPtr cls,
+ TRenderPluginInstancePtr instance,
+ TRenderPluginPropertyUpdate *updates, long numUpdates);
+
+/*
+ * Query used when the plugin is rendering to an image. Should return the desired
+ *specifications of the plugins
+ * render target.
+ * presScaleFactor - the presentation scale factor when the user has requested scale to fit to
+ *be used for the
+ * presentation.
+ *
+ * Required API function.
+ */
+typedef TRenderPluginSurfaceDescription (*TSurfaceQueryFunction)(TRenderPluginClassPtr cls,
+ TRenderPluginInstancePtr instance,
+ TVec2 presScaleFactor);
+
+/*
+ * Query used by the rendering system. Should return true if the plugin will render something
+ *different than it did
+ * the last time it rendered. This is used so that we can cache render results and also so that we
+ *can trigger the
+ * progressive AA algorithm in the case where nothing has changed.
+ *
+ * presScaleFactor - the presentation scale factor when the user has requested scale to fit to be
+ *used for the
+ * presentation.
+ *
+ * OpenGL state may be changed in this function.
+ *
+ * Optional API function, returns true by default.
+ */
+typedef TNeedsRenderResult (*TNeedsRenderFunction)(TRenderPluginClassPtr cls,
+ TRenderPluginInstancePtr instance,
+ TRenderPluginSurfaceDescription surface,
+ TVec2 presScaleFactor);
+
+/*
+ * Render plugin data.
+ * Do not assume the surface requested is the surface given; for some cases it will be but if
+ *the system has deemed it
+ * appropriate to render the plugin directly to the back buffer then the surface description
+ *presented could differ by
+ * quite a bit.
+ *
+ * presScaleFactor - is the presentation scale factor when the user has requested scale to fit
+ *to be used for the
+ * presentation.
+ * inClearColorBuffer - True if the plugin needs to clear the color buffer (when rendering to
+ *texture) else false
+ * (when rendering to back buffer).
+ *
+ * Function should return 'UICTRUE' the image produced by rendering contains transparency;
+ *either every pixel wasn't
+ * written to or it is desired for the plugin to blend with background objects. Else should
+ *return UICFALSE.
+ *
+ * Required API function.
+ */
+typedef void (*TRenderFunction)(TRenderPluginClassPtr cls, TRenderPluginInstancePtr instance,
+ TRenderPluginSurfaceDescription surface, TVec2 presScaleFactor,
+ QT3DSRenderPluginColorClearState inClearColorBuffer);
+
+/*
+ * Pick - handle a mouse pick into the plugin.
+ * Returns true if the pick was consumed, false otherwise.
+ *
+ * Option API function.
+ */
+typedef TBool (*TPickFunction)(TRenderPluginClassPtr cls, TRenderPluginInstancePtr instance,
+ TVec2 inMouse, TVec2 inViewport);
+
+/*
+ * Release a given instance of the plugin.
+ *
+ * Required API function.
+ */
+typedef void (*TReleaseInstanceFunction)(TRenderPluginClassPtr cls,
+ TRenderPluginInstancePtr instance);
+
+/*
+ * Get the plugin API version. This allows the runtime to account for API changes over time or
+ * refuse to load the plugin. Plugins should return QT3DS_CURRENT_RENDER_PLUGIN_API_VERSION
+ *
+ * Required API function.
+ */
+typedef long (*TGetAPIVersionFunction)(TRenderPluginClassPtr cls);
+
+/*
+ * Initialize the resources for the class. Implementing this allows UIComposer to move
+ * expensive initialization outside of the actual presentation run, thus allowing for
+ * a smoother experience during the presentation at the cost of longer startup times.
+ *
+ * - plugin path is the path to the .plugin xml file so that clients can find resources
+ * specific to their plugin relative to their .plugin file.
+ *
+ * OpenGL state may be changed in this function.
+ *
+ * Optional API function.
+ */
+typedef void (*TInitializeClassGLResourcesFunction)(TRenderPluginClassPtr cls,
+ const char *pluginPath);
+
+/*
+ * Release the class allocated with the create proc provided in the shared library.
+ *
+ * Required API function.
+ */
+typedef void (*TReleaseClassFunction)(TRenderPluginClassPtr cls);
+
+/*
+ * Structure returned form the create class function. Unimplemented functions should be left
+ *NULL.
+ */
+typedef struct _RenderPluginClass
+{
+ TRenderPluginClassPtr m_Class;
+
+ TGetAPIVersionFunction GetRenderPluginAPIVersion;
+ TInitializeClassGLResourcesFunction InitializeClassGLResources;
+ TReleaseClassFunction ReleaseClass;
+
+ TCreateInstanceFunction CreateInstance;
+ TCreateInstanceScriptProxy CreateInstanceScriptProxy;
+ TUpdateInstanceFunction UpdateInstance;
+ TSurfaceQueryFunction QueryInstanceRenderSurface;
+ TNeedsRenderFunction NeedsRenderFunction;
+ TRenderFunction RenderInstance;
+ TPickFunction Pick;
+ TReleaseInstanceFunction ReleaseInstance;
+
+} TRenderPluginClass;
+
+// We look for this function name in the shared library
+#define QT3DS_RENDER_PLUGIN_CREATE_CLASS_FUNCION_NAME "CreateRenderPlugin"
+
+/*
+ * Function signature we expect mapped to "CreateRenderPlugin". Example code:
+ *
+ extern "C" {
+
+#ifdef _WIN32
+#define PLUGIN_EXPORT_API __declspec(dllexport)
+#else
+#define PLUGIN_EXPORT_API
+#endif
+
+
+
+PLUGIN_EXPORT_API TRenderPluginClass CreateRenderPlugin( const char*)
+{
+ GearClass* classItem = (GearClass*)malloc( sizeof(GearClass) );
+ TRenderPluginClass retval;
+ memset( &retval, 0, sizeof( TRenderPluginClass ) );
+ retval.m_Class = classItem;
+ retval.GetRenderPluginAPIVersion = GetAPIVersion;
+ retval.CreateInstance = CreateInstance;
+ retval.CreateInstanceScriptProxy = CreateInstanceScriptProxy;
+ retval.UpdateInstance = UpdateInstance;
+ retval.QueryInstanceRenderSurface = QuerySurface;
+ retval.RenderInstance = Render;
+ retval.ReleaseInstance = ReleaseInstance;
+ retval.ReleaseClass = ReleaseClass;
+ return retval;
+}
+
+ * Required API function.
+ */
+
+typedef TRenderPluginClass (*TCreateRenderPluginClassFunction)(const char *inTypeName);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderPluginGraphObject.h b/src/runtimerender/Qt3DSRenderPluginGraphObject.h
new file mode 100644
index 0000000..c0ea66b
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPluginGraphObject.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PLUGIN_GRAPH_OBJECT_H
+#define QT3DS_RENDER_PLUGIN_GRAPH_OBJECT_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+namespace qt3ds {
+namespace render {
+
+ struct SRenderPlugin : public SGraphObject
+ {
+ CRegisteredString m_PluginPath;
+ NodeFlags m_Flags;
+
+ SRenderPlugin()
+ : SGraphObject(GraphObjectTypes::RenderPlugin)
+ {
+ }
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_PluginPath);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderPluginPropertyValue.h b/src/runtimerender/Qt3DSRenderPluginPropertyValue.h
new file mode 100644
index 0000000..a266e8d
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderPluginPropertyValue.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PLUGIN_PROPERTY_VALUE_H
+#define QT3DS_RENDER_PLUGIN_PROPERTY_VALUE_H
+#include "Qt3DSRender.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSDiscriminatedUnion.h"
+#include "Qt3DSRenderPlugin.h"
+
+namespace qt3ds {
+namespace foundation {
+
+ template <>
+ struct DestructTraits<CRegisteredString>
+ {
+ void destruct(CRegisteredString &) {}
+ };
+}
+}
+
+namespace qt3ds {
+namespace render {
+
+ template <typename TDatatype>
+ struct SRenderPluginPropertyValueTypeMap
+ {
+ };
+
+ template <>
+ struct SRenderPluginPropertyValueTypeMap<QT3DSI32>
+ {
+ enum { TypeMap = RenderPluginPropertyValueTypes::Long };
+ };
+ template <>
+ struct SRenderPluginPropertyValueTypeMap<QT3DSF32>
+ {
+ enum { TypeMap = RenderPluginPropertyValueTypes::Float };
+ };
+ template <>
+ struct SRenderPluginPropertyValueTypeMap<CRegisteredString>
+ {
+ enum { TypeMap = RenderPluginPropertyValueTypes::String };
+ };
+ template <>
+ struct SRenderPluginPropertyValueTypeMap<bool>
+ {
+ enum { TypeMap = RenderPluginPropertyValueTypes::Boolean };
+ };
+
+ struct SRenderPluginPropertyValueUnionTraits
+ {
+ typedef RenderPluginPropertyValueTypes::Enum TIdType;
+ enum {
+ TBufferSize = sizeof(CRegisteredString),
+ };
+
+ static TIdType getNoDataId()
+ {
+ return RenderPluginPropertyValueTypes::NoRenderPluginPropertyValue;
+ }
+
+ template <typename TDataType>
+ static TIdType getType()
+ {
+ return (TIdType)SRenderPluginPropertyValueTypeMap<TDataType>::TypeMap;
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case RenderPluginPropertyValueTypes::String:
+ return inVisitor(*NVUnionCast<CRegisteredString *>(inData));
+ case RenderPluginPropertyValueTypes::Float:
+ return inVisitor(*NVUnionCast<QT3DSF32 *>(inData));
+ case RenderPluginPropertyValueTypes::Long:
+ return inVisitor(*NVUnionCast<QT3DSI32 *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case RenderPluginPropertyValueTypes::NoRenderPluginPropertyValue:
+ return inVisitor();
+ }
+ }
+
+ template <typename TRetType, typename TVisitorType>
+ static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor)
+ {
+ switch (inType) {
+ case RenderPluginPropertyValueTypes::String:
+ return inVisitor(*NVUnionCast<const CRegisteredString *>(inData));
+ case RenderPluginPropertyValueTypes::Float:
+ return inVisitor(*NVUnionCast<const QT3DSF32 *>(inData));
+ case RenderPluginPropertyValueTypes::Long:
+ return inVisitor(*NVUnionCast<const QT3DSI32 *>(inData));
+ default:
+ QT3DS_ASSERT(false);
+ case RenderPluginPropertyValueTypes::NoRenderPluginPropertyValue:
+ return inVisitor();
+ }
+ }
+ };
+
+ typedef qt3ds::foundation::
+ DiscriminatedUnion<qt3ds::foundation::
+ DiscriminatedUnionGenericBase<SRenderPluginPropertyValueUnionTraits,
+ SRenderPluginPropertyValueUnionTraits::
+ TBufferSize>,
+ SRenderPluginPropertyValueUnionTraits::TBufferSize>
+ TRenderPluginPropertyValueUnionType;
+
+ struct SRenderPluginPropertyValue : public TRenderPluginPropertyValueUnionType
+ {
+ typedef TRenderPluginPropertyValueUnionType TBase;
+ SRenderPluginPropertyValue() {}
+ SRenderPluginPropertyValue(const CRegisteredString &str)
+ : TBase(str)
+ {
+ }
+ SRenderPluginPropertyValue(QT3DSI32 value)
+ : TBase(value)
+ {
+ }
+ SRenderPluginPropertyValue(QT3DSF32 value)
+ : TBase(value)
+ {
+ }
+ SRenderPluginPropertyValue(const SRenderPluginPropertyValue &other)
+ : TBase(static_cast<const TBase &>(other))
+ {
+ }
+ SRenderPluginPropertyValue &operator=(const SRenderPluginPropertyValue &other)
+ {
+ TBase::operator=(other);
+ return *this;
+ }
+ };
+
+ struct SRenderPropertyValueUpdate
+ {
+ // Should be the componentized name, so colors get .r .g .b appended
+ // and vectors get .x .y etc. This interface only updates a component at a time.
+ CRegisteredString m_PropertyName;
+ SRenderPluginPropertyValue m_Value;
+ SRenderPropertyValueUpdate() {}
+ SRenderPropertyValueUpdate(CRegisteredString str, const SRenderPluginPropertyValue &v)
+ : m_PropertyName(str)
+ , m_Value(v)
+ {
+ }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderProfiler.h b/src/runtimerender/Qt3DSRenderProfiler.h
new file mode 100644
index 0000000..a5941c0
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderProfiler.h
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PROFILER_H
+#define QT3DS_RENDER_PROFILER_H
+#include "Qt3DSRender.h"
+#include "EASTL/string.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSContainers.h"
+
+namespace qt3ds {
+namespace render {
+
+ /**
+ * Opaque profiling system for rendering.
+ */
+ class IRenderProfiler : public NVRefCounted
+ {
+ public:
+ typedef nvvector<CRegisteredString> TStrIDVec;
+
+ protected:
+ virtual ~IRenderProfiler() {}
+
+ public:
+ /**
+ * @brief start a timer query
+ *
+ * @param[in] nameID Timer ID for tracking
+ * @param[in] absoluteTime If true the absolute GPU is queried
+ * @param[in] sync Do a sync before starting the timer
+ *
+ * @return no return
+ */
+ virtual void StartTimer(CRegisteredString &nameID, bool absoluteTime, bool sync) = 0;
+
+ /**
+ * @brief stop a timer query
+ *
+ * @param[in] nameID Timer ID for tracking
+ *
+ * @return no return
+ */
+ virtual void EndTimer(CRegisteredString &nameID) = 0;
+
+ /**
+ * @brief Get elapsed timer value. Not this is an averaged time over several frames
+ *
+ * @param[in] nameID Timer ID for tracking
+ *
+ * @return no return
+ */
+ virtual QT3DSF64 GetElapsedTime(const CRegisteredString &nameID) const = 0;
+
+ /**
+ * @brief Get ID list of tracked timers
+ *
+ * @return ID list
+ */
+ virtual const TStrIDVec &GetTimerIDs() const = 0;
+
+ /**
+ * @brief add vertex count to current counter
+ *
+ * @return
+ */
+ virtual void AddVertexCount(QT3DSU32 count) = 0;
+
+ /**
+ * @brief get current vertex count and reset
+ *
+ * @return
+ */
+ virtual QT3DSU32 GetAndResetTriangleCount() const = 0;
+
+ static IRenderProfiler &CreateGpuProfiler(NVFoundationBase &inFoundation,
+ IQt3DSRenderContext &inContext,
+ NVRenderContext &inRenderContext);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderRay.cpp b/src/runtimerender/Qt3DSRenderRay.cpp
new file mode 100644
index 0000000..5376b8b
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderRay.cpp
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderRay.h"
+#include "foundation/Qt3DSPlane.h"
+
+using namespace qt3ds::render;
+
+// http://www.siggraph.org/education/materials/HyperGraph/raytrace/rayplane_intersection.htm
+
+Option<QT3DSVec3> SRay::Intersect(const NVPlane &inPlane) const
+{
+ QT3DSF32 Vd = inPlane.n.dot(m_Direction);
+ if (fabs(Vd) < .0001f)
+ return Empty();
+ QT3DSF32 V0 = -1.0f * (inPlane.n.dot(m_Origin) + inPlane.d);
+ QT3DSF32 t = V0 / Vd;
+ return m_Origin + (m_Direction * t);
+}
+
+Option<SRayIntersectionResult> SRay::IntersectWithAABB(const QT3DSMat44 &inGlobalTransform,
+ const NVBounds3 &inBounds,
+ bool inForceIntersect) const
+{
+ // Intersect the origin with the AABB described by bounds.
+
+ // Scan each axis separately. This code basically finds the distance
+ // distance from the origin to the near and far bbox planes for a given
+ // axis. It then divides this distance by the direction for that axis to
+ // get a range of t [near,far] that the ray intersects assuming the ray is
+ // described via origin + t*(direction). Running through all three axis means
+ // that you need to min/max those ranges together to find a global min/max
+ // that the pick could possibly be in.
+
+ // Transform pick origin and direction into the subset's space.
+ QT3DSMat44 theOriginTransform = inGlobalTransform.getInverse();
+
+ QT3DSVec3 theTransformedOrigin = theOriginTransform.transform(m_Origin);
+ QT3DSF32 *outOriginTransformPtr(theOriginTransform.front());
+ outOriginTransformPtr[12] = outOriginTransformPtr[13] = outOriginTransformPtr[14] = 0.0f;
+ QT3DSVec3 theTransformedDirection = theOriginTransform.rotate(m_Direction);
+
+ static const QT3DSF32 KD_FLT_MAX = 3.40282346638528860e+38;
+ static const QT3DSF32 kEpsilon = 1e-5f;
+
+ QT3DSF32 theMinWinner = -KD_FLT_MAX;
+ QT3DSF32 theMaxWinner = KD_FLT_MAX;
+
+ for (QT3DSU32 theAxis = 0; theAxis < 3; ++theAxis) {
+ // Extract the ranges and direction for this axis
+ QT3DSF32 theMinBox = inBounds.minimum[theAxis];
+ QT3DSF32 theMaxBox = inBounds.maximum[theAxis];
+ QT3DSF32 theDirectionAxis = theTransformedDirection[theAxis];
+ QT3DSF32 theOriginAxis = theTransformedOrigin[theAxis];
+
+ QT3DSF32 theMinAxis = -KD_FLT_MAX;
+ QT3DSF32 theMaxAxis = KD_FLT_MAX;
+ if (theDirectionAxis > kEpsilon) {
+ theMinAxis = (theMinBox - theOriginAxis) / theDirectionAxis;
+ theMaxAxis = (theMaxBox - theOriginAxis) / theDirectionAxis;
+ } else if (theDirectionAxis < -kEpsilon) {
+ theMinAxis = (theMaxBox - theOriginAxis) / theDirectionAxis;
+ theMaxAxis = (theMinBox - theOriginAxis) / theDirectionAxis;
+ } else if ((theOriginAxis < theMinBox || theOriginAxis > theMaxBox)
+ && inForceIntersect == false) {
+ // Pickray is roughly parallel to the plane of the slab
+ // so, if the origin is not in the range, we have no intersection
+ return Empty();
+ }
+
+ // Shrink the intersections to find the closest hit
+ theMinWinner = NVMax(theMinWinner, theMinAxis);
+ theMaxWinner = NVMin(theMaxWinner, theMaxAxis);
+
+ if ((theMinWinner > theMaxWinner || theMaxWinner < 0) && inForceIntersect == false)
+ return Empty();
+ }
+
+ QT3DSVec3 scaledDir = theTransformedDirection * theMinWinner;
+ QT3DSVec3 newPosInLocal = theTransformedOrigin + scaledDir;
+ QT3DSVec3 newPosInGlobal = inGlobalTransform.transform(newPosInLocal);
+ QT3DSVec3 cameraToLocal = m_Origin - newPosInGlobal;
+
+ QT3DSF32 rayLengthSquared = cameraToLocal.magnitudeSquared();
+
+ QT3DSF32 xRange = inBounds.maximum.x - inBounds.minimum.x;
+ QT3DSF32 yRange = inBounds.maximum.y - inBounds.minimum.y;
+
+ QT3DSVec2 relXY;
+ relXY.x = (newPosInLocal[0] - inBounds.minimum.x) / xRange;
+ relXY.y = (newPosInLocal[1] - inBounds.minimum.y) / yRange;
+
+ return SRayIntersectionResult(rayLengthSquared, relXY);
+}
+
+Option<QT3DSVec2> SRay::GetRelative(const QT3DSMat44 &inGlobalTransform, const NVBounds3 &inBounds,
+ SBasisPlanes::Enum inPlane) const
+{
+ QT3DSMat44 theOriginTransform = inGlobalTransform.getInverse();
+
+ QT3DSVec3 theTransformedOrigin = theOriginTransform.transform(m_Origin);
+ QT3DSF32 *outOriginTransformPtr(theOriginTransform.front());
+ outOriginTransformPtr[12] = outOriginTransformPtr[13] = outOriginTransformPtr[14] = 0.0f;
+ QT3DSVec3 theTransformedDirection = theOriginTransform.rotate(m_Direction);
+
+ // The XY plane is going to be a plane with either positive or negative Z direction that runs
+ // through
+ QT3DSVec3 theDirection(0, 0, 1);
+ QT3DSVec3 theRight(1, 0, 0);
+ QT3DSVec3 theUp(0, 1, 0);
+ switch (inPlane) {
+ case SBasisPlanes::XY:
+ break;
+ case SBasisPlanes::XZ:
+ theDirection = QT3DSVec3(0, 1, 0);
+ theUp = QT3DSVec3(0, 0, 1);
+ break;
+ case SBasisPlanes::YZ:
+ theDirection = QT3DSVec3(1, 0, 0);
+ theRight = QT3DSVec3(0, 0, 1);
+ break;
+ }
+ NVPlane thePlane(theDirection, theDirection.dot(theTransformedDirection) > 0.0f
+ ? theDirection.dot(inBounds.maximum)
+ : theDirection.dot(inBounds.minimum));
+
+ SRay relativeRay(theTransformedOrigin, theTransformedDirection);
+ Option<QT3DSVec3> localIsect = relativeRay.Intersect(thePlane);
+ if (localIsect.hasValue()) {
+ QT3DSF32 xRange = theRight.dot(inBounds.maximum) - theRight.dot(inBounds.minimum);
+ QT3DSF32 yRange = theUp.dot(inBounds.maximum) - theUp.dot(inBounds.minimum);
+ QT3DSF32 xOrigin = xRange / 2.0f + theRight.dot(inBounds.minimum);
+ QT3DSF32 yOrigin = yRange / 2.0f + theUp.dot(inBounds.minimum);
+ return QT3DSVec2((theRight.dot(*localIsect) - xOrigin) / xRange,
+ (theUp.dot(*localIsect) - yOrigin) / yRange);
+ }
+ return Empty();
+}
diff --git a/src/runtimerender/Qt3DSRenderRay.h b/src/runtimerender/Qt3DSRenderRay.h
new file mode 100644
index 0000000..705f708
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderRay.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_RAY_H
+#define QT3DS_RENDER_RAY_H
+
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSMat44.h"
+#include "foundation/Qt3DSBounds3.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SBasisPlanes
+ {
+ enum Enum {
+ XY = 0,
+ YZ,
+ XZ,
+ };
+ };
+
+ struct SRayIntersectionResult
+ {
+ QT3DSF32 m_RayLengthSquared; // Length of the ray in world coordinates for the hit.
+ QT3DSVec2 m_RelXY; // UV coords for further mouse picking against a offscreen-rendered object.
+ SRayIntersectionResult()
+ : m_RayLengthSquared(0)
+ , m_RelXY(0, 0)
+ {
+ }
+ SRayIntersectionResult(QT3DSF32 rl, QT3DSVec2 relxy)
+ : m_RayLengthSquared(rl)
+ , m_RelXY(relxy)
+ {
+ }
+ };
+
+ struct SRay
+ {
+ QT3DSVec3 m_Origin;
+ QT3DSVec3 m_Direction;
+ SRay()
+ : m_Origin(0, 0, 0)
+ , m_Direction(0, 0, 0)
+ {
+ }
+ SRay(const QT3DSVec3 &inOrigin, const QT3DSVec3 &inDirection)
+ : m_Origin(inOrigin)
+ , m_Direction(inDirection)
+ {
+ }
+ // If we are parallel, then no intersection of course.
+ Option<QT3DSVec3> Intersect(const NVPlane &inPlane) const;
+
+ Option<SRayIntersectionResult> IntersectWithAABB(const QT3DSMat44 &inGlobalTransform,
+ const NVBounds3 &inBounds,
+ bool inForceIntersect = false) const;
+
+ Option<QT3DSVec2> GetRelative(const QT3DSMat44 &inGlobalTransform, const NVBounds3 &inBounds,
+ SBasisPlanes::Enum inPlane) const;
+
+ Option<QT3DSVec2> GetRelativeXY(const QT3DSMat44 &inGlobalTransform,
+ const NVBounds3 &inBounds) const
+ {
+ return GetRelative(inGlobalTransform, inBounds, SBasisPlanes::XY);
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderRenderList.cpp b/src/runtimerender/Qt3DSRenderRenderList.cpp
new file mode 100644
index 0000000..05a7b2c
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderRenderList.cpp
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderRenderList.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSContainers.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct SRenderList : public IRenderList
+{
+ typedef eastl::pair<QT3DSU32, IRenderTask *> TTaskIdTaskPair;
+ typedef nvvector<TTaskIdTaskPair> TTaskList;
+
+ NVFoundationBase &m_Foundation;
+ TTaskList m_Tasks;
+ TTaskList m_PersistentTasks;
+ QT3DSU32 m_NextTaskId;
+ QT3DSI32 mRefCount;
+ bool m_ScissorEnabled;
+ NVRenderRect m_ScissorRect;
+ NVRenderRect m_Viewport;
+
+ SRenderList(NVFoundationBase &fnd)
+ : m_Foundation(fnd)
+ , m_Tasks(fnd.getAllocator(), "m_Tasks")
+ , m_PersistentTasks(fnd.getAllocator(), "m_PersistentTasks")
+ , m_NextTaskId(1)
+ , mRefCount(0)
+ , m_ScissorEnabled(false)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ void BeginFrame() override
+ {
+ m_NextTaskId = 1;
+ m_Tasks.clear();
+ }
+
+ QT3DSU32 AddRenderTask(IRenderTask &inTask) override
+ {
+ QT3DSU32 taskId = m_NextTaskId;
+ if (inTask.persistent()) {
+ m_PersistentTasks.push_back(eastl::make_pair(0, &inTask));
+ taskId = 0;
+ } else {
+ QT3DSU32 taskId = m_NextTaskId;
+ ++m_NextTaskId;
+ m_Tasks.push_back(eastl::make_pair(taskId, &inTask));
+ }
+ return taskId;
+ }
+
+ void DiscardRenderTask(QT3DSU32 inTaskId) override
+ {
+ TTaskList::iterator iter, end;
+ for (iter = m_Tasks.begin(), end = m_Tasks.end(); iter != end && iter->first != inTaskId;
+ ++iter) {
+ }
+ if (iter != end)
+ m_Tasks.erase(iter);
+ }
+ // This runs through the added tasks in reverse order. This is used to render dependencies
+ // before rendering to the main render target.
+ void RunRenderTasks() override
+ {
+ for (TTaskList::reverse_iterator iter = m_PersistentTasks.rbegin(),
+ end = m_PersistentTasks.rend(); iter != end;
+ ++iter) {
+ iter->second->Run();
+ }
+ for (TTaskList::reverse_iterator iter = m_Tasks.rbegin(), end = m_Tasks.rend(); iter != end;
+ ++iter) {
+ iter->second->Run();
+ }
+ BeginFrame();
+ }
+
+ void SetScissorTestEnabled(bool enabled) override { m_ScissorEnabled = enabled; }
+ void SetScissorRect(NVRenderRect rect) override { m_ScissorRect = rect; }
+ void SetViewport(NVRenderRect rect) override { m_Viewport = rect; }
+ bool IsScissorTestEnabled() const override { return m_ScissorEnabled; }
+ NVRenderRect GetScissor() const override { return m_ScissorRect; }
+ NVRenderRect GetViewport() const override { return m_Viewport; }
+};
+}
+
+IRenderList &IRenderList::CreateRenderList(NVFoundationBase &fnd)
+{
+ return *QT3DS_NEW(fnd.getAllocator(), SRenderList)(fnd);
+}
diff --git a/src/runtimerender/Qt3DSRenderRenderList.h b/src/runtimerender/Qt3DSRenderRenderList.h
new file mode 100644
index 0000000..957c3d7
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderRenderList.h
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_RENDER_LIST_H
+#define QT3DS_RENDER_RENDER_LIST_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ class IRenderTask
+ {
+ public:
+ virtual ~IRenderTask() {}
+ virtual void Run() = 0;
+ virtual bool persistent() const
+ {
+ return false;
+ }
+ };
+
+ /**
+ * The render list exists so that dependencies of the main render target can render themselves
+ * completely before the main render target renders. From Maxwell GPU's on, we have a tiled
+ * architecture. This tiling mechanism is sensitive to switching the render target, so we would
+ * really like to render completely to a single render target and then switch. With our layered
+ * render architecture, this is not very feasible unless dependencies render themselves before
+ * the
+ * main set of layers render themselves. Furthermore it benefits the overall software
+ * architecture
+ * to have a distinct split between the prepare for render step and the render step and using
+ * this
+ * render list allows us to avoid some level of repeated tree traversal at the cost of some
+ * minimal
+ * per frame allocation. The rules for using the render list are that you need to add yourself
+ * before
+ * your dependencies do; the list is iterated in reverse during RunRenderTasks. So a layer adds
+ * itself
+ * (if it is going to render offscreen) before it runs through its renderable list to prepare
+ * each object
+ * because it is during the renderable prepare traversale that subpresentations will get added
+ * by
+ * the offscreen render manager.
+ */
+ class IRenderList : public NVRefCounted
+ {
+ public:
+ // Called by the render context, do not call this.
+ virtual void BeginFrame() = 0;
+
+ // Next tell all sub render target rendering systems to add themselves to the render list.
+ // At this point
+ // we agree to *not* have rendered anything, no clears or anything so if you are caching
+ // render state and you detect nothing has changed it may not be necessary to swap egl
+ // buffers.
+ virtual QT3DSU32 AddRenderTask(IRenderTask &inTask) = 0;
+ virtual void DiscardRenderTask(QT3DSU32 inTaskId) = 0;
+ // This runs through the added tasks in reverse order. This is used to render dependencies
+ // before rendering to the main render target.
+ virtual void RunRenderTasks() = 0;
+
+ // We used to use GL state to pass information down the callstack.
+ // I have replaced those calls with this state here because that information
+ // controls how layers size themselves (which is quite a complicated process).
+ virtual void SetScissorTestEnabled(bool enabled) = 0;
+ virtual void SetScissorRect(NVRenderRect rect) = 0;
+ virtual void SetViewport(NVRenderRect rect) = 0;
+ virtual bool IsScissorTestEnabled() const = 0;
+ virtual NVRenderRect GetScissor() const = 0;
+ virtual NVRenderRect GetViewport() const = 0;
+
+ static IRenderList &CreateRenderList(NVFoundationBase &inFnd);
+ };
+
+ // Now for scoped property access.
+ template <typename TDataType>
+ struct SRenderListScopedProperty
+ : public qt3ds::render::NVRenderGenericScopedProperty<IRenderList, TDataType>
+ {
+ typedef qt3ds::render::NVRenderGenericScopedProperty<IRenderList, TDataType> TBaseType;
+ typedef typename TBaseType::TGetter TGetter;
+ typedef typename TBaseType::TSetter TSetter;
+ SRenderListScopedProperty(IRenderList &ctx, TGetter getter, TSetter setter)
+ : TBaseType(ctx, getter, setter)
+ {
+ }
+ SRenderListScopedProperty(IRenderList &ctx, TGetter getter, TSetter setter,
+ const TDataType &inNewValue)
+ : TBaseType(ctx, getter, setter, inNewValue)
+ {
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderRotationHelper.h b/src/runtimerender/Qt3DSRenderRotationHelper.h
new file mode 100644
index 0000000..19ba8eb
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderRotationHelper.h
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_ROTATION_HELPER_H
+#define QT3DS_RENDER_ROTATION_HELPER_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderNode.h"
+#include "EASTL/utility.h"
+
+namespace qt3ds {
+namespace render {
+ /**
+ * Unfortunately we still use an XYZ-Euler rotation system. This means that identical
+ *rotations
+ * can be represented in various ways. We need to ensure that the value that we write in the
+ * inspector palette are reasonable, however, and to do this we need a least-distance function
+ * from two different xyz tuples.
+ */
+
+ struct SRotationHelper
+ {
+
+ // Attempt to go for negative values intead of large positive ones
+ // Goal is to keep the fabs of the angle low.
+ static QT3DSF32 ToMinimalAngle(QT3DSF32 value)
+ {
+ QT3DSF32 epsilon = (QT3DSF32)M_PI + .001f;
+ while (fabs(value) > epsilon) {
+ QT3DSF32 tpi = (QT3DSF32)(2.0f * M_PI);
+ if (value > 0.0f)
+ value -= tpi;
+ else
+ value += tpi;
+ }
+ return value;
+ }
+
+ /**
+ * Convert an angle to a canonical form. Return this canonical form.
+ *
+ * The canonical form is defined as:
+ * 1. XYZ all positive.
+ * 2. XYZ all less than 360.
+ *
+ * To do this we rely on two identities, the first is that given an angle, adding
+ * (or subtracting) pi from all three components does not change the angle.
+ *
+ * The second is the obvious one that adding or subtracting 2*pi from any single
+ * component does not change the angle.
+ *
+ * Note that this function works in radian space.
+ */
+ static QT3DSVec3 ToCanonicalFormStaticAxis(const QT3DSVec3 &inSrcAngle, QT3DSU32 inRotOrder)
+ {
+ // step 1 - reduce all components to less than 2*pi but greater than 0
+ QT3DSVec3 retval(inSrcAngle);
+ retval.x = ToMinimalAngle(retval.x);
+ retval.y = ToMinimalAngle(retval.y);
+ retval.z = ToMinimalAngle(retval.z);
+
+ // step 2 - if any two components are equal to or greater than pi
+ // then subtract pi from all three, then run two pi reduce again.
+
+ QT3DSU32 greaterThanPiSum = 0;
+ QT3DSF32 pi = (QT3DSF32)M_PI;
+ for (QT3DSU32 idx = 0; idx < 3; ++idx)
+ if (fabs(retval[idx]) >= pi)
+ greaterThanPiSum++;
+
+ if (greaterThanPiSum > 1) {
+ // For this identity to work, the middle axis angle needs to be subtracted from
+ // 180 instead of added to 180 because the previous axis *reversed* it.
+ QT3DSU32 theMiddleAxis = 0;
+
+ switch (inRotOrder) {
+ case EulOrdXYZs:
+ theMiddleAxis = 1;
+ break;
+ case EulOrdXZYs:
+ theMiddleAxis = 2;
+ break;
+ case EulOrdYXZs:
+ theMiddleAxis = 0;
+ break;
+ case EulOrdYZXs:
+ theMiddleAxis = 2;
+ break;
+ case EulOrdZYXs:
+ theMiddleAxis = 1;
+ break;
+ case EulOrdZXYs:
+ theMiddleAxis = 0;
+ break;
+ case EulOrdXYZr:
+ theMiddleAxis = 1;
+ break;
+ case EulOrdXZYr:
+ theMiddleAxis = 2;
+ break;
+ case EulOrdYXZr:
+ theMiddleAxis = 0;
+ break;
+ case EulOrdYZXr:
+ theMiddleAxis = 2;
+ break;
+ case EulOrdZYXr:
+ theMiddleAxis = 1;
+ break;
+ case EulOrdZXYr:
+ theMiddleAxis = 0;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ return inSrcAngle;
+ }
+ for (QT3DSU32 idx = 0; idx < 3; ++idx) {
+ if (idx == theMiddleAxis)
+ retval[idx] = pi - retval[idx];
+ else
+ retval[idx] = retval[idx] > 0.0f ? retval[idx] - pi : retval[idx] + pi;
+ }
+ }
+ return retval;
+ }
+
+ static QT3DSVec3 ToMinimalAngleDiff(const QT3DSVec3 inDiff)
+ {
+ return QT3DSVec3(ToMinimalAngle(inDiff.x), ToMinimalAngle(inDiff.y),
+ ToMinimalAngle(inDiff.z));
+ }
+
+ /**
+ * Given an old angle and a new angle, return an angle has the same rotational value
+ * as the new angle *but* is as close to the old angle as possible.
+ * Works in radian space. This function doesn't currently work for euler angles or
+ * with Euler angles with repeating axis.
+ */
+ static QT3DSVec3 ToNearestAngle(const QT3DSVec3 &inOldAngle, const QT3DSVec3 &inNewAngle,
+ QT3DSU32 inRotOrder)
+ {
+ switch (inRotOrder) {
+ case EulOrdXYZs:
+ case EulOrdXZYs:
+ case EulOrdYXZs:
+ case EulOrdYZXs:
+ case EulOrdZYXs:
+ case EulOrdZXYs:
+ case EulOrdXYZr:
+ case EulOrdXZYr:
+ case EulOrdYXZr:
+ case EulOrdYZXr:
+ case EulOrdZYXr:
+ case EulOrdZXYr: {
+ QT3DSVec3 oldA = ToCanonicalFormStaticAxis(inOldAngle, inRotOrder);
+ QT3DSVec3 newA = ToCanonicalFormStaticAxis(inNewAngle, inRotOrder);
+ QT3DSVec3 diff = newA - oldA;
+ return inOldAngle + ToMinimalAngleDiff(diff);
+ } break;
+ default:
+ return inNewAngle;
+ }
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderShaderCache.cpp b/src/runtimerender/Qt3DSRenderShaderCache.cpp
new file mode 100644
index 0000000..77d4ee6
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShaderCache.cpp
@@ -0,0 +1,770 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderShaderCache.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "StringTools.h"
+#include "foundation/XML.h"
+#include "foundation/IOStreams.h"
+#include "foundation/StringConversionImpl.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "foundation/FileTools.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderer.h"
+#include <memory>
+#include "foundation/Qt3DSTime.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "EASTL/sort.h"
+
+#include <QRegularExpression>
+#include <QString>
+
+using namespace qt3ds::render;
+
+namespace {
+using qt3ds::render::NVRenderContextScopedProperty;
+const char *TessellationEnabledStr = "TessellationStageEnabled";
+const char *GeometryEnabledStr = "GeometryStageEnabled";
+inline void AppendFlagValue(Qt3DSString &inStr, const char *flag)
+{
+ if (inStr.length())
+ inStr.append(QLatin1Char(','));
+ inStr.append(flag);
+}
+inline void CacheFlagsToStr(const SShaderCacheProgramFlags &inFlags, Qt3DSString &inString)
+{
+ inString.clear();
+ if (inFlags.IsTessellationEnabled())
+ AppendFlagValue(inString, TessellationEnabledStr);
+ if (inFlags.IsGeometryShaderEnabled())
+ AppendFlagValue(inString, GeometryEnabledStr);
+}
+
+struct ShaderType
+{
+ enum Enum { Vertex, TessControl, TessEval, Fragment, Geometry, Compute };
+};
+
+inline ShaderType::Enum StringToShaderType(Qt3DSString &inShaderType)
+{
+ ShaderType::Enum retval = ShaderType::Vertex;
+
+ if (inShaderType.size() == 0)
+ return retval;
+
+ if (!inShaderType.compare("VertexCode"))
+ retval = ShaderType::Vertex;
+ else if (!inShaderType.compare("FragmentCode"))
+ retval = ShaderType::Fragment;
+ else if (!inShaderType.compare("TessControlCode"))
+ retval = ShaderType::TessControl;
+ else if (!inShaderType.compare("TessEvalCode"))
+ retval = ShaderType::TessEval;
+ else if (!inShaderType.compare("GeometryCode"))
+ retval = ShaderType::Geometry;
+ else
+ QT3DS_ASSERT(false);
+
+ return retval;
+}
+
+inline SShaderCacheProgramFlags CacheFlagsToStr(const Qt3DSString &inString)
+{
+ SShaderCacheProgramFlags retval;
+ if (inString.indexOf(TessellationEnabledStr) != Qt3DSString::npos)
+ retval.SetTessellationEnabled(true);
+ if (inString.indexOf(GeometryEnabledStr) != Qt3DSString::npos)
+ retval.SetGeometryShaderEnabled(true);
+ return retval;
+}
+
+typedef eastl::pair<const char *, NVRenderContextValues::Enum> TStringToContextValuePair;
+
+/*GLES2 = 1 << 0,
+GL2 = 1 << 1,
+GLES3 = 1 << 2,
+GL3 = 1 << 3,
+GL4 = 1 << 4,
+NullContext = 1 << 5,*/
+TStringToContextValuePair g_StringToContextTypeValue[] = {
+ TStringToContextValuePair("GLES2", NVRenderContextValues::GLES2),
+ TStringToContextValuePair("GL2", NVRenderContextValues::GL2),
+ TStringToContextValuePair("GLES3", NVRenderContextValues::GLES3),
+ TStringToContextValuePair("GLES3PLUS", NVRenderContextValues::GLES3PLUS),
+ TStringToContextValuePair("GL3", NVRenderContextValues::GL3),
+ TStringToContextValuePair("GL4", NVRenderContextValues::GL4),
+ TStringToContextValuePair("NullContext", NVRenderContextValues::NullContext),
+};
+
+size_t g_NumStringToContextValueEntries =
+ sizeof(g_StringToContextTypeValue) / sizeof(*g_StringToContextTypeValue);
+
+inline void ContextTypeToString(qt3ds::render::NVRenderContextType inType,
+ Qt3DSString &outContextType)
+{
+ outContextType.clear();
+ for (size_t idx = 0, end = g_NumStringToContextValueEntries; idx < end; ++idx) {
+ if (inType & g_StringToContextTypeValue[idx].second) {
+ if (outContextType.size())
+ outContextType.append('|');
+ outContextType.append(g_StringToContextTypeValue[idx].first);
+ }
+ }
+}
+
+inline qt3ds::render::NVRenderContextType StringToContextType(const Qt3DSString &inContextType)
+{
+ qt3ds::render::NVRenderContextType retval;
+ char tempBuffer[128];
+ memZero(tempBuffer, 128);
+ const QString::size_type lastTempBufIdx = 127;
+ QString::size_type pos = 0, lastpos = 0;
+ if (inContextType.size() == 0)
+ return retval;
+
+ do {
+ pos = int(inContextType.indexOf(QLatin1Char('|'), lastpos));
+ if (pos == Qt3DSString::npos)
+ pos = int(inContextType.size());
+ {
+
+ QString::size_type sectionLen = NVMin(pos - lastpos, lastTempBufIdx);
+ qt3ds::intrinsics::memCopy(tempBuffer, inContextType.toUtf8().constData() + lastpos,
+ sectionLen);
+ tempBuffer[lastTempBufIdx] = 0;
+ for (size_t idx = 0, end = g_NumStringToContextValueEntries; idx < end; ++idx) {
+ if (strcmp(g_StringToContextTypeValue[idx].first, tempBuffer) == 0)
+ retval = retval | g_StringToContextTypeValue[idx].second;
+ }
+ }
+ // iterate past the bar
+ ++pos;
+ lastpos = pos;
+ } while (pos < inContextType.size() && pos != Qt3DSString::npos);
+
+ return retval;
+}
+
+struct SShaderCacheKey
+{
+ CRegisteredString m_Key;
+ eastl::vector<SShaderPreprocessorFeature> m_Features;
+ size_t m_HashCode;
+
+ SShaderCacheKey(CRegisteredString key = CRegisteredString())
+ : m_Key(key)
+ , m_HashCode(0)
+ {
+ }
+
+ SShaderCacheKey(const SShaderCacheKey &other)
+ : m_Key(other.m_Key)
+ , m_Features(other.m_Features)
+ , m_HashCode(other.m_HashCode)
+ {
+ }
+
+ SShaderCacheKey &operator=(const SShaderCacheKey &other)
+ {
+ m_Key = other.m_Key;
+ m_Features = other.m_Features;
+ m_HashCode = other.m_HashCode;
+ return *this;
+ }
+
+ void GenerateHashCode()
+ {
+ m_HashCode = m_Key.hash();
+ m_HashCode = m_HashCode
+ ^ HashShaderFeatureSet(toDataRef(m_Features.data(), (QT3DSU32)m_Features.size()));
+ }
+ bool operator==(const SShaderCacheKey &inOther) const
+ {
+ return m_Key == inOther.m_Key && m_Features == inOther.m_Features;
+ }
+};
+}
+
+namespace eastl {
+template <>
+struct hash<SShaderCacheKey>
+{
+ size_t operator()(const SShaderCacheKey &inKey) const { return inKey.m_HashCode; }
+};
+}
+
+namespace {
+
+struct ShaderCache : public IShaderCache
+{
+ typedef nvhash_map<SShaderCacheKey, NVScopedRefCounted<NVRenderShaderProgram>> TShaderMap;
+ NVRenderContext &m_RenderContext;
+ IPerfTimer &m_PerfTimer;
+ TShaderMap m_Shaders;
+ Qt3DSString m_CacheFilePath;
+ Qt3DSString m_VertexCode;
+ Qt3DSString m_TessCtrlCode;
+ Qt3DSString m_TessEvalCode;
+ Qt3DSString m_GeometryCode;
+ Qt3DSString m_FragmentCode;
+ Qt3DSString m_InsertStr;
+ Qt3DSString m_FlagString;
+ Qt3DSString m_ContextTypeString;
+ SShaderCacheKey m_TempKey;
+
+ NVScopedRefCounted<IDOMWriter> m_ShaderCache;
+ IInputStreamFactory &m_InputStreamFactory;
+ bool m_ShaderCompilationEnabled;
+ volatile QT3DSI32 mRefCount;
+
+ ShaderCache(NVRenderContext &ctx, IInputStreamFactory &inInputStreamFactory,
+ IPerfTimer &inPerfTimer)
+ : m_RenderContext(ctx)
+ , m_PerfTimer(inPerfTimer)
+ , m_Shaders(ctx.GetAllocator(), "ShaderCache::m_Shaders")
+ , m_InputStreamFactory(inInputStreamFactory)
+ , m_ShaderCompilationEnabled(true)
+ , mRefCount(0)
+ {
+ }
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext.GetAllocator())
+
+ NVRenderShaderProgram *GetProgram(CRegisteredString inKey,
+ NVConstDataRef<SShaderPreprocessorFeature> inFeatures) override
+ {
+ m_TempKey.m_Key = inKey;
+ m_TempKey.m_Features.assign(inFeatures.begin(), inFeatures.end());
+ m_TempKey.GenerateHashCode();
+ TShaderMap::iterator theIter = m_Shaders.find(m_TempKey);
+ if (theIter != m_Shaders.end())
+ return theIter->second;
+ return NULL;
+ }
+
+ void AddBackwardCompatibilityDefines(ShaderType::Enum shaderType)
+ {
+ if (shaderType == ShaderType::Vertex || shaderType == ShaderType::TessControl
+ || shaderType == ShaderType::TessEval || shaderType == ShaderType::Geometry) {
+ m_InsertStr += "#define attribute in\n";
+ m_InsertStr += "#define varying out\n";
+ } else if (shaderType == ShaderType::Fragment) {
+ m_InsertStr += "#define varying in\n";
+ m_InsertStr += "#define texture2D texture\n";
+ m_InsertStr += "#define gl_FragColor fragOutput\n";
+
+ if (m_RenderContext.IsAdvancedBlendHwSupportedKHR())
+ m_InsertStr += "layout(blend_support_all_equations) out;\n";
+
+ m_InsertStr += "#ifndef NO_FRAG_OUTPUT\n";
+ m_InsertStr += "out vec4 fragOutput;\n";
+ m_InsertStr += "#endif\n";
+ }
+ }
+
+ void AddShaderExtensionStrings(ShaderType::Enum shaderType, bool isGLES)
+ {
+ if (isGLES) {
+ if (m_RenderContext.IsStandardDerivativesSupported())
+ m_InsertStr += "#extension GL_OES_standard_derivatives : enable\n";
+ else
+ m_InsertStr += "#extension GL_OES_standard_derivatives : disable\n";
+ }
+
+ if (IQt3DSRenderer::IsGlEs3Context(m_RenderContext.GetRenderContextType())) {
+ if (shaderType == ShaderType::TessControl || shaderType == ShaderType::TessEval) {
+ m_InsertStr += "#extension GL_EXT_tessellation_shader : enable\n";
+ } else if (shaderType == ShaderType::Geometry) {
+ m_InsertStr += "#extension GL_EXT_geometry_shader : enable\n";
+ } else if (shaderType == ShaderType::Vertex || shaderType == ShaderType::Fragment) {
+ if (m_RenderContext.GetRenderBackendCap(render::NVRenderBackend::NVRenderBackendCaps::gpuShader5))
+ m_InsertStr += "#extension GL_EXT_gpu_shader5 : enable\n";
+ if (m_RenderContext.IsAdvancedBlendHwSupportedKHR())
+ m_InsertStr += "#extension GL_KHR_blend_equation_advanced : enable\n";
+ }
+ } else {
+ if (shaderType == ShaderType::Vertex || shaderType == ShaderType::Fragment
+ || shaderType == ShaderType::Geometry) {
+ if (m_RenderContext.GetRenderContextType() != NVRenderContextValues::GLES2) {
+ m_InsertStr += "#extension GL_ARB_gpu_shader5 : enable\n";
+ m_InsertStr += "#extension GL_ARB_shading_language_420pack : enable\n";
+ }
+ if (isGLES && m_RenderContext.IsTextureLodSupported())
+ m_InsertStr += "#extension GL_EXT_shader_texture_lod : enable\n";
+ if (m_RenderContext.IsShaderImageLoadStoreSupported())
+ m_InsertStr += "#extension GL_ARB_shader_image_load_store : enable\n";
+ if (m_RenderContext.IsAtomicCounterBufferSupported())
+ m_InsertStr += "#extension GL_ARB_shader_atomic_counters : enable\n";
+ if (m_RenderContext.IsStorageBufferSupported())
+ m_InsertStr += "#extension GL_ARB_shader_storage_buffer_object : enable\n";
+ if (m_RenderContext.IsAdvancedBlendHwSupportedKHR())
+ m_InsertStr += "#extension GL_KHR_blend_equation_advanced : enable\n";
+ }
+ }
+ }
+
+ void AddShaderPreprocessor(Qt3DSString &str, CRegisteredString inKey,
+ ShaderType::Enum shaderType,
+ NVConstDataRef<SShaderPreprocessorFeature> inFeatures)
+ {
+ // Don't use shading language version returned by the driver as it might
+ // differ from the context version. Instead use the context type to specify
+ // the version string.
+ bool isGlES = IQt3DSRenderer::IsGlEsContext(m_RenderContext.GetRenderContextType());
+ m_InsertStr.clear();
+ int minor = m_RenderContext.format().minorVersion();
+ QString versionStr;
+ QTextStream stream(&versionStr);
+ stream << "#version ";
+ const QT3DSU32 type = (QT3DSU32)m_RenderContext.GetRenderContextType();
+ switch (type) {
+ case NVRenderContextValues::GLES2:
+ stream << "1" << minor << "0\n";
+ break;
+ case NVRenderContextValues::GL2:
+ stream << "1" << minor << "0\n";
+ break;
+ case NVRenderContextValues::GLES3PLUS:
+ case NVRenderContextValues::GLES3:
+ stream << "3" << minor << "0 es\n";
+ break;
+ case NVRenderContextValues::GL3:
+ if (minor == 3)
+ stream << "3" << minor << "0\n";
+ else
+ stream << "1" << 3 + minor << "0\n";
+ break;
+ case NVRenderContextValues::GL4:
+ stream << "4" << minor << "0\n";
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ m_InsertStr.append(versionStr.toLatin1().data());
+
+ if (inFeatures.size()) {
+ for (QT3DSU32 idx = 0, end = inFeatures.size(); idx < end; ++idx) {
+ SShaderPreprocessorFeature feature(inFeatures[idx]);
+ m_InsertStr.append("#define ");
+ m_InsertStr.append(inFeatures[idx].m_Name.c_str());
+ m_InsertStr.append(" ");
+ m_InsertStr.append(feature.m_Enabled ? "1" : "0");
+ m_InsertStr.append("\n");
+ }
+ }
+
+ if (isGlES) {
+ if (!IQt3DSRenderer::IsGlEs3Context(m_RenderContext.GetRenderContextType())) {
+ if (shaderType == ShaderType::Fragment) {
+ m_InsertStr += "#define fragOutput gl_FragData[0]\n";
+ }
+ } else {
+ m_InsertStr += "#define texture2D texture\n";
+ }
+
+ // add extenions strings before any other non-processor token
+ AddShaderExtensionStrings(shaderType, isGlES);
+
+ // add precision qualifier depending on backend
+ if (IQt3DSRenderer::IsGlEs3Context(m_RenderContext.GetRenderContextType())) {
+ m_InsertStr.append("precision highp float;\n"
+ "precision highp int;\n");
+ if( m_RenderContext.GetRenderBackendCap(render::NVRenderBackend::NVRenderBackendCaps::gpuShader5) ) {
+ m_InsertStr.append("precision mediump sampler2D;\n"
+ "precision mediump sampler2DArray;\n"
+ "precision mediump sampler2DShadow;\n");
+ if (m_RenderContext.IsShaderImageLoadStoreSupported()) {
+ m_InsertStr.append("precision mediump image2D;\n");
+ }
+ }
+
+ AddBackwardCompatibilityDefines(shaderType);
+ } else {
+ // GLES2
+ m_InsertStr.append("precision mediump float;\n"
+ "precision mediump int;\n"
+ "#define texture texture2D\n");
+ if (m_RenderContext.IsTextureLodSupported())
+ m_InsertStr.append("#define textureLod texture2DLodEXT\n");
+ else
+ m_InsertStr.append("#define textureLod(s, co, lod) texture2D(s, co)\n");
+ }
+ } else {
+ if (!IQt3DSRenderer::IsGl2Context(m_RenderContext.GetRenderContextType())) {
+ m_InsertStr += "#define texture2D texture\n";
+
+ AddShaderExtensionStrings(shaderType, isGlES);
+
+ m_InsertStr += "#if __VERSION__ >= 330\n";
+
+ AddBackwardCompatibilityDefines(shaderType);
+
+ m_InsertStr += "#else\n";
+ if (shaderType == ShaderType::Fragment) {
+ m_InsertStr += "#define fragOutput gl_FragData[0]\n";
+ }
+ m_InsertStr += "#endif\n";
+ }
+ }
+
+ if (inKey.IsValid()) {
+ m_InsertStr += "//Shader name -";
+ m_InsertStr += inKey.c_str();
+ m_InsertStr += "\n";
+ }
+
+ if (shaderType == ShaderType::TessControl) {
+ m_InsertStr += "#define TESSELLATION_CONTROL_SHADER 1\n";
+ m_InsertStr += "#define TESSELLATION_EVALUATION_SHADER 0\n";
+ } else if (shaderType == ShaderType::TessEval) {
+ m_InsertStr += "#define TESSELLATION_CONTROL_SHADER 0\n";
+ m_InsertStr += "#define TESSELLATION_EVALUATION_SHADER 1\n";
+ }
+
+ str.insert(0, m_InsertStr);
+ }
+ // Compile this program overwriting any existing ones.
+ NVRenderShaderProgram *
+ ForceCompileProgram(CRegisteredString inKey, const char8_t *inVert, const char8_t *inFrag,
+ const char8_t *inTessCtrl, const char8_t *inTessEval, const char8_t *inGeom,
+ const SShaderCacheProgramFlags &inFlags,
+ NVConstDataRef<SShaderPreprocessorFeature> inFeatures,
+ bool separableProgram, bool fromDisk = false) override
+ {
+ if (m_ShaderCompilationEnabled == false)
+ return NULL;
+ SShaderCacheKey tempKey(inKey);
+ tempKey.m_Features.assign(inFeatures.begin(), inFeatures.end());
+ tempKey.GenerateHashCode();
+
+ eastl::pair<TShaderMap::iterator, bool> theInserter = m_Shaders.insert(tempKey);
+ if (fromDisk) {
+ qCInfo(TRACE_INFO) << "Loading from persistent shader cache: '<"
+ << tempKey.m_Key << ">'";
+ } else {
+ qCInfo(TRACE_INFO) << "Compiling into shader cache: '"
+ << tempKey.m_Key << ">'";
+ }
+
+ if (!inVert)
+ inVert = "";
+ if (!inTessCtrl)
+ inTessCtrl = "";
+ if (!inTessEval)
+ inTessEval = "";
+ if (!inGeom)
+ inGeom = "";
+ if (!inFrag)
+ inFrag = "";
+
+ SStackPerfTimer __perfTimer(m_PerfTimer, "Shader Compilation");
+ m_VertexCode.assign(inVert);
+ m_TessCtrlCode.assign(inTessCtrl);
+ m_TessEvalCode.assign(inTessEval);
+ m_GeometryCode.assign(inGeom);
+ m_FragmentCode.assign(inFrag);
+ // Add defines and such so we can write unified shaders that work across platforms.
+ // vertex and fragment shaders are optional for separable shaders
+ if (!separableProgram || !m_VertexCode.isEmpty())
+ AddShaderPreprocessor(m_VertexCode, inKey, ShaderType::Vertex, inFeatures);
+ if (!separableProgram || !m_FragmentCode.isEmpty())
+ AddShaderPreprocessor(m_FragmentCode, inKey, ShaderType::Fragment, inFeatures);
+ // optional shaders
+ if (inFlags.IsTessellationEnabled()) {
+ QT3DS_ASSERT(m_TessCtrlCode.size() && m_TessEvalCode.size());
+ AddShaderPreprocessor(m_TessCtrlCode, inKey, ShaderType::TessControl, inFeatures);
+ AddShaderPreprocessor(m_TessEvalCode, inKey, ShaderType::TessEval, inFeatures);
+ }
+ if (inFlags.IsGeometryShaderEnabled())
+ AddShaderPreprocessor(m_GeometryCode, inKey, ShaderType::Geometry, inFeatures);
+
+ theInserter.first->second =
+ m_RenderContext
+ .CompileSource(inKey, m_VertexCode.c_str(), QT3DSU32(m_VertexCode.size()),
+ m_FragmentCode.c_str(), QT3DSU32(m_FragmentCode.size()),
+ m_TessCtrlCode.c_str(), QT3DSU32(m_TessCtrlCode.size()),
+ m_TessEvalCode.c_str(), QT3DSU32(m_TessEvalCode.size()),
+ m_GeometryCode.c_str(), QT3DSU32(m_GeometryCode.size()),
+ separableProgram).mShader;
+ if (theInserter.first->second) {
+ if (m_ShaderCache) {
+ IDOMWriter::Scope __writeScope(*m_ShaderCache, "Program");
+ m_ShaderCache->Att("key", inKey.c_str());
+ CacheFlagsToStr(inFlags, m_FlagString);
+ if (m_FlagString.size())
+ m_ShaderCache->Att("glflags", m_FlagString.c_str());
+ // write out the GL version.
+ {
+ qt3ds::render::NVRenderContextType theContextType =
+ m_RenderContext.GetRenderContextType();
+ ContextTypeToString(theContextType, m_ContextTypeString);
+ m_ShaderCache->Att("gl-context-type", m_ContextTypeString.c_str());
+ }
+ if (inFeatures.size()) {
+ IDOMWriter::Scope __writeScope(*m_ShaderCache, "Features");
+ for (QT3DSU32 idx = 0, end = inFeatures.size(); idx < end; ++idx) {
+ m_ShaderCache->Att(inFeatures[idx].m_Name, inFeatures[idx].m_Enabled);
+ }
+ }
+
+ {
+ IDOMWriter::Scope __writeScope(*m_ShaderCache, "VertexCode");
+ m_ShaderCache->Value(inVert);
+ }
+ {
+ IDOMWriter::Scope __writeScope(*m_ShaderCache, "FragmentCode");
+ m_ShaderCache->Value(inFrag);
+ }
+ if (m_TessCtrlCode.size()) {
+ IDOMWriter::Scope __writeScope(*m_ShaderCache, "TessControlCode");
+ m_ShaderCache->Value(inTessCtrl);
+ }
+ if (m_TessEvalCode.size()) {
+ IDOMWriter::Scope __writeScope(*m_ShaderCache, "TessEvalCode");
+ m_ShaderCache->Value(inTessEval);
+ }
+ if (m_GeometryCode.size()) {
+ IDOMWriter::Scope __writeScope(*m_ShaderCache, "GeometryCode");
+ m_ShaderCache->Value(inGeom);
+ }
+ }
+ }
+ return theInserter.first->second;
+ }
+
+ virtual NVRenderShaderProgram *
+ CompileProgram(CRegisteredString inKey, const char8_t *inVert, const char8_t *inFrag,
+ const char8_t *inTessCtrl, const char8_t *inTessEval, const char8_t *inGeom,
+ const SShaderCacheProgramFlags &inFlags,
+ NVConstDataRef<SShaderPreprocessorFeature> inFeatures, bool separableProgram) override
+ {
+ NVRenderShaderProgram *theProgram = GetProgram(inKey, inFeatures);
+ if (theProgram)
+ return theProgram;
+
+ NVRenderShaderProgram *retval =
+ ForceCompileProgram(inKey, inVert, inFrag, inTessCtrl, inTessEval, inGeom, inFlags,
+ inFeatures, separableProgram);
+ if (m_CacheFilePath.c_str() && m_ShaderCache && m_ShaderCompilationEnabled) {
+ CFileSeekableIOStream theStream(m_CacheFilePath.c_str(), FileWriteFlags());
+ if (theStream.IsOpen()) {
+ NVScopedRefCounted<IStringTable> theStringTable(
+ IStringTable::CreateStringTable(m_RenderContext.GetAllocator()));
+ CDOMSerializer::WriteXMLHeader(theStream);
+ CDOMSerializer::Write(m_RenderContext.GetAllocator(),
+ *m_ShaderCache->GetTopElement(), theStream, *theStringTable);
+ }
+ }
+ return retval;
+ }
+
+ void BootupDOMWriter()
+ {
+ NVScopedRefCounted<IStringTable> theStringTable(
+ IStringTable::CreateStringTable(m_RenderContext.GetAllocator()));
+ m_ShaderCache = IDOMWriter::CreateDOMWriter(m_RenderContext.GetAllocator(),
+ "Qt3DSShaderCache", theStringTable)
+ .first;
+ m_ShaderCache->Att("cache_version", IShaderCache::GetShaderVersion());
+ }
+
+ void SetShaderCachePersistenceEnabled(const char8_t *inDirectory) override
+ {
+ if (inDirectory == NULL) {
+ m_ShaderCache = NULL;
+ return;
+ }
+ BootupDOMWriter();
+ m_CacheFilePath = QDir(inDirectory).filePath(GetShaderCacheFileName());
+
+ NVScopedRefCounted<IRefCountedInputStream> theInStream =
+ m_InputStreamFactory.GetStreamForFile(m_CacheFilePath.c_str());
+ if (theInStream) {
+ SStackPerfTimer __perfTimer(m_PerfTimer, "ShaderCache - Load");
+ NVScopedRefCounted<IStringTable> theStringTable(
+ IStringTable::CreateStringTable(m_RenderContext.GetAllocator()));
+ NVScopedRefCounted<IDOMFactory> theFactory(
+ IDOMFactory::CreateDOMFactory(m_RenderContext.GetAllocator(), theStringTable));
+ eastl::vector<SShaderPreprocessorFeature> theFeatures;
+
+ SDOMElement *theElem = CDOMSerializer::Read(*theFactory, *theInStream).second;
+ if (theElem) {
+ NVScopedRefCounted<IDOMReader> theReader = IDOMReader::CreateDOMReader(
+ m_RenderContext.GetAllocator(), *theElem, theStringTable, theFactory);
+ QT3DSU32 theAttValue = 0;
+ theReader->Att("cache_version", theAttValue);
+ if (theAttValue == IShaderCache::GetShaderVersion()) {
+ Qt3DSString loadVertexData;
+ Qt3DSString loadFragmentData;
+ Qt3DSString loadTessControlData;
+ Qt3DSString loadTessEvalData;
+ Qt3DSString loadGeometryData;
+ Qt3DSString shaderTypeString;
+ IStringTable &theStringTable(m_RenderContext.GetStringTable());
+ for (bool success = theReader->MoveToFirstChild(); success;
+ success = theReader->MoveToNextSibling()) {
+ const char8_t *theKeyStr = NULL;
+ theReader->UnregisteredAtt("key", theKeyStr);
+
+ CRegisteredString theKey = theStringTable.RegisterStr(theKeyStr);
+ if (theKey.IsValid()) {
+ m_FlagString.clear();
+ const char8_t *theFlagStr = "";
+ SShaderCacheProgramFlags theFlags;
+ if (theReader->UnregisteredAtt("glflags", theFlagStr)) {
+ m_FlagString.assign(theFlagStr);
+ theFlags = CacheFlagsToStr(m_FlagString);
+ }
+
+ m_ContextTypeString.clear();
+ if (theReader->UnregisteredAtt("gl-context-type", theFlagStr))
+ m_ContextTypeString.assign(theFlagStr);
+
+ theFeatures.clear();
+ {
+ IDOMReader::Scope __featureScope(*theReader);
+ if (theReader->MoveToFirstChild("Features")) {
+ for (SDOMAttribute *theAttribute =
+ theReader->GetFirstAttribute();
+ theAttribute;
+ theAttribute = theAttribute->m_NextAttribute) {
+ bool featureValue = false;
+ StringConversion<bool>().StrTo(theAttribute->m_Value,
+ featureValue);
+ theFeatures.push_back(SShaderPreprocessorFeature(
+ theStringTable.RegisterStr(
+ theAttribute->m_Name.c_str()),
+ featureValue));
+ }
+ }
+ }
+
+ qt3ds::render::NVRenderContextType theContextType =
+ StringToContextType(m_ContextTypeString);
+ if (((QT3DSU32)theContextType != 0)
+ && (theContextType & m_RenderContext.GetRenderContextType())
+ == theContextType) {
+ IDOMReader::Scope __readerScope(*theReader);
+ loadVertexData.clear();
+ loadFragmentData.clear();
+ loadTessControlData.clear();
+ loadTessEvalData.clear();
+ loadGeometryData.clear();
+
+ // Vertex *MUST* be the first
+ // Todo deal with pure compute shader programs
+ if (theReader->MoveToFirstChild("VertexCode")) {
+ const char8_t *theValue = NULL;
+ theReader->Value(theValue);
+ loadVertexData.assign(theValue);
+ while (theReader->MoveToNextSibling()) {
+ theReader->Value(theValue);
+
+ shaderTypeString.assign(
+ theReader->GetElementName().c_str());
+ ShaderType::Enum shaderType =
+ StringToShaderType(shaderTypeString);
+
+ if (shaderType == ShaderType::Fragment)
+ loadFragmentData.assign(theValue);
+ else if (shaderType == ShaderType::TessControl)
+ loadTessControlData.assign(theValue);
+ else if (shaderType == ShaderType::TessEval)
+ loadTessEvalData.assign(theValue);
+ else if (shaderType == ShaderType::Geometry)
+ loadGeometryData.assign(theValue);
+ }
+ }
+
+ if (loadVertexData.size()
+ && (loadFragmentData.size() || loadGeometryData.size())) {
+
+ NVRenderShaderProgram *theShader = ForceCompileProgram(
+ theKey, loadVertexData.c_str(), loadFragmentData.c_str(),
+ loadTessControlData.c_str(), loadTessEvalData.c_str(),
+ loadGeometryData.c_str(), theFlags,
+ qt3ds::foundation::toDataRef(theFeatures.data(),
+ (QT3DSU32)theFeatures.size()),
+ false, true /*fromDisk*/);
+ // If something doesn't save or load correctly, get the runtime
+ // to re-generate.
+ if (!theShader)
+ m_Shaders.erase(theKey);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ bool IsShaderCachePersistenceEnabled() const override { return m_ShaderCache != NULL; }
+
+ void SetShaderCompilationEnabled(bool inEnableShaderCompilation) override
+ {
+ m_ShaderCompilationEnabled = inEnableShaderCompilation;
+ }
+};
+}
+
+size_t qt3ds::render::HashShaderFeatureSet(NVConstDataRef<SShaderPreprocessorFeature> inFeatureSet)
+{
+ size_t retval(0);
+ for (QT3DSU32 idx = 0, end = inFeatureSet.size(); idx < end; ++idx) {
+ // From previous implementation, it seems we need to ignore the order of the features.
+ // But we need to bind the feature flag together with its name, so that the flags will
+ // influence
+ // the final hash not only by the true-value count.
+ retval = retval
+ ^ (inFeatureSet[idx].m_Name.hash() * eastl::hash<bool>()(inFeatureSet[idx].m_Enabled));
+ }
+ return retval;
+}
+
+bool SShaderPreprocessorFeature::operator<(const SShaderPreprocessorFeature &other) const
+{
+ return strcmp(m_Name.c_str(), other.m_Name.c_str()) < 0;
+}
+
+bool SShaderPreprocessorFeature::operator==(const SShaderPreprocessorFeature &other) const
+{
+ return m_Name == other.m_Name && m_Enabled == other.m_Enabled;
+}
+
+IShaderCache &IShaderCache::CreateShaderCache(NVRenderContext &inContext,
+ IInputStreamFactory &inInputStreamFactory,
+ IPerfTimer &inPerfTimer)
+{
+ return *QT3DS_NEW(inContext.GetAllocator(), ShaderCache)(inContext, inInputStreamFactory,
+ inPerfTimer);
+}
diff --git a/src/runtimerender/Qt3DSRenderShaderCache.h b/src/runtimerender/Qt3DSRenderShaderCache.h
new file mode 100644
index 0000000..47e76f3
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShaderCache.h
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_CACHE_H
+#define QT3DS_RENDER_SHADER_CACHE_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace render {
+ struct ShaderCacheProgramFlagValues
+ {
+ enum Enum {
+ TessellationEnabled = 1 << 0, // tessellation enabled
+ GeometryShaderEnabled = 1 << 1, // geometry shader enabled
+ };
+ };
+ struct SShaderCacheProgramFlags : public NVFlags<ShaderCacheProgramFlagValues::Enum, QT3DSU32>
+ {
+ // tessellation enabled
+ void SetTessellationEnabled(bool inValue)
+ {
+ clearOrSet(inValue, ShaderCacheProgramFlagValues::TessellationEnabled);
+ }
+ bool IsTessellationEnabled() const
+ {
+ return this->operator&(ShaderCacheProgramFlagValues::TessellationEnabled);
+ }
+ // geometry shader enabled
+ void SetGeometryShaderEnabled(bool inValue)
+ {
+ clearOrSet(inValue, ShaderCacheProgramFlagValues::GeometryShaderEnabled);
+ }
+ bool IsGeometryShaderEnabled() const
+ {
+ return this->operator&(ShaderCacheProgramFlagValues::GeometryShaderEnabled);
+ }
+ };
+ // There are a number of macros used to turn on or off various features. This allows those
+ // features
+ // to be propagated into the shader cache's caching mechanism. They will be translated into
+ //#define name value where value is 1 or zero depending on if the feature is enabled or not.
+ struct SShaderPreprocessorFeature
+ {
+ CRegisteredString m_Name;
+ bool m_Enabled;
+ SShaderPreprocessorFeature()
+ : m_Enabled(false)
+ {
+ }
+ SShaderPreprocessorFeature(CRegisteredString name, bool val)
+ : m_Name(name)
+ , m_Enabled(val)
+ {
+ }
+ bool operator<(const SShaderPreprocessorFeature &inOther) const;
+ bool operator==(const SShaderPreprocessorFeature &inOther) const;
+ };
+
+ typedef NVConstDataRef<SShaderPreprocessorFeature> TShaderFeatureSet;
+
+ inline TShaderFeatureSet ShaderCacheNoFeatures() { return TShaderFeatureSet(); }
+
+ // Hash is dependent on the order of the keys; so make sure their order is consistent!!
+ size_t HashShaderFeatureSet(NVConstDataRef<SShaderPreprocessorFeature> inFeatureSet);
+
+ class IShaderCache : public NVRefCounted
+ {
+ protected:
+ virtual ~IShaderCache() {}
+ public:
+ // If directory is nonnull, then we attempt to load any shaders from shadercache.xml in
+ // inDirectory
+ // and save any new ones out to the same file. The shaders are marked by the gl version
+ // used when saving.
+ // If we can't open shadercache.xml from inDirectory for writing (at least), then we still
+ // consider the
+ // shadercache to be disabled.
+ // This call immediately blocks and attempts to load all applicable shaders from the
+ // shadercache.xml file in
+ // the given directory.
+ virtual void SetShaderCachePersistenceEnabled(const char8_t *inDirectory) = 0;
+ virtual bool IsShaderCachePersistenceEnabled() const = 0;
+ // It is up to the caller to ensure that inFeatures contains unique keys.
+ // It is also up the the caller to ensure the keys are ordered in some way.
+ virtual NVRenderShaderProgram *
+ GetProgram(CRegisteredString inKey,
+ NVConstDataRef<SShaderPreprocessorFeature> inFeatures) = 0;
+
+ // Replace an existing program in the cache for the same key with this program.
+ // The shaders returned by *CompileProgram functions can be released by this object
+ // due to ForceCompileProgram or SetProjectDirectory, so clients need to either not
+ // hold on to them or they need to addref/release them to ensure they still have
+ // access to them.
+ // The flags just tell us under what gl state to compile the program in order to hopefully
+ // reduce program compilations.
+ // It is up to the caller to ensure that inFeatures contains unique keys.
+ // It is also up the the caller to ensure the keys are ordered in some way.
+ virtual NVRenderShaderProgram *
+ ForceCompileProgram(CRegisteredString inKey, const char8_t *inVert, const char8_t *inFrag,
+ const char8_t *inTessCtrl, const char8_t *inTessEval,
+ const char8_t *inGeom, const SShaderCacheProgramFlags &inFlags,
+ TShaderFeatureSet inFeatures, bool separableProgram,
+ bool fromDisk = false) = 0;
+
+ // It is up to the caller to ensure that inFeatures contains unique keys.
+ // It is also up the the caller to ensure the keys are ordered in some way.
+ virtual NVRenderShaderProgram *
+ CompileProgram(CRegisteredString inKey, const char8_t *inVert, const char8_t *inFrag,
+ const char8_t *inTessCtrl, const char8_t *inTessEval, const char8_t *inGeom,
+ const SShaderCacheProgramFlags &inFlags, TShaderFeatureSet inFeatures,
+ bool separableProgram = false) = 0;
+
+ // Used to disable any shader compilation during loading. This is used when we are just
+ // interested in going from uia->binary
+ // and we expect to run on a headless server of sorts. See the UICCompiler project for its
+ // only current use case.
+ virtual void SetShaderCompilationEnabled(bool inEnableShaderCompilation) = 0;
+
+ // Upping the shader version invalidates all previous cache files.
+ static QT3DSU32 GetShaderVersion() { return 4; }
+ static const char8_t *GetShaderCacheFileName() { return "shadercache.xml"; }
+
+ static IShaderCache &CreateShaderCache(NVRenderContext &inContext,
+ IInputStreamFactory &inInputStreamFactory,
+ IPerfTimer &inPerfTimer);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderShaderCodeGenerator.cpp b/src/runtimerender/Qt3DSRenderShaderCodeGenerator.cpp
new file mode 100644
index 0000000..d84c37d
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShaderCodeGenerator.cpp
@@ -0,0 +1,526 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderShaderCodeGenerator.h"
+
+using namespace qt3ds::render;
+
+using eastl::make_pair;
+
+SShaderCodeGeneratorBase::SShaderCodeGeneratorBase(IStringTable &inStringTable,
+ NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType)
+ : m_StringTable(inStringTable)
+ , m_Codes(alloc, "SShaderCodeGenerator::m_Codes")
+ , m_Includes(alloc, "SShaderCodeGenerator::m_Includes")
+ , m_Uniforms(alloc, "SShaderCodeGenerator::m_Uniforms")
+ , m_ConstantBuffers(alloc, "SShaderCodeGenerator::m_ConstantBuffers")
+ , m_ConstantBufferParams(alloc, "SShaderCodeGenerator::m_ConstantBufferParams")
+ , m_Attributes(alloc, "SShaderCodeGenerator::m_Uniforms")
+ , m_RenderContextType(ctxType)
+{
+}
+void SShaderCodeGeneratorBase::Begin()
+{
+ m_Uniforms.clear();
+ GetVaryings().clear();
+ m_Attributes.clear();
+ m_Includes.clear();
+ m_Codes.clear();
+ m_FinalShaderBuilder.clear();
+ m_CodeBuilder.clear();
+ m_ConstantBuffers.clear();
+ m_ConstantBufferParams.clear();
+}
+void SShaderCodeGeneratorBase::Append(const char *data)
+{
+ m_CodeBuilder.append(data);
+ m_CodeBuilder.append("\n");
+}
+// don't add the newline
+void SShaderCodeGeneratorBase::AppendPartial(const char *data)
+{
+ m_CodeBuilder.append(data);
+}
+void SShaderCodeGeneratorBase::AddUniform(const char *name, const char *type)
+{
+ m_Uniforms.insert(make_pair(m_StringTable.RegisterStr(name), m_StringTable.RegisterStr(type)));
+}
+void SShaderCodeGeneratorBase::AddUniform(TStrType &name, const char *type)
+{
+ AddUniform(name.c_str(), type);
+}
+
+void SShaderCodeGeneratorBase::AddConstantBuffer(const char *name, const char *layout)
+{
+ m_ConstantBuffers.insert(
+ make_pair(m_StringTable.RegisterStr(name), m_StringTable.RegisterStr(layout)));
+}
+void SShaderCodeGeneratorBase::AddConstantBufferParam(const char *cbName, const char *paramName,
+ const char *type)
+{
+ TParamPair theParamPair(m_StringTable.RegisterStr(paramName), m_StringTable.RegisterStr(type));
+ TConstantBufferParamPair theBufferParamPair(m_StringTable.RegisterStr(cbName), theParamPair);
+ m_ConstantBufferParams.push_back(theBufferParamPair);
+}
+void SShaderCodeGeneratorBase::AddAttribute(const char *name, const char *type)
+{
+ m_Attributes.insert(
+ make_pair(m_StringTable.RegisterStr(name), m_StringTable.RegisterStr(type)));
+}
+void SShaderCodeGeneratorBase::AddAttribute(TStrType &name, const char *type)
+{
+ AddAttribute(name.c_str(), type);
+}
+void SShaderCodeGeneratorBase::AddVarying(const char *name, const char *type)
+{
+ GetVaryings().insert(
+ make_pair(m_StringTable.RegisterStr(name), m_StringTable.RegisterStr(type)));
+}
+void SShaderCodeGeneratorBase::AddVarying(TStrType &name, const char *type)
+{
+ AddVarying(name.c_str(), type);
+}
+void SShaderCodeGeneratorBase::AddLocalVariable(const char *name, const char *type, int tabCount)
+{
+ for (; tabCount >= 0; --tabCount)
+ m_CodeBuilder.append("\t");
+ m_CodeBuilder.append(type);
+ m_CodeBuilder.append(" ");
+ m_CodeBuilder.append(name);
+ m_CodeBuilder.append(";\n");
+}
+
+void SShaderCodeGeneratorBase::AddInclude(const char *name)
+{
+ m_Includes.insert(m_StringTable.RegisterStr(name));
+}
+void SShaderCodeGeneratorBase::AddInclude(TStrType &name)
+{
+ AddInclude(name.c_str());
+}
+void SShaderCodeGeneratorBase::AddLocalVariable(TStrType &name, const char *type, int tabCount)
+{
+ AddLocalVariable(name.c_str(), type, tabCount);
+}
+bool SShaderCodeGeneratorBase::HasCode(Enum value)
+{
+ return m_Codes.contains(value);
+}
+void SShaderCodeGeneratorBase::SetCode(Enum value)
+{
+ m_Codes.insert((QT3DSU32)value);
+}
+
+void SShaderCodeGeneratorBase::SetupWorldPosition()
+{
+ if (!HasCode(WorldPosition)) {
+ SetCode(WorldPosition);
+ AddUniform("model_matrix", "mat4");
+ Append("\tvec3 varWorldPos = (model_matrix * vec4(attr_pos, 1.0)).xyz;");
+ }
+}
+
+void SShaderCodeGeneratorBase::GenerateViewVector()
+{
+ if (!HasCode(ViewVector)) {
+ SetCode(ViewVector);
+ SetupWorldPosition();
+ AddInclude("viewProperties.glsllib");
+ Append("\tvec3 view_vector = normalize(camera_position - varWorldPos);");
+ }
+}
+
+void SShaderCodeGeneratorBase::GenerateWorldNormal()
+{
+ if (!HasCode(WorldNormal)) {
+ SetCode(WorldNormal);
+ AddAttribute("attr_norm", "vec3");
+ AddUniform("normal_matrix", "mat3");
+ Append("\tvec3 world_normal = normalize(normal_matrix * objectNormal).xyz;");
+ }
+}
+
+void SShaderCodeGeneratorBase::GenerateEnvMapReflection(SShaderCodeGeneratorBase &inFragmentShader)
+{
+ if (!HasCode(EnvMapReflection)) {
+ SetCode(EnvMapReflection);
+ SetupWorldPosition();
+ GenerateWorldNormal();
+ AddInclude("viewProperties.glsllib");
+ AddVarying("var_object_to_camera", "vec3");
+ Append("\tvar_object_to_camera = normalize( varWorldPos - camera_position );");
+ // World normal cannot be relied upon in the vertex shader because of bump maps.
+ inFragmentShader.Append("\tvec3 environment_map_reflection = reflect( "
+ "vec3(var_object_to_camera.x, var_object_to_camera.y, "
+ "var_object_to_camera.z), world_normal.xyz );");
+ inFragmentShader.Append("\tenvironment_map_reflection *= vec3( 0.5, 0.5, 0 );");
+ inFragmentShader.Append("\tenvironment_map_reflection += vec3( 0.5, 0.5, 1.0 );");
+ }
+}
+
+void SShaderCodeGeneratorBase::GenerateUVCoords()
+{
+ if (!HasCode(UVCoords)) {
+ SetCode(UVCoords);
+ AddAttribute("attr_uv0", "vec2");
+ Append("\tvec2 uv_coords = attr_uv0;");
+ }
+}
+
+void SShaderCodeGeneratorBase::GenerateTextureSwizzle(NVRenderTextureSwizzleMode::Enum swizzleMode,
+ eastl::basic_string<char8_t> &texSwizzle,
+ eastl::basic_string<char8_t> &lookupSwizzle)
+{
+ qt3ds::render::NVRenderContextType deprecatedContextFlags(NVRenderContextValues::GL2
+ | NVRenderContextValues::GLES2);
+
+ if (!(m_RenderContextType & deprecatedContextFlags)) {
+ switch (swizzleMode) {
+ case NVRenderTextureSwizzleMode::L8toR8:
+ case NVRenderTextureSwizzleMode::L16toR16:
+ texSwizzle.append(".rgb");
+ lookupSwizzle.append(".rrr");
+ break;
+ case NVRenderTextureSwizzleMode::L8A8toRG8:
+ texSwizzle.append(".rgba");
+ lookupSwizzle.append(".rrrg");
+ break;
+ case NVRenderTextureSwizzleMode::A8toR8:
+ texSwizzle.append(".a");
+ lookupSwizzle.append(".r");
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void SShaderCodeGeneratorBase::GenerateShadedWireframeBase()
+{
+ // how this all work see
+ // http://developer.download.nvidia.com/SDK/10.5/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf
+ Append("// project points to screen space\n"
+ "\tvec3 p0 = vec3(viewport_matrix * (gl_in[0].gl_Position / gl_in[0].gl_Position.w));\n"
+ "\tvec3 p1 = vec3(viewport_matrix * (gl_in[1].gl_Position / gl_in[1].gl_Position.w));\n"
+ "\tvec3 p2 = vec3(viewport_matrix * (gl_in[2].gl_Position / gl_in[2].gl_Position.w));\n"
+ "// compute triangle heights\n"
+ "\tfloat e1 = length(p1 - p2);\n"
+ "\tfloat e2 = length(p2 - p0);\n"
+ "\tfloat e3 = length(p1 - p0);\n"
+ "\tfloat alpha = acos( (e2*e2 + e3*e3 - e1*e1) / (2.0*e2*e3) );\n"
+ "\tfloat beta = acos( (e1*e1 + e3*e3 - e2*e2) / (2.0*e1*e3) );\n"
+ "\tfloat ha = abs( e3 * sin( beta ) );\n"
+ "\tfloat hb = abs( e3 * sin( alpha ) );\n"
+ "\tfloat hc = abs( e2 * sin( alpha ) );\n");
+}
+
+void SShaderCodeGeneratorBase::AddShaderItemMap(const char *itemType,
+ const TStrTableStrMap &itemMap)
+{
+ m_FinalShaderBuilder.append("\n");
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end(); iter != end;
+ ++iter) {
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(";\n");
+ }
+}
+
+void SShaderCodeGeneratorBase::AddShaderConstantBufferItemMap(
+ const char *itemType, const TStrTableStrMap &cbMap, TConstantBufferParamArray cbParamsArray)
+{
+ m_FinalShaderBuilder.append("\n");
+
+ // iterate over all constant buffers
+ for (TStrTableStrMap::const_iterator iter = cbMap.begin(), end = cbMap.end(); iter != end;
+ ++iter) {
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(" {\n");
+ // iterate over all param entries and add match
+ for (TConstantBufferParamArray::const_iterator iter1 = cbParamsArray.begin(),
+ end = cbParamsArray.end();
+ iter1 != end; ++iter1) {
+ if (iter1->first == iter->first) {
+ m_FinalShaderBuilder.append(iter1->second.second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter1->second.first);
+ m_FinalShaderBuilder.append(";\n");
+ }
+ }
+
+ m_FinalShaderBuilder.append("};\n");
+ }
+}
+
+const char *SShaderCodeGeneratorBase::BuildShaderSource()
+{
+ for (nvhash_set<CRegisteredString>::const_iterator iter = m_Includes.begin(),
+ end = m_Includes.end();
+ iter != end; ++iter) {
+ m_FinalShaderBuilder.append("#include \"");
+ m_FinalShaderBuilder.append(iter->c_str());
+ m_FinalShaderBuilder.append("\"\n");
+ }
+ AddShaderItemMap("attribute", m_Attributes);
+ AddShaderItemMap("uniform", m_Uniforms);
+ AddShaderConstantBufferItemMap("uniform", m_ConstantBuffers, m_ConstantBufferParams);
+ AddShaderItemMap("varying", GetVaryings());
+ m_FinalShaderBuilder.append("\n");
+ m_FinalShaderBuilder.append(m_CodeBuilder.c_str());
+ return m_FinalShaderBuilder.c_str();
+}
+SShaderCodeGeneratorBase &SShaderCodeGeneratorBase::operator<<(const char *data)
+{
+ m_CodeBuilder.append(data);
+ return *this;
+}
+SShaderCodeGeneratorBase &SShaderCodeGeneratorBase::operator<<(const TStrType &data)
+{
+ m_CodeBuilder.append(data);
+ return *this;
+}
+
+SShaderCodeGeneratorBase &SShaderCodeGeneratorBase::operator<<(const SEndlType & /*data*/)
+{
+ m_CodeBuilder.append("\n");
+ return *this;
+}
+
+SShaderVertexCodeGenerator::SShaderVertexCodeGenerator(IStringTable &inStringTable,
+ NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType)
+ : SShaderCodeGeneratorBase(inStringTable, alloc, ctxType)
+ , m_Varyings(alloc, "SShaderVertexCodeGenerator::m_Varyings")
+{
+}
+TStrTableStrMap &SShaderVertexCodeGenerator::GetVaryings()
+{
+ return m_Varyings;
+}
+
+SShaderTessControlCodeGenerator::SShaderTessControlCodeGenerator(
+ SShaderVertexCodeGenerator &vert, NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType)
+ : SShaderCodeGeneratorBase(vert.m_StringTable, alloc, ctxType)
+ , m_VertGenerator(vert)
+ , m_Varyings(alloc, "SShaderTessControlCodeGenerator::m_Varyings")
+{
+}
+
+// overwritten from base
+void SShaderTessControlCodeGenerator::AddShaderItemMap(const char *itemType,
+ const TStrTableStrMap &itemMap)
+{
+ eastl::string extVtx("");
+ eastl::string extTC("");
+ eastl::string type(itemType);
+ if (!type.compare("varying")) {
+ extVtx = "[]";
+ extTC = "TC[]";
+ itemType = "attribute";
+ }
+
+ m_FinalShaderBuilder.append("\n");
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end(); iter != end;
+ ++iter) {
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(extVtx.c_str());
+ m_FinalShaderBuilder.append(";\n");
+ }
+
+ // if this is varyings write output of tess control shader
+ if (!extVtx.empty()) {
+ m_FinalShaderBuilder.append("\n");
+ itemType = "varying";
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end();
+ iter != end; ++iter) {
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(extTC.c_str());
+ m_FinalShaderBuilder.append(";\n");
+ }
+ }
+}
+TStrTableStrMap &SShaderTessControlCodeGenerator::GetVaryings()
+{
+ return m_VertGenerator.m_Varyings;
+}
+
+SShaderTessEvalCodeGenerator::SShaderTessEvalCodeGenerator(SShaderTessControlCodeGenerator &tc,
+ NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType)
+ : SShaderCodeGeneratorBase(tc.m_StringTable, alloc, ctxType)
+ , m_TessControlGenerator(tc)
+ , m_hasGeometryStage(false)
+{
+}
+// overwritten from base
+void SShaderTessEvalCodeGenerator::AddShaderItemMap(const char *itemType,
+ const TStrTableStrMap &itemMap)
+{
+ eastl::string extTC("");
+ eastl::string extTE("");
+ eastl::string type(itemType);
+ if (!type.compare("varying")) {
+ extTC = "TC[]";
+ itemType = "attribute";
+ }
+ if (m_hasGeometryStage) {
+ extTE = "TE";
+ }
+
+ m_FinalShaderBuilder.append("\n");
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end(); iter != end;
+ ++iter) {
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(extTC.c_str());
+ m_FinalShaderBuilder.append(";\n");
+ }
+
+ // if this are varyings write output of tess eval shader
+ if (!extTC.empty()) {
+ m_FinalShaderBuilder.append("\n");
+ itemType = "varying";
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end();
+ iter != end; ++iter) {
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(extTE.c_str());
+ m_FinalShaderBuilder.append(";\n");
+ }
+ }
+}
+TStrTableStrMap &SShaderTessEvalCodeGenerator::GetVaryings()
+{
+ return m_TessControlGenerator.m_VertGenerator.GetVaryings();
+}
+void SShaderTessEvalCodeGenerator::SetGeometryStage(bool hasGeometryStage)
+{
+ m_hasGeometryStage = hasGeometryStage;
+}
+
+SShaderGeometryCodeGenerator::SShaderGeometryCodeGenerator(SShaderVertexCodeGenerator &vert,
+ NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType)
+ : SShaderCodeGeneratorBase(vert.m_StringTable, alloc, ctxType)
+ , m_VertGenerator(vert)
+ , m_hasTessellationStage(true)
+{
+}
+
+// overwritten from base
+void SShaderGeometryCodeGenerator::AddShaderItemMap(const char *itemType,
+ const TStrTableStrMap &itemMap)
+{
+ eastl::string inExt("");
+ eastl::string type(itemType);
+ if (!type.compare("varying")) {
+ itemType = "attribute";
+ if (m_hasTessellationStage)
+ inExt = "TE[]";
+ else
+ inExt = "[]";
+ }
+
+ m_FinalShaderBuilder.append("\n");
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end(); iter != end;
+ ++iter) {
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(inExt.c_str());
+ m_FinalShaderBuilder.append(";\n");
+ }
+
+ // if this are varyings write output of geometry shader
+ if (!type.compare("varying")) {
+ m_FinalShaderBuilder.append("\n");
+ itemType = "varying";
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end();
+ iter != end; ++iter) {
+ m_FinalShaderBuilder.append(itemType);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->second);
+ m_FinalShaderBuilder.append(" ");
+ m_FinalShaderBuilder.append(iter->first);
+ m_FinalShaderBuilder.append(";\n");
+ }
+ }
+}
+TStrTableStrMap &SShaderGeometryCodeGenerator::GetVaryings()
+{
+ return m_VertGenerator.m_Varyings;
+}
+void SShaderGeometryCodeGenerator::SetTessellationStage(bool hasTessellationStage)
+{
+ m_hasTessellationStage = hasTessellationStage;
+}
+
+SShaderFragmentCodeGenerator::SShaderFragmentCodeGenerator(SShaderVertexCodeGenerator &vert,
+ NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType)
+ : SShaderCodeGeneratorBase(vert.m_StringTable, alloc, ctxType)
+ , m_VertGenerator(vert)
+{
+}
+TStrTableStrMap &SShaderFragmentCodeGenerator::GetVaryings()
+{
+ return m_VertGenerator.m_Varyings;
+}
diff --git a/src/runtimerender/Qt3DSRenderShaderCodeGenerator.h b/src/runtimerender/Qt3DSRenderShaderCodeGenerator.h
new file mode 100644
index 0000000..d68a369
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShaderCodeGenerator.h
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_CODE_GENERATOR_H
+#define QT3DS_RENDER_SHADER_CODE_GENERATOR_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSContainers.h"
+#include "EASTL/string.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "StringTools.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SEndlType
+ {
+ };
+ extern SEndlType Endl;
+
+ typedef std::basic_string<char> TStrType;
+ typedef eastl::pair<CRegisteredString, CRegisteredString> TParamPair;
+ typedef eastl::pair<CRegisteredString, TParamPair> TConstantBufferParamPair;
+ typedef nvvector<TConstantBufferParamPair> TConstantBufferParamArray;
+ typedef nvhash_map<CRegisteredString, CRegisteredString> TStrTableStrMap;
+
+ struct SShaderCodeGeneratorBase
+ {
+ enum Enum {
+ Unknown = 0,
+ Lighting,
+ ViewVector,
+ WorldNormal,
+ WorldPosition,
+ EnvMapReflection,
+ UVCoords,
+ };
+ IStringTable &m_StringTable;
+ nvhash_set<QT3DSU32> m_Codes; // set of enums we have included.
+ nvhash_set<CRegisteredString> m_Includes;
+ TStrTableStrMap m_Uniforms;
+ TStrTableStrMap m_ConstantBuffers;
+ TConstantBufferParamArray m_ConstantBufferParams;
+ TStrTableStrMap m_Attributes;
+ Qt3DSString m_FinalShaderBuilder;
+ TStrType m_CodeBuilder;
+ qt3ds::render::NVRenderContextType m_RenderContextType;
+
+ SShaderCodeGeneratorBase(IStringTable &inStringTable, NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType);
+ virtual TStrTableStrMap &GetVaryings() = 0;
+ void Begin();
+ void Append(const char *data);
+ // don't add the newline
+ void AppendPartial(const char *data);
+ void AddConstantBuffer(const char *name, const char *layout);
+ void AddConstantBufferParam(const char *cbName, const char *paramName, const char *type);
+ void AddUniform(const char *name, const char *type);
+ void AddUniform(TStrType &name, const char *type);
+ void AddAttribute(const char *name, const char *type);
+ void AddAttribute(TStrType &name, const char *type);
+ void AddVarying(const char *name, const char *type);
+ void AddVarying(TStrType &name, const char *type);
+ void AddLocalVariable(const char *name, const char *type, int tabCount = 1);
+ void AddLocalVariable(TStrType &name, const char *type, int tabCount = 1);
+ void AddInclude(const char *name);
+ void AddInclude(TStrType &name);
+ bool HasCode(Enum value);
+ void SetCode(Enum value);
+ void SetupWorldPosition();
+ void GenerateViewVector();
+ void GenerateWorldNormal();
+ void GenerateEnvMapReflection(SShaderCodeGeneratorBase &inFragmentShader);
+ void GenerateUVCoords();
+ void GenerateTextureSwizzle(NVRenderTextureSwizzleMode::Enum swizzleMode,
+ eastl::basic_string<char8_t> &texSwizzle,
+ eastl::basic_string<char8_t> &lookupSwizzle);
+ void GenerateShadedWireframeBase();
+ void AddLighting();
+ const char *BuildShaderSource();
+ SShaderCodeGeneratorBase &operator<<(const char *data);
+ SShaderCodeGeneratorBase &operator<<(const TStrType &data);
+ SShaderCodeGeneratorBase &operator<<(const SEndlType & /*data*/);
+
+ protected:
+ virtual void AddShaderItemMap(const char *itemType, const TStrTableStrMap &itemMap);
+ void AddShaderConstantBufferItemMap(const char *itemType, const TStrTableStrMap &cbMap,
+ TConstantBufferParamArray cbParamsArray);
+ };
+
+ struct SShaderVertexCodeGenerator : public SShaderCodeGeneratorBase
+ {
+ TStrTableStrMap m_Varyings;
+ SShaderVertexCodeGenerator(IStringTable &inStringTable, NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType);
+ TStrTableStrMap &GetVaryings() override;
+ };
+
+ struct SShaderTessControlCodeGenerator : public SShaderCodeGeneratorBase
+ {
+ SShaderVertexCodeGenerator &m_VertGenerator;
+ TStrTableStrMap m_Varyings;
+ SShaderTessControlCodeGenerator(SShaderVertexCodeGenerator &vert,
+ NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType);
+
+ void AddShaderItemMap(const char *itemType, const TStrTableStrMap &itemMap) override;
+ TStrTableStrMap &GetVaryings() override;
+ };
+
+ struct SShaderTessEvalCodeGenerator : public SShaderCodeGeneratorBase
+ {
+ SShaderTessControlCodeGenerator &m_TessControlGenerator;
+ bool m_hasGeometryStage;
+
+ SShaderTessEvalCodeGenerator(SShaderTessControlCodeGenerator &tc,
+ NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType);
+
+ void AddShaderItemMap(const char *itemType, const TStrTableStrMap &itemMap) override;
+ TStrTableStrMap &GetVaryings() override;
+ virtual void SetGeometryStage(bool hasGeometryStage);
+ };
+
+ struct SShaderGeometryCodeGenerator : public SShaderCodeGeneratorBase
+ {
+ SShaderVertexCodeGenerator &m_VertGenerator;
+ bool m_hasTessellationStage;
+
+ SShaderGeometryCodeGenerator(SShaderVertexCodeGenerator &vert, NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType);
+
+ void AddShaderItemMap(const char *itemType, const TStrTableStrMap &itemMap) override;
+ TStrTableStrMap &GetVaryings() override;
+ virtual void SetTessellationStage(bool hasTessellationStage);
+ };
+
+ struct SShaderFragmentCodeGenerator : public SShaderCodeGeneratorBase
+ {
+ SShaderVertexCodeGenerator &m_VertGenerator;
+ SShaderFragmentCodeGenerator(SShaderVertexCodeGenerator &vert, NVAllocatorCallback &alloc,
+ qt3ds::render::NVRenderContextType ctxType);
+ TStrTableStrMap &GetVaryings() override;
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.cpp b/src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.cpp
new file mode 100644
index 0000000..cfdf47a
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.cpp
@@ -0,0 +1,671 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSIntrinsics.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Utils.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+
+#include <QtGui/qopengl.h>
+
+using namespace qt3ds::render;
+
+namespace {
+struct SStageGeneratorBase : public IShaderStageGenerator
+{
+ NVFoundationBase &m_Foundation;
+ IStringTable &m_StringTable;
+ TStrTableStrMap m_Incoming;
+ TStrTableStrMap *m_Outgoing;
+ nvhash_set<CRegisteredString> m_Includes;
+ TStrTableStrMap m_Uniforms;
+ TStrTableStrMap m_ConstantBuffers;
+ TConstantBufferParamArray m_ConstantBufferParams;
+ Qt3DSString m_CodeBuilder;
+ Qt3DSString m_FinalBuilder;
+ ShaderGeneratorStages::Enum m_Stage;
+ TShaderGeneratorStageFlags m_EnabledStages;
+ QStringList m_addedFunctions;
+
+ SStageGeneratorBase(NVFoundationBase &inFnd, IStringTable &strTable,
+ ShaderGeneratorStages::Enum inStage)
+
+ : m_Foundation(inFnd)
+ , m_StringTable(strTable)
+ , m_Incoming(inFnd.getAllocator(), "m_Incoming")
+ , m_Outgoing(NULL)
+ , m_Includes(inFnd.getAllocator(), "m_Includes")
+ , m_Uniforms(inFnd.getAllocator(), "m_Uniforms")
+ , m_ConstantBuffers(inFnd.getAllocator(), "m_ConstantBuffers")
+ , m_ConstantBufferParams(inFnd.getAllocator(), "m_ConstantBufferParams")
+ , m_Stage(inStage)
+ {
+ }
+
+ virtual void Begin(TShaderGeneratorStageFlags inEnabledStages)
+ {
+ m_Incoming.clear();
+ m_Outgoing = NULL;
+ m_Includes.clear();
+ m_Uniforms.clear();
+ m_ConstantBuffers.clear();
+ m_ConstantBufferParams.clear();
+ m_CodeBuilder.clear();
+ m_FinalBuilder.clear();
+ m_EnabledStages = inEnabledStages;
+ m_addedFunctions.clear();
+ // the shared buffers will be cleared elsewhere.
+ }
+
+ CRegisteredString Str(const char8_t *var) { return m_StringTable.RegisterStr(var); }
+
+ void AddIncoming(const char8_t *name, const char8_t *type) override
+ {
+ m_Incoming.insert(eastl::make_pair(Str(name), Str(type)));
+ }
+
+ virtual const char8_t *GetIncomingVariableName()
+ {
+ return "in";
+ }
+
+ void AddIncoming(const TStrType &name, const char8_t *type) override
+ {
+ AddIncoming(name.c_str(), type);
+ }
+
+ void AddIncoming(const QString &name, const char8_t *type) override
+ {
+ AddIncoming(name.toUtf8().constData(), type);
+ }
+
+ void AddOutgoing(const char8_t *name, const char8_t *type) override
+ {
+ if (m_Outgoing == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ m_Outgoing->insert(eastl::make_pair(Str(name), Str(type)));
+ }
+
+ void AddOutgoing(const TStrType &name, const char8_t *type) override
+ {
+ AddOutgoing(name.c_str(), type);
+ }
+
+ void AddOutgoing(const QString &name, const char8_t *type) override
+ {
+ AddOutgoing(name.toUtf8().constData(), type);
+ }
+
+ void AddUniform(const char8_t *name, const char8_t *type) override
+ {
+ m_Uniforms.insert(eastl::make_pair(Str(name), Str(type)));
+ }
+
+ void AddUniform(const TStrType &name, const char8_t *type) override
+ {
+ AddUniform(name.c_str(), type);
+ }
+
+ void AddUniform(const QString &name, const char8_t *type) override
+ {
+ AddUniform(name.toUtf8().constData(), type);
+ }
+
+ void AddConstantBuffer(const char *name, const char *layout) override
+ {
+ m_ConstantBuffers.insert(eastl::make_pair(Str(name), Str(layout)));
+ }
+
+ void AddConstantBuffer(const QString &name, const char *layout) override
+ {
+ AddConstantBuffer(name.toUtf8().constData(), layout);
+ }
+
+ void AddConstantBufferParam(const char *cbName, const char *paramName,
+ const char *type) override
+ {
+ TParamPair theParamPair(m_StringTable.RegisterStr(paramName),
+ m_StringTable.RegisterStr(type));
+ TConstantBufferParamPair theBufferParamPair(m_StringTable.RegisterStr(cbName),
+ theParamPair);
+ m_ConstantBufferParams.push_back(theBufferParamPair);
+ }
+
+ void AddConstantBufferParam(const QString &cbName, const QString &paramName,
+ const char *type) override
+ {
+ AddConstantBufferParam(cbName.toUtf8().constData(), paramName.toUtf8().constData(), type);
+ }
+
+ IShaderStageGenerator &operator<<(const char *data) override
+ {
+ m_CodeBuilder.append(nonNull(data));
+ return *this;
+ }
+
+ IShaderStageGenerator &operator<<(const TStrType &data) override
+ {
+ m_CodeBuilder.append(data.c_str());
+ return *this;
+ }
+
+ IShaderStageGenerator &operator<<(const QString &data) override
+ {
+ m_CodeBuilder.append(data);
+ return *this;
+ }
+ IShaderStageGenerator &operator<<(const SEndlType & /*data*/) override
+ {
+ m_CodeBuilder.append("\n");
+ return *this;
+ }
+ void Append(const char *data) override
+ {
+ m_CodeBuilder.append(nonNull(data));
+ m_CodeBuilder.append("\n");
+ }
+ void AppendPartial(const char *data) override { m_CodeBuilder.append(nonNull(data)); }
+ ShaderGeneratorStages::Enum Stage() const override { return m_Stage; }
+
+ virtual void AddShaderItemMap(const char *itemType, const TStrTableStrMap &itemMap,
+ const char8_t *inItemSuffix = "")
+ {
+ m_FinalBuilder.append("\n");
+
+ for (TStrTableStrMap::const_iterator iter = itemMap.begin(), end = itemMap.end();
+ iter != end; ++iter) {
+ m_FinalBuilder.append(itemType);
+ m_FinalBuilder.append(" ");
+ m_FinalBuilder.append(iter->second);
+ m_FinalBuilder.append(" ");
+ m_FinalBuilder.append(iter->first);
+ m_FinalBuilder.append(inItemSuffix);
+ m_FinalBuilder.append(";\n");
+ }
+ }
+
+ virtual void AddShaderIncomingMap() { AddShaderItemMap(GetIncomingVariableName(), m_Incoming); }
+
+ virtual void AddShaderUniformMap() { AddShaderItemMap("uniform", m_Uniforms); }
+
+ virtual void AddShaderOutgoingMap()
+ {
+ if (m_Outgoing)
+ AddShaderItemMap("varying", *m_Outgoing);
+ }
+
+ virtual void AddShaderConstantBufferItemMap(const char *itemType, const TStrTableStrMap &cbMap,
+ TConstantBufferParamArray cbParamsArray)
+ {
+ m_FinalBuilder.append("\n");
+
+ // iterate over all constant buffers
+ for (TStrTableStrMap::const_iterator iter = cbMap.begin(), end = cbMap.end(); iter != end;
+ ++iter) {
+ m_FinalBuilder.append(iter->second);
+ m_FinalBuilder.append(" ");
+ m_FinalBuilder.append(itemType);
+ m_FinalBuilder.append(" ");
+ m_FinalBuilder.append(iter->first);
+ m_FinalBuilder.append(" {\n");
+ // iterate over all param entries and add match
+ for (TConstantBufferParamArray::const_iterator iter1 = cbParamsArray.begin(),
+ end = cbParamsArray.end();
+ iter1 != end; ++iter1) {
+ if (iter1->first == iter->first) {
+ m_FinalBuilder.append(iter1->second.second);
+ m_FinalBuilder.append(" ");
+ m_FinalBuilder.append(iter1->second.first);
+ m_FinalBuilder.append(";\n");
+ }
+ }
+
+ m_FinalBuilder.append("};\n");
+ }
+ }
+
+ virtual void AppendShaderCode() { m_FinalBuilder.append(m_CodeBuilder); }
+
+ virtual void UpdateShaderCacheFlags(SShaderCacheProgramFlags &) {}
+
+ void AddInclude(const char8_t *name) override { m_Includes.insert(Str(name)); }
+
+ void AddInclude(const TStrType &name) override { AddInclude(name.c_str()); }
+
+ void AddInclude(const QString &name) override
+ {
+ QByteArray arr = name.toLatin1();
+ AddInclude(arr.data());
+ }
+
+ virtual const char8_t *BuildShaderSource()
+ {
+ for (nvhash_set<CRegisteredString>::const_iterator iter = m_Includes.begin(),
+ end = m_Includes.end();
+ iter != end; ++iter) {
+ m_FinalBuilder.append("#include \"");
+ m_FinalBuilder.append(iter->c_str());
+ m_FinalBuilder.append("\"\n");
+ }
+ AddShaderIncomingMap();
+ AddShaderUniformMap();
+ AddShaderConstantBufferItemMap("uniform", m_ConstantBuffers, m_ConstantBufferParams);
+ AddShaderOutgoingMap();
+ m_FinalBuilder.append("\n");
+ AppendShaderCode();
+ return m_FinalBuilder.c_str();
+ }
+
+ void AddFunction(const QString &functionName) override
+ {
+ if (!m_addedFunctions.contains(functionName)) {
+ m_addedFunctions.push_back(functionName);
+ QString includeName;
+ QTextStream stream(&includeName);
+ stream << "func" << functionName << ".glsllib";
+ AddInclude(includeName);
+ }
+ }
+};
+
+struct SVertexShaderGenerator : public SStageGeneratorBase
+{
+ SVertexShaderGenerator(NVFoundationBase &inFnd, IStringTable &strTable)
+ : SStageGeneratorBase(inFnd, strTable, ShaderGeneratorStages::Vertex)
+ {
+ }
+
+ const char8_t *GetIncomingVariableName() override { return "attribute"; }
+ virtual void AddIncomingInterpolatedMap() {}
+
+ virtual const char8_t *GetInterpolatedIncomingSuffix() const { return "_attr"; }
+ virtual const char8_t *GetInterpolatedOutgoingSuffix() const { return ""; }
+};
+
+struct STessControlShaderGenerator : public SStageGeneratorBase
+{
+ STessControlShaderGenerator(NVFoundationBase &inFnd, IStringTable &strTable)
+ : SStageGeneratorBase(inFnd, strTable, ShaderGeneratorStages::TessControl)
+ {
+ }
+
+ void AddShaderIncomingMap() override { AddShaderItemMap("attribute", m_Incoming, "[]"); }
+
+ void AddShaderOutgoingMap() override
+ {
+ if (m_Outgoing)
+ AddShaderItemMap("varying", *m_Outgoing, "[]");
+ }
+
+ void UpdateShaderCacheFlags(SShaderCacheProgramFlags &inFlags) override
+ {
+ inFlags.SetTessellationEnabled(true);
+ }
+};
+
+struct STessEvalShaderGenerator : public SStageGeneratorBase
+{
+ STessEvalShaderGenerator(NVFoundationBase &inFnd, IStringTable &strTable)
+ : SStageGeneratorBase(inFnd, strTable, ShaderGeneratorStages::TessEval)
+ {
+ }
+
+ void AddShaderIncomingMap() override { AddShaderItemMap("attribute", m_Incoming, "[]"); }
+
+ void UpdateShaderCacheFlags(SShaderCacheProgramFlags &inFlags) override
+ {
+ inFlags.SetTessellationEnabled(true);
+ }
+};
+
+struct SGeometryShaderGenerator : public SStageGeneratorBase
+{
+ SGeometryShaderGenerator(NVFoundationBase &inFnd, IStringTable &strTable)
+ : SStageGeneratorBase(inFnd, strTable, ShaderGeneratorStages::Geometry)
+ {
+ }
+
+ void AddShaderIncomingMap() override { AddShaderItemMap("attribute", m_Incoming, "[]"); }
+
+ void AddShaderOutgoingMap() override
+ {
+ if (m_Outgoing)
+ AddShaderItemMap("varying", *m_Outgoing);
+ }
+ void UpdateShaderCacheFlags(SShaderCacheProgramFlags &inFlags) override
+ {
+ inFlags.SetGeometryShaderEnabled(true);
+ }
+};
+
+struct SFragmentShaderGenerator : public SStageGeneratorBase
+{
+ SFragmentShaderGenerator(NVFoundationBase &inFnd, IStringTable &strTable)
+ : SStageGeneratorBase(inFnd, strTable, ShaderGeneratorStages::Fragment)
+ {
+ }
+ void AddShaderIncomingMap() override { AddShaderItemMap("varying", m_Incoming); }
+ void AddShaderOutgoingMap() override {}
+};
+
+struct SShaderGeneratedProgramOutput
+{
+ // never null; so safe to call strlen on.
+ const char8_t *m_VertexShader;
+ const char8_t *m_TessControlShader;
+ const char8_t *m_TessEvalShader;
+ const char8_t *m_GeometryShader;
+ const char8_t *m_FragmentShader;
+
+ SShaderGeneratedProgramOutput()
+ : m_VertexShader("")
+ , m_TessControlShader("")
+ , m_TessEvalShader("")
+ , m_GeometryShader("")
+ , m_FragmentShader("")
+ {
+ }
+
+ SShaderGeneratedProgramOutput(const char8_t *vs, const char8_t *tc, const char8_t *te,
+ const char8_t *gs, const char8_t *fs)
+ : m_VertexShader(vs)
+ , m_TessControlShader(tc)
+ , m_TessEvalShader(te)
+ , m_GeometryShader(gs)
+ , m_FragmentShader(fs)
+ {
+ }
+};
+
+struct SProgramGenerator : public IShaderProgramGenerator
+{
+ IQt3DSRenderContext &m_Context;
+ SVertexShaderGenerator m_VS;
+ STessControlShaderGenerator m_TC;
+ STessEvalShaderGenerator m_TE;
+ SGeometryShaderGenerator m_GS;
+ SFragmentShaderGenerator m_FS;
+
+ TShaderGeneratorStageFlags m_EnabledStages;
+
+ QT3DSI32 m_RefCount;
+
+ SProgramGenerator(IQt3DSRenderContext &inContext)
+ : m_Context(inContext)
+ , m_VS(inContext.GetFoundation(), inContext.GetStringTable())
+ , m_TC(inContext.GetFoundation(), inContext.GetStringTable())
+ , m_TE(inContext.GetFoundation(), inContext.GetStringTable())
+ , m_GS(inContext.GetFoundation(), inContext.GetStringTable())
+ , m_FS(inContext.GetFoundation(), inContext.GetStringTable())
+ , m_RefCount(0)
+ {
+ }
+
+ void addRef() override { atomicIncrement(&m_RefCount); }
+ void release() override
+ {
+ atomicDecrement(&m_RefCount);
+ if (m_RefCount <= 0) {
+ NVFoundationBase &theFoundation(m_Context.GetFoundation());
+ NVDelete(theFoundation.getAllocator(), this);
+ }
+ }
+
+ void LinkStages()
+ {
+ // Link stages incoming to outgoing variables.
+ SStageGeneratorBase *previous = NULL;
+ QT3DSU32 theStageId = 1;
+ for (QT3DSU32 idx = 0, end = (QT3DSU32)ShaderGeneratorStages::StageCount; idx < end;
+ ++idx, theStageId = theStageId << 1) {
+ SStageGeneratorBase *thisStage = NULL;
+ ShaderGeneratorStages::Enum theStageEnum =
+ static_cast<ShaderGeneratorStages::Enum>(theStageId);
+ if ((m_EnabledStages & theStageEnum)) {
+ thisStage = &InternalGetStage(theStageEnum);
+ if (previous)
+ previous->m_Outgoing = &thisStage->m_Incoming;
+ previous = thisStage;
+ }
+ }
+ }
+
+ void BeginProgram(TShaderGeneratorStageFlags inEnabledStages) override
+ {
+ m_VS.Begin(inEnabledStages);
+ m_TC.Begin(inEnabledStages);
+ m_TE.Begin(inEnabledStages);
+ m_GS.Begin(inEnabledStages);
+ m_FS.Begin(inEnabledStages);
+ m_EnabledStages = inEnabledStages;
+ LinkStages();
+ }
+
+ TShaderGeneratorStageFlags GetEnabledStages() const override { return m_EnabledStages; }
+
+ SStageGeneratorBase &InternalGetStage(ShaderGeneratorStages::Enum inStage)
+ {
+ switch (inStage) {
+ case ShaderGeneratorStages::Vertex:
+ return m_VS;
+ case ShaderGeneratorStages::TessControl:
+ return m_TC;
+ case ShaderGeneratorStages::TessEval:
+ return m_TE;
+ case ShaderGeneratorStages::Geometry:
+ return m_GS;
+ case ShaderGeneratorStages::Fragment:
+ return m_FS;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ return m_VS;
+ }
+ // get the stage or NULL if it has not been created.
+ IShaderStageGenerator *GetStage(ShaderGeneratorStages::Enum inStage) override
+ {
+ if (inStage > 0 || inStage < ShaderGeneratorStages::StageCount) {
+ if ((m_EnabledStages & inStage))
+ return &InternalGetStage(inStage);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return NULL;
+ }
+
+ qt3ds::render::NVRenderShaderProgram *
+ CompileGeneratedShader(const char *inShaderName, const SShaderCacheProgramFlags &inFlags,
+ TShaderFeatureSet inFeatureSet, bool separableProgram) override
+ {
+ // No stages enabled
+ if (((QT3DSU32)m_EnabledStages) == 0) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ qt3ds::render::IDynamicObjectSystem &theDynamicSystem(m_Context.GetDynamicObjectSystem());
+ SShaderCacheProgramFlags theCacheFlags(inFlags);
+ for (QT3DSU32 stageIdx = 0, stageEnd = ShaderGeneratorStages::StageCount; stageIdx < stageEnd;
+ ++stageIdx) {
+ ShaderGeneratorStages::Enum stageName =
+ static_cast<ShaderGeneratorStages::Enum>(1 << stageIdx);
+ if (m_EnabledStages & stageName) {
+ SStageGeneratorBase &theStage(InternalGetStage(stageName));
+ theStage.BuildShaderSource();
+ theStage.UpdateShaderCacheFlags(theCacheFlags);
+ theDynamicSystem.InsertShaderHeaderInformation(theStage.m_FinalBuilder,
+ inShaderName);
+ }
+ }
+
+ const char *vertexShaderSource = m_VS.m_FinalBuilder.c_str();
+ const char *tcShaderSource = m_TC.m_FinalBuilder.c_str();
+ const char *teShaderSource = m_TE.m_FinalBuilder.c_str();
+ const char *geShaderSource = m_GS.m_FinalBuilder.c_str();
+ const char *fragmentShaderSource = m_FS.m_FinalBuilder.c_str();
+
+ IShaderCache &theCache = m_Context.GetShaderCache();
+ CRegisteredString theCacheKey = m_Context.GetStringTable().RegisterStr(inShaderName);
+ return theCache.CompileProgram(theCacheKey, vertexShaderSource, fragmentShaderSource,
+ tcShaderSource, teShaderSource, geShaderSource,
+ theCacheFlags, inFeatureSet, separableProgram);
+ }
+};
+};
+
+IShaderProgramGenerator &
+IShaderProgramGenerator::CreateProgramGenerator(IQt3DSRenderContext &inContext)
+{
+ return *QT3DS_NEW(inContext.GetAllocator(), SProgramGenerator)(inContext);
+}
+
+void IShaderProgramGenerator::OutputParaboloidDepthVertex(IShaderStageGenerator &vertexShader)
+{
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddInclude("shadowMapping.glsllib");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ // vertexShader.AddUniform("model_view", "mat4");
+ vertexShader.AddUniform("camera_properties", "vec2");
+ // vertexShader.AddOutgoing("view_pos", "vec4");
+ vertexShader.AddOutgoing("world_pos", "vec4");
+
+ // Project the location onto screen space.
+ // This will be horrible if you have a single large polygon. Tessellation is your friend here!
+ vertexShader.Append("void main() {");
+ vertexShader.Append(
+ " ParaboloidMapResult data = VertexParaboloidDepth( attr_pos, model_view_projection );");
+ vertexShader.Append(" gl_Position = data.m_Position;");
+ vertexShader.Append(" world_pos = data.m_WorldPos;");
+ vertexShader.Append("}");
+}
+
+void IShaderProgramGenerator::OutputParaboloidDepthTessEval(IShaderStageGenerator &tessEvalShader)
+{
+ tessEvalShader.AddInclude("shadowMapping.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddOutgoing("world_pos", "vec4");
+ tessEvalShader.Append(" ParaboloidMapResult data = VertexParaboloidDepth( vec3(pos.xyz), "
+ "model_view_projection );");
+ tessEvalShader.Append(" gl_Position = data.m_Position;");
+ tessEvalShader.Append(" world_pos = data.m_WorldPos;");
+}
+
+void IShaderProgramGenerator::OutputParaboloidDepthFragment(IShaderStageGenerator &fragmentShader)
+{
+ fragmentShader.AddInclude("shadowMappingFragment.glsllib");
+ fragmentShader.AddUniform("model_view_projection", "mat4");
+ fragmentShader.AddUniform("camera_properties", "vec2");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append(" gl_FragDepth = FragmentParaboloidDepth( world_pos, "
+ "model_view_projection, camera_properties );");
+ fragmentShader.Append("}");
+}
+
+void IShaderProgramGenerator::OutputCubeFaceDepthVertex(IShaderStageGenerator &vertexShader)
+{
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddUniform("model_matrix", "mat4");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.AddOutgoing("raw_pos", "vec4");
+ vertexShader.AddOutgoing("world_pos", "vec4");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append(" world_pos = model_matrix * vec4( attr_pos, 1.0 );");
+ vertexShader.Append(" world_pos /= world_pos.w;");
+ vertexShader.Append(" gl_Position = model_view_projection * vec4( attr_pos, 1.0 );");
+ vertexShader.Append(" raw_pos = vec4( attr_pos, 1.0 );");
+ // vertexShader.Append(" gl_Position = vec4( attr_pos, 1.0 );");
+ vertexShader.Append("}");
+}
+
+void IShaderProgramGenerator::OutputCubeFaceDepthGeometry(IShaderStageGenerator &geometryShader)
+{
+ geometryShader.Append("layout(triangles) in;");
+ geometryShader.Append("layout(triangle_strip, max_vertices = 18) out;");
+ // geometryShader.AddUniform("shadow_mvp[6]", "mat4");
+
+ geometryShader.AddUniform("shadow_mv0", "mat4");
+ geometryShader.AddUniform("shadow_mv1", "mat4");
+ geometryShader.AddUniform("shadow_mv2", "mat4");
+ geometryShader.AddUniform("shadow_mv3", "mat4");
+ geometryShader.AddUniform("shadow_mv4", "mat4");
+ geometryShader.AddUniform("shadow_mv5", "mat4");
+ geometryShader.AddUniform("projection", "mat4");
+
+ geometryShader.AddUniform("model_matrix", "mat4");
+ geometryShader.AddOutgoing("world_pos", "vec4");
+
+ geometryShader.Append("void main() {");
+ geometryShader.Append(" mat4 layerMVP[6];");
+ geometryShader.Append(" layerMVP[0] = projection * shadow_mv0;");
+ geometryShader.Append(" layerMVP[1] = projection * shadow_mv1;");
+ geometryShader.Append(" layerMVP[2] = projection * shadow_mv2;");
+ geometryShader.Append(" layerMVP[3] = projection * shadow_mv3;");
+ geometryShader.Append(" layerMVP[4] = projection * shadow_mv4;");
+ geometryShader.Append(" layerMVP[5] = projection * shadow_mv5;");
+ geometryShader.Append(" for (int i = 0; i < 6; ++i)");
+ geometryShader.Append(" {");
+ geometryShader.Append(" gl_Layer = i;");
+ geometryShader.Append(" for(int j = 0; j < 3; ++j)");
+ geometryShader.Append(" {");
+ geometryShader.Append(" world_pos = model_matrix * raw_pos[j];");
+ geometryShader.Append(" world_pos /= world_pos.w;");
+ geometryShader.Append(" gl_Position = layerMVP[j] * raw_pos[j];");
+ geometryShader.Append(" world_pos.w = gl_Position.w;");
+ geometryShader.Append(" EmitVertex();");
+ geometryShader.Append(" }");
+ geometryShader.Append(" EndPrimitive();");
+ geometryShader.Append(" }");
+ geometryShader.Append("}");
+}
+
+void IShaderProgramGenerator::OutputCubeFaceDepthFragment(IShaderStageGenerator &fragmentShader)
+{
+ fragmentShader.AddUniform("camera_position", "vec3");
+ fragmentShader.AddUniform("camera_properties", "vec2");
+
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append(
+ "\tvec3 camPos = vec3( camera_position.x, camera_position.y, -camera_position.z );");
+ fragmentShader.Append("\tfloat dist = length( world_pos.xyz - camPos );");
+ fragmentShader.Append(
+ "\tdist = (dist - camera_properties.x) / (camera_properties.y - camera_properties.x);");
+ // fragmentShader.Append("\tgl_FragDepth = dist;");
+ fragmentShader.Append("\tfragOutput = vec4(dist, dist, dist, 1.0);");
+ fragmentShader.Append("}");
+}
diff --git a/src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.h b/src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.h
new file mode 100644
index 0000000..6a6e967
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShaderCodeGeneratorV2.h
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_CODE_GENERATOR_V2_H
+#define QT3DS_RENDER_SHADER_CODE_GENERATOR_V2_H
+#include "Qt3DSRenderShaderCodeGenerator.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "foundation/Qt3DSFlags.h"
+
+#include <QtCore/qstring.h>
+
+namespace qt3ds {
+namespace render {
+ // So far the generator is only useful for graphics stages,
+ // it doesn't seem useful for compute stages.
+ struct ShaderGeneratorStages
+ {
+ enum Enum {
+ Vertex = 1,
+ TessControl = 1 << 1,
+ TessEval = 1 << 2,
+ Geometry = 1 << 3,
+ Fragment = 1 << 4,
+ StageCount = 5,
+ };
+ };
+
+ typedef NVFlags<ShaderGeneratorStages::Enum, QT3DSU32> TShaderGeneratorStageFlags;
+
+ class IShaderStageGenerator
+ {
+ protected:
+ virtual ~IShaderStageGenerator() {}
+ public:
+ virtual void AddIncoming(const char8_t *name, const char8_t *type) = 0;
+ virtual void AddIncoming(const TStrType &name, const char8_t *type) = 0;
+ virtual void AddIncoming(const QString &name, const char8_t *type) = 0;
+
+ virtual void AddOutgoing(const char8_t *name, const char8_t *type) = 0;
+ virtual void AddOutgoing(const TStrType &name, const char8_t *type) = 0;
+ virtual void AddOutgoing(const QString &name, const char8_t *type) = 0;
+
+ virtual void AddUniform(const char8_t *name, const char8_t *type) = 0;
+ virtual void AddUniform(const TStrType &name, const char8_t *type) = 0;
+ virtual void AddUniform(const QString &name, const char8_t *type) = 0;
+
+ virtual void AddInclude(const char8_t *name) = 0;
+ virtual void AddInclude(const TStrType &name) = 0;
+ virtual void AddInclude(const QString &name) = 0;
+
+ virtual void AddFunction(const QString &functionName) = 0;
+
+ virtual void AddConstantBuffer(const char *name, const char *layout) = 0;
+ virtual void AddConstantBuffer(const QString &name, const char *layout) = 0;
+ virtual void AddConstantBufferParam(const QString &cbName,
+ const QString &paramName,
+ const char *type) = 0;
+ virtual void AddConstantBufferParam(const char *cbName, const char *paramName,
+ const char *type) = 0;
+
+ virtual IShaderStageGenerator &operator<<(const QString &data) = 0;
+ virtual IShaderStageGenerator &operator<<(const char *data) = 0;
+ virtual IShaderStageGenerator &operator<<(const TStrType &data) = 0;
+ virtual IShaderStageGenerator &operator<<(const SEndlType & /*data*/) = 0;
+ virtual void Append(const char *data) = 0;
+ virtual void AppendPartial(const char *data) = 0;
+
+ virtual ShaderGeneratorStages::Enum Stage() const = 0;
+ };
+
+ class IShaderProgramGenerator : public NVRefCounted
+ {
+ public:
+ static TShaderGeneratorStageFlags DefaultFlags()
+ {
+ return TShaderGeneratorStageFlags(ShaderGeneratorStages::Vertex
+ | ShaderGeneratorStages::Fragment);
+ }
+ virtual void BeginProgram(TShaderGeneratorStageFlags inEnabledStages = DefaultFlags()) = 0;
+
+ virtual TShaderGeneratorStageFlags GetEnabledStages() const = 0;
+
+ // get the stage or NULL if it has not been created.
+ virtual IShaderStageGenerator *GetStage(ShaderGeneratorStages::Enum inStage) = 0;
+
+ // Implicit call to end program.
+ virtual qt3ds::render::NVRenderShaderProgram *
+ CompileGeneratedShader(const char *inShaderName, const SShaderCacheProgramFlags &inFlags,
+ TShaderFeatureSet inFeatureSet, bool separableProgram = false) = 0;
+
+ qt3ds::render::NVRenderShaderProgram *CompileGeneratedShader(const char *inShaderName,
+ bool separableProgram = false)
+ {
+ return CompileGeneratedShader(inShaderName, SShaderCacheProgramFlags(),
+ TShaderFeatureSet(), separableProgram);
+ }
+
+ static IShaderProgramGenerator &CreateProgramGenerator(IQt3DSRenderContext &inContext);
+
+ static void OutputParaboloidDepthVertex(IShaderStageGenerator &inGenerator);
+ // By convention, the local space result of the TE is stored in vec4 pos local variable.
+ // This function expects such state.
+ static void OutputParaboloidDepthTessEval(IShaderStageGenerator &inGenerator);
+ // Utilities shared among the various different systems.
+ static void OutputParaboloidDepthFragment(IShaderStageGenerator &inGenerator);
+
+ static void OutputCubeFaceDepthVertex(IShaderStageGenerator &inGenerator);
+ static void OutputCubeFaceDepthGeometry(IShaderStageGenerator &inGenerator);
+ static void OutputCubeFaceDepthFragment(IShaderStageGenerator &inGenerator);
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderShaderKeys.h b/src/runtimerender/Qt3DSRenderShaderKeys.h
new file mode 100644
index 0000000..5d02e41
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShaderKeys.h
@@ -0,0 +1,802 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_KEY_H
+#define QT3DS_RENDER_SHADER_KEY_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "EASTL/string.h"
+#include "foundation/StringConversionImpl.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "Qt3DSRenderTessModeValues.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+ // We have an ever expanding set of properties we like to hash into one or more 32 bit
+ // quantities.
+ // Furthermore we would like this set of properties to be convertable to string
+ // So the shader cache file itself is somewhat human readable/diagnosable.
+ // To do this we create a set of objects that act as properties to the master shader key.
+ // These objects are tallied in order to figure out their actual offset into the shader key's
+ // data store. They are also run through in order to create the string shader cache key.
+
+ struct SShaderKeyPropertyBase
+ {
+ const char *m_Name;
+ QT3DSU32 m_Offset;
+ SShaderKeyPropertyBase(const char *name = "")
+ : m_Name(name)
+ , m_Offset(0)
+ {
+ }
+ QT3DSU32 GetOffset() const { return m_Offset; }
+ void SetOffset(QT3DSU32 of) { m_Offset = of; }
+
+ template <QT3DSU32 TBitWidth>
+ QT3DSU32 GetMaskTemplate() const
+ {
+ QT3DSU32 bit = m_Offset % 32;
+ QT3DSU32 startValue = (1 << TBitWidth) - 1;
+ QT3DSU32 mask = startValue << bit;
+ return mask;
+ }
+
+ QT3DSU32 GetIdx() const { return m_Offset / 32; }
+ protected:
+ void InternalToString(eastl::string &ioStr, const char *inBuffer) const
+ {
+ ioStr.append(m_Name);
+ ioStr.append("=");
+ ioStr.append(inBuffer);
+ }
+
+ static void InternalToString(eastl::string &ioStr, const char *name, bool inValue)
+ {
+ if (inValue) {
+ ioStr.append(name);
+ ioStr.append("=");
+ ioStr.append(inValue ? "true" : "false");
+ }
+ }
+ };
+
+ struct SShaderKeyBoolean : public SShaderKeyPropertyBase
+ {
+ enum {
+ BitWidth = 1,
+ };
+
+ SShaderKeyBoolean(const char *name = "")
+ : SShaderKeyPropertyBase(name)
+ {
+ }
+
+ QT3DSU32 GetMask() const { return GetMaskTemplate<BitWidth>(); }
+ void SetValue(NVDataRef<QT3DSU32> inDataStore, bool inValue) const
+ {
+ QT3DSU32 idx = GetIdx();
+ QT3DS_ASSERT(inDataStore.size() > idx);
+ QT3DSU32 mask = GetMask();
+ QT3DSU32 &target = inDataStore[idx];
+ if (inValue == true) {
+ target = target | mask;
+ } else {
+ mask = ~mask;
+ target = target & mask;
+ }
+ }
+
+ bool GetValue(NVConstDataRef<QT3DSU32> inDataStore) const
+ {
+ QT3DSU32 idx = GetIdx();
+ QT3DSU32 mask = GetMask();
+ const QT3DSU32 &target = inDataStore[idx];
+ return (target & mask) ? true : false;
+ }
+
+ void ToString(eastl::string &ioStr, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ bool isHigh = GetValue(inKeySet);
+ InternalToString(ioStr, m_Name, isHigh);
+ }
+ };
+
+ template <QT3DSU32 TBitWidth>
+ struct SShaderKeyUnsigned : public SShaderKeyPropertyBase
+ {
+ enum {
+ BitWidth = TBitWidth,
+ };
+ SShaderKeyUnsigned(const char *name = "")
+ : SShaderKeyPropertyBase(name)
+ {
+ }
+ QT3DSU32 GetMask() const { return GetMaskTemplate<BitWidth>(); }
+ void SetValue(NVDataRef<QT3DSU32> inDataStore, QT3DSU32 inValue) const
+ {
+ QT3DSU32 startValue = (1 << TBitWidth) - 1;
+ // Ensure inValue is within range of bit width.
+ inValue = inValue & startValue;
+ QT3DSU32 bit = m_Offset % 32;
+ QT3DSU32 mask = GetMask();
+ QT3DSU32 idx = GetIdx();
+ inValue = inValue << bit;
+ QT3DSU32 &target = inDataStore[idx];
+ // Get rid of existing value
+ QT3DSU32 inverseMask = ~mask;
+ target = target & inverseMask;
+ target = target | inValue;
+ }
+
+ QT3DSU32 GetValue(NVConstDataRef<QT3DSU32> inDataStore) const
+ {
+ QT3DSU32 idx = GetIdx();
+ QT3DSU32 bit = m_Offset % 32;
+ QT3DSU32 mask = GetMask();
+ const QT3DSU32 &target = inDataStore[idx];
+
+ QT3DSU32 retval = target & mask;
+ retval = retval >> bit;
+ return retval;
+ }
+
+ void ToString(eastl::string &ioStr, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ QT3DSU32 value = GetValue(inKeySet);
+ char buf[64];
+ StringConversion<QT3DSU32>().ToStr(value, toDataRef(buf, 64));
+ InternalToString(ioStr, buf);
+ }
+ };
+
+ struct SShaderKeyTessellation : public SShaderKeyUnsigned<4>
+ {
+ enum TessellationBits {
+ noTessellation = 1 << 0,
+ linearTessellation = 1 << 1,
+ phongTessellation = 1 << 2,
+ npatchTessellation = 1 << 3
+ };
+
+ SShaderKeyTessellation(const char *name = "")
+ : SShaderKeyUnsigned<4>(name)
+ {
+ }
+
+ bool GetBitValue(TessellationBits swizzleBit, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return (GetValue(inKeySet) & swizzleBit) ? true : false;
+ }
+
+ void SetBitValue(TessellationBits swizzleBit, bool inValue, NVDataRef<QT3DSU32> inKeySet)
+ {
+ QT3DSU32 theValue = GetValue(inKeySet);
+ QT3DSU32 mask = swizzleBit;
+ if (inValue) {
+ theValue = theValue | mask;
+ } else {
+ mask = ~mask;
+ theValue = theValue & mask;
+ }
+ SetValue(inKeySet, theValue);
+ }
+
+ void SetTessellationMode(NVDataRef<QT3DSU32> inKeySet, TessModeValues::Enum tessellationMode,
+ bool val)
+ {
+ switch (tessellationMode) {
+ case TessModeValues::NoTess:
+ SetBitValue(noTessellation, val, inKeySet);
+ break;
+ case TessModeValues::TessLinear:
+ SetBitValue(linearTessellation, val, inKeySet);
+ break;
+ case TessModeValues::TessNPatch:
+ SetBitValue(npatchTessellation, val, inKeySet);
+ break;
+ case TessModeValues::TessPhong:
+ SetBitValue(phongTessellation, val, inKeySet);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ bool IsNoTessellation(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(noTessellation, inKeySet);
+ }
+ void SetNoTessellation(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(noTessellation, val, inKeySet);
+ }
+
+ bool IsLinearTessellation(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(linearTessellation, inKeySet);
+ }
+ void SetLinearTessellation(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(linearTessellation, val, inKeySet);
+ }
+
+ bool IsNPatchTessellation(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(npatchTessellation, inKeySet);
+ }
+ void SetNPatchTessellation(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(npatchTessellation, val, inKeySet);
+ }
+
+ bool IsPhongTessellation(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(phongTessellation, inKeySet);
+ }
+ void SetPhongTessellation(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(phongTessellation, val, inKeySet);
+ }
+
+ void ToString(eastl::string &ioStr, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ ioStr.append(m_Name);
+ ioStr.append("={");
+ InternalToString(ioStr, "noTessellation", IsNoTessellation(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "linearTessellation", IsLinearTessellation(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "npatchTessellation", IsNPatchTessellation(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "phongTessellation", IsPhongTessellation(inKeySet));
+ ioStr.append("}");
+ }
+ };
+
+ struct SShaderKeyTextureSwizzle : public SShaderKeyUnsigned<5>
+ {
+ enum TextureSwizzleBits {
+ noSwizzle = 1 << 0,
+ L8toR8 = 1 << 1,
+ A8toR8 = 1 << 2,
+ L8A8toRG8 = 1 << 3,
+ L16toR16 = 1 << 4
+ };
+
+ SShaderKeyTextureSwizzle(const char *name = "")
+ : SShaderKeyUnsigned<5>(name)
+ {
+ }
+
+ bool GetBitValue(TextureSwizzleBits swizzleBit, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return (GetValue(inKeySet) & swizzleBit) ? true : false;
+ }
+
+ void SetBitValue(TextureSwizzleBits swizzleBit, bool inValue, NVDataRef<QT3DSU32> inKeySet)
+ {
+ QT3DSU32 theValue = GetValue(inKeySet);
+ QT3DSU32 mask = swizzleBit;
+ if (inValue) {
+ theValue = theValue | mask;
+ } else {
+ mask = ~mask;
+ theValue = theValue & mask;
+ }
+ SetValue(inKeySet, theValue);
+ }
+
+ void SetSwizzleMode(NVDataRef<QT3DSU32> inKeySet, NVRenderTextureSwizzleMode::Enum swizzleMode,
+ bool val)
+ {
+ switch (swizzleMode) {
+ case NVRenderTextureSwizzleMode::NoSwizzle:
+ SetBitValue(noSwizzle, val, inKeySet);
+ break;
+ case NVRenderTextureSwizzleMode::L8toR8:
+ SetBitValue(L8toR8, val, inKeySet);
+ break;
+ case NVRenderTextureSwizzleMode::A8toR8:
+ SetBitValue(A8toR8, val, inKeySet);
+ break;
+ case NVRenderTextureSwizzleMode::L8A8toRG8:
+ SetBitValue(L8A8toRG8, val, inKeySet);
+ break;
+ case NVRenderTextureSwizzleMode::L16toR16:
+ SetBitValue(L16toR16, val, inKeySet);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ bool IsNoSwizzled(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(noSwizzle, inKeySet);
+ }
+ void SetNoSwizzled(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(noSwizzle, val, inKeySet);
+ }
+
+ bool IsL8Swizzled(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(L8toR8, inKeySet);
+ }
+ void SetL8Swizzled(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(L8toR8, val, inKeySet);
+ }
+
+ bool IsA8Swizzled(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(A8toR8, inKeySet);
+ }
+ void SetA8Swizzled(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(A8toR8, val, inKeySet);
+ }
+
+ bool IsL8A8Swizzled(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(L8A8toRG8, inKeySet);
+ }
+ void SetL8A8Swizzled(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(L8A8toRG8, val, inKeySet);
+ }
+
+ bool IsL16Swizzled(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(L16toR16, inKeySet);
+ }
+ void SetL16Swizzled(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(L16toR16, val, inKeySet);
+ }
+
+ void ToString(eastl::string &ioStr, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ ioStr.append(m_Name);
+ ioStr.append("={");
+ InternalToString(ioStr, "noswizzle", IsNoSwizzled(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "l8swizzle", IsL8Swizzled(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "a8swizzle", IsA8Swizzled(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "l8a8swizzle", IsL8A8Swizzled(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "l16swizzle", IsL16Swizzled(inKeySet));
+ ioStr.append("}");
+ }
+ };
+
+ struct SShaderKeyImageMap : public SShaderKeyUnsigned<5>
+ {
+ enum ImageMapBits {
+ Enabled = 1 << 0,
+ EnvMap = 1 << 1,
+ LightProbe = 1 << 2,
+ InvertUV = 1 << 3,
+ Premultiplied = 1 << 4,
+ };
+
+ SShaderKeyImageMap(const char *name = "")
+ : SShaderKeyUnsigned<5>(name)
+ {
+ }
+
+ bool GetBitValue(ImageMapBits imageBit, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return (GetValue(inKeySet) & imageBit) ? true : false;
+ }
+
+ void SetBitValue(ImageMapBits imageBit, bool inValue, NVDataRef<QT3DSU32> inKeySet)
+ {
+ QT3DSU32 theValue = GetValue(inKeySet);
+ QT3DSU32 mask = imageBit;
+ if (inValue) {
+ theValue = theValue | mask;
+ } else {
+ mask = ~mask;
+ theValue = theValue & mask;
+ }
+ SetValue(inKeySet, theValue);
+ }
+
+ bool IsEnabled(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(Enabled, inKeySet);
+ }
+ void SetEnabled(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(Enabled, val, inKeySet);
+ }
+
+ bool IsEnvMap(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(EnvMap, inKeySet);
+ }
+ void SetEnvMap(NVDataRef<QT3DSU32> inKeySet, bool val) { SetBitValue(EnvMap, val, inKeySet); }
+
+ bool IsLightProbe(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(LightProbe, inKeySet);
+ }
+ void SetLightProbe(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(LightProbe, val, inKeySet);
+ }
+
+ bool IsInvertUVMap(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(InvertUV, inKeySet);
+ }
+ void SetInvertUVMap(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(InvertUV, val, inKeySet);
+ }
+
+ bool IsPremultiplied(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return GetBitValue(Premultiplied, inKeySet);
+ }
+ void SetPremultiplied(NVDataRef<QT3DSU32> inKeySet, bool val)
+ {
+ SetBitValue(Premultiplied, val, inKeySet);
+ }
+
+ void ToString(eastl::string &ioStr, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ ioStr.append(m_Name);
+ ioStr.append("={");
+ InternalToString(ioStr, "enabled", IsEnabled(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "envMap", IsEnvMap(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "lightProbe", IsLightProbe(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "invertUV", IsInvertUVMap(inKeySet));
+ ioStr.append(";");
+ InternalToString(ioStr, "premultiplied", IsPremultiplied(inKeySet));
+ ioStr.append("}");
+ }
+ };
+
+ struct SShaderKeySpecularModel : SShaderKeyUnsigned<2>
+ {
+ SShaderKeySpecularModel(const char *name = "")
+ : SShaderKeyUnsigned<2>(name)
+ {
+ }
+
+ void SetSpecularModel(NVDataRef<QT3DSU32> inKeySet,
+ qt3ds::render::DefaultMaterialSpecularModel::Enum inModel)
+ {
+ SetValue(inKeySet, (QT3DSU32)inModel);
+ }
+
+ qt3ds::render::DefaultMaterialSpecularModel::Enum
+ GetSpecularModel(NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ return static_cast<qt3ds::render::DefaultMaterialSpecularModel::Enum>(GetValue(inKeySet));
+ }
+
+ void ToString(eastl::string &ioStr, NVConstDataRef<QT3DSU32> inKeySet) const
+ {
+ ioStr.append(m_Name);
+ ioStr.append("=");
+ switch (GetSpecularModel(inKeySet)) {
+ case DefaultMaterialSpecularModel::KGGX:
+ ioStr.append("KGGX");
+ break;
+ case DefaultMaterialSpecularModel::KWard:
+ ioStr.append("KWard");
+ break;
+ case DefaultMaterialSpecularModel::Default:
+ ioStr.append("Default");
+ break;
+ }
+ ioStr.append(";");
+ }
+ };
+
+ struct SShaderDefaultMaterialKeyProperties
+ {
+ enum {
+ LightCount = 7,
+ };
+ enum ImageMapNames {
+ DiffuseMap0 = 0,
+ DiffuseMap1,
+ DiffuseMap2,
+ EmissiveMap,
+ EmissiveMap2,
+ SpecularMap,
+ OpacityMap,
+ BumpMap,
+ SpecularAmountMap,
+ NormalMap,
+ DisplacementMap,
+ TranslucencyMap,
+ LightmapIndirect,
+ LightmapRadiosity,
+ LightmapShadow,
+ RoughnessMap,
+ ImageMapCount
+ };
+
+ SShaderKeyBoolean m_HasLighting;
+ SShaderKeyBoolean m_HasIbl;
+ SShaderKeyUnsigned<3> m_LightCount;
+ SShaderKeyBoolean m_LightFlags[LightCount];
+ SShaderKeyBoolean m_LightAreaFlags[LightCount];
+ SShaderKeyBoolean m_LightShadowFlags[LightCount];
+ SShaderKeyBoolean m_SpecularEnabled;
+ SShaderKeyBoolean m_FresnelEnabled;
+ SShaderKeyBoolean m_VertexColorsEnabled;
+ SShaderKeySpecularModel m_SpecularModel;
+ SShaderKeyImageMap m_ImageMaps[ImageMapCount];
+ SShaderKeyTextureSwizzle m_TextureSwizzle[ImageMapCount];
+ SShaderKeyTessellation m_TessellationMode;
+ SShaderKeyBoolean m_HasSkinning;
+ SShaderKeyBoolean m_WireframeMode;
+
+ SShaderDefaultMaterialKeyProperties()
+ : m_HasLighting("hasLighting")
+ , m_HasIbl("hasIbl")
+ , m_LightCount("lightCount")
+ , m_SpecularEnabled("specularEnabled")
+ , m_FresnelEnabled("fresnelEnabled")
+ , m_VertexColorsEnabled("vertexColorsEnabled")
+ , m_SpecularModel("specularModel")
+ , m_TessellationMode("tessellationMode")
+ , m_HasSkinning("hasSkinning")
+ , m_WireframeMode("wireframeMode")
+ {
+ m_LightFlags[0].m_Name = "light0HasPosition";
+ m_LightFlags[1].m_Name = "light1HasPosition";
+ m_LightFlags[2].m_Name = "light2HasPosition";
+ m_LightFlags[3].m_Name = "light3HasPosition";
+ m_LightFlags[4].m_Name = "light4HasPosition";
+ m_LightFlags[5].m_Name = "light5HasPosition";
+ m_LightFlags[6].m_Name = "light6HasPosition";
+ m_LightAreaFlags[0].m_Name = "light0HasArea";
+ m_LightAreaFlags[1].m_Name = "light1HasArea";
+ m_LightAreaFlags[2].m_Name = "light2HasArea";
+ m_LightAreaFlags[3].m_Name = "light3HasArea";
+ m_LightAreaFlags[4].m_Name = "light4HasArea";
+ m_LightAreaFlags[5].m_Name = "light5HasArea";
+ m_LightAreaFlags[6].m_Name = "light6HasArea";
+ m_LightShadowFlags[0].m_Name = "light0HasShadow";
+ m_LightShadowFlags[1].m_Name = "light1HasShadow";
+ m_LightShadowFlags[2].m_Name = "light2HasShadow";
+ m_LightShadowFlags[3].m_Name = "light3HasShadow";
+ m_LightShadowFlags[4].m_Name = "light4HasShadow";
+ m_LightShadowFlags[5].m_Name = "light5HasShadow";
+ m_LightShadowFlags[6].m_Name = "light6HasShadow";
+ m_ImageMaps[0].m_Name = "diffuseMap0";
+ m_ImageMaps[1].m_Name = "diffuseMap1";
+ m_ImageMaps[2].m_Name = "diffuseMap2";
+ m_ImageMaps[3].m_Name = "emissiveMap";
+ m_ImageMaps[4].m_Name = "emissiveMap2";
+ m_ImageMaps[5].m_Name = "specularMap";
+ m_ImageMaps[6].m_Name = "opacityMap";
+ m_ImageMaps[7].m_Name = "bumpMap";
+ m_ImageMaps[8].m_Name = "specularAmountMap";
+ m_ImageMaps[9].m_Name = "normalMap";
+ m_ImageMaps[10].m_Name = "displacementMap";
+ m_ImageMaps[11].m_Name = "translucencyMap";
+ m_ImageMaps[12].m_Name = "lightmapIndirect";
+ m_ImageMaps[13].m_Name = "lightmapRadiosity";
+ m_ImageMaps[14].m_Name = "lightmapShadow";
+ m_ImageMaps[15].m_Name = "roughnessMap";
+ m_TextureSwizzle[0].m_Name = "diffuseMap0_swizzle";
+ m_TextureSwizzle[1].m_Name = "diffuseMap1_swizzle";
+ m_TextureSwizzle[2].m_Name = "diffuseMap2_swizzle";
+ m_TextureSwizzle[3].m_Name = "emissiveMap_swizzle";
+ m_TextureSwizzle[4].m_Name = "emissiveMap2_swizzle";
+ m_TextureSwizzle[5].m_Name = "specularMap_swizzle";
+ m_TextureSwizzle[6].m_Name = "opacityMap_swizzle";
+ m_TextureSwizzle[7].m_Name = "bumpMap_swizzle";
+ m_TextureSwizzle[8].m_Name = "specularAmountMap_swizzle";
+ m_TextureSwizzle[9].m_Name = "normalMap_swizzle";
+ m_TextureSwizzle[10].m_Name = "displacementMap_swizzle";
+ m_TextureSwizzle[11].m_Name = "translucencyMap_swizzle";
+ m_TextureSwizzle[12].m_Name = "lightmapIndirect_swizzle";
+ m_TextureSwizzle[13].m_Name = "lightmapRadiosity_swizzle";
+ m_TextureSwizzle[14].m_Name = "lightmapShadow_swizzle";
+ m_TextureSwizzle[15].m_Name = "roughnessMap_swizzle";
+ SetPropertyOffsets();
+ }
+
+ template <typename TVisitor>
+ void VisitProperties(TVisitor &inVisitor)
+ {
+ inVisitor.Visit(m_HasLighting);
+ inVisitor.Visit(m_HasIbl);
+ inVisitor.Visit(m_LightCount);
+
+ for (QT3DSU32 idx = 0, end = LightCount; idx < end; ++idx) {
+ inVisitor.Visit(m_LightFlags[idx]);
+ }
+
+ for (QT3DSU32 idx = 0, end = LightCount; idx < end; ++idx) {
+ inVisitor.Visit(m_LightAreaFlags[idx]);
+ }
+
+ for (QT3DSU32 idx = 0, end = LightCount; idx < end; ++idx) {
+ inVisitor.Visit(m_LightShadowFlags[idx]);
+ }
+
+ inVisitor.Visit(m_SpecularEnabled);
+ inVisitor.Visit(m_FresnelEnabled);
+ inVisitor.Visit(m_VertexColorsEnabled);
+ inVisitor.Visit(m_SpecularModel);
+
+ for (QT3DSU32 idx = 0, end = ImageMapCount; idx < end; ++idx) {
+ inVisitor.Visit(m_ImageMaps[idx]);
+ inVisitor.Visit(m_TextureSwizzle[idx]);
+ }
+
+ inVisitor.Visit(m_TessellationMode);
+ inVisitor.Visit(m_HasSkinning);
+ inVisitor.Visit(m_WireframeMode);
+ }
+
+ struct SOffsetVisitor
+ {
+ QT3DSU32 m_Offset;
+ SOffsetVisitor()
+ : m_Offset(0)
+ {
+ }
+ template <typename TPropType>
+ void Visit(TPropType &inProp)
+ {
+ // if we cross the 32 bit border we just move
+ // to the next dword.
+ // This cost a few extra bits but prevents tedious errors like
+ // loosing shader key bits because they got moved beyond the 32 border
+ QT3DSU32 bit = m_Offset % 32;
+ if (bit + TPropType::BitWidth > 31) {
+ m_Offset += 32 - bit;
+ }
+
+ inProp.SetOffset(m_Offset);
+ m_Offset += TPropType::BitWidth;
+ }
+ };
+
+ void SetPropertyOffsets()
+ {
+ SOffsetVisitor visitor;
+ VisitProperties(visitor);
+ // If this assert fires, then the default material key needs more bits.
+ QT3DS_ASSERT(visitor.m_Offset < 224);
+ }
+ };
+
+ struct SShaderDefaultMaterialKey
+ {
+ enum {
+ DataBufferSize = 7,
+ };
+ QT3DSU32 m_DataBuffer[DataBufferSize];
+ size_t m_FeatureSetHash;
+
+ SShaderDefaultMaterialKey(size_t inFeatureSetHash)
+ : m_FeatureSetHash(inFeatureSetHash)
+ {
+ for (size_t idx = 0; idx < DataBufferSize; ++idx)
+ m_DataBuffer[idx] = 0;
+ }
+
+ SShaderDefaultMaterialKey()
+ : m_FeatureSetHash(0)
+ {
+ for (size_t idx = 0; idx < DataBufferSize; ++idx)
+ m_DataBuffer[idx] = 0;
+ }
+
+ size_t hash() const
+ {
+ size_t retval = 0;
+ for (size_t idx = 0; idx < DataBufferSize; ++idx)
+ retval = retval ^ eastl::hash<QT3DSU32>()(m_DataBuffer[idx]);
+ return retval ^ m_FeatureSetHash;
+ }
+
+ bool operator==(const SShaderDefaultMaterialKey &other) const
+ {
+ bool retval = true;
+ for (size_t idx = 0; idx < DataBufferSize && retval; ++idx)
+ retval = m_DataBuffer[idx] == other.m_DataBuffer[idx];
+ return retval && m_FeatureSetHash == other.m_FeatureSetHash;
+ }
+
+ // Cast operators to make getting properties easier.
+ operator NVDataRef<QT3DSU32>() { return toDataRef(m_DataBuffer, DataBufferSize); }
+
+ operator NVConstDataRef<QT3DSU32>() const
+ {
+ return toConstDataRef(m_DataBuffer, DataBufferSize);
+ }
+
+ struct SStringVisitor
+ {
+ eastl::string &m_Str;
+ NVConstDataRef<QT3DSU32> m_KeyStore;
+ SStringVisitor(eastl::string &s, NVConstDataRef<QT3DSU32> ks)
+ : m_Str(s)
+ , m_KeyStore(ks)
+ {
+ }
+ template <typename TPropType>
+ void Visit(const TPropType &prop)
+ {
+ QT3DSU32 originalSize = m_Str.size();
+ if (m_Str.size())
+ m_Str.append(";");
+ prop.ToString(m_Str, m_KeyStore);
+ // if the only thing we added was the semicolon
+ // then nuke the semicolon
+ if (originalSize && m_Str.size() == originalSize + 1)
+ m_Str.resize(originalSize);
+ }
+ };
+
+ void ToString(eastl::string &ioString,
+ SShaderDefaultMaterialKeyProperties &inProperties) const
+ {
+ SStringVisitor theVisitor(ioString, *this);
+ inProperties.VisitProperties(theVisitor);
+ }
+ };
+}
+}
+
+namespace eastl {
+template <>
+struct hash<qt3ds::render::SShaderDefaultMaterialKey>
+{
+ size_t operator()(const qt3ds::render::SShaderDefaultMaterialKey &key) const
+ {
+ return key.hash();
+ }
+};
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderShadowMap.cpp b/src/runtimerender/Qt3DSRenderShadowMap.cpp
new file mode 100644
index 0000000..983af55
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShadowMap.cpp
@@ -0,0 +1,219 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderShadowMap.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "rendererimpl/Qt3DSRendererImplLayerRenderData.h"
+#include "render/Qt3DSRenderShaderConstant.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+using namespace qt3ds::render;
+using qt3ds::render::NVRenderContextScopedProperty;
+using qt3ds::render::NVRenderCachedShaderProperty;
+
+Qt3DSShadowMap::Qt3DSShadowMap(IQt3DSRenderContext &inContext)
+ : m_Context(inContext)
+ , mRefCount(0)
+ , m_ShadowMapList(inContext.GetAllocator(), "Qt3DSShadowMap::m_ShadowMapList")
+{
+}
+
+Qt3DSShadowMap::~Qt3DSShadowMap()
+{
+ m_ShadowMapList.clear();
+}
+
+namespace {
+bool IsDepthFormat(NVRenderTextureFormats::Enum format)
+{
+ switch (format) {
+ case NVRenderTextureFormats::Depth16:
+ case NVRenderTextureFormats::Depth24:
+ case NVRenderTextureFormats::Depth32:
+ case NVRenderTextureFormats::Depth24Stencil8:
+ return true;
+ default:
+ return false;
+ }
+}
+}
+
+void Qt3DSShadowMap::AddShadowMapEntry(QT3DSU32 index, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum format, QT3DSU32 samples,
+ ShadowMapModes::Enum mode, ShadowFilterValues::Enum filter)
+{
+ IResourceManager &theManager(m_Context.GetResourceManager());
+ SShadowMapEntry *pEntry = NULL;
+
+ if (index < m_ShadowMapList.size())
+ pEntry = &m_ShadowMapList[index];
+
+ if (pEntry) {
+ if ((NULL != pEntry->m_DepthMap) && (mode == ShadowMapModes::CUBE)) {
+ theManager.Release(*pEntry->m_DepthMap);
+ theManager.Release(*pEntry->m_DepthCopy);
+ theManager.Release(*pEntry->m_DepthRender);
+ pEntry->m_DepthCube = theManager.AllocateTextureCube(width, height, format, samples);
+ pEntry->m_CubeCopy = theManager.AllocateTextureCube(width, height, format, samples);
+ pEntry->m_DepthRender = theManager.AllocateTexture2D(
+ width, height, NVRenderTextureFormats::Depth24Stencil8, samples);
+ pEntry->m_DepthMap = NULL;
+ pEntry->m_DepthCopy = NULL;
+ } else if ((NULL != pEntry->m_DepthCube) && (mode != ShadowMapModes::CUBE)) {
+ theManager.Release(*pEntry->m_DepthCube);
+ theManager.Release(*pEntry->m_CubeCopy);
+ theManager.Release(*pEntry->m_DepthRender);
+ pEntry->m_DepthMap = theManager.AllocateTexture2D(width, height, format, samples);
+ pEntry->m_DepthCopy = theManager.AllocateTexture2D(width, height, format, samples);
+ pEntry->m_DepthCube = NULL;
+ pEntry->m_CubeCopy = NULL;
+ pEntry->m_DepthRender = theManager.AllocateTexture2D(
+ width, height, NVRenderTextureFormats::Depth24Stencil8, samples);
+ } else if (NULL != pEntry->m_DepthMap) {
+ STextureDetails theDetails(pEntry->m_DepthMap->GetTextureDetails());
+
+ // If anything differs about the map we're looking for, let's recreate it.
+ if (theDetails.m_Format != format || theDetails.m_Width != width
+ || theDetails.m_Height != height || theDetails.m_SampleCount != samples) {
+ // release texture
+ theManager.Release(*pEntry->m_DepthMap);
+ theManager.Release(*pEntry->m_DepthCopy);
+ theManager.Release(*pEntry->m_DepthRender);
+ pEntry->m_DepthMap = theManager.AllocateTexture2D(width, height, format, samples);
+ pEntry->m_DepthCopy = theManager.AllocateTexture2D(width, height, format, samples);
+ pEntry->m_DepthCube = NULL;
+ pEntry->m_CubeCopy = NULL;
+ pEntry->m_DepthRender = theManager.AllocateTexture2D(
+ width, height, NVRenderTextureFormats::Depth24Stencil8, samples);
+ }
+ } else {
+ STextureDetails theDetails(pEntry->m_DepthCube->GetTextureDetails());
+
+ // If anything differs about the map we're looking for, let's recreate it.
+ if (theDetails.m_Format != format || theDetails.m_Width != width
+ || theDetails.m_Height != height || theDetails.m_SampleCount != samples) {
+ // release texture
+ theManager.Release(*pEntry->m_DepthCube);
+ theManager.Release(*pEntry->m_CubeCopy);
+ theManager.Release(*pEntry->m_DepthRender);
+ pEntry->m_DepthCube =
+ theManager.AllocateTextureCube(width, height, format, samples);
+ pEntry->m_CubeCopy = theManager.AllocateTextureCube(width, height, format, samples);
+ pEntry->m_DepthRender = theManager.AllocateTexture2D(
+ width, height, NVRenderTextureFormats::Depth24Stencil8, samples);
+ pEntry->m_DepthMap = NULL;
+ pEntry->m_DepthCopy = NULL;
+ }
+ }
+
+ pEntry->m_ShadowMapMode = mode;
+ pEntry->m_ShadowFilterFlags = filter;
+ } else if (mode == ShadowMapModes::CUBE) {
+ NVRenderTextureCube *theDepthTex =
+ theManager.AllocateTextureCube(width, height, format, samples);
+ NVRenderTextureCube *theDepthCopy =
+ theManager.AllocateTextureCube(width, height, format, samples);
+ NVRenderTexture2D *theDepthTemp = theManager.AllocateTexture2D(
+ width, height, NVRenderTextureFormats::Depth24Stencil8, samples);
+
+ m_ShadowMapList.push_back(
+ SShadowMapEntry(index, mode, filter, *theDepthTex, *theDepthCopy, *theDepthTemp));
+
+ pEntry = &m_ShadowMapList.back();
+ } else {
+ NVRenderTexture2D *theDepthMap =
+ theManager.AllocateTexture2D(width, height, format, samples);
+ NVRenderTexture2D *theDepthCopy =
+ theManager.AllocateTexture2D(width, height, format, samples);
+ NVRenderTexture2D *theDepthTemp = theManager.AllocateTexture2D(
+ width, height, NVRenderTextureFormats::Depth24Stencil8, samples);
+
+ m_ShadowMapList.push_back(
+ SShadowMapEntry(index, mode, filter, *theDepthMap, *theDepthCopy, *theDepthTemp));
+
+ pEntry = &m_ShadowMapList.back();
+ }
+
+ if (pEntry) {
+ // setup some texture settings
+ if (pEntry->m_DepthMap) {
+ pEntry->m_DepthMap->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ pEntry->m_DepthMap->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ pEntry->m_DepthMap->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ pEntry->m_DepthMap->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+
+ pEntry->m_DepthCopy->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ pEntry->m_DepthCopy->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ pEntry->m_DepthCopy->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ pEntry->m_DepthCopy->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+
+ pEntry->m_DepthRender->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ pEntry->m_DepthRender->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ pEntry->m_DepthRender->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ pEntry->m_DepthRender->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+ } else {
+ pEntry->m_DepthCube->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ pEntry->m_DepthCube->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ pEntry->m_DepthCube->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ pEntry->m_DepthCube->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+
+ pEntry->m_CubeCopy->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ pEntry->m_CubeCopy->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ pEntry->m_CubeCopy->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ pEntry->m_CubeCopy->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+
+ pEntry->m_DepthRender->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ pEntry->m_DepthRender->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ pEntry->m_DepthRender->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ pEntry->m_DepthRender->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+ }
+
+ pEntry->m_LightIndex = index;
+ }
+}
+
+SShadowMapEntry *Qt3DSShadowMap::GetShadowMapEntry(QT3DSU32 index)
+{
+ SShadowMapEntry *pEntry = NULL;
+
+ for (QT3DSU32 i = 0; i < m_ShadowMapList.size(); i++) {
+ pEntry = &m_ShadowMapList[i];
+ if (pEntry->m_LightIndex == index)
+ return pEntry;
+ }
+
+ return NULL;
+}
+
+Qt3DSShadowMap *Qt3DSShadowMap::Create(IQt3DSRenderContext &inContext)
+{
+ return QT3DS_NEW(inContext.GetFoundation().getAllocator(), Qt3DSShadowMap)(inContext);
+}
diff --git a/src/runtimerender/Qt3DSRenderShadowMap.h b/src/runtimerender/Qt3DSRenderShadowMap.h
new file mode 100644
index 0000000..c5ba2ea
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderShadowMap.h
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADOW_MAP_H
+#define QT3DS_RENDER_SHADOW_MAP_H
+#include "Qt3DSRenderContextCore.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSMat44.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#ifdef _INTEGRITYPLATFORM
+#include "render/Qt3DSRenderTextureCube.h"
+#endif
+
+namespace qt3ds {
+namespace render {
+
+ struct SLayerRenderData;
+
+ struct ShadowMapModes
+ {
+ enum Enum {
+ SSM, ///< standard shadow mapping
+ VSM, ///< variance shadow mapping
+ CUBE, ///< cubemap omnidirectional shadows
+ };
+ };
+
+ struct ShadowFilterValues
+ {
+ enum Enum {
+ NONE = 1 << 0, ///< hard shadows
+ PCF = 1 << 1, ///< Percentage close filtering
+ BLUR = 1 << 2, ///< Gausian Blur
+ };
+ };
+
+ struct SShadowMapEntry
+ {
+ SShadowMapEntry()
+ : m_LightIndex(QT3DS_MAX_U32)
+ , m_ShadowMapMode(ShadowMapModes::SSM)
+ , m_ShadowFilterFlags(ShadowFilterValues::NONE)
+ {
+ }
+
+ SShadowMapEntry(QT3DSU32 index, ShadowMapModes::Enum mode, ShadowFilterValues::Enum filter,
+ NVRenderTexture2D &depthMap, NVRenderTexture2D &depthCopy,
+ NVRenderTexture2D &depthTemp)
+ : m_LightIndex(index)
+ , m_ShadowMapMode(mode)
+ , m_ShadowFilterFlags(filter)
+ , m_DepthMap(depthMap)
+ , m_DepthCopy(depthCopy)
+ , m_DepthCube(NULL)
+ , m_CubeCopy(NULL)
+ , m_DepthRender(depthTemp)
+ {
+ }
+
+ SShadowMapEntry(QT3DSU32 index, ShadowMapModes::Enum mode, ShadowFilterValues::Enum filter,
+ NVRenderTextureCube &depthCube, NVRenderTextureCube &cubeTmp,
+ NVRenderTexture2D &depthTemp)
+ : m_LightIndex(index)
+ , m_ShadowMapMode(mode)
+ , m_ShadowFilterFlags(filter)
+ , m_DepthMap(NULL)
+ , m_DepthCopy(NULL)
+ , m_DepthCube(depthCube)
+ , m_CubeCopy(cubeTmp)
+ , m_DepthRender(depthTemp)
+ {
+ }
+
+ QT3DSU32 m_LightIndex; ///< the light index it belongs to
+ ShadowMapModes::Enum m_ShadowMapMode; ///< shadow map method
+ ShadowFilterValues::Enum m_ShadowFilterFlags; ///< shadow filter mode
+
+ // PKC : Adding the DepthRender buffer allows us to have a depth+stencil format when filling
+ // the shadow maps (depth+stencil is necessary), but use a more compact format for the
+ // actual
+ // shadow map used at shade time. See if it's worth adding.
+ NVScopedRefCounted<NVRenderTexture2D> m_DepthMap; ///< shadow map texture
+ NVScopedRefCounted<NVRenderTexture2D>
+ m_DepthCopy; ///< shadow map buffer used during blur passes
+ NVScopedRefCounted<NVRenderTextureCube> m_DepthCube; ///< shadow cube map
+ NVScopedRefCounted<NVRenderTextureCube>
+ m_CubeCopy; ///< cube map buffer used during the blur passes
+ NVScopedRefCounted<NVRenderTexture2D>
+ m_DepthRender; ///< shadow depth+stencil map used during rendering
+
+ QT3DSMat44 m_LightVP; ///< light view projection matrix
+ QT3DSMat44 m_LightCubeView[6]; ///< light cubemap view matrices
+ QT3DSMat44 m_LightView; ///< light view transform
+ };
+
+ class Qt3DSShadowMap : public NVRefCounted
+ {
+ typedef nvvector<SShadowMapEntry> TShadowMapEntryList;
+
+ public:
+ IQt3DSRenderContext &m_Context;
+ volatile QT3DSI32 mRefCount;
+
+ public:
+ Qt3DSShadowMap(IQt3DSRenderContext &inContext);
+ ~Qt3DSShadowMap();
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Context.GetAllocator())
+
+ /*
+ * @brief Add a shadow map entry
+ * This creates a new shadow map if it does not exist or changed
+ *
+ * @param[in] index shadow map entry index
+ * @param[in] width shadow map width
+ * @param[in] height shadow map height
+ * @param[in] format shadow map format
+ * @param[in] samples shadow map sample count
+ * @param[in] mode shadow map mode like SSM, VCM
+ * @param[in] filter soft shadow map mode filter like PCF
+ *
+ * @ return no return
+ */
+ void AddShadowMapEntry(QT3DSU32 index, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum format, QT3DSU32 samples,
+ ShadowMapModes::Enum mode, ShadowFilterValues::Enum filter);
+
+ /*
+ * @brief Get a shadow map entry
+ *
+ * @param[in] index shadow map entry index
+ *
+ * @ return shadow map entry or NULL
+ */
+ SShadowMapEntry *GetShadowMapEntry(QT3DSU32 index);
+
+ /*
+ * @brief Get shadow map entry count
+ *
+ * @ return count of shadow map entries
+ */
+ QT3DSU32 GetShadowMapEntryCount() { return m_ShadowMapList.size(); }
+
+ static Qt3DSShadowMap *Create(IQt3DSRenderContext &inContext);
+
+ private:
+ TShadowMapEntryList m_ShadowMapList; ///< List of shadow map entries
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderSubPresentationHelper.h b/src/runtimerender/Qt3DSRenderSubPresentationHelper.h
new file mode 100644
index 0000000..d77c7a7
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderSubPresentationHelper.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SUB_PRESENTATION_HELPER_H
+#define QT3DS_RENDER_SUB_PRESENTATION_HELPER_H
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderer.h"
+#include "render/Qt3DSRenderContext.h"
+
+namespace qt3ds {
+namespace render {
+
+ // Small helper object to setup the state needed to render a sub presentation
+ // correctly. Sub presentations may have transparency, and if they do then
+ // then need to be rendered with pre multiple alpha disabled. If they don't,
+ // then they need to be rendered with pre-multiply alpha enabled (and have the alpha channel
+ // set to 1
+ struct SSubPresentationHelper
+ {
+ IQt3DSRenderContext &m_RenderContext;
+ QSize m_PreviousPresentationDimensions;
+
+ bool m_WasInSubPresentation;
+
+ SSubPresentationHelper(IQt3DSRenderContext &inContext,
+ const QSize &inPresDimensions)
+ : m_RenderContext(inContext)
+ , m_PreviousPresentationDimensions(inContext.GetCurrentPresentationDimensions())
+ , m_WasInSubPresentation(inContext.IsInSubPresentation())
+ {
+ m_RenderContext.SetInSubPresentation(true);
+ m_RenderContext.SetPresentationDimensions(inPresDimensions);
+ }
+ ~SSubPresentationHelper()
+ {
+ m_RenderContext.SetInSubPresentation(m_WasInSubPresentation);
+ m_RenderContext.SetPresentationDimensions(m_PreviousPresentationDimensions);
+ }
+ };
+}
+}
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderSubpresentation.cpp b/src/runtimerender/Qt3DSRenderSubpresentation.cpp
new file mode 100644
index 0000000..0b9d42d
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderSubpresentation.cpp
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderSubpresentation.h"
+#include "Qt3DSRenderRenderList.h"
+#ifdef _WIN32
+#pragma warning(disable : 4355) // this used in initializer list. I have never seen this result in
+ // a physical error
+#endif
+namespace qt3ds {
+namespace render {
+
+ Qt3DSRenderPickResult CSubPresentationPickQuery::Pick(const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool inPickEverything)
+ {
+ return m_Renderer.DoGraphQueryPick(inMouseCoords, inViewportDimensions, inPickEverything);
+ }
+
+ CSubPresentationRenderer::CSubPresentationRenderer(IQt3DSRenderContext &inRenderContext,
+ SPresentation &inPresentation)
+ : m_RenderContext(inRenderContext)
+ , m_Presentation(inPresentation)
+ , mRefCount(0)
+ , m_PickQuery(*this)
+ , m_OffscreenRendererType(inRenderContext.GetStringTable().RegisterStr(GetRendererName()))
+ {
+ }
+
+ SOffscreenRendererEnvironment
+ CSubPresentationRenderer::GetDesiredEnvironment(QT3DSVec2 /*inPresScale*/)
+ {
+ // If we aren't using a clear color, then we are expected to blend with the background
+ bool hasTransparency = m_Presentation.m_Scene->m_UseClearColor ? false : true;
+ NVRenderTextureFormats::Enum format =
+ hasTransparency ? NVRenderTextureFormats::RGBA8 : NVRenderTextureFormats::RGB8;
+ return SOffscreenRendererEnvironment((QT3DSU32)(m_Presentation.m_PresentationDimensions.x),
+ (QT3DSU32)(m_Presentation.m_PresentationDimensions.y),
+ format, OffscreenRendererDepthValues::Depth16, false,
+ AAModeValues::NoAA);
+ }
+
+ SOffscreenRenderFlags
+ CSubPresentationRenderer::NeedsRender(const SOffscreenRendererEnvironment & /*inEnvironment*/,
+ QT3DSVec2 /*inPresScale*/,
+ const SRenderInstanceId instanceId)
+ {
+ bool hasTransparency = m_Presentation.m_Scene->m_UseClearColor ? false : true;
+ NVRenderRect theViewportSize(m_RenderContext.GetRenderList().GetViewport());
+ bool wasDirty = m_Presentation.m_Scene->PrepareForRender(
+ QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
+ m_RenderContext, instanceId);
+ return SOffscreenRenderFlags(hasTransparency, wasDirty);
+ }
+
+ // Returns true if the rendered result image has transparency, or false
+ // if it should be treated as a completely opaque image.
+ void CSubPresentationRenderer::Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2,
+ SScene::RenderClearCommand inClearColorBuffer,
+ const SRenderInstanceId instanceId)
+ {
+ SSubPresentationHelper theHelper(
+ m_RenderContext,
+ QSize((QT3DSU32)inEnvironment.m_Width, (QT3DSU32)inEnvironment.m_Height));
+ NVRenderRect theViewportSize(inRenderContext.GetViewport());
+ m_Presentation.m_Scene->Render(
+ QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
+ m_RenderContext, inClearColorBuffer, instanceId);
+ m_LastRenderedEnvironment = inEnvironment;
+ }
+
+ void CSubPresentationRenderer::RenderWithClear(
+ const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
+ SScene::RenderClearCommand inClearBuffer, QT3DSVec4 inClearColor,
+ const SRenderInstanceId id)
+ {
+ Q_UNUSED(inEnvironment);
+ Q_UNUSED(inPresScale);
+ NVRenderRect theViewportSize(inRenderContext.GetViewport());
+ m_Presentation.m_Scene->RenderWithClear(
+ QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
+ m_RenderContext, inClearBuffer, inClearColor, id);
+ }
+
+ // You know the viewport dimensions because
+ Qt3DSRenderPickResult CSubPresentationRenderer::DoGraphQueryPick(
+ const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions, bool inPickEverything)
+ {
+ Qt3DSRenderPickResult thePickResult;
+
+ if (m_Presentation.m_Scene && m_Presentation.m_Scene->m_FirstChild) {
+ thePickResult = m_RenderContext.GetRenderer().Pick(
+ *m_Presentation.m_Scene->m_FirstChild, inViewportDimensions,
+ QT3DSVec2(inMouseCoords.x, inMouseCoords.y), true, inPickEverything);
+ }
+ return thePickResult;
+ }
+}
+}
diff --git a/src/runtimerender/Qt3DSRenderSubpresentation.h b/src/runtimerender/Qt3DSRenderSubpresentation.h
new file mode 100644
index 0000000..4adac84
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderSubpresentation.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SUBPRESENTATION_H
+#define QT3DS_RENDER_SUBPRESENTATION_H
+
+#include "Qt3DSOffscreenRenderManager.h"
+#include "Qt3DSRenderSubPresentationHelper.h"
+#include "Qt3DSRenderPresentation.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ class CSubPresentationRenderer;
+
+ struct CSubPresentationPickQuery : public IGraphObjectPickQuery
+ {
+ CSubPresentationRenderer &m_Renderer;
+
+ CSubPresentationPickQuery(CSubPresentationRenderer &renderer)
+ : m_Renderer(renderer)
+ {
+ }
+ Qt3DSRenderPickResult Pick(const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool inPickEverything) override;
+ };
+
+ class CSubPresentationRenderer : public IOffscreenRenderer
+ {
+ public:
+ IQt3DSRenderContext &m_RenderContext;
+ SPresentation &m_Presentation;
+ volatile QT3DSI32 mRefCount;
+ SOffscreenRendererEnvironment m_LastRenderedEnvironment;
+ CSubPresentationPickQuery m_PickQuery;
+ CRegisteredString m_OffscreenRendererType;
+
+ CSubPresentationRenderer(IQt3DSRenderContext &inRenderContext, SPresentation &inPresentation);
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext.GetAllocator())
+
+ SOffscreenRendererEnvironment GetDesiredEnvironment(QT3DSVec2 inPresScale) override;
+ virtual SOffscreenRenderFlags
+ NeedsRender(const SOffscreenRendererEnvironment &inEnvironment, QT3DSVec2 inPresScale,
+ const SRenderInstanceId instanceId) override;
+ void Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext & /*inRenderContext*/,
+ QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer,
+ const SRenderInstanceId instanceId) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext,
+ QT3DSVec2 inPresScale, SScene::RenderClearCommand inClearBuffer,
+ QT3DSVec4 inClearColor,
+ const SRenderInstanceId instanceId) override;
+ IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId) override { return &m_PickQuery; }
+ bool Pick(const QT3DSVec2 & /*inMouseCoords*/, const QT3DSVec2 & /*inViewportDimensions*/,
+ const SRenderInstanceId) override
+ {
+ return false;
+ }
+ void addCallback(IOffscreenRendererCallback *cb) override
+ {
+
+ }
+ // Used for RTTI purposes so we can safely static-cast an offscreen renderer to a
+ // CSubPresentationRenderer
+ static const char *GetRendererName() { return "SubPresentation"; }
+ CRegisteredString GetOffscreenRendererType() override { return m_OffscreenRendererType; }
+
+ Qt3DSRenderPickResult DoGraphQueryPick(const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool inPickEverything);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderTaggedPointer.h b/src/runtimerender/Qt3DSRenderTaggedPointer.h
new file mode 100644
index 0000000..8dd8bdd
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTaggedPointer.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TAGGED_POINTER_H
+#define QT3DS_RENDER_TAGGED_POINTER_H
+#include "Qt3DSRender.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace render {
+
+ // User's will need to define specialize this struct in order
+ // to de-tag a pointer.
+ template <typename TDataType>
+ struct SPointerTag
+ {
+ /* Expected API for runtime RTTI
+ static CRegisteredString GetTag() { return g_dtype_specific_string; }
+ */
+ };
+
+ // A pointer tagged with an identifier so we can have generic
+ // user data that is still somewhat typesafe.
+ struct STaggedPointer
+ {
+ void *m_UserData;
+ QT3DSU32 m_Tag;
+ STaggedPointer()
+ : m_UserData(NULL)
+ , m_Tag(0)
+ {
+ }
+
+ STaggedPointer(void *inUserData, QT3DSU32 inTag)
+ : m_UserData(inUserData)
+ , m_Tag(inTag)
+ {
+ }
+
+ template <typename TDataType>
+ STaggedPointer(TDataType *inType)
+ : m_UserData(reinterpret_cast<void *>(inType))
+ , m_Tag(SPointerTag<TDataType>::GetTag())
+ {
+ }
+
+ template <typename TDataType>
+ TDataType *DynamicCast() const
+ {
+ if (m_Tag == SPointerTag<TDataType>::GetTag())
+ return reinterpret_cast<TDataType *>(m_UserData);
+ return NULL;
+ }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderTessModeValues.h b/src/runtimerender/Qt3DSRenderTessModeValues.h
new file mode 100644
index 0000000..15ea03c
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTessModeValues.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TESS_MODE_VALUES_H
+#define QT3DS_RENDER_TESS_MODE_VALUES_H
+#include "Qt3DSRender.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SDefaultMaterial;
+ class IBufferManager;
+
+ struct TessModeValues
+ {
+ enum Enum {
+ NoTess = 0,
+ TessLinear = 1,
+ TessPhong = 2,
+ TessNPatch = 3,
+ };
+
+ static const char *toString(Enum value)
+ {
+ switch (value) {
+ case NoTess:
+ return "NoTess";
+ break;
+ case TessLinear:
+ return "TessLinear";
+ break;
+ case TessPhong:
+ return "TessPhong";
+ break;
+ case TessNPatch:
+ return "TessNPatch";
+ break;
+ default:
+ return "NoTess";
+ break;
+ }
+ }
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSRenderTextTextureAtlas.cpp b/src/runtimerender/Qt3DSRenderTextTextureAtlas.cpp
new file mode 100644
index 0000000..81c1d23
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTextTextureAtlas.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderTextTextureAtlas.h"
+#include "Qt3DSTextRenderer.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderContext.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct STextTextureAtlas : public ITextTextureAtlas
+{
+ static const QT3DSI32 TEXTURE_ATLAS_DIM =
+ 256; // if you change this you need to adjust Qt3DSOnscreenTextRenderer size as well
+
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+ NVScopedRefCounted<ITextRenderer> m_TextRenderer;
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+
+ STextTextureAtlas(NVFoundationBase &inFnd, ITextRenderer &inRenderer,
+ NVRenderContext &inRenderContext)
+ : m_Foundation(inFnd)
+ , mRefCount(0)
+ , m_TextRenderer(inRenderer)
+ , m_RenderContext(inRenderContext)
+ , m_TextureAtlasInitialized(false)
+ , m_textureAtlas(NULL)
+ {
+ }
+
+ virtual ~STextTextureAtlas()
+ {
+ if (m_textureAtlas) {
+ m_textureAtlas->release();
+ }
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ TTextRenderAtlasDetailsAndTexture RenderText(const STextRenderInfo &inText) override
+ {
+ SRenderTextureAtlasDetails theDetails = m_TextRenderer->RenderText(inText);
+
+ return TTextRenderAtlasDetailsAndTexture(theDetails, m_textureAtlas);
+ }
+
+ bool IsInitialized() override { return m_TextureAtlasInitialized && m_textureAtlas; }
+
+ TTextTextureAtlasDetailsAndTexture PrepareTextureAtlas() override
+ {
+ if (!m_TextureAtlasInitialized && !m_textureAtlas) {
+ // create the texture atlas entries
+ QT3DSI32 count = m_TextRenderer->CreateTextureAtlas();
+
+ m_textureAtlas = m_RenderContext->CreateTexture2D();
+ if (m_textureAtlas && count) {
+ m_TextureAtlasInitialized = true;
+ m_textureAtlas->addRef();
+ // if you change the size you need to adjust Qt3DSOnscreenTextRenderer too
+ if (m_RenderContext->GetRenderContextType() == NVRenderContextValues::GLES2) {
+ m_textureAtlas->SetTextureData(NVDataRef<QT3DSU8>(), 0, TEXTURE_ATLAS_DIM,
+ TEXTURE_ATLAS_DIM, NVRenderTextureFormats::RGBA8);
+ } else {
+ m_textureAtlas->SetTextureData(NVDataRef<QT3DSU8>(), 0, TEXTURE_ATLAS_DIM,
+ TEXTURE_ATLAS_DIM, NVRenderTextureFormats::Alpha8);
+ }
+ m_textureAtlas->SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ m_textureAtlas->SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ m_textureAtlas->SetTextureWrapS(NVRenderTextureCoordOp::ClampToEdge);
+ m_textureAtlas->SetTextureWrapT(NVRenderTextureCoordOp::ClampToEdge);
+ qt3ds::render::STextureDetails texTexDetails = m_textureAtlas->GetTextureDetails();
+ return TTextTextureAtlasDetailsAndTexture(
+ STextTextureAtlasDetails(texTexDetails.m_Height, texTexDetails.m_Height, false,
+ count),
+ m_textureAtlas);
+ }
+ }
+
+ return TTextTextureAtlasDetailsAndTexture(STextTextureAtlasDetails(), NULL);
+ }
+
+private:
+ bool m_TextureAtlasInitialized;
+ NVRenderTexture2D *m_textureAtlas; // this is the actual texture which has application lifetime
+};
+
+} // namespace
+
+ITextTextureAtlas &ITextTextureAtlas::CreateTextureAtlas(NVFoundationBase &inFnd,
+ ITextRenderer &inTextRenderer,
+ NVRenderContext &inRenderContext)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), STextTextureAtlas)(inFnd, inTextRenderer, inRenderContext);
+}
diff --git a/src/runtimerender/Qt3DSRenderTextTextureAtlas.h b/src/runtimerender/Qt3DSRenderTextTextureAtlas.h
new file mode 100644
index 0000000..7a3f121
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTextTextureAtlas.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TEXT_TEXTURE_ATLAS_H
+#define QT3DS_RENDER_TEXT_TEXTURE_ATLAS_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSRenderText.h"
+#include "EASTL/algorithm.h"
+
+namespace qt3ds {
+namespace render {
+
+ class ITextRenderer;
+
+ typedef eastl::pair<STextTextureAtlasDetails, NVScopedRefCounted<NVRenderTexture2D>>
+ TTextTextureAtlasDetailsAndTexture;
+ typedef eastl::pair<SRenderTextureAtlasDetails, NVScopedRefCounted<NVRenderTexture2D>>
+ TTextRenderAtlasDetailsAndTexture;
+
+ class ITextTextureAtlas : public NVRefCounted
+ {
+ protected:
+ virtual ~ITextTextureAtlas() {}
+ public:
+ virtual TTextRenderAtlasDetailsAndTexture RenderText(const STextRenderInfo &inText) = 0;
+ virtual bool IsInitialized() = 0;
+ virtual TTextTextureAtlasDetailsAndTexture PrepareTextureAtlas() = 0;
+
+ static ITextTextureAtlas &CreateTextureAtlas(NVFoundationBase &inFnd,
+ ITextRenderer &inTextRenderer,
+ NVRenderContext &inRenderContext);
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderTextTextureCache.cpp b/src/runtimerender/Qt3DSRenderTextTextureCache.cpp
new file mode 100644
index 0000000..8edbeca
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTextTextureCache.cpp
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderTextTextureCache.h"
+#include "Qt3DSTextRenderer.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSPool.h"
+
+using namespace qt3ds::render;
+
+namespace eastl {
+template <>
+struct hash<STextRenderInfo>
+{
+ size_t operator()(const qt3ds::render::STextRenderInfo &inInfo) const
+ {
+ size_t retval = hash<size_t>()(reinterpret_cast<size_t>(inInfo.m_Text.c_str()));
+ retval = retval ^ hash<size_t>()(reinterpret_cast<size_t>(inInfo.m_Font.c_str()));
+ retval = retval ^ hash<float>()(inInfo.m_FontSize);
+ retval = retval ^ hash<int>()(static_cast<int>(inInfo.m_HorizontalAlignment));
+ retval = retval ^ hash<int>()(static_cast<int>(inInfo.m_VerticalAlignment));
+ retval = retval ^ hash<float>()(inInfo.m_Leading);
+ retval = retval ^ hash<float>()(inInfo.m_Tracking);
+ retval = retval ^ hash<bool>()(inInfo.m_DropShadow);
+ retval = retval ^ hash<float>()(inInfo.m_DropShadowStrength);
+ retval = retval ^ hash<float>()(inInfo.m_DropShadowOffsetX);
+ retval = retval ^ hash<float>()(inInfo.m_DropShadowOffsetY);
+ retval = retval ^ hash<float>()(inInfo.m_BoundingBox.x);
+ retval = retval ^ hash<float>()(inInfo.m_BoundingBox.y);
+ retval = retval ^ hash<int>()(static_cast<int>(inInfo.m_Elide));
+ retval = retval ^ hash<int>()(static_cast<int>(inInfo.m_WordWrap));
+ retval = retval ^ hash<bool>()(inInfo.m_EnableAcceleratedFont);
+ return retval;
+ }
+};
+}
+
+namespace {
+struct STextRenderInfoAndHash
+{
+ STextRenderInfo m_Info;
+ QT3DSF32 m_ScaleFactor;
+ size_t m_Hashcode;
+ STextRenderInfoAndHash(const STextRenderInfo &inInfo, QT3DSF32 inScaleFactor)
+ : m_Info(inInfo)
+ , m_ScaleFactor(inScaleFactor)
+ , m_Hashcode(eastl::hash<STextRenderInfo>()(inInfo) ^ eastl::hash<float>()(inScaleFactor))
+ {
+ }
+ bool operator==(const STextRenderInfoAndHash &inOther) const
+ {
+ return m_Info.m_Text == inOther.m_Info.m_Text && m_Info.m_Font == inOther.m_Info.m_Font
+ && m_Info.m_FontSize == inOther.m_Info.m_FontSize
+ && m_Info.m_HorizontalAlignment == inOther.m_Info.m_HorizontalAlignment
+ && m_Info.m_VerticalAlignment == inOther.m_Info.m_VerticalAlignment
+ && m_Info.m_Leading == inOther.m_Info.m_Leading
+ && m_Info.m_Tracking == inOther.m_Info.m_Tracking
+ && m_Info.m_DropShadow == inOther.m_Info.m_DropShadow
+ && m_Info.m_DropShadowStrength == inOther.m_Info.m_DropShadowStrength
+ && m_Info.m_DropShadowOffsetX == inOther.m_Info.m_DropShadowOffsetX
+ && m_Info.m_DropShadowOffsetY == inOther.m_Info.m_DropShadowOffsetY
+ && m_Info.m_BoundingBox == inOther.m_Info.m_BoundingBox
+ && m_Info.m_WordWrap == inOther.m_Info.m_WordWrap
+ && m_Info.m_EnableAcceleratedFont == inOther.m_Info.m_EnableAcceleratedFont
+ && m_ScaleFactor == inOther.m_ScaleFactor;
+ }
+};
+}
+
+namespace eastl {
+template <>
+struct hash<STextRenderInfoAndHash>
+{
+ size_t operator()(const STextRenderInfoAndHash &inInfo) const { return inInfo.m_Hashcode; }
+};
+};
+
+namespace {
+
+struct STextCacheNode
+{
+ STextCacheNode *m_PreviousSibling;
+ STextCacheNode *m_NextSibling;
+ STextRenderInfoAndHash m_RenderInfo;
+ TTPathObjectAndTexture m_TextInfo;
+ QT3DSU32 m_FrameCount;
+
+ STextCacheNode(const STextRenderInfoAndHash &inRenderInfo,
+ const TTPathObjectAndTexture &inTextInfo)
+ : m_PreviousSibling(NULL)
+ , m_NextSibling(NULL)
+ , m_RenderInfo(inRenderInfo)
+ , m_TextInfo(inTextInfo)
+ , m_FrameCount(0)
+ {
+ }
+};
+
+typedef nvhash_map<STextRenderInfoAndHash, STextCacheNode *> TTextureInfoHash;
+
+DEFINE_INVASIVE_LIST(TextCacheNode);
+IMPLEMENT_INVASIVE_LIST(TextCacheNode, m_PreviousSibling, m_NextSibling);
+
+struct STextTextureCache : public ITextTextureCache
+{
+ typedef Pool<STextCacheNode, ForwardingAllocator> TPoolType;
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+ NVScopedRefCounted<ITextRenderer> m_TextRenderer;
+ TTextureInfoHash m_TextureCache;
+ TTextCacheNodeList m_LRUList;
+ TPoolType m_CacheNodePool;
+ QT3DSU32 m_HighWaterMark;
+ QT3DSU32 m_FrameCount;
+ QT3DSU32 m_TextureTotalBytes;
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+ bool m_CanUsePathRendering; ///< true if we use hardware accelerated font rendering
+
+ STextTextureCache(NVFoundationBase &inFnd, ITextRenderer &inRenderer,
+ NVRenderContext &inRenderContext)
+ : m_Foundation(inFnd)
+ , mRefCount(0)
+ , m_TextRenderer(inRenderer)
+ , m_TextureCache(m_Foundation.getAllocator(), "STextTextureCache::m_TextureCache")
+ , m_CacheNodePool(ForwardingAllocator(m_Foundation.getAllocator(),
+ "STextTextureCache::m_CacheNodePool"))
+ , m_HighWaterMark(0x100000)
+ , m_FrameCount(0)
+ , m_TextureTotalBytes(0)
+ , m_RenderContext(inRenderContext)
+ {
+ // hardware accelerate font rendering not ready yet
+ m_CanUsePathRendering = (m_RenderContext->IsPathRenderingSupported()
+ && m_RenderContext->IsProgramPipelineSupported());
+ }
+
+ virtual ~STextTextureCache()
+ {
+ for (TTextCacheNodeList::iterator iter = m_LRUList.begin(), end = m_LRUList.end();
+ iter != end; ++iter)
+ iter->~STextCacheNode();
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ static inline QT3DSU32 GetNumBytes(NVRenderTexture2D &inTexture)
+ {
+ STextureDetails theDetails(inTexture.GetTextureDetails());
+ return theDetails.m_Width * theDetails.m_Height
+ * NVRenderTextureFormats::getSizeofFormat(theDetails.m_Format);
+ }
+
+ NVScopedRefCounted<NVRenderTexture2D> InvalidateLastItem()
+ {
+ NVScopedRefCounted<NVRenderTexture2D> nextTexture;
+ if (m_LRUList.empty() == false) {
+ STextCacheNode &theEnd = m_LRUList.back();
+ if (theEnd.m_FrameCount != m_FrameCount) {
+ nextTexture = theEnd.m_TextInfo.second.second;
+ STextureDetails theDetails = nextTexture->GetTextureDetails();
+ m_TextureTotalBytes -= GetNumBytes(*nextTexture.mPtr);
+ m_LRUList.remove(theEnd);
+ // copy the key because the next statement will destroy memory
+ m_TextureCache.erase(theEnd.m_RenderInfo);
+ theEnd.~STextCacheNode();
+ m_CacheNodePool.deallocate(&theEnd);
+ }
+ }
+ return nextTexture;
+ }
+
+ TTPathObjectAndTexture RenderText(const STextRenderInfo &inText, QT3DSF32 inScaleFactor) override
+ {
+ STextRenderInfoAndHash theKey(inText, inScaleFactor);
+ TTextureInfoHash::iterator theFind(
+ m_TextureCache.find(theKey));
+ STextCacheNode *retval = NULL;
+ if (theFind != m_TextureCache.end()) {
+ retval = theFind->second;
+ m_LRUList.remove(*retval);
+ } else {
+ NVScopedRefCounted<NVRenderTexture2D> nextTexture;
+ if (m_TextureTotalBytes >= m_HighWaterMark && m_LRUList.empty() == false)
+ nextTexture = InvalidateLastItem();
+
+ if (nextTexture.mPtr == NULL)
+ nextTexture = m_RenderContext->CreateTexture2D();
+
+ NVScopedRefCounted<NVRenderPathFontItem> nextPathFontItemObject;
+ NVScopedRefCounted<NVRenderPathFontSpecification> nextPathFontObject;
+ // HW acceleration for fonts not supported
+ //if (m_CanUsePathRendering && inText.m_EnableAcceleratedFont) {
+ // nextPathFontItemObject = m_RenderContext->CreatePathFontItem();
+ // nextPathFontObject = m_RenderContext->CreatePathFontSpecification(inText.m_Font);
+ //}
+
+ STextRenderInfo theTextInfo(inText);
+ theTextInfo.m_FontSize *= inScaleFactor;
+ STextTextureDetails theDetails;
+
+
+ // HW acceleration for fonts not supported
+ //if (!m_CanUsePathRendering || !inText.m_EnableAcceleratedFont)
+ theDetails = m_TextRenderer->RenderText(theTextInfo, *nextTexture.mPtr);
+ //else
+ // theDetails = m_TextRenderer->RenderText(theTextInfo, *nextPathFontItemObject.mPtr,
+ // *nextPathFontObject.mPtr);
+
+ if (fabs(inScaleFactor - 1.0f) > .001f) {
+ TTPathObjectAndTexture theCanonicalDetails = RenderText(inText, 1.0f);
+ theDetails.m_ScaleFactor.x =
+ (QT3DSF32)theDetails.m_TextWidth / theCanonicalDetails.second.first.m_TextWidth;
+ theDetails.m_ScaleFactor.y =
+ (QT3DSF32)theDetails.m_TextHeight / theCanonicalDetails.second.first.m_TextHeight;
+ }
+ retval = m_CacheNodePool.construct(
+ theKey, TTPathObjectAndTexture(
+ TPathFontSpecAndPathObject(nextPathFontObject, nextPathFontItemObject),
+ TTextTextureDetailsAndTexture(theDetails, nextTexture)),
+ __FILE__, __LINE__);
+ TTextureInfoHash::iterator insert =
+ m_TextureCache.insert(eastl::make_pair(theKey, retval)).first;
+ if (!m_CanUsePathRendering)
+ m_TextureTotalBytes += GetNumBytes(*(retval->m_TextInfo.second.second.mPtr));
+ }
+ retval->m_FrameCount = m_FrameCount;
+ m_LRUList.push_front(*retval);
+ return retval->m_TextInfo;
+ }
+ // We may have one more texture in cache than this byte count, but this will be the limiting
+ // factor.
+ QT3DSU32 GetCacheHighWaterBytes() const override { return m_HighWaterMark; }
+ // default cache size is 10 MB.
+ void SetCacheHighWaterBytes(QT3DSU32 inByteCount) override { m_HighWaterMark = inByteCount; }
+
+ void BeginFrame() override {}
+ void EndFrame() override
+ {
+ // algorithm is resistant to rollover.
+ ++m_FrameCount;
+ // Release any texture that put us over the limit.
+ // This almost guarantees thrashing if the limit is set too low. Enable at your
+ // own risk at *TEST CAREFULLY*
+ /*
+ while( m_TextureTotalBytes >= m_HighWaterMark && m_LRUList.empty() == false )
+ InvalidateLastItem();
+ */
+ }
+};
+}
+
+ITextTextureCache &ITextTextureCache::CreateTextureCache(NVFoundationBase &inFnd,
+ ITextRenderer &inTextRenderer,
+ NVRenderContext &inRenderContext)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), STextTextureCache)(inFnd, inTextRenderer, inRenderContext);
+}
diff --git a/src/runtimerender/Qt3DSRenderTextTextureCache.h b/src/runtimerender/Qt3DSRenderTextTextureCache.h
new file mode 100644
index 0000000..45d4021
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTextTextureCache.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TEXT_TEXTURE_CACHE_H
+#define QT3DS_RENDER_TEXT_TEXTURE_CACHE_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSRenderText.h"
+#include "EASTL/algorithm.h"
+
+namespace qt3ds {
+namespace render {
+
+ class ITextRenderer;
+
+ typedef eastl::pair<NVScopedRefCounted<NVRenderPathFontSpecification>,
+ NVScopedRefCounted<NVRenderPathFontItem>>
+ TPathFontSpecAndPathObject;
+ typedef eastl::pair<STextTextureDetails, NVScopedRefCounted<NVRenderTexture2D>>
+ TTextTextureDetailsAndTexture;
+ typedef eastl::pair<TPathFontSpecAndPathObject, TTextTextureDetailsAndTexture>
+ TTPathObjectAndTexture;
+
+ class ITextTextureCache : public NVRefCounted
+ {
+ protected:
+ virtual ~ITextTextureCache() {}
+ public:
+ virtual TTPathObjectAndTexture RenderText(const STextRenderInfo &inText,
+ QT3DSF32 inScaleFactor) = 0;
+ // We may have one more texture in cache than this byte count, but this will be the limiting
+ // factor.
+ virtual QT3DSU32 GetCacheHighWaterBytes() const = 0;
+ virtual void SetCacheHighWaterBytes(QT3DSU32 inNumBytes) = 0;
+
+ virtual void BeginFrame() = 0;
+ // We need to know the frame rhythm because we can't release anything that was touched this
+ // frame.
+ virtual void EndFrame() = 0;
+
+ static ITextTextureCache &CreateTextureCache(NVFoundationBase &inFnd,
+ ITextRenderer &inTextRenderer,
+ NVRenderContext &inRenderContext);
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderTextTypes.h b/src/runtimerender/Qt3DSRenderTextTypes.h
new file mode 100644
index 0000000..bbaaa38
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTextTypes.h
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TEXT_TYPES_H
+#define QT3DS_RENDER_TEXT_TYPES_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSVec2.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct TextHorizontalAlignment
+ {
+ enum Enum {
+ Unknown = 0,
+ Left,
+ Center,
+ Right,
+ };
+ };
+
+ struct TextVerticalAlignment
+ {
+ enum Enum {
+ Unknown = 0,
+ Top,
+ Middle,
+ Bottom,
+ };
+ };
+
+ struct TextWordWrap
+ {
+ enum Enum {
+ Unknown = 0,
+ Clip,
+ WrapWord,
+ WrapAnywhere,
+ };
+ };
+
+ struct TextElide
+ {
+ enum Enum {
+ ElideNone = 0,
+ ElideLeft,
+ ElideMiddle,
+ ElideRight,
+ };
+ };
+
+ struct STextDimensions
+ {
+ QT3DSU32 m_TextWidth;
+ QT3DSU32 m_TextHeight;
+ STextDimensions(QT3DSU32 w, QT3DSU32 h)
+ : m_TextWidth(w)
+ , m_TextHeight(h)
+ {
+ }
+ STextDimensions()
+ : m_TextWidth(0)
+ , m_TextHeight(0)
+ {
+ }
+ };
+
+ struct STextTextureDetails : public STextDimensions
+ {
+ QT3DSVec2 m_ScaleFactor;
+ bool m_FlipY;
+ STextTextureDetails(QT3DSU32 w, QT3DSU32 h, bool inFlipY, QT3DSVec2 scaleF)
+ : STextDimensions(w, h)
+ , m_ScaleFactor(scaleF)
+ , m_FlipY(inFlipY)
+ {
+ }
+ STextTextureDetails()
+ : m_ScaleFactor(1.0f)
+ , m_FlipY(false)
+ {
+ }
+ };
+
+ struct STextTextureAtlasEntryDetails : public STextDimensions
+ {
+ QT3DSI32 m_X, m_Y;
+ STextTextureAtlasEntryDetails(QT3DSU32 w, QT3DSU32 h, QT3DSI32 x, QT3DSI32 y)
+ : STextDimensions(w, h)
+ , m_X(x)
+ , m_Y(y)
+ {
+ }
+ STextTextureAtlasEntryDetails()
+ : m_X(0)
+ , m_Y(0)
+ {
+ }
+ };
+
+ struct SRenderTextureAtlasDetails
+ {
+ QT3DSU32 m_VertexCount;
+ NVDataRef<QT3DSU8> m_Vertices;
+
+ SRenderTextureAtlasDetails(QT3DSU32 count, NVDataRef<QT3DSU8> inVertices)
+ : m_VertexCount(count)
+ , m_Vertices(inVertices)
+ {
+ }
+ SRenderTextureAtlasDetails()
+ : m_VertexCount(0)
+ , m_Vertices(NVDataRef<QT3DSU8>())
+ {
+ }
+ };
+
+ struct STextTextureAtlasDetails : public STextTextureDetails
+ {
+ QT3DSU32 m_EntryCount;
+ STextTextureAtlasDetails(QT3DSU32 w, QT3DSU32 h, bool inFlipY, QT3DSU32 count)
+ : STextTextureDetails(w, h, inFlipY, QT3DSVec2(1.0f))
+ , m_EntryCount(count)
+ {
+ }
+ STextTextureAtlasDetails()
+ : m_EntryCount(0)
+ {
+ }
+ };
+
+ // Adding/removing a member to this object means you need to update the texture cache code
+ // - UICRenderTextTextureCache.cpp
+
+ struct STextRenderInfo
+ {
+ CRegisteredString m_Text;
+ CRegisteredString m_Font;
+ QT3DSF32 m_FontSize;
+ TextHorizontalAlignment::Enum m_HorizontalAlignment;
+ TextVerticalAlignment::Enum m_VerticalAlignment;
+ QT3DSF32 m_Leading; // space between lines
+ QT3DSF32 m_Tracking; // space between letters
+ bool m_DropShadow;
+ QT3DSF32 m_DropShadowStrength;
+ QT3DSF32 m_DropShadowOffsetX;
+ QT3DSF32 m_DropShadowOffsetY;
+ TextWordWrap::Enum m_WordWrap;
+ QT3DSVec2 m_BoundingBox;
+ TextElide::Enum m_Elide;
+
+ QT3DSF32 m_ScaleX; // Pixel scale in X
+ QT3DSF32 m_ScaleY; // Pixel scale in Y
+
+ bool m_EnableAcceleratedFont; // use NV path rendering
+
+ STextRenderInfo();
+ ~STextRenderInfo();
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderTextureAtlas.cpp b/src/runtimerender/Qt3DSRenderTextureAtlas.cpp
new file mode 100644
index 0000000..062e7d5
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTextureAtlas.cpp
@@ -0,0 +1,364 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderTextureAtlas.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderContext.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+// a algorithm based on http://clb.demon.fi/files/RectangleBinPack/
+struct STextureAtlasBinPackSL
+{
+public:
+ STextureAtlasBinPackSL(NVRenderContext &inContext, QT3DSI32 width, QT3DSI32 height)
+ : m_BinWidth(width)
+ , m_BinHeight(height)
+ , m_SkyLine(inContext.GetAllocator(), "STextureAtlasBinPackSL::m_SkyLine")
+ {
+ // setup first entry
+ SSkylineNode theNode = { 0, 0, width };
+ m_SkyLine.push_back(theNode);
+ }
+
+ ~STextureAtlasBinPackSL() { m_SkyLine.clear(); }
+
+ /* insert new rect
+ *
+ */
+ STextureAtlasRect Insert(QT3DSI32 width, QT3DSI32 height)
+ {
+ QT3DSI32 binHeight;
+ QT3DSI32 binWidth;
+ QT3DSI32 binIndex;
+
+ STextureAtlasRect newNode = findPosition(width, height, &binWidth, &binHeight, &binIndex);
+
+ if (binIndex != -1) {
+ // adjust skyline nodes
+ addSkylineLevelNode(binIndex, newNode);
+ }
+
+ return newNode;
+ }
+
+private:
+ /// Represents a single level (a horizontal line) of the skyline/horizon/envelope.
+ struct SSkylineNode
+ {
+ int x; ///< The starting x-coordinate (leftmost).
+ int y; ///< The y-coordinate of the skyline level line.
+ int width; /// The line width. The ending coordinate (inclusive) will be x+width-1.
+ };
+
+ /* find position
+ *
+ */
+ STextureAtlasRect findPosition(QT3DSI32 width, QT3DSI32 height, QT3DSI32 *binWidth, QT3DSI32 *binHeight,
+ QT3DSI32 *binIndex)
+ {
+ *binWidth = m_BinWidth;
+ *binHeight = m_BinHeight;
+ *binIndex = -1;
+ STextureAtlasRect newRect;
+
+ for (QT3DSU32 i = 0; i < m_SkyLine.size(); ++i) {
+ QT3DSI32 y = getSkylineLevel(i, width, height);
+
+ if (y >= 0) {
+ if ((y + height < *binHeight)
+ || ((y + height == *binHeight) && m_SkyLine[i].width < *binWidth)) {
+ *binHeight = y + height;
+ *binIndex = i;
+ *binWidth = m_SkyLine[i].width;
+ newRect.m_X = m_SkyLine[i].x;
+ newRect.m_Y = y;
+ newRect.m_Width = width;
+ newRect.m_Height = height;
+ }
+ }
+ }
+
+ return newRect;
+ }
+
+ /* @brief check if rectangle can be placed into the the bin
+ *
+ * return skyline hight
+ */
+ int getSkylineLevel(QT3DSU32 binIndex, QT3DSI32 width, QT3DSI32 height)
+ {
+ // first check width exceed
+ QT3DSI32 x = m_SkyLine[binIndex].x;
+ if (x + width > m_BinWidth)
+ return -1;
+
+ QT3DSI32 leftAlign = width;
+ QT3DSU32 index = binIndex;
+ QT3DSI32 y = m_SkyLine[index].y;
+
+ while (leftAlign > 0) {
+ y = (y > m_SkyLine[index].y) ? y : m_SkyLine[index].y;
+ // check hight
+ if (y + height > m_BinHeight)
+ return -1;
+
+ leftAlign -= m_SkyLine[index].width;
+ ++index;
+
+ if (index > m_SkyLine.size())
+ return -1;
+ }
+
+ return y;
+ }
+
+ /* @brief add an new skyline entry
+ *
+ * return no return
+ */
+ void addSkylineLevelNode(QT3DSI32 binIndex, const STextureAtlasRect &newRect)
+ {
+ SSkylineNode newNode;
+
+ newNode.x = newRect.m_X;
+ newNode.y = newRect.m_Y + newRect.m_Height;
+ newNode.width = newRect.m_Width;
+ m_SkyLine.insert(m_SkyLine.begin() + binIndex, newNode);
+
+ // iterate over follow up nodes and adjust
+ for (QT3DSU32 i = binIndex + 1; i < m_SkyLine.size(); ++i) {
+ if (m_SkyLine[i].x < m_SkyLine[i - 1].x + m_SkyLine[i - 1].width) {
+ int shrink = m_SkyLine[i - 1].x + m_SkyLine[i - 1].width - m_SkyLine[i].x;
+
+ m_SkyLine[i].x += shrink;
+ m_SkyLine[i].width -= shrink;
+
+ if (m_SkyLine[i].width <= 0) {
+ m_SkyLine.erase(m_SkyLine.begin() + i);
+ --i;
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+
+ mergeSkylineLevelNodes();
+ }
+
+ /* @brief merge skyline node
+ *
+ * return no return
+ */
+ void mergeSkylineLevelNodes()
+ {
+ // check if we can merge nodes
+ for (QT3DSU32 i = 0; i < m_SkyLine.size() - 1; ++i) {
+ if (m_SkyLine[i].y == m_SkyLine[i + 1].y) {
+ m_SkyLine[i].width += m_SkyLine[i + 1].width;
+ m_SkyLine.erase(m_SkyLine.begin() + (i + 1));
+ --i;
+ }
+ }
+ }
+
+ QT3DSI32 m_BinWidth;
+ QT3DSI32 m_BinHeight;
+
+ nvvector<SSkylineNode> m_SkyLine;
+};
+
+struct STextureAtlasEntry
+{
+ STextureAtlasEntry()
+ : m_X(0)
+ , m_Y(0)
+ , m_Width(0)
+ , m_Height(0)
+ , m_pBuffer(NVDataRef<QT3DSU8>())
+ {
+ }
+ STextureAtlasEntry(QT3DSF32 x, QT3DSF32 y, QT3DSF32 w, QT3DSF32 h, NVDataRef<QT3DSU8> buffer)
+ : m_X(x)
+ , m_Y(y)
+ , m_Width(w)
+ , m_Height(h)
+ , m_pBuffer(buffer)
+ {
+ }
+ STextureAtlasEntry(const STextureAtlasEntry &entry)
+ {
+ m_X = entry.m_X;
+ m_Y = entry.m_Y;
+ m_Width = entry.m_Width;
+ m_Height = entry.m_Height;
+ m_pBuffer = entry.m_pBuffer;
+ }
+ ~STextureAtlasEntry() {}
+
+ QT3DSF32 m_X, m_Y;
+ QT3DSF32 m_Width, m_Height;
+ NVDataRef<QT3DSU8> m_pBuffer;
+};
+
+struct STextureAtlas : public ITextureAtlas
+{
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+
+ STextureAtlas(NVFoundationBase &inFnd, NVRenderContext &inRenderContext, QT3DSI32 width,
+ QT3DSI32 height)
+ : m_Foundation(inFnd)
+ , mRefCount(0)
+ , m_RenderContext(inRenderContext)
+ , m_Width(width)
+ , m_Height(height)
+ , m_Spacing(1)
+ , m_AtlasEntrys(inFnd.getAllocator(), "STextureAtlas::m_SkyLine")
+ {
+ m_pBinPack =
+ QT3DS_NEW(inFnd.getAllocator(), STextureAtlasBinPackSL)(inRenderContext, width, height);
+ }
+
+ virtual ~STextureAtlas()
+ {
+ RelaseEntries();
+
+ if (m_pBinPack)
+ NVDelete(m_Foundation.getAllocator(), m_pBinPack);
+ }
+
+ void RelaseEntries() override
+ {
+ nvvector<STextureAtlasEntry>::iterator it;
+
+ for (it = m_AtlasEntrys.begin(); it != m_AtlasEntrys.end(); it++) {
+ QT3DS_FREE(m_Foundation.getAllocator(), it->m_pBuffer.begin());
+ }
+
+ m_AtlasEntrys.clear();
+ }
+ QT3DSI32 GetWidth() const override { return m_Width; }
+ QT3DSI32 GetHeight() const override { return m_Height; }
+
+ QT3DSI32 GetAtlasEntryCount() const override { return m_AtlasEntrys.size(); }
+
+ TTextureAtlasEntryAndBuffer GetAtlasEntryByIndex(QT3DSU32 index) override
+ {
+ if (index >= m_AtlasEntrys.size())
+ return eastl::make_pair(STextureAtlasRect(), NVDataRef<QT3DSU8>());
+
+ return eastl::make_pair(STextureAtlasRect((QT3DSI32)m_AtlasEntrys[index].m_X,
+ (QT3DSI32)m_AtlasEntrys[index].m_Y,
+ (QT3DSI32)m_AtlasEntrys[index].m_Width,
+ (QT3DSI32)m_AtlasEntrys[index].m_Height),
+ m_AtlasEntrys[index].m_pBuffer);
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ STextureAtlasRect AddAtlasEntry(QT3DSI32 width, QT3DSI32 height, QT3DSI32 pitch,
+ QT3DSI32 dataWidth, NVConstDataRef<QT3DSU8> bufferData) override
+ {
+ STextureAtlasRect rect;
+
+ // pitch is the number of bytes per line in bufferData
+ // dataWidth is the relevant data width in bufferData. Rest is padding that can be ignored.
+ if (m_pBinPack) {
+ QT3DSI32 paddedWith, paddedPitch, paddedHeight;
+ // add spacing around the character
+ paddedWith = width + 2 * m_Spacing;
+ paddedPitch = dataWidth + 2 * m_Spacing;
+ paddedHeight = height + 2 * m_Spacing;
+ // first get entry in the texture atlas
+ rect = m_pBinPack->Insert(paddedWith, paddedHeight);
+ if (rect.m_Width == 0)
+ return rect;
+
+ // we align the data be to 4 byte
+ int alignment = (4 - (paddedPitch % 4)) % 4;
+ paddedPitch += alignment;
+
+ // since we do spacing around the character we need to copy line by line
+ QT3DSU8 *glyphBuffer =
+ (QT3DSU8 *)QT3DS_ALLOC(m_Foundation.getAllocator(),
+ paddedHeight * paddedPitch * sizeof(QT3DSU8), "STextureAtlas");
+ if (glyphBuffer) {
+ memset(glyphBuffer, 0, paddedHeight * paddedPitch);
+
+ QT3DSU8 *pDst = glyphBuffer + paddedPitch + m_Spacing;
+ QT3DSU8 *pSrc = const_cast<QT3DSU8 *>(bufferData.begin());
+ for (QT3DSI32 i = 0; i < height; ++i) {
+ memcpy(pDst, pSrc, dataWidth);
+
+ pDst += paddedPitch;
+ pSrc += pitch;
+ }
+
+ // add new entry
+ m_AtlasEntrys.push_back(STextureAtlasEntry(
+ (QT3DSF32)rect.m_X, (QT3DSF32)rect.m_Y, (QT3DSF32)paddedWith, (QT3DSF32)paddedHeight,
+ NVDataRef<QT3DSU8>(glyphBuffer, paddedHeight * paddedPitch * sizeof(QT3DSU8))));
+
+ // normalize texture coordinates
+ rect.m_NormX = (QT3DSF32)rect.m_X / (QT3DSF32)m_Width;
+ rect.m_NormY = (QT3DSF32)rect.m_Y / (QT3DSF32)m_Height;
+ rect.m_NormWidth = (QT3DSF32)paddedWith / (QT3DSF32)m_Width;
+ rect.m_NormHeight = (QT3DSF32)paddedHeight / (QT3DSF32)m_Height;
+ }
+ }
+
+ return rect;
+ }
+
+private:
+ QT3DSI32 m_Width; ///< texture atlas width
+ QT3DSI32 m_Height; ///< texture atlas height
+ QT3DSI32 m_Spacing; ///< spacing around the entry
+ nvvector<STextureAtlasEntry> m_AtlasEntrys; ///< our entries in the atlas
+ STextureAtlasBinPackSL *m_pBinPack; ///< our bin packer which actually does most of the work
+};
+
+} // namespace
+
+ITextureAtlas &ITextureAtlas::CreateTextureAtlas(NVFoundationBase &inFnd,
+ NVRenderContext &inRenderContext, QT3DSI32 width,
+ QT3DSI32 height)
+{
+ return *QT3DS_NEW(inFnd.getAllocator(), STextureAtlas)(inFnd, inRenderContext, width, height);
+}
diff --git a/src/runtimerender/Qt3DSRenderTextureAtlas.h b/src/runtimerender/Qt3DSRenderTextureAtlas.h
new file mode 100644
index 0000000..46f7bdb
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderTextureAtlas.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TEXTURE_ATLAS_H
+#define QT3DS_RENDER_TEXTURE_ATLAS_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "EASTL/algorithm.h"
+
+namespace qt3ds {
+namespace render {
+
+ class ITextRenderer;
+
+ struct STextureAtlasRect
+ {
+
+ STextureAtlasRect()
+ : m_X(0)
+ , m_Y(0)
+ , m_Width(0)
+ , m_Height(0)
+ {
+ }
+
+ STextureAtlasRect(QT3DSI32 x, QT3DSI32 y, QT3DSI32 w, QT3DSI32 h)
+ : m_X(x)
+ , m_Y(y)
+ , m_Width(w)
+ , m_Height(h)
+ {
+ }
+
+ QT3DSI32 m_X;
+ QT3DSI32 m_Y;
+ QT3DSI32 m_Width;
+ QT3DSI32 m_Height;
+
+ // normalized coordinates
+ QT3DSF32 m_NormX;
+ QT3DSF32 m_NormY;
+ QT3DSF32 m_NormWidth;
+ QT3DSF32 m_NormHeight;
+ };
+
+ typedef eastl::pair<STextureAtlasRect, NVDataRef<QT3DSU8>> TTextureAtlasEntryAndBuffer;
+
+ /**
+ * Abstract class of a texture atlas representation
+ */
+ class ITextureAtlas : public NVRefCounted
+ {
+ protected:
+ virtual ~ITextureAtlas() {}
+
+ public:
+ virtual QT3DSI32 GetWidth() const = 0;
+ virtual QT3DSI32 GetHeight() const = 0;
+ virtual QT3DSI32 GetAtlasEntryCount() const = 0;
+ virtual TTextureAtlasEntryAndBuffer GetAtlasEntryByIndex(QT3DSU32 index) = 0;
+
+ virtual STextureAtlasRect AddAtlasEntry(QT3DSI32 width, QT3DSI32 height, QT3DSI32 pitch,
+ QT3DSI32 dataWidth,
+ NVConstDataRef<QT3DSU8> bufferData) = 0;
+ virtual void RelaseEntries() = 0;
+
+ static ITextureAtlas &CreateTextureAtlas(NVFoundationBase &inFnd,
+ NVRenderContext &inRenderContext, QT3DSI32 width,
+ QT3DSI32 height);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderThreadPool.cpp b/src/runtimerender/Qt3DSRenderThreadPool.cpp
new file mode 100644
index 0000000..c9c7323
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderThreadPool.cpp
@@ -0,0 +1,277 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderThreadPool.h"
+#include "foundation/Qt3DSThread.h"
+#include "EASTL/utility.h"
+#include "EASTL/list.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct STaskHeadOp
+{
+ STask *get(STask &inTask) { return inTask.m_PreviousTask; }
+ void set(STask &inTask, STask *inItem) { inTask.m_PreviousTask = inItem; }
+};
+
+struct STaskTailOp
+{
+ STask *get(STask &inTask) { return inTask.m_NextTask; }
+ void set(STask &inTask, STask *inItem) { inTask.m_NextTask = inItem; }
+};
+
+typedef InvasiveLinkedList<STask, STaskHeadOp, STaskTailOp> TTaskList;
+
+struct SThreadPoolThread : public Thread
+{
+ IThreadPool *m_Mgr;
+ SThreadPoolThread(NVFoundationBase &foundation, IThreadPool *inMgr)
+ : Thread(foundation)
+ , m_Mgr(inMgr)
+ {
+ }
+ void execute(void) override
+ {
+ setName("Qt3DSRender Thread manager thread");
+ while (!quitIsSignalled()) {
+ STask task = m_Mgr->GetNextTask();
+ if (task.m_Function) {
+ task.CallFunction();
+ m_Mgr->TaskFinished(task.m_Id);
+ }
+ }
+ quit();
+ }
+};
+
+struct SThreadPool : public IThreadPool
+{
+ typedef nvhash_map<QT3DSU64, STask *> TIdTaskMap;
+ typedef Mutex::ScopedLock TLockType;
+ typedef Pool<STask, ForwardingAllocator> TTaskPool;
+
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+ nvvector<SThreadPoolThread *> m_Threads;
+ TIdTaskMap m_Tasks;
+ Sync m_TaskListEvent;
+ volatile bool m_Running;
+ Mutex m_TaskListMutex;
+ TTaskPool m_TaskPool;
+ TTaskList m_TaskList;
+
+ QT3DSU64 m_NextId;
+
+ SThreadPool(NVFoundationBase &inBase, QT3DSU32 inMaxThreads)
+ : m_Foundation(inBase)
+ , mRefCount(0)
+ , m_Threads(inBase.getAllocator(), "SThreadPool::m_Threads")
+ , m_Tasks(inBase.getAllocator(), "SThreadPool::m_Tasks")
+ , m_TaskListEvent(inBase.getAllocator())
+ , m_Running(true)
+ , m_TaskListMutex(m_Foundation.getAllocator())
+ , m_TaskPool(ForwardingAllocator(m_Foundation.getAllocator(), "SThreadPool::m_TaskPool"))
+ , m_NextId(1)
+ {
+ // Fire up our little pools of chaos.
+ for (QT3DSU32 idx = 0; idx < inMaxThreads; ++idx) {
+ m_Threads.push_back(
+ QT3DS_NEW(m_Foundation.getAllocator(), SThreadPoolThread)(m_Foundation, this));
+ m_Threads.back()->start(Thread::DEFAULT_STACK_SIZE);
+ }
+ }
+
+ void MutexHeldRemoveTaskFromList(STask *theTask)
+ {
+ if (theTask)
+ m_TaskList.remove(*theTask);
+ QT3DS_ASSERT(theTask->m_NextTask == NULL);
+ QT3DS_ASSERT(theTask->m_PreviousTask == NULL);
+ }
+
+ STask *MutexHeldNextTask()
+ {
+ STask *theTask = m_TaskList.front_ptr();
+ if (theTask) {
+ MutexHeldRemoveTaskFromList(theTask);
+ }
+ if (theTask) {
+ QT3DS_ASSERT(m_TaskList.m_Head != theTask);
+ QT3DS_ASSERT(m_TaskList.m_Tail != theTask);
+ }
+ return theTask;
+ }
+
+ virtual ~SThreadPool()
+ {
+ m_Running = false;
+
+ m_TaskListEvent.set();
+
+ for (QT3DSU32 idx = 0, end = m_Threads.size(); idx < end; ++idx)
+ m_Threads[idx]->signalQuit();
+
+ for (QT3DSU32 idx = 0, end = m_Threads.size(); idx < end; ++idx) {
+ m_Threads[idx]->waitForQuit();
+ NVDelete(m_Foundation.getAllocator(), m_Threads[idx]);
+ }
+
+ m_Threads.clear();
+
+ TLockType __listMutexLocker(m_TaskListMutex);
+
+ for (STask *theTask = MutexHeldNextTask(); theTask; theTask = MutexHeldNextTask()) {
+ theTask->Cancel();
+ }
+
+ m_Tasks.clear();
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ void VerifyTaskList()
+ {
+ STask *theLastTask = NULL;
+ for (STask *theTask = m_TaskList.m_Head; theTask; theTask = theTask->m_NextTask) {
+ QT3DS_ASSERT(theTask->m_PreviousTask == theLastTask);
+ theLastTask = theTask;
+ }
+ theLastTask = NULL;
+ for (STask *theTask = m_TaskList.m_Tail; theTask; theTask = theTask->m_PreviousTask) {
+ QT3DS_ASSERT(theTask->m_NextTask == theLastTask);
+ theLastTask = theTask;
+ }
+ }
+
+ QT3DSU64 AddTask(void *inUserData, TTaskFunction inFunction,
+ TTaskFunction inCancelFunction) override
+ {
+ if (inFunction && m_Running) {
+ TLockType __listMutexLocker(m_TaskListMutex);
+ QT3DSU64 taskId = m_NextId;
+ ++m_NextId;
+
+ STask *theTask = (STask *)m_TaskPool.allocate(__FILE__, __LINE__);
+ new (theTask) STask(inUserData, inFunction, inCancelFunction, taskId);
+ TIdTaskMap::iterator theTaskIter =
+ m_Tasks.insert(eastl::make_pair(taskId, theTask)).first;
+
+ m_TaskList.push_back(*theTask);
+ QT3DS_ASSERT(m_TaskList.m_Tail == theTask);
+
+#ifdef _DEBUG
+ VerifyTaskList();
+#endif
+ m_TaskListEvent.set();
+ m_TaskListEvent.reset();
+ return taskId;
+ }
+ QT3DS_ASSERT(false);
+ return 0;
+ }
+
+ TaskStates::Enum GetTaskState(QT3DSU64 inTaskId) override
+ {
+ TLockType __listMutexLocker(m_TaskListMutex);
+ TIdTaskMap::iterator theTaskIter = m_Tasks.find(inTaskId);
+ if (theTaskIter != m_Tasks.end())
+ return theTaskIter->second->m_TaskState;
+ return TaskStates::UnknownTask;
+ }
+
+ CancelReturnValues::Enum CancelTask(QT3DSU64 inTaskId) override
+ {
+ TLockType __listMutexLocker(m_TaskListMutex);
+ TIdTaskMap::iterator theTaskIter = m_Tasks.find(inTaskId);
+ if (theTaskIter == m_Tasks.end())
+ return CancelReturnValues::TaskCanceled;
+ if (theTaskIter->second->m_TaskState == TaskStates::Running)
+ return CancelReturnValues::TaskRunning;
+
+ STask *theTask = theTaskIter->second;
+ theTask->Cancel();
+ MutexHeldRemoveTaskFromList(theTask);
+ m_Tasks.erase(inTaskId);
+ m_TaskPool.deallocate(theTask);
+
+ return CancelReturnValues::TaskCanceled;
+ }
+
+ STask GetNextTask() override
+ {
+
+ if (m_Running) {
+ {
+ TLockType __listMutexLocker(m_TaskListMutex);
+ STask *retval = MutexHeldNextTask();
+ if (retval)
+ return *retval;
+ }
+ // If we couldn't get a task then wait.
+ m_TaskListEvent.wait(1000);
+ }
+ return STask();
+ }
+
+ void TaskFinished(QT3DSU64 inId) override
+ {
+ TLockType __listMutexLocker(m_TaskListMutex);
+ TIdTaskMap::iterator theTaskIter = m_Tasks.find(inId);
+ if (theTaskIter == m_Tasks.end()) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ STask *theTask(theTaskIter->second);
+
+#ifdef _DEBUG
+ QT3DS_ASSERT(theTask->m_NextTask == NULL);
+ QT3DS_ASSERT(theTask->m_PreviousTask == NULL);
+#endif
+ m_TaskPool.deallocate(theTask);
+ m_Tasks.erase(inId);
+ return;
+ }
+};
+}
+
+IThreadPool &IThreadPool::CreateThreadPool(NVFoundationBase &inFoundation, QT3DSU32 inNumThreads)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(), SThreadPool)(inFoundation, inNumThreads);
+}
diff --git a/src/runtimerender/Qt3DSRenderThreadPool.h b/src/runtimerender/Qt3DSRenderThreadPool.h
new file mode 100644
index 0000000..990106a
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderThreadPool.h
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_THREAD_POOL_H
+#define QT3DS_RENDER_THREAD_POOL_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+
+namespace qt3ds {
+namespace render {
+
+ typedef void (*TTaskFunction)(void *inUserData);
+
+struct TaskStates
+{
+ enum Enum {
+ UnknownTask = 0,
+ Queued,
+ Running,
+ };
+};
+
+
+struct STask
+{
+ void *m_UserData;
+ TTaskFunction m_Function;
+ TTaskFunction m_CancelFunction;
+ QT3DSU64 m_Id;
+ TaskStates::Enum m_TaskState;
+ STask *m_NextTask;
+ STask *m_PreviousTask;
+
+ STask(void *ud, TTaskFunction func, TTaskFunction cancelFunc, QT3DSU64 inId)
+ : m_UserData(ud)
+ , m_Function(func)
+ , m_CancelFunction(cancelFunc)
+ , m_Id(inId)
+ , m_TaskState(TaskStates::Queued)
+ , m_NextTask(NULL)
+ , m_PreviousTask(NULL)
+ {
+ }
+ STask()
+ : m_UserData(NULL)
+ , m_Function(NULL)
+ , m_CancelFunction(NULL)
+ , m_Id(0)
+ , m_TaskState(TaskStates::UnknownTask)
+ , m_NextTask(NULL)
+ , m_PreviousTask(NULL)
+ {
+ }
+ void CallFunction()
+ {
+ if (m_Function)
+ m_Function(m_UserData);
+ }
+ void Cancel()
+ {
+ if (m_CancelFunction)
+ m_CancelFunction(m_UserData);
+ }
+};
+
+
+ struct CancelReturnValues
+ {
+ enum Enum {
+ TaskCanceled = 0,
+ TaskRunning,
+ TaskNotFound,
+ };
+ };
+
+ class IThreadPool : public NVRefCounted
+ {
+ protected:
+ virtual ~IThreadPool() {}
+ public:
+ // Add a task to be run at some point in the future.
+ // Tasks will be run roughly in order they are given.
+ // The returned value is a handle that can be used to query
+ // details about the task
+ // Cancel function will be called if the thread pool is destroyed or
+ // of the task gets canceled.
+ virtual QT3DSU64 AddTask(void *inUserData, TTaskFunction inFunction,
+ TTaskFunction inCancelFunction) = 0;
+ virtual TaskStates::Enum GetTaskState(QT3DSU64 inTaskId) = 0;
+ virtual CancelReturnValues::Enum CancelTask(QT3DSU64 inTaskId) = 0;
+
+ virtual STask GetNextTask() = 0;
+ virtual void TaskFinished(QT3DSU64 inId) = 0;
+
+ static IThreadPool &CreateThreadPool(NVFoundationBase &inFoundation,
+ QT3DSU32 inNumThreads = 4);
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.cpp b/src/runtimerender/Qt3DSRenderUIPLoader.cpp
new file mode 100644
index 0000000..9aad397
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderUIPLoader.cpp
@@ -0,0 +1,2089 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifdef QT3DS_RENDER_ENABLE_LOAD_UIP
+
+#include "Qt3DSRenderUIPLoader.h"
+#include "Qt3DSRenderPresentation.h"
+#include "Qt3DSRenderNode.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderModel.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderUIPSharedTranslation.h"
+#include <vector>
+#include <map>
+#include <set>
+#ifdef EA_PLATFORM_WINDOWS
+#pragma warning(disable : 4201)
+#endif
+#include "Qt3DSDMXML.h"
+#include "Qt3DSTypes.h"
+#include "Qt3DSVector3.h"
+#include "Qt3DSMetadata.h"
+#include "Qt3DSDMWStrOps.h"
+#include "Qt3DSDMWStrOpsImpl.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSDMComposerTypeDefinitions.h"
+#include "EASTL/string.h"
+#include "foundation/StrConvertUTF.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "StringTools.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSRenderDynamicObjectSystemCommands.h"
+#include "EASTL/map.h"
+#include "Qt3DSRenderEffect.h"
+#include "Qt3DSDMMetaDataTypes.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderPlugin.h"
+#include "Qt3DSRenderPluginGraphObject.h"
+#include "Qt3DSRenderPluginPropertyValue.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderMaterialHelpers.h"
+#include "Qt3DSRenderPath.h"
+#include "Qt3DSRenderPathSubPath.h"
+#include "Qt3DSRenderPathManager.h"
+#include "q3dsvariantconfig_p.h"
+
+using qt3ds::foundation::Option;
+using qt3ds::foundation::Empty;
+using qt3ds::QT3DSF32;
+using qt3ds::QT3DSVec3;
+using qt3ds::foundation::nvvector;
+using qt3ds::QT3DSU32;
+using qt3ds::render::RenderLightTypes;
+using qt3ds::render::DefaultMaterialLighting;
+using qt3ds::render::ImageMappingModes;
+using qt3ds::render::DefaultMaterialBlendMode;
+using qt3ds::render::NVRenderTextureCoordOp;
+using qt3ds::foundation::IStringTable;
+using qt3ds::NVFoundationBase;
+using namespace qt3ds;
+using namespace qt3ds::foundation;
+using qt3ds::render::TIdObjectMap;
+using qt3ds::render::IBufferManager;
+using qt3ds::render::IEffectSystem;
+using qt3ds::render::SPresentation;
+using qt3ds::render::SScene;
+using qt3ds::render::SLayer;
+using qt3ds::render::SNode;
+using qt3ds::render::SLight;
+using qt3ds::render::SCamera;
+using qt3ds::render::SModel;
+using qt3ds::render::SText;
+using qt3ds::render::SDefaultMaterial;
+using qt3ds::render::SImage;
+using qt3ds::render::SGraphObject;
+using qt3ds::render::SDynamicObject;
+using qt3ds::render::SEffect;
+using qt3ds::render::SCustomMaterial;
+using qt3ds::render::GraphObjectTypes;
+using qt3ds::render::NodeFlags;
+using qt3ds::foundation::CRegisteredString;
+using qt3ds::foundation::Qt3DSString;
+using qt3ds::foundation::CFileTools;
+using qt3ds::render::SReferencedMaterial;
+using qt3ds::render::IUIPReferenceResolver;
+using qt3ds::render::SPath;
+using qt3ds::render::SPathSubPath;
+using qt3ds::render::SLightmaps;
+
+namespace qt3dsdm {
+template <>
+struct WStrOps<SFloat2>
+{
+ void StrTo(const char8_t *buffer, SFloat2 &item, nvvector<char8_t> &ioTempBuf)
+ {
+ QT3DSU32 len = (QT3DSU32)strlen(buffer);
+ ioTempBuf.resize(len + 1);
+ memCopy(ioTempBuf.data(), buffer, (len + 1) * sizeof(char8_t));
+ MemoryBuffer<RawAllocator> unused;
+ qt3dsdm::IStringTable *theTable(NULL);
+ WCharTReader reader(ioTempBuf.begin(), unused, *theTable);
+ reader.ReadRef(NVDataRef<QT3DSF32>(item.m_Floats, 2));
+ }
+};
+
+template <>
+struct WStrOps<SFloat3>
+{
+ void StrTo(const char8_t *buffer, SFloat3 &item, nvvector<char8_t> &ioTempBuf)
+ {
+ QT3DSU32 len = (QT3DSU32)strlen(buffer);
+ ioTempBuf.resize(len + 1);
+ memCopy(ioTempBuf.data(), buffer, (len + 1) * sizeof(char8_t));
+ MemoryBuffer<RawAllocator> unused;
+ qt3dsdm::IStringTable *theTable(NULL);
+ WCharTReader reader(ioTempBuf.begin(), unused, *theTable);
+ reader.ReadRef(NVDataRef<QT3DSF32>(item.m_Floats, 3));
+ }
+};
+
+template <>
+struct WStrOps<SFloat4>
+{
+ void StrTo(const char8_t *buffer, SFloat4 &item, nvvector<char8_t> &ioTempBuf)
+ {
+ QT3DSU32 len = (QT3DSU32)strlen(buffer);
+ ioTempBuf.resize(len + 1);
+ memCopy(ioTempBuf.data(), buffer, (len + 1) * sizeof(char8_t));
+ MemoryBuffer<RawAllocator> unused;
+ qt3dsdm::IStringTable *theTable(NULL);
+ WCharTReader reader(ioTempBuf.begin(), unused, *theTable);
+ reader.ReadRef(NVDataRef<QT3DSF32>(item.m_Floats, 4));
+ }
+};
+}
+
+namespace {
+
+typedef eastl::basic_string<char8_t> TStrType;
+struct IPropertyParser
+{
+ virtual ~IPropertyParser() {}
+ virtual Option<TStrType> ParseStr(const char8_t *inName) = 0;
+ virtual Option<QT3DSF32> ParseFloat(const char8_t *inName) = 0;
+ virtual Option<QT3DSVec2> ParseVec2(const char8_t *inName) = 0;
+ virtual Option<QT3DSVec3> ParseVec3(const char8_t *inName) = 0;
+ virtual Option<QT3DSVec4> ParseVec4(const char8_t *inName) = 0;
+ virtual Option<bool> ParseBool(const char8_t *inName) = 0;
+ virtual Option<QT3DSU32> ParseU32(const char8_t *inName) = 0;
+ virtual Option<QT3DSI32> ParseI32(const char8_t *inName) = 0;
+ virtual Option<SGraphObject *> ParseGraphObject(const char8_t *inName) = 0;
+ virtual Option<SNode *> ParseNode(const char8_t *inName) = 0;
+};
+struct SMetaPropertyParser : public IPropertyParser
+{
+ Q3DStudio::IRuntimeMetaData &m_MetaData;
+ TStrType m_TempStr;
+ qt3ds::foundation::CRegisteredString m_Type;
+ qt3ds::foundation::CRegisteredString m_ClassId;
+
+ SMetaPropertyParser(const char8_t *inType, const char8_t *inClass,
+ Q3DStudio::IRuntimeMetaData &inMeta)
+ : m_MetaData(inMeta)
+ , m_Type(inMeta.GetStringTable()->GetRenderStringTable().RegisterStr(inType))
+ , m_ClassId(inMeta.GetStringTable()->GetRenderStringTable().RegisterStr(inClass))
+ {
+ }
+
+ qt3ds::foundation::CRegisteredString Register(const char8_t *inName)
+ {
+ return m_MetaData.GetStringTable()->GetRenderStringTable().RegisterStr(inName);
+ }
+
+ Option<TStrType> ParseStr(const char8_t *inName) override
+ {
+ qt3ds::foundation::CRegisteredString theName(Register(inName));
+ Q3DStudio::ERuntimeDataModelDataType theType(
+ m_MetaData.GetPropertyType(m_Type, theName, m_ClassId));
+ if (theType != Q3DStudio::ERuntimeDataModelDataTypeObjectRef
+ && theType != Q3DStudio::ERuntimeDataModelDataTypeLong4) {
+ return m_MetaData.GetPropertyValueString(m_Type, theName, m_ClassId);
+ }
+ return Empty();
+ }
+ Option<QT3DSF32> ParseFloat(const char8_t *inName) override
+ {
+ return m_MetaData.GetPropertyValueFloat(m_Type, Register(inName), m_ClassId);
+ }
+ Option<QT3DSVec2> ParseVec2(const char8_t *inName) override
+ {
+ Option<qt3ds::QT3DSVec2> theProperty =
+ m_MetaData.GetPropertyValueVector2(m_Type, Register(inName), m_ClassId);
+ if (theProperty.hasValue())
+ return *theProperty;
+
+ return Empty();
+ }
+ Option<QT3DSVec3> ParseVec3(const char8_t *inName) override
+ {
+ Option<qt3ds::QT3DSVec3> theProperty =
+ m_MetaData.GetPropertyValueVector3(m_Type, Register(inName), m_ClassId);
+ if (theProperty.hasValue()) {
+ return *theProperty;
+ }
+ return Empty();
+ }
+ Option<QT3DSVec4> ParseVec4(const char8_t *inName) override
+ {
+ Option<qt3ds::QT3DSVec4> theProperty =
+ m_MetaData.GetPropertyValueVector4(m_Type, Register(inName), m_ClassId);
+ if (theProperty.hasValue()) {
+ return *theProperty;
+ }
+ return Empty();
+ }
+ Option<bool> ParseBool(const char8_t *inName) override
+ {
+ return m_MetaData.GetPropertyValueBool(m_Type, Register(inName), m_ClassId);
+ }
+
+ Option<QT3DSU32> ParseU32(const char8_t *inName) override
+ {
+ Option<QT3DSI32> retval = m_MetaData.GetPropertyValueLong(m_Type, Register(inName), m_ClassId);
+ if (retval.hasValue())
+ return (QT3DSU32)retval.getValue();
+ return Empty();
+ }
+
+ Option<QT3DSI32> ParseI32(const char8_t *inName) override
+ {
+ Option<QT3DSI32> retval = m_MetaData.GetPropertyValueLong(m_Type, Register(inName), m_ClassId);
+ if (retval.hasValue())
+ return (QT3DSI32)retval.getValue();
+ return Empty();
+ }
+
+ Option<SGraphObject *> ParseGraphObject(const char8_t *) override { return Empty(); }
+ Option<SNode *> ParseNode(const char8_t *) override { return Empty(); }
+};
+
+class IDOMReferenceResolver
+{
+protected:
+ virtual ~IDOMReferenceResolver() {}
+public:
+ virtual SGraphObject *ResolveReference(SGraphObject &inRootObject, const char *path) = 0;
+};
+
+struct SDomReaderPropertyParser : public IPropertyParser
+{
+ qt3dsdm::IDOMReader &m_Reader;
+ nvvector<char8_t> &m_TempBuf;
+ IDOMReferenceResolver &m_Resolver;
+ SGraphObject &m_Object;
+
+ SDomReaderPropertyParser(qt3dsdm::IDOMReader &reader, nvvector<char8_t> &inTempBuf,
+ IDOMReferenceResolver &inResolver, SGraphObject &inObject)
+ : m_Reader(reader)
+ , m_TempBuf(inTempBuf)
+ , m_Resolver(inResolver)
+ , m_Object(inObject)
+ {
+ }
+ Option<TStrType> ParseStr(const char8_t *inName) override
+ {
+ const char8_t *retval;
+ if (m_Reader.Att(inName, retval))
+ return TStrType(retval);
+ return Empty();
+ }
+ Option<QT3DSF32> ParseFloat(const char8_t *inName) override
+ {
+ QT3DSF32 retval;
+ if (m_Reader.Att(inName, retval))
+ return retval;
+ return Empty();
+ }
+ Option<QT3DSVec2> ParseVec2(const char8_t *inName) override
+ {
+ qt3dsdm::SFloat2 retval;
+ const char8_t *tempData;
+ if (m_Reader.UnregisteredAtt(inName, tempData)) {
+ qt3dsdm::WStrOps<qt3dsdm::SFloat2>().StrTo(tempData, retval, m_TempBuf);
+ return QT3DSVec2(retval.m_Floats[0], retval.m_Floats[1]);
+ }
+ return Empty();
+ }
+ Option<QT3DSVec3> ParseVec3(const char8_t *inName) override
+ {
+ qt3dsdm::SFloat3 retval;
+ const char8_t *tempData;
+ if (m_Reader.UnregisteredAtt(inName, tempData)) {
+ qt3dsdm::WStrOps<qt3dsdm::SFloat3>().StrTo(tempData, retval, m_TempBuf);
+ return QT3DSVec3(retval.m_Floats[0], retval.m_Floats[1], retval.m_Floats[2]);
+ }
+ return Empty();
+ }
+ Option<QT3DSVec4> ParseVec4(const char8_t *inName) override
+ {
+ qt3dsdm::SFloat4 retval;
+ const char8_t *tempData;
+ if (m_Reader.UnregisteredAtt(inName, tempData)) {
+ qt3dsdm::WStrOps<qt3dsdm::SFloat4>().StrTo(tempData, retval, m_TempBuf);
+ return QT3DSVec4(retval.m_Floats[0], retval.m_Floats[1], retval.m_Floats[2],
+ retval.m_Floats[3]);
+ }
+ return Empty();
+ }
+ Option<bool> ParseBool(const char8_t *inName) override
+ {
+ bool retval;
+ if (m_Reader.Att(inName, retval))
+ return retval;
+ return Empty();
+ }
+
+ Option<QT3DSU32> ParseU32(const char8_t *inName) override
+ {
+ QT3DSU32 retval;
+ if (m_Reader.Att(inName, retval))
+ return retval;
+ return Empty();
+ }
+
+ Option<QT3DSI32> ParseI32(const char8_t *inName) override
+ {
+ QT3DSI32 retval;
+ if (m_Reader.Att(inName, retval))
+ return retval;
+ return Empty();
+ }
+
+ Option<SGraphObject *> ParseGraphObject(const char8_t *inName) override
+ {
+ const char *temp;
+ if (m_Reader.UnregisteredAtt(inName, temp)) {
+ // Now we need to figure out if this is an element reference or if it is a relative path
+ // from the current element.
+ SGraphObject *retval = m_Resolver.ResolveReference(m_Object, temp);
+ if (retval)
+ return retval;
+ }
+ return Empty();
+ }
+
+ Option<SNode *> ParseNode(const char8_t *inName) override
+ {
+ Option<SGraphObject *> obj = ParseGraphObject(inName);
+ if (obj.hasValue()) {
+ if (GraphObjectTypes::IsNodeType((*obj)->m_Type))
+ return static_cast<SNode *>((*obj));
+ }
+ return Empty();
+ }
+};
+
+template <typename TDataType>
+struct SParserHelper
+{
+};
+template <>
+struct SParserHelper<TStrType>
+{
+ static Option<TStrType> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseStr(inName);
+ }
+};
+template <>
+struct SParserHelper<QT3DSF32>
+{
+ static Option<QT3DSF32> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseFloat(inName);
+ }
+};
+template <>
+struct SParserHelper<QT3DSVec2>
+{
+ static Option<QT3DSVec2> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseVec2(inName);
+ }
+};
+template <>
+struct SParserHelper<QT3DSVec3>
+{
+ static Option<QT3DSVec3> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseVec3(inName);
+ }
+};
+template <>
+struct SParserHelper<QT3DSVec4>
+{
+ static Option<QT3DSVec4> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseVec4(inName);
+ }
+};
+template <>
+struct SParserHelper<bool>
+{
+ static Option<bool> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseBool(inName);
+ }
+};
+template <>
+struct SParserHelper<QT3DSU32>
+{
+ static Option<QT3DSU32> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseU32(inName);
+ }
+};
+template <>
+struct SParserHelper<QT3DSI32>
+{
+ static Option<QT3DSI32> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseI32(inName);
+ }
+};
+template <>
+struct SParserHelper<SGraphObject *>
+{
+ static Option<SGraphObject *> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseGraphObject(inName);
+ }
+};
+template <>
+struct SParserHelper<SNode *>
+{
+ static Option<SNode *> Parse(const char8_t *inName, IPropertyParser &inParser)
+ {
+ return inParser.ParseNode(inName);
+ }
+};
+
+struct SPathAndAnchorIndex
+{
+ SPathSubPath *m_Segment;
+ QT3DSU32 m_AnchorIndex;
+ SPathAndAnchorIndex(SPathSubPath *inSegment, QT3DSU32 inAnchorIndex)
+ : m_Segment(inSegment)
+ , m_AnchorIndex(inAnchorIndex)
+ {
+ }
+ SPathAndAnchorIndex()
+ : m_Segment(NULL)
+ , m_AnchorIndex(0)
+ {
+ }
+};
+
+struct SRenderUIPLoader : public IDOMReferenceResolver
+{
+ typedef qt3dsdm::IDOMReader::Scope TScope;
+ typedef eastl::map<CRegisteredString, eastl::string> TIdStringMap;
+ typedef eastl::hash_map<CRegisteredString, SPathAndAnchorIndex> TIdPathAnchorIndexMap;
+ qt3dsdm::IDOMReader &m_Reader;
+ Q3DStudio::IRuntimeMetaData &m_MetaData;
+ IStringTable &m_StrTable;
+ NVFoundationBase &m_Foundation;
+ NVAllocatorCallback &m_PresentationAllocator;
+ qt3ds::render::TIdObjectMap &m_ObjectMap;
+ IBufferManager &m_BufferManager;
+ SPresentation *m_Presentation;
+ nvvector<char8_t> m_TempBuf;
+ TStrType m_TempParseString;
+ IEffectSystem &m_EffectSystem;
+ const char8_t *m_PresentationDir;
+ Qt3DSString m_PathString;
+ qt3ds::render::IRenderPluginManager &m_RenderPluginManager;
+ qt3ds::render::ICustomMaterialSystem &m_CustomMaterialSystem;
+ qt3ds::render::IDynamicObjectSystem &m_DynamicObjectSystem;
+ qt3ds::render::IPathManager &m_PathManager;
+ TIdStringMap m_RenderPluginSourcePaths;
+ IUIPReferenceResolver *m_ReferenceResolver;
+ MemoryBuffer<RawAllocator> m_TempBuffer;
+ MemoryBuffer<RawAllocator> m_ValueBuffer;
+ TIdPathAnchorIndexMap m_AnchorIdToPathAndAnchorIndexMap;
+ const Q3DSVariantConfig &m_variantConfig;
+
+ SRenderUIPLoader(qt3dsdm::IDOMReader &inReader, const char8_t *inFullPathToPresentationFile,
+ Q3DStudio::IRuntimeMetaData &inMetaData, IStringTable &inStrTable
+ // Allocator for datastructures we need to parse the file.
+ ,
+ NVFoundationBase &inFoundation
+ // Allocator used for the presentation objects themselves
+ ,
+ NVAllocatorCallback &inPresentationAllocator
+ // Map of string ids to objects
+ ,
+ TIdObjectMap &ioObjectMap, IBufferManager &inBufferManager,
+ IEffectSystem &inEffectSystem, const char8_t *inPresentationDir,
+ qt3ds::render::IRenderPluginManager &inRPM,
+ qt3ds::render::ICustomMaterialSystem &inCMS,
+ qt3ds::render::IDynamicObjectSystem &inDynamicSystem,
+ qt3ds::render::IPathManager &inPathManager, IUIPReferenceResolver *inResolver,
+ const Q3DSVariantConfig &variantConfig)
+ : m_Reader(inReader)
+ , m_MetaData(inMetaData)
+ , m_StrTable(inStrTable)
+ , m_Foundation(inFoundation)
+ , m_PresentationAllocator(inPresentationAllocator)
+ , m_ObjectMap(ioObjectMap)
+ , m_BufferManager(inBufferManager)
+ , m_Presentation(QT3DS_NEW(inPresentationAllocator, SPresentation)())
+ , m_TempBuf(inFoundation.getAllocator(), "SRenderUIPLoader::m_TempBuf")
+ , m_EffectSystem(inEffectSystem)
+ , m_PresentationDir(inPresentationDir)
+ , m_RenderPluginManager(inRPM)
+ , m_CustomMaterialSystem(inCMS)
+ , m_DynamicObjectSystem(inDynamicSystem)
+ , m_PathManager(inPathManager)
+ , m_ReferenceResolver(inResolver)
+ , m_variantConfig(variantConfig)
+ {
+ std::string presentationFile = inFullPathToPresentationFile;
+ std::string::size_type pos = presentationFile.find_last_of("\\/");
+ if (pos != std::string::npos) {
+ std::string path = presentationFile.substr(0, pos);
+ m_Presentation->m_PresentationDirectory = inStrTable.RegisterStr(path.c_str());
+ }
+ }
+
+ SGraphObject *ResolveReference(SGraphObject &inRoot, const char *path) override
+ {
+ if (m_ReferenceResolver) {
+ CRegisteredString resolvedReference =
+ m_ReferenceResolver->ResolveReference(inRoot.m_Id, path);
+ if (resolvedReference.IsValid()) {
+ qt3ds::render::TIdObjectMap::iterator iter = m_ObjectMap.find(resolvedReference);
+ if (iter != m_ObjectMap.end())
+ return iter->second;
+ }
+ }
+ return NULL;
+ }
+
+ static bool IsNode(GraphObjectTypes::Enum inType)
+ {
+ return GraphObjectTypes::IsNodeType(inType);
+ }
+ template <typename TDataType>
+ bool ParseProperty(IPropertyParser &inParser, const char8_t *inName, TDataType &outData)
+ {
+ Option<TDataType> theValue(SParserHelper<TDataType>::Parse(inName, inParser));
+ if (theValue.hasValue()) {
+ outData = theValue;
+ return true;
+ }
+ return false;
+ }
+ bool ParseOpacityProperty(IPropertyParser &inParser, const char8_t *inName, QT3DSF32 &outOpacity)
+ {
+ if (ParseProperty(inParser, inName, outOpacity)) {
+ outOpacity /= 100.0f;
+ return true;
+ }
+ return false;
+ }
+
+ bool ParseRadianProperty(IPropertyParser &inParser, const char8_t *inName, QT3DSVec3 &ioRotation)
+ {
+ if (ParseProperty(inParser, inName, ioRotation)) {
+ TORAD(ioRotation.x);
+ TORAD(ioRotation.y);
+ TORAD(ioRotation.z);
+ return true;
+ }
+ return false;
+ }
+ bool ParseRadianProperty(IPropertyParser &inParser, const char8_t *inName, QT3DSF32 &ioRotation)
+ {
+ if (ParseProperty(inParser, inName, ioRotation)) {
+ TORAD(ioRotation);
+ return true;
+ }
+ return false;
+ }
+
+ void ParseRotationOrder(IPropertyParser &inParser, const char8_t *inName,
+ QT3DSU32 &ioRotationOrder)
+ {
+ if (ParseProperty(inParser, inName, m_TempParseString))
+ ioRotationOrder = qt3ds::render::MapRotationOrder(m_TempParseString.c_str());
+ }
+ void ParseOrientation(IPropertyParser &inParser, const char8_t *inName, NodeFlags &ioFlags)
+ {
+ if (ParseProperty(inParser, inName, m_TempParseString)) {
+ if (m_TempParseString == "Left Handed")
+ ioFlags.SetLeftHanded(true);
+ else
+ ioFlags.SetLeftHanded(false);
+ }
+ }
+ void ParseOrthographicProperty(IPropertyParser &inParser, const char8_t *inName,
+ NodeFlags &ioFlags)
+ {
+ bool isOrthographic;
+ if (ParseProperty(inParser, inName, isOrthographic))
+ ioFlags.SetOrthographic(isOrthographic);
+ }
+ template <typename TEnumType>
+ static bool ConvertEnumFromStr(const char8_t *inStr, TEnumType &ioEnum)
+ {
+ qt3ds::render::SEnumNameMap *theMap = qt3ds::render::SEnumParseMap<TEnumType>::GetMap();
+ for (qt3ds::render::SEnumNameMap *item = theMap; item->m_Name; ++item) {
+ // hack to match advanced overlay types, whose name start with a '*'
+ const char8_t *p = inStr;
+ if (*p == '*')
+ ++p;
+ if (qt3dsdm::AreEqual(p, item->m_Name)) {
+ ioEnum = static_cast<TEnumType>(item->m_Enum);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ template <typename TEnumType>
+ void ParseEnumProperty(IPropertyParser &inParser, const char8_t *inName, TEnumType &ioEnum)
+ {
+ if (ParseProperty(inParser, inName, m_TempParseString)) {
+ ConvertEnumFromStr(m_TempParseString.c_str(), ioEnum);
+ }
+ }
+ void ParseAndResolveSourcePath(IPropertyParser &inParser, const char8_t *inName,
+ CRegisteredString &ioString)
+ {
+ if (ParseProperty(inParser, inName, m_TempParseString))
+ ioString = m_StrTable.RegisterStr(m_TempParseString.c_str());
+ }
+ void ParseProperty(IPropertyParser &inParser, const char8_t *inName, SImage *&ioImage)
+ {
+ if (ParseProperty(inParser, inName, m_TempParseString)) {
+ TIdObjectMap::iterator theIter =
+ m_ObjectMap.find(m_StrTable.RegisterStr(m_TempParseString.c_str() + 1));
+ if (theIter != m_ObjectMap.end()
+ && theIter->second->m_Type == GraphObjectTypes::Image) {
+ ioImage = static_cast<SImage *>(theIter->second);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ void ParseProperty(IPropertyParser &inParser, const char8_t *inName, CRegisteredString &ioStr)
+ {
+ if (ParseProperty(inParser, inName, m_TempParseString))
+ ioStr = m_StrTable.RegisterStr(m_TempParseString.c_str());
+ }
+
+ void ParseNodeFlagsProperty(IPropertyParser &inParser, const char8_t *inName,
+ qt3ds::render::NodeFlags &ioFlags,
+ qt3ds::render::NodeFlagValues::Enum prop)
+ {
+ bool temp;
+ if (ParseProperty(inParser, inName, temp))
+ ioFlags.ClearOrSet(temp, prop);
+ }
+
+ void ParseNodeFlagsInverseProperty(IPropertyParser &inParser, const char8_t *inName,
+ qt3ds::render::NodeFlags &ioFlags,
+ qt3ds::render::NodeFlagValues::Enum prop)
+ {
+ bool temp;
+ if (ParseProperty(inParser, inName, temp))
+ ioFlags.ClearOrSet(!temp, prop);
+ }
+
+// Create a mapping from UICRenderPropertyNames to the string in the UIP file.
+#define Scene_ClearColor "backgroundcolor"
+#define Scene_UseClearColor "bgcolorenable"
+#define Node_Rotation "rotation"
+#define Node_Position "position"
+#define Node_Scale "scale"
+#define Node_Pivot "pivot"
+#define Node_LocalOpacity "opacity"
+#define Node_RotationOrder "rotationorder"
+#define Node_LeftHanded "orientation"
+#define Layer_Variants "variants"
+#define Layer_TemporalAAEnabled "temporalaa"
+#define Layer_LayerEnableDepthTest "disabledepthtest"
+#define Layer_LayerEnableDepthPrePass "disabledepthprepass"
+#define Layer_ClearColor "backgroundcolor"
+#define Layer_Background "background"
+#define Layer_BlendType "blendtype"
+#define Layer_Size "size"
+#define Layer_Location "location"
+#define Layer_TexturePath "sourcepath"
+#define Layer_HorizontalFieldValues "horzfields"
+#define Layer_Left "left"
+#define Layer_LeftUnits "leftunits"
+#define Layer_Width "width"
+#define Layer_WidthUnits "widthunits"
+#define Layer_Right "right"
+#define Layer_RightUnits "rightunits"
+#define Layer_VerticalFieldValues "vertfields"
+#define Layer_Top "top"
+#define Layer_TopUnits "topunits"
+#define Layer_Height "height"
+#define Layer_HeightUnits "heightunits"
+#define Layer_Bottom "bottom"
+#define Layer_BottomUnits "bottomunits"
+#define Layer_AoStrength "aostrength"
+#define Layer_AoDistance "aodistance"
+#define Layer_AoSoftness "aosoftness"
+#define Layer_AoBias "aobias"
+#define Layer_AoSamplerate "aosamplerate"
+#define Layer_AoDither "aodither"
+#define Layer_ShadowStrength "shadowstrength"
+#define Layer_ShadowDist "shadowdist"
+#define Layer_ShadowSoftness "shadowsoftness"
+#define Layer_ShadowBias "shadowbias"
+#define Layer_LightProbe "lightprobe"
+#define Layer_ProbeBright "probebright"
+#define Layer_FastIbl "fastibl"
+#define Layer_ProbeHorizon "probehorizon"
+#define Layer_ProbeFov "probefov"
+#define Layer_LightProbe2 "lightprobe2"
+#define Layer_Probe2Fade "probe2fade"
+#define Layer_Probe2Window "probe2window"
+#define Layer_Probe2Pos "probe2pos"
+#define Camera_ClipNear "clipnear"
+#define Camera_ClipFar "clipfar"
+#define Camera_FOV "fov"
+#define Camera_FOVHorizontal "fovhorizontal"
+#define Camera_Orthographic "orthographic"
+#define Camera_ScaleMode "scalemode"
+#define Camera_ScaleAnchor "scaleanchor"
+#define Light_LightType "lighttype"
+#define Light_DiffuseColor "lightdiffuse"
+#define Light_SpecularColor "lightspecular"
+#define Light_AmbientColor "lightambient"
+#define Light_Brightness "brightness"
+#define Light_LinearFade "linearfade"
+#define Light_ExponentialFade "expfade"
+#define Light_AreaWidth "areawidth"
+#define Light_AreaHeight "areaheight"
+#define Light_CastShadow "castshadow"
+#define Light_ShadowBias "shdwbias"
+#define Light_ShadowFactor "shdwfactor"
+#define Light_ShadowMapRes "shdwmapres"
+#define Light_ShadowMapFar "shdwmapfar"
+#define Light_ShadowMapFov "shdwmapfov"
+#define Light_ShadowFilter "shdwfilter"
+#define Model_MeshPath "sourcepath"
+#define Model_ShadowCaster "shadowcaster"
+#define Model_TessellationMode "tessellation"
+#define Model_EdgeTess "edgetess"
+#define Model_InnerTess "innertess"
+#define Lightmaps_LightmapIndirect "lightmapindirect"
+#define Lightmaps_LightmapRadiosity "lightmapradiosity"
+#define Lightmaps_LightmapShadow "lightmapshadow"
+#define Material_Lighting "shaderlighting"
+#define Material_BlendMode "blendmode"
+#define MaterialBase_IblProbe "iblprobe"
+#define Material_DiffuseColor "diffuse"
+#define Material_DiffuseMaps_0 "diffusemap"
+#define Material_DiffuseMaps_1 "diffusemap2"
+#define Material_DiffuseMaps_2 "diffusemap3"
+#define Material_EmissivePower "emissivepower"
+#define Material_EmissiveColor "emissivecolor"
+#define Material_EmissiveMap "emissivemap"
+#define Material_EmissiveMap2 "emissivemap2"
+#define Material_SpecularReflection "specularreflection"
+#define Material_SpecularMap "specularmap"
+#define Material_SpecularModel "specularmodel"
+#define Material_SpecularTint "speculartint"
+#define Material_IOR "ior"
+#define Material_FresnelPower "fresnelPower"
+#define Material_SpecularAmount "specularamount"
+#define Material_SpecularRoughness "specularroughness"
+#define Material_RoughnessMap "roughnessmap"
+#define Material_Opacity "opacity"
+#define Material_OpacityMap "opacitymap"
+#define Material_BumpMap "bumpmap"
+#define Material_BumpAmount "bumpamount"
+#define Material_NormalMap "normalmap"
+#define Material_DisplacementMap "displacementmap"
+#define Material_DisplaceAmount "displaceamount"
+#define Material_TranslucencyMap "translucencymap"
+#define Material_TranslucentFalloff "translucentfalloff"
+#define Material_DiffuseLightWrap "diffuselightwrap"
+#define Material_ReferencedMaterial "referencedmaterial"
+#define Material_VertexColors "vertexcolors"
+#define Image_ImagePath "sourcepath"
+#define Image_OffscreenRendererId "subpresentation"
+#define Image_Scale_X "scaleu"
+#define Image_Scale_Y "scalev"
+#define Image_Pivot_X "pivotu"
+#define Image_Pivot_Y "pivotv"
+#define Image_Rotation "rotationuv"
+#define Image_Position_X "positionu"
+#define Image_Position_Y "positionv"
+#define Image_MappingMode "mappingmode"
+#define Image_HorizontalTilingMode "tilingmodehorz"
+#define Image_VerticalTilingMode "tilingmodevert"
+#define Text_Text "textstring"
+#define Text_Font "font"
+#define Text_FontSize "size"
+#define Text_HorizontalAlignment "horzalign"
+#define Text_VerticalAlignment "vertalign"
+#define Text_Leading "leading"
+#define Text_Tracking "tracking"
+#define Text_DropShadow "dropshadow"
+#define Text_DropShadowStrength "dropshadowstrength"
+#define Text_DropShadowOffsetX "dropshadowoffsetx"
+#define Text_DropShadowOffsetY "dropshadowoffsety"
+#define Text_WordWrap "wordwrap"
+#define Text_BoundingBox "boundingbox"
+#define Text_Elide "elide"
+#define Text_TextColor "textcolor"
+#define Text_BackColor "backcolor"
+#define Text_EnableAcceleratedFont "enableacceleratedfont"
+#define Layer_ProgressiveAAMode "progressiveaa"
+#define Layer_MultisampleAAMode "multisampleaa"
+#define Light_Scope "scope"
+#define Path_PathType "pathtype"
+#define Path_PaintStyle "paintstyle"
+#define Path_Width "width"
+#define Path_Opacity "opacity"
+#define Path_LinearError "linearerror"
+#define Path_EdgeTessAmount "edgetessamount"
+#define Path_InnerTessAmount "innertessamount"
+#define Path_BeginCapping "begincap"
+#define Path_BeginCapOffset "begincapoffset"
+#define Path_BeginCapOpacity "begincapopacity"
+#define Path_BeginCapWidth "begincapwidth"
+#define Path_EndCapping "endcap"
+#define Path_EndCapOffset "endcapoffset"
+#define Path_EndCapOpacity "endcapopacity"
+#define Path_EndCapWidth "endcapwidth"
+#define Path_PathBuffer "sourcepath"
+#define SubPath_Closed "closed"
+
+// Fill in implementations for the actual parse tables.
+#define HANDLE_QT3DS_RENDER_PROPERTY(type, name, dirty) \
+ ParseProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_REAL_VEC2_PROPERTY(type, name, dirty) \
+ ParseProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_VEC3_PROPERTY(type, name, dirty) \
+ ParseProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_COLOR_PROPERTY(type, name, dirty) \
+ ParseProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_RADIAN_PROPERTY(type, name, dirty) \
+ ParseRadianProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_VEC3_RADIAN_PROPERTY(type, name, dirty) \
+ ParseRadianProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_OPACITY_PROPERTY(type, name, dirty) \
+ ParseOpacityProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_ROTATION_ORDER_PROPERTY(type, name, dirty) \
+ ParseRotationOrder(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_NODE_ORIENTATION_PROPERTY(type, name, dirty) \
+ ParseOrientation(inParser, type##_##name, inItem.m_Flags);
+#define HANDLE_QT3DS_RENDER_DEPTH_TEST_PROPERTY(type, name, dirty) \
+ if (ParseProperty(inParser, type##_##name, inItem.m_##name)) \
+ inItem.m_##name = !inItem.m_##name;
+#define HANDLE_QT3DS_NODE_FLAGS_PROPERTY(type, name, dirty) \
+ ParseNodeFlagsProperty(inParser, type##_##name, inItem.m_Flags, \
+ qt3ds::render::NodeFlagValues::name);
+#define HANDLE_QT3DS_NODE_FLAGS_INVERSE_PROPERTY(type, name, dirty) \
+ ParseNodeFlagsInverseProperty(inParser, type##_##name, inItem.m_Flags, \
+ qt3ds::render::NodeFlagValues::name);
+#define HANDLE_QT3DS_RENDER_ENUM_PROPERTY(type, name, dirty) \
+ ParseEnumProperty(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_SOURCEPATH_PROPERTY(type, name, dirty) \
+ ParseAndResolveSourcePath(inParser, type##_##name, inItem.m_##name);
+#define HANDLE_QT3DS_RENDER_ARRAY_PROPERTY(type, name, index, dirty) \
+ ParseProperty(inParser, type##_##name##_##index, inItem.m_##name[index]);
+#define HANDLE_QT3DS_RENDER_VEC2_PROPERTY(type, name, dirty) \
+ ParseProperty(inParser, type##_##name##_##X, inItem.m_##name.x); \
+ ParseProperty(inParser, type##_##name##_##Y, inItem.m_##name.y);
+#define HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY( \
+ type, name, dirty) // noop by intention already handled by HANDLE_QT3DS_RENDER_COLOR_PROPERTY
+#define HANDLE_QT3DS_RENDER_TRANSFORM_VEC3_PROPERTY( \
+ type, name, dirty) // noop by intention already handled by HANDLE_QT3DS_RENDER_VEC3_PROPERTY
+
+ // Call the correct parser functions.
+ void ParseProperties(SScene &inItem, IPropertyParser &inParser)
+ {
+ ITERATE_QT3DS_RENDER_SCENE_PROPERTIES
+ }
+ void ParseProperties(SNode &inItem, IPropertyParser &inParser)
+ {
+ bool eyeball;
+ if (ParseProperty(inParser, "eyeball", eyeball))
+ inItem.m_Flags.SetActive(eyeball);
+ ITERATE_QT3DS_RENDER_NODE_PROPERTIES
+ ParseProperty(inParser, "boneid", inItem.m_SkeletonId);
+ bool ignoreParent = false;
+ if (ParseProperty(inParser, "ignoresparent", ignoreParent))
+ inItem.m_Flags.SetIgnoreParentTransform(ignoreParent);
+ }
+ void ParseProperties(SLayer &inItem, IPropertyParser &inParser)
+ {
+ ParseProperties(static_cast<SNode &>(inItem), inParser);
+ ITERATE_QT3DS_RENDER_LAYER_PROPERTIES
+ ParseProperty(inParser, "aosamplerate", inItem.m_AoSamplerate);
+ }
+ void ParseProperties(SCamera &inItem, IPropertyParser &inParser)
+ {
+ ParseProperties(static_cast<SNode &>(inItem), inParser);
+ ITERATE_QT3DS_RENDER_CAMERA_PROPERTIES
+ }
+ void ParseProperties(SLight &inItem, IPropertyParser &inParser)
+ {
+ ParseProperties(static_cast<SNode &>(inItem), inParser);
+ ITERATE_QT3DS_RENDER_LIGHT_PROPERTIES
+ ParseProperty(inParser, "shdwmapres", inItem.m_ShadowMapRes);
+ }
+ void ParseProperties(SModel &inItem, IPropertyParser &inParser)
+ {
+ ParseProperties(static_cast<SNode &>(inItem), inParser);
+ ITERATE_QT3DS_RENDER_MODEL_PROPERTIES
+ ParseProperty(inParser, "poseroot", inItem.m_SkeletonRoot);
+ }
+
+ void ParseProperties(SText &inItem, IPropertyParser &inParser)
+ {
+ ParseProperties(static_cast<SNode &>(inItem), inParser);
+ ITERATE_QT3DS_RENDER_TEXT_PROPERTIES
+ }
+ void ParseProperties(SLightmaps &inItem, IPropertyParser &inParser)
+ {
+ ITERATE_QT3DS_RENDER_LIGHTMAP_PROPERTIES
+ }
+ void ParseProperties(SDefaultMaterial &inItem, IPropertyParser &inParser)
+ {
+ ITERATE_QT3DS_RENDER_MATERIAL_PROPERTIES
+ ParseProperties(inItem.m_Lightmaps, inParser);
+ }
+ void ParseProperties(SReferencedMaterial &inItem, IPropertyParser &inParser)
+ {
+ ITERATE_QT3DS_RENDER_REFERENCED_MATERIAL_PROPERTIES
+ // Propagate lightmaps
+ if (inItem.m_ReferencedMaterial
+ && inItem.m_ReferencedMaterial->m_Type == GraphObjectTypes::DefaultMaterial)
+ ParseProperties(
+ static_cast<SDefaultMaterial *>(inItem.m_ReferencedMaterial)->m_Lightmaps,
+ inParser);
+ else if (inItem.m_ReferencedMaterial
+ && inItem.m_ReferencedMaterial->m_Type == GraphObjectTypes::CustomMaterial)
+ ParseProperties(
+ static_cast<SCustomMaterial *>(inItem.m_ReferencedMaterial)->m_Lightmaps, inParser);
+ }
+ void ParseProperties(SImage &inItem, IPropertyParser &inParser)
+ {
+ ITERATE_QT3DS_RENDER_IMAGE_PROPERTIES
+ }
+ template <typename TDataType>
+ void SetDynamicObjectProperty(SDynamicObject &inEffect,
+ const qt3ds::render::dynamic::SPropertyDefinition &inPropDesc,
+ const TDataType &inProp)
+ {
+ memCopy(inEffect.GetDataSectionBegin() + inPropDesc.m_Offset, &inProp, sizeof(TDataType));
+ }
+ template <typename TDataType>
+ void SetDynamicObjectProperty(SDynamicObject &inEffect,
+ const qt3ds::render::dynamic::SPropertyDefinition &inPropDesc,
+ Option<TDataType> inProp)
+ {
+ if (inProp.hasValue()) {
+ SetDynamicObjectProperty(inEffect, inPropDesc, *inProp);
+ }
+ }
+ void ParseProperties(SCustomMaterial &inItem, IPropertyParser &inParser)
+ {
+ ParseProperties(static_cast<SDynamicObject &>(inItem), inParser);
+ ParseProperties(inItem.m_Lightmaps, inParser);
+ ITERATE_QT3DS_RENDER_CUSTOM_MATERIAL_PROPERTIES
+ }
+ void ParseProperties(SDynamicObject &inDynamicObject, IPropertyParser &inParser)
+ {
+ NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> theProperties =
+ m_DynamicObjectSystem.GetProperties(inDynamicObject.m_ClassName);
+
+ for (QT3DSU32 idx = 0, end = theProperties.size(); idx < end; ++idx) {
+ const qt3ds::render::dynamic::SPropertyDefinition &theDefinition(theProperties[idx]);
+ switch (theDefinition.m_DataType) {
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool:
+ SetDynamicObjectProperty(inDynamicObject, theDefinition,
+ inParser.ParseBool(theDefinition.m_Name));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSF32:
+ SetDynamicObjectProperty(inDynamicObject, theDefinition,
+ inParser.ParseFloat(theDefinition.m_Name));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSI32:
+ if (theDefinition.m_IsEnumProperty == false)
+ SetDynamicObjectProperty(inDynamicObject, theDefinition,
+ inParser.ParseU32(theDefinition.m_Name));
+ else {
+ Option<eastl::string> theEnum = inParser.ParseStr(theDefinition.m_Name);
+ if (theEnum.hasValue()) {
+ NVConstDataRef<CRegisteredString> theEnumNames =
+ theDefinition.m_EnumValueNames;
+ for (QT3DSU32 idx = 0, end = theEnumNames.size(); idx < end; ++idx) {
+ if (theEnum->compare(theEnumNames[idx].c_str()) == 0) {
+ SetDynamicObjectProperty(inDynamicObject, theDefinition, idx);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4:
+ SetDynamicObjectProperty(inDynamicObject, theDefinition,
+ inParser.ParseVec4(theDefinition.m_Name));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec3:
+ SetDynamicObjectProperty(inDynamicObject, theDefinition,
+ inParser.ParseVec3(theDefinition.m_Name));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::QT3DSVec2:
+ SetDynamicObjectProperty(inDynamicObject, theDefinition,
+ inParser.ParseVec2(theDefinition.m_Name));
+ break;
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr:
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderImage2DPtr: {
+ Option<eastl::string> theTexture = inParser.ParseStr(theDefinition.m_Name);
+ if (theTexture.hasValue()) {
+ CRegisteredString theStr;
+ if (theTexture->size())
+ theStr = m_StrTable.RegisterStr(theTexture->c_str());
+
+ SetDynamicObjectProperty(inDynamicObject, theDefinition, theStr);
+ }
+ } break;
+ case qt3ds::render::NVRenderShaderDataTypes::NVRenderDataBufferPtr:
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ }
+ void ParseProperties(SPath &inItem, IPropertyParser &inParser)
+ {
+ ParseProperties(static_cast<SNode &>(inItem), inParser);
+ ITERATE_QT3DS_RENDER_PATH_PROPERTIES
+ }
+ void ParseProperties(SPathSubPath &inItem, IPropertyParser &inParser)
+ {
+ ITERATE_QT3DS_RENDER_PATH_SUBPATH_PROPERTIES
+ }
+
+ void AddPluginPropertyUpdate(eastl::vector<qt3ds::render::SRenderPropertyValueUpdate> &ioUpdates,
+ qt3ds::render::IRenderPluginClass &,
+ const qt3ds::render::SRenderPluginPropertyDeclaration &inDeclaration,
+ Option<float> data)
+ {
+ if (data.hasValue()) {
+ ioUpdates.push_back(
+ qt3ds::render::SRenderPropertyValueUpdate(inDeclaration.m_Name, *data));
+ }
+ }
+ void AddPluginPropertyUpdate(eastl::vector<qt3ds::render::SRenderPropertyValueUpdate> &ioUpdates,
+ qt3ds::render::IRenderPluginClass &inClass,
+ const qt3ds::render::SRenderPluginPropertyDeclaration &inDeclaration,
+ Option<QT3DSVec2> data)
+ {
+ if (data.hasValue()) {
+ ioUpdates.push_back(qt3ds::render::SRenderPropertyValueUpdate(
+ inClass.GetPropertyValueInfo(inDeclaration.m_StartOffset).first, data->x));
+ ioUpdates.push_back(qt3ds::render::SRenderPropertyValueUpdate(
+ inClass.GetPropertyValueInfo(inDeclaration.m_StartOffset + 1).first, data->y));
+ }
+ }
+ void AddPluginPropertyUpdate(eastl::vector<qt3ds::render::SRenderPropertyValueUpdate> &ioUpdates,
+ qt3ds::render::IRenderPluginClass &inClass,
+ const qt3ds::render::SRenderPluginPropertyDeclaration &inDeclaration,
+ Option<QT3DSVec3> data)
+ {
+ if (data.hasValue()) {
+ ioUpdates.push_back(qt3ds::render::SRenderPropertyValueUpdate(
+ inClass.GetPropertyValueInfo(inDeclaration.m_StartOffset).first, data->x));
+ ioUpdates.push_back(qt3ds::render::SRenderPropertyValueUpdate(
+ inClass.GetPropertyValueInfo(inDeclaration.m_StartOffset + 1).first, data->y));
+ ioUpdates.push_back(qt3ds::render::SRenderPropertyValueUpdate(
+ inClass.GetPropertyValueInfo(inDeclaration.m_StartOffset + 2).first, data->z));
+ }
+ }
+ void AddPluginPropertyUpdate(eastl::vector<qt3ds::render::SRenderPropertyValueUpdate> &ioUpdates,
+ qt3ds::render::IRenderPluginClass &,
+ const qt3ds::render::SRenderPluginPropertyDeclaration &inDeclaration,
+ Option<qt3ds::QT3DSI32> dataOpt)
+ {
+ if (dataOpt.hasValue()) {
+ long data = static_cast<long>(*dataOpt);
+ ioUpdates.push_back(
+ qt3ds::render::SRenderPropertyValueUpdate(inDeclaration.m_Name, (QT3DSI32)data));
+ }
+ }
+ void AddPluginPropertyUpdate(eastl::vector<qt3ds::render::SRenderPropertyValueUpdate> &ioUpdates,
+ qt3ds::render::IRenderPluginClass &,
+ const qt3ds::render::SRenderPluginPropertyDeclaration &inDeclaration,
+ Option<eastl::string> dataOpt)
+ {
+ if (dataOpt.hasValue()) {
+ eastl::string &data = dataOpt.getValue();
+ ioUpdates.push_back(qt3ds::render::SRenderPropertyValueUpdate(
+ inDeclaration.m_Name, m_StrTable.RegisterStr(data.c_str())));
+ }
+ }
+ void AddPluginPropertyUpdate(eastl::vector<qt3ds::render::SRenderPropertyValueUpdate> &ioUpdates,
+ qt3ds::render::IRenderPluginClass &,
+ const qt3ds::render::SRenderPluginPropertyDeclaration &inDeclaration,
+ Option<bool> dataOpt)
+ {
+ if (dataOpt.hasValue()) {
+ bool &data = dataOpt.getValue();
+ ioUpdates.push_back(
+ qt3ds::render::SRenderPropertyValueUpdate(inDeclaration.m_Name, data));
+ }
+ }
+ void ParseProperties(qt3ds::render::SRenderPlugin &inRenderPlugin, IPropertyParser &inParser)
+ {
+ qt3ds::render::IRenderPluginClass *theClass =
+ m_RenderPluginManager.GetRenderPlugin(inRenderPlugin.m_PluginPath);
+ if (theClass) {
+ qt3ds::foundation::NVConstDataRef<qt3ds::render::SRenderPluginPropertyDeclaration>
+ theClassProps = theClass->GetRegisteredProperties();
+ if (theClassProps.size()) {
+ qt3ds::render::IRenderPluginInstance *theInstance =
+ m_RenderPluginManager.GetOrCreateRenderPluginInstance(
+ inRenderPlugin.m_PluginPath, &inRenderPlugin);
+ if (theInstance) {
+ eastl::vector<qt3ds::render::SRenderPropertyValueUpdate> theUpdates;
+ for (QT3DSU32 idx = 0, end = theClassProps.size(); idx < end; ++idx) {
+ const qt3ds::render::SRenderPluginPropertyDeclaration &theDec(
+ theClassProps[idx]);
+ eastl::string tempStr;
+ switch (theDec.m_Type) {
+ case qt3ds::render::SRenderPluginPropertyTypes::Float:
+ AddPluginPropertyUpdate(theUpdates, *theClass, theDec,
+ inParser.ParseFloat(theDec.m_Name.c_str()));
+ break;
+ case qt3ds::render::SRenderPluginPropertyTypes::Vector2:
+ AddPluginPropertyUpdate(theUpdates, *theClass, theDec,
+ inParser.ParseVec2(theDec.m_Name.c_str()));
+ break;
+ case qt3ds::render::SRenderPluginPropertyTypes::Color:
+ case qt3ds::render::SRenderPluginPropertyTypes::Vector3:
+ AddPluginPropertyUpdate(theUpdates, *theClass, theDec,
+ inParser.ParseVec3(theDec.m_Name.c_str()));
+ break;
+ case qt3ds::render::SRenderPluginPropertyTypes::Long:
+ AddPluginPropertyUpdate(theUpdates, *theClass, theDec,
+ inParser.ParseI32(theDec.m_Name.c_str()));
+ break;
+ case qt3ds::render::SRenderPluginPropertyTypes::String:
+ AddPluginPropertyUpdate(theUpdates, *theClass, theDec,
+ inParser.ParseStr(theDec.m_Name.c_str()));
+ break;
+ case qt3ds::render::SRenderPluginPropertyTypes::Boolean:
+ AddPluginPropertyUpdate(theUpdates, *theClass, theDec,
+ inParser.ParseBool(theDec.m_Name.c_str()));
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ }
+ }
+ theInstance->Update(
+ qt3ds::foundation::toConstDataRef(theUpdates.data(), theUpdates.size()));
+ }
+ }
+ }
+ }
+
+#undef HANDLE_QT3DS_RENDER_PROPERTY
+#undef HANDLE_QT3DS_RENDER_ENUM_PROPERTY
+#undef HANDLE_QT3DS_RENDER_RADIAN_PROPERTY
+#undef HANDLE_QT3DS_RENDER_SOURCEPATH_PROPERTY
+#undef HANDLE_QT3DS_RENDER_ARRAY_PROPERTY
+#undef HANDLE_QT3DS_NODE_FLAGS_PROPERTY
+#undef HANDLE_QT3DS_ROTATION_ORDER_PROPERTY
+#undef HANDLE_QT3DS_RENDER_OPACITY_PROPERTY
+#undef HANDLE_QT3DS_NODE_ORIENTATION_PROPERTY
+#undef HANDLE_QT3DS_RENDER_DEPTH_TEST_PROPERTY
+#undef HANDLE_QT3DS_RENDER_VEC2_PROPERTY
+
+ void ParseGraphPass1(SGraphObject *inParent)
+ {
+ TScope __elemScope(m_Reader);
+ qt3dsdm::ComposerObjectTypes::Enum theObjType =
+ qt3dsdm::ComposerObjectTypes::Convert(m_Reader.GetElementName());
+ SGraphObject *theNewObject(NULL);
+ const char8_t *theId;
+ const char8_t *theVariants;
+ m_Reader.Att("id", theId);
+ m_Reader.Att("variants", theVariants);
+
+ QString theString(theVariants);
+ QStringRef theStringRef(&theString);
+ bool isPartOfConfig = m_variantConfig.isPartOfConfig(theStringRef);
+ if (isPartOfConfig) {
+ switch (theObjType) {
+ case qt3dsdm::ComposerObjectTypes::Scene: {
+ SScene *theScene = QT3DS_NEW(m_PresentationAllocator, SScene)();
+ theNewObject = theScene;
+ m_Presentation->m_Scene = theScene;
+ theScene->m_Presentation = m_Presentation;
+ } break;
+ case qt3dsdm::ComposerObjectTypes::Layer:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SLayer)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Group:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SNode)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Component:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SNode)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Camera:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SCamera)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Light:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SLight)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Model:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SModel)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Material:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SDefaultMaterial)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::ReferencedMaterial:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SReferencedMaterial)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Image:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SImage)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Text:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SText)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::Path:
+ theNewObject = QT3DS_NEW(m_PresentationAllocator, SPath)();
+ break;
+ case qt3dsdm::ComposerObjectTypes::SubPath: {
+ SPathSubPath *thePath = QT3DS_NEW(m_PresentationAllocator, SPathSubPath)();
+ theNewObject = thePath;
+ QT3DSU32 anchorCount = 0;
+ TScope _childScope(m_Reader);
+ for (bool success = m_Reader.MoveToFirstChild("PathAnchorPoint"); success;
+ success = m_Reader.MoveToNextSibling("PathAnchorPoint")) {
+ const char8_t *theId;
+ m_Reader.Att("id", theId);
+ CRegisteredString theIdStr = m_StrTable.RegisterStr(theId);
+ m_AnchorIdToPathAndAnchorIndexMap.insert(
+ eastl::make_pair(theIdStr, SPathAndAnchorIndex(thePath, anchorCount)));
+ ++anchorCount;
+ }
+ m_PathManager.ResizePathSubPathBuffer(*thePath, anchorCount);
+ } break;
+ case qt3dsdm::ComposerObjectTypes::Effect: {
+ const char8_t *effectClassId;
+ m_Reader.Att("class", effectClassId);
+ CRegisteredString theStr = m_StrTable.RegisterStr(effectClassId + 1);
+ if (m_EffectSystem.IsEffectRegistered(theStr))
+ theNewObject = m_EffectSystem.CreateEffectInstance(theStr, m_PresentationAllocator);
+ } break;
+ case qt3dsdm::ComposerObjectTypes::RenderPlugin: {
+ const char8_t *classId;
+ m_Reader.Att("class", classId);
+ if (!qt3ds::foundation::isTrivial(classId)) {
+ ++classId;
+ TIdStringMap::iterator iter =
+ m_RenderPluginSourcePaths.find(m_StrTable.RegisterStr(classId));
+ if (iter != m_RenderPluginSourcePaths.end()) {
+ CRegisteredString thePluginPath = m_StrTable.RegisterStr(iter->second.c_str());
+ qt3ds::render::IRenderPluginClass *theClass =
+ m_RenderPluginManager.GetRenderPlugin(thePluginPath);
+ if (theClass) {
+ qt3ds::render::SRenderPlugin *thePlugin =
+ QT3DS_NEW(m_PresentationAllocator, qt3ds::render::SRenderPlugin)();
+ thePlugin->m_PluginPath = thePluginPath;
+ thePlugin->m_Flags.SetActive(true);
+ theNewObject = thePlugin;
+ }
+ }
+ }
+ } break;
+ case qt3dsdm::ComposerObjectTypes::CustomMaterial: {
+ const char8_t *materialClassId;
+ m_Reader.Att("class", materialClassId);
+ CRegisteredString theStr = m_StrTable.RegisterStr(materialClassId + 1);
+ if (m_CustomMaterialSystem.IsMaterialRegistered(theStr)) {
+ theNewObject =
+ m_CustomMaterialSystem.CreateCustomMaterial(theStr, m_PresentationAllocator);
+ }
+ } break;
+ default:
+ // Ignoring unknown objects entirely at this point
+ break;
+ }
+ }
+ if (theNewObject) {
+ CRegisteredString theObjectId(m_StrTable.RegisterStr(theId));
+ m_ObjectMap.insert(eastl::make_pair(theObjectId, theNewObject));
+ theNewObject->m_Id = theObjectId;
+ // setup hierarchy
+ bool isParentNode;
+ bool isChildNode;
+ if (inParent) {
+ switch (inParent->m_Type) {
+ case GraphObjectTypes::Scene:
+ if (theNewObject->m_Type == GraphObjectTypes::Layer) {
+ static_cast<SScene *>(inParent)->AddChild(
+ *static_cast<SLayer *>(theNewObject));
+ }
+ break;
+
+ case GraphObjectTypes::DefaultMaterial:
+ if (theNewObject->m_Type == GraphObjectTypes::Image) {
+ static_cast<SImage *>(theNewObject)->m_Parent =
+ static_cast<SDefaultMaterial *>(inParent);
+ eastl::string thePath = eastl::string(theNewObject->m_Id.c_str());
+ if (thePath.find("probe") != eastl::string::npos)
+ static_cast<SImage *>(theNewObject)->m_MappingMode =
+ ImageMappingModes::LightProbe;
+ }
+ break;
+
+ case GraphObjectTypes::CustomMaterial:
+ if (theNewObject->m_Type == GraphObjectTypes::Image) {
+ static_cast<SImage *>(theNewObject)->m_Parent =
+ static_cast<SCustomMaterial *>(inParent);
+ eastl::string thePath = eastl::string(theNewObject->m_Id.c_str());
+ if (thePath.find("probe") != eastl::string::npos) {
+ static_cast<SImage *>(theNewObject)->m_MappingMode =
+ ImageMappingModes::LightProbe;
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ break;
+ case GraphObjectTypes::ReferencedMaterial:
+ if (theNewObject->m_Type == GraphObjectTypes::Image) {
+ // nothing to do yet
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ break;
+ case GraphObjectTypes::Path:
+
+ if (GraphObjectTypes::IsMaterialType(theNewObject->m_Type))
+ static_cast<SPath *>(inParent)->AddMaterial(theNewObject);
+
+ else if (theNewObject->m_Type == GraphObjectTypes::PathSubPath)
+ static_cast<SPath *>(inParent)->AddSubPath(
+ *static_cast<SPathSubPath *>(theNewObject));
+
+ break;
+
+ default:
+ isParentNode = IsNode(inParent->m_Type);
+ isChildNode = IsNode(theNewObject->m_Type);
+ if (isParentNode && isChildNode) {
+ static_cast<SNode *>(inParent)->AddChild(
+ *static_cast<SNode *>(theNewObject));
+ } else if (isParentNode) {
+ if (inParent->m_Type == GraphObjectTypes::Model
+ && IsMaterial(theNewObject)) {
+ static_cast<SModel *>(inParent)->AddMaterial(*theNewObject);
+ } else {
+ if (inParent->m_Type == GraphObjectTypes::Layer
+ && theNewObject->m_Type == GraphObjectTypes::Effect) {
+ static_cast<SLayer *>(inParent)->AddEffect(
+ *static_cast<SEffect *>(theNewObject));
+ } else if (inParent->m_Type == GraphObjectTypes::Layer
+ && theNewObject->m_Type == GraphObjectTypes::Image) {
+ eastl::string thePath = eastl::string(theNewObject->m_Id.c_str());
+ if (thePath.find("probe2") != eastl::string::npos) {
+ static_cast<SLayer *>(inParent)->m_LightProbe2 =
+ static_cast<SImage *>(theNewObject);
+ } else {
+ static_cast<SLayer *>(inParent)->m_LightProbe =
+ static_cast<SImage *>(theNewObject);
+ }
+ } else {
+ if (theNewObject->m_Type == GraphObjectTypes::RenderPlugin) {
+ qt3ds::render::SRenderPlugin *childObj =
+ static_cast<qt3ds::render::SRenderPlugin *>(theNewObject);
+ if (inParent->m_Type == GraphObjectTypes::Layer) {
+ static_cast<SLayer *>(inParent)->m_RenderPlugin = childObj;
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ } else {
+ if (inParent->m_Type == GraphObjectTypes::Image
+ && theNewObject->m_Type == GraphObjectTypes::RenderPlugin) {
+ static_cast<SImage *>(inParent)->m_RenderPlugin =
+ static_cast<qt3ds::render::SRenderPlugin *>(theNewObject);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ }
+ for (bool valid = m_Reader.MoveToFirstChild(); valid;
+ valid = m_Reader.MoveToNextSibling())
+ ParseGraphPass1(theNewObject);
+ } else {
+ if (isPartOfConfig) {
+ // Object was of unknown type -> parse children with NULL parent
+ for (bool valid = m_Reader.MoveToFirstChild(); valid;
+ valid = m_Reader.MoveToNextSibling()) {
+ ParseGraphPass1(NULL);
+ }
+ }
+ // If object wasn't part of variant config -> skip children.
+ // Continue parsing from next sibling with same parent.
+ }
+ }
+
+ template <typename TObjType>
+ void ParsePass2Properties(TObjType &inObject, const char8_t *inClassId)
+ {
+ const char8_t *theTypeName = m_Reader.GetNarrowElementName();
+ SMetaPropertyParser theMetaParser(theTypeName, inClassId, m_MetaData);
+ // Set default values
+ ParseProperties(inObject, theMetaParser);
+
+ // Now setup property values from the element itself.
+ SDomReaderPropertyParser theReaderParser(m_Reader, m_TempBuf, *this, inObject);
+ ParseProperties(inObject, theReaderParser);
+ }
+
+ // Parse the instance properties from the graph.
+ void ParseGraphPass2()
+ {
+ TScope __instanceScope(m_Reader);
+ const char8_t *theId;
+ m_Reader.Att("id", theId);
+ const char8_t *theClass = "";
+ const char8_t *theVariants = "";
+ m_Reader.Att("class", theClass);
+ m_Reader.Att("variants", theVariants);
+
+ QString theString(theVariants);
+ QStringRef theStringRef(&theString);
+ bool isPartOfConfig = m_variantConfig.isPartOfConfig(theStringRef);
+ if (isPartOfConfig) {
+ TIdObjectMap::iterator theObject = m_ObjectMap.find(m_StrTable.RegisterStr(theId));
+ if (theObject != m_ObjectMap.end()) {
+ switch (theObject->second->m_Type) {
+ case GraphObjectTypes::Scene:
+ ParsePass2Properties(*static_cast<SScene *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Node:
+ ParsePass2Properties(*static_cast<SNode *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Layer:
+ ParsePass2Properties(*static_cast<SLayer *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Camera:
+ ParsePass2Properties(*static_cast<SCamera *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Light:
+ ParsePass2Properties(*static_cast<SLight *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Model:
+ ParsePass2Properties(*static_cast<SModel *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::DefaultMaterial:
+ ParsePass2Properties(*static_cast<SDefaultMaterial *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::ReferencedMaterial:
+ ParsePass2Properties(*static_cast<SReferencedMaterial *>(theObject->second),
+ theClass);
+ break;
+ case GraphObjectTypes::Image:
+ ParsePass2Properties(*static_cast<SImage *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Text:
+ ParsePass2Properties(*static_cast<SText *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Effect:
+ ParsePass2Properties(*static_cast<SEffect *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::RenderPlugin:
+ ParsePass2Properties(*static_cast<qt3ds::render::SRenderPlugin *>(theObject->second),
+ theClass);
+ break;
+ case GraphObjectTypes::CustomMaterial:
+ ParsePass2Properties(*static_cast<SCustomMaterial *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::Path:
+ ParsePass2Properties(*static_cast<SPath *>(theObject->second), theClass);
+ break;
+ case GraphObjectTypes::PathSubPath:
+ ParsePass2Properties(*static_cast<SPathSubPath *>(theObject->second), theClass);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ }
+
+ // If not part of variant config -> ignore children
+ if (isPartOfConfig) {
+ for (bool valid = m_Reader.MoveToFirstChild(); valid; valid = m_Reader.MoveToNextSibling())
+ ParseGraphPass2();
+ }
+ }
+
+ static bool ParseVec2(SDomReaderPropertyParser &inParser, const char *inName, QT3DSVec2 &outValue)
+ {
+ Option<QT3DSVec2> result = inParser.ParseVec2(inName);
+
+ if (result.hasValue())
+ outValue = *result;
+
+ return result.hasValue();
+ }
+
+ static bool ParseFloat(SDomReaderPropertyParser &inParser, const char *inName, QT3DSF32 &outValue)
+ {
+ Option<QT3DSF32> result = inParser.ParseFloat(inName);
+ if (result.hasValue())
+ outValue = *result;
+ return result.hasValue();
+ }
+
+ void ParseState(bool inSetSetValues)
+ {
+ TScope __slideScope(m_Reader);
+ for (bool valid = m_Reader.MoveToFirstChild(); valid;
+ valid = m_Reader.MoveToNextSibling()) {
+ if (strcmp(m_Reader.GetNarrowElementName(), "Add") == 0
+ || (inSetSetValues && strcmp(m_Reader.GetNarrowElementName(), "Set") == 0)) {
+ const char8_t *theId;
+ m_Reader.Att("ref", theId);
+ CRegisteredString theIdStr(m_StrTable.RegisterStr(theId + 1));
+ if (m_ObjectMap.contains(theIdStr)) {
+ TIdObjectMap::iterator theObject = m_ObjectMap.find(theIdStr);
+ if (theObject != m_ObjectMap.end()) {
+ SDomReaderPropertyParser parser(m_Reader, m_TempBuf, *this, *theObject->second);
+ switch (theObject->second->m_Type) {
+ case GraphObjectTypes::Scene:
+ ParseProperties(*reinterpret_cast<SScene *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::Node:
+ ParseProperties(*reinterpret_cast<SNode *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::Layer:
+ ParseProperties(*reinterpret_cast<SLayer *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::Camera:
+ ParseProperties(*reinterpret_cast<SCamera *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::Light:
+ ParseProperties(*reinterpret_cast<SLight *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::Model:
+ ParseProperties(*reinterpret_cast<SModel *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::DefaultMaterial:
+ ParseProperties(*reinterpret_cast<SDefaultMaterial *>(theObject->second),
+ parser);
+ break;
+ case GraphObjectTypes::ReferencedMaterial:
+ ParseProperties(*static_cast<SReferencedMaterial *>(theObject->second),
+ parser);
+ break;
+ case GraphObjectTypes::Image:
+ ParseProperties(*reinterpret_cast<SImage *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::Text:
+ ParseProperties(*static_cast<SText *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::Effect:
+ ParseProperties(*static_cast<SEffect *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::RenderPlugin:
+ ParseProperties(
+ *static_cast<qt3ds::render::SRenderPlugin *>(theObject->second), parser);
+ break;
+ case GraphObjectTypes::CustomMaterial:
+ ParseProperties(
+ *static_cast<qt3ds::render::SCustomMaterial *>(theObject->second),
+ parser);
+ break;
+ case GraphObjectTypes::Path:
+ ParseProperties(*static_cast<qt3ds::render::SPath *>(theObject->second),
+ parser);
+ break;
+ case GraphObjectTypes::PathSubPath:
+ ParseProperties(
+ *static_cast<qt3ds::render::SPathSubPath *>(theObject->second), parser);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ } else {
+ TIdPathAnchorIndexMap::iterator iter =
+ m_AnchorIdToPathAndAnchorIndexMap.find(theIdStr);
+ if (iter != m_AnchorIdToPathAndAnchorIndexMap.end()) {
+ SDomReaderPropertyParser parser(m_Reader, m_TempBuf, *this,
+ *iter->second.m_Segment);
+ NVDataRef<qt3ds::render::SPathAnchorPoint> thePathBuffer =
+ m_PathManager.GetPathSubPathBuffer(*iter->second.m_Segment);
+ QT3DSU32 anchorIndex = iter->second.m_AnchorIndex;
+ QT3DSU32 numAnchors = thePathBuffer.size();
+ if (anchorIndex < numAnchors) {
+ qt3ds::render::SPathAnchorPoint &thePoint(thePathBuffer[anchorIndex]);
+ ParseVec2(parser, "position", thePoint.m_Position);
+ ParseFloat(parser, "incomingangle", thePoint.m_IncomingAngle);
+ thePoint.m_OutgoingAngle = thePoint.m_IncomingAngle + 180.0f;
+ ParseFloat(parser, "incomingdistance", thePoint.m_IncomingDistance);
+ ParseFloat(parser, "outgoingdistance", thePoint.m_OutgoingDistance);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ void AddPluginProperty(qt3ds::render::IRenderPluginClass &pluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::Enum inPropType,
+ eastl::string &tempStr, const char *propName)
+ {
+ tempStr.assign(propName);
+ qt3ds::render::SRenderPluginPropertyDeclaration theDec(
+ m_StrTable.RegisterStr(tempStr.c_str()), inPropType);
+ pluginClass.RegisterProperty(theDec);
+ }
+
+ SPresentation *Load(bool inSetValuesFromSlides)
+ {
+ {
+ TScope __outerScope(m_Reader);
+ if (m_Reader.MoveToFirstChild("ProjectSettings")) {
+ m_Reader.Att("presentationWidth", m_Presentation->m_PresentationDimensions.x);
+ m_Reader.Att("presentationHeight", m_Presentation->m_PresentationDimensions.y);
+ // Upsize them to a multiple of four.
+ m_Presentation->m_PresentationDimensions.x =
+ (QT3DSF32)qt3ds::render::ITextRenderer::NextMultipleOf4(
+ (QT3DSU32)m_Presentation->m_PresentationDimensions.x);
+ m_Presentation->m_PresentationDimensions.y =
+ (QT3DSF32)qt3ds::render::ITextRenderer::NextMultipleOf4(
+ (QT3DSU32)m_Presentation->m_PresentationDimensions.y);
+ const char8_t *thePresentationRotation = "";
+ if (m_Reader.Att("presentationRotation", thePresentationRotation)) {
+ bool success = SRenderUIPLoader::ConvertEnumFromStr(
+ thePresentationRotation, m_Presentation->m_PresentationRotation);
+ (void)success;
+ QT3DS_ASSERT(success);
+ }
+ m_Reader.Att("preferKTX", m_Presentation->m_preferKTX);
+ }
+ }
+ {
+ TScope __outerScope(m_Reader);
+ if (m_Reader.MoveToFirstChild("Classes")) {
+ for (bool valid = m_Reader.MoveToFirstChild(); valid;
+ valid = m_Reader.MoveToNextSibling()) {
+ const char8_t *idStr = "", *name = "", *sourcepath = "";
+ m_Reader.Att("id", idStr);
+ m_Reader.Att("name", name);
+ m_Reader.Att("sourcepath", sourcepath);
+ if (AreEqual(m_Reader.GetNarrowElementName(), "Effect")) {
+ CRegisteredString theId(m_StrTable.RegisterStr(idStr));
+ if (m_EffectSystem.IsEffectRegistered(theId) == false) {
+ // File should already be loaded.
+ Option<qt3dsdm::SMetaDataEffect> theEffectMetaData =
+ m_MetaData.GetEffectMetaDataBySourcePath(sourcepath);
+ if (theEffectMetaData.hasValue()) {
+ qt3ds::render::IUIPLoader::CreateEffectClassFromMetaEffect(
+ theId, m_Foundation, m_EffectSystem, *theEffectMetaData,
+ m_StrTable);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ } else if (AreEqual(m_Reader.GetNarrowElementName(), "CustomMaterial")) {
+ CRegisteredString theId(m_StrTable.RegisterStr(idStr));
+ if (m_CustomMaterialSystem.IsMaterialRegistered(theId) == false) {
+ // File should already be loaded.
+ Option<qt3dsdm::SMetaDataCustomMaterial> theMetaData =
+ m_MetaData.GetMaterialMetaDataBySourcePath(sourcepath);
+ if (theMetaData.hasValue()) {
+ qt3ds::render::IUIPLoader::CreateMaterialClassFromMetaMaterial(
+ theId, m_Foundation, m_CustomMaterialSystem, *theMetaData,
+ m_StrTable);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ } else if (AreEqual(m_Reader.GetNarrowElementName(), "RenderPlugin")) {
+ CRegisteredString theId(m_StrTable.RegisterStr(idStr));
+ m_MetaData.LoadPluginXMLFile(m_Reader.GetNarrowElementName(), idStr, name,
+ sourcepath);
+ eastl::vector<Q3DStudio::TRuntimeMetaDataStrType> theProperties;
+ qt3ds::render::IRenderPluginClass *thePluginClass =
+ m_RenderPluginManager.GetOrCreateRenderPlugin(
+ m_StrTable.RegisterStr(sourcepath));
+ if (thePluginClass) {
+ m_RenderPluginSourcePaths.insert(
+ eastl::make_pair(m_StrTable.RegisterStr(idStr), sourcepath));
+ m_MetaData.GetInstanceProperties(m_Reader.GetNarrowElementName(), idStr,
+ theProperties, false);
+ eastl::string thePropertyStr;
+ CRegisteredString metaType =
+ m_MetaData.GetStringTable()->GetRenderStringTable().RegisterStr(
+ m_Reader.GetNarrowElementName());
+ CRegisteredString metaId =
+ m_MetaData.GetStringTable()->GetRenderStringTable().RegisterStr(
+ idStr);
+ for (QT3DSU32 idx = 0, end = theProperties.size(); idx < end; ++idx) {
+ using namespace Q3DStudio;
+ CRegisteredString metaProp =
+ m_MetaData.GetStringTable()->GetRenderStringTable().RegisterStr(
+ theProperties[idx].c_str());
+ Q3DStudio::ERuntimeDataModelDataType thePropType =
+ m_MetaData.GetPropertyType(metaType, metaProp, metaId);
+ switch (thePropType) {
+ case ERuntimeDataModelDataTypeFloat:
+ AddPluginProperty(
+ *thePluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::Float,
+ thePropertyStr, metaProp.c_str());
+ break;
+ case ERuntimeDataModelDataTypeFloat2:
+ AddPluginProperty(
+ *thePluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::Vector2,
+ thePropertyStr, metaProp.c_str());
+ break;
+ case ERuntimeDataModelDataTypeFloat3:
+ if (m_MetaData.GetAdditionalType(metaType, metaProp, metaId)
+ != ERuntimeAdditionalMetaDataTypeColor)
+ AddPluginProperty(
+ *thePluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::Vector3,
+ thePropertyStr, metaProp.c_str());
+ else
+ AddPluginProperty(
+ *thePluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::Color,
+ thePropertyStr, metaProp.c_str());
+ break;
+ case ERuntimeDataModelDataTypeLong:
+ AddPluginProperty(*thePluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::Long,
+ thePropertyStr, metaProp.c_str());
+ break;
+ case ERuntimeDataModelDataTypeString:
+ case ERuntimeDataModelDataTypeStringRef:
+ AddPluginProperty(
+ *thePluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::String,
+ thePropertyStr, metaProp.c_str());
+ break;
+ case ERuntimeDataModelDataTypeBool:
+ AddPluginProperty(
+ *thePluginClass,
+ qt3ds::render::SRenderPluginPropertyTypes::Boolean,
+ thePropertyStr, metaProp.c_str());
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ {
+ TScope __outerScope(m_Reader);
+ if (m_Reader.MoveToFirstChild("BufferData")) {
+ {
+ TScope __imageScope(m_Reader);
+ for (bool valid = m_Reader.MoveToFirstChild("ImageBuffer"); valid;
+ valid = m_Reader.MoveToNextSibling()) {
+ const char8_t *srcPath;
+ m_Reader.UnregisteredAtt("sourcepath", srcPath);
+ CRegisteredString imgPath = m_StrTable.RegisterStr(srcPath);
+ bool hasTransparency = false;
+ m_Reader.Att("hasTransparency", hasTransparency);
+ m_BufferManager.SetImageHasTransparency(imgPath, hasTransparency);
+ }
+ }
+ }
+ }
+ {
+ TScope __outerScope(m_Reader);
+ {
+ if (m_Reader.MoveToFirstChild("Graph")) {
+ {
+ TScope __graphScope(m_Reader);
+ for (bool valid = m_Reader.MoveToFirstChild(); valid;
+ valid = m_Reader.MoveToNextSibling())
+ ParseGraphPass1(NULL);
+ }
+ {
+ TScope __graphScope(m_Reader);
+ for (bool valid = m_Reader.MoveToFirstChild(); valid;
+ valid = m_Reader.MoveToNextSibling())
+ ParseGraphPass2();
+ }
+ }
+ }
+ }
+ TScope __outerScope(m_Reader);
+ if (m_Reader.MoveToFirstChild("Logic")) {
+ for (bool valid = m_Reader.MoveToFirstChild("State"); valid;
+ valid = m_Reader.MoveToNextSibling()) {
+ {
+ TScope __slideScope(m_Reader);
+ ParseState(true); // parse master
+ for (bool subSlide = m_Reader.MoveToFirstChild("State"); subSlide;
+ subSlide = m_Reader.MoveToNextSibling("State")) {
+ TScope __subSlideScope(m_Reader);
+ ParseState(false); // parse slide setting only *add* values
+ }
+ }
+ {
+ TScope __slideScope(m_Reader);
+ if (inSetValuesFromSlides && m_Reader.MoveToFirstChild("State"))
+ ParseState(true); // parse slide setting only *set* values
+ }
+ }
+ }
+
+ return m_Presentation;
+ }
+};
+}
+
+SPresentation *qt3ds::render::IUIPLoader::LoadUIPFile(
+ qt3dsdm::IDOMReader &inReader, const char8_t *inFullPathToPresentationFile,
+ Q3DStudio::IRuntimeMetaData &inMetaData, IStringTable &inStrTable,
+ NVFoundationBase &inFoundation
+ // Allocator used for the presentation objects themselves
+ // this allows clients to pre-allocate a block of memory just for
+ // the scene graph
+ ,
+ NVAllocatorCallback &inPresentationAllocator
+ // Map of string ids to objects
+ ,
+ TIdObjectMap &ioObjectMap, IBufferManager &inBufferManager, IEffectSystem &inEffectSystem,
+ const char8_t *inPresentationDir, IRenderPluginManager &inPluginManager,
+ ICustomMaterialSystem &inCMS, IDynamicObjectSystem &inDynamicSystem,
+ qt3ds::render::IPathManager &inPathManager, IUIPReferenceResolver *inResolver,
+ const Q3DSVariantConfig &variantConfig, bool inSetValuesFromSlides)
+{
+ SRenderUIPLoader theLoader(inReader, inFullPathToPresentationFile, inMetaData, inStrTable,
+ inFoundation, inPresentationAllocator, ioObjectMap, inBufferManager,
+ inEffectSystem, inPresentationDir, inPluginManager, inCMS,
+ inDynamicSystem, inPathManager, inResolver, variantConfig);
+ return theLoader.Load(inSetValuesFromSlides);
+}
+using namespace qt3dsdm;
+
+inline qt3ds::render::NVRenderTextureFormats::Enum
+ConvertTypeAndFormatToTextureFormat(const char8_t *inType, const char8_t *inFormat,
+ NVFoundationBase &inFoundation)
+{
+ qt3ds::render::NVRenderTextureFormats::Enum retval = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ if (AreEqual(inType, "ubyte")) {
+ if (AreEqual(inFormat, "rgb"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGB8;
+ else if (AreEqual(inFormat, "rgba"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ else if (AreEqual(inFormat, "alpha"))
+ retval = qt3ds::render::NVRenderTextureFormats::Alpha8;
+ else if (AreEqual(inFormat, "lum"))
+ retval = qt3ds::render::NVRenderTextureFormats::Luminance8;
+ else if (AreEqual(inFormat, "lum_alpha"))
+ retval = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8;
+ } else if (AreEqual(inType, "ushort")) {
+ if (AreEqual(inFormat, "rgb"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGB565;
+ else if (AreEqual(inFormat, "rgba"))
+ retval = qt3ds::render::NVRenderTextureFormats::RGBA5551;
+ } else {
+ qCCritical(INVALID_PARAMETER, "Unsupported texture type %s, defaulting to RGBA8",
+ inType);
+ }
+ return retval;
+}
+
+inline qt3ds::render::NVRenderTextureMagnifyingOp::Enum
+ConvertFilterToMagOp(const char8_t *inFilter, NVFoundationBase &inFoundation)
+{
+ if (AreEqual(inFilter, "linear"))
+ return qt3ds::render::NVRenderTextureMagnifyingOp::Linear;
+ if (AreEqual(inFilter, "nearest"))
+ return qt3ds::render::NVRenderTextureMagnifyingOp::Nearest;
+ else {
+ qCCritical(INVALID_PARAMETER, "Unsupported filter type %s, defaulting to linear",
+ inFilter);
+ return qt3ds::render::NVRenderTextureMagnifyingOp::Linear;
+ }
+}
+
+inline qt3ds::render::NVRenderTextureCoordOp::Enum
+ConvertTextureCoordOp(const char8_t *inWrap, NVFoundationBase &inFoundation)
+{
+ if (AreEqual(inWrap, "clamp"))
+ return qt3ds::render::NVRenderTextureCoordOp::ClampToEdge;
+ if (AreEqual(inWrap, "repeat"))
+ return qt3ds::render::NVRenderTextureCoordOp::Repeat;
+ else {
+ qCCritical(INVALID_PARAMETER, "Unsupported wrap type %s, defaulting to clamp",
+ inWrap);
+ return qt3ds::render::NVRenderTextureCoordOp::ClampToEdge;
+ }
+}
+
+// Re-register all strings because we can't be sure that the meta data system and the effect
+// system are sharing the same string table.
+void qt3ds::render::IUIPLoader::CreateEffectClassFromMetaEffect(
+ CRegisteredString inEffectName, NVFoundationBase &inFoundation, IEffectSystem &inEffectSystem,
+ const qt3dsdm::SMetaDataEffect &inMetaDataEffect, IStringTable &inStrTable)
+{
+ using namespace qt3ds::render::dynamic;
+ if (inEffectSystem.IsEffectRegistered(inEffectName)) {
+ qCCritical(INVALID_OPERATION, "Effect %s is already registered",
+ inEffectName.c_str());
+ QT3DS_ASSERT(false);
+ return;
+ }
+ nvvector<SPropertyDeclaration> thePropertyDeclarations(
+ inFoundation.getAllocator(), "qt3ds::render::IUIPLoader::CreateEffectClassFromMetaEffect");
+ nvvector<CRegisteredString> theEnumNames(
+ inFoundation.getAllocator(), "qt3ds::render::IUIPLoader::CreateEffectClassFromMetaEffect");
+ Qt3DSString theConvertStr;
+ Qt3DSString theConvertShaderTypeStr;
+ Qt3DSString theConvertShaderVersionStr;
+
+ for (QT3DSU32 idx = 0, end = inMetaDataEffect.m_Properties.size(); idx < end; ++idx)
+ thePropertyDeclarations.push_back(
+ SPropertyDeclaration(inMetaDataEffect.m_Properties[idx].m_Name.c_str(),
+ inMetaDataEffect.m_Properties[idx].m_DataType));
+ inEffectSystem.RegisterEffect(inEffectName, thePropertyDeclarations);
+ for (QT3DSU32 idx = 0, end = inMetaDataEffect.m_Properties.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(inMetaDataEffect.m_Properties[idx]);
+ if (theDefinition.m_EnumValueNames.size()) {
+ theEnumNames.clear();
+ for (QT3DSU32 enumIdx = 0, enumEnd = theDefinition.m_EnumValueNames.size();
+ enumIdx < enumEnd; ++enumIdx)
+ theEnumNames.push_back(
+ inStrTable.RegisterStr(theDefinition.m_EnumValueNames[enumIdx]));
+ inEffectSystem.SetEffectPropertyEnumNames(
+ inEffectName, inStrTable.RegisterStr(theDefinition.m_Name), theEnumNames);
+ }
+ if (theDefinition.m_DataType == qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr)
+ inEffectSystem.SetEffectPropertyTextureSettings(
+ inEffectName, inStrTable.RegisterStr(theDefinition.m_Name),
+ inStrTable.RegisterStr(theDefinition.m_ImagePath), theDefinition.m_TexUsageType,
+ theDefinition.m_CoordOp, theDefinition.m_MagFilterOp, theDefinition.m_MinFilterOp);
+ }
+ for (QT3DSU32 idx = 0, end = inMetaDataEffect.m_Shaders.size(); idx < end; ++idx) {
+ const qt3dsdm::SMetaDataShader &theShader = inMetaDataEffect.m_Shaders[idx];
+ theConvertStr.clear();
+ theConvertStr = Qt3DSStringUtils::ConvertUTFtoQString(
+ theShader.m_Code.c_str());
+ theConvertShaderTypeStr = Qt3DSStringUtils::ConvertUTFtoQString(
+ theShader.m_Type.c_str());
+ theConvertShaderVersionStr = Qt3DSStringUtils::ConvertUTFtoQString(
+ theShader.m_Version.c_str());
+
+ inEffectSystem.SetShaderData(inStrTable.RegisterStr(theShader.m_Name.c_str()),
+ theConvertStr.c_str(), theConvertShaderVersionStr.c_str(),
+ theConvertStr.c_str(), theShader.m_HasGeomShader,
+ theShader.m_IsComputeShader);
+ }
+
+ inEffectSystem.SetEffectCommands(inEffectName, inMetaDataEffect.m_EffectCommands);
+}
+
+void qt3ds::render::IUIPLoader::CreateMaterialClassFromMetaMaterial(
+ CRegisteredString inClassName, NVFoundationBase &inFoundation,
+ ICustomMaterialSystem &inMaterialSystem,
+ const qt3dsdm::SMetaDataCustomMaterial &inMetaDataMaterial, IStringTable &inStrTable)
+{
+ using namespace qt3ds::render::dynamic;
+ if (inMaterialSystem.IsMaterialRegistered(inClassName)) {
+ qCCritical(INVALID_OPERATION, "Effect %s is already registered",
+ inClassName.c_str());
+ QT3DS_ASSERT(false);
+ return;
+ }
+ nvvector<SPropertyDeclaration> thePropertyDeclarations(
+ inFoundation.getAllocator(),
+ "qt3ds::render::IUIPLoader::CreateMaterialClassFromMetaMaterial");
+ nvvector<CRegisteredString> theEnumNames(
+ inFoundation.getAllocator(),
+ "qt3ds::render::IUIPLoader::CreateMaterialClassFromMetaMaterial");
+ Qt3DSString theConvertStr;
+ Qt3DSString theConvertShaderTypeStr;
+ Qt3DSString theConvertShaderVersionStr;
+ for (QT3DSU32 idx = 0, end = inMetaDataMaterial.m_Properties.size(); idx < end; ++idx)
+ thePropertyDeclarations.push_back(
+ SPropertyDeclaration(inMetaDataMaterial.m_Properties[idx].m_Name.c_str(),
+ inMetaDataMaterial.m_Properties[idx].m_DataType));
+ inMaterialSystem.RegisterMaterialClass(inClassName, thePropertyDeclarations);
+ for (QT3DSU32 idx = 0, end = inMetaDataMaterial.m_Properties.size(); idx < end; ++idx) {
+ const SPropertyDefinition &theDefinition(inMetaDataMaterial.m_Properties[idx]);
+ if (theDefinition.m_EnumValueNames.size()) {
+ theEnumNames.clear();
+ for (QT3DSU32 enumIdx = 0, enumEnd = theDefinition.m_EnumValueNames.size();
+ enumIdx < enumEnd; ++enumIdx)
+ theEnumNames.push_back(
+ inStrTable.RegisterStr(theDefinition.m_EnumValueNames[enumIdx]));
+ inMaterialSystem.SetPropertyEnumNames(
+ inClassName, inStrTable.RegisterStr(theDefinition.m_Name), theEnumNames);
+ }
+ if (theDefinition.m_DataType == qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr)
+ inMaterialSystem.SetPropertyTextureSettings(
+ inClassName, inStrTable.RegisterStr(theDefinition.m_Name),
+ inStrTable.RegisterStr(theDefinition.m_ImagePath), theDefinition.m_TexUsageType,
+ theDefinition.m_CoordOp, theDefinition.m_MagFilterOp, theDefinition.m_MinFilterOp);
+ }
+ if (inMetaDataMaterial.m_Shaders.size()) {
+ for (QT3DSU32 idx = 0, end = (QT3DSU32)inMetaDataMaterial.m_Shaders.size(); idx < end; ++idx) {
+ const qt3dsdm::SMetaDataShader &theShader = inMetaDataMaterial.m_Shaders[idx];
+ theConvertStr = Qt3DSStringUtils::ConvertUTFtoQString(
+ theShader.m_Code.c_str());
+ theConvertShaderTypeStr = Qt3DSStringUtils::ConvertUTFtoQString(
+ theShader.m_Type.c_str());
+ theConvertShaderVersionStr = Qt3DSStringUtils::ConvertUTFtoQString(
+ theShader.m_Version.c_str());
+ inMaterialSystem.SetMaterialClassShader(
+ inStrTable.RegisterStr(theShader.m_Name.c_str()), theConvertShaderTypeStr.c_str(),
+ theConvertShaderVersionStr.c_str(), theConvertStr.c_str(),
+ theShader.m_HasGeomShader, theShader.m_IsComputeShader);
+ }
+ }
+
+ inMaterialSystem.SetCustomMaterialCommands(inClassName,
+ inMetaDataMaterial.m_CustomMaterialCommands);
+ inMaterialSystem.SetCustomMaterialTransparency(inClassName,
+ inMetaDataMaterial.m_HasTransparency);
+ inMaterialSystem.SetCustomMaterialRefraction(inClassName, inMetaDataMaterial.m_HasRefraction);
+ inMaterialSystem.SetCustomMaterialAlwaysDirty(inClassName, inMetaDataMaterial.m_AlwaysDirty);
+ inMaterialSystem.SetCustomMaterialShaderKey(inClassName, inMetaDataMaterial.m_ShaderKey);
+ inMaterialSystem.SetCustomMaterialLayerCount(inClassName, inMetaDataMaterial.m_LayerCount);
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderUIPLoader.h b/src/runtimerender/Qt3DSRenderUIPLoader.h
new file mode 100644
index 0000000..2b70c68
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderUIPLoader.h
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_UIP_LOADER_H
+#define QT3DS_RENDER_UIP_LOADER_H
+
+#ifdef QT3DS_RENDER_ENABLE_LOAD_UIP
+
+#include "Qt3DSRender.h"
+#include "foundation/StringTable.h"
+#include <EASTL/utility.h>
+#include "foundation/Qt3DSContainers.h"
+#include "Qt3DSRenderGraphObject.h"
+#include <QtCore/qstring.h>
+
+namespace Q3DStudio {
+class IRuntimeMetaData;
+}
+
+namespace qt3dsdm {
+class IDOMReader;
+struct SMetaDataEffect;
+struct SMetaDataCustomMaterial;
+}
+
+namespace qt3ds {
+class Q3DSVariantConfig;
+
+namespace render {
+
+ class IBufferManager;
+
+ typedef nvhash_map<CRegisteredString, SGraphObject *> TIdObjectMap;
+
+ struct IUIPReferenceResolver
+ {
+ protected:
+ virtual ~IUIPReferenceResolver() {}
+ public:
+ virtual CRegisteredString ResolveReference(CRegisteredString inStart,
+ const char *inReference) = 0;
+ };
+
+ struct SPresentation;
+
+ class QT3DS_AUTOTEST_EXPORT IUIPLoader
+ {
+ public:
+ // The reader needs to point to the top of the file, we will search
+ // several objects that exist at the top level of the uip file.
+ // Returns NULL if we were incapable of loading the presentation.
+ static SPresentation *
+ LoadUIPFile(qt3dsdm::IDOMReader &inReader
+ // the full path, including the filename
+ // to the presentation file
+ ,
+ const char8_t *inFullPathToPresentationFile,
+ Q3DStudio::IRuntimeMetaData &inMetaData, IStringTable &inStrTable,
+ NVFoundationBase &inFoundation
+ // Allocator used for the presentation objects themselves
+ // this allows clients to pre-allocate a block of memory just for
+ // the scene graph
+ ,
+ NVAllocatorCallback &inPresentationAllocator
+ // Map of string ids to objects
+ ,
+ TIdObjectMap &ioObjectMap
+ // Buffer manager to load details about the images
+ ,
+ IBufferManager &inBufferManager
+ // To load effects we need the effect system
+ // and the presentation directory
+ ,
+ IEffectSystem &inEffectSystem, const char8_t *inPresentationDir,
+ IRenderPluginManager &inPluginManager, ICustomMaterialSystem &inMaterialSystem,
+ IDynamicObjectSystem &inDynamicSystem, qt3ds::render::IPathManager &inPathManager
+ // Resolve references to objects; this is done by the main uip loader during
+ // its normal mode of operation so we try to reuse that code.
+ ,
+ IUIPReferenceResolver *inResolver
+ // Variant config defines variant groups and tags to be used to filter out
+ // unneeded parts of the presentation
+ ,
+ const Q3DSVariantConfig &variantConfig
+ // Set some initial values by going to the master slide then slide 1
+ // Useful for quick testing, sort of equivalent to showing the first frame
+ // of a given presentation
+ ,
+ bool setValuesFromSlides = false);
+
+ static void CreateEffectClassFromMetaEffect(CRegisteredString inEffectName,
+ NVFoundationBase &inFoundation,
+ IEffectSystem &inEffectSystem,
+ const qt3dsdm::SMetaDataEffect &inMetaDataEffect,
+ IStringTable &inStrTable);
+
+ static void CreateMaterialClassFromMetaMaterial(
+ CRegisteredString inEffectName, NVFoundationBase &inFoundation,
+ ICustomMaterialSystem &inEffectSystem,
+ const qt3dsdm::SMetaDataCustomMaterial &inMetaDataMaterial, IStringTable &inStrTable);
+ };
+}
+}
+
+#endif
+#endif
diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp
new file mode 100644
index 0000000..a059493
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.cpp
@@ -0,0 +1,464 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderUIPSharedTranslation.h"
+
+namespace qt3ds {
+namespace render {
+
+#define WCHAR_T_Directional L"Directional"
+#define WCHAR_T_Point L"Point"
+#define WCHAR_T_Area L"Area"
+#define WCHAR_T_None L"None"
+#define WCHAR_T_Vertex L"Vertex"
+#define WCHAR_T_Pixel L"Pixel"
+#define WCHAR_T_Normal L"Normal"
+#define WCHAR_T_Screen L"Screen"
+#define WCHAR_T_Multiply L"Multiply"
+#define WCHAR_T_Overlay L"Overlay"
+#define WCHAR_T_ColorBurn L"ColorBurn"
+#define WCHAR_T_ColorDodge L"ColorDodge"
+#define WCHAR_T_Add L"Add"
+#define WCHAR_T_Subtract L"Subtract"
+#define WCHAR_T_UV_Mapping L"UV Mapping"
+#define WCHAR_T_Environmental_Mapping L"Environmental Mapping"
+#define WCHAR_T_Light_Probe L"Light Probe"
+#define WCHAR_T_No_Tiling L"No Tiling"
+#define WCHAR_T_Mirrored L"Mirrored"
+#define WCHAR_T_Tiled L"Tiled"
+#define WCHAR_T_Left L"Left"
+#define WCHAR_T_Center L"Center"
+#define WCHAR_T_Right L"Right"
+#define WCHAR_T_Top L"Top"
+#define WCHAR_T_Middle L"Middle"
+#define WCHAR_T_Bottom L"Bottom"
+#define WCHAR_T_ElideNone L"ElideNone"
+#define WCHAR_T_ElideLeft L"ElideLeft"
+#define WCHAR_T_ElideMiddle L"ElideMiddle"
+#define WCHAR_T_ElideRight L"ElideRight"
+#define WCHAR_T_2x L"2x"
+#define WCHAR_T_4x L"4x"
+#define WCHAR_T_8x L"8x"
+#define WCHAR_T_SSAA L"SSAA"
+#define WCHAR_T_NoRotation L"NoRotation"
+#define WCHAR_T_Clockwise90 L"90"
+#define WCHAR_T_Clockwise180 L"180"
+#define WCHAR_T_Clockwise270 L"270"
+#define WCHAR_T_Fit L"Fit"
+#define WCHAR_T_Same_Size L"Same Size"
+#define WCHAR_T_CENTER L"Center"
+#define WCHAR_T_North L"N"
+#define WCHAR_T_NorthEast L"NE"
+#define WCHAR_T_East L"E"
+#define WCHAR_T_SouthEast L"SE"
+#define WCHAR_T_South L"S"
+#define WCHAR_T_SouthWest L"SW"
+#define WCHAR_T_West L"W"
+#define WCHAR_T_NorthWest L"NW"
+#define WCHAR_T_LeftWidth L"Left/Width"
+#define WCHAR_T_LeftRight L"Left/Right"
+#define WCHAR_T_WidthRight L"Width/Right"
+#define WCHAR_T_TopHeight L"Top/Height"
+#define WCHAR_T_TopBottom L"Top/Bottom"
+#define WCHAR_T_HeightBottom L"Height/Bottom"
+#define WCHAR_T_Percent L"percent"
+#define WCHAR_T_Pixels L"pixels"
+#define WCHAR_T_Fit_Horizontal L"Fit Horizontal"
+#define WCHAR_T_Fit_Vertical L"Fit Vertical"
+#define WCHAR_T_Default L"Default"
+#define WCHAR_T_KGGX L"KGGX"
+#define WCHAR_T_KWard L"KWard"
+#define WCHAR_T_Transparent L"Transparent"
+#define WCHAR_T_Unspecified L"Unspecified"
+#define WCHAR_T_Color L"SolidColor"
+#define WCHAR_T_Linear L"Linear"
+#define WCHAR_T_Phong L"Phong"
+#define WCHAR_T_NPatch L"NPatch"
+#define WCHAR_T_Taper L"Taper"
+#define WCHAR_T_Geometry L"Geometry"
+#define WCHAR_T_Painted L"Painted"
+#define WCHAR_T_Filled L"Filled"
+#define WCHAR_T_Stroked L"Stroked"
+#define WCHAR_T_FilledAndStroked L"Filled and Stroked"
+#define WCHAR_T_Simple L"Simple"
+#define WCHAR_T_Smoke L"Smoke"
+#define WCHAR_T_Cloud L"Cloud"
+#define WCHAR_T_Fluid L"Fluid"
+#define WCHAR_T_User L"User"
+#define WCHAR_T_Clip L"Clip"
+#define WCHAR_T_WrapWord L"WrapWord"
+#define WCHAR_T_WrapAnywhere L"WrapAnywhere"
+
+#define CHAR_T_Directional "Directional"
+#define CHAR_T_Point "Point"
+#define CHAR_T_Area "Area"
+#define CHAR_T_None "None"
+#define CHAR_T_Vertex "Vertex"
+#define CHAR_T_Pixel "Pixel"
+#define CHAR_T_Normal "Normal"
+#define CHAR_T_Screen "Screen"
+#define CHAR_T_Multiply "Multiply"
+#define CHAR_T_Overlay "Overlay"
+#define CHAR_T_ColorBurn "ColorBurn"
+#define CHAR_T_ColorDodge "ColorDodge"
+#define CHAR_T_Add "Add"
+#define CHAR_T_Subtract "Subtract"
+#define CHAR_T_UV_Mapping "UV Mapping"
+#define CHAR_T_Environmental_Mapping "Environmental Mapping"
+#define CHAR_T_Light_Probe "Light Probe"
+#define CHAR_T_No_Tiling "No Tiling"
+#define CHAR_T_Mirrored "Mirrored"
+#define CHAR_T_Tiled "Tiled"
+#define CHAR_T_Left "Left"
+#define CHAR_T_Center "Center"
+#define CHAR_T_Right "Right"
+#define CHAR_T_Top "Top"
+#define CHAR_T_Middle "Middle"
+#define CHAR_T_Bottom "Bottom"
+#define CHAR_T_ElideNone "ElideNone"
+#define CHAR_T_ElideLeft "ElideLeft"
+#define CHAR_T_ElideMiddle "ElideMiddle"
+#define CHAR_T_ElideRight "ElideRight"
+#define CHAR_T_2x "2x"
+#define CHAR_T_4x "4x"
+#define CHAR_T_8x "8x"
+#define CHAR_T_SSAA "SSAA"
+#define CHAR_T_NoRotation "NoRotation"
+#define CHAR_T_Clockwise90 "90"
+#define CHAR_T_Clockwise180 "180"
+#define CHAR_T_Clockwise270 "270"
+#define CHAR_T_Fit "Fit"
+#define CHAR_T_Same_Size "Same Size"
+#define CHAR_T_CENTER "Center"
+#define CHAR_T_North "N"
+#define CHAR_T_NorthEast "NE"
+#define CHAR_T_East "E"
+#define CHAR_T_SouthEast "SE"
+#define CHAR_T_South "S"
+#define CHAR_T_SouthWest "SW"
+#define CHAR_T_West "W"
+#define CHAR_T_NorthWest "NW"
+#define CHAR_T_LeftWidth "Left/Width"
+#define CHAR_T_LeftRight "Left/Right"
+#define CHAR_T_WidthRight "Width/Right"
+#define CHAR_T_TopHeight "Top/Height"
+#define CHAR_T_TopBottom "Top/Bottom"
+#define CHAR_T_HeightBottom "Height/Bottom"
+#define CHAR_T_Percent "percent"
+#define CHAR_T_Pixels "pixels"
+#define CHAR_T_Fit_Horizontal "Fit Horizontal"
+#define CHAR_T_Fit_Vertical "Fit Vertical"
+#define CHAR_T_Default "Default"
+#define CHAR_T_KGGX "KGGX"
+#define CHAR_T_KWard "KWard"
+#define CHAR_T_Transparent "Transparent"
+#define CHAR_T_Unspecified "Unspecified"
+#define CHAR_T_Color "SolidColor"
+#define CHAR_T_Linear "Linear"
+#define CHAR_T_Phong "Phong"
+#define CHAR_T_NPatch "NPatch"
+#define CHAR_T_Taper "Taper"
+#define CHAR_T_Geometry "Geometry"
+#define CHAR_T_Painted "Painted"
+#define CHAR_T_Filled "Filled"
+#define CHAR_T_Stroked "Stroked"
+#define CHAR_T_FilledAndStroked "Filled and Stroked"
+#define CHAR_T_Simple "Simple"
+#define CHAR_T_Smoke "Smoke"
+#define CHAR_T_Cloud "Cloud"
+#define CHAR_T_Fluid "Fluid"
+#define CHAR_T_User "User"
+#define CHAR_T_Clip "Clip"
+#define CHAR_T_WrapWord "WrapWord"
+#define CHAR_T_WrapAnywhere "WrapAnywhere"
+
+#define DEFINE_NAME_MAP_ENTRY(enumval, name) \
+ { \
+ enumval, WCHAR_T_##name, CHAR_T_##name \
+ }
+ SEnumNameMap g_LightTypesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(RenderLightTypes::Directional, Directional),
+ DEFINE_NAME_MAP_ENTRY(RenderLightTypes::Point, Point),
+ DEFINE_NAME_MAP_ENTRY(RenderLightTypes::Area, Area),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_MaterialLightingMap[] = {
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialLighting::NoLighting, None),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialLighting::VertexLighting, Vertex),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialLighting::FragmentLighting, Pixel),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_BlendModeMap[] = {
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialBlendMode::Normal, Normal),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialBlendMode::Screen, Screen),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialBlendMode::Multiply, Multiply),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialBlendMode::Overlay, Overlay),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialBlendMode::ColorBurn, ColorBurn),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialBlendMode::ColorDodge, ColorDodge),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_ImageMappingModeMap[] = {
+ DEFINE_NAME_MAP_ENTRY(ImageMappingModes::Normal, UV_Mapping),
+ DEFINE_NAME_MAP_ENTRY(ImageMappingModes::Environment, Environmental_Mapping),
+ DEFINE_NAME_MAP_ENTRY(ImageMappingModes::LightProbe, Light_Probe),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_RenderTextureCoordOpMap[] = {
+ DEFINE_NAME_MAP_ENTRY(NVRenderTextureCoordOp::ClampToEdge, No_Tiling),
+ DEFINE_NAME_MAP_ENTRY(NVRenderTextureCoordOp::MirroredRepeat, Mirrored),
+ DEFINE_NAME_MAP_ENTRY(NVRenderTextureCoordOp::Repeat, Tiled),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_TextHorizontalAlignmentMap[] = {
+ DEFINE_NAME_MAP_ENTRY(TextHorizontalAlignment::Left, Left),
+ DEFINE_NAME_MAP_ENTRY(TextHorizontalAlignment::Center, Center),
+ DEFINE_NAME_MAP_ENTRY(TextHorizontalAlignment::Right, Right),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_TextVerticalAlignmentMap[] = {
+ DEFINE_NAME_MAP_ENTRY(TextVerticalAlignment::Top, Top),
+ DEFINE_NAME_MAP_ENTRY(TextVerticalAlignment::Middle, Middle),
+ DEFINE_NAME_MAP_ENTRY(TextVerticalAlignment::Bottom, Bottom),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_TextWordWrapMap[] = {
+ DEFINE_NAME_MAP_ENTRY(TextWordWrap::Clip, Clip),
+ DEFINE_NAME_MAP_ENTRY(TextWordWrap::WrapWord, WrapWord),
+ DEFINE_NAME_MAP_ENTRY(TextWordWrap::WrapAnywhere, WrapAnywhere),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_TextElideMap[] = {
+ DEFINE_NAME_MAP_ENTRY(TextElide::ElideNone, ElideNone),
+ DEFINE_NAME_MAP_ENTRY(TextElide::ElideLeft, ElideLeft),
+ DEFINE_NAME_MAP_ENTRY(TextElide::ElideMiddle, ElideMiddle),
+ DEFINE_NAME_MAP_ENTRY(TextElide::ElideRight, ElideRight),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_ProgressiveAAValuesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(AAModeValues::NoAA, None),
+ DEFINE_NAME_MAP_ENTRY(AAModeValues::SSAA, SSAA),
+ DEFINE_NAME_MAP_ENTRY(AAModeValues::X2, 2x),
+ DEFINE_NAME_MAP_ENTRY(AAModeValues::X4, 4x),
+ DEFINE_NAME_MAP_ENTRY(AAModeValues::X8, 8x),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_LayerBlendTypesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::Normal, Normal),
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::Screen, Screen),
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::Multiply, Multiply),
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::Add, Add),
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::Subtract, Subtract),
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::Overlay, Overlay),
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::ColorBurn, ColorBurn),
+ DEFINE_NAME_MAP_ENTRY(LayerBlendTypes::ColorDodge, ColorDodge),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_RenderRotationValuesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(RenderRotationValues::NoRotation, None),
+ DEFINE_NAME_MAP_ENTRY(RenderRotationValues::Clockwise90, Clockwise90),
+ DEFINE_NAME_MAP_ENTRY(RenderRotationValues::Clockwise180, Clockwise180),
+ DEFINE_NAME_MAP_ENTRY(RenderRotationValues::Clockwise270, Clockwise270),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_CameraScaleModesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(CameraScaleModes::Fit, Fit),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleModes::SameSize, Same_Size),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleModes::FitHorizontal, Fit_Horizontal),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleModes::FitVertical, Fit_Vertical),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_CameraScaleAnchorsMap[] = {
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::Center, Center),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::North, North),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::NorthEast, NorthEast),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::East, East),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::SouthEast, SouthEast),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::South, South),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::SouthWest, SouthWest),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::West, West),
+ DEFINE_NAME_MAP_ENTRY(CameraScaleAnchors::NorthWest, NorthWest),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_HorizontalFieldValuesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(HorizontalFieldValues::LeftWidth, LeftWidth),
+ DEFINE_NAME_MAP_ENTRY(HorizontalFieldValues::LeftRight, LeftRight),
+ DEFINE_NAME_MAP_ENTRY(HorizontalFieldValues::WidthRight, WidthRight),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_VerticalFieldValuesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(VerticalFieldValues::TopHeight, TopHeight),
+ DEFINE_NAME_MAP_ENTRY(VerticalFieldValues::TopBottom, TopBottom),
+ DEFINE_NAME_MAP_ENTRY(VerticalFieldValues::HeightBottom, HeightBottom),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_LayerUnitTypesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(LayerUnitTypes::Percent, Percent),
+ DEFINE_NAME_MAP_ENTRY(LayerUnitTypes::Pixels, Pixels),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_LayerBackgroundMap[] = {
+ DEFINE_NAME_MAP_ENTRY(LayerBackground::Transparent, Transparent),
+ DEFINE_NAME_MAP_ENTRY(LayerBackground::Unspecified, Unspecified),
+ DEFINE_NAME_MAP_ENTRY(LayerBackground::Color, Color),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_SpecularTypesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialSpecularModel::Default, Default),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialSpecularModel::KGGX, KGGX),
+ DEFINE_NAME_MAP_ENTRY(DefaultMaterialSpecularModel::KWard, KWard),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_TessellationValuesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(TessModeValues::NoTess, None),
+ DEFINE_NAME_MAP_ENTRY(TessModeValues::TessLinear, Linear),
+ DEFINE_NAME_MAP_ENTRY(TessModeValues::TessPhong, Phong),
+ DEFINE_NAME_MAP_ENTRY(TessModeValues::TessNPatch, NPatch),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_PathCappingValuesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(PathCapping::Noner, None),
+ DEFINE_NAME_MAP_ENTRY(PathCapping::Taper, Taper),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_PathTypesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(PathTypes::Noner, None),
+ DEFINE_NAME_MAP_ENTRY(PathTypes::Painted, Painted),
+ DEFINE_NAME_MAP_ENTRY(PathTypes::Geometry, Geometry),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap g_PathPaintStylesMap[] = {
+ DEFINE_NAME_MAP_ENTRY(PathPaintStyles::Noner, None),
+ DEFINE_NAME_MAP_ENTRY(PathPaintStyles::FilledAndStroked, FilledAndStroked),
+ DEFINE_NAME_MAP_ENTRY(PathPaintStyles::Filled, Filled),
+ DEFINE_NAME_MAP_ENTRY(PathPaintStyles::Stroked, Stroked),
+ { (QT3DSU32)-1, NULL },
+ };
+
+ SEnumNameMap *SEnumParseMap<RenderLightTypes::Enum>::GetMap() { return g_LightTypesMap; }
+
+ SEnumNameMap *SEnumParseMap<DefaultMaterialLighting::Enum>::GetMap()
+ {
+ return g_MaterialLightingMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<DefaultMaterialBlendMode::Enum>::GetMap() { return g_BlendModeMap; }
+
+ SEnumNameMap *SEnumParseMap<ImageMappingModes::Enum>::GetMap() { return g_ImageMappingModeMap; }
+
+ SEnumNameMap *SEnumParseMap<NVRenderTextureCoordOp::Enum>::GetMap()
+ {
+ return g_RenderTextureCoordOpMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<TextHorizontalAlignment::Enum>::GetMap()
+ {
+ return g_TextHorizontalAlignmentMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<TextVerticalAlignment::Enum>::GetMap()
+ {
+ return g_TextVerticalAlignmentMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<TextWordWrap::Enum>::GetMap()
+ {
+ return g_TextWordWrapMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<TextElide::Enum>::GetMap()
+ {
+ return g_TextElideMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<AAModeValues::Enum>::GetMap() { return g_ProgressiveAAValuesMap; }
+
+ SEnumNameMap *SEnumParseMap<LayerBlendTypes::Enum>::GetMap() { return g_LayerBlendTypesMap; }
+
+ SEnumNameMap *SEnumParseMap<RenderRotationValues::Enum>::GetMap()
+ {
+ return g_RenderRotationValuesMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<CameraScaleModes::Enum>::GetMap() { return g_CameraScaleModesMap; }
+
+ SEnumNameMap *SEnumParseMap<CameraScaleAnchors::Enum>::GetMap()
+ {
+ return g_CameraScaleAnchorsMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<HorizontalFieldValues::Enum>::GetMap()
+ {
+ return g_HorizontalFieldValuesMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<VerticalFieldValues::Enum>::GetMap()
+ {
+ return g_VerticalFieldValuesMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<LayerUnitTypes::Enum>::GetMap() { return g_LayerUnitTypesMap; }
+
+ SEnumNameMap *SEnumParseMap<LayerBackground::Enum>::GetMap() { return g_LayerBackgroundMap; }
+
+ SEnumNameMap *SEnumParseMap<DefaultMaterialSpecularModel::Enum>::GetMap()
+ {
+ return g_SpecularTypesMap;
+ }
+
+ SEnumNameMap *SEnumParseMap<TessModeValues::Enum>::GetMap() { return g_TessellationValuesMap; }
+
+ SEnumNameMap *SEnumParseMap<PathCapping::Enum>::GetMap() { return g_PathCappingValuesMap; }
+
+ SEnumNameMap *SEnumParseMap<PathTypes::Enum>::GetMap() { return g_PathTypesMap; }
+
+ SEnumNameMap *SEnumParseMap<PathPaintStyles::Enum>::GetMap() { return g_PathPaintStylesMap; }
+}
+}
diff --git a/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
new file mode 100644
index 0000000..16ce139
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderUIPSharedTranslation.h
@@ -0,0 +1,485 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_UIP_SHARED_TRANSLATION_H
+#define QT3DS_RENDER_UIP_SHARED_TRANSLATION_H
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSRenderText.h"
+#include "Qt3DSDMWindowsCompatibility.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderModel.h"
+#include "Qt3DSRenderPath.h"
+#include "Qt3DSRenderPresentation.h"
+
+// map from qt3dsdm to qt3ds::render
+namespace qt3ds {
+namespace render {
+
+ template <typename TEnumType>
+ struct SEnumParseMap
+ {
+ };
+
+ struct SEnumNameMap
+ {
+ QT3DSU32 m_Enum;
+ const wchar_t *m_WideName;
+ const char8_t *m_Name;
+ };
+
+ template <>
+ struct SEnumParseMap<RenderLightTypes::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<DefaultMaterialLighting::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<DefaultMaterialBlendMode::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<ImageMappingModes::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<NVRenderTextureCoordOp::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<TextHorizontalAlignment::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<TextVerticalAlignment::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<TextWordWrap::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<TextElide::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<AAModeValues::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<LayerBlendTypes::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<RenderRotationValues::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<CameraScaleModes::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<CameraScaleAnchors::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+ template <>
+ struct SEnumParseMap<HorizontalFieldValues::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+ template <>
+ struct SEnumParseMap<VerticalFieldValues::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+ template <>
+ struct SEnumParseMap<LayerUnitTypes::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<LayerBackground::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<DefaultMaterialSpecularModel::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<TessModeValues::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<PathCapping::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<PathTypes::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+ template <>
+ struct SEnumParseMap<PathPaintStyles::Enum>
+ {
+ static SEnumNameMap *GetMap();
+ };
+
+#define QT3DS_RENDER_WCHAR_T_XYZs L"XYZ"
+#define QT3DS_RENDER_WCHAR_T_YZXs L"YZX"
+#define QT3DS_RENDER_WCHAR_T_ZXYs L"ZXY"
+#define QT3DS_RENDER_WCHAR_T_XZYs L"XZY"
+#define QT3DS_RENDER_WCHAR_T_YXZs L"YXZ"
+#define QT3DS_RENDER_WCHAR_T_ZYXs L"ZYX"
+
+#define QT3DS_RENDER_WCHAR_T_XYZr L"XYZr"
+#define QT3DS_RENDER_WCHAR_T_YZXr L"YZXr"
+#define QT3DS_RENDER_WCHAR_T_ZXYr L"ZXYr"
+#define QT3DS_RENDER_WCHAR_T_XZYr L"XZYr"
+#define QT3DS_RENDER_WCHAR_T_YXZr L"YXZr"
+#define QT3DS_RENDER_WCHAR_T_ZYXr L"ZYXr"
+
+#define QT3DS_RENDER_CHAR_T_XYZs "XYZ"
+#define QT3DS_RENDER_CHAR_T_YZXs "YZX"
+#define QT3DS_RENDER_CHAR_T_ZXYs "ZXY"
+#define QT3DS_RENDER_CHAR_T_XZYs "XZY"
+#define QT3DS_RENDER_CHAR_T_YXZs "YXZ"
+#define QT3DS_RENDER_CHAR_T_ZYXs "ZYX"
+
+#define QT3DS_RENDER_CHAR_T_XYZr "XYZr"
+#define QT3DS_RENDER_CHAR_T_YZXr "YZXr"
+#define QT3DS_RENDER_CHAR_T_ZXYr "ZXYr"
+#define QT3DS_RENDER_CHAR_T_XZYr "XZYr"
+#define QT3DS_RENDER_CHAR_T_YXZr "YXZr"
+#define QT3DS_RENDER_CHAR_T_ZYXr "ZYXr"
+
+ inline QT3DSU32 MapRotationOrder(const wchar_t *inOrderStr)
+ {
+#define MAP_ROTATION_ORDER(name, postfix) \
+ if (wcscmp(inOrderStr, QT3DS_RENDER_WCHAR_T_##name##postfix) == 0) { \
+ return EulOrd##name##postfix; \
+ }
+ MAP_ROTATION_ORDER(XYZ, s);
+ MAP_ROTATION_ORDER(YZX, s);
+ MAP_ROTATION_ORDER(ZXY, s);
+ MAP_ROTATION_ORDER(XZY, s);
+ MAP_ROTATION_ORDER(YXZ, s);
+ MAP_ROTATION_ORDER(ZYX, s);
+ MAP_ROTATION_ORDER(XYZ, r);
+ MAP_ROTATION_ORDER(YZX, r);
+ MAP_ROTATION_ORDER(ZXY, r);
+ MAP_ROTATION_ORDER(XZY, r);
+ MAP_ROTATION_ORDER(YXZ, r);
+ MAP_ROTATION_ORDER(ZYX, r);
+#undef MAP_ROTATION_ORDER
+ return EulOrdYXZs;
+ }
+
+ inline QT3DSU32 MapRotationOrder(const char8_t *inOrderStr)
+ {
+#define MAP_ROTATION_ORDER(name, postfix) \
+ if (strcmp(inOrderStr, QT3DS_RENDER_CHAR_T_##name##postfix) == 0) { \
+ return EulOrd##name##postfix; \
+ }
+ MAP_ROTATION_ORDER(XYZ, s);
+ MAP_ROTATION_ORDER(YZX, s);
+ MAP_ROTATION_ORDER(ZXY, s);
+ MAP_ROTATION_ORDER(XZY, s);
+ MAP_ROTATION_ORDER(YXZ, s);
+ MAP_ROTATION_ORDER(ZYX, s);
+ MAP_ROTATION_ORDER(XYZ, r);
+ MAP_ROTATION_ORDER(YZX, r);
+ MAP_ROTATION_ORDER(ZXY, r);
+ MAP_ROTATION_ORDER(XZY, r);
+ MAP_ROTATION_ORDER(YXZ, r);
+ MAP_ROTATION_ORDER(ZYX, r);
+#undef MAP_ROTATION_ORDER
+ return EulOrdYXZs;
+ }
+
+ // the goal is to unify the systems that transfer information into the UICRender library.
+ // There are currently three such systems; the runtime, studio, and the uip loader that loads
+ // uip files
+ // directly into the render library.
+ // To do this, we need to have a mapping between a generic key and a given property on every
+ // object
+ // along with some information about what portion of the object model this property affects.
+
+ struct Qt3DSRenderDirtyFlags
+ {
+ enum Enum {
+ Unknown = 0,
+ Dirty = 1 << 0,
+ TransformDirty = 1 << 1,
+ TextDirty = 1 << 2,
+ };
+ };
+
+// Now we build out generic macros with no implementation that list all of the properties
+// on each struct that we care about. We will fill in these macros with implementation later.
+// Each macro will list the property name along with what dirty operation should get marked
+// Global parse tables that list every property used by the system.
+
+#define ITERATE_QT3DS_RENDER_SCENE_PROPERTIES \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Scene, ClearColor, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Scene, UseClearColor, Dirty)
+
+#define ITERATE_QT3DS_RENDER_NODE_PROPERTIES \
+ HANDLE_QT3DS_RENDER_TRANSFORM_VEC3_PROPERTY(Node, Rotation, TransformDirty) \
+ HANDLE_QT3DS_RENDER_VEC3_RADIAN_PROPERTY(Node, Rotation, TransformDirty) \
+ HANDLE_QT3DS_RENDER_TRANSFORM_VEC3_PROPERTY(Node, Position, TransformDirty) \
+ HANDLE_QT3DS_RENDER_VEC3_PROPERTY(Node, Position, TransformDirty) \
+ HANDLE_QT3DS_RENDER_TRANSFORM_VEC3_PROPERTY(Node, Scale, TransformDirty) \
+ HANDLE_QT3DS_RENDER_VEC3_PROPERTY(Node, Scale, TransformDirty) \
+ HANDLE_QT3DS_RENDER_TRANSFORM_VEC3_PROPERTY(Node, Pivot, TransformDirty) \
+ HANDLE_QT3DS_RENDER_VEC3_PROPERTY(Node, Pivot, TransformDirty) \
+ HANDLE_QT3DS_RENDER_OPACITY_PROPERTY(Node, LocalOpacity, TransformDirty) \
+ HANDLE_QT3DS_ROTATION_ORDER_PROPERTY(Node, RotationOrder, TransformDirty) \
+ HANDLE_QT3DS_NODE_ORIENTATION_PROPERTY(Node, LeftHanded, TransformDirty)
+
+#define ITERATE_QT3DS_RENDER_LAYER_PROPERTIES \
+ HANDLE_QT3DS_NODE_FLAGS_INVERSE_PROPERTY(Layer, LayerEnableDepthTest, Dirty) \
+ HANDLE_QT3DS_NODE_FLAGS_INVERSE_PROPERTY(Layer, LayerEnableDepthPrePass, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, ProgressiveAAMode, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, MultisampleAAMode, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, TemporalAAEnabled, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Layer, ClearColor, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, BlendType, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, Background, Dirty) \
+ HANDLE_QT3DS_RENDER_SOURCEPATH_PROPERTY(Layer, TexturePath, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, HorizontalFieldValues, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Left, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, LeftUnits, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Width, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, WidthUnits, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Right, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, RightUnits, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, VerticalFieldValues, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Top, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, TopUnits, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Height, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, HeightUnits, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Bottom, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Layer, BottomUnits, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, AoStrength, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, AoDistance, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, AoSoftness, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, AoBias, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, AoDither, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, ShadowStrength, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, ShadowDist, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, ShadowSoftness, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, ShadowBias, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, LightProbe, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, ProbeBright, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, FastIbl, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, ProbeHorizon, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, ProbeFov, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, LightProbe2, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Probe2Fade, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Probe2Window, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Layer, Probe2Pos, Dirty)
+
+#define ITERATE_QT3DS_RENDER_CAMERA_PROPERTIES \
+ HANDLE_QT3DS_RENDER_PROPERTY(Camera, ClipNear, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Camera, ClipFar, Dirty) \
+ HANDLE_QT3DS_RENDER_RADIAN_PROPERTY(Camera, FOV, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Camera, FOVHorizontal, Dirty) \
+ HANDLE_QT3DS_NODE_FLAGS_PROPERTY(Camera, Orthographic, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Camera, ScaleMode, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Camera, ScaleAnchor, Dirty)
+
+#define ITERATE_QT3DS_RENDER_LIGHT_PROPERTIES \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Light, LightType, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, Scope, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(Light, DiffuseColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Light, DiffuseColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(Light, SpecularColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Light, SpecularColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(Light, AmbientColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Light, AmbientColor, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, Brightness, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, LinearFade, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, ExponentialFade, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, AreaWidth, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, AreaHeight, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, CastShadow, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, ShadowBias, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, ShadowFactor, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, ShadowMapFar, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, ShadowMapFov, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Light, ShadowFilter, Dirty)
+
+#define ITERATE_QT3DS_RENDER_MODEL_PROPERTIES \
+ HANDLE_QT3DS_RENDER_SOURCEPATH_PROPERTY(Model, MeshPath, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Model, ShadowCaster, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Model, TessellationMode, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Model, EdgeTess, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Model, InnerTess, Dirty)
+
+#define ITERATE_QT3DS_RENDER_CUSTOM_MATERIAL_PROPERTIES \
+ HANDLE_QT3DS_RENDER_PROPERTY(MaterialBase, IblProbe, Dirty)
+
+#define ITERATE_QT3DS_RENDER_LIGHTMAP_PROPERTIES \
+ HANDLE_QT3DS_RENDER_PROPERTY(Lightmaps, LightmapIndirect, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Lightmaps, LightmapRadiosity, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Lightmaps, LightmapShadow, Dirty)
+
+#define ITERATE_QT3DS_RENDER_MATERIAL_PROPERTIES \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Material, Lighting, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Material, BlendMode, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, VertexColors, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(MaterialBase, IblProbe, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(Material, DiffuseColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Material, DiffuseColor, Dirty) \
+ HANDLE_QT3DS_RENDER_ARRAY_PROPERTY(Material, DiffuseMaps, 0, Dirty) \
+ HANDLE_QT3DS_RENDER_ARRAY_PROPERTY(Material, DiffuseMaps, 1, Dirty) \
+ HANDLE_QT3DS_RENDER_ARRAY_PROPERTY(Material, DiffuseMaps, 2, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, EmissivePower, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(Material, EmissiveColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Material, EmissiveColor, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, EmissiveMap, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, EmissiveMap2, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, SpecularReflection, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, SpecularMap, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Material, SpecularModel, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(Material, SpecularTint, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Material, SpecularTint, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, FresnelPower, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, IOR, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, SpecularAmount, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, SpecularRoughness, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, RoughnessMap, Dirty) \
+ HANDLE_QT3DS_RENDER_OPACITY_PROPERTY(Material, Opacity, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, OpacityMap, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, BumpMap, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, BumpAmount, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, NormalMap, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, DisplacementMap, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, DisplaceAmount, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, TranslucencyMap, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, TranslucentFalloff, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, DiffuseLightWrap, Dirty)
+
+#define ITERATE_QT3DS_RENDER_REFERENCED_MATERIAL_PROPERTIES \
+ HANDLE_QT3DS_RENDER_PROPERTY(Material, ReferencedMaterial, Dirty)
+
+#define ITERATE_QT3DS_RENDER_IMAGE_PROPERTIES \
+ HANDLE_QT3DS_RENDER_SOURCEPATH_PROPERTY(Image, ImagePath, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Image, OffscreenRendererId, Dirty) \
+ HANDLE_QT3DS_RENDER_VEC2_PROPERTY(Image, Scale, TransformDirty) \
+ HANDLE_QT3DS_RENDER_VEC2_PROPERTY(Image, Pivot, TransformDirty) \
+ HANDLE_QT3DS_RENDER_RADIAN_PROPERTY(Image, Rotation, TransformDirty) \
+ HANDLE_QT3DS_RENDER_VEC2_PROPERTY(Image, Position, TransformDirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, MappingMode, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, HorizontalTilingMode, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Image, VerticalTilingMode, Dirty)
+
+#define ITERATE_QT3DS_RENDER_TEXT_PROPERTIES \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, Text, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, Font, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, FontSize, TextDirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Text, HorizontalAlignment, TextDirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Text, VerticalAlignment, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, Leading, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, Tracking, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, DropShadow, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, DropShadowStrength, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, DropShadowOffsetX, TextDirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, DropShadowOffsetY, TextDirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Text, WordWrap, TextDirty) \
+ HANDLE_QT3DS_RENDER_REAL_VEC2_PROPERTY(Text, BoundingBox, TextDirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Text, Elide, TextDirty) \
+ HANDLE_QT3DS_RENDER_COLOR_VEC3_PROPERTY(Text, TextColor, Dirty) \
+ HANDLE_QT3DS_RENDER_COLOR_PROPERTY(Text, TextColor, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Text, EnableAcceleratedFont, Dirty)
+
+#define ITERATE_QT3DS_RENDER_PATH_PROPERTIES \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Path, PathType, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, Width, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, LinearError, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, EdgeTessAmount, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, InnerTessAmount, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Path, BeginCapping, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, BeginCapOffset, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, BeginCapOpacity, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, BeginCapWidth, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Path, EndCapping, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, EndCapOffset, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, EndCapOpacity, Dirty) \
+ HANDLE_QT3DS_RENDER_PROPERTY(Path, EndCapWidth, Dirty) \
+ HANDLE_QT3DS_RENDER_ENUM_PROPERTY(Path, PaintStyle, Dirty) \
+ HANDLE_QT3DS_RENDER_SOURCEPATH_PROPERTY(Path, PathBuffer, Dirty)
+
+#define ITERATE_QT3DS_RENDER_PATH_SUBPATH_PROPERTIES \
+ HANDLE_QT3DS_RENDER_PROPERTY(SubPath, Closed, Dirty)
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderWidgets.cpp b/src/runtimerender/Qt3DSRenderWidgets.cpp
new file mode 100644
index 0000000..311b218
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderWidgets.cpp
@@ -0,0 +1,319 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderWidgets.h"
+#include "Qt3DSRenderNode.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct SWidgetBBox : public IRenderWidget
+{
+ NVBounds3 m_Bounds;
+ QT3DSVec3 m_Color;
+ NVRenderVertexBuffer *m_BoxVertexBuffer;
+ NVRenderIndexBuffer *m_BoxIndexBuffer;
+ NVRenderInputAssembler *m_BoxInputAssembler;
+ NVRenderShaderProgram *m_BoxShader;
+ CRegisteredString m_ItemName;
+ SWidgetBBox(SNode &inNode, const NVBounds3 &inBounds, const QT3DSVec3 &inColor)
+ : IRenderWidget(inNode)
+ , m_Bounds(inBounds)
+ , m_Color(inColor)
+ , m_BoxVertexBuffer(NULL)
+ , m_BoxIndexBuffer(NULL)
+ , m_BoxInputAssembler(NULL)
+ , m_BoxShader(NULL)
+ {
+ }
+
+ void SetupBoxShader(IRenderWidgetContext &inContext)
+ {
+ m_BoxShader = inContext.GetShader(m_ItemName);
+ if (!m_BoxShader) {
+ qt3ds::render::IShaderProgramGenerator &theGenerator(inContext.GetProgramGenerator());
+ theGenerator.BeginProgram();
+ qt3ds::render::IShaderStageGenerator &theVertexGenerator(
+ *theGenerator.GetStage(qt3ds::render::ShaderGeneratorStages::Vertex));
+ qt3ds::render::IShaderStageGenerator &theFragmentGenerator(
+ *theGenerator.GetStage(qt3ds::render::ShaderGeneratorStages::Fragment));
+
+ theVertexGenerator.AddIncoming("attr_pos", "vec3");
+ theVertexGenerator.AddUniform("model_view_projection", "mat4");
+ theVertexGenerator.Append("void main() {");
+ theVertexGenerator.Append(
+ "\tgl_Position = model_view_projection * vec4(attr_pos, 1.0);");
+ theVertexGenerator.Append("}");
+ theFragmentGenerator.AddUniform("output_color", "vec3");
+ theFragmentGenerator.Append("void main() {");
+ theFragmentGenerator.Append("\tgl_FragColor.rgb = output_color;");
+ theFragmentGenerator.Append("\tgl_FragColor.a = 1.0;");
+ theFragmentGenerator.Append("}");
+ m_BoxShader = inContext.CompileAndStoreShader(m_ItemName);
+ }
+ }
+
+ void SetupBoundingBoxGraphicsObjects(IRenderWidgetContext &inContext,
+ NVDataRef<QT3DSVec3> thePoints)
+ {
+ qt3ds::render::NVRenderVertexBufferEntry theEntry(
+ "attr_pos", qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3);
+ m_BoxVertexBuffer = &inContext.GetOrCreateVertexBuffer(
+ m_ItemName, 3 * sizeof(QT3DSF32), toU8DataRef(thePoints.begin(), thePoints.size()));
+ m_BoxIndexBuffer = inContext.GetIndexBuffer(m_ItemName);
+ if (!m_BoxIndexBuffer) {
+ // The way the bounds lays out the bounds for the box
+ // capitalization indicates whether this was a max or min value.
+ enum _Indexes {
+ xyz = 0,
+ Xyz,
+ xYz,
+ xyZ,
+ XYZ,
+ xYZ,
+ XyZ,
+ XYz,
+ };
+ QT3DSU8 indexes[] = {
+ // The toBoxBounds function lays out points such that
+ // xyz, Xyz, xYz, xyZ, XYZ, xYZ, XyZ, XYz
+ // Min corner
+ xyz, Xyz, xyz, xYz, xyz, xyZ,
+
+ // Max corner
+ XYZ, xYZ, XYZ, XyZ, XYZ, XYz,
+
+ // Now connect the rest of the dots.
+ // the rules are that only one letter can change
+ // else you are connecting *across* the box somehow.
+
+ Xyz, XYz, Xyz, XyZ,
+
+ xYz, XYz, xYz, xYZ,
+
+ xyZ, XyZ, xyZ, xYZ,
+ };
+ m_BoxIndexBuffer = &inContext.GetOrCreateIndexBuffer(
+ m_ItemName, qt3ds::render::NVRenderComponentTypes::QT3DSU8, sizeof(indexes),
+ toU8DataRef(indexes, sizeof(indexes)));
+ }
+
+ m_BoxInputAssembler = inContext.GetInputAssembler(m_ItemName);
+ if (!m_BoxInputAssembler && m_BoxIndexBuffer && m_BoxVertexBuffer) {
+ // create our attribute layout
+ NVRenderAttribLayout *theAttribLAyout =
+ &inContext.CreateAttributeLayout(toConstDataRef(&theEntry, 1));
+
+ QT3DSU32 strides = m_BoxVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ m_BoxInputAssembler = &inContext.GetOrCreateInputAssembler(
+ m_ItemName, theAttribLAyout, toConstDataRef(&m_BoxVertexBuffer, 1),
+ m_BoxIndexBuffer, toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+ }
+ SetupBoxShader(inContext);
+ }
+
+ void Render(IRenderWidgetContext &inWidgetContext, NVRenderContext &inRenderContext) override
+ {
+ m_ItemName = inRenderContext.GetStringTable().RegisterStr("SWidgetBBox");
+ SWidgetRenderInformation theInfo(inWidgetContext.GetWidgetRenderInformation(
+ *m_Node, m_Node->m_Position, RenderWidgetModes::Local));
+ TNVBounds2BoxPoints thePoints;
+ m_Bounds.expand(thePoints);
+ QT3DSMat44 theNodeRotation;
+ QT3DSMat44 theNodeToCamera = theInfo.m_NodeParentToCamera * m_Node->m_LocalTransform;
+ for (QT3DSU32 idx = 0; idx < 8; ++idx)
+ thePoints[idx] = theNodeToCamera.transform(thePoints[idx]);
+ SetupBoundingBoxGraphicsObjects(inWidgetContext, toDataRef(thePoints, 8));
+ if (m_BoxShader && m_BoxInputAssembler) {
+ inRenderContext.SetBlendingEnabled(false);
+ inRenderContext.SetDepthWriteEnabled(true);
+ inRenderContext.SetDepthTestEnabled(true);
+ inRenderContext.SetCullingEnabled(false);
+ inRenderContext.SetActiveShader(m_BoxShader);
+ m_BoxShader->SetPropertyValue("model_view_projection", theInfo.m_LayerProjection);
+ m_BoxShader->SetPropertyValue("output_color", m_Color);
+ inRenderContext.SetInputAssembler(m_BoxInputAssembler);
+ inRenderContext.Draw(qt3ds::render::NVRenderDrawMode::Lines,
+ m_BoxInputAssembler->GetIndexCount(), 0);
+ }
+ }
+};
+
+struct SWidgetAxis : public IRenderWidget
+{
+ NVRenderVertexBuffer *m_AxisVertexBuffer;
+ NVRenderInputAssembler *m_AxisInputAssembler;
+ NVRenderShaderProgram *m_AxisShader;
+ CRegisteredString m_ItemName;
+
+ SWidgetAxis(SNode &inNode)
+ : IRenderWidget(inNode)
+ , m_AxisVertexBuffer(NULL)
+ , m_AxisInputAssembler(NULL)
+ , m_AxisShader(NULL)
+ {
+ }
+
+ void SetupAxisShader(IRenderWidgetContext &inContext)
+ {
+ m_AxisShader = inContext.GetShader(m_ItemName);
+ if (!m_AxisShader) {
+ qt3ds::render::IShaderProgramGenerator &theGenerator(inContext.GetProgramGenerator());
+ theGenerator.BeginProgram();
+ qt3ds::render::IShaderStageGenerator &theVertexGenerator(
+ *theGenerator.GetStage(qt3ds::render::ShaderGeneratorStages::Vertex));
+ qt3ds::render::IShaderStageGenerator &theFragmentGenerator(
+ *theGenerator.GetStage(qt3ds::render::ShaderGeneratorStages::Fragment));
+ theVertexGenerator.AddIncoming("attr_pos", "vec3");
+ theVertexGenerator.AddIncoming("attr_color", "vec3");
+ theVertexGenerator.AddOutgoing("output_color", "vec3");
+ theVertexGenerator.AddUniform("model_view_projection", "mat4");
+ theVertexGenerator.Append("void main() {");
+ theVertexGenerator.Append(
+ "\tgl_Position = model_view_projection * vec4(attr_pos, 1.0);");
+ theVertexGenerator.Append("\toutput_color = attr_color;");
+ theVertexGenerator.Append("}");
+ theFragmentGenerator.Append("void main() {");
+ theFragmentGenerator.Append("\tgl_FragColor.rgb = output_color;");
+ theFragmentGenerator.Append("\tgl_FragColor.a = 1.0;");
+ theFragmentGenerator.Append("}");
+ m_AxisShader = inContext.CompileAndStoreShader(m_ItemName);
+ }
+ }
+
+ void SetupAxesGraphicsObjects(IRenderWidgetContext &inContext, NVDataRef<QT3DSVec3> theAxes)
+ {
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ qt3ds::render::NVRenderVertexBufferEntry("attr_color",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3, 12),
+ };
+
+ m_AxisVertexBuffer = &inContext.GetOrCreateVertexBuffer(
+ m_ItemName, 6 * sizeof(QT3DSF32), toU8DataRef(theAxes.begin(), theAxes.size()));
+ m_AxisInputAssembler = inContext.GetInputAssembler(m_ItemName);
+ if (!m_AxisInputAssembler && m_AxisVertexBuffer) {
+ // create our attribute layout
+ NVRenderAttribLayout *theAttribLAyout =
+ &inContext.CreateAttributeLayout(toConstDataRef(theEntries, 2));
+
+ QT3DSU32 strides = m_AxisVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ m_AxisInputAssembler = &inContext.GetOrCreateInputAssembler(
+ m_ItemName, theAttribLAyout, toConstDataRef(&m_AxisVertexBuffer, 1), nullptr,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+ }
+ }
+
+ inline QT3DSVec3 TransformDirection(const QT3DSMat33 &inMatrix, const QT3DSVec3 &inDir)
+ {
+ QT3DSVec3 retval = inMatrix.transform(inDir);
+ return retval;
+ }
+
+ void Render(IRenderWidgetContext &inWidgetContext, NVRenderContext &inRenderContext) override
+ {
+ m_ItemName = inRenderContext.GetStringTable().RegisterStr("SWidgetAxis");
+
+ SetupAxisShader(inWidgetContext);
+
+ if (m_AxisShader) {
+ static const QT3DSVec3 pivotCol = QT3DSVec3(0, 0, 1);
+ if (m_Node->m_Parent && m_Node->m_Parent->m_Type != GraphObjectTypes::Layer) {
+ m_Node->m_Parent->CalculateGlobalVariables();
+ }
+ QT3DSVec3 thePivot(m_Node->m_Pivot);
+ if (m_Node->m_Flags.IsLeftHanded())
+ thePivot.z *= -1;
+
+ SWidgetRenderInformation theInfo(inWidgetContext.GetWidgetRenderInformation(
+ *m_Node, QT3DSVec3(0, 0, 0), RenderWidgetModes::Local));
+
+ QT3DSMat44 theNodeRotation;
+ m_Node->CalculateRotationMatrix(theNodeRotation);
+ if (m_Node->m_Flags.IsLeftHanded())
+ SNode::FlipCoordinateSystem(theNodeRotation);
+
+ QT3DSMat33 theRotationMatrix(theNodeRotation.column0.getXYZ(),
+ theNodeRotation.column1.getXYZ(),
+ theNodeRotation.column2.getXYZ());
+
+ // Move the camera position into camera space. This is so that when we render we don't
+ // have to account
+ // for scaling done in the camera's MVP.
+ QT3DSVec3 theItemPosition = theInfo.m_Position;
+
+ QT3DSMat33 theAxisTransform = theInfo.m_NormalMatrix * theRotationMatrix;
+
+ // Scale the effective pivot line end point according to node scale
+ // so that pivot line always hits object center.
+ thePivot = thePivot.multiply(m_Node->m_Scale);
+ QT3DSVec3 pivotVec = TransformDirection(
+ theAxisTransform, QT3DSVec3(-thePivot.x, -thePivot.y, -thePivot.z));
+
+ QT3DSVec3 thePivotLine[] = {
+ theItemPosition, pivotCol, theItemPosition + pivotVec, pivotCol
+ };
+
+ SetupAxesGraphicsObjects(inWidgetContext, toDataRef(thePivotLine, 4));
+
+ if (m_AxisInputAssembler) {
+ inRenderContext.SetBlendingEnabled(false);
+ inRenderContext.SetDepthWriteEnabled(false);
+ inRenderContext.SetDepthTestEnabled(false);
+ inRenderContext.SetCullingEnabled(false);
+ inRenderContext.SetActiveShader(m_AxisShader);
+ m_AxisShader->SetPropertyValue("model_view_projection", theInfo.m_LayerProjection);
+ inRenderContext.SetInputAssembler(m_AxisInputAssembler);
+ // Draw line from pivot to object center.
+ inRenderContext.Draw(qt3ds::render::NVRenderDrawMode::Lines, 2, 0);
+ }
+ }
+ }
+};
+}
+
+IRenderWidget &IRenderWidget::CreateBoundingBoxWidget(SNode &inNode, const NVBounds3 &inBounds,
+ const QT3DSVec3 &inColor,
+ NVAllocatorCallback &inAlloc)
+{
+ return *QT3DS_NEW(inAlloc, SWidgetBBox)(inNode, inBounds, inColor);
+}
+
+IRenderWidget &IRenderWidget::CreateAxisWidget(SNode &inNode, NVAllocatorCallback &inAlloc)
+{
+ return *QT3DS_NEW(inAlloc, SWidgetAxis)(inNode);
+}
diff --git a/src/runtimerender/Qt3DSRenderWidgets.h b/src/runtimerender/Qt3DSRenderWidgets.h
new file mode 100644
index 0000000..28cb332
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderWidgets.h
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_WIDGETS_H
+#define QT3DS_RENDER_WIDGETS_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/Qt3DSMat44.h"
+#include "foundation/Qt3DSMat33.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "foundation/Qt3DSVec3.h"
+#include "EASTL/utility.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "Qt3DSRenderText.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SWidgetRenderInformation
+ {
+ // Just the rotation component of the nodeparenttocamera.
+ QT3DSMat33 m_NormalMatrix;
+ // The node parent's global transform multiplied by the inverse camera global transfrom;
+ // basically the MV from model-view-projection
+ QT3DSMat44 m_NodeParentToCamera;
+ // Projection that accounts for layer scaling
+ QT3DSMat44 m_LayerProjection;
+ // Pure camera projection without layer scaling
+ QT3DSMat44 m_PureProjection;
+ // A look at matrix that will rotate objects facing directly up
+ // the Z axis such that the point to the camera.
+ QT3DSMat33 m_LookAtMatrix;
+ // Conversion from world to camera position so world points not in object
+ // local space can be converted to camera space without going through the node's
+ // inverse global transform
+ QT3DSMat44 m_CameraGlobalInverse;
+ // Offset to add to the node's world position in camera space to move to the ideal camera
+ // location so that scale will work. This offset should be added *after* translation into
+ // camera space
+ QT3DSVec3 m_WorldPosOffset;
+ // Position in camera space to center the widget around
+ QT3DSVec3 m_Position;
+ // Scale factor to scale the widget by.
+ QT3DSF32 m_Scale;
+
+ // The camera used to render this object.
+ SCamera *m_Camera;
+ SWidgetRenderInformation(const QT3DSMat33 &inNormal, const QT3DSMat44 &inNodeParentToCamera,
+ const QT3DSMat44 &inLayerProjection, const QT3DSMat44 &inProjection,
+ const QT3DSMat33 &inLookAt, const QT3DSMat44 &inCameraGlobalInverse,
+ const QT3DSVec3 &inWorldPosOffset, const QT3DSVec3 &inPos, QT3DSF32 inScale,
+ SCamera &inCamera)
+ : m_NormalMatrix(inNormal)
+ , m_NodeParentToCamera(inNodeParentToCamera)
+ , m_LayerProjection(inLayerProjection)
+ , m_PureProjection(inProjection)
+ , m_LookAtMatrix(inLookAt)
+ , m_CameraGlobalInverse(inCameraGlobalInverse)
+ , m_WorldPosOffset(inWorldPosOffset)
+ , m_Position(inPos)
+ , m_Scale(inScale)
+ , m_Camera(&inCamera)
+ {
+ }
+ SWidgetRenderInformation()
+ : m_Camera(NULL)
+ {
+ }
+ };
+ typedef eastl::pair<SShaderVertexCodeGenerator &, SShaderFragmentCodeGenerator &>
+ TShaderGeneratorPair;
+
+ struct RenderWidgetModes
+ {
+ enum Enum {
+ Local,
+ Global,
+ };
+ };
+ // Context used to get render data for the widget.
+ class IRenderWidgetContext
+ {
+ protected:
+ virtual ~IRenderWidgetContext() {}
+ public:
+ virtual NVRenderVertexBuffer &
+ GetOrCreateVertexBuffer(CRegisteredString &inStr, QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) = 0;
+ virtual NVRenderIndexBuffer &
+ GetOrCreateIndexBuffer(CRegisteredString &inStr,
+ qt3ds::render::NVRenderComponentTypes::Enum componentType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) = 0;
+ virtual NVRenderAttribLayout &
+ CreateAttributeLayout(NVConstDataRef<qt3ds::render::NVRenderVertexBufferEntry> attribs) = 0;
+ virtual NVRenderInputAssembler &
+ GetOrCreateInputAssembler(CRegisteredString &inStr, NVRenderAttribLayout *attribLayout,
+ NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets) = 0;
+
+ virtual NVRenderVertexBuffer *GetVertexBuffer(CRegisteredString &inStr) = 0;
+ virtual NVRenderIndexBuffer *GetIndexBuffer(CRegisteredString &inStr) = 0;
+ virtual NVRenderInputAssembler *GetInputAssembler(CRegisteredString &inStr) = 0;
+
+ virtual NVRenderShaderProgram *GetShader(CRegisteredString inStr) = 0;
+ virtual IShaderProgramGenerator &GetProgramGenerator() = 0;
+ // calls compile on the program generator and stores result under this name.
+ virtual NVRenderShaderProgram *CompileAndStoreShader(CRegisteredString inStr) = 0;
+ virtual STextDimensions MeasureText(const STextRenderInfo &inText) = 0;
+ // Render text using a specific MVP
+ virtual void RenderText(const STextRenderInfo &inText, const QT3DSVec3 &inTextColor,
+ const QT3DSVec3 &inBackgroundColor, const QT3DSMat44 &inMVP) = 0;
+ // Given a node and a point in the node's local space (most likely its pivot point), we
+ // return
+ // a normal matrix so you can get the axis out, a transformation from node to camera
+ // a new position and a floating point scale factor so you can render in 1/2 perspective
+ // mode
+ // or orthographic mode if you would like to.
+ virtual SWidgetRenderInformation
+ GetWidgetRenderInformation(SNode &inNode, const QT3DSVec3 &inPos,
+ RenderWidgetModes::Enum inWidgetMode) = 0;
+ };
+
+ class IRenderWidget
+ {
+ protected:
+ virtual ~IRenderWidget() {}
+ SNode *m_Node;
+
+ public:
+ IRenderWidget(SNode &inNode)
+ : m_Node(&inNode)
+ {
+ }
+ IRenderWidget()
+ : m_Node(NULL)
+ {
+ }
+ virtual void Render(IRenderWidgetContext &inWidgetContext,
+ NVRenderContext &inRenderContext) = 0;
+ SNode &GetNode() { return *m_Node; }
+
+ // Pure widgets.
+ static IRenderWidget &CreateBoundingBoxWidget(SNode &inNode, const NVBounds3 &inBounds,
+ const QT3DSVec3 &inColor,
+ NVAllocatorCallback &inAlloc);
+ static IRenderWidget &CreateAxisWidget(SNode &inNode, NVAllocatorCallback &inAlloc);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRenderableImage.h b/src/runtimerender/Qt3DSRenderableImage.h
new file mode 100644
index 0000000..5d4aa1c
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderableImage.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDERABLE_IMAGE_H
+#define QT3DS_RENDERABLE_IMAGE_H
+#include "Qt3DSRender.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct ImageMapTypes
+ {
+ enum Enum {
+ Unknown = 0,
+ Diffuse = 1,
+ Opacity = 2,
+ Specular = 3,
+ Emissive = 4,
+ Bump = 5,
+ SpecularAmountMap = 6,
+ Normal = 7,
+ Displacement = 8,
+ Translucency = 9,
+ LightmapIndirect = 10,
+ LightmapRadiosity = 11,
+ LightmapShadow = 12,
+ Roughness = 13,
+ };
+ };
+
+ /**
+ * Some precomputed information on a given image. When generating a renderable, the shader
+ * generator goes through all the possible images on a material and for each valid image
+ * computes this renderable image and attaches it to the renderable.
+ */
+ struct SRenderableImage
+ {
+ ImageMapTypes::Enum m_MapType;
+ SImage &m_Image;
+ SRenderableImage *m_NextImage;
+ SRenderableImage(ImageMapTypes::Enum inMapType, SImage &inImage)
+ : m_MapType(inMapType)
+ , m_Image(inImage)
+ , m_NextImage(NULL)
+ {
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/Qt3DSRenderer.h b/src/runtimerender/Qt3DSRenderer.h
new file mode 100644
index 0000000..db3eee8
--- /dev/null
+++ b/src/runtimerender/Qt3DSRenderer.h
@@ -0,0 +1,249 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDERER_H
+#define QT3DS_RENDERER_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSFlags.h"
+#include "EASTL/algorithm.h" //pair
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSVec2.h"
+#include "Qt3DSRenderGraphObjectPickQuery.h"
+#include "Qt3DSRenderCamera.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "Qt3DSRenderRay.h"
+
+namespace qt3ds {
+namespace render {
+
+ class IRenderableObject;
+ struct SModel;
+ struct SText;
+ struct SCamera;
+ struct SLight;
+ struct SLayer;
+ class IBufferManager;
+ typedef void *SRenderInstanceId;
+
+ using qt3ds::foundation::NVConstDataRef;
+
+ class IQt3DSRenderNodeFilter
+ {
+ protected:
+ virtual ~IQt3DSRenderNodeFilter() {}
+ public:
+ virtual bool IncludeNode(const SNode &inNode) = 0;
+ };
+ struct SLayerPickSetup
+ {
+ QT3DSMat44 m_ProjectionPreMultiply;
+ QT3DSMat44 m_ViewProjection;
+ NVRenderRect m_ScissorRect;
+ SLayerPickSetup(const QT3DSMat44 &inProjPreMult, const QT3DSMat44 &inVP,
+ const NVRenderRect &inScissor)
+ : m_ProjectionPreMultiply(inProjPreMult)
+ , m_ViewProjection(inVP)
+ , m_ScissorRect(inScissor)
+ {
+ }
+ SLayerPickSetup() {}
+ };
+
+ struct SScaleAndPosition
+ {
+ QT3DSVec3 m_Position;
+ QT3DSF32 m_Scale;
+ SScaleAndPosition(const QT3DSVec3 &inPos, QT3DSF32 inScale)
+ : m_Position(inPos)
+ , m_Scale(inScale)
+ {
+ }
+ SScaleAndPosition() {}
+ };
+
+ class IQt3DSRenderer : public NVRefCounted
+ {
+ protected:
+ virtual ~IQt3DSRenderer() {}
+
+ public:
+ virtual void EnableLayerCaching(bool inEnabled) = 0;
+ virtual bool IsLayerCachingEnabled() const = 0;
+ virtual void EnableLayerGpuProfiling(bool inEnabled) = 0;
+ virtual bool IsLayerGpuProfilingEnabled() const = 0;
+
+ // Get the camera that rendered this node last render
+ virtual SCamera *GetCameraForNode(const SNode &inNode) const = 0;
+ virtual Option<SCuboidRect> GetCameraBounds(const SGraphObject &inObject) = 0;
+ // Called when you have changed the number or order of children of a given node.
+ virtual void ChildrenUpdated(SNode &inParent) = 0;
+ virtual QT3DSF32 GetTextScale(const SText &inText) = 0;
+
+ // The IQt3DSRenderContext calls these, clients should not.
+ virtual void BeginFrame() = 0;
+ virtual void EndFrame() = 0;
+
+ // Setup the vertex and index buffers (but not shader state)
+ // and render the quad. The quad is setup so that its edges
+ // go from -1,1 in x,y and its UV coordinates will map naturally
+ // to an image.
+ virtual void RenderQuad() = 0;
+
+ // Render a given texture to the scene using a given transform.
+ virtual void RenderQuad(const QT3DSVec2 inDimensions, const QT3DSMat44 &inMVP,
+ NVRenderTexture2D &inQuadTexture) = 0;
+
+ // This point rendering works uisng indirect array drawing
+ // This means you need to setup a GPU buffer
+ // which contains the drawing information
+ virtual void RenderPointsIndirect() = 0;
+
+ // Returns true if this layer or a sibling was dirty.
+ virtual bool PrepareLayerForRender(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ bool inRenderSiblings = true,
+ const SRenderInstanceId id = nullptr) = 0;
+ virtual void RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions, bool clear,
+ QT3DSVec4 clearColor, bool inRenderSiblings = true,
+ const SRenderInstanceId id = nullptr) = 0;
+
+ // Studio option to disable picking against sub renderers. This allows better interaction
+ // in studio.
+ // In pick siblings measn pick the layer siblings; this is the normal behavior.
+ // InPickEverything means ignore the node's pick flags; this allows us to only pick things
+ // that have handlers
+ // in some cases and just pick everything in other things.
+ virtual void PickRenderPlugins(bool inPick) = 0;
+ virtual Qt3DSRenderPickResult Pick(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inMouseCoords, bool inPickSiblings = true,
+ bool inPickEverything = false,
+ const SRenderInstanceId id = nullptr) = 0;
+
+ // Return the relative hit position, in UV space, of a mouse pick against this object.
+ // We need the node in order to figure out which layer rendered this object.
+ // We need mapper objects if this is a in a subpresentation because we have to know how
+ // to map the mouse coordinates into the subpresentation. So for instance if inNode is in
+ // a subpres then we need to know which image is displaying the subpres in order to map
+ // the mouse coordinates into the subpres's render space.
+ virtual Option<QT3DSVec2> FacePosition(SNode &inNode, NVBounds3 inBounds,
+ const QT3DSMat44 &inGlobalTransform,
+ const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inMouseCoords,
+ NVDataRef<SGraphObject *> inMapperObjects,
+ SBasisPlanes::Enum inIsectPlane) = 0;
+
+ virtual QT3DSVec3 UnprojectToPosition(SNode &inNode, QT3DSVec3 &inPosition,
+ const QT3DSVec2 &inMouseVec) const = 0;
+ virtual QT3DSVec3 UnprojectWithDepth(SNode &inNode, QT3DSVec3 &inPosition,
+ const QT3DSVec3 &inMouseVec) const = 0;
+ virtual QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const = 0;
+
+ // Roughly equivalent of gluPickMatrix, allows users to setup a perspective transform that
+ // will draw some sub component
+ // of the layer. Used in combination with an expected viewport of 0,0,width,height the
+ // viewproj matrix returned will center
+ // around the center of the viewport and render just the part of the layer around this area.
+ // The return value is optional because if the mouse point is completely outside the layer
+ // obviously this method is irrelevant.
+ virtual Option<SLayerPickSetup> GetLayerPickSetup(SLayer &inLayer,
+ const QT3DSVec2 &inMouseCoords,
+ const QSize &inPickDims) = 0;
+
+ // Return the layer's viewport rect after the layer's member variables have been applied.
+ // Uses the last rendered viewport rect.
+ virtual Option<NVRenderRectF> GetLayerRect(SLayer &inLayer) = 0;
+ // Testing function to allow clients to render a layer using a custom view project instead
+ // of the one that would be setup
+ // using the layer's camera in conjunction with the layer's position,scale.
+ virtual void RunLayerRender(SLayer &inLayer, const QT3DSMat44 &inViewProjection) = 0;
+
+ // This allocator is cleared every frame on BeginFrame. Objects constructed using this
+ // allocator
+ // Must not need their destructors called. Objects are allocate on 4 byte boundaries using
+ // this allocator
+ // regardless
+ virtual NVAllocatorCallback &GetPerFrameAllocator() = 0;
+
+ // Render the layer's rect onscreen. Will only render one frame, you need to call this
+ // every frame
+ // for this to work and be persistent.
+ virtual void RenderLayerRect(SLayer &inLayer, const QT3DSVec3 &inColor) = 0;
+ // Render widgets are things that are draw on the layer's widget texture which is then
+ // rendered to the
+ // scene's widget texture. You must add them every frame you wish them to be rendered; the
+ // list of
+ // widgets is cleared every frame.
+ virtual void AddRenderWidget(IRenderWidget &inWidget) = 0;
+
+ // Get a scale factor so you can have objects precisely 50 pixels. Note that this scale
+ // factor
+ // only applies to things drawn parallel to the camera plane; If you aren't parallel then
+ // there isn't
+ // a single scale factor that will work.
+ // For perspective-rendered objects, we shift the object forward or backwards along the
+ // vector from the camera
+ // to the object so that we are working in a consistent mathematical space. So if the
+ // camera is orthographic,
+ // you are done.
+ // If the camera is perspective, then this method will tell you want you need to scale
+ // things by to account for
+ // the FOV and also where the origin of the object needs to be to ensure the scale factor is
+ // relevant.
+ virtual SScaleAndPosition GetWorldToPixelScaleFactor(SLayer &inLayer,
+ const QT3DSVec3 &inWorldPoint) = 0;
+ // Called before a layer goes completely out of scope to release any rendering resources
+ // related to the layer.
+ virtual void ReleaseLayerRenderResources(SLayer &inLayer, const SRenderInstanceId id) = 0;
+
+ // render a screen aligned 2D text
+ virtual void RenderText2D(QT3DSF32 x, QT3DSF32 y, qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor,
+ const char *text) = 0;
+ // render Gpu profiler values
+ virtual void RenderGpuProfilerStats(QT3DSF32 x, QT3DSF32 y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor) = 0;
+
+ // Get the mouse coordinates as they relate to a given layer
+ virtual Option<QT3DSVec2> GetLayerMouseCoords(SLayer &inLayer, const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool forceImageIntersect = false) const = 0;
+
+ virtual IRenderWidgetContext &GetRenderWidgetContext() = 0;
+
+ static bool IsGlEsContext(qt3ds::render::NVRenderContextType inContextType);
+ static bool IsGlEs3Context(qt3ds::render::NVRenderContextType inContextType);
+ static bool IsGl2Context(qt3ds::render::NVRenderContextType inContextType);
+ static const char *GetGlslVesionString(qt3ds::render::NVRenderContextType inContextType);
+
+ static IQt3DSRenderer &CreateRenderer(IQt3DSRenderContext &inContext);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/Qt3DSRendererUtil.cpp b/src/runtimerender/Qt3DSRendererUtil.cpp
new file mode 100644
index 0000000..7bc108e
--- /dev/null
+++ b/src/runtimerender/Qt3DSRendererUtil.cpp
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRendererUtil.h"
+#include "Qt3DSRenderResourceBufferObjects.h"
+#include "Qt3DSRenderResourceTexture2D.h"
+
+using namespace qt3ds::render;
+
+void CRendererUtil::ResolveMutisampleFBOColorOnly(IResourceManager &inManager,
+ CResourceTexture2D &ioResult,
+ NVRenderContext &inRenderContext, QT3DSU32 inWidth,
+ QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inColorFormat,
+ NVRenderFrameBuffer &inSourceFBO)
+{
+ // create resolve FBO
+ CResourceFrameBuffer theResolveFB(inManager);
+ // Allocates the frame buffer which has the side effect of setting the current render target to
+ // that frame buffer.
+ theResolveFB.EnsureFrameBuffer();
+ // set copy flags
+ qt3ds::render::NVRenderClearFlags copyFlags(NVRenderClearValues::Color);
+
+ // get / create resolve targets and attach
+ ioResult.EnsureTexture(inWidth, inHeight, inColorFormat);
+ theResolveFB->Attach(NVRenderFrameBufferAttachments::Color0, *ioResult);
+ // CN - I don't believe we have to resolve the depth.
+ // The reason is we render the depth texture specially unresolved. So there is no need to
+ // resolve
+ // the depth prepass texture to anything else.
+
+ // 1. Make resolve buffer be the render target ( already happend )
+ // 2. Make the current layer FBO the current read target
+ // 3. Do the blit from MSAA to non MSAA
+
+ // 2.
+ inRenderContext.SetReadTarget(&inSourceFBO);
+ inRenderContext.SetReadBuffer(NVReadFaces::Color0);
+ // 3.
+ inRenderContext.BlitFramebuffer(0, 0, inWidth, inHeight, 0, 0, inWidth, inHeight, copyFlags,
+ NVRenderTextureMagnifyingOp::Nearest);
+}
+
+void CRendererUtil::ResolveSSAAFBOColorOnly(IResourceManager &inManager,
+ CResourceTexture2D &ioResult, QT3DSU32 outWidth,
+ QT3DSU32 outHeight, NVRenderContext &inRenderContext,
+ QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inColorFormat,
+ NVRenderFrameBuffer &inSourceFBO)
+{
+ // create resolve FBO
+ CResourceFrameBuffer theResolveFB(inManager);
+ // Allocates the frame buffer which has the side effect of setting the current render target to
+ // that frame buffer.
+ theResolveFB.EnsureFrameBuffer();
+ // set copy flags
+ qt3ds::render::NVRenderClearFlags copyFlags(NVRenderClearValues::Color);
+
+ // get / create resolve targets and attach
+ ioResult.EnsureTexture(outWidth, outHeight, inColorFormat);
+ theResolveFB->Attach(NVRenderFrameBufferAttachments::Color0, *ioResult);
+ // CN - I don't believe we have to resolve the depth.
+ // The reason is we render the depth texture specially unresolved. So there is no need to
+ // resolve
+ // the depth prepass texture to anything else.
+
+ // 1. Make resolve buffer be the render target ( already happend )
+ // 2. Make the current layer FBO the current read target
+ // 3. Do the blit from High res to low res buffer
+
+ // 2.
+ inRenderContext.SetReadTarget(&inSourceFBO);
+ inRenderContext.SetReadBuffer(NVReadFaces::Color0);
+ // 3.
+ inRenderContext.BlitFramebuffer(0, 0, inWidth, inHeight, 0, 0, outWidth, outHeight, copyFlags,
+ NVRenderTextureMagnifyingOp::Linear);
+}
+
+void CRendererUtil::GetSSAARenderSize(QT3DSU32 inWidth, QT3DSU32 inHeight, QT3DSU32 &outWidth,
+ QT3DSU32 &outHeight)
+{
+ // we currently double width and height
+ outWidth = inWidth * 2;
+ outHeight = inHeight * 2;
+
+ // keep aspect ration?
+ // clamp to max
+ if (outWidth > MAX_SSAA_DIM)
+ outWidth = MAX_SSAA_DIM;
+ if (outHeight > MAX_SSAA_DIM)
+ outHeight = MAX_SSAA_DIM;
+}
diff --git a/src/runtimerender/Qt3DSRendererUtil.h b/src/runtimerender/Qt3DSRendererUtil.h
new file mode 100644
index 0000000..96f3642
--- /dev/null
+++ b/src/runtimerender/Qt3DSRendererUtil.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDERER_UTIL_H
+#define QT3DS_RENDERER_UTIL_H
+#include "Qt3DSRender.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+namespace qt3ds {
+namespace render {
+ class CRendererUtil
+ {
+ static const QT3DSU32 MAX_SSAA_DIM = 8192; // max render traget size for SSAA mode
+
+ public:
+ static void ResolveMutisampleFBOColorOnly(IResourceManager &inManager,
+ CResourceTexture2D &ioResult,
+ NVRenderContext &inRenderContext, QT3DSU32 inWidth,
+ QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inColorFormat,
+ NVRenderFrameBuffer &inSourceFBO);
+
+ static void ResolveSSAAFBOColorOnly(IResourceManager &inManager,
+ CResourceTexture2D &ioResult, QT3DSU32 outWidth,
+ QT3DSU32 outHeight, NVRenderContext &inRenderContext,
+ QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inColorFormat,
+ NVRenderFrameBuffer &inSourceFBO);
+
+ static void GetSSAARenderSize(QT3DSU32 inWidth, QT3DSU32 inHeight, QT3DSU32 &outWidth,
+ QT3DSU32 &outHeight);
+ };
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/runtimerender/Qt3DSTextRenderer.cpp b/src/runtimerender/Qt3DSTextRenderer.cpp
new file mode 100644
index 0000000..91a5eb7
--- /dev/null
+++ b/src/runtimerender/Qt3DSTextRenderer.cpp
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSTextRenderer.h"
+#include "render/Qt3DSRenderTexture2D.h"
+
+using namespace qt3ds::render;
+
+// http://acius2.blogspot.com/2007/11/calculating-next-power-of-2.html
+QT3DSU32 ITextRenderer::NextPowerOf2(QT3DSU32 input)
+{
+ // Algorithm doesn't work for 0 or QT3DS_MAX_U32
+ QT3DS_ASSERT(input > 0 && input < QT3DS_MAX_U32);
+ input--;
+ input = (input >> 1) | input;
+ input = (input >> 2) | input;
+ input = (input >> 4) | input;
+ input = (input >> 8) | input;
+ input = (input >> 16) | input;
+ input++; // input is now the next highest power of 2.
+ return input;
+}
+
+QT3DSU32 ITextRenderer::NextMultipleOf4(QT3DSU32 inValue)
+{
+ QT3DSU32 remainder(inValue % 4);
+ if (remainder != 0)
+ inValue = inValue + (4 - remainder);
+
+ return inValue;
+}
+
+STextTextureDetails ITextRenderer::UploadData(NVDataRef<QT3DSU8> inTextureData,
+ NVRenderTexture2D &inTexture, QT3DSU32 inDataWidth,
+ QT3DSU32 inDataHeight, QT3DSU32 inTextWidth,
+ QT3DSU32 inTextHeight,
+ NVRenderTextureFormats::Enum inFormat,
+ bool inFlipYAxis)
+{
+ if (inTextWidth == 0 || inTextHeight == 0) {
+ QT3DSU32 black[] = { 0, 0, 0, 0 };
+ inTexture.SetTextureData(toU8DataRef(black, 4), 0, 2, 2, NVRenderTextureFormats::RGBA8);
+ return STextTextureDetails(2, 2, false, QT3DSVec2(1.0));
+ }
+ QT3DS_ASSERT(NextMultipleOf4(inDataWidth) == inDataWidth);
+ QT3DSU32 theNecessaryHeight = NextMultipleOf4(inTextHeight);
+ QT3DSU32 dataStride = inDataWidth * NVRenderTextureFormats::getSizeofFormat(inFormat);
+ if (inTextureData.size() < dataStride * inDataHeight) {
+ QT3DS_ASSERT(false);
+ return STextTextureDetails();
+ }
+
+ STextureDetails theTextureDetails = inTexture.GetTextureDetails();
+ QT3DSU32 theUploadSize = theNecessaryHeight * dataStride;
+
+ NVDataRef<QT3DSU8> theUploadData = NVDataRef<QT3DSU8>(inTextureData.begin(), theUploadSize);
+ inTexture.SetTextureData(theUploadData, 0, inDataWidth, theNecessaryHeight, inFormat);
+ inTexture.SetMagFilter(qt3ds::render::NVRenderTextureMagnifyingOp::Linear);
+ inTexture.SetMinFilter(qt3ds::render::NVRenderTextureMinifyingOp::Linear);
+ return STextTextureDetails(inTextWidth, inTextHeight, inFlipYAxis, QT3DSVec2(1.0f, 1.0f));
+}
diff --git a/src/runtimerender/Qt3DSTextRenderer.h b/src/runtimerender/Qt3DSTextRenderer.h
new file mode 100644
index 0000000..11c9ec6
--- /dev/null
+++ b/src/runtimerender/Qt3DSTextRenderer.h
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_TEXT_RENDERER_H
+#define QT3DS_TEXT_RENDERER_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderTextTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SRendererFontEntry
+ {
+ QString m_FontName;
+ QString m_FontFile;
+ SRendererFontEntry() {}
+ SRendererFontEntry(QString name, QString file)
+ : m_FontName(name)
+ , m_FontFile(file)
+ {
+ }
+ };
+
+ class ITextRendererCore : public NVRefCounted
+ {
+ public:
+ // You can have several standard font directories and these will be persistent
+ virtual void AddSystemFontDirectory(const char8_t *inDirectory) = 0;
+ // Should be called to clear the current context.
+ virtual void AddProjectFontDirectory(const char8_t *inProjectDirectory) = 0;
+ virtual void ClearProjectFontDirectories() = 0;
+ // Force font loading *right now*
+ virtual void PreloadFonts() = 0;
+ // Do not access object in between begin/end preload pairs.
+ virtual void BeginPreloadFonts(IThreadPool &inThreadPool, IPerfTimer &inTimer) = 0;
+ virtual void EndPreloadFonts() = 0;
+ // Force a clear and reload of all of the fonts.
+ virtual void ReloadFonts() = 0;
+ // Get the list of project fonts. These are the only fonts that can be displayed.
+ virtual NVConstDataRef<SRendererFontEntry> GetProjectFontList() = 0;
+ // The name stored in the ttf file isn't the actual name we use; we use the file stems.
+ // But we used to use the name. So this provides a sort of first-come-first-serve remapping
+ // from ttf-name to file-stem.
+ virtual Option<CRegisteredString> GetFontNameForFont(CRegisteredString inFontname) = 0;
+ virtual Option<CRegisteredString> GetFontNameForFont(const char8_t *inFontname) = 0;
+
+ virtual ITextRenderer &GetTextRenderer(NVRenderContext &inContext) = 0;
+
+ static ITextRendererCore &CreateQtTextRenderer(NVFoundationBase &inFoundation,
+ IStringTable &inStrTable);
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ static ITextRendererCore &createDistanceFieldRenderer(NVFoundationBase &inFnd);
+#endif
+
+ // call this to create onscreen text renderer
+ // it needs true type fonts
+ static ITextRendererCore &CreateOnscreenTextRenderer(NVFoundationBase &inFoundation);
+ };
+ /**
+ * Opaque text rendering system. Must be able to render text to an opengl texture object.
+ */
+ class ITextRenderer : public ITextRendererCore
+ {
+ protected:
+ virtual ~ITextRenderer() {}
+
+ public:
+ // Measure text will inText if it isn't null or the text on the info if inText is null
+ virtual STextDimensions MeasureText(const STextRenderInfo &inText, QT3DSF32 inTextScaleFactor,
+ const char8_t *inTextOverride = NULL) = 0;
+ // The system will use the 'r' channel as an alpha mask in order to render the
+ // text. You can assume GetTextDimensions was called *just* prior to this.
+ // It is a good idea to ensure the texture is a power of two as not all rendering systems
+ // support nonpot textures. Our text rendering algorithms will render a sub-rect of the
+ // image
+ // assuming it is located toward the upper-left of the image and we are also capable of
+ // flipping
+ // the image.
+ virtual STextTextureDetails RenderText(const STextRenderInfo &inText,
+ NVRenderTexture2D &inTexture) = 0;
+ // this is for rendering text with NV path rendering
+ virtual STextTextureDetails
+ RenderText(const STextRenderInfo &inText, NVRenderPathFontItem &inPathFontItem,
+ NVRenderPathFontSpecification &inPathFontSpecicification) = 0;
+ // this is for rednering text using a texture atlas
+ virtual SRenderTextureAtlasDetails RenderText(const STextRenderInfo &inText) = 0;
+
+ virtual void BeginFrame() = 0;
+ virtual void EndFrame() = 0;
+
+ // these two function are for texture atlas usage only
+ // returns the atlas entries count
+ virtual QT3DSI32 CreateTextureAtlas() = 0;
+ virtual STextTextureAtlasEntryDetails RenderAtlasEntry(QT3DSU32 index,
+ NVRenderTexture2D &inTexture) = 0;
+
+ // Helper function to upload the texture data to the texture
+ // Will resize texture as necessary and upload using texSubImage for
+ // quickest upload times
+ // This function expects that the dataWidth to be divisible by four and
+ // that the total data height is larger then inTextHeight *and* divisible by four.
+ // and that textWidth and textHeight are less than or equal to dataWidth,dataHeight
+ //,can be zero, and don't need to be divisible by four (or 2).
+ static STextTextureDetails
+ UploadData(NVDataRef<QT3DSU8> inTextureData, NVRenderTexture2D &inTexture, QT3DSU32 inDataWidth,
+ QT3DSU32 inDataHeight, QT3DSU32 inTextWidth, QT3DSU32 inTextHeight,
+ NVRenderTextureFormats::Enum inFormat, bool inFlipYAxis);
+
+ // Helper function to return the next power of two.
+ // Fails for values of 0 or QT3DS_MAX_U32
+ static QT3DSU32 NextPowerOf2(QT3DSU32 inValue);
+ // If inValue is divisible by four, then return inValue
+ // else next largest number that is divisible by four.
+ static QT3DSU32 NextMultipleOf4(QT3DSU32 inValue);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/android/DynamicLibLoader.h b/src/runtimerender/android/DynamicLibLoader.h
new file mode 100644
index 0000000..c968419
--- /dev/null
+++ b/src/runtimerender/android/DynamicLibLoader.h
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "linux/DynamicLibLoader.h"
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp b/src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp
new file mode 100644
index 0000000..b9f9c20
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderCamera.cpp
@@ -0,0 +1,496 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderPresentation.h"
+#include "foundation/Qt3DSVec2.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSTextRenderer.h"
+
+#include <qmath.h>
+
+using namespace qt3ds::render;
+
+namespace {
+
+QT3DSF32 GetAspectRatio(const NVRenderRectF &inViewport)
+{
+ return inViewport.m_Height != 0 ? inViewport.m_Width / inViewport.m_Height : 0.0f;
+}
+
+QT3DSF32 GetAspectRatio(const QT3DSVec2 &inDimensions)
+{
+ return inDimensions.y != 0 ? inDimensions.x / inDimensions.y : 0.0f;
+}
+
+bool IsCameraVerticalAdjust(CameraScaleModes::Enum inMode, QT3DSF32 inDesignAspect,
+ QT3DSF32 inActualAspect)
+{
+ return (inMode == CameraScaleModes::Fit && inActualAspect >= inDesignAspect)
+ || inMode == CameraScaleModes::FitVertical;
+}
+
+bool IsCameraHorizontalAdjust(CameraScaleModes::Enum inMode, QT3DSF32 inDesignAspect,
+ QT3DSF32 inActualAspect)
+{
+ return (inMode == CameraScaleModes::Fit && inActualAspect < inDesignAspect)
+ || inMode == CameraScaleModes::FitHorizontal;
+}
+
+bool IsFitTypeScaleMode(CameraScaleModes::Enum inMode)
+{
+ return inMode == CameraScaleModes::Fit || inMode == CameraScaleModes::FitHorizontal
+ || inMode == CameraScaleModes::FitVertical;
+}
+
+struct SPinCameraResult
+{
+ NVRenderRectF m_Viewport;
+ NVRenderRectF m_VirtualViewport;
+ SPinCameraResult(NVRenderRectF v, NVRenderRectF vv)
+ : m_Viewport(v)
+ , m_VirtualViewport(vv)
+ {
+ }
+};
+// Scale and transform the projection matrix to respect the camera anchor attribute
+// and the scale mode.
+SPinCameraResult PinCamera(const NVRenderRectF &inViewport, QT3DSVec2 inDesignDims,
+ QT3DSMat44 &ioPerspectiveMatrix, CameraScaleModes::Enum inScaleMode,
+ CameraScaleAnchors::Enum inPinLocation)
+{
+ NVRenderRectF viewport(inViewport);
+ NVRenderRectF idealViewport(inViewport.m_X, inViewport.m_Y, inDesignDims.x, inDesignDims.y);
+ QT3DSF32 designAspect = GetAspectRatio(inDesignDims);
+ QT3DSF32 actualAspect = GetAspectRatio(inViewport);
+ if (IsFitTypeScaleMode(inScaleMode)) {
+ idealViewport.m_Width = viewport.m_Width;
+ idealViewport.m_Height = viewport.m_Height;
+ }
+ // We move the viewport such that the left, top of the presentation sits against the left top
+ // edge
+ // We only need to translate in X *if* our actual aspect > design aspect
+ // And then we only need to account for whatever centering would happen.
+
+ bool pinLeft = inPinLocation == CameraScaleAnchors::SouthWest
+ || inPinLocation == CameraScaleAnchors::West
+ || inPinLocation == CameraScaleAnchors::NorthWest;
+ bool pinRight = inPinLocation == CameraScaleAnchors::SouthEast
+ || inPinLocation == CameraScaleAnchors::East
+ || inPinLocation == CameraScaleAnchors::NorthEast;
+ bool pinTop = inPinLocation == CameraScaleAnchors::NorthWest
+ || inPinLocation == CameraScaleAnchors::North
+ || inPinLocation == CameraScaleAnchors::NorthEast;
+ bool pinBottom = inPinLocation == CameraScaleAnchors::SouthWest
+ || inPinLocation == CameraScaleAnchors::South
+ || inPinLocation == CameraScaleAnchors::SouthEast;
+
+ if (inScaleMode == CameraScaleModes::SameSize) {
+ // In this case the perspective transform does not center the view,
+ // it places it in the lower-left of the viewport.
+ QT3DSF32 idealWidth = inDesignDims.x;
+ QT3DSF32 idealHeight = inDesignDims.y;
+ if (pinRight)
+ idealViewport.m_X -= ((idealWidth - inViewport.m_Width));
+ else if (!pinLeft)
+ idealViewport.m_X -= ((idealWidth - inViewport.m_Width) / 2.0f);
+
+ if (pinTop)
+ idealViewport.m_Y -= ((idealHeight - inViewport.m_Height));
+ else if (!pinBottom)
+ idealViewport.m_Y -= ((idealHeight - inViewport.m_Height) / 2.0f);
+ } else {
+ // In this case our perspective matrix will center the view and we need to decenter
+ // it as necessary
+ // if we are wider than we are high
+ if (IsCameraVerticalAdjust(inScaleMode, designAspect, actualAspect)) {
+ if (pinLeft || pinRight) {
+ QT3DSF32 idealWidth = inViewport.m_Height * designAspect;
+ QT3DSI32 halfOffset = (QT3DSI32)((idealWidth - inViewport.m_Width) / 2.0f);
+ halfOffset = pinLeft ? halfOffset : -1 * halfOffset;
+ idealViewport.m_X += halfOffset;
+ }
+ } else {
+ if (pinTop || pinBottom) {
+ QT3DSF32 idealHeight = inViewport.m_Width / designAspect;
+ QT3DSI32 halfOffset = (QT3DSI32)((idealHeight - inViewport.m_Height) / 2.0f);
+ halfOffset = pinBottom ? halfOffset : -1 * halfOffset;
+ idealViewport.m_Y += halfOffset;
+ }
+ }
+ }
+
+ ioPerspectiveMatrix = NVRenderContext::ApplyVirtualViewportToProjectionMatrix(
+ ioPerspectiveMatrix, viewport, idealViewport);
+ return SPinCameraResult(viewport, idealViewport);
+}
+}
+
+SCamera::SCamera()
+ : SNode(GraphObjectTypes::Camera)
+ , m_ClipNear(10)
+ , m_ClipFar(10000)
+ , m_FOV(60)
+ , m_FOVHorizontal(false)
+ , m_ScaleMode(CameraScaleModes::Fit)
+ , m_ScaleAnchor(CameraScaleAnchors::Center)
+{
+ TORAD(m_FOV);
+ m_Projection = QT3DSMat44::createIdentity();
+ m_Position = QT3DSVec3(0, 0, -600);
+}
+
+// Code for testing
+SCameraGlobalCalculationResult SCamera::CalculateGlobalVariables(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions)
+{
+ bool wasDirty = SNode::CalculateGlobalVariables();
+ return SCameraGlobalCalculationResult(wasDirty,
+ CalculateProjection(inViewport, inDesignDimensions));
+}
+
+bool SCamera::CalculateProjection(const NVRenderRectF &inViewport, const QT3DSVec2 &inDesignDimensions)
+{
+ bool retval = false;
+ if (m_Flags.IsOrthographic())
+ retval = ComputeFrustumOrtho(inViewport, inDesignDimensions);
+ else
+ retval = ComputeFrustumPerspective(inViewport, inDesignDimensions);
+ if (retval) {
+ QT3DSF32 *writePtr(m_Projection.front());
+ m_FrustumScale.x = writePtr[0];
+ m_FrustumScale.y = writePtr[5];
+ PinCamera(inViewport, inDesignDimensions, m_Projection, m_ScaleMode, m_ScaleAnchor);
+ }
+ return retval;
+}
+
+//==============================================================================
+/**
+ * Compute the projection matrix for a perspective camera
+ * @return true if the computed projection matrix is valid
+ */
+bool SCamera::ComputeFrustumPerspective(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions)
+{
+ m_Projection = QT3DSMat44::createIdentity();
+ QT3DSF32 theAngleInRadians = verticalFov(inViewport) / 2.0f;
+ QT3DSF32 theDeltaZ = m_ClipFar - m_ClipNear;
+ QT3DSF32 theSine = sinf(theAngleInRadians);
+ QT3DSF32 designAspect = GetAspectRatio(inDesignDimensions);
+ QT3DSF32 theAspectRatio = designAspect;
+ if (IsFitTypeScaleMode(m_ScaleMode))
+ theAspectRatio = GetAspectRatio(inViewport);
+
+ if ((theDeltaZ != 0) && (theSine != 0) && (theAspectRatio != 0)) {
+ QT3DSF32 *writePtr(m_Projection.front());
+ writePtr[10] = -(m_ClipFar + m_ClipNear) / theDeltaZ;
+ writePtr[11] = -1;
+ writePtr[14] = -2 * m_ClipNear * m_ClipFar / theDeltaZ;
+ writePtr[15] = 0;
+
+ if (IsCameraVerticalAdjust(m_ScaleMode, designAspect, theAspectRatio)) {
+ QT3DSF32 theCotangent = cosf(theAngleInRadians) / theSine;
+ writePtr[0] = theCotangent / theAspectRatio;
+ writePtr[5] = theCotangent;
+ } else {
+ QT3DSF32 theCotangent = cosf(theAngleInRadians) / theSine;
+ writePtr[0] = theCotangent / designAspect;
+ writePtr[5] = theCotangent * (theAspectRatio / designAspect);
+ }
+ return true;
+ } else {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+}
+
+//==============================================================================
+/**
+ * Compute the projection matrix for a orthographic camera
+ * @return true if the computed projection matrix is valid
+ */
+bool SCamera::ComputeFrustumOrtho(const NVRenderRectF &inViewport, const QT3DSVec2 &inDesignDimensions)
+{
+ m_Projection = QT3DSMat44::createIdentity();
+
+ QT3DSF32 theDeltaZ = m_ClipFar - m_ClipNear;
+ QT3DSF32 halfWidth = inDesignDimensions.x / 2.0f;
+ QT3DSF32 halfHeight = inDesignDimensions.y / 2.0f;
+ QT3DSF32 designAspect = GetAspectRatio(inDesignDimensions);
+ QT3DSF32 theAspectRatio = designAspect;
+ if (IsFitTypeScaleMode(m_ScaleMode))
+ theAspectRatio = GetAspectRatio(inViewport);
+ if (theDeltaZ != 0) {
+ QT3DSF32 *writePtr(m_Projection.front());
+ writePtr[10] = -2.0f / theDeltaZ;
+ writePtr[11] = 0.0f;
+ writePtr[14] = -(m_ClipNear + m_ClipFar) / theDeltaZ;
+ writePtr[15] = 1.0f;
+ if (IsCameraVerticalAdjust(m_ScaleMode, designAspect, theAspectRatio)) {
+ writePtr[0] = 1.0f / (halfHeight * theAspectRatio);
+ writePtr[5] = 1.0f / halfHeight;
+ } else {
+ writePtr[0] = 1.0f / halfWidth;
+ writePtr[5] = 1.0f / (halfWidth / theAspectRatio);
+ }
+ return true;
+ } else {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+}
+
+QT3DSF32 SCamera::GetOrthographicScaleFactor(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions) const
+{
+ if (m_ScaleMode == CameraScaleModes::SameSize)
+ return 1.0f;
+ QT3DSMat44 temp(QT3DSMat44::createIdentity());
+ QT3DSF32 designAspect = GetAspectRatio(inDesignDimensions);
+ QT3DSF32 theAspectRatio = GetAspectRatio(inViewport);
+ if (m_ScaleMode == CameraScaleModes::Fit) {
+ if (theAspectRatio >= designAspect) {
+ return inViewport.m_Width < inDesignDimensions.x ? theAspectRatio / designAspect : 1.0f;
+
+ } else {
+ return inViewport.m_Height < inDesignDimensions.y ? designAspect / theAspectRatio
+ : 1.0f;
+ }
+ } else if (m_ScaleMode == CameraScaleModes::FitVertical) {
+ return (QT3DSF32)inDesignDimensions.y / (QT3DSF32)inViewport.m_Height;
+ } else {
+ return (QT3DSF32)inDesignDimensions.x / (QT3DSF32)inViewport.m_Width;
+ }
+}
+
+QT3DSF32 SCamera::GetTextScaleFactor(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions) const
+{
+ return NVMax(1.0f, 1.0f / GetOrthographicScaleFactor(inViewport, inDesignDimensions));
+}
+
+QT3DSMat33 SCamera::GetLookAtMatrix(const QT3DSVec3 &inUpDir, const QT3DSVec3 &inDirection) const
+{
+ QT3DSVec3 theDirection(inDirection);
+
+ theDirection.normalize();
+
+ const QT3DSVec3 &theUpDir(inUpDir);
+
+ // gram-shmidt orthogonalization
+ QT3DSVec3 theCrossDir(theDirection.cross(theUpDir));
+ theCrossDir.normalize();
+ QT3DSVec3 theFinalDir(theCrossDir.cross(theDirection));
+ theFinalDir.normalize();
+ QT3DSF32 multiplier = 1.0f;
+ if (m_Flags.IsLeftHanded())
+ multiplier = -1.0f;
+
+ QT3DSMat33 theResultMatrix(theCrossDir, theFinalDir, multiplier * theDirection);
+ return theResultMatrix;
+}
+
+void SCamera::LookAt(const QT3DSVec3 &inCameraPos, const QT3DSVec3 &inUpDir, const QT3DSVec3 &inTargetPos)
+{
+ QT3DSVec3 theDirection = inTargetPos - inCameraPos;
+ if (m_Flags.IsLeftHanded())
+ theDirection.z *= -1.0f;
+ m_Rotation = GetRotationVectorFromRotationMatrix(GetLookAtMatrix(inUpDir, theDirection));
+ m_Position = inCameraPos;
+ MarkDirty(qt3ds::render::NodeTransformDirtyFlag::TransformIsDirty);
+}
+
+void SCamera::CalculateViewProjectionMatrix(QT3DSMat44 &outMatrix) const
+{
+ QT3DSMat44 globalInverse = m_GlobalTransform.getInverse();
+ outMatrix = m_Projection * globalInverse;
+}
+
+SCuboidRect SCamera::GetCameraBounds(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions) const
+{
+ QT3DSMat44 unused(QT3DSMat44::createIdentity());
+ SPinCameraResult theResult =
+ PinCamera(inViewport, inDesignDimensions, unused, m_ScaleMode, m_ScaleAnchor);
+ // find the normalized edges of the view frustum given the renormalization that happens when
+ // pinning the camera.
+ SCuboidRect normalizedCuboid(-1, 1, 1, -1);
+ QT3DSVec2 translation(theResult.m_Viewport.m_X - theResult.m_VirtualViewport.m_X,
+ theResult.m_Viewport.m_Y - theResult.m_VirtualViewport.m_Y);
+ if (m_ScaleMode == CameraScaleModes::SameSize) {
+ // the cuboid ranges are the actual divided by the ideal in this case
+ QT3DSF32 xRange = 2.0f * (theResult.m_Viewport.m_Width / theResult.m_VirtualViewport.m_Width);
+ QT3DSF32 yRange =
+ 2.0f * (theResult.m_Viewport.m_Height / theResult.m_VirtualViewport.m_Height);
+ normalizedCuboid = SCuboidRect(-1, -1 + yRange, -1 + xRange, -1);
+ translation.x /= (theResult.m_VirtualViewport.m_Width / 2.0f);
+ translation.y /= (theResult.m_VirtualViewport.m_Height / 2.0f);
+ normalizedCuboid.Translate(translation);
+ }
+ // fit. This means that two parameters of the normalized cuboid will be -1, 1.
+ else {
+ // In this case our perspective matrix will center the view and we need to decenter
+ // it as necessary
+ QT3DSF32 actualAspect = GetAspectRatio(inViewport);
+ QT3DSF32 designAspect = GetAspectRatio(inDesignDimensions);
+ // if we are wider than we are high
+ QT3DSF32 idealWidth = inViewport.m_Width;
+ QT3DSF32 idealHeight = inViewport.m_Height;
+
+ if (IsCameraVerticalAdjust(m_ScaleMode, designAspect, actualAspect)) {
+ // then we just need to setup the left, right parameters of the cuboid because we know
+ // the top
+ // bottom are -1,1 due to how fit works.
+ idealWidth = (QT3DSF32)ITextRenderer::NextMultipleOf4(
+ (QT3DSU32)(inViewport.m_Height * designAspect + .5f));
+ // halfRange should always be greater than 1.0f.
+ QT3DSF32 halfRange = inViewport.m_Width / idealWidth;
+ normalizedCuboid.m_Left = -halfRange;
+ normalizedCuboid.m_Right = halfRange;
+ translation.x = translation.x / (idealWidth / 2.0f);
+ } else {
+ idealHeight = (QT3DSF32)ITextRenderer::NextMultipleOf4(
+ (QT3DSU32)(inViewport.m_Width / designAspect + .5f));
+ QT3DSF32 halfRange = inViewport.m_Height / idealHeight;
+ normalizedCuboid.m_Bottom = -halfRange;
+ normalizedCuboid.m_Top = halfRange;
+ translation.y = translation.y / (idealHeight / 2.0f);
+ }
+ normalizedCuboid.Translate(translation);
+ }
+ // Given no adjustment in the virtual rect, then this is what we would have.
+
+ return normalizedCuboid;
+}
+
+void SCamera::SetupOrthographicCameraForOffscreenRender(NVRenderTexture2D &inTexture,
+ QT3DSMat44 &outVP)
+{
+ STextureDetails theDetails(inTexture.GetTextureDetails());
+ SCamera theTempCamera;
+ SetupOrthographicCameraForOffscreenRender(inTexture, outVP, theTempCamera);
+}
+
+void SCamera::SetupOrthographicCameraForOffscreenRender(NVRenderTexture2D &inTexture,
+ QT3DSMat44 &outVP, SCamera &outCamera)
+{
+ STextureDetails theDetails(inTexture.GetTextureDetails());
+ SCamera theTempCamera;
+ theTempCamera.m_Flags.SetOrthographic(true);
+ theTempCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ QT3DSVec2 theDimensions((QT3DSF32)theDetails.m_Width, (QT3DSF32)theDetails.m_Height);
+ theTempCamera.CalculateGlobalVariables(
+ NVRenderRect(0, 0, theDetails.m_Width, theDetails.m_Height), theDimensions);
+ theTempCamera.CalculateViewProjectionMatrix(outVP);
+ outCamera = theTempCamera;
+}
+
+SRay SCamera::Unproject(const QT3DSVec2 &inViewportRelativeCoords, const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions, bool sceneCameraView) const
+{
+ SRay theRay;
+ QT3DSMat44 tempVal(QT3DSMat44::createIdentity());
+ SPinCameraResult result =
+ PinCamera(inViewport, inDesignDimensions, tempVal, m_ScaleMode, m_ScaleAnchor);
+ QT3DSVec2 globalCoords = inViewport.ToAbsoluteCoords(inViewportRelativeCoords);
+ QT3DSVec2 normalizedCoords =
+ result.m_VirtualViewport.AbsoluteToNormalizedCoordinates(globalCoords);
+ QT3DSVec3 &outOrigin(theRay.m_Origin);
+ QT3DSVec3 &outDir(theRay.m_Direction);
+ QT3DSVec2 inverseFrustumScale(1.0f / m_FrustumScale.x, 1.0f / m_FrustumScale.y);
+ QT3DSVec2 scaledCoords(inverseFrustumScale.x * normalizedCoords.x,
+ inverseFrustumScale.y * normalizedCoords.y);
+
+ if (m_Flags.IsOrthographic()) {
+ outOrigin.x = scaledCoords.x;
+ outOrigin.y = scaledCoords.y;
+ outOrigin.z = 0.0f;
+
+ outDir.x = 0.0f;
+ outDir.y = 0.0f;
+ outDir.z = -1.0f;
+ } else {
+ outOrigin.x = 0.0f;
+ outOrigin.y = 0.0f;
+ outOrigin.z = 0.0f;
+
+ outDir.x = scaledCoords.x;
+ outDir.y = scaledCoords.y;
+ outDir.z = -1.0f;
+ }
+
+ outOrigin = m_GlobalTransform.transform(outOrigin);
+
+ // CalculateNormalMatrix(), but 4x4 matrix to have scale() method
+ QT3DSMat44 theNormalMatrix = m_GlobalTransform.getInverse().getTranspose();
+ if (sceneCameraView) {
+ // When in scene camera view mode, camera scale needs to be inverted.
+ // See QT3DS-3393.
+ const float scaleX = m_GlobalTransform[0][0] / theNormalMatrix[0][0];
+ const float scaleY = m_GlobalTransform[1][1] / theNormalMatrix[1][1];
+ const float scaleZ = m_GlobalTransform[2][2] / theNormalMatrix[2][2];
+ QT3DSVec4 scaleVector(scaleX, scaleY, scaleZ, 1.0);
+ theNormalMatrix.scale(scaleVector);
+ }
+
+ outDir = theNormalMatrix.transform(outDir);
+ outDir.normalize();
+ /*
+ char printBuf[2000];
+ sprintf_s( printBuf, "normCoords %f %f outDir %f %f %f\n"
+ , normalizedCoords.x, normalizedCoords.y, outDir.x, outDir.y, outDir.z );
+ OutputDebugStringA( printBuf );
+ */
+
+ return theRay;
+}
+
+QT3DSVec3 SCamera::UnprojectToPosition(const QT3DSVec3 &inGlobalPos, const SRay &inRay) const
+{
+ QT3DSVec3 theCameraDir = GetDirection();
+ QT3DSVec3 theObjGlobalPos = inGlobalPos;
+ QT3DSF32 theDistance = -1.0f * theObjGlobalPos.dot(theCameraDir);
+ NVPlane theCameraPlane(theCameraDir, theDistance);
+ return inRay.Intersect(theCameraPlane);
+}
+
+QT3DSF32 SCamera::verticalFov(QT3DSF32 aspectRatio) const
+{
+ if (m_FOVHorizontal)
+ return 2.0f * qAtan(qTan(qreal(m_FOV) / 2.0) / qreal(aspectRatio));
+ else
+ return m_FOV;
+}
+
+QT3DSF32 SCamera::verticalFov(const NVRenderRectF &inViewport) const
+{
+ return verticalFov(GetAspectRatio(inViewport));
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderCamera.h b/src/runtimerender/graphobjects/Qt3DSRenderCamera.h
new file mode 100644
index 0000000..be8d53e
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderCamera.h
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CAMERA_H
+#define QT3DS_RENDER_CAMERA_H
+#include "Qt3DSRenderNode.h"
+#include "Qt3DSRenderRay.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SCameraGlobalCalculationResult
+ {
+ bool m_WasDirty;
+ bool m_ComputeFrustumSucceeded;
+ SCameraGlobalCalculationResult(bool inWasDirty, bool inComputeSucceeded = true)
+ : m_WasDirty(inWasDirty)
+ , m_ComputeFrustumSucceeded(inComputeSucceeded)
+ {
+ }
+ };
+
+ struct CameraScaleModes
+ {
+ enum Enum {
+ Fit = 0,
+ SameSize,
+ FitHorizontal,
+ FitVertical,
+ };
+ };
+
+ struct CameraScaleAnchors
+ {
+ enum Enum {
+ Center = 0,
+ North,
+ NorthEast,
+ East,
+ SouthEast,
+ South,
+ SouthWest,
+ West,
+ NorthWest,
+ };
+ };
+
+ struct SCuboidRect
+ {
+ QT3DSF32 m_Left;
+ QT3DSF32 m_Top;
+ QT3DSF32 m_Right;
+ QT3DSF32 m_Bottom;
+ SCuboidRect(QT3DSF32 l = 0.0f, QT3DSF32 t = 0.0f, QT3DSF32 r = 0.0f, QT3DSF32 b = 0.0f)
+ : m_Left(l)
+ , m_Top(t)
+ , m_Right(r)
+ , m_Bottom(b)
+ {
+ }
+ void Translate(QT3DSVec2 inTranslation)
+ {
+ m_Left += inTranslation.x;
+ m_Right += inTranslation.x;
+ m_Top += inTranslation.y;
+ m_Bottom += inTranslation.y;
+ }
+ };
+
+ struct SCamera : public SNode
+ {
+
+ // Setting these variables should set dirty on the camera.
+ QT3DSF32 m_ClipNear;
+ QT3DSF32 m_ClipFar;
+
+ QT3DSF32 m_FOV; // Radians
+ bool m_FOVHorizontal;
+
+ QT3DSMat44 m_Projection;
+ CameraScaleModes::Enum m_ScaleMode;
+ CameraScaleAnchors::Enum m_ScaleAnchor;
+ // Record some values from creating the projection matrix
+ // to use during mouse picking.
+ QT3DSVec2 m_FrustumScale;
+
+ SCamera();
+
+ QT3DSMat33 GetLookAtMatrix(const QT3DSVec3 &inUpDir, const QT3DSVec3 &inDirection) const;
+ // Set our position, rotation member variables based on the lookat target
+ // Marks this object as dirty.
+ // Need to test this when the camera's local transform is null.
+ // Assumes parent's local transform is the identity, meaning our local transform is
+ // our global transform.
+ void LookAt(const QT3DSVec3 &inCameraPos, const QT3DSVec3 &inUpDir, const QT3DSVec3 &inTargetPos);
+
+ SCameraGlobalCalculationResult CalculateGlobalVariables(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions);
+ bool CalculateProjection(const NVRenderRectF &inViewport, const QT3DSVec2 &inDesignDimensions);
+ bool ComputeFrustumOrtho(const NVRenderRectF &inViewport, const QT3DSVec2 &inDesignDimensions);
+ // Used when rendering the widgets in studio. This scales the widget when in orthographic
+ // mode in order to have
+ // constant size on screen regardless.
+ // Number is always greater than one
+ QT3DSF32 GetOrthographicScaleFactor(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions) const;
+ bool ComputeFrustumPerspective(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions);
+ // Text may be scaled so that it doesn't appear pixellated when the camera itself is doing
+ // the scaling.
+ QT3DSF32 GetTextScaleFactor(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions) const;
+
+ void CalculateViewProjectionMatrix(QT3DSMat44 &outMatrix) const;
+
+ // If this is an orthographic camera, the cuboid properties are the distance from the center
+ // point
+ // to the left, top, right, and bottom edges of the view frustum in world units.
+ // If this is a perspective camera, the cuboid properties are the FOV angles
+ // (left,top,right,bottom)
+ // of the view frustum.
+
+ // Return a normalized rect that describes the area the camera is rendering to.
+ // This takes into account the various camera properties (scale mode, scale anchor).
+ SCuboidRect GetCameraBounds(const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions) const;
+
+ // Setup a camera VP projection for rendering offscreen.
+ static void SetupOrthographicCameraForOffscreenRender(NVRenderTexture2D &inTexture,
+ QT3DSMat44 &outVP);
+ static void SetupOrthographicCameraForOffscreenRender(NVRenderTexture2D &inTexture,
+ QT3DSMat44 &outVP, SCamera &outCamera);
+
+ // Unproject a point (x,y) in viewport relative coordinates meaning
+ // left, bottom is 0,0 and values are increasing right,up respectively.
+ SRay Unproject(const QT3DSVec2 &inLayerRelativeMouseCoords, const NVRenderRectF &inViewport,
+ const QT3DSVec2 &inDesignDimensions, bool sceneCameraView = false) const;
+
+ // Unproject a given coordinate to a 3d position that lies on the same camera
+ // plane as inGlobalPos.
+ // Expects CalculateGlobalVariables has been called or doesn't need to be.
+ QT3DSVec3 UnprojectToPosition(const QT3DSVec3 &inGlobalPos, const SRay &inRay) const;
+
+ QT3DSF32 verticalFov(QT3DSF32 aspectRatio) const;
+ QT3DSF32 verticalFov(const NVRenderRectF &inViewport) const;
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h b/src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h
new file mode 100644
index 0000000..593c757
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderCustomMaterial.h
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CUSTOM_MATERIAL_H
+#define QT3DS_RENDER_CUSTOM_MATERIAL_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderDynamicObject.h"
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSRenderLightmaps.h"
+#include "foundation/Qt3DSFlags.h"
+
+namespace qt3ds {
+namespace render {
+
+ // IMPORTANT: These flags matches the key produced by a MDL export file
+ struct SCustomMaterialShaderKeyValues
+ {
+ enum Enum {
+ diffuse = 1 << 0,
+ specular = 1 << 1,
+ glossy = 1 << 2,
+ cutout = 1 << 3,
+ refraction = 1 << 4,
+ transparent = 1 << 5,
+ displace = 1 << 6,
+ volumetric = 1 << 7,
+ transmissive = 1 << 8,
+ };
+ };
+
+ typedef NVFlags<SCustomMaterialShaderKeyValues::Enum, QT3DSU32> SCustomMaterialShaderKeyFlags;
+
+ struct SCustomMaterial : public SDynamicObject
+ {
+ private:
+ // These objects are only created via the dynamic object system.
+ SCustomMaterial(const SCustomMaterial &);
+ SCustomMaterial &operator=(const SCustomMaterial &);
+ SCustomMaterial();
+
+ public:
+ // lightmap section
+ SLightmaps m_Lightmaps;
+ // material section
+ bool m_hasTransparency;
+ bool m_hasRefraction;
+ bool m_hasVolumetricDF;
+ SImage *m_IblProbe;
+ SImage *m_EmissiveMap2;
+ SImage *m_DisplacementMap;
+ QT3DSF32 m_DisplaceAmount; ///< depends on the object size
+
+ SGraphObject *m_NextSibling;
+
+ SCustomMaterialShaderKeyFlags m_ShaderKeyValues; ///< input from MDL files
+ QT3DSU32 m_LayerCount; ///< input from MDL files
+
+ void Initialize(QT3DSU32 inKey, QT3DSU32 inLayerCount)
+ {
+ m_Lightmaps.m_LightmapIndirect = NULL;
+ m_Lightmaps.m_LightmapRadiosity = NULL;
+ m_Lightmaps.m_LightmapShadow = NULL;
+ m_hasTransparency = false;
+ m_hasRefraction = false;
+ m_hasVolumetricDF = false;
+ m_NextSibling = NULL;
+ m_DirtyFlagWithInFrame = m_Flags.IsDirty();
+ m_IblProbe = NULL;
+ m_EmissiveMap2 = NULL;
+ m_DisplacementMap = NULL;
+ m_DisplaceAmount = 0.0;
+ m_ShaderKeyValues = (SCustomMaterialShaderKeyFlags)inKey;
+ m_LayerCount = inLayerCount;
+ }
+
+ bool IsDielectric() const
+ {
+ return m_ShaderKeyValues & SCustomMaterialShaderKeyValues::diffuse;
+ }
+ bool IsSpecularEnabled() const
+ {
+ return m_ShaderKeyValues & SCustomMaterialShaderKeyValues::specular;
+ }
+ bool IsCutOutEnabled() const
+ {
+ return m_ShaderKeyValues & SCustomMaterialShaderKeyValues::cutout;
+ }
+ bool IsVolumetric() const
+ {
+ return m_ShaderKeyValues & SCustomMaterialShaderKeyValues::volumetric;
+ }
+ bool IsTransmissive() const
+ {
+ return m_ShaderKeyValues & SCustomMaterialShaderKeyValues::transmissive;
+ }
+ bool HasLighting() const { return true; }
+
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SDynamicObject::Remap(inRemapper);
+ m_Lightmaps.Remap(inRemapper);
+ inRemapper.Remap(m_IblProbe);
+ inRemapper.RemapMaterial(m_NextSibling);
+ inRemapper.Remap(m_EmissiveMap2);
+ inRemapper.Remap(m_DisplacementMap);
+ }
+
+ // Dirty
+ bool m_DirtyFlagWithInFrame;
+ bool IsDirty() const { return m_Flags.IsDirty() || m_DirtyFlagWithInFrame; }
+ void UpdateDirtyForFrame()
+ {
+ m_DirtyFlagWithInFrame = m_Flags.IsDirty();
+ m_Flags.SetDirty(false);
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
new file mode 100644
index 0000000..e18a84d
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.cpp
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderDefaultMaterial.h"
+
+using namespace qt3ds::render;
+
+SDefaultMaterial::SDefaultMaterial()
+ : SGraphObject(GraphObjectTypes::DefaultMaterial)
+ , m_IblProbe(NULL)
+ , m_Lighting(DefaultMaterialLighting::VertexLighting)
+ , m_BlendMode(DefaultMaterialBlendMode::Normal)
+ , m_DiffuseColor(1, 1, 1, 1)
+ , m_EmissivePower(0)
+ , m_EmissiveMap(NULL)
+ , m_EmissiveMap2(NULL)
+ , m_EmissiveColor(1, 1, 1, 1)
+ , m_SpecularReflection(NULL)
+ , m_SpecularMap(NULL)
+ , m_SpecularModel(DefaultMaterialSpecularModel::Default)
+ , m_SpecularTint(1, 1, 1, 1)
+ , m_IOR(.2f)
+ , m_FresnelPower(0.0f)
+ , m_SpecularAmount(0)
+ , m_SpecularRoughness(50)
+ , m_RoughnessMap(NULL)
+ , m_Opacity(1)
+ , m_OpacityMap(NULL)
+ , m_BumpMap(NULL)
+ , m_BumpAmount(0.f)
+ , m_NormalMap(NULL)
+ , m_DisplacementMap(NULL)
+ , m_DisplaceAmount(0.f)
+ , m_TranslucencyMap(NULL)
+ , m_TranslucentFalloff(0.f)
+ , m_DiffuseLightWrap(0.f)
+ , m_VertexColors(false)
+ , m_NextSibling(NULL)
+ , m_Parent(NULL)
+{
+ m_Lightmaps.m_LightmapIndirect = NULL;
+ m_Lightmaps.m_LightmapRadiosity = NULL;
+ m_Lightmaps.m_LightmapShadow = NULL;
+
+ m_DiffuseMaps[0] = NULL;
+ m_DiffuseMaps[2] = NULL;
+ m_DiffuseMaps[1] = NULL;
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
new file mode 100644
index 0000000..48c8d0b
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDefaultMaterial.h
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_DEFAULT_MATERIAL_H
+#define QT3DS_RENDER_DEFAULT_MATERIAL_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSVec3.h"
+#include "Qt3DSRenderMaterialDirty.h"
+#include "Qt3DSRenderLightmaps.h"
+
+namespace qt3ds {
+namespace render {
+ struct DefaultMaterialLighting
+ {
+ enum Enum {
+ NoLighting = 0,
+ VertexLighting,
+ FragmentLighting
+ };
+ };
+ struct DefaultMaterialBlendMode
+ {
+ enum Enum {
+ Normal = 0,
+ Screen,
+ Multiply,
+ Overlay,
+ ColorBurn,
+ ColorDodge
+ };
+ };
+
+ struct DefaultMaterialSpecularModel
+ {
+ enum Enum {
+ Default = 0,
+ KGGX,
+ KWard
+ };
+ };
+
+ struct SImage;
+
+ struct QT3DS_AUTOTEST_EXPORT SDefaultMaterial : SGraphObject
+ {
+ CMaterialDirty m_Dirty;
+ // lightmap section
+ SLightmaps m_Lightmaps;
+ // material section
+ SImage *m_IblProbe;
+ DefaultMaterialLighting::Enum m_Lighting; // defaults to vertex
+ DefaultMaterialBlendMode::Enum m_BlendMode; // defaults to normal
+ QT3DSVec4 m_DiffuseColor; // colors are 0-1 normalized
+ SImage *m_DiffuseMaps[3];
+ QT3DSF32 m_EmissivePower; // 0-100, defaults to 0
+ QT3DSVec4 m_EmissiveColor;
+ SImage *m_EmissiveMap;
+ SImage *m_EmissiveMap2;
+ SImage *m_SpecularReflection;
+ SImage *m_SpecularMap;
+ DefaultMaterialSpecularModel::Enum m_SpecularModel;
+ QT3DSVec4 m_SpecularTint;
+ QT3DSF32 m_IOR;
+ QT3DSF32 m_FresnelPower;
+ QT3DSF32 m_SpecularAmount; // 0-??, defaults to 0
+ QT3DSF32 m_SpecularRoughness; // 0-??, defaults to 50
+ SImage *m_RoughnessMap;
+ QT3DSF32 m_Opacity; // 0-1
+ SImage *m_OpacityMap;
+ SImage *m_BumpMap;
+ QT3DSF32 m_BumpAmount; // 0-??
+ SImage *m_NormalMap;
+ SImage *m_DisplacementMap;
+ QT3DSF32 m_DisplaceAmount; // 0-??
+ SImage *m_TranslucencyMap;
+ QT3DSF32 m_TranslucentFalloff; // 0 - ??
+ QT3DSF32 m_DiffuseLightWrap; // 0 - 1
+ bool m_VertexColors;
+ // Materials are stored as a linked list on models.
+ SGraphObject *m_NextSibling;
+ SModel *m_Parent;
+
+ SDefaultMaterial();
+
+ bool IsSpecularEnabled() const { return m_SpecularAmount > .01f; }
+ bool IsFresnelEnabled() const { return m_FresnelPower > 0.0f; }
+ bool IsVertexColorsEnabled() const { return m_VertexColors; }
+ bool HasLighting() const { return m_Lighting != DefaultMaterialLighting::NoLighting; }
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ m_Lightmaps.Remap(inRemapper);
+ inRemapper.Remap(m_IblProbe);
+ inRemapper.Remap(m_DiffuseMaps[0]);
+ inRemapper.Remap(m_DiffuseMaps[1]);
+ inRemapper.Remap(m_DiffuseMaps[2]);
+ inRemapper.Remap(m_EmissiveMap);
+ inRemapper.Remap(m_EmissiveMap2);
+ inRemapper.Remap(m_SpecularReflection);
+ inRemapper.Remap(m_SpecularMap);
+ inRemapper.Remap(m_RoughnessMap);
+ inRemapper.Remap(m_OpacityMap);
+ inRemapper.Remap(m_BumpMap);
+ inRemapper.Remap(m_NormalMap);
+ inRemapper.Remap(m_DisplacementMap);
+ inRemapper.Remap(m_TranslucencyMap);
+ inRemapper.RemapMaterial(m_NextSibling);
+ inRemapper.Remap(m_Parent);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp
new file mode 100644
index 0000000..2e1e6a0
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.cpp
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderDynamicObject.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "foundation/FileTools.h"
+#include "StringTools.h"
+
+#include <QtCore/qdir.h>
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace qt3ds::foundation;
+
+SDynamicObject::SDynamicObject(GraphObjectTypes::Enum inType, CRegisteredString inObjName,
+ QT3DSU32 inDSByteSize, QT3DSU32 thisObjSize)
+ : SGraphObject(inType)
+ , m_ClassName(inObjName)
+ , m_DataSectionByteSize(inDSByteSize)
+ , m_ThisObjectSize(thisObjSize)
+{
+}
+
+template <typename TDataType>
+void SDynamicObject::SetPropertyValueT(const dynamic::SPropertyDefinition &inDefinition,
+ const TDataType &inValue)
+{
+ if (sizeof(inValue) != inDefinition.m_ByteSize) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ memCopy(GetDataSectionBegin() + inDefinition.m_Offset, &inValue, sizeof(inValue));
+}
+
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ bool inValue)
+{
+ SetPropertyValueT(inDefinition, inValue);
+}
+
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ QT3DSF32 inValue)
+{
+ SetPropertyValueT(inDefinition, inValue);
+}
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ QT3DSF32 inValue, QT3DSU32 inOffset)
+{
+ if (sizeof(QT3DSF32) > (inDefinition.m_ByteSize - inOffset)) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ memCopy(GetDataSectionBegin() + inDefinition.m_Offset + inOffset, &inValue, sizeof(inValue));
+}
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const QT3DSVec2 &inValue)
+{
+ SetPropertyValueT(inDefinition, inValue);
+}
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const QT3DSVec3 &inValue)
+{
+ SetPropertyValueT(inDefinition, inValue);
+}
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const QT3DSVec4 &inValue)
+{
+ SetPropertyValueT(inDefinition, inValue);
+}
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ QT3DSI32 inValue)
+{
+ SetPropertyValueT(inDefinition, inValue);
+}
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ CRegisteredString inValue)
+{
+ QT3DS_ASSERT(inDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr);
+ SetPropertyValueT(inDefinition, inValue);
+}
+
+template <typename TStrType>
+void SDynamicObject::SetStrPropertyValueT(dynamic::SPropertyDefinition &inDefinition,
+ const char8_t *inValue, const char8_t *inProjectDir,
+ TStrType &ioWorkspace, IStringTable &inStrTable)
+{
+ if (inValue == NULL)
+ inValue = "";
+ if (inDefinition.m_DataType == NVRenderShaderDataTypes::QT3DSI32) {
+ NVConstDataRef<CRegisteredString> theEnumValues = inDefinition.m_EnumValueNames;
+ for (QT3DSI32 idx = 0, end = (QT3DSI32)theEnumValues.size(); idx < end; ++idx) {
+ if (strcmp(theEnumValues[idx].c_str(), inValue) == 0) {
+ SetPropertyValueT(inDefinition, idx);
+ break;
+ }
+ }
+ } else if (inDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderTexture2DPtr) {
+ if (inProjectDir == NULL)
+ inProjectDir = "";
+ if (CFileTools::RequiresCombineBaseAndRelative(inValue)) {
+ QString absolute = QDir(inProjectDir).filePath(inValue);
+ ioWorkspace.assign(absolute.toLatin1().constData());
+ SetPropertyValueT(inDefinition, inStrTable.RegisterStr(ioWorkspace.c_str()));
+ // We also adjust the image path in the definition
+ // I could not find a better place
+ inDefinition.m_ImagePath = inStrTable.RegisterStr(ioWorkspace.c_str());
+ } else {
+ SetPropertyValueT(inDefinition, inStrTable.RegisterStr(inValue));
+ }
+ } else if (inDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderImage2DPtr) {
+ SetPropertyValueT(inDefinition, inStrTable.RegisterStr(inValue));
+ } else if (inDefinition.m_DataType == NVRenderShaderDataTypes::NVRenderDataBufferPtr) {
+ SetPropertyValueT(inDefinition, inStrTable.RegisterStr(inValue));
+ } else {
+ QT3DS_ASSERT(false);
+ }
+}
+
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const char8_t *inValue, const char8_t *inProjectDir,
+ Qt3DSString &ioWorkspace, IStringTable &inStrTable)
+{
+ SetStrPropertyValueT(const_cast<dynamic::SPropertyDefinition &>(inDefinition), inValue,
+ inProjectDir, ioWorkspace, inStrTable);
+}
+
+void SDynamicObject::SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const char8_t *inValue, const char8_t *inProjectDir,
+ eastl::string &ioWorkspace, IStringTable &inStrTable)
+{
+ SetStrPropertyValueT(const_cast<dynamic::SPropertyDefinition &>(inDefinition), inValue,
+ inProjectDir, ioWorkspace, inStrTable);
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h
new file mode 100644
index 0000000..92ab3b2
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderDynamicObject.h
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_DYNAMIC_OBJECT_H
+#define QT3DS_RENDER_DYNAMIC_OBJECT_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "Qt3DSRenderNode.h"
+#include "EASTL/string.h"
+#include "StringTools.h"
+
+namespace qt3ds {
+namespace render {
+
+ namespace dynamic {
+ struct SPropertyDefinition;
+ }
+
+ // Dynamic objects are objects that have variable number of properties during runtime.
+ struct SDynamicObject : public SGraphObject
+ {
+ CRegisteredString m_ClassName;
+ NodeFlags m_Flags;
+ QT3DSU32 m_DataSectionByteSize;
+ QT3DSU32 m_ThisObjectSize;
+
+ SDynamicObject(GraphObjectTypes::Enum inType, CRegisteredString inClassName,
+ QT3DSU32 inDSByteSize, QT3DSU32 thisObjSize);
+
+ QT3DSU8 *GetDataSectionBegin()
+ {
+ QT3DSU8 *thisObjectStart = reinterpret_cast<QT3DSU8 *>(this);
+ QT3DSU8 *retval = thisObjectStart + m_ThisObjectSize;
+ QT3DS_ASSERT((reinterpret_cast<size_t>(retval) % 4 == 0));
+ return retval;
+ }
+
+ const QT3DSU8 *GetDataSectionBegin() const
+ {
+ return const_cast<SDynamicObject *>(this)->GetDataSectionBegin();
+ }
+
+ QT3DSU8 *GetDataSectionEnd() { return GetDataSectionBegin() + m_DataSectionByteSize; }
+
+ template <typename TDataType>
+ void SetPropertyValueT(const dynamic::SPropertyDefinition &inDefinition,
+ const TDataType &inType);
+ template <typename TStrType>
+ void SetStrPropertyValueT(dynamic::SPropertyDefinition &inDefinition,
+ const char8_t *inValue, const char8_t *inProjectDir,
+ TStrType &ioWorkspace, IStringTable &inStrTable);
+
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition, bool inValue);
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition, QT3DSF32 inValue);
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition, QT3DSF32 inValue,
+ QT3DSU32 inOffset);
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const QT3DSVec2 &inValue);
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const QT3DSVec3 &inValue);
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const QT3DSVec4 &inValue);
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition, QT3DSI32 inValue);
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ CRegisteredString inValue);
+
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const char8_t *inValue, const char8_t *inProjectDir,
+ Qt3DSString &ioWorkspace, IStringTable &inStrTable);
+
+ void SetPropertyValue(const dynamic::SPropertyDefinition &inDefinition,
+ const char8_t *inValue, const char8_t *inProjectDir,
+ eastl::string &ioWorkspace, IStringTable &inStrTable);
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_ClassName);
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp b/src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp
new file mode 100644
index 0000000..f074b6b
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderEffect.cpp
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderEffect.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSVec3.h"
+#include "StringTools.h"
+#include "foundation/FileTools.h"
+
+using namespace qt3ds::render;
+
+void SEffect::Initialize()
+{
+ m_Layer = NULL;
+ m_NextEffect = NULL;
+ m_Context = NULL;
+}
+
+void SEffect::SetActive(bool inActive, IEffectSystem &inManager)
+{
+ if (m_Flags.IsActive() != inActive) {
+ m_Flags.SetActive(inActive);
+ if (m_Context)
+ inManager.ResetEffectFrameData(*m_Context);
+ m_Flags.SetDirty(true);
+ }
+}
+
+void SEffect::Reset(IEffectSystem &inSystem)
+{
+ if (m_Context)
+ inSystem.ResetEffectFrameData(*m_Context);
+ m_Flags.SetDirty(true);
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderEffect.h b/src/runtimerender/graphobjects/Qt3DSRenderEffect.h
new file mode 100644
index 0000000..c11c214
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderEffect.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_EFFECT_H
+#define QT3DS_RENDER_EFFECT_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "Qt3DSRenderNode.h"
+#include "EASTL/string.h"
+#include "Qt3DSRenderDynamicObject.h"
+
+namespace qt3ds {
+namespace render {
+ struct SLayer;
+ struct SEffectContext;
+
+ // Effects are post-render effect applied to the layer. There can be more than one of
+ // them and they have completely variable properties.
+ // see IEffectManager in order to create these effects.
+ // The data for the effect immediately follows the effect
+ struct SEffect : public SDynamicObject
+ {
+ private:
+ // These objects are only created via the dynamic object system.
+ SEffect(const SEffect &);
+ SEffect &operator=(const SEffect &);
+ SEffect();
+
+ public:
+ SLayer *m_Layer;
+ SEffect *m_NextEffect;
+ // Opaque pointer to context type implemented by the effect system.
+ // May be null in which case the effect system will generate a new context
+ // the first time it needs to render this effect.
+ SEffectContext *m_Context;
+
+ void Initialize();
+
+ // If our active flag value changes, then we ask the effect manager
+ // to reset our context.
+ void SetActive(bool inActive, IEffectSystem &inSystem);
+
+ void Reset(IEffectSystem &inSystem);
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SDynamicObject::Remap(inRemapper);
+ inRemapper.Remap(m_Layer);
+ inRemapper.Remap(m_NextEffect);
+ inRemapper.NullPtr(m_Context);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderGraphObject.h b/src/runtimerender/graphobjects/Qt3DSRenderGraphObject.h
new file mode 100644
index 0000000..58c48ed
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderGraphObject.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_GRAPH_OBJECT_H
+#define QT3DS_RENDER_GRAPH_OBJECT_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderTaggedPointer.h"
+#include "Qt3DSRenderGraphObjectTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ // Types should be setup on construction. Change the type
+ // at your own risk as the type is used for RTTI purposes.
+ struct QT3DS_AUTOTEST_EXPORT SGraphObject
+ {
+ // Id's help debugging the object and are optionally set
+ CRegisteredString m_Id;
+ // Type is used for RTTI purposes down the road.
+ GraphObjectTypes::Enum m_Type;
+ STaggedPointer m_UserData;
+
+ SGraphObject(GraphObjectTypes::Enum inType)
+ : m_Type(inType)
+ {
+ }
+ SGraphObject(const SGraphObject &inCloningObject, NVAllocatorCallback & /*inAllocator*/)
+ : m_Id(inCloningObject.m_Id)
+ , m_Type(inCloningObject.m_Type)
+ {
+ }
+
+ // If you change any detail of the scene graph, or even *breath* on a
+ // scene graph object, you need to bump this binary version so at least
+ // we know if we can load a file or not.
+ static QT3DSU32 GetSceneGraphBinaryVersion() { return 1; }
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ inRemapper.Remap(m_Id);
+ inRemapper.NullPtr(m_UserData.m_UserData);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp
new file mode 100644
index 0000000..57e86ad
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderImage.cpp
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "Qt3DSOffscreenRenderKey.h"
+#include "Qt3DSRenderPlugin.h"
+#include "Qt3DSRenderPluginGraphObject.h"
+
+using namespace qt3ds::render;
+
+SImage::SImage()
+ : SGraphObject(GraphObjectTypes::Image)
+ , m_RenderPlugin(nullptr)
+ , m_LastFrameOffscreenRenderer(nullptr)
+ , m_Parent(nullptr)
+ , m_Scale(1, 1)
+ , m_Pivot(0, 0)
+ , m_Rotation(0)
+ , m_Position(0, 0)
+ , m_MappingMode(ImageMappingModes::Normal)
+ , m_HorizontalTilingMode(NVRenderTextureCoordOp::ClampToEdge)
+ , m_VerticalTilingMode(NVRenderTextureCoordOp::ClampToEdge)
+{
+ m_Flags.SetActive(true);
+ m_Flags.SetDirty(true);
+ m_Flags.SetTransformDirty(true);
+}
+
+static void HandleOffscreenResult(SImage &theImage, SImageTextureData &newImage,
+ SOffscreenRenderResult &theResult, bool &replaceTexture,
+ bool &wasDirty)
+{
+ newImage.m_Texture = theResult.m_Texture;
+ newImage.m_TextureFlags.SetHasTransparency(theResult.m_HasTransparency);
+ newImage.m_TextureFlags.SetPreMultiplied(true);
+ wasDirty = wasDirty || theResult.m_HasChangedSinceLastFrame;
+ theImage.m_LastFrameOffscreenRenderer = theResult.m_Renderer;
+ replaceTexture = true;
+}
+
+bool SImage::ClearDirty(IBufferManager &inBufferManager, IOffscreenRenderManager &inRenderManager,
+ IRenderPluginManager &inPluginManager, bool forIbl)
+{
+
+ bool wasDirty = m_Flags.IsDirty();
+ m_Flags.SetDirty(false);
+ SImageTextureData newImage;
+ bool replaceTexture(false);
+ if (m_RenderPlugin && m_RenderPlugin->m_Flags.IsActive()) {
+ IRenderPluginInstance *theInstance = inPluginManager.GetOrCreateRenderPluginInstance(
+ m_RenderPlugin->m_PluginPath, m_RenderPlugin);
+ if (theInstance) {
+ inRenderManager.MaybeRegisterOffscreenRenderer(theInstance, *theInstance);
+ SOffscreenRenderResult theResult = inRenderManager.GetRenderedItem(theInstance);
+ HandleOffscreenResult(*this, newImage, theResult, replaceTexture, wasDirty);
+ }
+ }
+
+ if (newImage.m_Texture == nullptr) {
+ if (m_OffscreenRendererId.IsValid()) {
+ SOffscreenRenderResult theResult =
+ inRenderManager.GetRenderedItem(m_OffscreenRendererId);
+ HandleOffscreenResult(*this, newImage, theResult, replaceTexture, wasDirty);
+ }
+ }
+
+ if (newImage.m_Texture == nullptr) {
+ m_LastFrameOffscreenRenderer = nullptr;
+ if (m_ImagePath.IsValid()) {
+ if (!m_LoadedTextureData
+ || m_LoadedTextureData->m_path != QString::fromUtf8(m_ImagePath.c_str())) {
+ if (m_LoadedTextureData)
+ m_LoadedTextureData->m_callbacks.removeOne(this);
+ forIbl = forIbl || m_MappingMode == ImageMappingModes::LightProbe;
+ m_LoadedTextureData = inBufferManager.CreateReloadableImage(m_ImagePath, false,
+ forIbl);
+ m_LoadedTextureData->m_callbacks.push_back(this);
+ }
+ if (m_LoadedTextureData) {
+ if (m_LoadedTextureData->m_loaded) {
+ newImage.m_Texture = m_LoadedTextureData->m_Texture;
+ newImage.m_TextureFlags = m_LoadedTextureData->m_TextureFlags;
+ newImage.m_BSDFMipMap = m_LoadedTextureData->m_BSDFMipMap;
+ }
+ replaceTexture = m_TextureData.m_Texture != newImage.m_Texture;
+ }
+ }
+ }
+
+ if (replaceTexture) {
+ wasDirty = true;
+ m_TextureData = newImage;
+ }
+
+ if (m_Flags.IsTransformDirty()) {
+ wasDirty = true;
+ CalculateTextureTransform();
+ }
+ return wasDirty;
+}
+
+void SImage::CalculateTextureTransform()
+{
+ m_Flags.SetTransformDirty(false);
+
+ m_TextureTransform = QT3DSMat44::createIdentity();
+
+ QT3DSMat44 translation(QT3DSMat44::createIdentity());
+ QT3DSMat44 rotation(QT3DSMat44::createIdentity());
+ QT3DSMat44 scale(QT3DSMat44::createIdentity());
+
+ translation.column3[0] = m_Position.x;
+ translation.column3[1] = m_Position.y;
+ scale.column0[0] = m_Scale.x;
+ scale.column1[1] = m_Scale.y;
+ rotation.rotate(m_Rotation, QT3DSVec3(0, 0, 1));
+
+ // Setup the pivot.
+ m_TextureTransform.column3[0] = m_Pivot.x;
+ m_TextureTransform.column3[1] = m_Pivot.y;
+ m_TextureTransform = m_TextureTransform * rotation;
+ m_TextureTransform = m_TextureTransform * scale;
+ m_TextureTransform = m_TextureTransform * translation;
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderImage.h b/src/runtimerender/graphobjects/Qt3DSRenderImage.h
new file mode 100644
index 0000000..9b71d3f
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderImage.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_IMAGE_H
+#define QT3DS_RENDER_IMAGE_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "foundation/StringTable.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "Qt3DSRenderNode.h"
+#include "foundation/Qt3DSVec2.h"
+#include "Qt3DSRenderImageTextureData.h"
+#include "EASTL/utility.h"
+
+namespace qt3ds {
+namespace render {
+ class IQt3DSRenderContext;
+ class IOffscreenRenderManager;
+ class IOffscreenRenderer;
+ struct ImageMappingModes
+ {
+ enum Enum {
+ Normal = 0, // UV mapping
+ Environment = 1,
+ LightProbe = 2,
+ };
+ };
+
+ struct QT3DS_AUTOTEST_EXPORT SImage : public SGraphObject
+ {
+ // Complete path to the file;
+ //*not* relative to the presentation directory
+ CRegisteredString m_ImagePath;
+ CRegisteredString m_ImageShaderName; ///< for custom materials we don't generate the name
+
+ // Presentation id.
+ CRegisteredString m_OffscreenRendererId; // overrides source path if available
+ SRenderPlugin *m_RenderPlugin; // Overrides everything if available.
+ IOffscreenRenderer *m_LastFrameOffscreenRenderer;
+ SGraphObject *m_Parent;
+
+ SImageTextureData m_TextureData;
+ ReloadableTexturePtr m_LoadedTextureData;
+
+ NodeFlags m_Flags; // only dirty, transform dirty, and active apply
+
+ QT3DSVec2 m_Scale;
+ QT3DSVec2 m_Pivot;
+ QT3DSF32 m_Rotation; // Radians.
+ QT3DSVec2 m_Position;
+ ImageMappingModes::Enum m_MappingMode;
+ NVRenderTextureCoordOp::Enum m_HorizontalTilingMode;
+ NVRenderTextureCoordOp::Enum m_VerticalTilingMode;
+
+ // Setting any of the above variables means this object is dirty.
+ // Setting any of the vec2 properties means this object's transform is dirty
+
+ QT3DSMat44 m_TextureTransform;
+
+ SImage();
+ // Renders the sub presentation
+ // Or finds the image.
+ // and sets up the texture transform
+ bool ClearDirty(IBufferManager &inBufferManager, IOffscreenRenderManager &inRenderManager,
+ IRenderPluginManager &pluginManager, bool forIbl = false);
+
+ void CalculateTextureTransform();
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_ImagePath);
+ inRemapper.Remap(m_OffscreenRendererId);
+ // Null out objects that should be null when loading from file.
+ inRemapper.NullPtr(m_LastFrameOffscreenRenderer);
+ inRemapper.NullPtr(m_TextureData.m_Texture);
+ inRemapper.Remap(m_RenderPlugin);
+ inRemapper.Remap(m_Parent);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderLayer.cpp b/src/runtimerender/graphobjects/Qt3DSRenderLayer.cpp
new file mode 100644
index 0000000..36a826c
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderLayer.cpp
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderEffect.h"
+
+using namespace qt3ds::render;
+
+SLayer::SLayer()
+ : SNode(GraphObjectTypes::Layer)
+ , m_Scene(NULL)
+ , m_FirstEffect(NULL)
+ , m_RenderPlugin(NULL)
+ , m_ProgressiveAAMode(AAModeValues::NoAA)
+ , m_MultisampleAAMode(AAModeValues::NoAA)
+ , m_Background(LayerBackground::Transparent)
+ , m_ClearColor(0.0f)
+ , m_BlendType(LayerBlendTypes::Normal)
+ , m_HorizontalFieldValues(HorizontalFieldValues::LeftWidth)
+ , m_Left(0)
+ , m_LeftUnits(LayerUnitTypes::Percent)
+ , m_Width(100.0f)
+ , m_WidthUnits(LayerUnitTypes::Percent)
+ , m_Right(0)
+ , m_RightUnits(LayerUnitTypes::Percent)
+ , m_VerticalFieldValues(VerticalFieldValues::TopHeight)
+ , m_Top(0)
+ , m_TopUnits(LayerUnitTypes::Percent)
+ , m_Height(100.0f)
+ , m_HeightUnits(LayerUnitTypes::Percent)
+ , m_Bottom(0)
+ , m_BottomUnits(LayerUnitTypes::Percent)
+ , m_AoStrength(0)
+ , m_AoDistance(5.0f)
+ , m_AoSoftness(50.0f)
+ , m_AoBias(0)
+ , m_AoSamplerate(2)
+ , m_AoDither(false)
+ , m_ShadowStrength(0)
+ , m_ShadowDist(10)
+ , m_ShadowSoftness(100.0f)
+ , m_ShadowBias(0)
+ , m_LightProbe(NULL)
+ , m_ProbeBright(100.0f)
+ , m_FastIbl(false)
+ , m_ProbeHorizon(-1.0f)
+ , m_ProbeFov(180.0f)
+ , m_LightProbe2(NULL)
+ , m_Probe2Fade(1.0f)
+ , m_Probe2Window(1.0f)
+ , m_Probe2Pos(0.5f)
+ , m_TemporalAAEnabled(false)
+{
+ m_Flags.SetLayerRenderToTarget(true);
+ m_Flags.SetLayerEnableDepthTest(true);
+ m_Flags.SetLayerEnableDepthPrepass(true);
+}
+
+void SLayer::AddEffect(SEffect &inEffect)
+{
+ // Effects need to be rendered in reverse order as described in the file.
+ inEffect.m_NextEffect = m_FirstEffect;
+ m_FirstEffect = &inEffect;
+ inEffect.m_Layer = this;
+}
+
+SEffect *SLayer::GetLastEffect()
+{
+ if (m_FirstEffect) {
+ SEffect *theEffect = m_FirstEffect;
+ // Empty loop intentional
+ for (; theEffect->m_NextEffect; theEffect = theEffect->m_NextEffect) {
+ }
+ QT3DS_ASSERT(theEffect->m_NextEffect == NULL);
+ return theEffect;
+ }
+ return NULL;
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderLayer.h b/src/runtimerender/graphobjects/Qt3DSRenderLayer.h
new file mode 100644
index 0000000..5c08e91
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderLayer.h
@@ -0,0 +1,203 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_LAYER_H
+#define QT3DS_RENDER_LAYER_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderNode.h"
+#include "foundation/Qt3DSContainers.h"
+#include "Qt3DSRenderer.h"
+
+namespace qt3ds {
+namespace render {
+ class IQt3DSRenderContext;
+ struct SPresentation;
+ struct SScene;
+ struct SEffect;
+
+ struct AAModeValues
+ {
+ enum Enum {
+ NoAA = 0,
+ SSAA = 1,
+ X2 = 2,
+ X4 = 4,
+ X8 = 8
+ };
+ };
+
+ struct HorizontalFieldValues
+ {
+ enum Enum {
+ LeftWidth = 0,
+ LeftRight,
+ WidthRight
+ };
+ };
+
+ struct VerticalFieldValues
+ {
+ enum Enum {
+ TopHeight = 0,
+ TopBottom,
+ HeightBottom
+ };
+ };
+
+ struct LayerUnitTypes
+ {
+ enum Enum {
+ Percent = 0,
+ Pixels
+ };
+ };
+
+ struct LayerBackground
+ {
+ enum Enum {
+ Transparent = 0,
+ Unspecified,
+ Color
+ };
+ };
+
+ struct LayerBlendTypes
+ {
+ enum Enum {
+ Normal = 0,
+ Screen,
+ Multiply,
+ Add,
+ Subtract,
+ Overlay,
+ ColorBurn,
+ ColorDodge
+ };
+ };
+
+ // A layer is a special node. It *always* presents its global transform
+ // to children as the identity. It also can optionally have a width or height
+ // different than the overlying context. You can think of layers as the transformation
+ // between a 3d scene graph and a 2D texture.
+ struct QT3DS_AUTOTEST_EXPORT SLayer : public SNode
+ {
+ SScene *m_Scene;
+
+ // First effect in a list of effects.
+ SEffect *m_FirstEffect;
+
+ // If a layer has a valid texture path (one that resolves to either a
+ // an on-disk image or a offscreen renderer), then it does not render its
+ // own source path. Instead, it renders the offscreen renderer. Used in this manner,
+ // offscreen renderer's also have the option (if they support it) to render directly to the
+ // render target given a specific viewport (that is also scissored if necessary).
+ qt3ds::foundation::CRegisteredString m_TexturePath;
+
+ SRenderPlugin *m_RenderPlugin; // Overrides texture path if available.
+
+ AAModeValues::Enum m_ProgressiveAAMode;
+ AAModeValues::Enum m_MultisampleAAMode;
+ LayerBackground::Enum m_Background;
+ QT3DSVec4 m_ClearColor;
+
+ LayerBlendTypes::Enum m_BlendType;
+
+ HorizontalFieldValues::Enum m_HorizontalFieldValues;
+ QT3DSF32 m_Left;
+ LayerUnitTypes::Enum m_LeftUnits;
+ QT3DSF32 m_Width;
+ LayerUnitTypes::Enum m_WidthUnits;
+ QT3DSF32 m_Right;
+ LayerUnitTypes::Enum m_RightUnits;
+
+ VerticalFieldValues::Enum m_VerticalFieldValues;
+ QT3DSF32 m_Top;
+ LayerUnitTypes::Enum m_TopUnits;
+ QT3DSF32 m_Height;
+ LayerUnitTypes::Enum m_HeightUnits;
+ QT3DSF32 m_Bottom;
+ LayerUnitTypes::Enum m_BottomUnits;
+
+ // Ambient occlusion
+ QT3DSF32 m_AoStrength;
+ QT3DSF32 m_AoDistance;
+ QT3DSF32 m_AoSoftness;
+ QT3DSF32 m_AoBias;
+ QT3DSI32 m_AoSamplerate;
+ bool m_AoDither;
+
+ // Direct occlusion
+ QT3DSF32 m_ShadowStrength;
+ QT3DSF32 m_ShadowDist;
+ QT3DSF32 m_ShadowSoftness;
+ QT3DSF32 m_ShadowBias;
+
+ // IBL
+ SImage *m_LightProbe;
+ QT3DSF32 m_ProbeBright;
+ bool m_FastIbl;
+ QT3DSF32 m_ProbeHorizon;
+ QT3DSF32 m_ProbeFov;
+ SImage *m_LightProbe2;
+ QT3DSF32 m_Probe2Fade;
+ QT3DSF32 m_Probe2Window;
+ QT3DSF32 m_Probe2Pos;
+
+ bool m_TemporalAAEnabled;
+
+ SLayer();
+
+ void AddEffect(SEffect &inEffect);
+
+ SEffect *GetLastEffect();
+
+ LayerBlendTypes::Enum GetLayerBlend()
+ {
+ return m_BlendType;
+ }
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SNode::Remap(inRemapper);
+ inRemapper.Remap(m_Scene);
+ inRemapper.Remap(m_FirstEffect);
+ inRemapper.Remap(m_TexturePath);
+ inRemapper.Remap(m_RenderPlugin);
+ inRemapper.Remap(m_LightProbe);
+ inRemapper.Remap(m_LightProbe2);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderLight.cpp b/src/runtimerender/graphobjects/Qt3DSRenderLight.cpp
new file mode 100644
index 0000000..5c98324
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderLight.cpp
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderLight.h"
+
+using namespace qt3ds::render;
+
+SLight::SLight()
+ : SNode(GraphObjectTypes::Light)
+ , m_LightType(RenderLightTypes::Directional)
+ , m_Scope(NULL)
+ , m_DiffuseColor(1, 1, 1, 1)
+ , m_SpecularColor(1, 1, 1, 1)
+ , m_AmbientColor(0, 0, 0, 1)
+ , m_Brightness(100)
+ , m_LinearFade(0)
+ , m_ExponentialFade(0)
+ , m_AreaWidth(0)
+ , m_AreaHeight(0)
+ , m_CastShadow(false)
+ , m_ShadowBias(0.0f)
+ , m_ShadowFactor(5.0f)
+ , m_ShadowMapRes(9)
+ , m_ShadowMapFar(5000.0f)
+ , m_ShadowMapFov(90.0f)
+ , m_ShadowFilter(35.0f)
+{
+ m_Flags.SetPointLight(0);
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderLight.h b/src/runtimerender/graphobjects/Qt3DSRenderLight.h
new file mode 100644
index 0000000..10f2b86
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderLight.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_LIGHT_H
+#define QT3DS_RENDER_LIGHT_H
+#include "Qt3DSRenderNode.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct RenderLightTypes
+ {
+ enum Enum {
+ Unknown = 0,
+ Directional,
+ Point,
+ Area,
+ };
+ };
+
+ struct SImage;
+
+ struct QT3DS_AUTOTEST_EXPORT SLight : public SNode
+ {
+ RenderLightTypes::Enum m_LightType; // Directional
+ SNode *m_Scope;
+ QT3DSVec4 m_DiffuseColor; // colors are 0-1 normalized
+ QT3DSVec4 m_SpecularColor; // colors are 0-1 normalized
+ QT3DSVec4 m_AmbientColor; // colors are 0-1 normalized
+
+ // The variables below are in the same range as Studio
+ // Only valid if node is a point light
+ QT3DSF32 m_Brightness; // 0-200
+ QT3DSF32 m_LinearFade; // 0-200
+ QT3DSF32 m_ExponentialFade; // 0-200
+
+ QT3DSF32 m_AreaWidth; // 0.01-inf
+ QT3DSF32 m_AreaHeight; // 0.01-inf
+
+ bool m_CastShadow; // true if this light produce shadows
+ QT3DSF32 m_ShadowBias; // depth shift to avoid self-shadowing artifacts
+ QT3DSF32 m_ShadowFactor; // Darkening factor for ESMs
+ QT3DSU32 m_ShadowMapRes; // Resolution of shadow map
+ QT3DSF32 m_ShadowMapFar; // Far clip plane for the shadow map
+ QT3DSF32 m_ShadowMapFov; // Field of View for the shadow map
+ QT3DSF32 m_ShadowFilter; // Shadow map filter step size
+
+ // Defaults to directional light
+ SLight();
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SNode::Remap(inRemapper);
+ inRemapper.Remap(m_Scope);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderLightmaps.cpp b/src/runtimerender/graphobjects/Qt3DSRenderLightmaps.cpp
new file mode 100644
index 0000000..0e5e6c6
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderLightmaps.cpp
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderLightmaps.h"
+
+using namespace qt3ds::render;
+
+SLightmaps::SLightmaps()
+ : SGraphObject(GraphObjectTypes::Lightmaps)
+ , m_LightmapIndirect(NULL)
+ , m_LightmapRadiosity(NULL)
+ , m_LightmapShadow(NULL)
+{
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderLightmaps.h b/src/runtimerender/graphobjects/Qt3DSRenderLightmaps.h
new file mode 100644
index 0000000..4480aea
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderLightmaps.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef QT3DS_RENDER_LIGHTMAPS_H
+#define QT3DS_RENDER_LIGHTMAPS_H
+
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRenderMaterialDirty.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct MaterialLightmapsUsage
+ {
+ enum Enum {
+ Dynamic = 0,
+ Baked,
+ DynamicAndBaked,
+ };
+ };
+
+ struct QT3DS_AUTOTEST_EXPORT SLightmaps : public SGraphObject
+ {
+ CMaterialDirty m_Dirty;
+
+ SImage *m_LightmapIndirect;
+ SImage *m_LightmapRadiosity;
+ SImage *m_LightmapShadow;
+
+ SLightmaps();
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_LightmapIndirect);
+ inRemapper.Remap(m_LightmapRadiosity);
+ inRemapper.Remap(m_LightmapShadow);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderMaterialDirty.h b/src/runtimerender/graphobjects/Qt3DSRenderMaterialDirty.h
new file mode 100644
index 0000000..c04c1b6
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderMaterialDirty.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_MATERIAL_DIRTY_H
+#define QT3DS_RENDER_MATERIAL_DIRTY_H
+
+namespace qt3ds {
+namespace render {
+ class CMaterialDirty
+ {
+ private:
+ bool m_Dirty;
+ bool m_DirtyFlagWithInFrame;
+
+ public:
+ CMaterialDirty()
+ : m_Dirty(true)
+ , m_DirtyFlagWithInFrame(m_Dirty)
+ {
+ }
+
+ void SetDirty() { m_Dirty = m_DirtyFlagWithInFrame = true; }
+ bool IsDirty() const { return m_Dirty || m_DirtyFlagWithInFrame; }
+ void ClearDirty() { m_DirtyFlagWithInFrame = m_Dirty = false; }
+ void UpdateDirtyForFrame()
+ {
+ m_DirtyFlagWithInFrame = m_Dirty;
+ m_Dirty = false;
+ }
+ };
+}
+}
+
+#endif // QT3DS_RENDER_MATERIAL_DIRTY_H
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderModel.cpp b/src/runtimerender/graphobjects/Qt3DSRenderModel.cpp
new file mode 100644
index 0000000..a78396c
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderModel.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderModel.h"
+#include "Qt3DSRenderMaterialHelpers.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderMesh.h"
+
+using namespace qt3ds::render;
+
+SModel::SModel()
+ : SNode(GraphObjectTypes::Model)
+ , m_FirstMaterial(NULL)
+ , m_SkeletonRoot(-1)
+ , m_TessellationMode(TessModeValues::NoTess)
+ , m_EdgeTess(1.0)
+ , m_InnerTess(1.0)
+ , m_WireframeMode(false)
+ , m_ShadowCaster(true)
+{
+}
+
+void SModel::AddMaterial(SGraphObject &inMaterial)
+{
+ if (m_FirstMaterial == NULL)
+ m_FirstMaterial = &inMaterial;
+ else {
+ SGraphObject *lastMaterial;
+ // empty loop intentional
+ for (lastMaterial = m_FirstMaterial; lastMaterial && GetNextMaterialSibling(lastMaterial);
+ lastMaterial = GetNextMaterialSibling(lastMaterial)) {
+ }
+ SetNextMaterialSibling(*lastMaterial, &inMaterial);
+ }
+ if (inMaterial.m_Type == GraphObjectTypes::DefaultMaterial)
+ static_cast<SDefaultMaterial &>(inMaterial).m_Parent = this;
+}
+
+NVBounds3 SModel::GetModelBounds(IBufferManager &inManager) const
+{
+ NVBounds3 retval;
+ retval.setEmpty();
+ SRenderMesh *theMesh = inManager.LoadMesh(m_MeshPath);
+ if (theMesh) {
+ for (QT3DSU32 idx = 0, end = theMesh->m_Subsets.size(); idx < end; ++idx)
+ retval.include(theMesh->m_Subsets[idx].m_Bounds);
+ }
+ return retval;
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderModel.h b/src/runtimerender/graphobjects/Qt3DSRenderModel.h
new file mode 100644
index 0000000..cc5c4e2
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderModel.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_MODEL_H
+#define QT3DS_RENDER_MODEL_H
+
+#include "Qt3DSRenderNode.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderTessModeValues.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SDefaultMaterial;
+ class IBufferManager;
+
+ struct QT3DS_AUTOTEST_EXPORT SModel : public SNode
+ {
+ // Complete path to the file;
+ //*not* relative to the presentation directory
+ CRegisteredString m_MeshPath;
+ SGraphObject *m_FirstMaterial;
+ QT3DSI32 m_SkeletonRoot;
+ TessModeValues::Enum m_TessellationMode;
+ QT3DSF32 m_EdgeTess;
+ QT3DSF32 m_InnerTess;
+ bool m_WireframeMode;
+ bool m_ShadowCaster;
+
+ SModel();
+
+ void AddMaterial(SGraphObject &inMaterial);
+
+ NVBounds3 GetModelBounds(IBufferManager &inManager) const;
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SNode::Remap(inRemapper);
+ inRemapper.RemapMaterial(m_FirstMaterial);
+ inRemapper.Remap(m_MeshPath);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderNode.cpp b/src/runtimerender/graphobjects/Qt3DSRenderNode.cpp
new file mode 100644
index 0000000..bf47bb8
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderNode.cpp
@@ -0,0 +1,499 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderModel.h"
+#include "Qt3DSRenderNode.h"
+#include "Qt3DSRenderText.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRenderPathManager.h"
+#include "Qt3DSRenderPath.h"
+
+using namespace qt3ds::render;
+
+SNode::SNode(GraphObjectTypes::Enum inGraphObjectType)
+ : SGraphObject(inGraphObjectType)
+ , m_Rotation(0, 0, 0) // Radians
+ , m_Position(0, 0, 0)
+ , m_Scale(1, 1, 1)
+ , m_Pivot(0, 0, 0)
+ , m_RotationOrder(EulOrdYXZs)
+ , m_LocalOpacity(1.0f)
+ , m_GlobalOpacity(1.0f)
+ , m_SkeletonId(-1)
+ , m_Parent(NULL)
+ , m_NextSibling(NULL)
+ , m_PreviousSibling(NULL)
+ , m_FirstChild(NULL)
+ , m_DFSIndex(0)
+{
+ m_Flags.SetDirty(true);
+ m_Flags.SetTransformDirty(true);
+ m_Flags.SetLeftHanded(true);
+ m_Flags.SetActive(true);
+ m_Flags.SetLocallyPickable(true);
+}
+
+SNode::SNode(const SNode &inCloningObject, NVAllocatorCallback &inAllocator)
+ : SGraphObject(inCloningObject, inAllocator)
+ , m_Rotation(inCloningObject.m_Rotation) // Radians
+ , m_Position(inCloningObject.m_Position)
+ , m_Scale(inCloningObject.m_Scale)
+ , m_Pivot(inCloningObject.m_Pivot)
+ , m_RotationOrder(inCloningObject.m_RotationOrder)
+ , m_LocalOpacity(inCloningObject.m_LocalOpacity)
+ , m_LocalTransform(inCloningObject.m_LocalTransform)
+ , m_GlobalTransform(inCloningObject.m_GlobalTransform)
+ , m_GlobalOpacity(inCloningObject.m_GlobalOpacity)
+ , m_SkeletonId(inCloningObject.m_SkeletonId)
+ , m_Parent(NULL)
+ , m_NextSibling(NULL)
+ , m_PreviousSibling(NULL)
+ , m_FirstChild(NULL)
+ , m_DFSIndex(0)
+{
+ m_Flags.SetDirty(true);
+ m_Flags.SetTransformDirty(true);
+ m_Flags.SetLeftHanded(true);
+ m_Flags.SetActive(true);
+ m_Flags.SetLocallyPickable(true);
+
+ // for ( SNode* theChild = m_FirstChild; theChild != NULL; theChild = theChild->m_NextSibling )
+ //{
+ // SNode* theClonedChild = static_cast<SNode*>( CGraphObjectFactory::CloneGraphObject(
+ //*theChild, inAllocator ) );
+ // AddChild( *theClonedChild );
+ //}
+}
+
+// Sets this object dirty and walks down the graph setting all
+// children who are not dirty to be dirty.
+void SNode::MarkDirty(NodeTransformDirtyFlag::Enum inTransformDirty)
+{
+ if (m_Flags.IsTransformDirty() == false)
+ m_Flags.SetTransformDirty(inTransformDirty != NodeTransformDirtyFlag::TransformNotDirty);
+ if (m_Flags.IsDirty() == false) {
+ m_Flags.SetDirty(true);
+ for (SNode *child = m_FirstChild; child; child = child->m_NextSibling)
+ child->MarkDirty(inTransformDirty);
+ }
+}
+
+// Calculate global transform and opacity
+// Walks up the graph ensure all parents are not dirty so they have
+// valid global transforms.
+
+bool SNode::CalculateGlobalVariables()
+{
+ bool retval = m_Flags.IsDirty();
+ if (retval) {
+ m_Flags.SetDirty(false);
+ if (m_Flags.IsTransformDirty())
+ CalculateLocalTransform();
+ m_GlobalOpacity = m_LocalOpacity;
+ if (m_Parent) {
+ // Layer transforms do not flow down but affect the final layer's rendered
+ // representation.
+ retval = m_Parent->CalculateGlobalVariables() || retval;
+ if (m_Parent->m_Type != GraphObjectTypes::Layer) {
+ m_GlobalOpacity *= m_Parent->m_GlobalOpacity;
+ if (m_Flags.IsIgnoreParentTransform() == false)
+ m_GlobalTransform = m_Parent->m_GlobalTransform * m_LocalTransform;
+ else
+ m_GlobalTransform = m_LocalTransform;
+ } else
+ m_GlobalTransform = m_LocalTransform;
+
+ m_Flags.SetGlobalActive(m_Flags.IsActive() && m_Parent->m_Flags.IsGloballyActive());
+ m_Flags.SetGloballyPickable(m_Flags.IsLocallyPickable()
+ || m_Parent->m_Flags.IsGloballyPickable());
+ } else {
+ m_GlobalTransform = m_LocalTransform;
+ m_Flags.SetGlobalActive(m_Flags.IsActive());
+ m_Flags.SetGloballyPickable(m_Flags.IsLocallyPickable());
+ }
+ }
+ // We always clear dirty in a reasonable manner but if we aren't active
+ // there is no reason to tell the universe if we are dirty or not.
+ return retval && m_Flags.IsActive();
+}
+
+// Create some mapping of euler angles to their axis mapping.
+#define ITERATE_POSSIBLE_EULER_ANGLES \
+ HANDLE_EULER_ANGLE(EulOrdXYZs, X, Y, Z) \
+ HANDLE_EULER_ANGLE(EulOrdXYXs, X, Y, X) \
+ HANDLE_EULER_ANGLE(EulOrdXZYs, X, Z, Y) \
+ HANDLE_EULER_ANGLE(EulOrdXZXs, X, Z, X) \
+ HANDLE_EULER_ANGLE(EulOrdYZXs, Y, Z, X) \
+ HANDLE_EULER_ANGLE(EulOrdYZYs, Y, Z, Y) \
+ HANDLE_EULER_ANGLE(EulOrdYXZs, Y, X, Z) \
+ HANDLE_EULER_ANGLE(EulOrdYXYs, Y, X, Y) \
+ HANDLE_EULER_ANGLE(EulOrdZXYs, Z, X, Y) \
+ HANDLE_EULER_ANGLE(EulOrdZXZs, Z, X, Z) \
+ HANDLE_EULER_ANGLE(EulOrdZYXs, Z, Y, X) \
+ HANDLE_EULER_ANGLE(EulOrdZYZs, Z, Y, Z) \
+ HANDLE_EULER_ANGLE(EulOrdZYXr, Z, Y, X) \
+ HANDLE_EULER_ANGLE(EulOrdXYXr, X, Y, X) \
+ HANDLE_EULER_ANGLE(EulOrdYZXr, Y, Z, X) \
+ HANDLE_EULER_ANGLE(EulOrdXZXr, X, Z, X) \
+ HANDLE_EULER_ANGLE(EulOrdXZYr, X, Z, Y) \
+ HANDLE_EULER_ANGLE(EulOrdYZYr, Y, Z, Y) \
+ HANDLE_EULER_ANGLE(EulOrdZXYr, Z, X, Y) \
+ HANDLE_EULER_ANGLE(EulOrdYXYr, Y, X, Y) \
+ HANDLE_EULER_ANGLE(EulOrdYXZr, Y, X, Z) \
+ HANDLE_EULER_ANGLE(EulOrdZXZr, Z, X, Z) \
+ HANDLE_EULER_ANGLE(EulOrdXYZr, X, Y, Z) \
+ HANDLE_EULER_ANGLE(EulOrdZYZr, Z, Y, Z)
+
+inline EulerAngles RotationAndOrderToShoemake(QT3DSVec3 inRotation, QT3DSU32 inOrder)
+{
+ EulerAngles retval;
+ retval.w = (QT3DSF32)inOrder;
+ int X = 0;
+ int Y = 1;
+ int Z = 2;
+
+ switch (inOrder) {
+#define HANDLE_EULER_ANGLE(order, xIdx, yIdx, zIdx) \
+ case order: \
+ retval.x = -inRotation[xIdx]; \
+ retval.y = -inRotation[yIdx]; \
+ retval.z = -inRotation[zIdx]; \
+ break;
+ ITERATE_POSSIBLE_EULER_ANGLES
+#undef HANDLE_EULER_ANGLE
+ default:
+ QT3DS_ASSERT(false);
+ retval.x = inRotation[X];
+ retval.y = inRotation[Y];
+ retval.z = inRotation[Z];
+ break;
+ }
+ return retval;
+}
+
+QT3DSVec3 SNode::GetRotationVectorFromRotationMatrix(const QT3DSMat33 &inMatrix) const
+{
+ QT3DSMat44 theConvertMatrix(inMatrix, QT3DSVec3(0, 0, 0));
+ if (m_Flags.IsLeftHanded())
+ SNode::FlipCoordinateSystem(theConvertMatrix);
+ qt3ds::render::CEulerAngleConverter theConverter;
+ qt3ds::render::HMatrix *theHMatrix =
+ reinterpret_cast<qt3ds::render::HMatrix *>(theConvertMatrix.front());
+ qt3ds::render::EulerAngles theAngles = theConverter.Eul_FromHMatrix(*theHMatrix, m_RotationOrder);
+ return GetRotationVectorFromEulerAngles(theAngles);
+}
+
+QT3DSVec3 SNode::GetRotationVectorFromEulerAngles(const EulerAngles &inAngles)
+{
+ QT3DSVec3 retval(0, 0, 0);
+ int X = 0;
+ int Y = 1;
+ int Z = 2;
+ switch ((int)inAngles.w) {
+#define HANDLE_EULER_ANGLE(order, xIdx, yIdx, zIdx) \
+ case order: \
+ retval[xIdx] = -inAngles.x; \
+ retval[yIdx] = -inAngles.y; \
+ retval[zIdx] = -inAngles.z; \
+ break;
+ ITERATE_POSSIBLE_EULER_ANGLES
+#undef HANDLE_EULER_ANGLE
+ default:
+ QT3DS_ASSERT(false);
+ retval.x = inAngles.x;
+ retval.y = inAngles.y;
+ retval.z = inAngles.z;
+ break;
+ }
+
+ return retval;
+}
+
+void SNode::CalculateRotationMatrix(QT3DSMat44 &outMatrix) const
+{
+ StaticAssert<sizeof(QT3DSMat44) == sizeof(HMatrix)>::valid_expression();
+ CEulerAngleConverter theConverter;
+ EulerAngles theAngles(RotationAndOrderToShoemake(m_Rotation, (int)m_RotationOrder));
+ HMatrix *theMatrix = reinterpret_cast<HMatrix *>(&outMatrix);
+ theConverter.Eul_ToHMatrix(theAngles, *theMatrix);
+}
+
+void SNode::FlipCoordinateSystem(QT3DSMat44 &inMatrix)
+{
+ QT3DSF32 *writePtr(inMatrix.front());
+ // rotation conversion
+ writePtr[0 * 4 + 2] *= -1;
+ writePtr[1 * 4 + 2] *= -1;
+ writePtr[2 * 4 + 0] *= -1;
+ writePtr[2 * 4 + 1] *= -1;
+
+ // translation conversion
+ writePtr[3 * 4 + 2] *= -1;
+}
+
+void SNode::CalculateLocalTransform()
+{
+ m_Flags.SetTransformDirty(false);
+ bool leftHanded = m_Flags.IsLeftHanded();
+ m_LocalTransform = QT3DSMat44::createIdentity();
+ m_GlobalTransform = m_LocalTransform;
+ QT3DSF32 *writePtr = m_LocalTransform.front();
+ QT3DSVec3 theScaledPivot(-m_Pivot[0] * m_Scale[0], -m_Pivot[1] * m_Scale[1],
+ -m_Pivot[2] * m_Scale[2]);
+ m_LocalTransform.column0[0] = m_Scale[0];
+ m_LocalTransform.column1[1] = m_Scale[1];
+ m_LocalTransform.column2[2] = m_Scale[2];
+
+ writePtr[12] = theScaledPivot[0];
+ writePtr[13] = theScaledPivot[1];
+ if (leftHanded)
+ writePtr[14] = theScaledPivot[2];
+ else
+ writePtr[14] = -theScaledPivot[2];
+
+ QT3DSMat44 theRotationTransform;
+ CalculateRotationMatrix(theRotationTransform);
+ // may need column conversion in here somewhere.
+ m_LocalTransform = theRotationTransform * m_LocalTransform;
+
+ writePtr[12] += m_Position[0];
+ writePtr[13] += m_Position[1];
+ if (leftHanded)
+ writePtr[14] = writePtr[14] + m_Position[2];
+ else
+ writePtr[14] = writePtr[14] - m_Position[2];
+
+ if (leftHanded) {
+ FlipCoordinateSystem(m_LocalTransform);
+ }
+}
+
+void SNode::SetLocalTransformFromMatrix(QT3DSMat44 &inTransform)
+{
+ m_Flags.SetTransformDirty(true);
+
+ // clear pivot
+ m_Pivot[0] = m_Pivot[1] = m_Pivot[2] = 0.0f;
+
+ // set translation
+ m_Position[0] = inTransform[3][0];
+ m_Position[1] = inTransform[3][1];
+ m_Position[2] = inTransform[3][2];
+ // set scale
+ m_Scale[0] = inTransform.column0.magnitude();
+ m_Scale[1] = inTransform.column1.magnitude();
+ m_Scale[2] = inTransform.column2.magnitude();
+
+ // make sure there is no zero value
+ m_Scale[0] = (m_Scale[0] == 0.0) ? 1.0f : m_Scale[0];
+ m_Scale[1] = (m_Scale[1] == 0.0) ? 1.0f : m_Scale[1];
+ m_Scale[2] = (m_Scale[2] == 0.0) ? 1.0f : m_Scale[2];
+
+ // extract rotation by first dividing through scale value
+ float invScaleX = 1.0f / m_Scale[0];
+ float invScaleY = 1.0f / m_Scale[1];
+ float invScaleZ = 1.0f / m_Scale[2];
+
+ inTransform[0][0] *= invScaleX;
+ inTransform[0][1] *= invScaleX;
+ inTransform[0][2] *= invScaleX;
+ inTransform[1][0] *= invScaleY;
+ inTransform[1][1] *= invScaleY;
+ inTransform[1][2] *= invScaleY;
+ inTransform[2][0] *= invScaleZ;
+ inTransform[2][1] *= invScaleZ;
+ inTransform[2][2] *= invScaleZ;
+
+ QT3DSMat33 theRotationMatrix(inTransform.column0.getXYZ(), inTransform.column1.getXYZ(),
+ inTransform.column2.getXYZ());
+ m_Rotation = GetRotationVectorFromRotationMatrix(theRotationMatrix);
+}
+
+void SNode::AddChild(SNode &inChild)
+{
+ if (inChild.m_Parent)
+ inChild.m_Parent->RemoveChild(inChild);
+ inChild.m_Parent = this;
+ if (m_FirstChild == nullptr) {
+ m_FirstChild = &inChild;
+ inChild.m_NextSibling = nullptr;
+ inChild.m_PreviousSibling = nullptr;
+ } else {
+ SNode *lastChild = GetLastChild();
+ if (lastChild) {
+ lastChild->m_NextSibling = &inChild;
+ inChild.m_PreviousSibling = lastChild;
+ inChild.m_NextSibling = nullptr;
+ } else {
+ QT3DS_ASSERT(false); // no last child but first child isn't null?
+ }
+ }
+}
+
+void SNode::RemoveChild(SNode &inChild)
+{
+ if (inChild.m_Parent != this) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ for (SNode *child = m_FirstChild; child; child = child->m_NextSibling) {
+ if (child == &inChild) {
+ if (child->m_PreviousSibling)
+ child->m_PreviousSibling->m_NextSibling = child->m_NextSibling;
+ if (child->m_NextSibling)
+ child->m_NextSibling->m_PreviousSibling = child->m_PreviousSibling;
+ child->m_Parent = NULL;
+ if (m_FirstChild == child)
+ m_FirstChild = child->m_NextSibling;
+ child->m_NextSibling = NULL;
+ child->m_PreviousSibling = NULL;
+ return;
+ }
+ }
+ QT3DS_ASSERT(false);
+}
+
+SNode *SNode::GetLastChild()
+{
+ SNode *lastChild = NULL;
+ // empty loop intentional
+ for (lastChild = m_FirstChild; lastChild && lastChild->m_NextSibling;
+ lastChild = lastChild->m_NextSibling) {
+ }
+ return lastChild;
+}
+
+void SNode::RemoveFromGraph()
+{
+ if (m_Parent)
+ m_Parent->RemoveChild(*this);
+
+ m_NextSibling = NULL;
+
+ // Orphan all of my children.
+ SNode *nextSibling = NULL;
+ for (SNode *child = m_FirstChild; child != NULL; child = nextSibling) {
+ child->m_PreviousSibling = NULL;
+ child->m_Parent = NULL;
+ nextSibling = child->m_NextSibling;
+ child->m_NextSibling = NULL;
+ }
+}
+
+NVBounds3 SNode::GetBounds(IBufferManager &inManager, IPathManager &inPathManager,
+ bool inIncludeChildren, IQt3DSRenderNodeFilter *inChildFilter) const
+{
+ NVBounds3 retval;
+ retval.setEmpty();
+ if (inIncludeChildren)
+ retval = GetChildBounds(inManager, inPathManager, inChildFilter);
+
+ if (m_Type == GraphObjectTypes::Model)
+ retval.include(static_cast<const SModel *>(this)->GetModelBounds(inManager));
+ else if (m_Type == GraphObjectTypes::Text)
+ retval.include(static_cast<const SText *>(this)->GetTextBounds());
+ else if (m_Type == GraphObjectTypes::Path)
+ retval.include(inPathManager.GetBounds(*static_cast<const SPath *>(this)));
+ return retval;
+}
+
+NVBounds3 SNode::GetChildBounds(IBufferManager &inManager, IPathManager &inPathManager,
+ IQt3DSRenderNodeFilter *inChildFilter) const
+{
+ NVBounds3 retval;
+ retval.setEmpty();
+ for (SNode *child = m_FirstChild; child != NULL; child = child->m_NextSibling) {
+ if (inChildFilter == NULL || inChildFilter->IncludeNode(*child)) {
+ NVBounds3 childBounds;
+ if (child->m_Flags.IsTransformDirty())
+ child->CalculateLocalTransform();
+ childBounds = child->GetBounds(inManager, inPathManager);
+ if (childBounds.isEmpty() == false) {
+ // Transform the bounds into our local space.
+ childBounds.transform(child->m_LocalTransform);
+ retval.include(childBounds);
+ }
+ }
+ }
+ return retval;
+}
+
+QT3DSVec3 SNode::GetGlobalPos() const
+{
+ return m_GlobalTransform.getPosition();
+}
+
+QT3DSVec3 SNode::GetDirection() const
+{
+ const QT3DSF32 *dataPtr(m_GlobalTransform.front());
+ QT3DSVec3 retval(dataPtr[8], dataPtr[9], dataPtr[10]);
+ retval.normalize();
+ return retval;
+}
+
+QT3DSVec3 SNode::GetScalingCorrectDirection() const
+{
+ QT3DSMat33 theDirMatrix(m_GlobalTransform.getUpper3x3().getInverse().getTranspose());
+ QT3DSVec3 theOriginalDir(0, 0, -1);
+ QT3DSVec3 retval = theDirMatrix.transform(theOriginalDir);
+ retval.normalize();
+ return retval;
+}
+
+QT3DSVec3 SNode::GetGlobalPivot() const
+{
+ QT3DSVec3 retval(m_Position);
+ retval.z *= -1;
+
+ if (m_Parent && m_Parent->m_Type != GraphObjectTypes::Layer)
+ return m_Parent->m_GlobalTransform.transform(retval);
+
+ return retval;
+}
+
+void SNode::CalculateMVPAndNormalMatrix(const QT3DSMat44 &inViewProjection, QT3DSMat44 &outMVP,
+ QT3DSMat33 &outNormalMatrix) const
+{
+ outMVP = inViewProjection * m_GlobalTransform;
+ CalculateNormalMatrix(outNormalMatrix);
+}
+
+void SNode::GetMatrixUpper3x3(QT3DSMat33 &outDest, const QT3DSMat44 &inSrc)
+{
+ outDest.column0 = QT3DSVec3(inSrc.column0[0], inSrc.column0[1], inSrc.column0[2]);
+ outDest.column1 = QT3DSVec3(inSrc.column1[0], inSrc.column1[1], inSrc.column1[2]);
+ outDest.column2 = QT3DSVec3(inSrc.column2[0], inSrc.column2[1], inSrc.column2[2]);
+}
+
+void SNode::CalculateNormalMatrix(QT3DSMat33 &outNormalMatrix) const
+{
+ GetMatrixUpper3x3(outNormalMatrix, m_GlobalTransform);
+ outNormalMatrix = outNormalMatrix.getInverse().getTranspose();
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderNode.h b/src/runtimerender/graphobjects/Qt3DSRenderNode.h
new file mode 100644
index 0000000..87a1500
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderNode.h
@@ -0,0 +1,307 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_NODE_H
+#define QT3DS_RENDER_NODE_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "foundation/Qt3DSMat44.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/Qt3DSNoCopy.h"
+#include "Qt3DSRenderEulerAngles.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SModel;
+ struct SLight;
+ struct SCamera;
+ struct SText;
+ struct SNode;
+ class IBufferManager;
+
+ class INodeQueue
+ {
+ protected:
+ virtual ~INodeQueue() {}
+ public:
+ virtual void Enqueue(SModel &inModel) = 0;
+ virtual void Enqueue(SLight &inLight) = 0;
+ virtual void Enqueue(SCamera &inCamera) = 0;
+ // virtual void Enqueue( SText& inText ) = 0;
+ };
+
+ struct NodeFlagValues
+ {
+ enum Enum {
+ Dirty = 1,
+ TransformDirty = 1 << 1,
+ Active = 1 << 2, ///< Is this exact object active
+ LeftHanded = 1 << 3,
+ Orthographic = 1 << 4,
+ PointLight = 1 << 5,
+ GlobalActive = 1 << 6, ///< set based in Active and if a parent is active.
+ TextDirty = 1 << 7,
+ LocallyPickable = 1 << 8,
+ GloballyPickable = 1 << 9,
+ LayerEnableDepthTest = 1 << 10,
+ LayerRenderToTarget = 1 << 11, ///< Does this layer render to the normal render target,
+ ///or is it offscreen-only
+ ForceLayerOffscreen = 1 << 12, ///< Forces a layer to always use the offscreen rendering
+ ///mechanism. This can be usefulf or caching purposes.
+ IgnoreParentTransform = 1 << 13,
+ LayerEnableDepthPrePass = 1 << 14, ///< True when we render a depth pass before
+ };
+ };
+
+ struct NodeTransformDirtyFlag
+ {
+ enum Enum {
+ TransformNotDirty,
+ TransformIsDirty,
+ };
+ };
+ struct NodeFlags : public NVFlags<NodeFlagValues::Enum, QT3DSU32>
+ {
+ NodeFlags()
+ : NVFlags<NodeFlagValues::Enum, QT3DSU32>((QT3DSU32)0)
+ {
+ }
+ void ClearOrSet(bool value, NodeFlagValues::Enum enumVal) { clearOrSet(value, enumVal); }
+ void SetActive(bool value) { ClearOrSet(value, NodeFlagValues::Active); }
+ bool IsActive() const { return this->operator&(NodeFlagValues::Active); }
+
+ void SetGlobalActive(bool value) { ClearOrSet(value, NodeFlagValues::GlobalActive); }
+ bool IsGloballyActive() const { return this->operator&(NodeFlagValues::GlobalActive); }
+
+ void SetTransformDirty(bool value) { ClearOrSet(value, NodeFlagValues::TransformDirty); }
+ bool IsTransformDirty() const { return this->operator&(NodeFlagValues::TransformDirty); }
+
+ void SetDirty(bool value) { ClearOrSet(value, NodeFlagValues::Dirty); }
+ bool IsDirty() const { return this->operator&(NodeFlagValues::Dirty); }
+
+ bool IsLeftHanded() const { return this->operator&(NodeFlagValues::LeftHanded); }
+ void SetLeftHanded(bool value) { ClearOrSet(value, NodeFlagValues::LeftHanded); }
+
+ bool IsOrthographic() const { return this->operator&(NodeFlagValues::Orthographic); }
+ void SetOrthographic(bool value) { ClearOrSet(value, NodeFlagValues::Orthographic); }
+
+ bool IsPointLight() const { return this->operator&(NodeFlagValues::PointLight); }
+ void SetPointLight(bool value) { ClearOrSet(value, NodeFlagValues::PointLight); }
+
+ bool IsTextDirty() const { return this->operator&(NodeFlagValues::TextDirty); }
+ void SetTextDirty(bool value) { ClearOrSet(value, NodeFlagValues::TextDirty); }
+
+ bool IsLocallyPickable() const { return this->operator&(NodeFlagValues::LocallyPickable); }
+ void SetLocallyPickable(bool value) { ClearOrSet(value, NodeFlagValues::LocallyPickable); }
+
+ bool IsGloballyPickable() const
+ {
+ return this->operator&(NodeFlagValues::GloballyPickable);
+ }
+ void SetGloballyPickable(bool value)
+ {
+ ClearOrSet(value, NodeFlagValues::GloballyPickable);
+ }
+
+ bool IsLayerRenderToTarget() const
+ {
+ return this->operator&(NodeFlagValues::LayerRenderToTarget);
+ }
+ void SetLayerRenderToTarget(bool value)
+ {
+ ClearOrSet(value, NodeFlagValues::LayerRenderToTarget);
+ }
+
+ bool IsLayerEnableDepthTest() const
+ {
+ return this->operator&(NodeFlagValues::LayerEnableDepthTest);
+ }
+ void SetLayerEnableDepthTest(bool value)
+ {
+ ClearOrSet(value, NodeFlagValues::LayerEnableDepthTest);
+ }
+
+ bool IsForceLayerOffscreen() const
+ {
+ return this->operator&(NodeFlagValues::ForceLayerOffscreen);
+ }
+ void SetForceLayerOffscreen(bool value)
+ {
+ ClearOrSet(value, NodeFlagValues::ForceLayerOffscreen);
+ }
+
+ bool IsIgnoreParentTransform() const
+ {
+ return this->operator&(NodeFlagValues::IgnoreParentTransform);
+ }
+ void SetIgnoreParentTransform(bool value)
+ {
+ ClearOrSet(value, NodeFlagValues::IgnoreParentTransform);
+ }
+
+ bool IsLayerEnableDepthPrepass() const
+ {
+ return this->operator&(NodeFlagValues::LayerEnableDepthPrePass);
+ }
+ void SetLayerEnableDepthPrepass(bool value)
+ {
+ ClearOrSet(value, NodeFlagValues::LayerEnableDepthPrePass);
+ }
+ };
+
+ struct QT3DS_AUTOTEST_EXPORT SNode : public SGraphObject
+ {
+ // changing any one of these means you have to
+ // set this object dirty
+ QT3DSVec3 m_Rotation; // Radians
+ QT3DSVec3 m_Position;
+ QT3DSVec3 m_Scale;
+ QT3DSVec3 m_Pivot;
+ QT3DSU32 m_RotationOrder; // UICEulerOrder::EulOrd, defaults YXZs
+
+ // This only sets dirty, not transform dirty
+ // Opacity of 1 means opaque, opacity of zero means transparent.
+ QT3DSF32 m_LocalOpacity;
+
+ // results of clearing dirty.
+ NodeFlags m_Flags;
+ // These end up right handed
+ QT3DSMat44 m_LocalTransform;
+ QT3DSMat44 m_GlobalTransform;
+ QT3DSF32 m_GlobalOpacity;
+ QT3DSI32 m_SkeletonId;
+
+ // node graph members.
+ SNode *m_Parent;
+ SNode *m_NextSibling;
+ SNode *m_PreviousSibling;
+ SNode *m_FirstChild;
+ // Property maintained solely by the render system.
+ // Depth-first-search index assigned and maintained by render system.
+ QT3DSU32 m_DFSIndex;
+
+ SNode(GraphObjectTypes::Enum inType = GraphObjectTypes::Node);
+ SNode(const SNode &inCloningObject, NVAllocatorCallback &inAllocator);
+ ~SNode() {}
+
+ // Sets this object dirty and walks down the graph setting all
+ // children who are not dirty to be dirty.
+ void MarkDirty(NodeTransformDirtyFlag::Enum inTransformDirty =
+ NodeTransformDirtyFlag::TransformNotDirty);
+
+ void AddChild(SNode &inChild);
+ void RemoveChild(SNode &inChild);
+ SNode *GetLastChild();
+
+ // Remove this node from the graph.
+ // It is no longer the the parent's child lists
+ // and all of its children no longer have a parent
+ // finally they are no longer siblings of each other.
+ void RemoveFromGraph();
+
+ // Calculate global transform and opacity
+ // Walks up the graph ensure all parents are not dirty so they have
+ // valid global transforms.
+ bool CalculateGlobalVariables();
+
+ // Given our rotation order and handedness, calculate the final rotation matrix
+ // Only the upper 3x3 of this matrix is filled in.
+ // If this object is left handed, then you need to call FlipCoordinateSystem
+ // to get a result identical to the result produced in CalculateLocalTransform
+ void CalculateRotationMatrix(QT3DSMat44 &outMatrix) const;
+
+ // Get a rotation vector that would produce the given 3x.3 matrix.
+ // Takes m_RotationOrder and m_Flags.IsLeftHandled into account.
+ // Returns a rotation vector in radians.
+ QT3DSVec3 GetRotationVectorFromRotationMatrix(const QT3DSMat33 &inMatrix) const;
+
+ static QT3DSVec3 GetRotationVectorFromEulerAngles(const EulerAngles &inAngles);
+
+ // Flip a matrix from left-handed to right-handed and vice versa
+ static void FlipCoordinateSystem(QT3DSMat44 &ioMatrix);
+
+ // Force the calculation of the local transform
+ void CalculateLocalTransform();
+
+ /**
+ * @brief setup local tranform from a matrix.
+ * This function decomposes a SRT matrix.
+ * This will fail if this matrix contains non-affine transformations
+ *
+ * @param inTransform[in] input transformation
+ *
+ * @return true backend type
+ */
+ void SetLocalTransformFromMatrix(QT3DSMat44 &inTransform);
+
+ // Get the bounds of us and our children in our local space.
+ NVBounds3 GetBounds(IBufferManager &inManager, IPathManager &inPathManager,
+ bool inIncludeChildren = true,
+ IQt3DSRenderNodeFilter *inChildFilter = NULL) const;
+ NVBounds3 GetChildBounds(IBufferManager &inManager, IPathManager &inPathManager,
+ IQt3DSRenderNodeFilter *inChildFilter = NULL) const;
+ // Assumes CalculateGlobalVariables has already been called.
+ QT3DSVec3 GetGlobalPos() const;
+ QT3DSVec3 GetGlobalPivot() const;
+ // Pulls the 3rd column out of the global transform.
+ QT3DSVec3 GetDirection() const;
+ // Multiplies (0,0,-1) by the inverse transpose of the upper 3x3 of the global transform.
+ // This is correct w/r/t to scaling and which the above getDirection is not.
+ QT3DSVec3 GetScalingCorrectDirection() const;
+
+ // outMVP and outNormalMatrix are returned ready to upload to openGL, meaning they are
+ // row-major.
+ void CalculateMVPAndNormalMatrix(const QT3DSMat44 &inViewProjection, QT3DSMat44 &outMVP,
+ QT3DSMat33 &outNormalMatrix) const;
+
+ // This should be in a utility file somewhere
+ static void GetMatrixUpper3x3(QT3DSMat33 &inDest, const QT3DSMat44 &inSrc);
+ void CalculateNormalMatrix(QT3DSMat33 &outNormalMatrix) const;
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_Parent);
+ inRemapper.Remap(m_FirstChild);
+ inRemapper.Remap(m_NextSibling);
+ inRemapper.Remap(m_PreviousSibling);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderPath.cpp b/src/runtimerender/graphobjects/Qt3DSRenderPath.cpp
new file mode 100644
index 0000000..bc63768
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderPath.cpp
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderPath.h"
+#include "Qt3DSRenderPathSubPath.h"
+
+using namespace qt3ds::render;
+
+void SPath::AddSubPath(SPathSubPath &inSegment)
+{
+ SPathSubPath *lastSegment = NULL;
+ inSegment.m_Path = this;
+ inSegment.m_NextSubPath = NULL;
+ if (m_FirstSubPath) {
+ // find last segment
+ for (lastSegment = m_FirstSubPath; lastSegment && lastSegment->m_NextSubPath;
+ lastSegment = lastSegment->m_NextSubPath)
+ ;
+ lastSegment->m_NextSubPath = &inSegment;
+ } else
+ m_FirstSubPath = &inSegment;
+}
+
+void SPath::ClearSubPaths()
+{
+ SPathSubPath *nextSegment = NULL;
+ for (SPathSubPath *theSegment = m_FirstSubPath; theSegment; theSegment = nextSegment) {
+ nextSegment = theSegment->m_NextSubPath;
+ theSegment->m_Path = NULL;
+ theSegment->m_NextSubPath = NULL;
+ }
+ m_FirstSubPath = NULL;
+} \ No newline at end of file
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderPath.h b/src/runtimerender/graphobjects/Qt3DSRenderPath.h
new file mode 100644
index 0000000..7db3ef5
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderPath.h
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PATH_H
+#define QT3DS_RENDER_PATH_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderNode.h"
+
+namespace qt3ds {
+namespace render {
+ struct PathCapping
+ {
+ enum Enum {
+ Noner = 0,
+ Taper = 1,
+ };
+ };
+
+ struct PathTypes
+ {
+ enum Enum {
+ Noner = 0,
+ Painted,
+ Geometry,
+ };
+ };
+
+ struct PathPaintStyles
+ {
+ enum Enum {
+ Noner = 0,
+ FilledAndStroked,
+ Filled,
+ Stroked,
+ };
+ };
+
+ struct SPath : public SNode
+ {
+ PathTypes::Enum m_PathType;
+ QT3DSF32 m_Width;
+ QT3DSF32 m_LinearError;
+ QT3DSF32 m_EdgeTessAmount;
+ QT3DSF32 m_InnerTessAmount;
+ PathCapping::Enum m_BeginCapping;
+ QT3DSF32 m_BeginCapOffset;
+ QT3DSF32 m_BeginCapOpacity;
+ QT3DSF32 m_BeginCapWidth;
+ PathCapping::Enum m_EndCapping;
+ QT3DSF32 m_EndCapOffset;
+ QT3DSF32 m_EndCapOpacity;
+ QT3DSF32 m_EndCapWidth;
+ SGraphObject *m_Material;
+ SGraphObject *m_SecondMaterial;
+ // Paths can either be immediate - children attached define path
+ // or they can link to a path buffer that defines the path.
+ SPathSubPath *m_FirstSubPath;
+ CRegisteredString m_PathBuffer;
+ PathPaintStyles::Enum m_PaintStyle;
+
+ bool m_WireframeMode;
+ // Loaded onto the card just as data.
+ SPath()
+ : SNode(GraphObjectTypes::Path)
+ , m_PathType(PathTypes::Geometry)
+ , m_Width(5.0f)
+ , m_LinearError(100.0f)
+ , m_EdgeTessAmount(8.0f)
+ , m_InnerTessAmount(1.0f)
+ , m_BeginCapping(PathCapping::Noner)
+ , m_BeginCapOffset(10.0f)
+ , m_BeginCapOpacity(.2f)
+ , m_BeginCapWidth(0.0f)
+ , m_EndCapping(PathCapping::Noner)
+ , m_EndCapOffset(10.0f)
+ , m_EndCapOpacity(.2f)
+ , m_EndCapWidth(0.0f)
+ , m_Material(NULL)
+ , m_SecondMaterial(NULL)
+ , m_FirstSubPath(NULL)
+ , m_PaintStyle(PathPaintStyles::Stroked)
+ , m_WireframeMode(false)
+ {
+ }
+
+ bool IsStroked() const
+ {
+ return m_PaintStyle == PathPaintStyles::Stroked
+ || m_PaintStyle == PathPaintStyles::FilledAndStroked;
+ }
+
+ bool IsFilled() const
+ {
+ return m_PaintStyle == PathPaintStyles::Filled
+ || m_PaintStyle == PathPaintStyles::FilledAndStroked;
+ }
+
+ void AddMaterial(SGraphObject *inMaterial)
+ {
+ if (m_Material == NULL)
+ m_Material = inMaterial;
+ else
+ m_SecondMaterial = inMaterial;
+ }
+
+ void ClearMaterials()
+ {
+ m_Material = NULL;
+ m_SecondMaterial = NULL;
+ }
+
+ void AddSubPath(SPathSubPath &inSubPath);
+ void ClearSubPaths();
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SNode::Remap(inRemapper);
+ inRemapper.Remap(m_PathBuffer);
+ inRemapper.RemapMaterial(m_Material);
+ inRemapper.RemapMaterial(m_SecondMaterial);
+ inRemapper.Remap(m_FirstSubPath);
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderPathSubPath.h b/src/runtimerender/graphobjects/Qt3DSRenderPathSubPath.h
new file mode 100644
index 0000000..ed1f9be
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderPathSubPath.h
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PATH_SEGMENT_H
+#define QT3DS_RENDER_PATH_SEGMENT_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+
+namespace qt3ds {
+namespace render {
+ struct SPathSubPath : public SGraphObject
+ {
+ SPath *m_Path;
+ SPathSubPath *m_NextSubPath;
+ bool m_Closed;
+
+ SPathSubPath()
+ : SGraphObject(GraphObjectTypes::PathSubPath)
+ , m_Path(NULL)
+ , m_NextSubPath(NULL)
+ , m_Closed(false)
+ {
+ }
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_Path);
+ inRemapper.Remap(m_NextSubPath);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderPresentation.cpp b/src/runtimerender/graphobjects/Qt3DSRenderPresentation.cpp
new file mode 100644
index 0000000..6403959
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderPresentation.cpp
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderPresentation.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSRenderContextCore.h"
+
+using namespace qt3ds::render;
+
+void SPresentation::Render(IQt3DSRenderContext &inContext)
+{
+ if (m_Scene) {
+ NVRenderRect theViewportSize(inContext.GetRenderContext().GetViewport());
+ m_Scene->Render(QT3DSVec2((QT3DSF32)theViewportSize.m_Width, (QT3DSF32)theViewportSize.m_Height),
+ inContext);
+ }
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderPresentation.h b/src/runtimerender/graphobjects/Qt3DSRenderPresentation.h
new file mode 100644
index 0000000..2403e3b
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderPresentation.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PRESENTATION_H
+#define QT3DS_RENDER_PRESENTATION_H
+
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "Qt3DSRenderScene.h"
+#include "foundation/Qt3DSVec2.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct RenderRotationValues
+ {
+ enum Enum {
+ NoRotation = 0,
+ Clockwise90,
+ Clockwise180,
+ Clockwise270,
+ };
+ };
+
+ struct SPresentation : public SGraphObject
+ {
+ QT3DSVec2 m_PresentationDimensions;
+ RenderRotationValues::Enum m_PresentationRotation;
+ bool m_preferKTX;
+ SScene *m_Scene;
+
+ CRegisteredString m_PresentationDirectory;
+
+ SPresentation()
+ : SGraphObject(GraphObjectTypes::Presentation)
+ , m_PresentationDimensions(800, 400)
+ , m_PresentationRotation(RenderRotationValues::NoRotation)
+ , m_preferKTX(false)
+ , m_Scene(NULL)
+ {
+ }
+
+ SPresentation(QT3DSF32 w, QT3DSF32 h, bool preferKTX, CRegisteredString presDir)
+ : SGraphObject(GraphObjectTypes::Presentation)
+ , m_PresentationDimensions(w, h)
+ , m_PresentationRotation(RenderRotationValues::NoRotation)
+ , m_preferKTX(preferKTX)
+ , m_Scene(NULL)
+ , m_PresentationDirectory(presDir)
+ {
+ }
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_Scene);
+ inRemapper.Remap(m_PresentationDirectory);
+ }
+
+ void Render(IQt3DSRenderContext &inContext);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderReferencedMaterial.h b/src/runtimerender/graphobjects/Qt3DSRenderReferencedMaterial.h
new file mode 100644
index 0000000..d2043f0
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderReferencedMaterial.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_REFERENCED_MATERIAL_H
+#define QT3DS_RENDER_REFERENCED_MATERIAL_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderGraphObject.h"
+#include "Qt3DSRenderMaterialDirty.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SReferencedMaterial : SGraphObject
+ {
+ CMaterialDirty m_Dirty;
+ SGraphObject *m_ReferencedMaterial;
+ SGraphObject *m_NextSibling;
+ SReferencedMaterial()
+ : SGraphObject(GraphObjectTypes::ReferencedMaterial)
+ , m_ReferencedMaterial(NULL)
+ , m_NextSibling(NULL)
+ {
+ }
+
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.RemapMaterial(m_ReferencedMaterial);
+ inRemapper.RemapMaterial(m_NextSibling);
+ }
+ };
+}
+}
+
+#endif // QT3DS_RENDER_REFERENCED_MATERIAL_H
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
new file mode 100644
index 0000000..7917bd7
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderScene.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderScene.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderContextCore.h"
+#include "render/Qt3DSRenderContext.h"
+
+using namespace qt3ds::render;
+
+SScene::SScene()
+ : SGraphObject(GraphObjectTypes::Scene)
+ , m_Presentation(NULL)
+ , m_FirstChild(NULL)
+ , m_ClearColor(0.0f)
+ , m_UseClearColor(true)
+ , m_Dirty(true)
+{
+}
+
+void SScene::AddChild(SLayer &inLayer)
+{
+ if (m_FirstChild == NULL)
+ m_FirstChild = &inLayer;
+ else
+ GetLastChild()->m_NextSibling = &inLayer;
+ inLayer.m_Scene = this;
+}
+
+SLayer *SScene::GetLastChild()
+{
+ // empty loop intentional
+ SLayer *child;
+ for (child = m_FirstChild; child && child->m_NextSibling;
+ child = (SLayer *)child->m_NextSibling) {
+ }
+
+ return child;
+}
+
+bool SScene::PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ const SRenderInstanceId id)
+{
+ // We need to iterate through the layers in reverse order and ask them to render.
+ bool wasDirty = m_Dirty;
+ m_Dirty = false;
+ if (m_FirstChild) {
+ wasDirty |=
+ inContext.GetRenderer().PrepareLayerForRender(*m_FirstChild, inViewportDimensions,
+ true, id);
+ }
+ return wasDirty;
+}
+
+void SScene::Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ RenderClearCommand inClearColorBuffer, const SRenderInstanceId id)
+{
+ if ((inClearColorBuffer == SScene::ClearIsOptional && m_UseClearColor)
+ || inClearColorBuffer == SScene::AlwaysClear) {
+ QT3DSF32 clearColorAlpha
+ = inContext.IsInSubPresentation() && !m_UseClearColor ? 0.0f : 1.0f;
+ QT3DSVec4 clearColor(0.0f, 0.0f, 0.0f, clearColorAlpha);
+ if (m_UseClearColor) {
+ clearColor.x = m_ClearColor.x;
+ clearColor.y = m_ClearColor.y;
+ clearColor.z = m_ClearColor.z;
+ clearColor.w = m_ClearColor.w;
+ }
+ // Maybe clear and reset to previous clear color after we leave.
+ qt3ds::render::NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
+ inContext.GetRenderContext(), &NVRenderContext::GetClearColor,
+ &NVRenderContext::SetClearColor, clearColor);
+ inContext.GetRenderContext().Clear(qt3ds::render::NVRenderClearValues::Color);
+ }
+ if (m_FirstChild) {
+ inContext.GetRenderer().RenderLayer(*m_FirstChild, inViewportDimensions, m_UseClearColor,
+ m_ClearColor, true, id);
+ }
+}
+void SScene::RenderWithClear(const QT3DSVec2 &inViewportDimensions,
+ IQt3DSRenderContext &inContext,
+ RenderClearCommand inClearColorBuffer,
+ QT3DSVec4 inClearColor,
+ const SRenderInstanceId id)
+{
+ // If this scene is not using clear color, we set the color
+ // to background color from parent layer. This allows
+ // fully transparent subpresentations (both scene and layer(s) transparent)
+ // to inherit color from the layer that contains them.
+ if (!m_UseClearColor) {
+ m_ClearColor = inClearColor;
+ m_UseClearColor = true;
+ }
+ Render(inViewportDimensions, inContext, inClearColorBuffer, id);
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderScene.h b/src/runtimerender/graphobjects/Qt3DSRenderScene.h
new file mode 100644
index 0000000..8c4d3fe
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderScene.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SCENE_H
+#define QT3DS_RENDER_SCENE_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSVec4.h"
+#include "Qt3DSRenderGraphObject.h"
+
+namespace qt3ds {
+namespace render {
+ struct SLayer;
+ struct SPresentation;
+ typedef void *SRenderInstanceId;
+
+ struct SScene : public SGraphObject
+ {
+ SPresentation *m_Presentation;
+ SLayer *m_FirstChild;
+ QT3DSVec4 m_ClearColor;
+ bool m_UseClearColor;
+ bool m_Dirty;
+
+ enum RenderClearCommand {
+ ClearIsOptional = 0,
+ DoNotClear = 1,
+ AlwaysClear = 2,
+ };
+
+ SScene();
+
+ void AddChild(SLayer &inLayer);
+ SLayer *GetLastChild();
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SGraphObject::Remap(inRemapper);
+ inRemapper.Remap(m_Presentation);
+ inRemapper.Remap(m_FirstChild);
+ }
+ // returns true if any of the layers were dirty or if this object was dirty
+ bool PrepareForRender(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ const SRenderInstanceId id = nullptr);
+ void Render(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ RenderClearCommand command = ClearIsOptional,
+ const SRenderInstanceId id = nullptr);
+ void RenderWithClear(const QT3DSVec2 &inViewportDimensions, IQt3DSRenderContext &inContext,
+ RenderClearCommand inClearColorBuffer,
+ QT3DSVec4 inclearColor, const SRenderInstanceId id = nullptr);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderText.cpp b/src/runtimerender/graphobjects/Qt3DSRenderText.cpp
new file mode 100644
index 0000000..40a20c4
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderText.cpp
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderText.h"
+
+using namespace qt3ds::render;
+
+STextRenderInfo::STextRenderInfo()
+ : m_FontSize(24)
+ , m_HorizontalAlignment(TextHorizontalAlignment::Center)
+ , m_VerticalAlignment(TextVerticalAlignment::Middle)
+ , m_Leading(0)
+ , m_Tracking(0)
+ , m_DropShadow(false)
+ , m_DropShadowStrength(80)
+ , m_DropShadowOffsetX(0)
+ , m_DropShadowOffsetY(0)
+ , m_WordWrap(TextWordWrap::WrapWord)
+ , m_BoundingBox(QT3DSVec2(0 ,0))
+ , m_Elide(TextElide::ElideNone)
+ , m_ScaleX(0)
+ , m_ScaleY(0)
+ , m_EnableAcceleratedFont(false)
+{
+}
+
+STextRenderInfo::~STextRenderInfo()
+{
+}
+
+SText::SText()
+ : SNode(GraphObjectTypes::Text)
+ , m_TextColor(1, 1, 1, 1)
+ , m_TextTexture(nullptr)
+{
+ m_Bounds.setEmpty();
+}
+
+NVBounds3 SText::GetTextBounds() const
+{
+ return m_Bounds;
+}
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderText.h b/src/runtimerender/graphobjects/Qt3DSRenderText.h
new file mode 100644
index 0000000..13f5748
--- /dev/null
+++ b/src/runtimerender/graphobjects/Qt3DSRenderText.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_TEXT_H
+#define QT3DS_RENDER_TEXT_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderNode.h"
+#include "Qt3DSRenderTextTypes.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct SText : public SNode, public STextRenderInfo
+ {
+ // Change any of these properties and you can expect
+ // that the text will force an expensive re-layer and render.
+ // For these you need to set TextDirty.
+
+ // These properties can change every frame with no additional cost.
+ QT3DSVec4 m_TextColor;
+ // Setup and utilized by the rendering system
+ NVRenderTexture2D *m_TextTexture;
+ STextTextureDetails m_TextTextureDetails;
+ // used for nv path rendering
+ NVRenderPathFontItem *m_PathFontItem;
+ NVRenderPathFontSpecification *m_PathFontDetails;
+
+ NVBounds3 m_Bounds;
+
+ SText();
+
+ NVBounds3 GetTextBounds() const;
+
+ // Generic method used during serialization
+ // to remap string and object pointers
+ template <typename TRemapperType>
+ void Remap(TRemapperType &inRemapper)
+ {
+ SNode::Remap(inRemapper);
+ inRemapper.Remap(m_Text);
+ inRemapper.Remap(m_Font);
+ inRemapper.NullPtr(m_TextTexture);
+ inRemapper.NullPtr(m_PathFontItem);
+ inRemapper.NullPtr(m_PathFontDetails);
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/linux/DynamicLibLoader.h b/src/runtimerender/linux/DynamicLibLoader.h
new file mode 100644
index 0000000..cc5d077
--- /dev/null
+++ b/src/runtimerender/linux/DynamicLibLoader.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_LINUX_DYNAMIC_LIB_LOADER_H
+#define QT3DS_LINUX_DYNAMIC_LIB_LOADER_H
+#include <dlfcn.h>
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+
+namespace qt3ds {
+namespace render {
+ using namespace qt3ds;
+ using namespace qt3ds::render;
+
+ class CLoadedDynamicLibrary
+ {
+ void *m_DLLHandle;
+ CLoadedDynamicLibrary(void *hdl)
+ : m_DLLHandle(hdl)
+ {
+ }
+ CLoadedDynamicLibrary(const CLoadedDynamicLibrary &);
+ CLoadedDynamicLibrary &operator=(const CLoadedDynamicLibrary &);
+
+ public:
+ ~CLoadedDynamicLibrary()
+ {
+ if (m_DLLHandle)
+ {
+#ifndef _INTEGRITYPLATFORM
+ ::dlclose(m_DLLHandle);
+#endif
+ }
+ m_DLLHandle = 0;
+ }
+ void *FindFunction(const char *name)
+ {
+#ifndef _INTEGRITYPLATFORM
+ return ::dlsym(m_DLLHandle, name);
+#else
+ qWarning() << "CLoadedDynamicLibrary::FindFunction returns NULL!";
+ return NULL;
+#endif
+ }
+ static CLoadedDynamicLibrary *Create(const char *inFullDllPath, NVFoundationBase &fnd)
+ {
+#ifndef _INTEGRITYPLATFORM
+ void *hdl = ::dlopen(inFullDllPath, RTLD_NOW);
+ if (hdl == 0) {
+ const char *error = ::dlerror();
+ qCCritical(INVALID_OPERATION, "Failed to load dynamic library %s: %s",
+ inFullDllPath, error);
+ return NULL;
+ }
+ return QT3DS_NEW(fnd.getAllocator(), CLoadedDynamicLibrary)(hdl);
+#else
+ qWarning() << "CLoadedDynamicLibrary::Create returns NULL!";
+ return NULL;
+#endif
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/macos/DynamicLibLoader.h b/src/runtimerender/macos/DynamicLibLoader.h
new file mode 100644
index 0000000..c968419
--- /dev/null
+++ b/src/runtimerender/macos/DynamicLibLoader.h
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "linux/DynamicLibLoader.h"
diff --git a/src/runtimerender/q3dsqmlrender.cpp b/src/runtimerender/q3dsqmlrender.cpp
new file mode 100644
index 0000000..f1bdd4d
--- /dev/null
+++ b/src/runtimerender/q3dsqmlrender.cpp
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dsqmlrender.h"
+#include "q3dsqmlstreamservice.h"
+#include "render/Qt3DSRenderContext.h"
+
+#include <QSize>
+#include <QOpenGLContext>
+
+Q3DSQmlRender::Q3DSQmlRender(IQt3DSRenderContext &inRenderContext, const char *asset)
+ : m_RenderContext(inRenderContext)
+ , m_qmlStreamRenderer(nullptr)
+ , m_offscreenRenderType(inRenderContext.GetStringTable().RegisterStr(GetRendererName()))
+ , m_assetString(inRenderContext.GetStringTable().RegisterStr(asset))
+ , m_callback(nullptr)
+ , mRefCount(0)
+{
+
+}
+
+Q3DSQmlRender::~Q3DSQmlRender()
+{
+ m_qmlStreamRenderer =
+ IQ3DSQmlStreamService::getQmlStreamService()->getRenderer(m_assetString.c_str());
+ if (m_qmlStreamRenderer)
+ m_qmlStreamRenderer->uninitialize();
+}
+
+CRegisteredString Q3DSQmlRender::GetOffscreenRendererType()
+{
+ return m_offscreenRenderType;
+}
+
+NVRenderTextureFormats::Enum convertTextureFormat(E_TEXTURE_FORMAT fmt)
+{
+ NVRenderTextureFormats::Enum ret;
+
+ switch (fmt) {
+ case E_TEXTURE_RGBA8:
+ ret = NVRenderTextureFormats::RGBA8;
+ break;
+ default:
+ ret = NVRenderTextureFormats::Unknown;
+ break;
+ }
+
+ return ret;
+}
+
+SOffscreenRendererEnvironment Q3DSQmlRender::GetDesiredEnvironment(QT3DSVec2 inPresScale)
+{
+ QSize size(0, 0);
+ E_TEXTURE_FORMAT format = E_TEXTURE_UNKNOWN;
+
+ if (!m_qmlStreamRenderer)
+ initializeRenderer();
+
+ if (m_qmlStreamRenderer) {
+ size = m_qmlStreamRenderer->getDesiredSize();
+ format = m_qmlStreamRenderer->getDesiredFormat();
+ }
+ return SOffscreenRendererEnvironment(
+ (QT3DSU32)(size.width() * inPresScale.x), (QT3DSU32)(size.height() * inPresScale.y),
+ convertTextureFormat(format), OffscreenRendererDepthValues::Depth24, false,
+ AAModeValues::NoAA);
+}
+
+SOffscreenRenderFlags Q3DSQmlRender::NeedsRender(const SOffscreenRendererEnvironment &inEnvironment,
+ QT3DSVec2 inPresentationScaleFactor,
+ const SRenderInstanceId instanceId)
+{
+ Q_UNUSED(inEnvironment);
+ Q_UNUSED(inPresentationScaleFactor);
+ Q_UNUSED(instanceId);
+ bool render = false;
+ if (!m_qmlStreamRenderer)
+ initializeRenderer();
+ if (m_qmlStreamRenderer)
+ render = m_qmlStreamRenderer->isUpdateRequested();
+ return SOffscreenRenderFlags(false, render);
+}
+
+void Q3DSQmlRender::Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ const SRenderInstanceId instanceId)
+{
+ Q_UNUSED(inEnvironment)
+ Q_UNUSED(inPresentationScaleFactor)
+ Q_UNUSED(inColorBufferNeedsClear)
+ Q_UNUSED(instanceId)
+ if (m_qmlStreamRenderer) {
+ inRenderContext.PushPropertySet();
+
+ m_qmlStreamRenderer->render();
+
+ inRenderContext.PopPropertySet(true);
+
+ if (m_callback)
+ m_callback->onOffscreenRendererFrame(QString(m_assetString.c_str()));
+ }
+}
+
+void Q3DSQmlRender::initializeRenderer()
+{
+ m_qmlStreamRenderer
+ = IQ3DSQmlStreamService::getQmlStreamService()->getRenderer(m_assetString.c_str());
+ if (m_qmlStreamRenderer) {
+ if (!m_qmlStreamRenderer->initialize(
+ QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext(),
+ QT_PREPEND_NAMESPACE(QOpenGLContext)::currentContext()->surface())) {
+ m_qmlStreamRenderer = nullptr;
+ } else if (m_callback) {
+ m_callback->onOffscreenRendererInitialized(QString(m_assetString.c_str()));
+ }
+ }
+}
diff --git a/src/runtimerender/q3dsqmlrender.h b/src/runtimerender/q3dsqmlrender.h
new file mode 100644
index 0000000..99b395d
--- /dev/null
+++ b/src/runtimerender/q3dsqmlrender.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_QML_RENDER_H
+#define QT3DS_QML_RENDER_H
+
+#include "Qt3DSOffscreenRenderManager.h"
+#include "Qt3DSRenderContextCore.h"
+
+class IQt3DS;
+
+using namespace qt3ds::render;
+
+class IQ3DSQmlStreamService;
+class IQ3DSQmlStreamRenderer;
+
+class Q3DSQmlRender : public IOffscreenRenderer
+{
+public:
+ Q3DSQmlRender(IQt3DSRenderContext &inRenderContext, const char *asset);
+ ~Q3DSQmlRender();
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext.GetAllocator())
+
+ CRegisteredString GetOffscreenRendererType() override;
+
+ SOffscreenRendererEnvironment GetDesiredEnvironment(QT3DSVec2 inPresentationScaleFactor) override;
+
+ // Returns true of this object needs to be rendered, false if this object is not dirty
+ SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment,
+ QT3DSVec2 inPresentationScaleFactor,
+ const SRenderInstanceId instanceId) override;
+
+ void Render(const SOffscreenRendererEnvironment &inEnvironment,
+ NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
+ SScene::RenderClearCommand inColorBufferNeedsClear,
+ const SRenderInstanceId instanceId) override;
+ void RenderWithClear(const SOffscreenRendererEnvironment &/*inEnvironment*/,
+ NVRenderContext &/*inRenderContext*/,
+ QT3DSVec2 /*inPresentationScaleFactor*/,
+ SScene::RenderClearCommand /*inColorBufferNeedsClear*/,
+ QT3DSVec4 /*inclearColor*/,
+ const SRenderInstanceId /*instanceId*/) override {}
+
+ IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId instanceId) override
+ {
+ Q_UNUSED(instanceId)
+ return nullptr;
+ }
+ bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions,
+ const SRenderInstanceId instanceId) override
+ {
+ Q_UNUSED(inMouseCoords)
+ Q_UNUSED(inViewportDimensions)
+ Q_UNUSED(instanceId)
+ return false;
+ }
+ void addCallback(IOffscreenRendererCallback *cb) override
+ {
+ m_callback = cb;
+ }
+ static const char *GetRendererName() { return "qml-render"; }
+private:
+
+ void initializeRenderer();
+
+ IQt3DSRenderContext &m_RenderContext;
+ IQ3DSQmlStreamRenderer *m_qmlStreamRenderer;
+ CRegisteredString m_offscreenRenderType;
+ CRegisteredString m_assetString;
+ IOffscreenRendererCallback *m_callback;
+ volatile QT3DSI32 mRefCount;
+};
+
+#endif
diff --git a/src/runtimerender/qnx/DynamicLibLoader.h b/src/runtimerender/qnx/DynamicLibLoader.h
new file mode 100644
index 0000000..c968419
--- /dev/null
+++ b/src/runtimerender/qnx/DynamicLibLoader.h
@@ -0,0 +1,30 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "linux/DynamicLibLoader.h"
diff --git a/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
new file mode 100644
index 0000000..fff7e32
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
@@ -0,0 +1,543 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderableObjects.h"
+#include "Qt3DSRendererImpl.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderCustomMaterialRenderContext.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderPathManager.h"
+#include "Qt3DSRenderPathRenderContext.h"
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+
+using qt3ds::foundation::CRegisteredString;
+
+namespace qt3ds {
+namespace render {
+ struct SRenderableImage;
+ struct SShaderGeneratorGeneratedShader;
+ struct SSubsetRenderable;
+ using eastl::make_pair;
+ using eastl::reverse;
+
+ STextScaleAndOffset::STextScaleAndOffset(NVRenderTexture2D &inTexture,
+ const STextTextureDetails &inTextDetails,
+ const STextRenderInfo &inInfo)
+ : m_TextOffset(0, 0)
+ , m_TextScale(1, 1)
+
+ {
+ NVRenderTexture2D &theTexture = inTexture;
+ STextureDetails theDetails(theTexture.GetTextureDetails());
+ QT3DSVec2 textDimensions(inTextDetails.m_TextWidth / 2.0f, inTextDetails.m_TextHeight / 2.0f);
+ textDimensions.x /= inTextDetails.m_ScaleFactor.x;
+ textDimensions.y /= inTextDetails.m_ScaleFactor.y;
+ QT3DSVec2 theTextScale(textDimensions.x, textDimensions.y);
+ QT3DSVec2 theTextOffset(0, 0);
+
+ // Set the offsets to use after scaling the rect coordinates.
+ switch (inInfo.m_HorizontalAlignment) {
+ case TextHorizontalAlignment::Left:
+ theTextOffset[0] = theTextScale[0];
+ break;
+ case TextHorizontalAlignment::Center:
+ break;
+ case TextHorizontalAlignment::Right:
+ theTextOffset[0] = -theTextScale[0];
+ break;
+ default:
+ break;
+ }
+
+ switch (inInfo.m_VerticalAlignment) {
+ case TextVerticalAlignment::Top:
+ theTextOffset[1] = -theTextScale[1];
+ break;
+ case TextVerticalAlignment::Middle:
+ break;
+ case TextVerticalAlignment::Bottom:
+ theTextOffset[1] = theTextScale[1];
+ break;
+ default:
+ break;
+ }
+ m_TextScale = theTextScale;
+ m_TextOffset = theTextOffset;
+ }
+
+ void SSubsetRenderableBase::RenderShadowMapPass(const QT3DSVec2 &inCameraVec,
+ const SLight *inLight, const SCamera &inCamera,
+ SShadowMapEntry *inShadowMapEntry)
+ {
+ NVRenderContext &context(m_Generator.GetContext());
+ SRenderableDepthPrepassShader *shader = NULL;
+ NVRenderInputAssembler *pIA = NULL;
+
+ /*
+ if ( inLight->m_LightType == RenderLightTypes::Area )
+ shader = m_Generator.GetParaboloidDepthShader( m_TessellationMode );
+ else if ( inLight->m_LightType == RenderLightTypes::Directional )
+ shader = m_Generator.GetOrthographicDepthShader( m_TessellationMode );
+ else if ( inLight->m_LightType == RenderLightTypes::Point )
+ shader = m_Generator.GetCubeShadowDepthShader( m_TessellationMode ); // This
+ will change to include a geometry shader pass.
+ */
+
+ if (inLight->m_LightType == RenderLightTypes::Directional)
+ shader = m_Generator.GetOrthographicDepthShader(m_TessellationMode);
+ else
+ shader = m_Generator.GetCubeShadowDepthShader(m_TessellationMode);
+
+ if (shader == NULL || inShadowMapEntry == NULL)
+ return;
+
+ // for phong and npatch tesselleation we need the normals too
+ if (m_TessellationMode == TessModeValues::NoTess
+ || m_TessellationMode == TessModeValues::TessLinear)
+ pIA = m_Subset.m_InputAssemblerDepth;
+ else
+ pIA = m_Subset.m_InputAssembler;
+
+ QT3DSMat44 theModelViewProjection = inShadowMapEntry->m_LightVP * m_GlobalTransform;
+ // QT3DSMat44 theModelView = inLight->m_GlobalTransform.getInverse() * m_GlobalTransform;
+
+ context.SetActiveShader(&shader->m_Shader);
+ shader->m_MVP.Set(theModelViewProjection);
+ shader->m_CameraPosition.Set(inCamera.m_Position);
+ shader->m_GlobalTransform.Set(m_GlobalTransform);
+ shader->m_CameraProperties.Set(inCameraVec);
+ /*
+ shader->m_CameraDirection.Set( inCamera.GetDirection() );
+
+ shader->m_ShadowMV[0].Set( inShadowMapEntry->m_LightCubeView[0] * m_GlobalTransform );
+ shader->m_ShadowMV[1].Set( inShadowMapEntry->m_LightCubeView[1] * m_GlobalTransform );
+ shader->m_ShadowMV[2].Set( inShadowMapEntry->m_LightCubeView[2] * m_GlobalTransform );
+ shader->m_ShadowMV[3].Set( inShadowMapEntry->m_LightCubeView[3] * m_GlobalTransform );
+ shader->m_ShadowMV[4].Set( inShadowMapEntry->m_LightCubeView[4] * m_GlobalTransform );
+ shader->m_ShadowMV[5].Set( inShadowMapEntry->m_LightCubeView[5] * m_GlobalTransform );
+ shader->m_Projection.Set( inCamera.m_Projection );
+ */
+
+ // tesselation
+ if (m_TessellationMode != TessModeValues::NoTess) {
+ // set uniforms we need
+ shader->m_Tessellation.m_EdgeTessLevel.Set(m_Subset.m_EdgeTessFactor);
+ shader->m_Tessellation.m_InsideTessLevel.Set(m_Subset.m_InnerTessFactor);
+ // the blend value is hardcoded
+ shader->m_Tessellation.m_PhongBlend.Set(0.75);
+ // set distance range value
+ shader->m_Tessellation.m_DistanceRange.Set(inCameraVec);
+ // disable culling
+ shader->m_Tessellation.m_DisableCulling.Set(1.0);
+ }
+
+ context.SetInputAssembler(pIA);
+ context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
+ }
+
+ void SSubsetRenderableBase::RenderDepthPass(const QT3DSVec2 &inCameraVec,
+ SRenderableImage *inDisplacementImage,
+ float inDisplacementAmount)
+ {
+ NVRenderContext &context(m_Generator.GetContext());
+ SRenderableDepthPrepassShader *shader = NULL;
+ NVRenderInputAssembler *pIA = NULL;
+ SRenderableImage *displacementImage = inDisplacementImage;
+
+ if (m_Subset.m_PrimitiveType != NVRenderDrawMode::Patches)
+ shader = m_Generator.GetDepthPrepassShader(displacementImage != NULL);
+ else
+ shader = m_Generator.GetDepthTessPrepassShader(m_TessellationMode,
+ displacementImage != NULL);
+
+ if (shader == NULL)
+ return;
+
+ // for phong and npatch tesselleation or displacement mapping we need the normals (and uv's)
+ // too
+ if ((m_TessellationMode == TessModeValues::NoTess
+ || m_TessellationMode == TessModeValues::TessLinear)
+ && !displacementImage)
+ pIA = m_Subset.m_InputAssemblerDepth;
+ else
+ pIA = m_Subset.m_InputAssembler;
+
+ context.SetActiveShader(&shader->m_Shader);
+ context.SetCullingEnabled(true);
+
+ shader->m_MVP.Set(m_ModelContext.m_ModelViewProjection);
+
+ if (displacementImage) {
+ // setup image transform
+ const QT3DSMat44 &textureTransform = displacementImage->m_Image.m_TextureTransform;
+ const QT3DSF32 *dataPtr(textureTransform.front());
+ QT3DSVec3 offsets(dataPtr[12], dataPtr[13],
+ displacementImage->m_Image.m_TextureData.m_TextureFlags.IsPreMultiplied()
+ ? 1.0f
+ : 0.0f);
+ QT3DSVec4 rotations(dataPtr[0], dataPtr[4], dataPtr[1], dataPtr[5]);
+ displacementImage->m_Image.m_TextureData.m_Texture->SetTextureWrapS(
+ displacementImage->m_Image.m_HorizontalTilingMode);
+ displacementImage->m_Image.m_TextureData.m_Texture->SetTextureWrapT(
+ displacementImage->m_Image.m_VerticalTilingMode);
+
+ shader->m_DisplaceAmount.Set(inDisplacementAmount);
+ shader->m_DisplacementProps.m_Offsets.Set(offsets);
+ shader->m_DisplacementProps.m_Rotations.Set(rotations);
+ shader->m_DisplacementProps.m_Sampler.Set(
+ displacementImage->m_Image.m_TextureData.m_Texture);
+ }
+
+ // tesselation
+ if (m_TessellationMode != TessModeValues::NoTess) {
+ // set uniforms we need
+ shader->m_GlobalTransform.Set(m_GlobalTransform);
+
+ if (m_Generator.GetLayerRenderData() && m_Generator.GetLayerRenderData()->m_Camera)
+ shader->m_CameraPosition.Set(
+ m_Generator.GetLayerRenderData()->m_Camera->GetGlobalPos());
+ else if (m_Generator.GetLayerRenderData()->m_Camera)
+ shader->m_CameraPosition.Set(QT3DSVec3(0.0, 0.0, 1.0));
+
+ shader->m_Tessellation.m_EdgeTessLevel.Set(m_Subset.m_EdgeTessFactor);
+ shader->m_Tessellation.m_InsideTessLevel.Set(m_Subset.m_InnerTessFactor);
+ // the blend value is hardcoded
+ shader->m_Tessellation.m_PhongBlend.Set(0.75);
+ // set distance range value
+ shader->m_Tessellation.m_DistanceRange.Set(inCameraVec);
+ // enable culling
+ shader->m_Tessellation.m_DisableCulling.Set(0.0);
+ }
+
+ context.SetInputAssembler(pIA);
+ context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
+ }
+
+ // An interface to the shader generator that is available to the renderables
+
+ void SSubsetRenderable::Render(const QT3DSVec2 &inCameraVec, TShaderFeatureSet inFeatureSet)
+ {
+ NVRenderContext &context(m_Generator.GetContext());
+
+ SShaderGeneratorGeneratedShader *shader = m_Generator.GetShader(*this, inFeatureSet);
+ if (shader == NULL)
+ return;
+
+ context.SetActiveShader(&shader->m_Shader);
+
+ m_Generator.GetQt3DSContext().GetDefaultMaterialShaderGenerator().SetMaterialProperties(
+ shader->m_Shader, m_Material, inCameraVec, m_ModelContext.m_ModelViewProjection,
+ m_ModelContext.m_NormalMatrix, m_ModelContext.m_Model.m_GlobalTransform, m_FirstImage,
+ m_Opacity, m_Generator.GetLayerGlobalRenderProperties());
+
+ // tesselation
+ if (m_Subset.m_PrimitiveType == NVRenderDrawMode::Patches) {
+ shader->m_Tessellation.m_EdgeTessLevel.Set(m_Subset.m_EdgeTessFactor);
+ shader->m_Tessellation.m_InsideTessLevel.Set(m_Subset.m_InnerTessFactor);
+ // the blend value is hardcoded
+ shader->m_Tessellation.m_PhongBlend.Set(0.75);
+ // this should finally be based on some user input
+ shader->m_Tessellation.m_DistanceRange.Set(inCameraVec);
+ // enable culling
+ shader->m_Tessellation.m_DisableCulling.Set(0.0);
+
+ if (m_Subset.m_WireframeMode) {
+ // we need the viewport matrix
+ NVRenderRect theViewport(context.GetViewport());
+ QT3DSMat44 vpMatrix;
+ vpMatrix.column0 = QT3DSVec4((float)theViewport.m_Width / 2.0f, 0.0, 0.0, 0.0);
+ vpMatrix.column1 = QT3DSVec4(0.0, (float)theViewport.m_Height / 2.0f, 0.0, 0.0);
+ vpMatrix.column2 = QT3DSVec4(0.0, 0.0, 1.0, 0.0);
+ vpMatrix.column3 =
+ QT3DSVec4((float)theViewport.m_Width / 2.0f + (float)theViewport.m_X,
+ (float)theViewport.m_Height / 2.0f + (float)theViewport.m_Y, 0.0, 1.0);
+
+ shader->m_ViewportMatrix.Set(vpMatrix);
+ }
+ }
+
+ context.SetCullingEnabled(true);
+ context.SetInputAssembler(m_Subset.m_InputAssembler);
+ context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
+ }
+
+ void SSubsetRenderable::RenderDepthPass(const QT3DSVec2 &inCameraVec)
+ {
+ SRenderableImage *displacementImage = NULL;
+ for (SRenderableImage *theImage = m_FirstImage;
+ theImage != NULL && displacementImage == NULL; theImage = theImage->m_NextImage) {
+ if (theImage->m_MapType == ImageMapTypes::Displacement)
+ displacementImage = theImage;
+ }
+ SSubsetRenderableBase::RenderDepthPass(inCameraVec, displacementImage,
+ m_Material.m_DisplaceAmount);
+ }
+
+ void STextRenderable::Render(const QT3DSVec2 &inCameraVec)
+ {
+ NVRenderContext &context(m_Generator.GetContext());
+
+ if (!m_Text.m_PathFontDetails) {
+
+ STextRenderHelper theInfo = m_Generator.GetShader(*this, false);
+ if (theInfo.m_Shader == NULL)
+ return;
+ // All of our shaders produce premultiplied values.
+ qt3ds::render::NVRenderBlendFunctionArgument blendFunc(
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha);
+
+ qt3ds::render::NVRenderBlendEquationArgument blendEqu(NVRenderBlendEquation::Add,
+ NVRenderBlendEquation::Add);
+
+ context.SetBlendFunction(blendFunc);
+ context.SetBlendEquation(blendEqu);
+ QT3DSVec4 theColor(m_Text.m_TextColor.x, m_Text.m_TextColor.y, m_Text.m_TextColor.z,
+ m_Text.m_GlobalOpacity);
+
+ STextShader &shader(*theInfo.m_Shader);
+ shader.Render(*m_Text.m_TextTexture, *this, theColor, m_ModelViewProjection,
+ inCameraVec, context, theInfo.m_QuadInputAssembler,
+ theInfo.m_QuadInputAssembler.GetIndexCount(), m_Text.m_TextTextureDetails,
+ QT3DSVec3(0, 0, 0));
+ } else {
+ QT3DS_ASSERT(context.IsPathRenderingSupported() && context.IsProgramPipelineSupported());
+
+ STextRenderHelper theInfo = m_Generator.GetShader(*this, true);
+ if (theInfo.m_Shader == NULL)
+ return;
+
+ // All of our shaders produce premultiplied values.
+ qt3ds::render::NVRenderBlendFunctionArgument blendFunc(
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha);
+
+ qt3ds::render::NVRenderBlendEquationArgument blendEqu(NVRenderBlendEquation::Add,
+ NVRenderBlendEquation::Add);
+
+ context.SetBlendFunction(blendFunc);
+ context.SetBlendEquation(blendEqu);
+ QT3DSVec4 theColor(m_Text.m_TextColor.x, m_Text.m_TextColor.y, m_Text.m_TextColor.z,
+ m_Text.m_GlobalOpacity);
+ STextShader &shader(*theInfo.m_Shader);
+
+ shader.RenderPath(*m_Text.m_PathFontItem, *m_Text.m_PathFontDetails, *this, theColor,
+ m_ViewProjection, m_GlobalTransform, inCameraVec, context,
+ m_Text.m_TextTextureDetails, QT3DSVec3(0, 0, 0));
+ }
+ }
+
+ void STextRenderable::RenderDepthPass(const QT3DSVec2 &inCameraVec)
+ {
+ NVRenderContext &context(m_Generator.GetContext());
+ STextDepthShader *theDepthShader = m_Generator.GetTextDepthShader();
+ if (theDepthShader == NULL)
+ return;
+
+ if (!m_Text.m_PathFontDetails) {
+ // we may change stencil test state
+ qt3ds::render::NVRenderContextScopedProperty<bool> __stencilTest(
+ context, &NVRenderContext::IsStencilTestEnabled,
+ &NVRenderContext::SetStencilTestEnabled, true);
+
+ NVRenderShaderProgram &theShader(theDepthShader->m_Shader);
+ context.SetCullingEnabled(false);
+ context.SetActiveShader(&theShader);
+ theDepthShader->m_MVP.Set(m_ModelViewProjection);
+ theDepthShader->m_Sampler.Set(m_Text.m_TextTexture);
+ const STextScaleAndOffset &theScaleAndOffset(*this);
+ theDepthShader->m_Dimensions.Set(
+ QT3DSVec4(theScaleAndOffset.m_TextScale.x, theScaleAndOffset.m_TextScale.y,
+ theScaleAndOffset.m_TextOffset.x, theScaleAndOffset.m_TextOffset.y));
+ theDepthShader->m_CameraProperties.Set(inCameraVec);
+
+ STextureDetails theTextureDetails = m_Text.m_TextTexture->GetTextureDetails();
+ const STextTextureDetails &theTextTextureDetails(m_Text.m_TextTextureDetails);
+ QT3DSF32 theWidthScale =
+ (QT3DSF32)theTextTextureDetails.m_TextWidth / (QT3DSF32)theTextureDetails.m_Width;
+ QT3DSF32 theHeightScale =
+ (QT3DSF32)theTextTextureDetails.m_TextHeight / (QT3DSF32)theTextureDetails.m_Height;
+ theDepthShader->m_TextDimensions.Set(
+ QT3DSVec3(theWidthScale, theHeightScale, theTextTextureDetails.m_FlipY ? 1.0f : 0.0f));
+ context.SetInputAssembler(&theDepthShader->m_QuadInputAssembler);
+ context.Draw(NVRenderDrawMode::Triangles,
+ theDepthShader->m_QuadInputAssembler.GetIndexCount(), 0);
+ } else {
+ qt3ds::render::NVRenderBoolOp::Enum theDepthFunction = context.GetDepthFunction();
+ bool isDepthEnabled = context.IsDepthTestEnabled();
+ bool isStencilEnabled = context.IsStencilTestEnabled();
+ bool isDepthWriteEnabled = context.IsDepthWriteEnabled();
+ qt3ds::render::NVRenderStencilFunctionArgument theArg(qt3ds::render::NVRenderBoolOp::NotEqual,
+ 0, 0xFF);
+ qt3ds::render::NVRenderStencilOperationArgument theOpArg(
+ qt3ds::render::NVRenderStencilOp::Keep, qt3ds::render::NVRenderStencilOp::Keep,
+ qt3ds::render::NVRenderStencilOp::Zero);
+ NVScopedRefCounted<NVRenderDepthStencilState> depthStencilState =
+ context.CreateDepthStencilState(isDepthEnabled, isDepthWriteEnabled,
+ theDepthFunction, false, theArg, theArg, theOpArg,
+ theOpArg);
+
+ context.SetActiveShader(NULL);
+ context.SetCullingEnabled(false);
+
+ context.SetDepthStencilState(depthStencilState);
+
+ // setup transform
+ QT3DSMat44 offsetMatrix = QT3DSMat44::createIdentity();
+ offsetMatrix.setPosition(QT3DSVec3(
+ m_TextOffset.x - (QT3DSF32)m_Text.m_TextTextureDetails.m_TextWidth / 2.0f,
+ m_TextOffset.y - (QT3DSF32)m_Text.m_TextTextureDetails.m_TextHeight / 2.0f, 0.0));
+
+ QT3DSMat44 pathMatrix = m_Text.m_PathFontItem->GetTransform();
+
+ context.SetPathProjectionMatrix(m_ViewProjection);
+ context.SetPathModelViewMatrix(m_GlobalTransform * offsetMatrix * pathMatrix);
+
+ // first pass
+ m_Text.m_PathFontDetails->StencilFillPathInstanced(*m_Text.m_PathFontItem);
+
+ // second pass
+ context.SetStencilTestEnabled(true);
+ m_Text.m_PathFontDetails->CoverFillPathInstanced(*m_Text.m_PathFontItem);
+
+ context.SetStencilTestEnabled(isStencilEnabled);
+ context.SetDepthFunction(theDepthFunction);
+ }
+ }
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ void SDistanceFieldRenderable::Render(const QT3DSVec2 &inCameraVec)
+ {
+ m_distanceFieldText.renderText(m_text, m_mvp);
+ }
+
+ void SDistanceFieldRenderable::RenderDepthPass(const QT3DSVec2 &inCameraVec)
+ {
+ m_distanceFieldText.renderTextDepth(m_text, m_mvp);
+ }
+#endif
+
+ void SCustomMaterialRenderable::Render(const QT3DSVec2 & /*inCameraVec*/,
+ const SLayerRenderData &inLayerData,
+ const SLayer &inLayer, NVDataRef<SLight *> inLights,
+ const SCamera &inCamera,
+ const NVRenderTexture2D *inDepthTexture,
+ const NVRenderTexture2D *inSsaoTexture,
+ TShaderFeatureSet inFeatureSet)
+ {
+ IQt3DSRenderContext &qt3dsContext(m_Generator.GetQt3DSContext());
+ SCustomMaterialRenderContext theRenderContext(
+ inLayer, inLayerData, inLights, inCamera, m_ModelContext.m_Model, m_Subset,
+ m_ModelContext.m_ModelViewProjection, m_GlobalTransform, m_ModelContext.m_NormalMatrix,
+ m_Material, inDepthTexture, inSsaoTexture, m_ShaderDescription, m_FirstImage,
+ m_Opacity);
+
+ qt3dsContext.GetCustomMaterialSystem().RenderSubset(theRenderContext, inFeatureSet);
+ }
+
+ void SCustomMaterialRenderable::RenderDepthPass(const QT3DSVec2 &inCameraVec,
+ const SLayer & /*inLayer*/,
+ NVConstDataRef<SLight *> /*inLights*/
+ ,
+ const SCamera & /*inCamera*/,
+ const NVRenderTexture2D * /*inDepthTexture*/)
+ {
+
+ IQt3DSRenderContext &qt3dsContext(m_Generator.GetQt3DSContext());
+ if (!qt3dsContext.GetCustomMaterialSystem().RenderDepthPrepass(
+ m_ModelContext.m_ModelViewProjection, m_Material, m_Subset)) {
+ SRenderableImage *displacementImage = NULL;
+ for (SRenderableImage *theImage = m_FirstImage;
+ theImage != NULL && displacementImage == NULL; theImage = theImage->m_NextImage) {
+ if (theImage->m_MapType == ImageMapTypes::Displacement)
+ displacementImage = theImage;
+ }
+
+ SSubsetRenderableBase::RenderDepthPass(inCameraVec, displacementImage,
+ m_Material.m_DisplaceAmount);
+ }
+ }
+
+ void SPathRenderable::RenderDepthPass(const QT3DSVec2 &inCameraVec, const SLayer & /*inLayer*/,
+ NVConstDataRef<SLight *> inLights,
+ const SCamera &inCamera,
+ const NVRenderTexture2D * /*inDepthTexture*/)
+ {
+ IQt3DSRenderContext &qt3dsContext(m_Generator.GetQt3DSContext());
+ SPathRenderContext theRenderContext(
+ inLights, inCamera, m_Path, m_ModelViewProjection, m_GlobalTransform, m_NormalMatrix,
+ m_Opacity, m_Material, m_ShaderDescription, m_FirstImage, qt3dsContext.GetWireframeMode(),
+ inCameraVec, false, m_IsStroke);
+
+ qt3dsContext.GetPathManager().RenderDepthPrepass(
+ theRenderContext, m_Generator.GetLayerGlobalRenderProperties(), TShaderFeatureSet());
+ }
+
+ void SPathRenderable::Render(const QT3DSVec2 &inCameraVec, const SLayer & /*inLayer*/,
+ NVConstDataRef<SLight *> inLights, const SCamera &inCamera,
+ const NVRenderTexture2D * /*inDepthTexture*/
+ ,
+ const NVRenderTexture2D * /*inSsaoTexture*/
+ ,
+ TShaderFeatureSet inFeatureSet)
+ {
+ IQt3DSRenderContext &qt3dsContext(m_Generator.GetQt3DSContext());
+ SPathRenderContext theRenderContext(
+ inLights, inCamera, m_Path, m_ModelViewProjection, m_GlobalTransform, m_NormalMatrix,
+ m_Opacity, m_Material, m_ShaderDescription, m_FirstImage, qt3dsContext.GetWireframeMode(),
+ inCameraVec, m_RenderableFlags.HasTransparency(), m_IsStroke);
+
+ qt3dsContext.GetPathManager().RenderPath(
+ theRenderContext, m_Generator.GetLayerGlobalRenderProperties(), inFeatureSet);
+ }
+
+ void SPathRenderable::RenderShadowMapPass(const QT3DSVec2 &inCameraVec, const SLight *inLight,
+ const SCamera &inCamera,
+ SShadowMapEntry *inShadowMapEntry)
+ {
+ NVConstDataRef<SLight *> theLights;
+ IQt3DSRenderContext &qt3dsContext(m_Generator.GetQt3DSContext());
+
+ QT3DSMat44 theModelViewProjection = inShadowMapEntry->m_LightVP * m_GlobalTransform;
+ SPathRenderContext theRenderContext(
+ theLights, inCamera, m_Path, theModelViewProjection, m_GlobalTransform, m_NormalMatrix,
+ m_Opacity, m_Material, m_ShaderDescription, m_FirstImage, qt3dsContext.GetWireframeMode(),
+ inCameraVec, false, m_IsStroke);
+
+ if (inLight->m_LightType != RenderLightTypes::Directional) {
+ qt3dsContext.GetPathManager().RenderCubeFaceShadowPass(
+ theRenderContext, m_Generator.GetLayerGlobalRenderProperties(),
+ TShaderFeatureSet());
+ } else
+ qt3dsContext.GetPathManager().RenderShadowMapPass(
+ theRenderContext, m_Generator.GetLayerGlobalRenderProperties(),
+ TShaderFeatureSet());
+ }
+}
+}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.h b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.h
new file mode 100644
index 0000000..a369f7a
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.h
@@ -0,0 +1,472 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_IMPL_RENDERABLE_OBJECTS_H
+#define QT3DS_RENDER_IMPL_RENDERABLE_OBJECTS_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSFlags.h"
+#include "Qt3DSRenderModel.h"
+#include "foundation/Qt3DSContainers.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "Qt3DSRenderCustomMaterial.h"
+#include "Qt3DSRenderText.h"
+#include "Qt3DSRenderMesh.h"
+#include "Qt3DSRenderShaderKeys.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "Qt3DSRenderableImage.h"
+#include "Qt3DSDistanceFieldRenderer.h"
+
+namespace qt3ds {
+namespace render {
+
+ struct RenderPreparationResultFlagValues
+ {
+ enum Enum {
+ HasTransparency = 1 << 0,
+ CompletelyTransparent = 1 << 1,
+ Dirty = 1 << 2,
+ Pickable = 1 << 3,
+ DefaultMaterialMeshSubset = 1 << 4,
+ Text = 1 << 5,
+ Custom = 1 << 6,
+ CustomMaterialMeshSubset = 1 << 7,
+ HasRefraction = 1 << 8,
+ Path = 1 << 9,
+ ShadowCaster = 1 << 10,
+ DistanceField = 1 << 11,
+ };
+ };
+
+ struct SRenderableObjectFlags : public NVFlags<RenderPreparationResultFlagValues::Enum, QT3DSU32>
+ {
+ void ClearOrSet(bool value, RenderPreparationResultFlagValues::Enum enumVal)
+ {
+ if (value)
+ this->operator|=(enumVal);
+ else
+ clear(enumVal);
+ }
+
+ void SetHasTransparency(bool inHasTransparency)
+ {
+ ClearOrSet(inHasTransparency, RenderPreparationResultFlagValues::HasTransparency);
+ }
+ bool HasTransparency() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::HasTransparency);
+ }
+ bool HasRefraction() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::HasRefraction);
+ }
+ void SetCompletelyTransparent(bool inTransparent)
+ {
+ ClearOrSet(inTransparent, RenderPreparationResultFlagValues::CompletelyTransparent);
+ }
+ bool IsCompletelyTransparent() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::CompletelyTransparent);
+ }
+ void SetDirty(bool inDirty)
+ {
+ ClearOrSet(inDirty, RenderPreparationResultFlagValues::Dirty);
+ }
+ bool IsDirty() const { return this->operator&(RenderPreparationResultFlagValues::Dirty); }
+ void SetPickable(bool inPickable)
+ {
+ ClearOrSet(inPickable, RenderPreparationResultFlagValues::Pickable);
+ }
+ bool GetPickable() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::Pickable);
+ }
+
+ // Mutually exclusive values
+ void SetDefaultMaterialMeshSubset(bool inMeshSubset)
+ {
+ ClearOrSet(inMeshSubset, RenderPreparationResultFlagValues::DefaultMaterialMeshSubset);
+ }
+ bool IsDefaultMaterialMeshSubset() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::DefaultMaterialMeshSubset);
+ }
+
+ void SetCustomMaterialMeshSubset(bool inMeshSubset)
+ {
+ ClearOrSet(inMeshSubset, RenderPreparationResultFlagValues::CustomMaterialMeshSubset);
+ }
+ bool IsCustomMaterialMeshSubset() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::CustomMaterialMeshSubset);
+ }
+
+ void SetText(bool inText) { ClearOrSet(inText, RenderPreparationResultFlagValues::Text); }
+ bool IsText() const { return this->operator&(RenderPreparationResultFlagValues::Text); }
+
+ void setDistanceField(bool inText)
+ {
+ ClearOrSet(inText, RenderPreparationResultFlagValues::DistanceField);
+ }
+
+ bool isDistanceField() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::DistanceField);
+ }
+
+ void SetCustom(bool inCustom)
+ {
+ ClearOrSet(inCustom, RenderPreparationResultFlagValues::Custom);
+ }
+ bool IsCustom() const { return this->operator&(RenderPreparationResultFlagValues::Custom); }
+
+ void SetPath(bool inPath) { ClearOrSet(inPath, RenderPreparationResultFlagValues::Path); }
+ bool IsPath() const { return this->operator&(RenderPreparationResultFlagValues::Path); }
+
+ void SetShadowCaster(bool inCaster)
+ {
+ ClearOrSet(inCaster, RenderPreparationResultFlagValues::ShadowCaster);
+ }
+ bool IsShadowCaster() const
+ {
+ return this->operator&(RenderPreparationResultFlagValues::ShadowCaster);
+ }
+ };
+
+ struct SNodeLightEntry
+ {
+ SLight *m_Light;
+ QT3DSU32 m_LightIndex;
+ SNodeLightEntry *m_NextNode;
+ SNodeLightEntry()
+ : m_Light(NULL)
+ , m_NextNode(NULL)
+ {
+ }
+ SNodeLightEntry(SLight *inLight, QT3DSU32 inLightIndex)
+ : m_Light(inLight)
+ , m_LightIndex(inLightIndex)
+ , m_NextNode(NULL)
+ {
+ }
+ };
+
+ DEFINE_INVASIVE_SINGLE_LIST(NodeLightEntry);
+
+ IMPLEMENT_INVASIVE_SINGLE_LIST(NodeLightEntry, m_NextNode);
+
+ struct SRenderableObject;
+
+ typedef void (*TRenderFunction)(SRenderableObject &inObject, const QT3DSVec2 &inCameraProperties);
+
+ struct SRenderableObject
+ {
+ // Variables used for picking
+ const QT3DSMat44 &m_GlobalTransform;
+ const NVBounds3 &m_Bounds;
+ SRenderableObjectFlags m_RenderableFlags;
+ // For rough sorting for transparency and for depth
+ QT3DSVec3 m_WorldCenterPoint;
+ QT3DSF32 m_CameraDistanceSq;
+ TessModeValues::Enum m_TessellationMode;
+ bool m_ShadowCaster;
+ // For custom renderable objects the render function must be defined
+ TRenderFunction m_RenderFunction;
+ TNodeLightEntryList m_ScopedLights;
+ SRenderableObject(SRenderableObjectFlags inFlags, QT3DSVec3 inWorldCenterPt,
+ const QT3DSMat44 &inGlobalTransform, const NVBounds3 &inBounds,
+ TessModeValues::Enum inTessMode = TessModeValues::NoTess,
+ bool inShadowCaster = true, TRenderFunction inFunction = nullptr)
+
+ : m_GlobalTransform(inGlobalTransform)
+ , m_Bounds(inBounds)
+ , m_RenderableFlags(inFlags)
+ , m_WorldCenterPoint(inWorldCenterPt)
+ , m_CameraDistanceSq(0)
+ , m_TessellationMode(inTessMode)
+ , m_ShadowCaster(inShadowCaster)
+ , m_RenderFunction(inFunction)
+ {
+ }
+ bool operator<(SRenderableObject *inOther) const
+ {
+ return m_CameraDistanceSq < inOther->m_CameraDistanceSq;
+ }
+ };
+
+ typedef nvvector<SRenderableObject *> TRenderableObjectList;
+
+ // Different subsets from the same model will get the same
+ // model context so we can generate the MVP and normal matrix once
+ // and only once per subset.
+ struct SModelContext
+ {
+ const SModel &m_Model;
+ QT3DSMat44 m_ModelViewProjection;
+ QT3DSMat33 m_NormalMatrix;
+
+ SModelContext(const SModel &inModel, const QT3DSMat44 &inViewProjection)
+ : m_Model(inModel)
+ {
+ m_Model.CalculateMVPAndNormalMatrix(inViewProjection, m_ModelViewProjection,
+ m_NormalMatrix);
+ }
+ SModelContext(const SModelContext &inOther)
+ : m_Model(inOther.m_Model)
+ {
+ // The default copy constructor for these objects is pretty darn slow.
+ memCopy(&m_ModelViewProjection, &inOther.m_ModelViewProjection,
+ sizeof(m_ModelViewProjection));
+ memCopy(&m_NormalMatrix, &inOther.m_NormalMatrix, sizeof(m_NormalMatrix));
+ }
+ };
+
+ typedef nvvector<SModelContext *> TModelContextPtrList;
+
+ class Qt3DSRendererImpl;
+ struct SLayerRenderData;
+ struct SShadowMapEntry;
+
+ struct SSubsetRenderableBase : public SRenderableObject
+ {
+ Qt3DSRendererImpl &m_Generator;
+ const SModelContext &m_ModelContext;
+ SRenderSubset m_Subset;
+ QT3DSF32 m_Opacity;
+
+ SSubsetRenderableBase(SRenderableObjectFlags inFlags, QT3DSVec3 inWorldCenterPt,
+ Qt3DSRendererImpl &gen, const SRenderSubset &subset,
+ const SModelContext &modelContext, QT3DSF32 inOpacity)
+
+ : SRenderableObject(inFlags, inWorldCenterPt, modelContext.m_Model.m_GlobalTransform,
+ m_Subset.m_Bounds)
+ , m_Generator(gen)
+ , m_ModelContext(modelContext)
+ , m_Subset(subset)
+ , m_Opacity(inOpacity)
+ {
+ }
+ void RenderShadowMapPass(const QT3DSVec2 &inCameraVec, const SLight *inLight,
+ const SCamera &inCamera, SShadowMapEntry *inShadowMapEntry);
+
+ void RenderDepthPass(const QT3DSVec2 &inCameraVec, SRenderableImage *inDisplacementImage,
+ float inDisplacementAmount);
+ };
+
+ /**
+ * A renderable that corresponds to a subset (a part of a model).
+ * These are created per subset per layer and are responsible for actually
+ * rendering this type of object.
+ */
+ struct SSubsetRenderable : public SSubsetRenderableBase
+ {
+ const SDefaultMaterial &m_Material;
+ SRenderableImage *m_FirstImage;
+ SShaderDefaultMaterialKey m_ShaderDescription;
+ NVConstDataRef<QT3DSMat44> m_Bones;
+
+ SSubsetRenderable(SRenderableObjectFlags inFlags, QT3DSVec3 inWorldCenterPt,
+ Qt3DSRendererImpl &gen, const SRenderSubset &subset,
+ const SDefaultMaterial &mat, const SModelContext &modelContext,
+ QT3DSF32 inOpacity, SRenderableImage *inFirstImage,
+ SShaderDefaultMaterialKey inShaderKey,
+ NVConstDataRef<QT3DSMat44> inBoneGlobals)
+
+ : SSubsetRenderableBase(inFlags, inWorldCenterPt, gen, subset, modelContext, inOpacity)
+ , m_Material(mat)
+ , m_FirstImage(inFirstImage)
+ , m_ShaderDescription(inShaderKey)
+ , m_Bones(inBoneGlobals)
+ {
+ m_RenderableFlags.SetDefaultMaterialMeshSubset(true);
+ m_RenderableFlags.SetCustom(false);
+ m_RenderableFlags.SetText(false);
+ m_RenderableFlags.setDistanceField(false);
+ }
+
+ void Render(const QT3DSVec2 &inCameraVec, TShaderFeatureSet inFeatureSet);
+
+ void RenderDepthPass(const QT3DSVec2 &inCameraVec);
+
+ DefaultMaterialBlendMode::Enum getBlendingMode()
+ {
+ return m_Material.m_BlendMode;
+ }
+ };
+
+ struct SCustomMaterialRenderable : public SSubsetRenderableBase
+ {
+ const SCustomMaterial &m_Material;
+ SRenderableImage *m_FirstImage;
+ SShaderDefaultMaterialKey m_ShaderDescription;
+
+ SCustomMaterialRenderable(SRenderableObjectFlags inFlags, QT3DSVec3 inWorldCenterPt,
+ Qt3DSRendererImpl &gen, const SRenderSubset &subset,
+ const SCustomMaterial &mat, const SModelContext &modelContext,
+ QT3DSF32 inOpacity, SRenderableImage *inFirstImage,
+ SShaderDefaultMaterialKey inShaderKey)
+ : SSubsetRenderableBase(inFlags, inWorldCenterPt, gen, subset, modelContext, inOpacity)
+ , m_Material(mat)
+ , m_FirstImage(inFirstImage)
+ , m_ShaderDescription(inShaderKey)
+ {
+ m_RenderableFlags.SetCustomMaterialMeshSubset(true);
+ }
+
+ void Render(const QT3DSVec2 &inCameraVec, const SLayerRenderData &inLayerData,
+ const SLayer &inLayer, NVDataRef<SLight *> inLights, const SCamera &inCamera,
+ const NVRenderTexture2D *inDepthTexture, const NVRenderTexture2D *inSsaoTexture,
+ TShaderFeatureSet inFeatureSet);
+
+ void RenderDepthPass(const QT3DSVec2 &inCameraVec, const SLayer &inLayer,
+ NVConstDataRef<SLight *> inLights, const SCamera &inCamera,
+ const NVRenderTexture2D *inDepthTexture);
+ };
+
+ struct STextScaleAndOffset
+ {
+ QT3DSVec2 m_TextOffset;
+ QT3DSVec2 m_TextScale;
+ STextScaleAndOffset(const QT3DSVec2 &inTextOffset, const QT3DSVec2 &inTextScale)
+ : m_TextOffset(inTextOffset)
+ , m_TextScale(inTextScale)
+ {
+ }
+ STextScaleAndOffset(NVRenderTexture2D &inTexture, const STextTextureDetails &inTextDetails,
+ const STextRenderInfo &inInfo);
+ };
+
+ struct STextRenderable : public SRenderableObject, public STextScaleAndOffset
+ {
+ Qt3DSRendererImpl &m_Generator;
+ const SText &m_Text;
+ NVRenderTexture2D &m_Texture;
+ QT3DSMat44 m_ModelViewProjection;
+ QT3DSMat44 m_ViewProjection;
+
+ STextRenderable(SRenderableObjectFlags inFlags, QT3DSVec3 inWorldCenterPt,
+ Qt3DSRendererImpl &gen, const SText &inText, const NVBounds3 &inBounds,
+ const QT3DSMat44 &inModelViewProjection, const QT3DSMat44 &inViewProjection,
+ NVRenderTexture2D &inTextTexture, const QT3DSVec2 &inTextOffset,
+ const QT3DSVec2 &inTextScale)
+ : SRenderableObject(inFlags, inWorldCenterPt, inText.m_GlobalTransform, inBounds)
+ , STextScaleAndOffset(inTextOffset, inTextScale)
+ , m_Generator(gen)
+ , m_Text(inText)
+ , m_Texture(inTextTexture)
+ , m_ModelViewProjection(inModelViewProjection)
+ , m_ViewProjection(inViewProjection)
+ {
+ m_RenderableFlags.SetDefaultMaterialMeshSubset(false);
+ m_RenderableFlags.SetCustom(false);
+ m_RenderableFlags.SetText(true);
+ m_RenderableFlags.setDistanceField(false);
+ }
+
+ void Render(const QT3DSVec2 &inCameraVec);
+ void RenderDepthPass(const QT3DSVec2 &inCameraVec);
+ };
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ struct SDistanceFieldRenderable : public SRenderableObject
+ {
+ Q3DSDistanceFieldRenderer &m_distanceFieldText;
+ QT3DSMat44 m_mvp;
+ SText &m_text;
+
+ SDistanceFieldRenderable(SRenderableObjectFlags flags, QT3DSVec3 worldCenterPt,
+ SText &text, const NVBounds3 &bounds, const QT3DSMat44 &mvp,
+ Q3DSDistanceFieldRenderer &distanceFieldText)
+ : SRenderableObject(flags, worldCenterPt, text.m_GlobalTransform, bounds)
+ , m_distanceFieldText(distanceFieldText)
+ , m_mvp(mvp)
+ , m_text(text)
+ {
+ m_RenderableFlags.SetDefaultMaterialMeshSubset(false);
+ m_RenderableFlags.SetCustom(false);
+ m_RenderableFlags.SetText(false);
+ m_RenderableFlags.setDistanceField(true);
+ m_distanceFieldText.checkAndBuildGlyphs(text);
+ }
+
+ void Render(const QT3DSVec2 &inCameraVec);
+ void RenderDepthPass(const QT3DSVec2 &inCameraVec);
+ };
+#endif
+
+ struct SPathRenderable : public SRenderableObject
+ {
+ Qt3DSRendererImpl &m_Generator;
+ SPath &m_Path;
+ NVBounds3 m_Bounds;
+ QT3DSMat44 m_ModelViewProjection;
+ QT3DSMat33 m_NormalMatrix;
+ const SGraphObject &m_Material;
+ QT3DSF32 m_Opacity;
+ SRenderableImage *m_FirstImage;
+ SShaderDefaultMaterialKey m_ShaderDescription;
+ bool m_IsStroke;
+
+ SPathRenderable(SRenderableObjectFlags inFlags, QT3DSVec3 inWorldCenterPt,
+ Qt3DSRendererImpl &gen, const QT3DSMat44 &inGlobalTransform,
+ NVBounds3 &inBounds, SPath &inPath, const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 inNormalMat, const SGraphObject &inMaterial, QT3DSF32 inOpacity,
+ SShaderDefaultMaterialKey inShaderKey, bool inIsStroke)
+
+ : SRenderableObject(inFlags, inWorldCenterPt, inGlobalTransform, m_Bounds)
+ , m_Generator(gen)
+ , m_Path(inPath)
+ , m_Bounds(inBounds)
+ , m_ModelViewProjection(inModelViewProjection)
+ , m_NormalMatrix(inNormalMat)
+ , m_Material(inMaterial)
+ , m_Opacity(inOpacity)
+ , m_FirstImage(NULL)
+ , m_ShaderDescription(inShaderKey)
+ , m_IsStroke(inIsStroke)
+ {
+ m_RenderableFlags.SetPath(true);
+ }
+ void Render(const QT3DSVec2 &inCameraVec, const SLayer &inLayer,
+ NVConstDataRef<SLight *> inLights, const SCamera &inCamera,
+ const NVRenderTexture2D *inDepthTexture, const NVRenderTexture2D *inSsaoTexture,
+ TShaderFeatureSet inFeatureSet);
+
+ void RenderDepthPass(const QT3DSVec2 &inCameraVec, const SLayer &inLayer,
+ NVConstDataRef<SLight *> inLights, const SCamera &inCamera,
+ const NVRenderTexture2D *inDepthTexture);
+
+ void RenderShadowMapPass(const QT3DSVec2 &inCameraVec, const SLight *inLight,
+ const SCamera &inCamera, SShadowMapEntry *inShadowMapEntry);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
new file mode 100644
index 0000000..0b3f665
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
@@ -0,0 +1,2051 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRendererImpl.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "EASTL/sort.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderScene.h"
+#include "Qt3DSRenderPresentation.h"
+#include "Qt3DSRenderEffect.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "Qt3DSRenderTextTextureCache.h"
+#include "Qt3DSRenderTextTextureAtlas.h"
+#include "Qt3DSRenderMaterialHelpers.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderRenderList.h"
+#include "Qt3DSRenderPath.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+#include <stdlib.h>
+
+#ifdef _WIN32
+#pragma warning(disable : 4355)
+#endif
+
+// Quick tests you can run to find performance problems
+
+//#define QT3DS_RENDER_DISABLE_HARDWARE_BLENDING 1
+//#define QT3DS_RENDER_DISABLE_LIGHTING 1
+//#define QT3DS_RENDER_DISABLE_TEXTURING 1
+//#define QT3DS_RENDER_DISABLE_TRANSPARENCY 1
+//#define QT3DS_RENDER_DISABLE_FRUSTUM_CULLING 1
+
+// If you are fillrate bound then sorting opaque objects can help in some circumstances
+//#define QT3DS_RENDER_DISABLE_OPAQUE_SORT 1
+
+using qt3ds::foundation::CRegisteredString;
+
+namespace qt3ds {
+namespace render {
+
+ struct SRenderableImage;
+ struct SShaderGeneratorGeneratedShader;
+ struct SSubsetRenderable;
+ using eastl::make_pair;
+ using eastl::reverse;
+ using eastl::stable_sort;
+
+ SEndlType Endl;
+
+ static SRenderInstanceId combineLayerAndId(const SLayer *layer, const SRenderInstanceId id)
+ {
+ uint64_t x = (uint64_t)layer;
+ x += 31u * (uint64_t)id;
+ return (SRenderInstanceId)x;
+ }
+
+ Qt3DSRendererImpl::Qt3DSRendererImpl(IQt3DSRenderContext &ctx)
+ : m_qt3dsContext(ctx)
+ , m_Context(ctx.GetRenderContext())
+ , m_BufferManager(ctx.GetBufferManager())
+ , m_OffscreenRenderManager(ctx.GetOffscreenRenderManager())
+ , m_StringTable(IStringTable::CreateStringTable(ctx.GetAllocator()))
+ , m_LayerShaders(ctx.GetAllocator(), "Qt3DSRendererImpl::m_LayerShaders")
+ , m_Shaders(ctx.GetAllocator(), "Qt3DSRendererImpl::m_Shaders")
+ , m_ConstantBuffers(ctx.GetAllocator(), "Qt3DSRendererImpl::m_ConstantBuffers")
+ , m_TextShader(ctx.GetAllocator())
+ , m_TextPathShader(ctx.GetAllocator())
+ , m_TextWidgetShader(ctx.GetAllocator())
+ , m_TextOnscreenShader(ctx.GetAllocator())
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ , m_LayerBlendTexture(ctx.GetResourceManager())
+ , m_BlendFB(NULL)
+#endif
+ , m_InstanceRenderMap(ctx.GetAllocator(), "Qt3DSRendererImpl::m_InstanceRenderMap")
+ , m_LastFrameLayers(ctx.GetAllocator(), "Qt3DSRendererImpl::m_LastFrameLayers")
+ , mRefCount(0)
+ , m_LastPickResults(ctx.GetAllocator(), "Qt3DSRendererImpl::m_LastPickResults")
+ , m_CurrentLayer(NULL)
+ , m_WidgetVertexBuffers(ctx.GetAllocator(), "Qt3DSRendererImpl::m_WidgetVertexBuffers")
+ , m_WidgetIndexBuffers(ctx.GetAllocator(), "Qt3DSRendererImpl::m_WidgetIndexBuffers")
+ , m_WidgetShaders(ctx.GetAllocator(), "Qt3DSRendererImpl::m_WidgetShaders")
+ , m_WidgetInputAssembler(ctx.GetAllocator(), "Qt3DSRendererImpl::m_WidgetInputAssembler")
+ , m_BoneIdNodeMap(ctx.GetAllocator(), "Qt3DSRendererImpl::m_BoneIdNodeMap")
+ , m_PickRenderPlugins(true)
+ , m_LayerCachingEnabled(true)
+ , m_LayerGPuProfilingEnabled(false)
+ {
+ }
+ Qt3DSRendererImpl::~Qt3DSRendererImpl()
+ {
+ m_LayerShaders.clear();
+ for (TShaderMap::iterator iter = m_Shaders.begin(), end = m_Shaders.end(); iter != end;
+ ++iter)
+ NVDelete(m_Context->GetAllocator(), iter->second);
+
+ m_Shaders.clear();
+ m_InstanceRenderMap.clear();
+ m_ConstantBuffers.clear();
+ }
+
+ void Qt3DSRendererImpl::addRef() { atomicIncrement(&mRefCount); }
+
+ void Qt3DSRendererImpl::release() { QT3DS_IMPLEMENT_REF_COUNT_RELEASE(m_Context->GetAllocator()); }
+
+ void Qt3DSRendererImpl::ChildrenUpdated(SNode &inParent)
+ {
+ if (inParent.m_Type == GraphObjectTypes::Layer) {
+ TInstanceRenderMap::iterator theIter
+ = m_InstanceRenderMap.find(static_cast<SRenderInstanceId>(&inParent));
+ if (theIter == m_InstanceRenderMap.end()) {
+ // The layer is not in main presentation, but it might be in subpresentation
+ theIter = m_InstanceRenderMap.begin();
+ while (theIter != m_InstanceRenderMap.end()) {
+ if (static_cast<SNode *>(&theIter->second.mPtr->m_Layer) == &inParent)
+ break;
+ theIter++;
+ }
+ }
+ if (theIter != m_InstanceRenderMap.end()) {
+ theIter->second->m_CamerasAndLights.clear();
+ theIter->second->m_RenderableNodes.clear();
+ }
+ } else if (inParent.m_Parent)
+ ChildrenUpdated(*inParent.m_Parent);
+ }
+
+ QT3DSF32 Qt3DSRendererImpl::GetTextScale(const SText &inText)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inText);
+ if (theData)
+ return theData->m_TextScale;
+ return 1.0f;
+ }
+
+ static inline SLayer *GetNextLayer(SLayer &inLayer)
+ {
+ if (inLayer.m_NextSibling && inLayer.m_NextSibling->m_Type == GraphObjectTypes::Layer)
+ return static_cast<SLayer *>(inLayer.m_NextSibling);
+ return NULL;
+ }
+
+ static inline void MaybePushLayer(SLayer &inLayer, nvvector<SLayer *> &outLayerList)
+ {
+ inLayer.CalculateGlobalVariables();
+ if (inLayer.m_Flags.IsGloballyActive() && inLayer.m_Flags.IsLayerRenderToTarget())
+ outLayerList.push_back(&inLayer);
+ }
+ static void BuildRenderableLayers(SLayer &inLayer, nvvector<SLayer *> &renderableLayers,
+ bool inRenderSiblings)
+ {
+ MaybePushLayer(inLayer, renderableLayers);
+ if (inRenderSiblings) {
+ for (SLayer *theNextLayer = GetNextLayer(inLayer); theNextLayer;
+ theNextLayer = GetNextLayer(*theNextLayer))
+ MaybePushLayer(*theNextLayer, renderableLayers);
+ }
+ }
+
+ void Qt3DSRendererImpl::EnableLayerGpuProfiling(bool inEnabled)
+ {
+ if (m_LayerGPuProfilingEnabled != inEnabled) {
+ TInstanceRenderMap::iterator theIter;
+ for (theIter = m_InstanceRenderMap.begin(); theIter != m_InstanceRenderMap.end();
+ theIter++) {
+ SLayerRenderData *data = theIter->second;
+ if (!inEnabled)
+ data->m_LayerProfilerGpu = nullptr;
+ else
+ data->CreateGpuProfiler();
+ }
+ }
+ m_LayerGPuProfilingEnabled = inEnabled;
+ }
+
+ bool Qt3DSRendererImpl::PrepareLayerForRender(SLayer &inLayer,
+ const QT3DSVec2 &inViewportDimensions,
+ bool inRenderSiblings,
+ const SRenderInstanceId id)
+ {
+ (void)inViewportDimensions;
+ nvvector<SLayer *> renderableLayers(m_qt3dsContext.GetPerFrameAllocator(), "LayerVector");
+ // Found by fair roll of the dice.
+ renderableLayers.reserve(4);
+
+ BuildRenderableLayers(inLayer, renderableLayers, inRenderSiblings);
+
+ bool retval = false;
+
+ for (nvvector<SLayer *>::reverse_iterator iter = renderableLayers.rbegin(),
+ end = renderableLayers.rend();
+ iter != end; ++iter) {
+ // Store the previous state of if we were rendering a layer.
+ SLayer *theLayer = *iter;
+ SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer, id);
+
+ if (theRenderData) {
+ theRenderData->PrepareForRender();
+ retval = retval || theRenderData->m_LayerPrepResult->m_Flags.WasDirty();
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ return retval;
+ }
+
+ void Qt3DSRendererImpl::RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ bool clear, QT3DSVec4 clearColor, bool inRenderSiblings,
+ const SRenderInstanceId id)
+ {
+ (void)inViewportDimensions;
+ nvvector<SLayer *> renderableLayers(m_qt3dsContext.GetPerFrameAllocator(), "LayerVector");
+ // Found by fair roll of the dice.
+ renderableLayers.reserve(4);
+
+ BuildRenderableLayers(inLayer, renderableLayers, inRenderSiblings);
+
+ NVRenderContext &theRenderContext(m_qt3dsContext.GetRenderContext());
+ qt3ds::render::NVRenderFrameBuffer *theFB = theRenderContext.GetRenderTarget();
+ for (nvvector<SLayer *>::reverse_iterator iter = renderableLayers.rbegin(),
+ end = renderableLayers.rend();
+ iter != end; ++iter) {
+ SLayer *theLayer = *iter;
+ SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer, id);
+ SLayerRenderPreparationResult &prepRes(*theRenderData->m_LayerPrepResult);
+ LayerBlendTypes::Enum layerBlend = prepRes.GetLayer()->GetLayerBlend();
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ if ((layerBlend == LayerBlendTypes::Overlay ||
+ layerBlend == LayerBlendTypes::ColorBurn ||
+ layerBlend == LayerBlendTypes::ColorDodge) &&
+ !theRenderContext.IsAdvancedBlendHwSupported() &&
+ !theRenderContext.IsAdvancedBlendHwSupportedKHR()) {
+ // Create and set up FBO and texture for advanced blending SW fallback
+ NVRenderRect viewport = theRenderContext.GetViewport();
+ m_LayerBlendTexture.EnsureTexture(viewport.m_Width + viewport.m_X,
+ viewport.m_Height + viewport.m_Y,
+ NVRenderTextureFormats::RGBA8);
+ if (m_BlendFB == NULL)
+ m_BlendFB = theRenderContext.CreateFrameBuffer();
+ m_BlendFB->Attach(NVRenderFrameBufferAttachments::Color0, *m_LayerBlendTexture);
+ theRenderContext.SetRenderTarget(m_BlendFB);
+ theRenderContext.SetScissorTestEnabled(false);
+ QT3DSVec4 color(0.0f);
+ if (clear)
+ color = clearColor;
+
+ QT3DSVec4 origColor = theRenderContext.GetClearColor();
+ theRenderContext.SetClearColor(color);
+ theRenderContext.Clear(qt3ds::render::NVRenderClearValues::Color);
+ theRenderContext.SetClearColor(origColor);
+ theRenderContext.SetRenderTarget(theFB);
+ break;
+ } else {
+ m_LayerBlendTexture.ReleaseTexture();
+ }
+#endif
+ }
+ for (nvvector<SLayer *>::reverse_iterator iter = renderableLayers.rbegin(),
+ end = renderableLayers.rend();
+ iter != end; ++iter) {
+ // Store the previous state of if we were rendering a layer.
+ SLayer *theLayer = *iter;
+ SLayerRenderData *theRenderData = GetOrCreateLayerRenderDataForNode(*theLayer, id);
+
+ if (theRenderData) {
+ if (theRenderData->m_LayerPrepResult->IsLayerVisible())
+ theRenderData->RunnableRenderToViewport(theFB);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ }
+
+ SLayer *Qt3DSRendererImpl::GetLayerForNode(const SNode &inNode) const
+ {
+ if (inNode.m_Type == GraphObjectTypes::Layer) {
+ return &const_cast<SLayer &>(static_cast<const SLayer &>(inNode));
+ }
+ if (inNode.m_Parent)
+ return GetLayerForNode(*inNode.m_Parent);
+ return NULL;
+ }
+
+ SLayerRenderData *Qt3DSRendererImpl::GetOrCreateLayerRenderDataForNode(const SNode &inNode,
+ const SRenderInstanceId id)
+ {
+ const SLayer *theLayer = GetLayerForNode(inNode);
+ if (theLayer) {
+ TInstanceRenderMap::const_iterator theIter
+ = m_InstanceRenderMap.find(combineLayerAndId(theLayer, id));
+ if (theIter != m_InstanceRenderMap.end())
+ return const_cast<SLayerRenderData *>(theIter->second.mPtr);
+
+ SLayerRenderData *theRenderData = QT3DS_NEW(m_Context->GetAllocator(), SLayerRenderData)(
+ const_cast<SLayer &>(*theLayer), *this);
+ m_InstanceRenderMap.insert(make_pair(combineLayerAndId(theLayer, id), theRenderData));
+
+ // create a profiler if enabled
+ if (IsLayerGpuProfilingEnabled() && theRenderData)
+ theRenderData->CreateGpuProfiler();
+
+ return theRenderData;
+ }
+ return NULL;
+ }
+
+ SCamera *Qt3DSRendererImpl::GetCameraForNode(const SNode &inNode) const
+ {
+ SLayerRenderData *theLayer =
+ const_cast<Qt3DSRendererImpl &>(*this).GetOrCreateLayerRenderDataForNode(inNode);
+ if (theLayer)
+ return theLayer->m_Camera;
+ return NULL;
+ }
+
+ Option<SCuboidRect> Qt3DSRendererImpl::GetCameraBounds(const SGraphObject &inObject)
+ {
+ if (GraphObjectTypes::IsNodeType(inObject.m_Type)) {
+ const SNode &theNode = static_cast<const SNode &>(inObject);
+ SLayerRenderData *theLayer = GetOrCreateLayerRenderDataForNode(theNode);
+ if (theLayer->GetOffscreenRenderer() == false) {
+ SCamera *theCamera = theLayer->m_Camera;
+ if (theCamera)
+ return theCamera->GetCameraBounds(
+ theLayer->m_LayerPrepResult->GetLayerToPresentationViewport(),
+ theLayer->m_LayerPrepResult->GetPresentationDesignDimensions());
+ }
+ }
+ return Option<SCuboidRect>();
+ }
+
+ void Qt3DSRendererImpl::DrawScreenRect(NVRenderRectF inRect, const QT3DSVec3 &inColor)
+ {
+ SCamera theScreenCamera;
+ theScreenCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ NVRenderRectF theViewport(m_Context->GetViewport());
+ theScreenCamera.m_Flags.SetOrthographic(true);
+ theScreenCamera.CalculateGlobalVariables(theViewport,
+ QT3DSVec2(theViewport.m_Width, theViewport.m_Height));
+ GenerateXYQuad();
+ if (!m_ScreenRectShader) {
+ IShaderProgramGenerator &theGenerator(GetProgramGenerator());
+ theGenerator.BeginProgram();
+ IShaderStageGenerator &vertexGenerator(
+ *theGenerator.GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *theGenerator.GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddUniform("model_view_projection", "mat4");
+ vertexGenerator.AddUniform("rectangle_dims", "vec3");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append(
+ "\tgl_Position = model_view_projection * vec4(attr_pos * rectangle_dims, 1.0);");
+ vertexGenerator.Append("}");
+ fragmentGenerator.AddUniform("output_color", "vec3");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tgl_FragColor.rgb = output_color;");
+ fragmentGenerator.Append("\tgl_FragColor.a = 1.0;");
+ fragmentGenerator.Append("}");
+ // No flags enabled
+ m_ScreenRectShader = theGenerator.CompileGeneratedShader(
+ "DrawScreenRect", SShaderCacheProgramFlags(), TShaderFeatureSet());
+ }
+ if (m_ScreenRectShader) {
+ // Fudge the rect by one pixel to ensure we see all the corners.
+ if (inRect.m_Width > 1)
+ inRect.m_Width -= 1;
+ if (inRect.m_Height > 1)
+ inRect.m_Height -= 1;
+ inRect.m_X += 1;
+ inRect.m_Y += 1;
+ // Figure out the rect center.
+ SNode theNode;
+
+ QT3DSVec2 rectGlobalCenter = inRect.Center();
+ QT3DSVec2 rectCenter(theViewport.ToNormalizedRectRelative(rectGlobalCenter));
+ theNode.m_Position.x = rectCenter.x;
+ theNode.m_Position.y = rectCenter.y;
+ theNode.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ theNode.CalculateGlobalVariables();
+ QT3DSMat44 theViewProjection;
+ theScreenCamera.CalculateViewProjectionMatrix(theViewProjection);
+ QT3DSMat44 theMVP;
+ QT3DSMat33 theNormal;
+ theNode.CalculateMVPAndNormalMatrix(theViewProjection, theMVP, theNormal);
+ m_Context->SetBlendingEnabled(false);
+ m_Context->SetDepthWriteEnabled(false);
+ m_Context->SetDepthTestEnabled(false);
+ m_Context->SetCullingEnabled(false);
+ m_Context->SetActiveShader(m_ScreenRectShader);
+ m_ScreenRectShader->SetPropertyValue("model_view_projection", theMVP);
+ m_ScreenRectShader->SetPropertyValue("output_color", inColor);
+ m_ScreenRectShader->SetPropertyValue(
+ "rectangle_dims", QT3DSVec3(inRect.m_Width / 2.0f, inRect.m_Height / 2.0f, 0.0f));
+ }
+ if (!m_RectInputAssembler) {
+ QT3DS_ASSERT(m_QuadVertexBuffer);
+ QT3DSU8 indexData[] = { 0, 1, 1, 2, 2, 3, 3, 0 };
+
+ m_RectIndexBuffer = m_Context->CreateIndexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static,
+ qt3ds::render::NVRenderComponentTypes::QT3DSU8, sizeof(indexData),
+ toConstDataRef(indexData, sizeof(indexData)));
+
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ };
+
+ // create our attribute layout
+ m_RectAttribLayout = m_Context->CreateAttributeLayout(toConstDataRef(theEntries, 1));
+
+ QT3DSU32 strides = m_QuadVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ m_RectInputAssembler = m_Context->CreateInputAssembler(
+ m_RectAttribLayout, toConstDataRef(&m_QuadVertexBuffer.mPtr, 1), m_RectIndexBuffer,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+ }
+
+ m_Context->SetInputAssembler(m_RectInputAssembler);
+ m_Context->Draw(NVRenderDrawMode::Lines, m_RectIndexBuffer->GetNumIndices(), 0);
+ }
+
+ void Qt3DSRendererImpl::SetupWidgetLayer()
+ {
+ NVRenderContext &theContext = m_qt3dsContext.GetRenderContext();
+
+ if (!m_WidgetTexture) {
+ IResourceManager &theManager = m_qt3dsContext.GetResourceManager();
+ m_WidgetTexture = theManager.AllocateTexture2D(m_BeginFrameViewport.m_Width,
+ m_BeginFrameViewport.m_Height,
+ NVRenderTextureFormats::RGBA8);
+ m_WidgetFBO = theManager.AllocateFrameBuffer();
+ m_WidgetFBO->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer(*m_WidgetTexture));
+ theContext.SetRenderTarget(m_WidgetFBO);
+
+ // NVRenderRect theScissorRect( 0, 0, m_BeginFrameViewport.m_Width,
+ // m_BeginFrameViewport.m_Height );
+ // NVRenderContextScopedProperty<NVRenderRect> __scissorRect( theContext,
+ // &NVRenderContext::GetScissorRect, &NVRenderContext::SetScissorRect, theScissorRect );
+ qt3ds::render::NVRenderContextScopedProperty<bool> __scissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled, false);
+ m_Context->SetClearColor(QT3DSVec4(0, 0, 0, 0));
+ m_Context->Clear(NVRenderClearValues::Color);
+
+ } else
+ theContext.SetRenderTarget(m_WidgetFBO);
+ }
+
+ void Qt3DSRendererImpl::BeginFrame()
+ {
+ for (QT3DSU32 idx = 0, end = m_LastFrameLayers.size(); idx < end; ++idx)
+ m_LastFrameLayers[idx]->ResetForFrame();
+ m_LastFrameLayers.clear();
+ m_BeginFrameViewport = m_qt3dsContext.GetRenderList().GetViewport();
+ }
+ void Qt3DSRendererImpl::EndFrame()
+ {
+ if (m_WidgetTexture) {
+ using qt3ds::render::NVRenderContextScopedProperty;
+ // Releasing the widget FBO can set it as the active frame buffer.
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __fbo(
+ *m_Context, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+ STextureDetails theDetails = m_WidgetTexture->GetTextureDetails();
+ m_Context->SetBlendingEnabled(true);
+ // Colors are expected to be non-premultiplied, so we premultiply alpha into them at
+ // this point.
+ m_Context->SetBlendFunction(qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha));
+ m_Context->SetBlendEquation(qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add));
+
+ m_Context->SetDepthTestEnabled(false);
+ m_Context->SetScissorTestEnabled(false);
+ m_Context->SetViewport(m_BeginFrameViewport);
+ SCamera theCamera;
+ theCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ theCamera.m_Flags.SetOrthographic(true);
+ QT3DSVec2 theTextureDims((QT3DSF32)theDetails.m_Width, (QT3DSF32)theDetails.m_Height);
+ theCamera.CalculateGlobalVariables(
+ NVRenderRect(0, 0, theDetails.m_Width, theDetails.m_Height), theTextureDims);
+ QT3DSMat44 theViewProj;
+ theCamera.CalculateViewProjectionMatrix(theViewProj);
+ RenderQuad(theTextureDims, theViewProj, *m_WidgetTexture);
+
+ IResourceManager &theManager(m_qt3dsContext.GetResourceManager());
+ theManager.Release(*m_WidgetFBO);
+ theManager.Release(*m_WidgetTexture);
+ m_WidgetTexture = NULL;
+ m_WidgetFBO = NULL;
+ }
+ }
+
+ inline bool PickResultLessThan(const Qt3DSRenderPickResult &lhs, const Qt3DSRenderPickResult &rhs)
+ {
+ return FloatLessThan(lhs.m_CameraDistanceSq, rhs.m_CameraDistanceSq);
+ }
+
+ inline QT3DSF32 ClampUVCoord(QT3DSF32 inUVCoord, NVRenderTextureCoordOp::Enum inCoordOp)
+ {
+ if (inUVCoord > 1.0f || inUVCoord < 0.0f) {
+ switch (inCoordOp) {
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ case NVRenderTextureCoordOp::ClampToEdge:
+ inUVCoord = NVMin(inUVCoord, 1.0f);
+ inUVCoord = NVMax(inUVCoord, 0.0f);
+ break;
+ case NVRenderTextureCoordOp::Repeat: {
+ QT3DSF32 multiplier = inUVCoord > 0.0f ? 1.0f : -1.0f;
+ QT3DSF32 clamp = fabs(inUVCoord);
+ clamp = clamp - floor(clamp);
+ if (multiplier < 0)
+ inUVCoord = 1.0f - clamp;
+ else
+ inUVCoord = clamp;
+ } break;
+ case NVRenderTextureCoordOp::MirroredRepeat: {
+ QT3DSF32 multiplier = inUVCoord > 0.0f ? 1.0f : -1.0f;
+ QT3DSF32 clamp = fabs(inUVCoord);
+ if (multiplier > 0.0f)
+ clamp -= 1.0f;
+ QT3DSU32 isMirrored = ((QT3DSU32)clamp) % 2 == 0;
+ QT3DSF32 remainder = clamp - floor(clamp);
+ inUVCoord = remainder;
+ if (isMirrored) {
+ if (multiplier > 0.0f)
+ inUVCoord = 1.0f - inUVCoord;
+ } else {
+ if (multiplier < 0.0f)
+ inUVCoord = 1.0f - remainder;
+ }
+ } break;
+ }
+ }
+ return inUVCoord;
+ }
+
+ static eastl::pair<QT3DSVec2, QT3DSVec2>
+ GetMouseCoordsAndViewportFromSubObject(QT3DSVec2 inLocalHitUVSpace,
+ Qt3DSRenderPickSubResult &inSubResult)
+ {
+ QT3DSMat44 theTextureMatrix(inSubResult.m_TextureMatrix);
+ QT3DSVec3 theNewUVCoords(
+ theTextureMatrix.transform(QT3DSVec3(inLocalHitUVSpace.x, inLocalHitUVSpace.y, 0)));
+ theNewUVCoords.x = ClampUVCoord(theNewUVCoords.x, inSubResult.m_HorizontalTilingMode);
+ theNewUVCoords.y = ClampUVCoord(theNewUVCoords.y, inSubResult.m_VerticalTilingMode);
+ QT3DSVec2 theViewportDimensions =
+ QT3DSVec2((QT3DSF32)inSubResult.m_ViewportWidth, (QT3DSF32)inSubResult.m_ViewportHeight);
+ QT3DSVec2 theMouseCoords(theNewUVCoords.x * theViewportDimensions.x,
+ (1.0f - theNewUVCoords.y) * theViewportDimensions.y);
+
+ return eastl::make_pair(theMouseCoords, theViewportDimensions);
+ }
+
+ SPickResultProcessResult Qt3DSRendererImpl::ProcessPickResultList(bool inPickEverything)
+ {
+ if (m_LastPickResults.empty())
+ return SPickResultProcessResult();
+ // Things are rendered in a particular order and we need to respect that ordering.
+ eastl::stable_sort(m_LastPickResults.begin(), m_LastPickResults.end(), PickResultLessThan);
+
+ // We need to pick against sub objects basically somewhat recursively
+ // but if we don't hit any sub objects and the parent isn't pickable then
+ // we need to move onto the next item in the list.
+ // We need to keep in mind that theQuery->Pick will enter this method in a later
+ // stack frame so *if* we get to sub objects we need to pick against them but if the pick
+ // completely misses *and* the parent object locally pickable is false then we need to move
+ // onto the next object.
+
+ QT3DSU32 maxPerFrameAllocationPickResultCount =
+ SFastAllocator<>::SlabSize / sizeof(Qt3DSRenderPickResult);
+ QT3DSU32 numToCopy =
+ NVMin(maxPerFrameAllocationPickResultCount, (QT3DSU32)m_LastPickResults.size());
+ QT3DSU32 numCopyBytes = numToCopy * sizeof(Qt3DSRenderPickResult);
+ Qt3DSRenderPickResult *thePickResults = reinterpret_cast<Qt3DSRenderPickResult *>(
+ GetPerFrameAllocator().allocate(numCopyBytes, "tempPickData", __FILE__, __LINE__));
+ memCopy(thePickResults, m_LastPickResults.data(), numCopyBytes);
+ m_LastPickResults.clear();
+ bool foundValidResult = false;
+ SPickResultProcessResult thePickResult(thePickResults[0]);
+ for (size_t idx = 0; idx < numToCopy && foundValidResult == false; ++idx) {
+ thePickResult = thePickResults[idx];
+ // Here we do a hierarchy. Picking against sub objects takes precedence.
+ // If picking against the sub object doesn't return a valid result *and*
+ // the current object isn't globally pickable then we move onto the next object returned
+ // by the pick query.
+ if (thePickResult.m_HitObject != NULL && thePickResult.m_FirstSubObject != NULL
+ && m_PickRenderPlugins) {
+ QT3DSVec2 theUVCoords(thePickResult.m_LocalUVCoords.x,
+ thePickResult.m_LocalUVCoords.y);
+ IOffscreenRenderer *theSubRenderer(thePickResult.m_FirstSubObject->m_SubRenderer);
+ eastl::pair<QT3DSVec2, QT3DSVec2> mouseAndViewport =
+ GetMouseCoordsAndViewportFromSubObject(theUVCoords,
+ *thePickResult.m_FirstSubObject);
+ QT3DSVec2 theMouseCoords = mouseAndViewport.first;
+ QT3DSVec2 theViewportDimensions = mouseAndViewport.second;
+ IGraphObjectPickQuery *theQuery = theSubRenderer->GetGraphObjectPickQuery(this);
+ if (theQuery) {
+ Qt3DSRenderPickResult theInnerPickResult =
+ theQuery->Pick(theMouseCoords, theViewportDimensions, inPickEverything);
+ if (theInnerPickResult.m_HitObject) {
+ thePickResult = theInnerPickResult;
+ thePickResult.m_OffscreenRenderer = theSubRenderer;
+ foundValidResult = true;
+ thePickResult.m_WasPickConsumed = true;
+ } else if (GraphObjectTypes::IsNodeType(thePickResult.m_HitObject->m_Type)) {
+ const SNode *theNode =
+ static_cast<const SNode *>(thePickResult.m_HitObject);
+ if (theNode->m_Flags.IsGloballyPickable() == true) {
+ foundValidResult = true;
+ thePickResult.m_WasPickConsumed = true;
+ }
+ }
+ } else {
+ // If the sub renderer doesn't consume the pick then we return the picked object
+ // itself. So no matter what, if we get to here the pick was consumed.
+ thePickResult.m_WasPickConsumed = true;
+ bool wasPickConsumed =
+ theSubRenderer->Pick(theMouseCoords, theViewportDimensions, this);
+ if (wasPickConsumed) {
+ thePickResult.m_HitObject = NULL;
+ foundValidResult = true;
+ }
+ }
+ } else {
+ foundValidResult = true;
+ thePickResult.m_WasPickConsumed = true;
+ }
+ }
+ return thePickResult;
+ }
+
+ Qt3DSRenderPickResult Qt3DSRendererImpl::Pick(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inMouseCoords, bool inPickSiblings,
+ bool inPickEverything, const SRenderInstanceId id)
+ {
+ m_LastPickResults.clear();
+
+ SLayer *theLayer = &inLayer;
+ // Stepping through how the original runtime did picking it picked layers in order
+ // stopping at the first hit. So objects on the top layer had first crack at the pick
+ // vector itself.
+ do {
+ if (theLayer->m_Flags.IsActive()) {
+ TInstanceRenderMap::iterator theIter
+ = m_InstanceRenderMap.find(combineLayerAndId(theLayer, id));
+ if (theIter != m_InstanceRenderMap.end()) {
+ m_LastPickResults.clear();
+ GetLayerHitObjectList(*theIter->second, inViewportDimensions, inMouseCoords,
+ inPickEverything, m_LastPickResults,
+ GetPerFrameAllocator());
+ SPickResultProcessResult retval(ProcessPickResultList(inPickEverything));
+ if (retval.m_WasPickConsumed)
+ return retval;
+ } else {
+ // QT3DS_ASSERT( false );
+ }
+ }
+
+ if (inPickSiblings)
+ theLayer = GetNextLayer(*theLayer);
+ else
+ theLayer = NULL;
+ } while (theLayer != NULL);
+
+ return Qt3DSRenderPickResult();
+ }
+
+ static inline Option<QT3DSVec2> IntersectRayWithNode(const SNode &inNode,
+ SRenderableObject &inRenderableObject,
+ const SRay &inPickRay)
+ {
+ if (inRenderableObject.m_RenderableFlags.IsText()) {
+ STextRenderable &theRenderable = static_cast<STextRenderable &>(inRenderableObject);
+ if (&theRenderable.m_Text == &inNode) {
+ return inPickRay.GetRelativeXY(inRenderableObject.m_GlobalTransform,
+ inRenderableObject.m_Bounds);
+ }
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ } else if (inRenderableObject.m_RenderableFlags.isDistanceField()) {
+ SDistanceFieldRenderable &theRenderable = static_cast<SDistanceFieldRenderable &>(
+ inRenderableObject);
+ if (&theRenderable.m_text == &inNode) {
+ return inPickRay.GetRelativeXY(inRenderableObject.m_GlobalTransform,
+ inRenderableObject.m_Bounds);
+ }
+#endif
+ } else if (inRenderableObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) {
+ SSubsetRenderable &theRenderable = static_cast<SSubsetRenderable &>(inRenderableObject);
+ if (&theRenderable.m_ModelContext.m_Model == &inNode)
+ return inPickRay.GetRelativeXY(inRenderableObject.m_GlobalTransform,
+ inRenderableObject.m_Bounds);
+ } else if (inRenderableObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) {
+ SCustomMaterialRenderable &theRenderable =
+ static_cast<SCustomMaterialRenderable &>(inRenderableObject);
+ if (&theRenderable.m_ModelContext.m_Model == &inNode)
+ return inPickRay.GetRelativeXY(inRenderableObject.m_GlobalTransform,
+ inRenderableObject.m_Bounds);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ return Empty();
+ }
+
+ static inline Qt3DSRenderPickSubResult ConstructSubResult(SImage &inImage)
+ {
+ STextureDetails theDetails = inImage.m_TextureData.m_Texture->GetTextureDetails();
+ return Qt3DSRenderPickSubResult(*inImage.m_LastFrameOffscreenRenderer,
+ inImage.m_TextureTransform, inImage.m_HorizontalTilingMode,
+ inImage.m_VerticalTilingMode, theDetails.m_Width,
+ theDetails.m_Height);
+ }
+
+ Option<QT3DSVec2> Qt3DSRendererImpl::FacePosition(SNode &inNode, NVBounds3 inBounds,
+ const QT3DSMat44 &inGlobalTransform,
+ const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inMouseCoords,
+ NVDataRef<SGraphObject *> inMapperObjects,
+ SBasisPlanes::Enum inPlane)
+ {
+ SLayerRenderData *theLayerData = GetOrCreateLayerRenderDataForNode(inNode);
+ if (theLayerData == NULL)
+ return Empty();
+ // This function assumes the layer was rendered to the scene itself. There is another
+ // function
+ // for completely offscreen layers that don't get rendered to the scene.
+ bool wasRenderToTarget(theLayerData->m_Layer.m_Flags.IsLayerRenderToTarget());
+ if (wasRenderToTarget == false || theLayerData->m_Camera == NULL
+ || theLayerData->m_LayerPrepResult.hasValue() == false
+ || theLayerData->m_LastFrameOffscreenRenderer.mPtr != NULL)
+ return Empty();
+
+ QT3DSVec2 theMouseCoords(inMouseCoords);
+ QT3DSVec2 theViewportDimensions(inViewportDimensions);
+
+ for (QT3DSU32 idx = 0, end = inMapperObjects.size(); idx < end; ++idx) {
+ SGraphObject &currentObject = *inMapperObjects[idx];
+ if (currentObject.m_Type == GraphObjectTypes::Layer) {
+ // The layer knows its viewport so it can take the information directly.
+ // This is extremely counter intuitive but a good sign.
+ } else if (currentObject.m_Type == GraphObjectTypes::Image) {
+ SImage &theImage = static_cast<SImage &>(currentObject);
+ SModel *theParentModel = NULL;
+ if (theImage.m_Parent
+ && theImage.m_Parent->m_Type == GraphObjectTypes::DefaultMaterial) {
+ SDefaultMaterial *theMaterial =
+ static_cast<SDefaultMaterial *>(theImage.m_Parent);
+ if (theMaterial) {
+ theParentModel = theMaterial->m_Parent;
+ }
+ }
+ if (theParentModel == NULL) {
+ QT3DS_ASSERT(false);
+ return Empty();
+ }
+ NVBounds3 theModelBounds = theParentModel->GetBounds(
+ GetQt3DSContext().GetBufferManager(), GetQt3DSContext().GetPathManager(), false);
+
+ if (theModelBounds.isEmpty()) {
+ QT3DS_ASSERT(false);
+ return Empty();
+ }
+ Option<QT3DSVec2> relativeHit =
+ FacePosition(*theParentModel, theModelBounds, theParentModel->m_GlobalTransform,
+ theViewportDimensions, theMouseCoords, NVDataRef<SGraphObject *>(),
+ SBasisPlanes::XY);
+ if (relativeHit.isEmpty()) {
+ return Empty();
+ }
+ Qt3DSRenderPickSubResult theResult = ConstructSubResult(theImage);
+ QT3DSVec2 hitInUVSpace = (*relativeHit) + QT3DSVec2(.5f, .5f);
+ eastl::pair<QT3DSVec2, QT3DSVec2> mouseAndViewport =
+ GetMouseCoordsAndViewportFromSubObject(hitInUVSpace, theResult);
+ theMouseCoords = mouseAndViewport.first;
+ theViewportDimensions = mouseAndViewport.second;
+ }
+ }
+
+ Option<SRay> theHitRay = theLayerData->m_LayerPrepResult->GetPickRay(
+ theMouseCoords, theViewportDimensions, false);
+ if (theHitRay.hasValue() == false)
+ return Empty();
+
+ // Scale the mouse coords to change them into the camera's numerical space.
+ SRay thePickRay = *theHitRay;
+ Option<QT3DSVec2> newValue = thePickRay.GetRelative(inGlobalTransform, inBounds, inPlane);
+ return newValue;
+ }
+
+ Qt3DSRenderPickResult
+ Qt3DSRendererImpl::PickOffscreenLayer(SLayer &/*inLayer*/, const QT3DSVec2 & /*inViewportDimensions*/
+ ,
+ const QT3DSVec2 & /*inMouseCoords*/
+ ,
+ bool /*inPickEverything*/)
+ {
+ return Qt3DSRenderPickResult();
+ }
+
+ QT3DSVec3 Qt3DSRendererImpl::UnprojectToPosition(SNode &inNode, QT3DSVec3 &inPosition,
+ const QT3DSVec2 &inMouseVec) const
+ {
+ // Translate mouse into layer's coordinates
+ SLayerRenderData *theData =
+ const_cast<Qt3DSRendererImpl &>(*this).GetOrCreateLayerRenderDataForNode(inNode);
+ if (theData == NULL || theData->m_Camera == NULL) {
+ return QT3DSVec3(0, 0, 0);
+ } // QT3DS_ASSERT( false ); return QT3DSVec3(0,0,0); }
+
+ QSize theWindow = m_qt3dsContext.GetWindowDimensions();
+ QT3DSVec2 theDims((QT3DSF32)theWindow.width(), (QT3DSF32)theWindow.height());
+
+ SLayerRenderPreparationResult &thePrepResult(*theData->m_LayerPrepResult);
+ SRay theRay = thePrepResult.GetPickRay(inMouseVec, theDims, true);
+
+ return theData->m_Camera->UnprojectToPosition(inPosition, theRay);
+ }
+
+ QT3DSVec3 Qt3DSRendererImpl::UnprojectWithDepth(SNode &inNode, QT3DSVec3 &,
+ const QT3DSVec3 &inMouseVec) const
+ {
+ // Translate mouse into layer's coordinates
+ SLayerRenderData *theData =
+ const_cast<Qt3DSRendererImpl &>(*this).GetOrCreateLayerRenderDataForNode(inNode);
+ if (theData == NULL || theData->m_Camera == NULL) {
+ return QT3DSVec3(0, 0, 0);
+ } // QT3DS_ASSERT( false ); return QT3DSVec3(0,0,0); }
+
+ // Flip the y into gl coordinates from window coordinates.
+ QT3DSVec2 theMouse(inMouseVec.x, inMouseVec.y);
+ NVReal theDepth = inMouseVec.z;
+
+ SLayerRenderPreparationResult &thePrepResult(*theData->m_LayerPrepResult);
+ QSize theWindow = m_qt3dsContext.GetWindowDimensions();
+ SRay theRay = thePrepResult.GetPickRay(
+ theMouse, QT3DSVec2((QT3DSF32)theWindow.width(), (QT3DSF32)theWindow.height()), true);
+ QT3DSVec3 theTargetPosition = theRay.m_Origin + theRay.m_Direction * theDepth;
+ if (inNode.m_Parent != NULL && inNode.m_Parent->m_Type != GraphObjectTypes::Layer)
+ theTargetPosition =
+ inNode.m_Parent->m_GlobalTransform.getInverse().transform(theTargetPosition);
+ // Our default global space is right handed, so if you are left handed z means something
+ // opposite.
+ if (inNode.m_Flags.IsLeftHanded())
+ theTargetPosition.z *= -1;
+ return theTargetPosition;
+ }
+
+ QT3DSVec3 Qt3DSRendererImpl::ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const
+ {
+ // Translate mouse into layer's coordinates
+ SLayerRenderData *theData =
+ const_cast<Qt3DSRendererImpl &>(*this).GetOrCreateLayerRenderDataForNode(inNode);
+ if (theData == NULL || theData->m_Camera == NULL) {
+ return QT3DSVec3(0, 0, 0);
+ }
+
+ QT3DSMat44 viewProj;
+ theData->m_Camera->CalculateViewProjectionMatrix(viewProj);
+ QT3DSVec4 projPos = viewProj.transform(QT3DSVec4(inPosition, 1.0f));
+ projPos.x /= projPos.w;
+ projPos.y /= projPos.w;
+
+ NVRenderRectF theViewport = theData->m_LayerPrepResult->GetLayerToPresentationViewport();
+ QT3DSVec2 theDims((QT3DSF32)theViewport.m_Width, (QT3DSF32)theViewport.m_Height);
+ projPos.x += 1.0;
+ projPos.y += 1.0;
+ projPos.x *= 0.5;
+ projPos.y *= 0.5;
+ QT3DSVec3 cameraToObject = theData->m_Camera->GetGlobalPos() - inPosition;
+ projPos.z = sqrtf(cameraToObject.dot(cameraToObject));
+ QT3DSVec3 mouseVec = QT3DSVec3(projPos.x, projPos.y, projPos.z);
+ mouseVec.x *= theDims.x;
+ mouseVec.y *= theDims.y;
+
+ mouseVec.x += theViewport.m_X;
+ mouseVec.y += theViewport.m_Y;
+
+ // Flip the y into window coordinates so it matches the mouse.
+ QSize theWindow = m_qt3dsContext.GetWindowDimensions();
+ mouseVec.y = theWindow.height() - mouseVec.y;
+
+ return mouseVec;
+ }
+
+ Option<SLayerPickSetup> Qt3DSRendererImpl::GetLayerPickSetup(SLayer &inLayer,
+ const QT3DSVec2 &inMouseCoords,
+ const QSize &inPickDims)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer);
+ if (theData == NULL || theData->m_Camera == NULL) {
+ QT3DS_ASSERT(false);
+ return Empty();
+ }
+ QSize theWindow = m_qt3dsContext.GetWindowDimensions();
+ QT3DSVec2 theDims((QT3DSF32)theWindow.width(), (QT3DSF32)theWindow.height());
+ // The mouse is relative to the layer
+ Option<QT3DSVec2> theLocalMouse = GetLayerMouseCoords(*theData, inMouseCoords, theDims, false);
+ if (theLocalMouse.hasValue() == false) {
+ return Empty();
+ }
+
+ SLayerRenderPreparationResult &thePrepResult(*theData->m_LayerPrepResult);
+ if (thePrepResult.GetCamera() == NULL) {
+ return Empty();
+ }
+ // Perform gluPickMatrix and pre-multiply it into the view projection
+ QT3DSMat44 theTransScale(QT3DSMat44::createIdentity());
+ SCamera &theCamera(*thePrepResult.GetCamera());
+
+ NVRenderRectF layerToPresentation = thePrepResult.GetLayerToPresentationViewport();
+ // Offsetting is already taken care of in the camera's projection.
+ // All we need to do is to scale and translate the image.
+ layerToPresentation.m_X = 0;
+ layerToPresentation.m_Y = 0;
+ QT3DSVec2 theMouse(*theLocalMouse);
+ // The viewport will need to center at this location
+ QT3DSVec2 viewportDims((QT3DSF32)inPickDims.width(), (QT3DSF32)inPickDims.height());
+ QT3DSVec2 bottomLeft =
+ QT3DSVec2(theMouse.x - viewportDims.x / 2.0f, theMouse.y - viewportDims.y / 2.0f);
+ // For some reason, and I haven't figured out why yet, the offsets need to be backwards for
+ // this to work.
+ // bottomLeft.x = layerToPresentation.m_Width - bottomLeft.x;
+ // bottomLeft.y = layerToPresentation.m_Height - bottomLeft.y;
+ // Virtual rect is relative to the layer.
+ NVRenderRectF thePickRect(bottomLeft.x, bottomLeft.y, viewportDims.x, viewportDims.y);
+ QT3DSMat44 projectionPremult(QT3DSMat44::createIdentity());
+ projectionPremult = render::NVRenderContext::ApplyVirtualViewportToProjectionMatrix(
+ projectionPremult, layerToPresentation, thePickRect);
+ projectionPremult = projectionPremult.getInverse();
+
+ QT3DSMat44 globalInverse = theCamera.m_GlobalTransform.getInverse();
+ QT3DSMat44 theVP = theCamera.m_Projection * globalInverse;
+ // For now we won't setup the scissor, so we may be off by inPickDims at most because
+ // GetLayerMouseCoords will return
+ // false if the mouse is too far off the layer.
+ return SLayerPickSetup(projectionPremult, theVP,
+ NVRenderRect(0, 0, (QT3DSU32)layerToPresentation.m_Width,
+ (QT3DSU32)layerToPresentation.m_Height));
+ }
+
+ Option<NVRenderRectF> Qt3DSRendererImpl::GetLayerRect(SLayer &inLayer)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer);
+ if (theData == NULL || theData->m_Camera == NULL) {
+ QT3DS_ASSERT(false);
+ return Empty();
+ }
+ SLayerRenderPreparationResult &thePrepResult(*theData->m_LayerPrepResult);
+ return thePrepResult.GetLayerToPresentationViewport();
+ }
+
+ // This doesn't have to be cheap.
+ void Qt3DSRendererImpl::RunLayerRender(SLayer &inLayer, const QT3DSMat44 &inViewProjection)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer);
+ if (theData == NULL || theData->m_Camera == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ theData->PrepareAndRender(inViewProjection);
+ }
+
+ void Qt3DSRendererImpl::AddRenderWidget(IRenderWidget &inWidget)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inWidget.GetNode());
+ if (theData)
+ theData->AddRenderWidget(inWidget);
+ }
+
+ void Qt3DSRendererImpl::RenderLayerRect(SLayer &inLayer, const QT3DSVec3 &inColor)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer);
+ if (theData)
+ theData->m_BoundingRectColor = inColor;
+ }
+
+ SScaleAndPosition Qt3DSRendererImpl::GetWorldToPixelScaleFactor(const SCamera &inCamera,
+ const QT3DSVec3 &inWorldPoint,
+ SLayerRenderData &inRenderData)
+ {
+ if (inCamera.m_Flags.IsOrthographic() == true) {
+ // There are situations where the camera can scale.
+ return SScaleAndPosition(
+ inWorldPoint,
+ inCamera.GetOrthographicScaleFactor(
+ inRenderData.m_LayerPrepResult->GetLayerToPresentationViewport(),
+ inRenderData.m_LayerPrepResult->GetPresentationDesignDimensions()));
+ } else {
+ QT3DSVec3 theCameraPos(0, 0, 0);
+ QT3DSVec3 theCameraDir(0, 0, -1);
+ SRay theRay(theCameraPos, inWorldPoint - theCameraPos);
+ NVPlane thePlane(theCameraDir, -600);
+ QT3DSVec3 theItemPosition(inWorldPoint);
+ Option<QT3DSVec3> theIntersection = theRay.Intersect(thePlane);
+ if (theIntersection.hasValue())
+ theItemPosition = *theIntersection;
+ // The special number comes in from physically measuring how off we are on the screen.
+ QT3DSF32 theScaleFactor = (1.0f / inCamera.m_Projection.column1[1]);
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inCamera);
+ QT3DSU32 theHeight = theData->m_LayerPrepResult->GetTextureDimensions().height();
+ QT3DSF32 theScaleMultiplier = 600.0f / ((QT3DSF32)theHeight / 2.0f);
+ theScaleFactor *= theScaleMultiplier;
+
+ return SScaleAndPosition(theItemPosition, theScaleFactor);
+ }
+ }
+
+ SScaleAndPosition Qt3DSRendererImpl::GetWorldToPixelScaleFactor(SLayer &inLayer,
+ const QT3DSVec3 &inWorldPoint)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inLayer);
+ if (theData == NULL || theData->m_Camera == NULL) {
+ QT3DS_ASSERT(false);
+ return SScaleAndPosition();
+ }
+ return GetWorldToPixelScaleFactor(*theData->m_Camera, inWorldPoint, *theData);
+ }
+
+ void Qt3DSRendererImpl::ReleaseLayerRenderResources(SLayer &inLayer, const SRenderInstanceId id)
+ {
+ TInstanceRenderMap::iterator theIter
+ = m_InstanceRenderMap.find(combineLayerAndId(&inLayer, id));
+ if (theIter != m_InstanceRenderMap.end()) {
+ TLayerRenderList::iterator theLastFrm = eastl::find(
+ m_LastFrameLayers.begin(), m_LastFrameLayers.end(), theIter->second.mPtr);
+ if (theLastFrm != m_LastFrameLayers.end()) {
+ theIter->second->ResetForFrame();
+ m_LastFrameLayers.erase(theLastFrm);
+ }
+ m_InstanceRenderMap.erase(theIter);
+ }
+ }
+
+ void Qt3DSRendererImpl::RenderQuad(const QT3DSVec2 inDimensions, const QT3DSMat44 &inMVP,
+ NVRenderTexture2D &inQuadTexture)
+ {
+ m_Context->SetCullingEnabled(false);
+ SLayerSceneShader *theShader = GetSceneLayerShader();
+ NVRenderContext &theContext(*m_Context);
+ theContext.SetActiveShader(&theShader->m_Shader);
+ theShader->m_MVP.Set(inMVP);
+ theShader->m_Dimensions.Set(inDimensions);
+ theShader->m_Sampler.Set(&inQuadTexture);
+
+ GenerateXYQuad();
+ theContext.SetInputAssembler(m_QuadInputAssembler);
+ theContext.Draw(NVRenderDrawMode::Triangles, m_QuadIndexBuffer->GetNumIndices(), 0);
+ }
+
+ void Qt3DSRendererImpl::RenderQuad()
+ {
+ m_Context->SetCullingEnabled(false);
+ GenerateXYQuad();
+ m_Context->SetInputAssembler(m_QuadInputAssembler);
+ m_Context->Draw(NVRenderDrawMode::Triangles, m_QuadIndexBuffer->GetNumIndices(), 0);
+ }
+
+ void Qt3DSRendererImpl::RenderPointsIndirect()
+ {
+ m_Context->SetCullingEnabled(false);
+ GenerateXYZPoint();
+ m_Context->SetInputAssembler(m_PointInputAssembler);
+ m_Context->DrawIndirect(NVRenderDrawMode::Points, 0);
+ }
+
+ void Qt3DSRendererImpl::LayerNeedsFrameClear(SLayerRenderData &inLayer)
+ {
+ m_LastFrameLayers.push_back(&inLayer);
+ }
+
+ void Qt3DSRendererImpl::BeginLayerDepthPassRender(SLayerRenderData &inLayer)
+ {
+ m_CurrentLayer = &inLayer;
+ }
+
+ void Qt3DSRendererImpl::EndLayerDepthPassRender() { m_CurrentLayer = NULL; }
+
+ void Qt3DSRendererImpl::BeginLayerRender(SLayerRenderData &inLayer)
+ {
+ m_CurrentLayer = &inLayer;
+ // Remove all of the shaders from the layer shader set
+ // so that we can only apply the camera and lighting properties to
+ // shaders that are in the layer.
+ m_LayerShaders.clear();
+ }
+ void Qt3DSRendererImpl::EndLayerRender() { m_CurrentLayer = NULL; }
+
+// Allocate an object that lasts only this frame.
+#define RENDER_FRAME_NEW(type) \
+ new (m_PerFrameAllocator.m_FastAllocator.allocate(sizeof(type), __FILE__, __LINE__)) type
+
+ void Qt3DSRendererImpl::PrepareImageForIbl(SImage &inImage)
+ {
+ if (inImage.m_TextureData.m_Texture && inImage.m_TextureData.m_Texture->GetNumMipmaps() < 1)
+ inImage.m_TextureData.m_Texture->GenerateMipmaps();
+ }
+
+ bool NodeContainsBoneRoot(SNode &childNode, QT3DSI32 rootID)
+ {
+ for (SNode *childChild = childNode.m_FirstChild; childChild != NULL;
+ childChild = childChild->m_NextSibling) {
+ if (childChild->m_SkeletonId == rootID)
+ return true;
+ }
+
+ return false;
+ }
+
+ void FillBoneIdNodeMap(SNode &childNode, nvhash_map<long, SNode *> &ioMap)
+ {
+ if (childNode.m_SkeletonId >= 0)
+ ioMap[childNode.m_SkeletonId] = &childNode;
+ for (SNode *childChild = childNode.m_FirstChild; childChild != NULL;
+ childChild = childChild->m_NextSibling)
+ FillBoneIdNodeMap(*childChild, ioMap);
+ }
+
+ bool Qt3DSRendererImpl::PrepareTextureAtlasForRender()
+ {
+ ITextTextureAtlas *theTextureAtlas = m_qt3dsContext.GetTextureAtlas();
+ if (theTextureAtlas == NULL)
+ return false;
+
+ // this is a one time creation
+ if (!theTextureAtlas->IsInitialized()) {
+ NVRenderContext &theContext(*m_Context);
+ NVScopedRefCounted<NVRenderVertexBuffer> mVertexBuffer;
+ NVScopedRefCounted<NVRenderInputAssembler> mInputAssembler;
+ NVScopedRefCounted<NVRenderAttribLayout> mAttribLayout;
+ // temporay FB
+ using qt3ds::render::NVRenderContextScopedProperty;
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __fbo(
+ *m_Context, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+
+ ITextRenderer &theTextRenderer(*m_qt3dsContext.GetOnscreenTextRenderer());
+ TTextTextureAtlasDetailsAndTexture theResult = theTextureAtlas->PrepareTextureAtlas();
+ if (!theResult.first.m_EntryCount) {
+ QT3DS_ASSERT(theResult.first.m_EntryCount);
+ return false;
+ }
+
+ // generate the index buffer we need
+ GenerateXYQuad();
+
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ qt3ds::render::NVRenderVertexBufferEntry(
+ "attr_uv", qt3ds::render::NVRenderComponentTypes::QT3DSF32, 2, 12),
+ };
+
+ // create our attribute layout
+ mAttribLayout = m_Context->CreateAttributeLayout(toConstDataRef(theEntries, 2));
+
+ NVRenderFrameBuffer *theAtlasFB(
+ m_qt3dsContext.GetResourceManager().AllocateFrameBuffer());
+ theAtlasFB->Attach(NVRenderFrameBufferAttachments::Color0, *theResult.second);
+ m_qt3dsContext.GetRenderContext().SetRenderTarget(theAtlasFB);
+
+ // this texture contains our single entries
+ NVRenderTexture2D *theTexture = nullptr;
+ if (m_Context->GetRenderContextType() == NVRenderContextValues::GLES2) {
+ theTexture = m_qt3dsContext.GetResourceManager()
+ .AllocateTexture2D(32, 32, NVRenderTextureFormats::RGBA8);
+ } else {
+ theTexture = m_qt3dsContext.GetResourceManager()
+ .AllocateTexture2D(32, 32, NVRenderTextureFormats::Alpha8);
+ }
+ m_Context->SetClearColor(QT3DSVec4(0, 0, 0, 0));
+ m_Context->Clear(NVRenderClearValues::Color);
+ m_Context->SetDepthTestEnabled(false);
+ m_Context->SetScissorTestEnabled(false);
+ m_Context->SetCullingEnabled(false);
+ m_Context->SetBlendingEnabled(false);
+ m_Context->SetViewport(
+ NVRenderRect(0, 0, theResult.first.m_TextWidth, theResult.first.m_TextHeight));
+
+ SCamera theCamera;
+ theCamera.m_ClipNear = -1.0;
+ theCamera.m_ClipFar = 1.0;
+ theCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ theCamera.m_Flags.SetOrthographic(true);
+ QT3DSVec2 theTextureDims((QT3DSF32)theResult.first.m_TextWidth,
+ (QT3DSF32)theResult.first.m_TextHeight);
+ theCamera.CalculateGlobalVariables(
+ NVRenderRect(0, 0, theResult.first.m_TextWidth, theResult.first.m_TextHeight),
+ theTextureDims);
+ // We want a 2D lower left projection
+ QT3DSF32 *writePtr(theCamera.m_Projection.front());
+ writePtr[12] = -1;
+ writePtr[13] = -1;
+
+ // generate render stuff
+ // We dynamicall update the vertex buffer
+ QT3DSF32 tempBuf[20];
+ QT3DSF32 *bufPtr = tempBuf;
+ QT3DSU32 bufSize = 20 * sizeof(QT3DSF32); // 4 vertices 3 pos 2 tex
+ NVDataRef<QT3DSU8> vertData((QT3DSU8 *)bufPtr, bufSize);
+ mVertexBuffer = theContext.CreateVertexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Dynamic, 20 * sizeof(QT3DSF32),
+ 3 * sizeof(QT3DSF32) + 2 * sizeof(QT3DSF32), vertData);
+ QT3DSU32 strides = mVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ mInputAssembler = theContext.CreateInputAssembler(
+ mAttribLayout, toConstDataRef(&mVertexBuffer.mPtr, 1), m_QuadIndexBuffer.mPtr,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+
+ NVRenderShaderProgram *theShader = GetTextAtlasEntryShader();
+ STextShader theTextShader(*theShader);
+
+ if (theShader) {
+ theContext.SetActiveShader(theShader);
+ theTextShader.m_MVP.Set(theCamera.m_Projection);
+
+ // we are going through all entries and render to the FBO
+ for (QT3DSU32 i = 0; i < theResult.first.m_EntryCount; i++) {
+ STextTextureAtlasEntryDetails theDetails =
+ theTextRenderer.RenderAtlasEntry(i, *theTexture);
+ // update vbo
+ // we need to mirror coordinates
+ QT3DSF32 x1 = (QT3DSF32)theDetails.m_X;
+ QT3DSF32 x2 = (QT3DSF32)theDetails.m_X + theDetails.m_TextWidth;
+ QT3DSF32 y1 = (QT3DSF32)theDetails.m_Y;
+ QT3DSF32 y2 = (QT3DSF32)theDetails.m_Y + theDetails.m_TextHeight;
+
+ QT3DSF32 box[4][5] = {
+ { x1, y1, 0, 0, 1 },
+ { x1, y2, 0, 0, 0 },
+ { x2, y2, 0, 1, 0 },
+ { x2, y1, 0, 1, 1 },
+ };
+
+ NVDataRef<QT3DSU8> vertData((QT3DSU8 *)box, bufSize);
+ mVertexBuffer->UpdateBuffer(vertData, false);
+
+ theTextShader.m_Sampler.Set(theTexture);
+
+ theContext.SetInputAssembler(mInputAssembler);
+ theContext.Draw(NVRenderDrawMode::Triangles, m_QuadIndexBuffer->GetNumIndices(),
+ 0);
+ }
+ }
+
+ m_qt3dsContext.GetResourceManager().Release(*theTexture);
+ m_qt3dsContext.GetResourceManager().Release(*theAtlasFB);
+
+ return true;
+ }
+
+ return theTextureAtlas->IsInitialized();
+ }
+
+ Option<QT3DSVec2> Qt3DSRendererImpl::GetLayerMouseCoords(SLayerRenderData &inLayerRenderData,
+ const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool forceImageIntersect) const
+ {
+ if (inLayerRenderData.m_LayerPrepResult.hasValue())
+ return inLayerRenderData.m_LayerPrepResult->GetLayerMouseCoords(
+ inMouseCoords, inViewportDimensions, forceImageIntersect);
+ return Empty();
+ }
+
+ void Qt3DSRendererImpl::GetLayerHitObjectList(SLayerRenderData &inLayerRenderData,
+ const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inPresCoords, bool inPickEverything,
+ TPickResultArray &outIntersectionResult,
+ NVAllocatorCallback &inTempAllocator)
+ {
+ // This function assumes the layer was rendered to the scene itself. There is another
+ // function
+ // for completely offscreen layers that don't get rendered to the scene.
+ bool wasRenderToTarget(inLayerRenderData.m_Layer.m_Flags.IsLayerRenderToTarget());
+ if (wasRenderToTarget && inLayerRenderData.m_Camera != NULL) {
+ Option<SRay> theHitRay;
+ if (inLayerRenderData.m_LayerPrepResult.hasValue()) {
+ theHitRay = inLayerRenderData.m_LayerPrepResult->GetPickRay(
+ inPresCoords, inViewportDimensions, false, m_Context->isSceneCameraView());
+ }
+ if (inLayerRenderData.m_LastFrameOffscreenRenderer.mPtr == NULL) {
+ if (theHitRay.hasValue()) {
+ // Scale the mouse coords to change them into the camera's numerical space.
+ SRay thePickRay = *theHitRay;
+ for (QT3DSU32 idx = inLayerRenderData.m_OpaqueObjects.size(), end = 0; idx > end;
+ --idx) {
+ SRenderableObject *theRenderableObject =
+ inLayerRenderData.m_OpaqueObjects[idx - 1];
+ if (inPickEverything
+ || theRenderableObject->m_RenderableFlags.GetPickable())
+ IntersectRayWithSubsetRenderable(thePickRay, *theRenderableObject,
+ outIntersectionResult,
+ inTempAllocator);
+ }
+ for (QT3DSU32 idx = inLayerRenderData.m_TransparentObjects.size(), end = 0;
+ idx > end; --idx) {
+ SRenderableObject *theRenderableObject =
+ inLayerRenderData.m_TransparentObjects[idx - 1];
+ if (inPickEverything
+ || theRenderableObject->m_RenderableFlags.GetPickable())
+ IntersectRayWithSubsetRenderable(thePickRay, *theRenderableObject,
+ outIntersectionResult,
+ inTempAllocator);
+ }
+ }
+ } else {
+ IGraphObjectPickQuery *theQuery =
+ inLayerRenderData.m_LastFrameOffscreenRenderer->GetGraphObjectPickQuery(this);
+ if (theQuery) {
+ Qt3DSRenderPickResult theResult =
+ theQuery->Pick(inPresCoords, inViewportDimensions, inPickEverything);
+ if (theResult.m_HitObject) {
+ theResult.m_OffscreenRenderer =
+ inLayerRenderData.m_LastFrameOffscreenRenderer;
+ outIntersectionResult.push_back(theResult);
+ }
+ } else
+ inLayerRenderData.m_LastFrameOffscreenRenderer->Pick(inPresCoords,
+ inViewportDimensions,
+ this);
+ }
+ }
+ }
+
+ static inline Qt3DSRenderPickSubResult ConstructSubResult(SRenderableImage &inImage)
+ {
+ return ConstructSubResult(inImage.m_Image);
+ }
+
+ void Qt3DSRendererImpl::IntersectRayWithSubsetRenderable(
+ const SRay &inRay, SRenderableObject &inRenderableObject,
+ TPickResultArray &outIntersectionResultList, NVAllocatorCallback &inTempAllocator)
+ {
+ Option<SRayIntersectionResult> theIntersectionResultOpt(inRay.IntersectWithAABB(
+ inRenderableObject.m_GlobalTransform, inRenderableObject.m_Bounds));
+ if (theIntersectionResultOpt.hasValue() == false)
+ return;
+ SRayIntersectionResult &theResult(*theIntersectionResultOpt);
+
+ // Leave the coordinates relative for right now.
+ const SGraphObject *thePickObject = NULL;
+ if (inRenderableObject.m_RenderableFlags.IsDefaultMaterialMeshSubset())
+ thePickObject =
+ &static_cast<SSubsetRenderable *>(&inRenderableObject)->m_ModelContext.m_Model;
+ else if (inRenderableObject.m_RenderableFlags.IsText())
+ thePickObject = &static_cast<STextRenderable *>(&inRenderableObject)->m_Text;
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ else if (inRenderableObject.m_RenderableFlags.isDistanceField())
+ thePickObject = &static_cast<SDistanceFieldRenderable *>(&inRenderableObject)->m_text;
+#endif
+ else if (inRenderableObject.m_RenderableFlags.IsCustomMaterialMeshSubset())
+ thePickObject = &static_cast<SCustomMaterialRenderable *>(&inRenderableObject)
+ ->m_ModelContext.m_Model;
+ else if (inRenderableObject.m_RenderableFlags.IsPath())
+ thePickObject = &static_cast<SPathRenderable *>(&inRenderableObject)->m_Path;
+
+ if (thePickObject != NULL) {
+ outIntersectionResultList.push_back(Qt3DSRenderPickResult(
+ *thePickObject, theResult.m_RayLengthSquared, theResult.m_RelXY));
+
+ // For subsets, we know we can find images on them which may have been the result
+ // of rendering a sub-presentation.
+ if (inRenderableObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) {
+ Qt3DSRenderPickSubResult *theLastResult = NULL;
+ for (SRenderableImage *theImage =
+ static_cast<SSubsetRenderable *>(&inRenderableObject)->m_FirstImage;
+ theImage != NULL; theImage = theImage->m_NextImage) {
+ if (theImage->m_Image.m_LastFrameOffscreenRenderer != NULL
+ && theImage->m_Image.m_TextureData.m_Texture != NULL) {
+ Qt3DSRenderPickSubResult *theSubResult =
+ (Qt3DSRenderPickSubResult *)inTempAllocator.allocate(
+ sizeof(Qt3DSRenderPickSubResult), "Qt3DSRenderPickSubResult",
+ __FILE__, __LINE__);
+
+ new (theSubResult) Qt3DSRenderPickSubResult(ConstructSubResult(*theImage));
+ if (theLastResult == NULL)
+ outIntersectionResultList.back().m_FirstSubObject = theSubResult;
+ else
+ theLastResult->m_NextSibling = theSubResult;
+ theLastResult = theSubResult;
+ }
+ }
+ }
+ }
+ }
+
+#ifndef EA_PLATFORM_WINDOWS
+#define _snprintf snprintf
+#endif
+
+ NVRenderShaderProgram *Qt3DSRendererImpl::CompileShader(CRegisteredString inName,
+ const char8_t *inVert,
+ const char8_t *inFrag)
+ {
+ GetProgramGenerator().BeginProgram();
+ GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex)->Append(inVert);
+ GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment)->Append(inFrag);
+ return GetProgramGenerator().CompileGeneratedShader(inName);
+ }
+
+ const QT3DSF32 MINATTENUATION = 0;
+ const QT3DSF32 MAXATTENUATION = 1000;
+
+ QT3DSF32 ClampFloat(QT3DSF32 value, QT3DSF32 min, QT3DSF32 max)
+ {
+ return value < min ? min : ((value > max) ? max : value);
+ }
+
+ QT3DSF32 TranslateConstantAttenuation(QT3DSF32 attenuation) { return attenuation * .01f; }
+
+ QT3DSF32 TranslateLinearAttenuation(QT3DSF32 attenuation)
+ {
+ attenuation = ClampFloat(attenuation, MINATTENUATION, MAXATTENUATION);
+ return attenuation * 0.0001f;
+ }
+
+ QT3DSF32 TranslateQuadraticAttenuation(QT3DSF32 attenuation)
+ {
+ attenuation = ClampFloat(attenuation, MINATTENUATION, MAXATTENUATION);
+ return attenuation * 0.0000001f;
+ }
+
+ SShaderGeneratorGeneratedShader *Qt3DSRendererImpl::GetShader(SSubsetRenderable &inRenderable,
+ TShaderFeatureSet inFeatureSet)
+ {
+ if (m_CurrentLayer == NULL) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+ TShaderMap::iterator theFind = m_Shaders.find(inRenderable.m_ShaderDescription);
+ SShaderGeneratorGeneratedShader *retval = NULL;
+ if (theFind == m_Shaders.end()) {
+ // Generate the shader.
+ NVRenderShaderProgram *theShader(GenerateShader(inRenderable, inFeatureSet));
+ if (theShader) {
+ SShaderGeneratorGeneratedShader *theGeneratedShader =
+ (SShaderGeneratorGeneratedShader *)m_Context->GetAllocator().allocate(
+ sizeof(SShaderGeneratorGeneratedShader), "SShaderGeneratorGeneratedShader",
+ __FILE__, __LINE__);
+ new (theGeneratedShader) SShaderGeneratorGeneratedShader(
+ m_StringTable->RegisterStr(m_GeneratedShaderString.c_str()), *theShader);
+ m_Shaders.insert(make_pair(inRenderable.m_ShaderDescription, theGeneratedShader));
+ retval = theGeneratedShader;
+ }
+ // We still insert something because we don't to attempt to generate the same bad shader
+ // twice.
+ else
+ m_Shaders.insert(make_pair(inRenderable.m_ShaderDescription,
+ (SShaderGeneratorGeneratedShader *)NULL));
+ } else
+ retval = theFind->second;
+
+ if (retval != NULL) {
+ if (!m_LayerShaders.contains(*retval)) {
+ m_LayerShaders.insert(*retval);
+ }
+ if (m_CurrentLayer && m_CurrentLayer->m_Camera) {
+ SCamera &theCamera(*m_CurrentLayer->m_Camera);
+ if (m_CurrentLayer->m_CameraDirection.hasValue() == false)
+ m_CurrentLayer->m_CameraDirection = theCamera.GetScalingCorrectDirection();
+ }
+ }
+ return retval;
+ }
+ static QT3DSVec3 g_fullScreenRectFace[] = {
+ QT3DSVec3(-1, -1, 0), QT3DSVec3(-1, 1, 0), QT3DSVec3(1, 1, 0), QT3DSVec3(1, -1, 0),
+ };
+
+ static QT3DSVec2 g_fullScreenRectUVs[] = { QT3DSVec2(0, 0), QT3DSVec2(0, 1), QT3DSVec2(1, 1),
+ QT3DSVec2(1, 0) };
+
+ void Qt3DSRendererImpl::GenerateXYQuad()
+ {
+ if (m_QuadInputAssembler)
+ return;
+
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ qt3ds::render::NVRenderVertexBufferEntry("attr_uv",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 2, 12),
+ };
+
+ QT3DSF32 tempBuf[20];
+ QT3DSF32 *bufPtr = tempBuf;
+ QT3DSVec3 *facePtr(g_fullScreenRectFace);
+ QT3DSVec2 *uvPtr(g_fullScreenRectUVs);
+ for (int j = 0; j < 4; j++, ++facePtr, ++uvPtr, bufPtr += 5) {
+ bufPtr[0] = facePtr->x;
+ bufPtr[1] = facePtr->y;
+ bufPtr[2] = facePtr->z;
+ bufPtr[3] = uvPtr->x;
+ bufPtr[4] = uvPtr->y;
+ }
+ m_QuadVertexBuffer = m_Context->CreateVertexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static, 20 * sizeof(QT3DSF32),
+ 3 * sizeof(QT3DSF32) + 2 * sizeof(QT3DSF32), toU8DataRef(tempBuf, 20));
+
+ QT3DSU8 indexData[] = {
+ 0, 1, 2, 0, 2, 3,
+ };
+ m_QuadIndexBuffer = m_Context->CreateIndexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static, qt3ds::render::NVRenderComponentTypes::QT3DSU8,
+ sizeof(indexData), toU8DataRef(indexData, sizeof(indexData)));
+
+ // create our attribute layout
+ m_QuadAttribLayout = m_Context->CreateAttributeLayout(toConstDataRef(theEntries, 2));
+
+ // create input assembler object
+ QT3DSU32 strides = m_QuadVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ m_QuadInputAssembler = m_Context->CreateInputAssembler(
+ m_QuadAttribLayout, toConstDataRef(&m_QuadVertexBuffer.mPtr, 1), m_QuadIndexBuffer,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+ }
+
+ void Qt3DSRendererImpl::GenerateXYZPoint()
+ {
+ if (m_PointInputAssembler)
+ return;
+
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ qt3ds::render::NVRenderVertexBufferEntry("attr_uv",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 2, 12),
+ };
+
+ QT3DSF32 tempBuf[5];
+ tempBuf[0] = tempBuf[1] = tempBuf[2] = 0.0;
+ tempBuf[3] = tempBuf[4] = 0.0;
+
+ m_PointVertexBuffer = m_Context->CreateVertexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static, 5 * sizeof(QT3DSF32),
+ 3 * sizeof(QT3DSF32) + 2 * sizeof(QT3DSF32), toU8DataRef(tempBuf, 5));
+
+ // create our attribute layout
+ m_PointAttribLayout = m_Context->CreateAttributeLayout(toConstDataRef(theEntries, 2));
+
+ // create input assembler object
+ QT3DSU32 strides = m_PointVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ m_PointInputAssembler = m_Context->CreateInputAssembler(
+ m_PointAttribLayout, toConstDataRef(&m_PointVertexBuffer.mPtr, 1), NULL,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+ }
+
+ eastl::pair<NVRenderVertexBuffer *, NVRenderIndexBuffer *> Qt3DSRendererImpl::GetXYQuad()
+ {
+ if (!m_QuadInputAssembler)
+ GenerateXYQuad();
+
+ return eastl::make_pair(m_QuadVertexBuffer.mPtr, m_QuadIndexBuffer.mPtr);
+ }
+
+ SLayerGlobalRenderProperties Qt3DSRendererImpl::GetLayerGlobalRenderProperties()
+ {
+ SLayerRenderData &theData = *m_CurrentLayer;
+ SLayer &theLayer = theData.m_Layer;
+ if (theData.m_CameraDirection.hasValue() == false)
+ theData.m_CameraDirection = theData.m_Camera->GetScalingCorrectDirection();
+
+ return SLayerGlobalRenderProperties(
+ theLayer, *theData.m_Camera, *theData.m_CameraDirection, theData.m_Lights,
+ theData.m_LightDirections, theData.m_ShadowMapManager.mPtr, theData.m_LayerDepthTexture,
+ theData.m_LayerSsaoTexture, theLayer.m_LightProbe, theLayer.m_LightProbe2,
+ theLayer.m_ProbeHorizon, theLayer.m_ProbeBright, theLayer.m_Probe2Window,
+ theLayer.m_Probe2Pos, theLayer.m_Probe2Fade, theLayer.m_ProbeFov);
+ }
+
+ void Qt3DSRendererImpl::GenerateXYQuadStrip()
+ {
+ if (m_QuadStripInputAssembler)
+ return;
+
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ qt3ds::render::NVRenderVertexBufferEntry("attr_uv",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 2, 12),
+ };
+
+ // this buffer is filled dynmically
+ m_QuadStripVertexBuffer =
+ m_Context->CreateVertexBuffer(qt3ds::render::NVRenderBufferUsageType::Dynamic, 0,
+ 3 * sizeof(QT3DSF32) + 2 * sizeof(QT3DSF32) // stride
+ ,
+ NVDataRef<QT3DSU8>());
+
+ // create our attribute layout
+ m_QuadStripAttribLayout = m_Context->CreateAttributeLayout(toConstDataRef(theEntries, 2));
+
+ // create input assembler object
+ QT3DSU32 strides = m_QuadStripVertexBuffer->GetStride();
+ QT3DSU32 offsets = 0;
+ m_QuadStripInputAssembler = m_Context->CreateInputAssembler(
+ m_QuadStripAttribLayout, toConstDataRef(&m_QuadStripVertexBuffer.mPtr, 1), NULL,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1));
+ }
+
+ void Qt3DSRendererImpl::UpdateCbAoShadow(const SLayer *pLayer, const SCamera *pCamera,
+ CResourceTexture2D &inDepthTexture)
+ {
+ if (m_Context->GetConstantBufferSupport()) {
+ CRegisteredString theName = m_Context->GetStringTable().RegisterStr("cbAoShadow");
+ NVRenderConstantBuffer *pCB = m_Context->GetConstantBuffer(theName);
+
+ if (!pCB) {
+ // the size is determined automatically later on
+ pCB = m_Context->CreateConstantBuffer(
+ theName, qt3ds::render::NVRenderBufferUsageType::Static, 0, NVDataRef<QT3DSU8>());
+ if (!pCB) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ m_ConstantBuffers.insert(eastl::make_pair(theName, pCB));
+
+ // Add paramters. Note should match the appearance in the shader program
+ pCB->AddParam(m_Context->GetStringTable().RegisterStr("ao_properties"),
+ qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4, 1);
+ pCB->AddParam(m_Context->GetStringTable().RegisterStr("ao_properties2"),
+ qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4, 1);
+ pCB->AddParam(m_Context->GetStringTable().RegisterStr("shadow_properties"),
+ qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4, 1);
+ pCB->AddParam(m_Context->GetStringTable().RegisterStr("aoScreenConst"),
+ qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4, 1);
+ pCB->AddParam(m_Context->GetStringTable().RegisterStr("UvToEyeConst"),
+ qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4, 1);
+ }
+
+ // update values
+ QT3DSVec4 aoProps(pLayer->m_AoStrength * 0.01f, pLayer->m_AoDistance * 0.4f,
+ pLayer->m_AoSoftness * 0.02f, pLayer->m_AoBias);
+ pCB->UpdateParam("ao_properties", NVDataRef<QT3DSU8>((QT3DSU8 *)&aoProps, 1));
+ QT3DSVec4 aoProps2((QT3DSF32)pLayer->m_AoSamplerate, (pLayer->m_AoDither) ? 1.0f : 0.0f, 0.0f,
+ 0.0f);
+ pCB->UpdateParam("ao_properties2", NVDataRef<QT3DSU8>((QT3DSU8 *)&aoProps2, 1));
+ QT3DSVec4 shadowProps(pLayer->m_ShadowStrength * 0.01f, pLayer->m_ShadowDist,
+ pLayer->m_ShadowSoftness * 0.01f, pLayer->m_ShadowBias);
+ pCB->UpdateParam("shadow_properties", NVDataRef<QT3DSU8>((QT3DSU8 *)&shadowProps, 1));
+
+ QT3DSF32 R2 = pLayer->m_AoDistance * pLayer->m_AoDistance * 0.16f;
+ QT3DSF32 rw = 100, rh = 100;
+
+ if (inDepthTexture && inDepthTexture.GetTexture()) {
+ rw = (QT3DSF32)inDepthTexture.GetTexture()->GetTextureDetails().m_Width;
+ rh = (QT3DSF32)inDepthTexture.GetTexture()->GetTextureDetails().m_Height;
+ }
+ QT3DSF32 fov = (pCamera) ? pCamera->verticalFov(rw / rh) : 1.0f;
+ QT3DSF32 tanHalfFovY = tanf(0.5f * fov * (rh / rw));
+ QT3DSF32 invFocalLenX = tanHalfFovY * (rw / rh);
+
+ QT3DSVec4 aoScreenConst(1.0f / R2, rh / (2.0f * tanHalfFovY), 1.0f / rw, 1.0f / rh);
+ pCB->UpdateParam("aoScreenConst", NVDataRef<QT3DSU8>((QT3DSU8 *)&aoScreenConst, 1));
+ QT3DSVec4 UvToEyeConst(2.0f * invFocalLenX, -2.0f * tanHalfFovY, -invFocalLenX,
+ tanHalfFovY);
+ pCB->UpdateParam("UvToEyeConst", NVDataRef<QT3DSU8>((QT3DSU8 *)&UvToEyeConst, 1));
+
+ // update buffer to hardware
+ pCB->Update();
+ }
+ }
+
+ // widget context implementation
+
+ NVRenderVertexBuffer &Qt3DSRendererImpl::GetOrCreateVertexBuffer(CRegisteredString &inStr,
+ QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVRenderVertexBuffer *retval = GetVertexBuffer(inStr);
+ if (retval) {
+ // we update the buffer
+ retval->UpdateBuffer(bufferData, false);
+ return *retval;
+ }
+ retval = m_Context->CreateVertexBuffer(qt3ds::render::NVRenderBufferUsageType::Dynamic,
+ bufferData.size(), stride, bufferData);
+ m_WidgetVertexBuffers.insert(eastl::make_pair(inStr, retval));
+ return *retval;
+ }
+ NVRenderIndexBuffer &
+ Qt3DSRendererImpl::GetOrCreateIndexBuffer(CRegisteredString &inStr,
+ qt3ds::render::NVRenderComponentTypes::Enum componentType,
+ size_t size, NVConstDataRef<QT3DSU8> bufferData)
+ {
+ NVRenderIndexBuffer *retval = GetIndexBuffer(inStr);
+ if (retval) {
+ // we update the buffer
+ retval->UpdateBuffer(bufferData, false);
+ return *retval;
+ }
+
+ retval = m_Context->CreateIndexBuffer(qt3ds::render::NVRenderBufferUsageType::Dynamic,
+ componentType, size, bufferData);
+ m_WidgetIndexBuffers.insert(eastl::make_pair(inStr, retval));
+ return *retval;
+ }
+
+ NVRenderAttribLayout &Qt3DSRendererImpl::CreateAttributeLayout(
+ NVConstDataRef<qt3ds::render::NVRenderVertexBufferEntry> attribs)
+ {
+ // create our attribute layout
+ NVRenderAttribLayout *theAttribLAyout = m_Context->CreateAttributeLayout(attribs);
+ return *theAttribLAyout;
+ }
+
+ NVRenderInputAssembler &Qt3DSRendererImpl::GetOrCreateInputAssembler(
+ CRegisteredString &inStr, NVRenderAttribLayout *attribLayout,
+ NVConstDataRef<NVRenderVertexBuffer *> buffers, const NVRenderIndexBuffer *indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets)
+ {
+ NVRenderInputAssembler *retval = GetInputAssembler(inStr);
+ if (retval)
+ return *retval;
+
+ retval =
+ m_Context->CreateInputAssembler(attribLayout, buffers, indexBuffer, strides, offsets);
+ m_WidgetInputAssembler.insert(eastl::make_pair(inStr, retval));
+ return *retval;
+ }
+
+ NVRenderVertexBuffer *Qt3DSRendererImpl::GetVertexBuffer(CRegisteredString &inStr)
+ {
+ TStrVertBufMap::iterator theIter = m_WidgetVertexBuffers.find(inStr);
+ if (theIter != m_WidgetVertexBuffers.end())
+ return theIter->second;
+ return NULL;
+ }
+
+ NVRenderIndexBuffer *Qt3DSRendererImpl::GetIndexBuffer(CRegisteredString &inStr)
+ {
+ TStrIndexBufMap::iterator theIter = m_WidgetIndexBuffers.find(inStr);
+ if (theIter != m_WidgetIndexBuffers.end())
+ return theIter->second;
+ return NULL;
+ }
+
+ NVRenderInputAssembler *Qt3DSRendererImpl::GetInputAssembler(CRegisteredString &inStr)
+ {
+ TStrIAMap::iterator theIter = m_WidgetInputAssembler.find(inStr);
+ if (theIter != m_WidgetInputAssembler.end())
+ return theIter->second;
+ return NULL;
+ }
+
+ NVRenderShaderProgram *Qt3DSRendererImpl::GetShader(CRegisteredString inStr)
+ {
+ TStrShaderMap::iterator theIter = m_WidgetShaders.find(inStr);
+ if (theIter != m_WidgetShaders.end())
+ return theIter->second;
+ return NULL;
+ }
+
+ NVRenderShaderProgram *Qt3DSRendererImpl::CompileAndStoreShader(CRegisteredString inStr)
+ {
+ NVRenderShaderProgram *newProgram = GetProgramGenerator().CompileGeneratedShader(inStr);
+ if (newProgram)
+ m_WidgetShaders.insert(eastl::make_pair(inStr, newProgram));
+ return newProgram;
+ }
+
+ IShaderProgramGenerator &Qt3DSRendererImpl::GetProgramGenerator()
+ {
+ return m_qt3dsContext.GetShaderProgramGenerator();
+ }
+
+ STextDimensions Qt3DSRendererImpl::MeasureText(const STextRenderInfo &inText)
+ {
+ if (m_qt3dsContext.GetTextRenderer() != NULL)
+ return m_qt3dsContext.GetTextRenderer()->MeasureText(inText, 0);
+ return STextDimensions();
+ }
+
+ void Qt3DSRendererImpl::RenderText(const STextRenderInfo &inText, const QT3DSVec3 &inTextColor,
+ const QT3DSVec3 &inBackgroundColor, const QT3DSMat44 &inMVP)
+ {
+ if (m_qt3dsContext.GetTextRenderer() != NULL) {
+ ITextRenderer &theTextRenderer(*m_qt3dsContext.GetTextRenderer());
+ NVRenderTexture2D *theTexture = m_qt3dsContext.GetResourceManager().AllocateTexture2D(
+ 32, 32, NVRenderTextureFormats::RGBA8);
+ STextTextureDetails theTextTextureDetails =
+ theTextRenderer.RenderText(inText, *theTexture);
+ STextRenderHelper theTextHelper(GetTextWidgetShader());
+ if (theTextHelper.m_Shader != NULL) {
+ m_qt3dsContext.GetRenderContext().SetBlendingEnabled(false);
+ STextScaleAndOffset theScaleAndOffset(*theTexture, theTextTextureDetails, inText);
+ theTextHelper.m_Shader->Render(*theTexture, theScaleAndOffset,
+ QT3DSVec4(inTextColor, 1.0f), inMVP, QT3DSVec2(0, 0),
+ GetContext(), theTextHelper.m_QuadInputAssembler,
+ theTextHelper.m_QuadInputAssembler.GetIndexCount(),
+ theTextTextureDetails, inBackgroundColor);
+ }
+ m_qt3dsContext.GetResourceManager().Release(*theTexture);
+ }
+ }
+
+ void Qt3DSRendererImpl::RenderText2D(QT3DSF32 x, QT3DSF32 y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor,
+ const char *text)
+ {
+ if (m_qt3dsContext.GetOnscreenTextRenderer() != NULL) {
+ GenerateXYQuadStrip();
+
+ if (PrepareTextureAtlasForRender()) {
+ TTextRenderAtlasDetailsAndTexture theRenderTextDetails;
+ ITextTextureAtlas *theTextureAtlas = m_qt3dsContext.GetTextureAtlas();
+ QSize theWindow = m_qt3dsContext.GetWindowDimensions();
+
+ const wchar_t *wText = m_StringTable->GetWideStr(text);
+ STextRenderInfo theInfo;
+ theInfo.m_Text = m_StringTable->RegisterStr(wText);
+ theInfo.m_FontSize = 20;
+ // text scale 2% of screen we don't scale Y though because it becomes unreadable
+ theInfo.m_ScaleX = (theWindow.width() / 100.0f) * 1.5f / (theInfo.m_FontSize);
+ theInfo.m_ScaleY = 1.0f;
+
+ theRenderTextDetails = theTextureAtlas->RenderText(theInfo);
+
+ if (theRenderTextDetails.first.m_Vertices.size()) {
+ STextRenderHelper theTextHelper(GetOnscreenTextShader());
+ if (theTextHelper.m_Shader != NULL) {
+ // setup 2D projection
+ SCamera theCamera;
+ theCamera.m_ClipNear = -1.0;
+ theCamera.m_ClipFar = 1.0;
+
+ theCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ theCamera.m_Flags.SetOrthographic(true);
+ QT3DSVec2 theWindowDim((QT3DSF32)theWindow.width(), (QT3DSF32)theWindow.height());
+ theCamera.CalculateGlobalVariables(
+ NVRenderRect(0, 0, theWindow.width(), theWindow.height()),
+ theWindowDim);
+ // We want a 2D lower left projection
+ QT3DSF32 *writePtr(theCamera.m_Projection.front());
+ writePtr[12] = -1;
+ writePtr[13] = -1;
+
+ // upload vertices
+ m_QuadStripVertexBuffer->UpdateBuffer(theRenderTextDetails.first.m_Vertices,
+ false);
+
+ theTextHelper.m_Shader->Render2D(
+ *theRenderTextDetails.second, QT3DSVec4(inColor, 1.0f),
+ theCamera.m_Projection, GetContext(),
+ theTextHelper.m_QuadInputAssembler,
+ theRenderTextDetails.first.m_VertexCount, QT3DSVec2(x, y));
+ }
+ // we release the memory here
+ QT3DS_FREE(m_Context->GetAllocator(),
+ theRenderTextDetails.first.m_Vertices.begin());
+ }
+ }
+ }
+ }
+
+ void Qt3DSRendererImpl::RenderGpuProfilerStats(QT3DSF32 x, QT3DSF32 y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor)
+ {
+ if (!IsLayerGpuProfilingEnabled())
+ return;
+
+ char messageLine[1024];
+ TInstanceRenderMap::const_iterator theIter;
+
+ QT3DSF32 startY = y;
+
+ for (theIter = m_InstanceRenderMap.begin(); theIter != m_InstanceRenderMap.end(); theIter++) {
+ QT3DSF32 startX = x;
+ const SLayerRenderData *theLayerRenderData = theIter->second;
+ const SLayer *theLayer = &theLayerRenderData->m_Layer;
+
+ if (theLayer->m_Flags.IsActive() && theLayerRenderData->m_LayerProfilerGpu.mPtr) {
+ const IRenderProfiler::TStrIDVec &idList =
+ theLayerRenderData->m_LayerProfilerGpu->GetTimerIDs();
+ if (!idList.empty()) {
+ startY -= 22;
+ startX += 20;
+ RenderText2D(startX, startY, inColor, theLayer->m_Id);
+ IRenderProfiler::TStrIDVec::const_iterator theIdIter = idList.begin();
+ for (theIdIter = idList.begin(); theIdIter != idList.end(); theIdIter++) {
+ startY -= 22;
+ sprintf(messageLine, "%s: %.3f ms", theIdIter->c_str(),
+ theLayerRenderData->m_LayerProfilerGpu->GetElapsedTime(*theIdIter));
+ RenderText2D(startX + 20, startY, inColor, messageLine);
+ }
+ }
+ }
+ }
+ }
+
+ // Given a node and a point in the node's local space (most likely its pivot point), we return
+ // a normal matrix so you can get the axis out, a transformation from node to camera
+ // a new position and a floating point scale factor so you can render in 1/2 perspective mode
+ // or orthographic mode if you would like to.
+ SWidgetRenderInformation
+ Qt3DSRendererImpl::GetWidgetRenderInformation(SNode &inNode, const QT3DSVec3 &inPos,
+ RenderWidgetModes::Enum inWidgetMode)
+ {
+ SLayerRenderData *theData = GetOrCreateLayerRenderDataForNode(inNode);
+ SCamera *theCamera = theData->m_Camera;
+ if (theCamera == NULL || theData->m_LayerPrepResult.hasValue() == false) {
+ QT3DS_ASSERT(false);
+ return SWidgetRenderInformation();
+ }
+ QT3DSMat44 theGlobalTransform(QT3DSMat44::createIdentity());
+ if (inNode.m_Parent != NULL && inNode.m_Parent->m_Type != GraphObjectTypes::Layer
+ && !inNode.m_Flags.IsIgnoreParentTransform())
+ theGlobalTransform = inNode.m_Parent->m_GlobalTransform;
+ QT3DSMat44 theCameraInverse(theCamera->m_GlobalTransform.getInverse());
+ QT3DSMat44 theNodeParentToCamera;
+ if (inWidgetMode == RenderWidgetModes::Local)
+ theNodeParentToCamera = theCameraInverse * theGlobalTransform;
+ else
+ theNodeParentToCamera = theCameraInverse;
+
+ QT3DSMat33 theNormalMat(theNodeParentToCamera.column0.getXYZ(),
+ theNodeParentToCamera.column1.getXYZ(),
+ theNodeParentToCamera.column2.getXYZ());
+ theNormalMat = theNormalMat.getInverse().getTranspose();
+ theNormalMat.column0.normalize();
+ theNormalMat.column1.normalize();
+ theNormalMat.column2.normalize();
+
+ QT3DSMat44 theTranslation(QT3DSMat44::createIdentity());
+ theTranslation.column3.x = inNode.m_Position.x;
+ theTranslation.column3.y = inNode.m_Position.y;
+ theTranslation.column3.z = inNode.m_Position.z;
+ theTranslation.column3.z *= -1.0f;
+
+ theGlobalTransform = theGlobalTransform * theTranslation;
+
+ QT3DSMat44 theNodeToParentPlusTranslation = theCameraInverse * theGlobalTransform;
+ QT3DSVec3 thePos = theNodeToParentPlusTranslation.transform(inPos);
+ SScaleAndPosition theScaleAndPos = GetWorldToPixelScaleFactor(*theCamera, thePos, *theData);
+ QT3DSMat33 theLookAtMatrix(QT3DSMat33::createIdentity());
+ if (theCamera->m_Flags.IsOrthographic() == false) {
+ QT3DSVec3 theNodeToCamera = theScaleAndPos.m_Position;
+ theNodeToCamera.normalize();
+ QT3DSVec3 theOriginalAxis = QT3DSVec3(0, 0, -1);
+ QT3DSVec3 theRotAxis = theOriginalAxis.cross(theNodeToCamera);
+ QT3DSF32 theAxisLen = theRotAxis.normalize();
+ if (theAxisLen > .05f) {
+ QT3DSF32 theRotAmount = acos(theOriginalAxis.dot(theNodeToCamera));
+ QT3DSQuat theQuat(theRotAmount, theRotAxis);
+ theLookAtMatrix = QT3DSMat33(theQuat);
+ }
+ }
+ QT3DSVec3 thePosInWorldSpace = theGlobalTransform.transform(inPos);
+ QT3DSVec3 theCameraPosInWorldSpace = theCamera->GetGlobalPos();
+ QT3DSVec3 theCameraOffset = thePosInWorldSpace - theCameraPosInWorldSpace;
+ QT3DSVec3 theDir = theCameraOffset;
+ theDir.normalize();
+ // Things should be 600 units from the camera, as that is how all of our math is setup.
+ theCameraOffset = 600.0f * theDir;
+ return SWidgetRenderInformation(
+ theNormalMat, theNodeParentToCamera, theCamera->m_Projection, theCamera->m_Projection,
+ theLookAtMatrix, theCameraInverse, theCameraOffset, theScaleAndPos.m_Position,
+ theScaleAndPos.m_Scale, *theCamera);
+ }
+
+ Option<QT3DSVec2> Qt3DSRendererImpl::GetLayerMouseCoords(SLayer &inLayer,
+ const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool forceImageIntersect) const
+ {
+ SLayerRenderData *theData =
+ const_cast<Qt3DSRendererImpl &>(*this).GetOrCreateLayerRenderDataForNode(inLayer);
+ return GetLayerMouseCoords(*theData, inMouseCoords, inViewportDimensions,
+ forceImageIntersect);
+ }
+
+ bool IQt3DSRenderer::IsGlEsContext(qt3ds::render::NVRenderContextType inContextType)
+ {
+ qt3ds::render::NVRenderContextType esContextTypes(NVRenderContextValues::GLES2
+ | NVRenderContextValues::GLES3
+ | NVRenderContextValues::GLES3PLUS);
+
+ if ((inContextType & esContextTypes))
+ return true;
+
+ return false;
+ }
+
+ bool IQt3DSRenderer::IsGlEs3Context(qt3ds::render::NVRenderContextType inContextType)
+ {
+ if (inContextType == NVRenderContextValues::GLES3
+ || inContextType == NVRenderContextValues::GLES3PLUS)
+ return true;
+
+ return false;
+ }
+
+ bool IQt3DSRenderer::IsGl2Context(qt3ds::render::NVRenderContextType inContextType)
+ {
+ if (inContextType == NVRenderContextValues::GL2)
+ return true;
+
+ return false;
+ }
+
+ IQt3DSRenderer &IQt3DSRenderer::CreateRenderer(IQt3DSRenderContext &inContext)
+ {
+ return *QT3DS_NEW(inContext.GetAllocator(), Qt3DSRendererImpl)(inContext);
+ }
+}
+}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
new file mode 100644
index 0000000..906afd6
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.h
@@ -0,0 +1,549 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_SHADER_GENERATOR_IMPL_H
+#define QT3DS_RENDER_SHADER_GENERATOR_IMPL_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRenderableObjects.h"
+#include "Qt3DSRendererImplShaders.h"
+#include "Qt3DSRendererImplLayerRenderData.h"
+#include "foundation/Qt3DSFlags.h"
+#include "Qt3DSRenderMesh.h"
+#include "Qt3DSRenderModel.h"
+#include "foundation/Qt3DSBounds3.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "Qt3DSRenderDefaultMaterial.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSInvasiveSet.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderRay.h"
+#include "Qt3DSRenderText.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "Qt3DSRendererImplLayerRenderHelper.h"
+#include "Qt3DSRenderWidgets.h"
+#include "Qt3DSRenderShaderCodeGenerator.h"
+#include "Qt3DSRenderClippingFrustum.h"
+#include "foundation/Qt3DSUnionCast.h"
+#include "foundation/FastAllocator.h"
+#include "foundation/AutoDeallocatorAllocator.h"
+#include "Qt3DSRenderShaderKeys.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderProfiler.h"
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+
+namespace qt3ds {
+namespace render {
+
+ inline bool FloatLessThan(QT3DSF32 lhs, QT3DSF32 rhs)
+ {
+ QT3DSF32 diff = lhs - rhs;
+ if (fabs(diff) < .001)
+ return false;
+ return diff < 0.0f ? true : false;
+ }
+ inline bool ISRenderObjectPtrLessThan(const SRenderableObject *lhs,
+ const SRenderableObject *rhs)
+ {
+ return FloatLessThan(lhs->m_CameraDistanceSq, rhs->m_CameraDistanceSq);
+ }
+ inline bool ISRenderObjectPtrGreatThan(const SRenderableObject *lhs,
+ const SRenderableObject *rhs)
+ {
+ return FloatLessThan(rhs->m_CameraDistanceSq, lhs->m_CameraDistanceSq);
+ }
+ inline bool NonZero(float inValue) { return fabs(inValue) > .001f; }
+ inline bool NonZero(QT3DSU32 inValue) { return inValue != 0; }
+ inline bool IsZero(float inValue) { return fabs(inValue) < .001f; }
+ inline bool IsNotOne(float inValue) { return fabs(1.0f - inValue) > .001f; }
+
+ inline bool IsRectEdgeInBounds(QT3DSI32 inNewRectOffset, QT3DSI32 inNewRectWidth,
+ QT3DSI32 inCurrentRectOffset, QT3DSI32 inCurrentRectWidth)
+ {
+ QT3DSI32 newEnd = inNewRectOffset + inNewRectWidth;
+ QT3DSI32 currentEnd = inCurrentRectOffset + inCurrentRectWidth;
+ return inNewRectOffset >= inCurrentRectOffset && newEnd <= currentEnd;
+ }
+
+ struct STextRenderHelper
+ {
+ STextShader *m_Shader;
+ NVRenderInputAssembler &m_QuadInputAssembler;
+ STextRenderHelper(STextShader *inShader, NVRenderInputAssembler &inQuadInputAssembler)
+ : m_Shader(inShader)
+ , m_QuadInputAssembler(inQuadInputAssembler)
+ {
+ }
+ };
+
+ struct SPickResultProcessResult : public Qt3DSRenderPickResult
+ {
+ SPickResultProcessResult(const Qt3DSRenderPickResult &inSrc)
+ : Qt3DSRenderPickResult(inSrc)
+ , m_WasPickConsumed(false)
+ {
+ }
+ SPickResultProcessResult()
+ : m_WasPickConsumed(false)
+ {
+ }
+ bool m_WasPickConsumed;
+ };
+
+ struct STextShaderPtr
+ {
+ NVAllocatorCallback &m_Allocator;
+ bool m_HasGeneratedShader;
+ STextShader *m_Shader;
+ STextShaderPtr(NVAllocatorCallback &alloc)
+ : m_Allocator(alloc)
+ , m_HasGeneratedShader(false)
+ , m_Shader(NULL)
+ {
+ }
+ bool HasGeneratedShader() { return m_HasGeneratedShader; }
+ void Set(STextShader *inShader)
+ {
+ m_Shader = inShader;
+ m_HasGeneratedShader = true;
+ }
+ ~STextShaderPtr()
+ {
+ if (m_Shader)
+ NVDelete(m_Allocator, m_Shader);
+ }
+ operator STextShader *() { return m_Shader; }
+ };
+
+ class QT3DS_AUTOTEST_EXPORT Qt3DSRendererImpl : public IQt3DSRenderer, public IRenderWidgetContext
+ {
+ typedef nvhash_map<SShaderDefaultMaterialKey, SShaderGeneratorGeneratedShader *> TShaderMap;
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderConstantBuffer>>
+ TStrConstanBufMap;
+ typedef nvhash_map<SRenderInstanceId, NVScopedRefCounted<SLayerRenderData>,
+ eastl::hash<SRenderInstanceId>> TInstanceRenderMap;
+ typedef nvvector<SLayerRenderData *> TLayerRenderList;
+ typedef nvvector<Qt3DSRenderPickResult> TPickResultArray;
+
+ // Items to implement the widget context.
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderVertexBuffer>>
+ TStrVertBufMap;
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderIndexBuffer>>
+ TStrIndexBufMap;
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderShaderProgram>>
+ TStrShaderMap;
+ typedef nvhash_map<CRegisteredString, NVScopedRefCounted<NVRenderInputAssembler>> TStrIAMap;
+
+ typedef nvhash_map<long, SNode *> TBoneIdNodeMap;
+
+ IQt3DSRenderContext &m_qt3dsContext;
+ NVScopedRefCounted<NVRenderContext> m_Context;
+ NVScopedRefCounted<IBufferManager> m_BufferManager;
+ NVScopedRefCounted<IOffscreenRenderManager> m_OffscreenRenderManager;
+ NVScopedRefCounted<IStringTable> m_StringTable;
+ InvasiveSet<SShaderGeneratorGeneratedShader, SGGSGet, SGGSSet> m_LayerShaders;
+ // For rendering bounding boxes.
+ NVScopedRefCounted<NVRenderVertexBuffer> m_BoxVertexBuffer;
+ NVScopedRefCounted<NVRenderIndexBuffer> m_BoxIndexBuffer;
+ NVScopedRefCounted<NVRenderShaderProgram> m_BoxShader;
+ NVScopedRefCounted<NVRenderShaderProgram> m_ScreenRectShader;
+
+ NVScopedRefCounted<NVRenderVertexBuffer> m_AxisVertexBuffer;
+ NVScopedRefCounted<NVRenderShaderProgram> m_AxisShader;
+
+ // X,Y quad, broken down into 2 triangles and normalized over
+ //-1,1.
+ NVScopedRefCounted<NVRenderVertexBuffer> m_QuadVertexBuffer;
+ NVScopedRefCounted<NVRenderIndexBuffer> m_QuadIndexBuffer;
+ NVScopedRefCounted<NVRenderIndexBuffer> m_RectIndexBuffer;
+ NVScopedRefCounted<NVRenderInputAssembler> m_QuadInputAssembler;
+ NVScopedRefCounted<NVRenderInputAssembler> m_RectInputAssembler;
+ NVScopedRefCounted<NVRenderAttribLayout> m_QuadAttribLayout;
+ NVScopedRefCounted<NVRenderAttribLayout> m_RectAttribLayout;
+
+ // X,Y triangle strip quads in screen coord dynamiclly setup
+ NVScopedRefCounted<NVRenderVertexBuffer> m_QuadStripVertexBuffer;
+ NVScopedRefCounted<NVRenderInputAssembler> m_QuadStripInputAssembler;
+ NVScopedRefCounted<NVRenderAttribLayout> m_QuadStripAttribLayout;
+
+ // X,Y,Z point which is used for instanced based rendering of points
+ NVScopedRefCounted<NVRenderVertexBuffer> m_PointVertexBuffer;
+ NVScopedRefCounted<NVRenderInputAssembler> m_PointInputAssembler;
+ NVScopedRefCounted<NVRenderAttribLayout> m_PointAttribLayout;
+
+ Option<NVScopedRefCounted<SLayerSceneShader>> m_SceneLayerShader;
+ Option<NVScopedRefCounted<SLayerProgAABlendShader>> m_LayerProgAAShader;
+
+ TShaderMap m_Shaders;
+ TStrConstanBufMap m_ConstantBuffers; ///< store the the shader constant buffers
+ // Option is true if we have attempted to generate the shader.
+ // This does not mean we were successul, however.
+ Option<NVScopedRefCounted<SDefaultMaterialRenderableDepthShader>>
+ m_DefaultMaterialDepthPrepassShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_DepthPrepassShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_DepthPrepassShaderDisplaced;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_DepthTessLinearPrepassShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>>
+ m_DepthTessLinearPrepassShaderDisplaced;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_DepthTessPhongPrepassShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_DepthTessNPatchPrepassShader;
+ Option<NVScopedRefCounted<STextDepthShader>> m_TextDepthPrepassShader;
+ Option<NVScopedRefCounted<SDefaultAoPassShader>> m_DefaultAoPassShader;
+ Option<NVScopedRefCounted<SDefaultAoPassShader>> m_FakeDepthShader;
+ Option<NVScopedRefCounted<SDefaultAoPassShader>> m_FakeCubemapDepthShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_ParaboloidDepthShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_ParaboloidDepthTessLinearShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_ParaboloidDepthTessPhongShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_ParaboloidDepthTessNPatchShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_CubemapDepthShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_CubemapDepthTessLinearShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_CubemapDepthTessPhongShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_CubemapDepthTessNPatchShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> m_OrthographicDepthShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>>
+ m_OrthographicDepthTessLinearShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>>
+ m_OrthographicDepthTessPhongShader;
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>>
+ m_OrthographicDepthTessNPatchShader;
+ Option<NVScopedRefCounted<SShadowmapPreblurShader>> m_CubeShadowBlurXShader;
+ Option<NVScopedRefCounted<SShadowmapPreblurShader>> m_CubeShadowBlurYShader;
+ Option<NVScopedRefCounted<SShadowmapPreblurShader>> m_OrthoShadowBlurXShader;
+ Option<NVScopedRefCounted<SShadowmapPreblurShader>> m_OrthoShadowBlurYShader;
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ Option<NVScopedRefCounted<SAdvancedModeBlendShader>> m_AdvancedModeOverlayBlendShader;
+ Option<NVScopedRefCounted<SAdvancedModeBlendShader>> m_AdvancedModeColorBurnBlendShader;
+ Option<NVScopedRefCounted<SAdvancedModeBlendShader>> m_AdvancedModeColorDodgeBlendShader;
+#endif
+ // Text shaders may be generated on demand.
+ STextShaderPtr m_TextShader;
+ STextShaderPtr m_TextPathShader;
+ STextShaderPtr m_TextWidgetShader;
+ STextShaderPtr m_TextOnscreenShader;
+
+ // Overlay used to render all widgets.
+ NVRenderRect m_BeginFrameViewport;
+ NVScopedRefCounted<NVRenderTexture2D> m_WidgetTexture;
+ NVScopedRefCounted<NVRenderFrameBuffer> m_WidgetFBO;
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ // Advanced blend mode SW fallback
+ CResourceTexture2D m_LayerBlendTexture;
+ NVScopedRefCounted<NVRenderFrameBuffer> m_BlendFB;
+#endif
+ // Allocator for temporary data that is cleared after every layer.
+ TInstanceRenderMap m_InstanceRenderMap;
+ TLayerRenderList m_LastFrameLayers;
+ volatile QT3DSI32 mRefCount;
+
+ // Set from the first layer.
+ TPickResultArray m_LastPickResults;
+
+ // Temporary information stored only when rendering a particular layer.
+ SLayerRenderData *m_CurrentLayer;
+ QT3DSMat44 m_ViewProjection;
+ eastl::string m_GeneratedShaderString;
+
+ TStrVertBufMap m_WidgetVertexBuffers;
+ TStrIndexBufMap m_WidgetIndexBuffers;
+ TStrShaderMap m_WidgetShaders;
+ TStrIAMap m_WidgetInputAssembler;
+
+ TBoneIdNodeMap m_BoneIdNodeMap;
+
+ bool m_PickRenderPlugins;
+ bool m_LayerCachingEnabled;
+ bool m_LayerGPuProfilingEnabled;
+ SShaderDefaultMaterialKeyProperties m_DefaultMaterialShaderKeyProperties;
+
+ public:
+ Qt3DSRendererImpl(IQt3DSRenderContext &ctx);
+ virtual ~Qt3DSRendererImpl();
+ SShaderDefaultMaterialKeyProperties &DefaultMaterialShaderKeyProperties()
+ {
+ return m_DefaultMaterialShaderKeyProperties;
+ }
+
+ // NVRefCounted
+ void addRef() override;
+ void release() override;
+
+ void EnableLayerCaching(bool inEnabled) override { m_LayerCachingEnabled = inEnabled; }
+ bool IsLayerCachingEnabled() const override { return m_LayerCachingEnabled; }
+
+ void EnableLayerGpuProfiling(bool inEnabled) override;
+ bool IsLayerGpuProfilingEnabled() const override { return m_LayerGPuProfilingEnabled; }
+
+ // Calls prepare layer for render
+ // and then do render layer.
+ bool PrepareLayerForRender(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ bool inRenderSiblings, const SRenderInstanceId id) override;
+ void RenderLayer(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ bool clear, QT3DSVec4 clearColor, bool inRenderSiblings,
+ const SRenderInstanceId id) override;
+ void ChildrenUpdated(SNode &inParent) override;
+ QT3DSF32 GetTextScale(const SText &inText) override;
+
+ SCamera *GetCameraForNode(const SNode &inNode) const override;
+ Option<SCuboidRect> GetCameraBounds(const SGraphObject &inObject) override;
+ virtual SLayer *GetLayerForNode(const SNode &inNode) const;
+ SLayerRenderData *GetOrCreateLayerRenderDataForNode(const SNode &inNode,
+ const SRenderInstanceId id = nullptr);
+
+ IRenderWidgetContext &GetRenderWidgetContext()
+ {
+ return *this;
+ }
+
+ void BeginFrame() override;
+ void EndFrame() override;
+
+ void PickRenderPlugins(bool inPick) override { m_PickRenderPlugins = inPick; }
+ Qt3DSRenderPickResult Pick(SLayer &inLayer, const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inMouseCoords, bool inPickSiblings,
+ bool inPickEverything,
+ const SRenderInstanceId id) override;
+
+ virtual Option<QT3DSVec2>
+ FacePosition(SNode &inNode, NVBounds3 inBounds, const QT3DSMat44 &inGlobalTransform,
+ const QT3DSVec2 &inViewportDimensions, const QT3DSVec2 &inMouseCoords,
+ NVDataRef<SGraphObject *> inMapperObjects, SBasisPlanes::Enum inPlane) override;
+
+ virtual Qt3DSRenderPickResult PickOffscreenLayer(SLayer &inLayer,
+ const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inMouseCoords,
+ bool inPickEverything);
+
+ QT3DSVec3 UnprojectToPosition(SNode &inNode, QT3DSVec3 &inPosition,
+ const QT3DSVec2 &inMouseVec) const override;
+ QT3DSVec3 UnprojectWithDepth(SNode &inNode, QT3DSVec3 &inPosition,
+ const QT3DSVec3 &inMouseVec) const override;
+ QT3DSVec3 ProjectPosition(SNode &inNode, const QT3DSVec3 &inPosition) const override;
+
+ Option<SLayerPickSetup> GetLayerPickSetup(SLayer &inLayer,
+ const QT3DSVec2 &inMouseCoords,
+ const QSize &inPickDims) override;
+
+ Option<NVRenderRectF> GetLayerRect(SLayer &inLayer) override;
+
+ void RunLayerRender(SLayer &inLayer, const QT3DSMat44 &inViewProjection) override;
+
+ // Note that this allocator is completely reset on BeginFrame.
+ NVAllocatorCallback &GetPerFrameAllocator() override
+ {
+ return m_qt3dsContext.GetPerFrameAllocator();
+ }
+ void RenderLayerRect(SLayer &inLayer, const QT3DSVec3 &inColor) override;
+ void AddRenderWidget(IRenderWidget &inWidget) override;
+
+ SScaleAndPosition GetWorldToPixelScaleFactor(SLayer &inLayer,
+ const QT3DSVec3 &inWorldPoint) override;
+ SScaleAndPosition GetWorldToPixelScaleFactor(const SCamera &inCamera,
+ const QT3DSVec3 &inWorldPoint,
+ SLayerRenderData &inRenderData);
+
+ void ReleaseLayerRenderResources(SLayer &inLayer, const SRenderInstanceId id) override;
+
+ void RenderQuad(const QT3DSVec2 inDimensions, const QT3DSMat44 &inMVP,
+ NVRenderTexture2D &inQuadTexture) override;
+ void RenderQuad() override;
+
+ void RenderPointsIndirect() override;
+
+ // render a screen aligned 2D text
+ void RenderText2D(QT3DSF32 x, QT3DSF32 y, qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor,
+ const char *text) override;
+ bool PrepareTextureAtlasForRender();
+
+ // render Gpu profiler values
+ void RenderGpuProfilerStats(QT3DSF32 x, QT3DSF32 y,
+ qt3ds::foundation::Option<qt3ds::QT3DSVec3> inColor) override;
+
+ // Callback during the layer render process.
+ void LayerNeedsFrameClear(SLayerRenderData &inLayer);
+ void BeginLayerDepthPassRender(SLayerRenderData &inLayer);
+ void EndLayerDepthPassRender();
+ void BeginLayerRender(SLayerRenderData &inLayer);
+ void EndLayerRender();
+ void PrepareImageForIbl(SImage &inImage);
+
+ NVRenderShaderProgram *CompileShader(CRegisteredString inName, const char8_t *inVert,
+ const char8_t *inFrame);
+
+ NVRenderShaderProgram *GenerateShader(SSubsetRenderable &inRenderable,
+ TShaderFeatureSet inFeatureSet);
+ SShaderGeneratorGeneratedShader *GetShader(SSubsetRenderable &inRenderable,
+ TShaderFeatureSet inFeatureSet);
+
+ SDefaultAoPassShader *GetDefaultAoPassShader(TShaderFeatureSet inFeatureSet);
+ SDefaultAoPassShader *GetFakeDepthShader(TShaderFeatureSet inFeatureSet);
+ SDefaultAoPassShader *GetFakeCubeDepthShader(TShaderFeatureSet inFeatureSet);
+ SDefaultMaterialRenderableDepthShader *GetRenderableDepthShader();
+
+ SRenderableDepthPrepassShader *GetParaboloidDepthShader(TessModeValues::Enum inTessMode);
+ SRenderableDepthPrepassShader *GetParaboloidDepthNoTessShader();
+ SRenderableDepthPrepassShader *GetParaboloidDepthTessLinearShader();
+ SRenderableDepthPrepassShader *GetParaboloidDepthTessPhongShader();
+ SRenderableDepthPrepassShader *GetParaboloidDepthTessNPatchShader();
+ SRenderableDepthPrepassShader *GetCubeShadowDepthShader(TessModeValues::Enum inTessMode);
+ SRenderableDepthPrepassShader *GetCubeDepthNoTessShader();
+ SRenderableDepthPrepassShader *GetCubeDepthTessLinearShader();
+ SRenderableDepthPrepassShader *GetCubeDepthTessPhongShader();
+ SRenderableDepthPrepassShader *GetCubeDepthTessNPatchShader();
+ SRenderableDepthPrepassShader *GetOrthographicDepthShader(TessModeValues::Enum inTessMode);
+ SRenderableDepthPrepassShader *GetOrthographicDepthNoTessShader();
+ SRenderableDepthPrepassShader *GetOrthographicDepthTessLinearShader();
+ SRenderableDepthPrepassShader *GetOrthographicDepthTessPhongShader();
+ SRenderableDepthPrepassShader *GetOrthographicDepthTessNPatchShader();
+
+ SRenderableDepthPrepassShader *GetDepthPrepassShader(bool inDisplaced);
+ SRenderableDepthPrepassShader *GetDepthTessPrepassShader(TessModeValues::Enum inTessMode,
+ bool inDisplaced);
+ SRenderableDepthPrepassShader *GetDepthTessLinearPrepassShader(bool inDisplaced);
+ SRenderableDepthPrepassShader *GetDepthTessPhongPrepassShader();
+ SRenderableDepthPrepassShader *GetDepthTessNPatchPrepassShader();
+ STextDepthShader *GetTextDepthShader();
+ STextRenderHelper GetShader(STextRenderable &inRenderable, bool inUsePathRendering);
+ STextRenderHelper GetTextShader(bool inUsePathRendering);
+ STextRenderHelper GetTextWidgetShader();
+ STextRenderHelper GetOnscreenTextShader();
+ SLayerSceneShader *GetSceneLayerShader();
+ NVRenderShaderProgram *GetTextAtlasEntryShader();
+ void GenerateXYQuad();
+ void GenerateXYQuadStrip();
+ void GenerateXYZPoint();
+ eastl::pair<NVRenderVertexBuffer *, NVRenderIndexBuffer *> GetXYQuad();
+ SLayerProgAABlendShader *GetLayerProgAABlendShader();
+ SShadowmapPreblurShader *GetCubeShadowBlurXShader();
+ SShadowmapPreblurShader *GetCubeShadowBlurYShader();
+ SShadowmapPreblurShader *GetOrthoShadowBlurXShader();
+ SShadowmapPreblurShader *GetOrthoShadowBlurYShader();
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ SAdvancedModeBlendShader *GetAdvancedBlendModeShader(AdvancedBlendModes::Enum blendMode);
+ SAdvancedModeBlendShader *GetOverlayBlendModeShader();
+ SAdvancedModeBlendShader *GetColorBurnBlendModeShader();
+ SAdvancedModeBlendShader *GetColorDodgeBlendModeShader();
+#endif
+ SLayerRenderData *GetLayerRenderData() { return m_CurrentLayer; }
+ SLayerGlobalRenderProperties GetLayerGlobalRenderProperties();
+ void UpdateCbAoShadow(const SLayer *pLayer, const SCamera *pCamera,
+ CResourceTexture2D &inDepthTexture);
+
+ NVRenderContext &GetContext() { return *m_Context; }
+
+ IQt3DSRenderContext &GetQt3DSContext() { return m_qt3dsContext; }
+
+ void DrawScreenRect(NVRenderRectF inRect, const QT3DSVec3 &inColor);
+ // Binds an offscreen texture. Widgets are rendered last.
+ void SetupWidgetLayer();
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ NVScopedRefCounted<NVRenderTexture2D> GetLayerBlendTexture()
+ {
+ return m_LayerBlendTexture.GetTexture();
+ }
+
+ NVScopedRefCounted<NVRenderFrameBuffer> GetBlendFB()
+ {
+ return m_BlendFB;
+ }
+#endif
+ // widget context implementation
+ virtual NVRenderVertexBuffer &
+ GetOrCreateVertexBuffer(CRegisteredString &inStr, QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) override;
+ virtual NVRenderIndexBuffer &
+ GetOrCreateIndexBuffer(CRegisteredString &inStr,
+ qt3ds::render::NVRenderComponentTypes::Enum componentType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) override;
+ virtual NVRenderAttribLayout &
+ CreateAttributeLayout(NVConstDataRef<qt3ds::render::NVRenderVertexBufferEntry> attribs) override;
+ virtual NVRenderInputAssembler &
+ GetOrCreateInputAssembler(CRegisteredString &inStr, NVRenderAttribLayout *attribLayout,
+ NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer,
+ NVConstDataRef<QT3DSU32> strides, NVConstDataRef<QT3DSU32> offsets) override;
+
+ NVRenderVertexBuffer *GetVertexBuffer(CRegisteredString &inStr) override;
+ NVRenderIndexBuffer *GetIndexBuffer(CRegisteredString &inStr) override;
+ NVRenderInputAssembler *GetInputAssembler(CRegisteredString &inStr) override;
+
+ NVRenderShaderProgram *GetShader(CRegisteredString inStr) override;
+ NVRenderShaderProgram *CompileAndStoreShader(CRegisteredString inStr) override;
+ IShaderProgramGenerator &GetProgramGenerator() override;
+
+ STextDimensions MeasureText(const STextRenderInfo &inText) override;
+ void RenderText(const STextRenderInfo &inText, const QT3DSVec3 &inTextColor,
+ const QT3DSVec3 &inBackgroundColor, const QT3DSMat44 &inMVP) override;
+
+ // Given a node and a point in the node's local space (most likely its pivot point), we
+ // return
+ // a normal matrix so you can get the axis out, a transformation from node to camera
+ // a new position and a floating point scale factor so you can render in 1/2 perspective
+ // mode
+ // or orthographic mode if you would like to.
+ virtual SWidgetRenderInformation
+ GetWidgetRenderInformation(SNode &inNode, const QT3DSVec3 &inPos,
+ RenderWidgetModes::Enum inWidgetMode) override;
+
+ Option<QT3DSVec2> GetLayerMouseCoords(SLayer &inLayer, const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool forceImageIntersect = false) const override;
+
+ protected:
+ Option<QT3DSVec2> GetLayerMouseCoords(SLayerRenderData &inLayer, const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inViewportDimensions,
+ bool forceImageIntersect = false) const;
+ SPickResultProcessResult ProcessPickResultList(bool inPickEverything);
+ // If the mouse y coordinates need to be flipped we expect that to happen before entry into
+ // this function
+ void GetLayerHitObjectList(SLayerRenderData &inLayer, const QT3DSVec2 &inViewportDimensions,
+ const QT3DSVec2 &inMouseCoords, bool inPickEverything,
+ TPickResultArray &outIntersectionResult,
+ NVAllocatorCallback &inTempAllocator);
+ void IntersectRayWithSubsetRenderable(const SRay &inRay,
+ SRenderableObject &inRenderableObject,
+ TPickResultArray &outIntersectionResultList,
+ NVAllocatorCallback &inTempAllocator);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
new file mode 100644
index 0000000..362a602
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.cpp
@@ -0,0 +1,2220 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRendererImpl.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderEffect.h"
+#include "EASTL/sort.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderScene.h"
+#include "Qt3DSRenderPresentation.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "Qt3DSOffscreenRenderKey.h"
+#include "Qt3DSRenderPlugin.h"
+#include "Qt3DSRenderPluginGraphObject.h"
+#include "Qt3DSRenderResourceBufferObjects.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/AutoDeallocatorAllocator.h"
+#include "Qt3DSRenderMaterialHelpers.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderTextTextureCache.h"
+#include "Qt3DSRenderTextTextureAtlas.h"
+#include "Qt3DSRenderRenderList.h"
+#include "Qt3DSRendererUtil.h"
+
+#ifdef WIN32
+#pragma warning(disable : 4355)
+#endif
+
+#define QT3DS_CACHED_POST_EFFECT
+const float QT3DS_DEGREES_TO_RADIANS = 0.0174532925199f;
+
+namespace qt3ds {
+namespace render {
+ using eastl::reverse;
+ using eastl::stable_sort;
+ using qt3ds::render::NVRenderContextScopedProperty;
+ using qt3ds::QT3DSVec2;
+
+ SLayerRenderData::SLayerRenderData(SLayer &inLayer, Qt3DSRendererImpl &inRenderer)
+ : SLayerRenderPreparationData(inLayer, inRenderer)
+ , m_LayerTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_TemporalAATexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerDepthTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerPrepassDepthTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerWidgetTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerSsaoTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerMultisampleTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerMultisamplePrepassDepthTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerMultisampleWidgetTexture(inRenderer.GetQt3DSContext().GetResourceManager())
+ , m_LayerCachedTexture(NULL)
+ , m_AdvancedBlendDrawTexture(NULL)
+ , m_AdvancedBlendBlendTexture(NULL)
+ , m_AdvancedModeDrawFB(NULL)
+ , m_AdvancedModeBlendFB(NULL)
+ , m_ProgressiveAAPassIndex(0)
+ , m_TemporalAAPassIndex(0)
+ , m_NonDirtyTemporalAAPassIndex(0)
+ , m_TextScale(1.0f)
+ , mRefCount(0)
+ , m_DepthBufferFormat(NVRenderTextureFormats::Unknown)
+ {
+ }
+
+ SLayerRenderData::~SLayerRenderData()
+ {
+ IResourceManager &theResourceManager(m_Renderer.GetQt3DSContext().GetResourceManager());
+ if (m_LayerCachedTexture && m_LayerCachedTexture != m_LayerTexture)
+ theResourceManager.Release(*m_LayerCachedTexture);
+ if (m_AdvancedModeDrawFB) {
+ m_AdvancedModeDrawFB->release();
+ m_AdvancedModeDrawFB = NULL;
+ }
+ if (m_AdvancedModeBlendFB) {
+ m_AdvancedModeBlendFB->release();
+ m_AdvancedModeBlendFB = NULL;
+ }
+ if (m_AdvancedBlendBlendTexture)
+ m_AdvancedBlendBlendTexture = NULL;
+ if (m_AdvancedBlendDrawTexture)
+ m_AdvancedBlendDrawTexture = NULL;
+ }
+ void SLayerRenderData::PrepareForRender(const QSize &inViewportDimensions)
+ {
+ SLayerRenderPreparationData::PrepareForRender(inViewportDimensions);
+ SLayerRenderPreparationResult &thePrepResult(*m_LayerPrepResult);
+ IResourceManager &theResourceManager(m_Renderer.GetQt3DSContext().GetResourceManager());
+ // at that time all values shoud be updated
+ m_Renderer.UpdateCbAoShadow(&m_Layer, m_Camera, m_LayerDepthTexture);
+
+ // Generate all necessary lighting keys
+
+ if (thePrepResult.m_Flags.WasLayerDataDirty()) {
+ m_ProgressiveAAPassIndex = 0;
+ }
+
+ // Get rid of the layer texture if we aren't rendering to texture this frame.
+ if (m_LayerTexture && !thePrepResult.m_Flags.ShouldRenderToTexture()) {
+ if (m_LayerCachedTexture && m_LayerCachedTexture != m_LayerTexture) {
+ theResourceManager.Release(*m_LayerCachedTexture);
+ m_LayerCachedTexture = NULL;
+ }
+
+ m_LayerTexture.ReleaseTexture();
+ m_LayerDepthTexture.ReleaseTexture();
+ m_LayerWidgetTexture.ReleaseTexture();
+ m_LayerSsaoTexture.ReleaseTexture();
+ m_LayerMultisampleTexture.ReleaseTexture();
+ m_LayerMultisamplePrepassDepthTexture.ReleaseTexture();
+ m_LayerMultisampleWidgetTexture.ReleaseTexture();
+ }
+
+ if (NeedsWidgetTexture() == false)
+ m_LayerWidgetTexture.ReleaseTexture();
+
+ if (m_LayerDepthTexture && !thePrepResult.m_Flags.RequiresDepthTexture())
+ m_LayerDepthTexture.ReleaseTexture();
+
+ if (m_LayerSsaoTexture && !thePrepResult.m_Flags.RequiresSsaoPass())
+ m_LayerSsaoTexture.ReleaseTexture();
+
+ m_Renderer.LayerNeedsFrameClear(*this);
+
+ // Clean up the texture cache if layer dimensions changed
+ if (inViewportDimensions.width() != m_previousDimensions.width()
+ || inViewportDimensions.height() != m_previousDimensions.height()) {
+ m_LayerTexture.ReleaseTexture();
+ m_LayerDepthTexture.ReleaseTexture();
+ m_LayerSsaoTexture.ReleaseTexture();
+ m_LayerWidgetTexture.ReleaseTexture();
+ m_LayerPrepassDepthTexture.ReleaseTexture();
+ m_TemporalAATexture.ReleaseTexture();
+ m_LayerMultisampleTexture.ReleaseTexture();
+ m_LayerMultisamplePrepassDepthTexture.ReleaseTexture();
+ m_LayerMultisampleWidgetTexture.ReleaseTexture();
+
+ m_previousDimensions.setWidth(inViewportDimensions.width());
+ m_previousDimensions.setHeight(inViewportDimensions.height());
+
+ theResourceManager.DestroyFreeSizedResources();
+
+ // Effect system uses different resource manager, so clean that up too
+ m_Renderer.GetQt3DSContext().GetEffectSystem().GetResourceManager()
+ .DestroyFreeSizedResources();
+ }
+ }
+
+ NVRenderTextureFormats::Enum SLayerRenderData::GetDepthBufferFormat()
+ {
+ if (m_DepthBufferFormat == NVRenderTextureFormats::Unknown) {
+ QT3DSU32 theExistingDepthBits = m_Renderer.GetContext().GetDepthBits();
+ QT3DSU32 theExistingStencilBits = m_Renderer.GetContext().GetStencilBits();
+ switch (theExistingDepthBits) {
+ case 32:
+ m_DepthBufferFormat = NVRenderTextureFormats::Depth32;
+ break;
+ case 24:
+ // check if we have stencil bits
+ if (theExistingStencilBits > 0)
+ m_DepthBufferFormat =
+ NVRenderTextureFormats::Depth24Stencil8; // currently no stencil usage
+ // should be Depth24Stencil8 in
+ // this case
+ else
+ m_DepthBufferFormat = NVRenderTextureFormats::Depth24;
+ break;
+ case 16:
+ m_DepthBufferFormat = NVRenderTextureFormats::Depth16;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ m_DepthBufferFormat = NVRenderTextureFormats::Depth16;
+ break;
+ }
+ }
+ return m_DepthBufferFormat;
+ }
+
+ NVRenderFrameBufferAttachments::Enum
+ SLayerRenderData::GetFramebufferDepthAttachmentFormat(NVRenderTextureFormats::Enum depthFormat)
+ {
+ NVRenderFrameBufferAttachments::Enum fmt = NVRenderFrameBufferAttachments::Depth;
+
+ switch (depthFormat) {
+ case NVRenderTextureFormats::Depth16:
+ case NVRenderTextureFormats::Depth24:
+ case NVRenderTextureFormats::Depth32:
+ fmt = NVRenderFrameBufferAttachments::Depth;
+ break;
+ case NVRenderTextureFormats::Depth24Stencil8:
+ fmt = NVRenderFrameBufferAttachments::DepthStencil;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+
+ return fmt;
+ }
+
+ void SLayerRenderData::RenderAoPass()
+ {
+ m_Renderer.BeginLayerDepthPassRender(*this);
+
+ NVRenderContext &theContext(m_Renderer.GetContext());
+ SDefaultAoPassShader *shader = m_Renderer.GetDefaultAoPassShader(GetShaderFeatureSet());
+ if (shader == NULL)
+ return;
+
+ // Set initial state
+ theContext.SetBlendingEnabled(false);
+ theContext.SetDepthWriteEnabled(false);
+ theContext.SetDepthTestEnabled(false);
+ theContext.SetActiveShader(&(shader->m_Shader));
+
+ // Setup constants
+ shader->m_CameraDirection.Set(m_CameraDirection);
+ shader->m_ViewMatrix.Set(m_Camera->m_GlobalTransform);
+
+ shader->m_DepthTexture.Set(m_LayerDepthTexture);
+ shader->m_DepthSamplerSize.Set(QT3DSVec2(m_LayerDepthTexture->GetTextureDetails().m_Width,
+ m_LayerDepthTexture->GetTextureDetails().m_Height));
+
+ // Important uniforms for AO calculations
+ QT3DSVec2 theCameraProps = QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar);
+ shader->m_CameraProperties.Set(theCameraProps);
+ shader->m_AoShadowParams.Set();
+
+ // Draw a fullscreen quad
+ m_Renderer.RenderQuad();
+
+ m_Renderer.EndLayerDepthPassRender();
+ }
+
+ void SLayerRenderData::RenderFakeDepthMapPass(NVRenderTexture2D *theDepthTex,
+ NVRenderTextureCube *theDepthCube)
+ {
+ m_Renderer.BeginLayerDepthPassRender(*this);
+
+ NVRenderContext &theContext(m_Renderer.GetContext());
+ SDefaultAoPassShader *shader = theDepthTex
+ ? m_Renderer.GetFakeDepthShader(GetShaderFeatureSet())
+ : m_Renderer.GetFakeCubeDepthShader(GetShaderFeatureSet());
+ if (shader == NULL)
+ return;
+
+ // Set initial state
+ theContext.SetBlendingEnabled(false);
+ theContext.SetDepthWriteEnabled(false);
+ theContext.SetDepthTestEnabled(false);
+ theContext.SetActiveShader(&(shader->m_Shader));
+
+ // Setup constants
+ shader->m_CameraDirection.Set(m_CameraDirection);
+ shader->m_ViewMatrix.Set(m_Camera->m_GlobalTransform);
+
+ shader->m_DepthTexture.Set(theDepthTex);
+ shader->m_CubeTexture.Set(theDepthCube);
+ shader->m_DepthSamplerSize.Set(QT3DSVec2(theDepthTex->GetTextureDetails().m_Width,
+ theDepthTex->GetTextureDetails().m_Height));
+
+ // Important uniforms for AO calculations
+ QT3DSVec2 theCameraProps = QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar);
+ shader->m_CameraProperties.Set(theCameraProps);
+ shader->m_AoShadowParams.Set();
+
+ // Draw a fullscreen quad
+ m_Renderer.RenderQuad();
+ }
+
+ namespace {
+
+ void computeFrustumBounds(const SCamera &inCamera, const NVRenderRectF &inViewPort,
+ QT3DSVec3 &ctrBound, QT3DSVec3 camVerts[8])
+ {
+ QT3DSVec3 camEdges[4];
+
+ const QT3DSF32 *dataPtr(inCamera.m_GlobalTransform.front());
+ QT3DSVec3 camX(dataPtr[0], dataPtr[1], dataPtr[2]);
+ QT3DSVec3 camY(dataPtr[4], dataPtr[5], dataPtr[6]);
+ QT3DSVec3 camZ(dataPtr[8], dataPtr[9], dataPtr[10]);
+
+ float tanFOV = tanf(inCamera.verticalFov(inViewPort) * 0.5f);
+ float asTanFOV = tanFOV * inViewPort.m_Width / inViewPort.m_Height;
+ camEdges[0] = -asTanFOV * camX + tanFOV * camY + camZ;
+ camEdges[1] = asTanFOV * camX + tanFOV * camY + camZ;
+ camEdges[2] = asTanFOV * camX - tanFOV * camY + camZ;
+ camEdges[3] = -asTanFOV * camX - tanFOV * camY + camZ;
+
+ for (int i = 0; i < 4; ++i) {
+ camEdges[i].x = -camEdges[i].x;
+ camEdges[i].y = -camEdges[i].y;
+ }
+
+ camVerts[0] = inCamera.m_Position + camEdges[0] * inCamera.m_ClipNear;
+ camVerts[1] = inCamera.m_Position + camEdges[0] * inCamera.m_ClipFar;
+ camVerts[2] = inCamera.m_Position + camEdges[1] * inCamera.m_ClipNear;
+ camVerts[3] = inCamera.m_Position + camEdges[1] * inCamera.m_ClipFar;
+ camVerts[4] = inCamera.m_Position + camEdges[2] * inCamera.m_ClipNear;
+ camVerts[5] = inCamera.m_Position + camEdges[2] * inCamera.m_ClipFar;
+ camVerts[6] = inCamera.m_Position + camEdges[3] * inCamera.m_ClipNear;
+ camVerts[7] = inCamera.m_Position + camEdges[3] * inCamera.m_ClipFar;
+
+ ctrBound = camVerts[0];
+ for (int i = 1; i < 8; ++i) {
+ ctrBound += camVerts[i];
+ }
+ ctrBound *= 0.125f;
+ }
+
+ void SetupCameraForShadowMap(const QT3DSVec2 &inCameraVec, NVRenderContext & /*inContext*/,
+ const NVRenderRectF &inViewport, const SCamera &inCamera,
+ const SLight *inLight, SCamera &theCamera)
+ {
+ // setup light matrix
+ QT3DSU32 mapRes = 1 << inLight->m_ShadowMapRes;
+ NVRenderRectF theViewport(0.0f, 0.0f, (float)mapRes, (float)mapRes);
+ theCamera.m_ClipNear = 1.0f;
+ theCamera.m_ClipFar = inLight->m_ShadowMapFar;
+ // Setup camera projection
+ QT3DSVec3 inLightPos = inLight->GetGlobalPos();
+ QT3DSVec3 inLightDir = inLight->GetDirection();
+
+ if (inLight->m_Flags.IsLeftHanded())
+ inLightPos.z = -inLightPos.z;
+
+ inLightPos -= inLightDir * inCamera.m_ClipNear;
+ theCamera.m_FOV = inLight->m_ShadowMapFov * QT3DS_DEGREES_TO_RADIANS;
+
+ if (inLight->m_LightType == RenderLightTypes::Directional) {
+ QT3DSVec3 frustBounds[8], boundCtr;
+ computeFrustumBounds(inCamera, inViewport, boundCtr, frustBounds);
+
+ QT3DSVec3 forward = inLightDir;
+ forward.normalize();
+ QT3DSVec3 right = forward.cross(QT3DSVec3(0, 1, 0));
+ right.normalize();
+ QT3DSVec3 up = right.cross(forward);
+ up.normalize();
+
+ // Calculate bounding box of the scene camera frustum
+ float minDistanceZ = std::numeric_limits<float>::max();
+ float maxDistanceZ = -std::numeric_limits<float>::max();
+ float minDistanceY = std::numeric_limits<float>::max();
+ float maxDistanceY = -std::numeric_limits<float>::max();
+ float minDistanceX = std::numeric_limits<float>::max();
+ float maxDistanceX = -std::numeric_limits<float>::max();
+ for (int i = 0; i < 8; ++i) {
+ float distanceZ = frustBounds[i].dot(forward);
+ if (distanceZ < minDistanceZ)
+ minDistanceZ = distanceZ;
+ if (distanceZ > maxDistanceZ)
+ maxDistanceZ = distanceZ;
+ float distanceY = frustBounds[i].dot(up);
+ if (distanceY < minDistanceY)
+ minDistanceY = distanceY;
+ if (distanceY > maxDistanceY)
+ maxDistanceY = distanceY;
+ float distanceX = frustBounds[i].dot(right);
+ if (distanceX < minDistanceX)
+ minDistanceX = distanceX;
+ if (distanceX > maxDistanceX)
+ maxDistanceX = distanceX;
+ }
+
+ // Apply bounding box parameters to shadow map camera projection matrix
+ // so that the whole scene is fit inside the shadow map
+ inLightPos = boundCtr;
+ theViewport.m_Height = abs(maxDistanceY - minDistanceY);
+ theViewport.m_Width = abs(maxDistanceX - minDistanceX);
+ theCamera.m_ClipNear = -abs(maxDistanceZ - minDistanceZ);
+ theCamera.m_ClipFar = abs(maxDistanceZ - minDistanceZ);
+ }
+
+ theCamera.m_Flags.SetLeftHanded(false);
+
+ theCamera.m_Flags.ClearOrSet(inLight->m_LightType == RenderLightTypes::Directional,
+ NodeFlagValues::Orthographic);
+ theCamera.m_Parent = NULL;
+ theCamera.m_Pivot = inLight->m_Pivot;
+
+ if (inLight->m_LightType != RenderLightTypes::Point) {
+ theCamera.LookAt(inLightPos, QT3DSVec3(0, 1.0, 0), inLightPos + inLightDir);
+ } else {
+ theCamera.LookAt(inLightPos, QT3DSVec3(0, 1.0, 0), QT3DSVec3(0, 0, 0));
+ }
+
+ theCamera.CalculateGlobalVariables(theViewport,
+ QT3DSVec2(theViewport.m_Width, theViewport.m_Height));
+ }
+ }
+
+ void SetupCubeShadowCameras(const SLight *inLight, SCamera inCameras[6])
+ {
+ // setup light matrix
+ QT3DSU32 mapRes = 1 << inLight->m_ShadowMapRes;
+ NVRenderRectF theViewport(0.0f, 0.0f, (float)mapRes, (float)mapRes);
+ QT3DSVec3 rotOfs[6];
+
+ QT3DS_ASSERT(inLight != NULL);
+ QT3DS_ASSERT(inLight->m_LightType != RenderLightTypes::Directional);
+
+ QT3DSVec3 inLightPos = inLight->GetGlobalPos();
+ if (inLight->m_Flags.IsLeftHanded())
+ inLightPos.z = -inLightPos.z;
+
+ rotOfs[0] = QT3DSVec3(0.f, -NVHalfPi, NVPi);
+ rotOfs[1] = QT3DSVec3(0.f, NVHalfPi, NVPi);
+ rotOfs[2] = QT3DSVec3(NVHalfPi, 0.f, 0.f);
+ rotOfs[3] = QT3DSVec3(-NVHalfPi, 0.f, 0.f);
+ rotOfs[4] = QT3DSVec3(0.f, NVPi, -NVPi);
+ rotOfs[5] = QT3DSVec3(0.f, 0.f, NVPi);
+
+ for (int i = 0; i < 6; ++i) {
+ inCameras[i].m_Flags.SetLeftHanded(false);
+
+ inCameras[i].m_Flags.ClearOrSet(false, NodeFlagValues::Orthographic);
+ inCameras[i].m_Parent = NULL;
+ inCameras[i].m_Pivot = inLight->m_Pivot;
+ inCameras[i].m_ClipNear = 1.0f;
+ inCameras[i].m_ClipFar = NVMax<QT3DSF32>(2.0f, inLight->m_ShadowMapFar);
+ inCameras[i].m_FOV = inLight->m_ShadowMapFov * QT3DS_DEGREES_TO_RADIANS;
+
+ inCameras[i].m_Position = inLightPos;
+ inCameras[i].m_Rotation = rotOfs[i];
+ inCameras[i].CalculateGlobalVariables(
+ theViewport, QT3DSVec2(theViewport.m_Width, theViewport.m_Height));
+ }
+
+ /*
+ if ( inLight->m_LightType == RenderLightTypes::Point ) return;
+
+ QT3DSVec3 viewDirs[6];
+ QT3DSVec3 viewUp[6];
+ QT3DSMat33 theDirMatrix( inLight->m_GlobalTransform.getUpper3x3() );
+
+ viewDirs[0] = theDirMatrix.transform( QT3DSVec3( 1.f, 0.f, 0.f ) );
+ viewDirs[2] = theDirMatrix.transform( QT3DSVec3( 0.f, -1.f, 0.f ) );
+ viewDirs[4] = theDirMatrix.transform( QT3DSVec3( 0.f, 0.f, 1.f ) );
+ viewDirs[0].normalize(); viewDirs[2].normalize(); viewDirs[4].normalize();
+ viewDirs[1] = -viewDirs[0];
+ viewDirs[3] = -viewDirs[2];
+ viewDirs[5] = -viewDirs[4];
+
+ viewUp[0] = viewDirs[2];
+ viewUp[1] = viewDirs[2];
+ viewUp[2] = viewDirs[5];
+ viewUp[3] = viewDirs[4];
+ viewUp[4] = viewDirs[2];
+ viewUp[5] = viewDirs[2];
+
+ for (int i = 0; i < 6; ++i)
+ {
+ inCameras[i].LookAt( inLightPos, viewUp[i], inLightPos + viewDirs[i] );
+ inCameras[i].CalculateGlobalVariables( theViewport, QT3DSVec2( theViewport.m_Width,
+ theViewport.m_Height ) );
+ }
+ */
+ }
+
+ inline void RenderRenderableShadowMapPass(SLayerRenderData &inData, SRenderableObject &inObject,
+ const QT3DSVec2 &inCameraProps, TShaderFeatureSet,
+ QT3DSU32 lightIndex, const SCamera &inCamera)
+ {
+ if (!inObject.m_RenderableFlags.IsShadowCaster())
+ return;
+
+ SShadowMapEntry *pEntry = inData.m_ShadowMapManager->GetShadowMapEntry(lightIndex);
+
+ if (inObject.m_RenderableFlags.IsDefaultMaterialMeshSubset())
+ static_cast<SSubsetRenderableBase &>(inObject).RenderShadowMapPass(
+ inCameraProps, inData.m_Lights[lightIndex], inCamera, pEntry);
+ else if (inObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) {
+ static_cast<SSubsetRenderableBase &>(inObject).RenderShadowMapPass(
+ inCameraProps, inData.m_Lights[lightIndex], inCamera, pEntry);
+ } else if (inObject.m_RenderableFlags.IsPath()) {
+ static_cast<SPathRenderable &>(inObject).RenderShadowMapPass(
+ inCameraProps, inData.m_Lights[lightIndex], inCamera, pEntry);
+ }
+ }
+
+ void SLayerRenderData::RenderShadowCubeBlurPass(CResourceFrameBuffer *theFB,
+ NVRenderTextureCube *target0,
+ NVRenderTextureCube *target1, QT3DSF32 filterSz,
+ QT3DSF32 clipFar)
+ {
+ NVRenderContext &theContext(m_Renderer.GetContext());
+
+ SShadowmapPreblurShader *shaderX = m_Renderer.GetCubeShadowBlurXShader();
+ SShadowmapPreblurShader *shaderY = m_Renderer.GetCubeShadowBlurYShader();
+
+ if (shaderX == NULL)
+ return;
+ if (shaderY == NULL)
+ return;
+ // if ( theShader == NULL ) return;
+
+ // Enable drawing to 6 color attachment buffers for cubemap passes
+ qt3ds::QT3DSI32 buffers[6] = { 0, 1, 2, 3, 4, 5 };
+ qt3ds::foundation::NVConstDataRef<qt3ds::QT3DSI32> bufferList(buffers, 6);
+ theContext.SetDrawBuffers(bufferList);
+
+ // Attach framebuffer targets
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color0, *target1,
+ NVRenderTextureCubeFaces::CubePosX);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color1, *target1,
+ NVRenderTextureCubeFaces::CubeNegX);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color2, *target1,
+ NVRenderTextureCubeFaces::CubePosY);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color3, *target1,
+ NVRenderTextureCubeFaces::CubeNegY);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color4, *target1,
+ NVRenderTextureCubeFaces::CubePosZ);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color5, *target1,
+ NVRenderTextureCubeFaces::CubeNegZ);
+
+ // Set initial state
+ theContext.SetBlendingEnabled(false);
+ theContext.SetDepthWriteEnabled(false);
+ theContext.SetDepthTestEnabled(false);
+ // theContext.SetColorWritesEnabled(true);
+ theContext.SetActiveShader(&(shaderX->m_Shader));
+
+ shaderX->m_CameraProperties.Set(QT3DSVec2(filterSz, clipFar));
+ shaderX->m_DepthCube.Set(target0);
+
+ // Draw a fullscreen quad
+ m_Renderer.RenderQuad();
+
+ theContext.SetActiveShader(&(shaderY->m_Shader));
+
+ // Lather, Rinse, and Repeat for the Y-blur pass
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color0, *target0,
+ NVRenderTextureCubeFaces::CubePosX);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color1, *target0,
+ NVRenderTextureCubeFaces::CubeNegX);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color2, *target0,
+ NVRenderTextureCubeFaces::CubePosY);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color3, *target0,
+ NVRenderTextureCubeFaces::CubeNegY);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color4, *target0,
+ NVRenderTextureCubeFaces::CubePosZ);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color5, *target0,
+ NVRenderTextureCubeFaces::CubeNegZ);
+
+ shaderY->m_CameraProperties.Set(QT3DSVec2(filterSz, clipFar));
+ shaderY->m_DepthCube.Set(target1);
+
+ // Draw a fullscreen quad
+ m_Renderer.RenderQuad();
+
+ theContext.SetDepthWriteEnabled(true);
+ theContext.SetDepthTestEnabled(true);
+ // theContext.SetColorWritesEnabled(false);
+
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color0, NVRenderTextureOrRenderBuffer(),
+ NVRenderTextureCubeFaces::CubePosX);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color1, NVRenderTextureOrRenderBuffer(),
+ NVRenderTextureCubeFaces::CubeNegX);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color2, NVRenderTextureOrRenderBuffer(),
+ NVRenderTextureCubeFaces::CubePosY);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color3, NVRenderTextureOrRenderBuffer(),
+ NVRenderTextureCubeFaces::CubeNegY);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color4, NVRenderTextureOrRenderBuffer(),
+ NVRenderTextureCubeFaces::CubePosZ);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color5, NVRenderTextureOrRenderBuffer(),
+ NVRenderTextureCubeFaces::CubeNegZ);
+
+ theContext.SetDrawBuffers(qt3ds::foundation::toConstDataRef((qt3ds::QT3DSI32)0));
+ }
+
+ void SLayerRenderData::RenderShadowMapBlurPass(CResourceFrameBuffer *theFB,
+ NVRenderTexture2D *target0,
+ NVRenderTexture2D *target1, QT3DSF32 filterSz,
+ QT3DSF32 clipFar)
+ {
+ NVRenderContext &theContext(m_Renderer.GetContext());
+
+ SShadowmapPreblurShader *shaderX = m_Renderer.GetOrthoShadowBlurXShader();
+ SShadowmapPreblurShader *shaderY = m_Renderer.GetOrthoShadowBlurYShader();
+
+ if (shaderX == NULL)
+ return;
+ if (shaderY == NULL)
+ return;
+
+ // Attach framebuffer target
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::Color0, *target1);
+ //(*theFB)->Attach( NVRenderFrameBufferAttachments::DepthStencil, *target1 );
+
+ // Set initial state
+ theContext.SetBlendingEnabled(false);
+ theContext.SetDepthWriteEnabled(false);
+ theContext.SetDepthTestEnabled(false);
+ theContext.SetColorWritesEnabled(true);
+ theContext.SetActiveShader(&(shaderX->m_Shader));
+
+ shaderX->m_CameraProperties.Set(QT3DSVec2(filterSz, clipFar));
+ shaderX->m_DepthMap.Set(target0);
+
+ // Draw a fullscreen quad
+ m_Renderer.RenderQuad();
+
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::Color0, *target0);
+ //(*theFB)->Attach( NVRenderFrameBufferAttachments::DepthStencil, *target0 );
+ theContext.SetActiveShader(&(shaderY->m_Shader));
+
+ shaderY->m_CameraProperties.Set(QT3DSVec2(filterSz, clipFar));
+ shaderY->m_DepthMap.Set(target1);
+
+ // Draw a fullscreen quad
+ m_Renderer.RenderQuad();
+
+ theContext.SetDepthWriteEnabled(true);
+ theContext.SetDepthTestEnabled(true);
+ theContext.SetColorWritesEnabled(false);
+
+ //(*theFB)->Attach( NVRenderFrameBufferAttachments::DepthStencil,
+ //NVRenderTextureOrRenderBuffer() );
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::Color0, NVRenderTextureOrRenderBuffer());
+ }
+
+ void SLayerRenderData::RenderShadowMapPass(CResourceFrameBuffer *theFB)
+ {
+ SStackPerfTimer ___timer(m_Renderer.GetQt3DSContext().GetPerfTimer(),
+ "SLayerRenderData::RenderShadowMapPass");
+
+ if (m_Camera == NULL || !GetShadowMapManager())
+ return;
+
+ // Check if we have anything to render
+ if (m_OpaqueObjects.size() == 0 || m_Lights.size() == 0)
+ return;
+
+ m_Renderer.BeginLayerDepthPassRender(*this);
+
+ NVRenderContext &theRenderContext(m_Renderer.GetContext());
+
+ // we may change the viewport
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ theRenderContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport);
+
+ // disable color writes
+ // theRenderContext.SetColorWritesEnabled( false );
+ theRenderContext.SetColorWritesEnabled(true);
+ theRenderContext.SetDepthWriteEnabled(true);
+ theRenderContext.SetCullingEnabled(false);
+ theRenderContext.SetClearColor(QT3DSVec4(1.0f));
+
+ // we render the shadow map with a slight offset to prevent shadow acne and cull the front
+ // faces
+ NVScopedRefCounted<qt3ds::render::NVRenderRasterizerState> rsdefaultstate =
+ theRenderContext.CreateRasterizerState(0.0, 0.0, qt3ds::render::NVRenderFaces::Back);
+ NVScopedRefCounted<qt3ds::render::NVRenderRasterizerState> rsstate =
+ theRenderContext.CreateRasterizerState(1.5, 2.0, qt3ds::render::NVRenderFaces::Front);
+ theRenderContext.SetRasterizerState(rsstate);
+
+ qt3ds::render::NVRenderClearFlags clearFlags(qt3ds::render::NVRenderClearValues::Depth
+ | qt3ds::render::NVRenderClearValues::Stencil
+ | qt3ds::render::NVRenderClearValues::Color);
+
+ for (QT3DSU32 i = 0; i < m_Lights.size(); i++) {
+ // don't render shadows when not casting
+ if (m_Lights[i]->m_CastShadow == false)
+ continue;
+ SShadowMapEntry *pEntry = m_ShadowMapManager->GetShadowMapEntry(i);
+ if (pEntry && pEntry->m_DepthMap && pEntry->m_DepthCopy && pEntry->m_DepthRender) {
+ SCamera theCamera;
+
+ QT3DSVec2 theCameraProps = QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar);
+ SetupCameraForShadowMap(theCameraProps, m_Renderer.GetContext(),
+ __viewport.m_InitialValue, *m_Camera,
+ m_Lights[i], theCamera);
+ // we need this matrix for the final rendering
+ theCamera.CalculateViewProjectionMatrix(pEntry->m_LightVP);
+ pEntry->m_LightView = theCamera.m_GlobalTransform.getInverse();
+
+ STextureDetails theDetails(pEntry->m_DepthMap->GetTextureDetails());
+ theRenderContext.SetViewport(
+ NVRenderRect(0, 0, (QT3DSU32)theDetails.m_Width, (QT3DSU32)theDetails.m_Height));
+
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::Color0, *pEntry->m_DepthMap);
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::DepthStencil,
+ *pEntry->m_DepthRender);
+ theRenderContext.Clear(clearFlags);
+
+ RunRenderPass(RenderRenderableShadowMapPass, false, true, true, i, theCamera);
+ RenderShadowMapBlurPass(theFB, pEntry->m_DepthMap, pEntry->m_DepthCopy,
+ m_Lights[i]->m_ShadowFilter, m_Lights[i]->m_ShadowMapFar);
+ } else if (pEntry && pEntry->m_DepthCube && pEntry->m_CubeCopy
+ && pEntry->m_DepthRender) {
+ SCamera theCameras[6];
+
+ SetupCubeShadowCameras(m_Lights[i], theCameras);
+
+ // pEntry->m_LightView = m_Lights[i]->m_LightType == RenderLightTypes::Point ?
+ // QT3DSMat44::createIdentity()
+ // : m_Lights[i]->m_GlobalTransform;
+ pEntry->m_LightView = QT3DSMat44::createIdentity();
+
+ STextureDetails theDetails(pEntry->m_DepthCube->GetTextureDetails());
+ theRenderContext.SetViewport(
+ NVRenderRect(0, 0, (QT3DSU32)theDetails.m_Width, (QT3DSU32)theDetails.m_Height));
+
+ // int passes = m_Lights[i]->m_LightType == RenderLightTypes::Point ? 6 : 5;
+ int passes = 6;
+ for (int k = 0; k < passes; ++k) {
+ // theCameras[k].CalculateViewProjectionMatrix( pEntry->m_LightCubeVP[k] );
+ pEntry->m_LightCubeView[k] = theCameras[k].m_GlobalTransform.getInverse();
+ theCameras[k].CalculateViewProjectionMatrix(pEntry->m_LightVP);
+
+ // Geometry shader multiplication really doesn't work unless you have a
+ // 6-layered 3D depth texture...
+ // Otherwise, you have no way to depth test while rendering...
+ // which more or less completely defeats the purpose of having a cubemap render
+ // target.
+ NVRenderTextureCubeFaces::Enum curFace =
+ (NVRenderTextureCubeFaces::Enum)(k + 1);
+ //(*theFB)->AttachFace( NVRenderFrameBufferAttachments::DepthStencil,
+ //*pEntry->m_DepthCube, curFace );
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::DepthStencil,
+ *pEntry->m_DepthRender);
+ (*theFB)->AttachFace(NVRenderFrameBufferAttachments::Color0,
+ *pEntry->m_DepthCube, curFace);
+ (*theFB)->IsComplete();
+ theRenderContext.Clear(clearFlags);
+
+ RunRenderPass(RenderRenderableShadowMapPass, false, true, true, i,
+ theCameras[k]);
+ }
+
+ RenderShadowCubeBlurPass(theFB, pEntry->m_DepthCube, pEntry->m_CubeCopy,
+ m_Lights[i]->m_ShadowFilter, m_Lights[i]->m_ShadowMapFar);
+ }
+ }
+
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::Depth, NVRenderTextureOrRenderBuffer());
+ (*theFB)->Attach(NVRenderFrameBufferAttachments::Color0, NVRenderTextureOrRenderBuffer());
+
+ // enable color writes
+ theRenderContext.SetColorWritesEnabled(true);
+ theRenderContext.SetCullingEnabled(true);
+ theRenderContext.SetClearColor(QT3DSVec4(0.0f));
+ // reset rasterizer state
+ theRenderContext.SetRasterizerState(rsdefaultstate);
+
+ m_Renderer.EndLayerDepthPassRender();
+ }
+
+ inline void RenderRenderableDepthPass(SLayerRenderData &inData, SRenderableObject &inObject,
+ const QT3DSVec2 &inCameraProps, TShaderFeatureSet, QT3DSU32,
+ const SCamera &inCamera)
+ {
+ if (inObject.m_RenderableFlags.IsDefaultMaterialMeshSubset()) {
+ static_cast<SSubsetRenderable &>(inObject).RenderDepthPass(inCameraProps);
+ } else if (inObject.m_RenderableFlags.IsText()) {
+ static_cast<STextRenderable &>(inObject).RenderDepthPass(inCameraProps);
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ } else if (inObject.m_RenderableFlags.isDistanceField()) {
+ static_cast<SDistanceFieldRenderable &>(inObject).RenderDepthPass(inCameraProps);
+#endif
+ } else if (inObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) {
+ static_cast<SCustomMaterialRenderable &>(inObject).RenderDepthPass(
+ inCameraProps, inData.m_Layer, inData.m_Lights, inCamera, NULL);
+ } else if (inObject.m_RenderableFlags.IsPath()) {
+ static_cast<SPathRenderable &>(inObject).RenderDepthPass(
+ inCameraProps, inData.m_Layer, inData.m_Lights, inCamera, NULL);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void SLayerRenderData::RenderDepthPass(bool inEnableTransparentDepthWrite)
+ {
+ SStackPerfTimer ___timer(m_Renderer.GetQt3DSContext().GetPerfTimer(),
+ "SLayerRenderData::RenderDepthPass");
+ if (m_Camera == NULL)
+ return;
+
+ // Avoid running this method if possible.
+ if ((inEnableTransparentDepthWrite == false
+ && (m_OpaqueObjects.size() == 0
+ || m_Layer.m_Flags.IsLayerEnableDepthPrepass() == false))
+ || m_Layer.m_Flags.IsLayerEnableDepthTest() == false)
+ return;
+
+ m_Renderer.BeginLayerDepthPassRender(*this);
+
+ NVRenderContext &theRenderContext(m_Renderer.GetContext());
+
+ // disable color writes
+ theRenderContext.SetColorWritesEnabled(false);
+ theRenderContext.SetDepthWriteEnabled(true);
+
+ qt3ds::render::NVRenderClearFlags clearFlags(qt3ds::render::NVRenderClearValues::Stencil
+ | qt3ds::render::NVRenderClearValues::Depth);
+ theRenderContext.Clear(clearFlags);
+
+ RunRenderPass(RenderRenderableDepthPass, false, true, inEnableTransparentDepthWrite, 0,
+ *m_Camera);
+
+ // enable color writes
+ theRenderContext.SetColorWritesEnabled(true);
+
+ m_Renderer.EndLayerDepthPassRender();
+ }
+
+ inline void RenderRenderable(SLayerRenderData &inData, SRenderableObject &inObject,
+ const QT3DSVec2 &inCameraProps, TShaderFeatureSet inFeatureSet, QT3DSU32,
+ const SCamera &inCamera)
+ {
+ if (inObject.m_RenderableFlags.IsDefaultMaterialMeshSubset())
+ static_cast<SSubsetRenderable &>(inObject).Render(inCameraProps, inFeatureSet);
+ else if (inObject.m_RenderableFlags.IsText())
+ static_cast<STextRenderable &>(inObject).Render(inCameraProps);
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ else if (inObject.m_RenderableFlags.isDistanceField())
+ static_cast<SDistanceFieldRenderable &>(inObject).Render(inCameraProps);
+#endif
+ else if (inObject.m_RenderableFlags.IsCustomMaterialMeshSubset()) {
+ // PKC : Need a better place to do this.
+ SCustomMaterialRenderable &theObject =
+ static_cast<SCustomMaterialRenderable &>(inObject);
+ if (!inData.m_Layer.m_LightProbe && theObject.m_Material.m_IblProbe)
+ inData.SetShaderFeature("QT3DS_ENABLE_LIGHT_PROBE",
+ theObject.m_Material.m_IblProbe->m_TextureData.m_Texture
+ != NULL);
+ else if (inData.m_Layer.m_LightProbe)
+ inData.SetShaderFeature("QT3DS_ENABLE_LIGHT_PROBE",
+ inData.m_Layer.m_LightProbe->m_TextureData.m_Texture
+ != NULL);
+
+ static_cast<SCustomMaterialRenderable &>(inObject).Render(
+ inCameraProps, inData, inData.m_Layer, inData.m_Lights, inCamera,
+ inData.m_LayerDepthTexture, inData.m_LayerSsaoTexture, inFeatureSet);
+ } else if (inObject.m_RenderableFlags.IsPath()) {
+ static_cast<SPathRenderable &>(inObject).Render(
+ inCameraProps, inData.m_Layer, inData.m_Lights, inCamera,
+ inData.m_LayerDepthTexture, inData.m_LayerSsaoTexture, inFeatureSet);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+
+ void SLayerRenderData::RunRenderPass(TRenderRenderableFunction inRenderFn,
+ bool inEnableBlending, bool inEnableDepthWrite,
+ bool inEnableTransparentDepthWrite, QT3DSU32 indexLight,
+ const SCamera &inCamera, CResourceFrameBuffer *theFB)
+ {
+ NVRenderContext &theRenderContext(m_Renderer.GetContext());
+ theRenderContext.SetDepthFunction(qt3ds::render::NVRenderBoolOp::LessThanOrEqual);
+ theRenderContext.SetBlendingEnabled(false);
+ QT3DSVec2 theCameraProps = QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar);
+ NVDataRef<SRenderableObject *> theOpaqueObjects = GetOpaqueRenderableObjects();
+ bool usingDepthBuffer =
+ m_Layer.m_Flags.IsLayerEnableDepthTest() && theOpaqueObjects.size() > 0;
+
+ if (usingDepthBuffer) {
+ theRenderContext.SetDepthTestEnabled(true);
+ theRenderContext.SetDepthWriteEnabled(inEnableDepthWrite);
+ } else {
+ theRenderContext.SetDepthWriteEnabled(false);
+ theRenderContext.SetDepthTestEnabled(false);
+ }
+
+ for (QT3DSU32 idx = 0, end = theOpaqueObjects.size(); idx < end; ++idx) {
+ SRenderableObject &theObject(*theOpaqueObjects[idx]);
+ SScopedLightsListScope lightsScope(m_Lights, m_LightDirections, m_SourceLightDirections,
+ theObject.m_ScopedLights);
+ SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false);
+ inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(), indexLight,
+ inCamera);
+ }
+
+ // transparent objects
+ if (inEnableBlending || m_Layer.m_Flags.IsLayerEnableDepthTest() == false) {
+ theRenderContext.SetBlendingEnabled(true && inEnableBlending);
+ theRenderContext.SetDepthWriteEnabled(inEnableTransparentDepthWrite);
+
+ NVDataRef<SRenderableObject *> theTransparentObjects = GetTransparentRenderableObjects();
+ // Assume all objects have transparency if the layer's depth test enabled flag is true.
+ if (m_Layer.m_Flags.IsLayerEnableDepthTest() == true) {
+ for (QT3DSU32 idx = 0, end = theTransparentObjects.size(); idx < end; ++idx) {
+ SRenderableObject &theObject(*theTransparentObjects[idx]);
+ if (!(theObject.m_RenderableFlags.IsCompletelyTransparent())) {
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ // SW fallback for advanced blend modes.
+ // Renders transparent objects to a separate FBO and blends them in shader
+ // with the opaque items and background.
+ DefaultMaterialBlendMode::Enum blendMode
+ = DefaultMaterialBlendMode::Enum::Normal;
+ if (theObject.m_RenderableFlags.IsDefaultMaterialMeshSubset())
+ blendMode = static_cast<SSubsetRenderable &>(theObject).getBlendingMode();
+ bool useBlendFallback = (blendMode == DefaultMaterialBlendMode::Overlay ||
+ blendMode == DefaultMaterialBlendMode::ColorBurn ||
+ blendMode == DefaultMaterialBlendMode::ColorDodge) &&
+ !theRenderContext.IsAdvancedBlendHwSupported() &&
+ !theRenderContext.IsAdvancedBlendHwSupportedKHR() &&
+ m_LayerPrepassDepthTexture;
+ if (useBlendFallback)
+ SetupDrawFB(true);
+#endif
+ SScopedLightsListScope lightsScope(m_Lights, m_LightDirections,
+ m_SourceLightDirections,
+ theObject.m_ScopedLights);
+ SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false);
+
+ inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(),
+ indexLight, inCamera);
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ // SW fallback for advanced blend modes.
+ // Continue blending after transparent objects have been rendered to a FBO
+ if (useBlendFallback) {
+ BlendAdvancedToFB(blendMode, true, theFB);
+ // restore blending status
+ theRenderContext.SetBlendingEnabled(inEnableBlending);
+ // restore depth test status
+ theRenderContext.SetDepthTestEnabled(usingDepthBuffer);
+ theRenderContext.SetDepthWriteEnabled(inEnableTransparentDepthWrite);
+ }
+#endif
+ }
+ }
+ }
+ // If the layer doesn't have depth enabled then we have to render via an alternate route
+ // where the transparent objects vector could have both opaque and transparent objects.
+ else {
+ for (QT3DSU32 idx = 0, end = theTransparentObjects.size(); idx < end; ++idx) {
+ SRenderableObject &theObject(*theTransparentObjects[idx]);
+ if (!(theObject.m_RenderableFlags.IsCompletelyTransparent())) {
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ DefaultMaterialBlendMode::Enum blendMode
+ = DefaultMaterialBlendMode::Enum::Normal;
+ if (theObject.m_RenderableFlags.IsDefaultMaterialMeshSubset())
+ blendMode = static_cast<SSubsetRenderable &>(theObject).getBlendingMode();
+ bool useBlendFallback = (blendMode == DefaultMaterialBlendMode::Overlay ||
+ blendMode == DefaultMaterialBlendMode::ColorBurn ||
+ blendMode == DefaultMaterialBlendMode::ColorDodge) &&
+ !theRenderContext.IsAdvancedBlendHwSupported() &&
+ !theRenderContext.IsAdvancedBlendHwSupportedKHR();
+
+ if (theObject.m_RenderableFlags.HasTransparency()) {
+ theRenderContext.SetBlendingEnabled(true && inEnableBlending);
+ // If we have SW fallback for blend mode, render to a FBO and blend back.
+ // Slow as this must be done per-object (transparent and opaque items
+ // are mixed, not batched)
+ if (useBlendFallback)
+ SetupDrawFB(false);
+ }
+#endif
+ SScopedLightsListScope lightsScope(m_Lights, m_LightDirections,
+ m_SourceLightDirections,
+ theObject.m_ScopedLights);
+ SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false);
+ inRenderFn(*this, theObject, theCameraProps, GetShaderFeatureSet(),
+ indexLight, inCamera);
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ if (useBlendFallback) {
+ BlendAdvancedToFB(blendMode, false, theFB);
+ // restore blending status
+ theRenderContext.SetBlendingEnabled(inEnableBlending);
+
+ }
+#endif
+ }
+ }
+ }
+ }
+ }
+
+ void SLayerRenderData::Render(CResourceFrameBuffer *theFB)
+ {
+ SStackPerfTimer ___timer(m_Renderer.GetQt3DSContext().GetPerfTimer(),
+ "SLayerRenderData::Render");
+ if (m_Camera == NULL)
+ return;
+
+ m_Renderer.BeginLayerRender(*this);
+ RunRenderPass(RenderRenderable, true, !m_Layer.m_Flags.IsLayerEnableDepthPrepass(), false,
+ 0, *m_Camera, theFB);
+ m_Renderer.EndLayerRender();
+ }
+
+ void SLayerRenderData::CreateGpuProfiler()
+ {
+ if (m_Renderer.GetContext().IsTimerQuerySupported()) {
+ m_LayerProfilerGpu = IRenderProfiler::CreateGpuProfiler(
+ m_Renderer.GetContext().GetFoundation(), m_Renderer.GetQt3DSContext(),
+ m_Renderer.GetContext());
+ }
+ }
+
+ void SLayerRenderData::StartProfiling(CRegisteredString &nameID, bool sync)
+ {
+ if (m_LayerProfilerGpu.mPtr) {
+ m_LayerProfilerGpu->StartTimer(nameID, false, sync);
+ }
+ }
+
+ void SLayerRenderData::EndProfiling(CRegisteredString &nameID)
+ {
+ if (m_LayerProfilerGpu.mPtr) {
+ m_LayerProfilerGpu->EndTimer(nameID);
+ }
+ }
+
+ void SLayerRenderData::StartProfiling(const char *nameID, bool sync)
+ {
+ if (m_LayerProfilerGpu.mPtr) {
+ CRegisteredString theStr(
+ m_Renderer.GetQt3DSContext().GetStringTable().RegisterStr(nameID));
+ m_LayerProfilerGpu->StartTimer(theStr, false, sync);
+ }
+ }
+
+ void SLayerRenderData::EndProfiling(const char *nameID)
+ {
+ if (m_LayerProfilerGpu.mPtr) {
+ CRegisteredString theStr(
+ m_Renderer.GetQt3DSContext().GetStringTable().RegisterStr(nameID));
+ m_LayerProfilerGpu->EndTimer(theStr);
+ }
+ }
+
+ void SLayerRenderData::AddVertexCount(QT3DSU32 count)
+ {
+ if (m_LayerProfilerGpu.mPtr) {
+ m_LayerProfilerGpu->AddVertexCount(count);
+ }
+ }
+
+ // Assumes the viewport is setup appropriately to render the widget.
+ void SLayerRenderData::RenderRenderWidgets()
+ {
+ if (m_Camera) {
+ NVRenderContext &theContext(m_Renderer.GetContext());
+ for (QT3DSU32 idx = 0, end = m_IRenderWidgets.size(); idx < end; ++idx) {
+ IRenderWidget &theWidget = *m_IRenderWidgets[idx];
+ theWidget.Render(m_Renderer, theContext);
+ }
+ }
+ }
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ void SLayerRenderData::BlendAdvancedEquationSwFallback(NVRenderTexture2D *drawTexture,
+ NVRenderTexture2D *layerTexture,
+ AdvancedBlendModes::Enum blendMode)
+ {
+ NVRenderContext &theContext(m_Renderer.GetContext());
+ SAdvancedModeBlendShader *shader = m_Renderer.GetAdvancedBlendModeShader(blendMode);
+ if (shader == NULL)
+ return;
+
+ theContext.SetActiveShader(&(shader->m_Shader));
+
+ shader->m_baseLayer.Set(layerTexture);
+ shader->m_blendLayer.Set(drawTexture);
+ // Draw a fullscreen quad
+ m_Renderer.RenderQuad();
+ }
+
+ void SLayerRenderData::SetupDrawFB(bool depthEnabled)
+ {
+ NVRenderContext &theRenderContext(m_Renderer.GetContext());
+ // create drawing FBO and texture, if not existing
+ if (!m_AdvancedModeDrawFB)
+ m_AdvancedModeDrawFB = theRenderContext.CreateFrameBuffer();
+ if (!m_AdvancedBlendDrawTexture) {
+ m_AdvancedBlendDrawTexture = theRenderContext.CreateTexture2D();
+ NVRenderRect theViewport = m_Renderer.GetQt3DSContext().GetRenderList().GetViewport();
+ m_AdvancedBlendDrawTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0,
+ theViewport.m_Width,
+ theViewport.m_Height,
+ NVRenderTextureFormats::RGBA8);
+ m_AdvancedModeDrawFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ *m_AdvancedBlendDrawTexture);
+ // Use existing depth prepass information when rendering transparent objects to a FBO
+ if (depthEnabled)
+ m_AdvancedModeDrawFB->Attach(NVRenderFrameBufferAttachments::Depth,
+ *m_LayerPrepassDepthTexture);
+ }
+ theRenderContext.SetRenderTarget(m_AdvancedModeDrawFB);
+ // make sure that depth testing is on in order to render just the
+ // depth-passed objects (=transparent objects) and leave background intact
+ if (depthEnabled)
+ theRenderContext.SetDepthTestEnabled(true);
+ theRenderContext.SetBlendingEnabled(false);
+ // clear color commonly is the layer background, make sure that it is all-zero here
+ QT3DSVec4 originalClrColor = theRenderContext.GetClearColor();
+ theRenderContext.SetClearColor(QT3DSVec4(0.0));
+ theRenderContext.Clear(NVRenderClearValues::Color);
+ theRenderContext.SetClearColor(originalClrColor);
+
+ }
+ void SLayerRenderData::BlendAdvancedToFB(DefaultMaterialBlendMode::Enum blendMode,
+ bool depthEnabled, CResourceFrameBuffer *theFB)
+ {
+ NVRenderContext &theRenderContext(m_Renderer.GetContext());
+ NVRenderRect theViewport = m_Renderer.GetQt3DSContext().GetRenderList().GetViewport();
+ AdvancedBlendModes::Enum advancedMode;
+
+ switch (blendMode) {
+ case DefaultMaterialBlendMode::Overlay:
+ advancedMode = AdvancedBlendModes::Overlay;
+ break;
+ case DefaultMaterialBlendMode::ColorBurn:
+ advancedMode = AdvancedBlendModes::ColorBurn;
+ break;
+ case DefaultMaterialBlendMode::ColorDodge:
+ advancedMode = AdvancedBlendModes::ColorDodge;
+ break;
+ default:
+ Q_UNREACHABLE();
+ }
+ // create blending FBO and texture if not existing
+ if (!m_AdvancedModeBlendFB)
+ m_AdvancedModeBlendFB = theRenderContext.CreateFrameBuffer();
+ if (!m_AdvancedBlendBlendTexture) {
+ m_AdvancedBlendBlendTexture = theRenderContext.CreateTexture2D();
+ m_AdvancedBlendBlendTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0,
+ theViewport.m_Width,
+ theViewport.m_Height,
+ NVRenderTextureFormats::RGBA8);
+ m_AdvancedModeBlendFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ *m_AdvancedBlendBlendTexture);
+ }
+ theRenderContext.SetRenderTarget(m_AdvancedModeBlendFB);
+
+ // Blend transparent objects with SW fallback shaders.
+ // Disable depth testing as transparent objects have already been
+ // depth-checked; here we want to run shader for all layer pixels
+ if (depthEnabled)
+ {
+ theRenderContext.SetDepthTestEnabled(false);
+ theRenderContext.SetDepthWriteEnabled(false);
+ }
+ BlendAdvancedEquationSwFallback(m_AdvancedBlendDrawTexture, m_LayerTexture, advancedMode);
+ theRenderContext.SetRenderTarget(*theFB);
+ // setup read target
+ theRenderContext.SetReadTarget(m_AdvancedModeBlendFB);
+ theRenderContext.SetReadBuffer(NVReadFaces::Color0);
+ theRenderContext.BlitFramebuffer(0, 0, theViewport.m_Width, theViewport.m_Height,
+ 0, 0, theViewport.m_Width, theViewport.m_Height,
+ NVRenderClearValues::Color,
+ NVRenderTextureMagnifyingOp::Nearest);
+ }
+#endif
+
+ void SLayerRenderData::RenderToViewport()
+ {
+ if (m_LayerPrepResult->IsLayerVisible()) {
+ if (GetOffscreenRenderer()) {
+ if (m_Layer.m_Background == LayerBackground::Color) {
+ m_LastFrameOffscreenRenderer->RenderWithClear(
+ CreateOffscreenRenderEnvironment(), m_Renderer.GetContext(),
+ m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(),
+ SScene::AlwaysClear, m_Layer.m_ClearColor, &m_Layer);
+ } else {
+ m_LastFrameOffscreenRenderer->Render(
+ CreateOffscreenRenderEnvironment(), m_Renderer.GetContext(),
+ m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(),
+ SScene::ClearIsOptional, &m_Layer);
+ }
+ } else {
+ RenderDepthPass(false);
+ Render();
+ RenderRenderWidgets();
+ }
+ }
+ }
+ // These are meant to be pixel offsets, so you need to divide them by the width/height
+ // of the layer respectively.
+ const QT3DSVec2 s_VertexOffsets[SLayerRenderPreparationData::MAX_AA_LEVELS] = {
+ QT3DSVec2(-0.170840f, -0.553840f), // 1x
+ QT3DSVec2(0.162960f, -0.319340f), // 2x
+ QT3DSVec2(0.360260f, -0.245840f), // 3x
+ QT3DSVec2(-0.561340f, -0.149540f), // 4x
+ QT3DSVec2(0.249460f, 0.453460f), // 5x
+ QT3DSVec2(-0.336340f, 0.378260f), // 6x
+ QT3DSVec2(0.340000f, 0.166260f), // 7x
+ QT3DSVec2(0.235760f, 0.527760f), // 8x
+ };
+
+ // Blend factors are in the form of (frame blend factor, accumulator blend factor)
+ const QT3DSVec2 s_BlendFactors[SLayerRenderPreparationData::MAX_AA_LEVELS] = {
+ QT3DSVec2(0.500000f, 0.500000f), // 1x
+ QT3DSVec2(0.333333f, 0.666667f), // 2x
+ QT3DSVec2(0.250000f, 0.750000f), // 3x
+ QT3DSVec2(0.200000f, 0.800000f), // 4x
+ QT3DSVec2(0.166667f, 0.833333f), // 5x
+ QT3DSVec2(0.142857f, 0.857143f), // 6x
+ QT3DSVec2(0.125000f, 0.875000f), // 7x
+ QT3DSVec2(0.111111f, 0.888889f), // 8x
+ };
+
+ const QT3DSVec2 s_TemporalVertexOffsets[SLayerRenderPreparationData::MAX_TEMPORAL_AA_LEVELS] = {
+ QT3DSVec2(.3f, .3f), QT3DSVec2(-.3f, -.3f)
+ };
+
+ static inline void OffsetProjectionMatrix(QT3DSMat44 &inProjectionMatrix, QT3DSVec2 inVertexOffsets)
+ {
+ inProjectionMatrix.column3.x =
+ inProjectionMatrix.column3.x + inProjectionMatrix.column3.w * inVertexOffsets.x;
+ inProjectionMatrix.column3.y =
+ inProjectionMatrix.column3.y + inProjectionMatrix.column3.w * inVertexOffsets.y;
+ }
+
+ CRegisteredString depthPassStr;
+
+ // Render this layer's data to a texture. Required if we have any effects,
+ // prog AA, or if forced.
+ void SLayerRenderData::RenderToTexture()
+ {
+ QT3DS_ASSERT(m_LayerPrepResult->m_Flags.ShouldRenderToTexture());
+ SLayerRenderPreparationResult &thePrepResult(*m_LayerPrepResult);
+ NVRenderContext &theRenderContext(m_Renderer.GetContext());
+ QSize theLayerTextureDimensions = thePrepResult.GetTextureDimensions();
+ QSize theLayerOriginalTextureDimensions = theLayerTextureDimensions;
+ NVRenderTextureFormats::Enum DepthTextureFormat = NVRenderTextureFormats::Depth24Stencil8;
+ NVRenderTextureFormats::Enum ColorTextureFormat = NVRenderTextureFormats::RGBA8;
+ if (thePrepResult.m_LastEffect
+ && theRenderContext.GetRenderContextType() != NVRenderContextValues::GLES2) {
+ if (m_Layer.m_Background != LayerBackground::Transparent)
+ ColorTextureFormat = NVRenderTextureFormats::R11G11B10;
+ else
+ ColorTextureFormat = NVRenderTextureFormats::RGBA16F;
+ }
+ NVRenderTextureFormats::Enum ColorSSAOTextureFormat = NVRenderTextureFormats::RGBA8;
+
+ bool needsRender = false;
+ QT3DSU32 sampleCount = 1;
+ // check multsample mode and MSAA texture support
+ if (m_Layer.m_MultisampleAAMode != AAModeValues::NoAA
+ && theRenderContext.AreMultisampleTexturesSupported())
+ sampleCount = (QT3DSU32)m_Layer.m_MultisampleAAMode;
+
+ bool isMultisamplePass = false;
+ if (theRenderContext.GetRenderContextType() != NVRenderContextValues::GLES2)
+ isMultisamplePass =
+ (sampleCount > 1) || (m_Layer.m_MultisampleAAMode == AAModeValues::SSAA);
+
+ qt3ds::render::NVRenderTextureTargetType::Enum thFboAttachTarget =
+ qt3ds::render::NVRenderTextureTargetType::Texture2D;
+
+ // If the user has disabled all layer caching this has the side effect of disabling the
+ // progressive AA algorithm.
+ if (thePrepResult.m_Flags.WasLayerDataDirty()
+ || thePrepResult.m_Flags.WasDirty()
+ || m_Renderer.IsLayerCachingEnabled() == false
+ || thePrepResult.m_Flags.ShouldRenderToTexture()) {
+ m_ProgressiveAAPassIndex = 0;
+ m_NonDirtyTemporalAAPassIndex = 0;
+ needsRender = true;
+ }
+
+ CResourceTexture2D *renderColorTexture = &m_LayerTexture;
+ CResourceTexture2D *renderPrepassDepthTexture = &m_LayerPrepassDepthTexture;
+ CResourceTexture2D *renderWidgetTexture = &m_LayerWidgetTexture;
+ NVRenderContextScopedProperty<bool> __multisampleEnabled(
+ theRenderContext, &NVRenderContext::IsMultisampleEnabled,
+ &NVRenderContext::SetMultisampleEnabled);
+ theRenderContext.SetMultisampleEnabled(false);
+ if (isMultisamplePass) {
+ renderColorTexture = &m_LayerMultisampleTexture;
+ renderPrepassDepthTexture = &m_LayerMultisamplePrepassDepthTexture;
+ renderWidgetTexture = &m_LayerMultisampleWidgetTexture;
+ // for SSAA we don't use MS textures
+ if (m_Layer.m_MultisampleAAMode != AAModeValues::SSAA)
+ thFboAttachTarget = qt3ds::render::NVRenderTextureTargetType::Texture2D_MS;
+ }
+ QT3DSU32 maxTemporalPassIndex = m_Layer.m_TemporalAAEnabled ? 2 : 0;
+
+ // If all the dimensions match then we do not have to re-render the layer.
+ if (m_LayerTexture.TextureMatches(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(), ColorTextureFormat)
+ && (!thePrepResult.m_Flags.RequiresDepthTexture()
+ || m_LayerDepthTexture.TextureMatches(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(),
+ DepthTextureFormat))
+ && m_ProgressiveAAPassIndex >= thePrepResult.m_MaxAAPassIndex
+ && m_NonDirtyTemporalAAPassIndex >= maxTemporalPassIndex && needsRender == false) {
+ return;
+ }
+
+ // adjust render size for SSAA
+ if (m_Layer.m_MultisampleAAMode == AAModeValues::SSAA) {
+ QT3DSU32 ow, oh;
+ CRendererUtil::GetSSAARenderSize(theLayerOriginalTextureDimensions.width(),
+ theLayerOriginalTextureDimensions.height(),
+ ow, oh);
+ theLayerTextureDimensions = QSize(ow, oh);
+ }
+
+ // If our pass index == thePreResult.m_MaxAAPassIndex then
+ // we shouldn't get into here.
+
+ IResourceManager &theResourceManager = m_Renderer.GetQt3DSContext().GetResourceManager();
+ bool hadLayerTexture = true;
+
+ if (renderColorTexture->EnsureTexture(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(),
+ ColorTextureFormat, sampleCount)) {
+ m_ProgressiveAAPassIndex = 0;
+ m_NonDirtyTemporalAAPassIndex = 0;
+ hadLayerTexture = false;
+ }
+
+ if (thePrepResult.m_Flags.RequiresDepthTexture()) {
+ // The depth texture doesn't need to be multisample, the prepass depth does.
+ if (m_LayerDepthTexture.EnsureTexture(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(),
+ DepthTextureFormat)) {
+ // Depth textures are generally not bilinear filtered.
+ m_LayerDepthTexture->SetMinFilter(NVRenderTextureMinifyingOp::Nearest);
+ m_LayerDepthTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Nearest);
+ m_ProgressiveAAPassIndex = 0;
+ m_NonDirtyTemporalAAPassIndex = 0;
+ }
+ }
+
+ if (thePrepResult.m_Flags.RequiresSsaoPass()) {
+ if (m_LayerSsaoTexture.EnsureTexture(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(),
+ ColorSSAOTextureFormat)) {
+ m_LayerSsaoTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ m_LayerSsaoTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ m_ProgressiveAAPassIndex = 0;
+ m_NonDirtyTemporalAAPassIndex = 0;
+ }
+ }
+
+ QT3DS_ASSERT(!thePrepResult.m_Flags.RequiresDepthTexture() || m_LayerDepthTexture);
+ QT3DS_ASSERT(!thePrepResult.m_Flags.RequiresSsaoPass() || m_LayerSsaoTexture);
+
+ CResourceTexture2D theLastLayerTexture(theResourceManager);
+ SLayerProgAABlendShader *theBlendShader = NULL;
+ QT3DSU32 aaFactorIndex = 0;
+ bool isProgressiveAABlendPass =
+ m_ProgressiveAAPassIndex && m_ProgressiveAAPassIndex < thePrepResult.m_MaxAAPassIndex;
+ bool isTemporalAABlendPass = m_Layer.m_TemporalAAEnabled && m_ProgressiveAAPassIndex == 0;
+
+ if (isProgressiveAABlendPass || isTemporalAABlendPass) {
+ theBlendShader = m_Renderer.GetLayerProgAABlendShader();
+ if (theBlendShader) {
+ m_LayerTexture.EnsureTexture(theLayerOriginalTextureDimensions.width(),
+ theLayerOriginalTextureDimensions.height(),
+ ColorTextureFormat);
+ QT3DSVec2 theVertexOffsets;
+ if (isProgressiveAABlendPass) {
+ theLastLayerTexture.StealTexture(m_LayerTexture);
+ aaFactorIndex = (m_ProgressiveAAPassIndex - 1);
+ theVertexOffsets = s_VertexOffsets[aaFactorIndex];
+ } else {
+ if (m_TemporalAATexture.GetTexture())
+ theLastLayerTexture.StealTexture(m_TemporalAATexture);
+ else {
+ if (hadLayerTexture) {
+ theLastLayerTexture.StealTexture(m_LayerTexture);
+ }
+ }
+ theVertexOffsets = s_TemporalVertexOffsets[m_TemporalAAPassIndex];
+ ++m_TemporalAAPassIndex;
+ ++m_NonDirtyTemporalAAPassIndex;
+ m_TemporalAAPassIndex = m_TemporalAAPassIndex % MAX_TEMPORAL_AA_LEVELS;
+ }
+ if (theLastLayerTexture.GetTexture()) {
+ theVertexOffsets.x =
+ theVertexOffsets.x / (theLayerOriginalTextureDimensions.width() / 2.0f);
+ theVertexOffsets.y =
+ theVertexOffsets.y / (theLayerOriginalTextureDimensions.height() / 2.0f);
+ // Run through all models and update MVP.
+ // run through all texts and update MVP.
+ // run through all path and update MVP.
+
+ // TODO - optimize this exact matrix operation.
+ for (QT3DSU32 idx = 0, end = m_ModelContexts.size(); idx < end; ++idx) {
+ QT3DSMat44 &originalProjection(m_ModelContexts[idx]->m_ModelViewProjection);
+ OffsetProjectionMatrix(originalProjection, theVertexOffsets);
+ }
+ for (QT3DSU32 idx = 0, end = m_OpaqueObjects.size(); idx < end; ++idx) {
+ if (m_OpaqueObjects[idx]->m_RenderableFlags.IsPath()) {
+ SPathRenderable &theRenderable =
+ static_cast<SPathRenderable &>(*m_OpaqueObjects[idx]);
+ OffsetProjectionMatrix(theRenderable.m_ModelViewProjection,
+ theVertexOffsets);
+ }
+ }
+ for (QT3DSU32 idx = 0, end = m_TransparentObjects.size(); idx < end; ++idx) {
+ if (m_TransparentObjects[idx]->m_RenderableFlags.IsText()) {
+ STextRenderable &theRenderable =
+ static_cast<STextRenderable &>(*m_TransparentObjects[idx]);
+ OffsetProjectionMatrix(theRenderable.m_ModelViewProjection,
+ theVertexOffsets);
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ } else if (m_TransparentObjects[idx]->m_RenderableFlags
+ .isDistanceField()) {
+ SDistanceFieldRenderable &theRenderable
+ = static_cast<SDistanceFieldRenderable &>(
+ *m_TransparentObjects[idx]);
+ OffsetProjectionMatrix(theRenderable.m_mvp,
+ theVertexOffsets);
+#endif
+ } else if (m_TransparentObjects[idx]->m_RenderableFlags.IsPath()) {
+ SPathRenderable &theRenderable =
+ static_cast<SPathRenderable &>(*m_TransparentObjects[idx]);
+ OffsetProjectionMatrix(theRenderable.m_ModelViewProjection,
+ theVertexOffsets);
+ }
+ }
+ }
+ }
+ }
+ if (theLastLayerTexture.GetTexture() == NULL) {
+ isProgressiveAABlendPass = false;
+ isTemporalAABlendPass = false;
+ }
+ // Sometimes we will have stolen the render texture.
+ renderColorTexture->EnsureTexture(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(), ColorTextureFormat,
+ sampleCount);
+
+ if (!isTemporalAABlendPass)
+ m_TemporalAATexture.ReleaseTexture();
+
+ // Allocating a frame buffer can cause it to be bound, so we need to save state before this
+ // happens.
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __framebuf(
+ theRenderContext, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+ // Match the bit depth of the current render target to avoid popping when we switch from aa
+ // to non aa layers
+ // We have to all this here in because once we change the FB by allocating an FB we are
+ // screwed.
+ NVRenderTextureFormats::Enum theDepthFormat(GetDepthBufferFormat());
+ NVRenderFrameBufferAttachments::Enum theDepthAttachmentFormat(
+ GetFramebufferDepthAttachmentFormat(theDepthFormat));
+
+ // Definitely disable the scissor rect if it is running right now.
+ NVRenderContextScopedProperty<bool> __scissorEnabled(
+ theRenderContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled, false);
+ CResourceFrameBuffer theFB(theResourceManager);
+ // Allocates the frame buffer which has the side effect of setting the current render target
+ // to that frame buffer.
+ theFB.EnsureFrameBuffer();
+
+ bool hasDepthObjects = m_OpaqueObjects.size() > 0;
+ bool requiresDepthStencilBuffer =
+ hasDepthObjects || thePrepResult.m_Flags.RequiresStencilBuffer();
+ NVRenderRect theNewViewport(0, 0, theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height());
+ {
+ theRenderContext.SetRenderTarget(theFB);
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ theRenderContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport,
+ theNewViewport);
+ QT3DSVec4 clearColor(0.0f);
+ if (m_Layer.m_Background == LayerBackground::Color)
+ clearColor = m_Layer.m_ClearColor;
+
+ NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
+ theRenderContext, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor,
+ clearColor);
+ if (requiresDepthStencilBuffer) {
+ if (renderPrepassDepthTexture->EnsureTexture(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(),
+ theDepthFormat, sampleCount)) {
+ (*renderPrepassDepthTexture)->SetMinFilter(NVRenderTextureMinifyingOp::Nearest);
+ (*renderPrepassDepthTexture)
+ ->SetMagFilter(NVRenderTextureMagnifyingOp::Nearest);
+ }
+ }
+
+ if (thePrepResult.m_Flags.RequiresDepthTexture() && m_ProgressiveAAPassIndex == 0) {
+ // Setup FBO with single depth buffer target.
+ // Note this does not use multisample.
+ NVRenderFrameBufferAttachments::Enum theAttachment =
+ GetFramebufferDepthAttachmentFormat(DepthTextureFormat);
+ theFB->Attach(theAttachment, *m_LayerDepthTexture);
+
+ // In this case transparent objects also may write their depth.
+ RenderDepthPass(true);
+ theFB->Attach(theAttachment, NVRenderTextureOrRenderBuffer());
+ }
+
+ if (thePrepResult.m_Flags.RequiresSsaoPass() && m_ProgressiveAAPassIndex == 0
+ && m_Camera != nullptr) {
+ StartProfiling("AO pass", false);
+ // Setup FBO with single color buffer target
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0, *m_LayerSsaoTexture);
+ theRenderContext.Clear(qt3ds::render::NVRenderClearValues::Color);
+ RenderAoPass();
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer());
+ EndProfiling("AO pass");
+ }
+
+ if (thePrepResult.m_Flags.RequiresShadowMapPass() && m_ProgressiveAAPassIndex == 0) {
+ // shadow map path
+ RenderShadowMapPass(&theFB);
+ }
+
+ if (sampleCount > 1) {
+ theRenderContext.SetMultisampleEnabled(true);
+ }
+
+ qt3ds::render::NVRenderClearFlags clearFlags = qt3ds::render::NVRenderClearValues::Color;
+
+ // render depth prepass
+ if ((*renderPrepassDepthTexture)) {
+ theFB->Attach(theDepthAttachmentFormat, **renderPrepassDepthTexture,
+ thFboAttachTarget);
+
+ if (m_Layer.m_Flags.IsLayerEnableDepthPrepass()) {
+ StartProfiling("Depth pass", false);
+ RenderDepthPass(false);
+ EndProfiling("Depth pass");
+ } else {
+ clearFlags |= (qt3ds::render::NVRenderClearValues::Depth);
+ clearFlags |= (qt3ds::render::NVRenderClearValues::Stencil);
+ // enable depth write for the clear below
+ theRenderContext.SetDepthWriteEnabled(true);
+ }
+ }
+
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0, **renderColorTexture,
+ thFboAttachTarget);
+ if (m_Layer.m_Background != LayerBackground::Unspecified)
+ theRenderContext.Clear(clearFlags);
+
+ // We don't clear the depth buffer because the layer render code we are about to call
+ // will do this.
+ StartProfiling("Render pass", false);
+ Render(&theFB);
+ // Debug measure to view the depth map to ensure we're rendering it correctly.
+ //if (m_Layer.m_TemporalAAEnabled) {
+ // RenderFakeDepthMapPass(m_ShadowMapManager->GetShadowMapEntry(0)->m_DepthMap,
+ // m_ShadowMapManager->GetShadowMapEntry(0)->m_DepthCube);
+ //}
+ EndProfiling("Render pass");
+
+ // Now before going further, we downsample and resolve the multisample information.
+ // This allows all algorithms running after
+ // this point to run unchanged.
+ if (isMultisamplePass) {
+ if (m_Layer.m_MultisampleAAMode != AAModeValues::SSAA) {
+ // Resolve the FBO to the layer texture
+ CRendererUtil::ResolveMutisampleFBOColorOnly(
+ theResourceManager, m_LayerTexture, theRenderContext,
+ theLayerTextureDimensions.width(), theLayerTextureDimensions.height(),
+ ColorTextureFormat, *theFB);
+
+ theRenderContext.SetMultisampleEnabled(false);
+ } else {
+ // Resolve the FBO to the layer texture
+ CRendererUtil::ResolveSSAAFBOColorOnly(
+ theResourceManager, m_LayerTexture,
+ theLayerOriginalTextureDimensions.width(),
+ theLayerOriginalTextureDimensions.height(), theRenderContext,
+ theLayerTextureDimensions.width(), theLayerTextureDimensions.height(),
+ ColorTextureFormat, *theFB);
+ }
+ }
+
+ // CN - when I tried to get anti-aliased widgets I lost all transparency on the widget
+ // layer which made it overwrite the object you were
+ // manipulating. When I tried to use parallel nsight on it the entire studio
+ // application crashed on startup.
+ if (NeedsWidgetTexture()) {
+ m_LayerWidgetTexture.EnsureTexture(theLayerTextureDimensions.width(),
+ theLayerTextureDimensions.height(),
+ NVRenderTextureFormats::RGBA8);
+ theRenderContext.SetRenderTarget(theFB);
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0, *m_LayerWidgetTexture);
+ theFB->Attach(GetFramebufferDepthAttachmentFormat(DepthTextureFormat),
+ *m_LayerDepthTexture);
+ theRenderContext.SetClearColor(QT3DSVec4(0.0f));
+ theRenderContext.Clear(qt3ds::render::NVRenderClearValues::Color);
+ // We should already have the viewport and everything setup for this.
+ RenderRenderWidgets();
+ }
+
+ if (theLastLayerTexture.GetTexture() != NULL
+ && (isProgressiveAABlendPass || isTemporalAABlendPass)) {
+ theRenderContext.SetViewport(
+ NVRenderRect(0, 0, theLayerOriginalTextureDimensions.width(),
+ theLayerOriginalTextureDimensions.height()));
+ CResourceTexture2D targetTexture(
+ theResourceManager, theLayerOriginalTextureDimensions.width(),
+ theLayerOriginalTextureDimensions.height(), ColorTextureFormat);
+ theFB->Attach(theDepthAttachmentFormat,
+ NVRenderTextureOrRenderBuffer());
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0, *targetTexture);
+ QT3DSVec2 theBlendFactors;
+ if (isProgressiveAABlendPass)
+ theBlendFactors = s_BlendFactors[aaFactorIndex];
+ else
+ theBlendFactors = QT3DSVec2(.5f, .5f);
+
+ theRenderContext.SetDepthTestEnabled(false);
+ theRenderContext.SetBlendingEnabled(false);
+ theRenderContext.SetCullingEnabled(false);
+ theRenderContext.SetActiveShader(theBlendShader->m_Shader);
+ theBlendShader->m_AccumSampler.Set(theLastLayerTexture);
+ theBlendShader->m_LastFrame.Set(m_LayerTexture);
+ theBlendShader->m_BlendFactors.Set(theBlendFactors);
+ m_Renderer.RenderQuad();
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ if (isTemporalAABlendPass)
+ m_TemporalAATexture.StealTexture(m_LayerTexture);
+ m_LayerTexture.StealTexture(targetTexture);
+ }
+
+ m_LayerTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ m_LayerTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+
+ // Don't remember why needs widget texture is false here.
+ // Should have commented why progAA plus widgets is a fail.
+ if (m_ProgressiveAAPassIndex < thePrepResult.m_MaxAAPassIndex
+ && NeedsWidgetTexture() == false)
+ ++m_ProgressiveAAPassIndex;
+
+// now we render all post effects
+#ifdef QT3DS_CACHED_POST_EFFECT
+ ApplyLayerPostEffects();
+#endif
+
+ if (m_LayerPrepassDepthTexture) {
+ // Detach any depth buffers.
+ theFB->Attach(theDepthAttachmentFormat, qt3ds::render::NVRenderTextureOrRenderBuffer(),
+ thFboAttachTarget);
+ }
+
+ theFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ qt3ds::render::NVRenderTextureOrRenderBuffer(), thFboAttachTarget);
+ // Let natural scoping rules destroy the other stuff.
+ }
+ }
+
+ void SLayerRenderData::ApplyLayerPostEffects()
+ {
+ if (m_Layer.m_FirstEffect == NULL) {
+ if (m_LayerCachedTexture) {
+ IResourceManager &theResourceManager(m_Renderer.GetQt3DSContext().GetResourceManager());
+ theResourceManager.Release(*m_LayerCachedTexture);
+ m_LayerCachedTexture = NULL;
+ }
+ return;
+ }
+
+ IEffectSystem &theEffectSystem(m_Renderer.GetQt3DSContext().GetEffectSystem());
+ IResourceManager &theResourceManager(m_Renderer.GetQt3DSContext().GetResourceManager());
+ // we use the non MSAA buffer for the effect
+ NVRenderTexture2D *theLayerColorTexture = m_LayerTexture;
+ NVRenderTexture2D *theLayerDepthTexture = m_LayerDepthTexture;
+
+ NVRenderTexture2D *theCurrentTexture = theLayerColorTexture;
+ for (SEffect *theEffect = m_Layer.m_FirstEffect; theEffect;
+ theEffect = theEffect->m_NextEffect) {
+ if (theEffect->m_Flags.IsActive() && m_Camera) {
+ StartProfiling(theEffect->m_ClassName, false);
+
+ NVRenderTexture2D *theRenderedEffect = theEffectSystem.RenderEffect(
+ SEffectRenderArgument(*theEffect, *theCurrentTexture,
+ QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar),
+ theLayerDepthTexture, m_LayerPrepassDepthTexture));
+
+ EndProfiling(theEffect->m_ClassName);
+
+ // If the texture came from rendering a chain of effects, then we don't need it
+ // after this.
+ if (theCurrentTexture != theLayerColorTexture)
+ theResourceManager.Release(*theCurrentTexture);
+
+ theCurrentTexture = theRenderedEffect;
+
+ if (!theRenderedEffect) {
+ QString errorMsg = QObject::tr("Failed to compile \"%1\" effect.\nConsider"
+ " removing it from the presentation.")
+ .arg(theEffect->m_ClassName.c_str());
+ QT3DS_ALWAYS_ASSERT_MESSAGE(errorMsg.toUtf8());
+ break;
+ }
+ }
+ }
+
+ if (m_LayerCachedTexture && m_LayerCachedTexture != m_LayerTexture) {
+ theResourceManager.Release(*m_LayerCachedTexture);
+ m_LayerCachedTexture = NULL;
+ }
+
+ if (theCurrentTexture != m_LayerTexture)
+ m_LayerCachedTexture = theCurrentTexture;
+ }
+
+ inline bool AnyCompletelyNonTransparentObjects(TRenderableObjectList &inObjects)
+ {
+ for (QT3DSU32 idx = 0, end = inObjects.size(); idx < end; ++idx) {
+ if (inObjects[idx]->m_RenderableFlags.IsCompletelyTransparent() == false)
+ return true;
+ }
+ return false;
+ }
+
+ void SLayerRenderData::RunnableRenderToViewport(qt3ds::render::NVRenderFrameBuffer *theFB)
+ {
+ // If we have an effect, an opaque object, or any transparent objects that aren't completely
+ // transparent
+ // or an offscreen renderer or a layer widget texture
+ // Then we can't possible affect the resulting render target.
+ bool needsToRender = m_Layer.m_FirstEffect != NULL || m_OpaqueObjects.empty() == false
+ || AnyCompletelyNonTransparentObjects(m_TransparentObjects) || GetOffscreenRenderer()
+ || m_LayerWidgetTexture || m_BoundingRectColor.hasValue()
+ || m_Layer.m_Background == LayerBackground::Color;
+
+ if (needsToRender == false)
+ return;
+
+ NVRenderContext &theContext(m_Renderer.GetContext());
+ theContext.resetStates();
+
+ NVRenderContextScopedProperty<NVRenderFrameBuffer *> __fbo(
+ theContext, &NVRenderContext::GetRenderTarget, &NVRenderContext::SetRenderTarget);
+ qt3ds::render::NVRenderRect theCurrentViewport = theContext.GetViewport();
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport);
+ NVRenderContextScopedProperty<bool> theScissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled);
+ NVRenderContextScopedProperty<qt3ds::render::NVRenderRect> theScissorRect(
+ theContext, &NVRenderContext::GetScissorRect, &NVRenderContext::SetScissorRect);
+ SLayerRenderPreparationResult &thePrepResult(*m_LayerPrepResult);
+ NVRenderRectF theScreenRect(thePrepResult.GetLayerToPresentationViewport());
+
+ bool blendingEnabled = m_Layer.m_Background != LayerBackground::Unspecified;
+ if (!thePrepResult.m_Flags.ShouldRenderToTexture()) {
+ theContext.SetViewport(
+ m_LayerPrepResult->GetLayerToPresentationViewport().ToIntegerRect());
+ theContext.SetScissorTestEnabled(true);
+ theContext.SetScissorRect(
+ m_LayerPrepResult->GetLayerToPresentationScissorRect().ToIntegerRect());
+ if (m_Layer.m_Background == LayerBackground::Color) {
+ NVRenderContextScopedProperty<QT3DSVec4> __clearColor(
+ theContext, &NVRenderContext::GetClearColor, &NVRenderContext::SetClearColor,
+ m_Layer.m_ClearColor);
+ theContext.Clear(NVRenderClearValues::Color);
+ }
+ RenderToViewport();
+ } else {
+// First, render the layer along with whatever progressive AA is appropriate.
+// The render graph should have taken care of the render to texture step.
+#ifdef QT3DS_CACHED_POST_EFFECT
+ NVRenderTexture2D *theLayerColorTexture =
+ (m_LayerCachedTexture) ? m_LayerCachedTexture : m_LayerTexture;
+#else
+ // Then render all but the last effect
+ IEffectSystem &theEffectSystem(m_Renderer.GetQt3DSContext().GetEffectSystem());
+ IResourceManager &theResourceManager(m_Renderer.GetQt3DSContext().GetResourceManager());
+ // we use the non MSAA buffer for the effect
+ NVRenderTexture2D *theLayerColorTexture = m_LayerTexture;
+ NVRenderTexture2D *theLayerDepthTexture = m_LayerDepthTexture;
+
+ NVRenderTexture2D *theCurrentTexture = theLayerColorTexture;
+ for (SEffect *theEffect = m_Layer.m_FirstEffect;
+ theEffect && theEffect != thePrepResult.m_LastEffect;
+ theEffect = theEffect->m_NextEffect) {
+ if (theEffect->m_Flags.IsActive() && m_Camera) {
+ StartProfiling(theEffect->m_ClassName, false);
+
+ NVRenderTexture2D *theRenderedEffect = theEffectSystem.RenderEffect(
+ SEffectRenderArgument(*theEffect, *theCurrentTexture,
+ QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar),
+ theLayerDepthTexture, m_LayerPrepassDepthTexture));
+
+ EndProfiling(theEffect->m_ClassName);
+
+ // If the texture came from rendering a chain of effects, then we don't need it
+ // after this.
+ if (theCurrentTexture != theLayerColorTexture)
+ theResourceManager.Release(*theCurrentTexture);
+
+ theCurrentTexture = theRenderedEffect;
+ }
+ }
+#endif
+ // Now the last effect or straight to the scene if we have no last effect
+ // There are two cases we need to consider here. The first is when we shouldn't
+ // transform
+ // the result and thus we need to setup an MVP that just maps to the viewport width and
+ // height.
+ // The second is when we are expected to render to the scene using some global
+ // transform.
+ QT3DSMat44 theFinalMVP(QT3DSMat44::createIdentity());
+ SCamera theTempCamera;
+ NVRenderRect theLayerViewport(
+ thePrepResult.GetLayerToPresentationViewport().ToIntegerRect());
+ NVRenderRect theLayerClip(
+ thePrepResult.GetLayerToPresentationScissorRect().ToIntegerRect());
+
+ {
+ QT3DSMat33 ignored;
+ QT3DSMat44 theViewProjection;
+ // We could cache these variables
+ theTempCamera.m_Flags.SetOrthographic(true);
+ theTempCamera.MarkDirty(NodeTransformDirtyFlag::TransformIsDirty);
+ // Move the camera back far enough that we can see everything
+ QT3DSF32 theCameraSetback(10);
+ // Attempt to ensure the layer can never be clipped.
+ theTempCamera.m_Position.z = -theCameraSetback;
+ theTempCamera.m_ClipFar = 2.0f * theCameraSetback;
+ // Render the layer texture to the entire viewport.
+ SCameraGlobalCalculationResult theResult = theTempCamera.CalculateGlobalVariables(
+ theLayerViewport,
+ QT3DSVec2((QT3DSF32)theLayerViewport.m_Width, (QT3DSF32)theLayerViewport.m_Height));
+ theTempCamera.CalculateViewProjectionMatrix(theViewProjection);
+ SNode theTempNode;
+ theFinalMVP = theViewProjection;
+ qt3ds::render::NVRenderBlendFunctionArgument blendFunc;
+ qt3ds::render::NVRenderBlendEquationArgument blendEqu;
+
+ switch (m_Layer.m_BlendType) {
+ case LayerBlendTypes::Screen:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::SrcAlpha, NVRenderDstBlendFunc::One,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One);
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add);
+ break;
+ case LayerBlendTypes::Multiply:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::DstColor, NVRenderDstBlendFunc::Zero,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One);
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add);
+ break;
+ case LayerBlendTypes::Add:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One);
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add);
+ break;
+ case LayerBlendTypes::Subtract:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One);
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::ReverseSubtract,
+ NVRenderBlendEquation::ReverseSubtract);
+ break;
+ case LayerBlendTypes::Overlay:
+ // SW fallback doesn't use blend equation
+ // note blend func is not used here anymore
+ if (theContext.IsAdvancedBlendHwSupported() ||
+ theContext.IsAdvancedBlendHwSupportedKHR())
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Overlay, NVRenderBlendEquation::Overlay);
+ break;
+ case LayerBlendTypes::ColorBurn:
+ // SW fallback doesn't use blend equation
+ // note blend func is not used here anymore
+ if (theContext.IsAdvancedBlendHwSupported() ||
+ theContext.IsAdvancedBlendHwSupportedKHR())
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::ColorBurn, NVRenderBlendEquation::ColorBurn);
+ break;
+ case LayerBlendTypes::ColorDodge:
+ // SW fallback doesn't use blend equation
+ // note blend func is not used here anymore
+ if (theContext.IsAdvancedBlendHwSupported() ||
+ theContext.IsAdvancedBlendHwSupportedKHR())
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::ColorDodge, NVRenderBlendEquation::ColorDodge);
+ break;
+ default:
+ blendFunc = qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha);
+ blendEqu = qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add);
+ break;
+ }
+ theContext.SetBlendFunction(blendFunc);
+ theContext.SetBlendEquation(blendEqu);
+ theContext.SetBlendingEnabled(blendingEnabled);
+ theContext.SetDepthTestEnabled(false);
+ }
+
+ {
+ theContext.SetScissorTestEnabled(true);
+ theContext.SetViewport(theLayerViewport);
+ theContext.SetScissorRect(theLayerClip);
+
+ // Remember the camera we used so we can get a valid pick ray
+ m_SceneCamera = theTempCamera;
+ theContext.SetDepthTestEnabled(false);
+#ifndef QT3DS_CACHED_POST_EFFECT
+ if (thePrepResult.m_LastEffect && m_Camera) {
+ StartProfiling(thePrepResult.m_LastEffect->m_ClassName, false);
+ // inUseLayerMPV is true then we are rendering directly to the scene and thus we
+ // should enable blending
+ // for the final render pass. Else we should leave it.
+ theEffectSystem.RenderEffect(
+ SEffectRenderArgument(*thePrepResult.m_LastEffect, *theCurrentTexture,
+ QT3DSVec2(m_Camera->m_ClipNear, m_Camera->m_ClipFar),
+ theLayerDepthTexture, m_LayerPrepassDepthTexture),
+ theFinalMVP, blendingEnabled);
+ EndProfiling(thePrepResult.m_LastEffect->m_ClassName);
+ // If the texture came from rendering a chain of effects, then we don't need it
+ // after this.
+ if (theCurrentTexture != theLayerColorTexture)
+ theResourceManager.Release(*theCurrentTexture);
+ } else
+#endif
+ {
+ theContext.SetCullingEnabled(false);
+ theContext.SetBlendingEnabled(blendingEnabled);
+ theContext.SetDepthTestEnabled(false);
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ NVScopedRefCounted<NVRenderTexture2D> screenTexture =
+ m_Renderer.GetLayerBlendTexture();
+ NVScopedRefCounted<NVRenderFrameBuffer> blendFB = m_Renderer.GetBlendFB();
+
+ // Layer blending for advanced blending modes if SW fallback is needed
+ // rendering to FBO and blending with separate shader
+ if (screenTexture) {
+ // Blending is enabled only if layer background has been chosen transparent
+ // Layers with advanced blending modes
+ if (blendingEnabled && (m_Layer.m_BlendType == LayerBlendTypes::Overlay ||
+ m_Layer.m_BlendType == LayerBlendTypes::ColorBurn ||
+ m_Layer.m_BlendType == LayerBlendTypes::ColorDodge)) {
+ theContext.SetScissorTestEnabled(false);
+ theContext.SetBlendingEnabled(false);
+
+ // Get part matching to layer from screen texture and
+ // use that for blending
+ qt3ds::render::NVRenderTexture2D *blendBlitTexture;
+ blendBlitTexture = theContext.CreateTexture2D();
+ blendBlitTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0,
+ theLayerViewport.m_Width,
+ theLayerViewport.m_Height,
+ NVRenderTextureFormats::RGBA8);
+ qt3ds::render::NVRenderFrameBuffer *blitFB;
+ blitFB = theContext.CreateFrameBuffer();
+ blitFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer(*blendBlitTexture));
+ blendFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer(*screenTexture));
+ theContext.SetRenderTarget(blitFB);
+ theContext.SetReadTarget(blendFB);
+ theContext.SetReadBuffer(NVReadFaces::Color0);
+ theContext.BlitFramebuffer(theLayerViewport.m_X, theLayerViewport.m_Y,
+ theLayerViewport.m_Width +
+ theLayerViewport.m_X,
+ theLayerViewport.m_Height +
+ theLayerViewport.m_Y,
+ 0, 0,
+ theLayerViewport.m_Width,
+ theLayerViewport.m_Height,
+ NVRenderClearValues::Color,
+ NVRenderTextureMagnifyingOp::Nearest);
+
+ qt3ds::render::NVRenderTexture2D *blendResultTexture;
+ blendResultTexture = theContext.CreateTexture2D();
+ blendResultTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0,
+ theLayerViewport.m_Width,
+ theLayerViewport.m_Height,
+ NVRenderTextureFormats::RGBA8);
+ qt3ds::render::NVRenderFrameBuffer *resultFB;
+ resultFB = theContext.CreateFrameBuffer();
+ resultFB->Attach(NVRenderFrameBufferAttachments::Color0,
+ NVRenderTextureOrRenderBuffer(*blendResultTexture));
+ theContext.SetRenderTarget(resultFB);
+
+ AdvancedBlendModes::Enum advancedMode;
+ switch (m_Layer.m_BlendType) {
+ case LayerBlendTypes::Overlay:
+ advancedMode = AdvancedBlendModes::Overlay;
+ break;
+ case LayerBlendTypes::ColorBurn:
+ advancedMode = AdvancedBlendModes::ColorBurn;
+ break;
+ case LayerBlendTypes::ColorDodge:
+ advancedMode = AdvancedBlendModes::ColorDodge;
+ break;
+ default:
+ advancedMode = AdvancedBlendModes::None;
+ break;
+ }
+
+ theContext.SetViewport(NVRenderRect(0, 0, theLayerViewport.m_Width,
+ theLayerViewport.m_Height));
+ BlendAdvancedEquationSwFallback(theLayerColorTexture, blendBlitTexture,
+ advancedMode);
+ blitFB->release();
+ // save blending result to screen texture for use with other layers
+ theContext.SetViewport(theLayerViewport);
+ theContext.SetRenderTarget(blendFB);
+ m_Renderer.RenderQuad(QT3DSVec2((QT3DSF32)theLayerViewport.m_Width,
+ (QT3DSF32)theLayerViewport.m_Height),
+ theFinalMVP, *blendResultTexture);
+ // render the blended result
+ theContext.SetRenderTarget(theFB);
+ theContext.SetScissorTestEnabled(true);
+ m_Renderer.RenderQuad(QT3DSVec2((QT3DSF32)theLayerViewport.m_Width,
+ (QT3DSF32)theLayerViewport.m_Height),
+ theFinalMVP, *blendResultTexture);
+ resultFB->release();
+ } else {
+ // Layers with normal blending modes
+ // save result for future use
+ theContext.SetViewport(theLayerViewport);
+ theContext.SetScissorTestEnabled(false);
+ theContext.SetBlendingEnabled(true);
+ theContext.SetRenderTarget(blendFB);
+ m_Renderer.RenderQuad(QT3DSVec2((QT3DSF32)theLayerViewport.m_Width,
+ (QT3DSF32)theLayerViewport.m_Height),
+ theFinalMVP, *theLayerColorTexture);
+ theContext.SetRenderTarget(theFB);
+ theContext.SetScissorTestEnabled(true);
+ theContext.SetViewport(theCurrentViewport);
+ m_Renderer.RenderQuad(QT3DSVec2((QT3DSF32)theLayerViewport.m_Width,
+ (QT3DSF32)theLayerViewport.m_Height),
+ theFinalMVP, *theLayerColorTexture);
+ }
+ } else {
+ // No advanced blending SW fallback needed
+ m_Renderer.RenderQuad(QT3DSVec2((QT3DSF32)theLayerViewport.m_Width,
+ (QT3DSF32)theLayerViewport.m_Height),
+ theFinalMVP, *theLayerColorTexture);
+ }
+#else
+ m_Renderer.RenderQuad(QT3DSVec2((QT3DSF32)theLayerViewport.m_Width,
+ (QT3DSF32)theLayerViewport.m_Height),
+ theFinalMVP, *theLayerColorTexture);
+#endif
+ }
+ if (m_LayerWidgetTexture) {
+ theContext.SetBlendingEnabled(false);
+ m_Renderer.SetupWidgetLayer();
+ SLayerRenderPreparationResult &thePrepResult(*m_LayerPrepResult);
+ NVRenderRectF thePresRect(thePrepResult.GetPresentationViewport());
+ NVRenderRectF theLayerRect(thePrepResult.GetLayerToPresentationViewport());
+
+ // Ensure we remove any offsetting in the layer rect that was caused simply by
+ // the
+ // presentation rect offsetting but then use a new rect.
+ NVRenderRectF theWidgetLayerRect(theLayerRect.m_X - thePresRect.m_X,
+ theLayerRect.m_Y - thePresRect.m_Y,
+ theLayerRect.m_Width, theLayerRect.m_Height);
+ theContext.SetScissorTestEnabled(false);
+ theContext.SetViewport(theWidgetLayerRect.ToIntegerRect());
+ m_Renderer.RenderQuad(
+ QT3DSVec2((QT3DSF32)theLayerViewport.m_Width, (QT3DSF32)theLayerViewport.m_Height),
+ theFinalMVP, *m_LayerWidgetTexture);
+ }
+ }
+ } // End offscreen render code.
+
+ if (m_BoundingRectColor.hasValue()) {
+ NVRenderContextScopedProperty<NVRenderRect> __viewport(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport);
+ NVRenderContextScopedProperty<bool> theScissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled);
+ NVRenderContextScopedProperty<qt3ds::render::NVRenderRect> theScissorRect(
+ theContext, &NVRenderContext::GetScissorRect, &NVRenderContext::SetScissorRect);
+ m_Renderer.SetupWidgetLayer();
+ // Setup a simple viewport to render to the entire presentation viewport.
+ theContext.SetViewport(
+ NVRenderRect(0, 0, (QT3DSU32)thePrepResult.GetPresentationViewport().m_Width,
+ (QT3DSU32)thePrepResult.GetPresentationViewport().m_Height));
+
+ NVRenderRectF thePresRect(thePrepResult.GetPresentationViewport());
+
+ // Remove any offsetting from the presentation rect since the widget layer is a
+ // stand-alone fbo.
+ NVRenderRectF theWidgetScreenRect(theScreenRect.m_X - thePresRect.m_X,
+ theScreenRect.m_Y - thePresRect.m_Y,
+ theScreenRect.m_Width, theScreenRect.m_Height);
+ theContext.SetScissorTestEnabled(false);
+ m_Renderer.DrawScreenRect(theWidgetScreenRect, *m_BoundingRectColor);
+ }
+ theContext.SetBlendFunction(qt3ds::render::NVRenderBlendFunctionArgument(
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::OneMinusSrcAlpha));
+ theContext.SetBlendEquation(qt3ds::render::NVRenderBlendEquationArgument(
+ NVRenderBlendEquation::Add, NVRenderBlendEquation::Add));
+ }
+
+#define RENDER_FRAME_NEW(type) QT3DS_NEW(m_Renderer.GetPerFrameAllocator(), type)
+
+ void SLayerRenderData::AddLayerRenderStep()
+ {
+ SStackPerfTimer __perfTimer(m_Renderer.GetQt3DSContext().GetPerfTimer(),
+ "SLayerRenderData::AddLayerRenderStep");
+ QT3DS_ASSERT(m_Camera);
+ if (!m_Camera)
+ return;
+
+ IRenderList &theGraph(m_Renderer.GetQt3DSContext().GetRenderList());
+
+ qt3ds::render::NVRenderRect theCurrentViewport = theGraph.GetViewport();
+ if (!m_LayerPrepResult.hasValue())
+ PrepareForRender(
+ QSize(theCurrentViewport.m_Width, theCurrentViewport.m_Height));
+ }
+
+ void SLayerRenderData::PrepareForRender()
+ {
+ // When we render to the scene itself (as opposed to an offscreen buffer somewhere)
+ // then we use the MVP of the layer somewhat.
+ NVRenderRect theViewport = m_Renderer.GetQt3DSContext().GetRenderList().GetViewport();
+ PrepareForRender(
+ QSize((QT3DSU32)theViewport.m_Width, (QT3DSU32)theViewport.m_Height));
+ }
+
+ void SLayerRenderData::ResetForFrame()
+ {
+ SLayerRenderPreparationData::ResetForFrame();
+ m_BoundingRectColor.setEmpty();
+ }
+
+ void SLayerRenderData::PrepareAndRender(const QT3DSMat44 &inViewProjection)
+ {
+ TRenderableObjectList theTransparentObjects(m_TransparentObjects);
+ TRenderableObjectList theOpaqueObjects(m_OpaqueObjects);
+ theTransparentObjects.clear();
+ theOpaqueObjects.clear();
+ m_ModelContexts.clear();
+ SLayerRenderPreparationResultFlags theFlags;
+ PrepareRenderablesForRender(inViewProjection, Empty(), 1.0, theFlags);
+ RenderDepthPass(false);
+ Render();
+ }
+
+ struct SLayerRenderToTextureRunnable : public IRenderTask
+ {
+ SLayerRenderData &m_Data;
+ SLayerRenderToTextureRunnable(SLayerRenderData &d)
+ : m_Data(d)
+ {
+ }
+
+ void Run() override { m_Data.RenderToTexture(); }
+ };
+
+ static inline OffscreenRendererDepthValues::Enum
+ GetOffscreenRendererDepthValue(NVRenderTextureFormats::Enum inBufferFormat)
+ {
+ switch (inBufferFormat) {
+ case NVRenderTextureFormats::Depth32:
+ return OffscreenRendererDepthValues::Depth32;
+ case NVRenderTextureFormats::Depth24:
+ return OffscreenRendererDepthValues::Depth24;
+ case NVRenderTextureFormats::Depth24Stencil8:
+ return OffscreenRendererDepthValues::Depth24;
+ default:
+ QT3DS_ASSERT(false); // fallthrough intentional
+ case NVRenderTextureFormats::Depth16:
+ return OffscreenRendererDepthValues::Depth16;
+ }
+ }
+
+ SOffscreenRendererEnvironment SLayerRenderData::CreateOffscreenRenderEnvironment()
+ {
+ OffscreenRendererDepthValues::Enum theOffscreenDepth(
+ GetOffscreenRendererDepthValue(GetDepthBufferFormat()));
+ NVRenderRect theViewport = m_Renderer.GetQt3DSContext().GetRenderList().GetViewport();
+ return SOffscreenRendererEnvironment(theViewport.m_Width, theViewport.m_Height,
+ NVRenderTextureFormats::RGBA8, theOffscreenDepth,
+ false, AAModeValues::NoAA);
+ }
+
+ IRenderTask &SLayerRenderData::CreateRenderToTextureRunnable()
+ {
+ return *RENDER_FRAME_NEW(SLayerRenderToTextureRunnable)(*this);
+ }
+
+ void SLayerRenderData::addRef() { atomicIncrement(&mRefCount); }
+
+ void SLayerRenderData::release() { QT3DS_IMPLEMENT_REF_COUNT_RELEASE(m_Allocator); }
+}
+}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h
new file mode 100644
index 0000000..4e237b0
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderData.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDERER_IMPL_LAYER_RENDER_DATA_H
+#define QT3DS_RENDERER_IMPL_LAYER_RENDER_DATA_H
+#include "Qt3DSRender.h"
+#include "Qt3DSRendererImplLayerRenderPreparationData.h"
+#include "Qt3DSRenderResourceBufferObjects.h"
+
+namespace qt3ds {
+namespace render {
+
+struct AdvancedBlendModes
+{
+ enum Enum {
+ None = 0,
+ Overlay,
+ ColorBurn,
+ ColorDodge
+ };
+};
+ struct QT3DS_AUTOTEST_EXPORT SLayerRenderData : public SLayerRenderPreparationData
+ {
+
+ // Layers can be rendered offscreen for many reasons; effects, progressive aa,
+ // or just because a flag forces it. If they are rendered offscreen we can then
+ // cache the result so we don't render the layer again if it isn't dirty.
+ CResourceTexture2D m_LayerTexture;
+ CResourceTexture2D m_TemporalAATexture;
+ // Sometimes we need to render our depth buffer to a depth texture.
+ CResourceTexture2D m_LayerDepthTexture;
+ CResourceTexture2D m_LayerPrepassDepthTexture;
+ CResourceTexture2D m_LayerWidgetTexture;
+ CResourceTexture2D m_LayerSsaoTexture;
+ // if we render multisampled we need resolve buffers
+ CResourceTexture2D m_LayerMultisampleTexture;
+ CResourceTexture2D m_LayerMultisamplePrepassDepthTexture;
+ CResourceTexture2D m_LayerMultisampleWidgetTexture;
+ // the texture contains the render result inclusive post effects
+ NVRenderTexture2D *m_LayerCachedTexture;
+
+ NVRenderTexture2D *m_AdvancedBlendDrawTexture;
+ NVRenderTexture2D *m_AdvancedBlendBlendTexture;
+ qt3ds::render::NVRenderFrameBuffer *m_AdvancedModeDrawFB;
+ qt3ds::render::NVRenderFrameBuffer *m_AdvancedModeBlendFB;
+
+ // True if this layer was rendered offscreen.
+ // If this object has no value then this layer wasn't rendered at all.
+ SOffscreenRendererEnvironment m_LastOffscreenRenderEnvironment;
+
+ // GPU profiler per layer
+ NVScopedRefCounted<IRenderProfiler> m_LayerProfilerGpu;
+
+ SCamera m_SceneCamera;
+ QT3DSVec2 m_SceneDimensions;
+
+ // ProgressiveAA algorithm details.
+ QT3DSU32 m_ProgressiveAAPassIndex;
+ // Increments every frame regardless to provide appropriate jittering
+ QT3DSU32 m_TemporalAAPassIndex;
+ // Ensures we don't stop on an in-between frame; we will run two frames after the dirty flag
+ // is clear.
+ QT3DSU32 m_NonDirtyTemporalAAPassIndex;
+ QT3DSF32 m_TextScale;
+
+ volatile QT3DSI32 mRefCount;
+ Option<QT3DSVec3> m_BoundingRectColor;
+ NVRenderTextureFormats::Enum m_DepthBufferFormat;
+
+ QSize m_previousDimensions;
+
+ SLayerRenderData(SLayer &inLayer, Qt3DSRendererImpl &inRenderer);
+
+ virtual ~SLayerRenderData();
+
+ void PrepareForRender();
+
+ // Internal Call
+ void PrepareForRender(const QSize &inViewportDimensions) override;
+
+ NVRenderTextureFormats::Enum GetDepthBufferFormat();
+ NVRenderFrameBufferAttachments::Enum
+ GetFramebufferDepthAttachmentFormat(NVRenderTextureFormats::Enum depthFormat);
+
+ // Render this layer assuming viewport and RT are setup. Just renders exactly this item
+ // no effects.
+ void RenderDepthPass(bool inEnableTransparentDepthWrite = false);
+ void RenderAoPass();
+ void RenderFakeDepthMapPass(NVRenderTexture2D *theDepthTex,
+ NVRenderTextureCube *theDepthCube);
+ void RenderShadowMapPass(CResourceFrameBuffer *theFB);
+ void RenderShadowCubeBlurPass(CResourceFrameBuffer *theFB, NVRenderTextureCube *target0,
+ NVRenderTextureCube *target1, QT3DSF32 filterSz, QT3DSF32 clipFar);
+ void RenderShadowMapBlurPass(CResourceFrameBuffer *theFB, NVRenderTexture2D *target0,
+ NVRenderTexture2D *target1, QT3DSF32 filterSz, QT3DSF32 clipFar);
+
+ void Render(CResourceFrameBuffer *theFB = NULL);
+ void ResetForFrame() override;
+
+ void CreateGpuProfiler();
+ void StartProfiling(CRegisteredString &nameID, bool sync);
+ void EndProfiling(CRegisteredString &nameID);
+ void StartProfiling(const char *nameID, bool sync);
+ void EndProfiling(const char *nameID);
+ void AddVertexCount(QT3DSU32 count);
+
+ void RenderToViewport();
+ // Render this layer's data to a texture. Required if we have any effects,
+ // prog AA, or if forced.
+ void RenderToTexture();
+
+ void ApplyLayerPostEffects();
+
+ void RunnableRenderToViewport(qt3ds::render::NVRenderFrameBuffer *theFB);
+
+ void AddLayerRenderStep();
+
+ void RenderRenderWidgets();
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ void BlendAdvancedEquationSwFallback(NVRenderTexture2D *drawTexture,
+ NVRenderTexture2D *m_LayerTexture,
+ AdvancedBlendModes::Enum blendMode);
+#endif
+ // test method to render this layer to a given view projection without running the entire
+ // layer setup system. This assumes the client has setup the viewport, scissor, and render
+ // target
+ // the way they want them.
+ void PrepareAndRender(const QT3DSMat44 &inViewProjection);
+
+ SOffscreenRendererEnvironment CreateOffscreenRenderEnvironment() override;
+ IRenderTask &CreateRenderToTextureRunnable() override;
+
+ void addRef();
+ void release();
+
+ protected:
+ // Used for both the normal passes and the depth pass.
+ // When doing the depth pass, we disable blending completely because it does not really make
+ // sense
+ // to write blend equations into
+ void RunRenderPass(TRenderRenderableFunction renderFn, bool inEnableBlending,
+ bool inEnableDepthWrite, bool inEnableTransparentDepthWrite,
+ QT3DSU32 indexLight, const SCamera &inCamera,
+ CResourceFrameBuffer *theFB = NULL);
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ //Functions for advanced blending mode fallback
+ void SetupDrawFB(bool depthEnabled);
+ void BlendAdvancedToFB(DefaultMaterialBlendMode::Enum blendMode, bool depthEnabled,
+ CResourceFrameBuffer *theFB);
+#endif
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp
new file mode 100644
index 0000000..07ee513
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.cpp
@@ -0,0 +1,261 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRendererImplLayerRenderHelper.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSTextRenderer.h"
+
+using namespace qt3ds::render;
+
+namespace {
+// left/top
+QT3DSF32 GetMinValue(QT3DSF32 start, QT3DSF32 width, QT3DSF32 value, LayerUnitTypes::Enum units)
+{
+ if (units == LayerUnitTypes::Pixels)
+ return start + value;
+
+ return start + (value * width / 100.0f);
+}
+
+// width/height
+QT3DSF32 GetValueLen(QT3DSF32 width, QT3DSF32 value, LayerUnitTypes::Enum units)
+{
+ if (units == LayerUnitTypes::Pixels)
+ return value;
+
+ return width * value / 100.0f;
+}
+
+// right/bottom
+QT3DSF32 GetMaxValue(QT3DSF32 start, QT3DSF32 width, QT3DSF32 value, LayerUnitTypes::Enum units)
+{
+ if (units == LayerUnitTypes::Pixels)
+ return start + width - value;
+
+ return start + width - (value * width / 100.0f);
+}
+
+QT3DSVec2 ToRectRelativeCoords(const QT3DSVec2 &inCoords, const NVRenderRectF &inRect)
+{
+ return QT3DSVec2(inCoords.x - inRect.m_X, inCoords.y - inRect.m_Y);
+}
+}
+
+SLayerRenderHelper::SLayerRenderHelper()
+ : m_Layer(NULL)
+ , m_Camera(NULL)
+ , m_Offscreen(false)
+{
+}
+
+SLayerRenderHelper::SLayerRenderHelper(const NVRenderRectF &inPresentationViewport,
+ const NVRenderRectF &inPresentationScissor,
+ const QT3DSVec2 &inPresentationDesignDimensions,
+ SLayer &inLayer, bool inOffscreen,
+ qt3ds::render::ScaleModes::Enum inScaleMode,
+ qt3ds::QT3DSVec2 inScaleFactor)
+ : m_PresentationViewport(inPresentationViewport)
+ , m_PresentationScissor(inPresentationScissor)
+ , m_PresentationDesignDimensions(inPresentationDesignDimensions)
+ , m_Layer(&inLayer)
+ , m_Offscreen(inOffscreen)
+ , m_ScaleMode(inScaleMode)
+ , m_ScaleFactor(inScaleFactor)
+{
+ {
+ QT3DSF32 left = m_Layer->m_Left;
+ QT3DSF32 right = m_Layer->m_Right;
+ QT3DSF32 width = m_Layer->m_Width;
+
+ if (m_ScaleMode == qt3ds::render::ScaleModes::FitSelected) {
+ if (m_Layer->m_LeftUnits == LayerUnitTypes::Pixels)
+ left *= m_ScaleFactor.x;
+
+ if (m_Layer->m_RightUnits == LayerUnitTypes::Pixels)
+ right *= m_ScaleFactor.x;
+
+ if (m_Layer->m_WidthUnits == LayerUnitTypes::Pixels)
+ width *= m_ScaleFactor.x;
+ }
+
+ QT3DSF32 horzMin = GetMinValue(inPresentationViewport.m_X, inPresentationViewport.m_Width,
+ left, m_Layer->m_LeftUnits);
+ QT3DSF32 horzWidth = GetValueLen(inPresentationViewport.m_Width, width, m_Layer->m_WidthUnits);
+ QT3DSF32 horzMax = GetMaxValue(inPresentationViewport.m_X, inPresentationViewport.m_Width,
+ right, m_Layer->m_RightUnits);
+
+ switch (inLayer.m_HorizontalFieldValues) {
+ case HorizontalFieldValues::LeftWidth:
+ m_Viewport.m_X = horzMin;
+ m_Viewport.m_Width = horzWidth;
+ break;
+ case HorizontalFieldValues::LeftRight:
+ m_Viewport.m_X = horzMin;
+ m_Viewport.m_Width = horzMax - horzMin;
+ break;
+ case HorizontalFieldValues::WidthRight:
+ m_Viewport.m_Width = horzWidth;
+ m_Viewport.m_X = horzMax - horzWidth;
+ break;
+ }
+ }
+ {
+ QT3DSF32 top = m_Layer->m_Top;
+ QT3DSF32 bottom = m_Layer->m_Bottom;
+ QT3DSF32 height = m_Layer->m_Height;
+
+ if (m_ScaleMode == qt3ds::render::ScaleModes::FitSelected) {
+
+ if (m_Layer->m_TopUnits == LayerUnitTypes::Pixels)
+ top *= m_ScaleFactor.y;
+
+ if (m_Layer->m_BottomUnits == LayerUnitTypes::Pixels)
+ bottom *= m_ScaleFactor.y;
+
+ if (m_Layer->m_HeightUnits == LayerUnitTypes::Pixels)
+ height *= m_ScaleFactor.y;
+ }
+
+ QT3DSF32 vertMin = GetMinValue(inPresentationViewport.m_Y, inPresentationViewport.m_Height,
+ bottom, m_Layer->m_BottomUnits);
+ QT3DSF32 vertWidth =
+ GetValueLen(inPresentationViewport.m_Height, height, m_Layer->m_HeightUnits);
+ QT3DSF32 vertMax = GetMaxValue(inPresentationViewport.m_Y, inPresentationViewport.m_Height,
+ top, m_Layer->m_TopUnits);
+
+ switch (inLayer.m_VerticalFieldValues) {
+ case VerticalFieldValues::HeightBottom:
+ m_Viewport.m_Y = vertMin;
+ m_Viewport.m_Height = vertWidth;
+ break;
+ case VerticalFieldValues::TopBottom:
+ m_Viewport.m_Y = vertMin;
+ m_Viewport.m_Height = vertMax - vertMin;
+ break;
+ case VerticalFieldValues::TopHeight:
+ m_Viewport.m_Height = vertWidth;
+ m_Viewport.m_Y = vertMax - vertWidth;
+ break;
+ }
+ }
+
+ m_Viewport.m_Width = NVMax(1.0f, m_Viewport.m_Width);
+ m_Viewport.m_Height = NVMax(1.0f, m_Viewport.m_Height);
+ // Now force the viewport to be a multiple of four in width and height. This is because
+ // when rendering to a texture we have to respect this and not forcing it causes scaling issues
+ // that are noticeable especially in situations where customers are using text and such.
+ QT3DSF32 originalWidth = m_Viewport.m_Width;
+ QT3DSF32 originalHeight = m_Viewport.m_Height;
+
+ m_Viewport.m_Width = (QT3DSF32)ITextRenderer::NextMultipleOf4((QT3DSU32)m_Viewport.m_Width);
+ m_Viewport.m_Height = (QT3DSF32)ITextRenderer::NextMultipleOf4((QT3DSU32)m_Viewport.m_Height);
+
+ // Now fudge the offsets to account for this slight difference
+ m_Viewport.m_X += (originalWidth - m_Viewport.m_Width) / 2.0f;
+ m_Viewport.m_Y += (originalHeight - m_Viewport.m_Height) / 2.0f;
+
+ m_Scissor = m_Viewport;
+ m_Scissor.EnsureInBounds(inPresentationScissor);
+ QT3DS_ASSERT(m_Scissor.m_Width >= 0.0f);
+ QT3DS_ASSERT(m_Scissor.m_Height >= 0.0f);
+}
+
+// This is the viewport the camera will use to setup the projection.
+NVRenderRectF SLayerRenderHelper::GetLayerRenderViewport() const
+{
+ if (m_Offscreen)
+ return NVRenderRectF(0, 0, m_Viewport.m_Width, (QT3DSF32)m_Viewport.m_Height);
+ else
+ return m_Viewport;
+}
+
+QSize SLayerRenderHelper::GetTextureDimensions() const
+{
+ QT3DSU32 width = (QT3DSU32)m_Viewport.m_Width;
+ QT3DSU32 height = (QT3DSU32)m_Viewport.m_Height;
+ return QSize(ITextRenderer::NextMultipleOf4(width),
+ ITextRenderer::NextMultipleOf4(height));
+}
+
+SCameraGlobalCalculationResult SLayerRenderHelper::SetupCameraForRender(SCamera &inCamera)
+{
+ m_Camera = &inCamera;
+ NVRenderRectF rect = GetLayerRenderViewport();
+ if (m_ScaleMode == ScaleModes::FitSelected) {
+ rect.m_Width =
+ (QT3DSF32)(ITextRenderer::NextMultipleOf4((QT3DSU32)(rect.m_Width / m_ScaleFactor.x)));
+ rect.m_Height =
+ (QT3DSF32)(ITextRenderer::NextMultipleOf4((QT3DSU32)(rect.m_Height / m_ScaleFactor.y)));
+ }
+ return m_Camera->CalculateGlobalVariables(rect, m_PresentationDesignDimensions);
+}
+
+Option<QT3DSVec2> SLayerRenderHelper::GetLayerMouseCoords(const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inWindowDimensions,
+ bool inForceIntersect) const
+{
+ // First invert the y so we are dealing with numbers in a normal coordinate space.
+ // Second, move into our layer's coordinate space
+ QT3DSVec2 correctCoords(inMouseCoords.x, inWindowDimensions.y - inMouseCoords.y);
+ QT3DSVec2 theLocalMouse = m_Viewport.ToRectRelative(correctCoords);
+
+ QT3DSF32 theRenderRectWidth = m_Viewport.m_Width;
+ QT3DSF32 theRenderRectHeight = m_Viewport.m_Height;
+ // Crop the mouse to the rect. Apply no further translations.
+ if (inForceIntersect == false
+ && (theLocalMouse.x < 0.0f || theLocalMouse.x >= theRenderRectWidth
+ || theLocalMouse.y < 0.0f || theLocalMouse.y >= theRenderRectHeight)) {
+ return Empty();
+ }
+ return theLocalMouse;
+}
+
+Option<SRay> SLayerRenderHelper::GetPickRay(const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inWindowDimensions,
+ bool inForceIntersect,
+ bool sceneCameraView) const
+{
+ if (m_Camera == NULL)
+ return Empty();
+ Option<QT3DSVec2> theCoords(
+ GetLayerMouseCoords(inMouseCoords, inWindowDimensions, inForceIntersect));
+ if (theCoords.hasValue()) {
+ // The cameras projection is different if we are onscreen vs. offscreen.
+ // When offscreen, we need to move the mouse coordinates into a local space
+ // to the layer.
+ return m_Camera->Unproject(*theCoords, m_Viewport, m_PresentationDesignDimensions,
+ sceneCameraView);
+ }
+ return Empty();
+}
+
+bool SLayerRenderHelper::IsLayerVisible() const
+{
+ return m_Scissor.m_Height >= 2.0f && m_Scissor.m_Width >= 2.0f;
+}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h
new file mode 100644
index 0000000..616ebe1
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderHelper.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSVec2.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderContextCore.h"
+
+namespace qt3ds {
+namespace render {
+
+ /** An independent, testable entity to encapsulate taking at least:
+ * layer, current viewport rect, current scissor rect, presentation design dimensions
+ * and producing a set of rectangles:
+ * layer viewport rect (inside viewport rect and calculated using outer viewport rect info)
+ * layer scissor rect (inside current scissor rect)
+ * layer camera rect (may be the viewport rect)
+ *
+ * In the case where we have to render offscreen for this layer then we need to handle produce
+ * a set of texture dimensions and the layer camera rect ends up being same size but with no
+ *offsets.
+ *
+ * This object should handle part of any translation from screenspace to global space.
+ * I am using language level access control on this object because it needs specific
+ * interface design that will enable future modifications.
+ */
+ struct SLayerRenderHelper
+ {
+ private:
+ NVRenderRectF m_PresentationViewport;
+ NVRenderRectF m_PresentationScissor;
+ QT3DSVec2 m_PresentationDesignDimensions;
+ SLayer *m_Layer;
+ SCamera *m_Camera;
+ bool m_Offscreen;
+
+ NVRenderRectF m_Viewport;
+ NVRenderRectF m_Scissor;
+
+ ScaleModes::Enum m_ScaleMode;
+ QT3DSVec2 m_ScaleFactor;
+
+ public:
+ SLayerRenderHelper();
+
+ SLayerRenderHelper(const NVRenderRectF &inPresentationViewport,
+ const NVRenderRectF &inPresentationScissor,
+ const QT3DSVec2 &inPresentationDesignDimensions, SLayer &inLayer,
+ bool inOffscreen, qt3ds::render::ScaleModes::Enum inScaleMode,
+ qt3ds::QT3DSVec2 inScaleFactor);
+
+ NVRenderRectF GetPresentationViewport() const { return m_PresentationViewport; }
+ NVRenderRectF GetPresentationScissor() const { return m_PresentationScissor; }
+ QT3DSVec2 GetPresentationDesignDimensions() const { return m_PresentationDesignDimensions; }
+ SLayer *GetLayer() const { return m_Layer; }
+ SCamera *GetCamera() const { return m_Camera; }
+ bool IsOffscreen() const { return m_Offscreen; }
+
+ // Does not differ whether offscreen or not, simply states how this layer maps to the
+ // presentation
+ NVRenderRectF GetLayerToPresentationViewport() const { return m_Viewport; }
+ // Does not differ whether offscreen or not, scissor rect of how this layer maps to
+ // presentation.
+ NVRenderRectF GetLayerToPresentationScissorRect() const { return m_Scissor; }
+
+ QSize GetTextureDimensions() const;
+
+ SCameraGlobalCalculationResult SetupCameraForRender(SCamera &inCamera);
+
+ Option<QT3DSVec2> GetLayerMouseCoords(const QT3DSVec2 &inMouseCoords,
+ const QT3DSVec2 &inWindowDimensions,
+ bool inForceIntersect) const;
+
+ Option<SRay> GetPickRay(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inWindowDimensions,
+ bool inForceIntersect, bool sceneCameraView = false) const;
+
+ // Checks the various viewports and determines if the layer is visible or not.
+ bool IsLayerVisible() const;
+
+ private:
+ // Viewport used when actually rendering. In the case where this is an offscreen item then
+ // it may be
+ // different than the layer to presentation viewport.
+ NVRenderRectF GetLayerRenderViewport() const;
+ };
+}
+}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
new file mode 100644
index 0000000..8afa3c0
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.cpp
@@ -0,0 +1,1477 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderer.h"
+#include "Qt3DSRendererImpl.h"
+#include "Qt3DSRenderLayer.h"
+#include "Qt3DSRenderEffect.h"
+#include "EASTL/sort.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderCamera.h"
+#include "Qt3DSRenderScene.h"
+#include "Qt3DSRenderPresentation.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "Qt3DSTextRenderer.h"
+#include "Qt3DSRenderEffectSystem.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "Qt3DSOffscreenRenderKey.h"
+#include "Qt3DSRenderPlugin.h"
+#include "Qt3DSRenderPluginGraphObject.h"
+#include "Qt3DSRenderResourceBufferObjects.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/AutoDeallocatorAllocator.h"
+#include "Qt3DSRenderMaterialHelpers.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderCustomMaterialSystem.h"
+#include "Qt3DSRenderTextTextureCache.h"
+#include "Qt3DSRenderTextTextureAtlas.h"
+#include "Qt3DSRenderRenderList.h"
+#include "Qt3DSRenderPath.h"
+#include "Qt3DSRenderPathManager.h"
+
+#ifdef _WIN32
+#pragma warning(disable : 4355)
+#endif
+namespace qt3ds {
+namespace render {
+ using eastl::reverse;
+ using eastl::stable_sort;
+ using qt3ds::render::NVRenderContextScopedProperty;
+ using qt3ds::QT3DSVec2;
+
+ namespace {
+ void MaybeQueueNodeForRender(SNode &inNode, nvvector<SRenderableNodeEntry> &outRenderables,
+ nvvector<SNode *> &outCamerasAndLights, QT3DSU32 &ioDFSIndex)
+ {
+ ++ioDFSIndex;
+ inNode.m_DFSIndex = ioDFSIndex;
+ if (GraphObjectTypes::IsRenderableType(inNode.m_Type))
+ outRenderables.push_back(inNode);
+ else if (GraphObjectTypes::IsLightCameraType(inNode.m_Type))
+ outCamerasAndLights.push_back(&inNode);
+
+ for (SNode *theChild = inNode.m_FirstChild; theChild != NULL;
+ theChild = theChild->m_NextSibling)
+ MaybeQueueNodeForRender(*theChild, outRenderables, outCamerasAndLights, ioDFSIndex);
+ }
+
+ bool HasValidLightProbe(SImage *inLightProbeImage)
+ {
+ return inLightProbeImage && inLightProbeImage->m_TextureData.m_Texture;
+ }
+ }
+
+ SDefaultMaterialPreparationResult::SDefaultMaterialPreparationResult(
+ SShaderDefaultMaterialKey inKey)
+ : m_FirstImage(NULL)
+ , m_Opacity(1.0f)
+ , m_MaterialKey(inKey)
+ , m_Dirty(false)
+ {
+ }
+
+#define MAX_AA_LEVELS 8
+
+ SLayerRenderPreparationData::SLayerRenderPreparationData(SLayer &inLayer,
+ Qt3DSRendererImpl &inRenderer)
+ : m_Layer(inLayer)
+ , m_Renderer(inRenderer)
+ , m_Allocator(inRenderer.GetContext().GetAllocator())
+ , m_RenderableNodeLightEntryPool(
+ ForwardingAllocator(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_RenderableNodes"))
+ , m_RenderableNodes(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_RenderableNodes")
+ , m_LightToNodeMap(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_LightToNodeMap")
+ , m_CamerasAndLights(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_CamerasAndLights")
+ , m_Camera(NULL)
+ , m_Lights(inRenderer.GetContext().GetAllocator(), "SLayerRenderPreparationData::m_Lights")
+ , m_OpaqueObjects(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_OpaqueObjects")
+ , m_TransparentObjects(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_TransparentObjects")
+ , m_RenderedOpaqueObjects(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_RenderedOpaqueObjects")
+ , m_RenderedTransparentObjects(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_RenderedTransparentObjects")
+ , m_IRenderWidgets(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_IRenderWidgets")
+ , m_SourceLightDirections(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_SourceLightDirections")
+ , m_LightDirections(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_LightDirections")
+ , m_ModelContexts(inRenderer.GetContext().GetAllocator(),
+ "SLayerRenderPreparationData::m_ModelContexts")
+ , m_CGLightingFeatureName(
+ inRenderer.GetContext().GetStringTable().RegisterStr("QT3DS_ENABLE_CG_LIGHTING"))
+ , m_FeaturesDirty(true)
+ , m_FeatureSetHash(0)
+ , m_TooManyLightsError(false)
+ {
+ }
+
+ SLayerRenderPreparationData::~SLayerRenderPreparationData() {}
+
+ bool SLayerRenderPreparationData::NeedsWidgetTexture() const
+ {
+ return m_IRenderWidgets.size() > 0;
+ }
+
+ void SLayerRenderPreparationData::SetShaderFeature(CRegisteredString theStr, bool inValue)
+ {
+ SShaderPreprocessorFeature item(theStr, inValue);
+ eastl::vector<SShaderPreprocessorFeature>::iterator iter = m_Features.begin(),
+ end = m_Features.end();
+
+ // empty loop intentional.
+ for (; iter != end && ((iter->m_Name == theStr) == false); ++iter)
+ ;
+
+ if (iter != end) {
+ if (iter->m_Enabled != inValue) {
+ iter->m_Enabled = inValue;
+ m_FeaturesDirty = true;
+ m_FeatureSetHash = 0;
+ }
+ } else {
+ m_Features.push_back(item);
+ m_FeaturesDirty = true;
+ m_FeatureSetHash = 0;
+ }
+ }
+
+ void SLayerRenderPreparationData::SetShaderFeature(const char *inName, bool inValue)
+ {
+ CRegisteredString theStr(m_Renderer.GetQt3DSContext().GetStringTable().RegisterStr(inName));
+ SetShaderFeature(theStr, inValue);
+ }
+
+ NVConstDataRef<SShaderPreprocessorFeature> SLayerRenderPreparationData::GetShaderFeatureSet()
+ {
+ if (m_FeaturesDirty) {
+ eastl::sort(m_Features.begin(), m_Features.end());
+ m_FeaturesDirty = false;
+ }
+ return toConstDataRef(m_Features.data(), (QT3DSU32)m_Features.size());
+ }
+
+ size_t SLayerRenderPreparationData::GetShaderFeatureSetHash()
+ {
+ if (!m_FeatureSetHash)
+ m_FeatureSetHash = HashShaderFeatureSet(GetShaderFeatureSet());
+ return m_FeatureSetHash;
+ }
+
+ bool SLayerRenderPreparationData::GetShadowMapManager()
+ {
+ if (m_ShadowMapManager.mPtr)
+ return true;
+
+ m_ShadowMapManager.mPtr = Qt3DSShadowMap::Create(m_Renderer.GetQt3DSContext());
+
+ return m_ShadowMapManager.mPtr != NULL;
+ }
+
+ bool SLayerRenderPreparationData::GetOffscreenRenderer()
+ {
+ if (m_LastFrameOffscreenRenderer.mPtr)
+ return true;
+
+ if (m_Layer.m_RenderPlugin && m_Layer.m_RenderPlugin->m_Flags.IsActive()) {
+ IRenderPluginInstance *theInstance =
+ m_Renderer.GetQt3DSContext().GetRenderPluginManager().GetOrCreateRenderPluginInstance(
+ m_Layer.m_RenderPlugin->m_PluginPath, m_Layer.m_RenderPlugin);
+ if (theInstance) {
+ m_Renderer.GetQt3DSContext()
+ .GetOffscreenRenderManager()
+ .MaybeRegisterOffscreenRenderer(&theInstance, *theInstance);
+ m_LastFrameOffscreenRenderer = theInstance;
+ }
+ }
+ if (m_LastFrameOffscreenRenderer.mPtr == NULL)
+ m_LastFrameOffscreenRenderer =
+ m_Renderer.GetQt3DSContext().GetOffscreenRenderManager().GetOffscreenRenderer(
+ m_Layer.m_TexturePath);
+ return m_LastFrameOffscreenRenderer.mPtr != NULL;
+ }
+
+ QT3DSVec3 SLayerRenderPreparationData::GetCameraDirection()
+ {
+ if (m_CameraDirection.hasValue() == false) {
+ if (m_Camera)
+ m_CameraDirection = m_Camera->GetScalingCorrectDirection();
+ else
+ m_CameraDirection = QT3DSVec3(0, 0, -1);
+ }
+ return *m_CameraDirection;
+ }
+
+ // Per-frame cache of renderable objects post-sort.
+ NVDataRef<SRenderableObject *> SLayerRenderPreparationData::GetOpaqueRenderableObjects()
+ {
+ if (m_RenderedOpaqueObjects.empty() == false || m_Camera == NULL)
+ return m_RenderedOpaqueObjects;
+ if (m_Layer.m_Flags.IsLayerEnableDepthTest() && m_OpaqueObjects.empty() == false) {
+ QT3DSVec3 theCameraDirection(GetCameraDirection());
+ QT3DSVec3 theCameraPosition = m_Camera->GetGlobalPos();
+ m_RenderedOpaqueObjects.assign(m_OpaqueObjects.begin(), m_OpaqueObjects.end());
+ // Setup the object's sorting information
+ for (QT3DSU32 idx = 0, end = m_RenderedOpaqueObjects.size(); idx < end; ++idx) {
+ SRenderableObject &theInfo = *m_RenderedOpaqueObjects[idx];
+ QT3DSVec3 difference = theInfo.m_WorldCenterPoint - theCameraPosition;
+ theInfo.m_CameraDistanceSq = difference.dot(theCameraDirection);
+ }
+
+ ForwardingAllocator alloc(m_Renderer.GetPerFrameAllocator(), "SortAllocations");
+ // Render nearest to furthest objects
+ eastl::merge_sort(m_RenderedOpaqueObjects.begin(), m_RenderedOpaqueObjects.end(), alloc,
+ ISRenderObjectPtrLessThan);
+ }
+ return m_RenderedOpaqueObjects;
+ }
+
+ // If layer depth test is false, this may also contain opaque objects.
+ NVDataRef<SRenderableObject *> SLayerRenderPreparationData::GetTransparentRenderableObjects()
+ {
+ if (m_RenderedTransparentObjects.empty() == false || m_Camera == NULL)
+ return m_RenderedTransparentObjects;
+
+ m_RenderedTransparentObjects.assign(m_TransparentObjects.begin(),
+ m_TransparentObjects.end());
+
+ if (m_Layer.m_Flags.IsLayerEnableDepthTest() == false)
+ m_RenderedTransparentObjects.insert(m_RenderedTransparentObjects.end(),
+ m_OpaqueObjects.begin(), m_OpaqueObjects.end());
+
+ if (m_RenderedTransparentObjects.empty() == false) {
+ QT3DSVec3 theCameraDirection(GetCameraDirection());
+ QT3DSVec3 theCameraPosition = m_Camera->GetGlobalPos();
+
+ // Setup the object's sorting information
+ for (QT3DSU32 idx = 0, end = m_RenderedTransparentObjects.size(); idx < end; ++idx) {
+ SRenderableObject &theInfo = *m_RenderedTransparentObjects[idx];
+ QT3DSVec3 difference = theInfo.m_WorldCenterPoint - theCameraPosition;
+ theInfo.m_CameraDistanceSq = difference.dot(theCameraDirection);
+ }
+ ForwardingAllocator alloc(m_Renderer.GetPerFrameAllocator(), "SortAllocations");
+ // render furthest to nearest.
+ eastl::merge_sort(m_RenderedTransparentObjects.begin(),
+ m_RenderedTransparentObjects.end(), alloc,
+ ISRenderObjectPtrGreatThan);
+ }
+
+ return m_RenderedTransparentObjects;
+ }
+
+#define MAX_LAYER_WIDGETS 200
+
+ void SLayerRenderPreparationData::AddRenderWidget(IRenderWidget &inWidget)
+ {
+ // The if the layer is not active then the widget can't be displayed.
+ // Furthermore ResetForFrame won't be called below which leads to stale
+ // widgets in the m_IRenderWidgets array. These stale widgets would get rendered
+ // the next time the layer was active potentially causing a crash.
+ if (!m_Layer.m_Flags.IsActive())
+ return;
+
+ // Ensure we clear the widget layer always
+ m_Renderer.LayerNeedsFrameClear(*static_cast<SLayerRenderData *>(this));
+
+ if (m_IRenderWidgets.size() < MAX_LAYER_WIDGETS)
+ m_IRenderWidgets.push_back(&inWidget);
+ }
+
+#define RENDER_FRAME_NEW(type) QT3DS_NEW(m_Renderer.GetPerFrameAllocator(), type)
+
+#define QT3DS_RENDER_MINIMUM_RENDER_OPACITY .01f
+
+ SShaderDefaultMaterialKey
+ SLayerRenderPreparationData::GenerateLightingKey(DefaultMaterialLighting::Enum inLightingType)
+ {
+ SShaderDefaultMaterialKey theGeneratedKey(GetShaderFeatureSetHash());
+ const bool lighting = inLightingType != DefaultMaterialLighting::NoLighting;
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_HasLighting.SetValue(theGeneratedKey,
+ lighting);
+ if (lighting) {
+ const bool lightProbe = m_Layer.m_LightProbe
+ && m_Layer.m_LightProbe->m_TextureData.m_Texture;
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_HasIbl.SetValue(theGeneratedKey,
+ lightProbe);
+
+ QT3DSU32 numLights = (QT3DSU32)m_Lights.size();
+ if (numLights > SShaderDefaultMaterialKeyProperties::LightCount
+ && m_TooManyLightsError == false) {
+ m_TooManyLightsError = true;
+ numLights = SShaderDefaultMaterialKeyProperties::LightCount;
+ qCCritical(INVALID_OPERATION, "Too many lights on layer, max is 7");
+ QT3DS_ASSERT(false);
+ }
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_LightCount.SetValue(theGeneratedKey,
+ numLights);
+
+ for (QT3DSU32 lightIdx = 0, lightEnd = m_Lights.size();
+ lightIdx < lightEnd; ++lightIdx) {
+ SLight *theLight(m_Lights[lightIdx]);
+ const bool isDirectional = theLight->m_LightType == RenderLightTypes::Directional;
+ const bool isArea = theLight->m_LightType == RenderLightTypes::Area;
+ const bool castShadowsArea = (theLight->m_LightType != RenderLightTypes::Area)
+ && (theLight->m_CastShadow);
+
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_LightFlags[lightIdx]
+ .SetValue(theGeneratedKey, !isDirectional);
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_LightAreaFlags[lightIdx]
+ .SetValue(theGeneratedKey, isArea);
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_LightShadowFlags[lightIdx]
+ .SetValue(theGeneratedKey, castShadowsArea);
+ }
+ }
+ return theGeneratedKey;
+ }
+
+ bool SLayerRenderPreparationData::PrepareTextForRender(
+ SText &inText, const QT3DSMat44 &inViewProjection,
+ QT3DSF32 inTextScaleFactor, SLayerRenderPreparationResultFlags &ioFlags)
+ {
+ ITextTextureCache *theTextRenderer = m_Renderer.GetQt3DSContext().GetTextureCache();
+ if (theTextRenderer == NULL)
+ return false;
+
+ SRenderableObjectFlags theFlags;
+ theFlags.SetHasTransparency(true);
+ theFlags.SetCompletelyTransparent(inText.m_GlobalOpacity < .01f);
+ theFlags.SetPickable(true);
+ bool retval = false;
+
+ if (theFlags.IsCompletelyTransparent() == false) {
+ retval = inText.m_Flags.IsDirty() || inText.m_Flags.IsTextDirty();
+ inText.m_Flags.SetTextDirty(false);
+ QT3DSMat44 theMVP;
+ QT3DSMat33 theNormalMatrix;
+ inText.CalculateMVPAndNormalMatrix(inViewProjection, theMVP, theNormalMatrix);
+
+ SRenderableObject *theRenderable = nullptr;
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,12,2)
+ Q3DSDistanceFieldRenderer *distanceFieldText
+ = static_cast<Q3DSDistanceFieldRenderer *>(
+ m_Renderer.GetQt3DSContext().getDistanceFieldRenderer());
+ theRenderable = RENDER_FRAME_NEW(SDistanceFieldRenderable)(
+ theFlags, inText.GetGlobalPos(), inText, inText.m_Bounds, theMVP,
+ *distanceFieldText);
+#else
+ TTPathObjectAndTexture theResult
+ = theTextRenderer->RenderText(inText, inTextScaleFactor);
+ inText.m_TextTexture = theResult.second.second.mPtr;
+ inText.m_TextTextureDetails = theResult.second.first;
+ inText.m_PathFontItem = theResult.first.second;
+ inText.m_PathFontDetails = theResult.first.first;
+ STextScaleAndOffset theScaleAndOffset(*inText.m_TextTexture,
+ inText.m_TextTextureDetails, inText);
+ QT3DSVec2 theTextScale(theScaleAndOffset.m_TextScale);
+ QT3DSVec2 theTextOffset(theScaleAndOffset.m_TextOffset);
+ QT3DSVec3 minimum(theTextOffset[0] - theTextScale[0],
+ theTextOffset[1] - theTextScale[1], 0);
+ QT3DSVec3 maximum(theTextOffset[0] + theTextScale[0],
+ theTextOffset[1] + theTextScale[1], 0);
+ inText.m_Bounds = NVBounds3(minimum, maximum);
+
+ if (inText.m_PathFontDetails)
+ ioFlags.SetRequiresStencilBuffer(true);
+
+ theRenderable = RENDER_FRAME_NEW(STextRenderable)(
+ theFlags, inText.GetGlobalPos(), m_Renderer, inText, inText.m_Bounds, theMVP,
+ inViewProjection, *inText.m_TextTexture, theTextOffset, theTextScale);
+#endif
+ // After preparation, do not push object back to queue if it is not
+ // active, because we prepare text elements regardless of their
+ // visibility (=active status).
+ if (inText.m_Flags.IsGloballyActive())
+ m_TransparentObjects.push_back(theRenderable);
+ }
+ return retval;
+ }
+
+ eastl::pair<bool, SGraphObject *>
+ SLayerRenderPreparationData::ResolveReferenceMaterial(SGraphObject *inMaterial)
+ {
+ bool subsetDirty = false;
+ bool badIdea = false;
+ SGraphObject *theSourceMaterialObject(inMaterial);
+ SGraphObject *theMaterialObject(inMaterial);
+ while (theMaterialObject
+ && theMaterialObject->m_Type == GraphObjectTypes::ReferencedMaterial && !badIdea) {
+ SReferencedMaterial *theRefMaterial =
+ static_cast<SReferencedMaterial *>(theMaterialObject);
+ theMaterialObject = theRefMaterial->m_ReferencedMaterial;
+ if (theMaterialObject == theSourceMaterialObject) {
+ badIdea = true;
+ }
+
+ if (theRefMaterial == theSourceMaterialObject) {
+ theRefMaterial->m_Dirty.UpdateDirtyForFrame();
+ }
+ subsetDirty = subsetDirty | theRefMaterial->m_Dirty.IsDirty();
+ }
+ if (badIdea) {
+ theMaterialObject = NULL;
+ }
+ return eastl::make_pair(subsetDirty, theMaterialObject);
+ }
+
+ bool SLayerRenderPreparationData::PreparePathForRender(
+ SPath &inPath, const QT3DSMat44 &inViewProjection,
+ const Option<SClippingFrustum> &inClipFrustum, SLayerRenderPreparationResultFlags &ioFlags)
+ {
+ SRenderableObjectFlags theSharedFlags;
+ theSharedFlags.SetPickable(true);
+ QT3DSF32 subsetOpacity = inPath.m_GlobalOpacity;
+ bool retval = inPath.m_Flags.IsDirty();
+ inPath.m_Flags.SetDirty(false);
+ QT3DSMat44 theMVP;
+ QT3DSMat33 theNormalMatrix;
+
+ inPath.CalculateMVPAndNormalMatrix(inViewProjection, theMVP, theNormalMatrix);
+ NVBounds3 theBounds(this->m_Renderer.GetQt3DSContext().GetPathManager().GetBounds(inPath));
+
+ if (inPath.m_GlobalOpacity >= QT3DS_RENDER_MINIMUM_RENDER_OPACITY
+ && inClipFrustum.hasValue()) {
+ // Check bounding box against the clipping planes
+ NVBounds3 theGlobalBounds = theBounds;
+ theGlobalBounds.transform(inPath.m_GlobalTransform);
+ if (inClipFrustum->intersectsWith(theGlobalBounds) == false)
+ subsetOpacity = 0.0f;
+ }
+
+ SGraphObject *theMaterials[2] = { inPath.m_Material, inPath.m_SecondMaterial };
+
+ if (inPath.m_PathType == PathTypes::Geometry
+ || inPath.m_PaintStyle != PathPaintStyles::FilledAndStroked)
+ theMaterials[1] = NULL;
+
+ // We need to fill material to be the first one rendered so the stroke goes on top.
+ // In the timeline, however, this is reversed.
+
+ if (theMaterials[1])
+ eastl::swap(theMaterials[1], theMaterials[0]);
+
+ for (QT3DSU32 idx = 0, end = 2; idx < end; ++idx) {
+ if (theMaterials[idx] == NULL)
+ continue;
+
+ SRenderableObjectFlags theFlags = theSharedFlags;
+
+ eastl::pair<bool, SGraphObject *> theMaterialAndDirty(
+ ResolveReferenceMaterial(theMaterials[idx]));
+ SGraphObject *theMaterial(theMaterialAndDirty.second);
+ retval = retval || theMaterialAndDirty.first;
+
+ if (theMaterial != NULL && theMaterial->m_Type == GraphObjectTypes::DefaultMaterial) {
+ SDefaultMaterial *theDefaultMaterial = static_cast<SDefaultMaterial *>(theMaterial);
+ // Don't clear dirty flags if the material was referenced.
+ bool clearMaterialFlags = theMaterial == inPath.m_Material;
+ SDefaultMaterialPreparationResult prepResult(PrepareDefaultMaterialForRender(
+ *theDefaultMaterial, theFlags, subsetOpacity, clearMaterialFlags));
+
+ theFlags = prepResult.m_RenderableFlags;
+ if (inPath.m_PathType == PathTypes::Geometry) {
+ if ((inPath.m_BeginCapping != PathCapping::Noner
+ && inPath.m_BeginCapOpacity < 1.0f)
+ || (inPath.m_EndCapping != PathCapping::Noner
+ && inPath.m_EndCapOpacity < 1.0f))
+ theFlags.SetHasTransparency(true);
+ } else {
+ ioFlags.SetRequiresStencilBuffer(true);
+ }
+ retval = retval || prepResult.m_Dirty;
+ bool isStroke = true;
+ if (idx == 0 && inPath.m_PathType == PathTypes::Painted) {
+ if (inPath.m_PaintStyle == PathPaintStyles::Filled
+ || inPath.m_PaintStyle == PathPaintStyles::FilledAndStroked)
+ isStroke = false;
+ }
+
+ SPathRenderable *theRenderable = RENDER_FRAME_NEW(SPathRenderable)(
+ theFlags, inPath.GetGlobalPos(), m_Renderer, inPath.m_GlobalTransform,
+ theBounds, inPath, theMVP, theNormalMatrix, *theMaterial, prepResult.m_Opacity,
+ prepResult.m_MaterialKey, isStroke);
+ theRenderable->m_FirstImage = prepResult.m_FirstImage;
+
+ IQt3DSRenderContext &qt3dsContext(m_Renderer.GetQt3DSContext());
+ IPathManager &thePathManager = qt3dsContext.GetPathManager();
+ retval = thePathManager.PrepareForRender(inPath) || retval;
+ retval |= (inPath.m_WireframeMode != qt3dsContext.GetWireframeMode());
+ inPath.m_WireframeMode = qt3dsContext.GetWireframeMode();
+
+ if (theFlags.HasTransparency())
+ m_TransparentObjects.push_back(theRenderable);
+ else
+ m_OpaqueObjects.push_back(theRenderable);
+ } else if (theMaterial != NULL
+ && theMaterial->m_Type == GraphObjectTypes::CustomMaterial) {
+ SCustomMaterial *theCustomMaterial = static_cast<SCustomMaterial *>(theMaterial);
+ // Don't clear dirty flags if the material was referenced.
+ // bool clearMaterialFlags = theMaterial == inPath.m_Material;
+ SDefaultMaterialPreparationResult prepResult(
+ PrepareCustomMaterialForRender(*theCustomMaterial, theFlags, subsetOpacity));
+
+ theFlags = prepResult.m_RenderableFlags;
+ if (inPath.m_PathType == PathTypes::Geometry) {
+ if ((inPath.m_BeginCapping != PathCapping::Noner
+ && inPath.m_BeginCapOpacity < 1.0f)
+ || (inPath.m_EndCapping != PathCapping::Noner
+ && inPath.m_EndCapOpacity < 1.0f))
+ theFlags.SetHasTransparency(true);
+ } else {
+ ioFlags.SetRequiresStencilBuffer(true);
+ }
+
+ retval = retval || prepResult.m_Dirty;
+ bool isStroke = true;
+ if (idx == 0 && inPath.m_PathType == PathTypes::Painted) {
+ if (inPath.m_PaintStyle == PathPaintStyles::Filled
+ || inPath.m_PaintStyle == PathPaintStyles::FilledAndStroked)
+ isStroke = false;
+ }
+
+ SPathRenderable *theRenderable = RENDER_FRAME_NEW(SPathRenderable)(
+ theFlags, inPath.GetGlobalPos(), m_Renderer, inPath.m_GlobalTransform,
+ theBounds, inPath, theMVP, theNormalMatrix, *theMaterial, prepResult.m_Opacity,
+ prepResult.m_MaterialKey, isStroke);
+ theRenderable->m_FirstImage = prepResult.m_FirstImage;
+
+ IQt3DSRenderContext &qt3dsContext(m_Renderer.GetQt3DSContext());
+ IPathManager &thePathManager = qt3dsContext.GetPathManager();
+ retval = thePathManager.PrepareForRender(inPath) || retval;
+ retval |= (inPath.m_WireframeMode != qt3dsContext.GetWireframeMode());
+ inPath.m_WireframeMode = qt3dsContext.GetWireframeMode();
+
+ if (theFlags.HasTransparency())
+ m_TransparentObjects.push_back(theRenderable);
+ else
+ m_OpaqueObjects.push_back(theRenderable);
+ }
+ }
+ return retval;
+ }
+
+ void SLayerRenderPreparationData::PrepareImageForRender(
+ SImage &inImage, ImageMapTypes::Enum inMapType, SRenderableImage *&ioFirstImage,
+ SRenderableImage *&ioNextImage, SRenderableObjectFlags &ioFlags,
+ SShaderDefaultMaterialKey &inShaderKey, QT3DSU32 inImageIndex)
+ {
+ IQt3DSRenderContext &qt3dsContext(m_Renderer.GetQt3DSContext());
+ IBufferManager &bufferManager = qt3dsContext.GetBufferManager();
+ IOffscreenRenderManager &theOffscreenRenderManager(
+ qt3dsContext.GetOffscreenRenderManager());
+ IRenderPluginManager &theRenderPluginManager(qt3dsContext.GetRenderPluginManager());
+ if (inImage.ClearDirty(bufferManager, theOffscreenRenderManager, theRenderPluginManager))
+ ioFlags |= RenderPreparationResultFlagValues::Dirty;
+
+ // All objects with offscreen renderers are pickable so we can pass the pick through to the
+ // offscreen renderer and let it deal with the pick.
+ if (inImage.m_LastFrameOffscreenRenderer != NULL) {
+ ioFlags.SetPickable(true);
+ ioFlags |= RenderPreparationResultFlagValues::HasTransparency;
+ }
+
+ if (inImage.m_TextureData.m_Texture) {
+ if (inImage.m_TextureData.m_TextureFlags.HasTransparency()
+ && (inMapType == ImageMapTypes::Diffuse
+ || inMapType == ImageMapTypes::Opacity
+ || inMapType == ImageMapTypes::Translucency)) {
+ ioFlags |= RenderPreparationResultFlagValues::HasTransparency;
+ }
+ // Textures used in general have linear characteristics.
+ // PKC -- The filters are properly set already. Setting them here only overrides what
+ // would
+ // otherwise be a correct setting.
+ // inImage.m_TextureData.m_Texture->SetMinFilter( NVRenderTextureMinifyingOp::Linear );
+ // inImage.m_TextureData.m_Texture->SetMagFilter( NVRenderTextureMagnifyingOp::Linear );
+
+ SRenderableImage *theImage = RENDER_FRAME_NEW(SRenderableImage)(inMapType, inImage);
+ SShaderKeyImageMap &theKeyProp =
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_ImageMaps[inImageIndex];
+
+ theKeyProp.SetEnabled(inShaderKey, true);
+ switch (inImage.m_MappingMode) {
+ default:
+ QT3DS_ASSERT(false);
+ // fallthrough intentional
+ case ImageMappingModes::Normal:
+ break;
+ case ImageMappingModes::Environment:
+ theKeyProp.SetEnvMap(inShaderKey, true);
+ break;
+ case ImageMappingModes::LightProbe:
+ theKeyProp.SetLightProbe(inShaderKey, true);
+ break;
+ }
+
+ if (inImage.m_TextureData.m_TextureFlags.IsInvertUVCoords())
+ theKeyProp.SetInvertUVMap(inShaderKey, true);
+ if (ioFirstImage == NULL)
+ ioFirstImage = theImage;
+ else
+ ioNextImage->m_NextImage = theImage;
+
+ if (inImage.m_TextureData.m_TextureFlags.IsPreMultiplied())
+ theKeyProp.SetPremultiplied(inShaderKey, true);
+
+ SShaderKeyTextureSwizzle &theSwizzleKeyProp =
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_TextureSwizzle[inImageIndex];
+ theSwizzleKeyProp.SetSwizzleMode(
+ inShaderKey, inImage.m_TextureData.m_Texture->GetTextureSwizzleMode(), true);
+
+ ioNextImage = theImage;
+ }
+ }
+
+ SDefaultMaterialPreparationResult SLayerRenderPreparationData::PrepareDefaultMaterialForRender(
+ SDefaultMaterial &inMaterial, SRenderableObjectFlags &inExistingFlags, QT3DSF32 inOpacity,
+ bool inClearDirtyFlags)
+ {
+ SDefaultMaterial *theMaterial = &inMaterial;
+ SDefaultMaterialPreparationResult retval(GenerateLightingKey(theMaterial->m_Lighting));
+ retval.m_RenderableFlags = inExistingFlags;
+ SRenderableObjectFlags &renderableFlags(retval.m_RenderableFlags);
+ SShaderDefaultMaterialKey &theGeneratedKey(retval.m_MaterialKey);
+ retval.m_Opacity = inOpacity;
+ QT3DSF32 &subsetOpacity(retval.m_Opacity);
+
+ if (theMaterial->m_Dirty.IsDirty()) {
+ renderableFlags |= RenderPreparationResultFlagValues::Dirty;
+ }
+ subsetOpacity *= theMaterial->m_Opacity;
+ if (inClearDirtyFlags)
+ theMaterial->m_Dirty.UpdateDirtyForFrame();
+
+ SRenderableImage *firstImage = NULL;
+
+ // set wireframe mode
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_WireframeMode.SetValue(
+ theGeneratedKey, m_Renderer.GetQt3DSContext().GetWireframeMode());
+
+ if (theMaterial->m_IblProbe && CheckLightProbeDirty(*theMaterial->m_IblProbe)) {
+ m_Renderer.PrepareImageForIbl(*theMaterial->m_IblProbe);
+ }
+
+ if (!m_Renderer.DefaultMaterialShaderKeyProperties().m_HasIbl.GetValue(theGeneratedKey)) {
+ bool lightProbeValid = HasValidLightProbe(theMaterial->m_IblProbe);
+ SetShaderFeature("QT3DS_ENABLE_LIGHT_PROBE", lightProbeValid);
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_HasIbl.SetValue(theGeneratedKey,
+ lightProbeValid);
+ // SetShaderFeature( "QT3DS_ENABLE_IBL_FOV",
+ // m_Renderer.GetLayerRenderData()->m_Layer.m_ProbeFov < 180.0f );
+ }
+
+ if (subsetOpacity >= QT3DS_RENDER_MINIMUM_RENDER_OPACITY) {
+
+ if (theMaterial->m_BlendMode != DefaultMaterialBlendMode::Normal
+ || theMaterial->m_OpacityMap) {
+ renderableFlags |= RenderPreparationResultFlagValues::HasTransparency;
+ }
+
+ bool specularEnabled = theMaterial->IsSpecularEnabled();
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_SpecularEnabled.SetValue(
+ theGeneratedKey, specularEnabled);
+ if (specularEnabled) {
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_SpecularModel.SetSpecularModel(
+ theGeneratedKey, theMaterial->m_SpecularModel);
+ }
+
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_FresnelEnabled.SetValue(
+ theGeneratedKey, theMaterial->IsFresnelEnabled());
+
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_VertexColorsEnabled.SetValue(
+ theGeneratedKey, theMaterial->IsVertexColorsEnabled());
+
+ // Run through the material's images and prepare them for render.
+ // this may in fact set pickable on the renderable flags if one of the images
+ // links to a sub presentation or any offscreen rendered object.
+ SRenderableImage *nextImage = NULL;
+#define CHECK_IMAGE_AND_PREPARE(img, imgtype, shadercomponent) \
+ if ((img)) \
+ PrepareImageForRender(*(img), imgtype, firstImage, nextImage, renderableFlags, \
+ theGeneratedKey, shadercomponent);
+
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_DiffuseMaps[0], ImageMapTypes::Diffuse,
+ SShaderDefaultMaterialKeyProperties::DiffuseMap0);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_DiffuseMaps[1], ImageMapTypes::Diffuse,
+ SShaderDefaultMaterialKeyProperties::DiffuseMap1);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_DiffuseMaps[2], ImageMapTypes::Diffuse,
+ SShaderDefaultMaterialKeyProperties::DiffuseMap2);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_EmissiveMap, ImageMapTypes::Emissive,
+ SShaderDefaultMaterialKeyProperties::EmissiveMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_EmissiveMap2, ImageMapTypes::Emissive,
+ SShaderDefaultMaterialKeyProperties::EmissiveMap2);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_SpecularReflection, ImageMapTypes::Specular,
+ SShaderDefaultMaterialKeyProperties::SpecularMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_RoughnessMap, ImageMapTypes::Roughness,
+ SShaderDefaultMaterialKeyProperties::RoughnessMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_OpacityMap, ImageMapTypes::Opacity,
+ SShaderDefaultMaterialKeyProperties::OpacityMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_BumpMap, ImageMapTypes::Bump,
+ SShaderDefaultMaterialKeyProperties::BumpMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_SpecularMap, ImageMapTypes::SpecularAmountMap,
+ SShaderDefaultMaterialKeyProperties::SpecularAmountMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_NormalMap, ImageMapTypes::Normal,
+ SShaderDefaultMaterialKeyProperties::NormalMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_DisplacementMap, ImageMapTypes::Displacement,
+ SShaderDefaultMaterialKeyProperties::DisplacementMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_TranslucencyMap, ImageMapTypes::Translucency,
+ SShaderDefaultMaterialKeyProperties::TranslucencyMap);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_Lightmaps.m_LightmapIndirect,
+ ImageMapTypes::LightmapIndirect,
+ SShaderDefaultMaterialKeyProperties::LightmapIndirect);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_Lightmaps.m_LightmapRadiosity,
+ ImageMapTypes::LightmapRadiosity,
+ SShaderDefaultMaterialKeyProperties::LightmapRadiosity);
+ CHECK_IMAGE_AND_PREPARE(theMaterial->m_Lightmaps.m_LightmapShadow,
+ ImageMapTypes::LightmapShadow,
+ SShaderDefaultMaterialKeyProperties::LightmapShadow);
+ }
+#undef CHECK_IMAGE_AND_PREPARE
+
+ if (subsetOpacity < QT3DS_RENDER_MINIMUM_RENDER_OPACITY) {
+ subsetOpacity = 0.0f;
+ // You can still pick against completely transparent objects(or rather their bounding
+ // box)
+ // you just don't render them.
+ renderableFlags |= RenderPreparationResultFlagValues::HasTransparency;
+ renderableFlags |= RenderPreparationResultFlagValues::CompletelyTransparent;
+ }
+
+ if (IsNotOne(subsetOpacity))
+ renderableFlags |= RenderPreparationResultFlagValues::HasTransparency;
+
+ retval.m_FirstImage = firstImage;
+ if (retval.m_RenderableFlags.IsDirty())
+ retval.m_Dirty = true;
+ return retval;
+ }
+
+ SDefaultMaterialPreparationResult SLayerRenderPreparationData::PrepareCustomMaterialForRender(
+ SCustomMaterial &inMaterial, SRenderableObjectFlags &inExistingFlags, QT3DSF32 inOpacity)
+ {
+ SDefaultMaterialPreparationResult retval(GenerateLightingKey(
+ DefaultMaterialLighting::FragmentLighting)); // always fragment lighting
+ retval.m_RenderableFlags = inExistingFlags;
+ SRenderableObjectFlags &renderableFlags(retval.m_RenderableFlags);
+ SShaderDefaultMaterialKey &theGeneratedKey(retval.m_MaterialKey);
+ retval.m_Opacity = inOpacity;
+ QT3DSF32 &subsetOpacity(retval.m_Opacity);
+
+ // If the custom material uses subpresentations, those have to be rendered before
+ // the custom material itself
+ m_Renderer.GetQt3DSContext().GetCustomMaterialSystem().renderSubpresentations(inMaterial);
+
+ // set wireframe mode
+ m_Renderer.DefaultMaterialShaderKeyProperties().m_WireframeMode.SetValue(
+ theGeneratedKey, m_Renderer.GetQt3DSContext().GetWireframeMode());
+
+ if (subsetOpacity < QT3DS_RENDER_MINIMUM_RENDER_OPACITY) {
+ subsetOpacity = 0.0f;
+ // You can still pick against completely transparent objects(or rather their bounding
+ // box)
+ // you just don't render them.
+ renderableFlags |= RenderPreparationResultFlagValues::HasTransparency;
+ renderableFlags |= RenderPreparationResultFlagValues::CompletelyTransparent;
+ }
+
+ if (IsNotOne(subsetOpacity))
+ renderableFlags |= RenderPreparationResultFlagValues::HasTransparency;
+
+ SRenderableImage *firstImage = NULL;
+ SRenderableImage *nextImage = NULL;
+
+#define CHECK_IMAGE_AND_PREPARE(img, imgtype, shadercomponent) \
+ if ((img)) \
+ PrepareImageForRender(*(img), imgtype, firstImage, nextImage, renderableFlags, \
+ theGeneratedKey, shadercomponent);
+
+ CHECK_IMAGE_AND_PREPARE(inMaterial.m_DisplacementMap, ImageMapTypes::Displacement,
+ SShaderDefaultMaterialKeyProperties::DisplacementMap);
+ CHECK_IMAGE_AND_PREPARE(inMaterial.m_Lightmaps.m_LightmapIndirect,
+ ImageMapTypes::LightmapIndirect,
+ SShaderDefaultMaterialKeyProperties::LightmapIndirect);
+ CHECK_IMAGE_AND_PREPARE(inMaterial.m_Lightmaps.m_LightmapRadiosity,
+ ImageMapTypes::LightmapRadiosity,
+ SShaderDefaultMaterialKeyProperties::LightmapRadiosity);
+ CHECK_IMAGE_AND_PREPARE(inMaterial.m_Lightmaps.m_LightmapShadow,
+ ImageMapTypes::LightmapShadow,
+ SShaderDefaultMaterialKeyProperties::LightmapShadow);
+#undef CHECK_IMAGE_AND_PREPARE
+
+ retval.m_FirstImage = firstImage;
+ return retval;
+ }
+
+ bool SLayerRenderPreparationData::PrepareModelForRender(
+ SModel &inModel, const QT3DSMat44 &inViewProjection,
+ const Option<SClippingFrustum> &inClipFrustum, TNodeLightEntryList &inScopedLights)
+ {
+ IQt3DSRenderContext &qt3dsContext(m_Renderer.GetQt3DSContext());
+ IBufferManager &bufferManager = qt3dsContext.GetBufferManager();
+ SRenderMesh *theMesh = bufferManager.LoadMesh(inModel.m_MeshPath);
+ if (theMesh == NULL)
+ return false;
+
+ SGraphObject *theSourceMaterialObject = inModel.m_FirstMaterial;
+ SModelContext &theModelContext =
+ *RENDER_FRAME_NEW(SModelContext)(inModel, inViewProjection);
+ m_ModelContexts.push_back(&theModelContext);
+
+ bool subsetDirty = false;
+
+ SScopedLightsListScope lightsScope(m_Lights, m_LightDirections, m_SourceLightDirections,
+ inScopedLights);
+ SetShaderFeature(m_CGLightingFeatureName, m_Lights.empty() == false);
+ for (QT3DSU32 idx = 0, end = theMesh->m_Subsets.size(); idx < end && theSourceMaterialObject;
+ ++idx, theSourceMaterialObject = GetNextMaterialSibling(theSourceMaterialObject)) {
+ SRenderSubset &theOuterSubset(theMesh->m_Subsets[idx]);
+ {
+ SRenderSubset &theSubset(theOuterSubset);
+ SRenderableObjectFlags renderableFlags;
+ renderableFlags.SetPickable(false);
+ renderableFlags.SetShadowCaster(inModel.m_ShadowCaster);
+ QT3DSF32 subsetOpacity = inModel.m_GlobalOpacity;
+ QT3DSVec3 theModelCenter(theSubset.m_Bounds.getCenter());
+ theModelCenter = inModel.m_GlobalTransform.transform(theModelCenter);
+
+ if (subsetOpacity >= QT3DS_RENDER_MINIMUM_RENDER_OPACITY
+ && inClipFrustum.hasValue()) {
+ // Check bounding box against the clipping planes
+ NVBounds3 theGlobalBounds = theSubset.m_Bounds;
+ theGlobalBounds.transform(theModelContext.m_Model.m_GlobalTransform);
+ if (inClipFrustum->intersectsWith(theGlobalBounds) == false)
+ subsetOpacity = 0.0f;
+ }
+
+ // For now everything is pickable. Eventually we want to have localPickable and
+ // globalPickable set on the node during
+ // updates and have the runtime tell us what is pickable and what is not pickable.
+ // Completely transparent models cannot be pickable. But models with completely
+ // transparent materials
+ // still are. This allows the artist to control pickability in a somewhat
+ // fine-grained style.
+ bool canModelBePickable = inModel.m_GlobalOpacity > .01f;
+ renderableFlags.SetPickable(canModelBePickable
+ && (theModelContext.m_Model.m_Flags.IsGloballyPickable()
+ || renderableFlags.GetPickable()));
+ SRenderableObject *theRenderableObject(NULL);
+ eastl::pair<bool, SGraphObject *> theMaterialObjectAndDirty =
+ ResolveReferenceMaterial(theSourceMaterialObject);
+ SGraphObject *theMaterialObject = theMaterialObjectAndDirty.second;
+ subsetDirty = subsetDirty || theMaterialObjectAndDirty.first;
+ if (theMaterialObject == NULL)
+ continue;
+
+ // set tessellation
+ if (inModel.m_TessellationMode != TessModeValues::NoTess) {
+ theSubset.m_PrimitiveType = NVRenderDrawMode::Patches;
+ // set tessellation factor
+ theSubset.m_EdgeTessFactor = inModel.m_EdgeTess;
+ theSubset.m_InnerTessFactor = inModel.m_InnerTess;
+ // update the vertex ver patch count in the input assembler
+ // currently we only support triangle patches so count is always 3
+ theSubset.m_InputAssembler->SetPatchVertexCount(3);
+ theSubset.m_InputAssemblerDepth->SetPatchVertexCount(3);
+ // check wireframe mode
+ theSubset.m_WireframeMode = qt3dsContext.GetWireframeMode();
+
+ subsetDirty =
+ subsetDirty | (theSubset.m_WireframeMode != inModel.m_WireframeMode);
+ inModel.m_WireframeMode = qt3dsContext.GetWireframeMode();
+ } else {
+ theSubset.m_PrimitiveType = theSubset.m_InputAssembler->GetPrimitiveType();
+ theSubset.m_InputAssembler->SetPatchVertexCount(1);
+ theSubset.m_InputAssemblerDepth->SetPatchVertexCount(1);
+ // currently we allow wirframe mode only if tessellation is on
+ theSubset.m_WireframeMode = false;
+
+ subsetDirty =
+ subsetDirty | (theSubset.m_WireframeMode != inModel.m_WireframeMode);
+ inModel.m_WireframeMode = false;
+ }
+ // Only clear flags on the materials in this direct hierarchy. Do not clear them of
+ // this
+ // references materials in another hierarchy.
+ bool clearMaterialDirtyFlags = theMaterialObject == theSourceMaterialObject;
+
+ if (theMaterialObject == NULL)
+ continue;
+
+ if (theMaterialObject->m_Type == GraphObjectTypes::DefaultMaterial) {
+ SDefaultMaterial &theMaterial(
+ static_cast<SDefaultMaterial &>(*theMaterialObject));
+ SDefaultMaterialPreparationResult theMaterialPrepResult(
+ PrepareDefaultMaterialForRender(theMaterial, renderableFlags, subsetOpacity,
+ clearMaterialDirtyFlags));
+ SShaderDefaultMaterialKey theGeneratedKey = theMaterialPrepResult.m_MaterialKey;
+ subsetOpacity = theMaterialPrepResult.m_Opacity;
+ SRenderableImage *firstImage(theMaterialPrepResult.m_FirstImage);
+ subsetDirty |= theMaterialPrepResult.m_Dirty;
+ renderableFlags = theMaterialPrepResult.m_RenderableFlags;
+
+ m_Renderer.DefaultMaterialShaderKeyProperties()
+ .m_TessellationMode.SetTessellationMode(theGeneratedKey,
+ inModel.m_TessellationMode, true);
+
+ NVConstDataRef<QT3DSMat44> boneGlobals;
+ if (theSubset.m_Joints.size()) {
+ QT3DS_ASSERT(false);
+ }
+
+ theRenderableObject = RENDER_FRAME_NEW(SSubsetRenderable)(
+ renderableFlags, theModelCenter, m_Renderer, theSubset, theMaterial,
+ theModelContext, subsetOpacity, firstImage, theGeneratedKey, boneGlobals);
+ subsetDirty = subsetDirty || renderableFlags.IsDirty();
+
+ } // if type == DefaultMaterial
+ else if (theMaterialObject->m_Type == GraphObjectTypes::CustomMaterial) {
+ SCustomMaterial &theMaterial(
+ static_cast<SCustomMaterial &>(*theMaterialObject));
+
+ ICustomMaterialSystem &theMaterialSystem(
+ qt3dsContext.GetCustomMaterialSystem());
+ subsetDirty |= theMaterialSystem.PrepareForRender(
+ theModelContext.m_Model, theSubset, theMaterial, clearMaterialDirtyFlags);
+
+ SDefaultMaterialPreparationResult theMaterialPrepResult(
+ PrepareCustomMaterialForRender(theMaterial, renderableFlags,
+ subsetOpacity));
+ SShaderDefaultMaterialKey theGeneratedKey = theMaterialPrepResult.m_MaterialKey;
+ subsetOpacity = theMaterialPrepResult.m_Opacity;
+ SRenderableImage *firstImage(theMaterialPrepResult.m_FirstImage);
+ renderableFlags = theMaterialPrepResult.m_RenderableFlags;
+
+ // prepare for render tells us if the object is transparent
+ if (theMaterial.m_hasTransparency)
+ renderableFlags |= RenderPreparationResultFlagValues::HasTransparency;
+ // prepare for render tells us if the object is transparent
+ if (theMaterial.m_hasRefraction)
+ renderableFlags |= RenderPreparationResultFlagValues::HasRefraction;
+
+ m_Renderer.DefaultMaterialShaderKeyProperties()
+ .m_TessellationMode.SetTessellationMode(theGeneratedKey,
+ inModel.m_TessellationMode, true);
+
+ if (theMaterial.m_IblProbe && CheckLightProbeDirty(*theMaterial.m_IblProbe)) {
+ m_Renderer.PrepareImageForIbl(*theMaterial.m_IblProbe);
+ }
+
+ theRenderableObject = RENDER_FRAME_NEW(SCustomMaterialRenderable)(
+ renderableFlags, theModelCenter, m_Renderer, theSubset, theMaterial,
+ theModelContext, subsetOpacity, firstImage, theGeneratedKey);
+ }
+ if (theRenderableObject) {
+ theRenderableObject->m_ScopedLights = inScopedLights;
+ // set tessellation
+ theRenderableObject->m_TessellationMode = inModel.m_TessellationMode;
+
+ if (theRenderableObject->m_RenderableFlags.HasTransparency()
+ || theRenderableObject->m_RenderableFlags.HasRefraction()) {
+ m_TransparentObjects.push_back(theRenderableObject);
+ } else {
+ m_OpaqueObjects.push_back(theRenderableObject);
+ }
+ }
+ }
+ }
+ return subsetDirty;
+ }
+
+ bool SLayerRenderPreparationData::PrepareRenderablesForRender(
+ const QT3DSMat44 &inViewProjection, const Option<SClippingFrustum> &inClipFrustum,
+ QT3DSF32 inTextScaleFactor, SLayerRenderPreparationResultFlags &ioFlags)
+ {
+ SStackPerfTimer __timer(m_Renderer.GetQt3DSContext().GetPerfTimer(),
+ "SLayerRenderData::PrepareRenderablesForRender");
+ m_ViewProjection = inViewProjection;
+ QT3DSF32 theTextScaleFactor = inTextScaleFactor;
+ bool wasDataDirty = false;
+ bool hasTextRenderer = m_Renderer.GetQt3DSContext().GetTextRenderer() != NULL;
+ for (QT3DSU32 idx = 0, end = m_RenderableNodes.size(); idx < end; ++idx) {
+ SRenderableNodeEntry &theNodeEntry(m_RenderableNodes[idx]);
+ SNode *theNode = theNodeEntry.m_Node;
+ wasDataDirty = wasDataDirty || theNode->m_Flags.IsDirty();
+ switch (theNode->m_Type) {
+ case GraphObjectTypes::Model: {
+ SModel *theModel = static_cast<SModel *>(theNode);
+ theModel->CalculateGlobalVariables();
+ if (theModel->m_Flags.IsGloballyActive()) {
+ bool wasModelDirty = PrepareModelForRender(
+ *theModel, inViewProjection, inClipFrustum, theNodeEntry.m_Lights);
+ wasDataDirty = wasDataDirty || wasModelDirty;
+ }
+ } break;
+ case GraphObjectTypes::Text: {
+ if (hasTextRenderer) {
+ SText *theText = static_cast<SText *>(theNode);
+ theText->CalculateGlobalVariables();
+ // Omit check for global active flag intentionally and force
+ // render preparation for all Text items. This eliminates
+ // large delay for distance field text items becoming active
+ // mid-animation.
+ bool wasTextDirty = PrepareTextForRender(*theText, inViewProjection,
+ theTextScaleFactor, ioFlags);
+ wasDataDirty = wasDataDirty || wasTextDirty;
+
+ }
+ } break;
+ case GraphObjectTypes::Path: {
+ SPath *thePath = static_cast<SPath *>(theNode);
+ thePath->CalculateGlobalVariables();
+ if (thePath->m_Flags.IsGloballyActive()) {
+ bool wasPathDirty =
+ PreparePathForRender(*thePath, inViewProjection, inClipFrustum, ioFlags);
+ wasDataDirty = wasDataDirty || wasPathDirty;
+ }
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+ return wasDataDirty;
+ }
+
+ bool SLayerRenderPreparationData::CheckLightProbeDirty(SImage &inLightProbe)
+ {
+ IQt3DSRenderContext &theContext(m_Renderer.GetQt3DSContext());
+ return inLightProbe.ClearDirty(theContext.GetBufferManager(),
+ theContext.GetOffscreenRenderManager(),
+ theContext.GetRenderPluginManager(), true);
+ }
+
+ struct SLightNodeMarker
+ {
+ SLight *m_Light;
+ QT3DSU32 m_LightIndex;
+ QT3DSU32 m_FirstValidIndex;
+ QT3DSU32 m_JustPastLastValidIndex;
+ bool m_AddOrRemove;
+ SLightNodeMarker()
+ : m_Light(NULL)
+ , m_FirstValidIndex(0)
+ , m_JustPastLastValidIndex(0)
+ , m_AddOrRemove(false)
+ {
+ }
+ SLightNodeMarker(SLight &inLight, QT3DSU32 inLightIndex, SNode &inNode, bool aorm)
+ : m_Light(&inLight)
+ , m_LightIndex(inLightIndex)
+ , m_AddOrRemove(aorm)
+ {
+ if (inNode.m_Type == GraphObjectTypes::Layer) {
+ m_FirstValidIndex = 0;
+ m_JustPastLastValidIndex = QT3DS_MAX_U32;
+ } else {
+ m_FirstValidIndex = inNode.m_DFSIndex;
+ SNode *lastChild = NULL;
+ SNode *firstChild = inNode.m_FirstChild;
+ // find deepest last child
+ while (firstChild) {
+ for (SNode *childNode = firstChild; childNode;
+ childNode = childNode->m_NextSibling)
+ lastChild = childNode;
+
+ if (lastChild)
+ firstChild = lastChild->m_FirstChild;
+ else
+ firstChild = NULL;
+ }
+ if (lastChild)
+ // last valid index would be the last child index + 1
+ m_JustPastLastValidIndex = lastChild->m_DFSIndex + 1;
+ else // no children.
+ m_JustPastLastValidIndex = m_FirstValidIndex + 1;
+ }
+ }
+ };
+
+ // m_Layer.m_Camera->CalculateViewProjectionMatrix(m_ViewProjection);
+ void
+ SLayerRenderPreparationData::PrepareForRender(const QSize &inViewportDimensions)
+ {
+ SStackPerfTimer __timer(m_Renderer.GetQt3DSContext().GetPerfTimer(),
+ "SLayerRenderData::PrepareForRender");
+ if (m_LayerPrepResult.hasValue())
+ return;
+
+ m_Features.clear();
+ m_FeatureSetHash = 0;
+ QT3DSVec2 thePresentationDimensions((QT3DSF32)inViewportDimensions.width(),
+ (QT3DSF32)inViewportDimensions.height());
+ IRenderList &theGraph(m_Renderer.GetQt3DSContext().GetRenderList());
+ NVRenderRect theViewport(theGraph.GetViewport());
+ NVRenderRect theScissor(theGraph.GetViewport());
+ if (theGraph.IsScissorTestEnabled())
+ theScissor = m_Renderer.GetContext().GetScissorRect();
+ bool wasDirty = false;
+ bool wasDataDirty = false;
+ wasDirty = m_Layer.m_Flags.IsDirty();
+ // The first pass is just to render the data.
+ QT3DSU32 maxNumAAPasses = m_Layer.m_ProgressiveAAMode == AAModeValues::NoAA
+ ? (QT3DSU32)0
+ : (QT3DSU32)(m_Layer.m_ProgressiveAAMode) + 1;
+ maxNumAAPasses = NVMin((QT3DSU32)(MAX_AA_LEVELS + 1), maxNumAAPasses);
+ SEffect *theLastEffect = NULL;
+ // Uncomment the line below to disable all progressive AA.
+ // maxNumAAPasses = 0;
+
+ SLayerRenderPreparationResult thePrepResult;
+ bool hasOffscreenRenderer = GetOffscreenRenderer();
+
+ bool SSAOEnabled = (m_Layer.m_AoStrength > 0.0f && m_Layer.m_AoDistance > 0.0f);
+ bool SSDOEnabled = (m_Layer.m_ShadowStrength > 0.0f && m_Layer.m_ShadowDist > 0.0f);
+ SetShaderFeature("QT3DS_ENABLE_SSAO", SSAOEnabled);
+ SetShaderFeature("QT3DS_ENABLE_SSDO", SSDOEnabled);
+ bool requiresDepthPrepass = (hasOffscreenRenderer == false) && (SSAOEnabled || SSDOEnabled);
+ SetShaderFeature("QT3DS_ENABLE_SSM", false); // by default no shadow map generation
+
+ if (m_Layer.m_Flags.IsActive()) {
+ // Get the layer's width and height.
+ IEffectSystem &theEffectSystem(m_Renderer.GetQt3DSContext().GetEffectSystem());
+ for (SEffect *theEffect = m_Layer.m_FirstEffect; theEffect;
+ theEffect = theEffect->m_NextEffect) {
+ if (theEffect->m_Flags.IsDirty()) {
+ wasDirty = true;
+ theEffect->m_Flags.SetDirty(false);
+ }
+ if (theEffect->m_Flags.IsActive()) {
+ // If the effect uses subpresentations, those have to be rendered before
+ // the effect itself
+ theEffectSystem.renderSubpresentations(*theEffect);
+ theLastEffect = theEffect;
+ if (hasOffscreenRenderer == false
+ && theEffectSystem.DoesEffectRequireDepthTexture(theEffect->m_ClassName))
+ requiresDepthPrepass = true;
+ }
+ }
+ if (m_Layer.m_Flags.IsDirty()) {
+ wasDirty = true;
+ m_Layer.CalculateGlobalVariables();
+ }
+
+ bool shouldRenderToTexture = true;
+
+ if (hasOffscreenRenderer) {
+ // We don't render to texture with offscreen renderers, we just render them to the
+ // viewport.
+ shouldRenderToTexture = false;
+ // Progaa disabled when using offscreen rendering.
+ maxNumAAPasses = 0;
+ }
+
+ thePrepResult = SLayerRenderPreparationResult(SLayerRenderHelper(
+ theViewport, theScissor, m_Layer.m_Scene->m_Presentation->m_PresentationDimensions,
+ m_Layer, shouldRenderToTexture, m_Renderer.GetQt3DSContext().GetScaleMode(),
+ m_Renderer.GetQt3DSContext().GetPresentationScaleFactor()));
+ thePrepResult.m_LastEffect = theLastEffect;
+ thePrepResult.m_MaxAAPassIndex = maxNumAAPasses;
+ thePrepResult.m_Flags.SetRequiresDepthTexture(requiresDepthPrepass
+ || NeedsWidgetTexture());
+ thePrepResult.m_Flags.SetShouldRenderToTexture(shouldRenderToTexture);
+ if (m_Renderer.GetContext().GetRenderContextType() != NVRenderContextValues::GLES2)
+ thePrepResult.m_Flags.SetRequiresSsaoPass(SSAOEnabled);
+
+ if (thePrepResult.IsLayerVisible()) {
+ if (shouldRenderToTexture) {
+ m_Renderer.GetQt3DSContext().GetRenderList().AddRenderTask(
+ CreateRenderToTextureRunnable());
+ }
+ if (m_Layer.m_LightProbe && CheckLightProbeDirty(*m_Layer.m_LightProbe)) {
+ m_Renderer.PrepareImageForIbl(*m_Layer.m_LightProbe);
+ wasDataDirty = true;
+ }
+
+ bool lightProbeValid = HasValidLightProbe(m_Layer.m_LightProbe);
+
+ SetShaderFeature("QT3DS_ENABLE_LIGHT_PROBE", lightProbeValid);
+ SetShaderFeature("QT3DS_ENABLE_IBL_FOV", m_Layer.m_ProbeFov < 180.0f);
+
+ if (lightProbeValid && m_Layer.m_LightProbe2
+ && CheckLightProbeDirty(*m_Layer.m_LightProbe2)) {
+ m_Renderer.PrepareImageForIbl(*m_Layer.m_LightProbe2);
+ wasDataDirty = true;
+ }
+
+ SetShaderFeature("QT3DS_ENABLE_LIGHT_PROBE_2",
+ lightProbeValid && HasValidLightProbe(m_Layer.m_LightProbe2));
+
+ // Push nodes in reverse depth first order
+ if (m_RenderableNodes.empty()) {
+ m_CamerasAndLights.clear();
+ QT3DSU32 dfsIndex = 0;
+ for (SNode *theChild = m_Layer.m_FirstChild; theChild;
+ theChild = theChild->m_NextSibling)
+ MaybeQueueNodeForRender(*theChild, m_RenderableNodes, m_CamerasAndLights,
+ dfsIndex);
+ reverse(m_CamerasAndLights.begin(), m_CamerasAndLights.end());
+ reverse(m_RenderableNodes.begin(), m_RenderableNodes.end());
+ m_LightToNodeMap.clear();
+ }
+ m_Camera = NULL;
+ m_Lights.clear();
+ m_OpaqueObjects.clear();
+ m_TransparentObjects.clear();
+ nvvector<SLightNodeMarker> theLightNodeMarkers(m_Renderer.GetPerFrameAllocator(),
+ "LightNodeMarkers");
+ m_SourceLightDirections.clear();
+
+ for (QT3DSU32 idx = 0, end = m_CamerasAndLights.size(); idx < end; ++idx) {
+ SNode *theNode(m_CamerasAndLights[idx]);
+ wasDataDirty = wasDataDirty || theNode->m_Flags.IsDirty();
+ switch (theNode->m_Type) {
+ case GraphObjectTypes::Camera: {
+ SCamera *theCamera = static_cast<SCamera *>(theNode);
+ if (theCamera->m_Flags.IsActive()) {
+ // Only proceed with camera nodes which are currently active.
+ // SetupCameraForRender() sets the camera used for picking and
+ // updates global state e.g. IsGloballyActive()
+ SCameraGlobalCalculationResult theResult =
+ thePrepResult.SetupCameraForRender(*theCamera);
+ wasDataDirty = wasDataDirty || theResult.m_WasDirty;
+ if (theCamera->m_Flags.IsGloballyActive())
+ m_Camera = theCamera;
+ if (theResult.m_ComputeFrustumSucceeded == false) {
+ qCCritical(INTERNAL_ERROR, "Failed to calculate camera frustum");
+ }
+ }
+ } break;
+ case GraphObjectTypes::Light: {
+ SLight *theLight = static_cast<SLight *>(theNode);
+ bool lightResult = theLight->CalculateGlobalVariables();
+ wasDataDirty = lightResult || wasDataDirty;
+ // Note we setup the light index such that it is completely invariant of if
+ // the
+ // light is active or scoped.
+ QT3DSU32 lightIndex = (QT3DSU32)m_SourceLightDirections.size();
+ m_SourceLightDirections.push_back(QT3DSVec3(0.0f));
+ // Note we still need a light check when building the renderable light list.
+ // We also cannot cache shader-light bindings based on layers any more
+ // because
+ // the number of lights for a given renderable does not depend on the layer
+ // as it used to but
+ // additional perhaps on the light's scoping rules.
+ if (theLight->m_Flags.IsGloballyActive()) {
+ if (theLight->m_Scope == NULL) {
+ m_Lights.push_back(theLight);
+ if (m_Renderer.GetContext().GetRenderContextType()
+ != NVRenderContextValues::GLES2
+ && theLight->m_CastShadow && GetShadowMapManager()) {
+ // PKC -- use of "res" as an exponent of two is an annoying
+ // artifact of the XML interface
+ // I'll change this with an enum interface later on, but that's
+ // less important right now.
+ QT3DSU32 mapSize = 1 << theLight->m_ShadowMapRes;
+ ShadowMapModes::Enum mapMode =
+ (theLight->m_LightType != RenderLightTypes::Directional)
+ ? ShadowMapModes::CUBE
+ : ShadowMapModes::VSM;
+ m_ShadowMapManager->AddShadowMapEntry(
+ m_Lights.size() - 1, mapSize, mapSize,
+ NVRenderTextureFormats::R16F, 1, mapMode,
+ ShadowFilterValues::NONE);
+ thePrepResult.m_Flags.SetRequiresShadowMapPass(true);
+ SetShaderFeature("QT3DS_ENABLE_SSM", true);
+ }
+ }
+ TLightToNodeMap::iterator iter =
+ m_LightToNodeMap.insert(eastl::make_pair(theLight, (SNode *)NULL))
+ .first;
+ SNode *oldLightScope = iter->second;
+ SNode *newLightScope = theLight->m_Scope;
+
+ if (oldLightScope != newLightScope) {
+ iter->second = newLightScope;
+ if (oldLightScope)
+ theLightNodeMarkers.push_back(SLightNodeMarker(
+ *theLight, lightIndex, *oldLightScope, false));
+ if (newLightScope)
+ theLightNodeMarkers.push_back(SLightNodeMarker(
+ *theLight, lightIndex, *newLightScope, true));
+ }
+ if (newLightScope) {
+ m_SourceLightDirections.back() =
+ theLight->GetScalingCorrectDirection();
+ }
+ }
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ }
+
+ if (theLightNodeMarkers.empty() == false) {
+ for (QT3DSU32 idx = 0, end = m_RenderableNodes.size(); idx < end; ++idx) {
+ SRenderableNodeEntry &theNodeEntry(m_RenderableNodes[idx]);
+ QT3DSU32 nodeDFSIndex = theNodeEntry.m_Node->m_DFSIndex;
+ for (QT3DSU32 markerIdx = 0, markerEnd = theLightNodeMarkers.size();
+ markerIdx < markerEnd; ++markerIdx) {
+ SLightNodeMarker &theMarker = theLightNodeMarkers[markerIdx];
+ if (nodeDFSIndex >= theMarker.m_FirstValidIndex
+ && nodeDFSIndex < theMarker.m_JustPastLastValidIndex) {
+ if (theMarker.m_AddOrRemove) {
+ SNodeLightEntry *theNewEntry =
+ m_RenderableNodeLightEntryPool.construct(
+ theMarker.m_Light, theMarker.m_LightIndex, __FILE__,
+ __LINE__);
+ theNodeEntry.m_Lights.push_back(*theNewEntry);
+ } else {
+ for (TNodeLightEntryList::iterator
+ lightIter = theNodeEntry.m_Lights.begin(),
+ lightEnd = theNodeEntry.m_Lights.end();
+ lightIter != lightEnd; ++lightIter) {
+ if (lightIter->m_Light == theMarker.m_Light) {
+ SNodeLightEntry &theEntry = *lightIter;
+ theNodeEntry.m_Lights.remove(theEntry);
+ m_RenderableNodeLightEntryPool.deallocate(&theEntry);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ QT3DSF32 theTextScaleFactor = 1.0f;
+ if (m_Camera) {
+ m_Camera->CalculateViewProjectionMatrix(m_ViewProjection);
+ theTextScaleFactor = m_Camera->GetTextScaleFactor(
+ thePrepResult.GetLayerToPresentationViewport(),
+ thePrepResult.GetPresentationDesignDimensions());
+ SClipPlane nearPlane;
+ QT3DSMat33 theUpper33(m_Camera->m_GlobalTransform.getUpper3x3InverseTranspose());
+
+ QT3DSVec3 dir(theUpper33.transform(QT3DSVec3(0, 0, -1)));
+ dir.normalize();
+ nearPlane.normal = dir;
+ QT3DSVec3 theGlobalPos = m_Camera->GetGlobalPos() + m_Camera->m_ClipNear * dir;
+ nearPlane.d = -(dir.dot(theGlobalPos));
+ // the near plane's bbox edges are calculated in the clipping frustum's
+ // constructor.
+ m_ClippingFrustum = SClippingFrustum(m_ViewProjection, nearPlane);
+ } else {
+ m_ViewProjection = QT3DSMat44::createIdentity();
+ }
+
+ // Setup the light directions here.
+
+ for (QT3DSU32 lightIdx = 0, lightEnd = m_Lights.size(); lightIdx < lightEnd;
+ ++lightIdx) {
+ m_LightDirections.push_back(m_Lights[lightIdx]->GetScalingCorrectDirection());
+ }
+
+ m_ModelContexts.clear();
+ if (GetOffscreenRenderer() == false) {
+ bool renderablesDirty =
+ PrepareRenderablesForRender(m_ViewProjection,
+ m_ClippingFrustum,
+ theTextScaleFactor, thePrepResult.m_Flags);
+ wasDataDirty = wasDataDirty || renderablesDirty;
+ if (thePrepResult.m_Flags.RequiresStencilBuffer())
+ thePrepResult.m_Flags.SetShouldRenderToTexture(true);
+ } else {
+ NVRenderRect theViewport =
+ thePrepResult.GetLayerToPresentationViewport().ToIntegerRect();
+ bool theScissor = true;
+ NVRenderRect theScissorRect =
+ thePrepResult.GetLayerToPresentationScissorRect().ToIntegerRect();
+ // This happens here because if there are any fancy render steps
+ IRenderList &theRenderList(m_Renderer.GetQt3DSContext().GetRenderList());
+ NVRenderContext &theContext(m_Renderer.GetContext());
+ SRenderListScopedProperty<bool> _listScissorEnabled(
+ theRenderList, &IRenderList::IsScissorTestEnabled,
+ &IRenderList::SetScissorTestEnabled, theScissor);
+ SRenderListScopedProperty<NVRenderRect> _listViewport(
+ theRenderList, &IRenderList::GetViewport, &IRenderList::SetViewport,
+ theViewport);
+ SRenderListScopedProperty<NVRenderRect> _listScissor(
+ theRenderList, &IRenderList::GetScissor, &IRenderList::SetScissorRect,
+ theScissorRect);
+ // Some plugins don't use the render list so they need the actual gl context
+ // setup.
+ qt3ds::render::NVRenderContextScopedProperty<bool> __scissorEnabled(
+ theContext, &NVRenderContext::IsScissorTestEnabled,
+ &NVRenderContext::SetScissorTestEnabled, true);
+ qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __scissorRect(
+ theContext, &NVRenderContext::GetScissorRect,
+ &NVRenderContext::SetScissorRect, theScissorRect);
+ qt3ds::render::NVRenderContextScopedProperty<NVRenderRect> __viewportRect(
+ theContext, &NVRenderContext::GetViewport, &NVRenderContext::SetViewport,
+ theViewport);
+ SOffscreenRenderFlags theResult = m_LastFrameOffscreenRenderer->NeedsRender(
+ CreateOffscreenRenderEnvironment(),
+ m_Renderer.GetQt3DSContext().GetPresentationScaleFactor(), &m_Layer);
+ wasDataDirty = wasDataDirty || theResult.m_HasChangedSinceLastFrame;
+ }
+ }
+ }
+ wasDirty = wasDirty || wasDataDirty;
+ thePrepResult.m_Flags.SetWasDirty(wasDirty);
+ thePrepResult.m_Flags.SetLayerDataDirty(wasDataDirty);
+
+ m_LayerPrepResult = thePrepResult;
+
+ // Per-frame cache of renderable objects post-sort.
+ GetOpaqueRenderableObjects();
+ // If layer depth test is false, this may also contain opaque objects.
+ GetTransparentRenderableObjects();
+
+ GetCameraDirection();
+ }
+
+ void SLayerRenderPreparationData::ResetForFrame()
+ {
+ m_TransparentObjects.clear_unsafe();
+ m_OpaqueObjects.clear_unsafe();
+ m_LayerPrepResult.setEmpty();
+ // The check for if the camera is or is not null is used
+ // to figure out if this layer was rendered at all.
+ m_Camera = NULL;
+ m_LastFrameOffscreenRenderer = NULL;
+ m_IRenderWidgets.clear_unsafe();
+ m_CameraDirection.setEmpty();
+ m_LightDirections.clear_unsafe();
+ m_RenderedOpaqueObjects.clear_unsafe();
+ m_RenderedTransparentObjects.clear_unsafe();
+ }
+}
+}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h
new file mode 100644
index 0000000..5b8d6e1
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplLayerRenderPreparationData.h
@@ -0,0 +1,367 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDERER_IMPL_LAYER_RENDER_PREPARATION_DATA_H
+#define QT3DS_RENDERER_IMPL_LAYER_RENDER_PREPARATION_DATA_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSFlags.h"
+#include "Qt3DSRendererImplLayerRenderHelper.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderableObjects.h"
+#include "Qt3DSRenderClippingFrustum.h"
+#include "Qt3DSRenderResourceTexture2D.h"
+#include "Qt3DSOffscreenRenderManager.h"
+#include "Qt3DSRenderProfiler.h"
+#include "Qt3DSRenderShadowMap.h"
+#include "foundation/Qt3DSPool.h"
+#include "Qt3DSRenderableObjects.h"
+
+namespace qt3ds {
+namespace render {
+ struct SLayerRenderData;
+ class Qt3DSRendererImpl;
+ struct SRenderableObject;
+
+ struct LayerRenderPreparationResultFlagValues
+ {
+ enum Enum {
+ // Was the data in this layer dirty (meaning re-render to texture, possibly)
+ WasLayerDataDirty = 1,
+ // Was the data in this layer dirty *or* this layer *or* any effect dirty.
+ WasDirty = 1 << 1,
+ // An effect or flag or rotation on the layer dictates this object should
+ // render to the texture.
+ ShouldRenderToTexture = 1 << 2,
+ // Some effects require depth texturing, this should be set on the effect
+ // instance.
+ RequiresDepthTexture = 1 << 3,
+
+ // Should create independent viewport
+ // If we aren't rendering to texture we still may have width/height manipulations
+ // that require our own viewport.
+ ShouldCreateIndependentViewport = 1 << 4,
+
+ // SSAO should be done in a separate pass
+ // Note that having an AO pass necessitates a DepthTexture so this flag should
+ // never be set without the RequiresDepthTexture flag as well.
+ RequiresSsaoPass = 1 << 5,
+
+ // if some light cause shadow
+ // we need a separate per light shadow map pass
+ RequiresShadowMapPass = 1 << 6,
+
+ // Currently we use a stencil-cover algorithm to render bezier curves.
+ RequiresStencilBuffer = 1 << 7
+ };
+ };
+
+ struct SLayerRenderPreparationResultFlags
+ : public NVFlags<LayerRenderPreparationResultFlagValues::Enum, QT3DSU32>
+ {
+ bool WasLayerDataDirty() const
+ {
+ return this->operator&(LayerRenderPreparationResultFlagValues::WasLayerDataDirty);
+ }
+ void SetLayerDataDirty(bool inValue)
+ {
+ clearOrSet(inValue, LayerRenderPreparationResultFlagValues::WasLayerDataDirty);
+ }
+
+ bool WasDirty() const
+ {
+ return this->operator&(LayerRenderPreparationResultFlagValues::WasDirty);
+ }
+ void SetWasDirty(bool inValue)
+ {
+ clearOrSet(inValue, LayerRenderPreparationResultFlagValues::WasDirty);
+ }
+
+ bool ShouldRenderToTexture() const
+ {
+ return this->operator&(LayerRenderPreparationResultFlagValues::ShouldRenderToTexture);
+ }
+ void SetShouldRenderToTexture(bool inValue)
+ {
+ clearOrSet(inValue, LayerRenderPreparationResultFlagValues::ShouldRenderToTexture);
+ }
+
+ bool RequiresDepthTexture() const
+ {
+ return this->operator&(LayerRenderPreparationResultFlagValues::RequiresDepthTexture);
+ }
+ void SetRequiresDepthTexture(bool inValue)
+ {
+ clearOrSet(inValue, LayerRenderPreparationResultFlagValues::RequiresDepthTexture);
+ }
+
+ bool ShouldCreateIndependentViewport() const
+ {
+ return this->operator&(
+ LayerRenderPreparationResultFlagValues::ShouldCreateIndependentViewport);
+ }
+ void SetShouldCreateIndependentViewport(bool inValue)
+ {
+ clearOrSet(inValue,
+ LayerRenderPreparationResultFlagValues::ShouldCreateIndependentViewport);
+ }
+
+ bool RequiresSsaoPass() const
+ {
+ return this->operator&(LayerRenderPreparationResultFlagValues::RequiresSsaoPass);
+ }
+ void SetRequiresSsaoPass(bool inValue)
+ {
+ clearOrSet(inValue, LayerRenderPreparationResultFlagValues::RequiresSsaoPass);
+ }
+
+ bool RequiresShadowMapPass() const
+ {
+ return this->operator&(LayerRenderPreparationResultFlagValues::RequiresShadowMapPass);
+ }
+ void SetRequiresShadowMapPass(bool inValue)
+ {
+ clearOrSet(inValue, LayerRenderPreparationResultFlagValues::RequiresShadowMapPass);
+ }
+
+ bool RequiresStencilBuffer() const
+ {
+ return this->operator&(LayerRenderPreparationResultFlagValues::RequiresStencilBuffer);
+ }
+ void SetRequiresStencilBuffer(bool inValue)
+ {
+ clearOrSet(inValue, LayerRenderPreparationResultFlagValues::RequiresStencilBuffer);
+ }
+ };
+
+ struct SLayerRenderPreparationResult : public SLayerRenderHelper
+ {
+ SEffect *m_LastEffect;
+ SLayerRenderPreparationResultFlags m_Flags;
+ QT3DSU32 m_MaxAAPassIndex;
+ SLayerRenderPreparationResult()
+ : m_LastEffect(NULL)
+ , m_MaxAAPassIndex(0)
+ {
+ }
+ SLayerRenderPreparationResult(const SLayerRenderHelper &inHelper)
+ : SLayerRenderHelper(inHelper)
+ , m_LastEffect(NULL)
+ , m_MaxAAPassIndex(0)
+ {
+ }
+ };
+
+ struct SRenderableNodeEntry
+ {
+ SNode *m_Node;
+ TNodeLightEntryList m_Lights;
+ SRenderableNodeEntry()
+ : m_Node(NULL)
+ {
+ }
+ SRenderableNodeEntry(SNode &inNode)
+ : m_Node(&inNode)
+ {
+ }
+ };
+
+ struct SScopedLightsListScope
+ {
+ nvvector<SLight *> &m_LightsList;
+ nvvector<QT3DSVec3> &m_LightDirList;
+ QT3DSU32 m_ListOriginalSize;
+ SScopedLightsListScope(nvvector<SLight *> &inLights, nvvector<QT3DSVec3> &inDestLightDirList,
+ nvvector<QT3DSVec3> &inSrcLightDirList,
+ TNodeLightEntryList &inScopedLights)
+ : m_LightsList(inLights)
+ , m_LightDirList(inDestLightDirList)
+ , m_ListOriginalSize(m_LightsList.size())
+ {
+ for (TNodeLightEntryList::iterator iter = inScopedLights.begin(),
+ end = inScopedLights.end();
+ iter != end; ++iter) {
+ m_LightsList.push_back(iter->m_Light);
+ m_LightDirList.push_back(inSrcLightDirList[iter->m_LightIndex]);
+ }
+ }
+ ~SScopedLightsListScope()
+ {
+ m_LightsList.resize(m_ListOriginalSize);
+ m_LightDirList.resize(m_ListOriginalSize);
+ }
+ };
+
+ struct SDefaultMaterialPreparationResult
+ {
+ SRenderableImage *m_FirstImage;
+ QT3DSF32 m_Opacity;
+ SRenderableObjectFlags m_RenderableFlags;
+ SShaderDefaultMaterialKey m_MaterialKey;
+ bool m_Dirty;
+
+ SDefaultMaterialPreparationResult(SShaderDefaultMaterialKey inMaterialKey);
+ };
+
+ // Data used strictly in the render preparation step.
+ struct SLayerRenderPreparationData
+ {
+ typedef void (*TRenderRenderableFunction)(SLayerRenderData &inData,
+ SRenderableObject &inObject,
+ const QT3DSVec2 &inCameraProps,
+ TShaderFeatureSet inShaderFeatures,
+ QT3DSU32 lightIndex, const SCamera &inCamera);
+ typedef nvhash_map<SLight *, SNode *> TLightToNodeMap;
+ typedef Pool<SNodeLightEntry, ForwardingAllocator> TNodeLightEntryPoolType;
+
+ enum Enum {
+ MAX_AA_LEVELS = 8,
+ MAX_TEMPORAL_AA_LEVELS = 2,
+ };
+
+ SLayer &m_Layer;
+ Qt3DSRendererImpl &m_Renderer;
+ NVAllocatorCallback &m_Allocator;
+ // List of nodes we can render, not all may be active. Found by doing a depth-first
+ // search through m_FirstChild if length is zero.
+
+ TNodeLightEntryPoolType m_RenderableNodeLightEntryPool;
+ nvvector<SRenderableNodeEntry> m_RenderableNodes;
+ TLightToNodeMap m_LightToNodeMap; // map of lights to nodes to cache if we have looked up a
+ // given scoped light yet.
+ // Built at the same time as the renderable nodes map.
+ // these are processed so they are available when the shaders for the models
+ // are being generated.
+ nvvector<SNode *> m_CamerasAndLights;
+
+ // Results of prepare for render.
+ SCamera *m_Camera;
+ nvvector<SLight *> m_Lights; // Only contains lights that are global.
+ TRenderableObjectList m_OpaqueObjects;
+ TRenderableObjectList m_TransparentObjects;
+ // Sorted lists of the rendered objects. There may be other transforms applied so
+ // it is simplest to duplicate the lists.
+ TRenderableObjectList m_RenderedOpaqueObjects;
+ TRenderableObjectList m_RenderedTransparentObjects;
+ QT3DSMat44 m_ViewProjection;
+ SClippingFrustum m_ClippingFrustum;
+ Option<SLayerRenderPreparationResult> m_LayerPrepResult;
+ // Widgets drawn at particular times during the rendering process
+ nvvector<IRenderWidget *> m_IRenderWidgets;
+ Option<QT3DSVec3> m_CameraDirection;
+ // Scoped lights need a level of indirection into a light direction list. The source light
+ // directions list is as long as there are lights on the layer. It holds invalid
+ // information for
+ // any lights that are not both active and scoped; but the relative position for a given
+ // light
+ // in this list is completely constant and immutable; this relative position is saved on a
+ // structure
+ // and used when looking up the light direction for a given light.
+ nvvector<QT3DSVec3> m_SourceLightDirections;
+ nvvector<QT3DSVec3> m_LightDirections;
+ TModelContextPtrList m_ModelContexts;
+ NVScopedRefCounted<IOffscreenRenderer> m_LastFrameOffscreenRenderer;
+
+ eastl::vector<SShaderPreprocessorFeature> m_Features;
+ CRegisteredString m_CGLightingFeatureName;
+ bool m_FeaturesDirty;
+ size_t m_FeatureSetHash;
+ bool m_TooManyLightsError;
+
+ // shadow mapps
+ NVScopedRefCounted<Qt3DSShadowMap> m_ShadowMapManager;
+
+ SLayerRenderPreparationData(SLayer &inLayer, Qt3DSRendererImpl &inRenderer);
+ virtual ~SLayerRenderPreparationData();
+ bool GetOffscreenRenderer();
+ bool GetShadowMapManager();
+ bool NeedsWidgetTexture() const;
+
+ SShaderDefaultMaterialKey GenerateLightingKey(DefaultMaterialLighting::Enum inLightingType);
+
+ void PrepareImageForRender(SImage &inImage, ImageMapTypes::Enum inMapType,
+ SRenderableImage *&ioFirstImage, SRenderableImage *&ioNextImage,
+ SRenderableObjectFlags &ioFlags,
+ SShaderDefaultMaterialKey &ioGeneratedShaderKey,
+ QT3DSU32 inImageIndex);
+
+ SDefaultMaterialPreparationResult
+ PrepareDefaultMaterialForRender(SDefaultMaterial &inMaterial,
+ SRenderableObjectFlags &inExistingFlags, QT3DSF32 inOpacity,
+ bool inClearMaterialFlags);
+
+ SDefaultMaterialPreparationResult
+ PrepareCustomMaterialForRender(SCustomMaterial &inMaterial,
+ SRenderableObjectFlags &inExistingFlags, QT3DSF32 inOpacity);
+
+ bool PrepareModelForRender(SModel &inModel, const QT3DSMat44 &inViewProjection,
+ const Option<SClippingFrustum> &inClipFrustum,
+ TNodeLightEntryList &inScopedLights);
+
+ bool PrepareTextForRender(SText &inText, const QT3DSMat44 &inViewProjection,
+ QT3DSF32 inTextScaleFactor,
+ SLayerRenderPreparationResultFlags &ioFlags);
+ bool PreparePathForRender(SPath &inPath, const QT3DSMat44 &inViewProjection,
+ const Option<SClippingFrustum> &inClipFrustum,
+ SLayerRenderPreparationResultFlags &ioFlags);
+ // Helper function used during PRepareForRender and PrepareAndRender
+ bool PrepareRenderablesForRender(const QT3DSMat44 &inViewProjection,
+ const Option<SClippingFrustum> &inClipFrustum,
+ QT3DSF32 inTextScaleFactor,
+ SLayerRenderPreparationResultFlags &ioFlags);
+
+ // returns true if this object will render something different than it rendered the last
+ // time.
+ virtual void PrepareForRender(const QSize &inViewportDimensions);
+ bool CheckLightProbeDirty(SImage &inLightProbe);
+ void AddRenderWidget(IRenderWidget &inWidget);
+ void SetShaderFeature(const char *inName, bool inValue);
+ void SetShaderFeature(CRegisteredString inName, bool inValue);
+ NVConstDataRef<SShaderPreprocessorFeature> GetShaderFeatureSet();
+ size_t GetShaderFeatureSetHash();
+ // The graph object is not const because this traversal updates dirty state on the objects.
+ eastl::pair<bool, SGraphObject *> ResolveReferenceMaterial(SGraphObject *inMaterial);
+
+ QT3DSVec3 GetCameraDirection();
+ // Per-frame cache of renderable objects post-sort.
+ NVDataRef<SRenderableObject *> GetOpaqueRenderableObjects();
+ // If layer depth test is false, this may also contain opaque objects.
+ NVDataRef<SRenderableObject *> GetTransparentRenderableObjects();
+
+ virtual void ResetForFrame();
+
+ // The render list and gl context are setup for what the embedded item will
+ // need.
+ virtual SOffscreenRendererEnvironment CreateOffscreenRenderEnvironment() = 0;
+
+ virtual IRenderTask &CreateRenderToTextureRunnable() = 0;
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
new file mode 100644
index 0000000..a3d3fab
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.cpp
@@ -0,0 +1,3007 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRendererImpl.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "Qt3DSRenderLight.h"
+#include "Qt3DSRenderContextCore.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderDynamicObjectSystem.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+#include "Qt3DSVertexPipelineImpl.h"
+
+// This adds support for the depth buffers in the shader so we can do depth
+// texture-based effects.
+#define QT3DS_RENDER_SUPPORT_DEPTH_TEXTURE 1
+
+namespace qt3ds {
+namespace render {
+
+ void STextShader::Render(NVRenderTexture2D &inTexture,
+ const STextScaleAndOffset &inScaleAndOffset, const QT3DSVec4 &inTextColor,
+ const QT3DSMat44 &inMVP, const QT3DSVec2 &inCameraVec,
+ NVRenderContext &inRenderContext,
+ NVRenderInputAssembler &inInputAssemblerBuffer, QT3DSU32 count,
+ const STextTextureDetails &inTextTextureDetails,
+ const QT3DSVec3 &inBackgroundColor)
+ {
+ inRenderContext.SetCullingEnabled(false);
+ inRenderContext.SetActiveShader(&m_Shader);
+ m_MVP.Set(inMVP);
+ m_Sampler.Set(&inTexture);
+ m_TextColor.Set(inTextColor);
+ m_Dimensions.Set(QT3DSVec4(inScaleAndOffset.m_TextScale.x, inScaleAndOffset.m_TextScale.y,
+ inScaleAndOffset.m_TextOffset.x, inScaleAndOffset.m_TextOffset.y));
+ m_CameraProperties.Set(inCameraVec);
+ STextureDetails theTextureDetails = inTexture.GetTextureDetails();
+ QT3DSF32 theWidthScale =
+ (QT3DSF32)inTextTextureDetails.m_TextWidth / (QT3DSF32)theTextureDetails.m_Width;
+ QT3DSF32 theHeightScale =
+ (QT3DSF32)inTextTextureDetails.m_TextHeight / (QT3DSF32)theTextureDetails.m_Height;
+ m_BackgroundColor.Set(inBackgroundColor);
+
+ m_TextDimensions.Set(
+ QT3DSVec3(theWidthScale, theHeightScale, inTextTextureDetails.m_FlipY ? 1.0f : 0.0f));
+ inRenderContext.SetInputAssembler(&inInputAssemblerBuffer);
+ inRenderContext.Draw(NVRenderDrawMode::Triangles, count, 0);
+ }
+
+ void STextShader::RenderPath(NVRenderPathFontItem &inPathFontItem,
+ NVRenderPathFontSpecification &inPathFontSpec,
+ const STextScaleAndOffset &inScaleAndOffset,
+ const QT3DSVec4 &inTextColor, const QT3DSMat44 &inViewProjection,
+ const QT3DSMat44 &inModel, const QT3DSVec2 &,
+ NVRenderContext &inRenderContext,
+ const STextTextureDetails &inTextTextureDetails,
+ const QT3DSVec3 &inBackgroundColor)
+ {
+ qt3ds::render::NVRenderBoolOp::Enum theDepthFunction = inRenderContext.GetDepthFunction();
+ bool isDepthEnabled = inRenderContext.IsDepthTestEnabled();
+ bool isStencilEnabled = inRenderContext.IsStencilTestEnabled();
+ bool isDepthWriteEnabled = inRenderContext.IsDepthWriteEnabled();
+ qt3ds::render::NVRenderStencilFunctionArgument theArg(qt3ds::render::NVRenderBoolOp::NotEqual, 0,
+ 0xFF);
+ qt3ds::render::NVRenderStencilOperationArgument theOpArg(qt3ds::render::NVRenderStencilOp::Keep,
+ qt3ds::render::NVRenderStencilOp::Keep,
+ qt3ds::render::NVRenderStencilOp::Zero);
+ NVScopedRefCounted<NVRenderDepthStencilState> depthStencilState =
+ inRenderContext.CreateDepthStencilState(isDepthEnabled, isDepthWriteEnabled,
+ theDepthFunction, false, theArg, theArg,
+ theOpArg, theOpArg);
+
+ inRenderContext.SetActiveShader(NULL);
+ inRenderContext.SetCullingEnabled(false);
+
+ inRenderContext.SetDepthStencilState(depthStencilState);
+
+ // setup transform
+ QT3DSMat44 offsetMatrix = QT3DSMat44::createIdentity();
+ offsetMatrix.setPosition(QT3DSVec3(
+ inScaleAndOffset.m_TextOffset.x - (QT3DSF32)inTextTextureDetails.m_TextWidth / 2.0f,
+ inScaleAndOffset.m_TextOffset.y - (QT3DSF32)inTextTextureDetails.m_TextHeight / 2.0f,
+ 0.0));
+
+ QT3DSMat44 pathMatrix = inPathFontItem.GetTransform();
+
+ inRenderContext.SetPathProjectionMatrix(inViewProjection);
+ inRenderContext.SetPathModelViewMatrix(inModel * offsetMatrix * pathMatrix);
+
+ // first pass
+ inPathFontSpec.StencilFillPathInstanced(inPathFontItem);
+
+ // second pass
+ inRenderContext.SetActiveProgramPipeline(m_ProgramPipeline);
+ m_TextColor.Set(inTextColor);
+ m_BackgroundColor.Set(inBackgroundColor);
+
+ inRenderContext.SetStencilTestEnabled(true);
+ inPathFontSpec.CoverFillPathInstanced(inPathFontItem);
+
+ inRenderContext.SetStencilTestEnabled(isStencilEnabled);
+ inRenderContext.SetDepthFunction(theDepthFunction);
+
+ inRenderContext.SetActiveProgramPipeline(NULL);
+ }
+
+ void STextShader::Render2D(NVRenderTexture2D &inTexture, const QT3DSVec4 &inTextColor,
+ const QT3DSMat44 &inMVP, NVRenderContext &inRenderContext,
+ NVRenderInputAssembler &inInputAssemblerBuffer, QT3DSU32 count,
+ QT3DSVec2 inVertexOffsets)
+ {
+ // inRenderContext.SetCullingEnabled( false );
+ inRenderContext.SetBlendingEnabled(true);
+ inRenderContext.SetDepthWriteEnabled(false);
+ inRenderContext.SetDepthTestEnabled(false);
+
+ inRenderContext.SetActiveShader(&m_Shader);
+
+ qt3ds::render::NVRenderBlendFunctionArgument blendFunc(
+ NVRenderSrcBlendFunc::SrcAlpha, NVRenderDstBlendFunc::OneMinusSrcAlpha,
+ NVRenderSrcBlendFunc::One, NVRenderDstBlendFunc::One);
+ qt3ds::render::NVRenderBlendEquationArgument blendEqu(NVRenderBlendEquation::Add,
+ NVRenderBlendEquation::Add);
+
+ inRenderContext.SetBlendFunction(blendFunc);
+ inRenderContext.SetBlendEquation(blendEqu);
+
+ m_MVP.Set(inMVP);
+ m_Sampler.Set(&inTexture);
+ m_TextColor.Set(inTextColor);
+ m_VertexOffsets.Set(inVertexOffsets);
+
+ inRenderContext.SetInputAssembler(&inInputAssemblerBuffer);
+ inRenderContext.Draw(NVRenderDrawMode::Triangles, count, 0);
+ }
+
+ using eastl::make_pair;
+
+ static inline void AddVertexDepth(SShaderVertexCodeGenerator &vertexShader)
+ {
+ // near plane, far plane
+ vertexShader.AddInclude("viewProperties.glsllib");
+ vertexShader.AddVarying("vertex_depth", "float");
+ // the w coordinate is the unormalized distance to the object from the camera
+ // We want the normalized distance, with 0 representing the far plane and 1 representing
+ // the near plane, of the object in the vertex depth variable.
+
+ vertexShader << "\tvertex_depth = calculateVertexDepth( camera_properties, gl_Position );"
+ << Endl;
+ }
+
+ // Helper implements the vertex pipeline for mesh subsets when bound to the default material.
+ // Should be completely possible to use for custom materials with a bit of refactoring.
+ struct SSubsetMaterialVertexPipeline : public SVertexPipelineImpl
+ {
+ Qt3DSRendererImpl &m_Renderer;
+ SSubsetRenderable &m_Renderable;
+ TessModeValues::Enum m_TessMode;
+
+ SSubsetMaterialVertexPipeline(Qt3DSRendererImpl &renderer, SSubsetRenderable &renderable,
+ bool inWireframeRequested)
+ : SVertexPipelineImpl(renderer.GetQt3DSContext().GetAllocator(),
+ renderer.GetQt3DSContext().GetDefaultMaterialShaderGenerator(),
+ renderer.GetQt3DSContext().GetShaderProgramGenerator(),
+ renderer.GetQt3DSContext().GetStringTable(), false)
+ , m_Renderer(renderer)
+ , m_Renderable(renderable)
+ , m_TessMode(TessModeValues::NoTess)
+ {
+ if (m_Renderer.GetContext().IsTessellationSupported()) {
+ m_TessMode = renderable.m_TessellationMode;
+ }
+
+ if (m_Renderer.GetContext().IsGeometryStageSupported()
+ && m_TessMode != TessModeValues::NoTess)
+ m_Wireframe = inWireframeRequested;
+ }
+
+ void InitializeTessControlShader()
+ {
+ if (m_TessMode == TessModeValues::NoTess
+ || ProgramGenerator().GetStage(ShaderGeneratorStages::TessControl) == NULL)
+ return;
+
+ IShaderStageGenerator &tessCtrlShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+
+ SetupTessIncludes(ShaderGeneratorStages::TessControl, m_TessMode);
+
+ tessCtrlShader.Append("void main() {\n");
+
+ tessCtrlShader.Append("\tctWorldPos[0] = varWorldPos[0];");
+ tessCtrlShader.Append("\tctWorldPos[1] = varWorldPos[1];");
+ tessCtrlShader.Append("\tctWorldPos[2] = varWorldPos[2];");
+
+ if (m_TessMode == TessModeValues::TessPhong
+ || m_TessMode == TessModeValues::TessNPatch) {
+ tessCtrlShader.Append("\tctNorm[0] = varObjectNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = varObjectNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = varObjectNormal[2];");
+ }
+ if (m_TessMode == TessModeValues::TessNPatch) {
+ tessCtrlShader.Append("\tctTangent[0] = varTangent[0];");
+ tessCtrlShader.Append("\tctTangent[1] = varTangent[1];");
+ tessCtrlShader.Append("\tctTangent[2] = varTangent[2];");
+ }
+
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ }
+ void InitializeTessEvaluationShader()
+ {
+ if (m_TessMode == TessModeValues::NoTess
+ || ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval) == NULL)
+ return;
+
+ IShaderStageGenerator &tessEvalShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+
+ SetupTessIncludes(ShaderGeneratorStages::TessEval, m_TessMode);
+
+ if (m_TessMode == TessModeValues::TessLinear)
+ m_Renderer.GetQt3DSContext()
+ .GetDefaultMaterialShaderGenerator()
+ .AddDisplacementImageUniforms(tessEvalShader, m_DisplacementIdx,
+ m_DisplacementImage);
+
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddUniform("normal_matrix", "mat3");
+
+ tessEvalShader.Append("void main() {");
+
+ if (m_TessMode == TessModeValues::TessNPatch) {
+ tessEvalShader.Append("\tctNorm[0] = varObjectNormalTC[0];");
+ tessEvalShader.Append("\tctNorm[1] = varObjectNormalTC[1];");
+ tessEvalShader.Append("\tctNorm[2] = varObjectNormalTC[2];");
+
+ tessEvalShader.Append("\tctTangent[0] = varTangentTC[0];");
+ tessEvalShader.Append("\tctTangent[1] = varTangentTC[1];");
+ tessEvalShader.Append("\tctTangent[2] = varTangentTC[2];");
+ }
+
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ }
+
+ void FinalizeTessControlShader()
+ {
+ IShaderStageGenerator &tessCtrlShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ // add varyings we must pass through
+ typedef TStrTableStrMap::const_iterator TParamIter;
+ for (TParamIter iter = m_InterpolationParameters.begin(),
+ end = m_InterpolationParameters.end();
+ iter != end; ++iter) {
+ tessCtrlShader << "\t" << iter->first.c_str()
+ << "TC[gl_InvocationID] = " << iter->first.c_str()
+ << "[gl_InvocationID];\n";
+ }
+ }
+
+ void FinalizeTessEvaluationShader()
+ {
+ IShaderStageGenerator &tessEvalShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+
+ eastl::string outExt("");
+ if (ProgramGenerator().GetEnabledStages() & ShaderGeneratorStages::Geometry)
+ outExt = "TE";
+
+ // add varyings we must pass through
+ typedef TStrTableStrMap::const_iterator TParamIter;
+ if (m_TessMode == TessModeValues::TessNPatch) {
+ for (TParamIter iter = m_InterpolationParameters.begin(),
+ end = m_InterpolationParameters.end();
+ iter != end; ++iter) {
+ tessEvalShader << "\t" << iter->first.c_str() << outExt.c_str()
+ << " = gl_TessCoord.z * " << iter->first.c_str() << "TC[0] + ";
+ tessEvalShader << "gl_TessCoord.x * " << iter->first.c_str() << "TC[1] + ";
+ tessEvalShader << "gl_TessCoord.y * " << iter->first.c_str() << "TC[2];\n";
+ }
+
+ // transform the normal
+ if (m_GenerationFlags & GenerationFlagValues::WorldNormal)
+ tessEvalShader << "\n\tvarNormal" << outExt.c_str()
+ << " = normalize(normal_matrix * teNorm);\n";
+ // transform the tangent
+ if (m_GenerationFlags & GenerationFlagValues::TangentBinormal) {
+ tessEvalShader << "\n\tvarTangent" << outExt.c_str()
+ << " = normalize(normal_matrix * teTangent);\n";
+ // transform the binormal
+ tessEvalShader << "\n\tvarBinormal" << outExt.c_str()
+ << " = normalize(normal_matrix * teBinormal);\n";
+ }
+ } else {
+ for (TParamIter iter = m_InterpolationParameters.begin(),
+ end = m_InterpolationParameters.end();
+ iter != end; ++iter) {
+ tessEvalShader << "\t" << iter->first.c_str() << outExt.c_str()
+ << " = gl_TessCoord.x * " << iter->first.c_str() << "TC[0] + ";
+ tessEvalShader << "gl_TessCoord.y * " << iter->first.c_str() << "TC[1] + ";
+ tessEvalShader << "gl_TessCoord.z * " << iter->first.c_str() << "TC[2];\n";
+ }
+
+ // displacement mapping makes only sense with linear tessellation
+ if (m_TessMode == TessModeValues::TessLinear && m_DisplacementImage) {
+ IDefaultMaterialShaderGenerator::SImageVariableNames theNames =
+ m_Renderer.GetQt3DSContext()
+ .GetDefaultMaterialShaderGenerator()
+ .GetImageVariableNames(m_DisplacementIdx);
+ tessEvalShader << "\tpos.xyz = defaultMaterialFileDisplacementTexture( "
+ << theNames.m_ImageSampler << ", displaceAmount, "
+ << theNames.m_ImageFragCoords << outExt.c_str();
+ tessEvalShader << ", varObjectNormal" << outExt.c_str() << ", pos.xyz );"
+ << Endl;
+ tessEvalShader << "\tvarWorldPos" << outExt.c_str()
+ << "= (model_matrix * pos).xyz;" << Endl;
+ tessEvalShader << "\tvarViewVector" << outExt.c_str()
+ << "= normalize(camera_position - "
+ << "varWorldPos" << outExt.c_str() << ");" << Endl;
+ }
+
+ // transform the normal
+ tessEvalShader << "\n\tvarNormal" << outExt.c_str()
+ << " = normalize(normal_matrix * varObjectNormal" << outExt.c_str()
+ << ");\n";
+ }
+
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;\n");
+ }
+
+ void BeginVertexGeneration(QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) override
+ {
+ m_DisplacementIdx = displacementImageIdx;
+ m_DisplacementImage = displacementImage;
+
+ TShaderGeneratorStageFlags theStages(IShaderProgramGenerator::DefaultFlags());
+ if (m_TessMode != TessModeValues::NoTess) {
+ theStages |= ShaderGeneratorStages::TessControl;
+ theStages |= ShaderGeneratorStages::TessEval;
+ }
+ if (m_Wireframe) {
+ theStages |= ShaderGeneratorStages::Geometry;
+ }
+ ProgramGenerator().BeginProgram(theStages);
+ if (m_TessMode != TessModeValues::NoTess) {
+ InitializeTessControlShader();
+ InitializeTessEvaluationShader();
+ }
+ if (m_Wireframe) {
+ InitializeWireframeGeometryShader();
+ }
+ // Open up each stage.
+ IShaderStageGenerator &vertexShader(Vertex());
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader << "void main()" << Endl << "{" << Endl;
+ vertexShader << "\tvec3 uTransform;" << Endl;
+ vertexShader << "\tvec3 vTransform;" << Endl;
+
+ if (displacementImage) {
+ GenerateUVCoords();
+ MaterialGenerator().GenerateImageUVCoordinates(*this, displacementImageIdx, 0,
+ *displacementImage);
+ if (!HasTessellation()) {
+ vertexShader.AddUniform("displaceAmount", "float");
+ // we create the world position setup here
+ // because it will be replaced with the displaced position
+ SetCode(GenerationFlagValues::WorldPosition);
+ vertexShader.AddUniform("model_matrix", "mat4");
+
+ vertexShader.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+ IDefaultMaterialShaderGenerator::SImageVariableNames theVarNames =
+ MaterialGenerator().GetImageVariableNames(displacementImageIdx);
+
+ vertexShader.AddUniform(theVarNames.m_ImageSampler, "sampler2D");
+
+ vertexShader
+ << "\tvec3 displacedPos = defaultMaterialFileDisplacementTexture( "
+ << theVarNames.m_ImageSampler << ", displaceAmount, "
+ << theVarNames.m_ImageFragCoords << ", attr_norm, attr_pos );" << Endl;
+ AddInterpolationParameter("varWorldPos", "vec3");
+ vertexShader.Append("\tvec3 local_model_world_position = (model_matrix * "
+ "vec4(displacedPos, 1.0)).xyz;");
+ AssignOutput("varWorldPos", "local_model_world_position");
+ }
+ }
+ // for tessellation we pass on the position in object coordinates
+ // Also note that gl_Position is written in the tess eval shader
+ if (HasTessellation())
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ else {
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ if (displacementImage)
+ vertexShader.Append(
+ "\tgl_Position = model_view_projection * vec4(displacedPos, 1.0);");
+ else
+ vertexShader.Append(
+ "\tgl_Position = model_view_projection * vec4(attr_pos, 1.0);");
+ }
+
+ if (HasTessellation()) {
+ GenerateWorldPosition();
+ GenerateWorldNormal();
+ GenerateObjectNormal();
+ GenerateVarTangentAndBinormal();
+ }
+ }
+
+ void BeginFragmentGeneration() override
+ {
+ Fragment().AddUniform("material_diffuse", "vec4");
+ Fragment() << "void main()" << Endl << "{" << Endl;
+ // We do not pass object opacity through the pipeline.
+ Fragment() << "\tfloat object_opacity = material_diffuse.a;" << Endl;
+ }
+
+ void AssignOutput(const char8_t *inVarName, const char8_t *inVarValue) override
+ {
+ Vertex() << "\t" << inVarName << " = " << inVarValue << ";\n";
+ }
+ void DoGenerateUVCoords(QT3DSU32 inUVSet = 0) override
+ {
+ QT3DS_ASSERT(inUVSet == 0 || inUVSet == 1);
+
+ if (inUVSet == 0) {
+ Vertex().AddIncoming("attr_uv0", "vec2");
+ Vertex() << "\tvarTexCoord0 = attr_uv0;" << Endl;
+ } else if (inUVSet == 1) {
+ Vertex().AddIncoming("attr_uv1", "vec2");
+ Vertex() << "\tvarTexCoord1 = attr_uv1;" << Endl;
+ }
+ }
+
+ // fragment shader expects varying vertex normal
+ // lighting in vertex pipeline expects world_normal
+ void DoGenerateWorldNormal() override
+ {
+ IShaderStageGenerator &vertexGenerator(Vertex());
+ vertexGenerator.AddIncoming("attr_norm", "vec3");
+ vertexGenerator.AddUniform("normal_matrix", "mat3");
+ if (HasTessellation() == false) {
+ vertexGenerator.Append(
+ "\tvec3 world_normal = normalize(normal_matrix * attr_norm).xyz;");
+ vertexGenerator.Append("\tvarNormal = world_normal;");
+ }
+ }
+ void DoGenerateObjectNormal() override
+ {
+ AddInterpolationParameter("varObjectNormal", "vec3");
+ Vertex().Append("\tvarObjectNormal = attr_norm;");
+ }
+ void DoGenerateWorldPosition() override
+ {
+ Vertex().Append(
+ "\tvec3 local_model_world_position = (model_matrix * vec4(attr_pos, 1.0)).xyz;");
+ AssignOutput("varWorldPos", "local_model_world_position");
+ }
+
+ void DoGenerateVarTangentAndBinormal() override
+ {
+ Vertex().AddIncoming("attr_textan", "vec3");
+ Vertex().AddIncoming("attr_binormal", "vec3");
+
+ bool hasNPatchTessellation = m_TessMode == TessModeValues::TessNPatch;
+
+ if (!hasNPatchTessellation) {
+ Vertex() << "\tvarTangent = normal_matrix * attr_textan;" << Endl
+ << "\tvarBinormal = normal_matrix * attr_binormal;" << Endl;
+ } else {
+ Vertex() << "\tvarTangent = attr_textan;" << Endl
+ << "\tvarBinormal = attr_binormal;" << Endl;
+ }
+ }
+
+ void DoGenerateVertexColor() override
+ {
+ Vertex().AddIncoming("attr_color", "vec3");
+ Vertex().Append("\tvarColor = attr_color;");
+ }
+
+ void EndVertexGeneration(bool) override
+ {
+
+ if (HasTessellation()) {
+ // finalize tess control shader
+ FinalizeTessControlShader();
+ // finalize tess evaluation shader
+ FinalizeTessEvaluationShader();
+
+ TessControl().Append("}");
+ TessEval().Append("}");
+ }
+ if (m_Wireframe) {
+ // finalize geometry shader
+ FinalizeWireframeGeometryShader();
+ Geometry().Append("}");
+ }
+ Vertex().Append("}");
+ }
+
+ void EndFragmentGeneration(bool) override { Fragment().Append("}"); }
+
+ void AddInterpolationParameter(const char8_t *inName, const char8_t *inType) override
+ {
+ m_InterpolationParameters.insert(eastl::make_pair(Str(inName), Str(inType)));
+ Vertex().AddOutgoing(inName, inType);
+ Fragment().AddIncoming(inName, inType);
+ if (HasTessellation()) {
+ eastl::string nameBuilder(inName);
+ nameBuilder.append("TC");
+ TessControl().AddOutgoing(nameBuilder.c_str(), inType);
+
+ nameBuilder.assign(inName);
+ if (ProgramGenerator().GetEnabledStages() & ShaderGeneratorStages::Geometry) {
+ nameBuilder.append("TE");
+ Geometry().AddOutgoing(inName, inType);
+ }
+ TessEval().AddOutgoing(nameBuilder.c_str(), inType);
+ }
+ }
+
+ IShaderStageGenerator &ActiveStage() override { return Vertex(); }
+ };
+
+ NVRenderShaderProgram *Qt3DSRendererImpl::GenerateShader(SSubsetRenderable &inRenderable,
+ TShaderFeatureSet inFeatureSet)
+ {
+ // build a string that allows us to print out the shader we are generating to the log.
+ // This is time consuming but I feel like it doesn't happen all that often and is very
+ // useful to users
+ // looking at the log file.
+ QLatin1String logPrefix("mesh subset pipeline-- ");
+
+ m_GeneratedShaderString.clear();
+ m_GeneratedShaderString.assign(logPrefix.data());
+
+ SShaderDefaultMaterialKey theKey(inRenderable.m_ShaderDescription);
+ theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties);
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey =
+ m_qt3dsContext.GetStringTable().RegisterStr(m_GeneratedShaderString.c_str());
+ NVRenderShaderProgram *cachedProgram = theCache.GetProgram(theCacheKey, inFeatureSet);
+ if (cachedProgram)
+ return cachedProgram;
+
+ SSubsetMaterialVertexPipeline pipeline(
+ *this, inRenderable,
+ m_DefaultMaterialShaderKeyProperties.m_WireframeMode.GetValue(theKey));
+ return m_qt3dsContext.GetDefaultMaterialShaderGenerator().GenerateShader(
+ inRenderable.m_Material, inRenderable.m_ShaderDescription, pipeline, inFeatureSet,
+ m_CurrentLayer->m_Lights, inRenderable.m_FirstImage,
+ inRenderable.m_RenderableFlags.HasTransparency(),
+ logPrefix.data());
+ }
+
+ // -------------- Special cases for shadows -------------------
+
+ SRenderableDepthPrepassShader *
+ Qt3DSRendererImpl::GetParaboloidDepthShader(TessModeValues::Enum inTessMode)
+ {
+ if (!m_qt3dsContext.GetRenderContext().IsTessellationSupported()
+ || inTessMode == TessModeValues::NoTess) {
+ return GetParaboloidDepthNoTessShader();
+ } else if (inTessMode == TessModeValues::TessLinear) {
+ return GetParaboloidDepthTessLinearShader();
+ } else if (inTessMode == TessModeValues::TessPhong) {
+ return GetParaboloidDepthTessPhongShader();
+ } else if (inTessMode == TessModeValues::TessNPatch) {
+ return GetParaboloidDepthTessNPatchShader();
+ }
+
+ return GetParaboloidDepthNoTessShader();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetParaboloidDepthNoTessShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_ParaboloidDepthShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("paraboloid depth shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ IShaderProgramGenerator::OutputParaboloidDepthVertex(vertexShader);
+ IShaderProgramGenerator::OutputParaboloidDepthFragment(fragmentShader);
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetParaboloidDepthTessLinearShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_ParaboloidDepthTessLinearShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("paraboloid depth tess linear shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ // vertexShader.AddOutgoing("world_pos", "vec4");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ // vertexShader.Append("\tworld_pos = attr_pos;");
+ vertexShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationLinear.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ // tessCtrlShader.AddOutgoing( "outUVTC", "vec2" );
+ // tessCtrlShader.AddOutgoing( "outNormalTC", "vec3" );
+ tessCtrlShader.Append("void main() {\n");
+ // tessCtrlShader.Append("\tctWorldPos[0] = outWorldPos[0];");
+ // tessCtrlShader.Append("\tctWorldPos[1] = outWorldPos[1];");
+ // tessCtrlShader.Append("\tctWorldPos[2] = outWorldPos[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationLinear.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddOutgoing("world_pos", "vec4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ IShaderProgramGenerator::OutputParaboloidDepthTessEval(tessEvalShader);
+ tessEvalShader.Append("}");
+
+ IShaderProgramGenerator::OutputParaboloidDepthFragment(fragmentShader);
+ }
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetParaboloidDepthTessPhongShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_ParaboloidDepthTessPhongShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("paraboloid depth tess phong shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ // vertexShader.AddOutgoing("world_pos", "vec4");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ // vertexShader.Append("\tworld_pos = attr_pos;");
+ vertexShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationPhong.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ // tessCtrlShader.AddOutgoing( "outUVTC", "vec2" );
+ // tessCtrlShader.AddOutgoing( "outNormalTC", "vec3" );
+ tessCtrlShader.Append("void main() {\n");
+ // tessCtrlShader.Append("\tctWorldPos[0] = outWorldPos[0];");
+ // tessCtrlShader.Append("\tctWorldPos[1] = outWorldPos[1];");
+ // tessCtrlShader.Append("\tctWorldPos[2] = outWorldPos[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationPhong.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddOutgoing("world_pos", "vec4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ IShaderProgramGenerator::OutputParaboloidDepthTessEval(tessEvalShader);
+ tessEvalShader.Append("}");
+
+ IShaderProgramGenerator::OutputParaboloidDepthFragment(fragmentShader);
+ }
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetParaboloidDepthTessNPatchShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_ParaboloidDepthTessNPatchShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("paraboloid depth tess NPatch shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ // vertexShader.AddOutgoing("world_pos", "vec4");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ // vertexShader.Append("\tworld_pos = attr_pos;");
+ vertexShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationNPatch.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ // tessCtrlShader.AddOutgoing( "outUVTC", "vec2" );
+ // tessCtrlShader.AddOutgoing( "outNormalTC", "vec3" );
+ tessCtrlShader.Append("void main() {\n");
+ // tessCtrlShader.Append("\tctWorldPos[0] = outWorldPos[0];");
+ // tessCtrlShader.Append("\tctWorldPos[1] = outWorldPos[1];");
+ // tessCtrlShader.Append("\tctWorldPos[2] = outWorldPos[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationNPatch.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddOutgoing("world_pos", "vec4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ IShaderProgramGenerator::OutputParaboloidDepthTessEval(tessEvalShader);
+ tessEvalShader.Append("}");
+
+ IShaderProgramGenerator::OutputParaboloidDepthFragment(fragmentShader);
+ }
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *
+ Qt3DSRendererImpl::GetCubeShadowDepthShader(TessModeValues::Enum inTessMode)
+ {
+ if (!m_qt3dsContext.GetRenderContext().IsTessellationSupported()
+ || inTessMode == TessModeValues::NoTess) {
+ return GetCubeDepthNoTessShader();
+ } else if (inTessMode == TessModeValues::TessLinear) {
+ return GetCubeDepthTessLinearShader();
+ } else if (inTessMode == TessModeValues::TessPhong) {
+ return GetCubeDepthTessPhongShader();
+ } else if (inTessMode == TessModeValues::TessNPatch) {
+ return GetCubeDepthTessNPatchShader();
+ }
+
+ return GetCubeDepthNoTessShader();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetCubeDepthNoTessShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_CubemapDepthShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("cubemap face depth shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+
+ if (!depthShaderProgram) {
+ // GetProgramGenerator().BeginProgram(
+ // TShaderGeneratorStageFlags(ShaderGeneratorStages::Vertex |
+ // ShaderGeneratorStages::Fragment | ShaderGeneratorStages::Geometry) );
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ // IShaderStageGenerator& geometryShader( *GetProgramGenerator().GetStage(
+ // ShaderGeneratorStages::Geometry ) );
+
+ IShaderProgramGenerator::OutputCubeFaceDepthVertex(vertexShader);
+ // IShaderProgramGenerator::OutputCubeFaceDepthGeometry( geometryShader );
+ IShaderProgramGenerator::OutputCubeFaceDepthFragment(fragmentShader);
+ } else if (theCache.IsShaderCachePersistenceEnabled()) {
+ // we load from shader cache set default shader stages
+ GetProgramGenerator().BeginProgram();
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetCubeDepthTessLinearShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_CubemapDepthTessLinearShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("cubemap face depth linear tess shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+
+ if (!depthShaderProgram) {
+ // GetProgramGenerator().BeginProgram(
+ // TShaderGeneratorStageFlags(ShaderGeneratorStages::Vertex |
+ // ShaderGeneratorStages::Fragment | ShaderGeneratorStages::Geometry) );
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ // IShaderStageGenerator& geometryShader( *GetProgramGenerator().GetStage(
+ // ShaderGeneratorStages::Geometry ) );
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("}");
+
+ // IShaderProgramGenerator::OutputCubeFaceDepthGeometry( geometryShader );
+ IShaderProgramGenerator::OutputCubeFaceDepthFragment(fragmentShader);
+
+ tessCtrlShader.AddInclude("tessellationLinear.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationLinear.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddUniform("model_matrix", "mat4");
+ tessEvalShader.AddOutgoing("world_pos", "vec4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tworld_pos = model_matrix * pos;");
+ tessEvalShader.Append("\tworld_pos /= world_pos.w;");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;");
+ tessEvalShader.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetCubeDepthTessPhongShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_CubemapDepthTessPhongShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("cubemap face depth phong tess shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+
+ if (!depthShaderProgram) {
+ // GetProgramGenerator().BeginProgram(
+ // TShaderGeneratorStageFlags(ShaderGeneratorStages::Vertex |
+ // ShaderGeneratorStages::Fragment | ShaderGeneratorStages::Geometry) );
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ // IShaderStageGenerator& geometryShader( *GetProgramGenerator().GetStage(
+ // ShaderGeneratorStages::Geometry ) );
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddIncoming("attr_norm", "vec3");
+ vertexShader.AddOutgoing("outNormal", "vec3");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("\toutNormal = attr_norm;");
+ vertexShader.Append("}");
+
+ // IShaderProgramGenerator::OutputCubeFaceDepthGeometry( geometryShader );
+ IShaderProgramGenerator::OutputCubeFaceDepthFragment(fragmentShader);
+
+ tessCtrlShader.AddInclude("tessellationPhong.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append("\tctNorm[0] = outNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = outNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = outNormal[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationPhong.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddUniform("model_matrix", "mat4");
+ tessEvalShader.AddOutgoing("world_pos", "vec4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tworld_pos = model_matrix * pos;");
+ tessEvalShader.Append("\tworld_pos /= world_pos.w;");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;");
+ tessEvalShader.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetCubeDepthTessNPatchShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_CubemapDepthTessNPatchShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("cubemap face depth npatch tess shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+
+ if (!depthShaderProgram) {
+ // GetProgramGenerator().BeginProgram(
+ // TShaderGeneratorStageFlags(ShaderGeneratorStages::Vertex |
+ // ShaderGeneratorStages::Fragment | ShaderGeneratorStages::Geometry) );
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ // IShaderStageGenerator& geometryShader( *GetProgramGenerator().GetStage(
+ // ShaderGeneratorStages::Geometry ) );
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddIncoming("attr_norm", "vec3");
+ vertexShader.AddOutgoing("outNormal", "vec3");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("\toutNormal = attr_norm;");
+ vertexShader.Append("}");
+
+ // IShaderProgramGenerator::OutputCubeFaceDepthGeometry( geometryShader );
+ IShaderProgramGenerator::OutputCubeFaceDepthFragment(fragmentShader);
+
+ tessCtrlShader.AddOutgoing("outNormalTC", "vec3");
+ tessCtrlShader.AddInclude("tessellationNPatch.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append("\tctNorm[0] = outNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = outNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = outNormal[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append(
+ "\toutNormalTC[gl_InvocationID] = outNormal[gl_InvocationID];\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationNPatch.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddUniform("model_matrix", "mat4");
+ tessEvalShader.AddOutgoing("world_pos", "vec4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tctNorm[0] = outNormalTC[0];");
+ tessEvalShader.Append("\tctNorm[1] = outNormalTC[1];");
+ tessEvalShader.Append("\tctNorm[2] = outNormalTC[2];");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tworld_pos = model_matrix * pos;");
+ tessEvalShader.Append("\tworld_pos /= world_pos.w;");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;");
+ tessEvalShader.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *
+ Qt3DSRendererImpl::GetOrthographicDepthShader(TessModeValues::Enum inTessMode)
+ {
+ if (!m_qt3dsContext.GetRenderContext().IsTessellationSupported()
+ || inTessMode == TessModeValues::NoTess) {
+ return GetOrthographicDepthNoTessShader();
+ } else if (inTessMode == TessModeValues::TessLinear) {
+ return GetOrthographicDepthTessLinearShader();
+ } else if (inTessMode == TessModeValues::TessPhong) {
+ return GetOrthographicDepthTessPhongShader();
+ } else if (inTessMode == TessModeValues::TessNPatch) {
+ return GetOrthographicDepthTessNPatchShader();
+ }
+
+ return GetOrthographicDepthNoTessShader();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetOrthographicDepthNoTessShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_OrthographicDepthShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("orthographic depth shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.AddOutgoing("outDepth", "vec3");
+ vertexShader.Append("void main() {");
+ vertexShader.Append(
+ " gl_Position = model_view_projection * vec4( attr_pos, 1.0 );");
+ vertexShader.Append(" outDepth.x = gl_Position.z / gl_Position.w;");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfloat depth = (outDepth.x + 1.0) * 0.5;");
+ fragmentShader.Append("\tfragOutput = vec4(depth);");
+ fragmentShader.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetOrthographicDepthTessLinearShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_OrthographicDepthTessLinearShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("orthographic depth tess linear shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfloat depth = (outDepth.x + 1.0) * 0.5;");
+ fragmentShader.Append("\tfragOutput = vec4(depth);");
+ fragmentShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationLinear.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationLinear.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddOutgoing("outDepth", "vec3");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;");
+ tessEvalShader.Append("\toutDepth.x = gl_Position.z / gl_Position.w;");
+ tessEvalShader.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetOrthographicDepthTessPhongShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_OrthographicDepthTessPhongShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("orthographic depth tess phong shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddIncoming("attr_norm", "vec3");
+ vertexShader.AddOutgoing("outNormal", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("\toutNormal = attr_norm;");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfloat depth = (outDepth.x + 1.0) * 0.5;");
+ fragmentShader.Append("\tfragOutput = vec4(depth);");
+ fragmentShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationPhong.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append("\tctNorm[0] = outNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = outNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = outNormal[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationPhong.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddOutgoing("outDepth", "vec3");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;");
+ tessEvalShader.Append("\toutDepth.x = gl_Position.z / gl_Position.w;");
+ tessEvalShader.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetOrthographicDepthTessNPatchShader()
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthShader =
+ m_OrthographicDepthTessNPatchShader;
+
+ if (theDepthShader.hasValue() == false) {
+ TStrType name;
+ name.assign("orthographic depth tess npatch shader");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddIncoming("attr_norm", "vec3");
+ vertexShader.AddOutgoing("outNormal", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ fragmentShader.AddUniform("model_view_projection", "mat4");
+ fragmentShader.AddUniform("camera_properties", "vec2");
+ fragmentShader.AddUniform("camera_position", "vec3");
+ fragmentShader.AddUniform("camera_direction", "vec3");
+ fragmentShader.AddInclude("depthpass.glsllib");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("\toutNormal = attr_norm;");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ // fragmentShader.Append("\tfragOutput = vec4(0.0, 0.0, 0.0, 0.0);");
+ fragmentShader.Append("\tfloat depth = (outDepth.x - camera_properties.x) / "
+ "(camera_properties.y - camera_properties.x);");
+ fragmentShader.Append("\tfragOutput = vec4(depth);");
+ fragmentShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationNPatch.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.AddOutgoing("outNormalTC", "vec3");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append("\tctNorm[0] = outNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = outNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = outNormal[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationNPatch.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.AddUniform("model_matrix", "mat4");
+ tessEvalShader.AddOutgoing("outDepth", "vec3");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;");
+ tessEvalShader.Append("\toutDepth.x = gl_Position.z / gl_Position.w;");
+ tessEvalShader.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+
+ return theDepthShader.getValue();
+ }
+
+ // ---------------------------------
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetDepthPrepassShader(bool inDisplaced)
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthPrePassShader =
+ (!inDisplaced) ? m_DepthPrepassShader : m_DepthPrepassShaderDisplaced;
+
+ if (theDepthPrePassShader.hasValue() == false) {
+ // check if we do displacement mapping
+ TStrType name;
+ name.assign("depth prepass shader");
+ if (inDisplaced)
+ name.append(" displacement");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+
+ vertexShader.Append("void main() {");
+
+ if (inDisplaced) {
+ GetQt3DSContext()
+ .GetDefaultMaterialShaderGenerator()
+ .AddDisplacementMappingForDepthPass(vertexShader);
+ } else {
+ vertexShader.Append(
+ "\tgl_Position = model_view_projection * vec4(attr_pos, 1.0);");
+ }
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfragOutput = vec4(0.0, 0.0, 0.0, 0.0);");
+ fragmentShader.Append("}");
+ } else if (theCache.IsShaderCachePersistenceEnabled()) {
+ // we load from shader cache set default shader stages
+ GetProgramGenerator().BeginProgram();
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthPrePassShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthPrePassShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+ return theDepthPrePassShader.getValue();
+ }
+
+ SRenderableDepthPrepassShader *
+ Qt3DSRendererImpl::GetDepthTessPrepassShader(TessModeValues::Enum inTessMode, bool inDisplaced)
+ {
+ if (!m_qt3dsContext.GetRenderContext().IsTessellationSupported()
+ || inTessMode == TessModeValues::NoTess) {
+ return GetDepthPrepassShader(inDisplaced);
+ } else if (inTessMode == TessModeValues::TessLinear) {
+ return GetDepthTessLinearPrepassShader(inDisplaced);
+ } else if (inTessMode == TessModeValues::TessPhong) {
+ return GetDepthTessPhongPrepassShader();
+ } else if (inTessMode == TessModeValues::TessNPatch) {
+ return GetDepthTessNPatchPrepassShader();
+ }
+
+ return GetDepthPrepassShader(inDisplaced);
+ }
+
+ SRenderableDepthPrepassShader *
+ Qt3DSRendererImpl::GetDepthTessLinearPrepassShader(bool inDisplaced)
+ {
+ Option<NVScopedRefCounted<SRenderableDepthPrepassShader>> &theDepthPrePassShader =
+ (!inDisplaced) ? m_DepthTessLinearPrepassShader
+ : m_DepthTessLinearPrepassShaderDisplaced;
+
+ if (theDepthPrePassShader.hasValue() == false) {
+ // check if we do displacement mapping
+ TStrType name;
+ name.assign("depth tess linear prepass shader");
+ if (inDisplaced)
+ name.append(" displacement");
+
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey = m_qt3dsContext.GetStringTable().RegisterStr(name.c_str());
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ if (inDisplaced) {
+ vertexShader.AddIncoming("attr_uv0", "vec2");
+ vertexShader.AddIncoming("attr_norm", "vec3");
+
+ vertexShader.AddUniform("displacementMap_rot", "vec4");
+ vertexShader.AddUniform("displacementMap_offset", "vec3");
+
+ vertexShader.AddOutgoing("outNormal", "vec3");
+ vertexShader.AddOutgoing("outUV", "vec2");
+ }
+ vertexShader.AddOutgoing("outWorldPos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.AddUniform("model_matrix", "mat4");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ if (inDisplaced) {
+ vertexShader.Append("\toutNormal = attr_norm;");
+ vertexShader.Append("\tvec3 uTransform = vec3( displacementMap_rot.x, "
+ "displacementMap_rot.y, displacementMap_offset.x );");
+ vertexShader.Append("\tvec3 vTransform = vec3( displacementMap_rot.z, "
+ "displacementMap_rot.w, displacementMap_offset.y );");
+ vertexShader.AddInclude(
+ "defaultMaterialLighting.glsllib"); // getTransformedUVCoords is in the
+ // lighting code addition.
+ vertexShader << "\tvec2 uv_coords = attr_uv0;" << Endl;
+ vertexShader << "\toutUV = getTransformedUVCoords( vec3( uv_coords, 1.0), "
+ "uTransform, vTransform );\n";
+ }
+ vertexShader.Append("\toutWorldPos = (model_matrix * vec4(attr_pos, 1.0)).xyz;");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfragOutput = vec4(0.0, 0.0, 0.0, 0.0);");
+ fragmentShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationLinear.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.AddOutgoing("outUVTC", "vec2");
+ tessCtrlShader.AddOutgoing("outNormalTC", "vec3");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append("\tctWorldPos[0] = outWorldPos[0];");
+ tessCtrlShader.Append("\tctWorldPos[1] = outWorldPos[1];");
+ tessCtrlShader.Append("\tctWorldPos[2] = outWorldPos[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+
+ if (inDisplaced) {
+ tessCtrlShader.Append("\toutUVTC[gl_InvocationID] = outUV[gl_InvocationID];");
+ tessCtrlShader.Append(
+ "\toutNormalTC[gl_InvocationID] = outNormal[gl_InvocationID];");
+ }
+
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationLinear.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ if (inDisplaced) {
+ tessEvalShader.AddUniform("displacementSampler", "sampler2D");
+ tessEvalShader.AddUniform("displaceAmount", "float");
+ tessEvalShader.AddInclude("defaultMaterialFileDisplacementTexture.glsllib");
+ }
+ tessEvalShader.AddOutgoing("outUV", "vec2");
+ tessEvalShader.AddOutgoing("outNormal", "vec3");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+
+ if (inDisplaced) {
+ tessEvalShader << "\toutUV = gl_TessCoord.x * outUVTC[0] + gl_TessCoord.y * "
+ "outUVTC[1] + gl_TessCoord.z * outUVTC[2];"
+ << Endl;
+ tessEvalShader
+ << "\toutNormal = gl_TessCoord.x * outNormalTC[0] + gl_TessCoord.y * "
+ "outNormalTC[1] + gl_TessCoord.z * outNormalTC[2];"
+ << Endl;
+ tessEvalShader
+ << "\tvec3 displacedPos = defaultMaterialFileDisplacementTexture( "
+ "displacementSampler , displaceAmount, outUV , outNormal, pos.xyz );"
+ << Endl;
+ tessEvalShader.Append(
+ "\tgl_Position = model_view_projection * vec4(displacedPos, 1.0);");
+ } else
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;");
+
+ tessEvalShader.Append("}");
+ } else if (theCache.IsShaderCachePersistenceEnabled()) {
+ // we load from shader cache set default shader stages
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ }
+
+ SShaderCacheProgramFlags theFlags;
+ theFlags.SetTessellationEnabled(true);
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ name.c_str(), theFlags, TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ theDepthPrePassShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ theDepthPrePassShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+ return theDepthPrePassShader->mPtr;
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetDepthTessPhongPrepassShader()
+ {
+ if (m_DepthTessPhongPrepassShader.hasValue() == false) {
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey =
+ m_qt3dsContext.GetStringTable().RegisterStr("depth tess phong prepass shader");
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddIncoming("attr_norm", "vec3");
+ vertexShader.AddOutgoing("outNormal", "vec3");
+ vertexShader.AddOutgoing("outWorldPos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.AddUniform("model_matrix", "mat4");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("\toutWorldPos = (model_matrix * vec4(attr_pos, 1.0)).xyz;");
+ vertexShader.Append("\toutNormal = attr_norm;");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfragOutput = vec4(0.0, 0.0, 0.0, 0.0);");
+ fragmentShader.Append("}");
+
+ tessCtrlShader.AddInclude("tessellationPhong.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append("\tctWorldPos[0] = outWorldPos[0];");
+ tessCtrlShader.Append("\tctWorldPos[1] = outWorldPos[1];");
+ tessCtrlShader.Append("\tctWorldPos[2] = outWorldPos[2];");
+ tessCtrlShader.Append("\tctNorm[0] = outNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = outNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = outNormal[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationPhong.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;\n");
+ tessEvalShader.Append("}");
+ } else if (theCache.IsShaderCachePersistenceEnabled()) {
+ // we load from shader cache set default shader stages
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ }
+
+ SShaderCacheProgramFlags theFlags;
+ theFlags.SetTessellationEnabled(true);
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ "depth tess phong prepass shader", theFlags, TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ m_DepthTessPhongPrepassShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ m_DepthTessPhongPrepassShader = NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+ return m_DepthTessPhongPrepassShader->mPtr;
+ }
+
+ SRenderableDepthPrepassShader *Qt3DSRendererImpl::GetDepthTessNPatchPrepassShader()
+ {
+ if (m_DepthTessNPatchPrepassShader.hasValue() == false) {
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey =
+ m_qt3dsContext.GetStringTable().RegisterStr("depth tess npatch prepass shader");
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &vertexShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &tessCtrlShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessControl));
+ IShaderStageGenerator &tessEvalShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::TessEval));
+ IShaderStageGenerator &fragmentShader(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddIncoming("attr_norm", "vec3");
+ vertexShader.AddOutgoing("outNormal", "vec3");
+ vertexShader.AddOutgoing("outWorldPos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.AddUniform("model_matrix", "mat4");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = vec4(attr_pos, 1.0);");
+ vertexShader.Append("\toutWorldPos = (model_matrix * vec4(attr_pos, 1.0)).xyz;");
+ vertexShader.Append("\toutNormal = attr_norm;");
+ vertexShader.Append("}");
+ fragmentShader.Append("void main() {");
+ fragmentShader.Append("\tfragOutput = vec4(0.0, 0.0, 0.0, 0.0);");
+ fragmentShader.Append("}");
+
+ tessCtrlShader.AddOutgoing("outNormalTC", "vec3");
+ tessCtrlShader.AddInclude("tessellationNPatch.glsllib");
+ tessCtrlShader.AddUniform("tessLevelInner", "float");
+ tessCtrlShader.AddUniform("tessLevelOuter", "float");
+ tessCtrlShader.Append("void main() {\n");
+ tessCtrlShader.Append("\tctWorldPos[0] = outWorldPos[0];");
+ tessCtrlShader.Append("\tctWorldPos[1] = outWorldPos[1];");
+ tessCtrlShader.Append("\tctWorldPos[2] = outWorldPos[2];");
+ tessCtrlShader.Append("\tctNorm[0] = outNormal[0];");
+ tessCtrlShader.Append("\tctNorm[1] = outNormal[1];");
+ tessCtrlShader.Append("\tctNorm[2] = outNormal[2];");
+ tessCtrlShader.Append(
+ "\tctTangent[0] = outNormal[0];"); // we don't care for the tangent
+ tessCtrlShader.Append("\tctTangent[1] = outNormal[1];");
+ tessCtrlShader.Append("\tctTangent[2] = outNormal[2];");
+ tessCtrlShader.Append(
+ "\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;");
+ tessCtrlShader.Append("\ttessShader( tessLevelOuter, tessLevelInner);\n");
+ tessCtrlShader.Append(
+ "\toutNormalTC[gl_InvocationID] = outNormal[gl_InvocationID];\n");
+ tessCtrlShader.Append("}");
+
+ tessEvalShader.AddInclude("tessellationNPatch.glsllib");
+ tessEvalShader.AddUniform("model_view_projection", "mat4");
+ tessEvalShader.Append("void main() {");
+ tessEvalShader.Append("\tctNorm[0] = outNormalTC[0];");
+ tessEvalShader.Append("\tctNorm[1] = outNormalTC[1];");
+ tessEvalShader.Append("\tctNorm[2] = outNormalTC[2];");
+ tessEvalShader.Append(
+ "\tctTangent[0] = outNormalTC[0];"); // we don't care for the tangent
+ tessEvalShader.Append("\tctTangent[1] = outNormalTC[1];");
+ tessEvalShader.Append("\tctTangent[2] = outNormalTC[2];");
+ tessEvalShader.Append("\tvec4 pos = tessShader( );\n");
+ tessEvalShader.Append("\tgl_Position = model_view_projection * pos;\n");
+ tessEvalShader.Append("}");
+ } else if (theCache.IsShaderCachePersistenceEnabled()) {
+ // we load from shader cache set default shader stages
+ GetProgramGenerator().BeginProgram(TShaderGeneratorStageFlags(
+ ShaderGeneratorStages::Vertex | ShaderGeneratorStages::TessControl
+ | ShaderGeneratorStages::TessEval | ShaderGeneratorStages::Fragment));
+ }
+
+ SShaderCacheProgramFlags theFlags;
+ theFlags.SetTessellationEnabled(true);
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ "depth tess npatch prepass shader", theFlags, TShaderFeatureSet());
+
+ if (depthShaderProgram) {
+ m_DepthTessNPatchPrepassShader = NVScopedRefCounted<SRenderableDepthPrepassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(),
+ SRenderableDepthPrepassShader)(*depthShaderProgram, GetContext()));
+ } else {
+ m_DepthTessNPatchPrepassShader =
+ NVScopedRefCounted<SRenderableDepthPrepassShader>();
+ }
+ }
+ return m_DepthTessNPatchPrepassShader->mPtr;
+ }
+
+ SDefaultAoPassShader *Qt3DSRendererImpl::GetDefaultAoPassShader(TShaderFeatureSet inFeatureSet)
+ {
+ if (m_DefaultAoPassShader.hasValue() == false) {
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey =
+ m_qt3dsContext.GetStringTable().RegisterStr("fullscreen AO pass shader");
+ NVRenderShaderProgram *aoPassShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!aoPassShaderProgram) {
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &theVertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &theFragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ theVertexGenerator.AddIncoming("attr_pos", "vec3");
+ theVertexGenerator.AddIncoming("attr_uv", "vec2");
+ theVertexGenerator.AddOutgoing("uv_coords", "vec2");
+ theVertexGenerator.Append("void main() {");
+ theVertexGenerator.Append("\tgl_Position = vec4(attr_pos.xy, 0.5, 1.0 );");
+ theVertexGenerator.Append("\tuv_coords = attr_uv;");
+ theVertexGenerator.Append("}");
+
+ // fragmentGenerator.AddInclude( "SSAOCustomMaterial.glsllib" );
+ theFragmentGenerator.AddInclude("viewProperties.glsllib");
+ theFragmentGenerator.AddInclude("screenSpaceAO.glsllib");
+ if (m_Context->GetRenderContextType() == NVRenderContextValues::GLES2) {
+ theFragmentGenerator
+ << "\tuniform vec4 ao_properties;" << Endl
+ << "\tuniform vec4 ao_properties2;" << Endl
+ << "\tuniform vec4 shadow_properties;" << Endl
+ << "\tuniform vec4 aoScreenConst;" << Endl
+ << "\tuniform vec4 UvToEyeConst;" << Endl;
+ } else {
+ theFragmentGenerator
+ << "layout (std140) uniform cbAoShadow { " << Endl << "\tvec4 ao_properties;"
+ << Endl << "\tvec4 ao_properties2;" << Endl << "\tvec4 shadow_properties;"
+ << Endl << "\tvec4 aoScreenConst;" << Endl << "\tvec4 UvToEyeConst;" << Endl
+ << "};" << Endl;
+ }
+ theFragmentGenerator.AddUniform("camera_direction", "vec3");
+ theFragmentGenerator.AddUniform("depth_sampler", "sampler2D");
+ theFragmentGenerator.Append("void main() {");
+ theFragmentGenerator << "\tfloat aoFactor;" << Endl;
+ theFragmentGenerator << "\tvec3 screenNorm;" << Endl;
+
+ // We're taking multiple depth samples and getting the derivatives at each of them
+ // to get a more
+ // accurate view space normal vector. When we do only one, we tend to get bizarre
+ // values at the edges
+ // surrounding objects, and this also ends up giving us weird AO values.
+ // If we had a proper screen-space normal map, that would also do the trick.
+ if (m_Context->GetRenderContextType() == NVRenderContextValues::GLES2) {
+ theFragmentGenerator.AddUniform("depth_sampler_size", "vec2");
+ theFragmentGenerator.Append("\tivec2 iCoords = ivec2( gl_FragCoord.xy );");
+ theFragmentGenerator.Append("\tfloat depth = getDepthValue( "
+ "texture2D(depth_sampler, vec2(iCoords)"
+ " / depth_sampler_size), camera_properties );");
+ theFragmentGenerator.Append(
+ "\tdepth = depthValueToLinearDistance( depth, camera_properties );");
+ theFragmentGenerator.Append("\tdepth = (depth - camera_properties.x) / "
+ "(camera_properties.y - camera_properties.x);");
+ theFragmentGenerator.Append("\tfloat depth2 = getDepthValue( "
+ "texture2D(depth_sampler, vec2(iCoords+ivec2(1))"
+ " / depth_sampler_size), camera_properties );");
+ theFragmentGenerator.Append(
+ "\tdepth2 = depthValueToLinearDistance( depth, camera_properties );");
+ theFragmentGenerator.Append("\tfloat depth3 = getDepthValue( "
+ "texture2D(depth_sampler, vec2(iCoords-ivec2(1))"
+ " / depth_sampler_size), camera_properties );");
+ } else {
+ theFragmentGenerator.Append("\tivec2 iCoords = ivec2( gl_FragCoord.xy );");
+ theFragmentGenerator.Append("\tfloat depth = getDepthValue( "
+ "texelFetch(depth_sampler, iCoords, 0), "
+ "camera_properties );");
+ theFragmentGenerator.Append(
+ "\tdepth = depthValueToLinearDistance( depth, camera_properties );");
+ theFragmentGenerator.Append("\tdepth = (depth - camera_properties.x) / "
+ "(camera_properties.y - camera_properties.x);");
+ theFragmentGenerator.Append("\tfloat depth2 = getDepthValue( "
+ "texelFetch(depth_sampler, iCoords+ivec2(1), 0), "
+ "camera_properties );");
+ theFragmentGenerator.Append(
+ "\tdepth2 = depthValueToLinearDistance( depth, camera_properties );");
+ theFragmentGenerator.Append("\tfloat depth3 = getDepthValue( "
+ "texelFetch(depth_sampler, iCoords-ivec2(1), 0), "
+ "camera_properties );");
+ }
+ theFragmentGenerator.Append(
+ "\tdepth3 = depthValueToLinearDistance( depth, camera_properties );");
+ theFragmentGenerator.Append("\tvec3 tanU = vec3(10, 0, dFdx(depth));");
+ theFragmentGenerator.Append("\tvec3 tanV = vec3(0, 10, dFdy(depth));");
+ theFragmentGenerator.Append("\tscreenNorm = normalize(cross(tanU, tanV));");
+ theFragmentGenerator.Append("\ttanU = vec3(10, 0, dFdx(depth2));");
+ theFragmentGenerator.Append("\ttanV = vec3(0, 10, dFdy(depth2));");
+ theFragmentGenerator.Append("\tscreenNorm += normalize(cross(tanU, tanV));");
+ theFragmentGenerator.Append("\ttanU = vec3(10, 0, dFdx(depth3));");
+ theFragmentGenerator.Append("\ttanV = vec3(0, 10, dFdy(depth3));");
+ theFragmentGenerator.Append("\tscreenNorm += normalize(cross(tanU, tanV));");
+ theFragmentGenerator.Append("\tscreenNorm = -normalize(screenNorm);");
+
+ theFragmentGenerator.Append("\taoFactor = \
+ SSambientOcclusion( depth_sampler, screenNorm, ao_properties, ao_properties2, \
+ camera_properties, aoScreenConst, UvToEyeConst );");
+
+ theFragmentGenerator.Append(
+ "\tgl_FragColor = vec4(aoFactor, aoFactor, aoFactor, 1.0);");
+
+ theFragmentGenerator.Append("}");
+ }
+
+ aoPassShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ "fullscreen AO pass shader", SShaderCacheProgramFlags(), inFeatureSet);
+
+ if (aoPassShaderProgram) {
+ m_DefaultAoPassShader = NVScopedRefCounted<SDefaultAoPassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(), SDefaultAoPassShader)(*aoPassShaderProgram,
+ GetContext()));
+ } else {
+ m_DefaultAoPassShader = NVScopedRefCounted<SDefaultAoPassShader>();
+ }
+ }
+ return m_DefaultAoPassShader->mPtr;
+ }
+
+ SDefaultAoPassShader *Qt3DSRendererImpl::GetFakeDepthShader(TShaderFeatureSet inFeatureSet)
+ {
+ if (m_FakeDepthShader.hasValue() == false) {
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey =
+ m_qt3dsContext.GetStringTable().RegisterStr("depth display shader");
+ NVRenderShaderProgram *depthShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!depthShaderProgram) {
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &theVertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &theFragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ theVertexGenerator.AddIncoming("attr_pos", "vec3");
+ theVertexGenerator.AddIncoming("attr_uv", "vec2");
+ theVertexGenerator.AddOutgoing("uv_coords", "vec2");
+ theVertexGenerator.Append("void main() {");
+ theVertexGenerator.Append("\tgl_Position = vec4(attr_pos.xy, 0.5, 1.0 );");
+ theVertexGenerator.Append("\tuv_coords = attr_uv;");
+ theVertexGenerator.Append("}");
+
+ theFragmentGenerator.AddUniform("depth_sampler", "sampler2D");
+ theFragmentGenerator.Append("void main() {");
+ theFragmentGenerator.Append("\tivec2 iCoords = ivec2( gl_FragCoord.xy );");
+ theFragmentGenerator.Append(
+ "\tfloat depSample = texelFetch(depth_sampler, iCoords, 0).x;");
+ theFragmentGenerator.Append(
+ "\tgl_FragColor = vec4( depSample, depSample, depSample, 1.0 );");
+ theFragmentGenerator.Append("\treturn;");
+ theFragmentGenerator.Append("}");
+ }
+
+ depthShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ "depth display shader", SShaderCacheProgramFlags(), inFeatureSet);
+
+ if (depthShaderProgram) {
+ m_FakeDepthShader = NVScopedRefCounted<SDefaultAoPassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(), SDefaultAoPassShader)(
+ *depthShaderProgram, GetContext()));
+ } else {
+ m_FakeDepthShader = NVScopedRefCounted<SDefaultAoPassShader>();
+ }
+ }
+ return m_FakeDepthShader->mPtr;
+ }
+
+ SDefaultAoPassShader *Qt3DSRendererImpl::GetFakeCubeDepthShader(TShaderFeatureSet inFeatureSet)
+ {
+ if (!m_FakeCubemapDepthShader.hasValue()) {
+ IShaderCache &theCache = m_qt3dsContext.GetShaderCache();
+ CRegisteredString theCacheKey =
+ m_qt3dsContext.GetStringTable().RegisterStr("cube depth display shader");
+ NVRenderShaderProgram *cubeShaderProgram =
+ theCache.GetProgram(theCacheKey, TShaderFeatureSet());
+ if (!cubeShaderProgram) {
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &theVertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &theFragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ theVertexGenerator.AddIncoming("attr_pos", "vec3");
+ theVertexGenerator.AddIncoming("attr_uv", "vec2");
+ theVertexGenerator.AddOutgoing("sample_dir", "vec3");
+ theVertexGenerator.Append("void main() {");
+ theVertexGenerator.Append("\tgl_Position = vec4(attr_pos.xy, 0.5, 1.0 );");
+ theVertexGenerator.Append(
+ "\tsample_dir = vec3(4.0 * (attr_uv.x - 0.5), -1.0, 4.0 * (attr_uv.y - 0.5));");
+ theVertexGenerator.Append("}");
+ theFragmentGenerator.AddUniform("depth_cube", "samplerCube");
+ theFragmentGenerator.Append("void main() {");
+ theFragmentGenerator.Append(
+ "\tfloat smpDepth = texture( depth_cube, sample_dir ).x;");
+ theFragmentGenerator.Append(
+ "\tgl_FragColor = vec4(smpDepth, smpDepth, smpDepth, 1.0);");
+ theFragmentGenerator.Append("}");
+ }
+
+ cubeShaderProgram = GetProgramGenerator().CompileGeneratedShader(
+ "cube depth display shader", SShaderCacheProgramFlags(), inFeatureSet);
+
+ if (cubeShaderProgram) {
+ m_FakeCubemapDepthShader = NVScopedRefCounted<SDefaultAoPassShader>(
+ QT3DS_NEW(GetContext().GetAllocator(), SDefaultAoPassShader)(*cubeShaderProgram,
+ GetContext()));
+ } else {
+ m_FakeCubemapDepthShader = NVScopedRefCounted<SDefaultAoPassShader>();
+ }
+ }
+ return m_FakeCubemapDepthShader.getValue();
+ }
+
+ STextRenderHelper Qt3DSRendererImpl::GetTextShader(bool inUsePathRendering)
+ {
+ STextShaderPtr &thePtr = (!inUsePathRendering) ? m_TextShader : m_TextPathShader;
+ if (thePtr.HasGeneratedShader())
+ return STextRenderHelper(thePtr, *m_QuadInputAssembler);
+
+ NVRenderShaderProgram *theShader = NULL;
+ NVRenderProgramPipeline *thePipeline = NULL;
+
+ if (!inUsePathRendering) {
+ GetProgramGenerator().BeginProgram();
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ // xy of text dimensions are scaling factors, zw are offset factors.
+ vertexGenerator.AddUniform("text_dimensions", "vec4");
+ vertexGenerator.AddUniform("model_view_projection", "mat4");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator
+ << "\tvec3 textPos = vec3(attr_pos.x * text_dimensions.x + text_dimensions.z"
+ << ", attr_pos.y * text_dimensions.y + text_dimensions.w"
+ << ", attr_pos.z);" << Endl;
+
+ vertexGenerator.Append("\tgl_Position = model_view_projection * vec4(textPos, 1.0);");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+
+ fragmentGenerator.AddUniform("text_textcolor", "vec4");
+ fragmentGenerator.AddUniform("text_textdimensions", "vec3");
+ fragmentGenerator.AddUniform("text_image", "sampler2D");
+ fragmentGenerator.AddUniform("text_backgroundcolor", "vec3");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec2 theCoords = uv_coords;");
+ // Enable rendering from a sub-rect
+
+ fragmentGenerator
+ << "\ttheCoords.x = theCoords.x * text_textdimensions.x;" << Endl
+ << "\ttheCoords.y = theCoords.y * text_textdimensions.y;" << Endl
+ // flip the y uv coord if the dimension's z variable is set
+ << "\tif ( text_textdimensions.z > 0.0 ) theCoords.y = 1.0 - theCoords.y;" << Endl;
+ fragmentGenerator.Append(
+ "\tvec4 c = texture2D(text_image, theCoords);");
+ fragmentGenerator.Append(
+ "\tfragOutput = vec4(mix(text_backgroundcolor.rgb, "
+ "text_textcolor.rgb, c.rgb), c.a) * text_textcolor.a;");
+
+ vertexGenerator.Append("}");
+ fragmentGenerator.Append("}");
+ const char *shaderName = "text shader";
+ theShader = GetProgramGenerator().CompileGeneratedShader(
+ shaderName, SShaderCacheProgramFlags(), TShaderFeatureSet(), false);
+ } else {
+ GetProgramGenerator().BeginProgram(
+ TShaderGeneratorStageFlags(ShaderGeneratorStages::Fragment));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ fragmentGenerator.AddUniform("text_textcolor", "vec4");
+ fragmentGenerator.AddUniform("text_backgroundcolor", "vec3");
+
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tfragOutput = vec4(mix(text_backgroundcolor.rgb, "
+ "text_textcolor.rgb, text_textcolor.a), text_textcolor.a );");
+ fragmentGenerator.Append("}");
+
+ const char *shaderName = "text path shader";
+ theShader = GetProgramGenerator().CompileGeneratedShader(
+ shaderName, SShaderCacheProgramFlags(), TShaderFeatureSet(), true);
+
+ // setup program pipeline
+ if (theShader) {
+ thePipeline = GetContext().CreateProgramPipeline();
+ if (thePipeline) {
+ thePipeline->SetProgramStages(
+ theShader,
+ qt3ds::render::NVRenderShaderTypeFlags(NVRenderShaderTypeValue::Fragment));
+ }
+ }
+ }
+
+ if (theShader == NULL) {
+ thePtr.Set(NULL);
+ } else {
+ GenerateXYQuad();
+ thePtr.Set(QT3DS_NEW(m_Context->GetAllocator(), STextShader)(*theShader, thePipeline));
+ }
+ return STextRenderHelper(thePtr, *m_QuadInputAssembler);
+ }
+
+ STextDepthShader *Qt3DSRendererImpl::GetTextDepthShader()
+ {
+ if (m_TextDepthPrepassShader.hasValue() == false) {
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ // xy of text dimensions are scaling factors, zw are offset factors.
+ vertexGenerator.AddUniform("text_dimensions", "vec4");
+ vertexGenerator.AddUniform("model_view_projection", "mat4");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator
+ << "\tvec3 textPos = vec3(attr_pos.x * text_dimensions.x + text_dimensions.z"
+ << ", attr_pos.y * text_dimensions.y + text_dimensions.w"
+ << ", attr_pos.z);" << Endl;
+
+ vertexGenerator.Append("\tgl_Position = model_view_projection * vec4(textPos, 1.0);");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+
+ fragmentGenerator.AddUniform("text_textdimensions", "vec3");
+ fragmentGenerator.AddUniform("text_image", "sampler2D");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec2 theCoords = uv_coords;");
+ // Enable rendering from a sub-rect
+
+ fragmentGenerator
+ << "\ttheCoords.x = theCoords.x * text_textdimensions.x;" << Endl
+ << "\ttheCoords.y = theCoords.y * text_textdimensions.y;" << Endl
+ // flip the y uv coord if the dimension's z variable is set
+ << "\tif ( text_textdimensions.z > 0.0 ) theCoords.y = 1.0 - theCoords.y;" << Endl;
+ fragmentGenerator.Append("\tfloat alpha_mask = texture2D( text_image, theCoords ).r;");
+ fragmentGenerator.Append("\tif ( alpha_mask < .05 ) discard;");
+ vertexGenerator.Append("}");
+ fragmentGenerator.Append("}");
+ const char *shaderName = "text depth shader";
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ shaderName, SShaderCacheProgramFlags(), TShaderFeatureSet());
+ if (theShader == NULL) {
+ m_TextDepthPrepassShader = NVScopedRefCounted<STextDepthShader>();
+ } else {
+ GenerateXYQuad();
+ m_TextDepthPrepassShader = NVScopedRefCounted<STextDepthShader>(
+ QT3DS_NEW(m_Context->GetAllocator(), STextDepthShader)(
+ m_Context->GetAllocator(), *theShader, *m_QuadInputAssembler));
+ }
+ }
+ return m_TextDepthPrepassShader->mPtr;
+ }
+
+ STextRenderHelper Qt3DSRendererImpl::GetTextWidgetShader()
+ {
+ if (m_TextWidgetShader.HasGeneratedShader())
+ return STextRenderHelper(m_TextWidgetShader, *m_QuadInputAssembler);
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ // xy of text dimensions are scaling factors, zw are offset factors.
+ vertexGenerator.AddUniform("text_dimensions", "vec4");
+ vertexGenerator.AddUniform("model_view_projection", "mat4");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator
+ << "\tvec3 textPos = vec3(attr_pos.x * text_dimensions.x + text_dimensions.z"
+ << ", attr_pos.y * text_dimensions.y + text_dimensions.w"
+ << ", attr_pos.z);" << Endl;
+
+ vertexGenerator.Append("\tgl_Position = model_view_projection * vec4(textPos, 1.0);");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("text_textcolor", "vec4");
+ fragmentGenerator.AddUniform("text_textdimensions", "vec3");
+ fragmentGenerator.AddUniform("text_image", "sampler2D");
+ fragmentGenerator.AddUniform("text_backgroundcolor", "vec3");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec2 theCoords = uv_coords;");
+ // Enable rendering from a sub-rect
+
+ fragmentGenerator << "\ttheCoords.x = theCoords.x * text_textdimensions.x;" << Endl
+ << "\ttheCoords.y = theCoords.y * text_textdimensions.y;" << Endl
+ // flip the y uv coord if the dimension's z variable is set
+ << "\tif ( text_textdimensions.z > 0.0 ) theCoords.y = 1.0 - theCoords.y;"
+ << Endl;
+ fragmentGenerator.Append(
+ "\tfloat alpha_mask = texture2D( text_image, theCoords ).r * text_textcolor.a;");
+ fragmentGenerator.Append("\tfragOutput = vec4(mix(text_backgroundcolor.rgb, "
+ "text_textcolor.rgb, alpha_mask), 1.0 );");
+ fragmentGenerator.Append("}");
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "text widget shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (theShader == NULL)
+ m_TextWidgetShader.Set(NULL);
+ else {
+ GenerateXYQuad();
+ m_TextWidgetShader.Set(QT3DS_NEW(m_Context->GetAllocator(), STextShader)(*theShader));
+ }
+ return STextRenderHelper(m_TextWidgetShader, *m_QuadInputAssembler);
+ }
+
+ STextRenderHelper Qt3DSRendererImpl::GetOnscreenTextShader()
+ {
+ if (m_TextOnscreenShader.HasGeneratedShader())
+ return STextRenderHelper(m_TextOnscreenShader, *m_QuadStripInputAssembler);
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddUniform("model_view_projection", "mat4");
+ vertexGenerator.AddUniform("vertex_offsets", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+
+ vertexGenerator.Append("\tvec3 pos = attr_pos + vec3(vertex_offsets, 0.0);");
+ vertexGenerator.Append("\tgl_Position = model_view_projection * vec4(pos, 1.0);");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("text_textcolor", "vec4");
+ fragmentGenerator.AddUniform("text_image", "sampler2D");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tfloat alpha = texture2D( text_image, uv_coords ).a;");
+ fragmentGenerator.Append(
+ "\tfragOutput = vec4(text_textcolor.r, text_textcolor.g, text_textcolor.b, alpha);");
+ fragmentGenerator.Append("}");
+
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "onscreen texture shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ if (theShader == NULL)
+ m_TextOnscreenShader.Set(NULL);
+ else {
+ GenerateXYQuadStrip();
+ m_TextOnscreenShader.Set(QT3DS_NEW(m_Context->GetAllocator(), STextShader)(*theShader));
+ }
+ return STextRenderHelper(m_TextOnscreenShader, *m_QuadStripInputAssembler);
+ }
+
+ NVRenderShaderProgram *Qt3DSRendererImpl::GetTextAtlasEntryShader()
+ {
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddUniform("model_view_projection", "mat4");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+
+ vertexGenerator.Append("\tgl_Position = model_view_projection * vec4(attr_pos, 1.0);");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("text_image", "sampler2D");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tfloat alpha = texture2D( text_image, uv_coords ).a;");
+ fragmentGenerator.Append("\tfragOutput = vec4(alpha, alpha, alpha, alpha);");
+ fragmentGenerator.Append("}");
+
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "texture atlas entry shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ return theShader;
+ }
+
+ STextRenderHelper Qt3DSRendererImpl::GetShader(STextRenderable & /*inRenderable*/,
+ bool inUsePathRendering)
+ {
+ return GetTextShader(inUsePathRendering);
+ }
+
+ SLayerSceneShader *Qt3DSRendererImpl::GetSceneLayerShader()
+ {
+ if (m_SceneLayerShader.hasValue())
+ return m_SceneLayerShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ // xy of text dimensions are scaling factors, zw are offset factors.
+ vertexGenerator.AddUniform("layer_dimensions", "vec2");
+ vertexGenerator.AddUniform("model_view_projection", "mat4");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator << "\tvec3 layerPos = vec3(attr_pos.x * layer_dimensions.x / 2.0"
+ << ", attr_pos.y * layer_dimensions.y / 2.0"
+ << ", attr_pos.z);" << Endl;
+
+ vertexGenerator.Append("\tgl_Position = model_view_projection * vec4(layerPos, 1.0);");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("layer_image", "sampler2D");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec2 theCoords = uv_coords;\n");
+ fragmentGenerator.Append("\tvec4 theLayerTexture = texture2D( layer_image, theCoords );\n");
+ fragmentGenerator.Append("\tif( theLayerTexture.a == 0.0 ) discard;\n");
+ fragmentGenerator.Append("\tfragOutput = theLayerTexture;\n");
+ fragmentGenerator.Append("}");
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "layer shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+ NVScopedRefCounted<SLayerSceneShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SLayerSceneShader)(*theShader);
+ m_SceneLayerShader = retval;
+ return m_SceneLayerShader.getValue();
+ }
+
+ SLayerProgAABlendShader *Qt3DSRendererImpl::GetLayerProgAABlendShader()
+ {
+ if (m_LayerProgAAShader.hasValue())
+ return m_LayerProgAAShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+ fragmentGenerator.AddUniform("accumulator", "sampler2D");
+ fragmentGenerator.AddUniform("last_frame", "sampler2D");
+ fragmentGenerator.AddUniform("blend_factors", "vec2");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec4 accum = texture2D( accumulator, uv_coords );");
+ fragmentGenerator.Append("\tvec4 lastFrame = texture2D( last_frame, uv_coords );");
+ fragmentGenerator.Append(
+ "\tgl_FragColor = accum*blend_factors.y + lastFrame*blend_factors.x;");
+ fragmentGenerator.Append("}");
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "layer progressiveAA blend shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+ NVScopedRefCounted<SLayerProgAABlendShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SLayerProgAABlendShader)(*theShader);
+ m_LayerProgAAShader = retval;
+ return m_LayerProgAAShader.getValue();
+ }
+
+ SShadowmapPreblurShader *Qt3DSRendererImpl::GetCubeShadowBlurXShader()
+ {
+ if (m_CubeShadowBlurXShader.hasValue())
+ return m_CubeShadowBlurXShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ // vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords.xy = attr_pos.xy;");
+ vertexGenerator.Append("}");
+
+ // This with the ShadowBlurYShader design for a 2-pass 5x5 (sigma=1.0)
+ // Weights computed using -- http://dev.theomader.com/gaussian-kernel-calculator/
+ fragmentGenerator.AddUniform("camera_properties", "vec2");
+ fragmentGenerator.AddUniform("depthCube", "samplerCube");
+ // fragmentGenerator.AddUniform("depthSrc", "sampler2D");
+ fragmentGenerator.Append("layout(location = 0) out vec4 frag0;");
+ fragmentGenerator.Append("layout(location = 1) out vec4 frag1;");
+ fragmentGenerator.Append("layout(location = 2) out vec4 frag2;");
+ fragmentGenerator.Append("layout(location = 3) out vec4 frag3;");
+ fragmentGenerator.Append("layout(location = 4) out vec4 frag4;");
+ fragmentGenerator.Append("layout(location = 5) out vec4 frag5;");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tfloat ofsScale = camera_properties.x / 2500.0;");
+ fragmentGenerator.Append("\tvec3 dir0 = vec3(1.0, -uv_coords.y, -uv_coords.x);");
+ fragmentGenerator.Append("\tvec3 dir1 = vec3(-1.0, -uv_coords.y, uv_coords.x);");
+ fragmentGenerator.Append("\tvec3 dir2 = vec3(uv_coords.x, 1.0, uv_coords.y);");
+ fragmentGenerator.Append("\tvec3 dir3 = vec3(uv_coords.x, -1.0, -uv_coords.y);");
+ fragmentGenerator.Append("\tvec3 dir4 = vec3(uv_coords.x, -uv_coords.y, 1.0);");
+ fragmentGenerator.Append("\tvec3 dir5 = vec3(-uv_coords.x, -uv_coords.y, -1.0);");
+ fragmentGenerator.Append("\tfloat depth0;");
+ fragmentGenerator.Append("\tfloat depth1;");
+ fragmentGenerator.Append("\tfloat depth2;");
+ fragmentGenerator.Append("\tfloat outDepth;");
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir0).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir0 + vec3(0.0, 0.0, -ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir0 + vec3(0.0, 0.0, ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir0 + vec3(0.0, 0.0, -2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir0 + vec3(0.0, 0.0, 2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag0 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir1).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir1 + vec3(0.0, 0.0, -ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir1 + vec3(0.0, 0.0, ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir1 + vec3(0.0, 0.0, -2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir1 + vec3(0.0, 0.0, 2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag1 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir2).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir2 + vec3(-ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir2 + vec3(ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir2 + vec3(-2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir2 + vec3(2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag2 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir3).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir3 + vec3(-ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir3 + vec3(ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir3 + vec3(-2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir3 + vec3(2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag3 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir4).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir4 + vec3(-ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir4 + vec3(ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir4 + vec3(-2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir4 + vec3(2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag4 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir5).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir5 + vec3(-ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir5 + vec3(ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir5 + vec3(-2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir5 + vec3(2.0*ofsScale, 0.0, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag5 = vec4(outDepth);");
+
+ fragmentGenerator.Append("}");
+
+ CRegisteredString featureName(m_StringTable->RegisterStr("NO_FRAG_OUTPUT"));
+ SShaderPreprocessorFeature noFragOutputFeature(featureName, true);
+
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "cubemap shadow blur X shader", SShaderCacheProgramFlags(),
+ TShaderFeatureSet(&noFragOutputFeature, 1));
+ NVScopedRefCounted<SShadowmapPreblurShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SShadowmapPreblurShader)(*theShader);
+ m_CubeShadowBlurXShader = retval;
+ return m_CubeShadowBlurXShader.getValue();
+ }
+
+ SShadowmapPreblurShader *Qt3DSRendererImpl::GetCubeShadowBlurYShader()
+ {
+ if (m_CubeShadowBlurYShader.hasValue())
+ return m_CubeShadowBlurYShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ // vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords.xy = attr_pos.xy;");
+ vertexGenerator.Append("}");
+
+ // This with the ShadowBlurXShader design for a 2-pass 5x5 (sigma=1.0)
+ // Weights computed using -- http://dev.theomader.com/gaussian-kernel-calculator/
+ fragmentGenerator.AddUniform("camera_properties", "vec2");
+ fragmentGenerator.AddUniform("depthCube", "samplerCube");
+ // fragmentGenerator.AddUniform("depthSrc", "sampler2D");
+ fragmentGenerator.Append("layout(location = 0) out vec4 frag0;");
+ fragmentGenerator.Append("layout(location = 1) out vec4 frag1;");
+ fragmentGenerator.Append("layout(location = 2) out vec4 frag2;");
+ fragmentGenerator.Append("layout(location = 3) out vec4 frag3;");
+ fragmentGenerator.Append("layout(location = 4) out vec4 frag4;");
+ fragmentGenerator.Append("layout(location = 5) out vec4 frag5;");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tfloat ofsScale = camera_properties.x / 2500.0;");
+ fragmentGenerator.Append("\tvec3 dir0 = vec3(1.0, -uv_coords.y, -uv_coords.x);");
+ fragmentGenerator.Append("\tvec3 dir1 = vec3(-1.0, -uv_coords.y, uv_coords.x);");
+ fragmentGenerator.Append("\tvec3 dir2 = vec3(uv_coords.x, 1.0, uv_coords.y);");
+ fragmentGenerator.Append("\tvec3 dir3 = vec3(uv_coords.x, -1.0, -uv_coords.y);");
+ fragmentGenerator.Append("\tvec3 dir4 = vec3(uv_coords.x, -uv_coords.y, 1.0);");
+ fragmentGenerator.Append("\tvec3 dir5 = vec3(-uv_coords.x, -uv_coords.y, -1.0);");
+ fragmentGenerator.Append("\tfloat depth0;");
+ fragmentGenerator.Append("\tfloat depth1;");
+ fragmentGenerator.Append("\tfloat depth2;");
+ fragmentGenerator.Append("\tfloat outDepth;");
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir0).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir0 + vec3(0.0, -ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir0 + vec3(0.0, ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir0 + vec3(0.0, -2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir0 + vec3(0.0, 2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag0 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir1).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir1 + vec3(0.0, -ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir1 + vec3(0.0, ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir1 + vec3(0.0, -2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir1 + vec3(0.0, 2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag1 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir2).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir2 + vec3(0.0, 0.0, -ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir2 + vec3(0.0, 0.0, ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir2 + vec3(0.0, 0.0, -2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir2 + vec3(0.0, 0.0, 2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag2 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir3).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir3 + vec3(0.0, 0.0, -ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir3 + vec3(0.0, 0.0, ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir3 + vec3(0.0, 0.0, -2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir3 + vec3(0.0, 0.0, 2.0*ofsScale)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag3 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir4).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir4 + vec3(0.0, -ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir4 + vec3(0.0, ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir4 + vec3(0.0, -2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir4 + vec3(0.0, 2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag4 = vec4(outDepth);");
+
+ fragmentGenerator.Append("\tdepth0 = texture(depthCube, dir5).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 = texture(depthCube, dir5 + vec3(0.0, -ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth1 += texture(depthCube, dir5 + vec3(0.0, ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 = texture(depthCube, dir5 + vec3(0.0, -2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\tdepth2 += texture(depthCube, dir5 + vec3(0.0, 2.0*ofsScale, 0.0)).x;");
+ fragmentGenerator.Append(
+ "\toutDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfrag5 = vec4(outDepth);");
+
+ fragmentGenerator.Append("}");
+
+ CRegisteredString featureName(m_StringTable->RegisterStr("NO_FRAG_OUTPUT"));
+ SShaderPreprocessorFeature noFragOutputFeature(featureName, true);
+
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "cubemap shadow blur Y shader", SShaderCacheProgramFlags(),
+ TShaderFeatureSet(&noFragOutputFeature, 1));
+ NVScopedRefCounted<SShadowmapPreblurShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SShadowmapPreblurShader)(*theShader);
+ m_CubeShadowBlurYShader = retval;
+ return m_CubeShadowBlurYShader.getValue();
+ }
+
+ SShadowmapPreblurShader *Qt3DSRendererImpl::GetOrthoShadowBlurXShader()
+ {
+ if (m_OrthoShadowBlurXShader.hasValue())
+ return m_OrthoShadowBlurXShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords.xy = attr_uv.xy;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("camera_properties", "vec2");
+ fragmentGenerator.AddUniform("depthSrc", "sampler2D");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec2 ofsScale = vec2( camera_properties.x / 7680.0, 0.0 );");
+ fragmentGenerator.Append("\tfloat depth0 = texture(depthSrc, uv_coords).x;");
+ fragmentGenerator.Append("\tfloat depth1 = texture(depthSrc, uv_coords + ofsScale).x;");
+ fragmentGenerator.Append("\tdepth1 += texture(depthSrc, uv_coords - ofsScale).x;");
+ fragmentGenerator.Append(
+ "\tfloat depth2 = texture(depthSrc, uv_coords + 2.0 * ofsScale).x;");
+ fragmentGenerator.Append("\tdepth2 += texture(depthSrc, uv_coords - 2.0 * ofsScale).x;");
+ fragmentGenerator.Append(
+ "\tfloat outDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfragOutput = vec4(outDepth);");
+ fragmentGenerator.Append("}");
+
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "shadow map blur X shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+ NVScopedRefCounted<SShadowmapPreblurShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SShadowmapPreblurShader)(*theShader);
+ m_OrthoShadowBlurXShader = retval;
+ return m_OrthoShadowBlurXShader.getValue();
+ }
+
+ SShadowmapPreblurShader *Qt3DSRendererImpl::GetOrthoShadowBlurYShader()
+ {
+ if (m_OrthoShadowBlurYShader.hasValue())
+ return m_OrthoShadowBlurYShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords.xy = attr_uv.xy;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("camera_properties", "vec2");
+ fragmentGenerator.AddUniform("depthSrc", "sampler2D");
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec2 ofsScale = vec2( 0.0, camera_properties.x / 7680.0 );");
+ fragmentGenerator.Append("\tfloat depth0 = texture(depthSrc, uv_coords).x;");
+ fragmentGenerator.Append("\tfloat depth1 = texture(depthSrc, uv_coords + ofsScale).x;");
+ fragmentGenerator.Append("\tdepth1 += texture(depthSrc, uv_coords - ofsScale).x;");
+ fragmentGenerator.Append(
+ "\tfloat depth2 = texture(depthSrc, uv_coords + 2.0 * ofsScale).x;");
+ fragmentGenerator.Append("\tdepth2 += texture(depthSrc, uv_coords - 2.0 * ofsScale).x;");
+ fragmentGenerator.Append(
+ "\tfloat outDepth = 0.38774 * depth0 + 0.24477 * depth1 + 0.06136 * depth2;");
+ fragmentGenerator.Append("\tfragOutput = vec4(outDepth);");
+ fragmentGenerator.Append("}");
+
+ NVRenderShaderProgram *theShader = GetProgramGenerator().CompileGeneratedShader(
+ "shadow map blur Y shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+ NVScopedRefCounted<SShadowmapPreblurShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SShadowmapPreblurShader)(*theShader);
+ m_OrthoShadowBlurYShader = retval;
+ return m_OrthoShadowBlurYShader.getValue();
+ }
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ SAdvancedModeBlendShader *
+ Qt3DSRendererImpl::GetAdvancedBlendModeShader(AdvancedBlendModes::Enum blendMode)
+ {
+ // Select between blend equations.
+ if (blendMode == AdvancedBlendModes::Overlay) {
+ return GetOverlayBlendModeShader();
+ } else if (blendMode == AdvancedBlendModes::ColorBurn) {
+ return GetColorBurnBlendModeShader();
+ } else if (blendMode == AdvancedBlendModes::ColorDodge) {
+ return GetColorDodgeBlendModeShader();
+ }
+ return {};
+ }
+
+ SAdvancedModeBlendShader *Qt3DSRendererImpl::GetOverlayBlendModeShader()
+ {
+ if (m_AdvancedModeOverlayBlendShader.hasValue())
+ return m_AdvancedModeOverlayBlendShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("base_layer", "sampler2D");
+ fragmentGenerator.AddUniform("blend_layer", "sampler2D");
+
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec4 base = texture2D(base_layer, uv_coords);");
+ fragmentGenerator.Append("\tif (base.a != 0.0) base.rgb /= base.a;");
+ fragmentGenerator.Append("\telse base = vec4(0.0);");
+ fragmentGenerator.Append("\tvec4 blend = texture2D(blend_layer, uv_coords);");
+ fragmentGenerator.Append("\tif (blend.a != 0.0) blend.rgb /= blend.a;");
+ fragmentGenerator.Append("\telse blend = vec4(0.0);");
+
+ fragmentGenerator.Append("\tvec4 res = vec4(0.0);");
+ fragmentGenerator.Append("\tfloat p0 = base.a * blend.a;");
+ fragmentGenerator.Append("\tfloat p1 = base.a * (1.0 - blend.a);");
+ fragmentGenerator.Append("\tfloat p2 = blend.a * (1.0 - base.a);");
+ fragmentGenerator.Append("\tres.a = p0 + p1 + p2;");
+
+ NVRenderShaderProgram *theShader;
+ fragmentGenerator.Append(
+ "\tfloat f_rs_rd = (base.r < 0.5? (2.0 * base.r * blend.r) : "
+ "(1.0 - 2.0 * (1.0 - base.r) * (1.0 - blend.r)));");
+ fragmentGenerator.Append(
+ "\tfloat f_gs_gd = (base.g < 0.5? (2.0 * base.g * blend.g) : "
+ "(1.0 - 2.0 * (1.0 - base.g) * (1.0 - blend.g)));");
+ fragmentGenerator.Append(
+ "\tfloat f_bs_bd = (base.b < 0.5? (2.0 * base.b * blend.b) : "
+ "(1.0 - 2.0 * (1.0 - base.b) * (1.0 - blend.b)));");
+ fragmentGenerator.Append("\tres.r = f_rs_rd * p0 + base.r * p1 + blend.r * p2;");
+ fragmentGenerator.Append("\tres.g = f_gs_gd * p0 + base.g * p1 + blend.g * p2;");
+ fragmentGenerator.Append("\tres.b = f_bs_bd * p0 + base.b * p1 + blend.b * p2;");
+ fragmentGenerator.Append("\tgl_FragColor = vec4(res.rgb * res.a, res.a);");
+ fragmentGenerator.Append("}");
+ theShader = GetProgramGenerator().CompileGeneratedShader(
+ "advanced overlay shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+
+ NVScopedRefCounted<SAdvancedModeBlendShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SAdvancedModeBlendShader)(*theShader);
+ m_AdvancedModeOverlayBlendShader = retval;
+ return m_AdvancedModeOverlayBlendShader.getValue();
+ }
+
+ SAdvancedModeBlendShader *Qt3DSRendererImpl::GetColorBurnBlendModeShader()
+ {
+ if (m_AdvancedModeColorBurnBlendShader.hasValue())
+ return m_AdvancedModeColorBurnBlendShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("base_layer", "sampler2D");
+ fragmentGenerator.AddUniform("blend_layer", "sampler2D");
+
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec4 base = texture2D(base_layer, uv_coords);");
+ fragmentGenerator.Append("\tif (base.a != 0.0) base.rgb /= base.a;");
+ fragmentGenerator.Append("\telse base = vec4(0.0);");
+ fragmentGenerator.Append("\tvec4 blend = texture2D(blend_layer, uv_coords);");
+ fragmentGenerator.Append("\tif (blend.a != 0.0) blend.rgb /= blend.a;");
+ fragmentGenerator.Append("\telse blend = vec4(0.0);");
+
+ fragmentGenerator.Append("\tvec4 res = vec4(0.0);");
+ fragmentGenerator.Append("\tfloat p0 = base.a * blend.a;");
+ fragmentGenerator.Append("\tfloat p1 = base.a * (1.0 - blend.a);");
+ fragmentGenerator.Append("\tfloat p2 = blend.a * (1.0 - base.a);");
+ fragmentGenerator.Append("\tres.a = p0 + p1 + p2;");
+
+ NVRenderShaderProgram *theShader;
+ fragmentGenerator.Append(
+ "\tfloat f_rs_rd = ((base.r == 1.0) ? 1.0 : "
+ "(blend.r == 0.0) ? 0.0 : 1.0 - min(1.0, ((1.0 - base.r) / blend.r)));");
+ fragmentGenerator.Append(
+ "\tfloat f_gs_gd = ((base.g == 1.0) ? 1.0 : "
+ "(blend.g == 0.0) ? 0.0 : 1.0 - min(1.0, ((1.0 - base.g) / blend.g)));");
+ fragmentGenerator.Append(
+ "\tfloat f_bs_bd = ((base.b == 1.0) ? 1.0 : "
+ "(blend.b == 0.0) ? 0.0 : 1.0 - min(1.0, ((1.0 - base.b) / blend.b)));");
+ fragmentGenerator.Append("\tres.r = f_rs_rd * p0 + base.r * p1 + blend.r * p2;");
+ fragmentGenerator.Append("\tres.g = f_gs_gd * p0 + base.g * p1 + blend.g * p2;");
+ fragmentGenerator.Append("\tres.b = f_bs_bd * p0 + base.b * p1 + blend.b * p2;");
+ fragmentGenerator.Append("\tgl_FragColor = vec4(res.rgb * res.a, res.a);");
+ fragmentGenerator.Append("}");
+
+ theShader = GetProgramGenerator().CompileGeneratedShader(
+ "advanced colorBurn shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+ NVScopedRefCounted<SAdvancedModeBlendShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SAdvancedModeBlendShader)(*theShader);
+ m_AdvancedModeColorBurnBlendShader = retval;
+ return m_AdvancedModeColorBurnBlendShader.getValue();
+
+ }
+
+ SAdvancedModeBlendShader *Qt3DSRendererImpl::GetColorDodgeBlendModeShader()
+ {
+ if (m_AdvancedModeColorDodgeBlendShader.hasValue())
+ return m_AdvancedModeColorDodgeBlendShader.getValue();
+
+ GetProgramGenerator().BeginProgram();
+
+ IShaderStageGenerator &vertexGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Vertex));
+ IShaderStageGenerator &fragmentGenerator(
+ *GetProgramGenerator().GetStage(ShaderGeneratorStages::Fragment));
+ vertexGenerator.AddIncoming("attr_pos", "vec3");
+ vertexGenerator.AddIncoming("attr_uv", "vec2");
+ vertexGenerator.AddOutgoing("uv_coords", "vec2");
+ vertexGenerator.Append("void main() {");
+ vertexGenerator.Append("\tgl_Position = vec4(attr_pos, 1.0 );");
+ vertexGenerator.Append("\tuv_coords = attr_uv;");
+ vertexGenerator.Append("}");
+
+ fragmentGenerator.AddUniform("base_layer", "sampler2D");
+ fragmentGenerator.AddUniform("blend_layer", "sampler2D");
+
+ fragmentGenerator.Append("void main() {");
+ fragmentGenerator.Append("\tvec4 base = texture2D(base_layer, uv_coords);");
+ fragmentGenerator.Append("\tif (base.a != 0.0) base.rgb /= base.a;");
+ fragmentGenerator.Append("\telse base = vec4(0.0);");
+ fragmentGenerator.Append("\tvec4 blend = texture2D(blend_layer, uv_coords);");
+ fragmentGenerator.Append("\tif (blend.a != 0.0) blend.rgb /= blend.a;");
+ fragmentGenerator.Append("\telse blend = vec4(0.0);");
+
+ fragmentGenerator.Append("\tvec4 res = vec4(0.0);");
+ fragmentGenerator.Append("\tfloat p0 = base.a * blend.a;");
+ fragmentGenerator.Append("\tfloat p1 = base.a * (1.0 - blend.a);");
+ fragmentGenerator.Append("\tfloat p2 = blend.a * (1.0 - base.a);");
+ fragmentGenerator.Append("\tres.a = p0 + p1 + p2;");
+
+ NVRenderShaderProgram *theShader;
+ fragmentGenerator.Append(
+ "\tfloat f_rs_rd = ((base.r == 0.0) ? 0.0 : "
+ "(blend.r == 1.0) ? 1.0 : min(base.r / (1.0 - blend.r), 1.0));");
+ fragmentGenerator.Append(
+ "\tfloat f_gs_gd = ((base.g == 0.0) ? 0.0 : "
+ "(blend.g == 1.0) ? 1.0 : min(base.g / (1.0 - blend.g), 1.0));");
+ fragmentGenerator.Append(
+ "\tfloat f_bs_bd = ((base.b == 0.0) ? 0.0 : "
+ "(blend.b == 1.0) ? 1.0 : min(base.b / (1.0 - blend.b), 1.0));");
+ fragmentGenerator.Append("\tres.r = f_rs_rd * p0 + base.r * p1 + blend.r * p2;");
+ fragmentGenerator.Append("\tres.g = f_gs_gd * p0 + base.g * p1 + blend.g * p2;");
+ fragmentGenerator.Append("\tres.b = f_bs_bd * p0 + base.b * p1 + blend.b * p2;");
+
+ fragmentGenerator.Append("\tgl_FragColor = vec4(res.rgb * res.a, res.a);");
+ fragmentGenerator.Append("}");
+ theShader = GetProgramGenerator().CompileGeneratedShader(
+ "advanced colorDodge shader", SShaderCacheProgramFlags(), TShaderFeatureSet());
+ NVScopedRefCounted<SAdvancedModeBlendShader> retval;
+ if (theShader)
+ retval = QT3DS_NEW(m_Context->GetAllocator(), SAdvancedModeBlendShader)(*theShader);
+ m_AdvancedModeColorDodgeBlendShader = retval;
+ return m_AdvancedModeColorDodgeBlendShader.getValue();
+
+ }
+#endif
+}
+}
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h
new file mode 100644
index 0000000..1ac85db
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImplShaders.h
@@ -0,0 +1,452 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDERER_IMPL_SHADERS_H
+#define QT3DS_RENDERER_IMPL_SHADERS_H
+#include "Qt3DSRender.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+#include "render/Qt3DSRenderProgramPipeline.h"
+
+namespace qt3ds {
+namespace render {
+ using qt3ds::render::NVRenderCachedShaderProperty;
+ using qt3ds::render::NVRenderCachedShaderBuffer;
+
+ /**
+ * Cached tessellation property lookups this is on a per mesh base
+ */
+ struct SShaderTessellationProperties
+ {
+ NVRenderCachedShaderProperty<QT3DSF32> m_EdgeTessLevel; ///< tesselation value for the edges
+ NVRenderCachedShaderProperty<QT3DSF32> m_InsideTessLevel; ///< tesselation value for the inside
+ NVRenderCachedShaderProperty<QT3DSF32>
+ m_PhongBlend; ///< blending between linear and phong component
+ NVRenderCachedShaderProperty<QT3DSVec2>
+ m_DistanceRange; ///< distance range for min and max tess level
+ NVRenderCachedShaderProperty<QT3DSF32> m_DisableCulling; ///< if set to 1.0 this disables
+ ///backface culling optimization in
+ ///the tess shader
+
+ SShaderTessellationProperties() {}
+ SShaderTessellationProperties(NVRenderShaderProgram &inShader)
+ : m_EdgeTessLevel("tessLevelOuter", inShader)
+ , m_InsideTessLevel("tessLevelInner", inShader)
+ , m_PhongBlend("phongBlend", inShader)
+ , m_DistanceRange("distanceRange", inShader)
+ , m_DisableCulling("disableCulling", inShader)
+ {
+ }
+ };
+
+ /**
+ * The results of generating a shader. Caches all possible variable names into
+ * typesafe objects.
+ */
+ struct SShaderGeneratorGeneratedShader
+ {
+ QT3DSU32 m_LayerSetIndex;
+ CRegisteredString m_QueryString;
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewportMatrix;
+ SShaderTessellationProperties m_Tessellation;
+
+ SShaderGeneratorGeneratedShader(CRegisteredString inQueryString,
+ NVRenderShaderProgram &inShader)
+ : m_LayerSetIndex(QT3DS_MAX_U32)
+ , m_QueryString(inQueryString)
+ , m_Shader(inShader)
+ , m_ViewportMatrix("viewport_matrix", inShader)
+ , m_Tessellation(inShader)
+ {
+ m_Shader.addRef();
+ }
+ ~SShaderGeneratorGeneratedShader() { m_Shader.release(); }
+ static QT3DSU32 GetLayerIndex(const SShaderGeneratorGeneratedShader &inShader)
+ {
+ return inShader.m_LayerSetIndex;
+ }
+ static void SetLayerIndex(SShaderGeneratorGeneratedShader &inShader, QT3DSU32 idx)
+ {
+ inShader.m_LayerSetIndex = idx;
+ }
+ };
+
+ struct SDefaultMaterialRenderableDepthShader
+ {
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_MVP;
+
+ QT3DSI32 m_RefCount;
+ SDefaultMaterialRenderableDepthShader(NVRenderShaderProgram &inShader,
+ NVRenderContext &inContext)
+ : m_Allocator(inContext.GetAllocator())
+ , m_Shader(inShader)
+ , m_MVP("model_view_projection", inShader)
+ , m_RefCount(0)
+ {
+ m_Shader.addRef();
+ }
+
+ ~SDefaultMaterialRenderableDepthShader() { m_Shader.release(); }
+
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0)
+ NVDelete(m_Allocator, this);
+ }
+ };
+
+ /**
+ * Cached texture property lookups, used one per texture so a shader generator for N
+ * textures will have an array of N of these lookup objects.
+ */
+ struct SShaderTextureProperties
+ {
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_Offsets;
+ NVRenderCachedShaderProperty<QT3DSVec4> m_Rotations;
+ SShaderTextureProperties(const char *sampName, const char *offName, const char *rotName,
+ NVRenderShaderProgram &inShader)
+ : m_Sampler(sampName, inShader)
+ , m_Offsets(offName, inShader)
+ , m_Rotations(rotName, inShader)
+ {
+ }
+ SShaderTextureProperties() {}
+ };
+
+ struct SRenderableDepthPrepassShader
+ {
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_MVP;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_GlobalTransform;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_Projection;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraPosition;
+ NVRenderCachedShaderProperty<QT3DSF32> m_DisplaceAmount;
+ SShaderTextureProperties m_DisplacementProps;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraProperties;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraDirection;
+ // NVRenderCachedShaderProperty<QT3DSMat44> m_ShadowMV[6];
+
+ QT3DSI32 m_RefCount;
+ // Cache the tessellation property name lookups
+ SShaderTessellationProperties m_Tessellation;
+
+ SRenderableDepthPrepassShader(NVRenderShaderProgram &inShader, NVRenderContext &inContext)
+ : m_Allocator(inContext.GetAllocator())
+ , m_Shader(inShader)
+ , m_MVP("model_view_projection", inShader)
+ , m_GlobalTransform("model_matrix", inShader)
+ , m_Projection("projection", inShader)
+ , m_CameraPosition("camera_position", inShader)
+ , m_DisplaceAmount("displaceAmount", inShader)
+ , m_DisplacementProps("displacementSampler", "displacementMap_offset",
+ "displacementMap_rot", inShader)
+ , m_CameraProperties("camera_properties", inShader)
+ , m_CameraDirection("camera_direction", inShader)
+ , m_RefCount(0)
+ , m_Tessellation(inShader)
+ {
+ /*
+ m_ShadowMV[0].m_Shader = &inShader;
+ m_ShadowMV[0].m_Constant = inShader.GetShaderConstant( "shadow_mv0" );
+ m_ShadowMV[1].m_Shader = &inShader;
+ m_ShadowMV[1].m_Constant = inShader.GetShaderConstant( "shadow_mv1" );
+ m_ShadowMV[2].m_Shader = &inShader;
+ m_ShadowMV[2].m_Constant = inShader.GetShaderConstant( "shadow_mv2" );
+ m_ShadowMV[3].m_Shader = &inShader;
+ m_ShadowMV[3].m_Constant = inShader.GetShaderConstant( "shadow_mv3" );
+ m_ShadowMV[4].m_Shader = &inShader;
+ m_ShadowMV[4].m_Constant = inShader.GetShaderConstant( "shadow_mv4" );
+ m_ShadowMV[5].m_Shader = &inShader;
+ m_ShadowMV[5].m_Constant = inShader.GetShaderConstant( "shadow_mv5" );
+ */
+ m_Shader.addRef();
+ }
+
+ ~SRenderableDepthPrepassShader() { m_Shader.release(); }
+
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0)
+ NVDelete(m_Allocator, this);
+ }
+ };
+
+ struct SDefaultAoPassShader
+ {
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_ViewMatrix;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraProperties;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_CameraDirection;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_DepthTexture;
+ NVRenderCachedShaderProperty<NVRenderTextureCube *> m_CubeTexture;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_DepthSamplerSize;
+
+ NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_AoShadowParams;
+ QT3DSI32 m_RefCount;
+
+ SDefaultAoPassShader(NVRenderShaderProgram &inShader, NVRenderContext &inContext)
+ : m_Allocator(inContext.GetAllocator())
+ , m_Shader(inShader)
+ , m_ViewMatrix("view_matrix", inShader)
+ , m_CameraProperties("camera_properties", inShader)
+ , m_CameraDirection("camera_direction", inShader)
+ , m_DepthTexture("depth_sampler", inShader)
+ , m_CubeTexture("depth_cube", inShader)
+ , m_DepthSamplerSize("depth_sampler_size", inShader)
+ , m_AoShadowParams("cbAoShadow", inShader)
+ , m_RefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ ~SDefaultAoPassShader() { m_Shader.release(); }
+
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0)
+ NVDelete(m_Allocator, this);
+ }
+ };
+
+ struct STextShader
+ {
+ NVRenderShaderProgram &m_Shader;
+
+ NVScopedRefCounted<NVRenderProgramPipeline> m_ProgramPipeline;
+
+ NVRenderCachedShaderProperty<QT3DSMat44> m_MVP;
+ // Dimensions and offsetting of the image.
+ NVRenderCachedShaderProperty<QT3DSVec4> m_Dimensions;
+ // The fourth member of text color is the opacity
+ NVRenderCachedShaderProperty<QT3DSVec4> m_TextColor;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_BackgroundColor;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
+ // Dimensions and offsetting of the texture
+ NVRenderCachedShaderProperty<QT3DSVec3> m_TextDimensions;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraProperties;
+ // Used only for onscreen text
+ NVRenderCachedShaderProperty<QT3DSVec2> m_VertexOffsets;
+
+ STextShader(NVRenderShaderProgram &shader, NVRenderProgramPipeline *pipeline = NULL)
+ : m_Shader(shader)
+ , m_ProgramPipeline(pipeline)
+ , m_MVP("model_view_projection", shader)
+ , m_Dimensions("text_dimensions", shader)
+ , m_TextColor("text_textcolor", shader)
+ , m_BackgroundColor("text_backgroundcolor", shader)
+ , m_Sampler("text_image", shader)
+ , m_TextDimensions("text_textdimensions", shader)
+ , m_CameraProperties("camera_properties", shader)
+ , m_VertexOffsets("vertex_offsets", shader)
+ {
+ if (!pipeline)
+ m_Shader.addRef();
+ }
+ ~STextShader()
+ {
+ if (!m_ProgramPipeline.mPtr)
+ m_Shader.release();
+ }
+ void Render(NVRenderTexture2D &inTexture, const STextScaleAndOffset &inScaleAndOffset,
+ const QT3DSVec4 &inTextColor, const QT3DSMat44 &inMVP, const QT3DSVec2 &inCameraVec,
+ NVRenderContext &inRenderContext,
+ NVRenderInputAssembler &inInputAssemblerBuffer, QT3DSU32 count,
+ const STextTextureDetails &inTextTextureDetails,
+ const QT3DSVec3 &inBackgroundColor);
+
+ void RenderPath(NVRenderPathFontItem &inPathFontItem,
+ NVRenderPathFontSpecification &inPathFontSpec,
+ const STextScaleAndOffset &inScaleAndOffset, const QT3DSVec4 &inTextColor,
+ const QT3DSMat44 &inViewProjection, const QT3DSMat44 &inModel,
+ const QT3DSVec2 &inCameraVec, NVRenderContext &inRenderContext,
+ const STextTextureDetails &inTextTextureDetails,
+ const QT3DSVec3 &inBackgroundColor);
+
+ void Render2D(NVRenderTexture2D &inTexture, const QT3DSVec4 &inTextColor, const QT3DSMat44 &inMVP,
+ NVRenderContext &inRenderContext,
+ NVRenderInputAssembler &inInputAssemblerBuffer, QT3DSU32 count,
+ QT3DSVec2 inVertexOffsets);
+ };
+
+ struct STextDepthShader
+ {
+ NVAllocatorCallback &m_Allocator;
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSMat44> m_MVP;
+ // Dimensions and offsetting of the image.
+ NVRenderCachedShaderProperty<QT3DSVec4> m_Dimensions;
+ NVRenderCachedShaderProperty<QT3DSVec3> m_TextDimensions;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraProperties;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
+ NVRenderInputAssembler &m_QuadInputAssembler;
+ QT3DSI32 m_RefCount;
+
+ STextDepthShader(NVAllocatorCallback &alloc, NVRenderShaderProgram &prog,
+ NVRenderInputAssembler &assembler)
+ : m_Allocator(alloc)
+ , m_Shader(prog)
+ , m_MVP("model_view_projection", prog)
+ , m_Dimensions("text_dimensions", prog)
+ , m_TextDimensions("text_textdimensions", prog)
+ , m_CameraProperties("camera_properties", prog)
+ , m_Sampler("text_image", prog)
+ , m_QuadInputAssembler(assembler)
+ , m_RefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ ~STextDepthShader() { m_Shader.release(); }
+ void addRef() { ++m_RefCount; }
+ void release()
+ {
+ --m_RefCount;
+ if (m_RefCount <= 0)
+ NVDelete(m_Allocator, this);
+ }
+ };
+
+ struct SLayerProgAABlendShader
+ {
+ NVScopedRefCounted<NVRenderShaderProgram> m_Shader;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_AccumSampler;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LastFrame;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_BlendFactors;
+ volatile QT3DSI32 mRefCount;
+ SLayerProgAABlendShader(NVRenderShaderProgram &inShader)
+ : m_Shader(inShader)
+ , m_AccumSampler("accumulator", inShader)
+ , m_LastFrame("last_frame", inShader)
+ , m_BlendFactors("blend_factors", inShader)
+ , mRefCount(0)
+ {
+ }
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader->GetRenderContext().GetAllocator())
+ };
+
+ struct SLayerSceneShader
+ {
+ NVRenderShaderProgram &m_Shader;
+
+ NVRenderCachedShaderProperty<QT3DSMat44> m_MVP;
+ // Dimensions and offsetting of the image.
+ NVRenderCachedShaderProperty<QT3DSVec2> m_Dimensions;
+ // The fourth member of text color is the opacity
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_Sampler;
+
+ volatile QT3DSI32 mRefCount;
+
+ SLayerSceneShader(NVRenderShaderProgram &inShader)
+ : m_Shader(inShader)
+ , m_MVP("model_view_projection", inShader)
+ , m_Dimensions("layer_dimensions", inShader)
+ , m_Sampler("layer_image", inShader)
+ , mRefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ ~SLayerSceneShader() { m_Shader.release(); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader.GetRenderContext().GetAllocator())
+ };
+
+ struct SShadowmapPreblurShader
+ {
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_CameraProperties;
+ NVRenderCachedShaderProperty<NVRenderTextureCube *> m_DepthCube;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_DepthMap;
+
+ volatile QT3DSI32 mRefCount;
+
+ SShadowmapPreblurShader(NVRenderShaderProgram &inShader)
+ : m_Shader(inShader)
+ , m_CameraProperties("camera_properties", inShader)
+ , m_DepthCube("depthCube", inShader)
+ , m_DepthMap("depthSrc", inShader)
+ , mRefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ ~SShadowmapPreblurShader() { m_Shader.release(); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader.GetRenderContext().GetAllocator())
+ };
+
+#ifdef ADVANCED_BLEND_SW_FALLBACK
+ struct SAdvancedModeBlendShader
+ {
+ NVRenderShaderProgram &m_Shader;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_baseLayer;
+ NVRenderCachedShaderProperty<NVRenderTexture2D *> m_blendLayer;
+
+ volatile QT3DSI32 mRefCount;
+
+ SAdvancedModeBlendShader(NVRenderShaderProgram &inShader)
+ : m_Shader(inShader)
+ , m_baseLayer("base_layer", inShader)
+ , m_blendLayer("blend_layer", inShader)
+ , mRefCount(0)
+ {
+ m_Shader.addRef();
+ }
+ ~SAdvancedModeBlendShader() { m_Shader.release(); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Shader.GetRenderContext().GetAllocator())
+
+ };
+#endif
+
+ struct SGGSGet
+ {
+ QT3DSU32 operator()(const SShaderGeneratorGeneratedShader &inShader)
+ {
+ return inShader.m_LayerSetIndex;
+ }
+ };
+ struct SGGSSet
+ {
+ void operator()(SShaderGeneratorGeneratedShader &inShader, QT3DSU32 idx)
+ {
+ inShader.m_LayerSetIndex = idx;
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/rendererimpl/Qt3DSVertexPipelineImpl.h b/src/runtimerender/rendererimpl/Qt3DSVertexPipelineImpl.h
new file mode 100644
index 0000000..a9b5e7b
--- /dev/null
+++ b/src/runtimerender/rendererimpl/Qt3DSVertexPipelineImpl.h
@@ -0,0 +1,463 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_VERTEX_PIPELINE_IMPL_H
+#define QT3DS_VERTEX_PIPELINE_IMPL_H
+#include "Qt3DSRenderDefaultMaterialShaderGenerator.h"
+
+namespace qt3ds {
+namespace render {
+ // Baseclass for the vertex pipelines to be sure we have consistent implementations.
+ struct SVertexPipelineImpl : public IDefaultMaterialVertexPipeline
+ {
+ struct GenerationFlagValues
+ {
+ enum Enum {
+ UVCoords = 1,
+ EnvMapReflection = 1 << 1,
+ ViewVector = 1 << 2,
+ WorldNormal = 1 << 3,
+ ObjectNormal = 1 << 4,
+ WorldPosition = 1 << 5,
+ TangentBinormal = 1 << 6,
+ UVCoords1 = 1 << 7,
+ VertexColor = 1 << 8,
+ };
+ };
+
+ typedef TStrTableStrMap::const_iterator TParamIter;
+ typedef NVFlags<GenerationFlagValues::Enum> TGenerationFlags;
+
+ IMaterialShaderGenerator &m_MaterialGenerator;
+ IShaderProgramGenerator &m_ProgramGenerator;
+ IStringTable &m_StringTable;
+ Qt3DSString m_TempString;
+
+ TGenerationFlags m_GenerationFlags;
+ bool m_Wireframe;
+ TStrTableStrMap m_InterpolationParameters;
+ QT3DSU32 m_DisplacementIdx;
+ SRenderableImage *m_DisplacementImage;
+ QStringList m_addedFunctions;
+
+ SVertexPipelineImpl(NVAllocatorCallback &inAllocator, IMaterialShaderGenerator &inMaterial,
+ IShaderProgramGenerator &inProgram, IStringTable &inStringTable,
+ bool inWireframe // only works if tessellation is true
+ )
+
+ : m_MaterialGenerator(inMaterial)
+ , m_ProgramGenerator(inProgram)
+ , m_StringTable(inStringTable)
+ , m_Wireframe(inWireframe)
+ , m_InterpolationParameters(inAllocator, "m_InterpolationParameters")
+ , m_DisplacementIdx(0)
+ , m_DisplacementImage(NULL)
+ {
+ }
+
+ // Trues true if the code was *not* set.
+ bool SetCode(GenerationFlagValues::Enum inCode)
+ {
+ if (((QT3DSU32)m_GenerationFlags & inCode) != 0)
+ return true;
+ m_GenerationFlags |= inCode;
+ return false;
+ }
+ bool HasCode(GenerationFlagValues::Enum inCode)
+ {
+ return ((QT3DSU32)(m_GenerationFlags & inCode)) != 0;
+ }
+ IShaderProgramGenerator &ProgramGenerator() { return m_ProgramGenerator; }
+ IShaderStageGenerator &Vertex()
+ {
+ return *ProgramGenerator().GetStage(ShaderGeneratorStages::Vertex);
+ }
+ IShaderStageGenerator &TessControl()
+ {
+ return *ProgramGenerator().GetStage(ShaderGeneratorStages::TessControl);
+ }
+ IShaderStageGenerator &TessEval()
+ {
+ return *ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval);
+ }
+ IShaderStageGenerator &Geometry()
+ {
+ return *ProgramGenerator().GetStage(ShaderGeneratorStages::Geometry);
+ }
+ IShaderStageGenerator &Fragment()
+ {
+ return *ProgramGenerator().GetStage(ShaderGeneratorStages::Fragment);
+ }
+ IMaterialShaderGenerator &MaterialGenerator() { return m_MaterialGenerator; }
+
+ void SetupDisplacement(QT3DSU32 displacementImageIdx, SRenderableImage *displacementImage)
+ {
+ m_DisplacementIdx = displacementImageIdx;
+ m_DisplacementImage = displacementImage;
+ }
+
+ CRegisteredString Str(const char8_t *inItem) { return m_StringTable.RegisterStr(inItem); }
+
+ bool HasTessellation() const
+ {
+ return m_ProgramGenerator.GetEnabledStages() & ShaderGeneratorStages::TessEval;
+ }
+ bool HasGeometryStage() const
+ {
+ return m_ProgramGenerator.GetEnabledStages() & ShaderGeneratorStages::Geometry;
+ }
+ bool HasDisplacment() const { return m_DisplacementImage != NULL; }
+
+ void InitializeWireframeGeometryShader()
+ {
+ if (m_Wireframe && ProgramGenerator().GetStage(ShaderGeneratorStages::Geometry)
+ && ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval)) {
+ IShaderStageGenerator &geometryShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::Geometry));
+ // currently geometry shader is only used for drawing wireframe
+ if (m_Wireframe) {
+ geometryShader.AddUniform("viewport_matrix", "mat4");
+ geometryShader.AddOutgoing("varEdgeDistance", "vec3");
+ geometryShader.Append("layout (triangles) in;");
+ geometryShader.Append("layout (triangle_strip, max_vertices = 3) out;");
+ geometryShader.Append("void main() {");
+
+ // how this all work see
+ // http://developer.download.nvidia.com/SDK/10.5/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf
+
+ geometryShader.Append(
+ "// project points to screen space\n"
+ "\tvec3 p0 = vec3(viewport_matrix * (gl_in[0].gl_Position / "
+ "gl_in[0].gl_Position.w));\n"
+ "\tvec3 p1 = vec3(viewport_matrix * (gl_in[1].gl_Position / "
+ "gl_in[1].gl_Position.w));\n"
+ "\tvec3 p2 = vec3(viewport_matrix * (gl_in[2].gl_Position / "
+ "gl_in[2].gl_Position.w));\n"
+ "// compute triangle heights\n"
+ "\tfloat e1 = length(p1 - p2);\n"
+ "\tfloat e2 = length(p2 - p0);\n"
+ "\tfloat e3 = length(p1 - p0);\n"
+ "\tfloat alpha = acos( (e2*e2 + e3*e3 - e1*e1) / (2.0*e2*e3) );\n"
+ "\tfloat beta = acos( (e1*e1 + e3*e3 - e2*e2) / (2.0*e1*e3) );\n"
+ "\tfloat ha = abs( e3 * sin( beta ) );\n"
+ "\tfloat hb = abs( e3 * sin( alpha ) );\n"
+ "\tfloat hc = abs( e2 * sin( alpha ) );\n");
+ }
+ }
+ }
+
+ void FinalizeWireframeGeometryShader()
+ {
+ IShaderStageGenerator &geometryShader(
+ *ProgramGenerator().GetStage(ShaderGeneratorStages::Geometry));
+
+ if (m_Wireframe == true && ProgramGenerator().GetStage(ShaderGeneratorStages::Geometry)
+ && ProgramGenerator().GetStage(ShaderGeneratorStages::TessEval)) {
+ const char8_t *theExtension("TE[");
+ // we always assume triangles
+ for (int i = 0; i < 3; i++) {
+ char buf[10];
+ sprintf(buf, "%d", i);
+ for (TStrTableStrMap::const_iterator iter = m_InterpolationParameters.begin(),
+ end = m_InterpolationParameters.end();
+ iter != end; ++iter) {
+ geometryShader << "\t" << iter->first.c_str() << " = "
+ << iter->first.c_str() << theExtension << buf << "];\n";
+ }
+
+ geometryShader << "\tgl_Position = gl_in[" << buf << "].gl_Position;\n";
+ // the triangle distance is interpolated through the shader stage
+ if (i == 0)
+ geometryShader << "\n\tvarEdgeDistance = vec3(ha*"
+ << "gl_in[" << buf << "].gl_Position.w, 0.0, 0.0);\n";
+ else if (i == 1)
+ geometryShader << "\n\tvarEdgeDistance = vec3(0.0, hb*"
+ << "gl_in[" << buf << "].gl_Position.w, 0.0);\n";
+ else if (i == 2)
+ geometryShader << "\n\tvarEdgeDistance = vec3(0.0, 0.0, hc*"
+ << "gl_in[" << buf << "].gl_Position.w);\n";
+
+ // submit vertex
+ geometryShader << "\tEmitVertex();\n";
+ }
+ // end primitive
+ geometryShader << "\tEndPrimitive();\n";
+ }
+ }
+
+ virtual void SetupTessIncludes(ShaderGeneratorStages::Enum inStage,
+ TessModeValues::Enum inTessMode)
+ {
+ IShaderStageGenerator &tessShader(*ProgramGenerator().GetStage(inStage));
+
+ // depending on the selected tessellation mode chose program
+ switch (inTessMode) {
+ case TessModeValues::TessPhong:
+ tessShader.AddInclude("tessellationPhong.glsllib");
+ break;
+ case TessModeValues::TessNPatch:
+ tessShader.AddInclude("tessellationNPatch.glsllib");
+ break;
+ default:
+ QT3DS_ASSERT(false); // fallthrough intentional
+ case TessModeValues::TessLinear:
+ tessShader.AddInclude("tessellationLinear.glsllib");
+ break;
+ }
+ }
+
+ void GenerateUVCoords(QT3DSU32 inUVSet = 0) override
+ {
+ if (inUVSet == 0 && SetCode(GenerationFlagValues::UVCoords))
+ return;
+ if (inUVSet == 1 && SetCode(GenerationFlagValues::UVCoords1))
+ return;
+
+ QT3DS_ASSERT(inUVSet == 0 || inUVSet == 1);
+
+ if (inUVSet == 0)
+ AddInterpolationParameter("varTexCoord0", "vec2");
+ else if (inUVSet == 1)
+ AddInterpolationParameter("varTexCoord1", "vec2");
+
+ DoGenerateUVCoords(inUVSet);
+ }
+ void GenerateEnvMapReflection() override
+ {
+ if (SetCode(GenerationFlagValues::EnvMapReflection))
+ return;
+
+ GenerateWorldPosition();
+ GenerateWorldNormal();
+ IShaderStageGenerator &activeGenerator(ActiveStage());
+ activeGenerator.AddInclude("viewProperties.glsllib");
+ AddInterpolationParameter("var_object_to_camera", "vec3");
+ activeGenerator.Append("\tvar_object_to_camera = normalize( local_model_world_position "
+ "- camera_position );");
+ // World normal cannot be relied upon in the vertex shader because of bump maps.
+ Fragment().Append("\tvec3 environment_map_reflection = reflect( "
+ "normalize(var_object_to_camera), world_normal.xyz );");
+ Fragment().Append("\tenvironment_map_reflection *= vec3( 0.5, 0.5, 0 );");
+ Fragment().Append("\tenvironment_map_reflection += vec3( 0.5, 0.5, 1.0 );");
+ }
+ void GenerateViewVector() override
+ {
+ if (SetCode(GenerationFlagValues::ViewVector))
+ return;
+ GenerateWorldPosition();
+ IShaderStageGenerator &activeGenerator(ActiveStage());
+ activeGenerator.AddInclude("viewProperties.glsllib");
+ AddInterpolationParameter("varViewVector", "vec3");
+ activeGenerator.Append("\tvec3 local_view_vector = normalize(camera_position - "
+ "local_model_world_position);");
+ AssignOutput("varViewVector", "local_view_vector");
+ Fragment() << "\tvec3 view_vector = normalize(varViewVector);" << Endl;
+ }
+
+ // fragment shader expects varying vertex normal
+ // lighting in vertex pipeline expects world_normal
+ void GenerateWorldNormal() override
+ {
+ if (SetCode(GenerationFlagValues::WorldNormal))
+ return;
+ AddInterpolationParameter("varNormal", "vec3");
+ DoGenerateWorldNormal();
+ Fragment().Append("\tvec3 world_normal = normalize( varNormal );");
+ }
+ void GenerateObjectNormal() override
+ {
+ if (SetCode(GenerationFlagValues::ObjectNormal))
+ return;
+ DoGenerateObjectNormal();
+ Fragment().Append("\tvec3 object_normal = normalize(varObjectNormal);");
+ }
+ void GenerateWorldPosition() override
+ {
+ if (SetCode(GenerationFlagValues::WorldPosition))
+ return;
+
+ ActiveStage().AddUniform("model_matrix", "mat4");
+ AddInterpolationParameter("varWorldPos", "vec3");
+ DoGenerateWorldPosition();
+
+ AssignOutput("varWorldPos", "local_model_world_position");
+ }
+ void GenerateVarTangentAndBinormal() override
+ {
+ if (SetCode(GenerationFlagValues::TangentBinormal))
+ return;
+ AddInterpolationParameter("varTangent", "vec3");
+ AddInterpolationParameter("varBinormal", "vec3");
+ DoGenerateVarTangentAndBinormal();
+ Fragment() << "\tvec3 tangent = normalize(varTangent);" << Endl
+ << "\tvec3 binormal = normalize(varBinormal);" << Endl;
+ }
+ void GenerateVertexColor() override
+ {
+ if (SetCode(GenerationFlagValues::VertexColor))
+ return;
+ AddInterpolationParameter("varColor", "vec3");
+ DoGenerateVertexColor();
+ Fragment().Append("\tvec3 vertColor = varColor;");
+ }
+
+ bool HasActiveWireframe() override { return m_Wireframe; }
+
+ // IShaderStageGenerator interface
+ void AddIncoming(const char8_t *name, const char8_t *type) override
+ {
+ ActiveStage().AddIncoming(name, type);
+ }
+ void AddIncoming(const TStrType &name, const char8_t *type) override
+ {
+ AddIncoming(name.c_str(), type);
+ }
+ void AddIncoming(const QString &name, const char8_t *type) override
+ {
+ AddIncoming(name.toUtf8().constData(), type);
+ }
+
+ void AddOutgoing(const char8_t *name, const char8_t *type) override
+ {
+ AddInterpolationParameter(name, type);
+ }
+ void AddOutgoing(const TStrType &name, const char8_t *type) override
+ {
+ AddOutgoing(name.c_str(), type);
+ }
+ void AddOutgoing(const QString &name, const char8_t *type) override
+ {
+ AddOutgoing(name.toUtf8().constData(), type);
+ }
+ void AddUniform(const QString &name, const char8_t *type) override
+ {
+ AddUniform(name.toUtf8().constData(), type);
+ }
+
+ void AddUniform(const char8_t *name, const char8_t *type) override
+ {
+ ActiveStage().AddUniform(name, type);
+ }
+ void AddUniform(const TStrType &name, const char8_t *type) override
+ {
+ AddUniform(name.c_str(), type);
+ }
+
+ void AddInclude(const char8_t *name) override { ActiveStage().AddInclude(name); }
+ void AddInclude(const TStrType &name) override { AddInclude(name.c_str()); }
+ void AddInclude(const QString &name) override
+ {
+ QByteArray arr = name.toLatin1();
+ AddInclude(arr.data());
+ }
+
+ void AddFunction(const QString &functionName) override
+ {
+ if (!m_addedFunctions.contains(functionName)) {
+ m_addedFunctions.push_back(functionName);
+ QString includeName;
+ QTextStream stream(&includeName);
+ stream << "func" << functionName << ".glsllib";
+ AddInclude(includeName);
+ }
+ }
+
+ void AddConstantBuffer(const char *name, const char *layout) override
+ {
+ ActiveStage().AddConstantBuffer(name, layout);
+ }
+ void AddConstantBuffer(const QString &name, const char *layout) override
+ {
+ AddConstantBuffer(name.toUtf8().constData(), layout);
+ }
+
+ void AddConstantBufferParam(const char *cbName, const char *paramName,
+ const char *type) override
+ {
+ ActiveStage().AddConstantBufferParam(cbName, paramName, type);
+ }
+ void AddConstantBufferParam(const QString &cbName, const QString &paramName,
+ const char *type) override
+ {
+ AddConstantBufferParam(cbName.toUtf8().constData(),
+ paramName.toUtf8().constData(), type);
+ }
+
+ IShaderStageGenerator &operator<<(const char *data) override
+ {
+ ActiveStage() << data;
+ return *this;
+ }
+ IShaderStageGenerator &operator<<(const TStrType &data) override
+ {
+ ActiveStage() << data;
+ return *this;
+ }
+ IShaderStageGenerator &operator<<(const QString &data) override
+ {
+ ActiveStage() << data;
+ return *this;
+ }
+ IShaderStageGenerator &operator<<(const SEndlType &data) override
+ {
+ ActiveStage() << data;
+ return *this;
+ }
+ void Append(const char *data) override { ActiveStage().Append(data); }
+ void AppendPartial(const char *data) override { ActiveStage().Append(data); }
+
+ ShaderGeneratorStages::Enum Stage() const override
+ {
+ return const_cast<SVertexPipelineImpl *>(this)->ActiveStage().Stage();
+ }
+
+ void BeginVertexGeneration(QT3DSU32 displacementImageIdx,
+ SRenderableImage *displacementImage) override = 0;
+ void AssignOutput(const char8_t *inVarName, const char8_t *inVarValueExpr) override = 0;
+ void EndVertexGeneration(bool customShader) override = 0;
+
+ void BeginFragmentGeneration() override = 0;
+ void EndFragmentGeneration(bool customShader) override = 0;
+
+ virtual IShaderStageGenerator &ActiveStage() = 0;
+ virtual void AddInterpolationParameter(const char8_t *inParamName,
+ const char8_t *inParamType) = 0;
+
+ virtual void DoGenerateUVCoords(QT3DSU32 inUVSet) = 0;
+ virtual void DoGenerateWorldNormal() = 0;
+ virtual void DoGenerateObjectNormal() = 0;
+ virtual void DoGenerateWorldPosition() = 0;
+ virtual void DoGenerateVarTangentAndBinormal() = 0;
+ virtual void DoGenerateVertexColor() = 0;
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.cpp
new file mode 100644
index 0000000..963186f
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.cpp
@@ -0,0 +1,326 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderBufferLoader.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSSync.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSRenderThreadPool.h"
+
+using namespace qt3ds::render;
+
+namespace {
+struct SBufferLoader;
+struct SBufferLoadResult : public ILoadedBuffer
+{
+ NVFoundationBase &m_Foundation;
+ CRegisteredString m_Path;
+ IBufferLoaderCallback *m_UserData;
+ NVDataRef<QT3DSU8> m_Data;
+ QT3DSI32 mRefCount;
+
+ SBufferLoadResult(NVFoundationBase &fnd, CRegisteredString p, IBufferLoaderCallback *ud,
+ NVDataRef<QT3DSU8> data)
+ : m_Foundation(fnd)
+ , m_Path(p)
+ , m_UserData(ud)
+ , m_Data(data)
+ , mRefCount(0)
+ {
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation.getAllocator())
+
+ CRegisteredString Path() override { return m_Path; }
+ // Data is released when the buffer itself is released.
+ NVDataRef<QT3DSU8> Data() override { return m_Data; }
+ IBufferLoaderCallback *UserData() override { return m_UserData; }
+
+ static SBufferLoadResult *Allocate(QT3DSU32 inBufferSize, NVFoundationBase &fnd,
+ CRegisteredString p,
+ NVScopedRefCounted<IBufferLoaderCallback> ud)
+ {
+ size_t allocSize = sizeof(SBufferLoadResult) + inBufferSize;
+ QT3DSU8 *allocMem =
+ (QT3DSU8 *)fnd.getAllocator().allocate(allocSize, "ILoadedBuffer", __FILE__, __LINE__);
+ if (allocMem == NULL)
+ return NULL;
+ QT3DSU8 *bufferStart = allocMem + sizeof(SBufferLoadResult);
+ NVDataRef<QT3DSU8> dataBuffer = toDataRef(bufferStart, inBufferSize);
+ return new (allocMem) SBufferLoadResult(fnd, p, ud, dataBuffer);
+ }
+};
+struct SLoadedBufferImpl
+{
+ SBufferLoader &m_Loader;
+ QT3DSU64 m_JobId;
+ QT3DSU64 m_LoadId;
+ CRegisteredString m_Path;
+ NVScopedRefCounted<IBufferLoaderCallback> m_UserData;
+ bool m_Quiet;
+ volatile bool m_Cancel;
+ NVScopedRefCounted<SBufferLoadResult> m_Result;
+ SLoadedBufferImpl *m_NextBuffer;
+ SLoadedBufferImpl *m_PreviousBuffer;
+
+ SLoadedBufferImpl(SBufferLoader &l, CRegisteredString inPath,
+ NVScopedRefCounted<IBufferLoaderCallback> ud, bool inQuiet, QT3DSU64 loadId)
+ : m_Loader(l)
+ , m_JobId(0)
+ , m_LoadId(loadId)
+ , m_Path(inPath)
+ , m_UserData(ud)
+ , m_Quiet(inQuiet)
+ , m_Cancel(false)
+ , m_NextBuffer(NULL)
+ , m_PreviousBuffer(NULL)
+ {
+ }
+};
+
+DEFINE_INVASIVE_LIST(LoadedBufferImpl);
+IMPLEMENT_INVASIVE_LIST(LoadedBufferImpl, m_PreviousBuffer, m_NextBuffer);
+
+struct SBufferLoader : public IBufferLoader
+{
+ NVFoundationBase &m_Foundation;
+ NVScopedRefCounted<IInputStreamFactory> m_Factory;
+ NVScopedRefCounted<IThreadPool> m_ThreadPool;
+
+ Mutex m_BuffersToLoadMutex;
+ TLoadedBufferImplList m_BuffersToLoad;
+
+ Mutex m_BuffersLoadingMutex;
+ TLoadedBufferImplList m_BuffersLoading;
+
+ Mutex m_LoadedBuffersMutex;
+ TLoadedBufferImplList m_LoadedBuffers;
+
+ Sync m_BufferLoadedEvent;
+
+ QT3DSU64 m_NextBufferId;
+
+ QT3DSI32 mRefCount;
+
+ SBufferLoader(NVFoundationBase &fnd, IInputStreamFactory &fac, IThreadPool &tp)
+ : m_Foundation(fnd)
+ , m_Factory(fac)
+ , m_ThreadPool(tp)
+ , m_BuffersToLoadMutex(fnd.getAllocator())
+ , m_BuffersLoadingMutex(fnd.getAllocator())
+ , m_LoadedBuffersMutex(fnd.getAllocator())
+ , m_BufferLoadedEvent(fnd.getAllocator())
+ , m_NextBufferId(1)
+ , mRefCount(0)
+ {
+ m_BufferLoadedEvent.reset();
+ }
+
+ virtual ~SBufferLoader()
+ {
+ {
+ Mutex::ScopedLock __locker(m_BuffersToLoadMutex);
+ for (TLoadedBufferImplList::iterator iter = m_BuffersToLoad.begin(),
+ end = m_BuffersToLoad.end();
+ iter != end; ++iter) {
+ m_ThreadPool->CancelTask(iter->m_JobId);
+ }
+ }
+
+ // Pull any remaining buffers out of the thread system.
+ while (WillLoadedBuffersBeAvailable()) {
+ NextLoadedBuffer();
+ }
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ static void InitializeActiveLoadingBuffer(SLoadedBufferImpl &theBuffer)
+ {
+ Mutex::ScopedLock theLocker(theBuffer.m_Loader.m_BuffersToLoadMutex);
+ Mutex::ScopedLock theSecondLocker(theBuffer.m_Loader.m_BuffersLoadingMutex);
+ theBuffer.m_Loader.m_BuffersToLoad.remove(theBuffer);
+ theBuffer.m_Loader.m_BuffersLoading.push_back(theBuffer);
+ }
+
+ static void SetBufferAsLoaded(SLoadedBufferImpl &theBuffer)
+ {
+ Mutex::ScopedLock theSecondLocker(theBuffer.m_Loader.m_BuffersLoadingMutex);
+ Mutex::ScopedLock theLocker(theBuffer.m_Loader.m_LoadedBuffersMutex);
+ theBuffer.m_Loader.m_BuffersLoading.remove(theBuffer);
+ theBuffer.m_Loader.m_LoadedBuffers.push_back(theBuffer);
+ theBuffer.m_Loader.m_BufferLoadedEvent.set();
+ theBuffer.m_Loader.m_BufferLoadedEvent.reset();
+ }
+
+ static void LoadNextBuffer(void *loader)
+ {
+ SLoadedBufferImpl &theBuffer = *reinterpret_cast<SLoadedBufferImpl *>(loader);
+
+ InitializeActiveLoadingBuffer(theBuffer);
+ NVScopedRefCounted<IRefCountedInputStream> theStream =
+ theBuffer.m_Loader.m_Factory->GetStreamForFile(theBuffer.m_Path.c_str(),
+ theBuffer.m_Quiet);
+ if (theStream && theBuffer.m_Cancel == false) {
+ theStream->SetPosition(0, SeekPosition::End);
+ QT3DSI64 theFileLen = theStream->GetPosition();
+ if (theFileLen > 0 && theFileLen < (QT3DSU32)QT3DS_MAX_U32) {
+ QT3DSU32 required = (QT3DSU32)theFileLen;
+ theBuffer.m_Result =
+ SBufferLoadResult::Allocate(required, theBuffer.m_Loader.m_Foundation,
+ theBuffer.m_Path, theBuffer.m_UserData);
+ QT3DSU32 amountRead = 0;
+ QT3DSU32 total = amountRead;
+ if (theBuffer.m_Result && theBuffer.m_Cancel == false) {
+ NVDataRef<QT3DSU8> theDataBuffer(theBuffer.m_Result->m_Data);
+ theStream->SetPosition(0, SeekPosition::Begin);
+ amountRead = theStream->Read(theDataBuffer);
+ total += amountRead;
+ // Ensure we keep trying, not all file systems allow huge reads.
+ while (total < required && amountRead > 0 && theBuffer.m_Cancel == false) {
+ NVDataRef<QT3DSU8> newBuffer(theDataBuffer.mData + total, required - total);
+ amountRead = theStream->Read(newBuffer);
+ total += amountRead;
+ }
+ }
+ if (theBuffer.m_Cancel || total != required) {
+ theBuffer.m_Result->m_Data = NVDataRef<QT3DSU8>();
+ }
+ }
+ }
+
+ // only callback if the file was successfully loaded.
+ if (theBuffer.m_UserData) {
+ if (theBuffer.m_Cancel == false && theBuffer.m_Result.mPtr
+ && theBuffer.m_Result->m_Data.size()) {
+ theBuffer.m_UserData->OnBufferLoaded(*theBuffer.m_Result.mPtr);
+ } else {
+ if (theBuffer.m_Cancel)
+ theBuffer.m_UserData->OnBufferLoadCancelled(theBuffer.m_Path);
+ else
+ theBuffer.m_UserData->OnBufferLoadFailed(theBuffer.m_Path);
+ }
+ }
+
+ SetBufferAsLoaded(theBuffer);
+ }
+ static void CancelNextBuffer(void *loader)
+ {
+ SLoadedBufferImpl &theBuffer = *reinterpret_cast<SLoadedBufferImpl *>(loader);
+ theBuffer.m_Cancel = true;
+ InitializeActiveLoadingBuffer(theBuffer);
+
+ if (theBuffer.m_UserData)
+ theBuffer.m_UserData->OnBufferLoadCancelled(theBuffer.m_Path);
+
+ SetBufferAsLoaded(theBuffer);
+ }
+
+ // nonblocking. Quiet failure is passed to the input stream factory.
+ QT3DSU64 QueueForLoading(CRegisteredString inPath,
+ IBufferLoaderCallback *inUserData = NULL,
+ bool inQuietFailure = false) override
+ {
+ SLoadedBufferImpl &theBuffer = *QT3DS_NEW(m_Foundation.getAllocator(), SLoadedBufferImpl)(
+ *this, inPath, inUserData, inQuietFailure, m_NextBufferId);
+ ++m_NextBufferId;
+ {
+ Mutex::ScopedLock theLocker(m_BuffersToLoadMutex);
+ m_BuffersToLoad.push_back(theBuffer);
+ }
+ theBuffer.m_JobId = m_ThreadPool->AddTask(&theBuffer, LoadNextBuffer, CancelNextBuffer);
+ return theBuffer.m_LoadId;
+ }
+
+ void CancelBufferLoad(QT3DSU64 inBufferId) override
+ {
+ {
+ Mutex::ScopedLock theLocker(m_BuffersToLoadMutex);
+ SLoadedBufferImpl *theLoadedBuffer = NULL;
+ for (TLoadedBufferImplList::iterator iter = m_BuffersToLoad.begin(),
+ end = m_BuffersToLoad.end();
+ iter != end && theLoadedBuffer == NULL; ++iter) {
+ if (iter->m_LoadId == inBufferId) {
+ theLoadedBuffer = &(*iter);
+ // both cancellation attempts are necessary. The user will still get
+ // a load result, it will just have no data.
+ theLoadedBuffer->m_Cancel = true;
+ m_ThreadPool->CancelTask(theLoadedBuffer->m_JobId);
+ }
+ }
+ }
+ }
+
+ // If we were will to wait, will we ever get another buffer
+ bool WillLoadedBuffersBeAvailable() override
+ {
+ Mutex::ScopedLock theLocker(m_BuffersToLoadMutex);
+ Mutex::ScopedLock theSecondLocker(m_BuffersLoadingMutex);
+ return AreLoadedBuffersAvailable() || m_BuffersToLoad.empty() == false
+ || m_BuffersLoading.empty() == false;
+ }
+ // Will nextLoadedBuffer block or not?
+ bool AreLoadedBuffersAvailable() override
+ {
+ Mutex::ScopedLock theLocker(m_LoadedBuffersMutex);
+ return m_LoadedBuffers.empty() == false;
+ }
+
+ // blocking, be careful with this. No order guarantees here.
+ NVScopedRefCounted<ILoadedBuffer> NextLoadedBuffer() override
+ {
+ while (!AreLoadedBuffersAvailable()) {
+ m_BufferLoadedEvent.wait();
+ }
+ SLoadedBufferImpl *theBuffer;
+ {
+ Mutex::ScopedLock theLocker(m_LoadedBuffersMutex);
+ theBuffer = m_LoadedBuffers.back_ptr();
+ m_LoadedBuffers.remove(*theBuffer);
+ }
+ NVScopedRefCounted<ILoadedBuffer> retval(theBuffer->m_Result);
+ if (retval.mPtr == NULL) {
+ retval = SBufferLoadResult::Allocate(0, m_Foundation, theBuffer->m_Path,
+ theBuffer->m_UserData);
+ }
+ NVDelete(m_Foundation.getAllocator(), theBuffer);
+ return retval;
+ }
+};
+}
+
+IBufferLoader &IBufferLoader::Create(NVFoundationBase &fnd, IInputStreamFactory &inFactory,
+ IThreadPool &inThreadPool)
+{
+ return *QT3DS_NEW(fnd.getAllocator(), SBufferLoader)(fnd, inFactory, inThreadPool);
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.h b/src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.h
new file mode 100644
index 0000000..8d75e25
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferLoader.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BUFFER_LOADED_H
+#define QT3DS_RENDER_BUFFER_LOADED_H
+
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace render {
+
+ class IBufferLoaderCallback;
+
+ class ILoadedBuffer : public NVRefCounted
+ {
+ public:
+ virtual CRegisteredString Path() = 0;
+ // Data is released when the buffer itself is released.
+ virtual NVDataRef<QT3DSU8> Data() = 0;
+ virtual IBufferLoaderCallback *UserData() = 0;
+ };
+
+ class IBufferLoaderCallback : public NVRefCounted
+ {
+ public:
+ virtual void OnBufferLoaded(ILoadedBuffer &inBuffer) = 0;
+ virtual void OnBufferLoadFailed(CRegisteredString inPath) = 0;
+ virtual void OnBufferLoadCancelled(CRegisteredString inPath) = 0;
+ };
+
+ // Job of this object is to load buffers all the way to memory as fast as possible.
+ class IBufferLoader : public NVRefCounted
+ {
+ public:
+ // nonblocking. Quiet failure is passed to the input stream factory.
+ // Returns handle to loading buffer
+ virtual QT3DSU64 QueueForLoading(CRegisteredString inPath,
+ IBufferLoaderCallback *inUserData = NULL,
+ bool inQuietFailure = false) = 0;
+ // Cancel a buffer that has not made it to the loaded buffers list.
+ virtual void CancelBufferLoad(QT3DSU64 inBufferId) = 0;
+ // If we were will to wait, will we ever get another buffer
+ virtual bool WillLoadedBuffersBeAvailable() = 0;
+ // Will nextLoadedBuffer block or not?
+ virtual bool AreLoadedBuffersAvailable() = 0;
+
+ // blocking, be careful with this. No guarantees about timely return here.
+ virtual NVScopedRefCounted<ILoadedBuffer> NextLoadedBuffer() = 0;
+
+ static IBufferLoader &Create(NVFoundationBase &fnd, IInputStreamFactory &inFactory,
+ IThreadPool &inThreadPool);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
new file mode 100644
index 0000000..eb23f3d
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp
@@ -0,0 +1,1092 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifdef _WIN32
+#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
+#endif
+#include "Qt3DSRender.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "EASTL/string.h"
+#include "foundation/Qt3DSAllocator.h"
+#include "render/Qt3DSRenderContext.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "EASTL/hash_map.h"
+#include "foundation/FileTools.h"
+#include "Qt3DSImportMesh.h"
+#include "Qt3DSRenderMesh.h"
+#include "foundation/Qt3DSAllocatorCallback.h"
+#include "Qt3DSRenderLoadedTexture.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSRenderImageScaler.h"
+#include "Qt3DSRenderImage.h"
+#include "Qt3DSTextRenderer.h"
+#include "foundation/Qt3DSPerfTimer.h"
+#include "foundation/Qt3DSMutex.h"
+#include "Qt3DSRenderPrefilterTexture.h"
+#include <QtCore/qdir.h>
+
+using namespace qt3ds::render;
+
+namespace {
+
+using eastl::hash;
+using eastl::pair;
+using eastl::make_pair;
+typedef eastl::basic_string<char8_t, ForwardingAllocator> TStr;
+struct StrHasher
+{
+ size_t operator()(const TStr &str) const
+ {
+ return hash<const char8_t *>()((const char8_t *)str.c_str());
+ }
+};
+
+struct StrEq
+{
+ bool operator()(const TStr &lhs, const TStr &rhs) const { return lhs == rhs; }
+};
+
+struct SImageEntry : public SImageTextureData
+{
+ bool m_Loaded;
+ SImageEntry()
+ : SImageTextureData(), m_Loaded(false)
+ {
+ }
+ SImageEntry(const SImageEntry &entry)
+ : SImageTextureData(entry), m_Loaded(entry.m_Loaded)
+ {
+
+ }
+};
+
+struct SPrimitiveEntry
+{
+ // Name of the primitive as it will be in the UIP file
+ CRegisteredString m_PrimitiveName;
+ // Name of the primitive file on the filesystem
+ CRegisteredString m_FileName;
+};
+
+struct SBufferManager : public IBufferManager
+{
+ typedef eastl::hash_set<CRegisteredString, eastl::hash<CRegisteredString>,
+ eastl::equal_to<CRegisteredString>, ForwardingAllocator>
+ TStringSet;
+ typedef nvhash_map<CRegisteredString, SImageEntry> TImageMap;
+ typedef nvhash_map<CRegisteredString, SRenderMesh *> TMeshMap;
+ typedef nvhash_map<CRegisteredString, CRegisteredString> TAliasImageMap;
+
+ NVScopedRefCounted<NVRenderContext> m_Context;
+ NVScopedRefCounted<IStringTable> m_StrTable;
+ NVScopedRefCounted<IInputStreamFactory> m_InputStreamFactory;
+ IPerfTimer &m_PerfTimer;
+ volatile QT3DSI32 mRefCount;
+ TStr m_PathBuilder;
+ TImageMap m_ImageMap;
+ Mutex m_LoadedImageSetMutex;
+ TStringSet m_LoadedImageSet;
+ TAliasImageMap m_AliasImageMap;
+ TMeshMap m_MeshMap;
+ SPrimitiveEntry m_PrimitiveNames[5];
+ nvvector<qt3ds::render::NVRenderVertexBufferEntry> m_EntryBuffer;
+ bool m_GPUSupportsDXT;
+ bool m_reloadableResources;
+
+ QHash<QString, ReloadableTexturePtr> m_reloadableTextures;
+
+ static const char8_t *GetPrimitivesDirectory() { return "res//primitives"; }
+
+ SBufferManager(NVRenderContext &ctx, IStringTable &strTable,
+ IInputStreamFactory &inInputStreamFactory, IPerfTimer &inTimer)
+ : m_Context(ctx)
+ , m_StrTable(strTable)
+ , m_InputStreamFactory(inInputStreamFactory)
+ , m_PerfTimer(inTimer)
+ , mRefCount(0)
+ , m_PathBuilder(ForwardingAllocator(ctx.GetAllocator(), "SBufferManager::m_PathBuilder"))
+ , m_ImageMap(ctx.GetAllocator(), "SBufferManager::m_ImageMap")
+ , m_LoadedImageSetMutex(ctx.GetAllocator())
+ , m_LoadedImageSet(
+ ForwardingAllocator(ctx.GetAllocator(), "SBufferManager::m_LoadedImageSet"))
+ , m_AliasImageMap(ctx.GetAllocator(), "SBufferManager::m_AliasImageMap")
+ , m_MeshMap(ctx.GetAllocator(), "SBufferManager::m_MeshMap")
+ , m_EntryBuffer(ctx.GetAllocator(), "SBufferManager::m_EntryBuffer")
+ , m_GPUSupportsDXT(ctx.AreDXTImagesSupported())
+ , m_reloadableResources(false)
+ {
+ }
+ virtual ~SBufferManager() { Clear(); }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Context->GetAllocator())
+
+ CRegisteredString CombineBaseAndRelative(const char8_t *inBase,
+ const char8_t *inRelative) override
+ {
+ CFileTools::CombineBaseAndRelative(inBase, inRelative, m_PathBuilder);
+ return m_StrTable->RegisterStr(m_PathBuilder.c_str());
+ }
+
+ void SetImageHasTransparency(CRegisteredString inImagePath, bool inHasTransparency) override
+ {
+ pair<TImageMap::iterator, bool> theImage =
+ m_ImageMap.insert(make_pair(inImagePath, SImageEntry()));
+ theImage.first->second.m_TextureFlags.SetHasTransparency(inHasTransparency);
+ }
+
+ bool GetImageHasTransparency(CRegisteredString inSourcePath) const override
+ {
+ TImageMap::const_iterator theIter = m_ImageMap.find(inSourcePath);
+ if (theIter != m_ImageMap.end())
+ return theIter->second.m_TextureFlags.HasTransparency();
+ return false;
+ }
+
+ void SetImageTransparencyToFalseIfNotSet(CRegisteredString inSourcePath) override
+ {
+ pair<TImageMap::iterator, bool> theImage =
+ m_ImageMap.insert(make_pair(inSourcePath, SImageEntry()));
+ // If we did actually insert something
+ if (theImage.second)
+ theImage.first->second.m_TextureFlags.SetHasTransparency(false);
+ }
+
+ void SetInvertImageUVCoords(CRegisteredString inImagePath, bool inShouldInvertCoords) override
+ {
+ pair<TImageMap::iterator, bool> theImage =
+ m_ImageMap.insert(make_pair(inImagePath, SImageEntry()));
+ theImage.first->second.m_TextureFlags.SetInvertUVCoords(inShouldInvertCoords);
+ }
+
+ bool IsImageLoaded(CRegisteredString inSourcePath) override
+ {
+ Mutex::ScopedLock __locker(m_LoadedImageSetMutex);
+ return m_LoadedImageSet.find(inSourcePath) != m_LoadedImageSet.end();
+ }
+
+ bool AliasImagePath(CRegisteredString inSourcePath, CRegisteredString inAliasPath,
+ bool inIgnoreIfLoaded) override
+ {
+ if (inSourcePath.IsValid() == false || inAliasPath.IsValid() == false)
+ return false;
+ // If the image is loaded then we ignore this call in some cases.
+ if (inIgnoreIfLoaded && IsImageLoaded(inSourcePath))
+ return false;
+ m_AliasImageMap.insert(eastl::make_pair(inSourcePath, inAliasPath));
+ return true;
+ }
+
+ void UnaliasImagePath(CRegisteredString inSourcePath) override
+ {
+ m_AliasImageMap.erase(inSourcePath);
+ }
+
+ CRegisteredString GetImagePath(CRegisteredString inSourcePath) override
+ {
+ TAliasImageMap::iterator theAliasIter = m_AliasImageMap.find(inSourcePath);
+ if (theAliasIter != m_AliasImageMap.end())
+ return theAliasIter->second;
+ return inSourcePath;
+ }
+
+ CRegisteredString getImagePath(const QString &path)
+ {
+ TAliasImageMap::iterator theAliasIter
+ = m_AliasImageMap.find(m_StrTable->RegisterStr(qPrintable(path)));
+ if (theAliasIter != m_AliasImageMap.end())
+ return theAliasIter->second;
+ return m_StrTable->RegisterStr(qPrintable(path));
+ }
+
+ static inline int wrapMod(int a, int base)
+ {
+ int ret = a % base;
+ if (ret < 0)
+ ret += base;
+ return ret;
+ }
+
+ static inline void getWrappedCoords(int &sX, int &sY, int width, int height)
+ {
+ if (sY < 0) {
+ sX -= width >> 1;
+ sY = -sY;
+ }
+ if (sY >= height) {
+ sX += width >> 1;
+ sY = height - sY;
+ }
+ sX = wrapMod(sX, width);
+ sY = wrapMod(sY, height);
+ }
+
+ template <typename V, typename C>
+ void iterateAll(const V &vv, C c)
+ {
+ for (const auto x : vv)
+ c(x);
+ }
+
+ void loadTextureImage(SReloadableImageTextureData &data)
+ {
+ CRegisteredString imagePath = getImagePath(data.m_path);
+ TImageMap::iterator theIter = m_ImageMap.find(imagePath);
+ if ((theIter == m_ImageMap.end() || theIter->second.m_Loaded == false)
+ && imagePath.IsValid()) {
+ NVScopedReleasable<SLoadedTexture> theLoadedImage;
+ SImageTextureData textureData;
+
+ doImageLoad(imagePath, theLoadedImage);
+
+ if (theLoadedImage) {
+ textureData = LoadRenderImage(imagePath, *theLoadedImage, data.m_scanTransparency,
+ data.m_bsdfMipmap);
+ data.m_Texture = textureData.m_Texture;
+ data.m_TextureFlags = textureData.m_TextureFlags;
+ data.m_BSDFMipMap = textureData.m_BSDFMipMap;
+ data.m_loaded = true;
+ iterateAll(data.m_callbacks, [](SImage *img){ img->m_Flags.SetDirty(true); });
+ } else {
+ // We want to make sure that bad path fails once and doesn't fail over and over
+ // again which could slow down the system quite a bit.
+ pair<TImageMap::iterator, bool> theImage =
+ m_ImageMap.insert(make_pair(imagePath, SImageEntry()));
+ theImage.first->second.m_Loaded = true;
+ qCWarning(WARNING, "Failed to load image: %s", imagePath.c_str());
+ theIter = theImage.first;
+ }
+ } else {
+ SImageEntry textureData = theIter->second;
+ if (textureData.m_Loaded) {
+ data.m_Texture = textureData.m_Texture;
+ data.m_TextureFlags = textureData.m_TextureFlags;
+ data.m_BSDFMipMap = textureData.m_BSDFMipMap;
+ data.m_loaded = true;
+ iterateAll(data.m_callbacks, [](SImage *img){ img->m_Flags.SetDirty(true); });
+ }
+ }
+ }
+
+ void unloadTextureImage(SReloadableImageTextureData &data)
+ {
+ CRegisteredString r = m_StrTable->RegisterStr(qPrintable(data.m_path));
+ data.m_loaded = false;
+ data.m_Texture = nullptr;
+ data.m_BSDFMipMap = nullptr;
+ data.m_TextureFlags = {};
+ iterateAll(data.m_callbacks, [](SImage *img){ img->m_Flags.SetDirty(true); });
+ InvalidateBuffer(r);
+ }
+
+ void loadSet(const QSet<QString> &imageSet) override
+ {
+ for (const auto &x : imageSet) {
+ if (!m_reloadableTextures.contains(x)) {
+ auto img = CreateReloadableImage(m_StrTable->RegisterStr(qPrintable(x)), false,
+ false);
+ img->m_initialized = false;
+ loadTextureImage(*m_reloadableTextures[x]);
+ } else if (!m_reloadableTextures[x]->m_loaded) {
+ loadTextureImage(*m_reloadableTextures[x]);
+ }
+ }
+ }
+
+ void unloadSet(const QSet<QString> &imageSet) override
+ {
+ for (const auto &x : imageSet) {
+ if (m_reloadableTextures.contains(x)) {
+ if (m_reloadableTextures[x]->m_loaded)
+ unloadTextureImage(*m_reloadableTextures[x]);
+ }
+ }
+ }
+
+ virtual ReloadableTexturePtr CreateReloadableImage(CRegisteredString inSourcePath,
+ bool inForceScanForTransparency,
+ bool inBsdfMipmaps) override
+ {
+ QString path = QString::fromLatin1(inSourcePath.c_str());
+ const bool inserted = m_reloadableTextures.contains(path);
+ if (!inserted || (inserted && m_reloadableTextures[path]->m_initialized == false)) {
+ if (!inserted)
+ m_reloadableTextures.insert(path, ReloadableTexturePtr::create());
+ m_reloadableTextures[path]->m_path = path;
+ m_reloadableTextures[path]->m_scanTransparency = inForceScanForTransparency;
+ m_reloadableTextures[path]->m_bsdfMipmap = inBsdfMipmaps;
+ m_reloadableTextures[path]->m_initialized = true;
+
+ if (!m_reloadableResources)
+ loadTextureImage(*m_reloadableTextures[path]);
+
+ CRegisteredString imagePath = getImagePath(path);
+ TImageMap::iterator theIter = m_ImageMap.find(imagePath);
+ if (theIter != m_ImageMap.end()) {
+ SImageEntry textureData = theIter->second;
+ if (textureData.m_Loaded) {
+ m_reloadableTextures[path]->m_Texture = textureData.m_Texture;
+ m_reloadableTextures[path]->m_TextureFlags = textureData.m_TextureFlags;
+ m_reloadableTextures[path]->m_BSDFMipMap = textureData.m_BSDFMipMap;
+ m_reloadableTextures[path]->m_loaded = true;
+ }
+ }
+ }
+ return m_reloadableTextures[path];
+ }
+
+ void doImageLoad(CRegisteredString inImagePath,
+ NVScopedReleasable<SLoadedTexture> &theLoadedImage)
+ {
+ SStackPerfTimer __perfTimer(m_PerfTimer, "Image Decompression");
+ theLoadedImage = SLoadedTexture::Load(
+ inImagePath.c_str(), m_Context->GetFoundation(), *m_InputStreamFactory,
+ true, m_Context->GetRenderContextType());
+ // Hackish solution to custom materials not finding their textures if they are used
+ // in sub-presentations.
+ if (!theLoadedImage) {
+ if (QDir(inImagePath.c_str()).isRelative()) {
+ QString searchPath = inImagePath.c_str();
+ if (searchPath.startsWith(QLatin1String("./")))
+ searchPath.prepend(QLatin1Char('.'));
+ int loops = 0;
+ while (!theLoadedImage && ++loops <= 3) {
+ theLoadedImage = SLoadedTexture::Load(
+ searchPath.toUtf8(), m_Context->GetFoundation(),
+ *m_InputStreamFactory, true,
+ m_Context->GetRenderContextType());
+ searchPath.prepend(QLatin1String("../"));
+ }
+ } else {
+ // Some textures, for example environment maps for custom materials,
+ // have absolute path at this point. It points to the wrong place with
+ // the new project structure, so we need to split it up and construct
+ // the new absolute path here.
+ QString wholePath = inImagePath.c_str();
+ QStringList splitPath = wholePath.split(QLatin1String("../"));
+ if (splitPath.size() > 1) {
+ QString searchPath = splitPath.at(0) + splitPath.at(1);
+ int loops = 0;
+ while (!theLoadedImage && ++loops <= 3) {
+ theLoadedImage = SLoadedTexture::Load(
+ searchPath.toUtf8(), m_Context->GetFoundation(),
+ *m_InputStreamFactory, true,
+ m_Context->GetRenderContextType());
+ searchPath = splitPath.at(0);
+ for (int i = 0; i < loops; i++)
+ searchPath.append(QLatin1String("../"));
+ searchPath.append(splitPath.at(1));
+ }
+ }
+ }
+ }
+ }
+
+ void enableReloadableResources(bool enable) override
+ {
+ m_reloadableResources = enable;
+ }
+
+ bool isReloadableResourcesEnabled() const override
+ {
+ return m_reloadableResources;
+ }
+
+ SImageTextureData LoadRenderImage(CRegisteredString inImagePath,
+ SLoadedTexture &inLoadedImage,
+ bool inForceScanForTransparency, bool inBsdfMipmaps) override
+ {
+ SStackPerfTimer __perfTimer(m_PerfTimer, "Image Upload");
+ {
+ Mutex::ScopedLock __mapLocker(m_LoadedImageSetMutex);
+ m_LoadedImageSet.insert(inImagePath);
+ }
+ pair<TImageMap::iterator, bool> theImage =
+ m_ImageMap.insert(make_pair(inImagePath, SImageEntry()));
+ bool wasInserted = theImage.second;
+ theImage.first->second.m_Loaded = true;
+ // inLoadedImage.EnsureMultiplerOfFour( m_Context->GetFoundation(), inImagePath.c_str() );
+
+ NVRenderTexture2D *theTexture = m_Context->CreateTexture2D();
+ if (inLoadedImage.data) {
+ qt3ds::render::NVRenderTextureFormats::Enum destFormat = inLoadedImage.format;
+ if (inBsdfMipmaps) {
+ if (m_Context->GetRenderContextType() == render::NVRenderContextValues::GLES2)
+ destFormat = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ else
+ destFormat = qt3ds::render::NVRenderTextureFormats::RGBA16F;
+ }
+ else {
+ theTexture->SetTextureData(
+ NVDataRef<QT3DSU8>((QT3DSU8 *)inLoadedImage.data, inLoadedImage.dataSizeInBytes), 0,
+ inLoadedImage.width, inLoadedImage.height, inLoadedImage.format, destFormat);
+ {
+ static int enable = qEnvironmentVariableIntValue("QT3DS_GENERATE_MIPMAPS");
+ if (enable) {
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear);
+ theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ theTexture->GenerateMipmaps();
+ }
+ }
+ }
+
+ if (inBsdfMipmaps
+ && NVRenderTextureFormats::isUncompressedTextureFormat(inLoadedImage.format)) {
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear);
+ Qt3DSRenderPrefilterTexture *theBSDFMipMap = theImage.first->second.m_BSDFMipMap;
+ if (theBSDFMipMap == NULL) {
+ theBSDFMipMap = Qt3DSRenderPrefilterTexture::Create(
+ m_Context, inLoadedImage.width, inLoadedImage.height, *theTexture,
+ destFormat, m_Context->GetFoundation());
+ theImage.first->second.m_BSDFMipMap = theBSDFMipMap;
+ }
+
+ if (theBSDFMipMap) {
+ theBSDFMipMap->Build(inLoadedImage.data, inLoadedImage.dataSizeInBytes,
+ inLoadedImage.format);
+ }
+ }
+ } else if (inLoadedImage.dds) {
+ theImage.first->second.m_Texture = theTexture;
+ bool supportsDXT = m_GPUSupportsDXT;
+ bool isDXT = NVRenderTextureFormats::isCompressedTextureFormat(inLoadedImage.format);
+ bool requiresDecompression = (supportsDXT == false && isDXT) || false;
+ // test code for DXT decompression
+ // if ( isDXT ) requiresDecompression = true;
+ if (requiresDecompression) {
+ qCWarning(WARNING, PERF_INFO,
+ "Image %s is DXT format which is unsupported by "
+ "the graphics subsystem, decompressing in CPU",
+ inImagePath.c_str());
+ }
+ STextureData theDecompressedImage;
+ for (int idx = 0; idx < inLoadedImage.dds->numMipmaps; ++idx) {
+ if (inLoadedImage.dds->mipwidth[idx] && inLoadedImage.dds->mipheight[idx]) {
+ if (requiresDecompression == false) {
+ theTexture->SetTextureData(
+ toU8DataRef((char *)inLoadedImage.dds->data[idx],
+ (QT3DSU32)inLoadedImage.dds->size[idx]),
+ (QT3DSU8)idx, (QT3DSU32)inLoadedImage.dds->mipwidth[idx],
+ (QT3DSU32)inLoadedImage.dds->mipheight[idx], inLoadedImage.format);
+ } else {
+ theDecompressedImage =
+ inLoadedImage.DecompressDXTImage(idx, &theDecompressedImage);
+
+ if (theDecompressedImage.data) {
+ theTexture->SetTextureData(
+ toU8DataRef((char *)theDecompressedImage.data,
+ (QT3DSU32)theDecompressedImage.dataSizeInBytes),
+ (QT3DSU8)idx, (QT3DSU32)inLoadedImage.dds->mipwidth[idx],
+ (QT3DSU32)inLoadedImage.dds->mipheight[idx],
+ theDecompressedImage.format);
+ }
+ }
+ }
+ }
+ if (theDecompressedImage.data)
+ inLoadedImage.ReleaseDecompressedTexture(theDecompressedImage);
+ }
+ if (wasInserted == true || inForceScanForTransparency)
+ theImage.first->second.m_TextureFlags.SetHasTransparency(
+ inLoadedImage.ScanForTransparency());
+ theImage.first->second.m_Texture = theTexture;
+ return theImage.first->second;
+ }
+
+ SImageTextureData LoadRenderImage(CRegisteredString inImagePath,
+ bool inForceScanForTransparency, bool inBsdfMipmaps) override
+ {
+ inImagePath = GetImagePath(inImagePath);
+
+ if (!inImagePath.IsValid())
+ return SImageEntry();
+
+ TImageMap::iterator theIter = m_ImageMap.find(inImagePath);
+ if (theIter == m_ImageMap.end() && inImagePath.IsValid()) {
+ NVScopedReleasable<SLoadedTexture> theLoadedImage;
+
+ doImageLoad(inImagePath, theLoadedImage);
+
+ if (theLoadedImage) {
+ return LoadRenderImage(inImagePath, *theLoadedImage, inForceScanForTransparency,
+ inBsdfMipmaps);
+ } else {
+ // We want to make sure that bad path fails once and doesn't fail over and over
+ // again
+ // which could slow down the system quite a bit.
+ pair<TImageMap::iterator, bool> theImage =
+ m_ImageMap.insert(make_pair(inImagePath, SImageEntry()));
+ theImage.first->second.m_Loaded = true;
+ qCWarning(WARNING, "Failed to load image: %s", inImagePath.c_str());
+ theIter = theImage.first;
+ }
+ }
+ return theIter->second;
+ }
+
+ qt3dsimp::SMultiLoadResult LoadPrimitive(const char8_t *inRelativePath)
+ {
+ CRegisteredString theName(m_StrTable->RegisterStr(inRelativePath));
+ if (m_PrimitiveNames[0].m_PrimitiveName.IsValid() == false) {
+ IStringTable &strTable(m_Context->GetStringTable());
+ m_PrimitiveNames[0].m_PrimitiveName = strTable.RegisterStr("#Rectangle");
+ m_PrimitiveNames[0].m_FileName = strTable.RegisterStr("Rectangle.mesh");
+ m_PrimitiveNames[1].m_PrimitiveName = strTable.RegisterStr("#Sphere");
+ m_PrimitiveNames[1].m_FileName = strTable.RegisterStr("Sphere.mesh");
+ m_PrimitiveNames[2].m_PrimitiveName = strTable.RegisterStr("#Cube");
+ m_PrimitiveNames[2].m_FileName = strTable.RegisterStr("Cube.mesh");
+ m_PrimitiveNames[3].m_PrimitiveName = strTable.RegisterStr("#Cone");
+ m_PrimitiveNames[3].m_FileName = strTable.RegisterStr("Cone.mesh");
+ m_PrimitiveNames[4].m_PrimitiveName = strTable.RegisterStr("#Cylinder");
+ m_PrimitiveNames[4].m_FileName = strTable.RegisterStr("Cylinder.mesh");
+ }
+ for (size_t idx = 0; idx < 5; ++idx) {
+ if (m_PrimitiveNames[idx].m_PrimitiveName == theName) {
+ CFileTools::CombineBaseAndRelative(GetPrimitivesDirectory(),
+ m_PrimitiveNames[idx].m_FileName, m_PathBuilder);
+ QT3DSU32 id = 1;
+ NVScopedRefCounted<IRefCountedInputStream> theInStream(
+ m_InputStreamFactory->GetStreamForFile(m_PathBuilder.c_str()));
+ if (theInStream)
+ return qt3dsimp::Mesh::LoadMulti(m_Context->GetAllocator(), *theInStream, id);
+ else {
+ qCCritical(INTERNAL_ERROR, "Unable to find mesh primitive %s",
+ m_PathBuilder.c_str());
+ return qt3dsimp::SMultiLoadResult();
+ }
+ }
+ }
+ return qt3dsimp::SMultiLoadResult();
+ }
+
+ virtual NVConstDataRef<QT3DSU8> CreatePackedPositionDataArray(
+ const qt3dsimp::SMultiLoadResult &inResult)
+ {
+ // we assume a position consists of 3 floats
+ QT3DSU32 vertexCount = inResult.m_Mesh->m_VertexBuffer.m_Data.size()
+ / inResult.m_Mesh->m_VertexBuffer.m_Stride;
+ QT3DSU32 dataSize = vertexCount * 3 * sizeof(QT3DSF32);
+ QT3DSF32 *posData = static_cast<QT3DSF32 *>(
+ QT3DS_ALLOC(m_Context->GetAllocator(), dataSize,
+ "SRenderMesh::CreatePackedPositionDataArray"));
+ QT3DSU8 *baseOffset = reinterpret_cast<QT3DSU8 *>(inResult.m_Mesh);
+ // copy position data
+ if (posData) {
+ QT3DSF32 *srcData = reinterpret_cast<QT3DSF32 *>(
+ inResult.m_Mesh->m_VertexBuffer.m_Data.begin(baseOffset));
+ QT3DSU32 srcStride = inResult.m_Mesh->m_VertexBuffer.m_Stride / sizeof(QT3DSF32);
+ QT3DSF32 *dstData = posData;
+ QT3DSU32 dstStride = 3;
+
+ for (QT3DSU32 i = 0; i < vertexCount; ++i) {
+ dstData[0] = srcData[0];
+ dstData[1] = srcData[1];
+ dstData[2] = srcData[2];
+
+ dstData += dstStride;
+ srcData += srcStride;
+ }
+
+ return toConstDataRef(reinterpret_cast<const qt3ds::QT3DSU8 *>(posData), dataSize);
+ }
+
+ return NVConstDataRef<QT3DSU8>();
+ }
+
+ SRenderMesh *createRenderMesh(const qt3dsimp::SMultiLoadResult &result)
+ {
+ SRenderMesh *theNewMesh = QT3DS_NEW(m_Context->GetAllocator(), SRenderMesh)(
+ qt3ds::render::NVRenderDrawMode::Triangles,
+ qt3ds::render::NVRenderWinding::CounterClockwise, result.m_Id,
+ m_Context->GetAllocator());
+ QT3DSU8 *baseAddress = reinterpret_cast<QT3DSU8 *>(result.m_Mesh);
+ NVConstDataRef<QT3DSU8> theVBufData(
+ result.m_Mesh->m_VertexBuffer.m_Data.begin(baseAddress),
+ result.m_Mesh->m_VertexBuffer.m_Data.size());
+
+ NVRenderVertexBuffer *theVertexBuffer = m_Context->CreateVertexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static,
+ result.m_Mesh->m_VertexBuffer.m_Data.m_Size,
+ result.m_Mesh->m_VertexBuffer.m_Stride, theVBufData);
+
+ // create a tight packed position data VBO
+ // this should improve our depth pre pass rendering
+ NVRenderVertexBuffer *thePosVertexBuffer = nullptr;
+ NVConstDataRef<QT3DSU8> posData = CreatePackedPositionDataArray(result);
+ if (posData.size()) {
+ thePosVertexBuffer
+ = m_Context->CreateVertexBuffer(qt3ds::render::NVRenderBufferUsageType::Static,
+ posData.size(), 3 * sizeof(QT3DSF32), posData);
+ }
+
+ NVRenderIndexBuffer *theIndexBuffer = nullptr;
+ if (result.m_Mesh->m_IndexBuffer.m_Data.size()) {
+ using qt3ds::render::NVRenderComponentTypes;
+ QT3DSU32 theIndexBufferSize = result.m_Mesh->m_IndexBuffer.m_Data.size();
+ NVRenderComponentTypes::Enum bufComponentType =
+ result.m_Mesh->m_IndexBuffer.m_ComponentType;
+ QT3DSU32 sizeofType
+ = qt3ds::render::NVRenderComponentTypes::getSizeofType(bufComponentType);
+
+ if (sizeofType == 2 || sizeofType == 4) {
+ // Ensure type is unsigned; else things will fail in rendering pipeline.
+ if (bufComponentType == NVRenderComponentTypes::QT3DSI16)
+ bufComponentType = NVRenderComponentTypes::QT3DSU16;
+ if (bufComponentType == NVRenderComponentTypes::QT3DSI32)
+ bufComponentType = NVRenderComponentTypes::QT3DSU32;
+
+ NVConstDataRef<QT3DSU8> theIBufData(
+ result.m_Mesh->m_IndexBuffer.m_Data.begin(baseAddress),
+ result.m_Mesh->m_IndexBuffer.m_Data.size());
+ theIndexBuffer = m_Context->CreateIndexBuffer(
+ qt3ds::render::NVRenderBufferUsageType::Static, bufComponentType,
+ theIndexBufferSize, theIBufData);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ nvvector<qt3ds::render::NVRenderVertexBufferEntry> &theEntryBuffer(m_EntryBuffer);
+ theEntryBuffer.resize(result.m_Mesh->m_VertexBuffer.m_Entries.size());
+ for (QT3DSU32 entryIdx = 0,
+ entryEnd = result.m_Mesh->m_VertexBuffer.m_Entries.size();
+ entryIdx < entryEnd; ++entryIdx) {
+ theEntryBuffer[entryIdx]
+ = result.m_Mesh->m_VertexBuffer.m_Entries.index(baseAddress, entryIdx)
+ .ToVertexBufferEntry(baseAddress);
+ }
+ // create our attribute layout
+ NVRenderAttribLayout *theAttribLayout
+ = m_Context->CreateAttributeLayout(theEntryBuffer);
+ // create our attribute layout for depth pass
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry(
+ "attr_pos", qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ };
+ NVRenderAttribLayout *theAttribLayoutDepth
+ = m_Context->CreateAttributeLayout(toConstDataRef(theEntries, 1));
+
+ // create input assembler object
+ QT3DSU32 strides = result.m_Mesh->m_VertexBuffer.m_Stride;
+ QT3DSU32 offsets = 0;
+ NVRenderInputAssembler *theInputAssembler = m_Context->CreateInputAssembler(
+ theAttribLayout, toConstDataRef(&theVertexBuffer, 1), theIndexBuffer,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1),
+ result.m_Mesh->m_DrawMode);
+
+ // create depth input assembler object
+ QT3DSU32 posStrides = thePosVertexBuffer ? 3 * sizeof(QT3DSF32) : strides;
+ NVRenderInputAssembler *theInputAssemblerDepth = m_Context->CreateInputAssembler(
+ theAttribLayoutDepth,
+ toConstDataRef(thePosVertexBuffer ? &thePosVertexBuffer : &theVertexBuffer, 1),
+ theIndexBuffer, toConstDataRef(&posStrides, 1), toConstDataRef(&offsets, 1),
+ result.m_Mesh->m_DrawMode);
+
+ NVRenderInputAssembler *theInputAssemblerPoints = m_Context->CreateInputAssembler(
+ theAttribLayoutDepth,
+ toConstDataRef(thePosVertexBuffer ? &thePosVertexBuffer : &theVertexBuffer, 1),
+ nullptr, toConstDataRef(&posStrides, 1), toConstDataRef(&offsets, 1),
+ NVRenderDrawMode::Points);
+
+ if (!theInputAssembler || !theInputAssemblerDepth || !theInputAssemblerPoints) {
+ QT3DS_ASSERT(false);
+ return nullptr;
+ }
+ theNewMesh->m_Joints.resize(result.m_Mesh->m_Joints.size());
+ for (QT3DSU32 jointIdx = 0, jointEnd = result.m_Mesh->m_Joints.size();
+ jointIdx < jointEnd; ++jointIdx) {
+ const qt3dsimp::Joint &theImportJoint(
+ result.m_Mesh->m_Joints.index(baseAddress, jointIdx));
+ SRenderJoint &theNewJoint(theNewMesh->m_Joints[jointIdx]);
+ theNewJoint.m_JointID = theImportJoint.m_JointID;
+ theNewJoint.m_ParentID = theImportJoint.m_ParentID;
+ memCopy(theNewJoint.m_invBindPose, theImportJoint.m_invBindPose,
+ 16 * sizeof(QT3DSF32));
+ memCopy(theNewJoint.m_localToGlobalBoneSpace,
+ theImportJoint.m_localToGlobalBoneSpace, 16 * sizeof(QT3DSF32));
+ }
+
+ for (QT3DSU32 subsetIdx = 0, subsetEnd = result.m_Mesh->m_Subsets.size();
+ subsetIdx < subsetEnd; ++subsetIdx) {
+ SRenderSubset theSubset(m_Context->GetAllocator());
+ const qt3dsimp::MeshSubset &source(
+ result.m_Mesh->m_Subsets.index(baseAddress, subsetIdx));
+ theSubset.m_Bounds = source.m_Bounds;
+ theSubset.m_Count = source.m_Count;
+ theSubset.m_Offset = source.m_Offset;
+ theSubset.m_Joints = theNewMesh->m_Joints;
+ theSubset.m_Name = m_StrTable->RegisterStr(source.m_Name.begin(baseAddress));
+ theVertexBuffer->addRef();
+ theSubset.m_VertexBuffer = theVertexBuffer;
+ if (thePosVertexBuffer) {
+ thePosVertexBuffer->addRef();
+ theSubset.m_PosVertexBuffer = thePosVertexBuffer;
+ }
+ if (theIndexBuffer) {
+ theIndexBuffer->addRef();
+ theSubset.m_IndexBuffer = theIndexBuffer;
+ }
+ theSubset.m_InputAssembler = theInputAssembler;
+ theSubset.m_InputAssemblerDepth = theInputAssemblerDepth;
+ theSubset.m_InputAssemblerPoints = theInputAssemblerPoints;
+ theSubset.m_PrimitiveType = result.m_Mesh->m_DrawMode;
+ theInputAssembler->addRef();
+ theInputAssemblerDepth->addRef();
+ theSubset.m_InputAssemblerPoints->addRef();
+ theNewMesh->m_Subsets.push_back(theSubset);
+ }
+ // If we want to, we can break up models into sub-subsets.
+ // These are assumed to use the same material as the outer subset but have fewer triangles
+ // and should have a more exact bounding box. This sort of thing helps with using the
+ // frustum culling system but it is really done incorrectly.
+ // It should be done via some sort of oct-tree mechanism and so that the sub-subsets
+ // are spatially sorted and it should only be done upon save-to-binary with the
+ // results saved out to disk. As you can see, doing it properly requires some real
+ // engineering effort so it is somewhat unlikely it will ever happen.
+ // Or it could be done on import if someone really wants to change the mesh buffer
+ // format. Either way it isn't going to happen here and it isn't going to happen this way
+ // but this is a working example of using the technique.
+#ifdef QT3DS_RENDER_GENERATE_SUB_SUBSETS
+ Option<qt3ds::render::NVRenderVertexBufferEntry> thePosAttrOpt
+ = theVertexBuffer->GetEntryByName("attr_pos");
+ bool hasPosAttr = thePosAttrOpt.hasValue()
+ && thePosAttrOpt->m_ComponentType == qt3ds::render::NVRenderComponentTypes::QT3DSF32
+ && thePosAttrOpt->m_NumComponents == 3;
+
+ for (size_t subsetIdx = 0, subsetEnd = theNewMesh->m_Subsets.size();
+ subsetIdx < subsetEnd; ++subsetIdx) {
+ SRenderSubset &theOuterSubset = theNewMesh->m_Subsets[subsetIdx];
+ if (theOuterSubset.m_Count && theIndexBuffer
+ && theIndexBuffer->GetComponentType()
+ == qt3ds::render::NVRenderComponentTypes::QT3DSU16
+ && theNewMesh->m_DrawMode == NVRenderDrawMode::Triangles && hasPosAttr) {
+ // Num tris in a sub subset.
+ QT3DSU32 theSubsetSize = 3334 * 3; // divisible by three.
+ size_t theNumSubSubsets = ((theOuterSubset.m_Count - 1) / theSubsetSize) + 1;
+ QT3DSU32 thePosAttrOffset = thePosAttrOpt->m_FirstItemOffset;
+ const QT3DSU8 *theVertData = result.m_Mesh->m_VertexBuffer.m_Data.begin();
+ const QT3DSU8 *theIdxData = result.m_Mesh->m_IndexBuffer.m_Data.begin();
+ QT3DSU32 theVertStride = result.m_Mesh->m_VertexBuffer.m_Stride;
+ QT3DSU32 theOffset = theOuterSubset.m_Offset;
+ QT3DSU32 theCount = theOuterSubset.m_Count;
+ for (size_t subSubsetIdx = 0, subSubsetEnd = theNumSubSubsets;
+ subSubsetIdx < subSubsetEnd; ++subSubsetIdx) {
+ SRenderSubsetBase theBase;
+ theBase.m_Offset = theOffset;
+ theBase.m_Count = NVMin(theSubsetSize, theCount);
+ theBase.m_Bounds.setEmpty();
+ theCount -= theBase.m_Count;
+ theOffset += theBase.m_Count;
+ // Create new bounds.
+ // Offset is in item size, not bytes.
+ const QT3DSU16 *theSubsetIdxData
+ = reinterpret_cast<const QT3DSU16 *>(theIdxData + theBase.m_Offset * 2);
+ for (size_t theIdxIdx = 0, theIdxEnd = theBase.m_Count;
+ theIdxIdx < theIdxEnd; ++theIdxIdx) {
+ QT3DSU32 theVertOffset = theSubsetIdxData[theIdxIdx] * theVertStride;
+ theVertOffset += thePosAttrOffset;
+ QT3DSVec3 thePos = *(
+ reinterpret_cast<const QT3DSVec3 *>(theVertData + theVertOffset));
+ theBase.m_Bounds.include(thePos);
+ }
+ theOuterSubset.m_SubSubsets.push_back(theBase);
+ }
+ } else {
+ SRenderSubsetBase theBase;
+ theBase.m_Bounds = theOuterSubset.m_Bounds;
+ theBase.m_Count = theOuterSubset.m_Count;
+ theBase.m_Offset = theOuterSubset.m_Offset;
+ theOuterSubset.m_SubSubsets.push_back(theBase);
+ }
+ }
+#endif
+ if (posData.size()) {
+ m_Context->GetAllocator().deallocate(
+ static_cast<void *>(const_cast<qt3ds::QT3DSU8 *>(posData.begin())));
+ }
+
+ return theNewMesh;
+ }
+
+ void loadCustomMesh(const QString &name, qt3dsimp::Mesh *mesh) override
+ {
+ if (!name.isEmpty() && mesh) {
+ CRegisteredString meshName = m_StrTable->RegisterStr(name);
+ pair<TMeshMap::iterator, bool> theMesh
+ = m_MeshMap.insert({ meshName, static_cast<SRenderMesh *>(nullptr) });
+ // Only create the mesh if it doesn't yet exist
+ if (theMesh.second) {
+ qt3dsimp::SMultiLoadResult result;
+ result.m_Mesh = mesh;
+ theMesh.first->second = createRenderMesh(result);
+ }
+ }
+ }
+
+ SRenderMesh *LoadMesh(CRegisteredString inMeshPath) override
+ {
+ if (inMeshPath.IsValid() == false)
+ return nullptr;
+ pair<TMeshMap::iterator, bool> theMesh =
+ m_MeshMap.insert(make_pair(inMeshPath, static_cast<SRenderMesh *>(nullptr)));
+ if (theMesh.second) {
+ // Check to see if this is primitive
+ qt3dsimp::SMultiLoadResult theResult = LoadPrimitive(inMeshPath);
+
+ // Attempt a load from the filesystem if this mesh isn't a primitive.
+ if (!theResult.m_Mesh) {
+ m_PathBuilder = inMeshPath;
+ TStr::size_type pound = m_PathBuilder.rfind('#');
+ QT3DSU32 id = 0;
+ if (pound != TStr::npos) {
+ id = QT3DSU32(atoi(m_PathBuilder.c_str() + pound + 1));
+ m_PathBuilder.erase(m_PathBuilder.begin() + pound, m_PathBuilder.end());
+ }
+ NVScopedRefCounted<IRefCountedInputStream> theStream(
+ m_InputStreamFactory->GetStreamForFile(m_PathBuilder.c_str()));
+ if (theStream) {
+ theResult = qt3dsimp::Mesh::LoadMulti(
+ m_Context->GetAllocator(), *theStream, id);
+ }
+ if (!theResult.m_Mesh)
+ qCWarning(WARNING, "Failed to load mesh: %s", m_PathBuilder.c_str());
+ }
+
+ if (theResult.m_Mesh) {
+ theMesh.first->second = createRenderMesh(theResult);
+ m_Context->GetAllocator().deallocate(theResult.m_Mesh);
+ }
+ }
+ return theMesh.first->second;
+ }
+
+ SRenderMesh *CreateMesh(Qt3DSBCharPtr inSourcePath, QT3DSU8 *inVertData, QT3DSU32 inNumVerts,
+ QT3DSU32 inVertStride, QT3DSU32 *inIndexData, QT3DSU32 inIndexCount,
+ qt3ds::NVBounds3 inBounds) override
+ {
+ CRegisteredString sourcePath = m_StrTable->RegisterStr(inSourcePath);
+
+ // eastl::pair<CRegisteredString, SRenderMesh*> thePair(sourcePath, (SRenderMesh*)NULL);
+ pair<TMeshMap::iterator, bool> theMesh;
+ // Make sure there isn't already a buffer entry for this mesh.
+ if (m_MeshMap.contains(sourcePath)) {
+ theMesh = make_pair<TMeshMap::iterator, bool>(m_MeshMap.find(sourcePath), true);
+ } else {
+ theMesh = m_MeshMap.insert(make_pair(sourcePath, (SRenderMesh *)NULL));
+ }
+
+ if (theMesh.second == true) {
+ SRenderMesh *theNewMesh = QT3DS_NEW(m_Context->GetAllocator(), SRenderMesh)(
+ qt3ds::render::NVRenderDrawMode::Triangles,
+ qt3ds::render::NVRenderWinding::CounterClockwise, 0, m_Context->GetAllocator());
+
+ // If we failed to create the RenderMesh, return a failure.
+ if (!theNewMesh) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ // Get rid of any old mesh that was sitting here and fill it with a new one.
+ // NOTE : This is assuming that the source of our mesh data doesn't do its own memory
+ // management and always returns new buffer pointers every time.
+ // Don't know for sure if that's what we'll get from our intended sources, but that's
+ // easily
+ // adjustable by looking for matching pointers in the Subsets.
+ if (theNewMesh && theMesh.first->second != NULL) {
+ delete theMesh.first->second;
+ theMesh.first->second = NULL;
+ }
+
+ theMesh.first->second = theNewMesh;
+ QT3DSU32 vertDataSize = inNumVerts * inVertStride;
+ NVConstDataRef<QT3DSU8> theVBufData(inVertData, vertDataSize);
+ // NVConstDataRef<QT3DSU8> theVBufData( theResult.m_Mesh->m_VertexBuffer.m_Data.begin(
+ // baseAddress )
+ // , theResult.m_Mesh->m_VertexBuffer.m_Data.size() );
+
+ NVRenderVertexBuffer *theVertexBuffer =
+ m_Context->CreateVertexBuffer(qt3ds::render::NVRenderBufferUsageType::Static,
+ vertDataSize, inVertStride, theVBufData);
+ NVRenderIndexBuffer *theIndexBuffer = NULL;
+ if (inIndexData != NULL && inIndexCount > 3) {
+ NVConstDataRef<QT3DSU8> theIBufData((QT3DSU8 *)inIndexData, inIndexCount * sizeof(QT3DSU32));
+ theIndexBuffer =
+ m_Context->CreateIndexBuffer(qt3ds::render::NVRenderBufferUsageType::Static,
+ qt3ds::render::NVRenderComponentTypes::QT3DSU32,
+ inIndexCount * sizeof(QT3DSU32), theIBufData);
+ }
+
+ // WARNING
+ // Making an assumption here about the contents of the stream
+ // PKC TODO : We may have to consider some other format.
+ qt3ds::render::NVRenderVertexBufferEntry theEntries[] = {
+ qt3ds::render::NVRenderVertexBufferEntry("attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3),
+ qt3ds::render::NVRenderVertexBufferEntry(
+ "attr_uv", qt3ds::render::NVRenderComponentTypes::QT3DSF32, 2, 12),
+ qt3ds::render::NVRenderVertexBufferEntry(
+ "attr_norm", qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3, 18),
+ };
+
+ // create our attribute layout
+ NVRenderAttribLayout *theAttribLayout =
+ m_Context->CreateAttributeLayout(toConstDataRef(theEntries, 3));
+ /*
+ // create our attribute layout for depth pass
+ qt3ds::render::NVRenderVertexBufferEntry theEntriesDepth[] = {
+ qt3ds::render::NVRenderVertexBufferEntry( "attr_pos",
+ qt3ds::render::NVRenderComponentTypes::QT3DSF32, 3 ),
+ };
+ NVRenderAttribLayout* theAttribLayoutDepth = m_Context->CreateAttributeLayout(
+ toConstDataRef( theEntriesDepth, 1 ) );
+ */
+ // create input assembler object
+ QT3DSU32 strides = inVertStride;
+ QT3DSU32 offsets = 0;
+ NVRenderInputAssembler *theInputAssembler = m_Context->CreateInputAssembler(
+ theAttribLayout, toConstDataRef(&theVertexBuffer, 1), theIndexBuffer,
+ toConstDataRef(&strides, 1), toConstDataRef(&offsets, 1),
+ qt3ds::render::NVRenderDrawMode::Triangles);
+
+ if (!theInputAssembler) {
+ QT3DS_ASSERT(false);
+ return NULL;
+ }
+
+ // Pull out just the mesh object name from the total path
+ eastl::string fullName(inSourcePath);
+ eastl::string subName(inSourcePath);
+ if (fullName.rfind("#") != eastl::string::npos) {
+ subName = fullName.substr(fullName.rfind("#"), eastl::string::npos);
+ }
+
+ theNewMesh->m_Joints.clear();
+ SRenderSubset theSubset(m_Context->GetAllocator());
+ theSubset.m_Bounds = inBounds;
+ theSubset.m_Count = inIndexCount;
+ theSubset.m_Offset = 0;
+ theSubset.m_Joints = theNewMesh->m_Joints;
+ theSubset.m_Name = m_StrTable->RegisterStr(subName.c_str());
+ theVertexBuffer->addRef();
+ theSubset.m_VertexBuffer = theVertexBuffer;
+ theSubset.m_PosVertexBuffer = NULL;
+ if (theIndexBuffer)
+ theIndexBuffer->addRef();
+ theSubset.m_IndexBuffer = theIndexBuffer;
+ theSubset.m_InputAssembler = theInputAssembler;
+ theSubset.m_InputAssemblerDepth = theInputAssembler;
+ theSubset.m_InputAssemblerPoints = theInputAssembler;
+ theSubset.m_PrimitiveType = qt3ds::render::NVRenderDrawMode::Triangles;
+ theSubset.m_InputAssembler->addRef();
+ theSubset.m_InputAssemblerDepth->addRef();
+ theSubset.m_InputAssemblerPoints->addRef();
+ theNewMesh->m_Subsets.push_back(theSubset);
+ }
+
+ return theMesh.first->second;
+ }
+
+ void ReleaseMesh(SRenderMesh &inMesh)
+ {
+ for (QT3DSU32 subsetIdx = 0, subsetEnd = inMesh.m_Subsets.size(); subsetIdx < subsetEnd;
+ ++subsetIdx) {
+ inMesh.m_Subsets[subsetIdx].m_VertexBuffer->release();
+ if (inMesh.m_Subsets[subsetIdx].m_PosVertexBuffer) // can be NULL
+ inMesh.m_Subsets[subsetIdx].m_PosVertexBuffer->release();
+ if (inMesh.m_Subsets[subsetIdx].m_IndexBuffer) // can be NULL
+ inMesh.m_Subsets[subsetIdx].m_IndexBuffer->release();
+ inMesh.m_Subsets[subsetIdx].m_InputAssembler->release();
+ inMesh.m_Subsets[subsetIdx].m_InputAssemblerDepth->release();
+ if (inMesh.m_Subsets[subsetIdx].m_InputAssemblerPoints)
+ inMesh.m_Subsets[subsetIdx].m_InputAssemblerPoints->release();
+ }
+ NVDelete(m_Context->GetAllocator(), &inMesh);
+ }
+ void ReleaseTexture(SImageEntry &inEntry)
+ {
+ if (inEntry.m_Texture)
+ inEntry.m_Texture->release();
+ if (inEntry.m_BSDFMipMap)
+ inEntry.m_BSDFMipMap->release();
+ }
+ void Clear() override
+ {
+ m_reloadableTextures.clear();
+ for (TMeshMap::iterator iter = m_MeshMap.begin(), end = m_MeshMap.end(); iter != end;
+ ++iter) {
+ SRenderMesh *theMesh = iter->second;
+ if (theMesh)
+ ReleaseMesh(*theMesh);
+ }
+ m_MeshMap.clear();
+ for (TImageMap::iterator iter = m_ImageMap.begin(), end = m_ImageMap.end(); iter != end;
+ ++iter) {
+ SImageEntry &theEntry = iter->second;
+ ReleaseTexture(theEntry);
+ }
+ m_ImageMap.clear();
+ m_AliasImageMap.clear();
+ {
+ Mutex::ScopedLock __locker(m_LoadedImageSetMutex);
+ m_LoadedImageSet.clear();
+ }
+ }
+ void InvalidateBuffer(CRegisteredString inSourcePath) override
+ {
+ {
+ TMeshMap::iterator iter = m_MeshMap.find(inSourcePath);
+ if (iter != m_MeshMap.end()) {
+ if (iter->second)
+ ReleaseMesh(*iter->second);
+ m_MeshMap.erase(iter);
+ return;
+ }
+ }
+ {
+ TImageMap::iterator iter = m_ImageMap.find(inSourcePath);
+ if (iter != m_ImageMap.end()) {
+ SImageEntry &theEntry = iter->second;
+ ReleaseTexture(theEntry);
+ m_ImageMap.erase(inSourcePath);
+ {
+ Mutex::ScopedLock __locker(m_LoadedImageSetMutex);
+ m_LoadedImageSet.erase(inSourcePath);
+ }
+ }
+ }
+ }
+ IStringTable &GetStringTable() override { return *m_StrTable; }
+};
+}
+
+IBufferManager &IBufferManager::Create(NVRenderContext &inRenderContext, IStringTable &inStrTable,
+ IInputStreamFactory &inFactory, IPerfTimer &inPerfTimer)
+{
+ return *QT3DS_NEW(inRenderContext.GetAllocator(), SBufferManager)(inRenderContext, inStrTable,
+ inFactory, inPerfTimer);
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h
new file mode 100644
index 0000000..070ab67
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderBufferManager.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_BUFFER_MANAGER_H
+#define QT3DS_RENDER_BUFFER_MANAGER_H
+#include "Qt3DSRender.h"
+#include "EASTL/utility.h" //pair
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderImageTextureData.h"
+#include "foundation/Qt3DSBounds3.h"
+
+namespace qt3dsimp {
+ struct Mesh;
+}
+
+namespace qt3ds {
+namespace render {
+
+ class IBufferManager : public NVRefCounted
+ {
+ protected:
+ virtual ~IBufferManager() {}
+
+ public:
+ // Path manipulation used to get the final path form a base path plus relative extension
+ virtual CRegisteredString CombineBaseAndRelative(const char8_t *inBase,
+ const char8_t *inRelative) = 0;
+ virtual void SetImageHasTransparency(CRegisteredString inSourcePath,
+ bool inHasTransparency) = 0;
+ virtual bool GetImageHasTransparency(CRegisteredString inSourcePath) const = 0;
+ virtual void SetImageTransparencyToFalseIfNotSet(CRegisteredString inSourcePath) = 0;
+ virtual void SetInvertImageUVCoords(CRegisteredString inSourcePath,
+ bool inShouldInvertCoords) = 0;
+
+ // Returns true if this image has been loaded into memory
+ // This call is threadsafe. Nothing else on this object is guaranteed to be.
+ virtual bool IsImageLoaded(CRegisteredString inSourcePath) = 0;
+
+ // Alias one image path with another image path. Optionally this object will ignore the
+ // call if
+ // the source path is already loaded. Aliasing is currently used to allow a default image
+ // to be shown
+ // in place of an image that is loading offline.
+ // Returns true if the image was aliased, false otherwise.
+ virtual bool AliasImagePath(CRegisteredString inSourcePath, CRegisteredString inAliasPath,
+ bool inIgnoreIfLoaded) = 0;
+ virtual void UnaliasImagePath(CRegisteredString inSourcePath) = 0;
+
+ // Returns the given source path unless the source path is aliased; in which case returns
+ // the aliased path.
+ virtual CRegisteredString GetImagePath(CRegisteredString inSourcePath) = 0;
+ // Returns a texture and a boolean indicating if this texture has transparency in it or not.
+ // Can't name this LoadImage because that gets mangled by windows to LoadImageA (uggh)
+ // In some cases we need to only scan particular images for transparency.
+ virtual SImageTextureData LoadRenderImage(CRegisteredString inImagePath,
+ SLoadedTexture &inTexture,
+ bool inForceScanForTransparency = false,
+ bool inBsdfMipmaps = false) = 0;
+ virtual SImageTextureData LoadRenderImage(CRegisteredString inSourcePath,
+ bool inForceScanForTransparency = false,
+ bool inBsdfMipmaps = false) = 0;
+
+ virtual ReloadableTexturePtr CreateReloadableImage(CRegisteredString inSourcePath,
+ bool inForceScanForTransparency = false,
+ bool inBsdfMipmaps = false) = 0;
+ virtual void enableReloadableResources(bool enable) = 0;
+ virtual bool isReloadableResourcesEnabled() const = 0;
+
+ virtual void loadSet(const QSet<QString> &imageSet) = 0;
+ virtual void unloadSet(const QSet<QString> &imageSet) = 0;
+
+ virtual void loadCustomMesh(const QString &name, qt3dsimp::Mesh *mesh) = 0;
+ virtual SRenderMesh *LoadMesh(CRegisteredString inSourcePath) = 0;
+
+ virtual SRenderMesh *CreateMesh(const char *inSourcePath, QT3DSU8 *inVertData,
+ QT3DSU32 inNumVerts, QT3DSU32 inVertStride, QT3DSU32 *inIndexData,
+ QT3DSU32 inIndexCount, qt3ds::NVBounds3 inBounds) = 0;
+
+ // Remove *all* buffers from the buffer manager;
+ virtual void Clear() = 0;
+ virtual void InvalidateBuffer(CRegisteredString inSourcePath) = 0;
+ virtual IStringTable &GetStringTable() = 0;
+
+ static IBufferManager &Create(NVRenderContext &inRenderContext, IStringTable &inStrTable,
+ IInputStreamFactory &inInputStreamFactory,
+ IPerfTimer &inTimer);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.cpp
new file mode 100644
index 0000000..72495cd
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.cpp
@@ -0,0 +1,538 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderImageBatchLoader.h"
+#include "foundation/Qt3DSMutex.h"
+#include "foundation/Qt3DSSync.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSRenderBufferManager.h"
+#include "Qt3DSRenderThreadPool.h"
+#include "Qt3DSRenderImageScaler.h"
+#include "Qt3DSRenderLoadedTexture.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSPool.h"
+#include "foundation/Qt3DSPerfTimer.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct SImageLoaderBatch;
+typedef Mutex::ScopedLock TScopedLock;
+
+struct SLoadingImage
+{
+ SImageLoaderBatch *m_Batch;
+ CRegisteredString m_SourcePath;
+ QT3DSU64 m_TaskId;
+ SLoadingImage *m_Tail;
+
+ // Called from main thread
+ SLoadingImage(CRegisteredString inSourcePath)
+ : m_Batch(NULL)
+ , m_SourcePath(inSourcePath)
+ , m_TaskId(0)
+ , m_Tail(NULL)
+ {
+ }
+ SLoadingImage()
+ : m_Batch(NULL)
+ , m_TaskId(0)
+ , m_Tail(NULL)
+ {
+ }
+ // Called from main thread
+ void Setup(SImageLoaderBatch &inBatch);
+
+ // Called from loader thread
+ static void LoadImage(void *inImg);
+
+ // Potentially called from loader thread
+ static void TaskCancelled(void *inImg);
+};
+
+struct SLoadingImageTailOp
+{
+ SLoadingImage *get(SLoadingImage &inImg) { return inImg.m_Tail; }
+ void set(SLoadingImage &inImg, SLoadingImage *inItem) { inImg.m_Tail = inItem; }
+};
+
+typedef InvasiveSingleLinkedList<SLoadingImage, SLoadingImageTailOp> TLoadingImageList;
+
+struct SBatchLoader;
+
+struct SImageLoaderBatch
+{
+ // All variables setup in main thread and constant from then on except
+ // loaded image count.
+ SBatchLoader &m_Loader;
+ NVScopedRefCounted<IImageLoadListener> m_LoadListener;
+ Sync m_LoadEvent;
+ Mutex m_LoadMutex;
+ TLoadingImageList m_Images;
+
+ TImageBatchId m_BatchId;
+ // Incremented in main thread
+ QT3DSU32 m_LoadedOrCanceledImageCount;
+ QT3DSU32 m_FinalizedImageCount;
+ QT3DSU32 m_NumImages;
+ NVRenderContextType m_contextType;
+ bool m_preferKTX;
+ bool m_ibl;
+
+ // Called from main thread
+ static SImageLoaderBatch *CreateLoaderBatch(SBatchLoader &inLoader, TImageBatchId inBatchId,
+ NVConstDataRef<CRegisteredString> inSourcePaths,
+ CRegisteredString inImageTillLoaded,
+ IImageLoadListener *inListener,
+ NVRenderContextType contextType,
+ bool preferKTX, bool ibl);
+
+ // Called from main thread
+ SImageLoaderBatch(SBatchLoader &inLoader, IImageLoadListener *inLoadListener,
+ const TLoadingImageList &inImageList, TImageBatchId inBatchId,
+ QT3DSU32 inImageCount, NVRenderContextType contextType,
+ bool preferKTX, bool ibl);
+
+ // Called from main thread
+ ~SImageLoaderBatch();
+
+ // Called from main thread
+ bool IsLoadingFinished()
+ {
+ Mutex::ScopedLock __locker(m_LoadMutex);
+ return m_LoadedOrCanceledImageCount >= m_NumImages;
+ }
+
+ bool IsFinalizedFinished()
+ {
+ Mutex::ScopedLock __locker(m_LoadMutex);
+ return m_FinalizedImageCount >= m_NumImages;
+ }
+
+ void IncrementLoadedImageCount()
+ {
+ Mutex::ScopedLock __locker(m_LoadMutex);
+ ++m_LoadedOrCanceledImageCount;
+ }
+ void IncrementFinalizedImageCount()
+ {
+ Mutex::ScopedLock __locker(m_LoadMutex);
+ ++m_FinalizedImageCount;
+ }
+ // Called from main thread
+ void Cancel();
+ void Cancel(CRegisteredString inSourcePath);
+};
+
+struct SBatchLoadedImage
+{
+ CRegisteredString m_SourcePath;
+ SLoadedTexture *m_Texture;
+ SImageLoaderBatch *m_Batch;
+ SBatchLoadedImage()
+ : m_Texture(NULL)
+ , m_Batch(NULL)
+ {
+ }
+
+ // Called from loading thread
+ SBatchLoadedImage(CRegisteredString inSourcePath, SLoadedTexture *inTexture,
+ SImageLoaderBatch &inBatch)
+ : m_SourcePath(inSourcePath)
+ , m_Texture(inTexture)
+ , m_Batch(&inBatch)
+ {
+ }
+
+ // Called from main thread
+ bool Finalize(IBufferManager &inMgr);
+};
+
+struct SBatchLoader : public IImageBatchLoader
+{
+ typedef nvhash_map<TImageBatchId, SImageLoaderBatch *> TImageLoaderBatchMap;
+ typedef nvhash_map<CRegisteredString, TImageBatchId> TSourcePathToBatchMap;
+ typedef Pool<SLoadingImage, ForwardingAllocator> TLoadingImagePool;
+ typedef Pool<SImageLoaderBatch, ForwardingAllocator> TBatchPool;
+
+ // Accessed from loader thread
+ NVFoundationBase &m_Foundation;
+ volatile QT3DSI32 mRefCount;
+ // Accessed from loader thread
+ IInputStreamFactory &m_InputStreamFactory;
+ //!!Not threadsafe! accessed only from main thread
+ IBufferManager &m_BufferManager;
+ // Accessed from main thread
+ IThreadPool &m_ThreadPool;
+ // Accessed from both threads
+ IPerfTimer &m_PerfTimer;
+ // main thread
+ TImageBatchId m_NextBatchId;
+ // main thread
+ TImageLoaderBatchMap m_Batches;
+ // main thread
+ Mutex m_LoaderMutex;
+
+ // Both loader and main threads
+ nvvector<SBatchLoadedImage> m_LoadedImages;
+ // main thread
+ nvvector<TImageBatchId> m_FinishedBatches;
+ // main thread
+ TSourcePathToBatchMap m_SourcePathToBatches;
+ // main thread
+ nvvector<SLoadingImage> m_LoaderBuilderWorkspace;
+ TLoadingImagePool m_LoadingImagePool;
+ TBatchPool m_BatchPool;
+
+ SBatchLoader(NVFoundationBase &inFoundation, IInputStreamFactory &inFactory,
+ IBufferManager &inBufferManager, IThreadPool &inThreadPool, IPerfTimer &inTimer)
+ : m_Foundation(inFoundation)
+ , mRefCount(0)
+ , m_InputStreamFactory(inFactory)
+ , m_BufferManager(inBufferManager)
+ , m_ThreadPool(inThreadPool)
+ , m_PerfTimer(inTimer)
+ , m_NextBatchId(1)
+ , m_Batches(inFoundation.getAllocator(), "SBatchLoader::m_Batches")
+ , m_LoaderMutex(inFoundation.getAllocator())
+ , m_LoadedImages(inFoundation.getAllocator(), "SBatchLoader::m_LoadedImages")
+ , m_FinishedBatches(inFoundation.getAllocator(), "SBatchLoader::m_FinishedBatches")
+ , m_SourcePathToBatches(inFoundation.getAllocator(), "SBatchLoader::m_SourcePathToBatches")
+ , m_LoaderBuilderWorkspace(inFoundation.getAllocator(),
+ "SBatchLoader::m_LoaderBuilderWorkspace")
+ , m_LoadingImagePool(
+ ForwardingAllocator(inFoundation.getAllocator(), "SBatchLoader::m_LoadingImagePool"))
+ , m_BatchPool(ForwardingAllocator(inFoundation.getAllocator(), "SBatchLoader::m_BatchPool"))
+ {
+ }
+
+ virtual ~SBatchLoader()
+ {
+ nvvector<TImageBatchId> theCancelledBatches(m_Foundation.getAllocator(), "~SBatchLoader");
+ for (TImageLoaderBatchMap::iterator theIter = m_Batches.begin(), theEnd = m_Batches.end();
+ theIter != theEnd; ++theIter) {
+ theIter->second->Cancel();
+ theCancelledBatches.push_back(theIter->second->m_BatchId);
+ }
+ for (QT3DSU32 idx = 0, end = theCancelledBatches.size(); idx < end; ++idx)
+ BlockUntilLoaded(theCancelledBatches[idx]);
+
+ QT3DS_ASSERT(m_Batches.size() == 0);
+ }
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
+
+ // Returns an ID to the load request. Request a block of images to be loaded.
+ // Also takes an image that the buffer system will return when requested for the given source
+ // paths
+ // until said path is loaded.
+ // An optional listener can be passed in to get callbacks about the batch.
+ TImageBatchId LoadImageBatch(NVConstDataRef<CRegisteredString> inSourcePaths,
+ CRegisteredString inImageTillLoaded,
+ IImageLoadListener *inListener,
+ NVRenderContextType contextType,
+ bool preferKTX, bool iblImages) override
+ {
+ if (inSourcePaths.size() == 0)
+ return 0;
+
+ TScopedLock __loaderLock(m_LoaderMutex);
+
+ TImageBatchId theBatchId = 0;
+
+ // Empty loop intentional to find an unused batch id.
+ for (theBatchId = m_NextBatchId; m_Batches.find(theBatchId) != m_Batches.end();
+ ++m_NextBatchId, theBatchId = m_NextBatchId) {
+ }
+
+ SImageLoaderBatch *theBatch(SImageLoaderBatch::CreateLoaderBatch(
+ *this, theBatchId, inSourcePaths, inImageTillLoaded, inListener, contextType,
+ preferKTX, iblImages));
+ if (theBatch) {
+ m_Batches.insert(eastl::make_pair(theBatchId, theBatch));
+ return theBatchId;
+ }
+ return 0;
+ }
+
+ void CancelImageBatchLoading(TImageBatchId inBatchId) override
+ {
+ SImageLoaderBatch *theBatch(GetBatch(inBatchId));
+ if (theBatch)
+ theBatch->Cancel();
+ }
+
+ // Blocks if the image is currently in-flight
+ void CancelImageLoading(CRegisteredString inSourcePath) override
+ {
+ TScopedLock __loaderLock(m_LoaderMutex);
+ TSourcePathToBatchMap::iterator theIter = m_SourcePathToBatches.find(inSourcePath);
+ if (theIter != m_SourcePathToBatches.end()) {
+ TImageBatchId theBatchId = theIter->second;
+ TImageLoaderBatchMap::iterator theBatchIter = m_Batches.find(theBatchId);
+ if (theBatchIter != m_Batches.end())
+ theBatchIter->second->Cancel(inSourcePath);
+ }
+ }
+
+ SImageLoaderBatch *GetBatch(TImageBatchId inId)
+ {
+ TScopedLock __loaderLock(m_LoaderMutex);
+ TImageLoaderBatchMap::iterator theIter = m_Batches.find(inId);
+ if (theIter != m_Batches.end())
+ return theIter->second;
+ return NULL;
+ }
+
+ void BlockUntilLoaded(TImageBatchId inId) override
+ {
+ for (SImageLoaderBatch *theBatch = GetBatch(inId); theBatch; theBatch = GetBatch(inId)) {
+ // Only need to block if images aren't loaded. Don't need to block if they aren't
+ // finalized.
+ if (!theBatch->IsLoadingFinished()) {
+ theBatch->m_LoadEvent.wait(200);
+ theBatch->m_LoadEvent.reset();
+ }
+ BeginFrame(true);
+ }
+ }
+ void ImageLoaded(SLoadingImage &inImage, SLoadedTexture *inTexture)
+ {
+ TScopedLock __loaderLock(m_LoaderMutex);
+ m_LoadedImages.push_back(
+ SBatchLoadedImage(inImage.m_SourcePath, inTexture, *inImage.m_Batch));
+ inImage.m_Batch->IncrementLoadedImageCount();
+ inImage.m_Batch->m_LoadEvent.set();
+ }
+ // These are called by the render context, users don't need to call this.
+ void BeginFrame(bool firstFrame) override
+ {
+ TScopedLock __loaderLock(m_LoaderMutex);
+ // Pass 1 - send out all image loaded signals
+ for (QT3DSU32 idx = 0, end = m_LoadedImages.size(); idx < end; ++idx) {
+
+ m_SourcePathToBatches.erase(m_LoadedImages[idx].m_SourcePath);
+ m_LoadedImages[idx].Finalize(m_BufferManager);
+ m_LoadedImages[idx].m_Batch->IncrementFinalizedImageCount();
+ if (m_LoadedImages[idx].m_Batch->IsFinalizedFinished())
+ m_FinishedBatches.push_back(m_LoadedImages[idx].m_Batch->m_BatchId);
+ if (!firstFrame)
+ break;
+ }
+ if (firstFrame)
+ m_LoadedImages.clear();
+ else if (m_LoadedImages.size())
+ m_LoadedImages.erase(m_LoadedImages.begin());
+ // pass 2 - clean up any existing batches.
+ for (QT3DSU32 idx = 0, end = m_FinishedBatches.size(); idx < end; ++idx) {
+ TImageLoaderBatchMap::iterator theIter = m_Batches.find(m_FinishedBatches[idx]);
+ if (theIter != m_Batches.end()) {
+ SImageLoaderBatch *theBatch = theIter->second;
+ if (theBatch->m_LoadListener)
+ theBatch->m_LoadListener->OnImageBatchComplete(theBatch->m_BatchId);
+ m_Batches.erase(m_FinishedBatches[idx]);
+ theBatch->~SImageLoaderBatch();
+ m_BatchPool.deallocate(theBatch);
+ }
+ }
+ m_FinishedBatches.clear();
+ }
+
+ void EndFrame() override {}
+};
+
+void SLoadingImage::Setup(SImageLoaderBatch &inBatch)
+{
+ m_Batch = &inBatch;
+ m_TaskId = inBatch.m_Loader.m_ThreadPool.AddTask(this, LoadImage, TaskCancelled);
+}
+
+void SLoadingImage::LoadImage(void *inImg)
+{
+ SLoadingImage *theThis = reinterpret_cast<SLoadingImage *>(inImg);
+ SStackPerfTimer theTimer(theThis->m_Batch->m_Loader.m_PerfTimer, "Image Decompression");
+ if (theThis->m_Batch->m_Loader.m_BufferManager.IsImageLoaded(theThis->m_SourcePath) == false) {
+ SLoadedTexture *theTexture = SLoadedTexture::Load(
+ theThis->m_SourcePath.c_str(), theThis->m_Batch->m_Loader.m_Foundation,
+ theThis->m_Batch->m_Loader.m_InputStreamFactory, true,
+ theThis->m_Batch->m_contextType,
+ theThis->m_Batch->m_preferKTX);
+ // if ( theTexture )
+ // theTexture->EnsureMultiplerOfFour( theThis->m_Batch->m_Loader.m_Foundation,
+ //theThis->m_SourcePath.c_str() );
+
+ theThis->m_Batch->m_Loader.ImageLoaded(*theThis, theTexture);
+ } else {
+ theThis->m_Batch->m_Loader.ImageLoaded(*theThis, NULL);
+ }
+}
+
+void SLoadingImage::TaskCancelled(void *inImg)
+{
+ SLoadingImage *theThis = reinterpret_cast<SLoadingImage *>(inImg);
+ theThis->m_Batch->m_Loader.ImageLoaded(*theThis, NULL);
+}
+
+bool SBatchLoadedImage::Finalize(IBufferManager &inMgr)
+{
+ if (m_Texture) {
+ eastl::string thepath(m_SourcePath);
+ bool isIBL = this->m_Batch->m_ibl;
+ inMgr.LoadRenderImage(m_SourcePath, *m_Texture, false, isIBL);
+ inMgr.UnaliasImagePath(m_SourcePath);
+ }
+ if (m_Batch->m_LoadListener)
+ m_Batch->m_LoadListener->OnImageLoadComplete(
+ m_SourcePath, m_Texture ? ImageLoadResult::Succeeded : ImageLoadResult::Failed);
+
+ if (m_Texture) {
+ m_Texture->release();
+ return true;
+ }
+
+ return false;
+}
+
+SImageLoaderBatch *
+SImageLoaderBatch::CreateLoaderBatch(SBatchLoader &inLoader, TImageBatchId inBatchId,
+ NVConstDataRef<CRegisteredString> inSourcePaths,
+ CRegisteredString inImageTillLoaded,
+ IImageLoadListener *inListener,
+ NVRenderContextType contextType,
+ bool preferKTX, bool iblImages)
+{
+ TLoadingImageList theImages;
+ QT3DSU32 theLoadingImageCount = 0;
+ for (QT3DSU32 idx = 0, end = inSourcePaths.size(); idx < end; ++idx) {
+ CRegisteredString theSourcePath(inSourcePaths[idx]);
+
+ if (theSourcePath.IsValid() == false)
+ continue;
+
+ if (inLoader.m_BufferManager.IsImageLoaded(theSourcePath))
+ continue;
+
+ eastl::pair<SBatchLoader::TSourcePathToBatchMap::iterator, bool> theInserter =
+ inLoader.m_SourcePathToBatches.insert(eastl::make_pair(inSourcePaths[idx], inBatchId));
+
+ // If the loader has already seen this image.
+ if (theInserter.second == false)
+ continue;
+
+ if (inImageTillLoaded.IsValid()) {
+ // Alias the image so any further requests for this source path will result in
+ // the default images (image till loaded).
+ bool aliasSuccess =
+ inLoader.m_BufferManager.AliasImagePath(theSourcePath, inImageTillLoaded, true);
+ (void)aliasSuccess;
+ QT3DS_ASSERT(aliasSuccess);
+ }
+
+ theImages.push_front(
+ *inLoader.m_LoadingImagePool.construct(theSourcePath, __FILE__, __LINE__));
+ ++theLoadingImageCount;
+ }
+ if (theImages.empty() == false) {
+ SImageLoaderBatch *theBatch =
+ (SImageLoaderBatch *)inLoader.m_BatchPool.allocate(__FILE__, __LINE__);
+ new (theBatch)
+ SImageLoaderBatch(inLoader, inListener, theImages, inBatchId, theLoadingImageCount,
+ contextType, preferKTX, iblImages);
+ return theBatch;
+ }
+ return NULL;
+}
+
+SImageLoaderBatch::SImageLoaderBatch(SBatchLoader &inLoader, IImageLoadListener *inLoadListener,
+ const TLoadingImageList &inImageList, TImageBatchId inBatchId,
+ QT3DSU32 inImageCount, NVRenderContextType contextType,
+ bool preferKTX, bool ibl)
+ : m_Loader(inLoader)
+ , m_LoadListener(inLoadListener)
+ , m_LoadEvent(inLoader.m_Foundation.getAllocator())
+ , m_LoadMutex(inLoader.m_Foundation.getAllocator())
+ , m_Images(inImageList)
+ , m_BatchId(inBatchId)
+ , m_LoadedOrCanceledImageCount(0)
+ , m_FinalizedImageCount(0)
+ , m_NumImages(inImageCount)
+ , m_contextType(contextType)
+ , m_preferKTX(preferKTX)
+ , m_ibl(ibl)
+{
+ for (TLoadingImageList::iterator iter = m_Images.begin(), end = m_Images.end(); iter != end;
+ ++iter) {
+ iter->Setup(*this);
+ }
+}
+
+SImageLoaderBatch::~SImageLoaderBatch()
+{
+ for (TLoadingImageList::iterator iter = m_Images.begin(), end = m_Images.end(); iter != end;
+ ++iter) {
+ TLoadingImageList::iterator temp(iter);
+ ++iter;
+ m_Loader.m_LoadingImagePool.deallocate(temp.m_Obj);
+ }
+}
+
+void SImageLoaderBatch::Cancel()
+{
+ for (TLoadingImageList::iterator iter = m_Images.begin(), end = m_Images.end(); iter != end;
+ ++iter)
+ m_Loader.m_ThreadPool.CancelTask(iter->m_TaskId);
+}
+
+void SImageLoaderBatch::Cancel(CRegisteredString inSourcePath)
+{
+ for (TLoadingImageList::iterator iter = m_Images.begin(), end = m_Images.end(); iter != end;
+ ++iter) {
+ if (iter->m_SourcePath == inSourcePath) {
+ m_Loader.m_ThreadPool.CancelTask(iter->m_TaskId);
+ break;
+ }
+ }
+}
+}
+
+IImageBatchLoader &IImageBatchLoader::CreateBatchLoader(NVFoundationBase &inFoundation,
+ IInputStreamFactory &inFactory,
+ IBufferManager &inBufferManager,
+ IThreadPool &inThreadPool,
+ IPerfTimer &inTimer)
+{
+ return *QT3DS_NEW(inFoundation.getAllocator(),
+ SBatchLoader)(inFoundation, inFactory, inBufferManager, inThreadPool, inTimer);
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.h b/src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.h
new file mode 100644
index 0000000..2805940
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderImageBatchLoader.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_THREADED_IMAGE_LOADER_H
+#define QT3DS_RENDER_THREADED_IMAGE_LOADER_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+ struct ImageLoadResult
+ {
+ enum Enum {
+ Succeeded,
+ Failed,
+ };
+ };
+
+ class IImageLoadListener : public NVRefCounted
+ {
+ protected:
+ virtual ~IImageLoadListener() {}
+
+ public:
+ virtual void OnImageLoadComplete(CRegisteredString inPath,
+ ImageLoadResult::Enum inResult) = 0;
+ virtual void OnImageBatchComplete(QT3DSU64 inBatch) = 0;
+ };
+
+ typedef QT3DSU32 TImageBatchId;
+
+ class IImageBatchLoader : public NVRefCounted
+ {
+ protected:
+ virtual ~IImageBatchLoader() {}
+
+ public:
+ // Returns an ID to the load request. Request a block of images to be loaded.
+ // Also takes an image that the buffer system will return when requested for the given
+ // source paths
+ // until said path is loaded.
+ // An optional listener can be passed in to get callbacks about the batch.
+ virtual TImageBatchId LoadImageBatch(NVConstDataRef<CRegisteredString> inSourcePaths,
+ CRegisteredString inImageTillLoaded,
+ IImageLoadListener *inListener,
+ NVRenderContextType type,
+ bool preferKTX, bool iblImages) = 0;
+ // Blocks if any of the images in the batch are in flight
+ virtual void CancelImageBatchLoading(TImageBatchId inBatchId) = 0;
+ // Blocks if the image is currently in-flight
+ virtual void CancelImageLoading(CRegisteredString inSourcePath) = 0;
+ // Block until every image in the batch is loaded.
+ virtual void BlockUntilLoaded(TImageBatchId inId) = 0;
+
+ // These are called by the render context, users don't need to call this.
+ virtual void BeginFrame(bool firstFrame) = 0;
+ virtual void EndFrame() = 0;
+
+ static IImageBatchLoader &CreateBatchLoader(NVFoundationBase &inFoundation,
+ IInputStreamFactory &inFactory,
+ IBufferManager &inBufferManager,
+ IThreadPool &inThreadPool, IPerfTimer &inTimer);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp
new file mode 100644
index 0000000..1176273
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.cpp
@@ -0,0 +1,715 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderLoadedTexture.h"
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSDMWindowsCompatibility.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSRenderImageScaler.h"
+#include "Qt3DSTextRenderer.h"
+#include <QImage>
+
+using namespace qt3ds::render;
+
+SLoadedTexture *SLoadedTexture::LoadQImage(const QString &inPath, QT3DSI32 flipVertical,
+ NVFoundationBase &fnd,
+ NVRenderContextType renderContextType)
+{
+ Q_UNUSED(flipVertical)
+ Q_UNUSED(renderContextType)
+ SLoadedTexture *retval(NULL);
+ NVAllocatorCallback &alloc(fnd.getAllocator());
+ QImage image(inPath);
+ const QImage::Format format = image.format();
+ switch (format) {
+ case QImage::Format_RGBA64:
+ image = image.convertToFormat(QImage::Format_RGBA8888);
+ break;
+ case QImage::Format_RGBX64:
+ image = image.convertToFormat(QImage::Format_RGBX8888);
+ break;
+ default:
+ break;
+ }
+ image = image.mirrored();
+ image = image.rgbSwapped();
+ retval = QT3DS_NEW(alloc, SLoadedTexture)(alloc);
+ retval->width = image.width();
+ retval->height = image.height();
+ retval->components = image.pixelFormat().channelCount();
+ retval->image = image;
+ retval->data = (void*)retval->image.bits();
+ retval->dataSizeInBytes = image.byteCount();
+ retval->setFormatFromComponents();
+ return retval;
+}
+
+
+namespace {
+
+/**
+ !!Large section of code ripped from FreeImage!!
+
+*/
+// ----------------------------------------------------------
+// Structures used by DXT textures
+// ----------------------------------------------------------
+typedef QT3DSU8 BYTE;
+typedef QT3DSU16 WORD;
+
+typedef struct tagColor8888
+{
+ BYTE b;
+ BYTE g;
+ BYTE r;
+ BYTE a;
+} Color8888;
+
+typedef struct tagColor565
+{
+ WORD b : 5;
+ WORD g : 6;
+ WORD r : 5;
+} Color565;
+
+typedef struct tagDXTColBlock
+{
+ Color565 colors[2];
+ BYTE row[4];
+} DXTColBlock;
+
+typedef struct tagDXTAlphaBlockExplicit
+{
+ WORD row[4];
+} DXTAlphaBlockExplicit;
+
+typedef struct tagDXTAlphaBlock3BitLinear
+{
+ BYTE alpha[2];
+ BYTE data[6];
+} DXTAlphaBlock3BitLinear;
+
+typedef struct tagDXT1Block
+{
+ DXTColBlock color;
+} DXT1Block;
+
+typedef struct tagDXT3Block
+{ // also used by dxt2
+ DXTAlphaBlockExplicit alpha;
+ DXTColBlock color;
+} DXT3Block;
+
+typedef struct tagDXT5Block
+{ // also used by dxt4
+ DXTAlphaBlock3BitLinear alpha;
+ DXTColBlock color;
+} DXT5Block;
+
+static void GetBlockColors(const DXTColBlock &block, Color8888 colors[4], bool isDXT1)
+{
+ int i;
+ for (i = 0; i < 2; i++) {
+ colors[i].a = 0xff;
+ colors[i].r = (BYTE)(block.colors[i].r * 0xff / 0x1f);
+ colors[i].g = (BYTE)(block.colors[i].g * 0xff / 0x3f);
+ colors[i].b = (BYTE)(block.colors[i].b * 0xff / 0x1f);
+ }
+
+ WORD *wCol = (WORD *)block.colors;
+ if (wCol[0] > wCol[1] || !isDXT1) {
+ // 4 color block
+ for (i = 0; i < 2; i++) {
+ colors[i + 2].a = 0xff;
+ colors[i + 2].r =
+ (BYTE)((WORD(colors[0].r) * (2 - i) + WORD(colors[1].r) * (1 + i)) / 3);
+ colors[i + 2].g =
+ (BYTE)((WORD(colors[0].g) * (2 - i) + WORD(colors[1].g) * (1 + i)) / 3);
+ colors[i + 2].b =
+ (BYTE)((WORD(colors[0].b) * (2 - i) + WORD(colors[1].b) * (1 + i)) / 3);
+ }
+ } else {
+ // 3 color block, number 4 is transparent
+ colors[2].a = 0xff;
+ colors[2].r = (BYTE)((WORD(colors[0].r) + WORD(colors[1].r)) / 2);
+ colors[2].g = (BYTE)((WORD(colors[0].g) + WORD(colors[1].g)) / 2);
+ colors[2].b = (BYTE)((WORD(colors[0].b) + WORD(colors[1].b)) / 2);
+
+ colors[3].a = 0x00;
+ colors[3].g = 0x00;
+ colors[3].b = 0x00;
+ colors[3].r = 0x00;
+ }
+}
+
+struct DXT_INFO_1
+{
+ typedef DXT1Block Block;
+ enum { isDXT1 = 1, bytesPerBlock = 8 };
+};
+
+struct DXT_INFO_3
+{
+ typedef DXT3Block Block;
+ enum { isDXT1 = 1, bytesPerBlock = 16 };
+};
+
+struct DXT_INFO_5
+{
+ typedef DXT5Block Block;
+ enum { isDXT1 = 1, bytesPerBlock = 16 };
+};
+
+template <class INFO>
+class DXT_BLOCKDECODER_BASE
+{
+protected:
+ Color8888 m_colors[4];
+ const typename INFO::Block *m_pBlock;
+ unsigned m_colorRow;
+
+public:
+ void Setup(const BYTE *pBlock)
+ {
+ m_pBlock = (const typename INFO::Block *)pBlock;
+ GetBlockColors(m_pBlock->color, m_colors, INFO::isDXT1);
+ }
+
+ void SetY(int y) { m_colorRow = m_pBlock->color.row[y]; }
+
+ void GetColor(int x, int y, Color8888 &color)
+ {
+ Q_UNUSED(y)
+ unsigned bits = (m_colorRow >> (x * 2)) & 3;
+ color = m_colors[bits];
+ std::swap(color.r, color.b);
+ }
+};
+
+class DXT_BLOCKDECODER_1 : public DXT_BLOCKDECODER_BASE<DXT_INFO_1>
+{
+public:
+ typedef DXT_INFO_1 INFO;
+};
+
+class DXT_BLOCKDECODER_3 : public DXT_BLOCKDECODER_BASE<DXT_INFO_3>
+{
+public:
+ typedef DXT_BLOCKDECODER_BASE<DXT_INFO_3> base;
+ typedef DXT_INFO_3 INFO;
+
+protected:
+ unsigned m_alphaRow;
+
+public:
+ void SetY(int y)
+ {
+ base::SetY(y);
+ m_alphaRow = m_pBlock->alpha.row[y];
+ }
+
+ void GetColor(int x, int y, Color8888 &color)
+ {
+ base::GetColor(x, y, color);
+ const unsigned bits = (m_alphaRow >> (x * 4)) & 0xF;
+ color.a = (BYTE)((bits * 0xFF) / 0xF);
+ }
+};
+
+class DXT_BLOCKDECODER_5 : public DXT_BLOCKDECODER_BASE<DXT_INFO_5>
+{
+public:
+ typedef DXT_BLOCKDECODER_BASE<DXT_INFO_5> base;
+ typedef DXT_INFO_5 INFO;
+
+protected:
+ unsigned m_alphas[8];
+ unsigned m_alphaBits;
+ int m_offset;
+
+public:
+ void Setup(const BYTE *pBlock)
+ {
+ base::Setup(pBlock);
+
+ const DXTAlphaBlock3BitLinear &block = m_pBlock->alpha;
+ m_alphas[0] = block.alpha[0];
+ m_alphas[1] = block.alpha[1];
+ if (m_alphas[0] > m_alphas[1]) {
+ // 8 alpha block
+ for (int i = 0; i < 6; i++) {
+ m_alphas[i + 2] = ((6 - i) * m_alphas[0] + (1 + i) * m_alphas[1] + 3) / 7;
+ }
+ } else {
+ // 6 alpha block
+ for (int i = 0; i < 4; i++) {
+ m_alphas[i + 2] = ((4 - i) * m_alphas[0] + (1 + i) * m_alphas[1] + 2) / 5;
+ }
+ m_alphas[6] = 0;
+ m_alphas[7] = 0xFF;
+ }
+ }
+
+ void SetY(int y)
+ {
+ base::SetY(y);
+ int i = y / 2;
+ const DXTAlphaBlock3BitLinear &block = m_pBlock->alpha;
+ m_alphaBits = unsigned(block.data[0 + i * 3]) | (unsigned(block.data[1 + i * 3]) << 8)
+ | (unsigned(block.data[2 + i * 3]) << 16);
+ m_offset = (y & 1) * 12;
+ }
+
+ void GetColor(int x, int y, Color8888 &color)
+ {
+ base::GetColor(x, y, color);
+ unsigned bits = (m_alphaBits >> (x * 3 + m_offset)) & 7;
+ color.a = (BYTE)m_alphas[bits];
+ std::swap(color.r, color.b);
+ }
+};
+
+template <class DECODER>
+void DecodeDXTBlock(BYTE *dstData, const BYTE *srcBlock, long dstPitch, int bw, int bh)
+{
+ DECODER decoder;
+ decoder.Setup(srcBlock);
+ for (int y = 0; y < bh; y++) {
+ // Note that this assumes the pointer is pointing to the *last* valid start
+ // row.
+ BYTE *dst = dstData - y * dstPitch;
+ decoder.SetY(y);
+ for (int x = 0; x < bw; x++) {
+ decoder.GetColor(x, y, (Color8888 &)*dst);
+ dst += 4;
+ }
+ }
+}
+
+struct STextureDataWriter
+{
+ QT3DSU32 m_Width;
+ QT3DSU32 m_Height;
+ QT3DSU32 m_Stride;
+ QT3DSU32 m_NumComponents;
+ STextureData &m_TextureData;
+ STextureDataWriter(QT3DSU32 w, QT3DSU32 h, bool hasA, STextureData &inTd, NVAllocatorCallback &alloc)
+ : m_Width(w)
+ , m_Height(h)
+ , m_Stride(hasA ? m_Width * 4 : m_Width * 3)
+ , m_NumComponents(hasA ? 4 : 3)
+ , m_TextureData(inTd)
+ {
+ QT3DSU32 dataSize = m_Stride * m_Height;
+ if (dataSize > m_TextureData.dataSizeInBytes) {
+ alloc.deallocate(m_TextureData.data);
+ m_TextureData.data =
+ alloc.allocate(dataSize, "SLoadedTexture::DecompressDXTImage", __FILE__, __LINE__);
+ m_TextureData.dataSizeInBytes = dataSize;
+ }
+ memZero(m_TextureData.data, m_TextureData.dataSizeInBytes);
+ m_TextureData.format = hasA ? NVRenderTextureFormats::RGBA8 : NVRenderTextureFormats::RGB8;
+ }
+
+ void WritePixel(QT3DSU32 X, QT3DSU32 Y, QT3DSU8 *pixelData)
+ {
+ if (X < m_Width && Y < m_Height) {
+ char *textureData = reinterpret_cast<char *>(m_TextureData.data);
+ QT3DSU32 offset = Y * m_Stride + X * m_NumComponents;
+
+ for (QT3DSU32 idx = 0; idx < m_NumComponents; ++idx)
+ QT3DS_ASSERT(textureData[offset + idx] == 0);
+
+ memCopy(textureData + offset, pixelData, m_NumComponents);
+ }
+ }
+
+ // Incoming pixels are assumed to be RGBA or RGBX, 32 bit in any case
+ void WriteBlock(QT3DSU32 X, QT3DSU32 Y, QT3DSU32 width, QT3DSU32 height, QT3DSU8 *pixelData)
+ {
+ QT3DSU32 offset = 0;
+ for (QT3DSU32 yidx = 0; yidx < height; ++yidx) {
+ for (QT3DSU32 xidx = 0; xidx < width; ++xidx, offset += 4) {
+ WritePixel(X + xidx, Y + (height - yidx - 1), pixelData + offset);
+ }
+ }
+ }
+ bool Finished() { return false; }
+};
+
+struct STextureAlphaScanner
+{
+ bool &m_Alpha;
+
+ STextureAlphaScanner(bool &inAlpha)
+ : m_Alpha(inAlpha)
+ {
+ }
+
+ void WriteBlock(QT3DSU32 X, QT3DSU32 Y, QT3DSU32 width, QT3DSU32 height, QT3DSU8 *pixelData)
+ {
+ Q_UNUSED(X)
+ Q_UNUSED(Y)
+ QT3DSU32 offset = 0;
+ for (QT3DSU32 yidx = 0; yidx < height; ++yidx) {
+ for (QT3DSU32 xidx = 0; xidx < width; ++xidx, offset += 4) {
+ if (pixelData[offset + 3] < 255)
+ m_Alpha = true;
+ }
+ }
+ }
+
+ // If we detect alpha we can stop right there.
+ bool Finished() { return m_Alpha; }
+};
+// Scan the dds image's mipmap 0 level for alpha.
+template <class DECODER, class TWriterType>
+static void DecompressDDS(void *inSrc, QT3DSU32 inDataSize, QT3DSU32 inWidth, QT3DSU32 inHeight,
+ TWriterType ioWriter)
+{
+ typedef typename DECODER::INFO INFO;
+ typedef typename INFO::Block Block;
+ (void)inDataSize;
+
+ const QT3DSU8 *pbSrc = (const QT3DSU8 *)inSrc;
+ // Each DX block is composed of 16 pixels. Free image decodes those
+ // pixels into a 4x4 block of data.
+ QT3DSU8 pbDstData[4 * 4 * 4];
+ // The decoder decodes backwards
+ // So we need to point to the last line.
+ QT3DSU8 *pbDst = pbDstData + 48;
+
+ int width = (int)inWidth;
+ int height = (int)inHeight;
+ int lineStride = 16;
+ for (int y = 0; y < height && ioWriter.Finished() == false; y += 4) {
+ int yPixels = NVMin(height - y, 4);
+ for (int x = 0; x < width && ioWriter.Finished() == false; x += 4) {
+ int xPixels = NVMin(width - x, 4);
+ DecodeDXTBlock<DECODER>(pbDst, pbSrc, lineStride, xPixels, yPixels);
+ pbSrc += INFO::bytesPerBlock;
+ ioWriter.WriteBlock(x, y, xPixels, yPixels, pbDstData);
+ }
+ }
+}
+
+bool ScanDDSForAlpha(Qt3DSDDSImage *dds)
+{
+ bool hasAlpha = false;
+ switch (dds->format) {
+ case qt3ds::render::NVRenderTextureFormats::RGBA_DXT1:
+ DecompressDDS<DXT_BLOCKDECODER_1>(dds->data[0], dds->size[0], dds->mipwidth[0],
+ dds->mipheight[0], STextureAlphaScanner(hasAlpha));
+ break;
+ case qt3ds::render::NVRenderTextureFormats::RGBA_DXT3:
+ DecompressDDS<DXT_BLOCKDECODER_3>(dds->data[0], dds->size[0], dds->mipwidth[0],
+ dds->mipheight[0], STextureAlphaScanner(hasAlpha));
+ break;
+ case qt3ds::render::NVRenderTextureFormats::RGBA_DXT5:
+ DecompressDDS<DXT_BLOCKDECODER_5>(dds->data[0], dds->size[0], dds->mipwidth[0],
+ dds->mipheight[0], STextureAlphaScanner(hasAlpha));
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ return hasAlpha;
+}
+
+bool ScanImageForAlpha(const void *inData, QT3DSU32 inWidth, QT3DSU32 inHeight, QT3DSU32 inPixelSizeInBytes,
+ QT3DSU8 inAlphaSizeInBits)
+{
+ const QT3DSU8 *rowPtr = reinterpret_cast<const QT3DSU8 *>(inData);
+ bool hasAlpha = false;
+ if (inAlphaSizeInBits == 0)
+ return hasAlpha;
+ if (inPixelSizeInBytes != 2 && inPixelSizeInBytes != 4) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ if (inAlphaSizeInBits > 8) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ QT3DSU32 alphaRightShift = inPixelSizeInBytes * 8 - inAlphaSizeInBits;
+ QT3DSU32 maxAlphaValue = (1 << inAlphaSizeInBits) - 1;
+
+ for (QT3DSU32 rowIdx = 0; rowIdx < inHeight && hasAlpha == false; ++rowIdx) {
+ for (QT3DSU32 idx = 0; idx < inWidth && hasAlpha == false;
+ ++idx, rowPtr += inPixelSizeInBytes) {
+ QT3DSU32 pixelValue = 0;
+ if (inPixelSizeInBytes == 2)
+ pixelValue = *(reinterpret_cast<const QT3DSU16 *>(rowPtr));
+ else
+ pixelValue = *(reinterpret_cast<const QT3DSU32 *>(rowPtr));
+ pixelValue = pixelValue >> alphaRightShift;
+ if (pixelValue < maxAlphaValue)
+ hasAlpha = true;
+ }
+ }
+ return hasAlpha;
+}
+}
+
+SLoadedTexture::~SLoadedTexture()
+{
+ if (dds) {
+ if (dds->dataBlock)
+ QT3DS_FREE(m_Allocator, dds->dataBlock);
+
+ QT3DS_FREE(m_Allocator, dds);
+ } else if (data && image.byteCount() <= 0) {
+ m_Allocator.deallocate(data);
+ }
+ if (m_Palette)
+ m_Allocator.deallocate(m_Palette);
+ if (m_TransparencyTable)
+ m_Allocator.deallocate(m_TransparencyTable);
+}
+
+void SLoadedTexture::release()
+{
+ NVAllocatorCallback *theAllocator(&m_Allocator);
+ this->~SLoadedTexture();
+ theAllocator->deallocate(this);
+}
+
+bool SLoadedTexture::ScanForTransparency()
+{
+ switch (format) {
+ case NVRenderTextureFormats::SRGB8A8:
+ case NVRenderTextureFormats::RGBA8:
+ if (!data) { // dds
+ return true;
+ } else {
+ return ScanImageForAlpha(data, width, height, 4, 8);
+ }
+ break;
+ // Scan the image.
+ case NVRenderTextureFormats::SRGB8:
+ case NVRenderTextureFormats::RGB8:
+ return false;
+ break;
+ case NVRenderTextureFormats::RGB565:
+ return false;
+ break;
+ case NVRenderTextureFormats::RGBA5551:
+ if (!data) { // dds
+ return true;
+ } else {
+ return ScanImageForAlpha(data, width, height, 2, 1);
+ }
+ break;
+ case NVRenderTextureFormats::Alpha8:
+ return true;
+ break;
+ case NVRenderTextureFormats::Luminance8:
+ return false;
+ break;
+ case NVRenderTextureFormats::LuminanceAlpha8:
+ if (!data) { // dds
+ return true;
+ } else {
+ return ScanImageForAlpha(data, width, height, 2, 8);
+ }
+ break;
+ case NVRenderTextureFormats::RGB_DXT1:
+ return false;
+ break;
+ case NVRenderTextureFormats::RGBA_DXT3:
+ case NVRenderTextureFormats::RGBA_DXT1:
+ case NVRenderTextureFormats::RGBA_DXT5:
+ if (dds) {
+ return ScanDDSForAlpha(dds);
+ } else {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ break;
+ case NVRenderTextureFormats::RGB9E5:
+ return false;
+ break;
+ case NVRenderTextureFormats::RG32F:
+ case NVRenderTextureFormats::RGB32F:
+ case NVRenderTextureFormats::RGBA16F:
+ case NVRenderTextureFormats::RGBA32F:
+ // PKC TODO : For now, since IBL will be the main consumer, we'll just pretend there's no
+ // alpha.
+ // Need to do a proper scan down the line, but doing it for floats is a little different
+ // from
+ // integer scans.
+ return false;
+ break;
+ default:
+ break;
+ }
+ QT3DS_ASSERT(false);
+ return false;
+}
+
+void SLoadedTexture::EnsureMultiplerOfFour(NVFoundationBase &inFoundation, const char *inPath)
+{
+ if (width % 4 || height % 4) {
+ qCWarning(PERF_WARNING,
+ "Image %s has non multiple of four width or height; perf hit for scaling", inPath);
+ if (data) {
+ QT3DSU32 newWidth = ITextRenderer::NextMultipleOf4(width);
+ QT3DSU32 newHeight = ITextRenderer::NextMultipleOf4(height);
+ QT3DSU32 newDataSize = newWidth * newHeight * components;
+ NVAllocatorCallback &theAllocator(inFoundation.getAllocator());
+ QT3DSU8 *newData = (QT3DSU8 *)(theAllocator.allocate(newDataSize, "Scaled Image Data",
+ __FILE__, __LINE__));
+ CImageScaler theScaler(theAllocator);
+ if (components == 4) {
+ theScaler.FastExpandRowsAndColumns((unsigned char *)data, width, height, newData,
+ newWidth, newHeight);
+ } else
+ theScaler.ExpandRowsAndColumns((unsigned char *)data, width, height, newData,
+ newWidth, newHeight, components);
+
+ theAllocator.deallocate(data);
+ data = newData;
+ width = newWidth;
+ height = newHeight;
+ dataSizeInBytes = newDataSize;
+ }
+ }
+}
+
+STextureData SLoadedTexture::DecompressDXTImage(int inMipMapIdx, STextureData *inOptLastImage)
+{
+ STextureData retval;
+ if (inOptLastImage)
+ retval = *inOptLastImage;
+
+ if (dds == NULL || inMipMapIdx >= dds->numMipmaps) {
+ QT3DS_ASSERT(false);
+ ReleaseDecompressedTexture(retval);
+ return STextureData();
+ }
+ char *srcData = (char *)dds->data[inMipMapIdx];
+ int srcDataSize = dds->size[inMipMapIdx];
+ QT3DSU32 imgWidth = (QT3DSU32)dds->mipwidth[inMipMapIdx];
+ QT3DSU32 imgHeight = (QT3DSU32)dds->mipheight[inMipMapIdx];
+
+ switch (format) {
+ case NVRenderTextureFormats::RGB_DXT1:
+ DecompressDDS<DXT_BLOCKDECODER_1>(
+ srcData, srcDataSize, imgWidth, imgHeight,
+ STextureDataWriter(imgWidth, imgHeight, false, retval, m_Allocator));
+ break;
+ case NVRenderTextureFormats::RGBA_DXT1:
+ DecompressDDS<DXT_BLOCKDECODER_1>(
+ srcData, srcDataSize, imgWidth, imgHeight,
+ STextureDataWriter(imgWidth, imgHeight, true, retval, m_Allocator));
+ break;
+ case NVRenderTextureFormats::RGBA_DXT3:
+ DecompressDDS<DXT_BLOCKDECODER_3>(
+ srcData, srcDataSize, imgWidth, imgHeight,
+ STextureDataWriter(imgWidth, imgHeight, true, retval, m_Allocator));
+ break;
+ case NVRenderTextureFormats::RGBA_DXT5:
+ DecompressDDS<DXT_BLOCKDECODER_5>(
+ srcData, srcDataSize, imgWidth, imgHeight,
+ STextureDataWriter(imgWidth, imgHeight, true, retval, m_Allocator));
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ return retval;
+}
+
+void SLoadedTexture::ReleaseDecompressedTexture(STextureData inImage)
+{
+ if (inImage.data)
+ m_Allocator.deallocate(inImage.data);
+}
+
+#ifndef EA_PLATFORM_WINDOWS
+#define stricmp strcasecmp
+#endif
+
+SLoadedTexture *SLoadedTexture::Load(const QString &inPath, NVFoundationBase &inFoundation,
+ IInputStreamFactory &inFactory, bool inFlipY,
+ NVRenderContextType renderContextType, bool preferKTX)
+{
+ if (inPath.isEmpty())
+ return nullptr;
+
+ // Check KTX path first
+ QString path = inPath;
+ QString ktxSource = inPath;
+ if (preferKTX) {
+ ktxSource = ktxSource.left(ktxSource.lastIndexOf(QLatin1Char('.')));
+ ktxSource.append(QLatin1String(".ktx"));
+ }
+
+ SLoadedTexture *theLoadedImage = nullptr;
+ // We will get invalid error logs of files not found if we don't force quiet mode
+ // If the file is actually missing, it will be logged later (loaded image is null)
+ NVScopedRefCounted<IRefCountedInputStream> theStream(
+ inFactory.GetStreamForFile(preferKTX ? ktxSource : inPath, true));
+ if (!theStream.mPtr) {
+ if (preferKTX)
+ theStream = inFactory.GetStreamForFile(inPath, true);
+ else
+ return nullptr;
+ } else {
+ path = ktxSource;
+ }
+ QString fileName;
+ inFactory.GetPathForFile(path, fileName, true);
+ if (theStream.mPtr && path.size() > 3) {
+ if (path.endsWith(QLatin1String("png"), Qt::CaseInsensitive)
+ || path.endsWith(QLatin1String("jpg"), Qt::CaseInsensitive)
+ || path.endsWith(QLatin1String("peg"), Qt::CaseInsensitive)) {
+ theLoadedImage = LoadQImage(fileName, inFlipY, inFoundation, renderContextType);
+ } else if (path.endsWith(QLatin1String("dds"), Qt::CaseInsensitive)) {
+ theLoadedImage = LoadDDS(*theStream, inFlipY, inFoundation, renderContextType);
+ } else if (path.endsWith(QLatin1String("gif"), Qt::CaseInsensitive)) {
+ theLoadedImage = LoadGIF(*theStream, !inFlipY, inFoundation, renderContextType);
+ } else if (path.endsWith(QLatin1String("bmp"), Qt::CaseInsensitive)) {
+ theLoadedImage = LoadBMP(*theStream, !inFlipY, inFoundation, renderContextType);
+ } else if (path.endsWith(QLatin1String("hdr"), Qt::CaseInsensitive)) {
+ theLoadedImage = LoadHDR(*theStream, inFoundation, renderContextType);
+ } else if (path.endsWith(QLatin1String("ktx"), Qt::CaseInsensitive)) {
+ theLoadedImage = LoadKTX(*theStream, inFlipY, inFoundation, renderContextType);
+ } else {
+ qCWarning(INTERNAL_ERROR, "Unrecognized image extension: %s", qPrintable(inPath));
+ }
+ }
+
+ return theLoadedImage;
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.h b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.h
new file mode 100644
index 0000000..f019400
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTexture.h
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_LOADED_TEXTURE_H
+#define QT3DS_RENDER_LOADED_TEXTURE_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSSimpleTypes.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "Qt3DSRenderLoadedTextureDDS.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include <QImage>
+
+namespace qt3ds {
+namespace foundation {
+ class ISeekableIOStream;
+ class IInStream;
+}
+}
+
+namespace qt3ds {
+namespace render {
+
+ class IInputStreamFactory;
+
+ struct STextureData
+ {
+ void *data;
+ QT3DSU32 dataSizeInBytes;
+ qt3ds::render::NVRenderTextureFormats::Enum format;
+ STextureData()
+ : data(NULL)
+ , dataSizeInBytes(0)
+ , format(qt3ds::render::NVRenderTextureFormats::Unknown)
+ {
+ }
+ };
+ struct ExtendedTextureFormats
+ {
+ enum Enum {
+ NoExtendedFormat = 0,
+ Palettized,
+ CustomRGB,
+ };
+ };
+ // Utility class used for loading image data from disk.
+ // Supports jpg, png, and dds.
+ struct SLoadedTexture : public NVReleasable
+ {
+ private:
+ ~SLoadedTexture();
+
+ public:
+ NVAllocatorCallback &m_Allocator;
+ QT3DSI32 width;
+ QT3DSI32 height;
+ QT3DSI32 components;
+ void *data;
+ QImage image;
+ QT3DSU32 dataSizeInBytes;
+ qt3ds::render::NVRenderTextureFormats::Enum format;
+ Qt3DSDDSImage *dds;
+ ExtendedTextureFormats::Enum m_ExtendedFormat;
+ // Used for palettized images.
+ void *m_Palette;
+ QT3DSI32 m_CustomMasks[3];
+ int m_BitCount;
+ char8_t m_BackgroundColor[3];
+ uint8_t *m_TransparencyTable;
+ int32_t m_TransparentPaletteIndex;
+
+ SLoadedTexture(NVAllocatorCallback &inAllocator)
+ : m_Allocator(inAllocator)
+ , width(0)
+ , height(0)
+ , components(0)
+ , data(NULL)
+ , image(0)
+ , dataSizeInBytes(0)
+ , format(qt3ds::render::NVRenderTextureFormats::RGBA8)
+ , dds(NULL)
+ , m_ExtendedFormat(ExtendedTextureFormats::NoExtendedFormat)
+ , m_Palette(NULL)
+ , m_BitCount(0)
+ , m_TransparencyTable(NULL)
+ , m_TransparentPaletteIndex(-1)
+ {
+ m_CustomMasks[0] = 0;
+ m_CustomMasks[1] = 0;
+ m_CustomMasks[2] = 0;
+ m_BackgroundColor[0] = 0;
+ m_BackgroundColor[1] = 0;
+ m_BackgroundColor[2] = 0;
+ }
+ void setFormatFromComponents()
+ {
+ switch (components) {
+ case 1: // undefined, but in this context probably luminance
+ format = qt3ds::render::NVRenderTextureFormats::Luminance8;
+ break;
+ case 2:
+ format = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8;
+ break;
+ case 3:
+ format = qt3ds::render::NVRenderTextureFormats::RGB8;
+ break;
+
+ default:
+ // fallthrough intentional
+ case 4:
+ format = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ break;
+ }
+ }
+
+ void EnsureMultiplerOfFour(NVFoundationBase &inFoundation, const char *inPath);
+ // Returns true if this image has a pixel less than 255.
+ bool ScanForTransparency();
+
+ // Be sure to call this or risk leaking an enormous amount of memory
+ void release() override;
+
+ // Not all video cards support dxt compression. Giving the last image allows
+ // this object to potentially reuse the memory
+ STextureData DecompressDXTImage(int inMipMapIdx, STextureData *inOptLastImage = NULL);
+ void ReleaseDecompressedTexture(STextureData inImage);
+
+ static SLoadedTexture *Load(const QString &inPath, NVFoundationBase &inAllocator,
+ IInputStreamFactory &inFactory, bool inFlipY = true,
+ NVRenderContextType renderContextType
+ = NVRenderContextValues::NullContext, bool preferKTX = false);
+ static SLoadedTexture *LoadDDS(IInStream &inStream, QT3DSI32 flipVertical,
+ NVFoundationBase &fnd,
+ NVRenderContextType renderContextType);
+ static SLoadedTexture *LoadKTX(IInStream &inStream, QT3DSI32 flipVertical,
+ NVFoundationBase &fnd,
+ NVRenderContextType renderContextType);
+ static SLoadedTexture *LoadBMP(ISeekableIOStream &inStream, bool inFlipY,
+ NVFoundationBase &inFnd,
+ NVRenderContextType renderContextType);
+ static SLoadedTexture *LoadGIF(ISeekableIOStream &inStream, bool inFlipY,
+ NVFoundationBase &inFnd,
+ NVRenderContextType renderContextType);
+ static SLoadedTexture *LoadHDR(ISeekableIOStream &inStream, NVFoundationBase &inFnd,
+ NVRenderContextType renderContextType);
+
+ static SLoadedTexture *LoadQImage(const QString &inPath, QT3DSI32 flipVertical,
+ NVFoundationBase &fnd,
+ NVRenderContextType renderContextType);
+
+ private:
+ // Implemented in the bmp loader.
+ void FreeImagePostProcess(bool inFlipY);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureBMP.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureBMP.cpp
new file mode 100644
index 0000000..29e75a8
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureBMP.cpp
@@ -0,0 +1,1262 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+// ==========================================================
+// BMP Loader and Writer
+//
+// Design and implementation by
+// - Floris van den Berg (flvdberg@wxs.nl)
+// - Markus Loibl (markus.loibl@epost.de)
+// - Martin Weber (martweb@gmx.net)
+// - Herve Drolon (drolon@infonie.fr)
+// - Michal Novotny (michal@etc.cz)
+//
+// This file is part of FreeImage 3
+//
+// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
+// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
+// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
+// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
+// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
+// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
+// THIS DISCLAIMER.
+//
+// Use at your own risk!
+// ==========================================================
+
+#include "Qt3DSRenderLoadedTextureFreeImageCompat.h"
+
+// ----------------------------------------------------------
+// Constants + headers
+// ----------------------------------------------------------
+
+static const BYTE RLE_COMMAND = 0;
+static const BYTE RLE_ENDOFLINE = 0;
+static const BYTE RLE_ENDOFBITMAP = 1;
+static const BYTE RLE_DELTA = 2;
+
+static const BYTE BI_RGB = 0;
+static const BYTE BI_RLE8 = 1;
+static const BYTE BI_RLE4 = 2;
+static const BYTE BI_BITFIELDS = 3;
+
+// ----------------------------------------------------------
+
+#ifdef _WIN32
+#pragma pack(push, 1)
+#else
+#pragma pack(1)
+#endif
+
+typedef struct tagBITMAPCOREHEADER
+{
+ DWORD bcSize;
+ WORD bcWidth;
+ WORD bcHeight;
+ WORD bcPlanes;
+ WORD bcBitCnt;
+} BITMAPCOREHEADER, *PBITMAPCOREHEADER;
+
+typedef struct tagBITMAPINFOOS2_1X_HEADER
+{
+ DWORD biSize;
+ WORD biWidth;
+ WORD biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+} BITMAPINFOOS2_1X_HEADER, *PBITMAPINFOOS2_1X_HEADER;
+
+typedef struct tagBITMAPFILEHEADER
+{
+ WORD bfType;
+ DWORD bfSize;
+ WORD bfReserved1;
+ WORD bfReserved2;
+ DWORD bfOffBits;
+} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
+
+
+#ifdef _WIN32
+#pragma pack(pop)
+#else
+#pragma pack()
+#endif
+
+// ==========================================================
+// Plugin Interface
+// ==========================================================
+
+static int s_format_id;
+
+// ==========================================================
+// Internal functions
+// ==========================================================
+
+#ifdef FREEIMAGE_BIGENDIAN
+static void SwapInfoHeader(BITMAPINFOHEADER *header)
+{
+ SwapLong(&header->biSize);
+ SwapLong((DWORD *)&header->biWidth);
+ SwapLong((DWORD *)&header->biHeight);
+ SwapShort(&header->biPlanes);
+ SwapShort(&header->biBitCount);
+ SwapLong(&header->biCompression);
+ SwapLong(&header->biSizeImage);
+ SwapLong((DWORD *)&header->biXPelsPerMeter);
+ SwapLong((DWORD *)&header->biYPelsPerMeter);
+ SwapLong(&header->biClrUsed);
+ SwapLong(&header->biClrImportant);
+}
+
+static void SwapCoreHeader(BITMAPCOREHEADER *header)
+{
+ SwapLong(&header->bcSize);
+ SwapShort(&header->bcWidth);
+ SwapShort(&header->bcHeight);
+ SwapShort(&header->bcPlanes);
+ SwapShort(&header->bcBitCnt);
+}
+
+static void SwapOS21XHeader(BITMAPINFOOS2_1X_HEADER *header)
+{
+ SwapLong(&header->biSize);
+ SwapShort(&header->biWidth);
+ SwapShort(&header->biHeight);
+ SwapShort(&header->biPlanes);
+ SwapShort(&header->biBitCount);
+}
+
+static void SwapFileHeader(BITMAPFILEHEADER *header)
+{
+ SwapShort(&header->bfType);
+ SwapLong(&header->bfSize);
+ SwapShort(&header->bfReserved1);
+ SwapShort(&header->bfReserved2);
+ SwapLong(&header->bfOffBits);
+}
+#endif
+
+// --------------------------------------------------------------------------
+
+/**
+Load uncompressed image pixels for 1-, 4-, 8-, 16-, 24- and 32-bit dib
+@param io FreeImage IO
+@param handle FreeImage IO handle
+@param dib Image to be loaded
+@param height Image height
+@param pitch Image pitch
+@param bit_count Image bit-depth (1-, 4-, 8-, 16-, 24- or 32-bit)
+*/
+static void LoadPixelData(FreeImageIO *io, fi_handle handle, FIBITMAP *dib, int height, int pitch,
+ int bit_count)
+{
+ (void)bit_count;
+ // Load pixel data
+ // NB: height can be < 0 for BMP data
+ if (height > 0) {
+ io->read_proc((void *)FreeImage_GetBits(dib), height * pitch, 1, handle);
+ } else {
+ int positiveHeight = abs(height);
+ for (int c = 0; c < positiveHeight; ++c) {
+ io->read_proc((void *)FreeImage_GetScanLine(dib, positiveHeight - c - 1), pitch, 1,
+ handle);
+ }
+ }
+
+// swap as needed
+#ifdef FREEIMAGE_BIGENDIAN
+ if (bit_count == 16) {
+ for (unsigned y = 0; y < FreeImage_GetHeight(dib); y++) {
+ WORD *pixel = (WORD *)FreeImage_GetScanLine(dib, y);
+ for (unsigned x = 0; x < FreeImage_GetWidth(dib); x++) {
+ SwapShort(pixel);
+ pixel++;
+ }
+ }
+ }
+#endif
+
+#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
+ if (bit_count == 24 || bit_count == 32) {
+ for (unsigned y = 0; y < FreeImage_GetHeight(dib); y++) {
+ BYTE *pixel = FreeImage_GetScanLine(dib, y);
+ for (unsigned x = 0; x < FreeImage_GetWidth(dib); x++) {
+ INPLACESWAP(pixel[0], pixel[2]);
+ pixel += (bit_count >> 3);
+ }
+ }
+ }
+#endif
+}
+
+/**
+Load image pixels for 4-bit RLE compressed dib
+@param io FreeImage IO
+@param handle FreeImage IO handle
+@param width Image width
+@param height Image height
+@param dib Image to be loaded
+@return Returns TRUE if successful, returns FALSE otherwise
+*/
+static BOOL LoadPixelDataRLE4(FreeImageIO *io, fi_handle handle, int width, int height,
+ FIBITMAP *dib)
+{
+ int status_byte = 0;
+ BYTE second_byte = 0;
+ int bits = 0;
+
+ BYTE *pixels = NULL; // temporary 8-bit buffer
+
+ try {
+ height = abs(height);
+
+ pixels = (BYTE *)malloc(width * height * sizeof(BYTE));
+ if (!pixels)
+ throw(1);
+ memset(pixels, 0, width * height * sizeof(BYTE));
+
+ BYTE *q = pixels;
+ BYTE *end = pixels + height * width;
+
+ for (int scanline = 0; scanline < height;) {
+ if (q < pixels || q >= end) {
+ break;
+ }
+ if (io->read_proc(&status_byte, sizeof(BYTE), 1, handle) != 1) {
+ throw(1);
+ }
+ if (status_byte != 0) {
+ status_byte = (int)MIN((size_t)status_byte, (size_t)(end - q));
+ // Encoded mode
+ if (io->read_proc(&second_byte, sizeof(BYTE), 1, handle) != 1) {
+ throw(1);
+ }
+ for (int i = 0; i < status_byte; i++) {
+ *q++ = (BYTE)((i & 0x01) ? (second_byte & 0x0f) : ((second_byte >> 4) & 0x0f));
+ }
+ bits += status_byte;
+ } else {
+ // Escape mode
+ if (io->read_proc(&status_byte, sizeof(BYTE), 1, handle) != 1) {
+ throw(1);
+ }
+ switch (status_byte) {
+ case RLE_ENDOFLINE: {
+ // End of line
+ bits = 0;
+ scanline++;
+ q = pixels + scanline * width;
+ } break;
+
+ case RLE_ENDOFBITMAP:
+ // End of bitmap
+ q = end;
+ break;
+
+ case RLE_DELTA: {
+ // read the delta values
+
+ BYTE delta_x = 0;
+ BYTE delta_y = 0;
+
+ if (io->read_proc(&delta_x, sizeof(BYTE), 1, handle) != 1) {
+ throw(1);
+ }
+ if (io->read_proc(&delta_y, sizeof(BYTE), 1, handle) != 1) {
+ throw(1);
+ }
+
+ // apply them
+
+ bits += delta_x;
+ scanline += delta_y;
+ q = pixels + scanline * width + bits;
+ } break;
+
+ default: {
+ // Absolute mode
+ status_byte = (int)MIN((size_t)status_byte, (size_t)(end - q));
+ for (int i = 0; i < status_byte; i++) {
+ if ((i & 0x01) == 0) {
+ if (io->read_proc(&second_byte, sizeof(BYTE), 1, handle) != 1) {
+ throw(1);
+ }
+ }
+ *q++ =
+ (BYTE)((i & 0x01) ? (second_byte & 0x0f) : ((second_byte >> 4) & 0x0f));
+ }
+ bits += status_byte;
+ // Read pad byte
+ if (((status_byte & 0x03) == 1) || ((status_byte & 0x03) == 2)) {
+ BYTE padding = 0;
+ if (io->read_proc(&padding, sizeof(BYTE), 1, handle) != 1) {
+ throw(1);
+ }
+ }
+ } break;
+ }
+ }
+ }
+
+ {
+ // Convert to 4-bit
+ for (int y = 0; y < height; y++) {
+ const BYTE *src = (BYTE *)pixels + y * width;
+ BYTE *dst = FreeImage_GetScanLine(dib, y);
+
+ BOOL hinibble = TRUE;
+
+ for (int cols = 0; cols < width; cols++) {
+ if (hinibble) {
+ dst[cols >> 1] = (src[cols] << 4);
+ } else {
+ dst[cols >> 1] |= src[cols];
+ }
+
+ hinibble = !hinibble;
+ }
+ }
+ }
+
+ free(pixels);
+
+ return TRUE;
+
+ } catch (int) {
+ if (pixels)
+ free(pixels);
+ return FALSE;
+ }
+}
+
+/**
+Load image pixels for 8-bit RLE compressed dib
+@param io FreeImage IO
+@param handle FreeImage IO handle
+@param width Image width
+@param height Image height
+@param dib Image to be loaded
+@return Returns TRUE if successful, returns FALSE otherwise
+*/
+static BOOL LoadPixelDataRLE8(FreeImageIO *io, fi_handle handle, int width, int height,
+ FIBITMAP *dib)
+{
+ BYTE status_byte = 0;
+ BYTE second_byte = 0;
+ int scanline = 0;
+ int bits = 0;
+
+ for (;;) {
+ if (io->read_proc(&status_byte, sizeof(BYTE), 1, handle) != 1) {
+ return FALSE;
+ }
+
+ switch (status_byte) {
+ case RLE_COMMAND:
+ if (io->read_proc(&status_byte, sizeof(BYTE), 1, handle) != 1) {
+ return FALSE;
+ }
+
+ switch (status_byte) {
+ case RLE_ENDOFLINE:
+ bits = 0;
+ scanline++;
+ break;
+
+ case RLE_ENDOFBITMAP:
+ return TRUE;
+
+ case RLE_DELTA: {
+ // read the delta values
+
+ BYTE delta_x = 0;
+ BYTE delta_y = 0;
+
+ if (io->read_proc(&delta_x, sizeof(BYTE), 1, handle) != 1) {
+ return FALSE;
+ }
+ if (io->read_proc(&delta_y, sizeof(BYTE), 1, handle) != 1) {
+ return FALSE;
+ }
+
+ // apply them
+
+ bits += delta_x;
+ scanline += delta_y;
+
+ break;
+ }
+
+ default: {
+ if (scanline >= abs(height)) {
+ return TRUE;
+ }
+
+ int count = MIN((int)status_byte, width - bits);
+
+ BYTE *sline = FreeImage_GetScanLine(dib, scanline);
+
+ if (io->read_proc((void *)(sline + bits), sizeof(BYTE) * count, 1, handle) != 1) {
+ return FALSE;
+ }
+
+ // align run length to even number of bytes
+
+ if ((status_byte & 1) == 1) {
+ if (io->read_proc(&second_byte, sizeof(BYTE), 1, handle) != 1) {
+ return FALSE;
+ }
+ }
+
+ bits += status_byte;
+
+ break;
+ }
+ }
+
+ break;
+
+ default: {
+ if (scanline >= abs(height)) {
+ return TRUE;
+ }
+
+ int count = MIN((int)status_byte, width - bits);
+
+ BYTE *sline = FreeImage_GetScanLine(dib, scanline);
+
+ if (io->read_proc(&second_byte, sizeof(BYTE), 1, handle) != 1) {
+ return FALSE;
+ }
+
+ for (int i = 0; i < count; i++) {
+ *(sline + bits) = second_byte;
+
+ bits++;
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+// --------------------------------------------------------------------------
+
+static FIBITMAP *LoadWindowsBMP(FreeImageIO *io, fi_handle handle, int flags,
+ unsigned bitmap_bits_offset)
+{
+ FIBITMAP *dib = NULL;
+ (void)flags;
+ try {
+ // load the info header
+
+ BITMAPINFOHEADER bih;
+
+ io->read_proc(&bih, sizeof(BITMAPINFOHEADER), 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapInfoHeader(&bih);
+#endif
+
+ // keep some general information about the bitmap
+
+ int used_colors = bih.biClrUsed;
+ int width = bih.biWidth;
+ int height = bih.biHeight; // WARNING: height can be < 0 => check each call using 'height'
+ // as a parameter
+ int alloc_height = abs(height);
+ int bit_count = bih.biBitCount;
+ int compression = bih.biCompression;
+ int pitch = CalculatePitch(CalculateLine(width, bit_count));
+
+ switch (bit_count) {
+ case 1:
+ case 4:
+ case 8: {
+ if ((used_colors <= 0) || (used_colors > CalculateUsedPaletteEntries(bit_count)))
+ used_colors = CalculateUsedPaletteEntries(bit_count);
+
+ // allocate enough memory to hold the bitmap (header, palette, pixels) and read the
+ // palette
+
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, io);
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information
+ FreeImage_SetDotsPerMeterX(dib, bih.biXPelsPerMeter);
+ FreeImage_SetDotsPerMeterY(dib, bih.biYPelsPerMeter);
+
+ // load the palette
+
+ io->read_proc(FreeImage_GetPalette(dib), used_colors * sizeof(RGBQUAD), 1, handle);
+#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
+ RGBQUAD *pal = FreeImage_GetPalette(dib);
+ for (int i = 0; i < used_colors; i++) {
+ INPLACESWAP(pal[i].rgbRed, pal[i].rgbBlue);
+ }
+#endif
+
+ // seek to the actual pixel data.
+ // this is needed because sometimes the palette is larger than the entries it contains
+ // predicts
+
+ if (bitmap_bits_offset > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ + (used_colors * sizeof(RGBQUAD))))
+ io->seek_proc(handle, bitmap_bits_offset, SEEK_SET);
+
+ // read the pixel data
+
+ switch (compression) {
+ case BI_RGB:
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+ return dib;
+
+ case BI_RLE4:
+ if (LoadPixelDataRLE4(io, handle, width, height, dib)) {
+ return dib;
+ } else {
+ throw "Error encountered while decoding RLE4 BMP data";
+ }
+ break;
+
+ case BI_RLE8:
+ if (LoadPixelDataRLE8(io, handle, width, height, dib)) {
+ return dib;
+ } else {
+ throw "Error encountered while decoding RLE8 BMP data";
+ }
+ break;
+
+ default:
+ throw "compression type not supported";
+ }
+ } break; // 1-, 4-, 8-bit
+
+ case 16: {
+ if (bih.biCompression == BI_BITFIELDS) {
+ DWORD bitfields[3];
+
+ io->read_proc(bitfields, 3 * sizeof(DWORD), 1, handle);
+
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, bitfields[0], bitfields[1],
+ bitfields[2], io);
+ } else {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI16_555_RED_MASK,
+ FI16_555_GREEN_MASK, FI16_555_BLUE_MASK, io);
+ }
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information
+ FreeImage_SetDotsPerMeterX(dib, bih.biXPelsPerMeter);
+ FreeImage_SetDotsPerMeterY(dib, bih.biYPelsPerMeter);
+
+ // load pixel data and swap as needed if OS is Big Endian
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+
+ return dib;
+ } break; // 16-bit
+
+ case 24:
+ case 32: {
+ if (bih.biCompression == BI_BITFIELDS) {
+ DWORD bitfields[3];
+
+ io->read_proc(bitfields, 3 * sizeof(DWORD), 1, handle);
+
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, bitfields[0], bitfields[1],
+ bitfields[2], io);
+ } else {
+ if (bit_count == 32) {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI_RGBA_RED_MASK,
+ FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, io);
+ } else {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI_RGBA_RED_MASK,
+ FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, io);
+ }
+ }
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information
+ FreeImage_SetDotsPerMeterX(dib, bih.biXPelsPerMeter);
+ FreeImage_SetDotsPerMeterY(dib, bih.biYPelsPerMeter);
+
+ // Skip over the optional palette
+ // A 24 or 32 bit DIB may contain a palette for faster color reduction
+
+ if (used_colors > 0) {
+ io->seek_proc(handle, used_colors * sizeof(RGBQUAD), SEEK_CUR);
+ } else if ((bih.biCompression != BI_BITFIELDS)
+ && (bitmap_bits_offset
+ > sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER))) {
+ io->seek_proc(handle, bitmap_bits_offset, SEEK_SET);
+ }
+
+ // read in the bitmap bits
+ // load pixel data and swap as needed if OS is Big Endian
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+
+ // check if the bitmap contains transparency, if so enable it in the header
+
+ return dib;
+ } break; // 24-, 32-bit
+ }
+ } catch (const char *message) {
+ if (dib) {
+ FreeImage_Unload(dib);
+ }
+ if (message) {
+ FreeImage_OutputMessageProc(s_format_id, message, io);
+ }
+ }
+
+ return NULL;
+}
+
+// --------------------------------------------------------------------------
+
+static FIBITMAP *LoadOS22XBMP(FreeImageIO *io, fi_handle handle, int flags,
+ unsigned bitmap_bits_offset)
+{
+ FIBITMAP *dib = NULL;
+ (void)flags;
+ try {
+ // load the info header
+
+ BITMAPINFOHEADER bih;
+
+ io->read_proc(&bih, sizeof(BITMAPINFOHEADER), 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapInfoHeader(&bih);
+#endif
+
+ // keep some general information about the bitmap
+
+ int used_colors = bih.biClrUsed;
+ int width = bih.biWidth;
+ int height = bih.biHeight; // WARNING: height can be < 0 => check each read_proc using
+ // 'height' as a parameter
+ int alloc_height = abs(height);
+ int bit_count = bih.biBitCount;
+ int compression = bih.biCompression;
+ int pitch = CalculatePitch(CalculateLine(width, bit_count));
+
+ switch (bit_count) {
+ case 1:
+ case 4:
+ case 8: {
+ if ((used_colors <= 0) || (used_colors > CalculateUsedPaletteEntries(bit_count)))
+ used_colors = CalculateUsedPaletteEntries(bit_count);
+
+ // allocate enough memory to hold the bitmap (header, palette, pixels) and read the
+ // palette
+
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, io);
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information
+ FreeImage_SetDotsPerMeterX(dib, bih.biXPelsPerMeter);
+ FreeImage_SetDotsPerMeterY(dib, bih.biYPelsPerMeter);
+
+ // load the palette
+
+ io->seek_proc(handle, sizeof(BITMAPFILEHEADER) + bih.biSize, SEEK_SET);
+
+ RGBQUAD *pal = FreeImage_GetPalette(dib);
+
+ for (int count = 0; count < used_colors; count++) {
+ FILE_BGR bgr;
+
+ io->read_proc(&bgr, sizeof(FILE_BGR), 1, handle);
+
+ pal[count].rgbRed = bgr.r;
+ pal[count].rgbGreen = bgr.g;
+ pal[count].rgbBlue = bgr.b;
+ }
+
+ // seek to the actual pixel data.
+ // this is needed because sometimes the palette is larger than the entries it contains
+ // predicts
+
+ if (bitmap_bits_offset
+ > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (used_colors * 3)))
+ io->seek_proc(handle, bitmap_bits_offset, SEEK_SET);
+
+ // read the pixel data
+
+ switch (compression) {
+ case BI_RGB:
+ // load pixel data
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+ return dib;
+
+ case BI_RLE4:
+ if (LoadPixelDataRLE4(io, handle, width, height, dib)) {
+ return dib;
+ } else {
+ throw "Error encountered while decoding RLE4 BMP data";
+ }
+ break;
+
+ case BI_RLE8:
+ if (LoadPixelDataRLE8(io, handle, width, height, dib)) {
+ return dib;
+ } else {
+ throw "Error encountered while decoding RLE8 BMP data";
+ }
+ break;
+
+ default:
+ throw "compression type not supported";
+ }
+ }
+
+ case 16: {
+ if (bih.biCompression == 3) {
+ DWORD bitfields[3];
+
+ io->read_proc(bitfields, 3 * sizeof(DWORD), 1, handle);
+
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, bitfields[0], bitfields[1],
+ bitfields[2], io);
+ } else {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI16_555_RED_MASK,
+ FI16_555_GREEN_MASK, FI16_555_BLUE_MASK, io);
+ }
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information
+ FreeImage_SetDotsPerMeterX(dib, bih.biXPelsPerMeter);
+ FreeImage_SetDotsPerMeterY(dib, bih.biYPelsPerMeter);
+
+ if (bitmap_bits_offset
+ > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (used_colors * 3))) {
+ io->seek_proc(handle, bitmap_bits_offset, SEEK_SET);
+ }
+
+ // load pixel data and swap as needed if OS is Big Endian
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+
+ return dib;
+ }
+
+ case 24:
+ case 32: {
+ if (bit_count == 32) {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI_RGBA_RED_MASK,
+ FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, io);
+ } else {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI_RGBA_RED_MASK,
+ FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, io);
+ }
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information
+ FreeImage_SetDotsPerMeterX(dib, bih.biXPelsPerMeter);
+ FreeImage_SetDotsPerMeterY(dib, bih.biYPelsPerMeter);
+
+ // Skip over the optional palette
+ // A 24 or 32 bit DIB may contain a palette for faster color reduction
+
+ if (bitmap_bits_offset
+ > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (used_colors * 3)))
+ io->seek_proc(handle, bitmap_bits_offset, SEEK_SET);
+
+ // read in the bitmap bits
+ // load pixel data and swap as needed if OS is Big Endian
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+
+ return dib;
+ }
+ }
+ } catch (const char *message) {
+ if (dib)
+ FreeImage_Unload(dib);
+
+ FreeImage_OutputMessageProc(s_format_id, message, io);
+ }
+
+ return NULL;
+}
+
+// --------------------------------------------------------------------------
+
+static FIBITMAP *LoadOS21XBMP(FreeImageIO *io, fi_handle handle, int flags,
+ unsigned bitmap_bits_offset)
+{
+ FIBITMAP *dib = NULL;
+ (void)flags;
+ try {
+ BITMAPINFOOS2_1X_HEADER bios2_1x;
+
+ io->read_proc(&bios2_1x, sizeof(BITMAPINFOOS2_1X_HEADER), 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapOS21XHeader(&bios2_1x);
+#endif
+ // keep some general information about the bitmap
+
+ int used_colors = 0;
+ int width = bios2_1x.biWidth;
+ int height = bios2_1x.biHeight; // WARNING: height can be < 0 => check each read_proc using
+ // 'height' as a parameter
+ int alloc_height = abs(height);
+ int bit_count = bios2_1x.biBitCount;
+ int pitch = CalculatePitch(CalculateLine(width, bit_count));
+
+ switch (bit_count) {
+ case 1:
+ case 4:
+ case 8: {
+ used_colors = CalculateUsedPaletteEntries(bit_count);
+
+ // allocate enough memory to hold the bitmap (header, palette, pixels) and read the
+ // palette
+
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, io);
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information to default values (72 dpi in english units)
+ FreeImage_SetDotsPerMeterX(dib, 2835);
+ FreeImage_SetDotsPerMeterY(dib, 2835);
+
+ // load the palette
+
+ RGBQUAD *pal = FreeImage_GetPalette(dib);
+
+ for (int count = 0; count < used_colors; count++) {
+ FILE_BGR bgr;
+
+ io->read_proc(&bgr, sizeof(FILE_BGR), 1, handle);
+
+ pal[count].rgbRed = bgr.r;
+ pal[count].rgbGreen = bgr.g;
+ pal[count].rgbBlue = bgr.b;
+ }
+
+ // Skip over the optional palette
+ // A 24 or 32 bit DIB may contain a palette for faster color reduction
+
+ io->seek_proc(handle, bitmap_bits_offset, SEEK_SET);
+
+ // read the pixel data
+
+ // load pixel data
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+
+ return dib;
+ }
+
+ case 16: {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI16_555_RED_MASK,
+ FI16_555_GREEN_MASK, FI16_555_BLUE_MASK, io);
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information to default values (72 dpi in english units)
+ FreeImage_SetDotsPerMeterX(dib, 2835);
+ FreeImage_SetDotsPerMeterY(dib, 2835);
+
+ // load pixel data and swap as needed if OS is Big Endian
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+
+ return dib;
+ }
+
+ case 24:
+ case 32: {
+ if (bit_count == 32) {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI_RGBA_RED_MASK,
+ FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, io);
+ } else {
+ dib = FreeImage_Allocate(width, alloc_height, bit_count, FI_RGBA_RED_MASK,
+ FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, io);
+ }
+
+ if (dib == NULL)
+ throw "DIB allocation failed";
+
+ // set resolution information to default values (72 dpi in english units)
+ FreeImage_SetDotsPerMeterX(dib, 2835);
+ FreeImage_SetDotsPerMeterY(dib, 2835);
+
+ // Skip over the optional palette
+ // A 24 or 32 bit DIB may contain a palette for faster color reduction
+
+ // load pixel data and swap as needed if OS is Big Endian
+ LoadPixelData(io, handle, dib, height, pitch, bit_count);
+
+ // check if the bitmap contains transparency, if so enable it in the header
+
+ return dib;
+ }
+ }
+ } catch (const char *message) {
+ if (dib)
+ FreeImage_Unload(dib);
+
+ FreeImage_OutputMessageProc(s_format_id, message, io);
+ }
+
+ return NULL;
+}
+
+// ==========================================================
+// Plugin Implementation
+// ==========================================================
+
+// ----------------------------------------------------------
+
+static FIBITMAP *DoLoadBMP(FreeImageIO *io, fi_handle handle, int flags)
+{
+ if (handle != NULL) {
+ BITMAPFILEHEADER bitmapfileheader;
+ DWORD type = 0;
+ BYTE magic[2];
+
+ // we use this offset value to make seemingly absolute seeks relative in the file
+
+ long offset_in_file = io->tell_proc(handle);
+
+ // read the magic
+
+ io->read_proc(&magic, sizeof(magic), 1, handle);
+
+ // compare the magic with the number we know
+
+ // somebody put a comment here explaining the purpose of this loop
+ while (memcmp(&magic, "BA", 2) == 0) {
+ io->read_proc(&bitmapfileheader.bfSize, sizeof(DWORD), 1, handle);
+ io->read_proc(&bitmapfileheader.bfReserved1, sizeof(WORD), 1, handle);
+ io->read_proc(&bitmapfileheader.bfReserved2, sizeof(WORD), 1, handle);
+ io->read_proc(&bitmapfileheader.bfOffBits, sizeof(DWORD), 1, handle);
+ io->read_proc(&magic, sizeof(magic), 1, handle);
+ }
+
+ // read the fileheader
+
+ io->seek_proc(handle, (0 - (int)sizeof(magic)), SEEK_CUR);
+ io->read_proc(&bitmapfileheader, (int)sizeof(BITMAPFILEHEADER), 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapFileHeader(&bitmapfileheader);
+#endif
+
+ // read the first byte of the infoheader
+
+ io->read_proc(&type, sizeof(DWORD), 1, handle);
+ io->seek_proc(handle, 0 - (int)sizeof(DWORD), SEEK_CUR);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapLong(&type);
+#endif
+
+ // call the appropriate load function for the found bitmap type
+
+ if (type == 40)
+ return LoadWindowsBMP(io, handle, flags, offset_in_file + bitmapfileheader.bfOffBits);
+
+ if (type == 12)
+ return LoadOS21XBMP(io, handle, flags, offset_in_file + bitmapfileheader.bfOffBits);
+
+ if (type <= 64)
+ return LoadOS22XBMP(io, handle, flags, offset_in_file + bitmapfileheader.bfOffBits);
+
+ char buf[256];
+ sprintf(buf, "unknown bmp subtype with id %d", type);
+ FreeImage_OutputMessageProc(s_format_id, buf, io);
+ }
+
+ return NULL;
+}
+
+template <QT3DSU32 TBitWidth>
+struct SPaletteIndexer
+{
+ static inline uint32_t IndexOf(const uint8_t *inData, uint32_t inPos)
+ {
+ uint32_t divisor = 8 / TBitWidth;
+ uint32_t byte = inPos / divisor;
+ uint32_t modulus = inPos % divisor;
+ uint32_t shift = TBitWidth * modulus;
+ uint32_t mask = (1 << TBitWidth) - 1;
+ mask = mask << shift;
+ uint32_t byteData = inData[byte];
+ return (byteData & mask) >> shift;
+ }
+};
+
+template <>
+struct SPaletteIndexer<1>
+{
+ static inline uint32_t IndexOf(const uint8_t *inData, uint32_t inPos)
+ {
+ uint32_t byte = (inPos / 8);
+ uint32_t bit = 1 << (7 - (inPos % 8));
+ uint32_t byteData = inData[byte];
+ return (byteData & bit) ? 1 : 0;
+ }
+};
+
+template <>
+struct SPaletteIndexer<8>
+{
+ static inline uint32_t IndexOf(const uint8_t *inData, uint32_t inPos)
+ {
+ uint32_t byte = inPos;
+ uint32_t bit = 0xFF;
+ uint32_t byteData = inData[byte];
+ return byteData & bit;
+ }
+};
+
+static inline void assignQuad(uint8_t *dest, const RGBQUAD &quad)
+{
+ dest[0] = quad.rgbRed;
+ dest[1] = quad.rgbGreen;
+ dest[2] = quad.rgbBlue;
+}
+
+template <QT3DSU32 bitCount>
+inline void LoadPalettized(bool inFlipY, const RGBQUAD *palette, void *data, uint8_t *newData,
+ int width, int height, int components, int transparentIndex)
+{
+ const uint8_t *oldData = (const uint8_t *)data;
+ int pitch = CalculatePitch(CalculateLine(width, bitCount));
+ for (uint32_t h = 0; h < (uint32_t)height; ++h) {
+ uint32_t relHeight = h;
+ if (inFlipY)
+ relHeight = ((uint32_t)height) - h - 1;
+ for (uint32_t w = 0; w < (uint32_t)width; ++w) {
+ const uint8_t *dataLine = oldData + pitch * h;
+ uint32_t pos = width * relHeight + w;
+ uint32_t paletteIndex = SPaletteIndexer<bitCount>::IndexOf(dataLine, w);
+ const RGBQUAD &theQuad = palette[paletteIndex];
+ uint8_t *writePtr = newData + (pos * components);
+ assignQuad(writePtr, theQuad);
+ if (paletteIndex == (uint32_t)transparentIndex && components == 4) {
+ writePtr[3] = 0;
+ }
+ }
+ }
+}
+
+inline int firstHighBit(int data)
+{
+ if (data == 0)
+ return 0;
+ int idx = 0;
+ while ((data % 2) == 0) {
+ data = data >> 1;
+ ++idx;
+ }
+ return idx;
+}
+
+struct SMaskData
+{
+ uint32_t mask;
+ uint32_t shift;
+ uint32_t max;
+
+ SMaskData(int inMask)
+ {
+ mask = inMask;
+ shift = firstHighBit(mask);
+ max = mask >> shift;
+ }
+
+ inline uint8_t MapColor(uint32_t color) const
+ {
+ uint32_t intermediateValue = (color & mask) >> shift;
+ return (uint8_t)((intermediateValue * 255) / max);
+ }
+};
+
+template <QT3DSU32>
+struct ColorAccess
+{
+};
+
+template <>
+struct ColorAccess<16>
+{
+ static uint32_t GetPixelWidth() { return 2; }
+ static uint32_t GetColor(const char8_t *src)
+ {
+ return (uint32_t) * reinterpret_cast<const QT3DSU16 *>(src);
+ }
+};
+
+template <>
+struct ColorAccess<24>
+{
+ static uint32_t GetPixelWidth() { return 3; }
+ static uint32_t GetColor(const char8_t *src)
+ {
+ return (uint32_t)(*reinterpret_cast<const QT3DSU32 *>(src) & 0xFFFFFF);
+ }
+};
+
+template <>
+struct ColorAccess<32>
+{
+ static uint32_t GetPixelWidth() { return 4; }
+ static uint32_t GetColor(const char8_t *src)
+ {
+ return *reinterpret_cast<const uint32_t *>(src);
+ }
+};
+
+template <QT3DSU32 TBitCount>
+inline void LoadMasked(bool inFlipY, QT3DSI32 *inMasks, void *data, uint8_t *newData, int width,
+ int height)
+{
+ const char8_t *oldData = (const char8_t *)data;
+ SMaskData rMask(inMasks[0]);
+ SMaskData gMask(inMasks[1]);
+ SMaskData bMask(inMasks[2]);
+ for (int h = 0; h < height; ++h) {
+ int relHeight = h;
+ if (inFlipY)
+ relHeight = height - h - 1;
+ for (int w = 0; w < width; ++w) {
+ int pos = width * relHeight + w;
+ const char8_t *readPtr = oldData + (pos * ColorAccess<TBitCount>::GetPixelWidth());
+ uint8_t *writePtr = newData + (pos * 3);
+ uint32_t colorVal = ColorAccess<TBitCount>::GetColor(readPtr);
+ writePtr[0] = rMask.MapColor(colorVal);
+ writePtr[1] = gMask.MapColor(colorVal);
+ writePtr[2] = bMask.MapColor(colorVal);
+ }
+ }
+}
+
+void SLoadedTexture::FreeImagePostProcess(bool inFlipY)
+{
+ // We always convert 32 bit RGBA
+ if (m_ExtendedFormat != ExtendedTextureFormats::NoExtendedFormat) {
+
+ QT3DSU32 stride = 3 * width;
+ format = NVRenderTextureFormats::RGB8;
+ components = 3;
+ if (m_ExtendedFormat == ExtendedTextureFormats::Palettized && m_TransparentPaletteIndex > -1
+ && m_TransparentPaletteIndex < 256) {
+ stride = 4 * width;
+ components = 4;
+ format = NVRenderTextureFormats::RGBA8;
+ }
+ QT3DSU32 byteSize = height * stride;
+ uint8_t *newData =
+ (uint8_t *)m_Allocator.allocate(byteSize, "texture data", __FILE__, __LINE__);
+ if (format == NVRenderTextureFormats::RGBA8)
+ memSet(newData, 255, byteSize);
+ switch (m_ExtendedFormat) {
+ case ExtendedTextureFormats::Palettized: {
+ RGBQUAD *palette = (RGBQUAD *)m_Palette;
+ switch (m_BitCount) {
+ case 1:
+ LoadPalettized<1>(inFlipY, palette, data, newData, width, height, components,
+ m_TransparentPaletteIndex);
+ break;
+ case 2:
+ LoadPalettized<2>(inFlipY, palette, data, newData, width, height, components,
+ m_TransparentPaletteIndex);
+ break;
+ case 4:
+ LoadPalettized<4>(inFlipY, palette, data, newData, width, height, components,
+ m_TransparentPaletteIndex);
+ break;
+ case 8:
+ LoadPalettized<8>(inFlipY, palette, data, newData, width, height, components,
+ m_TransparentPaletteIndex);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ memSet(newData, 0, byteSize);
+ break;
+ }
+ } break;
+ case ExtendedTextureFormats::CustomRGB: {
+ switch (m_BitCount) {
+ case 16:
+ LoadMasked<16>(inFlipY, m_CustomMasks, data, newData, width, height);
+ break;
+ case 24:
+ LoadMasked<24>(inFlipY, m_CustomMasks, data, newData, width, height);
+ break;
+ case 32:
+ LoadMasked<32>(inFlipY, m_CustomMasks, data, newData, width, height);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ memSet(newData, 0, byteSize);
+ break;
+ }
+ } break;
+ default:
+ QT3DS_ASSERT(false);
+ memSet(newData, 0, byteSize);
+ break;
+ }
+ m_Allocator.deallocate(data);
+ if (m_Palette)
+ m_Allocator.deallocate(m_Palette);
+ data = newData;
+ m_Palette = NULL;
+ m_BitCount = 0;
+ this->dataSizeInBytes = byteSize;
+ m_ExtendedFormat = ExtendedTextureFormats::NoExtendedFormat;
+ }
+}
+
+SLoadedTexture *SLoadedTexture::LoadBMP(ISeekableIOStream &inStream, bool inFlipY,
+ NVFoundationBase &inFnd,
+ qt3ds::render::NVRenderContextType renderContextType)
+{
+ Q_UNUSED(renderContextType)
+ FreeImageIO theIO(inFnd.getAllocator(), inFnd);
+ SLoadedTexture *retval = DoLoadBMP(&theIO, &inStream, 0);
+ if (retval)
+ retval->FreeImagePostProcess(inFlipY);
+ return retval;
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp
new file mode 100644
index 0000000..19d41d1
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp
@@ -0,0 +1,695 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderLoadedTextureDDS.h"
+#include "Qt3DSRenderLoadedTextureFreeImageCompat.h"
+
+using namespace qt3ds::render;
+
+namespace qt3ds {
+namespace render {
+
+ static int s_exception_string;
+
+ //================================================================================
+ // DXT data-layout structure definitions.
+ typedef struct
+ {
+ QT3DSU16 col0; // 16-bit 565 interpolant endpoints
+ QT3DSU16 col1;
+ QT3DSU8 row[4]; // 4x4 * 2bpp color-index == 4 bytes.
+ } DXTColBlock;
+
+ typedef struct
+ {
+ QT3DSU16 row[4]; // 4x4 * 4bpp alpha == 8 bytes. (pure 4-bit alpha values)
+ } DXT3AlphaBlock;
+
+ typedef struct
+ {
+ QT3DSU8 alpha0; // 8-bit alpha interpolant endpoints
+ QT3DSU8 alpha1;
+ QT3DSU8 row[6]; // 4x4 * 3bpp alpha-index == 48bits == 6 bytes.
+ } DXT5AlphaBlock;
+
+ typedef struct
+ {
+ QT3DSU8 red;
+ QT3DSU8 green;
+ QT3DSU8 blue;
+ QT3DSU8 alpha;
+ } Color8888;
+
+//================================================================================
+// Various DDS file defines
+
+#define DDSD_CAPS 0x00000001l
+#define DDSD_HEIGHT 0x00000002l
+#define DDSD_WIDTH 0x00000004l
+#define DDSD_PIXELFORMAT 0x00001000l
+#define DDS_ALPHAPIXELS 0x00000001l
+#define DDS_FOURCC 0x00000004l
+#define DDS_PITCH 0x00000008l
+#define DDS_COMPLEX 0x00000008l
+#define DDS_RGB 0x00000040l
+#define DDS_TEXTURE 0x00001000l
+#define DDS_MIPMAPCOUNT 0x00020000l
+#define DDS_LINEARSIZE 0x00080000l
+#define DDS_VOLUME 0x00200000l
+#define DDS_MIPMAP 0x00400000l
+#define DDS_DEPTH 0x00800000l
+
+#define DDS_CUBEMAP 0x00000200L
+#define DDS_CUBEMAP_POSITIVEX 0x00000400L
+#define DDS_CUBEMAP_NEGATIVEX 0x00000800L
+#define DDS_CUBEMAP_POSITIVEY 0x00001000L
+#define DDS_CUBEMAP_NEGATIVEY 0x00002000L
+#define DDS_CUBEMAP_POSITIVEZ 0x00004000L
+#define DDS_CUBEMAP_NEGATIVEZ 0x00008000L
+
+#define FOURCC_DXT1 0x31545844 //(MAKEFOURCC('D','X','T','1'))
+#define FOURCC_DXT3 0x33545844 //(MAKEFOURCC('D','X','T','3'))
+#define FOURCC_DXT5 0x35545844 //(MAKEFOURCC('D','X','T','5'))
+
+#define DDS_MAGIC_FLIPPED 0x0F7166ED
+
+ //================================================================================
+ // DDS file format structures.
+ typedef struct _DDS_PIXELFORMAT
+ {
+ QT3DSU32 dwSize;
+ QT3DSU32 dwFlags;
+ QT3DSU32 dwFourCC;
+ QT3DSU32 dwRGBBitCount;
+ QT3DSU32 dwRBitMask;
+ QT3DSU32 dwGBitMask;
+ QT3DSU32 dwBBitMask;
+ QT3DSU32 dwABitMask;
+ } DDS_PIXELFORMAT;
+
+ typedef struct _DDS_HEADER
+ {
+ QT3DSU32 dwSize;
+ QT3DSU32 dwFlags;
+ QT3DSU32 dwHeight;
+ QT3DSU32 dwWidth;
+ QT3DSU32 dwPitchOrLinearSize;
+ QT3DSU32 dwDepth;
+ QT3DSU32 dwMipMapCount;
+ QT3DSU32 dwReserved1[11];
+ DDS_PIXELFORMAT ddspf;
+ QT3DSU32 dwCaps1;
+ QT3DSU32 dwCaps2;
+ QT3DSU32 dwReserved2[3];
+ } DDS_HEADER;
+
+ //================================================================================
+ // helper functions
+ //================================================================================
+
+ // helper macros.
+ static inline void NvSwapChar(QT3DSU8 &a, QT3DSU8 &b)
+ {
+ QT3DSU8 tmp;
+ tmp = a;
+ a = b;
+ b = tmp;
+ }
+
+ static inline void NvSwapShort(QT3DSU16 &a, QT3DSU16 &b)
+ {
+ QT3DSU16 tmp;
+ tmp = a;
+ a = b;
+ b = tmp;
+ }
+
+ //================================================================================
+ //================================================================================
+ static void flip_blocks_dxtc1(DXTColBlock *line, QT3DSI32 numBlocks)
+ {
+ DXTColBlock *curblock = line;
+ QT3DSI32 i;
+
+ for (i = 0; i < numBlocks; i++) {
+ NvSwapChar(curblock->row[0], curblock->row[3]);
+ NvSwapChar(curblock->row[1], curblock->row[2]);
+ curblock++;
+ }
+ }
+
+ //================================================================================
+ //================================================================================
+ static void flip_blocks_dxtc3(DXTColBlock *line, QT3DSI32 numBlocks)
+ {
+ DXTColBlock *curblock = line;
+ DXT3AlphaBlock *alphablock;
+ QT3DSI32 i;
+
+ for (i = 0; i < numBlocks; i++) {
+ alphablock = (DXT3AlphaBlock *)curblock;
+
+ NvSwapShort(alphablock->row[0], alphablock->row[3]);
+ NvSwapShort(alphablock->row[1], alphablock->row[2]);
+ curblock++;
+
+ NvSwapChar(curblock->row[0], curblock->row[3]);
+ NvSwapChar(curblock->row[1], curblock->row[2]);
+ curblock++;
+ }
+ }
+
+ static void flip_dxt5_alpha(DXT5AlphaBlock *block)
+ {
+ QT3DSI8 gBits[4][4];
+
+ const QT3DSU32 mask = 0x00000007; // bits = 00 00 01 11
+ QT3DSU32 bits = 0;
+ memcpy(&bits, &block->row[0], sizeof(QT3DSI8) * 3);
+
+ gBits[0][0] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[0][1] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[0][2] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[0][3] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[1][0] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[1][1] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[1][2] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[1][3] = (QT3DSI8)(bits & mask);
+
+ bits = 0;
+ memcpy(&bits, &block->row[3], sizeof(QT3DSI8) * 3);
+
+ gBits[2][0] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[2][1] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[2][2] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[2][3] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[3][0] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[3][1] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[3][2] = (QT3DSI8)(bits & mask);
+ bits >>= 3;
+ gBits[3][3] = (QT3DSI8)(bits & mask);
+
+ bits = (gBits[3][0] << 0) | (gBits[3][1] << 3) | (gBits[3][2] << 6) | (gBits[3][3] << 9)
+ | (gBits[2][0] << 12) | (gBits[2][1] << 15) | (gBits[2][2] << 18) | (gBits[2][3] << 21);
+ memcpy(&block->row[0], &bits, 3);
+
+ bits = (gBits[1][0] << 0) | (gBits[1][1] << 3) | (gBits[1][2] << 6) | (gBits[1][3] << 9)
+ | (gBits[0][0] << 12) | (gBits[0][1] << 15) | (gBits[0][2] << 18) | (gBits[0][3] << 21);
+ memcpy(&block->row[3], &bits, 3);
+ }
+
+ static void flip_blocks_dxtc5(DXTColBlock *line, QT3DSI32 numBlocks)
+ {
+ DXTColBlock *curblock = line;
+ DXT5AlphaBlock *alphablock;
+ QT3DSI32 i;
+
+ for (i = 0; i < numBlocks; i++) {
+ alphablock = (DXT5AlphaBlock *)curblock;
+
+ flip_dxt5_alpha(alphablock);
+ curblock++;
+
+ NvSwapChar(curblock->row[0], curblock->row[3]);
+ NvSwapChar(curblock->row[1], curblock->row[2]);
+ curblock++;
+ }
+ }
+
+ static void flip_data_vertical(FreeImageIO *io, QT3DSI8 *image, QT3DSI32 width, QT3DSI32 height,
+ Qt3DSDDSImage *info)
+ {
+ if (info->compressed) {
+ QT3DSI32 linesize, j;
+ DXTColBlock *top;
+ DXTColBlock *bottom;
+ QT3DSI8 *tmp;
+ void (*flipblocks)(DXTColBlock *, QT3DSI32) = NULL;
+ QT3DSI32 xblocks = width / 4;
+ QT3DSI32 yblocks = height / 4;
+ QT3DSI32 blocksize;
+
+ switch (info->format) {
+ case qt3ds::render::NVRenderTextureFormats::RGBA_DXT1:
+ blocksize = 8;
+ flipblocks = &flip_blocks_dxtc1;
+ break;
+ case qt3ds::render::NVRenderTextureFormats::RGBA_DXT3:
+ blocksize = 16;
+ flipblocks = &flip_blocks_dxtc3;
+ break;
+ case qt3ds::render::NVRenderTextureFormats::RGBA_DXT5:
+ blocksize = 16;
+ flipblocks = &flip_blocks_dxtc5;
+ break;
+ default:
+ return;
+ }
+
+ linesize = xblocks * blocksize;
+ tmp = (QT3DSI8 *)QT3DS_ALLOC(io->m_Allocator, linesize, "flip_data_vertical compressed");
+
+ for (j = 0; j < (yblocks >> 1); j++) {
+ top = (DXTColBlock *)(void *)(image + j * linesize);
+ bottom = (DXTColBlock *)(void *)(image + (((yblocks - j) - 1) * linesize));
+
+ (*flipblocks)(top, xblocks);
+ (*flipblocks)(bottom, xblocks);
+
+ memcpy(tmp, bottom, linesize);
+ memcpy(bottom, top, linesize);
+ memcpy(top, tmp, linesize);
+ }
+
+ // Catch the middle row of blocks if there is one
+ // The loop above will skip the middle row
+ if (yblocks & 0x01) {
+ DXTColBlock *middle = (DXTColBlock *)(void *)(image + (yblocks >> 1) * linesize);
+ (*flipblocks)(middle, xblocks);
+ }
+
+ QT3DS_FREE(io->m_Allocator, tmp);
+ } else {
+ QT3DSI32 linesize = width * info->bytesPerPixel;
+ QT3DSI32 j;
+ QT3DSI8 *top;
+ QT3DSI8 *bottom;
+ QT3DSI8 *tmp;
+
+ // much simpler - just compute the line length and swap each row
+ tmp = (QT3DSI8 *)QT3DS_ALLOC(io->m_Allocator, linesize, "flip_data_vertical");
+ ;
+
+ for (j = 0; j < (height >> 1); j++) {
+ top = (QT3DSI8 *)(image + j * linesize);
+ bottom = (QT3DSI8 *)(image + (((height - j) - 1) * linesize));
+
+ memcpy(tmp, bottom, linesize);
+ memcpy(bottom, top, linesize);
+ memcpy(top, tmp, linesize);
+ }
+
+ QT3DS_FREE(io->m_Allocator, tmp);
+ }
+ }
+
+ static QT3DSI32 size_image(QT3DSI32 width, QT3DSI32 height, const Qt3DSDDSImage *image)
+ {
+ if (image->compressed) {
+ return ((width + 3) / 4) * ((height + 3) / 4)
+ * (image->format == qt3ds::render::NVRenderTextureFormats::RGBA_DXT1 ? 8 : 16);
+ } else {
+ return width * height * image->bytesPerPixel;
+ }
+ }
+
+ static QT3DSI32 total_image_data_size(Qt3DSDDSImage *image)
+ {
+ QT3DSI32 i, j, index = 0, size = 0, w, h;
+ QT3DSI32 cubeCount = image->cubemap ? 6 : 1;
+
+ for (j = 0; j < cubeCount; j++) {
+ w = image->width;
+ h = image->height;
+
+ for (i = 0; i < image->numMipmaps; i++) // account for base plus each mip
+ {
+ image->size[index] = size_image(w, h, image);
+ image->mipwidth[index] = w;
+ image->mipheight[index] = h;
+ size += image->size[index];
+ if (w != 1) {
+ w >>= 1;
+ }
+ if (h != 1) {
+ h >>= 1;
+ }
+
+ index++;
+ }
+ }
+
+ return (size);
+ }
+
+ void *Qt3DSDDSAllocDataBlock(FreeImageIO *io, Qt3DSDDSImage *image)
+ {
+ if (image) {
+ QT3DSI32 i;
+ QT3DSI32 size = total_image_data_size(image);
+ image->dataBlock =
+ QT3DS_ALLOC(io->m_Allocator, size,
+ "Qt3DSDDSAllocDataBlock"); // no need to calloc, as we fill every bit...
+ if (image->dataBlock == NULL) {
+ return NULL;
+ }
+
+ image->data[0] = image->dataBlock;
+
+ QT3DSI32 planes = image->numMipmaps * (image->cubemap ? 6 : 1);
+
+ for (i = 1; i < planes; i++) // account for base plus each mip
+ {
+ image->data[i] =
+ (void *)(((size_t)(image->data[i - 1])) + (size_t)image->size[i - 1]);
+ }
+
+ return (image->dataBlock); // in case caller wants to sanity check...
+ }
+ return (NULL);
+ }
+
+ static FIBITMAP *DoLoadDDS(FreeImageIO *io, IInStream &inStream, QT3DSI32 flipVertical)
+ {
+ FIBITMAP *dib = NULL;
+ DDS_HEADER ddsh;
+ QT3DSI8 filecode[4];
+ Qt3DSDDSImage *image = NULL;
+ bool needsBGRASwap = false;
+ ;
+ bool isAllreadyFlipped = false;
+
+ try {
+ // check file code
+ inStream.Read(filecode, 4);
+ if (memcmp(filecode, "DDS ", 4)) {
+ throw "Invalid DDS file";
+ }
+
+ image = (Qt3DSDDSImage *)QT3DS_ALLOC(io->m_Allocator, sizeof(Qt3DSDDSImage), "DoLoadDDS");
+ if (image == NULL) {
+ throw "Qt3DSDDSImage allocation failed";
+ }
+ memset(image, 0, sizeof(Qt3DSDDSImage));
+
+ // read in DDS header
+ inStream.Read(&ddsh, 1);
+
+ // check if image is a cubempap
+ if (ddsh.dwCaps2 & DDS_CUBEMAP) {
+ const QT3DSI32 allFaces = DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_POSITIVEY
+ | DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEX | DDS_CUBEMAP_NEGATIVEY
+ | DDS_CUBEMAP_NEGATIVEZ;
+
+ if ((ddsh.dwCaps2 & allFaces) != allFaces) {
+ throw "Not all cubemap faces defined - not supported";
+ }
+
+ image->cubemap = 1;
+ } else {
+ image->cubemap = 0;
+ }
+
+ // check if image is a volume texture
+ if ((ddsh.dwCaps2 & DDS_VOLUME) && (ddsh.dwDepth > 0)) {
+ throw "Volume textures not supported";
+ }
+
+ // allocated the memory for the structure we return
+ dib = QT3DS_NEW(io->m_Allocator, SLoadedTexture)(io->m_Allocator);
+ if (dib == NULL) {
+ throw "DIB allocation failed";
+ }
+
+ // figure out what the image format is
+ if (ddsh.ddspf.dwFlags & DDS_FOURCC) {
+ switch (ddsh.ddspf.dwFourCC) {
+ case FOURCC_DXT1:
+ image->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT1;
+ image->components = 3;
+ image->compressed = 1;
+ image->alpha = 0; // Ugh - for backwards compatibility
+ dib->format = qt3ds::render::NVRenderTextureFormats::RGB_DXT1;
+ break;
+ case FOURCC_DXT3:
+ image->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT3;
+ image->components = 4;
+ image->compressed = 1;
+ image->alpha = 1;
+ dib->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT3;
+ break;
+ case FOURCC_DXT5:
+ image->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT5;
+ image->components = 4;
+ image->compressed = 1;
+ image->alpha = 1;
+ dib->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT5;
+ break;
+ default:
+ throw "Unsupported FOURCC code";
+ }
+ } else {
+ // Check for a supported pixel format
+ if ((ddsh.ddspf.dwRGBBitCount == 32) && (ddsh.ddspf.dwRBitMask == 0x000000FF)
+ && (ddsh.ddspf.dwGBitMask == 0x0000FF00)
+ && (ddsh.ddspf.dwBBitMask == 0x00FF0000)
+ && (ddsh.ddspf.dwABitMask == 0xFF000000)) {
+ // We support D3D's A8B8G8R8, which is actually RGBA in linear
+ // memory, equivalent to GL's RGBA
+ image->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ image->components = 4;
+ image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
+ image->bytesPerPixel = 4;
+ image->alpha = 1;
+ image->compressed = 0;
+ dib->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ } else if ((ddsh.ddspf.dwRGBBitCount == 32) && (ddsh.ddspf.dwRBitMask == 0x00FF0000)
+ && (ddsh.ddspf.dwGBitMask == 0x0000FF00)
+ && (ddsh.ddspf.dwBBitMask == 0x000000FF)
+ && (ddsh.ddspf.dwABitMask == 0xFF000000)) {
+ // We support D3D's A8R8G8B8, which is actually BGRA in linear
+ // memory, need to be
+ image->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ image->components = 4;
+ image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
+ image->bytesPerPixel = 4;
+ image->alpha = 1;
+ image->compressed = 0;
+ needsBGRASwap = true;
+ dib->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
+ } else if ((ddsh.ddspf.dwRGBBitCount == 16) && (ddsh.ddspf.dwRBitMask == 0x0000F800)
+ && (ddsh.ddspf.dwGBitMask == 0x000007E0)
+ && (ddsh.ddspf.dwBBitMask == 0x0000001F)
+ && (ddsh.ddspf.dwABitMask == 0x00000000)) {
+ // We support D3D's R5G6B5, which is actually RGB in linear
+ // memory. It is equivalent to GL's GL_UNSIGNED_SHORT_5_6_5
+ image->format = qt3ds::render::NVRenderTextureFormats::RGB8;
+ image->components = 3;
+ image->alpha = 0;
+ image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU16;
+ image->bytesPerPixel = 2;
+ image->compressed = 0;
+ dib->format = qt3ds::render::NVRenderTextureFormats::RGB8;
+ } else if ((ddsh.ddspf.dwRGBBitCount == 8) && (ddsh.ddspf.dwRBitMask == 0x00000000)
+ && (ddsh.ddspf.dwGBitMask == 0x00000000)
+ && (ddsh.ddspf.dwBBitMask == 0x00000000)
+ && (ddsh.ddspf.dwABitMask == 0x000000FF)) {
+ // We support D3D's A8
+ image->format = qt3ds::render::NVRenderTextureFormats::Alpha8;
+ image->components = 1;
+ image->alpha = 1;
+ image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
+ image->bytesPerPixel = 1;
+ image->compressed = 0;
+ dib->format = qt3ds::render::NVRenderTextureFormats::Alpha8;
+ } else if ((ddsh.ddspf.dwRGBBitCount == 8) && (ddsh.ddspf.dwRBitMask == 0x000000FF)
+ && (ddsh.ddspf.dwGBitMask == 0x00000000)
+ && (ddsh.ddspf.dwBBitMask == 0x00000000)
+ && (ddsh.ddspf.dwABitMask == 0x00000000)) {
+ // We support D3D's L8 (flagged as 8 bits of red only)
+ image->format = qt3ds::render::NVRenderTextureFormats::Luminance8;
+ image->components = 1;
+ image->alpha = 0;
+ image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
+ image->bytesPerPixel = 1;
+ image->compressed = 0;
+ dib->format = qt3ds::render::NVRenderTextureFormats::Luminance8;
+ } else if ((ddsh.ddspf.dwRGBBitCount == 16) && (ddsh.ddspf.dwRBitMask == 0x000000FF)
+ && (ddsh.ddspf.dwGBitMask == 0x00000000)
+ && (ddsh.ddspf.dwBBitMask == 0x00000000)
+ && (ddsh.ddspf.dwABitMask == 0x0000FF00)) {
+ // We support D3D's A8L8 (flagged as 8 bits of red and 8 bits of alpha)
+ image->format = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8;
+ image->components = 2;
+ image->alpha = 1;
+ image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
+ image->bytesPerPixel = 2;
+ image->compressed = 0;
+ dib->format = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8;
+ } else {
+ throw "not a DXTC or supported RGB(A) format image";
+ }
+ }
+
+ // detect flagging to indicate this texture was stored in a y-inverted fashion
+ if (!(ddsh.dwFlags & DDS_LINEARSIZE)) {
+ if (ddsh.dwPitchOrLinearSize == DDS_MAGIC_FLIPPED) {
+ isAllreadyFlipped = true;
+ }
+ }
+
+ flipVertical = (isAllreadyFlipped != (flipVertical ? true : false)) ? 1 : 0;
+
+ // store primary surface width/height/numMipmaps
+ image->width = ddsh.dwWidth;
+ image->height = ddsh.dwHeight;
+ image->numMipmaps = ddsh.dwFlags & DDS_MIPMAPCOUNT ? ddsh.dwMipMapCount : 1;
+
+ if (image->numMipmaps > QT3DS_DDS_MAX_MIPMAPS) {
+ throw "Too many mipmaps: max 16";
+ }
+
+ // allocate the meta datablock for all mip storage.
+ Qt3DSDDSAllocDataBlock(io, image);
+ if (image->dataBlock == NULL) {
+ throw "Failed to allocate memory for image data storage";
+ }
+
+ dib->width = image->width;
+ dib->height = image->height;
+ dib->dds = image;
+
+ QT3DSI32 faces = image->cubemap ? 6 : 1;
+
+ QT3DSI32 index = 0;
+ for (QT3DSI32 j = 0; j < faces; j++) {
+ // load all surfaces for the image
+ QT3DSI32 width = image->width;
+ QT3DSI32 height = image->height;
+
+ for (QT3DSI32 i = 0; i < image->numMipmaps; i++) {
+ // Get the size, read in the data.
+ inStream.Read(
+ NVDataRef<QT3DSU8>((QT3DSU8 *)image->data[index], (QT3DSU32)image->size[index]));
+
+ // Flip in Y for OpenGL if needed
+ if (flipVertical)
+ flip_data_vertical(io, (QT3DSI8 *)image->data[index], width, height, image);
+
+ // shrink to next power of 2
+ width >>= 1;
+ height >>= 1;
+
+ if (!width)
+ width = 1;
+
+ if (!height)
+ height = 1;
+
+ // make sure DXT isn't <4 on a side...
+ if (image->compressed) {
+ if (width < 4)
+ width = 4;
+ if (height < 4)
+ height = 4;
+ }
+
+ index++;
+ }
+ }
+
+ if (needsBGRASwap) {
+ QT3DSI32 index = 0;
+ QT3DSI32 k;
+
+ for (k = 0; k < faces; k++) {
+ QT3DSI32 width = image->width;
+ QT3DSI32 height = image->height;
+
+ for (QT3DSI32 i = 0; i < image->numMipmaps; i++) {
+ QT3DSI8 *data = (QT3DSI8 *)(image->data[index]);
+ QT3DSI32 pixels = width * height;
+ QT3DSI32 j;
+
+ for (j = 0; j < pixels; j++) {
+ QT3DSI8 temp = data[0];
+ data[0] = data[2];
+ data[2] = temp;
+
+ data += 4;
+ }
+
+ // shrink to next power of 2
+ width >>= 1;
+ height >>= 1;
+
+ if (!width)
+ width = 1;
+
+ if (!height)
+ height = 1;
+
+ index++;
+ }
+ }
+ }
+ } catch (const char *message) {
+ if (image) {
+ if (image->dataBlock)
+ QT3DS_FREE(io->m_Allocator, image->dataBlock);
+
+ QT3DS_FREE(io->m_Allocator, image);
+ }
+ if (dib) {
+ FreeImage_Unload(dib);
+ }
+ if (message) {
+ FreeImage_OutputMessageProc(s_exception_string, message, io);
+ }
+ }
+
+ return dib;
+ }
+
+ SLoadedTexture *SLoadedTexture::LoadDDS(IInStream &inStream, QT3DSI32 flipVertical,
+ NVFoundationBase &inFnd,
+ qt3ds::render::NVRenderContextType renderContextType)
+ {
+ Q_UNUSED(renderContextType)
+ FreeImageIO theIO(inFnd.getAllocator(), inFnd);
+ SLoadedTexture *retval = DoLoadDDS(&theIO, inStream, flipVertical);
+
+ return retval;
+ }
+}
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.h b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.h
new file mode 100644
index 0000000..8490b47
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.h
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#ifndef QT3DS_RENDER_LOAD_DDS_H
+#define QT3DS_RENDER_LOAD_DDS_H
+
+namespace qt3ds {
+namespace render {
+
+/** The maximum number of mipmap levels (per texture or per cubemap face) */
+#define QT3DS_DDS_MAX_MIPMAPS (16)
+
+/** The number of cubemap faces that must exist in a cubemap-bearing DDS file */
+#define QT3DS_DDS_NUM_CUBEMAP_FACES (6)
+
+ /** The master DDS structure for loading and saving
+
+ This is the master DDS structure. It shouldn't be allocated by hand,
+ always use NVHHDDSAlloc/NVHHDDSAllocData/NVHHDDSFree to manage them properly.
+ */
+
+ struct Qt3DSDDSImage
+ {
+ /** Width of the overall texture in texels */
+ int width;
+ /** Height of the overall texture in texels */
+ int height;
+ /** Number of color/alpha components per texel 1-4 */
+ int components;
+ /** The GL type of each color component (noncompressed textures only) */
+ int componentFormat;
+ /** The number of bytes per pixel (noncompressed textures only) */
+ int bytesPerPixel;
+ /** Nonzero if the format is DXT-compressed */
+ int compressed;
+ /** The number of levels in the mipmap pyramid (including the base level) */
+ int numMipmaps;
+ /** If nonzero, then the file contains 6 cubemap faces */
+ int cubemap;
+ /** The format of the loaded texture data */
+ int format;
+ /** The GL internal format of the loaded texture data(compressed textures only) */
+ int internalFormat;
+ /** Nonzero if the texture data includes alpha */
+ int alpha;
+ /** Base of the allocated block of all texel data */
+ void *dataBlock;
+ /** Pointers to the mipmap levels for the texture or each cubemap face */
+ void *data[QT3DS_DDS_MAX_MIPMAPS * QT3DS_DDS_NUM_CUBEMAP_FACES];
+ /** Array of sizes of the mipmap levels for the texture or each cubemap face */
+ int size[QT3DS_DDS_MAX_MIPMAPS * QT3DS_DDS_NUM_CUBEMAP_FACES];
+ /** Array of widths of the mipmap levels for the texture or each cubemap face */
+ int mipwidth[QT3DS_DDS_MAX_MIPMAPS * QT3DS_DDS_NUM_CUBEMAP_FACES];
+ /** Array of heights of the mipmap levels for the texture or each cubemap face */
+ int mipheight[QT3DS_DDS_MAX_MIPMAPS * QT3DS_DDS_NUM_CUBEMAP_FACES];
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureFreeImageCompat.h b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureFreeImageCompat.h
new file mode 100644
index 0000000..13f317b
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureFreeImageCompat.h
@@ -0,0 +1,413 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_LOADED_TEXTURE_FREEIMAGE_COMPAT_H
+#define QT3DS_RENDER_LOADED_TEXTURE_FREEIMAGE_COMPAT_H
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSRenderLoadedTexture.h"
+#include "EASTL/algorithm.h"
+#include <stdlib.h>
+#ifndef _MACOSX
+#ifndef _INTEGRITYPLATFORM
+#include <malloc.h>
+#endif
+#endif
+
+// We use a compatibility layer so we can easily convert freeimage code to load our texture formats
+// where necessary.
+
+namespace qt3ds {
+namespace render {
+ using namespace qt3ds::foundation;
+
+ typedef int32_t BOOL;
+ typedef uint8_t BYTE;
+ typedef uint16_t WORD;
+ typedef uint32_t DWORD;
+ typedef int32_t LONG;
+
+#define FREEIMAGE_COLORORDER_BGR 0
+#define FREEIMAGE_COLORORDER_RGB 1
+
+#define FREEIMAGE_COLORORDER FREEIMAGE_COLORORDER_BGR
+
+ typedef ISeekableIOStream *fi_handle;
+
+ struct FreeImageIO
+ {
+ NVAllocatorCallback &m_Allocator;
+ NVFoundationBase &m_Foundation;
+ int (*read_proc)(void *data, int size, int itemSize, fi_handle handle);
+ void (*seek_proc)(fi_handle handle, int offset, int pos);
+ int (*tell_proc)(fi_handle handle);
+ static inline int reader(void *data, int size, int itemSize, fi_handle handle)
+ {
+ NVDataRef<QT3DSU8> theData(toDataRef((QT3DSU8 *)data, (QT3DSU32)size * itemSize));
+ QT3DSU32 amount = handle->Read(theData);
+ return (int)amount;
+ }
+ static inline void seeker(fi_handle handle, int offset, int pos)
+ {
+ SeekPosition::Enum seekPos(SeekPosition::Begin);
+ /*
+#define SEEK_CUR 1
+#define SEEK_END 2
+#define SEEK_SET 0*/
+ switch (pos) {
+ case 0:
+ seekPos = SeekPosition::Begin;
+ break;
+ case 1:
+ seekPos = SeekPosition::Current;
+ break;
+ case 2:
+ seekPos = SeekPosition::End;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ handle->SetPosition(offset, seekPos);
+ }
+ static inline int teller(fi_handle handle) { return (int)handle->GetPosition(); }
+ FreeImageIO(NVAllocatorCallback &alloc, NVFoundationBase &fnd)
+ : m_Allocator(alloc)
+ , m_Foundation(fnd)
+ , read_proc(reader)
+ , seek_proc(seeker)
+ , tell_proc(teller)
+ {
+ }
+ };
+
+ typedef SLoadedTexture FIBITMAP;
+ inline BYTE *FreeImage_GetBits(FIBITMAP *bmp) { return (BYTE *)bmp->data; }
+
+ inline int FreeImage_GetHeight(FIBITMAP *bmp) { return bmp->height; }
+ inline int FreeImage_GetWidth(FIBITMAP *bmp) { return bmp->width; }
+
+#define INPLACESWAP(x, y) eastl::swap(x, y)
+#define MIN(x, y) NVMin(x, y)
+#define MAX(x, y) NVMax(x, y)
+
+#define TRUE 1
+#define FALSE 0
+
+ typedef struct tagBITMAPINFOHEADER
+ {
+ DWORD biSize;
+ LONG biWidth;
+ LONG biHeight;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
+ DWORD biSizeImage;
+ LONG biXPelsPerMeter;
+ LONG biYPelsPerMeter;
+ DWORD biClrUsed;
+ DWORD biClrImportant;
+ } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
+
+ typedef struct tagRGBQUAD
+ {
+#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
+ BYTE rgbBlue;
+ BYTE rgbGreen;
+ BYTE rgbRed;
+#else
+ BYTE rgbRed;
+ BYTE rgbGreen;
+ BYTE rgbBlue;
+#endif // FREEIMAGE_COLORORDER
+ BYTE rgbReserved;
+ } RGBQUAD;
+
+ typedef struct tagRGBTRIPLE
+ {
+#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
+ BYTE rgbtBlue;
+ BYTE rgbtGreen;
+ BYTE rgbtRed;
+#else
+ BYTE rgbtRed;
+ BYTE rgbtGreen;
+ BYTE rgbtBlue;
+#endif // FREEIMAGE_COLORORDER
+ } RGBTRIPLE;
+
+ typedef struct tagBITMAPINFO
+ {
+ BITMAPINFOHEADER bmiHeader;
+ RGBQUAD bmiColors[1];
+ } BITMAPINFO, *PBITMAPINFO;
+
+ typedef struct tagFILE_RGBA
+ {
+ unsigned char r, g, b, a;
+ } FILE_RGBA;
+
+ typedef struct tagFILE_BGRA
+ {
+ unsigned char b, g, r, a;
+ } FILE_BGRA;
+
+ typedef struct tagFILE_RGB
+ {
+ unsigned char r, g, b;
+ } FILE_RGB;
+
+ typedef struct tagFILE_BGR
+ {
+ unsigned char b, g, r;
+ } FILE_BGR;
+
+// Indexes for byte arrays, masks and shifts for treating pixels as words ---
+// These coincide with the order of RGBQUAD and RGBTRIPLE -------------------
+
+#ifndef FREEIMAGE_BIGENDIAN
+#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
+// Little Endian (x86 / MS Windows, Linux) : BGR(A) order
+#define FI_RGBA_RED 2
+#define FI_RGBA_GREEN 1
+#define FI_RGBA_BLUE 0
+#define FI_RGBA_ALPHA 3
+#define FI_RGBA_RED_MASK 0x00FF0000
+#define FI_RGBA_GREEN_MASK 0x0000FF00
+#define FI_RGBA_BLUE_MASK 0x000000FF
+#define FI_RGBA_ALPHA_MASK 0xFF000000
+#define FI_RGBA_RED_SHIFT 16
+#define FI_RGBA_GREEN_SHIFT 8
+#define FI_RGBA_BLUE_SHIFT 0
+#define FI_RGBA_ALPHA_SHIFT 24
+#else
+// Little Endian (x86 / MaxOSX) : RGB(A) order
+#define FI_RGBA_RED 0
+#define FI_RGBA_GREEN 1
+#define FI_RGBA_BLUE 2
+#define FI_RGBA_ALPHA 3
+#define FI_RGBA_RED_MASK 0x000000FF
+#define FI_RGBA_GREEN_MASK 0x0000FF00
+#define FI_RGBA_BLUE_MASK 0x00FF0000
+#define FI_RGBA_ALPHA_MASK 0xFF000000
+#define FI_RGBA_RED_SHIFT 0
+#define FI_RGBA_GREEN_SHIFT 8
+#define FI_RGBA_BLUE_SHIFT 16
+#define FI_RGBA_ALPHA_SHIFT 24
+#endif // FREEIMAGE_COLORORDER
+#else
+#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
+// Big Endian (PPC / none) : BGR(A) order
+#define FI_RGBA_RED 2
+#define FI_RGBA_GREEN 1
+#define FI_RGBA_BLUE 0
+#define FI_RGBA_ALPHA 3
+#define FI_RGBA_RED_MASK 0x0000FF00
+#define FI_RGBA_GREEN_MASK 0x00FF0000
+#define FI_RGBA_BLUE_MASK 0xFF000000
+#define FI_RGBA_ALPHA_MASK 0x000000FF
+#define FI_RGBA_RED_SHIFT 8
+#define FI_RGBA_GREEN_SHIFT 16
+#define FI_RGBA_BLUE_SHIFT 24
+#define FI_RGBA_ALPHA_SHIFT 0
+#else
+// Big Endian (PPC / Linux, MaxOSX) : RGB(A) order
+#define FI_RGBA_RED 0
+#define FI_RGBA_GREEN 1
+#define FI_RGBA_BLUE 2
+#define FI_RGBA_ALPHA 3
+#define FI_RGBA_RED_MASK 0xFF000000
+#define FI_RGBA_GREEN_MASK 0x00FF0000
+#define FI_RGBA_BLUE_MASK 0x0000FF00
+#define FI_RGBA_ALPHA_MASK 0x000000FF
+#define FI_RGBA_RED_SHIFT 24
+#define FI_RGBA_GREEN_SHIFT 16
+#define FI_RGBA_BLUE_SHIFT 8
+#define FI_RGBA_ALPHA_SHIFT 0
+#endif // FREEIMAGE_COLORORDER
+#endif // FREEIMAGE_BIGENDIAN
+
+#define FI_RGBA_RGB_MASK (FI_RGBA_RED_MASK | FI_RGBA_GREEN_MASK | FI_RGBA_BLUE_MASK)
+
+// The 16bit macros only include masks and shifts, since each color element is not byte aligned
+
+#define FI16_555_RED_MASK 0x7C00
+#define FI16_555_GREEN_MASK 0x03E0
+#define FI16_555_BLUE_MASK 0x001F
+#define FI16_555_RED_SHIFT 10
+#define FI16_555_GREEN_SHIFT 5
+#define FI16_555_BLUE_SHIFT 0
+#define FI16_565_RED_MASK 0xF800
+#define FI16_565_GREEN_MASK 0x07E0
+#define FI16_565_BLUE_MASK 0x001F
+#define FI16_565_RED_SHIFT 11
+#define FI16_565_GREEN_SHIFT 5
+#define FI16_565_BLUE_SHIFT 0
+
+ inline unsigned char HINIBBLE(unsigned char byte) { return byte & 0xF0; }
+
+ inline unsigned char LOWNIBBLE(unsigned char byte) { return byte & 0x0F; }
+
+ inline int CalculateUsedBits(int bits)
+ {
+ int bit_count = 0;
+ unsigned bit = 1;
+
+ for (unsigned i = 0; i < 32; i++) {
+ if ((bits & bit) == bit) {
+ bit_count++;
+ }
+
+ bit <<= 1;
+ }
+
+ return bit_count;
+ }
+
+ inline int CalculateLine(int width, int bitdepth) { return ((width * bitdepth) + 7) / 8; }
+
+ inline int CalculatePitch(int line) { return (line + 3) & ~3; }
+
+ inline int CalculateUsedPaletteEntries(int bit_count)
+ {
+ if ((bit_count >= 1) && (bit_count <= 8))
+ return 1 << bit_count;
+
+ return 0;
+ }
+
+ inline unsigned char *CalculateScanLine(unsigned char *bits, unsigned pitch, int scanline)
+ {
+ return (bits + (pitch * scanline));
+ }
+
+ inline void ReplaceExtension(char *result, const char *filename, const char *extension)
+ {
+ for (size_t i = strlen(filename) - 1; i > 0; --i) {
+ if (filename[i] == '.') {
+ memcpy(result, filename, i);
+ result[i] = '.';
+ memcpy(result + i + 1, extension, strlen(extension) + 1);
+ return;
+ }
+ }
+
+ memcpy(result, filename, strlen(filename));
+ result[strlen(filename)] = '.';
+ memcpy(result + strlen(filename) + 1, extension, strlen(extension) + 1);
+ }
+
+ inline BYTE *FreeImage_GetScanLine(FIBITMAP *bmp, int height)
+ {
+ return CalculateScanLine(
+ (BYTE *)bmp->data, CalculatePitch(CalculateLine(bmp->width, bmp->m_BitCount)), height);
+ }
+
+#define DLL_CALLCONV
+
+// ignored for now.
+#define FreeImage_SetDotsPerMeterX(img, dots)
+#define FreeImage_SetDotsPerMeterY(img, dots)
+
+ inline SLoadedTexture *FreeImage_Allocate(int width, int height, int bit_count, FreeImageIO *io)
+ {
+ SLoadedTexture *theTexture = QT3DS_NEW(io->m_Allocator, SLoadedTexture)(io->m_Allocator);
+ int pitch = CalculatePitch(CalculateLine(width, bit_count));
+ QT3DSU32 dataSize = (QT3DSU32)(height * pitch);
+ theTexture->dataSizeInBytes = dataSize;
+ theTexture->data = io->m_Allocator.allocate(dataSize, "image data", __FILE__, __LINE__);
+ memZero(theTexture->data, dataSize);
+ theTexture->width = width;
+ theTexture->height = height;
+ theTexture->m_BitCount = bit_count;
+ // If free image asks us for a palette, we change our format at that time.
+ theTexture->m_ExtendedFormat = ExtendedTextureFormats::CustomRGB;
+ return theTexture;
+ }
+
+ inline SLoadedTexture *FreeImage_Allocate(int width, int height, int bit_count, int rmask,
+ int gmask, int bmask, FreeImageIO *io)
+ {
+ SLoadedTexture *retval = FreeImage_Allocate(width, height, bit_count, io);
+ retval->m_CustomMasks[0] = rmask;
+ retval->m_CustomMasks[1] = gmask;
+ retval->m_CustomMasks[2] = bmask;
+ return retval;
+ }
+
+ inline RGBQUAD *FreeImage_GetPalette(SLoadedTexture *texture)
+ {
+ if (texture->m_Palette == NULL) {
+ texture->m_ExtendedFormat = ExtendedTextureFormats::Palettized;
+ QT3DSU32 memory = 256 * sizeof(RGBQUAD);
+ if (memory) {
+ texture->m_Palette =
+ texture->m_Allocator.allocate(memory, "texture palette", __FILE__, __LINE__);
+ memZero(texture->m_Palette, memory);
+ }
+ }
+ return (RGBQUAD *)texture->m_Palette;
+ }
+
+ inline void FreeImage_Unload(SLoadedTexture *texture) { texture->release(); }
+ inline void FreeImage_OutputMessageProc(int, const char *message, FreeImageIO *io)
+ {
+ Q_UNUSED(io);
+ qCCritical(INVALID_OPERATION, "Error loading image: %s", message);
+ }
+
+ inline void FreeImage_SetBackgroundColor(SLoadedTexture *texture, RGBQUAD *inColor)
+ {
+ if (inColor) {
+ texture->m_BackgroundColor[0] = inColor->rgbRed;
+ texture->m_BackgroundColor[1] = inColor->rgbGreen;
+ texture->m_BackgroundColor[2] = inColor->rgbBlue;
+ } else
+ memSet(texture->m_BackgroundColor, 0, 3);
+ }
+
+ inline void FreeImage_SetTransparencyTable(SLoadedTexture *texture, BYTE *table, int size)
+ {
+ if (texture->m_TransparencyTable)
+ texture->m_Allocator.deallocate(texture->m_TransparencyTable);
+ texture->m_TransparencyTable = NULL;
+ if (table && size) {
+ texture->m_TransparencyTable = (uint8_t *)texture->m_Allocator.allocate(
+ size, "texture transparency table", __FILE__, __LINE__);
+ memCopy(texture->m_TransparencyTable, table, size);
+ }
+ }
+}
+}
+
+using namespace qt3ds::render;
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureGIF.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureGIF.cpp
new file mode 100644
index 0000000..ece4d3a
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureGIF.cpp
@@ -0,0 +1,851 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+// ==========================================================
+// GIF Loader and Writer
+//
+// Design and implementation by
+// - Ryan Rubley <ryan@lostreality.org>
+// - Raphael Gaquer <raphael.gaquer@alcer.com>
+//
+// This file is part of FreeImage 3
+//
+// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
+// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
+// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
+// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
+// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
+// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
+// THIS DISCLAIMER.
+//
+// Use at your own risk!
+// ==========================================================
+#ifdef _MSC_VER
+#pragma warning(disable : 4786) // identifier was truncated to 'number' characters
+#endif
+
+#include "Qt3DSRenderLoadedTextureFreeImageCompat.h"
+#include "EASTL/vector.h"
+#include "EASTL/string.h"
+// ==========================================================
+// Metadata declarations
+// ==========================================================
+
+#define GIF_DISPOSAL_UNSPECIFIED 0
+#define GIF_DISPOSAL_LEAVE 1
+#define GIF_DISPOSAL_BACKGROUND 2
+#define GIF_DISPOSAL_PREVIOUS 3
+
+// ==========================================================
+// Constant/Typedef declarations
+// ==========================================================
+
+struct GIFinfo
+{
+ BOOL read;
+ // only really used when reading
+ size_t global_color_table_offset;
+ int global_color_table_size;
+ BYTE background_color;
+ eastl::vector<size_t> application_extension_offsets;
+ eastl::vector<size_t> comment_extension_offsets;
+ eastl::vector<size_t> graphic_control_extension_offsets;
+ eastl::vector<size_t> image_descriptor_offsets;
+
+ GIFinfo()
+ : read(0)
+ , global_color_table_offset(0)
+ , global_color_table_size(0)
+ , background_color(0)
+ {
+ }
+};
+
+struct PageInfo
+{
+ PageInfo(int d, int l, int t, int w, int h)
+ {
+ disposal_method = d;
+ left = (WORD)l;
+ top = (WORD)t;
+ width = (WORD)w;
+ height = (WORD)h;
+ }
+ int disposal_method;
+ WORD left, top, width, height;
+};
+
+// GIF defines a max of 12 bits per code
+#define MAX_LZW_CODE 4096
+
+class StringTable
+{
+public:
+ StringTable();
+ ~StringTable();
+ void Initialize(int minCodeSize);
+ BYTE *FillInputBuffer(int len);
+ void CompressStart(int bpp, int width);
+ int CompressEnd(BYTE *buf); // 0-4 bytes
+ bool Compress(BYTE *buf, int *len);
+ bool Decompress(BYTE *buf, int *len);
+ void Done(void);
+
+protected:
+ bool m_done;
+
+ int m_minCodeSize, m_clearCode, m_endCode, m_nextCode;
+
+ int m_bpp, m_slack; // Compressor information
+
+ int m_prefix; // Compressor state variable
+ int m_codeSize, m_codeMask; // Compressor/Decompressor state variables
+ int m_oldCode; // Decompressor state variable
+ int m_partial, m_partialSize; // Compressor/Decompressor bit buffer
+
+ int firstPixelPassed; // A specific flag that indicates if the first pixel
+ // of the whole image had already been read
+
+ eastl::string m_strings[MAX_LZW_CODE]; // This is what is really the "string table" data for the
+ // Decompressor
+ int *m_strmap;
+
+ // input buffer
+ BYTE *m_buffer;
+ int m_bufferSize, m_bufferRealSize, m_bufferPos, m_bufferShift;
+
+ void ClearCompressorTable(void);
+ void ClearDecompressorTable(void);
+};
+
+#define GIF_PACKED_LSD_HAVEGCT 0x80
+#define GIF_PACKED_LSD_COLORRES 0x70
+#define GIF_PACKED_LSD_GCTSORTED 0x08
+#define GIF_PACKED_LSD_GCTSIZE 0x07
+#define GIF_PACKED_ID_HAVELCT 0x80
+#define GIF_PACKED_ID_INTERLACED 0x40
+#define GIF_PACKED_ID_LCTSORTED 0x20
+#define GIF_PACKED_ID_RESERVED 0x18
+#define GIF_PACKED_ID_LCTSIZE 0x07
+#define GIF_PACKED_GCE_RESERVED 0xE0
+#define GIF_PACKED_GCE_DISPOSAL 0x1C
+#define GIF_PACKED_GCE_WAITINPUT 0x02
+#define GIF_PACKED_GCE_HAVETRANS 0x01
+
+#define GIF_BLOCK_IMAGE_DESCRIPTOR 0x2C
+#define GIF_BLOCK_EXTENSION 0x21
+#define GIF_BLOCK_TRAILER 0x3B
+
+#define GIF_EXT_PLAINTEXT 0x01
+#define GIF_EXT_GRAPHIC_CONTROL 0xF9
+#define GIF_EXT_COMMENT 0xFE
+#define GIF_EXT_APPLICATION 0xFF
+
+#define GIF_INTERLACE_PASSES 4
+static int g_GifInterlaceOffset[GIF_INTERLACE_PASSES] = { 0, 4, 2, 1 };
+static int g_GifInterlaceIncrement[GIF_INTERLACE_PASSES] = { 8, 8, 4, 2 };
+
+StringTable::StringTable()
+{
+ m_buffer = NULL;
+ firstPixelPassed = 0; // Still no pixel read
+ // Maximum number of entries in the map is MAX_LZW_CODE * 256
+ // (aka 2**12 * 2**8 => a 20 bits key)
+ // This Map could be optmized to only handle MAX_LZW_CODE * 2**(m_bpp)
+ m_strmap = (int *)new int[1 << 20];
+}
+
+StringTable::~StringTable()
+{
+ if (m_buffer != NULL) {
+ delete[] m_buffer;
+ }
+ if (m_strmap != NULL) {
+ delete[] m_strmap;
+ m_strmap = NULL;
+ }
+}
+
+void StringTable::Initialize(int minCodeSize)
+{
+ m_done = false;
+
+ m_bpp = 8;
+ m_minCodeSize = minCodeSize;
+ m_clearCode = 1 << m_minCodeSize;
+ if (m_clearCode > MAX_LZW_CODE) {
+ m_clearCode = MAX_LZW_CODE;
+ }
+ m_endCode = m_clearCode + 1;
+
+ m_partial = 0;
+ m_partialSize = 0;
+
+ m_bufferSize = 0;
+ ClearCompressorTable();
+ ClearDecompressorTable();
+}
+
+BYTE *StringTable::FillInputBuffer(int len)
+{
+ if (m_buffer == NULL) {
+ m_buffer = new BYTE[len];
+ m_bufferRealSize = len;
+ } else if (len > m_bufferRealSize) {
+ delete[] m_buffer;
+ m_buffer = new BYTE[len];
+ m_bufferRealSize = len;
+ }
+ m_bufferSize = len;
+ m_bufferPos = 0;
+ m_bufferShift = 8 - m_bpp;
+ return m_buffer;
+}
+
+void StringTable::CompressStart(int bpp, int width)
+{
+ m_bpp = bpp;
+ m_slack = (8 - ((width * bpp) % 8)) % 8;
+
+ m_partial |= m_clearCode << m_partialSize;
+ m_partialSize += m_codeSize;
+ ClearCompressorTable();
+}
+
+int StringTable::CompressEnd(BYTE *buf)
+{
+ int len = 0;
+
+ // output code for remaining prefix
+ m_partial |= m_prefix << m_partialSize;
+ m_partialSize += m_codeSize;
+ while (m_partialSize >= 8) {
+ *buf++ = (BYTE)m_partial;
+ m_partial >>= 8;
+ m_partialSize -= 8;
+ len++;
+ }
+
+ // add the end of information code and flush the entire buffer out
+ m_partial |= m_endCode << m_partialSize;
+ m_partialSize += m_codeSize;
+ while (m_partialSize > 0) {
+ *buf++ = (BYTE)m_partial;
+ m_partial >>= 8;
+ m_partialSize -= 8;
+ len++;
+ }
+
+ // most this can be is 4 bytes. 7 bits in m_partial to start + 12 for the
+ // last code + 12 for the end code = 31 bits total.
+ return len;
+}
+
+bool StringTable::Compress(BYTE *buf, int *len)
+{
+ if (m_bufferSize == 0 || m_done) {
+ return false;
+ }
+
+ int mask = (1 << m_bpp) - 1;
+ BYTE *bufpos = buf;
+ while (m_bufferPos < m_bufferSize) {
+ // get the current pixel value
+ char ch = (char)((m_buffer[m_bufferPos] >> m_bufferShift) & mask);
+
+ // The next prefix is :
+ // <the previous LZW code (on 12 bits << 8)> | <the code of the current pixel (on 8 bits)>
+ int nextprefix = (((m_prefix) << 8) & 0xFFF00) + (ch & 0x000FF);
+ if (firstPixelPassed) {
+
+ if (m_strmap[nextprefix] > 0) {
+ m_prefix = m_strmap[nextprefix];
+ } else {
+ m_partial |= m_prefix << m_partialSize;
+ m_partialSize += m_codeSize;
+ // grab full bytes for the output buffer
+ while (m_partialSize >= 8 && bufpos - buf < *len) {
+ *bufpos++ = (BYTE)m_partial;
+ m_partial >>= 8;
+ m_partialSize -= 8;
+ }
+
+ // add the code to the "table map"
+ m_strmap[nextprefix] = m_nextCode;
+
+ // increment the next highest valid code, increase the code size
+ if (m_nextCode == (1 << m_codeSize)) {
+ m_codeSize++;
+ }
+ m_nextCode++;
+
+ // if we're out of codes, restart the string table
+ if (m_nextCode == MAX_LZW_CODE) {
+ m_partial |= m_clearCode << m_partialSize;
+ m_partialSize += m_codeSize;
+ ClearCompressorTable();
+ }
+
+ // Only keep the 8 lowest bits (prevent problems with "negative chars")
+ m_prefix = ch & 0x000FF;
+ }
+
+ // increment to the next pixel
+ if (m_bufferShift > 0
+ && !(m_bufferPos + 1 == m_bufferSize && m_bufferShift <= m_slack)) {
+ m_bufferShift -= m_bpp;
+ } else {
+ m_bufferPos++;
+ m_bufferShift = 8 - m_bpp;
+ }
+
+ // jump out here if the output buffer is full
+ if (bufpos - buf == *len) {
+ return true;
+ }
+
+ } else {
+ // Specific behavior for the first pixel of the whole image
+
+ firstPixelPassed = 1;
+ // Only keep the 8 lowest bits (prevent problems with "negative chars")
+ m_prefix = ch & 0x000FF;
+
+ // increment to the next pixel
+ if (m_bufferShift > 0
+ && !(m_bufferPos + 1 == m_bufferSize && m_bufferShift <= m_slack)) {
+ m_bufferShift -= m_bpp;
+ } else {
+ m_bufferPos++;
+ m_bufferShift = 8 - m_bpp;
+ }
+
+ // jump out here if the output buffer is full
+ if (bufpos - buf == *len) {
+ return true;
+ }
+ }
+ }
+
+ m_bufferSize = 0;
+ *len = (int)(bufpos - buf);
+
+ return true;
+}
+
+bool StringTable::Decompress(BYTE *buf, int *len)
+{
+ if (m_bufferSize == 0 || m_done) {
+ return false;
+ }
+
+ BYTE *bufpos = buf;
+ for (; m_bufferPos < m_bufferSize; m_bufferPos++) {
+ m_partial |= (int)m_buffer[m_bufferPos] << m_partialSize;
+ m_partialSize += 8;
+ while (m_partialSize >= m_codeSize) {
+ int code = m_partial & m_codeMask;
+ m_partial >>= m_codeSize;
+ m_partialSize -= m_codeSize;
+
+ if (code > m_nextCode || (m_nextCode == MAX_LZW_CODE && code != m_clearCode)
+ || code == m_endCode) {
+ m_done = true;
+ *len = (int)(bufpos - buf);
+ return true;
+ }
+ if (code == m_clearCode) {
+ ClearDecompressorTable();
+ continue;
+ }
+
+ // add new string to string table, if not the first pass since a clear code
+ if (m_oldCode != MAX_LZW_CODE) {
+ m_strings[m_nextCode] =
+ m_strings[m_oldCode] + m_strings[code == m_nextCode ? m_oldCode : code][0];
+ }
+
+ if ((int)m_strings[code].size() > *len - (bufpos - buf)) {
+ // out of space, stuff the code back in for next time
+ m_partial <<= m_codeSize;
+ m_partialSize += m_codeSize;
+ m_partial |= code;
+ m_bufferPos++;
+ *len = (int)(bufpos - buf);
+ return true;
+ }
+
+ // output the string into the buffer
+ memcpy(bufpos, m_strings[code].data(), m_strings[code].size());
+ bufpos += m_strings[code].size();
+
+ // increment the next highest valid code, add a bit to the mask if we need to increase
+ // the code size
+ if (m_oldCode != MAX_LZW_CODE && m_nextCode < MAX_LZW_CODE) {
+ if (++m_nextCode < MAX_LZW_CODE) {
+ if ((m_nextCode & m_codeMask) == 0) {
+ m_codeSize++;
+ m_codeMask |= m_nextCode;
+ }
+ }
+ }
+
+ m_oldCode = code;
+ }
+ }
+
+ m_bufferSize = 0;
+ *len = (int)(bufpos - buf);
+
+ return true;
+}
+
+void StringTable::Done(void)
+{
+ m_done = true;
+}
+
+void StringTable::ClearCompressorTable(void)
+{
+ if (m_strmap) {
+ memset(m_strmap, 0xFF, sizeof(unsigned int) * (1 << 20));
+ }
+ m_nextCode = m_endCode + 1;
+
+ m_prefix = 0;
+ m_codeSize = m_minCodeSize + 1;
+}
+
+void StringTable::ClearDecompressorTable(void)
+{
+ for (int i = 0; i < m_clearCode; i++) {
+ m_strings[i].resize(1);
+ m_strings[i][0] = (char)i;
+ }
+ m_nextCode = m_endCode + 1;
+
+ m_codeSize = m_minCodeSize + 1;
+ m_codeMask = (1 << m_codeSize) - 1;
+ m_oldCode = MAX_LZW_CODE;
+}
+
+// ==========================================================
+// Plugin Interface
+// ==========================================================
+
+static int s_format_id;
+
+// ==========================================================
+// Plugin Implementation
+// ==========================================================
+
+static BOOL DLL_CALLCONV Validate(FreeImageIO *io, fi_handle handle)
+{
+ char buf[6];
+ if (io->read_proc(buf, 6, 1, handle) < 1) {
+ return FALSE;
+ }
+
+ BOOL bResult = FALSE;
+ if (!strncmp(buf, "GIF", 3)) {
+ if (buf[3] >= '0' && buf[3] <= '9' && buf[4] >= '0' && buf[4] <= '9' && buf[5] >= 'a'
+ && buf[5] <= 'z') {
+ bResult = TRUE;
+ }
+ }
+
+ io->seek_proc(handle, -6, SEEK_CUR);
+
+ return bResult;
+}
+
+// ----------------------------------------------------------
+
+static void *DLL_CALLCONV Open(FreeImageIO *io, fi_handle handle)
+{
+ GIFinfo *info = new GIFinfo;
+ if (info == NULL) {
+ return NULL;
+ }
+ BOOL read = TRUE;
+
+ // 25/02/2008 MDA: Not safe to memset GIFinfo structure with VS 2008 (safe iterators),
+ // perform initialization in constructor instead.
+ // memset(info, 0, sizeof(GIFinfo));
+
+ info->read = read;
+ try {
+ // Header
+ if (!Validate(io, handle)) {
+ throw "Not a GIF file";
+ }
+ io->seek_proc(handle, 6, SEEK_CUR);
+
+ // Logical Screen Descriptor
+ io->seek_proc(handle, 4, SEEK_CUR);
+ BYTE packed;
+ if (io->read_proc(&packed, 1, 1, handle) < 1) {
+ throw "EOF reading Logical Screen Descriptor";
+ }
+ if (io->read_proc(&info->background_color, 1, 1, handle) < 1) {
+ throw "EOF reading Logical Screen Descriptor";
+ }
+ io->seek_proc(handle, 1, SEEK_CUR);
+
+ // Global Color Table
+ if (packed & GIF_PACKED_LSD_HAVEGCT) {
+ info->global_color_table_offset = io->tell_proc(handle);
+ info->global_color_table_size = 2 << (packed & GIF_PACKED_LSD_GCTSIZE);
+ io->seek_proc(handle, 3 * info->global_color_table_size, SEEK_CUR);
+ }
+
+ // Scan through all the rest of the blocks, saving offsets
+ size_t gce_offset = 0;
+ BYTE block = 0;
+ while (block != GIF_BLOCK_TRAILER) {
+ if (io->read_proc(&block, 1, 1, handle) < 1) {
+ throw "EOF reading blocks";
+ }
+ if (block == GIF_BLOCK_IMAGE_DESCRIPTOR) {
+ info->image_descriptor_offsets.push_back(io->tell_proc(handle));
+ // GCE may be 0, meaning no GCE preceded this ID
+ info->graphic_control_extension_offsets.push_back(gce_offset);
+ gce_offset = 0;
+
+ io->seek_proc(handle, 8, SEEK_CUR);
+ if (io->read_proc(&packed, 1, 1, handle) < 1) {
+ throw "EOF reading Image Descriptor";
+ }
+
+ // Local Color Table
+ if (packed & GIF_PACKED_ID_HAVELCT) {
+ io->seek_proc(handle, 3 * (2 << (packed & GIF_PACKED_ID_LCTSIZE)), SEEK_CUR);
+ }
+
+ // LZW Minimum Code Size
+ io->seek_proc(handle, 1, SEEK_CUR);
+ } else if (block == GIF_BLOCK_EXTENSION) {
+ BYTE ext;
+ if (io->read_proc(&ext, 1, 1, handle) < 1) {
+ throw "EOF reading extension";
+ }
+
+ if (ext == GIF_EXT_GRAPHIC_CONTROL) {
+ // overwrite previous offset if more than one GCE found before an ID
+ gce_offset = io->tell_proc(handle);
+ } else if (ext == GIF_EXT_COMMENT) {
+ info->comment_extension_offsets.push_back(io->tell_proc(handle));
+ } else if (ext == GIF_EXT_APPLICATION) {
+ info->application_extension_offsets.push_back(io->tell_proc(handle));
+ }
+ } else if (block == GIF_BLOCK_TRAILER) {
+ continue;
+ } else {
+ throw "Invalid GIF block found";
+ }
+
+ // Data Sub-blocks
+ BYTE len;
+ if (io->read_proc(&len, 1, 1, handle) < 1) {
+ throw "EOF reading sub-block";
+ }
+ while (len != 0) {
+ io->seek_proc(handle, len, SEEK_CUR);
+ if (io->read_proc(&len, 1, 1, handle) < 1) {
+ throw "EOF reading sub-block";
+ }
+ }
+ }
+ } catch (const char *msg) {
+ FreeImage_OutputMessageProc(s_format_id, msg, io);
+ delete info;
+ return NULL;
+ }
+
+ return info;
+}
+
+static FIBITMAP *DLL_CALLCONV DoLoadGIF(FreeImageIO *io, fi_handle handle, int flags, void *data)
+{
+ if (data == NULL) {
+ return NULL;
+ }
+ (void)flags;
+ GIFinfo *info = (GIFinfo *)data;
+
+ int page = 0;
+ FIBITMAP *dib = NULL;
+ try {
+ bool have_transparent = false, no_local_palette = false, interlaced = false;
+ int disposal_method = GIF_DISPOSAL_LEAVE, transparent_color = 0;
+ WORD left, top, width, height;
+ BYTE packed, b;
+ WORD w;
+
+ // Image Descriptor
+ io->seek_proc(handle, (long)info->image_descriptor_offsets[page], SEEK_SET);
+ io->read_proc(&left, 2, 1, handle);
+ io->read_proc(&top, 2, 1, handle);
+ io->read_proc(&width, 2, 1, handle);
+ io->read_proc(&height, 2, 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapShort(&left);
+ SwapShort(&top);
+ SwapShort(&width);
+ SwapShort(&height);
+#endif
+ io->read_proc(&packed, 1, 1, handle);
+ interlaced = (packed & GIF_PACKED_ID_INTERLACED) ? true : false;
+ no_local_palette = (packed & GIF_PACKED_ID_HAVELCT) ? false : true;
+
+ int bpp = 8;
+ if (!no_local_palette) {
+ int size = 2 << (packed & GIF_PACKED_ID_LCTSIZE);
+ if (size <= 2)
+ bpp = 1;
+ else if (size <= 16)
+ bpp = 4;
+ } else if (info->global_color_table_offset != 0) {
+ if (info->global_color_table_size <= 2)
+ bpp = 1;
+ else if (info->global_color_table_size <= 16)
+ bpp = 4;
+ }
+ dib = FreeImage_Allocate(width, height, bpp, io);
+ if (dib == NULL) {
+ throw "DIB allocated failed";
+ }
+
+ // Palette
+ RGBQUAD *pal = FreeImage_GetPalette(dib);
+ if (!no_local_palette) {
+ int size = 2 << (packed & GIF_PACKED_ID_LCTSIZE);
+
+ int i = 0;
+ while (i < size) {
+ io->read_proc(&pal[i].rgbRed, 1, 1, handle);
+ io->read_proc(&pal[i].rgbGreen, 1, 1, handle);
+ io->read_proc(&pal[i].rgbBlue, 1, 1, handle);
+ i++;
+ }
+ } else if (info->global_color_table_offset != 0) {
+ long pos = io->tell_proc(handle);
+ io->seek_proc(handle, (long)info->global_color_table_offset, SEEK_SET);
+
+ int i = 0;
+ while (i < info->global_color_table_size) {
+ io->read_proc(&pal[i].rgbRed, 1, 1, handle);
+ io->read_proc(&pal[i].rgbGreen, 1, 1, handle);
+ io->read_proc(&pal[i].rgbBlue, 1, 1, handle);
+ i++;
+ }
+
+ io->seek_proc(handle, pos, SEEK_SET);
+ } else {
+ // its legal to have no palette, but we're going to generate *something*
+ for (int i = 0; i < 256; i++) {
+ pal[i].rgbRed = (BYTE)i;
+ pal[i].rgbGreen = (BYTE)i;
+ pal[i].rgbBlue = (BYTE)i;
+ }
+ }
+
+ // LZW Minimum Code Size
+ io->read_proc(&b, 1, 1, handle);
+ StringTable *stringtable = new StringTable;
+ stringtable->Initialize(b);
+
+ // Image Data Sub-blocks
+ int x = 0, xpos = 0, y = 0, shift = 8 - bpp, mask = (1 << bpp) - 1, interlacepass = 0;
+ BYTE *scanline = FreeImage_GetScanLine(dib, height - 1);
+ BYTE buf[4096];
+ io->read_proc(&b, 1, 1, handle);
+ while (b) {
+ io->read_proc(stringtable->FillInputBuffer(b), b, 1, handle);
+ int size = sizeof(buf);
+ while (stringtable->Decompress(buf, &size)) {
+ for (int i = 0; i < size; i++) {
+ scanline[xpos] |= (buf[i] & mask) << shift;
+ if (shift > 0) {
+ shift -= bpp;
+ } else {
+ xpos++;
+ shift = 8 - bpp;
+ }
+ if (++x >= width) {
+ if (interlaced) {
+ y += g_GifInterlaceIncrement[interlacepass];
+ if (y >= height && ++interlacepass < GIF_INTERLACE_PASSES) {
+ y = g_GifInterlaceOffset[interlacepass];
+ }
+ } else {
+ y++;
+ }
+ if (y >= height) {
+ stringtable->Done();
+ break;
+ }
+ x = xpos = 0;
+ shift = 8 - bpp;
+ scanline = FreeImage_GetScanLine(dib, height - y - 1);
+ }
+ }
+ size = sizeof(buf);
+ }
+ io->read_proc(&b, 1, 1, handle);
+ }
+
+ if (page == 0) {
+ QT3DSU32 idx;
+
+ // Logical Screen Descriptor
+ io->seek_proc(handle, 6, SEEK_SET);
+ WORD logicalwidth, logicalheight;
+ io->read_proc(&logicalwidth, 2, 1, handle);
+ io->read_proc(&logicalheight, 2, 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapShort(&logicalwidth);
+ SwapShort(&logicalheight);
+#endif
+
+ // Global Color Table
+ if (info->global_color_table_offset != 0) {
+ RGBQUAD globalpalette[256];
+ io->seek_proc(handle, (long)info->global_color_table_offset, SEEK_SET);
+ int i = 0;
+ while (i < info->global_color_table_size) {
+ io->read_proc(&globalpalette[i].rgbRed, 1, 1, handle);
+ io->read_proc(&globalpalette[i].rgbGreen, 1, 1, handle);
+ io->read_proc(&globalpalette[i].rgbBlue, 1, 1, handle);
+ globalpalette[i].rgbReserved = 0;
+ i++;
+ }
+ // background color
+ if (info->background_color < info->global_color_table_size) {
+ FreeImage_SetBackgroundColor(dib, &globalpalette[info->background_color]);
+ }
+ }
+
+ // Application Extension
+ LONG loop = 1; // If no AE with a loop count is found, the default must be 1
+ for (idx = 0; idx < info->application_extension_offsets.size(); idx++) {
+ io->seek_proc(handle, (long)info->application_extension_offsets[idx], SEEK_SET);
+ io->read_proc(&b, 1, 1, handle);
+ if (b == 11) { // All AEs start with an 11 byte sub-block to determine what type of
+ // AE it is
+ char buf[11];
+ io->read_proc(buf, 11, 1, handle);
+ if (!memcmp(buf, "NETSCAPE2.0", 11)
+ || !memcmp(buf, "ANIMEXTS1.0",
+ 11)) { // Not everybody recognizes ANIMEXTS1.0 but it is valid
+ io->read_proc(&b, 1, 1, handle);
+ if (b == 3) { // we're supposed to have a 3 byte sub-block now
+ io->read_proc(&b, 1, 1,
+ handle); // this should be 0x01 but isn't really important
+ io->read_proc(&w, 2, 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapShort(&w);
+#endif
+ loop = w;
+ if (loop > 0)
+ loop++;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Graphic Control Extension
+ if (info->graphic_control_extension_offsets[page] != 0) {
+ io->seek_proc(handle, (long)(info->graphic_control_extension_offsets[page] + 1),
+ SEEK_SET);
+ io->read_proc(&packed, 1, 1, handle);
+ io->read_proc(&w, 2, 1, handle);
+#ifdef FREEIMAGE_BIGENDIAN
+ SwapShort(&w);
+#endif
+ io->read_proc(&b, 1, 1, handle);
+ have_transparent = (packed & GIF_PACKED_GCE_HAVETRANS) ? true : false;
+ disposal_method = (packed & GIF_PACKED_GCE_DISPOSAL) >> 2;
+
+ transparent_color = b;
+ if (have_transparent) {
+ int size = 1 << bpp;
+ if (transparent_color <= size) {
+ BYTE table[256];
+ memset(table, 0xFF, size);
+ table[transparent_color] = 0;
+ FreeImage_SetTransparencyTable(dib, table, size);
+ dib->m_TransparentPaletteIndex = b;
+ }
+ }
+ }
+ b = (BYTE)disposal_method;
+
+ delete stringtable;
+
+ } catch (const char *msg) {
+ if (dib != NULL) {
+ FreeImage_Unload(dib);
+ }
+ FreeImage_OutputMessageProc(s_format_id, msg, io);
+ return NULL;
+ }
+
+ return dib;
+}
+
+static void DLL_CALLCONV Close(void *data)
+{
+ if (data == NULL) {
+ return;
+ }
+ GIFinfo *info = (GIFinfo *)data;
+ delete info;
+}
+
+SLoadedTexture *SLoadedTexture::LoadGIF(ISeekableIOStream &inStream, bool inFlipY,
+ NVFoundationBase &inFnd,
+ qt3ds::render::NVRenderContextType renderContextType)
+{
+ Q_UNUSED(renderContextType)
+ FreeImageIO theIO(inFnd.getAllocator(), inFnd);
+ void *gifData = Open(&theIO, &inStream);
+ if (gifData) {
+ SLoadedTexture *retval = DoLoadGIF(&theIO, &inStream, 0, gifData);
+ Close(gifData);
+ if (retval)
+ retval->FreeImagePostProcess(inFlipY);
+ return retval;
+ }
+ return NULL;
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureHDR.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureHDR.cpp
new file mode 100644
index 0000000..defff29
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureHDR.cpp
@@ -0,0 +1,255 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+// ==========================================================
+// Radiance RGBE .HDR Loader
+// Decodes Radiance RGBE HDR image into FP16 texture buffer.
+//
+// Implementation by
+// Parashar Krishnamachari (parashark@nvidia.com)
+//
+// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
+// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
+// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
+// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
+// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
+// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
+// THIS DISCLAIMER.
+//
+// Use at your own risk!
+// ==========================================================
+
+#include "Qt3DSRenderLoadedTextureFreeImageCompat.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+typedef unsigned char RGBE[4];
+#define R 0
+#define G 1
+#define B 2
+#define E 3
+
+#define MINELEN 8 // minimum scanline length for encoding
+#define MAXELEN 0x7fff // maximum scanline length for encoding
+
+static int s_format_id;
+
+static float convertComponent(int exponent, int val)
+{
+ float v = val / (256.0f);
+ float d = powf(2.0f, (float)exponent - 128.0f);
+ return v * d;
+}
+
+static void decrunchScanlineOld(FreeImageIO *io, fi_handle handle, RGBE *scanline, int width)
+{
+ int i;
+ int rshift = 0;
+
+ while (width > 0) {
+ io->read_proc(scanline, 4, 1, handle);
+
+ // The older version of RLE encodes the length in the exponent.
+ // and marks a run with 1, 1, 1 in RGB. This is differentiated from
+ // a raw value of 1, 1, 1, by having a exponent of 0;
+ if (scanline[0][R] == 1 && scanline[0][G] == 1 && scanline[0][B] == 1) {
+ for (i = (scanline[0][E] << rshift); i > 0; --i) {
+ memcpy(&scanline[0][0], &scanline[-1][0], 4);
+ ++scanline;
+ --width;
+ }
+ rshift += 8;
+ } else {
+ ++scanline;
+ --width;
+ rshift = 0;
+ }
+ }
+}
+
+static void decrunchScanline(FreeImageIO *io, fi_handle handle, RGBE *scanline, int width)
+{
+ if ((width < MINELEN) || (width > MAXELEN)) {
+ decrunchScanlineOld(io, handle, scanline, width);
+ return;
+ }
+
+ char c;
+ io->read_proc(&c, 1, 1, handle);
+ if (c != 2) {
+ io->seek_proc(handle, -1, SEEK_CUR);
+ decrunchScanlineOld(io, handle, scanline, width);
+ return;
+ }
+
+ io->read_proc(&(scanline[0][G]), 1, 1, handle);
+ io->read_proc(&(scanline[0][B]), 1, 1, handle);
+ io->read_proc(&c, 1, 1, handle);
+
+ if (scanline[0][G] != 2 || scanline[0][B] & 128) {
+ scanline[0][R] = 2;
+ scanline[0][E] = c;
+ decrunchScanlineOld(io, handle, scanline + 1, width - 1);
+ }
+
+ // RLE-encoded version does a separate buffer for each channel per scanline
+ for (int i = 0; i < 4; ++i) {
+ for (int j = 0; j < width;) {
+ unsigned char code, val;
+ io->read_proc(&code, 1, 1, handle);
+ if (code
+ > 128) // RLE-encoded run... read 1 value and copy it forward for some n count.
+ {
+ code &= 127;
+ io->read_proc(&val, 1, 1, handle);
+ while (code--)
+ scanline[j++][i] = val;
+ } else // Not a run, so we read it as raw data
+ {
+ // Note -- we store each pixel in memory 4 bytes apart, so we can't just
+ // do one long read.
+ while (code--)
+ io->read_proc(&(scanline[j++][i]), 1, 1, handle);
+ }
+ }
+ }
+}
+
+static void decodeScanlineToTexture(RGBE *scanline, int width, void *outBuf, QT3DSU32 offset,
+ NVRenderTextureFormats::Enum inFormat)
+{
+ float rgbaF32[4];
+
+ for (int i = 0; i < width; ++i) {
+ rgbaF32[R] = convertComponent(scanline[i][E], scanline[i][R]);
+ rgbaF32[G] = convertComponent(scanline[i][E], scanline[i][G]);
+ rgbaF32[B] = convertComponent(scanline[i][E], scanline[i][B]);
+ rgbaF32[3] = 1.0f;
+
+ QT3DSU8 *target = reinterpret_cast<QT3DSU8 *>(outBuf);
+ target += offset;
+ NVRenderTextureFormats::encodeToPixel(
+ rgbaF32, target, i * NVRenderTextureFormats::getSizeofFormat(inFormat), inFormat);
+ }
+}
+
+static FIBITMAP *DoLoadHDR(FreeImageIO *io, fi_handle handle,
+ NVRenderTextureFormats::Enum inFormat = NVRenderTextureFormats::RGB32F)
+{
+ FIBITMAP *dib = NULL;
+ try {
+ if (handle != NULL) {
+ char str[200];
+ int i;
+
+ // Make sure it's a Radiance RGBE file
+ io->read_proc(str, 10, 1, handle);
+ if (memcmp(str, "#?RADIANCE", 10)) {
+ throw "Invalid HDR file";
+ }
+
+ io->seek_proc(handle, 1, SEEK_CUR);
+
+ // Get the command string (it's not really important for us; We're always assuming
+ // 32bit_rle_rgbe is the format
+ // we're just reading it to skip ahead the correct number of bytes).
+ i = 0;
+ char c = 0, prevC;
+ do {
+ prevC = c;
+ io->read_proc(&c, 1, 1, handle);
+ str[i++] = c;
+ } while (!(c == 0xa && prevC == 0xa));
+
+ // Get the resolution string (it will be NULL-terminated for us)
+ char res[200];
+ i = 0;
+ do {
+ io->read_proc(&c, 1, 1, handle);
+ res[i++] = c;
+ } while (c != 0xa);
+ res[i] = 0;
+
+ int width, height;
+ if (!sscanf(res, "-Y %d +X %d", &height, &width)) {
+ throw "Error encountered while loading HDR stream : could not determine image "
+ "resolution!";
+ }
+ int bytesPerPixel = NVRenderTextureFormats::getSizeofFormat(inFormat);
+ dib = FreeImage_Allocate(width, height, bytesPerPixel * 8, io);
+ if (dib == NULL) {
+ throw "DIB allocation failed";
+ }
+
+ dib->format = inFormat;
+ dib->components = NVRenderTextureFormats::getNumberOfComponent(inFormat);
+
+ // Allocate a scanline worth of RGBE data
+ RGBE *scanline = new RGBE[width];
+ if (!scanline) {
+ throw "Error encountered while loading HDR stream : could not buffer scanlines!";
+ }
+
+ // Go through all the scanlines
+ for (int y = 0; y < height; ++y) {
+ QT3DSU32 byteOfs = (height - 1 - y) * width * bytesPerPixel;
+ decrunchScanline(io, handle, scanline, width);
+ decodeScanlineToTexture(scanline, width, dib->data, byteOfs, inFormat);
+ }
+ }
+ return dib;
+ } catch (const char *message) {
+ if (dib) {
+ FreeImage_Unload(dib);
+ }
+ if (message) {
+ FreeImage_OutputMessageProc(s_format_id, message, io);
+ }
+ }
+
+ return NULL;
+}
+
+SLoadedTexture *SLoadedTexture::LoadHDR(ISeekableIOStream &inStream, NVFoundationBase &inFnd,
+ qt3ds::render::NVRenderContextType renderContextType)
+{
+ FreeImageIO theIO(inFnd.getAllocator(), inFnd);
+ SLoadedTexture *retval = nullptr;
+ if (renderContextType == qt3ds::render::NVRenderContextValues::GLES2)
+ retval = DoLoadHDR(&theIO, &inStream, NVRenderTextureFormats::RGBA8);
+ else
+ retval = DoLoadHDR(&theIO, &inStream, NVRenderTextureFormats::RGBA16F);
+
+
+ // Let's just assume we don't support this just yet.
+ // if ( retval )
+ // retval->FreeImagePostProcess( inFlipY );
+ return retval;
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.cpp
new file mode 100644
index 0000000..b1d4b05
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.cpp
@@ -0,0 +1,277 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/IOStreams.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+#include "Qt3DSRenderLoadedTexture.h"
+#include "Qt3DSRenderLoadedTextureKTX.h"
+#include "Qt3DSRenderLoadedTextureDDS.h"
+
+#include <qendian.h>
+#include <qopengltexture.h>
+
+using namespace qt3ds::render;
+using namespace qt3ds::foundation;
+
+namespace qt3ds {
+namespace render {
+
+static inline int blockSizeForTextureFormat(int format)
+{
+ switch (format) {
+ case QOpenGLTexture::RGB8_ETC1:
+ case QOpenGLTexture::RGB8_ETC2:
+ case QOpenGLTexture::SRGB8_ETC2:
+ case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
+ case QOpenGLTexture::R11_EAC_UNorm:
+ case QOpenGLTexture::R11_EAC_SNorm:
+ case QOpenGLTexture::RGB_DXT1:
+ return 8;
+
+ default:
+ return 16;
+ }
+}
+
+static inline int runtimeFormat(quint32 internalFormat)
+{
+ switch (internalFormat) {
+ case QOpenGLTexture::RGB8_ETC1:
+ return NVRenderTextureFormats::RGB8_ETC1;
+ case QOpenGLTexture::RGB8_ETC2:
+ return NVRenderTextureFormats::RGB8_ETC2;
+ case QOpenGLTexture::SRGB8_ETC2:
+ return NVRenderTextureFormats::SRGB8_ETC2;
+ case QOpenGLTexture::RGB8_PunchThrough_Alpha1_ETC2:
+ return NVRenderTextureFormats::RGB8_PunchThrough_Alpha1_ETC2;
+ case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2:
+ return NVRenderTextureFormats::SRGB8_PunchThrough_Alpha1_ETC2;
+ case QOpenGLTexture::R11_EAC_UNorm:
+ return NVRenderTextureFormats::R11_EAC_UNorm;
+ case QOpenGLTexture::R11_EAC_SNorm:
+ return NVRenderTextureFormats::R11_EAC_SNorm;
+ case QOpenGLTexture::RGB_DXT1:
+ return NVRenderTextureFormats::RGB_DXT1;
+ case QOpenGLTexture::RGBA_DXT1:
+ return NVRenderTextureFormats::RGBA_DXT3;
+ case QOpenGLTexture::RGBA_DXT3:
+ return NVRenderTextureFormats::RGBA_DXT3;
+ case QOpenGLTexture::RGBA_DXT5:
+ return NVRenderTextureFormats::RGBA_DXT5;
+ default:
+ break;
+ }
+ return NVRenderTextureFormats::Unknown;
+}
+
+static inline int imageSize(QT3DSI32 width, QT3DSI32 height, const Qt3DSDDSImage *image)
+{
+ return ((width + 3) / 4) * ((height + 3) / 4)
+ * blockSizeForTextureFormat(image->internalFormat);
+}
+
+static inline quint32 totalImageDataSize(Qt3DSDDSImage *image)
+{
+ int i, j;
+ int index = 0;
+ quint32 size = 0;
+ int w, h;
+ int cubeCount = image->cubemap ? 6 : 1;
+
+ for (j = 0; j < cubeCount; j++) {
+ w = image->width;
+ h = image->height;
+
+ for (i = 0; i < image->numMipmaps; i++) // account for base plus each mip
+ {
+ size += 4; // image size is saved in the file
+ image->size[index] = imageSize(w, h, image);
+ image->mipwidth[index] = w;
+ image->mipheight[index] = h;
+ size += quint32(image->size[index]);
+ if (w != 1)
+ w >>= 1;
+ if (h != 1)
+ h >>= 1;
+
+ index++;
+ }
+ }
+
+ return (size);
+}
+
+static inline quint32 alignedOffset(quint32 offset, quint32 byteAlign)
+{
+ return (offset + byteAlign - 1) & ~(byteAlign - 1);
+}
+
+inline SLoadedTexture *loadKtx(NVAllocatorCallback &allocator, IInStream &inStream,
+ QT3DSI32 flipVertical)
+{
+ static const int KTX_IDENTIFIER_LENGTH = 12;
+ static const char ktxIdentifier[KTX_IDENTIFIER_LENGTH] = {
+ '\xAB', 'K', 'T', 'X', ' ', '1', '1', '\xBB', '\r', '\n', '\x1A', '\n'
+ };
+ static const quint32 platformEndianIdentifier = 0x04030201;
+ static const quint32 inversePlatformEndianIdentifier = 0x01020304;
+
+ struct KTXHeader {
+ quint8 identifier[KTX_IDENTIFIER_LENGTH];
+ quint32 endianness;
+ quint32 glType;
+ quint32 glTypeSize;
+ quint32 glFormat;
+ quint32 glInternalFormat;
+ quint32 glBaseInternalFormat;
+ quint32 pixelWidth;
+ quint32 pixelHeight;
+ quint32 pixelDepth;
+ quint32 numberOfArrayElements;
+ quint32 numberOfFaces;
+ quint32 numberOfMipmapLevels;
+ quint32 bytesOfKeyValueData;
+ };
+
+ KTXHeader header;
+ if (inStream.Read(header) != sizeof(header)
+ || qstrncmp(reinterpret_cast<char *>(header.identifier),
+ ktxIdentifier, KTX_IDENTIFIER_LENGTH) != 0
+ || (header.endianness != platformEndianIdentifier
+ && header.endianness != inversePlatformEndianIdentifier)) {
+ return nullptr;
+ }
+
+ const bool isInverseEndian = (header.endianness == inversePlatformEndianIdentifier);
+ auto decode = [isInverseEndian](quint32 val) {
+ return isInverseEndian ? qbswap<quint32>(val) : val;
+ };
+
+ const bool isCompressed = decode(header.glType) == 0 && decode(header.glFormat) == 0
+ && decode(header.glTypeSize) == 1;
+ if (!isCompressed) {
+ qWarning("Uncompressed ktx texture data is not supported");
+ return nullptr;
+ }
+
+ if (decode(header.numberOfArrayElements) != 0) {
+ qWarning("Array ktx textures not supported");
+ return nullptr;
+ }
+
+ if (decode(header.pixelDepth) != 0) {
+ qWarning("Only 2D and cube ktx textures are supported");
+ return nullptr;
+ }
+
+ const int bytesToSkip = int(decode(header.bytesOfKeyValueData));
+ QVector<uint8_t> skipData;
+ skipData.resize(bytesToSkip);
+ if (inStream.Read(NVDataRef<uint8_t>(skipData.data(), bytesToSkip)) != bytesToSkip) {
+ qWarning("Unexpected end of ktx data");
+ return nullptr;
+ }
+
+ // now for each mipmap level we have (arrays and 3d textures not supported here)
+ // uint32 imageSize
+ // for each array element
+ // for each face
+ // for each z slice
+ // compressed data
+ // padding so that each face data starts at an offset that is a multiple of 4
+ // padding so that each imageSize starts at an offset that is a multiple of 4
+
+ Qt3DSDDSImage *image = (Qt3DSDDSImage *)QT3DS_ALLOC(allocator, sizeof(Qt3DSDDSImage), "DoLoadDDS");
+
+ const quint32 level0Width = decode(header.pixelWidth);
+ const quint32 level0Height = decode(header.pixelHeight);
+ quint32 faceCount = decode(header.numberOfFaces);
+ const quint32 mipMapLevels = decode(header.numberOfMipmapLevels);
+ const quint32 format = decode(header.glInternalFormat);
+ image->numMipmaps = int(mipMapLevels);
+ image->cubemap = faceCount == 6 ? 6 : 0;
+ image->internalFormat = int(format);
+ image->format = runtimeFormat(format);
+ image->width = int(level0Width);
+ image->height = int(level0Height);
+ image->compressed = 1;
+ quint32 totalSize = totalImageDataSize(image);
+ image->dataBlock = QT3DS_ALLOC(allocator, totalSize, "Qt3DSDDSAllocDataBlock");
+ if (inStream.Read(NVDataRef<uint8_t>(reinterpret_cast<uint8_t*>(image->dataBlock), totalSize))
+ != totalSize) {
+ QT3DS_FREE(allocator, image);
+ return nullptr;
+ }
+
+ SLoadedTexture *result = QT3DS_NEW(allocator, SLoadedTexture)(allocator);
+ result->dds = image;
+ result->width = int(level0Width);
+ result->height = int(level0Height);
+ result->format = static_cast<NVRenderTextureFormats::Enum>(image->format);
+
+ // TODO: Proper support for cubemaps should be implemented at some point.
+ if (faceCount > 1) {
+ qWarning("Multiple faces (cubemaps) not currently supported in ktx");
+ faceCount = 1;
+ }
+
+ uint8_t *p = reinterpret_cast<uint8_t *>(image->dataBlock);
+ uint8_t *basep = p;
+
+ for (quint32 mip = 0; mip < mipMapLevels; ++mip) {
+ if (p + 4 - basep > totalSize)
+ break;
+ const quint32 imageSize = *reinterpret_cast<const quint32 *>(p);
+ p += 4;
+ for (quint32 face = 0; face < faceCount; ++face) {
+ const quint32 nextOffset = quint32(p + imageSize - basep);
+ if (nextOffset > totalSize)
+ break;
+ image->data[mip] = reinterpret_cast<void *>(p);
+ p = basep + alignedOffset(nextOffset, 4);
+ }
+ }
+
+ return result;
+}
+
+SLoadedTexture *SLoadedTexture::LoadKTX(IInStream &inStream, QT3DSI32 flipVertical,
+ NVFoundationBase &inFnd,
+ qt3ds::render::NVRenderContextType renderContextType)
+{
+ Q_UNUSED(renderContextType)
+ SLoadedTexture *retval = loadKtx(inFnd.getAllocator(), inStream, flipVertical);
+
+ return retval;
+}
+
+}
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.h b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.h
new file mode 100644
index 0000000..3a2d762
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureKTX.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_RENDER_LOAD_KTX_H
+#define QT3DS_RENDER_LOAD_KTX_H
+
+namespace qt3ds {
+namespace render {
+
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.cpp
new file mode 100644
index 0000000..023964f
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.cpp
@@ -0,0 +1,599 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSRenderPrefilterTexture.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderShaderProgram.h"
+
+#include <string>
+
+using namespace qt3ds;
+using namespace qt3ds::render;
+using namespace qt3ds::foundation;
+
+Qt3DSRenderPrefilterTexture::Qt3DSRenderPrefilterTexture(NVRenderContext *inNVRenderContext,
+ QT3DSI32 inWidth, QT3DSI32 inHeight,
+ NVRenderTexture2D &inTexture2D,
+ NVRenderTextureFormats::Enum inDestFormat,
+ NVFoundationBase &inFnd)
+ : m_Foundation(inFnd)
+ , mRefCount(0)
+ , m_Texture2D(inTexture2D)
+ , m_DestinationFormat(inDestFormat)
+ , m_Width(inWidth)
+ , m_Height(inHeight)
+ , m_NVRenderContext(inNVRenderContext)
+{
+ // Calculate mip level
+ int maxDim = inWidth >= inHeight ? inWidth : inHeight;
+
+ m_MaxMipMapLevel = static_cast<int>(logf((float)maxDim) / logf(2.0f));
+ // no concept of sizeOfFormat just does'nt make sense
+ m_SizeOfFormat = NVRenderTextureFormats::getSizeofFormat(m_DestinationFormat);
+ m_NoOfComponent = NVRenderTextureFormats::getNumberOfComponent(m_DestinationFormat);
+}
+
+Qt3DSRenderPrefilterTexture *
+Qt3DSRenderPrefilterTexture::Create(NVRenderContext *inNVRenderContext, QT3DSI32 inWidth, QT3DSI32 inHeight,
+ NVRenderTexture2D &inTexture2D,
+ NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd)
+{
+ Qt3DSRenderPrefilterTexture *theBSDFMipMap = NULL;
+
+ if (inNVRenderContext->IsComputeSupported()) {
+ theBSDFMipMap = QT3DS_NEW(inFnd.getAllocator(), Qt3DSRenderPrefilterTextureCompute)(
+ inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd);
+ }
+
+ if (!theBSDFMipMap) {
+ theBSDFMipMap = QT3DS_NEW(inFnd.getAllocator(), Qt3DSRenderPrefilterTextureCPU)(
+ inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat, inFnd);
+ }
+
+ if (theBSDFMipMap)
+ theBSDFMipMap->addRef();
+
+ return theBSDFMipMap;
+}
+
+Qt3DSRenderPrefilterTexture::~Qt3DSRenderPrefilterTexture()
+{
+}
+
+//------------------------------------------------------------------------------------
+// CPU based filtering
+//------------------------------------------------------------------------------------
+
+Qt3DSRenderPrefilterTextureCPU::Qt3DSRenderPrefilterTextureCPU(
+ NVRenderContext *inNVRenderContext, int inWidth, int inHeight, NVRenderTexture2D &inTexture2D,
+ NVRenderTextureFormats::Enum inDestFormat, NVFoundationBase &inFnd)
+ : Qt3DSRenderPrefilterTexture(inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat,
+ inFnd)
+{
+}
+
+inline int Qt3DSRenderPrefilterTextureCPU::wrapMod(int a, int base)
+{
+ return (a >= 0) ? a % base : (a % base) + base;
+}
+
+inline void Qt3DSRenderPrefilterTextureCPU::getWrappedCoords(int &sX, int &sY, int width, int height)
+{
+ if (sY < 0) {
+ sX -= width >> 1;
+ sY = -sY;
+ }
+ if (sY >= height) {
+ sX += width >> 1;
+ sY = height - sY;
+ }
+ sX = wrapMod(sX, width);
+}
+
+STextureData
+Qt3DSRenderPrefilterTextureCPU::CreateBsdfMipLevel(STextureData &inCurMipLevel,
+ STextureData &inPrevMipLevel, int width,
+ int height) //, IPerfTimer& inPerfTimer )
+{
+ STextureData retval;
+ int newWidth = width >> 1;
+ int newHeight = height >> 1;
+ newWidth = newWidth >= 1 ? newWidth : 1;
+ newHeight = newHeight >= 1 ? newHeight : 1;
+
+ if (inCurMipLevel.data) {
+ retval = inCurMipLevel;
+ retval.dataSizeInBytes =
+ newWidth * newHeight * NVRenderTextureFormats::getSizeofFormat(inPrevMipLevel.format);
+ } else {
+ retval.dataSizeInBytes =
+ newWidth * newHeight * NVRenderTextureFormats::getSizeofFormat(inPrevMipLevel.format);
+ retval.format = inPrevMipLevel.format; // inLoadedImage.format;
+ retval.data = m_Foundation.getAllocator().allocate(
+ retval.dataSizeInBytes, "Bsdf Scaled Image Data", __FILE__, __LINE__);
+ }
+
+ for (int y = 0; y < newHeight; ++y) {
+ for (int x = 0; x < newWidth; ++x) {
+ float accumVal[4];
+ accumVal[0] = 0;
+ accumVal[1] = 0;
+ accumVal[2] = 0;
+ accumVal[3] = 0;
+ for (int sy = -2; sy <= 2; ++sy) {
+ for (int sx = -2; sx <= 2; ++sx) {
+ int sampleX = sx + (x << 1);
+ int sampleY = sy + (y << 1);
+ getWrappedCoords(sampleX, sampleY, width, height);
+
+ // Cauchy filter (this is simply because it's the easiest to evaluate, and
+ // requires no complex
+ // functions).
+ float filterPdf = 1.f / (1.f + float(sx * sx + sy * sy) * 2.f);
+ // With FP HDR formats, we're not worried about intensity loss so much as
+ // unnecessary energy gain,
+ // whereas with LDR formats, the fear with a continuous normalization factor is
+ // that we'd lose
+ // intensity and saturation as well.
+ filterPdf /= (NVRenderTextureFormats::getSizeofFormat(retval.format) >= 8)
+ ? 4.71238898f
+ : 4.5403446f;
+ // filterPdf /= 4.5403446f; // Discrete normalization factor
+ // filterPdf /= 4.71238898f; // Continuous normalization factor
+ float curPix[4];
+ QT3DSI32 byteOffset = (sampleY * width + sampleX)
+ * NVRenderTextureFormats::getSizeofFormat(retval.format);
+ if (byteOffset < 0) {
+ sampleY = height + sampleY;
+ byteOffset = (sampleY * width + sampleX)
+ * NVRenderTextureFormats::getSizeofFormat(retval.format);
+ }
+
+ NVRenderTextureFormats::decodeToFloat(inPrevMipLevel.data, byteOffset, curPix,
+ retval.format);
+
+ accumVal[0] += filterPdf * curPix[0];
+ accumVal[1] += filterPdf * curPix[1];
+ accumVal[2] += filterPdf * curPix[2];
+ accumVal[3] += filterPdf * curPix[3];
+ }
+ }
+
+ QT3DSU32 newIdx =
+ (y * newWidth + x) * NVRenderTextureFormats::getSizeofFormat(retval.format);
+
+ NVRenderTextureFormats::encodeToPixel(accumVal, retval.data, newIdx, retval.format);
+ }
+ }
+
+ return retval;
+}
+
+void Qt3DSRenderPrefilterTextureCPU::Build(void *inTextureData, QT3DSI32 inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat)
+{
+
+ m_InternalFormat = inFormat;
+ m_SizeOfInternalFormat = NVRenderTextureFormats::getSizeofFormat(m_InternalFormat);
+ m_InternalNoOfComponent = NVRenderTextureFormats::getNumberOfComponent(m_InternalFormat);
+
+ m_Texture2D.SetTextureData(NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize), 0,
+ m_Width, m_Height, inFormat, m_DestinationFormat);
+
+ STextureData theMipImage;
+ STextureData prevImage;
+ prevImage.data = inTextureData;
+ prevImage.dataSizeInBytes = inTextureDataSize;
+ prevImage.format = inFormat;
+ int curWidth = m_Width;
+ int curHeight = m_Height;
+ int size = NVRenderTextureFormats::getSizeofFormat(m_InternalFormat);
+ for (int idx = 1; idx <= m_MaxMipMapLevel; ++idx) {
+ theMipImage =
+ CreateBsdfMipLevel(theMipImage, prevImage, curWidth, curHeight); //, m_PerfTimer );
+ curWidth = curWidth >> 1;
+ curHeight = curHeight >> 1;
+ curWidth = curWidth >= 1 ? curWidth : 1;
+ curHeight = curHeight >= 1 ? curHeight : 1;
+ inTextureDataSize = curWidth * curHeight * size;
+
+ m_Texture2D.SetTextureData(toU8DataRef((char *)theMipImage.data, (QT3DSU32)inTextureDataSize),
+ (QT3DSU8)idx, (QT3DSU32)curWidth, (QT3DSU32)curHeight, theMipImage.format,
+ m_DestinationFormat);
+
+ if (prevImage.data == inTextureData)
+ prevImage = STextureData();
+
+ STextureData temp = prevImage;
+ prevImage = theMipImage;
+ theMipImage = temp;
+ }
+ QT3DS_FREE(m_Foundation.getAllocator(), theMipImage.data);
+ QT3DS_FREE(m_Foundation.getAllocator(), prevImage.data);
+}
+
+//------------------------------------------------------------------------------------
+// GL compute based filtering
+//------------------------------------------------------------------------------------
+
+static const char *computeUploadShader(std::string &prog, NVRenderTextureFormats::Enum inFormat,
+ bool binESContext)
+{
+ if (binESContext) {
+ prog += "#version 310 es\n"
+ "#extension GL_ARB_compute_shader : enable\n"
+ "precision highp float;\n"
+ "precision highp int;\n"
+ "precision mediump image2D;\n";
+ } else {
+ prog += "#version 430\n"
+ "#extension GL_ARB_compute_shader : enable\n";
+ }
+
+ if (inFormat == NVRenderTextureFormats::RGBA8) {
+ prog += "// Set workgroup layout;\n"
+ "layout (local_size_x = 16, local_size_y = 16) in;\n\n"
+ "layout (rgba8, binding = 1) readonly uniform image2D inputImage;\n\n"
+ "layout (rgba16f, binding = 2) writeonly uniform image2D outputImage;\n\n"
+ "void main()\n"
+ "{\n"
+ " if ( gl_GlobalInvocationID.x >= gl_NumWorkGroups.x || gl_GlobalInvocationID.y "
+ ">= gl_NumWorkGroups.y )\n"
+ " return;\n"
+ " vec4 value = imageLoad(inputImage, ivec2(gl_GlobalInvocationID.xy));\n"
+ " imageStore( outputImage, ivec2(gl_GlobalInvocationID.xy), value );\n"
+ "}\n";
+ } else {
+ prog += "float convertToFloat( in uint inValue )\n"
+ "{\n"
+ " uint v = inValue & uint(0xFF);\n"
+ " float f = float(v)/256.0;\n"
+ " return f;\n"
+ "}\n";
+
+ prog += "int getMod( in int inValue, in int mod )\n"
+ "{\n"
+ " int v = mod * (inValue/mod);\n"
+ " return inValue - v;\n"
+ "}\n";
+
+ prog += "vec4 getRGBValue( in int byteNo, vec4 inVal, vec4 inVal1 )\n"
+ "{\n"
+ " vec4 result= vec4(0.0);\n"
+ " if( byteNo == 0) {\n"
+ " result.r = inVal.r;\n"
+ " result.g = inVal.g;\n"
+ " result.b = inVal.b;\n"
+ " }\n"
+ " else if( byteNo == 1) {\n"
+ " result.r = inVal.g;\n"
+ " result.g = inVal.b;\n"
+ " result.b = inVal.a;\n"
+ " }\n"
+ " else if( byteNo == 2) {\n"
+ " result.r = inVal.b;\n"
+ " result.g = inVal.a;\n"
+ " result.b = inVal1.r;\n"
+ " }\n"
+ " else if( byteNo == 3) {\n"
+ " result.r = inVal.a;\n"
+ " result.g = inVal1.r;\n"
+ " result.b = inVal1.g;\n"
+ " }\n"
+ " return result;\n"
+ "}\n";
+
+ prog += "// Set workgroup layout;\n"
+ "layout (local_size_x = 16, local_size_y = 16) in;\n\n"
+ "layout (rgba8, binding = 1) readonly uniform image2D inputImage;\n\n"
+ "layout (rgba16f, binding = 2) writeonly uniform image2D outputImage;\n\n"
+ "void main()\n"
+ "{\n"
+ " vec4 result = vec4(0.0);\n"
+ " if ( gl_GlobalInvocationID.x >= gl_NumWorkGroups.x || gl_GlobalInvocationID.y "
+ ">= gl_NumWorkGroups.y )\n"
+ " return;\n"
+ " int xpos = (int(gl_GlobalInvocationID.x)*3)/4;\n"
+ " int xmod = getMod(int(gl_GlobalInvocationID.x)*3, 4);\n"
+ " ivec2 readPos = ivec2(xpos, gl_GlobalInvocationID.y);\n"
+ " vec4 value = imageLoad(inputImage, readPos);\n"
+ " vec4 value1 = imageLoad(inputImage, ivec2(readPos.x + 1, readPos.y));\n"
+ " result = getRGBValue( xmod, value, value1);\n"
+ " imageStore( outputImage, ivec2(gl_GlobalInvocationID.xy), result );\n"
+ "}\n";
+ }
+ return prog.c_str();
+}
+
+static const char *computeWorkShader(std::string &prog, bool binESContext)
+{
+ if (binESContext) {
+ prog += "#version 310 es\n"
+ "#extension GL_ARB_compute_shader : enable\n"
+ "precision highp float;\n"
+ "precision highp int;\n"
+ "precision mediump image2D;\n";
+ } else {
+ prog += "#version 430\n"
+ "#extension GL_ARB_compute_shader : enable\n";
+ }
+
+ prog += "int wrapMod( in int a, in int base )\n"
+ "{\n"
+ " return ( a >= 0 ) ? a % base : -(a % base) + base;\n"
+ "}\n";
+
+ prog += "void getWrappedCoords( inout int sX, inout int sY, in int width, in int height )\n"
+ "{\n"
+ " if (sY < 0) { sX -= width >> 1; sY = -sY; }\n"
+ " if (sY >= height) { sX += width >> 1; sY = height - sY; }\n"
+ " sX = wrapMod( sX, width );\n"
+ "}\n";
+
+ prog += "// Set workgroup layout;\n"
+ "layout (local_size_x = 16, local_size_y = 16) in;\n\n"
+ "layout (rgba16f, binding = 1) readonly uniform image2D inputImage;\n\n"
+ "layout (rgba16f, binding = 2) writeonly uniform image2D outputImage;\n\n"
+ "void main()\n"
+ "{\n"
+ " int prevWidth = int(gl_NumWorkGroups.x) << 1;\n"
+ " int prevHeight = int(gl_NumWorkGroups.y) << 1;\n"
+ " if ( gl_GlobalInvocationID.x >= gl_NumWorkGroups.x || gl_GlobalInvocationID.y >= "
+ "gl_NumWorkGroups.y )\n"
+ " return;\n"
+ " vec4 accumVal = vec4(0.0);\n"
+ " for ( int sy = -2; sy <= 2; ++sy )\n"
+ " {\n"
+ " for ( int sx = -2; sx <= 2; ++sx )\n"
+ " {\n"
+ " int sampleX = sx + (int(gl_GlobalInvocationID.x) << 1);\n"
+ " int sampleY = sy + (int(gl_GlobalInvocationID.y) << 1);\n"
+ " getWrappedCoords(sampleX, sampleY, prevWidth, prevHeight);\n"
+ " if ((sampleY * prevWidth + sampleX) < 0 )\n"
+ " sampleY = prevHeight + sampleY;\n"
+ " ivec2 pos = ivec2(sampleX, sampleY);\n"
+ " vec4 value = imageLoad(inputImage, pos);\n"
+ " float filterPdf = 1.0 / ( 1.0 + float(sx*sx + sy*sy)*2.0 );\n"
+ " filterPdf /= 4.71238898;\n"
+ " accumVal[0] += filterPdf * value.r;\n"
+ " accumVal[1] += filterPdf * value.g;\n"
+ " accumVal[2] += filterPdf * value.b;\n"
+ " accumVal[3] += filterPdf * value.a;\n"
+ " }\n"
+ " }\n"
+ " imageStore( outputImage, ivec2(gl_GlobalInvocationID.xy), accumVal );\n"
+ "}\n";
+
+ return prog.c_str();
+}
+
+inline NVConstDataRef<QT3DSI8> toRef(const char *data)
+{
+ size_t len = strlen(data) + 1;
+ return NVConstDataRef<QT3DSI8>((const QT3DSI8 *)data, (QT3DSU32)len);
+}
+
+static bool isGLESContext(NVRenderContext *context)
+{
+ NVRenderContextType ctxType = context->GetRenderContextType();
+
+ // Need minimum of GL3 or GLES3
+ if (ctxType == NVRenderContextValues::GLES2 || ctxType == NVRenderContextValues::GLES3
+ || ctxType == NVRenderContextValues::GLES3PLUS) {
+ return true;
+ }
+
+ return false;
+}
+
+#define WORKGROUP_SIZE 16
+
+Qt3DSRenderPrefilterTextureCompute::Qt3DSRenderPrefilterTextureCompute(
+ NVRenderContext *inNVRenderContext, QT3DSI32 inWidth, QT3DSI32 inHeight,
+ NVRenderTexture2D &inTexture2D, NVRenderTextureFormats::Enum inDestFormat,
+ NVFoundationBase &inFnd)
+ : Qt3DSRenderPrefilterTexture(inNVRenderContext, inWidth, inHeight, inTexture2D, inDestFormat,
+ inFnd)
+ , m_BSDFProgram(NULL)
+ , m_UploadProgram_RGBA8(NULL)
+ , m_UploadProgram_RGB8(NULL)
+ , m_Level0Tex(NULL)
+ , m_TextureCreated(false)
+{
+}
+
+Qt3DSRenderPrefilterTextureCompute::~Qt3DSRenderPrefilterTextureCompute()
+{
+ m_UploadProgram_RGB8 = NULL;
+ m_UploadProgram_RGBA8 = NULL;
+ m_BSDFProgram = NULL;
+ m_Level0Tex = NULL;
+}
+
+void Qt3DSRenderPrefilterTextureCompute::createComputeProgram(NVRenderContext *context)
+{
+ std::string computeProg;
+
+ if (!m_BSDFProgram) {
+ m_BSDFProgram = context
+ ->CompileComputeSource(
+ "Compute BSDF mipmap shader",
+ toRef(computeWorkShader(computeProg, isGLESContext(context))))
+ .mShader;
+ }
+}
+
+NVRenderShaderProgram *Qt3DSRenderPrefilterTextureCompute::getOrCreateUploadComputeProgram(
+ NVRenderContext *context, NVRenderTextureFormats::Enum inFormat)
+{
+ std::string computeProg;
+
+ if (inFormat == NVRenderTextureFormats::RGB8) {
+ if (!m_UploadProgram_RGB8) {
+ m_UploadProgram_RGB8 =
+ context
+ ->CompileComputeSource(
+ "Compute BSDF mipmap level 0 RGB8 shader",
+ toRef(computeUploadShader(computeProg, inFormat, isGLESContext(context))))
+ .mShader;
+ }
+
+ return m_UploadProgram_RGB8;
+ } else {
+ if (!m_UploadProgram_RGBA8) {
+ m_UploadProgram_RGBA8 =
+ context
+ ->CompileComputeSource(
+ "Compute BSDF mipmap level 0 RGBA8 shader",
+ toRef(computeUploadShader(computeProg, inFormat, isGLESContext(context))))
+ .mShader;
+ }
+
+ return m_UploadProgram_RGBA8;
+ }
+}
+
+void Qt3DSRenderPrefilterTextureCompute::CreateLevel0Tex(void *inTextureData, QT3DSI32 inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat)
+{
+ NVRenderTextureFormats::Enum theFormat = inFormat;
+ QT3DSI32 theWidth = m_Width;
+
+ // Since we cannot use RGB format in GL compute
+ // we treat it as a RGBA component format
+ if (inFormat == NVRenderTextureFormats::RGB8) {
+ // This works only with 4 byte aligned data
+ QT3DS_ASSERT(m_Width % 4 == 0);
+ theFormat = NVRenderTextureFormats::RGBA8;
+ theWidth = (m_Width * 3) / 4;
+ }
+
+ if (m_Level0Tex == NULL) {
+ m_Level0Tex = m_NVRenderContext->CreateTexture2D();
+ m_Level0Tex->SetTextureStorage(1, theWidth, m_Height, theFormat, theFormat,
+ NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize));
+ } else {
+ m_Level0Tex->SetTextureSubData(NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize), 0,
+ 0, 0, theWidth, m_Height, theFormat);
+ }
+}
+
+void Qt3DSRenderPrefilterTextureCompute::Build(void *inTextureData, QT3DSI32 inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat)
+{
+ bool needMipUpload = (inFormat != m_DestinationFormat);
+ // re-upload data
+ if (!m_TextureCreated) {
+ m_Texture2D.SetTextureStorage(
+ m_MaxMipMapLevel + 1, m_Width, m_Height, m_DestinationFormat, inFormat, (needMipUpload)
+ ? NVDataRef<QT3DSU8>()
+ : NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize));
+ m_Texture2D.addRef();
+ // create a compute shader (if not aloread done) which computes the BSDF mipmaps for this
+ // texture
+ createComputeProgram(m_NVRenderContext);
+
+ if (!m_BSDFProgram) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ m_TextureCreated = true;
+ } else if (!needMipUpload) {
+ m_Texture2D.SetTextureSubData(NVDataRef<QT3DSU8>((QT3DSU8 *)inTextureData, inTextureDataSize), 0,
+ 0, 0, m_Width, m_Height, inFormat);
+ }
+
+ if (needMipUpload) {
+ CreateLevel0Tex(inTextureData, inTextureDataSize, inFormat);
+ }
+
+ NVScopedRefCounted<NVRenderImage2D> theInputImage;
+ NVScopedRefCounted<NVRenderImage2D> theOutputImage;
+ theInputImage =
+ m_NVRenderContext->CreateImage2D(&m_Texture2D, NVRenderImageAccessType::ReadWrite);
+ theOutputImage =
+ m_NVRenderContext->CreateImage2D(&m_Texture2D, NVRenderImageAccessType::ReadWrite);
+
+ if (needMipUpload && m_Level0Tex) {
+ NVRenderShaderProgram *uploadProg =
+ getOrCreateUploadComputeProgram(m_NVRenderContext, inFormat);
+ if (!uploadProg)
+ return;
+
+ m_NVRenderContext->SetActiveShader(uploadProg);
+
+ NVScopedRefCounted<NVRenderImage2D> theInputImage0;
+ theInputImage0 =
+ m_NVRenderContext->CreateImage2D(m_Level0Tex, NVRenderImageAccessType::ReadWrite);
+
+ theInputImage0->SetTextureLevel(0);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedinputImage0("inputImage",
+ *uploadProg);
+ theCachedinputImage0.Set(theInputImage0);
+
+ theOutputImage->SetTextureLevel(0);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedOutputImage("outputImage",
+ *uploadProg);
+ theCachedOutputImage.Set(theOutputImage);
+
+ m_NVRenderContext->DispatchCompute(uploadProg, m_Width, m_Height, 1);
+
+ // sync
+ NVRenderBufferBarrierFlags flags(NVRenderBufferBarrierValues::ShaderImageAccess);
+ m_NVRenderContext->SetMemoryBarrier(flags);
+ }
+
+ int width = m_Width >> 1;
+ int height = m_Height >> 1;
+
+ m_NVRenderContext->SetActiveShader(m_BSDFProgram);
+
+ for (int i = 1; i <= m_MaxMipMapLevel; ++i) {
+ theOutputImage->SetTextureLevel(i);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedOutputImage("outputImage",
+ *m_BSDFProgram);
+ theCachedOutputImage.Set(theOutputImage);
+ theInputImage->SetTextureLevel(i - 1);
+ NVRenderCachedShaderProperty<NVRenderImage2D *> theCachedinputImage("inputImage",
+ *m_BSDFProgram);
+ theCachedinputImage.Set(theInputImage);
+
+ m_NVRenderContext->DispatchCompute(m_BSDFProgram, width, height, 1);
+
+ width = width > 2 ? width >> 1 : 1;
+ height = height > 2 ? height >> 1 : 1;
+
+ // sync
+ NVRenderBufferBarrierFlags flags(NVRenderBufferBarrierValues::ShaderImageAccess);
+ m_NVRenderContext->SetMemoryBarrier(flags);
+ }
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.h b/src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.h
new file mode 100644
index 0000000..e633eb1
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderPrefilterTexture.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_PREFILTER_TEXTURE_H
+#define QT3DS_RENDER_PREFILTER_TEXTURE_H
+#include "foundation/Qt3DSAtomic.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "Qt3DSRender.h"
+
+#include "Qt3DSTypes.h"
+#include "Qt3DSRenderLoadedTexture.h"
+
+namespace qt3ds {
+namespace render {
+
+ class Qt3DSRenderPrefilterTexture : public NVRefCounted
+ {
+ public:
+ Qt3DSRenderPrefilterTexture(NVRenderContext *inNVRenderContext, QT3DSI32 inWidth, QT3DSI32 inHeight,
+ NVRenderTexture2D &inTexture,
+ NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+ virtual ~Qt3DSRenderPrefilterTexture();
+
+ virtual void Build(void *inTextureData, QT3DSI32 inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat) = 0;
+
+ static Qt3DSRenderPrefilterTexture *Create(NVRenderContext *inNVRenderContext, QT3DSI32 inWidth,
+ QT3DSI32 inHeight, NVRenderTexture2D &inTexture,
+ NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+
+ protected:
+ NVFoundationBase &m_Foundation; ///< Foundation class for allocations and other base things
+ volatile QT3DSI32 mRefCount; ///< reference count
+
+ NVRenderTexture2D &m_Texture2D;
+ NVRenderTextureFormats::Enum m_InternalFormat;
+ NVRenderTextureFormats::Enum m_DestinationFormat;
+
+ QT3DSI32 m_Width;
+ QT3DSI32 m_Height;
+ QT3DSI32 m_MaxMipMapLevel;
+ QT3DSI32 m_SizeOfFormat;
+ QT3DSI32 m_SizeOfInternalFormat;
+ QT3DSI32 m_InternalNoOfComponent;
+ QT3DSI32 m_NoOfComponent;
+ NVRenderContext *m_NVRenderContext;
+ };
+
+ class Qt3DSRenderPrefilterTextureCPU : public Qt3DSRenderPrefilterTexture
+ {
+ public:
+ Qt3DSRenderPrefilterTextureCPU(NVRenderContext *inNVRenderContext, QT3DSI32 inWidth,
+ QT3DSI32 inHeight, NVRenderTexture2D &inTexture,
+ NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+
+ void Build(void *inTextureData, QT3DSI32 inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat) override;
+
+ STextureData CreateBsdfMipLevel(STextureData &inCurMipLevel, STextureData &inPrevMipLevel,
+ QT3DSI32 width, QT3DSI32 height);
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ int wrapMod(int a, int base);
+ void getWrappedCoords(int &sX, int &sY, int width, int height);
+ };
+
+ class Qt3DSRenderPrefilterTextureCompute : public Qt3DSRenderPrefilterTexture
+ {
+ public:
+ Qt3DSRenderPrefilterTextureCompute(NVRenderContext *inNVRenderContext, QT3DSI32 inWidth,
+ QT3DSI32 inHeight, NVRenderTexture2D &inTexture,
+ NVRenderTextureFormats::Enum inDestFormat,
+ qt3ds::NVFoundationBase &inFnd);
+ ~Qt3DSRenderPrefilterTextureCompute();
+
+ void Build(void *inTextureData, QT3DSI32 inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat) override;
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation)
+
+ private:
+ void CreateLevel0Tex(void *inTextureData, QT3DSI32 inTextureDataSize,
+ NVRenderTextureFormats::Enum inFormat);
+
+ NVScopedRefCounted<NVRenderShaderProgram> m_BSDFProgram;
+ NVScopedRefCounted<NVRenderShaderProgram> m_UploadProgram_RGBA8;
+ NVScopedRefCounted<NVRenderShaderProgram> m_UploadProgram_RGB8;
+ NVScopedRefCounted<NVRenderTexture2D> m_Level0Tex;
+ bool m_TextureCreated;
+
+ void createComputeProgram(NVRenderContext *context);
+ NVRenderShaderProgram *
+ getOrCreateUploadComputeProgram(NVRenderContext *context,
+ NVRenderTextureFormats::Enum inFormat);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.cpp
new file mode 100644
index 0000000..25fbb41
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderResourceBufferObjects.h"
+
+using namespace qt3ds::render;
+
+/*
+ IResourceManager& m_ResourceManager;
+ NVRenderFrameBuffer* m_FrameBuffer;
+ */
+
+CResourceFrameBuffer::CResourceFrameBuffer(IResourceManager &mgr)
+ : m_ResourceManager(mgr)
+ , m_FrameBuffer(NULL)
+{
+}
+
+CResourceFrameBuffer::~CResourceFrameBuffer()
+{
+ ReleaseFrameBuffer();
+}
+
+bool CResourceFrameBuffer::EnsureFrameBuffer()
+{
+ if (!m_FrameBuffer) {
+ m_FrameBuffer = m_ResourceManager.AllocateFrameBuffer();
+ return true;
+ }
+ return false;
+}
+
+void CResourceFrameBuffer::ReleaseFrameBuffer()
+{
+ if (m_FrameBuffer) {
+ m_ResourceManager.Release(*m_FrameBuffer);
+ }
+}
+
+CResourceRenderBuffer::CResourceRenderBuffer(IResourceManager &mgr)
+ : m_ResourceManager(mgr)
+ , m_RenderBuffer(NULL)
+{
+}
+
+CResourceRenderBuffer::~CResourceRenderBuffer()
+{
+ ReleaseRenderBuffer();
+}
+
+bool CResourceRenderBuffer::EnsureRenderBuffer(QT3DSU32 width, QT3DSU32 height,
+ NVRenderRenderBufferFormats::Enum storageFormat)
+{
+ if (m_RenderBuffer == NULL || m_Dimensions.m_Width != width || m_Dimensions.m_Height != height
+ || m_StorageFormat != storageFormat) {
+ if (m_RenderBuffer == NULL || m_StorageFormat != storageFormat) {
+ ReleaseRenderBuffer();
+ m_RenderBuffer = m_ResourceManager.AllocateRenderBuffer(width, height, storageFormat);
+ } else
+ m_RenderBuffer->SetDimensions(
+ qt3ds::render::NVRenderRenderBufferDimensions(width, height));
+ m_Dimensions = m_RenderBuffer->GetDimensions();
+ m_StorageFormat = m_RenderBuffer->GetStorageFormat();
+ return true;
+ }
+ return false;
+}
+
+void CResourceRenderBuffer::ReleaseRenderBuffer()
+{
+ if (m_RenderBuffer) {
+ m_ResourceManager.Release(*m_RenderBuffer);
+ m_RenderBuffer = NULL;
+ }
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.h b/src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.h
new file mode 100644
index 0000000..fb54c4d
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceBufferObjects.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_RESOURCE_BUFFER_OBJECTS_H
+#define QT3DS_RENDER_RESOURCE_BUFFER_OBJECTS_H
+#include "Qt3DSRender.h"
+#include "render/Qt3DSRenderContext.h"
+#include "Qt3DSRenderResourceManager.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+
+namespace qt3ds {
+namespace render {
+ class CResourceFrameBuffer
+ {
+ protected:
+ IResourceManager &m_ResourceManager;
+ NVRenderFrameBuffer *m_FrameBuffer;
+
+ public:
+ CResourceFrameBuffer(IResourceManager &mgr);
+ ~CResourceFrameBuffer();
+ bool EnsureFrameBuffer();
+ void ReleaseFrameBuffer();
+
+ IResourceManager &GetResourceManager() { return m_ResourceManager; }
+ operator NVRenderFrameBuffer *() { return m_FrameBuffer; }
+ NVRenderFrameBuffer *operator->()
+ {
+ QT3DS_ASSERT(m_FrameBuffer);
+ return m_FrameBuffer;
+ }
+ NVRenderFrameBuffer &operator*()
+ {
+ QT3DS_ASSERT(m_FrameBuffer);
+ return *m_FrameBuffer;
+ }
+ };
+
+ class CResourceRenderBuffer
+ {
+ protected:
+ IResourceManager &m_ResourceManager;
+ NVRenderRenderBuffer *m_RenderBuffer;
+ qt3ds::render::NVRenderRenderBufferFormats::Enum m_StorageFormat;
+ qt3ds::render::NVRenderRenderBufferDimensions m_Dimensions;
+
+ public:
+ CResourceRenderBuffer(IResourceManager &mgr);
+ ~CResourceRenderBuffer();
+ bool EnsureRenderBuffer(QT3DSU32 width, QT3DSU32 height,
+ NVRenderRenderBufferFormats::Enum storageFormat);
+ void ReleaseRenderBuffer();
+
+ operator NVRenderRenderBuffer *() { return m_RenderBuffer; }
+ NVRenderRenderBuffer *operator->()
+ {
+ QT3DS_ASSERT(m_RenderBuffer);
+ return m_RenderBuffer;
+ }
+ NVRenderRenderBuffer &operator*()
+ {
+ QT3DS_ASSERT(m_RenderBuffer);
+ return *m_RenderBuffer;
+ }
+ };
+}
+}
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp
new file mode 100644
index 0000000..3593688
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.cpp
@@ -0,0 +1,436 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderResourceManager.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderTexture2DArray.h"
+#include "render/Qt3DSRenderTextureCube.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSContainers.h"
+
+using namespace qt3ds::render;
+
+namespace {
+
+struct SResourceManager : public IResourceManager
+{
+ NVScopedRefCounted<NVRenderContext> m_RenderContext;
+ // Complete list of all allocated objects
+ nvvector<NVScopedRefCounted<NVRefCounted>> m_AllocatedObjects;
+
+ nvvector<NVRenderFrameBuffer *> m_FreeFrameBuffers;
+ nvvector<NVRenderRenderBuffer *> m_FreeRenderBuffers;
+ nvvector<NVRenderTexture2D *> m_FreeTextures;
+ nvvector<NVRenderTexture2DArray *> m_FreeTexArrays;
+ nvvector<NVRenderTextureCube *> m_FreeTexCubes;
+ nvvector<NVRenderImage2D *> m_FreeImages;
+
+ volatile QT3DSI32 mRefCount;
+
+ SResourceManager(NVRenderContext &ctx)
+ : m_RenderContext(ctx)
+ , m_AllocatedObjects(ctx.GetAllocator(), "SResourceManager::m_FrameBuffers")
+ , m_FreeFrameBuffers(ctx.GetAllocator(), "SResourceManager::m_FreeFrameBuffers")
+ , m_FreeRenderBuffers(ctx.GetAllocator(), "SResourceManager::m_FreeRenderBuffers")
+ , m_FreeTextures(ctx.GetAllocator(), "SResourceManager::m_FreeTextures")
+ , m_FreeTexArrays(ctx.GetAllocator(), "SResourceManager::m_FreeTexArrays")
+ , m_FreeTexCubes(ctx.GetAllocator(), "SResourceManager::m_FreeTexCubes")
+ , m_FreeImages(ctx.GetAllocator(), "SResourceManager::m_FreeImages")
+ , mRefCount(0)
+ {
+ }
+ virtual ~SResourceManager() {}
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_RenderContext->GetAllocator())
+
+ NVRenderFrameBuffer *AllocateFrameBuffer() override
+ {
+ if (m_FreeFrameBuffers.empty() == true) {
+ NVRenderFrameBuffer *newBuffer = m_RenderContext->CreateFrameBuffer();
+ m_AllocatedObjects.push_back(newBuffer);
+ m_FreeFrameBuffers.push_back(newBuffer);
+ }
+ NVRenderFrameBuffer *retval = m_FreeFrameBuffers.back();
+ m_FreeFrameBuffers.pop_back();
+ return retval;
+ }
+ void Release(NVRenderFrameBuffer &inBuffer) override
+ {
+ if (inBuffer.HasAnyAttachment()) {
+ // Ensure the framebuffer has no attachments.
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color0,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color1,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color2,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color3,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color4,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color5,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color6,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Color7,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Depth,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ inBuffer.Attach(NVRenderFrameBufferAttachments::Stencil,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ if (m_RenderContext->IsDepthStencilSupported())
+ inBuffer.Attach(NVRenderFrameBufferAttachments::DepthStencil,
+ qt3ds::render::NVRenderTextureOrRenderBuffer());
+ }
+#ifdef _DEBUG
+ nvvector<NVRenderFrameBuffer *>::iterator theFind =
+ eastl::find(m_FreeFrameBuffers.begin(), m_FreeFrameBuffers.end(), &inBuffer);
+ QT3DS_ASSERT(theFind == m_FreeFrameBuffers.end());
+#endif
+ m_FreeFrameBuffers.push_back(&inBuffer);
+ }
+
+ virtual NVRenderRenderBuffer *
+ AllocateRenderBuffer(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderRenderBufferFormats::Enum inBufferFormat) override
+ {
+ // Look for one of this specific size and format.
+ QT3DSU32 existingMatchIdx = m_FreeRenderBuffers.size();
+ for (QT3DSU32 idx = 0, end = existingMatchIdx; idx < end; ++idx) {
+ NVRenderRenderBuffer *theBuffer = m_FreeRenderBuffers[idx];
+ qt3ds::render::NVRenderRenderBufferDimensions theDims = theBuffer->GetDimensions();
+ NVRenderRenderBufferFormats::Enum theFormat = theBuffer->GetStorageFormat();
+ if (theDims.m_Width == inWidth && theDims.m_Height == inHeight
+ && theFormat == inBufferFormat) {
+ // Replace idx with last for efficient erasure (that reorders the vector).
+ m_FreeRenderBuffers.replace_with_last(idx);
+ return theBuffer;
+ } else if (theFormat == inBufferFormat)
+ existingMatchIdx = idx;
+ }
+ // If a specific exact match couldn't be found, just use the buffer with
+ // the same format and resize it.
+ if (existingMatchIdx < m_FreeRenderBuffers.size()) {
+ NVRenderRenderBuffer *theBuffer = m_FreeRenderBuffers[existingMatchIdx];
+ m_FreeRenderBuffers.replace_with_last(existingMatchIdx);
+ theBuffer->SetDimensions(qt3ds::render::NVRenderRenderBufferDimensions(inWidth, inHeight));
+ return theBuffer;
+ }
+
+ NVRenderRenderBuffer *theBuffer =
+ m_RenderContext->CreateRenderBuffer(inBufferFormat, inWidth, inHeight);
+ m_AllocatedObjects.push_back(theBuffer);
+ return theBuffer;
+ }
+ void Release(NVRenderRenderBuffer &inBuffer) override
+ {
+#ifdef _DEBUG
+ nvvector<NVRenderRenderBuffer *>::iterator theFind =
+ eastl::find(m_FreeRenderBuffers.begin(), m_FreeRenderBuffers.end(), &inBuffer);
+ QT3DS_ASSERT(theFind == m_FreeRenderBuffers.end());
+#endif
+ m_FreeRenderBuffers.push_back(&inBuffer);
+ }
+ NVRenderTexture2D *SetupAllocatedTexture(NVRenderTexture2D &inTexture)
+ {
+ inTexture.SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ inTexture.SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ return &inTexture;
+ }
+ NVRenderTexture2D *AllocateTexture2D(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inTextureFormat,
+ QT3DSU32 inSampleCount, bool immutable) override
+ {
+ bool inMultisample =
+ inSampleCount > 1 && m_RenderContext->AreMultisampleTexturesSupported();
+ for (QT3DSU32 idx = 0, end = m_FreeTextures.size(); idx < end; ++idx) {
+ NVRenderTexture2D *theTexture = m_FreeTextures[idx];
+ STextureDetails theDetails = theTexture->GetTextureDetails();
+ if (theDetails.m_Width == inWidth && theDetails.m_Height == inHeight
+ && inTextureFormat == theDetails.m_Format
+ && theTexture->GetSampleCount() == inSampleCount) {
+ m_FreeTextures.replace_with_last(idx);
+ return SetupAllocatedTexture(*theTexture);
+ }
+ }
+ // else resize an existing texture. This is very expensive
+ // note that MSAA textures are not resizable ( in GLES )
+ /*
+ if ( !m_FreeTextures.empty() && !inMultisample )
+ {
+ NVRenderTexture2D* theTexture = m_FreeTextures.back();
+ m_FreeTextures.pop_back();
+
+ // note we could re-use a former MSAA texture
+ // this causes a entiere destroy of the previous texture object
+ theTexture->SetTextureData( NVDataRef<QT3DSU8>(), 0, inWidth, inHeight, inTextureFormat
+ );
+
+ return SetupAllocatedTexture( *theTexture );
+ }*/
+ // else create a new texture.
+ NVRenderTexture2D *theTexture = m_RenderContext->CreateTexture2D();
+
+ if (inMultisample)
+ theTexture->SetTextureDataMultisample(inSampleCount, inWidth, inHeight,
+ inTextureFormat);
+ else if (immutable)
+ theTexture->SetTextureStorage(1, inWidth, inHeight, inTextureFormat);
+ else
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, inWidth, inHeight, inTextureFormat);
+
+ m_AllocatedObjects.push_back(theTexture);
+ return SetupAllocatedTexture(*theTexture);
+ }
+ void Release(NVRenderTexture2D &inBuffer) override
+ {
+#ifdef _DEBUG
+ nvvector<NVRenderTexture2D *>::iterator theFind =
+ eastl::find(m_FreeTextures.begin(), m_FreeTextures.end(), &inBuffer);
+ QT3DS_ASSERT(theFind == m_FreeTextures.end());
+#endif
+ m_FreeTextures.push_back(&inBuffer);
+ }
+
+ NVRenderTexture2DArray *AllocateTexture2DArray(QT3DSU32 inWidth, QT3DSU32 inHeight, QT3DSU32 inSlices,
+ NVRenderTextureFormats::Enum inTextureFormat,
+ QT3DSU32 inSampleCount) override
+ {
+ bool inMultisample =
+ inSampleCount > 1 && m_RenderContext->AreMultisampleTexturesSupported();
+ for (QT3DSU32 idx = 0, end = m_FreeTexArrays.size(); idx < end; ++idx) {
+ NVRenderTexture2DArray *theTexture = m_FreeTexArrays[idx];
+ STextureDetails theDetails = theTexture->GetTextureDetails();
+ if (theDetails.m_Width == inWidth && theDetails.m_Height == inHeight
+ && theDetails.m_Depth == inSlices && inTextureFormat == theDetails.m_Format
+ && theTexture->GetSampleCount() == inSampleCount) {
+ m_FreeTexArrays.replace_with_last(idx);
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ return theTexture;
+ }
+ }
+
+ // else resize an existing texture. This should be fairly quick at the driver level.
+ // note that MSAA textures are not resizable ( in GLES )
+ if (!m_FreeTexArrays.empty() && !inMultisample) {
+ NVRenderTexture2DArray *theTexture = m_FreeTexArrays.back();
+ m_FreeTexArrays.pop_back();
+
+ // note we could re-use a former MSAA texture
+ // this causes a entiere destroy of the previous texture object
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, inWidth, inHeight, inSlices,
+ inTextureFormat);
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ return theTexture;
+ }
+
+ // else create a new texture.
+ NVRenderTexture2DArray *theTexture = NULL;
+
+ if (!inMultisample) {
+ theTexture = m_RenderContext->CreateTexture2DArray();
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, inWidth, inHeight, inSlices,
+ inTextureFormat);
+ } else {
+ // Not supported yet
+ return NULL;
+ }
+
+ m_AllocatedObjects.push_back(theTexture);
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ return theTexture;
+ }
+
+ void Release(NVRenderTexture2DArray &inBuffer) override
+ {
+#ifdef _DEBUG
+ nvvector<NVRenderTexture2DArray *>::iterator theFind =
+ eastl::find(m_FreeTexArrays.begin(), m_FreeTexArrays.end(), &inBuffer);
+ QT3DS_ASSERT(theFind == m_FreeTexArrays.end());
+#endif
+ m_FreeTexArrays.push_back(&inBuffer);
+ }
+
+ NVRenderTextureCube *AllocateTextureCube(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inTextureFormat,
+ QT3DSU32 inSampleCount) override
+ {
+ bool inMultisample =
+ inSampleCount > 1 && m_RenderContext->AreMultisampleTexturesSupported();
+ for (QT3DSU32 idx = 0, end = m_FreeTexCubes.size(); idx < end; ++idx) {
+ NVRenderTextureCube *theTexture = m_FreeTexCubes[idx];
+ STextureDetails theDetails = theTexture->GetTextureDetails();
+ if (theDetails.m_Width == inWidth && theDetails.m_Height == inHeight
+ && inTextureFormat == theDetails.m_Format
+ && theTexture->GetSampleCount() == inSampleCount) {
+ m_FreeTexCubes.replace_with_last(idx);
+
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ return theTexture;
+ }
+ }
+
+ // else resize an existing texture. This should be fairly quick at the driver level.
+ // note that MSAA textures are not resizable ( in GLES )
+ if (!m_FreeTexCubes.empty() && !inMultisample) {
+ NVRenderTextureCube *theTexture = m_FreeTexCubes.back();
+ m_FreeTexCubes.pop_back();
+
+ // note we could re-use a former MSAA texture
+ // this causes a entire destroy of the previous texture object
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubePosX,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubeNegX,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubePosY,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubeNegY,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubePosZ,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubeNegZ,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ return theTexture;
+ }
+
+ // else create a new texture.
+ NVRenderTextureCube *theTexture = NULL;
+
+ if (!inMultisample) {
+ theTexture = m_RenderContext->CreateTextureCube();
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubePosX,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubeNegX,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubePosY,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubeNegY,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubePosZ,
+ inWidth, inHeight, inTextureFormat);
+ theTexture->SetTextureData(NVDataRef<QT3DSU8>(), 0, NVRenderTextureCubeFaces::CubeNegZ,
+ inWidth, inHeight, inTextureFormat);
+ } else {
+ // Not supported yet
+ return NULL;
+ }
+
+ m_AllocatedObjects.push_back(theTexture);
+ theTexture->SetMinFilter(NVRenderTextureMinifyingOp::Linear);
+ theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear);
+ return theTexture;
+ }
+
+ void Release(NVRenderTextureCube &inBuffer) override
+ {
+#ifdef _DEBUG
+ nvvector<NVRenderTextureCube *>::iterator theFind =
+ eastl::find(m_FreeTexCubes.begin(), m_FreeTexCubes.end(), &inBuffer);
+ QT3DS_ASSERT(theFind == m_FreeTexCubes.end());
+#endif
+ m_FreeTexCubes.push_back(&inBuffer);
+ }
+
+ NVRenderImage2D *AllocateImage2D(NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess) override
+ {
+ if (m_FreeImages.empty() == true) {
+ NVRenderImage2D *newImage = m_RenderContext->CreateImage2D(inTexture, inAccess);
+ if (newImage) {
+ m_AllocatedObjects.push_back(newImage);
+ m_FreeImages.push_back(newImage);
+ }
+ }
+
+ NVRenderImage2D *retval = m_FreeImages.back();
+ m_FreeImages.pop_back();
+
+ return retval;
+ }
+
+ void Release(NVRenderImage2D &inBuffer) override
+ {
+#ifdef _DEBUG
+ nvvector<NVRenderImage2D *>::iterator theFind =
+ eastl::find(m_FreeImages.begin(), m_FreeImages.end(), &inBuffer);
+ QT3DS_ASSERT(theFind == m_FreeImages.end());
+#endif
+ m_FreeImages.push_back(&inBuffer);
+ }
+
+ NVRenderContext &GetRenderContext() override { return *m_RenderContext; }
+
+ void RemoveObjectAllocation(NVRefCounted *obj) {
+ for (QT3DSU32 idx = 0, end = m_AllocatedObjects.size(); idx < end; ++idx) {
+ if (obj == m_AllocatedObjects[idx]) {
+ m_AllocatedObjects.replace_with_last(idx);
+ break;
+ }
+ }
+ }
+
+ void DestroyFreeSizedResources()
+ {
+ for (int idx = m_FreeRenderBuffers.size() - 1; idx >= 0; --idx) {
+ NVRenderRenderBuffer *obj = m_FreeRenderBuffers[idx];
+ m_FreeRenderBuffers.replace_with_last(idx);
+ RemoveObjectAllocation(obj);
+ }
+ for (int idx = m_FreeTextures.size() - 1; idx >= 0; --idx) {
+ NVRenderTexture2D *obj = m_FreeTextures[idx];
+ m_FreeTextures.replace_with_last(idx);
+ RemoveObjectAllocation(obj);
+ }
+ for (int idx = m_FreeTexArrays.size() - 1; idx >= 0; --idx) {
+ NVRenderTexture2DArray *obj = m_FreeTexArrays[idx];
+ m_FreeTexArrays.replace_with_last(idx);
+ RemoveObjectAllocation(obj);
+ }
+ for (int idx = m_FreeTexCubes.size() - 1; idx >= 0; --idx) {
+ NVRenderTextureCube *obj = m_FreeTexCubes[idx];
+ m_FreeTexCubes.replace_with_last(idx);
+ RemoveObjectAllocation(obj);
+ }
+ }
+};
+}
+
+IResourceManager &IResourceManager::CreateResourceManager(NVRenderContext &inContext)
+{
+ return *QT3DS_NEW(inContext.GetAllocator(), SResourceManager)(inContext);
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h
new file mode 100644
index 0000000..675d644
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceManager.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_RESOURCE_MANAGER_H
+#define QT3DS_RENDER_RESOURCE_MANAGER_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+
+namespace qt3ds {
+namespace render {
+ /**
+ * Implements simple pooling of render resources
+ */
+ class IResourceManager : public NVRefCounted
+ {
+ protected:
+ virtual ~IResourceManager() {}
+
+ public:
+ virtual NVRenderFrameBuffer *AllocateFrameBuffer() = 0;
+ virtual void Release(NVRenderFrameBuffer &inBuffer) = 0;
+ virtual NVRenderRenderBuffer *
+ AllocateRenderBuffer(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderRenderBufferFormats::Enum inBufferFormat) = 0;
+ virtual void Release(NVRenderRenderBuffer &inBuffer) = 0;
+ virtual NVRenderTexture2D *AllocateTexture2D(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inTextureFormat,
+ QT3DSU32 inSampleCount = 1,
+ bool immutable = false) = 0;
+ virtual void Release(NVRenderTexture2D &inBuffer) = 0;
+ virtual NVRenderTexture2DArray *
+ AllocateTexture2DArray(QT3DSU32 inWidth, QT3DSU32 inHeight, QT3DSU32 inSlices,
+ NVRenderTextureFormats::Enum inTextureFormat,
+ QT3DSU32 inSampleCount = 1) = 0;
+ virtual void Release(NVRenderTexture2DArray &inBuffer) = 0;
+ virtual NVRenderTextureCube *
+ AllocateTextureCube(QT3DSU32 inWidth, QT3DSU32 inHeight,
+ NVRenderTextureFormats::Enum inTextureFormat,
+ QT3DSU32 inSampleCount = 1) = 0;
+ virtual void Release(NVRenderTextureCube &inBuffer) = 0;
+ virtual NVRenderImage2D *AllocateImage2D(NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess) = 0;
+ virtual void Release(NVRenderImage2D &inBuffer) = 0;
+
+ virtual NVRenderContext &GetRenderContext() = 0;
+ virtual void DestroyFreeSizedResources() = 0;
+
+ static IResourceManager &CreateResourceManager(NVRenderContext &inContext);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.cpp b/src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.cpp
new file mode 100644
index 0000000..e877cbc
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.cpp
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "Qt3DSRenderResourceTexture2D.h"
+
+using namespace qt3ds::render;
+
+CResourceTexture2D::CResourceTexture2D(IResourceManager &mgr, NVRenderTexture2D *inTexture)
+ : m_ResourceManager(mgr)
+ , m_Texture(inTexture)
+{
+ if (inTexture)
+ m_TextureDetails = inTexture->GetTextureDetails();
+}
+
+CResourceTexture2D::CResourceTexture2D(IResourceManager &mgr, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples)
+ : m_ResourceManager(mgr)
+ , m_Texture(NULL)
+{
+ EnsureTexture(width, height, inFormat, inSamples);
+}
+
+CResourceTexture2D::~CResourceTexture2D()
+{
+ ReleaseTexture();
+}
+
+// Returns true if the texture was allocated, false if nothing changed (no allocation).
+bool CResourceTexture2D::TextureMatches(QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples)
+{
+ return m_Texture && m_TextureDetails.m_Width == width && m_TextureDetails.m_Height == height
+ && m_TextureDetails.m_Format == inFormat && m_TextureDetails.m_SampleCount == inSamples;
+}
+
+bool CResourceTexture2D::EnsureTexture(QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples)
+{
+ if (TextureMatches(width, height, inFormat, inSamples))
+ return false;
+
+ if (m_Texture && inSamples > 1) {
+ // we cannot resize MSAA textures though release first
+ ReleaseTexture();
+ }
+
+ if (!m_Texture)
+ m_Texture = m_ResourceManager.AllocateTexture2D(width, height, inFormat, inSamples);
+ else {
+ // multisampled textures are immuteable
+ QT3DS_ASSERT(inSamples == 1);
+ m_Texture->SetTextureData(NVDataRef<QT3DSU8>(), 0, width, height, inFormat);
+ }
+
+ m_TextureDetails = m_Texture->GetTextureDetails();
+ return true;
+}
+
+void CResourceTexture2D::ReleaseTexture()
+{
+ if (m_Texture) {
+ m_ResourceManager.Release(*m_Texture);
+ ForgetTexture();
+ }
+}
+
+void CResourceTexture2D::ForgetTexture()
+{
+ m_Texture = NULL;
+}
+
+void CResourceTexture2D::StealTexture(CResourceTexture2D &inOther)
+{
+ ReleaseTexture();
+ m_Texture = inOther.m_Texture;
+ m_TextureDetails = inOther.m_TextureDetails;
+ inOther.m_Texture = NULL;
+}
+
+CResourceTexture2DArray::CResourceTexture2DArray(IResourceManager &mgr)
+ : m_ResourceManager(mgr)
+ , m_Texture(NULL)
+{
+}
+
+CResourceTexture2DArray::CResourceTexture2DArray(IResourceManager &mgr, QT3DSU32 width, QT3DSU32 height,
+ QT3DSU32 slices,
+ NVRenderTextureFormats::Enum inFormat,
+ QT3DSU32 inSamples)
+ : m_ResourceManager(mgr)
+ , m_Texture(NULL)
+{
+ EnsureTexture(width, height, slices, inFormat, inSamples);
+}
+
+CResourceTexture2DArray::~CResourceTexture2DArray()
+{
+ ReleaseTexture();
+}
+
+bool CResourceTexture2DArray::TextureMatches(QT3DSU32 width, QT3DSU32 height, QT3DSU32 slices,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples)
+{
+ return m_Texture && m_TextureDetails.m_Depth == slices && m_TextureDetails.m_Width == width
+ && m_TextureDetails.m_Height == height && m_TextureDetails.m_Format == inFormat
+ && m_TextureDetails.m_SampleCount == inSamples;
+}
+
+bool CResourceTexture2DArray::EnsureTexture(QT3DSU32 width, QT3DSU32 height, QT3DSU32 slices,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples)
+{
+ if (TextureMatches(width, height, slices, inFormat, inSamples))
+ return false;
+
+ if (m_Texture && inSamples > 1) {
+ // we cannot resize MSAA textures though release first
+ ReleaseTexture();
+ }
+
+ if (!m_Texture)
+ m_Texture =
+ m_ResourceManager.AllocateTexture2DArray(width, height, slices, inFormat, inSamples);
+ else {
+ // multisampled textures are immuteable
+ QT3DS_ASSERT(inSamples == 1);
+ m_Texture->SetTextureData(NVDataRef<QT3DSU8>(), 0, width, height, slices, inFormat);
+ }
+
+ m_TextureDetails = m_Texture->GetTextureDetails();
+ return true;
+}
+
+void CResourceTexture2DArray::ReleaseTexture()
+{
+ if (m_Texture) {
+ m_ResourceManager.Release(*m_Texture);
+ m_Texture = NULL;
+ }
+}
+
+void CResourceTexture2DArray::StealTexture(CResourceTexture2DArray &inOther)
+{
+ ReleaseTexture();
+ m_Texture = inOther.m_Texture;
+ m_TextureDetails = inOther.m_TextureDetails;
+ inOther.m_Texture = NULL;
+}
diff --git a/src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.h b/src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.h
new file mode 100644
index 0000000..eb54713
--- /dev/null
+++ b/src/runtimerender/resourcemanager/Qt3DSRenderResourceTexture2D.h
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_RESOURCE_TEXTURE_2D_H
+#define QT3DS_RENDER_RESOURCE_TEXTURE_2D_H
+#include "Qt3DSRender.h"
+#include "render/Qt3DSRenderContext.h"
+#include "render/Qt3DSRenderTexture2D.h"
+#include "render/Qt3DSRenderTexture2DArray.h"
+#include "Qt3DSRenderResourceManager.h"
+
+namespace qt3ds {
+namespace render {
+ class CResourceTexture2D
+ {
+ protected:
+ IResourceManager &m_ResourceManager;
+ NVRenderTexture2D *m_Texture;
+ STextureDetails m_TextureDetails;
+
+ public:
+ CResourceTexture2D(IResourceManager &mgr, NVRenderTexture2D *inTexture = NULL);
+ // create and allocate the texture right away.
+ CResourceTexture2D(IResourceManager &mgr, QT3DSU32 width, QT3DSU32 height,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples = 1);
+ ~CResourceTexture2D();
+ // Returns true if the texture matches the specs, false if the texture needs to be
+ // reallocated
+ bool TextureMatches(QT3DSU32 width, QT3DSU32 height, NVRenderTextureFormats::Enum inFormat,
+ QT3DSU32 inSamples = 1);
+
+ // Returns true if the texture was allocated, false if nothing changed (no allocation).
+ // Note this is the exact opposite of TextureMatches.
+ bool EnsureTexture(QT3DSU32 width, QT3DSU32 height, NVRenderTextureFormats::Enum inFormat,
+ QT3DSU32 inSamples = 1);
+
+ // Force release the texture.
+ void ReleaseTexture();
+ NVRenderTexture2D &operator*()
+ {
+ QT3DS_ASSERT(m_Texture);
+ return *m_Texture;
+ }
+ NVRenderTexture2D *operator->()
+ {
+ QT3DS_ASSERT(m_Texture);
+ return m_Texture;
+ }
+ operator NVRenderTexture2D *() { return m_Texture; }
+ NVRenderTexture2D *GetTexture() { return m_Texture; }
+ void ForgetTexture();
+ // Enforces single ownership rules.
+ void StealTexture(CResourceTexture2D &inOther);
+ };
+
+ class CResourceTexture2DArray
+ {
+ protected:
+ IResourceManager &m_ResourceManager;
+ qt3ds::render::NVRenderTexture2DArray *m_Texture;
+ STextureDetails m_TextureDetails;
+
+ public:
+ CResourceTexture2DArray(IResourceManager &mgr);
+ // create and allocate the texture right away.
+ CResourceTexture2DArray(IResourceManager &mgr, QT3DSU32 width, QT3DSU32 height, QT3DSU32 slices,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples = 1);
+ ~CResourceTexture2DArray();
+ // Returns true if the texture matches the specs, false if the texture needs to be
+ // reallocated
+ bool TextureMatches(QT3DSU32 width, QT3DSU32 height, QT3DSU32 slices,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples = 1);
+
+ // Returns true if the texture was allocated, false if nothing changed (no allocation).
+ // Note this is the exact opposite of TextureMatches.
+ bool EnsureTexture(QT3DSU32 width, QT3DSU32 height, QT3DSU32 slices,
+ NVRenderTextureFormats::Enum inFormat, QT3DSU32 inSamples = 1);
+
+ // Force release the texture.
+ void ReleaseTexture();
+ qt3ds::render::NVRenderTexture2DArray &operator*()
+ {
+ QT3DS_ASSERT(m_Texture);
+ return *m_Texture;
+ }
+ qt3ds::render::NVRenderTexture2DArray *operator->()
+ {
+ QT3DS_ASSERT(m_Texture);
+ return m_Texture;
+ }
+ operator qt3ds::render::NVRenderTexture2DArray *() { return m_Texture; }
+ qt3ds::render::NVRenderTexture2DArray *GetTexture() { return m_Texture; }
+ // Enforces single ownership rules.
+ void StealTexture(CResourceTexture2DArray &inOther);
+ };
+}
+}
+
+#endif
diff --git a/src/runtimerender/windows/DynamicLibLoader.h b/src/runtimerender/windows/DynamicLibLoader.h
new file mode 100644
index 0000000..09b028b
--- /dev/null
+++ b/src/runtimerender/windows/DynamicLibLoader.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_WINDOWS_DYNAMIC_LIB_LOADER_H
+#define QT3DS_WINDOWS_DYNAMIC_LIB_LOADER_H
+
+#include "foundation/Qt3DSFoundation.h"
+#include "foundation/Qt3DSBroadcastingAllocator.h"
+
+#include <QLibrary>
+
+namespace qt3ds {
+namespace render {
+ using namespace qt3ds;
+ // using namespace qt3ds::render;
+
+ class CLoadedDynamicLibrary
+ {
+ QLibrary* m_DLLHandle;
+ CLoadedDynamicLibrary(QLibrary* hdl)
+ : m_DLLHandle(hdl)
+ {
+ }
+ CLoadedDynamicLibrary(const CLoadedDynamicLibrary &);
+ CLoadedDynamicLibrary &operator=(const CLoadedDynamicLibrary &);
+
+ public:
+ ~CLoadedDynamicLibrary()
+ {
+ if (m_DLLHandle) {
+ m_DLLHandle->unload();
+ delete m_DLLHandle;
+ }
+ m_DLLHandle = 0;
+ }
+ void *FindFunction(const char *name) { return (void*)m_DLLHandle->resolve(name); }
+ static CLoadedDynamicLibrary *Create(const char *inFullDllPath, NVFoundationBase &fnd)
+ {
+ QLibrary* hdl = new QLibrary(inFullDllPath);
+ if (!hdl->load()) {
+ qCCritical(INVALID_OPERATION, "Failed to load dynamic library %s: %s",
+ inFullDllPath, qPrintable(hdl->errorString()));
+
+ delete hdl;
+ return nullptr;
+ }
+ return QT3DS_NEW(fnd.getAllocator(), CLoadedDynamicLibrary)(hdl);
+ }
+ };
+}
+}
+
+#endif
diff --git a/src/src.pro b/src/src.pro
new file mode 100644
index 0000000..0cb56c8
--- /dev/null
+++ b/src/src.pro
@@ -0,0 +1,10 @@
+TEMPLATE = subdirs
+CONFIG += ordered
+
+SUBDIRS += \
+ 3rdparty \
+ dm \
+ qmlstreamer \
+ ogl-runtime-static \
+ ogl-runtime-dylib \
+ api
diff --git a/src/state/Qt3DSState.h b/src/state/Qt3DSState.h
new file mode 100644
index 0000000..7f10f94
--- /dev/null
+++ b/src/state/Qt3DSState.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_STATE_H
+#define QT3DS_STATE_H
+
+namespace qt3ds {
+class NVAllocatorCallback;
+class NVFoundationBase;
+namespace foundation {
+ class CRegisteredString;
+ class IStringTable;
+ class IOutStream;
+ class IInStream;
+ class IDOMFactory;
+ struct SDOMAttribute;
+ struct SDOMElement;
+ struct SNamespacePairNode;
+ class SocketStream;
+}
+
+namespace intrinsics {
+}
+}
+
+namespace qt3ds {
+namespace state {
+
+ using namespace qt3ds;
+ using namespace qt3ds::foundation;
+ using namespace qt3ds::intrinsics;
+ using qt3ds::foundation::CRegisteredString;
+ using qt3ds::foundation::IStringTable;
+ class IStateContext;
+ class IStateInterpreter;
+ class IStateLogger;
+ class IExecutionContext;
+ class IScriptContext;
+ struct SSCXML;
+ struct SState;
+ struct STransition;
+ struct SParallel;
+ struct SFinal;
+ struct SHistory;
+ struct SOnEntry;
+ struct SOnExit;
+ struct SSend;
+ struct SRaise;
+ struct SIf;
+ struct SElseIf;
+ struct SElse;
+ struct SLog;
+ struct SAssign;
+ struct SScript;
+ struct SDataModel;
+ struct SData;
+ struct SStateNode;
+ struct SCancel;
+
+ namespace editor {
+ class IEditor;
+ class IEditorObject;
+ }
+}
+}
+
+#endif
diff --git a/src/state/Qt3DSStateScriptContext.h b/src/state/Qt3DSStateScriptContext.h
new file mode 100644
index 0000000..49b119e
--- /dev/null
+++ b/src/state/Qt3DSStateScriptContext.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QT3DS_STATE_SCRIPT_CONTEXT_H
+#define QT3DS_STATE_SCRIPT_CONTEXT_H
+#pragma once
+#include "Qt3DSState.h"
+#include "Qt3DSStateTypes.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "foundation/Qt3DSOption.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace state {
+
+ class IScriptEvent : public IEvent
+ {
+ public:
+ // returns true on success, false if error.execution should be signaled.
+ virtual bool SetParam(CRegisteredString inName, const char8_t *inExpression) = 0;
+ // Sets the expression as a string
+ virtual bool SetParamStr(CRegisteredString inName, const char8_t *inStr) = 0;
+ virtual bool SetDataExpr(const char8_t *inExpression) = 0;
+ virtual bool SetDataStr(const char8_t *inStr) = 0;
+ };
+
+ struct SScriptExecutionResult
+ {
+ const char8_t *m_Result;
+ const char8_t *m_Error;
+ SScriptExecutionResult(const char8_t *inData, const char8_t *inError)
+ : m_Result(inData)
+ , m_Error(inError)
+ {
+ }
+ SScriptExecutionResult()
+ : m_Result("")
+ , m_Error("")
+ {
+ }
+ bool Valid() const { return m_Error == NULL || *m_Error == 0; }
+ const char8_t *Result() const
+ {
+ QT3DS_ASSERT(Valid());
+ return m_Result;
+ }
+ const char8_t *Error() const
+ {
+ QT3DS_ASSERT(!Valid());
+ return m_Error;
+ }
+ };
+
+ class IScriptContext : public NVRefCounted
+ {
+ protected:
+ virtual ~IScriptContext() {}
+ public:
+ // Should functions returning options return othing
+ virtual Option<bool> ExecuteCondition(const char8_t *inCond) = 0;
+ // Used for logging.
+ // Error and result are good until next call into the script context.
+ virtual SScriptExecutionResult ExecuteExpressionToString(const char8_t *inExpr) = 0;
+
+ // If return value is false, error is signaled with GetErrorInfo.
+ virtual bool Assign(const char8_t *inVariable, const char8_t *inExpr) = 0;
+ // Assign a string to this variable location.
+ virtual void AssignStr(const char8_t *inVariable, const char8_t *inStr) = 0;
+
+ // If return value is false, error is signaled via GetErrorInfo.
+ // The actual pointer and content used for inscript is expected to not change during
+ // execution of the system.
+ // it is legal for contexts to cache information based off the script pointer value.
+ virtual bool ExecuteScript(const char8_t *inScript) = 0;
+ // Always return 1 result
+ virtual int ExecuteStr(const char8_t *inScript, bool withRet) = 0;
+
+ // Return true on success, false on failure, and Empty on error.
+ virtual Option<bool> BeginForeach(const char8_t *inArray, const char8_t *inItem,
+ const char8_t *inIdxVar = "") = 0;
+ virtual Option<bool> NextForeach(const char8_t *inItem, const char8_t *inIdxVar = "") = 0;
+ virtual void CancelForeach() = 0;
+
+ virtual void SetCurrentEvent(TEventPtr inEvent) = 0;
+ virtual void ClearCurrentEvent() = 0;
+ // Create an event we can attach extra data do.
+ virtual IScriptEvent *CreateScriptEvent(CRegisteredString inName) = 0;
+
+ virtual const char8_t *GetErrorInfo() = 0;
+
+ virtual void SetInterpreter(IStateInterpreter &inInterpreter) = 0;
+
+ virtual CRegisteredString GetContextType() { return CRegisteredString(); }
+ };
+}
+}
+#endif
diff --git a/src/state/Qt3DSStateTypes.h b/src/state/Qt3DSStateTypes.h
new file mode 100644
index 0000000..26aee0e
--- /dev/null
+++ b/src/state/Qt3DSStateTypes.h
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_STATE_TYPES_H
+#define QT3DS_STATE_TYPES_H
+#include "Qt3DSState.h"
+#include "foundation/StringTable.h"
+#include "foundation/Qt3DSInvasiveLinkedList.h"
+#include "foundation/Qt3DSFlags.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSContainers.h"
+#include "foundation/StringTable.h"
+#include "foundation/TaggedPointer.h"
+#include "foundation/Qt3DSVec2.h"
+#include "foundation/Qt3DSVec3.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Utils.h"
+
+namespace qt3ds {
+namespace state {
+ // Events, because they created both inside and outside
+ // the state system by various parties.
+ class IEvent : public NVRefCounted
+ {
+ protected:
+ virtual ~IEvent() {}
+ public:
+ virtual CRegisteredString GetName() const = 0;
+ // Optional type string for rtti. No string means this is an opaque event
+ // that cannot be safely cast to any specific event type.
+ virtual CRegisteredString GetEventType() const { return CRegisteredString(); }
+ };
+
+ typedef NVScopedRefCounted<IEvent> TEventPtr;
+
+ DEFINE_INVASIVE_SINGLE_LIST(Data);
+
+ struct SDataModel
+ {
+ CRegisteredString m_Id;
+ const char8_t *m_Source;
+ const char8_t *m_Expression;
+ TDataList m_Data;
+
+ SDataModel()
+ : m_Source(nullptr)
+ , m_Expression(nullptr)
+ {
+ }
+ };
+
+ struct SData
+ {
+ CRegisteredString m_Id;
+ const char8_t *m_Source;
+ const char8_t *m_Expression;
+ SData *m_NextSibling;
+ SData()
+ : m_Source(nullptr)
+ , m_Expression(nullptr)
+ , m_NextSibling(nullptr)
+ {
+ }
+ };
+
+ IMPLEMENT_INVASIVE_SINGLE_LIST(Data, m_NextSibling);
+}
+}
+
+#endif
diff --git a/src/state/Qt3DSStateVisualBindingContextCommands.h b/src/state/Qt3DSStateVisualBindingContextCommands.h
new file mode 100644
index 0000000..4d08f69
--- /dev/null
+++ b/src/state/Qt3DSStateVisualBindingContextCommands.h
@@ -0,0 +1,348 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_STATE_VISUAL_BINDING_CONTEXT_COMMANDS_H
+#define QT3DS_STATE_VISUAL_BINDING_CONTEXT_COMMANDS_H
+#include "Qt3DSState.h"
+#include "foundation/StringTable.h"
+
+namespace qt3ds {
+namespace state {
+
+ struct VisualStateCommandTypes
+ {
+ enum Enum {
+ NoVisualStateCommand = 0,
+ GotoSlide,
+ CallFunction,
+ SetAttribute,
+ GotoSlideRelative,
+ FireEvent,
+ PresentationAttribute,
+ PlaySound,
+ };
+ };
+
+ struct SlidePlaybackModes
+ {
+ enum Enum {
+ StopAtEnd = 0,
+ Looping,
+ PingPong,
+ Ping,
+ PlaythroughTo,
+ };
+ };
+
+ struct SGotoSlideData
+ {
+ Option<SlidePlaybackModes::Enum> m_Mode;
+ Option<CRegisteredString> m_PlaythroughTo;
+ Option<QT3DSU32> m_StartTime;
+ QT3DSF32 m_Rate;
+ bool m_Reverse;
+ Option<bool> m_Paused;
+ SGotoSlideData()
+ : m_Rate(1.0f)
+ , m_Reverse(false)
+ {
+ }
+ };
+
+ // All the element references in this file need to be absolute, meaning they
+ // must begin with a presentationid:. The is because the state machine exists at the
+ // application level where all presentations are pretty much equal and must be referenced
+ // by id.
+
+ // Go to a particular slide.
+
+ /*
+ a. If the slide attribute references a slide name not present on the time context an error must
+ be logged each time the executable would have been run, and the executable ignored.
+ b. If the time context is already on the slide referenced, no change is made to the time
+ context.
+ The slide does not restart. */
+ struct SGotoSlide
+ {
+ CRegisteredString m_Component;
+ CRegisteredString m_Slide;
+ SGotoSlideData m_GotoSlideData;
+ SGotoSlide(CRegisteredString cmd = CRegisteredString(),
+ CRegisteredString slide = CRegisteredString())
+ : m_Component(cmd)
+ , m_Slide(slide)
+ {
+ }
+ bool operator==(const SGotoSlide &inOther) const
+ {
+ return m_Component == inOther.m_Component && m_Slide == inOther.m_Slide;
+ }
+ template <typename TRemapper>
+ void Remap(TRemapper &inRemapper)
+ {
+ inRemapper.Remap(m_Component);
+ inRemapper.Remap(m_Slide);
+ }
+ };
+
+ /*
+ 1. A <call.../> executable must have a element="..." attribute that references a behavior
+ element in one of the presentation assets for the application.
+ a. If the element attribute is missing, or references an element that cannot be found,
+ an error must be logged each time the executable would have been run, and the executable
+ ignored.
+ b. If the element attribute references an element that is not a behavior then an error
+ must be logged each time the executable would have been run, and the executable ignored.
+ 2. A <call.../> executable must have a handler="..." attribute that references a function value
+ in the table associated with the behavior element.
+ a. If the handler attribute is missing, or references a value that is not a function
+ value, an error must be logged each time the executable would have been run, and the executable
+ ignored.
+ 3. A <call.../> executable may have an args="..." attribute that specifies an expression to
+ evaluate.
+ a. If the result of evaluating this expression is a single value, it is passed as the
+ first argument to the behavior's function.
+ b. If the result of evaluating this expression is a table, it is treated as a list that
+ is unpack'd, the numeric properties sent as arguments in order.
+ c. If the result of evaluating this expression is an error, an error message must be
+ logged and the executable ignored.
+ The function is not invoked with no parameters.
+ */
+ struct SCallFunction
+ {
+ CRegisteredString m_Behavior;
+ CRegisteredString m_Handler;
+ CRegisteredString m_Arguments;
+ SCallFunction(CRegisteredString behavior = CRegisteredString(),
+ CRegisteredString hdler = CRegisteredString(),
+ CRegisteredString args = CRegisteredString())
+ : m_Behavior(behavior)
+ , m_Handler(hdler)
+ , m_Arguments(args)
+ {
+ }
+ bool operator==(const SCallFunction &inOther) const
+ {
+ return m_Behavior == inOther.m_Behavior && m_Handler == inOther.m_Handler
+ && m_Arguments == inOther.m_Arguments;
+ }
+ template <typename TRemapper>
+ void Remap(TRemapper &inRemapper)
+ {
+ inRemapper.Remap(m_Behavior);
+ inRemapper.Remap(m_Handler);
+ inRemapper.Remap(m_Arguments);
+ }
+ };
+
+ /*
+ 1. A <set-attribute.../> executable must have an element="..." attribute that references an
+ element in one of the presentation assets for the application.
+ a. If the element attribute is missing, or references an element that cannot be found,
+ an error must be logged each time the executable would have been run, and the executable
+ ignored.
+ 2. A <set-attribute.../> executable must have an attribute="..." attribute that references an
+ attribute on the referenced element.
+ a. If the attribute attribute is missing, or references an attribute not present on the
+ element, an error must be logged each time the executable would have been run, and the
+ executable ignored.
+ 3. A <set-attribute.../> executable must have an value="..." attribute that describes the value
+ to set.
+ a. The contents of this attribute are evaluated as an expression and the result used
+ to set the attribute.
+ i. If the result of evaluating this expression does not match the type of the
+ attribute on the element then an error must be logged and the executable ignored.
+ 4. If a single visual state has both <goto-slide/> and <set-attribute/> executables, and the
+ slide change affects the same attribute as the set-attribute executable, then the set-attribute
+ executable must take effect (be applied after the slide change occurs).
+ In the future we may wish to have the order of this interaction controllable by the
+ ordering of the executables.
+ */
+ struct SSetAttribute
+ {
+ CRegisteredString m_Element;
+ CRegisteredString m_Attribute;
+ CRegisteredString m_Value;
+ SSetAttribute(CRegisteredString elem = CRegisteredString(),
+ CRegisteredString att = CRegisteredString(),
+ CRegisteredString val = CRegisteredString())
+ : m_Element(elem)
+ , m_Attribute(att)
+ , m_Value(val)
+ {
+ }
+ bool operator==(const SSetAttribute &inOther) const
+ {
+ return m_Element == inOther.m_Element && m_Attribute == inOther.m_Attribute
+ && m_Value == inOther.m_Value;
+ }
+
+ template <typename TRemapper>
+ void Remap(TRemapper &inRemapper)
+ {
+ inRemapper.Remap(m_Element);
+ inRemapper.Remap(m_Attribute);
+ inRemapper.Remap(m_Value);
+ }
+ };
+
+ /*
+ 4. A rel="..." attribute must have either the value next or prev.
+ a. If the rel attribute has a different value an error must be logged each time the
+ executable would have been run, and the executable ignored.
+ b. A value of next causes the time context to go to the next slide.
+ i. If the time context is at the last slide, and there is no wrap attribute, or
+ the wrap attribute does not have a value of true, then no change occurs to the time context.
+ The slide does not restart.
+ ii. If the time context is at the last slide and there exists a wrap attribute
+ with a value of true then the time context is taken to the first slide.
+ c. A value of prev causes the time context to go to the previous slide.
+ i. If the time context is at the first slide, and there is no wrap attribute, or
+ the wrap attribute does not have a value of true, then no change occurs to the time context.
+ The slide does not restart.
+ ii. If the time context is at the last first and there exists a wrap attribute
+ with a value of true then the time context is taken to the last slide.
+ */
+ struct SGotoSlideRelative
+ {
+ CRegisteredString m_Component;
+ enum Enum {
+ Next = 0,
+ Previous,
+ Error,
+ };
+ Enum m_Direction;
+ bool m_Wrap;
+ SGotoSlideData m_GotoSlideData;
+ SGotoSlideRelative(CRegisteredString comp = CRegisteredString(), Enum dir = Next,
+ bool wrap = false)
+ : m_Component(comp)
+ , m_Direction(dir)
+ , m_Wrap(wrap)
+ {
+ }
+ bool operator==(const SGotoSlideRelative &inOther) const
+ {
+ return m_Component == inOther.m_Component && m_Direction == inOther.m_Direction
+ && m_Wrap == inOther.m_Wrap;
+ }
+ template <typename TRemapper>
+ void Remap(TRemapper &inRemapper)
+ {
+ inRemapper.Remap(m_Component);
+ }
+ };
+
+ /*
+ 1. A <fire-event.../> executable must have an element="..." attribute that references an element
+ in one of the presentation assets for the application.
+ a. If the element attribute is missing, or references an element that cannot be found,
+ an error must be logged each time the executable would have been run, and the executable
+ ignored.
+ 2. A <fire-event.../> executable must have an event="..." attribute that describes the event
+ name to fire.
+ a. If the event attribute is missing an error must be logged each time the executable
+ would have been run, and the executable ignored.
+ */
+ struct SFireEvent
+ {
+ CRegisteredString m_Element;
+ CRegisteredString m_Event;
+ SFireEvent(CRegisteredString elem, CRegisteredString evt)
+ : m_Element(elem)
+ , m_Event(evt)
+ {
+ }
+ SFireEvent() {}
+ bool operator==(const SFireEvent &inOther) const
+ {
+ return m_Element == inOther.m_Element && m_Event == inOther.m_Event;
+ }
+
+ template <typename TRemapper>
+ void Remap(TRemapper &inRemapper)
+ {
+ inRemapper.Remap(m_Element);
+ inRemapper.Remap(m_Event);
+ }
+ };
+
+ struct SPresentationAttribute
+ {
+ CRegisteredString m_Presentation;
+ CRegisteredString m_Attribute;
+ CRegisteredString m_Value;
+ SPresentationAttribute(CRegisteredString pres, CRegisteredString att, CRegisteredString val)
+ : m_Presentation(pres)
+ , m_Attribute(att)
+ , m_Value(val)
+ {
+ }
+ SPresentationAttribute() {}
+ bool operator==(const SPresentationAttribute &inOther) const
+ {
+ return m_Presentation == inOther.m_Presentation && m_Attribute == inOther.m_Attribute
+ && m_Value == inOther.m_Value;
+ }
+
+ template <typename TRemapper>
+ void Remap(TRemapper &inRemapper)
+ {
+ inRemapper.Remap(m_Presentation);
+ inRemapper.Remap(m_Attribute);
+ inRemapper.Remap(m_Value);
+ }
+ };
+
+ struct SPlaySound
+ {
+ CRegisteredString m_SoundFilePath;
+ SPlaySound(CRegisteredString inSoundFilePath)
+ : m_SoundFilePath(inSoundFilePath)
+ {
+ }
+ SPlaySound() {}
+ bool operator==(const SPlaySound &inOther) const
+ {
+ return m_SoundFilePath == inOther.m_SoundFilePath;
+ }
+
+ template <typename TRemapper>
+ void Remap(TRemapper &inRemapper)
+ {
+ inRemapper.Remap(m_SoundFilePath);
+ }
+ };
+
+ // defined in UICStateVisualBindingContextValues.h
+ struct SVisualStateCommand;
+}
+}
+#endif
diff --git a/src/system/Qt3DSArray.h b/src/system/Qt3DSArray.h
new file mode 100644
index 0000000..805b8b0
--- /dev/null
+++ b/src/system/Qt3DSArray.h
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "Qt3DSMemorySettings.h"
+#include "Qt3DSMemory.h"
+#include "Qt3DSPlatformSpecific.h"
+
+#ifdef WIN32
+#pragma warning(disable : 4625) // copy constructor could not be generated because a base class copy
+ // constructor is inaccessible
+#pragma warning(disable : 4626) // assignment operator could not be generated because a base class
+ // assignment operator is inaccessible
+#endif
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Constants
+//==============================================================================
+#define NVARRAY_NOTFOUND -1
+
+//==============================================================================
+/**
+ * Ordered Collection also knows as a vector.
+ *
+ * Use Reserve or the constructor parameter if you know how many slots
+ * will be needed to prevent frequent reallocations during growth.
+ *
+ * The array grows by DEFAULT_GROWFACTOR aka 20% whenever it overflows. By
+ * setting the factor to 0 it will still clamp to 1 and instead grow the
+ * array by one slot at a time. This is not ideal but given a pooled memory
+ * manager you will not thrash memory too much since you will grow inside
+ * each pool chunk and only reallocate when switching pools.
+ *
+ * Naming of CArray instances are used to enable memory tracking of arrays
+ * that have gone berzerk or less frequently used instances that could be
+ * released after usage.
+ *
+ * The FOR_ARRAY macro is the preferred way to process all array slots.
+ */
+template <class T>
+class CArray
+{
+//==============================================================================
+// Constants
+//==============================================================================
+#define DEFAULT_GROWFACTOR 1.2f
+
+ //==============================================================================
+ // Types
+ //==============================================================================
+public:
+ typedef T TType; ///< Easy access to template type
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ CHAR m_Name[32]; ///< Allows easy ID using memory reporting
+ T *m_Data; ///< Allocated memory containing array data
+ INT32 m_Capacity; ///< Max number of slots possible
+ INT32 m_Count; ///< Current number of slots in array
+ FLOAT m_GrowFactor; ///< Factor by which array grows when out of space
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ inline CArray(const INT32 inCapacity = 0, const FLOAT inGrowFactor = DEFAULT_GROWFACTOR,
+ const CHAR *inName = NULL);
+ inline CArray(const CArray<T> &);
+ inline ~CArray();
+
+public: // Management
+ inline void SetName(const CHAR *inName = NULL);
+ inline INT32 GetCount() const;
+ inline INT32 GetCapacity() const;
+ inline void Clear(const BOOL inRelease = true);
+ inline void Reserve(const INT32 inCapacity, const BOOL inExpand = false);
+
+public: // Stack access
+ void Push(const T &inValue);
+ inline const T &Pop();
+ inline const T &Top() const;
+
+public: // Random access
+ inline INT32 GetIndex(const T &inValue) const;
+ inline T &operator[](const INT32 inIndex) const;
+ inline void Remove(const INT32 inIndex);
+
+public: // FOR_ARRAY iteration
+ inline T *Begin() const;
+ inline T *End() const;
+
+private: // Disabled Copy Construction
+ inline CArray<T> &operator=(const CArray<T> &);
+};
+
+} // namespace Q3DStudio
+
+//==============================================================================
+// Template code
+//==============================================================================
+#include "Qt3DSArray.inl"
diff --git a/src/system/Qt3DSArray.inl b/src/system/Qt3DSArray.inl
new file mode 100644
index 0000000..a9667fd
--- /dev/null
+++ b/src/system/Qt3DSArray.inl
@@ -0,0 +1,287 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2007 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ *
+ * @param inCapacity preallocated number of slots to avoid growth reallocation
+ * @param inGrowFactor factor by which the array grows when out of space
+ * @param inName 32 byte unique identifier for memory tracking
+ */
+template <typename T> inline
+CArray<T>::CArray( const INT32 inCapacity, const FLOAT inGrowFactor, const CHAR* inName ) :
+ m_Data( NULL ),
+ m_Capacity( 0 ),
+ m_Count( 0 ),
+ m_GrowFactor( inGrowFactor )
+{
+ // Disallow negative growth
+ if ( m_GrowFactor < 1.0f )
+ m_GrowFactor = DEFAULT_GROWFACTOR;
+
+ SetName( inName );
+ Reserve( inCapacity );
+}
+
+//==============================================================================
+/**
+ * Berger's Copy Constructor.
+ */
+template <typename T> inline
+CArray<T>::CArray( const CArray<T>& inOther ) :
+ m_Data( NULL ),
+ m_Capacity( 0 ),
+ m_Count( 0 ),
+ m_GrowFactor( inOther.m_GrowFactor )
+{
+ // Disallow negative growth
+ if ( m_GrowFactor < 1.0f )
+ m_GrowFactor = DEFAULT_GROWFACTOR;
+
+ SetName( inOther.m_Name );
+ Reserve( inOther.m_Capacity );
+ FOR_ARRAY( T, theTemp, inOther )
+ {
+ Push( *theTemp );
+ }
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+template <class T> inline
+CArray<T>::~CArray( )
+{
+ Clear( true );
+}
+
+//==============================================================================
+/**
+ * Name an array instance to easily identify it during memory reporting.
+ * @param inName 32 byte unique identifier
+ */
+template <class T> inline
+void CArray<T>::SetName( const CHAR* inName /*= NULL*/ )
+{
+ Q3DStudio_sprintf( m_Name, sizeof( m_Name ), "%s", inName ? inName : "CArray<T>" );
+}
+
+//==============================================================================
+/**
+ * Count is the number of elements in the array.
+ * @return current count of the array
+ */
+template <class T> inline
+INT32 CArray<T>::GetCount( ) const
+{
+ return m_Count;
+}
+
+//==============================================================================
+/**
+ * Get the capacity of the array
+ * Capacity reflects the max count before reallocation happens.
+ * @return capacity of the array
+ */
+template <class T> inline
+INT32 CArray<T>::GetCapacity( ) const
+{
+ return m_Capacity;
+}
+
+//==============================================================================
+/**
+ * Clear the array by reducing the number of elements to zero.
+ *
+ * Using the release flag keeps the memory load low but could be
+ * suboptimal in situations where you are always using roughly the same
+ * number of elements. In that scenario, the array would have to build up
+ * and reallocate up to the same number of elements every time causing
+ * stress on the system. Clearing but keeping the buffer by setting
+ * release to false is optimal in that case.
+ *
+ * @param inRelease true to release memory, false keeps old buffer
+ */
+template <class T> inline
+void CArray<T>::Clear( const BOOL inRelease )
+{
+ m_Count = 0;
+
+ if ( inRelease )
+ {
+ Q3DStudio_free( m_Data, T, m_Capacity );
+ m_Capacity = 0;
+ m_Data = NULL;
+ }
+ else
+ Q3DStudio_memset( m_Data, 0 , sizeof( T ) * m_Capacity );
+}
+
+//==============================================================================
+/**
+ * Allocate enough memory to store T.
+ *
+ * If current memory is not sufficient, new block of memory is allocated and
+ * data in current memory is copied to the new block of memory. Data pointer will
+ * point to the new block of memory and current memory is released.
+ *
+ * @param inCapacity indicate the amount of memory required.
+ * @param inExpand true to not only allocate but also extend array
+ */
+template <class T> inline
+void CArray<T>::Reserve( const INT32 inCapacity, const BOOL inExpand )
+{
+ if ( inCapacity > m_Capacity )
+ {
+ T* theData = Q3DStudio_allocate_desc( T, inCapacity, m_Name );
+ Q3DStudio_memset( theData, 0 , sizeof( T ) * inCapacity );
+ if ( m_Data != NULL )
+ {
+ Q3DStudio_memcpy( theData, m_Data, sizeof( T ) * m_Count );
+ Q3DStudio_free( m_Data, T, m_Capacity );
+ }
+ m_Data = theData;
+ m_Capacity = inCapacity;
+ }
+
+ if ( inExpand )
+ m_Count = inCapacity;
+}
+
+//==============================================================================
+/**
+ * Insert T to the end of the array
+ * @param inValue value of datatype T
+ */
+template <class T> inline
+void CArray<T>::Push( const T& inValue )
+{
+ if ( m_Count == m_Capacity )
+ Reserve( static_cast<INT32>( m_GrowFactor * m_Capacity ) + 1 );
+
+ m_Data[m_Count++] = inValue;
+}
+
+//==============================================================================
+/**
+ * Remove and retrieve T which is at the end of the array
+ * @return value of datatype T
+ */
+template <class T> inline
+const T& CArray<T>::Pop( )
+{
+ return m_Data[--m_Count];
+}
+
+//==============================================================================
+/**
+ * Get T which is at the end of the array
+ * @return reference of value of datatype T
+ */
+template <class T> inline
+const T& CArray<T>::Top( ) const
+{
+ return m_Data[m_Count - 1];
+}
+
+//==============================================================================
+/**
+ * Get index of first element that matches inValue
+ * @return index of element matching T or INDEX_NOTFOUND
+ */
+template <class T> inline
+INT32 CArray<T>::GetIndex( const T& inValue ) const
+{
+ for ( INT32 theIndex = 0; theIndex < m_Count; ++theIndex )
+ if ( inValue == m_Data[theIndex] )
+ return theIndex;
+ return NVARRAY_NOTFOUND;
+}
+
+//==============================================================================
+/**
+ * Get the element at a particular index position of the array.
+ * @note Range checking is only done is debug builds.
+ * @param inIndex the index of the array
+ * @return reference of value of datatype T
+ */
+template <class T> inline
+T& CArray<T>::operator[]( const INT32 inIndex ) const
+{
+ Q3DStudio_ASSERT( inIndex >= 0 && inIndex < m_Capacity );
+ return m_Data[inIndex];
+}
+
+//==============================================================================
+/**
+ * Remove T that resides at a particular index position of the array.
+ * Other T data with higher index value is shifted to occupy the empty slot
+ * created in the removal process.
+ * @param inIndex the index of the array
+ */
+template <class T> inline
+void CArray<T>::Remove( const INT32 inIndex )
+{
+ Q3DStudio_memmove( m_Data + inIndex, m_Data + inIndex + 1, sizeof( T ) * ( m_Count - inIndex - 1 ) );
+ --m_Count;
+}
+
+//==============================================================================
+/**
+ * Get T at the first index of the array.
+ * Mainly used for FOR_ARRAY macro implementation
+ * @return pointer to first value in array
+ */
+template <class T> inline
+T* CArray<T>::Begin( ) const
+{
+ return m_Data;
+}
+
+//==============================================================================
+/**
+ * Get T at the last index of the array.
+ * Mainly used for FOR_ARRAY macro implementation
+ * @return pointer to one beyond last value in array
+ */
+template <class T> inline
+T* CArray<T>::End( ) const
+{
+ return m_Data + m_Count;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSAssert.cpp b/src/system/Qt3DSAssert.cpp
new file mode 100644
index 0000000..63d3876
--- /dev/null
+++ b/src/system/Qt3DSAssert.cpp
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSAssert.h"
+#include "foundation/Qt3DSLogging.h"
+//==============================================================================
+// Platform Specific Includes
+//==============================================================================
+#if defined(_PCPLATFORM)
+#pragma warning(push, 3)
+#include <Windows.h>
+#include <crtdbg.h>
+#pragma warning(pop)
+#endif // #if defined (_PCPLATFORM)
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Global Variables
+//==============================================================================
+CAssert::TFunction CAssert::s_AssertFunction = CAssert::Default; ///< Default assert function
+
+//==============================================================================
+/**
+ * Default method for asserts
+ */
+void CAssert::Default(const CHAR *inAssert, const CHAR *inFile, INT32 inLine,
+ const CHAR *inFunction)
+{
+ // Use logger to report the string first
+ qCCritical (qt3ds::INTERNAL_ERROR) << "Assertion failed: " << inFile << " " << inLine
+ << " " << inAssert << " " << inFunction;
+
+#if defined(_DEBUG) && defined(_PCPLATFORM) && defined(QT3DS_VC)
+ if (_CrtDbgReport(_CRT_ASSERT, inFile, inLine, inFunction, "Assertion Failed") == 1)
+ ::DebugBreak();
+#endif // _DEBUG & _PCPLATFORM
+}
+
+//==============================================================================
+/**
+ * Method for setting the assert function
+ */
+void CAssert::SetFunction(TFunction inAssert)
+{
+ s_AssertFunction = inAssert;
+}
+
+//==============================================================================
+/**
+ * Method for getting the assert function
+ */
+CAssert::TFunction CAssert::GetFunction()
+{
+ return s_AssertFunction;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSAssert.h b/src/system/Qt3DSAssert.h
new file mode 100644
index 0000000..a64ca7f
--- /dev/null
+++ b/src/system/Qt3DSAssert.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "Qt3DSTypes.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Static gateway for all asserts.
+ *
+ * By setting your own assert function you can redirect all Runtime asserts.
+ * By default it uses the internal Default method that uses CLog for output
+ * and displays a dialog on Windows PCs.
+ */
+class CAssert
+{
+ //==============================================================================
+ // Typedefs
+ //==============================================================================
+public:
+ typedef void (*TFunction)(const Q3DStudio::CHAR *inAssert, const Q3DStudio::CHAR *inFile,
+ Q3DStudio::INT32 inLine, const Q3DStudio::CHAR *inFunction);
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ static TFunction s_AssertFunction; ///< Function pointer to active assert function
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+private: // Hidden Constructor
+ CAssert();
+
+public: // Static Usage
+ static void Default(const Q3DStudio::CHAR *inAssert, const Q3DStudio::CHAR *inFile,
+ Q3DStudio::INT32 inLine, const Q3DStudio::CHAR *inFunction);
+
+public: // Static Configuration
+ static void SetFunction(TFunction inAssert);
+ static TFunction GetFunction();
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSAudioPlayer.h b/src/system/Qt3DSAudioPlayer.h
new file mode 100644
index 0000000..3b6f3ef
--- /dev/null
+++ b/src/system/Qt3DSAudioPlayer.h
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+namespace Q3DStudio {
+
+class IAudioPlayer
+{
+public:
+ virtual ~IAudioPlayer() {}
+ virtual bool PlaySoundFile(const char *inFilePath) = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSBasicPluginDLL.h b/src/system/Qt3DSBasicPluginDLL.h
new file mode 100644
index 0000000..63a2d1f
--- /dev/null
+++ b/src/system/Qt3DSBasicPluginDLL.h
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//==============================================================================
+// Includes
+//==============================================================================
+#pragma once
+
+#include <QtGlobal>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//==============================================================================
+// Enums
+//==============================================================================
+typedef enum _EDLLSTATUS { EDLLSTATUS_FAIL = 0, EDLLSTATUS_OK } EDLLSTATUS;
+
+// GetPluginType should return this
+typedef enum _EDLLTYPE {
+ EDLLTYPE_UNKNOWN = 0,
+ EDLLTYPE_RENDERABLE_PLUGIN,
+ EDLLTYPE_CUSTOM_OBJECT,
+} EDLLTYPE;
+
+//==============================================================================
+// Function declarations
+//==============================================================================
+
+//==============================================================================
+/**
+ * Return the plugin type.
+ * @return plugin type
+ */
+typedef long (*PROC_GetPluginType)();
+Q_DECL_EXPORT long GetPluginType();
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/system/Qt3DSBezierEval.h b/src/system/Qt3DSBezierEval.h
new file mode 100644
index 0000000..c4d733a
--- /dev/null
+++ b/src/system/Qt3DSBezierEval.h
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Generic Bezier parametric curve evaluation at a given parametric value.
+ * @param inP0 control point P0
+ * @param inP1 control point P1
+ * @param inP2 control point P2
+ * @param inP3 control point P3
+ * @param inS the variable
+ * @return the evaluated value on the bezier curve
+ */
+inline FLOAT EvaluateBezierCurve(FLOAT inP0, FLOAT inP1, FLOAT inP2, FLOAT inP3, const FLOAT inS)
+{
+ // Using:
+ // Q(s) = Sum i=0 to 3 ( Pi * Bi,3(s))
+ // where:
+ // Pi is a control point and
+ // Bi,3 is a basis function such that:
+ //
+ // B0,3(s) = (1 - s)^3
+ // B1,3(s) = (3 * s) * (1 - s)^2
+ // B2,3(s) = (3 * s^2) * (1 - s)
+ // B3,3(s) = s^3
+
+ /* FLOAT theSSquared = inS * inS; //
+ t^2
+ FLOAT theSCubed = theSSquared * inS; //
+ t^3
+
+ FLOAT theSDifference = 1 - inS; // (1 -
+ t)
+ FLOAT theSDifferenceSquared = theSDifference * theSDifference; // (1 -
+ t)^2
+ FLOAT theSDifferenceCubed = theSDifferenceSquared * theSDifference; // (1 - t)^3
+
+ FLOAT theFirstTerm = theSDifferenceCubed; // (1 -
+ t)^3
+ FLOAT theSecondTerm = ( 3 * inS ) * theSDifferenceSquared; // (3 * t) * (1
+ - t)^2
+ FLOAT theThirdTerm = ( 3 * theSSquared ) * theSDifference; // (3 * t^2) *
+ (1 - t)
+ FLOAT theFourthTerm = theSCubed; //
+ t^3
+
+ // Q(t) = ( p0 * (1 - t)^3 ) + ( p1 * (3 * t) * (1 - t)^2 ) + ( p2 * (3 * t^2) * (1 - t)
+ ) + ( p3 * t^3 )
+ return ( inP0 * theFirstTerm ) + ( inP1 * theSecondTerm ) + ( inP2 * theThirdTerm ) + (
+ inP3 * theFourthTerm );*/
+
+ FLOAT theFactor = inS * inS;
+ inP1 *= 3 * inS;
+ inP2 *= 3 * theFactor;
+ theFactor *= inS;
+ inP3 *= theFactor;
+
+ theFactor = 1 - inS;
+ inP2 *= theFactor;
+ theFactor *= 1 - inS;
+ inP1 *= theFactor;
+ theFactor *= 1 - inS;
+ inP0 *= theFactor;
+
+ return inP0 + inP1 + inP2 + inP3;
+}
+
+//==============================================================================
+/**
+ * Inverse Bezier parametric curve evaluation to get parametric value for a given output.
+ * This is equal to finding the root(s) of the Bezier cubic equation.
+ * @param inP0 control point P0
+ * @param inP1 control point P1
+ * @param inP2 control point P2
+ * @param inP3 control point P3
+ * @param inX the variable
+ * @return the evaluated value
+ */
+inline FLOAT EvaluateInverseBezierCurve(const FLOAT inP0, const FLOAT inP1, const FLOAT inP2,
+ const FLOAT inP3, const FLOAT inX)
+{
+ FLOAT theResult = 0;
+
+ // Using:
+ // Q(s) = Sum i=0 to 3 ( Pi * Bi,3(s))
+ // where:
+ // Pi is a control point and
+ // Bi,3 is a basis function such that:
+ //
+ // B0,3(s) = (1 - s)^3
+ // B1,3(s) = (3 * s) * (1 - s)^2
+ // B2,3(s) = (3 * s^2) * (1 - s)
+ // B3,3(s) = s^3
+
+ // The Bezier cubic equation:
+ // inX = inP0*(1-s)^3 + inP1*(3*s)*(1-s)^2 + inP2*(3*s^2)*(1-s) + inP3*s^3
+ // = s^3*( -inP0 + 3*inP1 - 3*inP2 +inP3 ) + s^2*( 3*inP0 - 6*inP1 + 3*inP2 ) + s*( -3*inP0
+ // + 3*inP1 ) + inP0
+ // For cubic eqn of the form: c[0] + c[1]*x + c[2]*x^2 + c[3]*x^3 = 0
+ FLOAT theConstants[4];
+ theConstants[0] = static_cast<FLOAT>(inP0 - inX);
+ theConstants[1] = static_cast<FLOAT>(-3 * inP0 + 3 * inP1);
+ theConstants[2] = static_cast<FLOAT>(3 * inP0 - 6 * inP1 + 3 * inP2);
+ theConstants[3] = static_cast<FLOAT>(-inP0 + 3 * inP1 - 3 * inP2 + inP3);
+
+ FLOAT theSolution[3] = { 0 };
+
+ if (theConstants[3] == 0) {
+ if (theConstants[2] == 0) {
+ if (theConstants[1] == 0)
+ theResult = 0;
+ else
+ theResult = -theConstants[0] / theConstants[1]; // linear
+ } else {
+ // quadratic
+ INT32 theNumRoots = CCubicRoots::SolveQuadric(theConstants, theSolution);
+ theResult = static_cast<FLOAT>(theSolution[theNumRoots / 2]);
+ }
+ } else {
+ INT32 theNumRoots = CCubicRoots::SolveCubic(theConstants, theSolution);
+ theResult = static_cast<FLOAT>(theSolution[theNumRoots / 3]);
+ }
+
+ return theResult;
+}
+
+inline FLOAT EvaluateBezierKeyframe(FLOAT inTime, FLOAT inTime1, FLOAT inValue1, FLOAT inC1Time,
+ FLOAT inC1Value, FLOAT inC2Time, FLOAT inC2Value, FLOAT inTime2,
+ FLOAT inValue2)
+{
+
+ // The special case of C1Time=0 and C2Time=0 is used to indicate Studio-native animation.
+ // Studio uses a simplified version of the bezier animation where the time control points
+ // are equally spaced between the starting and ending times. This avoids calling the expensive
+ // InverseBezierCurve function to find the right 's' given 't'.
+ FLOAT theParameter;
+ if (inC1Time == 0 && inC2Time == 0) {
+ // Special case signaling that it's ok to treat time as "s"
+ // This is done by assuming that Key1Val,Key1C1,Key1C2,Key2Val (aka P0,P1,P2,P3)
+ // are evenly distributed over time.
+ theParameter = (inTime - inTime1) / (inTime2 - inTime1);
+ } else {
+ // Compute the "s" parameter on the Bezier given the time
+ theParameter = EvaluateInverseBezierCurve(inTime1, inC1Time, inC2Time, inTime2, inTime);
+ if (theParameter <= 0.0f)
+ return inValue1;
+ if (theParameter >= 1.0f)
+ return inValue2;
+ }
+
+ return EvaluateBezierCurve(inValue1, inC1Value, inC2Value, inValue2, theParameter);
+}
+}
diff --git a/src/system/Qt3DSBoundingBox.cpp b/src/system/Qt3DSBoundingBox.cpp
new file mode 100644
index 0000000..2a9331d
--- /dev/null
+++ b/src/system/Qt3DSBoundingBox.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSBoundingBox.h"
+#include "Qt3DSMatrix.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor - creates an empty BoundingBox
+ */
+CBoundingBox::CBoundingBox()
+ : m_Min(1.0f, 1.0f, 1.0f)
+ , m_Max(-1.0f, -1.0f, -1.0f)
+{
+}
+
+//==============================================================================
+/**
+ * Make BoundingBox invalid
+ */
+void CBoundingBox::SetEmpty()
+{
+ m_Min.Set(1.0f, 1.0f, 1.0f);
+ m_Max.Set(-1.0f, -1.0f, -1.0f);
+}
+
+//==============================================================================
+/**
+ * Is the BoundingBox empty?
+ * @return true if bounding box is empty, false otherwise
+ */
+BOOL CBoundingBox::IsEmpty() const
+{
+ return (m_Min.m_X > m_Max.m_X);
+}
+
+//==============================================================================
+/**
+ * Add a point to the BoundingBox
+ * @param inPoint a 3D point
+ */
+void CBoundingBox::Add(const RuntimeVector3 &inPoint)
+{
+ if (IsEmpty()) {
+ m_Min = inPoint;
+ m_Max = inPoint;
+ } else {
+ m_Min.Minimize(inPoint);
+ m_Max.Maximize(inPoint);
+ }
+}
+
+//==============================================================================
+/**
+ * Add another BoundingBox to this BoundingBox
+ * @param inBox a 3D BoundingBox
+ */
+void CBoundingBox::Add(const CBoundingBox &inBox)
+{
+ if (!inBox.IsEmpty()) {
+ Add(inBox.GetMin());
+ Add(inBox.GetMax());
+ }
+}
+
+//==============================================================================
+/**
+ * Get the bounding box's smallest position
+ * @return the smallest position of the bounding box
+ */
+const RuntimeVector3 &CBoundingBox::GetMin() const
+{
+ return m_Min;
+}
+
+//==============================================================================
+/**
+ * Get the bounding box's largest position
+ * @return the largest position of the bounding box
+ */
+const RuntimeVector3 &CBoundingBox::GetMax() const
+{
+ return m_Max;
+}
+
+//==============================================================================
+/**
+ * Apply a transform to the BoundingBox
+ * @param inMatrix a 4x4 trasnform matrix
+ */
+void CBoundingBox::Transform(const RuntimeMatrix &inMatrix)
+{
+ // Apply transform to the 8 corners of the BoundingBox and renormalize to majox axes
+ CBoundingBox theTransformedBox;
+ RuntimeVector3 theCorners[8];
+
+ theCorners[0].Set(m_Min.m_X, m_Min.m_Y, m_Min.m_Z);
+ theCorners[1].Set(m_Min.m_X, m_Min.m_Y, m_Max.m_Z);
+ theCorners[2].Set(m_Min.m_X, m_Max.m_Y, m_Min.m_Z);
+ theCorners[3].Set(m_Min.m_X, m_Max.m_Y, m_Max.m_Z);
+ theCorners[4].Set(m_Max.m_X, m_Min.m_Y, m_Min.m_Z);
+ theCorners[5].Set(m_Max.m_X, m_Min.m_Y, m_Max.m_Z);
+ theCorners[6].Set(m_Max.m_X, m_Max.m_Y, m_Min.m_Z);
+ theCorners[7].Set(m_Max.m_X, m_Max.m_Y, m_Max.m_Z);
+
+ for (INT32 theIndex = 0; theIndex < 8; ++theIndex) {
+ theCorners[theIndex].Transform(inMatrix);
+ theTransformedBox.Add(theCorners[theIndex]);
+ }
+ *this = theTransformedBox;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSBoundingBox.h b/src/system/Qt3DSBoundingBox.h
new file mode 100644
index 0000000..988a9ba
--- /dev/null
+++ b/src/system/Qt3DSBoundingBox.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSVector3.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class RuntimeMatrix;
+
+//==============================================================================
+/**
+ * Axis aligned 3D bounding box construction and manipulation.
+ *
+ * Initial construction creates an inverted box signifying an Empty box instead
+ * of an infinitely small box at 0,0,0. Keep this in mind when asking for
+ * Min or max on a box that has had no points added to it.
+ *
+ * Transforming a box simply transforms all eight corners to span a new
+ * axis aligned bounding box. Successive transformations can thus create a
+ * non-optimal box, much larger than needed.
+ */
+class CBoundingBox
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+public:
+ RuntimeVector3 m_Min; ///< box minimum corner point
+ RuntimeVector3 m_Max; ///< box maximum corner point
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CBoundingBox();
+
+public: // Functions
+ BOOL IsEmpty() const;
+ void SetEmpty();
+ void Add(const RuntimeVector3 &inPoint);
+ void Add(const CBoundingBox &inBox);
+ const RuntimeVector3 &GetMin() const;
+ const RuntimeVector3 &GetMax() const;
+ void Transform(const RuntimeMatrix &inMatrix);
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSCircularArray.h b/src/system/Qt3DSCircularArray.h
new file mode 100644
index 0000000..be92167
--- /dev/null
+++ b/src/system/Qt3DSCircularArray.h
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Circular array. Not growable for now.
+ * The "streamlined" interface acts like a resource pool where construction of
+ * item T is minimized.
+ */
+template <class T>
+class CCircularArray
+{
+ //==============================================================================
+ // Types
+ //==============================================================================
+public:
+ typedef T TType; ///< Easy access to template type
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ CHAR m_Name[32]; ///< Allows easy ID if it grows too much
+ T *m_Data; ///< Allocated memory containing array data
+ INT32 m_Capacity; ///< Max number of elements possible
+ INT32 m_Count; ///< Current number of elements in array
+
+ INT32 m_Begin; ///< circular list indices
+ INT32 m_End; ///< circular list indices
+
+ // For 32-bit alignment
+ BOOL m_Full; ///< flag to indicate circular list is full
+ BOOL m_Paddings[3]; ///< Padding
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ inline CCircularArray(const INT32 inCapacity = 0, const CHAR *inName = NULL);
+ inline ~CCircularArray();
+
+public: // Management
+ inline INT32 GetCount() const;
+ inline INT32 GetCapacity() const;
+ inline void Clear(const BOOL inRelease = false);
+ inline void Reserve(const INT32 inCapacity);
+
+public: // Stack access
+ inline T &NewEntry();
+ inline void Pop();
+ inline T &Top();
+
+public: // Status
+ BOOL IsEmpty() const;
+ BOOL IsFull() const;
+
+protected: // Internal methods
+ void Increment(INT32 &outIndex);
+ void Decrement(INT32 &outIndex);
+ void UpdateFullStatus();
+};
+
+} // namespace Q3DStudio
+
+//==============================================================================
+// Template code
+//==============================================================================
+#include "Qt3DSCircularArray.inl"
diff --git a/src/system/Qt3DSCircularArray.inl b/src/system/Qt3DSCircularArray.inl
new file mode 100644
index 0000000..0d7f081
--- /dev/null
+++ b/src/system/Qt3DSCircularArray.inl
@@ -0,0 +1,225 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2007 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ */
+template <typename T> inline
+CCircularArray<T>::CCircularArray( const INT32 inCapacity, const CHAR* inName ) :
+ m_Data( NULL ),
+ m_Capacity( 0 ),
+ m_Count( 0 ),
+ m_Begin( 0 ),
+ m_End( 0 ),
+ m_Full( false )
+{
+ Q3DStudio_sprintf( m_Name, sizeof( m_Name ), "%s", inName ? inName : "CircularArray" );
+ Reserve( inCapacity );
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+template <class T> inline
+CCircularArray<T>::~CCircularArray( )
+{
+ Clear( true );
+}
+
+//==============================================================================
+/**
+ * Get the number of items in the array
+ * @return the number of items in the array
+ */
+template <class T> inline
+INT32 CCircularArray<T>::GetCount( ) const
+{
+ return m_Count;
+}
+
+//==============================================================================
+/**
+ * Get the capacity of the array
+ * @return the capacity of the array
+ */
+template <class T> inline
+INT32 CCircularArray<T>::GetCapacity( ) const
+{
+ return m_Capacity;
+}
+
+//==============================================================================
+/**
+ * Remove all items from the array
+ * @param inRelease if true, release the allocated memory, if false, reset
+ * parameters back to zero.
+ */
+template <class T> inline
+void CCircularArray<T>::Clear( const BOOL inRelease )
+{
+ m_Count = 0;
+ m_Begin = 0;
+ m_End = 0;
+ m_Full = false;
+
+ if ( inRelease )
+ {
+ Q3DStudio_free( m_Data, T, m_Capacity );
+ m_Capacity = 0;
+ m_Data = NULL;
+ }
+}
+
+//==============================================================================
+/**
+ * Change capacity of the array
+ * Assume no expansion for circular array
+ * @param inCapacity the new capacity to set
+ */
+template <class T> inline
+void CCircularArray<T>::Reserve( const INT32 inCapacity )
+{
+ Q3DStudio_ASSERT( !m_Data );
+ T* theData = Q3DStudio_allocate_desc( T, inCapacity, m_Name );
+ m_Data = theData;
+ m_Capacity = inCapacity;
+}
+
+//==============================================================================
+/**
+ * Create a new uninitialized item at the end of the array.
+ * The returned reference is used to initialize the item.
+ * @return a reference to the item
+ */
+template <class T> inline
+T& CCircularArray<T>::NewEntry( )
+{
+ Q3DStudio_ASSERT( !IsFull( ) );
+ T& theResult = m_Data[m_End];
+ Increment( m_End );
+ UpdateFullStatus( );
+ ++m_Count;
+ return theResult;
+}
+
+//==============================================================================
+/**
+ * Remove the top entry from the array
+ */
+template <class T> inline
+void CCircularArray<T>::Pop( )
+{
+ Q3DStudio_ASSERT( !IsEmpty( ) );
+ Increment( m_Begin );
+ m_Full = false;
+ --m_Count;
+}
+
+//==============================================================================
+/**
+ * Get the top item from the
+ * @return a reference to the item
+ */
+template <class T> inline
+T& CCircularArray<T>::Top( )
+{
+ Q3DStudio_ASSERT( !IsEmpty( ) );
+ return m_Data[m_Begin];
+}
+
+//==============================================================================
+/**
+ * Check if the array is empty
+ * @return true if empty, false otherwise.
+ */
+template <class T> inline
+BOOL CCircularArray<T>::IsEmpty( ) const
+{
+ return ( m_Begin == m_End ) && !m_Full;
+}
+
+//==============================================================================
+/**
+ * Check if the array is full
+ * @return true if full, false otherwise.
+ */
+template <class T> inline
+BOOL CCircularArray<T>::IsFull( ) const
+{
+ return m_Full;
+}
+
+//==============================================================================
+/**
+ * Increment index of the array
+ * @param outIndex the index to increment
+ */
+template <class T> inline
+void CCircularArray<T>::Increment( INT32& outIndex )
+{
+ ++outIndex;
+ // circular list wrap-around
+ if ( outIndex >= m_Capacity )
+ outIndex = 0;
+}
+
+//==============================================================================
+/**
+ * Decrement index of the array
+ * @param outIndex the index to decrement
+ */
+template <class T> inline
+void CCircularArray<T>::Decrement( INT32& outIndex )
+{
+ --outIndex;
+ // circular list wrap-around
+ if ( outIndex < 0 )
+ outIndex = m_Capacity - 1;
+}
+
+//==============================================================================
+/**
+ * Update the status of the m_Full flag.
+ * This is an internal method for use ONLY AFTER a item has been added to the array.
+ */
+template <class T> inline
+void CCircularArray<T>::UpdateFullStatus( )
+{
+ m_Full = ( m_End == m_Begin );
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSColor.cpp b/src/system/Qt3DSColor.cpp
new file mode 100644
index 0000000..a44d488
--- /dev/null
+++ b/src/system/Qt3DSColor.cpp
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSColor.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ * @param inColor 32 bit represenation of the color
+ */
+CColor::CColor(const Q3DStudio::UINT32 inColor)
+ : m_Color(inColor)
+{
+}
+
+//==============================================================================
+/**
+ * Constructor
+ * @param inRed 8 bit represenation of the red component
+ * @param inGreen 8 bit representation of the green component
+ * @param inBlue 8 bit representation of the blue component
+ * @param inAlpha 8 bit representation of the transparency component
+ */
+CColor::CColor(const UINT8 inRed, const UINT8 inGreen, const UINT8 inBlue, const UINT8 inAlpha)
+ : m_Red(inRed)
+ , m_Green(inGreen)
+ , m_Blue(inBlue)
+ , m_Alpha(inAlpha)
+{
+}
+
+//==============================================================================
+/**
+ * Set the color to a blend between the two given colors.
+ * @param inColor1 Color representing factor 0
+ * @param inColor2 Color representing factor 1.0
+ * @param inFactor Blend factor where 0.5 is an even mix of the two colors
+ */
+void CColor::Interpolate(const CColor &inColor1, const CColor &inColor2, const FLOAT inFactor)
+{
+ // m_Red = static_cast<UINT8>( rand() % 256 );//( 1.0f - inFactor ) * inColor1.m_Red +
+ //inFactor * inColor2.m_Red );
+ // m_Green = static_cast<UINT8>( rand() % 256 );//( 1.0f - inFactor ) * inColor1.m_Green +
+ //inFactor * inColor2.m_Green );
+ // m_Blue = static_cast<UINT8>( rand() % 256 );//( 1.0f - inFactor ) * inColor1.m_Blue +
+ //inFactor * inColor2.m_Blue );
+ // m_Alpha = 255;//static_cast<UINT8>( ( 1.0f - inFactor ) * inColor1.m_Alpha + inFactor *
+ //inColor2.m_Alpha );
+
+ m_Red = static_cast<UINT8>((1.0f - inFactor) * inColor1.m_Red + inFactor * inColor2.m_Red);
+ m_Green =
+ static_cast<UINT8>((1.0f - inFactor) * inColor1.m_Green + inFactor * inColor2.m_Green);
+ m_Blue = static_cast<UINT8>((1.0f - inFactor) * inColor1.m_Blue + inFactor * inColor2.m_Blue);
+ m_Alpha =
+ static_cast<UINT8>((1.0f - inFactor) * inColor1.m_Alpha + inFactor * inColor2.m_Alpha);
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSColor.h b/src/system/Qt3DSColor.h
new file mode 100644
index 0000000..b917f46
--- /dev/null
+++ b/src/system/Qt3DSColor.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Express a color and transparency using 32 bits.
+ */
+class CColor
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+public:
+ union {
+ UINT32 m_Color; ///< 32bit representation of the color
+ struct
+ {
+ UINT8 m_Red; ///< Red component 0-255
+ UINT8 m_Green; ///< Green component 0-255
+ UINT8 m_Blue; ///< Blue component 0-255
+ UINT8 m_Alpha; ///< Transparency component 0-255
+ };
+ };
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CColor(const UINT32 inColor);
+ CColor(const UINT8 inRed = 255, const UINT8 inGreen = 255, const UINT8 inBlue = 255,
+ const UINT8 inAlpha = 255);
+
+public: // Setters
+ void SetColor(const UINT32 inColor) { m_Color = inColor; }
+ void SetRed(const UINT8 inRed) { m_Red = inRed; }
+ void SetGreen(const UINT8 inGreen) { m_Green = inGreen; }
+ void SetBlue(const UINT8 inBlue) { m_Blue = inBlue; }
+ void SetAlpha(const UINT8 inAlpha) { m_Alpha = inAlpha; }
+
+public: // Getters
+ UINT32 GetColor() const { return m_Color; }
+ UINT8 GetRed() const { return m_Red; }
+ UINT8 GetGreen() const { return m_Green; }
+ UINT8 GetBlue() const { return m_Blue; }
+ UINT8 GetAlpha() const { return m_Alpha; }
+
+public: // Utilities
+ void Interpolate(const CColor &inColor1, const CColor &inColor2, const FLOAT inFactor);
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSConfig.h b/src/system/Qt3DSConfig.h
new file mode 100644
index 0000000..49c644d
--- /dev/null
+++ b/src/system/Qt3DSConfig.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// This file should only contain macros that configure the build environment
+// and build options.
+//==============================================================================
+#include "Qt3DSMemorySettings.h"
+
+/// Number of chars to evaluate when generating a hash from a string.
+/// Verify that hash strings are unique after changing this value.
+#ifndef HASH_LIMIT
+#define HASH_LIMIT 100
+#endif // HASH_LIMIT
+
+/// Define this macro use use sync primitives(mutex/critical sections) when accessing
+/// shared data structures
+#ifndef Q3DStudio_USE_SYNC_PRIMITIVES
+#define Q3DStudio_USE_SYNC_PRIMITIVES 1
+#endif // Q3DStudio_USE_SYNC_PRIMITIVES
diff --git a/src/system/Qt3DSCubicRoots.cpp b/src/system/Qt3DSCubicRoots.cpp
new file mode 100644
index 0000000..ebcc54b
--- /dev/null
+++ b/src/system/Qt3DSCubicRoots.cpp
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSCubicRoots.h"
+#include "Qt3DSDataLogger.h"
+#include "Qt3DSCubicRootsImpl.h"
diff --git a/src/system/Qt3DSCubicRoots.h b/src/system/Qt3DSCubicRoots.h
new file mode 100644
index 0000000..b5ac053
--- /dev/null
+++ b/src/system/Qt3DSCubicRoots.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Wrapper class to functions that solve cubic equations.
+ *
+ * The function suite is taken from Graphics Gems:
+ * Roots3And4.c
+ *
+ * Utility functions to find cubic and quartic roots,
+ * coefficients are passed like this:
+ *
+ * c[0] + c[1]*x + c[2]*x^2 + c[3]*x^3 + c[4]*x^4 = 0
+ *
+ * The functions return the number of non-complex roots and
+ * put the values into the s array.
+ *
+ * Author: Jochen Schwarze (schwarze@isa.de)
+ *
+ * Jan 26, 1990 Version for Graphics Gems
+ * Oct 11, 1990 Fixed sign problem for negative q's in SolveQuartic
+ * (reported by Mark Podlipec),
+ * Old-style function definitions,
+ * IsZero() as a macro
+ * Nov 23, 1990 Some systems do not declare acos() and cbrt() in
+ * <math.h>, though the functions exist in the library.
+ * If large coefficients are used, EQN_EPS should be
+ * reduced considerably (e.g. to 1E-30), results will be
+ * correct but multiple roots might be reported more
+ * than once.
+ */
+class CCubicRoots
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public:
+ static INT32 SolveQuadric(FLOAT inConstants[3], FLOAT outSolutions[2]);
+ static INT32 SolveCubic(FLOAT inConstants[4], FLOAT outSolutions[3]);
+ // static int SolveQuartic( FLOAT c[5], FLOAT s[4] );
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSCubicRootsImpl.h b/src/system/Qt3DSCubicRootsImpl.h
new file mode 100644
index 0000000..8cca59f
--- /dev/null
+++ b/src/system/Qt3DSCubicRootsImpl.h
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Constants used by the functions
+//==============================================================================
+const FLOAT M_PHI = 3.14159265358979323846f;
+
+/* epsilon surrounding for near zero values */
+const FLOAT EQN_EPS = 1e-9f;
+
+#define ISZERO(x) ((x) > -EQN_EPS && (x) < EQN_EPS)
+
+// cube-root
+#ifndef CUBEROOT
+#define CUBEROOT(x) \
+ ((x) > 0.0 ? static_cast<FLOAT>(pow((x), 1.0f / 3.0f)) \
+ : ((x) < 0.0 ? -static_cast<FLOAT>(pow(-(x), 1.0f / 3.0f)) : 0.0f))
+#endif
+
+//==============================================================================
+/**
+ * Find the root/s to a quadratic equation.
+ *
+ * The equation is of the form: c[2]*x^2 + c[1]*x + c[0] = 0
+ * Note that this will fail if c[2] is zero, or this is a linear equation.
+ *
+ * @param inConstants The array of constants to the equation; see form above
+ * @param outSolutions The array of solutions to the equation
+ * @return the number of solutions for the equation
+ */
+INT32 CCubicRoots::SolveQuadric(FLOAT inConstants[3], FLOAT outSolutions[2])
+{
+#ifdef _PERF_LOG
+ PerfLogMathEvent1 thePerfLog(DATALOGGER_CUBICROOT);
+#endif
+ FLOAT theP, theQ, theD;
+ INT32 theResult = 0;
+
+ /* normal form: x^2 + px + theQ = 0 */
+
+ theP = inConstants[1] / (2 * inConstants[2]);
+ theQ = inConstants[0] / inConstants[2];
+
+ theD = theP * theP - theQ;
+
+ if (ISZERO(theD)) {
+ outSolutions[0] = -theP;
+ theResult = 1;
+ } else if (theD < 0.0f) {
+ theResult = 0;
+ } else if (theD > 0.0f) {
+ FLOAT theSquareRootD = sqrtf(theD);
+
+ outSolutions[0] = theSquareRootD - theP;
+ outSolutions[1] = -theSquareRootD - theP;
+ theResult = 2;
+ }
+
+ return theResult;
+}
+
+//==============================================================================
+/**
+ * Find the root/s to a cubic equation.
+ *
+ * The equation is of the form: c[3]*x^3 + c[2]*x^2 + c[1]*x + c[0] = 0
+ * Note that this will fail if c[3] is zero, or this is a quadratic equation.
+ *
+ * @param inConstants The array of constants to the equation; see form above
+ * @param outSolutions The array of solutions to the equation
+ * @return the number of solutions for the equation
+ */
+INT32 CCubicRoots::SolveCubic(FLOAT inConstants[4], FLOAT outSolutions[3])
+{
+#ifdef _PERF_LOG
+ PerfLogMathEvent1 thePerfLog(DATALOGGER_CUBICROOT);
+#endif
+
+ INT32 theResult;
+ FLOAT theSubstitute;
+ FLOAT theVariableA, theVariableB, theVariableC;
+ FLOAT theASquared, theVariableP, theVariableQ;
+ FLOAT thePCubed, theVariableD;
+
+ /* normal form: x^3 + Ax^2 + Bx + C = 0 */
+
+ theVariableA = inConstants[2] / inConstants[3];
+ theVariableB = inConstants[1] / inConstants[3];
+ theVariableC = inConstants[0] / inConstants[3];
+
+ /* substitute x = y - A/3 to eliminate quadric term:
+ x^3 +px + q = 0 */
+
+ theASquared = theVariableA * theVariableA;
+ theVariableP = 1.0f / 3.0f * (-1.0f / 3.0f * theASquared + theVariableB);
+ theVariableQ = 1.0f / 2.0f * (2.0f / 27.0f * theVariableA * theASquared
+ - 1.0f / 3.0f * theVariableA * theVariableB + theVariableC);
+
+ /* use Cardano's formula */
+
+ thePCubed = theVariableP * theVariableP * theVariableP;
+ theVariableD = theVariableQ * theVariableQ + thePCubed;
+
+ if (ISZERO(theVariableD)) {
+ if (ISZERO(theVariableQ)) /* one triple solution */
+ {
+ outSolutions[0] = 0;
+ theResult = 1;
+ } else /* one single and one double solution */
+ {
+ FLOAT theVariableU = CUBEROOT(-theVariableQ);
+ outSolutions[0] = 2.0f * theVariableU;
+ outSolutions[1] = -theVariableU;
+ theResult = 2;
+ }
+ } else if (theVariableD < 0.0f) /* Casus irreducibilis: three real solutions */
+ {
+ FLOAT thePhi = 1.0f / 3.0f * static_cast<FLOAT>(acos(-theVariableQ / sqrtf(-thePCubed)));
+ FLOAT theVariableT = 2.0f * sqrtf(-theVariableP);
+
+ outSolutions[0] = theVariableT * static_cast<FLOAT>(cos(thePhi));
+ outSolutions[1] = -theVariableT * static_cast<FLOAT>(cos(thePhi + M_PHI / 3.0f));
+ outSolutions[2] = -theVariableT * static_cast<FLOAT>(cos(thePhi - M_PHI / 3.0f));
+ theResult = 3;
+ } else /* one real solution */
+ {
+ FLOAT theSquareRootD = sqrtf(theVariableD);
+ FLOAT theVariableU = CUBEROOT(theSquareRootD - theVariableQ);
+ FLOAT theVariableV = -CUBEROOT(theSquareRootD + theVariableQ);
+
+ outSolutions[0] = theVariableU + theVariableV;
+ theResult = 1;
+ }
+
+ /* resubstitute */
+ theSubstitute = 1.0f / 3.0f * theVariableA;
+
+ for (INT32 theIndex = 0; theIndex < theResult; ++theIndex)
+ outSolutions[theIndex] -= theSubstitute;
+
+ return theResult;
+}
+
+}; // namespace Q3DStudio
diff --git a/src/system/Qt3DSDLLManager.cpp b/src/system/Qt3DSDLLManager.cpp
new file mode 100644
index 0000000..c6f6d80
--- /dev/null
+++ b/src/system/Qt3DSDLLManager.cpp
@@ -0,0 +1,220 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//==============================================================================
+// Includes
+//==============================================================================
+#include "SystemPrefix.h"
+#include "Qt3DSDLLManager.h"
+#include "Qt3DSBasicPluginDLL.h"
+#include <QDebug>
+#ifdef _LINUXPLATFORM
+#include <dlfcn.h>
+#endif
+
+using namespace Q3DStudio;
+
+//==============================================================================
+/**
+ * Comparator for DLL instances.
+ * Compares by plugin type and handle
+ */
+namespace Q3DStudio {
+bool operator==(const _SDLLInfo &inInfo1, const _SDLLInfo &inInfo2)
+{
+ return (inInfo1.m_Type == inInfo2.m_Type) && (inInfo1.m_Handle == inInfo2.m_Handle);
+}
+}
+
+//==============================================================================
+/**
+ * Singleton getter
+ */
+CDLLManager &CDLLManager::GetDLLManager()
+{
+ static CDLLManager theDLLManager = CDLLManager();
+ return theDLLManager;
+}
+
+//==============================================================================
+/**
+ * CTOR
+ */
+CDLLManager::CDLLManager()
+{
+}
+
+//==============================================================================
+/**
+ * DTOR
+ */
+CDLLManager::~CDLLManager()
+{
+}
+
+//==============================================================================
+/**
+ * Cleanup
+ */
+void CDLLManager::Cleanup()
+{
+ m_LoadedLibraries.Clear(true);
+}
+
+//==============================================================================
+/**
+ * Loads a DLL/shared library given a path to the library plugin and the plugin
+ * type to expect.
+ */
+long CDLLManager::LoadLibrary(const char *inLibraryPath, long inPluginType)
+{
+ long theEmptyIndex = NVARRAY_NOTFOUND;
+#ifdef _PCPLATFORM
+ DLLHANDLE theHandle = ::LoadLibraryA(inLibraryPath);
+#endif
+
+#ifdef _LINUXPLATFORM
+ DLLHANDLE theHandle = ::dlopen(inLibraryPath, RTLD_NOW);
+
+ if (!theHandle) {
+ const char *error = ::dlerror();
+ qWarning() << "Failed to load shared library, error:" << QStringLiteral("%1, full path: %2").arg(error).arg(inLibraryPath);
+ }
+
+#endif
+
+#ifdef _INTEGRITYPLATFORM
+ DLLHANDLE theHandle = 0;
+ qWarning() << "CDLLManager::LoadLibrary handle is zero!";
+#endif
+
+ Q3DStudio_ASSERT(theHandle);
+
+ if (theHandle != NULL) {
+ SDLLInfo theInfo;
+ PROC_GetPluginType theProc =
+ reinterpret_cast<PROC_GetPluginType>(GetProc("GetPluginType", theHandle));
+ Q3DStudio_ASSERT(theProc);
+
+ if (theProc) {
+ theInfo.m_Type = theProc();
+
+ if (theInfo.m_Type == inPluginType) {
+ theEmptyIndex = m_LoadedLibraries.GetIndex(theInfo);
+ theInfo.m_Handle = theHandle;
+
+ if (theEmptyIndex == NVARRAY_NOTFOUND) {
+ m_LoadedLibraries.Push(theInfo);
+ theEmptyIndex = m_LoadedLibraries.GetCount() - 1;
+ } else
+ m_LoadedLibraries[theEmptyIndex] = theInfo;
+ }
+ }
+
+ if (theEmptyIndex == NVARRAY_NOTFOUND) {
+#ifdef _PCPLATFORM
+ ::FreeLibrary(theHandle);
+#endif
+
+#ifdef _LINUXPLATFORM
+ ::dlclose(theHandle);
+#endif
+ }
+ }
+
+ return theEmptyIndex;
+}
+
+//==============================================================================
+/**
+ * Unloads a DLL given a handle
+ */
+void CDLLManager::UnloadLibrary(const long inHandle)
+{
+ if (inHandle >= 0 && inHandle < m_LoadedLibraries.GetCount()) {
+#ifdef _PCPLATFORM
+ ::FreeLibrary(m_LoadedLibraries[inHandle].m_Handle);
+#endif
+
+#ifdef _LINUXPLATFORM
+ ::dlclose(m_LoadedLibraries[inHandle].m_Handle);
+#endif
+
+ m_LoadedLibraries[inHandle] = SDLLInfo();
+ }
+}
+
+//==============================================================================
+/**
+ * Retrieves a DLL proc given the proc name
+ */
+void *CDLLManager::GetProc(const char *inProcName, long inHandle)
+{
+ if (inHandle >= 0 && inHandle < m_LoadedLibraries.GetCount())
+ return GetProc(inProcName, m_LoadedLibraries[inHandle].m_Handle);
+
+ return NULL;
+}
+
+//==============================================================================
+/**
+ * Retrieves a DLL proc fiven the proc name
+ */
+void *CDLLManager::GetProc(const char *inProcName, const DLLHANDLE inHandle)
+{
+#ifdef _PCPLATFORM
+#ifdef QT3DS_VC
+ return ::GetProcAddress(inHandle, inProcName);
+#else
+ return (void *)(::GetProcAddress(inHandle, inProcName));
+#endif
+#endif
+
+#ifdef _LINUXPLATFORM
+ return ::dlsym(inHandle, inProcName);
+#endif
+
+#ifdef _INTEGRITYPLATFORM
+ qWarning() << "CDLLManager::GetProc returns NULL!";
+ return NULL;
+#endif
+}
+
+//==============================================================================
+/**
+ * Retrieves the plugin type for the DLL
+ */
+template <typename EEnumType>
+EEnumType CDLLManager::GetPluginType(long inHandle)
+{
+ if (inHandle >= 0 && inHandle < m_LoadedLibraries.GetCount())
+ return static_cast<EEnumType>(m_LoadedLibraries[inHandle].m_Type);
+
+ return 0;
+}
diff --git a/src/system/Qt3DSDLLManager.h b/src/system/Qt3DSDLLManager.h
new file mode 100644
index 0000000..d670af2
--- /dev/null
+++ b/src/system/Qt3DSDLLManager.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+//==============================================================================
+// Includes
+//==============================================================================
+#pragma once
+
+#ifdef _PCPLATFORM
+#pragma warning(push, 3)
+#include <windows.h>
+#pragma warning(pop)
+#endif
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+#ifdef _PCPLATFORM
+typedef HMODULE DLLHANDLE;
+#endif
+
+#if defined(_LINUXPLATFORM) || defined(_INTEGRITYPLATFORM)
+typedef void *DLLHANDLE;
+#endif
+
+typedef struct _SDLLInfo
+{
+ long m_Type; ///< Plugin type
+ DLLHANDLE m_Handle; ///< DLL handle
+
+ _SDLLInfo()
+ : m_Type(0)
+ , m_Handle(NULL)
+
+ {
+ }
+
+} SDLLInfo;
+
+//==============================================================================
+/**
+ * Loads DLLs and queries for DLL functions
+ */
+class CDLLManager
+{
+public:
+ static CDLLManager &GetDLLManager();
+
+protected:
+ CDLLManager();
+ virtual ~CDLLManager();
+
+public:
+ long LoadLibrary(const char *inLibraryPath, long inPluginType);
+ void UnloadLibrary(const long inHandle);
+ void *GetProc(const char *inProcName, long inHandle);
+ template <typename EEnumType>
+ EEnumType GetPluginType(long inHandle);
+ void Cleanup();
+
+protected:
+ void *GetProc(const char *inProcName, const DLLHANDLE inHandle);
+
+protected:
+ CArray<Q3DStudio::SDLLInfo> m_LoadedLibraries;
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSDataLogger.cpp b/src/system/Qt3DSDataLogger.cpp
new file mode 100644
index 0000000..2f45f01
--- /dev/null
+++ b/src/system/Qt3DSDataLogger.cpp
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSDataLogger.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+CDataLogger::SExternalFunctors CDataLogger::m_Functors;
+CDataLogger::EDataLoggerLevel CDataLogger::m_LogLevel = CDataLogger::LOG_LEVEL_INVALID;
+BOOL CDataLogger::m_Enabled = false;
+
+// Developers - change out the = NULL to = class::LogEntry to log specific stuff.
+template <>
+TPerfLogGeneralEvent1::TLogEntryInternal TPerfLogGeneralEvent1::m_InternalLogFunc = NULL;
+template <>
+TPerfLogGeneralEvent2::TLogEntryInternal TPerfLogGeneralEvent2::m_InternalLogFunc = NULL;
+
+template <>
+TPerfLogRenderEvent1::TLogEntryInternal TPerfLogRenderEvent1::m_InternalLogFunc = NULL;
+template <>
+TPerfLogSceneEvent1::TLogEntryInternal TPerfLogSceneEvent1::m_InternalLogFunc = NULL;
+
+template <>
+TPerfLogMathEvent1::TLogEntryInternal TPerfLogMathEvent1::m_InternalLogFunc = NULL;
+template <>
+TPerfLogPresentationEvent1::TLogEntryInternal TPerfLogPresentationEvent1::m_InternalLogFunc = NULL;
+template <>
+TPerfLogRenderEvent2::TLogEntryInternal TPerfLogRenderEvent2::m_InternalLogFunc = NULL;
+
+//==============================================================================
+/**
+ * Set the application supplied functors to use for getting time and handling
+ * the writing out of data
+ */
+void CDataLogger::SetFunctors(SExternalFunctors inFunctors)
+{
+ m_Functors = inFunctors;
+}
+
+//==============================================================================
+/**
+* Call into the specified functors to make stuff happen
+*/
+void CDataLogger::LogEntry(UINT32 inEntryEnum, BOOL inStartFlag)
+{
+ if (m_Enabled && m_Functors.m_GetTimeFunc && m_Functors.m_WriteFunc && m_Functors.m_UserData) {
+ // Initialize to the correct values
+ SPerfLogEntry theEntry(inEntryEnum, inStartFlag,
+ m_Functors.m_GetTimeFunc(m_Functors.m_UserData));
+ m_Functors.m_WriteFunc(m_Functors.m_UserData, theEntry);
+ }
+}
+
+//==============================================================================
+/**
+* Enable logging
+*/
+void CDataLogger::Enable()
+{
+ SetLogLevel(m_LogLevel);
+ m_Enabled = true;
+}
+
+//==============================================================================
+/**
+* Disable logging
+*/
+void CDataLogger::Disable()
+{
+ m_Enabled = false;
+}
+
+//==============================================================================
+/**
+ * XXX
+ */
+void CDataLogger::SetLogLevel(EDataLoggerLevel inLogLevel)
+{
+ switch (inLogLevel) {
+ // No logging
+ case LOG_LEVEL_NONE:
+ TPerfLogGeneralEvent1::Disable();
+ TPerfLogGeneralEvent2::Disable();
+
+ TPerfLogRenderEvent1::Disable();
+ TPerfLogSceneEvent1::Disable();
+
+ TPerfLogMathEvent1::Disable();
+ TPerfLogPresentationEvent1::Disable();
+ TPerfLogRenderEvent2::Disable();
+ break;
+
+ case LOG_LEVEL_3:
+ TPerfLogMathEvent1::Enable();
+ TPerfLogPresentationEvent1::Enable();
+ TPerfLogRenderEvent2::Enable();
+
+ case LOG_LEVEL_2:
+ TPerfLogRenderEvent1::Enable();
+ TPerfLogSceneEvent1::Enable();
+
+ case LOG_LEVEL_1:
+ TPerfLogGeneralEvent1::Enable();
+ TPerfLogGeneralEvent2::Enable();
+ break;
+
+ case LOG_LEVEL_INVALID:
+ default:
+ m_LogLevel = LOG_LEVEL_INVALID;
+ return;
+ break;
+ }
+ m_LogLevel = inLogLevel;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSDataLogger.h b/src/system/Qt3DSDataLogger.h
new file mode 100644
index 0000000..b834eda
--- /dev/null
+++ b/src/system/Qt3DSDataLogger.h
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _DATA_LOGGER_H_
+#define _DATA_LOGGER_H_
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTypes.h"
+#include "Qt3DSDataLoggerEnums.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+typedef TTimeUnit TDataLoggerTimeUnit;
+
+//==============================================================================
+/**
+* The structure that holds all the info we collect
+*/
+struct SPerfLogEntry
+{
+ UINT32 m_EntryEnum : 31;
+ UINT32 m_StartBool : 1;
+
+ TDataLoggerTimeUnit m_Time;
+
+ SPerfLogEntry(UINT32 inEntryEnum, BOOL inStartFlag, TDataLoggerTimeUnit inTime)
+ : m_EntryEnum(inEntryEnum)
+ , m_StartBool(inStartFlag ? 1U : 0U)
+ , m_Time(inTime)
+ {
+ // Make sure our enums never use the high bit
+ Q3DStudio_ASSERT(false == (inEntryEnum & (1 << 31)));
+ }
+};
+
+//==============================================================================
+/**
+* The stack based helper class that wraps the actually logging of start and end messages
+* for use with start/end time logging.
+*/
+template <typename T>
+class CPerfLogPairedEventWrapper
+{
+public:
+ typedef void (*TLogEntryInternal)(UINT32 inEntryEnum, BOOL inStartFlag);
+
+private:
+ UINT32 m_EntryEnum;
+ static TLogEntryInternal m_InternalLogFunc;
+
+private:
+ static void LogEntry(UINT32 inEntryEnum, BOOL inStartFlag);
+
+public:
+ CPerfLogPairedEventWrapper(UINT32 inEntryEnum);
+ ~CPerfLogPairedEventWrapper();
+
+ static void Enable();
+ static void Disable();
+};
+
+//==============================================================================
+/**
+*/
+class CPerfLogPairedEventWrapperDummy
+{
+public:
+ CPerfLogPairedEventWrapperDummy(UINT32 /*inEntryEnum*/) {}
+ ~CPerfLogPairedEventWrapperDummy() {}
+};
+
+// Dummy structs, so we get one 'type' of class per log event
+// so we can turn things on and off
+struct SPerfLogGeneralEvent1
+{
+};
+struct SPerfLogGeneralEvent2
+{
+};
+
+struct SPerfLogRenderEvent1
+{
+};
+struct SPerfLogSceneEvent1
+{
+};
+
+struct SPerfLogMathEvent1
+{
+};
+struct SPerfLogPresentationEvent1
+{
+};
+struct SPerfLogRenderEvent2
+{
+};
+
+// level 0
+// no profiling at all...
+
+// level 1
+typedef CPerfLogPairedEventWrapper<SPerfLogGeneralEvent1>
+ TPerfLogGeneralEvent1; // Frame, update presentations, update scene, render scene
+typedef CPerfLogPairedEventWrapper<SPerfLogGeneralEvent2>
+ TPerfLogGeneralEvent2; // Event processing and manager updates,
+// call frame and slide callbacks,
+// opaque, transparent, layer render, finalize drawlist and pick
+// level 2
+typedef CPerfLogPairedEventWrapper<SPerfLogRenderEvent1>
+ TPerfLogRenderEvent1; // More detailed rendering
+typedef CPerfLogPairedEventWrapper<SPerfLogSceneEvent1>
+ TPerfLogSceneEvent1; // More detailed scene update
+
+// level 3
+typedef CPerfLogPairedEventWrapper<SPerfLogMathEvent1> TPerfLogMathEvent1; // vector and matrix math
+typedef CPerfLogPairedEventWrapper<SPerfLogPresentationEvent1>
+ TPerfLogPresentationEvent1; // More detailed scene update
+typedef CPerfLogPairedEventWrapper<SPerfLogRenderEvent2> TPerfLogRenderEvent2; //
+
+// Defines
+#ifdef _PERF_LOG
+#define PerfLogGeneralEvent1(inEventID) TPerfLogGeneralEvent1 thePerfLog(inEventID);
+#define PerfLogGeneralEvent2(inEventID) TPerfLogGeneralEvent2 thePerfLog(inEventID);
+
+#define PerfLogRenderEvent1(inEventID) TPerfLogRenderEvent1 thePerfLog(inEventID);
+#define PerfLogSceneEvent1(inEventID) TPerfLogSceneEvent1 thePerfLog(inEventID);
+
+#define PerfLogMathEvent1(inEventID) TPerfLogMathEvent1 thePerfLog(inEventID);
+#define PerfLogPresentationEvent1(inEventID) TPerfLogPresentationEvent1 thePerfLog(inEventID);
+#define PerfLogRenderEvent2(inEventID) TPerfLogRenderEvent2 thePerfLog(inEventID);
+#else
+#define PerfLogGeneralEvent1(inEventID)
+#define PerfLogGeneralEvent2(inEventID)
+
+#define PerfLogRenderEvent1(inEventID)
+#define PerfLogSceneEvent1(inEventID)
+
+#define PerfLogMathEvent1(inEventID)
+#define PerfLogPresentationEvent1(inEventID)
+#define PerfLogRenderEvent2(inEventID)
+#endif
+
+//==============================================================================
+/**
+*/
+class CDataLogger
+{
+private:
+ // App level function to write this out to a stream/file... set externally
+ typedef void (*TDataLoggerWriteFunc)(void *inUserData, SPerfLogEntry inEntry);
+ typedef TDataLoggerTimeUnit (*TGetTimeFunc)(void *inUserData);
+
+public:
+ struct SExternalFunctors
+ {
+ void *m_UserData;
+ TDataLoggerWriteFunc m_WriteFunc;
+ TGetTimeFunc m_GetTimeFunc;
+
+ SExternalFunctors()
+ : m_UserData(NULL)
+ , m_WriteFunc(NULL)
+ , m_GetTimeFunc(NULL)
+ {
+ }
+ };
+
+ enum EDataLoggerLevel {
+ LOG_LEVEL_NONE,
+ LOG_LEVEL_1,
+ LOG_LEVEL_2,
+ LOG_LEVEL_3,
+ LOG_LEVEL_INVALID, // use this if you want to selectively enable or disable loggers
+ };
+
+private:
+ static SExternalFunctors m_Functors;
+ static EDataLoggerLevel m_LogLevel;
+ static BOOL m_Enabled;
+
+public:
+ static void SetFunctors(SExternalFunctors inFunctors);
+ static void LogEntry(UINT32 inEntryEnum, BOOL inStartFlag);
+ static void Enable();
+ static void Disable();
+
+ static void SetLogLevel(EDataLoggerLevel inLogLevel);
+};
+
+} // namespace Q3DStudio
+
+#include "Qt3DSDataLogger.hpp"
+
+#endif // _DATA_LOGGER_H_
diff --git a/src/system/Qt3DSDataLogger.hpp b/src/system/Qt3DSDataLogger.hpp
new file mode 100644
index 0000000..0900c4a
--- /dev/null
+++ b/src/system/Qt3DSDataLogger.hpp
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSDataLogger.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+* Constructor
+*/
+template <typename T>
+CPerfLogPairedEventWrapper<T>::CPerfLogPairedEventWrapper(UINT32 inEntryEnum)
+ : m_EntryEnum(inEntryEnum)
+{
+ if (m_InternalLogFunc)
+ m_InternalLogFunc(m_EntryEnum, true);
+}
+
+//==============================================================================
+/**
+* Destructor
+*/
+template <typename T>
+CPerfLogPairedEventWrapper<T>::~CPerfLogPairedEventWrapper()
+{
+ if (m_InternalLogFunc)
+ m_InternalLogFunc(m_EntryEnum, false);
+}
+
+//==============================================================================
+/**
+* Logger functions
+*/
+template <typename T>
+void CPerfLogPairedEventWrapper<T>::LogEntry(UINT32 inEntryEnum, BOOL inStartFlag)
+{
+ CDataLogger::LogEntry(inEntryEnum, inStartFlag);
+}
+
+//==============================================================================
+/**
+ * Enable logging
+ */
+template <typename T>
+void CPerfLogPairedEventWrapper<T>::Enable()
+{
+ m_InternalLogFunc = LogEntry;
+}
+
+//==============================================================================
+/**
+* Disable logging
+*/
+template <typename T>
+void CPerfLogPairedEventWrapper<T>::Disable()
+{
+ m_InternalLogFunc = NULL;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSDataLoggerEnums.h b/src/system/Qt3DSDataLoggerEnums.h
new file mode 100644
index 0000000..27320e1
--- /dev/null
+++ b/src/system/Qt3DSDataLoggerEnums.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef _DATA_LOGGER_ENUMS_H_
+#define _DATA_LOGGER_ENUMS_H_
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+// TODO ah - for now, these are all specific to paired events. Later we will
+// extend this to support single events which may or may not have timestamps
+// for example, every matrix multiple would log a single event with no time
+enum EDataLoggerEvents {
+ //
+ DATALOGGER_FRAME, /// Time spent in a application frame ( UpdatePresentations, UpdateScenes, and
+ /// Render )
+
+ // DATALOGGER_FRAME
+ // CRuntime
+ DATALOGGER_UPDATEPRESENTATIONS, /// Time spent updating all presentations
+ DATALOGGER_UPDATESCENES, /// Time spent updating all scenes
+ DATALOGGER_RENDERSCENES, /// Time spent rendering all scenes
+
+ // DATALOGGER_UPDATEPRESENTATIONS
+ // CPresentation::Update
+ DATALOGGER_PROCESSEVENTS, /// Time spent in ProcessEventCommandQueue
+ DATALOGGER_ELEMENTMANAGERUPDATE, /// Time spent in CElementManager::Update doing activate and
+ /// deactivate scans
+ DATALOGGER_ANIMATIONMANAGERUPDATE, /// Time spent in CAnimationManager::Update
+
+ // More detailed presentation update
+ DATALOGGER_PROCESSCOMMAND, /// xxx
+ DATALOGGER_PROCESSEVENT, /// xxx
+ DATALOGGER_PROCESSEVENTBUBBLING, /// xxx
+
+ // DATALOGGER_UPDATESCENES
+ // CScene::Update
+ DATALOGGER_PROCESSDIRTYLIST, /// Time spent in CScene::ProcessDirtyList
+ DATALOGGER_CALCULATETRANSFORM, /// Time spent in CScene::CalculateGlobalTransform
+ DATALOGGER_SCENEUPDATE, /// Time spent in CScene::Update recursion
+
+ // More detailed scene update
+ DATALOGGER_SCANNODEATTRIBUTES, /// Time
+ DATALOGGER_PUSHNODE, /// Time
+
+ // DATALOGGER_RENDERSCENES
+ // CRenderEngine
+ DATALOGGER_RENDERLAYER, /// Time spent rendering the contents of a layer
+ DATALOGGER_RENDEROPAQUE, /// Time spent rendering all opaque items
+ DATALOGGER_RENDERTRANSPARENT, /// Time spent rendering all transparent items
+ DATALOGGER_FINALIZEDRAWLIST, /// Time spent finalizing the draw list
+ DATALOGGER_PICK, /// Time spent in pick code
+
+ // More detailed rendering
+ DATALOGGER_RENDER_SORTDISTANCE, /// asdf
+ DATALOGGER_RENDER_SETOPACITY, /// asdf
+ DATALOGGER_RENDER_DRAWMODEL, /// asdf
+ DATALOGGER_RENDER_DRAWTEXT, /// asdf
+ DATALOGGER_RENDER_CLEARBUFFER, /// asdf
+ DATALOGGER_RENDER_ZWRITEENABLE, /// asdf
+ DATALOGGER_RENDER_CHECKRESIZE, /// asdf
+ DATALOGGER_RENDER_SETATTRIBUTES, /// asdf
+ DATALOGGER_RENDER_TEXTUPDATE, /// asdf
+ DATALOGGER_RENDER_CAMERAUPDATE, /// asdf
+
+ // super specific low level gl calls
+ DATALOGGER_TEXTURESTATE_APPLY, /// asdf
+ DATALOGGER_GEOMETRY_DRAW, /// asdf
+ DATALOGGER_MATERIAL_APPLY, /// asdf
+ DATALOGGER_SETSHADER, /// asdf
+
+ // vector math
+ DATALOGGER_VECTOR, /// asdf
+ DATALOGGER_MATRIX, /// asdf
+ DATALOGGER_CUBICROOT, /// asdf
+
+ //
+ DATALOGGER_COUNTERTEST, /// Time spent in counter test code
+ DATALOGGER_COUNTERTESTX, /// Time spent in counter test code
+
+ DATALOGGEREVENTCOUNT /// Event count
+};
+
+// CPerfLogPairedEventWrapperx thePerfLog( xxx );
+
+} // namespace Q3DStudio
+
+#endif // _DATA_LOGGER_ENUMS_H_
diff --git a/src/system/Qt3DSDataLoggerViewer.h b/src/system/Qt3DSDataLoggerViewer.h
new file mode 100644
index 0000000..0eaf9f6
--- /dev/null
+++ b/src/system/Qt3DSDataLoggerViewer.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef AKDATALOGGERVIEWER_H_INCLUDED
+#define AKDATALOGGERVIEWER_H_INCLUDED
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTypes.h"
+#include "Qt3DSDataLogger.h"
+#include "Qt3DSDataLoggerEnums.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+// Helps interpret and analyse data logger entries
+class CDataLoggerViewer
+{
+public:
+ typedef CArray<SPerfLogEntry> TPerfLogEntryList;
+
+public:
+ CDataLoggerViewer(TPerfLogEntryList *inPerfLogEntryList);
+ CDataLoggerViewer(const char *inFilename);
+ virtual ~CDataLoggerViewer();
+
+public:
+ float GetAverageTimeInMsForEntry(enum EDataLoggerEvents inEventType);
+ void ResetPerfLogEntry(enum EDataLoggerEvents inEventType);
+ void ResetAllEntries();
+
+public:
+ static bool ProcessKeyEvent(char inKey, TPerfLogEntryList *inList);
+
+protected:
+ TPerfLogEntryList *m_PerfLogEntryList;
+ bool m_Dispose;
+};
+
+} // namespace NVUI
+
+#endif // AKDATALOGGERVIEWER_H_INCLUDED
diff --git a/src/system/Qt3DSEGLTimer.h b/src/system/Qt3DSEGLTimer.h
new file mode 100644
index 0000000..4c9f4ce
--- /dev/null
+++ b/src/system/Qt3DSEGLTimer.h
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "Qt3DSTimer.h"
+#include "Qt3DSTypes.h"
+
+// You have to include egl before including this file.
+
+typedef EGLuint64NV(EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)(void);
+typedef EGLuint64NV(EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC)(void);
+extern EGLuint64NV eglSystemTimeFrequency;
+extern PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC eglGetSystemTimeFrequencyNVProc;
+extern PFNEGLGETSYSTEMTIMENVPROC eglGetSystemTimeNVProc;
+
+namespace Q3DStudio {
+
+struct SEGLTimeProvider : public Q3DStudio::ITimeProvider
+{
+public:
+ Q3DStudio::INT64 m_TimeFrequency;
+ SEGLTimeProvider()
+ : m_TimeFrequency(0)
+ {
+ }
+ virtual Q3DStudio::INT64 GetCurrentTimeMicroSeconds()
+ {
+ // This can be called before EGL is initialized.
+ if (eglGetSystemTimeFrequencyNVProc == NULL || eglGetSystemTimeNVProc == NULL)
+ return 0;
+
+ if (!m_TimeFrequency) {
+ // Time frequency converts to seconds.
+ m_TimeFrequency = eglGetSystemTimeFrequencyNVProc();
+ // We need it to conver to microseconds
+ m_TimeFrequency = m_TimeFrequency / 1000000ULL;
+ }
+ Q3DStudio::INT64 currentTime = eglGetSystemTimeNVProc();
+ currentTime = currentTime / m_TimeFrequency;
+ return currentTime;
+ }
+};
+} \ No newline at end of file
diff --git a/src/system/Qt3DSEndian.h b/src/system/Qt3DSEndian.h
new file mode 100644
index 0000000..f8913a7
--- /dev/null
+++ b/src/system/Qt3DSEndian.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2010 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Constants
+//==============================================================================
+
+#define QT3DS_LITTLE_ENDIAN false
+#define QT3DS_BIG_ENDIAN true
diff --git a/src/system/Qt3DSEulerAngles.cpp b/src/system/Qt3DSEulerAngles.cpp
new file mode 100644
index 0000000..7c4364f
--- /dev/null
+++ b/src/system/Qt3DSEulerAngles.cpp
@@ -0,0 +1,390 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdio.h>
+#include "Qt3DSEulerAngles.h"
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4365) // warnings on conversion from unsigned int to int
+#endif
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ */
+CEulerAngleConverter::CEulerAngleConverter()
+{
+ m_OrderInfoBuffer[0] = '\0';
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CEulerAngleConverter::~CEulerAngleConverter()
+{
+}
+
+//==============================================================================
+/**
+ * Constructs a Euler angle & holds it in a EulerAngles struct
+ * @param theI x rotation ( radians )
+ * @param theJ y rotation ( radians )
+ * @param theH z rotation ( radians )
+ * @param theOrder the order this angle is in namely XYZ( static ), etc.
+ * use the EulOrd**** macros to generate values
+ * 0 to 23 is valid
+ * @return the euler angle
+ */
+EulerAngles CEulerAngleConverter::Eul_(float theI, float theJ, float theH, int theOrder)
+{
+ EulerAngles theEulerAngle;
+ theEulerAngle.x = theI;
+ theEulerAngle.y = theJ;
+ theEulerAngle.z = theH;
+ theEulerAngle.w = (float)theOrder;
+ return theEulerAngle;
+}
+
+//==============================================================================
+/**
+ * Construct quaternion from Euler angles (in radians).
+ * @param theEulerAngle incoming angle( radians )
+ * @return the Quaternion
+ */
+Quat CEulerAngleConverter::Eul_ToQuat(EulerAngles theEulerAngle)
+{
+ Quat theQuaternion;
+ double a[3], ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
+ int i, j, k, h, n, s, f;
+
+ EulGetOrd((unsigned int)theEulerAngle.w, i, j, k, h, n, s, f);
+ if (f == EulFrmR) {
+ float t = theEulerAngle.x;
+ theEulerAngle.x = theEulerAngle.z;
+ theEulerAngle.z = t;
+ }
+
+ if (n == EulParOdd)
+ theEulerAngle.y = -theEulerAngle.y;
+
+ ti = theEulerAngle.x * 0.5;
+ tj = theEulerAngle.y * 0.5;
+ th = theEulerAngle.z * 0.5;
+
+ ci = cos(ti);
+ cj = cos(tj);
+ ch = cos(th);
+
+ si = sin(ti);
+ sj = sin(tj);
+ sh = sin(th);
+
+ cc = ci * ch;
+ cs = ci * sh;
+ sc = si * ch;
+ ss = si * sh;
+
+ if (s == EulRepYes) {
+ a[i] = cj * (cs + sc); /* Could speed up with */
+ a[j] = sj * (cc + ss); /* trig identities. */
+ a[k] = sj * (cs - sc);
+ theQuaternion.w = (float)(cj * (cc - ss));
+ } else {
+ a[i] = cj * sc - sj * cs;
+ a[j] = cj * ss + sj * cc;
+ a[k] = cj * cs - sj * sc;
+ theQuaternion.w = (float)(cj * cc + sj * ss);
+ }
+ if (n == EulParOdd)
+ a[j] = -a[j];
+
+ theQuaternion.x = (float)a[X];
+ theQuaternion.y = (float)a[Y];
+ theQuaternion.z = (float)a[Z];
+ return theQuaternion;
+}
+
+//==============================================================================
+/**
+ * Construct matrix from Euler angles (in radians).
+ * @param theEulerAngle incoming angle
+ * @param theMatrix outgoing matrix
+ */
+void CEulerAngleConverter::Eul_ToHMatrix(EulerAngles theEulerAngle, HMatrix theMatrix)
+{
+ double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
+ int i, j, k, h, n, s, f;
+ EulGetOrd((unsigned int)theEulerAngle.w, i, j, k, h, n, s, f);
+
+ if (f == EulFrmR) {
+ float t = theEulerAngle.x;
+ theEulerAngle.x = theEulerAngle.z;
+ theEulerAngle.z = t;
+ }
+
+ if (n == EulParOdd) {
+ theEulerAngle.x = -theEulerAngle.x;
+ theEulerAngle.y = -theEulerAngle.y;
+ theEulerAngle.z = -theEulerAngle.z;
+ }
+
+ ti = theEulerAngle.x;
+ tj = theEulerAngle.y;
+ th = theEulerAngle.z;
+
+ ci = cos(ti);
+ cj = cos(tj);
+ ch = cos(th);
+
+ si = sin(ti);
+ sj = sin(tj);
+ sh = sin(th);
+
+ cc = ci * ch;
+ cs = ci * sh;
+ sc = si * ch;
+ ss = si * sh;
+
+ if (s == EulRepYes) {
+ theMatrix[i][i] = (float)cj;
+ theMatrix[i][j] = (float)(sj * si);
+ theMatrix[i][k] = (float)(sj * ci);
+ theMatrix[j][i] = (float)(sj * sh);
+ theMatrix[j][j] = (float)(-cj * ss + cc);
+ theMatrix[j][k] = (float)(-cj * cs - sc);
+ theMatrix[k][i] = (float)(-sj * ch);
+ theMatrix[k][j] = (float)(cj * sc + cs);
+ theMatrix[k][k] = (float)(cj * cc - ss);
+ } else {
+ theMatrix[i][i] = (float)(cj * ch);
+ theMatrix[i][j] = (float)(sj * sc - cs);
+ theMatrix[i][k] = (float)(sj * cc + ss);
+ theMatrix[j][i] = (float)(cj * sh);
+ theMatrix[j][j] = (float)(sj * ss + cc);
+ theMatrix[j][k] = (float)(sj * cs - sc);
+ theMatrix[k][i] = (float)(-sj);
+ theMatrix[k][j] = (float)(cj * si);
+ theMatrix[k][k] = (float)(cj * ci);
+ }
+
+ theMatrix[W][X] = 0.0;
+ theMatrix[W][Y] = 0.0;
+ theMatrix[W][Z] = 0.0;
+ theMatrix[X][W] = 0.0;
+ theMatrix[Y][W] = 0.0;
+ theMatrix[Z][W] = 0.0;
+ theMatrix[W][W] = 1.0;
+}
+
+//==============================================================================
+/**
+ * Convert matrix to Euler angles (in radians).
+ * @param theMatrix incoming matrix
+ * @param theOrder 0-23, use EulOrd**** to generate this value
+ * @return a set of angles in radians!!!!
+ */
+EulerAngles CEulerAngleConverter::Eul_FromHMatrix(HMatrix theMatrix, int theOrder)
+{
+ EulerAngles theEulerAngle;
+ int i, j, k, h, n, s, f;
+
+ EulGetOrd(theOrder, i, j, k, h, n, s, f);
+ if (s == EulRepYes) {
+ double sy = sqrt(theMatrix[i][j] * theMatrix[i][j] + theMatrix[i][k] * theMatrix[i][k]);
+ if (sy > 16 * FLT_EPSILON) {
+ theEulerAngle.x = (float)(atan2((double)theMatrix[i][j], (double)theMatrix[i][k]));
+ theEulerAngle.y = (float)(atan2((double)sy, (double)theMatrix[i][i]));
+ theEulerAngle.z = (float)(atan2((double)theMatrix[j][i], -(double)theMatrix[k][i]));
+ } else {
+ theEulerAngle.x = (float)(atan2(-(double)theMatrix[j][k], (double)theMatrix[j][j]));
+ theEulerAngle.y = (float)(atan2((double)sy, (double)theMatrix[i][i]));
+ theEulerAngle.z = 0;
+ }
+ } else {
+ double cy = sqrt(theMatrix[i][i] * theMatrix[i][i] + theMatrix[j][i] * theMatrix[j][i]);
+ if (cy > 16 * FLT_EPSILON) {
+ theEulerAngle.x = (float)(atan2((double)theMatrix[k][j], (double)theMatrix[k][k]));
+ theEulerAngle.y = (float)(atan2(-(double)theMatrix[k][i], (double)cy));
+ theEulerAngle.z = (float)(atan2((double)theMatrix[j][i], (double)theMatrix[i][i]));
+ } else {
+ theEulerAngle.x = (float)(atan2(-(double)theMatrix[j][k], (double)theMatrix[j][j]));
+ theEulerAngle.y = (float)(atan2(-(double)theMatrix[k][i], (double)cy));
+ theEulerAngle.z = 0;
+ }
+ }
+
+ if (n == EulParOdd) {
+ theEulerAngle.x = -theEulerAngle.x;
+ theEulerAngle.y = -theEulerAngle.y;
+ theEulerAngle.z = -theEulerAngle.z;
+ }
+
+ if (f == EulFrmR) {
+ float t = theEulerAngle.x;
+ theEulerAngle.x = theEulerAngle.z;
+ theEulerAngle.z = t;
+ }
+ theEulerAngle.w = (float)theOrder;
+ return theEulerAngle;
+}
+
+//==============================================================================
+/**
+ * Convert quaternion to Euler angles (in radians).
+ * @param theQuaternion incoming quaternion
+ * @param theOrder 0-23, use EulOrd**** to generate this value
+ * @return the generated angles ( radians )
+ */
+EulerAngles CEulerAngleConverter::Eul_FromQuat(Quat theQuaternion, int theOrder)
+{
+ HMatrix theMatrix;
+ double Nq = theQuaternion.x * theQuaternion.x + theQuaternion.y * theQuaternion.y
+ + theQuaternion.z * theQuaternion.z + theQuaternion.w * theQuaternion.w;
+ double s = (Nq > 0.0) ? (2.0 / Nq) : 0.0;
+ double xs = theQuaternion.x * s;
+ double ys = theQuaternion.y * s;
+ double zs = theQuaternion.z * s;
+ double wx = theQuaternion.w * xs;
+ double wy = theQuaternion.w * ys;
+ double wz = theQuaternion.w * zs;
+ double xx = theQuaternion.x * xs;
+ double xy = theQuaternion.x * ys;
+ double xz = theQuaternion.x * zs;
+ double yy = theQuaternion.y * ys;
+ double yz = theQuaternion.y * zs;
+ double zz = theQuaternion.z * zs;
+
+ theMatrix[X][X] = (float)(1.0 - (yy + zz));
+ theMatrix[X][Y] = (float)(xy - wz);
+ theMatrix[X][Z] = (float)(xz + wy);
+ theMatrix[Y][X] = (float)(xy + wz);
+ theMatrix[Y][Y] = (float)(1.0 - (xx + zz));
+ theMatrix[Y][Z] = (float)(yz - wx);
+ theMatrix[Z][X] = (float)(xz - wy);
+ theMatrix[Z][Y] = (float)(yz + wx);
+ theMatrix[Z][Z] = (float)(1.0 - (xx + yy));
+ theMatrix[W][X] = 0.0;
+ theMatrix[W][Y] = 0.0;
+ theMatrix[W][Z] = 0.0;
+ theMatrix[X][W] = 0.0;
+ theMatrix[Y][W] = 0.0;
+ theMatrix[Z][W] = 0.0;
+ theMatrix[W][W] = 1.0;
+
+ return Eul_FromHMatrix(theMatrix, theOrder);
+}
+
+//==============================================================================
+/**
+ * Dump the Order information
+ */
+const char *CEulerAngleConverter::DumpOrderInfo()
+{
+ long theCount = 0;
+ long theOrder[24];
+ char theOrderStr[24][16];
+
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXYs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYXs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYZs");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZXr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXZYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYZYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXYr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdYXZr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZXZr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdXYZr");
+ ::strcpy(theOrderStr[theCount++], "EulOrdZYZr");
+
+ theCount = 0;
+ theOrder[theCount++] = EulOrdXYZs;
+ theOrder[theCount++] = EulOrdXYXs;
+ theOrder[theCount++] = EulOrdXZYs;
+ theOrder[theCount++] = EulOrdXZXs;
+ theOrder[theCount++] = EulOrdYZXs;
+ theOrder[theCount++] = EulOrdYZYs;
+ theOrder[theCount++] = EulOrdYXZs;
+ theOrder[theCount++] = EulOrdYXYs;
+ theOrder[theCount++] = EulOrdZXYs;
+ theOrder[theCount++] = EulOrdZXZs;
+ theOrder[theCount++] = EulOrdZYXs;
+ theOrder[theCount++] = EulOrdZYZs;
+
+ theOrder[theCount++] = EulOrdZYXr;
+ theOrder[theCount++] = EulOrdXYXr;
+ theOrder[theCount++] = EulOrdYZXr;
+ theOrder[theCount++] = EulOrdXZXr;
+ theOrder[theCount++] = EulOrdXZYr;
+ theOrder[theCount++] = EulOrdYZYr;
+ theOrder[theCount++] = EulOrdZXYr;
+ theOrder[theCount++] = EulOrdYXYr;
+ theOrder[theCount++] = EulOrdYXZr;
+ theOrder[theCount++] = EulOrdZXZr;
+ theOrder[theCount++] = EulOrdXYZr;
+ theOrder[theCount++] = EulOrdZYZr;
+
+ char theSubBuf[256];
+ m_OrderInfoBuffer[0] = '\0';
+ for (long theIndex = 0; theIndex < 24; ++theIndex) {
+ ::sprintf(theSubBuf, " %16s - %ld\n ", theOrderStr[theIndex], theOrder[theIndex]);
+ ::strcat(m_OrderInfoBuffer, theSubBuf);
+ }
+
+ return m_OrderInfoBuffer;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSEulerAngles.h b/src/system/Qt3DSEulerAngles.h
new file mode 100644
index 0000000..d0f53c5
--- /dev/null
+++ b/src/system/Qt3DSEulerAngles.h
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include <qmath.h>
+
+namespace Q3DStudio {
+//==============================================================================
+// Description
+//==============================================================================
+// QuatTypes.h - Basic type declarations
+// by Ken Shoemake, shoemake@graphics.cis.upenn.edu
+// in "Graphics Gems IV", Academic Press, 1994
+typedef struct
+{
+ float x, y, z, w;
+} Quat; /* Quaternion */
+typedef float HMatrix[4][4]; /* Right-handed, for column vectors */
+enum QuatPart { X, Y, Z, W };
+typedef Quat EulerAngles; /* (x,y,z)=ang 1,2,3, w=order code */
+
+#define EulFrmS 0
+#define EulFrmR 1
+#define EulFrm(ord) ((unsigned)(ord)&1)
+#define EulRepNo 0
+#define EulRepYes 1
+#define EulRep(ord) (((unsigned)(ord) >> 1) & 1)
+#define EulParEven 0
+#define EulParOdd 1
+#define EulPar(ord) (((unsigned)(ord) >> 2) & 1)
+#define EulSafe "\000\001\002\000"
+#define EulNext "\001\002\000\001"
+#define EulAxI(ord) ((int)(EulSafe[(((unsigned)(ord) >> 3) & 3)]))
+#define EulAxJ(ord) ((int)(EulNext[EulAxI(ord) + (EulPar(ord) == EulParOdd)]))
+#define EulAxK(ord) ((int)(EulNext[EulAxI(ord) + (EulPar(ord) != EulParOdd)]))
+#define EulAxH(ord) ((EulRep(ord) == EulRepNo) ? EulAxK(ord) : EulAxI(ord))
+
+// EulGetOrd unpacks all useful information about order simultaneously.
+#define EulGetOrd(ord, i, j, k, h, n, s, f) \
+ { \
+ unsigned o = ord; \
+ f = o & 1; \
+ o = o >> 1; \
+ s = o & 1; \
+ o = o >> 1; \
+ n = o & 1; \
+ o = o >> 1; \
+ i = EulSafe[o & 3]; \
+ j = EulNext[i + n]; \
+ k = EulNext[i + 1 - n]; \
+ h = s ? k : i; \
+ }
+
+// EulOrd creates an order value between 0 and 23 from 4-tuple choices.
+#define EulOrd(i, p, r, f) (((((((i) << 1) + (p)) << 1) + (r)) << 1) + (f))
+
+// Static axes
+// X = 0, Y = 1, Z = 2 ref QuatPart
+#define EulOrdXYZs EulOrd(0, EulParEven, EulRepNo, EulFrmS)
+#define EulOrdXYXs EulOrd(0, EulParEven, EulRepYes, EulFrmS)
+#define EulOrdXZYs EulOrd(0, EulParOdd, EulRepNo, EulFrmS)
+#define EulOrdXZXs EulOrd(0, EulParOdd, EulRepYes, EulFrmS)
+#define EulOrdYZXs EulOrd(1, EulParEven, EulRepNo, EulFrmS)
+#define EulOrdYZYs EulOrd(1, EulParEven, EulRepYes, EulFrmS)
+#define EulOrdYXZs EulOrd(1, EulParOdd, EulRepNo, EulFrmS)
+#define EulOrdYXYs EulOrd(1, EulParOdd, EulRepYes, EulFrmS)
+#define EulOrdZXYs EulOrd(2, EulParEven, EulRepNo, EulFrmS)
+#define EulOrdZXZs EulOrd(2, EulParEven, EulRepYes, EulFrmS)
+#define EulOrdZYXs EulOrd(2, EulParOdd, EulRepNo, EulFrmS)
+#define EulOrdZYZs EulOrd(2, EulParOdd, EulRepYes, EulFrmS)
+
+// Rotating axes
+#define EulOrdZYXr EulOrd(0, EulParEven, EulRepNo, EulFrmR)
+#define EulOrdXYXr EulOrd(0, EulParEven, EulRepYes, EulFrmR)
+#define EulOrdYZXr EulOrd(0, EulParOdd, EulRepNo, EulFrmR)
+#define EulOrdXZXr EulOrd(0, EulParOdd, EulRepYes, EulFrmR)
+#define EulOrdXZYr EulOrd(1, EulParEven, EulRepNo, EulFrmR)
+#define EulOrdYZYr EulOrd(1, EulParEven, EulRepYes, EulFrmR)
+#define EulOrdZXYr EulOrd(1, EulParOdd, EulRepNo, EulFrmR)
+#define EulOrdYXYr EulOrd(1, EulParOdd, EulRepYes, EulFrmR)
+#define EulOrdYXZr EulOrd(2, EulParEven, EulRepNo, EulFrmR)
+#define EulOrdZXZr EulOrd(2, EulParEven, EulRepYes, EulFrmR)
+#define EulOrdXYZr EulOrd(2, EulParOdd, EulRepNo, EulFrmR)
+#define EulOrdZYZr EulOrd(2, EulParOdd, EulRepYes, EulFrmR)
+
+#ifndef M_PI
+#define M_PI 3.1415926535898
+#endif
+
+#define TODEG(x) x = (float)(x * 180 / M_PI);
+#define TORAD(x) x = (float)(x / 180 * M_PI);
+
+class CEulerAngleConverter
+{
+private:
+ char m_OrderInfoBuffer[1024];
+
+public:
+ CEulerAngleConverter();
+ virtual ~CEulerAngleConverter();
+
+public:
+ EulerAngles Eul_(float ai, float aj, float ah, int order);
+ Quat Eul_ToQuat(EulerAngles ea);
+ void Eul_ToHMatrix(EulerAngles ea, HMatrix M);
+ EulerAngles Eul_FromHMatrix(HMatrix M, int order);
+ EulerAngles Eul_FromQuat(Quat q, int order);
+
+ // Debug Stuff
+ const char *DumpOrderInfo();
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSFNDTimer.h b/src/system/Qt3DSFNDTimer.h
new file mode 100644
index 0000000..8241e2e
--- /dev/null
+++ b/src/system/Qt3DSFNDTimer.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "Qt3DSTimer.h"
+#include "Qt3DSTypes.h"
+#include "foundation/Qt3DSTime.h"
+
+namespace Q3DStudio {
+class Qt3DSFNDTimer : public ITimeProvider
+{
+ Q3DStudio::INT64 GetCurrentTimeMicroSeconds() override
+ {
+ return qt3ds::foundation::Time::getCurrentTimeInTensOfNanoSeconds() / 100;
+ }
+};
+}
diff --git a/src/system/Qt3DSFile.cpp b/src/system/Qt3DSFile.cpp
new file mode 100644
index 0000000..a26b735
--- /dev/null
+++ b/src/system/Qt3DSFile.cpp
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSFile.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// OS level memory routines
+//==============================================================================
+#if defined(_XENONPLATFORM) || defined(_PCPLATFORM) || defined(_PS3PLATFORM) \
+ || defined(_TEGRAPLATFORM) || defined(_LINUXPLATFORM) || defined(_INTEGRITYPLATFORM)
+CFile::TOpen CFile::s_Open = &fopen;
+CFile::TClose CFile::s_Close = &fclose;
+CFile::TRead CFile::s_Read = &fread;
+CFile::TWrite CFile::s_Write = &fwrite;
+CFile::TTell CFile::s_Tell = &ftell;
+CFile::TSeek CFile::s_Seek = &fseek;
+#else
+#error "A platform must be defined"
+#endif
+
+//==============================================================================
+/**
+ * Overrides basic memory allocation/deallocation routines
+ * @param inOpen fopen replacement method
+ * @param inClose fclose replacement method
+ * @param inRead fread replacement method
+ * @param inWrite fwrite replacement method
+ */
+void CFile::SetFileFunctions(const TOpen inOpen, const TClose inClose, const TRead inRead,
+ const TWrite inWrite, const TTell inTell, const TSeek inSeek)
+{
+ s_Open = inOpen;
+ s_Close = inClose;
+ s_Read = inRead;
+ s_Write = inWrite;
+ s_Tell = inTell;
+ s_Seek = inSeek;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSFile.h b/src/system/Qt3DSFile.h
new file mode 100644
index 0000000..e970cd2
--- /dev/null
+++ b/src/system/Qt3DSFile.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTypes.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Single overridable exit point for all low level file calls.
+ */
+class CFile
+{
+ //==============================================================================
+ // Typedefs
+ //==============================================================================
+public:
+ typedef enum _E_SEEK {
+ E_SEEK_SET = SEEK_SET,
+ E_SEEK_CUR = SEEK_CUR,
+ E_SEEK_END = SEEK_END
+ } E_SEEK;
+
+ typedef TFile *(*TOpen)(const char *inFileName, const char *inMode);
+ typedef int (*TClose)(TFile *inFile);
+ typedef TFileSize (*TRead)(void *inBuffer, TFileSize inSize, TFileSize inCount, TFile *inFile);
+ typedef TFileSize (*TWrite)(const void *inBuffer, TFileSize inSize, TFileSize inCount,
+ TFile *inFile);
+ typedef long (*TTell)(TFile *inFile);
+ typedef int (*TSeek)(TFile *inFile, long inOffset, int inOrigin);
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ static TOpen s_Open; ///< function pointer to fopen operation
+ static TClose s_Close; ///< function pointer to fclose operation
+ static TRead s_Read; ///< function pointer to fread operation
+ static TWrite s_Write; ///< function pointer to fwrite operation
+ static TTell s_Tell; ///< function pointer to ftell operation
+ static TSeek s_Seek; ///< function pointer to fseek operation
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Memory override
+ static void SetFileFunctions(const TOpen inOpen, const TClose inClose, const TRead inRead,
+ const TWrite inWrite, const TTell inTell, const TSeek inSeek);
+
+public: // Function access
+ static TOpen Open() { return s_Open; }
+ static TClose Close() { return s_Close; }
+ static TRead Read() { return s_Read; }
+ static TWrite Write() { return s_Write; }
+ static TTell Tell() { return s_Tell; }
+ static TSeek Seek() { return s_Seek; }
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSFileStream.cpp b/src/system/Qt3DSFileStream.cpp
new file mode 100644
index 0000000..202e4ae
--- /dev/null
+++ b/src/system/Qt3DSFileStream.cpp
@@ -0,0 +1,237 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "SystemPrefix.h"
+#include "Qt3DSFile.h"
+#include "Qt3DSFileStream.h"
+#include "foundation/Qt3DSLogging.h"
+
+#include <QtCore/qthread.h>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ * @param inFilename the file to open
+ * @param inMode the file mode to use
+ */
+CFileStream::CFileStream(const CHAR *inFilePath, const CHAR *inMode, BOOL inKeepTrying)
+ : m_FileStream(NULL)
+ , m_Endian(QT3DS_LITTLE_ENDIAN)
+ , m_KeepTrying(inKeepTrying)
+{
+ m_TempBuffer.Reserve(sizeof(MATRIX16)); // Preallocated some space
+ if (inFilePath)
+ Open(inFilePath, inMode);
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CFileStream::~CFileStream()
+{
+ Close();
+}
+
+//==============================================================================
+/**
+ * Open file.
+ * @param inFilename the file to open
+ * @param inMode the file mode ( read/write ) to use
+ */
+void CFileStream::Open(const CHAR *inFilePath, const CHAR *inMode)
+{
+ Close();
+ m_FileStream = CFile::Open()(inFilePath, inMode);
+ while (m_KeepTrying && !m_FileStream) {
+ QThread::msleep(10);
+ m_FileStream = CFile::Open()(inFilePath, inMode);
+ }
+
+ if (m_FileStream)
+ m_FilePath = inFilePath;
+}
+
+//==============================================================================
+/**
+ * Close file.
+ */
+void CFileStream::Close()
+{
+ if (m_FileStream) {
+ CFile::Close()(m_FileStream);
+ m_FileStream = NULL;
+ }
+}
+
+//==============================================================================
+/**
+ * Check if there is an opened file.
+ * @return TRUE if opened, FALSE otherwise.
+ */
+BOOL CFileStream::IsOpen() const
+{
+ return m_FileStream != NULL;
+}
+
+//==============================================================================
+/**
+ * Access the source path of a file stream.
+ * @return an empty string if the stream is not open
+ */
+const CHAR *CFileStream::GetFilePath() const
+{
+ return m_FilePath.toLatin1().constData();
+}
+
+//==============================================================================
+/**
+ * Read from stream into memory.
+ * @param outMemory the destination of the read
+ * @param inByteCount the amount to read
+ * @return the number of bytes actually read
+ */
+INT32 CFileStream::ReadRawCopy(void *inDestination, const UINT32 inByteCount)
+{
+ INT32 lastRead = 0;
+ INT32 totalRead = 0;
+ do {
+ if (totalRead) {
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "Failed to read expected amount, retrying, expected "
+ << inByteCount << " bytes, got "<< totalRead <<" bytes";
+ }
+ lastRead = static_cast<INT32>(CFile::Read()(((char *)inDestination) + totalRead, 1,
+ inByteCount - totalRead, m_FileStream));
+ totalRead += lastRead;
+ } while (lastRead && totalRead < (INT32)inByteCount);
+
+ if (totalRead != (INT32)inByteCount) {
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "Failed to read expected amount, retrying, expected "
+ << inByteCount << " bytes, got "<< totalRead <<" bytes";
+
+ // Zero out remaining destination buffer.
+ // This can, in some cases, avoid a crash and allow the system to survive a partial
+ // read.
+ INT32 amountLeft = inByteCount - totalRead;
+ memset(((char *)inDestination) + totalRead, 0, amountLeft);
+ }
+ return totalRead;
+}
+
+//==============================================================================
+/**
+ * Reads data into internal buffer and return the data pointer for it.
+ * @param outMemory pointer to internal data buffer
+ * @param inByteCount the amount to read
+ * @return the number of bytes actually read
+ */
+INT32 CFileStream::ReadRaw(const void *&inPtr, const UINT32 inByteCount)
+{
+ m_TempBuffer.Reserve(static_cast<INT32>(inByteCount));
+ INT32 theReadSize = ReadRawCopy(m_TempBuffer.Begin(), inByteCount);
+ if (theReadSize != (INT32)inByteCount) {
+ qCWarning(qt3ds::INVALID_OPERATION)
+ << "Failed to read expected amount, retrying, expected "<< inByteCount
+ << " bytes, got "<< theReadSize <<" bytes";
+ }
+ inPtr = m_TempBuffer.Begin();
+ return theReadSize;
+}
+
+//==============================================================================
+/**
+ * Write from memory to stream.
+ * @param inMemory the buffer to write from
+ * @param inByteCount the amount to write
+ * @return the number of bytes actually written
+ */
+INT32 CFileStream::WriteRaw(const void *inSource, const UINT32 inByteCount)
+{
+ return static_cast<INT32>(CFile::Write()(inSource, 1, inByteCount, m_FileStream));
+}
+
+//==============================================================================
+/**
+ * Offsets the file position by the specified number of bytes
+ */
+void CFileStream::Offset(const INT32 inByteCount)
+{
+ CFile::Seek()(m_FileStream, inByteCount, CFile::E_SEEK_CUR);
+}
+
+//==============================================================================
+/**
+ * Returns the current position of the file stream
+ */
+IStream::TStreamPosition CFileStream::Current()
+{
+ return static_cast<INT32>(CFile::Tell()(m_FileStream));
+}
+
+//==============================================================================
+/**
+ * Sets the stream to the specified position within the file
+ */
+void CFileStream::Set(const TStreamPosition &inPosition)
+{
+ CFile::Seek()(m_FileStream, inPosition, CFile::E_SEEK_SET);
+}
+
+//==============================================================================
+/**
+ * Set the endianess of the file.
+ * @warning endian support not implemented
+ */
+void CFileStream::SetEndian(const BOOL inEndian)
+{
+ m_Endian = inEndian;
+}
+
+//==============================================================================
+/**
+ * Get the endianess of the file.
+ * @warning endian support not implemented
+ */
+BOOL CFileStream::GetEndian()
+{
+ return m_Endian;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSFileStream.h b/src/system/Qt3DSFileStream.h
new file mode 100644
index 0000000..49e272f
--- /dev/null
+++ b/src/system/Qt3DSFileStream.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSIFileStream.h"
+#include "Qt3DSArray.h"
+#include "Qt3DSEndian.h"
+
+#include <QtCore/QString>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * File stream base class.
+ */
+class CFileStream : public IFileStream
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CFileStream(const CHAR *inFilePath = NULL, const CHAR *inMode = "rb",
+ BOOL inKeepTrying = false);
+ virtual ~CFileStream();
+
+public: // Serializing
+ INT32 ReadRawCopy(void *inDestination, const UINT32 inByteCount) override;
+ INT32 ReadRaw(const void *&inPtr, const UINT32 inByteCount) override;
+ INT32 WriteRaw(const void *inSource, const UINT32 inByteCount) override;
+
+ // Seeking
+ void Offset(const INT32 inOffset) override;
+ TStreamPosition Current() override;
+ void Set(const TStreamPosition &inPosition) override;
+
+public: // File Operation
+ void Open(const CHAR *inFilePath, const CHAR *inMode) override;
+ void Close() override;
+ BOOL IsOpen() const override;
+ const CHAR *GetFilePath() const override;
+
+public: // Endianess
+ void SetEndian(const BOOL inEndian);
+ BOOL GetEndian();
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ TFile *m_FileStream;
+ QString m_FilePath;
+ CArray<UINT8> m_TempBuffer;
+ BOOL m_Endian;
+ BOOL m_KeepTrying;
+ CHAR m_Unused[2]; ///< (padding)
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSFixedArray.h b/src/system/Qt3DSFixedArray.h
new file mode 100644
index 0000000..9f971d8
--- /dev/null
+++ b/src/system/Qt3DSFixedArray.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include <QtCore/QDebug>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Fixed size Ordered Collection that doesn't support growing.
+ */
+template <class T, int Size>
+class CFixedArray
+{
+ //==============================================================================
+ // Typedefs
+ //==============================================================================
+public:
+ typedef T TType; ///< Easy access to template type
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ T m_Data[Size]; ///< Allocated memory containing array data
+ INT32 m_Capacity; ///< Max number of elements possible
+ INT32 m_Count; ///< Current number of elements in array
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ inline CFixedArray();
+ inline ~CFixedArray();
+
+public: // Management
+ inline void Clear();
+ inline INT32 GetCount() const;
+ inline INT32 GetCapacity() const;
+
+public: // Stack access
+ inline void Push(const T &inValue);
+ inline const T &Pop();
+
+public: // Array access
+ inline T &operator[](const INT32 inIndex);
+ inline void Remove(const INT32 inIndex);
+};
+
+} // namespace Q3DStudio
+
+//==============================================================================
+// Template code
+//==============================================================================
+#include "Qt3DSFixedArray.inl"
diff --git a/src/system/Qt3DSFixedArray.inl b/src/system/Qt3DSFixedArray.inl
new file mode 100644
index 0000000..5524224
--- /dev/null
+++ b/src/system/Qt3DSFixedArray.inl
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 1999-2007 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ */
+template <class T, int Size>
+inline CFixedArray<T, Size>::CFixedArray()
+ : m_Capacity(Size)
+ , m_Count(0)
+{
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+template <class T, int Size>
+inline CFixedArray<T, Size>::~CFixedArray()
+{
+}
+
+//==============================================================================
+/**
+ * Remove all elements in the array
+ */
+template <class T, int Size>
+inline void CFixedArray<T, Size>::Clear()
+{
+ m_Count = 0;
+}
+
+//==============================================================================
+/**
+ * Get current count of T in the array
+ * @return current count of the array
+ */
+template <class T, int Size>
+inline INT32 CFixedArray<T, Size>::GetCount() const
+{
+ return m_Count;
+}
+
+//==============================================================================
+/**
+ * Get the capacity of the array
+ * Capacity reflects the allocated memory size
+ * @return capacity of the array
+ */
+template <class T, int Size>
+inline INT32 CFixedArray<T, Size>::GetCapacity() const
+{
+ return m_Capacity;
+}
+
+//==============================================================================
+/**
+ * Insert T to the end of the array
+ * @param inValue value of datatype T
+ */
+template <class T, int Size>
+inline void CFixedArray<T, Size>::Push(const T &inValue)
+{
+ if (m_Count == m_Capacity) {
+ qWarning("Trying to push to many objects onto a CFixedArray", "Capacity=%d", m_Capacity);
+ return;
+ }
+
+ m_Data[m_Count] = inValue;
+ ++m_Count;
+}
+
+//==============================================================================
+/**
+ * Remove and retrieve T which is at the end of the array
+ * @return value of datatype T
+ */
+template <class T, int Size>
+inline const T &CFixedArray<T, Size>::Pop()
+{
+ if (m_Count == 0)
+ return {};
+
+ --m_Count;
+ return m_Data[m_Count];
+}
+
+//==============================================================================
+/**
+ * Get T at a particular index position of the array.
+ * Need to ensure only valid index is allowed
+ * Clear( ) will set the m_counter = 0
+ * @param inIndex the index of the array
+ * @return reference of value of datatype T
+ */
+template <class T, int Size>
+inline T &CFixedArray<T, Size>::operator[](const INT32 inIndex)
+{
+ Q3DStudio_ASSERT(inIndex < m_Capacity);
+
+ return m_Data[inIndex];
+}
+
+//==============================================================================
+/**
+ * Removes a specific entry from the array.
+ * Moves all entries below it up, expensive.
+ * @param inIndex the index of the entry
+ */
+template <class T, int Size>
+inline void CFixedArray<T, Size>::Remove(const INT32 inIndex)
+{
+ Q3DStudio_memmove(m_Data + inIndex, m_Data + inIndex + 1, sizeof(T) * (m_Count - inIndex - 1));
+ --m_Count;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSFunctionWrappers.cpp b/src/system/Qt3DSFunctionWrappers.cpp
new file mode 100644
index 0000000..e96c3ce
--- /dev/null
+++ b/src/system/Qt3DSFunctionWrappers.cpp
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2010 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "SystemPrefix.h"
+#include "Qt3DSFunctionWrappers.h"
+
+using namespace Q3DStudio;
+
+//==============================================================================
+/**
+* CTOR
+*/
+IFunctionWrapper::IFunctionWrapper()
+ : m_Cost(0)
+{
+}
+
+//==============================================================================
+/**
+* Retrieve the cost associated with this function.
+* Should be zero or greater
+*/
+INT32 IFunctionWrapper::GetCost()
+{
+ return m_Cost;
+}
+
+//==============================================================================
+/**
+* Sets the cost associated with this function.
+*/
+void IFunctionWrapper::SetCost(const INT32 inCost)
+{
+ m_Cost = inCost;
+} \ No newline at end of file
diff --git a/src/system/Qt3DSFunctionWrappers.h b/src/system/Qt3DSFunctionWrappers.h
new file mode 100644
index 0000000..8fff62d
--- /dev/null
+++ b/src/system/Qt3DSFunctionWrappers.h
@@ -0,0 +1,416 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2010 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+* Interface for a function wrapper with an associated cost.
+*/
+class IFunctionWrapper
+{
+public:
+ IFunctionWrapper();
+ virtual ~IFunctionWrapper(){}
+
+public:
+ virtual void Execute() = 0;
+ INT32 GetCost();
+ void SetCost(const INT32 inCost);
+
+protected:
+ INT32 m_Cost;
+};
+
+//==============================================================================
+/**
+* 2 arguments function wrapper
+*/
+template <typename TArg1, typename TArg2>
+class CFunctionWrapper2Args : public IFunctionWrapper
+{
+public:
+ typedef void (*TFunction)(TArg1 inArg1, TArg2 inArg2);
+
+public:
+ CFunctionWrapper2Args(TFunction, TArg1 inArg1, TArg2 inArg2);
+
+public:
+ virtual void Execute();
+
+protected:
+ TFunction m_Function;
+ TArg1 m_Arg1;
+ TArg2 m_Arg2;
+};
+
+// Unused
+/*
+template <typename TArg1, typename TArg2, typename TArg3>
+class CFunctionWrapper3Args : public IFunctionWrapper
+{
+ public:
+ typedef void ( *TFunction )( TArg1 inArg1, TArg2 inArg2, TArg3 inArg3 );
+
+ public:
+ CFunctionWrapper3Args( TFunction inFunction, TArg1 inArg1, TArg2 inArg2, TArg3
+inArg3 );
+
+ public:
+ virtual void Execute( );
+
+ protected:
+ TFunction m_Function;
+ TArg1 m_Arg1;
+ TArg2 m_Arg2;
+ TArg3 m_Arg3;
+};
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4>
+class CFunctionWrapper4Args : public IFunctionWrapper
+{
+ public:
+ typedef void ( *TFunction )( TArg1 inArg1, TArg2 inArg2, TArg3 inArg3, TArg4 inArg4
+);
+
+ public:
+ CFunctionWrapper4Args( TFunction inFunction, TArg1 inArg1, TArg2 inArg2, TArg3
+inArg3, TArg4 inArg4 );
+
+ public:
+ virtual void Execute( );
+
+ protected:
+ TFunction m_Function;
+ TArg1 m_Arg1;
+ TArg2 m_Arg2;
+ TArg3 m_Arg3;
+ TArg4 m_Arg4;
+};
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4, typename TArg5, typename
+TArg6, typename TArg7, typename TArg8>
+class CFunctionWrapper8Args : public IFunctionWrapper
+{
+ public:
+ typedef void ( *TFunction )( TArg1 inArg1, TArg2 inArg2, TArg3 inArg3, TArg4 inArg4,
+TArg5 inArg5, TArg6 inArg6, TArg7 inArg7, TArg8 inArg8 );
+
+ public:
+ CFunctionWrapper8Args( TFunction inFunction, TArg1 inArg1, TArg2 inArg2, TArg3
+inArg3, TArg4 inArg4, TArg5 inArg5, TArg6 inArg6, TArg7 inArg7, TArg8 inArg8 );
+
+ public:
+ virtual void Execute( );
+
+ protected:
+ TFunction m_Function;
+ TArg1 m_Arg1;
+ TArg2 m_Arg2;
+ TArg3 m_Arg3;
+ TArg4 m_Arg4;
+ TArg5 m_Arg5;
+ TArg6 m_Arg6;
+ TArg7 m_Arg7;
+ TArg8 m_Arg8;
+};
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4, typename TArg5, typename
+TArg6, typename TArg7, typename TArg8, typename TArg9>
+class CFunctionWrapper9Args : public IFunctionWrapper
+{
+ public:
+ typedef void ( *TFunction )( TArg1 inArg1, TArg2 inArg2, TArg3 inArg3, TArg4 inArg4,
+TArg5 inArg5, TArg6 inArg6, TArg7 inArg7, TArg8 inArg8, TArg9 inArg9 );
+
+ public:
+ CFunctionWrapper9Args( TFunction inFunction, TArg1 inArg1, TArg2 inArg2, TArg3
+inArg3, TArg4 inArg4, TArg5 inArg5, TArg6 inArg6, TArg7 inArg7, TArg8 inArg8, TArg9 inArg9 );
+
+ public:
+ virtual void Execute( );
+
+ protected:
+ TFunction m_Function;
+ TArg1 m_Arg1;
+ TArg2 m_Arg2;
+ TArg3 m_Arg3;
+ TArg4 m_Arg4;
+ TArg5 m_Arg5;
+ TArg6 m_Arg6;
+ TArg7 m_Arg7;
+ TArg8 m_Arg8;
+ TArg9 m_Arg9;
+};
+*/
+
+//==============================================================================
+/**
+* 1 argument member function wrapper
+*/
+template <typename TObject, typename TReturn, typename TArg1>
+class CMemberFunctionWrapper1Args : public IFunctionWrapper
+{
+public:
+ typedef TReturn (TObject::*TFunction)(TArg1 inArg1);
+
+public:
+ CMemberFunctionWrapper1Args(TObject *inObject, TFunction inFunction, TArg1 inArg1);
+
+public:
+ virtual void Execute();
+
+protected:
+ TFunction m_Function;
+ TObject *m_Object;
+ TArg1 m_Arg1;
+};
+
+//==============================================================================
+/**
+* 2 argument member function wrapper
+*/
+template <typename TObject, typename TReturn, typename TArg1, typename TArg2>
+class CMemberFunctionWrapper2Args : public IFunctionWrapper
+{
+public:
+ typedef TReturn (TObject::*TFunction)(TArg1 inArg1, TArg2 inArg2);
+
+public:
+ CMemberFunctionWrapper2Args(TObject *inObject, TFunction inFunction, TArg1 inArg1,
+ TArg2 inArg2);
+
+public:
+ virtual void Execute();
+
+protected:
+ TFunction m_Function;
+ TObject *m_Object;
+ TArg1 m_Arg1;
+ TArg2 m_Arg2;
+};
+
+//==============================================================================
+/**
+* 6 argument member function wrapper
+*/
+template <typename TObject, typename TReturn, typename TArg1, typename TArg2, typename TArg3,
+ typename TArg4, typename TArg5, typename TArg6>
+class CMemberFunctionWrapper6Args : public IFunctionWrapper
+{
+public:
+ typedef TReturn (TObject::*TFunction)(TArg1 inArg1, TArg2 inArg2, TArg3 inArg3, TArg4 inArg4,
+ TArg5 inArg5, TArg6 inArg6);
+
+public:
+ CMemberFunctionWrapper6Args(TObject *inObject, TFunction inFunction, TArg1 inArg1, TArg2 inArg2,
+ TArg3 inArg3, TArg4 inArg4, TArg5 inArg5, TArg6 inArg6);
+
+public:
+ virtual void Execute();
+
+protected:
+ TFunction m_Function;
+ TObject *m_Object;
+ TArg1 m_Arg1;
+ TArg2 m_Arg2;
+ TArg3 m_Arg3;
+ TArg4 m_Arg4;
+ TArg5 m_Arg5;
+ TArg6 m_Arg6;
+};
+
+// Implementation
+template <typename TArg1, typename TArg2>
+CFunctionWrapper2Args<TArg1, TArg2>::CFunctionWrapper2Args(TFunction inFunction, TArg1 inArg1,
+ TArg2 inArg2)
+ : m_Function(inFunction)
+ , m_Arg1(inArg1)
+ , m_Arg2(inArg2)
+{
+}
+
+template <typename TArg1, typename TArg2>
+void CFunctionWrapper2Args<TArg1, TArg2>::Execute()
+{
+ m_Function(m_Arg1, m_Arg2);
+}
+
+// Unused
+/*
+template <typename TArg1, typename TArg2, typename TArg3>
+CFunctionWrapper3Args<TArg1, TArg2, TArg3>::CFunctionWrapper3Args( TFunction inFunction, TArg1
+inArg1, TArg2 inArg2, TArg3 inArg3 )
+: m_Function( inFunction ),
+ m_Arg1( inArg1 ),
+ m_Arg2( inArg2 ),
+ m_Arg3( inArg3 )
+{
+}
+
+template <typename TArg1, typename TArg2, typename TArg3>
+void CFunctionWrapper3Args<TArg1, TArg2, TArg3>::Execute( )
+{
+ m_Function( m_Arg1, m_Arg2, m_Arg3 );
+}
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4>
+CFunctionWrapper4Args<TArg1, TArg2, TArg3, TArg4>::CFunctionWrapper4Args( TFunction inFunction,
+TArg1 inArg1, TArg2 inArg2, TArg3 inArg3, TArg4 inArg4 )
+: m_Function( inFunction ),
+ m_Arg1( inArg1 ),
+ m_Arg2( inArg2 ),
+ m_Arg3( inArg3 ),
+ m_Arg4( inArg4 )
+{
+}
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4>
+void CFunctionWrapper4Args<TArg1, TArg2, TArg3, TArg4>::Execute( )
+{
+ m_Function( m_Arg1, m_Arg2, m_Arg3, m_Arg4 );
+}
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4, typename TArg5, typename
+TArg6, typename TArg7, typename TArg8>
+CFunctionWrapper8Args<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7,
+TArg8>::CFunctionWrapper8Args( TFunction inFunction, TArg1 inArg1, TArg2 inArg2, TArg3 inArg3, TArg4
+inArg4, TArg5 inArg5, TArg6 inArg6, TArg7 inArg7, TArg8 inArg8 )
+: m_Function( inFunction ),
+ m_Arg1( inArg1 ),
+ m_Arg2( inArg2 ),
+ m_Arg3( inArg3 ),
+ m_Arg4( inArg4 ),
+ m_Arg5( inArg5 ),
+ m_Arg6( inArg6 ),
+ m_Arg7( inArg7 ),
+ m_Arg8( inArg8 )
+
+{
+}
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4, typename TArg5, typename
+TArg6, typename TArg7, typename TArg8>
+void CFunctionWrapper8Args<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8>::Execute( )
+{
+ m_Function( m_Arg1, m_Arg2, m_Arg3, m_Arg4, m_Arg5, m_Arg6, m_Arg7, m_Arg8 );
+}
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4, typename TArg5, typename
+TArg6, typename TArg7, typename TArg8, typename TArg9>
+CFunctionWrapper9Args<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8,
+TArg9>::CFunctionWrapper9Args( TFunction inFunction, TArg1 inArg1, TArg2 inArg2, TArg3 inArg3, TArg4
+inArg4, TArg5 inArg5, TArg6 inArg6, TArg7 inArg7, TArg8 inArg8, TArg9 inArg9 )
+: m_Function( inFunction ),
+ m_Arg1( inArg1 ),
+ m_Arg2( inArg2 ),
+ m_Arg3( inArg3 ),
+ m_Arg4( inArg4 ),
+ m_Arg5( inArg5 ),
+ m_Arg6( inArg6 ),
+ m_Arg7( inArg7 ),
+ m_Arg8( inArg8 ),
+ m_Arg9( inArg9 )
+{
+}
+
+template <typename TArg1, typename TArg2, typename TArg3, typename TArg4, typename TArg5, typename
+TArg6, typename TArg7, typename TArg8, typename TArg9>
+void CFunctionWrapper9Args<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9>::Execute(
+)
+{
+ m_Function( m_Arg1, m_Arg2, m_Arg3, m_Arg4, m_Arg5, m_Arg6, m_Arg7, m_Arg8, m_Arg9 );
+}
+*/
+
+template <typename TObject, typename TReturn, typename TArg1>
+CMemberFunctionWrapper1Args<TObject, TReturn, TArg1>::CMemberFunctionWrapper1Args(
+ TObject *inObject, TFunction inFunction, TArg1 inArg1)
+ : m_Function(inFunction)
+ , m_Object(inObject)
+ , m_Arg1(inArg1)
+{
+}
+
+template <typename TObject, typename TReturn, typename TArg1>
+void CMemberFunctionWrapper1Args<TObject, TReturn, TArg1>::Execute()
+{
+ (m_Object->*m_Function)(m_Arg1);
+}
+
+template <typename TObject, typename TReturn, typename TArg1, typename TArg2>
+CMemberFunctionWrapper2Args<TObject, TReturn, TArg1, TArg2>::CMemberFunctionWrapper2Args(
+ TObject *inObject, TFunction inFunction, TArg1 inArg1, TArg2 inArg2)
+ : m_Function(inFunction)
+ , m_Object(inObject)
+ , m_Arg1(inArg1)
+ , m_Arg2(inArg2)
+{
+}
+
+template <typename TObject, typename TReturn, typename TArg1, typename TArg2>
+void CMemberFunctionWrapper2Args<TObject, TReturn, TArg1, TArg2>::Execute()
+{
+ (m_Object->*m_Function)(m_Arg1, m_Arg2);
+}
+
+template <typename TObject, typename TReturn, typename TArg1, typename TArg2, typename TArg3,
+ typename TArg4, typename TArg5, typename TArg6>
+CMemberFunctionWrapper6Args<TObject, TReturn, TArg1, TArg2, TArg3, TArg4, TArg5,
+ TArg6>::CMemberFunctionWrapper6Args(TObject *inObject,
+ TFunction inFunction, TArg1 inArg1,
+ TArg2 inArg2, TArg3 inArg3,
+ TArg4 inArg4, TArg5 inArg5,
+ TArg6 inArg6)
+ : m_Function(inFunction)
+ , m_Object(inObject)
+ , m_Arg1(inArg1)
+ , m_Arg2(inArg2)
+ , m_Arg3(inArg3)
+ , m_Arg4(inArg4)
+ , m_Arg5(inArg5)
+ , m_Arg6(inArg6)
+{
+}
+
+template <typename TObject, typename TReturn, typename TArg1, typename TArg2, typename TArg3,
+ typename TArg4, typename TArg5, typename TArg6>
+void CMemberFunctionWrapper6Args<TObject, TReturn, TArg1, TArg2, TArg3, TArg4, TArg5,
+ TArg6>::Execute()
+{
+ (m_Object->*m_Function)(m_Arg1, m_Arg2, m_Arg3, m_Arg4, m_Arg5, m_Arg6);
+}
+}
diff --git a/src/system/Qt3DSHash.h b/src/system/Qt3DSHash.h
new file mode 100644
index 0000000..8baa2db
--- /dev/null
+++ b/src/system/Qt3DSHash.h
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "Qt3DSConfig.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Utility class transforming a string into a hash value.
+ */
+class CHash
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Static utility
+ //==============================================================================
+ /**
+ * We use the hashing algorithm called "sdbm".
+ *
+ * This algorithm was created from sdbm (a public-domain reimplementation
+ * of ndbm) database library. It was found to do well in scrambling bits,
+ * causing better distribution of the keys and fewer splits. it also happens
+ * to be a good general hashing function with good distribution. the actual
+ * function is hash(i) = hash(i - 1) * 65599 + str[i]; what is included below
+ * is the faster version used in gawk. [there is even a faster, duff-device
+ * version] the magic constant 65599 was picked out of thin air while
+ * experimenting with different constants, and turns out to be a prime. this
+ * is one of the algorithms used in berkeley db (see sleepycat) and elsewhere.
+ *
+ * @param inString the string to hash
+ * @return the hash value
+ */
+ static TStringHash HashString(const CHAR *inString)
+ {
+ TStringHash theHash = 0;
+ INT32 theChar = *inString;
+ INT32 theCount = 0;
+ while (theChar && (theCount < HASH_LIMIT)) {
+ theChar = *inString++;
+ theHash = theChar + (theHash << 6) + (theHash << 16) - theHash;
+ ++theCount;
+ }
+
+ return theHash;
+ }
+
+ //==============================================================================
+ /**
+ * 31-bit hash with MSB set to 0
+ *
+ * @param inString the string to hash
+ * @return the 31-bit hash value
+ */
+ static TEventCommandHash HashEventCommand(const CHAR *inString)
+ {
+ return HashString(inString) & 0x7fffffff;
+ }
+
+ //==============================================================================
+ /**
+ * 26-bit hash with MSBs all set to 0
+ *
+ * @param inString the string to hash
+ * @return the 26-bit hash value
+ */
+ static TAttributeHash HashAttribute(const CHAR *inString)
+ {
+ return HashString(inString) & 0x03ffffff;
+ }
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSIFileStream.h b/src/system/Qt3DSIFileStream.h
new file mode 100644
index 0000000..0b43260
--- /dev/null
+++ b/src/system/Qt3DSIFileStream.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSIStream.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * File stream interface
+ */
+class IFileStream : public IStream
+{
+public:
+ virtual void Open(const CHAR *inFilePath, const CHAR *inMode) = 0;
+ virtual void Close() = 0;
+ virtual BOOL IsOpen() const = 0;
+ virtual const CHAR *GetFilePath() const = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSIStream.h b/src/system/Qt3DSIStream.h
new file mode 100644
index 0000000..a4c1195
--- /dev/null
+++ b/src/system/Qt3DSIStream.h
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Pure virtual interface providing the stream for class serialization.
+ */
+class IStream
+{
+ //==============================================================================
+ // Typedef
+ //==============================================================================
+public:
+ typedef INT32 TStreamPosition;
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ virtual ~IStream(){}
+
+public: // Serializing
+ virtual INT32 ReadRawCopy(void *inDestination, const UINT32 inByteCount) = 0;
+ virtual INT32 ReadRaw(const void *&inPtr, const UINT32 inByteCount) = 0;
+ virtual INT32 WriteRaw(const void *inSource, const UINT32 inByteCount) = 0;
+
+ // Seeking
+ virtual void Offset(const INT32 inOffset) = 0;
+ virtual TStreamPosition Current() = 0;
+ virtual void Set(const TStreamPosition &inPosition) = 0;
+
+public: // Template Readers that make a copy
+ template <typename T>
+ INT32 ReadCopy(T &outValue);
+ template <typename T>
+ INT32 ReadArrayCopy(T *outValue, const UINT32 inCount);
+
+public: // Template Readers that access value directly
+ template <typename T>
+ INT32 Read(const T *&inPtr);
+ template <typename T>
+ INT32 ReadArray(const T *&inPtr, UINT32 inCount);
+
+public: // Template Writers
+ template <typename T>
+ INT32 Write(const T &inValue);
+ template <typename T>
+ INT32 WriteArray(const T *inValue, const UINT32 inCount);
+};
+
+/** Notes concerning usage of Read or ReadCopy (and ReadArray and ReadArrayCopy)**/
+/**
+If the value being read fits into 4 bytes (i.e float, int/long), either Read/ReadCopy can be used.
+However, if the read value is going to be accessed frequently (in loops etc), ReadCopy is
+recommended so a copy is available instead of dereferencing.
+
+ReadCopy should be used if the data read is an array or is significantly larger than 4 bytes (like
+vectors or matrixes).
+
+For cases where the value is to be stored in a persistant data structures, ReadCopy should be used.
+
+One important thing about Read/ReadArray, is that the pointer returned is only valid before the next
+Read/ReadyArray is called.
+There is no guarantee that the pointer data will remain unchanged during subsequent calls to
+Read/ReadArray.
+**/
+
+//==============================================================================
+/**
+ * Read and assign a value by copying.
+ */
+template <typename T>
+INT32 IStream::ReadCopy(T &outValue)
+{
+ return ReadRawCopy(&outValue, sizeof(T));
+}
+
+//==============================================================================
+/**
+ * Read and copy data to a preallocated array.
+ */
+template <typename T>
+INT32 IStream::ReadArrayCopy(T *outValue, const UINT32 inCount)
+{
+ return ReadRawCopy(outValue, sizeof(T) * inCount);
+}
+
+//==============================================================================
+/**
+ * Obtain a pointer directly to the data.
+ */
+template <typename T>
+INT32 IStream::Read(const T *&inPtr)
+{
+ return ReadRaw(reinterpret_cast<const void *&>(inPtr), sizeof(T));
+}
+
+//==============================================================================
+/**
+ * Obtain a pointer directly to the array data.
+ */
+template <typename T>
+INT32 IStream::ReadArray(const T *&inPtr, const UINT32 inCount)
+{
+ return ReadRaw(reinterpret_cast<const void *&>(inPtr), sizeof(T) * inCount);
+}
+
+//==============================================================================
+/**
+ * Write a value.
+ */
+template <typename T>
+INT32 IStream::Write(const T &inValue)
+{
+ return WriteRaw(&inValue, sizeof(T));
+}
+
+//==============================================================================
+/**
+ * Write an array of values.
+ */
+template <typename T>
+INT32 IStream::WriteArray(const T *inValue, const UINT32 inCount)
+{
+ return WriteRaw(inValue, sizeof(T) * inCount);
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSITimer.h b/src/system/Qt3DSITimer.h
new file mode 100644
index 0000000..e73fbb9
--- /dev/null
+++ b/src/system/Qt3DSITimer.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * @interface ITimer
+ * The base functionality of the timer used by the Kernel
+ *
+ * Implement this interface per-platform to obtain the required functionality
+ */
+class ITimer
+{
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ virtual ~ITimer() {}
+
+public: // Operation
+ virtual void Start() = 0;
+ virtual void Stop() = 0;
+ virtual void Reset() = 0;
+ virtual TTimeUnit GetTimeMilliSecs() = 0;
+ virtual TMicroSeconds GetTimeMicroSecs() = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMacros.h b/src/system/Qt3DSMacros.h
new file mode 100644
index 0000000..fbc40b4
--- /dev/null
+++ b/src/system/Qt3DSMacros.h
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSAssert.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Easy iterations over arrays.
+ * @param array_type element type
+ * @param array_element element variable name getting each entry
+ * @param array_container element array we are traversing
+ */
+#define FOR_ARRAY(array_type, array_element, array_container) \
+ for (array_type *array_element = (array_container).Begin(); \
+ array_element != (array_container).End(); ++array_element)
+
+#define FOR_ARRAY_REVERSE(array_type, array_element, array_container) \
+ for (array_type *array_element = (array_container).End() - 1; \
+ array_element != (array_container).Begin() - 1; --array_element)
+
+//==============================================================================
+/**
+ * Return the smallest of two numbers/objects.
+ * @param inA one value to compare
+ * @param inB another value to compare
+ * @return a reference, not a copy, to the smallest of the two values
+ */
+template <class T>
+inline const T Q3DStudio_abs(const T &inVal)
+{
+ return inVal >= 0 ? inVal : -inVal;
+}
+
+//==============================================================================
+/**
+ * Return the smallest of two numbers/objects.
+ * @param inA one value to compare
+ * @param inB another value to compare
+ * @return a reference, not a copy, to the smallest of the two values
+ */
+template <typename T>
+inline const T &Q3DStudio_min(const T &inA, const T &inB)
+{
+ return inA < inB ? inA : inB;
+}
+
+//==============================================================================
+/**
+ * Return the largest of two numbers/objects.
+ * @param inA one value to compare
+ * @param inB another value to compare
+ * @return a reference, not a copy, to the largest of the two values
+ */
+template <class T>
+inline const T &Q3DStudio_max(const T &inA, const T &inB)
+{
+ return inA > inB ? inA : inB;
+}
+
+//==============================================================================
+/**
+ * Return the smallest of three values.
+ * @param inA one value to compare
+ * @param inB another value to compare
+ * @param inC a third value to compare
+ * @return a reference, not a copy, to the smallest of the three values
+ */
+template <class T>
+inline const T &Q3DStudio_min3(const T &inA, const T &inB, const T &inC)
+{
+ return inA < inB ? Q3DStudio_min(inA, inC) : Q3DStudio_min(inB, inC);
+}
+
+//==============================================================================
+/**
+ * Return the largest of three values.
+ * @param inA one value to compare
+ * @param inB another value to compare
+ * @param inC a third value to compare
+ * @return a reference, not a copy, to the largest of the three values
+ */
+template <class T>
+inline const T &Q3DStudio_max3(const T &inA, const T &inB, const T &inC)
+{
+ return inA > inB ? Q3DStudio_max(inA, inC) : Q3DStudio_max(inB, inC);
+}
+
+//==============================================================================
+/**
+ * Make sure a value is in-bounds between two other values.
+ * @param inVal the value to clamp
+ * @param inMin the lowest inclusive value
+ * @param inMax the highest inclusive value
+ * @return a reference to inVal if the value is in bounds,
+ inMin if lower than the minimum value, or
+ inMax if higher than maximum value.
+ */
+template <class T>
+inline const T &Q3DStudio_clamp(const T &inVal, const T &inMin, const T &inMax)
+{
+ if (inVal <= inMin)
+ return inMin;
+ else if (inVal >= inMax)
+ return inMax;
+
+ return inVal;
+}
+
+//==============================================================================
+/**
+ * Return the identified lower and higher values.
+ * @param inA one value to compare
+ * @param inB another value to compare
+ * @param outMin is assigned to the lower of the two compared values
+ * @param outMax is assigned to the higher of the two compared values
+ */
+template <class T>
+inline void Q3DStudio_minmax(const T &inA, const T &inB, T &outMin, T &outMax)
+{
+ if (inA < inB) {
+ outMin = inA;
+ outMax = inB;
+ } else {
+ outMin = inB;
+ outMax = inA;
+ }
+}
+
+//==============================================================================
+/**
+ * Identify needed parameters that are not currently referenced.
+ */
+#define Q3DStudio_UNREFERENCED_PARAMETER(P) \
+ { \
+ (void)P; \
+ }
+
+//==============================================================================
+/**
+ * Assert
+ */
+#if defined(_DEBUG) || defined(_PROFILE)
+#define Q3DStudio_ASSERT(inExpression) \
+ { \
+ if (!(inExpression)) \
+ Q3DStudio::CAssert::GetFunction()(#inExpression, __FILE__, __LINE__, __FUNCTION__); \
+ }
+#else
+#define Q3DStudio_ASSERT(inExpression) ((void)0)
+#endif // _DEBUG or _PROFILE
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMatrix.cpp b/src/system/Qt3DSMatrix.cpp
new file mode 100644
index 0000000..b5310d0
--- /dev/null
+++ b/src/system/Qt3DSMatrix.cpp
@@ -0,0 +1,897 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMatrix.h"
+#include "Qt3DSVector3.h"
+#include "Qt3DSEulerAngles.h"
+#include "Qt3DSDataLogger.h"
+#include <math.h>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Constants
+//==============================================================================
+FLOAT g_IdentityInit[4][4] = { { 1.0f, 0.0f, 0.0f, 0.0f },
+ { 0.0f, 1.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 1.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f, 1.0f } };
+
+const RuntimeMatrix RuntimeMatrix::IDENTITY = RuntimeMatrix(g_IdentityInit);
+extern const FLOAT RUNTIME_EPSILON;
+
+//==============================================================================
+/**
+ * Empty constructor.
+ * Initializes this matrix to the identity matrix.
+ */
+RuntimeMatrix::RuntimeMatrix(const BOOL inInitializeIdentity /*= true*/)
+{
+ if (inInitializeIdentity)
+ Q3DStudio_memcpy(&m_Data, &IDENTITY, sizeof(m_Data));
+}
+
+//==============================================================================
+/**
+ * Copy constructor.
+ * @param inMatrix the source matrix to copy
+ */
+RuntimeMatrix::RuntimeMatrix(const RuntimeMatrix &inMatrix)
+{
+ Q3DStudio_memcpy(&m_Data, &inMatrix.m_Data, sizeof(m_Data));
+}
+
+//==============================================================================
+/**
+ * Assignment constructor.
+ * Initializes the matrix from an array.
+ * @param inComponents an array of 16 values
+ */
+RuntimeMatrix::RuntimeMatrix(const FLOAT inComponents[4][4])
+{
+ if (inComponents)
+ Q3DStudio_memcpy(&m_Data, inComponents, sizeof(m_Data));
+}
+
+//==============================================================================
+/**
+ * Sets this matrix to a NULL matrix with all values at zero.
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Zero()
+{
+ Q3DStudio_memset(&m_Data, 0, sizeof(m_Data));
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Sets the matrix to the identity matrix.
+ * @return reference to this matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Identity()
+{
+ Q3DStudio_memcpy(&m_Data, &IDENTITY, sizeof(m_Data));
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Copies the elements from another matrix.
+ * @param inMatrix the source matrix
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Set(const RuntimeMatrix &inMatrix)
+{
+ Q3DStudio_memcpy(&m_Data, &inMatrix.m_Data, sizeof(m_Data));
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Copies the given components to this matrix.
+ * @param inComponents an array of 16 components
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Set(const FLOAT inComponents[4][4])
+{
+ if (inComponents)
+ Q3DStudio_memcpy(&m_Data, inComponents, sizeof(m_Data));
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Heavily optimized assignment method. This has the same result as creating
+ * four full 4x4 matrices and multiplying them together.
+ * @todo Look into optimized code.
+ * @param inTranslation translation coordinates
+ * @param inRotation Euler angle rotations
+ * @param inScale scaling dimensions
+ * @param inPivot pivot offset vector
+ * @param inRotationOrder rotation order
+ * @param inCoordinateSystem the coordindate system
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Set(const RuntimeVector3 &inTranslation, const RuntimeVector3 &inRotation,
+ const RuntimeVector3 &inScale, const RuntimeVector3 &inPivot, const UINT8 inRotationOrder,
+ const UINT8 inCoordinateSystem)
+{
+ // *this = m_ScaleMatrix * m_PivotMatrix * m_RotMatrix * m_TransMatrix; // Distributed
+ //original - plain speak
+
+ RuntimeVector3 theScaledPivot;
+ theScaledPivot.m_X = -inPivot.m_X * inScale.m_X;
+ theScaledPivot.m_Y = -inPivot.m_Y * inScale.m_Y;
+ theScaledPivot.m_Z = -inPivot.m_Z * inScale.m_Z;
+
+ // This would take care of rotation in the right order
+ RuntimeMatrix theRotation;
+ theRotation.SetRotate(inRotation, inRotationOrder, inCoordinateSystem);
+
+ Q3DStudio_memcpy(&m_Data, &IDENTITY, sizeof(m_Data));
+ m_Data[0][0] = inScale.m_X;
+ m_Data[1][1] = inScale.m_Y;
+ m_Data[2][2] = inScale.m_Z;
+
+ m_Data[3][0] = theScaledPivot.m_X;
+ m_Data[3][1] = theScaledPivot.m_Y;
+
+ if (inCoordinateSystem == ORIENTATION_LEFT_HANDED)
+ m_Data[3][2] = theScaledPivot.m_Z;
+ else
+ m_Data[3][2] = -theScaledPivot.m_Z;
+
+ MultiplyAffine(theRotation); // This could be optimized to only 9 multiplications instead of 16
+ // if you do them by hand
+
+ m_Data[3][0] += inTranslation.m_X;
+ m_Data[3][1] += inTranslation.m_Y;
+
+ if (inCoordinateSystem == ORIENTATION_LEFT_HANDED)
+ m_Data[3][2] += inTranslation.m_Z;
+ else
+ m_Data[3][2] += -inTranslation.m_Z;
+
+ if (inCoordinateSystem == ORIENTATION_LEFT_HANDED)
+ return FlipCoordinateSystem();
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Sets the translation portion of the matrix without affecting the rest.
+ *
+ * If you want a pure translation matrix you must make sure to start with
+ * the identity matrix.
+ * @param inTranslate a translation vector
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::SetTranslate(const RuntimeVector3 &inTranslate)
+{
+ m_Data[3][0] = inTranslate.m_X;
+ m_Data[3][1] = inTranslate.m_Y;
+ m_Data[3][2] = inTranslate.m_Z;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Sets the rotation portion of the matrix without affecting the rest.
+ *
+ * FYI: The rotate and scale portions overlap. If you want a pure scale matrix
+ * you must make sure to start with the identity matrix.
+ * @param inRotation a quaternion describing the rotation
+ * @return reference to this modified matrix
+ */
+// CMatrix& CMatrix::SetRotate( const CQuaternion& inRotation )
+//{
+// inRotation.ToMatrix( *this );
+// return *this;
+//}
+
+//==============================================================================
+/**
+ * Sets the rotation portion of the matrix without affecting the rest.
+ *
+ * FYI: The rotate and scale portions overlap. If you want a pure rotation matrix
+ * you must make sure to start with the identity matrix.
+ * @param inRotation Euler angle rotation
+ * @param inRotationOrder rotation order
+ * @param inCoordinateSystem the coordindate system
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::SetRotate(const RuntimeVector3 &inRotation, const UINT8 inRotationOrder,
+ const UINT8 inCoordinateSystem)
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+ Q3DStudio_UNREFERENCED_PARAMETER(inCoordinateSystem);
+
+ EulerAngles theEulerAngles;
+ switch (inRotationOrder) {
+ case ROTATIONORDER_XYZ:
+ theEulerAngles.x = inRotation.m_X;
+ theEulerAngles.y = inRotation.m_Y;
+ theEulerAngles.z = inRotation.m_Z;
+ theEulerAngles.w = EulOrdXYZs;
+ break;
+ case ROTATIONORDER_XYZR:
+ theEulerAngles.x = inRotation.m_X;
+ theEulerAngles.y = inRotation.m_Y;
+ theEulerAngles.z = inRotation.m_Z;
+ theEulerAngles.w = EulOrdXYZr;
+ break;
+ case ROTATIONORDER_YZX:
+ theEulerAngles.x = inRotation.m_Y;
+ theEulerAngles.y = inRotation.m_Z;
+ theEulerAngles.z = inRotation.m_X;
+ theEulerAngles.w = EulOrdYZXs;
+ break;
+ case ROTATIONORDER_YZXR:
+ theEulerAngles.x = inRotation.m_Y;
+ theEulerAngles.y = inRotation.m_Z;
+ theEulerAngles.z = inRotation.m_X;
+ theEulerAngles.w = EulOrdYZXr;
+ break;
+ case ROTATIONORDER_ZXY:
+ theEulerAngles.x = inRotation.m_Z;
+ theEulerAngles.y = inRotation.m_X;
+ theEulerAngles.z = inRotation.m_Y;
+ theEulerAngles.w = EulOrdZXYs;
+ break;
+ case ROTATIONORDER_ZXYR:
+ theEulerAngles.x = inRotation.m_Z;
+ theEulerAngles.y = inRotation.m_X;
+ theEulerAngles.z = inRotation.m_Y;
+ theEulerAngles.w = EulOrdZXYr;
+ break;
+ case ROTATIONORDER_XZY:
+ theEulerAngles.x = inRotation.m_X;
+ theEulerAngles.y = inRotation.m_Z;
+ theEulerAngles.z = inRotation.m_Y;
+ theEulerAngles.w = EulOrdXZYs;
+ break;
+ case ROTATIONORDER_XZYR:
+ theEulerAngles.x = inRotation.m_X;
+ theEulerAngles.y = inRotation.m_Z;
+ theEulerAngles.z = inRotation.m_Y;
+ theEulerAngles.w = EulOrdXZYr;
+ break;
+ case ROTATIONORDER_YXZ:
+ theEulerAngles.x = inRotation.m_Y;
+ theEulerAngles.y = inRotation.m_X;
+ theEulerAngles.z = inRotation.m_Z;
+ theEulerAngles.w = EulOrdYXZs;
+ break;
+ case ROTATIONORDER_YXZR:
+ theEulerAngles.x = inRotation.m_Y;
+ theEulerAngles.y = inRotation.m_X;
+ theEulerAngles.z = inRotation.m_Z;
+ theEulerAngles.w = EulOrdYXZr;
+ break;
+ case ROTATIONORDER_ZYX:
+ theEulerAngles.x = inRotation.m_Z;
+ theEulerAngles.y = inRotation.m_Y;
+ theEulerAngles.z = inRotation.m_X;
+ theEulerAngles.w = EulOrdZYXs;
+ break;
+ case ROTATIONORDER_ZYXR:
+ theEulerAngles.x = inRotation.m_Z;
+ theEulerAngles.y = inRotation.m_Y;
+ theEulerAngles.z = inRotation.m_X;
+ theEulerAngles.w = EulOrdZYXr;
+ break;
+ default: // defaults to Studio's rotation type
+ theEulerAngles.x = inRotation.m_Y;
+ theEulerAngles.y = inRotation.m_X;
+ theEulerAngles.z = inRotation.m_Z;
+ theEulerAngles.w = EulOrdYXZs;
+ break;
+ }
+
+ theEulerAngles.x *= -1;
+ theEulerAngles.y *= -1;
+ theEulerAngles.z *= -1;
+
+ CEulerAngleConverter theConverter;
+ theConverter.Eul_ToHMatrix(theEulerAngles, m_Data);
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Sets the scale portion of the matrix without affecting the rest.
+ *
+ * FYI: The rotate and scale portions overlap. If you want a pure scale matrix
+ * you must make sure to start with the identity matrix.
+ * @param inScale scale vector
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::SetScale(const RuntimeVector3 &inScale)
+{
+ m_Data[0][0] = inScale.m_X;
+ m_Data[1][1] = inScale.m_Y;
+ m_Data[2][2] = inScale.m_Z;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Check this matrix against the identity matrix.
+ * @return true if this matrix is equivalent to the identity matrix
+ */
+BOOL RuntimeMatrix::IsIdentity() const
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ return *this == IDENTITY;
+}
+
+//==============================================================================
+/**
+ * Checks to see if this matrix is affine.
+ * An affine matrix has the last row being [ 0 0 0 1 ]
+ * @return true if the matrix is affine
+ */
+BOOL RuntimeMatrix::IsAffine() const
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ return m_Data[0][3] == 0 && m_Data[1][3] == 0 && m_Data[2][3] == 0 && m_Data[3][3] == 1.0f;
+}
+
+//==============================================================================
+/**
+ * Appends the matrix to include a translation. Equivalent to post-multiplying
+ * this matrix with a transformation matrix derived from the given vector.
+ * @param inTranslation transformation vector applied
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Translate(const RuntimeVector3 &inTranslation)
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ m_Data[3][0] += inTranslation.m_X;
+ m_Data[3][1] += inTranslation.m_Y;
+ m_Data[3][2] += inTranslation.m_Z;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Appends the matrix to include a rotation. Equivalent to post-multiplying
+ * this matrix with a rotation matrix derived from the given quaternion.
+ * @param inRotation the rotation quaternion applied
+ * @return reference to this modified matrix
+ */
+// CMatrix& CMatrix::Rotate( const CQuaternion& inRotation )
+//{
+// CMatrix theRotation;
+// return MultiplyAffine( inRotation.ToMatrix( theRotation ) );
+//}
+
+//==============================================================================
+/**
+ * Appends the matrix to include scaling. Equivalent to post-multiplying
+ * this matrix with a scale matrix derived from the given vector.
+ * @param inScale the scale vector applied
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Scale(const RuntimeVector3 &inScale)
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ m_Data[0][0] *= inScale.m_X;
+ m_Data[0][1] *= inScale.m_X;
+ m_Data[0][2] *= inScale.m_X;
+
+ m_Data[1][0] *= inScale.m_Y;
+ m_Data[1][1] *= inScale.m_Y;
+ m_Data[1][2] *= inScale.m_Y;
+
+ m_Data[2][0] *= inScale.m_Z;
+ m_Data[2][1] *= inScale.m_Z;
+ m_Data[2][2] *= inScale.m_Z;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Flips the matrix elements around the identity diagonal.
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::Transpose()
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ FLOAT theSwap = m_Data[1][0];
+ m_Data[1][0] = m_Data[0][1];
+ m_Data[0][1] = theSwap;
+
+ theSwap = m_Data[2][0];
+ m_Data[2][0] = m_Data[0][2];
+ m_Data[0][2] = theSwap;
+
+ theSwap = m_Data[3][0];
+ m_Data[3][0] = m_Data[0][3];
+ m_Data[0][3] = theSwap;
+
+ theSwap = m_Data[2][1];
+ m_Data[2][1] = m_Data[1][2];
+ m_Data[1][2] = theSwap;
+
+ theSwap = m_Data[3][1];
+ m_Data[3][1] = m_Data[1][3];
+ m_Data[1][3] = theSwap;
+
+ theSwap = m_Data[3][2];
+ m_Data[3][2] = m_Data[2][3];
+ m_Data[2][3] = theSwap;
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Compute the inverse of a 3D affine matrix; i.e. a matrix with a
+ * dimensionality of 4 where the bottom row has the entries (0, 0, 0, 1).
+ *
+ * This procedure treats the 4 by 4 matrix as a block matrix and
+ * calculates the inverse of one submatrix for a significant performance
+ * improvement over a general procedure that can invert any non-singular matrix:
+@code
+ | | -1 | -1 -1 |
+ | A C | | A -C A |
+ -1 | | | |
+ M = | | = | |
+ | 0 1 | | 0 1 |
+ | | | |
+@endcode
+ * where M is a 4 by 4 matrix,
+ * A is the 3 by 3 upper left submatrix of M,
+ * C is the 3 by 1 upper right submatrix of M.
+ *
+ * @return the determinant of matrix
+ */
+FLOAT RuntimeMatrix::Invert()
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ const FLOAT PRECISIONLIMIT = 1.0e-07f;
+ FLOAT thePositiveDet = 0.0f;
+ FLOAT theNegativeDet = 0.0f;
+ FLOAT theTempDet;
+
+ // Calculate the determinant of submatrix A and determine if the
+ // the matrix is singular as limited by the float precision.
+ theTempDet = m_Data[0][0] * m_Data[1][1] * m_Data[2][2];
+ if (theTempDet >= 0.0f)
+ thePositiveDet += theTempDet;
+ else
+ theNegativeDet += theTempDet;
+
+ theTempDet = m_Data[0][1] * m_Data[1][2] * m_Data[2][0];
+ if (theTempDet >= 0.0f)
+ thePositiveDet += theTempDet;
+ else
+ theNegativeDet += theTempDet;
+
+ theTempDet = m_Data[0][2] * m_Data[1][0] * m_Data[2][1];
+ if (theTempDet >= 0.0f)
+ thePositiveDet += theTempDet;
+ else
+ theNegativeDet += theTempDet;
+
+ theTempDet = -m_Data[0][2] * m_Data[1][1] * m_Data[2][0];
+ if (theTempDet >= 0.0f)
+ thePositiveDet += theTempDet;
+ else
+ theNegativeDet += theTempDet;
+
+ theTempDet = -m_Data[0][1] * m_Data[1][0] * m_Data[2][2];
+ if (theTempDet >= 0.0f)
+ thePositiveDet += theTempDet;
+ else
+ theNegativeDet += theTempDet;
+
+ theTempDet = -m_Data[0][0] * m_Data[1][2] * m_Data[2][1];
+ if (theTempDet >= 0.0f)
+ thePositiveDet += theTempDet;
+ else
+ theNegativeDet += theTempDet;
+
+ // Is the submatrix A nonsingular? (i.e. there is an inverse?)
+ FLOAT theDeterminant = thePositiveDet + theNegativeDet;
+ if (theDeterminant != 0
+ || ::fabs(theDeterminant / (thePositiveDet - theNegativeDet)) >= PRECISIONLIMIT) {
+ RuntimeMatrix theInverse;
+ FLOAT theInvDeterminant = 1.0f / theDeterminant;
+
+ // Calculate inverse(A) = adj(A) / det(A)
+ theInverse.m_Data[0][0] =
+ (m_Data[1][1] * m_Data[2][2] - m_Data[1][2] * m_Data[2][1]) * theInvDeterminant;
+ theInverse.m_Data[1][0] =
+ -(m_Data[1][0] * m_Data[2][2] - m_Data[1][2] * m_Data[2][0]) * theInvDeterminant;
+ theInverse.m_Data[2][0] =
+ (m_Data[1][0] * m_Data[2][1] - m_Data[1][1] * m_Data[2][0]) * theInvDeterminant;
+ theInverse.m_Data[0][1] =
+ -(m_Data[0][1] * m_Data[2][2] - m_Data[0][2] * m_Data[2][1]) * theInvDeterminant;
+ theInverse.m_Data[1][1] =
+ (m_Data[0][0] * m_Data[2][2] - m_Data[0][2] * m_Data[2][0]) * theInvDeterminant;
+ theInverse.m_Data[2][1] =
+ -(m_Data[0][0] * m_Data[2][1] - m_Data[0][1] * m_Data[2][0]) * theInvDeterminant;
+ theInverse.m_Data[0][2] =
+ (m_Data[0][1] * m_Data[1][2] - m_Data[0][2] * m_Data[1][1]) * theInvDeterminant;
+ theInverse.m_Data[1][2] =
+ -(m_Data[0][0] * m_Data[1][2] - m_Data[0][2] * m_Data[1][0]) * theInvDeterminant;
+ theInverse.m_Data[2][2] =
+ (m_Data[0][0] * m_Data[1][1] - m_Data[0][1] * m_Data[1][0]) * theInvDeterminant;
+
+ // Calculate -C * inverse(A)
+ theInverse.m_Data[3][0] =
+ -(m_Data[3][0] * theInverse.m_Data[0][0] + m_Data[3][1] * theInverse.m_Data[1][0]
+ + m_Data[3][2] * theInverse.m_Data[2][0]);
+ theInverse.m_Data[3][1] =
+ -(m_Data[3][0] * theInverse.m_Data[0][1] + m_Data[3][1] * theInverse.m_Data[1][1]
+ + m_Data[3][2] * theInverse.m_Data[2][1]);
+ theInverse.m_Data[3][2] =
+ -(m_Data[3][0] * theInverse.m_Data[0][2] + m_Data[3][1] * theInverse.m_Data[1][2]
+ + m_Data[3][2] * theInverse.m_Data[2][2]);
+
+ // assign ourselves to the inverse
+ *this = theInverse;
+ }
+
+ return theDeterminant;
+}
+
+//==============================================================================
+/**
+ * Fast multiplication of two affine 4x4 matrices. No affine pre-check.
+ * @todo MF - Convert to SSE Assembly Code
+ * @param inMatrix the source matrix
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::MultiplyAffine(const RuntimeMatrix &inMatrix)
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ FLOAT theMult[4][4];
+
+ theMult[0][0] = m_Data[0][0] * inMatrix.m_Data[0][0] + m_Data[0][1] * inMatrix.m_Data[1][0]
+ + m_Data[0][2] * inMatrix.m_Data[2][0];
+ theMult[0][1] = m_Data[0][0] * inMatrix.m_Data[0][1] + m_Data[0][1] * inMatrix.m_Data[1][1]
+ + m_Data[0][2] * inMatrix.m_Data[2][1];
+ theMult[0][2] = m_Data[0][0] * inMatrix.m_Data[0][2] + m_Data[0][1] * inMatrix.m_Data[1][2]
+ + m_Data[0][2] * inMatrix.m_Data[2][2];
+ theMult[0][3] = 0;
+
+ theMult[1][0] = m_Data[1][0] * inMatrix.m_Data[0][0] + m_Data[1][1] * inMatrix.m_Data[1][0]
+ + m_Data[1][2] * inMatrix.m_Data[2][0];
+ theMult[1][1] = m_Data[1][0] * inMatrix.m_Data[0][1] + m_Data[1][1] * inMatrix.m_Data[1][1]
+ + m_Data[1][2] * inMatrix.m_Data[2][1];
+ theMult[1][2] = m_Data[1][0] * inMatrix.m_Data[0][2] + m_Data[1][1] * inMatrix.m_Data[1][2]
+ + m_Data[1][2] * inMatrix.m_Data[2][2];
+ theMult[1][3] = 0;
+
+ theMult[2][0] = m_Data[2][0] * inMatrix.m_Data[0][0] + m_Data[2][1] * inMatrix.m_Data[1][0]
+ + m_Data[2][2] * inMatrix.m_Data[2][0];
+ theMult[2][1] = m_Data[2][0] * inMatrix.m_Data[0][1] + m_Data[2][1] * inMatrix.m_Data[1][1]
+ + m_Data[2][2] * inMatrix.m_Data[2][1];
+ theMult[2][2] = m_Data[2][0] * inMatrix.m_Data[0][2] + m_Data[2][1] * inMatrix.m_Data[1][2]
+ + m_Data[2][2] * inMatrix.m_Data[2][2];
+ theMult[2][3] = 0;
+
+ theMult[3][0] = m_Data[3][0] * inMatrix.m_Data[0][0] + m_Data[3][1] * inMatrix.m_Data[1][0]
+ + m_Data[3][2] * inMatrix.m_Data[2][0] + inMatrix.m_Data[3][0];
+ theMult[3][1] = m_Data[3][0] * inMatrix.m_Data[0][1] + m_Data[3][1] * inMatrix.m_Data[1][1]
+ + m_Data[3][2] * inMatrix.m_Data[2][1] + inMatrix.m_Data[3][1];
+ theMult[3][2] = m_Data[3][0] * inMatrix.m_Data[0][2] + m_Data[3][1] * inMatrix.m_Data[1][2]
+ + m_Data[3][2] * inMatrix.m_Data[2][2] + inMatrix.m_Data[3][2];
+ theMult[3][3] = 1.0f;
+
+ return Set(theMult);
+}
+
+//==============================================================================
+/**
+ * Standard matrix multiplication
+ * @todo MF - Convert to SSE Assembly Code
+ * @param inMatrix matrix to multiply with
+ */
+RuntimeMatrix &RuntimeMatrix::Multiply(const RuntimeMatrix &inMatrix)
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ FLOAT theMult[4][4];
+
+ theMult[0][0] = m_Data[0][0] * inMatrix.m_Data[0][0] + m_Data[1][0] * inMatrix.m_Data[0][1]
+ + m_Data[2][0] * inMatrix.m_Data[0][2] + m_Data[3][0] * inMatrix.m_Data[0][3];
+ theMult[0][1] = m_Data[0][1] * inMatrix.m_Data[0][0] + m_Data[1][1] * inMatrix.m_Data[0][1]
+ + m_Data[2][1] * inMatrix.m_Data[0][2] + m_Data[3][1] * inMatrix.m_Data[0][3];
+ theMult[0][2] = m_Data[0][2] * inMatrix.m_Data[0][0] + m_Data[1][2] * inMatrix.m_Data[0][1]
+ + m_Data[2][2] * inMatrix.m_Data[0][2] + m_Data[3][2] * inMatrix.m_Data[0][3];
+ theMult[0][3] = m_Data[0][3] * inMatrix.m_Data[0][0] + m_Data[1][3] * inMatrix.m_Data[0][1]
+ + m_Data[2][3] * inMatrix.m_Data[0][2] + m_Data[3][3] * inMatrix.m_Data[0][3];
+ theMult[1][0] = m_Data[0][0] * inMatrix.m_Data[1][0] + m_Data[1][0] * inMatrix.m_Data[1][1]
+ + m_Data[2][0] * inMatrix.m_Data[1][2] + m_Data[3][0] * inMatrix.m_Data[1][3];
+ theMult[1][1] = m_Data[0][1] * inMatrix.m_Data[1][0] + m_Data[1][1] * inMatrix.m_Data[1][1]
+ + m_Data[2][1] * inMatrix.m_Data[1][2] + m_Data[3][1] * inMatrix.m_Data[1][3];
+ theMult[1][2] = m_Data[0][2] * inMatrix.m_Data[1][0] + m_Data[1][2] * inMatrix.m_Data[1][1]
+ + m_Data[2][2] * inMatrix.m_Data[1][2] + m_Data[3][2] * inMatrix.m_Data[1][3];
+ theMult[1][3] = m_Data[0][3] * inMatrix.m_Data[1][0] + m_Data[1][3] * inMatrix.m_Data[1][1]
+ + m_Data[2][3] * inMatrix.m_Data[1][2] + m_Data[3][3] * inMatrix.m_Data[1][3];
+ theMult[2][0] = m_Data[0][0] * inMatrix.m_Data[2][0] + m_Data[1][0] * inMatrix.m_Data[2][1]
+ + m_Data[2][0] * inMatrix.m_Data[2][2] + m_Data[3][0] * inMatrix.m_Data[2][3];
+ theMult[2][1] = m_Data[0][1] * inMatrix.m_Data[2][0] + m_Data[1][1] * inMatrix.m_Data[2][1]
+ + m_Data[2][1] * inMatrix.m_Data[2][2] + m_Data[3][1] * inMatrix.m_Data[2][3];
+ theMult[2][2] = m_Data[0][2] * inMatrix.m_Data[2][0] + m_Data[1][2] * inMatrix.m_Data[2][1]
+ + m_Data[2][2] * inMatrix.m_Data[2][2] + m_Data[3][2] * inMatrix.m_Data[2][3];
+ theMult[2][3] = m_Data[0][3] * inMatrix.m_Data[2][0] + m_Data[1][3] * inMatrix.m_Data[2][1]
+ + m_Data[2][3] * inMatrix.m_Data[2][2] + m_Data[3][3] * inMatrix.m_Data[2][3];
+
+ theMult[3][0] = m_Data[0][0] * inMatrix.m_Data[3][0] + m_Data[1][0] * inMatrix.m_Data[3][1]
+ + m_Data[2][0] * inMatrix.m_Data[3][2] + m_Data[3][0] * inMatrix.m_Data[3][3];
+ theMult[3][1] = m_Data[0][1] * inMatrix.m_Data[3][0] + m_Data[1][1] * inMatrix.m_Data[3][1]
+ + m_Data[2][1] * inMatrix.m_Data[3][2] + m_Data[3][1] * inMatrix.m_Data[3][3];
+ theMult[3][2] = m_Data[0][2] * inMatrix.m_Data[3][0] + m_Data[1][2] * inMatrix.m_Data[3][1]
+ + m_Data[2][2] * inMatrix.m_Data[3][2] + m_Data[3][2] * inMatrix.m_Data[3][3];
+ theMult[3][3] = m_Data[0][3] * inMatrix.m_Data[3][0] + m_Data[1][3] * inMatrix.m_Data[3][1]
+ + m_Data[2][3] * inMatrix.m_Data[3][2] + m_Data[3][3] * inMatrix.m_Data[3][3];
+
+ return Set(theMult);
+}
+
+//==============================================================================
+/**
+ * Toggle between left-hand and right-hand coordinate system
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::FlipCoordinateSystem()
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ // rotation conversion
+ m_Data[0][2] *= -1;
+ m_Data[1][2] *= -1;
+ m_Data[2][0] *= -1;
+ m_Data[2][1] *= -1;
+
+ // translation conversion
+ m_Data[3][2] *= -1;
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Rotate this matrix to align with the rotation of the specified matrix.
+ *
+ * @param inMatrix the maxtrix we are cloning.
+ * @param inMirrorFlag flag indicating that we should flip the z and face the opposite
+ *direction.
+ * @return This matrix after the rotation.
+ */
+RuntimeMatrix &RuntimeMatrix::CloneRotation(const RuntimeMatrix &inMatrix, BOOL inMirrorFlag /*= false*/)
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ // Create the axes
+ RuntimeVector3 theZ(inMatrix.Get(2, 0), inMatrix.Get(2, 1), inMatrix.Get(2, 2));
+ if (inMirrorFlag)
+ theZ *= -1;
+ RuntimeVector3 theY(inMatrix.Get(1, 0), inMatrix.Get(1, 1), inMatrix.Get(1, 2));
+ RuntimeVector3 theX(theY);
+ theX.CrossProduct(theZ);
+
+ // Normalize
+ theX.Normalize();
+ theY.Normalize();
+ theZ.Normalize();
+
+ // Copy it into the matrix
+ m_Data[0][0] = theX.m_X;
+ m_Data[0][1] = theX.m_Y;
+ m_Data[0][2] = theX.m_Z;
+
+ m_Data[1][0] = theY.m_X;
+ m_Data[1][1] = theY.m_Y;
+ m_Data[1][2] = theY.m_Z;
+
+ m_Data[2][0] = theZ.m_X;
+ m_Data[2][1] = theZ.m_Y;
+ m_Data[2][2] = theZ.m_Z;
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Compute the square distance between the position vectors of two transforms.
+ * @param inMatrix the other transform, signifying a global object position for example
+ * @return the square of the "distance" between the two transforms
+ */
+FLOAT RuntimeMatrix::SquareDistance(const RuntimeMatrix &inMatrix) const
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ FLOAT theResult = 0;
+ FLOAT theFactor;
+
+ theFactor = m_Data[3][0] - inMatrix.m_Data[3][0];
+ theFactor *= theFactor;
+ theResult += theFactor;
+
+ theFactor = m_Data[3][1] - inMatrix.m_Data[3][1];
+ theFactor *= theFactor;
+ theResult += theFactor;
+
+ theFactor = m_Data[3][2] - inMatrix.m_Data[3][2];
+ theFactor *= theFactor;
+ theResult += theFactor;
+
+ return theResult;
+}
+
+//==============================================================================
+/**
+ * Simple assignment operator.
+ * @param inMatrix new matrix being assigned
+ * @return reference to this modified matrix
+ */
+RuntimeMatrix &RuntimeMatrix::operator=(const RuntimeMatrix &inMatrix)
+{
+ Q3DStudio_memcpy(&m_Data, &inMatrix.m_Data, sizeof(m_Data));
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Compares this matrix's elements with another matrix's and returns true
+ * if the matrices are equivalent.
+ * @param inMatrix the matrix we are comparing against
+ * @return true if all elements are within EPSILON of each other.
+ */
+BOOL RuntimeMatrix::operator==(const RuntimeMatrix &inMatrix) const
+{
+ PerfLogMathEvent1(DATALOGGER_MATRIX);
+
+ for (INT32 iRow = 0; iRow < 4; ++iRow) {
+ for (INT32 iCol = 0; iCol < 4; ++iCol) {
+ if (::fabs(m_Data[iRow][iCol] - inMatrix.m_Data[iRow][iCol]) > RUNTIME_EPSILON)
+ return false;
+ }
+ }
+ return true;
+}
+
+//==============================================================================
+/**
+ * Compares this matrix's elements with another matrix's and returns true
+ * if the matrices are not equivalent.
+ * @param inMatrix the matrix we are comparing against
+ * @return true if one or more elements are more than EPSILON from each other
+ */
+BOOL RuntimeMatrix::operator!=(const RuntimeMatrix &inMatrix) const
+{
+ // Reuse same code path..
+ return !(*this == inMatrix);
+}
+
+//==============================================================================
+/**
+ * Standardized conversion to string.
+ * @param outString string becoming a representation for the matrix
+ */
+// void CMatrix::ToString( AK_STRING& outString ) const
+//{
+// INT8 theBuffer[ 256 ];
+//
+// Q3DStudio_sprintf
+// (
+// theBuffer, 255,
+// "%.2f %.2f %.2f %.2f "
+// "%.2f %.2f %.2f %.2f "
+// "%.2f %.2f %.2f %.2f "
+// "%.2f %.2f %.2f %.2f",
+//
+// m_Data.m[ 0 ][ 0 ],
+// m_Data.m[ 0 ][ 1 ],
+// m_Data.m[ 0 ][ 2 ],
+// m_Data.m[ 0 ][ 3 ],
+//
+// m_Data.m[ 1 ][ 0 ],
+// m_Data.m[ 1 ][ 1 ],
+// m_Data.m[ 1 ][ 2 ],
+// m_Data.m[ 1 ][ 3 ],
+//
+// m_Data.m[ 2 ][ 0 ],
+// m_Data.m[ 2 ][ 1 ],
+// m_Data.m[ 2 ][ 2 ],
+// m_Data.m[ 2 ][ 3 ],
+//
+// m_Data.m[ 3 ][ 0 ],
+// m_Data.m[ 3 ][ 1 ],
+// m_Data.m[ 3 ][ 2 ],
+// m_Data.m[ 3 ][ 3 ]
+// );
+//
+// outString = theBuffer;
+//}
+//
+////==============================================================================
+///**
+// * Standardized conversion from string.
+// * @param inString string being a representation for the matrix
+// */
+// void CMatrix::FromString( const AK_STRING& inString )
+//{
+// std::sscanf
+// (
+// inString.c_str( ),
+//
+// "%f %f %f %f "
+// "%f %f %f %f "
+// "%f %f %f %f "
+// "%f %f %f %f",
+//
+// &m_Data.m[ 0 ][ 0 ],
+// &m_Data.m[ 0 ][ 1 ],
+// &m_Data.m[ 0 ][ 2 ],
+// &m_Data.m[ 0 ][ 3 ],
+//
+// &m_Data.m[ 1 ][ 0 ],
+// &m_Data.m[ 1 ][ 1 ],
+// &m_Data.m[ 1 ][ 2 ],
+// &m_Data.m[ 1 ][ 3 ],
+//
+// &m_Data.m[ 2 ][ 0 ],
+// &m_Data.m[ 2 ][ 1 ],
+// &m_Data.m[ 2 ][ 2 ],
+// &m_Data.m[ 2 ][ 3 ],
+//
+// &m_Data.m[ 3 ][ 0 ],
+// &m_Data.m[ 3 ][ 1 ],
+// &m_Data.m[ 3 ][ 2 ],
+// &m_Data.m[ 3 ][ 3 ]
+// );
+//}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMatrix.h b/src/system/Qt3DSMatrix.h
new file mode 100644
index 0000000..4ef7442
--- /dev/null
+++ b/src/system/Qt3DSMatrix.h
@@ -0,0 +1,146 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class RuntimeVector3;
+
+//==============================================================================
+/**
+ * A row major matrix for 3D transformation.
+ *
+ * Matrix[row][column]
+@code
+ | 0 1 2 3 | or | 00 01 02 03 | or | Xx Xy Xz w |
+ | 4 5 6 7 | | 10 11 12 13 | | Yx Yy Yz w |
+ | 8 9 A B | | 20 21 22 23 | | Zx Zy Zz w |
+ | C D E F | | 30 31 32 33 | | Tx Ty Tz w |
+@endcode
+ * Rotations are concatenated in the the following order: YXZ
+ * All rotations are clockwise when viewed down the positive axis
+ * towards the origin.
+ */
+class RuntimeMatrix
+{
+ //==============================================================================
+ // Enumerations
+ //==============================================================================
+public:
+ enum ERotationOrder {
+ ROTATIONORDER_XYZ = 0,
+ ROTATIONORDER_YZX,
+ ROTATIONORDER_ZXY,
+ ROTATIONORDER_XZY,
+ ROTATIONORDER_YXZ,
+ ROTATIONORDER_ZYX,
+
+ ROTATIONORDER_XYZR,
+ ROTATIONORDER_YZXR,
+ ROTATIONORDER_ZXYR,
+ ROTATIONORDER_XZYR,
+ ROTATIONORDER_YXZR,
+ ROTATIONORDER_ZYXR
+ };
+
+ enum EOrientation { ORIENTATION_LEFT_HANDED = 0, ORIENTATION_RIGHT_HANDED };
+
+ //==============================================================================
+ // Constants
+ //==============================================================================
+public:
+ static const RuntimeMatrix IDENTITY; ///< Enabling fast initialization from static identity matrix
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+public:
+ FLOAT m_Data[4][4]; ///< 16 elements in a 4 x 4
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ RuntimeMatrix(const BOOL inInitializeIdentity = true);
+ RuntimeMatrix(const RuntimeMatrix &inMatrix);
+ RuntimeMatrix(const FLOAT inComponents[4][4]);
+
+public: // Initialization
+ RuntimeMatrix &Zero();
+ RuntimeMatrix &Identity();
+
+ RuntimeMatrix &Set(const RuntimeMatrix &inMatrix);
+ RuntimeMatrix &Set(const FLOAT inComponents[4][4]);
+ RuntimeMatrix &Set(const RuntimeVector3 &inTranslation, const RuntimeVector3 &inRotation, const RuntimeVector3 &inScale,
+ const RuntimeVector3 &inPivot, const UINT8 inRotationOrder,
+ const UINT8 inCoordinateSystem);
+
+ RuntimeMatrix &SetTranslate(const RuntimeVector3 &inTranslate);
+ RuntimeMatrix &SetRotate(const RuntimeVector3 &inRotation, const UINT8 inRotationOrder = ROTATIONORDER_XYZ,
+ const UINT8 inCoordinateSystem = ORIENTATION_LEFT_HANDED);
+ RuntimeMatrix &SetScale(const RuntimeVector3 &inScale);
+
+public: // Functions
+ BOOL IsIdentity() const;
+ BOOL IsAffine() const;
+ RuntimeMatrix &Translate(const RuntimeVector3 &inTranslate);
+ RuntimeMatrix &Scale(const RuntimeVector3 &inScale);
+ RuntimeMatrix &Transpose();
+ FLOAT Invert();
+ RuntimeMatrix &MultiplyAffine(const RuntimeMatrix &inMatrix);
+ RuntimeMatrix &Multiply(const RuntimeMatrix &inMatrix);
+ RuntimeMatrix &FlipCoordinateSystem();
+ RuntimeMatrix &CloneRotation(const RuntimeMatrix &inMatrix, BOOL inMirrorFlag = false);
+ FLOAT SquareDistance(const RuntimeMatrix &inMatrix) const;
+
+public: // Operators
+ RuntimeMatrix &operator=(const RuntimeMatrix &inMatrix);
+ BOOL operator==(const RuntimeMatrix &inMatrix) const;
+ BOOL operator!=(const RuntimeMatrix &inMatrix) const;
+
+public: // Script based accessors
+ inline FLOAT Get(const INT32 inRow, const INT32 inColumn) const
+ {
+ return m_Data[inRow][inColumn];
+ }
+ inline void Set(const INT32 inRow, const INT32 inColumn, const FLOAT inValue)
+ {
+ m_Data[inRow][inColumn] = inValue;
+ }
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemory.cpp b/src/system/Qt3DSMemory.cpp
new file mode 100644
index 0000000..17fa5c8
--- /dev/null
+++ b/src/system/Qt3DSMemory.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemory.h"
+
+//==============================================================================
+// OS level memory routines
+//==============================================================================
+Q3DStudio::CMemory::TMalloc Q3DStudio::CMemory::s_Malloc = NULL;
+Q3DStudio::CMemory::TRealloc Q3DStudio::CMemory::s_Realloc = NULL;
+Q3DStudio::CMemory::TFree Q3DStudio::CMemory::s_Free = NULL;
+
+//==============================================================================
+/**
+ * Overrides basic memory allocation/deallocation routines
+ * @param inMalloc memory allocation routine
+ * @param inFree memory deallocation routine
+ * @param inRealloc memory reallocation routine
+ */
+void Q3DStudio::CMemory::SetMemoryFunctions(const TMalloc inMalloc, const TFree inFree,
+ const TRealloc inRealloc)
+{
+ s_Malloc = inMalloc;
+ s_Realloc = inRealloc;
+ s_Free = inFree;
+}
+
+static Q3DStudio::CMemoryManager *s_globalManager = nullptr;
+static Q3DStudio::CMemoryHeap *s_globalHeap = nullptr;
+
+//==============================================================================
+/**
+ * Boot up the pooled memory manager and return it.
+ * @note The manager has to be initialized before use:
+ * GetMemoryManager( ).Initialize( "GlobalManager", g_ChunkSize, g_ChunkCount );
+ * @return Q3DStudio::CMemoryManager reference to the global object
+ */
+Q3DStudio::CMemoryManager &GetMemoryManager()
+{
+ if (!s_globalManager)
+ s_globalManager = new Q3DStudio::CMemoryManager;
+ return *s_globalManager;
+}
+
+//==============================================================================
+/**
+ * Return a reference to the global heap object.
+ * @return Q3DStudio::CMemoryHeap reference to the global object
+ */
+Q3DStudio::CMemoryHeap &GetMemoryHeap()
+{
+ if (!s_globalHeap)
+ s_globalHeap = new Q3DStudio::CMemoryHeap;
+ return *s_globalHeap;
+}
+
+//==============================================================================
+// Q3DStudio_new operator prototypes (5 args)
+//==============================================================================
+void *operator new(size_t inReportedSize, size_t inOfficialSize, const char *inType,
+ const char *inFile, int inLine)
+{
+ Q3DStudio_UNREFERENCED_PARAMETER(inReportedSize);
+ Q3DStudio_ASSERT(inReportedSize == inOfficialSize);
+
+ return Q3DStudio_HANDLER_NEW.Allocate(static_cast<const Q3DStudio::INT32>(inOfficialSize),
+ inType, inFile, inLine);
+}
+
+//==============================================================================
+/**
+ * Override 'operator delete' in order to track memory usage.
+ *
+ * So what's the use of the overloaded delete with special arguments? There is
+ * actually one case in which it will be called--when an exception is thrown
+ * during object construction. As you might recall, there is a contract implicit
+ * in the language that if an exception happens during the construction of an object,
+ * the memory for this object will be automatically deallocated. It so happens
+ * that during object's construction the compiler is still aware of which version
+ * of operator new was called to allocate memory. It is therefore able to generate
+ * a call to the corresponding version of delete, in case an exception is thrown.
+ * After the successful completion of construction, this information is no longer
+ * available and the compiler has no means to guess which version of global delete
+ * is appropriate for a given object.
+ */
+void operator delete(void *inReportedAddress, size_t inOfficialSize, const char *, const char *,
+ int)
+{
+ Q3DStudio_HANDLER_NEW.Free(inReportedAddress,
+ static_cast<const Q3DStudio::INT32>(inOfficialSize));
+}
+
+//==============================================================================
+// Q3DStudio_virtual_new operators (4 args)
+//==============================================================================
+void *operator new(size_t inReportedSize, const char *inType, const char *inFile, int inLine)
+{
+ return Q3DStudio::CMemoryFilter::Allocate(static_cast<Q3DStudio::INT32>(inReportedSize), inType,
+ inFile, inLine, false);
+}
+
+void operator delete(void *inReportedAddress, const char *, const char *, int)
+{
+ Q3DStudio::CMemoryFilter::Free(inReportedAddress);
+}
diff --git a/src/system/Qt3DSMemory.h b/src/system/Qt3DSMemory.h
new file mode 100644
index 0000000..cc04bf7
--- /dev/null
+++ b/src/system/Qt3DSMemory.h
@@ -0,0 +1,183 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#ifndef _INTEGRITYPLATFORM
+#include <memory.h>
+#endif
+#include "Qt3DSMemoryHeap.h"
+#include "Qt3DSMemoryManager.h"
+#include "Qt3DSMemoryFilter.h"
+#include "Qt3DSMemoryStatistics.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Single overridable exit point for all low level memory calls.
+ */
+class CMemory
+{
+ //==============================================================================
+ // Typedefs
+ //==============================================================================
+public:
+ typedef void *(*TMalloc)(size_t inSize);
+ typedef void (*TFree)(void *inPtr);
+ typedef void *(*TRealloc)(void *inPtr, size_t inSize);
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ static TMalloc s_Malloc; ///< function pointer to malloc operation
+ static TFree s_Free; ///< function pointer to free operation
+ static TRealloc s_Realloc; ///< function pointer to realloc operation
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Memory override
+ static void SetMemoryFunctions(const TMalloc inMalloc, const TFree inFree,
+ const TRealloc inRealloc);
+
+public: // Function access
+ static TMalloc Malloc() { return s_Malloc; }
+ static TFree Free() { return s_Free; }
+ static TRealloc Realloc() { return s_Realloc; }
+};
+
+} // namespace Q3DStudio
+
+//==============================================================================
+// Globals
+//==============================================================================
+Q3DStudio::CMemoryManager &GetMemoryManager();
+Q3DStudio::CMemoryHeap &GetMemoryHeap();
+
+//==============================================================================
+// Handlers
+//==============================================================================
+#ifndef Q3DStudio_HANDLER_NEW
+#define Q3DStudio_HANDLER_NEW GetMemoryManager()
+#endif // Q3DStudio_HANDLER_NEW
+
+#ifndef Q3DStudio_HANDLER_ALLOC
+#define Q3DStudio_HANDLER_ALLOC GetMemoryManager()
+#endif // Q3DStudio_HANDLER_ALLOC
+
+#ifndef Q3DStudio_HANDLER_FILTER
+#define Q3DStudio_HANDLER_FILTER GetMemoryManager()
+#endif // Q3DStudio_HANDLER_FILTER
+
+//==============================================================================
+// Q3DStudio new defines
+//==============================================================================
+#undef new
+#undef delete
+
+#ifndef Q3DStudio_new
+#define Q3DStudio_new(type) new (sizeof(type), "class " #type, __FILE__, __LINE__)
+#endif // Q3DStudio_new
+
+#ifndef Q3DStudio_delete
+#define Q3DStudio_delete(ptr, type) \
+ if (ptr) { \
+ reinterpret_cast<type *>(ptr)->~type(); \
+ Q3DStudio_HANDLER_NEW.Free(ptr, sizeof(type)); \
+ }
+#endif // Q3DStudio_delete
+
+#ifndef Q3DStudio_virtual_new
+#define Q3DStudio_virtual_new(type) new ("class " #type, __FILE__, __LINE__)
+#endif // Q3DStudio_virtual_new
+
+#ifndef Q3DStudio_virtual_delete
+#define Q3DStudio_virtual_delete(ptr, type) \
+ if (ptr) { \
+ static_cast<type *>(ptr)->~type(); \
+ Q3DStudio::CMemoryFilter::Free(ptr); \
+ }
+#endif // Q3DStudio_virtual_delete
+
+//==============================================================================
+// Q3DStudio alloc defines
+//==============================================================================
+#ifndef Q3DStudio_allocate
+#define Q3DStudio_allocate(type, count) \
+ reinterpret_cast<type *>(Q3DStudio_HANDLER_ALLOC.Allocate( \
+ static_cast<Q3DStudio::INT32>(sizeof(type) * (count)), #type "[]", __FILE__, __LINE__))
+#endif // Q3DStudio_allocate
+
+#ifndef Q3DStudio_allocate_desc
+#define Q3DStudio_allocate_desc(type, count, desc) \
+ reinterpret_cast<type *>(Q3DStudio_HANDLER_ALLOC.Allocate( \
+ static_cast<Q3DStudio::INT32>(sizeof(type) * (count)), desc, __FILE__, __LINE__))
+#endif // Q3DStudio_allocate_desc
+
+#ifndef Q3DStudio_reallocate
+#define Q3DStudio_reallocate(ptr, type, oldcount, newcount) \
+ reinterpret_cast<type *>(Q3DStudio_HANDLER_ALLOC.Reallocate( \
+ ptr, static_cast<Q3DStudio::INT32>(sizeof(type) * (oldcount)), \
+ static_cast<INT32>(sizeof(type) * (newcount)), #type "[]", __FILE__, __LINE__))
+#endif // Q3DStudio_reallocate
+
+#ifndef Q3DStudio_reallocate_desc
+#define Q3DStudio_reallocate_desc(ptr, type, oldcount, newcount, desc) \
+ reinterpret_cast<type *>(Q3DStudio_HANDLER_ALLOC.Reallocate( \
+ ptr, static_cast<Q3DStudio::INT32>(sizeof(type) * (oldcount)), \
+ static_cast<INT32>(sizeof(type) * (newcount)), desc, __FILE__, __LINE__))
+#endif // Q3DStudio_reallocate_desc
+
+#ifndef Q3DStudio_free
+#define Q3DStudio_free(ptr, type, count) \
+ Q3DStudio_HANDLER_ALLOC.Free(ptr, static_cast<Q3DStudio::INT32>(sizeof(type) * (count)))
+#endif // Q3DStudio_free
+
+//==============================================================================
+// Q3DStudio_new - operator prototypes (5 args)
+//==============================================================================
+void *operator new(size_t inReportedSize, size_t inOfficialSize, const char *inType,
+ const char *inFile, int inLine);
+void operator delete(void *inReportedAddress, size_t inOfficialSize, const char *, const char *,
+ int);
+
+//==============================================================================
+// Q3DStudio_virtual_new and new - operator prototypes (4 args)
+//==============================================================================
+void *operator new(size_t inReportedSize, const char *inType, const char *inFile, int inLine);
+void operator delete(void *inReportedAddress, const char *, const char *, int);
diff --git a/src/system/Qt3DSMemoryFilter.cpp b/src/system/Qt3DSMemoryFilter.cpp
new file mode 100644
index 0000000..f6d6591
--- /dev/null
+++ b/src/system/Qt3DSMemoryFilter.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryFilter.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Allocate a chunk of memory and add a header to track it.
+ * @param inSize size of requested memory block, in bytes
+ * @param inType allocation description
+ * @param inFile file name
+ * @param inFunction method name
+ * @param inLine line number
+ * @param inClear true to clear allocated memory to zero
+ * @return void* a pointer to a memory block large enough to hold inSize bytes
+ */
+void *CMemoryFilter::Allocate(const INT32 inSize, const CHAR *inType, const CHAR *inFile,
+ const INT32 inLine, const BOOL inClear)
+{
+ const INT32 theTotalSize = inSize + Q3DStudio_MEMORY_ALIGNMENT;
+
+ INT32 *theMemory = reinterpret_cast<INT32 *>(
+ Q3DStudio_HANDLER_FILTER.Allocate(theTotalSize, inType, inFile, inLine));
+
+ theMemory[0] = FILTER_DOGTAG;
+ theMemory[1] = theTotalSize;
+
+ if (inClear)
+ Q3DStudio_memset(reinterpret_cast<INT8 *>(theMemory) + Q3DStudio_MEMORY_ALIGNMENT, 0,
+ inSize);
+
+ return reinterpret_cast<INT8 *>(theMemory) + Q3DStudio_MEMORY_ALIGNMENT;
+}
+
+//==============================================================================
+/**
+ * Free a block of memory that was allocated and tagged here.
+ * @param inPointer pointer given in a previous filter allocation
+ */
+void CMemoryFilter::Free(void *inPointer)
+{
+ if (!inPointer)
+ return;
+
+ INT32 *theMemory =
+ reinterpret_cast<INT32 *>(reinterpret_cast<INT8 *>(inPointer) - Q3DStudio_MEMORY_ALIGNMENT);
+
+ // Sanity check: Did we allocate this memory in the first place?
+ // If this throws we may be calling Q3DStudio_virtual_delete on memory that was getten from
+ // Q3DStudio_new
+ Q3DStudio_ASSERT(FILTER_DOGTAG == theMemory[0]);
+ Q3DStudio_HANDLER_FILTER.Free(theMemory, theMemory[1]);
+}
+
+//==============================================================================
+/**
+ * Re-allocate an existing chunk of memory and track it.
+ * @param inPointer pointer given in a previous allocation
+ * @param inNewSize size of requested memory block, in bytes
+ * @param inNewType new allocation description
+ * @param inFile file name
+ * @param inFunction method name
+ * @param inLine line number
+ * @return void* a pointer to a memory block large enough to hold inSize bytes
+ */
+void *CMemoryFilter::Reallocate(void *inPointer, const INT32 inNewSize, const CHAR *inNewType,
+ const CHAR *inFile, const INT32 inLine)
+{
+ INT32 *theNewMemory = NULL;
+ const INT32 theTotalSize = inNewSize + Q3DStudio_MEMORY_ALIGNMENT;
+
+ // Dogtag is not valid if the old pointer is NULL
+ if (inPointer) {
+ INT32 *theOldMemory = reinterpret_cast<INT32 *>(reinterpret_cast<INT8 *>(inPointer)
+ - Q3DStudio_MEMORY_ALIGNMENT);
+ Q3DStudio_ASSERT(FILTER_DOGTAG == theOldMemory[0]);
+ theNewMemory = reinterpret_cast<INT32 *>(Q3DStudio_HANDLER_FILTER.Reallocate(
+ theOldMemory, theOldMemory[1], theTotalSize, inNewType, inFile, inLine));
+ } else {
+ theNewMemory = reinterpret_cast<INT32 *>(
+ Q3DStudio_HANDLER_FILTER.Reallocate(NULL, 0, theTotalSize, inNewType, inFile, inLine));
+ }
+
+ theNewMemory[0] = FILTER_DOGTAG;
+ theNewMemory[1] = theTotalSize;
+ return reinterpret_cast<INT8 *>(theNewMemory) + Q3DStudio_MEMORY_ALIGNMENT;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryFilter.h b/src/system/Qt3DSMemoryFilter.h
new file mode 100644
index 0000000..df9367d
--- /dev/null
+++ b/src/system/Qt3DSMemoryFilter.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Aggregation interface for legacy calls that don't remember allocation size.
+ *
+ * CMemoryManager and its pools require that the size must be sent along with
+ * any call, including the Free call. Normal memory calls do not require this
+ * information and this filter class is used to intercept these calls and
+ * add a header to each call before forwarded to the manager. This thin class
+ * allows old school calls such as malloc and free to still use the advantages
+ * of a pooled memory system without impacting the cleanliness and memory
+ * footprint of the modern system.
+ */
+class CMemoryFilter
+{
+ //==============================================================================
+ // Constants
+ //==============================================================================
+protected:
+ const static INT32 FILTER_DOGTAG = 0x1337f1d0;
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Allocation Deallocation
+ static void *Allocate(const INT32 inSize, const CHAR *inType, const CHAR *inFile,
+ const INT32 inLine, const BOOL inClear);
+ static void Free(void *inPointer);
+ static void *Reallocate(void *inPointer, const INT32 inNewSize, const CHAR *inNewType,
+ const CHAR *inFile, const INT32 inLine);
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryHeap.cpp b/src/system/Qt3DSMemoryHeap.cpp
new file mode 100644
index 0000000..4ab3617
--- /dev/null
+++ b/src/system/Qt3DSMemoryHeap.cpp
@@ -0,0 +1,236 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemory.h"
+#include "Qt3DSMemoryHeap.h"
+#include "Qt3DSMemoryStatistics.h"
+#include "Qt3DSIStream.h"
+#include "foundation/Qt3DSLogging.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Static Initialzation
+//==============================================================================
+CMemoryProbe CMemoryHeap::s_Probe;
+
+#if Q3DStudio_MEMORY_HEAPTRACKING
+CMemoryHeap::TMemoryReport CMemoryHeap::s_MemoryReport;
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+
+//==============================================================================
+/**
+ * Allocate a chunk of memory and potentially track it.
+ * @param inSize size of requested memory block, in bytes
+ * @param inDescription allocation description such as class name or pool name
+ * @param inFile file name
+ * @param inFunction method name
+ * @param inLine line number
+ * @return void* a pointer to a memory block large enough to hold inSize bytes
+ */
+void *CMemoryHeap::Allocate(const INT32 inSize, const CHAR *inDescription, const CHAR *inFile,
+ const INT32 inLine)
+{
+ // Always track stats and trigger snapshot if this is a new record
+ s_Probe.Allocate(inSize);
+
+ // Check if we are exceeding the max memory limit
+ if (Q3DStudio_MEMORY_LIMIT > 0
+ && s_Probe.GetBytes(Q3DStudio::MEMSCOPE_GLOBAL, Q3DStudio::MEMVALUE_CURRENT)
+ > Q3DStudio_MEMORY_LIMIT) {
+ qCCritical (qt3ds::OUT_OF_MEMORY)
+ << "Q3DStudio_MEMORY_UNIT exceeded " << Q3DStudio_MEMORY_LIMIT;
+ Q3DStudio_ASSERT(false);
+ }
+
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ void *theAllocatedPtr = CMemory::Malloc()(static_cast<const size_t>(inSize));
+ if (s_MemoryReport.GetCount() < s_MemoryReport.GetCapacity()) {
+ SReportEntry theEntry = { theAllocatedPtr, inSize, inDescription, inFile, inLine };
+ s_MemoryReport.Push(theEntry);
+ } else {
+ static BOOL s_FullWarning = false;
+ if (!s_FullWarning) {
+ qCWarning (qt3ds::TRACE_INFO) << "HeapTracker full. "
+ << "Please increase Q3DStudio_MEMORY_HEAPTRACKINGSIZE("
+ << Q3DStudio_MEMORY_HEAPTRACKINGSIZE << ") "
+ << "to track all allocation and tune your pools to avoid "
+ << "hitting the heap.";
+ s_FullWarning = true;
+ }
+ }
+ return theAllocatedPtr;
+#else
+ Q3DStudio_UNREFERENCED_PARAMETER(inLine);
+ Q3DStudio_UNREFERENCED_PARAMETER(inFile);
+ Q3DStudio_UNREFERENCED_PARAMETER(inDescription);
+
+ return CMemory::Malloc()(static_cast<const size_t>(inSize));
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+}
+
+//==============================================================================
+/**
+ * Free a block of memory allocated using CMemoryHeap::Allocate
+ * @param inPointer pointer given in a previous allocation
+ * @param inSize size of given memory block, in bytes
+ */
+void CMemoryHeap::Free(void *inPointer, INT32 inSize)
+{
+ // No-Op on NULL
+ if (!inPointer)
+ return;
+
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ RemoveReport(inPointer);
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+
+ s_Probe.Free(inSize);
+ return CMemory::Free()(inPointer);
+}
+
+//==============================================================================
+/**
+ * Re-allocate an existing chunk of memory and potentially track it.
+ * @param inPointer pointer given in a previous allocation
+ * @param inOldSize size of current memory block, in bytes
+ * @param inNewSize size of requested memory block, in bytes
+ * @param inNewDescription allocation description such as class name or pool name
+ * @param inFile file name
+ * @param inFunction method name
+ * @param inLine line number
+ * @return void* a pointer to a memory block large enough to hold inSize bytes
+ */
+void *CMemoryHeap::Reallocate(void *inPointer, const INT32 inOldSize, const INT32 inNewSize,
+ const CHAR *inNewDescription, const CHAR *inFile, const INT32 inLine)
+{
+ // Make sure this isn't a new malloc
+ if (!inPointer)
+ return Allocate(inNewSize, inNewDescription, inFile, inLine);
+
+ // Always track stats and record new high if it's a record
+ s_Probe.Allocate(inNewSize);
+ s_Probe.Free(inOldSize);
+
+ // Check if we are exceeding the max memory limit
+ Q3DStudio_ASSERT(Q3DStudio_MEMORY_LIMIT == 0
+ ? true
+ : s_Probe.GetBytes(Q3DStudio::MEMSCOPE_GLOBAL, Q3DStudio::MEMVALUE_CURRENT)
+ < Q3DStudio_MEMORY_LIMIT);
+
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ RemoveReport(inPointer);
+
+ void *theReallocatedPtr = CMemory::Realloc()(inPointer, static_cast<const size_t>(inNewSize));
+
+ SReportEntry theEntry = { theReallocatedPtr, inNewSize, inNewDescription, inFile, inLine };
+ s_MemoryReport.Push(theEntry);
+
+ return theReallocatedPtr;
+#else
+ return CMemory::Realloc()(inPointer, static_cast<const size_t>(inNewSize));
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+}
+
+//==============================================================================
+/**
+ * Retrieves memory info about a particular allocation
+ * @param inPointer allocated memory
+ * @return SMemoryHeapReportEntry* memory report
+ */
+CMemoryHeap::SReportEntry *CMemoryHeap::FindReport(void *inPointer)
+{
+ Q3DStudio_UNREFERENCED_PARAMETER(inPointer);
+
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ INT32 theEnd = s_MemoryReport.GetCount();
+ for (INT32 theIndex = 0; theIndex < theEnd; ++theIndex)
+ if (s_MemoryReport[theIndex].m_AllocatedPointer == inPointer)
+ return &s_MemoryReport[theIndex];
+
+ Q3DStudio_ASSERT(false);
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+
+ return NULL;
+}
+
+//==============================================================================
+/**
+ * Removes memory info due to a deallocation.
+ * @param inPointer allocated memory
+ */
+void CMemoryHeap::RemoveReport(void *inPointer)
+{
+ Q3DStudio_UNREFERENCED_PARAMETER(inPointer);
+
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ INT32 theEnd = s_MemoryReport.GetCount();
+ for (INT32 theIndex = 0; theIndex < theEnd; ++theIndex) {
+ if (s_MemoryReport[theIndex].m_AllocatedPointer == inPointer) {
+ s_MemoryReport.Remove(theIndex);
+ return;
+ }
+ }
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+}
+
+//==============================================================================
+/**
+ * The memory probe records basic heap activity
+ * @return reference to probe
+ */
+CMemoryProbe &CMemoryHeap::GetProbe()
+{
+ return s_Probe;
+}
+
+//==============================================================================
+/**
+ * The report records all heap activity
+ * @return pointer to report if tracking is on, or NULL
+ */
+CMemoryHeap::TMemoryReport *CMemoryHeap::GetReport()
+{
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ return &s_MemoryReport;
+#else
+ return NULL;
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryHeap.h b/src/system/Qt3DSMemoryHeap.h
new file mode 100644
index 0000000..ba7c130
--- /dev/null
+++ b/src/system/Qt3DSMemoryHeap.h
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryProbe.h"
+#include "Qt3DSFixedArray.h"
+#include "Qt3DSMemorySettings.h"
+
+//==============================================================================
+/**
+ * Low level entry points to the heap.
+ *
+ * Do not call these directly. Use Q3DStudio_new or Q3DStudio_allocate instead since
+ * those use the pools.
+ * @see CMemoryHeap
+ */
+#define Q3DStudio_heap_allocate(size, desc) \
+ Q3DStudio::CMemoryHeap::Allocate(size, desc, __FILE__, __LINE__)
+#define Q3DStudio_heap_reallocate(ptr, oldsize, newsize, newdesc) \
+ Q3DStudio::CMemoryHeap::Reallocate(ptr, oldsize, newsize, newdesc, __FILE__, _LINE__)
+#define Q3DStudio_heap_free(ptr, size) Q3DStudio::CMemoryHeap::Free(ptr, size)
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class IStream;
+
+//==============================================================================
+/**
+ * Last memory interface before calls to memory callbacks or OS malloc.
+ *
+ * First of all, don't call this class directy. Use the macros
+ * Q3DStudio_heap_allocate and Q3DStudio_heap_free instead since they fill out file,
+ * line and function parameters for the tracking system.
+ *
+ * This is the single exit point for all heap memory allocations. Change this
+ * code to redirect memory to your own subsystems or add more tracking code to
+ * measure memory usage. Note however that most memory requests during runtime
+ * will never reach this point since memory pools will handle those requests.
+ * Large memory requests and emergency scenarios will still end up here.
+ *
+ * @note This class contains the only three real memory calls in Runtime.
+ */
+class CMemoryHeap
+{
+ //==============================================================================
+ // Structs
+ //==============================================================================
+public:
+ /// Simple memory log entry
+ struct SReportEntry
+ {
+ const void *m_AllocatedPointer; ///< allocated pointer
+ INT32 m_Size; ///< size in bytes
+ const CHAR *m_Description; ///< simple description
+ const CHAR *m_File; ///< filename
+ INT32 m_Line; ///< line number
+ };
+
+ //==============================================================================
+ // Typedefs
+ //==============================================================================
+public:
+ typedef CFixedArray<SReportEntry, Q3DStudio_MEMORY_HEAPTRACKINGSIZE> TMemoryReport;
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ static CMemoryProbe s_Probe; ///< Light overall allocation statistics
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ static TMemoryReport s_MemoryReport; ///< Storage for memory logs
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Allocation/Deallocation
+ static void *Allocate(const INT32 inSize, const CHAR *inDescription, const CHAR *inFile,
+ const INT32 inLine);
+ static void Free(void *inPointer, INT32 inSize);
+ static void *Reallocate(void *inPointer, const INT32 inOldSize, const INT32 inNewSize,
+ const CHAR *inNewDescription, const CHAR *inFile, const INT32 inLine);
+
+public: // Statistics
+ static CMemoryProbe &GetProbe();
+ static TMemoryReport *GetReport();
+
+protected: // Low level memory overview
+ static SReportEntry *FindReport(void *inPointer);
+ static void RemoveReport(void *inPointer);
+
+public: // Report request
+ static void Report(IStream *inStream = NULL);
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryManager.cpp b/src/system/Qt3DSMemoryManager.cpp
new file mode 100644
index 0000000..a1ace59
--- /dev/null
+++ b/src/system/Qt3DSMemoryManager.cpp
@@ -0,0 +1,453 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemory.h"
+#include "Qt3DSMemoryManager.h"
+#include "Qt3DSMemoryHeap.h"
+#include "Qt3DSMemoryProbe.h"
+#include "Qt3DSMemoryTracker.h"
+#include "Qt3DSMemoryStatistics.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Create a new empty memory pool manager.
+ *
+ * The manager must be initialized before use or it will forward all requests
+ * to the heap.
+ */
+CMemoryManager::CMemoryManager()
+{
+ // Set default allocations functions if they are not already set
+ if (NULL == CMemory::Malloc())
+ CMemory::SetMemoryFunctions(&malloc, &free, &realloc);
+
+ CMemoryStatistics::AddManager(this);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ Q3DStudio_memset(m_Histogram, 0, sizeof(m_Histogram));
+ CMemoryStatistics::Overhead() += sizeof(m_Histogram);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+}
+
+//==============================================================================
+/**
+ * Create a new initialized memory pool manager.
+ *
+ * @param inName short description of manager used in tracker
+ * @param inChunkSize array of values describing the chunk size of each pool
+ * @param inChunkCount array of values describing the number of chunks in each pool
+ */
+CMemoryManager::CMemoryManager(const CHAR *inName,
+ const INT32 inChunkSize[Q3DStudio_MEMORY_POOLCOUNT],
+ const INT32 inChunkCount[Q3DStudio_MEMORY_POOLCOUNT])
+{
+ // Set default allocations functions if they are not already set
+ if (NULL == CMemory::Malloc())
+ CMemory::SetMemoryFunctions(&malloc, &free, &realloc);
+
+ CMemoryStatistics::AddManager(this);
+ Initialize(inName, inChunkSize, inChunkCount);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ Q3DStudio_memset(m_Histogram, 0, sizeof(m_Histogram));
+ CMemoryStatistics::Overhead() -= sizeof(m_Histogram);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+}
+
+//==============================================================================
+/**
+ * Release the memory manager and all owned pools.
+ *
+ * Nobody better point to memory in these pool because the it will be
+ * invalid after this.
+ */
+CMemoryManager::~CMemoryManager()
+{
+ CMemoryStatistics::RemoveManager(this);
+ Release();
+}
+
+//==============================================================================
+/**
+ * Configure the pool manager into separate pools of different chunk sizes.
+ *
+ * The chunk size array has to be increasing values such as:
+ * inChunkSize = { 8, 16, 32, 64, 96, 128, 256, 512, 1024 }
+ * but count doesn't:
+ * inChunkCount = { 500, 200, 1000, 200, 200, 100, 250, 50, 20 }
+ *
+ * The global memory manager settings are initialized in AKMemory.h
+ *
+ * @param inName short description of manager used in tracker
+ * @param inChunkSize array of Q3DStudio_MEMORY_POOLCOUNT values describing the chunk size
+ *of each pool
+ * @param inChunkCount array of Q3DStudio_MEMORY_POOLCOUNT values describing the number of
+ *chunks in each pool
+ */
+void CMemoryManager::Initialize(const CHAR *inName,
+ const INT32 inChunkSize[Q3DStudio_MEMORY_POOLCOUNT],
+ const INT32 inChunkCount[Q3DStudio_MEMORY_POOLCOUNT])
+{
+ // Don't initialize more than once
+ Q3DStudio_ASSERT(m_Pool[0].GetChunkCount() == 0);
+ Q3DStudio_sprintf(m_Name, sizeof(m_Name), "%s", inName);
+
+ for (INT32 thePoolIndex = 0; thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT; ++thePoolIndex) {
+ // Make sure pool are aligned to Q3DStudio_MEMORY_ALIGNMENT or smaller than
+ // Q3DStudio_MEMORY_ALIGNMENT
+ Q3DStudio_ASSERT(inChunkSize[thePoolIndex] < Q3DStudio_MEMORY_ALIGNMENT
+ || (inChunkSize[thePoolIndex] % Q3DStudio_MEMORY_ALIGNMENT) == 0);
+ m_Pool[thePoolIndex].Initialize(inName, inChunkSize[thePoolIndex],
+ inChunkCount[thePoolIndex]);
+ }
+}
+
+//==============================================================================
+/**
+ * Release all the memory allocated in Initialize - essentially "uninitialize".
+ */
+void CMemoryManager::Release()
+{
+ for (INT32 thePoolIndex = 0; thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT; ++thePoolIndex)
+ m_Pool[thePoolIndex].Release();
+}
+
+//==============================================================================
+// ALLOCATION AND DEALLOCATION
+//==============================================================================
+
+//==============================================================================
+/**
+ * Fetch a new chunk of memory from the smallest pool possible
+ * @param inSize size of requested memory block, in bytes
+ * @param inType allocation description such as class name or pool name
+ * @param inFile file name
+ * @param inFunction method name
+ * @param inLine line number
+ * @return void* a pointer to a memory block large enough to hold inSize bytes
+ */
+void *CMemoryManager::Allocate(INT32 inSize, const CHAR *inType, const CHAR *inFile,
+ const INT32 inLine)
+{
+ Q3DStudio_ASSERT(inSize >= 0);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ m_Histogram[Q3DStudio_min<INT32>(inSize, 511)].Add(1);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+
+#if Q3DStudio_MEMORY_LINETRACKING
+ inSize += sizeof(CMemoryTracker::SMemoryInfo); // make room for SMemoryInfo
+#endif // Q3DStudio_MEMORY_LINETRACKING
+
+ // Find the smallest pool that fits
+ void *thePointer = NULL;
+ INT32 thePoolIndex = 0;
+ while (thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT) {
+ // Does this pool fit?
+ if (inSize <= m_Pool[thePoolIndex].GetChunkSize()) {
+ thePointer = m_Pool[thePoolIndex].Allocate();
+ break;
+ }
+ ++thePoolIndex;
+ }
+
+ // // Record the amount of wasted bytes in this chunk
+ if (thePointer) {
+ // Basic tracking
+ m_ManagerData.m_Aligned.Allocate(inSize);
+#if Q3DStudio_MEMORY_POOLTRACKING
+ m_PoolData[thePoolIndex].m_Aligned.Allocate(inSize);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+ }
+ // If not, we go to the heap for now.
+ else {
+ // REFACTOR: Use the next pool size up instead?
+ thePointer = CMemoryHeap::Allocate(inSize, inType, inFile, inLine);
+ m_ManagerData.m_Overflow.Allocate(inSize);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ if (thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT)
+ m_PoolData[thePoolIndex].m_Overflow.Allocate(
+ inSize); // Heap allocation due to full memory pool
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+ }
+
+#if Q3DStudio_MEMORY_LINETRACKING
+ CMemoryTracker::SMemoryInfo *theMemoryInfo =
+ reinterpret_cast<CMemoryTracker::SMemoryInfo *>(thePointer);
+
+ theMemoryInfo->m_DogTag = CMemoryTracker::TRACKER_DOGTAG;
+ theMemoryInfo->m_Line = static_cast<INT16>(inLine);
+ theMemoryInfo->m_Size = static_cast<INT16>(inSize - sizeof(CMemoryTracker::SMemoryInfo));
+ theMemoryInfo->m_File = inFile;
+ theMemoryInfo->m_Type = inType;
+
+ m_LineTracker.Remember(theMemoryInfo);
+ thePointer = reinterpret_cast<CMemoryTracker::SMemoryInfo *>(thePointer) + 1;
+#endif // Q3DStudio_MEMORY_LINETRACKING
+
+ return thePointer;
+}
+
+//==============================================================================
+/**
+ * Release a chunk of memory.
+ * @param inPointer pointer to memory to be reused
+ * @param inSize size of the memory we are releasing, in bytes
+ */
+void CMemoryManager::Free(void *inPointer, INT32 inSize)
+{
+ if (!inPointer)
+ return;
+
+ Q3DStudio_ASSERT(inSize >= 0);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ m_Histogram[Q3DStudio_min<INT32>(inSize, 511)].Delete(1);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+
+#if Q3DStudio_MEMORY_LINETRACKING
+ inPointer = reinterpret_cast<CMemoryTracker::SMemoryInfo *>(inPointer) - 1;
+ m_LineTracker.Forget(reinterpret_cast<CMemoryTracker::SMemoryInfo *>(inPointer));
+ inSize += sizeof(CMemoryTracker::SMemoryInfo);
+#endif // Q3DStudio_MEMORY_LINETRACKING
+
+ // Did we get a valid pool?
+ INT32 thePoolIndex = FetchPoolIndex(inPointer);
+ if (thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT) {
+ m_Pool[thePoolIndex].Free(inPointer);
+ m_ManagerData.m_Aligned.Free(inSize);
+#if Q3DStudio_MEMORY_POOLTRACKING
+ m_PoolData[thePoolIndex].m_Aligned.Free(inSize);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+ } else {
+ CMemoryHeap::Free(inPointer, inSize);
+ m_ManagerData.m_Overflow.Free(inSize);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ if (inSize <= m_Pool[Q3DStudio_MEMORY_POOLCOUNT - 1].GetChunkSize())
+ for (thePoolIndex = 0; thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT; ++thePoolIndex)
+ if (inSize <= m_Pool[thePoolIndex].GetChunkSize()) {
+ m_PoolData[thePoolIndex].m_Overflow.Free(inSize);
+ // This is driving me crazy -CN.
+ // Q3DStudio_ASSERT( m_PoolData[thePoolIndex].m_Overflow.GetCalls(
+ // MEMSCOPE_GLOBAL, MEMVALUE_CURRENT ) >= 0 );
+ break;
+ }
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+ }
+}
+
+//==============================================================================
+/**
+ * Grow the existing memory allocated
+ *
+ * @param inOldPointer pointer given in a previous allocation
+ * @param inOldSize size of current memory block, in bytes
+ * @param inNewSize size of requested memory block, in bytes
+ * @param inNewType allocation description such as class name or pool name
+ * @param inFile file name
+ * @param inFunction method name
+ * @param inLine line number
+ * @return void* a pointer to a memory block large enough to hold inSize bytes
+ */
+void *CMemoryManager::Reallocate(void *inOldPointer, const INT32 inOldSize, const INT32 inNewSize,
+ const CHAR *inNewType, const CHAR *inFile, const INT32 inLine)
+{
+ Q3DStudio_ASSERT(inOldSize >= 0 && inNewSize >= 0);
+
+ // It's legal to pass NULL as old pointer to realloc
+ if (!inOldPointer)
+ return Allocate(inNewSize, inNewType, inFile, inLine);
+
+ if (inNewSize == 0) {
+ Free(inOldPointer, inOldSize);
+ return NULL;
+ }
+
+ // Get a new bigger chunk and transfer old data to it
+ void *thePointer = Allocate(inNewSize, inNewType, inFile, inLine);
+ Q3DStudio_memcpy(thePointer, inOldPointer, Q3DStudio_min(inOldSize, inNewSize));
+
+ // Release old data
+ Free(inOldPointer, inOldSize);
+ return thePointer;
+}
+
+//==============================================================================
+// IMPLEMENTATION
+//==============================================================================
+
+//==============================================================================
+/**
+ * Find the pool that owns the given pointer.
+ * @param inPointer pointer to memory to be found
+ * @return INT32 index of pool or Q3DStudio_MEMORY_POOLCOUNT if the chunk can't be found
+ */
+INT32 CMemoryManager::FetchPoolIndex(const void *inPointer)
+{
+ // Find pool that owns the pointer
+ INT32 thePoolIndex = 0;
+ while (thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT) {
+ if (m_Pool[thePoolIndex].OwnsChunk(inPointer))
+ return thePoolIndex;
+ ++thePoolIndex;
+ }
+
+ return Q3DStudio_MEMORY_POOLCOUNT;
+}
+
+//==============================================================================
+// STATISTICS
+//==============================================================================
+
+//==============================================================================
+/**
+ * Return the text identifier of the manager
+ * @return the name, max 32 bytes long
+ */
+const CHAR *CMemoryManager::GetName()
+{
+ return m_Name;
+}
+
+//==============================================================================
+/**
+ * Reset all probe statistics
+ */
+void CMemoryManager::Reset()
+{
+ m_ManagerData.m_Aligned.Reset();
+ m_ManagerData.m_Overflow.Reset();
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ for (INT32 thePoolIndex = 0; thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT; ++thePoolIndex) {
+ m_Pool[thePoolIndex].GetProbe().Reset();
+ m_PoolData[thePoolIndex].m_Aligned.Reset();
+ m_PoolData[thePoolIndex].m_Overflow.Reset();
+ }
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+}
+
+//==============================================================================
+/**
+ * Retrieve a particular memory pool
+ * @param inPoolIndex index of the pool
+ * @return SPoolData& is a reference to the indicated pool data
+ */
+CMemoryPool &CMemoryManager::GetPool(const INT32 inPoolIndex)
+{
+ Q3DStudio_ASSERT(inPoolIndex < Q3DStudio_MEMORY_POOLCOUNT && inPoolIndex >= 0);
+ return m_Pool[inPoolIndex];
+}
+
+//==============================================================================
+/**
+ * Retrieve a particular memory pool
+ * @param inPoolIndex index of the pool
+ * @return SPoolData& is a reference to the indicated pool data
+ */
+CMemoryManager::SPoolData *CMemoryManager::GetPoolData(const INT32 inPoolIndex)
+{
+ Q3DStudio_UNREFERENCED_PARAMETER(inPoolIndex);
+ Q3DStudio_ASSERT(inPoolIndex < Q3DStudio_MEMORY_POOLCOUNT && inPoolIndex >= 0);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ return m_PoolData + inPoolIndex;
+#else
+ return NULL;
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+}
+
+//==============================================================================
+/**
+ * Retrieve the number of bytes that were allocated on the heap
+ * @return CMemoryProbe as the heap statistics
+ */
+CMemoryManager::SPoolData &CMemoryManager::GetManagerData()
+{
+ return m_ManagerData;
+}
+
+//==============================================================================
+/**
+ * Sum the high level statistics of all the pools.
+ * @return CMemoryProbe as the statistics, calculated on the spot
+ */
+CMemoryProbe CMemoryManager::GetProbe()
+{
+ CMemoryProbe theProbe;
+#if Q3DStudio_MEMORY_POOLTRACKING
+ for (INT32 thePoolIndex = 0; thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT; ++thePoolIndex)
+ theProbe.Combine(m_Pool[thePoolIndex].GetProbe());
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+ return theProbe;
+}
+
+//==============================================================================
+/**
+ * Fetch the tracker if enabled by setting Q3DStudio_MEMORY_LINETRACKING
+ * @return CMemoryTracker pointer or NULL
+ */
+CMemoryTracker *CMemoryManager::GetLineTracker()
+{
+#if Q3DStudio_MEMORY_LINETRACKING
+ return &m_LineTracker;
+#else
+ return NULL;
+#endif // Q3DStudio_MEMORY_LINETRACKING
+}
+
+//==============================================================================
+/**
+ * Fetch the histogram if enabled by setting Q3DStudio_MEMORY_HISTOGRAM.
+ * The histogram counts all requested allocations of the specific size.
+ * @return UINT16 array of 512 values, or NULL
+ */
+const CMemoryProbe::SValue *CMemoryManager::GetHistogram()
+{
+#if Q3DStudio_MEMORY_POOLTRACKING
+ return m_Histogram;
+#else
+ return NULL;
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryManager.h b/src/system/Qt3DSMemoryManager.h
new file mode 100644
index 0000000..fa54fce
--- /dev/null
+++ b/src/system/Qt3DSMemoryManager.h
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryPool.h"
+#include "Qt3DSMemoryProbe.h"
+#include "Qt3DSMemoryTracker.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class CMemoryTracker;
+
+//==============================================================================
+/**
+ * Allocation switch-board forwarding requests to pools.
+ *
+ * This is a memory pool hub acting as a complete heap replacement. The number
+ * of pools is hardcoded in Q3DStudio_MEMORY_POOLCOUNT but can be changed with a
+ * recompile. The main manager is created in AKMemory and is preconfigured to
+ * be generous with memory. Tune these values to match your title since
+ * unused chunks are wasteful.
+ *
+ * @note A pool manager survives fine even when not initialized. In this state
+ * it simply forwards each request to the CMemoryHeap. This setup is intentional
+ * to enable the default manager to survive long enough to allow future runtime
+ * initialization based on complexity of the level or presentation being loaded.
+ */
+class CMemoryManager
+{
+ //==============================================================================
+ // Structs
+ //==============================================================================
+public:
+ /// External pool usage information
+ struct SPoolData
+ {
+ CMemoryProbe
+ m_Aligned; ///< Exact sum of memory use (28byte struct in 32byte pool is still 28 here)
+ CMemoryProbe m_Overflow; ///< Failed memory allocation because the pool was full
+ };
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ CHAR m_Name[32]; ///< Manager identifier for statistics
+ CMemoryPool m_Pool[Q3DStudio_MEMORY_POOLCOUNT]; ///< Actual pool memory objects
+ SPoolData m_ManagerData; ///< Track allocations forwarded to heap because they were too large
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ SPoolData
+ m_PoolData[Q3DStudio_MEMORY_POOLCOUNT]; ///< Trace pools of different sizes with their usage
+ CMemoryProbe::SValue
+ m_Histogram[512]; ///< Allocation histogram if active using Q3DStudio_MEMORY_HEAPTRACKING
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+
+#if Q3DStudio_MEMORY_LINETRACKING
+ CMemoryTracker
+ m_LineTracker; ///< Line allocation tracker if active using Q3DStudio_MEMORY_LINETRACKING
+#endif // Q3DStudio_MEMORY_LINETRACKING
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CMemoryManager();
+ CMemoryManager(const CHAR *inName, const INT32 inChunkSize[Q3DStudio_MEMORY_POOLCOUNT],
+ const INT32 inChunkCount[Q3DStudio_MEMORY_POOLCOUNT]);
+ ~CMemoryManager();
+
+public: // Initialization
+ void Initialize(const CHAR *inName, const INT32 inChunkSize[Q3DStudio_MEMORY_POOLCOUNT],
+ const INT32 inChunkCount[Q3DStudio_MEMORY_POOLCOUNT]);
+ void Release();
+
+public: // Allocation and Deallocation
+ void *Allocate(INT32 inSize, const CHAR *inType, const CHAR *inFile, const INT32 inLine);
+ void Free(void *inOldPointer, INT32 inSize);
+ void *Reallocate(void *inOldPointer, const INT32 inOldSize, const INT32 inNewSize,
+ const CHAR *inNewType, const CHAR *inFile, const INT32 inLine);
+
+protected: // Implementation
+ INT32 FetchPoolIndex(const void *inPointer);
+
+public: // Statistics
+ void Reset();
+ const CHAR *GetName();
+ CMemoryPool &GetPool(const INT32 inPoolIndex);
+ SPoolData *GetPoolData(const INT32 inPoolIndex);
+ SPoolData &GetManagerData();
+ CMemoryProbe GetProbe();
+ CMemoryTracker *GetLineTracker();
+ const CMemoryProbe::SValue *GetHistogram();
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryPool.cpp b/src/system/Qt3DSMemoryPool.cpp
new file mode 100644
index 0000000..44545d4
--- /dev/null
+++ b/src/system/Qt3DSMemoryPool.cpp
@@ -0,0 +1,298 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryPool.h"
+#include "Qt3DSMemoryHeap.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Create a new memory pool.
+ *
+ */
+CMemoryPool::CMemoryPool()
+ : m_ChunkSize(0)
+ , m_ChunkCount(0)
+ , m_Ceiling(NULL)
+ , m_Memory(NULL)
+ , m_Top(NULL)
+ , m_Hole(NULL)
+{
+ m_Description[0] = '\0';
+}
+
+//==============================================================================
+/**
+ * Release the memory pool.
+ *
+ * Nobody better point to this pool because it's illegal after this.
+ * We could blast the memory in debug mode to trigger bugs early but most
+ * compilers already do this.
+ */
+CMemoryPool::~CMemoryPool()
+{
+ Release();
+}
+
+//==============================================================================
+/**
+ * Configure the memory pool.
+ *
+ * The pool will allocate inChunkSize * inChunkCount bytes of memory from
+ * the heap using Q3DStudio_new, aligned on 4 byte boundaries.
+ *
+ * @param inName short description of pool - used in tracker
+ * @param inChunkSize size in bytes of each memory block, aka chunk
+ * @param inChunkCount number of chunks the pool holds
+ */
+void CMemoryPool::Initialize(const CHAR *inName, const INT32 inChunkSize, const INT32 inChunkCount)
+{
+ Q3DStudio_ASSERT(!m_Memory);
+
+ // Round up chunk size to the next even pointer size
+ // It needs to be at least pointer size to store the hole linked list
+ INT32 theRoundedChunkSize =
+ static_cast<INT32>(((inChunkSize + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *));
+
+ // Create pool description
+ Q3DStudio_sprintf(m_Description, sizeof(m_Description), "POOL: %s(%dx%d)", inName,
+ theRoundedChunkSize, inChunkCount);
+
+ // Reserve memory pool
+ m_ChunkSize = theRoundedChunkSize;
+ m_ChunkCount = inChunkCount;
+ m_Memory = reinterpret_cast<INT8 *>(
+ Q3DStudio_heap_allocate(m_ChunkSize * m_ChunkCount, m_Description));
+ m_Top = m_Memory;
+ m_Ceiling = m_Memory + m_ChunkSize * m_ChunkCount;
+}
+
+//==============================================================================
+/**
+ * Release all the memory allocated in Initialize - essentially "uninitialize".
+ */
+void CMemoryPool::Release()
+{
+ Q3DStudio_heap_free(m_Memory, m_ChunkSize * m_ChunkCount);
+
+ m_ChunkSize = 0, m_ChunkCount = 0;
+ m_Ceiling = NULL;
+ m_Memory = NULL;
+ m_Top = NULL;
+ m_Hole = NULL;
+}
+
+//==============================================================================
+// ALLOCATION AND DEALLOCATION
+//==============================================================================
+
+//==============================================================================
+/**
+ * Fetch a new chunk of memory.
+ *
+ * If there is a pool hole we use that, otherwise feed of the head.
+ * Every alloction is tracked in m_Statistics.
+ * @return a pointer to inChunkSize bytes of usable memory
+ */
+void *CMemoryPool::Allocate()
+{
+ if (m_Hole)
+ return PopHole();
+ else
+ return UseTop();
+}
+
+//==============================================================================
+/**
+ * Release a chunk of memory and track changes in statistics
+ * @param inChunk a pointer to memory to be reused
+ */
+void CMemoryPool::Free(void *inChunk)
+{
+ Q3DStudio_ASSERT(OwnsChunk(inChunk));
+ PushHole(inChunk);
+}
+
+//==============================================================================
+/**
+ * Verify that a pointer is owned by a specific pool
+ * @param inChunk a pointer to be checked
+ * @return BOOL true if the chunk is owned by this pool
+ */
+BOOL CMemoryPool::OwnsChunk(const void *inChunk) const
+{
+#ifdef _DEBUG
+ // Scan all holes to prevent double releasing memory
+ if (!(inChunk >= m_Ceiling || inChunk < m_Memory)) {
+ // No freeing anything above the top?
+ Q3DStudio_ASSERT(inChunk < m_Top);
+
+ // Not freeing any holes?
+ void *theHoleChunk = m_Hole;
+ while (theHoleChunk) {
+ Q3DStudio_ASSERT(inChunk != theHoleChunk);
+ theHoleChunk = reinterpret_cast<void *>(*reinterpret_cast<size_t *>(theHoleChunk));
+ }
+ }
+#endif // DEBUG
+
+ return !(inChunk >= m_Ceiling || inChunk < m_Memory);
+}
+
+//==============================================================================
+/**
+ * Quick check to see if there are chunks available
+ * @return BOOL true if the pool has available chunks
+ */
+BOOL CMemoryPool::IsFull() const
+{
+ return m_Hole == NULL && GetFreeTops() == 0;
+}
+
+//==============================================================================
+/**
+ * Get the total number of free chunks in this pool.
+ * @return INT32 is the nunber of free chunks
+ */
+INT32 CMemoryPool::GetFreeChunks() const
+{
+ return GetFreeTops() + GetFreeHoles();
+}
+
+//==============================================================================
+/**
+ * Get the number of holes in this pool.
+ * @return INT32 is the nunber of holes
+ */
+INT32 CMemoryPool::GetFreeHoles() const
+{
+ INT32 theHoleCounter = 0;
+ void *theHoleChunk = m_Hole;
+
+ // Walk the hole list until there are no more holes
+ while (theHoleChunk) {
+ theHoleChunk = reinterpret_cast<void *>(*reinterpret_cast<size_t *>(theHoleChunk));
+ ++theHoleCounter;
+ }
+
+ return theHoleCounter;
+}
+
+//==============================================================================
+/**
+ * Get the number of chunks left at the top.
+ * @return INT32 is the nunber of continous chunks at the top
+ */
+INT32 CMemoryPool::GetFreeTops() const
+{
+ return static_cast<INT32>((m_Ceiling - m_Top)) / m_ChunkSize;
+}
+
+//==============================================================================
+// IMPLEMENTATION
+//==============================================================================
+
+//==============================================================================
+/**
+ * Return a chunch from the top.
+ *
+ * The top is only used if no pool holes are available.
+ * @return a pointer to the chunk at the top
+ */
+void *CMemoryPool::UseTop()
+{
+ // Out of memory?
+ // This is not assert since it may happen during normal runtime.
+ if (m_Top >= m_Ceiling)
+ return NULL;
+
+ void *theChunk = m_Top;
+ m_Top += m_ChunkSize;
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ m_Probe.Allocate(m_ChunkSize);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+ return theChunk;
+}
+
+//==============================================================================
+/**
+ * Add a new hole to the pool list.
+ *
+ * The holes are used in a stack-like fashion so the chunk we push in most
+ * recently is the first one to be returned next New call.
+ * The holes are linked by using the first four bytes to point to the next
+ * chunk. We are hijacking them to create a linked list of free chunks.
+ * @param inChunk is the just deleted chunk
+ */
+void CMemoryPool::PushHole(void *inChunk)
+{
+#if Q3DStudio_MEMORY_POOLTRACKING
+ m_Probe.Free(m_ChunkSize);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+
+ // Set the pushed chunk to be the new top hole after we
+ // link the content of the new chunk to the last top.
+ *reinterpret_cast<size_t *>(inChunk) = reinterpret_cast<size_t>(m_Hole);
+ m_Hole = inChunk;
+}
+
+//==============================================================================
+/**
+ * Get the topmost hole as our chunk.
+ *
+ * Return the latest hole and relink the list of holes to the top.
+ * @return void* is the most recently deleted chunk
+ */
+void *CMemoryPool::PopHole()
+{
+ Q3DStudio_ASSERT(m_Hole);
+
+ // Return the old hole as our new chunk after we
+ // set the hole to the second hole in the list.
+ void *theChunk = m_Hole;
+ m_Hole = reinterpret_cast<void *>(*reinterpret_cast<size_t *>(m_Hole));
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ m_Probe.Allocate(m_ChunkSize);
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+ return theChunk;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryPool.h b/src/system/Qt3DSMemoryPool.h
new file mode 100644
index 0000000..01b2e41
--- /dev/null
+++ b/src/system/Qt3DSMemoryPool.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryProbe.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Managed memory allocation using fixed-size chunks.
+ *
+ * The pool class implements a generic algorithm that favors reusing recently
+ * used memory chunks instead of returning memory continously. Yet, a fresh
+ * pool will always return chunks positioned side by side.
+ *
+ * If a chunk is freed it will be the first to be returned next time a fresh
+ * chunk is new'ed. This makes the cache lines happier. Deleted chunks are
+ * maintained by linking to each other instead of being stored in a separate
+ * memory consuming array.
+ */
+class CMemoryPool
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ INT32 m_ChunkSize; ///< size in bytes of each chunk
+ INT32 m_ChunkCount; ///< number of chunks in pool
+
+ INT8 *m_Ceiling; ///< ceiling memory pointer
+ INT8 *m_Memory; ///< base memory pointer, INT8 for easy pointer arithemtic
+ INT8 *m_Top; ///< edge of free continous memory
+ void *m_Hole; ///< first dis-continous memory chunk if any
+
+ CMemoryProbe m_Probe; ///< call and byte data on pool usage
+ CHAR m_Description[32]; ///< short description of this pool
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CMemoryPool();
+ ~CMemoryPool();
+
+public: // Initialization
+ void Initialize(const CHAR *inName, const INT32 inChunkSize, const INT32 inChunkCount);
+ void Release();
+
+public: // Allocation and Deallocation
+ void *Allocate();
+ void Free(void *inChunk);
+ BOOL IsFull() const;
+ BOOL OwnsChunk(const void *inChunk) const;
+
+protected: // Implementation
+ void *UseTop();
+ void PushHole(void *inChunk);
+ void *PopHole();
+
+public: // Statistics and reports
+ INT32 GetFreeHoles() const;
+ INT32 GetFreeTops() const;
+ INT32 GetFreeChunks() const;
+ INT32 GetChunkSize() const { return m_ChunkSize; }
+ INT32 GetChunkCount() const { return m_ChunkCount; }
+ CMemoryProbe &GetProbe() { return m_Probe; }
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryProbe.cpp b/src/system/Qt3DSMemoryProbe.cpp
new file mode 100644
index 0000000..4e977ee
--- /dev/null
+++ b/src/system/Qt3DSMemoryProbe.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryProbe.h"
+#include "Qt3DSMemoryStatistics.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor - records its size with the statistics class
+ */
+CMemoryProbe::CMemoryProbe()
+{
+ CMemoryStatistics::Overhead() += sizeof(CMemoryProbe);
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CMemoryProbe::~CMemoryProbe()
+{
+ CMemoryStatistics::Overhead() -= sizeof(CMemoryProbe);
+}
+
+//==============================================================================
+/**
+ * Track the number related to incrementing memory.
+ * @param inByteAmount amount of bytes being allocated
+ */
+void CMemoryProbe::Allocate(const INT32 inByteAmount)
+{
+ if (inByteAmount > 0) {
+ m_Calls[MEMSCOPE_RESET].Add(1);
+ m_Bytes[MEMSCOPE_RESET].Add(inByteAmount);
+
+ m_Calls[MEMSCOPE_GLOBAL].Add(1);
+ m_Bytes[MEMSCOPE_GLOBAL].Add(inByteAmount);
+ }
+}
+
+//==============================================================================
+/**
+ * Track the number related to incrementing memory.
+ * @param inByteAmount amount of bytes being deallocted
+ */
+void CMemoryProbe::Free(const INT32 inByteAmount)
+{
+ Q3DStudio_ASSERT(inByteAmount >= 0);
+ if (inByteAmount > 0) {
+ m_Calls[MEMSCOPE_RESET].Delete(1);
+ m_Bytes[MEMSCOPE_RESET].Delete(inByteAmount);
+
+ m_Calls[MEMSCOPE_GLOBAL].Delete(1);
+ m_Bytes[MEMSCOPE_GLOBAL].Delete(inByteAmount);
+ }
+}
+
+//==============================================================================
+/**
+ * Reset all local statistics. Global values are not reset.
+ */
+void CMemoryProbe::Reset()
+{
+ m_Calls[MEMSCOPE_RESET].Reset();
+ m_Bytes[MEMSCOPE_RESET].Reset();
+}
+
+//==============================================================================
+/**
+ * Helper method for adding statistics used by manager to add pool usage.
+ * @param inProbe is the stats being added
+ */
+void CMemoryProbe::Combine(const CMemoryProbe &inProbe)
+{
+ m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_ADDS] +=
+ inProbe.m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_ADDS];
+ m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_DELETES] +=
+ inProbe.m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_DELETES];
+ m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_PEAK] +=
+ inProbe.m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_PEAK];
+ m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_CURRENT] +=
+ inProbe.m_Calls[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_CURRENT];
+
+ m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_ADDS] +=
+ inProbe.m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_ADDS];
+ m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_DELETES] +=
+ inProbe.m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_DELETES];
+ m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_PEAK] +=
+ inProbe.m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_PEAK];
+ m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_CURRENT] +=
+ inProbe.m_Bytes[MEMSCOPE_GLOBAL].m_Value[MEMVALUE_CURRENT];
+
+ m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_ADDS] +=
+ inProbe.m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_ADDS];
+ m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_DELETES] +=
+ inProbe.m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_DELETES];
+ m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_PEAK] +=
+ inProbe.m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_PEAK];
+ m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_CURRENT] +=
+ inProbe.m_Calls[MEMSCOPE_RESET].m_Value[MEMVALUE_CURRENT];
+
+ m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_ADDS] +=
+ inProbe.m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_ADDS];
+ m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_DELETES] +=
+ inProbe.m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_DELETES];
+ m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_PEAK] +=
+ inProbe.m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_PEAK];
+ m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_CURRENT] +=
+ inProbe.m_Bytes[MEMSCOPE_RESET].m_Value[MEMVALUE_CURRENT];
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryProbe.h b/src/system/Qt3DSMemoryProbe.h
new file mode 100644
index 0000000..5f0844e
--- /dev/null
+++ b/src/system/Qt3DSMemoryProbe.h
@@ -0,0 +1,144 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+#include "Qt3DSMacros.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Memory Tracking Enums
+//==============================================================================
+
+/// Track a value - remembering peak and add/del count
+enum EMemoryValue {
+ MEMVALUE_ADDS = 0, ///< For example: allocation call count or bytes allocated
+ MEMVALUE_DELETES, ///< For example: free call count or bytes deallocated
+ MEMVALUE_PEAK, ///< Peak of the current value since the last reset
+ MEMVALUE_CURRENT, ///< Current count
+ MEMVALUECOUNT
+};
+
+/// Differentiate between full session (global) or since last reset (local)
+enum EMemoryScope {
+ MEMSCOPE_RESET = 0, ///< Since last reset
+ MEMSCOPE_GLOBAL, ///< Since process start
+ MEMSCOPECOUNT
+};
+
+//==============================================================================
+/**
+ * Memory allocation counter tracking bytes or calls.
+ *
+ * A probe instance can be placed to track either number of allocations
+ * or the bytes of each allocation. CMemoryManager and CMemoryHeap both
+ * record statistics using this class. 64 bytes.
+ */
+class CMemoryProbe
+{
+ //==============================================================================
+ // Structs
+ //==============================================================================
+public:
+ //==============================================================================
+ /**
+ * Intelligent number that tracks current, peak, incr. and decr.
+ *
+ * This value remembers how the amount added, the amount deleted, the highest
+ * value, while keeping a current value. These are used by CMemoryProbe when
+ * tracking memory allocations.
+ */
+ struct SValue
+ {
+ // Fields
+ INT32 m_Value[MEMVALUECOUNT]; ///< Four aspects (add,del,current,peak) we are tracking
+
+ // Methods
+ SValue() { Reset(); }
+ void Reset()
+ {
+ m_Value[MEMVALUE_ADDS] = 0;
+ m_Value[MEMVALUE_DELETES] = 0;
+ m_Value[MEMVALUE_PEAK] = 0;
+ m_Value[MEMVALUE_CURRENT] = 0;
+ }
+
+ void Delete(INT32 inAmount)
+ {
+ Q3DStudio_ASSERT(inAmount >= 0);
+ m_Value[MEMVALUE_DELETES] += inAmount;
+ m_Value[MEMVALUE_CURRENT] -= inAmount;
+ }
+
+ void Add(INT32 inAmount)
+ {
+ Q3DStudio_ASSERT(inAmount >= 0);
+ m_Value[MEMVALUE_ADDS] += inAmount;
+ m_Value[MEMVALUE_CURRENT] += inAmount;
+ m_Value[MEMVALUE_PEAK] =
+ Q3DStudio_max(m_Value[MEMVALUE_PEAK], m_Value[MEMVALUE_CURRENT]);
+ }
+ };
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ SValue m_Calls[MEMSCOPECOUNT]; ///< Memory call count
+ SValue m_Bytes[MEMSCOPECOUNT]; ///< Memory allocation amount
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Constructor
+ CMemoryProbe();
+ ~CMemoryProbe();
+
+public: // Operations
+ void Reset();
+ void Allocate(const INT32 inByteAmount);
+ void Free(const INT32 inByteAmount);
+ void Combine(const CMemoryProbe &inProbe);
+
+public: // Accessors
+ INT32 GetCalls(const EMemoryScope inScope, const EMemoryValue inValue) const
+ {
+ return m_Calls[inScope].m_Value[inValue];
+ }
+ INT32 GetBytes(const EMemoryScope inScope, const EMemoryValue inValue) const
+ {
+ return m_Bytes[inScope].m_Value[inValue];
+ }
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemorySettings.h b/src/system/Qt3DSMemorySettings.h
new file mode 100644
index 0000000..5400242
--- /dev/null
+++ b/src/system/Qt3DSMemorySettings.h
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTypes.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * GlobalMemoryManager constants
+ * NOTE THAT THESE NUMBERS BELOW SHOULD BE ADJUSTED TO FIT YOUR APPLICATION.
+ *
+ * See the Memory Management section in the documentation for guidelines
+ * on memory diagnostics that enable you to optimize these values:
+ */
+
+//==============================================================================
+// Memory Pool Configuration
+//==============================================================================
+
+#ifndef Q3DStudio_MEMORY_POOLCOUNT
+#define Q3DStudio_MEMORY_POOLCOUNT 12
+#endif // Q3DStudio_MEMORY_POOLCOUNT
+
+/// A memory pool has a chunk size that defines he size in bytes of each slot
+/// and a chunk count defining how many slots there are of that size.
+/// The pools below thus has 128 slots of 4 bytes, 256 slots of 8 bytes etc:
+const INT32 g_ChunkSize[Q3DStudio_MEMORY_POOLCOUNT] = { 4, 8, 16, 32, 48, 64,
+ 96, 128, 160, 256, 384, 640 };
+const INT32 g_ChunkCount[Q3DStudio_MEMORY_POOLCOUNT] = { 128, 256, 256, 1536, 128, 128,
+ 256, 64, 32, 32, 32, 32 };
+
+//==============================================================================
+// Memory Settings
+//==============================================================================
+
+/// Define the upper memory limit used by Runtime.
+/// 0 = unlimited
+#ifndef Q3DStudio_MEMORY_LIMIT
+#define Q3DStudio_MEMORY_LIMIT 0
+#endif // Q3DStudio_MEMORY_LIMIT
+
+// Pool sizes and diagnostics are aligned to the required boundary.
+#ifndef Q3DStudio_MEMORY_ALIGNMENT
+#define Q3DStudio_MEMORY_ALIGNMENT 8
+#endif // Q3DStudio_MEMORY_ALIGNMENT
+
+//==============================================================================
+// Memory Diagnostics
+//==============================================================================
+
+/// Note that the simple report is always on. (F1 in Quarterback)
+
+/// CMemoryHeap usage report. (F2 in Quarterback)
+/// Tracks large allocations such as pool buffers, managers and overflows.
+/// Not much overhead since most allocations should be intercepted by pools.
+#ifndef Q3DStudio_MEMORY_HEAPTRACKING
+#define Q3DStudio_MEMORY_HEAPTRACKING 0
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+
+/// Max number of 20 byte SReportEntry heap entries
+/// Increase this number if you get a log warning but you should really tune
+/// your memory pools to avoid hitting the heap.
+#ifndef Q3DStudio_MEMORY_HEAPTRACKINGSIZE
+#define Q3DStudio_MEMORY_HEAPTRACKINGSIZE 4000
+#endif // Q3DStudio_MEMORY_HEAPTRACKINGSIZE
+
+/// Invasive allocation tracker. (F3 in Quarterback)
+/// Track detailed memory usage per allocation through CMemoryManager by tracking
+/// every Runtime allocation, line by line using __FILE__ and __LINE__.
+/// Note that this adds a 16byte SMemoryInfo to each allocation and thus
+/// changes pool usage.
+/// === Do not tune pools with line tracking enabled! ===
+#ifndef Q3DStudio_MEMORY_LINETRACKING
+#define Q3DStudio_MEMORY_LINETRACKING 0
+#endif // Q3DStudio_MEMORY_LINETRACKING
+
+// Hashbin size of entries pointing to SMemoryInfo allocation headers
+#ifndef Q3DStudio_MEMORY_LINETRACKINGSIZE
+#define Q3DStudio_MEMORY_LINETRACKINGSIZE (128 * 1024)
+#endif // Q3DStudio_MEMORY_LINETRACKINGSIZE
+
+/// CMemoryManager pooled memory usage report. (F5-F8 in Quarterback)
+/// Track most used allocation sizes to tune pool sizes and count.
+/// Enabled by default since it allows tracking precise presentation
+/// memory usage without much of an overhead.
+/// It also includes a histogram when showing Reset data (F5,F6)
+#ifndef Q3DStudio_MEMORY_POOLTRACKING
+#ifdef _DEBUG
+#define Q3DStudio_MEMORY_POOLTRACKING 1
+#else
+#define Q3DStudio_MEMORY_POOLTRACKING 0
+#endif
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryStatistics.cpp b/src/system/Qt3DSMemoryStatistics.cpp
new file mode 100644
index 0000000..2f5eba0
--- /dev/null
+++ b/src/system/Qt3DSMemoryStatistics.cpp
@@ -0,0 +1,647 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSIStream.h"
+#include "Qt3DSMemoryStatistics.h"
+#include "Qt3DSMemoryTracker.h"
+#include "Qt3DSMemoryHeap.h"
+#include "foundation/Qt3DSLogging.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Static Fields
+//==============================================================================
+INT32 CMemoryStatistics::s_Overhead = 0;
+CMemoryManager *CMemoryStatistics::s_PoolManagers[MANAGERCOUNT] = { NULL };
+
+//==============================================================================
+// REGISTRATION
+//==============================================================================
+
+//==============================================================================
+/**
+ * Add the manager from the static list done automatically on manager construction.
+ * @param inManager the manager we are beginning to track
+ */
+void CMemoryStatistics::AddManager(CMemoryManager *inManager)
+{
+ INT32 theIndex = 0;
+ while (s_PoolManagers[theIndex] && theIndex < MANAGERCOUNT - 1)
+ ++theIndex;
+
+ if (!s_PoolManagers[theIndex]) {
+ s_PoolManagers[theIndex] = inManager;
+ } else {
+ qCWarning(qt3ds::TRACE_INFO)
+ << "Could not add memory manager tracker. Limit: " << MANAGERCOUNT;
+ }
+}
+
+//==============================================================================
+/**
+ * Remove the manager from the static list done automatically on manager deletion.
+ * @param inManager the manager we are ceasing to track
+ */
+void CMemoryStatistics::RemoveManager(CMemoryManager *inManager)
+{
+ INT32 theIndex = 0;
+ while (inManager != s_PoolManagers[theIndex] && theIndex < MANAGERCOUNT - 1)
+ ++theIndex;
+
+ if (inManager == s_PoolManagers[theIndex])
+ s_PoolManagers[theIndex] = NULL;
+}
+
+//==============================================================================
+/**
+ * Read/write access to the static tracking field that keeps tab on how
+ * much memory we are spending _tracking_ memory.
+ * @return reference to the field tracking the overhead in bytes
+ */
+INT32 &CMemoryStatistics::Overhead()
+{
+ return s_Overhead;
+}
+
+//==============================================================================
+// OPERATION
+//==============================================================================
+
+//==============================================================================
+/**
+ * Reset all memory probes
+ */
+void CMemoryStatistics::Reset()
+{
+ qCInfo(qt3ds::TRACE_INFO) << "Resetting Memory Statistics";
+ CMemoryHeap::GetProbe().Reset();
+
+ for (INT32 theIndex = 0; theIndex < MANAGERCOUNT; ++theIndex)
+ if (s_PoolManagers[theIndex])
+ s_PoolManagers[theIndex]->Reset();
+}
+
+//==============================================================================
+// ACCESS
+//==============================================================================
+
+//==============================================================================
+/**
+ * Quick access to memory usage of the first memory manager.
+ * @param inPeak is true if you want the peak, false if you want the current state
+ * @return the current explict usage in bytes
+ */
+INT32 CMemoryStatistics::GetRequestedBytes(BOOL inPeak /*=false*/)
+{
+ Q3DStudio_ASSERT(s_PoolManagers[0]);
+
+ EMemoryValue theValue = inPeak ? MEMVALUE_PEAK : MEMVALUE_CURRENT;
+ CMemoryManager::SPoolData &theUsageData = s_PoolManagers[0]->GetManagerData();
+
+ return theUsageData.m_Aligned.GetBytes(MEMSCOPE_RESET, theValue)
+ + theUsageData.m_Overflow.GetBytes(MEMSCOPE_RESET, theValue);
+}
+
+//==============================================================================
+/**
+ * Quick access to heap usage.
+ * @param inPeak is true if you want the peak, false if you want the current state
+ * @return the current heap usage in bytes
+ */
+INT32 CMemoryStatistics::GetHeapBytes(BOOL inPeak /*=false*/)
+{
+ return Q3DStudio::CMemoryHeap::GetProbe().GetBytes(MEMSCOPE_RESET,
+ inPeak ? MEMVALUE_PEAK : MEMVALUE_CURRENT);
+}
+
+//==============================================================================
+/**
+ * Fill out a SFactSheet with memory statistics.
+ * @param outFacts is filled out with factoids showing the system state
+ * @param inPeak is true if you want the peak, false if you want the current state
+ * @param inGlobal is true if you want values since process start, false since last reset
+ */
+void CMemoryStatistics::GetFacts(SFactSheet &outFacts, BOOL inPeak /*= true*/,
+ BOOL inGlobal /*= true*/)
+{
+ INT32 thePresentationBytes = 0;
+ Q3DStudio_UNREFERENCED_PARAMETER(thePresentationBytes);
+ Q3DStudio_memset(&outFacts, 0, sizeof(SFactSheet));
+
+ // Translate flags to enumerations
+ EMemoryScope theScope = inGlobal ? MEMSCOPE_GLOBAL : MEMSCOPE_RESET;
+ EMemoryValue theValue = inPeak ? MEMVALUE_PEAK : MEMVALUE_CURRENT;
+
+ // Capture heap state
+ outFacts.m_HeapState.m_Bytes = CMemoryHeap::GetProbe().GetBytes(theScope, theValue);
+ outFacts.m_HeapState.m_Calls = CMemoryHeap::GetProbe().GetCalls(theScope, theValue);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ INT32 theTotalChunks = 0;
+ INT32 theTotalBytes = 0;
+
+ // Scan all registered pool managers
+ Q3DStudio_sprintf(outFacts.m_ManagerState.m_Name, 32, "All Managers");
+ for (INT32 theManagerIndex = 0; theManagerIndex < MANAGERCOUNT; ++theManagerIndex) {
+ CMemoryManager *theManager = s_PoolManagers[theManagerIndex];
+ SFactoid &theManagerFact = outFacts.m_Manager[theManagerIndex];
+ INT32 theManagerChunks = 0;
+ INT32 theManagerBytes = 0;
+
+ // Ignore empty managers
+ if (!theManager)
+ break;
+
+ // Scan each pool in the manager
+ Q3DStudio_sprintf(theManagerFact.m_Name, 32, " %s", theManager->GetName());
+ for (INT32 thePoolIndex = 0; thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT; ++thePoolIndex) {
+ CMemoryPool &thePool = theManager->GetPool(thePoolIndex);
+ CMemoryManager::SPoolData *thePoolData = theManager->GetPoolData(thePoolIndex);
+ Q3DStudio_ASSERT(thePoolData);
+
+ SFactoid &thePoolFact = outFacts.m_Pool[theManagerIndex][thePoolIndex];
+ INT32 theUsed = thePool.GetProbe().GetCalls(theScope, theValue);
+ INT32 theAlign = thePoolData->m_Aligned.GetBytes(theScope, theValue);
+
+ // Ignore empty pools
+ if (thePool.GetChunkCount() == 0)
+ break;
+
+ // Extract all the factoids
+ Q3DStudio_sprintf(thePoolFact.m_Name, 32, " %d: %4db x %4d", thePoolIndex,
+ thePool.GetChunkSize(), thePool.GetChunkCount());
+ thePoolFact.m_Bytes = thePool.GetChunkSize() * thePool.GetChunkCount();
+ thePoolFact.m_Calls = thePool.GetProbe().GetCalls(theScope, theValue);
+ thePoolFact.m_Used = 100 * theUsed / thePool.GetChunkCount();
+
+ thePoolFact.m_Align = 100;
+ if (theUsed > 0)
+ thePoolFact.m_Align = 100 * theAlign / (theUsed * thePool.GetChunkSize());
+ thePoolFact.m_Miss = thePoolData->m_Overflow.GetCalls(theScope, theValue);
+
+ thePresentationBytes += theAlign + thePoolData->m_Overflow.GetBytes(theScope, theValue);
+
+ theManagerFact.m_Bytes += thePoolFact.m_Bytes;
+ theManagerFact.m_Calls += thePoolFact.m_Calls;
+ theManagerFact.m_Used += theUsed;
+ theManagerFact.m_Align += theAlign;
+ theManagerFact.m_Miss += thePoolFact.m_Miss;
+
+ outFacts.m_ManagerState.m_Bytes += thePoolFact.m_Bytes;
+ outFacts.m_ManagerState.m_Calls += thePoolFact.m_Calls;
+ outFacts.m_ManagerState.m_Used += theUsed;
+ outFacts.m_ManagerState.m_Align += theAlign;
+ outFacts.m_ManagerState.m_Miss += thePoolFact.m_Miss;
+
+ theManagerChunks += thePool.GetChunkCount();
+ theManagerBytes += theUsed * thePool.GetChunkSize();
+ }
+
+ thePresentationBytes +=
+ theManager->GetManagerData().m_Overflow.GetBytes(theScope, theValue);
+
+ // Both the manager sub-total and grand-total need to track bytes separately
+ // since the percentages can't just be added or averaged. Those totals
+ // are instead weighted and this is the tracking math that does it.
+ theTotalChunks += theManagerChunks;
+ theTotalBytes += theManagerBytes;
+
+ theManagerFact.m_Used = 0;
+ if (theManagerChunks > 0)
+ theManagerFact.m_Used = 100 * theManagerFact.m_Used / theManagerChunks;
+
+ theManagerFact.m_Align = 100;
+ if (theManagerBytes > 0)
+ theManagerFact.m_Align = 100 * theManagerFact.m_Align / theManagerBytes;
+
+ CullHistogram(theManager->GetHistogram(), theValue, outFacts.m_Histogram[theManagerIndex]);
+ }
+
+ // Again this is the grand-total separate percentage computation that has
+ // to be done in the end when all sums have been added.
+ outFacts.m_ManagerState.m_Used = 0;
+ if (theTotalChunks > 0)
+ outFacts.m_ManagerState.m_Used = 100 * outFacts.m_ManagerState.m_Used / theTotalChunks;
+
+ outFacts.m_ManagerState.m_Align = 100;
+ if (theTotalBytes > 0)
+ outFacts.m_ManagerState.m_Align = 100 * outFacts.m_ManagerState.m_Align / theTotalBytes;
+
+#endif // Q3DStudio_MEMORY_POOLTRACKING
+
+ // return thePresentationBytes;
+}
+
+//==============================================================================
+/**
+ * Find the HISTOGRAMLIMIT highest performers in the histogram.
+ * @param inHistogram array of CMemoryManager::HISTOGRAMCOUNT values
+ * each showing the number of allocation of that bytesize
+ * @param outResults collects the highest points of the histogram
+ */
+void CMemoryStatistics::CullHistogram(const CMemoryProbe::SValue *inHistogram,
+ const EMemoryValue inValue,
+ SHistogramScore outResults[HISTOGRAMCOUNT])
+{
+ // Always clear even if there is no data
+ Q3DStudio_memset(outResults, 0, sizeof(SHistogramScore));
+
+ // Return quickly when no data
+ if (!inHistogram)
+ return;
+
+ // Scan full histogram
+ INT32 theLowestIndex = 0;
+ for (UINT16 theSize = 0; theSize < 512; ++theSize) {
+ // Is this count higher than the lowest recorded count?
+ if (inHistogram[theSize].m_Value[inValue] > outResults[theLowestIndex].m_Count) {
+ outResults[theLowestIndex].m_Count = inHistogram[theSize].m_Value[inValue];
+ outResults[theLowestIndex].m_Size = theSize;
+
+ // Find new low in high score
+ theLowestIndex = 0;
+ for (UINT16 theResult = 1; theResult < HISTOGRAMCOUNT; ++theResult)
+ if (outResults[theResult].m_Count < outResults[theLowestIndex].m_Count)
+ theLowestIndex = theResult;
+ }
+ }
+
+ // Sort histogram - brute force for now so don't call this all the time
+ ::qsort(outResults, 10, sizeof(SHistogramScore), CompareHistogram);
+}
+
+//==============================================================================
+/**
+ * Helper comparison function for CullHistogram
+ */
+int CMemoryStatistics::CompareHistogram(const void *arg1, const void *arg2)
+{
+ return reinterpret_cast<const SHistogramScore *>(arg2)->m_Count
+ - reinterpret_cast<const SHistogramScore *>(arg1)->m_Count;
+}
+
+//==============================================================================
+/**
+ * Helper comparison function for CMemoryStatistics::HeapReport
+ */
+int CMemoryStatistics::CompareHeap(const void *inEntry1, const void *inEntry2)
+{
+ return reinterpret_cast<const CMemoryHeap::SReportEntry *>(inEntry1)->m_Size
+ - reinterpret_cast<const CMemoryHeap::SReportEntry *>(inEntry2)->m_Size;
+}
+
+//==============================================================================
+// REPORTING
+//==============================================================================
+
+//==============================================================================
+/**
+ * Simple memory usage report covering both bytes allocated and call count.
+ * @param inStream the stream we are sending the report or NULL to use logger
+ */
+void CMemoryStatistics::SimpleReport(IStream *inStream /*=NULL*/)
+{
+ CHAR theReportBuffer[REPORTSIZE];
+ CMemoryProbe theProbe;
+
+ // Basic info is always available
+ Report(inStream, "\n --- RUNTIME SIMPLE MEMORY REPORT ---\n");
+
+ // Only the first manager is reported for now
+ Q3DStudio_ASSERT(s_PoolManagers[0]);
+ theProbe = s_PoolManagers[0]->GetManagerData().m_Aligned;
+ theProbe.Combine(s_PoolManagers[0]->GetManagerData().m_Overflow);
+ Report(inStream, "PRESENTATION: Current Peak Alloc Free\n");
+ Q3DStudio_sprintf(theReportBuffer, sizeof(theReportBuffer),
+ "Global:%12dk(%4d)%8dk(%4d)%8dk(%4d)%8dk(%4d)\n",
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_CURRENT) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_CURRENT),
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_PEAK) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_PEAK),
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_ADDS) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_ADDS),
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_DELETES) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_DELETES));
+ Report(inStream, theReportBuffer);
+ Q3DStudio_sprintf(theReportBuffer, sizeof(theReportBuffer),
+ "Reset: %12dk(%4d)%8dk(%4d)%8dk(%4d)%8dk(%4d)\n",
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_CURRENT) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_CURRENT),
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_PEAK) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_PEAK),
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_ADDS) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_ADDS),
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_DELETES) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_DELETES));
+ Report(inStream, theReportBuffer);
+
+ // Overflow is memory not serviced by memory pools - removed to make the simple report...
+ // simpler
+ /* theProbe = s_PoolManagers[0]->GetManagerData( ).m_Overflow;
+ Report( inStream, "OVERFLOW:\n" );
+ Q3DStudio_sprintf( theReportBuffer, sizeof( theReportBuffer ),
+ "Global:%12ldk(%4ld)%8ldk(%4ld)%8ldk(%4ld)%8ldk(%4ld)\n",
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_CURRENT )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_CURRENT ),
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_PEAK )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_PEAK ),
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_ADDS )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_ADDS ),
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_DELETES )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_DELETES ) );
+ Report( inStream, theReportBuffer );
+ Q3DStudio_sprintf( theReportBuffer, sizeof( theReportBuffer ), "Reset:
+ %12ldk(%4ld)%8ldk(%4ld)%8ldk(%4ld)%8ldk(%4ld)\n",
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_CURRENT )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_CURRENT ),
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_PEAK )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_PEAK ),
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_ADDS )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_ADDS ),
+ theProbe.GetBytes( MEMSCOPE_GLOBAL, MEMVALUE_DELETES )/1024,
+ theProbe.GetCalls( MEMSCOPE_GLOBAL, MEMVALUE_DELETES ) );
+ Report( inStream, theReportBuffer );*/
+
+ // All managers share the same heap
+ theProbe = CMemoryHeap::GetProbe();
+ Report(inStream, "HEAP:\n");
+ Q3DStudio_sprintf(theReportBuffer, sizeof(theReportBuffer),
+ "Global:%12dk(%4d)%8dk(%4d)%8dk(%4d)%8dk(%4d)\n",
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_CURRENT) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_CURRENT),
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_PEAK) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_PEAK),
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_ADDS) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_ADDS),
+ theProbe.GetBytes(MEMSCOPE_GLOBAL, MEMVALUE_DELETES) / 1024,
+ theProbe.GetCalls(MEMSCOPE_GLOBAL, MEMVALUE_DELETES));
+ Report(inStream, theReportBuffer);
+ Q3DStudio_sprintf(theReportBuffer, sizeof(theReportBuffer),
+ "Reset: %12dk(%4d)%8dk(%4d)%8dk(%4d)%8dk(%4d)\n",
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_CURRENT) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_CURRENT),
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_PEAK) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_PEAK),
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_ADDS) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_ADDS),
+ theProbe.GetBytes(MEMSCOPE_RESET, MEMVALUE_DELETES) / 1024,
+ theProbe.GetCalls(MEMSCOPE_RESET, MEMVALUE_DELETES));
+ Report(inStream, theReportBuffer);
+
+ Q3DStudio_sprintf(theReportBuffer, sizeof(theReportBuffer), "Tracking overhead: %dk\n",
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ (s_Overhead + sizeof(CMemoryHeap::TMemoryReport)) / 1024);
+#else
+ s_Overhead / 1024);
+#endif // Q3DStudio_MEMORY_HEAPTRACKING
+
+ Report(inStream, theReportBuffer);
+}
+
+//==============================================================================
+/**
+ * Output the memory report log.
+ *
+ * The is always watched by a CMemoryProbe that records all activity. Most
+ * individual allocations will not be recorded though since they are handled
+ * by memory pools.
+ *
+ * A probe records three axis of information (value, scope and call/bytes).
+ *
+ * # Value (current,peak,add,del) tracks the current value along with its
+ * peak value, and also separately tracks adds(allocations) and deletes(frees)
+ * such that current = add - del.
+ * # Scope (local,global) tracks values since last reset or dawn of heap.
+ * # Call/Bytes tracks separately bytes and calls so you can distinguish between
+ * many small allocations and a few large.
+ *
+ * @param inStream the stream we are sending the report or NULL to use logger
+ */
+void CMemoryStatistics::HeapReport(IStream *inStream /*=NULL*/)
+{
+ Report(inStream, "\n --- RUNTIME HEAP MEMORY REPORT ---\n");
+
+#if Q3DStudio_MEMORY_HEAPTRACKING
+ // Detailed info needs Q3DStudio_MEMORY_HEAPTRACKING defined
+ INT32 theCount = CMemoryHeap::GetReport()->GetCount();
+ ::qsort(&CMemoryHeap::GetReport()[0], static_cast<size_t>(theCount),
+ sizeof(CMemoryHeap::SReportEntry), CompareHeap);
+
+ CHAR theReportBuffer[REPORTSIZE];
+ for (INT32 theIndex = 0; theIndex < theCount; ++theIndex) {
+ CMemoryHeap::SReportEntry &theEntry = CMemoryHeap::GetReport()->operator[](theIndex);
+ Q3DStudio_sprintf(theReportBuffer, sizeof(theReportBuffer),
+ "%3d. %8d bytes - \"%s\" - %s (%d)\n", theIndex, theEntry.m_Size,
+ theEntry.m_Description, theEntry.m_File, theEntry.m_Line);
+ Report(inStream, theReportBuffer);
+ }
+#else
+ Report(inStream, " Unavailable: Q3DStudio_MEMORY_HEAPTRACKING not defined in this build\n");
+#endif
+}
+
+/* Example output of CMemoryStatistics::Report
+
+=POOL= HEAP CALLS USED ALIGN MISSES
+---------------------------------------------------------------
+All Managers 722k 38 72% 19%
+
+ Global 482k
+ 0: 16b x 1024 16k 2182 3% 13%
+ 1: 32b x 2048 64k 4123 96% 9% 38
+ 2: 48b x 512 24k 212 72% 21%
+ 3: 64b x 512 32k 454 11% 3%
+ .
+ 8: 512b x 128 64k 68 64% 22%
+*/
+
+//==============================================================================
+/**
+ * Return a text buffer describing the state of the memory system.
+ */
+void CMemoryStatistics::PoolReport(BOOL inPeak /*= true*/, BOOL inGlobal /*= true*/,
+ IStream *inStream /*=NULL*/)
+{
+ CHAR theLine[256] = { 0 };
+ SFactSheet theFacts;
+
+ GetFacts(theFacts, inPeak, inGlobal);
+
+ Report(inStream, "\n --- RUNTIME POOL MEMORY REPORT ---\n");
+ Q3DStudio_sprintf(theLine, 256,
+ "Mode: %s %s\nTotal Heap: %7dk(%d)\nPresentation: %7dk\n",
+ inGlobal ? "GLOBAL" : "RESET", inPeak ? "PEAK" : "CURRENT",
+ theFacts.m_HeapState.m_Bytes / 1024, theFacts.m_HeapState.m_Calls,
+ GetRequestedBytes(inPeak) / 1024);
+ Report(inStream, theLine);
+
+#if Q3DStudio_MEMORY_POOLTRACKING
+ Report(inStream, "=POOLS= HEAP HITS USED ALIGN MISS"
+ "\n");
+ Report(inStream, "-----------------------------------------------------------------"
+ "\n");
+ Q3DStudio_sprintf(theLine, 256, "All Managers %7dk %8d %5d%% %5d%% %6d"
+ "\n\n",
+ theFacts.m_ManagerState.m_Bytes / 1024, theFacts.m_ManagerState.m_Calls,
+ theFacts.m_ManagerState.m_Used, theFacts.m_ManagerState.m_Align,
+ theFacts.m_ManagerState.m_Miss);
+ Report(inStream, theLine);
+
+ for (INT32 theManagerIndex = 0; theManagerIndex < MANAGERCOUNT; ++theManagerIndex) {
+ SFactoid &theManagerFact = theFacts.m_Manager[theManagerIndex];
+ if (theManagerFact.m_Bytes > 0) {
+ Q3DStudio_sprintf(theLine, 256, "%-20s %7dk %8d %5d%% %5d%% %6d\n",
+ theManagerFact.m_Name, theManagerFact.m_Bytes / 1024,
+ theManagerFact.m_Calls, theManagerFact.m_Used, theManagerFact.m_Align,
+ theManagerFact.m_Miss);
+ Report(inStream, theLine);
+
+ for (INT32 thePoolIndex = 0; thePoolIndex < Q3DStudio_MEMORY_POOLCOUNT;
+ ++thePoolIndex) {
+ SFactoid &thePoolFact = theFacts.m_Pool[theManagerIndex][thePoolIndex];
+ if (theManagerFact.m_Bytes > 0) {
+ Q3DStudio_sprintf(theLine, 256, "%-20s %7dk %8d %5d%% %5d%% %6d\n",
+ thePoolFact.m_Name, thePoolFact.m_Bytes / 1024,
+ thePoolFact.m_Calls, thePoolFact.m_Used, thePoolFact.m_Align,
+ thePoolFact.m_Miss);
+ Report(inStream, theLine);
+ }
+ }
+
+ // Histogram only valid for Current-Reset
+ if (inGlobal) {
+ Report(inStream, " Histogram: Only available in RESET mode\n");
+ } else {
+ Q3DStudio_sprintf(
+ theLine, 256,
+ " Histogram: 1:%3db(%3d) 2:%3db(%3d) 3:%3db(%3d) 4:%3db(%3d) 5:%3db(%3d)\n",
+ theFacts.m_Histogram[theManagerIndex][0].m_Size,
+ theFacts.m_Histogram[theManagerIndex][0].m_Count,
+ theFacts.m_Histogram[theManagerIndex][1].m_Size,
+ theFacts.m_Histogram[theManagerIndex][1].m_Count,
+ theFacts.m_Histogram[theManagerIndex][2].m_Size,
+ theFacts.m_Histogram[theManagerIndex][2].m_Count,
+ theFacts.m_Histogram[theManagerIndex][3].m_Size,
+ theFacts.m_Histogram[theManagerIndex][3].m_Count,
+ theFacts.m_Histogram[theManagerIndex][4].m_Size,
+ theFacts.m_Histogram[theManagerIndex][4].m_Count);
+ Report(inStream, theLine);
+ Q3DStudio_sprintf(
+ theLine, 256,
+ " 6:%3db(%3d) 7:%3db(%3d) 8:%3db(%3d) 9:%3db(%3d) 10:%3db(%3d)\n",
+ theFacts.m_Histogram[theManagerIndex][5].m_Size,
+ theFacts.m_Histogram[theManagerIndex][5].m_Count,
+ theFacts.m_Histogram[theManagerIndex][6].m_Size,
+ theFacts.m_Histogram[theManagerIndex][6].m_Count,
+ theFacts.m_Histogram[theManagerIndex][7].m_Size,
+ theFacts.m_Histogram[theManagerIndex][7].m_Count,
+ theFacts.m_Histogram[theManagerIndex][8].m_Size,
+ theFacts.m_Histogram[theManagerIndex][8].m_Count,
+ theFacts.m_Histogram[theManagerIndex][9].m_Size,
+ theFacts.m_Histogram[theManagerIndex][9].m_Count);
+ Report(inStream, theLine);
+ }
+ }
+ }
+#else
+ Report(inStream, " Unavailable: Q3DStudio_MEMORY_POOLTRACKING not defined in this build\n");
+#endif
+}
+
+//==============================================================================
+/**
+ * Dump the low-level memory list stored in each manager's hash bin.
+ *
+ * @note Q3DStudio_MEMORY_LINETRACKING has to be set to 1 in AKMemorySettings.h or
+ * the compiler for this method to save out any data.
+ *
+ * @param inStream the stream we are sending the report or NULL to use logger
+ */
+void CMemoryStatistics::LineReport(IStream *inStream /*=NULL*/)
+{
+ Report(inStream, "\n--- RUNTIME LINE MEMORY REPORT ---\n");
+#if Q3DStudio_MEMORY_LINETRACKING
+ Report(inStream, "ADDR, SIZE, TYPE, LINE, FILE, \n");
+
+ INT32 theTotalBytes = 0;
+ for (INT32 theManagerIndex = 0; theManagerIndex < MANAGERCOUNT; ++theManagerIndex)
+ if (s_PoolManagers[theManagerIndex] && s_PoolManagers[theManagerIndex]->GetLineTracker())
+ theTotalBytes += s_PoolManagers[theManagerIndex]->GetLineTracker()->Report(inStream);
+
+ CHAR theTotal[64];
+ theTotal[0] = '\0';
+
+ Q3DStudio_sprintf(theTotal, sizeof(theTotal), "TOTAL: , %8d\n", theTotalBytes);
+ Report(inStream, theTotal);
+#else
+ Report(inStream, " Unavailable: Q3DStudio_MEMORY_LINETRACKING not defined in this build\n");
+#endif // Q3DStudio_MEMORY_LINETRACKING
+}
+
+//==============================================================================
+/**
+ * Output to log or stream if available.
+ * @param inMessage string to be reported
+ * @param inStream stream to be used or output to log if NULL
+ */
+void CMemoryStatistics::Report(IStream *inStream, const CHAR *inMessage)
+{
+ if (inStream)
+ inStream->WriteRaw(inMessage, (INT32)::strlen(inMessage));
+ else
+ qCInfo(qt3ds::TRACE_INFO) << inMessage;
+}
+
+//==============================================================================
+/**
+ * Output full memory report to log or stream if available.
+ * @param inStream stream to be used or output to log if NULL
+ */
+void CMemoryStatistics::FullReport(IStream *inStream /*=NULL*/)
+{
+ SimpleReport(inStream);
+ HeapReport(inStream);
+ LineReport(inStream);
+ PoolReport(false, false, inStream);
+ PoolReport(true, false, inStream);
+ PoolReport(false, true, inStream);
+ PoolReport(true, true, inStream);
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryStatistics.h b/src/system/Qt3DSMemoryStatistics.h
new file mode 100644
index 0000000..81e3043
--- /dev/null
+++ b/src/system/Qt3DSMemoryStatistics.h
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryManager.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Static facade to memory statistics and allocation tracking data.
+ *
+ * Use this class to examine the memory state of the system at any point.
+ * Heap, managers and pools are are connected to this point by registering
+ * themselves on creation. Initiate the extraction of the collected data
+ * using this interface.
+ */
+class CMemoryStatistics
+{
+ //==============================================================================
+ // Constants
+ //==============================================================================
+public:
+ const static INT32 REPORTSIZE = 256; ///< Max size of single report string
+ const static INT32 MANAGERCOUNT = 5; ///< Fixed number of managers tracked
+ const static INT32 HISTOGRAMCOUNT = 10; ///< Fixed number of managers tracked
+
+ //==============================================================================
+ // Structs
+ //==============================================================================
+public:
+ /// One row of statistics on allocation
+ struct SFactoid
+ {
+ CHAR m_Name[32]; ///< Ascii identifier - manager name or pool description
+ INT32 m_Bytes; ///< Bytes used - full pool size for example - zero if factoid unused
+ INT32 m_Calls; ///< Function calls, i.e number of allocations
+ INT32 m_Used; ///< Discrete chunk usage in percent - 10 used of 200 gives a value 5
+ INT32 m_Align; ///< Packed efficiency in percent - all 24byte structs in 32byte pool give a
+ ///value 75
+ INT32 m_Miss; ///< Allocation misses - due to full pools for example
+ };
+
+ /// Tuple describing one data point in a histogram
+ struct SHistogramScore
+ {
+ INT32 m_Size; ///< Allocation request in bytes
+ INT32 m_Count; ///< Number of allocation requests
+ };
+
+ /// Set of factoids describing a system memory state
+ struct SFactSheet
+ {
+ SFactoid m_HeapState; ///< Heap facts
+ SFactoid m_ManagerState; ///< Combined manager facts
+ SFactoid m_Manager[MANAGERCOUNT]; ///< Individual manager facts
+ SHistogramScore m_Histogram[MANAGERCOUNT][HISTOGRAMCOUNT]; ///< Top allocation requests
+ ///sorted by bytes, global and
+ ///never reset
+ SFactoid m_Pool[MANAGERCOUNT][Q3DStudio_MEMORY_POOLCOUNT]; ///< Individual pool facts
+ };
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ static INT32 s_Overhead; ///< Memory tracking structures report in here
+ static CMemoryManager
+ *s_PoolManagers[MANAGERCOUNT]; ///< Pointers to all created memory pool managers
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Registration
+ static void AddManager(CMemoryManager *inManager);
+ static void RemoveManager(CMemoryManager *inManager);
+ static INT32 &Overhead();
+
+public: // Access
+ static void Reset();
+ static void GetFacts(SFactSheet &outFacts, const BOOL inPeak = false,
+ const BOOL inGlobal = false);
+ static INT32 GetRequestedBytes(const BOOL inPeak = false);
+ static INT32 GetHeapBytes(const BOOL inPeak = false);
+
+public: // Reporting
+ static void SimpleReport(IStream *inStream = NULL);
+ static void HeapReport(IStream *inStream = NULL);
+ static void PoolReport(const BOOL inPeak = false, const BOOL inGlobal = false,
+ IStream *inStream = NULL);
+ static void LineReport(IStream *inStream = NULL);
+
+ static void FullReport(IStream *inStream = NULL);
+ static void Report(IStream *inStream, const CHAR *inString);
+
+protected: // Utility
+ static void CullHistogram(const CMemoryProbe::SValue *inHistogram, const EMemoryValue inValue,
+ SHistogramScore outResults[HISTOGRAMCOUNT]);
+ static int CompareHeap(const void *arg1, const void *arg2);
+ static int CompareHistogram(const void *arg1, const void *arg2);
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryTracker.cpp b/src/system/Qt3DSMemoryTracker.cpp
new file mode 100644
index 0000000..8aef951
--- /dev/null
+++ b/src/system/Qt3DSMemoryTracker.cpp
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSMemoryTracker.h"
+#include "foundation/Qt3DSLogging.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Construct and reset the tracker.
+ */
+CMemoryTracker::CMemoryTracker()
+ : m_TrackingOverhead(0)
+{
+ Q3DStudio_memset(&m_TrackingHashBin, 0, sizeof(m_TrackingHashBin));
+ CMemoryStatistics::Overhead() += sizeof(m_TrackingHashBin);
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CMemoryTracker::~CMemoryTracker()
+{
+ CMemoryStatistics::Overhead() -= sizeof(m_TrackingHashBin);
+}
+
+//==============================================================================
+/**
+ * Add information about allocation
+ * @param inPtr contains info about a new allocation
+ */
+void CMemoryTracker::Remember(SMemoryInfo *inPointer)
+{
+ if (inPointer) {
+ // Update global tracking
+ m_TrackingOverhead += sizeof(SMemoryInfo);
+
+ // Locate a suitable hashbin
+ size_t theHashBin =
+ (reinterpret_cast<size_t>(inPointer) >> 2) % Q3DStudio_MEMORY_LINETRACKINGSIZE;
+ size_t theStartHashBin = theHashBin;
+
+ while (m_TrackingHashBin[theHashBin]) {
+ ++theHashBin;
+ if (theHashBin >= Q3DStudio_MEMORY_LINETRACKINGSIZE)
+ theHashBin = 0;
+
+ if (theHashBin == theStartHashBin) {
+ // We've run out of room in the hashbin.
+ // Abort and increase the bin size.
+ qCCritical(qt3ds::OUT_OF_MEMORY)
+ << "Memory Tracker Error: Ran out of room in tracker hashbin "
+ << Q3DStudio_MEMORY_LINETRACKINGSIZE;
+ // exit( -1 );
+ }
+ }
+
+ // Set WatchGuard and store the pointer in the hash bin
+ inPointer->m_DogTag = TRACKER_DOGTAG;
+ m_TrackingHashBin[theHashBin] = inPointer;
+ }
+}
+
+//==============================================================================
+/**
+ * Remove information on an allocation
+ * @param inPtr contains info about the allocation we are releasing
+ */
+void CMemoryTracker::Forget(SMemoryInfo *inPointer)
+{
+ if (inPointer) {
+ // Update global tracking
+ m_TrackingOverhead -= sizeof(SMemoryInfo);
+
+ // Locate the pointer in the hash bin
+ size_t theHashBin = Q3DStudio_max<size_t>(0, (reinterpret_cast<size_t>(inPointer) >> 2)
+ % Q3DStudio_MEMORY_LINETRACKINGSIZE);
+ size_t theStartHashBin = theHashBin;
+
+ while (m_TrackingHashBin[theHashBin] != inPointer) {
+ ++theHashBin;
+ if (theHashBin >= Q3DStudio_MEMORY_LINETRACKINGSIZE)
+ theHashBin = 0;
+
+ if (theHashBin == theStartHashBin) {
+ // We were unable to locate the pointer in the hash bin.
+ // This is really bad, but not catastrophic
+ qCWarning(qt3ds::OUT_OF_MEMORY)
+ << "Memory Tracker Warning. Can't find pointer in tracker hashbin";
+ return;
+ }
+ }
+
+ // Verify watch guard. Something is trashing memory if this call fails.
+ Q3DStudio_ASSERT(m_TrackingHashBin[theHashBin]->m_DogTag == TRACKER_DOGTAG);
+
+ // Clear the pointer from the hash bin
+ m_TrackingHashBin[theHashBin] = NULL;
+ }
+}
+
+//==============================================================================
+/**
+ * Dump the memory list stored in the hash bin.
+ * @param inFileName the report filename or NULL to dump to the logger
+ */
+INT32 CMemoryTracker::Report(IStream *inStream /*=NULL*/)
+{
+ INT32 theTotalBytes = 0;
+ CHAR theLine[256];
+
+ for (INT32 theBinIndex = 0; theBinIndex < Q3DStudio_MEMORY_LINETRACKINGSIZE; ++theBinIndex) {
+ if (m_TrackingHashBin[theBinIndex]) {
+ CMemoryTracker::SMemoryInfo *theInfo = m_TrackingHashBin[theBinIndex];
+
+ Q3DStudio_sprintf(theLine, sizeof(theLine), "0x%p, %8d, %s, %s(%hd)\n", theInfo,
+ theInfo->m_Size, theInfo->m_Type, theInfo->m_File, theInfo->m_Line);
+
+ CMemoryStatistics::Report(inStream, theLine);
+ theTotalBytes += theInfo->m_Size;
+ }
+ }
+
+ return theTotalBytes;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSMemoryTracker.h b/src/system/Qt3DSMemoryTracker.h
new file mode 100644
index 0000000..ee6ce69
--- /dev/null
+++ b/src/system/Qt3DSMemoryTracker.h
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Low level memory statistics tracking each individual allocation.
+ *
+ * This class is instantiated in each CMemoryManager if tracking is enabled
+ * by setting ENABLE_MEMORY_LINETRACKING to 1 in AKConfig.h for the build
+ * configuration you want.
+ *
+ * Tracking is much more invasive than simple statistics since it records each
+ * individual allocation and deallocation. The overhead can be seen mostly in
+ * the memory load since we store a tracking hashbin of all memory allocation
+ * and a 16 byte SMemoryInfo structure is prepended to each allocation no matter
+ * how small. This mode should be used when debugging memory to track down
+ * individual allocations. It's turned off by default and should stay off
+ * most of the time.
+ *
+ * The tracking information is usually dumped to a comma delimited .csv file
+ * for easy viewing as a spreadsheet of data. This action is initiated by
+ * pressing CTRL-F1 in Quarterback on the PC but can be added to any viewer
+ * by calling CMemoryStatistics::TrackingDump.
+ */
+class CMemoryTracker
+{
+ //==============================================================================
+ // Constants
+ //==============================================================================
+public:
+ const static UINT16 TRACKER_DOGTAG = 0xbead; ///< Watch guard value in SMemoryTrackInfo
+
+ //==============================================================================
+ // Structs
+ //==============================================================================
+public:
+ /// 16 bytes of details on each allocation when tracking is enabled
+ struct SMemoryInfo
+ {
+ UINT16 m_DogTag; ///< 0xbead - asserting this to track overwrites
+ INT16 m_Line; ///< line from which the allocation occurred
+ INT32 m_Size; ///< allocation size in bytes
+ const CHAR *m_File; ///< file from which the allocation occurred
+ const CHAR *m_Type; ///< type of allocation, usually class name
+ };
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ INT32 m_TrackingOverhead; ///< memory used to track allocations in bytes
+ SMemoryInfo *m_TrackingHashBin[Q3DStudio_MEMORY_LINETRACKINGSIZE]; ///< hash table of all
+ ///tracked allocations
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CMemoryTracker();
+ ~CMemoryTracker();
+
+public: // Tracking
+ void Remember(SMemoryInfo *inData);
+ void Forget(SMemoryInfo *inData);
+
+public: // Reporting
+ INT32 Report(IStream *inStream = NULL);
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSPlatformSpecific.h b/src/system/Qt3DSPlatformSpecific.h
new file mode 100644
index 0000000..3fc3401
--- /dev/null
+++ b/src/system/Qt3DSPlatformSpecific.h
@@ -0,0 +1,207 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#if defined(_PCPLATFORM)
+
+#define Q3DStudio_memcpy(inDest, inSource, inCount) \
+ memcpy(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memmove(inDest, inSource, inCount) \
+ memmove(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memset(inDest, inChar, inCount) \
+ memset(inDest, inChar, static_cast<size_t>(inCount))
+#define Q3DStudio_memcmp(inDest, inSource, inCount) \
+ memcmp(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_sprintf _snprintf
+#define Q3DStudio_stricmp(inStr1, inStr2) _stricmp(inStr1, inStr2)
+#define Q3DStudio_strnicmp(inStr1, inStr2, inCount) _strnicmp(inStr1, inStr2, inCount)
+#define Q3DStudio_tolower tolower
+#define Q3DStudio_restrict /*__restrict*/
+#define Q3DStudio_dcbt(inOffset, inAddress)
+#define Q3DStudio_strcpy(inDest, inSize, inSource) strcpy_s(inDest, inSize, inSource)
+#define Q3DStudio_strcat(inDest, inSize, inSource) strcat_s(inDest, inSize, inSource)
+#define Q3DStudio_fopen fopen_s
+#define Q3DStudio_sleepmillisec(inMillisec) Sleep(inMillisec)
+#define Q3DStudio_getpid GetCurrentProcessId
+
+#elif defined(_TEGRAPLATFORM)
+
+#define Q3DStudio_memcpy(inDest, inSource, inCount) \
+ memcpy(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memmove(inDest, inSource, inCount) \
+ memmove(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memset(inDest, inChar, inCount) \
+ memset(inDest, inChar, static_cast<size_t>(inCount))
+#define Q3DStudio_memcmp(inDest, inSource, inCount) \
+ memcmp(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_sprintf _snprintf
+#define Q3DStudio_stricmp(inStr1, inStr2) _stricmp(inStr1, inStr2)
+#define Q3DStudio_strnicmp(inStr1, inStr2, inCount) _strnicmp(inStr1, inStr2, inCount)
+#define Q3DStudio_tolower tolower
+#define Q3DStudio_restrict /*__restrict*/
+#define Q3DStudio_dcbt(inOffset, inAddress)
+#define Q3DStudio_strcpy(inDest, inSize, inSource) strcpy_s(inDest, inSize, inSource)
+#define Q3DStudio_strcat(inDest, inSize, inSource) strcat_s(inDest, inSize, inSource)
+#define Q3DStudio_fopen(inFilePtr, inFilename, inMode) fopen_s(inFilePtr, inFilename, inMode)
+#define Q3DStudio_sleepmillisec(inMillisec) Sleep(inMillisec)
+#define Q3DStudio_getpid GetCurrentProcessId
+
+#elif defined(_XENONPLATFORM)
+
+#include <xtl.h>
+#define Q3DStudio_memcpy(inDest, inSource, inCount) \
+ memcpy(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memmove(inDest, inSource, inCount) \
+ memmove(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memset(inDest, inChar, inCount) \
+ memset(inDest, inChar, static_cast<size_t>(inCount))
+#define Q3DStudio_memcmp(inDest, inSource, inCount) \
+ memcmp(inDest, inSource, static_cast<size_t>(inCount))
+//#define Q3DStudio_memcpy( inDest, inSource, inCount ) XMemCpy( inDest, inSource,
+//static_cast<SIZE_T>( inCount ) )
+//#define Q3DStudio_memset( inDest, inChar, inCount ) XMemSet( inDest, inChar,
+//static_cast<SIZE_T>( inCount ) )
+#define Q3DStudio_sprintf _snprintf
+#define Q3DStudio_tolower tolower
+#define Q3DStudio_restrict /*__restrict*/
+#define Q3DStudio_dcbt(inOffset, inAddress) __dcbt(inOffset, inAddress)
+#define Q3DStudio_strcpy(inDest, inSize, inSource) strcpy_s(inDest, inSize, inSource)
+#define Q3DStudio_strcat(inDest, inSize, inSource) strcat_s(inDest, inSize, inSource)
+#define Q3DStudio_fopen(inFilePtr, inFilename, inMode) fopen_s(inFilePtr, inFilename, inMode)
+#define Q3DStudio_sleepmillisec(inMillisec) Sleep(inMillisec)
+#define Q3DStudio_getpid GetCurrentProcessId
+#define Q3DStudio_strnicmp(inStr1, inStr2, inCount) _strnicmp(inStr1, inStr2, inCount)
+#define Q3DStudio_stricmp(inStr1, inStr2) _stricmp(inStr1, inStr2)
+
+#elif defined(_PS3PLATFORM)
+
+#define Q3DStudio_memcpy(inDest, inSource, inCount) \
+ memcpy(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memmove(inDest, inSource, inCount) \
+ memmove(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memset(inDest, inChar, inCount) \
+ memset(inDest, inChar, static_cast<size_t>(inCount))
+#define Q3DStudio_memcmp(inDest, inSource, inCount) \
+ memcmp(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_sprintf snprintf
+#define Q3DStudio_tolower std::tolower
+#define Q3DStudio_restrict
+#define Q3DStudio_dcbt(inOffset, inAddress)
+#define Q3DStudio_strcpy(inDest, inSize, inSource) strcpy(inDest, inSource)
+#define Q3DStudio_strcat(inDest, inSize, inSource) strcat(inDest, inSource)
+#define Q3DStudio_fopen(inFilePtr, inFilename, inMode) *(inFilePtr) = fopen(inFilename, inMode)
+#define Q3DStudio_sleepmillisec(inMillisec) \
+ { \
+ struct timespec theSleepTime = { inMillisec / 1000, (inMillisec % 1000) * 1000000 }; \
+ ::nanosleep(&theSleepTime, NULL); \
+ }
+#define Q3DStudio_getpid getpid
+#define Q3DStudio_stricmp(inStr1, inStr2) strcasecmp(inStr1, inStr2)
+#define Q3DStudio_strnicmp(inStr1, inStr2, inCount) strncasecmp(inStr1, inStr2, inCount)
+
+#elif defined(_LINUXPLATFORM) || defined(_INTEGRITYPLATFORM)
+#include <time.h>
+#define Q3DStudio_memcpy(inDest, inSource, inCount) \
+ memcpy(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memmove(inDest, inSource, inCount) \
+ memmove(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_memset(inDest, inChar, inCount) \
+ memset(inDest, inChar, static_cast<size_t>(inCount))
+#define Q3DStudio_memcmp(inDest, inSource, inCount) \
+ memcmp(inDest, inSource, static_cast<size_t>(inCount))
+#define Q3DStudio_sprintf snprintf
+#define Q3DStudio_stricmp(inStr1, inStr2) strcasecmp(inStr1, inStr2)
+#define Q3DStudio_strnicmp(inStr1, inStr2, inCount) strncasecmp(inStr1, inStr2, inCount)
+#define Q3DStudio_tolower tolower
+#define Q3DStudio_restrict /*__restrict*/
+#define Q3DStudio_dcbt(inOffset, inAddress)
+#define Q3DStudio_strcpy(inDest, inSize, inSource) strcpy(inDest, inSource)
+#define Q3DStudio_strcat(inDest, inSize, inSource) strcat(inDest, inSource)
+#define Q3DStudio_fopen(inFilePtr, inFilename, inMode) *(inFilePtr) = fopen(inFilename, inMode)
+#define Q3DStudio_sleepmillisec(inMillisec) \
+ { \
+ struct timespec theSleepTime = { inMillisec / 1000, (inMillisec % 1000) * 1000000 }; \
+ ::nanosleep(&theSleepTime, NULL); \
+ }
+#define Q3DStudio_getpid getpid
+
+#else
+#error "A platform must be defined"
+#endif
+
+//==============================================================================
+/** @def Q3DStudio_dcbt( inOffset, inAddress )
+ * @brief Data Cache Block Touch - Loads the block of memory containing
+ * the specified address into the data cache.
+ *
+ * A program uses the dcbt instruction to request a cache block fetch before
+ * it is actually needed by the program. This prevents stalls in the pipeline.
+ */
+
+//==============================================================================
+/** @def Q3DStudio_restrict
+ * @brief Cross platform macro for pointer aliasing.
+ *
+ * Performance Implications of Pointer Aliasing
+ *
+ * Doug Cook
+ * Silicon Graphics, Inc.
+ * August, 1997
+ *
+ * Pointer aliasing can have a severe impact on program performance.
+ * Understanding its implications is critical to writing high-performance code.
+ * This document provides a brief introduction to the problem, and suggests
+ * several approaches to solving it through source-code restructuring, compiler
+ * options, and C or C++ language extensions.
+ *
+ * *Aliasing*
+ *
+ * Here's a brief overview of aliasing. Consider the following function:
+ *
+ * void process_data(float *in, float *out, float gain, int nsamps)
+ * {
+ * int i;
+ * for (i = 0; i < nsamps; i++) {
+ * out[i] = in[i] * gain;
+ * }
+ * }
+ *
+ * In C or C++, it is legal for the parameters in and out to point to
+ * overlapping regions in memory. When this happens, in and out are said to be
+ * aliases. When the compiler optimizes the function, it does not in general
+ * know whether in and out are aliases. It must therefore assume that any
+ * store through out can affect the memory pointed to by in, which severely
+ * limits its ability to reorder or parallelize the code (For some simple
+ * cases, the compiler could analyze the entire program to determine that two
+ * pointers cannot be aliases. But in general, it is impossible for the
+ * compiler to determine whether or not two pointers are aliases, so to be
+ * safe, it must assume that they are).
+ */
diff --git a/src/system/Qt3DSTimer.cpp b/src/system/Qt3DSTimer.cpp
new file mode 100644
index 0000000..d9e82eb
--- /dev/null
+++ b/src/system/Qt3DSTimer.cpp
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSTimer.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ */
+CTimer::CTimer(ITimeProvider &inProvider)
+ : m_TimeProvider(inProvider)
+ , m_IsRunning(false)
+{
+ Start();
+}
+
+//==============================================================================
+/**
+ * Start the timer
+ */
+void CTimer::Start()
+{
+ if (!m_IsRunning)
+ m_StartTime = m_TimeProvider.GetCurrentTimeMicroSeconds();
+ m_IsRunning = true;
+}
+
+//==============================================================================
+/**
+ * Stop the timer
+ */
+void CTimer::Stop()
+{
+ if (m_IsRunning)
+ m_StartTime = m_TimeProvider.GetCurrentTimeMicroSeconds() - m_StartTime;
+
+ m_IsRunning = false;
+}
+
+//==============================================================================
+/**
+ * Reset the timer
+ */
+void CTimer::Reset()
+{
+ if (m_IsRunning)
+ m_StartTime = m_TimeProvider.GetCurrentTimeMicroSeconds();
+ else
+ m_StartTime = 0;
+}
+
+//==============================================================================
+/**
+ * Gets the current time in milliseconds.
+ * @return the current time since timer was started(in miliseconds),
+ * or time when it was stopped
+ */
+TTimeUnit CTimer::GetTimeMilliSecs()
+{
+ return GetTimeMicroSecs() / 1000;
+}
+
+//=============================================================================
+/**
+ * Get the number of usecs elapsed since start was called.
+ * If the timer is running then this will return the time from when start was
+ * called. If the timer is stopped then this will return the amount of time
+ * between the start and last stop.
+ * @return returns the elasped micro second.
+ */
+TMicroSeconds CTimer::GetTimeMicroSecs()
+{
+ if (m_IsRunning)
+ return m_TimeProvider.GetCurrentTimeMicroSeconds() - m_StartTime;
+ else
+ return m_StartTime;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSTimer.h b/src/system/Qt3DSTimer.h
new file mode 100644
index 0000000..278bd4b
--- /dev/null
+++ b/src/system/Qt3DSTimer.h
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSITimer.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+
+//==============================================================================
+/**
+ * Time provider interface abstracting time from the usage of time.
+ */
+class ITimeProvider
+{
+protected:
+ virtual ~ITimeProvider() {}
+public:
+ virtual INT64 GetCurrentTimeMicroSeconds() = 0;
+};
+
+// Pause in a way that is completely transparent to the underlying system.
+class CPausingTimeProvider : public ITimeProvider
+{
+ ITimeProvider &m_Provider;
+ INT64 m_PauseOffset;
+ INT64 m_Offset;
+ bool m_Paused;
+
+public:
+ CPausingTimeProvider(ITimeProvider &inProvider)
+ : m_Provider(inProvider)
+ , m_PauseOffset(0)
+ , m_Offset(0)
+ , m_Paused(false)
+ {
+ }
+
+ INT64 GetCurrentTimeMicroSeconds() override
+ {
+ INT64 currentTime = 0;
+ if (m_Paused)
+ currentTime = m_PauseOffset;
+ else
+ currentTime = m_Provider.GetCurrentTimeMicroSeconds();
+
+ return currentTime - m_Offset;
+ }
+
+ void Pause()
+ {
+ if (!m_Paused) {
+ m_Paused = true;
+ m_PauseOffset = m_Provider.GetCurrentTimeMicroSeconds();
+ }
+ }
+
+ void UnPause()
+ {
+ if (m_Paused) {
+ m_Paused = false;
+ INT64 timePaused = m_Provider.GetCurrentTimeMicroSeconds() - m_PauseOffset;
+ m_Offset += timePaused;
+ }
+ }
+
+ bool IsPaused() { return m_Paused; }
+
+ void Reset() { m_PauseOffset = m_Offset = 0; }
+};
+
+//==============================================================================
+/**
+ * @class CTimer
+ * @brief A very simple platform optimized utility class to return lapsed time
+ *
+ * Gets current time based on the time lapsed from the point where timer is started.
+ */
+
+class CTimer : public ITimer
+{
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ ITimeProvider &m_TimeProvider;
+ INT64 m_StartTime;
+ BOOL m_IsRunning; // Whether this timer is running or stopped
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CTimer(ITimeProvider &inProvider);
+
+public: // Operation
+ void Start() override;
+ void Stop() override;
+ void Reset() override;
+ TTimeUnit GetTimeMilliSecs() override;
+ TMicroSeconds GetTimeMicroSecs() override;
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSTypes.cpp b/src/system/Qt3DSTypes.cpp
new file mode 100644
index 0000000..25d41c8
--- /dev/null
+++ b/src/system/Qt3DSTypes.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Return 2^inBitCount - 1.
+ * @param inBitCount number of bits available
+ * @param inUnsigned true if all bits are available
+ * @return the higest number the bits can represent
+ */
+INT32 Q3DStudio_maxbits(const INT32 inBitCount, const BOOL inUnsigned)
+{
+ Q3DStudio_ASSERT(inBitCount < 32);
+ if (inUnsigned)
+ return (1 << inBitCount) - 1;
+ else
+ return (1 << (inBitCount - 1)) - 1;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSTypes.h b/src/system/Qt3DSTypes.h
new file mode 100644
index 0000000..65d57da
--- /dev/null
+++ b/src/system/Qt3DSTypes.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include <QtCore/qglobal.h>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Typedefs
+//==============================================================================
+typedef bool BOOL; ///< true or false, usually 8 bits
+typedef qint8 INT8; ///< A signed 8-bit integer, not a character
+typedef quint8 UINT8; ///< An unsigned 8-bit integer 0-255, not a character
+typedef qint16 INT16; ///< A signed 16-bit integer
+typedef quint16 UINT16; ///< An unsigned 16-bit integer
+typedef qint32 INT32; ///< A signed 32-bit integer
+typedef quint32 UINT32; ///< An unsigned 32-bit integer
+typedef float FLOAT; ///< A 32-bit floating point number
+typedef char CHAR; ///< String character, not a number
+typedef qint64 INT64;
+typedef quint64 UINT64;
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+//==============================================================================
+// Max constants and computation
+//==============================================================================
+INT32 Q3DStudio_maxbits(const INT32 inBitCount, const BOOL inUnsigned);
+
+#define AKMAX_INT8 static_cast<INT8>(0x7F)
+#define AKMAX_UINT8 static_cast<UINT8>(0xFF)
+#define AKMAX_INT16 static_cast<INT16>(0x7FFF)
+#define AKMAX_UINT16 static_cast<UINT16>(0xFFFF)
+#define AKMAX_INT32 0x7FFFFFFFL
+#define AKMAX_UINT32 0xFFFFFFFFUL
+
+#define Q3DStudio_INT64_C(x) x
+#define Q3DStudio_UINT64_C(x) x
+
+typedef FILE TFile;
+typedef size_t TFileSize;
+
+struct VECTOR4
+{
+ union {
+ FLOAT v[4];
+ UINT32 u[4];
+ };
+
+ FLOAT &x() { return v[0]; }
+ FLOAT &y() { return v[1]; }
+ FLOAT &z() { return v[2]; }
+ FLOAT &w() { return v[3]; }
+};
+
+struct MATRIX16
+{
+ union {
+ VECTOR4 v[4];
+ FLOAT m[4][4];
+ FLOAT f[16];
+ };
+
+ FLOAT &_11() { return f[0]; }
+ FLOAT &_12() { return f[1]; }
+ FLOAT &_13() { return f[2]; }
+ FLOAT &_14() { return f[3]; }
+ FLOAT &_21() { return f[4]; }
+ FLOAT &_22() { return f[5]; }
+ FLOAT &_23() { return f[6]; }
+ FLOAT &_24() { return f[7]; }
+ FLOAT &_31() { return f[8]; }
+ FLOAT &_32() { return f[9]; }
+ FLOAT &_33() { return f[10]; }
+ FLOAT &_34() { return f[11]; }
+ FLOAT &_41() { return f[12]; }
+ FLOAT &_42() { return f[13]; }
+ FLOAT &_43() { return f[14]; }
+ FLOAT &_44() { return f[15]; }
+};
+
+typedef INT64 TMicroSeconds; ///< Time in microseconds
+typedef INT64 TTimeUnit; ///< Time in milliseconds
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSVector3.cpp b/src/system/Qt3DSVector3.cpp
new file mode 100644
index 0000000..2d790f9
--- /dev/null
+++ b/src/system/Qt3DSVector3.cpp
@@ -0,0 +1,466 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "SystemPrefix.h"
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSVector3.h"
+#include "Qt3DSMatrix.h"
+#include "Qt3DSDataLogger.h"
+#include <math.h>
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Constants
+//==============================================================================
+extern const float RUNTIME_EPSILON = 0.0001f;
+const float RUNTIME_SQUARE_EPSILON = 0.000001f;
+
+//==============================================================================
+/**
+ * Simple constructor - creates a NULL vector.
+ */
+RuntimeVector3::RuntimeVector3()
+ : m_X(0.0f)
+ , m_Y(0.0f)
+ , m_Z(0.0f)
+{
+}
+
+//==============================================================================
+/**
+ * Construction from three array value.
+ * @param inVector the source array
+ */
+RuntimeVector3::RuntimeVector3(const float inVector[3])
+ : m_X(inVector[0])
+ , m_Y(inVector[1])
+ , m_Z(inVector[2])
+{
+}
+
+//==============================================================================
+/**
+ * Construction from three coordinates.
+ * @param inX the m_X coordinate
+ * @param inY the m_Y coordinate
+ * @param inZ the m_Z coordinate
+ */
+RuntimeVector3::RuntimeVector3(const float inX, const float inY, const float inZ)
+ : m_X(inX)
+ , m_Y(inY)
+ , m_Z(inZ)
+{
+}
+
+//==============================================================================
+/**
+ * Copy constructor
+ * @param inVector the source vector
+ */
+RuntimeVector3::RuntimeVector3(const RuntimeVector3 &inVector)
+ : m_X(inVector.m_X)
+ , m_Y(inVector.m_Y)
+ , m_Z(inVector.m_Z)
+{
+}
+
+//==============================================================================
+/**
+ * Assignment of coordinates.
+ * @param inX the m_X coordinate
+ * @param inY the m_Y coordinate
+ * @param inZ the m_Z coordinate
+ * @return a reference to this modified vector
+ */
+RuntimeVector3 &RuntimeVector3::Set(const float inX, const float inY, const float inZ)
+{
+ m_X = inX;
+ m_Y = inY;
+ m_Z = inZ;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Assignment of coordinates using another vector.
+ * @param inVector the vector to be copied.
+ * @return a reference to this modified vector
+ */
+RuntimeVector3 &RuntimeVector3::Set(const RuntimeVector3 &inVector)
+{
+ m_X = inVector.m_X;
+ m_Y = inVector.m_Y;
+ m_Z = inVector.m_Z;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Compare this vector with another. Exact match is not needed but instead
+ * an error of EPSILON is allowed.
+ * @param inVector the vector we are compared with
+ * @return true if the vectors are close to identical
+ * @see EPSILON
+ */
+bool RuntimeVector3::operator==(const RuntimeVector3 &inVector) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+
+ return (::fabsf(m_X - inVector.m_X) < RUNTIME_EPSILON) && (::fabsf(m_Y - inVector.m_Y) < RUNTIME_EPSILON)
+ && (::fabsf(m_Z - inVector.m_Z) < RUNTIME_EPSILON);
+}
+
+//==============================================================================
+/**
+ * Compare this vector with another. Exact match is not needed but instead
+ * an error of EPSILON is allowed.
+ * @param inVector the vector we are compared with
+ * @return true if the vectors are not even close to identical
+ * @see EPSILON
+ */
+bool RuntimeVector3::operator!=(const RuntimeVector3 &inVector) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+
+ return (::fabsf(m_X - inVector.m_X) > RUNTIME_EPSILON) || (::fabsf(m_Y - inVector.m_Y) > RUNTIME_EPSILON)
+ || (::fabsf(m_Z - inVector.m_Z) > RUNTIME_EPSILON);
+}
+
+//==============================================================================
+/**
+ * Add this vector with another but do not modify this vector.
+ * @param inVector the second vector being added
+ * @return a new vector
+ */
+RuntimeVector3 RuntimeVector3::operator+(const RuntimeVector3 &inVector) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+
+ return RuntimeVector3(m_X + inVector.m_X, m_Y + inVector.m_Y, m_Z + inVector.m_Z);
+}
+
+//==============================================================================
+/**
+ * Add two vectors but do not modify this vector.
+ * @param inVector vector being subtracted
+ * @return a new vector
+ */
+RuntimeVector3 RuntimeVector3::operator-(const RuntimeVector3 &inVector) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ return RuntimeVector3(m_X - inVector.m_X, m_Y - inVector.m_Y, m_Z - inVector.m_Z);
+}
+
+//==============================================================================
+/**
+ * Get a scaled copy of this vector.
+ * @param inFactor the factor that scales each coordinate
+ * @return a new scaled vector
+ */
+RuntimeVector3 RuntimeVector3::operator*(float inFactor) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ return RuntimeVector3(m_X * inFactor, m_Y * inFactor, m_Z * inFactor);
+}
+
+//==============================================================================
+/**
+ * Invert the vector.
+ * @return the inverted copy of this vector
+ */
+RuntimeVector3 RuntimeVector3::operator-() const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ return RuntimeVector3(-m_X, -m_Y, -m_Z);
+}
+
+//==============================================================================
+/**
+ * Simple assignment.
+ * @param inVector the new vector
+ * @return a reference to this modified vector
+ */
+RuntimeVector3 &RuntimeVector3::operator=(const RuntimeVector3 &inVector)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ if (&inVector != this) {
+ m_X = inVector.m_X;
+ m_Y = inVector.m_Y;
+ m_Z = inVector.m_Z;
+ }
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Increment this vector.
+ * @param inVector has the coordinates by which this vector will be incremented
+ * @return a reference to this modified vector
+ */
+RuntimeVector3 &RuntimeVector3::operator+=(const RuntimeVector3 &inVector)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ m_X += inVector.m_X;
+ m_Y += inVector.m_Y;
+ m_Z += inVector.m_Z;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Decrement this vector.
+ * @param inVector has the coordinates by which this vector will be decremented
+ * @return a reference to this modified vector
+ */
+RuntimeVector3 &RuntimeVector3::operator-=(const RuntimeVector3 &inVector)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ m_X -= inVector.m_X;
+ m_Y -= inVector.m_Y;
+ m_Z -= inVector.m_Z;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Scale this vector by a factor.
+ * @param inFactor the scale factor
+ * @return a reference to this modified vector
+ */
+RuntimeVector3 &RuntimeVector3::operator*=(float inFactor)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ m_X *= inFactor;
+ m_Y *= inFactor;
+ m_Z *= inFactor;
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Calculates the squared distance between this vector and another.
+ * This is often used in sorting situations where the real distance isn't needed.
+ * @param inVector vector to which the distance is being calculated
+ * @return the squared distance between vectors
+ */
+float RuntimeVector3::DistanceSquared(const RuntimeVector3 &inVector) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ return (m_X - inVector.m_X) * (m_X - inVector.m_X) + (m_Y - inVector.m_Y) * (m_Y - inVector.m_Y)
+ + (m_Z - inVector.m_Z) * (m_Z - inVector.m_Z);
+}
+
+//==============================================================================
+/**
+ * Calculates the distance between this vector and another.
+ * @param inVector vector to which the distance is being calculated
+ * @return the distance between vectors
+ */
+float RuntimeVector3::Distance(const RuntimeVector3 &inVector) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ return ::sqrtf((m_X - inVector.m_X) * (m_X - inVector.m_X)
+ + (m_Y - inVector.m_Y) * (m_Y - inVector.m_Y)
+ + (m_Z - inVector.m_Z) * (m_Z - inVector.m_Z));
+}
+
+//==============================================================================
+/**
+ * Calculates the squared length (squared magnitude) of the current vector.
+ * @return the squared length of this vector
+ */
+float RuntimeVector3::LengthSquared() const
+{
+ return m_X * m_X + m_Y * m_Y + m_Z * m_Z;
+}
+
+//==============================================================================
+/**
+ * Calculates the length (magnitude) of the current vector.
+ * @return the length of this vector
+ */
+float RuntimeVector3::Length() const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ return ::sqrtf(m_X * m_X + m_Y * m_Y + m_Z * m_Z);
+}
+
+//==============================================================================
+/**
+ * Calculates the dot product of this vector and another.
+ * @param inVector vector measuring with
+ * @return the dot product
+ * @see operator*
+ */
+float RuntimeVector3::DotProduct(const RuntimeVector3 &inVector) const
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ return m_X * inVector.m_X + m_Y * inVector.m_Y + m_Z * inVector.m_Z;
+}
+
+//==============================================================================
+/**
+ * Calculates the cross product of this vector and another and modifies this vector
+ * @param inVector other vector
+ * @return this cross product vector
+ * @see operator%
+ * @see operator%=
+ */
+RuntimeVector3 &RuntimeVector3::CrossProduct(const RuntimeVector3 &inVector)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ float theX = m_Y * inVector.m_Z - m_Z * inVector.m_Y;
+ float theY = m_Z * inVector.m_X - m_X * inVector.m_Z;
+ float theZ = m_X * inVector.m_Y - m_Y * inVector.m_X;
+
+ m_X = theX;
+ m_Y = theY;
+ m_Z = theZ;
+
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Normalizes the current vector making it a unit vector.
+ * The normalized vector is defined to be: V_norm = V / Magnitude(V).
+ * @return this normalized vector
+*/
+RuntimeVector3 &RuntimeVector3::Normalize()
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ float theLengthSquared = LengthSquared();
+ if ((theLengthSquared > RUNTIME_SQUARE_EPSILON) && ::fabsf(theLengthSquared - 1.0f) > RUNTIME_SQUARE_EPSILON) {
+ float theInvLength = 1.0f / ::sqrtf(theLengthSquared);
+ m_X *= theInvLength;
+ m_Y *= theInvLength;
+ m_Z *= theInvLength;
+ }
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Modifies the current vector to contain elements that are the minimum between
+ * this vector and another.
+ * @param inVector vector that whose elements are tested against the
+ * current vector to build the minimum.
+ * @return this minimized vector
+*/
+RuntimeVector3 &RuntimeVector3::Minimize(const RuntimeVector3 &inVector)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ m_X = Q3DStudio_min<float>(m_X, inVector.m_X);
+ m_Y = Q3DStudio_min<float>(m_Y, inVector.m_Y);
+ m_Z = Q3DStudio_min<float>(m_Z, inVector.m_Z);
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Modifies the current vector to contain elements that are the maximum between
+ * this vector and another.
+ * @param inVector vector that whose elements are tested against the
+ * current vector to build the maximum.
+ * @return this maximized vector
+*/
+RuntimeVector3 &RuntimeVector3::Maximize(const RuntimeVector3 &inVector)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ m_X = Q3DStudio_max<float>(m_X, inVector.m_X);
+ m_Y = Q3DStudio_max<float>(m_Y, inVector.m_Y);
+ m_Z = Q3DStudio_max<float>(m_Z, inVector.m_Z);
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Modifies the current vector by performing a linear interpolation
+ * between the current vector and the given vector.
+ *
+ * If inFactor is 0.0 then this vector remains unchanged. If inFactor is
+ * 1.0 then this vector becomes inDestVector. If inFactor is between 0.0-1.0
+ * then this vector becomes a vector between this old vector and inDestVector
+ * proportionally interpolated based in inFactor. If inFactor is less than 0
+ * or more than 1 then this vector is extrapolated.
+ *
+ * @param inDestVector Second vector for the interpolation
+ * @param inFactor Weight for the interpolation
+ * @return this interpolated vector
+ */
+RuntimeVector3 &RuntimeVector3::InterpolateLinear(const RuntimeVector3 &inDestVector, float inFactor)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ m_X += inFactor * (inDestVector.m_X - m_X);
+ m_Y += inFactor * (inDestVector.m_Y - m_Y);
+ m_Z += inFactor * (inDestVector.m_Z - m_Z);
+ return *this;
+}
+
+//==============================================================================
+/**
+ * Transforms this vector by the given matrix.
+ *
+ * The matrix is row column of the form Matrix[row][column]:
+@code
+ | m0 m1 m2 w |
+ | m4 m5 m6 w |
+ | m8 m9 m10 w |
+ | tX tY tZ w |
+@endcode
+ * @param inMatrix transform matrix
+ * @return this transformed vector
+ */
+RuntimeVector3 &RuntimeVector3::Transform(const RuntimeMatrix &inMatrix)
+{
+ PerfLogMathEvent1(DATALOGGER_VECTOR);
+ float theX = m_X;
+ float theY = m_Y;
+ float theZ = m_Z;
+
+ m_X = theX * inMatrix.Get(0, 0) + theY * inMatrix.Get(1, 0) + theZ * inMatrix.Get(2, 0);
+ m_Y = theX * inMatrix.Get(0, 1) + theY * inMatrix.Get(1, 1) + theZ * inMatrix.Get(2, 1);
+ m_Z = theX * inMatrix.Get(0, 2) + theY * inMatrix.Get(1, 2) + theZ * inMatrix.Get(2, 2);
+
+ m_X += inMatrix.Get(3, 0);
+ m_Y += inMatrix.Get(3, 1);
+ m_Z += inMatrix.Get(3, 2);
+
+ return *this;
+}
+
+} // namespace Q3DStudio
diff --git a/src/system/Qt3DSVector3.h b/src/system/Qt3DSVector3.h
new file mode 100644
index 0000000..08df028
--- /dev/null
+++ b/src/system/Qt3DSVector3.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#ifdef WIN32
+#pragma warning(disable : 4201)
+#endif
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class RuntimeMatrix;
+
+//==============================================================================
+/**
+ * 3D vector with automatic notification on change.
+ *
+ * This implementation of a 3D vector along with all the sibling and helper
+ * classes in the geometry section, try to strike a balance between clean code,
+ * ease-of-use and speed. Fields are public and most methods are designed to
+ * give the impression of a very intelligent and capable structure. Heavier
+ * code such as intersections is encouraged to be added externally instead
+ * of here.
+ *
+ * The vector is a member of the geometry classes next to CMatrix and CRotation
+ * @see CMatrix
+ * @see CRotation
+ */
+class RuntimeVector3
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+public:
+ union {
+ float m[3];
+ struct
+ {
+ float m_X;
+ float m_Y;
+ float m_Z;
+ };
+ };
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ RuntimeVector3();
+ RuntimeVector3(const float inVector[3]);
+ RuntimeVector3(const float inX, const float inY, const float inZ);
+ RuntimeVector3(const RuntimeVector3 &inVector);
+
+public: // Initialization
+ RuntimeVector3 &Set(const float inX, const float inY, const float inZ);
+ RuntimeVector3 &Set(const RuntimeVector3 &inVector);
+
+public: // Functions
+ float DistanceSquared(const RuntimeVector3 &inVector) const;
+ float Distance(const RuntimeVector3 &inVector) const;
+ float LengthSquared() const;
+ float Length() const;
+ float DotProduct(const RuntimeVector3 &inVector) const;
+ RuntimeVector3 &CrossProduct(const RuntimeVector3 &inVector);
+ RuntimeVector3 &Normalize();
+ RuntimeVector3 &Minimize(const RuntimeVector3 &inVector);
+ RuntimeVector3 &Maximize(const RuntimeVector3 &inVector);
+ RuntimeVector3 &InterpolateLinear(const RuntimeVector3 &inDestVector, float inFactor);
+ RuntimeVector3 &Transform(const RuntimeMatrix &inMatrix);
+
+public: // Operators
+ bool operator==(const RuntimeVector3 &inVector) const;
+ bool operator!=(const RuntimeVector3 &inVector) const;
+ RuntimeVector3 operator+(const RuntimeVector3 &inVector) const;
+ RuntimeVector3 operator-(const RuntimeVector3 &inVector) const;
+ RuntimeVector3 operator*(float inFactor) const;
+ RuntimeVector3 &operator=(const RuntimeVector3 &inVector);
+ RuntimeVector3 &operator+=(const RuntimeVector3 &inVector);
+ RuntimeVector3 &operator-=(const RuntimeVector3 &inVector);
+ RuntimeVector3 &operator*=(float inFactor);
+ RuntimeVector3 operator-() const;
+};
+
+} // namespace Q3DStudio
diff --git a/src/system/SystemPrefix.h b/src/system/SystemPrefix.h
new file mode 100644
index 0000000..aa1ba18
--- /dev/null
+++ b/src/system/SystemPrefix.h
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#ifdef _WIN32
+//==============================================================================
+// DEFINES
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+//==============================================================================
+// DISABLED WARNINGS
+//
+// Note that most of these warnings are tuned off by default by the compiler
+// even at warning level 4. Using option /Wall turns on all warnings and makes
+// even standard Microsoft include files cry. We had to turn off these or
+// turn off warnings individually for each standard include file which was
+// too much work. Point is that /Wall is like Warning Level 5 and this brings
+// it down to about Warning level 4.5, still way above /W4.
+#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
+#pragma warning(disable : 4511) // copy constructor could not be generated
+#pragma warning(disable : 4512) // assignment operator could not be generated
+#pragma warning(disable : 4514) // unreferenced inline function has been removed
+#pragma warning(disable : 4619) // #pragma warning : there is no warning number '4619' (in string.h)
+#pragma warning(disable : 4625) // copy constructor could not be generated because a base class copy
+ // constructor is inaccessible
+#pragma warning(disable : 4626) // assignment operator could not be generated because a base class
+ // assignment operator is inaccessible
+#pragma warning(disable : 4826) // Conversion from 'const void *' to 'void *' is sign-extended
+#pragma warning(disable : 4996) // _snprintf' was declared deprecated
+#pragma warning(disable : 4711) // function selected for automatic inline expansion
+#pragma warning(disable : 4710) // function not inlined
+#pragma warning(disable : 4355) // 'this' : used in base member initializer list
+
+#pragma warning(disable : 4640) // construction of local static object is not thread-safe
+#pragma warning(disable : 4127) // conditional expression is constant
+#pragma warning( \
+ disable : 4738) // storing 32-bit float result in memory, possible loss of performance
+#endif //_WIN32
+
+//==============================================================================
+// STD INCLUDES - Standard includes MUST come first
+#include <stdlib.h> // Standard functions
+#include <stdio.h> // File and IO
+#ifndef _INTEGRITYPLATFORM
+#include <memory.h> // memset, memcpy
+#endif
+#include <string.h> // strlen
+#include <math.h> // Bezier math - pow, acos, cos, sqrt
+#include <ctype.h> // _tolower
+
+#if defined(_LINUXPLATFORM) || defined(_INTEGRITYPLATFORM)
+#include <stdint.h>
+#endif
+
+//==============================================================================
+// OUR INCLUDES
+#include "Qt3DSTypes.h"
+#include "Qt3DSPlatformSpecific.h"
+#include "Qt3DSAssert.h"
+#include "Qt3DSMacros.h"
+#include "Qt3DSConfig.h"
+#include "Qt3DSMemorySettings.h"
+#include "Qt3DSMemory.h"
+#include "Qt3DSArray.h"
diff --git a/src/uipparser/Qt3DSIPresentation.h b/src/uipparser/Qt3DSIPresentation.h
new file mode 100644
index 0000000..a9d3644
--- /dev/null
+++ b/src/uipparser/Qt3DSIPresentation.h
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+#include "Qt3DSEventCallbacks.h"
+
+namespace qt3ds {
+namespace runtime {
+ class IApplication;
+ class IActivityZone;
+ class IAnimationSystem;
+ class ISlideSystem;
+ class ILogicSystem;
+ class IParametersSystem;
+}
+}
+
+namespace qt3ds {
+namespace foundation {
+ class IStringTable;
+}
+}
+
+namespace Q3DStudio {
+
+class IComponentManager;
+class IEventManager;
+class IScene;
+class IScriptBridge;
+class CPresentationFrameData;
+class CTimePolicy;
+using qt3ds::runtime::ISlideSystem;
+using qt3ds::runtime::IAnimationSystem;
+using qt3ds::runtime::ILogicSystem;
+using qt3ds::runtime::IParametersSystem;
+
+// Method used to translate from presentation size to window size
+enum EScaleMode {
+ SCALEMODE_FREE, // Free scaling mode
+ SCALEMODE_EXACT, // Fixed presentation size
+ SCALEMODE_ASPECT, // Maintain aspect ratio
+ SCALEMODE_UNKNOWN, // ERROR! - Uninitialized scale mode
+};
+
+struct SPresentationSize
+{
+ SPresentationSize()
+ : m_Width(0)
+ , m_Height(0)
+ , m_ScaleMode(0)
+ {
+ }
+ UINT16 m_Width; // Native width of the presentation
+ UINT16 m_Height; // Native height of the presentation
+ UINT8 m_ScaleMode; // Presentation to window scale method
+ UINT8 m_Padding[3];
+};
+
+/**
+ * @interface IPresentation
+ * Base interface of the presentation.
+ */
+class IPresentation
+{
+public: // Construction
+ IPresentation() {}
+ virtual ~IPresentation() {}
+
+public: // Execution
+ virtual void ClearDirtyList() = 0;
+ virtual void PreUpdate(const TTimeUnit inGlobalTime) = 0;
+ virtual void BeginUpdate() = 0;
+ virtual void EndUpdate() = 0;
+ virtual void PostUpdate(const TTimeUnit inGlobalTime) = 0;
+
+public: // Bridge Control
+ virtual void SetScene(IScene *inScene) = 0;
+ virtual IScene *GetScene() const = 0;
+ virtual IScriptBridge *GetScriptBridgeQml() = 0;
+
+public: // Commands and Events
+ virtual void FireEvent(const TEventCommandHash inEventType, TElement *inTarget,
+ const UVariant *inArg1 = nullptr, const UVariant *inArg2 = nullptr,
+ const EAttributeType inType1 = ATTRIBUTETYPE_NONE,
+ const EAttributeType inType2 = ATTRIBUTETYPE_NONE) = 0;
+ virtual void FireCommand(const TEventCommandHash inEventType, TElement *inTarget,
+ const UVariant *inArg1 = nullptr, const UVariant *inArg2 = nullptr,
+ const EAttributeType inType1 = ATTRIBUTETYPE_NONE,
+ const EAttributeType inType2 = ATTRIBUTETYPE_NONE) = 0;
+ virtual void FlushEventCommandQueue(void) = 0;
+ virtual void ProcessEvent(SEventCommand &) = 0;
+
+public: // Manager Access
+ virtual IComponentManager &GetComponentManager() = 0;
+ virtual ISlideSystem &GetSlideSystem() = 0;
+ virtual IAnimationSystem &GetAnimationSystem() = 0;
+ virtual ILogicSystem &GetLogicSystem() = 0;
+ virtual IParametersSystem &GetParametersSystem() = 0;
+
+ virtual qt3ds::foundation::IStringTable &GetStringTable() = 0;
+ virtual qt3ds::runtime::IApplication &GetApplication() = 0;
+ virtual qt3ds::runtime::IActivityZone *GetActivityZone() = 0;
+
+public: // Hooks and callbacks
+ virtual void OnPresentationLoaded() = 0;
+
+public: // Full file path
+ virtual void SetFilePath(const CHAR *inPath) = 0;
+ virtual QString GetFilePath() const = 0;
+ virtual QString getProjectPath() const = 0;
+ virtual TElement *GetRoot() = 0;
+ virtual void SetRoot(TElement &inRoot) = 0;
+
+public: // Configuration access
+ virtual SPresentationSize GetSize() const = 0;
+ virtual void SetSize(const SPresentationSize &inSize) = 0;
+ virtual void SetElementPath(TElement &inElement, const char8_t *inPath) = 0;
+ virtual qt3ds::foundation::CRegisteredString GetElementPath(TElement &inElement) = 0;
+
+public: // Event Callbacks
+ virtual void RegisterEventCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData) = 0;
+ virtual BOOL UnregisterEventCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData) = 0;
+
+public: // FrameData access
+ virtual CPresentationFrameData &GetFrameData() = 0;
+};
+
+} // namespace Q3DStudio
diff --git a/src/uipparser/Qt3DSUIPParser.h b/src/uipparser/Qt3DSUIPParser.h
new file mode 100644
index 0000000..2b75f25
--- /dev/null
+++ b/src/uipparser/Qt3DSUIPParser.h
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "foundation/StringTable.h"
+#include <EASTL/string.h>
+
+namespace qt3ds {
+namespace state {
+ struct SSetAttribute;
+ namespace debugger {
+ class ISceneGraphRuntimeDebugger;
+ }
+}
+}
+
+namespace qt3ds {
+namespace render {
+ class IInputStreamFactory;
+}
+}
+
+//==============================================================================
+// Forwards
+//==============================================================================
+namespace qt3dsdm {
+class IDOMReader;
+class IStringTable;
+}
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+using namespace qt3ds::foundation;
+//==============================================================================
+// Forwards
+//==============================================================================
+class IRuntimeMetaData;
+class IPresentation;
+
+struct UIPElementTypes
+{
+ enum Enum {
+ Unknown = 0,
+ Scene = 1,
+ Node,
+ Layer,
+ Component,
+ Group,
+ Behavior,
+ Model,
+ Light,
+ Camera,
+ Image,
+ Material,
+ Text,
+ Effect,
+ RenderPlugin,
+ CustomMaterial,
+ ReferencedMaterial,
+ Path,
+ PathAnchorPoint,
+ PathSubPath,
+ };
+};
+
+struct SElementAndType
+{
+ UIPElementTypes::Enum m_Type;
+ TElement *m_Element;
+ SElementAndType(UIPElementTypes::Enum inType, TElement *elem)
+ : m_Type(inType)
+ , m_Element(elem)
+ {
+ }
+};
+
+// Ensure these elements exist and if the attribute isn't empty ensure the attribute is referenced.
+struct SElementAttributeReference
+{
+ eastl::string m_Path;
+ eastl::string m_Attribute;
+ SElementAttributeReference(const eastl::string &p, const eastl::string &a)
+ : m_Path(p)
+ , m_Attribute(a)
+ {
+ }
+};
+//==============================================================================
+/**
+ * @class CUIPParser
+ * @brief Class for parsing UIP file
+ */
+
+class IUIPParser : public NVReleasable
+{
+protected:
+ virtual ~IUIPParser() {}
+public: // Parse UIP file
+ virtual BOOL Load(IPresentation &inPresentation,
+ NVConstDataRef<SElementAttributeReference> inStateReferences) = 0;
+ virtual qt3dsdm::IDOMReader &GetDOMReader() = 0;
+ virtual IRuntimeMetaData &GetMetaData() = 0;
+ // Mapping back from file id to element id, needed to hook elements up to their respective
+ // parsed
+ // counterparts.
+ virtual SElementAndType GetElementForID(const char *inStringId) = 0;
+ virtual eastl::string ResolveReference(const char *inStringId, const char *inReferance) = 0;
+ // The rendering system needs to know every sourcepath found during parse of the UIP file
+ // so that it can do things like register images as opaque/transparent as well as preload
+ // mesh files (and possibly font files).
+ virtual NVConstDataRef<eastl::string> GetSourcePaths() const = 0;
+ virtual bool isIblImage(const eastl::string &sourcepath) const = 0;
+
+ virtual QVector<QString> GetSlideSourcePaths() const = 0;
+
+ // Creation function
+ static IUIPParser &Create(const QString &inFileName, IRuntimeMetaData &inMetaData,
+ qt3ds::render::IInputStreamFactory &inStreamFactory,
+ qt3ds::foundation::IStringTable &inStrTable);
+};
+
+} // namespace Q3DStudio
diff --git a/src/uipparser/Qt3DSUIPParserActionHelper.cpp b/src/uipparser/Qt3DSUIPParserActionHelper.cpp
new file mode 100644
index 0000000..ab6d751
--- /dev/null
+++ b/src/uipparser/Qt3DSUIPParserActionHelper.cpp
@@ -0,0 +1,738 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+#ifdef EA_PLATFORM_WINDOWS
+#pragma warning(disable : 4396) // specializer warning nonsense
+#endif
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSUIPParserActionHelper.h"
+#include "Qt3DSUIPParserObjectRefHelper.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSCommandEventTypes.h"
+
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMXML.h"
+#include "Qt3DSDMWStrOpsImpl.h"
+#include "Qt3DSMetadata.h"
+#include "Qt3DSEulerAngles.h"
+#include "Qt3DSLogicSystem.h"
+#include "Qt3DSParametersSystem.h"
+
+using namespace qt3dsdm;
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * Constructor
+ */
+CUIPParserActionHelper::CUIPParserActionHelper(CUIPParserImpl *inUIPParser,
+ CUIPParserObjectRefHelper *inObjRefHelper,
+ IRuntimeMetaData &inMetaData)
+ : m_UIPParser(inUIPParser)
+ , m_ObjRefHelper(inObjRefHelper)
+ , m_MetaData(inMetaData)
+{
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CUIPParserActionHelper::~CUIPParserActionHelper()
+{
+}
+
+void CUIPParserActionHelper::CacheAction(qt3dsdm::IDOMReader &inReader,
+ const char8_t *inActionOwnerId)
+{
+ if (IsTrivial(inActionOwnerId))
+ return;
+
+ IDOMReader::Scope __childScope(inReader);
+
+ const char *theRef;
+ if (inReader.Att("ref", theRef)) {
+ // Ignore "ref" because we are only interested in new actions
+ return;
+ }
+
+ // Parse the action
+ SActionInfo theAction;
+ inReader.Att("id", theAction.m_Id);
+ theAction.m_Owner = inActionOwnerId;
+
+ const char *tempStr;
+ if (inReader.Att("triggerObject", tempStr))
+ theAction.m_TriggerObject = m_UIPParser->ParseObjectRefId(tempStr, inActionOwnerId);
+ inReader.Att("event", theAction.m_Event);
+ if (inReader.Att("targetObject", tempStr))
+ theAction.m_TargetObject = m_UIPParser->ParseObjectRefId(tempStr, inActionOwnerId);
+ if (inReader.Att("handler", tempStr)) {
+ theAction.m_Handler = tempStr;
+ CacheHandlerArguments(inReader, theAction);
+ }
+
+ // Only proceeds if we can find the elements
+ if (theAction.m_TargetObject.empty() || theAction.m_TriggerObject.empty()
+ || theAction.m_Owner.empty()) {
+ qCWarning(qt3ds::INVALID_OPERATION) << "Action invalid, id: " << theAction.m_Id.c_str();
+ return;
+ }
+
+ m_ActionMap[theAction.m_Id] = theAction;
+
+ // Build up logic tables to be processed by BuildAction later
+ // There are 2 tables involved:
+ // 1. The Listener-To-Events tables - multimap of each listener to all events it is listening to
+ // 2. The Listener-Event-To-Actions table - multimap of each listener-event pair to all actions
+ // it triggers
+ // note: The struct for Action is a pair of EventAction node and its owner
+ AddListenerEventPair(theAction.m_TriggerObject, theAction.m_Event);
+
+ SListenerEventNamePair theListenerEventPair(theAction.m_TriggerObject, theAction.m_Event);
+ TEventActionOwnerPair theLogicOwnerPair(theAction.m_Id, theAction.m_Owner);
+ m_ListenerEventActionsMap.insert(eastl::make_pair(theListenerEventPair, theLogicOwnerPair));
+}
+
+void CUIPParserActionHelper::AddListenerEventPair(eastl::string inListener,
+ const eastl::string &inEventName)
+{
+ // Check for dupes
+ TListenerEventsNameMap::iterator theStartItr = m_ListenerEventsNameMap.lower_bound(inListener);
+ TListenerEventsNameMap::iterator theEndItr = m_ListenerEventsNameMap.upper_bound(inListener);
+ for (; theStartItr != theEndItr; ++theStartItr) {
+ if (theStartItr->second == inEventName)
+ return;
+ }
+
+ m_ListenerEventsNameMap.insert(eastl::make_pair(inListener, inEventName));
+}
+
+void CUIPParserActionHelper::CacheHandlerArguments(qt3dsdm::IDOMReader &inReader,
+ SActionInfo &inAction)
+{
+ IDOMReader::Scope __handlerArgScope(inReader);
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ SHandlerArgumentInfo theArg;
+ inReader.Att("name", theArg.m_Name);
+ inReader.Att("value", theArg.m_Value);
+ inAction.m_HandlerArgs.push_back(theArg);
+ }
+ if (inAction.m_Handler == "Set Property") {
+ SHandlerArgumentInfo theHandlerArg1 = inAction.m_HandlerArgs[0];
+ SElementData *targetData = m_UIPParser->GetElementData(inAction.m_TargetObject.c_str());
+ if (targetData && !theHandlerArg1.m_Value.empty()) {
+ m_UIPParser->m_ParseElementManager.MarkAttributeAsReferenced(
+ *targetData, theHandlerArg1.m_Value.c_str());
+ }
+ }
+}
+
+SElement *CUIPParserActionHelper::GetElement(const eastl::string &inElementName)
+{
+ return m_UIPParser->GetElement(inElementName.c_str());
+}
+
+void CUIPParserActionHelper::GetActionSectionCount(
+ CUIPParserImpl::SActionSectionCount &outActionCount)
+{
+ // There are 2 tables involved:
+ // 1. The Listener-To-Events tables - multimap of each listener to all events it is listening to
+ // 2. The Listener-Event-To-Actions table - multimap of each listener-event pair to all actions
+ // it triggers
+ // note: The struct for Action is a pair of EventAction node and its owner
+
+ // Get the count to reserve
+ // Iterate through each listener
+ for (TListenerEventsNameMap::iterator theListenerItr = m_ListenerEventsNameMap.begin();
+ theListenerItr != m_ListenerEventsNameMap.end();) {
+ ++outActionCount.m_TriggerElementCount;
+
+ INT32 theEventCount =
+ static_cast<INT32>(m_ListenerEventsNameMap.count(theListenerItr->first));
+ for (INT32 theEventCounter = 0; theEventCounter < theEventCount;
+ ++theEventCounter, ++theListenerItr) {
+ ++outActionCount.m_TriggerEventCount;
+
+ // iterate through each listener-event pair
+ SListenerEventNamePair thePair(theListenerItr->first, theListenerItr->second);
+ TListenerEventActionsMap::iterator theActionsItr =
+ m_ListenerEventActionsMap.lower_bound(thePair);
+ INT32 theActionCount = static_cast<INT32>(m_ListenerEventActionsMap.count(thePair));
+ for (INT32 theActionCounter = 0; theActionCounter < theActionCount;
+ ++theActionCounter) {
+ eastl::string theActionId = theActionsItr->second.first;
+ outActionCount.m_ActionCount +=
+ GetActionCount(theActionId, outActionCount.m_StringAttrCount,
+ outActionCount.m_CustomParamCount);
+ ++theActionsItr;
+ }
+ }
+ }
+}
+
+void CUIPParserActionHelper::BuildActions(IPresentation &inPresentation)
+{
+ // Now we start building
+ // Iterate through each listener
+ for (TListenerEventsNameMap::iterator theListenerItr = m_ListenerEventsNameMap.begin();
+ theListenerItr != m_ListenerEventsNameMap.end();) {
+ TElement *theElement = GetElement(theListenerItr->first);
+
+ INT32 theEventCount =
+ static_cast<INT32>(m_ListenerEventsNameMap.count(theListenerItr->first));
+ for (INT32 theEventCounter = 0; theEventCounter < theEventCount;
+ ++theEventCounter, ++theListenerItr) {
+ UINT32 theEventName =
+ CHash::HashEventCommand(theListenerItr->second.c_str()); // UINT32: HashedName
+
+ // iterate through each listener-event pair
+ SListenerEventNamePair thePair(theListenerItr->first, theListenerItr->second);
+ TListenerEventActionsMap::iterator theActionsItr =
+ m_ListenerEventActionsMap.lower_bound(thePair);
+ INT32 theActionCount = static_cast<INT32>(m_ListenerEventActionsMap.count(thePair));
+ for (INT32 theActionCounter = 0; theActionCounter < theActionCount;
+ ++theActionCounter) {
+ eastl::string theActionId = theActionsItr->second.first;
+ if (theElement)
+ BuildAction(*theElement, theEventName, inPresentation, theActionId);
+ ++theActionsItr;
+ }
+ }
+ }
+}
+
+union UTypeConverter {
+ SAttributeKey m_Key;
+ INT32 m_IntData;
+};
+
+struct SActionAdder
+{
+ ILogicSystem &m_LogicSystem;
+ TElement &m_EventElement;
+ UINT32 m_EventName;
+ TElement *m_Owner;
+ TElement *m_Target;
+
+ SActionAdder(ILogicSystem &inLogicSystem, TElement &inEventElement, UINT32 inEventName,
+ TElement *inOwner, TElement *inTarget)
+ : m_LogicSystem(inLogicSystem)
+ , m_EventElement(inEventElement)
+ , m_EventName(inEventName)
+ , m_Owner(inOwner)
+ , m_Target(inTarget)
+ {
+ }
+
+ INT32 AddAction(TEventCommandHash inCommand, UINT32 inArg1 = 0, UINT32 inArg2 = 0)
+ {
+ UVariant arg1Var;
+ UVariant arg2Var;
+ arg1Var.m_INT32 = (INT32)inArg1;
+ arg2Var.m_INT32 = (INT32)inArg2;
+ return m_LogicSystem.AddAction(m_EventElement, m_EventName, m_Target, m_Owner, inCommand,
+ arg1Var, arg2Var, true);
+ }
+};
+
+void CUIPParserActionHelper::BuildAction(TElement &inElement, UINT32 inEventName,
+ IPresentation &inPresentation,
+ const eastl::string &inActionId)
+{
+ ILogicSystem &theLogicBuilder = inPresentation.GetLogicSystem();
+ IParametersSystem &theParamSystem = inPresentation.GetParametersSystem();
+ TActionMap::iterator theIter = m_ActionMap.find(inActionId);
+ if (theIter == m_ActionMap.end()) {
+ Q3DStudio_ASSERT(false);
+ qCWarning(qt3ds::INVALID_OPERATION) << "Can't find action, id: " << inActionId.c_str();
+ return;
+ }
+
+ SActionInfo theAction = theIter->second;
+ INT32 theAddActionIndex = -1; // the index of newly added action. If there are more than 1
+ // actions, the index points to the firstly added action.
+ SActionAdder theAdder(theLogicBuilder, inElement, inEventName, GetElement(theAction.m_Owner),
+ GetElement(theAction.m_TargetObject));
+
+ // The list of applicable handler is loaded from metadata xml file (if it is non-custom handler)
+ bool theIsCustomHandler = IsCustomHandler(theAction);
+
+ if (theIsCustomHandler) {
+ // Argument 1 - param table start index
+ INT32 paramGroup = theParamSystem.CreateParameterGroup();
+
+ // First param is the handler name we want to invoke for the custom action.
+ ExportCustomActionParameters(inPresentation, theParamSystem, paramGroup,
+ theAction.m_Handler.c_str(), ERuntimeDataModelDataTypeString,
+ ERuntimeAdditionalMetaDataTypeNone);
+
+ int theHandlerArgumentCount = theAction.m_HandlerArgs.size();
+ ERuntimeDataModelDataType theType;
+ ERuntimeAdditionalMetaDataType theAdditionalType;
+ // Actual handler parameters to pass in.
+ for (int theIndex = 0; theIndex < theHandlerArgumentCount; ++theIndex) {
+ GetHandlerArgumentType(theAction, theIndex, theType, theAdditionalType);
+ ExportCustomActionParameters(inPresentation, theParamSystem, paramGroup,
+ theAction.m_HandlerArgs[theIndex].m_Value.c_str(), theType,
+ theAdditionalType);
+ }
+ theAddActionIndex = theAdder.AddAction(COMMAND_CUSTOMACTION, (UINT32)paramGroup);
+ } else if (theAction.m_Handler == "Set Property") // Plain set action
+ {
+ // ArgumentOne - HashPropertyName
+ // ArgumentTwo - Value
+ SHandlerArgumentInfo theHandlerArg1 = theAction.m_HandlerArgs[0];
+ SHandlerArgumentInfo theHandlerArg2 = theAction.m_HandlerArgs[1];
+
+ eastl::string thePropertyName = theHandlerArg1.m_Value;
+ SElementData *theTargetObject =
+ m_UIPParser->GetElementData(theAction.m_TargetObject.c_str());
+ if (theTargetObject) {
+ SElementPropertyInfo *theProperty = m_UIPParser->m_ParseElementManager.FindProperty(
+ *theTargetObject, thePropertyName.c_str());
+ if (theProperty) {
+ TPropertyDescAndValueList theProperties;
+ ERuntimeDataModelDataType theType = theProperty->m_DataType;
+ ERuntimeAdditionalMetaDataType theAdditionalType = theProperty->m_AdditionalType;
+
+ m_UIPParser->GetAttributeList(inPresentation, theProperties, theType,
+ theAdditionalType, thePropertyName.c_str(),
+ theHandlerArg2.m_Value.c_str(),
+ theProperty->m_PropertyNames);
+
+ UINT32 theActionCount = theProperties.size();
+ Q3DStudio_ASSERT(theActionCount > 0);
+ for (UINT32 theActionIndex = 0; theActionIndex < theActionCount; ++theActionIndex) {
+ INT32 actionId = theAdder.AddAction(
+ COMMAND_SETPROPERTY, theProperties[theActionIndex].first.GetNameHash(),
+ theProperties[theActionIndex].second.m_INT32);
+ if (theActionIndex == 0)
+ theAddActionIndex = actionId;
+ }
+ }
+ }
+ } else if (theAction.m_Handler == "Fire Event") // Fire the selected event on the element
+ {
+ theAddActionIndex = theAdder.AddAction(
+ COMMAND_FIREEVENT, CHash::HashEventCommand(theAction.m_HandlerArgs[0].m_Value.c_str()));
+ } else if (theAction.m_Handler == "Go to Slide") // Switch slides
+ {
+ theAddActionIndex = theAdder.AddAction(
+ COMMAND_GOTOSLIDENAME, CHash::HashString(theAction.m_HandlerArgs[0].m_Value.c_str()));
+ } else if (theAction.m_Handler == "Next Slide") // Switch slides
+ {
+ theAddActionIndex = theAdder.AddAction(COMMAND_GOTONEXTSLIDE);
+ } else if (theAction.m_Handler == "Previous Slide") // Switch slides
+ {
+ theAddActionIndex = theAdder.AddAction(COMMAND_GOTOPREVIOUSSLIDE);
+ } else if (theAction.m_Handler == "Preceding Slide") // Switch slides
+ {
+ theAddActionIndex = theAdder.AddAction(COMMAND_BACKSLIDE);
+ } else if (theAction.m_Handler == "Play") // Play
+ {
+ theAddActionIndex = theAdder.AddAction(COMMAND_PLAY);
+ } else if (theAction.m_Handler == "Pause") // Pause
+ {
+ theAddActionIndex = theAdder.AddAction(COMMAND_PAUSE);
+ } else if (theAction.m_Handler == "Go to Time") // Goto Time
+ {
+ float theTime = 0;
+ const char *theValue = theAction.m_HandlerArgs[0].m_Value.c_str();
+ if (!IsTrivial(theValue))
+ WStrOps<float>().StrTo(theValue, theTime);
+
+ theAddActionIndex =
+ theAdder.AddAction(COMMAND_GOTOTIME, static_cast<UINT32>(theTime * 1000.0f));
+
+ bool thePause = false;
+ theValue = theAction.m_HandlerArgs[1].m_Value.c_str();
+ if (!IsTrivial(theValue))
+ WStrOps<bool>().StrTo(theValue, thePause);
+ theAdder.AddAction(thePause ? COMMAND_PAUSE : COMMAND_PLAY);
+ } else if (theAction.m_Handler == "Emit Signal") // Emit a signal
+ {
+ qt3ds::foundation::CStringHandle theStringHandle;
+ if (!theAction.m_HandlerArgs[0].m_Value.empty()) {
+ const char *theValue = theAction.m_HandlerArgs[0].m_Value.c_str();
+ theStringHandle = inPresentation.GetStringTable().GetHandle(theValue);
+ }
+ theAddActionIndex = theAdder.AddAction(COMMAND_EMITSIGNAL, theStringHandle.handle());
+ } else {
+ Q3DStudio_ASSERT(false); // what sort of crazy action is this?
+ }
+
+ if (theAddActionIndex > -1)
+ m_ActionIdentifierMap[theAction.m_Id] = theAddActionIndex;
+}
+
+INT32 CUIPParserActionHelper::GetActionCount(const eastl::string &inActionId)
+{
+ INT32 theStringAttrCount = 0;
+ INT32 theCustomParamCount = 0;
+ return GetActionCount(inActionId, theStringAttrCount, theCustomParamCount);
+}
+
+INT32 CUIPParserActionHelper::GetActionCount(const eastl::string &inActionId,
+ INT32 &outStringAttrCount, INT32 &outCustomParamCount)
+{
+ INT32 theActionCount = 0;
+
+ TActionMap::iterator theIter = m_ActionMap.find(inActionId);
+ if (theIter == m_ActionMap.end()) {
+ Q3DStudio_ASSERT(false);
+ qCWarning(qt3ds::INVALID_OPERATION) << "Can't find action, id: " << inActionId.c_str();
+ return theActionCount;
+ }
+
+ SActionInfo theAction = theIter->second;
+
+ // The list of applicable handler is loaded from metadata xml file (if it is non-custom handler)
+ bool theIsCustomHandler = IsCustomHandler(theAction);
+
+ if (theIsCustomHandler) {
+ theActionCount = 1;
+
+ // First param is the handler name we want to invoke for the custom action.
+ ++outStringAttrCount;
+ ++outCustomParamCount;
+
+ int theHandlerArgumentCount = theAction.m_HandlerArgs.size();
+ ERuntimeDataModelDataType theType;
+ ERuntimeAdditionalMetaDataType theAdditionalType;
+ // Actual handler parameters to pass in.
+ for (int theIndex = 0; theIndex < theHandlerArgumentCount; ++theIndex) {
+ GetHandlerArgumentType(theAction, theIndex, theType, theAdditionalType);
+ GetCustomActionParametersCount(theType, theAdditionalType, outStringAttrCount,
+ outCustomParamCount);
+ }
+ }
+
+ else if (theAction.m_Handler == "Set Property") // Plain set action
+ {
+ SHandlerArgumentInfo theHandlerArg1 = theAction.m_HandlerArgs[0];
+
+ eastl::string thePropertyName = theHandlerArg1.m_Value;
+ SElementData *theData = m_UIPParser->GetElementData(theAction.m_TargetObject.c_str());
+ if (theData) {
+ SElementPropertyInfo *thePropertyInfo =
+ m_UIPParser->m_ParseElementManager.GetOrCreateProperty(*theData,
+ thePropertyName.c_str());
+ if (thePropertyInfo) {
+ theActionCount = thePropertyInfo->m_Arity;
+ if (m_UIPParser->IsStringType(thePropertyInfo->m_DataType))
+ ++outStringAttrCount;
+ }
+ }
+ }
+
+ else if (theAction.m_Handler == "Fire Event" // Fire the selected event on the element
+ || theAction.m_Handler == "Go to Slide" // Switch slides
+ || theAction.m_Handler == "Next Slide" // Switch slides
+ || theAction.m_Handler == "Previous Slide" // Switch slides
+ || theAction.m_Handler == "Preceding Slide" // Switch slides
+ || theAction.m_Handler == "Play" // Play
+ || theAction.m_Handler == "Pause" // Pause
+ ) {
+ theActionCount = 1;
+ }
+
+ else if (theAction.m_Handler == "Go to Time") // Goto Time
+ {
+ theActionCount = 2;
+ } else if (theAction.m_Handler == "Play Sound") // Play Sound
+ {
+ theActionCount = 1;
+ ++outStringAttrCount;
+ } else if (theAction.m_Handler == "Emit Signal") // Emit Signal
+ {
+ theActionCount = 1;
+ ++outStringAttrCount;
+ } else {
+ Q3DStudio_ASSERT(false); // what sort of crazy action is this?
+ }
+
+ return theActionCount;
+}
+
+INT32 CUIPParserActionHelper::GetActionIndex(const eastl::string &inActionId)
+{
+ TActionIdentifierMap::iterator theFind = m_ActionIdentifierMap.find(inActionId);
+ if (theFind != m_ActionIdentifierMap.end())
+ return theFind->second;
+ Q3DStudio_ASSERT(false);
+ return -1;
+}
+
+bool CUIPParserActionHelper::IsCustomHandler(const SActionInfo &inAction)
+{
+ const char *theClass = m_ObjRefHelper->GetClass(inAction.m_TargetObject);
+ if (!IsTrivial(theClass))
+ return m_MetaData.IsCustomHandler(theClass, inAction.m_Handler.c_str());
+ return false;
+}
+
+void CUIPParserActionHelper::GetHandlerArgumentType(
+ const SActionInfo &inAction, int inArgumentIndex, ERuntimeDataModelDataType &outType,
+ ERuntimeAdditionalMetaDataType &outAdditionalType)
+{
+ const char *theClass = m_ObjRefHelper->GetClass(inAction.m_TargetObject);
+ return m_MetaData.GetHandlerArgumentType(theClass, inAction.m_Handler.c_str(),
+ inAction.m_HandlerArgs[inArgumentIndex].m_Name.c_str(),
+ outType, outAdditionalType);
+}
+
+void CUIPParserActionHelper::GetCustomActionParametersCount(
+ ERuntimeDataModelDataType inDataType, ERuntimeAdditionalMetaDataType inAdditionalType,
+ INT32 &outStringAttrCount, INT32 &outCustomParamCount)
+{
+ // This function should match ExportCustomActionParameters
+ switch (inDataType) {
+ case ERuntimeDataModelDataTypeFloat:
+ case ERuntimeDataModelDataTypeLong:
+ case ERuntimeDataModelDataTypeBool: {
+ outCustomParamCount += 1;
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat2: {
+ outCustomParamCount += 2;
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat3: {
+ if (inAdditionalType == ERuntimeAdditionalMetaDataTypeColor) {
+ // Append rgba
+ outCustomParamCount += 4;
+ } else {
+ // Append xyz
+ outCustomParamCount += 3;
+ }
+ break;
+ }
+ // default to string
+ default: {
+ outCustomParamCount += 1;
+ outStringAttrCount += 1;
+ }
+ }
+}
+
+namespace {
+
+ using qt3ds::foundation::IStringTable;
+
+ struct SCustomParameterParseInfoFloat
+ {
+ typedef float TParseType;
+ static const char8_t *Name() { return "float"; }
+ static TParseType Default() { return 0; }
+ static Q3DStudio::UVariant ToVariant(const TParseType &inParseType)
+ {
+ Q3DStudio::UVariant retval;
+ retval.m_FLOAT = inParseType;
+ return retval;
+ }
+ };
+
+ struct SCustomParameterParseInfoLong
+ {
+ typedef QT3DSI32 TParseType;
+ static const char8_t *Name() { return "long"; }
+ static TParseType Default() { return 0; }
+ static Q3DStudio::UVariant ToVariant(const TParseType &inParseType)
+ {
+ Q3DStudio::UVariant retval;
+ retval.m_FLOAT = static_cast<float>(inParseType);
+ return retval;
+ }
+ };
+
+ struct SCustomParameterParseInfoBool
+ {
+ typedef bool TParseType;
+ static const char8_t *Name() { return "bool"; }
+ static TParseType Default() { return false; }
+ static Q3DStudio::UVariant ToVariant(const TParseType &inParseType)
+ {
+ Q3DStudio::UVariant retval;
+ retval.m_FLOAT = static_cast<float>(inParseType);
+ return retval;
+ }
+ };
+
+ struct SCustomParameterParseInfoFloat2
+ {
+ typedef SFloat2 TParseType;
+ static const char8_t *Name() { return "float2"; }
+ static TParseType Default() { return SFloat2(0, 0); }
+ static QT3DSU32 NumParameters() { return 2; }
+ static Q3DStudio::UVariant ToVariant(QT3DSU32 inIdx, const TParseType &inParseType)
+ {
+ Q3DStudio::UVariant retval;
+ retval.m_FLOAT = static_cast<float>(inParseType[inIdx]);
+ return retval;
+ }
+ };
+
+ struct SCustomParameterParseInfoFloat3
+ {
+ typedef SFloat3 TParseType;
+ static const char8_t *Name() { return "float3"; }
+ static const char8_t **Extensions()
+ {
+ static const char8_t *retval[] = { ".x", ".y", ".z", NULL };
+ return retval;
+ }
+ static TParseType Default() { return SFloat3(0, 0, 0); }
+ static QT3DSU32 NumParameters() { return 3; }
+ static Q3DStudio::UVariant ToVariant(QT3DSU32 inIdx, const TParseType &inParseType)
+ {
+ Q3DStudio::UVariant retval;
+ retval.m_FLOAT = static_cast<float>(inParseType[inIdx]);
+ return retval;
+ }
+ };
+
+ struct SCustomParameterParseInfoColor
+ {
+ typedef SFloat3 TParseType;
+ static const char8_t *Name() { return "color4"; }
+ static TParseType Default() { return SFloat3(0, 0, 0); }
+ static QT3DSU32 NumParameters() { return 4; }
+ static Q3DStudio::UVariant ToVariant(QT3DSU32 inIdx, const TParseType &inParseType)
+ {
+ if (inIdx < 3) {
+ Q3DStudio::UVariant retval;
+ retval.m_FLOAT = static_cast<float>(inParseType[inIdx]) * 255.0f;
+ return retval;
+ } else {
+ Q3DStudio::UVariant retval;
+ retval.m_FLOAT = 255.0f;
+ return retval;
+ }
+ }
+ };
+
+ template <typename TParseInfo>
+ struct ParseParameter
+ {
+ void operator()(WCharTReader &inReader, const char *inValue, IParametersSystem &inSystem,
+ QT3DSI32 inGroupId)
+ {
+ typename TParseInfo::TParseType theValue = TParseInfo::Default();
+ if (!IsTrivial(inValue))
+ inReader.Read(theValue);
+ Q3DStudio::UVariant theVarValue = TParseInfo::ToVariant(theValue);
+ inSystem.AddParameter(inGroupId, CHash::HashString(TParseInfo::Name()), theVarValue);
+ }
+ };
+
+ template <typename TParseInfo>
+ struct ParseAggregateParameter
+ {
+ void operator()(WCharTReader &inReader, const char *inValue, IParametersSystem &inSystem,
+ QT3DSI32 inGroupId)
+ {
+ typename TParseInfo::TParseType theValue = TParseInfo::Default();
+ if (!IsTrivial(inValue))
+ inReader.ReadRef(NVDataRef<float>(&theValue[0], TParseInfo::NumParameters()));
+
+ for (QT3DSU32 idx = 0, end = TParseInfo::NumParameters(); idx < end; ++idx) {
+ Q3DStudio::UVariant theVarValue = TParseInfo::ToVariant(idx, theValue);
+ inSystem.AddParameter(inGroupId, CHash::HashString(TParseInfo::Name()),
+ theVarValue);
+ }
+ }
+ };
+}
+
+void CUIPParserActionHelper::ExportCustomActionParameters(
+ IPresentation &inPresentation, IParametersSystem &inParamSystem, QT3DSI32 inParamGroupId,
+ const char *inValue, ERuntimeDataModelDataType inDataType,
+ ERuntimeAdditionalMetaDataType inAdditionalType)
+{
+ // Create a destructible value
+ m_UIPParser->m_ValueBuffer.clear();
+ m_UIPParser->m_ValueBuffer.write(inValue, (QT3DSU32)strlen(inValue) + 1);
+ // Clear the destination buffer
+ m_UIPParser->m_TempBuffer.clear();
+ WCharTReader theReader((char8_t *)m_UIPParser->m_ValueBuffer.begin(), m_UIPParser->m_TempBuffer,
+ *m_UIPParser->GetDOMReader().GetStringTable());
+
+ // The function should match CUIPParserActionHelper::GetCustomActionParametersCount
+ switch (inDataType) {
+ case ERuntimeDataModelDataTypeFloat: {
+ ParseParameter<SCustomParameterParseInfoFloat>()(theReader, inValue, inParamSystem,
+ inParamGroupId);
+ break;
+ }
+ case ERuntimeDataModelDataTypeLong: {
+ ParseParameter<SCustomParameterParseInfoLong>()(theReader, inValue, inParamSystem,
+ inParamGroupId);
+ break;
+ }
+ case ERuntimeDataModelDataTypeBool: {
+ ParseParameter<SCustomParameterParseInfoBool>()(theReader, inValue, inParamSystem,
+ inParamGroupId);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat2: {
+ ParseAggregateParameter<SCustomParameterParseInfoFloat2>()(theReader, inValue,
+ inParamSystem, inParamGroupId);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat3: {
+ if (inAdditionalType == ERuntimeAdditionalMetaDataTypeColor) {
+ ParseAggregateParameter<SCustomParameterParseInfoColor>()(
+ theReader, inValue, inParamSystem, inParamGroupId);
+ } else {
+ ParseAggregateParameter<SCustomParameterParseInfoFloat3>()(
+ theReader, inValue, inParamSystem, inParamGroupId);
+ }
+ break;
+ }
+ // default to string
+ default: {
+ UVariant theValue;
+ theValue.m_StringHandle = inPresentation.GetStringTable().GetHandle(inValue);
+ inParamSystem.AddParameter(inParamGroupId, CHash::HashString("string"), theValue);
+ break;
+ }
+ }
+}
+}
diff --git a/src/uipparser/Qt3DSUIPParserActionHelper.h b/src/uipparser/Qt3DSUIPParserActionHelper.h
new file mode 100644
index 0000000..3d9d44c
--- /dev/null
+++ b/src/uipparser/Qt3DSUIPParserActionHelper.h
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSUIPParserImpl.h"
+
+namespace qt3ds {
+namespace runtime {
+ class IParametersSystem;
+}
+}
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+using qt3ds::runtime::IParametersSystem;
+//==============================================================================
+// Forwards
+//==============================================================================
+
+//==============================================================================
+/**
+ * @class CUIPParserActionHelper
+ * @brief Class for parsing UIP file - Action
+ */
+class CUIPParserActionHelper
+{
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ CUIPParserImpl *m_UIPParser;
+ CUIPParserObjectRefHelper *m_ObjRefHelper;
+ IRuntimeMetaData &m_MetaData; ///< Reference to Metadata
+
+ typedef eastl::map<eastl::string, INT32> TActionIdentifierMap; ///< Mapping of the string that
+ ///uniquely identify the action
+ ///to the index created
+ TActionIdentifierMap m_ActionIdentifierMap;
+
+ struct SHandlerArgumentInfo
+ {
+ eastl::string m_Name;
+ eastl::string m_Value;
+
+ SHandlerArgumentInfo() {}
+ };
+ typedef eastl::vector<SHandlerArgumentInfo> THandlerArguments; ///< List of handler arguments
+ struct SActionInfo
+ {
+ eastl::string m_Id;
+
+ // Where the action is added to
+ eastl::string m_Owner; // Absolute path of owner object
+
+ // Trigger object
+ eastl::string m_TriggerObject; // Absolute path of trigger object
+ eastl::string m_Event;
+
+ // Target object
+ eastl::string m_TargetObject; // Absolute path of target object
+ eastl::string m_Handler;
+ THandlerArguments m_HandlerArgs;
+
+ SActionInfo() {}
+ };
+ typedef eastl::map<eastl::string, SActionInfo> TActionMap; ///< Map of action id and action info
+
+ TActionMap m_ActionMap;
+
+ // There are 2 tables involved:
+ // 1. The Listener-To-Events tables - multimap of each listener to all events it is listening to
+ // 2. The Listener-Event-To-Actions table - multimap of each listener-event pair to all actions
+ // it triggers
+ // note: The struct for Action is a pair of EventAction node and its owner
+ struct SListenerEventNamePair
+ {
+ eastl::string m_Listener;
+ eastl::string m_Event;
+
+ SListenerEventNamePair(eastl::string inListener, const eastl::string &inEvent)
+ : m_Listener(inListener)
+ , m_Event(inEvent)
+ {
+ }
+
+ bool operator<(const SListenerEventNamePair &inListenerEventPair) const
+ {
+ if (m_Listener == inListenerEventPair.m_Listener)
+ return m_Event < inListenerEventPair.m_Event;
+ return m_Listener < inListenerEventPair.m_Listener;
+ }
+ };
+
+ typedef eastl::pair<eastl::string, eastl::string>
+ TEventActionOwnerPair; ///< One listener(source) can listen to multiple events
+ typedef eastl::multimap<eastl::string, eastl::string>
+ TListenerEventsNameMap; ///< One listener(source)-event pair can trigger multiple actions
+ typedef eastl::multimap<SListenerEventNamePair, TEventActionOwnerPair> TListenerEventActionsMap;
+
+ TListenerEventsNameMap m_ListenerEventsNameMap;
+ TListenerEventActionsMap m_ListenerEventActionsMap;
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CUIPParserActionHelper(CUIPParserImpl *inUIPParser, CUIPParserObjectRefHelper *inObjRefHelper,
+ IRuntimeMetaData &inMetaData);
+ virtual ~CUIPParserActionHelper();
+
+public:
+ void CacheAction(qt3dsdm::IDOMReader &inReader, const char8_t *inOwnerId);
+ void BuildActions(IPresentation &inPresentation);
+ void GetActionSectionCount(CUIPParserImpl::SActionSectionCount &outActionCount);
+ INT32 GetActionCount(const eastl::string &inActionId);
+ INT32 GetActionIndex(const eastl::string &inActionId);
+
+protected: // Action helper
+ void AddListenerEventPair(eastl::string inListener, const eastl::string &inEventName);
+ void CacheHandlerArguments(qt3dsdm::IDOMReader &inReader, SActionInfo &inAction);
+ void BuildAction(TElement &inElement, UINT32 inEventName, IPresentation &inPresentation,
+ const eastl::string &inActionId);
+ INT32 GetActionCount(const eastl::string &inActionId, INT32 &outStringAttrCount,
+ INT32 &outCustomParamCount);
+ bool IsCustomHandler(const SActionInfo &inAction);
+ void GetHandlerArgumentType(const SActionInfo &inAction, int inArgumentIndex,
+ ERuntimeDataModelDataType &outType,
+ ERuntimeAdditionalMetaDataType &outAdditionalType);
+ void GetCustomActionParametersCount(ERuntimeDataModelDataType inDataType,
+ ERuntimeAdditionalMetaDataType inAdditionalType,
+ INT32 &outStringAttrCount, INT32 &outCustomParamCount);
+ void ExportCustomActionParameters(IPresentation &inPresentation,
+ IParametersSystem &inParamSystem, QT3DSI32 inParamGroup,
+ const char *inDataValue, ERuntimeDataModelDataType inDataType,
+ ERuntimeAdditionalMetaDataType inAdditionalType);
+
+ inline SElement *GetElement(const eastl::string &inElementName);
+};
+
+} // namespace Q3DStudio
diff --git a/src/uipparser/Qt3DSUIPParserImpl.cpp b/src/uipparser/Qt3DSUIPParserImpl.cpp
new file mode 100644
index 0000000..79876ba
--- /dev/null
+++ b/src/uipparser/Qt3DSUIPParserImpl.cpp
@@ -0,0 +1,2623 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+#ifdef EA_PLATFORM_WINDOWS
+#pragma warning(disable : 4396) // specializer warning nonsense
+#endif
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSIScriptBridge.h"
+#include "Qt3DSAttributeHashes.h"
+#include "Qt3DSCommandEventTypes.h"
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMComposerTypeDefinitions.h"
+#include "Qt3DSDMWStrOpsImpl.h"
+#include "Qt3DSUIPParserActionHelper.h"
+#include "Qt3DSUIPParserObjectRefHelper.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSRuntimeFactory.h"
+#include "foundation/Qt3DSFoundation.h"
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSAnimationSystem.h"
+#include "Qt3DSSlideSystem.h"
+
+using namespace qt3dsdm;
+
+#ifndef M_PI
+#define M_PI 3.1415926535898
+#endif
+
+#define TODEG(x) x = (float)(x * 180 / M_PI);
+#define TORAD(x) x = (float)(x / 180 * M_PI);
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+TStrType SParseElementManager::RegisterStr(const char8_t *inStr)
+{
+ return m_MetaData.GetStringTable()->GetRenderStringTable().RegisterStr(inStr);
+}
+SElementData &SParseElementManager::GetOrCreateElementData(const char8_t *inIdOrRef,
+ const char8_t *inElemType,
+ const char8_t *inElemClassId)
+{
+ if (inIdOrRef == NULL)
+ inIdOrRef = "";
+ if (inIdOrRef[0] == '#')
+ ++inIdOrRef;
+ if (inElemClassId == NULL)
+ inElemClassId = "";
+ if (inElemClassId[0] == '#')
+ ++inElemClassId;
+ if (inElemType == NULL)
+ inElemType = "";
+ TStrType theStr = RegisterStr(inIdOrRef);
+ eastl::pair<TIdElementMap::iterator, bool> theInserter =
+ m_ElementMap.insert(eastl::make_pair(theStr, SElementData(theStr)));
+ SElementData &retval(theInserter.first->second);
+ if (theInserter.second) {
+ retval.m_Class = RegisterStr(inElemClassId);
+ retval.m_Type = RegisterStr(inElemType);
+ }
+ return retval;
+}
+SElementData *SParseElementManager::FindElementData(const char8_t *inIdOrRef)
+{
+ if (inIdOrRef == NULL)
+ inIdOrRef = "";
+ if (inIdOrRef[0] == '#')
+ ++inIdOrRef;
+ TStrType theStr = RegisterStr(inIdOrRef);
+ TIdElementMap::iterator theIter = m_ElementMap.find(theStr);
+ if (theIter != m_ElementMap.end())
+ return &theIter->second;
+ return NULL;
+}
+static void SetPropertyValueHash(eastl::string &inWorkspace, const char8_t *inExtension,
+ qt3ds::QT3DSU32 *&ioHashes, eastl::string::size_type originalSize,
+ CRegisteredString *&ioPropNames,
+ qt3ds::foundation::IStringTable &ioStringTable)
+{
+ if (inExtension && *inExtension)
+ inWorkspace.append(inExtension);
+ *ioHashes = Q3DStudio::CHash::HashAttribute(inWorkspace.c_str());
+ *ioPropNames = ioStringTable.RegisterStr(inWorkspace.c_str());
+ ++ioHashes;
+ ++ioPropNames;
+ inWorkspace.resize(originalSize);
+}
+static eastl::pair<qt3ds::QT3DSU32, eastl::string::size_type>
+SetupPropertyWorkspace(const char8_t *inPropName, eastl::string &ioWorkspace)
+{
+ qt3ds::QT3DSU32 outSubIndex = 0;
+ ioWorkspace.assign(inPropName ? inPropName : "");
+ eastl::string::size_type thePeriodPos = ioWorkspace.find('.');
+ if (thePeriodPos != eastl::string::npos) {
+ if (thePeriodPos < ioWorkspace.size() - 1) {
+ switch (ioWorkspace[thePeriodPos + 1]) {
+ default:
+ QT3DS_ASSERT(false);
+ case 'r':
+ case 'x':
+ break;
+ case 'g':
+ case 'y':
+ outSubIndex = 1;
+ break;
+ case 'b':
+ case 'z':
+ outSubIndex = 2;
+ break;
+ case 'a':
+ case 'w':
+ outSubIndex = 3;
+ break;
+ }
+ }
+ ioWorkspace.resize(thePeriodPos);
+ }
+ return eastl::make_pair(ioWorkspace.size(), outSubIndex);
+}
+SElementPropertyInfo *SParseElementManager::GetOrCreateProperty(SElementData &inData,
+ const char8_t *inPropertyName)
+{
+ SElementData &theData(inData);
+ SElementPropertyInfo *retvalPtr = FindProperty(inData, inPropertyName);
+ if (retvalPtr)
+ return retvalPtr;
+
+ eastl::string::size_type thePeriodPos =
+ SetupPropertyWorkspace(inPropertyName, m_Workspace).first;
+ TStrType theStr = RegisterStr(m_Workspace.c_str());
+
+ if (m_MetaData.IsPropertyExist(inData.m_Type, theStr, inData.m_Class) == false)
+ return NULL;
+
+ eastl::pair<TAttrMap::iterator, bool> theInserter =
+ theData.m_PropertyMap.insert(eastl::make_pair(theStr, SElementPropertyInfo(theStr)));
+ SElementPropertyInfo &retval(theInserter.first->second);
+ if (theInserter.second) {
+ qt3ds::intrinsics::memZero(retval.m_PropertyHashes, sizeof(retval.m_PropertyHashes));
+ qt3ds::QT3DSU32 *thePropHashes(retval.m_PropertyHashes);
+ CRegisteredString *thePropNames(retval.m_PropertyNames);
+ retval.m_DataType = m_MetaData.GetPropertyType(theData.m_Type, theStr, theData.m_Class);
+ retval.m_AdditionalType =
+ m_MetaData.GetAdditionalType(theData.m_Type, theStr, theData.m_Class);
+ if (retval.m_DataType != ERuntimeDataModelDataTypeNone) {
+ switch (retval.m_DataType) {
+ default:
+ retval.m_Arity = 1;
+ break;
+ case ERuntimeDataModelDataTypeFloat2:
+ retval.m_Arity = 2;
+ break;
+ case ERuntimeDataModelDataTypeFloat3:
+ retval.m_Arity = 3;
+ break;
+ case ERuntimeDataModelDataTypeFloat4:
+ retval.m_Arity = 4;
+ break;
+ }
+ if (retval.m_Arity > 1) {
+ if (retval.m_Arity == 2) {
+ SetPropertyValueHash(m_Workspace, ".x", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".y", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ } else if (retval.m_Arity == 3) {
+ if (m_MetaData.GetAdditionalType(theData.m_Type, theStr, theData.m_Class)
+ == ERuntimeAdditionalMetaDataTypeColor) {
+ SetPropertyValueHash(m_Workspace, ".r", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".g", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".b", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ } else {
+ SetPropertyValueHash(m_Workspace, ".x", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".y", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".z", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ }
+ } else if (retval.m_Arity == 4) {
+ if (m_MetaData.GetAdditionalType(theData.m_Type, theStr, theData.m_Class)
+ == ERuntimeAdditionalMetaDataTypeColor) {
+ SetPropertyValueHash(m_Workspace, ".r", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".g", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".b", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ SetPropertyValueHash(m_Workspace, ".a", thePropHashes, thePeriodPos,
+ thePropNames, m_StringTable);
+ }
+ }
+ } else {
+ retval.m_PropertyHashes[0] = Q3DStudio::CHash::HashAttribute(theStr.c_str());
+ retval.m_PropertyNames[0] = m_StringTable.RegisterStr(m_Workspace.c_str());
+ }
+ }
+ }
+ return &retval;
+}
+
+SElementPropertyInfo *SParseElementManager::GetOrCreateProperty(const char8_t *inIdOrRef,
+ const char8_t *inElemType,
+ const char8_t *inElemClassId,
+ const char8_t *inPropertyName)
+{
+ return GetOrCreateProperty(GetOrCreateElementData(inIdOrRef, inElemType, inElemClassId),
+ inPropertyName);
+}
+
+eastl::pair<SElementPropertyInfo *, qt3ds::QT3DSU32>
+SParseElementManager::FindPropertyWithSubIndex(SElementData &inElement,
+ const char8_t *inPropertyName)
+{
+ qt3ds::QT3DSU32 subIndex = SetupPropertyWorkspace(inPropertyName, m_Workspace).second;
+ TStrType theStr = RegisterStr(m_Workspace.c_str());
+ TAttrMap::iterator theIter = inElement.m_PropertyMap.find(theStr);
+ SElementPropertyInfo *retval = NULL;
+ if (theIter != inElement.m_PropertyMap.end())
+ retval = &theIter->second;
+ return eastl::make_pair(retval, subIndex);
+}
+
+SElementPropertyInfo *SParseElementManager::FindProperty(SElementData &inElement,
+ const char8_t *inPropertyName)
+{
+ return FindPropertyWithSubIndex(inElement, inPropertyName).first;
+}
+SElementPropertyInfo *SParseElementManager::FindProperty(const char8_t *inIdOrRef,
+ const char8_t *inPropertyName)
+{
+ SElementData *theData(FindElementData(inIdOrRef));
+ if (theData)
+ return FindProperty(*theData, inPropertyName);
+ return NULL;
+}
+
+void SParseElementManager::MarkAttributeAsReferenced(SElementData &inElement,
+ const char8_t *inPropertyName)
+{
+ SElementPropertyInfo *theProp = GetOrCreateProperty(inElement, inPropertyName);
+ if (theProp)
+ theProp->m_ElementFlag = true;
+}
+
+void SParseElementManager::MarkAttributeAsReferenced(const char8_t *inElement,
+ const char8_t *inPropertyName)
+{
+ SElementData *theData = FindElementData(inElement);
+ if (theData)
+ MarkAttributeAsReferenced(*theData, inPropertyName);
+}
+
+void SParseElementManager::MarkAllAttributesAsReferenced(SElementData &inElement,
+ bool searchParent)
+{
+ m_PropertyList.clear();
+ m_MetaData.GetInstanceProperties(inElement.m_Type, inElement.m_Class, m_PropertyList,
+ searchParent);
+ for (QT3DSU32 idx = 0, end = m_PropertyList.size(); idx < end; ++idx)
+ MarkAttributeAsReferenced(inElement, m_PropertyList[idx].c_str());
+}
+
+TStrType SParseSlideManager::RegisterId(const char8_t *inStr)
+{
+ if (!inStr)
+ inStr = "";
+ if (*inStr == '#')
+ ++inStr;
+ return RegisterStr(inStr);
+}
+
+SParseSlideManager::~SParseSlideManager()
+{
+ for (QT3DSU32 idx = 0, end = m_Animations.size(); idx < end; ++idx)
+ delete m_Animations[idx];
+ m_Animations.clear();
+}
+
+SParseSlide &SParseSlideManager::GetOrCreateSlide(const char8_t *inSlideId, qt3ds::QT3DSI32 inSlideIndex)
+{
+ TStrType theSlideId(RegisterId(inSlideId));
+ return m_SlideMap.insert(eastl::make_pair(theSlideId, SParseSlide(theSlideId, inSlideIndex)))
+ .first->second;
+}
+
+SParseSlide *SParseSlideManager::FindSlide(const char8_t *inSlideId)
+{
+ TStrType theSlideId(RegisterId(inSlideId));
+ TSlideIdToParseSlideMap::iterator theIter = m_SlideMap.find(theSlideId);
+ if (theIter != m_SlideMap.end())
+ return &theIter->second;
+ return NULL;
+}
+
+void SParseSlideManager::SetAnimationData(SParseSlide &inSlide, const char8_t *inInstanceId,
+ const char8_t *inPropertyName,
+ const char8_t *inKeyframeData,
+ SParseSlideAnimationTypes::Enum inType, bool inIsDynamic,
+ bool inIsActive)
+{
+ TStrType thePropertyName(RegisterStr(inPropertyName));
+ SElementData *theElemData = m_ElementManager.FindElementData(inInstanceId);
+ if (theElemData == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ eastl::pair<SElementPropertyInfo *, qt3ds::QT3DSU32> theProperty =
+ m_ElementManager.FindPropertyWithSubIndex(*theElemData, thePropertyName);
+ if (theProperty.first == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ qt3ds::QT3DSU32 thePropertyHash = theProperty.first->m_PropertyHashes[theProperty.second];
+ // Parse the keyframe data into floating point numbers.
+ if (inKeyframeData == NULL)
+ inKeyframeData = "";
+ m_KeyframeParseBuffer.clear();
+ m_KeyframeParseBuffer.assign(inKeyframeData);
+ m_KeyframeParseFloatBuffer.clear();
+ char8_t *theBufData = const_cast<char8_t *>(m_KeyframeParseBuffer.c_str());
+
+ char8_t *theStartPtr = qt3dsdm::FindNextNonWhitespace(theBufData);
+ while (theStartPtr && *theStartPtr) {
+ char8_t *nextPtr = qt3dsdm::FindNextWhitespace(theStartPtr);
+ if (nextPtr && *nextPtr)
+ *nextPtr = 0;
+ else
+ nextPtr = NULL;
+ QT3DSF32 temp;
+ WStrOps<QT3DSF32>().StrTo(theStartPtr, temp);
+ m_KeyframeParseFloatBuffer.push_back(temp);
+ theStartPtr = nextPtr;
+ if (theStartPtr)
+ theStartPtr = FindNextNonWhitespace(theStartPtr + 1);
+ }
+ // Don't create animations with no keyframes.
+ if (m_KeyframeParseFloatBuffer.empty()) {
+ return;
+ }
+
+ SParseSlideAnimationEntry *theEntry =
+ new SParseSlideAnimationEntry(inSlide.m_SlideId, theElemData->m_Id, thePropertyName,
+ thePropertyHash, inType, NULL, 0, inIsDynamic);
+ theEntry->m_KeyframeData = m_KeyframeParseFloatBuffer;
+ m_Animations.push_back(theEntry);
+ switch (inType) {
+ case SParseSlideAnimationTypes::Linear:
+ m_AnimationKeyframeCount += m_KeyframeParseFloatBuffer.size() / 2;
+ break;
+ case SParseSlideAnimationTypes::Bezier:
+ m_AnimationKeyframeCount += m_KeyframeParseFloatBuffer.size() / 6;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ case SParseSlideAnimationTypes::EaseInOut:
+ m_AnimationKeyframeCount += m_KeyframeParseFloatBuffer.size() / 4;
+ break;
+ }
+
+ ReferenceAnimation(inSlide, *theEntry, inIsActive);
+}
+
+void SParseSlideManager::ReferenceAnimation(SParseSlide &inSlide,
+ const SParseSlideAnimationEntry &inSource,
+ bool inIsActive)
+{
+ TAnimationList &theList =
+ inSlide.m_Animations.insert(eastl::make_pair(inSource.m_InstanceId, TAnimationList()))
+ .first->second;
+ theList.push_back(SParseAnimationRef(inSlide.m_SlideId, inSource.m_InstanceId,
+ inSource.m_PropertyName, &inSource, inIsActive));
+ m_SlideAnimationCount++;
+}
+
+TAnimationList *SParseSlideManager::GetAnimationsForInstance(SParseSlide &inSlide,
+ const char8_t *inInstanceId)
+{
+ SElementData *theElemData = m_ElementManager.FindElementData(inInstanceId);
+ if (theElemData) {
+ TInstanceIdAnimationMap::iterator theAnimations =
+ inSlide.m_Animations.find(theElemData->m_Id);
+ if (theAnimations != inSlide.m_Animations.end())
+ return &theAnimations->second;
+ }
+ return NULL;
+}
+
+SParseSlideActionEntry &SParseSlideManager::GetOrCreateAction(SParseSlide &inSlide,
+ const char8_t *inActionId,
+ qt3ds::QT3DSI32 inActionCount,
+ bool inActive)
+{
+ TStrType theActionId(RegisterId(inActionId));
+ SParseSlideActionEntry theAction(inSlide.m_SlideId, theActionId, inActionCount, inActive);
+ memZero(theAction.m_Actions, sizeof(theAction.m_Actions));
+ TActionList::iterator theIter =
+ eastl::find(inSlide.m_ActionList.begin(), inSlide.m_ActionList.end(), theAction);
+ if (theIter != inSlide.m_ActionList.end())
+ return *theIter;
+ inSlide.m_ActionList.push_back(theAction);
+ m_ActionCount += inActionCount;
+ return inSlide.m_ActionList.back();
+}
+
+SParseSlideActionEntry *SParseSlideManager::FindAction(SParseSlide &inSlide,
+ const char8_t *inActionId)
+{
+ TStrType theActionId(RegisterId(inActionId));
+ SParseSlideActionEntry theAction(inSlide.m_SlideId, theActionId, 0, false);
+ TActionList::iterator theIter =
+ eastl::find(inSlide.m_ActionList.begin(), inSlide.m_ActionList.end(), theAction);
+ if (theIter != inSlide.m_ActionList.end())
+ return &(*theIter);
+ return NULL;
+}
+
+//==============================================================================
+/**
+ * Constructor
+ * @param inFileName name of UIP file
+ */
+CUIPParserImpl::CUIPParserImpl(const QString &inFileName, IRuntimeMetaData &inMetaData,
+ IInputStreamFactory &inFactory,
+ qt3ds::foundation::IStringTable &inStringTable)
+ : m_MetaData(inMetaData)
+ , m_InputStreamFactory(inFactory)
+ , m_ParseElementManager(inMetaData, inStringTable)
+ , m_ParseSlideManager(inMetaData, m_ParseElementManager)
+{
+ // Setup DOMSerializer and DOMReader to read the file
+ std::shared_ptr<qt3dsdm::IStringTable> theStrTable(inMetaData.GetStringTable());
+ shared_ptr<qt3dsdm::IDOMFactory> theFactory(qt3dsdm::IDOMFactory::CreateDOMFactory(theStrTable));
+ TInputStreamPtr theInStream(inFactory.GetStreamForFile(inFileName));
+ qt3dsdm::SDOMElement *topElement = NULL;
+ if (theInStream)
+ topElement = CDOMSerializer::Read(*theFactory, *theInStream);
+ if (!topElement) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Could not open UIP file: " << inFileName.toLatin1().constData();
+ } else {
+ eastl::pair<std::shared_ptr<IDOMWriter>, std::shared_ptr<IDOMReader>> theWriteReader =
+ IDOMWriter::CreateDOMWriter(theFactory, *topElement, theStrTable);
+ m_DOMWriter = theWriteReader.first;
+ m_DOMReader = theWriteReader.second;
+ if (!AreEqual(m_DOMReader->GetNarrowElementName(), "UIP")) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Invalid UIP file: " << inFileName.toLatin1().constData();
+ }
+ }
+
+ // Create Helper class
+ m_ObjectRefHelper = new CUIPParserObjectRefHelper(m_MetaData);
+ m_ActionHelper = new CUIPParserActionHelper(this, m_ObjectRefHelper, m_MetaData);
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CUIPParserImpl::~CUIPParserImpl()
+{
+ // Delete Helper class
+ delete m_ObjectRefHelper;
+ m_ObjectRefHelper = NULL;
+
+ delete m_ActionHelper;
+ m_ActionHelper = NULL;
+}
+
+//==============================================================================
+/**
+ * Load a presentation from a UIP file.
+ * @param inPresentation presentation written to
+ * @return a flag indicating whether or not we successfully loaded the file
+ */
+BOOL CUIPParserImpl::Load(IPresentation &inPresentation,
+ NVConstDataRef<SElementAttributeReference> inStateReferences)
+{
+ m_CurrentPresentation = &inPresentation;
+ if (!m_DOMReader) {
+ qCCritical(qt3ds::INVALID_PARAMETER) << "CUIPParserImpl::Load, No DOM reader";
+ return FALSE;
+ }
+
+ BOOL theLoadResult = m_DOMReader->MoveToFirstChild("Project");
+
+ // Load project settings
+ if (theLoadResult)
+ theLoadResult &= LoadProjectSettings(inPresentation, *m_DOMReader);
+
+ // First, we need to load the classes, because the class information will be stored in metadata
+ if (theLoadResult)
+ theLoadResult &= LoadClasses(inPresentation, *m_DOMReader);
+
+ // Next is to cache the scene graph because we need the id-name information to resolve object
+ // reference
+ m_ObjectRefHelper->CacheGraph(*m_DOMReader, *m_DOMWriter);
+
+ // Next is to cache the required attributes. This will be used to build Element
+ // We also need to cache the actions because we need to know the ActionCount to reserve the
+ // memory
+ {
+ IDOMReader::Scope __graphScope(*m_DOMReader);
+ m_DOMReader->MoveToFirstChild("Graph");
+ CacheGraphRequiredAttributes(*m_DOMReader);
+ }
+
+ {
+ IDOMReader::Scope __logicScope(*m_DOMReader);
+ m_DOMReader->MoveToFirstChild("Logic");
+ {
+
+ IDOMReader::Scope __stateScope(*m_DOMReader);
+ for (BOOL theSuccess = m_DOMReader->MoveToFirstChild("State"); theSuccess;
+ theSuccess = m_DOMReader->MoveToNextSibling("State")) {
+ IDOMReader::Scope __subSlideScope(*m_DOMReader);
+ if (theLoadResult)
+ theLoadResult &= CacheLogicRequiredAttributes(*m_DOMReader);
+ }
+ }
+ }
+
+ // go through all the references and make sure the elements exist and if they do ensure the
+ // attributes are marked as referenced.
+ for (QT3DSU32 idx = 0, end = inStateReferences.size(); idx < end; ++idx) {
+ const SElementAttributeReference &reference = inStateReferences[idx];
+ // All references are absolute, so the start node doesn't really matter.
+ CRegisteredString result = m_ObjectRefHelper->ParseObjectRefId(reference.m_Path, "Scene");
+ if (result.IsValid() == false) {
+ qCCritical(INVALID_OPERATION, "Failed to resolve reference: %s",
+ reference.m_Path.c_str());
+ } else {
+ m_ParseElementManager.MarkAttributeAsReferenced(result.c_str(),
+ reference.m_Attribute.c_str());
+ }
+ }
+
+ if (theLoadResult)
+ CacheClassRequiredAttributes(*m_DOMReader);
+
+ ComputeAndReserveMemory(inPresentation, *m_DOMReader);
+
+ // Now we are ready to load the scene graph
+ if (theLoadResult)
+ theLoadResult &= LoadGraph(inPresentation, *m_DOMReader);
+ if (theLoadResult)
+ theLoadResult &= LoadLogic(inPresentation, *m_DOMReader);
+
+ return theLoadResult;
+}
+
+IDOMReader &CUIPParserImpl::GetDOMReader()
+{
+ return *m_DOMReader.get();
+}
+
+//==============================================================================
+/**
+ * Load Project Settings
+ * @param inPresentation presentation written to
+ * @return a flag indicating whether or not we successfully loaded the file
+ */
+BOOL CUIPParserImpl::LoadProjectSettings(IPresentation &inPresentation, IDOMReader &inReader)
+{
+ IDOMReader::Scope __projectSettingsScope(inReader);
+
+ if (inReader.MoveToFirstChild("ProjectSettings")) {
+ SPresentationSize thePresentationSize;
+ qt3ds::QT3DSI32 theWidth, theHeight;
+
+ if (inReader.Att("presentationWidth", theWidth))
+ thePresentationSize.m_Width = static_cast<UINT16>(theWidth);
+ if (inReader.Att("presentationHeight", theHeight))
+ thePresentationSize.m_Height = static_cast<UINT16>(theHeight);
+ thePresentationSize.m_ScaleMode = SCALEMODE_EXACT; // ScaleMode is always EXACT
+
+ inPresentation.SetSize(thePresentationSize);
+
+ return true;
+ } else
+ return false;
+}
+
+BOOL CUIPParserImpl::LoadClasses(IPresentation & /*inPresentation*/, IDOMReader &inReader)
+{
+ IDOMReader::Scope __classesScope(inReader);
+
+ if (inReader.MoveToFirstChild("Classes")) {
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ const char *theSourcePath;
+ const char *theId;
+ const char *theName;
+ // Read the sourcepath and id
+ if (inReader.Att("sourcepath", theSourcePath) && inReader.Att("id", theId)) {
+ // Read the name
+ if (!inReader.Att("name", theName))
+ theName = theId;
+
+ bool theLoadFlag = false;
+ QString theFullPath(theSourcePath);
+
+ if (theFullPath.endsWith(".qml")) {
+ theLoadFlag = m_MetaData.LoadScriptFile(inReader.GetNarrowElementName(), theId,
+ theName, theFullPath.toUtf8().data());
+ if (theLoadFlag)
+ m_IdScriptMap[theId] = theSourcePath;
+ } else if (theFullPath.endsWith(".effect")) {
+ theLoadFlag = m_MetaData.LoadEffectXMLFile(inReader.GetNarrowElementName(),
+ theId, theName,
+ theFullPath.toUtf8().data());
+ } else if (theFullPath.endsWith(".material") || theFullPath.endsWith(".shader")) {
+ theLoadFlag = m_MetaData.LoadMaterialXMLFile(
+ inReader.GetNarrowElementName(), theId, theName,
+ theFullPath.toUtf8().data());
+ } else if (theFullPath.endsWith(".plugin")) {
+ theLoadFlag = m_MetaData.LoadPluginXMLFile(inReader.GetNarrowElementName(),
+ theId, theName,
+ theFullPath.toUtf8().data());
+ }
+
+ if (!theLoadFlag) {
+ // What file is this?!?
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Could not load sourcepath file: "
+ << theFullPath.toLatin1().constData();
+ }
+ }
+ }
+ }
+
+ // Always return true. Failing to load classes should not block the rest of the system.
+ return true;
+}
+
+BOOL CUIPParserImpl::LoadGraph(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader)
+{
+ IDOMReader::Scope __childScope(inReader);
+
+ m_NumGraphElements = 0;
+ m_NumGraphComponents = 0;
+ m_NumGraphAttributes = 0;
+
+ bool theLoadResult = inReader.MoveToFirstChild("Graph");
+ if (theLoadResult) {
+ theLoadResult &= LoadSceneGraph(inPresentation, inReader);
+ if (theLoadResult)
+ PatchSceneElementRef();
+ }
+
+ return theLoadResult;
+}
+
+using qt3ds::runtime::element::SPropertyDesc;
+using qt3ds::runtime::element::TPropertyDescAndValue;
+
+void CUIPParserImpl::GetMetaAttribute(IPresentation &inPresentation,
+ TPropertyDescAndValueList &outDescList, TStrType inType,
+ TStrType inName, TStrType inClassId,
+ CRegisteredString *inAttStrNames)
+{
+ ERuntimeDataModelDataType thePropertyType =
+ m_MetaData.GetPropertyType(inType, inName, inClassId);
+
+ // TODO: Handle all other types
+ switch (thePropertyType) {
+ case ERuntimeDataModelDataTypeFloat:
+ AddFloatAttribute(outDescList, inAttStrNames[0],
+ m_MetaData.GetPropertyValueFloat(inType, inName, inClassId));
+ break;
+ case ERuntimeDataModelDataTypeFloat2: {
+ QT3DSVec2 vec2 = m_MetaData.GetPropertyValueVector2(inType, inName, inClassId);
+ SFloat2 theValue(vec2.x, vec2.y);
+ AddFloat2Attribute(outDescList, inAttStrNames, theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat3: {
+ QT3DSVec3 vec3 = m_MetaData.GetPropertyValueVector3(inType, inName, inClassId);
+ SFloat3 theValue(vec3.x, vec3.y, vec3.z);
+ ERuntimeAdditionalMetaDataType theAdditionalType =
+ m_MetaData.GetAdditionalType(inType, inName, inClassId);
+ AddFloat3Attribute(outDescList, theAdditionalType, inAttStrNames, theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat4: {
+ QT3DSVec4 vec4 = m_MetaData.GetPropertyValueVector4(inType, inName, inClassId);
+ SFloat4 theValue(vec4.x, vec4.y, vec4.z, vec4.w);
+ ERuntimeAdditionalMetaDataType theAdditionalType =
+ m_MetaData.GetAdditionalType(inType, inName, inClassId);
+ AddFloat4Attribute(outDescList, theAdditionalType, inAttStrNames, theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeLong:
+ AddLongAttribute(outDescList, inAttStrNames[0],
+ m_MetaData.GetPropertyValueLong(inType, inName, inClassId));
+ break;
+ case ERuntimeDataModelDataTypeString: {
+ Option<eastl::string> theRuntimeStr =
+ m_MetaData.GetPropertyValueString(inType, inName, inClassId);
+ if (theRuntimeStr.hasValue())
+ AddStringAttribute(inPresentation, outDescList, inAttStrNames[0],
+ theRuntimeStr->c_str());
+ else
+ AddStringAttribute(inPresentation, outDescList, inAttStrNames[0], "");
+ } break;
+ case ERuntimeDataModelDataTypeBool:
+ AddBoolAttribute(outDescList, inAttStrNames[0],
+ m_MetaData.GetPropertyValueBool(inType, inName, inClassId));
+ break;
+ case ERuntimeDataModelDataTypeLong4:
+ AddElementRefAttribute(outDescList, inAttStrNames[0], NULL);
+ break;
+ case ERuntimeDataModelDataTypeObjectRef: {
+ // Object ref is converted to string path
+ eastl::string theRuntimeStr =
+ m_MetaData.GetPropertyValueObjectRef(inType, inName, inClassId);
+ eastl::string theObjectRef = m_ObjectRefHelper->BuildReferenceString(theRuntimeStr);
+ AddStringAttribute(inPresentation, outDescList, inAttStrNames[0], theObjectRef.c_str());
+ break;
+ }
+ default:
+ QT3DS_ASSERT(false);
+ }
+}
+
+void CUIPParserImpl::AddFloatAttribute(TPropertyDescAndValueList &outDescList,
+ CRegisteredString inAttStrName, float &inValue)
+{
+ UVariant theValue;
+ theValue.m_FLOAT = inValue;
+ outDescList.push_back(
+ eastl::make_pair(SPropertyDesc(inAttStrName, ATTRIBUTETYPE_FLOAT), theValue));
+}
+
+void CUIPParserImpl::AddLongAttribute(TPropertyDescAndValueList &outDescList,
+ CRegisteredString inAttStrName, qt3ds::QT3DSI32 &inValue)
+{
+ UVariant theValue;
+ theValue.m_INT32 = inValue;
+ outDescList.push_back(
+ eastl::make_pair(SPropertyDesc(inAttStrName, ATTRIBUTETYPE_INT32), theValue));
+}
+
+void CUIPParserImpl::AddBoolAttribute(TPropertyDescAndValueList &outDescList,
+ CRegisteredString inAttStrName, bool &inValue)
+{
+ UVariant theValue;
+ theValue.m_INT32 = inValue;
+ outDescList.push_back(
+ eastl::make_pair(SPropertyDesc(inAttStrName, ATTRIBUTETYPE_BOOL), theValue));
+}
+
+void CUIPParserImpl::AddFloat2Attribute(TPropertyDescAndValueList &outDescList,
+ CRegisteredString *inAttStrNames, SFloat2 &inValue)
+{
+ for (long theIndex = 0; theIndex < 2; ++theIndex) {
+ UVariant theValue;
+ theValue.m_FLOAT = inValue[theIndex];
+ outDescList.push_back(eastl::make_pair(
+ SPropertyDesc(inAttStrNames[theIndex], ATTRIBUTETYPE_FLOAT), theValue));
+ }
+}
+
+void CUIPParserImpl::AddFloat3Attribute(TPropertyDescAndValueList &outDescList,
+ ERuntimeAdditionalMetaDataType inAdditionalType,
+ CRegisteredString *inAttStrNames, SFloat3 &inValue)
+{
+ for (long theIndex = 0; theIndex < 3; ++theIndex) {
+ float theValue = inValue[theIndex];
+ if (inAdditionalType == ERuntimeAdditionalMetaDataTypeRotation)
+ TORAD(theValue);
+ UVariant theVarValue;
+ theVarValue.m_FLOAT = theValue;
+ outDescList.push_back(eastl::make_pair(
+ SPropertyDesc(inAttStrNames[theIndex], ATTRIBUTETYPE_FLOAT), theVarValue));
+ }
+}
+
+void CUIPParserImpl::AddFloat4Attribute(TPropertyDescAndValueList &outDescList,
+ ERuntimeAdditionalMetaDataType inAdditionalType,
+ CRegisteredString *inAttStrNames, SFloat4 &inValue)
+{
+ for (long i = 0; i < 4; ++i) {
+ UVariant varVal;
+ varVal.m_FLOAT = inValue[i];
+ outDescList.push_back(eastl::make_pair(
+ SPropertyDesc(inAttStrNames[i], ATTRIBUTETYPE_FLOAT), varVal));
+ }
+}
+
+
+void CUIPParserImpl::AddStringAttribute(IPresentation &inPresentation,
+ TPropertyDescAndValueList &outDescList,
+ CRegisteredString inAttStrName, const char *inValue)
+{
+ qt3ds::foundation::CStringHandle theString = inPresentation.GetStringTable().GetHandle(inValue);
+ UVariant theValue;
+ theValue.m_StringHandle = theString.handle();
+ outDescList.push_back(
+ eastl::make_pair(SPropertyDesc(inAttStrName, ATTRIBUTETYPE_STRING), theValue));
+ if (CHash::HashAttribute(inAttStrName.c_str()) == Q3DStudio::ATTRIBUTE_SOURCEPATH && inValue
+ && *inValue)
+ AddSourcePath(inValue, false);
+}
+
+void CUIPParserImpl::AddElementRefAttribute(TPropertyDescAndValueList &outDescList,
+ CRegisteredString inAttStrName, SElement *inElement)
+{
+ UVariant theValue;
+ if (inElement) {
+ theValue.m_ElementHandle = inElement->GetHandle();
+ QT3DS_ASSERT(theValue.m_ElementHandle);
+ } else
+ theValue.m_ElementHandle = 0;
+ outDescList.push_back(
+ eastl::make_pair(SPropertyDesc(inAttStrName, ATTRIBUTETYPE_ELEMENTREF), theValue));
+}
+
+void CUIPParserImpl::GetAttributeList(IPresentation &inPresentation,
+ TPropertyDescAndValueList &outDescList, TStrType inType,
+ TStrType inName, TStrType inClassId, const char *inValue,
+ CRegisteredString *inPropNameStrs)
+{
+ ERuntimeDataModelDataType theDataType = m_MetaData.GetPropertyType(inType, inName, inClassId);
+ ERuntimeAdditionalMetaDataType theAdditionalType =
+ m_MetaData.GetAdditionalType(inType, inName, inClassId);
+
+ GetAttributeList(inPresentation, outDescList, theDataType, theAdditionalType, inName, inValue,
+ inPropNameStrs);
+}
+
+void CUIPParserImpl::GetAttributeList(IPresentation &inPresentation,
+ TPropertyDescAndValueList &outDescList,
+ ERuntimeDataModelDataType inDataType,
+ ERuntimeAdditionalMetaDataType inAdditionalType, const char *,
+ const char *inValue, CRegisteredString *inPropNameStrs)
+{
+ // Create a destructible value
+ m_ValueBuffer.clear();
+ m_TempBuffer.clear();
+ m_ValueBuffer.write(inValue, (QT3DSU32)strlen(inValue) + 1);
+ WCharTReader theReader((char8_t *)m_ValueBuffer.begin(), m_TempBuffer,
+ *m_DOMReader->GetStringTable());
+
+ // TODO: Handle all other types
+ // Note that the default value should be consistent with the SetDefault method of
+ // TDataModelValue
+ switch (inDataType) {
+ case ERuntimeDataModelDataTypeLong: {
+ qt3ds::QT3DSI32 theValue = 0;
+ if (!IsTrivial(inValue))
+ theReader.Read(theValue);
+ AddLongAttribute(outDescList, inPropNameStrs[0], theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat: {
+ float theValue = 0;
+ if (!IsTrivial(inValue))
+ theReader.Read(theValue);
+ AddFloatAttribute(outDescList, inPropNameStrs[0], theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat2: {
+ SFloat2 theValue(0);
+ if (!IsTrivial(inValue))
+ theReader.ReadRef(NVDataRef<QT3DSF32>(&theValue[0], 2));
+ AddFloat2Attribute(outDescList, inPropNameStrs, theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat3: {
+ SFloat3 theValue(0);
+ if (!IsTrivial(inValue))
+ theReader.ReadRef(NVDataRef<QT3DSF32>(&theValue[0], 3));
+ AddFloat3Attribute(outDescList, inAdditionalType, inPropNameStrs, theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeFloat4: {
+ SFloat4 theValue(0);
+ if (!IsTrivial(inValue))
+ theReader.ReadRef(NVDataRef<QT3DSF32>(&theValue[0], 4));
+ AddFloat4Attribute(outDescList, inAdditionalType, inPropNameStrs, theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeBool: {
+ bool theValue = false;
+ if (!IsTrivial(inValue))
+ theReader.Read(theValue);
+ AddBoolAttribute(outDescList, inPropNameStrs[0], theValue);
+ break;
+ }
+ case ERuntimeDataModelDataTypeStringRef:
+ case ERuntimeDataModelDataTypeString: {
+ const char *theDataPtr = "";
+ if (!IsTrivial(inValue))
+ theReader.Read(theDataPtr);
+ AddStringAttribute(inPresentation, outDescList, inPropNameStrs[0], theDataPtr);
+ break;
+ }
+ case ERuntimeDataModelDataTypeLong4: {
+ const char *theDataPtr = NULL;
+ if (!IsTrivial(inValue))
+ theReader.Read(theDataPtr);
+ SElement *theElementData = GetElement(theDataPtr);
+ AddElementRefAttribute(outDescList, inPropNameStrs[0], theElementData);
+ break;
+ }
+ case ERuntimeDataModelDataTypeObjectRef: {
+ // Object ref is converted to string path
+ const char *theDataPtr = NULL;
+ if (!IsTrivial(inValue))
+ theReader.Read(theDataPtr);
+ if (theDataPtr) {
+ eastl::string theObjectRef = m_ObjectRefHelper->BuildReferenceString(theDataPtr);
+ AddStringAttribute(inPresentation, outDescList, inPropNameStrs[0],
+ theObjectRef.c_str());
+ }
+ break;
+ }
+ default:
+ QT3DS_ASSERT(false);
+ }
+}
+
+//==============================================================================
+/**
+ * Looks up the EElementType from the asset type.
+ */
+EElementType GetElementType(const char *inType)
+{
+ if (AreEqual(inType, "Scene") || AreEqual(inType, "Layer") || AreEqual(inType, "Group")
+ || AreEqual(inType, "Model") || AreEqual(inType, "Path"))
+ return ELEMENTTYPE_NODE;
+
+ else if (AreEqual(inType, "Camera"))
+ return ELEMENTTYPE_CAMERA;
+
+ else if (AreEqual(inType, "Light"))
+ return ELEMENTTYPE_LIGHT;
+
+ else if (AreEqual(inType, "Component"))
+ return ELEMENTTYPE_COMPONENT;
+
+ else if (AreEqual(inType, "Material"))
+ return ELEMENTTYPE_MATERIAL;
+
+ else if (AreEqual(inType, "Image"))
+ return ELEMENTTYPE_TEXTURE;
+
+ else if (AreEqual(inType, "Behavior"))
+ return ELEMENTTYPE_BEHAVIOR;
+
+ else if (AreEqual(inType, "Text"))
+ return ELEMENTTYPE_TEXT;
+
+ else if (AreEqual(inType, "PathAnchorPoint"))
+ return ELEMENTTYPE_PATHANCHORPOINT;
+
+ else if (AreEqual(inType, "SubPath"))
+ return ELEMENTTYPE_SUBPATH;
+
+ else
+ return ELEMENTTYPE_UNKNOWN;
+}
+
+//==============================================================================
+/**
+ * Build out the graph.
+ * @param inPresentation presentation written to
+ * @return a flag indicating whether or not we successfully loaded the file
+ */
+BOOL CUIPParserImpl::LoadSceneGraph(IPresentation &inPresentation, IDOMReader &inReader,
+ qt3ds::runtime::element::SElement *inNewStyleParent)
+{
+ IDOMReader::Scope __childScope(inReader);
+ IScriptBridge *theScriptBridgeQml = inPresentation.GetScriptBridgeQml();
+
+ eastl::string theFileString;
+ qt3ds::runtime::IApplication &theApp(inPresentation.GetApplication());
+ qt3ds::runtime::IElementAllocator &theElemAllocator(theApp.GetElementAllocator());
+ TPropertyDescAndValueList theProperties;
+ using qt3ds::runtime::element::SPropertyDesc;
+ qt3ds::foundation::IStringTable &theStringTable(inPresentation.GetStringTable());
+ // build out the graph.
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ theProperties.clear();
+ const char *theId;
+ inReader.Att("id", theId);
+ const char *theClass;
+ inReader.Att("class", theClass);
+ const char *theType(inReader.GetNarrowElementName());
+ eastl::string theName(m_ObjectRefHelper->GetName(theId).c_str());
+ // Get default end time from metadata
+ UINT32 theLoopTime = 0;
+ bool isComponent = false;
+ bool isBehavior = false;
+
+ // Create SElement
+ if (AreEqual(theType, "Scene") || AreEqual(theType, "Component")) {
+ // TDataModelValue theValue;
+ theLoopTime = m_MetaData.GetPropertyValueLong(m_MetaData.Register(theType),
+ m_MetaData.Register("endtime"));
+ Q3DStudio_ASSERT(theLoopTime != 0); // Something is wrong here
+ isComponent = true;
+ } else {
+ if (AreEqual(theType, "Behavior") && !IsTrivial(theClass)) {
+ // Find the sourcepath and load the script
+ ++theClass; // remove the '#'
+ TIdSourcePathMap::iterator theSourcePathIter = m_IdScriptMap.find(theClass);
+ if (theSourcePathIter != m_IdScriptMap.end()) {
+ theFileString.assign(theSourcePathIter->second);
+
+// For non-windows platforms, we need to reverse the slashes
+#ifndef EA_PLATFORM_WINDOWS
+ for (eastl::string::size_type thePos = theFileString.find('\\');
+ thePos != eastl::string::npos;
+ thePos = theFileString.find('\\', thePos + 1)) {
+ theFileString.replace(thePos, 1, 1, '/');
+ }
+#endif
+ isBehavior = true;
+ UVariant theValue;
+ theValue.m_StringHandle =
+ inPresentation.GetStringTable().GetHandle(theFileString.c_str());
+ theProperties.push_back(eastl::make_pair(
+ SPropertyDesc(theStringTable.RegisterStr("behaviorscripts"),
+ ATTRIBUTETYPE_STRING),
+ theValue));
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Could not load Behavior script: " << theClass;
+ }
+ }
+ }
+
+ SElementData &theElementData =
+ m_ParseElementManager.GetOrCreateElementData(theId, theType, theClass);
+
+ const char8_t *theSourcePath;
+ if (inReader.UnregisteredAtt("sourcepath", theSourcePath)) {
+ const char8_t *mapping;
+ bool ibl = false;
+ if (inReader.UnregisteredAtt("mappingmode", mapping)) {
+ if (QString::fromUtf8(mapping) == QLatin1String("Light Probe"))
+ ibl = true;
+ }
+ AddSourcePath(theSourcePath, ibl);
+ }
+
+ TAttrMap &theList = theElementData.m_PropertyMap;
+
+ const char *theAttribute;
+ for (TAttrMap::iterator theIter = theList.begin(), theMapEnd = theList.end();
+ theIter != theMapEnd; ++theIter) {
+ if (theIter->second.m_ElementFlag) {
+ // Parse the property value from uip, this will overwrite the default value
+ const TStrType &thePropertyName(theIter->first);
+ CRegisteredString *thePropertyNames = theIter->second.m_PropertyNames;
+ size_t theListSize = theProperties.size();
+ if (inReader.Att(thePropertyName.c_str(), theAttribute)) {
+ ERuntimeDataModelDataType theDataType = m_MetaData.GetPropertyType(
+ theElementData.m_Type, thePropertyName, theElementData.m_Class);
+ if (theDataType == ERuntimeDataModelDataTypeLong4) {
+ AddElementRefToPatch(theProperties, theElementData, thePropertyName.c_str(),
+ theAttribute);
+ } else
+ GetAttributeList(inPresentation, theProperties, theElementData.m_Type,
+ thePropertyName, theElementData.m_Class, theAttribute,
+ thePropertyNames);
+ } else {
+ GetMetaAttribute(inPresentation, theProperties, theElementData.m_Type,
+ thePropertyName, theElementData.m_Class, thePropertyNames);
+ }
+ size_t theNumAtts = theProperties.size() - theListSize;
+ QT3DS_ASSERT(theNumAtts == (size_t)theIter->second.m_Arity);
+ (void)theNumAtts;
+ }
+ }
+ qt3ds::runtime::element::SElement &theNewElem = theElemAllocator.CreateElement(
+ theStringTable.RegisterStr(theName.c_str()), theStringTable.RegisterStr(theType),
+ theStringTable.RegisterStr(theElementData.m_Class.c_str()),
+ toConstDataRef(theProperties.data(), (QT3DSU32)theProperties.size()), &inPresentation,
+ inNewStyleParent, isComponent);
+ theElementData.m_Element = &theNewElem;
+
+ if (inPresentation.GetRoot() == NULL)
+ inPresentation.SetRoot(theNewElem);
+
+ eastl::string thePath;
+ // build out the full path to the element for debugging
+ for (CUIPParserObjectRefHelper::SGraphNode *theNode =
+ this->m_ObjectRefHelper->GetNode(theId);
+ theNode; theNode = theNode->m_Parent) {
+ if (thePath.length())
+ thePath.insert(0, ".");
+ thePath.insert(0, theNode->m_Name);
+ }
+ if (thePath.size())
+ theNewElem.m_Path = m_ParseElementManager.m_StringTable.RegisterStr(thePath.c_str());
+
+ if (isBehavior) {
+ if (theFileString.find(".qml") != eastl::string::npos) {
+ theScriptBridgeQml->LoadScript(&inPresentation, &theNewElem,
+ theFileString.c_str());
+ }
+ }
+ LoadSceneGraph(inPresentation, inReader, &theNewElem);
+ }
+
+ return true;
+}
+
+//==============================================================================
+/**
+ * This method will parse through the graph sections to cache those attributes that
+ * should never be optimized
+ */
+void CUIPParserImpl::CacheGraphRequiredAttributes(qt3dsdm::IDOMReader &inReader)
+{
+ IDOMReader::Scope __childScope(inReader);
+
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ const char *theId;
+ inReader.Att("id", theId);
+ const char *theType(inReader.GetNarrowElementName());
+ const char *theClass = "";
+ inReader.Att("class", theClass);
+ SElementData &theData =
+ m_ParseElementManager.GetOrCreateElementData(theId, theType, theClass);
+ // name and sourcepath are never optimized out.
+ m_ParseElementManager.MarkAttributeAsReferenced(theData, "name");
+ // not everything needs to be in the time graph.
+ if (AreEqual(theType, "Scene") == false && AreEqual(theType, "Material") == false
+ && AreEqual(theType, "CustomMaterial") == false && AreEqual(theType, "Image") == false
+ && AreEqual(theType, "RenderPlugin") == false) {
+ SElementPropertyInfo *theProp =
+ m_ParseElementManager.GetOrCreateProperty(theData, "starttime");
+ theProp->m_SlideFlag = true;
+ theProp->m_SlideForceFlag = true;
+ theProp->m_ElementFlag = true;
+ theProp = m_ParseElementManager.GetOrCreateProperty(theData, "endtime");
+ theProp->m_SlideFlag = true;
+ theProp->m_SlideForceFlag = true;
+ theProp->m_ElementFlag = true;
+ }
+
+ // Probably not the most optimal thing to expose this attribute for all elements that
+ // support it, since it is not really needed except during initialization
+ m_ParseElementManager.MarkAttributeAsReferenced(theData, "controlledproperty");
+ m_ParseElementManager.MarkAttributeAsReferenced(theData, "observedproperty");
+
+ // Behaviors need all attributes possible on the object on them all the time.
+ if (AreEqual(theType, "Behavior") || AreEqual(theType, "RenderPlugin")) {
+ m_ParseElementManager.MarkAllAttributesAsReferenced(theData);
+ }
+
+ // Recursive
+ CacheGraphRequiredAttributes(inReader);
+ }
+}
+
+//==============================================================================
+/**
+ * This method will parse through the logic sections to cache those attributes that
+ * will be changed and thus needs to be at the SElement
+ */
+BOOL CUIPParserImpl::CacheLogicRequiredAttributes(qt3dsdm::IDOMReader &inReader,
+ qt3ds::QT3DSI32 inSlideIndex,
+ SParseSlide *inParentSlide)
+{
+ IDOMReader::Scope __stateScope(inReader);
+ eastl::string theSlideId = GetSlideId(inReader);
+ SParseSlide &theSlide = m_ParseSlideManager.GetOrCreateSlide(theSlideId.c_str(), inSlideIndex);
+ eastl::hash_set<TStrType> theCommandInstances;
+ QT3DSU32 slideAnimActions = 0;
+
+ {
+ IDOMReader::Scope __commandLoopScope(inReader);
+ for (BOOL theSuccess = inReader.MoveToFirstChild(); theSuccess;
+ theSuccess = inReader.MoveToNextSibling()) {
+ IDOMReader::Scope __commandScope(inReader);
+ if (AreEqual(inReader.GetNarrowElementName(), "Add")
+ || AreEqual(inReader.GetNarrowElementName(), "Set")) {
+ bool isSet = AreEqual(inReader.GetNarrowElementName(), "Set");
+
+ const char *theRef;
+ if (inReader.Att("ref", theRef)) {
+ theRef++; // remove the '#'
+
+ // Set/Add command applied to an element *not* in the scene graph.
+ SElementData *theData = m_ParseElementManager.FindElementData(theRef);
+ if (theData == NULL) {
+ QT3DS_ASSERT(false);
+ continue;
+ }
+ // If this element has controlledproperty, need to mark all as referenced
+ // in order for datainput initialisation to find attributes that
+ // are controlled
+ // TODO: we could parse out the exact controlled property names and
+ // set only those as referenced. In this case we might have to expand vec3
+ // type attributes to component parts
+ const char *ctrldProp;
+ const char *observedProp;
+ inReader.Att("controlledproperty", ctrldProp);
+ inReader.Att("observedproperty", observedProp);
+ if (ctrldProp || observedProp)
+ m_ParseElementManager.MarkAllAttributesAsReferenced(*theData, true);
+
+ theCommandInstances.insert(theData->m_Id);
+ if (isSet) {
+ for (eastl::pair<const char *, const char *> theAtt =
+ inReader.GetNarrowFirstAttribute();
+ !IsTrivial(theAtt.first); theAtt = inReader.GetNarrowNextAttribute()) {
+ if (AreEqual(theAtt.first, "ref") || AreEqual(theAtt.first, "shy"))
+ continue;
+
+ SElementPropertyInfo *theProperty =
+ m_ParseElementManager.GetOrCreateProperty(*theData, theAtt.first);
+ // This property exists on both the elements and the slides.
+ if (theProperty) {
+ theProperty->m_ElementFlag = true;
+ theProperty->m_SlideFlag = true;
+ }
+ }
+ // Run through parent animations and forward them *if* this set command does
+ // not have this property present.
+ if (inParentSlide) {
+ TAnimationList *theAnimations =
+ m_ParseSlideManager.GetAnimationsForInstance(*inParentSlide,
+ theData->m_Id);
+ if (theAnimations != NULL) {
+ for (QT3DSU32 animIdx = 0, animEnd = theAnimations->size();
+ animIdx < animEnd; ++animIdx) {
+ SParseAnimationRef &theEntry((*theAnimations)[animIdx]);
+ const char8_t *propValue = "";
+ SElementPropertyInfo *thePropInfo =
+ m_ParseElementManager.FindProperty(
+ *theData, theEntry.m_PropertyName.c_str());
+ if (!thePropInfo) {
+ QT3DS_ASSERT(false);
+ continue;
+ }
+ // If the attribute doesn't exist in the command, then we
+ // forward the animation to here
+ if (inReader.Att(thePropInfo->m_PropertyName, propValue)
+ == false) {
+ ++slideAnimActions;
+ m_ParseSlideManager.ReferenceAnimation(
+ theSlide, *theEntry.m_Animation, true);
+ }
+ }
+ }
+ }
+ }
+
+ // find all the animations, regardless of add or set.
+ {
+ IDOMReader::Scope __animationScope(inReader);
+ for (BOOL theAnimScopeSuccess = inReader.MoveToFirstChild("AnimationTrack");
+ theAnimScopeSuccess;
+ theAnimScopeSuccess = inReader.MoveToNextSibling("AnimationTrack")) {
+ const char *theProperty;
+ const char8_t *theValue = "";
+ inReader.Value(theValue);
+ if (theValue != NULL && *theValue
+ && inReader.UnregisteredAtt("property", theProperty)) {
+ m_ParseElementManager.MarkAttributeAsReferenced(*theData,
+ theProperty);
+ // PreParse the animation at this point. This allows us to easily
+ // count animations.
+ bool isDynamic = false;
+ inReader.Att("dynamic", isDynamic);
+ SParseSlideAnimationTypes::Enum theParseType =
+ SParseSlideAnimationTypes::EaseInOut;
+ const char8_t *animType;
+ if (inReader.Att("type", animType)) {
+ if (AreEqual(animType, "EaseInOut")) {
+ } else if (AreEqual(animType, "Bezier"))
+ theParseType = SParseSlideAnimationTypes::Bezier;
+ else if (AreEqual(animType, "Linear"))
+ theParseType = SParseSlideAnimationTypes::Linear;
+ else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ ++slideAnimActions;
+ m_ParseSlideManager.SetAnimationData(
+ theSlide, theData->m_Id, theProperty, theValue, theParseType,
+ isDynamic, inSlideIndex != 0);
+ }
+ }
+ }
+
+ // find all the actions
+ {
+ IDOMReader::Scope __actionScope(inReader);
+ for (BOOL theActionScopeSuccess = inReader.MoveToFirstChild("Action");
+ theActionScopeSuccess;
+ theActionScopeSuccess = inReader.MoveToNextSibling("Action")) {
+ const char8_t *theActionId;
+ // Don't cache reference actions
+ if (inReader.Att("id", theActionId)) {
+ m_ActionHelper->CacheAction(inReader, theData->m_Id);
+ bool active = true;
+ inReader.Att("eyeball", active);
+ ++slideAnimActions;
+ m_ParseSlideManager.GetOrCreateAction(
+ theSlide, theActionId,
+ m_ActionHelper->GetActionCount(theActionId), active);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // Now forward all animations from the parent slide that are for instances that we haven't
+ // covered at all on this slide.
+ if (inParentSlide) {
+ for (TInstanceIdAnimationMap::iterator theIter = inParentSlide->m_Animations.begin(),
+ theEnd = inParentSlide->m_Animations.end();
+ theIter != theEnd; ++theIter) {
+ if (theCommandInstances.find(theIter->first) == theCommandInstances.end()) {
+ TAnimationList &theList(theIter->second);
+ for (QT3DSU32 animIdx = 0, animEnd = theList.size(); animIdx < animEnd; ++animIdx) {
+ SParseAnimationRef &theEntry(theList[animIdx]);
+ m_ParseSlideManager.ReferenceAnimation(theSlide, *theEntry.m_Animation, true);
+ ++slideAnimActions;
+ }
+ }
+ }
+ // Forward action creation onto this slide.
+ for (TActionList::iterator theIter = inParentSlide->m_ActionList.begin(),
+ theEnd = inParentSlide->m_ActionList.end();
+ theIter != theEnd; ++theIter) {
+ SParseSlideActionEntry &theAction(*theIter);
+ m_ParseSlideManager.GetOrCreateAction(theSlide, theAction.m_ActionId,
+ theAction.m_ActionCount, theAction.m_Active);
+ ++slideAnimActions;
+ }
+ }
+
+ eastl::vector<eastl::string> theChildSlideIds;
+
+ for (BOOL theSuccess = inReader.MoveToFirstChild("State"); theSuccess;
+ theSuccess = inReader.MoveToNextSibling("State")) {
+ IDOMReader::Scope __subSlideScope(inReader);
+ ++inSlideIndex;
+ theChildSlideIds.push_back(GetSlideId(inReader));
+ CacheLogicRequiredAttributes(inReader, inSlideIndex, &theSlide);
+ }
+
+ // Pull all child animations up into this slide, but set them to deactivated.
+ for (QT3DSU32 childSlideIdx = 0, childSlideEnd = theChildSlideIds.size();
+ childSlideIdx < childSlideEnd; ++childSlideIdx) {
+ SParseSlide *theChildSlide =
+ m_ParseSlideManager.FindSlide(theChildSlideIds[childSlideIdx].c_str());
+ if (theChildSlide) {
+ // Add animations that did not original in this slide to this slide.
+ for (TInstanceIdAnimationMap::iterator theIter = theChildSlide->m_Animations.begin(),
+ theEnd = theChildSlide->m_Animations.end();
+ theIter != theEnd; ++theIter) {
+ TAnimationList &theList(theIter->second);
+ for (QT3DSU32 animIdx = 0, animEnd = theList.size(); animIdx < animEnd; ++animIdx) {
+ SParseAnimationRef &theEntry(theList[animIdx]);
+ if (theEntry.m_Animation
+ && theEntry.m_Animation->m_SlideId != theSlide.m_SlideId) {
+ m_ParseSlideManager.ReferenceAnimation(theSlide, *theEntry.m_Animation,
+ false);
+ ++slideAnimActions;
+ }
+ }
+ }
+ for (TActionList::iterator theIter = theChildSlide->m_ActionList.begin(),
+ theEnd = theChildSlide->m_ActionList.end();
+ theIter != theEnd; ++theIter) {
+ SParseSlideActionEntry &theEntry(*theIter);
+ // This deactivates actions that may be active on another slide.
+ m_ParseSlideManager.GetOrCreateAction(theSlide, theEntry.m_ActionId,
+ theEntry.m_ActionCount, false);
+ ++slideAnimActions;
+ }
+ }
+ }
+ // qt3ds::NVFoundationBase& fnd(
+ // m_CurrentPresentation->GetApplication().GetRuntimeFactory().GetFoundation() );
+ // fnd.error( QT3DS_TRACE, "Loading slide %s, %d anim actions", theSlideId.c_str(),
+ // slideAnimActions );
+
+ return TRUE;
+}
+
+void CUIPParserImpl::CacheClassRequiredAttributes(qt3dsdm::IDOMReader &inReader)
+{
+ {
+ // First, we parse Graph section to cache custom attributes specified by the class
+ IDOMReader::Scope __graphScope(inReader);
+ inReader.MoveToFirstChild("Graph");
+ CacheClassSceneAttributes(inReader);
+ }
+ if (!m_IdClassMap.empty()) {
+ // Next, we parse Logic section to update the references
+ IDOMReader::Scope __logicScope(inReader);
+ inReader.MoveToFirstChild("Logic");
+ CacheClassStateAttributes(inReader);
+ }
+}
+
+void CUIPParserImpl::CacheClassSceneAttributes(IDOMReader &inReader)
+{
+ IDOMReader::Scope __childScope(inReader);
+ // build out the graph.
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ const char *theId;
+ const char *theClass;
+ if (inReader.Att("class", theClass) && inReader.Att("id", theId)) {
+ // Add to id-class map
+ m_IdClassMap[theId] = theClass;
+ }
+ CacheClassSceneAttributes(inReader);
+ }
+}
+
+void CUIPParserImpl::CacheClassStateAttributes(IDOMReader &inReader)
+{
+ IDOMReader::Scope __childScope(inReader);
+
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "State"))
+ CacheClassStateAttributes(inReader);
+ else if (AreEqual(inReader.GetNarrowElementName(), "Add")
+ || AreEqual(inReader.GetNarrowElementName(), "Set")) {
+ const char *theRef;
+ if (inReader.Att("ref", theRef)) {
+ theRef++; // remove the '#'
+
+ // Find the class, if any
+ TIdClassMap::iterator theIter = m_IdClassMap.find(theRef);
+ if (theIter != m_IdClassMap.end()) {
+ // Get References of the class
+ eastl::vector<eastl::string> theReferences;
+ m_MetaData.GetReferences("", theReferences, theIter->second.c_str());
+ if (!theReferences.empty()) {
+ // Cache the references
+ m_ObjectRefHelper->MarkAllReferencedAttributes(
+ theRef, theReferences, inReader, m_ParseElementManager);
+ }
+ }
+ }
+ }
+ }
+}
+
+//==============================================================================
+/**
+ * For ElementRef type, there could be times where the SElement isn't created yet, thus
+ * this method cache those Long4 type and add an empty attribute into the SElement
+ */
+void CUIPParserImpl::AddElementRefToPatch(TPropertyDescAndValueList &outDescList,
+ SElementData &inElement, const char *inName,
+ const char *inValue)
+{
+ SElementRefCache theElementRefData;
+ theElementRefData.m_Element = &inElement;
+ theElementRefData.m_Name = inName;
+ theElementRefData.m_Value = inValue;
+ m_ElementRefCache.push_back(theElementRefData);
+
+ UVariant theValue;
+ theValue.m_ElementHandle = 0;
+ outDescList.push_back(
+ eastl::make_pair(SPropertyDesc(m_ParseElementManager.m_StringTable.RegisterStr(inName),
+ ATTRIBUTETYPE_ELEMENTREF),
+ theValue));
+}
+
+//==============================================================================
+/**
+ * For those Long4 type that was not loaded correctly, go through all of them and
+ * fix up the ElementRef
+ */
+void CUIPParserImpl::PatchSceneElementRef()
+{
+ for (eastl::vector<SElementRefCache>::iterator theIter = m_ElementRefCache.begin();
+ theIter != m_ElementRefCache.end(); ++theIter) {
+ SElementRefCache &theCache = *theIter;
+
+ SElementData *theElementData = GetElementData(theCache.m_Value.c_str());
+
+ SElement *theElement = theCache.m_Element->m_Element;
+ UVariant *theValue = theElement->FindPropertyValue(
+ m_ParseElementManager.RegisterStr(theCache.m_Value.c_str()));
+ if (theValue) {
+ theValue->m_ElementHandle = 0;
+ if (theElementData->m_Element) {
+ theValue->m_ElementHandle = theElementData->m_Element->GetHandle();
+ QT3DS_ASSERT(theValue->m_ElementHandle);
+ }
+ }
+ }
+}
+
+BOOL CUIPParserImpl::LoadLogic(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader)
+{
+ IDOMReader::Scope __logicScope(inReader);
+
+ m_NumSlides = 0;
+ m_NumSlideElements = 0;
+ m_NumSlideAttributes = 0;
+ m_NumAnimationTracks = 0;
+ m_NumAnimationKeys = 0;
+ m_NumSlideAnimations = 0;
+ m_NumSlideActions = 0;
+
+ bool theStatus = true;
+
+ // Build all of the animation objects that we have tallied up.
+ for (QT3DSU32 animIdx = 0, animEnd = m_ParseSlideManager.m_Animations.size(); animIdx < animEnd;
+ ++animIdx) {
+ SParseSlideAnimationEntry &theEntry = *m_ParseSlideManager.m_Animations[animIdx];
+ SElementData *theData = m_ParseElementManager.FindElementData(theEntry.m_InstanceId);
+ // Generate valid animation indexes while we are at it.
+ LoadAnimationTrack(inPresentation, *theData, theEntry);
+ }
+
+ if (inReader.MoveToFirstChild("Logic")) {
+
+ // Action
+ m_ActionHelper->BuildActions(inPresentation);
+
+ for (BOOL theSuccess = inReader.MoveToFirstChild("State"); theSuccess;
+ theSuccess = inReader.MoveToNextSibling("State")) {
+ theStatus &= LoadStateGraph(inPresentation, inReader);
+ }
+ }
+
+ return theStatus;
+}
+
+//==============================================================================
+/**
+ * Load the State (Slides)
+ * @param inPresentation presentation written to
+ * @return a flag indicating whether or not we successfully loaded the file
+ */
+BOOL CUIPParserImpl::LoadStateGraph(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader)
+{
+ IDOMReader::Scope __slideScope(inReader);
+
+ BOOL theStatus = true;
+
+ SElement *theComponent = NULL;
+ const char8_t *theAttribute;
+ if (inReader.UnregisteredAtt("component", theAttribute))
+ theComponent = GetElement(theAttribute);
+ if (theComponent) {
+ INT32 theSlideIndex = 0;
+ LoadState(inPresentation, theComponent, theSlideIndex, inReader);
+
+ for (BOOL theResult = inReader.MoveToFirstChild("State"); theResult;
+ theResult = inReader.MoveToNextSibling("State")) {
+ if (theStatus)
+ theStatus &= LoadState(inPresentation, theComponent, ++theSlideIndex, inReader);
+ }
+ } else {
+ if (theAttribute) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Slide load failure!! Failed to find component: " << theAttribute;
+ } else {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Slide load failure!! Failed to find component.";
+ }
+ }
+
+ return theStatus;
+}
+
+//==============================================================================
+/**
+ * Load the State (Slides)
+ * @param inPresentation presentation written to
+ * @return a flag indicating whether or not we successfully loaded the file
+ */
+BOOL CUIPParserImpl::LoadState(IPresentation &inPresentation, SElement *inComponent,
+ INT32 inSlideIndex, qt3dsdm::IDOMReader &inReader)
+{
+ IDOMReader::Scope __stateScope(inReader);
+
+ BOOL theResult = true;
+ ISlideSystem &theBuilder = inPresentation.GetSlideSystem();
+
+ eastl::string theSlideName = GetSlideName(inReader);
+
+ qt3ds::runtime::SSlidePlayInformation thePlayMode = GetPlayMode(inReader);
+ thePlayMode.m_PlayThroughTo = (QT3DSU8)GetPlayThroughTo(inSlideIndex, inReader);
+ // Setup with the default value from the metadata
+ INT32 theMinTime = m_MetaData.GetPropertyValueLong(m_MetaData.Register("Asset"),
+ m_MetaData.Register("starttime"));
+ INT32 theMaxTime = m_MetaData.GetPropertyValueLong(m_MetaData.Register("Asset"),
+ m_MetaData.Register("endtime"));
+
+ theBuilder.AddSlide(*inComponent, theSlideName.c_str(), thePlayMode.m_PlayMode,
+ thePlayMode.m_Paused, thePlayMode.m_PlayThroughTo, theMinTime, theMaxTime);
+ m_NumSlides++;
+
+ m_SlideElements.clear();
+ m_SlideElements.insert(inComponent);
+
+ BOOL theActiveFlag = (inSlideIndex != 0);
+ theBuilder.AddSlideElement(*inComponent, theActiveFlag);
+ ProcessStateRef(inPresentation, inComponent, inSlideIndex == 0, inReader);
+
+ m_NumSlideElements++;
+
+ theMaxTime = 0;
+ theResult &=
+ LoadSlideElements(inPresentation, inReader, inSlideIndex == 0, inComponent, &theMaxTime);
+ if (theMaxTime != 0)
+ theBuilder.SetSlideMaxTime((QT3DSU32)theMaxTime);
+
+ return theResult;
+}
+
+//==============================================================================
+/**
+ * Process the state information to add all the animations and actions that might be setup
+ */
+BOOL CUIPParserImpl::ProcessStateRef(IPresentation &inPresentation, SElement *inComponent,
+ bool inMaster, qt3dsdm::IDOMReader &inReader)
+{
+ IDOMReader::Scope __stateScope(inReader);
+ eastl::string theSlideId = GetSlideId(inReader);
+ for (BOOL theResult = inReader.MoveToFirstChild("Set"); theResult;
+ theResult = inReader.MoveToNextSibling("Set")) {
+ const char8_t *theElementRef;
+ if (inReader.UnregisteredAtt("ref", theElementRef)
+ && GetElement(theElementRef) == inComponent)
+ ProcessSlideAnimAction(inPresentation, theSlideId, inMaster, inReader);
+ }
+ return TRUE;
+}
+
+void CUIPParserImpl::ComputeAndReserveMemory(IPresentation & /*inPresentation*/,
+ qt3dsdm::IDOMReader &inReader)
+{
+ SGraphSectionCount theGraphSectionCount;
+ SLogicSectionCount theLogicSectionCount;
+ SActionSectionCount theActionSectionCount;
+
+ {
+ IDOMReader::Scope __graphScope(inReader);
+ if (inReader.MoveToFirstChild("Graph"))
+ DoGraphSectionCount(inReader, theGraphSectionCount);
+ }
+ DoLogicSectionCount(inReader, theLogicSectionCount);
+ m_ActionHelper->GetActionSectionCount(theActionSectionCount);
+}
+
+void CUIPParserImpl::DoGraphSectionCount(qt3dsdm::IDOMReader &inReader,
+ SGraphSectionCount &outGraphCounter)
+{
+ IDOMReader::Scope __graphScope(inReader);
+
+ for (bool theResult = inReader.MoveToFirstChild(); theResult;
+ theResult = inReader.MoveToNextSibling()) {
+ const char *theTypeStr(inReader.GetNarrowElementName());
+ if (AreEqual(theTypeStr, "Scene") || AreEqual(theTypeStr, "Component"))
+ outGraphCounter.m_ComponentCount++;
+ else
+ outGraphCounter.m_ElementCount++;
+
+ const char *theIdStr;
+ inReader.Att("id", theIdStr);
+ const char *theClassStr;
+ inReader.Att("class", theClassStr);
+
+ // For Behavior, we are adding a string attribute ATTRIBUTE_BEHAVIORSCRIPTS
+ if (AreEqual(theTypeStr, "Behavior") && !IsTrivial(theClassStr)) {
+ ++theClassStr; // remove the '#'
+ TIdSourcePathMap::iterator theSourcePathIter = m_IdScriptMap.find(theClassStr);
+ if (theSourcePathIter != m_IdScriptMap.end()) {
+ outGraphCounter.m_AttributeCount++;
+ outGraphCounter.m_StringAttrCount++;
+ }
+ }
+ SElementData *theData = m_ParseElementManager.FindElementData(theIdStr);
+
+ if (theData) {
+ TAttrMap &thePropertyMap = theData->m_PropertyMap;
+
+ // TODO: Maybe we should make m_IdAttributesMap only stores those valid attributes and
+ // also those attributes that already converted to Runtime type (e.g. position to
+ // position.x .y .z )
+ // then we can really stop calling all the IsValidAttribute all over the place
+ // and we can simple just use the size of the vector here.
+ for (TAttrMap::iterator theIter = thePropertyMap.begin(), theEnd = thePropertyMap.end();
+ theIter != theEnd; ++theIter) {
+ if (theIter->second.m_ElementFlag == false)
+ continue;
+ TStrType thePropertyName(theIter->first);
+ outGraphCounter.m_AttributeCount += theIter->second.m_Arity;
+ if (IsStringType(theIter->second.m_DataType))
+ outGraphCounter.m_StringAttrCount += 1;
+ }
+ }
+
+ DoGraphSectionCount(inReader, outGraphCounter);
+ }
+}
+
+void CUIPParserImpl::DoLogicSectionCount(qt3dsdm::IDOMReader &inReader,
+ SLogicSectionCount &outLogicCounter)
+{
+ IDOMReader::Scope __logicCountScope(inReader);
+
+ if (inReader.MoveToFirstChild("Logic")) {
+ for (bool theResult = inReader.MoveToFirstChild("State"); theResult;
+ theResult = inReader.MoveToNextSibling("State")) {
+ DoStateSectionCount(inReader, 0, outLogicCounter);
+ }
+ }
+}
+
+void CUIPParserImpl::DoStateSectionCount(qt3dsdm::IDOMReader &inReader, Q3DStudio::INT32 inStateIndex,
+ SLogicSectionCount &outLogicCounter)
+{
+ IDOMReader::Scope __slideCountScope(inReader);
+
+ outLogicCounter.m_SlideCount++;
+
+ INT32 theChildSlideCount = inReader.CountChildren("State");
+ outLogicCounter.m_SlideElementCount++; // this slide is also an element
+ Q3DStudio::INT32 theChildStateIndex(inStateIndex + 1);
+
+ for (bool theResult = inReader.MoveToFirstChild(); theResult;
+ theResult = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "State")) {
+ DoStateSectionCount(inReader, theChildStateIndex, outLogicCounter);
+ ++theChildStateIndex;
+ } else if (AreEqual(inReader.GetNarrowElementName(), "Add")
+ || AreEqual(inReader.GetNarrowElementName(), "Set")) {
+ // SlideMultipler is used as follows:
+ // For every element, animation or action, the slide is used to turn on/off them
+ // Hence, if it is inside master, it will have an entry in the master and all the child
+ // slides in the SlideManager ( hence, theChildSlideCount + 1 )
+ // if it is local, it will have an entry in the master and it's slide, ( thus 2 )
+ // the assumption made here is that State in uip is definitely 2 level, hence if it has
+ // no child slides, it is definitely master
+ INT32 theSlideMultiplier;
+ if (theChildSlideCount == 0)
+ theSlideMultiplier = 2;
+ else
+ theSlideMultiplier = theChildSlideCount + 1;
+ DoRefSectionCount(inReader, theSlideMultiplier, inStateIndex, outLogicCounter);
+ }
+ }
+}
+
+//==============================================================================
+/**
+ * @ param inNumSlideMultiplier To know how this is used, see comments on the place
+ *where SlideMultipler is calculated
+ */
+void CUIPParserImpl::DoRefSectionCount(qt3dsdm::IDOMReader &inReader, INT32 inNumSlideMultiplier,
+ INT32, SLogicSectionCount &outLogicCounter)
+{
+ IDOMReader::Scope __refCountScope(inReader);
+ const char8_t *theElementRef;
+ inReader.UnregisteredAtt("ref", theElementRef);
+ SElementData *theData(m_ParseElementManager.FindElementData(theElementRef));
+ if (theData == NULL) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+
+ if (AreEqual(inReader.GetNarrowElementName(), "Add"))
+ outLogicCounter.m_SlideElementCount += inNumSlideMultiplier;
+
+ // There are cases where some attributes only appear in the local slide element, but not at the
+ // master slide. e.g. endTime.
+ // For these attributes, we must make sure that it is added to the slide element attribute of
+ // the master, so that everything will work correctly.
+ // This is done via the slide force flag on the element property object.
+ for (TAttrMap::iterator theIter = theData->m_PropertyMap.begin(),
+ theEnd = theData->m_PropertyMap.end();
+ theIter != theEnd; ++theIter) {
+ const char8_t *theAttValue = "";
+ bool hasAtt = inReader.UnregisteredAtt(theIter->first.c_str(), theAttValue);
+ if (theIter->second.m_SlideFlag == true
+ && (theIter->second.m_SlideForceFlag == true || hasAtt == true)) {
+ outLogicCounter.m_SlideAttributeCount += theIter->second.m_Arity * inNumSlideMultiplier;
+ }
+ // Strings we may still load regardless
+ if (hasAtt && IsStringType(theIter->second.m_DataType))
+ outLogicCounter.m_StringAttrCount += 1;
+ }
+ // Always add padding for now till I can figure out exactly why padding is needed
+ // and find a minimal way to handle it.
+ outLogicCounter.m_PaddingCount += inNumSlideMultiplier;
+}
+
+qt3ds::runtime::SSlidePlayInformation CUIPParserImpl::GetPlayMode(qt3dsdm::IDOMReader &inReader)
+{
+ using qt3ds::runtime::PlayMode;
+
+ qt3ds::runtime::SSlidePlayInformation thePlayInformation;
+ // Setup with the default value from the metadata
+ eastl::string thePlayMode = m_MetaData.GetPropertyValueString(m_MetaData.Register("Slide"),
+ m_MetaData.Register("playmode"));
+ PlayMode::Enum theMode = PlayMode::StopAtEnd;
+
+ if (thePlayMode == "Looping") {
+ theMode = PlayMode::Looping;
+ } else if (thePlayMode == "PingPong") {
+ theMode = PlayMode::PingPong;
+ } else if (thePlayMode == "Ping") {
+ theMode = PlayMode::Ping;
+ } else if (thePlayMode == "Play Through To...") {
+ theMode = PlayMode::PlayThroughTo;
+ }
+ thePlayInformation.m_PlayMode = theMode;
+
+ eastl::string theInitialPlayState = m_MetaData.GetPropertyValueString(
+ m_MetaData.Register("Slide"), m_MetaData.Register("initialplaystate"));
+ if (theInitialPlayState == "Pause")
+ thePlayInformation.m_Paused = true;
+
+ const char *theAttribute;
+ if (inReader.Att("playmode", theAttribute)) {
+ if (AreEqual(theAttribute, "Play Through To...")) {
+ thePlayInformation.m_PlayMode = PlayMode::PlayThroughTo;
+ } else if (AreEqual(theAttribute, "Stop at end")) {
+ thePlayInformation.m_PlayMode = PlayMode::StopAtEnd;
+ } else if (AreEqual(theAttribute, "Looping")) {
+ thePlayInformation.m_PlayMode = PlayMode::Looping;
+ } else if (AreEqual(theAttribute, "PingPong")) {
+ thePlayInformation.m_PlayMode = PlayMode::PingPong;
+ } else if (AreEqual(theAttribute, "Ping")) {
+ thePlayInformation.m_PlayMode = PlayMode::Ping;
+ }
+ }
+
+ if (inReader.Att("initialplaystate", theAttribute)) {
+ if (AreEqual(theAttribute, "Play"))
+ thePlayInformation.m_Paused = false;
+ else
+ thePlayInformation.m_Paused = true;
+ }
+
+ return thePlayInformation;
+}
+
+INT32 CUIPParserImpl::GetPlayThroughTo(INT32 inCurrentSlideIndex, qt3dsdm::IDOMReader &inReader)
+{
+ // Just hardcode it to Next since we know from the metadata the default is Next.
+ // If we want to query from MetaData, need to write accessor to get back SStringOrInt
+ INT32 thePlayThroughTo = inCurrentSlideIndex + 1;
+
+ const char *theAttribute;
+ if (inReader.Att("playthroughto", theAttribute) && *theAttribute) {
+ if (AreEqual(theAttribute, "Previous"))
+ thePlayThroughTo = inCurrentSlideIndex - 1;
+ else if (AreEqual(theAttribute, "Next"))
+ thePlayThroughTo = inCurrentSlideIndex + 1;
+ else if (theAttribute[0] == '#') {
+ theAttribute++;
+ SParseSlide *theSlide = m_ParseSlideManager.FindSlide(theAttribute);
+ if (theSlide)
+ thePlayThroughTo = theSlide->m_SlideIndex;
+ else
+ Q_ASSERT(!"Slide Not Found");
+ }
+ }
+
+ return thePlayThroughTo;
+}
+
+eastl::string CUIPParserImpl::GetSlideName(qt3dsdm::IDOMReader &inReader)
+{
+ eastl::string theSlideName;
+ if (!inReader.Att("name", theSlideName))
+ inReader.Att("id", theSlideName);
+ return theSlideName;
+}
+
+eastl::string CUIPParserImpl::GetSlideId(qt3dsdm::IDOMReader &inReader)
+{
+ eastl::string theSlideId;
+ if (!inReader.Att("id", theSlideId))
+ inReader.Att("component", theSlideId);
+ return theSlideId;
+}
+
+// In the event we added something to the slide, we return the element data.
+SElementData *CUIPParserImpl::AddSlideElement(IPresentation &inPresentation, bool inMaster,
+ qt3dsdm::IDOMReader &inReader, INT32 *outMaxTime)
+{
+ ISlideSystem &theBuilder = inPresentation.GetSlideSystem();
+
+ SElementData *theElementData = NULL;
+ const char8_t *theElementRef = "";
+ if (inReader.UnregisteredAtt("ref", theElementRef))
+ theElementData = m_ParseElementManager.FindElementData(theElementRef);
+
+ SElement *theElement = theElementData ? theElementData->m_Element : NULL;
+ if (theElement) {
+ if (m_SlideElements.find(theElement) == m_SlideElements.end()) {
+ const char *theEyeball;
+ bool theActiveFlag = !(
+ inMaster || (inReader.Att("eyeball", theEyeball) && AreEqual(theEyeball, "False")));
+
+ m_SlideElements.insert(theElement);
+ theBuilder.AddSlideElement(*theElement, theActiveFlag);
+ m_NumSlideElements++;
+ if (outMaxTime) {
+ INT32 theElementMaxTime = 0;
+ SElement *theParent = theElement->GetParent();
+ if (theParent && theParent->IsComponent() && theElement) {
+ // Ignore material durations (in practice this is always a material container)
+ qt3dsdm::ComposerObjectTypes::Enum composerType(
+ qt3dsdm::ComposerObjectTypes::Convert(theElementData->m_Type.c_str()));
+ if (composerType != qt3dsdm::ComposerObjectTypes::Material
+ && inReader.Att("endtime", theElementMaxTime) == false) {
+ theElementMaxTime = m_MetaData.GetPropertyValueLong(
+ theElementData->m_Type, m_MetaData.Register("endtime"),
+ theElementData->m_Class);
+ }
+ *outMaxTime = NVMax(*outMaxTime, theElementMaxTime);
+ }
+ }
+ } else
+ theElementData = NULL;
+ }
+
+ return theElementData;
+}
+
+BOOL CUIPParserImpl::LoadSlideElements(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader,
+ bool inMaster, SElement *inComponent, INT32 *outMaxTime)
+{
+ BOOL theSuccess = true;
+
+ {
+ IDOMReader::Scope __childScope(inReader);
+ eastl::string theSlideId = GetSlideId(inReader);
+ eastl::string theActionIdStr;
+ // Setup the add/set commands for this slide.
+ {
+ IDOMReader::Scope __slideScope(inReader);
+ // Load all the animations for this slide right now:
+
+ SParseSlide *theSlide = m_ParseSlideManager.FindSlide(theSlideId.c_str());
+ // All animations and actions added to the master slide are deactivated.
+ QT3DSU32 animActions = 0;
+ if (theSlide) {
+ bool canActivateFlag = !inMaster;
+ ISlideSystem &theBuilder = inPresentation.GetSlideSystem();
+ for (TInstanceIdAnimationMap::iterator
+ theInstAnimIter = theSlide->m_Animations.begin(),
+ theInstAnimEnd = theSlide->m_Animations.end();
+ theInstAnimIter != theInstAnimEnd; ++theInstAnimIter) {
+ const TAnimationList &theAnimList(theInstAnimIter->second);
+ for (QT3DSU32 theAnimIdx = 0, theAnimEnd = theAnimList.size();
+ theAnimIdx < theAnimEnd; ++theAnimIdx) {
+ theBuilder.AddSlideAnimAction(
+ true, theAnimList[theAnimIdx].m_Animation->m_AnimationIndex,
+ theAnimList[theAnimIdx].m_Active && canActivateFlag);
+ ++animActions;
+ }
+ }
+ // Build the actions for this slide.
+ for (TActionList::iterator theActionIter = theSlide->m_ActionList.begin(),
+ theActionEnd = theSlide->m_ActionList.end();
+ theActionIter != theActionEnd; ++theActionIter) {
+ SParseSlideActionEntry &theActionEntry(*theActionIter);
+ theActionIdStr.assign(theActionEntry.m_ActionId.c_str());
+ qt3ds::QT3DSI32 theActionIndex = m_ActionHelper->GetActionIndex(theActionIdStr);
+ for (qt3ds::QT3DSI32 idx = 0; idx < theActionEntry.m_ActionCount; ++idx) {
+ qt3ds::runtime::SSlideAnimAction *theSlideData =
+ theBuilder.AddSlideAnimAction(false, theActionIndex + idx,
+ theActionEntry.m_Active
+ && canActivateFlag);
+ theActionEntry.m_Actions[idx] = theSlideData;
+ ++animActions;
+ }
+ }
+
+ // qt3ds::NVFoundationBase& fnd(
+ // inPresentation.GetApplication().GetRuntimeFactory().GetFoundation() );
+ // fnd.error( QT3DS_TRACE, "Loading slide %s, %d anim actions", theSlideId.c_str(),
+ // animActions );
+ }
+ for (BOOL theResult = inReader.MoveToFirstChild(); theResult;
+ theResult = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "Add")
+ || AreEqual(inReader.GetNarrowElementName(), "Set")) {
+ SElementData *theAddedElement =
+ AddSlideElement(inPresentation, inMaster, inReader, outMaxTime);
+ if (theAddedElement && theAddedElement->m_Element) {
+ LoadSlideElementAttrs(inPresentation, inMaster, *theAddedElement, inReader,
+ inComponent);
+ // This can define actions or set the active
+ ProcessSlideAnimAction(inPresentation, theSlideId, inMaster, inReader);
+ }
+ }
+ }
+ }
+ // Pull add commands from child slides into master slide with active=false
+ // else things won't get reset when we switch slides.
+ {
+ // All child state adds go into this object with active set to false
+ IDOMReader::Scope __masterScope(inReader);
+ for (BOOL theResult = inReader.MoveToFirstChild("State"); theResult;
+ theResult = inReader.MoveToNextSibling("State")) {
+ IDOMReader::Scope __childScope(inReader);
+ for (BOOL theResult = inReader.MoveToFirstChild("Add"); theResult;
+ theResult = inReader.MoveToNextSibling("Add")) {
+ // Add the slide element, setting the active flag to false.
+ AddSlideElement(inPresentation, inMaster, inReader, outMaxTime);
+ }
+ }
+ }
+ // Pull add commands from master slide for objects in this slide.
+ // We do this after we process the add/set commands for this slide so that objects already
+ // added
+ // get ignored. If we do pull an object forward then we have to set all of the force-set
+ // properties as well
+ // as account for a possible end-time difference.
+ {
+ IDOMReader::Scope __childScope(inReader);
+ inReader.Leave();
+ if (AreEqual(inReader.GetNarrowElementName(), "State")) {
+ TPropertyDescAndValueList theProperties;
+ for (BOOL theResult = inReader.MoveToFirstChild("Add"); theResult;
+ theResult = inReader.MoveToNextSibling("Add")) {
+ theProperties.clear();
+ SElementData *theData =
+ AddSlideElement(inPresentation, inMaster, inReader, NULL);
+ if (theData) {
+ // Add all forced attributes to this slide.
+ for (TAttrMap::iterator theIter = theData->m_PropertyMap.begin(),
+ theEnd = theData->m_PropertyMap.end();
+ theIter != theEnd; ++theIter) {
+ if (theIter->second.m_SlideForceFlag) {
+ GetMetaAttribute(inPresentation, theProperties, theData->m_Type,
+ theIter->first, theData->m_Class,
+ theIter->second.m_PropertyNames);
+ }
+ }
+ ISlideSystem &theBuilder = inPresentation.GetSlideSystem();
+ for (TPropertyDescAndValueList::iterator theIter = theProperties.begin();
+ theIter != theProperties.end(); ++theIter) {
+ theBuilder.AddSlideAttribute(theIter->first.GetAttributeKey(),
+ theIter->second);
+ m_NumSlideAttributes++;
+ }
+
+ // Ensure the actual end time is accounted for.
+ if (outMaxTime && theData->m_Element) {
+ SElement *theParent = theData->m_Element->GetParent();
+ if (theParent && theParent->IsComponent()) {
+ // Ignore material durations
+ // (in practice this is always a material container)
+ qt3dsdm::ComposerObjectTypes::Enum composerType(
+ qt3dsdm::ComposerObjectTypes::Convert(theData->m_Type.c_str()));
+ if (composerType != qt3dsdm::ComposerObjectTypes::Material) {
+ long theoutMaxTime = (long)*outMaxTime;
+ long theMaxTime = m_MetaData.GetPropertyValueLong(
+ theData->m_Type, m_MetaData.Register("endtime"),
+ theData->m_Class);
+ *outMaxTime = NVMax(theoutMaxTime, theMaxTime);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return theSuccess;
+}
+
+BOOL CUIPParserImpl::LoadSlideElementAttrs(IPresentation &inPresentation, bool,
+ SElementData &inElementData, qt3dsdm::IDOMReader &inReader,
+ SElement *inComponent)
+{
+ ISlideSystem &theBuilder = inPresentation.GetSlideSystem();
+
+ TPropertyDescAndValueList theAttributeList;
+
+ const char8_t *theRef = "";
+ inReader.Att("ref", theRef);
+ if (theRef && *theRef && theRef[0] == '#')
+ ++theRef;
+ bool isSet = AreEqual(inReader.GetNarrowElementName(), "Set");
+ const char8_t *sourcepath;
+ if (inReader.UnregisteredAtt("sourcepath", sourcepath)) {
+ const char8_t *mapping;
+ bool ibl = false;
+ if (inReader.UnregisteredAtt("mappingmode", mapping)) {
+ if (QString::fromUtf8(mapping) == QLatin1String("Light Probe"))
+ ibl = true;
+ }
+ AddSourcePath(sourcepath, ibl);
+ theBuilder.AddSourcePath(sourcepath);
+ m_slideSourcePaths.push_back(QString::fromLatin1(sourcepath));
+ }
+
+ // We don't force set attributes when a given component has a set command within one of its
+ // child states. This happens in the case of actions (but nothing else).
+ bool shouldForce = inElementData.m_Element != inComponent;
+ for (TAttrMap::iterator theIter = inElementData.m_PropertyMap.begin(),
+ theEnd = inElementData.m_PropertyMap.end();
+ theIter != theEnd; ++theIter) {
+ const char8_t *theAttValue = "";
+ bool hasAtt = inReader.UnregisteredAtt(theIter->first, theAttValue);
+ QT3DSU32 previousListSize = theAttributeList.size();
+ if (hasAtt == false) {
+ // StartTime and EndTime in Master Slide are useless, so set it to the value in the
+ // metadata.
+ // if we look at the uip file, if the element doesn't have endTime, it means is 10000ms,
+ // and not really the value in the master slide
+ // this make it special from other attributes
+ if (theIter->second.m_SlideForceFlag && shouldForce)
+ GetMetaAttribute(inPresentation, theAttributeList, inElementData.m_Type,
+ theIter->first, inElementData.m_Class,
+ theIter->second.m_PropertyNames);
+ } else {
+ // Only use the attribute list from set blocks to set values into the slide, not from
+ // add attributes
+ // This isn't completely correct
+ GetAttributeList(inPresentation, theAttributeList, inElementData.m_Type, theIter->first,
+ inElementData.m_Class, theAttValue, theIter->second.m_PropertyNames);
+ }
+ if (isSet == false && theIter->second.m_SlideForceFlag == false) {
+ if (inElementData.m_Element != NULL && theIter->second.m_ElementFlag) {
+ for (QT3DSU32 idx = previousListSize, end = theAttributeList.size(); idx < end;
+ ++idx) {
+ UVariant *theValue = inElementData.m_Element->FindPropertyValue(
+ theAttributeList[idx].first.m_Name);
+ if (theValue) {
+ *theValue = theAttributeList[idx].second;
+ }
+ }
+ }
+ theAttributeList.resize(previousListSize);
+ }
+ }
+ for (TPropertyDescAndValueList::iterator theIter = theAttributeList.begin();
+ theIter != theAttributeList.end(); ++theIter) {
+ theBuilder.AddSlideAttribute(theIter->first.GetAttributeKey(), theIter->second);
+ m_NumSlideAttributes++;
+ }
+
+ return TRUE;
+}
+
+void CUIPParserImpl::LoadAnimationTrack(IPresentation &inPresentation, SElementData &inElementData,
+ SParseSlideAnimationEntry &inAnimation)
+{
+ SElementPropertyInfo *theInfo =
+ m_ParseElementManager.FindProperty(inElementData, inAnimation.m_PropertyName);
+ if (theInfo == NULL)
+ return;
+ UINT32 theHashedKey = inAnimation.m_PropertyHash;
+ bool theIsDynamic = inAnimation.m_IsDynamic;
+ INT32 theIndex = inPresentation.GetAnimationSystem().CreateAnimationTrack(
+ *inElementData.m_Element, theHashedKey, theIsDynamic);
+ inAnimation.m_AnimationIndex = theIndex;
+ m_NumAnimationTracks++;
+ bool isRotation = theInfo->m_AdditionalType == ERuntimeAdditionalMetaDataTypeRotation;
+ LoadAnimationKeys(inPresentation, inAnimation, isRotation);
+}
+
+void CUIPParserImpl::LoadAnimationKeys(IPresentation &inPresentation,
+ const SParseSlideAnimationEntry &inAnimation,
+ bool inIsRotation)
+{
+
+ NVConstDataRef<qt3ds::QT3DSF32> theFloatValues(inAnimation.m_KeyframeData.data(),
+ (qt3ds::QT3DSU32)inAnimation.m_KeyframeData.size());
+ switch (inAnimation.m_AnimationType) {
+ case SParseSlideAnimationTypes::Linear:
+ LoadLinearKeys(inPresentation, theFloatValues, inIsRotation);
+ break;
+ case SParseSlideAnimationTypes::Bezier:
+ LoadBezierKeys(inPresentation, theFloatValues, inIsRotation);
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ case SParseSlideAnimationTypes::EaseInOut:
+ LoadEaseInOutKeys(inPresentation, theFloatValues, inIsRotation);
+ break;
+ }
+}
+
+BOOL CUIPParserImpl::LoadBezierKeys(IPresentation &inPresentation, NVConstDataRef<float> &inValues,
+ bool inIsRotation)
+{
+ QT3DS_ASSERT(inValues.size() % 6 == 0);
+ if (inValues.size() % 6 != 0)
+ return FALSE;
+
+ IAnimationSystem &theBuilder = inPresentation.GetAnimationSystem();
+
+ float theTime;
+ float theValue;
+ float theC1Time;
+ float theC1Value;
+ float theC2Time;
+ float theC2Value;
+
+ const float *theIter = inValues.begin();
+
+ long theNumKeys = inValues.size() / 6;
+ QT3DS_ASSERT(theNumKeys > 0);
+ for (long theIndex = 0; theIndex < theNumKeys; ++theIndex) {
+ theTime = *theIter * 1000.0f;
+ ++theIter;
+ theValue = *theIter;
+ ++theIter;
+ ++theIter; // just increment the iterator, C2Time is set below
+ ++theIter; // just increment the iterator, C2Value is set below
+ theC1Time = *theIter * 1000.0f;
+ ++theIter;
+ theC1Value = *theIter;
+ ++theIter;
+
+ if (theIndex == theNumKeys - 1) {
+ // Last keyframe
+ theC2Time = 0.0f;
+ theC2Value = 0.0f;
+ } else {
+ theC2Time = *(theIter + 2) * 1000.0f; // access the next inTangentTime
+ theC2Value = *(theIter + 3); // access the next inTangentValue
+ }
+
+ if (inIsRotation) {
+ TORAD(theValue);
+ TORAD(theC1Value);
+ TORAD(theC2Value);
+ }
+
+ theBuilder.AddKey(theTime, theValue, theC1Time, theC1Value, theC2Time, theC2Value);
+ m_NumAnimationKeys++;
+ }
+ return TRUE;
+}
+
+BOOL CUIPParserImpl::LoadLinearKeys(IPresentation &inPresentation, NVConstDataRef<float> &inValues,
+ bool inIsRotation)
+{
+ QT3DS_ASSERT(inValues.size() % 2 == 0);
+ if (inValues.size() % 2 != 0)
+ return FALSE;
+
+ const float *theIter = inValues.begin();
+
+ long theNumKeys = inValues.size() / 2;
+ float *theEaseInOutValues = new float[theNumKeys * 4];
+ float *theEaseInOutPtr = theEaseInOutValues;
+ for (long theKeyIndex = 0; theKeyIndex < theNumKeys; ++theKeyIndex) {
+ *theEaseInOutPtr++ = *theIter++;
+ *theEaseInOutPtr++ = *theIter++;
+ *theEaseInOutPtr++ = 0.0f;
+ *theEaseInOutPtr++ = 0.0f;
+ }
+
+ NVConstDataRef<float> theFloatValues =
+ NVConstDataRef<float>(theEaseInOutValues, theNumKeys * 4);
+ BOOL theStatus = LoadEaseInOutKeys(inPresentation, theFloatValues, inIsRotation);
+
+ delete[] theEaseInOutValues;
+
+ return theStatus;
+}
+
+CUIPParserImpl::SEaseInEaseOutKeyframe CUIPParserImpl::ParseEaseInOutKey(const float *&inFloatIter)
+{
+ CUIPParserImpl::SEaseInEaseOutKeyframe theKeyframe;
+ theKeyframe.m_Time = *inFloatIter;
+ ++inFloatIter;
+ theKeyframe.m_Value = *inFloatIter;
+ ++inFloatIter;
+ theKeyframe.m_EaseIn = *inFloatIter;
+ ++inFloatIter;
+ theKeyframe.m_EaseOut = *inFloatIter;
+ ++inFloatIter;
+ return theKeyframe;
+}
+
+BOOL CUIPParserImpl::LoadEaseInOutKeys(IPresentation &inPresentation,
+ NVConstDataRef<float> &inValues, bool inIsRotation)
+{
+ QT3DS_ASSERT(inValues.size() % 4 == 0);
+ if (inValues.size() % 4 != 0)
+ return FALSE;
+
+ long theNumKeys = inValues.size() / 4;
+
+ float *theBezierValues = new float[theNumKeys * 6];
+ float *theBezierPtr = theBezierValues;
+
+ SEaseInEaseOutKeyframe thePreviousKeyframe;
+ thePreviousKeyframe.m_Value = 0.0f;
+ SEaseInEaseOutKeyframe theCurrentKeyframe;
+ theCurrentKeyframe.m_Value = 0.0f;
+ SEaseInEaseOutKeyframe theNextKeyframe;
+ theNextKeyframe.m_Value = 0.0f;
+
+ const float *theIter = inValues.begin();
+
+ if (theNumKeys > 0) {
+ theCurrentKeyframe = ParseEaseInOutKey(theIter);
+ float *theNextValuePtr = NULL;
+ float theNextValue;
+
+ if (theNumKeys > 1) {
+ theNextKeyframe = ParseEaseInOutKey(theIter);
+ theNextValue = theNextKeyframe.m_Value;
+ theNextValuePtr = &theNextValue;
+ }
+ CreateBezierKeyframeFromEaseInEaseOutKeyframe(NULL, theCurrentKeyframe, theNextValuePtr,
+ theBezierPtr);
+ }
+
+ for (long theKeyIndex = 1; theKeyIndex < theNumKeys; ++theKeyIndex) {
+ thePreviousKeyframe = theCurrentKeyframe;
+ theCurrentKeyframe = theNextKeyframe;
+
+ float theLastValue = thePreviousKeyframe.m_Value;
+ float *theNextValuePtr = NULL;
+ float theNextValue;
+ if (theKeyIndex + 1 < theNumKeys) {
+ theNextKeyframe = ParseEaseInOutKey(theIter);
+ theNextValue = theNextKeyframe.m_Value;
+ theNextValuePtr = &theNextValue;
+ }
+ CreateBezierKeyframeFromEaseInEaseOutKeyframe(&theLastValue, theCurrentKeyframe,
+ theNextValuePtr, theBezierPtr);
+ }
+
+ NVConstDataRef<float> theFloatValues = NVConstDataRef<float>(theBezierValues, theNumKeys * 6);
+ BOOL theStatus = LoadBezierKeys(inPresentation, theFloatValues, inIsRotation);
+
+ delete[] theBezierValues;
+ return theStatus;
+}
+
+inline float AnimationClamp(float inLowerBound, float inUpperBound, float inValue)
+{
+ if (inValue < inLowerBound)
+ return inLowerBound;
+ if (inValue > inUpperBound)
+ return inUpperBound;
+ return inValue;
+}
+
+void CUIPParserImpl::CreateBezierKeyframeFromEaseInEaseOutKeyframe(
+ float *inPreviousValue, SEaseInEaseOutKeyframe &inCurrent, float *inNextValue,
+ float *&outBezierValues)
+{
+ float theValue = inCurrent.m_Value;
+ float theSeconds = inCurrent.m_Time;
+ float inSeconds = 0.f;
+ float inValue = 0.f;
+ float outSeconds = 0.f;
+ float outValue = 0.f;
+ const double oneThird = 1.0 / 3.0;
+ if (inPreviousValue) {
+ float thePercent = 1.0f - AnimationClamp(0.0f, 1.0f, inCurrent.m_EaseIn / 100.f);
+ double theAmount = 1.0f - thePercent * oneThird;
+ inValue = *inPreviousValue + (float)(((inCurrent.m_Value - *inPreviousValue) * theAmount));
+ }
+ if (inNextValue) {
+ float thePercent = 1.0f - AnimationClamp(0.0f, 1.0f, inCurrent.m_EaseOut / 100.f);
+ double theAmount = thePercent * oneThird;
+ outValue = (float)(inCurrent.m_Value + ((*inNextValue - inCurrent.m_Value) * theAmount));
+ }
+
+ *outBezierValues++ = theSeconds;
+ *outBezierValues++ = theValue;
+ *outBezierValues++ = inSeconds;
+ *outBezierValues++ = inValue;
+ *outBezierValues++ = outSeconds;
+ *outBezierValues++ = outValue;
+}
+
+BOOL CUIPParserImpl::ProcessSlideAnimAction(IPresentation &inPresentation, eastl::string &inSlideId,
+ bool inMaster, qt3dsdm::IDOMReader &inReader)
+{
+ IDOMReader::Scope __animationScope(inReader);
+
+ BOOL theStatus = true;
+
+ for (BOOL theResult = inReader.MoveToFirstChild("Action"); theResult;
+ theResult = inReader.MoveToNextSibling("Action")) {
+ // Get the active flag
+ const char *theEyeball;
+ bool theActiveFlag =
+ !(inMaster || (inReader.Att("eyeball", theEyeball) && AreEqual(theEyeball, "False")));
+ theStatus &= AddSlideAction(inPresentation, inSlideId, theActiveFlag, inReader);
+ }
+
+ return theStatus;
+}
+
+BOOL CUIPParserImpl::AddSlideAction(IPresentation &, eastl::string &inSlideId, bool inActive,
+ qt3dsdm::IDOMReader &inReader)
+{
+ SParseSlide *theSlide = m_ParseSlideManager.FindSlide(inSlideId.c_str());
+ if (theSlide == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+
+ // Get the Action id
+ const char *theRef;
+ if (inReader.Att("ref", theRef)) {
+ theRef++; // remove the '#'
+ SParseSlideActionEntry *theEntry = m_ParseSlideManager.FindAction(*theSlide, theRef);
+ if (theEntry == NULL) {
+ QT3DS_ASSERT(false);
+ return false;
+ }
+ for (qt3ds::QT3DSI32 actIdx = 0; actIdx < theEntry->m_ActionCount; ++actIdx) {
+ if (theEntry->m_Actions[actIdx])
+ theEntry->m_Actions[actIdx]->m_Active = inActive ? 1 : 0;
+ }
+ } else {
+ const char8_t *theActionId;
+ inReader.Att("id", theActionId);
+ SParseSlideActionEntry *theEntry = m_ParseSlideManager.FindAction(*theSlide, theActionId);
+ QT3DS_ASSERT(theEntry);
+ // Check to ensure this action was created.
+ (void)theEntry;
+ }
+
+ return TRUE;
+}
+
+bool CUIPParserImpl::IsStringType(ERuntimeDataModelDataType inDataType)
+{
+ if (inDataType == ERuntimeDataModelDataTypeStringRef
+ || inDataType == ERuntimeDataModelDataTypeString
+ || inDataType == ERuntimeDataModelDataTypeObjectRef)
+ return true;
+ return false;
+}
+
+SElementData *CUIPParserImpl::GetElementData(TStrType inElementName)
+{
+ return m_ParseElementManager.FindElementData(inElementName);
+}
+
+//==============================================================================
+/**
+ * Helper function to to get the SElement object from the element name
+ */
+SElementData *CUIPParserImpl::GetElementData(const char8_t *inElementName)
+{
+ const char8_t *theElementName(inElementName);
+ if (!IsTrivial(inElementName) && inElementName[0] == '#')
+ ++theElementName;
+ return GetElementData(m_MetaData.Register(theElementName));
+}
+
+SElement *CUIPParserImpl::GetElement(const char8_t *inElementName)
+{
+ SElementData *theData(GetElementData(inElementName));
+ if (theData)
+ return theData->m_Element;
+ return NULL;
+}
+
+SElementData *CUIPParserImpl::ParseObjectRef(const eastl::string &inObjectPath,
+ const char8_t *inOwnerId)
+{
+ TStrType theId(ParseObjectRefId(inObjectPath, inOwnerId));
+ return GetElementData(theId);
+}
+
+TStrType CUIPParserImpl::ParseObjectRefId(const eastl::string &inObjectPath,
+ const char8_t *inOwnerId)
+{
+ return m_ObjectRefHelper->ParseObjectRefId(inObjectPath, inOwnerId);
+}
+
+SElementAndType CUIPParserImpl::GetElementForID(const char *inElementName)
+{
+ SElementData *theData = m_ParseElementManager.FindElementData(inElementName);
+ if (theData == NULL)
+ return SElementAndType(UIPElementTypes::Unknown, NULL);
+
+ qt3dsdm::ComposerObjectTypes::Enum theComposerType(
+ qt3dsdm::ComposerObjectTypes::Convert(theData->m_Type.c_str()));
+ UIPElementTypes::Enum theUIPType(UIPElementTypes::Unknown);
+ switch (theComposerType) {
+ case qt3dsdm::ComposerObjectTypes::Scene:
+ theUIPType = UIPElementTypes::Scene;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Layer:
+ theUIPType = UIPElementTypes::Layer;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Group:
+ theUIPType = UIPElementTypes::Group;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Component:
+ theUIPType = UIPElementTypes::Component;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Camera:
+ theUIPType = UIPElementTypes::Camera;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Light:
+ theUIPType = UIPElementTypes::Light;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Model:
+ theUIPType = UIPElementTypes::Model;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Material:
+ theUIPType = UIPElementTypes::Material;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Image:
+ theUIPType = UIPElementTypes::Image;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Behavior:
+ theUIPType = UIPElementTypes::Behavior;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Text:
+ theUIPType = UIPElementTypes::Text;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Effect:
+ theUIPType = UIPElementTypes::Effect;
+ break;
+ case qt3dsdm::ComposerObjectTypes::CustomMaterial:
+ theUIPType = UIPElementTypes::CustomMaterial;
+ break;
+ case qt3dsdm::ComposerObjectTypes::ReferencedMaterial:
+ theUIPType = UIPElementTypes::ReferencedMaterial;
+ break;
+ case qt3dsdm::ComposerObjectTypes::RenderPlugin:
+ theUIPType = UIPElementTypes::RenderPlugin;
+ break;
+ case qt3dsdm::ComposerObjectTypes::Path:
+ theUIPType = UIPElementTypes::Path;
+ break;
+ case qt3dsdm::ComposerObjectTypes::PathAnchorPoint:
+ theUIPType = UIPElementTypes::PathAnchorPoint;
+ break;
+ case qt3dsdm::ComposerObjectTypes::SubPath:
+ theUIPType = UIPElementTypes::PathSubPath;
+ break;
+ default:
+ QT3DS_ASSERT(false);
+ break;
+ }
+ return SElementAndType(theUIPType, theData->m_Element);
+}
+
+eastl::string CUIPParserImpl::ResolveReference(const char *inStringId, const char *inReference)
+{
+ SElementData *theData = ParseObjectRef(inReference, inStringId);
+ if (theData) {
+ return theData->m_Id.c_str();
+ }
+ return eastl::string();
+}
+
+IRuntimeMetaData &CUIPParserImpl::GetMetaData()
+{
+ return m_MetaData;
+}
+
+IUIPParser &IUIPParser::Create(const QString &inFileName, IRuntimeMetaData &inMetaData,
+ IInputStreamFactory &inFactory,
+ qt3ds::foundation::IStringTable &inStrTable)
+{
+ CUIPParserImpl &retval = *new CUIPParserImpl(inFileName, inMetaData, inFactory, inStrTable);
+ return retval;
+}
+}
diff --git a/src/uipparser/Qt3DSUIPParserImpl.h b/src/uipparser/Qt3DSUIPParserImpl.h
new file mode 100644
index 0000000..bca984b
--- /dev/null
+++ b/src/uipparser/Qt3DSUIPParserImpl.h
@@ -0,0 +1,679 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+/*
+This is the main file responsible for conversion from the uip format into the runtime's data format.
+The runtime works in a sort of global space so any object, be it an animation, action or element,
+once
+activated stays activated. Furthermore it is important that the runtime declare and set the fewest
+number
+of properties possible to still get the right answer. In order to achieve this the runtime relies
+on the
+rendering system to have the initial state of the entire scene graph, including state that is only
+"Add"
+commands declared in slides.
+
+Given that you understand master slide/ slide distinction, an accurate description would be to do
+this:
+1. Move all parse objects (actions, animations, elements) to be master objects and deactivate them.
+2. Running through the list of nonmaster slides, activate the objects on those slides that would be
+activated.
+3. Now remove properties that are both unreferenced and applied 1 or fewer times.
+
+
+The parsing system does this in reverse order so the passes look like:
+1. Load meta data information (scripts, effects) to have a complete meta data model.
+1. Build element graph. This is used during attribute lookup
+2. Figure out which attributes will be on the elements in the graph by resolving behavior
+references, action references and
+ Animations, and Set command attribute applications.
+
+ During this pass we also build the set of actions and animations which will appear on each
+slide. This involves both promoting
+ actions/animations that appear on the master slide to child slides and pulling
+animations/actions declared on all child slides
+ onto the master slide.
+
+3. Count the objects that we will need. The runtime currently requires fixed object counts that
+can't be exceeded
+ thus we have to effectively preallocate all runtime objects.
+
+4. Run through the file again and build the actual runtime datastructures. Actions and animations
+are built from
+ an intermediate memory representation but the set commands and element activations are built
+via running through
+ the file.
+
+
+Care needs to be taken so the runtime can survive poorly formed or just meaningless uip files.
+Studio is only *one*
+system for producing UIP files, clients are free to use code generates (like ruby scripts and such)
+to build their final
+uip files so we need to be careful that we are as robust as possible and can tolerate gracefully
+some level of incorrect
+uip file data.
+*/
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSUIPParser.h"
+#include "Qt3DSTypes.h"
+#include "Qt3DSMetadata.h"
+#include "Qt3DSRenderInputStreamFactory.h"
+#include "Qt3DSSlideSystem.h"
+#include "Qt3DSDMDataTypes.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include <EASTL/map.h>
+#include <EASTL/set.h>
+#include <EASTL/hash_map.h>
+#include "Qt3DSElementSystem.h"
+#include "Qt3DSSlideSystem.h"
+
+namespace qt3ds {
+namespace render {
+ class IRefCountedInputStream;
+}
+}
+
+namespace qt3dsdm {
+class IDOMReader;
+class IDOMWriter;
+}
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Forwards
+//==============================================================================
+class IPresentation;
+class SElementBuilder;
+class CContractBuilder;
+class CAnimationBuilder;
+class CLogicBuilder;
+class CSlideBuilder;
+class IRuntimeMetaData;
+class CUIPParserActionHelper;
+class CUIPParserObjectRefHelper;
+
+typedef eastl::vector<qt3ds::runtime::element::TPropertyDescAndValue> TPropertyDescAndValueList;
+
+using qt3ds::render::IInputStreamFactory;
+using qt3ds::render::IRefCountedInputStream;
+typedef NVScopedRefCounted<IRefCountedInputStream> TInputStreamPtr;
+typedef qt3ds::foundation::CRegisteredString TStrType;
+using qt3ds::runtime::element::SElement;
+
+struct SElementPropertyInfo
+{
+ enum Enum {
+ MaxArity = 4,
+ };
+ TStrType m_PropertyName;
+ ERuntimeDataModelDataType m_DataType;
+ ERuntimeAdditionalMetaDataType m_AdditionalType;
+ // Number of sub components of the property, 1-4
+ qt3ds::QT3DSU32 m_Arity;
+ qt3ds::QT3DSU32 m_PropertyHashes[MaxArity];
+ CRegisteredString m_PropertyNames[MaxArity];
+ bool m_ElementFlag; // True if this property exists on the element. Some properties do not.
+ bool m_SlideFlag; // True if this property exists on the slides at all.
+ // starttime,endtime are forced to be on the slides whether they are in the UIP or not.
+ bool m_SlideForceFlag; // True if this property is *forced* on the slides whether it needs to be
+ // there or not
+
+ SElementPropertyInfo(TStrType inPropName)
+ : m_PropertyName(inPropName)
+ , m_DataType(ERuntimeDataModelDataTypeNone)
+ , m_Arity(0)
+ , m_ElementFlag(false)
+ , m_SlideFlag(false)
+ , m_SlideForceFlag(false)
+ {
+ memZero(m_PropertyHashes, sizeof(m_PropertyHashes));
+ }
+ bool operator<(const SElementPropertyInfo &inOther) const
+ {
+ return m_PropertyName < inOther.m_PropertyName;
+ }
+};
+
+typedef eastl::hash_map<TStrType, SElementPropertyInfo> TAttrMap;
+
+struct SElementData
+{
+ SElement *m_Element;
+ TStrType m_Id;
+ TStrType m_Type;
+ TStrType m_Class;
+ TAttrMap m_PropertyMap;
+
+ SElementData(TStrType inId)
+ : m_Element(NULL)
+ , m_Id(inId)
+ {
+ }
+ void SetElement(SElement *inElement, TStrType inType, TStrType inClass)
+ {
+ m_Element = inElement;
+ m_Type = inType;
+ m_Class = inClass;
+ }
+};
+
+typedef eastl::hash_map<TStrType, SElementData> TIdElementMap;
+
+struct SParseElementManager
+{
+ IRuntimeMetaData &m_MetaData;
+ TIdElementMap m_ElementMap;
+ // Temporary variables for various algorithms
+ eastl::string m_Workspace;
+ eastl::vector<eastl::string> m_PropertyList;
+ qt3ds::foundation::IStringTable &m_StringTable;
+
+ SParseElementManager(IRuntimeMetaData &inMetaData, qt3ds::foundation::IStringTable &inStrTable)
+ : m_MetaData(inMetaData)
+ , m_StringTable(inStrTable)
+ {
+ }
+ TStrType RegisterStr(const char8_t *inStr);
+ SElementData &GetOrCreateElementData(const char8_t *inElemIdOrRef, const char8_t *inElemType,
+ const char8_t *inElemClassId);
+ SElementData *FindElementData(const char8_t *inIdOrRef);
+ // We don't allow creation of properties that don't exist in the meta data in the first place.
+ SElementPropertyInfo *GetOrCreateProperty(SElementData &inData, const char8_t *inPropertyName);
+ SElementPropertyInfo *GetOrCreateProperty(const char8_t *inIdOrRef, const char8_t *inElemType,
+ const char8_t *inElemClassId,
+ const char8_t *inPropertyName);
+ SElementPropertyInfo *FindProperty(SElementData &inElement, const char8_t *inPropertyName);
+ SElementPropertyInfo *FindProperty(const char8_t *inIdOrRef, const char8_t *inPropertyName);
+ eastl::pair<SElementPropertyInfo *, qt3ds::QT3DSU32>
+ FindPropertyWithSubIndex(SElementData &inElement, const char8_t *inPropertyName);
+ // Attribute marking stage; mark which attributes will be kept on elements at all.
+ void MarkAttributeAsReferenced(SElementData &inElement, const char8_t *inPropertyName);
+ void MarkAttributeAsReferenced(const char8_t *inElement, const char8_t *inPropertyName);
+ void MarkAllAttributesAsReferenced(SElementData &inElement, bool searchParent = false);
+};
+
+struct SParseSlideActionEntry
+{
+ TStrType m_SlideId;
+ TStrType m_ActionId;
+ qt3ds::QT3DSI32 m_ActionCount;
+ bool m_Active;
+ qt3ds::runtime::SSlideAnimAction *m_Actions[SElementPropertyInfo::MaxArity];
+
+ SParseSlideActionEntry(TStrType inSlideId, TStrType inActionId, qt3ds::QT3DSI32 inActionCount,
+ bool inActive)
+ : m_SlideId(inSlideId)
+ , m_ActionId(inActionId)
+ , m_ActionCount(inActionCount)
+ , m_Active(inActive)
+ {
+ memZero(m_Actions, sizeof(m_Actions));
+ }
+ SParseSlideActionEntry()
+ : m_ActionCount(0)
+ , m_Active(false)
+ {
+ }
+ // Partial equals, used for finding object in vector.
+ bool operator==(const SParseSlideActionEntry &inOther) const
+ {
+ return m_SlideId == inOther.m_SlideId && m_ActionId == inOther.m_ActionId;
+ }
+};
+
+typedef eastl::vector<SParseSlideActionEntry> TActionList;
+
+struct SParseSlideAnimationTypes
+{
+ enum Enum {
+ NoAnimation = 0,
+ Linear,
+ EaseInOut,
+ Bezier,
+ };
+};
+
+struct SParseSlideAnimationEntry
+{
+ TStrType m_SlideId;
+ TStrType m_InstanceId;
+ TStrType m_PropertyName;
+ qt3ds::QT3DSU32 m_PropertyHash;
+ qt3ds::QT3DSI32 m_AnimationIndex;
+ eastl::vector<float> m_KeyframeData;
+ SParseSlideAnimationTypes::Enum m_AnimationType;
+ bool m_IsDynamic;
+
+ SParseSlideAnimationEntry()
+ : m_AnimationIndex(-1)
+ , m_KeyframeData("")
+ , m_AnimationType(SParseSlideAnimationTypes::NoAnimation)
+ , m_IsDynamic(false)
+ {
+ }
+ SParseSlideAnimationEntry(TStrType inSlideId, TStrType inInstanceId, TStrType inPropertyName,
+ qt3ds::QT3DSU32 inPropHash, SParseSlideAnimationTypes::Enum inAnimType,
+ const float *inKeyframeData, qt3ds::QT3DSU32 inNumFloats, bool inIsDynamic)
+ : m_SlideId(inSlideId)
+ , m_InstanceId(inInstanceId)
+ , m_PropertyName(inPropertyName)
+ , m_PropertyHash(inPropHash)
+ , m_AnimationType(inAnimType)
+ , m_IsDynamic(inIsDynamic)
+ {
+ m_KeyframeData.insert(m_KeyframeData.begin(), inKeyframeData, inKeyframeData + inNumFloats);
+ }
+};
+
+struct SParseAnimationRef
+{
+ TStrType m_SlideId;
+ TStrType m_InstanceId;
+ TStrType m_PropertyName;
+ bool m_Active;
+ const SParseSlideAnimationEntry *m_Animation;
+
+ SParseAnimationRef(TStrType inSlideId, TStrType inInstanceId, TStrType inPropName,
+ const SParseSlideAnimationEntry *inAnimation, bool inActive)
+ : m_SlideId(inSlideId)
+ , m_InstanceId(inInstanceId)
+ , m_PropertyName(inPropName)
+ , m_Active(inActive)
+ , m_Animation(inAnimation)
+ {
+ }
+ SParseAnimationRef()
+ : m_Active(false)
+ , m_Animation(NULL)
+ {
+ }
+ // Partial equals, used for finding object in vector.
+ bool operator==(const SParseAnimationRef &inOther) const
+ {
+ return m_SlideId == inOther.m_SlideId && m_InstanceId == inOther.m_InstanceId
+ && m_PropertyName == inOther.m_PropertyName;
+ }
+};
+
+typedef eastl::vector<SParseAnimationRef> TAnimationList;
+
+typedef eastl::hash_map<TStrType, TAnimationList> TInstanceIdAnimationMap;
+
+struct SParseSlide
+{
+ TStrType m_SlideId;
+ qt3ds::QT3DSI32 m_SlideIndex;
+ TActionList m_ActionList;
+ TInstanceIdAnimationMap m_Animations;
+
+ SParseSlide(TStrType inId, qt3ds::QT3DSI32 inSlideIndex)
+ : m_SlideId(inId)
+ , m_SlideIndex(inSlideIndex)
+ {
+ }
+ SParseSlide() {}
+};
+
+typedef eastl::hash_map<TStrType, SParseSlide> TSlideIdToParseSlideMap;
+
+struct SParseSlideManager
+{
+ IRuntimeMetaData &m_MetaData;
+ SParseElementManager &m_ElementManager;
+ TSlideIdToParseSlideMap m_SlideMap;
+ eastl::vector<SParseSlideAnimationEntry *> m_Animations;
+ qt3ds::QT3DSI32 m_SlideAnimationCount;
+ qt3ds::QT3DSI32 m_AnimationKeyframeCount;
+ qt3ds::QT3DSI32 m_ActionCount;
+ eastl::vector<qt3ds::QT3DSF32> m_KeyframeParseFloatBuffer;
+ eastl::string m_KeyframeParseBuffer;
+
+ SParseSlideManager(IRuntimeMetaData &inMD, SParseElementManager &inElemMgr)
+ : m_MetaData(inMD)
+ , m_ElementManager(inElemMgr)
+ , m_SlideAnimationCount(0)
+ , m_AnimationKeyframeCount(0)
+ , m_ActionCount(0)
+ {
+ }
+ ~SParseSlideManager();
+ TStrType RegisterId(const char8_t *inStr);
+ TStrType RegisterStr(const char8_t *inStr) { return m_ElementManager.RegisterStr(inStr); }
+ SParseSlide &GetOrCreateSlide(const char8_t *inSlideId, qt3ds::QT3DSI32 inSlideIndex);
+ SParseSlide *FindSlide(const char8_t *inSlideId);
+ // Create an animation and reference that animation
+ void SetAnimationData(SParseSlide &inSlide, const char8_t *inInstanceId,
+ const char8_t *inPropertyName, const char8_t *inKeyframeData,
+ SParseSlideAnimationTypes::Enum inType, bool inIsDynamic,
+ bool inIsActive);
+ // Reference an animation.
+ void ReferenceAnimation(SParseSlide &inSlide, const SParseSlideAnimationEntry &inSource,
+ bool inIsActive);
+ TAnimationList *GetAnimationsForInstance(SParseSlide &inSlide, const char8_t *inInstanceId);
+ SParseSlideActionEntry &GetOrCreateAction(SParseSlide &inSlide, const char8_t *inActionId,
+ qt3ds::QT3DSI32 inActionCount, bool inEyeball);
+ SParseSlideActionEntry *FindAction(SParseSlide &inSlide, const char8_t *inActionId);
+};
+
+//==============================================================================
+/**
+ * @class CUIPParserImpl
+ * @brief Class for parsing UIP file
+ */
+class CUIPParserImpl : public IUIPParser
+{
+
+ typedef eastl::basic_string<char8_t> TNarrowStr;
+
+ //==============================================================================
+ // Fields
+ //==============================================================================
+protected:
+ std::shared_ptr<qt3dsdm::IDOMReader> m_DOMReader;
+ std::shared_ptr<qt3dsdm::IDOMWriter> m_DOMWriter;
+ IRuntimeMetaData &m_MetaData; ///< Reference to Metadata
+ IInputStreamFactory &m_InputStreamFactory;
+ SParseElementManager m_ParseElementManager; ///< Map of id, SElement*
+ SParseSlideManager m_ParseSlideManager;
+
+ CUIPParserActionHelper *m_ActionHelper; ///< Action Helper
+ CUIPParserObjectRefHelper *m_ObjectRefHelper; ///< Object Reference Helper
+
+ typedef eastl::set<SElement *> TAddedSlideElements;
+ TAddedSlideElements m_SlideElements; ///< Caching of slide elements added, so that we don't need
+ ///to pass this around
+
+ typedef eastl::map<eastl::string, eastl::string> TIdSourcePathMap;
+ TIdSourcePathMap m_IdScriptMap; ///< Map of the class id and script sourcepath
+
+ typedef eastl::map<eastl::string, eastl::string> TIdClassMap;
+ TIdClassMap m_IdClassMap; ///< Map of id and class reference
+
+ typedef eastl::set<eastl::string> TStringSet;
+ typedef eastl::vector<eastl::string> TStringVector;
+
+ TStringSet m_SourcePathSet;
+ TStringVector m_SourcePathList;
+ TStringSet m_iblSources;
+ QVector<QString> m_slideSourcePaths;
+
+ struct SElementRefCache
+ {
+ SElementData *m_Element;
+ eastl::string m_Name;
+ eastl::string m_Value;
+ };
+ eastl::vector<SElementRefCache> m_ElementRefCache; ///< Cache those element refs in the scene
+ ///graph that needs to be patch later
+
+ struct SEaseInEaseOutKeyframe
+ {
+ float m_Time;
+ float m_Value;
+ float m_EaseIn;
+ float m_EaseOut;
+ };
+
+ struct SGraphSectionCount
+ {
+ INT32 m_ElementCount;
+ INT32 m_ComponentCount;
+ INT32 m_AttributeCount;
+ INT32 m_StringAttrCount;
+
+ SGraphSectionCount()
+ : m_ElementCount(0)
+ , m_ComponentCount(0)
+ , m_AttributeCount(0)
+ , m_StringAttrCount(0)
+ {
+ }
+ };
+
+ struct SLogicSectionCount
+ {
+ INT32 m_SlideCount;
+ INT32 m_SlideElementCount;
+ INT32 m_SlideAttributeCount;
+ INT32 m_StringAttrCount;
+ INT32 m_PaddingCount;
+
+ SLogicSectionCount()
+ : m_SlideCount(0)
+ , m_SlideElementCount(0)
+ , m_SlideAttributeCount(0)
+ , m_StringAttrCount(0)
+ , m_PaddingCount(0)
+ {
+ }
+ };
+
+ struct SActionSectionCount
+ {
+ INT32 m_TriggerElementCount;
+ INT32 m_TriggerEventCount;
+ INT32 m_ActionCount;
+ INT32 m_StringAttrCount;
+ INT32 m_CustomParamCount;
+
+ SActionSectionCount()
+ : m_TriggerElementCount(0)
+ , m_TriggerEventCount(0)
+ , m_ActionCount(0)
+ , m_StringAttrCount(0)
+ , m_CustomParamCount(0)
+ {
+ }
+ };
+
+ long m_NumGraphElements; /// eclee testing only, must remove
+ long m_NumGraphComponents; /// eclee testing only, must remove
+ long m_NumGraphAttributes; /// eclee testing only, must remove
+ long m_NumSlides; /// eclee testing only, must remove
+ long m_NumSlideElements; /// eclee testing only, must remove
+ long m_NumSlideAttributes; /// eclee testing only, must remove
+ long m_NumAnimationTracks; /// eclee testing only, must remove
+ long m_NumAnimationKeys; /// eclee testing only, must remove
+ long m_NumSlideAnimations; /// eclee testing only, must remove
+ long m_NumSlideActions; /// klarinda testing only, must remove
+
+ // temporarily this is here
+ qt3ds::foundation::MemoryBuffer<RawAllocator> m_TempBuffer;
+ qt3ds::foundation::MemoryBuffer<RawAllocator> m_ValueBuffer;
+
+ IPresentation *m_CurrentPresentation;
+
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CUIPParserImpl(const QString &inFileName, IRuntimeMetaData &inMetaData,
+ IInputStreamFactory &inFactory, qt3ds::foundation::IStringTable &inStringTable);
+ virtual ~CUIPParserImpl();
+
+public: // Parse UIP file
+ BOOL Load(IPresentation &inPresentation,
+ NVConstDataRef<SElementAttributeReference> inStateReferences) override;
+ qt3dsdm::IDOMReader &GetDOMReader() override;
+ IRuntimeMetaData &GetMetaData() override;
+ SElementAndType GetElementForID(const char *inStringId) override;
+ eastl::string ResolveReference(const char *inStringId, const char *inReferance) override;
+ NVConstDataRef<eastl::string> GetSourcePaths() const override
+ {
+ return NVConstDataRef<eastl::string>(m_SourcePathList.data(), m_SourcePathList.size());
+ }
+ QVector<QString> GetSlideSourcePaths() const override
+ {
+ return m_slideSourcePaths;
+ }
+
+ bool isIblImage(const eastl::string &sourcepath) const override
+ {
+ return m_iblSources.find(sourcepath) != m_iblSources.end();
+ }
+
+protected: // Operation
+ BOOL LoadProjectSettings(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader);
+ BOOL LoadClasses(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader);
+ BOOL LoadGraph(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader);
+ BOOL LoadSceneGraph(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader,
+ qt3ds::runtime::element::SElement *inNewStyleParent = NULL);
+ BOOL LoadLogic(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader);
+ BOOL LoadStateGraph(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader);
+
+protected: // Memory Counter
+ void ComputeAndReserveMemory(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader);
+ void DoGraphSectionCount(qt3dsdm::IDOMReader &inReader, SGraphSectionCount &outGraphCounter);
+ void DoLogicSectionCount(qt3dsdm::IDOMReader &inReader, SLogicSectionCount &outLogicCounter);
+ void DoStateSectionCount(qt3dsdm::IDOMReader &inReader, INT32 inSlideIndex,
+ SLogicSectionCount &outLogicCounter);
+ void DoRefSectionCount(qt3dsdm::IDOMReader &inReader, INT32 inNumSlideMultiplier,
+ INT32 inSlideIndex, SLogicSectionCount &outLogicCounter);
+
+protected: // Scene graph heler
+ void CacheGraphRequiredAttributes(qt3dsdm::IDOMReader &inReader);
+ BOOL CacheLogicRequiredAttributes(qt3dsdm::IDOMReader &inReader, qt3ds::QT3DSI32 inSlideIndex = 0,
+ SParseSlide *inParentSlide = NULL);
+ void CacheClassRequiredAttributes(qt3dsdm::IDOMReader &inReader);
+ void CacheClassSceneAttributes(qt3dsdm::IDOMReader &inReader);
+ void CacheClassStateAttributes(qt3dsdm::IDOMReader &inReader);
+ void AddElementRefToPatch(TPropertyDescAndValueList &outDescList, SElementData &inElement,
+ const char *inName, const char *inValue);
+ void PatchSceneElementRef();
+
+protected: // Slide helper
+ BOOL LoadState(IPresentation &inPresentation, SElement *inComponent, INT32 inSlideIndex,
+ qt3dsdm::IDOMReader &inReader);
+ qt3ds::runtime::SSlidePlayInformation GetPlayMode(qt3dsdm::IDOMReader &inReader);
+ INT32 GetPlayThroughTo(INT32 inCurrentSlideIndex, qt3dsdm::IDOMReader &inReader);
+ eastl::string GetSlideName(qt3dsdm::IDOMReader &inReader);
+ eastl::string GetSlideId(qt3dsdm::IDOMReader &inReader);
+ BOOL LoadSlideElements(IPresentation &inPresentation, qt3dsdm::IDOMReader &inReader,
+ bool inMaster, SElement *inComponent, INT32 *outMaxTime = NULL);
+ SElementData *AddSlideElement(IPresentation &inPresentation, bool inMaster,
+ qt3dsdm::IDOMReader &inReader, INT32 *outMaxTime = NULL);
+ BOOL LoadSlideElementAttrs(IPresentation &inPresentation, bool inMaster,
+ SElementData &inElementData, qt3dsdm::IDOMReader &inReader,
+ SElement *inComponent);
+ BOOL ProcessStateRef(IPresentation &inPresentation, SElement *inComponent, bool inMaster,
+ qt3dsdm::IDOMReader &inReader);
+
+protected: // Animation helper
+ void LoadAnimationTrack(IPresentation &inPresentation, SElementData &inElementData,
+ SParseSlideAnimationEntry &inAnimation);
+ void LoadAnimationKeys(IPresentation &inPresentation,
+ const SParseSlideAnimationEntry &inAnimation, bool inIsRotation);
+ BOOL LoadBezierKeys(IPresentation &inPresentation, NVConstDataRef<float> &inValues,
+ bool inIsRotation);
+ BOOL LoadLinearKeys(IPresentation &inPresentation, NVConstDataRef<float> &inValues,
+ bool inIsRotation);
+ BOOL LoadEaseInOutKeys(IPresentation &inPresentation, NVConstDataRef<float> &inValues,
+ bool inIsRotation);
+ SEaseInEaseOutKeyframe ParseEaseInOutKey(const float *&inFloatIter);
+ BOOL ProcessSlideAnimAction(IPresentation &inPresentation, eastl::string &inSlideId,
+ bool inMaster, qt3dsdm::IDOMReader &inReader);
+ BOOL AddSlideAction(IPresentation &inPresentation, eastl::string &inSlideId, bool inActive,
+ qt3dsdm::IDOMReader &inReader);
+ void CreateBezierKeyframeFromEaseInEaseOutKeyframe(float *inPreviousValue,
+ SEaseInEaseOutKeyframe &inCurrent,
+ float *inNextValue, float *&outBezierValues);
+
+protected: // Helper methods
+ bool IsStringType(ERuntimeDataModelDataType inDataType);
+ void GetAttributeList(IPresentation &inPresentation, TPropertyDescAndValueList &outDescList,
+ TStrType inType, TStrType inName, TStrType inClassId, const char *inValue,
+ CRegisteredString *inPropNameStrs);
+ void GetAttributeList(IPresentation &inPresentation, TPropertyDescAndValueList &outDescList,
+ ERuntimeDataModelDataType inDataType,
+ ERuntimeAdditionalMetaDataType inAdditionalType, const char *inName,
+ const char *inValue, CRegisteredString *inPropNameStrs);
+
+ SElementData *GetElementData(TStrType inElementName);
+ SElementData *GetElementData(const char8_t *inElementName);
+ SElement *GetElement(const char8_t *inElementName);
+ // Returns the data type and a boolean indicating if this attribute is actually used on a
+ // particular slide.
+ eastl::pair<ERuntimeDataModelDataType, bool>
+ GetAttributeType(const char8_t *inElementName, const char8_t *inPropertyName,
+ const SElementData &inElementData);
+ SElementData *ParseObjectRef(const eastl::string &inObjectPath, const char8_t *inOwnerId);
+ TStrType ParseObjectRefId(const eastl::string &inObjectPath, const char8_t *inOwnerId);
+
+ void GetMetaAttribute(IPresentation &inPresentation, TPropertyDescAndValueList &outDescList,
+ TStrType inType, TStrType inName, TStrType inClassId,
+ CRegisteredString *inAttStrNames);
+
+protected:
+ void AddFloatAttribute(TPropertyDescAndValueList &outDescList, CRegisteredString inAttStrName,
+ float &inValue);
+ void AddLongAttribute(TPropertyDescAndValueList &outDescList, CRegisteredString inAttStrName,
+ qt3ds::QT3DSI32 &inValue);
+ void AddBoolAttribute(TPropertyDescAndValueList &outDescList, CRegisteredString inAttStrName,
+ bool &inValue);
+ void AddFloat2Attribute(TPropertyDescAndValueList &outDescList,
+ CRegisteredString *inAttStrNames, qt3dsdm::SFloat2 &inValue);
+ void AddFloat3Attribute(TPropertyDescAndValueList &outDescList,
+ ERuntimeAdditionalMetaDataType inAdditionalType,
+ CRegisteredString *inAttStrNames, qt3dsdm::SFloat3 &inValue);
+ void AddFloat4Attribute(TPropertyDescAndValueList &outDescList,
+ ERuntimeAdditionalMetaDataType inAdditionalType,
+ CRegisteredString *inAttStrNames, qt3dsdm::SFloat4 &inValue);
+ void AddStringAttribute(IPresentation &inPresentation, TPropertyDescAndValueList &outDescList,
+ CRegisteredString inAttStrName, const char *inValue);
+ void AddElementRefAttribute(TPropertyDescAndValueList &outDescList,
+ CRegisteredString inAttStrName, SElement *inElement);
+
+ void AddSourcePath(const char *inValue, bool ibl)
+ {
+ if (m_SourcePathSet.find(inValue) == m_SourcePathSet.end()) {
+ m_SourcePathSet.insert(inValue);
+ m_SourcePathList.push_back(eastl::string(inValue));
+ }
+ if (ibl && m_iblSources.find(inValue) == m_iblSources.end())
+ m_iblSources.insert(inValue);
+ }
+
+public: //
+ void release() override { delete this; }
+
+ //==============================================================================
+ // Friends
+ //==============================================================================
+ friend class CUIPParserActionHelper;
+};
+
+} // namespace Q3DStudio
diff --git a/src/uipparser/Qt3DSUIPParserObjectRefHelper.cpp b/src/uipparser/Qt3DSUIPParserObjectRefHelper.cpp
new file mode 100644
index 0000000..4861a5d
--- /dev/null
+++ b/src/uipparser/Qt3DSUIPParserObjectRefHelper.cpp
@@ -0,0 +1,1011 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "RuntimePrefix.h"
+#ifdef EA_PLATFORM_WINDOWS
+#pragma warning(disable : 4100) // std::variant
+#pragma warning(disable : 4396) // specializer warning nonsense
+#endif
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSUIPParserObjectRefHelper.h"
+
+#include "Qt3DSDMPrefix.h"
+#include "Qt3DSDMXML.h"
+#include "Qt3DSMetadata.h"
+using namespace qt3dsdm;
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+// Constants
+//==============================================================================
+static const char PATH_DELIMITER = '.'; // can only be single char!
+static const char PATH_LINE_END = '\n';
+
+//==============================================================================
+/**
+ * Constructor
+ */
+CUIPParserObjectRefHelper::CUIPParserObjectRefHelper(IRuntimeMetaData &inMetaData)
+ : m_MetaData(inMetaData)
+ , m_MaterialStr(m_MetaData.Register("Material"))
+{
+ BuildImageNamePropertyList();
+
+ if (m_LayerImageIdToNameMap.empty()) {
+ {
+ TLightProbeAndNamePair theNamePair =
+ eastl::make_pair<eastl::string, eastl::string>("Layer_lightprobe", "lightprobe");
+ m_LayerImageIdToNameMap.insert(theNamePair);
+ }
+ {
+ TLightProbeAndNamePair theNamePair =
+ eastl::make_pair<eastl::string, eastl::string>("Layer_lightprobe2", "lightprobe2");
+ m_LayerImageIdToNameMap.insert(theNamePair);
+ }
+ }
+}
+
+//==============================================================================
+/**
+ * Destructor
+ */
+CUIPParserObjectRefHelper::~CUIPParserObjectRefHelper()
+{
+ // Delete SGraphNode
+ for (TGraphNodeMap::iterator theIter = m_GraphNodeMap.begin(); theIter != m_GraphNodeMap.end();
+ ++theIter)
+ delete theIter->second;
+ m_GraphNodeMap.clear();
+ m_RootNode = NULL;
+}
+
+namespace {
+ void StoreTopLevelAliasAttributes(
+ IDOMReader &inReader,
+ eastl::vector<eastl::pair<eastl::string, eastl::string>> &copiedAttributes)
+ {
+ for (eastl::pair<const char8_t *, const char8_t *> att = inReader.GetNarrowFirstAttribute();
+ !isTrivial(att.first); att = inReader.GetNarrowNextAttribute()) {
+ if (!AreEqual(att.first, "scale") && !AreEqual(att.first, "position")
+ && !AreEqual(att.first, "rotation") && !AreEqual(att.first, "pivot")
+ && !AreEqual(att.first, "endtime") && !AreEqual(att.first, "eyeball")
+ && !AreEqual(att.first, "ref") && !AreEqual(att.first, "id")
+ && !AreEqual(att.first, "name") && !AreEqual(att.first, "orientation")
+ && !AreEqual(att.first, "rotationorder")) // note that sourcepath does come through.
+ {
+ copiedAttributes.push_back(eastl::make_pair(att.first, att.second));
+ }
+ }
+ }
+}
+
+void CUIPParserObjectRefHelper::CacheGraph(qt3dsdm::IDOMReader &inReader, qt3dsdm::IDOMWriter &inWriter)
+{
+ {
+ // First, we parse Graph section to build the scene graph
+ IDOMReader::Scope __graphScope(inReader);
+ inReader.MoveToFirstChild("Graph");
+ CacheSceneGraph(inReader);
+ }
+ void *logicScopeItem = NULL;
+ {
+ // Next, we parse Logic section to update the node name and image information
+ IDOMReader::Scope __logicScope(inReader);
+ inReader.MoveToFirstChild("Logic");
+ logicScopeItem = inReader.GetScope();
+ CacheStateGraph(inReader);
+ }
+ if (m_SceneGraphAliasList.empty() == false) {
+ IDOMReader::Scope __aliasScope(inReader);
+ // Now we expand aliases
+ eastl::hash_map<TStrType, TStrType> oldToNewIdMap;
+ std::shared_ptr<qt3dsdm::IDOMFactory> theFactory = inWriter.GetFactory();
+ std::shared_ptr<qt3dsdm::IStringTable> theStrTable = inReader.GetStringTable();
+ qt3dsdm::SDOMElement *theSlidesRoot = theFactory->NextElement("AliasSlides");
+ eastl::pair<std::shared_ptr<qt3dsdm::IDOMWriter>, std::shared_ptr<qt3dsdm::IDOMReader>>
+ slideWriterReaderPair =
+ qt3dsdm::IDOMWriter::CreateDOMWriter(theFactory, *theSlidesRoot, theStrTable);
+ std::shared_ptr<qt3dsdm::IDOMWriter> slideWriter = slideWriterReaderPair.first;
+
+ {
+ IDOMReader::Scope __loopScope(inReader);
+ for (QT3DSU32 idx = 0, end = m_SceneGraphAliasList.size(); idx < end; ++idx) {
+ inReader.SetScope(m_SceneGraphAliasList[idx]);
+ const char8_t *reference;
+ SGraphNode *referencedNode = NULL;
+ const char8_t *theIdStr;
+ inReader.Att("id", theIdStr);
+ SGraphNode *aliasNode = NULL;
+ TGraphNodeMap::iterator iter = m_GraphNodeMap.find(m_MetaData.Register(theIdStr));
+ if (iter != m_GraphNodeMap.end())
+ aliasNode = iter->second;
+
+ if (inReader.UnregisteredAtt("referencednode", reference)) {
+ TStrType theSourceElemId = ParseObjectRefId(reference, theIdStr);
+ iter = m_GraphNodeMap.find(theSourceElemId);
+ if (iter != m_GraphNodeMap.end())
+ referencedNode = iter->second;
+ }
+ if (referencedNode == NULL || aliasNode == NULL) {
+ QT3DS_ASSERT(false);
+ continue;
+ }
+ inReader.SetScope(referencedNode->m_ReaderContext);
+ oldToNewIdMap.clear();
+ std::shared_ptr<qt3dsdm::IDOMFactory> theFactory = inWriter.GetFactory();
+ std::shared_ptr<qt3dsdm::IStringTable> theStrTable = inReader.GetStringTable();
+ qt3dsdm::SDOMElement *theRoot = theFactory->NextElement(inReader.GetElementName());
+ std::shared_ptr<qt3dsdm::IDOMWriter> copyWriter =
+ qt3dsdm::IDOMWriter::CreateDOMWriter(theFactory, *theRoot, theStrTable).first;
+
+ // Step one is just to copy the scene graph generating ids.
+ SGraphNode *theParent = aliasNode->m_Parent;
+ aliasNode->m_Class = referencedNode->m_Class;
+ aliasNode->m_Type = referencedNode->m_Type;
+ // Copy the alias id
+ copyWriter->Att("id", theIdStr);
+ eastl::vector<eastl::pair<eastl::string, eastl::string>> copiedAttributes;
+ StoreTopLevelAliasAttributes(inReader, copiedAttributes);
+ for (QT3DSU32 idx = 0, end = copiedAttributes.size(); idx < end; ++idx) {
+ copyWriter->Att(copiedAttributes[idx].first.c_str(),
+ copiedAttributes[idx].second.c_str());
+ }
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "Alias"))
+ continue;
+ qt3dsdm::IDOMReader::Scope __loopScoper(inReader);
+ qt3dsdm::IDOMWriter::Scope writerScope(*copyWriter,
+ inReader.GetNarrowElementName());
+ CopySceneGraph(inReader, *copyWriter, *slideWriter, oldToNewIdMap,
+ aliasNode->m_Name.c_str(), theIdStr, *aliasNode);
+ }
+ if (referencedNode->m_MasterSlide) {
+ inReader.SetScope(referencedNode->m_MasterSlide);
+ CopyStates(inReader, *slideWriter, oldToNewIdMap, aliasNode->m_Name.c_str(),
+ theIdStr);
+ }
+ // Set the scope to point at the alias node.
+ inReader.SetScope(aliasNode->m_ReaderContext);
+ inWriter.ReplaceCurrent(*theRoot);
+ // Now find the owning component.
+ SGraphNode *theComponent = theParent;
+ while (theComponent && theComponent->m_MasterSlide == NULL)
+ theComponent = theComponent->m_Parent;
+
+ if (theComponent && theComponent->m_MasterSlide) {
+ inReader.SetScope(theComponent->m_MasterSlide);
+ // Copy any state commands that have entries in the old to new map.
+ CopyStateCommands(inReader, inWriter, oldToNewIdMap, aliasNode->m_Name.c_str(),
+ referencedNode->m_Id, theIdStr);
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ } // End of loop scope.
+
+ {
+ // Next, we parse Logic section to update the node name and image information
+ {
+ IDOMReader::Scope __logicScope(inReader);
+ inReader.SetScope(theSlidesRoot);
+ // Cache the new items and their names and such.
+ CacheStateGraph(inReader);
+ }
+
+ inReader.MoveToFirstChild("Logic");
+ inWriter.AppendChildren(*theSlidesRoot);
+ }
+
+ /*
+#if defined _DEBUG && defined _WIN32
+ {
+ qt3dsdm::SDOMElement* theElem = inWriter.GetTopElement();
+ {
+ qt3ds::foundation::CFileSeekableIOStream theWriter( "c:\\temp.xml",
+FileWriteFlags() );
+ qt3dsdm::CDOMSerializer::Write( *theElem, theWriter );
+ }
+ }
+#endif
+ */
+ }
+
+}
+
+void CUIPParserObjectRefHelper::CacheSceneGraph(IDOMReader &inReader, SGraphNode *inParent)
+{
+ IDOMReader::Scope __childScope(inReader);
+
+ // build out the graph.
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "Alias")) {
+ CacheSceneGraphNode(inReader, inParent);
+ m_SceneGraphAliasList.push_back(inReader.GetScope());
+ } else {
+ SGraphNode &theNode(CacheSceneGraphNode(inReader, inParent));
+ CacheSceneGraph(inReader, &theNode);
+ }
+ }
+}
+
+CUIPParserObjectRefHelper::SGraphNode &
+CUIPParserObjectRefHelper::CacheSceneGraphNode(qt3dsdm::IDOMReader &inReader, SGraphNode *inParent)
+{
+ SGraphNode *theNode = new SGraphNode();
+ const char8_t *theIdStr;
+ inReader.Att("id", theIdStr);
+ theNode->m_Id = m_MetaData.Register(theIdStr);
+ theNode->m_Type = m_MetaData.Register(inReader.GetNarrowElementName());
+ const char8_t *theClassStr;
+ inReader.Att("class", theClassStr);
+ theNode->m_Class = m_MetaData.Register(theClassStr);
+ const char *theNameStr;
+ theNode->m_ReaderContext = inReader.GetScope();
+
+ if (inParent && inParent->m_Type == m_MetaData.Register("Layer")
+ && theNode->m_Type == m_MetaData.Register("Image")) {
+ TLightProbeIdToNameMap::iterator theFind = m_LayerImageIdToNameMap.find(theIdStr);
+ if (theFind != m_LayerImageIdToNameMap.end())
+ theNode->m_Name = m_MetaData.Register(theFind->second.c_str());
+ } else if (!inReader.Att("name", theNameStr)) {
+ Option<eastl::string> theNameStrOpt = m_MetaData.GetPropertyValueString(
+ theNode->m_Type, m_MetaData.Register("name"), theNode->m_Class);
+ if (theNameStrOpt.hasValue())
+ theNode->m_Name = m_MetaData.Register(theNameStrOpt->c_str());
+ } else
+ theNode->m_Name = m_MetaData.Register(theNameStr);
+
+ if (inParent) {
+ theNode->m_Parent = inParent;
+ inParent->m_Children.push_back(theNode);
+ } else {
+ m_RootNode = theNode;
+ }
+
+ m_GraphNodeMap[theNode->m_Id] = theNode;
+ return *theNode;
+}
+
+void CUIPParserObjectRefHelper::CacheStateGraph(IDOMReader &inReader)
+{
+ IDOMReader::Scope __childScope(inReader);
+ const char8_t *component;
+ if (inReader.UnregisteredAtt("component", component)) {
+ TGraphNodeMap::iterator iter = m_GraphNodeMap.find(m_MetaData.Register(component + 1));
+ if (iter != m_GraphNodeMap.end()) {
+ iter->second->m_MasterSlide = inReader.GetScope();
+ }
+ }
+
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "State"))
+ CacheStateGraph(inReader);
+ else if (AreEqual(inReader.GetNarrowElementName(), "Add")
+ || AreEqual(inReader.GetNarrowElementName(), "Set")) {
+ const char *theRef;
+ const char *theName;
+ if (inReader.Att("ref", theRef)) {
+ theRef++; // remove the '#'
+ SGraphNode *theNode = GetNode(theRef);
+ if (theNode) {
+ // Overwrite the name. This assumes that "name" property is always linked.
+ if (inReader.Att("name", theName)) {
+ // Do not touch the name of an image instance that was renamed in the code
+ // below. i.e. an image that is referred to from a material.
+ if (!(theNode->m_Type == m_MetaData.Register("Image")
+ && m_ImageNamePropertyList.find(theNode->m_Name)
+ != m_ImageNamePropertyList.end())) {
+ theNode->m_Name = m_MetaData.Register(theName);
+ }
+ }
+
+ // Special case for material. Image properties refer to instances.
+ // For example: Scene.Layer.Rectangle.Material.diffusemap.rotationuv ->
+ // diffusemap refers to Image instance
+ // So if we find image instance, overwrite the name of the image with the
+ // property name.
+ // This assumes that user can't rename image property
+ if (theNode->m_Type == m_MaterialStr && !theNode->m_Children.empty()) {
+ for (TImageNamePropertyList::iterator theProp =
+ m_ImageNamePropertyList.begin();
+ theProp != m_ImageNamePropertyList.end(); ++theProp) {
+ const char *theImageInstance;
+ if (inReader.Att(theProp->c_str(), theImageInstance)) {
+ ++theImageInstance; // remove the '#'
+ SGraphNode *theImageNode = GetNode(theImageInstance);
+ QT3DS_ASSERT(theImageNode && theImageNode->m_Parent == theNode);
+ if (theImageNode)
+ theImageNode->m_Name = *theProp;
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+}
+
+void CUIPParserObjectRefHelper::CopySceneGraph(qt3dsdm::IDOMReader &inReader,
+ qt3dsdm::IDOMWriter &inWriter,
+ qt3dsdm::IDOMWriter &inSlideWriter,
+ TStrToStrMap &inMap, const char *inAliasName,
+ const char *inAliasId, SGraphNode &inParent)
+{
+ qt3dsdm::IDOMReader::Scope __graphScope(inReader);
+ // Assume the element itself is already copied.
+ // Run through attributes and duplicate them, but for any id attributes generate a new id.
+ const char8_t *tempItem;
+ if (!inReader.Att("id", tempItem)) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SGraphNode *theParent = &inParent;
+ eastl::string idGenerator(inAliasName);
+ idGenerator.append("-");
+ idGenerator.append(tempItem);
+ while (m_GraphNodeMap.find(m_MetaData.Register(idGenerator.c_str())) != m_GraphNodeMap.end())
+ idGenerator.append("_");
+ inWriter.Att("id", idGenerator.c_str());
+ TStrType srcId = m_MetaData.Register(tempItem);
+ TStrType newId = m_MetaData.Register(idGenerator.c_str());
+ inMap[srcId] = newId;
+ SGraphNode *srcNode = m_GraphNodeMap.find(srcId)->second;
+ SGraphNode *newNode = new SGraphNode();
+ newNode->m_Class = srcNode->m_Class;
+ newNode->m_Id = newId;
+ newNode->m_Name = srcNode->m_Name;
+ newNode->m_Type = srcNode->m_Type;
+ newNode->m_Parent = &inParent;
+ theParent = newNode;
+ m_GraphNodeMap[newId] = newNode;
+ inParent.m_Children.push_back(newNode);
+
+ {
+ qt3dsdm::IDOMReader::Scope __childrenScope(inReader);
+
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "Alias"))
+ continue;
+ qt3dsdm::IDOMWriter::Scope __newNode(inWriter, inReader.GetNarrowElementName());
+ CopySceneGraph(inReader, inWriter, inSlideWriter, inMap, inAliasName, inAliasId,
+ *theParent);
+ }
+ }
+ TGraphNodeMap::iterator iter = m_GraphNodeMap.find(m_MetaData.Register(tempItem));
+ if (iter == m_GraphNodeMap.end()) {
+ QT3DS_ASSERT(false);
+ return;
+ }
+ SGraphNode *targetNode = iter->second;
+
+ for (eastl::pair<const char8_t *, const char8_t *> att = inReader.GetNarrowFirstAttribute();
+ !isTrivial(att.first); att = inReader.GetNarrowNextAttribute()) {
+ if (AreEqual(att.first, "id"))
+ continue;
+ Q3DStudio::ERuntimeDataModelDataType theDataType = m_MetaData.GetPropertyType(
+ targetNode->m_Type, m_MetaData.Register(att.first), targetNode->m_Class);
+ // Ensure we use new ids for this datatype. This ensures that we go
+ if (theDataType == ERuntimeDataModelDataTypeLong4) {
+ TStrToStrMap::iterator aliasIdName = inMap.find(m_MetaData.Register(att.second));
+ if (aliasIdName != inMap.end())
+ inWriter.Att(att.first, aliasIdName->second.c_str());
+ else {
+ QT3DS_ASSERT(false);
+ }
+ } else
+ inWriter.Att(att.first, att.second);
+ }
+ if (targetNode->m_MasterSlide) {
+ inReader.SetScope(targetNode->m_MasterSlide);
+ CopyStates(inReader, inSlideWriter, inMap, inAliasName, inAliasId);
+ }
+}
+
+void CUIPParserObjectRefHelper::CopyStates(qt3dsdm::IDOMReader &inReader,
+ qt3dsdm::IDOMWriter &inSlideWriter, TStrToStrMap &inMap,
+ const char *inAliasName, const char *inAliasId)
+{
+ qt3dsdm::IDOMReader::Scope __stateScope(inReader);
+ qt3dsdm::IDOMWriter::Scope stateScope(inSlideWriter, "State");
+ CopyAttributes(inReader, inSlideWriter, inMap, inAliasName, inAliasId);
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ if (AreEqual(inReader.GetNarrowElementName(), "State"))
+ CopyStates(inReader, inSlideWriter, inMap, inAliasName, inAliasId);
+ else {
+ CopyHierarchy(inReader, inSlideWriter, inMap, inAliasName, inAliasId);
+ }
+ }
+}
+
+eastl::pair<const char8_t *, const char8_t *> CUIPParserObjectRefHelper::ProcessAliasAttribute(
+ const char8_t *inObjId, eastl::pair<const char8_t *, const char8_t *> inAttribute,
+ eastl::string &ioStrBuilder, TStrToStrMap &inMap)
+{
+ inObjId = nonNull(inObjId);
+ if (inObjId[0] == '#')
+ ++inObjId;
+ SGraphNode *theNode = GetNode(nonNull(inObjId));
+ if (theNode == NULL)
+ return inAttribute;
+ const char8_t *propName = inAttribute.first;
+ const char8_t *propValue = inAttribute.second;
+ ERuntimeAdditionalMetaDataType thePropertyType = m_MetaData.GetAdditionalType(
+ theNode->m_Type, m_MetaData.Register(propName), theNode->m_Class);
+ if (thePropertyType == ERuntimeAdditionalMetaDataTypeImage
+ || thePropertyType == ERuntimeAdditionalMetaDataTypeObjectRef) {
+ propValue = nonNull(propValue);
+ if (propValue[0] == '#')
+ ++propValue;
+ TStrToStrMap::iterator iter = inMap.find(m_MetaData.Register(propValue));
+ if (iter != inMap.end()) {
+ ioStrBuilder.assign("#");
+ ioStrBuilder.append(iter->second);
+ propValue = ioStrBuilder.c_str();
+ } else
+ propValue = inAttribute.second;
+ }
+ return eastl::make_pair(propName, propValue);
+}
+
+void CUIPParserObjectRefHelper::CopyAttributes(qt3dsdm::IDOMReader &inReader,
+ qt3dsdm::IDOMWriter &inSlideWriter,
+ TStrToStrMap &inMap, const char *inAliasName,
+ const char *inAliasId)
+{
+ eastl::string builder;
+ const char8_t *elemId = "";
+ for (eastl::pair<const char8_t *, const char8_t *> att = inReader.GetNarrowFirstAttribute();
+ !isTrivial(att.first); att = inReader.GetNarrowNextAttribute()) {
+ if (AreEqual(att.first, "component")) {
+ TStrToStrMap::iterator iter = inMap.find(m_MetaData.Register(att.second + 1));
+ builder.assign("#");
+ if (iter != inMap.end()) {
+ builder.append(iter->second);
+ } else {
+ builder.append(inAliasId);
+ }
+ inSlideWriter.Att(att.first, builder.c_str());
+ } else if (AreEqual(att.first, "id")) {
+ builder.assign(inAliasName);
+ builder.append("-");
+ builder.append(att.second);
+ // cannot be
+ while (m_SlideIdSet.find(m_MetaData.Register(builder.c_str())) != m_SlideIdSet.end())
+ builder.append("_");
+ inSlideWriter.Att(att.first, builder.c_str());
+ m_SlideIdSet.insert(m_MetaData.Register(builder.c_str()));
+ inMap[m_MetaData.Register(att.second)] = m_MetaData.Register(builder.c_str());
+ } else if (AreEqual(att.first, "ref")) {
+ const char8_t *refItem = att.second;
+ if (!isTrivial(refItem)) {
+ ++refItem;
+ elemId = refItem;
+ TStrToStrMap::iterator iter = inMap.find(m_MetaData.Register(refItem));
+ if (iter != inMap.end()) {
+ builder.assign("#");
+ builder.append(iter->second.c_str());
+ inSlideWriter.Att("ref", builder.c_str());
+ } else {
+ QT3DS_ASSERT(false);
+ }
+ }
+ } else {
+ att = ProcessAliasAttribute(elemId, att, builder, inMap);
+ inSlideWriter.Att(att.first, att.second);
+ }
+ }
+}
+
+void CUIPParserObjectRefHelper::CopyHierarchy(qt3dsdm::IDOMReader &inReader,
+ qt3dsdm::IDOMWriter &inSlideWriter, TStrToStrMap &inMap,
+ const char *inAliasName, const char *inAliasId)
+{
+ qt3dsdm::IDOMReader::Scope __commandScope(inReader);
+ qt3dsdm::IDOMWriter::Scope __writerScope(inSlideWriter, inReader.GetNarrowElementName());
+ CopyAttributes(inReader, inSlideWriter, inMap, inAliasName, inAliasId);
+ const char8_t *childData;
+ if (inReader.Value(childData)) {
+ inSlideWriter.Value(childData);
+ }
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling())
+ CopyHierarchy(inReader, inSlideWriter, inMap, inAliasName, inAliasId);
+}
+
+void CUIPParserObjectRefHelper::CopyStateCommands(qt3dsdm::IDOMReader &inReader,
+ qt3dsdm::IDOMWriter &inWriter,
+ TStrToStrMap &oldToNewIdMap,
+ const char *inAliasName, const char *inOldId,
+ const char *inNewId)
+{
+ qt3dsdm::IDOMReader::Scope __commandScope(inReader);
+ qt3dsdm::SDOMElement *theSlidesRoot = NULL;
+ eastl::pair<std::shared_ptr<qt3dsdm::IDOMWriter>, std::shared_ptr<qt3dsdm::IDOMReader>>
+ slideWriterReaderPair;
+ std::shared_ptr<qt3dsdm::IDOMWriter> commandWriter;
+ {
+ qt3dsdm::IDOMReader::Scope __loopScope(inReader);
+ eastl::vector<eastl::pair<eastl::string, eastl::string>> copiedAttributes;
+ void *destCommand = NULL;
+ eastl::string strBuilder;
+ for (bool success = inReader.MoveToFirstChild(); success;
+ success = inReader.MoveToNextSibling()) {
+ qt3dsdm::IDOMReader::Scope childScope(inReader);
+ if (AreEqual(inReader.GetNarrowElementName(), "State"))
+ CopyStateCommands(inReader, inWriter, oldToNewIdMap, inAliasName, inOldId, inNewId);
+ else {
+ const char8_t *refItem = "";
+ if (inReader.Att("ref", refItem) && !isTrivial(refItem)) {
+ ++refItem;
+ TStrToStrMap::iterator iter = oldToNewIdMap.find(m_MetaData.Register(refItem));
+ if (iter != oldToNewIdMap.end()) {
+ if (theSlidesRoot == NULL) {
+ std::shared_ptr<qt3dsdm::IDOMFactory> theFactory =
+ inWriter.GetFactory();
+ std::shared_ptr<qt3dsdm::IStringTable> theStrTable =
+ inReader.GetStringTable();
+ theSlidesRoot = theFactory->NextElement("AliasSlides");
+ slideWriterReaderPair = qt3dsdm::IDOMWriter::CreateDOMWriter(
+ theFactory, *theSlidesRoot, theStrTable);
+ commandWriter = slideWriterReaderPair.first;
+ }
+ qt3dsdm::IDOMWriter::Scope elemScope(*commandWriter,
+ inReader.GetNarrowElementName());
+ for (eastl::pair<const char8_t *, const char8_t *> att =
+ inReader.GetNarrowFirstAttribute();
+ !isTrivial(att.first); att = inReader.GetNarrowNextAttribute()) {
+ if (AreEqual(att.first, "ref")) {
+ strBuilder.assign("#");
+ strBuilder.append(iter->second);
+ commandWriter->Att("ref", strBuilder.c_str());
+ } else {
+
+ att =
+ ProcessAliasAttribute(refItem, att, strBuilder, oldToNewIdMap);
+ commandWriter->Att(att.first, att.second);
+ }
+ }
+ for (bool commandChild = inReader.MoveToFirstChild(); commandChild;
+ commandChild = inReader.MoveToNextSibling()) {
+ qt3dsdm::IDOMReader::Scope commandChildScope(inReader);
+ CopyHierarchy(inReader, *commandWriter, oldToNewIdMap, inAliasName, "");
+ }
+ } else if (AreEqual(refItem, inOldId)) {
+ StoreTopLevelAliasAttributes(inReader, copiedAttributes);
+ } else if (AreEqual(refItem, inNewId))
+ destCommand = inReader.GetScope();
+ }
+ }
+ }
+ if (copiedAttributes.size() && destCommand) {
+ inReader.SetScope(destCommand);
+ for (QT3DSU32 idx = 0, end = copiedAttributes.size(); idx < end; ++idx) {
+ eastl::pair<eastl::string, eastl::string> &theItem(copiedAttributes[idx]);
+ inWriter.Att(theItem.first.c_str(), theItem.second.c_str());
+ }
+ }
+ }
+ if (commandWriter)
+ inWriter.AppendChildren(*commandWriter->GetTopElement());
+}
+
+CUIPParserObjectRefHelper::SGraphNode *CUIPParserObjectRefHelper::GetNode(const char *inId)
+{
+ if (IsTrivial(inId))
+ return NULL;
+ if (inId[0] == '#')
+ ++inId;
+ TGraphNodeMap::iterator theIter = m_GraphNodeMap.find(m_MetaData.Register(inId));
+ if (theIter != m_GraphNodeMap.end())
+ return theIter->second;
+ return NULL;
+}
+
+CUIPParserObjectRefHelper::SGraphNode *CUIPParserObjectRefHelper::GetNode(eastl::string inId)
+{
+ return GetNode(inId.c_str());
+}
+
+CUIPParserObjectRefHelper::TStrType CUIPParserObjectRefHelper::GetName(const eastl::string &inId)
+{
+ SGraphNode *theNode = GetNode(inId.c_str());
+ if (theNode)
+ return theNode->m_Name;
+ QT3DS_ASSERT(false);
+ return m_MetaData.Register(inId.c_str());
+}
+
+CUIPParserObjectRefHelper::TStrType CUIPParserObjectRefHelper::GetType(const eastl::string &inId)
+{
+ SGraphNode *theNode = GetNode(inId.c_str());
+ if (theNode)
+ return theNode->m_Type;
+ QT3DS_ASSERT(false);
+ return m_MetaData.Register(inId.c_str());
+}
+
+CUIPParserObjectRefHelper::TStrType CUIPParserObjectRefHelper::GetClass(const eastl::string &inId)
+{
+ SGraphNode *theNode = GetNode(inId.c_str());
+ if (theNode)
+ return theNode->m_Class;
+ QT3DS_ASSERT(false);
+ return m_MetaData.Register(inId.c_str());
+}
+
+CUIPParserObjectRefHelper::TStrType
+CUIPParserObjectRefHelper::ParseObjectRefId(const eastl::string &inObjectPath,
+ const char8_t *inOwnerId)
+{
+ if (inObjectPath.empty()) {
+ QT3DS_ASSERT(false);
+ return TStrType();
+ } else if (inObjectPath[0] == '#') {
+ // Absolute path
+ return m_MetaData.Register(inObjectPath.substr(1).c_str());
+ } else {
+ // Relative path
+ SGraphNode *theNode = GetNode(inOwnerId);
+
+ // Split the string based on PATH_DELIMITER
+ eastl::string theStr = inObjectPath;
+ eastl::string theCurrentPart;
+ eastl::string::size_type thePos;
+ while (theNode) {
+ thePos = theStr.find(PATH_DELIMITER);
+ theCurrentPart = theStr.substr(0, thePos);
+
+ if (theCurrentPart == "parent") {
+ theNode = theNode->m_Parent;
+ } else if (theCurrentPart == "this") {
+ // Do nothing because theNode points to itself
+ } else if (theCurrentPart == "Scene") {
+ theNode = m_RootNode;
+ } else {
+ SGraphNode *theFoundChild = NULL;
+ for (QT3DSU32 childIdx = 0;
+ childIdx < theNode->m_Children.size() && theFoundChild == NULL; ++childIdx) {
+ if (AreEqual(theNode->m_Children[childIdx]->m_Name, theCurrentPart.c_str()))
+ theFoundChild = theNode->m_Children[childIdx];
+ }
+ theNode = theFoundChild;
+ }
+
+ if (thePos == eastl::string::npos)
+ break;
+
+ // Move on to the next token
+ theStr = theStr.substr(thePos + 1);
+ }
+
+ if (theNode)
+ return theNode->m_Id;
+
+ return TStrType();
+ }
+}
+
+eastl::string CUIPParserObjectRefHelper::BuildReferenceString(eastl::string inObjectPath)
+{
+ if (inObjectPath.empty()) {
+ // QT3DS_ASSERT( false );
+ return "";
+ } else if (inObjectPath[0] == '#') {
+ // Absolute path
+ return BuildAbsoluteReferenceString(inObjectPath.substr(1));
+ } else {
+ // Relative path
+ return inObjectPath;
+ }
+}
+
+eastl::string CUIPParserObjectRefHelper::BuildAbsoluteReferenceString(eastl::string inId)
+{
+ return BuildAbsoluteReferenceString(GetNode(inId));
+}
+
+eastl::string CUIPParserObjectRefHelper::BuildAbsoluteReferenceString(SGraphNode *inNode)
+{
+ if (inNode == NULL)
+ return "";
+
+ eastl::string theNameStart;
+ eastl::string theNameEnd(inNode->m_Name);
+
+ SGraphNode *theParent = inNode->m_Parent;
+ if (theParent) {
+ theNameStart.assign(BuildAbsoluteReferenceString(theParent));
+ theNameStart.append(".");
+ }
+ theNameStart += theNameEnd;
+ return theNameStart;
+}
+
+void CUIPParserObjectRefHelper::MarkAllReferencedAttributes(
+ eastl::string inId, const eastl::vector<eastl::string> &inReferences,
+ qt3dsdm::IDOMReader &inReader, SParseElementManager &outIdAttributesMap)
+{
+ IDOMReader::Scope __scope(inReader);
+ eastl::string theReferencesTokenizer;
+ eastl::string theCurrentReference;
+ eastl::string theReferenceTokenizer;
+ eastl::string theCurrentString;
+ eastl::string::size_type startPos = 0;
+ eastl::string::size_type endPos = 0;
+ eastl::string::size_type theReferencesTokenizerPos = 0;
+ eastl::string::size_type theReferenceTokenizerPos = 0;
+ SGraphNode *theBaseInstance = GetNode(inId);
+ SGraphNode *theCurrentInstance = theBaseInstance;
+ eastl::vector<SGraphNode *> theInstanceList;
+
+ for (QT3DSU32 theRefIdx = 0, theRefEnd = inReferences.size(); theRefIdx < theRefEnd; ++theRefIdx) {
+ // Split the string based on PATH_LINE_END
+ theReferencesTokenizer = inReferences[theRefIdx];
+ theReferencesTokenizerPos = 0;
+ while (theReferencesTokenizerPos != eastl::string::npos
+ && !theReferencesTokenizer.empty()) {
+ theCurrentInstance = theBaseInstance;
+ theReferencesTokenizerPos = theReferencesTokenizer.find(PATH_LINE_END);
+ theCurrentReference = theReferencesTokenizer.substr(0, theReferencesTokenizerPos);
+
+ // Move to the next token
+ theReferencesTokenizer = theReferencesTokenizer.substr(theReferencesTokenizerPos + 1);
+
+ // trim whitespace from the beginning and the end of the string
+ startPos = theCurrentReference.find_first_not_of("\n\r\t ");
+ endPos = theCurrentReference.find_last_not_of("\n\r\t ");
+ if (startPos != eastl::string::npos)
+ theCurrentReference = theCurrentReference.substr(startPos, endPos - startPos + 1);
+
+ // Split the string based on PATH_DELIMITER
+ theReferenceTokenizer = theCurrentReference;
+ theReferenceTokenizerPos = 0;
+ theInstanceList.clear();
+ while (theReferenceTokenizerPos != eastl::string::npos
+ && !theReferenceTokenizer.empty()) {
+ theReferenceTokenizerPos = theReferenceTokenizer.find(PATH_DELIMITER);
+ theCurrentString = theReferenceTokenizer.substr(0, theReferenceTokenizerPos);
+
+ // Move to the next token
+ theReferenceTokenizer = theReferenceTokenizer.substr(theReferenceTokenizerPos + 1);
+
+ if (theReferenceTokenizerPos != eastl::string::npos) {
+ theCurrentInstance = GetReferenceNode(theCurrentInstance, theCurrentString,
+ theInstanceList, inReader);
+ } else {
+ if (theInstanceList.size() == 0 && theCurrentInstance)
+ theInstanceList.push_back(theCurrentInstance);
+ if (!MarkAttributeAsReferenced(theBaseInstance, theInstanceList,
+ theCurrentString, inReader,
+ outIdAttributesMap)) {
+ qCCritical(qt3ds::INVALID_OPERATION)
+ << "Unable to parse reference: "
+ << theBaseInstance->m_Id.c_str() << " : "
+ << theCurrentReference.c_str();
+ }
+ }
+ }
+ }
+ }
+}
+
+//==============================================================================
+/**
+ * Helper method to find the VAsset via the name which is the child of inAsset.
+ */
+CUIPParserObjectRefHelper::SGraphNode *
+CUIPParserObjectRefHelper::GetReferenceNode(SGraphNode *inInstance, eastl::string &inAssetName,
+ eastl::vector<SGraphNode *> &outInstanceList,
+ qt3dsdm::IDOMReader &inReader)
+{
+ if (!inInstance)
+ return NULL;
+
+ SGraphNode *theReturnInstance = NULL;
+
+ if (inAssetName == "Scene") {
+ theReturnInstance = m_RootNode;
+ } else if (inAssetName == "parent") {
+ theReturnInstance = inInstance->m_Parent;
+ } else if (inAssetName == "children") {
+ outInstanceList.insert(outInstanceList.end(), inInstance->m_Children.begin(),
+ inInstance->m_Children.end());
+ } else if (inAssetName == "descendants") {
+ for (SGraphNode::TGraphNodeList::iterator theChildren = inInstance->m_Children.begin();
+ theChildren != inInstance->m_Children.end(); ++theChildren) {
+ outInstanceList.push_back(*theChildren);
+ GetReferenceNode(*theChildren, inAssetName, outInstanceList, inReader);
+ }
+ } else if (inAssetName[0] == '[' && inAssetName[inAssetName.length() - 1] == ']') {
+ // For example: [targetElement].position
+ // targetElement should be an Object picker specifying which element to preserve.
+ eastl::string theAssetName = inAssetName.substr(1, inAssetName.length() - 2);
+
+ // Check if the target element property exists and get the property value
+ eastl::string theValue;
+ if (!inReader.Att(theAssetName.c_str(), theValue)) {
+ // Try to find the parent context and get the element name from there.
+ if (AreEqual(inReader.GetElementName(), L"Set")) {
+ IDOMReader::Scope __setScope(inReader);
+ const char8_t *refValue = "";
+ inReader.Att("ref", refValue);
+ inReader.Leave();
+ inReader.Leave();
+ for (bool success = inReader.MoveToFirstChild("Add"); success;
+ success = inReader.MoveToNextSibling("Add")) {
+ const char8_t *newRef;
+ inReader.Att("ref", newRef);
+ if (AreEqual(newRef, refValue)) {
+ inReader.Att(theAssetName.c_str(), theValue);
+ break;
+ }
+ }
+ }
+ if (theValue.empty()) {
+ Option<TRuntimeMetaDataStrType> theRef = m_MetaData.GetPropertyValueObjectRef(
+ inInstance->m_Type, m_MetaData.Register(theAssetName.c_str()),
+ inInstance->m_Class);
+ if (theRef.hasValue())
+ theValue = *theRef;
+ }
+ }
+ if (!IsTrivial(theValue.c_str())) {
+ // Get the target element id
+ eastl::string theTargetElement =
+ ParseObjectRefId(theValue, inInstance->m_Id.c_str()).c_str();
+ if (theTargetElement != "") {
+ // Get the corresponding instance
+ theReturnInstance = GetNode(theTargetElement);
+ }
+ }
+ } else {
+ // Get the child with the specified name.
+ // Note that name is not unique and so this will only return the first child that matches
+ // the name
+ for (SGraphNode::TGraphNodeList::iterator theChildren = inInstance->m_Children.begin();
+ theChildren != inInstance->m_Children.end(); ++theChildren) {
+ if (AreEqual((*theChildren)->m_Name.c_str(), inAssetName.c_str())) {
+ theReturnInstance = *theChildren;
+ break;
+ }
+ }
+ }
+ return theReturnInstance;
+}
+
+bool CUIPParserObjectRefHelper::MarkAttributeAsReferenced(
+ SGraphNode *inBaseInstance, eastl::vector<SGraphNode *> &inInstanceList,
+ eastl::string &inAttributeName, qt3dsdm::IDOMReader &inReader,
+ SParseElementManager &outIdAttributesMap)
+{
+ bool theRet(false);
+ eastl::vector<SGraphNode *>::iterator theIter = inInstanceList.begin();
+ eastl::vector<SGraphNode *>::iterator theEnd = inInstanceList.end();
+ for (; theIter != theEnd; ++theIter) {
+ SGraphNode *theCurrentInstance = *theIter;
+
+ if (inAttributeName == "all") {
+ eastl::vector<TRuntimeMetaDataStrType> theProperties;
+ m_MetaData.GetInstanceProperties(theCurrentInstance->m_Type.c_str(),
+ theCurrentInstance->m_Class.c_str(), theProperties,
+ true);
+
+ if (theProperties.size() > 0) {
+ SElementData *theData =
+ outIdAttributesMap.FindElementData(theCurrentInstance->m_Id.c_str());
+ if (theData) {
+ for (QT3DSU32 theIndex = 0; theIndex < theProperties.size(); ++theIndex)
+ outIdAttributesMap.MarkAttributeAsReferenced(
+ *theData, theProperties[theIndex].c_str());
+ }
+ theRet = true;
+ }
+ } else {
+ eastl::string theAttributeName = inAttributeName;
+ if (inAttributeName[0] == '[' && inAttributeName[inAttributeName.length() - 1] == ']') {
+ // For example: parent.[targetProp]
+ // targetProp should be a string specifying which property to preserve
+ theAttributeName = theAttributeName.substr(1, theAttributeName.length() - 2);
+
+ // Get the targetProp property value from the uip file
+ const char *theValue;
+ if (inReader.Att(theAttributeName.c_str(), theValue)) {
+ theAttributeName = theValue;
+ } else {
+ // Query metadata value of base instance
+ theAttributeName = m_MetaData.GetPropertyValueString(
+ inBaseInstance->m_Type, m_MetaData.Register(theAttributeName.c_str()),
+ inBaseInstance->m_Class);
+ }
+ }
+
+ // Check if the property exists
+ if (m_MetaData.IsPropertyExist(theCurrentInstance->m_Type,
+ m_MetaData.Register(theAttributeName.c_str()),
+ theCurrentInstance->m_Class)) {
+ MarkPreserveFlag(theCurrentInstance, theAttributeName, outIdAttributesMap);
+ theRet = true;
+ } else {
+ // check whether the attribute name has ".", strip those after that and try again
+ eastl::string::size_type theIndex = theAttributeName.rfind('.');
+ if (theIndex != eastl::string::npos) {
+ theAttributeName = theAttributeName.substr(0, theIndex);
+ if (m_MetaData.IsPropertyExist(theCurrentInstance->m_Type,
+ m_MetaData.Register(theAttributeName.c_str()),
+ theCurrentInstance->m_Class)) {
+ MarkPreserveFlag(theCurrentInstance, theAttributeName, outIdAttributesMap);
+ theRet = true;
+ }
+ }
+ }
+ }
+ }
+
+ return theRet;
+}
+
+void CUIPParserObjectRefHelper::MarkPreserveFlag(SGraphNode *inInstance, eastl::string inProperty,
+ SParseElementManager &outIdAttributesMap)
+{
+ outIdAttributesMap.MarkAttributeAsReferenced(inInstance->m_Id.c_str(), inProperty.c_str());
+}
+
+void CUIPParserObjectRefHelper::BuildImageNamePropertyList()
+{
+ // Special case for material
+ // Material's Image properties (such as diffuse map, etc) point to Image instances
+ eastl::vector<TRuntimeMetaDataStrType> theProperties;
+ m_MetaData.GetInstanceProperties("Material", NULL, theProperties, true);
+
+ size_t thePropertyCount = theProperties.size();
+ for (QT3DSU32 thePropertyIndex = 0; thePropertyIndex < thePropertyCount; ++thePropertyIndex) {
+ eastl::string theProperty = theProperties[thePropertyIndex];
+ ERuntimeAdditionalMetaDataType theAdditionalMetaDataType =
+ m_MetaData.GetAdditionalType(m_MaterialStr, m_MetaData.Register(theProperty.c_str()));
+
+ if (theAdditionalMetaDataType == ERuntimeAdditionalMetaDataTypeImage) {
+ m_ImageNamePropertyList.insert(m_MetaData.Register(theProperty.c_str()));
+ }
+ }
+}
+}
diff --git a/src/uipparser/Qt3DSUIPParserObjectRefHelper.h b/src/uipparser/Qt3DSUIPParserObjectRefHelper.h
new file mode 100644
index 0000000..fcd1698
--- /dev/null
+++ b/src/uipparser/Qt3DSUIPParserObjectRefHelper.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma once
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include "Qt3DSUIPParser.h"
+#include "Qt3DSUIPParserImpl.h"
+
+//==============================================================================
+// Namespace
+//==============================================================================
+namespace Q3DStudio {
+
+//==============================================================================
+/**
+ * @class CUIPParserObjectRefHelper
+ * @brief Class for parsing UIP file - Object Reference Helper
+ */
+class CUIPParserObjectRefHelper
+{
+ typedef qt3ds::foundation::CRegisteredString TStrType;
+
+public:
+ typedef eastl::hash_map<TStrType, TStrType> TStrToStrMap;
+
+ /// Tree structure to cache scene graph information. This is used to resolve relative object
+ /// reference
+ struct SGraphNode
+ {
+ typedef eastl::vector<SGraphNode *> TGraphNodeList;
+
+ TStrType m_Id; // node id
+ TStrType m_Name; // name of the node. the name can be default from metadata, specified in
+ // graph section, or specified in logic section.
+ TStrType m_Type; // for example: Layer, Camera, Model
+ TStrType
+ m_Class; // class id. usually used by Behavior or objects that have custom properties.
+ void *m_ReaderContext; // Context to warp back to this node.
+ void *m_MasterSlide;
+ SGraphNode *m_Parent;
+ TGraphNodeList m_Children;
+ SGraphNode()
+ : m_ReaderContext(NULL)
+ , m_MasterSlide(NULL)
+ , m_Parent(NULL)
+ {
+ }
+ };
+ //==============================================================================
+ // Fields
+ //==============================================================================
+private:
+ typedef eastl::hash_set<TStrType> TImageNamePropertyList;
+ IRuntimeMetaData &m_MetaData; ///< Reference to Metadata
+ typedef eastl::hash_map<TStrType, SGraphNode *> TGraphNodeMap;
+ SGraphNode *m_RootNode;
+ TGraphNodeMap m_GraphNodeMap;
+ TImageNamePropertyList m_SlideIdSet;
+
+ // List of Image property names, for example diffusemap, normalmap, etc
+ // This is to handle material and images. Material's Image properties point to instances.
+ TImageNamePropertyList m_ImageNamePropertyList;
+ TStrType m_MaterialStr;
+ eastl::vector<void *> m_SceneGraphAliasList;
+
+ typedef eastl::pair<eastl::string, eastl::string> TLightProbeAndNamePair;
+ typedef eastl::map<eastl::string, eastl::string> TLightProbeIdToNameMap;
+ TLightProbeIdToNameMap m_LayerImageIdToNameMap;
+ //==============================================================================
+ // Methods
+ //==============================================================================
+public: // Construction
+ CUIPParserObjectRefHelper(IRuntimeMetaData &inMetaData);
+ virtual ~CUIPParserObjectRefHelper();
+
+ void CacheGraph(qt3dsdm::IDOMReader &inReader, qt3dsdm::IDOMWriter &inWriter);
+ SGraphNode *GetNode(const char *inId);
+ SGraphNode *GetNode(eastl::string inId);
+ TStrType GetName(const eastl::string &inId); // return the node name given the node id
+ TStrType GetType(const eastl::string &inId); // return the node type given the node id
+ TStrType GetClass(const eastl::string &inId); // return the node class given the node id
+
+ TStrType ParseObjectRefId(const eastl::string &inObjectPath, const char8_t *inOwnerId);
+ eastl::string BuildReferenceString(eastl::string inObjectPath);
+ void MarkAllReferencedAttributes(eastl::string inId,
+ const eastl::vector<eastl::string> &inReferences,
+ qt3dsdm::IDOMReader &inReader,
+ SParseElementManager &outIdAttributesMap);
+
+private:
+ void CacheSceneGraph(qt3dsdm::IDOMReader &inReader, SGraphNode *inParent = NULL);
+ SGraphNode &CacheSceneGraphNode(qt3dsdm::IDOMReader &inReader, SGraphNode *inParent = NULL);
+ void CacheStateGraph(qt3dsdm::IDOMReader &inReader);
+
+ void CopySceneGraph(qt3dsdm::IDOMReader &inReader, qt3dsdm::IDOMWriter &inWriter,
+ qt3dsdm::IDOMWriter &inSlideWriter, TStrToStrMap &inMap,
+ const char *inAliasName, const char *inAliasId, SGraphNode &inParent);
+ void CopyStates(qt3dsdm::IDOMReader &inReader, qt3dsdm::IDOMWriter &inSlideWriter,
+ TStrToStrMap &inMap, const char *inAliasName, const char *inAliasId);
+ void CopyAttributes(qt3dsdm::IDOMReader &inReader, qt3dsdm::IDOMWriter &inSlideWriter,
+ TStrToStrMap &inMap, const char *inAliasName, const char *inAliasId);
+ void CopyHierarchy(qt3dsdm::IDOMReader &inReader, qt3dsdm::IDOMWriter &inSlideWriter,
+ TStrToStrMap &inMap, const char *inAliasName, const char *inAliasId);
+ void CopyStateCommands(qt3dsdm::IDOMReader &inReader, qt3dsdm::IDOMWriter &inWriter,
+ TStrToStrMap &oldToNewIdMap, const char *inAliasName,
+ const char *inOldId, const char *inNewId);
+ // Helper method for Preseve Attributes
+ SGraphNode *GetReferenceNode(SGraphNode *inInstance, eastl::string &inAssetName,
+ eastl::vector<SGraphNode *> &outInstanceList,
+ qt3dsdm::IDOMReader &inReader);
+ bool MarkAttributeAsReferenced(SGraphNode *inBaseInstance,
+ eastl::vector<SGraphNode *> &inInstanceList,
+ eastl::string &inAttributeName, qt3dsdm::IDOMReader &inReader,
+ SParseElementManager &outIdAttributesMap);
+ void MarkPreserveFlag(SGraphNode *inInstance, eastl::string inProperty,
+ SParseElementManager &outIdAttributesMap);
+ eastl::pair<const char8_t *, const char8_t *>
+ ProcessAliasAttribute(const char8_t *inObjId,
+ eastl::pair<const char8_t *, const char8_t *> inAttribute,
+ eastl::string &ioStrBuilder, TStrToStrMap &inMap);
+
+ eastl::string BuildAbsoluteReferenceString(eastl::string inId);
+ eastl::string BuildAbsoluteReferenceString(SGraphNode *inNode);
+
+ // Special case for material and images. Material's Image properties point to instances.
+ void BuildImageNamePropertyList();
+};
+
+} // namespace Q3DStudio
diff --git a/src/viewer/Qt3DSAudioPlayerImpl.cpp b/src/viewer/Qt3DSAudioPlayerImpl.cpp
new file mode 100644
index 0000000..b9fb976
--- /dev/null
+++ b/src/viewer/Qt3DSAudioPlayerImpl.cpp
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 - 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "Qt3DSAudioPlayerImpl.h"
+#include "foundation/Qt3DSLogging.h"
+#include <QDebug>
+
+#ifdef PLATFORM_HAS_QT_MULTIMEDIA_LIB
+#include <QSound>
+#endif // PLATFORM_HAS_QT_MULTIMEDIA_LIB
+
+namespace Q3DSViewer {
+
+Qt3DSAudioPlayerImpl::Qt3DSAudioPlayerImpl()
+{
+}
+
+Qt3DSAudioPlayerImpl::~Qt3DSAudioPlayerImpl()
+{
+}
+
+bool Qt3DSAudioPlayerImpl::PlaySoundFile(const char *inFilePath)
+{
+#ifdef PLATFORM_HAS_QT_MULTIMEDIA_LIB
+ QSound::play(QString(inFilePath));
+ return true;
+#else
+ Q_UNUSED(inFilePath)
+ qCWarning(qt3ds::WARNING, "Qt3DSAudioPlayerImpl::PlaySoundFile: no QT multimedia lib on this platform");
+ return false;
+#endif // PLATFORM_HAS_QT_MULTIMEDIA_LIB
+}
+}
diff --git a/src/viewer/Qt3DSAudioPlayerImpl.h b/src/viewer/Qt3DSAudioPlayerImpl.h
new file mode 100644
index 0000000..bba5bd6
--- /dev/null
+++ b/src/viewer/Qt3DSAudioPlayerImpl.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 - 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_VIEWER_LIB_QT3DS_AUDIO_PLAYER_IMPL_H
+#define QT3DS_VIEWER_LIB_QT3DS_AUDIO_PLAYER_IMPL_H
+
+#include "Qt3DSAudioPlayer.h"
+#include "qt3dsruntimeglobal.h"
+
+namespace Q3DSViewer {
+
+class QT3DS_RUNTIME_API Qt3DSAudioPlayerImpl : public Q3DStudio::IAudioPlayer
+{
+public:
+ Qt3DSAudioPlayerImpl();
+ virtual ~Qt3DSAudioPlayerImpl();
+ bool PlaySoundFile(const char *inFilePath) override;
+};
+}
+
+#endif // !QT3DS_VIEWER_LIB_QT3DS_AUDIO_PLAYER_IMPL_H
diff --git a/src/viewer/Qt3DSViewerApp.cpp b/src/viewer/Qt3DSViewerApp.cpp
new file mode 100644
index 0000000..3199124
--- /dev/null
+++ b/src/viewer/Qt3DSViewerApp.cpp
@@ -0,0 +1,1001 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 - 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <algorithm>
+
+#include "EnginePrefix.h"
+#include "Qt3DSRuntimeView.h"
+#include "Qt3DSViewerApp.h"
+#include "Qt3DSTegraInputEngine.h"
+#include "Qt3DSInputFrame.h" // keyboard mapping
+#include "foundation/Qt3DSTime.h"
+#include "Qt3DSFNDTimer.h"
+#include "Qt3DSAudioPlayer.h"
+#include "Qt3DSImportMesh.h"
+
+#include <QList>
+#include <QFileInfo>
+#include <QDebug>
+
+#ifdef _MACOSX
+#include <mach-o/dyld.h>
+#endif
+
+namespace qt3ds {
+void Qt3DSAssert(const char *exp, const char *file, int line, bool *ignore)
+{
+ Q_UNUSED(ignore)
+ qCritical() << "Assertion thrown: " << file << " " << line << " " << exp;
+}
+}
+
+#ifndef EASTL_DEBUG_BREAK
+void EASTL_DEBUG_BREAK()
+{
+ qFatal("EASTL_DEBUG_BREAK: Assertion blown");
+}
+
+#endif
+
+#ifdef _WIN32
+#include <Xinput.h>
+#include <ShellAPI.h>
+#include "Qt3DSInputFrame.h"
+
+void HandleController(Q3DStudio::IRuntimeView &inView)
+{
+ static const class XInputLibrary
+ {
+ private:
+ typedef DWORD(__stdcall *GetStateFunction)(DWORD, XINPUT_STATE *);
+
+ public:
+ XInputLibrary()
+ : m_module(NULL)
+ , GetState(NULL)
+ {
+ m_module = LoadLibraryA("XINPUT9_1_0.DLL");
+ if (m_module != NULL) {
+ GetState = reinterpret_cast<GetStateFunction>(GetProcAddress(m_module,
+ "XInputGetState"));
+ }
+ }
+
+ ~XInputLibrary()
+ {
+ if (m_module != NULL)
+ FreeLibrary(m_module);
+ }
+
+ GetStateFunction GetState;
+
+ private:
+ HMODULE m_module;
+ } library;
+
+ static const DWORD MAX_USERS = 4;
+ static const Q3DStudio::FLOAT STICK_RANGE = 32767;
+ static const Q3DStudio::FLOAT TRIGGER_RANGE = 255;
+
+ static const struct ButtonEntry
+ {
+ WORD XBoxButton;
+ Q3DStudio::INT32 button;
+ } buttonMap[] = {
+ { XINPUT_GAMEPAD_START, Q3DStudio::BUTTON_START },
+ { XINPUT_GAMEPAD_BACK, Q3DStudio::BUTTON_SELECT },
+ { XINPUT_GAMEPAD_LEFT_THUMB, Q3DStudio::BUTTON_THUMBL },
+ { XINPUT_GAMEPAD_RIGHT_THUMB, Q3DStudio::BUTTON_THUMBR },
+ { XINPUT_GAMEPAD_LEFT_SHOULDER, Q3DStudio::BUTTON_L1 },
+ { XINPUT_GAMEPAD_RIGHT_SHOULDER, Q3DStudio::BUTTON_R1 },
+ { XINPUT_GAMEPAD_A, Q3DStudio::BUTTON_A },
+ { XINPUT_GAMEPAD_B, Q3DStudio::BUTTON_B },
+ { XINPUT_GAMEPAD_X, Q3DStudio::BUTTON_X },
+ { XINPUT_GAMEPAD_Y, Q3DStudio::BUTTON_Y } };
+
+ static DWORD userLastPacketNumber[MAX_USERS] = { 0 };
+ static WORD userLastButtons[MAX_USERS] = { 0 };
+
+ Q3DStudio::CInputEngine *input = inView.GetInputEngine();
+ if (input != NULL && library.GetState) {
+ // for each controller
+ for (DWORD userIndex = 0; userIndex < MAX_USERS; ++userIndex) {
+ DWORD &lastPacketNumber = userLastPacketNumber[userIndex];
+ WORD &lastButtons = userLastButtons[userIndex];
+
+ // get the state
+ XINPUT_STATE state = { 0 };
+ if (library.GetState(userIndex, &state) == ERROR_SUCCESS
+ && state.dwPacketNumber != lastPacketNumber) {
+ using namespace Q3DStudio;
+ const XINPUT_GAMEPAD &gamepad = state.Gamepad;
+ const WORD &buttons = gamepad.wButtons;
+
+ // handle button changes
+ DWORD buttonChanges = buttons ^ lastButtons;
+ for (size_t buttonMapIndex = 0;
+ buttonMapIndex < sizeof(buttonMap) / sizeof(buttonMap[0]); ++buttonMapIndex) {
+ const ButtonEntry &buttonEntry = buttonMap[buttonMapIndex];
+ if (buttonEntry.XBoxButton & buttonChanges) {
+ input->HandleButton(buttonEntry.button,
+ buttons & buttonEntry.XBoxButton);
+ }
+ }
+
+ // handle gamepad
+ if (buttons & XINPUT_GAMEPAD_DPAD_LEFT)
+ input->HandleAxis(AXIS_HAT_X, -1);
+ else if (buttons & XINPUT_GAMEPAD_DPAD_RIGHT)
+ input->HandleAxis(AXIS_HAT_X, 1);
+ else
+ input->HandleAxis(AXIS_HAT_X, 0);
+ if (buttons & XINPUT_GAMEPAD_DPAD_UP)
+ input->HandleAxis(AXIS_HAT_Y, -1);
+ else if (buttons & XINPUT_GAMEPAD_DPAD_DOWN)
+ input->HandleAxis(AXIS_HAT_Y, 1);
+ else
+ input->HandleAxis(AXIS_HAT_Y, 0);
+
+ // handle sticks and triggers
+ input->HandleAxis(AXIS_X, gamepad.sThumbLX / STICK_RANGE);
+ input->HandleAxis(AXIS_Y, gamepad.sThumbLY / -STICK_RANGE);
+ input->HandleAxis(AXIS_Z, gamepad.sThumbRX / STICK_RANGE);
+ input->HandleAxis(AXIS_RZ, gamepad.sThumbRY / -STICK_RANGE);
+ input->HandleAxis(AXIS_LTRIGGER, gamepad.bLeftTrigger / TRIGGER_RANGE);
+ input->HandleAxis(AXIS_RTRIGGER, gamepad.bRightTrigger / TRIGGER_RANGE);
+
+ // save the state
+ lastButtons = buttons;
+ lastPacketNumber = state.dwPacketNumber;
+ }
+ }
+ }
+}
+#endif
+
+using namespace Q3DStudio;
+
+struct WindowRect
+{
+ int x;
+ int y;
+ int width;
+ int height;
+};
+
+void PerfLogSetStringData(const char *)
+{
+} // Dummy defination when TCP perf logging isnt used
+
+Q3DStudio::Qt3DSFNDTimer g_GlobalTimeProvider;
+
+qint64 GetTimeUST()
+{
+ // this needs to be nano seconds
+ Q3DStudio::ITimeProvider &theTimer = g_GlobalTimeProvider;
+ return theTimer.GetCurrentTimeMicroSeconds() * 1000;
+}
+
+void initResource() {
+ // init runtime static resources
+ Q_INIT_RESOURCE(res);
+}
+
+namespace Q3DSViewer {
+
+struct SWindowSystemImpl : public Q3DStudio::IWindowSystem
+{
+ QSize m_size;
+ int m_OffscreenID;
+ int m_DepthBitCount;
+
+ QSize GetWindowDimensions() override { return m_size; }
+ void SetWindowDimensions(const QSize &inSize) override
+ {
+ m_size = inSize;
+ }
+ // For platforms that support it, we get the egl info for render plugins
+ // Feel free to return NULL.
+ SEGLInfo *GetEGLInfo() override { return nullptr; }
+ // on some systems we allow our default render target to be a offscreen buffer
+ // otherwise return 0;
+ int GetDefaultRenderTargetID() override { return m_OffscreenID; }
+ // returns the depth buffer bit count for the render window
+ int GetDepthBitCount() override { return m_DepthBitCount; }
+};
+
+class Q3DSViewerAppImpl
+{
+public:
+ Q3DSViewerAppImpl(Q3DStudio::IAudioPlayer *inAudioPlayer)
+ : m_view(nullptr)
+ , m_appInitSuccessful(false)
+ , m_AudioPlayer(inAudioPlayer)
+ {
+#ifndef EMBEDDED_LINUX
+ initResource();
+#endif
+ }
+ Q3DStudio::IRuntimeView *m_view;
+ bool m_appInitSuccessful; ///< true if m_view is initialized successful
+
+ std::vector<int> m_mouseButtons;
+ Q3DStudio::IWindowSystem *m_WindowSystem;
+
+ IAudioPlayer *m_AudioPlayer;
+ QVector<QMouseEvent *> m_pendingEvents;
+
+ QString m_error;
+ qt3dsimp::MeshBuilder *m_meshBuilder = nullptr;
+
+ void queueMouseEvent(int button, int pressed, int x, int y)
+ {
+ QMouseEvent *e = new QMouseEvent(pressed ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease,
+ QPointF(x, y), (Qt::MouseButton)button,
+ (Qt::MouseButtons)button, 0);
+ e->setTimestamp(static_cast<ulong>(GetTimeUST()));
+ m_pendingEvents.append(e);
+ }
+
+ qt3dsimp::Mesh *buildMesh(const Q3DSViewer::MeshData &meshData, QString &error)
+ {
+ using namespace qt3dsimp;
+ using namespace qt3ds::render;
+
+ // Do some basic validation of the meshData
+ if (meshData.m_vertexBuffer.size() == 0) {
+ error = QObject::tr("Vertex buffer empty");
+ return nullptr;
+ }
+ if (meshData.m_attributeCount == 0) {
+ error = QObject::tr("No attributes defined");
+ return nullptr;
+ }
+
+ if (!m_meshBuilder)
+ m_meshBuilder = &MeshBuilder::CreateMeshBuilder();
+ m_meshBuilder->Reset();
+ m_meshBuilder->SetDrawParameters(
+ static_cast<NVRenderDrawMode::Enum>(meshData.m_primitiveType),
+ NVRenderWinding::CounterClockwise);
+
+ // The expectation is that the vertex buffer included in meshData is already properly
+ // formatted and doesn't need further processing.
+
+ // Validate attributes
+ QVector<NVRenderVertexBufferEntry> vBufEntries;
+ NVRenderComponentTypes::Enum indexBufferComponentType = NVRenderComponentTypes::Unknown;
+ int indexBufferTypeSize = 0;
+ for (int i = 0; i < meshData.m_attributeCount; ++i) {
+ const Q3DSViewer::MeshData::Attribute &att = meshData.m_attributes[i];
+ auto componentType = static_cast<NVRenderComponentTypes::Enum>(att.componentType);
+ if (att.semantic == Q3DSViewer::MeshData::Attribute::IndexSemantic) {
+ indexBufferComponentType = componentType;
+ indexBufferTypeSize = att.typeSize();
+ } else {
+ const char *name = nullptr;
+ switch (att.semantic) {
+ case MeshData::Attribute::PositionSemantic:
+ name = Mesh::GetPositionAttrName();
+ break;
+ case MeshData::Attribute::NormalSemantic:
+ name = Mesh::GetNormalAttrName();
+ break;
+ case MeshData::Attribute::TexCoordSemantic:
+ name = Mesh::GetUVAttrName();
+ break;
+ case MeshData::Attribute::TangentSemantic:
+ name = Mesh::GetTexTanAttrName();
+ break;
+ case MeshData::Attribute::BinormalSemantic:
+ name = Mesh::GetTexBinormalAttrName();
+ break;
+ default:
+ error = QObject::tr("Warning: Invalid attribute semantic: %1")
+ .arg(att.semantic);
+ return nullptr;
+ }
+ vBufEntries << NVRenderVertexBufferEntry(name, componentType,
+ QT3DSU32(att.componentCount()),
+ QT3DSU32(att.offset));
+ }
+ }
+ m_meshBuilder->SetVertexBuffer(
+ toConstDataRef(reinterpret_cast<const NVRenderVertexBufferEntry *>(
+ vBufEntries.constData()), QT3DSU32(vBufEntries.count())),
+ QT3DSU32(meshData.m_stride),
+ toConstDataRef(const_cast<QT3DSU8 *>(reinterpret_cast<const QT3DSU8 *>(
+ meshData.m_vertexBuffer.constData())),
+ QT3DSU32(meshData.m_vertexBuffer.size())));
+
+ int vertexCount = 0;
+ if (indexBufferComponentType != NVRenderComponentTypes::Unknown) {
+ m_meshBuilder->SetIndexBuffer(
+ toConstDataRef(const_cast<QT3DSU8 *>(reinterpret_cast<const QT3DSU8 *>(
+ meshData.m_indexBuffer.constData())),
+ QT3DSU32(meshData.m_indexBuffer.size())),
+ indexBufferComponentType);
+ vertexCount = meshData.m_indexBuffer.size() / indexBufferTypeSize;
+ } else {
+ vertexCount = meshData.m_vertexBuffer.size() / meshData.m_stride;
+ }
+
+ m_meshBuilder->AddMeshSubset(Mesh::s_DefaultName, QT3DSU32(vertexCount));
+
+ return &m_meshBuilder->GetMesh();
+ }
+};
+
+///< @brief contructor
+Q3DSViewerApp::Q3DSViewerApp(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer,
+ QElapsedTimer *startupTimer)
+ : m_Impl(*new Q3DSViewerAppImpl(inAudioPlayer))
+ , m_startupTimer(startupTimer)
+{
+ Q_UNUSED(glContext)
+ m_Impl.m_WindowSystem = new SWindowSystemImpl();
+}
+
+///< @brief destructor
+Q3DSViewerApp::~Q3DSViewerApp()
+{
+ qDeleteAll(m_Impl.m_pendingEvents);
+
+ if (m_Impl.m_meshBuilder)
+ m_Impl.m_meshBuilder->Release();
+
+ delete m_Impl.m_AudioPlayer;
+
+ if (m_Impl.m_view) {
+ disconnect(m_Impl.m_view->signalProxy(), nullptr);
+
+ m_Impl.m_view->Cleanup();
+ m_Impl.m_view->release();
+
+ if (GetMemoryManager().GetLineTracker())
+ GetMemoryManager().GetLineTracker()->Report();
+
+ GetMemoryManager().Release();
+ }
+ delete static_cast<SWindowSystemImpl *>(m_Impl.m_WindowSystem);
+}
+
+void Q3DSViewerApp::setOffscreenId(int offscreenID)
+{
+ static_cast<SWindowSystemImpl *>(m_Impl.m_WindowSystem)->m_OffscreenID
+ = offscreenID;
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine())
+ m_Impl.m_view->GetTegraRenderEngine()->ensureRenderTarget();
+}
+
+bool Q3DSViewerApp::InitializeApp(int winWidth, int winHeight, const QSurfaceFormat &format,
+ int offscreenID, const QString &source,
+ const QStringList &variantList,
+ bool delayedLoading,
+ qt3ds::Qt3DSAssetVisitor *assetVisitor)
+{
+ bool hasValidPresentationFile = !source.isEmpty();
+
+ QFileInfo info(source);
+ if (!info.exists()) {
+ m_Impl.m_error
+ = QObject::tr("Failed to initialize viewer, presentation doesn't exist");
+ qCritical() << m_Impl.m_error;
+ return false;
+ }
+
+ m_Impl.m_WindowSystem->SetWindowDimensions(QSize(winWidth, winHeight));
+
+ // create our internal application
+ if (hasValidPresentationFile && !m_Impl.m_view) {
+ static_cast<SWindowSystemImpl *>(m_Impl.m_WindowSystem)->m_OffscreenID = offscreenID;
+ static_cast<SWindowSystemImpl *>(m_Impl.m_WindowSystem)->m_DepthBitCount
+ = format.depthBufferSize();
+
+ // create internal app
+ m_Impl.m_view = &IRuntimeView::Create(g_GlobalTimeProvider, *m_Impl.m_WindowSystem,
+ m_Impl.m_AudioPlayer, m_startupTimer);
+
+ if (assetVisitor)
+ m_Impl.m_view->setAssetVisitor(assetVisitor);
+
+ m_Impl.m_appInitSuccessful = m_Impl.m_view->BeginLoad(source, variantList);
+
+ if (m_Impl.m_appInitSuccessful == false) {
+ m_Impl.m_error = QObject::tr("Viewer launch failure! Failed to load: '%1'").arg(source);
+ m_Impl.m_error.append("\n");
+ qCritical() << m_Impl.m_error;
+ return false;
+ }
+
+ bool success = m_Impl.m_view->InitializeGraphics(format, delayedLoading);
+ if (!success) {
+ m_Impl.m_error = QObject::tr("Viewer launch failure! Failed to load: '%1'").arg(source);
+ m_Impl.m_error.append("\n");
+ qCritical() << m_Impl.m_error;
+ return false;
+ }
+
+ // Connect signals
+ connect(m_Impl.m_view->signalProxy(),
+ &QRuntimeViewSignalProxy::SigSlideEntered, this, &Q3DSViewerApp::SigSlideEntered);
+ connect(m_Impl.m_view->signalProxy(),
+ &QRuntimeViewSignalProxy::SigSlideExited, this, &Q3DSViewerApp::SigSlideExited);
+ connect(m_Impl.m_view->signalProxy(),
+ &QRuntimeViewSignalProxy::SigCustomSignal, this, &Q3DSViewerApp::SigCustomSignal);
+ connect(m_Impl.m_view->signalProxy(), &QRuntimeViewSignalProxy::SigDataOutputValueUpdated,
+ this, &Q3DSViewerApp::SigDataOutputValueUpdated);
+ QMetaObject::Connection *presReadyconn = new QMetaObject::Connection();
+ *presReadyconn = connect(m_Impl.m_view->signalProxy(),
+ &QRuntimeViewSignalProxy::SigPresentationReady, [&, presReadyconn]{
+ // We receive presentation ready signal from runtime when animations and properties
+ // have been updated.
+ Q_EMIT SigPresentationReady();
+ disconnect(*presReadyconn);
+ delete presReadyconn;
+ });
+ connect(m_Impl.m_view->signalProxy(), &QRuntimeViewSignalProxy::SigElementsCreated, this,
+ &Q3DSViewerApp::SigElementsCreated);
+ connect(m_Impl.m_view->signalProxy(), &QRuntimeViewSignalProxy::SigMaterialsCreated, this,
+ &Q3DSViewerApp::SigMaterialsCreated);
+
+ Resize(winWidth, winHeight);
+
+ Q_EMIT SigPresentationLoaded();
+ }
+ return true;
+}
+
+bool Q3DSViewerApp::IsInitialised(void)
+{
+ return m_Impl.m_view != nullptr && m_Impl.m_appInitSuccessful;
+}
+
+int Q3DSViewerApp::GetWindowHeight()
+{
+ return m_Impl.m_WindowSystem->GetWindowDimensions().width();
+}
+
+int Q3DSViewerApp::GetWindowWidth()
+{
+ return m_Impl.m_WindowSystem->GetWindowDimensions().height();
+}
+
+void Q3DSViewerApp::setupSearchPath(std::vector<std::string> &cmdLineArgs)
+{
+ // setup some additional search path
+ // index 0 contains the module directory
+#ifdef _MACOSX
+ char buf[2056];
+ uint32_t bufsize = 2056;
+ _NSGetExecutablePath(buf, &bufsize);
+ std::string theModuleDirectory = buf;
+#else
+ std::string theModuleDirectory = cmdLineArgs[0];
+#endif
+ std::string::size_type pos = theModuleDirectory.rfind('\\');
+ if (pos == std::string::npos)
+ pos = theModuleDirectory.rfind('/');
+
+ // Include the slash
+ theModuleDirectory = theModuleDirectory.substr(0, pos + 1);
+
+ // TODO: Search path needs to be set up properly
+ //NvFAppendSearchPath(theModuleDirectory.c_str());
+}
+
+void Q3DSViewerApp::Render()
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine()) {
+ if (m_Impl.m_appInitSuccessful) {
+ for (QEvent *e : m_Impl.m_pendingEvents) {
+ m_Impl.m_view->HandleMessage(e);
+ delete e;
+ }
+ m_Impl.m_pendingEvents.clear();
+#ifdef WIN32
+ HandleController(*m_Impl.m_view);
+#endif
+
+ m_Impl.m_view->Render();
+ }
+ }
+}
+
+void Q3DSViewerApp::SaveState()
+{
+ if (!m_Impl.m_view)
+ return;
+
+ if (m_Impl.m_view->GetTegraRenderEngine()) {
+ ITegraRenderStateManager &manager =
+ m_Impl.m_view->GetTegraRenderEngine()->GetTegraRenderStateManager();
+
+ manager.SaveAllState();
+ }
+}
+
+void Q3DSViewerApp::RestoreState()
+{
+ if (!m_Impl.m_view)
+ return;
+
+ if (m_Impl.m_view->GetTegraRenderEngine()) {
+ ITegraRenderStateManager &manager =
+ m_Impl.m_view->GetTegraRenderEngine()->GetTegraRenderStateManager();
+
+ manager.RestoreAllState();
+ }
+}
+
+bool Q3DSViewerApp::WasLastFrameDirty()
+{
+ if (m_Impl.m_view)
+ return m_Impl.m_view->WasLastFrameDirty();
+ return false;
+}
+
+QString Q3DSViewerApp::error()
+{
+ QString error = m_Impl.m_error;
+ m_Impl.m_error.clear();
+ return error;
+}
+
+void Q3DSViewerApp::setDelayedLoading(bool enable)
+{
+ if (!m_Impl.m_view)
+ return;
+ m_Impl.m_view->setDelayedLoading(enable);
+}
+
+void Q3DSViewerApp::preloadSlide(const QString &slide)
+{
+ if (!m_Impl.m_view)
+ return;
+ m_Impl.m_view->preloadSlide(slide);
+}
+
+void Q3DSViewerApp::unloadSlide(const QString &slide)
+{
+ if (!m_Impl.m_view)
+ return;
+ m_Impl.m_view->unloadSlide(slide);
+}
+
+void Q3DSViewerApp::Resize(int width, int height)
+{
+ QSize oldSize = m_Impl.m_WindowSystem->GetWindowDimensions();
+ QSize newSize(width, height);
+ m_Impl.m_WindowSystem->SetWindowDimensions(newSize);
+
+ if (m_Impl.m_appInitSuccessful && m_Impl.m_view
+ && m_Impl.m_view->GetTegraRenderEngine()) {
+ QResizeEvent event = QResizeEvent(newSize, oldSize);
+ m_Impl.m_view->HandleMessage(&event);
+ }
+}
+
+void Q3DSViewerApp::HandleKeyInput(Q3DStudio::EKeyCode inKeyCode, bool isPressed)
+{
+ if (!m_Impl.m_view || inKeyCode == Q3DStudio::KEY_NOKEY)
+ return;
+
+ CInputEngine *input = m_Impl.m_view->GetInputEngine();
+ if (input)
+ input->HandleKeyboard(inKeyCode, isPressed);
+}
+
+void Q3DSViewerApp::HandleMouseMove(int x, int y, bool isPressed)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ CInputEngine *input = m_Impl.m_view->GetInputEngine();
+ if (input) {
+ input->BeginPickInput();
+ input->EndPickInput();
+ input->SetPickInput(static_cast<Q3DStudio::FLOAT>(x), static_cast<Q3DStudio::FLOAT>(y),
+ isPressed);
+ }
+
+}
+
+void Q3DSViewerApp::HandleMousePress(int x, int y, int mouseButton, bool isPressed)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ bool hasButton
+ = std::find(m_Impl.m_mouseButtons.begin(), m_Impl.m_mouseButtons.end(), mouseButton)
+ != m_Impl.m_mouseButtons.end();
+
+ if ((mouseButton == 1 || mouseButton == 2)) {
+ // We keep track of the mouse presses because there are situations where the application
+ // will not give us a mouse
+ // up for each mouse down. This ameleorates the effects of those slightly misbehaving
+ // applications.
+ if (isPressed == hasButton) {
+ bool localIsPressed = !isPressed;
+ // Slightly recursive call in order to handle situations where we aren't getting
+ // the mouse up with the corresponding mouse down or vice versa.
+ HandleMousePress(x, y, mouseButton, localIsPressed);
+ HandleMousePress(x, y, mouseButton, isPressed);
+ } else {
+ if (isPressed) {
+ m_Impl.m_mouseButtons.push_back(mouseButton);
+ qCInfo(qt3ds::TRACE_INFO)
+ << "ViewerApp: Mouse down of frame "
+ << m_Impl.m_view->GetFrameCount();
+ } else {
+ m_Impl.m_mouseButtons.erase(std::remove(m_Impl.m_mouseButtons.begin(),
+ m_Impl.m_mouseButtons.end(), mouseButton),
+ m_Impl.m_mouseButtons.end());
+ }
+
+ CInputEngine *input = m_Impl.m_view->GetInputEngine();
+
+ if (input) {
+ input->BeginPickInput();
+ input->SetPickInput(static_cast<Q3DStudio::FLOAT>(x),
+ static_cast<Q3DStudio::FLOAT>(y), isPressed);
+ input->EndPickInput();
+
+ m_Impl.queueMouseEvent(mouseButton, isPressed ? 1 : 0, x, y);
+ }
+ }
+ }
+}
+
+void Q3DSViewerApp::HandleMouseWheel(int x, int y, int orientation, int numSteps)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ CInputEngine *input = m_Impl.m_view->GetInputEngine();
+ if (input) {
+ input->SetPickInput(static_cast<Q3DStudio::FLOAT>(x), static_cast<Q3DStudio::FLOAT>(y), 0);
+ input->SetScrollValue(orientation == 0 ? VSCROLLWHEEL : HSCROLLWHEEL, numSteps);
+ }
+}
+
+void Q3DSViewerApp::GoToSlideByName(const char *elementPath, const char *slideName)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->GoToSlideByName(elementPath, slideName);
+}
+
+void Q3DSViewerApp::GoToSlideByIndex(const char *elementPath, const int slideIndex)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->GoToSlideByIndex(elementPath, slideIndex);
+}
+
+void Q3DSViewerApp::GoToSlideRelative(const char *elementPath, const bool next, const bool wrap)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->GoToSlideRelative(elementPath, next, wrap);
+}
+
+bool Q3DSViewerApp::GetSlideInfo(const char *elementPath, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName)
+{
+ if (!m_Impl.m_view)
+ return false;
+
+ return m_Impl.m_view->GetSlideInfo(elementPath, currentIndex, previousIndex,
+ currentName, previousName);
+}
+
+void Q3DSViewerApp::SetPresentationActive(const char *presId, const bool active)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->SetPresentationAttribute(presId, nullptr, active ? "True" : "False");
+}
+
+void Q3DSViewerApp::GoToTime(const char *elementPath, const float time)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->GoToTime(elementPath, time);
+}
+
+void Q3DSViewerApp::PlaySoundFile(const char *soundPath)
+{
+ if (!m_Impl.m_AudioPlayer || !soundPath)
+ return;
+
+ m_Impl.m_AudioPlayer->PlaySoundFile(soundPath);
+}
+
+void Q3DSViewerApp::SetAttribute(const char *elementPath, const char *attributeName,
+ const char *value)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->SetAttribute(elementPath, attributeName, value);
+}
+
+bool Q3DSViewerApp::GetAttribute(const char *elementPath, const char *attributeName, void *value)
+{
+ if (!m_Impl.m_view)
+ return false;
+
+ return m_Impl.m_view->GetAttribute(elementPath, attributeName, value);
+}
+
+void Q3DSViewerApp::FireEvent(const char *elementPath, const char *evtName)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->FireEvent(elementPath, evtName);
+}
+
+bool Q3DSViewerApp::PeekCustomAction(std::string &outElementPath, std::string &outActionName)
+{
+ if (!m_Impl.m_view)
+ return false;
+
+ char *theElementPath = nullptr;
+ char *theActioName = nullptr;
+ bool retVal = m_Impl.m_view->PeekCustomAction(theElementPath, theActioName);
+
+ if (theElementPath)
+ outElementPath = theElementPath;
+ if (theActioName)
+ outActionName = theActioName;
+
+ return retVal;
+}
+
+bool Q3DSViewerApp::RegisterScriptCallback(ViewerCallbackType::Enum inCallbackType,
+ const qml_Function inCallback, void *inUserData)
+{
+ if (!m_Impl.m_view)
+ return false;
+
+ // convert to int
+ int callbackType = 0;
+ if (inCallbackType == Q3DSViewer::ViewerCallbackType::CALLBACK_ON_INIT)
+ callbackType = 1;
+ else if (inCallbackType == Q3DSViewer::ViewerCallbackType::CALLBACK_ON_UPDATE)
+ callbackType = 2;
+ else
+ return false;
+
+ bool retVal = m_Impl.m_view->RegisterScriptCallback(callbackType, inCallback, inUserData);
+
+ return retVal;
+}
+
+void Q3DSViewerApp::SetScaleMode(ViewerScaleModes::Enum inScale)
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine()) {
+ m_Impl.m_view->GetTegraRenderEngine()->SetScaleMode(
+ static_cast<TegraRenderScaleModes::Enum>(inScale));
+ }
+}
+
+ViewerScaleModes::Enum Q3DSViewerApp::GetScaleMode()
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine()) {
+ return static_cast<ViewerScaleModes::Enum>(
+ m_Impl.m_view->GetTegraRenderEngine()->GetScaleMode());
+ }
+
+ return ViewerScaleModes::ExactSize;
+}
+
+void Q3DSViewerApp::setMatteColor(const QColor &color)
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine()) {
+ m_Impl.m_view->GetTegraRenderEngine()->SetMatteColor(
+ qt3ds::QT3DSVec4(color.redF(), color.greenF(),
+ color.blueF(), color.alphaF()));
+ }
+}
+
+void Q3DSViewerApp::setShowOnScreenStats(bool inShow)
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine())
+ m_Impl.m_view->showOnScreenStats(inShow);
+}
+
+void Q3DSViewerApp::SetShadeMode(ViewerShadeModes::Enum inShadeMode)
+{
+ if (m_Impl.m_view && m_Impl.m_view->GetTegraRenderEngine()) {
+ StaticAssert<ViewerShadeModes::Shaded == TegraRenderShadeModes::Shaded>::valid_expression();
+ StaticAssert<ViewerShadeModes::ShadedWireframe
+ == TegraRenderShadeModes::ShadedWireframe>::valid_expression();
+ StaticAssert<ViewerShadeModes::Wireframe
+ == TegraRenderShadeModes::Wireframe>::valid_expression();
+
+ m_Impl.m_view->GetTegraRenderEngine()->SetShadeMode(
+ static_cast<TegraRenderShadeModes::Enum>(inShadeMode));
+ }
+}
+
+void Q3DSViewerApp::SetGlobalAnimationTime(qint64 inMilliSecs)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->SetGlobalAnimationTime(inMilliSecs);
+}
+
+void Q3DSViewerApp::SetDataInputValue(
+ const QString &name, const QVariant &value, qt3ds::runtime::DataInputValueRole valueRole)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->SetDataInputValue(name, value, int(valueRole));
+}
+
+void Q3DSViewerApp::setPresentationId(const QString &id)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->setPresentationId(id);
+}
+
+QList<QString> Q3DSViewerApp::dataInputs() const
+{
+ if (!m_Impl.m_view)
+ return {};
+
+ return m_Impl.m_view->dataInputs();
+}
+
+QList<QString> Q3DSViewerApp::dataOutputs() const
+{
+ if (!m_Impl.m_view)
+ return {};
+
+ return m_Impl.m_view->dataOutputs();
+}
+
+float Q3DSViewerApp::dataInputMax(const QString &name) const
+{
+ if (!m_Impl.m_view)
+ return 0.0f;
+
+ return m_Impl.m_view->dataInputMax(name);
+}
+
+float Q3DSViewerApp::dataInputMin(const QString &name) const
+{
+ if (!m_Impl.m_view)
+ return 0.0f;
+
+ return m_Impl.m_view->dataInputMin(name);
+}
+
+QHash<QString, QString> Q3DSViewerApp::dataInputMetadata(const QString &name) const
+{
+ if (!m_Impl.m_view)
+ return {};
+
+ return m_Impl.m_view->dataInputMetadata(name);
+}
+
+void Q3DSViewerApp::createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->createElements(parentElementPath, slideName, properties);
+}
+
+void Q3DSViewerApp::deleteElements(const QStringList &elementPaths)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->deleteElements(elementPaths);
+}
+
+void Q3DSViewerApp::createMaterials(const QString &subPresId,
+ const QStringList &materialDefinitions)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->createMaterials(subPresId, materialDefinitions);
+}
+
+void Q3DSViewerApp::deleteMaterials(const QStringList &materialNames)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->deleteMaterials(materialNames);
+}
+
+void Q3DSViewerApp::createMeshes(const QHash<QString, Q3DSViewer::MeshData> &meshData)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ QString error;
+ QHashIterator<QString, Q3DSViewer::MeshData> dataIter(meshData);
+ while (dataIter.hasNext()) {
+ dataIter.next();
+ // Mesh creation needs to be done one by one, as Mesh pointers are not valid
+ // after builder is reused
+ qt3dsimp::Mesh *mesh = m_Impl.buildMesh(dataIter.value(), error);
+ if (mesh) {
+ m_Impl.m_view->createMesh(dataIter.key(), mesh);
+ } else {
+ QString errorMsg = QObject::tr("Creating mesh '%1' failed: %2")
+ .arg(dataIter.key()).arg(error);
+ qWarning() << __FUNCTION__ << errorMsg;
+ SigMeshesCreated(meshData.keys(), error);
+ return;
+ }
+ }
+ m_Impl.m_meshBuilder->Reset();
+ SigMeshesCreated(meshData.keys(), error);
+}
+
+void Q3DSViewerApp::deleteMeshes(const QStringList &meshNames)
+{
+ if (!m_Impl.m_view)
+ return;
+
+ m_Impl.m_view->deleteMeshes(meshNames);
+}
+
+Q3DSViewerApp &Q3DSViewerApp::Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer,
+ QElapsedTimer *startupTimer)
+{
+ return *Q3DStudio_virtual_new(Q3DSViewerApp) Q3DSViewerApp(glContext, inAudioPlayer,
+ startupTimer);
+}
+
+void Q3DSViewerApp::Release()
+{
+ Q3DStudio_virtual_delete(this, Q3DSViewerApp);
+}
+
+} // end namespace
diff --git a/src/viewer/Qt3DSViewerApp.h b/src/viewer/Qt3DSViewerApp.h
new file mode 100644
index 0000000..06fdeef
--- /dev/null
+++ b/src/viewer/Qt3DSViewerApp.h
@@ -0,0 +1,525 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 - 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_VIEWER_H
+#define QT3DS_VIEWER_H
+
+#include "qt3dsruntimeglobal.h"
+#include "Qt3DSApplication.h"
+#include "Qt3DSInputDefs.h"
+
+#include <string>
+#include <vector>
+#include <QObject>
+#include <QtCore/qelapsedtimer.h>
+#include <QtCore/qvector.h>
+#include <QtCore/qstringlist.h>
+#include <QtGui/qsurfaceformat.h>
+
+namespace Q3DStudio {
+class IRuntimeView;
+class IWindowSystem;
+class IAudioPlayer;
+}
+
+namespace qt3ds {
+class Qt3DSAssetVisitor
+{
+public:
+ virtual void visit(const char *path) = 0;
+ virtual void visit(const char *type, const char *id, const char *src, const char *args) = 0;
+};
+}
+
+namespace Q3DSViewer {
+
+typedef void (*qml_Function)(void *inUserData);
+
+// not must match the NDDRuntime see
+// UICQmlEngine.h
+struct ViewerCallbackType
+{
+ enum Enum {
+ CALLBACK_ON_INIT = 1,
+ CALLBACK_ON_UPDATE = 2,
+ };
+};
+
+struct ViewerContextType
+{
+ enum Enum { GL_ES2 = 0, GL_ES3, GL_ES31, GL_ES32, GL_2, GL_3_3, GL_4 };
+};
+
+struct ViewerScaleModes
+{
+ enum Enum {
+ ExactSize = 0, // Ensure the viewport is exactly same size as application
+ ScaleToFit = 1, // Resize viewport keeping aspect ratio
+ ScaleToFill = 2, // Resize viewport to entire window
+ };
+};
+
+struct ViewerShadeModes
+{
+ enum Enum {
+ Shaded = 0, // Geometry is shaded only
+ ShadedWireframe = 1, // Wireframe is drawn on top shaded geometry
+ Wireframe = 2, // Wireframe only
+ };
+};
+
+// Intermediate struct to transfer mesh data between studio3d module and runtime
+struct MeshData
+{
+ // All enums must match the ones defined by Q3DSGeometry class in studio3d module
+ enum PrimitiveType { // Must match also internal NVRenderDrawMode
+ UnknownType = 0,
+ Points,
+ LineStrip,
+ LineLoop,
+ Lines,
+ TriangleStrip,
+ TriangleFan,
+ Triangles, // Default primitive type
+ Patches
+ };
+
+ struct Attribute {
+ enum Semantic {
+ UnknownSemantic = 0,
+ IndexSemantic,
+ PositionSemantic, // attr_pos
+ NormalSemantic, // attr_norm
+ TexCoordSemantic, // attr_uv0
+ TangentSemantic, // attr_textan
+ BinormalSemantic // attr_binormal
+ };
+ enum ComponentType { // Must match also internal NVRenderComponentTypes
+ DefaultType = 0,
+ U8Type,
+ I8Type,
+ U16Type,
+ I16Type,
+ U32Type, // Default for IndexSemantic
+ I32Type,
+ U64Type,
+ I64Type,
+ F16Type,
+ F32Type, // Default for other semantics
+ F64Type
+ };
+
+ int typeSize() const
+ {
+ switch (componentType) {
+ case U8Type: return 1;
+ case I8Type: return 1;
+ case U16Type: return 2;
+ case I16Type: return 2;
+ case U32Type: return 4;
+ case I32Type: return 4;
+ case U64Type: return 8;
+ case I64Type: return 8;
+ case F16Type: return 2;
+ case F32Type: return 4;
+ case F64Type: return 8;
+ default:
+ Q_ASSERT(false);
+ return 0;
+ }
+ }
+
+ int componentCount() const
+ {
+ switch (semantic) {
+ case IndexSemantic: return 1;
+ case PositionSemantic: return 3;
+ case NormalSemantic: return 3;
+ case TexCoordSemantic: return 2;
+ case TangentSemantic: return 3;
+ case BinormalSemantic: return 3;
+ default:
+ Q_ASSERT(false);
+ return 0;
+ }
+ }
+
+ Semantic semantic = PositionSemantic;
+ ComponentType componentType = F32Type;
+ int offset = 0;
+ };
+
+ static const int MAX_ATTRIBUTES = 6;
+
+ void clear()
+ {
+ m_vertexBuffer.clear();
+ m_indexBuffer.clear();
+ m_attributeCount = 0;
+ m_primitiveType = Triangles;
+ }
+
+ QByteArray m_vertexBuffer;
+ QByteArray m_indexBuffer;
+
+ Attribute m_attributes[MAX_ATTRIBUTES];
+ int m_attributeCount = 0;
+ PrimitiveType m_primitiveType = Triangles;
+ int m_stride = 0;
+};
+
+class Q3DSViewerAppImpl;
+class QT3DS_RUNTIME_API Q3DSViewerApp : public QObject
+{
+ Q_OBJECT
+private:
+ Q3DSViewerApp(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer,
+ QElapsedTimer *startupTimer);
+ ~Q3DSViewerApp();
+
+public:
+ /**
+ * @brief Initialize viewer app
+ *
+ * @param[in] winWidth window width
+ * @param[in] winHeight window height
+ * @param[in] format OpenGL API version
+ * @param[in] offscreenID ID of an OpenGL FBO we should render to by default
+ * @param[in] source string to presentation source
+ *
+ * @return true on success
+ */
+ bool InitializeApp(int winWidth, int winHeight, const QSurfaceFormat& format,
+ int offscreenID, const QString &source,
+ const QStringList &variantList,
+ bool delayedLoading,
+ qt3ds::Qt3DSAssetVisitor *assetVisitor = nullptr);
+
+ bool IsInitialised(void);
+ void setOffscreenId(int offscreenID);
+
+
+ /*
+ * @brief handle window resize
+ *
+ * @param[in] width new width
+ * @param[in] height new size
+ *
+ * @return no return
+ */
+ void Resize(int width, int height);
+
+ /*
+ * @brief does the actual scene rendering
+ *
+ * @return no return
+ */
+ void Render();
+
+ /*
+ * @brief handle keyboard input
+ *
+ * @param[in] keyEvent event
+ * @param[in] isPressed true if key pressed
+ *
+ * @return no return
+ */
+ void HandleKeyInput(Q3DStudio::EKeyCode inKeyCode, bool isPressed);
+
+ /*
+ * @brief handle mouse move input
+ *
+ * @param[in] x mouse pos x
+ * @param[in] y mouse pos y
+ * @param[in] mouseButton mouse button id
+ * @param[in] isPressed true if key pressed
+ *
+ * @return no return
+ */
+ void HandleMouseMove(int x, int y, bool isPressed);
+
+ /*
+ * @brief handle mouse press events
+ *
+ * @param[in] x mouse pos x
+ * @param[in] y mouse pos y
+ * @param[in] mouseButton mouse button id
+ * @param[in] isPressed true if key pressed
+ *
+ * @return no return
+ */
+ void HandleMousePress(int x, int y, int mouseButton, bool isPressed);
+
+ /*
+ * @brief handle mouse wheel events
+ *
+ * @param[in] x mouse pos x
+ * @param[in] y mouse pos y
+ * @param[in] orientation 0 vertical, 1 horizontal
+ * @param[in] numSteps how much the wheel has turned
+ *
+ * @return no return
+ */
+ void HandleMouseWheel(int x, int y, int orientation, int numSteps);
+
+ /*
+ * @brief Scale scene to adjsut to window size regarding width and height
+ *
+ * @param[in] inScale true if scale false if unscale
+ *
+ * @return no return
+ */
+ void SetScaleMode(ViewerScaleModes::Enum inScaleMode);
+
+ ViewerScaleModes::Enum GetScaleMode();
+
+ void setMatteColor(const QColor &color);
+ void setShowOnScreenStats(bool s);
+
+ /*
+ * @brief Set the shading mode
+ *
+ * @param[in] inShadeMode the selected shade mode
+ *
+ * @return no return
+ */
+ void SetShadeMode(ViewerShadeModes::Enum inShadeMode);
+
+ /*
+ * @brief Save current render state
+ *
+ * @return no return
+ */
+ void SaveState();
+ /*
+ * @brief Restore current render state
+ *
+ * @return no return
+ */
+ void RestoreState();
+
+ /// event call back slots
+
+ /*
+ * @brief Go to a slide by name
+ *
+ * @param[in] elementPath where to find the element
+ * @param[in] slideName slide name
+ *
+ * @return no return
+ */
+ void GoToSlideByName(const char *elementPath, const char *slideName);
+
+ /*
+ * @brief Go to a slide by index
+ *
+ * @param[in] elementPath where to find the element
+ * @param[in] slideIndex slide index
+ *
+ * @return no return
+ */
+ void GoToSlideByIndex(const char *elementPath, const int slideIndex);
+
+ /*
+ * @brief Go to relative slide
+ *
+ * @param[in] elementPath where to find the element
+ * @param[in] next next or previous
+ * @param[in] wrap wrap to beginning if end is reached
+ *
+ * @return no return
+ */
+ void GoToSlideRelative(const char *elementPath, const bool next, const bool wrap);
+
+ bool GetSlideInfo(const char *elementPath, int &currentIndex, int &previousIndex,
+ QString &currentName, QString &previousName);
+
+ /*
+ * @brief Set presentation active or inactive
+ *
+ * @param[in] presId presentation id (name without .uip)
+ * @param[in] active set active or inactive
+ *
+ * @return no return
+ */
+ void SetPresentationActive(const char *presId, const bool active);
+
+ /*
+ * @brief Go to a certain time
+ *
+ * @param[in] elementPath where to find the element
+ * @param[in] time time to move
+ *
+ * @return no return
+ */
+ void GoToTime(const char *elementPath, const float time);
+
+ /*
+ * @brief Play a sound
+ *
+ * @param[in] soundPath sound file to play
+ *
+ * @return no return
+ */
+ void PlaySoundFile(const char *soundPath);
+
+ /*
+ * @brief Set attribute values
+ *
+ * @param[in] elementPath where to find the element
+ * @param[in] attributeName attribute name
+ * @param[in] value new value of the attribute
+ *
+ * @return no return
+ */
+ void SetAttribute(const char *elementPath, const char *attributeName, const char *value);
+
+ /*
+ * @brief Get attribute values
+ *
+ * @param[in] elementPath where to find the element
+ * @param[in] attributeName attribute name
+ * @param[out] value current attribute values
+ *
+ * @return true if successful
+ */
+ bool GetAttribute(const char *elementPath, const char *attributeName, void *value);
+
+ /*
+ * @brief Fire an event
+ *
+ * @param[in] elementPath where to find the element to fire the event on
+ * @param[in] evtName the string that identifies and defines the event
+ *
+ * @return no return
+ */
+ void FireEvent(const char *elementPath, const char *evtName);
+
+ /*
+ * @brief Peek a custom action from the queue
+ * Note the action is remvoved from the queue
+ *
+ * @param[out] outElementPath element path
+ * @param[out] actionName action name
+ *
+ * @return true if action available
+ */
+ bool PeekCustomAction(std::string &outElementPath, std::string &actionName);
+
+ /**
+ * @brief Register a callback
+ *
+ * @param[in] callbackType callback type
+ * @param[in] inCallback pointer to callback
+ * @param[in] inCallback pointer to user data
+ *
+ * @return true on success
+ */
+ bool RegisterScriptCallback(ViewerCallbackType::Enum callbackType,
+ const qml_Function inCallback, void *inUserData);
+
+ bool WasLastFrameDirty();
+
+ int GetWindowHeight();
+ int GetWindowWidth();
+
+ void SetGlobalAnimationTime(qint64 inMilliSecs);
+
+ void SetDataInputValue(const QString &name, const QVariant &value,
+ qt3ds::runtime::DataInputValueRole valueRole
+ = qt3ds::runtime::DataInputValueRole::Value);
+
+ QList<QString> dataInputs() const;
+ QList<QString> dataOutputs() const;
+
+ float dataInputMax(const QString &name) const;
+ float dataInputMin(const QString &name) const;
+ QHash<QString, QString> dataInputMetadata(const QString &name) const;
+
+ void createElements(const QString &parentElementPath, const QString &slideName,
+ const QVector<QHash<QString, QVariant>> &properties);
+ void deleteElements(const QStringList &elementPaths);
+ void createMaterials(const QString &subPresId, const QStringList &materialDefinitions);
+ void deleteMaterials(const QStringList &materialNames);
+ void createMeshes(const QHash<QString, Q3DSViewer::MeshData> &meshData);
+ void deleteMeshes(const QStringList &meshNames);
+
+ QString error();
+
+ void setPresentationId(const QString &id);
+ void preloadSlide(const QString &slide);
+ void unloadSlide(const QString &slide);
+ void setDelayedLoading(bool enable);
+
+private:
+ /*
+ * @brief parse command line arguments this fills in our
+ * global command line variables
+ *
+ * @param[in] cmdLineArgs string to command line parameter
+ *
+ * @return no return
+ */
+ void handleCmdLineArguments(std::vector<std::string> &cmdLineArgs);
+ /*
+ * @brief setup search path.
+ * This functions setup additonal search path for resoruces
+ *
+ * @param[in] cmdLineArgs string to command line parameter
+ *
+ * @return no return
+ */
+ void setupSearchPath(std::vector<std::string> &cmdLineArgs);
+
+private:
+ Q3DSViewerAppImpl &m_Impl;
+ QElapsedTimer *m_startupTimer;
+ bool m_presentationReady = false;
+
+public:
+ static Q3DSViewerApp &Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer = nullptr,
+ QElapsedTimer *startupTimer = nullptr);
+ void Release();
+
+Q_SIGNALS:
+ void SigSlideEntered(const QString &elementPath, unsigned int index, const QString &name);
+ void SigSlideExited(const QString &elementPath, unsigned int index, const QString &name);
+ void SigCustomSignal(const QString &elementPath, const QString &name);
+ void SigElementsCreated(const QStringList &elementPaths, const QString &error);
+ void SigMaterialsCreated(const QStringList &materialNames, const QString &error);
+ void SigMeshesCreated(const QStringList &meshNames, const QString &error);
+ void SigDataOutputValueUpdated(const QString &name, const QVariant &newValue);
+ void SigPresentationReady();
+ void SigPresentationLoaded();
+};
+
+} // end namespace
+
+#endif // QT3DS_VIEWER_H
diff --git a/src/viewer/Qt3DSViewerTimer.h b/src/viewer/Qt3DSViewerTimer.h
new file mode 100644
index 0000000..de679ce
--- /dev/null
+++ b/src/viewer/Qt3DSViewerTimer.h
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 - 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DS_ELAPSED_TIMER_H
+#define QT3DS_ELAPSED_TIMER_H
+#include <QElapsedTimer>
+
+namespace Q3DSViewer {
+
+///< @brief this class implementes a elapsed timer using QElapsedTimer
+class Qt3DSElapsedTimer
+{
+public:
+ QElapsedTimer m_elapsedTimer;
+ QElapsedTimer::ClockType m_clockType;
+
+ Qt3DSElapsedTimer()
+ {
+ m_clockType = QElapsedTimer::clockType();
+ reset();
+ }
+
+ void reset() { m_elapsedTimer.start(); }
+
+ qint64 getNanoSeconds()
+ {
+ qint64 time = m_elapsedTimer.nsecsElapsed();
+ reset();
+ return time;
+ }
+};
+
+///< @brief this class implementes a timer using QElapsedTimer
+class Qt3DSTimer
+{
+public:
+ QElapsedTimer m_timer;
+
+ Qt3DSTimer() { start(); }
+
+ void start() { m_timer.start(); }
+
+ qint64 getNanoSeconds() { return static_cast<qint64>(m_timer.elapsed() * 1000 * 1000); }
+};
+
+///< @brief this class implementes a circular buffer
+template <typename TDataType, unsigned long TBufferSize = 20>
+struct NumericCircularBuffer
+{
+ unsigned long m_TotalNumElements; ///< holds the current number of elements
+ unsigned long m_NumElements; ///< restricts the size to TBufferSize and wrappes around
+ unsigned long m_NextIndex; ///< next index
+ TDataType m_RunningTotal; ///< summed value of all entries
+ TDataType m_Elements[TBufferSize]; ///< element buffer
+
+ NumericCircularBuffer() { clear(); }
+ void clear()
+ {
+ m_TotalNumElements = 0;
+ m_NumElements = 0;
+ m_NextIndex = 0;
+ m_RunningTotal = 0;
+ memset(m_Elements, 0, sizeof(TDataType) * TBufferSize);
+ }
+
+ void push_back(const TDataType &data)
+ {
+ if (m_NumElements < TBufferSize)
+ ++m_NumElements;
+ else
+ m_RunningTotal -= m_Elements[m_NextIndex];
+ m_RunningTotal += data;
+ ++m_TotalNumElements;
+ m_Elements[m_NextIndex] = data;
+ m_NextIndex = (m_NextIndex + 1) % TBufferSize;
+ }
+ unsigned long size() const { return m_NumElements; }
+ TDataType average() const
+ {
+ TDataType mySize = ((TDataType)size());
+ if (mySize)
+ return m_RunningTotal / mySize;
+ return 0;
+ }
+
+ unsigned long getTotalItems() const { return m_TotalNumElements; }
+
+ static unsigned long getBufferSize() { return TBufferSize; }
+};
+
+} // end namspace
+
+#endif // QT3DS_ELAPSED_TIMER_H
diff --git a/src/viewer/qt3dsruntimeglobal.h b/src/viewer/qt3dsruntimeglobal.h
new file mode 100644
index 0000000..6732c85
--- /dev/null
+++ b/src/viewer/qt3dsruntimeglobal.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DSRUNTIMEGLOBAL_H
+#define QT3DSRUNTIMEGLOBAL_H
+
+#include <QtCore/QtGlobal>
+
+#ifndef _INTEGRITYPLATFORM
+#if defined QT3DS_RUNTIME_EXPORTS
+#define QT3DS_RUNTIME_API Q_DECL_EXPORT
+#else
+#define QT3DS_RUNTIME_API Q_DECL_IMPORT
+#endif
+#else
+#define QT3DS_RUNTIME_API
+#endif
+
+#endif // QT3DSRUNTIMEGLOBAL_H
diff --git a/src_dummy/main.cpp b/src_dummy/main.cpp
new file mode 100644
index 0000000..452727a
--- /dev/null
+++ b/src_dummy/main.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \internal This is a dummy main function, used on platforms that
+ are not supported in the CI.
+*/
+int main(int argc, char *argv[])
+{
+ return 0;
+}
diff --git a/src_dummy/src_dummy.pro b/src_dummy/src_dummy.pro
new file mode 100644
index 0000000..f19f3f2
--- /dev/null
+++ b/src_dummy/src_dummy.pro
@@ -0,0 +1,5 @@
+TEMPLATE = app
+CONFIG += console
+
+SOURCES += \
+ main.cpp
diff --git a/sync.profile b/sync.profile
new file mode 100644
index 0000000..090f7a9
--- /dev/null
+++ b/sync.profile
@@ -0,0 +1,10 @@
+%modules = ( # path to module name map
+ "QtStudio3D" => "$basedir/src/api/studio3d",
+);
+%moduleheaders = ( # restrict the module headers to those found in relative path
+);
+%dependencies = (
+ "qtbase" => "",
+ "qtdeclarative" => "",
+ "qtmultimedia" => "",
+);
diff --git a/testres.qrc b/testres.qrc
new file mode 100644
index 0000000..79643b8
--- /dev/null
+++ b/testres.qrc
@@ -0,0 +1,14 @@
+<RCC>
+ <qresource prefix="/">
+ <file alias="aluminium.shader">Content/Material Library/aluminum.shader</file>
+ <file alias="asphalt.shader">Content/Material Library/asphalt.shader</file>
+ <file alias="concrete.shader">Content/Material Library/concrete.shader</file>
+ <file alias="copper.shader">Content/Material Library/copper.shader</file>
+ <file alias="porcelain.shader">Content/Material Library/porcelain.shader</file>
+ <file alias="simple_glass.shader">Content/Material Library/simple_glass.shader</file>
+ <file alias="Desaturate.effect">Content/Effect Library/Desaturate.effect</file>
+ <file alias="Gaussian Blur.effect">Content/Effect Library/Gaussian Blur.effect</file>
+ <file alias="Sepia.effect">Content/Effect Library/Sepia.effect</file>
+ <file alias="Bloom.effect">Content/Effect Library/Bloom.effect</file>
+ </qresource>
+</RCC>
diff --git a/tests/tests.pro b/tests/tests.pro
new file mode 100644
index 0000000..9671085
--- /dev/null
+++ b/tests/tests.pro
@@ -0,0 +1 @@
+TEMPLATE = subdirs
diff --git a/tools/attributehashes/AttributeHashes.cpp b/tools/attributehashes/AttributeHashes.cpp
new file mode 100644
index 0000000..b72b0b0
--- /dev/null
+++ b/tools/attributehashes/AttributeHashes.cpp
@@ -0,0 +1,344 @@
+/****************************************************************************
+**
+** Copyright (C) 1993-2009 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
+
+#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
+#define _WIN32_WINNT \
+ 0x0501 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+//==============================================================================
+// Includes
+//==============================================================================
+#include <stdio.h>
+
+#if defined(_PCPLATFORM) || defined(_TEGRAPLATFORM)
+#include <tchar.h>
+#endif
+
+#include <string.h>
+#include <ctype.h>
+#include <vector>
+#include <fstream>
+#include <string>
+
+#include "Qt3DSConfig.h"
+#include "Qt3DSTypes.h"
+#include "Qt3DSKernelTypes.h"
+#include "Qt3DSHash.h"
+
+//==============================================================================
+// Types
+//==============================================================================
+typedef std::vector<std::string> TStringList;
+
+//==============================================================================
+// Constants
+//==============================================================================
+const char g_Text[] = "Qt3DSAttributeHashes.txt";
+const char g_Include[] = "Qt3DSAttributeHashes.h";
+const char g_Source[] = "Qt3DSAttributeHashes.cpp";
+const char g_TestString[] = "qt.io";
+
+//==============================================================================
+// Globals
+//==============================================================================
+TStringList g_StringList;
+TStringList g_EnumList;
+
+//==============================================================================
+/**
+ * Convert a string to an enum entry and write it out
+ */
+void WriteEnumEntry(FILE *inDestination, const char *inEnum, const char *inString)
+{
+ // Save out the enum
+ if (inEnum) {
+ // Right justify the value by cutting a string of spaces
+ char thePadding[] = " ";
+ int theLength = (int)strlen(inEnum);
+ theLength = theLength > 30 ? 30 : theLength;
+ thePadding[30 - theLength] = '\0';
+
+ // "ATTRIBUTE_NAME = 0x04CECA21, // name"
+ fprintf(inDestination, " %s = %s0x%08X, // %s\n", inEnum, thePadding,
+ Q3DStudio::CHash::HashAttribute(inString), inString);
+ } else
+ fprintf(inDestination, "\n");
+}
+
+//==============================================================================
+/**
+ * Write out the enum section
+ */
+void WriteEnum(FILE *inDestination)
+{
+ // Enum entry
+ fprintf(inDestination, "/// Key for the CElement attribute-value pair\n"
+ "enum EAttribute {\n");
+
+ // Write all enums
+ for (TStringList::size_type theIndex = 0; theIndex < g_EnumList.size(); ++theIndex)
+ if (!g_StringList[theIndex].empty())
+ WriteEnumEntry(inDestination, g_EnumList[theIndex].c_str(),
+ g_StringList[theIndex].c_str());
+
+ // Enum Footer
+ fprintf(inDestination, "}; // enum EAttribute\n"
+ "\n"
+ "#define AK_STRING_QT_IO \"%s\"\n",
+ g_TestString);
+}
+
+//==============================================================================
+/**
+ * Convert strings to enums
+ */
+void ProcessEnums()
+{
+ // Write all enums
+ for (TStringList::iterator theAttribute = g_StringList.begin();
+ theAttribute != g_StringList.end(); ++theAttribute) {
+ std::string theEnum = std::string("ATTRIBUTE_");
+ theEnum += *theAttribute;
+
+ // Replace all '.' with '_'
+ // Make uppercase
+ for (std::string::size_type thePosition = 0; thePosition < theEnum.length();
+ ++thePosition) {
+ if (theEnum[thePosition] == '.')
+ theEnum[thePosition] = '_';
+
+ if (theEnum[thePosition] == '\n' || theEnum[thePosition] == '\r')
+ theEnum[thePosition] = '\0';
+
+ theEnum[thePosition] = static_cast<char>(toupper(theEnum[thePosition]));
+ }
+
+ g_EnumList.push_back(theEnum);
+ }
+}
+
+//==============================================================================
+/**
+ * Write out lookup function section
+ */
+void WriteLookup(FILE *inDestination)
+{
+ // Lookup function entry
+ fprintf(inDestination, "\n"
+ "\n"
+ "/// Function providing reverse hash lookup\n"
+ "const char *GetAttributeString(const EAttribute inAttribute)\n"
+ "{\n"
+ " switch (inAttribute) {\n");
+
+ // Write all enums
+ for (TStringList::size_type theIndex = 0; theIndex < g_EnumList.size(); ++theIndex)
+ if (!g_StringList[theIndex].empty())
+ fprintf(inDestination, " case %s: return \"%s\";\n", g_EnumList[theIndex].c_str(),
+ g_StringList[theIndex].c_str());
+
+ // End function
+ fprintf(inDestination,
+ " default: {\n"
+ " static char s_UnknownHash[16];\n"
+ " sprintf(s_UnknownHash, \"(0x%%08X)\", inAttribute);\n"
+ " return s_UnknownHash;\n"
+ " }\n"
+ " }\n"
+ "}\n");
+}
+
+//==============================================================================
+/**
+ * Single lookup to check new strings
+ */
+int SingleLookup(const char *inString)
+{
+ fprintf(stdout, "String: %s\n", inString);
+ fprintf(stdout, "Hash: 0x%08X\n", Q3DStudio::CHash::HashAttribute(inString));
+ return 0;
+}
+
+//==============================================================================
+/**
+ * Main function.
+ * Open two files, read lines from source and write enum entry to destination.
+ */
+int main(int argc, char *argv[])
+{
+ // Application notice
+ fprintf(
+ stdout,
+ "AttributeHashes\nConverting a string or a file of strings into enums of hashes...\n\n");
+
+ // Checking a single string?
+ if (argc > 1)
+ return SingleLookup(argv[1]);
+
+ // Standard file conversion
+ fprintf(stdout, "Input: %s\n", g_Text);
+ fprintf(stdout, "Output: %s, %s\n\n", g_Include, g_Source);
+
+ // Open source
+ std::ifstream theText(g_Text);
+ if (!theText) {
+ fprintf(stderr, "Failed: Could not input text file, set working directory to "
+ "src\\Runtime\\ogl-runtime\\src\\runtime and try again.\n");
+ return -1;
+ }
+
+ // Add all the strings in text file
+ while (theText) {
+ std::string theLine;
+ theText >> theLine;
+ g_StringList.push_back(theLine);
+ }
+ theText.close();
+
+ // Add unit test string
+ g_StringList.push_back(g_TestString);
+
+ // Process all string to enums
+ ProcessEnums();
+
+ // Open include file
+ FILE *theInclude = NULL;
+ fopen_s(&theInclude, g_Include, "w");
+ if (!theInclude) {
+ fprintf(stderr, "Failed: Could not open output include file\n");
+ return -1;
+ }
+
+ const char* theFileHeader =
+ "/****************************************************************************\n"
+ "**\n"
+ "** Copyright (C) 1993-2009 NVIDIA Corporation.\n"
+ "** Copyright (C) 2019 The Qt Company Ltd.\n"
+ "** Contact: https://www.qt.io/licensing/\n"
+ "**\n"
+ "** This file is part of Qt 3D Studio.\n"
+ "**\n"
+ "** $QT_BEGIN_LICENSE:GPL$\n"
+ "** Commercial License Usage\n"
+ "** Licensees holding valid commercial Qt licenses may use this file in\n"
+ "** accordance with the commercial license agreement provided with the\n"
+ "** Software or, alternatively, in accordance with the terms contained in\n"
+ "** a written agreement between you and The Qt Company. For licensing terms\n"
+ "** and conditions see https://www.qt.io/terms-conditions. For further\n"
+ "** information use the contact form at https://www.qt.io/contact-us.\n"
+ "**\n"
+ "** GNU General Public License Usage\n"
+ "** Alternatively, this file may be used under the terms of the GNU\n"
+ "** General Public License version 3 or (at your option) any later version\n"
+ "** approved by the KDE Free Qt Foundation. The licenses are as published by\n"
+ "** the Free Software Foundation and appearing in the file LICENSE.GPL3\n"
+ "** included in the packaging of this file. Please review the following\n"
+ "** information to ensure the GNU General Public License requirements will\n"
+ "** be met: https://www.gnu.org/licenses/gpl-3.0.html.\n"
+ "**\n"
+ "** $QT_END_LICENSE$\n"
+ "**\n"
+ "****************************************************************************/\n\n";
+
+ // Header
+ fprintf(theInclude, theFileHeader);
+ fprintf(
+ theInclude,
+ "#pragma once\n"
+ "\n"
+ "//==============================================================================\n"
+ "// Namespace\n"
+ "//==============================================================================\n"
+ "namespace Q3DStudio {\n"
+ "\n"
+ "// !!!!! AUTOGENERATED CODE - DO NOT MODIFY MANUALLY !!!!!\n"
+ "\n"
+ "// Run the AttributeHashes project to regenerate this file from Attributehashes.txt list\n"
+ "\n");
+
+ WriteEnum(theInclude);
+
+ // Footer
+ fprintf(theInclude, "\n"
+ "/// Function providing reverse hash lookup\n"
+ "const char *GetAttributeString(const EAttribute inAttribute);\n"
+ "\n"
+ "} // namespace Q3DStudio\n"
+ "\n");
+
+ // Close include
+ fclose(theInclude);
+
+ // Open source file
+ FILE *theSource = NULL;
+ fopen_s(&theSource, g_Source, "w");
+ if (!theSource) {
+ fprintf(stderr, "Failed: Could not open output source file\n");
+ return -1;
+ }
+
+ fprintf(theSource, theFileHeader);
+
+ // Source
+ fprintf(
+ theSource,
+ "#include \"RuntimePrefix.h\"\n"
+ "\n"
+ "//==============================================================================\n"
+ "// Includes\n"
+ "//==============================================================================\n"
+ "#include \"Qt3DSAttributeHashes.h\"\n"
+ "\n"
+ "//==============================================================================\n"
+ "// Namespace\n"
+ "//==============================================================================\n"
+ "namespace Q3DStudio {\n"
+ "\n"
+ "// !!!!! AUTOGENERATED CODE - DO NOT MODIFY MANUALLY !!!!!\n"
+ "\n"
+ "// Run the AttributeHashes project to regenerate this file from Attributehashes.txt list\n"
+ "\n");
+
+ WriteLookup(theSource);
+
+ // Footer
+ fprintf(theSource, "\n"
+ "} // namespace Q3DStudio\n"
+ "\n");
+
+ // Close include
+ fclose(theSource);
+
+ // Completed
+ fprintf(stdout, "Completed converting %d string to hashes.\n", int(g_StringList.size()));
+ return 0;
+}
diff --git a/tools/attributehashes/attributehashes.pro b/tools/attributehashes/attributehashes.pro
new file mode 100644
index 0000000..986084e
--- /dev/null
+++ b/tools/attributehashes/attributehashes.pro
@@ -0,0 +1,16 @@
+TEMPLATE = app
+TARGET = AttributeHashes
+CONFIG += console
+
+win32 {
+LIBS += \
+ -lws2_32
+}
+
+include(../../commoninclude.pri)
+
+SOURCES += AttributeHashes.cpp
+
+load(qt_tool)
+
+INSTALLS -= target
diff --git a/tools/tools.pro b/tools/tools.pro
new file mode 100644
index 0000000..7c62eae
--- /dev/null
+++ b/tools/tools.pro
@@ -0,0 +1,10 @@
+TEMPLATE = subdirs
+CONFIG += ordered
+
+!boot2qt:!integrity:!qnx {
+ SUBDIRS += viewer
+}
+
+win32 {
+ SUBDIRS += attributehashes
+}
diff --git a/tools/viewer/Viewer.qrc b/tools/viewer/Viewer.qrc
new file mode 100644
index 0000000..c808dca
--- /dev/null
+++ b/tools/viewer/Viewer.qrc
@@ -0,0 +1,14 @@
+<RCC>
+ <qresource prefix="/">
+ <file alias="images/arrow.png">resources/images/arrow.png</file>
+ <file alias="images/arrow@2x.png">resources/images/arrow@2x.png</file>
+ <file alias="images/check.png">resources/images/check.png</file>
+ <file alias="images/check@2x.png">resources/images/check@2x.png</file>
+ <file>qml/main.qml</file>
+ <file>qml/StyledMenu.qml</file>
+ <file>qml/StyledMenuButton.qml</file>
+ <file>qml/StyledMenuItem.qml</file>
+ <file>qml/StyledMenuSeparator.qml</file>
+ <file>qml/StyledButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/tools/viewer/android/AndroidManifest.xml b/tools/viewer/android/AndroidManifest.xml
new file mode 100644
index 0000000..3697a9a
--- /dev/null
+++ b/tools/viewer/android/AndroidManifest.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<manifest package="org.qtproject.qt3dviewer" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.1" android:versionCode="1" android:installLocation="auto">
+ <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --" android:icon="@drawable/icon">
+ <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+
+ <!-- Application arguments -->
+ <!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
+ <!-- Application arguments -->
+
+ <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
+ <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
+ <meta-data android:name="android.app.repository" android:value="default"/>
+ <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
+ <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
+ <!-- Deploy Qt libs as part of package -->
+ <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
+ <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
+ <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
+ <!-- Run with local libs -->
+ <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
+ <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
+ <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
+ <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
+ <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
+ <!-- Messages maps -->
+ <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
+ <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
+ <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
+ <!-- Messages maps -->
+
+ <!-- Splash screen -->
+ <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
+ <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
+ <!-- Splash screen -->
+
+ <!-- Background running -->
+ <!-- Warning: changing this value to true may cause unexpected crashes if the
+ application still try to draw after
+ "applicationStateChanged(Qt::ApplicationSuspended)"
+ signal is sent! -->
+ <meta-data android:name="android.app.background_running" android:value="false"/>
+ <!-- Background running -->
+
+ <!-- auto screen scale factor -->
+ <meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
+ <!-- auto screen scale factor -->
+
+ <!-- extract android style -->
+ <!-- available android:values :
+ * full - useful QWidget & Quick Controls 1 apps
+ * minimal - useful for Quick Controls 2 apps, it is much faster than "full"
+ * none - useful for apps that don't use any of the above Qt modules
+ -->
+ <meta-data android:name="android.app.extract_android_style" android:value="full"/>
+ <!-- extract android style -->
+ </activity>
+
+ <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
+
+ </application>
+
+ <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="16"/>
+ <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
+
+ <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
+ Remove the comment if you do not require these default permissions. -->
+ <!-- %%INSERT_PERMISSIONS -->
+
+ <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
+ Remove the comment if you do not require these default features. -->
+ <!-- %%INSERT_FEATURES -->
+
+</manifest>
diff --git a/tools/viewer/main.cpp b/tools/viewer/main.cpp
new file mode 100644
index 0000000..12abd3b
--- /dev/null
+++ b/tools/viewer/main.cpp
@@ -0,0 +1,384 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 - 2016 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "viewer.h"
+
+#include <QtGui/qguiapplication.h>
+#include <QtGui/qtouchdevice.h>
+#include <QtGui/qscreen.h>
+#include <QtCore/qcommandlineparser.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qtimer.h>
+#include <QtGui/qopenglcontext.h>
+#include <QtStudio3D/q3dssurfaceviewer.h>
+#include <QtStudio3D/private/q3dsimagesequencegenerator_p.h>
+#include <QtQml/qqmlapplicationengine.h>
+#include <QtQml/qqmlengine.h>
+#include <QtQml/qqmlcontext.h>
+
+static QSurfaceFormat findIdealGLVersion()
+{
+ QSurfaceFormat fmt;
+ fmt.setProfile(QSurfaceFormat::CoreProfile);
+
+ // Advanced: Try 4.3 core (so we get compute shaders for instance)
+ fmt.setVersion(4, 3);
+ QOpenGLContext ctx;
+ ctx.setFormat(fmt);
+ if (ctx.create() && ctx.format().version() >= qMakePair(4, 3))
+ return fmt;
+
+ // Basic: Stick with 3.3 for now to keep less fortunate,
+ // Mesa-based systems happy
+ fmt.setVersion(3, 3);
+ ctx.setFormat(fmt);
+ if (ctx.create())
+ return fmt;
+
+ // We tried...
+ return QSurfaceFormat::defaultFormat();
+}
+
+static QSurfaceFormat findIdealGLESVersion()
+{
+ QSurfaceFormat fmt;
+
+ // Advanced: Try 3.1 (so we get compute shaders for instance)
+ fmt.setVersion(3, 1);
+ QOpenGLContext ctx;
+ ctx.setFormat(fmt);
+ if (ctx.create())
+ return fmt;
+
+ // Basic: OpenGL ES 3.0 is a hard requirement at the moment since we can
+ // only generate 300 es shaders, uniform buffers are mandatory.
+ fmt.setVersion(3, 0);
+ ctx.setFormat(fmt);
+ if (ctx.create())
+ return fmt;
+
+ // We tried...
+ return QSurfaceFormat::defaultFormat();
+}
+
+int main(int argc, char *argv[])
+{
+#if defined(Q_OS_MACOS)
+ QSurfaceFormat openGLFormat;
+ openGLFormat.setRenderableType(QSurfaceFormat::OpenGL);
+ openGLFormat.setProfile(QSurfaceFormat::CoreProfile);
+ openGLFormat.setMajorVersion(4);
+ openGLFormat.setMinorVersion(1);
+ openGLFormat.setStencilBufferSize(8);
+ QSurfaceFormat::setDefaultFormat(openGLFormat);
+#endif
+
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ QCoreApplication::setOrganizationName("The Qt Company");
+ QCoreApplication::setOrganizationDomain("qt.io");
+ QCoreApplication::setApplicationName("Qt 3D Viewer");
+
+ QGuiApplication a(argc, argv);
+
+#if !defined(Q_OS_MACOS)
+ QSurfaceFormat fmt;
+ if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL)
+ fmt = findIdealGLVersion();
+ else
+ fmt = findIdealGLESVersion();
+ fmt.setDepthBufferSize(24);
+ fmt.setStencilBufferSize(8);
+ QSurfaceFormat::setDefaultFormat(fmt);
+#endif
+
+ QCommandLineParser parser;
+ parser.addHelpOption();
+ parser.addPositionalArgument(
+ "file",
+ QCoreApplication::translate("main", "The presentation file to open."),
+ QCoreApplication::translate("main", "[file]"));
+
+ parser.addOption({"sequence",
+ QCoreApplication::translate("main",
+ "Generates an image sequence.\n"
+ "The file argument must be specified.\n"""
+ "Specifying any of the seq-* arguments\n"
+ "implies setting this option.")});
+ parser.addOption({"seq-start",
+ QCoreApplication::translate("main",
+ "Start time of the sequence in\n"
+ "milliseconds.\n"
+ "The default value is 0."),
+ QCoreApplication::translate("main", "ms"), QString::number(0)});
+ parser.addOption({"seq-end",
+ QCoreApplication::translate("main",
+ "End time of the sequence in\n"
+ "milliseconds.\n"
+ "The default value is 1000."),
+ QCoreApplication::translate("main", "ms"), QString::number(1000)});
+ parser.addOption({"seq-fps",
+ QCoreApplication::translate("main",
+ "Frames per second for the sequence.\n"
+ "The default value is 60."),
+ QCoreApplication::translate("main", "fps"), QString::number(60)});
+ parser.addOption({"seq-interval",
+ QCoreApplication::translate("main",
+ "Time interval between frames in\n"
+ "the sequence in milliseconds. The seq-fps argument is ignored"
+ "if this argument is used."),
+ QCoreApplication::translate("main", "ms"), QString::number(0)});
+ parser.addOption({"seq-width",
+ QCoreApplication::translate("main",
+ "Width of the image sequence.\n"
+ "The default value is 1920."),
+ QCoreApplication::translate("main", "pixels"), QString::number(1920)});
+ parser.addOption({"seq-height",
+ QCoreApplication::translate("main",
+ "Height of the image sequence.\n"
+ "The default value is 1080."),
+ QCoreApplication::translate("main", "pixels"), QString::number(1080)});
+ parser.addOption({"seq-outpath",
+ QCoreApplication::translate("main",
+ "Output path of the image sequence.\n"
+ "The default value is the current directory."),
+ QCoreApplication::translate("main", "path"), QStringLiteral(".")});
+ parser.addOption({"seq-outfile",
+ QCoreApplication::translate("main",
+ "Output filename base for the image\n"
+ "sequence.\n"
+ "The default value is derived from the presentation filename."),
+ QCoreApplication::translate("main", "file"), QStringLiteral("")});
+ parser.addOption({"connect",
+ QCoreApplication::translate("main",
+ "If this parameter is specified, the viewer\n"
+ "is started in connection mode.\n"
+ "The default value is 36000."),
+ QCoreApplication::translate("main", "port"), QString::number(36000)});
+ parser.addOption({"fullscreen",
+ QCoreApplication::translate("main",
+ "Starts the viewer in fullscreen mode.\n")});
+ parser.addOption({"maximized",
+ QCoreApplication::translate("main",
+ "Starts the viewer in maximized mode.")});
+ parser.addOption({"windowgeometry",
+ QCoreApplication::translate("main",
+ "Specifies the initial\n"
+ "window geometry using the X11-syntax.\n"
+ "For example: 1000x800+50+50"),
+ QCoreApplication::translate("main", "geometry"), QStringLiteral("")});
+ parser.addOption({"mattecolor",
+ QCoreApplication::translate("main",
+ "Specifies custom matte color\n"
+ "using #000000 syntax.\n"
+ "For example, white matte: #ffffff"),
+ QCoreApplication::translate("main", "color"), QStringLiteral("#333333")});
+ parser.addOption({"showstats",
+ QCoreApplication::translate("main",
+ "Show render statistics on screen.")});
+ parser.addOption({"scalemode",
+ QCoreApplication::translate("main",
+ "Specifies scaling mode.\n"
+ "The default value is 'center'."),
+ QCoreApplication::translate("main", "center|fit|fill"),
+ QStringLiteral("center")});
+ QCommandLineOption variantListOption({QStringLiteral("v"),
+ QStringLiteral("variants")},
+ QObject::tr("Gives list of variant groups and variants\n"
+ "to be loaded from the presentation.\n"
+ "For example VarGroupA:var1,VarGroupB:var4"),
+ QStringLiteral("variants"));
+ parser.addOption(variantListOption);
+
+ parser.process(a);
+
+ const QStringList files = parser.positionalArguments();
+ if (files.count() > 1) {
+ qWarning() << "Only one presentation file can be given.";
+ parser.showHelp(-1);
+ }
+
+ bool generateSequence = parser.isSet("sequence") || parser.isSet("seq-start")
+ || parser.isSet("seq-end") || parser.isSet("seq-fps")
+ || parser.isSet("seq-interval") || parser.isSet("seq-width")
+ || parser.isSet("seq-height") || parser.isSet("seq-outpath")
+ || parser.isSet("seq-outfile");
+
+ QStringList variantList;
+ if (parser.isSet(variantListOption)) {
+ QString variantOption = parser.value(variantListOption);
+ variantList = variantOption.split(QLatin1Char(','),
+ QString::SkipEmptyParts);
+ }
+
+#ifndef Q_OS_ANDROID
+ Q3DSImageSequenceGenerator *generator = nullptr;
+#endif
+ Viewer viewer(generateSequence);
+
+ // Figure out control size multiplier for devices using touch screens to ensure all controls
+ // have minimum usable size.
+ qreal sizeMultiplier = 1.0;
+ const auto touchDevices = QTouchDevice::devices();
+ if (touchDevices.size() > 0) {
+ // Find out the actual screen logical pixel size. Typically touch devices we care about
+ // only have a single screen, so we just check primary screen.
+ const auto screens = QGuiApplication::screens();
+ if (screens.size() > 0) {
+ QScreen *screen = screens.at(0);
+ qreal dpi = screen->physicalDotsPerInch() / screen->devicePixelRatio();
+ sizeMultiplier = dpi / 40.0; // divider chosen empirically
+ }
+ }
+
+ QQmlApplicationEngine engine;
+ // Set import paths so that standalone installation works
+ QString extraImportPath1(QStringLiteral("%1/qml"));
+ engine.addImportPath(extraImportPath1.arg(QGuiApplication::applicationDirPath()));
+#ifdef Q_OS_MACOS
+ QString extraImportPath2(QStringLiteral("%1/../../../../qml"));
+ engine.addImportPath(extraImportPath2.arg(QGuiApplication::applicationDirPath()));
+#endif
+
+ QQmlContext *ctx = engine.rootContext();
+ ctx->setContextProperty(QStringLiteral("_menuBackgroundColor"), QColor("#404244"));
+ ctx->setContextProperty(QStringLiteral("_menuSelectionColor"), QColor("#46a2da"));
+ ctx->setContextProperty(QStringLiteral("_menuBorderColor"), QColor("#727476"));
+ ctx->setContextProperty(QStringLiteral("_dialogBorderColor"), QColor("#404244"));
+ ctx->setContextProperty(QStringLiteral("_dialogBackgroundColor"), QColor("#2e2f30"));
+ ctx->setContextProperty(QStringLiteral("_dialogFieldColor"), QColor("#404244"));
+ ctx->setContextProperty(QStringLiteral("_dialogFieldBorderColor"), QColor("#262829"));
+ ctx->setContextProperty(QStringLiteral("_textColor"), QColor("#ffffff"));
+ ctx->setContextProperty(QStringLiteral("_disabledColor"), QColor("#727476"));
+ ctx->setContextProperty(QStringLiteral("_fontSize"), int(12 * sizeMultiplier));
+ ctx->setContextProperty(QStringLiteral("_controlBaseHeight"), int(24 * sizeMultiplier));
+ ctx->setContextProperty(QStringLiteral("_controlBaseWidth"), int(80 * sizeMultiplier));
+ ctx->setContextProperty(QStringLiteral("_controlPadding"), int(12 * sizeMultiplier));
+ ctx->setContextProperty(QStringLiteral("_viewerHelper"), &viewer);
+ qmlRegisterUncreatableType<Viewer>(
+ "Qt3DStudioViewer", 1, 0, "ViewerHelper",
+ QCoreApplication::translate("main",
+ "Creation of ViewerHelper not allowed from QML"));
+ engine.load(QUrl(QLatin1String("qrc:/qml/main.qml")));
+ Q_ASSERT(engine.rootObjects().size() > 0);
+ QWindow *appWindow = qobject_cast<QWindow *>(engine.rootObjects().at(0));
+ Q_ASSERT(appWindow);
+ viewer.setQmlRootObject(appWindow);
+
+ if (parser.isSet(QStringLiteral("windowgeometry"))) {
+ int width = 1280;
+ int height = 768;
+ int x = 50;
+ int y = 50;
+ QString geometryStr = parser.value(QStringLiteral("windowgeometry"));
+ const QStringList splitPlus = geometryStr.split(QLatin1Char('+'));
+ if (splitPlus.size() > 0) {
+ const QStringList splitX = splitPlus[0].split(QLatin1Char('x'));
+ if (splitX.size() >= 2) {
+ width = splitX[0].toInt();
+ height = splitX[1].toInt();
+ }
+ if (splitPlus.size() >= 3) {
+ x = splitPlus[1].toInt();
+ y = splitPlus[2].toInt();
+ }
+ }
+ appWindow->setGeometry(x, y, width, height);
+ }
+ if (parser.isSet(QStringLiteral("fullscreen")))
+ appWindow->setVisibility(QWindow::FullScreen);
+ else if (parser.isSet(QStringLiteral("maximized")))
+ appWindow->setVisibility(QWindow::Maximized);
+
+ if (parser.isSet(QStringLiteral("mattecolor"))) {
+ QColor matteColor(parser.value("mattecolor"));
+ if (matteColor != Qt::black) {
+ appWindow->setProperty("showMatteColor", QVariant::fromValue<QColor>(matteColor));
+ appWindow->setProperty("matteColor", QVariant::fromValue<QColor>(matteColor));
+ }
+ }
+ if (parser.isSet(QStringLiteral("showstats")))
+ appWindow->setProperty("showRenderStats", true);
+ if (parser.isSet(QStringLiteral("scalemode"))) {
+ QString scaleStr(parser.value("scalemode"));
+ if (scaleStr == QStringLiteral("fit"))
+ appWindow->setProperty("scaleMode", Q3DSViewerSettings::ScaleModeFit);
+ else if (scaleStr == QStringLiteral("fill"))
+ appWindow->setProperty("scaleMode", Q3DSViewerSettings::ScaleModeFill);
+ else
+ appWindow->setProperty("scaleMode", Q3DSViewerSettings::ScaleModeCenter);
+ }
+
+ viewer.setVariantList(variantList);
+
+#ifndef Q_OS_ANDROID
+ if (generateSequence) {
+ if (files.count() != 1) {
+ qWarning() << "Presentation file is required for generating an image sequence.";
+ parser.showHelp(-1);
+ }
+ generator = new Q3DSImageSequenceGenerator;
+ QObject::connect(generator, &Q3DSImageSequenceGenerator::progress,
+ &viewer, &Viewer::generatorProgress);
+ QObject::connect(generator, &Q3DSImageSequenceGenerator::finished,
+ &viewer, &Viewer::generatorFinished);
+ viewer.setGeneratorDetails(files.first());
+ generator->generateImageSequence(
+ files.first(),
+ parser.value("seq-start").toDouble(),
+ parser.value("seq-end").toDouble(),
+ parser.value("seq-fps").toDouble(),
+ parser.value("seq-interval").toDouble(),
+ parser.value("seq-width").toInt(),
+ parser.value("seq-height").toInt(),
+ parser.value("seq-outpath"),
+ parser.value("seq-outfile"));
+ } else
+#endif
+ if (!files.isEmpty()) {
+ // Load the presentation after window has been exposed to give QtQuick time to construct
+ // the application window properly
+ QTimer *exposeTimer = new QTimer(appWindow);
+ QObject::connect(exposeTimer, &QTimer::timeout, [&](){
+ if (appWindow->isExposed()) {
+ exposeTimer->stop();
+ exposeTimer->deleteLater();
+ viewer.loadFile(files.first());
+ }
+ });
+ exposeTimer->start(0);
+ } else {
+ viewer.setContentView(Viewer::ConnectView);
+ if (parser.isSet(QStringLiteral("connect")))
+ viewer.setConnectPort(parser.value(QStringLiteral("connect")).toInt());
+ viewer.connectRemote();
+ }
+
+ return a.exec();
+}
diff --git a/tools/viewer/qml/StyledButton.qml b/tools/viewer/qml/StyledButton.qml
new file mode 100644
index 0000000..400179d
--- /dev/null
+++ b/tools/viewer/qml/StyledButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2
+
+Button {
+ id: control
+ implicitWidth: _controlBaseWidth
+ implicitHeight: _controlBaseHeight
+
+ contentItem: Text {
+ width: _controlBaseWidth
+ text: control.text
+ height: _controlBaseHeight
+ font.pixelSize: _fontSize
+ color: _textColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ }
+ background: Rectangle {
+ color: control.down ? _menuSelectionColor : _dialogFieldColor
+ border.color: _dialogFieldBorderColor
+ radius: 2
+ }
+}
diff --git a/tools/viewer/qml/StyledMenu.qml b/tools/viewer/qml/StyledMenu.qml
new file mode 100644
index 0000000..6275dbc
--- /dev/null
+++ b/tools/viewer/qml/StyledMenu.qml
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2
+
+Menu {
+ id: control
+
+ property alias hovered: menuArea.containsMouse
+
+ width: contentItem.width + leftPadding + rightPadding
+ height: contentItem.height + topPadding + bottomPadding
+ padding: 1 // For background border
+ x: 0
+ y: parent.height
+ closePolicy: Popup.CloseOnPressOutsideParent | Popup.CloseOnEscape
+
+ contentItem: MouseArea {
+ id: menuArea
+ hoverEnabled: true
+ height: list.height
+ width: list.width
+ ListView {
+ id: list
+ boundsBehavior: Flickable.StopAtBounds
+ clip: true
+ model: control.contentModel
+ currentIndex: control.currentIndex
+ highlightRangeMode: ListView.ApplyRange
+ highlightMoveDuration: 0
+ Component.onCompleted: {
+ var maxItemWidth = 0;
+ var maxShortcutWidth = 0;
+ var totalHeight = 0
+ var extraWidth = 0
+ var i;
+ for (i = control.contentData.length - 1; i >= 0; --i) {
+ if (control.contentData[i].itemWidth !== undefined) {
+ maxItemWidth = Math.max(maxItemWidth, control.contentData[i].itemWidth);
+ maxShortcutWidth = Math.max(maxShortcutWidth,
+ control.contentData[i].shortcutWidth);
+ }
+ totalHeight += control.contentData[i].height
+ }
+ maxItemWidth += _controlPadding // minimum item spacer
+ for (i = control.contentData.length - 1; i >= 0; --i) {
+ if (control.contentData[i].itemSpacerWidth !== undefined) {
+ control.contentData[i].itemSpacerWidth
+ = maxItemWidth - control.contentData[i].itemWidth;
+ control.contentData[i].shortcutSpacerWidth
+ = maxShortcutWidth - control.contentData[i].shortcutWidth;
+ }
+ }
+ width = maxItemWidth + maxShortcutWidth + extraWidth
+ + control.contentData[0].leftPadding + control.contentData[0].rightPadding
+ + control.contentData[0].arrowWidth + control.contentData[0].checkMarkWidth;
+ height = totalHeight
+ }
+ }
+ }
+
+ background: Rectangle {
+ width: control.width
+ height: control.height
+ color: _menuBackgroundColor
+ border.color: _menuBorderColor
+ }
+}
diff --git a/tools/viewer/qml/StyledMenuButton.qml b/tools/viewer/qml/StyledMenuButton.qml
new file mode 100644
index 0000000..b5290c3
--- /dev/null
+++ b/tools/viewer/qml/StyledMenuButton.qml
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2
+
+Button {
+ id: control
+
+ property Menu menu: null
+ property ApplicationWindow window: null
+
+ onPressed: {
+ if (menu.visible)
+ menu.close();
+ else
+ menu.open();
+ }
+
+ onHoveredChanged: {
+ if (hovered && window.menuOpen) {
+ window.closeMenus();
+ menu.open();
+ }
+ }
+
+ hoverEnabled: true
+ width: contentItem.contentWidth + leftPadding + rightPadding
+ leftPadding: _controlPadding
+ rightPadding: _controlPadding
+ height: _controlBaseHeight
+ contentItem: Text {
+ text: control.text
+ font.pixelSize: _fontSize
+ opacity: enabled ? 1.0 : 0.3
+ color: _textColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ }
+ background: Rectangle {
+ opacity: enabled ? 1 : 0.3
+ color: control.down || control.hovered
+ ? _menuSelectionColor : _menuBackgroundColor
+ }
+}
diff --git a/tools/viewer/qml/StyledMenuItem.qml b/tools/viewer/qml/StyledMenuItem.qml
new file mode 100644
index 0000000..79049a9
--- /dev/null
+++ b/tools/viewer/qml/StyledMenuItem.qml
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2
+
+MenuItem {
+ id: control
+
+ property alias shortcut: shortcut.sequence
+ property string shortcutText
+ property alias itemSpacerWidth: itemSpacer.width
+ property alias shortcutSpacerWidth: shortcutSpacer.width
+ property alias itemWidth: itemLabel.width
+ property alias shortcutWidth: shortcutLabel.width
+ property bool showArrow: false
+ property int arrowWidth: arrow.width
+ property int checkMarkWidth: checkMark.width
+ property bool showCheckMark: false
+ property Menu arrowMenu: null
+
+ hoverEnabled: true
+ width: contentItem.width + leftPadding + rightPadding
+ height: contentItem.height + topPadding + bottomPadding
+ padding: 0
+ leftPadding: 0
+ rightPadding: 0
+
+ MouseArea {
+ anchors.fill: parent
+ onPressed: {
+ if (showArrow) {
+ if (!arrowMenu.visible) {
+ arrowMenuDelay.stop();
+ arrowMenu.open();
+ }
+ } else {
+ mouse.accepted = false;
+ }
+ }
+ }
+
+ onHoveredChanged: {
+ if (showArrow)
+ arrowMenuDelay.start();
+ }
+
+ Timer {
+ id: arrowMenuDelay
+ interval: 500
+ repeat: false
+ onTriggered: {
+ if (arrowMenu.visible) {
+ if (!control.hovered && !arrowMenu.hovered)
+ arrowMenu.close();
+ } else {
+ if (control.hovered)
+ arrowMenu.open();
+ }
+ }
+ }
+
+ Shortcut {
+ id: shortcut
+ context: Qt.ApplicationShortcut
+ onActivated: control.triggered()
+ }
+
+ contentItem: Row {
+ width: checkMark.width + itemLabel.width + itemSpacer.width
+ + shortcutLabel.width + shortcutSpacer.width + arrow.width
+ height: _controlBaseHeight
+ Item {
+ id: checkMark
+ width: 16
+ height: _controlBaseHeight
+ Image {
+ anchors.fill: parent
+ visible: control.showCheckMark
+ fillMode: Image.Pad
+ source: "qrc:/images/check.png"
+ }
+ }
+ Label {
+ id: itemLabel
+ text: control.text
+ font.pixelSize: _fontSize
+ horizontalAlignment: Text.AlignLeft
+ color: control.enabled ? _textColor : _disabledColor
+ verticalAlignment: Text.AlignVCenter
+ clip: true
+ width: contentWidth
+ height: _controlBaseHeight
+ }
+ Item {
+ id: itemSpacer
+ width: _controlPadding
+ height: _controlBaseHeight
+ }
+ Label {
+ id: shortcutLabel
+ text: shortcut.nativeText === "" ? control.shortcutText : shortcut.nativeText
+ font.pixelSize: _fontSize
+ horizontalAlignment: Text.AlignLeft
+ color: control.enabled ? _textColor : _disabledColor
+ verticalAlignment: Text.AlignVCenter
+ clip: true
+ width: contentWidth
+ height: _controlBaseHeight
+ }
+ Item {
+ id: shortcutSpacer
+ width: 0
+ height: _controlBaseHeight
+ }
+ Item {
+ id: arrow
+ width: 16
+ height: _controlBaseHeight
+ Image {
+ anchors.fill: parent
+ visible: control.showArrow
+ fillMode: Image.Pad
+ source: "qrc:/images/arrow.png"
+ }
+ }
+ }
+ background: Rectangle {
+ width: control.width
+ height: control.height
+ color: control.hovered ? _menuSelectionColor : _menuBackgroundColor
+ }
+}
diff --git a/tools/viewer/qml/StyledMenuSeparator.qml b/tools/viewer/qml/StyledMenuSeparator.qml
new file mode 100644
index 0000000..344d667
--- /dev/null
+++ b/tools/viewer/qml/StyledMenuSeparator.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2
+
+MenuSeparator {
+ id: control
+ padding: 0
+ topPadding: 0
+ bottomPadding: 0
+ leftPadding: 0
+ rightPadding: 0
+ width: parent.width
+ height: 1
+ contentItem: Rectangle {
+ width: control.width - control.leftPadding - control.rightPadding
+ height: 1
+ color: _menuBorderColor
+ }
+}
diff --git a/tools/viewer/qml/main.qml b/tools/viewer/qml/main.qml
new file mode 100644
index 0000000..1357f39
--- /dev/null
+++ b/tools/viewer/qml/main.qml
@@ -0,0 +1,594 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2
+import QtQuick.Dialogs 1.2
+import Qt3DStudioViewer 1.0
+import QtStudio3D.OpenGL 2.4
+import QtQuick.Window 2.2
+
+ApplicationWindow {
+ id: window
+ width: 1280
+ height: 768
+ visible: true
+ title: qsTr("Qt 3D Studio Viewer")
+
+ property bool menuOpen: fileMenu.visible || viewMenu.visible
+ property Item loadedContent: contentLoader ? contentLoader.item : null
+ property string error
+ property int previousVisibility
+
+ property color showMatteColor: Qt.rgba(0.2, 0.2, 0.2, 1)
+ property color hideMatteColor: Qt.rgba(0, 0, 0, 1)
+ property color matteColor: hideMatteColor
+ property bool showRenderStats: false
+ property int scaleMode: ViewerSettings.ScaleModeCenter
+
+ function closeMenus() {
+ fileMenu.close();
+ scaleMenu.close();
+ viewMenu.close();
+ }
+
+ Component.onCompleted: {
+ _viewerHelper.restoreWindowState(window);
+ previousVisibility = visibility;
+ }
+
+ onClosing: {
+ _viewerHelper.storeWindowState(window);
+ }
+
+ Timer {
+ id: infoTimer
+ repeat: false
+ interval: 5000
+
+ onTriggered: {
+ infoOverlay.visible = false;
+ }
+ }
+
+ Rectangle {
+ id: infoOverlay
+ visible: false
+ color: "black"
+ border.color: _dialogBorderColor
+ x: parent.width * 0.2
+ y: parent.height * 0.4
+ width: parent.width * 0.6
+ height: parent.height * 0.2
+ z: 20
+ Label {
+ id: infoLabel
+ anchors.fill: parent
+ color: _textColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font.pixelSize: window.width / 40
+ }
+ }
+
+ Connections {
+ target: _viewerHelper
+ onShowInfoOverlay: {
+ // Show a brief info overlay
+ infoLabel.text = infoStr;
+ infoOverlay.visible = true;
+ infoTimer.restart();
+ }
+ }
+
+ MouseArea {
+ property int swipeStart: 0
+
+ anchors.fill: parent
+ z: 10
+ enabled: !ipEntry.visible
+
+ onPressed: {
+ if (window.visibility === Window.FullScreen)
+ swipeStart = mouse.y;
+ _viewerHelper.handleMousePress(mouse.x, mouse.y, mouse.button, mouse.buttons,
+ mouse.modifiers);
+ mouse.accepted = true;
+ }
+ onReleased: {
+ _viewerHelper.handleMouseRelease(mouse.x, mouse.y, mouse.button, mouse.buttons,
+ mouse.modifiers);
+ mouse.accepted = true;
+ }
+ onPositionChanged: {
+ // Swipe down to exit fullscreen mode
+ if (window.visibility === Window.FullScreen && mouse.y > swipeStart + (height / 8)) {
+ window.visibility = window.previousVisibility;
+ } else {
+ _viewerHelper.handleMouseMove(mouse.x, mouse.y, mouse.button, mouse.buttons,
+ mouse.modifiers);
+ }
+ }
+ }
+
+ DropArea {
+ anchors.fill: parent
+ onEntered: {
+ if (drag.hasUrls) {
+ var filename = _viewerHelper.convertUrlListToFilename(drag.urls);
+ if (filename === "")
+ drag.accepted = false;
+ }
+ }
+ onDropped: {
+ if (drop.hasUrls) {
+ var filename = _viewerHelper.convertUrlListToFilename(drop.urls);
+ if (filename === "")
+ drag.accepted = false;
+ else
+ _viewerHelper.loadFile(filename);
+ }
+ }
+ }
+
+ Loader {
+ id: contentLoader
+ anchors.fill: parent
+ sourceComponent: {
+ switch (_viewerHelper.contentView) {
+ case ViewerHelper.StudioView:
+ return studioContent;
+ case ViewerHelper.ConnectView:
+ return connectContent;
+ case ViewerHelper.SequenceView:
+ return sequenceContent;
+ default:
+ return emptyContent;
+ }
+ }
+ Timer {
+ id: asyncContentChanger
+ repeat: false
+ interval: 0
+ property int view: ViewerHelper.DefaultView
+ function changeView(newView) {
+ view = newView;
+ start();
+ }
+
+ onTriggered: {
+ _viewerHelper.contentView = view;
+ }
+ }
+ }
+
+ Component {
+ id: emptyContent
+ Rectangle {
+ color: "black"
+ Label {
+ anchors.fill: parent
+ text: window.error
+ color: _textColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font.pixelSize: width / 80
+ }
+ }
+ }
+
+ Component {
+ id: studioContent
+ Studio3D {
+ id: studio3D
+
+ property alias hiderVisible: hider.visible
+
+ focus: true
+ ViewerSettings {
+ matteColor: window.matteColor
+ showRenderStats: window.showRenderStats
+ scaleMode: window.scaleMode
+ }
+
+ // Hider item keeps the Studio3D hidden until it starts running and we reset the
+ // animation time to the start
+ Rectangle {
+ id: hider
+ color: "black"
+ anchors.fill: parent
+ }
+
+ Timer {
+ id: revealTimer
+ repeat: false
+ interval: 0
+ onTriggered: {
+ hider.visible = false;
+ }
+ }
+
+ onRunningChanged: {
+ if (running) {
+ // Successfully opened a presentation, update the open folder
+ _viewerHelper.openFolder = presentation.source.toString();
+ // Force the animation to start from the beginning, as the first frame render
+ // can take some time as shaders are compiled on-demand
+ // Localization note: "Scene" needs to be the same as the default "Scene"
+ // element name generated in the Studio application.
+ presentation.goToTime(qsTr("Scene"), 0);
+ revealTimer.start();
+ }
+ }
+ onErrorChanged: {
+ if (error.length > 0) {
+ window.error = error;
+ asyncContentChanger.changeView(ViewerHelper.DefaultView);
+ }
+ }
+ }
+ }
+
+ Component {
+ id: connectContent
+ Rectangle {
+ color: "black"
+ Label {
+ anchors.fill: parent
+ text: _viewerHelper.connectText
+ color: _textColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font.pixelSize: width / 40
+ }
+ }
+ }
+
+ Component {
+ id: sequenceContent
+ Rectangle {
+ property alias mainText: mainLabel.text
+ property alias detailsText: detailsLabel.text
+ color: "black"
+ Item {
+ anchors.fill: parent
+ Label {
+ id: mainLabel
+ color: _textColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignBottom
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottomMargin: _controlPadding
+ height: parent.height / 2
+ font.pixelSize: width / 40
+ text: qsTr("Image sequence generation initializing...")
+ }
+ Label {
+ id: detailsLabel
+ color: _textColor
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignTop
+ anchors.top: mainLabel.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.topMargin: _controlPadding
+ height: parent.height / 2
+ font.pixelSize: width / 50
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ id: ipEntry
+ visible: false
+ color: _dialogBackgroundColor
+ border.color: _dialogBorderColor
+ y: (parent.height - height) / 2
+ x: (parent.width - width) / 2
+ z: 100
+ width: connectionEntry.width + (2 * _controlPadding)
+ height: connectionEntry.height + (2 * _controlPadding)
+
+ onVisibleChanged: {
+ if (visible) {
+ connectText.forceActiveFocus();
+ connectText.selectAll();
+ }
+ }
+
+ Grid {
+ id: connectionEntry
+ spacing: _controlPadding
+ columns: 2
+ y: _controlPadding
+ x: _controlPadding
+ Label {
+ id: ipEntryLabel
+ width: _controlBaseWidth
+ height: _controlBaseHeight
+ text: qsTr("Enter IP port:")
+ color: _textColor
+ font.pixelSize: _fontSize
+ verticalAlignment: Text.AlignVCenter
+ padding: _controlPadding / 2
+ }
+ TextField {
+ id: connectText
+ width: _controlBaseWidth
+ height: _controlBaseHeight
+ font.pixelSize: _fontSize
+ color: _textColor
+ selectByMouse: true
+ padding: _controlPadding / 6
+ enabled: ipEntry.visible
+ text: _viewerHelper.connectPort
+ validator: IntValidator {
+ bottom: 1
+ top: 65535
+ }
+
+ onAccepted: {
+ if (ipEntry.visible) {
+ _viewerHelper.contentView = ViewerHelper.ConnectView;
+ _viewerHelper.connectPort = Number(text);
+ _viewerHelper.connectRemote();
+ ipEntry.visible = false;
+ infoOverlay.visible = false;
+ }
+ }
+
+ background: Rectangle {
+ id: textBackground
+ color: _dialogFieldColor
+ border.width: 1
+ border.color: _dialogFieldBorderColor
+ radius: 2
+ }
+ }
+ StyledButton {
+ id: connectButton
+ width: _controlBaseWidth
+ text: qsTr("Connect")
+ onClicked: {
+ _viewerHelper.contentView = ViewerHelper.ConnectView;
+ _viewerHelper.connectPort = Number(connectText.text);
+ _viewerHelper.connectRemote();
+ ipEntry.visible = false;
+ infoOverlay.visible = false;
+ }
+ }
+ StyledButton {
+ id: cancelButton
+ width: _controlBaseWidth
+ text: qsTr("Cancel")
+ onClicked: {
+ ipEntry.visible = false;
+ }
+ }
+ }
+ }
+
+ Component {
+ id: fileDialogComponent
+ FileDialog {
+ id: fileDialog
+ title: qsTr("Choose Presentation or Project")
+ folder: _viewerHelper.openFolder
+ nameFilters: [qsTr("All supported formats (*.uip *.uia)"),
+ qsTr("Studio UI Presentation (*.uip)"),
+ qsTr("Application file (*.uia)")]
+ onAccepted: {
+ _viewerHelper.contentView = ViewerHelper.StudioView;
+ contentLoader.item.presentation.setSource(fileUrls[0]);
+ }
+ }
+ }
+
+ header: Rectangle {
+ height: _controlBaseHeight
+ color: _menuBackgroundColor
+ visible: window.visibility !== Window.FullScreen
+
+ Row {
+ anchors.fill: parent
+ StyledMenuButton {
+ id: fileButton
+ text: qsTr("File")
+ menu: fileMenu
+ window: window
+
+ StyledMenu {
+ id: fileMenu
+ StyledMenuItem {
+ text: qsTr("Open...")
+ shortcut: StandardKey.Open
+ enabled: _viewerHelper.contentView !== ViewerHelper.SequenceView
+ onTriggered: {
+ if (enabled) {
+ fileDialogLoader.sourceComponent = fileDialogComponent;
+ fileDialogLoader.item.open();
+ }
+ }
+ Loader {
+ id: fileDialogLoader
+ sourceComponent: Item {}
+ }
+ }
+ StyledMenuItem {
+ text: _viewerHelper.connected ? qsTr("Disconnect") : qsTr("Connect...")
+ shortcut: "F9"
+ enabled: _viewerHelper.contentView !== ViewerHelper.SequenceView
+ onTriggered: {
+ if (enabled) {
+ if (_viewerHelper.connected)
+ _viewerHelper.disconnectRemote();
+ else
+ ipEntry.visible = !ipEntry.visible;
+ }
+ }
+ }
+ StyledMenuItem {
+ text: qsTr("Reload")
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ shortcut: "F5"
+ onTriggered: {
+ if (enabled) {
+ contentLoader.item.hiderVisible = true;
+ contentLoader.item.reset();
+ }
+ }
+ }
+ StyledMenuSeparator {}
+ StyledMenuItem {
+ text: qsTr("Quit")
+ shortcut: "Ctrl+Q"
+ onTriggered: {
+ window.close();
+ }
+ }
+ }
+ }
+ StyledMenuButton {
+ id: viewButton
+ text: qsTr("View")
+ menu: viewMenu
+ window: window
+
+ StyledMenu {
+ id: viewMenu
+ StyledMenuItem {
+ text: qsTr("Show Matte")
+ shortcut: "Ctrl+D"
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.matteColor !== window.hideMatteColor
+ onTriggered: {
+ if (enabled) {
+ if (window.matteColor === window.hideMatteColor)
+ window.matteColor = window.showMatteColor;
+ else
+ window.matteColor = window.hideMatteColor;
+ }
+ }
+ }
+ StyledMenuItem {
+ id: scaleMenuItem
+ text: qsTr("Scale Mode")
+ showArrow: true
+ arrowMenu: scaleMenu
+ shortcut: "Ctrl+Shift+S"
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ onTriggered: {
+ if (enabled) {
+ scaleMenu.close();
+ if (window.scaleMode === ViewerSettings.ScaleModeCenter)
+ window.scaleMode = ViewerSettings.ScaleModeFit;
+ else if (window.scaleMode === ViewerSettings.ScaleModeFit)
+ window.scaleMode = ViewerSettings.ScaleModeFill;
+ else if (window.scaleMode === ViewerSettings.ScaleModeFill)
+ window.scaleMode = ViewerSettings.ScaleModeCenter;
+ }
+ }
+
+ StyledMenu {
+ id: scaleMenu
+ x: parent.width
+ y: 0
+
+ StyledMenuItem {
+ id: scaleCenter
+ text: qsTr("Center")
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.scaleMode === ViewerSettings.ScaleModeCenter
+ onTriggered: {
+ if (enabled)
+ window.scaleMode = ViewerSettings.ScaleModeCenter;
+ }
+ }
+ StyledMenuItem {
+ id: scaleFit
+ text: qsTr("Scale to Fit")
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.scaleMode === ViewerSettings.ScaleModeFit
+ onTriggered: {
+ if (enabled)
+ window.scaleMode = ViewerSettings.ScaleModeFit;
+ }
+ }
+ StyledMenuItem {
+ id: scaleFill
+ text: qsTr("Scale to Fill")
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.scaleMode === ViewerSettings.ScaleModeFill
+ onTriggered: {
+ if (enabled)
+ window.scaleMode = ViewerSettings.ScaleModeFill;
+ }
+ }
+ }
+ }
+ StyledMenuItem {
+ text: qsTr("Show Render Statistics")
+ shortcut: "F7"
+ enabled: _viewerHelper.contentView === ViewerHelper.StudioView
+ showCheckMark: window.showRenderStats
+ onTriggered: {
+ if (enabled)
+ window.showRenderStats = !window.showRenderStats;
+ }
+ }
+ StyledMenuSeparator {}
+ StyledMenuItem {
+ text: qsTr("Full Screen")
+ shortcut: "F11"
+ Shortcut {
+ sequence: "ESC"
+ context: Qt.ApplicationShortcut
+ enabled: window.visibility === Window.FullScreen
+ onActivated: {
+ window.visibility = window.previousVisibility;
+ }
+ }
+
+ onTriggered: {
+ if (window.visibility !== Window.FullScreen) {
+ window.previousVisibility = window.visibility
+ window.visibility = Window.FullScreen;
+ } else {
+ window.visibility = window.previousVisibility;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tools/viewer/remotedeploymentreceiver.cpp b/tools/viewer/remotedeploymentreceiver.cpp
new file mode 100644
index 0000000..cdfa5b0
--- /dev/null
+++ b/tools/viewer/remotedeploymentreceiver.cpp
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "remotedeploymentreceiver.h"
+#include "viewer.h"
+
+#include <QtNetwork>
+
+RemoteDeploymentReceiver::RemoteDeploymentReceiver(int serverPort, QObject *parent)
+ : QObject(parent)
+ , m_tcpServer(0)
+ , m_connection(0)
+ , m_temporaryDir(0)
+ , m_serverPort(serverPort)
+ , m_projectDeployed(false)
+{
+ m_incoming.setVersion(QDataStream::Qt_5_8);
+}
+
+RemoteDeploymentReceiver::~RemoteDeploymentReceiver()
+{
+ delete m_temporaryDir;
+ m_temporaryDir = 0;
+}
+
+void RemoteDeploymentReceiver::setPort(int value)
+{
+ m_serverPort = value;
+}
+
+QString RemoteDeploymentReceiver::startServer()
+{
+ if (m_tcpServer)
+ return QString();
+
+ m_tcpServer = new QTcpServer(this);
+ if (!m_tcpServer->listen(QHostAddress::Any, m_serverPort)) {
+ QString error = tr("Can't start the remote connection: '%1'")
+ .arg(m_tcpServer->errorString());
+ delete m_tcpServer;
+ m_tcpServer = 0;
+ return error;
+ }
+
+ QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
+ // use the first non-localhost IPv4 address
+ for (int i = 0; i < ipAddressesList.size(); ++i) {
+ if (ipAddressesList.at(i) != QHostAddress::LocalHost
+ && ipAddressesList.at(i).toIPv4Address()) {
+ m_hostAddress = ipAddressesList.at(i);
+ break;
+ }
+ }
+
+ // if we did not find one, use IPv4 localhost
+ if (m_hostAddress.isNull())
+ m_hostAddress = QHostAddress(QHostAddress::LocalHost);
+
+ m_serverPort = m_tcpServer->serverPort();
+ connect(m_tcpServer, SIGNAL(newConnection()),
+ this, SLOT(acceptRemoteConnection()));
+ return QString();
+}
+
+void RemoteDeploymentReceiver::disconnectRemote()
+{
+ if (m_connection)
+ m_connection->disconnectFromHost();
+}
+
+void RemoteDeploymentReceiver::acceptRemoteConnection()
+{
+ Q_ASSERT(m_tcpServer);
+ Q_ASSERT(!m_connection);
+ m_connection = m_tcpServer->nextPendingConnection();
+ Q_ASSERT(m_connection);
+
+ m_incoming.setDevice(m_connection);
+
+ connect(m_connection, &QTcpSocket::disconnected,
+ this, &RemoteDeploymentReceiver::acceptRemoteDisconnection);
+
+ connect(m_connection, &QTcpSocket::readyRead,
+ this, &RemoteDeploymentReceiver::readProject);
+
+ Q_EMIT(remoteConnected());
+}
+
+void RemoteDeploymentReceiver::acceptRemoteDisconnection()
+{
+ Q_ASSERT(m_tcpServer);
+ Q_ASSERT(m_connection);
+ m_connection->deleteLater();
+ m_connection = 0;
+
+ m_incoming.setDevice(0);
+
+ Q_EMIT(remoteDisconnected());
+}
+
+void RemoteDeploymentReceiver::readProject()
+{
+ m_projectDeployed = false;
+ Q_EMIT(projectChanging());
+
+ m_incoming.startTransaction();
+
+ int totalBytes = 0;
+ m_incoming >> totalBytes;
+
+ Viewer *viewer = qobject_cast<Viewer *>(parent());
+ if (viewer && totalBytes != 0) {
+ viewer->updateProgress(
+ 100 * ((double)m_connection->bytesAvailable() / (double)totalBytes));
+ }
+
+ if (m_connection->bytesAvailable() < totalBytes) {
+ m_incoming.rollbackTransaction();
+ return;
+ }
+
+ int numberOfFiles = 0;
+ QString projectFile;
+ m_incoming >> numberOfFiles;
+ m_incoming >> projectFile;
+
+ QVector<QPair<QString, QByteArray> > files;
+ for (int i = 0; i < numberOfFiles; ++i) {
+ QString fileName;
+ QByteArray fileContents;
+ m_incoming >> fileName;
+ m_incoming >> fileContents;
+ files.append(qMakePair(fileName, fileContents));
+ }
+
+ if (!m_incoming.commitTransaction()) {
+ m_incoming.abortTransaction();
+ qWarning() << "Error transferring remote project in one payload";
+ return;
+ }
+
+ QFileInfo currentProject(m_projectFile);
+ if (projectFile != currentProject.fileName()) {
+ delete m_temporaryDir;
+ m_temporaryDir = 0;
+ }
+
+ if (!m_temporaryDir)
+ m_temporaryDir = new QTemporaryDir;
+
+ Q_ASSERT(m_temporaryDir->isValid());
+
+ for (const auto &file : qAsConst(files)) {
+ QString filePath = m_temporaryDir->path() + QDir::separator() + file.first;
+ QFile tmpFile(filePath);
+ QDir tmpFileDir = QFileInfo(tmpFile).absoluteDir();
+ if (!tmpFileDir.exists())
+ tmpFileDir.mkpath(".");
+ if (!tmpFile.open(QIODevice::WriteOnly)) {
+ delete m_temporaryDir;
+ m_temporaryDir = 0;
+ qWarning() << "Error opening temporary file for remote project:"
+ << filePath;
+ return;
+ }
+
+ if (file.first == projectFile)
+ m_projectFile = filePath;
+
+ tmpFile.write(file.second);
+ tmpFile.close();
+ }
+
+ m_projectDeployed = true;
+ Q_EMIT(projectChanged());
+}
diff --git a/tools/viewer/remotedeploymentreceiver.h b/tools/viewer/remotedeploymentreceiver.h
new file mode 100644
index 0000000..49f7de3
--- /dev/null
+++ b/tools/viewer/remotedeploymentreceiver.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef REMOTEDEPLOYMENTRECEIVER_H
+#define REMOTEDEPLOYMENTRECEIVER_H
+
+#include <QtCore/qobject.h>
+#include <QtCore/qdatastream.h>
+#include <QtCore/qtemporarydir.h>
+#include <QtNetwork/qtcpserver.h>
+
+class RemoteDeploymentReceiver : public QObject
+{
+ Q_OBJECT
+public:
+ explicit RemoteDeploymentReceiver(int serverPort, QObject *parent);
+ ~RemoteDeploymentReceiver();
+
+ QString startServer();
+ void disconnectRemote();
+
+ QHostAddress hostAddress() const { return m_hostAddress; }
+ int serverPort() const { return m_serverPort; }
+ void setServerPort(int port) { m_serverPort = port; }
+ bool isConnected() const { return m_connection; }
+ bool isProjectDeployed() const { return m_connection && m_projectDeployed; }
+ QString fileName() const { return m_projectFile; }
+
+Q_SIGNALS:
+ void projectChanged();
+ void projectChanging();
+ void remoteConnected();
+ void remoteDisconnected();
+
+private Q_SLOTS:
+ void acceptRemoteConnection();
+ void acceptRemoteDisconnection();
+ void readProject();
+ void setPort(int value);
+
+private:
+ QTcpServer *m_tcpServer = nullptr;
+ QTcpSocket *m_connection = nullptr;
+ QHostAddress m_hostAddress;
+ QDataStream m_incoming;
+ QTemporaryDir *m_temporaryDir = nullptr;
+ QString m_projectFile;
+ bool m_projectDeployed;
+ int m_serverPort;
+};
+
+#endif // REMOTEDEPLOYMENTRECEIVER_H
diff --git a/tools/viewer/resources/images/3D-studio-viewer.ico b/tools/viewer/resources/images/3D-studio-viewer.ico
new file mode 100644
index 0000000..c15cd68
--- /dev/null
+++ b/tools/viewer/resources/images/3D-studio-viewer.ico
Binary files differ
diff --git a/tools/viewer/resources/images/3D-studio-viewer.svg b/tools/viewer/resources/images/3D-studio-viewer.svg
new file mode 100644
index 0000000..69a14f4
--- /dev/null
+++ b/tools/viewer/resources/images/3D-studio-viewer.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="512px" height="512px" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
+ <title>icon_512x512</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <polygon id="path-1" points="64 0 0 48 0 112 64 160 128 112 128 48"></polygon>
+ <path d="M45.6534039,84.7089559 L45.6534039,97.4054197 L15.0588235,128 L0,112.941176 L30.1176471,82.8235294 L43.7426612,82.8235294 C35.3039365,74.0299707 30.1176471,62.091235 30.1176471,48.9411765 C30.1176471,21.9117111 52.0293581,0 79.0588235,0 C106.088289,0 128,21.9117111 128,48.9411765 C128,75.9706419 106.088289,97.8823529 79.0588235,97.8823529 C66.1449913,97.8823529 54.3993526,92.8807218 45.6534039,84.7089559 Z M79.0588235,82.8235294 C97.7715303,82.8235294 112.941176,67.6538833 112.941176,48.9411765 C112.941176,30.2284697 97.7715303,15.0588235 79.0588235,15.0588235 C60.3461167,15.0588235 45.1764706,30.2284697 45.1764706,48.9411765 C45.1764706,67.6538833 60.3461167,82.8235294 79.0588235,82.8235294 Z" id="path-2"></path>
+ </defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="icon_512x512">
+ <g id="Group-3" transform="translate(56.000000, 88.000000)">
+ <g id="Page-1-Copy">
+ <polygon id="Fill-1" fill="#41CD52" points="0 288.0032 328 288.0032 384 232.0032 384 0.0032 56 0.0032 0 56.0032"></polygon>
+ <g id="Group-6" transform="translate(72.000000, 48.000000)" fill="#FFFFFF">
+ <path d="M39.3792,138.3936 C44.8752,147.8176 55.4752,152.6656 71.0512,152.6656 C86.6272,152.6656 97.0992,147.9536 102.5952,138.6496 C107.9552,129.3456 110.7072,113.5216 110.7072,91.4016 C110.7072,69.1536 107.9632,53.0576 102.3312,42.9776 C96.7072,32.9056 86.3632,27.9216 71.0512,27.9216 C55.8752,27.9216 45.3952,32.8896 39.6432,42.9776 C34.0112,53.0656 31.1312,69.0256 31.1312,91.1456 C31.1312,113.1296 33.8832,128.9616 39.3792,138.3936 L39.3792,138.3936 Z M70.9232,176.2256 C45.6592,176.2256 27.9952,169.4096 18.0432,155.8016 C8.0992,142.2016 3.1232,120.5936 3.1232,91.2736 C3.1232,61.8336 8.2272,39.9696 18.3072,25.7056 C28.3872,11.4416 46.0512,4.2416 70.9232,4.2416 C95.9152,4.2416 113.4592,11.3056 123.4032,25.5696 C133.4832,39.7056 138.4512,61.5616 138.4512,91.1536 C138.4512,110.6496 136.3632,126.3536 132.3072,138.2656 C128.1152,150.2976 121.4432,159.4656 112.0192,165.7536 L132.4352,198.6016 L107.4352,210.2336 L85.8432,174.7776 C82.6992,175.8016 77.7232,176.1376 70.9232,176.1376 L70.9232,176.2256 Z" id="Fill-2"></path>
+ <path d="M198.66,71.5184 L198.66,125.0464 C198.66,134.9984 199.444,141.5344 200.884,144.8064 C202.316,148.0784 206.116,149.6544 212.004,149.6544 L231.9,148.7984 L233.076,170.0064 C222.212,172.1024 213.972,173.1424 208.212,173.1424 C194.468,173.1424 185.044,170.0064 179.94,163.7184 C174.836,157.4384 172.22,145.5344 172.22,127.9984 L172.22,71.5824 L153.764,71.5824 L153.764,48.9424 L172.348,48.9424 L172.348,13.7344 L198.66,13.7344 L198.66,48.9424 L232.164,48.9424 L232.164,71.4544 L198.66,71.5184 Z" id="Fill-4"></path>
+ </g>
+ </g>
+ <g id="Group" transform="translate(280.000000, 176.000000)">
+ <g id="Path-29">
+ <use fill="#D8D8D8" fill-rule="evenodd" xlink:href="#path-1"></use>
+ <path stroke="#FFFFFF" stroke-width="7" d="M64,-4.375 L131.5,46.25 L131.5,113.75 L64,164.375 L-3.5,113.75 L-3.5,46.25 L64,-4.375 Z"></path>
+ </g>
+ <polygon id="Path-27" fill="#81CFFF" points="0 48 64 96 128 48 64 0"></polygon>
+ <polygon id="Path-28-Copy" fill="#1F83C1" transform="translate(96.000000, 104.000000) scale(-1, 1) translate(-96.000000, -104.000000) " points="64 48 64 112 128 160 128 96"></polygon>
+ <polygon id="Path-28" fill="#2696DA" points="0 48 0 112 64 160 64 96"></polygon>
+ </g>
+ <g id="Group-2" transform="translate(200.000000, 208.000000)">
+ <g id="Combined-Shape">
+ <use fill="#707070" fill-rule="evenodd" xlink:href="#path-2"></use>
+ <path stroke="#FFFFFF" stroke-width="7" d="M49.1534039,92.0264501 L49.1534039,98.8551671 L15.0588235,132.949747 L-4.94974747,112.941176 L28.6678996,79.3235294 L36.3089911,79.3235294 C30.0728186,70.5670745 26.6176471,60.0229376 26.6176471,48.9411765 C26.6176471,19.9787144 50.0963615,-3.5 79.0588235,-3.5 C108.021286,-3.5 131.5,19.9787144 131.5,48.9411765 C131.5,77.9036385 108.021286,101.382353 79.0588235,101.382353 C68.1809425,101.382353 57.8185023,98.0537262 49.1534039,92.0264501 Z M79.0588235,79.3235294 C95.8385337,79.3235294 109.441176,65.7208867 109.441176,48.9411765 C109.441176,32.1614663 95.8385337,18.5588235 79.0588235,18.5588235 C62.2791133,18.5588235 48.6764706,32.1614663 48.6764706,48.9411765 C48.6764706,65.7208867 62.2791133,79.3235294 79.0588235,79.3235294 Z"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/tools/viewer/resources/images/arrow.png b/tools/viewer/resources/images/arrow.png
new file mode 100644
index 0000000..40ebda8
--- /dev/null
+++ b/tools/viewer/resources/images/arrow.png
Binary files differ
diff --git a/tools/viewer/resources/images/arrow@2x.png b/tools/viewer/resources/images/arrow@2x.png
new file mode 100644
index 0000000..1a21ee0
--- /dev/null
+++ b/tools/viewer/resources/images/arrow@2x.png
Binary files differ
diff --git a/tools/viewer/resources/images/check.png b/tools/viewer/resources/images/check.png
new file mode 100644
index 0000000..5c1ef70
--- /dev/null
+++ b/tools/viewer/resources/images/check.png
Binary files differ
diff --git a/tools/viewer/resources/images/check@2x.png b/tools/viewer/resources/images/check@2x.png
new file mode 100644
index 0000000..ed730bf
--- /dev/null
+++ b/tools/viewer/resources/images/check@2x.png
Binary files differ
diff --git a/tools/viewer/resources/images/viewer.icns b/tools/viewer/resources/images/viewer.icns
new file mode 100644
index 0000000..b718d75
--- /dev/null
+++ b/tools/viewer/resources/images/viewer.icns
Binary files differ
diff --git a/tools/viewer/viewer.cpp b/tools/viewer/viewer.cpp
new file mode 100644
index 0000000..bb6af59
--- /dev/null
+++ b/tools/viewer/viewer.cpp
@@ -0,0 +1,416 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qsettings.h>
+#include <QtCore/qfileinfo.h>
+#include <QtStudio3D/private/q3dsviewersettings_p.h>
+#include <QtStudio3D/private/q3dspresentation_p.h>
+#include <QtGui/qguiapplication.h>
+#include <QtGui/qscreen.h>
+#include <QtQuick/qquickwindow.h>
+
+#include "viewer.h"
+#include "q3dspresentationitem_p.h"
+
+Viewer::Viewer(bool generatorMode, QObject *parent)
+ : QObject(parent)
+ , m_generatorMode(generatorMode)
+{
+ if (m_generatorMode)
+ setContentView(SequenceView);
+
+ m_connectTextResetTimer.setInterval(5000);
+ m_connectTextResetTimer.setSingleShot(true);
+ connect(&m_connectTextResetTimer, &QTimer::timeout, this, &Viewer::resetConnectionInfoText);
+}
+
+Viewer::~Viewer()
+{
+}
+
+void Viewer::connectRemote()
+{
+ if (m_remoteDeploymentReceiver) {
+ delete m_remoteDeploymentReceiver;
+ m_remoteDeploymentReceiver = 0;
+ Q_EMIT connectedChanged();
+ }
+
+ m_remoteDeploymentReceiver = new RemoteDeploymentReceiver(m_connectPort, this);
+ QString error = m_remoteDeploymentReceiver->startServer();
+ if (!error.isEmpty()) {
+ delete m_remoteDeploymentReceiver;
+ m_remoteDeploymentReceiver = nullptr;
+ setContentView(DefaultView);
+ m_qmlRootObject->setProperty("error", QVariant(error));
+ return;
+ }
+
+ resetConnectionInfoText();
+
+ connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::remoteConnected,
+ this, &Viewer::remoteConnected);
+
+ connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::remoteDisconnected,
+ this, &Viewer::remoteDisconnected);
+
+ connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::projectChanging,
+ this, &Viewer::remoteProjectChanging);
+
+ connect(m_remoteDeploymentReceiver, &RemoteDeploymentReceiver::projectChanged,
+ this, &Viewer::loadRemoteDeploymentReceiver);
+
+ Q_EMIT connectedChanged();
+}
+
+void Viewer::disconnectRemote()
+{
+ m_remoteDeploymentReceiver->disconnectRemote();
+}
+
+void Viewer::setVariantList(const QStringList &variantList)
+{
+ if (m_variantList != variantList) {
+ m_variantList = variantList;
+ Q_EMIT variantListChanged();
+ }
+}
+
+QStringList Viewer::variantList() const
+{
+ return m_variantList;
+}
+
+// Used to load files via command line and when using remote deployment
+void Viewer::loadFile(const QString &filename)
+{
+ QString targetFilename = filename;
+ // Try to find the application (*.uia) file for loading instead of the presentation (*.uip)
+ // in case we are connected to remote sender.
+ if (isConnected() && targetFilename.endsWith(QStringLiteral(".uip"))) {
+ targetFilename.chop(4);
+ targetFilename.append(QStringLiteral(".uia"));
+ QFileInfo targetfileInfo(targetFilename);
+ // uia not found, revert to given uip
+ if (!targetfileInfo.exists())
+ targetFilename = filename;
+ }
+
+ QFileInfo fileInfo(targetFilename);
+ if (!fileInfo.exists()) {
+ setContentView(DefaultView);
+ m_qmlRootObject->setProperty(
+ "error", QVariant(tr("Tried to load nonexistent file %1").arg(targetFilename)));
+ return;
+ }
+
+ QUrl sourceUrl = QUrl::fromLocalFile(fileInfo.absoluteFilePath());
+
+ setContentView(StudioView);
+
+ if (qmlStudio()) {
+ qmlStudio()->presentation()->setVariantList(m_variantList);
+ qmlStudio()->presentation()->setSource(sourceUrl);
+ }
+}
+
+QString Viewer::convertUrlListToFilename(const QList<QUrl> &list)
+{
+ for (const QUrl &url : list) {
+ QString str = url.toLocalFile();
+ if (!str.isEmpty()) {
+ if (QFileInfo(str).suffix() == QStringLiteral("uip")
+ || QFileInfo(str).suffix() == QStringLiteral("uia")) {
+ return str;
+ }
+ }
+ }
+ return QString();
+}
+
+void Viewer::restoreWindowState(QWindow *window)
+{
+ QSettings settings;
+ QRect geo = settings.value(QStringLiteral("WindowGeometry"), QRect()).toRect();
+ int visibility = settings.value(QStringLiteral("WindowVisibility"),
+ QWindow::Windowed).toInt();
+
+ // Do not restore geometry if resulting geometry means the center of the window
+ // would be offscreen on the virtual desktop
+ QRect vgeo = window->screen()->availableVirtualGeometry();
+ QPoint center(geo.x() + geo.width() / 2, geo.y() + geo.height() / 2);
+ bool offscreen = center.x() > vgeo.width() || center.x() < 0
+ || center.y() > vgeo.height() || center.y() < 0;
+
+ if (!offscreen && !geo.isNull()) {
+ // The first geometry set at startup may adjust the geometry according to pixel
+ // ratio if mouse cursor is on different screen than where window goes and the
+ // two screens have different pixel ratios. Setting geometry twice seems to
+ // work around this.
+ geo.adjust(0, 0, -1, 0);
+ window->setGeometry(geo);
+ geo.adjust(0, 0, 1, 0);
+ window->setGeometry(geo);
+ }
+
+ window->setVisibility(QWindow::Visibility(visibility));
+}
+
+void Viewer::storeWindowState(QWindow *window)
+{
+ QSettings settings;
+ settings.setValue(QStringLiteral("WindowGeometry"), window->geometry());
+ settings.setValue(QStringLiteral("WindowState"), window->visibility());
+}
+
+// Since we need mouse events for handling the swipe gesture in viewer, we need to generate
+// a fake event for the presentation.
+void Viewer::handleMousePress(int x, int y, int button, int buttons, int modifiers)
+{
+ if (qmlStudio()) {
+ QMouseEvent fakeEvent(QEvent::MouseButtonPress,
+ QPointF(x, y) * qmlStudio()->window()->devicePixelRatio(),
+ Qt::MouseButton(button),
+ Qt::MouseButtons(buttons),
+ Qt::KeyboardModifiers(modifiers));
+ qmlStudio()->presentation()->mousePressEvent(&fakeEvent);
+ }
+}
+
+void Viewer::handleMouseRelease(int x, int y, int button, int buttons, int modifiers)
+{
+ if (qmlStudio()) {
+ QMouseEvent fakeEvent(QEvent::MouseButtonRelease,
+ QPointF(x, y) * qmlStudio()->window()->devicePixelRatio(),
+ Qt::MouseButton(button),
+ Qt::MouseButtons(buttons),
+ Qt::KeyboardModifiers(modifiers));
+ qmlStudio()->presentation()->mouseReleaseEvent(&fakeEvent);
+ }
+}
+
+void Viewer::handleMouseMove(int x, int y, int button, int buttons, int modifiers)
+{
+ if (qmlStudio()) {
+ QMouseEvent fakeEvent(QEvent::MouseMove,
+ QPointF(x, y) * qmlStudio()->window()->devicePixelRatio(),
+ Qt::MouseButton(button),
+ Qt::MouseButtons(buttons),
+ Qt::KeyboardModifiers(modifiers));
+ qmlStudio()->presentation()->mouseMoveEvent(&fakeEvent);
+ }
+}
+
+void Viewer::setContentView(Viewer::ContentView view)
+{
+ if (view != m_contentView) {
+ m_qmlStudio = nullptr;
+ m_contentView = view;
+ Q_EMIT contentViewChanged();
+ }
+}
+
+Viewer::ContentView Viewer::contentView() const
+{
+ return m_contentView;
+}
+
+void Viewer::setOpenFolder(const QUrl &folder)
+{
+ QString localFolder = folder.toLocalFile();
+ QFileInfo fi(localFolder);
+ QString newDir;
+ if (fi.isDir())
+ newDir = fi.absoluteFilePath();
+ else
+ newDir = fi.absolutePath();
+ if (newDir != m_openFileDir) {
+ m_openFileDir = newDir;
+ QSettings settings;
+ settings.setValue(QStringLiteral("DirectoryOfLastOpen"), m_openFileDir);
+ Q_EMIT openFolderChanged();
+ }
+}
+
+QUrl Viewer::openFolder()
+{
+ if (m_openFileDir.size() == 0) {
+ QSettings settings;
+ m_openFileDir = settings.value(QStringLiteral("DirectoryOfLastOpen"),
+ QString("")).toString();
+#ifdef Q_OS_ANDROID
+ if (m_openFileDir.isEmpty())
+ m_openFileDir = QStringLiteral("/sdcard/qt3dviewer"); // Add default folder for Android
+#endif
+ }
+ return QUrl::fromLocalFile(m_openFileDir);
+}
+
+void Viewer::setConnectPort(int port)
+{
+ if (m_connectPort != port) {
+ QSettings settings;
+ m_connectPort = port;
+ settings.setValue(QStringLiteral("ConnectPort"), m_connectPort);
+ Q_EMIT connectPortChanged();
+ }
+}
+
+int Viewer::connectPort()
+{
+ if (m_connectPort < 0) {
+ QSettings settings;
+ m_connectPort = settings.value(QStringLiteral("ConnectPort"), 36000).toInt();
+ }
+ return m_connectPort;
+}
+
+QString Viewer::connectText() const
+{
+ return m_connectText;
+}
+
+bool Viewer::isConnected() const
+{
+ return m_remoteDeploymentReceiver ? m_remoteDeploymentReceiver->isConnected() : false;
+}
+
+void Viewer::setQmlRootObject(QObject *obj)
+{
+ m_qmlRootObject = obj;
+}
+
+void Viewer::loadRemoteDeploymentReceiver()
+{
+ Q_ASSERT(m_remoteDeploymentReceiver);
+ const QString remote = m_remoteDeploymentReceiver->fileName();
+ QMetaObject::invokeMethod(this, "loadFile", Qt::QueuedConnection, Q_ARG(QString, remote));
+}
+
+void Viewer::remoteProjectChanging()
+{
+ if (m_contentView != ConnectView)
+ setContentView(ConnectView);
+ m_connectText = tr("Loading remote project...");
+ Q_EMIT connectTextChanged();
+}
+
+void Viewer::remoteConnected()
+{
+ m_connectText = tr("Remote Connected");
+ Q_EMIT connectTextChanged();
+ Q_EMIT connectedChanged();
+ if (m_contentView != ConnectView)
+ Q_EMIT showInfoOverlay(m_connectText);
+}
+
+void Viewer::remoteDisconnected()
+{
+ m_connectText = tr("Remote Disconnected");
+ Q_EMIT connectTextChanged();
+ Q_EMIT connectedChanged();
+ if (m_contentView != ConnectView) {
+ Q_EMIT showInfoOverlay(m_connectText);
+ } else {
+ // Start timer to reset connection info text
+ m_connectTextResetTimer.start();
+ }
+}
+
+void Viewer::resetConnectionInfoText()
+{
+ m_connectText.clear();
+ QTextStream stream(&m_connectText);
+ stream << tr("Use IP: %1 and Port: %2\n"
+ "in Qt 3D Studio Editor to connect to this viewer.\n\n"
+ "Use File/Open... to open a local presentation.")
+ .arg(m_remoteDeploymentReceiver->hostAddress().toString())
+ .arg(QString::number(m_connectPort));
+ Q_EMIT connectTextChanged();
+}
+
+Q3DSStudio3D *Viewer::qmlStudio()
+{
+ if (m_contentView == StudioView) {
+ if (!m_qmlStudio) {
+ QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>();
+ m_qmlStudio = static_cast<Q3DSStudio3D *>(loadedContent);
+ }
+ } else {
+ m_qmlStudio = nullptr;
+ }
+ return m_qmlStudio;
+}
+
+void Viewer::generatorProgress(int totalFrames, int frameCount)
+{
+ QString progressString;
+ if (frameCount >= totalFrames) {
+ progressString =
+ QCoreApplication::translate(
+ "main", "Image sequence generation done! (%2 frames generated)")
+ .arg(totalFrames);
+ } else {
+ progressString =
+ QCoreApplication::translate("main", "Image sequence generation progress: %1 / %2")
+ .arg(frameCount).arg(totalFrames);
+ }
+ QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>();
+ loadedContent->setProperty("mainText", progressString);
+}
+
+void Viewer::generatorFinished(bool success, const QString &details)
+{
+ QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>();
+ if (success) {
+ loadedContent->setProperty("detailsText", details);
+ } else {
+ QString mainString =
+ QCoreApplication::translate("main", "Image sequence generation failed:");
+ loadedContent->setProperty("mainText", mainString);
+ loadedContent->setProperty("detailsText", details);
+ }
+}
+
+void Viewer::updateProgress(int percent)
+{
+ // Don't wait for 100%, as it'll already start loading and text isn't updated anymore
+ if (percent >= 99)
+ m_connectText = tr("Loading remote project...");
+ else
+ m_connectText = QStringLiteral("Receiving (%1%)").arg(percent);
+ Q_EMIT connectTextChanged();
+}
+
+void Viewer::setGeneratorDetails(const QString &filename)
+{
+ QObject *loadedContent = m_qmlRootObject->property("loadedContent").value<QObject *>();
+ loadedContent->setProperty("detailsText", filename);
+}
diff --git a/tools/viewer/viewer.h b/tools/viewer/viewer.h
new file mode 100644
index 0000000..1ce514a
--- /dev/null
+++ b/tools/viewer/viewer.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef VIEWER_H
+#define VIEWER_H
+
+#include "remotedeploymentreceiver.h"
+
+#include <QtCore/qobject.h>
+#include <QtCore/qurl.h>
+#include <QtCore/qtimer.h>
+#include <QtGui/qwindow.h>
+#include "q3dsstudio3d_p.h"
+
+class Viewer : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(ContentView contentView READ contentView WRITE setContentView NOTIFY contentViewChanged)
+ Q_PROPERTY(QUrl openFolder READ openFolder WRITE setOpenFolder NOTIFY openFolderChanged)
+ Q_PROPERTY(int connectPort READ connectPort WRITE setConnectPort NOTIFY connectPortChanged)
+ Q_PROPERTY(QString connectText READ connectText NOTIFY connectTextChanged)
+ Q_PROPERTY(bool connected READ isConnected NOTIFY connectedChanged)
+ Q_PROPERTY(QStringList variantList READ variantList WRITE setVariantList NOTIFY variantListChanged)
+
+public:
+ enum ContentView {
+ DefaultView,
+ StudioView,
+ ConnectView,
+ SequenceView
+ };
+
+ Q_ENUM(ContentView)
+
+ explicit Viewer(bool generatorMode, QObject *parent = nullptr);
+ ~Viewer();
+
+ Q_INVOKABLE void connectRemote();
+ Q_INVOKABLE void disconnectRemote();
+ Q_INVOKABLE void loadFile(const QString &filename);
+ Q_INVOKABLE QString convertUrlListToFilename(const QList<QUrl> &list);
+ Q_INVOKABLE void restoreWindowState(QWindow *window);
+ Q_INVOKABLE void storeWindowState(QWindow *window);
+
+ Q_INVOKABLE void handleMousePress(int x, int y, int button, int buttons, int modifiers);
+ Q_INVOKABLE void handleMouseRelease(int x, int y, int button, int buttons, int modifiers);
+ Q_INVOKABLE void handleMouseMove(int x, int y, int button, int buttons, int modifiers);
+
+ void setVariantList(const QStringList &variantList);
+ QStringList variantList() const;
+ void setContentView(ContentView view);
+ ContentView contentView() const;
+ void setOpenFolder(const QUrl &folder);
+ QUrl openFolder(); // not const since it potentially updates from settings
+ void setConnectPort(int port);
+ int connectPort(); // not const since it potentially updates from settings
+ QString connectText() const;
+ bool isConnected() const;
+
+ void setQmlRootObject(QObject *obj);
+
+ void loadProject(const QByteArray &data);
+ void updateProgress(int percent);
+ void setGeneratorDetails(const QString &filename);
+
+public Q_SLOTS:
+ void generatorProgress(int totalFrames, int frameCount);
+ void generatorFinished(bool success, const QString &details);
+
+private Q_SLOTS:
+ void loadRemoteDeploymentReceiver();
+ void remoteProjectChanging();
+ void remoteConnected();
+ void remoteDisconnected();
+ void resetConnectionInfoText();
+
+Q_SIGNALS:
+ void contentViewChanged();
+ void openFolderChanged();
+ void connectPortChanged();
+ void connectTextChanged();
+ void connectedChanged();
+ void variantListChanged();
+ void showInfoOverlay(const QString &infoStr);
+
+private:
+ Q3DSStudio3D *qmlStudio();
+
+ QString m_openFileDir;
+ QStringList m_variantList;
+ RemoteDeploymentReceiver *m_remoteDeploymentReceiver = nullptr;
+ bool m_generatorMode = false;
+ ContentView m_contentView = DefaultView;
+ QObject *m_qmlRootObject = nullptr;
+ int m_connectPort = -1;
+ QString m_connectText;
+ Q3DSStudio3D *m_qmlStudio = nullptr;
+ QTimer m_connectTextResetTimer;
+};
+
+#endif // VIEWER_H
diff --git a/tools/viewer/viewer.pro b/tools/viewer/viewer.pro
new file mode 100644
index 0000000..cad5664
--- /dev/null
+++ b/tools/viewer/viewer.pro
@@ -0,0 +1,49 @@
+include($$PWD/../../commoninclude.pri)
+
+TEMPLATE = app
+TARGET = Qt3DViewer
+QT += qml quickcontrols2 studio3d-private
+
+INCLUDEPATH += $$PWD/../../src/api/studio3dqml
+INCLUDEPATH += $$PWD/../../src/api/studio3d
+
+RESOURCES += Viewer.qrc
+RC_ICONS = resources/images/3D-studio-viewer.ico
+
+ICON = resources/images/viewer.icns
+
+SOURCES += \
+ $$PWD/../../src/api/studio3dqml/q3dsstudio3d.cpp \
+ $$PWD/../../src/api/studio3dqml/q3dsrenderer.cpp \
+ $$PWD/../../src/api/studio3dqml/q3dspresentationitem.cpp \
+ main.cpp \
+ viewer.cpp \
+ remotedeploymentreceiver.cpp
+
+HEADERS += \
+ $$PWD/../../src/api/studio3dqml/q3dsstudio3d_p.h \
+ $$PWD/../../src/api/studio3dqml/q3dsrenderer_p.h \
+ $$PWD/../../src/api/studio3dqml/q3dspresentationitem_p.h \
+ viewer.h \
+ remotedeploymentreceiver.h
+
+android: {
+SOURCES += \
+ $$PWD/../../src/api/studio3d/q3dsviewersettings.cpp \
+ $$PWD/../../src/api/studio3d/q3dspresentation.cpp \
+ $$PWD/../../src/api/studio3d/q3dsdatainput.cpp
+
+HEADERS += \
+ $$PWD/../../src/api/studio3d/q3dsviewersettings.h \
+ $$PWD/../../src/api/studio3d/q3dspresentation.h \
+ $$PWD/../../src/api/studio3d/q3dsdatainput.h
+}
+
+LIBS += \
+ -lqt3dsopengl$$qtPlatformTargetSuffix() \
+ -lqt3dsqmlstreamer$$qtPlatformTargetSuffix()
+
+macos:QMAKE_RPATHDIR += @executable_path/../../../../lib
+
+target.path = $$[QT_INSTALL_BINS]
+INSTALLS += target
diff --git a/utils.pri b/utils.pri
new file mode 100644
index 0000000..8d56baa
--- /dev/null
+++ b/utils.pri
@@ -0,0 +1,8 @@
+# Add our static libs to target dependencies so we detect changes to them
+defineReplace(fixLibPredeps) {
+ # TODO Needs something more clever once debug libs are correctly suffixed
+ for(lib, $${2}) {
+ PREDEPS *= $${1}/$${QMAKE_PREFIX_STATICLIB}$${lib}$$qtPlatformTargetSuffix().$${QMAKE_EXTENSION_STATICLIB}
+ }
+ return($$PREDEPS)
+}